[
  {
    "path": ".gitattributes",
    "content": "* text=auto\n"
  },
  {
    "path": ".gitignore",
    "content": "/build/Debug\n/build/Release\n/build/gyp\n/out\n/v8\n/xcodebuild\nMakefile\n.DS_Store\n*.filters\n*.mk\n*.opensdf\n*.pyc\n*.sdf\n*.sln\n*.suo\n*.user\n*.vcxproj\n*.xcodeproj"
  },
  {
    "path": "AUTHORS",
    "content": "# Names should be added to this file with this pattern:\n#\n# For individuals:\n#   Name <email address>\n#\n# For organizations:\n#   Organization <fnmatch pattern>\n#\n# See python fnmatch module documentation for more information.\n\nAndrey Khalyavin <halyavin@chromium.org>\nBrett Wilson <brettw@chromium.org>\nChris Palmer <palmer@chromium.org>\nFinnur Thorarinsson <finnur@chromium.org>\nJochen Eisinger <jochen@chromium.org>\nJohn Abd-El-Malek <jam@chromium.org>\nJulien Tinnes <jln@chromium.org>\nKostya Serebryany <kcc@chromium.org>\nLei Zhang <thestig@chromium.org>\nLucas Nihlen <luken@chromium.org>\nMatt Giuca <mgiuca@chromium.org>\nMichael Doppler <m.doppler@gmail.com>\nNico Weber <thakis@chromium.org>\nRaymes Khoury <raymes@chromium.org>\nReid Kleckner <rnk@chromium.org>\nRobert Sesek <rsesek@chromium.org>\nThomas Sepez <tsepez@chromium.org>\n\nFoxit Software Inc <*@foxitsoftware.com>\nGoogle Inc. <*@google.com>\n"
  },
  {
    "path": "BUILD.gn",
    "content": "# Copyright 2014 The Chromium Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\npdf_use_skia = false\n\nconfig(\"pdfium_config\") {\n  cflags = []\n  defines = [\n    \"FOXIT_CHROME_BUILD\",\n    \"_FXFT_VERSION_=2501\",\n    \"_FPDFSDK_LIB\",\n    \"_NO_GDIPLUS_\",  # workaround text rendering issues on Windows\n  ]\n\n  if (pdf_use_skia) {\n    defines += [ \"_SKIA_SUPPORT_\" ]\n  }\n\n  if (is_linux) {\n    if (cpu_arch == \"x64\") {\n      defines += [ \"_FX_CPU_=_FX_X64_\" ]\n      cflags += [ \"-fPIC\" ]\n    } else if (cpu_arch == \"x86\") {\n      defines += [ \"_FX_CPU_=_FX_X86_\" ]\n    }\n  }\n\n  if (is_win) {\n    cflags += [\n      \"/wd4005\",\n      \"/wd4018\",\n      \"/wd4146\",\n      \"/wd4333\",\n      \"/wd4345\",\n    ]\n  }\n}\n\nstatic_library(\"pdfium\") {\n  sources = [\n    \"fpdfsdk/include/fpdfdoc.h\",\n    \"fpdfsdk/include/fpdfedit.h\",\n    \"fpdfsdk/include/fpdfformfill.h\",\n    \"fpdfsdk/include/fpdfoom.h\",\n    \"fpdfsdk/include/fpdftext.h\",\n    \"fpdfsdk/include/fpdfview.h\",\n    \"fpdfsdk/include/fpdf_dataavail.h\",\n    \"fpdfsdk/include/fpdf_flatten.h\",\n    \"fpdfsdk/include/fpdf_progressive.h\",\n    \"fpdfsdk/include/fpdf_searchex.h\",\n    \"fpdfsdk/include/fpdf_sysfontinfo.h\",\n    \"fpdfsdk/include/fpdf_ext.h\",\n    \"fpdfsdk/include/fpdf_sysfontinfo.h\",\n    \"fpdfsdk/include/fsdk_actionhandler.h\",\n    \"fpdfsdk/include/fsdk_annothandler.h\",\n    \"fpdfsdk/include/fsdk_baseannot.h\",\n    \"fpdfsdk/include/fsdk_baseform.h\",\n    \"fpdfsdk/src/fpdfdoc.cpp\",\n    \"fpdfsdk/src/fpdfeditimg.cpp\",\n    \"fpdfsdk/src/fpdfeditpage.cpp\",\n    \"fpdfsdk/src/fpdfformfill.cpp\",\n    \"fpdfsdk/src/fpdfoom.cpp\",\n    \"fpdfsdk/src/fpdfppo.cpp\",\n    \"fpdfsdk/src/fpdfsave.cpp\",\n    \"fpdfsdk/src/fpdftext.cpp\",\n    \"fpdfsdk/src/fpdfview.cpp\",\n    \"fpdfsdk/src/fpdf_dataavail.cpp\",\n    \"fpdfsdk/src/fpdf_ext.cpp\",\n    \"fpdfsdk/src/fpdf_flatten.cpp\",\n    \"fpdfsdk/src/fpdf_progressive.cpp\",\n    \"fpdfsdk/src/fpdf_searchex.cpp\",\n    \"fpdfsdk/src/fpdf_sysfontinfo.cpp\",\n    \"fpdfsdk/src/fsdk_actionhandler.cpp\",\n    \"fpdfsdk/src/fsdk_annothandler.cpp\",\n    \"fpdfsdk/src/fsdk_baseannot.cpp\",\n    \"fpdfsdk/src/fsdk_baseform.cpp\",\n    \"fpdfsdk/src/fsdk_mgr.cpp\",\n    \"fpdfsdk/src/fsdk_rendercontext.cpp\",\n    \"fpdfsdk/src/fpdfsdkdll.rc\",\n    \"fpdfsdk/src/resource.h\",\n    \"fpdfsdk/include/fpdf_transformpage.h\",\n    \"fpdfsdk/src/fpdf_transformpage.cpp\",\n  ]\n\n  libs = []\n  configs -= [ \"//build/config/compiler:chromium_code\" ]\n  if (is_posix) {\n    configs -= [ \"//build/config/gcc:no_exceptions\" ]\n  }\n  configs += [ \":pdfium_config\", \"//build/config/compiler:no_chromium_code\" ]\n\n  deps = [\n    \":safemath\",\n    \":fdrm\",\n    \":formfiller\",\n    \":fpdfapi\",\n    \":fpdfdoc\",\n    \":fpdftext\",\n    \":fxcodec\",\n    \":fxcrt\",\n    \":fxedit\",\n    \":fxge\",\n    \":javascript\",\n    \":jsapi\",\n    \":pdfwindow\",\n  ]\n\n  if (is_win) {\n    libs += [ \"advapi32.lib\", \"gdi32.lib\", \"user32.lib\" ]\n  }\n\n  if (is_mac) {\n    libs += [ \"AppKit.framework\", \"CoreFoundation.framework\" ]\n  }\n}\n\n# Targets below this are only visible within this file.\nvisibility = \":*\"\n\ncomponent(\"safemath\") {\n  sources = [\n    \"third_party/logging.h\",\n    \"third_party/macros.h\",\n    \"third_party/template_util.h\",\n    \"third_party/numerics/safe_conversions.h\",\n    \"third_party/numerics/safe_conversions_impl.h\",\n    \"third_party/numerics/safe_math.h\",\n    \"third_party/numerics/safe_math_impl.h\",\n  ]\n}\n\nstatic_library(\"fdrm\") {\n  sources = [\n    \"core/include/fdrm/fx_crypt.h\",\n    \"core/src/fdrm/crypto/fx_crypt.cpp\",\n    \"core/src/fdrm/crypto/fx_crypt_aes.cpp\",\n    \"core/src/fdrm/crypto/fx_crypt_sha.cpp\",\n  ]\n  configs -= [ \"//build/config/compiler:chromium_code\" ]\n  if (is_posix) {\n    configs -= [ \"//build/config/gcc:no_exceptions\" ]\n  }\n  configs += [ \":pdfium_config\", \"//build/config/compiler:no_chromium_code\" ]\n}\n\nstatic_library(\"fpdfdoc\") {\n  sources = [\n    \"core/include/fpdfdoc/fpdf_ap.h\",\n    \"core/include/fpdfdoc/fpdf_doc.h\",\n    \"core/include/fpdfdoc/fpdf_tagged.h\",\n    \"core/include/fpdfdoc/fpdf_vt.h\",\n    \"core/src/fpdfdoc/doc_action.cpp\",\n    \"core/src/fpdfdoc/doc_annot.cpp\",\n    \"core/src/fpdfdoc/doc_ap.cpp\",\n    \"core/src/fpdfdoc/doc_basic.cpp\",\n    \"core/src/fpdfdoc/doc_bookmark.cpp\",\n    \"core/src/fpdfdoc/doc_form.cpp\",\n    \"core/src/fpdfdoc/doc_formcontrol.cpp\",\n    \"core/src/fpdfdoc/doc_formfield.cpp\",\n    \"core/src/fpdfdoc/doc_link.cpp\",\n    \"core/src/fpdfdoc/doc_metadata.cpp\",\n    \"core/src/fpdfdoc/doc_ocg.cpp\",\n    \"core/src/fpdfdoc/doc_tagged.cpp\",\n    \"core/src/fpdfdoc/doc_utils.cpp\",\n    \"core/src/fpdfdoc/doc_viewerPreferences.cpp\",\n    \"core/src/fpdfdoc/doc_vt.cpp\",\n    \"core/src/fpdfdoc/doc_vtmodule.cpp\",\n    \"core/src/fpdfdoc/pdf_vt.h\",\n    \"core/src/fpdfdoc/tagged_int.h\",\n  ]\n  configs -= [ \"//build/config/compiler:chromium_code\" ]\n  if (is_posix) {\n    configs -= [ \"//build/config/gcc:no_exceptions\" ]\n  }\n  configs += [ \":pdfium_config\", \"//build/config/compiler:no_chromium_code\" ]\n}\n\n\nstatic_library(\"fpdfapi\") {\n  sources = [\n    \"core/include/fpdfapi/fpdfapi.h\",\n    \"core/include/fpdfapi/fpdf_module.h\",\n    \"core/include/fpdfapi/fpdf_objects.h\",\n    \"core/include/fpdfapi/fpdf_page.h\",\n    \"core/include/fpdfapi/fpdf_pageobj.h\",\n    \"core/include/fpdfapi/fpdf_parser.h\",\n    \"core/include/fpdfapi/fpdf_render.h\",\n    \"core/include/fpdfapi/fpdf_resource.h\",\n    \"core/include/fpdfapi/fpdf_serial.h\",\n    \"core/src/fpdfapi/fpdf_basic_module.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/cmap_int.h\",\n    \"core/src/fpdfapi/fpdf_cmaps/CNS1/Adobe-CNS1-UCS2_5.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-H_0.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-V_0.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/CNS1/cmaps_cns1.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-H_0.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-V_0.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-H_0.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-V_0.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-H_0.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-V_0.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/CNS1/HKscs-B5-H_5.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/CNS1/HKscs-B5-V_5.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UCS2-H_3.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UCS2-V_3.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UTF16-H_0.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/fpdf_cmaps.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/GB1/Adobe-GB1-UCS2_5.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/GB1/cmaps_gb1.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-H_0.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-V_0.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-H_2.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-V_2.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/GB1/GBK2K-H_5.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/GB1/GBK2K-V_5.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-H_2.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-V_2.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-H_0.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-V_0.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-H_4.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-V_4.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Japan1/83pv-RKSJ-H_1.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-H_2.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-V_2.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-H_2.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-V_2.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Japan1/90pv-RKSJ-H_1.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-H_1.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-V_1.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Japan1/Adobe-Japan1-UCS2_4.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Japan1/cmaps_japan1.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-H_1.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-V_1.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Japan1/Ext-RKSJ-H_2.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Japan1/Ext-RKSJ-V_2.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Japan1/H_1.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-H_4.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-V_4.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-H_4.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-V_4.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-H_5.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-V_5.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Japan1/V_1.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Korea1/Adobe-Korea1-UCS2_2.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Korea1/cmaps_korea1.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-H_0.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-V_0.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-H_1.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-V_1.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-H_1.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-V_1.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Korea1/KSCpc-EUC-H_0.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-H_1.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-V_1.cpp\",\n    \"core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UTF16-H_0.cpp\",\n    \"core/src/fpdfapi/fpdf_edit/editint.h\",\n    \"core/src/fpdfapi/fpdf_edit/fpdf_edit_content.cpp\",\n    \"core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp\",\n    \"core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp\",\n    \"core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp\",\n    \"core/src/fpdfapi/fpdf_font/common.h\",\n    \"core/src/fpdfapi/fpdf_font/font_int.h\",\n    \"core/src/fpdfapi/fpdf_font/fpdf_font.cpp\",\n    \"core/src/fpdfapi/fpdf_font/fpdf_font_charset.cpp\",\n    \"core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp\",\n    \"core/src/fpdfapi/fpdf_font/fpdf_font_utility.cpp\",\n    \"core/src/fpdfapi/fpdf_font/ttgsubtable.cpp\",\n    \"core/src/fpdfapi/fpdf_font/ttgsubtable.h\",\n    \"core/src/fpdfapi/fpdf_page/fpdf_page.cpp\",\n    \"core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp\",\n    \"core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp\",\n    \"core/src/fpdfapi/fpdf_page/fpdf_page_func.cpp\",\n    \"core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp\",\n    \"core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp\",\n    \"core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp\",\n    \"core/src/fpdfapi/fpdf_page/fpdf_page_parser_new.cpp\",\n    \"core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp\",\n    \"core/src/fpdfapi/fpdf_page/fpdf_page_path.cpp\",\n    \"core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp\",\n    \"core/src/fpdfapi/fpdf_page/pageint.h\",\n    \"core/src/fpdfapi/fpdf_parser/filters_int.h\",\n    \"core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp\",\n    \"core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp\",\n    \"core/src/fpdfapi/fpdf_parser/fpdf_parser_encrypt.cpp\",\n    \"core/src/fpdfapi/fpdf_parser/fpdf_parser_fdf.cpp\",\n    \"core/src/fpdfapi/fpdf_parser/fpdf_parser_filters.cpp\",\n    \"core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp\",\n    \"core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp\",\n    \"core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp\",\n    \"core/src/fpdfapi/fpdf_render/fpdf_render.cpp\",\n    \"core/src/fpdfapi/fpdf_render/fpdf_render_cache.cpp\",\n    \"core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp\",\n    \"core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp\",\n    \"core/src/fpdfapi/fpdf_render/fpdf_render_pattern.cpp\",\n    \"core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp\",\n    \"core/src/fpdfapi/fpdf_render/render_int.h\",\n  ]\n  configs -= [ \"//build/config/compiler:chromium_code\" ]\n  if (is_posix) {\n    configs -= [ \"//build/config/gcc:no_exceptions\" ]\n  }\n  configs += [ \":pdfium_config\", \"//build/config/compiler:no_chromium_code\" ]\n}\n\nstatic_library(\"fpdftext\") {\n  sources = [\n    \"core/include/fpdftext/fpdf_text.h\",\n    \"core/src/fpdftext/fpdf_text.cpp\",\n    \"core/src/fpdftext/fpdf_text_int.cpp\",\n    \"core/src/fpdftext/fpdf_text_search.cpp\",\n    \"core/src/fpdftext/text_int.h\",\n    \"core/src/fpdftext/txtproc.h\",\n    \"core/src/fpdftext/unicodenormalization.cpp\",\n    \"core/src/fpdftext/unicodenormalizationdata.cpp\",\n  ]\n  configs -= [ \"//build/config/compiler:chromium_code\" ]\n  if (is_posix) {\n    configs -= [ \"//build/config/gcc:no_exceptions\" ]\n  }\n  configs += [ \":pdfium_config\", \"//build/config/compiler:no_chromium_code\" ]\n}\n\nstatic_library(\"fxcodec\") {\n  sources = [\n    \"core/include/fxcodec/fx_codec.h\",\n    \"core/include/fxcodec/fx_codec_def.h\",\n    \"core/include/fxcodec/fx_codec_provider.h\",\n    \"core/src/fxcodec/codec/codec_int.h\",\n    \"core/src/fxcodec/codec/fx_codec.cpp\",\n    \"core/src/fxcodec/codec/fx_codec_fax.cpp\",\n    \"core/src/fxcodec/codec/fx_codec_flate.cpp\",\n    \"core/src/fxcodec/codec/fx_codec_icc.cpp\",\n    \"core/src/fxcodec/codec/fx_codec_jbig.cpp\",\n    \"core/src/fxcodec/codec/fx_codec_jbig_enc.cpp\",\n    \"core/src/fxcodec/codec/fx_codec_jpeg.cpp\",\n    \"core/src/fxcodec/codec/fx_codec_jpx_opj.cpp\",\n    \"core/src/fxcodec/fx_libopenjpeg/include/fx_openjpeg.h\",\n    \"core/src/fxcodec/fx_libopenjpeg/src/fx_bio.c\",\n    \"core/src/fxcodec/fx_libopenjpeg/src/fx_cio.c\",\n    \"core/src/fxcodec/fx_libopenjpeg/src/fx_dwt.c\",\n    \"core/src/fxcodec/fx_libopenjpeg/src/fx_event.c\",\n    \"core/src/fxcodec/fx_libopenjpeg/src/fx_function_list.c\",\n    \"core/src/fxcodec/fx_libopenjpeg/src/fx_image.c\",\n    \"core/src/fxcodec/fx_libopenjpeg/src/fx_invert.c\",\n    \"core/src/fxcodec/fx_libopenjpeg/src/fx_j2k.c\",\n    \"core/src/fxcodec/fx_libopenjpeg/src/fx_j2k_lib.c\",\n    \"core/src/fxcodec/fx_libopenjpeg/src/fx_jpt.c\",\n    \"core/src/fxcodec/fx_libopenjpeg/src/fx_mct.c\",\n    \"core/src/fxcodec/fx_libopenjpeg/src/fx_mqc.c\",\n    \"core/src/fxcodec/fx_libopenjpeg/src/fx_openjpeg.c\",\n    \"core/src/fxcodec/fx_libopenjpeg/src/fx_openjpeg_jp2.c\",\n    \"core/src/fxcodec/fx_libopenjpeg/src/fx_opj_clock.c\",\n    \"core/src/fxcodec/fx_libopenjpeg/src/fx_pi.c\",\n    \"core/src/fxcodec/fx_libopenjpeg/src/fx_raw.c\",\n    \"core/src/fxcodec/fx_libopenjpeg/src/fx_t1.c\",\n    \"core/src/fxcodec/fx_libopenjpeg/src/fx_t1_generate_luts.c\",\n    \"core/src/fxcodec/fx_libopenjpeg/src/fx_t2.c\",\n    \"core/src/fxcodec/fx_libopenjpeg/src/fx_tcd.c\",\n    \"core/src/fxcodec/fx_libopenjpeg/src/fx_tgt.c\",\n    \"core/src/fxcodec/fx_zlib/include/fx_zlib.h\",\n    \"core/src/fxcodec/fx_zlib/src/fx_zlib_adler32.c\",\n    \"core/src/fxcodec/fx_zlib/src/fx_zlib_compress.c\",\n    \"core/src/fxcodec/fx_zlib/src/fx_zlib_crc32.c\",\n    \"core/src/fxcodec/fx_zlib/src/fx_zlib_deflate.c\",\n    \"core/src/fxcodec/fx_zlib/src/fx_zlib_gzclose.c\",\n    \"core/src/fxcodec/fx_zlib/src/fx_zlib_gzlib.c\",\n    \"core/src/fxcodec/fx_zlib/src/fx_zlib_gzread.c\",\n    \"core/src/fxcodec/fx_zlib/src/fx_zlib_gzwrite.c\",\n    \"core/src/fxcodec/fx_zlib/src/fx_zlib_infback.c\",\n    \"core/src/fxcodec/fx_zlib/src/fx_zlib_inffast.c\",\n    \"core/src/fxcodec/fx_zlib/src/fx_zlib_inflate.c\",\n    \"core/src/fxcodec/fx_zlib/src/fx_zlib_inftrees.c\",\n    \"core/src/fxcodec/fx_zlib/src/fx_zlib_trees.c\",\n    \"core/src/fxcodec/fx_zlib/src/fx_zlib_uncompr.c\",\n    \"core/src/fxcodec/fx_zlib/src/fx_zlib_zutil.c\",\n    \"core/src/fxcodec/jbig2/JBig2_ArithDecoder.h\",\n    \"core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp\",\n    \"core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.h\",\n    \"core/src/fxcodec/jbig2/JBig2_ArithQe.h\",\n    \"core/src/fxcodec/jbig2/JBig2_BitStream.h\",\n    \"core/src/fxcodec/jbig2/JBig2_Context.cpp\",\n    \"core/src/fxcodec/jbig2/JBig2_Context.h\",\n    \"core/src/fxcodec/jbig2/JBig2_Define.h\",\n    \"core/src/fxcodec/jbig2/JBig2_GeneralDecoder.cpp\",\n    \"core/src/fxcodec/jbig2/JBig2_GeneralDecoder.h\",\n    \"core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp\",\n    \"core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.h\",\n    \"core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp\",\n    \"core/src/fxcodec/jbig2/JBig2_HuffmanTable.h\",\n    \"core/src/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h\",\n    \"core/src/fxcodec/jbig2/JBig2_Image.cpp\",\n    \"core/src/fxcodec/jbig2/JBig2_Image.h\",\n    \"core/src/fxcodec/jbig2/JBig2_List.h\",\n    \"core/src/fxcodec/jbig2/JBig2_Module.h\",\n    \"core/src/fxcodec/jbig2/JBig2_Object.cpp\",\n    \"core/src/fxcodec/jbig2/JBig2_Object.h\",\n    \"core/src/fxcodec/jbig2/JBig2_Page.h\",\n    \"core/src/fxcodec/jbig2/JBig2_PatternDict.cpp\",\n    \"core/src/fxcodec/jbig2/JBig2_PatternDict.h\",\n    \"core/src/fxcodec/jbig2/JBig2_Segment.cpp\",\n    \"core/src/fxcodec/jbig2/JBig2_Segment.h\",\n    \"core/src/fxcodec/jbig2/JBig2_SymbolDict.cpp\",\n    \"core/src/fxcodec/jbig2/JBig2_SymbolDict.h\",\n    \"core/src/fxcodec/lcms2/src/fx_cmscam02.c\",\n    \"core/src/fxcodec/lcms2/src/fx_cmscgats.c\",\n    \"core/src/fxcodec/lcms2/src/fx_cmscnvrt.c\",\n    \"core/src/fxcodec/lcms2/src/fx_cmserr.c\",\n    \"core/src/fxcodec/lcms2/src/fx_cmsgamma.c\",\n    \"core/src/fxcodec/lcms2/src/fx_cmsgmt.c\",\n    \"core/src/fxcodec/lcms2/src/fx_cmshalf.c\",\n    \"core/src/fxcodec/lcms2/src/fx_cmsintrp.c\",\n    \"core/src/fxcodec/lcms2/src/fx_cmsio0.c\",\n    \"core/src/fxcodec/lcms2/src/fx_cmsio1.c\",\n    \"core/src/fxcodec/lcms2/src/fx_cmslut.c\",\n    \"core/src/fxcodec/lcms2/src/fx_cmsmd5.c\",\n    \"core/src/fxcodec/lcms2/src/fx_cmsmtrx.c\",\n    \"core/src/fxcodec/lcms2/src/fx_cmsnamed.c\",\n    \"core/src/fxcodec/lcms2/src/fx_cmsopt.c\",\n    \"core/src/fxcodec/lcms2/src/fx_cmspack.c\",\n    \"core/src/fxcodec/lcms2/src/fx_cmspcs.c\",\n    \"core/src/fxcodec/lcms2/src/fx_cmsplugin.c\",\n    \"core/src/fxcodec/lcms2/src/fx_cmsps2.c\",\n    \"core/src/fxcodec/lcms2/src/fx_cmssamp.c\",\n    \"core/src/fxcodec/lcms2/src/fx_cmssm.c\",\n    \"core/src/fxcodec/lcms2/src/fx_cmstypes.c\",\n    \"core/src/fxcodec/lcms2/src/fx_cmsvirt.c\",\n    \"core/src/fxcodec/lcms2/src/fx_cmswtpnt.c\",\n    \"core/src/fxcodec/lcms2/src/fx_cmsxform.c\",\n    \"core/src/fxcodec/libjpeg/cderror.h\",\n    \"core/src/fxcodec/libjpeg/cdjpeg.h\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jcapimin.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jcapistd.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jccoefct.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jccolor.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jcdctmgr.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jchuff.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jcinit.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jcmainct.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jcmarker.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jcmaster.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jcomapi.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jcparam.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jcphuff.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jcprepct.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jcsample.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jctrans.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jdapimin.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jdapistd.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jdcoefct.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jdcolor.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jddctmgr.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jdhuff.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jdinput.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jdmainct.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jdmarker.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jdmaster.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jdmerge.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jdphuff.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jdpostct.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jdsample.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jdtrans.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jerror.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jfdctfst.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jfdctint.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jidctfst.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jidctint.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jidctred.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jmemmgr.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jmemnobs.c\",\n    \"core/src/fxcodec/libjpeg/fpdfapi_jutils.c\",\n    \"core/src/fxcodec/libjpeg/jchuff.h\",\n    \"core/src/fxcodec/libjpeg/jconfig.h\",\n    \"core/src/fxcodec/libjpeg/jdct.h\",\n    \"core/src/fxcodec/libjpeg/jdhuff.h\",\n    \"core/src/fxcodec/libjpeg/jerror.h\",\n    \"core/src/fxcodec/libjpeg/jinclude.h\",\n    \"core/src/fxcodec/libjpeg/jmemsys.h\",\n    \"core/src/fxcodec/libjpeg/jmorecfg.h\",\n    \"core/src/fxcodec/libjpeg/jpegint.h\",\n    \"core/src/fxcodec/libjpeg/jpeglib.h\",\n    \"core/src/fxcodec/libjpeg/jversion.h\",\n    \"core/src/fxcodec/libjpeg/makefile\",\n    \"core/src/fxcodec/libjpeg/transupp.h\",\n  ]\n  configs -= [ \"//build/config/compiler:chromium_code\" ]\n  if (is_posix) {\n    configs -= [ \"//build/config/gcc:no_exceptions\" ]\n  }\n\n  if (is_posix) {\n    # core/src/fxcodec/fx_libopenjpeg/src/fx_mct.c does an pointer-to-int\n    # conversion to check that an address is 16-bit aligned (benign).\n    cflags_c = [ \"-Wno-pointer-to-int-cast\" ]\n  }\n  configs += [ \":pdfium_config\", \"//build/config/compiler:no_chromium_code\" ]\n}\n\nstatic_library(\"fxcrt\") {\n  sources = [\n    \"core/include/fxcrt/fx_arb.h\",\n    \"core/include/fxcrt/fx_basic.h\",\n    \"core/include/fxcrt/fx_coordinates.h\",\n    \"core/include/fxcrt/fx_ext.h\",\n    \"core/include/fxcrt/fx_memory.h\",\n    \"core/include/fxcrt/fx_stream.h\",\n    \"core/include/fxcrt/fx_string.h\",\n    \"core/include/fxcrt/fx_system.h\",\n    \"core/include/fxcrt/fx_ucd.h\",\n    \"core/include/fxcrt/fx_xml.h\",\n    \"core/src/fxcrt/extension.h\",\n    \"core/src/fxcrt/fxcrt_platforms.cpp\",\n    \"core/src/fxcrt/fxcrt_platforms.h\",\n    \"core/src/fxcrt/fxcrt_posix.cpp\",\n    \"core/src/fxcrt/fxcrt_posix.h\",\n    \"core/src/fxcrt/fxcrt_windows.cpp\",\n    \"core/src/fxcrt/fxcrt_windows.h\",\n    \"core/src/fxcrt/fx_arabic.cpp\",\n    \"core/src/fxcrt/fx_arabic.h\",\n    \"core/src/fxcrt/fx_basic_array.cpp\",\n    \"core/src/fxcrt/fx_basic_bstring.cpp\",\n    \"core/src/fxcrt/fx_basic_buffer.cpp\",\n    \"core/src/fxcrt/fx_basic_coords.cpp\",\n    \"core/src/fxcrt/fx_basic_gcc.cpp\",\n    \"core/src/fxcrt/fx_basic_list.cpp\",\n    \"core/src/fxcrt/fx_basic_maps.cpp\",\n    \"core/src/fxcrt/fx_basic_memmgr.cpp\",\n    \"core/src/fxcrt/fx_basic_plex.cpp\",\n    \"core/src/fxcrt/fx_basic_utf.cpp\",\n    \"core/src/fxcrt/fx_basic_util.cpp\",\n    \"core/src/fxcrt/fx_basic_wstring.cpp\",\n    \"core/src/fxcrt/fx_extension.cpp\",\n    \"core/src/fxcrt/fx_ucddata.cpp\",\n    \"core/src/fxcrt/fx_unicode.cpp\",\n    \"core/src/fxcrt/fx_xml_composer.cpp\",\n    \"core/src/fxcrt/fx_xml_parser.cpp\",\n    \"core/src/fxcrt/plex.h\",\n    \"core/src/fxcrt/xml_int.h\",\n  ]\n  configs -= [ \"//build/config/compiler:chromium_code\" ]\n  if (is_posix) {\n    configs -= [ \"//build/config/gcc:no_exceptions\" ]\n  }\n  configs += [ \":pdfium_config\", \"//build/config/compiler:no_chromium_code\" ]\n}\n\nstatic_library(\"fxge\") {\n  sources = [\n    \"core/include/fxge/fpf.h\",\n    \"core/include/fxge/fx_dib.h\",\n    \"core/include/fxge/fx_font.h\",\n    \"core/include/fxge/fx_freetype.h\",\n    \"core/include/fxge/fx_ge.h\",\n    \"core/include/fxge/fx_ge_apple.h\",\n    \"core/include/fxge/fx_ge_win32.h\",\n    \"core/src/fxge/agg/include/fxfx_agg_basics.h\",\n    \"core/src/fxge/agg/include/fxfx_agg_clip_liang_barsky.h\",\n    \"core/src/fxge/agg/include/fxfx_agg_conv_dash.h\",\n    \"core/src/fxge/agg/include/fxfx_agg_conv_stroke.h\",\n    \"core/src/fxge/agg/include/fxfx_agg_curves.h\",\n    \"core/src/fxge/agg/include/fxfx_agg_path_storage.h\",\n    \"core/src/fxge/agg/include/fxfx_agg_rasterizer_scanline_aa.h\",\n    \"core/src/fxge/agg/include/fxfx_agg_renderer_scanline.h\",\n    \"core/src/fxge/agg/include/fxfx_agg_rendering_buffer.h\",\n    \"core/src/fxge/agg/include/fxfx_agg_scanline_u.h\",\n    \"core/src/fxge/agg/include/fx_agg_driver.h\",\n    \"core/src/fxge/agg/src/fxfx_agg_curves.cpp\",\n    \"core/src/fxge/agg/src/fxfx_agg_driver.cpp\",\n    \"core/src/fxge/agg/src/fxfx_agg_path_storage.cpp\",\n    \"core/src/fxge/agg/src/fxfx_agg_rasterizer_scanline_aa.cpp\",\n    \"core/src/fxge/agg/src/fxfx_agg_vcgen_dash.cpp\",\n    \"core/src/fxge/agg/src/fxfx_agg_vcgen_stroke.cpp\",\n    \"core/src/fxge/android/fpf_skiafont.cpp\",\n    \"core/src/fxge/android/fpf_skiafont.h\",\n    \"core/src/fxge/android/fpf_skiafontmgr.cpp\",\n    \"core/src/fxge/android/fpf_skiafontmgr.h\",\n    \"core/src/fxge/android/fpf_skiamodule.cpp\",\n    \"core/src/fxge/android/fpf_skiamodule.h\",\n    \"core/src/fxge/android/fx_android_font.cpp\",\n    \"core/src/fxge/android/fx_android_font.h\",\n    \"core/src/fxge/android/fx_android_imp.cpp\",\n    \"core/src/fxge/android/fx_fpf.h\",\n    \"core/src/fxge/apple/apple_int.h\",\n    \"core/src/fxge/apple/fx_apple_platform.cpp\",\n    \"core/src/fxge/apple/fx_mac_imp.cpp\",\n    \"core/src/fxge/apple/fx_quartz_device.cpp\",\n    \"core/src/fxge/dib/dib_int.h\",\n    \"core/src/fxge/dib/fx_dib_composite.cpp\",\n    \"core/src/fxge/dib/fx_dib_convert.cpp\",\n    \"core/src/fxge/dib/fx_dib_engine.cpp\",\n    \"core/src/fxge/dib/fx_dib_main.cpp\",\n    \"core/src/fxge/dib/fx_dib_transform.cpp\",\n    \"core/src/fxge/fontdata/chromefontdata/FoxitDingbats.c\",\n    \"core/src/fxge/fontdata/chromefontdata/FoxitFixed.c\",\n    \"core/src/fxge/fontdata/chromefontdata/FoxitFixedBold.c\",\n    \"core/src/fxge/fontdata/chromefontdata/FoxitFixedBoldItalic.c\",\n    \"core/src/fxge/fontdata/chromefontdata/FoxitFixedItalic.c\",\n    \"core/src/fxge/fontdata/chromefontdata/FoxitSans.c\",\n    \"core/src/fxge/fontdata/chromefontdata/FoxitSansBold.c\",\n    \"core/src/fxge/fontdata/chromefontdata/FoxitSansBoldItalic.c\",\n    \"core/src/fxge/fontdata/chromefontdata/FoxitSansItalic.c\",\n    \"core/src/fxge/fontdata/chromefontdata/FoxitSansMM.c\",\n    \"core/src/fxge/fontdata/chromefontdata/FoxitSerif.c\",\n    \"core/src/fxge/fontdata/chromefontdata/FoxitSerifBold.c\",\n    \"core/src/fxge/fontdata/chromefontdata/FoxitSerifBoldItalic.c\",\n    \"core/src/fxge/fontdata/chromefontdata/FoxitSerifItalic.c\",\n    \"core/src/fxge/fontdata/chromefontdata/FoxitSerifMM.c\",\n    \"core/src/fxge/fontdata/chromefontdata/FoxitSymbol.c\",\n    \"core/src/fxge/fx_freetype/include/fxft_cffobjs.h\",\n    \"core/src/fxge/fx_freetype/include/fxft_cfftypes.h\",\n    \"core/src/fxge/fx_freetype/include/fxft_freetype.h\",\n    \"core/src/fxge/fx_freetype/include/fxft_ft2build.h\",\n    \"core/src/fxge/fx_freetype/include/fxft_ftmm.h\",\n    \"core/src/fxge/fx_freetype/include/fxft_ftobjs.h\",\n    \"core/src/fxge/fx_freetype/include/fxft_ftotval.h\",\n    \"core/src/fxge/fx_freetype/include/fxft_ftoutln.h\",\n    \"core/src/fxge/fx_freetype/include/fxft_ftstream.h\",\n    \"core/src/fxge/fx_freetype/include/fxft_tttables.h\",\n    \"core/src/fxge/fx_freetype/include/fxft_tttypes.h\",\n    \"core/src/fxge/fx_freetype/src/fxft_cff.c\",\n    \"core/src/fxge/fx_freetype/src/fxft_ftbase.c\",\n    \"core/src/fxge/fx_freetype/src/fxft_ftbitmap.c\",\n    \"core/src/fxge/fx_freetype/src/fxft_ftglyph.c\",\n    \"core/src/fxge/fx_freetype/src/fxft_ftinit.c\",\n    \"core/src/fxge/fx_freetype/src/fxft_ftlcdfil.c\",\n    \"core/src/fxge/fx_freetype/src/fxft_ftmm.c\",\n    \"core/src/fxge/fx_freetype/src/fxft_ftsystem.c\",\n    \"core/src/fxge/fx_freetype/src/fxft_psaux.c\",\n    \"core/src/fxge/fx_freetype/src/fxft_pshinter.c\",\n    \"core/src/fxge/fx_freetype/src/fxft_psmodule.c\",\n    \"core/src/fxge/fx_freetype/src/fxft_raster.c\",\n    \"core/src/fxge/fx_freetype/src/fxft_sfnt.c\",\n    \"core/src/fxge/fx_freetype/src/fxft_smooth.c\",\n    \"core/src/fxge/fx_freetype/src/fxft_truetype.c\",\n    \"core/src/fxge/fx_freetype/src/fxft_type1.c\",\n    \"core/src/fxge/fx_freetype/src/fxft_type1cid.c\",\n    \"core/src/fxge/ge/fx_ge.cpp\",\n    \"core/src/fxge/ge/fx_ge_device.cpp\",\n    \"core/src/fxge/ge/fx_ge_font.cpp\",\n    \"core/src/fxge/ge/fx_ge_fontmap.cpp\",\n    \"core/src/fxge/ge/fx_ge_linux.cpp\",\n    \"core/src/fxge/ge/fx_ge_path.cpp\",\n    \"core/src/fxge/ge/fx_ge_ps.cpp\",\n    \"core/src/fxge/ge/fx_ge_text.cpp\",\n    \"core/src/fxge/ge/text_int.h\",\n  ]\n\n  configs -= [ \"//build/config/compiler:chromium_code\" ]\n  if (is_posix) {\n    configs -= [ \"//build/config/gcc:no_exceptions\" ]\n  }\n  configs += [ \":pdfium_config\", \"//build/config/compiler:no_chromium_code\" ]\n\n  if (pdf_use_skia) {\n    sources = [\n      \"core/src/fxge/skia/fx_skia_blitter_new.cpp\",\n      \"core/src/fxge/skia/fx_skia_device.cpp\",\n    ]\n    include_dirs = [\n      \"//third_party/skia/include/config\",\n      \"//third_party/skia/include/core\",\n      \"//third_party/skia/include/effects\",\n      \"//third_party/skia/include/images\",\n      \"//third_party/skia/include/lazy\",\n      \"//third_party/skia/include/pathops\",\n      \"//third_party/skia/include/utils\",\n      \"//third_party/skia/src/core\",\n    ]\n    deps = [ \"//skia\" ]\n  }\n\n  if (is_win) {\n    sources += [\n      \"core/src/fxge/win32/dwrite_int.h\",\n      \"core/src/fxge/win32/fx_win32_device.cpp\",\n      \"core/src/fxge/win32/fx_win32_dib.cpp\",\n      \"core/src/fxge/win32/fx_win32_dwrite.cpp\",\n      \"core/src/fxge/win32/fx_win32_gdipext.cpp\",\n      \"core/src/fxge/win32/fx_win32_print.cpp\",\n      \"core/src/fxge/win32/win32_int.h\",\n    ]\n    configs -= [\n      \"//build/config/win:lean_and_mean\",\n      \"//build/config/win:nominmax\",\n    ]\n  }\n}\n\nstatic_library(\"fxedit\") {\n  sources = [\n    \"fpdfsdk/include/fxedit/fx_edit.h\",\n    \"fpdfsdk/include/fxedit/fxet_edit.h\",\n    \"fpdfsdk/include/fxedit/fxet_list.h\",\n    \"fpdfsdk/include/fxedit/fxet_stub.h\",\n    \"fpdfsdk/src/fxedit/fxet_ap.cpp\",\n    \"fpdfsdk/src/fxedit/fxet_edit.cpp\",\n    \"fpdfsdk/src/fxedit/fxet_list.cpp\",\n    \"fpdfsdk/src/fxedit/fxet_module.cpp\",\n    \"fpdfsdk/src/fxedit/fxet_pageobjs.cpp\",\n  ]\n  configs -= [ \"//build/config/compiler:chromium_code\" ]\n  if (is_posix) {\n    configs -= [ \"//build/config/gcc:no_exceptions\" ]\n  }\n  configs += [ \":pdfium_config\", \"//build/config/compiler:no_chromium_code\" ]\n}\n\nstatic_library(\"pdfwindow\") {\n  sources = [\n    \"fpdfsdk/include/pdfwindow/IPDFWindow.h\",\n    \"fpdfsdk/include/pdfwindow/PDFWindow.h\",\n    \"fpdfsdk/include/pdfwindow/PWL_Button.h\",\n    \"fpdfsdk/include/pdfwindow/PWL_Caret.h\",\n    \"fpdfsdk/include/pdfwindow/PWL_ComboBox.h\",\n    \"fpdfsdk/include/pdfwindow/PWL_Edit.h\",\n    \"fpdfsdk/include/pdfwindow/PWL_EditCtrl.h\",\n    \"fpdfsdk/include/pdfwindow/PWL_FontMap.h\",\n    \"fpdfsdk/include/pdfwindow/PWL_Icon.h\",\n    \"fpdfsdk/include/pdfwindow/PWL_IconList.h\",\n    \"fpdfsdk/include/pdfwindow/PWL_Label.h\",\n    \"fpdfsdk/include/pdfwindow/PWL_ListBox.h\",\n    \"fpdfsdk/include/pdfwindow/PWL_ListCtrl.h\",\n    \"fpdfsdk/include/pdfwindow/PWL_Note.h\",\n    \"fpdfsdk/include/pdfwindow/PWL_ScrollBar.h\",\n    \"fpdfsdk/include/pdfwindow/PWL_Signature.h\",\n    \"fpdfsdk/include/pdfwindow/PWL_SpecialButton.h\",\n    \"fpdfsdk/include/pdfwindow/PWL_Utils.h\",\n    \"fpdfsdk/include/pdfwindow/PWL_Wnd.h\",\n    \"fpdfsdk/src/pdfwindow/PWL_Button.cpp\",\n    \"fpdfsdk/src/pdfwindow/PWL_Caret.cpp\",\n    \"fpdfsdk/src/pdfwindow/PWL_ComboBox.cpp\",\n    \"fpdfsdk/src/pdfwindow/PWL_Edit.cpp\",\n    \"fpdfsdk/src/pdfwindow/PWL_EditCtrl.cpp\",\n    \"fpdfsdk/src/pdfwindow/PWL_FontMap.cpp\",\n    \"fpdfsdk/src/pdfwindow/PWL_Icon.cpp\",\n    \"fpdfsdk/src/pdfwindow/PWL_IconList.cpp\",\n    \"fpdfsdk/src/pdfwindow/PWL_Label.cpp\",\n    \"fpdfsdk/src/pdfwindow/PWL_ListBox.cpp\",\n    \"fpdfsdk/src/pdfwindow/PWL_ListCtrl.cpp\",\n    \"fpdfsdk/src/pdfwindow/PWL_Note.cpp\",\n    \"fpdfsdk/src/pdfwindow/PWL_ScrollBar.cpp\",\n    \"fpdfsdk/src/pdfwindow/PWL_Signature.cpp\",\n    \"fpdfsdk/src/pdfwindow/PWL_SpecialButton.cpp\",\n    \"fpdfsdk/src/pdfwindow/PWL_Utils.cpp\",\n    \"fpdfsdk/src/pdfwindow/PWL_Wnd.cpp\",\n  ]\n  configs -= [ \"//build/config/compiler:chromium_code\" ]\n  if (is_posix) {\n    configs -= [ \"//build/config/gcc:no_exceptions\" ]\n  }\n  configs += [ \":pdfium_config\", \"//build/config/compiler:no_chromium_code\" ]\n}\n\nstatic_library(\"javascript\") {\n  sources = [\n    \"fpdfsdk/include/javascript/app.h\",\n    \"fpdfsdk/include/javascript/color.h\",\n    \"fpdfsdk/include/javascript/console.h\",\n    \"fpdfsdk/include/javascript/Consts.h\",\n    \"fpdfsdk/include/javascript/Document.h\",\n    \"fpdfsdk/include/javascript/event.h\",\n    \"fpdfsdk/include/javascript/Field.h\",\n    \"fpdfsdk/include/javascript/global.h\",\n    \"fpdfsdk/include/javascript/Icon.h\",\n    \"fpdfsdk/include/javascript/IJavaScript.h\",\n    \"fpdfsdk/include/javascript/JavaScript.h\",\n    \"fpdfsdk/include/javascript/JS_Console.h\",\n    \"fpdfsdk/include/javascript/JS_Context.h\",\n    \"fpdfsdk/include/javascript/JS_Define.h\",\n    \"fpdfsdk/include/javascript/JS_EventHandler.h\",\n    \"fpdfsdk/include/javascript/JS_GlobalData.h\",\n    \"fpdfsdk/include/javascript/JS_Module.h\",\n    \"fpdfsdk/include/javascript/JS_Object.h\",\n    \"fpdfsdk/include/javascript/JS_Runtime.h\",\n    \"fpdfsdk/include/javascript/JS_Value.h\",\n    \"fpdfsdk/include/javascript/PublicMethods.h\",\n    \"fpdfsdk/include/javascript/report.h\",\n    \"fpdfsdk/include/javascript/resource.h\",\n    \"fpdfsdk/include/javascript/util.h\",\n    \"fpdfsdk/src/javascript/app.cpp\",\n    \"fpdfsdk/src/javascript/color.cpp\",\n    \"fpdfsdk/src/javascript/console.cpp\",\n    \"fpdfsdk/src/javascript/Consts.cpp\",\n    \"fpdfsdk/src/javascript/Document.cpp\",\n    \"fpdfsdk/src/javascript/event.cpp\",\n    \"fpdfsdk/src/javascript/Field.cpp\",\n    \"fpdfsdk/src/javascript/global.cpp\",\n    \"fpdfsdk/src/javascript/Icon.cpp\",\n    \"fpdfsdk/src/javascript/JS_Context.cpp\",\n    \"fpdfsdk/src/javascript/JS_EventHandler.cpp\",\n    \"fpdfsdk/src/javascript/JS_GlobalData.cpp\",\n    \"fpdfsdk/src/javascript/JS_Object.cpp\",\n    \"fpdfsdk/src/javascript/JS_Runtime.cpp\",\n    \"fpdfsdk/src/javascript/JS_Value.cpp\",\n    \"fpdfsdk/src/javascript/PublicMethods.cpp\",\n    \"fpdfsdk/src/javascript/report.cpp\",\n    \"fpdfsdk/src/javascript/util.cpp\",\n  ]\n\n  configs -= [ \"//build/config/compiler:chromium_code\" ]\n  if (is_posix) {\n    configs -= [ \"//build/config/gcc:no_exceptions\" ]\n  }\n  configs += [ \":pdfium_config\", \"//build/config/compiler:no_chromium_code\" ]\n  include_dirs = [\n    \"//v8\",\n    \"//v8/include\",\n  ]\n  deps = [\n    \"//v8\",\n  ]\n  forward_dependent_configs_from = [ \"//v8\" ]\n}\n\nstatic_library(\"jsapi\") {\n  sources = [\n    \"fpdfsdk/include/jsapi/fxjs_v8.h\",\n    \"fpdfsdk/src/jsapi/fxjs_v8.cpp\",\n  ]\n\n  configs -= [ \"//build/config/compiler:chromium_code\" ]\n  if (is_posix) {\n    configs -= [ \"//build/config/gcc:no_exceptions\" ]\n  }\n  configs += [ \":pdfium_config\", \"//build/config/compiler:no_chromium_code\" ]\n  include_dirs = [\n    \"//v8\",\n    \"//v8/include\",\n  ]\n  deps = [\n    \"//v8\",\n  ]\n  forward_dependent_configs_from = [ \"//v8\" ]\n}\n\nstatic_library(\"formfiller\") {\n  sources = [\n    \"fpdfsdk/include/formfiller/FFL_CBA_Fontmap.h\",\n    \"fpdfsdk/include/formfiller/FFL_CheckBox.h\",\n    \"fpdfsdk/include/formfiller/FFL_ComboBox.h\",\n    \"fpdfsdk/include/formfiller/FFL_FormFiller.h\",\n    \"fpdfsdk/include/formfiller/FFL_IFormFiller.h\",\n    \"fpdfsdk/include/formfiller/FFL_ListBox.h\",\n    \"fpdfsdk/include/formfiller/FFL_Notify.h\",\n    \"fpdfsdk/include/formfiller/FFL_PushButton.h\",\n    \"fpdfsdk/include/formfiller/FFL_RadioButton.h\",\n    \"fpdfsdk/include/formfiller/FFL_TextField.h\",\n    \"fpdfsdk/include/formfiller/FFL_Utils.h\",\n    \"fpdfsdk/include/formfiller/FormFiller.h\",\n    \"fpdfsdk/src/formfiller/FFL_CBA_Fontmap.cpp\",\n    \"fpdfsdk/src/formfiller/FFL_CheckBox.cpp\",\n    \"fpdfsdk/src/formfiller/FFL_ComboBox.cpp\",\n    \"fpdfsdk/src/formfiller/FFL_FormFiller.cpp\",\n    \"fpdfsdk/src/formfiller/FFL_IFormFiller.cpp\",\n    \"fpdfsdk/src/formfiller/FFL_ListBox.cpp\",\n    \"fpdfsdk/src/formfiller/FFL_Notify.cpp\",\n    \"fpdfsdk/src/formfiller/FFL_PushButton.cpp\",\n    \"fpdfsdk/src/formfiller/FFL_RadioButton.cpp\",\n    \"fpdfsdk/src/formfiller/FFL_TextField.cpp\",\n    \"fpdfsdk/src/formfiller/FFL_Utils.cpp\",\n  ]\n  configs -= [ \"//build/config/compiler:chromium_code\" ]\n  if (is_posix) {\n    configs -= [ \"//build/config/gcc:no_exceptions\" ]\n  }\n  configs += [ \":pdfium_config\", \"//build/config/compiler:no_chromium_code\" ]\n}\n"
  },
  {
    "path": "LICENSE",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//    * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//    * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//    * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "README",
    "content": "For build instructions visit https://code.google.com/p/pdfium/wiki/Build"
  },
  {
    "path": "README.md",
    "content": "### PDFium.js\n\nPDFium ported to JS with Emscripten\n\n[Online Demo](http://coolwanglu.github.io/PDFium.js/)\n\n[Experimental PDF Reader](http://coolwanglu.github.io/PDFium.js/viewer/) using UI framework from [PDF.js](https://github.com/mozilla/pdf.js)\n"
  },
  {
    "path": "TODO",
    "content": "- Support XHR files\n- Paint PDF to image directly, avoid allocating\n- Worker, for smooth scrolling\n"
  },
  {
    "path": "build/all.gyp",
    "content": "# Copyright 2014 PDFium Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\n{\n  'targets': [\n    {\n      'target_name': 'All',\n      'type': 'none',\n      'dependencies': [\n        '../samples/samples.gyp:*',\n        '../pdfium.js/pdfium.js.gyp:*',\n      ],\n    }\n  ]\n}\n"
  },
  {
    "path": "build/gyp_pdfium",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2014 PDFium Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\n# This script is wrapper for PDFium that adds some support for how GYP\n# is invoked by PDFium beyond what can be done in the gclient hooks.\n\nimport os\nimport platform\nimport sys\n\nscript_dir = os.path.dirname(os.path.realpath(__file__))\npdfium_root = os.path.abspath(os.path.join(script_dir, os.pardir))\n\nsys.path.insert(0, os.path.join(pdfium_root, 'build', 'gyp', 'pylib'))\nimport gyp\n\n\ndef run_gyp(args):\n  rc = gyp.main(args)\n  if rc != 0:\n    print 'Error running GYP'\n    sys.exit(rc)\n\n\ndef main():\n  args = sys.argv[1:]\n  args.append(os.path.join(script_dir, 'all.gyp'))\n  \n  args.append('-I')\n  args.append(os.path.join(pdfium_root, 'build', 'standalone.gypi'))\n  \n  args.extend(['-D', 'gyp_output_dir=out'])\n\n  # Set the GYP DEPTH variable to the root of the PDFium project.\n  args.append('--depth=' + os.path.relpath(pdfium_root))\n\n  print 'Updating projects from gyp files...'\n  sys.stdout.flush()\n\n  run_gyp(args)\n\n\nif __name__ == '__main__':\n  sys.exit(main())"
  },
  {
    "path": "build/gyp_pdfium.py",
    "content": "# Copyright 2014 PDFium Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\nimport os\n\npath = os.path.abspath(os.path.split(__file__)[0])\nexecfile(os.path.join(path, 'gyp_pdfium'))\n"
  },
  {
    "path": "build/standalone.gypi",
    "content": "# Copyright 2014 PDFium Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\n# Definitions to be used when building stand-alone PDFium binaries.\n\n{\n  'variables': {\n    'component%': 'static_library',\n    'clang%': 0,\n    'msvs_multi_core_compile%': '1',\n    'variables': {\n      'variables': {\n        'variables': {\n          'conditions': [\n            ['OS==\"linux\" or OS==\"mac\"', {\n              # This handles the Unix platforms we generally deal with.\n              # Anything else gets passed through, which probably won't work\n              # very well; such hosts should pass an explicit target_arch\n              # to gyp.\n              'host_arch%':\n                '<!(uname -m | sed -e \"s/i.86/ia32/;\\\n                                       s/x86_64/x64/;\\\n                                       s/amd64/x64/;\\\n                                       s/arm.*/arm/;\\\n                                       s/aarch64/arm64/;\\\n                                       s/mips.*/mipsel/\")',\n            }, {\n              # OS!=\"linux\" and OS!=\"mac\"\n              'host_arch%': 'ia32',\n            }],\n          ],\n        },\n        'host_arch%': '<(host_arch)',\n        'target_arch%': '<(host_arch)',\n      },\n      'host_arch%': '<(host_arch)',\n      'target_arch%': '<(target_arch)',\n    },\n    # These two are needed by V8.\n    'host_arch%': '<(host_arch)',\n    'target_arch%': '<(target_arch)',\n    'werror%': '-Werror',\n    'v8_optimized_debug%': 0,\n    'icu_gyp_path': '../v8/third_party/icu/icu.gyp',\n    'conditions': [\n      ['OS == \"win\"', {\n        'os_posix%': 0,\n      }, {\n        'os_posix%': 1,\n      }],\n    ],\n  },\n  'target_defaults': {\n    'default_configuration': 'Debug',\n    'configurations': {\n      'Debug': {\n        'cflags': [\n          '-g',\n          '-O0',          \n          '-fdata-sections',\n          '-ffunction-sections',\n        ],\n        'msvs_settings': {\n          'VCCLCompilerTool': {\n            'Optimization': '0',\n            'conditions': [\n              ['component==\"shared_library\"', {\n                'RuntimeLibrary': '3',  # /MDd\n              }, {\n                'RuntimeLibrary': '1',  # /MTd\n              }],\n            ],\n          },\n          'VCLinkerTool': {\n            'LinkIncremental': '2',\n          },\n        },\n        'xcode_settings': {\n          'GCC_OPTIMIZATION_LEVEL': '0',  # -O0\n        },\n      },\n      'Release': {\n        'cflags': [\n          '-fno-strict-aliasing',\n        ],\n        'xcode_settings': {\n          'GCC_OPTIMIZATION_LEVEL': '3',  # -O3\n          'GCC_STRICT_ALIASING': 'NO',\n        },\n        'msvs_settings': {\n          'VCCLCompilerTool': {\n            'Optimization': '2',\n            'InlineFunctionExpansion': '2',\n            'EnableIntrinsicFunctions': 'true',\n            'FavorSizeOrSpeed': '0',\n            'StringPooling': 'true',\n            'conditions': [\n              ['component==\"shared_library\"', {\n                'RuntimeLibrary': '2',  #/MD\n              }, {\n                'RuntimeLibrary': '0',  #/MT\n              }],\n            ],\n          },\n          'VCLinkerTool': {\n            'LinkIncremental': '1',\n            'OptimizeReferences': '2',\n            'EnableCOMDATFolding': '2',\n          },\n        },\n        'conditions': [\n          ['OS==\"linux\"', {\n            'cflags': [\n              '-fdata-sections',\n              '-ffunction-sections',\n              '-Oz',\n            ],\n          }],\n          ['OS==\"android\"', {\n            'cflags!': [\n              '-O3',\n              '-Os',\n            ],\n            'cflags': [\n              '-fdata-sections',\n              '-ffunction-sections',\n              '-O2',\n            ],\n          }],\n        ],  # conditions\n      },\n      'Debug_x64': {\n        'inherit_from': ['Debug'],\n        'msvs_configuration_platform': 'x64',\n      },\n      'Release_x64': {\n        'inherit_from': ['Release'],\n        'msvs_configuration_platform': 'x64',\n      },\n    },\n    'defines!': [\n      'DEBUG',\n    ],\n    'cflags': [\n      '-Wall',\n      '-W',\n      '-Wno-unused-parameter',\n      '-pthread', '-fno-exceptions',\n      '-fvisibility=hidden',\n    ],\n    'cflags_cc': [\n      '-Wnon-virtual-dtor',\n      '-fno-rtti',\n    ],\n    'ldflags': [\n      '-pthread',\n    ],\n    'msvs_cygwin_dirs': ['<(DEPTH)/v8/third_party/cygwin'],\n    'msvs_configuration_attributes': {\n      'OutputDirectory': '<(DEPTH)\\\\build\\\\$(ConfigurationName)',\n      'IntermediateDirectory': '$(OutDir)\\\\obj\\\\$(ProjectName)',\n      'CharacterSet': '1',\n    },\n    'msvs_settings': {\n      'VCCLCompilerTool': {\n        'MinimalRebuild': 'false',\n        'BufferSecurityCheck': 'true',\n        'EnableFunctionLevelLinking': 'true',\n        'RuntimeTypeInfo': 'false',\n        'WarningLevel': '3',\n        'WarnAsError': 'false',\n        'DebugInformationFormat': '3',\n        'Detect64BitPortabilityProblems': 'false',\n        'conditions': [\n          [ 'msvs_multi_core_compile', {\n            'AdditionalOptions': ['/MP'],\n          }],\n          ['component==\"shared_library\"', {\n            'ExceptionHandling': '1',  # /EHsc\n          }, {\n            'ExceptionHandling': '0',\n          }],\n        ],\n      },\n      'VCLibrarianTool': {\n        'AdditionalOptions': ['/ignore:4221'],\n      },\n      'VCLinkerTool': {\n        'GenerateDebugInformation': 'true',\n        'LinkIncremental': '1',\n        # SubSystem values:\n        #   0 == not set\n        #   1 == /SUBSYSTEM:CONSOLE\n        #   2 == /SUBSYSTEM:WINDOWS\n        'SubSystem': '1',\n      },\n    },\n    'xcode_settings': {\n      'ALWAYS_SEARCH_USER_PATHS': 'NO',\n      'GCC_CW_ASM_SYNTAX': 'NO',                # No -fasm-blocks\n      'GCC_DYNAMIC_NO_PIC': 'NO',               # No -mdynamic-no-pic\n                                                # (Equivalent to -fPIC)\n      'GCC_ENABLE_CPP_EXCEPTIONS': 'NO',        # -fno-exceptions\n      'GCC_ENABLE_CPP_RTTI': 'NO',              # -fno-rtti\n      'GCC_ENABLE_PASCAL_STRINGS': 'NO',        # No -mpascal-strings\n      # GCC_INLINES_ARE_PRIVATE_EXTERN maps to -fvisibility-inlines-hidden\n      'GCC_INLINES_ARE_PRIVATE_EXTERN': 'YES',\n      'GCC_SYMBOLS_PRIVATE_EXTERN': 'YES',      # -fvisibility=hidden\n      'GCC_TREAT_WARNINGS_AS_ERRORS': 'NO',     # -Werror\n      'GCC_WARN_NON_VIRTUAL_DESTRUCTOR': 'YES', # -Wnon-virtual-dtor\n      'SYMROOT': '<(DEPTH)/xcodebuild',\n      'USE_HEADERMAP': 'NO',\n      'OTHER_CFLAGS': [\n        '-fno-strict-aliasing',\n      ],\n      'WARNING_CFLAGS': [\n        '-Wall',\n        '-Wendif-labels',\n        '-W',\n        '-Wno-unused-parameter',\n      ],\n    },\n  },\n  'conditions': [\n    ['component==\"shared_library\"', {\n      'cflags': [\n        '-fPIC',\n      ],\n    }],\n    ['OS==\"win\"', {\n      'target_defaults': {\n        'defines': [\n          'NOMINMAX',\n          '_CRT_SECURE_NO_DEPRECATE',\n          '_CRT_NONSTDC_NO_DEPRECATE',\n        ],\n        'conditions': [\n          ['component==\"static_library\"', {\n            'defines': [\n              '_HAS_EXCEPTIONS=0',\n            ],\n          }],\n        ],\n      },\n    }],  # OS==\"win\"\n    ['OS==\"mac\"', {\n      'target_defaults': {\n        'target_conditions': [\n          ['_type!=\"static_library\"', {\n            'xcode_settings': {'OTHER_LDFLAGS': ['-Wl,-search_paths_first']},\n          }],\n        ],  # target_conditions\n      },  # target_defaults\n    }],  # OS==\"mac\"\n  ],\n  'xcode_settings': {\n    # See comment in Chromium's common.gypi for why this is needed.\n    'SYMROOT': '<(DEPTH)/xcodebuild',\n  }\n}\n"
  },
  {
    "path": "build.sh",
    "content": "#!/bin/bash\nset -e\n[ -z $EM_DIR] && EM_DIR=~/src/emscripten\n\ndo_config() {\n    build/gyp_pdfium\n}\n\ndo_make() {\n$EM_DIR/emmake make BUILDTYPE=Release -j8\n}\n\ndo_link() {\nmkdir web || true\n$EM_DIR/em++ \\\n    -Oz \\\n    --llvm-lto 1 \\\n    --memory-init-file 1 \\\n    -s EXPORTED_FUNCTIONS=\"['_PDFiumJS_init', '_PDFiumJS_Doc_new', '_PDFiumJS_Doc_delete', '_PDFiumJS_Doc_get_page_count', '_PDFiumJS_Doc_get_page', '_PDFiumJS_Page_get_width', '_PDFiumJS_Page_get_height', '_PDFiumJS_Page_get_bitmap', '_PDFiumJS_Bitmap_get_buffer', '_PDFiumJS_Bitmap_get_stride', '_PDFiumJS_Bitmap_destroy', '_PDFiumJS_Page_destroy']\" \\\n    --js-library pdfium.js/pdfium.js.lib.js \\\n    -o web/pdfium.js \\\n    -Wl,--start-group out/Release/obj.target/pdfium_js/pdfium.js/pdfium.js.o out/Release/obj.target/libpdfium.a out/Release/obj.target/libfdrm.a out/Release/obj.target/libfpdfdoc.a out/Release/obj.target/libfpdfapi.a out/Release/obj.target/libfpdftext.a out/Release/obj.target/libformfiller.a out/Release/obj.target/libfxcodec.a out/Release/obj.target/libfxcrt.a out/Release/obj.target/libfxedit.a out/Release/obj.target/libfxge.a out/Release/obj.target/libpdfwindow.a -Wl,--end-group\n\ncp web/pdfium.js.mem web/viewer/\n}\n\n#do_config\n#do_make\ndo_link\n\n"
  },
  {
    "path": "codereview.settings",
    "content": "# This file is used by gcl to get repository specific information.\nCODE_REVIEW_SERVER: codereview.chromium.org\nCC_LIST: pdfium-reviews@googlegroups.com\nSTATUS: http://chromium-status.appspot.com/status\nTRY_ON_UPLOAD: False\nVIEW_VC: https://pdfium.googlesource.com/pdfium/+/\nGITCL_PREUPLOAD: http://src.chromium.org/viewvc/trunk/tools/depot_tools/git-cl-upload-hook?revision=HEAD&root=chrome\nGITCL_PREDCOMMIT: http://src.chromium.org/viewvc/trunk/tools/depot_tools/git-cl-upload-hook?revision=HEAD&root=chrome\n"
  },
  {
    "path": "core/include/fdrm/fx_crypt.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_CRYPT_H_\n#define _FX_CRYPT_H_\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nvoid CRYPT_ArcFourCryptBlock(FX_LPBYTE data, FX_DWORD size, FX_LPCBYTE key, FX_DWORD keylen);\nvoid CRYPT_ArcFourSetup(FX_LPVOID context, FX_LPCBYTE key, FX_DWORD length);\nvoid CRYPT_ArcFourCrypt(FX_LPVOID context, FX_LPBYTE data, FX_DWORD size);\nvoid CRYPT_AESSetKey(FX_LPVOID context, FX_DWORD blocklen, FX_LPCBYTE key, FX_DWORD keylen, FX_BOOL bEncrypt);\nvoid CRYPT_AESSetIV(FX_LPVOID context, FX_LPCBYTE iv);\nvoid CRYPT_AESDecrypt(FX_LPVOID context, FX_LPBYTE dest, FX_LPCBYTE src, FX_DWORD size);\nvoid CRYPT_AESEncrypt(FX_LPVOID context, FX_LPBYTE dest, FX_LPCBYTE src, FX_DWORD size);\nvoid CRYPT_MD5Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[16]);\nvoid CRYPT_MD5Start(FX_LPVOID context);\nvoid CRYPT_MD5Update(FX_LPVOID context, FX_LPCBYTE data, FX_DWORD size);\nvoid CRYPT_MD5Finish(FX_LPVOID context, FX_BYTE digest[16]);\nvoid CRYPT_SHA1Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[20]);\nvoid CRYPT_SHA1Start(FX_LPVOID context);\nvoid CRYPT_SHA1Update(FX_LPVOID context, FX_LPCBYTE data, FX_DWORD size);\nvoid CRYPT_SHA1Finish(FX_LPVOID context, FX_BYTE digest[20]);\nvoid CRYPT_SHA256Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[32]);\nvoid CRYPT_SHA256Start(FX_LPVOID context);\nvoid CRYPT_SHA256Update(FX_LPVOID context, FX_LPCBYTE data, FX_DWORD size);\nvoid CRYPT_SHA256Finish(FX_LPVOID context, FX_BYTE digest[32]);\nvoid CRYPT_SHA384Start(FX_LPVOID context);\nvoid CRYPT_SHA384Update(FX_LPVOID context, FX_LPCBYTE data, FX_DWORD size);\nvoid CRYPT_SHA384Finish(FX_LPVOID context, FX_BYTE digest[48]);\nvoid CRYPT_SHA384Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[48]);\nvoid CRYPT_SHA512Start(FX_LPVOID context);\nvoid CRYPT_SHA512Update(FX_LPVOID context, FX_LPCBYTE data, FX_DWORD size);\nvoid CRYPT_SHA512Finish(FX_LPVOID context, FX_BYTE digest[64]);\nvoid CRYPT_SHA512Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[64]);\nvoid CRYPT_SetPubKeyDecryptor(FX_BOOL (*func)(FX_LPCBYTE pData, FX_DWORD size, FX_LPBYTE data_buf, FX_DWORD& data_len));\n#ifdef __cplusplus\n};\n#endif\n#endif\n"
  },
  {
    "path": "core/include/fpdfapi/fpdf_module.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDF_MODULE_\n#define _FPDF_MODULE_\n#ifndef _FXCRT_EXTENSION_\n#include \"../fxcrt/fx_ext.h\"\n#endif\nclass CPDF_ModuleMgr;\nclass CPDF_PageModuleDef;\nclass CPDF_RenderModuleDef;\nclass CPDF_SecurityHandler;\nclass CCodec_ModuleMgr;\nclass CPDF_Dictionary;\nclass ICodec_JpegModule;\nclass ICodec_JpxModule;\nclass ICodec_FaxModule;\nclass ICodec_Jbig2Module;\nclass ICodec_IccModule;\nclass ICodec_FlateModule;\n#define ADDIN_NAME_CJK\t\t\t\"Eastern Asian Language Support\"\n#define ADDIN_NAME_DECODER\t\t\"JPEG2000 and JBIG2 Image Decoders\"\nclass CPDF_ModuleMgr : public CFX_Object\n{\npublic:\n\n    static void\tCreate();\n\n    static CPDF_ModuleMgr*\tGet();\n\n    static void\tDestroy();\n\n\n\n    void\t\tSetCodecModule(CCodec_ModuleMgr* pModule)\n    {\n        m_pCodecModule = pModule;\n    }\n    CCodec_ModuleMgr*\t\tGetCodecModule()\n    {\n        return m_pCodecModule;\n    }\n\n    void\t\tInitPageModule();\n\n    void\t\tInitRenderModule();\n\n\n    void\t\tSetModulePath(FX_LPCSTR module_name, FX_LPCSTR path);\n\n    CFX_ByteString GetModuleFilePath(FX_LPCSTR module_name, FX_LPCSTR name);\n\n    void\t\tSetDownloadCallback(FX_BOOL (*callback)(FX_LPCSTR module_name));\n\n    FX_BOOL\t\tDownloadModule(FX_LPCSTR module_name);\n\n    void\t\tNotifyModuleAvailable(FX_LPCSTR module_name);\n\n\n\n    CPDF_RenderModuleDef*\tGetRenderModule() const\n    {\n        return m_pRenderModule;\n    }\n\n    CPDF_PageModuleDef*\t\tGetPageModule() const\n    {\n        return m_pPageModule;\n    }\n\n\n\n\n    void\t\t\t\t\tLoadEmbeddedGB1CMaps();\n\n    void\t\t\t\t\tLoadEmbeddedCNS1CMaps();\n\n    void\t\t\t\t\tLoadEmbeddedJapan1CMaps();\n\n    void\t\t\t\t\tLoadEmbeddedKorea1CMaps();\n\n    ICodec_FaxModule*\t\tGetFaxModule();\n    ICodec_JpegModule*\t\tGetJpegModule();\n    ICodec_JpxModule*\t\tGetJpxModule();\n    ICodec_Jbig2Module*\t\tGetJbig2Module();\n    ICodec_IccModule*\t\tGetIccModule();\n    ICodec_FlateModule*\t\tGetFlateModule();\n\n    void\t\t\t\t\tRegisterSecurityHandler(FX_LPCSTR name, CPDF_SecurityHandler * (*CreateHandler)(void* param), void* param);\n\n    CPDF_SecurityHandler*\tCreateSecurityHandler(FX_LPCSTR name);\n\n    void\t\t\t\t\tSetPrivateData(FX_LPVOID module_id, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback);\n\n    FX_LPVOID\t\t\t\tGetPrivateData(FX_LPVOID module_id);\n\n    int\t\t\t\t\t\tm_FileBufSize;\nprotected:\n\n    CPDF_ModuleMgr();\n\n    ~CPDF_ModuleMgr();\n    void\t\t\t\t\tInitialize();\n\n    void\t\t\t\t\tInitModules();\n\n\n\n    CCodec_ModuleMgr*\t\tm_pCodecModule;\n\n    CPDF_RenderModuleDef*\tm_pRenderModule;\n\n    CPDF_PageModuleDef*\t\tm_pPageModule;\n\n\n    FX_BOOL (*m_pDownloadCallback)(FX_LPCSTR module_name);\n\n    CFX_ByteString\t\t\tm_DefaultModulePath;\n\n    CFX_CMapByteStringToPtr\tm_ModulePathList;\n\n    CFX_MapByteStringToPtr\tm_SecurityHandlerMap;\n\n    CFX_PrivateData\t\t\tm_privateData;\n};\nclass CPDF_Document;\nclass CPDF_DocPageData;\nclass CPDF_FontGlobals;\nclass IPDF_FontMgr;\nclass IPDF_FontMapper;\nclass CPDF_ColorSpace;\nclass CPDF_PageModuleDef : public CFX_Object\n{\npublic:\n    virtual ~CPDF_PageModuleDef() {}\n\n    virtual CPDF_DocPageData*\tCreateDocData(CPDF_Document* pDoc)\n    {\n        return NULL;\n    }\n\n    virtual void\t\t\t\tReleaseDoc(CPDF_Document*) {}\n    virtual void\t\t\t\tClearDoc(CPDF_Document*) {}\n\n    virtual CPDF_FontGlobals*\tGetFontGlobals()\n    {\n        return NULL;\n    }\n\n    virtual void\t\t\t\tClearStockFont(CPDF_Document* pDoc) {}\n\n    virtual void\t\t\t\tNotifyCJKAvailable() {}\n\n    virtual CPDF_ColorSpace*\tGetStockCS(int family)\n    {\n        return NULL;\n    }\n};\nclass CPDF_PageObjects;\nclass CFX_AffineMatrix;\nclass CPDF_RenderOptions;\nclass CPDF_Page;\nclass CPDF_DocRenderData;\nclass CPDF_PageRenderCache;\nclass CFX_BitmapDevice;\nclass CPDF_Stream;\nclass CFX_DIBSource;\nclass CPDF_RenderConfig;\nclass CPDF_Image;\nclass CPDF_RenderModuleDef : public CFX_Object\n{\npublic:\n    virtual ~CPDF_RenderModuleDef() {}\n\n    virtual CPDF_DocRenderData*\tCreateDocData(CPDF_Document* pDoc)\n    {\n        return NULL;\n    }\n\n    virtual void\tDestroyDocData(CPDF_DocRenderData*) {}\n    virtual void\tClearDocData(CPDF_DocRenderData*) {}\n\n    virtual CPDF_DocRenderData* GetRenderData()\n    {\n        return NULL;\n    }\n\n    virtual CPDF_PageRenderCache*\tCreatePageCache(CPDF_Page* pPage)\n    {\n        return NULL;\n    }\n\n    virtual void\tDestroyPageCache(CPDF_PageRenderCache*) {}\n\n    virtual void\tNotifyDecoderAvailable() {}\n\n    virtual CPDF_RenderConfig* GetConfig()\n    {\n        return NULL;\n    }\n};\n#endif\n"
  },
  {
    "path": "core/include/fpdfapi/fpdf_objects.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDF_OBJECTS_\n#define _FPDF_OBJECTS_\n#ifndef _FXCRT_EXTENSION_\n#include \"../fxcrt/fx_ext.h\"\n#endif\nclass CPDF_Document;\nclass CPDF_IndirectObjects;\nclass CPDF_Null;\nclass CPDF_Boolean;\nclass CPDF_Number;\nclass CPDF_String;\nclass CPDF_Stream;\nclass CPDF_StreamAcc;\nclass CPDF_StreamFilter;\nclass CPDF_Array;\nclass CPDF_Dictionary;\nclass CPDF_Reference;\nclass IPDF_DocParser;\nclass IFX_FileRead;\nclass CPDF_CryptoHandler;\n#define PDFOBJ_INVALID\t\t0\n#define\tPDFOBJ_BOOLEAN\t\t1\n#define PDFOBJ_NUMBER\t\t2\n#define PDFOBJ_STRING\t\t3\n#define PDFOBJ_NAME\t\t\t4\n#define PDFOBJ_ARRAY\t\t5\n#define PDFOBJ_DICTIONARY\t6\n#define PDFOBJ_STREAM\t\t7\n#define PDFOBJ_NULL\t\t\t8\n#define PDFOBJ_REFERENCE\t9\ntypedef IFX_FileStream* (*FPDF_LPFCloneStreamCallback)(CPDF_Stream *pStream, FX_LPVOID pUserData);\nclass CPDF_Object : public CFX_Object\n{\npublic:\n\n    int\t\t\t\t\t\tGetType() const\n    {\n        return m_Type;\n    }\n\n    FX_DWORD\t\t\t\tGetObjNum() const\n    {\n        return m_ObjNum;\n    }\n\n    FX_DWORD                            GetGenNum() const\n    {\n        return m_GenNum;\n    }\n\n    FX_BOOL\t\t\t\t\tIsIdentical(CPDF_Object* pObj) const;\n\n    CPDF_Object*\t\t\tClone(FX_BOOL bDirect = FALSE) const;\n\n    CPDF_Object*\t\t\tCloneRef(CPDF_IndirectObjects* pObjs) const;\n\n    CPDF_Object*\t\t\tGetDirect() const;\n\n    void\t\t\t\t\tRelease();\n\n    CFX_ByteString\t\t\tGetString() const;\n\n    CFX_ByteStringC\t\t\tGetConstString() const;\n\n    CFX_WideString\t\t\tGetUnicodeText(CFX_CharMap* pCharMap = NULL) const;\n\n    FX_FLOAT\t\t\t\tGetNumber() const;\n\n    FX_FLOAT\t\t\t\tGetNumber16() const;\n\n    int\t\t\t\t\t\tGetInteger() const;\n\n    CPDF_Dictionary*\t\tGetDict() const;\n\n    CPDF_Array*\t\t\t\tGetArray() const;\n\n    void\t\t\t\t\tSetString(const CFX_ByteString& str);\n\n    void\t\t\t\t\tSetUnicodeText(FX_LPCWSTR pUnicodes, int len = -1);\n\n    int\t\t\t\t\t\tGetDirectType() const;\n\n    FX_BOOL\t\t\t\t\tIsModified() const\n    {\n        return FALSE;\n    }\nprotected:\n    FX_DWORD\t\t\t\tm_Type;\n    CPDF_Object()\n    {\n        m_ObjNum = 0;\n        m_GenNum = 0;\n    }\n\n    FX_DWORD \t\t\t\tm_ObjNum;\n    FX_DWORD\t\t\t\tm_GenNum;\n\n    void\t\t\t\t\tDestroy();\n\n\n    ~CPDF_Object() {}\n    friend class\t\t\tCPDF_IndirectObjects;\n    friend class\t\t\tCPDF_Parser;\n    friend class\t\t\tCPDF_SyntaxParser;\nprivate:\n    CPDF_Object(const CPDF_Object& src) {}\n    CPDF_Object* CloneInternal(FX_BOOL bDirect, CFX_MapPtrToPtr* visited) const;\n};\nclass CPDF_Boolean : public CPDF_Object\n{\npublic:\n\n    static CPDF_Boolean*\tCreate(FX_BOOL value)\n    {\n        return FX_NEW CPDF_Boolean(value);\n    }\n\n    CPDF_Boolean()\n    {\n        m_Type = PDFOBJ_BOOLEAN;\n    }\n\n    CPDF_Boolean(FX_BOOL value)\n    {\n        m_Type = PDFOBJ_BOOLEAN;\n        m_bValue = value;\n    }\n\n    FX_BOOL\t\t\t\t\tIdentical(CPDF_Boolean* pOther) const\n    {\n        return m_bValue == pOther->m_bValue;\n    }\nprotected:\n\n    FX_BOOL\t\t\t\t\tm_bValue;\n    friend class\t\t\tCPDF_Object;\n};\nclass CPDF_Number : public CPDF_Object\n{\npublic:\n\n    static CPDF_Number*\t\tCreate(int value)\n    {\n        return FX_NEW CPDF_Number(value);\n    }\n\n    static CPDF_Number*\t\tCreate(FX_FLOAT value)\n    {\n        return FX_NEW CPDF_Number(value);\n    }\n\n    static CPDF_Number*\t\tCreate(FX_BSTR str)\n    {\n        return FX_NEW CPDF_Number(str);\n    }\n\n    static CPDF_Number*\t\tCreate(FX_BOOL bInteger, void* pData)\n    {\n        return FX_NEW CPDF_Number(bInteger, pData);\n    }\n\n    CPDF_Number()\n    {\n        m_Type = PDFOBJ_NUMBER;\n    }\n\n    CPDF_Number(FX_BOOL bInteger, void* pData);\n\n    CPDF_Number(int value);\n\n    CPDF_Number(FX_FLOAT value);\n\n    CPDF_Number(FX_BSTR str);\n\n    FX_BOOL\t\t\t\t\tIdentical(CPDF_Number* pOther) const;\n\n    CFX_ByteString\t\t\tGetString() const;\n\n    void\t\t\t\t\tSetString(FX_BSTR str);\n\n    FX_BOOL\t\t\t\t\tIsInteger() const\n    {\n        return m_bInteger;\n    }\n\n    int\t\t\t\t\t\tGetInteger() const\n    {\n        return m_bInteger ? m_Integer : (int)m_Float;\n    }\n\n    FX_FLOAT\t\t\t\tGetNumber() const\n    {\n        return m_bInteger ? (FX_FLOAT)m_Integer : m_Float;\n    }\n\n    void\t\t\t\t\tSetNumber(FX_FLOAT value);\n\n    FX_FLOAT\t\t\tGetNumber16() const\n    {\n        return GetNumber();\n    }\n\n    FX_FLOAT\t\t\t\tGetFloat() const\n    {\n        return m_bInteger ? (FX_FLOAT)m_Integer : m_Float;\n    }\nprotected:\n\n    FX_BOOL\t\t\t\t\tm_bInteger;\n\n    union {\n\n        int\t\t\t\t\tm_Integer;\n\n        FX_FLOAT\t\t\tm_Float;\n    };\n    friend class\t\t\tCPDF_Object;\n};\nclass CPDF_String : public CPDF_Object\n{\npublic:\n\n    static CPDF_String*\t\tCreate(const CFX_ByteString& str, FX_BOOL bHex = FALSE)\n    {\n        return FX_NEW CPDF_String(str, bHex);\n    }\n\n    static CPDF_String*\t\tCreate(const CFX_WideString& str)\n    {\n        return FX_NEW CPDF_String(str);\n    }\n\n    CPDF_String()\n    {\n        m_Type = PDFOBJ_STRING;\n        m_bHex = FALSE;\n    }\n\n    CPDF_String(const CFX_ByteString& str, FX_BOOL bHex = FALSE) : m_String(str)\n    {\n        m_Type = PDFOBJ_STRING;\n        m_bHex = bHex;\n    }\n\n    CPDF_String(const CFX_WideString& str);\n\n    CFX_ByteString&\t\t\tGetString()\n    {\n        return m_String;\n    }\n\n    FX_BOOL\t\t\t\t\tIdentical(CPDF_String* pOther) const\n    {\n        return m_String == pOther->m_String;\n    }\n\n    FX_BOOL\t\t\t\t\tIsHex() const\n    {\n        return m_bHex;\n    }\nprotected:\n\n    CFX_ByteString\t\t\tm_String;\n\n    FX_BOOL\t\t\t\t\tm_bHex;\n    friend class\t\t\tCPDF_Object;\n};\nclass CPDF_Name : public CPDF_Object\n{\npublic:\n\n    static CPDF_Name*\t\tCreate(const CFX_ByteString& str)\n    {\n        return FX_NEW CPDF_Name(str);\n    }\n\n    static CPDF_Name*\t\tCreate(FX_BSTR str)\n    {\n        return FX_NEW CPDF_Name(str);\n    }\n\n    static CPDF_Name*\t\tCreate(FX_LPCSTR str)\n    {\n        return FX_NEW CPDF_Name(str);\n    }\n\n    CPDF_Name(const CFX_ByteString& str) : m_Name(str)\n    {\n        m_Type = PDFOBJ_NAME;\n    }\n\n    CPDF_Name(FX_BSTR str) : m_Name(str)\n    {\n        m_Type = PDFOBJ_NAME;\n    }\n\n    CPDF_Name(FX_LPCSTR str) : m_Name(str)\n    {\n        m_Type = PDFOBJ_NAME;\n    }\n\n    CFX_ByteString&\t\t\tGetString()\n    {\n        return m_Name;\n    }\n\n    FX_BOOL\t\t\t\t\tIdentical(CPDF_Name* pOther) const\n    {\n        return m_Name == pOther->m_Name;\n    }\nprotected:\n\n    CFX_ByteString\t\t\tm_Name;\n    friend class\t\t\tCPDF_Object;\n};\nclass CPDF_Array : public CPDF_Object\n{\npublic:\n\n    static CPDF_Array*\t\tCreate()\n    {\n        return FX_NEW CPDF_Array();\n    }\n\n    CPDF_Array()\n    {\n        m_Type = PDFOBJ_ARRAY;\n    }\n\n    FX_DWORD\t\t\t\tGetCount() const\n    {\n        return m_Objects.GetSize();\n    }\n\n    CPDF_Object*\t\t\tGetElement(FX_DWORD index) const;\n\n    CPDF_Object*\t\t\tGetElementValue(FX_DWORD index) const;\n\n\n\n    CFX_AffineMatrix\t\tGetMatrix();\n\n    CFX_FloatRect\t\t\tGetRect();\n\n\n\n\n    CFX_ByteString\t\t\tGetString(FX_DWORD index) const;\n\n    CFX_ByteStringC\t\t\tGetConstString(FX_DWORD index) const;\n\n    int\t\t\t\t\t\tGetInteger(FX_DWORD index) const;\n\n    FX_FLOAT\t\t\t\tGetNumber(FX_DWORD index) const;\n\n    CPDF_Dictionary*\t\tGetDict(FX_DWORD index) const;\n\n    CPDF_Stream*\t\t\tGetStream(FX_DWORD index) const;\n\n    CPDF_Array*\t\t\t\tGetArray(FX_DWORD index) const;\n\n    FX_FLOAT\t\t\t\tGetFloat(FX_DWORD index) const\n    {\n        return GetNumber(index);\n    }\n\n\n\n\n    void\t\t\t\t\tSetAt(FX_DWORD index, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs = NULL);\n\n\n    void\t\t\t\t\tInsertAt(FX_DWORD index, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs = NULL);\n\n    void\t\t\t\t\tRemoveAt(FX_DWORD index);\n\n\n    void\t\t\t\t\tAdd(CPDF_Object* pObj, CPDF_IndirectObjects* pObjs = NULL);\n\n\n\n    void\t\t\t\t\tAddNumber(FX_FLOAT f);\n\n    void\t\t\t\t\tAddInteger(int i);\n\n    void\t\t\t\t\tAddString(const CFX_ByteString& str);\n\n    void\t\t\t\t\tAddName(const CFX_ByteString& str);\n\n    void\t\t\t\t\tAddReference(CPDF_IndirectObjects* pDoc, FX_DWORD objnum);\n\n    void\t\t\t\t\tAddReference(CPDF_IndirectObjects* pDoc, CPDF_Object* obj)\n    {\n        AddReference(pDoc, obj->GetObjNum());\n    }\n\n\n    FX_FLOAT\t\t\tGetNumber16(FX_DWORD index) const\n    {\n        return GetNumber(index);\n    }\n\n    void\t\t\t\t\tAddNumber16(FX_FLOAT value)\n    {\n        AddNumber(value);\n    }\n\n    FX_BOOL\t\t\t\t\tIdentical(CPDF_Array* pOther) const;\nprotected:\n\n    ~CPDF_Array();\n\n    CFX_PtrArray\t\t\tm_Objects;\n    friend class\t\t\tCPDF_Object;\n};\nclass CPDF_Dictionary : public CPDF_Object\n{\npublic:\n\n    static CPDF_Dictionary*\tCreate()\n    {\n        return FX_NEW CPDF_Dictionary();\n    }\n\n    CPDF_Dictionary()\n    {\n        m_Type = PDFOBJ_DICTIONARY;\n    }\n\n\n\n    CPDF_Object*\t\t\tGetElement(FX_BSTR key) const;\n\n    CPDF_Object*\t\t\tGetElementValue(FX_BSTR key) const;\n\n\n\n\n\n    CFX_ByteString\t\t\tGetString(FX_BSTR key) const;\n\n    CFX_ByteStringC\t\t\tGetConstString(FX_BSTR key) const;\n\n    CFX_ByteString\t\t\tGetString(FX_BSTR key, FX_BSTR default_str) const;\n\n    CFX_ByteStringC\t\t\tGetConstString(FX_BSTR key, FX_BSTR default_str) const;\n\n    CFX_WideString\t\t\tGetUnicodeText(FX_BSTR key, CFX_CharMap* pCharMap = NULL) const;\n\n    int\t\t\t\t\t\tGetInteger(FX_BSTR key) const;\n\n    int\t\t\t\t\t\tGetInteger(FX_BSTR key, int default_int) const;\n\n    FX_BOOL\t\t\t\t\tGetBoolean(FX_BSTR key, FX_BOOL bDefault = FALSE) const;\n\n    FX_FLOAT\t\t\t\tGetNumber(FX_BSTR key) const;\n\n    CPDF_Dictionary*\t\tGetDict(FX_BSTR key) const;\n\n    CPDF_Stream*\t\t\tGetStream(FX_BSTR key) const;\n\n    CPDF_Array*\t\t\t\tGetArray(FX_BSTR key) const;\n\n    CFX_FloatRect\t\t\tGetRect(FX_BSTR key) const;\n\n    CFX_AffineMatrix\t\tGetMatrix(FX_BSTR key) const;\n\n    FX_FLOAT\t\t\t\tGetFloat(FX_BSTR key) const\n    {\n        return GetNumber(key);\n    }\n\n\n    FX_BOOL\t\t\t\t\tKeyExist(FX_BSTR key) const;\n\n    FX_POSITION\t\t\t\tGetStartPos() const;\n\n    CPDF_Object*\t\t\tGetNextElement(FX_POSITION& pos, CFX_ByteString& key) const;\n\n    void\t\t\t\t\tSetAt(FX_BSTR key, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs = NULL);\n\n\n\n    void\t\t\t\t\tSetAtName(FX_BSTR key, const CFX_ByteString& name);\n\n\n    void\t\t\t\t\tSetAtString(FX_BSTR key, const CFX_ByteString& string);\n\n\n    void\t\t\t\t\tSetAtInteger(FX_BSTR key, int i);\n\n\n    void\t\t\t\t\tSetAtNumber(FX_BSTR key, FX_FLOAT f);\n\n    void\t\t\t\t\tSetAtReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, FX_DWORD objnum);\n\n    void\t\t\t\t\tSetAtReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, CPDF_Object* obj)\n    {\n        SetAtReference(key, pDoc, obj->GetObjNum());\n    }\n\n    void\t\t\t\t\tAddReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, FX_DWORD objnum);\n\n    void\t\t\t\t\tAddReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, CPDF_Object* obj)\n    {\n        AddReference(key, pDoc, obj->GetObjNum());\n    }\n\n    void\t\t\t\t\tSetAtRect(FX_BSTR key, const CFX_FloatRect& rect);\n\n    void\t\t\t\t\tSetAtMatrix(FX_BSTR key, const CFX_AffineMatrix& matrix);\n\n    void\t\t\t\t\tSetAtBoolean(FX_BSTR key, FX_BOOL bValue);\n\n\n\n    void\t\t\t\t\tRemoveAt(FX_BSTR key);\n\n\n    void\t\t\t\t\tReplaceKey(FX_BSTR oldkey, FX_BSTR newkey);\n\n    FX_BOOL\t\t\t\t\tIdentical(CPDF_Dictionary* pDict) const;\n\n    int\t\t\t\t\t\tGetCount() const\n    {\n        return m_Map.GetCount();\n    }\n\n    void\t\t\t\t\tAddValue(FX_BSTR key, CPDF_Object* pObj);\nprotected:\n\n    ~CPDF_Dictionary();\n\n    CFX_CMapByteStringToPtr\tm_Map;\n\n    friend class\t\t\tCPDF_Object;\n};\nclass CPDF_Stream : public CPDF_Object\n{\npublic:\n\n    static CPDF_Stream*\t\tCreate(FX_LPBYTE pData, FX_DWORD size, CPDF_Dictionary* pDict)\n    {\n        return FX_NEW CPDF_Stream(pData, size, pDict);\n    }\n\n    CPDF_Stream(FX_LPBYTE pData, FX_DWORD size, CPDF_Dictionary* pDict);\n\n    CPDF_Dictionary*\t\tGetDict() const\n    {\n        return m_pDict;\n    }\n\n    void\t\t\t\t\tSetData(FX_LPCBYTE pData, FX_DWORD size, FX_BOOL bCompressed, FX_BOOL bKeepBuf);\n\n    void\t\t\t\t\tInitStream(FX_BYTE* pData, FX_DWORD size, CPDF_Dictionary* pDict);\n\n    void\t\t\t\t\tInitStream(IFX_FileRead *pFile, CPDF_Dictionary* pDict);\n\n    FX_BOOL\t\t\t\t\tIdentical(CPDF_Stream* pOther) const;\n\n    CPDF_StreamFilter*\t\tGetStreamFilter(FX_BOOL bRaw = FALSE) const;\n\n\n\n    FX_DWORD\t\t\t\tGetRawSize() const\n    {\n        return m_dwSize;\n    }\n\n    FX_BOOL\t\t\t\t\tReadRawData(FX_FILESIZE start_pos, FX_LPBYTE pBuf, FX_DWORD buf_size) const;\n\n\n    FX_BOOL\t\t\t\t\tIsMemoryBased() const\n    {\n        return m_GenNum == (FX_DWORD) - 1;\n    }\n\n    CPDF_Stream*\t\t\tClone(FX_BOOL bDirect, FPDF_LPFCloneStreamCallback lpfCallback, FX_LPVOID pUserData) const;\nprotected:\n\n    ~CPDF_Stream();\n\n    CPDF_Dictionary*\t\tm_pDict;\n\n    FX_DWORD\t\t\t\tm_dwSize;\n\n    FX_DWORD\t\t\t\tm_GenNum;\n\n    union {\n\n        FX_LPBYTE\t\t\tm_pDataBuf;\n\n        IFX_FileRead*\t\tm_pFile;\n    };\n\n    FX_FILESIZE\t\t\t\tm_FileOffset;\n\n    CPDF_CryptoHandler*\t\tm_pCryptoHandler;\n\n    void\t\t\t\t\tInitStream(CPDF_Dictionary* pDict);\n    friend class\t\t\tCPDF_Object;\n    friend class\t\t\tCPDF_StreamAcc;\n    friend class\t\t\tCPDF_AttachmentAcc;\n};\nclass CPDF_StreamAcc : public CFX_Object\n{\npublic:\n\n    CPDF_StreamAcc();\n\n    ~CPDF_StreamAcc();\n\n    void\t\t\t\t\tLoadAllData(const CPDF_Stream* pStream, FX_BOOL bRawAccess = FALSE,\n                                        FX_DWORD estimated_size = 0, FX_BOOL bImageAcc = FALSE);\n\n    const CPDF_Stream*\t\tGetStream() const\n    {\n        return m_pStream;\n    }\n\n    CPDF_Dictionary*\t\tGetDict() const\n    {\n        return m_pStream? m_pStream->GetDict() : NULL;\n    }\n\n    FX_LPCBYTE\t\t\t\tGetData() const;\n\n    FX_DWORD\t\t\t\tGetSize() const;\n\n    FX_LPBYTE\t\t\t\tDetachData();\n\n    const CFX_ByteString&\tGetImageDecoder()\n    {\n        return m_ImageDecoder;\n    }\n\n    const CPDF_Dictionary*\tGetImageParam()\n    {\n        return m_pImageParam;\n    }\nprotected:\n\n    FX_LPBYTE\t\t\t\tm_pData;\n\n    FX_DWORD\t\t\t\tm_dwSize;\n\n    FX_BOOL\t\t\t\t\tm_bNewBuf;\n\n    CFX_ByteString\t\t\tm_ImageDecoder;\n\n    CPDF_Dictionary*\t\tm_pImageParam;\n\n    const CPDF_Stream*\t\tm_pStream;\n\n    FX_LPBYTE\t\t\t\tm_pSrcData;\n};\nCFX_DataFilter* FPDF_CreateFilter(FX_BSTR name, const CPDF_Dictionary* pParam, int width = 0, int height = 0);\n#define FPDF_FILTER_BUFFER_SIZE\t\t20480\nclass CPDF_StreamFilter : public CFX_Object\n{\npublic:\n\n    ~CPDF_StreamFilter();\n\n    FX_DWORD\t\t\tReadBlock(FX_LPBYTE buffer, FX_DWORD size);\n\n    FX_DWORD\t\t\tGetSrcPos()\n    {\n        return m_SrcOffset;\n    }\n\n    const CPDF_Stream*\tGetStream()\n    {\n        return m_pStream;\n    }\nprotected:\n\n    CPDF_StreamFilter() {}\n\n    FX_DWORD\t\t\tReadLeftOver(FX_LPBYTE buffer, FX_DWORD buf_size);\n\n    const CPDF_Stream*\tm_pStream;\n\n    CFX_DataFilter*\t\tm_pFilter;\n\n    CFX_BinaryBuf*\t\tm_pBuffer;\n\n    FX_DWORD\t\t\tm_BufOffset;\n\n    FX_DWORD\t\t\tm_SrcOffset;\n\n    FX_BYTE\t\t\t\tm_SrcBuffer[FPDF_FILTER_BUFFER_SIZE];\n    friend class CPDF_Stream;\n};\nclass CPDF_Null : public CPDF_Object\n{\npublic:\n\n    static CPDF_Null*\t\tCreate()\n    {\n        return FX_NEW CPDF_Null();\n    }\n\n    CPDF_Null()\n    {\n        m_Type = PDFOBJ_NULL;\n    }\n};\nclass CPDF_Reference : public CPDF_Object\n{\npublic:\n\n    static CPDF_Reference*\tCreate(CPDF_IndirectObjects* pDoc, int objnum)\n    {\n        return FX_NEW CPDF_Reference(pDoc, objnum);\n    }\n\n    CPDF_Reference(CPDF_IndirectObjects* pDoc, int objnum)\n    {\n        m_Type = PDFOBJ_REFERENCE;\n        m_pObjList = pDoc;\n        m_RefObjNum = objnum;\n    }\n\n    CPDF_IndirectObjects*\tGetObjList() const\n    {\n        return m_pObjList;\n    }\n\n    FX_DWORD\t\t\t\tGetRefObjNum() const\n    {\n        return m_RefObjNum;\n    }\n\n    void\t\t\t\t\tSetRef(CPDF_IndirectObjects* pDoc, FX_DWORD objnum);\n\n    FX_BOOL\t\t\t\t\tIdentical(CPDF_Reference* pOther) const\n    {\n        return m_RefObjNum == pOther->m_RefObjNum;\n    }\nprotected:\n\n    CPDF_IndirectObjects*\tm_pObjList;\n\n    FX_DWORD\t\t\t\tm_RefObjNum;\n    friend class\t\t\tCPDF_Object;\n};\nclass CPDF_IndirectObjects : public CFX_Object\n{\npublic:\n\n    CPDF_IndirectObjects(IPDF_DocParser* pParser);\n\n    ~CPDF_IndirectObjects();\n\n    CPDF_Object*\t\t\tGetIndirectObject(FX_DWORD objnum, struct PARSE_CONTEXT* pContext = NULL);\n\n    int\t\t\t\t\t\tGetIndirectType(FX_DWORD objnum);\n\n    FX_DWORD\t\t\t\tAddIndirectObject(CPDF_Object* pObj);\n\n    void\t\t\t\t\tReleaseIndirectObject(FX_DWORD objnum);\n\n    void\t\t\t\t\tInsertIndirectObject(FX_DWORD objnum, CPDF_Object* pObj);\n\n    FX_DWORD\t\t\t\tGetLastObjNum() const;\n\n    FX_POSITION\t\t\t\tGetStartPosition() const\n    {\n        return m_IndirectObjs.GetStartPosition();\n    }\n\n    void\t\t\t\t\tGetNextAssoc(FX_POSITION& rPos, FX_DWORD& objnum, CPDF_Object*& pObject) const\n    {\n        m_IndirectObjs.GetNextAssoc(rPos, (void*&)objnum, (void*&)pObject);\n    }\nprotected:\n\n    CFX_MapPtrToPtr\t\t\tm_IndirectObjs;\n\n    IPDF_DocParser*\t\t\tm_pParser;\n\n    FX_DWORD\t\t\t\tm_LastObjNum;\n};\n#endif\n"
  },
  {
    "path": "core/include/fpdfapi/fpdf_page.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDF_PAGE_\n#define _FPDF_PAGE_\n#ifndef _FPDF_PARSER_\n#include \"fpdf_parser.h\"\n#endif\n#ifndef _FPDF_RESOURCE_\n#include \"fpdf_resource.h\"\n#endif\n#ifndef _FX_DIB_H_\n#include \"../fxge/fx_dib.h\"\n#endif\nclass CPDF_PageObjects;\nclass CPDF_Page;\nclass CPDF_Form;\nclass CPDF_ParseOptions;\nclass CPDF_PageObject;\nclass CPDF_PageRenderCache;\nclass CPDF_StreamFilter;\nclass CPDF_AllStates;\nclass CPDF_ContentParser;\nclass CPDF_StreamContentParser;\nclass CPDF_ResourceNaming;\n#define PDFTRANS_GROUP\t\t\t0x0100\n#define PDFTRANS_ISOLATED\t\t0x0200\n#define PDFTRANS_KNOCKOUT\t\t0x0400\n#define PDF_CONTENT_NOT_PARSED\t0\n#define PDF_CONTENT_PARSING\t\t1\n#define PDF_CONTENT_PARSED\t\t2\nclass CPDF_PageObjects : public CFX_Object\n{\npublic:\n\n    CPDF_PageObjects(FX_BOOL bReleaseMembers = TRUE);\n\n    ~CPDF_PageObjects();\n\n\n\n\n    void\t\t\t\tContinueParse(IFX_Pause* pPause);\n\n    int\t\t\t\t\tGetParseState() const\n    {\n        return m_ParseState;\n    }\n\n    FX_BOOL\t\t\t\tIsParsed() const\n    {\n        return m_ParseState == PDF_CONTENT_PARSED;\n    }\n\n    int\t\t\t\t\tEstimateParseProgress() const;\n\n\n\n\n    FX_POSITION\t\t\tGetFirstObjectPosition() const\n    {\n        return m_ObjectList.GetHeadPosition();\n    }\n\n    FX_POSITION\t\t\tGetLastObjectPosition() const\n    {\n        return m_ObjectList.GetTailPosition();\n    }\n\n    CPDF_PageObject*\tGetNextObject(FX_POSITION& pos) const\n    {\n        return (CPDF_PageObject*)m_ObjectList.GetNext(pos);\n    }\n\n    CPDF_PageObject*\tGetPrevObject(FX_POSITION& pos) const\n    {\n        return (CPDF_PageObject*)m_ObjectList.GetPrev(pos);\n    }\n\n    CPDF_PageObject*\tGetObjectAt(FX_POSITION pos) const\n    {\n        return (CPDF_PageObject*)m_ObjectList.GetAt(pos);\n    }\n\n    FX_DWORD\t\t\tCountObjects() const\n    {\n        return m_ObjectList.GetCount();\n    }\n\n    int\t\t\t\t\tGetObjectIndex(CPDF_PageObject* pObj) const;\n\n    CPDF_PageObject*\tGetObjectByIndex(int index) const;\n\n\n\n\n\n    FX_POSITION\t\t\tInsertObject(FX_POSITION posInsertAfter, CPDF_PageObject* pNewObject);\n\n    void\t\t\t\tTransform(const CFX_AffineMatrix& matrix);\n\n    FX_BOOL\t\t\t\tBackgroundAlphaNeeded() const\n    {\n        return m_bBackgroundAlphaNeeded;\n    }\n\n    CFX_FloatRect\t\tCalcBoundingBox() const;\n\n    CPDF_Dictionary*\tm_pFormDict;\n\n    CPDF_Stream*\t\tm_pFormStream;\n\n    CPDF_Document*\t\tm_pDocument;\n\n    CPDF_Dictionary*\tm_pPageResources;\n\n    CPDF_Dictionary*\tm_pResources;\n\n    CFX_FloatRect\t\tm_BBox;\n\n    int\t\t\t\t\tm_Transparency;\n\nprotected:\n    friend class\t\tCPDF_ContentParser;\n    friend class\t\tCPDF_StreamContentParser;\n    friend class\t\tCPDF_AllStates;\n\n    CFX_PtrList\t\t\tm_ObjectList;\n\n    FX_BOOL\t\t\t\tm_bBackgroundAlphaNeeded;\n\n    FX_BOOL\t\t\t\tm_bReleaseMembers;\n    void\t\t\t\tLoadTransInfo();\n    void                ClearCacheObjects();\n\n    CPDF_ContentParser*\tm_pParser;\n\n    FX_BOOL\t\t\t\tm_ParseState;\n};\nclass CPDF_Page : public CPDF_PageObjects, public CFX_PrivateData\n{\npublic:\n\n    CPDF_Page();\n\n    ~CPDF_Page();\n\n    void\t\t\t\tLoad(CPDF_Document* pDocument, CPDF_Dictionary* pPageDict, FX_BOOL bPageCache = TRUE);\n\n    void\t\t\t\tStartParse(CPDF_ParseOptions* pOptions = NULL, FX_BOOL bReParse = FALSE);\n\n    void\t\t\t\tParseContent(CPDF_ParseOptions* pOptions = NULL, FX_BOOL bReParse = FALSE);\n\n    void\t\t\t\tGetDisplayMatrix(CFX_AffineMatrix& matrix, int xPos, int yPos,\n                                         int xSize, int ySize, int iRotate) const;\n\n    FX_FLOAT\t\t\tGetPageWidth() const\n    {\n        return m_PageWidth;\n    }\n\n    FX_FLOAT\t\t\tGetPageHeight() const\n    {\n        return m_PageHeight;\n    }\n\n    CFX_FloatRect\t\tGetPageBBox() const\n    {\n        return m_BBox;\n    }\n\n    const CFX_AffineMatrix&\tGetPageMatrix() const\n    {\n        return m_PageMatrix;\n    }\n\n    CPDF_Object*\t\tGetPageAttr(FX_BSTR name) const;\n\n\n\n    CPDF_PageRenderCache*\tGetRenderCache() const\n    {\n        return m_pPageRender;\n    }\n\n    void\t\t\t\tClearRenderCache();\n\nprotected:\n    friend class\t\tCPDF_ContentParser;\n\n    FX_FLOAT\t\t\tm_PageWidth;\n\n    FX_FLOAT\t\t\tm_PageHeight;\n\n    CFX_AffineMatrix\tm_PageMatrix;\n\n    CPDF_PageRenderCache*\tm_pPageRender;\n};\nclass CPDF_ParseOptions : public CFX_Object\n{\npublic:\n\n    CPDF_ParseOptions();\n\n    FX_BOOL\t\t\t\tm_bTextOnly;\n\n    FX_BOOL\t\t\t\tm_bMarkedContent;\n\n    FX_BOOL\t\t\t\tm_bSeparateForm;\n\n    FX_BOOL\t\t\t\tm_bDecodeInlineImage;\n};\nclass CPDF_Form : public CPDF_PageObjects\n{\npublic:\n\n    CPDF_Form(CPDF_Document* pDocument, CPDF_Dictionary* pPageResources, CPDF_Stream* pFormStream, CPDF_Dictionary* pParentResources = NULL);\n\n    ~CPDF_Form();\n\n    void\t\t\t\tStartParse(CPDF_AllStates* pGraphicStates,  CFX_AffineMatrix* pParentMatrix,\n                                   CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level = 0);\n\n    void\t\t\t\tParseContent(CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,\n                                     CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level = 0);\n\n    CPDF_Form*\t\t\tClone() const;\n};\nclass CPDF_PageContentGenerate : public CFX_Object\n{\npublic:\n    CPDF_PageContentGenerate(CPDF_Page* pPage);\n    ~CPDF_PageContentGenerate();\n    FX_BOOL InsertPageObject(CPDF_PageObject* pPageObject);\n    void GenerateContent();\n    void TransformContent(CFX_Matrix& matrix);\nprotected:\n    void            ProcessImage(CFX_ByteTextBuf& buf, CPDF_ImageObject* pImageObj);\n    void            ProcessForm(CFX_ByteTextBuf& buf, FX_LPCBYTE data, FX_DWORD size, CFX_Matrix& matrix);\n    CFX_ByteString  RealizeResource(CPDF_Object* pResourceObj, const FX_CHAR* szType);\nprivate:\n    CPDF_Page*      m_pPage;\n    CPDF_Document*  m_pDocument;\n    CFX_PtrArray    m_pageObjects;\n};\n#endif\n"
  },
  {
    "path": "core/include/fpdfapi/fpdf_pageobj.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDF_PAGEOBJ_H_\n#define _FPDF_PAGEOBJ_H_\n#ifndef _FPDF_RESOURCE_\n#include \"fpdf_resource.h\"\n#endif\n#ifndef _FX_GE_H_\n#include \"../fxge/fx_ge.h\"\n#endif\nclass CPDF_Path;\nclass CPDF_ClipPathData;\nclass CPDF_ClipPath;\nclass CPDF_ColorStateData;\nclass CPDF_ColorState;\nclass CPDF_GraphState;\nclass CPDF_TextStateData;\nclass CPDF_TextState;\nclass CPDF_GeneralStateData;\nclass CPDF_GeneralState;\nclass CPDF_ContentMarkItem;\nclass CPDF_ContentMark;\nclass CPDF_GraphicStates;\nclass CPDF_PageObject;\nclass CPDF_TextObject;\nclass CPDF_PathObject;\nclass CPDF_ImageObject;\nclass CPDF_ShadingObject;\nclass CPDF_FormObject;\nclass CPDF_InlineImages;\ntypedef CFX_PathData CPDF_PathData;\nclass CPDF_Path : public CFX_CountRef<CFX_PathData>\n{\npublic:\n\n\n\n\n    int\t\t\t\t\tGetPointCount()\n    {\n        return m_pObject->m_PointCount;\n    }\n\n    int\t\t\t\t\tGetFlag(int index)\n    {\n        return m_pObject->m_pPoints[index].m_Flag;\n    }\n\n    FX_FLOAT\t\t\tGetPointX(int index)\n    {\n        return m_pObject->m_pPoints[index].m_PointX;\n    }\n\n    FX_FLOAT\t\t\tGetPointY(int index)\n    {\n        return m_pObject->m_pPoints[index].m_PointY;\n    }\n\n\n\n\n    FX_PATHPOINT*\t\tGetPoints()\n    {\n        return m_pObject->m_pPoints;\n    }\n\n\n    CFX_FloatRect\t\tGetBoundingBox() const\n    {\n        return m_pObject->GetBoundingBox();\n    }\n\n    CFX_FloatRect\t\tGetBoundingBox(FX_FLOAT line_width, FX_FLOAT miter_limit) const\n    {\n        return m_pObject->GetBoundingBox(line_width, miter_limit);\n    }\n\n    void\t\t\t\tTransform(const CFX_AffineMatrix* pMatrix)\n    {\n        GetModify()->Transform(pMatrix);\n    }\n\n    void\t\t\t\tAppend(CPDF_Path src, const CFX_AffineMatrix* pMatrix)\n    {\n        m_pObject->Append(src.m_pObject, pMatrix);\n    }\n\n    void\t\t\t\tAppendRect(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top)\n    {\n        m_pObject->AppendRect(left, bottom, right, top);\n    }\n\n    FX_BOOL\t\t\t\tIsRect() const\n    {\n        return m_pObject->IsRect();\n    }\n};\nclass CPDF_ClipPathData : public CFX_Object\n{\npublic:\n\n    CPDF_ClipPathData();\n\n    CPDF_ClipPathData(const CPDF_ClipPathData&);\n\n    ~CPDF_ClipPathData();\n\n    void\t\t\t\tSetCount(int path_count, int text_count);\npublic:\n\n    int\t\t\t\t\tm_PathCount;\n\n    CPDF_Path*\t\t\tm_pPathList;\n\n    FX_BYTE*\t\t\tm_pTypeList;\n\n    int\t\t\t\t\tm_TextCount;\n\n    CPDF_TextObject**\tm_pTextList;\n};\nclass CPDF_ClipPath : public CFX_CountRef<CPDF_ClipPathData>\n{\npublic:\n\n    FX_DWORD\t\t\tGetPathCount() const\n    {\n        return m_pObject->m_PathCount;\n    }\n\n    CPDF_Path\t\t\tGetPath(int i) const\n    {\n        return m_pObject->m_pPathList[i];\n    }\n\n    int\t\t\t\t\tGetClipType(int i) const\n    {\n        return m_pObject->m_pTypeList[i];\n    }\n\n    FX_DWORD\t\t\tGetTextCount() const\n    {\n        return m_pObject->m_TextCount;\n    }\n\n    CPDF_TextObject*\tGetText(int i) const\n    {\n        return m_pObject->m_pTextList[i];\n    }\n\n    CFX_FloatRect\t\tGetClipBox() const;\n\n    void\t\t\t\tAppendPath(CPDF_Path path, int type, FX_BOOL bAutoMerge);\n\n    void\t\t\t\tDeletePath(int layer_index);\n\n    void\t\t\t\tAppendTexts(CPDF_TextObject** pTexts, int count);\n\n    void\t\t\t\tTransform(const CFX_AffineMatrix& matrix);\n};\nclass CPDF_ColorStateData : public CFX_Object\n{\npublic:\n\n    CPDF_ColorStateData() {}\n\n    CPDF_ColorStateData(const CPDF_ColorStateData& src);\n\n    void\t\t\t\tDefault();\n\n    CPDF_Color\t\t\tm_FillColor;\n\n    FX_DWORD\t\t\tm_FillRGB;\n\n    CPDF_Color\t\t\tm_StrokeColor;\n\n    FX_DWORD\t\t\tm_StrokeRGB;\n};\nclass CPDF_ColorState : public CFX_CountRef<CPDF_ColorStateData>\n{\npublic:\n\n    CPDF_Color*\t\t\tGetFillColor() const\n    {\n        return m_pObject ? &m_pObject->m_FillColor : NULL;\n    }\n\n    CPDF_Color*\t\t\tGetStrokeColor() const\n    {\n        return m_pObject ? &m_pObject->m_StrokeColor : NULL;\n    }\n\n    void\t\t\t\tSetFillColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues);\n\n    void\t\t\t\tSetStrokeColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues);\n\n    void\t\t\t\tSetFillPattern(CPDF_Pattern* pattern, FX_FLOAT* pValue, int nValues);\n\n    void\t\t\t\tSetStrokePattern(CPDF_Pattern* pattern, FX_FLOAT* pValue, int nValues);\nprivate:\n    void\t\t\t\tSetColor(CPDF_Color& color, FX_DWORD& rgb, CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues);\n};\ntypedef CFX_GraphStateData CPDF_GraphStateData;\nclass CPDF_GraphState : public CFX_CountRef<CFX_GraphStateData>\n{\npublic:\n};\nclass CPDF_TextStateData : public CFX_Object\n{\npublic:\n\n    CPDF_TextStateData();\n\n    CPDF_TextStateData(const CPDF_TextStateData& src);\n\n    ~CPDF_TextStateData();\n\n    CPDF_Font*\t\t\tm_pFont;\n\n    FX_FLOAT\t\t\tm_FontSize;\n\n    FX_FLOAT\t\t\tm_CharSpace;\n\n    FX_FLOAT\t\t\tm_WordSpace;\n\n    FX_FLOAT\t\tm_Matrix[4];\n\n    int\t\t\t\t\tm_TextMode;\n\n    FX_FLOAT\t\tm_CTM[4];\n};\nclass CPDF_TextState : public CFX_CountRef<CPDF_TextStateData>\n{\npublic:\n\n    CPDF_Font*\t\t\tGetFont() const\n    {\n        return m_pObject->m_pFont;\n    }\n\n    void\t\t\t\tSetFont(CPDF_Font* pFont);\n\n    FX_FLOAT\t\t\tGetFontSize() const\n    {\n        return m_pObject->m_FontSize;\n    }\n\n    FX_FLOAT*\t\t\tGetMatrix() const\n    {\n        return m_pObject->m_Matrix;\n    }\n\n\n\n    FX_FLOAT\t\t\tGetFontSizeV() const;\n\n    FX_FLOAT\t\t\tGetFontSizeH() const;\n\n    FX_FLOAT\t\t\tGetBaselineAngle() const;\n\n    FX_FLOAT\t\t\tGetShearAngle() const;\n\n};\nclass CPDF_TransferFunc;\nclass CPDF_GeneralStateData : public CFX_Object\n{\npublic:\n\n    CPDF_GeneralStateData();\n\n    CPDF_GeneralStateData(const CPDF_GeneralStateData& src);\n    ~CPDF_GeneralStateData();\n\n    void\t\t\t\tSetBlendMode(FX_BSTR blend_mode);\n\n    char\t\t\t\tm_BlendMode[16];\n\n    int\t\t\t\t\tm_BlendType;\n\n    CPDF_Object*\t\tm_pSoftMask;\n\n    FX_FLOAT\t\t\tm_SMaskMatrix[6];\n\n    FX_FLOAT\t\t\tm_StrokeAlpha;\n\n    FX_FLOAT\t\t\tm_FillAlpha;\n\n    CPDF_Object*\t\tm_pTR;\n\n    CPDF_TransferFunc*\tm_pTransferFunc;\n\n    CFX_Matrix\t\t\tm_Matrix;\n\n    int\t\t\t\t\tm_RenderIntent;\n\n    FX_BOOL\t\t\t\tm_StrokeAdjust;\n\n    FX_BOOL\t\t\t\tm_AlphaSource;\n\n    FX_BOOL\t\t\t\tm_TextKnockout;\n\n    FX_BOOL\t\t\t\tm_StrokeOP;\n\n    FX_BOOL\t\t\t\tm_FillOP;\n\n    int\t\t\t\t\tm_OPMode;\n\n    CPDF_Object*\t\tm_pBG;\n\n    CPDF_Object*\t\tm_pUCR;\n\n    CPDF_Object*\t\tm_pHT;\n\n    FX_FLOAT\t\t\tm_Flatness;\n\n    FX_FLOAT\t\t\tm_Smoothness;\n};\nclass CPDF_GeneralState : public CFX_CountRef<CPDF_GeneralStateData>\n{\npublic:\n\n    void\t\t\t\tSetRenderIntent(const CFX_ByteString& ri);\n\n    int\t\t\t\t\tGetBlendType() const\n    {\n        return m_pObject ? m_pObject->m_BlendType : FXDIB_BLEND_NORMAL;\n    }\n\n    int\t\t\t\t\tGetAlpha(FX_BOOL bStroke) const\n    {\n        return m_pObject ? FXSYS_round((bStroke ? m_pObject->m_StrokeAlpha : m_pObject->m_FillAlpha) * 255) : 255;\n    }\n};\nclass CPDF_ContentMarkItem : public CFX_Object\n{\npublic:\n\n    typedef enum {\n        None,\n        PropertiesDict,\n        DirectDict,\n        MCID\n    } ParamType;\n\n    CPDF_ContentMarkItem();\n\n    CPDF_ContentMarkItem(const CPDF_ContentMarkItem& src);\n\n    ~CPDF_ContentMarkItem();\n\n    inline const CFX_ByteString&\tGetName() const\n    {\n        return m_MarkName;\n    }\n\n    inline ParamType\tGetParamType() const\n    {\n        return m_ParamType;\n    }\n\n    inline void*\t\tGetParam() const\n    {\n        return m_pParam;\n    }\n\n    inline FX_BOOL\t\tHasMCID() const;\n\n    inline void\t\t\tSetName(const CFX_ByteString& name)\n    {\n        m_MarkName = name;\n    }\n\n    inline void\t\t\tSetParam(ParamType type, void* param)\n    {\n        m_ParamType = type;\n        m_pParam = param;\n    }\nprivate:\n\n    CFX_ByteString\t\tm_MarkName;\n\n    ParamType\t\t\tm_ParamType;\n\n    void*\t\t\t\tm_pParam;\n};\nclass CPDF_ContentMarkData : public CFX_Object\n{\npublic:\n\n    CPDF_ContentMarkData() { }\n\n    CPDF_ContentMarkData(const CPDF_ContentMarkData& src);\n\n    inline int\t\t\tCountItems() const\n    {\n        return m_Marks.GetSize();\n    }\n\n    inline CPDF_ContentMarkItem&\tGetItem(int index) const\n    {\n        return m_Marks[index];\n    }\n\n    int\t\t\t\t\tGetMCID() const;\n\n    void\t\t\t\tAddMark(const CFX_ByteString& name, CPDF_Dictionary* pDict, FX_BOOL bDictNeedClone);\n\n    void\t\t\t\tDeleteLastMark();\nprivate:\n\n    CFX_ObjectArray<CPDF_ContentMarkItem>\tm_Marks;\n};\nclass CPDF_ContentMark : public CFX_CountRef<CPDF_ContentMarkData>\n{\npublic:\n\n    int\t\t\t\t\tGetMCID() const\n    {\n        return m_pObject ? m_pObject->GetMCID() : -1;\n    }\n\n    FX_BOOL\t\t\t\tHasMark(FX_BSTR mark) const;\n\n    FX_BOOL\t\t\t\tLookupMark(FX_BSTR mark, CPDF_Dictionary*& pDict) const;\n};\n#define PDFPAGE_TEXT\t\t1\n#define PDFPAGE_PATH\t\t2\n#define PDFPAGE_IMAGE\t\t3\n#define PDFPAGE_SHADING\t\t4\n#define PDFPAGE_FORM\t\t5\n#define PDFPAGE_INLINES\t\t6\nclass CPDF_GraphicStates : public CFX_Object\n{\npublic:\n\n    void\t\t\t\tCopyStates(const CPDF_GraphicStates& src);\n\n    void\t\t\t\tDefaultStates();\n\n    CPDF_ClipPath\t\tm_ClipPath;\n\n    CPDF_GraphState\t\tm_GraphState;\n\n    CPDF_ColorState\t\tm_ColorState;\n\n    CPDF_TextState\t\tm_TextState;\n\n    CPDF_GeneralState\tm_GeneralState;\n};\nclass CPDF_PageObject : public CPDF_GraphicStates\n{\npublic:\n\n    static CPDF_PageObject* Create(int type);\n\n    void\t\t\t\tRelease();\n\n    CPDF_PageObject*\tClone() const;\n\n    void\t\t\t\tCopy(const CPDF_PageObject* pSrcObject);\n\n    virtual void\t\tTransform(const CFX_AffineMatrix& matrix) = 0;\n\n\n\n    void\t\t\t\tRemoveClipPath();\n\n    void\t\t\t\tAppendClipPath(CPDF_Path path, int type, FX_BOOL bAutoMerge);\n\n    void\t\t\t\tCopyClipPath(CPDF_PageObject* pObj);\n\n    void\t\t\t\tTransformClipPath(CFX_AffineMatrix& matrix);\n\n    void\t\t\t\tTransformGeneralState(CFX_AffineMatrix& matrix);\n\n\n    void\t\t\t\tSetColorState(CPDF_ColorState state)\n    {\n        m_ColorState = state;\n    }\n\n    FX_RECT\t\t\t\tGetBBox(const CFX_AffineMatrix* pMatrix) const;\n\n    int\t\t\t\t\tm_Type;\n\n    FX_FLOAT\t\t\tm_Left;\n\n    FX_FLOAT\t\t\tm_Right;\n\n    FX_FLOAT\t\t\tm_Top;\n\n    FX_FLOAT\t\t\tm_Bottom;\n\n    CPDF_ContentMark\tm_ContentMark;\nprotected:\n\n    virtual void\t\tCopyData(const CPDF_PageObject* pSrcObject) {}\n\n    void\t\t\t\tRecalcBBox();\n\n    CPDF_PageObject() {}\n\n    virtual ~CPDF_PageObject() {}\n};\nstruct CPDF_TextObjectItem : public CFX_Object {\n\n    FX_DWORD\t\t\tm_CharCode;\n\n    FX_FLOAT\t\t\tm_OriginX;\n\n    FX_FLOAT\t\t\tm_OriginY;\n};\nclass CPDF_TextObject : public CPDF_PageObject\n{\npublic:\n\n    CPDF_TextObject();\n\n    virtual ~CPDF_TextObject();\n\n    int\t\t\t\t\tCountItems() const\n    {\n        return m_nChars;\n    }\n\n    void\t\t\t\tGetItemInfo(int index, CPDF_TextObjectItem* pInfo) const;\n\n    int\t\t\t\t\tCountChars() const;\n\n    void\t\t\t\tGetCharInfo(int index, FX_DWORD& charcode, FX_FLOAT& kerning) const;\n    void\t\t\t\tGetCharInfo(int index, CPDF_TextObjectItem* pInfo) const;\n\n    void\t\t\t\tGetCharRect(int index, CFX_FloatRect& rect) const;\n\n\n    FX_FLOAT\t\t\tGetCharWidth(FX_DWORD charcode) const;\n    FX_FLOAT\t\t\tGetSpaceCharWidth() const;\n\n    FX_FLOAT\t\t\tGetPosX() const\n    {\n        return m_PosX;\n    }\n\n    FX_FLOAT\t\t\tGetPosY() const\n    {\n        return m_PosY;\n    }\n\n    void\t\t\t\tGetTextMatrix(CFX_AffineMatrix* pMatrix) const;\n\n    CPDF_Font*\t\t\tGetFont() const\n    {\n        return m_TextState.GetFont();\n    }\n\n    FX_FLOAT\t\t\tGetFontSize() const\n    {\n        return m_TextState.GetFontSize();\n    }\n\n    void\t\t\t\tSetEmpty();\n\n    void\t\t\t\tSetText(const CFX_ByteString& text);\n\n    void\t\t\t\tSetText(CFX_ByteString* pStrs, FX_FLOAT* pKerning, int nSegs);\n\n    void\t\t\t\tSetText(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pKernings);\n\n    void\t\t\t\tSetPosition(FX_FLOAT x, FX_FLOAT y);\n\n    void\t\t\t\tSetTextState(CPDF_TextState TextState);\n    virtual void\t\tTransform(const CFX_AffineMatrix& matrix);\n\n    void\t\t\t\tCalcCharPos(FX_FLOAT* pPosArray) const;\n\n\n\n    void\t\t\t\tSetData(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, FX_FLOAT x, FX_FLOAT y);\n\n    void\t\t\t\tGetData(int& nChars, FX_DWORD*& pCharCodes, FX_FLOAT*& pCharPos)\n    {\n        nChars = m_nChars;\n        pCharCodes = m_pCharCodes;\n        pCharPos = m_pCharPos;\n    }\n\n\n    void\t\t\t\tRecalcPositionData()\n    {\n        CalcPositionData(NULL, NULL, 1);\n    }\nprotected:\n    virtual void\t\tCopyData(const CPDF_PageObject* pSrcObject);\n\n    FX_FLOAT\t\t\tm_PosX;\n\n    FX_FLOAT\t\t\tm_PosY;\n\n    int\t\t\t\t\tm_nChars;\n\n    FX_DWORD*\t\t\tm_pCharCodes;\n\n    FX_FLOAT*\t\tm_pCharPos;\n\n    void\t\t\t\tSetSegments(const CFX_ByteString* pStrs, FX_FLOAT* pKerning, int nSegs);\n\n    void\t\t\t\tCalcPositionData(FX_FLOAT* pTextAdvanceX, FX_FLOAT* pTextAdvanceY, FX_FLOAT horz_scale, int level = 0);\n    friend class\t\tCPDF_StreamContentParser;\n    friend class\t\tCPDF_RenderStatus;\n    friend class\t\tCPDF_QuickDrawer;\n    friend class\t\tCPDF_TextRenderer;\n    friend class\t\tCTextPage;\n    friend class\t\tCPDF_ContentGenerator;\n};\nclass CPDF_PathObject : public CPDF_PageObject\n{\npublic:\n\n    CPDF_PathObject()\n    {\n        m_Type = PDFPAGE_PATH;\n    }\n\n    virtual ~CPDF_PathObject() {}\n    virtual void\t\tTransform(const CFX_AffineMatrix& maxtrix);\n\n    void\t\t\t\tSetGraphState(CPDF_GraphState GraphState);\n\n    CPDF_Path\t\t\tm_Path;\n\n    int\t\t\t\t\tm_FillType;\n\n    FX_BOOL\t\t\t\tm_bStroke;\n\n    CFX_AffineMatrix\tm_Matrix;\n\n\n    void\t\t\t\tCalcBoundingBox();\nprotected:\n    virtual void\t\tCopyData(const CPDF_PageObject* pSrcObjet);\n};\nclass CPDF_ImageObject : public CPDF_PageObject\n{\npublic:\n\n    CPDF_ImageObject();\n\n    virtual ~CPDF_ImageObject();\n    virtual void\t\tTransform(const CFX_AffineMatrix& matrix);\n\n    CPDF_Image*\t\t\tm_pImage;\n\n    CFX_AffineMatrix\tm_Matrix;\n\n    void\t\t\t\tCalcBoundingBox();\nprivate:\n    virtual void\t\tCopyData(const CPDF_PageObject* pSrcObjet);\n};\nclass CPDF_ShadingObject : public CPDF_PageObject\n{\npublic:\n\n    CPDF_ShadingObject();\n\n    virtual ~CPDF_ShadingObject();\n\n    CPDF_ShadingPattern*\tm_pShading;\n\n    CFX_AffineMatrix\tm_Matrix;\n\n    CPDF_Page*\t\t\tm_pPage;\n    virtual void\t\tTransform(const CFX_AffineMatrix& matrix);\n\n    void\t\t\t\tCalcBoundingBox();\nprotected:\n    virtual void\t\tCopyData(const CPDF_PageObject* pSrcObjet);\n};\nclass CPDF_FormObject : public CPDF_PageObject\n{\npublic:\n\n    CPDF_FormObject()\n    {\n        m_Type = PDFPAGE_FORM;\n        m_pForm = NULL;\n    }\n\n    virtual ~CPDF_FormObject();\n    virtual void\t\tTransform(const CFX_AffineMatrix& matrix);\n\n    CPDF_Form*\t\t\tm_pForm;\n\n    CFX_AffineMatrix\tm_FormMatrix;\n\n    void\t\t\t\tCalcBoundingBox();\nprotected:\n    virtual void\t\tCopyData(const CPDF_PageObject* pSrcObjet);\n};\nclass CPDF_InlineImages : public CPDF_PageObject\n{\npublic:\n\n    CPDF_InlineImages();\n\n    virtual ~CPDF_InlineImages();\n\n    CPDF_Stream*\t\tm_pStream;\n\n    CFX_DIBitmap*\t\tm_pBitmap;\n\n    CFX_ArrayTemplate<CFX_AffineMatrix>\tm_Matrices;\n\n    void\t\t\t\tAddMatrix(CFX_AffineMatrix& matrix);\nprotected:\n    virtual void\t\tTransform(const CFX_AffineMatrix& matrix) {}\n    virtual void\t\tCopyData(const CPDF_PageObject* pSrcObjet) {}\n};\n#endif\n"
  },
  {
    "path": "core/include/fpdfapi/fpdf_parser.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDF_PARSER_\n#define _FPDF_PARSER_\n#ifndef _FX_BASIC_H_\n#include \"../fxcrt/fx_ext.h\"\n#endif\n#ifndef _FPDF_OBJECTS_\n#include \"fpdf_objects.h\"\n#endif\nclass CPDF_Document;\nclass IPDF_DocParser;\nclass CPDF_Parser;\nclass CPDF_SecurityHandler;\nclass CPDF_StandardSecurityHandler;\nclass CPDF_CryptoHandler;\nclass CPDF_Object;\nclass IFX_FileRead;\nclass CFDF_Document;\nclass CFDF_Parser;\nclass CFX_Font;\nclass CFX_AffineMatrix;\nclass CFX_FloatRect;\nclass CPDF_Point;\nclass CPDF_DocPageData;\nclass CPDF_DocRenderData;\nclass CPDF_ModuleMgr;\nclass CFX_DIBSource;\nclass CPDF_Font;\nclass CPDF_Image;\nclass CPDF_ColorSpace;\nclass CPDF_Pattern;\nclass CPDF_FontEncoding;\nclass CPDF_IccProfile;\nclass CFX_PrivateData;\n#define FPDFPERM_PRINT\t\t\t0x0004\n#define FPDFPERM_MODIFY\t\t\t0x0008\n#define FPDFPERM_EXTRACT\t\t0x0010\n#define FPDFPERM_ANNOT_FORM\t\t0x0020\n#define FPDFPERM_FILL_FORM\t\t0x0100\n#define FPDFPERM_EXTRACT_ACCESS\t0x0200\n#define FPDFPERM_ASSEMBLE\t\t0x0400\n#define FPDFPERM_PRINT_HIGH\t\t0x0800\n#define FPDF_PAGE_MAX_NUM\t\t0xFFFFF\nclass IPDF_EnumPageHandler\n{\npublic:\n\n    virtual FX_BOOL EnumPage(CPDF_Dictionary* pPageDict) = 0;\n};\nclass CPDF_Document : public CFX_PrivateData, public CPDF_IndirectObjects\n{\npublic:\n\n    CPDF_Document(IPDF_DocParser* pParser);\n\n    CPDF_Document();\n\n    ~CPDF_Document();\n\n    IPDF_DocParser*\t\t\tGetParser() const\n    {\n        return m_pParser;\n    }\n\n    CPDF_Dictionary*\t\tGetRoot() const\n    {\n        return m_pRootDict;\n    }\n\n    CPDF_Dictionary*\t\tGetInfo() const\n    {\n        return m_pInfoDict;\n    }\n\n    void\t\t\t\t\tGetID(CFX_ByteString& id1, CFX_ByteString& id2) const\n    {\n        id1 = m_ID1;\n        id2 = m_ID2;\n    }\n\n    int\t\t\t\t\t\tGetPageCount() const;\n\n    CPDF_Dictionary*\t\tGetPage(int iPage);\n\n    int\t\t\t\t\t\tGetPageIndex(FX_DWORD objnum);\n\n    void\t\t\t\t\tEnumPages(IPDF_EnumPageHandler* pHandler);\n\n    FX_DWORD\t\t\t\tGetUserPermissions(FX_BOOL bCheckRevision = FALSE) const;\n\n    FX_BOOL\t\t\t\t\tIsOwner() const;\n\n\n\n    CPDF_DocPageData*\t\tGetPageData()\n    {\n        return GetValidatePageData();\n    }\n\n    void\t\t\t\t\tClearPageData();\n\n    void\t\t\t\t\tRemoveColorSpaceFromPageData(CPDF_Object* pObject);\n\n\n    CPDF_DocRenderData*\t\tGetRenderData()\n    {\n        return GetValidateRenderData();\n    }\n\n    void\t\t\t\t\tClearRenderData();\n\n    void\t\t\t\t\tClearRenderFont();\n\n\n    FX_BOOL\t\t\t\t\tIsFormStream(FX_DWORD objnum, FX_BOOL& bForm) const;\n\n\n\n\n    CPDF_Font*\t\t\t\tLoadFont(CPDF_Dictionary* pFontDict);\n\n    CPDF_Font*\t\t\t\tFindFont(CPDF_Dictionary* pFontDict);\n\n    CPDF_ColorSpace*\t\tLoadColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources = NULL);\n\n    CPDF_Pattern*\t\t\tLoadPattern(CPDF_Object* pObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix = NULL);\n\n    CPDF_Image*\t\t\t\tLoadImageF(CPDF_Object* pObj);\n\n    CPDF_StreamAcc*\t\t\tLoadFontFile(CPDF_Stream* pStream);\n\n    CPDF_IccProfile*\t\tLoadIccProfile(CPDF_Stream* pStream, int nComponents);\n\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\n\n    CPDF_Font*\t\t\t\tAddWindowsFont(LOGFONTA* pLogFont, FX_BOOL bVert, FX_BOOL bTranslateName = FALSE);\n    CPDF_Font*\t\t\t\tAddWindowsFont(LOGFONTW* pLogFont, FX_BOOL bVert, FX_BOOL bTranslateName = FALSE);\n#endif\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_\n    CPDF_Font*              AddMacFont(CTFontRef pFont, FX_BOOL bVert, FX_BOOL bTranslateName = FALSE);\n#endif\n\n    CPDF_Font*\t\t\t\tAddStandardFont(const FX_CHAR* font, CPDF_FontEncoding* pEncoding);\n\n\n    CPDF_Font*\t\t\t\tAddFont(CFX_Font* pFont, int charset, FX_BOOL bVert);\n\n    void\t\t\t\t\tCreateNewDoc();\n\n    CPDF_Dictionary*\t\tCreateNewPage(int iPage);\n\n    void\t\t\t\t\tDeletePage(int iPage);\n\n    void\t\t\t\t\tLoadDoc();\n    void\t\t\t\t\tLoadAsynDoc(CPDF_Dictionary *pLinearized);\n    void\t\t\t\t\tLoadPages();\nprotected:\n\n    CPDF_Dictionary*\t\tm_pRootDict;\n\n    CPDF_Dictionary*\t\tm_pInfoDict;\n\n    CFX_ByteString\t\t\tm_ID1;\n\n    CFX_ByteString\t\t\tm_ID2;\n\n\n    FX_BOOL\t\t\t\t\tm_bLinearized;\n\n    FX_DWORD\t\t\t\tm_dwFirstPageNo;\n\n    FX_DWORD\t\t\t\tm_dwFirstPageObjNum;\n\n    CFX_DWordArray\t\t\tm_PageList;\n\n    int\t\t\t\t\t\t_GetPageCount() const;\n    CPDF_Dictionary*\t\t_FindPDFPage(CPDF_Dictionary* pPages, int iPage, int nPagesToGo, int level);\n    int\t\t\t\t\t\t_FindPageIndex(CPDF_Dictionary* pNode, FX_DWORD& skip_count, FX_DWORD objnum, int& index, int level = 0);\n    FX_BOOL\t\t\t\t\tIsContentUsedElsewhere(FX_DWORD objnum, CPDF_Dictionary* pPageDict);\n    FX_BOOL\t\t\t\t\tCheckOCGVisible(CPDF_Dictionary* pOCG, FX_BOOL bPrinting);\n    CPDF_DocPageData*\t\tGetValidatePageData();\n    CPDF_DocRenderData*\t\tGetValidateRenderData();\n    friend class\t\t\tCPDF_Creator;\n    friend class\t\t\tCPDF_Parser;\n    friend class\t\t\tCPDF_DataAvail;\n    friend class\t\t\tCPDF_OCContext;\n\n\n\n    CPDF_DocPageData*\t\tm_pDocPage;\n\n    CPDF_DocRenderData*\t\tm_pDocRender;\n\n};\n\n#define PDFWORD_EOF\t\t\t0\n#define PDFWORD_NUMBER\t\t1\n#define PDFWORD_TEXT\t\t2\n#define PDFWORD_DELIMITER\t3\n#define PDFWORD_NAME\t\t4\nclass CPDF_SimpleParser : public CFX_Object\n{\npublic:\n\n    CPDF_SimpleParser(FX_LPCBYTE pData, FX_DWORD dwSize);\n\n    CPDF_SimpleParser(FX_BSTR str);\n\n    CFX_ByteStringC\t\tGetWord();\n\n    FX_BOOL\t\t\t\tSearchToken(FX_BSTR token);\n\n    FX_BOOL\t\t\t\tSkipWord(FX_BSTR token);\n\n    FX_BOOL\t\t\t\tFindTagPair(FX_BSTR start_token, FX_BSTR end_token,\n                                    FX_DWORD& start_pos, FX_DWORD& end_pos);\n\n    FX_BOOL\t\t\t\tFindTagParam(FX_BSTR token, int nParams);\n\n    FX_DWORD\t\t\tGetPos()\n    {\n        return m_dwCurPos;\n    }\n\n    void\t\t\t\tSetPos(FX_DWORD pos)\n    {\n        ASSERT(pos <= m_dwSize);\n        m_dwCurPos = pos;\n    }\nprivate:\n\n    void\t\t\t\tParseWord(FX_LPCBYTE& pStart, FX_DWORD& dwSize, int& type);\n\n    FX_LPCBYTE\t\t\tm_pData;\n\n    FX_DWORD\t\t\tm_dwSize;\n\n    FX_DWORD\t\t\tm_dwCurPos;\n};\nclass CPDF_SyntaxParser : public CFX_Object\n{\npublic:\n\n    CPDF_SyntaxParser();\n\n    ~CPDF_SyntaxParser();\n\n    void\t\t\t\tInitParser(IFX_FileRead* pFileAccess, FX_DWORD HeaderOffset);\n\n    FX_FILESIZE\t\t\tSavePos()\n    {\n        return m_Pos;\n    }\n\n    void\t\t\t\tRestorePos(FX_FILESIZE pos)\n    {\n        m_Pos = pos;\n    }\n\n    CPDF_Object*\t\tGetObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, FX_DWORD gennum, int level, struct PARSE_CONTEXT* pContext = NULL, FX_BOOL bDecrypt = TRUE);\n\n\n    CPDF_Object*\t\tGetObjectByStrict(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, FX_DWORD gennum, int level, struct PARSE_CONTEXT* pContext = NULL);\n\n    int\t\t\t\t\tGetDirectNum();\n\n    CFX_ByteString\t\tGetString(FX_DWORD objnum, FX_DWORD gennum);\n\n    CFX_ByteString\t\tGetName();\n\n    CFX_ByteString\t\tGetKeyword();\n\n    void\t\t\t\tGetBinary(FX_BYTE* buffer, FX_DWORD size);\n\n    void\t\t\t\tToNextLine();\n\n    void\t\t\t\tToNextWord();\n\n    FX_BOOL\t\t\t\tSearchWord(FX_BSTR word, FX_BOOL bWholeWord, FX_BOOL bForward, FX_FILESIZE limit);\n\n    int\t\t\t\t\tSearchMultiWord(FX_BSTR words, FX_BOOL bWholeWord, FX_FILESIZE limit);\n\n    FX_FILESIZE\t\t\tFindTag(FX_BSTR tag, FX_FILESIZE limit);\n\n    void\t\t\t\tSetEncrypt(CPDF_CryptoHandler* pCryptoHandler)\n    {\n        m_pCryptoHandler = pCryptoHandler;\n    }\n\n    FX_BOOL\t\t\t\tIsEncrypted()\n    {\n        return m_pCryptoHandler != NULL;\n    }\n\n    FX_BOOL\t\t\t\tGetCharAt(FX_FILESIZE pos, FX_BYTE& ch);\n\n    FX_BOOL\t\t\t\tReadBlock(FX_BYTE* pBuf, FX_DWORD size);\n\n    CFX_ByteString\t\tGetNextWord(FX_BOOL& bIsNumber);\nprotected:\n\n    virtual FX_BOOL\t\t\t\tGetNextChar(FX_BYTE& ch);\n\n    FX_BOOL\t\t\t\tGetCharAtBackward(FX_FILESIZE pos, FX_BYTE& ch);\n\n    void\t\t\t\tGetNextWord();\n\n    FX_BOOL\t\t\t\tIsWholeWord(FX_FILESIZE startpos, FX_FILESIZE limit, FX_LPCBYTE tag, FX_DWORD taglen);\n\n    CFX_ByteString\t\tReadString();\n\n    CFX_ByteString\t\tReadHexString();\n\n    CPDF_Stream*\t\tReadStream(CPDF_Dictionary* pDict, PARSE_CONTEXT* pContext, FX_DWORD objnum, FX_DWORD gennum);\n\n    FX_FILESIZE\t\t\tm_Pos;\n\n    FX_BOOL\t\t\t\tm_bFileStream;\n\n    int\t\t\t\t\tm_MetadataObjnum;\n\n    IFX_FileRead*\t\tm_pFileAccess;\n\n    FX_DWORD\t\t\tm_HeaderOffset;\n\n    FX_FILESIZE\t\t\tm_FileLen;\n\n    FX_BYTE*\t\t\tm_pFileBuf;\n\n    FX_DWORD\t\t\tm_BufSize;\n\n    FX_FILESIZE\t\t\tm_BufOffset;\n\n    CPDF_CryptoHandler*\tm_pCryptoHandler;\n\n    FX_BYTE\t\t\t\tm_WordBuffer[257];\n\n    FX_DWORD\t\t\tm_WordSize;\n\n    FX_BOOL\t\t\t\tm_bIsNumber;\n\n    FX_FILESIZE\t\t\tm_dwWordPos;\n    friend class\t\tCPDF_Parser;\n    friend class\t\tCPDF_DataAvail;\n};\n\n#define PDFPARSE_TYPEONLY\t1\n#define PDFPARSE_NOSTREAM\t2\nstruct PARSE_CONTEXT {\n\n    FX_BOOL\t\tm_Flags;\n\n    FX_FILESIZE\tm_DictStart;\n\n    FX_FILESIZE\tm_DictEnd;\n\n    FX_FILESIZE\tm_DataStart;\n\n    FX_FILESIZE\tm_DataEnd;\n};\nclass IPDF_DocParser : public CFX_Object\n{\npublic:\n\n    virtual FX_DWORD\tGetRootObjNum() = 0;\n\n    virtual FX_DWORD\tGetInfoObjNum() = 0;\n\n    virtual CPDF_Object*\tParseIndirectObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, PARSE_CONTEXT* pContext = NULL) = 0;\n\n    virtual FX_DWORD\tGetLastObjNum() = 0;\n\n    virtual CPDF_Array*\tGetIDArray() = 0;\n\n    virtual CPDF_Dictionary*\tGetEncryptDict() = 0;\n\n    FX_BOOL\t\t\t\tIsEncrypted()\n    {\n        return GetEncryptDict() != NULL;\n    }\n\n    virtual FX_DWORD\tGetPermissions(FX_BOOL bCheckRevision = FALSE) = 0;\n\n    virtual FX_BOOL\t\tIsOwner() = 0;\n\n    virtual FX_BOOL\t\tIsFormStream(FX_DWORD objnum, FX_BOOL& bForm) = 0;\n};\n\n#define PDFPARSE_ERROR_SUCCESS\t\t0\n#define PDFPARSE_ERROR_FILE\t\t\t1\n#define PDFPARSE_ERROR_FORMAT\t\t2\n#define PDFPARSE_ERROR_PASSWORD\t\t3\n#define PDFPARSE_ERROR_HANDLER\t\t4\n#define PDFPARSE_ERROR_CERT\t\t\t5\nclass CPDF_Parser FX_FINAL : public IPDF_DocParser\n{\npublic:\n\n    CPDF_Parser();\n\n    ~CPDF_Parser();\n\n    FX_DWORD\t\t\tStartParse(FX_LPCSTR filename, FX_BOOL bReParse = FALSE);\n\n    FX_DWORD\t\t\tStartParse(FX_LPCWSTR filename, FX_BOOL bReParse = FALSE);\n\n    FX_DWORD\t\t\tStartParse(IFX_FileRead* pFile, FX_BOOL bReParse = FALSE, FX_BOOL bOwnFileRead = TRUE);\n\n    void\t\t\t\tCloseParser(FX_BOOL bReParse = FALSE);\n\n    virtual FX_DWORD\tGetPermissions(FX_BOOL bCheckRevision = FALSE);\n\n    virtual FX_BOOL\t\tIsOwner();\n\n    void\t\t\t\tSetPassword(const FX_CHAR* password)\n    {\n        m_Password = password;\n    }\n\n    CFX_ByteString\t\tGetPassword()\n    {\n        return m_Password;\n    }\n\n    CPDF_SecurityHandler* GetSecurityHandler()\n    {\n        return m_pSecurityHandler;\n    }\n\n    CPDF_CryptoHandler*\tGetCryptoHandler()\n    {\n        return m_Syntax.m_pCryptoHandler;\n    }\n\n    void\t\t\t\tSetSecurityHandler(CPDF_SecurityHandler* pSecurityHandler, FX_BOOL bForced = FALSE);\n\n    CFX_ByteString\t\tGetRecipient()\n    {\n        return m_bsRecipient;\n    }\n\n    CPDF_Dictionary*\tGetTrailer()\n    {\n        return m_pTrailer;\n    }\n\n    FX_FILESIZE\t\t\tGetLastXRefOffset()\n    {\n        return m_LastXRefOffset;\n    }\n\n    CPDF_Document*\t\tGetDocument()\n    {\n        return m_pDocument;\n    }\n    CFX_ArrayTemplate<CPDF_Dictionary *> * GetOtherTrailers()\n    {\n        return &m_Trailers;\n    }\n\n    virtual FX_DWORD\tGetRootObjNum();\n    virtual FX_DWORD\tGetInfoObjNum();\n    virtual CPDF_Array*\tGetIDArray();\n    virtual CPDF_Dictionary*\tGetEncryptDict()\n    {\n        return m_pEncryptDict;\n    }\n    virtual CPDF_Object*\t\tParseIndirectObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, PARSE_CONTEXT* pContext = NULL);\n    virtual FX_DWORD\tGetLastObjNum();\n    virtual FX_BOOL\t\tIsFormStream(FX_DWORD objnum, FX_BOOL& bForm);\n\n    FX_FILESIZE\t\t\tGetObjectOffset(FX_DWORD objnum);\n\n    FX_FILESIZE\t\t\tGetObjectSize(FX_DWORD objnum);\n\n    int\t\t\t\t\tGetObjectVersion(FX_DWORD objnum)\n    {\n        return m_ObjVersion[objnum];\n    }\n\n    void\t\t\t\tGetIndirectBinary(FX_DWORD objnum, FX_BYTE*& pBuffer, FX_DWORD& size);\n\n    FX_BOOL\t\t\t\tGetFileStreamOption()\n    {\n        return m_Syntax.m_bFileStream;\n    }\n\n    void\t\t\t\tSetFileStreamOption(FX_BOOL b)\n    {\n        m_Syntax.m_bFileStream = b;\n    }\n\n    IFX_FileRead*\t\tGetFileAccess() const\n    {\n        return m_Syntax.m_pFileAccess;\n    }\n\n    int\t\t\t\t\tGetFileVersion() const\n    {\n        return m_FileVersion;\n    }\n\n    FX_BOOL\t\t\t\tIsXRefStream() const\n    {\n        return m_bXRefStream;\n    }\n    CPDF_Object*\t\tParseIndirectObjectAt(CPDF_IndirectObjects* pObjList, FX_FILESIZE pos, FX_DWORD objnum,\n            struct PARSE_CONTEXT* pContext);\n\n    CPDF_Object*\t\tParseIndirectObjectAtByStrict(CPDF_IndirectObjects* pObjList, FX_FILESIZE pos, FX_DWORD objnum,\n            struct PARSE_CONTEXT* pContext, FX_FILESIZE *pResultPos);\n\n    FX_DWORD\t\t\tStartAsynParse(IFX_FileRead* pFile, FX_BOOL bReParse = FALSE, FX_BOOL bOwnFileRead = TRUE);\n\n    FX_DWORD\t\t\tGetFirstPageNo()\n    {\n        return m_dwFirstPageNo;\n    }\nprotected:\n\n    CPDF_Document*\t\tm_pDocument;\n\n    CPDF_SyntaxParser\tm_Syntax;\n    FX_BOOL\t\t\t\tm_bOwnFileRead;\n    CPDF_Object*\t\tParseDirect(CPDF_Object* pObj);\n\n    FX_BOOL\t\t\t\tLoadAllCrossRefV4(FX_FILESIZE pos);\n\n    FX_BOOL\t\t\t\tLoadAllCrossRefV5(FX_FILESIZE pos);\n\n    FX_BOOL\t\t\t\tLoadCrossRefV4(FX_FILESIZE pos, FX_FILESIZE streampos, FX_BOOL bSkip, FX_BOOL bFirst);\n\n    FX_BOOL\t\t\t\tLoadCrossRefV5(FX_FILESIZE pos, FX_FILESIZE& prev, FX_BOOL bMainXRef);\n\n    CPDF_Dictionary*\tLoadTrailerV4();\n\n    FX_BOOL\t\t\t\tRebuildCrossRef();\n\n    FX_DWORD\t\t\tSetEncryptHandler();\n\n    void\t\t\t\tReleaseEncryptHandler();\n\n    FX_BOOL\t\t\t\tLoadLinearizedAllCrossRefV4(FX_FILESIZE pos, FX_DWORD dwObjCount);\n\n    FX_BOOL\t\t\t\tLoadLinearizedCrossRefV4(FX_FILESIZE pos, FX_DWORD dwObjCount);\n\n    FX_BOOL\t\t\t\tLoadLinearizedAllCrossRefV5(FX_FILESIZE pos);\n\n    FX_DWORD\t\t\tLoadLinearizedMainXRefTable();\n\n    CFX_MapPtrToPtr\t\tm_ObjectStreamMap;\n\n    CPDF_StreamAcc*\t\tGetObjectStream(FX_DWORD number);\n\n    FX_BOOL\t\t\t\tIsLinearizedFile(IFX_FileRead* pFileAccess, FX_DWORD offset);\n\n\n\n    int\t\t\t\t\tm_FileVersion;\n\n    CPDF_Dictionary*\tm_pTrailer;\n\n    CPDF_Dictionary*\tm_pEncryptDict;\n    void SetEncryptDictionary(CPDF_Dictionary* pDict);\n\n    FX_FILESIZE\t\t\tm_LastXRefOffset;\n\n    FX_BOOL\t\t\t\tm_bXRefStream;\n\n\n    CPDF_SecurityHandler*\tm_pSecurityHandler;\n\n    FX_BOOL\t\t\t\t\tm_bForceUseSecurityHandler;\n\n    CFX_ByteString\t\t\tm_bsRecipient;\n\n    CFX_ByteString\t\tm_FilePath;\n\n    CFX_ByteString\t\tm_Password;\n\n    CFX_FileSizeArray\tm_CrossRef;\n\n    CFX_ByteArray\t\tm_V5Type;\n\n    CFX_FileSizeArray\tm_SortedOffset;\n\n    CFX_WordArray\t\tm_ObjVersion;\n    CFX_ArrayTemplate<CPDF_Dictionary *>\tm_Trailers;\n\n    FX_BOOL\t\t\t\tm_bVersionUpdated;\n\n    CPDF_Object*\t\tm_pLinearized;\n\n    FX_DWORD\t\t\tm_dwFirstPageNo;\n\n    FX_DWORD\t\t\tm_dwXrefStartObjNum;\n    friend class\t\tCPDF_Creator;\n    friend class\t\tCPDF_DataAvail;\n};\n#define FXCIPHER_NONE\t0\n#define FXCIPHER_RC4\t1\n#define FXCIPHER_AES\t2\n#define FXCIPHER_AES2   3\nclass CPDF_SecurityHandler : public CFX_Object\n{\npublic:\n\n    virtual ~CPDF_SecurityHandler() {}\n\n    virtual FX_BOOL\t\tOnInit(CPDF_Parser* pParser, CPDF_Dictionary* pEncryptDict) = 0;\n\n    virtual FX_DWORD\tGetPermissions() = 0;\n\n    virtual FX_BOOL\t\tIsOwner() = 0;\n\n    virtual FX_BOOL\t\tGetCryptInfo(int& cipher, FX_LPCBYTE& buffer, int& keylen) = 0;\n\n    virtual FX_BOOL\t\tIsMetadataEncrypted()\n    {\n        return TRUE;\n    }\n\n    virtual CPDF_CryptoHandler*\tCreateCryptoHandler() = 0;\n\n    virtual CPDF_StandardSecurityHandler* GetStandardHandler()\n    {\n        return NULL;\n    }\n};\n#define PDF_ENCRYPT_CONTENT\t\t\t\t0\nclass CPDF_StandardSecurityHandler : public CPDF_SecurityHandler\n{\npublic:\n    CPDF_StandardSecurityHandler();\n\n    virtual ~CPDF_StandardSecurityHandler();\n    virtual FX_BOOL\t\tOnInit(CPDF_Parser* pParser, CPDF_Dictionary* pEncryptDict);\n    virtual FX_DWORD\tGetPermissions();\n    virtual FX_BOOL\t\tIsOwner()\n    {\n        return m_bOwner;\n    }\n    virtual FX_BOOL\t\tGetCryptInfo(int& cipher, FX_LPCBYTE& buffer, int& keylen);\n    virtual FX_BOOL\t\tIsMetadataEncrypted();\n    virtual CPDF_CryptoHandler*\tCreateCryptoHandler();\n    virtual CPDF_StandardSecurityHandler* GetStandardHandler()\n    {\n        return this;\n    }\n\n    void\t\t\t\tOnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,\n                                 FX_LPCBYTE user_pass, FX_DWORD user_size,\n                                 FX_LPCBYTE owner_pass, FX_DWORD owner_size, FX_DWORD type = PDF_ENCRYPT_CONTENT);\n\n    void\t\t\t\tOnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,\n                                 FX_LPCBYTE user_pass, FX_DWORD user_size, FX_DWORD type = PDF_ENCRYPT_CONTENT);\n\n    CFX_ByteString\t\tGetUserPassword(FX_LPCBYTE owner_pass, FX_DWORD pass_size);\n    CFX_ByteString\t\tGetUserPassword(FX_LPCBYTE owner_pass, FX_DWORD pass_size, FX_INT32 key_len);\n    int\t\t\t\t\tGetVersion()\n    {\n        return m_Version;\n    }\n    int\t\t\t\t\tGetRevision()\n    {\n        return m_Revision;\n    }\n\n    int\t\t\t\t\tCheckPassword(FX_LPCBYTE password, FX_DWORD pass_size, FX_BOOL bOwner, FX_LPBYTE key);\n    int\t\t\t\t\tCheckPassword(FX_LPCBYTE password, FX_DWORD pass_size, FX_BOOL bOwner, FX_LPBYTE key, int key_len);\nprivate:\n\n    int\t\t\t\t\tm_Version;\n\n    int\t\t\t\t\tm_Revision;\n\n    CPDF_Parser*\t\tm_pParser;\n\n    CPDF_Dictionary*\tm_pEncryptDict;\n\n    FX_BOOL\t\t\t\tLoadDict(CPDF_Dictionary* pEncryptDict);\n    FX_BOOL\t\t\t\tLoadDict(CPDF_Dictionary* pEncryptDict, FX_DWORD type, int& cipher, int& key_len);\n\n    FX_BOOL\t\t\t\tCheckUserPassword(FX_LPCBYTE password, FX_DWORD pass_size,\n                                          FX_BOOL bIgnoreEncryptMeta, FX_LPBYTE key, FX_INT32 key_len);\n\n    FX_BOOL\t\t\t\tCheckOwnerPassword(FX_LPCBYTE password, FX_DWORD pass_size, FX_LPBYTE key, FX_INT32 key_len);\n    FX_BOOL\t\t\t\tAES256_CheckPassword(FX_LPCBYTE password, FX_DWORD size, FX_BOOL bOwner, FX_LPBYTE key);\n    void\t\t\t\tAES256_SetPassword(CPDF_Dictionary* pEncryptDict, FX_LPCBYTE password, FX_DWORD size, FX_BOOL bOwner, FX_LPCBYTE key);\n    void\t\t\t\tAES256_SetPerms(CPDF_Dictionary* pEncryptDict, FX_DWORD permission, FX_BOOL bEncryptMetadata, FX_LPCBYTE key);\n    void\t\t\t\tOnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,\n                                 FX_LPCBYTE user_pass, FX_DWORD user_size,\n                                 FX_LPCBYTE owner_pass, FX_DWORD owner_size, FX_BOOL bDefault, FX_DWORD type);\n    FX_BOOL\t\t\t\tCheckSecurity(FX_INT32 key_len);\n\n    FX_BOOL\t\t\t\tm_bOwner;\n\n    FX_DWORD\t\t\tm_Permissions;\n\n    int\t\t\t\t\tm_Cipher;\n\n    FX_BYTE\t\t\t\tm_EncryptKey[32];\n\n    int\t\t\t\t\tm_KeyLen;\n};\nclass CPDF_CryptoHandler : public CFX_Object\n{\npublic:\n\n    virtual ~CPDF_CryptoHandler() {}\n\n    virtual FX_BOOL\t\tInit(CPDF_Dictionary* pEncryptDict, CPDF_SecurityHandler* pSecurityHandler) = 0;\n\n    virtual FX_DWORD\tDecryptGetSize(FX_DWORD src_size) = 0;\n\n    virtual FX_LPVOID\tDecryptStart(FX_DWORD objnum, FX_DWORD gennum) = 0;\n\n    virtual FX_BOOL\t\tDecryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf) = 0;\n\n    virtual FX_BOOL\t\tDecryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf) = 0;\n\n\n    virtual FX_DWORD\tEncryptGetSize(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size) = 0;\n\n    virtual FX_BOOL\t\tEncryptContent(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size,\n                                       FX_LPBYTE dest_buf, FX_DWORD& dest_size) = 0;\n\n    void\t\t\t\tDecrypt(FX_DWORD objnum, FX_DWORD version, CFX_ByteString& str);\n};\nclass CPDF_StandardCryptoHandler : public CPDF_CryptoHandler\n{\npublic:\n\n    CPDF_StandardCryptoHandler();\n\n    virtual ~CPDF_StandardCryptoHandler();\n\n    FX_BOOL\t\t\t\tInit(int cipher, FX_LPCBYTE key, int keylen);\n    virtual FX_BOOL\t\tInit(CPDF_Dictionary* pEncryptDict, CPDF_SecurityHandler* pSecurityHandler);\n    virtual FX_DWORD\tDecryptGetSize(FX_DWORD src_size);\n    virtual FX_LPVOID\tDecryptStart(FX_DWORD objnum, FX_DWORD gennum);\n    virtual FX_BOOL\t\tDecryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);\n    virtual FX_BOOL\t\tDecryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf);\n    virtual FX_DWORD\tEncryptGetSize(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size);\n    virtual FX_BOOL\t\tEncryptContent(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size,\n                                       FX_LPBYTE dest_buf, FX_DWORD& dest_size);\nprotected:\n\n    virtual void\t\tCryptBlock(FX_BOOL bEncrypt, FX_DWORD objnum, FX_DWORD gennum, FX_LPCBYTE src_buf, FX_DWORD src_size,\n                                   FX_LPBYTE dest_buf, FX_DWORD& dest_size);\n    virtual FX_LPVOID\tCryptStart(FX_DWORD objnum, FX_DWORD gennum, FX_BOOL bEncrypt);\n    virtual FX_BOOL\t\tCryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf, FX_BOOL bEncrypt);\n    virtual FX_BOOL\t\tCryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf, FX_BOOL bEncrypt);\n\n    FX_BYTE\t\t\t\tm_EncryptKey[32];\n\n    int\t\t\t\t\tm_KeyLen;\n\n    int\t\t\t\t\tm_Cipher;\n\n    FX_LPBYTE\t\t\tm_pAESContext;\n};\nclass CPDF_Point : public CFX_Object\n{\npublic:\n\n    CPDF_Point(FX_FLOAT xx, FX_FLOAT yy)\n    {\n        x = xx;\n        y = yy;\n    }\n\n    FX_FLOAT\t\t\tx;\n\n    FX_FLOAT\t\t\ty;\n};\n\n#define CPDF_Rect\t\tCFX_FloatRect\n#define CPDF_Matrix\t\tCFX_AffineMatrix\nCFX_ByteString PDF_NameDecode(FX_BSTR orig);\nCFX_ByteString PDF_NameDecode(const CFX_ByteString& orig);\nCFX_ByteString PDF_NameEncode(const CFX_ByteString& orig);\nCFX_ByteString PDF_EncodeString(const CFX_ByteString& src, FX_BOOL bHex = FALSE);\nCFX_WideString PDF_DecodeText(const CFX_ByteString& str, CFX_CharMap* pCharMap = NULL);\nCFX_WideString PDF_DecodeText(FX_LPCBYTE pData, FX_DWORD size, CFX_CharMap* pCharMap = NULL);\nCFX_ByteString PDF_EncodeText(FX_LPCWSTR pString, int len = -1, CFX_CharMap* pCharMap = NULL);\nFX_FLOAT PDF_ClipFloat(FX_FLOAT f);\nclass CFDF_Document : public CPDF_IndirectObjects\n{\npublic:\n\n    static CFDF_Document*\tCreateNewDoc();\n\n    static CFDF_Document*\tParseFile(FX_LPCSTR file_path);\n\n    static CFDF_Document*\tParseFile(FX_LPCWSTR file_path);\n\n    static CFDF_Document*\tParseFile(IFX_FileRead *pFile, FX_BOOL bOwnFile = FALSE);\n\n    static CFDF_Document*\tParseMemory(FX_LPCBYTE pData, FX_DWORD size);\n\n    ~CFDF_Document();\n\n    FX_BOOL\t\t\t\t\tWriteFile(FX_LPCSTR file_path) const;\n\n    FX_BOOL\t\t\t\t\tWriteFile(FX_LPCWSTR file_path) const;\n\n    FX_BOOL\t\t\t\t\tWriteFile(IFX_FileWrite *pFile) const;\n\n    FX_BOOL\t\t\t\t\tWriteBuf(CFX_ByteTextBuf& buf) const;\n\n    CPDF_Dictionary*\t\tGetRoot() const\n    {\n        return m_pRootDict;\n    }\n\n    CFX_WideString\t\t\tGetWin32Path() const;\nprotected:\n\n    CFDF_Document();\n    void\tParseStream(IFX_FileRead *pFile, FX_BOOL bOwnFile);\n    CPDF_Dictionary*\t\tm_pRootDict;\n    IFX_FileRead*\t\t\tm_pFile;\n    FX_BOOL\t\t\t\t\tm_bOwnFile;\n};\n\nCFX_WideString\tFPDF_FileSpec_GetWin32Path(const CPDF_Object* pFileSpec);\nvoid\t\t\tFPDF_FileSpec_SetWin32Path(CPDF_Object* pFileSpec, const CFX_WideString& fullpath);\n\nvoid FlateEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);\nFX_DWORD FlateDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);\nFX_DWORD RunLengthDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);\nclass CPDF_NumberTree : public CFX_Object\n{\npublic:\n\n    CPDF_NumberTree(CPDF_Dictionary* pRoot)\n    {\n        m_pRoot = pRoot;\n    }\n\n    CPDF_Object*\t\tLookupValue(int num);\nprotected:\n\n    CPDF_Dictionary*\tm_pRoot;\n};\n\nclass IFX_FileAvail\n{\npublic:\n\n    virtual FX_BOOL\t\t\tIsDataAvail( FX_FILESIZE offset, FX_DWORD size) = 0;\n};\nclass IFX_DownloadHints\n{\npublic:\n\n    virtual void\t\t\tAddSegment(FX_FILESIZE offset, FX_DWORD size) = 0;\n};\n#define PDF_IS_LINEARIZED\t\t\t1\n#define PDF_NOT_LINEARIZED\t\t\t0\n#define PDF_UNKNOW_LINEARIZED\t\t-1\n#define PDFFORM_NOTAVAIL\t\t0\n#define PDFFORM_AVAIL\t\t\t1\n#define PDFFORM_NOTEXIST\t\t2\nclass IPDF_DataAvail\n{\npublic:\n\n    virtual FX_BOOL\t\t\tIsDocAvail(IFX_DownloadHints* pHints) = 0;\n\n\n    virtual void\t\t\tSetDocument(CPDF_Document* pDoc) = 0;\n\n\n    virtual FX_BOOL\t\t\tIsPageAvail(int iPage, IFX_DownloadHints* pHints) = 0;\n\n    virtual FX_BOOL\t\t\tIsLinearized() = 0;\n\n    virtual FX_INT32\t\tIsFormAvail(IFX_DownloadHints *pHints) = 0;\n\n    virtual FX_INT32\t\tIsLinearizedPDF() = 0;\n\n    virtual void\t\t\t\tGetLinearizedMainXRefInfo(FX_FILESIZE *pPos, FX_DWORD *pSize) = 0;\n};\nclass CPDF_SortObjNumArray : public CFX_Object\n{\npublic:\n\n    void AddObjNum(FX_DWORD dwObjNum);\n\n    FX_BOOL Find(FX_DWORD dwObjNum);\n\n    void RemoveAll()\n    {\n        m_number_array.RemoveAll();\n    }\nprotected:\n\n    FX_BOOL BinarySearch(FX_DWORD value, int &iNext);\nprotected:\n\n    CFX_DWordArray\t\t\tm_number_array;\n};\nenum PDF_PAGENODE_TYPE {\n    PDF_PAGENODE_UNKOWN = 0,\n    PDF_PAGENODE_PAGE,\n    PDF_PAGENODE_PAGES,\n    PDF_PAGENODE_ARRAY,\n};\nclass CPDF_PageNode : public CFX_Object\n{\npublic:\n    CPDF_PageNode() : m_type(PDF_PAGENODE_UNKOWN) {}\n    ~CPDF_PageNode();\n    PDF_PAGENODE_TYPE\tm_type;\n    FX_DWORD\t\t\tm_dwPageNo;\n    CFX_PtrArray\t\tm_childNode;\n};\nenum PDF_DATAAVAIL_STATUS {\n    PDF_DATAAVAIL_HEADER = 0,\n    PDF_DATAAVAIL_FIRSTPAGE,\n    PDF_DATAAVAIL_FIRSTPAGE_PREPARE,\n    PDF_DATAAVAIL_END,\n    PDF_DATAAVAIL_CROSSREF,\n    PDF_DATAAVAIL_CROSSREF_ITEM,\n    PDF_DATAAVAIL_CROSSREF_STREAM,\n    PDF_DATAAVAIL_TRAILER,\n    PDF_DATAAVAIL_LOADALLCRSOSSREF,\n    PDF_DATAAVAIL_ROOT,\n    PDF_DATAAVAIL_INFO,\n    PDF_DATAAVAIL_ACROFORM,\n    PDF_DATAAVAIL_ACROFORM_SUBOBJECT,\n    PDF_DATAAVAIL_PAGETREE,\n    PDF_DATAAVAIL_PAGE,\n    PDF_DATAAVAIL_PAGE_LATERLOAD,\n    PDF_DATAAVAIL_RESOURCES,\n    PDF_DATAAVAIL_DONE,\n    PDF_DATAAVAIL_ERROR,\n    PDF_DATAAVAIL_LOADALLFILE,\n    PDF_DATAAVAIL_TRAILER_APPEND\n};\nclass CPDF_DataAvail FX_FINAL : public CFX_Object, public IPDF_DataAvail\n{\npublic:\n\n    CPDF_DataAvail(IFX_FileAvail* pFileAvail, IFX_FileRead* pFileRead);\n    ~CPDF_DataAvail();\n\n    virtual FX_BOOL\t\t\t\tIsDocAvail(IFX_DownloadHints* pHints);\n\n\n    virtual void\t\t\t\tSetDocument(CPDF_Document* pDoc);\n\n\n    virtual FX_BOOL\t\t\t\tIsPageAvail(int iPage, IFX_DownloadHints* pHints);\n\n    virtual FX_INT32\t\t\tIsFormAvail(IFX_DownloadHints *pHints);\n\n    virtual FX_INT32\t\t\tIsLinearizedPDF();\n\n    virtual FX_BOOL\t\t\t\tIsLinearized()\n    {\n        return m_bLinearized;\n    }\n\n    virtual void\t\t\t\tGetLinearizedMainXRefInfo(FX_FILESIZE *pPos, FX_DWORD *pSize);\n    IFX_FileRead*\t\t\t\tGetFileRead() const\n    {\n        return m_pFileRead;\n    }\n    IFX_FileAvail*\t\t\t\tGetFileAvail() const\n    {\n        return m_pFileAvail;\n    }\nprotected:\n    FX_DWORD\t\t\t\t\tGetObjectSize(FX_DWORD objnum, FX_FILESIZE& offset);\n    FX_BOOL\t\t\t\t\t\tIsObjectsAvail(CFX_PtrArray& obj_array, FX_BOOL bParsePage, IFX_DownloadHints* pHints, CFX_PtrArray &ret_array);\n    FX_BOOL\t\t\t\t\t\tCheckDocStatus(IFX_DownloadHints *pHints);\n    FX_BOOL\t\t\t\t\t\tCheckHeader(IFX_DownloadHints* pHints);\n    FX_BOOL\t\t\t\t\t\tCheckFirstPage(IFX_DownloadHints *pHints);\n    FX_BOOL\t\t\t\t\t\tCheckEnd(IFX_DownloadHints *pHints);\n    FX_BOOL\t\t\t\t\t\tCheckCrossRef(IFX_DownloadHints* pHints);\n    FX_BOOL\t\t\t\t\t\tCheckCrossRefItem(IFX_DownloadHints *pHints);\n    FX_BOOL\t\t\t\t\t\tCheckTrailer(IFX_DownloadHints* pHints);\n    FX_BOOL\t\t\t\t\t\tCheckRoot(IFX_DownloadHints* pHints);\n    FX_BOOL\t\t\t\t\t\tCheckInfo(IFX_DownloadHints* pHints);\n    FX_BOOL\t\t\t\t\t\tCheckPages(IFX_DownloadHints* pHints);\n    FX_BOOL\t\t\t\t\t\tCheckPage(IFX_DownloadHints* pHints);\n    FX_BOOL\t\t\t\t\t\tCheckResources(IFX_DownloadHints* pHints);\n    FX_BOOL\t\t\t\t\t\tCheckAnnots(IFX_DownloadHints* pHints);\n    FX_BOOL\t\t\t\t\t\tCheckAcroForm(IFX_DownloadHints* pHints);\n    FX_BOOL\t\t\t\t\t\tCheckAcroFormSubObject(IFX_DownloadHints* pHints);\n    FX_BOOL\t\t\t\t\t\tCheckTrailerAppend(IFX_DownloadHints* pHints);\n    FX_BOOL\t\t\t\t\t\tCheckPageStatus(IFX_DownloadHints* pHints);\n    FX_BOOL\t\t\t\t\t\tCheckAllCrossRefStream(IFX_DownloadHints *pHints);\n\n    FX_DWORD\t\t\t\t\tCheckCrossRefStream(IFX_DownloadHints *pHints, FX_FILESIZE &xref_offset);\n    FX_BOOL\t\t\t\t\t\tIsLinearizedFile(FX_LPBYTE pData, FX_DWORD dwLen);\n    void\t\t\t\t\t\tSetStartOffset(FX_FILESIZE dwOffset);\n    FX_BOOL\t\t\t\t\t\tGetNextToken(CFX_ByteString &token);\n    FX_BOOL\t\t\t\t\t\tGetNextChar(FX_BYTE &ch);\n    CPDF_Object\t*\t\t\t\tParseIndirectObjectAt(FX_FILESIZE pos, FX_DWORD objnum);\n    CPDF_Object\t*\t\t\t\tGetObject(FX_DWORD objnum, IFX_DownloadHints* pHints, FX_BOOL *pExistInFile);\n    FX_BOOL\t\t\t\t\t\tGetPageKids(CPDF_Parser *pParser, CPDF_Object *pPages);\n    FX_BOOL\t\t\t\t\t\tPreparePageItem();\n    FX_BOOL\t\t\t\t\t\tLoadPages(IFX_DownloadHints* pHints);\n    FX_BOOL\t\t\t\t\t\tLoadAllXref(IFX_DownloadHints* pHints);\n    FX_BOOL\t\t\t\t\t\tLoadAllFile(IFX_DownloadHints* pHints);\n    FX_BOOL\t\t\t\t\t\tCheckLinearizedData(IFX_DownloadHints* pHints);\n    FX_BOOL\t\t\t\t\t\tCheckFileResources(IFX_DownloadHints* pHints);\n    FX_BOOL\t\t\t\t\t\tCheckPageAnnots(int iPage, IFX_DownloadHints* pHints);\n\n    FX_BOOL\t\t\t\t\t\tCheckLinearizedFirstPage(int iPage, IFX_DownloadHints* pHints);\n    FX_BOOL\t\t\t\t\t\tHaveResourceAncestor(CPDF_Dictionary *pDict);\n    FX_BOOL\t\t\t\t\t\tCheckPage(FX_INT32 iPage, IFX_DownloadHints* pHints);\n    FX_BOOL\t\t\t\t\t\tLoadDocPages(IFX_DownloadHints* pHints);\n    FX_BOOL\t\t\t\t\t\tLoadDocPage(FX_INT32 iPage, IFX_DownloadHints* pHints);\n    FX_BOOL\t\t\t\t\t\tCheckPageNode(CPDF_PageNode &pageNodes, FX_INT32 iPage, FX_INT32 &iCount, IFX_DownloadHints* pHints);\n    FX_BOOL\t\t\t\t\t\tCheckUnkownPageNode(FX_DWORD dwPageNo, CPDF_PageNode *pPageNode, IFX_DownloadHints* pHints);\n    FX_BOOL\t\t\t\t\t\tCheckArrayPageNode(FX_DWORD dwPageNo, CPDF_PageNode *pPageNode, IFX_DownloadHints* pHints);\n    FX_BOOL                     CheckPageCount(IFX_DownloadHints* pHints);\n    FX_BOOL\t\t\t\t\t\tIsFirstCheck(int iPage);\n    void\t\t\t\t\t\tResetFirstCheck(int iPage);\n\n    CPDF_Parser\t\t\t\tm_parser;\n\n    CPDF_SyntaxParser\t\tm_syntaxParser;\n\n    CPDF_Object\t\t\t\t*m_pRoot;\n\n    FX_DWORD\t\t\t\tm_dwRootObjNum;\n\n    FX_DWORD\t\t\t\tm_dwInfoObjNum;\n\n    CPDF_Object\t\t\t\t*m_pLinearized;\n\n    CPDF_Object\t\t\t\t*m_pTrailer;\n\n    FX_BOOL\t\t\t\t\tm_bDocAvail;\n\n    FX_FILESIZE\t\t\t\tm_dwHeaderOffset;\n\n    FX_FILESIZE\t\t\t\tm_dwLastXRefOffset;\n\n    FX_FILESIZE\t\t\t\tm_dwXRefOffset;\n\n    FX_FILESIZE\t\t\t\tm_dwTrailerOffset;\n\n    FX_FILESIZE\t\t\t\tm_dwCurrentOffset;\n\n    PDF_DATAAVAIL_STATUS\tm_docStatus;\n\n    IFX_FileAvail*\t\t\tm_pFileAvail;\n\n    IFX_FileRead*\t\t\tm_pFileRead;\n\n    FX_FILESIZE\t\t\t\tm_dwFileLen;\n\n    CPDF_Document*\t\t\tm_pDocument;\n\n    CPDF_SortObjNumArray\tm_objnum_array;\n\n    CFX_PtrArray\t\t\tm_objs_array;\n\n    FX_FILESIZE\t\t\t\tm_Pos;\n\n    FX_FILESIZE\t\t\t\tm_bufferOffset;\n\n    FX_DWORD\t\t\t\tm_bufferSize;\n\n    CFX_ByteString\t\t\tm_WordBuf;\n\n    FX_BYTE\t\t\t\t\tm_WordBuffer[257];\n\n    FX_DWORD\t\t\t\tm_WordSize;\n\n    FX_BYTE\t\t\t\t\tm_bufferData[512];\n\n    CFX_FileSizeArray\t\tm_CrossOffset;\n\n    CFX_DWordArray\t\t\tm_XRefStreamList;\n\n    CFX_DWordArray\t\t\tm_PageObjList;\n\n    FX_DWORD\t\t\t\tm_PagesObjNum;\n\n    FX_BOOL\t\t\t\t\tm_bLinearized;\n\n    FX_DWORD\t\t\t\tm_dwFirstPageNo;\n\n    FX_BOOL\t\t\t\t\tm_bLinearedDataOK;\n\n    FX_BOOL\t\t\t\t\tm_bMainXRefLoad;\n\n    FX_BOOL\t\t\t\t\tm_bMainXRefLoadedOK;\n\n    FX_BOOL\t\t\t\t\tm_bPagesTreeLoad;\n\n    FX_BOOL\t\t\t\t\tm_bPagesLoad;\n\n    CPDF_Parser *\t\t\tm_pCurrentParser;\n\n    FX_FILESIZE\t\t\t\tm_dwCurrentXRefSteam;\n\n    FX_BOOL\t\t\t\t\tm_bAnnotsLoad;\n\n    FX_BOOL\t\t\t\t\tm_bHaveAcroForm;\n\n    FX_DWORD\t\t\t\tm_dwAcroFormObjNum;\n\n    FX_BOOL\t\t\t\t\tm_bAcroFormLoad;\n\n    CPDF_Object\t*\t\t\tm_pAcroForm;\n\n    CFX_PtrArray\t\t\tm_arrayAcroforms;\n\n    CPDF_Dictionary *\t\tm_pPageDict;\n\n    CPDF_Object *\t\t\tm_pPageResource;\n\n    FX_BOOL\t\t\t\t\tm_bNeedDownLoadResource;\n\n    FX_BOOL\t\t\t\t\tm_bPageLoadedOK;\n\n    FX_BOOL\t\t\t\t\tm_bLinearizedFormParamLoad;\n\n    CFX_PtrArray\t\t\tm_PagesArray;\n\n    FX_DWORD\t\t\t\tm_dwEncryptObjNum;\n\n    FX_FILESIZE\t\t\t\tm_dwPrevXRefOffset;\n\n    FX_BOOL\t\t\t\t\tm_bTotalLoadPageTree;\n\n    FX_BOOL\t\t\t\t\tm_bCurPageDictLoadOK;\n\n    CPDF_PageNode\t\t\tm_pageNodes;\n\n    CFX_CMapDWordToDWord *\tm_pageMapCheckState;\n\n    CFX_CMapDWordToDWord *\tm_pagesLoadState;\n};\n#endif\n"
  },
  {
    "path": "core/include/fpdfapi/fpdf_render.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDF_RENDER_\n#define _FPDF_RENDER_\n#ifndef _FPDF_PAGE_\n#include \"fpdf_page.h\"\n#endif\n#ifndef _FX_GE_H_\n#include \"../fxge/fx_ge.h\"\n#endif\nclass CPDF_RenderContext;\nclass CPDF_RenderOptions;\nclass CPDF_ImageCache;\nclass IPDF_OCContext;\nclass CPDF_QuickStretcher;\nclass CFX_PathData;\nclass CFX_GraphStateData;\nclass CFX_RenderDevice;\nclass CPDF_TextObject;\nclass CPDF_PathObject;\nclass CPDF_ImageObject;\nclass CPDF_ShadingObject;\nclass CPDF_FormObject;\nclass IPDF_OCContext\n{\npublic:\n\n    virtual ~IPDF_OCContext() {}\n\n    virtual FX_BOOL\tCheckOCGVisible(const CPDF_Dictionary* pOCG) = 0;\n\n    FX_BOOL CheckObjectVisible(const CPDF_PageObject* pObj);\n};\n#define RENDER_COLOR_NORMAL\t\t0\n#define RENDER_COLOR_GRAY\t\t1\n#define RENDER_COLOR_TWOCOLOR\t2\n#define RENDER_COLOR_ALPHA\t\t3\n#define RENDER_CLEARTYPE\t\t\t0x00000001\n#define RENDER_PRINTGRAPHICTEXT\t\t0x00000002\n#define RENDER_FORCE_DOWNSAMPLE\t\t0x00000004\n#define RENDER_PRINTPREVIEW\t\t\t0x00000008\n#define RENDER_BGR_STRIPE\t\t\t0x00000010\n#define RENDER_NO_NATIVETEXT\t\t0x00000020\n#define RENDER_FORCE_HALFTONE\t\t0x00000040\n#define RENDER_RECT_AA\t\t\t\t0x00000080\n#define RENDER_FILL_FULLCOVER\t\t0x00000100\n#define RENDER_PRINTIMAGETEXT       0x00000200\n#define RENDER_OVERPRINT            0x00000400\n#define RENDER_THINLINE             0x00000800\n#define RENDER_NOTEXTSMOOTH\t\t\t0x10000000\n#define RENDER_NOPATHSMOOTH\t\t\t0x20000000\n#define RENDER_NOIMAGESMOOTH\t\t0x40000000\n#define RENDER_LIMITEDIMAGECACHE\t0x80000000\nclass CPDF_RenderOptions : public CFX_Object\n{\npublic:\n\n    CPDF_RenderOptions();\n\n    int\t\t\t\tm_ColorMode;\n\n    FX_COLORREF\t\tm_BackColor;\n\n    FX_COLORREF\t\tm_ForeColor;\n\n    FX_DWORD\t\tm_Flags;\n\n    int\t\t\t\tm_Interpolation;\n\n    FX_DWORD\t\tm_AddFlags;\n\n    IPDF_OCContext*\tm_pOCContext;\n\n    FX_DWORD\t\tm_dwLimitCacheSize;\n\n    int\t\t\t\tm_HalftoneLimit;\n\n    FX_ARGB\t\t\tTranslateColor(FX_ARGB argb) const;\n};\nclass CPDF_RenderContext : public CFX_Object\n{\npublic:\n\n    CPDF_RenderContext();\n\n    void\t\t\tCreate(CPDF_Page* pPage, FX_BOOL bFirstLayer = TRUE);\n\n    void\t\t\tCreate(CPDF_Document* pDoc = NULL, CPDF_PageRenderCache* pPageCache = NULL,\n                           CPDF_Dictionary* pPageResources = NULL, FX_BOOL bFirstLayer = TRUE);\n\n    ~CPDF_RenderContext();\n\n    void\t\t\tClear();\n\n    void\t\t\tAppendObjectList(CPDF_PageObjects* pObjs, const CFX_AffineMatrix* pObject2Device);\n\n    void\t\t\tSetBackground(class IPDF_BackgroundDraw* pBackground);\n\n    void\t\t\tRender(CFX_RenderDevice* pDevice, const CPDF_RenderOptions* pOptions = NULL,\n                           const CFX_AffineMatrix* pFinalMatrix = NULL);\n\n    void\t\t\tDrawObjectList(CFX_RenderDevice* pDevice, CPDF_PageObjects* pObjs,\n                                   const CFX_AffineMatrix* pObject2Device, const CPDF_RenderOptions* pOptions);\n\n    void\t\t\tGetBackground(CFX_DIBitmap* pBuffer, const CPDF_PageObject* pObj,\n                                  const CPDF_RenderOptions* pOptions, CFX_AffineMatrix* pFinalMatrix);\n\n    CPDF_PageRenderCache*\tGetPageCache() const\n    {\n        return m_pPageCache;\n    }\n\n\n\n    CPDF_Document*\t\t\tm_pDocument;\n\n    CPDF_Dictionary*\t\tm_pPageResources;\n\n    CPDF_PageRenderCache*\tm_pPageCache;\n\nprotected:\n\n    CFX_ArrayTemplate<struct _PDF_RenderItem>\tm_ContentList;\n\n    IPDF_BackgroundDraw*\tm_pBackgroundDraw;\n\n    FX_BOOL\t\t\t\t\tm_bFirstLayer;\n\n    void\t\t\tRender(CFX_RenderDevice* pDevice, const CPDF_PageObject* pStopObj,\n                           const CPDF_RenderOptions* pOptions, const CFX_AffineMatrix* pFinalMatrix);\n    friend class CPDF_RenderStatus;\n    friend class CPDF_ProgressiveRenderer;\n};\nclass IPDF_BackgroundDraw\n{\npublic:\n\n    virtual\tvoid\tOnDrawBackground(\n        CFX_RenderDevice* pBitmapDevice,\n        const CFX_AffineMatrix* pOriginal2Bitmap\n    ) = 0;\n};\nclass CPDF_ProgressiveRenderer : public CFX_Object\n{\npublic:\n\n    CPDF_ProgressiveRenderer();\n\n    ~CPDF_ProgressiveRenderer();\n\n    typedef enum {\n        Ready,\n        ToBeContinued,\n        Done,\n        Failed\n    } RenderStatus;\n\n    RenderStatus\t\tGetStatus()\n    {\n        return m_Status;\n    }\n\n\n\n    void\t\t\t\tStart(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice,\n                              const CPDF_RenderOptions* pOptions, class IFX_Pause* pPause, FX_BOOL bDropObjects = FALSE);\n\n    void\t\t\t\tContinue(class IFX_Pause* pPause);\n\n\n    int\t\t\t\t\tEstimateProgress();\n\n    void\t\t\t\tClear();\nprotected:\n\n    RenderStatus\t\tm_Status;\n\n    CPDF_RenderContext*\tm_pContext;\n\n    CFX_RenderDevice*\tm_pDevice;\n\n    const CPDF_RenderOptions*\tm_pOptions;\n\n    FX_BOOL\t\t\t\tm_bDropObjects;\n\n    class CPDF_RenderStatus*\tm_pRenderer;\n\n    CFX_FloatRect\t\tm_ClipRect;\n\n    FX_DWORD\t\t\tm_LayerIndex;\n\n    FX_DWORD\t\t\tm_ObjectIndex;\n\n    FX_POSITION\t\t\tm_ObjectPos;\n\n    FX_POSITION\t\t\tm_PrevLastPos;\n\n    void\t\t\t\tRenderStep();\n};\nclass CPDF_TextRenderer : public CFX_Object\n{\npublic:\n\n    static void\t\tDrawTextString(CFX_RenderDevice* pDevice, int left, int top,\n                                   CPDF_Font* pFont,\n                                   int height,\n                                   const CFX_ByteString& str,\n                                   FX_ARGB argb);\n\n    static void\t\tDrawTextString(CFX_RenderDevice* pDevice, FX_FLOAT origin_x, FX_FLOAT origin_y,\n                                   CPDF_Font* pFont,\n                                   FX_FLOAT font_size,\n                                   const CFX_AffineMatrix* matrix,\n                                   const CFX_ByteString& str,\n                                   FX_ARGB fill_argb,\n                                   FX_ARGB stroke_argb = 0,\n                                   const CFX_GraphStateData* pGraphState = NULL,\n                                   const CPDF_RenderOptions* pOptions = NULL\n                               );\n\n    static FX_BOOL\tDrawTextPath(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos,\n                                 CPDF_Font* pFont, FX_FLOAT font_size,\n                                 const CFX_AffineMatrix* pText2User, const CFX_AffineMatrix* pUser2Device,\n                                 const CFX_GraphStateData* pGraphState,\n                                 FX_ARGB fill_argb, FX_ARGB stroke_argb, CFX_PathData* pClippingPath, int nFlag = 0);\n\n    static FX_BOOL\tDrawNormalText(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos,\n                                   CPDF_Font* pFont, FX_FLOAT font_size, const CFX_AffineMatrix* pText2Device,\n                                   FX_ARGB fill_argb, const CPDF_RenderOptions* pOptions);\n\n    static FX_BOOL\tDrawType3Text(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos,\n                                  CPDF_Font* pFont, FX_FLOAT font_size, const CFX_AffineMatrix* pText2Device,\n                                  FX_ARGB fill_argb);\n};\nclass IPDF_PageImageCache\n{\npublic:\n\n    static IPDF_PageImageCache* Create();\n\n    virtual ~IPDF_PageImageCache() {}\n\n    virtual void\t\tOutputPage(CFX_RenderDevice* pDevice, CPDF_Page* pPage,\n                                   int pos_x, int pos_y, int size_x, int size_y, int rotate) = 0;\n\n    virtual void\t\tSetCacheLimit(FX_DWORD limit) = 0;\n};\nclass CPDF_PageRenderCache : public CFX_Object\n{\npublic:\n    CPDF_PageRenderCache(CPDF_Page* pPage)\n    {\n        m_pPage = pPage;\n        m_nTimeCount = 0;\n        m_nCacheSize = 0;\n        m_pCurImageCache = NULL;\n        m_bCurFindCache = FALSE;\n        m_pCurImageCaches = NULL;\n    }\n    ~CPDF_PageRenderCache()\n    {\n        ClearAll();\n    }\n    void\t\t\t\tClearAll();\n    void\t\t\t\tClearImageData();\n\n    FX_DWORD\t\t\tEstimateSize();\n    void\t\t\t\tCacheOptimization(FX_INT32 dwLimitCacheSize);\n    FX_DWORD\t\t\tGetCachedSize(CPDF_Stream* pStream) const;\n    FX_DWORD\t\t\tGetTimeCount() const\n    {\n        return m_nTimeCount;\n    }\n    void\t\t\t\tSetTimeCount(FX_DWORD dwTimeCount)\n    {\n        m_nTimeCount = dwTimeCount;\n    }\n\n    void\t\t\t\tGetCachedBitmap(CPDF_Stream* pStream, CFX_DIBSource*& pBitmap, CFX_DIBSource*& pMask, FX_DWORD& MatteColor,\n                                        FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE,\n                                        CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 downsampleWidth = 0, FX_INT32 downsampleHeight = 0);\n\n    void\t\t\t\tResetBitmap(CPDF_Stream* pStream, const CFX_DIBitmap* pBitmap);\n    void\t\t\t\tClearImageCache(CPDF_Stream* pStream);\n    CPDF_Page*\t\t\tGetPage()\n    {\n        return m_pPage;\n    }\n    CFX_MapPtrToPtr\t\tm_ImageCaches;\npublic:\n    FX_BOOL\t\t\t\tStartGetCachedBitmap(CPDF_Stream* pStream, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0,\n            FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL,\n            FX_INT32 downsampleWidth = 0, FX_INT32 downsampleHeight = 0);\n\n    FX_BOOL\t\t\t\tContinue(IFX_Pause* pPause);\n    CPDF_ImageCache*\tm_pCurImageCache;\n    CFX_PtrArray*       m_pCurImageCaches;\nprotected:\n    friend class\t\tCPDF_Page;\n    CPDF_Page*\t\t\tm_pPage;\n\n    FX_DWORD\t\t\tm_nTimeCount;\n    FX_DWORD\t\t\tm_nCacheSize;\n    FX_BOOL\t\t\t\tm_bCurFindCache;\n};\nclass CPDF_RenderConfig : public CFX_Object\n{\npublic:\n    CPDF_RenderConfig();\n    ~CPDF_RenderConfig();\n    int\t\t\t\t\tm_HalftoneLimit;\n    int\t\t\t\t\tm_RenderStepLimit;\n};\n#endif\n"
  },
  {
    "path": "core/include/fpdfapi/fpdf_resource.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDF_RESOURCE_\n#define _FPDF_RESOURCE_\n#ifndef _FPDF_PARSER_\n#include \"fpdf_parser.h\"\n#endif\n#ifndef _FX_FONT_H_\n#include \"../fxge/fx_font.h\"\n#endif\nclass CPDF_Font;\nclass CPDF_Type1Font;\nclass CPDF_TrueTypeFont;\nclass CPDF_CIDFont;\nclass CPDF_Type3Font;\nclass CPDF_FontEncoding;\nclass CPDF_CMap;\nclass CPDF_CID2UnicodeMap;\nclass CPDF_ColorSpace;\nclass CPDF_Color;\nclass CPDF_Function;\nclass CPDF_Pattern;\nclass CPDF_TilingPattern;\nclass CPDF_ShadingPattern;\nclass CPDF_Image;\nclass CPDF_Face;\nclass CPDF_ToUnicodeMap;\nclass CFX_SubstFont;\nclass CFX_Font;\nclass CPDF_RenderContext;\nclass CPDF_Form;\nclass CPDF_ImageObject;\nclass CFX_DIBitmap;\ntypedef struct FT_FaceRec_* FXFT_Face;\nclass CFX_CTTGSUBTable;\nclass CPDF_Page;\n#define PDFFONT_TYPE1\t\t\t1\n#define PDFFONT_TRUETYPE\t\t2\n#define PDFFONT_TYPE3\t\t\t3\n#define PDFFONT_CIDFONT\t\t\t4\n#define PDFFONT_FIXEDPITCH\t\t1\n#define PDFFONT_SERIF\t\t\t2\n#define PDFFONT_SYMBOLIC\t\t4\n#define PDFFONT_SCRIPT\t\t\t8\n#define PDFFONT_NONSYMBOLIC\t\t32\n#define PDFFONT_ITALIC\t\t\t64\n#define PDFFONT_ALLCAP\t\t\t0x10000\n#define PDFFONT_SMALLCAP\t\t0x20000\n#define PDFFONT_FORCEBOLD\t\t0x40000\n#define PDFFONT_USEEXTERNATTR\t0x80000\nFX_WCHAR PDF_UnicodeFromAdobeName(const FX_CHAR* name);\nCFX_ByteString PDF_AdobeNameFromUnicode(FX_WCHAR unicode);\nclass CPDF_Font : public CFX_Object\n{\npublic:\n\n    static CPDF_Font*\t\tCreateFontF(CPDF_Document* pDoc, CPDF_Dictionary* pFontDict);\n\n    static CPDF_Font*\t\tGetStockFont(CPDF_Document* pDoc, FX_BSTR fontname);\n\n    virtual ~CPDF_Font();\n\n\n\n\n    int\t\t\t\t\t\tGetFontType() const\n    {\n        return m_FontType;\n    }\n\n    CFX_ByteString\t\t\tGetFontTypeName() const;\n\n    const CFX_ByteString&\tGetBaseFont() const\n    {\n        return m_BaseFont;\n    }\n\n    const CFX_SubstFont*\tGetSubstFont() const\n    {\n        return m_Font.GetSubstFont();\n    }\n\n    FX_DWORD\t\t\t\tGetFlags() const\n    {\n        return m_Flags;\n    }\n\n    virtual FX_BOOL\t\t\tIsVertWriting()const;\n\n\n\n\n    CPDF_Type1Font*\t\t\tGetType1Font() const\n    {\n        return m_FontType == PDFFONT_TYPE1 ? (CPDF_Type1Font*)(void*)this : NULL;\n    }\n\n    CPDF_TrueTypeFont*\t\tGetTrueTypeFont() const\n    {\n        return m_FontType == PDFFONT_TRUETYPE ? (CPDF_TrueTypeFont*)(void*)this : NULL;\n    }\n\n    CPDF_CIDFont*\t\t\tGetCIDFont() const\n    {\n        return (m_FontType == PDFFONT_CIDFONT) ? (CPDF_CIDFont*)(void*)this : NULL;\n    }\n\n    CPDF_Type3Font*\t\t\tGetType3Font() const\n    {\n        return (m_FontType == PDFFONT_TYPE3) ? (CPDF_Type3Font*)(void*)this : NULL;\n    }\n\n\n    FX_BOOL\t\t\t\t\tIsEmbedded() const\n    {\n        return m_FontType == PDFFONT_TYPE3 || m_pFontFile != NULL;\n    }\n\n    virtual FX_BOOL\t\t\tIsUnicodeCompatible() const\n    {\n        return FALSE;\n    }\n\n    CPDF_StreamAcc*\t\t\tGetFontFile() const\n    {\n        return m_pFontFile;\n    }\n\n    CPDF_Dictionary*\t\tGetFontDict() const\n    {\n        return m_pFontDict;\n    }\n\n    FX_BOOL\t\t\t\t\tIsStandardFont() const;\n\n    FXFT_Face\t\t\t\tGetFace() const\n    {\n        return m_Font.GetFace();\n    }\n\n\n\n    virtual FX_DWORD\t\tGetNextChar(FX_LPCSTR pString, int& offset) const\n    {\n        return (FX_BYTE)pString[offset++];\n    }\n\n    virtual int\t\t\t\tCountChar(FX_LPCSTR pString, int size) const\n    {\n        return size;\n    }\n\n    void\t\t\t\t\tAppendChar(CFX_ByteString& str, FX_DWORD charcode) const;\n\n    virtual int\t\t\t\tAppendChar(FX_LPSTR buf, FX_DWORD charcode) const\n    {\n        *buf = (FX_CHAR)charcode;\n        return 1;\n    }\n\n    virtual int\t\t\t\tGetCharSize(FX_DWORD charcode) const\n    {\n        return 1;\n    }\n\n\n\n\n    virtual int\t\t\t\tGlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph = NULL) = 0;\n    virtual int\t\t\t\tGlyphFromCharCodeExt(FX_DWORD charcode)\n    {\n        return GlyphFromCharCode(charcode);\n    }\n\n    CFX_WideString\t\t\tUnicodeFromCharCode(FX_DWORD charcode) const;\n\n    FX_DWORD\t\t\t\tCharCodeFromUnicode(FX_WCHAR Unicode) const;\n\n    CFX_CharMap*\t\t\tGetCharMap()\n    {\n        return m_pCharMap;\n    }\n\n    CFX_ByteString\t\t\tEncodeString(const CFX_WideString& str) const;\n\n    CFX_WideString\t\t\tDecodeString(const CFX_ByteString& str) const;\n\n\n\n\n    void\t\t\t\t\tGetFontBBox(FX_RECT& rect) const\n    {\n        rect = m_FontBBox;\n    }\n\n    int\t\t\t\t\t\tGetTypeAscent() const\n    {\n        return m_Ascent;\n    }\n\n    int\t\t\t\t\t\tGetTypeDescent() const\n    {\n        return m_Descent;\n    }\n\n    int\t\t\t\t\t\tGetItalicAngle() const\n    {\n        return m_ItalicAngle;\n    }\n\n    int\t\t\t\t\t\tGetStemV() const\n    {\n        return m_StemV;\n    }\n\n    int\t\t\t\t\t\tGetStringWidth(const FX_CHAR* pString, int size);\n\n    virtual int\t\t\t\tGetCharWidthF(FX_DWORD charcode, int level = 0) = 0;\n\n    virtual int\t\t\t\tGetCharTypeWidth(FX_DWORD charcode);\n\n    virtual void\t\t\tGetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0) = 0;\n\n\n\n    CPDF_Document*\t\t\tm_pDocument;\n\n    class CFX_PathData*\t\tLoadGlyphPath(FX_DWORD charcode, int dest_width = 0);\n\n    CFX_Font\t\t\t\tm_Font;\nprotected:\n\n    CPDF_Font();\n\n    FX_BOOL\t\t\t\t\tInitialize();\n\n    FX_BOOL\t\t\t\t\tLoad();\n\n    virtual FX_BOOL\t\t\t_Load() = 0;\n\n    virtual FX_WCHAR\t\t_UnicodeFromCharCode(FX_DWORD charcode) const = 0;\n\n    virtual FX_DWORD\t\t_CharCodeFromUnicode(FX_WCHAR Unicode) const = 0;\n\n    void\t\t\t\t\tLoadUnicodeMap();\n\n    void\t\t\t\t\tLoadPDFEncoding(CPDF_Object* pEncoding, int& iBaseEncoding,\n                                            CFX_ByteString*& pCharNames, FX_BOOL bEmbedded, FX_BOOL bTrueType);\n\n    void\t\t\t\t\tLoadFontDescriptor(CPDF_Dictionary*);\n\n    void\t\t\t\t\tLoadCharWidths(FX_WORD* pWidths);\n\n    void\t\t\t\t\tCheckFontMetrics();\n\n    CFX_CharMap*\t\t\tm_pCharMap;\n\n\n\n    int\t\t\t\t\t\tm_FontType;\n\n    CFX_ByteString\t\t\tm_BaseFont;\n\n    CPDF_StreamAcc*\t\t\tm_pFontFile;\n\n    CPDF_Dictionary*\t\tm_pFontDict;\n\n    CPDF_ToUnicodeMap*\t\tm_pToUnicodeMap;\n\n    FX_BOOL\t\t\t\t\tm_bToUnicodeLoaded;\n\n\n\n\n    int\t\t\t\t\t\tm_Flags;\n\n    FX_RECT\t\t\t\t\tm_FontBBox;\n\n    int\t\t\t\t\t\tm_StemV;\n\n    int\t\t\t\t\t\tm_Ascent;\n\n    int\t\t\t\t\t\tm_Descent;\n\n    int\t\t\t\t\t\tm_ItalicAngle;\n\n};\n#define PDFFONT_ENCODING_BUILTIN\t\t0\n#define PDFFONT_ENCODING_WINANSI\t\t1\n#define PDFFONT_ENCODING_MACROMAN\t\t2\n#define PDFFONT_ENCODING_MACEXPERT\t\t3\n#define PDFFONT_ENCODING_STANDARD\t\t4\n#define PDFFONT_ENCODING_ADOBE_SYMBOL\t5\n#define PDFFONT_ENCODING_ZAPFDINGBATS\t6\n#define PDFFONT_ENCODING_PDFDOC\t\t\t7\n#define PDFFONT_ENCODING_MS_SYMBOL\t\t8\n#define PDFFONT_ENCODING_UNICODE\t\t9\nclass CPDF_FontEncoding : public CFX_Object\n{\npublic:\n\n    CPDF_FontEncoding();\n\n    CPDF_FontEncoding(int PredefinedEncoding);\n\n    void\t\t\t\t\tLoadEncoding(CPDF_Object* pEncoding);\n\n    FX_BOOL\t\t\t\t\tIsIdentical(CPDF_FontEncoding* pAnother) const;\n\n    FX_WCHAR\t\t\t\tUnicodeFromCharCode(FX_BYTE charcode) const\n    {\n        return m_Unicodes[charcode];\n    }\n\n    int\t\t\t\t\t\tCharCodeFromUnicode(FX_WCHAR unicode) const;\n\n    void\t\t\t\t\tSetUnicode(FX_BYTE charcode, FX_WCHAR unicode)\n    {\n        m_Unicodes[charcode] = unicode;\n    }\n\n    CPDF_Object*\t\t\tRealize();\npublic:\n\n    FX_WCHAR\t\t\t\tm_Unicodes[256];\n};\nclass CPDF_SimpleFont : public CPDF_Font\n{\npublic:\n\n    CPDF_SimpleFont();\n\n    virtual ~CPDF_SimpleFont();\n\n    CPDF_FontEncoding*\t\tGetEncoding()\n    {\n        return &m_Encoding;\n    }\n    virtual int\t\t\t\tGetCharWidthF(FX_DWORD charcode, int level = 0);\n    virtual void\t\t\tGetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0);\n    virtual int\t\t\t\tGlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph = NULL);\n    virtual FX_BOOL\t\t\tIsUnicodeCompatible() const;\nprotected:\n\n    FX_BOOL\t\t\t\t\tLoadCommon();\n\n    void\t\t\t\t\tLoadSubstFont();\n\n    void\t\t\t\t\tLoadFaceMetrics();\n\n    virtual void\t\t\tLoadGlyphMap() = 0;\n    virtual FX_WCHAR\t\t_UnicodeFromCharCode(FX_DWORD charcode) const\n    {\n        return m_Encoding.UnicodeFromCharCode((FX_BYTE)charcode);\n    }\n    virtual FX_DWORD\t\t_CharCodeFromUnicode(FX_WCHAR Unicode) const\n    {\n        return m_Encoding.CharCodeFromUnicode(Unicode);\n    }\n\n\n\n    CPDF_FontEncoding\t\tm_Encoding;\n\n    FX_WORD\t\t\t\t\tm_GlyphIndex[256];\n    FX_WORD\t\t\t\t\tm_ExtGID[256];\n\n\n\n\n    CFX_ByteString*\t\t\tm_pCharNames;\n\n    int\t\t\t\t\t\tm_BaseEncoding;\n\n\n\n\n    FX_WORD\t\t\t\t\tm_CharWidth[256];\n\n    FX_SMALL_RECT\t\t\tm_CharBBox[256];\n\n    FX_BOOL\t\t\t\t\tm_bUseFontWidth;\n\n    void\t\t\t\t\tLoadCharMetrics(int charcode);\n\n};\nclass CPDF_Type1Font : public CPDF_SimpleFont\n{\npublic:\n\n    CPDF_Type1Font();\n\n    int\t\t\t\t\t\tGetBase14Font()\n    {\n        return m_Base14Font;\n    }\n    virtual int\t\t\t\tGlyphFromCharCodeExt(FX_DWORD charcode);\nprotected:\n    virtual FX_BOOL\t\t\t_Load();\n\n    int\t\t\t\t\t\tm_Base14Font;\n    virtual void\t\t\tLoadGlyphMap();\n};\nclass CPDF_TrueTypeFont : public CPDF_SimpleFont\n{\npublic:\n\n    CPDF_TrueTypeFont();\nprotected:\n    virtual FX_BOOL\t\t\t_Load();\n    virtual void\t\t\tLoadGlyphMap();\n};\nclass CPDF_Type3Char : public CFX_Object\n{\npublic:\n\n    CPDF_Type3Char();\n\n    ~CPDF_Type3Char();\n\n    FX_BOOL LoadBitmap(CPDF_RenderContext* pContext);\n\n    FX_BOOL\t\t\t\t\tm_bColored;\n\n    FX_BOOL\t\t\t\t\tm_bPageRequired;\n\n\n\n    CPDF_Form*\t\t\t\tm_pForm;\n\n    CFX_AffineMatrix\t\tm_ImageMatrix;\n\n    CFX_DIBitmap*\t\t\tm_pBitmap;\n\n\n    int\t\t\t\t\t\tm_Width;\n\n    FX_RECT\t\t\t\t\tm_BBox;\n};\nclass CPDF_Type3Font : public CPDF_SimpleFont\n{\npublic:\n    CPDF_Type3Font();\n    virtual ~CPDF_Type3Font();\n    void\t\t\t\t\tSetPageResources(CPDF_Dictionary* pResources)\n    {\n        m_pPageResources = pResources;\n    }\n    CPDF_Type3Char*\t\t\tLoadChar(FX_DWORD charcode, int level = 0);\n    virtual int\t\t\t\tGetCharWidthF(FX_DWORD charcode, int level = 0);\n    virtual int\t\t\t\tGetCharTypeWidth(FX_DWORD charcode)\n    {\n        return GetCharWidthF(charcode);\n    }\n    virtual void\t\t\tGetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0);\n    CFX_AffineMatrix&\t\tGetFontMatrix()\n    {\n        return m_FontMatrix;\n    }\n    void\t\t\t\t\tCheckType3FontMetrics();\nprivate:\n    virtual FX_BOOL\t\t\t_Load();\n    virtual void\t\t\tLoadGlyphMap() {}\n    int\t\t\t\t\t\tm_CharWidthL[256];\n    CPDF_Dictionary*\t\tm_pCharProcs;\n    CPDF_Dictionary*\t\tm_pPageResources;\n    CPDF_Dictionary*\t\tm_pFontResources;\n    CFX_MapPtrToPtr\t\t\tm_CacheMap;\n    CFX_MapPtrToPtr\t\t\tm_DeletedMap;\nprotected:\n    CFX_AffineMatrix\t\tm_FontMatrix;\n};\n#define CIDSET_UNKNOWN\t\t0\n#define CIDSET_GB1\t\t\t1\n#define CIDSET_CNS1\t\t\t2\n#define CIDSET_JAPAN1\t\t3\n#define CIDSET_KOREA1\t\t4\n#define CIDSET_UNICODE\t\t5\nclass CPDF_CIDFont : public CPDF_Font\n{\npublic:\n\n    CPDF_CIDFont();\n\n    virtual ~CPDF_CIDFont();\n\n    FX_BOOL\t\t\t\t\tLoadGB2312();\n    virtual int\t\t\t\tGlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph = NULL);\n    virtual int\t\t\t\tGetCharWidthF(FX_DWORD charcode, int level = 0);\n    virtual void\t\t\tGetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0);\n\n    FX_WORD\t\t\t\t\tCIDFromCharCode(FX_DWORD charcode) const;\n\n    FX_BOOL\t\t\t\t\tIsTrueType()\n    {\n        return !m_bType1;\n    }\n\n\n    virtual FX_DWORD\t\tGetNextChar(const FX_CHAR* pString, int& offset) const;\n    virtual int\t\t\t\tCountChar(const FX_CHAR* pString, int size) const;\n    virtual int\t\t\t\tAppendChar(FX_LPSTR str, FX_DWORD charcode) const;\n    virtual int\t\t\t\tGetCharSize(FX_DWORD charcode) const;\n\n\n    int\t\t\t\t\t\tGetCharset() const\n    {\n        return m_Charset;\n    }\n\n    FX_LPCBYTE\t\t\t\tGetCIDTransform(FX_WORD CID) const;\n\n\n\n    virtual FX_BOOL\t\t\tIsVertWriting() const;\n\n    short\t\t\t\t\tGetVertWidth(FX_WORD CID) const;\n\n    void\t\t\t\t\tGetVertOrigin(FX_WORD CID, short& vx, short& vy) const;\n\n    virtual FX_BOOL\t\t\tIsUnicodeCompatible() const;\n    virtual FX_BOOL\t\t\tIsFontStyleFromCharCode(FX_DWORD charcode) const;\nprotected:\n    friend class\t\t\tCPDF_Font;\n    virtual FX_BOOL\t\t\t_Load();\n    virtual FX_WCHAR\t\t_UnicodeFromCharCode(FX_DWORD charcode) const;\n    virtual FX_DWORD\t\t_CharCodeFromUnicode(FX_WCHAR Unicode) const;\n    int\t\t\t\tGetGlyphIndex(FX_DWORD unicodeb, FX_BOOL *pVertGlyph);\n\n    CPDF_CMap*\t\t\t\tm_pCMap;\n\n    CPDF_CMap*\t\t\t\tm_pAllocatedCMap;\n\n    CPDF_CID2UnicodeMap*\tm_pCID2UnicodeMap;\n\n    int\t\t\t\t\t\tm_Charset;\n\n    FX_BOOL\t\t\t\t\tm_bType1;\n\n    CPDF_StreamAcc*\t\t\tm_pCIDToGIDMap;\n    FX_BOOL\t\t\t\t\tm_bCIDIsGID;\n\n\n\n    FX_WORD\t\t\t\t\tm_DefaultWidth;\n\n    FX_WORD*\t\t\t\tm_pAnsiWidths;\n\n    FX_SMALL_RECT\t\t\tm_CharBBox[256];\n\n    CFX_DWordArray\t\t\tm_WidthList;\n\n    short\t\t\t\t\tm_DefaultVY;\n\n    short\t\t\t\t\tm_DefaultW1;\n\n    CFX_DWordArray\t\t\tm_VertMetrics;\n\n\n    void\t\t\t\t\tLoadMetricsArray(CPDF_Array* pArray, CFX_DWordArray& result, int nElements);\n\n    void\t\t\t\t\tLoadSubstFont();\n\n    FX_BOOL\t\t\t\t\tm_bAdobeCourierStd;\n\n    CFX_CTTGSUBTable*\t\t\tm_pTTGSUBTable;\n};\n#define PDFCS_DEVICEGRAY\t\t1\n\n#define PDFCS_DEVICERGB\t\t\t2\n#define PDFCS_DEVICECMYK\t\t3\n#define PDFCS_CALGRAY\t\t\t4\n#define PDFCS_CALRGB\t\t\t5\n#define PDFCS_LAB\t\t\t\t6\n#define PDFCS_ICCBASED\t\t\t7\n#define PDFCS_SEPARATION\t\t8\n#define PDFCS_DEVICEN\t\t\t9\n#define PDFCS_INDEXED\t\t\t10\n#define PDFCS_PATTERN\t\t\t11\nclass CPDF_ColorSpace : public CFX_Object\n{\npublic:\n\n    static CPDF_ColorSpace* GetStockCS(int Family);\n\n    static CPDF_ColorSpace*\tLoad(CPDF_Document* pDoc, CPDF_Object* pCSObj);\n\n    void\t\t\t\t\tReleaseCS();\n\n    int\t\t\t\t\t\tGetBufSize() const;\n\n    FX_FLOAT*\t\t\tCreateBuf();\n\n    void\t\t\t\t\tGetDefaultColor(FX_FLOAT* buf) const;\n\n    int\t\t\t\t\t\tCountComponents() const\n    {\n        return m_nComponents;\n    }\n\n    int\t\t\t\t\t\tGetFamily() const\n    {\n        return m_Family;\n    }\n\n    virtual void\t\t\tGetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const\n    {\n        value = 0;\n        min = 0;\n        max = 1.0f;\n    }\n\n    FX_BOOL\t\t\t\t\tsRGB() const;\n\n\n\n    virtual FX_BOOL\t\t\tGetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const = 0;\n\n    virtual FX_BOOL\t\t\tSetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const\n    {\n        return FALSE;\n    }\n\n\n\n\n    FX_BOOL\t\t\t\t\tGetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const;\n\n    FX_BOOL\t\t\t\t\tSetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const;\n\n\n    virtual void\t\t\tTranslateImageLine(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels,\n            int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;\n\n    CPDF_Array*&\t\t\tGetArray()\n    {\n        return m_pArray;\n    }\n\n    int\t\t\t\t\t\tGetMaxIndex() const;\n\n    virtual CPDF_ColorSpace*\tGetBaseCS() const\n    {\n        return NULL;\n    }\n\n    virtual void\t\t\tEnableStdConversion(FX_BOOL bEnabled);\n    CPDF_Document*\t\t\tm_pDocument;\nprotected:\n\n    CPDF_ColorSpace();\n\n    virtual ~CPDF_ColorSpace() {}\n    virtual FX_BOOL\t\t\tv_Load(CPDF_Document* pDoc, CPDF_Array* pArray)\n    {\n        return TRUE;\n    }\n    virtual FX_BOOL\t\t\tv_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const\n    {\n        return FALSE;\n    }\n    virtual FX_BOOL\t\t\tv_SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const\n    {\n        return FALSE;\n    }\n\n    int\t\t\t\t\t\tm_Family;\n\n    int\t\t\t\t\t\tm_nComponents;\n\n    CPDF_Array*\t\t\t\tm_pArray;\n\n    FX_DWORD\t\t\t\tm_dwStdConversion;\n};\nclass CPDF_Color : public CFX_Object\n{\npublic:\n\n    CPDF_Color()\n    {\n        m_pBuffer = NULL;\n        m_pCS = NULL;\n    }\n\n    CPDF_Color(int family);\n\n    ~CPDF_Color();\n\n    FX_BOOL\t\t\t\t\tIsNull() const\n    {\n        return m_pBuffer == NULL;\n    }\n\n    FX_BOOL\t\t\t\t\tIsEqual(const CPDF_Color& other) const;\n\n    FX_BOOL\t\t\t\t\tIsPattern() const\n    {\n        return m_pCS && m_pCS->GetFamily() == PDFCS_PATTERN;\n    }\n\n    void\t\t\t\t\tCopy(const CPDF_Color* pSrc);\n\n    void\t\t\t\t\tSetColorSpace(CPDF_ColorSpace* pCS);\n\n    void\t\t\t\t\tSetValue(FX_FLOAT* comp);\n\n    void\t\t\t\t\tSetValue(CPDF_Pattern* pPattern, FX_FLOAT* comp, int ncomps);\n\n    FX_BOOL\t\t\t\t\tGetRGB(int& R, int& G, int& B) const;\n\n    CPDF_Pattern*\t\t\tGetPattern() const;\n\n    CPDF_ColorSpace*\t\tGetPatternCS() const;\n\n    FX_FLOAT*\t\t\tGetPatternColor() const;\n\n    CPDF_ColorSpace*\t\tm_pCS;\n\n    FX_FLOAT*\t\t\tm_pBuffer;\nprotected:\n    void\tReleaseBuffer();\n    void\tReleaseColorSpace();\n};\n#define PATTERN_TILING\t\t1\n#define PATTERN_SHADING\t\t2\nclass CPDF_Pattern : public CFX_Object\n{\npublic:\n\n    virtual ~CPDF_Pattern() {}\n\n    CPDF_Object*\t\t\tm_pPatternObj;\n\n    int\t\t\t\t\t\tm_PatternType;\n\n    CFX_AffineMatrix\t\tm_Pattern2Form;\n    CFX_AffineMatrix\t\tm_ParentMatrix;\n\n    CPDF_Document*\t\t\tm_pDocument;\n\nprotected:\n\n    CPDF_Pattern(const CFX_AffineMatrix* pParentMatrix)\n    {\n        if (pParentMatrix) {\n            m_ParentMatrix = *pParentMatrix;\n        }\n    }\n};\nclass CPDF_TilingPattern : public CPDF_Pattern\n{\npublic:\n\n    CPDF_TilingPattern(CPDF_Document* pDoc, CPDF_Object* pPatternObj, const CFX_AffineMatrix* parentMatrix);\n\n    virtual ~CPDF_TilingPattern();\n\n    FX_BOOL\t\t\t\tLoad();\n\n\n\n    FX_BOOL\t\t\t\tm_bColored;\n\n    CFX_FloatRect\t\tm_BBox;\n\n    FX_FLOAT\t\t\tm_XStep;\n\n    FX_FLOAT\t\t\tm_YStep;\n\n\n\n    CPDF_Form*\t\t\tm_pForm;\n};\nclass CPDF_ShadingPattern : public CPDF_Pattern\n{\npublic:\n\n    CPDF_ShadingPattern(CPDF_Document* pDoc, CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* parentMatrix);\n\n    virtual ~CPDF_ShadingPattern();\n\n    CPDF_Object*\t\tm_pShadingObj;\n\n    FX_BOOL\t\t\t\tm_bShadingObj;\n\n    FX_BOOL\t\t\t\tLoad();\n\n    FX_BOOL\t\t\t\tReload();\n\n    int\t\t\t\t\tm_ShadingType;\n\n    CPDF_ColorSpace*\tm_pCS;\n\n\n    CPDF_Function*\t\tm_pFunctions[4];\n\n    int\t\t\t\t\tm_nFuncs;\nprotected:\n    void\tClear();\n};\nstruct CPDF_MeshVertex {\n    FX_FLOAT x, y;\n    FX_FLOAT r, g, b;\n};\nclass CPDF_MeshStream : public CFX_Object\n{\npublic:\n\n    FX_BOOL\t\t\t\tLoad(CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs, CPDF_ColorSpace* pCS);\n\n    FX_DWORD\t\t\tGetFlag();\n\n    void\t\t\t\tGetCoords(FX_FLOAT& x, FX_FLOAT& y);\n\n    void\t\t\t\tGetColor(FX_FLOAT& r, FX_FLOAT& g, FX_FLOAT& b);\n\n    FX_DWORD \t\t\tGetVertex(CPDF_MeshVertex& vertex, CFX_AffineMatrix* pObject2Bitmap);\n\n    FX_BOOL\t\t\t\tGetVertexRow(CPDF_MeshVertex* vertex, int count, CFX_AffineMatrix* pObject2Bitmap);\n    CPDF_Function**\tm_pFuncs;\n    CPDF_ColorSpace*\tm_pCS;\n    FX_DWORD\t\t\tm_nFuncs, m_nCoordBits, m_nCompBits, m_nFlagBits, m_nComps;\n    FX_DWORD\t\t\tm_CoordMax, m_CompMax;\n    FX_FLOAT\t\t\tm_xmin, m_xmax, m_ymin, m_ymax;\n    FX_FLOAT\t\t\tm_ColorMin[8], m_ColorMax[8];\n    CPDF_StreamAcc\t\tm_Stream;\n    CFX_BitStream\t\tm_BitStream;\n};\n#define PDF_IMAGE_NO_COMPRESS\t\t\t\t0x0000\n#define PDF_IMAGE_LOSSY_COMPRESS\t\t\t0x0001\n#define PDF_IMAGE_LOSSLESS_COMPRESS\t\t\t0x0002\n#define PDF_IMAGE_MASK_LOSSY_COMPRESS\t\t0x0004\n#define PDF_IMAGE_MASK_LOSSLESS_COMPRESS\t0x0008\nclass CPDF_ImageSetParam\n{\npublic:\n    CPDF_ImageSetParam()\n        : pMatteColor(NULL)\n        , nQuality(80)\n    {\n    }\n    FX_ARGB* pMatteColor;\n    FX_INT32 nQuality;\n};\nclass CPDF_Image : public CFX_Object\n{\npublic:\n\n    CPDF_Image(CPDF_Document* pDoc);\n\n    ~CPDF_Image();\n\n    FX_BOOL\t\t\t\t\tLoadImageF(CPDF_Stream* pImageStream, FX_BOOL bInline);\n\n    void\t\t\t\t\tRelease();\n\n    CPDF_Image*\t\t\t\tClone();\n\n    FX_BOOL\t\t\t\t\tIsInline()\n    {\n        return m_bInline;\n    }\n\n    void\t\t\t\t\tSetInlineDict(CPDF_Dictionary* pDict)\n    {\n        m_pInlineDict = pDict;\n    }\n\n    CPDF_Dictionary*\t\tGetInlineDict() const\n    {\n        return m_pInlineDict;\n    }\n\n    CPDF_Stream*\t\t\tGetStream() const\n    {\n        return m_pStream;\n    }\n\n    CPDF_Dictionary*\t\tGetDict() const\n    {\n        return m_pStream? m_pStream->GetDict(): NULL;\n    }\n\n    CPDF_Dictionary*\t\tGetOC() const\n    {\n        return m_pOC;\n    }\n\n    CPDF_Document*\t\t\tGetDocument() const\n    {\n        return m_pDocument;\n    }\n\n\n\n    FX_INT32\t\t\t\tGetPixelHeight() const\n    {\n        return m_Height;\n    }\n\n    FX_INT32\t\t\t\tGetPixelWidth() const\n    {\n        return m_Width;\n    }\n\n\n    FX_BOOL\t\t\t\t\tIsMask() const\n    {\n        return m_bIsMask;\n    }\n\n    FX_BOOL\t\t\t\t\tIsInterpol() const\n    {\n        return m_bInterpolate;\n    }\n\n    CFX_DIBSource*\t\t\tLoadDIBSource(CFX_DIBSource** ppMask = NULL, FX_DWORD* pMatteColor = NULL, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE) const;\n\n\n\n    void\t\t\t\t\tSetImage(const CFX_DIBitmap* pDIBitmap, FX_INT32 iCompress, IFX_FileWrite *pFileWrite = NULL, IFX_FileRead *pFileRead = NULL, const CFX_DIBitmap* pMask = NULL, const CPDF_ImageSetParam* pParam = NULL);\n\n    void\t\t\t\t\tSetJpegImage(FX_BYTE* pImageData, FX_DWORD size);\n\n    void\t\t\t\t\tSetJpegImage(IFX_FileRead *pFile);\n\n    void\t\t\t\t\tResetCache(CPDF_Page* pPage, const CFX_DIBitmap* pDIBitmap);\n\npublic:\n    FX_BOOL\t\t\t\t\tStartLoadDIBSource(CPDF_Dictionary* pFormResource, CPDF_Dictionary* pPageResource, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);\n    FX_BOOL\t\t\t\t\tContinue(IFX_Pause* pPause);\n    CFX_DIBSource*\t\t\tDetachBitmap();\n    CFX_DIBSource*\t\t\tDetachMask();\n    CFX_DIBSource*\t\t\tm_pDIBSource;\n    CFX_DIBSource*\t\t\tm_pMask;\n    FX_DWORD\t\t\t\tm_MatteColor;\nprivate:\n\n    CPDF_Stream*\t\t\tm_pStream;\n    FX_BOOL\t\t\t\t\tm_bInline;\n    CPDF_Dictionary*\t\tm_pInlineDict;\n\n    FX_INT32\t\t\t\tm_Height;\n\n    FX_INT32\t\t\t\tm_Width;\n\n    FX_BOOL\t\t\t\t\tm_bIsMask;\n\n    FX_BOOL\t\t\t\t\tm_bInterpolate;\n\n    CPDF_Document*\t\t\tm_pDocument;\n\n    CPDF_Dictionary*\t\tm_pOC;\n    CPDF_Dictionary*\tInitJPEG(FX_LPBYTE pData, FX_DWORD size);\n};\n#endif\n"
  },
  {
    "path": "core/include/fpdfapi/fpdf_serial.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDF_SERIAL_\n#define _FPDF_SERIAL_\n#ifndef _FPDF_PAGE_\n#include \"fpdf_page.h\"\n#endif\n#ifndef _FPDF_PAGEOBJ_H_\n#include \"fpdf_pageobj.h\"\n#endif\nclass CPDF_ObjectStream;\nclass CPDF_XRefStream;\nCFX_ByteTextBuf& operator << (CFX_ByteTextBuf& buf, const CPDF_Object* pObj);\nclass CPDF_ObjArchiveSaver : public CFX_ArchiveSaver\n{\npublic:\n\n    friend CPDF_ObjArchiveSaver&\toperator << (CPDF_ObjArchiveSaver& ar, const CPDF_Object* pObj);\nprotected:\n\n    CFX_MapPtrToPtr\t\t\tm_ObjectMap;\n};\nclass CPDF_ObjArchiveLoader : public CFX_ArchiveLoader\n{\npublic:\n\n    CPDF_ObjArchiveLoader(FX_LPCBYTE pData, FX_DWORD dwSize) : CFX_ArchiveLoader(pData, dwSize),\n        m_IndirectObjects(NULL) {}\n\n    friend CPDF_ObjArchiveLoader&\toperator >> (CPDF_ObjArchiveLoader& ar, CPDF_Object*& pObj);\nprotected:\n\n    CPDF_IndirectObjects\t\tm_IndirectObjects;\n};\nclass CPDF_PageArchiveSaver : public CPDF_ObjArchiveSaver\n{\npublic:\n\n    CPDF_PageArchiveSaver(CPDF_PageObjects* pPageObjs);\n\n    friend CPDF_PageArchiveSaver&\toperator << (CPDF_PageArchiveSaver& ar, CPDF_PageObject* pObj);\n\n\n\n    friend CPDF_PageArchiveSaver&\toperator << (CPDF_PageArchiveSaver& ar, CPDF_ClipPath clip_path);\n\n    friend CPDF_PageArchiveSaver&\toperator << (CPDF_PageArchiveSaver& ar, CPDF_GraphState graph_state);\n\n    friend CPDF_PageArchiveSaver&\toperator << (CPDF_PageArchiveSaver& ar, CPDF_TextState text_state);\n\n    friend CPDF_PageArchiveSaver&\toperator << (CPDF_PageArchiveSaver& ar, CPDF_ColorState color_state);\n\n    friend CPDF_PageArchiveSaver&\toperator << (CPDF_PageArchiveSaver& ar, CPDF_GeneralState general_state);\n\nprotected:\n\n    CPDF_ClipPath\t\tm_LastClipPath;\n\n    CPDF_GraphState\t\tm_LastGraphState;\n\n    CPDF_ColorState\t\tm_LastColorState;\n\n    CPDF_TextState\t\tm_LastTextState;\n\n    CPDF_GeneralState\tm_LastGeneralState;\n\n    CPDF_PageObjects*\tm_pCurPage;\n};\nclass CPDF_PageArchiveLoader : public CPDF_ObjArchiveLoader\n{\npublic:\n\n    CPDF_PageArchiveLoader(CPDF_PageObjects* pPageObjs, FX_LPCBYTE pData, FX_DWORD dwSize);\n\n    friend CPDF_PageArchiveLoader&\toperator >> (CPDF_PageArchiveLoader& ar, CPDF_PageObject*& pObj);\n\n\n\n    friend CPDF_PageArchiveLoader&\toperator >> (CPDF_PageArchiveLoader& ar, CPDF_ClipPath& clip_path);\n\n    friend CPDF_PageArchiveLoader&\toperator >> (CPDF_PageArchiveLoader& ar, CPDF_GraphState& graph_state);\n\n    friend CPDF_PageArchiveLoader&\toperator >> (CPDF_PageArchiveLoader& ar, CPDF_TextState& text_state);\n\n    friend CPDF_PageArchiveLoader&\toperator >> (CPDF_PageArchiveLoader& ar, CPDF_ColorState& color_state);\n\n    friend CPDF_PageArchiveLoader&\toperator >> (CPDF_PageArchiveLoader& ar, CPDF_GeneralState& general_state);\n\nprotected:\n    void\t\t\t\tPostProcColor(CPDF_Color& color);\n\n    CPDF_Object*\t\tAddResource(CPDF_Object* pSrcObj, FX_LPCSTR type);\n\n    CPDF_ClipPath\t\tm_LastClipPath;\n\n    CPDF_GraphState\t\tm_LastGraphState;\n\n    CPDF_ColorState\t\tm_LastColorState;\n\n    CPDF_TextState\t\tm_LastTextState;\n\n    CPDF_GeneralState\tm_LastGeneralState;\n\n    CPDF_PageObjects*\tm_pCurPage;\n\n    CFX_MapPtrToPtr\t\tm_ObjectMap;\n};\n#define FPDFCREATE_INCREMENTAL\t\t1\n#define FPDFCREATE_NO_ORIGINAL\t\t2\n#define FPDFCREATE_PROGRESSIVE\t\t4\n#define FPDFCREATE_OBJECTSTREAM\t\t8\nclass CPDF_Creator : public CFX_Object\n{\npublic:\n\n    CPDF_Creator(CPDF_Document* pDoc);\n\n    ~CPDF_Creator();\n\n    void\t\t\t\tRemoveSecurity();\n\n    FX_BOOL\t\t\t\tCreate(FX_LPCWSTR filename, FX_DWORD flags = 0);\n\n    FX_BOOL\t\t\t\tCreate(FX_LPCSTR filename, FX_DWORD flags = 0);\n\n    FX_BOOL\t\t\t\tCreate(IFX_StreamWrite* pFile, FX_DWORD flags = 0);\n\n    FX_INT32\t\t\tContinue(IFX_Pause *pPause = NULL);\n\n    FX_BOOL\t\t\t\tSetFileVersion(FX_INT32 fileVersion = 17);\nprotected:\n\n    CPDF_Document*\t\tm_pDocument;\n\n    CPDF_Parser*\t\tm_pParser;\n\n    FX_BOOL\t\t\t\tm_bCompress;\n\n    FX_BOOL\t\t\t\tm_bSecurityChanged;\n\n    CPDF_Dictionary*\tm_pEncryptDict;\n    FX_DWORD\t\t\tm_dwEnryptObjNum;\n    FX_BOOL\t\t\t\tm_bEncryptCloned;\n\n    FX_BOOL\t\t\t\tm_bStandardSecurity;\n\n    CPDF_CryptoHandler*\tm_pCryptoHandler;\n    FX_BOOL\t\t\t\tm_bNewCrypto;\n\n    FX_BOOL\t\t\t\tm_bEncryptMetadata;\n\n    CPDF_Object*\t\tm_pMetadata;\n\n    CPDF_XRefStream*\tm_pXRefStream;\n\n    FX_INT32\t\t\tm_ObjectStreamSize;\n\n    FX_DWORD\t\t\tm_dwLastObjNum;\n    FX_BOOL\t\t\t\tCreate(FX_DWORD flags);\n    void\t\t\t\tResetStandardSecurity();\n    void\t\t\t\tClear();\n    FX_INT32\t\t\tWriteDoc_Stage1(IFX_Pause *pPause);\n    FX_INT32\t\t\tWriteDoc_Stage2(IFX_Pause *pPause);\n    FX_INT32\t\t\tWriteDoc_Stage3(IFX_Pause *pPause);\n    FX_INT32\t\t\tWriteDoc_Stage4(IFX_Pause *pPause);\n\n    CFX_FileBufferArchive\tm_File;\n\n    FX_FILESIZE\t\t\tm_Offset;\n    void\t\t\t\tInitOldObjNumOffsets();\n    void\t\t\t\tInitNewObjNumOffsets();\n    void\t\t\t\tAppendNewObjNum(FX_DWORD objbum);\n    FX_INT32\t\t\tWriteOldIndirectObject(FX_DWORD objnum);\n    FX_INT32\t\t\tWriteOldObjs(IFX_Pause *pPause);\n    FX_INT32\t\t\tWriteNewObjs(FX_BOOL bIncremental, IFX_Pause *pPause);\n    FX_INT32\t\t\tWriteIndirectObj(const CPDF_Object* pObj);\n    FX_INT32\t\t\tWriteDirectObj(FX_DWORD objnum, const CPDF_Object* pObj, FX_BOOL bEncrypt = TRUE);\n    FX_INT32\t\t\tWriteIndirectObjectToStream(const CPDF_Object* pObj);\n    FX_INT32\t\t\tWriteIndirectObj(FX_DWORD objnum, const CPDF_Object* pObj);\n    FX_INT32\t\t\tWriteIndirectObjectToStream(FX_DWORD objnum, FX_LPCBYTE pBuffer, FX_DWORD dwSize);\n    FX_INT32\t\t\tAppendObjectNumberToXRef(FX_DWORD objnum);\n    void\t\t\t\tInitID(FX_BOOL bDefault = TRUE);\n    FX_INT32\t\t\tWriteStream(const CPDF_Object* pStream, FX_DWORD objnum, CPDF_CryptoHandler* pCrypto);\n\n    FX_INT32\t\t\tm_iStage;\n    FX_DWORD\t\t\tm_dwFlags;\n    FX_POSITION\t\t\tm_Pos;\n    FX_FILESIZE\t\t\tm_XrefStart;\n\n    CFX_FileSizeListArray\tm_ObjectOffset;\n\n    CFX_DWordListArray\t\tm_ObjectSize;\n    CFX_DWordArray\t\tm_NewObjNumArray;\n\n    CPDF_Array*\t\t\tm_pIDArray;\n\n    FX_INT32\t\t\tm_FileVersion;\n    friend class CPDF_ObjectStream;\n    friend class CPDF_XRefStream;\n};\n#endif\n"
  },
  {
    "path": "core/include/fpdfapi/fpdfapi.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDFAPI_H_\n#define _FPDFAPI_H_\n#include \"../../include/fxcrt/fx_basic.h\"\n#include \"../../include/fxge/fx_ge.h\"\n#include \"fpdf_module.h\"\n#include \"fpdf_pageobj.h\"\n#include \"fpdf_render.h\"\n#include \"fpdf_serial.h\"\n#endif\n"
  },
  {
    "path": "core/include/fpdfdoc/fpdf_ap.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#define _FPDF_AP_H_\n#include \"../fxcrt/fx_basic.h\"\n#include \"../fpdfapi/fpdf_parser.h\"\n#include \"fpdf_vt.h\"\nclass IPVT_FontMap\n{\npublic:\n\n    virtual CPDF_Font*\t\t\t\t\t\tGetPDFFont(FX_INT32 nFontIndex) = 0;\n\n    virtual CFX_ByteString\t\t\t\t\tGetPDFFontAlias(FX_INT32 nFontIndex) = 0;\n};\nstruct CPVT_Dash {\n\n    CPVT_Dash(FX_INT32 dash, FX_INT32 gap, FX_INT32 phase) : nDash(dash), nGap(gap), nPhase(phase)\n    {}\n\n    FX_INT32\t\t\tnDash;\n\n    FX_INT32\t\t\tnGap;\n\n    FX_INT32\t\t\tnPhase;\n};\n#define CT_TRANSPARENT\t\t0\n#define\tCT_GRAY\t\t\t\t1\n#define\tCT_RGB\t\t\t\t2\n#define\tCT_CMYK\t\t\t\t3\nstruct CPVT_Color {\n\n    CPVT_Color(FX_INT32 type = 0, FX_FLOAT color1 = 0.0f, FX_FLOAT color2 = 0.0f, FX_FLOAT color3 = 0.0f, FX_FLOAT color4 = 0.0f)\n        : nColorType(type), fColor1(color1), fColor2(color2), fColor3(color3), fColor4(color4)\n    {}\n\n    FX_INT32\t\t\tnColorType;\n    FX_FLOAT\t\t\tfColor1;\n    FX_FLOAT\t\t\tfColor2;\n    FX_FLOAT\t\t\tfColor3;\n    FX_FLOAT\t\t\tfColor4;\n};\nclass CPVT_Provider : public IPDF_VariableText_Provider\n{\npublic:\n\n    CPVT_Provider(IPVT_FontMap * pFontMap);\n\n    virtual ~CPVT_Provider();\n\n    FX_INT32\t\t\t\t\t\tGetCharWidth(FX_INT32 nFontIndex, FX_WORD word, FX_INT32 nWordStyle);\n\n    FX_INT32\t\t\t\t\t\tGetTypeAscent(FX_INT32 nFontIndex);\n\n    FX_INT32\t\t\t\t\t\tGetTypeDescent(FX_INT32 nFontIndex);\n\n    FX_INT32\t\t\t\t\t\tGetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex);\n\n    FX_BOOL\t\t\t\t\t\t\tIsLatinWord(FX_WORD word);\n\n    FX_INT32\t\t\t\t\t\tGetDefaultFontIndex();\nprivate:\n\n    IPVT_FontMap *\tm_pFontMap;\n};\n#define PBS_SOLID\t\t\t0\n#define PBS_DASH\t\t\t1\n#define PBS_BEVELED\t\t\t2\n#define PBS_INSET\t\t\t3\n#define PBS_UNDERLINED\t\t4\nclass CPVT_GenerateAP\n{\npublic:\n\n    static FX_BOOL\t\t\t\t\t\t\tGenerateTextFieldAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict);\n\n    static FX_BOOL\t\t\t\t\t\t\tGenerateComboBoxAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict);\n\n    static FX_BOOL\t\t\t\t\t\t\tGenerateListBoxAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict);\n\n    static CFX_ByteString\t\t\t\t\tGenerateEditAP(IPVT_FontMap * pFontMap, IPDF_VariableText_Iterator * pIterator,\n            const CPDF_Point & ptOffset, FX_BOOL bContinuous, FX_WORD SubWord = 0, const CPVT_WordRange * pVisible = NULL);\n\n    static CFX_ByteString\t\t\t\t\tGenerateBorderAP(const CPDF_Rect & rect, FX_FLOAT fWidth,\n            const CPVT_Color & color, const CPVT_Color & crLeftTop, const CPVT_Color & crRightBottom,\n            FX_INT32 nStyle, const CPVT_Dash & dash);\n\n    static CFX_ByteString\t\t\t\t\tGenerateColorAP(const CPVT_Color & color, const FX_BOOL & bFillOrStroke);\n};\n"
  },
  {
    "path": "core/include/fpdfdoc/fpdf_doc.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDF_DOC_H_\n#define _FPDF_DOC_H_\n#ifndef _FPDF_PARSER_\n#include \"../fpdfapi/fpdf_parser.h\"\n#endif\n#ifndef _FPDF_RENDER_\n#include \"../fpdfapi/fpdf_render.h\"\n#endif\nclass CPDF_Action;\nclass CPDF_Annot;\nclass CPDF_AnnotList;\nclass CPDF_Bookmark;\nclass CPDF_BookmarkTree;\nclass CPDF_Dest;\nclass CPDF_Link;\nclass CPDF_LinkList;\nclass CPDF_Metadata;\nclass CPDF_NameTree;\nclass CPDF_NumberTree;\nclass CPDF_TextObject;\nclass CPDF_ViewerPreferences;\nclass CPDF_Page;\nclass CPDF_RenderOptions;\nclass CXML_Element;\nclass CPDF_OCContext;\nclass CPDF_DocJSActions;\nclass CPDF_ActionFields;\nclass CPDF_AAction;\nclass CPDF_FileSpec;\nclass CPDF_IconFit;\nclass CPDF_DefaultAppearance;\nclass CPDF_InterForm;\nclass CPDF_FormField;\nclass CPDF_FormNotify;\nclass CPDF_FormControl;\nclass CPDF_LWinParam;\nclass CFieldTree;\nclass CPDF_ApSettings;\nclass CPDF_NameTree : public CFX_Object\n{\npublic:\n\n    CPDF_NameTree(CPDF_Dictionary* pRoot)\n    {\n        m_pRoot = pRoot;\n    }\n\n    CPDF_NameTree(CPDF_Document* pDoc, FX_BSTR category);\n\n    CPDF_Object*\t\tLookupValue(int nIndex, CFX_ByteString& csName) const;\n\n    CPDF_Object*\t\tLookupValue(const CFX_ByteString& csName) const;\n\n    CPDF_Array*\t\t\tLookupNamedDest(CPDF_Document* pDoc, FX_BSTR sName);\n\n    int\t\t\t\t\tGetIndex(const CFX_ByteString& csName) const;\n\n    int\t\t\t\t\tGetCount() const;\n\n\n    CPDF_Dictionary*\tGetRoot() const\n    {\n        return m_pRoot;\n    }\n\nprotected:\n\n    CPDF_Dictionary*\t\tm_pRoot;\n};\nclass CPDF_BookmarkTree : public CFX_Object\n{\npublic:\n\n    CPDF_BookmarkTree(CPDF_Document* pDoc)\n    {\n        m_pDocument = pDoc;\n    }\npublic:\n\n\n\n    CPDF_Bookmark\t\tGetFirstChild(CPDF_Bookmark parent);\n\n    CPDF_Bookmark\t\tGetNextSibling(CPDF_Bookmark bookmark);\n\n\n    CPDF_Document*\t\tGetDocument() const\n    {\n        return m_pDocument;\n    }\nprotected:\n\n    CPDF_Document*\t\tm_pDocument;\n};\n#define PDFBOOKMARK_ITALIC\t\t\t1\n#define PDFBOOKMARK_BOLD\t\t\t2\nclass CPDF_Bookmark : public CFX_Object\n{\npublic:\n\n    CPDF_Bookmark(CPDF_Dictionary* pDict = NULL)\n    {\n        m_pDict = pDict;\n    }\n\n    operator CPDF_Dictionary*() const\n    {\n        return m_pDict;\n    }\n\n\n\n    FX_DWORD\t\t\tGetColorRef();\n\n    FX_DWORD\t\t\tGetFontStyle();\n\n    CFX_WideString\t\tGetTitle();\n\n\n\n\n    CPDF_Dest\t\t\tGetDest(CPDF_Document* pDocument);\n\n    CPDF_Action\t\t\tGetAction();\n\n\n    CPDF_Dictionary*\tm_pDict;\n};\n#define PDFZOOM_XYZ\t\t\t\t\t1\n#define PDFZOOM_FITPAGE\t\t\t\t2\n#define PDFZOOM_FITHORZ\t\t\t\t3\n#define PDFZOOM_FITVERT\t\t\t\t4\n#define PDFZOOM_FITRECT\t\t\t\t5\n#define PDFZOOM_FITBBOX\t\t\t\t6\n#define PDFZOOM_FITBHORZ\t\t\t7\n\n#define PDFZOOM_FITBVERT\t\t\t8\nclass CPDF_Dest : public CFX_Object\n{\npublic:\n\n    CPDF_Dest(CPDF_Object* pObj = NULL)\n    {\n        m_pObj = pObj;\n    }\n\n    operator CPDF_Object* () const\n    {\n        return m_pObj;\n    }\n\n    CFX_ByteString\t\tGetRemoteName();\n\n    int\t\t\t\t\tGetPageIndex(CPDF_Document* pDoc);\n\n    FX_DWORD\t\t\tGetPageObjNum();\n\n    int\t\t\t\t\tGetZoomMode();\n\n    FX_FLOAT\t\t\tGetParam(int index);\n\n\n    CPDF_Object*\t\tm_pObj;\n};\nclass CPDF_OCContext : public CFX_Object, public IPDF_OCContext\n{\npublic:\n\n    enum UsageType {\n        View = 0,\n        Design,\n        Print,\n        Export\n    };\n\n    CPDF_OCContext(CPDF_Document *pDoc, UsageType eUsageType = View);\n\n    virtual ~CPDF_OCContext();\n\n    CPDF_Document*\tGetDocument() const\n    {\n        return m_pDocument;\n    }\n\n    UsageType\t\tGetUsageType() const\n    {\n        return m_eUsageType;\n    }\n\n    FX_BOOL\t\t\tCheckOCGVisible(const CPDF_Dictionary *pOCGDict);\n\n    void\t\t\tResetOCContext();\nprotected:\n\n    FX_BOOL\t\t\tLoadOCGStateFromConfig(FX_BSTR csConfig, const CPDF_Dictionary *pOCGDict, FX_BOOL &bValidConfig) const;\n\n    FX_BOOL\t\t\tLoadOCGState(const CPDF_Dictionary *pOCGDict) const;\n\n    FX_BOOL\t\t\tGetOCGVisible(const CPDF_Dictionary *pOCGDict);\n\n    FX_BOOL\t\t\tGetOCGVE(CPDF_Array *pExpression, FX_BOOL bFromConfig, int nLevel = 0);\n\n    FX_BOOL\t\t\tLoadOCMDState(const CPDF_Dictionary *pOCMDDict, FX_BOOL bFromConfig);\n\n    CPDF_Document\t\t*m_pDocument;\n\n    UsageType\t\t\tm_eUsageType;\n\n    CFX_MapPtrTemplate<const CPDF_Dictionary*, void*>\tm_OCGStates;\n};\nclass CPDF_LWinParam : public CFX_Object\n{\npublic:\n\n    CPDF_LWinParam(CPDF_Dictionary* pDict)\n    {\n        m_pDict = pDict;\n    }\n\n    operator CPDF_Dictionary* () const\n    {\n        return m_pDict;\n    }\n\n    inline CFX_ByteString\tGetFileName()\n    {\n        return m_pDict->GetString(\"F\");\n    }\n\n\n    inline CFX_ByteString\tGetDefaultDirectory()\n    {\n        return m_pDict->GetString(\"D\");\n    }\n\n\n    inline CFX_ByteString\tGetOperation()\n    {\n        return m_pDict->GetString(\"O\");\n    }\n\n\n    inline CFX_ByteString\tGetParameter()\n    {\n        return m_pDict->GetString(\"P\");\n    }\n\n    CPDF_Dictionary*\t\tm_pDict;\n};\nclass CPDF_ActionFields : public CFX_Object\n{\npublic:\n\n    CPDF_ActionFields(const CPDF_Action* pAction)\n    {\n        m_pAction = (CPDF_Action*)pAction;\n    }\n\n    operator CPDF_Action*() const\n    {\n        return m_pAction;\n    }\n\n    FX_DWORD\t\t\t\tGetFieldsCount() const;\n\n    void\t\t\t\t\tGetAllFields(CFX_PtrArray& fieldObjects) const;\n\n    CPDF_Object*\t\t\tGetField(FX_DWORD iIndex) const;\n\n    CPDF_Action*\t\t\tm_pAction;\n};\n\n#define PDFNAMED_NEXTPAGE\t\t1\n#define PDFNAMED_PREVPAGE\t\t2\n#define PDFNAMED_FIRSTPAGE\t\t3\n#define PDFNAMED_LASTPAGE\t\t4\n#define PDFJS_MAXLENGTH\t\t\t64\nclass CPDF_Action : public CFX_Object\n{\npublic:\n\n    CPDF_Action(CPDF_Dictionary* pDict = NULL)\n    {\n        m_pDict = pDict;\n    }\n\n    operator CPDF_Dictionary* () const\n    {\n        return m_pDict;\n    }\n\n    enum ActionType {\n        Unknown = 0,\n        GoTo,\n        GoToR,\n        GoToE,\n        Launch,\n        Thread,\n        URI,\n        Sound,\n        Movie,\n        Hide,\n        Named,\n        SubmitForm,\n        ResetForm,\n        ImportData,\n        JavaScript,\n        SetOCGState,\n        Rendition,\n        Trans,\n        GoTo3DView\n    };\n\n    CFX_ByteString\t\tGetTypeName() const\n    {\n        return m_pDict->GetString(\"S\");\n    }\n\n    ActionType\t\t\tGetType() const;\n\n\n\n    CPDF_Dest\t\t\tGetDest(CPDF_Document* pDoc) const;\n\n\n\n\n\n    CFX_WideString\t\tGetFilePath() const;\n\n\n\n\n    FX_BOOL\t\t\t\tGetNewWindow() const\n    {\n        return m_pDict->GetBoolean(\"NewWindow\");\n    }\n\n\n\n\n    CPDF_LWinParam\t\tGetWinParam() const;\n\n\n\n\n    CFX_ByteString\t\tGetURI(CPDF_Document* pDoc) const;\n\n\n\n\n    FX_BOOL\t\t\t\tGetMouseMap() const\n    {\n        return m_pDict->GetBoolean(\"IsMap\");\n    }\n\n\n\n\n    CPDF_ActionFields\tGetWidgets() const\n    {\n        return this;\n    }\n\n\n\n\n    FX_BOOL\t\t\t\tGetHideStatus() const\n    {\n        return m_pDict->GetBoolean(\"H\", TRUE);\n    }\n\n\n\n\n    CFX_ByteString\t\tGetNamedAction() const\n    {\n        return m_pDict->GetString(\"N\");\n    }\n\n\n\n\n    FX_DWORD\t\t\tGetFlags() const\n    {\n        return m_pDict->GetInteger(\"Flags\");\n    }\n\n\n\n\n    CFX_WideString\t\tGetJavaScript() const;\n\n\n\n\n    CPDF_Dictionary*\tGetAnnot() const;\n\n\n\n\n    FX_INT32\t\t\tGetOperationType() const;\n\n\n\n\n    CPDF_Stream*\t\tGetSoundStream() const\n    {\n        return m_pDict->GetStream(\"Sound\");\n    }\n\n    FX_FLOAT\t\t\tGetVolume() const\n    {\n        return m_pDict->GetNumber(\"Volume\");\n    }\n\n    FX_BOOL\t\t\t\tIsSynchronous() const\n    {\n        return m_pDict->GetBoolean(\"Synchronous\");\n    }\n\n    FX_BOOL\t\t\t\tIsRepeat() const\n    {\n        return m_pDict->GetBoolean(\"Repeat\");\n    }\n\n    FX_BOOL\t\t\t\tIsMixPlay() const\n    {\n        return m_pDict->GetBoolean(\"Mix\");\n    }\n\n\n\n\n    FX_DWORD\t\t\tGetSubActionsCount() const;\n\n    CPDF_Action\t\t\tGetSubAction(FX_DWORD iIndex) const;\n\n\n    CPDF_Dictionary*\tm_pDict;\n};\nclass CPDF_AAction : public CFX_Object\n{\npublic:\n\n    CPDF_AAction(CPDF_Dictionary* pDict = NULL)\n    {\n        m_pDict = pDict;\n    }\n\n    operator CPDF_Dictionary*()\tconst\n    {\n        return m_pDict;\n    }\n\n    enum AActionType {\n        CursorEnter = 0,\n        CursorExit,\n        ButtonDown,\n        ButtonUp,\n        GetFocus,\n        LoseFocus,\n        PageOpen,\n        PageClose,\n        PageVisible,\n        PageInvisible,\n        OpenPage,\n        ClosePage,\n        KeyStroke,\n        Format,\n        Validate,\n        Calculate,\n        CloseDocument,\n        SaveDocument,\n        DocumentSaved,\n        PrintDocument,\n        DocumentPrinted\n    };\n\n    FX_BOOL\t\t\t\tActionExist(AActionType eType) const;\n\n    CPDF_Action\t\t\tGetAction(AActionType eType) const;\n\n    FX_POSITION\t\t\tGetStartPos() const;\n\n    CPDF_Action\t\t\tGetNextAction(FX_POSITION& pos, AActionType& eType) const;\n\n    CPDF_Dictionary*\tm_pDict;\n};\nclass CPDF_DocJSActions : public CFX_Object\n{\npublic:\n    CPDF_DocJSActions(CPDF_Document* pDoc);\n\n\n    int\t\t\t\t\tCountJSActions() const;\n\n    CPDF_Action\t\t\tGetJSAction(int index, CFX_ByteString& csName) const;\n\n    CPDF_Action\t\t\tGetJSAction(const CFX_ByteString& csName) const;\n\n    int\t\t\t\t\tFindJSAction(const CFX_ByteString& csName) const;\n\n\n    CPDF_Document*\t\tGetDocument() const\n    {\n        return m_pDocument;\n    }\n\nprotected:\n\n    CPDF_Document*\t\tm_pDocument;\n};\nclass CPDF_FileSpec : public CFX_Object\n{\npublic:\n\n    CPDF_FileSpec();\n\n    CPDF_FileSpec(CPDF_Object *pObj)\n    {\n        m_pObj = pObj;\n    }\n\n    operator CPDF_Object*() const\n    {\n        return m_pObj;\n    }\n\n    FX_BOOL\t\t\tIsURL() const;\n\n    FX_BOOL\t\t\tGetFileName(CFX_WideString &wsFileName) const;\n\n    CPDF_Stream*\tGetFileStream() const;\n\n    void\t\t\tSetFileName(FX_WSTR wsFileName, FX_BOOL bURL = FALSE);\nprotected:\n\n    CPDF_Object\t\t*m_pObj;\n};\nclass CPDF_LinkList : public CFX_Object\n{\npublic:\n\n    CPDF_LinkList(CPDF_Document* pDoc)\n    {\n        m_pDocument = pDoc;\n    }\n\n    ~CPDF_LinkList();\n\n    CPDF_Link\t\t\tGetLinkAtPoint(CPDF_Page* pPage, FX_FLOAT pdf_x, FX_FLOAT pdf_y);\n\n    int\t\t\t\t\tCountLinks(CPDF_Page* pPage);\n\n    CPDF_Link\t\t\tGetLink(CPDF_Page* pPage, int index);\n\n    CPDF_Document*\t\tGetDocument() const\n    {\n        return m_pDocument;\n    }\nprotected:\n\n    CPDF_Document*\t\tm_pDocument;\n\n    CFX_MapPtrToPtr\t\tm_PageMap;\n\n    CFX_PtrArray*\t\tGetPageLinks(CPDF_Page* pPage);\n\n    void\t\t\t\tLoadPageLinks(CPDF_Page* pPage, CFX_PtrArray* pList);\n};\nclass CPDF_Link : public CFX_Object\n{\npublic:\n\n    CPDF_Link(CPDF_Dictionary* pDict = NULL)\n    {\n        m_pDict = pDict;\n    }\n\n    operator CPDF_Dictionary*() const\n    {\n        return m_pDict;\n    }\n\n    CFX_FloatRect\t\tGetRect();\n\n\n\n    CPDF_Dest\t\t\tGetDest(CPDF_Document* pDoc);\n\n    CPDF_Action\t\t\tGetAction();\n\n\n    CPDF_Dictionary*\tm_pDict;\n};\n#define ANNOTFLAG_INVISIBLE\t\t\t1\n#define ANNOTFLAG_HIDDEN\t\t\t2\n#define ANNOTFLAG_PRINT\t\t\t\t4\n#define ANNOTFLAG_NOZOOM\t\t\t8\n#define ANNOTFLAG_NOROTATE\t\t\t0x10\n#define ANNOTFLAG_NOVIEW\t\t\t0x20\n#define ANNOTFLAG_READONLY\t\t\t0x40\n#define ANNOTFLAG_LOCKED\t\t\t0x80\n#define ANNOTFLAG_TOGGLENOVIEW\t\t0x100\nclass CPDF_Annot : public CFX_PrivateData, public CFX_Object\n{\npublic:\n\n    CPDF_Annot(CPDF_Dictionary* pDict);\n\n    ~CPDF_Annot();\n\n    CPDF_Dictionary*\tm_pAnnotDict;\n\n    CFX_ByteString\t\tGetSubType() const;\n\n    FX_DWORD\t\t\tGetFlags() const\n    {\n        return m_pAnnotDict->GetInteger(\"F\");\n    }\n\n    void\t\t\t\tGetRect(CFX_FloatRect& rect) const;\n\n    enum AppearanceMode\t{\n        Normal,\n        Rollover,\n        Down\n    };\n\n    FX_BOOL\t\t\t\tDrawAppearance(const CPDF_Page* pPage, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pUser2Device,\n                                       AppearanceMode mode, const CPDF_RenderOptions* pOptions);\n\n    FX_BOOL\t\t\t\tDrawInContext(const CPDF_Page* pPage, const CPDF_RenderContext* pContext,\n                                      const CFX_AffineMatrix* pUser2Device, AppearanceMode mode);\n\n    void\t\t\t\tClearCachedAP();\n\n\n    void\t\t\t\tDrawBorder(CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pUser2Device,\n                                   const CPDF_RenderOptions* pOptions);\n\n    CPDF_PageObject*\tGetBorder(FX_BOOL bPrint, const CPDF_RenderOptions* pOptions);\n\n\n\n    int\t\t\t\t\tCountIRTNotes();\n\n    CPDF_Annot*\t\t\tGetIRTNote(int index);\n\n\n    CPDF_Form*\t\t\tGetAPForm(const CPDF_Page* pPage, AppearanceMode mode);\nprivate:\n\n    CFX_MapPtrToPtr\t\tm_APMap;\nprotected:\n    friend class\t\tCPDF_AnnotList;\n\n    CPDF_AnnotList*\t\tm_pList;\n\n    CPDF_Reference*\t\tNewAnnotRef();\n};\nclass CPDF_AnnotList : public CFX_Object\n{\npublic:\n\n    CPDF_AnnotList(CPDF_Page* pPage);\n\n    ~CPDF_AnnotList();\n\n    void\tGetAnnotMatrix(const CPDF_Dictionary* pAnnotDict, const CFX_Matrix* pUser2Device, CFX_Matrix &matrix) const;\n\n    void\tGetAnnotRect(const CPDF_Dictionary* pAnnotDict, const CFX_Matrix* pUser2Device, CPDF_Rect &rtAnnot) const;\n\n    void\t\t\t\tDisplayAnnots(const CPDF_Page* pPage, CFX_RenderDevice* pDevice,\n                                      CFX_AffineMatrix* pMatrix, FX_BOOL bShowWidget,\n                                      CPDF_RenderOptions* pOptions);\n\n    void\t\t\t\tDisplayAnnots(const CPDF_Page* pPage, CPDF_RenderContext* pContext,\n                                      FX_BOOL bPrinting, CFX_AffineMatrix* pMatrix, FX_BOOL bShowWidget,\n                                      CPDF_RenderOptions* pOptions)\n    {\n        DisplayAnnots(pPage, NULL, pContext, bPrinting, pMatrix, bShowWidget ? 3 : 1, pOptions, NULL);\n    }\n\n    void\t\t\t\tDisplayAnnots(const CPDF_Page* pPage, CPDF_RenderContext* pContext,\n                                      FX_BOOL bPrinting, CFX_AffineMatrix* pMatrix, FX_BOOL bShowWidget,\n                                      CPDF_RenderOptions* pOptions, FX_RECT *pClipRect)\n    {\n        DisplayAnnots(pPage, NULL, pContext, bPrinting, pMatrix, bShowWidget ? 3 : 1, pOptions, pClipRect);\n    }\n\n    void\t\t\t\tDisplayAnnots(const CPDF_Page* pPage, CFX_RenderDevice* pDevice, CPDF_RenderContext* pContext,\n                                      FX_BOOL bPrinting, CFX_AffineMatrix* pMatrix, FX_DWORD dwAnnotFlags,\n                                      CPDF_RenderOptions* pOptions, FX_RECT* pClipRect);\n\n\n\n    CPDF_Annot*\t\t\tGetAt(int index)\n    {\n        return (CPDF_Annot*)m_AnnotList.GetAt(index);\n    }\n\n    int\t\t\t\t\tCount()\n    {\n        return m_AnnotList.GetSize();\n    }\n\n    int\t\t\t\t\tGetIndex(CPDF_Annot* pAnnot);\n\n\n    CPDF_Document*\t\tGetDocument() const\n    {\n        return m_pDocument;\n    }\nprotected:\n\n    CFX_PtrArray\t\tm_AnnotList;\n\n    CPDF_Dictionary*\tm_pPageDict;\n\n    CPDF_Document*\t\tm_pDocument;\n\n    CFX_PtrArray\t\tm_Borders;\n\n    void\t\t\t\tDisplayPass(const CPDF_Page* pPage, CFX_RenderDevice* pDevice,\n                                    CPDF_RenderContext* pContext, FX_BOOL bPrinting, CFX_AffineMatrix* pMatrix,\n                                    FX_BOOL bWidget, CPDF_RenderOptions* pOptions, FX_RECT* clip_rect);\n    friend class\t\tCPDF_Annot;\n};\n#define COLORTYPE_TRANSPARENT\t0\n#define COLORTYPE_GRAY\t\t\t1\n#define COLORTYPE_RGB\t\t\t2\n#define COLORTYPE_CMYK\t\t\t3\nclass CPDF_DefaultAppearance : public CFX_Object\n{\npublic:\n\n    CPDF_DefaultAppearance(const CFX_ByteString& csDA = \"\")\n    {\n        m_csDA = csDA;\n    }\n\n    CPDF_DefaultAppearance(const CPDF_DefaultAppearance& cDA)\n    {\n        m_csDA = (CFX_ByteString)(CPDF_DefaultAppearance&)cDA;\n    }\n\n\n    operator CFX_ByteString() const\n    {\n        return m_csDA;\n    }\n\n    const CPDF_DefaultAppearance& operator =(const CFX_ByteString& csDA)\n    {\n        m_csDA = csDA;\n        return *this;\n    }\n\n    const CPDF_DefaultAppearance& operator =(const CPDF_DefaultAppearance& cDA)\n    {\n        m_csDA = (CFX_ByteString)(CPDF_DefaultAppearance&)cDA;\n        return *this;\n    }\n\n\n\n    FX_BOOL\t\t\t\tHasFont();\n\n    CFX_ByteString\t\tGetFontString();\n\n    void\t\t\t\tGetFont(CFX_ByteString& csFontNameTag, FX_FLOAT& fFontSize);\n\n\n\n\n    FX_BOOL\t\t\t\tHasColor(FX_BOOL bStrokingOperation = FALSE);\n\n    CFX_ByteString\t\tGetColorString(FX_BOOL bStrokingOperation = FALSE);\n\n    void\t\t\t\tGetColor(int& iColorType, FX_FLOAT fc[4], FX_BOOL bStrokingOperation = FALSE);\n\n    void\t\t\t\tGetColor(FX_ARGB& color, int& iColorType, FX_BOOL bStrokingOperation = FALSE);\n\n\n\n\n    FX_BOOL\t\t\t\tHasTextMatrix();\n\n    CFX_ByteString\t\tGetTextMatrixString();\n\n    CFX_AffineMatrix\tGetTextMatrix();\n\nprotected:\n\n    CFX_ByteString\t\tm_csDA;\n};\n#define FIELDTYPE_UNKNOWN\t\t\t0\n#define FIELDTYPE_PUSHBUTTON\t\t1\n#define FIELDTYPE_CHECKBOX\t\t\t2\n#define FIELDTYPE_RADIOBUTTON\t\t3\n#define FIELDTYPE_COMBOBOX\t\t\t4\n#define FIELDTYPE_LISTBOX\t\t\t5\n#define FIELDTYPE_TEXTFIELD\t\t\t6\n#define FIELDTYPE_SIGNATURE\t\t\t7\nclass CPDF_InterForm : public CFX_PrivateData, public CFX_Object\n{\npublic:\n\n    CPDF_InterForm(CPDF_Document* pDocument, FX_BOOL bUpdateAP);\n\n    ~CPDF_InterForm();\n\n\n\n    static void\t\t\t\tEnableUpdateAP(FX_BOOL bUpdateAP);\n\n    static FX_BOOL\t\t\tUpdatingAPEnabled();\n\n\n    static CFX_ByteString\tGenerateNewResourceName(const CPDF_Dictionary* pResDict, FX_LPCSTR csType, int iMinLen = 2, FX_LPCSTR csPrefix = \"\");\n\n\n\n    static CPDF_Font*\t\tAddSystemDefaultFont(const CPDF_Document* pDocument);\n\n    static CPDF_Font*\t\tAddSystemFont(const CPDF_Document* pDocument, CFX_ByteString csFontName, FX_BYTE iCharSet = 1);\n\n    static CPDF_Font*\t\tAddSystemFont(const CPDF_Document* pDocument, CFX_WideString csFontName, FX_BYTE iCharSet = 1);\n\n    static CPDF_Font*\t\tAddStandardFont(const CPDF_Document* pDocument, CFX_ByteString csFontName);\n\n    static CFX_ByteString\tGetNativeFont(FX_BYTE iCharSet, FX_LPVOID pLogFont = NULL);\n\n    static CFX_ByteString\tGetNativeFont(FX_LPVOID pLogFont = NULL);\n\n    static FX_BYTE\t\t\tGetNativeCharSet();\n\n    static CPDF_Font*\t\tAddNativeFont(FX_BYTE iCharSet, const CPDF_Document* pDocument);\n\n    static CPDF_Font*\t\tAddNativeFont(const CPDF_Document* pDocument);\n\n\n\n\n    FX_BOOL\t\t\t\t\tValidateFieldName(CFX_WideString& csNewFieldName, int iType);\n\n    FX_BOOL\t\t\t\t\tValidateFieldName(const CPDF_FormField* pField, CFX_WideString& csNewFieldName);\n\n    FX_BOOL\t\t\t\t\tValidateFieldName(const CPDF_FormControl* pControl, CFX_WideString& csNewFieldName);\n\n\n\n\n    FX_DWORD\t\t\t\tCountFields(const CFX_WideString &csFieldName = L\"\");\n\n    CPDF_FormField*\t\t\tGetField(FX_DWORD index, const CFX_WideString &csFieldName = L\"\");\n\n    void\t\t\t\t\tGetAllFieldNames(CFX_WideStringArray& allFieldNames);\n\n    FX_BOOL\t\t\t\t\tIsValidFormField(const void* pField);\n\n    CPDF_FormField*\t\t\tGetFieldByDict(CPDF_Dictionary* pFieldDict) const;\n\n\n\n\n    FX_DWORD\t\t\t\tCountControls(CFX_WideString csFieldName = L\"\");\n\n    CPDF_FormControl*\t\tGetControl(FX_DWORD index, CFX_WideString csFieldName = L\"\");\n\n    FX_BOOL\t\t\t\t\tIsValidFormControl(const void* pControl);\n\n    int\t\t\t\t\t\tCountPageControls(CPDF_Page* pPage) const;\n\n    CPDF_FormControl*\t\tGetPageControl(CPDF_Page* pPage, int index) const;\n\n\n    CPDF_FormControl*\t\tGetControlAtPoint(CPDF_Page* pPage, FX_FLOAT pdf_x, FX_FLOAT pdf_y) const;\n\n    CPDF_FormControl*\t\tGetControlByDict(CPDF_Dictionary* pWidgetDict) const;\n\n\n\n\n    FX_DWORD\t\t\t\tCountInternalFields(const CFX_WideString& csFieldName = L\"\") const;\n\n    CPDF_Dictionary*\t\tGetInternalField(FX_DWORD index, const CFX_WideString& csFieldName = L\"\") const;\n\n\n\n\n\n    CPDF_Document*\t\t\tGetDocument() const\n    {\n        return m_pDocument;\n    }\n\n    CPDF_Dictionary*\t\tGetFormDict() const\n    {\n        return m_pFormDict;\n    }\n\n\n\n\n    FX_BOOL\t\t\t\t\tNeedConstructAP();\n\n    void\t\t\t\t\tNeedConstructAP(FX_BOOL bNeedAP);\n\n\n\n\n    int\t\t\t\t\t\tCountFieldsInCalculationOrder();\n\n    CPDF_FormField*\t\t\tGetFieldInCalculationOrder(int index);\n\n    int\t\t\t\t\t\tFindFieldInCalculationOrder(const CPDF_FormField* pField);\n\n\n\n\n    FX_DWORD\t\t\t\tCountFormFonts();\n\n    CPDF_Font*\t\t\t\tGetFormFont(FX_DWORD index, CFX_ByteString& csNameTag);\n\n    CPDF_Font*\t\t\t\tGetFormFont(CFX_ByteString csNameTag);\n\n    CPDF_Font*\t\t\t\tGetFormFont(CFX_ByteString csFontName, CFX_ByteString& csNameTag);\n\n    CPDF_Font*\t\t\t\tGetNativeFormFont(FX_BYTE iCharSet, CFX_ByteString& csNameTag);\n\n    CPDF_Font*\t\t\t\tGetNativeFormFont(CFX_ByteString& csNameTag);\n\n    FX_BOOL\t\t\t\t\tFindFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag);\n\n    FX_BOOL\t\t\t\t\tFindFormFont(CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag);\n\n    inline FX_BOOL\t\t\tFindFormFont(CFX_WideString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag)\n    {\n        return FindFormFont(PDF_EncodeText(csFontName), pFont, csNameTag);\n    }\n\n\n\n\n\n    void\t\t\t\t\tAddFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag);\n\n    CPDF_Font*\t\t\t\tAddNativeFormFont(FX_BYTE iCharSet, CFX_ByteString& csNameTag);\n\n    CPDF_Font*\t\t\t\tAddNativeFormFont(CFX_ByteString& csNameTag);\n\n    void\t\t\t\t\tRemoveFormFont(const CPDF_Font* pFont);\n\n    void\t\t\t\t\tRemoveFormFont(CFX_ByteString csNameTag);\n\n\n\n\n    CPDF_DefaultAppearance\tGetDefaultAppearance();\n\n    CPDF_Font*\t\t\t\tGetDefaultFormFont();\n\n\n\n    int\t\t\t\t\t\tGetFormAlignment();\n\n\n\n\n    CPDF_FormField*\t\t\tCheckRequiredFields(const CFX_PtrArray *fields = NULL, FX_BOOL bIncludeOrExclude = TRUE) const;\n\n    CFDF_Document* \t\t\tExportToFDF(FX_WSTR pdf_path, FX_BOOL bSimpleFileSpec = FALSE) const;\n\n    CFDF_Document*\t\t\tExportToFDF(FX_WSTR pdf_path, CFX_PtrArray& fields, FX_BOOL bIncludeOrExclude = TRUE, FX_BOOL bSimpleFileSpec = FALSE) const;\n\n    FX_BOOL\t\t\t\t\tImportFromFDF(const CFDF_Document* pFDFDoc, FX_BOOL bNotify = FALSE);\n\n\n\n\n    FX_BOOL\t\t\t\t\tResetForm(const CFX_PtrArray& fields, FX_BOOL bIncludeOrExclude = TRUE, FX_BOOL bNotify = FALSE);\n\n    FX_BOOL\t\t\t\t\tResetForm(FX_BOOL bNotify = FALSE);\n\n    void\t\t\t\t\tReloadForm();\n\n    CPDF_FormNotify*\t\tGetFormNotify() const\n    {\n        return m_pFormNotify;\n    }\n\n    void\t\t\t\t\tSetFormNotify(const CPDF_FormNotify* pNotify);\n\n\n    int\t\t\t\t\t\tGetPageWithWidget(int iCurPage, FX_BOOL bNext);\n\n\n\n    FX_BOOL\t\t\t\t\tIsUpdated()\n    {\n        return m_bUpdated;\n    }\n\n    void\t\t\t\t\tClearUpdatedFlag()\n    {\n        m_bUpdated = FALSE;\n    }\n\n\n    FX_BOOL\t\t\t\t\tHasXFAForm() const;\n\n    void\t\t\t\t\tFixPageFields(const CPDF_Page* pPage);\nprotected:\n\n    static FX_BOOL\t\t\tm_bUpdateAP;\n\n    void\t\t\t\t\tLoadField(CPDF_Dictionary* pFieldDict, int nLevel = 0);\n\n    CPDF_Object*\t\t\tGetFieldAttr(CPDF_Dictionary* pFieldDict, const FX_CHAR* name);\n\n    CPDF_FormField*\t\t\tAddTerminalField(const CPDF_Dictionary* pFieldDict);\n\n    CPDF_FormControl*\t\tAddControl(const CPDF_FormField* pField, const CPDF_Dictionary* pWidgetDict);\n\n    void\t\t\t\t\tFDF_ImportField(CPDF_Dictionary* pField, const CFX_WideString& parent_name, FX_BOOL bNotify = FALSE, int nLevel = 0);\n\n    FX_BOOL\t\t\t\t\tValidateFieldName(CFX_WideString& csNewFieldName, int iType, const CPDF_FormField* pExcludedField, const CPDF_FormControl* pExcludedControl);\n\n    int\t\t\t\t\t\tCompareFieldName(const CFX_WideString& name1, const CFX_WideString& name2);\n\n    int\t\t\t\t\t\tCompareFieldName(const CFX_ByteString& name1, const CFX_ByteString& name2);\n\n    CPDF_Document*\t\t\tm_pDocument;\n\n    FX_BOOL\t\t\t\t\tm_bGenerateAP;\n\n    CPDF_Dictionary*\t\tm_pFormDict;\n\n    CFX_MapPtrToPtr\t\t\tm_ControlMap;\n\n    CFieldTree *m_pFieldTree;\n\n    CFX_ByteString\t\t\tm_bsEncoding;\n\n    CPDF_FormNotify*\t\tm_pFormNotify;\n\n    FX_BOOL\t\t\t\t\tm_bUpdated;\n    friend class CPDF_FormControl;\n    friend class CPDF_FormField;\n};\n#define FORMFIELD_READONLY\t\t0x01\n#define FORMFIELD_REQUIRED\t\t0x02\n#define FORMFIELD_NOEXPORT\t\t0x04\n#define FORMRADIO_NOTOGGLEOFF\t0x100\n#define FORMRADIO_UNISON\t\t0x200\n#define FORMTEXT_MULTILINE\t\t0x100\n#define FORMTEXT_PASSWORD\t\t0x200\n#define FORMTEXT_NOSCROLL\t\t0x400\n#define FORMTEXT_COMB\t\t\t0x800\n#define FORMCOMBO_EDIT\t\t\t0x100\n#define FORMLIST_MULTISELECT\t0x100\nclass CPDF_FormField : public CFX_Object\n{\npublic:\n\n    enum Type {\n        Unknown,\n        PushButton,\n        RadioButton,\n        CheckBox,\n        Text,\n        RichText,\n        File,\n        ListBox,\n        ComboBox,\n        Sign\n    };\n\n    CFX_WideString\t\t\tGetFullName();\n\n    Type\t\t\t\t\tGetType()\n    {\n        return m_Type;\n    }\n\n    FX_DWORD\t\t\t\tGetFlags()\n    {\n        return m_Flags;\n    }\n\n    CPDF_InterForm*\t\t\tGetInterForm() const\n    {\n        return m_pForm;\n    }\n\n    CPDF_Dictionary*\t\tGetFieldDict() const\n    {\n        return m_pDict;\n    }\n\n    void\t\t\t\t\tSetFieldDict(CPDF_Dictionary* pDict)\n    {\n        m_pDict = pDict;\n    }\n\n    FX_BOOL\t\t\t\t\tResetField(FX_BOOL bNotify = FALSE);\n\n\n\n    int\t\t\t\t\t\tCountControls()\n    {\n        return m_ControlList.GetSize();\n    }\n\n    CPDF_FormControl*\t\tGetControl(int index)\n    {\n        return (CPDF_FormControl*)m_ControlList.GetAt(index);\n    }\n\n    int\t\t\t\t\t\tGetControlIndex(const CPDF_FormControl* pControl);\n\n\n\n\n    int\t\t\t\t\t\tGetFieldType();\n\n\n\n\n    CPDF_AAction\t\t\tGetAdditionalAction();\n\n\n\n\n    CFX_WideString\t\t\tGetAlternateName();\n\n\n\n\n    CFX_WideString\t\t\tGetMappingName();\n\n\n\n\n    FX_DWORD\t\t\t\tGetFieldFlags();\n\n\n\n\n    CFX_ByteString\t\t\tGetDefaultStyle();\n\n\n\n\n    CFX_WideString\t\t\tGetRichTextString();\n\n\n\n    CFX_WideString\t\t\tGetValue();\n\n    CFX_WideString\t\t\tGetDefaultValue();\n\n    FX_BOOL\t\t\t\t\tSetValue(const CFX_WideString& value, FX_BOOL bNotify = FALSE);\n\n\n\n\n\n    int\t\t\t\t\t\tGetMaxLen();\n\n\n\n\n    int\t\t\t\t\t\tCountSelectedItems();\n\n    int\t\t\t\t\t\tGetSelectedIndex(int index);\n\n    FX_BOOL\t\t\t\t\tClearSelection(FX_BOOL bNotify = FALSE);\n\n    FX_BOOL\t\t\t\t\tIsItemSelected(int index);\n\n    FX_BOOL\t\t\t\t\tSetItemSelection(int index, FX_BOOL bSelected, FX_BOOL bNotify = FALSE);\n\n    FX_BOOL\t\t\t\t\tIsItemDefaultSelected(int index);\n\n    int\t\t\t\t\t\tGetDefaultSelectedItem();\n\n\n\n\n    int\t\t\t\t\t\tCountOptions();\n\n    CFX_WideString\t\t\tGetOptionLabel(int index);\n\n    CFX_WideString\t\t\tGetOptionValue(int index);\n\n    int\t\t\t\t\t\tFindOption(CFX_WideString csOptLabel);\n\n    int\t\t\t\t\t\tFindOptionValue(FX_LPCWSTR csOptValue, int iStartIndex = 0);\n\n\n\n\n    FX_BOOL\t\t\t\t\tCheckControl(int iControlIndex, FX_BOOL bChecked, FX_BOOL bNotify = FALSE);\n\n\n\n\n    int\t\t\t\t\t\tGetTopVisibleIndex();\n\n\n\n\n    int\t\t\t\t\t\tCountSelectedOptions();\n\n    int\t\t\t\t\t\tGetSelectedOptionIndex(int index);\n\n    FX_BOOL\t\t\t\t\tIsOptionSelected(int iOptIndex);\n\n    FX_BOOL\t\t\t\t\tSelectOption(int iOptIndex, FX_BOOL bSelected, FX_BOOL bNotify = FALSE);\n\n    FX_BOOL\t\t\t\t\tClearSelectedOptions(FX_BOOL bNotify = FALSE);\n\n\n\n\n    FX_FLOAT\t\t\t\tGetFontSize()\n    {\n        return m_FontSize;\n    }\n\n    CPDF_Font*\t\t\t\tGetFont()\n    {\n        return m_pFont;\n    }\n\nprotected:\n\n    CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict);\n\n    ~CPDF_FormField();\n\n    CPDF_FormField::Type\tm_Type;\n\n    FX_DWORD\t\t\t\tm_Flags;\n\n    CPDF_InterForm*\t\t\tm_pForm;\n\n    CPDF_Dictionary*\t\tm_pDict;\n\n    CFX_PtrArray\t\t\tm_ControlList;\n    friend class\t\t\tCPDF_InterForm;\n    friend class\t\t\tCPDF_FormControl;\n\n\n\n    CFX_WideString\t\t\tGetValue(FX_BOOL bDefault);\n\n    FX_BOOL\t\t\t\t\tSetValue(const CFX_WideString& value, FX_BOOL bDefault, FX_BOOL bNotify);\n\n\n    void\t\t\t\t\tSyncFieldFlags();\n\n    int\t\t\t\t\t\tFindListSel(CPDF_String* str);\n\n    CFX_WideString\t\t\tGetOptionText(int index, int sub_index);\n\n    void\t\t\t\t\tLoadDA();\n\n    void\t\t\t\t\tUpdateAP(CPDF_FormControl* pControl);\n\n\n\n    CFX_WideString\t\t\tGetCheckValue(FX_BOOL bDefault);\n\n    FX_BOOL\t\t\t\t\tSetCheckValue(const CFX_WideString& value, FX_BOOL bDefault, FX_BOOL bNotify);\n\n\n    FX_FLOAT\t\t\t\tm_FontSize;\n\n    CPDF_Font*\t\t\t\tm_pFont;\n};\nCPDF_Object*\tFPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict, const FX_CHAR* name, int nLevel = 0);\nclass CPDF_IconFit : public CFX_Object\n{\npublic:\n\n    CPDF_IconFit(CPDF_Dictionary* pDict = NULL)\n    {\n        m_pDict = pDict;\n    }\n\n    operator CPDF_Dictionary*() const\n    {\n        return m_pDict;\n    }\n\n\n\n\n    enum ScaleMethod {\n        Always = 0,\n        Bigger,\n        Smaller,\n        Never\n    };\n\n    ScaleMethod\t\t\t\tGetScaleMethod();\n\n\n\n\n    FX_BOOL\t\t\t\t\tIsProportionalScale();\n\n\n\n\n    void\t\t\t\t\tGetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom);\n\n\n\n\n    FX_BOOL\t\t\t\t\tGetFittingBounds();\n\n\n    CPDF_Dictionary*\t\tm_pDict;\n};\n\n#define TEXTPOS_CAPTION\t\t0\n#define TEXTPOS_ICON\t\t1\n#define TEXTPOS_BELOW\t\t2\n#define TEXTPOS_ABOVE\t\t3\n#define TEXTPOS_RIGHT\t\t4\n#define TEXTPOS_LEFT\t\t5\n#define TEXTPOS_OVERLAID\t6\nclass CPDF_FormControl : public CFX_Object\n{\npublic:\n\n    CPDF_FormField::Type\tGetType()\n    {\n        return m_pField->GetType();\n    }\n\n    CPDF_InterForm*\t\t\tGetInterForm() const\n    {\n        return m_pForm;\n    }\n\n    CPDF_FormField*\t\t\tGetField() const\n    {\n        return m_pField;\n    }\n\n    CPDF_Dictionary*\t\tGetWidget() const\n    {\n        return m_pWidgetDict;\n    }\n\n    CFX_FloatRect\t\t\tGetRect();\n\n    void\t\t\t\t\tDrawControl(CFX_RenderDevice* pDevice, CFX_AffineMatrix* pMatrix,\n                                        CPDF_Page* pPage, CPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions = NULL);\n\n\n\n    CFX_ByteString\t\t\tGetCheckedAPState();\n\n    CFX_WideString\t\t\tGetExportValue();\n\n    FX_BOOL\t\t\t\t\tIsChecked();\n\n    FX_BOOL\t\t\t\t\tIsDefaultChecked();\n\n\n\n\n    enum HighlightingMode\t{\n        None = 0,\n        Invert,\n        Outline,\n        Push,\n        Toggle\n    };\n\n    HighlightingMode\t\tGetHighlightingMode();\n\n\n\n\n    FX_BOOL\t\t\t\t\tHasMKEntry(CFX_ByteString csEntry);\n\n\n\n\n    int\t\t\t\t\t\tGetRotation();\n\n\n\n\n    inline FX_ARGB\t\t\tGetBorderColor(int& iColorType)\n    {\n        return GetColor(iColorType, \"BC\");\n    }\n\n    inline FX_FLOAT\t\t\tGetOriginalBorderColor(int index)\n    {\n        return GetOriginalColor(index, \"BC\");\n    }\n\n    inline void\t\t\t\tGetOriginalBorderColor(int& iColorType, FX_FLOAT fc[4])\n    {\n        GetOriginalColor(iColorType, fc, \"BC\");\n    }\n\n\n\n\n    inline FX_ARGB\t\t\tGetBackgroundColor(int& iColorType)\n    {\n        return GetColor(iColorType, \"BG\");\n    }\n\n    inline FX_FLOAT\t\t\tGetOriginalBackgroundColor(int index)\n    {\n        return GetOriginalColor(index, \"BG\");\n    }\n\n    inline void\t\t\t\tGetOriginalBackgroundColor(int& iColorType, FX_FLOAT fc[4])\n    {\n        GetOriginalColor(iColorType, fc, \"BG\");\n    }\n\n\n\n\n    inline CFX_WideString\tGetNormalCaption()\n    {\n        return GetCaption(\"CA\");\n    }\n\n\n\n\n    inline CFX_WideString\tGetRolloverCaption()\n    {\n        return GetCaption(\"RC\");\n    }\n\n\n\n\n    inline CFX_WideString\tGetDownCaption()\n    {\n        return GetCaption(\"AC\");\n    }\n\n\n\n\n    inline CPDF_Stream*\t\tGetNormalIcon()\n    {\n        return GetIcon(\"I\");\n    }\n\n\n\n\n    inline CPDF_Stream*\t\tGetRolloverIcon()\n    {\n        return GetIcon(\"RI\");\n    }\n\n\n\n\n    inline CPDF_Stream*\t\tGetDownIcon()\n    {\n        return GetIcon(\"IX\");\n    }\n\n\n\n\n    CPDF_IconFit\t\t\tGetIconFit();\n\n\n\n\n    int\t\t\t\t\t\tGetTextPosition();\n\n\n\n\n    CPDF_Action\t\t\t\tGetAction();\n\n\n\n\n    CPDF_AAction\t\t\tGetAdditionalAction();\n\n\n\n\n    CPDF_DefaultAppearance\tGetDefaultAppearance();\n\n    CPDF_Font*\t\t\t\tGetDefaultControlFont();\n\n\n\n\n    int\t\t\t\t\t\tGetControlAlignment();\n\nprotected:\n\n    CPDF_FormControl(CPDF_FormField* pField, CPDF_Dictionary* pWidgetDict);\n\n    CFX_ByteString\t\t\tGetOnStateName();\n\n    void\t\t\t\t\tSetOnStateName(const CFX_ByteString& csOn);\n\n    void\t\t\t\t\tCheckControl(FX_BOOL bChecked);\n\n    FX_ARGB\t\t\t\t\tGetColor(int& iColorType, CFX_ByteString csEntry);\n\n    FX_FLOAT\t\t\t\tGetOriginalColor(int index, CFX_ByteString csEntry);\n\n    void\t\t\t\t\tGetOriginalColor(int& iColorType, FX_FLOAT fc[4], CFX_ByteString csEntry);\n\n    CFX_WideString\t\t\tGetCaption(CFX_ByteString csEntry);\n\n    CPDF_Stream*\t\t\tGetIcon(CFX_ByteString csEntry);\n\n    CPDF_ApSettings\t\t\tGetMK(FX_BOOL bCreate);\n\n    CPDF_InterForm*\t\t\tm_pForm;\n\n    CPDF_FormField*\t\t\tm_pField;\n\n    CPDF_Dictionary*\t\tm_pWidgetDict;\n    friend class\t\t\tCPDF_InterForm;\n    friend class\t\t\tCPDF_FormField;\n};\nclass CPDF_FormNotify : public CFX_Object\n{\npublic:\n\n    virtual ~CPDF_FormNotify() {}\n\n    virtual int\t\tBeforeValueChange(const CPDF_FormField* pField, CFX_WideString& csValue)\n    {\n        return 0;\n    }\n\n    virtual int\t\tAfterValueChange(const CPDF_FormField* pField)\n    {\n        return 0;\n    }\n\n    virtual int\t\tBeforeSelectionChange(const CPDF_FormField* pField, CFX_WideString& csValue)\n    {\n        return 0;\n    }\n\n    virtual int\t\tAfterSelectionChange(const CPDF_FormField* pField)\n    {\n        return 0;\n    }\n\n    virtual int\t\tAfterCheckedStatusChange(const CPDF_FormField* pField, const CFX_ByteArray& statusArray)\n    {\n        return 0;\n    }\n\n    virtual int\t\tBeforeFormReset(const CPDF_InterForm* pForm)\n    {\n        return 0;\n    }\n\n    virtual int\t\tAfterFormReset(const CPDF_InterForm* pForm)\n    {\n        return 0;\n    }\n\n    virtual int\t\tBeforeFormImportData(const CPDF_InterForm* pForm)\n    {\n        return 0;\n    }\n\n    virtual int\t\tAfterFormImportData(const CPDF_InterForm* pForm)\n    {\n        return 0;\n    }\n};\nFX_BOOL\t\tFPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict);\nclass CPDF_PageLabel : public CFX_Object\n{\npublic:\n\n    CPDF_PageLabel(CPDF_Document* pDocument)\n    {\n        m_pDocument = pDocument;\n    }\n\n\n    CFX_WideString\t\t\t\t\tGetLabel(int nPage) const;\n\n    FX_INT32\t\t\t\t\t\tGetPageByLabel(FX_BSTR bsLabel) const;\n\n\n    FX_INT32\t\t\t\t\t\tGetPageByLabel(FX_WSTR wsLabel) const;\n\nprotected:\n    CPDF_Document*\t\t\t\t\tm_pDocument;\n};\nclass CPDF_Metadata\n{\npublic:\n\n    CPDF_Metadata();\n\n\n    ~CPDF_Metadata();\n\n    void\t\t\t\tLoadDoc(CPDF_Document *pDoc);\n\n\n    FX_INT32\t\t\tGetString(FX_BSTR bsItem, CFX_WideString &wsStr);\n\n    CXML_Element*\t\tGetRoot() const;\n\n    CXML_Element*\t\tGetRDF() const;\n\nprotected:\n    FX_LPVOID\tm_pData;\n};\nclass CPDF_ViewerPreferences\n{\npublic:\n\n    CPDF_ViewerPreferences(CPDF_Document *pDoc);\n\n\n    ~CPDF_ViewerPreferences();\n\n\n    FX_BOOL IsDirectionR2L() const;\n\n    FX_BOOL PrintScaling() const;\n\n    FX_INT32 NumCopies() const;\n\n    CPDF_Array* PrintPageRange() const;\n\n    CFX_ByteString Duplex() const;\n\nprotected:\n    CPDF_Document*\tm_pDoc;\n};\nclass CPDF_ApSettings : public CFX_Object\n{\npublic:\n\n    CPDF_ApSettings(CPDF_Dictionary* pDict = NULL)\n    {\n        m_pDict = pDict;\n    }\n\n    operator CPDF_Dictionary* () const\n    {\n        return m_pDict;\n    }\n\n    FX_BOOL\t\t\t\t\tHasMKEntry(FX_BSTR csEntry);\n\n\n\n    int\t\t\t\t\t\tGetRotation();\n\n\n\n\n    inline FX_ARGB\t\t\tGetBorderColor(int& iColorType)\n    {\n        return GetColor(iColorType, FX_BSTRC(\"BC\"));\n    }\n\n    inline FX_FLOAT\t\t\tGetOriginalBorderColor(int index)\n    {\n        return GetOriginalColor(index, FX_BSTRC(\"BC\"));\n    }\n\n    inline void\t\t\t\tGetOriginalBorderColor(int& iColorType, FX_FLOAT fc[4])\n    {\n        GetOriginalColor(iColorType, fc, FX_BSTRC(\"BC\"));\n    }\n\n\n\n\n    inline FX_ARGB\t\t\tGetBackgroundColor(int& iColorType)\n    {\n        return GetColor(iColorType, FX_BSTRC(\"BG\"));\n    }\n\n    inline FX_FLOAT\t\t\tGetOriginalBackgroundColor(int index)\n    {\n        return GetOriginalColor(index, FX_BSTRC(\"BG\"));\n    }\n\n    inline void\t\t\t\tGetOriginalBackgroundColor(int& iColorType, FX_FLOAT fc[4])\n    {\n        GetOriginalColor(iColorType, fc, FX_BSTRC(\"BG\"));\n    }\n\n\n\n\n    inline CFX_WideString\tGetNormalCaption()\n    {\n        return GetCaption(FX_BSTRC(\"CA\"));\n    }\n\n\n\n\n    inline CFX_WideString\tGetRolloverCaption()\n    {\n        return GetCaption(FX_BSTRC(\"RC\"));\n    }\n\n\n\n\n    inline CFX_WideString\tGetDownCaption()\n    {\n        return GetCaption(FX_BSTRC(\"AC\"));\n    }\n\n\n\n\n    inline CPDF_Stream*\t\tGetNormalIcon()\n    {\n        return GetIcon(FX_BSTRC(\"I\"));\n    }\n\n\n\n\n    inline CPDF_Stream*\t\tGetRolloverIcon()\n    {\n        return GetIcon(FX_BSTRC(\"RI\"));\n    }\n\n\n\n\n    inline CPDF_Stream*\t\tGetDownIcon()\n    {\n        return GetIcon(FX_BSTRC(\"IX\"));\n    }\n\n\n\n\n    CPDF_IconFit\t\t\tGetIconFit();\n\n\n\n\n    int\t\t\t\t\t\tGetTextPosition();\n\n    CPDF_Dictionary*\t\tm_pDict;\nprotected:\n\n    FX_ARGB\t\t\t\t\tGetColor(int& iColorType, FX_BSTR csEntry);\n\n    FX_FLOAT\t\t\t\tGetOriginalColor(int index, FX_BSTR csEntry);\n\n    void\t\t\t\t\tGetOriginalColor(int& iColorType, FX_FLOAT fc[4], FX_BSTR csEntry);\n\n    CFX_WideString\t\t\tGetCaption(FX_BSTR csEntry);\n\n    CPDF_Stream*\t\t\tGetIcon(FX_BSTR csEntry);\n    friend class\t\t\tCPDF_FormControl;\n};\n#endif\n"
  },
  {
    "path": "core/include/fpdfdoc/fpdf_tagged.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDF_TAGGED_H_\n#define _FPDF_TAGGED_H_\nclass CPDF_StructTree;\nclass CPDF_StructElement;\nstruct CPDF_StructKid;\nclass CPDF_Document;\nclass CPDF_Page;\nclass IPDF_ReflowEngine;\nclass IPDF_ReflowedPage;\nclass CPDF_StructTree : public CFX_Object\n{\npublic:\n\n    static CPDF_StructTree* LoadDoc(const CPDF_Document* pDoc);\n\n    static CPDF_StructTree* LoadPage(const CPDF_Document* pDoc, const CPDF_Dictionary* pPageDict);\n\n    virtual ~CPDF_StructTree() {}\n\n    virtual int\t\t\tCountTopElements() const = 0;\n\n    virtual CPDF_StructElement*\tGetTopElement(int i) const = 0;\n};\nstruct CPDF_StructKid {\n    enum {\n        Invalid,\n        Element,\n        PageContent,\n        StreamContent,\n        Object\n    } m_Type;\n\n    union {\n        struct {\n\n            CPDF_StructElement*\tm_pElement;\n\n            CPDF_Dictionary*\tm_pDict;\n        } m_Element;\n        struct {\n\n            FX_DWORD\t\t\tm_PageObjNum;\n\n            FX_DWORD\t\t\tm_ContentId;\n        } m_PageContent;\n        struct {\n\n            FX_DWORD\t\t\tm_PageObjNum;\n\n            FX_DWORD\t\t\tm_ContentId;\n\n            FX_DWORD\t\t\tm_RefObjNum;\n        } m_StreamContent;\n        struct {\n\n            FX_DWORD\t\t\tm_PageObjNum;\n\n            FX_DWORD\t\t\tm_RefObjNum;\n        } m_Object;\n    };\n};\nclass CPDF_StructElement : public CFX_Object\n{\npublic:\n\n    virtual CPDF_StructTree*\tGetTree() const = 0;\n\n    virtual const CFX_ByteString&\tGetType() const = 0;\n\n    virtual CPDF_StructElement*\tGetParent() const = 0;\n\n    virtual CPDF_Dictionary *\tGetDict() const = 0;\n\n    virtual int\t\t\t\t\tCountKids() const = 0;\n\n    virtual const CPDF_StructKid&\tGetKid(int index) const = 0;\n\n    virtual CFX_PtrArray*\t\tGetObjectArray() = 0;\n\n    virtual CPDF_Object*\t\tGetAttr(FX_BSTR owner, FX_BSTR name, FX_BOOL bInheritable = FALSE, FX_FLOAT fLevel = 0.0F) = 0;\n\n\n\n    virtual CFX_ByteString\t\tGetName(FX_BSTR owner, FX_BSTR name, FX_BSTR default_value, FX_BOOL bInheritable = FALSE, int subindex = -1) = 0;\n\n    virtual FX_ARGB\t\t\t\tGetColor(FX_BSTR owner, FX_BSTR name, FX_ARGB default_value, FX_BOOL bInheritable = FALSE, int subindex = -1) = 0;\n\n    virtual FX_FLOAT\t\t\tGetNumber(FX_BSTR owner, FX_BSTR name, FX_FLOAT default_value, FX_BOOL bInheritable = FALSE, int subindex = -1) = 0;\n\n    virtual int\t\t\t\t\tGetInteger(FX_BSTR owner, FX_BSTR name, int default_value, FX_BOOL bInheritable = FALSE, int subindex = -1) = 0;\n\n};\n#endif\n"
  },
  {
    "path": "core/include/fpdfdoc/fpdf_vt.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDF_VT_H_\n#define _FPDF_VT_H_\n#include \"../fxcrt/fx_basic.h\"\n#include \"../fpdfapi/fpdf_parser.h\"\nstruct CPVT_WordPlace;\nstruct CPVT_WordRange;\nstruct CPVT_Word;\nstruct CPVT_Line;\nstruct CPVT_Section;\nclass IPDF_VariableText_Provider;\nclass IPDF_VariableText_Iterator;\nclass IPDF_VariableText;\nstruct CPVT_WordPlace {\n\n    CPVT_WordPlace() : nSecIndex(-1), nLineIndex(-1), nWordIndex(-1)\n    {\n    }\n\n    CPVT_WordPlace(FX_INT32 nSecIndex, FX_INT32 nLineIndex, FX_INT32 nWordIndex)\n    {\n        this->nSecIndex = nSecIndex;\n        this->nLineIndex = nLineIndex;\n        this->nWordIndex = nWordIndex;\n    }\n\n    void Default()\n    {\n        nSecIndex = nLineIndex = nWordIndex = -1;\n    }\n\n    FX_BOOL operator == (const CPVT_WordPlace & wp) const\n    {\n        return wp.nSecIndex == this->nSecIndex && wp.nLineIndex == this->nLineIndex && wp.nWordIndex == this->nWordIndex;\n    }\n\n    FX_BOOL operator != (const CPVT_WordPlace & wp) const\n    {\n        return wp.nSecIndex != this->nSecIndex || wp.nLineIndex != this->nLineIndex || wp.nWordIndex != this->nWordIndex;\n    }\n\n    inline FX_INT32 WordCmp(const CPVT_WordPlace & wp) const\n    {\n        if (this->nSecIndex > wp.nSecIndex) {\n            return 1;\n        }\n        if (this->nSecIndex < wp.nSecIndex) {\n            return -1;\n        }\n        if (this->nLineIndex > wp.nLineIndex) {\n            return 1;\n        }\n        if (this->nLineIndex < wp.nLineIndex) {\n            return -1;\n        }\n        if (this->nWordIndex > wp.nWordIndex) {\n            return 1;\n        }\n        if (this->nWordIndex < wp.nWordIndex) {\n            return -1;\n        }\n        return 0;\n    }\n\n    inline FX_INT32 LineCmp(const CPVT_WordPlace & wp) const\n    {\n        if (this->nSecIndex > wp.nSecIndex) {\n            return 1;\n        }\n        if (this->nSecIndex < wp.nSecIndex) {\n            return -1;\n        }\n        if (this->nLineIndex > wp.nLineIndex) {\n            return 1;\n        }\n        if (this->nLineIndex < wp.nLineIndex) {\n            return -1;\n        }\n        return 0;\n    }\n\n    inline FX_INT32 SecCmp(const CPVT_WordPlace & wp) const\n    {\n        if (this->nSecIndex > wp.nSecIndex) {\n            return 1;\n        }\n        if (this->nSecIndex < wp.nSecIndex) {\n            return -1;\n        }\n        return 0;\n    }\n\n    FX_INT32\t\t\t\t\t\t\tnSecIndex;\n\n    FX_INT32\t\t\t\t\t\t\tnLineIndex;\n\n    FX_INT32\t\t\t\t\t\t\tnWordIndex;\n};\nstruct CPVT_WordRange {\n\n    CPVT_WordRange()\n    {\n    }\n\n    CPVT_WordRange(const CPVT_WordPlace & begin, const CPVT_WordPlace & end)\n    {\n        Set(begin, end);\n    }\n\n    void Default()\n    {\n        BeginPos.Default();\n        EndPos.Default();\n    }\n\n    void Set(const CPVT_WordPlace & begin, const CPVT_WordPlace & end)\n    {\n        this->BeginPos = begin;\n        this->EndPos = end;\n        SwapWordPlace();\n    }\n\n    void SetBeginPos(const CPVT_WordPlace & begin)\n    {\n        this->BeginPos = begin;\n        SwapWordPlace();\n    }\n\n    void SetEndPos(const CPVT_WordPlace & end)\n    {\n        this->EndPos = end;\n        SwapWordPlace();\n    }\n\n    FX_BOOL IsExist() const\n    {\n        return this->BeginPos != this->EndPos;\n    }\n\n    FX_BOOL operator != (const CPVT_WordRange & wr) const\n    {\n        return wr.BeginPos != this->BeginPos || wr.EndPos != this->EndPos;\n    }\n\n    void SwapWordPlace()\n    {\n        if (BeginPos.WordCmp(EndPos) > 0) {\n            CPVT_WordPlace place = EndPos;\n            EndPos = BeginPos;\n            BeginPos = place;\n        }\n    }\n\n    CPVT_WordPlace BeginPos;\n\n    CPVT_WordPlace EndPos;\n};\nstruct CPVT_SecProps : public CFX_Object {\n\n    CPVT_SecProps() : fLineLeading(0.0f), fLineIndent(0.0f), nAlignment(0)\n    {\n    }\n\n    CPVT_SecProps(FX_FLOAT lineLeading, FX_FLOAT lineIndent, FX_INT32 alignment) :\n        fLineLeading(lineLeading), fLineIndent(lineIndent), nAlignment(alignment)\n    {\n    }\n\n    CPVT_SecProps(const CPVT_SecProps & other) :\n        fLineLeading(other.fLineLeading), fLineIndent(other.fLineIndent), nAlignment(other.nAlignment)\n    {\n    }\n\n    FX_FLOAT\t\t\tfLineLeading;\n\n    FX_FLOAT\t\t\tfLineIndent;\n\n    FX_INT32\t\t\tnAlignment;\n};\nstruct CPVT_WordProps : public CFX_Object {\n\n    CPVT_WordProps() : nFontIndex(-1), fFontSize(0.0f), dwWordColor(0), nScriptType(0), nWordStyle(0),\n        fCharSpace(0.0f), nHorzScale(0)\n    {\n    }\n\n    CPVT_WordProps(FX_INT32\tfontIndex, FX_FLOAT fontSize, FX_COLORREF wordColor = 0, FX_INT32 scriptType = 0, FX_INT32 wordStyle = 0,\n                   FX_FLOAT charSpace = 0, FX_INT32 horzScale = 100) :\n        nFontIndex(fontIndex), fFontSize(fontSize), dwWordColor(wordColor), nScriptType(scriptType),\n        nWordStyle(wordStyle), fCharSpace(charSpace), nHorzScale(horzScale)\n    {\n    }\n\n    CPVT_WordProps(const CPVT_WordProps & other) :\n        nFontIndex(other.nFontIndex), fFontSize(other.fFontSize), dwWordColor(other.dwWordColor),\n        nScriptType(other.nScriptType), nWordStyle(other.nWordStyle), fCharSpace(other.fCharSpace),\n        nHorzScale(other.nHorzScale)\n    {\n    }\n\n    FX_INT32\t\t\t\t\tnFontIndex;\n\n    FX_FLOAT\t\t\t\t\tfFontSize;\n\n    FX_COLORREF\t\t\t\t\tdwWordColor;\n\n    FX_INT32\t\t\t\t\tnScriptType;\n\n    FX_INT32\t\t\t\t\tnWordStyle;\n\n    FX_FLOAT\t\t\t\t\tfCharSpace;\n\n    FX_INT32\t\t\t\t\tnHorzScale;\n};\nstruct CPVT_Word {\n\n    CPVT_Word() : Word(0), nCharset(0), ptWord(0, 0), fAscent(0.0f), fDescent(0.0f), fWidth(0.0f),\n        fFontSize(0), WordProps()\n    {\n    }\n\n    FX_WORD\t\t\t\t\t\tWord;\n\n    FX_INT32\t\t\t\t\tnCharset;\n\n    CPVT_WordPlace\t\t\t\tWordPlace;\n\n    CPDF_Point\t\t\t\t\tptWord;\n\n    FX_FLOAT\t\t\t\t\tfAscent;\n\n    FX_FLOAT\t\t\t\t\tfDescent;\n\n    FX_FLOAT\t\t\t\t\tfWidth;\n\n    FX_INT32\t\t\t\t\tnFontIndex;\n\n    FX_FLOAT\t\t\t\t\tfFontSize;\n\n    CPVT_WordProps\t\t\t\tWordProps;\n};\nstruct CPVT_Line {\n\n    CPVT_Line() : ptLine(0, 0), fLineWidth(0.0f), fLineAscent(0.0f), fLineDescent(0.0f)\n    {\n    }\n\n    CPVT_WordPlace\t\t\t\tlineplace;\n\n    CPVT_WordPlace\t\t\t\tlineEnd;\n\n    CPDF_Point\t\t\t\t\tptLine;\n\n    FX_FLOAT\t\t\t\t\tfLineWidth;\n\n    FX_FLOAT\t\t\t\t\tfLineAscent;\n\n    FX_FLOAT\t\t\t\t\tfLineDescent;\n};\nstruct CPVT_Section {\n\n    CPVT_WordPlace\t\t\t\tsecplace;\n\n    CPDF_Rect\t\t\t\t\trcSection;\n\n    CPVT_SecProps\t\t\t\tSecProps;\n\n    CPVT_WordProps\t\t\t\tWordProps;\n};\nclass IPDF_VariableText_Provider\n{\npublic:\n\n    virtual FX_INT32\t\t\t\t\t\tGetCharWidth(FX_INT32 nFontIndex, FX_WORD word, FX_INT32 nWordStyle) = 0;\n\n    virtual FX_INT32\t\t\t\t\t\tGetTypeAscent(FX_INT32 nFontIndex) = 0;\n\n    virtual FX_INT32\t\t\t\t\t\tGetTypeDescent(FX_INT32 nFontIndex) = 0;\n\n    virtual FX_INT32\t\t\t\t\t\tGetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex) = 0;\n\n    virtual FX_BOOL\t\t\t\t\t\t\tIsLatinWord(FX_WORD word) = 0;\n\n    virtual FX_INT32\t\t\t\t\t\tGetDefaultFontIndex() = 0;\n};\nclass IPDF_VariableText_Iterator\n{\npublic:\n\n    virtual FX_BOOL\t\t\t\t\t\t\tNextWord() = 0;\n\n    virtual FX_BOOL\t\t\t\t\t\t\tPrevWord() = 0;\n\n    virtual FX_BOOL\t\t\t\t\t\t\tNextLine() = 0;\n\n    virtual FX_BOOL\t\t\t\t\t\t\tPrevLine() = 0;\n\n    virtual FX_BOOL\t\t\t\t\t\t\tNextSection() = 0;\n\n    virtual FX_BOOL\t\t\t\t\t\t\tPrevSection() = 0;\n\n    virtual FX_BOOL\t\t\t\t\t\t\tGetWord(CPVT_Word & word) const = 0;\n\n    virtual FX_BOOL\t\t\t\t\t\t\tSetWord(const CPVT_Word & word) = 0;\n\n    virtual FX_BOOL\t\t\t\t\t\t\tGetLine(CPVT_Line & line) const = 0;\n\n    virtual FX_BOOL\t\t\t\t\t\t\tGetSection(CPVT_Section & section) const = 0;\n\n    virtual\tFX_BOOL\t\t\t\t\t\t\tSetSection(const CPVT_Section & section) = 0;\n\n    virtual void\t\t\t\t\t\t\tSetAt(FX_INT32 nWordIndex) = 0;\n\n    virtual void\t\t\t\t\t\t\tSetAt(const CPVT_WordPlace & place) = 0;\n\n    virtual const CPVT_WordPlace &\t\t\tGetAt() const = 0;\n};\nclass IPDF_VariableText\n{\npublic:\n\n    static IPDF_VariableText*\t\t\tNewVariableText();\n\n    static void\t\t\t\t\t\t\tDelVariableText(IPDF_VariableText* pVT);\npublic:\n\n    virtual IPDF_VariableText_Provider*\t\tSetProvider(IPDF_VariableText_Provider * pProvider) = 0;\n\n    virtual IPDF_VariableText_Iterator*\t\tGetIterator() = 0;\n\n    virtual void\t\t\t\t\t\t\tSetPlateRect(const CPDF_Rect & rect) = 0;\n\n    virtual void\t\t\t\t\t\t\tSetAlignment(FX_INT32 nFormat = 0) = 0;\n\n    virtual void\t\t\t\t\t\t\tSetPasswordChar(FX_WORD wSubWord = '*') = 0;\n\n    virtual void\t\t\t\t\t\t\tSetLimitChar(FX_INT32 nLimitChar = 0) = 0;\n\n    virtual void\t\t\t\t\t\t\tSetCharArray(FX_INT32 nCharArray = 0) = 0;\n\n    virtual void\t\t\t\t\t\t\tSetCharSpace(FX_FLOAT fCharSpace = 0.0f) = 0;\n\n    virtual void\t\t\t\t\t\t\tSetHorzScale(FX_INT32 nHorzScale = 100) = 0;\n\n    virtual void\t\t\t\t\t\t\tSetMultiLine(FX_BOOL bMultiLine = TRUE) = 0;\n\n    virtual void\t\t\t\t\t\t\tSetAutoReturn(FX_BOOL bAuto = TRUE) = 0;\n\n    virtual void\t\t\t\t\t\t\tSetAutoFontSize(FX_BOOL bAuto = TRUE) = 0;\n\n    virtual void\t\t\t\t\t\t\tSetFontSize(FX_FLOAT fFontSize) = 0;\n\n    virtual void\t\t\t\t\t\t\tSetLineLeading(FX_FLOAT fLineLeading) = 0;\n\n    virtual void\t\t\t\t\t\t\tSetRichText(FX_BOOL bRichText) = 0;\n\n    virtual void\t\t\t\t\t\t\tInitialize() = 0;\n\n    virtual FX_BOOL\t\t\t\t\t\t\tIsValid() const = 0;\n\n    virtual FX_BOOL\t\t\t\t\t\t\tIsRichText() const = 0;\n\n    virtual void\t\t\t\t\t\t\tRearrangeAll() = 0;\n\n    virtual void\t\t\t\t\t\t\tRearrangePart(const CPVT_WordRange & PlaceRange) = 0;\n\n    virtual void\t\t\t\t\t\t\tResetAll() = 0;\n\n    virtual void\t\t\t\t\t\t\tSetText(FX_LPCWSTR text, FX_INT32 charset = 1, const CPVT_SecProps * pSecProps = NULL,\n            const CPVT_WordProps * pWordProps = NULL) = 0;\n\n    virtual CPVT_WordPlace\t\t\t\t\tInsertWord(const CPVT_WordPlace & place, FX_WORD word, FX_INT32 charset = 1,\n            const CPVT_WordProps * pWordProps = NULL) = 0;\n\n    virtual CPVT_WordPlace\t\t\t\t\tInsertSection(const CPVT_WordPlace & place, const CPVT_SecProps * pSecProps = NULL,\n            const CPVT_WordProps * pWordProps = NULL) = 0;\n\n    virtual CPVT_WordPlace\t\t\t\t\tInsertText(const CPVT_WordPlace & place, FX_LPCWSTR text, FX_INT32 charset = 1,\n            const CPVT_SecProps * pSecProps = NULL,\tconst CPVT_WordProps * pWordProps = NULL) = 0;\n\n    virtual CPVT_WordPlace\t\t\t\t\tDeleteWords(const CPVT_WordRange & PlaceRange) = 0;\n\n    virtual CPVT_WordPlace\t\t\t\t\tDeleteWord(const CPVT_WordPlace & place) = 0;\n\n    virtual CPVT_WordPlace\t\t\t\t\tBackSpaceWord(const CPVT_WordPlace & place) = 0;\n\n    virtual const CPDF_Rect &\t\t\t\tGetPlateRect() const = 0;\n\n    virtual CPDF_Rect\t\t\t\t\t\tGetContentRect() const = 0;\n\n    virtual FX_INT32\t\t\t\t\t\tGetTotalWords() const = 0;\n\n    virtual FX_FLOAT\t\t\t\t\t\tGetFontSize() const = 0;\n\n    virtual FX_INT32\t\t\t\t\t\tGetAlignment() const = 0;\n\n    virtual FX_WORD\t\t\t\t\t\t\tGetPasswordChar() const = 0;\n\n    virtual FX_INT32\t\t\t\t\t\tGetCharArray() const = 0;\n\n    virtual FX_INT32\t\t\t\t\t\tGetLimitChar() const = 0;\n\n    virtual FX_BOOL\t\t\t\t\t\t\tIsMultiLine() const = 0;\n\n    virtual FX_INT32\t\t\t\t\t\tGetHorzScale() const = 0;\n\n    virtual FX_FLOAT\t\t\t\t\t\tGetCharSpace() const = 0;\n\n    virtual CPVT_WordPlace\t\t\t\t\tGetBeginWordPlace() const = 0;\n\n    virtual CPVT_WordPlace\t\t\t\t\tGetEndWordPlace() const = 0;\n\n    virtual CPVT_WordPlace\t\t\t\t\tGetPrevWordPlace(const CPVT_WordPlace & place) const = 0;\n\n    virtual CPVT_WordPlace\t\t\t\t\tGetNextWordPlace(const CPVT_WordPlace & place) const = 0;\n\n    virtual CPVT_WordPlace\t\t\t\t\tSearchWordPlace(const CPDF_Point & point) const = 0;\n\n    virtual CPVT_WordPlace\t\t\t\t\tGetUpWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const = 0;\n\n    virtual CPVT_WordPlace\t\t\t\t\tGetDownWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const = 0;\n\n    virtual CPVT_WordPlace\t\t\t\t\tGetLineBeginPlace(const CPVT_WordPlace & place) const = 0;\n\n    virtual CPVT_WordPlace\t\t\t\t\tGetLineEndPlace(const CPVT_WordPlace & place) const = 0;\n\n    virtual CPVT_WordPlace\t\t\t\t\tGetSectionBeginPlace(const CPVT_WordPlace & place) const = 0;\n\n    virtual CPVT_WordPlace\t\t\t\t\tGetSectionEndPlace(const CPVT_WordPlace & place) const = 0;\n\n    virtual void\t\t\t\t\t\t\tUpdateWordPlace(CPVT_WordPlace & place) const = 0;\n\n    virtual CPVT_WordPlace\t\t\t\t\tAjustLineHeader(const CPVT_WordPlace & place, FX_BOOL bPrevOrNext) const = 0;\n\n    virtual FX_INT32\t\t\t\t\t\tWordPlaceToWordIndex(const CPVT_WordPlace & place) const = 0;\n\n    virtual CPVT_WordPlace\t\t\t\t\tWordIndexToWordPlace(FX_INT32 index) const = 0;\n};\n#endif\n"
  },
  {
    "path": "core/include/fpdftext/fpdf_text.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDF_TEXT_H_\n#define _FPDF_TEXT_H_\n#ifndef _FPDF_PARSER_\n#include \"../fpdfapi/fpdf_parser.h\"\n#endif\n#ifndef _FPDF_PAGEOBJ_H_\n#include \"../fpdfapi/fpdf_pageobj.h\"\n#endif\n#ifndef _FPDF_PAGE_\n#include \"../fpdfapi/fpdf_page.h\"\n#endif\nclass CPDF_PageObjects;\n#define PDF2TXT_AUTO_ROTATE\t\t1\n#define PDF2TXT_AUTO_WIDTH\t\t2\n#define PDF2TXT_KEEP_COLUMN\t\t4\n#define PDF2TXT_USE_OCR\t\t\t8\n#define PDF2TXT_INCLUDE_INVISIBLE\t16\nvoid PDF_GetPageText(CFX_ByteStringArray& lines, CPDF_Document* pDoc, CPDF_Dictionary* pPage,\n                     int iMinWidth, FX_DWORD flags);\nvoid PDF_GetPageText_Unicode(CFX_WideStringArray& lines, CPDF_Document* pDoc, CPDF_Dictionary* pPage,\n                             int iMinWidth, FX_DWORD flags);\nvoid PDF_GetTextStream_Unicode(CFX_WideTextBuf& buffer, CPDF_Document* pDoc, CPDF_Dictionary* pPage,\n                               FX_DWORD flags);\nCFX_WideString PDF_GetFirstTextLine_Unicode(CPDF_Document* pDoc, CPDF_Dictionary* pPage);\nclass IPDF_TextPage;\nclass IPDF_LinkExtract;\nclass IPDF_TextPageFind;\n#define CHAR_ERROR\t\t\t-1\n#define CHAR_NORMAL\t\t\t0\n#define CHAR_GENERATED\t\t1\n#define CHAR_UNUNICODE\t\t2\ntypedef struct {\n    FX_WCHAR\t\t\tm_Unicode;\n    FX_WCHAR\t\t\tm_Charcode;\n    FX_INT32\t\t\tm_Flag;\n    FX_FLOAT\t\t\tm_FontSize;\n    FX_FLOAT\t\t\tm_OriginX;\n    FX_FLOAT\t\t\tm_OriginY;\n    CFX_FloatRect\t\tm_CharBox;\n    CPDF_TextObject*\tm_pTextObj;\n    CFX_AffineMatrix\tm_Matrix;\n} FPDF_CHAR_INFO;\ntypedef\tCFX_ArrayTemplate<CFX_FloatRect> CFX_RectArray;\n#define FPDFTEXT_LRTB\t0\n#define FPDFTEXT_RLTB\t1\n#define FPDFTEXT_TBRL\t2\n#define FPDFTEXT_LEFT\t\t\t-1\n#define FPDFTEXT_RIGHT\t\t\t1\n#define FPDFTEXT_UP\t\t\t\t-2\n#define FPDFTEXT_DOWN\t\t\t2\nclass IPDF_ReflowedPage;\n#define FPDFTEXT_WRITINGMODE_UNKNOW\t0\n#define FPDFTEXT_WRITINGMODE_LRTB\t1\n#define FPDFTEXT_WRITINGMODE_RLTB\t2\n#define FPDFTEXT_WRITINGMODE_TBRL\t3\nclass CPDFText_ParseOptions : public CFX_Object\n{\npublic:\n\n    CPDFText_ParseOptions();\n    FX_BOOL\t\t\tm_bGetCharCodeOnly;\n    FX_BOOL\t\t\tm_bNormalizeObjs;\n    FX_BOOL\t\t\tm_bOutputHyphen;\n};\nclass IPDF_TextPage : public CFX_Object\n{\npublic:\n\n    virtual ~IPDF_TextPage() {}\n    static IPDF_TextPage*\tCreateTextPage(const CPDF_Page* pPage, CPDFText_ParseOptions ParserOptions);\n    static IPDF_TextPage*\tCreateTextPage(const CPDF_Page* pPage, int flags = 0);\n    static IPDF_TextPage*\tCreateTextPage(const CPDF_PageObjects* pObjs, int flags = 0);\n    static IPDF_TextPage*\tCreateReflowTextPage(IPDF_ReflowedPage* pRefPage);\n\n    virtual void\t\t\tNormalizeObjects(FX_BOOL bNormalize) = 0;\n\n    virtual FX_BOOL\t\t\tParseTextPage() = 0;\n\n\n    virtual FX_BOOL\t\t\tIsParsered() const = 0;\npublic:\n\n    virtual int CharIndexFromTextIndex(int TextIndex) const = 0;\n\n    virtual int TextIndexFromCharIndex(int CharIndex) const = 0;\n\n\n    virtual int\t\t\t\tCountChars() const = 0;\n\n    virtual\tvoid\t\t\tGetCharInfo(int index, FPDF_CHAR_INFO & info) const = 0;\n\n    virtual void\t\t\tGetRectArray(int start, int nCount, CFX_RectArray& rectArray) const = 0;\n\n\n\n    virtual int\t\t\t\tGetIndexAtPos(CPDF_Point point, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const = 0;\n\n    virtual int\t\t\t\tGetIndexAtPos(FX_FLOAT x, FX_FLOAT y, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const = 0;\n\n    virtual\tint\t\t\t\tGetOrderByDirection(int index, int direction) const = 0;\n\n    virtual CFX_WideString\tGetTextByRect(CFX_FloatRect rect) const = 0;\n\n    virtual void\t\t\tGetRectsArrayByRect(CFX_FloatRect rect, CFX_RectArray& resRectArray) const = 0;\n\n\n    virtual int\t\t\t\tCountRects(int start, int nCount) = 0;\n\n    virtual\tvoid\t\t\tGetRect(int rectIndex, FX_FLOAT& left, FX_FLOAT& top, FX_FLOAT& right, FX_FLOAT &bottom) const = 0;\n\n    virtual FX_BOOL\t\t\tGetBaselineRotate(int rectIndex, int& Rotate) = 0;\n\n    virtual FX_BOOL\t\t\tGetBaselineRotate(CFX_FloatRect rect, int& Rotate) = 0;\n\n    virtual\tint\t\t\t\tCountBoundedSegments(FX_FLOAT left, FX_FLOAT top, FX_FLOAT right, FX_FLOAT bottom, FX_BOOL bContains = FALSE) = 0;\n\n    virtual\tvoid\t\t\tGetBoundedSegment(int index, int& start, int& count) const = 0;\n\n\n    virtual int\t\t\t\tGetWordBreak(int index, int direction) const = 0;\n\n    virtual CFX_WideString\tGetPageText(int start = 0, int nCount = -1 ) const = 0;\n};\n#define FPDFTEXT_MATCHCASE      0x00000001\n#define FPDFTEXT_MATCHWHOLEWORD 0x00000002\n#define FPDFTEXT_CONSECUTIVE\t0x00000004\nclass IPDF_TextPageFind : public CFX_Object\n{\npublic:\n\n    virtual\t~IPDF_TextPageFind() {}\n\n    static\tIPDF_TextPageFind*\tCreatePageFind(const IPDF_TextPage* pTextPage);\npublic:\n\n    virtual\tFX_BOOL\t\t\t\tFindFirst(CFX_WideString findwhat, int flags, int startPos = 0) = 0;\n\n    virtual\tFX_BOOL\t\t\t\tFindNext() = 0;\n\n    virtual\tFX_BOOL\t\t\t\tFindPrev() = 0;\n\n    virtual void\t\t\t\tGetRectArray(CFX_RectArray& rects) const = 0;\n\n    virtual int\t\t\t\t\tGetCurOrder() const = 0;\n\n    virtual int\t\t\t\t\tGetMatchedCount() const = 0;\n};\nclass IPDF_LinkExtract : public CFX_Object\n{\npublic:\n\n    virtual\t~IPDF_LinkExtract() {}\n\n    static\tIPDF_LinkExtract*\tCreateLinkExtract();\n\n    virtual FX_BOOL\t\t\t\tExtractLinks(const IPDF_TextPage* pTextPage) = 0;\npublic:\n\n    virtual int\t\t\t\t\tCountLinks() const = 0;\n\n    virtual CFX_WideString\t\tGetURL(int index) const = 0;\n\n    virtual\tvoid\t\t\t\tGetBoundedSegment(int index, int& start, int& count) const = 0;\n\n    virtual void\t\t\t\tGetRects(int index, CFX_RectArray& rects) const = 0;\n};\n#endif\n"
  },
  {
    "path": "core/include/fxcodec/fx_codec.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_CODEC_H_\n#define _FX_CODEC_H_\n#ifndef _FXCRT_EXTENSION_\n#include \"../fxcrt/fx_ext.h\"\n#endif\n#include \"fx_codec_def.h\"\n#include \"fx_codec_provider.h\"\nclass CFX_DIBSource;\nclass ICodec_ScanlineDecoder;\nclass ICodec_BasicModule;\nclass ICodec_FaxModule;\nclass ICodec_JpegModule;\nclass ICodec_JpxModule;\nclass ICodec_Jbig2Module;\nclass ICodec_IccModule;\nclass ICodec_FlateModule;\nclass ICodec_Jbig2Encoder;\nclass ICodec_ScanlineDecoder;\nclass CCodec_ModuleMgr : public CFX_Object\n{\npublic:\n\n    static CCodec_ModuleMgr*\tCreate();\n\n    void\t\t\t\tDestroy();\n\n    void\t\t\t\tInitJbig2Decoder();\n\n    void\t\t\t\tInitJpxDecoder();\n\n\n    void\t\t\t\tInitIccDecoder();\n\n    ICodec_Jbig2Encoder*\t\tCreateJbig2Encoder();\nprotected:\n    CCodec_ModuleMgr();\n    ~CCodec_ModuleMgr();\npublic:\n    ICodec_BasicModule*\tGetBasicModule()\n    {\n        return m_pBasicModule;\n    }\n    ICodec_FaxModule*\tGetFaxModule()\n    {\n        return m_pFaxModule;\n    }\n    ICodec_JpegModule*\tGetJpegModule()\n    {\n        return m_pJpegModule;\n    }\n    ICodec_JpxModule*\tGetJpxModule()\n    {\n        return m_pJpxModule;\n    }\n    ICodec_Jbig2Module*\tGetJbig2Module()\n    {\n        return m_pJbig2Module;\n    }\n    ICodec_IccModule*\tGetIccModule()\n    {\n        return m_pIccModule;\n    }\n    ICodec_FlateModule*\tGetFlateModule()\n    {\n        return m_pFlateModule;\n    }\nprotected:\n    ICodec_BasicModule*\tm_pBasicModule;\n    ICodec_FaxModule*\tm_pFaxModule;\n    ICodec_JpegModule*\tm_pJpegModule;\n    ICodec_JpxModule*\tm_pJpxModule;\n    ICodec_Jbig2Module*\tm_pJbig2Module;\n    ICodec_IccModule*\tm_pIccModule;\n    ICodec_FlateModule*\tm_pFlateModule;\n\n};\nclass ICodec_BasicModule : public CFX_Object\n{\npublic:\n\n    virtual ~ICodec_BasicModule() {}\n    virtual FX_BOOL\tRunLengthEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,\n                                    FX_DWORD& dest_size) = 0;\n    virtual FX_BOOL\tA85Encode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,\n                              FX_DWORD& dest_size) = 0;\n    virtual ICodec_ScanlineDecoder*\tCreateRunLengthDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,\n            int nComps, int bpc) = 0;\n};\nclass ICodec_ScanlineDecoder : public CFX_Object\n{\npublic:\n\n    virtual ~ICodec_ScanlineDecoder() {}\n\n    virtual FX_DWORD\tGetSrcOffset() = 0;\n\n    virtual void\t\tDownScale(int dest_width, int dest_height) = 0;\n\n    virtual FX_LPBYTE\tGetScanline(int line) = 0;\n\n    virtual FX_BOOL\t\tSkipToScanline(int line, IFX_Pause* pPause) = 0;\n\n    virtual int\t\t\tGetWidth() = 0;\n\n    virtual int\t\t\tGetHeight() = 0;\n\n    virtual int\t\t\tCountComps() = 0;\n\n    virtual int\t\t\tGetBPC() = 0;\n\n    virtual FX_BOOL\t\tIsColorTransformed() = 0;\n\n    virtual void\t\tClearImageData() = 0;\n};\nclass ICodec_FlateModule : public CFX_Object\n{\npublic:\n\n    virtual ~ICodec_FlateModule() {}\n    virtual ICodec_ScanlineDecoder*\tCreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,\n            int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, int Columns) = 0;\n    virtual FX_DWORD\tFlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, FX_BOOL bEarlyChange,\n                                         int predictor, int Colors, int BitsPerComponent, int Columns,\n                                         FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size) = 0;\n    virtual FX_BOOL\t\tEncode(const FX_BYTE* src_buf, FX_DWORD src_size,\n                               int predictor, int Colors, int BitsPerComponent, int Columns,\n                               FX_LPBYTE& dest_buf, FX_DWORD& dest_size) = 0;\n    virtual FX_BOOL\t\tEncode(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size) = 0;\n};\nclass ICodec_FaxModule : public CFX_Object\n{\npublic:\n\n    virtual ~ICodec_FaxModule() {}\n\n    virtual ICodec_ScanlineDecoder*\tCreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,\n            int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows) = 0;\n\n\n    virtual FX_BOOL\t\tEncode(FX_LPCBYTE src_buf, int width, int height, int pitch,\n                               FX_LPBYTE& dest_buf, FX_DWORD& dest_size) = 0;\n};\nclass ICodec_JpegModule : public CFX_Object\n{\npublic:\n\n    virtual ~ICodec_JpegModule() {}\n\n    virtual void\t\tSetPovider(IFX_JpegProvider* pJP) = 0;\n\n    virtual ICodec_ScanlineDecoder*\tCreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size,\n            int width, int height, int nComps, FX_BOOL ColorTransform) = 0;\n\n    virtual FX_BOOL\t\tLoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,\n                                 int& num_components, int& bits_per_components, FX_BOOL& color_transform,\n                                 FX_LPBYTE* icc_buf_ptr = NULL, FX_DWORD* icc_length = NULL) = 0;\n\n    virtual FX_BOOL\t\tEncode(const class CFX_DIBSource* pSource, FX_LPBYTE& dest_buf, FX_STRSIZE& dest_size, int quality = 75,\n                               FX_LPCBYTE icc_buf = NULL, FX_DWORD icc_length = 0) = 0;\n\n    virtual void*\t\tStart() = 0;\n\n    virtual void\t\tFinish(void* pContext) = 0;\n\n    virtual void\t\tInput(void* pContext, FX_LPCBYTE src_buf, FX_DWORD src_size) = 0;\n\n    virtual int\t\t\tReadHeader(void* pContext, int* width, int* height, int* nComps) = 0;\n\n\n    virtual int\t\t\tStartScanline(void* pContext, int down_scale) = 0;\n\n\n    virtual FX_BOOL\t\tReadScanline(void* pContext, FX_LPBYTE dest_buf) = 0;\n\n\n    virtual FX_DWORD\tGetAvailInput(void* pContext, FX_LPBYTE* avail_buf_ptr = NULL) = 0;\n};\nclass ICodec_JpxModule : public CFX_Object\n{\npublic:\n\n    virtual ~ICodec_JpxModule() {}\n\n    virtual FX_LPVOID \tCreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_BOOL useColorSpace = FALSE) = 0;\n\n    virtual void\t\tGetImageInfo(FX_LPVOID ctx, FX_DWORD& width, FX_DWORD& height,\n                                     FX_DWORD& codestream_nComps, FX_DWORD& output_nComps) = 0;\n\n    virtual FX_BOOL\t\tDecode(FX_LPVOID ctx, FX_LPBYTE dest_data, int pitch,\n                               FX_BOOL bTranslateColor, FX_LPBYTE offsets) = 0;\n\n    virtual void\t\tDestroyDecoder(FX_LPVOID ctx) = 0;\n};\nclass ICodec_Jbig2Module : public CFX_Object\n{\npublic:\n\n    virtual ~ICodec_Jbig2Module() {}\n\n    virtual FX_BOOL\t\tDecode(FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,\n                               FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch)  = 0;\n\n    virtual FX_BOOL\t\tDecode(IFX_FileRead* file_ptr, FX_DWORD& width, FX_DWORD& height,\n                               FX_DWORD& pitch, FX_LPBYTE& dest_buf) = 0;\n    virtual void*\t\t\t\tCreateJbig2Context() = 0;\n\n    virtual FXCODEC_STATUS\t\tStartDecode(void* pJbig2Context, FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,\n                                            FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch, IFX_Pause* pPause) = 0;\n\n    virtual FXCODEC_STATUS\t\tStartDecode(void* pJbig2Context, IFX_FileRead* file_ptr,\n                                            FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf, IFX_Pause* pPause) = 0;\n    virtual FXCODEC_STATUS\t\tContinueDecode(void* pJbig2Content, IFX_Pause* pPause) = 0;\n    virtual void\t\t\t\tDestroyJbig2Context(void* pJbig2Content) = 0;\n};\nclass ICodec_Jbig2Encoder : public CFX_Object\n{\npublic:\n\n    virtual ~ICodec_Jbig2Encoder() {}\n};\nclass ICodec_IccModule : public CFX_Object\n{\npublic:\n    typedef enum {\n        IccCS_Unknown = 0,\n        IccCS_XYZ,\n        IccCS_Lab,\n        IccCS_Luv,\n        IccCS_YCbCr,\n        IccCS_Yxy,\n        IccCS_Hsv,\n        IccCS_Hls,\n        IccCS_Gray,\n        IccCS_Rgb,\n        IccCS_Cmyk,\n        IccCS_Cmy\n    } IccCS;\n    typedef struct _IccParam {\n        FX_DWORD\tVersion;\n        IccCS\t\tColorSpace;\n        FX_DWORD\tdwProfileType;\n        FX_DWORD\tdwFormat;\n        FX_LPBYTE\tpProfileData;\n        FX_DWORD\tdwProfileSize;\n        double\t\tGamma;\n    } IccParam;\n\n    virtual ~ICodec_IccModule() {}\n\n    virtual IccCS\t\t\tGetProfileCS(FX_LPCBYTE pProfileData, unsigned int dwProfileSize) = 0;\n\n    virtual IccCS\t\t\tGetProfileCS(IFX_FileRead* pFile) = 0;\n\n    virtual FX_LPVOID\tCreateTransform(ICodec_IccModule::IccParam* pInputParam,\n                                        ICodec_IccModule::IccParam* pOutputParam,\n                                        ICodec_IccModule::IccParam* pProofParam = NULL,\n                                        FX_DWORD dwIntent = Icc_INTENT_PERCEPTUAL,\n                                        FX_DWORD dwFlag = Icc_FLAGS_DEFAULT,\n                                        FX_DWORD dwPrfIntent = Icc_INTENT_ABSOLUTE_COLORIMETRIC,\n                                        FX_DWORD dwPrfFlag = Icc_FLAGS_SOFTPROOFING\n                                     ) = 0;\n\n\n    virtual FX_LPVOID\tCreateTransform_sRGB(FX_LPCBYTE pProfileData, unsigned int dwProfileSize, int nComponents, int intent = 0,\n            FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT) = 0;\n\n    virtual FX_LPVOID\tCreateTransform_CMYK(FX_LPCBYTE pSrcProfileData, unsigned int dwSrcProfileSize, int nSrcComponents,\n            FX_LPCBYTE pDstProfileData, unsigned int dwDstProfileSize, int intent = 0,\n            FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT,\n            FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT\n                                          ) = 0;\n\n    virtual void\t\t\tDestroyTransform(FX_LPVOID pTransform) = 0;\n\n    virtual void\t\t\tTranslate(FX_LPVOID pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues) = 0;\n\n    virtual void\t\t\tTranslateScanline(FX_LPVOID pTransform, FX_LPBYTE pDest, FX_LPCBYTE pSrc, int pixels) = 0;\n    virtual void                        SetComponents(FX_DWORD nComponents) = 0;\n};\nvoid AdobeCMYK_to_sRGB(FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B);\nvoid AdobeCMYK_to_sRGB1(FX_BYTE c, FX_BYTE m, FX_BYTE y, FX_BYTE k, FX_BYTE& R, FX_BYTE& G, FX_BYTE& B);\nFX_BOOL MD5ComputeID(FX_LPCVOID buf, FX_DWORD dwSize, FX_BYTE ID[16]);\n#endif\n"
  },
  {
    "path": "core/include/fxcodec/fx_codec_def.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_CODEC_DEF_H_\n#define _FX_CODEC_DEF_H_\nenum FXCODEC_STATUS {\n    FXCODEC_STATUS_ERROR = -1,\n    FXCODEC_STATUS_FRAME_READY,\n    FXCODEC_STATUS_FRAME_TOBECONTINUE,\n    FXCODEC_STATUS_DECODE_READY,\n    FXCODEC_STATUS_DECODE_TOBECONTINUE,\n    FXCODEC_STATUS_DECODE_FINISH,\n    FXCODEC_STATUS_ERR_MEMORY,\n    FXCODEC_STATUS_ERR_READ,\n    FXCODEC_STATUS_ERR_FLUSH,\n    FXCODEC_STATUS_ERR_FORMAT,\n    FXCODEC_STATUS_ERR_PARAMS\n};\n#define JP2_SPACE_INVALID\t-1\n#define JPX_SPACE_INVALID\t-1\n#define JP2_SPACE_bilevel1\t0\n#define JP2_SPACE_YCbCr1\t1\n#define JP2_SPACE_YCbCr2\t3\n#define JP2_SPACE_YCbCr3\t4\n#define JP2_SPACE_PhotoYCC\t9\n#define JP2_SPACE_CMY\t\t11\n#define JP2_SPACE_CMYK\t\t12\n#define JP2_SPACE_YCCK\t\t13\n#define JP2_SPACE_CIELab\t14\n#define JP2_SPACE_bilevel2\t15\n#define JP2_SPACE_sRGB\t\t16\n#define JP2_SPACE_sLUM\t\t17\n#define JP2_SPACE_sYCC\t\t18\n#define JP2_SPACE_CIEJab\t19\n#define JP2_SPACE_esRGB\t\t20\n#define JP2_SPACE_ROMMRGB\t21\n#define JP2_SPACE_YPbPr60\t22\n#define JP2_SPACE_YPbPr50\t23\n#define JP2_SPACE_esYCC\t\t24\n#define JP2_SPACE_iccLUM\t100\n#define JP2_SPACE_iccRGB\t101\n#define Icc_INTENT_PERCEPTUAL\t\t\t\t0\n#define Icc_INTENT_RELATIVE_COLORIMETRIC\t1\n#define Icc_INTENT_SATURATION\t\t\t\t2\n#define Icc_INTENT_ABSOLUTE_COLORIMETRIC\t3\n#define Icc_FORMAT_DEFAULT\t\t\t\t\t0\n#define Icc_FORMAT_SWAP\t\t\t\t\t\t(1<<10)\n#define Icc_FLAGS_DEFAULT\t\t\t\t\t0x0000\n#define Icc_FLAGS_BLACKPOINTCOMPENSATION\t0x2000\n#define Icc_FLAGS_NOWHITEONWHITEFIXUP\t\t0x0004\n#define Icc_FLAGS_HIGHRESPRECALC\t\t\t0x0400\n#define Icc_FLAGS_LOWRESPRECALC\t\t\t\t0x0800\n#define Icc_FLAGS_GAMUTCHECK\t\t\t\t0x1000\n#define Icc_FLAGS_SOFTPROOFING\t\t\t\t0x4000\n#define Icc_PARAMTYPE_NONE\t\t\t\t\t0\n#define Icc_PARAMTYPE_BUFFER\t\t\t\t1\n#define Icc_PARAMTYPE_PARAM\t\t\t\t\t2\n#define EXIFTAG_USHORT_RESUNIT\t\t\t\t296\n#define EXIFTAG_FLOAT_DPIX\t\t\t\t\t282\n#define EXIFTAG_FLOAT_DPIY\t\t\t\t\t283\n#define EXIFTAG_USHORT_ORIENTATION\t\t\t274\n#define EXIFTAG_STRING_MANUFACTURER\t\t\t271\n#define EXIFTAG_STRING_MODULE\t\t\t\t272\n#define EXIFTAG_STRING_SOFTWARE\t\t\t\t305\n#define EXIFTAG_STRING_IAMGEDESCRIPTION\t\t270\n#define EXIFTAG_STRING_DATETIME\t\t\t\t306\n#define EXIFTAG_STRING_COPYRIGHT\t\t\t33432\n#endif\n"
  },
  {
    "path": "core/include/fxcodec/fx_codec_provider.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_CODEC_PROVIDER_H_\n#define _FX_CODEC_PROVIDER_H_\nclass IFX_JpegProvider\n{\npublic:\n\n    virtual void\t\tRelease() = 0;\n\n    virtual void*\t\tCreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, int nComps, FX_BOOL ColorTransform) = 0;\n\n\n    virtual void\t\tDestroyDecoder(void* pDecoder) = 0;\n\n    virtual void\t\tDownScale(void* pDecoder, int dest_width, int dest_height) = 0;\n\n    virtual FX_BOOL\t\tRewind(void* pDecoder) = 0;\n\n    virtual FX_LPBYTE\tGetNextLine(void* pDecoder) = 0;\n\n    virtual FX_DWORD\tGetSrcOffset(void* pDecoder) = 0;\n\n\n    virtual FX_BOOL\t\tLoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,\n                                 int& num_components, int& bits_per_components, FX_BOOL& color_transform,\n                                 FX_LPBYTE* icc_buf_ptr = NULL, FX_DWORD* icc_length = NULL) = 0;\n\n    virtual FX_BOOL\t\tEncode(const class CFX_DIBSource* pSource, FX_LPBYTE& dest_buf, FX_STRSIZE& dest_size, int quality = 75,\n                               FX_LPCBYTE icc_buf = NULL, FX_DWORD icc_length = 0) = 0;\n\n    virtual void*\t\tStart() = 0;\n\n    virtual void\t\tFinish(void* pContext) = 0;\n\n    virtual void\t\tInput(void* pContext, FX_LPCBYTE src_buf, FX_DWORD src_size) = 0;\n\n    virtual int\t\t\tReadHeader(void* pContext, int* width, int* height, int* nComps) = 0;\n\n\n    virtual int\t\t\tStartScanline(void* pContext, int down_scale) = 0;\n\n\n    virtual FX_BOOL\t\tReadScanline(void* pContext, FX_LPBYTE dest_buf) = 0;\n\n\n    virtual FX_DWORD\tGetAvailInput(void* pContext, FX_LPBYTE* avail_buf_ptr = NULL) = 0;\n};\n#endif\n"
  },
  {
    "path": "core/include/fxcrt/fx_arb.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_ARABIC_\n#define _FX_ARABIC_\nclass IFX_BidiChar\n{\npublic:\n    static IFX_BidiChar*\tCreate();\n    virtual void\t\t\tRelease() = 0;\n    virtual void\t\t\tSetPolicy(FX_BOOL bSeparateNeutral = TRUE) = 0;\n    virtual FX_BOOL\t\t\tAppendChar(FX_WCHAR wch) = 0;\n    virtual FX_BOOL\t\t\tEndChar() = 0;\n    virtual FX_INT32\t\tGetBidiInfo(FX_INT32 &iStart, FX_INT32 &iCount) = 0;\n    virtual void\t\t\tReset() = 0;\n};\n#endif\n"
  },
  {
    "path": "core/include/fxcrt/fx_basic.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_BASIC_H_\n#define _FX_BASIC_H_\n#ifndef _FX_SYSTEM_H_\n#include \"fx_system.h\"\n#endif\n#ifndef _FX_MEMORY_H_\n#include \"fx_memory.h\"\n#endif\n#ifndef _FX_STRING_H_\n#include \"fx_string.h\"\n#endif\n#ifndef _FX_STREAM_H_\n#include \"fx_stream.h\"\n#endif\nclass CFX_BinaryBuf : public CFX_Object\n{\npublic:\n    CFX_BinaryBuf();\n    CFX_BinaryBuf(FX_STRSIZE size);\n\n    ~CFX_BinaryBuf();\n\n    void\t\t\t\t\tClear();\n\n    void\t\t\t\t\tEstimateSize(FX_STRSIZE size, FX_STRSIZE alloc_step = 0);\n\n    void\t\t\t\t\tAppendBlock(const void* pBuf, FX_STRSIZE size);\n\n    void\t\t\t\t\tAppendFill(FX_BYTE byte, FX_STRSIZE count);\n\n    void\t\t\t\t\tAppendString(FX_BSTR str)\n    {\n        AppendBlock(str.GetPtr(), str.GetLength());\n    }\n\n    inline void\t\t\t\tAppendByte(FX_BYTE byte)\n    {\n        if (m_AllocSize <= m_DataSize) {\n            ExpandBuf(1);\n        }\n        m_pBuffer[m_DataSize++] = byte;\n    }\n\n    void\t\t\t\t\tInsertBlock(FX_STRSIZE pos, const void* pBuf, FX_STRSIZE size);\n\n    void\t\t\t\t\tAttachData(void* pBuf, FX_STRSIZE size);\n\n    void\t\t\t\t\tCopyData(const void* pBuf, FX_STRSIZE size);\n\n    void\t\t\t\t\tTakeOver(CFX_BinaryBuf& other);\n\n    void\t\t\t\t\tDelete(int start_index, int count);\n\n    FX_LPBYTE\t\t\t\tGetBuffer() const\n    {\n        return m_pBuffer;\n    }\n\n    FX_STRSIZE\t\t\t\tGetSize() const\n    {\n        return m_DataSize;\n    }\n\n    CFX_ByteStringC\t\t\tGetByteString() const;\n\n    void\t\t\t\t\tDetachBuffer();\nprotected:\n\n    FX_STRSIZE\t\t\t\tm_AllocStep;\n\n    FX_LPBYTE\t\t\t\tm_pBuffer;\n\n    FX_STRSIZE\t\t\t\tm_DataSize;\n\n    FX_STRSIZE\t\t\t\tm_AllocSize;\n\n    void\t\t\t\t\tExpandBuf(FX_STRSIZE size);\n};\nclass CFX_ByteTextBuf : public CFX_BinaryBuf\n{\npublic:\n\n    void\t\t\t\t\toperator = (FX_BSTR str);\n\n    void\t\t\t\t\tAppendChar(int ch)\n    {\n        AppendByte((FX_BYTE)ch);\n    }\n\n    CFX_ByteTextBuf&\t\toperator << (int i);\n\n    CFX_ByteTextBuf&\t\toperator << (FX_DWORD i);\n\n    CFX_ByteTextBuf&\t\toperator << (double f);\n\n    CFX_ByteTextBuf&\t\toperator << (FX_BSTR lpsz);\n\n    CFX_ByteTextBuf&\t\toperator << (const CFX_ByteTextBuf& buf);\n\n    FX_STRSIZE\t\t\t\tGetLength() const\n    {\n        return m_DataSize;\n    }\n};\nclass CFX_WideTextBuf : public CFX_BinaryBuf\n{\npublic:\n\n    void\t\t\t\t\toperator = (FX_LPCWSTR lpsz);\n\n    void\t\t\t\t\toperator = (FX_WSTR str);\n\n    void\t\t\t\t\tAppendChar(FX_WCHAR wch);\n\n    CFX_WideTextBuf&\t\toperator << (int i);\n\n    CFX_WideTextBuf&\t\toperator << (double f);\n\n    CFX_WideTextBuf&\t\toperator << (FX_LPCWSTR lpsz);\n\n    CFX_WideTextBuf&\t\toperator << (FX_WSTR str);\n    CFX_WideTextBuf&\t\toperator << (const CFX_WideString &str);\n\n    CFX_WideTextBuf&\t\toperator << (const CFX_WideTextBuf& buf);\n\n    FX_STRSIZE\t\t\t\tGetLength() const\n    {\n        return m_DataSize / sizeof(FX_WCHAR);\n    }\n\n    FX_LPWSTR\t\t\t\tGetBuffer() const\n    {\n        return (FX_LPWSTR)m_pBuffer;\n    }\n\n    void\t\t\t\t\tDelete(int start_index, int count)\n    {\n        CFX_BinaryBuf::Delete(start_index * sizeof(FX_WCHAR), count * sizeof(FX_WCHAR));\n    }\n\n    CFX_WideStringC\t\t\tGetWideString() const;\n};\nclass CFX_ArchiveSaver : public CFX_Object\n{\npublic:\n    CFX_ArchiveSaver() : m_pStream(NULL) {}\n\n    CFX_ArchiveSaver&\t\toperator << (FX_BYTE i);\n\n    CFX_ArchiveSaver&\t\toperator << (int i);\n\n    CFX_ArchiveSaver&\t\toperator << (FX_DWORD i);\n\n    CFX_ArchiveSaver&\t\toperator << (FX_FLOAT i);\n\n    CFX_ArchiveSaver&\t\toperator << (double i);\n\n    CFX_ArchiveSaver&\t\toperator << (FX_BSTR bstr);\n\n    CFX_ArchiveSaver&\t\toperator << (FX_LPCWSTR bstr);\n\n    CFX_ArchiveSaver&\t\toperator << (const CFX_WideString& wstr);\n\n    void\t\t\t\t\tWrite(const void* pData, FX_STRSIZE dwSize);\n\n    FX_INTPTR\t\t\t\tGetLength()\n    {\n        return m_SavingBuf.GetSize();\n    }\n\n    FX_LPCBYTE\t\t\t\tGetBuffer()\n    {\n        return m_SavingBuf.GetBuffer();\n    }\n\n    void\t\t\t\t\tSetStream(IFX_FileStream* pStream)\n    {\n        m_pStream = pStream;\n    }\nprotected:\n\n    CFX_BinaryBuf\t\t\tm_SavingBuf;\n\n    IFX_FileStream*\t\t\tm_pStream;\n};\nclass CFX_ArchiveLoader : public CFX_Object\n{\npublic:\n\n    CFX_ArchiveLoader(FX_LPCBYTE pData, FX_DWORD dwSize);\n\n    CFX_ArchiveLoader&\t\toperator >> (FX_BYTE& i);\n\n    CFX_ArchiveLoader&\t\toperator >> (int& i);\n\n    CFX_ArchiveLoader&\t\toperator >> (FX_DWORD& i);\n\n    CFX_ArchiveLoader&\t\toperator >> (FX_FLOAT& i);\n\n    CFX_ArchiveLoader&\t\toperator >> (double& i);\n\n    CFX_ArchiveLoader&\t\toperator >> (CFX_ByteString& bstr);\n\n    CFX_ArchiveLoader&\t\toperator >> (CFX_WideString& wstr);\n\n    FX_BOOL\t\t\t\t\tIsEOF();\n\n    FX_BOOL\t\t\t\t\tRead(void* pBuf, FX_DWORD dwSize);\nprotected:\n\n    FX_DWORD\t\t\t\tm_LoadingPos;\n\n    FX_LPCBYTE\t\t\t\tm_pLoadingBuf;\n\n    FX_DWORD\t\t\t\tm_LoadingSize;\n};\nclass IFX_BufferArchive\n{\npublic:\n    IFX_BufferArchive(FX_STRSIZE size);\n\n\n    virtual void\t\t\tClear();\n\n\n    FX_BOOL\t\t\t\t\tFlush();\n\n\n    FX_INT32\t\t\t\tAppendBlock(const void* pBuf, size_t size);\n\n    FX_INT32\t\t\t\tAppendByte(FX_BYTE byte);\n\n    FX_INT32\t\t\t\tAppendDWord(FX_DWORD i);\n\n\n    FX_INT32\t\t\t\tAppendString(FX_BSTR lpsz);\n\nprotected:\n\n    virtual\tFX_BOOL\t\t\tDoWork(const void* pBuf, size_t size) = 0;\n\n    FX_STRSIZE\t\t\t\tm_BufSize;\n\n    FX_LPBYTE\t\t\t\tm_pBuffer;\n\n    FX_STRSIZE\t\t\t\tm_Length;\n};\nclass CFX_FileBufferArchive : public IFX_BufferArchive, public CFX_Object\n{\npublic:\n    CFX_FileBufferArchive(FX_STRSIZE size = 32768);\n    ~CFX_FileBufferArchive();\n    virtual void\t\t\tClear();\n\n    FX_BOOL\t\t\t\t\tAttachFile(IFX_StreamWrite *pFile, FX_BOOL bTakeover = FALSE);\n\n    FX_BOOL\t\t\t\t\tAttachFile(FX_LPCWSTR filename);\n\n    FX_BOOL\t\t\t\t\tAttachFile(FX_LPCSTR filename);\nprivate:\n\n    virtual FX_BOOL\t\t\tDoWork(const void* pBuf, size_t size);\n\n    IFX_StreamWrite\t\t\t*m_pFile;\n\n    FX_BOOL\t\t\t\t\tm_bTakeover;\n};\nstruct CFX_CharMap {\n\n    static CFX_CharMap*\t\tGetDefaultMapper(FX_INT32 codepage = 0);\n\n\n    CFX_WideString\t(*m_GetWideString)(CFX_CharMap* pMap, const CFX_ByteString& bstr);\n\n    CFX_ByteString\t(*m_GetByteString)(CFX_CharMap* pMap, const CFX_WideString& wstr);\n\n    FX_INT32\t\t(*m_GetCodePage)();\n};\nclass CFX_UTF8Decoder\n{\npublic:\n    CFX_UTF8Decoder()\n    {\n        m_PendingBytes = 0;\n    }\n\n    void\t\t\tClear();\n\n    void\t\t\tInput(FX_BYTE byte);\n\n    void\t\t\tAppendChar(FX_DWORD ch);\n\n    void\t\t\tClearStatus()\n    {\n        m_PendingBytes = 0;\n    }\n\n    CFX_WideStringC\tGetResult() const\n    {\n        return m_Buffer.GetWideString();\n    }\nprotected:\n\n    int\t\t\t\tm_PendingBytes;\n\n    FX_DWORD\t\tm_PendingChar;\n\n    CFX_WideTextBuf\tm_Buffer;\n};\nclass CFX_UTF8Encoder\n{\npublic:\n    CFX_UTF8Encoder()\n    {\n        m_UTF16First = 0;\n    }\n\n    void\t\t\tInput(FX_WCHAR unicode);\n\n    void\t\t\tAppendStr(FX_BSTR str)\n    {\n        m_UTF16First = 0;\n        m_Buffer << str;\n    }\n\n    CFX_ByteStringC\tGetResult() const\n    {\n        return m_Buffer.GetByteString();\n    }\nprotected:\n\n    CFX_ByteTextBuf\tm_Buffer;\n\n    FX_DWORD\t\tm_UTF16First;\n};\nCFX_ByteString FX_UrlEncode(const CFX_WideString& wsUrl);\nCFX_WideString FX_UrlDecode(const CFX_ByteString& bsUrl);\nCFX_ByteString FX_EncodeURI(const CFX_WideString& wsURI);\nCFX_WideString FX_DecodeURI(const CFX_ByteString& bsURI);\nclass CFX_BasicArray : public CFX_Object\n{\nprotected:\n    CFX_BasicArray(int unit_size);\n\n    ~CFX_BasicArray();\n\n    FX_BOOL\t\t\tSetSize(int nNewSize);\n\n    FX_BOOL\t\t\tAppend(const CFX_BasicArray& src);\n\n    FX_BOOL\t\t\tCopy(const CFX_BasicArray& src);\n\n    FX_LPBYTE\t\tInsertSpaceAt(int nIndex, int nCount);\n\n    FX_BOOL\t\t\tRemoveAt(int nIndex, int nCount);\n\n    FX_BOOL\t\t\tInsertAt(int nStartIndex, const CFX_BasicArray* pNewArray);\n\n    const void*\t\tGetDataPtr(int index) const;\nprotected:\n\n    FX_LPBYTE\t\tm_pData;\n\n    int\t\t\t\tm_nSize;\n\n    int\t\t\t\tm_nMaxSize;\n\n    int\t\t\t\tm_nUnitSize;\n};\ntemplate<class TYPE>\nclass CFX_ArrayTemplate : public CFX_BasicArray\n{\npublic:\n    CFX_ArrayTemplate() : CFX_BasicArray(sizeof(TYPE)) {}\n\n    int\t\t\tGetSize() const\n    {\n        return m_nSize;\n    }\n\n    int\t\t\tGetUpperBound() const\n    {\n        return m_nSize - 1;\n    }\n\n    FX_BOOL\t\tSetSize(int nNewSize)\n    {\n        return CFX_BasicArray::SetSize(nNewSize);\n    }\n\n    void\t\tRemoveAll()\n    {\n        SetSize(0);\n    }\n\n    const TYPE\tGetAt(int nIndex) const\n    {\n        if (nIndex < 0 || nIndex >= m_nSize) {\n            return (const TYPE&)(*(volatile const TYPE*)NULL);\n        }\n        return ((const TYPE*)m_pData)[nIndex];\n    }\n\n    FX_BOOL\t\tSetAt(int nIndex, TYPE newElement)\n    {\n        if (nIndex < 0 || nIndex >= m_nSize) {\n            return FALSE;\n        }\n        ((TYPE*)m_pData)[nIndex] = newElement;\n        return TRUE;\n    }\n\n    TYPE&\t\tElementAt(int nIndex)\n    {\n        if (nIndex < 0 || nIndex >= m_nSize) {\n            return *(TYPE*)NULL;\n        }\n        return ((TYPE*)m_pData)[nIndex];\n    }\n\n    const TYPE*\tGetData() const\n    {\n        return (const TYPE*)m_pData;\n    }\n\n    TYPE*\t\tGetData()\n    {\n        return (TYPE*)m_pData;\n    }\n\n    FX_BOOL\t\tSetAtGrow(int nIndex, TYPE newElement)\n    {\n        if (nIndex < 0) {\n            return FALSE;\n        }\n        if (nIndex >= m_nSize)\n            if (!SetSize(nIndex + 1)) {\n                return FALSE;\n            }\n        ((TYPE*)m_pData)[nIndex] = newElement;\n        return TRUE;\n    }\n\n    FX_BOOL\t\tAdd(TYPE newElement)\n    {\n        if (m_nSize < m_nMaxSize) {\n            m_nSize ++;\n        } else if (!SetSize(m_nSize + 1)) {\n            return FALSE;\n        }\n        ((TYPE*)m_pData)[m_nSize - 1] = newElement;\n        return TRUE;\n    }\n\n    FX_BOOL\t\tAppend(const CFX_ArrayTemplate& src)\n    {\n        return CFX_BasicArray::Append(src);\n    }\n\n    FX_BOOL\t\tCopy(const CFX_ArrayTemplate& src)\n    {\n        return CFX_BasicArray::Copy(src);\n    }\n\n    TYPE*\t\tGetDataPtr(int index)\n    {\n        return (TYPE*)CFX_BasicArray::GetDataPtr(index);\n    }\n\n    TYPE*\t\tAddSpace()\n    {\n        return (TYPE*)CFX_BasicArray::InsertSpaceAt(m_nSize, 1);\n    }\n\n    TYPE*\t\tInsertSpaceAt(int nIndex, int nCount)\n    {\n        return (TYPE*)CFX_BasicArray::InsertSpaceAt(nIndex, nCount);\n    }\n\n    const TYPE\toperator[](int nIndex) const\n    {\n        if (nIndex < 0 || nIndex >= m_nSize) {\n            *(volatile char*)0 = '\\0';\n        }\n        return ((const TYPE*)m_pData)[nIndex];\n    }\n\n    TYPE&\t\toperator[](int nIndex)\n    {\n        if (nIndex < 0 || nIndex >= m_nSize) {\n            *(volatile char*)0 = '\\0';\n        }\n        return ((TYPE*)m_pData)[nIndex];\n    }\n\n    FX_BOOL\t\tInsertAt(int nIndex, TYPE newElement, int nCount = 1)\n    {\n        if (!InsertSpaceAt(nIndex, nCount)) {\n            return FALSE;\n        }\n        while (nCount--) {\n            ((TYPE*)m_pData)[nIndex++] = newElement;\n        }\n        return TRUE;\n    }\n\n    FX_BOOL\t\tRemoveAt(int nIndex, int nCount = 1)\n    {\n        return CFX_BasicArray::RemoveAt(nIndex, nCount);\n    }\n\n    FX_BOOL\t\tInsertAt(int nStartIndex, const CFX_BasicArray* pNewArray)\n    {\n        return CFX_BasicArray::InsertAt(nStartIndex, pNewArray);\n    }\n\n    int\t\t\tFind(TYPE data, int iStart = 0) const\n    {\n        if (iStart < 0) {\n            return -1;\n        }\n        for (; iStart < (int)m_nSize; iStart ++)\n            if (((TYPE*)m_pData)[iStart] == data) {\n                return iStart;\n            }\n        return -1;\n    }\n};\ntypedef CFX_ArrayTemplate<FX_BYTE>\t\tCFX_ByteArray;\ntypedef CFX_ArrayTemplate<FX_WORD>\t\tCFX_WordArray;\ntypedef CFX_ArrayTemplate<FX_DWORD>\t\tCFX_DWordArray;\ntypedef CFX_ArrayTemplate<void*>\t\tCFX_PtrArray;\ntypedef CFX_ArrayTemplate<FX_FILESIZE>\tCFX_FileSizeArray;\ntypedef CFX_ArrayTemplate<FX_FLOAT>\t\tCFX_FloatArray;\ntypedef CFX_ArrayTemplate<FX_INT32>\t\tCFX_Int32Array;\ntemplate <class ObjectClass>\nclass CFX_ObjectArray : public CFX_BasicArray\n{\npublic:\n    CFX_ObjectArray() : CFX_BasicArray(sizeof(ObjectClass)) {}\n\n    ~CFX_ObjectArray()\n    {\n        RemoveAll();\n    }\n\n    void\t\t\tAdd(const ObjectClass& data)\n    {\n        new ((void*)InsertSpaceAt(m_nSize, 1)) ObjectClass(data);\n    }\n\n    ObjectClass&\tAdd()\n    {\n        return *(ObjectClass*) new ((void*)InsertSpaceAt(m_nSize, 1)) ObjectClass();\n    }\n\n    void*\t\t\tAddSpace()\n    {\n        return InsertSpaceAt(m_nSize, 1);\n    }\n\n    FX_INT32\t\tAppend(const CFX_ObjectArray& src, FX_INT32 nStart = 0, FX_INT32 nCount = -1)\n    {\n        if (nCount == 0) {\n            return 0;\n        }\n        FX_INT32 nSize = src.GetSize();\n        if (!nSize) {\n            return 0;\n        }\n        FXSYS_assert(nStart > -1 && nStart < nSize);\n        if (nCount < 0) {\n            nCount = nSize;\n        }\n        if (nStart + nCount > nSize) {\n            nCount = nSize - nStart;\n        }\n        if (nCount < 1) {\n            return 0;\n        }\n        nSize = m_nSize;\n        InsertSpaceAt(m_nSize, nCount);\n        ObjectClass* pStartObj = (ObjectClass*)GetDataPtr(nSize);\n        nSize = nStart + nCount;\n        for (FX_INT32 i = nStart; i < nSize; i ++, pStartObj++) {\n            new ((void*)pStartObj) ObjectClass(src[i]);\n        }\n        return nCount;\n    }\n\n    FX_INT32\t\tCopy(const CFX_ObjectArray& src, FX_INT32 nStart = 0, FX_INT32 nCount = -1)\n    {\n        if (nCount == 0) {\n            return 0;\n        }\n        FX_INT32 nSize = src.GetSize();\n        if (!nSize) {\n            return 0;\n        }\n        FXSYS_assert(nStart > -1 && nStart < nSize);\n        if (nCount < 0) {\n            nCount = nSize;\n        }\n        if (nStart + nCount > nSize) {\n            nCount = nSize - nStart;\n        }\n        if (nCount < 1) {\n            return 0;\n        }\n        RemoveAll();\n        SetSize(nCount);\n        ObjectClass* pStartObj = (ObjectClass*)m_pData;\n        nSize = nStart + nCount;\n        for (FX_INT32 i = nStart; i < nSize; i ++, pStartObj++) {\n            new ((void*)pStartObj) ObjectClass(src[i]);\n        }\n        return nCount;\n    }\n\n    int\t\t\t\tGetSize() const\n    {\n        return m_nSize;\n    }\n\n    ObjectClass&\toperator[] (int index) const\n    {\n        FXSYS_assert(index < m_nSize);\n        return *(ObjectClass*)CFX_BasicArray::GetDataPtr(index);\n    }\n\n    ObjectClass*\tGetDataPtr(int index)\n    {\n        return (ObjectClass*)CFX_BasicArray::GetDataPtr(index);\n    }\n\n    void\t\t\tRemoveAt(int index)\n    {\n        FXSYS_assert(index < m_nSize);\n        ((ObjectClass*)GetDataPtr(index))->~ObjectClass();\n        CFX_BasicArray::RemoveAt(index, 1);\n    }\n\n    void\t\t\tRemoveAll()\n    {\n        for (int i = 0; i < m_nSize; i ++) {\n            ((ObjectClass*)GetDataPtr(i))->~ObjectClass();\n        }\n        CFX_BasicArray::SetSize(0);\n    }\n};\ntypedef CFX_ObjectArray<CFX_ByteString> CFX_ByteStringArray;\ntypedef CFX_ObjectArray<CFX_WideString> CFX_WideStringArray;\nclass CFX_BaseSegmentedArray : public CFX_Object\n{\npublic:\n    CFX_BaseSegmentedArray(int unit_size = 1, int segment_units = 512, int index_size = 8);\n\n    ~CFX_BaseSegmentedArray();\n\n    void\tSetUnitSize(int unit_size, int segment_units, int index_size = 8);\n\n    void*\tAdd();\n\n    void*\tGetAt(int index) const;\n\n    void\tRemoveAll();\n\n    void\tDelete(int index, int count = 1);\n\n    int\t\tGetSize() const\n    {\n        return m_DataSize;\n    }\n\n    int\t\tGetSegmentSize() const\n    {\n        return m_SegmentSize;\n    }\n\n    int\t\tGetUnitSize() const\n    {\n        return m_UnitSize;\n    }\n\n    void*\tIterate(FX_BOOL (*callback)(void* param, void* pData), void* param) const;\nprivate:\n\n    int\t\t\t\tm_UnitSize;\n\n    short\t\t\tm_SegmentSize;\n\n    FX_BYTE\t\t\tm_IndexSize;\n\n    FX_BYTE\t\t\tm_IndexDepth;\n\n    int\t\t\t\tm_DataSize;\n\n    void*\t\t\tm_pIndex;\n    void**\tGetIndex(int seg_index) const;\n    void*\tIterateIndex(int level, int& start, void** pIndex, FX_BOOL (*callback)(void* param, void* pData), void* param) const;\n    void*\tIterateSegment(FX_LPCBYTE pSegment, int count, FX_BOOL (*callback)(void* param, void* pData), void* param) const;\n};\ntemplate <class ElementType>\nclass CFX_SegmentedArray : public CFX_BaseSegmentedArray\n{\npublic:\n    CFX_SegmentedArray(int segment_units, int index_size = 8)\n        : CFX_BaseSegmentedArray(sizeof(ElementType), segment_units, index_size)\n    {}\n\n    void\tAdd(ElementType data)\n    {\n        *(ElementType*)CFX_BaseSegmentedArray::Add() = data;\n    }\n\n    ElementType& operator [] (int index)\n    {\n        return *(ElementType*)CFX_BaseSegmentedArray::GetAt(index);\n    }\n};\ntemplate <class DataType, int FixedSize>\nclass CFX_FixedBufGrow : public CFX_Object\n{\npublic:\n    CFX_FixedBufGrow() : m_pData(NULL)\n    {}\n    CFX_FixedBufGrow(int data_size) : m_pData(NULL)\n    {\n        if (data_size > FixedSize) {\n            m_pData = FX_Alloc(DataType, data_size);\n        } else {\n            FXSYS_memset32(m_Data, 0, sizeof(DataType)*FixedSize);\n        }\n    }\n    void SetDataSize(int data_size)\n    {\n        if (m_pData) {\n            FX_Free(m_pData);\n        }\n        m_pData = NULL;\n        if (data_size > FixedSize) {\n            m_pData = FX_Alloc(DataType, data_size);\n        } else {\n            FXSYS_memset32(m_Data, 0, sizeof(DataType)*FixedSize);\n        }\n    }\n    ~CFX_FixedBufGrow()\n    {\n        if (m_pData) {\n            FX_Free(m_pData);\n        }\n    }\n    operator DataType*()\n    {\n        return m_pData ? m_pData : m_Data;\n    }\nprivate:\n    DataType\t\tm_Data[FixedSize];\n    DataType*\t\tm_pData;\n};\ntemplate <class DataType>\nclass CFX_TempBuf\n{\npublic:\n    CFX_TempBuf(int size)\n    {\n        m_pData = FX_Alloc(DataType, size);\n    }\n    ~CFX_TempBuf()\n    {\n        if (m_pData) {\n            FX_Free(m_pData);\n        }\n    }\n    DataType&\toperator[](int i)\n    {\n        FXSYS_assert(m_pData != NULL);\n        return m_pData[i];\n    }\n    operator DataType*()\n    {\n        return m_pData;\n    }\nprivate:\n    DataType*\t\tm_pData;\n};\nclass CFX_MapPtrToPtr : public CFX_Object\n{\nprotected:\n\n    struct CAssoc {\n\n        CAssoc* pNext;\n\n        void* key;\n\n        void* value;\n    };\npublic:\n    CFX_MapPtrToPtr(int nBlockSize = 10);\n\n    ~CFX_MapPtrToPtr();\n\n    int GetCount() const\n    {\n        return m_nCount;\n    }\n\n    FX_BOOL IsEmpty() const\n    {\n        return m_nCount == 0;\n    }\n\n    FX_BOOL Lookup(void* key, void*& rValue) const;\n\n    void* GetValueAt(void* key) const;\n\n    void*& operator[](void* key);\n\n    void SetAt(void* key, void* newValue)\n    {\n        (*this)[key] = newValue;\n    }\n\n    FX_BOOL RemoveKey(void* key);\n\n    void RemoveAll();\n\n    FX_POSITION GetStartPosition() const\n    {\n        return (m_nCount == 0) ? NULL : (FX_POSITION) - 1;\n    }\n\n    void GetNextAssoc(FX_POSITION& rNextPosition, void*& rKey, void*& rValue) const;\n\n    FX_DWORD GetHashTableSize() const\n    {\n        return m_nHashTableSize;\n    }\n\n    void InitHashTable(FX_DWORD hashSize, FX_BOOL bAllocNow = TRUE);\nprotected:\n\n    CAssoc** m_pHashTable;\n\n    FX_DWORD m_nHashTableSize;\n\n    int m_nCount;\n\n    CAssoc* m_pFreeList;\n\n    struct CFX_Plex* m_pBlocks;\n\n    int m_nBlockSize;\n\n    FX_DWORD HashKey(void* key) const;\n\n    CAssoc* NewAssoc();\n\n    void FreeAssoc(CAssoc* pAssoc);\n\n    CAssoc* GetAssocAt(void* key, FX_DWORD& hash) const;\n};\ntemplate <class KeyType, class ValueType>\nclass CFX_MapPtrTemplate : public CFX_MapPtrToPtr\n{\npublic:\n    CFX_MapPtrTemplate() : CFX_MapPtrToPtr(10) {}\n\n    FX_BOOL\tLookup(KeyType key, ValueType& rValue) const\n    {\n        FX_LPVOID pValue = NULL;\n        if (!CFX_MapPtrToPtr::Lookup((void*)(FX_UINTPTR)key, pValue)) {\n            return FALSE;\n        }\n        rValue = (ValueType)(FX_UINTPTR)pValue;\n        return TRUE;\n    }\n\n    ValueType& operator[](KeyType key)\n    {\n        return (ValueType&)CFX_MapPtrToPtr::operator []((void*)(FX_UINTPTR)key);\n    }\n\n    void SetAt(KeyType key, ValueType newValue)\n    {\n        CFX_MapPtrToPtr::SetAt((void*)(FX_UINTPTR)key, (void*)(FX_UINTPTR)newValue);\n    }\n\n    FX_BOOL\tRemoveKey(KeyType key)\n    {\n        return CFX_MapPtrToPtr::RemoveKey((void*)(FX_UINTPTR)key);\n    }\n\n    void GetNextAssoc(FX_POSITION& rNextPosition, KeyType& rKey, ValueType& rValue) const\n    {\n        void* pKey = NULL;\n        void* pValue = NULL;\n        CFX_MapPtrToPtr::GetNextAssoc(rNextPosition, pKey, pValue);\n        rKey = (KeyType)(FX_UINTPTR)pKey;\n        rValue = (ValueType)(FX_UINTPTR)pValue;\n    }\n};\nclass CFX_CMapDWordToDWord : public CFX_Object\n{\npublic:\n\n    FX_BOOL\t\t\tLookup(FX_DWORD key, FX_DWORD& value) const;\n\n    void\t\t\tSetAt(FX_DWORD key, FX_DWORD value);\n\n    void\t\t\tEstimateSize(FX_DWORD size, FX_DWORD grow_by);\n\n    FX_POSITION\t\tGetStartPosition() const;\n\n    void\t\t\tGetNextAssoc(FX_POSITION& pos, FX_DWORD& key, FX_DWORD& value) const;\nprotected:\n\n    CFX_BinaryBuf\tm_Buffer;\n};\nclass CFX_MapByteStringToPtr : public CFX_Object\n{\nprotected:\n\n    struct CAssoc {\n\n        CAssoc* pNext;\n\n        FX_DWORD nHashValue;\n\n        CFX_ByteString key;\n\n        void* value;\n    };\npublic:\n    CFX_MapByteStringToPtr(int nBlockSize = 10);\n\n    int GetCount() const\n    {\n        return m_nCount;\n    }\n\n    FX_BOOL IsEmpty() const\n    {\n        return m_nCount == 0;\n    }\n\n    FX_BOOL Lookup(FX_BSTR key, void*& rValue) const;\n\n    void*& operator[](FX_BSTR key);\n\n    void SetAt(FX_BSTR key, void* newValue)\n    {\n        (*this)[key] = newValue;\n    }\n\n    FX_BOOL RemoveKey(FX_BSTR key);\n\n    void RemoveAll();\n\n    FX_POSITION GetStartPosition() const\n    {\n        return (m_nCount == 0) ? NULL : (FX_POSITION) - 1;\n    }\n\n    void GetNextAssoc(FX_POSITION& rNextPosition, CFX_ByteString& rKey, void*& rValue) const;\n\n    FX_LPVOID\t\tGetNextValue(FX_POSITION& rNextPosition) const;\n\n    FX_DWORD GetHashTableSize() const\n    {\n        return m_nHashTableSize;\n    }\n\n    void InitHashTable(FX_DWORD hashSize, FX_BOOL bAllocNow = TRUE);\n\n    FX_DWORD HashKey(FX_BSTR key) const;\nprotected:\n\n    CAssoc** m_pHashTable;\n\n    FX_DWORD m_nHashTableSize;\n\n    int m_nCount;\n\n    CAssoc* m_pFreeList;\n\n    struct CFX_Plex* m_pBlocks;\n\n    int m_nBlockSize;\n\n    CAssoc* NewAssoc();\n\n    void FreeAssoc(CAssoc* pAssoc);\n\n    CAssoc* GetAssocAt(FX_BSTR key, FX_DWORD& hash) const;\npublic:\n\n    ~CFX_MapByteStringToPtr();\n};\nclass CFX_CMapByteStringToPtr : public CFX_Object\n{\npublic:\n    CFX_CMapByteStringToPtr();\n\n    ~CFX_CMapByteStringToPtr();\n\n    void\t\t\tRemoveAll();\n\n    FX_POSITION\t\tGetStartPosition() const;\n\n    void\t\t\tGetNextAssoc(FX_POSITION& rNextPosition, CFX_ByteString& rKey, void*& rValue) const;\n\n    FX_LPVOID\t\tGetNextValue(FX_POSITION& rNextPosition) const;\n\n    FX_BOOL\t\t\tLookup(FX_BSTR key, void*& rValue) const;\n\n    void\t\t\tSetAt(FX_BSTR key, void* value);\n\n    void\t\t\tRemoveKey(FX_BSTR key);\n\n    int\t\t\t\tGetCount() const;\n\n    void\t\t\tAddValue(FX_BSTR key, void* pValue);\nprivate:\n\n    CFX_BaseSegmentedArray\t\t\tm_Buffer;\n};\nclass CFX_PtrList : public CFX_Object\n{\nprotected:\n\n    struct CNode {\n\n        CNode* pNext;\n\n        CNode* pPrev;\n\n        void* data;\n    };\npublic:\n    CFX_PtrList(int nBlockSize = 10);\n\n    FX_POSITION GetHeadPosition() const\n    {\n        return (FX_POSITION)m_pNodeHead;\n    }\n\n    FX_POSITION GetTailPosition() const\n    {\n        return (FX_POSITION)m_pNodeTail;\n    }\n\n    void*\tGetNext(FX_POSITION& rPosition) const\n    {\n        CNode* pNode = (CNode*) rPosition;\n        rPosition = (FX_POSITION) pNode->pNext;\n        return pNode->data;\n    }\n\n    void*\tGetPrev(FX_POSITION& rPosition) const\n    {\n        CNode* pNode = (CNode*) rPosition;\n        rPosition = (FX_POSITION) pNode->pPrev;\n        return pNode->data;\n    }\n\n    FX_POSITION\tGetNextPosition(FX_POSITION pos) const\n    {\n        return ((CNode*)pos)->pNext;\n    }\n\n    FX_POSITION\tGetPrevPosition(FX_POSITION pos) const\n    {\n        return ((CNode*)pos)->pPrev;\n    }\n\n    void*\tGetAt(FX_POSITION rPosition) const\n    {\n        CNode* pNode = (CNode*) rPosition;\n        return pNode->data;\n    }\n\n    int\t\tGetCount() const\n    {\n        return m_nCount;\n    }\n\n    FX_POSITION\tAddTail(void* newElement);\n\n    FX_POSITION AddHead(void* newElement);\n\n    void\tSetAt(FX_POSITION pos, void* newElement)\n    {\n        CNode* pNode = (CNode*) pos;\n        pNode->data = newElement;\n    }\n\n    FX_POSITION InsertAfter(FX_POSITION pos, void* newElement);\n\n    FX_POSITION Find(void* searchValue, FX_POSITION startAfter = NULL ) const;\n\n    FX_POSITION FindIndex(int index) const;\n\n    void\tRemoveAt(FX_POSITION pos);\n\n    void\tRemoveAll();\nprotected:\n\n    CNode* m_pNodeHead;\n\n    CNode* m_pNodeTail;\n\n    int m_nCount;\n\n    CNode* m_pNodeFree;\n\n    struct CFX_Plex* m_pBlocks;\n\n    int m_nBlockSize;\n\n    CNode* NewNode(CNode* pPrev, CNode* pNext);\n\n    void FreeNode(CNode* pNode);\npublic:\n\n    ~CFX_PtrList();\n};\ntypedef void (*PD_CALLBACK_FREEDATA)(FX_LPVOID pData);\nstruct FX_PRIVATEDATA {\n\n    void\t\t\t\t\tFreeData();\n\n    FX_LPVOID\t\t\t\tm_pModuleId;\n\n    FX_LPVOID\t\t\t\tm_pData;\n\n    PD_CALLBACK_FREEDATA\tm_pCallback;\n\n    FX_BOOL\t\t\t\t\tm_bSelfDestruct;\n};\nclass CFX_PrivateData\n{\npublic:\n\n    ~CFX_PrivateData();\n\n    void\t\t\t\t\tClearAll();\n\n    void\t\t\t\t\tSetPrivateData(FX_LPVOID module_id, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback);\n\n    void\t\t\t\t\tSetPrivateObj(FX_LPVOID module_id, CFX_DestructObject* pObj);\n\n    FX_LPVOID\t\t\t\tGetPrivateData(FX_LPVOID module_id);\n\n    FX_BOOL\t\t\t\t\tLookupPrivateData(FX_LPVOID module_id, FX_LPVOID &pData) const\n    {\n        if (!module_id) {\n            return FALSE;\n        }\n        FX_DWORD nCount = m_DataList.GetSize();\n        for (FX_DWORD n = 0; n < nCount; n ++) {\n            if (m_DataList[n].m_pModuleId == module_id) {\n                pData = m_DataList[n].m_pData;\n                return TRUE;\n            }\n        }\n        return FALSE;\n    }\n\n    FX_BOOL\t\t\t\t\tRemovePrivateData(FX_LPVOID module_id);\nprotected:\n\n    CFX_ArrayTemplate<FX_PRIVATEDATA>\tm_DataList;\n\n    void\t\t\t\t\tAddData(FX_LPVOID module_id, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback, FX_BOOL bSelfDestruct);\n};\nclass CFX_BitStream : public CFX_Object\n{\npublic:\n\n    void\t\t\t\tInit(FX_LPCBYTE pData, FX_DWORD dwSize);\n\n\n    FX_DWORD\t\t\tGetBits(FX_DWORD nBits);\n\n    void\t\t\t\tByteAlign();\n\n    FX_BOOL\t\t\t\tIsEOF()\n    {\n        return m_BitPos >= m_BitSize;\n    }\n\n    void\t\t\t\tSkipBits(FX_DWORD nBits)\n    {\n        m_BitPos += nBits;\n    }\n\n    void\t\t\t\tRewind()\n    {\n        m_BitPos = 0;\n    }\nprotected:\n\n    FX_DWORD\t\t\tm_BitPos;\n\n    FX_DWORD\t\t\tm_BitSize;\n\n    FX_LPCBYTE\t\t\tm_pData;\n};\ntemplate <class ObjClass> class CFX_CountRef : public CFX_Object\n{\npublic:\n\n    typedef CFX_CountRef<ObjClass> Ref;\n\n    class CountedObj : public ObjClass\n    {\n    public:\n\n        CountedObj() {}\n\n        CountedObj(const CountedObj& src) : ObjClass(src) {}\n\n        int\t\t\tm_RefCount;\n    };\n\n    CFX_CountRef()\n    {\n        m_pObject = NULL;\n    }\n\n    CFX_CountRef(const Ref& ref)\n    {\n        m_pObject = ref.m_pObject;\n        if (m_pObject) {\n            m_pObject->m_RefCount ++;\n        }\n    }\n\n    ~CFX_CountRef()\n    {\n        if (!m_pObject) {\n            return;\n        }\n        m_pObject->m_RefCount --;\n        if (m_pObject->m_RefCount <= 0) {\n            delete m_pObject;\n        }\n    }\n\n    ObjClass*\t\t\tNew()\n    {\n        if (m_pObject) {\n            m_pObject->m_RefCount --;\n            if (m_pObject->m_RefCount <= 0) {\n                delete m_pObject;\n            }\n            m_pObject = NULL;\n        }\n        m_pObject = FX_NEW CountedObj;\n        if (!m_pObject) {\n            return NULL;\n        }\n        m_pObject->m_RefCount = 1;\n        return m_pObject;\n    }\n\n    void\t\t\t\toperator = (const Ref& ref)\n    {\n        if (ref.m_pObject) {\n            ref.m_pObject->m_RefCount ++;\n        }\n        if (m_pObject) {\n            m_pObject->m_RefCount --;\n            if (m_pObject->m_RefCount <= 0) {\n                delete m_pObject;\n            }\n        }\n        m_pObject = ref.m_pObject;\n    }\n\n    void\t\t\t\toperator = (void* p)\n    {\n        FXSYS_assert(p == 0);\n        if (m_pObject == NULL) {\n            return;\n        }\n        m_pObject->m_RefCount --;\n        if (m_pObject->m_RefCount <= 0) {\n            delete m_pObject;\n        }\n        m_pObject = NULL;\n    }\n\n    const ObjClass*\t\tGetObject() const\n    {\n        return m_pObject;\n    }\n\n    operator\t\t\tconst ObjClass*() const\n    {\n        return m_pObject;\n    }\n\n    FX_BOOL\t\t\t\tIsNull() const\n    {\n        return m_pObject == NULL;\n    }\n\n    FX_BOOL\t\t\t\tNotNull() const\n    {\n        return m_pObject != NULL;\n    }\n\n    ObjClass*\t\t\tGetModify()\n    {\n        if (m_pObject == NULL) {\n            m_pObject = FX_NEW CountedObj;\n            if (m_pObject) {\n                m_pObject->m_RefCount = 1;\n            }\n        } else if (m_pObject->m_RefCount > 1) {\n            m_pObject->m_RefCount --;\n            CountedObj* pOldObject = m_pObject;\n            m_pObject = NULL;\n            m_pObject = FX_NEW CountedObj(*pOldObject);\n            if (m_pObject) {\n                m_pObject->m_RefCount = 1;\n            }\n        }\n        return m_pObject;\n    }\n\n    void\t\t\t\tSetNull()\n    {\n        if (m_pObject == NULL) {\n            return;\n        }\n        m_pObject->m_RefCount --;\n        if (m_pObject->m_RefCount <= 0) {\n            delete m_pObject;\n        }\n        m_pObject = NULL;\n    }\n\n    FX_BOOL\t\t\t\toperator == (const Ref& ref) const\n    {\n        return m_pObject == ref.m_pObject;\n    }\nprotected:\n\n    CountedObj*\t\t\tm_pObject;\n};\nclass IFX_Pause\n{\npublic:\n\n    virtual FX_BOOL\tNeedToPauseNow() = 0;\n};\nclass CFX_DataFilter : public CFX_Object\n{\npublic:\n\n    virtual ~CFX_DataFilter();\n\n    void\t\t\tSetDestFilter(CFX_DataFilter* pFilter);\n\n    FX_BOOL\t\t\tIsEOF() const\n    {\n        return m_bEOF;\n    }\n\n    FX_DWORD\t\tGetSrcPos()\n    {\n        return m_SrcPos;\n    }\n\n    void\t\t\tFilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);\n\n    void\t\t\tFilterFinish(CFX_BinaryBuf& dest_buf);\nprotected:\n\n    CFX_DataFilter();\n    virtual void\tv_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf) = 0;\n    virtual void\tv_FilterFinish(CFX_BinaryBuf& dest_buf) = 0;\n    void\t\t\tReportEOF(FX_DWORD left_input);\n\n    FX_BOOL\t\t\tm_bEOF;\n\n    FX_DWORD\t\tm_SrcPos;\n\n    CFX_DataFilter*\tm_pDestFilter;\n};\ntemplate <class T>\nclass CFX_SmartPointer\n{\npublic:\n    CFX_SmartPointer(T *pObj) : m_pObj(pObj) {}\n    ~CFX_SmartPointer()\n    {\n        m_pObj->Release();\n    }\n    operator T*(void)\n    {\n        return m_pObj;\n    }\n    T&\t\toperator *(void)\n    {\n        return *m_pObj;\n    }\n    T*\t\toperator ->(void)\n    {\n        return m_pObj;\n    }\nprotected:\n    T *m_pObj;\n};\n#define FX_DATALIST_LENGTH\t1024\ntemplate<size_t unit>\nclass CFX_SortListArray : public CFX_Object\n{\nprotected:\n\n    struct DataList {\n\n        FX_INT32\tstart;\n\n        FX_INT32\tcount;\n        FX_LPBYTE\tdata;\n    };\npublic:\n\n    CFX_SortListArray() : m_CurList(0) {}\n\n    ~CFX_SortListArray()\n    {\n        Clear();\n    }\n\n\n    void\t\t\tClear()\n    {\n        for (FX_INT32 i = m_DataLists.GetUpperBound(); i >= 0; i--) {\n            DataList list = m_DataLists.ElementAt(i);\n            if (list.data) {\n                FX_Free(list.data);\n            }\n        }\n        m_DataLists.RemoveAll();\n        m_CurList = 0;\n    }\n\n    void\t\t\tAppend(FX_INT32 nStart, FX_INT32 nCount)\n    {\n        if (nStart < 0) {\n            return;\n        }\n        while (nCount > 0) {\n            FX_INT32 temp_count = FX_MIN(nCount, FX_DATALIST_LENGTH);\n            DataList list;\n            list.data = FX_Alloc(FX_BYTE, temp_count * unit);\n            if (!list.data) {\n                break;\n            }\n            list.start = nStart;\n            list.count = temp_count;\n            Append(list);\n            nCount -= temp_count;\n            nStart += temp_count;\n        }\n    }\n\n    FX_LPBYTE\t\tGetAt(FX_INT32 nIndex)\n    {\n        if (nIndex < 0) {\n            return NULL;\n        }\n        if (m_CurList < 0 || m_CurList >= m_DataLists.GetSize()) {\n            return NULL;\n        }\n        DataList *pCurList = m_DataLists.GetDataPtr(m_CurList);\n        if (!pCurList || nIndex < pCurList->start || nIndex >= pCurList->start + pCurList->count) {\n            pCurList = NULL;\n            FX_INT32 iStart = 0;\n            FX_INT32 iEnd = m_DataLists.GetUpperBound();\n            FX_INT32 iMid = 0;\n            while (iStart <= iEnd) {\n                iMid = (iStart + iEnd) / 2;\n                DataList* list = m_DataLists.GetDataPtr(iMid);\n                if (nIndex < list->start) {\n                    iEnd = iMid - 1;\n                } else if (nIndex >= list->start + list->count) {\n                    iStart = iMid + 1;\n                } else {\n                    pCurList = list;\n                    m_CurList = iMid;\n                    break;\n                }\n            }\n        }\n        return pCurList ? pCurList->data + (nIndex - pCurList->start) * unit : NULL;\n    }\nprotected:\n    void\t\t\tAppend(const DataList& list)\n    {\n        FX_INT32 iStart = 0;\n        FX_INT32 iEnd = m_DataLists.GetUpperBound();\n        FX_INT32 iFind = 0;\n        while (iStart <= iEnd) {\n            FX_INT32 iMid = (iStart + iEnd) / 2;\n            DataList* cur_list = m_DataLists.GetDataPtr(iMid);\n            if (list.start < cur_list->start + cur_list->count) {\n                iEnd = iMid - 1;\n            } else {\n                if (iMid == iEnd) {\n                    iFind = iMid + 1;\n                    break;\n                }\n                DataList* next_list = m_DataLists.GetDataPtr(iMid + 1);\n                if (list.start < next_list->start) {\n                    iFind = iMid + 1;\n                    break;\n                } else {\n                    iStart = iMid + 1;\n                }\n            }\n        }\n        m_DataLists.InsertAt(iFind, list);\n    }\n    FX_INT32\t\tm_CurList;\n    CFX_ArrayTemplate<DataList>\tm_DataLists;\n};\ntemplate<typename T1, typename T2>\nclass CFX_ListArrayTemplate : public CFX_Object\n{\npublic:\n\n    void\t\t\tClear()\n    {\n        m_Data.Clear();\n    }\n\n    void\t\t\tAdd(FX_INT32 nStart, FX_INT32 nCount)\n    {\n        m_Data.Append(nStart, nCount);\n    }\n\n    T2&\t\t\t\toperator [] (FX_INT32 nIndex)\n    {\n        FX_LPBYTE data = m_Data.GetAt(nIndex);\n        FXSYS_assert(data != NULL);\n        return (T2&)(*(volatile T2*)data);\n    }\n\n    T2*\t\t\t\tGetPtrAt(FX_INT32 nIndex)\n    {\n        return (T2*)m_Data.GetAt(nIndex);\n    }\nprotected:\n    T1\t\t\tm_Data;\n};\ntypedef CFX_ListArrayTemplate<CFX_SortListArray<sizeof(FX_FILESIZE)>, FX_FILESIZE>\tCFX_FileSizeListArray;\ntypedef CFX_ListArrayTemplate<CFX_SortListArray<sizeof(FX_DWORD)>, FX_DWORD>\t\tCFX_DWordListArray;\ntypedef enum {\n    Ready,\n    ToBeContinued,\n    Found,\n    NotFound,\n    Failed,\n    Done\n} FX_ProgressiveStatus;\n#define ProgressiveStatus\tFX_ProgressiveStatus\n#define FX_NAMESPACE_DECLARE(namespace, type)       namespace::type\n#endif\n"
  },
  {
    "path": "core/include/fxcrt/fx_coordinates.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXCRT_COORDINATES_\n#define _FXCRT_COORDINATES_\ntemplate<class baseType> class CFX_PSVTemplate;\ntemplate<class baseType> class CFX_VTemplate;\ntemplate<class baseType> class CFX_PRLTemplate;\ntemplate<class baseType> class CFX_RTemplate;\ntemplate<class baseType> class CFX_ETemplate;\ntemplate<class baseType> class CFX_ATemplate;\ntemplate<class baseType> class CFX_RRTemplate;\nclass CFX_Matrix;\ntemplate<class baseType>\nclass CFX_PSVTemplate : public CFX_Object\n{\npublic:\n    typedef CFX_PSVTemplate<baseType>\tFXT_PSV;\n    typedef CFX_PSVTemplate<baseType>\tFXT_POINT;\n    typedef CFX_PSVTemplate<baseType>\tFXT_SIZE;\n    void\t\tSet(baseType x, baseType y)\n    {\n        FXT_PSV::x = x, FXT_PSV::y = y;\n    }\n    void\t\tSet(const FXT_PSV &psv)\n    {\n        FXT_PSV::x = psv.x, FXT_PSV::y = psv.y;\n    }\n    void\t\tAdd(baseType x, baseType y)\n    {\n        FXT_PSV::x += x, FXT_PSV::y += y;\n    }\n    void\t\tSubtract(baseType x, baseType y)\n    {\n        FXT_PSV::x -= x, FXT_PSV::y -= y;\n    }\n    void\t\tReset()\n    {\n        FXT_PSV::x = FXT_PSV::y = 0;\n    }\n    FXT_PSV&\toperator += (const FXT_PSV &obj)\n    {\n        x += obj.x;\n        y += obj.y;\n        return *this;\n    }\n    FXT_PSV&\toperator -= (const FXT_PSV &obj)\n    {\n        x -= obj.x;\n        y -= obj.y;\n        return *this;\n    }\n    FXT_PSV&\toperator *= (baseType lamda)\n    {\n        x *= lamda;\n        y *= lamda;\n        return *this;\n    }\n    FXT_PSV&\toperator /= (baseType lamda)\n    {\n        x /= lamda;\n        y /= lamda;\n        return *this;\n    }\n    friend\tFX_BOOL\t\toperator == (const FXT_PSV &obj1, const FXT_PSV &obj2)\n    {\n        return obj1.x == obj2.x && obj1.y == obj2.y;\n    }\n    friend\tFX_BOOL\t\toperator != (const FXT_PSV &obj1, const FXT_PSV &obj2)\n    {\n        return obj1.x != obj2.x || obj1.y != obj2.y;\n    }\n    friend\tFXT_PSV\t\toperator + (const FXT_PSV &obj1, const FXT_PSV &obj2)\n    {\n        CFX_PSVTemplate obj;\n        obj.x = obj1.x + obj2.x;\n        obj.y = obj1.y + obj2.y;\n        return obj;\n    }\n    friend\tFXT_PSV\t\toperator - (const FXT_PSV &obj1, const FXT_PSV &obj2)\n    {\n        CFX_PSVTemplate obj;\n        obj.x = obj1.x - obj2.x;\n        obj.y = obj1.y - obj2.y;\n        return obj;\n    }\n    friend\tFXT_PSV\t\toperator * (const FXT_PSV &obj, baseType lamda)\n    {\n        CFX_PSVTemplate t;\n        t.x = obj.x * lamda;\n        t.y = obj.y * lamda;\n        return t;\n    }\n    friend\tFXT_PSV\t\toperator * (baseType lamda, const FXT_PSV &obj)\n    {\n        CFX_PSVTemplate t;\n        t.x = lamda * obj.x;\n        t.y = lamda * obj.y;\n        return t;\n    }\n    friend\tFXT_PSV\t\toperator / (const FXT_PSV &obj, baseType lamda)\n    {\n        CFX_PSVTemplate t;\n        t.x = obj.x / lamda;\n        t.y = obj.y / lamda;\n        return t;\n    }\n    baseType x, y;\n};\ntypedef CFX_PSVTemplate<FX_INT32>\t\t\tCFX_Point;\ntypedef CFX_PSVTemplate<FX_FLOAT>\t\t\tCFX_PointF;\ntypedef CFX_PSVTemplate<FX_INT32>\t\t\tCFX_Size;\ntypedef CFX_PSVTemplate<FX_FLOAT>\t\t\tCFX_SizeF;\ntypedef CFX_ArrayTemplate<CFX_Point>\t\tCFX_Points;\ntypedef CFX_ArrayTemplate<CFX_PointF>\t\tCFX_PointsF;\ntypedef CFX_PSVTemplate<FX_INT32> *\t\t\tFX_LPPOINT;\ntypedef CFX_PSVTemplate<FX_FLOAT> *\t\t\tFX_LPPOINTF;\ntypedef CFX_PSVTemplate<FX_INT32> const *\tFX_LPCPOINT;\ntypedef CFX_PSVTemplate<FX_FLOAT> const *\tFX_LPCPOINTF;\n#define CFX_FloatPoint\tCFX_PointF\ntemplate<class baseType>\nclass CFX_VTemplate: public CFX_PSVTemplate<baseType>\n{\npublic:\n    typedef CFX_PSVTemplate<baseType>\tFXT_PSV;\n    typedef CFX_PSVTemplate<baseType>\tFXT_POINT;\n    typedef CFX_PSVTemplate<baseType>\tFXT_SIZE;\n    typedef CFX_VTemplate<baseType>\t\tFXT_VECTOR;\n    void\t\tSet(baseType x, baseType y)\n    {\n        FXT_PSV::x = x, FXT_PSV::y = y;\n    }\n    void\t\tSet(const FXT_PSV &psv)\n    {\n        FXT_PSV::x = psv.x, FXT_PSV::y = psv.y;\n    }\n    void\t\tSet(const FXT_POINT &p1, const FXT_POINT &p2)\n    {\n        FXT_PSV::x = p2.x - p1.x, FXT_PSV::y = p2.y - p1.y;\n    }\n    void\t\tReset()\n    {\n        FXT_PSV::x = FXT_PSV::y = 0;\n    }\n    baseType\tSquareLength() const\n    {\n        return FXT_PSV::x * FXT_PSV::x + FXT_PSV::y * FXT_PSV::y;\n    }\n    baseType\tLength() const\n    {\n        return FXSYS_sqrt(FXT_PSV::x * FXT_PSV::x + FXT_PSV::y * FXT_PSV::y);\n    }\n    void\t\tNormalize()\n    {\n        FX_FLOAT fLen = FXSYS_sqrt(FXT_PSV::x * FXT_PSV::x + FXT_PSV::y * FXT_PSV::y);\n        FXSYS_assert(fLen >= 0.0001f);\n        FXT_PSV::x = ((baseType)FXT_PSV::x) / fLen;\n        FXT_PSV::y = ((baseType)FXT_PSV::y) / fLen;\n    }\n    baseType\tDotProduct(baseType x, baseType y) const\n    {\n        return FXT_PSV::x * x + FXT_PSV::y * y;\n    }\n    baseType\tDotProduct(const FXT_VECTOR &v) const\n    {\n        return FXT_PSV::x * v.x + FXT_PSV::y * v.y;\n    }\n    FX_BOOL\t\tIsParallel(baseType x, baseType y) const\n    {\n        baseType t = FXT_PSV::x * y - FXT_PSV::y * x;\n        return FXSYS_fabs(t) < 0x0001f;\n    }\n    FX_BOOL\t\tIsParallel(const FXT_VECTOR &v) const\n    {\n        return IsParallel(v.x, v.y);\n    }\n    FX_BOOL\t\tIsPerpendicular(baseType x, baseType y) const\n    {\n        baseType t = DotProduct(x, y);\n        return FXSYS_fabs(t) < 0x0001f;\n    }\n    FX_BOOL\t\tIsPerpendicular(const FXT_VECTOR &v) const\n    {\n        return IsPerpendicular(v.x, v.y);\n    }\n    void\t\tTranslate(baseType dx, baseType dy)\n    {\n        FXT_PSV::x += dx, FXT_PSV::y += dy;\n    }\n    void\t\tScale(baseType sx, baseType sy)\n    {\n        FXT_PSV::x *= sx, FXT_PSV::y *= sy;\n    }\n    void\t\tRotate(FX_FLOAT fRadian)\n    {\n        FX_FLOAT xx = (FX_FLOAT)FXT_PSV::x;\n        FX_FLOAT yy = (FX_FLOAT)FXT_PSV::y;\n        FX_FLOAT cosValue = FXSYS_cos(fRadian);\n        FX_FLOAT sinValue = FXSYS_sin(fRadian);\n        FXT_PSV::x = xx * cosValue - yy * sinValue;\n        FXT_PSV::y = xx * sinValue + yy * cosValue;\n    }\n    friend\tFX_FLOAT\tCosine(const FXT_VECTOR &v1, const FXT_VECTOR &v2)\n    {\n        FXSYS_assert(v1.SquareLength() != 0 && v2.SquareLength() != 0);\n        FX_FLOAT dotProduct = v1.DotProduct(v2);\n        return dotProduct / (FX_FLOAT)FXSYS_sqrt(v1.SquareLength() * v2.SquareLength());\n    }\n    friend\tFX_FLOAT\tArcCosine(const FXT_VECTOR &v1, const FXT_VECTOR &v2)\n    {\n        return (FX_FLOAT)FXSYS_acos(Cosine(v1, v2));\n    }\n    friend\tFX_FLOAT\tSlopeAngle(const FXT_VECTOR &v)\n    {\n        CFX_VTemplate vx;\n        vx.Set(1, 0);\n        FX_FLOAT fSlope = ArcCosine(v, vx);\n        return v.y < 0 ? -fSlope : fSlope;\n    }\n};\ntypedef CFX_VTemplate<FX_INT32> CFX_Vector;\ntypedef CFX_VTemplate<FX_FLOAT> CFX_VectorF;\ntemplate<class baseType>\nclass CFX_RTemplate: public CFX_Object\n{\npublic:\n    typedef CFX_PSVTemplate<baseType>\tFXT_POINT;\n    typedef CFX_PSVTemplate<baseType>\tFXT_SIZE;\n    typedef CFX_VTemplate<baseType>\t\tFXT_VECTOR;\n    typedef CFX_PRLTemplate<baseType>\tFXT_PARAL;\n    typedef CFX_RTemplate<baseType>\t\tFXT_RECT;\n    void\t\tSet(baseType left, baseType top, baseType width, baseType height)\n    {\n        FXT_RECT::left = left, FXT_RECT::top = top, FXT_RECT::width = width, FXT_RECT::height = height;\n    }\n    void\t\tSet(baseType left, baseType top, const FXT_SIZE &size)\n    {\n        FXT_RECT::left = left, FXT_RECT::top = top, FXT_RECT::Size(size);\n    }\n    void\t\tSet(const FXT_POINT &p, baseType width, baseType height)\n    {\n        TopLeft(p), FXT_RECT::width = width, FXT_RECT::height = height;\n    }\n    void\t\tSet(const FXT_POINT &p1, const FXT_POINT &p2)\n    {\n        TopLeft(p1), FXT_RECT::width = p2.x - p1.x, FXT_RECT::height = p2.y - p1.y, FXT_RECT::Normalize();\n    }\n    void\t\tSet(const FXT_POINT &p, const FXT_VECTOR &v)\n    {\n        TopLeft(p), FXT_RECT::width = v.x, FXT_RECT::height = v.y, FXT_RECT::Normalize();\n    }\n    void\t\tReset()\n    {\n        FXT_RECT::left = FXT_RECT::top = FXT_RECT::width = FXT_RECT::height = 0;\n    }\n    FXT_RECT&\toperator += (const FXT_POINT &p)\n    {\n        left += p.x, top += p.y;\n        return *this;\n    }\n    FXT_RECT&\toperator -= (const FXT_POINT &p)\n    {\n        left -= p.x, top -= p.y;\n        return *this;\n    }\n    baseType\tright() const\n    {\n        return left + width;\n    }\n    baseType\tbottom() const\n    {\n        return top + height;\n    }\n    void\t\tNormalize()\n    {\n        if (width < 0) {\n            left += width;\n            width = -width;\n        }\n        if (height < 0) {\n            top += height;\n            height = -height;\n        }\n    }\n    void\t\tOffset(baseType dx, baseType dy)\n    {\n        left += dx;\n        top += dy;\n    }\n    void\t\tInflate(baseType x, baseType y)\n    {\n        left -= x;\n        width += x * 2;\n        top -= y;\n        height += y * 2;\n    }\n    void\t\tInflate(const FXT_POINT &p)\n    {\n        Inflate(p.x, p.y);\n    }\n    void\t\tInflate(baseType left, baseType top, baseType right, baseType bottom)\n    {\n        FXT_RECT::left -= left;\n        FXT_RECT::top -= top;\n        FXT_RECT::width += left + right;\n        FXT_RECT::height += top + bottom;\n    }\n    void\t\tInflate(const FXT_RECT &rt)\n    {\n        Inflate(rt.left, rt.top, rt.left + rt.width, rt.top + rt.height);\n    }\n    void\t\tDeflate(baseType x, baseType y)\n    {\n        left += x;\n        width -= x * 2;\n        top += y;\n        height -= y * 2;\n    }\n    void\t\tDeflate(const FXT_POINT &p)\n    {\n        Deflate(p.x, p.y);\n    }\n    void\t\tDeflate(baseType left, baseType top, baseType right, baseType bottom)\n    {\n        FXT_RECT::left += left;\n        FXT_RECT::top += top;\n        FXT_RECT::width -= left + right;\n        FXT_RECT::height -= top + bottom;\n    }\n    void\t\tDeflate(const FXT_RECT &rt)\n    {\n        Deflate(rt.left, rt.top, rt.top + rt.width, rt.top + rt.height);\n    }\n    FX_BOOL\t\tIsEmpty() const\n    {\n        return width <= 0 || height <= 0;\n    }\n    FX_BOOL\t\tIsEmpty(FX_FLOAT fEpsilon) const\n    {\n        return width <= fEpsilon || height <= fEpsilon;\n    }\n    void\t\tEmpty()\n    {\n        width = height = 0;\n    }\n    FX_BOOL\t\tContains(baseType x, baseType y) const\n    {\n        return x >= left && x < left + width && y >= top && y < top + height;\n    }\n    FX_BOOL\t\tContains(const FXT_POINT &p) const\n    {\n        return Contains(p.x, p.y);\n    }\n    FX_BOOL\t\tContains(const FXT_RECT &rt) const\n    {\n        return rt.left >= left && rt.right() <= right() && rt.top >= top && rt.bottom() <= bottom();\n    }\n    baseType\tWidth() const\n    {\n        return width;\n    }\n    baseType\tHeight() const\n    {\n        return height;\n    }\n    FXT_SIZE\tSize() const\n    {\n        FXT_SIZE size;\n        size.Set(width, height);\n        return size;\n    }\n    void\t\tSize(FXT_SIZE s)\n    {\n        width = s.x, height = s.y;\n    }\n    FXT_POINT\tTopLeft() const\n    {\n        FXT_POINT p;\n        p.x = left;\n        p.y = top;\n        return p;\n    }\n    FXT_POINT\tTopRight() const\n    {\n        FXT_POINT p;\n        p.x = left + width;\n        p.y = top;\n        return p;\n    }\n    FXT_POINT\tBottomLeft() const\n    {\n        FXT_POINT p;\n        p.x = left;\n        p.y = top + height;\n        return p;\n    }\n    FXT_POINT\tBottomRight() const\n    {\n        FXT_POINT p;\n        p.x = left + width;\n        p.y = top + height;\n        return p;\n    }\n    void\t\tTopLeft(FXT_POINT tl)\n    {\n        left = tl.x;\n        top = tl.y;\n    }\n    void\t\tTopRight(FXT_POINT tr)\n    {\n        width = tr.x - left;\n        top = tr.y;\n    }\n    void\t\tBottomLeft(FXT_POINT bl)\n    {\n        left = bl.x;\n        height = bl.y - top;\n    }\n    void\t\tBottomRight(FXT_POINT br)\n    {\n        width = br.x - left;\n        height = br.y - top;\n    }\n    FXT_POINT\tCenter() const\n    {\n        FXT_POINT p;\n        p.x = left + width / 2;\n        p.y = top + height / 2;\n        return p;\n    }\n    void\t\tGetParallelogram(FXT_PARAL &pg) const\n    {\n        pg.x = left, pg.y = top;\n        pg.x1 = width, pg.y1 = 0;\n        pg.x2 = 0, pg.y2 = height;\n    }\n    void\t\tUnion(baseType x, baseType y)\n    {\n        baseType r = right(), b = bottom();\n        if (left > x) {\n            left = x;\n        }\n        if (r < x) {\n            r = x;\n        }\n        if (top > y) {\n            top = y;\n        }\n        if (b < y) {\n            b = y;\n        }\n        width = r - left;\n        height = b - top;\n    }\n    void\t\tUnion(const FXT_POINT &p)\n    {\n        Union(p.x, p.y);\n    }\n    void\t\tUnion(const FXT_RECT &rt)\n    {\n        baseType r = right(), b = bottom();\n        if (left > rt.left) {\n            left = rt.left;\n        }\n        if (r < rt.right()) {\n            r = rt.right();\n        }\n        if (top > rt.top) {\n            top = rt.top;\n        }\n        if (b < rt.bottom()) {\n            b = rt.bottom();\n        }\n        width = r - left;\n        height = b - top;\n    }\n    void\t\tIntersect(const FXT_RECT &rt)\n    {\n        baseType r = right(), b = bottom();\n        if (left < rt.left) {\n            left = rt.left;\n        }\n        if (r > rt.right()) {\n            r = rt.right();\n        }\n        if (top < rt.top) {\n            top = rt.top;\n        }\n        if (b > rt.bottom()) {\n            b = rt.bottom();\n        }\n        width = r - left;\n        height = b - top;\n    }\n    FX_BOOL\t\tIntersectWith(const FXT_RECT &rt) const\n    {\n        FXT_RECT rect = rt;\n        rect.Intersect(*this);\n        return !rect.IsEmpty();\n    }\n    FX_BOOL\t\tIntersectWith(const FXT_RECT &rt, FX_FLOAT fEpsilon) const\n    {\n        FXT_RECT rect = rt;\n        rect.Intersect(*this);\n        return !rect.IsEmpty(fEpsilon);\n    }\n    friend\tFX_BOOL\toperator == (const FXT_RECT &rc1, const FXT_RECT &rc2)\n    {\n        return rc1.left == rc2.left && rc1.top == rc2.top && rc1.width == rc2.width && rc1.height == rc2.height;\n    }\n    friend\tFX_BOOL\toperator != (const FXT_RECT &rc1, const FXT_RECT &rc2)\n    {\n        return rc1.left != rc2.left || rc1.top != rc2.top || rc1.width != rc2.width || rc1.height != rc2.height;\n    }\n    baseType left, top;\n    baseType width, height;\n};\ntypedef CFX_RTemplate<FX_INT32>\t\t\tCFX_Rect;\ntypedef CFX_RTemplate<FX_FLOAT>\t\t\tCFX_RectF;\ntypedef CFX_RTemplate<FX_INT32> *\t\tFX_LPRECT;\ntypedef CFX_RTemplate<FX_FLOAT> *\t\tFX_LPRECTF;\ntypedef CFX_RTemplate<FX_INT32> const *\tFX_LPCRECT;\ntypedef CFX_RTemplate<FX_FLOAT> const *\tFX_LPCRECTF;\ntypedef CFX_ArrayTemplate<CFX_RectF>\tCFX_RectFArray;\nstruct FX_RECT {\n\n    int\t\t\tleft;\n\n    int\t\t\ttop;\n\n    int\t\t\tright;\n\n    int\t\t\tbottom;\n\n    FX_RECT() {}\n\n    FX_RECT(int left1, int top1, int right1, int bottom1)\n    {\n        left = left1;\n        top = top1;\n        right = right1;\n        bottom = bottom1;\n    }\n\n    int\t\t\tWidth() const\n    {\n        return right - left;\n    }\n\n    int\t\t\tHeight() const\n    {\n        return bottom - top;\n    }\n\n    FX_BOOL\t\tIsEmpty() const\n    {\n        return right <= left || bottom <= top;\n    }\n\n    void\t\tNormalize();\n\n    void\t\tIntersect(const FX_RECT& src);\n\n    void\t\tIntersect(int left1, int top1, int right1, int bottom1)\n    {\n        Intersect(FX_RECT(left1, top1, right1, bottom1));\n    }\n\n    void\t\tUnion(const FX_RECT& other_rect);\n\n    FX_BOOL\t\toperator == (const FX_RECT& src) const\n    {\n        return left == src.left && right == src.right && top == src.top && bottom == src.bottom;\n    }\n\n    void\t\tOffset(int dx, int dy)\n    {\n        left += dx;\n        right += dx;\n        top += dy;\n        bottom += dy;\n    }\n\n    FX_BOOL\t\tContains(const FX_RECT& other_rect) const\n    {\n        return other_rect.left >= left && other_rect.right <= right && other_rect.top >= top && other_rect.bottom <= bottom;\n    }\n\n    FX_BOOL\t\tContains(int x, int y) const\n    {\n        return x >= left && x < right && y >= top && y < bottom;\n    }\n};\nstruct FX_SMALL_RECT {\n\n    FX_SHORT\tLeft;\n\n    FX_SHORT\tTop;\n\n    FX_SHORT\tRight;\n\n    FX_SHORT\tBottom;\n};\nclass CFX_FloatRect : public CFX_Object\n{\npublic:\n\n    CFX_FloatRect()\n    {\n        left = right = bottom = top = 0;\n    }\n\n    CFX_FloatRect(FX_FLOAT left1, FX_FLOAT bottom1, FX_FLOAT right1, FX_FLOAT top1)\n    {\n        left = left1;\n        bottom = bottom1;\n        right = right1;\n        top = top1;\n    }\n\n    CFX_FloatRect(const FX_FLOAT* pArray)\n    {\n        left = pArray[0];\n        bottom = pArray[1];\n        right = pArray[2];\n        top = pArray[3];\n    }\n\n    CFX_FloatRect(const FX_RECT& rect);\n\n    FX_BOOL\t\t\t\tIsEmpty() const\n    {\n        return left >= right || bottom >= top;\n    }\n\n    void\t\t\t\tNormalize();\n\n    void\t\t\t\tReset()\n    {\n        left = right = bottom = top = 0;\n    }\n\n    FX_BOOL\t\t\t\tContains(const CFX_FloatRect& other_rect) const;\n\n    FX_BOOL\t\t\t\tContains(FX_FLOAT x, FX_FLOAT y) const;\n\n    void\t\t\t\tTransform(const CFX_Matrix* pMatrix);\n\n    void\t\t\t\tIntersect(const CFX_FloatRect& other_rect);\n\n    void\t\t\t\tUnion(const CFX_FloatRect& other_rect);\n\n    FX_RECT\t\t\t\tGetInnerRect() const;\n\n    FX_RECT\t\t\t\tGetOutterRect() const;\n\n    FX_RECT\t\t\t\tGetClosestRect() const;\n\n    int\t\t\t\t\tSubstract4(CFX_FloatRect& substract_rect, CFX_FloatRect* pRects);\n\n    void\t\t\t\tInitRect(FX_FLOAT x, FX_FLOAT y)\n    {\n        left = right = x;\n        bottom = top = y;\n    }\n\n    void\t\t\t\tUpdateRect(FX_FLOAT x, FX_FLOAT y);\n\n    FX_FLOAT\t\t\tWidth() const\n    {\n        return right - left;\n    }\n\n    FX_FLOAT\t\t\tHeight() const\n    {\n        return top - bottom;\n    }\n\n    void\t\t\t\tInflate(FX_FLOAT x, FX_FLOAT y)\n    {\n        Normalize();\n        left -= x;\n        right += x;\n        bottom -= y;\n        top += y;\n    }\n\n    void\t\t\t\tInflate(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top)\n    {\n        Normalize();\n        this->left -= left;\n        this->bottom -= bottom;\n        this->right += right;\n        this->top += top;\n    }\n\n    void\t\t\t\tInflate(const CFX_FloatRect &rt)\n    {\n        Inflate(rt.left, rt.bottom, rt.right, rt.top);\n    }\n\n    void\t\t\t\tDeflate(FX_FLOAT x, FX_FLOAT y)\n    {\n        Normalize();\n        left += x;\n        right -= x;\n        bottom += y;\n        top -= y;\n    }\n\n    void\t\t\t\tDeflate(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top)\n    {\n        Normalize();\n        this->left += left;\n        this->bottom += bottom;\n        this->right -= right;\n        this->top -= top;\n    }\n\n    void\t\t\t\tDeflate(const CFX_FloatRect &rt)\n    {\n        Deflate(rt.left, rt.bottom, rt.right, rt.top);\n    }\n\n    void\t\t\t\tTranslate(FX_FLOAT e, FX_FLOAT f)\n    {\n        left += e;\n        right += e;\n        top += f;\n        bottom += f;\n    }\n\n    static CFX_FloatRect\tGetBBox(const CFX_FloatPoint* pPoints, int nPoints);\n\n    FX_FLOAT\t\t\tleft;\n\n    FX_FLOAT\t\t\tright;\n\n    FX_FLOAT\t\t\tbottom;\n\n    FX_FLOAT\t\t\ttop;\n};\nclass CFX_Matrix : public CFX_Object\n{\npublic:\n\n    CFX_Matrix()\n    {\n        a = d = 1;\n        b = c = e = f = 0;\n    }\n\n    CFX_Matrix(FX_FLOAT a1, FX_FLOAT b1, FX_FLOAT c1, FX_FLOAT d1, FX_FLOAT e1, FX_FLOAT f1)\n    {\n        a = a1;\n        b = b1;\n        c = c1;\n        d = d1;\n        e = e1;\n        f = f1;\n    }\n\n    void\t\t\tSet(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f);\n    void\t\t\tSet(const FX_FLOAT n[6]);\n\n    void\t\t\tSetIdentity()\n    {\n        a = d = 1;\n        b = c = e = f = 0;\n    }\n\n    void\t\t\tSetReverse(const CFX_Matrix &m);\n\n    void\t\t\tConcat(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f, FX_BOOL bPrepended = FALSE);\n\n    void\t\t\tConcat(const CFX_Matrix &m, FX_BOOL bPrepended = FALSE);\n\n    void\t\t\tConcatInverse(const CFX_Matrix& m, FX_BOOL bPrepended = FALSE);\n    void\t\t\tReset()\n    {\n        SetIdentity();\n    }\n\n    void\t\t\tCopy(const CFX_Matrix& m)\n    {\n        *this = m;\n    }\n\n    FX_BOOL\t\t\tIsIdentity() const\n    {\n        return a == 1 && b == 0 && c == 0 && d == 1 && e == 0 && f == 0;\n    }\n    FX_BOOL\t\t\tIsInvertible() const;\n\n    FX_BOOL\t\t\tIs90Rotated() const;\n\n    FX_BOOL\t\t\tIsScaled() const;\n\n    void\t\t\tTranslate(FX_FLOAT x, FX_FLOAT y, FX_BOOL bPrepended = FALSE);\n\n    void\t\t\tTranslateI(FX_INT32 x, FX_INT32 y, FX_BOOL bPrepended = FALSE)\n    {\n        Translate((FX_FLOAT)x, (FX_FLOAT)y, bPrepended);\n    }\n\n    void\t\t\tScale(FX_FLOAT sx, FX_FLOAT sy, FX_BOOL bPrepended = FALSE);\n\n    void\t\t\tRotate(FX_FLOAT fRadian, FX_BOOL bPrepended = FALSE);\n\n    void\t\t\tRotateAt(FX_FLOAT fRadian, FX_FLOAT x, FX_FLOAT y, FX_BOOL bPrepended = FALSE);\n\n    void\t\t\tShear(FX_FLOAT fAlphaRadian, FX_FLOAT fBetaRadian, FX_BOOL bPrepended = FALSE);\n\n    void\t\t\tMatchRect(const CFX_FloatRect &dest, const CFX_FloatRect &src);\n\n    FX_FLOAT\t\tGetXUnit() const;\n\n    FX_FLOAT\t\tGetYUnit() const;\n    void\t\t\tGetUnitRect(CFX_RectF &rect) const;\n\n    CFX_FloatRect\tGetUnitRect() const;\n\n    FX_FLOAT\t\tGetUnitArea() const;\n    FX_FLOAT\t\tTransformXDistance(FX_FLOAT dx) const;\n    FX_INT32\t\tTransformXDistance(FX_INT32 dx) const;\n    FX_FLOAT\t\tTransformYDistance(FX_FLOAT dy) const;\n    FX_INT32\t\tTransformYDistance(FX_INT32 dy) const;\n    FX_FLOAT\t\tTransformDistance(FX_FLOAT dx, FX_FLOAT dy) const;\n    FX_INT32\t\tTransformDistance(FX_INT32 dx, FX_INT32 dy) const;\n\n    FX_FLOAT\t\tTransformDistance(FX_FLOAT distance) const;\n    void\t\t\tTransformPoint(FX_FLOAT &x, FX_FLOAT &y) const;\n    void\t\t\tTransformPoint(FX_INT32 &x, FX_INT32 &y) const;\n    void\t\t\tTransformPoints(CFX_PointF *points, FX_INT32 iCount) const;\n    void\t\t\tTransformPoints(CFX_Point *points, FX_INT32 iCount) const;\n\n    void\t\t\tTransform(FX_FLOAT& x, FX_FLOAT& y) const\n    {\n        TransformPoint(x, y);\n    }\n\n    void\t\t\tTransform(FX_FLOAT x, FX_FLOAT y, FX_FLOAT& x1, FX_FLOAT& y1) const\n    {\n        x1 = x, y1 = y;\n        TransformPoint(x1, y1);\n    }\n    void\t\t\tTransformVector(CFX_VectorF &v) const;\n    void\t\t\tTransformVector(CFX_Vector &v) const;\n    void\t\t\tTransformRect(CFX_RectF &rect) const;\n    void\t\t\tTransformRect(CFX_Rect &rect) const;\n\n    void\t\t\tTransformRect(FX_FLOAT& left, FX_FLOAT& right, FX_FLOAT& top, FX_FLOAT& bottom) const;\n\n    void\t\t\tTransformRect(CFX_FloatRect& rect) const\n    {\n        TransformRect(rect.left, rect.right, rect.top, rect.bottom);\n    }\n\n    FX_FLOAT\t\tGetA() const\n    {\n        return a;\n    }\n\n    FX_FLOAT\t\tGetB() const\n    {\n        return b;\n    }\n\n    FX_FLOAT\t\tGetC() const\n    {\n        return c;\n    }\n\n    FX_FLOAT\t\tGetD() const\n    {\n        return d;\n    }\n\n    FX_FLOAT\t\tGetE() const\n    {\n        return e;\n    }\n\n    FX_FLOAT\t\tGetF() const\n    {\n        return f;\n    }\npublic:\n    FX_FLOAT a;\n    FX_FLOAT b;\n    FX_FLOAT c;\n    FX_FLOAT d;\n    FX_FLOAT e;\n    FX_FLOAT f;\n};\n#define CFX_AffineMatrix\tCFX_Matrix\n#endif\n"
  },
  {
    "path": "core/include/fxcrt/fx_ext.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXCRT_EXTENSION_\n#define _FXCRT_EXTENSION_\n#ifndef _FX_BASIC_H_\n#include \"fx_basic.h\"\n#endif\n#ifndef _FXCRT_COORDINATES_\n#include \"fx_coordinates.h\"\n#endif\n#ifndef _FX_XML_H_\n#include \"fx_xml.h\"\n#endif\n#ifndef _FX_UNICODE_\n#include \"fx_ucd.h\"\n#endif\n#ifndef _FX_ARABIC_\n#include \"fx_arb.h\"\n#endif\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\nFX_FLOAT\t\tFXSYS_tan(FX_FLOAT a);\nFX_FLOAT\t\tFXSYS_logb(FX_FLOAT b, FX_FLOAT x);\nFX_FLOAT\t\tFXSYS_strtof(FX_LPCSTR pcsStr, FX_INT32 iLength = -1, FX_INT32 *pUsedLen = NULL);\nFX_FLOAT\t\tFXSYS_wcstof(FX_LPCWSTR pwsStr, FX_INT32 iLength = -1, FX_INT32 *pUsedLen = NULL);\nFX_LPWSTR\t\tFXSYS_wcsncpy(FX_LPWSTR dstStr, FX_LPCWSTR srcStr, size_t count);\nFX_INT32\t\tFXSYS_wcsnicmp(FX_LPCWSTR s1, FX_LPCWSTR s2, size_t count);\nFX_INT32\t\tFXSYS_strnicmp(FX_LPCSTR s1, FX_LPCSTR s2, size_t count);\ninline FX_BOOL\tFXSYS_islower(FX_INT32 ch)\n{\n    return ch >= 'a' && ch <= 'z';\n}\ninline FX_BOOL\tFXSYS_isupper(FX_INT32 ch)\n{\n    return ch >= 'A' && ch <= 'Z';\n}\ninline FX_INT32\tFXSYS_tolower(FX_INT32 ch)\n{\n    return ch < 'A' || ch > 'Z' ? ch : (ch + 0x20);\n}\ninline FX_INT32 FXSYS_toupper(FX_INT32 ch)\n{\n    return ch < 'a' || ch > 'z' ? ch : (ch - 0x20);\n}\n\n\n\nFX_DWORD\tFX_HashCode_String_GetA(FX_LPCSTR pStr, FX_INT32 iLength, FX_BOOL bIgnoreCase = FALSE);\nFX_DWORD\tFX_HashCode_String_GetW(FX_LPCWSTR pStr, FX_INT32 iLength, FX_BOOL bIgnoreCase = FALSE);\n\n#ifdef __cplusplus\n}\n#endif\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nFX_LPVOID\tFX_Random_MT_Start(FX_DWORD dwSeed);\n\nFX_DWORD\tFX_Random_MT_Generate(FX_LPVOID pContext);\n\nvoid\t\tFX_Random_MT_Close(FX_LPVOID pContext);\n\nvoid\t\tFX_Random_GenerateBase(FX_LPDWORD pBuffer, FX_INT32 iCount);\n\nvoid\t\tFX_Random_GenerateMT(FX_LPDWORD pBuffer, FX_INT32 iCount);\n\nvoid\t\tFX_Random_GenerateCrypto(FX_LPDWORD pBuffer, FX_INT32 iCount);\n#ifdef __cplusplus\n}\n#endif\ntemplate<class baseType>\nclass CFX_SSortTemplate\n{\npublic:\n    void ShellSort(baseType *pArray, FX_INT32 iCount)\n    {\n        FXSYS_assert(pArray != NULL && iCount > 0);\n        FX_INT32 i, j, gap;\n        baseType v1, v2;\n        gap = iCount >> 1;\n        while (gap > 0) {\n            for (i = gap; i < iCount; i ++) {\n                j = i - gap;\n                v1 = pArray[i];\n                while (j > -1 && (v2 = pArray[j]) > v1) {\n                    pArray[j + gap] = v2;\n                    j -= gap;\n                }\n                pArray[j + gap] = v1;\n            }\n            gap >>= 1;\n        }\n    }\n};\n#endif\n"
  },
  {
    "path": "core/include/fxcrt/fx_memory.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_MEMORY_H_\n#define _FX_MEMORY_H_\n#ifndef _FX_SYSTEM_H_\n#include \"fx_system.h\"\n#endif\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n#define FX_Alloc(type, size)\t\t\t\t\t\t(type*)calloc(size, sizeof(type))\n#define FX_Realloc(type, ptr, size)\t\t\t\t\t(type*)realloc(ptr, sizeof(type) * (size))\n#define FX_AllocNL(type, size)\t\t\t\t\t\tFX_Alloc(type, size)\n#define FX_ReallocNL(type, ptr, size)\t\t\t\tFX_Realloc(type, ptr, size)\n#define FX_Free(ptr)\t\t\t\t\t\t\t\tfree(ptr)\nvoid*\tFXMEM_DefaultAlloc(size_t byte_size, int flags);\nvoid*\tFXMEM_DefaultRealloc(void* pointer, size_t new_size, int flags);\nvoid\tFXMEM_DefaultFree(void* pointer, int flags);\n#ifdef __cplusplus\n}\n#endif\n#ifdef __cplusplus\nclass CFX_Object\n{\npublic:\n    void*\t\t\toperator new (size_t size, FX_LPCSTR file, int line)\n    {\n        return malloc(size);\n    }\n    void\t\t\toperator delete (void* p, FX_LPCSTR file, int line)\n    {\n        free(p);\n    }\n    void*\t\t\toperator new (size_t size)\n    {\n        return malloc(size);\n    }\n    void\t\t\toperator delete (void* p)\n    {\n        free(p);\n    }\n    void*\t\t\toperator new[] (size_t size, FX_LPCSTR file, int line)\n    {\n        return malloc(size);\n    }\n    void\t\t\toperator delete[] (void* p, FX_LPCSTR file, int line)\n    {\n        free(p);\n    }\n    void*\t\t\toperator new[] (size_t size)\n    {\n        return malloc(size);\n    }\n    void\t\t\toperator delete[] (void* p)\n    {\n        free(p);\n    }\n    void*\t\t\toperator new (size_t, void* buf)\n    {\n        return buf;\n    }\n    void\t\t\toperator delete (void*, void*)\t\t\t\t\t\t\t{}\n};\n#endif\n#ifdef __cplusplus\n#if defined(_DEBUG)\n#define FX_NEW new(__FILE__, __LINE__)\n#else\n\n#define FX_NEW new\n#endif\n#define FX_NEW_VECTOR(Pointer, Class, Count) \\\n    { \\\n        Pointer = FX_Alloc(Class, Count); \\\n        if (Pointer) { \\\n            for (int i = 0; i < (Count); i ++) new (Pointer + i) Class; \\\n        } \\\n    }\n#define FX_DELETE_VECTOR(Pointer, Class, Count) \\\n    { \\\n        for (int i = 0; i < (Count); i ++) Pointer[i].~Class(); \\\n        FX_Free(Pointer); \\\n    }\nclass CFX_DestructObject : public CFX_Object\n{\npublic:\n\n    virtual ~CFX_DestructObject() {}\n};\nclass CFX_GrowOnlyPool : public CFX_Object\n{\npublic:\n\n    CFX_GrowOnlyPool(size_t trunk_size = 16384);\n\n    ~CFX_GrowOnlyPool();\n\n    void\tSetTrunkSize(size_t trunk_size)\n    {\n        m_TrunkSize = trunk_size;\n    }\n\n    void*\tAllocDebug(size_t size, FX_LPCSTR file, int line)\n    {\n        return Alloc(size);\n    }\n\n    void*\tAlloc(size_t size);\n\n    void*\tReallocDebug(void* p, size_t new_size, FX_LPCSTR file, int line)\n    {\n        return NULL;\n    }\n\n    void*\tRealloc(void* p, size_t new_size)\n    {\n        return NULL;\n    }\n\n    void\tFree(void*) {}\n\n    void\tFreeAll();\nprivate:\n\n    size_t\tm_TrunkSize;\n\n    void*\tm_pFirstTrunk;\n};\n#endif\n#endif\n"
  },
  {
    "path": "core/include/fxcrt/fx_stream.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_STREAM_H_\n#define _FX_STREAM_H_\n#ifndef _FX_MEMORY_H_\n#include \"fx_memory.h\"\n#endif\nvoid* FX_OpenFolder(FX_LPCSTR path);\nvoid* FX_OpenFolder(FX_LPCWSTR path);\nFX_BOOL FX_GetNextFile(void* handle, CFX_ByteString& filename, FX_BOOL& bFolder);\nFX_BOOL FX_GetNextFile(void* handle, CFX_WideString& filename, FX_BOOL& bFolder);\nvoid FX_CloseFolder(void* handle);\nFX_WCHAR FX_GetFolderSeparator();\nFX_DEFINEHANDLE(FX_HFILE)\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\n#define FX_FILESIZE\t\t\tFX_INT32\n#else\n#include <fcntl.h>\n#include <unistd.h>\n#include <sys/stat.h>\n#ifndef O_BINARY\n#define O_BINARY \t\t0\n#endif\n#ifndef O_LARGEFILE\n#define O_LARGEFILE\t\t0\n#endif\n#define FX_FILESIZE\t\t\toff_t\n#endif\n#define FX_GETBYTEOFFSET32(a)\t0\n#define FX_GETBYTEOFFSET40(a)\t0\n#define FX_GETBYTEOFFSET48(a)\t0\n#define FX_GETBYTEOFFSET56(a)\t0\n#define FX_GETBYTEOFFSET24(a)  ((FX_BYTE)(a>>24))\n#define FX_GETBYTEOFFSET16(a)  ((FX_BYTE)(a>>16))\n#define FX_GETBYTEOFFSET8(a)   ((FX_BYTE)(a>>8))\n#define FX_GETBYTEOFFSET0(a)   ((FX_BYTE)(a))\n#define FX_FILEMODE_Write\t\t0\n#define FX_FILEMODE_ReadOnly\t1\n#define FX_FILEMODE_Truncate\t2\nFX_HFILE\tFX_File_Open(FX_BSTR fileName, FX_DWORD dwMode);\nFX_HFILE\tFX_File_Open(FX_WSTR fileName, FX_DWORD dwMode);\nvoid\t\tFX_File_Close(FX_HFILE hFile);\nFX_FILESIZE\tFX_File_GetSize(FX_HFILE hFile);\nFX_FILESIZE\tFX_File_GetPosition(FX_HFILE hFile);\nFX_FILESIZE\tFX_File_SetPosition(FX_HFILE hFile, FX_FILESIZE pos);\nsize_t\t\tFX_File_Read(FX_HFILE hFile, void* pBuffer, size_t szBuffer);\nsize_t\t\tFX_File_ReadPos(FX_HFILE hFile, void* pBuffer, size_t szBuffer, FX_FILESIZE pos);\nsize_t\t\tFX_File_Write(FX_HFILE hFile, const void* pBuffer, size_t szBuffer);\nsize_t\t\tFX_File_WritePos(FX_HFILE hFile, const void* pBuffer, size_t szBuffer, FX_FILESIZE pos);\nFX_BOOL\t\tFX_File_Flush(FX_HFILE hFile);\nFX_BOOL\t\tFX_File_Truncate(FX_HFILE hFile, FX_FILESIZE szFile);\nFX_BOOL\t\tFX_File_Exist(FX_BSTR fileName);\nFX_BOOL\t\tFX_File_Exist(FX_WSTR fileName);\nFX_BOOL\t\tFX_File_Delete(FX_BSTR fileName);\nFX_BOOL\t\tFX_File_Delete(FX_WSTR fileName);\nFX_BOOL\t\tFX_File_Copy(FX_BSTR fileNameSrc, FX_BSTR fileNameDst);\nFX_BOOL\t\tFX_File_Copy(FX_WSTR fileNameSrc, FX_WSTR fileNameDst);\nFX_BOOL\t\tFX_File_Move(FX_BSTR fileNameSrc, FX_BSTR fileNameDst);\nFX_BOOL\t\tFX_File_Move(FX_WSTR fileNameSrc, FX_WSTR fileNameDst);\nclass IFX_StreamWrite\n{\npublic:\n\n    virtual void\t\tRelease() = 0;\n\n    virtual\tFX_BOOL\t\tWriteBlock(const void* pData, size_t size) = 0;\n};\nclass IFX_FileWrite : public IFX_StreamWrite\n{\npublic:\n\n    virtual void\t\t\tRelease() = 0;\n\n    virtual FX_FILESIZE\t\tGetSize() = 0;\n\n    virtual FX_BOOL\t\t\tFlush() = 0;\n\n    virtual\tFX_BOOL\t\t\tWriteBlock(const void* pData, FX_FILESIZE offset, size_t size) = 0;\n    virtual\tFX_BOOL\t\t\tWriteBlock(const void* pData, size_t size)\n    {\n        return WriteBlock(pData, GetSize(), size);\n    }\n};\nIFX_FileWrite* FX_CreateFileWrite(FX_LPCSTR filename);\nIFX_FileWrite* FX_CreateFileWrite(FX_LPCWSTR filename);\nclass IFX_StreamRead\n{\npublic:\n\n    virtual void\t\t\tRelease() = 0;\n\n    virtual FX_BOOL\t\t\tIsEOF() = 0;\n\n    virtual FX_FILESIZE\t\tGetPosition() = 0;\n\n    virtual size_t\t\t\tReadBlock(void* buffer, size_t size) = 0;\n};\nclass IFX_FileRead : IFX_StreamRead\n{\npublic:\n\n    virtual void\t\t\tRelease() = 0;\n\n    virtual FX_FILESIZE\t\tGetSize() = 0;\n\n    virtual FX_BOOL\t\t\tIsEOF()\n    {\n        return FALSE;\n    }\n\n    virtual FX_FILESIZE\t\tGetPosition()\n    {\n        return 0;\n    }\n\n    virtual FX_BOOL\t\t\tSetRange(FX_FILESIZE offset, FX_FILESIZE size)\n    {\n        return FALSE;\n    }\n\n    virtual void\t\t\tClearRange() {}\n\n    virtual FX_BOOL\t\t\tReadBlock(void* buffer, FX_FILESIZE offset, size_t size) = 0;\n\n    virtual size_t\t\t\tReadBlock(void* buffer, size_t size)\n    {\n        return 0;\n    }\n};\nIFX_FileRead* FX_CreateFileRead(FX_LPCSTR filename);\nIFX_FileRead* FX_CreateFileRead(FX_LPCWSTR filename);\nclass IFX_FileStream : public IFX_FileRead, public IFX_FileWrite\n{\npublic:\n\n    virtual IFX_FileStream*\t\tRetain() = 0;\n\n    virtual void\t\t\t\tRelease() = 0;\n\n    virtual FX_FILESIZE\t\t\tGetSize() = 0;\n\n    virtual FX_BOOL\t\t\t\tIsEOF() = 0;\n\n    virtual FX_FILESIZE\t\t\tGetPosition() = 0;\n\n    virtual FX_BOOL\t\t\t\tReadBlock(void* buffer, FX_FILESIZE offset, size_t size) = 0;\n\n    virtual size_t\t\t\t\tReadBlock(void* buffer, size_t size) = 0;\n\n    virtual\tFX_BOOL\t\t\t\tWriteBlock(const void* buffer, FX_FILESIZE offset, size_t size) = 0;\n    virtual\tFX_BOOL\t\t\t\tWriteBlock(const void* buffer, size_t size)\n    {\n        return WriteBlock(buffer, GetSize(), size);\n    }\n\n    virtual FX_BOOL\t\t\t\tFlush() = 0;\n};\nIFX_FileStream*\t\tFX_CreateFileStream(FX_LPCSTR filename, FX_DWORD dwModes);\nIFX_FileStream*\t\tFX_CreateFileStream(FX_LPCWSTR filename, FX_DWORD dwModes);\nclass IFX_MemoryStream : public IFX_FileStream\n{\npublic:\n\n    virtual FX_BOOL\t\t\tIsConsecutive() const = 0;\n\n    virtual void\t\t\tEstimateSize(size_t nInitSize, size_t nGrowSize) = 0;\n\n    virtual FX_LPBYTE\t\tGetBuffer() const = 0;\n\n    virtual void\t\t\tAttachBuffer(FX_LPBYTE pBuffer, size_t nSize, FX_BOOL bTakeOver = FALSE) = 0;\n\n    virtual void\t\t\tDetachBuffer() = 0;\n};\nIFX_MemoryStream*\tFX_CreateMemoryStream(FX_LPBYTE pBuffer, size_t nSize, FX_BOOL bTakeOver = FALSE);\nIFX_MemoryStream*\tFX_CreateMemoryStream(FX_BOOL bConsecutive = FALSE);\nclass IFX_BufferRead : public IFX_StreamRead\n{\npublic:\n\n    virtual void\t\t\tRelease() = 0;\n\n    virtual FX_BOOL\t\t\tIsEOF() = 0;\n\n    virtual FX_FILESIZE\t\tGetPosition() = 0;\n\n    virtual size_t\t\t\tReadBlock(void* buffer, size_t size) = 0;\n\n    virtual FX_BOOL\t\t\tReadNextBlock(FX_BOOL bRestart = FALSE) = 0;\n\n    virtual FX_LPCBYTE\t\tGetBlockBuffer() = 0;\n\n    virtual size_t\t\t\tGetBlockSize() = 0;\n\n    virtual FX_FILESIZE\t\tGetBlockOffset() = 0;\n};\n#endif\n"
  },
  {
    "path": "core/include/fxcrt/fx_string.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_STRING_H_\n#define _FX_STRING_H_\nclass CFX_ByteStringC;\nclass CFX_ByteString;\nclass CFX_WideStringC;\nclass CFX_WideString;\nstruct CFX_CharMap;\nclass CFX_BinaryBuf;\ntypedef int FX_STRSIZE;\nclass CFX_ByteStringL;\nclass CFX_WideStringL;\nclass CFX_ByteStringC : public CFX_Object\n{\npublic:\n\n    CFX_ByteStringC()\n    {\n        m_Ptr = NULL;\n        m_Length = 0;\n    }\n\n    CFX_ByteStringC(FX_LPCBYTE ptr, FX_STRSIZE size)\n    {\n        m_Ptr = ptr;\n        m_Length = size;\n    }\n\n    CFX_ByteStringC(FX_LPCSTR ptr)\n    {\n        m_Ptr = (FX_LPCBYTE)ptr;\n        m_Length = ptr ? (FX_STRSIZE)FXSYS_strlen(ptr) : 0;\n    }\n\n    CFX_ByteStringC(FX_CHAR& ch)\n    {\n        m_Ptr = (FX_LPCBYTE)&ch;\n        m_Length = 1;\n    }\n\n    CFX_ByteStringC(FX_LPCSTR ptr, FX_STRSIZE len)\n    {\n        m_Ptr = (FX_LPCBYTE)ptr;\n        if (len == -1) {\n            m_Length = (FX_STRSIZE)FXSYS_strlen(ptr);\n        } else {\n            m_Length = len;\n        }\n    }\n\n    CFX_ByteStringC(const CFX_ByteStringC& src)\n    {\n        m_Ptr = src.m_Ptr;\n        m_Length = src.m_Length;\n    }\n\n    CFX_ByteStringC(const CFX_ByteString& src);\n\n    CFX_ByteStringC& operator = (FX_LPCSTR src)\n    {\n        m_Ptr = (FX_LPCBYTE)src;\n        m_Length = (FX_STRSIZE)FXSYS_strlen(src);\n        return *this;\n    }\n\n    CFX_ByteStringC& operator = (const CFX_ByteStringC& src)\n    {\n        m_Ptr = src.m_Ptr;\n        m_Length = src.m_Length;\n        return *this;\n    }\n\n    CFX_ByteStringC& operator = (const CFX_ByteString& src);\n\n    bool\t\t\toperator == (const CFX_ByteStringC& str) const\n    {\n        return \tstr.m_Length == m_Length && FXSYS_memcmp32(str.m_Ptr, m_Ptr, m_Length) == 0;\n    }\n\n    bool\t\t\toperator != (const CFX_ByteStringC& str) const\n    {\n        return \tstr.m_Length != m_Length || FXSYS_memcmp32(str.m_Ptr, m_Ptr, m_Length) != 0;\n    }\n#define FXBSTR_ID(c1, c2, c3, c4) ((c1 << 24) | (c2 << 16) | (c3 << 8) | (c4))\n\n    FX_DWORD\t\tGetID(FX_STRSIZE start_pos = 0) const;\n\n    FX_LPCBYTE\t\tGetPtr() const\n    {\n        return m_Ptr;\n    }\n\n    FX_LPCSTR\t\tGetCStr() const\n    {\n        return (FX_LPCSTR)m_Ptr;\n    }\n\n    FX_STRSIZE\t\tGetLength() const\n    {\n        return m_Length;\n    }\n\n    bool\t\t\tIsEmpty() const\n    {\n        return m_Length == 0;\n    }\n\n    operator\t\tFX_LPCBYTE() const\n    {\n        return m_Ptr;\n    }\n\n    FX_BYTE\t\t\tGetAt(FX_STRSIZE index) const\n    {\n        return m_Ptr[index];\n    }\n\n    CFX_ByteStringC\tMid(FX_STRSIZE index, FX_STRSIZE count = -1) const\n    {\n        if (index < 0) {\n            index = 0;\n        }\n        if (index > m_Length) {\n            return CFX_ByteStringC();\n        }\n        if (count < 0 || count > m_Length - index) {\n            count = m_Length - index;\n        }\n        return CFX_ByteStringC(m_Ptr + index, count);\n    }\nprotected:\n\n    FX_LPCBYTE\t\tm_Ptr;\n\n    FX_STRSIZE\t\tm_Length;\nprivate:\n\n    void*\t\t\toperator new (size_t) throw()\n    {\n        return NULL;\n    }\n};\ntypedef const CFX_ByteStringC& FX_BSTR;\n#define FX_BSTRC(str) CFX_ByteStringC(str, sizeof str-1)\nstruct CFX_StringData {\n\n    long\t\tm_nRefs;\n\n    FX_STRSIZE\tm_nDataLength;\n\n    FX_STRSIZE\tm_nAllocLength;\n\n    FX_CHAR\t\tm_String[1];\n};\nclass CFX_ByteString : public CFX_Object\n{\npublic:\n\n    CFX_ByteString()\n    {\n        m_pData = NULL;\n    }\n\n    CFX_ByteString(const CFX_ByteString& str);\n\n    CFX_ByteString(char ch);\n\n    CFX_ByteString(FX_LPCSTR ptr, FX_STRSIZE len = -1);\n\n    CFX_ByteString(FX_LPCBYTE ptr, FX_STRSIZE len);\n\n    CFX_ByteString(FX_BSTR bstrc);\n\n    CFX_ByteString(FX_BSTR bstrc1, FX_BSTR bstrc2);\n\n    ~CFX_ByteString();\n\n    static CFX_ByteString\tFromUnicode(FX_LPCWSTR ptr, FX_STRSIZE len = -1);\n\n    static CFX_ByteString\tFromUnicode(const CFX_WideString& str);\n\n    operator\t\t\t\tFX_LPCSTR() const\n    {\n        return m_pData ? m_pData->m_String : \"\";\n    }\n\n    operator\t\t\t\tFX_LPCBYTE() const\n    {\n        return m_pData ? (FX_LPCBYTE)m_pData->m_String : NULL;\n    }\n\n    FX_STRSIZE\t\t\t\tGetLength() const\n    {\n        return m_pData ? m_pData->m_nDataLength : 0;\n    }\n\n    bool\t\t\t\t\tIsEmpty() const\n    {\n        return !GetLength();\n    }\n\n    int\t\t\t\t\t\tCompare(FX_BSTR str) const;\n\n\n    bool\t\t\t\t\tEqual(FX_BSTR str) const;\n\n\n    bool\t\t\t\t\tEqualNoCase(FX_BSTR str) const;\n\n    bool\t\t\t\t\toperator == (FX_LPCSTR str) const\n    {\n        return Equal(str);\n    }\n\n    bool\t\t\t\t\toperator == (FX_BSTR str) const\n    {\n        return Equal(str);\n    }\n\n    bool\t\t\t\t\toperator == (const CFX_ByteString& str) const;\n\n    bool\t\t\t\t\toperator != (FX_LPCSTR str) const\n    {\n        return !Equal(str);\n    }\n\n    bool\t\t\t\t\toperator != (FX_BSTR str) const\n    {\n        return !Equal(str);\n    }\n\n    bool\t\t\t\t\toperator != (const CFX_ByteString& str) const\n    {\n        return !operator==(str);\n    }\n\n    void\t\t\t\t\tEmpty();\n\n    const CFX_ByteString&\toperator = (FX_LPCSTR str);\n\n    const CFX_ByteString&\toperator = (FX_BSTR bstrc);\n\n    const CFX_ByteString&\toperator = (const CFX_ByteString& stringSrc);\n\n    const CFX_ByteString&\toperator = (const CFX_BinaryBuf& buf);\n\n    void\t\t\t\t\tLoad(FX_LPCBYTE str, FX_STRSIZE len);\n\n    const CFX_ByteString&\toperator += (FX_CHAR ch);\n\n    const CFX_ByteString&\toperator += (FX_LPCSTR str);\n\n    const CFX_ByteString&\toperator += (const CFX_ByteString& str);\n\n    const CFX_ByteString&\toperator += (FX_BSTR bstrc);\n\n    FX_BYTE\t\t\t\t\tGetAt(FX_STRSIZE nIndex) const\n    {\n        return m_pData ? m_pData->m_String[nIndex] : 0;\n    }\n\n    FX_BYTE\t\t\t\t\toperator[](FX_STRSIZE nIndex) const\n    {\n        return m_pData ? m_pData->m_String[nIndex] : 0;\n    }\n\n    void\t\t\t\t\tSetAt(FX_STRSIZE nIndex, FX_CHAR ch);\n\n    FX_STRSIZE\t\t\t\tInsert(FX_STRSIZE index, FX_CHAR ch);\n\n    FX_STRSIZE\t\t\t\tDelete(FX_STRSIZE index, FX_STRSIZE count = 1);\n\n\n    void\t\t\t\t\tFormat(FX_LPCSTR lpszFormat, ... );\n\n    void\t\t\t\t\tFormatV(FX_LPCSTR lpszFormat, va_list argList);\n\n\n    void\t\t\t\t\tReserve(FX_STRSIZE len);\n\n    FX_LPSTR\t\t\t\tGetBuffer(FX_STRSIZE len);\n\n    FX_LPSTR\t\t\t\tLockBuffer();\n\n    void\t\t\t\t\tReleaseBuffer(FX_STRSIZE len = -1);\n\n    CFX_ByteString\t\t\tMid(FX_STRSIZE first) const;\n\n    CFX_ByteString\t\t\tMid(FX_STRSIZE first, FX_STRSIZE count) const;\n\n    CFX_ByteString\t\t\tLeft(FX_STRSIZE count) const;\n\n    CFX_ByteString\t\t\tRight(FX_STRSIZE count) const;\n\n    FX_STRSIZE\t\t\t\tFind(FX_BSTR lpszSub, FX_STRSIZE start = 0) const;\n\n    FX_STRSIZE\t\t\t\tFind(FX_CHAR ch, FX_STRSIZE start = 0) const;\n\n    FX_STRSIZE\t\t\t\tReverseFind(FX_CHAR ch) const;\n\n    void\t\t\t\t\tMakeLower();\n\n    void\t\t\t\t\tMakeUpper();\n\n    void\t\t\t\t\tTrimRight();\n\n    void\t\t\t\t\tTrimRight(FX_CHAR chTarget);\n\n    void\t\t\t\t\tTrimRight(FX_BSTR lpszTargets);\n\n    void\t\t\t\t\tTrimLeft();\n\n    void\t\t\t\t\tTrimLeft(FX_CHAR chTarget);\n\n    void\t\t\t\t\tTrimLeft(FX_BSTR lpszTargets);\n\n    FX_STRSIZE\t\t\t\tReplace(FX_BSTR lpszOld, FX_BSTR lpszNew);\n\n    FX_STRSIZE\t\t\t\tRemove(FX_CHAR ch);\n\n    CFX_WideString\t\t\tUTF8Decode() const;\n\n    void\t\t\t\t\tConvertFrom(const CFX_WideString& str, CFX_CharMap* pCharMap = NULL);\n\n    FX_DWORD\t\t\t\tGetID(FX_STRSIZE start_pos = 0) const;\n\n    static CFX_ByteString\tLoadFromFile(FX_BSTR file_path);\n#define FXFORMAT_SIGNED\t\t\t1\n#define FXFORMAT_HEX\t\t\t2\n#define FXFORMAT_CAPITAL\t\t4\n\n    static CFX_ByteString\tFormatInteger(int i, FX_DWORD flags = 0);\n\n    static CFX_ByteString\tFormatFloat(FX_FLOAT f, int precision = 0);\nprotected:\n\n    struct CFX_StringData*\tm_pData;\n    void\t\t\t\t\tAllocCopy(CFX_ByteString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex) const;\n    void\t\t\t\t\tAssignCopy(FX_STRSIZE nSrcLen, FX_LPCSTR lpszSrcData);\n    void\t\t\t\t\tConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCSTR lpszSrc1Data, FX_STRSIZE nSrc2Len, FX_LPCSTR lpszSrc2Data);\n    void\t\t\t\t\tConcatInPlace(FX_STRSIZE nSrcLen, FX_LPCSTR lpszSrcData);\n    void\t\t\t\t\tCopyBeforeWrite();\n    void\t\t\t\t\tAllocBeforeWrite(FX_STRSIZE nLen);\n};\ninline CFX_ByteStringC::CFX_ByteStringC(const CFX_ByteString& src)\n{\n    m_Ptr = (FX_LPCBYTE)src;\n    m_Length = src.GetLength();\n}\ninline CFX_ByteStringC& CFX_ByteStringC::operator = (const CFX_ByteString& src)\n{\n    m_Ptr = (FX_LPCBYTE)src;\n    m_Length = src.GetLength();\n    return *this;\n}\n\ninline CFX_ByteString operator + (FX_BSTR str1, FX_BSTR str2)\n{\n    return CFX_ByteString(str1, str2);\n}\ninline CFX_ByteString operator + (FX_BSTR str1, FX_LPCSTR str2)\n{\n    return CFX_ByteString(str1, str2);\n}\ninline CFX_ByteString operator + (FX_LPCSTR str1, FX_BSTR str2)\n{\n    return CFX_ByteString(str1, str2);\n}\ninline CFX_ByteString operator + (FX_BSTR str1, FX_CHAR ch)\n{\n    return CFX_ByteString(str1, CFX_ByteStringC(ch));\n}\ninline CFX_ByteString operator + (FX_CHAR ch, FX_BSTR str2)\n{\n    return CFX_ByteString(ch, str2);\n}\ninline CFX_ByteString operator + (const CFX_ByteString& str1, const CFX_ByteString& str2)\n{\n    return CFX_ByteString(str1, str2);\n}\ninline CFX_ByteString operator + (const CFX_ByteString& str1, FX_CHAR ch)\n{\n    return CFX_ByteString(str1, CFX_ByteStringC(ch));\n}\ninline CFX_ByteString operator + (FX_CHAR ch, const CFX_ByteString& str2)\n{\n    return CFX_ByteString(ch, str2);\n}\ninline CFX_ByteString operator + (const CFX_ByteString& str1, FX_LPCSTR str2)\n{\n    return CFX_ByteString(str1, str2);\n}\ninline CFX_ByteString operator + (FX_LPCSTR str1, const CFX_ByteString& str2)\n{\n    return CFX_ByteString(str1, str2);\n}\ninline CFX_ByteString operator + (const CFX_ByteString& str1, FX_BSTR str2)\n{\n    return CFX_ByteString(str1, str2);\n}\ninline CFX_ByteString operator + (FX_BSTR str1, const CFX_ByteString& str2)\n{\n    return CFX_ByteString(str1, str2);\n}\nclass CFX_StringBufBase : public CFX_Object\n{\npublic:\n\n    CFX_StringBufBase(FX_STRSIZE limit)\n    {\n        m_Size = 0;\n        m_Limit = limit;\n    }\n\n    FX_CHAR*\tGetPtr() const\n    {\n        return (FX_CHAR*)(this + 1);\n    }\n\n    FX_STRSIZE\tGetSize() const\n    {\n        return m_Size;\n    }\n\n    void\t\tEmpty()\n    {\n        m_Size = 0;\n    }\n\n    void\t\tCopy(FX_BSTR str);\n\n    void\t\tAppend(FX_BSTR str);\n\n    void\t\tAppend(int i, FX_DWORD flags = 0);\n\n    CFX_ByteStringC\t\tGetStringC() const\n    {\n        return CFX_ByteStringC((FX_CHAR*)(this + 1), m_Size);\n    }\n\n    CFX_ByteString\t\tGetString() const\n    {\n        return CFX_ByteString((FX_CHAR*)(this + 1), m_Size);\n    }\nprotected:\n\n    FX_STRSIZE\tm_Limit;\n\n    FX_STRSIZE\tm_Size;\n};\ntemplate<FX_STRSIZE limit>\nclass CFX_StringBufTemplate : public CFX_StringBufBase\n{\npublic:\n\n    CFX_StringBufTemplate() : CFX_StringBufBase(limit) {}\n\n    FX_CHAR\t\tm_Buffer[limit];\n};\ntypedef CFX_StringBufTemplate<256> CFX_StringBuf256;\nclass CFX_WideStringC : public CFX_Object\n{\npublic:\n\n    CFX_WideStringC()\n    {\n        m_Ptr = NULL;\n        m_Length = 0;\n    }\n\n    CFX_WideStringC(FX_LPCWSTR ptr)\n    {\n        m_Ptr = ptr;\n        m_Length = ptr ? (FX_STRSIZE)FXSYS_wcslen(ptr) : 0;\n    }\n\n    CFX_WideStringC(FX_WCHAR& ch)\n    {\n        m_Ptr = &ch;\n        m_Length = 1;\n    }\n\n    CFX_WideStringC(FX_LPCWSTR ptr, FX_STRSIZE len)\n    {\n        m_Ptr = ptr;\n        if (len == -1) {\n            m_Length = (FX_STRSIZE)FXSYS_wcslen(ptr);\n        } else {\n            m_Length = len;\n        }\n    }\n\n    CFX_WideStringC(const CFX_WideStringC& src)\n    {\n        m_Ptr = src.m_Ptr;\n        m_Length = src.m_Length;\n    }\n\n    CFX_WideStringC(const CFX_WideString& src);\n\n    CFX_WideStringC& operator = (FX_LPCWSTR src)\n    {\n        m_Ptr = src;\n        m_Length = (FX_STRSIZE)FXSYS_wcslen(src);\n        return *this;\n    }\n\n    CFX_WideStringC& operator = (const CFX_WideStringC& src)\n    {\n        m_Ptr = src.m_Ptr;\n        m_Length = src.m_Length;\n        return *this;\n    }\n\n    CFX_WideStringC& operator = (const CFX_WideString& src);\n\n    bool\t\t\toperator == (const CFX_WideStringC& str) const\n    {\n        return \tstr.m_Length == m_Length && FXSYS_memcmp32(str.m_Ptr, m_Ptr, m_Length * sizeof(FX_WCHAR)) == 0;\n    }\n\n    bool\t\t\toperator != (const CFX_WideStringC& str) const\n    {\n        return \tstr.m_Length != m_Length || FXSYS_memcmp32(str.m_Ptr, m_Ptr, m_Length * sizeof(FX_WCHAR)) != 0;\n    }\n\n    FX_LPCWSTR\t\tGetPtr() const\n    {\n        return m_Ptr;\n    }\n\n    FX_STRSIZE\t\tGetLength() const\n    {\n        return m_Length;\n    }\n\n    bool\t\t\tIsEmpty() const\n    {\n        return m_Length == 0;\n    }\n\n    FX_WCHAR\t\tGetAt(FX_STRSIZE index) const\n    {\n        return m_Ptr[index];\n    }\n\n    CFX_WideStringC\tLeft(FX_STRSIZE count) const\n    {\n        if (count < 1) {\n            return CFX_WideStringC();\n        }\n        if (count > m_Length) {\n            count = m_Length;\n        }\n        return CFX_WideStringC(m_Ptr, count);\n    }\n\n    CFX_WideStringC\tMid(FX_STRSIZE index, FX_STRSIZE count = -1) const\n    {\n        if (index < 0) {\n            index = 0;\n        }\n        if (index > m_Length) {\n            return CFX_WideStringC();\n        }\n        if (count < 0 || count > m_Length - index) {\n            count = m_Length - index;\n        }\n        return CFX_WideStringC(m_Ptr + index, count);\n    }\n\n    CFX_WideStringC\tRight(FX_STRSIZE count) const\n    {\n        if (count < 1) {\n            return CFX_WideStringC();\n        }\n        if (count > m_Length) {\n            count = m_Length;\n        }\n        return CFX_WideStringC(m_Ptr + m_Length - count, count);\n    }\nprotected:\n\n    FX_LPCWSTR\t\tm_Ptr;\n\n    FX_STRSIZE\t\tm_Length;\nprivate:\n\n    void*\t\t\toperator new (size_t) throw()\n    {\n        return NULL;\n    }\n};\ntypedef const CFX_WideStringC&\tFX_WSTR;\n#define FX_WSTRC(wstr) CFX_WideStringC((FX_LPCWSTR)wstr, sizeof(wstr) / sizeof(FX_WCHAR) - 1)\nstruct CFX_StringDataW {\n\n    long\t\tm_nRefs;\n\n    FX_STRSIZE\tm_nDataLength;\n\n    FX_STRSIZE\tm_nAllocLength;\n\n    FX_WCHAR\tm_String[1];\n};\nclass CFX_WideString : public CFX_Object\n{\npublic:\n\n    CFX_WideString()\n    {\n        m_pData = NULL;\n    }\n\n    CFX_WideString(const CFX_WideString& str);\n\n    CFX_WideString(FX_LPCWSTR ptr, FX_STRSIZE len = -1)\n    {\n        InitStr(ptr, len);\n    }\n\n    CFX_WideString(FX_WCHAR ch);\n\n    CFX_WideString(const CFX_WideStringC& str);\n\n    CFX_WideString(const CFX_WideStringC& str1, const CFX_WideStringC& str2);\n\n    ~CFX_WideString();\n\n    static CFX_WideString\tFromLocal(const char* str, FX_STRSIZE len = -1);\n\n    static CFX_WideString\tFromUTF8(const char* str, FX_STRSIZE len);\n\n    static CFX_WideString\tFromUTF16LE(const unsigned short* str, FX_STRSIZE len);\n\n    static FX_STRSIZE       WStringLength(const unsigned short* str);\n\n    operator FX_LPCWSTR() const\n    {\n        return m_pData ? m_pData->m_String : (FX_WCHAR*)L\"\";\n    }\n\n    void\t\t\t\t\tEmpty();\n\n\n    FX_BOOL\t\t\t\t\tIsEmpty() const\n    {\n        return !GetLength();\n    }\n\n    FX_STRSIZE\t\t\t\tGetLength() const\n    {\n        return m_pData ? m_pData->m_nDataLength : 0;\n    }\n\n    const CFX_WideString&\toperator = (FX_LPCWSTR str);\n\n    const CFX_WideString&\toperator =(const CFX_WideString& stringSrc);\n\n    const CFX_WideString&\toperator =(const CFX_WideStringC& stringSrc);\n\n    const CFX_WideString&\toperator += (FX_LPCWSTR str);\n\n    const CFX_WideString&\toperator += (FX_WCHAR ch);\n\n    const CFX_WideString&\toperator += (const CFX_WideString& str);\n\n    const CFX_WideString&\toperator += (const CFX_WideStringC& str);\n\n    FX_WCHAR\t\t\t\tGetAt(FX_STRSIZE nIndex) const\n    {\n        return m_pData ? m_pData->m_String[nIndex] : 0;\n    }\n\n    FX_WCHAR\t\t\t\toperator[](FX_STRSIZE nIndex) const\n    {\n        return m_pData ? m_pData->m_String[nIndex] : 0;\n    }\n\n    void\t\t\t\t\tSetAt(FX_STRSIZE nIndex, FX_WCHAR ch);\n\n    int\t\t\t\t\t\tCompare(FX_LPCWSTR str) const;\n\n    int\t\t\t\t\t\tCompare(const CFX_WideString& str) const;\n\n    int\t\t\t\t\t\tCompareNoCase(FX_LPCWSTR str) const;\n\n    bool\t\t\t\t\tEqual(const CFX_WideStringC& str) const;\n\n    CFX_WideString\t\t\tMid(FX_STRSIZE first) const;\n\n    CFX_WideString\t\t\tMid(FX_STRSIZE first, FX_STRSIZE count) const;\n\n    CFX_WideString\t\t\tLeft(FX_STRSIZE count) const;\n\n    CFX_WideString\t\t\tRight(FX_STRSIZE count) const;\n\n    FX_STRSIZE\t\t\t\tInsert(FX_STRSIZE index, FX_WCHAR ch);\n\n    FX_STRSIZE\t\t\t\tDelete(FX_STRSIZE index, FX_STRSIZE count = 1);\n\n    void\t\t\t\t\tFormat(FX_LPCWSTR lpszFormat, ... );\n\n    void\t\t\t\t\tFormatV(FX_LPCWSTR lpszFormat, va_list argList);\n\n    void\t\t\t\t\tMakeLower();\n\n    void\t\t\t\t\tMakeUpper();\n\n    void\t\t\t\t\tTrimRight();\n\n    void\t\t\t\t\tTrimRight(FX_WCHAR chTarget);\n\n    void\t\t\t\t\tTrimRight(FX_LPCWSTR lpszTargets);\n\n    void\t\t\t\t\tTrimLeft();\n\n    void\t\t\t\t\tTrimLeft(FX_WCHAR chTarget);\n\n    void\t\t\t\t\tTrimLeft(FX_LPCWSTR lpszTargets);\n\n    void\t\t\t\t\tReserve(FX_STRSIZE len);\n\n    FX_LPWSTR\t\t\t\tGetBuffer(FX_STRSIZE len);\n\n    FX_LPWSTR\t\t\t\tLockBuffer();\n\n    void\t\t\t\t\tReleaseBuffer(FX_STRSIZE len = -1);\n\n    int\t\t\t\t\t\tGetInteger() const;\n\n    FX_FLOAT\t\t\t\tGetFloat() const;\n\n    FX_STRSIZE\t\t\t\tFind(FX_LPCWSTR lpszSub, FX_STRSIZE start = 0) const;\n\n    FX_STRSIZE\t\t\t\tFind(FX_WCHAR ch, FX_STRSIZE start = 0) const;\n\n    FX_STRSIZE\t\t\t\tReplace(FX_LPCWSTR lpszOld, FX_LPCWSTR lpszNew);\n\n    FX_STRSIZE\t\t\t\tRemove(FX_WCHAR ch);\n\n    CFX_ByteString\t\t\tUTF8Encode() const;\n\n    CFX_ByteString\t\t\tUTF16LE_Encode(FX_BOOL bTerminate = TRUE) const;\n\n    void\t\t\t\t\tConvertFrom(const CFX_ByteString& str, CFX_CharMap* pCharMap = NULL);\nprotected:\n    void\t\t\t\t\tInitStr(FX_LPCWSTR ptr, int len);\n\n    CFX_StringDataW*\t\tm_pData;\n    void\t\t\t\t\tCopyBeforeWrite();\n    void\t\t\t\t\tAllocBeforeWrite(FX_STRSIZE nLen);\n    void\t\t\t\t\tConcatInPlace(FX_STRSIZE nSrcLen, FX_LPCWSTR lpszSrcData);\n    void\t\t\t\t\tConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCWSTR lpszSrc1Data, FX_STRSIZE nSrc2Len, FX_LPCWSTR lpszSrc2Data);\n    void\t\t\t\t\tAssignCopy(FX_STRSIZE nSrcLen, FX_LPCWSTR lpszSrcData);\n    void\t\t\t\t\tAllocCopy(CFX_WideString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex) const;\n};\ninline CFX_WideStringC::CFX_WideStringC(const CFX_WideString& src)\n{\n    m_Ptr = (FX_LPCWSTR)src;\n    m_Length = src.GetLength();\n}\ninline CFX_WideStringC& CFX_WideStringC::operator = (const CFX_WideString& src)\n{\n    m_Ptr = (FX_LPCWSTR)src;\n    m_Length = src.GetLength();\n    return *this;\n}\n\ninline CFX_WideString operator + (const CFX_WideStringC& str1, const CFX_WideStringC& str2)\n{\n    return CFX_WideString(str1, str2);\n}\ninline CFX_WideString operator + (const CFX_WideStringC& str1, FX_LPCWSTR str2)\n{\n    return CFX_WideString(str1, str2);\n}\ninline CFX_WideString operator + (FX_LPCWSTR str1, const CFX_WideStringC& str2)\n{\n    return CFX_WideString(str1, str2);\n}\ninline CFX_WideString operator + (const CFX_WideStringC& str1, FX_WCHAR ch)\n{\n    return CFX_WideString(str1, CFX_WideStringC(ch));\n}\ninline CFX_WideString operator + (FX_WCHAR ch, const CFX_WideStringC& str2)\n{\n    return CFX_WideString(ch, str2);\n}\ninline CFX_WideString operator + (const CFX_WideString& str1, const CFX_WideString& str2)\n{\n    return CFX_WideString(str1, str2);\n}\ninline CFX_WideString operator + (const CFX_WideString& str1, FX_WCHAR ch)\n{\n    return CFX_WideString(str1, CFX_WideStringC(ch));\n}\ninline CFX_WideString operator + (FX_WCHAR ch, const CFX_WideString& str2)\n{\n    return CFX_WideString(ch, str2);\n}\ninline CFX_WideString operator + (const CFX_WideString& str1, FX_LPCWSTR str2)\n{\n    return CFX_WideString(str1, str2);\n}\ninline CFX_WideString operator + (FX_LPCWSTR str1, const CFX_WideString& str2)\n{\n    return CFX_WideString(str1, str2);\n}\ninline CFX_WideString operator + (const CFX_WideString& str1, const CFX_WideStringC& str2)\n{\n    return CFX_WideString(str1, str2);\n}\ninline CFX_WideString operator + (const CFX_WideStringC& str1, const CFX_WideString& str2)\n{\n    return CFX_WideString(str1, str2);\n}\n\nbool operator==(const CFX_WideString& s1, const CFX_WideString& s2);\nbool operator==(const CFX_WideString& s1, const CFX_WideStringC& s2);\nbool operator==(const CFX_WideStringC& s1, const CFX_WideString& s2);\nbool operator== (const CFX_WideString& s1, FX_LPCWSTR s2);\nbool operator==(FX_LPCWSTR s1, const CFX_WideString& s2);\nbool operator!=(const CFX_WideString& s1, const CFX_WideString& s2);\nbool operator!=(const CFX_WideString& s1, const CFX_WideStringC& s2);\nbool operator!=(const CFX_WideStringC& s1, const CFX_WideString& s2);\nbool operator!= (const CFX_WideString& s1, FX_LPCWSTR s2);\nbool operator!=(FX_LPCWSTR s1, const CFX_WideString& s2);\nFX_FLOAT FX_atof(FX_BSTR str);\nvoid FX_atonum(FX_BSTR str, FX_BOOL& bInteger, void* pData);\nFX_STRSIZE FX_ftoa(FX_FLOAT f, FX_LPSTR buf);\nCFX_ByteString\tFX_UTF8Encode(FX_LPCWSTR pwsStr, FX_STRSIZE len);\ninline CFX_ByteString\tFX_UTF8Encode(FX_WSTR wsStr)\n{\n    return FX_UTF8Encode(wsStr.GetPtr(), wsStr.GetLength());\n}\ninline CFX_ByteString\tFX_UTF8Encode(const CFX_WideString &wsStr)\n{\n    return FX_UTF8Encode((FX_LPCWSTR)wsStr, wsStr.GetLength());\n}\n#endif\n"
  },
  {
    "path": "core/include/fxcrt/fx_system.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_SYSTEM_H_\n#define _FX_SYSTEM_H_\n#define _FX_WIN32_DESKTOP_\t\t1\n#define _FX_LINUX_DESKTOP_\t\t4\n#define _FX_MACOSX_\t\t\t\t7\n#define _FX_ANDROID_\t\t\t12\n#define _FXM_PLATFORM_WINDOWS_\t\t1\n#define _FXM_PLATFORM_LINUX_\t\t2\n#define _FXM_PLATFORM_APPLE_\t\t3\n#define _FXM_PLATFORM_ANDROID_\t\t4\n// Lu Wang\n#define _FX_OS_ _FX_LINUX_DESKTOP_\n#define _FXM_PLATFORM_ _FXM_PLATFORM_LINUX_\n#ifndef _FX_OS_\n#if defined(__ANDROID__)\n#define _FX_OS_ _FX_ANDROID_\n#define _FXM_PLATFORM_ _FXM_PLATFORM_ANDROID_\n#elif defined(_WIN32) || defined(_WIN64)\n#define _FX_OS_ _FX_WIN32_DESKTOP_\n#define _FXM_PLATFORM_ _FXM_PLATFORM_WINDOWS_\n#elif defined(__linux__)\n#define _FX_OS_ _FX_LINUX_DESKTOP_\n#define _FXM_PLATFORM_ _FXM_PLATFORM_LINUX_\n#elif defined(__APPLE__)\n#define _FX_OS_ _FX_MACOSX_\n#define _FXM_PLATFORM_ _FXM_PLATFORM_APPLE_\n#endif\n#endif\n#if !defined(_FX_OS_) || _FX_OS_ == 0\n#error Sorry, can not figure out what OS you are targeting to. Please specify _FX_OS_ macro.\n#endif\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\n#define _CRT_SECURE_NO_WARNINGS\n#include <windows.h>\n#endif\n#define _FX_W32_\t\t1\n#define _FX_W64_\t\t2\n#ifndef _FX_WORDSIZE_\n#if defined(_WIN64) || defined(__arm64) || defined(__arm64__) || defined(_M_AMD64) || defined(_M_X64) || defined(_M_IA64) || defined(__powerpc64__) || defined(__x86_64__) || __WORDSIZE == 64 || defined(__LP64__)\n#define _FX_WORDSIZE_\t_FX_W64_\n#else\n#define _FX_WORDSIZE_\t_FX_W32_\n#endif\n#endif\n#include <stddef.h>\n#include <stdarg.h>\n#include <setjmp.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <assert.h>\n#include <wchar.h>\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_\n#include <libkern/OSAtomic.h>\n#if _FX_OS_ == _FX_MACOSX_\n#include <Carbon/Carbon.h>\n#elif _FX_OS_ == _FX_IOS_\n#include <CoreText/CoreText.h>\n#include <CoreGraphics/CoreGraphics.h>\n#endif\n#endif\n#ifdef __cplusplus\nextern \"C\" {\n#endif\ntypedef void*\t\t\t\t\tFX_LPVOID;\ntypedef void const*\t\t\t\tFX_LPCVOID;\ntypedef void*\t\t\t\t\tFX_POSITION;\ntypedef signed char\t\t\t\tFX_INT8;\ntypedef unsigned char\t\t\tFX_UINT8;\ntypedef unsigned char\t\t\tFX_BYTE;\ntypedef unsigned char*\t\t\tFX_LPBYTE;\ntypedef unsigned char const*\tFX_LPCBYTE;\ntypedef short\t\t\t\t\tFX_INT16;\ntypedef unsigned short\t\t\tFX_UINT16;\ntypedef short\t\t\t\t\tFX_SHORT;\ntypedef unsigned short\t\t\tFX_WORD;\ntypedef unsigned short*\t\t\tFX_LPWORD;\ntypedef unsigned short const*\tFX_LPCWORD;\ntypedef int\t\t\t\t\t\tFX_INT32;\ntypedef float\t\t\t\t\tFX_FLOAT;\ntypedef int\t\t\t\t\t\tFX_BOOL;\ntypedef int\t\t\t\t\t\tFX_ERR;\n#define FX_SUCCEEDED(Status)\t((FX_ERR)(Status) >= 0)\n#define FX_FAILED(Status)\t\t((FX_ERR)(Status) < 0)\ntypedef char\t\t\t\t\tFX_CHAR;\ntypedef char*\t\t\t\t\tFX_LPSTR;\ntypedef char const*\t\t\t\tFX_LPCSTR;\ntypedef unsigned int\t\tFX_DWORD;\ntypedef unsigned int*\t\tFX_LPDWORD;\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\ntypedef __int64\t\t\t\tFX_INT64;\ntypedef unsigned __int64\tFX_UINT64;\n#else\ntypedef long long int\t\tFX_INT64;\ntypedef unsigned long long\tFX_UINT64;\n#endif\n#if _FX_WORDSIZE_ == _FX_W64_\ntypedef FX_INT64\t\t\tFX_INTPTR;\ntypedef FX_UINT64\t\t\tFX_UINTPTR;\n#else\ntypedef int\t\t\t\t\tFX_INTPTR;\ntypedef unsigned int\t\tFX_UINTPTR;\n#endif\ntypedef wchar_t\t\t\t\t\tFX_WCHAR;\ntypedef wchar_t*\t\t\t\tFX_LPWSTR;\ntypedef wchar_t const*\t\t\tFX_LPCWSTR;\ntypedef FX_DWORD\t\t\t\tFX_UINT32;\ntypedef FX_UINT64\t\t\t\tFX_QWORD;\n#define FX_DEFINEHANDLE(name)\ttypedef struct _##name {FX_LPVOID pData;} * name;\n#if defined(DEBUG) && !defined(_DEBUG)\n#define _DEBUG\n#endif\n#ifndef TRUE\n\n#define TRUE\t1\n#endif\n#ifndef FALSE\n\n#define FALSE\t0\n#endif\n#ifndef NULL\n\n#define NULL\t0\n#endif\n#define FXSYS_assert assert\n#ifndef ASSERT\n#ifdef _DEBUG\n#define ASSERT FXSYS_assert\n#else\n\n#define ASSERT(a)\n#endif\n#endif\n#define FX_MAX(a, b) (((a) > (b)) ? (a) : (b))\n#define FX_MIN(a, b) (((a) < (b)) ? (a) : (b))\n#define FX_PI\t3.1415926535897932384626433832795f\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\n#define FXSYS_snprintf\t_snprintf\n#else\n#define FXSYS_snprintf\tsnprintf\n#endif\n#define FXSYS_sprintf\tsprintf\n#define FXSYS_vsprintf\tvsprintf\n#define FXSYS_strchr\tstrchr\n#define FXSYS_strlen\tstrlen\n#define FXSYS_strncmp\tstrncmp\n#define FXSYS_strcmp\tstrcmp\n#define FXSYS_strcpy\tstrcpy\n#define FXSYS_strncpy\tstrncpy\n#define FXSYS_strstr\tstrstr\n#define FXSYS_FILE\t\tFILE\n#define FXSYS_fopen\t\tfopen\n#define FXSYS_fclose\tfclose\n#define FXSYS_SEEK_END\tSEEK_END\n#define FXSYS_SEEK_SET\tSEEK_SET\n#define FXSYS_fseek\t\tfseek\n#define FXSYS_ftell\t\tftell\n#define FXSYS_fread\t\tfread\n#define FXSYS_fwrite\tfwrite\n#define FXSYS_fprintf\tfprintf\n#define FXSYS_fflush\tfflush\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\n#ifdef _NATIVE_WCHAR_T_DEFINED\n#define FXSYS_wfopen(f, m) _wfopen((const wchar_t*)(f), (const wchar_t*)(m))\n#else\n#define FXSYS_wfopen _wfopen\n#endif\n#else\nFXSYS_FILE* FXSYS_wfopen(FX_LPCWSTR filename, FX_LPCWSTR mode);\n#endif\n\n#define FXSYS_wcslen\twcslen\n#define FXSYS_wcscmp\twcscmp\n#define FXSYS_wcschr\twcschr\n#define FXSYS_wcsstr\twcsstr\n#define FXSYS_wcsncmp\twcsncmp\n#define FXSYS_vswprintf\tvswprintf\n#define FXSYS_mbstowcs\tmbstowcs\n#define FXSYS_wcstombs\twcstombs\n#define FXSYS_memcmp\tmemcmp\n#define FXSYS_memcpy\tmemcpy\n#define FXSYS_memmove\tmemmove\n#define FXSYS_memset\tmemset\n#define FXSYS_memchr\tmemchr\n#define FXSYS_qsort\t\tqsort\n#define FXSYS_bsearch\tbsearch\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\n#define FXSYS_GetACP GetACP\n#define FXSYS_itoa _itoa\n#define FXSYS_strlwr _strlwr\n#define FXSYS_strupr _strupr\n#define FXSYS_stricmp _stricmp\n#ifdef _NATIVE_WCHAR_T_DEFINED\n#define FXSYS_wcsicmp(str1, str2) _wcsicmp((wchar_t*)(str1), (wchar_t*)(str2))\n#define FXSYS_WideCharToMultiByte(p1, p2, p3, p4, p5, p6, p7, p8) WideCharToMultiByte(p1, p2, (const wchar_t*)(p3), p4, p5, p6, p7, p8)\n#define FXSYS_MultiByteToWideChar(p1, p2, p3, p4, p5, p6) MultiByteToWideChar(p1, p2, p3, p4, (wchar_t*)(p5), p6)\n#define FXSYS_wcslwr(str) _wcslwr((wchar_t*)(str))\n#define FXSYS_wcsupr(str) _wcsupr((wchar_t*)(str))\n#else\n#define FXSYS_wcsicmp _wcsicmp\n#define FXSYS_WideCharToMultiByte WideCharToMultiByte\n#define FXSYS_MultiByteToWideChar MultiByteToWideChar\n#define FXSYS_wcslwr _wcslwr\n#define FXSYS_wcsupr _wcsupr\n#endif\n#define FXSYS_GetFullPathName GetFullPathName\n#define FXSYS_GetModuleFileName GetModuleFileName\n#else\nint\t\t\tFXSYS_GetACP(void);\nchar*\t\tFXSYS_itoa(int value, char* string, int radix);\nint\t\t\tFXSYS_WideCharToMultiByte(FX_DWORD codepage, FX_DWORD dwFlags, const wchar_t* wstr, int wlen,\n                                      char* buf, int buflen, const char* default_str, int* pUseDefault);\nint\t\t\tFXSYS_MultiByteToWideChar(FX_DWORD codepage, FX_DWORD dwFlags, const char* bstr, int blen,\n                                      wchar_t* buf, int buflen);\nFX_DWORD\tFXSYS_GetFullPathName(const char* filename, FX_DWORD buflen, char* buf, char** filepart);\nFX_DWORD\tFXSYS_GetModuleFileName(void* hModule, char* buf, FX_DWORD bufsize);\nchar*\t\tFXSYS_strlwr(char* str);\nchar*\t\tFXSYS_strupr(char* str);\nint\t\t\tFXSYS_stricmp(const char*, const char*);\nint\t\t\tFXSYS_wcsicmp(const wchar_t *string1, const wchar_t *string2);\nwchar_t*\tFXSYS_wcslwr(wchar_t* str);\nwchar_t*\tFXSYS_wcsupr(wchar_t* str);\n#endif\n#define FXSYS_memcpy32\t\tFXSYS_memcpy\n#define FXSYS_memcmp32\t\tFXSYS_memcmp\n#define FXSYS_memset32\t\tFXSYS_memset\n#define FXSYS_memset8\t\tFXSYS_memset\n#define FXSYS_memmove32\t\tFXSYS_memmove\n#ifdef __cplusplus\n}\n#endif\n#include <math.h>\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\n#define FXSYS_pow(a, b)\t\t(FX_FLOAT)powf(a, b)\n#else\n#define FXSYS_pow(a, b)\t\t(FX_FLOAT)pow(a, b)\n#endif\n#define FXSYS_sqrt(a)\t\t(FX_FLOAT)sqrt(a)\n#define FXSYS_fabs(a)\t\t(FX_FLOAT)fabs(a)\n#define FXSYS_atan2(a, b)\t(FX_FLOAT)atan2(a, b)\n#define FXSYS_ceil(a)\t\t(FX_FLOAT)ceil(a)\n#define FXSYS_floor(a)\t\t(FX_FLOAT)floor(a)\n#define FXSYS_cos(a)\t\t(FX_FLOAT)cos(a)\n#define FXSYS_acos(a)\t\t(FX_FLOAT)acos(a)\n#define FXSYS_sin(a)\t\t(FX_FLOAT)sin(a)\n#define FXSYS_log(a)\t\t(FX_FLOAT)log(a)\n#define FXSYS_log10(a)\t\t(FX_FLOAT)log10(a)\n#define FXSYS_fmod(a, b)\t(FX_FLOAT)fmod(a, b)\n#define FXSYS_abs\t\t\tabs\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n#define _FX_LSB_FIRST_\n#define FXDWORD_FROM_LSBFIRST(i)\t(i)\n#define FXDWORD_FROM_MSBFIRST(i)\t(((FX_BYTE)(i) << 24) | ((FX_BYTE)((i) >> 8) << 16) | ((FX_BYTE)((i) >> 16) << 8) | (FX_BYTE)((i) >> 24))\n#define FXDWORD_GET_LSBFIRST(p)\t\t((((FX_LPBYTE)(p))[3] << 24) | (((FX_LPBYTE)(p))[2] << 16) | (((FX_LPBYTE)(p))[1] << 8) | (((FX_LPBYTE)(p))[0]))\n#define FXDWORD_GET_MSBFIRST(p) ((((FX_LPBYTE)(p))[0] << 24) | (((FX_LPBYTE)(p))[1] << 16) | (((FX_LPBYTE)(p))[2] << 8) | (((FX_LPBYTE)(p))[3]))\n#define FXSYS_HIBYTE(word)\t((FX_BYTE)((word) >> 8))\n#define FXSYS_LOBYTE(word)\t((FX_BYTE)(word))\n#define FXSYS_HIWORD(dword)\t((FX_WORD)((dword) >> 16))\n#define FXSYS_LOWORD(dword)\t((FX_WORD)(dword))\nFX_INT32\tFXSYS_atoi(FX_LPCSTR str);\nFX_INT32\tFXSYS_wtoi(FX_LPCWSTR str);\nFX_INT64\tFXSYS_atoi64(FX_LPCSTR str);\nFX_INT64\tFXSYS_wtoi64(FX_LPCWSTR str);\nFX_LPCSTR\tFXSYS_i64toa(FX_INT64 value, FX_LPSTR str, int radix);\nFX_LPCWSTR\tFXSYS_i64tow(FX_INT64 value, FX_LPWSTR str, int radix);\nint\t\t\tFXSYS_round(FX_FLOAT f);\n#define\t\tFXSYS_Mul(a, b) ((a) * (b))\n#define\t\tFXSYS_Div(a, b) ((a) / (b))\n#define\t\tFXSYS_MulDiv(a, b, c) ((a) * (b) / (c))\n#define\t\tFXSYS_sqrt2(a, b) (FX_FLOAT)FXSYS_sqrt((a)*(a) + (b)*(b))\n#ifdef __cplusplus\n};\n\n#if defined(__clang__) || _MSC_VER >= 1700\n#define FX_FINAL final\n#elif defined(__GNUC__) && __cplusplus >= 201103 && \\\n      (__GNUC__ * 10000 + __GNUC_MINOR__ * 100) >= 40700\n#define FX_FINAL final\n#else\n#define FX_FINAL\n#endif\n#endif\n#endif\n"
  },
  {
    "path": "core/include/fxcrt/fx_ucd.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_UNICODE_\n#define _FX_UNICODE_\nenum FX_CHARBREAKPROP {\n    FX_CBP_OP = 0,\n    FX_CBP_CL = 1,\n    FX_CBP_QU = 2,\n    FX_CBP_GL = 3,\n    FX_CBP_NS = 4,\n    FX_CBP_EX = 5,\n    FX_CBP_SY = 6,\n    FX_CBP_IS = 7,\n    FX_CBP_PR = 8,\n    FX_CBP_PO = 9,\n    FX_CBP_NU = 10,\n    FX_CBP_AL = 11,\n    FX_CBP_ID = 12,\n    FX_CBP_IN = 13,\n    FX_CBP_HY = 14,\n    FX_CBP_BA = 15,\n    FX_CBP_BB = 16,\n    FX_CBP_B2 = 17,\n    FX_CBP_ZW = 18,\n    FX_CBP_CM = 19,\n    FX_CBP_WJ = 20,\n    FX_CBP_H2 = 21,\n    FX_CBP_H3 = 22,\n    FX_CBP_JL = 23,\n    FX_CBP_JV = 24,\n    FX_CBP_JT = 25,\n\n    FX_CBP_BK = 26,\n    FX_CBP_CR = 27,\n    FX_CBP_LF = 28,\n    FX_CBP_NL = 29,\n    FX_CBP_SA = 30,\n    FX_CBP_SG = 31,\n    FX_CBP_CB = 32,\n    FX_CBP_XX = 33,\n    FX_CBP_AI = 34,\n    FX_CBP_SP = 35,\n    FX_CBP_TB = 37,\n    FX_CBP_NONE = 36,\n};\n#define FX_BIDICLASSBITS\t\t6\n#define FX_BIDICLASSBITSMASK\t(31 << FX_BIDICLASSBITS)\nenum FX_BIDICLASS {\n    FX_BIDICLASS_ON\t\t= 0,\n    FX_BIDICLASS_L\t\t= 1,\n    FX_BIDICLASS_R\t\t= 2,\n    FX_BIDICLASS_AN\t\t= 3,\n    FX_BIDICLASS_EN\t\t= 4,\n    FX_BIDICLASS_AL\t\t= 5,\n    FX_BIDICLASS_NSM\t= 6,\n    FX_BIDICLASS_CS\t\t= 7,\n    FX_BIDICLASS_ES\t\t= 8,\n    FX_BIDICLASS_ET\t\t= 9,\n    FX_BIDICLASS_BN\t\t= 10,\n    FX_BIDICLASS_S\t\t= 11,\n    FX_BIDICLASS_WS\t\t= 12,\n    FX_BIDICLASS_B\t\t= 13,\n    FX_BIDICLASS_RLO\t= 14,\n    FX_BIDICLASS_RLE\t= 15,\n    FX_BIDICLASS_LRO\t= 16,\n    FX_BIDICLASS_LRE\t= 17,\n    FX_BIDICLASS_PDF\t= 18,\n    FX_BIDICLASS_N\t\t= FX_BIDICLASS_ON,\n};\n#define FX_CHARTYPEBITS\t\t11\n#define FX_CHARTYPEBITSMASK\t(15 << FX_CHARTYPEBITS)\nenum FX_CHARTYPE {\n    FX_CHARTYPE_Unknown\t\t\t\t= 0,\n    FX_CHARTYPE_Tab\t\t\t\t\t= (1 << FX_CHARTYPEBITS),\n    FX_CHARTYPE_Space\t\t\t\t= (2 << FX_CHARTYPEBITS),\n    FX_CHARTYPE_Control\t\t\t\t= (3 << FX_CHARTYPEBITS),\n    FX_CHARTYPE_Combination\t\t\t= (4 << FX_CHARTYPEBITS),\n    FX_CHARTYPE_Numeric\t\t\t\t= (5 << FX_CHARTYPEBITS),\n    FX_CHARTYPE_Normal\t\t\t\t= (6 << FX_CHARTYPEBITS),\n    FX_CHARTYPE_ArabicAlef\t\t\t= (7 << FX_CHARTYPEBITS),\n    FX_CHARTYPE_ArabicSpecial\t\t= (8 << FX_CHARTYPEBITS),\n    FX_CHARTYPE_ArabicDistortion\t= (9 << FX_CHARTYPEBITS),\n    FX_CHARTYPE_ArabicNormal\t\t= (10 << FX_CHARTYPEBITS),\n    FX_CHARTYPE_ArabicForm\t\t\t= (11 << FX_CHARTYPEBITS),\n    FX_CHARTYPE_Arabic\t\t\t\t= (12 << FX_CHARTYPEBITS),\n};\nFX_DWORD FX_GetUnicodeProperties(FX_WCHAR wch);\nFX_BOOL\tFX_IsCtrlCode(FX_WCHAR ch);\nFX_BOOL\tFX_IsRotationCode(FX_WCHAR ch);\nFX_BOOL FX_IsCombinationChar(FX_WCHAR wch);\nFX_BOOL\tFX_IsBidiChar(FX_WCHAR wch);\nFX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, FX_BOOL bRTL, FX_BOOL bVertical);\nFX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, FX_DWORD dwProps, FX_BOOL bRTL, FX_BOOL bVertical);\n#endif\n"
  },
  {
    "path": "core/include/fxcrt/fx_xml.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_XML_H_\n#define _FX_XML_H_\n#ifndef _FX_BASIC_H_\n#include \"fx_basic.h\"\n#endif\nclass CXML_AttrItem : public CFX_Object\n{\npublic:\n    CFX_ByteString\tm_QSpaceName;\n    CFX_ByteString\tm_AttrName;\n    CFX_WideString\tm_Value;\n};\nclass CXML_AttrMap : public CFX_Object\n{\npublic:\n    CXML_AttrMap()\n    {\n        m_pMap = NULL;\n    }\n    ~CXML_AttrMap()\n    {\n        RemoveAll();\n    }\n    const CFX_WideString*\tLookup(FX_BSTR space, FX_BSTR name) const;\n    void\t\t\t\t\tSetAt(FX_BSTR space, FX_BSTR name, FX_WSTR value);\n    void\t\t\t\t\tRemoveAt(FX_BSTR space, FX_BSTR name);\n    void\t\t\t\t\tRemoveAll();\n    int\t\t\t\t\t\tGetSize() const;\n    CXML_AttrItem&\t\t\tGetAt(int index) const;\n    CFX_ObjectArray<CXML_AttrItem>*\tm_pMap;\n};\nclass CXML_Content : public CFX_Object\n{\npublic:\n    CXML_Content() : m_bCDATA(FALSE), m_Content() {}\n    void\tSet(FX_BOOL bCDATA, FX_WSTR content)\n    {\n        m_bCDATA = bCDATA;\n        m_Content = content;\n    }\n    FX_BOOL\t\t\tm_bCDATA;\n    CFX_WideString\tm_Content;\n};\nclass CXML_Element : public CFX_Object\n{\npublic:\n    static CXML_Element*\tParse(const void* pBuffer, size_t size, FX_BOOL bSaveSpaceChars = FALSE, FX_FILESIZE* pParsedSize = NULL);\n    static CXML_Element*\tParse(IFX_FileRead *pFile, FX_BOOL bSaveSpaceChars = FALSE, FX_FILESIZE* pParsedSize = NULL);\n    static CXML_Element*\tParse(IFX_BufferRead *pBuffer, FX_BOOL bSaveSpaceChars = FALSE, FX_FILESIZE* pParsedSize = NULL);\n    CXML_Element(FX_BSTR qSpace, FX_BSTR tagName);\n    CXML_Element(FX_BSTR qTagName);\n    CXML_Element();\n\n    ~CXML_Element();\n\n    void\tEmpty();\n\n\n\n    CFX_ByteString\t\t\tGetTagName(FX_BOOL bQualified = FALSE) const;\n\n    CFX_ByteString\t\t\tGetNamespace(FX_BOOL bQualified = FALSE) const;\n\n    CFX_ByteString\t\t\tGetNamespaceURI(FX_BSTR qName) const;\n\n    CXML_Element*\t\t\tGetParent() const\n    {\n        return m_pParent;\n    }\n\n    FX_DWORD\t\t\t\tCountAttrs() const\n    {\n        return m_AttrMap.GetSize();\n    }\n\n    void\t\t\t\t\tGetAttrByIndex(int index, CFX_ByteString &space, CFX_ByteString &name, CFX_WideString &value) const;\n\n    FX_BOOL\t\t\t\t\tHasAttr(FX_BSTR qName) const;\n\n    FX_BOOL\t\t\t\t\tGetAttrValue(FX_BSTR name, CFX_WideString& attribute) const;\n    CFX_WideString\t\t\tGetAttrValue(FX_BSTR name) const\n    {\n        CFX_WideString attr;\n        GetAttrValue(name, attr);\n        return attr;\n    }\n\n    FX_BOOL\t\t\t\t\tGetAttrValue(FX_BSTR space, FX_BSTR name, CFX_WideString& attribute) const;\n    CFX_WideString\t\t\tGetAttrValue(FX_BSTR space, FX_BSTR name) const\n    {\n        CFX_WideString attr;\n        GetAttrValue(space, name, attr);\n        return attr;\n    }\n\n    FX_BOOL\t\t\t\t\tGetAttrInteger(FX_BSTR name, int& attribute) const;\n    int\t\t\t\t\t\tGetAttrInteger(FX_BSTR name) const\n    {\n        int attr = 0;\n        GetAttrInteger(name, attr);\n        return attr;\n    }\n\n    FX_BOOL\t\t\t\t\tGetAttrInteger(FX_BSTR space, FX_BSTR name, int& attribute) const;\n    int\t\t\t\t\t\tGetAttrInteger(FX_BSTR space, FX_BSTR name) const\n    {\n        int attr = 0;\n        GetAttrInteger(space, name, attr);\n        return attr;\n    }\n\n    FX_BOOL\t\t\t\t\tGetAttrFloat(FX_BSTR name, FX_FLOAT& attribute) const;\n    FX_FLOAT\t\t\t\tGetAttrFloat(FX_BSTR name) const\n    {\n        FX_FLOAT attr = 0;\n        GetAttrFloat(name, attr);\n        return attr;\n    }\n\n    FX_BOOL\t\t\t\t\tGetAttrFloat(FX_BSTR space, FX_BSTR name, FX_FLOAT& attribute) const;\n    FX_FLOAT\t\t\t\tGetAttrFloat(FX_BSTR space, FX_BSTR name) const\n    {\n        FX_FLOAT attr = 0;\n        GetAttrFloat(space, name, attr);\n        return attr;\n    }\n\n    FX_DWORD\t\t\t\tCountChildren() const;\n\n    enum ChildType { Invalid, Element, Content};\n\n    ChildType\t\t\t\tGetChildType(FX_DWORD index) const;\n\n    CFX_WideString\t\t\tGetContent(FX_DWORD index) const;\n\n    CXML_Element*\t\t\tGetElement(FX_DWORD index) const;\n\n    CXML_Element*\t\t\tGetElement(FX_BSTR space, FX_BSTR tag) const\n    {\n        return GetElement(space, tag, 0);\n    }\n\n    FX_DWORD\t\t\t\tCountElements(FX_BSTR space, FX_BSTR tag) const;\n\n    CXML_Element*\t\t\tGetElement(FX_BSTR space, FX_BSTR tag, int index) const;\n\n    FX_DWORD\t\t\t\tFindElement(CXML_Element *pChild) const;\n\n\n\n\n    void\t\t\t\t\tSetTag(FX_BSTR qSpace, FX_BSTR tagname);\n\n    void\t\t\t\t\tSetTag(FX_BSTR qTagName);\n\n    void\t\t\t\t\tRemoveChildren();\n\n    void\t\t\t\t\tRemoveChild(FX_DWORD index);\n\n\nprotected:\n\n    CXML_Element*\t\t\tm_pParent;\n    CFX_ByteString\t\t\tm_QSpaceName;\n    CFX_ByteString\t\t\tm_TagName;\n\n    CXML_AttrMap\t\t\tm_AttrMap;\n\n    CFX_PtrArray\t\t\tm_Children;\n    friend class CXML_Parser;\n    friend class CXML_Composer;\n};\n#endif\n"
  },
  {
    "path": "core/include/fxge/fpf.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_PALTFORM_DEVICE_H_\n#define _FX_PALTFORM_DEVICE_H_\nclass IFPF_DeviceModule;\nclass IFPF_FontMgr;\nclass IFPF_Font;\nclass IFPF_DeviceModule\n{\npublic:\n    virtual void\t\t\t\tDestroy() = 0;\n    virtual IFPF_FontMgr*\t\tGetFontMgr() = 0;\n};\nIFPF_DeviceModule*\tFPF_GetDeviceModule();\n#define FPF_MATCHFONT_REPLACEANSI\t\t1\nFX_DEFINEHANDLE(FPF_HFONT);\nclass IFPF_Font\n{\npublic:\n    virtual void\t\t\tRelease() = 0;\n    virtual IFPF_Font*\t\tRetain() = 0;\n    virtual FPF_HFONT\t\tGetHandle() = 0;\n    virtual CFX_ByteString\tGetFamilyName() = 0;\n    virtual CFX_WideString\tGetPsName() = 0;\n    virtual FX_DWORD\t\tGetFontStyle() const = 0;\n    virtual FX_BYTE\t\t\tGetCharset() const = 0;\n\n    virtual FX_INT32\t\tGetGlyphIndex(FX_WCHAR wUnicode) = 0;\n    virtual FX_INT32\t\tGetGlyphWidth(FX_INT32 iGlyphIndex) = 0;\n\n    virtual FX_INT32\t\tGetAscent() const = 0;\n    virtual FX_INT32\t\tGetDescent() const = 0;\n\n    virtual FX_BOOL\t\t\tGetGlyphBBox(FX_INT32 iGlyphIndex, FX_RECT &rtBBox) = 0;\n    virtual FX_BOOL\t\t\tGetBBox(FX_RECT &rtBBox) = 0;\n\n    virtual FX_INT32\t\tGetHeight() const = 0;\n    virtual FX_INT32\t\tGetItalicAngle() const = 0;\n    virtual FX_DWORD\t\tGetFontData(FX_DWORD dwTable, FX_LPBYTE pBuffer, FX_DWORD dwSize) = 0;\n};\nclass IFPF_FontMgr\n{\npublic:\n    virtual void\t\t\tLoadSystemFonts() = 0;\n    virtual void\t\t\tLoadPrivateFont(IFX_FileRead* pFontFile) = 0;\n    virtual void\t\t\tLoadPrivateFont(FX_BSTR bsFileName) = 0;\n    virtual void\t\t\tLoadPrivateFont(FX_LPVOID pBuffer, size_t szBuffer) = 0;\n\n    virtual IFPF_Font*\t\tCreateFont(FX_BSTR bsFamilyname, FX_BYTE charset, FX_DWORD dwStyle, FX_DWORD dwMatch = 0) = 0;\n};\n#endif\n"
  },
  {
    "path": "core/include/fxge/fx_dib.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDF_DIB_H_\n#define _FPDF_DIB_H_\n#ifndef _FXCRT_EXTENSION_\n#include \"../fxcrt/fx_ext.h\"\n#endif\nenum FXDIB_Format {\n    FXDIB_Invalid = 0,\n    FXDIB_1bppMask = 0x101,\n    FXDIB_1bppRgb = 0x001,\n    FXDIB_1bppCmyk = 0x401,\n    FXDIB_8bppMask = 0x108,\n    FXDIB_8bppRgb = 0x008,\n    FXDIB_8bppRgba = 0x208,\n    FXDIB_8bppCmyk = 0x408,\n    FXDIB_8bppCmyka = 0x608,\n    FXDIB_Rgb = 0x018,\n    FXDIB_Rgba = 0x218,\n    FXDIB_Rgb32 = 0x020,\n    FXDIB_Argb = 0x220,\n    FXDIB_Cmyk = 0x420,\n    FXDIB_Cmyka = 0x620,\n};\nenum FXDIB_Channel {\n    FXDIB_Red = 1,\n    FXDIB_Green,\n    FXDIB_Blue,\n    FXDIB_Cyan,\n    FXDIB_Magenta,\n    FXDIB_Yellow,\n    FXDIB_Black,\n    FXDIB_Alpha\n};\n#define FXDIB_DOWNSAMPLE\t\t0x04\n#define FXDIB_INTERPOL\t\t\t0x20\n#define FXDIB_BICUBIC_INTERPOL  0x80\n#define FXDIB_NOSMOOTH\t\t\t0x100\n#define FXDIB_PALETTE_LOC\t\t0x01\n#define FXDIB_PALETTE_WIN\t\t0x02\n#define FXDIB_PALETTE_MAC\t\t0x04\n#define FXDIB_BLEND_NORMAL\t\t\t0\n#define FXDIB_BLEND_MULTIPLY\t\t1\n#define FXDIB_BLEND_SCREEN\t\t\t2\n#define FXDIB_BLEND_OVERLAY\t\t\t3\n#define FXDIB_BLEND_DARKEN\t\t\t4\n#define FXDIB_BLEND_LIGHTEN\t\t\t5\n\n#define FXDIB_BLEND_COLORDODGE\t\t6\n#define FXDIB_BLEND_COLORBURN\t\t7\n#define FXDIB_BLEND_HARDLIGHT\t\t8\n#define FXDIB_BLEND_SOFTLIGHT\t\t9\n#define FXDIB_BLEND_DIFFERENCE\t\t10\n#define FXDIB_BLEND_EXCLUSION\t\t11\n#define FXDIB_BLEND_NONSEPARABLE\t21\n#define FXDIB_BLEND_HUE\t\t\t\t21\n#define FXDIB_BLEND_SATURATION\t\t22\n#define FXDIB_BLEND_COLOR\t\t\t23\n#define FXDIB_BLEND_LUMINOSITY\t\t24\n#define FXDIB_BLEND_UNSUPPORTED\t\t-1\ntypedef FX_DWORD\tFX_ARGB;\ntypedef FX_DWORD\tFX_COLORREF;\ntypedef FX_DWORD\tFX_CMYK;\nclass CFX_ClipRgn;\nclass CFX_DIBSource;\nclass CFX_DIBitmap;\n#define FXSYS_RGB(r, g, b)  ((r) | ((g) << 8) | ((b) << 16))\n#define FXSYS_GetRValue(rgb) ((rgb) & 0xff)\n#define FXSYS_GetGValue(rgb) (((rgb) >> 8) & 0xff)\n#define FXSYS_GetBValue(rgb) (((rgb) >> 16) & 0xff)\n#define FX_CCOLOR(val) (255-(val))\n#define FXSYS_CMYK(c, m, y, k) (((c) << 24) | ((m) << 16) | ((y) << 8) | (k))\n#define FXSYS_GetCValue(cmyk) ((FX_BYTE)((cmyk) >> 24) & 0xff)\n#define FXSYS_GetMValue(cmyk) ((FX_BYTE)((cmyk) >> 16) & 0xff)\n#define FXSYS_GetYValue(cmyk) ((FX_BYTE)((cmyk) >> 8) & 0xff)\n#define FXSYS_GetKValue(cmyk) ((FX_BYTE)(cmyk) & 0xff)\nvoid CmykDecode(FX_CMYK cmyk, int& c, int& m, int& y, int& k);\ninline FX_CMYK CmykEncode(int c, int m, int y, int k)\n{\n    return (c << 24) | (m << 16) | (y << 8) | k;\n}\nvoid ArgbDecode(FX_ARGB argb, int& a, int& r, int&g, int& b);\nvoid ArgbDecode(FX_ARGB argb, int& a, FX_COLORREF& rgb);\ninline FX_ARGB ArgbEncode(int a, int r, int g, int b)\n{\n    return (a << 24) | (r << 16) | (g << 8) | b;\n}\nFX_ARGB ArgbEncode(int a, FX_COLORREF rgb);\n#define FXARGB_A(argb) ((FX_BYTE)((argb) >> 24))\n#define FXARGB_R(argb) ((FX_BYTE)((argb) >> 16))\n#define FXARGB_G(argb) ((FX_BYTE)((argb) >> 8))\n#define FXARGB_B(argb) ((FX_BYTE)(argb))\n#define FXARGB_MAKE(a,r,g,b) (((FX_DWORD)(a) << 24) | ((r) << 16) | ((g) << 8) | (b))\n#define FXARGB_MUL_ALPHA(argb, alpha) (((((argb) >> 24) * (alpha) / 255) << 24) | ((argb) & 0xffffff))\n#define FXRGB2GRAY(r,g,b) (((b) * 11 + (g) * 59 + (r) * 30) / 100)\n#define FXCMYK2GRAY(c,m,y,k) (((255-(c)) * (255-(k)) * 30 + (255-(m)) * (255-(k)) * 59 + (255-(y)) * (255-(k)) * 11) / 25500)\n#define FXDIB_ALPHA_MERGE(backdrop, source, source_alpha) (((backdrop) * (255-(source_alpha)) + (source)*(source_alpha))/255)\n#define FXDIB_ALPHA_UNION(dest, src) ((dest) + (src) - (dest)*(src)/255)\n#define FXCMYK_GETDIB(p) ((((FX_LPBYTE)(p))[0] << 24 | (((FX_LPBYTE)(p))[1] << 16) | (((FX_LPBYTE)(p))[2] << 8) | ((FX_LPBYTE)(p))[3]))\n#define FXCMYK_SETDIB(p, cmyk)  ((FX_LPBYTE)(p))[0] = (FX_BYTE)((cmyk) >> 24), \\\n        ((FX_LPBYTE)(p))[1] = (FX_BYTE)((cmyk) >> 16), \\\n                              ((FX_LPBYTE)(p))[2] = (FX_BYTE)((cmyk) >> 8), \\\n                                      ((FX_LPBYTE)(p))[3] = (FX_BYTE)(cmyk))\n#define FXARGB_GETDIB(p) (((FX_LPBYTE)(p))[0]) | (((FX_LPBYTE)(p))[1] << 8) | (((FX_LPBYTE)(p))[2] << 16) | (((FX_LPBYTE)(p))[3] << 24)\n#define FXARGB_SETDIB(p, argb) ((FX_LPBYTE)(p))[0] = (FX_BYTE)(argb), \\\n        ((FX_LPBYTE)(p))[1] = (FX_BYTE)((argb) >> 8), \\\n                              ((FX_LPBYTE)(p))[2] = (FX_BYTE)((argb) >> 16), \\\n                                      ((FX_LPBYTE)(p))[3] = (FX_BYTE)((argb) >> 24)\n#define FXARGB_COPY(dest, src) *(FX_LPBYTE)(dest) = *(FX_LPBYTE)(src), \\\n        *((FX_LPBYTE)(dest)+1) = *((FX_LPBYTE)(src)+1), \\\n                                 *((FX_LPBYTE)(dest)+2) = *((FX_LPBYTE)(src)+2), \\\n                                         *((FX_LPBYTE)(dest)+3) = *((FX_LPBYTE)(src)+3)\n#define FXCMYK_COPY(dest, src)  *(FX_LPBYTE)(dest) = *(FX_LPBYTE)(src), \\\n        *((FX_LPBYTE)(dest)+1) = *((FX_LPBYTE)(src)+1), \\\n                                 *((FX_LPBYTE)(dest)+2) = *((FX_LPBYTE)(src)+2), \\\n                                         *((FX_LPBYTE)(dest)+3) = *((FX_LPBYTE)(src)+3)\n#define FXARGB_SETRGBORDERDIB(p, argb) ((FX_LPBYTE)(p))[3] = (FX_BYTE)(argb>>24), \\\n        ((FX_LPBYTE)(p))[0] = (FX_BYTE)((argb) >> 16), \\\n                              ((FX_LPBYTE)(p))[1] = (FX_BYTE)((argb) >> 8), \\\n                                      ((FX_LPBYTE)(p))[2] = (FX_BYTE)(argb)\n#define FXARGB_GETRGBORDERDIB(p) (((FX_LPBYTE)(p))[2]) | (((FX_LPBYTE)(p))[1] << 8) | (((FX_LPBYTE)(p))[0] << 16) | (((FX_LPBYTE)(p))[3] << 24)\n#define FXARGB_RGBORDERCOPY(dest, src) *((FX_LPBYTE)(dest)+3) = *((FX_LPBYTE)(src)+3), \\\n        *(FX_LPBYTE)(dest) = *((FX_LPBYTE)(src)+2), \\\n                             *((FX_LPBYTE)(dest)+1) = *((FX_LPBYTE)(src)+1), \\\n                                     *((FX_LPBYTE)(dest)+2) = *((FX_LPBYTE)(src))\n#define FXARGB_TODIB(argb) (argb)\n#define FXCMYK_TODIB(cmyk) ((FX_BYTE)((cmyk) >> 24) | ((FX_BYTE)((cmyk) >> 16)) << 8 | ((FX_BYTE)((cmyk) >> 8)) << 16 | ((FX_BYTE)(cmyk) << 24))\n#define FXARGB_TOBGRORDERDIB(argb) ((FX_BYTE)(argb>>16) | ((FX_BYTE)(argb>>8)) << 8 | ((FX_BYTE)(argb)) << 16 | ((FX_BYTE)(argb>>24) << 24))\n#define FXGETFLAG_COLORTYPE(flag)\t\t\t(FX_BYTE)((flag)>>8)\n#define FXGETFLAG_ALPHA_FILL(flag)\t\t\t(FX_BYTE)(flag)\n#define FXGETFLAG_ALPHA_STROKE(flag)\t\t(FX_BYTE)((flag)>>16)\n#define FXSETFLAG_COLORTYPE(flag, val)\t\tflag = (((val)<<8)|(flag&0xffff00ff))\n#define FXSETFLAG_ALPHA_FILL(flag, val)\t\tflag = ((val)|(flag&0xffffff00))\n#define FXSETFLAG_ALPHA_STROKE(flag, val)\tflag = (((val)<<16)|(flag&0xff00ffff))\nclass CFX_DIBSource : public CFX_Object\n{\npublic:\n\n    virtual\t\t\t~CFX_DIBSource();\n\n\n\n    int\t\t\t\tGetWidth() const\n    {\n        return m_Width;\n    }\n\n    int\t\t\t\tGetHeight() const\n    {\n        return m_Height;\n    }\n\n    FXDIB_Format\tGetFormat() const\n    {\n        return (FXDIB_Format)(m_AlphaFlag * 0x100 + m_bpp);\n    }\n\n    FX_DWORD\t\tGetPitch() const\n    {\n        return m_Pitch;\n    }\n\n    FX_DWORD*\t\tGetPalette() const\n    {\n        return m_pPalette;\n    }\n\n\n\n    virtual\tFX_LPBYTE\tGetBuffer() const\n    {\n        return NULL;\n    }\n\n    virtual FX_LPCBYTE\tGetScanline(int line) const = 0;\n\n    virtual FX_BOOL\t\tSkipToScanline(int line, IFX_Pause* pPause) const\n    {\n        return FALSE;\n    }\n\n    virtual void\t\tDownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,\n                                           int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const = 0;\n\n    virtual void\t\tSetDownSampleSize(int width, int height) const {}\n\n    int\t\t\t\tGetBPP() const\n    {\n        return m_bpp;\n    }\n\n    FX_BOOL\t\t\tIsAlphaMask() const\n    {\n        return m_AlphaFlag == 1;\n    }\n\n    FX_BOOL\t\t\tHasAlpha() const\n    {\n        return m_AlphaFlag & 2 ? TRUE : FALSE;\n    }\n\n    FX_BOOL\t\t\tIsOpaqueImage() const\n    {\n        return !(m_AlphaFlag & 3);\n    }\n\n    FX_BOOL\t\t\tIsCmykImage() const\n    {\n        return m_AlphaFlag & 4 ? TRUE : FALSE;\n    }\n\n\n\n    int\t\t\t\tGetPaletteSize() const\n    {\n        return IsAlphaMask() ? 0 : (m_bpp == 1 ? 2 : (m_bpp == 8 ? 256 : 0));\n    }\n\n    FX_DWORD\t\tGetPaletteEntry(int index) const;\n\n    void\t\t\tSetPaletteEntry(int index, FX_DWORD color);\n    FX_DWORD\t\tGetPaletteArgb(int index) const\n    {\n        return GetPaletteEntry(index);\n    }\n    void\t\t\tSetPaletteArgb(int index, FX_DWORD color)\n    {\n        SetPaletteEntry(index, color);\n    }\n\n    void\t\t\tCopyPalette(const FX_DWORD* pSrcPal, FX_DWORD size = 256);\n\n\n    CFX_DIBitmap*\tClone(const FX_RECT* pClip = NULL) const;\n\n    CFX_DIBitmap*\tCloneConvert(FXDIB_Format format, const FX_RECT* pClip = NULL, void* pIccTransform = NULL) const;\n\n    CFX_DIBitmap*\tStretchTo(int dest_width, int dest_height, FX_DWORD flags = 0, const FX_RECT* pClip = NULL) const;\n\n\n    CFX_DIBitmap*\tTransformTo(const CFX_AffineMatrix* pMatrix, int& left, int &top,\n                                FX_DWORD flags = 0, const FX_RECT* pClip = NULL) const;\n\n    CFX_DIBitmap*\tGetAlphaMask(const FX_RECT* pClip = NULL) const;\n\n    FX_BOOL\t\t\tCopyAlphaMask(const CFX_DIBSource* pAlphaMask, const FX_RECT* pClip = NULL);\n\n    CFX_DIBitmap*\tSwapXY(FX_BOOL bXFlip, FX_BOOL bYFlip, const FX_RECT* pClip = NULL) const;\n\n    CFX_DIBitmap*\tFlipImage(FX_BOOL bXFlip, FX_BOOL bYFlip) const;\n\n    void\t\t\tGetOverlapRect(int& dest_left, int& dest_top, int& width, int& height, int src_width,\n                                   int src_height, int& src_left, int& src_top, const CFX_ClipRgn* pClipRgn);\n\n    CFX_DIBitmap*\tm_pAlphaMask;\nprotected:\n\n    CFX_DIBSource();\n\n    int\t\t\t\tm_Width;\n\n    int\t\t\t\tm_Height;\n\n    int\t\t\t\tm_bpp;\n\n    FX_DWORD\t\tm_AlphaFlag;\n\n    FX_DWORD\t\tm_Pitch;\n\n    FX_DWORD*\t\tm_pPalette;\n\n    void\t\t\tBuildPalette();\n\n    FX_BOOL\t\t\tBuildAlphaMask();\n\n    int\t\t\t\tFindPalette(FX_DWORD color) const;\n\n    void\t\t\tGetPalette(FX_DWORD* pal, int alpha) const;\n};\nclass CFX_DIBitmap : public CFX_DIBSource\n{\npublic:\n\n    virtual ~CFX_DIBitmap();\n\n    CFX_DIBitmap();\n\n    CFX_DIBitmap(const CFX_DIBitmap& src);\n\n    FX_BOOL\t\t\tCreate(int width, int height, FXDIB_Format format, FX_LPBYTE pBuffer = NULL, int pitch = 0);\n\n    FX_BOOL\t\t\tCopy(const CFX_DIBSource* pSrc);\n\n    virtual\tFX_LPBYTE\tGetBuffer() const\n    {\n        return m_pBuffer;\n    }\n\n    virtual FX_LPCBYTE\tGetScanline(int line) const\n    {\n        return m_pBuffer ? m_pBuffer + line * m_Pitch : NULL;\n    }\n\n    virtual void\tDownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,\n                                       int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const;\n\n    void\t\t\tTakeOver(CFX_DIBitmap* pSrcBitmap);\n\n    FX_BOOL\t\t\tConvertFormat(FXDIB_Format format, void* pIccTransform = NULL);\n\n    void\t\t\tClear(FX_DWORD color);\n\n    FX_DWORD\t\tGetPixel(int x, int y) const;\n\n    void\t\t\tSetPixel(int x, int y, FX_DWORD color);\n\n    FX_BOOL\t\t\tLoadChannel(FXDIB_Channel destChannel, const CFX_DIBSource* pSrcBitmap, FXDIB_Channel srcChannel);\n\n    FX_BOOL\t\t\tLoadChannel(FXDIB_Channel destChannel, int value);\n\n    FX_BOOL\t\t\tMultiplyAlpha(int alpha);\n\n    FX_BOOL\t\t\tMultiplyAlpha(const CFX_DIBSource* pAlphaMask);\n\n    FX_BOOL\t\t\tTransferBitmap(int dest_left, int dest_top, int width, int height,\n                                   const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform = NULL);\n\n    FX_BOOL\t\t\tCompositeBitmap(int dest_left, int dest_top, int width, int height,\n                                    const CFX_DIBSource* pSrcBitmap, int src_left, int src_top,\n                                    int blend_type = FXDIB_BLEND_NORMAL, const CFX_ClipRgn* pClipRgn = NULL, FX_BOOL bRgbByteOrder = FALSE, void* pIccTransform = NULL);\n\n    FX_BOOL\t\t\tTransferMask(int dest_left, int dest_top, int width, int height,\n                                 const CFX_DIBSource* pMask, FX_DWORD color, int src_left, int src_top, int alpha_flag = 0, void* pIccTransform = NULL);\n\n    FX_BOOL\t\t\tCompositeMask(int dest_left, int dest_top, int width, int height,\n                                  const CFX_DIBSource* pMask, FX_DWORD color, int src_left, int src_top,\n                                  int blend_type = FXDIB_BLEND_NORMAL, const CFX_ClipRgn* pClipRgn = NULL, FX_BOOL bRgbByteOrder = FALSE, int alpha_flag = 0, void* pIccTransform = NULL);\n\n    FX_BOOL\t\t\tCompositeRect(int dest_left, int dest_top, int width, int height, FX_DWORD color, int alpha_flag = 0, void* pIccTransform = NULL);\n\n    FX_BOOL\t\t\tConvertColorScale(FX_DWORD forecolor, FX_DWORD backcolor);\n\n    FX_BOOL\t\t\tDitherFS(const FX_DWORD* pPalette, int pal_size, const FX_RECT* pRect = NULL);\nprotected:\n\n    FX_LPBYTE\t\tm_pBuffer;\n\n    FX_BOOL\t\t\tm_bExtBuf;\n\n    FX_BOOL\t\t\tGetGrayData(void* pIccTransform = NULL);\n};\nclass CFX_DIBExtractor : public CFX_Object\n{\npublic:\n\n    CFX_DIBExtractor(const CFX_DIBSource* pSrc);\n\n    ~CFX_DIBExtractor();\n\n    operator CFX_DIBitmap*()\n    {\n        return m_pBitmap;\n    }\nprivate:\n\n    CFX_DIBitmap*\t\t\tm_pBitmap;\n};\ntypedef CFX_CountRef<CFX_DIBitmap> CFX_DIBitmapRef;\nclass CFX_FilteredDIB : public CFX_DIBSource\n{\npublic:\n\n    CFX_FilteredDIB();\n\n    ~CFX_FilteredDIB();\n\n    void\t\t\t\t\tLoadSrc(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc = FALSE);\n\n    virtual FXDIB_Format\tGetDestFormat() = 0;\n\n    virtual FX_DWORD*\t\tGetDestPalette() = 0;\n\n\n    virtual void\t\t\tTranslateScanline(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf) const = 0;\n\n    virtual void\t\t\tTranslateDownSamples(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels, int Bpp) const = 0;\nprotected:\n    virtual FX_LPCBYTE\t\tGetScanline(int line) const;\n    virtual void\t\t\tDownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,\n            int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const;\n\n    const CFX_DIBSource*\tm_pSrc;\n\n    FX_BOOL\t\t\t\t\tm_bAutoDropSrc;\n\n    FX_LPBYTE\t\t\t\tm_pScanline;\n};\nclass IFX_ScanlineComposer\n{\npublic:\n\n    virtual\tvoid\t\tComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha = NULL) = 0;\n\n\n    virtual FX_BOOL\t\tSetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette) = 0;\n};\nclass CFX_ScanlineCompositor : public CFX_Object\n{\npublic:\n\n    CFX_ScanlineCompositor();\n\n    ~CFX_ScanlineCompositor();\n\n    FX_BOOL\t\t\t\tInit(FXDIB_Format dest_format, FXDIB_Format src_format, FX_INT32 width, FX_DWORD* pSrcPalette,\n                             FX_DWORD mask_color, int blend_type, FX_BOOL bClip, FX_BOOL bRgbByteOrder = FALSE, int alpha_flag = 0, void* pIccTransform = NULL);\n\n\n    void\t\t\t\tCompositeRgbBitmapLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan,\n            FX_LPCBYTE src_extra_alpha = NULL, FX_LPBYTE dst_extra_alpha = NULL);\n\n\n    void\t\t\t\tCompositePalBitmapLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width, FX_LPCBYTE clip_scan,\n            FX_LPCBYTE src_extra_alpha = NULL, FX_LPBYTE dst_extra_alpha = NULL);\n\n\n    void\t\t\t\tCompositeByteMaskLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan,\n            FX_LPBYTE dst_extra_alpha = NULL);\n\n\n    void\t\t\t\tCompositeBitMaskLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width, FX_LPCBYTE clip_scan,\n            FX_LPBYTE dst_extra_alpha = NULL);\nprotected:\n    int\t\t\t\t\tm_Transparency;\n    FXDIB_Format\t\tm_SrcFormat,\n                        m_DestFormat;\n    FX_DWORD*\t\t\tm_pSrcPalette;\n\n    int\t\t\t\t\tm_MaskAlpha,\n                        m_MaskRed,\n                        m_MaskGreen,\n                        m_MaskBlue,\n                        m_MaskBlack;\n    int\t\t\t\t\tm_BlendType;\n    void*\t\t\t\tm_pIccTransform;\n    FX_LPBYTE\t\t\tm_pCacheScanline;\n    int\t\t\t\t\tm_CacheSize;\n    FX_BOOL             m_bRgbByteOrder;\n};\nclass CFX_BitmapComposer : public IFX_ScanlineComposer, public CFX_Object\n{\npublic:\n\n    CFX_BitmapComposer();\n\n    ~CFX_BitmapComposer();\n\n\n    void\t\t\t\tCompose(CFX_DIBitmap* pDest, const CFX_ClipRgn* pClipRgn, int bitmap_alpha,\n                                FX_DWORD mask_color, FX_RECT& dest_rect, FX_BOOL bVertical,\n                                FX_BOOL bFlipX, FX_BOOL bFlipY, FX_BOOL bRgbByteOrder = FALSE,\n                                int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);\n\n    virtual FX_BOOL\t\tSetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette);\n\n\n    virtual\tvoid\t\tComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha);\nprotected:\n\n    void\t\t\t\tDoCompose(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int dest_width, FX_LPCBYTE clip_scan,\n                                  FX_LPCBYTE src_extra_alpha = NULL, FX_LPBYTE dst_extra_alpha = NULL);\n    CFX_DIBitmap*\t\tm_pBitmap;\n    const CFX_ClipRgn*\tm_pClipRgn;\n    FXDIB_Format\t\tm_SrcFormat;\n    int\t\t\t\t\tm_DestLeft, m_DestTop, m_DestWidth, m_DestHeight, m_BitmapAlpha;\n    FX_DWORD\t\t\tm_MaskColor;\n    const CFX_DIBitmap*\tm_pClipMask;\n    CFX_ScanlineCompositor\tm_Compositor;\n    FX_BOOL\t\t\t\tm_bVertical, m_bFlipX, m_bFlipY;\n    int\t\t\t\t\tm_AlphaFlag;\n    void*\t\t\t\tm_pIccTransform;\n    FX_BOOL             m_bRgbByteOrder;\n    int\t\t\t\t\tm_BlendType;\n    void\t\t\t\tComposeScanlineV(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha = NULL);\n    FX_LPBYTE\t\t\tm_pScanlineV, m_pClipScanV, m_pAddClipScan, m_pScanlineAlphaV;\n};\nclass CFX_BitmapStorer : public IFX_ScanlineComposer, public CFX_Object\n{\npublic:\n\n    CFX_BitmapStorer();\n\n    ~CFX_BitmapStorer();\n\n    virtual\tvoid\t\tComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha);\n\n    virtual FX_BOOL\t\tSetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette);\n\n    CFX_DIBitmap*\t\tGetBitmap()\n    {\n        return m_pBitmap;\n    }\n\n    CFX_DIBitmap*\t\tDetach();\n\n    void\t\t\t\tReplace(CFX_DIBitmap* pBitmap);\nprivate:\n    CFX_DIBitmap*\t\tm_pBitmap;\n};\nclass CStretchEngine;\nclass CFX_ImageStretcher : public CFX_Object\n{\npublic:\n\n    CFX_ImageStretcher();\n\n    ~CFX_ImageStretcher();\n\n    FX_INT32\t\tStart(IFX_ScanlineComposer* pDest, const CFX_DIBSource* pBitmap,\n                          int dest_width, int dest_height, const FX_RECT& bitmap_rect, FX_DWORD flags);\n\n\n    FX_INT32\t\tContinue(IFX_Pause* pPause);\n    IFX_ScanlineComposer*\tm_pDest;\n    const CFX_DIBSource*\tm_pSource;\n    CStretchEngine*\t\tm_pStretchEngine;\n    FX_DWORD\t\tm_Flags;\n    FX_BOOL\t\t\tm_bFlipX,\n                    m_bFlipY;\n    int\t\t\t\tm_DestWidth,\n                    m_DestHeight;\n    FX_RECT\t\t\tm_ClipRect;\n    int\t\t\t\tm_LineIndex;\n    int\t\t\t\tm_DestBPP;\n    FX_LPBYTE\t\tm_pScanline;\n    FX_LPBYTE       m_pMaskScanline;\n    FXDIB_Format\tm_DestFormat;\n    FX_INT32\t\tm_Status;\n\n    FX_INT32\t\tStartQuickStretch();\n\n    FX_INT32\t\tStartStretch();\n\n    FX_INT32\t\tContinueQuickStretch(IFX_Pause* pPause);\n\n    FX_INT32\t\tContinueStretch(IFX_Pause* pPause);\n};\nclass CFX_ImageTransformer : public CFX_Object\n{\npublic:\n\n    CFX_ImageTransformer();\n\n    ~CFX_ImageTransformer();\n\n    FX_INT32\tStart(const CFX_DIBSource* pSrc, const CFX_AffineMatrix* pMatrix, int flags, const FX_RECT* pClip);\n\n\n    FX_INT32\tContinue(IFX_Pause* pPause);\n    CFX_AffineMatrix* m_pMatrix;\n    FX_RECT\t\tm_StretchClip;\n    int\t\t\tm_ResultLeft, m_ResultTop, m_ResultWidth, m_ResultHeight;\n    CFX_AffineMatrix\tm_dest2stretch;\n    CFX_ImageStretcher\tm_Stretcher;\n    CFX_BitmapStorer\tm_Storer;\n    FX_DWORD\tm_Flags;\n    int\t\t\tm_Status;\n};\nclass CFX_ImageRenderer : public CFX_Object\n{\npublic:\n\n    CFX_ImageRenderer();\n\n    ~CFX_ImageRenderer();\n\n    FX_INT32\t\t\tStart(CFX_DIBitmap* pDevice, const CFX_ClipRgn* pClipRgn,\n                              const CFX_DIBSource* pSource, int bitmap_alpha,\n                              FX_DWORD mask_color, const CFX_AffineMatrix* pMatrix, FX_DWORD dib_flags,\n                              FX_BOOL bRgbByteOrder = FALSE, int alpha_flag = 0, void* pIccTransform = NULL,\n                              int blend_type = FXDIB_BLEND_NORMAL);\n\n    FX_INT32\t\t\tContinue(IFX_Pause* pPause);\nprotected:\n    CFX_DIBitmap*\t\tm_pDevice;\n    const CFX_ClipRgn*\tm_pClipRgn;\n    int\t\t\t\t\tm_BitmapAlpha;\n    FX_DWORD\t\t\tm_MaskColor;\n    CFX_AffineMatrix\tm_Matrix;\n    CFX_ImageTransformer*\tm_pTransformer;\n    CFX_ImageStretcher\tm_Stretcher;\n    CFX_BitmapComposer\tm_Composer;\n    int\t\t\t\t\tm_Status;\n    int\t\t\t\t\tm_DestLeft, m_DestTop;\n    FX_RECT\t\t\t\tm_ClipBox;\n    FX_DWORD\t\t\tm_Flags;\n    int\t\t\t\t\tm_AlphaFlag;\n    void*\t\t\t\tm_pIccTransform;\n    FX_BOOL\t\t\t\tm_bRgbByteOrder;\n    int\t\t\t\t\tm_BlendType;\n};\n#endif\n"
  },
  {
    "path": "core/include/fxge/fx_font.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_FONT_H_\n#define _FX_FONT_H_\n#ifndef _FXCRT_EXTENSION_\n#include \"../../include/fxcrt/fx_ext.h\"\n#endif\n#ifndef _FX_DIB_H_\n#include \"fx_dib.h\"\n#endif\ntypedef struct FT_FaceRec_* FXFT_Face;\ntypedef void* FXFT_Library;\nclass IFX_FontEncoding;\nclass CFX_PathData;\nclass CFX_SubstFont;\nclass CFX_FaceCache;\nclass IFX_FontMapper;\nclass CFX_FontMapper;\nclass IFX_SystemFontInfo;\nclass CFontFileFaceInfo;\n#define FXFONT_FIXED_PITCH\t\t0x01\n#define FXFONT_SERIF\t\t\t0x02\n#define FXFONT_SYMBOLIC\t\t\t0x04\n#define FXFONT_SCRIPT\t\t\t0x08\n#define FXFONT_ITALIC\t\t\t0x40\n#define FXFONT_BOLD\t\t\t\t0x40000\n#define FXFONT_USEEXTERNATTR\t0x80000\n#define FXFONT_CIDFONT\t\t\t0x100000\n#define FXFONT_ANSI_CHARSET\t\t0\n#define FXFONT_DEFAULT_CHARSET\t1\n#define FXFONT_SYMBOL_CHARSET\t2\n#define FXFONT_SHIFTJIS_CHARSET\t128\n#define FXFONT_HANGEUL_CHARSET\t129\n#define FXFONT_GB2312_CHARSET\t134\n#define FXFONT_CHINESEBIG5_CHARSET\t136\n#define FXFONT_THAI_CHARSET\t\t222\n#define FXFONT_EASTEUROPE_CHARSET\t238\n#define FXFONT_RUSSIAN_CHARSET\t204\n#define FXFONT_GREEK_CHARSET\t161\n#define FXFONT_TURKISH_CHARSET\t162\n#define FXFONT_HEBREW_CHARSET\t177\n#define FXFONT_ARABIC_CHARSET\t178\n#define FXFONT_BALTIC_CHARSET\t186\n#define FXFONT_FF_FIXEDPITCH\t1\n#define FXFONT_FF_ROMAN\t\t\t(1<<4)\n#define FXFONT_FF_SCRIPT\t\t(4<<4)\n#define FXFONT_FW_NORMAL\t\t400\n#define FXFONT_FW_BOLD\t\t\t700\nclass CFX_Font : public CFX_Object\n{\npublic:\n    CFX_Font();\n    ~CFX_Font();\n\n    FX_BOOL\t\t\t\t\tLoadSubst(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,\n                                      int weight, int italic_angle, int CharsetCP, FX_BOOL bVertical = FALSE);\n\n    FX_BOOL\t\t\t\t\tLoadEmbedded(FX_LPCBYTE data, FX_DWORD size);\n\n    FX_BOOL\t\t\t\t\tLoadFile(IFX_FileRead* pFile);\n\n    FXFT_Face\t\t\t\tGetFace() const\n    {\n        return m_Face;\n    }\n\n\n    const CFX_SubstFont*\tGetSubstFont() const\n    {\n        return m_pSubstFont;\n    }\n\n    CFX_PathData*\t\t\tLoadGlyphPath(FX_DWORD glyph_index, int dest_width = 0);\n\n    int\t\t\t\t\t\tGetGlyphWidth(FX_DWORD glyph_index);\n\n    int\t\t\t\t\t\tGetAscent() const;\n\n    int\t\t\t\t\t\tGetDescent() const;\n\n    FX_BOOL                 GetGlyphBBox(FX_DWORD glyph_index, FX_RECT &bbox);\n\n    FX_BOOL                 IsItalic();\n\n    FX_BOOL                 IsBold();\n\n    FX_BOOL                 IsFixedWidth();\n\n    FX_BOOL\t\t\t\t\tIsVertical() const\n    {\n        return m_bVertical;\n    }\n\n    CFX_WideString          GetPsName() const;\n\n\n    CFX_ByteString          GetFamilyName() const;\n\n    CFX_ByteString          GetFaceName() const;\n\n\n    FX_BOOL                 IsTTFont();\n\n    FX_BOOL                 GetBBox(FX_RECT &bbox);\n\n    int                     GetHeight();\n\n    int                     GetULPos();\n\n    int                     GetULthickness();\n\n    int                     GetMaxAdvanceWidth();\n\n    FXFT_Face\t\t\t\tm_Face;\n\n    CFX_SubstFont*\t\t\tm_pSubstFont;\n    FX_BOOL\t\t\t\t\tIsEmbedded()\n    {\n        return m_bEmbedded;\n    }\n\n    void\t\t\t\t\tAdjustMMParams(int glyph_index, int width, int weight);\n    FX_LPBYTE\t\t\t\tm_pFontDataAllocation;\n    FX_LPBYTE               m_pFontData;\n    FX_LPBYTE\t\t\t\tm_pGsubData;\n    FX_DWORD                m_dwSize;\n    CFX_BinaryBuf           m_OtfFontData;\n    void*                   m_hHandle;\n    void*                   m_pPlatformFont;\n    void*                   m_pPlatformFontCollection;\n    void*                   m_pDwFont;\n    FX_BOOL                 m_bDwLoaded;\n    void                    ReleasePlatformResource();\n\n    void\t\t\t\t\tDeleteFace();\nprotected:\n\n    FX_BOOL\t\t\t\t\tm_bEmbedded;\n    FX_BOOL\t\t\t\t\tm_bVertical;\n    void*\t\t\t\t\tm_pOwnedStream;\n};\n#define ENCODING_INTERNAL\t\t0\n#define ENCODING_UNICODE\t\t1\nclass IFX_FontEncoding : public CFX_Object\n{\npublic:\n    virtual ~IFX_FontEncoding() {}\n\n    virtual FX_DWORD\t\tGlyphFromCharCode(FX_DWORD charcode) = 0;\n\n    virtual CFX_WideString\tUnicodeFromCharCode(FX_DWORD charcode) const = 0;\n\n    virtual FX_DWORD\t\tCharCodeFromUnicode(FX_WCHAR Unicode) const = 0;\n};\nIFX_FontEncoding* FXGE_CreateUnicodeEncoding(CFX_Font* pFont);\n#define FXFONT_SUBST_MM\t\t\t\t0x01\n#define FXFONT_SUBST_GLYPHPATH\t\t0x04\n#define FXFONT_SUBST_CLEARTYPE\t\t0x08\n#define FXFONT_SUBST_TRANSFORM\t\t0x10\n#define FXFONT_SUBST_NONSYMBOL\t\t0x20\n#define FXFONT_SUBST_EXACT\t\t\t0x40\n#define FXFONT_SUBST_STANDARD\t\t0x80\nclass CFX_SubstFont : public CFX_Object\n{\npublic:\n\n    CFX_SubstFont();\n\n    FX_LPVOID\t\t\t\tm_ExtHandle;\n\n    CFX_ByteString\t\t\tm_Family;\n\n    int\t\t\t\t\t\tm_Charset;\n\n    FX_DWORD\t\t\t\tm_SubstFlags;\n\n    int\t\t\t\t\t\tm_Weight;\n\n    int\t\t\t\t\t\tm_ItalicAngle;\n\n    FX_BOOL\t\t\t\t\tm_bSubstOfCJK;\n\n    int\t\t\t\t\t\tm_WeightCJK;\n\n    FX_BOOL\t\t\t\t\tm_bItlicCJK;\n};\n#define FX_FONT_FLAG_SERIF              0x01\n#define FX_FONT_FLAG_FIXEDPITCH\t\t\t0x02\n#define FX_FONT_FLAG_ITALIC\t\t\t\t0x04\n#define FX_FONT_FLAG_BOLD\t\t\t\t0x08\n#define FX_FONT_FLAG_SYMBOLIC_SYMBOL\t0x10\n#define FX_FONT_FLAG_SYMBOLIC_DINGBATS\t0x20\n#define FX_FONT_FLAG_MULTIPLEMASTER\t\t0x40\ntypedef struct {\n    FX_LPCBYTE\tm_pFontData;\n    FX_DWORD\tm_dwSize;\n} FoxitFonts;\nclass CFX_FontMgr : public CFX_Object\n{\npublic:\n    CFX_FontMgr();\n    ~CFX_FontMgr();\n    void\t\t\tInitFTLibrary();\n    FXFT_Face\t\tGetCachedFace(const CFX_ByteString& face_name,\n                                  int weight, FX_BOOL bItalic, FX_LPBYTE& pFontData);\n    FXFT_Face\t\tAddCachedFace(const CFX_ByteString& face_name,\n                                  int weight, FX_BOOL bItalic, FX_LPBYTE pData, FX_DWORD size, int face_index);\n    FXFT_Face\t\tGetCachedTTCFace(int ttc_size, FX_DWORD checksum,\n                                     int font_offset, FX_LPBYTE& pFontData);\n    FXFT_Face\t\tAddCachedTTCFace(int ttc_size, FX_DWORD checksum,\n                                     FX_LPBYTE pData, FX_DWORD size, int font_offset);\n    FXFT_Face\t\tGetFileFace(FX_LPCSTR filename, int face_index);\n    FXFT_Face\t\tGetFixedFace(FX_LPCBYTE pData, FX_DWORD size, int face_index);\n    void\t\t\tReleaseFace(FXFT_Face face);\n    void\t\t\tSetSystemFontInfo(IFX_SystemFontInfo* pFontInfo);\n    FXFT_Face\t\tFindSubstFont(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,\n                                  int weight, int italic_angle, int CharsetCP, CFX_SubstFont* pSubstFont);\n\n    void\t\t\tFreeCache();\n\n    FX_BOOL\t\t\tGetStandardFont(FX_LPCBYTE& pFontData, FX_DWORD& size, int index);\n    CFX_FontMapper*\tm_pBuiltinMapper;\n    IFX_FontMapper*\tm_pExtMapper;\n    CFX_MapByteStringToPtr\tm_FaceMap;\n    FXFT_Library\tm_FTLibrary;\n    FoxitFonts m_ExternalFonts[16];\n};\nclass IFX_FontMapper : public CFX_Object\n{\npublic:\n\n    virtual ~IFX_FontMapper() {}\n\n    virtual FXFT_Face\tFindSubstFont(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,\n                                      int weight, int italic_angle, int CharsetCP, CFX_SubstFont* pSubstFont) = 0;\n\n    CFX_FontMgr*\t\tm_pFontMgr;\n};\nclass IFX_FontEnumerator\n{\npublic:\n\n    virtual void\t\tHitFont() = 0;\n\n    virtual void\t\tFinish() = 0;\n};\nclass IFX_AdditionalFontEnum\n{\npublic:\n    virtual int  CountFiles() = 0;\n    virtual IFX_FileStream* GetFontFile(int index) = 0;\n};\nclass CFX_FontMapper : public IFX_FontMapper\n{\npublic:\n    CFX_FontMapper();\n    virtual ~CFX_FontMapper();\n    void\t\t\t\tSetSystemFontInfo(IFX_SystemFontInfo* pFontInfo);\n    IFX_SystemFontInfo*\tGetSystemFontInfo()\n    {\n        return m_pFontInfo;\n    }\n    void\t\t\t\tAddInstalledFont(const CFX_ByteString& name, int charset);\n    void\t\t\t\tLoadInstalledFonts();\n    CFX_ByteStringArray\tm_InstalledTTFonts;\n    void\t\t\t\tSetFontEnumerator(IFX_FontEnumerator* pFontEnumerator)\n    {\n        m_pFontEnumerator = pFontEnumerator;\n    }\n    IFX_FontEnumerator*\tGetFontEnumerator() const\n    {\n        return m_pFontEnumerator;\n    }\n    virtual FXFT_Face\tFindSubstFont(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,\n                                      int weight, int italic_angle, int CharsetCP, CFX_SubstFont* pSubstFont);\nprivate:\n    CFX_ByteString\t\tGetPSNameFromTT(void* hFont);\n    CFX_ByteString\t\tMatchInstalledFonts(const CFX_ByteString& norm_name);\n    FXFT_Face\t\t\tUseInternalSubst(CFX_SubstFont* pSubstFont, int iBaseFont, int italic_angle, int weight, int picthfamily);\n\n    FX_BOOL\t\t\t\tm_bListLoaded;\n    FXFT_Face\t\t\tm_MMFaces[2];\n    CFX_ByteString\t\tm_LastFamily;\n    CFX_DWordArray\t\tm_CharsetArray;\n    CFX_ByteStringArray\tm_FaceArray;\n    IFX_SystemFontInfo*\tm_pFontInfo;\n    FXFT_Face\t\t\tm_FoxitFaces[14];\n    IFX_FontEnumerator*\t\tm_pFontEnumerator;\n};\nclass IFX_SystemFontInfo : public CFX_Object\n{\npublic:\n    static IFX_SystemFontInfo*\tCreateDefault();\n    virtual void\t\tRelease() = 0;\n    virtual\tFX_BOOL\t\tEnumFontList(CFX_FontMapper* pMapper) = 0;\n    virtual void*\t\tMapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR face, FX_BOOL& bExact) = 0;\n    virtual void*\t\tGetFont(FX_LPCSTR face) = 0;\n    virtual FX_DWORD\tGetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size) = 0;\n    virtual FX_BOOL\t\tGetFaceName(void* hFont, CFX_ByteString& name) = 0;\n    virtual FX_BOOL\t\tGetFontCharset(void* hFont, int& charset) = 0;\n    virtual int\t\t\tGetFaceIndex(void* hFont)\n    {\n        return 0;\n    }\n    virtual void\t\tDeleteFont(void* hFont) = 0;\n    virtual void*       RetainFont(void* hFont)\n    {\n        return NULL;\n    }\n};\nclass CFX_FolderFontInfo : public IFX_SystemFontInfo\n{\npublic:\n    CFX_FolderFontInfo();\n    virtual ~CFX_FolderFontInfo();\n    void\t\t\t\tAddPath(FX_BSTR path);\n    virtual void\t\tRelease();\n    virtual\tFX_BOOL\t\tEnumFontList(CFX_FontMapper* pMapper);\n    virtual void*\t\tMapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR face, FX_BOOL& bExact);\n    virtual void*\t\tGetFont(FX_LPCSTR face);\n    virtual FX_DWORD\tGetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size);\n    virtual void\t\tDeleteFont(void* hFont);\n    virtual\tFX_BOOL\t\tGetFaceName(void* hFont, CFX_ByteString& name);\n    virtual FX_BOOL\t\tGetFontCharset(void* hFont, int& charset);\nprotected:\n    CFX_MapByteStringToPtr\tm_FontList;\n    CFX_ByteStringArray\tm_PathList;\n    CFX_FontMapper*\t\tm_pMapper;\n    void\t\t\t\tScanPath(CFX_ByteString& path);\n    void\t\t\t\tScanFile(CFX_ByteString& path);\n    void\t\t\t\tReportFace(CFX_ByteString& path, FXSYS_FILE* pFile, FX_DWORD filesize, FX_DWORD offset);\n};\nclass CFX_CountedFaceCache : public CFX_Object\n{\npublic:\n    CFX_FaceCache*\tm_Obj;\n    FX_DWORD\t\tm_nCount;\n};\ntypedef CFX_MapPtrTemplate<FXFT_Face, CFX_CountedFaceCache*> CFX_FTCacheMap;\nclass CFX_FontCache : public CFX_Object\n{\npublic:\n    ~CFX_FontCache();\n    CFX_FaceCache*\t\t\tGetCachedFace(CFX_Font* pFont);\n    void\t\t\t\t\tReleaseCachedFace(CFX_Font* pFont);\n    void\t\t\t\t\tFreeCache(FX_BOOL bRelease = FALSE);\n\nprivate:\n    CFX_FTCacheMap\t\t\tm_FTFaceMap;\n    CFX_FTCacheMap\t\t\tm_ExtFaceMap;\n};\nclass CFX_AutoFontCache\n{\npublic:\n    CFX_AutoFontCache(CFX_FontCache* pFontCache, CFX_Font* pFont)\n        : m_pFontCache(pFontCache)\n        , m_pFont(pFont)\n    {\n    }\n    ~CFX_AutoFontCache()\n    {\n        m_pFontCache->ReleaseCachedFace(m_pFont);\n    }\n    CFX_FontCache* m_pFontCache;\n    CFX_Font* m_pFont;\n};\n#define FX_FONTCACHE_DEFINE(pFontCache, pFont) CFX_AutoFontCache autoFontCache((pFontCache), (pFont))\nclass CFX_GlyphBitmap : public CFX_Object\n{\npublic:\n    int\t\t\t\t\t\tm_Top;\n    int\t\t\t\t\t\tm_Left;\n    CFX_DIBitmap\t\t\tm_Bitmap;\n};\nclass CFX_FaceCache : public CFX_Object\n{\npublic:\n    ~CFX_FaceCache();\n    const CFX_GlyphBitmap*\tLoadGlyphBitmap(CFX_Font* pFont, FX_DWORD glyph_index, FX_BOOL bFontStyle, const CFX_AffineMatrix* pMatrix,\n                                            int dest_width, int anti_alias, int& text_flags);\n    const CFX_PathData*\t\tLoadGlyphPath(CFX_Font* pFont, FX_DWORD glyph_index, int dest_width);\n\n\n    CFX_FaceCache(FXFT_Face face);\nprivate:\n    FXFT_Face\t\t\t\tm_Face;\n    CFX_GlyphBitmap*\t\tRenderGlyph(CFX_Font* pFont, FX_DWORD glyph_index, FX_BOOL bFontStyle,\n                                        const CFX_AffineMatrix* pMatrix, int dest_width, int anti_alias);\n    CFX_GlyphBitmap*\t\tRenderGlyph_Nativetext(CFX_Font* pFont, FX_DWORD glyph_index,\n            const CFX_AffineMatrix* pMatrix, int dest_width, int anti_alias);\n    CFX_GlyphBitmap*        LookUpGlyphBitmap(CFX_Font* pFont, const CFX_AffineMatrix* pMatrix, CFX_ByteStringC& FaceGlyphsKey,\n            FX_DWORD glyph_index, FX_BOOL bFontStyle, int dest_width, int anti_alias);\n    CFX_MapByteStringToPtr\tm_SizeMap;\n    CFX_MapPtrToPtr\t\t\tm_PathMap;\n    CFX_DIBitmap*           m_pBitmap;\n    void*                   m_pPlatformGraphics;\n    void*                   m_pPlatformBitmap;\n    void*                   m_hDC;\n    void*                   m_hBitmap;\n    void*                   m_hOldBitmap;\n    void*                   m_hGdiFont;\n    void*                   m_hOldGdiFont;\n\n    void\t\t\t\t    InitPlatform();\n    void\t\t\t\t    DestroyPlatform();\n};\ntypedef struct {\n    const CFX_GlyphBitmap*\tm_pGlyph;\n    int\t\t\t\t\tm_OriginX, m_OriginY;\n    FX_FLOAT\t\t\tm_fOriginX, m_fOriginY;\n} FXTEXT_GLYPHPOS;\nFX_RECT FXGE_GetGlyphsBBox(FXTEXT_GLYPHPOS* pGlyphAndPos, int nChars, int anti_alias, FX_FLOAT retinaScaleX = 1.0f, FX_FLOAT retinaScaleY = 1.0f);\nFX_BOOL\tOutputGlyph(void* dib, int x, int y, CFX_Font* pFont, double font_size,\n                    CFX_AffineMatrix* pMatrix, unsigned long glyph_index, unsigned long argb);\nFX_BOOL\tOutputText(void* dib, int x, int y, CFX_Font* pFont, double font_size,\n                   CFX_AffineMatrix* pText_matrix, unsigned short const* text, unsigned long argb);\nclass IFX_GSUBTable\n{\npublic:\n    virtual void\tRelease() = 0;\n    virtual FX_BOOL GetVerticalGlyph(FX_DWORD glyphnum, FX_DWORD* vglyphnum) = 0;\n};\nIFX_GSUBTable* FXGE_CreateGSUBTable(CFX_Font* pFont);\n#endif\n"
  },
  {
    "path": "core/include/fxge/fx_freetype.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../thirdparties/freetype/ft2build.h\"\n#include \"../thirdparties/freetype/freetype/freetype.h\"\n#include \"../thirdparties/freetype/freetype/ftoutln.h\"\n#include \"../thirdparties/freetype/freetype/ftmm.h\"\n#include \"../thirdparties/freetype/freetype/internal/ftobjs.h\"\n#include \"../thirdparties/freetype/freetype/tttables.h\"\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n#define FXFT_ENCODING_UNICODE FT_ENCODING_UNICODE\n#define FXFT_ENCODING_ADOBE_STANDARD FT_ENCODING_ADOBE_STANDARD\n#define FXFT_ENCODING_ADOBE_EXPERT FT_ENCODING_ADOBE_EXPERT\n#define FXFT_ENCODING_ADOBE_LATIN_1 FT_ENCODING_ADOBE_LATIN_1\n#define FXFT_ENCODING_APPLE_ROMAN FT_ENCODING_APPLE_ROMAN\n#define FXFT_ENCODING_ADOBE_CUSTOM FT_ENCODING_ADOBE_CUSTOM\n#define FXFT_ENCODING_MS_SYMBOL FT_ENCODING_MS_SYMBOL\n#define FXFT_ENCODING_GB2312 FT_ENCODING_GB2312\n#define FXFT_ENCODING_BIG5 FT_ENCODING_BIG5\n#define FXFT_ENCODING_SJIS FT_ENCODING_SJIS\n#define FXFT_ENCODING_JOHAB FT_ENCODING_JOHAB\n#define FXFT_ENCODING_WANSUNG FT_ENCODING_WANSUNG\n#define FXFT_LOAD_NO_SCALE FT_LOAD_NO_SCALE\n#define FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH\n#define FXFT_RENDER_MODE_LCD FT_RENDER_MODE_LCD\n#define FXFT_RENDER_MODE_MONO FT_RENDER_MODE_MONO\n#define FXFT_RENDER_MODE_NORMAL FT_RENDER_MODE_NORMAL\n#define FXFT_LOAD_IGNORE_TRANSFORM FT_LOAD_IGNORE_TRANSFORM\n#define FXFT_LOAD_NO_BITMAP FT_LOAD_NO_BITMAP\n#define FXFT_LOAD_NO_HINTING FT_LOAD_NO_HINTING\n#define FXFT_PIXEL_MODE_MONO FT_PIXEL_MODE_MONO\n#define FXFT_STYLE_FLAG_ITALIC FT_STYLE_FLAG_ITALIC\n#define FXFT_STYLE_FLAG_BOLD FT_STYLE_FLAG_BOLD\n#define FXFT_FACE_FLAG_SFNT FT_FACE_FLAG_SFNT\n#define FXFT_FACE_FLAG_TRICKY ( 1L << 13 )\ntypedef FT_MM_Var*\t\tFXFT_MM_Var;\ntypedef FT_Bitmap*\t\tFXFT_Bitmap;\n#define FXFT_Matrix\t\tFT_Matrix\n#define FXFT_Vector\t\tFT_Vector\n#define FXFT_Outline_Funcs FT_Outline_Funcs\ntypedef FT_Open_Args\tFXFT_Open_Args;\ntypedef FT_StreamRec\tFXFT_StreamRec;\ntypedef FT_StreamRec*\tFXFT_Stream;\ntypedef FT_BBox\t\t\tFXFT_BBox;\ntypedef FT_Glyph\t\tFXFT_Glyph;\ntypedef FT_CharMap\t\tFXFT_CharMap;\n#define FXFT_GLYPH_BBOX_PIXELS\tFT_GLYPH_BBOX_PIXELS\n#define FXFT_Open_Face(library, args, index, face) \\\n    FT_Open_Face((FT_Library)(library), args, index, (FT_Face*)(face))\n#define FXFT_Done_Face(face) FT_Done_Face((FT_Face)(face))\n#define FXFT_Done_FreeType(library) FT_Done_FreeType((FT_Library)(library))\n#define FXFT_Init_FreeType(library) FT_Init_FreeType((FT_Library*)(library))\n#define FXFT_New_Memory_Face(library, base, size, index, face) \\\n    FT_New_Memory_Face((FT_Library)(library), base, size, index, (FT_Face*)(face))\n#define FXFT_New_Face(library, filename, index, face) \\\n    FT_New_Face((FT_Library)(library), filename, index, (FT_Face*)(face))\n#define FXFT_Get_Face_FreeType(face) ((FT_Face)face)->driver->root.library\n#define FXFT_Select_Charmap(face, encoding) FT_Select_Charmap((FT_Face)face, (FT_Encoding)encoding)\n#define FXFT_Set_Charmap(face, charmap) FT_Set_Charmap((FT_Face)face, (FT_CharMap)charmap)\n#define FXFT_Load_Glyph(face, glyph_index, flags) FT_Load_Glyph((FT_Face)face, glyph_index, flags)\n#define FXFT_Get_Char_Index(face, code) FT_Get_Char_Index((FT_Face)face, code)\n#define FXFT_Get_Glyph_Name(face, index, buffer, size) FT_Get_Glyph_Name((FT_Face)face, index, buffer, size)\n#define FXFT_Get_Name_Index(face, name) FT_Get_Name_Index((FT_Face)face, name)\n#define FXFT_Has_Glyph_Names(face)  (((FT_Face)face)->face_flags & FT_FACE_FLAG_GLYPH_NAMES)\n#define FXFT_Get_Postscript_Name(face) FT_Get_Postscript_Name((FT_Face)face)\n#define FXFT_Load_Sfnt_Table(face, tag, offset, buffer, length) \\\n    FT_Load_Sfnt_Table((FT_Face)face, tag, offset, buffer, length)\n#define FXFT_Get_First_Char(face, glyph_index) FT_Get_First_Char((FT_Face)face, glyph_index)\n#define FXFT_Get_Next_Char(face, code, glyph_index) FT_Get_Next_Char((FT_Face)face, code, glyph_index)\n#define FXFT_Clear_Face_External_Stream(face) (((FT_Face)face)->face_flags&=~FT_FACE_FLAG_EXTERNAL_STREAM)\n#define FXFT_Get_Face_External_Stream(face) (((FT_Face)face)->face_flags&FT_FACE_FLAG_EXTERNAL_STREAM)\n#define FXFT_Is_Face_TT_OT(face) (((FT_Face)face)->face_flags&FT_FACE_FLAG_SFNT)\n#define FXFT_Is_Face_Tricky(face) (((FT_Face)face)->face_flags&FXFT_FACE_FLAG_TRICKY)\n#define FXFT_Is_Face_fixedwidth(face) (((FT_Face)face)->face_flags & FT_FACE_FLAG_FIXED_WIDTH)\n#define FXFT_Get_Face_Stream_Base(face) ((FT_Face)face)->stream->base\n#define FXFT_Get_Face_Stream_Size(face) ((FT_Face)face)->stream->size\n#define FXFT_Get_Face_Family_Name(face) ((FT_Face)face)->family_name\n#define FXFT_Get_Face_Style_Name(face) ((FT_Face)face)->style_name\n#define FXFT_Get_Face_Numfaces(face) ((FT_Face)face)->num_faces\n#define FXFT_Get_Face_Faceindex(face) ((FT_Face)face)->face_index\n#define FXFT_Is_Face_Italic(face) (((FT_Face)face)->style_flags&FT_STYLE_FLAG_ITALIC)\n#define FXFT_Is_Face_Bold(face) (((FT_Face)face)->style_flags&FT_STYLE_FLAG_BOLD)\n#define FXFT_Get_Face_Charmaps(face) ((FT_Face)face)->charmaps\n#define FXFT_Get_Glyph_HoriBearingX(face) ((FT_Face)face)->glyph->metrics.horiBearingX\n#define FXFT_Get_Glyph_HoriBearingY(face) ((FT_Face)face)->glyph->metrics.horiBearingY\n#define FXFT_Get_Glyph_Width(face) ((FT_Face)face)->glyph->metrics.width\n#define FXFT_Get_Glyph_Height(face) ((FT_Face)face)->glyph->metrics.height\n#define FXFT_Get_Face_CharmapCount(face) ((FT_Face)face)->num_charmaps\n#define FXFT_Get_Charmap_Encoding(charmap) ((FT_CharMap)charmap)->encoding\n#define FXFT_Get_Face_Charmap(face) ((FT_Face)face)->charmap\n#define FXFT_Get_Charmap_PlatformID(charmap) ((FT_CharMap)charmap)->platform_id\n#define FXFT_Get_Charmap_EncodingID(charmap) ((FT_CharMap)charmap)->encoding_id\n#define FXFT_Get_Face_UnitsPerEM(face) ((FT_Face)face)->units_per_EM\n#define FXFT_Get_Face_xMin(face) ((FT_Face)face)->bbox.xMin\n#define FXFT_Get_Face_xMax(face) ((FT_Face)face)->bbox.xMax\n#define FXFT_Get_Face_yMin(face) ((FT_Face)face)->bbox.yMin\n#define FXFT_Get_Face_yMax(face) ((FT_Face)face)->bbox.yMax\n#define FXFT_Get_Face_Height(face) ((FT_Face)face)->height\n#define FXFT_Get_Face_UnderLineThickness(face) ((FT_Face)face)->underline_thickness\n#define FXFT_Get_Face_UnderLinePosition(face) ((FT_Face)face)->underline_position\n#define FXFT_Get_Face_MaxAdvanceWidth(face) ((FT_Face)face)->max_advance_width\n#define FXFT_Get_Face_Ascender(face) ((FT_Face)face)->ascender\n#define FXFT_Get_Face_Descender(face) ((FT_Face)face)->descender\n#define FXFT_Get_Glyph_HoriAdvance(face) ((FT_Face)face)->glyph->metrics.horiAdvance\n#define FXFT_Get_MM_Axis(var, index) &((FT_MM_Var*)var)->axis[index]\n#define FXFT_Get_MM_Axis_Min(axis) ((FT_Var_Axis*)axis)->minimum\n#define FXFT_Get_MM_Axis_Max(axis) ((FT_Var_Axis*)axis)->maximum\n#define FXFT_Get_MM_Axis_Def(axis) ((FT_Var_Axis*)axis)->def\n#define FXFT_Get_Face_Internal_Flag(face) ((FT_Face)face)->internal->transform_flags\n#define FXFT_Set_Face_Internal_Flag(face, flag) (((FT_Face)face)->internal->transform_flags = flag)\n#define FXFT_Alloc(library, size) ((FT_Library)library)->memory->alloc(((FT_Library)library)->memory, size)\n#define FXFT_Free(face, p) ((FT_Face)face)->memory->free(((FT_Face)face)->memory, p)\n#define FXFT_Get_Glyph_Outline(face) &((FT_Face)face)->glyph->outline\n#define FXFT_Get_Outline_Bbox(outline, cbox)  FT_Outline_Get_CBox(outline, cbox)\n#define FXFT_Render_Glyph(face, mode) FT_Render_Glyph(((FT_Face)face)->glyph, (enum FT_Render_Mode_)mode)\n#define FXFT_Get_MM_Var(face, p) FT_Get_MM_Var((FT_Face)face, p)\n#define FXFT_Set_MM_Design_Coordinates(face, n, p) FT_Set_MM_Design_Coordinates((FT_Face)face, n, p)\n#define FXFT_Set_Pixel_Sizes(face, w, h) FT_Set_Pixel_Sizes((FT_Face)face, w, h)\n#define FXFT_Set_Transform(face, m, d) FT_Set_Transform((FT_Face)face, m, d)\n#define FXFT_Outline_Embolden(outline, s) FT_Outline_Embolden(outline, s)\n#define FXFT_Get_Glyph_Bitmap(face) &((FT_Face)face)->glyph->bitmap\n#define FXFT_Get_Bitmap_Width(bitmap) ((FT_Bitmap*)bitmap)->width\n#define FXFT_Get_Bitmap_Rows(bitmap) ((FT_Bitmap*)bitmap)->rows\n#define FXFT_Get_Bitmap_PixelMode(bitmap) ((FT_Bitmap*)bitmap)->pixel_mode\n#define FXFT_Get_Bitmap_Pitch(bitmap) ((FT_Bitmap*)bitmap)->pitch\n#define FXFT_Get_Bitmap_Buffer(bitmap) ((FT_Bitmap*)bitmap)->buffer\n#define FXFT_Get_Glyph_BitmapLeft(face) ((FT_Face)face)->glyph->bitmap_left\n#define FXFT_Get_Glyph_BitmapTop(face) ((FT_Face)face)->glyph->bitmap_top\n#define FXFT_Outline_Decompose(outline, funcs, params) FT_Outline_Decompose(outline, funcs, params)\n#define FXFT_Set_Char_Size(face, char_width, char_height, horz_resolution, vert_resolution) FT_Set_Char_Size(face, char_width, char_height, horz_resolution, vert_resolution)\n#define FXFT_Get_Glyph(slot, aglyph) FT_Get_Glyph(slot, aglyph)\n#define FXFT_Glyph_Get_CBox(glyph, bbox_mode, acbox) FT_Glyph_Get_CBox(glyph, bbox_mode, acbox)\n#define FXFT_Done_Glyph(glyph)\tFT_Done_Glyph(glyph)\n#define FXFT_Library_SetLcdFilter(library, filter) FT_Library_SetLcdFilter((FT_Library)(library), filter)\nint FXFT_unicode_from_adobe_name(const char* name);\nvoid FXFT_adobe_name_from_unicode(char* name, unsigned int unicode);\n#ifdef __cplusplus\n};\n#endif\n"
  },
  {
    "path": "core/include/fxge/fx_ge.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_GE_H_\n#define _FX_GE_H_\n#ifndef _FX_DIB_H_\n#include \"fx_dib.h\"\n#endif\n#ifndef _FX_FONT_H_\n#include \"fx_font.h\"\n#endif\nclass CFX_ClipRgn;\nclass CFX_PathData;\nclass CFX_GraphStateData;\nclass CFX_Font;\nclass CFX_FontMgr;\nclass CFX_FontCache;\nclass CFX_FaceCache;\nclass CFX_RenderDevice;\nclass IFX_RenderDeviceDriver;\nclass CCodec_ModuleMgr;\nclass IFXG_PaintModuleMgr;\nclass CFX_GEModule : public CFX_Object\n{\npublic:\n\n    static void\t\t\t\tCreate();\n\n    static void\t\t\t\tUse(CFX_GEModule* pMgr);\n\n    static CFX_GEModule*\tGet();\n\n    static void\t\t\t\tDestroy();\npublic:\n\n    CFX_FontCache*\t\t\tGetFontCache();\n    CFX_FontMgr*\t\t\tGetFontMgr()\n    {\n        return m_pFontMgr;\n    }\n    void\t\t\t\t\tSetTextGamma(FX_FLOAT gammaValue);\n    FX_LPCBYTE\t\t\t\tGetTextGammaTable();\n    void\t\t\t\t\tSetExtFontMapper(IFX_FontMapper* pFontMapper);\n\n    void\t\t\t\t\tSetCodecModule(CCodec_ModuleMgr* pCodecModule)\n    {\n        m_pCodecModule = pCodecModule;\n    }\n    CCodec_ModuleMgr*\t\tGetCodecModule()\n    {\n        return m_pCodecModule;\n    }\n    FXFT_Library\t\t\tm_FTLibrary;\n    void*\t\t\t\t\tGetPlatformData()\n    {\n        return m_pPlatformData;\n    }\nprotected:\n\n    CFX_GEModule();\n\n    ~CFX_GEModule();\n    void\t\t\t\t\tInitPlatform();\n    void\t\t\t\t\tDestroyPlatform();\nprivate:\n    FX_BYTE\t\t\t\t\tm_GammaValue[256];\n    CFX_FontCache*\t\t\tm_pFontCache;\n    CFX_FontMgr*\t\t\tm_pFontMgr;\n    CCodec_ModuleMgr*\t\tm_pCodecModule;\n    void*\t\t\t\t\tm_pPlatformData;\n};\ntypedef struct {\n\n    FX_FLOAT\t\t\tm_PointX;\n\n    FX_FLOAT\t\t\tm_PointY;\n\n    int\t\t\t\t\tm_Flag;\n} FX_PATHPOINT;\n#define FXPT_CLOSEFIGURE\t\t0x01\n#define FXPT_LINETO\t\t\t\t0x02\n#define FXPT_BEZIERTO\t\t\t0x04\n#define FXPT_MOVETO\t\t\t\t0x06\n#define FXPT_TYPE\t\t\t\t0x06\n#define FXFILL_ALTERNATE\t\t1\n#define FXFILL_WINDING\t\t\t2\nclass CFX_ClipRgn : public CFX_Object\n{\npublic:\n\n    CFX_ClipRgn(int device_width, int device_height);\n\n    CFX_ClipRgn(const FX_RECT& rect);\n\n    CFX_ClipRgn(const CFX_ClipRgn& src);\n\n    ~CFX_ClipRgn();\n\n    typedef enum {\n        RectI,\n        MaskF\n    } ClipType;\n\n    void\t\t\tReset(const FX_RECT& rect);\n\n    ClipType\t\tGetType() const\n    {\n        return m_Type;\n    }\n\n    const FX_RECT&\tGetBox() const\n    {\n        return m_Box;\n    }\n\n    CFX_DIBitmapRef\tGetMask() const\n    {\n        return m_Mask;\n    }\n\n    void\t\t\tIntersectRect(const FX_RECT& rect);\n\n    void\t\t\tIntersectMaskF(int left, int top, CFX_DIBitmapRef Mask);\nprotected:\n\n    ClipType\t\tm_Type;\n\n    FX_RECT\t\t\tm_Box;\n\n    CFX_DIBitmapRef\tm_Mask;\n\n    void\t\t\tIntersectMaskRect(FX_RECT rect, FX_RECT mask_box, CFX_DIBitmapRef Mask);\n};\nextern const FX_BYTE g_GammaRamp[256];\nextern const FX_BYTE g_GammaInverse[256];\n#define FX_GAMMA(value)\t\t\t(value)\n#define FX_GAMMA_INVERSE(value)\t(value)\ninline FX_ARGB ArgbGamma(FX_ARGB argb)\n{\n    return argb;\n}\ninline FX_ARGB ArgbGammaInverse(FX_ARGB argb)\n{\n    return argb;\n}\nclass CFX_PathData : public CFX_Object\n{\npublic:\n\n    CFX_PathData();\n\n    CFX_PathData(const CFX_PathData& src);\n\n    ~CFX_PathData();\n\n\n\n\n    int\t\t\t\t\tGetPointCount() const\n    {\n        return m_PointCount;\n    }\n\n    int\t\t\t\t\tGetFlag(int index) const\n    {\n        return m_pPoints[index].m_Flag;\n    }\n\n    FX_FLOAT\t\t\tGetPointX(int index) const\n    {\n        return m_pPoints[index].m_PointX;\n    }\n\n    FX_FLOAT\t\t\tGetPointY(int index) const\n    {\n        return m_pPoints[index].m_PointY;\n    }\n\n\n\n    FX_PATHPOINT*\t\tGetPoints() const\n    {\n        return m_pPoints;\n    }\n\n    FX_BOOL\t\t\t\tSetPointCount(int nPoints);\n\n    FX_BOOL\t\t\t\tAllocPointCount(int nPoints);\n\n    FX_BOOL\t\t\t\tAddPointCount(int addPoints);\n\n    CFX_FloatRect\t\tGetBoundingBox() const;\n\n    CFX_FloatRect\t\tGetBoundingBox(FX_FLOAT line_width, FX_FLOAT miter_limit) const;\n\n    void\t\t\t\tTransform(const CFX_AffineMatrix* pMatrix);\n\n    FX_BOOL\t\t\t\tIsRect() const;\n\n    FX_BOOL\t\t\t\tGetZeroAreaPath(CFX_PathData& NewPath, CFX_AffineMatrix* pMatrix, FX_BOOL&bThin, FX_BOOL bAdjust) const;\n\n    FX_BOOL\t\t\t\tIsRect(const CFX_AffineMatrix* pMatrix, CFX_FloatRect* rect) const;\n\n    FX_BOOL\t\t\t\tAppend(const CFX_PathData* pSrc, const CFX_AffineMatrix* pMatrix);\n\n    FX_BOOL\t\t\t\tAppendRect(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top);\n\n    void\t\t\t\tSetPoint(int index, FX_FLOAT x, FX_FLOAT y, int flag);\n\n    void\t\t\t\tTrimPoints(int nPoints);\n\n    FX_BOOL\t\t\t\tCopy(const CFX_PathData &src);\nprotected:\n    friend class\t\tCPDF_Path;\n\n    int\t\t\t\t\tm_PointCount;\n\n    FX_PATHPOINT*\t\tm_pPoints;\n\n    int\t\t\t\t\tm_AllocCount;\n};\nclass CFX_GraphStateData : public CFX_Object\n{\npublic:\n\n    CFX_GraphStateData();\n\n    CFX_GraphStateData(const CFX_GraphStateData& src);\n\n    ~CFX_GraphStateData();\n\n    void\t\t\t\tCopy(const CFX_GraphStateData& src);\n\n    void\t\t\t\tSetDashCount(int count);\n\n\n\n    typedef enum {\n        LineCapButt = 0,\n        LineCapRound = 1,\n        LineCapSquare = 2\n    } LineCap;\n    LineCap\t\t\t\tm_LineCap;\n    int\t\t\t\t\tm_DashCount;\n    FX_FLOAT*\t\tm_DashArray;\n    FX_FLOAT\t\t\tm_DashPhase;\n\n    typedef enum {\n        LineJoinMiter = 0,\n        LineJoinRound = 1,\n        LineJoinBevel = 2,\n    } LineJoin;\n    LineJoin\t\t\tm_LineJoin;\n    FX_FLOAT\t\t\tm_MiterLimit;\n    FX_FLOAT\t\t\tm_LineWidth;\n\n};\n#define FXDC_DEVICE_CLASS\t\t\t1\n#define FXDC_PIXEL_WIDTH\t\t\t2\n#define FXDC_PIXEL_HEIGHT\t\t\t3\n#define FXDC_BITS_PIXEL\t\t\t\t4\n#define FXDC_HORZ_SIZE\t\t\t\t5\n#define FXDC_VERT_SIZE\t\t\t\t6\n#define FXDC_RENDER_CAPS\t\t\t7\n#define FXDC_DITHER_BITS\t\t\t8\n#define FXDC_DISPLAY\t\t\t\t1\n#define FXDC_PRINTER\t\t\t\t2\n#define FXRC_GET_BITS\t\t\t\t0x01\n#define FXRC_BIT_MASK\t\t\t\t0x02\n#define FXRC_ALPHA_MASK\t\t\t\t0x04\n#define FXRC_ALPHA_PATH\t\t\t\t0x10\n#define FXRC_ALPHA_IMAGE\t\t\t0x20\n#define FXRC_ALPHA_OUTPUT\t\t\t0x40\n#define FXRC_BLEND_MODE\t\t\t\t0x80\n#define FXRC_SOFT_CLIP\t\t\t\t0x100\n#define FXRC_CMYK_OUTPUT\t\t\t0x200\n#define FXRC_BITMASK_OUTPUT         0x400\n#define FXRC_BYTEMASK_OUTPUT        0x800\n#define FXRENDER_IMAGE_LOSSY\t\t0x1000\n#define FXFILL_ALTERNATE\t\t1\n#define FXFILL_WINDING\t\t\t2\n#define FXFILL_FULLCOVER\t\t4\n#define FXFILL_RECT_AA\t\t\t8\n#define FX_FILL_STROKE\t\t\t16\n#define FX_STROKE_ADJUST\t\t32\n#define FX_STROKE_TEXT_MODE\t\t64\n#define FX_FILL_TEXT_MODE\t\t128\n#define FX_ZEROAREA_FILL\t\t256\n#define FXFILL_NOPATHSMOOTH\t\t512\n#define FXTEXT_CLEARTYPE\t\t\t0x01\n#define FXTEXT_BGR_STRIPE\t\t\t0x02\n#define FXTEXT_PRINTGRAPHICTEXT\t\t0x04\n#define FXTEXT_NO_NATIVETEXT\t\t0x08\n#define FXTEXT_PRINTIMAGETEXT\t\t0x10\n#define FXTEXT_NOSMOOTH\t\t\t\t0x20\ntypedef struct {\n    FX_DWORD\t\t\tm_GlyphIndex;\n    FX_FLOAT\t\t\tm_OriginX, m_OriginY;\n    int\t\t\t\t\tm_FontCharWidth;\n    FX_BOOL\t\t\t\tm_bGlyphAdjust;\n    FX_FLOAT\t\t\tm_AdjustMatrix[4];\n    FX_DWORD\t\t\tm_ExtGID;\n    FX_BOOL\t\t\t\tm_bFontStyle;\n} FXTEXT_CHARPOS;\nclass CFX_RenderDevice : public CFX_Object\n{\npublic:\n    CFX_RenderDevice();\n\n    virtual ~CFX_RenderDevice();\n\n    void\t\t\tSetDeviceDriver(IFX_RenderDeviceDriver* pDriver);\n\n    IFX_RenderDeviceDriver*\tGetDeviceDriver() const\n    {\n        return m_pDeviceDriver;\n    }\n\n    FX_BOOL\t\t\tStartRendering();\n\n    void\t\t\tEndRendering();\n\n\n\n    void\t\t\tSaveState();\n\n    void\t\t\tRestoreState(FX_BOOL bKeepSaved = FALSE);\n\n\n\n\n    int\t\t\t\tGetWidth() const\n    {\n        return m_Width;\n    }\n\n    int\t\t\t\tGetHeight() const\n    {\n        return m_Height;\n    }\n\n    int\t\t\t\tGetDeviceClass() const\n    {\n        return m_DeviceClass;\n    }\n\n    int\t\t\t\tGetBPP() const\n    {\n        return m_bpp;\n    }\n\n    int\t\t\t\tGetRenderCaps() const\n    {\n        return m_RenderCaps;\n    }\n\n    int\t\t\t\tGetDeviceCaps(int id) const;\n\n    CFX_Matrix\t\tGetCTM() const;\n\n\n    CFX_DIBitmap*\tGetBitmap() const\n    {\n        return m_pBitmap;\n    }\n    void\t\t\tSetBitmap(CFX_DIBitmap* pBitmap)\n    {\n        m_pBitmap = pBitmap;\n    }\n\n    FX_BOOL\t\t\tCreateCompatibleBitmap(CFX_DIBitmap* pDIB, int width, int height) const;\n\n    const FX_RECT&\tGetClipBox() const\n    {\n        return m_ClipBox;\n    }\n\n    FX_BOOL\t\t\tSetClip_PathFill(const CFX_PathData* pPathData,\n                                     const CFX_AffineMatrix* pObject2Device,\n                                     int fill_mode\n                              );\n\n    FX_BOOL\t\t\tSetClip_Rect(const FX_RECT* pRect);\n\n    FX_BOOL\t\t\tSetClip_PathStroke(const CFX_PathData* pPathData,\n                                       const CFX_AffineMatrix* pObject2Device,\n                                       const CFX_GraphStateData* pGraphState\n                                );\n\n    FX_BOOL\t\t\tDrawPath(const CFX_PathData* pPathData,\n                             const CFX_AffineMatrix* pObject2Device,\n                             const CFX_GraphStateData* pGraphState,\n                             FX_DWORD fill_color,\n                             FX_DWORD stroke_color,\n                             int fill_mode,\n                             int alpha_flag = 0,\n                             void* pIccTransform = NULL,\n                             int blend_type = FXDIB_BLEND_NORMAL\n                      );\n\n    FX_BOOL\t\t\tSetPixel(int x, int y, FX_DWORD color,\n                             int alpha_flag = 0, void* pIccTransform = NULL);\n\n    FX_BOOL\t\t\tFillRect(const FX_RECT* pRect, FX_DWORD color,\n                             int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);\n\n    FX_BOOL\t\t\tDrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,\n                                     int fill_mode = 0, int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);\n\n    FX_BOOL\t\t\tGetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL);\n\n    CFX_DIBitmap*   GetBackDrop();\n\n    FX_BOOL\t\t\tSetDIBits(const CFX_DIBSource* pBitmap, int left, int top, int blend_type = FXDIB_BLEND_NORMAL,\n                              void* pIccTransform = NULL);\n\n    FX_BOOL\t\t\tStretchDIBits(const CFX_DIBSource* pBitmap, int left, int top, int dest_width, int dest_height,\n                                  FX_DWORD flags = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);\n\n    FX_BOOL\t\t\tSetBitMask(const CFX_DIBSource* pBitmap, int left, int top, FX_DWORD color,\n                               int alpha_flag = 0, void* pIccTransform = NULL);\n\n    FX_BOOL\t\t\tStretchBitMask(const CFX_DIBSource* pBitmap, int left, int top, int dest_width, int dest_height,\n                                   FX_DWORD color, FX_DWORD flags = 0, int alpha_flag = 0, void* pIccTransform = NULL);\n\n    FX_BOOL\t\t\tStartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,\n                                const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle,\n                                int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);\n\n    FX_BOOL\t\t\tContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause);\n\n    void\t\t\tCancelDIBits(FX_LPVOID handle);\n\n    FX_BOOL\t\t\tDrawNormalText(int nChars, const FXTEXT_CHARPOS* pCharPos,\n                                   CFX_Font* pFont, CFX_FontCache* pCache,\n                                   FX_FLOAT font_size, const CFX_AffineMatrix* pText2Device,\n                                   FX_DWORD fill_color, FX_DWORD text_flags,\n                                   int alpha_flag = 0, void* pIccTransform = NULL);\n\n    FX_BOOL\t\t\tDrawTextPath(int nChars, const FXTEXT_CHARPOS* pCharPos,\n                                 CFX_Font* pFont, CFX_FontCache* pCache,\n                                 FX_FLOAT font_size, const CFX_AffineMatrix* pText2User,\n                                 const CFX_AffineMatrix* pUser2Device, const CFX_GraphStateData* pGraphState,\n                                 FX_DWORD fill_color, FX_DWORD stroke_color, CFX_PathData* pClippingPath, int nFlag = 0,\n                                 int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);\n    virtual void Begin() {}\n    virtual void End() {}\nprivate:\n\n    CFX_DIBitmap*\tm_pBitmap;\n\n\n\n    int\t\t\t\tm_Width;\n\n    int\t\t\t\tm_Height;\n\n    int\t\t\t\tm_bpp;\n\n    int\t\t\t\tm_RenderCaps;\n\n    int\t\t\t\tm_DeviceClass;\n\n    FX_RECT\t\t\tm_ClipBox;\n\nprotected:\n\n    IFX_RenderDeviceDriver*\tm_pDeviceDriver;\nprivate:\n\n    void\t\t\tInitDeviceInfo();\n\n    void\t\t\tUpdateClipBox();\n};\nclass CFX_FxgeDevice : public CFX_RenderDevice\n{\npublic:\n\n    CFX_FxgeDevice();\n\n    ~CFX_FxgeDevice();\n\n    FX_BOOL\t\t\tAttach(CFX_DIBitmap* pBitmap, int dither_bits = 0, FX_BOOL bRgbByteOrder = FALSE, CFX_DIBitmap* pOriDevice = NULL, FX_BOOL bGroupKnockout = FALSE);\n\n    FX_BOOL\t\t\tCreate(int width, int height, FXDIB_Format format, int dither_bits = 0, CFX_DIBitmap* pOriDevice = NULL);\nprotected:\n\n    FX_BOOL\t\t\tm_bOwnedBitmap;\n};\nclass CFX_SkiaDevice : public CFX_RenderDevice\n{\npublic:\n\n    CFX_SkiaDevice();\n\n    ~CFX_SkiaDevice();\n\n    FX_BOOL\t\t\tAttach(CFX_DIBitmap* pBitmap, int dither_bits = 0, FX_BOOL bRgbByteOrder = FALSE, CFX_DIBitmap* pOriDevice = NULL, FX_BOOL bGroupKnockout = FALSE);\n\n    FX_BOOL\t\t\tCreate(int width, int height, FXDIB_Format format, int dither_bits = 0, CFX_DIBitmap* pOriDevice = NULL);\nprotected:\n\n    FX_BOOL\t\t\tm_bOwnedBitmap;\n};\nclass IFX_RenderDeviceDriver : public CFX_Object\n{\npublic:\n\n    static IFX_RenderDeviceDriver*\t\tCreateFxgeDriver(CFX_DIBitmap* pBitmap, FX_BOOL bRgbByteOrder = FALSE,\n            CFX_DIBitmap* pOriDevice = NULL, FX_BOOL bGroupKnockout = FALSE);\n\n    virtual ~IFX_RenderDeviceDriver() {}\n    virtual void Begin() { }\n    virtual void End() { }\n\n    virtual int\t\tGetDeviceCaps(int caps_id) = 0;\n\n    virtual CFX_Matrix\tGetCTM() const\n    {\n        return CFX_Matrix();\n    }\n\n    virtual FX_BOOL IsPSPrintDriver()\n    {\n        return FALSE;\n    }\n\n    virtual FX_BOOL\tStartRendering()\n    {\n        return TRUE;\n    }\n\n    virtual void\tEndRendering() {}\n\n\n\n\n    virtual void\tSaveState() = 0;\n\n    virtual void\tRestoreState(FX_BOOL bKeepSaved = FALSE) = 0;\n\n\n    virtual FX_BOOL\tSetClip_PathFill(const CFX_PathData* pPathData,\n                                     const CFX_AffineMatrix* pObject2Device,\n                                     int fill_mode\n                                    ) = 0;\n\n    virtual FX_BOOL\tSetClip_PathStroke(const CFX_PathData* pPathData,\n                                       const CFX_AffineMatrix* pObject2Device,\n                                       const CFX_GraphStateData* pGraphState\n                                      )\n    {\n        return FALSE;\n    }\n\n    virtual FX_BOOL\tDrawPath(const CFX_PathData* pPathData,\n                             const CFX_AffineMatrix* pObject2Device,\n                             const CFX_GraphStateData* pGraphState,\n                             FX_DWORD fill_color,\n                             FX_DWORD stroke_color,\n                             int fill_mode,\n                             int alpha_flag = 0,\n                             void* pIccTransform = NULL,\n                             int blend_type = FXDIB_BLEND_NORMAL\n                            ) = 0;\n\n    virtual FX_BOOL\tSetPixel(int x, int y, FX_DWORD color,\n                             int alpha_flag = 0, void* pIccTransform = NULL)\n    {\n        return FALSE;\n    }\n\n    virtual FX_BOOL FillRect(const FX_RECT* pRect, FX_DWORD fill_color,\n                             int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL)\n    {\n        return FALSE;\n    }\n\n    virtual FX_BOOL\tDrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,\n                                     int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL)\n    {\n        return FALSE;\n    }\n\n    virtual FX_BOOL GetClipBox(FX_RECT* pRect) = 0;\n\n    virtual FX_BOOL\tGetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL, FX_BOOL bDEdge = FALSE)\n    {\n        return FALSE;\n    }\n    virtual CFX_DIBitmap*   GetBackDrop()\n    {\n        return NULL;\n    }\n\n    virtual FX_BOOL\tSetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect,\n                              int dest_left, int dest_top, int blend_type,\n                              int alpha_flag = 0, void* pIccTransform = NULL) = 0;\n\n    virtual FX_BOOL\tStretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,\n                                  int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,\n                                  int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL) = 0;\n\n    virtual FX_BOOL\tStartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,\n                                const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle,\n                                int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL) = 0;\n\n    virtual FX_BOOL\tContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause)\n    {\n        return FALSE;\n    }\n\n    virtual void\tCancelDIBits(FX_LPVOID handle) {}\n\n    virtual FX_BOOL DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,\n                                   CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,\n                                   int alpha_flag = 0, void* pIccTransform = NULL)\n    {\n        return FALSE;\n    }\n\n    virtual void*\tGetPlatformSurface()\n    {\n        return NULL;\n    }\n\n    virtual int\t\tGetDriverType()\n    {\n        return 0;\n    }\n\n    virtual void    ClearDriver() {}\n};\nclass IFX_PSOutput\n{\npublic:\n\n    virtual void\tOutputPS(FX_LPCSTR string, int len) = 0;\n    virtual void  Release() = 0;\n};\nclass CPSFont;\nclass CFX_PSRenderer : public CFX_Object\n{\npublic:\n\n    CFX_PSRenderer();\n\n    ~CFX_PSRenderer();\n\n    void\t\t\tInit(IFX_PSOutput* pOutput, int ps_level, int width, int height, FX_BOOL bCmykOutput);\n    FX_BOOL\t\t\tStartRendering();\n    void\t\t\tEndRendering();\n\n    void\t\t\tSaveState();\n\n    void\t\t\tRestoreState(FX_BOOL bKeepSaved = FALSE);\n\n    void\t\t\tSetClip_PathFill(const CFX_PathData* pPathData,\n                                     const CFX_AffineMatrix* pObject2Device,\n                                     int fill_mode\n                           );\n\n    void\t\t\tSetClip_PathStroke(const CFX_PathData* pPathData,\n                                       const CFX_AffineMatrix* pObject2Device,\n                                       const CFX_GraphStateData* pGraphState\n                             );\n\n    FX_RECT\t\t\tGetClipBox()\n    {\n        return m_ClipBox;\n    }\n\n    FX_BOOL\t\t\tDrawPath(const CFX_PathData* pPathData,\n                             const CFX_AffineMatrix* pObject2Device,\n                             const CFX_GraphStateData* pGraphState,\n                             FX_DWORD fill_color,\n                             FX_DWORD stroke_color,\n                             int fill_mode,\n                             int alpha_flag = 0,\n                             void* pIccTransform = NULL\n                      );\n\n    FX_BOOL\t\t\tSetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,\n                              int alpha_flag = 0, void* pIccTransform = NULL);\n\n    FX_BOOL\t\t\tStretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,\n                                  int dest_width, int dest_height, FX_DWORD flags,\n                                  int alpha_flag = 0, void* pIccTransform = NULL);\n\n    FX_BOOL\t\t\tDrawDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color,\n                               const CFX_AffineMatrix* pMatrix, FX_DWORD flags,\n                               int alpha_flag = 0, void* pIccTransform = NULL);\n\n    FX_BOOL\t\t\tDrawText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont, CFX_FontCache* pCache,\n                             const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,\n                             int alpha_flag = 0, void* pIccTransform = NULL);\nprivate:\n\n    IFX_PSOutput*\tm_pOutput;\n\n    int\t\t\t\tm_PSLevel;\n\n    CFX_GraphStateData\tm_CurGraphState;\n\n    FX_BOOL\t\t\tm_bGraphStateSet;\n\n    FX_BOOL\t\t\tm_bCmykOutput;\n\n    FX_BOOL\t\t\tm_bColorSet;\n\n    FX_DWORD\t\tm_LastColor;\n\n    FX_RECT\t\t\tm_ClipBox;\n\n    CFX_ArrayTemplate<CPSFont*>\tm_PSFontList;\n\n    CFX_ArrayTemplate<FX_RECT>\tm_ClipBoxStack;\n    FX_BOOL\t\t\tm_bInited;\n\n    void\t\t\tOutputPath(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device);\n\n    void\t\t\tSetGraphState(const CFX_GraphStateData* pGraphState);\n\n    void\t\t\tSetColor(FX_DWORD color, int alpha_flag, void* pIccTransform);\n\n    void\t\t\tFindPSFontGlyph(CFX_FaceCache* pFaceCache, CFX_Font* pFont, const FXTEXT_CHARPOS& charpos, int& ps_fontnum, int &ps_glyphindex);\n\n    void\t\t\tWritePSBinary(FX_LPCBYTE data, int len);\n};\n#endif\n"
  },
  {
    "path": "core/include/fxge/fx_ge_apple.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_GE_APPLE_H_\n#define _FX_GE_APPLE_H_\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\nclass CFX_QuartzDevice : public CFX_RenderDevice\n{\npublic:\n    CFX_QuartzDevice();\n    ~CFX_QuartzDevice();\n    FX_BOOL Attach(CGContextRef context, FX_INT32 nDeviceClass = FXDC_DISPLAY);\n    FX_BOOL Attach(CFX_DIBitmap* pBitmap);\n    FX_BOOL Create(FX_INT32 width, FX_INT32 height, FXDIB_Format format);\n\n    CGContextRef GetContext();\n\nprotected:\n    CGContextRef m_pContext;\n    FX_BOOL m_bOwnedBitmap;\n};\n#endif\n#endif\n"
  },
  {
    "path": "core/include/fxge/fx_ge_win32.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_GE_WIN32_H_\n#define _FX_GE_WIN32_H_\n#ifdef _WIN32\n#ifndef _WINDOWS_\n#include <windows.h>\n#endif\n#define WINDIB_OPEN_MEMORY    0x1\n#define WINDIB_OPEN_PATHNAME  0x2\ntypedef struct  WINDIB_Open_Args_ {\n\n    int         flags;\n\n    const FX_BYTE*  memory_base;\n\n    size_t    memory_size;\n\n    FX_LPCWSTR  path_name;\n} WINDIB_Open_Args_;\nclass CFX_WindowsDIB : public CFX_DIBitmap\n{\npublic:\n\n    static CFX_ByteString\tGetBitmapInfo(const CFX_DIBitmap* pBitmap);\n\n    static CFX_DIBitmap* LoadFromBuf(BITMAPINFO* pbmi, void* pData);\n\n    static HBITMAP\t\tGetDDBitmap(const CFX_DIBitmap* pBitmap, HDC hDC);\n\n    static CFX_DIBitmap* LoadFromDDB(HDC hDC, HBITMAP hBitmap, FX_DWORD* pPalette = NULL, FX_DWORD size = 256);\n\n    static CFX_DIBitmap* LoadFromFile(FX_LPCWSTR filename);\n\n    static CFX_DIBitmap* LoadFromFile(FX_LPCSTR filename)\n    {\n        return LoadFromFile(CFX_WideString::FromLocal(filename));\n    }\n\n    static CFX_DIBitmap* LoadDIBitmap(WINDIB_Open_Args_ args);\n\n    CFX_WindowsDIB(HDC hDC, int width, int height);\n\n    ~CFX_WindowsDIB();\n\n    HDC\t\t\t\t\tGetDC() const\n    {\n        return m_hMemDC;\n    }\n\n    HBITMAP\t\t\t\tGetWindowsBitmap() const\n    {\n        return m_hBitmap;\n    }\n\n    void\t\t\t\tLoadFromDevice(HDC hDC, int left, int top);\n\n    void\t\t\t\tSetToDevice(HDC hDC, int left, int top);\nprotected:\n\n    HDC\t\t\t\t\tm_hMemDC;\n\n    HBITMAP\t\t\t\tm_hBitmap;\n\n    HBITMAP\t\t\t\tm_hOldBitmap;\n};\nclass CFX_WindowsDevice : public CFX_RenderDevice\n{\npublic:\n    static IFX_RenderDeviceDriver*\tCreateDriver(HDC hDC, FX_BOOL bCmykOutput = FALSE);\n\n    CFX_WindowsDevice(HDC hDC, FX_BOOL bCmykOutput = FALSE, FX_BOOL bForcePSOutput = FALSE, int psLevel = 2);\n\n    HDC\t\tGetDC() const;\n\n    FX_BOOL m_bForcePSOutput;\n\n    static int m_psLevel;\n};\nclass CFX_WinBitmapDevice : public CFX_RenderDevice\n{\npublic:\n\n    CFX_WinBitmapDevice(int width, int height, FXDIB_Format format);\n\n    ~CFX_WinBitmapDevice();\n\n    HDC\t\tGetDC()\n    {\n        return m_hDC;\n    }\nprotected:\n\n    HBITMAP\tm_hBitmap;\n\n    HBITMAP m_hOldBitmap;\n\n    HDC\t\tm_hDC;\n};\n#endif\n#endif\n"
  },
  {
    "path": "core/include/reflow/fpdf_layout.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDFAPI_LAYOUT_H_\n#define _FPDFAPI_LAYOUT_H_\nclass IPDF_LayoutElement;\nclass IPDF_LayoutProcessor;\nclass IPDF_LayoutProvider;\ntypedef enum {\n    LayoutUnknown,\n    LayoutArifact,\n    LayoutDocument,\n    LayoutPart,\n    LayoutArt,\n    LayoutSect,\n    LayoutDiv,\n    LayoutBlockQuote,\n    LayoutCaption,\n    LayoutTOC,\n    LayoutTOCI,\n    LayoutIndex,\n    LayoutNonStruct,\n    LayoutPrivate,\n    LayoutParagraph,\n    LayoutHeading,\n    LayoutHeading1,\n    LayoutHeading2,\n    LayoutHeading3,\n    LayoutHeading4,\n    LayoutHeading5,\n    LayoutHeading6,\n    LayoutList,\n    LayoutListItem,\n    LayoutListLabel,\n    LayoutListBody,\n    LayoutTable,\n    LayoutTableRow,\n    LayoutTableHeaderCell,\n    LayoutTableDataCell,\n    LayoutTableHeaderGroup,\n    LayoutTableBodyGroup,\n    LayoutTableFootGroup,\n    LayoutSpan,\n    LayoutQuote,\n    LayoutNote,\n    LayoutReference,\n    LayoutBibEntry,\n    LayoutCode,\n    LayoutLink,\n    LayoutAnnot,\n    LayoutRuby,\n    LayoutRubyBase,\n    LayoutRubyAnnot,\n    LayoutRubyPunc,\n    LayoutWarichu,\n    LayoutWarichuText,\n    LayoutWarichuPunc,\n    LayoutFigure,\n    LayoutFormula,\n    LayoutForm,\n} LayoutType;\ntypedef enum {\n    LayoutArtifactType,\n    LayoutArtifactAttached,\n    LayoutArtifactSubType,\n    LayoutPlacement,\n    LayoutWritingMode,\n    LayoutBackgroundColor,\n    LayoutBorderColor,\n    LayoutBorderStyle,\n    LayoutBorderThickness,\n    LayoutPadding,\n    LayoutColor,\n    LayoutSpaceBefore,\n    LayoutSpaceAfter,\n    LayoutStartIndent,\n    LayoutEndIndent,\n    LayoutTextIndent,\n    LayoutTextAlign,\n    LayoutBBox,\n    LayoutWidth,\n    LayoutHeight,\n    LayoutBlockAlign,\n    LayoutInlineAlign,\n    LayoutTBorderStyle,\n    LayoutTPadding,\n    LayoutBaselineShift,\n    LayoutLineHeight,\n    LayoutTextDecorationColor,\n    LayoutTextDecorationThickness,\n    LayoutTextDecorationType,\n    LayoutRubyAlign,\n    LayoutRubyPosition,\n    LayoutGlyphOrientationVertical,\n    LayoutColumnCount,\n    LayoutColumnGap,\n    LayoutColumnWidths,\n    LayoutListNumbering,\n    LayoutFieldRole,\n    LayoutFieldChecked,\n    LayoutFieldDesc,\n    LayoutRowSpan,\n    LayoutColSpan,\n    LayoutTableHeaders,\n    LayoutTableHeaderScope,\n    LayoutTableSummary,\n} LayoutAttr;\ntypedef enum {\n    LayoutInvalid = 0,\n    LayoutBlock,\n    LayoutInline,\n    LayoutBefore,\n    LayoutAfter,\n    LayoutStart,\n    LayoutEnd,\n    LayoutLrTb,\n    LayoutRlTb,\n    LayoutTbRl,\n    LayoutNone,\n    LayoutHidden,\n    LayoutDotted,\n    LayoutDashed,\n    LayoutSolid,\n    LayoutDouble,\n    LayoutGroove,\n    LayoutRidge,\n    LayoutInset,\n    LayoutOutset,\n    LayoutNormal,\n    LayoutAuto,\n    LayoutCenter,\n    LayoutJustify,\n    LayoutMiddle,\n    LayoutUnderline,\n    LayoutOverline,\n    LayoutLineThrough,\n    LayoutDistribute,\n    LayoutMinus90Degree,\n    LayoutZeroDegree,\n    Layout90Degree,\n    Layout180Degree,\n    Layout270Degree,\n    LayoutDisc,\n    LayoutCircle,\n    LayoutSquare,\n    LayoutDecimal,\n    LayoutUpperRoman,\n    LayoutLowerRoman,\n    LayoutUpperAlpha,\n    LayoutLowerAlpha,\n    LayoutRB,\n    LayoutCB,\n    LayoutPB,\n    LayoutTV,\n    LayoutOn,\n    LayoutOff,\n    LayoutNeutral,\n    LayoutRow,\n    LayoutColumn,\n    LayoutBoth,\n    LayoutLeft,\n    LayoutTop,\n    LayoutBottom,\n    LayoutRight,\n    LayoutPagination,\n    LayoutLayout,\n    LayoutPage,\n    LayoutBackground,\n    LayoutHeader,\n    LayoutFooter,\n    LayoutWatermark,\n} LayoutEnum;\nclass IPDF_LayoutElement\n{\npublic:\n\n    virtual ~IPDF_LayoutElement() {};\n\n\n    virtual LayoutType\tGetType() = 0;\n\n    virtual int\t\tCountAttrValues(LayoutAttr attr_type) = 0;\n\n\n    virtual LayoutEnum\tGetEnumAttr(LayoutAttr attr_type, int index = 0) = 0;\n\n    virtual FX_FLOAT\tGetNumberAttr(LayoutAttr attr_type, int index = 0) = 0;\n\n    virtual FX_COLORREF\tGetColorAttr(LayoutAttr attr_type, int index = 0) = 0;\n\n\n    virtual int\t\tCountChildren() = 0;\n\n\n    virtual IPDF_LayoutElement* GetChild(int index) = 0;\n\n\n    virtual IPDF_LayoutElement* GetParent() = 0;\n\n\n    virtual int\t\tCountObjects() = 0;\n\n    virtual CPDF_PageObject*\tGetObject(int index) = 0;\n};\ntypedef enum {\n    LayoutReady,\n    LayoutFinished,\n    LayoutToBeContinued,\n    LayoutError\n} LayoutStatus;\n#define RF_PARSER_IMAGE\t\t0x1\n#define RF_PARSER_DEBUGINFO\t0x2\n#define RF_PARSER_PAGEMODE\t0x4\n#define RF_PARSER_READERORDER\t0x8\nclass IPDF_LayoutProcessor\n{\npublic:\n\n    virtual ~IPDF_LayoutProcessor() {};\n\n    static IPDF_LayoutProcessor* Create_LayoutProcessor_Reflow(FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, void* pReflowedPage, int flags, FX_FLOAT lineSpace = 0);\n\n    static IPDF_LayoutProcessor* Create_LayoutProcessor_2HTML(FX_LPCSTR fileName);\n\n    virtual LayoutStatus\tStartProcess(IPDF_LayoutElement* pElement, IFX_Pause* pPause, const CFX_AffineMatrix* pPDFMatrix = NULL) = 0;\n\n    virtual LayoutStatus\tContinue() = 0;\n    virtual int\t\t\t\tGetPosition() = 0;\n};\n#define LP_Lang_Unknow\t \t\t0x0\n#define LP_Lang_English\t \t\t0x1\n#define LP_Lang_French\t\t\t0x2\n#define LP_Lang_Italian\t\t\t0x4\n#define LP_Lang_German\t\t\t0x8\n#define LP_Lang_Spanish\t\t\t0x10\n#define LP_Lang_Polish\t\t\t0x20\n#define LP_Lang_Russian\t\t\t0x40\n#define LP_Lang_ChinesePRC\t\t0x80\n#define LP_Lang_ChineseTaiwan\t0x100\n#define LP_Lang_Japanese\t\t0x200\n#define LP_Lang_Korean\t\t\t0x400\n#define LP_Lang_Portuguese\t\t0x800\n#define LP_Lang_Turkish\t\t\t0x1000\n#define LP_Lang_Dutch\t\t\t0x2000\ntypedef struct _LayoutProviderStyle {\n    _LayoutProviderStyle()\n    {\n        m_Language = LP_Lang_Unknow;\n        m_bIgnoreInvisibleText = TRUE;\n    }\n    FX_INT32\tm_Language;\n    FX_BOOL\t\tm_bIgnoreInvisibleText;\n} LAYOUTPROVIDER_STYLE;\nclass IPDF_LayoutProvider\n{\npublic:\n\n    virtual ~IPDF_LayoutProvider() {};\n\n    static IPDF_LayoutProvider* Create_LayoutProvider_TaggedPDF(CPDF_PageObjects* pPageObjs);\n\n    static IPDF_LayoutProvider* Create_LayoutProvider_AutoReflow(CPDF_PageObjects* pPageObjs, FX_BOOL bReadOrder);\n\n    virtual void\t\t\tSetLayoutProviderStyle(LAYOUTPROVIDER_STYLE Style) = 0;\n\n\n\n\n    virtual LayoutStatus\tStartLoad(IFX_Pause* pPause = NULL) = 0;\n\n    virtual LayoutStatus\tContinue() = 0;\n    virtual int\t\t\t\tGetPosition() = 0;\n\n\n    virtual IPDF_LayoutElement* GetRoot() = 0;\n};\n#endif\n"
  },
  {
    "path": "core/include/reflow/reflowengine.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _REFLOW_ENGINE_H\n#define _REFLOW_ENGINE_H\n#include \"../fpdfapi/fpdf_render.h\"\n#include \"../fpdftext/fpdf_text.h\"\n#include \"fpdf_layout.h\"\n#include \"../fpdfapi/fpdf_pageobj.h\"\n#include \"../fpdfdoc/fpdf_tagged.h\"\nclass IPDF_ReflowedPage\n{\npublic:\n    static IPDF_ReflowedPage* Create();\n\n    virtual ~IPDF_ReflowedPage() {}\n    virtual CFX_PrivateData*\tGetPrivateDataCtrl() = 0;\n\n\n    virtual void\t\tGetDisplayMatrix(CFX_AffineMatrix& matrix, FX_INT32 xPos, FX_INT32 yPos, FX_INT32 xSize, FX_INT32 ySize, FX_INT32 iRotate, const CFX_AffineMatrix* pPageMatrix) = 0;\n    virtual FX_FLOAT\tGetPageHeight() = 0;\n    virtual FX_FLOAT\tGetPageWidth() = 0;\n    virtual void\t\tFocusGetData(const CFX_AffineMatrix matrix, FX_INT32 x, FX_INT32 y, CFX_ByteString& str) = 0;\n    virtual FX_BOOL\t\tFocusGetPosition(const CFX_AffineMatrix matrix, CFX_ByteString str, FX_INT32& x, FX_INT32& y) = 0;\n};\ntypedef struct _RF_ParseStyle {\n    _RF_ParseStyle()\n    {\n        m_LineSpace = 0;\n    };\n    FX_FLOAT m_LineSpace;\n} RF_ParseStyle;\nclass IPDF_ProgressiveReflowPageParser\n{\npublic:\n    static IPDF_ProgressiveReflowPageParser* Create();\n    static FX_BOOL\tIsTaggedPage(CPDF_PageObjects*pPage);\n\n    virtual ~IPDF_ProgressiveReflowPageParser() {}\n    typedef enum { Ready, ToBeContinued, Done, Failed } ParseStatus;\n\n    virtual ParseStatus\t\tGetStatus() = 0;\n    virtual void\t\t\tSetParserStyle(RF_ParseStyle style) = 0;\n    virtual void\t\t\tStart(IPDF_ReflowedPage* pReflowPage, CPDF_Page* pPage, FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, IFX_Pause* pPause, int flags) = 0;\n    virtual void\t\t\tContinue(IFX_Pause* pPause) = 0;\n\n    virtual int\t\t\t\tGetPosition() = 0;\n\n\n    virtual void\t\t\tClear() = 0;\n};\nclass IPDF_ProgressiveReflowPageRender\n{\npublic:\n    static IPDF_ProgressiveReflowPageRender* Create();\n\n    virtual ~IPDF_ProgressiveReflowPageRender() {}\n    typedef enum { Ready, ToBeContinued, Waiting, Done, Failed } RenderStatus;\n\n    virtual RenderStatus\tGetStatus() = 0;\n\n\n    virtual void\t\tStart(IPDF_ReflowedPage* pReflowPage, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pMatrix, IFX_Pause* pPause, int DitherBits ) = 0;\n    virtual void\t\tContinue(IFX_Pause* pPause) = 0;\n    virtual int\t\t\tGetPosition() = 0;\n\n\n    virtual void\t\t\t\tClear() = 0;\n};\nIPDF_ReflowedPage* Create_ReflowPage();\nIPDF_ProgressiveReflowPageParser* Create_ReflowPageParser();\nIPDF_ProgressiveReflowPageRender* Create_ReflowPageRender();\n#endif\n"
  },
  {
    "path": "core/include/thirdparties/freetype/foxitnames.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_FREETYPE_DONT_RENAME_\n// To avoid any possible linking confliction, we rename all FreeType exported names\n\n#define FT_Init_FreeType FPDFAPI_FT_Init_FreeType\n#define FT_Done_FreeType FPDFAPI_FT_Done_FreeType\n#define FT_New_Face\t\tFPDFAPI_FT_New_Face\n#define FT_Select_Charmap FPDFAPI_FT_Select_Charmap \n#define FT_Done_Face FPDFAPI_FT_Done_Face \n#define FT_Get_Charmap_Index FPDFAPI_FT_Get_Charmap_Index \n#define FT_New_Memory_Face FPDFAPI_FT_New_Memory_Face \n#define FT_MulDiv FPDFAPI_FT_MulDiv \n#define FT_Vector_Transform FPDFAPI_FT_Vector_Transform \n#define FT_Cos FPDFAPI_FT_Cos \n#define FT_Sin FPDFAPI_FT_Sin \n#define FT_Load_Glyph FPDFAPI_FT_Load_Glyph \n#define FT_DivFix FPDFAPI_FT_DivFix \n#define FT_Realloc FPDFAPI_FT_Realloc \n#define FT_Alloc FPDFAPI_FT_Alloc \n#define FT_Get_Char_Index FPDFAPI_FT_Get_Char_Index \n#define FT_GlyphLoader_CheckPoints FPDFAPI_FT_GlyphLoader_CheckPoints \n#define FT_GlyphLoader_Add FPDFAPI_FT_GlyphLoader_Add \n#define FT_GlyphLoader_CheckSubGlyphs FPDFAPI_FT_GlyphLoader_CheckSubGlyphs \n#define FT_Outline_Translate FPDFAPI_FT_Outline_Translate \n#define FT_Outline_Transform FPDFAPI_FT_Outline_Transform \n#define FT_Outline_Get_CBox FPDFAPI_FT_Outline_Get_CBox \n#define FT_GlyphLoader_Rewind FPDFAPI_FT_GlyphLoader_Rewind \n#define FT_GlyphLoader_CopyPoints FPDFAPI_FT_GlyphLoader_CopyPoints \n#define FT_GlyphLoader_New FPDFAPI_FT_GlyphLoader_New \n#define FT_GlyphLoader_CreateExtra FPDFAPI_FT_GlyphLoader_CreateExtra \n#define FT_Free FPDFAPI_FT_Free \n#define FT_Set_Charmap FPDFAPI_FT_Set_Charmap \n#define FT_GlyphLoader_Done FPDFAPI_FT_GlyphLoader_Done \n#define _debug_mem_dummy FPDFAPI__debug_mem_dummy \n#define _debug_mem_dummy FPDFAPI__debug_mem_dummy \n#define FT_QAlloc FPDFAPI_FT_QAlloc \n#define FT_QRealloc FPDFAPI_FT_QRealloc \n#define FT_List_Find FPDFAPI_FT_List_Find \n#define FT_List_Add FPDFAPI_FT_List_Add \n#define FT_List_Insert FPDFAPI_FT_List_Insert \n#define FT_List_Remove FPDFAPI_FT_List_Remove \n#define FT_List_Up FPDFAPI_FT_List_Up \n#define FT_List_Iterate FPDFAPI_FT_List_Iterate \n#define FT_List_Finalize FPDFAPI_FT_List_Finalize \n#define ft_highpow2 FPDFAPI_ft_highpow2 \n#define FT_Stream_OpenMemory FPDFAPI_FT_Stream_OpenMemory \n#define FT_Stream_Close FPDFAPI_FT_Stream_Close \n#define FT_Stream_Seek FPDFAPI_FT_Stream_Seek \n#define FT_Stream_Skip FPDFAPI_FT_Stream_Skip \n#define FT_Stream_Pos FPDFAPI_FT_Stream_Pos \n#define FT_Stream_ReadAt FPDFAPI_FT_Stream_ReadAt \n#define FT_Stream_Read FPDFAPI_FT_Stream_Read \n#define FT_Stream_TryRead FPDFAPI_FT_Stream_TryRead \n#define FT_Stream_EnterFrame FPDFAPI_FT_Stream_EnterFrame \n#define FT_Stream_ExtractFrame FPDFAPI_FT_Stream_ExtractFrame \n#define FT_Stream_ReleaseFrame FPDFAPI_FT_Stream_ReleaseFrame \n#define FT_Stream_ExitFrame FPDFAPI_FT_Stream_ExitFrame \n#define FT_Stream_GetChar FPDFAPI_FT_Stream_GetChar \n#define FT_Stream_GetShort FPDFAPI_FT_Stream_GetShort \n#define FT_Stream_GetShortLE FPDFAPI_FT_Stream_GetShortLE \n#define FT_Stream_GetOffset FPDFAPI_FT_Stream_GetOffset \n#define FT_Stream_GetLong FPDFAPI_FT_Stream_GetLong \n#define FT_Stream_GetLongLE FPDFAPI_FT_Stream_GetLongLE \n#define FT_Stream_ReadChar FPDFAPI_FT_Stream_ReadChar \n#define FT_Stream_ReadShort FPDFAPI_FT_Stream_ReadShort \n#define FT_Stream_ReadShortLE FPDFAPI_FT_Stream_ReadShortLE \n#define FT_Stream_ReadOffset FPDFAPI_FT_Stream_ReadOffset \n#define FT_Stream_ReadLong FPDFAPI_FT_Stream_ReadLong \n#define FT_Stream_ReadLongLE FPDFAPI_FT_Stream_ReadLongLE \n#define FT_Stream_ReadFields FPDFAPI_FT_Stream_ReadFields \n#define FT_RoundFix FPDFAPI_FT_RoundFix \n#define FT_CeilFix FPDFAPI_FT_CeilFix \n#define FT_FloorFix FPDFAPI_FT_FloorFix \n#define FT_Sqrt32 FPDFAPI_FT_Sqrt32 \n#define FT_SqrtFixed FPDFAPI_FT_SqrtFixed \n#define FT_Tan FPDFAPI_FT_Tan \n#define FT_Atan2 FPDFAPI_FT_Atan2 \n#define FT_Vector_Unit FPDFAPI_FT_Vector_Unit \n#define FT_Vector_Rotate FPDFAPI_FT_Vector_Rotate \n#define FT_Vector_Length FPDFAPI_FT_Vector_Length \n#define FT_Vector_Polarize FPDFAPI_FT_Vector_Polarize \n#define FT_Vector_From_Polar FPDFAPI_FT_Vector_From_Polar \n#define FT_Angle_Diff FPDFAPI_FT_Angle_Diff \n#define FT_Outline_Decompose FPDFAPI_FT_Outline_Decompose \n#define FT_Outline_Done_Internal FPDFAPI_FT_Outline_Done_Internal \n#define FT_Outline_New_Internal FPDFAPI_FT_Outline_New_Internal \n#define FT_Outline_New FPDFAPI_FT_Outline_New \n#define FT_Outline_Check FPDFAPI_FT_Outline_Check \n#define FT_Outline_Copy FPDFAPI_FT_Outline_Copy \n#define FT_Outline_Done FPDFAPI_FT_Outline_Done \n#define FT_Outline_Reverse FPDFAPI_FT_Outline_Reverse \n#define FT_Set_Renderer FPDFAPI_FT_Set_Renderer \n#define FT_Lookup_Renderer FPDFAPI_FT_Lookup_Renderer \n#define FT_Outline_Render FPDFAPI_FT_Outline_Render \n#define FT_Outline_Get_Bitmap FPDFAPI_FT_Outline_Get_Bitmap \n#define FT_Outline_Get_Orientation FPDFAPI_FT_Outline_Get_Orientation \n#define FT_Outline_Embolden FPDFAPI_FT_Outline_Embolden \n#define FT_GlyphLoader_Reset FPDFAPI_FT_GlyphLoader_Reset \n#define FT_GlyphLoader_Prepare FPDFAPI_FT_GlyphLoader_Prepare \n#define ft_service_list_lookup FPDFAPI_ft_service_list_lookup \n#define ft_validator_init FPDFAPI_ft_validator_init \n#define ft_validator_run FPDFAPI_ft_validator_run \n#define ft_validator_error FPDFAPI_ft_validator_error \n#define FT_Stream_New FPDFAPI_FT_Stream_New \n#define FT_Stream_Free FPDFAPI_FT_Stream_Free \n#define ft_glyphslot_free_bitmap FPDFAPI_ft_glyphslot_free_bitmap \n#define ft_glyphslot_set_bitmap FPDFAPI_ft_glyphslot_set_bitmap \n#define FT_GlyphSlot_Own_Bitmap FPDFAPI_FT_GlyphSlot_Own_Bitmap\n#define ft_glyphslot_alloc_bitmap FPDFAPI_ft_glyphslot_alloc_bitmap \n#define FT_New_GlyphSlot FPDFAPI_FT_New_GlyphSlot \n#define FT_Done_GlyphSlot FPDFAPI_FT_Done_GlyphSlot \n#define FT_Set_Transform FPDFAPI_FT_Set_Transform \n#define FT_Render_Glyph_Internal FPDFAPI_FT_Render_Glyph_Internal \n#define FT_Render_Glyph FPDFAPI_FT_Render_Glyph \n#define FT_Load_Char FPDFAPI_FT_Load_Char \n#define FT_New_Size FPDFAPI_FT_New_Size \n#define FT_Open_Face FPDFAPI_FT_Open_Face \n#define FT_Attach_Stream FPDFAPI_FT_Attach_Stream \n#define FT_Attach_File FPDFAPI_FT_Attach_File \n#define FT_Done_Size FPDFAPI_FT_Done_Size \n#define FT_Set_Char_Size FPDFAPI_FT_Set_Char_Size \n#define FT_Set_Pixel_Sizes FPDFAPI_FT_Set_Pixel_Sizes \n#define FT_Get_Kerning FPDFAPI_FT_Get_Kerning \n#define FT_CMap_Done FPDFAPI_FT_CMap_Done \n#define FT_CMap_New FPDFAPI_FT_CMap_New \n#define FT_Get_Next_Char FPDFAPI_FT_Get_Next_Char \n#define FT_Get_First_Char FPDFAPI_FT_Get_First_Char \n#define FT_Get_Name_Index FPDFAPI_FT_Get_Name_Index \n#define FT_Get_Glyph_Name FPDFAPI_FT_Get_Glyph_Name \n#define FT_Get_Postscript_Name FPDFAPI_FT_Get_Postscript_Name \n#define FT_Get_Sfnt_Table FPDFAPI_FT_Get_Sfnt_Table \n#define FT_Load_Sfnt_Table FPDFAPI_FT_Load_Sfnt_Table \n#define FT_Sfnt_Table_Info FPDFAPI_FT_Sfnt_Table_Info \n#define FT_Get_CMap_Language_ID FPDFAPI_FT_Get_CMap_Language_ID \n#define FT_Activate_Size FPDFAPI_FT_Activate_Size \n#define FT_Get_Renderer FPDFAPI_FT_Get_Renderer \n#define FT_Remove_Module FPDFAPI_FT_Remove_Module \n#define FT_Add_Module FPDFAPI_FT_Add_Module \n#define FT_Get_Module FPDFAPI_FT_Get_Module \n#define FT_Get_Module_Interface FPDFAPI_FT_Get_Module_Interface \n#define ft_module_get_service FPDFAPI_ft_module_get_service \n#define FT_New_Library FPDFAPI_FT_New_Library \n#define FT_Library_Version FPDFAPI_FT_Library_Version \n#define FT_Done_Library FPDFAPI_FT_Done_Library \n#define FT_Set_Debug_Hook FPDFAPI_FT_Set_Debug_Hook \n#define FT_Raccess_Get_HeaderInfo FPDFAPI_FT_Raccess_Get_HeaderInfo \n#define FT_Raccess_Get_DataOffsets FPDFAPI_FT_Raccess_Get_DataOffsets \n#define FT_Raccess_Guess FPDFAPI_FT_Raccess_Guess\n#define af_dummy_script_class FPDFAPI_af_dummy_script_class\n#define af_latin_script_class FPDFAPI_af_latin_script_class\n#define af_cjk_script_class FPDFAPI_af_cjk_script_class\n#define af_autofitter_service FPDFAPI_af_autofitter_service\n#define autofit_module_class FPDFAPI_autofit_module_class\n#define cff_cmap_encoding_class_rec FPDFAPI_cff_cmap_encoding_class_rec\n#define cff_cmap_unicode_class_rec FPDFAPI_cff_cmap_unicode_class_rec\n#define cff_driver_class FPDFAPI_cff_driver_class\n#define FT_Stream_Open FPDFAPI_FT_Stream_Open\n#define FT_New_Memory FPDFAPI_FT_New_Memory\n#define FT_Done_Memory FPDFAPI_FT_Done_Memory\n#define ft_mem_qalloc FPDFAPI_ft_mem_qalloc\n#define ft_mem_alloc FPDFAPI_ft_mem_alloc\n#define ft_mem_free FPDFAPI_ft_mem_free\n#define ft_mem_qrealloc FPDFAPI_ft_mem_qrealloc\n#define ft_mem_realloc FPDFAPI_ft_mem_realloc\n#define FT_Get_TrueType_Engine_Type FPDFAPI_FT_Get_TrueType_Engine_Type\n#define ft_stub_set_char_sizes FPDFAPI_ft_stub_set_char_sizes\n#define ft_stub_set_pixel_sizes FPDFAPI_ft_stub_set_pixel_sizes\n#define FT_Get_SubGlyph_Info FPDFAPI_FT_Get_SubGlyph_Info\n#define FT_Get_Sfnt_Name_Count FPDFAPI_FT_Get_Sfnt_Name_Count\n#define FT_Get_Sfnt_Name FPDFAPI_FT_Get_Sfnt_Name\n#define FT_Bitmap_New FPDFAPI_FT_Bitmap_New\n#define FT_Bitmap_Copy FPDFAPI_FT_Bitmap_Copy\n#define FT_Bitmap_Done FPDFAPI_FT_Bitmap_Done\n#define FT_Bitmap_Convert FPDFAPI_FT_Bitmap_Convert\n#define FT_Bitmap_Embolden FPDFAPI_FT_Bitmap_Embolden\n#define ft_bitmap_glyph_class FPDFAPI_ft_bitmap_glyph_class\n#define ft_outline_glyph_class FPDFAPI_ft_outline_glyph_class\n#define FT_Matrix_Multiply FPDFAPI_FT_Matrix_Multiply\n#define FT_Matrix_Invert FPDFAPI_FT_Matrix_Invert\n#define FT_Done_Glyph FPDFAPI_FT_Done_Glyph\n#define FT_Glyph_Copy FPDFAPI_FT_Glyph_Copy\n#define FT_Get_Glyph FPDFAPI_FT_Get_Glyph\n#define FT_Glyph_Transform FPDFAPI_FT_Glyph_Transform\n#define FT_Glyph_Get_CBox FPDFAPI_FT_Glyph_Get_CBox\n#define FT_Glyph_To_Bitmap FPDFAPI_FT_Glyph_To_Bitmap\n#define FT_Add_Default_Modules FPDFAPI_FT_Add_Default_Modules\n#define FT_Get_Multi_Master FPDFAPI_FT_Get_Multi_Master\n#define FT_Get_MM_Var FPDFAPI_FT_Get_MM_Var\n#define FT_Set_MM_Design_Coordinates FPDFAPI_FT_Set_MM_Design_Coordinates\n#define FT_Set_Var_Design_Coordinates FPDFAPI_FT_Set_Var_Design_Coordinates\n#define FT_Set_MM_Blend_Coordinates FPDFAPI_FT_Set_MM_Blend_Coordinates\n#define FT_Set_Var_Blend_Coordinates FPDFAPI_FT_Set_Var_Blend_Coordinates\n#define ps_table_funcs FPDFAPI_ps_table_funcs\n#define ps_parser_funcs FPDFAPI_ps_parser_funcs\n#define t1_builder_funcs FPDFAPI_t1_builder_funcs\n#define t1_decoder_funcs FPDFAPI_t1_decoder_funcs\n#define afm_parser_funcs FPDFAPI_afm_parser_funcs\n#define t1_cmap_classes FPDFAPI_t1_cmap_classes\n#define t1_cmap_standard_class_rec FPDFAPI_t1_cmap_standard_class_rec\n#define t1_cmap_expert_class_rec FPDFAPI_t1_cmap_expert_class_rec\n#define t1_cmap_custom_class_rec FPDFAPI_t1_cmap_custom_class_rec\n#define t1_cmap_unicode_class_rec FPDFAPI_t1_cmap_unicode_class_rec\n#define psaux_module_class FPDFAPI_psaux_module_class\n#define pshinter_module_class FPDFAPI_pshinter_module_class\n#define ps_hints_apply FPDFAPI_ps_hints_apply\n#define psnames_module_class FPDFAPI_psnames_module_class\n#define ft_raster1_renderer_class FPDFAPI_ft_raster1_renderer_class\n#define ft_standard_raster FPDFAPI_ft_standard_raster\n#define ft_raster5_renderer_class FPDFAPI_ft_raster5_renderer_class\n#define tt_cmap0_class_rec FPDFAPI_tt_cmap0_class_rec\n#define tt_cmap2_class_rec FPDFAPI_tt_cmap2_class_rec\n#define tt_cmap4_class_rec FPDFAPI_tt_cmap4_class_rec\n#define tt_cmap6_class_rec FPDFAPI_tt_cmap6_class_rec\n#define tt_cmap8_class_rec FPDFAPI_tt_cmap8_class_rec\n#define tt_cmap10_class_rec FPDFAPI_tt_cmap10_class_rec\n#define tt_cmap12_class_rec FPDFAPI_tt_cmap12_class_rec\n#define tt_cmap13_class_rec FPDFAPI_tt_cmap13_class_rec\n#define tt_cmap14_class_rec FPDFAPI_tt_cmap14_class_rec\n#define sfnt_module_class FPDFAPI_sfnt_module_class\n#define ft_grays_raster FPDFAPI_ft_grays_raster\n#define ft_smooth_renderer_class FPDFAPI_ft_smooth_renderer_class\n#define ft_smooth_lcd_renderer_class FPDFAPI_ft_smooth_lcd_renderer_class\n#define ft_smooth_lcdv_renderer_class FPDFAPI_ft_smooth_lcdv_renderer_class\n#define tt_default_graphics_state FPDFAPI_tt_default_graphics_state\n#define tt_driver_class FPDFAPI_tt_driver_class\n#define TT_RunIns FPDFAPI_TT_RunIns\n#define TT_New_Context FPDFAPI_TT_New_Context\n#define t1_driver_class FPDFAPI_t1_driver_class\n#define t1cid_driver_class FPDFAPI_t1cid_driver_class\n#define FT_Get_Track_Kerning FPDFAPI_FT_Get_Track_Kerning\n#define FT_Match_Size FPDFAPI_FT_Match_Size\n#define FT_MulDiv_No_Round FPDFAPI_FT_MulDiv_No_Round\n#define FT_Request_Metrics FPDFAPI_FT_Request_Metrics\n#define FT_Request_Size FPDFAPI_FT_Request_Size\n#define FT_Select_Metrics FPDFAPI_FT_Select_Metrics\n#define FT_Select_Size FPDFAPI_FT_Select_Size\n#define ft_synthesize_vertical_metrics FPDFAPI_ft_synthesize_vertical_metrics\n#define New_Profile FPDFAPI_New_Profile\n#define End_Profile FPDFAPI_End_Profile\n#define Insert_Y_Turn FPDFAPI_Insert_Y_Turn \n#define Split_Conic FPDFAPI_Split_Conic  \n#define Split_Cubic FPDFAPI_Split_Cubic\n#define Line_Up FPDFAPI_Line_Up \n#define Bezier_Up FPDFAPI_Bezier_Up \n#define Bezier_Down FPDFAPI_Bezier_Down \n#define Line_To FPDFAPI_Line_To\n#define Conic_To FPDFAPI_Conic_To \n#define Cubic_To FPDFAPI_Cubic_To\n#define Decompose_Curve FPDFAPI_Decompose_Curve\n#define Convert_Glyph FPDFAPI_Convert_Glyph \n#define Sort FPDFAPI_Sort \n#define Vertical_Sweep_Init FPDFAPI_Vertical_Sweep_Init \n#define Vertical_Sweep_Span FPDFAPI_Vertical_Sweep_Span \n#define Vertical_Sweep_Drop FPDFAPI_Vertical_Sweep_Drop \n#define Vertical_Sweep_Step FPDFAPI_Vertical_Sweep_Step \n#define Horizontal_Sweep_Init FPDFAPI_Horizontal_Sweep_Init \n#define Horizontal_Sweep_Span FPDFAPI_Horizontal_Sweep_Span \n#define Horizontal_Sweep_Drop FPDFAPI_Horizontal_Sweep_Drop \n#define Horizontal_Sweep_Step FPDFAPI_Horizontal_Sweep_Step \n#define Draw_Sweep FPDFAPI_Draw_Sweep \n#define Render_Single_Pass FPDFAPI_Render_Single_Pass \n#define Render_Glyph FPDFAPI_Render_Glyph  \n#define Finalize_Profile_Table FPDFAPI_Finalize_Profile_Table \n#define InsNew FPDFAPI_InsNew \n#define DelOld FPDFAPI_DelOld\n#define FT_MulFix FPDFAPI_FT_MulFix\n#define FT_Matrix_Multiply_Scaled FPDFAPI_FT_Matrix_Multiply_Scaled\n#define FT_Vector_Transform_Scaled FPDFAPI_FT_Vector_Transform_Scaled\n#define ft_corner_orientation FPDFAPI_ft_corner_orientation\n#define ft_corner_is_flat FPDFAPI_ft_corner_is_flat\n#define FT_Get_CMap_Format FPDFAPI_FT_Get_CMap_Format\n#define ft_mem_strcpyn FPDFAPI_ft_mem_strcpyn\n#define ft_mem_dup FPDFAPI_ft_mem_dup\n#define ft_mem_strdup FPDFAPI_ft_mem_strdup\n#define FT_Face_GetCharVariantIsDefault FPDFAPI_FT_Face_GetCharVariantIsDefault\n#define FT_Face_GetCharsOfVariant FPDFAPI_FT_Face_GetCharsOfVariant\n#define FT_Face_GetVariantsOfChar FPDFAPI_FT_Face_GetVariantsOfChar\n#define FT_Face_GetVariantSelectors FPDFAPI_FT_Face_GetVariantSelectors\n#define FT_Face_GetCharVariantIndex FPDFAPI_FT_Face_GetCharVariantIndex\n#define FT_Get_Advances FPDFAPI_FT_Get_Advances\n#define FT_Get_Advance FPDFAPI_FT_Get_Advance\n#define FT_Library_SetLcdFilter FPDFAPI_FT_Library_SetLcdFilter\n \n#endif // !_FX_FREETYPE_DONT_RENAME_\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/config/ftconfig.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftconfig.h                                                             */\n/*                                                                         */\n/*    ANSI-specific configuration file (specification only).               */\n/*                                                                         */\n/*  Copyright 1996-2004, 2006-2008, 2010-2011, 2013 by                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This header file contains a number of macro definitions that are used */\n  /* by the rest of the engine.  Most of the macros here are automatically */\n  /* determined at compile time, and you should not need to change it to   */\n  /* port FreeType, except to compile the library with a non-ANSI          */\n  /* compiler.                                                             */\n  /*                                                                       */\n  /* Note however that if some specific modifications are needed, we       */\n  /* advise you to place a modified copy in your build directory.          */\n  /*                                                                       */\n  /* The build directory is usually `freetype/builds/<system>', and        */\n  /* contains system-specific files that are always included first when    */\n  /* building the library.                                                 */\n  /*                                                                       */\n  /* This ANSI version should stay in `include/freetype/config'.           */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __FTCONFIG_H__\n#define __FTCONFIG_H__\n\n#include \"../../ft2build.h\"\n#include \"ftoption.h\"\n#include \"ftstdlib.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*               PLATFORM-SPECIFIC CONFIGURATION MACROS                  */\n  /*                                                                       */\n  /* These macros can be toggled to suit a specific system.  The current   */\n  /* ones are defaults used to compile FreeType in an ANSI C environment   */\n  /* (16bit compilers are also supported).  Copy this file to your own     */\n  /* `freetype/builds/<system>' directory, and edit it to port the engine. */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* There are systems (like the Texas Instruments 'C54x) where a `char' */\n  /* has 16 bits.  ANSI C says that sizeof(char) is always 1.  Since an  */\n  /* `int' has 16 bits also for this system, sizeof(int) gives 1 which   */\n  /* is probably unexpected.                                             */\n  /*                                                                     */\n  /* `CHAR_BIT' (defined in limits.h) gives the number of bits in a      */\n  /* `char' type.                                                        */\n\n#ifndef FT_CHAR_BIT\n#define FT_CHAR_BIT  CHAR_BIT\n#endif\n\n\n  /* The size of an `int' type.  */\n#if                                 FT_UINT_MAX == 0xFFFFUL\n#define FT_SIZEOF_INT  (16 / FT_CHAR_BIT)\n#elif                               FT_UINT_MAX == 0xFFFFFFFFUL\n#define FT_SIZEOF_INT  (32 / FT_CHAR_BIT)\n#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL\n#define FT_SIZEOF_INT  (64 / FT_CHAR_BIT)\n#else\n#error \"Unsupported size of `int' type!\"\n#endif\n\n  /* The size of a `long' type.  A five-byte `long' (as used e.g. on the */\n  /* DM642) is recognized but avoided.                                   */\n#if                                  FT_ULONG_MAX == 0xFFFFFFFFUL\n#define FT_SIZEOF_LONG  (32 / FT_CHAR_BIT)\n#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL\n#define FT_SIZEOF_LONG  (32 / FT_CHAR_BIT)\n#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL\n#define FT_SIZEOF_LONG  (64 / FT_CHAR_BIT)\n#else\n#error \"Unsupported size of `long' type!\"\n#endif\n\n\n  /* FT_UNUSED is a macro used to indicate that a given parameter is not  */\n  /* used -- this is only used to get rid of unpleasant compiler warnings */\n#ifndef FT_UNUSED\n#define FT_UNUSED( arg )  ( (arg) = (arg) )\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                     AUTOMATIC CONFIGURATION MACROS                    */\n  /*                                                                       */\n  /* These macros are computed from the ones defined above.  Don't touch   */\n  /* their definition, unless you know precisely what you are doing.  No   */\n  /* porter should need to mess with them.                                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Mac support                                                           */\n  /*                                                                       */\n  /*   This is the only necessary change, so it is defined here instead    */\n  /*   providing a new configuration file.                                 */\n  /*                                                                       */\n#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) )\n  /* no Carbon frameworks for 64bit 10.4.x */\n  /* AvailabilityMacros.h is available since Mac OS X 10.2,        */\n  /* so guess the system version by maximum errno before inclusion */\n#include <errno.h>\n#ifdef ECANCELED /* defined since 10.2 */\n#include \"AvailabilityMacros.h\"\n#endif\n#if defined( __LP64__ ) && \\\n    ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 )\n#undef FT_MACINTOSH\n#endif\n\n#elif defined( __SC__ ) || defined( __MRC__ )\n  /* Classic MacOS compilers */\n#include \"ConditionalMacros.h\"\n#if TARGET_OS_MAC\n#define FT_MACINTOSH 1\n#endif\n\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    basic_types                                                        */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Int16                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for a 16bit signed integer type.                         */\n  /*                                                                       */\n  typedef signed short  FT_Int16;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_UInt16                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for a 16bit unsigned integer type.                       */\n  /*                                                                       */\n  typedef unsigned short  FT_UInt16;\n\n  /* */\n\n\n  /* this #if 0 ... #endif clause is for documentation purposes */\n#if 0\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Int32                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for a 32bit signed integer type.  The size depends on    */\n  /*    the configuration.                                                 */\n  /*                                                                       */\n  typedef signed XXX  FT_Int32;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_UInt32                                                          */\n  /*                                                                       */\n  /*    A typedef for a 32bit unsigned integer type.  The size depends on  */\n  /*    the configuration.                                                 */\n  /*                                                                       */\n  typedef unsigned XXX  FT_UInt32;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Int64                                                           */\n  /*                                                                       */\n  /*    A typedef for a 64bit signed integer type.  The size depends on    */\n  /*    the configuration.  Only defined if there is real 64bit support;   */\n  /*    otherwise, it gets emulated with a structure (if necessary).       */\n  /*                                                                       */\n  typedef signed XXX  FT_Int64;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_UInt64                                                          */\n  /*                                                                       */\n  /*    A typedef for a 64bit unsigned integer type.  The size depends on  */\n  /*    the configuration.  Only defined if there is real 64bit support;   */\n  /*    otherwise, it gets emulated with a structure (if necessary).       */\n  /*                                                                       */\n  typedef unsigned XXX  FT_UInt64;\n\n  /* */\n\n#endif\n\n#if FT_SIZEOF_INT == (32 / FT_CHAR_BIT)\n\n  typedef signed int      FT_Int32;\n  typedef unsigned int    FT_UInt32;\n\n#elif FT_SIZEOF_LONG == (32 / FT_CHAR_BIT)\n\n  typedef signed long     FT_Int32;\n  typedef unsigned long   FT_UInt32;\n\n#else\n#error \"no 32bit type found -- please check your configuration files\"\n#endif\n\n\n  /* look up an integer type that is at least 32 bits */\n#if FT_SIZEOF_INT >= (32 / FT_CHAR_BIT)\n\n  typedef int            FT_Fast;\n  typedef unsigned int   FT_UFast;\n\n#elif FT_SIZEOF_LONG >= (32 / FT_CHAR_BIT)\n\n  typedef long           FT_Fast;\n  typedef unsigned long  FT_UFast;\n\n#endif\n\n\n  /* determine whether we have a 64-bit int type for platforms without */\n  /* Autoconf                                                          */\n#if FT_SIZEOF_LONG == (64 / FT_CHAR_BIT)\n\n  /* FT_LONG64 must be defined if a 64-bit type is available */\n#define FT_LONG64\n#define FT_INT64   long\n#define FT_UINT64  unsigned long\n\n#elif defined( _MSC_VER ) && _MSC_VER >= 900  /* Visual C++ (and Intel C++) */\n\n  /* this compiler provides the __int64 type */\n#define FT_LONG64\n#define FT_INT64   __int64\n#define FT_UINT64  unsigned __int64\n\n#elif defined( __BORLANDC__ )  /* Borland C++ */\n\n  /* XXXX: We should probably check the value of __BORLANDC__ in order */\n  /*       to test the compiler version.                               */\n\n  /* this compiler provides the __int64 type */\n#define FT_LONG64\n#define FT_INT64   __int64\n#define FT_UINT64  unsigned __int64\n\n#elif defined( __WATCOMC__ )   /* Watcom C++ */\n\n  /* Watcom doesn't provide 64-bit data types */\n\n#elif defined( __MWERKS__ )    /* Metrowerks CodeWarrior */\n\n#define FT_LONG64\n#define FT_INT64   long long int\n#define FT_UINT64  unsigned long long int\n\n#elif defined( __GNUC__ )\n\n  /* GCC provides the `long long' type */\n#define FT_LONG64\n#define FT_INT64   long long int\n#define FT_UINT64  unsigned long long int\n\n#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* A 64-bit data type will create compilation problems if you compile    */\n  /* in strict ANSI mode.  To avoid them, we disable its use if __STDC__   */\n  /* is defined.  You can however ignore this rule by defining the         */\n  /* FT_CONFIG_OPTION_FORCE_INT64 configuration macro.                     */\n  /*                                                                       */\n#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 )\n\n#ifdef __STDC__\n\n  /* undefine the 64-bit macros in strict ANSI compilation mode */\n#undef FT_LONG64\n#undef FT_INT64\n\n#endif /* __STDC__ */\n\n#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */\n\n#ifdef FT_LONG64\n  typedef FT_INT64   FT_Int64;\n  typedef FT_UINT64  FT_UInt64;\n#endif\n\n\n#define FT_BEGIN_STMNT  do {\n#define FT_END_STMNT    } while ( 0 )\n#define FT_DUMMY_STMNT  FT_BEGIN_STMNT FT_END_STMNT\n\n\n#ifndef  FT_CONFIG_OPTION_NO_ASSEMBLER\n  /* Provide assembler fragments for performance-critical functions. */\n  /* These must be defined `static __inline__' with GCC.             */\n\n  /**Johnson add !defined( __thumb__ )*/\n#if (defined( __CC_ARM ) || defined( __ARMCC__ ))&& !defined( __thumb__ )  /* RVCT */\n#define FT_MULFIX_ASSEMBLER  FT_MulFix_arm\n\n  /* documentation is in freetype.h */\n\n  static __inline FT_Int32\n  FT_MulFix_arm( FT_Int32  a,\n                 FT_Int32  b )\n  {\n    register FT_Int32  t, t2;\n\n\n    __asm\n    {\n      smull t2, t,  b,  a           /* (lo=t2,hi=t) = a*b */\n      mov   a,  t,  asr #31         /* a   = (hi >> 31) */\n      add   a,  a,  #0x8000         /* a  += 0x8000 */\n      adds  t2, t2, a               /* t2 += a */\n      adc   t,  t,  #0              /* t  += carry */\n      mov   a,  t2, lsr #16         /* a   = t2 >> 16 */\n      orr   a,  a,  t,  lsl #16     /* a  |= t << 16 */\n    }\n    return a;\n  }\n\n#endif /* __CC_ARM || __ARMCC__ */\n\n\n#ifdef __GNUC__\n\n#if defined( __arm__ ) && !defined( __thumb__ )    && \\\n    !( defined( __CC_ARM ) || defined( __ARMCC__ ) )\n#define FT_MULFIX_ASSEMBLER  FT_MulFix_arm\n\n  /* documentation is in freetype.h */\n\n  static __inline__ FT_Int32\n  FT_MulFix_arm( FT_Int32  a,\n                 FT_Int32  b )\n  {\n    register FT_Int32  t, t2;\n\n\n    __asm__ __volatile__ (\n      \"smull  %1, %2, %4, %3\\n\\t\"       /* (lo=%1,hi=%2) = a*b */\n      \"mov    %0, %2, asr #31\\n\\t\"      /* %0  = (hi >> 31) */\n      \"add    %0, %0, #0x8000\\n\\t\"      /* %0 += 0x8000 */\n      \"adds   %1, %1, %0\\n\\t\"           /* %1 += %0 */\n      \"adc    %2, %2, #0\\n\\t\"           /* %2 += carry */\n      \"mov    %0, %1, lsr #16\\n\\t\"      /* %0  = %1 >> 16 */\n      \"orr    %0, %0, %2, lsl #16\\n\\t\"  /* %0 |= %2 << 16 */\n      : \"=r\"(a), \"=&r\"(t2), \"=&r\"(t)\n      : \"r\"(a), \"r\"(b)\n      : \"cc\" );\n    return a;\n  }\n\n#endif /* __arm__ && !__thumb__ && !( __CC_ARM || __ARMCC__ ) */\n\n#if defined( __i386__ )\n#define FT_MULFIX_ASSEMBLER  FT_MulFix_i386\n\n  /* documentation is in freetype.h */\n\n  static __inline__ FT_Int32\n  FT_MulFix_i386( FT_Int32  a,\n                  FT_Int32  b )\n  {\n    register FT_Int32  result;\n\n\n    __asm__ __volatile__ (\n      \"imul  %%edx\\n\"\n      \"movl  %%edx, %%ecx\\n\"\n      \"sarl  $31, %%ecx\\n\"\n      \"addl  $0x8000, %%ecx\\n\"\n      \"addl  %%ecx, %%eax\\n\"\n      \"adcl  $0, %%edx\\n\"\n      \"shrl  $16, %%eax\\n\"\n      \"shll  $16, %%edx\\n\"\n      \"addl  %%edx, %%eax\\n\"\n      : \"=a\"(result), \"=d\"(b)\n      : \"a\"(a), \"d\"(b)\n      : \"%ecx\", \"cc\" );\n    return result;\n  }\n\n#endif /* i386 */\n\n#endif /* __GNUC__ */\n\n\n#ifdef _MSC_VER /* Visual C++ */\n\n#ifdef _M_IX86\n\n#define FT_MULFIX_ASSEMBLER  FT_MulFix_i386\n\n  /* documentation is in freetype.h */\n\n  static __inline FT_Int32\n  FT_MulFix_i386( FT_Int32  a,\n                  FT_Int32  b )\n  {\n    register FT_Int32  result;\n\n    __asm\n    {\n      mov eax, a\n      mov edx, b\n      imul edx\n      mov ecx, edx\n      sar ecx, 31\n      add ecx, 8000h\n      add eax, ecx\n      adc edx, 0\n      shr eax, 16\n      shl edx, 16\n      add eax, edx\n      mov result, eax\n    }\n    return result;\n  }\n\n#endif /* _M_IX86 */\n\n#endif /* _MSC_VER */\n\n#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */\n\n\n#ifdef FT_CONFIG_OPTION_INLINE_MULFIX\n#ifdef FT_MULFIX_ASSEMBLER\n#define FT_MULFIX_INLINED  FT_MULFIX_ASSEMBLER\n#endif\n#endif\n\n\n#ifdef FT_MAKE_OPTION_SINGLE_OBJECT\n\n#define FT_LOCAL( x )      static  x\n#define FT_LOCAL_DEF( x )  static  x\n\n#else\n\n#ifdef __cplusplus\n#define FT_LOCAL( x )      extern \"C\"  x\n#define FT_LOCAL_DEF( x )  extern \"C\"  x\n#else\n#define FT_LOCAL( x )      extern  x\n#define FT_LOCAL_DEF( x )  x\n#endif\n\n#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */\n\n\n#ifndef FT_BASE\n\n#ifdef __cplusplus\n#define FT_BASE( x )  extern \"C\"  x\n#else\n#define FT_BASE( x )  extern  x\n#endif\n\n#endif /* !FT_BASE */\n\n\n#ifndef FT_BASE_DEF\n\n#ifdef __cplusplus\n#define FT_BASE_DEF( x )  x\n#else\n#define FT_BASE_DEF( x )  x\n#endif\n\n#endif /* !FT_BASE_DEF */\n\n\n#ifndef FT_EXPORT\n\n#ifdef __cplusplus\n#define FT_EXPORT( x )  extern \"C\"  x\n#else\n#define FT_EXPORT( x )  extern  x\n#endif\n\n#endif /* !FT_EXPORT */\n\n\n#ifndef FT_EXPORT_DEF\n\n#ifdef __cplusplus\n#define FT_EXPORT_DEF( x )  extern \"C\"  x\n#else\n#define FT_EXPORT_DEF( x )  extern  x\n#endif\n\n#endif /* !FT_EXPORT_DEF */\n\n\n#ifndef FT_EXPORT_VAR\n\n#ifdef __cplusplus\n#define FT_EXPORT_VAR( x )  extern \"C\"  x\n#else\n#define FT_EXPORT_VAR( x )  extern  x\n#endif\n\n#endif /* !FT_EXPORT_VAR */\n\n  /* The following macros are needed to compile the library with a   */\n  /* C++ compiler and with 16bit compilers.                          */\n  /*                                                                 */\n\n  /* This is special.  Within C++, you must specify `extern \"C\"' for */\n  /* functions which are used via function pointers, and you also    */\n  /* must do that for structures which contain function pointers to  */\n  /* assure C linkage -- it's not possible to have (local) anonymous */\n  /* functions which are accessed by (global) function pointers.     */\n  /*                                                                 */\n  /*                                                                 */\n  /* FT_CALLBACK_DEF is used to _define_ a callback function.        */\n  /*                                                                 */\n  /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */\n  /* contains pointers to callback functions.                        */\n  /*                                                                 */\n  /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable   */\n  /* that contains pointers to callback functions.                   */\n  /*                                                                 */\n  /*                                                                 */\n  /* Some 16bit compilers have to redefine these macros to insert    */\n  /* the infamous `_cdecl' or `__fastcall' declarations.             */\n  /*                                                                 */\n#ifndef FT_CALLBACK_DEF\n#ifdef __cplusplus\n#define FT_CALLBACK_DEF( x )  extern \"C\"  x\n#else\n#define FT_CALLBACK_DEF( x )  static  x\n#endif\n#endif /* FT_CALLBACK_DEF */\n\n#ifndef FT_CALLBACK_TABLE\n#ifdef __cplusplus\n#define FT_CALLBACK_TABLE      extern \"C\"\n#define FT_CALLBACK_TABLE_DEF  extern \"C\"\n#else\n#define FT_CALLBACK_TABLE      extern\n#define FT_CALLBACK_TABLE_DEF  /* nothing */\n#endif\n#endif /* FT_CALLBACK_TABLE */\n\n\nFT_END_HEADER\n\n\n#endif /* __FTCONFIG_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/config/ftheader.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftheader.h                                                             */\n/*                                                                         */\n/*    Build macros of the FreeType 2 library.                              */\n/*                                                                         */\n/*  Copyright 1996-2008, 2010, 2012, 2013 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#ifndef __FT_HEADER_H__\n#define __FT_HEADER_H__\n\n\n  /*@***********************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_BEGIN_HEADER                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This macro is used in association with @FT_END_HEADER in header    */\n  /*    files to ensure that the declarations within are properly          */\n  /*    encapsulated in an `extern \"C\" { .. }' block when included from a  */\n  /*    C++ compiler.                                                      */\n  /*                                                                       */\n#ifdef __cplusplus\n#define FT_BEGIN_HEADER  extern \"C\" {\n#else\n#define FT_BEGIN_HEADER  /* nothing */\n#endif\n\n\n  /*@***********************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_END_HEADER                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This macro is used in association with @FT_BEGIN_HEADER in header  */\n  /*    files to ensure that the declarations within are properly          */\n  /*    encapsulated in an `extern \"C\" { .. }' block when included from a  */\n  /*    C++ compiler.                                                      */\n  /*                                                                       */\n#ifdef __cplusplus\n#define FT_END_HEADER  }\n#else\n#define FT_END_HEADER  /* nothing */\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Aliases for the FreeType 2 public and configuration files.            */\n  /*                                                                       */\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    header_file_macros                                                 */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Header File Macros                                                 */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Macro definitions used to #include specific header files.          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The following macros are defined to the name of specific           */\n  /*    FreeType~2 header files.  They can be used directly in #include    */\n  /*    statements as in:                                                  */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      #include \"../freetype.h\"                                           */\n  /*      #include \"../ftmm.h\"                                   */\n  /*      #include \"../ftglyph.h\"                                              */\n  /*    }                                                                  */\n  /*                                                                       */\n  /*    There are several reasons why we are now using macros to name      */\n  /*    public header files.  The first one is that such macros are not    */\n  /*    limited to the infamous 8.3~naming rule required by DOS (and       */\n  /*    `FT_MULTIPLE_MASTERS_H' is a lot more meaningful than `ftmm.h').   */\n  /*                                                                       */\n  /*    The second reason is that it allows for more flexibility in the    */\n  /*    way FreeType~2 is installed on a given system.                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* configuration files */\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CONFIG_CONFIG_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing\n   *   FreeType~2 configuration data.\n   *\n   */\n#ifndef FT_CONFIG_CONFIG_H\n#define FT_CONFIG_CONFIG_H  <freetype/config/ftconfig.h>\n#endif\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CONFIG_STANDARD_LIBRARY_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing\n   *   FreeType~2 interface to the standard C library functions.\n   *\n   */\n#ifndef FT_CONFIG_STANDARD_LIBRARY_H\n#define FT_CONFIG_STANDARD_LIBRARY_H  <freetype/config/ftstdlib.h>\n#endif\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CONFIG_OPTIONS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing\n   *   FreeType~2 project-specific configuration options.\n   *\n   */\n#ifndef FT_CONFIG_OPTIONS_H\n#define FT_CONFIG_OPTIONS_H  <freetype/config/ftoption.h>\n#endif\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CONFIG_MODULES_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   list of FreeType~2 modules that are statically linked to new library\n   *   instances in @FT_Init_FreeType.\n   *\n   */\n#ifndef FT_CONFIG_MODULES_H\n#define FT_CONFIG_MODULES_H  <freetype/config/ftmodule.h>\n#endif\n\n  /* */\n\n  /* public headers */\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_FREETYPE_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   base FreeType~2 API.\n   *\n   */\n#define FT_FREETYPE_H  <freetype/freetype.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_ERRORS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   list of FreeType~2 error codes (and messages).\n   *\n   *   It is included by @FT_FREETYPE_H.\n   *\n   */\n#define FT_ERRORS_H  <freetype/fterrors.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_MODULE_ERRORS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   list of FreeType~2 module error offsets (and messages).\n   *\n   */\n#define FT_MODULE_ERRORS_H  <freetype/ftmoderr.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_SYSTEM_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 interface to low-level operations (i.e., memory management\n   *   and stream i/o).\n   *\n   *   It is included by @FT_FREETYPE_H.\n   *\n   */\n#define FT_SYSTEM_H  <freetype/ftsystem.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_IMAGE_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing type\n   *   definitions related to glyph images (i.e., bitmaps, outlines,\n   *   scan-converter parameters).\n   *\n   *   It is included by @FT_FREETYPE_H.\n   *\n   */\n#define FT_IMAGE_H  <freetype/ftimage.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_TYPES_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   basic data types defined by FreeType~2.\n   *\n   *   It is included by @FT_FREETYPE_H.\n   *\n   */\n#define FT_TYPES_H  <freetype/fttypes.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_LIST_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   list management API of FreeType~2.\n   *\n   *   (Most applications will never need to include this file.)\n   *\n   */\n#define FT_LIST_H  <freetype/ftlist.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_OUTLINE_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   scalable outline management API of FreeType~2.\n   *\n   */\n#define FT_OUTLINE_H  <freetype/ftoutln.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_SIZES_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   API which manages multiple @FT_Size objects per face.\n   *\n   */\n#define FT_SIZES_H  <freetype/ftsizes.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_MODULE_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   module management API of FreeType~2.\n   *\n   */\n#define FT_MODULE_H  <freetype/ftmodapi.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_RENDER_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   renderer module management API of FreeType~2.\n   *\n   */\n#define FT_RENDER_H  <freetype/ftrender.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_AUTOHINTER_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing\n   *   structures and macros related to the auto-hinting module.\n   *\n   */\n#define FT_AUTOHINTER_H  <freetype/ftautoh.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CFF_DRIVER_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing\n   *   structures and macros related to the CFF driver module.\n   *\n   */\n#define FT_CFF_DRIVER_H  <freetype/ftcffdrv.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_TRUETYPE_DRIVER_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing\n   *   structures and macros related to the TrueType driver module.\n   *\n   */\n#define FT_TRUETYPE_DRIVER_H  <freetype/ftttdrv.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_TYPE1_TABLES_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   types and API specific to the Type~1 format.\n   *\n   */\n#define FT_TYPE1_TABLES_H  <freetype/t1tables.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_TRUETYPE_IDS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   enumeration values which identify name strings, languages, encodings,\n   *   etc.  This file really contains a _large_ set of constant macro\n   *   definitions, taken from the TrueType and OpenType specifications.\n   *\n   */\n#define FT_TRUETYPE_IDS_H  <freetype/ttnameid.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_TRUETYPE_TABLES_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   types and API specific to the TrueType (as well as OpenType) format.\n   *\n   */\n#define FT_TRUETYPE_TABLES_H  <freetype/tttables.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_TRUETYPE_TAGS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   definitions of TrueType four-byte `tags' which identify blocks in\n   *   SFNT-based font formats (i.e., TrueType and OpenType).\n   *\n   */\n#define FT_TRUETYPE_TAGS_H  <freetype/tttags.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_BDF_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   definitions of an API which accesses BDF-specific strings from a\n   *   face.\n   *\n   */\n#define FT_BDF_H  <freetype/ftbdf.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CID_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   definitions of an API which access CID font information from a\n   *   face.\n   *\n   */\n#define FT_CID_H  <freetype/ftcid.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_GZIP_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   definitions of an API which supports gzip-compressed files.\n   *\n   */\n#define FT_GZIP_H  <freetype/ftgzip.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_LZW_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   definitions of an API which supports LZW-compressed files.\n   *\n   */\n#define FT_LZW_H  <freetype/ftlzw.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_BZIP2_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   definitions of an API which supports bzip2-compressed files.\n   *\n   */\n#define FT_BZIP2_H  <freetype/ftbzip2.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_WINFONTS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   definitions of an API which supports Windows FNT files.\n   *\n   */\n#define FT_WINFONTS_H   <freetype/ftwinfnt.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_GLYPH_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   API of the optional glyph management component.\n   *\n   */\n#define FT_GLYPH_H  <freetype/ftglyph.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_BITMAP_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   API of the optional bitmap conversion component.\n   *\n   */\n#define FT_BITMAP_H  <freetype/ftbitmap.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_BBOX_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   API of the optional exact bounding box computation routines.\n   *\n   */\n#define FT_BBOX_H  <freetype/ftbbox.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CACHE_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   API of the optional FreeType~2 cache sub-system.\n   *\n   */\n#define FT_CACHE_H  <freetype/ftcache.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CACHE_IMAGE_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   `glyph image' API of the FreeType~2 cache sub-system.\n   *\n   *   It is used to define a cache for @FT_Glyph elements.  You can also\n   *   use the API defined in @FT_CACHE_SMALL_BITMAPS_H if you only need to\n   *   store small glyph bitmaps, as it will use less memory.\n   *\n   *   This macro is deprecated.  Simply include @FT_CACHE_H to have all\n   *   glyph image-related cache declarations.\n   *\n   */\n#define FT_CACHE_IMAGE_H  FT_CACHE_H\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CACHE_SMALL_BITMAPS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   `small bitmaps' API of the FreeType~2 cache sub-system.\n   *\n   *   It is used to define a cache for small glyph bitmaps in a relatively\n   *   memory-efficient way.  You can also use the API defined in\n   *   @FT_CACHE_IMAGE_H if you want to cache arbitrary glyph images,\n   *   including scalable outlines.\n   *\n   *   This macro is deprecated.  Simply include @FT_CACHE_H to have all\n   *   small bitmaps-related cache declarations.\n   *\n   */\n#define FT_CACHE_SMALL_BITMAPS_H  FT_CACHE_H\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CACHE_CHARMAP_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   `charmap' API of the FreeType~2 cache sub-system.\n   *\n   *   This macro is deprecated.  Simply include @FT_CACHE_H to have all\n   *   charmap-based cache declarations.\n   *\n   */\n#define FT_CACHE_CHARMAP_H  FT_CACHE_H\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_MAC_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   Macintosh-specific FreeType~2 API.  The latter is used to access\n   *   fonts embedded in resource forks.\n   *\n   *   This header file must be explicitly included by client applications\n   *   compiled on the Mac (note that the base API still works though).\n   *\n   */\n#define FT_MAC_H  <freetype/ftmac.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_MULTIPLE_MASTERS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   optional multiple-masters management API of FreeType~2.\n   *\n   */\n#define FT_MULTIPLE_MASTERS_H  <freetype/ftmm.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_SFNT_NAMES_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   optional FreeType~2 API which accesses embedded `name' strings in\n   *   SFNT-based font formats (i.e., TrueType and OpenType).\n   *\n   */\n#define FT_SFNT_NAMES_H  <freetype/ftsnames.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_OPENTYPE_VALIDATE_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   optional FreeType~2 API which validates OpenType tables (BASE, GDEF,\n   *   GPOS, GSUB, JSTF).\n   *\n   */\n#define FT_OPENTYPE_VALIDATE_H  <freetype/ftotval.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_GX_VALIDATE_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   optional FreeType~2 API which validates TrueTypeGX/AAT tables (feat,\n   *   mort, morx, bsln, just, kern, opbd, trak, prop).\n   *\n   */\n#define FT_GX_VALIDATE_H  <freetype/ftgxval.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_PFR_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which accesses PFR-specific data.\n   *\n   */\n#define FT_PFR_H  <freetype/ftpfr.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_STROKER_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which provides functions to stroke outline paths.\n   */\n#define FT_STROKER_H  <freetype/ftstroke.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_SYNTHESIS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which performs artificial obliquing and emboldening.\n   */\n#define FT_SYNTHESIS_H  <freetype/ftsynth.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_XFREE86_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which provides functions specific to the XFree86 and\n   *   X.Org X11 servers.\n   */\n#define FT_XFREE86_H  <freetype/ftxf86.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_TRIGONOMETRY_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which performs trigonometric computations (e.g.,\n   *   cosines and arc tangents).\n   */\n#define FT_TRIGONOMETRY_H  <freetype/fttrigon.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_LCD_FILTER_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which performs color filtering for subpixel rendering.\n   */\n#define FT_LCD_FILTER_H  <freetype/ftlcdfil.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_UNPATENTED_HINTING_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which performs color filtering for subpixel rendering.\n   */\n#define FT_UNPATENTED_HINTING_H  <freetype/ttunpat.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_INCREMENTAL_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which performs color filtering for subpixel rendering.\n   */\n#define FT_INCREMENTAL_H  <freetype/ftincrem.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_GASP_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which returns entries from the TrueType GASP table.\n   */\n#define FT_GASP_H  <freetype/ftgasp.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_ADVANCES_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which returns individual and ranged glyph advances.\n   */\n#define FT_ADVANCES_H  <freetype/ftadvanc.h>\n\n\n  /* */\n\n#define FT_ERROR_DEFINITIONS_H  <freetype/fterrdef.h>\n\n\n  /* The internals of the cache sub-system are no longer exposed.  We */\n  /* default to FT_CACHE_H at the moment just in case, but we know of */\n  /* no rogue client that uses them.                                  */\n  /*                                                                  */\n#define FT_CACHE_MANAGER_H           <freetype/ftcache.h>\n#define FT_CACHE_INTERNAL_MRU_H      <freetype/ftcache.h>\n#define FT_CACHE_INTERNAL_MANAGER_H  <freetype/ftcache.h>\n#define FT_CACHE_INTERNAL_CACHE_H    <freetype/ftcache.h>\n#define FT_CACHE_INTERNAL_GLYPH_H    <freetype/ftcache.h>\n#define FT_CACHE_INTERNAL_IMAGE_H    <freetype/ftcache.h>\n#define FT_CACHE_INTERNAL_SBITS_H    <freetype/ftcache.h>\n\n\n#define FT_INCREMENTAL_H          <freetype/ftincrem.h>\n\n#define FT_TRUETYPE_UNPATENTED_H  <freetype/ttunpat.h>\n\n\n  /*\n   * Include internal headers definitions from <freetype/internal/...>\n   * only when building the library.\n   */\n#ifdef FT2_BUILD_LIBRARY\n#define  FT_INTERNAL_INTERNAL_H  <freetype/internal/internal.h>\n#include \"../internal/internal.h\"\n#endif /* FT2_BUILD_LIBRARY */\n\n\n#endif /* __FT2_BUILD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/config/ftmodule.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftmodule.h                                                             */\n/*                                                                         */\n/*    FreeType modules public interface (specification).                   */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/*\n *  This file registers the FreeType modules compiled into the library.\n *\n *  If you use GNU make, this file IS NOT USED!  Instead, it is created in\n *  the objects directory (normally `<topdir>/objs/') based on information\n *  from `<topdir>/modules.cfg'.\n *\n *  Please read `docs/INSTALL.ANY' and `docs/CUSTOMIZE' how to compile\n *  FreeType without GNU make.\n *\n */\n\n//FT_USE_MODULE( FT_Module_Class, autofit_module_class )\nFT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class )\nFT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class )\nFT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class )\nFT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class )\n//FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class )\n//FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class )\n//FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class )\n//FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class )\nFT_USE_MODULE( FT_Module_Class, psaux_module_class )\nFT_USE_MODULE( FT_Module_Class, psnames_module_class )\nFT_USE_MODULE( FT_Module_Class, pshinter_module_class )\nFT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class )\nFT_USE_MODULE( FT_Module_Class, sfnt_module_class )\nFT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class )\nFT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class )\nFT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class )\n//FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class )\n\n/* EOF */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/config/ftoption.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftoption.h                                                             */\n/*                                                                         */\n/*    User-selectable configuration macros (specification only).           */\n/*                                                                         */\n/*  Copyright 1996-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTOPTION_H__\n#define __FTOPTION_H__\n\n\n#include \"../../ft2build.h\"\n\n\nFT_BEGIN_HEADER\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                 USER-SELECTABLE CONFIGURATION MACROS                  */\n  /*                                                                       */\n  /* This file contains the default configuration macro definitions for    */\n  /* a standard build of the FreeType library.  There are three ways to    */\n  /* use this file to build project-specific versions of the library:      */\n  /*                                                                       */\n  /*  - You can modify this file by hand, but this is not recommended in   */\n  /*    cases where you would like to build several versions of the        */\n  /*    library from a single source directory.                            */\n  /*                                                                       */\n  /*  - You can put a copy of this file in your build directory, more      */\n  /*    precisely in `$BUILD/freetype/config/ftoption.h', where `$BUILD'   */\n  /*    is the name of a directory that is included _before_ the FreeType  */\n  /*    include path during compilation.                                   */\n  /*                                                                       */\n  /*    The default FreeType Makefiles and Jamfiles use the build          */\n  /*    directory `builds/<system>' by default, but you can easily change  */\n  /*    that for your own projects.                                        */\n  /*                                                                       */\n  /*  - Copy the file <ft2build.h> to `$BUILD/ft2build.h' and modify it    */\n  /*    slightly to pre-define the macro FT_CONFIG_OPTIONS_H used to       */\n  /*    locate this file during the build.  For example,                   */\n  /*                                                                       */\n  /*      #define FT_CONFIG_OPTIONS_H  <myftoptions.h>                     */\n  /*      #include <freetype/config/ftheader.h>                            */\n  /*                                                                       */\n  /*    will use `$BUILD/myftoptions.h' instead of this file for macro     */\n  /*    definitions.                                                       */\n  /*                                                                       */\n  /*    Note also that you can similarly pre-define the macro              */\n  /*    FT_CONFIG_MODULES_H used to locate the file listing of the modules */\n  /*    that are statically linked to the library at compile time.  By     */\n  /*    default, this file is <freetype/config/ftmodule.h>.                */\n  /*                                                                       */\n  /*  We highly recommend using the third method whenever possible.        */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /**** G E N E R A L   F R E E T Y P E   2   C O N F I G U R A T I O N ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Uncomment the line below if you want to activate sub-pixel rendering  */\n  /* (a.k.a. LCD rendering, or ClearType) in this build of the library.    */\n  /*                                                                       */\n  /* Note that this feature is covered by several Microsoft patents        */\n  /* and should not be activated in any default build of the library.      */\n  /*                                                                       */\n  /* This macro has no impact on the FreeType API, only on its             */\n  /* _implementation_.  For example, using FT_RENDER_MODE_LCD when calling */\n  /* FT_Render_Glyph still generates a bitmap that is 3 times wider than   */\n  /* the original size in case this macro isn't defined; however, each     */\n  /* triplet of subpixels has R=G=B.                                       */\n  /*                                                                       */\n  /* This is done to allow FreeType clients to run unmodified, forcing     */\n  /* them to display normal gray-level anti-aliased glyphs.                */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_SUBPIXEL_RENDERING\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Many compilers provide a non-ANSI 64-bit data type that can be used   */\n  /* by FreeType to speed up some computations.  However, this will create */\n  /* some problems when compiling the library in strict ANSI mode.         */\n  /*                                                                       */\n  /* For this reason, the use of 64-bit integers is normally disabled when */\n  /* the __STDC__ macro is defined.  You can however disable this by       */\n  /* defining the macro FT_CONFIG_OPTION_FORCE_INT64 here.                 */\n  /*                                                                       */\n  /* For most compilers, this will only create compilation warnings when   */\n  /* building the library.                                                 */\n  /*                                                                       */\n  /* ObNote: The compiler-specific 64-bit integers are detected in the     */\n  /*         file `ftconfig.h' either statically or through the            */\n  /*         `configure' script on supported platforms.                    */\n  /*                                                                       */\n#undef FT_CONFIG_OPTION_FORCE_INT64\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* If this macro is defined, do not try to use an assembler version of   */\n  /* performance-critical functions (e.g. FT_MulFix).  You should only do  */\n  /* that to verify that the assembler function works properly, or to      */\n  /* execute benchmark tests of the various implementations.               */\n/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* If this macro is defined, try to use an inlined assembler version of  */\n  /* the `FT_MulFix' function, which is a `hotspot' when loading and       */\n  /* hinting glyphs, and which should be executed as fast as possible.     */\n  /*                                                                       */\n  /* Note that if your compiler or CPU is not supported, this will default */\n  /* to the standard and portable implementation found in `ftcalc.c'.      */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_INLINE_MULFIX\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* LZW-compressed file support.                                          */\n  /*                                                                       */\n  /*   FreeType now handles font files that have been compressed with the  */\n  /*   `compress' program.  This is mostly used to parse many of the PCF   */\n  /*   files that come with various X11 distributions.  The implementation */\n  /*   uses NetBSD's `zopen' to partially uncompress the file on the fly   */\n  /*   (see src/lzw/ftgzip.c).                                             */\n  /*                                                                       */\n  /*   Define this macro if you want to enable this `feature'.             */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_USE_LZW\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Gzip-compressed file support.                                         */\n  /*                                                                       */\n  /*   FreeType now handles font files that have been compressed with the  */\n  /*   `gzip' program.  This is mostly used to parse many of the PCF files */\n  /*   that come with XFree86.  The implementation uses `zlib' to          */\n  /*   partially uncompress the file on the fly (see src/gzip/ftgzip.c).   */\n  /*                                                                       */\n  /*   Define this macro if you want to enable this `feature'.  See also   */\n  /*   the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below.                       */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_USE_ZLIB\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ZLib library selection                                                */\n  /*                                                                       */\n  /*   This macro is only used when FT_CONFIG_OPTION_USE_ZLIB is defined.  */\n  /*   It allows FreeType's `ftgzip' component to link to the system's     */\n  /*   installation of the ZLib library.  This is useful on systems like   */\n  /*   Unix or VMS where it generally is already available.                */\n  /*                                                                       */\n  /*   If you let it undefined, the component will use its own copy        */\n  /*   of the zlib sources instead.  These have been modified to be        */\n  /*   included directly within the component and *not* export external    */\n  /*   function names.  This allows you to link any program with FreeType  */\n  /*   _and_ ZLib without linking conflicts.                               */\n  /*                                                                       */\n  /*   Do not #undef this macro here since the build system might define   */\n  /*   it for certain configurations only.                                 */\n  /*                                                                       */\n/* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Bzip2-compressed file support.                                        */\n  /*                                                                       */\n  /*   FreeType now handles font files that have been compressed with the  */\n  /*   `bzip2' program.  This is mostly used to parse many of the PCF      */\n  /*   files that come with XFree86.  The implementation uses `libbz2' to  */\n  /*   partially uncompress the file on the fly (see src/bzip2/ftbzip2.c). */\n  /*   Contrary to gzip, bzip2 currently is not included and need to use   */\n  /*   the system available bzip2 implementation.                          */\n  /*                                                                       */\n  /*   Define this macro if you want to enable this `feature'.             */\n  /*                                                                       */\n/* #define FT_CONFIG_OPTION_USE_BZIP2 */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define to disable the use of file stream functions and types, FILE,   */\n  /* fopen() etc.  Enables the use of smaller system libraries on embedded */\n  /* systems that have multiple system libraries, some with or without     */\n  /* file stream support, in the cases where file stream support is not    */\n  /* necessary such as memory loading of font files.                       */\n  /*                                                                       */\n/* #define FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  PNG bitmap support.                                                  */\n  /*                                                                       */\n  /*   FreeType now handles loading color bitmap glyphs in the PNG format. */\n  /*   This requires help from the external libpng library.  Uncompressed  */\n  /*   color bitmaps do not need any external libraries and will be        */\n  /*   supported regardless of this configuration.                         */\n  /*                                                                       */\n  /*   Define this macro if you want to enable this `feature'.             */\n  /*                                                                       */\n/* #define FT_CONFIG_OPTION_USE_PNG */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* DLL export compilation                                                */\n  /*                                                                       */\n  /*   When compiling FreeType as a DLL, some systems/compilers need a     */\n  /*   special keyword in front OR after the return type of function       */\n  /*   declarations.                                                       */\n  /*                                                                       */\n  /*   Two macros are used within the FreeType source code to define       */\n  /*   exported library functions: FT_EXPORT and FT_EXPORT_DEF.            */\n  /*                                                                       */\n  /*     FT_EXPORT( return_type )                                          */\n  /*                                                                       */\n  /*       is used in a function declaration, as in                        */\n  /*                                                                       */\n  /*         FT_EXPORT( FT_Error )                                         */\n  /*         FT_Init_FreeType( FT_Library*  alibrary );                    */\n  /*                                                                       */\n  /*                                                                       */\n  /*     FT_EXPORT_DEF( return_type )                                      */\n  /*                                                                       */\n  /*       is used in a function definition, as in                         */\n  /*                                                                       */\n  /*         FT_EXPORT_DEF( FT_Error )                                     */\n  /*         FT_Init_FreeType( FT_Library*  alibrary )                     */\n  /*         {                                                             */\n  /*           ... some code ...                                           */\n  /*           return FT_Err_Ok;                                           */\n  /*         }                                                             */\n  /*                                                                       */\n  /*   You can provide your own implementation of FT_EXPORT and            */\n  /*   FT_EXPORT_DEF here if you want.  If you leave them undefined, they  */\n  /*   will be later automatically defined as `extern return_type' to      */\n  /*   allow normal compilation.                                           */\n  /*                                                                       */\n  /*   Do not #undef these macros here since the build system might define */\n  /*   them for certain configurations only.                               */\n  /*                                                                       */\n/* #define FT_EXPORT(x)      extern x */\n/* #define FT_EXPORT_DEF(x)  x */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Glyph Postscript Names handling                                       */\n  /*                                                                       */\n  /*   By default, FreeType 2 is compiled with the `psnames' module.  This */\n  /*   module is in charge of converting a glyph name string into a        */\n  /*   Unicode value, or return a Macintosh standard glyph name for the    */\n  /*   use with the TrueType `post' table.                                 */\n  /*                                                                       */\n  /*   Undefine this macro if you do not want `psnames' compiled in your   */\n  /*   build of FreeType.  This has the following effects:                 */\n  /*                                                                       */\n  /*   - The TrueType driver will provide its own set of glyph names,      */\n  /*     if you build it to support postscript names in the TrueType       */\n  /*     `post' table.                                                     */\n  /*                                                                       */\n  /*   - The Type 1 driver will not be able to synthesize a Unicode        */\n  /*     charmap out of the glyphs found in the fonts.                     */\n  /*                                                                       */\n  /*   You would normally undefine this configuration macro when building  */\n  /*   a version of FreeType that doesn't contain a Type 1 or CFF driver.  */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Postscript Names to Unicode Values support                            */\n  /*                                                                       */\n  /*   By default, FreeType 2 is built with the `PSNames' module compiled  */\n  /*   in.  Among other things, the module is used to convert a glyph name */\n  /*   into a Unicode value.  This is especially useful in order to        */\n  /*   synthesize on the fly a Unicode charmap from the CFF/Type 1 driver  */\n  /*   through a big table named the `Adobe Glyph List' (AGL).             */\n  /*                                                                       */\n  /*   Undefine this macro if you do not want the Adobe Glyph List         */\n  /*   compiled in your `PSNames' module.  The Type 1 driver will not be   */\n  /*   able to synthesize a Unicode charmap out of the glyphs found in the */\n  /*   fonts.                                                              */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Support for Mac fonts                                                 */\n  /*                                                                       */\n  /*   Define this macro if you want support for outline fonts in Mac      */\n  /*   format (mac dfont, mac resource, macbinary containing a mac         */\n  /*   resource) on non-Mac platforms.                                     */\n  /*                                                                       */\n  /*   Note that the `FOND' resource isn't checked.                        */\n  /*                                                                       */\n//#define FT_CONFIG_OPTION_MAC_FONTS\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Guessing methods to access embedded resource forks                    */\n  /*                                                                       */\n  /*   Enable extra Mac fonts support on non-Mac platforms (e.g.           */\n  /*   GNU/Linux).                                                         */\n  /*                                                                       */\n  /*   Resource forks which include fonts data are stored sometimes in     */\n  /*   locations which users or developers don't expected.  In some cases, */\n  /*   resource forks start with some offset from the head of a file.  In  */\n  /*   other cases, the actual resource fork is stored in file different   */\n  /*   from what the user specifies.  If this option is activated,         */\n  /*   FreeType tries to guess whether such offsets or different file      */\n  /*   names must be used.                                                 */\n  /*                                                                       */\n  /*   Note that normal, direct access of resource forks is controlled via */\n  /*   the FT_CONFIG_OPTION_MAC_FONTS option.                              */\n  /*                                                                       */\n#ifdef FT_CONFIG_OPTION_MAC_FONTS\n#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Allow the use of FT_Incremental_Interface to load typefaces that      */\n  /* contain no glyph data, but supply it via a callback function.         */\n  /* This is required by clients supporting document formats which         */\n  /* supply font data incrementally as the document is parsed, such        */\n  /* as the Ghostscript interpreter for the PostScript language.           */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_INCREMENTAL\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The size in bytes of the render pool used by the scan-line converter  */\n  /* to do all of its work.                                                */\n  /*                                                                       */\n  /* This must be greater than 4KByte if you use FreeType to rasterize     */\n  /* glyphs; otherwise, you may set it to zero to avoid unnecessary        */\n  /* allocation of the render pool.                                        */\n  /*                                                                       */\n#define FT_RENDER_POOL_SIZE  16384L\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* FT_MAX_MODULES                                                        */\n  /*                                                                       */\n  /*   The maximum number of modules that can be registered in a single    */\n  /*   FreeType library object.  32 is the default.                        */\n  /*                                                                       */\n#define FT_MAX_MODULES  32\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Debug level                                                           */\n  /*                                                                       */\n  /*   FreeType can be compiled in debug or trace mode.  In debug mode,    */\n  /*   errors are reported through the `ftdebug' component.  In trace      */\n  /*   mode, additional messages are sent to the standard output during    */\n  /*   execution.                                                          */\n  /*                                                                       */\n  /*   Define FT_DEBUG_LEVEL_ERROR to build the library in debug mode.     */\n  /*   Define FT_DEBUG_LEVEL_TRACE to build it in trace mode.              */\n  /*                                                                       */\n  /*   Don't define any of these macros to compile in `release' mode!      */\n  /*                                                                       */\n  /*   Do not #undef these macros here since the build system might define */\n  /*   them for certain configurations only.                               */\n  /*                                                                       */\n/* #define FT_DEBUG_LEVEL_ERROR */\n/* #define FT_DEBUG_LEVEL_TRACE */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Autofitter debugging                                                  */\n  /*                                                                       */\n  /*   If FT_DEBUG_AUTOFIT is defined, FreeType provides some means to     */\n  /*   control the autofitter behaviour for debugging purposes with global */\n  /*   boolean variables (consequently, you should *never* enable this     */\n  /*   while compiling in `release' mode):                                 */\n  /*                                                                       */\n  /*     _af_debug_disable_horz_hints                                      */\n  /*     _af_debug_disable_vert_hints                                      */\n  /*     _af_debug_disable_blue_hints                                      */\n  /*                                                                       */\n  /*   Additionally, the following functions provide dumps of various      */\n  /*   internal autofit structures to stdout (using `printf'):             */\n  /*                                                                       */\n  /*     af_glyph_hints_dump_points                                        */\n  /*     af_glyph_hints_dump_segments                                      */\n  /*     af_glyph_hints_dump_edges                                         */\n  /*                                                                       */\n  /*   As an argument, they use another global variable:                   */\n  /*                                                                       */\n  /*     _af_debug_hints                                                   */\n  /*                                                                       */\n  /*   Please have a look at the `ftgrid' demo program to see how those    */\n  /*   variables and macros should be used.                                */\n  /*                                                                       */\n  /*   Do not #undef these macros here since the build system might define */\n  /*   them for certain configurations only.                               */\n  /*                                                                       */\n/* #define FT_DEBUG_AUTOFIT */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Memory Debugging                                                      */\n  /*                                                                       */\n  /*   FreeType now comes with an integrated memory debugger that is       */\n  /*   capable of detecting simple errors like memory leaks or double      */\n  /*   deletes.  To compile it within your build of the library, you       */\n  /*   should define FT_DEBUG_MEMORY here.                                 */\n  /*                                                                       */\n  /*   Note that the memory debugger is only activated at runtime when     */\n  /*   when the _environment_ variable `FT2_DEBUG_MEMORY' is defined also! */\n  /*                                                                       */\n  /*   Do not #undef this macro here since the build system might define   */\n  /*   it for certain configurations only.                                 */\n  /*                                                                       */\n/* #define FT_DEBUG_MEMORY */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Module errors                                                         */\n  /*                                                                       */\n  /*   If this macro is set (which is _not_ the default), the higher byte  */\n  /*   of an error code gives the module in which the error has occurred,  */\n  /*   while the lower byte is the real error code.                        */\n  /*                                                                       */\n  /*   Setting this macro makes sense for debugging purposes only, since   */\n  /*   it would break source compatibility of certain programs that use    */\n  /*   FreeType 2.                                                         */\n  /*                                                                       */\n  /*   More details can be found in the files ftmoderr.h and fterrors.h.   */\n  /*                                                                       */\n#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Position Independent Code                                             */\n  /*                                                                       */\n  /*   If this macro is set (which is _not_ the default), FreeType2 will   */\n  /*   avoid creating constants that require address fixups.  Instead the  */\n  /*   constants will be moved into a struct and additional intialization  */\n  /*   code will be used.                                                  */\n  /*                                                                       */\n  /*   Setting this macro is needed for systems that prohibit address      */\n  /*   fixups, such as BREW.                                               */\n  /*                                                                       */\n/* #define FT_CONFIG_OPTION_PIC */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****        S F N T   D R I V E R    C O N F I G U R A T I O N       ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_EMBEDDED_BITMAPS if you want to support       */\n  /* embedded bitmaps in all formats using the SFNT module (namely         */\n  /* TrueType & OpenType).                                                 */\n  /*                                                                       */\n#undef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_POSTSCRIPT_NAMES if you want to be able to    */\n  /* load and enumerate the glyph Postscript names in a TrueType or        */\n  /* OpenType file.                                                        */\n  /*                                                                       */\n  /* Note that when you do not compile the `PSNames' module by undefining  */\n  /* the above FT_CONFIG_OPTION_POSTSCRIPT_NAMES, the `sfnt' module will   */\n  /* contain additional code used to read the PS Names table from a font.  */\n  /*                                                                       */\n  /* (By default, the module uses `PSNames' to extract glyph names.)       */\n  /*                                                                       */\n#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_SFNT_NAMES if your applications need to       */\n  /* access the internal name table in a SFNT-based format like TrueType   */\n  /* or OpenType.  The name table contains various strings used to         */\n  /* describe the font, like family name, copyright, version, etc.  It     */\n  /* does not contain any glyph name though.                               */\n  /*                                                                       */\n  /* Accessing SFNT names is done through the functions declared in        */\n  /* `freetype/ftsnames.h'.                                                */\n  /*                                                                       */\n#define TT_CONFIG_OPTION_SFNT_NAMES\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* TrueType CMap support                                                 */\n  /*                                                                       */\n  /*   Here you can fine-tune which TrueType CMap table format shall be    */\n  /*   supported.                                                          */\n#define TT_CONFIG_CMAP_FORMAT_0\n#define TT_CONFIG_CMAP_FORMAT_2\n#define TT_CONFIG_CMAP_FORMAT_4\n#define TT_CONFIG_CMAP_FORMAT_6\n#define TT_CONFIG_CMAP_FORMAT_8\n#define TT_CONFIG_CMAP_FORMAT_10\n#define TT_CONFIG_CMAP_FORMAT_12\n#define TT_CONFIG_CMAP_FORMAT_13\n#define TT_CONFIG_CMAP_FORMAT_14\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****    T R U E T Y P E   D R I V E R    C O N F I G U R A T I O N   ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile   */\n  /* a bytecode interpreter in the TrueType driver.                        */\n  /*                                                                       */\n  /* By undefining this, you will only compile the code necessary to load  */\n  /* TrueType glyphs without hinting.                                      */\n  /*                                                                       */\n  /*   Do not #undef this macro here, since the build system might         */\n  /*   define it for certain configurations only.                          */\n  /*                                                                       */\n#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_SUBPIXEL_HINTING if you want to compile       */\n  /* EXPERIMENTAL subpixel hinting support into the TrueType driver.  This */\n  /* replaces the native TrueType hinting mechanism when anything but      */\n  /* FT_RENDER_MODE_MONO is requested.                                     */\n  /*                                                                       */\n  /* Enabling this causes the TrueType driver to ignore instructions under */\n  /* certain conditions.  This is done in accordance with the guide here,  */\n  /* with some minor differences:                                          */\n  /*                                                                       */\n  /*  http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx */\n  /*                                                                       */\n  /* By undefining this, you only compile the code necessary to hint       */\n  /* TrueType glyphs with native TT hinting.                               */\n  /*                                                                       */\n  /*   This option requires TT_CONFIG_OPTION_BYTECODE_INTERPRETER to be    */\n  /*   defined.                                                            */\n  /*                                                                       */\n/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version  */\n  /* of the TrueType bytecode interpreter is used that doesn't implement   */\n  /* any of the patented opcodes and algorithms.  The patents related to   */\n  /* TrueType hinting have expired worldwide since May 2010; this option   */\n  /* is now deprecated.                                                    */\n  /*                                                                       */\n  /* Note that the TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored*  */\n  /* if you define TT_CONFIG_OPTION_BYTECODE_INTERPRETER; in other words,  */\n  /* either define TT_CONFIG_OPTION_BYTECODE_INTERPRETER or                */\n  /* TT_CONFIG_OPTION_UNPATENTED_HINTING but not both at the same time.    */\n  /*                                                                       */\n  /* This macro is only useful for a small number of font files (mostly    */\n  /* for Asian scripts) that require bytecode interpretation to properly   */\n  /* load glyphs.  For all other fonts, this produces unpleasant results,  */\n  /* thus the unpatented interpreter is never used to load glyphs from     */\n  /* TrueType fonts unless one of the following two options is used.       */\n  /*                                                                       */\n  /*   - The unpatented interpreter is explicitly activated by the user    */\n  /*     through the FT_PARAM_TAG_UNPATENTED_HINTING parameter tag         */\n  /*     when opening the FT_Face.                                         */\n  /*                                                                       */\n  /*   - FreeType detects that the FT_Face corresponds to one of the       */\n  /*     `trick' fonts (e.g., `Mingliu') it knows about.  The font engine  */\n  /*     contains a hard-coded list of font names and other matching       */\n  /*     parameters (see function `tt_face_init' in file                   */\n  /*     `src/truetype/ttobjs.c').                                         */\n  /*                                                                       */\n  /* Here a sample code snippet for using FT_PARAM_TAG_UNPATENTED_HINTING. */\n  /*                                                                       */\n  /*   {                                                                   */\n  /*     FT_Parameter  parameter;                                          */\n  /*     FT_Open_Args  open_args;                                          */\n  /*                                                                       */\n  /*                                                                       */\n  /*     parameter.tag = FT_PARAM_TAG_UNPATENTED_HINTING;                  */\n  /*                                                                       */\n  /*     open_args.flags      = FT_OPEN_PATHNAME | FT_OPEN_PARAMS;         */\n  /*     open_args.pathname   = my_font_pathname;                          */\n  /*     open_args.num_params = 1;                                         */\n  /*     open_args.params     = &parameter;                                */\n  /*                                                                       */\n  /*     error = FT_Open_Face( library, &open_args, index, &face );        */\n  /*     ...                                                               */\n  /*   }                                                                   */\n  /*                                                                       */\n/* #define TT_CONFIG_OPTION_UNPATENTED_HINTING */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_INTERPRETER_SWITCH to compile the TrueType    */\n  /* bytecode interpreter with a huge switch statement, rather than a call */\n  /* table.  This results in smaller and faster code for a number of       */\n  /* architectures.                                                        */\n  /*                                                                       */\n  /* Note however that on some compiler/processor combinations, undefining */\n  /* this macro will generate faster, though larger, code.                 */\n  /*                                                                       */\n#define TT_CONFIG_OPTION_INTERPRETER_SWITCH\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED to compile the        */\n  /* TrueType glyph loader to use Apple's definition of how to handle      */\n  /* component offsets in composite glyphs.                                */\n  /*                                                                       */\n  /* Apple and MS disagree on the default behavior of component offsets    */\n  /* in composites.  Apple says that they should be scaled by the scaling  */\n  /* factors in the transformation matrix (roughly, it's more complex)     */\n  /* while MS says they should not.  OpenType defines two bits in the      */\n  /* composite flags array which can be used to disambiguate, but old      */\n  /* fonts will not have them.                                             */\n  /*                                                                       */\n  /*   http://www.microsoft.com/typography/otspec/glyf.htm                 */\n  /*   http://fonts.apple.com/TTRefMan/RM06/Chap6glyf.html                 */\n  /*                                                                       */\n#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_GX_VAR_SUPPORT if you want to include         */\n  /* support for Apple's distortable font technology (fvar, gvar, cvar,    */\n  /* and avar tables).  This has many similarities to Type 1 Multiple      */\n  /* Masters support.                                                      */\n  /*                                                                       */\n#undef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_BDF if you want to include support for        */\n  /* an embedded `BDF ' table within SFNT-based bitmap formats.            */\n  /*                                                                       */\n#undef TT_CONFIG_OPTION_BDF\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****      T Y P E 1   D R I V E R    C O N F I G U R A T I O N       ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* T1_MAX_DICT_DEPTH is the maximum depth of nest dictionaries and       */\n  /* arrays in the Type 1 stream (see t1load.c).  A minimum of 4 is        */\n  /* required.                                                             */\n  /*                                                                       */\n#define T1_MAX_DICT_DEPTH  5\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine   */\n  /* calls during glyph loading.                                           */\n  /*                                                                       */\n#define T1_MAX_SUBRS_CALLS  16\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity.  A     */\n  /* minimum of 16 is required.                                            */\n  /*                                                                       */\n  /* The Chinese font MingTiEG-Medium (CNS 11643 character set) needs 256. */\n  /*                                                                       */\n#define T1_MAX_CHARSTRINGS_OPERANDS  512\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define this configuration macro if you want to prevent the            */\n  /* compilation of `t1afm', which is in charge of reading Type 1 AFM      */\n  /* files into an existing face.  Note that if set, the T1 driver will be */\n  /* unable to produce kerning distances.                                  */\n  /*                                                                       */\n#undef T1_CONFIG_OPTION_NO_AFM\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define this configuration macro if you want to prevent the            */\n  /* compilation of the Multiple Masters font support in the Type 1        */\n  /* driver.                                                               */\n  /*                                                                       */\n#undef T1_CONFIG_OPTION_NO_MM_SUPPORT\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****         C F F   D R I V E R    C O N F I G U R A T I O N        ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* CFF_CONFIG_OPTION_OLD_ENGINE controls whether the pre-Adobe CFF       */\n  /* engine gets compiled into FreeType.  If defined, it is possible to    */\n  /* switch between the two engines using the `hinting-engine' property of */\n  /* the cff driver module.                                                */\n  /*                                                                       */\n/* #define CFF_CONFIG_OPTION_OLD_ENGINE */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****    A U T O F I T   M O D U L E    C O N F I G U R A T I O N     ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Compile autofit module with CJK (Chinese, Japanese, Korean) script    */\n  /* support.                                                              */\n  /*                                                                       */\n#define AF_CONFIG_OPTION_CJK\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Compile autofit module with Indic script support.                     */\n  /*                                                                       */\n#define AF_CONFIG_OPTION_INDIC\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Compile autofit module with warp hinting.  The idea of the warping    */\n  /* code is to slightly scale and shift a glyph within a single dimension */\n  /* so that as much of its segments are aligned (more or less) on the     */\n  /* grid.  To find out the optimal scaling and shifting value, various    */\n  /* parameter combinations are tried and scored.                          */\n  /*                                                                       */\n  /* This experimental option is only active if the render mode is         */\n  /* FT_RENDER_MODE_LIGHT.                                                 */\n  /*                                                                       */\n/* #define AF_CONFIG_OPTION_USE_WARPER */\n\n  /* */\n\n\n  /*\n   *  This macro is obsolete.  Support has been removed in FreeType\n   *  version 2.5.\n   */\n/* #define FT_CONFIG_OPTION_OLD_INTERNALS */\n\n\n  /*\n   * This macro is defined if either unpatented or native TrueType\n   * hinting is requested by the definitions above.\n   */\n#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER\n#define  TT_USE_BYTECODE_INTERPRETER\n#undef   TT_CONFIG_OPTION_UNPATENTED_HINTING\n#elif defined TT_CONFIG_OPTION_UNPATENTED_HINTING\n#define  TT_USE_BYTECODE_INTERPRETER\n#endif\n\nFT_END_HEADER\n\n\n#endif /* __FTOPTION_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/config/ftstdlib.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftstdlib.h                                                             */\n/*                                                                         */\n/*    ANSI-specific library and header configuration file (specification   */\n/*    only).                                                               */\n/*                                                                         */\n/*  Copyright 2002-2007, 2009, 2011-2012 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to group all #includes to the ANSI C library that   */\n  /* FreeType normally requires.  It also defines macros to rename the     */\n  /* standard functions within the FreeType source code.                   */\n  /*                                                                       */\n  /* Load a file which defines __FTSTDLIB_H__ before this one to override  */\n  /* it.                                                                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTSTDLIB_H__\n#define __FTSTDLIB_H__\n\n\n#include <stddef.h>\n\n#define ft_ptrdiff_t  ptrdiff_t\n\n\n  /**********************************************************************/\n  /*                                                                    */\n  /*                           integer limits                           */\n  /*                                                                    */\n  /* UINT_MAX and ULONG_MAX are used to automatically compute the size  */\n  /* of `int' and `long' in bytes at compile-time.  So far, this works  */\n  /* for all platforms the library has been tested on.                  */\n  /*                                                                    */\n  /* Note that on the extremely rare platforms that do not provide      */\n  /* integer types that are _exactly_ 16 and 32 bits wide (e.g. some    */\n  /* old Crays where `int' is 36 bits), we do not make any guarantee    */\n  /* about the correct behaviour of FT2 with all fonts.                 */\n  /*                                                                    */\n  /* In these case, `ftconfig.h' will refuse to compile anyway with a   */\n  /* message like `couldn't find 32-bit type' or something similar.     */\n  /*                                                                    */\n  /**********************************************************************/\n\n\n#include <limits.h>\n\n#define FT_CHAR_BIT    CHAR_BIT\n#define FT_USHORT_MAX  USHRT_MAX\n#define FT_INT_MAX     INT_MAX\n#define FT_INT_MIN     INT_MIN\n#define FT_UINT_MAX    UINT_MAX\n#define FT_ULONG_MAX   ULONG_MAX\n\n\n  /**********************************************************************/\n  /*                                                                    */\n  /*                 character and string processing                    */\n  /*                                                                    */\n  /**********************************************************************/\n\n#include \"../../../../fxcrt/fx_system.h\"\n#include <string.h>\n\n#define ft_memchr   FXSYS_memchr\n#define ft_memcmp   FXSYS_memcmp32\n#define ft_memcpy   FXSYS_memcpy32\n#define ft_memmove  FXSYS_memmove32\n#define ft_memset   FXSYS_memset8\n//#define ft_strcat   FXSYS_strcat\n#define ft_strcmp   FXSYS_strcmp\n#define ft_strcpy   FXSYS_strcpy\n#define ft_strlen   FXSYS_strlen\n#define ft_strncmp  FXSYS_strncmp\n#define ft_strncpy  FXSYS_strncpy\n#define ft_strrchr  FXSYS_strrchr\n#define ft_strstr   FXSYS_strstr\n\n\n  /**********************************************************************/\n  /*                                                                    */\n  /*                           file handling                            */\n  /*                                                                    */\n  /**********************************************************************/\n\n\n#include <stdio.h>\n\n#define FT_FILE     FXSYS_FILE\n#define ft_fclose   FXSYS_fclose\n#define ft_fopen    FXSYS_fopen\n#define ft_fread    FXSYS_fread\n#define ft_fseek    FXSYS_fseek\n#define ft_ftell    FXSYS_ftell\n#define ft_sprintf  FXSYS_sprintf\n\n\n  /**********************************************************************/\n  /*                                                                    */\n  /*                             sorting                                */\n  /*                                                                    */\n  /**********************************************************************/\n\n\n//#include <stdlib.h>\n\n#define ft_qsort  FXSYS_qsort\n\n\n  /**********************************************************************/\n  /*                                                                    */\n  /*                        memory allocation                           */\n  /*                                                                    */\n  /**********************************************************************/\n\n\n#define ft_scalloc   calloc\n#define ft_sfree     free\n#define ft_smalloc   malloc\n#define ft_srealloc  realloc\n\n\n  /**********************************************************************/\n  /*                                                                    */\n  /*                          miscellaneous                             */\n  /*                                                                    */\n  /**********************************************************************/\n\n\n#define ft_atol   FXSYS_atoi\n#define ft_labs   labs\n\n\n  /**********************************************************************/\n  /*                                                                    */\n  /*                         execution control                          */\n  /*                                                                    */\n  /**********************************************************************/\n\n\n//#include <setjmp.h>\n\n#define ft_jmp_buf     jmp_buf  /* note: this cannot be a typedef since */\n                                /*       jmp_buf is defined as a macro  */\n                                /*       on certain platforms           */\n\n#define ft_longjmp     longjmp\n#define ft_setjmp( b ) setjmp( *(ft_jmp_buf*) &(b) ) /* same thing here */\n\n\n  /* the following is only used for debugging purposes, i.e., if */\n  /* FT_DEBUG_LEVEL_ERROR or FT_DEBUG_LEVEL_TRACE are defined    */\n\n#include <stdarg.h>\n\n\n#endif /* __FTSTDLIB_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/freetype.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  freetype.h                                                             */\n/*                                                                         */\n/*    FreeType high-level API and common types (specification only).       */\n/*                                                                         */\n/*  Copyright 1996-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FREETYPE_H__\n#define __FREETYPE_H__\n\n\n#ifndef FT_FREETYPE_H\n#error \"`ft2build.h' hasn't been included yet!\"\n#error \"Please always use macros to include FreeType header files.\"\n#error \"Example:\"\n#error \"  #include <ft2build.h>\"\n#error \"  #include FT_FREETYPE_H\"\n#endif\n\n\n#include \"../ft2build.h\"\n#include \"config/ftconfig.h\"\n#include \"fttypes.h\"\n#include \"fterrors.h\"\n\n\nFT_BEGIN_HEADER\n\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    user_allocation                                                    */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    User allocation                                                    */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    How client applications should allocate FreeType data structures.  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    FreeType assumes that structures allocated by the user and passed  */\n  /*    as arguments are zeroed out except for the actual data.  In other  */\n  /*    words, it is recommended to use `calloc' (or variants of it)       */\n  /*    instead of `malloc' for allocation.                                */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*                                                                       */\n  /*                        B A S I C   T Y P E S                          */\n  /*                                                                       */\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    base_interface                                                     */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Base Interface                                                     */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    The FreeType~2 base font interface.                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section describes the public high-level API of FreeType~2.    */\n  /*                                                                       */\n  /* <Order>                                                               */\n  /*    FT_Library                                                         */\n  /*    FT_Face                                                            */\n  /*    FT_Size                                                            */\n  /*    FT_GlyphSlot                                                       */\n  /*    FT_CharMap                                                         */\n  /*    FT_Encoding                                                        */\n  /*                                                                       */\n  /*    FT_FaceRec                                                         */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_SCALABLE                                              */\n  /*    FT_FACE_FLAG_FIXED_SIZES                                           */\n  /*    FT_FACE_FLAG_FIXED_WIDTH                                           */\n  /*    FT_FACE_FLAG_HORIZONTAL                                            */\n  /*    FT_FACE_FLAG_VERTICAL                                              */\n  /*    FT_FACE_FLAG_SFNT                                                  */\n  /*    FT_FACE_FLAG_KERNING                                               */\n  /*    FT_FACE_FLAG_MULTIPLE_MASTERS                                      */\n  /*    FT_FACE_FLAG_GLYPH_NAMES                                           */\n  /*    FT_FACE_FLAG_EXTERNAL_STREAM                                       */\n  /*    FT_FACE_FLAG_FAST_GLYPHS                                           */\n  /*    FT_FACE_FLAG_HINTER                                                */\n  /*                                                                       */\n  /*    FT_STYLE_FLAG_BOLD                                                 */\n  /*    FT_STYLE_FLAG_ITALIC                                               */\n  /*                                                                       */\n  /*    FT_SizeRec                                                         */\n  /*    FT_Size_Metrics                                                    */\n  /*                                                                       */\n  /*    FT_GlyphSlotRec                                                    */\n  /*    FT_Glyph_Metrics                                                   */\n  /*    FT_SubGlyph                                                        */\n  /*                                                                       */\n  /*    FT_Bitmap_Size                                                     */\n  /*                                                                       */\n  /*    FT_Init_FreeType                                                   */\n  /*    FT_Done_FreeType                                                   */\n  /*                                                                       */\n  /*    FT_New_Face                                                        */\n  /*    FT_Done_Face                                                       */\n  /*    FT_New_Memory_Face                                                 */\n  /*    FT_Open_Face                                                       */\n  /*    FT_Open_Args                                                       */\n  /*    FT_Parameter                                                       */\n  /*    FT_Attach_File                                                     */\n  /*    FT_Attach_Stream                                                   */\n  /*                                                                       */\n  /*    FT_Set_Char_Size                                                   */\n  /*    FT_Set_Pixel_Sizes                                                 */\n  /*    FT_Request_Size                                                    */\n  /*    FT_Select_Size                                                     */\n  /*    FT_Size_Request_Type                                               */\n  /*    FT_Size_Request                                                    */\n  /*    FT_Set_Transform                                                   */\n  /*    FT_Load_Glyph                                                      */\n  /*    FT_Get_Char_Index                                                  */\n  /*    FT_Get_Name_Index                                                  */\n  /*    FT_Load_Char                                                       */\n  /*                                                                       */\n  /*    FT_OPEN_MEMORY                                                     */\n  /*    FT_OPEN_STREAM                                                     */\n  /*    FT_OPEN_PATHNAME                                                   */\n  /*    FT_OPEN_DRIVER                                                     */\n  /*    FT_OPEN_PARAMS                                                     */\n  /*                                                                       */\n  /*    FT_LOAD_DEFAULT                                                    */\n  /*    FT_LOAD_RENDER                                                     */\n  /*    FT_LOAD_MONOCHROME                                                 */\n  /*    FT_LOAD_LINEAR_DESIGN                                              */\n  /*    FT_LOAD_NO_SCALE                                                   */\n  /*    FT_LOAD_NO_HINTING                                                 */\n  /*    FT_LOAD_NO_BITMAP                                                  */\n  /*    FT_LOAD_CROP_BITMAP                                                */\n  /*                                                                       */\n  /*    FT_LOAD_VERTICAL_LAYOUT                                            */\n  /*    FT_LOAD_IGNORE_TRANSFORM                                           */\n  /*    FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH                                */\n  /*    FT_LOAD_FORCE_AUTOHINT                                             */\n  /*    FT_LOAD_NO_RECURSE                                                 */\n  /*    FT_LOAD_PEDANTIC                                                   */\n  /*                                                                       */\n  /*    FT_LOAD_TARGET_NORMAL                                              */\n  /*    FT_LOAD_TARGET_LIGHT                                               */\n  /*    FT_LOAD_TARGET_MONO                                                */\n  /*    FT_LOAD_TARGET_LCD                                                 */\n  /*    FT_LOAD_TARGET_LCD_V                                               */\n  /*                                                                       */\n  /*    FT_Render_Glyph                                                    */\n  /*    FT_Render_Mode                                                     */\n  /*    FT_Get_Kerning                                                     */\n  /*    FT_Kerning_Mode                                                    */\n  /*    FT_Get_Track_Kerning                                               */\n  /*    FT_Get_Glyph_Name                                                  */\n  /*    FT_Get_Postscript_Name                                             */\n  /*                                                                       */\n  /*    FT_CharMapRec                                                      */\n  /*    FT_Select_Charmap                                                  */\n  /*    FT_Set_Charmap                                                     */\n  /*    FT_Get_Charmap_Index                                               */\n  /*                                                                       */\n  /*    FT_FSTYPE_INSTALLABLE_EMBEDDING                                    */\n  /*    FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING                             */\n  /*    FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING                              */\n  /*    FT_FSTYPE_EDITABLE_EMBEDDING                                       */\n  /*    FT_FSTYPE_NO_SUBSETTING                                            */\n  /*    FT_FSTYPE_BITMAP_EMBEDDING_ONLY                                    */\n  /*                                                                       */\n  /*    FT_Get_FSType_Flags                                                */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Glyph_Metrics                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model the metrics of a single glyph.  The      */\n  /*    values are expressed in 26.6 fractional pixel format; if the flag  */\n  /*    @FT_LOAD_NO_SCALE has been used while loading the glyph, values    */\n  /*    are expressed in font units instead.                               */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    width ::                                                           */\n  /*      The glyph's width.                                               */\n  /*                                                                       */\n  /*    height ::                                                          */\n  /*      The glyph's height.                                              */\n  /*                                                                       */\n  /*    horiBearingX ::                                                    */\n  /*      Left side bearing for horizontal layout.                         */\n  /*                                                                       */\n  /*    horiBearingY ::                                                    */\n  /*      Top side bearing for horizontal layout.                          */\n  /*                                                                       */\n  /*    horiAdvance ::                                                     */\n  /*      Advance width for horizontal layout.                             */\n  /*                                                                       */\n  /*    vertBearingX ::                                                    */\n  /*      Left side bearing for vertical layout.                           */\n  /*                                                                       */\n  /*    vertBearingY ::                                                    */\n  /*      Top side bearing for vertical layout.  Larger positive values    */\n  /*      mean further below the vertical glyph origin.                    */\n  /*                                                                       */\n  /*    vertAdvance ::                                                     */\n  /*      Advance height for vertical layout.  Positive values mean the    */\n  /*      glyph has a positive advance downward.                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If not disabled with @FT_LOAD_NO_HINTING, the values represent     */\n  /*    dimensions of the hinted glyph (in case hinting is applicable).    */\n  /*                                                                       */\n  /*    Stroking a glyph with an outside border does not increase          */\n  /*    `horiAdvance' or `vertAdvance'; you have to manually adjust these  */\n  /*    values to account for the added width and height.                  */\n  /*                                                                       */\n  typedef struct  FT_Glyph_Metrics_\n  {\n    FT_Pos  width;\n    FT_Pos  height;\n\n    FT_Pos  horiBearingX;\n    FT_Pos  horiBearingY;\n    FT_Pos  horiAdvance;\n\n    FT_Pos  vertBearingX;\n    FT_Pos  vertBearingY;\n    FT_Pos  vertAdvance;\n\n  } FT_Glyph_Metrics;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Bitmap_Size                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This structure models the metrics of a bitmap strike (i.e., a set  */\n  /*    of glyphs for a given point size and resolution) in a bitmap font. */\n  /*    It is used for the `available_sizes' field of @FT_Face.            */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    height :: The vertical distance, in pixels, between two            */\n  /*              consecutive baselines.  It is always positive.           */\n  /*                                                                       */\n  /*    width  :: The average width, in pixels, of all glyphs in the       */\n  /*              strike.                                                  */\n  /*                                                                       */\n  /*    size   :: The nominal size of the strike in 26.6 fractional        */\n  /*              points.  This field is not very useful.                  */\n  /*                                                                       */\n  /*    x_ppem :: The horizontal ppem (nominal width) in 26.6 fractional   */\n  /*              pixels.                                                  */\n  /*                                                                       */\n  /*    y_ppem :: The vertical ppem (nominal height) in 26.6 fractional    */\n  /*              pixels.                                                  */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Windows FNT:                                                       */\n  /*      The nominal size given in a FNT font is not reliable.  Thus when */\n  /*      the driver finds it incorrect, it sets `size' to some calculated */\n  /*      values and sets `x_ppem' and `y_ppem' to the pixel width and     */\n  /*      height given in the font, respectively.                          */\n  /*                                                                       */\n  /*    TrueType embedded bitmaps:                                         */\n  /*      `size', `width', and `height' values are not contained in the    */\n  /*      bitmap strike itself.  They are computed from the global font    */\n  /*      parameters.                                                      */\n  /*                                                                       */\n  typedef struct  FT_Bitmap_Size_\n  {\n    FT_Short  height;\n    FT_Short  width;\n\n    FT_Pos    size;\n\n    FT_Pos    x_ppem;\n    FT_Pos    y_ppem;\n\n  } FT_Bitmap_Size;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*                                                                       */\n  /*                     O B J E C T   C L A S S E S                       */\n  /*                                                                       */\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Library                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a FreeType library instance.  Each `library' is        */\n  /*    completely independent from the others; it is the `root' of a set  */\n  /*    of objects like fonts, faces, sizes, etc.                          */\n  /*                                                                       */\n  /*    It also embeds a memory manager (see @FT_Memory), as well as a     */\n  /*    scan-line converter object (see @FT_Raster).                       */\n  /*                                                                       */\n  /*    In multi-threaded applications, make sure that the same FT_Library */\n  /*    object or any of its children doesn't get accessed in parallel.    */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Library objects are normally created by @FT_Init_FreeType, and     */\n  /*    destroyed with @FT_Done_FreeType.  If you need reference-counting  */\n  /*    (cf. @FT_Reference_Library), use @FT_New_Library and               */\n  /*    @FT_Done_Library.                                                  */\n  /*                                                                       */\n  typedef struct FT_LibraryRec_  *FT_Library;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Module                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a given FreeType module object.  Each module can be a  */\n  /*    font driver, a renderer, or anything else that provides services   */\n  /*    to the formers.                                                    */\n  /*                                                                       */\n  typedef struct FT_ModuleRec_*  FT_Module;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Driver                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a given FreeType font driver object.  Each font driver */\n  /*    is a special module capable of creating faces from font files.     */\n  /*                                                                       */\n  typedef struct FT_DriverRec_*  FT_Driver;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Renderer                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a given FreeType renderer.  A renderer is a special    */\n  /*    module in charge of converting a glyph image to a bitmap, when     */\n  /*    necessary.  Each renderer supports a given glyph image format, and */\n  /*    one or more target surface depths.                                 */\n  /*                                                                       */\n  typedef struct FT_RendererRec_*  FT_Renderer;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Face                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a given typographic face object.  A face object models */\n  /*    a given typeface, in a given style.                                */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Each face object also owns a single @FT_GlyphSlot object, as well  */\n  /*    as one or more @FT_Size objects.                                   */\n  /*                                                                       */\n  /*    Use @FT_New_Face or @FT_Open_Face to create a new face object from */\n  /*    a given filepathname or a custom input stream.                     */\n  /*                                                                       */\n  /*    Use @FT_Done_Face to destroy it (along with its slot and sizes).   */\n  /*                                                                       */\n  /* <Also>                                                                */\n  /*    See @FT_FaceRec for the publicly accessible fields of a given face */\n  /*    object.                                                            */\n  /*                                                                       */\n  typedef struct FT_FaceRec_*  FT_Face;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Size                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to an object used to model a face scaled to a given       */\n  /*    character size.                                                    */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Each @FT_Face has an _active_ @FT_Size object that is used by      */\n  /*    functions like @FT_Load_Glyph to determine the scaling             */\n  /*    transformation which is used to load and hint glyphs and metrics.  */\n  /*                                                                       */\n  /*    You can use @FT_Set_Char_Size, @FT_Set_Pixel_Sizes,                */\n  /*    @FT_Request_Size or even @FT_Select_Size to change the content     */\n  /*    (i.e., the scaling values) of the active @FT_Size.                 */\n  /*                                                                       */\n  /*    You can use @FT_New_Size to create additional size objects for a   */\n  /*    given @FT_Face, but they won't be used by other functions until    */\n  /*    you activate it through @FT_Activate_Size.  Only one size can be   */\n  /*    activated at any given time per face.                              */\n  /*                                                                       */\n  /* <Also>                                                                */\n  /*    See @FT_SizeRec for the publicly accessible fields of a given size */\n  /*    object.                                                            */\n  /*                                                                       */\n  typedef struct FT_SizeRec_*  FT_Size;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_GlyphSlot                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a given `glyph slot'.  A slot is a container where it  */\n  /*    is possible to load any of the glyphs contained in its parent      */\n  /*    face.                                                              */\n  /*                                                                       */\n  /*    In other words, each time you call @FT_Load_Glyph or               */\n  /*    @FT_Load_Char, the slot's content is erased by the new glyph data, */\n  /*    i.e., the glyph's metrics, its image (bitmap or outline), and      */\n  /*    other control information.                                         */\n  /*                                                                       */\n  /* <Also>                                                                */\n  /*    See @FT_GlyphSlotRec for the publicly accessible glyph fields.     */\n  /*                                                                       */\n  typedef struct FT_GlyphSlotRec_*  FT_GlyphSlot;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_CharMap                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a given character map.  A charmap is used to translate */\n  /*    character codes in a given encoding into glyph indexes for its     */\n  /*    parent's face.  Some font formats may provide several charmaps per */\n  /*    font.                                                              */\n  /*                                                                       */\n  /*    Each face object owns zero or more charmaps, but only one of them  */\n  /*    can be `active' and used by @FT_Get_Char_Index or @FT_Load_Char.   */\n  /*                                                                       */\n  /*    The list of available charmaps in a face is available through the  */\n  /*    `face->num_charmaps' and `face->charmaps' fields of @FT_FaceRec.   */\n  /*                                                                       */\n  /*    The currently active charmap is available as `face->charmap'.      */\n  /*    You should call @FT_Set_Charmap to change it.                      */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    When a new face is created (either through @FT_New_Face or         */\n  /*    @FT_Open_Face), the library looks for a Unicode charmap within     */\n  /*    the list and automatically activates it.                           */\n  /*                                                                       */\n  /* <Also>                                                                */\n  /*    See @FT_CharMapRec for the publicly accessible fields of a given   */\n  /*    character map.                                                     */\n  /*                                                                       */\n  typedef struct FT_CharMapRec_*  FT_CharMap;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_ENC_TAG                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This macro converts four-letter tags into an unsigned long.  It is */\n  /*    used to define `encoding' identifiers (see @FT_Encoding).          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Since many 16-bit compilers don't like 32-bit enumerations, you    */\n  /*    should redefine this macro in case of problems to something like   */\n  /*    this:                                                              */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      #define FT_ENC_TAG( value, a, b, c, d )  value                   */\n  /*    }                                                                  */\n  /*                                                                       */\n  /*    to get a simple enumeration without assigning special numbers.     */\n  /*                                                                       */\n\n#ifndef FT_ENC_TAG\n#define FT_ENC_TAG( value, a, b, c, d )         \\\n          value = ( ( (FT_UInt32)(a) << 24 ) |  \\\n                    ( (FT_UInt32)(b) << 16 ) |  \\\n                    ( (FT_UInt32)(c) <<  8 ) |  \\\n                      (FT_UInt32)(d)         )\n\n#endif /* FT_ENC_TAG */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Encoding                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration used to specify character sets supported by         */\n  /*    charmaps.  Used in the @FT_Select_Charmap API function.            */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Despite the name, this enumeration lists specific character        */\n  /*    repertories (i.e., charsets), and not text encoding methods (e.g., */\n  /*    UTF-8, UTF-16, etc.).                                              */\n  /*                                                                       */\n  /*    Other encodings might be defined in the future.                    */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_ENCODING_NONE ::                                                */\n  /*      The encoding value~0 is reserved.                                */\n  /*                                                                       */\n  /*    FT_ENCODING_UNICODE ::                                             */\n  /*      Corresponds to the Unicode character set.  This value covers     */\n  /*      all versions of the Unicode repertoire, including ASCII and      */\n  /*      Latin-1.  Most fonts include a Unicode charmap, but not all      */\n  /*      of them.                                                         */\n  /*                                                                       */\n  /*      For example, if you want to access Unicode value U+1F028 (and    */\n  /*      the font contains it), use value 0x1F028 as the input value for  */\n  /*      @FT_Get_Char_Index.                                              */\n  /*                                                                       */\n  /*    FT_ENCODING_MS_SYMBOL ::                                           */\n  /*      Corresponds to the Microsoft Symbol encoding, used to encode     */\n  /*      mathematical symbols in the 32..255 character code range.  For   */\n  /*      more information, see `http://www.ceviz.net/symbol.htm'.         */\n  /*                                                                       */\n  /*    FT_ENCODING_SJIS ::                                                */\n  /*      Corresponds to Japanese SJIS encoding.  More info at             */\n  /*      at `http://langsupport.japanreference.com/encoding.shtml'.       */\n  /*      See note on multi-byte encodings below.                          */\n  /*                                                                       */\n  /*    FT_ENCODING_GB2312 ::                                              */\n  /*      Corresponds to an encoding system for Simplified Chinese as used */\n  /*      used in mainland China.                                          */\n  /*                                                                       */\n  /*    FT_ENCODING_BIG5 ::                                                */\n  /*      Corresponds to an encoding system for Traditional Chinese as     */\n  /*      used in Taiwan and Hong Kong.                                    */\n  /*                                                                       */\n  /*    FT_ENCODING_WANSUNG ::                                             */\n  /*      Corresponds to the Korean encoding system known as Wansung.      */\n  /*      For more information see                                         */\n  /*      `http://www.microsoft.com/typography/unicode/949.txt'.           */\n  /*                                                                       */\n  /*    FT_ENCODING_JOHAB ::                                               */\n  /*      The Korean standard character set (KS~C 5601-1992), which        */\n  /*      corresponds to MS Windows code page 1361.  This character set    */\n  /*      includes all possible Hangeul character combinations.            */\n  /*                                                                       */\n  /*    FT_ENCODING_ADOBE_LATIN_1 ::                                       */\n  /*      Corresponds to a Latin-1 encoding as defined in a Type~1         */\n  /*      PostScript font.  It is limited to 256 character codes.          */\n  /*                                                                       */\n  /*    FT_ENCODING_ADOBE_STANDARD ::                                      */\n  /*      Corresponds to the Adobe Standard encoding, as found in Type~1,  */\n  /*      CFF, and OpenType/CFF fonts.  It is limited to 256 character     */\n  /*      codes.                                                           */\n  /*                                                                       */\n  /*    FT_ENCODING_ADOBE_EXPERT ::                                        */\n  /*      Corresponds to the Adobe Expert encoding, as found in Type~1,    */\n  /*      CFF, and OpenType/CFF fonts.  It is limited to 256 character     */\n  /*      codes.                                                           */\n  /*                                                                       */\n  /*    FT_ENCODING_ADOBE_CUSTOM ::                                        */\n  /*      Corresponds to a custom encoding, as found in Type~1, CFF, and   */\n  /*      OpenType/CFF fonts.  It is limited to 256 character codes.       */\n  /*                                                                       */\n  /*    FT_ENCODING_APPLE_ROMAN ::                                         */\n  /*      Corresponds to the 8-bit Apple roman encoding.  Many TrueType    */\n  /*      and OpenType fonts contain a charmap for this encoding, since    */\n  /*      older versions of Mac OS are able to use it.                     */\n  /*                                                                       */\n  /*    FT_ENCODING_OLD_LATIN_2 ::                                         */\n  /*      This value is deprecated and was never used nor reported by      */\n  /*      FreeType.  Don't use or test for it.                             */\n  /*                                                                       */\n  /*    FT_ENCODING_MS_SJIS ::                                             */\n  /*      Same as FT_ENCODING_SJIS.  Deprecated.                           */\n  /*                                                                       */\n  /*    FT_ENCODING_MS_GB2312 ::                                           */\n  /*      Same as FT_ENCODING_GB2312.  Deprecated.                         */\n  /*                                                                       */\n  /*    FT_ENCODING_MS_BIG5 ::                                             */\n  /*      Same as FT_ENCODING_BIG5.  Deprecated.                           */\n  /*                                                                       */\n  /*    FT_ENCODING_MS_WANSUNG ::                                          */\n  /*      Same as FT_ENCODING_WANSUNG.  Deprecated.                        */\n  /*                                                                       */\n  /*    FT_ENCODING_MS_JOHAB ::                                            */\n  /*      Same as FT_ENCODING_JOHAB.  Deprecated.                          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    By default, FreeType automatically synthesizes a Unicode charmap   */\n  /*    for PostScript fonts, using their glyph names dictionaries.        */\n  /*    However, it also reports the encodings defined explicitly in the   */\n  /*    font file, for the cases when they are needed, with the Adobe      */\n  /*    values as well.                                                    */\n  /*                                                                       */\n  /*    FT_ENCODING_NONE is set by the BDF and PCF drivers if the charmap  */\n  /*    is neither Unicode nor ISO-8859-1 (otherwise it is set to          */\n  /*    FT_ENCODING_UNICODE).  Use @FT_Get_BDF_Charset_ID to find out      */\n  /*    which encoding is really present.  If, for example, the            */\n  /*    `cs_registry' field is `KOI8' and the `cs_encoding' field is `R',  */\n  /*    the font is encoded in KOI8-R.                                     */\n  /*                                                                       */\n  /*    FT_ENCODING_NONE is always set (with a single exception) by the    */\n  /*    winfonts driver.  Use @FT_Get_WinFNT_Header and examine the        */\n  /*    `charset' field of the @FT_WinFNT_HeaderRec structure to find out  */\n  /*    which encoding is really present.  For example,                    */\n  /*    @FT_WinFNT_ID_CP1251 (204) means Windows code page 1251 (for       */\n  /*    Russian).                                                          */\n  /*                                                                       */\n  /*    FT_ENCODING_NONE is set if `platform_id' is @TT_PLATFORM_MACINTOSH */\n  /*    and `encoding_id' is not @TT_MAC_ID_ROMAN (otherwise it is set to  */\n  /*    FT_ENCODING_APPLE_ROMAN).                                          */\n  /*                                                                       */\n  /*    If `platform_id' is @TT_PLATFORM_MACINTOSH, use the function       */\n  /*    @FT_Get_CMap_Language_ID  to query the Mac language ID which may   */\n  /*    be needed to be able to distinguish Apple encoding variants.  See  */\n  /*                                                                       */\n  /*      http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/README.TXT  */\n  /*                                                                       */\n  /*    to get an idea how to do that.  Basically, if the language ID      */\n  /*    is~0, don't use it, otherwise subtract 1 from the language ID.     */\n  /*    Then examine `encoding_id'.  If, for example, `encoding_id' is     */\n  /*    @TT_MAC_ID_ROMAN and the language ID (minus~1) is                  */\n  /*    `TT_MAC_LANGID_GREEK', it is the Greek encoding, not Roman.        */\n  /*    @TT_MAC_ID_ARABIC with `TT_MAC_LANGID_FARSI' means the Farsi       */\n  /*    variant the Arabic encoding.                                       */\n  /*                                                                       */\n  typedef enum  FT_Encoding_\n  {\n    FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ),\n\n    FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ),\n    FT_ENC_TAG( FT_ENCODING_UNICODE,   'u', 'n', 'i', 'c' ),\n\n    FT_ENC_TAG( FT_ENCODING_SJIS,    's', 'j', 'i', 's' ),\n    FT_ENC_TAG( FT_ENCODING_GB2312,  'g', 'b', ' ', ' ' ),\n    FT_ENC_TAG( FT_ENCODING_BIG5,    'b', 'i', 'g', '5' ),\n    FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ),\n    FT_ENC_TAG( FT_ENCODING_JOHAB,   'j', 'o', 'h', 'a' ),\n\n    /* for backwards compatibility */\n    FT_ENCODING_MS_SJIS    = FT_ENCODING_SJIS,\n    FT_ENCODING_MS_GB2312  = FT_ENCODING_GB2312,\n    FT_ENCODING_MS_BIG5    = FT_ENCODING_BIG5,\n    FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG,\n    FT_ENCODING_MS_JOHAB   = FT_ENCODING_JOHAB,\n\n    FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ),\n    FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT,   'A', 'D', 'B', 'E' ),\n    FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM,   'A', 'D', 'B', 'C' ),\n    FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1,  'l', 'a', 't', '1' ),\n\n    FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ),\n\n    FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' )\n\n  } FT_Encoding;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    ft_encoding_xxx                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    These constants are deprecated; use the corresponding @FT_Encoding */\n  /*    values instead.                                                    */\n  /*                                                                       */\n#define ft_encoding_none            FT_ENCODING_NONE\n#define ft_encoding_unicode         FT_ENCODING_UNICODE\n#define ft_encoding_symbol          FT_ENCODING_MS_SYMBOL\n#define ft_encoding_latin_1         FT_ENCODING_ADOBE_LATIN_1\n#define ft_encoding_latin_2         FT_ENCODING_OLD_LATIN_2\n#define ft_encoding_sjis            FT_ENCODING_SJIS\n#define ft_encoding_gb2312          FT_ENCODING_GB2312\n#define ft_encoding_big5            FT_ENCODING_BIG5\n#define ft_encoding_wansung         FT_ENCODING_WANSUNG\n#define ft_encoding_johab           FT_ENCODING_JOHAB\n\n#define ft_encoding_adobe_standard  FT_ENCODING_ADOBE_STANDARD\n#define ft_encoding_adobe_expert    FT_ENCODING_ADOBE_EXPERT\n#define ft_encoding_adobe_custom    FT_ENCODING_ADOBE_CUSTOM\n#define ft_encoding_apple_roman     FT_ENCODING_APPLE_ROMAN\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_CharMapRec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The base charmap structure.                                        */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    face        :: A handle to the parent face object.                 */\n  /*                                                                       */\n  /*    encoding    :: An @FT_Encoding tag identifying the charmap.  Use   */\n  /*                   this with @FT_Select_Charmap.                       */\n  /*                                                                       */\n  /*    platform_id :: An ID number describing the platform for the        */\n  /*                   following encoding ID.  This comes directly from    */\n  /*                   the TrueType specification and should be emulated   */\n  /*                   for other formats.                                  */\n  /*                                                                       */\n  /*    encoding_id :: A platform specific encoding number.  This also     */\n  /*                   comes from the TrueType specification and should be */\n  /*                   emulated similarly.                                 */\n  /*                                                                       */\n  typedef struct  FT_CharMapRec_\n  {\n    FT_Face      face;\n    FT_Encoding  encoding;\n    FT_UShort    platform_id;\n    FT_UShort    encoding_id;\n\n  } FT_CharMapRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*                                                                       */\n  /*                 B A S E   O B J E C T   C L A S S E S                 */\n  /*                                                                       */\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Face_Internal                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An opaque handle to an `FT_Face_InternalRec' structure, used to    */\n  /*    model private data of a given @FT_Face object.                     */\n  /*                                                                       */\n  /*    This structure might change between releases of FreeType~2 and is  */\n  /*    not generally available to client applications.                    */\n  /*                                                                       */\n  typedef struct FT_Face_InternalRec_*  FT_Face_Internal;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_FaceRec                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    FreeType root face class structure.  A face object models a        */\n  /*    typeface in a font file.                                           */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    num_faces           :: The number of faces in the font file.  Some */\n  /*                           font formats can have multiple faces in     */\n  /*                           a font file.                                */\n  /*                                                                       */\n  /*    face_index          :: The index of the face in the font file.  It */\n  /*                           is set to~0 if there is only one face in    */\n  /*                           the font file.                              */\n  /*                                                                       */\n  /*    face_flags          :: A set of bit flags that give important      */\n  /*                           information about the face; see             */\n  /*                           @FT_FACE_FLAG_XXX for the details.          */\n  /*                                                                       */\n  /*    style_flags         :: A set of bit flags indicating the style of  */\n  /*                           the face; see @FT_STYLE_FLAG_XXX for the    */\n  /*                           details.                                    */\n  /*                                                                       */\n  /*    num_glyphs          :: The number of glyphs in the face.  If the   */\n  /*                           face is scalable and has sbits (see         */\n  /*                           `num_fixed_sizes'), it is set to the number */\n  /*                           of outline glyphs.                          */\n  /*                                                                       */\n  /*                           For CID-keyed fonts, this value gives the   */\n  /*                           highest CID used in the font.               */\n  /*                                                                       */\n  /*    family_name         :: The face's family name.  This is an ASCII   */\n  /*                           string, usually in English, which describes */\n  /*                           the typeface's family (like `Times New      */\n  /*                           Roman', `Bodoni', `Garamond', etc).  This   */\n  /*                           is a least common denominator used to list  */\n  /*                           fonts.  Some formats (TrueType & OpenType)  */\n  /*                           provide localized and Unicode versions of   */\n  /*                           this string.  Applications should use the   */\n  /*                           format specific interface to access them.   */\n  /*                           Can be NULL (e.g., in fonts embedded in a   */\n  /*                           PDF file).                                  */\n  /*                                                                       */\n  /*    style_name          :: The face's style name.  This is an ASCII    */\n  /*                           string, usually in English, which describes */\n  /*                           the typeface's style (like `Italic',        */\n  /*                           `Bold', `Condensed', etc).  Not all font    */\n  /*                           formats provide a style name, so this field */\n  /*                           is optional, and can be set to NULL.  As    */\n  /*                           for `family_name', some formats provide     */\n  /*                           localized and Unicode versions of this      */\n  /*                           string.  Applications should use the format */\n  /*                           specific interface to access them.          */\n  /*                                                                       */\n  /*    num_fixed_sizes     :: The number of bitmap strikes in the face.   */\n  /*                           Even if the face is scalable, there might   */\n  /*                           still be bitmap strikes, which are called   */\n  /*                           `sbits' in that case.                       */\n  /*                                                                       */\n  /*    available_sizes     :: An array of @FT_Bitmap_Size for all bitmap  */\n  /*                           strikes in the face.  It is set to NULL if  */\n  /*                           there is no bitmap strike.                  */\n  /*                                                                       */\n  /*    num_charmaps        :: The number of charmaps in the face.         */\n  /*                                                                       */\n  /*    charmaps            :: An array of the charmaps of the face.       */\n  /*                                                                       */\n  /*    generic             :: A field reserved for client uses.  See the  */\n  /*                           @FT_Generic type description.               */\n  /*                                                                       */\n  /*    bbox                :: The font bounding box.  Coordinates are     */\n  /*                           expressed in font units (see                */\n  /*                           `units_per_EM').  The box is large enough   */\n  /*                           to contain any glyph from the font.  Thus,  */\n  /*                           `bbox.yMax' can be seen as the `maximum     */\n  /*                           ascender', and `bbox.yMin' as the `minimum  */\n  /*                           descender'.  Only relevant for scalable     */\n  /*                           formats.                                    */\n  /*                                                                       */\n  /*                           Note that the bounding box might be off by  */\n  /*                           (at least) one pixel for hinted fonts.  See */\n  /*                           @FT_Size_Metrics for further discussion.    */\n  /*                                                                       */\n  /*    units_per_EM        :: The number of font units per EM square for  */\n  /*                           this face.  This is typically 2048 for      */\n  /*                           TrueType fonts, and 1000 for Type~1 fonts.  */\n  /*                           Only relevant for scalable formats.         */\n  /*                                                                       */\n  /*    ascender            :: The typographic ascender of the face,       */\n  /*                           expressed in font units.  For font formats  */\n  /*                           not having this information, it is set to   */\n  /*                           `bbox.yMax'.  Only relevant for scalable    */\n  /*                           formats.                                    */\n  /*                                                                       */\n  /*    descender           :: The typographic descender of the face,      */\n  /*                           expressed in font units.  For font formats  */\n  /*                           not having this information, it is set to   */\n  /*                           `bbox.yMin'.  Note that this field is       */\n  /*                           usually negative.  Only relevant for        */\n  /*                           scalable formats.                           */\n  /*                                                                       */\n  /*    height              :: This value is the vertical distance         */\n  /*                           between two consecutive baselines,          */\n  /*                           expressed in font units.  It is always      */\n  /*                           positive.  Only relevant for scalable       */\n  /*                           formats.                                    */\n  /*                                                                       */\n  /*                           If you want the global glyph height, use    */\n  /*                           `ascender - descender'.                     */\n  /*                                                                       */\n  /*    max_advance_width   :: The maximum advance width, in font units,   */\n  /*                           for all glyphs in this face.  This can be   */\n  /*                           used to make word wrapping computations     */\n  /*                           faster.  Only relevant for scalable         */\n  /*                           formats.                                    */\n  /*                                                                       */\n  /*    max_advance_height  :: The maximum advance height, in font units,  */\n  /*                           for all glyphs in this face.  This is only  */\n  /*                           relevant for vertical layouts, and is set   */\n  /*                           to `height' for fonts that do not provide   */\n  /*                           vertical metrics.  Only relevant for        */\n  /*                           scalable formats.                           */\n  /*                                                                       */\n  /*    underline_position  :: The position, in font units, of the         */\n  /*                           underline line for this face.  It is the    */\n  /*                           center of the underlining stem.  Only       */\n  /*                           relevant for scalable formats.              */\n  /*                                                                       */\n  /*    underline_thickness :: The thickness, in font units, of the        */\n  /*                           underline for this face.  Only relevant for */\n  /*                           scalable formats.                           */\n  /*                                                                       */\n  /*    glyph               :: The face's associated glyph slot(s).        */\n  /*                                                                       */\n  /*    size                :: The current active size for this face.      */\n  /*                                                                       */\n  /*    charmap             :: The current active charmap for this face.   */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Fields may be changed after a call to @FT_Attach_File or           */\n  /*    @FT_Attach_Stream.                                                 */\n  /*                                                                       */\n  typedef struct  FT_FaceRec_\n  {\n    FT_Long           num_faces;\n    FT_Long           face_index;\n\n    FT_Long           face_flags;\n    FT_Long           style_flags;\n\n    FT_Long           num_glyphs;\n\n    FT_String*        family_name;\n    FT_String*        style_name;\n\n    FT_Int            num_fixed_sizes;\n    FT_Bitmap_Size*   available_sizes;\n\n    FT_Int            num_charmaps;\n    FT_CharMap*       charmaps;\n\n#ifdef\t_FX_MANAGED_CODE_\n#define generic\t\tgeneric_data\n#endif\n\n    FT_Generic        generic;\n\n    /*# The following member variables (down to `underline_thickness') */\n    /*# are only relevant to scalable outlines; cf. @FT_Bitmap_Size    */\n    /*# for bitmap fonts.                                              */\n    FT_BBox           bbox;\n\n    FT_UShort         units_per_EM;\n    FT_Short          ascender;\n    FT_Short          descender;\n    FT_Short          height;\n\n    FT_Short          max_advance_width;\n    FT_Short          max_advance_height;\n\n    FT_Short          underline_position;\n    FT_Short          underline_thickness;\n\n    FT_GlyphSlot      glyph;\n    FT_Size           size;\n    FT_CharMap        charmap;\n\n    /*@private begin */\n\n    FT_Driver         driver;\n    FT_Memory         memory;\n    FT_Stream         stream;\n\n    FT_ListRec        sizes_list;\n\n    FT_Generic        autohint;   /* face-specific auto-hinter data */\n    void*             extensions; /* unused                         */\n\n    FT_Face_Internal  internal;\n\n    /*@private end */\n\n  } FT_FaceRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_FACE_FLAG_XXX                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A list of bit flags used in the `face_flags' field of the          */\n  /*    @FT_FaceRec structure.  They inform client applications of         */\n  /*    properties of the corresponding face.                              */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_FACE_FLAG_SCALABLE ::                                           */\n  /*      Indicates that the face contains outline glyphs.  This doesn't   */\n  /*      prevent bitmap strikes, i.e., a face can have both this and      */\n  /*      and @FT_FACE_FLAG_FIXED_SIZES set.                               */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_FIXED_SIZES ::                                        */\n  /*      Indicates that the face contains bitmap strikes.  See also the   */\n  /*      `num_fixed_sizes' and `available_sizes' fields of @FT_FaceRec.   */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_FIXED_WIDTH ::                                        */\n  /*      Indicates that the face contains fixed-width characters (like    */\n  /*      Courier, Lucido, MonoType, etc.).                                */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_SFNT ::                                               */\n  /*      Indicates that the face uses the `sfnt' storage scheme.  For     */\n  /*      now, this means TrueType and OpenType.                           */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_HORIZONTAL ::                                         */\n  /*      Indicates that the face contains horizontal glyph metrics.  This */\n  /*      should be set for all common formats.                            */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_VERTICAL ::                                           */\n  /*      Indicates that the face contains vertical glyph metrics.  This   */\n  /*      is only available in some formats, not all of them.              */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_KERNING ::                                            */\n  /*      Indicates that the face contains kerning information.  If set,   */\n  /*      the kerning distance can be retrieved through the function       */\n  /*      @FT_Get_Kerning.  Otherwise the function always return the       */\n  /*      vector (0,0).  Note that FreeType doesn't handle kerning data    */\n  /*      from the `GPOS' table (as present in some OpenType fonts).       */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_FAST_GLYPHS ::                                        */\n  /*      THIS FLAG IS DEPRECATED.  DO NOT USE OR TEST IT.                 */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_MULTIPLE_MASTERS ::                                   */\n  /*      Indicates that the font contains multiple masters and is capable */\n  /*      of interpolating between them.  See the multiple-masters         */\n  /*      specific API for details.                                        */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_GLYPH_NAMES ::                                        */\n  /*      Indicates that the font contains glyph names that can be         */\n  /*      retrieved through @FT_Get_Glyph_Name.  Note that some TrueType   */\n  /*      fonts contain broken glyph name tables.  Use the function        */\n  /*      @FT_Has_PS_Glyph_Names when needed.                              */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_EXTERNAL_STREAM ::                                    */\n  /*      Used internally by FreeType to indicate that a face's stream was */\n  /*      provided by the client application and should not be destroyed   */\n  /*      when @FT_Done_Face is called.  Don't read or test this flag.     */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_HINTER ::                                             */\n  /*      Set if the font driver has a hinting machine of its own.  For    */\n  /*      example, with TrueType fonts, it makes sense to use data from    */\n  /*      the SFNT `gasp' table only if the native TrueType hinting engine */\n  /*      (with the bytecode interpreter) is available and active.         */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_CID_KEYED ::                                          */\n  /*      Set if the font is CID-keyed.  In that case, the font is not     */\n  /*      accessed by glyph indices but by CID values.  For subsetted      */\n  /*      CID-keyed fonts this has the consequence that not all index      */\n  /*      values are a valid argument to FT_Load_Glyph.  Only the CID      */\n  /*      values for which corresponding glyphs in the subsetted font      */\n  /*      exist make FT_Load_Glyph return successfully; in all other cases */\n  /*      you get an `FT_Err_Invalid_Argument' error.                      */\n  /*                                                                       */\n  /*      Note that CID-keyed fonts which are in an SFNT wrapper don't     */\n  /*      have this flag set since the glyphs are accessed in the normal   */\n  /*      way (using contiguous indices); the `CID-ness' isn't visible to  */\n  /*      the application.                                                 */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_TRICKY ::                                             */\n  /*      Set if the font is `tricky', this is, it always needs the        */\n  /*      font format's native hinting engine to get a reasonable result.  */\n  /*      A typical example is the Chinese font `mingli.ttf' which uses    */\n  /*      TrueType bytecode instructions to move and scale all of its      */\n  /*      subglyphs.                                                       */\n  /*                                                                       */\n  /*      It is not possible to autohint such fonts using                  */\n  /*      @FT_LOAD_FORCE_AUTOHINT; it will also ignore                     */\n  /*      @FT_LOAD_NO_HINTING.  You have to set both @FT_LOAD_NO_HINTING   */\n  /*      and @FT_LOAD_NO_AUTOHINT to really disable hinting; however, you */\n  /*      probably never want this except for demonstration purposes.      */\n  /*                                                                       */\n  /*      Currently, there are about a dozen TrueType fonts in the list of */\n  /*      tricky fonts; they are hard-coded in file `ttobjs.c'.            */\n  /*                                                                       */\n#define FT_FACE_FLAG_SCALABLE          ( 1L <<  0 )\n#define FT_FACE_FLAG_FIXED_SIZES       ( 1L <<  1 )\n#define FT_FACE_FLAG_FIXED_WIDTH       ( 1L <<  2 )\n#define FT_FACE_FLAG_SFNT              ( 1L <<  3 )\n#define FT_FACE_FLAG_HORIZONTAL        ( 1L <<  4 )\n#define FT_FACE_FLAG_VERTICAL          ( 1L <<  5 )\n#define FT_FACE_FLAG_KERNING           ( 1L <<  6 )\n#define FT_FACE_FLAG_FAST_GLYPHS       ( 1L <<  7 )\n#define FT_FACE_FLAG_MULTIPLE_MASTERS  ( 1L <<  8 )\n#define FT_FACE_FLAG_GLYPH_NAMES       ( 1L <<  9 )\n#define FT_FACE_FLAG_EXTERNAL_STREAM   ( 1L << 10 )\n#define FT_FACE_FLAG_HINTER            ( 1L << 11 )\n#define FT_FACE_FLAG_CID_KEYED         ( 1L << 12 )\n#define FT_FACE_FLAG_TRICKY            ( 1L << 13 )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_HAS_HORIZONTAL( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains\n   *   horizontal metrics (this is true for all font formats though).\n   *\n   * @also:\n   *   @FT_HAS_VERTICAL can be used to check for vertical metrics.\n   *\n   */\n#define FT_HAS_HORIZONTAL( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_HORIZONTAL )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_HAS_VERTICAL( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains real\n   *   vertical metrics (and not only synthesized ones).\n   *\n   */\n#define FT_HAS_VERTICAL( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_VERTICAL )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_HAS_KERNING( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains kerning\n   *   data that can be accessed with @FT_Get_Kerning.\n   *\n   */\n#define FT_HAS_KERNING( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_KERNING )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_IS_SCALABLE( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains a scalable\n   *   font face (true for TrueType, Type~1, Type~42, CID, OpenType/CFF,\n   *   and PFR font formats.\n   *\n   */\n#define FT_IS_SCALABLE( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_SCALABLE )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_IS_SFNT( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains a font\n   *   whose format is based on the SFNT storage scheme.  This usually\n   *   means: TrueType fonts, OpenType fonts, as well as SFNT-based embedded\n   *   bitmap fonts.\n   *\n   *   If this macro is true, all functions defined in @FT_SFNT_NAMES_H and\n   *   @FT_TRUETYPE_TABLES_H are available.\n   *\n   */\n#define FT_IS_SFNT( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_SFNT )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_IS_FIXED_WIDTH( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains a font face\n   *   that contains fixed-width (or `monospace', `fixed-pitch', etc.)\n   *   glyphs.\n   *\n   */\n#define FT_IS_FIXED_WIDTH( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_FIXED_WIDTH )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_HAS_FIXED_SIZES( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains some\n   *   embedded bitmaps.  See the `available_sizes' field of the\n   *   @FT_FaceRec structure.\n   *\n   */\n#define FT_HAS_FIXED_SIZES( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_FIXED_SIZES )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_HAS_FAST_GLYPHS( face )\n   *\n   * @description:\n   *   Deprecated.\n   *\n   */\n#define FT_HAS_FAST_GLYPHS( face )  0\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_HAS_GLYPH_NAMES( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains some glyph\n   *   names that can be accessed through @FT_Get_Glyph_Name.\n   *\n   */\n#define FT_HAS_GLYPH_NAMES( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_HAS_MULTIPLE_MASTERS( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains some\n   *   multiple masters.  The functions provided by @FT_MULTIPLE_MASTERS_H\n   *   are then available to choose the exact design you want.\n   *\n   */\n#define FT_HAS_MULTIPLE_MASTERS( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_IS_CID_KEYED( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains a CID-keyed\n   *   font.  See the discussion of @FT_FACE_FLAG_CID_KEYED for more\n   *   details.\n   *\n   *   If this macro is true, all functions defined in @FT_CID_H are\n   *   available.\n   *\n   */\n#define FT_IS_CID_KEYED( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_CID_KEYED )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_IS_TRICKY( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face represents a `tricky' font.\n   *   See the discussion of @FT_FACE_FLAG_TRICKY for more details.\n   *\n   */\n#define FT_IS_TRICKY( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_TRICKY )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Const>                                                               */\n  /*    FT_STYLE_FLAG_XXX                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A list of bit-flags used to indicate the style of a given face.    */\n  /*    These are used in the `style_flags' field of @FT_FaceRec.          */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_STYLE_FLAG_ITALIC ::                                            */\n  /*      Indicates that a given face style is italic or oblique.          */\n  /*                                                                       */\n  /*    FT_STYLE_FLAG_BOLD ::                                              */\n  /*      Indicates that a given face is bold.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The style information as provided by FreeType is very basic.  More */\n  /*    details are beyond the scope and should be done on a higher level  */\n  /*    (for example, by analyzing various fields of the `OS/2' table in   */\n  /*    SFNT based fonts).                                                 */\n  /*                                                                       */\n#define FT_STYLE_FLAG_ITALIC  ( 1 << 0 )\n#define FT_STYLE_FLAG_BOLD    ( 1 << 1 )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Size_Internal                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An opaque handle to an `FT_Size_InternalRec' structure, used to    */\n  /*    model private data of a given @FT_Size object.                     */\n  /*                                                                       */\n  typedef struct FT_Size_InternalRec_*  FT_Size_Internal;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Size_Metrics                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The size metrics structure gives the metrics of a size object.     */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    x_ppem       :: The width of the scaled EM square in pixels, hence */\n  /*                    the term `ppem' (pixels per EM).  It is also       */\n  /*                    referred to as `nominal width'.                    */\n  /*                                                                       */\n  /*    y_ppem       :: The height of the scaled EM square in pixels,      */\n  /*                    hence the term `ppem' (pixels per EM).  It is also */\n  /*                    referred to as `nominal height'.                   */\n  /*                                                                       */\n  /*    x_scale      :: A 16.16 fractional scaling value used to convert   */\n  /*                    horizontal metrics from font units to 26.6         */\n  /*                    fractional pixels.  Only relevant for scalable     */\n  /*                    font formats.                                      */\n  /*                                                                       */\n  /*    y_scale      :: A 16.16 fractional scaling value used to convert   */\n  /*                    vertical metrics from font units to 26.6           */\n  /*                    fractional pixels.  Only relevant for scalable     */\n  /*                    font formats.                                      */\n  /*                                                                       */\n  /*    ascender     :: The ascender in 26.6 fractional pixels.  See       */\n  /*                    @FT_FaceRec for the details.                       */\n  /*                                                                       */\n  /*    descender    :: The descender in 26.6 fractional pixels.  See      */\n  /*                    @FT_FaceRec for the details.                       */\n  /*                                                                       */\n  /*    height       :: The height in 26.6 fractional pixels.  See         */\n  /*                    @FT_FaceRec for the details.                       */\n  /*                                                                       */\n  /*    max_advance  :: The maximum advance width in 26.6 fractional       */\n  /*                    pixels.  See @FT_FaceRec for the details.          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The scaling values, if relevant, are determined first during a     */\n  /*    size changing operation.  The remaining fields are then set by the */\n  /*    driver.  For scalable formats, they are usually set to scaled      */\n  /*    values of the corresponding fields in @FT_FaceRec.                 */\n  /*                                                                       */\n  /*    Note that due to glyph hinting, these values might not be exact    */\n  /*    for certain fonts.  Thus they must be treated as unreliable        */\n  /*    with an error margin of at least one pixel!                        */\n  /*                                                                       */\n  /*    Indeed, the only way to get the exact metrics is to render _all_   */\n  /*    glyphs.  As this would be a definite performance hit, it is up to  */\n  /*    client applications to perform such computations.                  */\n  /*                                                                       */\n  /*    The FT_Size_Metrics structure is valid for bitmap fonts also.      */\n  /*                                                                       */\n  typedef struct  FT_Size_Metrics_\n  {\n    FT_UShort  x_ppem;      /* horizontal pixels per EM               */\n    FT_UShort  y_ppem;      /* vertical pixels per EM                 */\n\n    FT_Fixed   x_scale;     /* scaling values used to convert font    */\n    FT_Fixed   y_scale;     /* units to 26.6 fractional pixels        */\n\n    FT_Pos     ascender;    /* ascender in 26.6 frac. pixels          */\n    FT_Pos     descender;   /* descender in 26.6 frac. pixels         */\n    FT_Pos     height;      /* text height in 26.6 frac. pixels       */\n    FT_Pos     max_advance; /* max horizontal advance, in 26.6 pixels */\n\n  } FT_Size_Metrics;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_SizeRec                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    FreeType root size class structure.  A size object models a face   */\n  /*    object at a given size.                                            */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    face    :: Handle to the parent face object.                       */\n  /*                                                                       */\n  /*    generic :: A typeless pointer, which is unused by the FreeType     */\n  /*               library or any of its drivers.  It can be used by       */\n  /*               client applications to link their own data to each size */\n  /*               object.                                                 */\n  /*                                                                       */\n  /*    metrics :: Metrics for this size object.  This field is read-only. */\n  /*                                                                       */\n  typedef struct  FT_SizeRec_\n  {\n    FT_Face           face;      /* parent face object              */\n    FT_Generic        generic;   /* generic pointer for client uses */\n    FT_Size_Metrics   metrics;   /* size metrics                    */\n    FT_Size_Internal  internal;\n\n  } FT_SizeRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_SubGlyph                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The subglyph structure is an internal object used to describe      */\n  /*    subglyphs (for example, in the case of composites).                */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The subglyph implementation is not part of the high-level API,     */\n  /*    hence the forward structure declaration.                           */\n  /*                                                                       */\n  /*    You can however retrieve subglyph information with                 */\n  /*    @FT_Get_SubGlyph_Info.                                             */\n  /*                                                                       */\n  typedef struct FT_SubGlyphRec_*  FT_SubGlyph;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Slot_Internal                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An opaque handle to an `FT_Slot_InternalRec' structure, used to    */\n  /*    model private data of a given @FT_GlyphSlot object.                */\n  /*                                                                       */\n  typedef struct FT_Slot_InternalRec_*  FT_Slot_Internal;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_GlyphSlotRec                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    FreeType root glyph slot class structure.  A glyph slot is a       */\n  /*    container where individual glyphs can be loaded, be they in        */\n  /*    outline or bitmap format.                                          */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    library           :: A handle to the FreeType library instance     */\n  /*                         this slot belongs to.                         */\n  /*                                                                       */\n  /*    face              :: A handle to the parent face object.           */\n  /*                                                                       */\n  /*    next              :: In some cases (like some font tools), several */\n  /*                         glyph slots per face object can be a good     */\n  /*                         thing.  As this is rare, the glyph slots are  */\n  /*                         listed through a direct, single-linked list   */\n  /*                         using its `next' field.                       */\n  /*                                                                       */\n  /*    generic           :: A typeless pointer which is unused by the     */\n  /*                         FreeType library or any of its drivers.  It   */\n  /*                         can be used by client applications to link    */\n  /*                         their own data to each glyph slot object.     */\n  /*                                                                       */\n  /*    metrics           :: The metrics of the last loaded glyph in the   */\n  /*                         slot.  The returned values depend on the last */\n  /*                         load flags (see the @FT_Load_Glyph API        */\n  /*                         function) and can be expressed either in 26.6 */\n  /*                         fractional pixels or font units.              */\n  /*                                                                       */\n  /*                         Note that even when the glyph image is        */\n  /*                         transformed, the metrics are not.             */\n  /*                                                                       */\n  /*    linearHoriAdvance :: The advance width of the unhinted glyph.      */\n  /*                         Its value is expressed in 16.16 fractional    */\n  /*                         pixels, unless @FT_LOAD_LINEAR_DESIGN is set  */\n  /*                         when loading the glyph.  This field can be    */\n  /*                         important to perform correct WYSIWYG layout.  */\n  /*                         Only relevant for outline glyphs.             */\n  /*                                                                       */\n  /*    linearVertAdvance :: The advance height of the unhinted glyph.     */\n  /*                         Its value is expressed in 16.16 fractional    */\n  /*                         pixels, unless @FT_LOAD_LINEAR_DESIGN is set  */\n  /*                         when loading the glyph.  This field can be    */\n  /*                         important to perform correct WYSIWYG layout.  */\n  /*                         Only relevant for outline glyphs.             */\n  /*                                                                       */\n  /*    advance           :: This shorthand is, depending on               */\n  /*                         @FT_LOAD_IGNORE_TRANSFORM, the transformed    */\n  /*                         advance width for the glyph (in 26.6          */\n  /*                         fractional pixel format).  As specified with  */\n  /*                         @FT_LOAD_VERTICAL_LAYOUT, it uses either the  */\n  /*                         `horiAdvance' or the `vertAdvance' value of   */\n  /*                         `metrics' field.                              */\n  /*                                                                       */\n  /*    format            :: This field indicates the format of the image  */\n  /*                         contained in the glyph slot.  Typically       */\n  /*                         @FT_GLYPH_FORMAT_BITMAP,                      */\n  /*                         @FT_GLYPH_FORMAT_OUTLINE, or                  */\n  /*                         @FT_GLYPH_FORMAT_COMPOSITE, but others are    */\n  /*                         possible.                                     */\n  /*                                                                       */\n  /*    bitmap            :: This field is used as a bitmap descriptor     */\n  /*                         when the slot format is                       */\n  /*                         @FT_GLYPH_FORMAT_BITMAP.  Note that the       */\n  /*                         address and content of the bitmap buffer can  */\n  /*                         change between calls of @FT_Load_Glyph and a  */\n  /*                         few other functions.                          */\n  /*                                                                       */\n  /*    bitmap_left       :: This is the bitmap's left bearing expressed   */\n  /*                         in integer pixels.  Of course, this is only   */\n  /*                         valid if the format is                        */\n  /*                         @FT_GLYPH_FORMAT_BITMAP.                      */\n  /*                                                                       */\n  /*    bitmap_top        :: This is the bitmap's top bearing expressed in */\n  /*                         integer pixels.  Remember that this is the    */\n  /*                         distance from the baseline to the top-most    */\n  /*                         glyph scanline, upwards y~coordinates being   */\n  /*                         *positive*.                                   */\n  /*                                                                       */\n  /*    outline           :: The outline descriptor for the current glyph  */\n  /*                         image if its format is                        */\n  /*                         @FT_GLYPH_FORMAT_OUTLINE.  Once a glyph is    */\n  /*                         loaded, `outline' can be transformed,         */\n  /*                         distorted, embolded, etc.  However, it must   */\n  /*                         not be freed.                                 */\n  /*                                                                       */\n  /*    num_subglyphs     :: The number of subglyphs in a composite glyph. */\n  /*                         This field is only valid for the composite    */\n  /*                         glyph format that should normally only be     */\n  /*                         loaded with the @FT_LOAD_NO_RECURSE flag.     */\n  /*                         For now this is internal to FreeType.         */\n  /*                                                                       */\n  /*    subglyphs         :: An array of subglyph descriptors for          */\n  /*                         composite glyphs.  There are `num_subglyphs'  */\n  /*                         elements in there.  Currently internal to     */\n  /*                         FreeType.                                     */\n  /*                                                                       */\n  /*    control_data      :: Certain font drivers can also return the      */\n  /*                         control data for a given glyph image (e.g.    */\n  /*                         TrueType bytecode, Type~1 charstrings, etc.). */\n  /*                         This field is a pointer to such data.         */\n  /*                                                                       */\n  /*    control_len       :: This is the length in bytes of the control    */\n  /*                         data.                                         */\n  /*                                                                       */\n  /*    other             :: Really wicked formats can use this pointer to */\n  /*                         present their own glyph image to client       */\n  /*                         applications.  Note that the application      */\n  /*                         needs to know about the image format.         */\n  /*                                                                       */\n  /*    lsb_delta         :: The difference between hinted and unhinted    */\n  /*                         left side bearing while autohinting is        */\n  /*                         active.  Zero otherwise.                      */\n  /*                                                                       */\n  /*    rsb_delta         :: The difference between hinted and unhinted    */\n  /*                         right side bearing while autohinting is       */\n  /*                         active.  Zero otherwise.                      */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If @FT_Load_Glyph is called with default flags (see                */\n  /*    @FT_LOAD_DEFAULT) the glyph image is loaded in the glyph slot in   */\n  /*    its native format (e.g., an outline glyph for TrueType and Type~1  */\n  /*    formats).                                                          */\n  /*                                                                       */\n  /*    This image can later be converted into a bitmap by calling         */\n  /*    @FT_Render_Glyph.  This function finds the current renderer for    */\n  /*    the native image's format, then invokes it.                        */\n  /*                                                                       */\n  /*    The renderer is in charge of transforming the native image through */\n  /*    the slot's face transformation fields, then converting it into a   */\n  /*    bitmap that is returned in `slot->bitmap'.                         */\n  /*                                                                       */\n  /*    Note that `slot->bitmap_left' and `slot->bitmap_top' are also used */\n  /*    to specify the position of the bitmap relative to the current pen  */\n  /*    position (e.g., coordinates (0,0) on the baseline).  Of course,    */\n  /*    `slot->format' is also changed to @FT_GLYPH_FORMAT_BITMAP.         */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Here a small pseudo code fragment which shows how to use           */\n  /*    `lsb_delta' and `rsb_delta':                                       */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      FT_Pos  origin_x       = 0;                                      */\n  /*      FT_Pos  prev_rsb_delta = 0;                                      */\n  /*                                                                       */\n  /*                                                                       */\n  /*      for all glyphs do                                                */\n  /*        <compute kern between current and previous glyph and add it to */\n  /*         `origin_x'>                                                   */\n  /*                                                                       */\n  /*        <load glyph with `FT_Load_Glyph'>                              */\n  /*                                                                       */\n  /*        if ( prev_rsb_delta - face->glyph->lsb_delta >= 32 )           */\n  /*          origin_x -= 64;                                              */\n  /*        else if ( prev_rsb_delta - face->glyph->lsb_delta < -32 )      */\n  /*          origin_x += 64;                                              */\n  /*                                                                       */\n  /*        prev_rsb_delta = face->glyph->rsb_delta;                       */\n  /*                                                                       */\n  /*        <save glyph image, or render glyph, or ...>                    */\n  /*                                                                       */\n  /*        origin_x += face->glyph->advance.x;                            */\n  /*      endfor                                                           */\n  /*    }                                                                  */\n  /*                                                                       */\n  typedef struct  FT_GlyphSlotRec_\n  {\n    FT_Library        library;\n    FT_Face           face;\n    FT_GlyphSlot      next;\n    FT_UInt           reserved;       /* retained for binary compatibility */\n    FT_Generic        generic;\n\n    FT_Glyph_Metrics  metrics;\n    FT_Fixed          linearHoriAdvance;\n    FT_Fixed          linearVertAdvance;\n    FT_Vector         advance;\n\n    FT_Glyph_Format   format;\n\n    FT_Bitmap         bitmap;\n    FT_Int            bitmap_left;\n    FT_Int            bitmap_top;\n\n    FT_Outline        outline;\n\n    FT_UInt           num_subglyphs;\n    FT_SubGlyph       subglyphs;\n\n    void*             control_data;\n    long              control_len;\n\n    FT_Pos            lsb_delta;\n    FT_Pos            rsb_delta;\n\n    void*             other;\n\n    FT_Slot_Internal  internal;\n\n  } FT_GlyphSlotRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*                                                                       */\n  /*                         F U N C T I O N S                             */\n  /*                                                                       */\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Init_FreeType                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initialize a new FreeType library object.  The set of modules      */\n  /*    that are registered by this function is determined at build time.  */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    alibrary :: A handle to a new library object.                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    In case you want to provide your own memory allocating routines,   */\n  /*    use @FT_New_Library instead, followed by a call to                 */\n  /*    @FT_Add_Default_Modules (or a series of calls to @FT_Add_Module).  */\n  /*                                                                       */\n  /*    For multi-threading applications each thread should have its own   */\n  /*    FT_Library object.                                                 */\n  /*                                                                       */\n  /*    If you need reference-counting (cf. @FT_Reference_Library), use    */\n  /*    @FT_New_Library and @FT_Done_Library.                              */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Init_FreeType( FT_Library  *alibrary );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Done_FreeType                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Destroy a given FreeType library object and all of its children,   */\n  /*    including resources, drivers, faces, sizes, etc.                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle to the target library object.                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Done_FreeType( FT_Library  library );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_OPEN_XXX                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A list of bit-field constants used within the `flags' field of the */\n  /*    @FT_Open_Args structure.                                           */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_OPEN_MEMORY   :: This is a memory-based stream.                 */\n  /*                                                                       */\n  /*    FT_OPEN_STREAM   :: Copy the stream from the `stream' field.       */\n  /*                                                                       */\n  /*    FT_OPEN_PATHNAME :: Create a new input stream from a C~path        */\n  /*                        name.                                          */\n  /*                                                                       */\n  /*    FT_OPEN_DRIVER   :: Use the `driver' field.                        */\n  /*                                                                       */\n  /*    FT_OPEN_PARAMS   :: Use the `num_params' and `params' fields.      */\n  /*                                                                       */\n  /*    ft_open_memory   :: Deprecated; use @FT_OPEN_MEMORY instead.       */\n  /*                                                                       */\n  /*    ft_open_stream   :: Deprecated; use @FT_OPEN_STREAM instead.       */\n  /*                                                                       */\n  /*    ft_open_pathname :: Deprecated; use @FT_OPEN_PATHNAME instead.     */\n  /*                                                                       */\n  /*    ft_open_driver   :: Deprecated; use @FT_OPEN_DRIVER instead.       */\n  /*                                                                       */\n  /*    ft_open_params   :: Deprecated; use @FT_OPEN_PARAMS instead.       */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The `FT_OPEN_MEMORY', `FT_OPEN_STREAM', and `FT_OPEN_PATHNAME'     */\n  /*    flags are mutually exclusive.                                      */\n  /*                                                                       */\n#define FT_OPEN_MEMORY    0x1\n#define FT_OPEN_STREAM    0x2\n#define FT_OPEN_PATHNAME  0x4\n#define FT_OPEN_DRIVER    0x8\n#define FT_OPEN_PARAMS    0x10\n\n#define ft_open_memory    FT_OPEN_MEMORY     /* deprecated */\n#define ft_open_stream    FT_OPEN_STREAM     /* deprecated */\n#define ft_open_pathname  FT_OPEN_PATHNAME   /* deprecated */\n#define ft_open_driver    FT_OPEN_DRIVER     /* deprecated */\n#define ft_open_params    FT_OPEN_PARAMS     /* deprecated */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Parameter                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple structure used to pass more or less generic parameters to */\n  /*    @FT_Open_Face.                                                     */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    tag  :: A four-byte identification tag.                            */\n  /*                                                                       */\n  /*    data :: A pointer to the parameter data.                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The ID and function of parameters are driver-specific.  See the    */\n  /*    various FT_PARAM_TAG_XXX flags for more information.               */\n  /*                                                                       */\n  typedef struct  FT_Parameter_\n  {\n    FT_ULong    tag;\n    FT_Pointer  data;\n\n  } FT_Parameter;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Open_Args                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to indicate how to open a new font file or        */\n  /*    stream.  A pointer to such a structure can be used as a parameter  */\n  /*    for the functions @FT_Open_Face and @FT_Attach_Stream.             */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    flags       :: A set of bit flags indicating how to use the        */\n  /*                   structure.                                          */\n  /*                                                                       */\n  /*    memory_base :: The first byte of the file in memory.               */\n  /*                                                                       */\n  /*    memory_size :: The size in bytes of the file in memory.            */\n  /*                                                                       */\n  /*    pathname    :: A pointer to an 8-bit file pathname.                */\n  /*                                                                       */\n  /*    stream      :: A handle to a source stream object.                 */\n  /*                                                                       */\n  /*    driver      :: This field is exclusively used by @FT_Open_Face;    */\n  /*                   it simply specifies the font driver to use to open  */\n  /*                   the face.  If set to~0, FreeType tries to load the  */\n  /*                   face with each one of the drivers in its list.      */\n  /*                                                                       */\n  /*    num_params  :: The number of extra parameters.                     */\n  /*                                                                       */\n  /*    params      :: Extra parameters passed to the font driver when     */\n  /*                   opening a new face.                                 */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The stream type is determined by the contents of `flags' which     */\n  /*    are tested in the following order by @FT_Open_Face:                */\n  /*                                                                       */\n  /*    If the `FT_OPEN_MEMORY' bit is set, assume that this is a          */\n  /*    memory file of `memory_size' bytes, located at `memory_address'.   */\n  /*    The data are are not copied, and the client is responsible for     */\n  /*    releasing and destroying them _after_ the corresponding call to    */\n  /*    @FT_Done_Face.                                                     */\n  /*                                                                       */\n  /*    Otherwise, if the `FT_OPEN_STREAM' bit is set, assume that a       */\n  /*    custom input stream `stream' is used.                              */\n  /*                                                                       */\n  /*    Otherwise, if the `FT_OPEN_PATHNAME' bit is set, assume that this  */\n  /*    is a normal file and use `pathname' to open it.                    */\n  /*                                                                       */\n  /*    If the `FT_OPEN_DRIVER' bit is set, @FT_Open_Face only tries to    */\n  /*    open the file with the driver whose handler is in `driver'.        */\n  /*                                                                       */\n  /*    If the `FT_OPEN_PARAMS' bit is set, the parameters given by        */\n  /*    `num_params' and `params' is used.  They are ignored otherwise.    */\n  /*                                                                       */\n  /*    Ideally, both the `pathname' and `params' fields should be tagged  */\n  /*    as `const'; this is missing for API backwards compatibility.  In   */\n  /*    other words, applications should treat them as read-only.          */\n  /*                                                                       */\n  typedef struct  FT_Open_Args_\n  {\n    FT_UInt         flags;\n    const FT_Byte*  memory_base;\n    FT_Long         memory_size;\n    FT_String*      pathname;\n    FT_Stream       stream;\n    FT_Module       driver;\n    FT_Int          num_params;\n    FT_Parameter*   params;\n\n  } FT_Open_Args;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Face                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function calls @FT_Open_Face to open a font by its pathname.  */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library    :: A handle to the library resource.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    pathname   :: A path to the font file.                             */\n  /*                                                                       */\n  /*    face_index :: The index of the face within the font.  The first    */\n  /*                  face has index~0.                                    */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aface      :: A handle to a new face object.  If `face_index' is   */\n  /*                  greater than or equal to zero, it must be non-NULL.  */\n  /*                  See @FT_Open_Face for more details.                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Use @FT_Done_Face to destroy the created @FT_Face object (along    */\n  /*    with its slot and sizes).                                          */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_New_Face( FT_Library   library,\n               const char*  filepathname,\n               FT_Long      face_index,\n               FT_Face     *aface );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Memory_Face                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function calls @FT_Open_Face to open a font which has been    */\n  /*    loaded into memory.                                                */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library    :: A handle to the library resource.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    file_base  :: A pointer to the beginning of the font data.         */\n  /*                                                                       */\n  /*    file_size  :: The size of the memory chunk used by the font data.  */\n  /*                                                                       */\n  /*    face_index :: The index of the face within the font.  The first    */\n  /*                  face has index~0.                                    */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aface      :: A handle to a new face object.  If `face_index' is   */\n  /*                  greater than or equal to zero, it must be non-NULL.  */\n  /*                  See @FT_Open_Face for more details.                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You must not deallocate the memory before calling @FT_Done_Face.   */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_New_Memory_Face( FT_Library      library,\n                      const FT_Byte*  file_base,\n                      FT_Long         file_size,\n                      FT_Long         face_index,\n                      FT_Face        *aface );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Open_Face                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a face object from a given resource described by            */\n  /*    @FT_Open_Args.                                                     */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library    :: A handle to the library resource.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    args       :: A pointer to an `FT_Open_Args' structure which must  */\n  /*                  be filled by the caller.                             */\n  /*                                                                       */\n  /*    face_index :: The index of the face within the font.  The first    */\n  /*                  face has index~0.                                    */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aface      :: A handle to a new face object.  If `face_index' is   */\n  /*                  greater than or equal to zero, it must be non-NULL.  */\n  /*                  See note below.                                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Unlike FreeType 1.x, this function automatically creates a glyph   */\n  /*    slot for the face object which can be accessed directly through    */\n  /*    `face->glyph'.                                                     */\n  /*                                                                       */\n  /*    FT_Open_Face can be used to quickly check whether the font         */\n  /*    format of a given font resource is supported by FreeType.  If the  */\n  /*    `face_index' field is negative, the function's return value is~0   */\n  /*    if the font format is recognized, or non-zero otherwise;           */\n  /*    the function returns a more or less empty face handle in `*aface'  */\n  /*    (if `aface' isn't NULL).  The only useful field in this special    */\n  /*    case is `face->num_faces' which gives the number of faces within   */\n  /*    the font file.  After examination, the returned @FT_Face structure */\n  /*    should be deallocated with a call to @FT_Done_Face.                */\n  /*                                                                       */\n  /*    Each new face object created with this function also owns a        */\n  /*    default @FT_Size object, accessible as `face->size'.               */\n  /*                                                                       */\n  /*    One @FT_Library instance can have multiple face objects, this is,  */\n  /*    @FT_Open_Face and its siblings can be called multiple times using  */\n  /*    the same `library' argument.                                       */\n  /*                                                                       */\n  /*    See the discussion of reference counters in the description of     */\n  /*    @FT_Reference_Face.                                                */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Open_Face( FT_Library           library,\n                const FT_Open_Args*  args,\n                FT_Long              face_index,\n                FT_Face             *aface );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Attach_File                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function calls @FT_Attach_Stream to attach a file.            */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face         :: The target face object.                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    filepathname :: The pathname.                                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Attach_File( FT_Face      face,\n                  const char*  filepathname );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Attach_Stream                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    `Attach' data to a face object.  Normally, this is used to read    */\n  /*    additional information for the face object.  For example, you can  */\n  /*    attach an AFM file that comes with a Type~1 font to get the        */\n  /*    kerning values and other metrics.                                  */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face       :: The target face object.                              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    parameters :: A pointer to @FT_Open_Args which must be filled by   */\n  /*                  the caller.                                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The meaning of the `attach' (i.e., what really happens when the    */\n  /*    new file is read) is not fixed by FreeType itself.  It really      */\n  /*    depends on the font format (and thus the font driver).             */\n  /*                                                                       */\n  /*    Client applications are expected to know what they are doing       */\n  /*    when invoking this function.  Most drivers simply do not implement */\n  /*    file attachments.                                                  */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Attach_Stream( FT_Face        face,\n                    FT_Open_Args*  parameters );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Reference_Face                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A counter gets initialized to~1 at the time an @FT_Face structure  */\n  /*    is created.  This function increments the counter.  @FT_Done_Face  */\n  /*    then only destroys a face if the counter is~1, otherwise it simply */\n  /*    decrements the counter.                                            */\n  /*                                                                       */\n  /*    This function helps in managing life-cycles of structures which    */\n  /*    reference @FT_Face objects.                                        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to a target face object.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.4.2                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Reference_Face( FT_Face  face );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Done_Face                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Discard a given face object, as well as all of its child slots and */\n  /*    sizes.                                                             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to a target face object.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    See the discussion of reference counters in the description of     */\n  /*    @FT_Reference_Face.                                                */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Done_Face( FT_Face  face );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Select_Size                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Select a bitmap strike.                                            */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face         :: A handle to a target face object.                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    strike_index :: The index of the bitmap strike in the              */\n  /*                    `available_sizes' field of @FT_FaceRec structure.  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Select_Size( FT_Face  face,\n                  FT_Int   strike_index );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Size_Request_Type                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration type that lists the supported size request types.   */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_SIZE_REQUEST_TYPE_NOMINAL ::                                    */\n  /*      The nominal size.  The `units_per_EM' field of @FT_FaceRec is    */\n  /*      used to determine both scaling values.                           */\n  /*                                                                       */\n  /*    FT_SIZE_REQUEST_TYPE_REAL_DIM ::                                   */\n  /*      The real dimension.  The sum of the the `ascender' and (minus    */\n  /*      of) the `descender' fields of @FT_FaceRec are used to determine  */\n  /*      both scaling values.                                             */\n  /*                                                                       */\n  /*    FT_SIZE_REQUEST_TYPE_BBOX ::                                       */\n  /*      The font bounding box.  The width and height of the `bbox' field */\n  /*      of @FT_FaceRec are used to determine the horizontal and vertical */\n  /*      scaling value, respectively.                                     */\n  /*                                                                       */\n  /*    FT_SIZE_REQUEST_TYPE_CELL ::                                       */\n  /*      The `max_advance_width' field of @FT_FaceRec is used to          */\n  /*      determine the horizontal scaling value; the vertical scaling     */\n  /*      value is determined the same way as                              */\n  /*      @FT_SIZE_REQUEST_TYPE_REAL_DIM does.  Finally, both scaling      */\n  /*      values are set to the smaller one.  This type is useful if you   */\n  /*      want to specify the font size for, say, a window of a given      */\n  /*      dimension and 80x24 cells.                                       */\n  /*                                                                       */\n  /*    FT_SIZE_REQUEST_TYPE_SCALES ::                                     */\n  /*      Specify the scaling values directly.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The above descriptions only apply to scalable formats.  For bitmap */\n  /*    formats, the behaviour is up to the driver.                        */\n  /*                                                                       */\n  /*    See the note section of @FT_Size_Metrics if you wonder how size    */\n  /*    requesting relates to scaling values.                              */\n  /*                                                                       */\n  typedef enum  FT_Size_Request_Type_\n  {\n    FT_SIZE_REQUEST_TYPE_NOMINAL,\n    FT_SIZE_REQUEST_TYPE_REAL_DIM,\n    FT_SIZE_REQUEST_TYPE_BBOX,\n    FT_SIZE_REQUEST_TYPE_CELL,\n    FT_SIZE_REQUEST_TYPE_SCALES,\n\n    FT_SIZE_REQUEST_TYPE_MAX\n\n  } FT_Size_Request_Type;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Size_RequestRec                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a size request.                          */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    type           :: See @FT_Size_Request_Type.                       */\n  /*                                                                       */\n  /*    width          :: The desired width.                               */\n  /*                                                                       */\n  /*    height         :: The desired height.                              */\n  /*                                                                       */\n  /*    horiResolution :: The horizontal resolution.  If set to zero,      */\n  /*                      `width' is treated as a 26.6 fractional pixel    */\n  /*                      value.                                           */\n  /*                                                                       */\n  /*    vertResolution :: The vertical resolution.  If set to zero,        */\n  /*                      `height' is treated as a 26.6 fractional pixel   */\n  /*                      value.                                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If `width' is zero, then the horizontal scaling value is set equal */\n  /*    to the vertical scaling value, and vice versa.                     */\n  /*                                                                       */\n  typedef struct  FT_Size_RequestRec_\n  {\n    FT_Size_Request_Type  type;\n    FT_Long               width;\n    FT_Long               height;\n    FT_UInt               horiResolution;\n    FT_UInt               vertResolution;\n\n  } FT_Size_RequestRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Size_Request                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a size request structure.                              */\n  /*                                                                       */\n  typedef struct FT_Size_RequestRec_  *FT_Size_Request;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Request_Size                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Resize the scale of the active @FT_Size object in a face.          */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face :: A handle to a target face object.                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    req  :: A pointer to a @FT_Size_RequestRec.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Although drivers may select the bitmap strike matching the         */\n  /*    request, you should not rely on this if you intend to select a     */\n  /*    particular bitmap strike.  Use @FT_Select_Size instead in that     */\n  /*    case.                                                              */\n  /*                                                                       */\n  /*    The relation between the requested size and the resulting glyph    */\n  /*    size is dependent entirely on how the size is defined in the       */\n  /*    source face.  The font designer chooses the final size of each     */\n  /*    glyph relative to this size.  For more information refer to        */\n  /*    `http://www.freetype.org/freetype2/docs/glyphs/glyphs-2.html'      */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Request_Size( FT_Face          face,\n                   FT_Size_Request  req );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_Char_Size                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function calls @FT_Request_Size to request the nominal size   */\n  /*    (in points).                                                       */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face            :: A handle to a target face object.               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    char_width      :: The nominal width, in 26.6 fractional points.   */\n  /*                                                                       */\n  /*    char_height     :: The nominal height, in 26.6 fractional points.  */\n  /*                                                                       */\n  /*    horz_resolution :: The horizontal resolution in dpi.               */\n  /*                                                                       */\n  /*    vert_resolution :: The vertical resolution in dpi.                 */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If either the character width or height is zero, it is set equal   */\n  /*    to the other value.                                                */\n  /*                                                                       */\n  /*    If either the horizontal or vertical resolution is zero, it is set */\n  /*    equal to the other value.                                          */\n  /*                                                                       */\n  /*    A character width or height smaller than 1pt is set to 1pt; if     */\n  /*    both resolution values are zero, they are set to 72dpi.            */\n  /*                                                                       */\n  /*    Don't use this function if you are using the FreeType cache API.   */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Set_Char_Size( FT_Face     face,\n                    FT_F26Dot6  char_width,\n                    FT_F26Dot6  char_height,\n                    FT_UInt     horz_resolution,\n                    FT_UInt     vert_resolution );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_Pixel_Sizes                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function calls @FT_Request_Size to request the nominal size   */\n  /*    (in pixels).                                                       */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face         :: A handle to the target face object.                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    pixel_width  :: The nominal width, in pixels.                      */\n  /*                                                                       */\n  /*    pixel_height :: The nominal height, in pixels.                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You should not rely on the resulting glyphs matching, or being     */\n  /*    constrained, to this pixel size.  Refer to @FT_Request_Size to     */\n  /*    understand how requested sizes relate to actual sizes.             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Set_Pixel_Sizes( FT_Face  face,\n                      FT_UInt  pixel_width,\n                      FT_UInt  pixel_height );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Load_Glyph                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to load a single glyph into the glyph slot of a    */\n  /*    face object.                                                       */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face        :: A handle to the target face object where the glyph  */\n  /*                   is loaded.                                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    glyph_index :: The index of the glyph in the font file.  For       */\n  /*                   CID-keyed fonts (either in PS or in CFF format)     */\n  /*                   this argument specifies the CID value.              */\n  /*                                                                       */\n  /*    load_flags  :: A flag indicating what to load for this glyph.  The */\n  /*                   @FT_LOAD_XXX constants can be used to control the   */\n  /*                   glyph loading process (e.g., whether the outline    */\n  /*                   should be scaled, whether to load bitmaps or not,   */\n  /*                   whether to hint the outline, etc).                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The loaded glyph may be transformed.  See @FT_Set_Transform for    */\n  /*    the details.                                                       */\n  /*                                                                       */\n  /*    For subsetted CID-keyed fonts, `FT_Err_Invalid_Argument' is        */\n  /*    returned for invalid CID values (this is, for CID values which     */\n  /*    don't have a corresponding glyph in the font).  See the discussion */\n  /*    of the @FT_FACE_FLAG_CID_KEYED flag for more details.              */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Load_Glyph( FT_Face   face,\n                 FT_UInt   glyph_index,\n                 FT_Int32  load_flags );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Load_Char                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to load a single glyph into the glyph slot of a    */\n  /*    face object, according to its character code.                      */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face        :: A handle to a target face object where the glyph    */\n  /*                   is loaded.                                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    char_code   :: The glyph's character code, according to the        */\n  /*                   current charmap used in the face.                   */\n  /*                                                                       */\n  /*    load_flags  :: A flag indicating what to load for this glyph.  The */\n  /*                   @FT_LOAD_XXX constants can be used to control the   */\n  /*                   glyph loading process (e.g., whether the outline    */\n  /*                   should be scaled, whether to load bitmaps or not,   */\n  /*                   whether to hint the outline, etc).                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function simply calls @FT_Get_Char_Index and @FT_Load_Glyph.  */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Load_Char( FT_Face   face,\n                FT_ULong  char_code,\n                FT_Int32  load_flags );\n\n\n  /*************************************************************************\n   *\n   * @enum:\n   *   FT_LOAD_XXX\n   *\n   * @description:\n   *   A list of bit-field constants used with @FT_Load_Glyph to indicate\n   *   what kind of operations to perform during glyph loading.\n   *\n   * @values:\n   *   FT_LOAD_DEFAULT ::\n   *     Corresponding to~0, this value is used as the default glyph load\n   *     operation.  In this case, the following happens:\n   *\n   *     1. FreeType looks for a bitmap for the glyph corresponding to the\n   *        face's current size.  If one is found, the function returns.\n   *        The bitmap data can be accessed from the glyph slot (see note\n   *        below).\n   *\n   *     2. If no embedded bitmap is searched or found, FreeType looks for a\n   *        scalable outline.  If one is found, it is loaded from the font\n   *        file, scaled to device pixels, then `hinted' to the pixel grid\n   *        in order to optimize it.  The outline data can be accessed from\n   *        the glyph slot (see note below).\n   *\n   *     Note that by default, the glyph loader doesn't render outlines into\n   *     bitmaps.  The following flags are used to modify this default\n   *     behaviour to more specific and useful cases.\n   *\n   *   FT_LOAD_NO_SCALE ::\n   *     Don't scale the loaded outline glyph but keep it in font units.\n   *\n   *     This flag implies @FT_LOAD_NO_HINTING and @FT_LOAD_NO_BITMAP, and\n   *     unsets @FT_LOAD_RENDER.\n   *\n   *     If the font is `tricky' (see @FT_FACE_FLAG_TRICKY for more), using\n   *     FT_LOAD_NO_SCALE usually yields meaningless outlines because the\n   *     subglyphs must be scaled and positioned with hinting instructions.\n   *     This can be solved by loading the font without FT_LOAD_NO_SCALE and\n   *     setting the character size to `font->units_per_EM'.\n   *\n   *   FT_LOAD_NO_HINTING ::\n   *     Disable hinting.  This generally generates `blurrier' bitmap glyphs\n   *     when the glyph are rendered in any of the anti-aliased modes.  See\n   *     also the note below.\n   *\n   *     This flag is implied by @FT_LOAD_NO_SCALE.\n   *\n   *   FT_LOAD_RENDER ::\n   *     Call @FT_Render_Glyph after the glyph is loaded.  By default, the\n   *     glyph is rendered in @FT_RENDER_MODE_NORMAL mode.  This can be\n   *     overridden by @FT_LOAD_TARGET_XXX or @FT_LOAD_MONOCHROME.\n   *\n   *     This flag is unset by @FT_LOAD_NO_SCALE.\n   *\n   *   FT_LOAD_NO_BITMAP ::\n   *     Ignore bitmap strikes when loading.  Bitmap-only fonts ignore this\n   *     flag.\n   *\n   *     @FT_LOAD_NO_SCALE always sets this flag.\n   *\n   *   FT_LOAD_VERTICAL_LAYOUT ::\n   *     Load the glyph for vertical text layout.  In particular, the\n   *     `advance' value in the @FT_GlyphSlotRec structure is set to the\n   *     `vertAdvance' value of the `metrics' field.\n   *\n   *     In case @FT_HAS_VERTICAL doesn't return true, you shouldn't use\n   *     this flag currently.  Reason is that in this case vertical metrics\n   *     get synthesized, and those values are not always consistent across\n   *     various font formats.\n   *\n   *   FT_LOAD_FORCE_AUTOHINT ::\n   *     Indicates that the auto-hinter is preferred over the font's native\n   *     hinter.  See also the note below.\n   *\n   *   FT_LOAD_CROP_BITMAP ::\n   *     Indicates that the font driver should crop the loaded bitmap glyph\n   *     (i.e., remove all space around its black bits).  Not all drivers\n   *     implement this.\n   *\n   *   FT_LOAD_PEDANTIC ::\n   *     Indicates that the font driver should perform pedantic verifications\n   *     during glyph loading.  This is mostly used to detect broken glyphs\n   *     in fonts.  By default, FreeType tries to handle broken fonts also.\n   *\n   *     In particular, errors from the TrueType bytecode engine are not\n   *     passed to the application if this flag is not set; this might\n   *     result in partially hinted or distorted glyphs in case a glyph's\n   *     bytecode is buggy.\n   *\n   *   FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ::\n   *     Ignored.  Deprecated.\n   *\n   *   FT_LOAD_NO_RECURSE ::\n   *     This flag is only used internally.  It merely indicates that the\n   *     font driver should not load composite glyphs recursively.  Instead,\n   *     it should set the `num_subglyph' and `subglyphs' values of the\n   *     glyph slot accordingly, and set `glyph->format' to\n   *     @FT_GLYPH_FORMAT_COMPOSITE.\n   *\n   *     The description of sub-glyphs is not available to client\n   *     applications for now.\n   *\n   *     This flag implies @FT_LOAD_NO_SCALE and @FT_LOAD_IGNORE_TRANSFORM.\n   *\n   *   FT_LOAD_IGNORE_TRANSFORM ::\n   *     Indicates that the transform matrix set by @FT_Set_Transform should\n   *     be ignored.\n   *\n   *   FT_LOAD_MONOCHROME ::\n   *     This flag is used with @FT_LOAD_RENDER to indicate that you want to\n   *     render an outline glyph to a 1-bit monochrome bitmap glyph, with\n   *     8~pixels packed into each byte of the bitmap data.\n   *\n   *     Note that this has no effect on the hinting algorithm used.  You\n   *     should rather use @FT_LOAD_TARGET_MONO so that the\n   *     monochrome-optimized hinting algorithm is used.\n   *\n   *   FT_LOAD_LINEAR_DESIGN ::\n   *     Indicates that the `linearHoriAdvance' and `linearVertAdvance'\n   *     fields of @FT_GlyphSlotRec should be kept in font units.  See\n   *     @FT_GlyphSlotRec for details.\n   *\n   *   FT_LOAD_NO_AUTOHINT ::\n   *     Disable auto-hinter.  See also the note below.\n   *\n   *   FT_LOAD_COLOR ::\n   *     This flag is used to request loading of color embedded-bitmap\n   *     images.  The resulting color bitmaps, if available, will have the\n   *     @FT_PIXEL_MODE_BGRA format.  When the flag is not used and color\n   *     bitmaps are found, they will be converted to 256-level gray\n   *     bitmaps transparently.  Those bitmaps will be in the\n   *     @FT_PIXEL_MODE_GRAY format.\n   *\n   * @note:\n   *   By default, hinting is enabled and the font's native hinter (see\n   *   @FT_FACE_FLAG_HINTER) is preferred over the auto-hinter.  You can\n   *   disable hinting by setting @FT_LOAD_NO_HINTING or change the\n   *   precedence by setting @FT_LOAD_FORCE_AUTOHINT.  You can also set\n   *   @FT_LOAD_NO_AUTOHINT in case you don't want the auto-hinter to be\n   *   used at all.\n   *\n   *   See the description of @FT_FACE_FLAG_TRICKY for a special exception\n   *   (affecting only a handful of Asian fonts).\n   *\n   *   Besides deciding which hinter to use, you can also decide which\n   *   hinting algorithm to use.  See @FT_LOAD_TARGET_XXX for details.\n   *\n   *   Note that the auto-hinter needs a valid Unicode cmap (either a native\n   *   one or synthesized by FreeType) for producing correct results.  If a\n   *   font provides an incorrect mapping (for example, assigning the\n   *   character code U+005A, LATIN CAPITAL LETTER Z, to a glyph depicting a\n   *   mathematical integral sign), the auto-hinter might produce useless\n   *   results.\n   *\n   */\n#define FT_LOAD_DEFAULT                      0x0\n#define FT_LOAD_NO_SCALE                     ( 1L << 0 )\n#define FT_LOAD_NO_HINTING                   ( 1L << 1 )\n#define FT_LOAD_RENDER                       ( 1L << 2 )\n#define FT_LOAD_NO_BITMAP                    ( 1L << 3 )\n#define FT_LOAD_VERTICAL_LAYOUT              ( 1L << 4 )\n#define FT_LOAD_FORCE_AUTOHINT               ( 1L << 5 )\n#define FT_LOAD_CROP_BITMAP                  ( 1L << 6 )\n#define FT_LOAD_PEDANTIC                     ( 1L << 7 )\n#define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH  ( 1L << 9 )\n#define FT_LOAD_NO_RECURSE                   ( 1L << 10 )\n#define FT_LOAD_IGNORE_TRANSFORM             ( 1L << 11 )\n#define FT_LOAD_MONOCHROME                   ( 1L << 12 )\n#define FT_LOAD_LINEAR_DESIGN                ( 1L << 13 )\n#define FT_LOAD_NO_AUTOHINT                  ( 1L << 15 )\n  /* Bits 16..19 are used by `FT_LOAD_TARGET_' */\n#define FT_LOAD_COLOR                        ( 1L << 20 )\n\n  /* */\n\n  /* used internally only by certain font drivers! */\n#define FT_LOAD_ADVANCE_ONLY                 ( 1L << 8 )\n#define FT_LOAD_SBITS_ONLY                   ( 1L << 14 )\n\n\n  /**************************************************************************\n   *\n   * @enum:\n   *   FT_LOAD_TARGET_XXX\n   *\n   * @description:\n   *   A list of values that are used to select a specific hinting algorithm\n   *   to use by the hinter.  You should OR one of these values to your\n   *   `load_flags' when calling @FT_Load_Glyph.\n   *\n   *   Note that font's native hinters may ignore the hinting algorithm you\n   *   have specified (e.g., the TrueType bytecode interpreter).  You can set\n   *   @FT_LOAD_FORCE_AUTOHINT to ensure that the auto-hinter is used.\n   *\n   *   Also note that @FT_LOAD_TARGET_LIGHT is an exception, in that it\n   *   always implies @FT_LOAD_FORCE_AUTOHINT.\n   *\n   * @values:\n   *   FT_LOAD_TARGET_NORMAL ::\n   *     This corresponds to the default hinting algorithm, optimized for\n   *     standard gray-level rendering.  For monochrome output, use\n   *     @FT_LOAD_TARGET_MONO instead.\n   *\n   *   FT_LOAD_TARGET_LIGHT ::\n   *     A lighter hinting algorithm for non-monochrome modes.  Many\n   *     generated glyphs are more fuzzy but better resemble its original\n   *     shape.  A bit like rendering on Mac OS~X.\n   *\n   *     As a special exception, this target implies @FT_LOAD_FORCE_AUTOHINT.\n   *\n   *   FT_LOAD_TARGET_MONO ::\n   *     Strong hinting algorithm that should only be used for monochrome\n   *     output.  The result is probably unpleasant if the glyph is rendered\n   *     in non-monochrome modes.\n   *\n   *   FT_LOAD_TARGET_LCD ::\n   *     A variant of @FT_LOAD_TARGET_NORMAL optimized for horizontally\n   *     decimated LCD displays.\n   *\n   *   FT_LOAD_TARGET_LCD_V ::\n   *     A variant of @FT_LOAD_TARGET_NORMAL optimized for vertically\n   *     decimated LCD displays.\n   *\n   * @note:\n   *   You should use only _one_ of the FT_LOAD_TARGET_XXX values in your\n   *   `load_flags'.  They can't be ORed.\n   *\n   *   If @FT_LOAD_RENDER is also set, the glyph is rendered in the\n   *   corresponding mode (i.e., the mode which matches the used algorithm\n   *   best).  An exeption is FT_LOAD_TARGET_MONO since it implies\n   *   @FT_LOAD_MONOCHROME.\n   *\n   *   You can use a hinting algorithm that doesn't correspond to the same\n   *   rendering mode.  As an example, it is possible to use the `light'\n   *   hinting algorithm and have the results rendered in horizontal LCD\n   *   pixel mode, with code like\n   *\n   *     {\n   *       FT_Load_Glyph( face, glyph_index,\n   *                      load_flags | FT_LOAD_TARGET_LIGHT );\n   *\n   *       FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD );\n   *     }\n   *\n   */\n#define FT_LOAD_TARGET_( x )   ( (FT_Int32)( (x) & 15 ) << 16 )\n\n#define FT_LOAD_TARGET_NORMAL  FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL )\n#define FT_LOAD_TARGET_LIGHT   FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT  )\n#define FT_LOAD_TARGET_MONO    FT_LOAD_TARGET_( FT_RENDER_MODE_MONO   )\n#define FT_LOAD_TARGET_LCD     FT_LOAD_TARGET_( FT_RENDER_MODE_LCD    )\n#define FT_LOAD_TARGET_LCD_V   FT_LOAD_TARGET_( FT_RENDER_MODE_LCD_V  )\n\n\n  /**************************************************************************\n   *\n   * @macro:\n   *   FT_LOAD_TARGET_MODE\n   *\n   * @description:\n   *   Return the @FT_Render_Mode corresponding to a given\n   *   @FT_LOAD_TARGET_XXX value.\n   *\n   */\n#define FT_LOAD_TARGET_MODE( x )  ( (FT_Render_Mode)( ( (x) >> 16 ) & 15 ) )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_Transform                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to set the transformation that is applied to glyph */\n  /*    images when they are loaded into a glyph slot through              */\n  /*    @FT_Load_Glyph.                                                    */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face   :: A handle to the source face object.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    matrix :: A pointer to the transformation's 2x2 matrix.  Use~0 for */\n  /*              the identity matrix.                                     */\n  /*    delta  :: A pointer to the translation vector.  Use~0 for the null */\n  /*              vector.                                                  */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The transformation is only applied to scalable image formats after */\n  /*    the glyph has been loaded.  It means that hinting is unaltered by  */\n  /*    the transformation and is performed on the character size given in */\n  /*    the last call to @FT_Set_Char_Size or @FT_Set_Pixel_Sizes.         */\n  /*                                                                       */\n  /*    Note that this also transforms the `face.glyph.advance' field, but */\n  /*    *not* the values in `face.glyph.metrics'.                          */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Set_Transform( FT_Face     face,\n                    FT_Matrix*  matrix,\n                    FT_Vector*  delta );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Render_Mode                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration type that lists the render modes supported by       */\n  /*    FreeType~2.  Each mode corresponds to a specific type of scanline  */\n  /*    conversion performed on the outline.                               */\n  /*                                                                       */\n  /*    For bitmap fonts and embedded bitmaps the `bitmap->pixel_mode'     */\n  /*    field in the @FT_GlyphSlotRec structure gives the format of the    */\n  /*    returned bitmap.                                                   */\n  /*                                                                       */\n  /*    All modes except @FT_RENDER_MODE_MONO use 256 levels of opacity.   */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_RENDER_MODE_NORMAL ::                                           */\n  /*      This is the default render mode; it corresponds to 8-bit         */\n  /*      anti-aliased bitmaps.                                            */\n  /*                                                                       */\n  /*    FT_RENDER_MODE_LIGHT ::                                            */\n  /*      This is equivalent to @FT_RENDER_MODE_NORMAL.  It is only        */\n  /*      defined as a separate value because render modes are also used   */\n  /*      indirectly to define hinting algorithm selectors.  See           */\n  /*      @FT_LOAD_TARGET_XXX for details.                                 */\n  /*                                                                       */\n  /*    FT_RENDER_MODE_MONO ::                                             */\n  /*      This mode corresponds to 1-bit bitmaps (with 2~levels of         */\n  /*      opacity).                                                        */\n  /*                                                                       */\n  /*    FT_RENDER_MODE_LCD ::                                              */\n  /*      This mode corresponds to horizontal RGB and BGR sub-pixel        */\n  /*      displays like LCD screens.  It produces 8-bit bitmaps that are   */\n  /*      3~times the width of the original glyph outline in pixels, and   */\n  /*      which use the @FT_PIXEL_MODE_LCD mode.                           */\n  /*                                                                       */\n  /*    FT_RENDER_MODE_LCD_V ::                                            */\n  /*      This mode corresponds to vertical RGB and BGR sub-pixel displays */\n  /*      (like PDA screens, rotated LCD displays, etc.).  It produces     */\n  /*      8-bit bitmaps that are 3~times the height of the original        */\n  /*      glyph outline in pixels and use the @FT_PIXEL_MODE_LCD_V mode.   */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The LCD-optimized glyph bitmaps produced by FT_Render_Glyph can be */\n  /*    filtered to reduce color-fringes by using @FT_Library_SetLcdFilter */\n  /*    (not active in the default builds).  It is up to the caller to     */\n  /*    either call @FT_Library_SetLcdFilter (if available) or do the      */\n  /*    filtering itself.                                                  */\n  /*                                                                       */\n  /*    The selected render mode only affects vector glyphs of a font.     */\n  /*    Embedded bitmaps often have a different pixel mode like            */\n  /*    @FT_PIXEL_MODE_MONO.  You can use @FT_Bitmap_Convert to transform  */\n  /*    them into 8-bit pixmaps.                                           */\n  /*                                                                       */\n  typedef enum  FT_Render_Mode_\n  {\n    FT_RENDER_MODE_NORMAL = 0,\n    FT_RENDER_MODE_LIGHT,\n    FT_RENDER_MODE_MONO,\n    FT_RENDER_MODE_LCD,\n    FT_RENDER_MODE_LCD_V,\n\n    FT_RENDER_MODE_MAX\n\n  } FT_Render_Mode;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    ft_render_mode_xxx                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    These constants are deprecated.  Use the corresponding             */\n  /*    @FT_Render_Mode values instead.                                    */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    ft_render_mode_normal :: see @FT_RENDER_MODE_NORMAL                */\n  /*    ft_render_mode_mono   :: see @FT_RENDER_MODE_MONO                  */\n  /*                                                                       */\n#define ft_render_mode_normal  FT_RENDER_MODE_NORMAL\n#define ft_render_mode_mono    FT_RENDER_MODE_MONO\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Render_Glyph                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Convert a given glyph image to a bitmap.  It does so by inspecting */\n  /*    the glyph image format, finding the relevant renderer, and         */\n  /*    invoking it.                                                       */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    slot        :: A handle to the glyph slot containing the image to  */\n  /*                   convert.                                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    render_mode :: This is the render mode used to render the glyph    */\n  /*                   image into a bitmap.  See @FT_Render_Mode for a     */\n  /*                   list of possible values.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Render_Glyph( FT_GlyphSlot    slot,\n                   FT_Render_Mode  render_mode );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Kerning_Mode                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration used to specify which kerning values to return in   */\n  /*    @FT_Get_Kerning.                                                   */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_KERNING_DEFAULT  :: Return scaled and grid-fitted kerning       */\n  /*                           distances (value is~0).                     */\n  /*                                                                       */\n  /*    FT_KERNING_UNFITTED :: Return scaled but un-grid-fitted kerning    */\n  /*                           distances.                                  */\n  /*                                                                       */\n  /*    FT_KERNING_UNSCALED :: Return the kerning vector in original font  */\n  /*                           units.                                      */\n  /*                                                                       */\n  typedef enum  FT_Kerning_Mode_\n  {\n    FT_KERNING_DEFAULT  = 0,\n    FT_KERNING_UNFITTED,\n    FT_KERNING_UNSCALED\n\n  } FT_Kerning_Mode;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Const>                                                               */\n  /*    ft_kerning_default                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This constant is deprecated.  Please use @FT_KERNING_DEFAULT       */\n  /*    instead.                                                           */\n  /*                                                                       */\n#define ft_kerning_default   FT_KERNING_DEFAULT\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Const>                                                               */\n  /*    ft_kerning_unfitted                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This constant is deprecated.  Please use @FT_KERNING_UNFITTED      */\n  /*    instead.                                                           */\n  /*                                                                       */\n#define ft_kerning_unfitted  FT_KERNING_UNFITTED\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Const>                                                               */\n  /*    ft_kerning_unscaled                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This constant is deprecated.  Please use @FT_KERNING_UNSCALED      */\n  /*    instead.                                                           */\n  /*                                                                       */\n#define ft_kerning_unscaled  FT_KERNING_UNSCALED\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Kerning                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the kerning vector between two glyphs of a same face.       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face        :: A handle to a source face object.                   */\n  /*                                                                       */\n  /*    left_glyph  :: The index of the left glyph in the kern pair.       */\n  /*                                                                       */\n  /*    right_glyph :: The index of the right glyph in the kern pair.      */\n  /*                                                                       */\n  /*    kern_mode   :: See @FT_Kerning_Mode for more information.          */\n  /*                   Determines the scale and dimension of the returned  */\n  /*                   kerning vector.                                     */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    akerning    :: The kerning vector.  This is either in font units   */\n  /*                   or in pixels (26.6 format) for scalable formats,    */\n  /*                   and in pixels for fixed-sizes formats.              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Only horizontal layouts (left-to-right & right-to-left) are        */\n  /*    supported by this method.  Other layouts, or more sophisticated    */\n  /*    kernings, are out of the scope of this API function -- they can be */\n  /*    implemented through format-specific interfaces.                    */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_Kerning( FT_Face     face,\n                  FT_UInt     left_glyph,\n                  FT_UInt     right_glyph,\n                  FT_UInt     kern_mode,\n                  FT_Vector  *akerning );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Track_Kerning                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the track kerning for a given face object at a given size.  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face       :: A handle to a source face object.                    */\n  /*                                                                       */\n  /*    point_size :: The point size in 16.16 fractional points.           */\n  /*                                                                       */\n  /*    degree     :: The degree of tightness.  Increasingly negative      */\n  /*                  values represent tighter track kerning, while        */\n  /*                  increasingly positive values represent looser track  */\n  /*                  kerning.  Value zero means no track kerning.         */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    akerning   :: The kerning in 16.16 fractional points, to be        */\n  /*                  uniformly applied between all glyphs.                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Currently, only the Type~1 font driver supports track kerning,     */\n  /*    using data from AFM files (if attached with @FT_Attach_File or     */\n  /*    @FT_Attach_Stream).                                                */\n  /*                                                                       */\n  /*    Only very few AFM files come with track kerning data; please refer */\n  /*    to the Adobe's AFM specification for more details.                 */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_Track_Kerning( FT_Face    face,\n                        FT_Fixed   point_size,\n                        FT_Int     degree,\n                        FT_Fixed*  akerning );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Glyph_Name                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the ASCII name of a given glyph in a face.  This only     */\n  /*    works for those faces where @FT_HAS_GLYPH_NAMES(face) returns~1.   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face        :: A handle to a source face object.                   */\n  /*                                                                       */\n  /*    glyph_index :: The glyph index.                                    */\n  /*                                                                       */\n  /*    buffer_max  :: The maximum number of bytes available in the        */\n  /*                   buffer.                                             */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    buffer      :: A pointer to a target buffer where the name is      */\n  /*                   copied to.                                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    An error is returned if the face doesn't provide glyph names or if */\n  /*    the glyph index is invalid.  In all cases of failure, the first    */\n  /*    byte of `buffer' is set to~0 to indicate an empty name.            */\n  /*                                                                       */\n  /*    The glyph name is truncated to fit within the buffer if it is too  */\n  /*    long.  The returned string is always zero-terminated.              */\n  /*                                                                       */\n  /*    Be aware that FreeType reorders glyph indices internally so that   */\n  /*    glyph index~0 always corresponds to the `missing glyph' (called    */\n  /*    `.notdef').                                                        */\n  /*                                                                       */\n  /*    This function is not compiled within the library if the config     */\n  /*    macro `FT_CONFIG_OPTION_NO_GLYPH_NAMES' is defined in              */\n  /*    `include/freetype/config/ftoptions.h'.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_Glyph_Name( FT_Face     face,\n                     FT_UInt     glyph_index,\n                     FT_Pointer  buffer,\n                     FT_UInt     buffer_max );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Postscript_Name                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the ASCII PostScript name of a given face, if available.  */\n  /*    This only works with PostScript and TrueType fonts.                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to the source face object.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A pointer to the face's PostScript name.  NULL if unavailable.     */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The returned pointer is owned by the face and is destroyed with    */\n  /*    it.                                                                */\n  /*                                                                       */\n  FT_EXPORT( const char* )\n  FT_Get_Postscript_Name( FT_Face  face );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Select_Charmap                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Select a given charmap by its encoding tag (as listed in           */\n  /*    `freetype.h').                                                     */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face     :: A handle to the source face object.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    encoding :: A handle to the selected encoding.                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function returns an error if no charmap in the face           */\n  /*    corresponds to the encoding queried here.                          */\n  /*                                                                       */\n  /*    Because many fonts contain more than a single cmap for Unicode     */\n  /*    encoding, this function has some special code to select the one    */\n  /*    which covers Unicode best (`best' in the sense that a UCS-4 cmap   */\n  /*    is preferred to a UCS-2 cmap).  It is thus preferable to           */\n  /*    @FT_Set_Charmap in this case.                                      */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Select_Charmap( FT_Face      face,\n                     FT_Encoding  encoding );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_Charmap                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Select a given charmap for character code to glyph index mapping.  */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face    :: A handle to the source face object.                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    charmap :: A handle to the selected charmap.                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function returns an error if the charmap is not part of       */\n  /*    the face (i.e., if it is not listed in the `face->charmaps'        */\n  /*    table).                                                            */\n  /*                                                                       */\n  /*    It also fails if a type~14 charmap is selected.                    */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Set_Charmap( FT_Face     face,\n                  FT_CharMap  charmap );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Get_Charmap_Index\n   *\n   * @description:\n   *   Retrieve index of a given charmap.\n   *\n   * @input:\n   *   charmap ::\n   *     A handle to a charmap.\n   *\n   * @return:\n   *   The index into the array of character maps within the face to which\n   *   `charmap' belongs.  If an error occurs, -1 is returned.\n   *\n   */\n  FT_EXPORT( FT_Int )\n  FT_Get_Charmap_Index( FT_CharMap  charmap );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Char_Index                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the glyph index of a given character code.  This function   */\n  /*    uses a charmap object to do the mapping.                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face     :: A handle to the source face object.                    */\n  /*                                                                       */\n  /*    charcode :: The character code.                                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The glyph index.  0~means `undefined character code'.              */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If you use FreeType to manipulate the contents of font files       */\n  /*    directly, be aware that the glyph index returned by this function  */\n  /*    doesn't always correspond to the internal indices used within the  */\n  /*    file.  This is done to ensure that value~0 always corresponds to   */\n  /*    the `missing glyph'.  If the first glyph is not named `.notdef',   */\n  /*    then for Type~1 and Type~42 fonts, `.notdef' will be moved into    */\n  /*    the glyph ID~0 position, and whatever was there will be moved to   */\n  /*    the position `.notdef' had.  For Type~1 fonts, if there is no      */\n  /*    `.notdef' glyph at all, then one will be created at index~0 and    */\n  /*    whatever was there will be moved to the last index -- Type~42      */\n  /*    fonts are considered invalid under this condition.                 */\n  /*                                                                       */\n  FT_EXPORT( FT_UInt )\n  FT_Get_Char_Index( FT_Face   face,\n                     FT_ULong  charcode );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_First_Char                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function is used to return the first character code in the    */\n  /*    current charmap of a given face.  It also returns the              */\n  /*    corresponding glyph index.                                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face    :: A handle to the source face object.                     */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    agindex :: Glyph index of first character code.  0~if charmap is   */\n  /*               empty.                                                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The charmap's first character code.                                */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You should use this function with @FT_Get_Next_Char to be able to  */\n  /*    parse all character codes available in a given charmap.  The code  */\n  /*    should look like this:                                             */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      FT_ULong  charcode;                                              */\n  /*      FT_UInt   gindex;                                                */\n  /*                                                                       */\n  /*                                                                       */\n  /*      charcode = FT_Get_First_Char( face, &gindex );                   */\n  /*      while ( gindex != 0 )                                            */\n  /*      {                                                                */\n  /*        ... do something with (charcode,gindex) pair ...               */\n  /*                                                                       */\n  /*        charcode = FT_Get_Next_Char( face, charcode, &gindex );        */\n  /*      }                                                                */\n  /*    }                                                                  */\n  /*                                                                       */\n  /*    Note that `*agindex' is set to~0 if the charmap is empty.  The     */\n  /*    result itself can be~0 in two cases: if the charmap is empty or    */\n  /*    if the value~0 is the first valid character code.                  */\n  /*                                                                       */\n  FT_EXPORT( FT_ULong )\n  FT_Get_First_Char( FT_Face   face,\n                     FT_UInt  *agindex );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Next_Char                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function is used to return the next character code in the     */\n  /*    current charmap of a given face following the value `char_code',   */\n  /*    as well as the corresponding glyph index.                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face      :: A handle to the source face object.                   */\n  /*    char_code :: The starting character code.                          */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    agindex   :: Glyph index of next character code.  0~if charmap     */\n  /*                 is empty.                                             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The charmap's next character code.                                 */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You should use this function with @FT_Get_First_Char to walk       */\n  /*    over all character codes available in a given charmap.  See the    */\n  /*    note for this function for a simple code example.                  */\n  /*                                                                       */\n  /*    Note that `*agindex' is set to~0 when there are no more codes in   */\n  /*    the charmap.                                                       */\n  /*                                                                       */\n  FT_EXPORT( FT_ULong )\n  FT_Get_Next_Char( FT_Face    face,\n                    FT_ULong   char_code,\n                    FT_UInt   *agindex );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Name_Index                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the glyph index of a given glyph name.  This function uses  */\n  /*    driver specific objects to do the translation.                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face       :: A handle to the source face object.                  */\n  /*                                                                       */\n  /*    glyph_name :: The glyph name.                                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The glyph index.  0~means `undefined character code'.              */\n  /*                                                                       */\n  FT_EXPORT( FT_UInt )\n  FT_Get_Name_Index( FT_Face     face,\n                     FT_String*  glyph_name );\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_SUBGLYPH_FLAG_XXX\n   *\n   * @description:\n   *   A list of constants used to describe subglyphs.  Please refer to the\n   *   TrueType specification for the meaning of the various flags.\n   *\n   * @values:\n   *   FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS ::\n   *   FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES ::\n   *   FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID ::\n   *   FT_SUBGLYPH_FLAG_SCALE ::\n   *   FT_SUBGLYPH_FLAG_XY_SCALE ::\n   *   FT_SUBGLYPH_FLAG_2X2 ::\n   *   FT_SUBGLYPH_FLAG_USE_MY_METRICS ::\n   *\n   */\n#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS          1\n#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES      2\n#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID        4\n#define FT_SUBGLYPH_FLAG_SCALE                   8\n#define FT_SUBGLYPH_FLAG_XY_SCALE             0x40\n#define FT_SUBGLYPH_FLAG_2X2                  0x80\n#define FT_SUBGLYPH_FLAG_USE_MY_METRICS      0x200\n\n\n  /*************************************************************************\n   *\n   * @func:\n   *   FT_Get_SubGlyph_Info\n   *\n   * @description:\n   *   Retrieve a description of a given subglyph.  Only use it if\n   *   `glyph->format' is @FT_GLYPH_FORMAT_COMPOSITE; an error is\n   *   returned otherwise.\n   *\n   * @input:\n   *   glyph ::\n   *     The source glyph slot.\n   *\n   *   sub_index ::\n   *     The index of the subglyph.  Must be less than\n   *     `glyph->num_subglyphs'.\n   *\n   * @output:\n   *   p_index ::\n   *     The glyph index of the subglyph.\n   *\n   *   p_flags ::\n   *     The subglyph flags, see @FT_SUBGLYPH_FLAG_XXX.\n   *\n   *   p_arg1 ::\n   *     The subglyph's first argument (if any).\n   *\n   *   p_arg2 ::\n   *     The subglyph's second argument (if any).\n   *\n   *   p_transform ::\n   *     The subglyph transformation (if any).\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   The values of `*p_arg1', `*p_arg2', and `*p_transform' must be\n   *   interpreted depending on the flags returned in `*p_flags'.  See the\n   *   TrueType specification for details.\n   *\n   */\n  FT_EXPORT( FT_Error )\n  FT_Get_SubGlyph_Info( FT_GlyphSlot  glyph,\n                        FT_UInt       sub_index,\n                        FT_Int       *p_index,\n                        FT_UInt      *p_flags,\n                        FT_Int       *p_arg1,\n                        FT_Int       *p_arg2,\n                        FT_Matrix    *p_transform );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_FSTYPE_XXX                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A list of bit flags used in the `fsType' field of the OS/2 table   */\n  /*    in a TrueType or OpenType font and the `FSType' entry in a         */\n  /*    PostScript font.  These bit flags are returned by                  */\n  /*    @FT_Get_FSType_Flags; they inform client applications of embedding */\n  /*    and subsetting restrictions associated with a font.                */\n  /*                                                                       */\n  /*    See http://www.adobe.com/devnet/acrobat/pdfs/FontPolicies.pdf for  */\n  /*    more details.                                                      */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_FSTYPE_INSTALLABLE_EMBEDDING ::                                 */\n  /*      Fonts with no fsType bit set may be embedded and permanently     */\n  /*      installed on the remote system by an application.                */\n  /*                                                                       */\n  /*    FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING ::                          */\n  /*      Fonts that have only this bit set must not be modified, embedded */\n  /*      or exchanged in any manner without first obtaining permission of */\n  /*      the font software copyright owner.                               */\n  /*                                                                       */\n  /*    FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING ::                           */\n  /*      If this bit is set, the font may be embedded and temporarily     */\n  /*      loaded on the remote system.  Documents containing Preview &     */\n  /*      Print fonts must be opened `read-only'; no edits can be applied  */\n  /*      to the document.                                                 */\n  /*                                                                       */\n  /*    FT_FSTYPE_EDITABLE_EMBEDDING ::                                    */\n  /*      If this bit is set, the font may be embedded but must only be    */\n  /*      installed temporarily on other systems.  In contrast to Preview  */\n  /*      & Print fonts, documents containing editable fonts may be opened */\n  /*      for reading, editing is permitted, and changes may be saved.     */\n  /*                                                                       */\n  /*    FT_FSTYPE_NO_SUBSETTING ::                                         */\n  /*      If this bit is set, the font may not be subsetted prior to       */\n  /*      embedding.                                                       */\n  /*                                                                       */\n  /*    FT_FSTYPE_BITMAP_EMBEDDING_ONLY ::                                 */\n  /*      If this bit is set, only bitmaps contained in the font may be    */\n  /*      embedded; no outline data may be embedded.  If there are no      */\n  /*      bitmaps available in the font, then the font is unembeddable.    */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    While the fsType flags can indicate that a font may be embedded, a */\n  /*    license with the font vendor may be separately required to use the */\n  /*    font in this way.                                                  */\n  /*                                                                       */\n#define FT_FSTYPE_INSTALLABLE_EMBEDDING         0x0000\n#define FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING  0x0002\n#define FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING   0x0004\n#define FT_FSTYPE_EDITABLE_EMBEDDING            0x0008\n#define FT_FSTYPE_NO_SUBSETTING                 0x0100\n#define FT_FSTYPE_BITMAP_EMBEDDING_ONLY         0x0200\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_FSType_Flags                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the fsType flags for a font.                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to the source face object.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The fsType flags, @FT_FSTYPE_XXX.                                  */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Use this function rather than directly reading the `fs_type' field */\n  /*    in the @PS_FontInfoRec structure which is only guaranteed to       */\n  /*    return the correct results for Type~1 fonts.                       */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.3.8                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_UShort )\n  FT_Get_FSType_Flags( FT_Face  face );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    glyph_variants                                                     */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Glyph Variants                                                     */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    The FreeType~2 interface to Unicode Ideographic Variation          */\n  /*    Sequences (IVS), using the SFNT cmap format~14.                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Many CJK characters have variant forms.  They are a sort of grey   */\n  /*    area somewhere between being totally irrelevant and semantically   */\n  /*    distinct; for this reason, the Unicode consortium decided to       */\n  /*    introduce Ideographic Variation Sequences (IVS), consisting of a   */\n  /*    Unicode base character and one of 240 variant selectors            */\n  /*    (U+E0100-U+E01EF), instead of further extending the already huge   */\n  /*    code range for CJK characters.                                     */\n  /*                                                                       */\n  /*    An IVS is registered and unique; for further details please refer  */\n  /*    to Unicode Technical Standard #37, the Ideographic Variation       */\n  /*    Database:                                                          */\n  /*                                                                       */\n  /*      http://www.unicode.org/reports/tr37/                             */\n  /*                                                                       */\n  /*    To date (November 2012), the character with the most variants is   */\n  /*    U+9089, having 31 such IVS.                                        */\n  /*                                                                       */\n  /*    Adobe and MS decided to support IVS with a new cmap subtable       */\n  /*    (format~14).  It is an odd subtable because it is not a mapping of */\n  /*    input code points to glyphs, but contains lists of all variants    */\n  /*    supported by the font.                                             */\n  /*                                                                       */\n  /*    A variant may be either `default' or `non-default'.  A default     */\n  /*    variant is the one you will get for that code point if you look it */\n  /*    up in the standard Unicode cmap.  A non-default variant is a       */\n  /*    different glyph.                                                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Face_GetCharVariantIndex                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the glyph index of a given character code as modified by    */\n  /*    the variation selector.                                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face ::                                                            */\n  /*      A handle to the source face object.                              */\n  /*                                                                       */\n  /*    charcode ::                                                        */\n  /*      The character code point in Unicode.                             */\n  /*                                                                       */\n  /*    variantSelector ::                                                 */\n  /*      The Unicode code point of the variation selector.                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The glyph index.  0~means either `undefined character code', or    */\n  /*    `undefined selector code', or `no variation selector cmap          */\n  /*    subtable', or `current CharMap is not Unicode'.                    */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If you use FreeType to manipulate the contents of font files       */\n  /*    directly, be aware that the glyph index returned by this function  */\n  /*    doesn't always correspond to the internal indices used within      */\n  /*    the file.  This is done to ensure that value~0 always corresponds  */\n  /*    to the `missing glyph'.                                            */\n  /*                                                                       */\n  /*    This function is only meaningful if                                */\n  /*      a) the font has a variation selector cmap sub table,             */\n  /*    and                                                                */\n  /*      b) the current charmap has a Unicode encoding.                   */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.3.6                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_UInt )\n  FT_Face_GetCharVariantIndex( FT_Face   face,\n                               FT_ULong  charcode,\n                               FT_ULong  variantSelector );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Face_GetCharVariantIsDefault                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Check whether this variant of this Unicode character is the one to */\n  /*    be found in the `cmap'.                                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face ::                                                            */\n  /*      A handle to the source face object.                              */\n  /*                                                                       */\n  /*    charcode ::                                                        */\n  /*      The character codepoint in Unicode.                              */\n  /*                                                                       */\n  /*    variantSelector ::                                                 */\n  /*      The Unicode codepoint of the variation selector.                 */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    1~if found in the standard (Unicode) cmap, 0~if found in the       */\n  /*    variation selector cmap, or -1 if it is not a variant.             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function is only meaningful if the font has a variation       */\n  /*    selector cmap subtable.                                            */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.3.6                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_Int )\n  FT_Face_GetCharVariantIsDefault( FT_Face   face,\n                                   FT_ULong  charcode,\n                                   FT_ULong  variantSelector );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Face_GetVariantSelectors                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return a zero-terminated list of Unicode variant selectors found   */\n  /*    in the font.                                                       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face ::                                                            */\n  /*      A handle to the source face object.                              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A pointer to an array of selector code points, or NULL if there is */\n  /*    no valid variant selector cmap subtable.                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The last item in the array is~0; the array is owned by the         */\n  /*    @FT_Face object but can be overwritten or released on the next     */\n  /*    call to a FreeType function.                                       */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.3.6                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_UInt32* )\n  FT_Face_GetVariantSelectors( FT_Face  face );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Face_GetVariantsOfChar                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return a zero-terminated list of Unicode variant selectors found   */\n  /*    for the specified character code.                                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face ::                                                            */\n  /*      A handle to the source face object.                              */\n  /*                                                                       */\n  /*    charcode ::                                                        */\n  /*      The character codepoint in Unicode.                              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A pointer to an array of variant selector code points which are    */\n  /*    active for the given character, or NULL if the corresponding list  */\n  /*    is empty.                                                          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The last item in the array is~0; the array is owned by the         */\n  /*    @FT_Face object but can be overwritten or released on the next     */\n  /*    call to a FreeType function.                                       */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.3.6                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_UInt32* )\n  FT_Face_GetVariantsOfChar( FT_Face   face,\n                             FT_ULong  charcode );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Face_GetCharsOfVariant                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return a zero-terminated list of Unicode character codes found for */\n  /*    the specified variant selector.                                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face ::                                                            */\n  /*      A handle to the source face object.                              */\n  /*                                                                       */\n  /*    variantSelector ::                                                 */\n  /*      The variant selector code point in Unicode.                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A list of all the code points which are specified by this selector */\n  /*    (both default and non-default codes are returned) or NULL if there */\n  /*    is no valid cmap or the variant selector is invalid.               */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The last item in the array is~0; the array is owned by the         */\n  /*    @FT_Face object but can be overwritten or released on the next     */\n  /*    call to a FreeType function.                                       */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.3.6                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_UInt32* )\n  FT_Face_GetCharsOfVariant( FT_Face   face,\n                             FT_ULong  variantSelector );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    computations                                                       */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Computations                                                       */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Crunching fixed numbers and vectors.                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains various functions used to perform            */\n  /*    computations on 16.16 fixed-float numbers or 2d vectors.           */\n  /*                                                                       */\n  /* <Order>                                                               */\n  /*    FT_MulDiv                                                          */\n  /*    FT_MulFix                                                          */\n  /*    FT_DivFix                                                          */\n  /*    FT_RoundFix                                                        */\n  /*    FT_CeilFix                                                         */\n  /*    FT_FloorFix                                                        */\n  /*    FT_Vector_Transform                                                */\n  /*    FT_Matrix_Multiply                                                 */\n  /*    FT_Matrix_Invert                                                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_MulDiv                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A very simple function used to perform the computation `(a*b)/c'   */\n  /*    with maximum accuracy (it uses a 64-bit intermediate integer       */\n  /*    whenever necessary).                                               */\n  /*                                                                       */\n  /*    This function isn't necessarily as fast as some processor specific */\n  /*    operations, but is at least completely portable.                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    a :: The first multiplier.                                         */\n  /*    b :: The second multiplier.                                        */\n  /*    c :: The divisor.                                                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result of `(a*b)/c'.  This function never traps when trying to */\n  /*    divide by zero; it simply returns `MaxInt' or `MinInt' depending   */\n  /*    on the signs of `a' and `b'.                                       */\n  /*                                                                       */\n  FT_EXPORT( FT_Long )\n  FT_MulDiv( FT_Long  a,\n             FT_Long  b,\n             FT_Long  c );\n\n\n  /* */\n\n  /* The following #if 0 ... #endif is for the documentation formatter, */\n  /* hiding the internal `FT_MULFIX_INLINED' macro.                     */\n\n#if 0\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_MulFix                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A very simple function used to perform the computation             */\n  /*    `(a*b)/0x10000' with maximum accuracy.  Most of the time this is   */\n  /*    used to multiply a given value by a 16.16 fixed-point factor.      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    a :: The first multiplier.                                         */\n  /*    b :: The second multiplier.  Use a 16.16 factor here whenever      */\n  /*         possible (see note below).                                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result of `(a*b)/0x10000'.                                     */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function has been optimized for the case where the absolute   */\n  /*    value of `a' is less than 2048, and `b' is a 16.16 scaling factor. */\n  /*    As this happens mainly when scaling from notional units to         */\n  /*    fractional pixels in FreeType, it resulted in noticeable speed     */\n  /*    improvements between versions 2.x and 1.x.                         */\n  /*                                                                       */\n  /*    As a conclusion, always try to place a 16.16 factor as the         */\n  /*    _second_ argument of this function; this can make a great          */\n  /*    difference.                                                        */\n  /*                                                                       */\n  FT_EXPORT( FT_Long )\n  FT_MulFix( FT_Long  a,\n             FT_Long  b );\n\n  /* */\n#endif\n\n#ifdef FT_MULFIX_INLINED\n#define FPDFAPI_FT_MulFix( a, b )  FT_MULFIX_INLINED( a, b )\n#else\n  FT_EXPORT( FT_Long )\n  FT_MulFix( FT_Long  a,\n             FT_Long  b );\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_DivFix                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A very simple function used to perform the computation             */\n  /*    `(a*0x10000)/b' with maximum accuracy.  Most of the time, this is  */\n  /*    used to divide a given value by a 16.16 fixed-point factor.        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    a :: The first multiplier.                                         */\n  /*    b :: The second multiplier.  Use a 16.16 factor here whenever      */\n  /*         possible (see note below).                                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result of `(a*0x10000)/b'.                                     */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The optimization for FT_DivFix() is simple: If (a~<<~16) fits in   */\n  /*    32~bits, then the division is computed directly.  Otherwise, we    */\n  /*    use a specialized version of @FT_MulDiv.                           */\n  /*                                                                       */\n  FT_EXPORT( FT_Long )\n  FT_DivFix( FT_Long  a,\n             FT_Long  b );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_RoundFix                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A very simple function used to round a 16.16 fixed number.         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    a :: The number to be rounded.                                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result of `(a + 0x8000) & -0x10000'.                           */\n  /*                                                                       */\n  FT_EXPORT( FT_Fixed )\n  FT_RoundFix( FT_Fixed  a );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_CeilFix                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A very simple function used to compute the ceiling function of a   */\n  /*    16.16 fixed number.                                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    a :: The number for which the ceiling function is to be computed.  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result of `(a + 0x10000 - 1) & -0x10000'.                      */\n  /*                                                                       */\n  FT_EXPORT( FT_Fixed )\n  FT_CeilFix( FT_Fixed  a );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_FloorFix                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A very simple function used to compute the floor function of a     */\n  /*    16.16 fixed number.                                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    a :: The number for which the floor function is to be computed.    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result of `a & -0x10000'.                                      */\n  /*                                                                       */\n  FT_EXPORT( FT_Fixed )\n  FT_FloorFix( FT_Fixed  a );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Vector_Transform                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Transform a single vector through a 2x2 matrix.                    */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    vector :: The target vector to transform.                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    matrix :: A pointer to the source 2x2 matrix.                      */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The result is undefined if either `vector' or `matrix' is invalid. */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Vector_Transform( FT_Vector*        vec,\n                       const FT_Matrix*  matrix );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    version                                                            */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    FreeType Version                                                   */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Functions and macros related to FreeType versions.                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Note that those functions and macros are of limited use because    */\n  /*    even a new release of FreeType with only documentation changes     */\n  /*    increases the version number.                                      */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************\n   *\n   * @enum:\n   *   FREETYPE_XXX\n   *\n   * @description:\n   *   These three macros identify the FreeType source code version.\n   *   Use @FT_Library_Version to access them at runtime.\n   *\n   * @values:\n   *   FREETYPE_MAJOR :: The major version number.\n   *   FREETYPE_MINOR :: The minor version number.\n   *   FREETYPE_PATCH :: The patch level.\n   *\n   * @note:\n   *   The version number of FreeType if built as a dynamic link library\n   *   with the `libtool' package is _not_ controlled by these three\n   *   macros.\n   *\n   */\n#define FREETYPE_MAJOR  2\n#define FREETYPE_MINOR  5\n#define FREETYPE_PATCH  0\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Library_Version                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the version of the FreeType library being used.  This is    */\n  /*    useful when dynamically linking to the library, since one cannot   */\n  /*    use the macros @FREETYPE_MAJOR, @FREETYPE_MINOR, and               */\n  /*    @FREETYPE_PATCH.                                                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A source library handle.                                */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    amajor  :: The major version number.                               */\n  /*                                                                       */\n  /*    aminor  :: The minor version number.                               */\n  /*                                                                       */\n  /*    apatch  :: The patch version number.                               */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The reason why this function takes a `library' argument is because */\n  /*    certain programs implement library initialization in a custom way  */\n  /*    that doesn't use @FT_Init_FreeType.                                */\n  /*                                                                       */\n  /*    In such cases, the library version might not be available before   */\n  /*    the library object has been created.                               */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Library_Version( FT_Library   library,\n                      FT_Int      *amajor,\n                      FT_Int      *aminor,\n                      FT_Int      *apatch );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Face_CheckTrueTypePatents                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Parse all bytecode instructions of a TrueType font file to check   */\n  /*    whether any of the patented opcodes are used.  This is only useful */\n  /*    if you want to be able to use the unpatented hinter with           */\n  /*    fonts that do *not* use these opcodes.                             */\n  /*                                                                       */\n  /*    Note that this function parses *all* glyph instructions in the     */\n  /*    font file, which may be slow.                                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A face handle.                                             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    1~if this is a TrueType font that uses one of the patented         */\n  /*    opcodes, 0~otherwise.                                              */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Since May 2010, TrueType hinting is no longer patented.            */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.3.5                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_Bool )\n  FT_Face_CheckTrueTypePatents( FT_Face  face );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Face_SetUnpatentedHinting                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Enable or disable the unpatented hinter for a given face.          */\n  /*    Only enable it if you have determined that the face doesn't        */\n  /*    use any patented opcodes (see @FT_Face_CheckTrueTypePatents).      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face  :: A face handle.                                            */\n  /*                                                                       */\n  /*    value :: New boolean setting.                                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The old setting value.  This will always be false if this is not   */\n  /*    an SFNT font, or if the unpatented hinter is not compiled in this  */\n  /*    instance of the library.                                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Since May 2010, TrueType hinting is no longer patented.            */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.3.5                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_Bool )\n  FT_Face_SetUnpatentedHinting( FT_Face  face,\n                                FT_Bool  value );\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FREETYPE_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftadvanc.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftadvanc.h                                                             */\n/*                                                                         */\n/*    Quick computation of advance widths (specification only).            */\n/*                                                                         */\n/*  Copyright 2008, 2013 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTADVANC_H__\n#define __FTADVANC_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /**************************************************************************\n   *\n   * @section:\n   *   quick_advance\n   *\n   * @title:\n   *   Quick retrieval of advance values\n   *\n   * @abstract:\n   *   Retrieve horizontal and vertical advance values without processing\n   *   glyph outlines, if possible.\n   *\n   * @description:\n   *   This section contains functions to quickly extract advance values\n   *   without handling glyph outlines, if possible.\n   */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Const>                                                               */\n  /*    FT_ADVANCE_FLAG_FAST_ONLY                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A bit-flag to be OR-ed with the `flags' parameter of the           */\n  /*    @FT_Get_Advance and @FT_Get_Advances functions.                    */\n  /*                                                                       */\n  /*    If set, it indicates that you want these functions to fail if the  */\n  /*    corresponding hinting mode or font driver doesn't allow for very   */\n  /*    quick advance computation.                                         */\n  /*                                                                       */\n  /*    Typically, glyphs which are either unscaled, unhinted, bitmapped,  */\n  /*    or light-hinted can have their advance width computed very         */\n  /*    quickly.                                                           */\n  /*                                                                       */\n  /*    Normal and bytecode hinted modes, which require loading, scaling,  */\n  /*    and hinting of the glyph outline, are extremely slow by            */\n  /*    comparison.                                                        */\n  /*                                                                       */\n#define FT_ADVANCE_FLAG_FAST_ONLY  0x20000000UL\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Advance                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the advance value of a given glyph outline in an          */\n  /*    @FT_Face.                                                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face       :: The source @FT_Face handle.                          */\n  /*                                                                       */\n  /*    gindex     :: The glyph index.                                     */\n  /*                                                                       */\n  /*    load_flags :: A set of bit flags similar to those used when        */\n  /*                  calling @FT_Load_Glyph, used to determine what kind  */\n  /*                  of advances you need.                                */\n  /* <Output>                                                              */\n  /*    padvance :: The advance value.  If scaling is performed (based on  */\n  /*                the value of `load_flags'), the advance value is in    */\n  /*                16.16 format.  Otherwise, it is in font units.         */\n  /*                                                                       */\n  /*                If @FT_LOAD_VERTICAL_LAYOUT is set, this is the        */\n  /*                vertical advance corresponding to a vertical layout.   */\n  /*                Otherwise, it is the horizontal advance in a           */\n  /*                horizontal layout.                                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and   */\n  /*    if the corresponding font backend doesn't have a quick way to      */\n  /*    retrieve the advances.                                             */\n  /*                                                                       */\n  /*    A scaled advance is returned in 16.16 format but isn't transformed */\n  /*    by the affine transformation specified by @FT_Set_Transform.       */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_Advance( FT_Face    face,\n                  FT_UInt    gindex,\n                  FT_Int32   load_flags,\n                  FT_Fixed  *padvance );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Advances                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the advance values of several glyph outlines in an        */\n  /*    @FT_Face.                                                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face        :: The source @FT_Face handle.                         */\n  /*                                                                       */\n  /*    start       :: The first glyph index.                              */\n  /*                                                                       */\n  /*    count       :: The number of advance values you want to retrieve.  */\n  /*                                                                       */\n  /*    load_flags  :: A set of bit flags similar to those used when       */\n  /*                   calling @FT_Load_Glyph.                             */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    padvance :: The advance values.  This array, to be provided by the */\n  /*                caller, must contain at least `count' elements.        */\n  /*                                                                       */\n  /*                If scaling is performed (based on the value of         */\n  /*                `load_flags'), the advance values are in 16.16 format. */\n  /*                Otherwise, they are in font units.                     */\n  /*                                                                       */\n  /*                If @FT_LOAD_VERTICAL_LAYOUT is set, these are the      */\n  /*                vertical advances corresponding to a vertical layout.  */\n  /*                Otherwise, they are the horizontal advances in a       */\n  /*                horizontal layout.                                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and   */\n  /*    if the corresponding font backend doesn't have a quick way to      */\n  /*    retrieve the advances.                                             */\n  /*                                                                       */\n  /*    Scaled advances are returned in 16.16 format but aren't            */\n  /*    transformed by the affine transformation specified by              */\n  /*    @FT_Set_Transform.                                                 */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_Advances( FT_Face    face,\n                   FT_UInt    start,\n                   FT_UInt    count,\n                   FT_Int32   load_flags,\n                   FT_Fixed  *padvances );\n\n/* */\n\n\nFT_END_HEADER\n\n#endif /* __FTADVANC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftautoh.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftautoh.h                                                              */\n/*                                                                         */\n/*    FreeType API for controlling the auto-hinter (specification only).   */\n/*                                                                         */\n/*  Copyright 2012, 2013 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTAUTOH_H__\n#define __FTAUTOH_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /**************************************************************************\n   *\n   * @section:\n   *   auto_hinter\n   *\n   * @title:\n   *   The auto-hinter\n   *\n   * @abstract:\n   *   Controlling the auto-hinting module.\n   *\n   * @description:\n   *   While FreeType's auto-hinter doesn't expose API functions by itself,\n   *   it is possible to control its behaviour with @FT_Property_Set and\n   *   @FT_Property_Get.  The following lists the available properties\n   *   together with the necessary macros and structures.\n   *\n   *   Note that the auto-hinter's module name is `autofitter' for\n   *   historical reasons.\n   *\n   */\n\n\n  /**************************************************************************\n   *\n   * @property:\n   *   glyph-to-script-map\n   *\n   * @description:\n   *   *Experimental* *only*\n   *\n   *   The auto-hinter provides various script modules to hint glyphs.\n   *   Examples of supported scripts are Latin or CJK.  Before a glyph is\n   *   auto-hinted, the Unicode character map of the font gets examined, and\n   *   the script is then determined based on Unicode character ranges, see\n   *   below.\n   *\n   *   OpenType fonts, however, often provide much more glyphs than\n   *   character codes (small caps, superscripts, ligatures, swashes, etc.),\n   *   to be controlled by so-called `features'.  Handling OpenType features\n   *   can be quite complicated and thus needs a separate library on top of\n   *   FreeType.\n   *\n   *   The mapping between glyph indices and scripts (in the auto-hinter\n   *   sense, see the @FT_AUTOHINTER_SCRIPT_XXX values) is stored as an\n   *   array with `num_glyphs' elements, as found in the font's @FT_Face\n   *   structure.  The `glyph-to-script-map' property returns a pointer to\n   *   this array which can be modified as needed.  Note that the\n   *   modification should happen before the first glyph gets processed by\n   *   the auto-hinter so that the global analysis of the font shapes\n   *   actually uses the modified mapping.\n   *\n   *   The following example code demonstrates how to access it (omitting\n   *   the error handling).\n   *\n   *   {\n   *     FT_Library                library;\n   *     FT_Face                   face;\n   *     FT_Prop_GlyphToScriptMap  prop;\n   *\n   *\n   *     FT_Init_FreeType( &library );\n   *     FT_New_Face( library, \"foo.ttf\", 0, &face );\n   *\n   *     prop.face = face;\n   *\n   *     FT_Property_Get( library, \"autofitter\",\n   *                               \"glyph-to-script-map\", &prop );\n   *\n   *     // adjust `prop.map' as needed right here\n   *\n   *     FT_Load_Glyph( face, ..., FT_LOAD_FORCE_AUTOHINT );\n   *   }\n   *\n   */\n\n\n  /**************************************************************************\n   *\n   * @enum:\n   *   FT_AUTOHINTER_SCRIPT_XXX\n   *\n   * @description:\n   *   *Experimental* *only*\n   *\n   *   A list of constants used for the @glyph-to-script-map property to\n   *   specify the script submodule the auto-hinter should use for hinting a\n   *   particular glyph.\n   *\n   * @values:\n   *   FT_AUTOHINTER_SCRIPT_NONE ::\n   *     Don't auto-hint this glyph.\n   *\n   *   FT_AUTOHINTER_SCRIPT_LATIN ::\n   *     Apply the latin auto-hinter.  For the auto-hinter, `latin' is a\n   *     very broad term, including Cyrillic and Greek also since characters\n   *     from those scripts share the same design constraints.\n   *\n   *     By default, characters from the following Unicode ranges are\n   *     assigned to this submodule.\n   *\n   *     {\n   *       U+0020 - U+007F  // Basic Latin (no control characters)\n   *       U+00A0 - U+00FF  // Latin-1 Supplement (no control characters)\n   *       U+0100 - U+017F  // Latin Extended-A\n   *       U+0180 - U+024F  // Latin Extended-B\n   *       U+0250 - U+02AF  // IPA Extensions\n   *       U+02B0 - U+02FF  // Spacing Modifier Letters\n   *       U+0300 - U+036F  // Combining Diacritical Marks\n   *       U+0370 - U+03FF  // Greek and Coptic\n   *       U+0400 - U+04FF  // Cyrillic\n   *       U+0500 - U+052F  // Cyrillic Supplement\n   *       U+1D00 - U+1D7F  // Phonetic Extensions\n   *       U+1D80 - U+1DBF  // Phonetic Extensions Supplement\n   *       U+1DC0 - U+1DFF  // Combining Diacritical Marks Supplement\n   *       U+1E00 - U+1EFF  // Latin Extended Additional\n   *       U+1F00 - U+1FFF  // Greek Extended\n   *       U+2000 - U+206F  // General Punctuation\n   *       U+2070 - U+209F  // Superscripts and Subscripts\n   *       U+20A0 - U+20CF  // Currency Symbols\n   *       U+2150 - U+218F  // Number Forms\n   *       U+2460 - U+24FF  // Enclosed Alphanumerics\n   *       U+2C60 - U+2C7F  // Latin Extended-C\n   *       U+2DE0 - U+2DFF  // Cyrillic Extended-A\n   *       U+2E00 - U+2E7F  // Supplemental Punctuation\n   *       U+A640 - U+A69F  // Cyrillic Extended-B\n   *       U+A720 - U+A7FF  // Latin Extended-D\n   *       U+FB00 - U+FB06  // Alphab. Present. Forms (Latin Ligatures)\n   *      U+1D400 - U+1D7FF // Mathematical Alphanumeric Symbols\n   *      U+1F100 - U+1F1FF // Enclosed Alphanumeric Supplement\n   *     }\n   *\n   *   FT_AUTOHINTER_SCRIPT_CJK ::\n   *     Apply the CJK auto-hinter, covering Chinese, Japanese, Korean, old\n   *     Vietnamese, and some other scripts.\n   *\n   *     By default, characters from the following Unicode ranges are\n   *     assigned to this submodule.\n   *\n   *     {\n   *       U+1100 - U+11FF  // Hangul Jamo\n   *       U+2E80 - U+2EFF  // CJK Radicals Supplement\n   *       U+2F00 - U+2FDF  // Kangxi Radicals\n   *       U+2FF0 - U+2FFF  // Ideographic Description Characters\n   *       U+3000 - U+303F  // CJK Symbols and Punctuation\n   *       U+3040 - U+309F  // Hiragana\n   *       U+30A0 - U+30FF  // Katakana\n   *       U+3100 - U+312F  // Bopomofo\n   *       U+3130 - U+318F  // Hangul Compatibility Jamo\n   *       U+3190 - U+319F  // Kanbun\n   *       U+31A0 - U+31BF  // Bopomofo Extended\n   *       U+31C0 - U+31EF  // CJK Strokes\n   *       U+31F0 - U+31FF  // Katakana Phonetic Extensions\n   *       U+3200 - U+32FF  // Enclosed CJK Letters and Months\n   *       U+3300 - U+33FF  // CJK Compatibility\n   *       U+3400 - U+4DBF  // CJK Unified Ideographs Extension A\n   *       U+4DC0 - U+4DFF  // Yijing Hexagram Symbols\n   *       U+4E00 - U+9FFF  // CJK Unified Ideographs\n   *       U+A960 - U+A97F  // Hangul Jamo Extended-A\n   *       U+AC00 - U+D7AF  // Hangul Syllables\n   *       U+D7B0 - U+D7FF  // Hangul Jamo Extended-B\n   *       U+F900 - U+FAFF  // CJK Compatibility Ideographs\n   *       U+FE10 - U+FE1F  // Vertical forms\n   *       U+FE30 - U+FE4F  // CJK Compatibility Forms\n   *       U+FF00 - U+FFEF  // Halfwidth and Fullwidth Forms\n   *      U+1B000 - U+1B0FF // Kana Supplement\n   *      U+1D300 - U+1D35F // Tai Xuan Hing Symbols\n   *      U+1F200 - U+1F2FF // Enclosed Ideographic Supplement\n   *      U+20000 - U+2A6DF // CJK Unified Ideographs Extension B\n   *      U+2A700 - U+2B73F // CJK Unified Ideographs Extension C\n   *      U+2B740 - U+2B81F // CJK Unified Ideographs Extension D\n   *      U+2F800 - U+2FA1F // CJK Compatibility Ideographs Supplement\n   *     }\n   *\n   *   FT_AUTOHINTER_SCRIPT_INDIC ::\n   *     Apply the indic auto-hinter, covering all major scripts from the\n   *     Indian sub-continent and some other related scripts like Thai, Lao,\n   *     or Tibetan.\n   *\n   *     By default, characters from the following Unicode ranges are\n   *     assigned to this submodule.\n   *\n   *     {\n   *       U+0900 - U+0DFF  // Indic Range\n   *       U+0F00 - U+0FFF  // Tibetan\n   *       U+1900 - U+194F  // Limbu\n   *       U+1B80 - U+1BBF  // Sundanese\n   *       U+1C80 - U+1CDF  // Meetei Mayak\n   *       U+A800 - U+A82F  // Syloti Nagri\n   *      U+11800 - U+118DF // Sharada\n   *     }\n   *\n   *     Note that currently Indic support is rudimentary only, missing blue\n   *     zone support.\n   *\n   */\n#define FT_AUTOHINTER_SCRIPT_NONE   0\n#define FT_AUTOHINTER_SCRIPT_LATIN  1\n#define FT_AUTOHINTER_SCRIPT_CJK    2\n#define FT_AUTOHINTER_SCRIPT_INDIC  3\n\n\n  /**************************************************************************\n   *\n   * @struct:\n   *   FT_Prop_GlyphToScriptMap\n   *\n   * @description:\n   *   *Experimental* *only*\n   *\n   *   The data exchange structure for the @glyph-to-script-map property.\n   *\n   */\n   typedef struct  FT_Prop_GlyphToScriptMap_\n   {\n     FT_Face   face;\n     FT_Byte*  map;\n\n   } FT_Prop_GlyphToScriptMap;\n\n\n  /**************************************************************************\n   *\n   * @property:\n   *   fallback-script\n   *\n   * @description:\n   *   *Experimental* *only*\n   *\n   *   If no auto-hinter script module can be assigned to a glyph, a\n   *   fallback script gets assigned to it (see also the\n   *   @glyph-to-script-map property).  By default, this is\n   *   @FT_AUTOHINTER_SCRIPT_CJK.  Using the `fallback-script' property,\n   *   this fallback value can be changed.\n   *\n   *   {\n   *     FT_Library  library;\n   *     FT_UInt     fallback_script = FT_AUTOHINTER_SCRIPT_NONE;\n   *\n   *\n   *     FT_Init_FreeType( &library );\n   *\n   *     FT_Property_Set( library, \"autofitter\",\n   *                               \"fallback-script\", &fallback_script );\n   *   }\n   *\n   * @note:\n   *   This property can be used with @FT_Property_Get also.\n   *\n   *   It's important to use the right timing for changing this value: The\n   *   creation of the glyph-to-script map which eventually uses the\n   *   fallback script value gets triggered either by setting or reading a\n   *   face-specific property like @glyph-to-script-map, or by auto-hinting\n   *   any glyph from that face.  In particular, if you have already created\n   *   an @FT_Face structure but not loaded any glyph (using the\n   *   auto-hinter), a change of the fallback glyph will affect this face.\n   *\n   */\n\n\n  /**************************************************************************\n   *\n   * @property:\n   *   increase-x-height\n   *\n   * @description:\n   *   For ppem values in the range 6~<= ppem <= `increase-x-height', round\n   *   up the font's x~height much more often than normally.  If the value\n   *   is set to~0, which is the default, this feature is switched off.  Use\n   *   this property to improve the legibility of small font sizes if\n   *   necessary.\n   *\n   *   {\n   *     FT_Library               library;\n   *     FT_Face                  face;\n   *     FT_Prop_IncreaseXHeight  prop;\n   *\n   *\n   *     FT_Init_FreeType( &library );\n   *     FT_New_Face( library, \"foo.ttf\", 0, &face );\n   *     FT_Set_Char_Size( face, 10 * 64, 0, 72, 0 );\n   *\n   *     prop.face  = face;\n   *     prop.limit = 14;\n   *\n   *     FT_Property_Set( library, \"autofitter\",\n   *                               \"increase-x-height\", &prop );\n   *   }\n   *\n   * @note:\n   *   This property can be used with @FT_Property_Get also.\n   *\n   *   Set this value right after calling @FT_Set_Char_Size, but before\n   *   loading any glyph (using the auto-hinter).\n   *\n   */\n\n\n  /**************************************************************************\n   *\n   * @struct:\n   *   FT_Prop_IncreaseXHeight\n   *\n   * @description:\n   *   The data exchange structure for the @increase-x-height property.\n   *\n   */\n   typedef struct  FT_Prop_IncreaseXHeight_\n   {\n     FT_Face  face;\n     FT_UInt  limit;\n\n   } FT_Prop_IncreaseXHeight;\n\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FTAUTOH_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftbbox.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftbbox.h                                                               */\n/*                                                                         */\n/*    FreeType exact bbox computation (specification).                     */\n/*                                                                         */\n/*  Copyright 1996-2001, 2003, 2007, 2011 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This component has a _single_ role: to compute exact outline bounding */\n  /* boxes.                                                                */\n  /*                                                                       */\n  /* It is separated from the rest of the engine for various technical     */\n  /* reasons.  It may well be integrated in `ftoutln' later.               */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTBBOX_H__\n#define __FTBBOX_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    outline_processing                                                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Get_BBox                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Compute the exact bounding box of an outline.  This is slower      */\n  /*    than computing the control box.  However, it uses an advanced      */\n  /*    algorithm which returns _very_ quickly when the two boxes          */\n  /*    coincide.  Otherwise, the outline Bézier arcs are traversed to     */\n  /*    extract their extrema.                                             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    outline :: A pointer to the source outline.                        */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    abbox   :: The outline's exact bounding box.                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If the font is tricky and the glyph has been loaded with           */\n  /*    @FT_LOAD_NO_SCALE, the resulting BBox is meaningless.  To get      */\n  /*    reasonable values for the BBox it is necessary to load the glyph   */\n  /*    at a large ppem value (so that the hinting instructions can        */\n  /*    properly shift and scale the subglyphs), then extracting the BBox  */\n  /*    which can be eventually converted back to font units.              */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_Get_BBox( FT_Outline*  outline,\n                       FT_BBox     *abbox );\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTBBOX_H__ */\n\n\n/* END */\n\n\n/* Local Variables: */\n/* coding: utf-8    */\n/* End:             */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftbdf.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftbdf.h                                                                */\n/*                                                                         */\n/*    FreeType API for accessing BDF-specific strings (specification).     */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2004, 2006, 2009 by                              */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTBDF_H__\n#define __FTBDF_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    bdf_fonts                                                          */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    BDF and PCF Files                                                  */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    BDF and PCF specific API.                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of functions specific to BDF */\n  /*    and PCF fonts.                                                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /**********************************************************************\n   *\n   * @enum:\n   *    FT_PropertyType\n   *\n   * @description:\n   *    A list of BDF property types.\n   *\n   * @values:\n   *    BDF_PROPERTY_TYPE_NONE ::\n   *      Value~0 is used to indicate a missing property.\n   *\n   *    BDF_PROPERTY_TYPE_ATOM ::\n   *      Property is a string atom.\n   *\n   *    BDF_PROPERTY_TYPE_INTEGER ::\n   *      Property is a 32-bit signed integer.\n   *\n   *    BDF_PROPERTY_TYPE_CARDINAL ::\n   *      Property is a 32-bit unsigned integer.\n   */\n  typedef enum  BDF_PropertyType_\n  {\n    BDF_PROPERTY_TYPE_NONE     = 0,\n    BDF_PROPERTY_TYPE_ATOM     = 1,\n    BDF_PROPERTY_TYPE_INTEGER  = 2,\n    BDF_PROPERTY_TYPE_CARDINAL = 3\n\n  } BDF_PropertyType;\n\n\n  /**********************************************************************\n   *\n   * @type:\n   *    BDF_Property\n   *\n   * @description:\n   *    A handle to a @BDF_PropertyRec structure to model a given\n   *    BDF/PCF property.\n   */\n  typedef struct BDF_PropertyRec_*  BDF_Property;\n\n\n /**********************************************************************\n  *\n  * @struct:\n  *    BDF_PropertyRec\n  *\n  * @description:\n  *    This structure models a given BDF/PCF property.\n  *\n  * @fields:\n  *    type ::\n  *      The property type.\n  *\n  *    u.atom ::\n  *      The atom string, if type is @BDF_PROPERTY_TYPE_ATOM.\n  *\n  *    u.integer ::\n  *      A signed integer, if type is @BDF_PROPERTY_TYPE_INTEGER.\n  *\n  *    u.cardinal ::\n  *      An unsigned integer, if type is @BDF_PROPERTY_TYPE_CARDINAL.\n  */\n  typedef struct  BDF_PropertyRec_\n  {\n    BDF_PropertyType  type;\n    union {\n      const char*     atom;\n      FT_Int32        integer;\n      FT_UInt32       cardinal;\n\n    } u;\n\n  } BDF_PropertyRec;\n\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_Get_BDF_Charset_ID\n  *\n  * @description:\n  *    Retrieve a BDF font character set identity, according to\n  *    the BDF specification.\n  *\n  * @input:\n  *    face ::\n  *       A handle to the input face.\n  *\n  * @output:\n  *    acharset_encoding ::\n  *       Charset encoding, as a C~string, owned by the face.\n  *\n  *    acharset_registry ::\n  *       Charset registry, as a C~string, owned by the face.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   This function only works with BDF faces, returning an error otherwise.\n  */\n  FT_EXPORT( FT_Error )\n  FT_Get_BDF_Charset_ID( FT_Face       face,\n                         const char*  *acharset_encoding,\n                         const char*  *acharset_registry );\n\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_Get_BDF_Property\n  *\n  * @description:\n  *    Retrieve a BDF property from a BDF or PCF font file.\n  *\n  * @input:\n  *    face :: A handle to the input face.\n  *\n  *    name :: The property name.\n  *\n  * @output:\n  *    aproperty :: The property.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   This function works with BDF _and_ PCF fonts.  It returns an error\n  *   otherwise.  It also returns an error if the property is not in the\n  *   font.\n  *\n  *   A `property' is a either key-value pair within the STARTPROPERTIES\n  *   ... ENDPROPERTIES block of a BDF font or a key-value pair from the\n  *   `info->props' array within a `FontRec' structure of a PCF font.\n  *\n  *   Integer properties are always stored as `signed' within PCF fonts;\n  *   consequently, @BDF_PROPERTY_TYPE_CARDINAL is a possible return value\n  *   for BDF fonts only.\n  *\n  *   In case of error, `aproperty->type' is always set to\n  *   @BDF_PROPERTY_TYPE_NONE.\n  */\n  FT_EXPORT( FT_Error )\n  FT_Get_BDF_Property( FT_Face           face,\n                       const char*       prop_name,\n                       BDF_PropertyRec  *aproperty );\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FTBDF_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftbitmap.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftbitmap.h                                                             */\n/*                                                                         */\n/*    FreeType utility functions for bitmaps (specification).              */\n/*                                                                         */\n/*  Copyright 2004-2006, 2008, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTBITMAP_H__\n#define __FTBITMAP_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    bitmap_handling                                                    */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Bitmap Handling                                                    */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Handling FT_Bitmap objects.                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains functions for converting FT_Bitmap objects.  */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Bitmap_New                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initialize a pointer to an @FT_Bitmap structure.                   */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    abitmap :: A pointer to the bitmap structure.                      */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Bitmap_New( FT_Bitmap  *abitmap );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Bitmap_Copy                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Copy a bitmap into another one.                                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle to a library object.                           */\n  /*                                                                       */\n  /*    source  :: A handle to the source bitmap.                          */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    target  :: A handle to the target bitmap.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Bitmap_Copy( FT_Library        library,\n                  const FT_Bitmap  *source,\n                  FT_Bitmap        *target);\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Bitmap_Embolden                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Embolden a bitmap.  The new bitmap will be about `xStrength'       */\n  /*    pixels wider and `yStrength' pixels higher.  The left and bottom   */\n  /*    borders are kept unchanged.                                        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library   :: A handle to a library object.                         */\n  /*                                                                       */\n  /*    xStrength :: How strong the glyph is emboldened horizontally.      */\n  /*                 Expressed in 26.6 pixel format.                       */\n  /*                                                                       */\n  /*    yStrength :: How strong the glyph is emboldened vertically.        */\n  /*                 Expressed in 26.6 pixel format.                       */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    bitmap    :: A handle to the target bitmap.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The current implementation restricts `xStrength' to be less than   */\n  /*    or equal to~8 if bitmap is of pixel_mode @FT_PIXEL_MODE_MONO.      */\n  /*                                                                       */\n  /*    If you want to embolden the bitmap owned by a @FT_GlyphSlotRec,    */\n  /*    you should call @FT_GlyphSlot_Own_Bitmap on the slot first.        */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Bitmap_Embolden( FT_Library  library,\n                      FT_Bitmap*  bitmap,\n                      FT_Pos      xStrength,\n                      FT_Pos      yStrength );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Bitmap_Convert                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Convert a bitmap object with depth 1bpp, 2bpp, 4bpp, 8bpp or 32bpp */\n  /*    to a bitmap object with depth 8bpp, making the number of used      */\n  /*    bytes line (a.k.a. the `pitch') a multiple of `alignment'.         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library   :: A handle to a library object.                         */\n  /*                                                                       */\n  /*    source    :: The source bitmap.                                    */\n  /*                                                                       */\n  /*    alignment :: The pitch of the bitmap is a multiple of this         */\n  /*                 parameter.  Common values are 1, 2, or 4.             */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    target    :: The target bitmap.                                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    It is possible to call @FT_Bitmap_Convert multiple times without   */\n  /*    calling @FT_Bitmap_Done (the memory is simply reallocated).        */\n  /*                                                                       */\n  /*    Use @FT_Bitmap_Done to finally remove the bitmap object.           */\n  /*                                                                       */\n  /*    The `library' argument is taken to have access to FreeType's       */\n  /*    memory handling functions.                                         */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Bitmap_Convert( FT_Library        library,\n                     const FT_Bitmap  *source,\n                     FT_Bitmap        *target,\n                     FT_Int            alignment );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_GlyphSlot_Own_Bitmap                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Make sure that a glyph slot owns `slot->bitmap'.                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    slot :: The glyph slot.                                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function is to be used in combination with                    */\n  /*    @FT_Bitmap_Embolden.                                               */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot  slot );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Bitmap_Done                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Destroy a bitmap object created with @FT_Bitmap_New.               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle to a library object.                           */\n  /*                                                                       */\n  /*    bitmap  :: The bitmap object to be freed.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The `library' argument is taken to have access to FreeType's       */\n  /*    memory handling functions.                                         */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Bitmap_Done( FT_Library  library,\n                  FT_Bitmap  *bitmap );\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTBITMAP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftbzip2.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftbzip2.h                                                              */\n/*                                                                         */\n/*    Bzip2-compressed stream support.                                     */\n/*                                                                         */\n/*  Copyright 2010 by                                                      */\n/*  Joel Klinghed.                                                         */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTBZIP2_H__\n#define __FTBZIP2_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    bzip2                                                              */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    BZIP2 Streams                                                      */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Using bzip2-compressed font files.                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of Bzip2-specific functions. */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n /************************************************************************\n  *\n  * @function:\n  *   FT_Stream_OpenBzip2\n  *\n  * @description:\n  *   Open a new stream to parse bzip2-compressed font files.  This is\n  *   mainly used to support the compressed `*.pcf.bz2' fonts that come\n  *   with XFree86.\n  *\n  * @input:\n  *   stream ::\n  *     The target embedding stream.\n  *\n  *   source ::\n  *     The source stream.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   The source stream must be opened _before_ calling this function.\n  *\n  *   Calling the internal function `FT_Stream_Close' on the new stream will\n  *   *not* call `FT_Stream_Close' on the source stream.  None of the stream\n  *   objects will be released to the heap.\n  *\n  *   The stream implementation is very basic and resets the decompression\n  *   process each time seeking backwards is needed within the stream.\n  *\n  *   In certain builds of the library, bzip2 compression recognition is\n  *   automatically handled when calling @FT_New_Face or @FT_Open_Face.\n  *   This means that if no font driver is capable of handling the raw\n  *   compressed file, the library will try to open a bzip2 compressed stream\n  *   from it and re-open the face with it.\n  *\n  *   This function may return `FT_Err_Unimplemented_Feature' if your build\n  *   of FreeType was not compiled with bzip2 support.\n  */\n  FT_EXPORT( FT_Error )\n  FT_Stream_OpenBzip2( FT_Stream  stream,\n                       FT_Stream  source );\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTBZIP2_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftcache.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcache.h                                                              */\n/*                                                                         */\n/*    FreeType Cache subsystem (specification).                            */\n/*                                                                         */\n/*  Copyright 1996-2008, 2010, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTCACHE_H__\n#define __FTCACHE_H__\n\n\n#include \"../ft2build.h\"\n#include \"ftglyph.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************\n   *\n   * <Section>\n   *    cache_subsystem\n   *\n   * <Title>\n   *    Cache Sub-System\n   *\n   * <Abstract>\n   *    How to cache face, size, and glyph data with FreeType~2.\n   *\n   * <Description>\n   *   This section describes the FreeType~2 cache sub-system, which is used\n   *   to limit the number of concurrently opened @FT_Face and @FT_Size\n   *   objects, as well as caching information like character maps and glyph\n   *   images while limiting their maximum memory usage.\n   *\n   *   Note that all types and functions begin with the `FTC_' prefix.\n   *\n   *   The cache is highly portable and thus doesn't know anything about the\n   *   fonts installed on your system, or how to access them.  This implies\n   *   the following scheme:\n   *\n   *   First, available or installed font faces are uniquely identified by\n   *   @FTC_FaceID values, provided to the cache by the client.  Note that\n   *   the cache only stores and compares these values, and doesn't try to\n   *   interpret them in any way.\n   *\n   *   Second, the cache calls, only when needed, a client-provided function\n   *   to convert an @FTC_FaceID into a new @FT_Face object.  The latter is\n   *   then completely managed by the cache, including its termination\n   *   through @FT_Done_Face.  To monitor termination of face objects, the\n   *   finalizer callback in the `generic' field of the @FT_Face object can\n   *   be used, which might also be used to store the @FTC_FaceID of the\n   *   face.\n   *\n   *   Clients are free to map face IDs to anything else.  The most simple\n   *   usage is to associate them to a (pathname,face_index) pair that is\n   *   used to call @FT_New_Face.  However, more complex schemes are also\n   *   possible.\n   *\n   *   Note that for the cache to work correctly, the face ID values must be\n   *   *persistent*, which means that the contents they point to should not\n   *   change at runtime, or that their value should not become invalid.\n   *\n   *   If this is unavoidable (e.g., when a font is uninstalled at runtime),\n   *   you should call @FTC_Manager_RemoveFaceID as soon as possible, to let\n   *   the cache get rid of any references to the old @FTC_FaceID it may\n   *   keep internally.  Failure to do so will lead to incorrect behaviour\n   *   or even crashes.\n   *\n   *   To use the cache, start with calling @FTC_Manager_New to create a new\n   *   @FTC_Manager object, which models a single cache instance.  You can\n   *   then look up @FT_Face and @FT_Size objects with\n   *   @FTC_Manager_LookupFace and @FTC_Manager_LookupSize, respectively.\n   *\n   *   If you want to use the charmap caching, call @FTC_CMapCache_New, then\n   *   later use @FTC_CMapCache_Lookup to perform the equivalent of\n   *   @FT_Get_Char_Index, only much faster.\n   *\n   *   If you want to use the @FT_Glyph caching, call @FTC_ImageCache, then\n   *   later use @FTC_ImageCache_Lookup to retrieve the corresponding\n   *   @FT_Glyph objects from the cache.\n   *\n   *   If you need lots of small bitmaps, it is much more memory efficient\n   *   to call @FTC_SBitCache_New followed by @FTC_SBitCache_Lookup.  This\n   *   returns @FTC_SBitRec structures, which are used to store small\n   *   bitmaps directly.  (A small bitmap is one whose metrics and\n   *   dimensions all fit into 8-bit integers).\n   *\n   *   We hope to also provide a kerning cache in the near future.\n   *\n   *\n   * <Order>\n   *   FTC_Manager\n   *   FTC_FaceID\n   *   FTC_Face_Requester\n   *\n   *   FTC_Manager_New\n   *   FTC_Manager_Reset\n   *   FTC_Manager_Done\n   *   FTC_Manager_LookupFace\n   *   FTC_Manager_LookupSize\n   *   FTC_Manager_RemoveFaceID\n   *\n   *   FTC_Node\n   *   FTC_Node_Unref\n   *\n   *   FTC_ImageCache\n   *   FTC_ImageCache_New\n   *   FTC_ImageCache_Lookup\n   *\n   *   FTC_SBit\n   *   FTC_SBitCache\n   *   FTC_SBitCache_New\n   *   FTC_SBitCache_Lookup\n   *\n   *   FTC_CMapCache\n   *   FTC_CMapCache_New\n   *   FTC_CMapCache_Lookup\n   *\n   *************************************************************************/\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    BASIC TYPE DEFINITIONS                     *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************\n   *\n   * @type: FTC_FaceID\n   *\n   * @description:\n   *   An opaque pointer type that is used to identity face objects.  The\n   *   contents of such objects is application-dependent.\n   *\n   *   These pointers are typically used to point to a user-defined\n   *   structure containing a font file path, and face index.\n   *\n   * @note:\n   *   Never use NULL as a valid @FTC_FaceID.\n   *\n   *   Face IDs are passed by the client to the cache manager, which calls,\n   *   when needed, the @FTC_Face_Requester to translate them into new\n   *   @FT_Face objects.\n   *\n   *   If the content of a given face ID changes at runtime, or if the value\n   *   becomes invalid (e.g., when uninstalling a font), you should\n   *   immediately call @FTC_Manager_RemoveFaceID before any other cache\n   *   function.\n   *\n   *   Failure to do so will result in incorrect behaviour or even\n   *   memory leaks and crashes.\n   */\n  typedef FT_Pointer  FTC_FaceID;\n\n\n  /************************************************************************\n   *\n   * @functype:\n   *   FTC_Face_Requester\n   *\n   * @description:\n   *   A callback function provided by client applications.  It is used by\n   *   the cache manager to translate a given @FTC_FaceID into a new valid\n   *   @FT_Face object, on demand.\n   *\n   * <Input>\n   *   face_id ::\n   *     The face ID to resolve.\n   *\n   *   library ::\n   *     A handle to a FreeType library object.\n   *\n   *   req_data ::\n   *     Application-provided request data (see note below).\n   *\n   * <Output>\n   *   aface ::\n   *     A new @FT_Face handle.\n   *\n   * <Return>\n   *   FreeType error code.  0~means success.\n   *\n   * <Note>\n   *   The third parameter `req_data' is the same as the one passed by the\n   *   client when @FTC_Manager_New is called.\n   *\n   *   The face requester should not perform funny things on the returned\n   *   face object, like creating a new @FT_Size for it, or setting a\n   *   transformation through @FT_Set_Transform!\n   */\n  typedef FT_Error\n  (*FTC_Face_Requester)( FTC_FaceID  face_id,\n                         FT_Library  library,\n                         FT_Pointer  request_data,\n                         FT_Face*    aface );\n\n /* */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      CACHE MANAGER OBJECT                     *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FTC_Manager                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This object corresponds to one instance of the cache-subsystem.    */\n  /*    It is used to cache one or more @FT_Face objects, along with       */\n  /*    corresponding @FT_Size objects.                                    */\n  /*                                                                       */\n  /*    The manager intentionally limits the total number of opened        */\n  /*    @FT_Face and @FT_Size objects to control memory usage.  See the    */\n  /*    `max_faces' and `max_sizes' parameters of @FTC_Manager_New.        */\n  /*                                                                       */\n  /*    The manager is also used to cache `nodes' of various types while   */\n  /*    limiting their total memory usage.                                 */\n  /*                                                                       */\n  /*    All limitations are enforced by keeping lists of managed objects   */\n  /*    in most-recently-used order, and flushing old nodes to make room   */\n  /*    for new ones.                                                      */\n  /*                                                                       */\n  typedef struct FTC_ManagerRec_*  FTC_Manager;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FTC_Node                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An opaque handle to a cache node object.  Each cache node is       */\n  /*    reference-counted.  A node with a count of~0 might be flushed      */\n  /*    out of a full cache whenever a lookup request is performed.        */\n  /*                                                                       */\n  /*    If you look up nodes, you have the ability to `acquire' them,      */\n  /*    i.e., to increment their reference count.  This will prevent the   */\n  /*    node from being flushed out of the cache until you explicitly      */\n  /*    `release' it (see @FTC_Node_Unref).                                */\n  /*                                                                       */\n  /*    See also @FTC_SBitCache_Lookup and @FTC_ImageCache_Lookup.         */\n  /*                                                                       */\n  typedef struct FTC_NodeRec_*  FTC_Node;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_Manager_New                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a new cache manager.                                        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library   :: The parent FreeType library handle to use.            */\n  /*                                                                       */\n  /*    max_faces :: Maximum number of opened @FT_Face objects managed by  */\n  /*                 this cache instance.  Use~0 for defaults.             */\n  /*                                                                       */\n  /*    max_sizes :: Maximum number of opened @FT_Size objects managed by  */\n  /*                 this cache instance.  Use~0 for defaults.             */\n  /*                                                                       */\n  /*    max_bytes :: Maximum number of bytes to use for cached data nodes. */\n  /*                 Use~0 for defaults.  Note that this value does not    */\n  /*                 account for managed @FT_Face and @FT_Size objects.    */\n  /*                                                                       */\n  /*    requester :: An application-provided callback used to translate    */\n  /*                 face IDs into real @FT_Face objects.                  */\n  /*                                                                       */\n  /*    req_data  :: A generic pointer that is passed to the requester     */\n  /*                 each time it is called (see @FTC_Face_Requester).     */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    amanager  :: A handle to a new manager object.  0~in case of       */\n  /*                 failure.                                              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_Manager_New( FT_Library          library,\n                   FT_UInt             max_faces,\n                   FT_UInt             max_sizes,\n                   FT_ULong            max_bytes,\n                   FTC_Face_Requester  requester,\n                   FT_Pointer          req_data,\n                   FTC_Manager        *amanager );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_Manager_Reset                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Empty a given cache manager.  This simply gets rid of all the      */\n  /*    currently cached @FT_Face and @FT_Size objects within the manager. */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    manager :: A handle to the manager.                                */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FTC_Manager_Reset( FTC_Manager  manager );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_Manager_Done                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Destroy a given manager after emptying it.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    manager :: A handle to the target cache manager object.            */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FTC_Manager_Done( FTC_Manager  manager );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_Manager_LookupFace                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the @FT_Face object that corresponds to a given face ID   */\n  /*    through a cache manager.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    manager :: A handle to the cache manager.                          */\n  /*                                                                       */\n  /*    face_id :: The ID of the face object.                              */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aface   :: A handle to the face object.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The returned @FT_Face object is always owned by the manager.  You  */\n  /*    should never try to discard it yourself.                           */\n  /*                                                                       */\n  /*    The @FT_Face object doesn't necessarily have a current size object */\n  /*    (i.e., face->size can be~0).  If you need a specific `font size',  */\n  /*    use @FTC_Manager_LookupSize instead.                               */\n  /*                                                                       */\n  /*    Never change the face's transformation matrix (i.e., never call    */\n  /*    the @FT_Set_Transform function) on a returned face!  If you need   */\n  /*    to transform glyphs, do it yourself after glyph loading.           */\n  /*                                                                       */\n  /*    When you perform a lookup, out-of-memory errors are detected       */\n  /*    _within_ the lookup and force incremental flushes of the cache     */\n  /*    until enough memory is released for the lookup to succeed.         */\n  /*                                                                       */\n  /*    If a lookup fails with `FT_Err_Out_Of_Memory' the cache has        */\n  /*    already been completely flushed, and still no memory was available */\n  /*    for the operation.                                                 */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_Manager_LookupFace( FTC_Manager  manager,\n                          FTC_FaceID   face_id,\n                          FT_Face     *aface );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FTC_ScalerRec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to describe a given character size in either      */\n  /*    pixels or points to the cache manager.  See                        */\n  /*    @FTC_Manager_LookupSize.                                           */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    face_id :: The source face ID.                                     */\n  /*                                                                       */\n  /*    width   :: The character width.                                    */\n  /*                                                                       */\n  /*    height  :: The character height.                                   */\n  /*                                                                       */\n  /*    pixel   :: A Boolean.  If 1, the `width' and `height' fields are   */\n  /*               interpreted as integer pixel character sizes.           */\n  /*               Otherwise, they are expressed as 1/64th of points.      */\n  /*                                                                       */\n  /*    x_res   :: Only used when `pixel' is value~0 to indicate the       */\n  /*               horizontal resolution in dpi.                           */\n  /*                                                                       */\n  /*    y_res   :: Only used when `pixel' is value~0 to indicate the       */\n  /*               vertical resolution in dpi.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This type is mainly used to retrieve @FT_Size objects through the  */\n  /*    cache manager.                                                     */\n  /*                                                                       */\n  typedef struct  FTC_ScalerRec_\n  {\n    FTC_FaceID  face_id;\n    FT_UInt     width;\n    FT_UInt     height;\n    FT_Int      pixel;\n    FT_UInt     x_res;\n    FT_UInt     y_res;\n\n  } FTC_ScalerRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FTC_Scaler                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to an @FTC_ScalerRec structure.                           */\n  /*                                                                       */\n  typedef struct FTC_ScalerRec_*  FTC_Scaler;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_Manager_LookupSize                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the @FT_Size object that corresponds to a given           */\n  /*    @FTC_ScalerRec pointer through a cache manager.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    manager :: A handle to the cache manager.                          */\n  /*                                                                       */\n  /*    scaler  :: A scaler handle.                                        */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    asize   :: A handle to the size object.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The returned @FT_Size object is always owned by the manager.  You  */\n  /*    should never try to discard it by yourself.                        */\n  /*                                                                       */\n  /*    You can access the parent @FT_Face object simply as `size->face'   */\n  /*    if you need it.  Note that this object is also owned by the        */\n  /*    manager.                                                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    When you perform a lookup, out-of-memory errors are detected       */\n  /*    _within_ the lookup and force incremental flushes of the cache     */\n  /*    until enough memory is released for the lookup to succeed.         */\n  /*                                                                       */\n  /*    If a lookup fails with `FT_Err_Out_Of_Memory' the cache has        */\n  /*    already been completely flushed, and still no memory is available  */\n  /*    for the operation.                                                 */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_Manager_LookupSize( FTC_Manager  manager,\n                          FTC_Scaler   scaler,\n                          FT_Size     *asize );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_Node_Unref                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Decrement a cache node's internal reference count.  When the count */\n  /*    reaches 0, it is not destroyed but becomes eligible for subsequent */\n  /*    cache flushes.                                                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    node    :: The cache node handle.                                  */\n  /*                                                                       */\n  /*    manager :: The cache manager handle.                               */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FTC_Node_Unref( FTC_Node     node,\n                  FTC_Manager  manager );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FTC_Manager_RemoveFaceID\n   *\n   * @description:\n   *   A special function used to indicate to the cache manager that\n   *   a given @FTC_FaceID is no longer valid, either because its\n   *   content changed, or because it was deallocated or uninstalled.\n   *\n   * @input:\n   *   manager ::\n   *     The cache manager handle.\n   *\n   *   face_id ::\n   *     The @FTC_FaceID to be removed.\n   *\n   * @note:\n   *   This function flushes all nodes from the cache corresponding to this\n   *   `face_id', with the exception of nodes with a non-null reference\n   *   count.\n   *\n   *   Such nodes are however modified internally so as to never appear\n   *   in later lookups with the same `face_id' value, and to be immediately\n   *   destroyed when released by all their users.\n   *\n   */\n  FT_EXPORT( void )\n  FTC_Manager_RemoveFaceID( FTC_Manager  manager,\n                            FTC_FaceID   face_id );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    cache_subsystem                                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n  /*************************************************************************\n   *\n   * @type:\n   *   FTC_CMapCache\n   *\n   * @description:\n   *   An opaque handle used to model a charmap cache.  This cache is to\n   *   hold character codes -> glyph indices mappings.\n   *\n   */\n  typedef struct FTC_CMapCacheRec_*  FTC_CMapCache;\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FTC_CMapCache_New\n   *\n   * @description:\n   *   Create a new charmap cache.\n   *\n   * @input:\n   *   manager ::\n   *     A handle to the cache manager.\n   *\n   * @output:\n   *   acache ::\n   *     A new cache handle.  NULL in case of error.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   Like all other caches, this one will be destroyed with the cache\n   *   manager.\n   *\n   */\n  FT_EXPORT( FT_Error )\n  FTC_CMapCache_New( FTC_Manager     manager,\n                     FTC_CMapCache  *acache );\n\n\n  /************************************************************************\n   *\n   * @function:\n   *   FTC_CMapCache_Lookup\n   *\n   * @description:\n   *   Translate a character code into a glyph index, using the charmap\n   *   cache.\n   *\n   * @input:\n   *   cache ::\n   *     A charmap cache handle.\n   *\n   *   face_id ::\n   *     The source face ID.\n   *\n   *   cmap_index ::\n   *     The index of the charmap in the source face.  Any negative value\n   *     means to use the cache @FT_Face's default charmap.\n   *\n   *   char_code ::\n   *     The character code (in the corresponding charmap).\n   *\n   * @return:\n   *    Glyph index.  0~means `no glyph'.\n   *\n   */\n  FT_EXPORT( FT_UInt )\n  FTC_CMapCache_Lookup( FTC_CMapCache  cache,\n                        FTC_FaceID     face_id,\n                        FT_Int         cmap_index,\n                        FT_UInt32      char_code );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    cache_subsystem                                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                       IMAGE CACHE OBJECT                      *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************\n   *\n   * @struct:\n   *   FTC_ImageTypeRec\n   *\n   * @description:\n   *   A structure used to model the type of images in a glyph cache.\n   *\n   * @fields:\n   *   face_id ::\n   *     The face ID.\n   *\n   *   width ::\n   *     The width in pixels.\n   *\n   *   height ::\n   *     The height in pixels.\n   *\n   *   flags ::\n   *     The load flags, as in @FT_Load_Glyph.\n   *\n   */\n  typedef struct  FTC_ImageTypeRec_\n  {\n    FTC_FaceID  face_id;\n    FT_Int      width;\n    FT_Int      height;\n    FT_Int32    flags;\n\n  } FTC_ImageTypeRec;\n\n\n  /*************************************************************************\n   *\n   * @type:\n   *   FTC_ImageType\n   *\n   * @description:\n   *   A handle to an @FTC_ImageTypeRec structure.\n   *\n   */\n  typedef struct FTC_ImageTypeRec_*  FTC_ImageType;\n\n\n  /* */\n\n\n#define FTC_IMAGE_TYPE_COMPARE( d1, d2 )      \\\n          ( (d1)->face_id == (d2)->face_id && \\\n            (d1)->width   == (d2)->width   && \\\n            (d1)->flags   == (d2)->flags   )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FTC_ImageCache                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a glyph image cache object.  They are designed to      */\n  /*    hold many distinct glyph images while not exceeding a certain      */\n  /*    memory threshold.                                                  */\n  /*                                                                       */\n  typedef struct FTC_ImageCacheRec_*  FTC_ImageCache;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_ImageCache_New                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a new glyph image cache.                                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    manager :: The parent manager for the image cache.                 */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    acache  :: A handle to the new glyph image cache object.           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_ImageCache_New( FTC_Manager      manager,\n                      FTC_ImageCache  *acache );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_ImageCache_Lookup                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve a given glyph image from a glyph image cache.             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    cache  :: A handle to the source glyph image cache.                */\n  /*                                                                       */\n  /*    type   :: A pointer to a glyph image type descriptor.              */\n  /*                                                                       */\n  /*    gindex :: The glyph index to retrieve.                             */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aglyph :: The corresponding @FT_Glyph object.  0~in case of        */\n  /*              failure.                                                 */\n  /*                                                                       */\n  /*    anode  :: Used to return the address of of the corresponding cache */\n  /*              node after incrementing its reference count (see note    */\n  /*              below).                                                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The returned glyph is owned and managed by the glyph image cache.  */\n  /*    Never try to transform or discard it manually!  You can however    */\n  /*    create a copy with @FT_Glyph_Copy and modify the new one.          */\n  /*                                                                       */\n  /*    If `anode' is _not_ NULL, it receives the address of the cache     */\n  /*    node containing the glyph image, after increasing its reference    */\n  /*    count.  This ensures that the node (as well as the @FT_Glyph) will */\n  /*    always be kept in the cache until you call @FTC_Node_Unref to      */\n  /*    `release' it.                                                      */\n  /*                                                                       */\n  /*    If `anode' is NULL, the cache node is left unchanged, which means  */\n  /*    that the @FT_Glyph could be flushed out of the cache on the next   */\n  /*    call to one of the caching sub-system APIs.  Don't assume that it  */\n  /*    is persistent!                                                     */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_ImageCache_Lookup( FTC_ImageCache  cache,\n                         FTC_ImageType   type,\n                         FT_UInt         gindex,\n                         FT_Glyph       *aglyph,\n                         FTC_Node       *anode );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_ImageCache_LookupScaler                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A variant of @FTC_ImageCache_Lookup that uses an @FTC_ScalerRec    */\n  /*    to specify the face ID and its size.                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    cache      :: A handle to the source glyph image cache.            */\n  /*                                                                       */\n  /*    scaler     :: A pointer to a scaler descriptor.                    */\n  /*                                                                       */\n  /*    load_flags :: The corresponding load flags.                        */\n  /*                                                                       */\n  /*    gindex     :: The glyph index to retrieve.                         */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aglyph     :: The corresponding @FT_Glyph object.  0~in case of    */\n  /*                  failure.                                             */\n  /*                                                                       */\n  /*    anode      :: Used to return the address of of the corresponding   */\n  /*                  cache node after incrementing its reference count    */\n  /*                  (see note below).                                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The returned glyph is owned and managed by the glyph image cache.  */\n  /*    Never try to transform or discard it manually!  You can however    */\n  /*    create a copy with @FT_Glyph_Copy and modify the new one.          */\n  /*                                                                       */\n  /*    If `anode' is _not_ NULL, it receives the address of the cache     */\n  /*    node containing the glyph image, after increasing its reference    */\n  /*    count.  This ensures that the node (as well as the @FT_Glyph) will */\n  /*    always be kept in the cache until you call @FTC_Node_Unref to      */\n  /*    `release' it.                                                      */\n  /*                                                                       */\n  /*    If `anode' is NULL, the cache node is left unchanged, which means  */\n  /*    that the @FT_Glyph could be flushed out of the cache on the next   */\n  /*    call to one of the caching sub-system APIs.  Don't assume that it  */\n  /*    is persistent!                                                     */\n  /*                                                                       */\n  /*    Calls to @FT_Set_Char_Size and friends have no effect on cached    */\n  /*    glyphs; you should always use the FreeType cache API instead.      */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_ImageCache_LookupScaler( FTC_ImageCache  cache,\n                               FTC_Scaler      scaler,\n                               FT_ULong        load_flags,\n                               FT_UInt         gindex,\n                               FT_Glyph       *aglyph,\n                               FTC_Node       *anode );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FTC_SBit                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a small bitmap descriptor.  See the @FTC_SBitRec       */\n  /*    structure for details.                                             */\n  /*                                                                       */\n  typedef struct FTC_SBitRec_*  FTC_SBit;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FTC_SBitRec                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A very compact structure used to describe a small glyph bitmap.    */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    width     :: The bitmap width in pixels.                           */\n  /*                                                                       */\n  /*    height    :: The bitmap height in pixels.                          */\n  /*                                                                       */\n  /*    left      :: The horizontal distance from the pen position to the  */\n  /*                 left bitmap border (a.k.a. `left side bearing', or    */\n  /*                 `lsb').                                               */\n  /*                                                                       */\n  /*    top       :: The vertical distance from the pen position (on the   */\n  /*                 baseline) to the upper bitmap border (a.k.a. `top     */\n  /*                 side bearing').  The distance is positive for upwards */\n  /*                 y~coordinates.                                        */\n  /*                                                                       */\n  /*    format    :: The format of the glyph bitmap (monochrome or gray).  */\n  /*                                                                       */\n  /*    max_grays :: Maximum gray level value (in the range 1 to~255).     */\n  /*                                                                       */\n  /*    pitch     :: The number of bytes per bitmap line.  May be positive */\n  /*                 or negative.                                          */\n  /*                                                                       */\n  /*    xadvance  :: The horizontal advance width in pixels.               */\n  /*                                                                       */\n  /*    yadvance  :: The vertical advance height in pixels.                */\n  /*                                                                       */\n  /*    buffer    :: A pointer to the bitmap pixels.                       */\n  /*                                                                       */\n  typedef struct  FTC_SBitRec_\n  {\n    FT_Byte   width;\n    FT_Byte   height;\n    FT_Char   left;\n    FT_Char   top;\n\n    FT_Byte   format;\n    FT_Byte   max_grays;\n    FT_Short  pitch;\n    FT_Char   xadvance;\n    FT_Char   yadvance;\n\n    FT_Byte*  buffer;\n\n  } FTC_SBitRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FTC_SBitCache                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a small bitmap cache.  These are special cache objects */\n  /*    used to store small glyph bitmaps (and anti-aliased pixmaps) in a  */\n  /*    much more efficient way than the traditional glyph image cache     */\n  /*    implemented by @FTC_ImageCache.                                    */\n  /*                                                                       */\n  typedef struct FTC_SBitCacheRec_*  FTC_SBitCache;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_SBitCache_New                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a new cache to store small glyph bitmaps.                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    manager :: A handle to the source cache manager.                   */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    acache  :: A handle to the new sbit cache.  NULL in case of error. */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_SBitCache_New( FTC_Manager     manager,\n                     FTC_SBitCache  *acache );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_SBitCache_Lookup                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Look up a given small glyph bitmap in a given sbit cache and       */\n  /*    `lock' it to prevent its flushing from the cache until needed.     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    cache  :: A handle to the source sbit cache.                       */\n  /*                                                                       */\n  /*    type   :: A pointer to the glyph image type descriptor.            */\n  /*                                                                       */\n  /*    gindex :: The glyph index.                                         */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    sbit   :: A handle to a small bitmap descriptor.                   */\n  /*                                                                       */\n  /*    anode  :: Used to return the address of of the corresponding cache */\n  /*              node after incrementing its reference count (see note    */\n  /*              below).                                                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The small bitmap descriptor and its bit buffer are owned by the    */\n  /*    cache and should never be freed by the application.  They might    */\n  /*    as well disappear from memory on the next cache lookup, so don't   */\n  /*    treat them as persistent data.                                     */\n  /*                                                                       */\n  /*    The descriptor's `buffer' field is set to~0 to indicate a missing  */\n  /*    glyph bitmap.                                                      */\n  /*                                                                       */\n  /*    If `anode' is _not_ NULL, it receives the address of the cache     */\n  /*    node containing the bitmap, after increasing its reference count.  */\n  /*    This ensures that the node (as well as the image) will always be   */\n  /*    kept in the cache until you call @FTC_Node_Unref to `release' it.  */\n  /*                                                                       */\n  /*    If `anode' is NULL, the cache node is left unchanged, which means  */\n  /*    that the bitmap could be flushed out of the cache on the next      */\n  /*    call to one of the caching sub-system APIs.  Don't assume that it  */\n  /*    is persistent!                                                     */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_SBitCache_Lookup( FTC_SBitCache    cache,\n                        FTC_ImageType    type,\n                        FT_UInt          gindex,\n                        FTC_SBit        *sbit,\n                        FTC_Node        *anode );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_SBitCache_LookupScaler                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A variant of @FTC_SBitCache_Lookup that uses an @FTC_ScalerRec     */\n  /*    to specify the face ID and its size.                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    cache      :: A handle to the source sbit cache.                   */\n  /*                                                                       */\n  /*    scaler     :: A pointer to the scaler descriptor.                  */\n  /*                                                                       */\n  /*    load_flags :: The corresponding load flags.                        */\n  /*                                                                       */\n  /*    gindex     :: The glyph index.                                     */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    sbit       :: A handle to a small bitmap descriptor.               */\n  /*                                                                       */\n  /*    anode      :: Used to return the address of of the corresponding   */\n  /*                  cache node after incrementing its reference count    */\n  /*                  (see note below).                                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The small bitmap descriptor and its bit buffer are owned by the    */\n  /*    cache and should never be freed by the application.  They might    */\n  /*    as well disappear from memory on the next cache lookup, so don't   */\n  /*    treat them as persistent data.                                     */\n  /*                                                                       */\n  /*    The descriptor's `buffer' field is set to~0 to indicate a missing  */\n  /*    glyph bitmap.                                                      */\n  /*                                                                       */\n  /*    If `anode' is _not_ NULL, it receives the address of the cache     */\n  /*    node containing the bitmap, after increasing its reference count.  */\n  /*    This ensures that the node (as well as the image) will always be   */\n  /*    kept in the cache until you call @FTC_Node_Unref to `release' it.  */\n  /*                                                                       */\n  /*    If `anode' is NULL, the cache node is left unchanged, which means  */\n  /*    that the bitmap could be flushed out of the cache on the next      */\n  /*    call to one of the caching sub-system APIs.  Don't assume that it  */\n  /*    is persistent!                                                     */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_SBitCache_LookupScaler( FTC_SBitCache  cache,\n                              FTC_Scaler     scaler,\n                              FT_ULong       load_flags,\n                              FT_UInt        gindex,\n                              FTC_SBit      *sbit,\n                              FTC_Node      *anode );\n\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FTCACHE_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftcffdrv.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcffdrv.h                                                             */\n/*                                                                         */\n/*    FreeType API for controlling the CFF driver (specification only).    */\n/*                                                                         */\n/*  Copyright 2013 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTCFFDRV_H__\n#define __FTCFFDRV_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /**************************************************************************\n   *\n   * @section:\n   *   cff_driver\n   *\n   * @title:\n   *   The CFF driver\n   *\n   * @abstract:\n   *   Controlling the CFF driver module.\n   *\n   * @description:\n   *   While FreeType's CFF driver doesn't expose API functions by itself,\n   *   it is possible to control its behaviour with @FT_Property_Set and\n   *   @FT_Property_Get.  The following lists the available properties\n   *   together with the necessary macros and structures.\n   *\n   *   The CFF driver's module name is `cff'.\n   *\n   */\n\n\n  /**************************************************************************\n   *\n   * @property:\n   *   hinting-engine\n   *\n   * @description:\n   *   Thanks to Adobe, which contributed a new hinting (and parsing)\n   *   engine, an application can select between `freetype' and `adobe' if\n   *   compiled with CFF_CONFIG_OPTION_OLD_ENGINE.  If this configuration\n   *   macro isn't defined, `hinting-engine' does nothing.\n   *\n   *   The default engine is `freetype' if CFF_CONFIG_OPTION_OLD_ENGINE is\n   *   defined, and `adobe' otherwise.\n   *\n   *   The following example code demonstrates how to select Adobe's hinting\n   *   engine (omitting the error handling).\n   *\n   *   {\n   *     FT_Library  library;\n   *     FT_Face     face;\n   *     FT_UInt     hinting_engine = FT_CFF_HINTING_ADOBE;\n   *\n   *\n   *     FT_Init_FreeType( &library );\n   *\n   *     FT_Property_Set( library, \"cff\",\n   *                               \"hinting-engine\", &hinting_engine );\n   *   }\n   *\n   * @note:\n   *   This property can be used with @FT_Property_Get also.\n   *\n   */\n\n\n  /**************************************************************************\n   *\n   * @enum:\n   *   FT_CFF_HINTING_XXX\n   *\n   * @description:\n   *   A list of constants used for the @hinting-engine property to select\n   *   the hinting engine for CFF fonts.\n   *\n   * @values:\n   *   FT_CFF_HINTING_FREETYPE ::\n   *     Use the old FreeType hinting engine.\n   *\n   *   FT_CFF_HINTING_ADOBE ::\n   *     Use the hinting engine contributed by Adobe.\n   *\n   */\n#define FT_CFF_HINTING_FREETYPE  0\n#define FT_CFF_HINTING_ADOBE     1\n\n\n  /**************************************************************************\n   *\n   * @property:\n   *   no-stem-darkening\n   *\n   * @description:\n   *   By default, the Adobe CFF engine darkens stems at smaller sizes,\n   *   regardless of hinting, to enhance contrast.  Setting this property,\n   *   stem darkening gets switched off.\n   *\n   *   Note that stem darkening is never applied if @FT_LOAD_NO_SCALE is set.\n   *\n   *   {\n   *     FT_Library  library;\n   *     FT_Face     face;\n   *     FT_Bool     no_stem_darkening = TRUE;\n   *\n   *\n   *     FT_Init_FreeType( &library );\n   *\n   *     FT_Property_Set( library, \"cff\",\n   *                               \"no-stem-darkening\", &no_stem_darkening );\n   *   }\n   *\n   * @note:\n   *   This property can be used with @FT_Property_Get also.\n   *\n   */\n\n\n /* */\n\nFT_END_HEADER\n\n\n#endif /* __FTCFFDRV_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftcid.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcid.h                                                                */\n/*                                                                         */\n/*    FreeType API for accessing CID font information (specification).     */\n/*                                                                         */\n/*  Copyright 2007, 2009 by Dereg Clegg, Michael Toftdal.                  */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTCID_H__\n#define __FTCID_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    cid_fonts                                                          */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    CID Fonts                                                          */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    CID-keyed font specific API.                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of CID-keyed font specific   */\n  /*    functions.                                                         */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /**********************************************************************\n   *\n   * @function:\n   *    FT_Get_CID_Registry_Ordering_Supplement\n   *\n   * @description:\n   *    Retrieve the Registry/Ordering/Supplement triple (also known as the\n   *    \"R/O/S\") from a CID-keyed font.\n   *\n   * @input:\n   *    face ::\n   *       A handle to the input face.\n   *\n   * @output:\n   *    registry ::\n   *       The registry, as a C~string, owned by the face.\n   *\n   *    ordering ::\n   *       The ordering, as a C~string, owned by the face.\n   *\n   *    supplement ::\n   *       The supplement.\n   *\n   * @return:\n   *    FreeType error code.  0~means success.\n   *\n   * @note:\n   *    This function only works with CID faces, returning an error\n   *    otherwise.\n   *\n   * @since:\n   *    2.3.6\n   */\n  FT_EXPORT( FT_Error )\n  FT_Get_CID_Registry_Ordering_Supplement( FT_Face       face,\n                                           const char*  *registry,\n                                           const char*  *ordering,\n                                           FT_Int       *supplement);\n\n\n  /**********************************************************************\n   *\n   * @function:\n   *    FT_Get_CID_Is_Internally_CID_Keyed\n   *\n   * @description:\n   *    Retrieve the type of the input face, CID keyed or not.  In\n   *    constrast to the @FT_IS_CID_KEYED macro this function returns\n   *    successfully also for CID-keyed fonts in an SNFT wrapper.\n   *\n   * @input:\n   *    face ::\n   *       A handle to the input face.\n   *\n   * @output:\n   *    is_cid ::\n   *       The type of the face as an @FT_Bool.\n   *\n   * @return:\n   *    FreeType error code.  0~means success.\n   *\n   * @note:\n   *    This function only works with CID faces and OpenType fonts,\n   *    returning an error otherwise.\n   *\n   * @since:\n   *    2.3.9\n   */\n  FT_EXPORT( FT_Error )\n  FT_Get_CID_Is_Internally_CID_Keyed( FT_Face   face,\n                                      FT_Bool  *is_cid );\n\n\n  /**********************************************************************\n   *\n   * @function:\n   *    FT_Get_CID_From_Glyph_Index\n   *\n   * @description:\n   *    Retrieve the CID of the input glyph index.\n   *\n   * @input:\n   *    face ::\n   *       A handle to the input face.\n   *\n   *    glyph_index ::\n   *       The input glyph index.\n   *\n   * @output:\n   *    cid ::\n   *       The CID as an @FT_UInt.\n   *\n   * @return:\n   *    FreeType error code.  0~means success.\n   *\n   * @note:\n   *    This function only works with CID faces and OpenType fonts,\n   *    returning an error otherwise.\n   *\n   * @since:\n   *    2.3.9\n   */\n  FT_EXPORT( FT_Error )\n  FT_Get_CID_From_Glyph_Index( FT_Face   face,\n                               FT_UInt   glyph_index,\n                               FT_UInt  *cid );\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FTCID_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/fterrdef.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  fterrdef.h                                                             */\n/*                                                                         */\n/*    FreeType error codes (specification).                                */\n/*                                                                         */\n/*  Copyright 2002, 2004, 2006, 2007, 2010-2013 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*******************************************************************/\n  /*******************************************************************/\n  /*****                                                         *****/\n  /*****                LIST OF ERROR CODES/MESSAGES             *****/\n  /*****                                                         *****/\n  /*******************************************************************/\n  /*******************************************************************/\n\n\n  /* You need to define both FT_ERRORDEF_ and FT_NOERRORDEF_ before */\n  /* including this file.                                           */\n\n\n  /* generic errors */\n\n  FT_NOERRORDEF_( Ok,                                        0x00, \\\n                  \"no error\" )\n\n  FT_ERRORDEF_( Cannot_Open_Resource,                        0x01, \\\n                \"cannot open resource\" )\n  FT_ERRORDEF_( Unknown_File_Format,                         0x02, \\\n                \"unknown file format\" )\n  FT_ERRORDEF_( Invalid_File_Format,                         0x03, \\\n                \"broken file\" )\n  FT_ERRORDEF_( Invalid_Version,                             0x04, \\\n                \"invalid FreeType version\" )\n  FT_ERRORDEF_( Lower_Module_Version,                        0x05, \\\n                \"module version is too low\" )\n  FT_ERRORDEF_( Invalid_Argument,                            0x06, \\\n                \"invalid argument\" )\n  FT_ERRORDEF_( Unimplemented_Feature,                       0x07, \\\n                \"unimplemented feature\" )\n  FT_ERRORDEF_( Invalid_Table,                               0x08, \\\n                \"broken table\" )\n  FT_ERRORDEF_( Invalid_Offset,                              0x09, \\\n                \"broken offset within table\" )\n  FT_ERRORDEF_( Array_Too_Large,                             0x0A, \\\n                \"array allocation size too large\" )\n  FT_ERRORDEF_( Missing_Module,                              0x0B, \\\n                \"missing module\" )\n  FT_ERRORDEF_( Missing_Property,                            0x0C, \\\n                \"missing property\" )\n\n  /* glyph/character errors */\n\n  FT_ERRORDEF_( Invalid_Glyph_Index,                         0x10, \\\n                \"invalid glyph index\" )\n  FT_ERRORDEF_( Invalid_Character_Code,                      0x11, \\\n                \"invalid character code\" )\n  FT_ERRORDEF_( Invalid_Glyph_Format,                        0x12, \\\n                \"unsupported glyph image format\" )\n  FT_ERRORDEF_( Cannot_Render_Glyph,                         0x13, \\\n                \"cannot render this glyph format\" )\n  FT_ERRORDEF_( Invalid_Outline,                             0x14, \\\n                \"invalid outline\" )\n  FT_ERRORDEF_( Invalid_Composite,                           0x15, \\\n                \"invalid composite glyph\" )\n  FT_ERRORDEF_( Too_Many_Hints,                              0x16, \\\n                \"too many hints\" )\n  FT_ERRORDEF_( Invalid_Pixel_Size,                          0x17, \\\n                \"invalid pixel size\" )\n\n  /* handle errors */\n\n  FT_ERRORDEF_( Invalid_Handle,                              0x20, \\\n                \"invalid object handle\" )\n  FT_ERRORDEF_( Invalid_Library_Handle,                      0x21, \\\n                \"invalid library handle\" )\n  FT_ERRORDEF_( Invalid_Driver_Handle,                       0x22, \\\n                \"invalid module handle\" )\n  FT_ERRORDEF_( Invalid_Face_Handle,                         0x23, \\\n                \"invalid face handle\" )\n  FT_ERRORDEF_( Invalid_Size_Handle,                         0x24, \\\n                \"invalid size handle\" )\n  FT_ERRORDEF_( Invalid_Slot_Handle,                         0x25, \\\n                \"invalid glyph slot handle\" )\n  FT_ERRORDEF_( Invalid_CharMap_Handle,                      0x26, \\\n                \"invalid charmap handle\" )\n  FT_ERRORDEF_( Invalid_Cache_Handle,                        0x27, \\\n                \"invalid cache manager handle\" )\n  FT_ERRORDEF_( Invalid_Stream_Handle,                       0x28, \\\n                \"invalid stream handle\" )\n\n  /* driver errors */\n\n  FT_ERRORDEF_( Too_Many_Drivers,                            0x30, \\\n                \"too many modules\" )\n  FT_ERRORDEF_( Too_Many_Extensions,                         0x31, \\\n                \"too many extensions\" )\n\n  /* memory errors */\n\n  FT_ERRORDEF_( Out_Of_Memory,                               0x40, \\\n                \"out of memory\" )\n  FT_ERRORDEF_( Unlisted_Object,                             0x41, \\\n                \"unlisted object\" )\n\n  /* stream errors */\n\n  FT_ERRORDEF_( Cannot_Open_Stream,                          0x51, \\\n                \"cannot open stream\" )\n  FT_ERRORDEF_( Invalid_Stream_Seek,                         0x52, \\\n                \"invalid stream seek\" )\n  FT_ERRORDEF_( Invalid_Stream_Skip,                         0x53, \\\n                \"invalid stream skip\" )\n  FT_ERRORDEF_( Invalid_Stream_Read,                         0x54, \\\n                \"invalid stream read\" )\n  FT_ERRORDEF_( Invalid_Stream_Operation,                    0x55, \\\n                \"invalid stream operation\" )\n  FT_ERRORDEF_( Invalid_Frame_Operation,                     0x56, \\\n                \"invalid frame operation\" )\n  FT_ERRORDEF_( Nested_Frame_Access,                         0x57, \\\n                \"nested frame access\" )\n  FT_ERRORDEF_( Invalid_Frame_Read,                          0x58, \\\n                \"invalid frame read\" )\n\n  /* raster errors */\n\n  FT_ERRORDEF_( Raster_Uninitialized,                        0x60, \\\n                \"raster uninitialized\" )\n  FT_ERRORDEF_( Raster_Corrupted,                            0x61, \\\n                \"raster corrupted\" )\n  FT_ERRORDEF_( Raster_Overflow,                             0x62, \\\n                \"raster overflow\" )\n  FT_ERRORDEF_( Raster_Negative_Height,                      0x63, \\\n                \"negative height while rastering\" )\n\n  /* cache errors */\n\n  FT_ERRORDEF_( Too_Many_Caches,                             0x70, \\\n                \"too many registered caches\" )\n\n  /* TrueType and SFNT errors */\n\n  FT_ERRORDEF_( Invalid_Opcode,                              0x80, \\\n                \"invalid opcode\" )\n  FT_ERRORDEF_( Too_Few_Arguments,                           0x81, \\\n                \"too few arguments\" )\n  FT_ERRORDEF_( Stack_Overflow,                              0x82, \\\n                \"stack overflow\" )\n  FT_ERRORDEF_( Code_Overflow,                               0x83, \\\n                \"code overflow\" )\n  FT_ERRORDEF_( Bad_Argument,                                0x84, \\\n                \"bad argument\" )\n  FT_ERRORDEF_( Divide_By_Zero,                              0x85, \\\n                \"division by zero\" )\n  FT_ERRORDEF_( Invalid_Reference,                           0x86, \\\n                \"invalid reference\" )\n  FT_ERRORDEF_( Debug_OpCode,                                0x87, \\\n                \"found debug opcode\" )\n  FT_ERRORDEF_( ENDF_In_Exec_Stream,                         0x88, \\\n                \"found ENDF opcode in execution stream\" )\n  FT_ERRORDEF_( Nested_DEFS,                                 0x89, \\\n                \"nested DEFS\" )\n  FT_ERRORDEF_( Invalid_CodeRange,                           0x8A, \\\n                \"invalid code range\" )\n  FT_ERRORDEF_( Execution_Too_Long,                          0x8B, \\\n                \"execution context too long\" )\n  FT_ERRORDEF_( Too_Many_Function_Defs,                      0x8C, \\\n                \"too many function definitions\" )\n  FT_ERRORDEF_( Too_Many_Instruction_Defs,                   0x8D, \\\n                \"too many instruction definitions\" )\n  FT_ERRORDEF_( Table_Missing,                               0x8E, \\\n                \"SFNT font table missing\" )\n  FT_ERRORDEF_( Horiz_Header_Missing,                        0x8F, \\\n                \"horizontal header (hhea) table missing\" )\n  FT_ERRORDEF_( Locations_Missing,                           0x90, \\\n                \"locations (loca) table missing\" )\n  FT_ERRORDEF_( Name_Table_Missing,                          0x91, \\\n                \"name table missing\" )\n  FT_ERRORDEF_( CMap_Table_Missing,                          0x92, \\\n                \"character map (cmap) table missing\" )\n  FT_ERRORDEF_( Hmtx_Table_Missing,                          0x93, \\\n                \"horizontal metrics (hmtx) table missing\" )\n  FT_ERRORDEF_( Post_Table_Missing,                          0x94, \\\n                \"PostScript (post) table missing\" )\n  FT_ERRORDEF_( Invalid_Horiz_Metrics,                       0x95, \\\n                \"invalid horizontal metrics\" )\n  FT_ERRORDEF_( Invalid_CharMap_Format,                      0x96, \\\n                \"invalid character map (cmap) format\" )\n  FT_ERRORDEF_( Invalid_PPem,                                0x97, \\\n                \"invalid ppem value\" )\n  FT_ERRORDEF_( Invalid_Vert_Metrics,                        0x98, \\\n                \"invalid vertical metrics\" )\n  FT_ERRORDEF_( Could_Not_Find_Context,                      0x99, \\\n                \"could not find context\" )\n  FT_ERRORDEF_( Invalid_Post_Table_Format,                   0x9A, \\\n                \"invalid PostScript (post) table format\" )\n  FT_ERRORDEF_( Invalid_Post_Table,                          0x9B, \\\n                \"invalid PostScript (post) table\" )\n\n  /* CFF, CID, and Type 1 errors */\n\n  FT_ERRORDEF_( Syntax_Error,                                0xA0, \\\n                \"opcode syntax error\" )\n  FT_ERRORDEF_( Stack_Underflow,                             0xA1, \\\n                \"argument stack underflow\" )\n  FT_ERRORDEF_( Ignore,                                      0xA2, \\\n                \"ignore\" )\n  FT_ERRORDEF_( No_Unicode_Glyph_Name,                       0xA3, \\\n                \"no Unicode glyph name found\" )\n  FT_ERRORDEF_( Glyph_Too_Big,                               0xA4, \\\n                \"glyph to big for hinting\" )\n\n  /* BDF errors */\n\n  FT_ERRORDEF_( Missing_Startfont_Field,                     0xB0, \\\n                \"`STARTFONT' field missing\" )\n  FT_ERRORDEF_( Missing_Font_Field,                          0xB1, \\\n                \"`FONT' field missing\" )\n  FT_ERRORDEF_( Missing_Size_Field,                          0xB2, \\\n                \"`SIZE' field missing\" )\n  FT_ERRORDEF_( Missing_Fontboundingbox_Field,               0xB3, \\\n                \"`FONTBOUNDINGBOX' field missing\" )\n  FT_ERRORDEF_( Missing_Chars_Field,                         0xB4, \\\n                \"`CHARS' field missing\" )\n  FT_ERRORDEF_( Missing_Startchar_Field,                     0xB5, \\\n                \"`STARTCHAR' field missing\" )\n  FT_ERRORDEF_( Missing_Encoding_Field,                      0xB6, \\\n                \"`ENCODING' field missing\" )\n  FT_ERRORDEF_( Missing_Bbx_Field,                           0xB7, \\\n                \"`BBX' field missing\" )\n  FT_ERRORDEF_( Bbx_Too_Big,                                 0xB8, \\\n                \"`BBX' too big\" )\n  FT_ERRORDEF_( Corrupted_Font_Header,                       0xB9, \\\n                \"Font header corrupted or missing fields\" )\n  FT_ERRORDEF_( Corrupted_Font_Glyphs,                       0xBA, \\\n                \"Font glyphs corrupted or missing fields\" )\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/fterrors.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  fterrors.h                                                             */\n/*                                                                         */\n/*    FreeType error code handling (specification).                        */\n/*                                                                         */\n/*  Copyright 1996-2002, 2004, 2007, 2013 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This special header file is used to define the handling of FT2        */\n  /* enumeration constants.  It can also be used to generate error message */\n  /* strings with a small macro trick explained below.                     */\n  /*                                                                       */\n  /* I - Error Formats                                                     */\n  /* -----------------                                                     */\n  /*                                                                       */\n  /*   The configuration macro FT_CONFIG_OPTION_USE_MODULE_ERRORS can be   */\n  /*   defined in ftoption.h in order to make the higher byte indicate     */\n  /*   the module where the error has happened (this is not compatible     */\n  /*   with standard builds of FreeType 2).  See the file `ftmoderr.h' for */\n  /*   more details.                                                       */\n  /*                                                                       */\n  /*                                                                       */\n  /* II - Error Message strings                                            */\n  /* --------------------------                                            */\n  /*                                                                       */\n  /*   The error definitions below are made through special macros that    */\n  /*   allow client applications to build a table of error message strings */\n  /*   if they need it.  The strings are not included in a normal build of */\n  /*   FreeType 2 to save space (most client applications do not use       */\n  /*   them).                                                              */\n  /*                                                                       */\n  /*   To do so, you have to define the following macros before including  */\n  /*   this file:                                                          */\n  /*                                                                       */\n  /*   FT_ERROR_START_LIST ::                                              */\n  /*     This macro is called before anything else to define the start of  */\n  /*     the error list.  It is followed by several FT_ERROR_DEF calls     */\n  /*     (see below).                                                      */\n  /*                                                                       */\n  /*   FT_ERROR_DEF( e, v, s ) ::                                          */\n  /*     This macro is called to define one single error.                  */\n  /*     `e' is the error code identifier (e.g. FT_Err_Invalid_Argument).  */\n  /*     `v' is the error numerical value.                                 */\n  /*     `s' is the corresponding error string.                            */\n  /*                                                                       */\n  /*   FT_ERROR_END_LIST ::                                                */\n  /*     This macro ends the list.                                         */\n  /*                                                                       */\n  /*   Additionally, you have to undefine __FTERRORS_H__ before #including */\n  /*   this file.                                                          */\n  /*                                                                       */\n  /*   Here is a simple example:                                           */\n  /*                                                                       */\n  /*     {                                                                 */\n  /*       #undef __FTERRORS_H__                                           */\n  /*       #define FT_ERRORDEF( e, v, s )  { e, s },                       */\n  /*       #define FT_ERROR_START_LIST     {                               */\n  /*       #define FT_ERROR_END_LIST       { 0, 0 } };                     */\n  /*                                                                       */\n  /*       const struct                                                    */\n  /*       {                                                               */\n  /*         int          err_code;                                        */\n  /*         const char*  err_msg;                                         */\n  /*       } ft_errors[] =                                                 */\n  /*                                                                       */\n  /*       #include \"fterrors.h\"                                            */\n  /*     }                                                                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTERRORS_H__\n#define __FTERRORS_H__\n\n\n  /* include module base error codes */\n#include \"ftmoderr.h\"\n\n\n  /*******************************************************************/\n  /*******************************************************************/\n  /*****                                                         *****/\n  /*****                       SETUP MACROS                      *****/\n  /*****                                                         *****/\n  /*******************************************************************/\n  /*******************************************************************/\n\n\n#undef  FT_NEED_EXTERN_C\n\n\n  /* FT_ERR_PREFIX is used as a prefix for error identifiers. */\n  /* By default, we use `FT_Err_'.                            */\n  /*                                                          */\n#ifndef FT_ERR_PREFIX\n#define FT_ERR_PREFIX  FT_Err_\n#endif\n\n\n  /* FT_ERR_BASE is used as the base for module-specific errors. */\n  /*                                                             */\n#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS\n\n#ifndef FT_ERR_BASE\n#define FT_ERR_BASE  FT_Mod_Err_Base\n#endif\n\n#else\n\n#undef FT_ERR_BASE\n#define FT_ERR_BASE  0\n\n#endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */\n\n\n  /* If FT_ERRORDEF is not defined, we need to define a simple */\n  /* enumeration type.                                         */\n  /*                                                           */\n#ifndef FT_ERRORDEF\n\n#define FT_ERRORDEF( e, v, s )  e = v,\n#define FT_ERROR_START_LIST     enum {\n#define FT_ERROR_END_LIST       FT_ERR_CAT( FT_ERR_PREFIX, Max ) };\n\n#ifdef __cplusplus\n#define FT_NEED_EXTERN_C\n  extern \"C\" {\n#endif\n\n#endif /* !FT_ERRORDEF */\n\n\n  /* this macro is used to define an error */\n#define FT_ERRORDEF_( e, v, s )                                             \\\n          FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s )\n\n  /* this is only used for <module>_Err_Ok, which must be 0! */\n#define FT_NOERRORDEF_( e, v, s )                             \\\n          FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s )\n\n\n#ifdef FT_ERROR_START_LIST\n  FT_ERROR_START_LIST\n#endif\n\n\n  /* now include the error codes */\n#include \"fterrdef.h\"\n\n\n#ifdef FT_ERROR_END_LIST\n  FT_ERROR_END_LIST\n#endif\n\n\n  /*******************************************************************/\n  /*******************************************************************/\n  /*****                                                         *****/\n  /*****                      SIMPLE CLEANUP                     *****/\n  /*****                                                         *****/\n  /*******************************************************************/\n  /*******************************************************************/\n\n#ifdef FT_NEED_EXTERN_C\n  }\n#endif\n\n#undef FT_ERROR_START_LIST\n#undef FT_ERROR_END_LIST\n\n#undef FT_ERRORDEF\n#undef FT_ERRORDEF_\n#undef FT_NOERRORDEF_\n\n#undef FT_NEED_EXTERN_C\n#undef FT_ERR_BASE\n\n  /* FT_ERR_PREFIX is needed internally */\n#ifndef FT2_BUILD_LIBRARY\n#undef FT_ERR_PREFIX\n#endif\n\n#endif /* __FTERRORS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftgasp.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftgasp.h                                                               */\n/*                                                                         */\n/*    Access of TrueType's `gasp' table (specification).                   */\n/*                                                                         */\n/*  Copyright 2007, 2008, 2011 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef _FT_GASP_H_\n#define _FT_GASP_H_\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\n  /***************************************************************************\n   *\n   * @section:\n   *   gasp_table\n   *\n   * @title:\n   *   Gasp Table\n   *\n   * @abstract:\n   *   Retrieving TrueType `gasp' table entries.\n   *\n   * @description:\n   *   The function @FT_Get_Gasp can be used to query a TrueType or OpenType\n   *   font for specific entries in its `gasp' table, if any.  This is\n   *   mainly useful when implementing native TrueType hinting with the\n   *   bytecode interpreter to duplicate the Windows text rendering results.\n   */\n\n  /*************************************************************************\n   *\n   * @enum:\n   *   FT_GASP_XXX\n   *\n   * @description:\n   *   A list of values and/or bit-flags returned by the @FT_Get_Gasp\n   *   function.\n   *\n   * @values:\n   *   FT_GASP_NO_TABLE ::\n   *     This special value means that there is no GASP table in this face.\n   *     It is up to the client to decide what to do.\n   *\n   *   FT_GASP_DO_GRIDFIT ::\n   *     Grid-fitting and hinting should be performed at the specified ppem.\n   *     This *really* means TrueType bytecode interpretation.  If this bit\n   *     is not set, no hinting gets applied.\n   *\n   *   FT_GASP_DO_GRAY ::\n   *     Anti-aliased rendering should be performed at the specified ppem.\n   *     If not set, do monochrome rendering.\n   *\n   *   FT_GASP_SYMMETRIC_SMOOTHING ::\n   *     If set, smoothing along multiple axes must be used with ClearType.\n   *\n   *   FT_GASP_SYMMETRIC_GRIDFIT ::\n   *     Grid-fitting must be used with ClearType's symmetric smoothing.\n   *\n   * @note:\n   *   The bit-flags `FT_GASP_DO_GRIDFIT' and `FT_GASP_DO_GRAY' are to be\n   *   used for standard font rasterization only.  Independently of that,\n   *   `FT_GASP_SYMMETRIC_SMOOTHING' and `FT_GASP_SYMMETRIC_GRIDFIT' are to\n   *   be used if ClearType is enabled (and `FT_GASP_DO_GRIDFIT' and\n   *   `FT_GASP_DO_GRAY' are consequently ignored).\n   *\n   *   `ClearType' is Microsoft's implementation of LCD rendering, partly\n   *   protected by patents.\n   *\n   * @since:\n   *   2.3.0\n   */\n#define FT_GASP_NO_TABLE               -1\n#define FT_GASP_DO_GRIDFIT           0x01\n#define FT_GASP_DO_GRAY              0x02\n#define FT_GASP_SYMMETRIC_SMOOTHING  0x08\n#define FT_GASP_SYMMETRIC_GRIDFIT    0x10\n\n\n  /*************************************************************************\n   *\n   * @func:\n   *   FT_Get_Gasp\n   *\n   * @description:\n   *   Read the `gasp' table from a TrueType or OpenType font file and\n   *   return the entry corresponding to a given character pixel size.\n   *\n   * @input:\n   *   face :: The source face handle.\n   *   ppem :: The vertical character pixel size.\n   *\n   * @return:\n   *   Bit flags (see @FT_GASP_XXX), or @FT_GASP_NO_TABLE if there is no\n   *   `gasp' table in the face.\n   *\n   * @since:\n   *   2.3.0\n   */\n  FT_EXPORT( FT_Int )\n  FT_Get_Gasp( FT_Face  face,\n               FT_UInt  ppem );\n\n/* */\n\n#endif /* _FT_GASP_H_ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftglyph.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftglyph.h                                                              */\n/*                                                                         */\n/*    FreeType convenience functions to handle glyphs (specification).     */\n/*                                                                         */\n/*  Copyright 1996-2003, 2006, 2008, 2009, 2011 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file contains the definition of several convenience functions    */\n  /* that can be used by client applications to easily retrieve glyph      */\n  /* bitmaps and outlines from a given face.                               */\n  /*                                                                       */\n  /* These functions should be optional if you are writing a font server   */\n  /* or text layout engine on top of FreeType.  However, they are pretty   */\n  /* handy for many other simple uses of the library.                      */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTGLYPH_H__\n#define __FTGLYPH_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    glyph_management                                                   */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Glyph Management                                                   */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Generic interface to manage individual glyph data.                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains definitions used to manage glyph data        */\n  /*    through generic FT_Glyph objects.  Each of them can contain a      */\n  /*    bitmap, a vector outline, or even images in other formats.         */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* forward declaration to a private type */\n  typedef struct FT_Glyph_Class_  FT_Glyph_Class;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Glyph                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Handle to an object used to model generic glyph images.  It is a   */\n  /*    pointer to the @FT_GlyphRec structure and can contain a glyph      */\n  /*    bitmap or pointer.                                                 */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Glyph objects are not owned by the library.  You must thus release */\n  /*    them manually (through @FT_Done_Glyph) _before_ calling            */\n  /*    @FT_Done_FreeType.                                                 */\n  /*                                                                       */\n  typedef struct FT_GlyphRec_*  FT_Glyph;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_GlyphRec                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The root glyph structure contains a given glyph image plus its     */\n  /*    advance width in 16.16 fixed-point format.                         */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    library :: A handle to the FreeType library object.                */\n  /*                                                                       */\n  /*    clazz   :: A pointer to the glyph's class.  Private.               */\n  /*                                                                       */\n  /*    format  :: The format of the glyph's image.                        */\n  /*                                                                       */\n  /*    advance :: A 16.16 vector that gives the glyph's advance width.    */\n  /*                                                                       */\n  typedef struct  FT_GlyphRec_\n  {\n    FT_Library             library;\n    const FT_Glyph_Class*  clazz;\n    FT_Glyph_Format        format;\n    FT_Vector              advance;\n\n  } FT_GlyphRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_BitmapGlyph                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to an object used to model a bitmap glyph image.  This is */\n  /*    a sub-class of @FT_Glyph, and a pointer to @FT_BitmapGlyphRec.     */\n  /*                                                                       */\n  typedef struct FT_BitmapGlyphRec_*  FT_BitmapGlyph;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_BitmapGlyphRec                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used for bitmap glyph images.  This really is a        */\n  /*    `sub-class' of @FT_GlyphRec.                                       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    root   :: The root @FT_Glyph fields.                               */\n  /*                                                                       */\n  /*    left   :: The left-side bearing, i.e., the horizontal distance     */\n  /*              from the current pen position to the left border of the  */\n  /*              glyph bitmap.                                            */\n  /*                                                                       */\n  /*    top    :: The top-side bearing, i.e., the vertical distance from   */\n  /*              the current pen position to the top border of the glyph  */\n  /*              bitmap.  This distance is positive for upwards~y!        */\n  /*                                                                       */\n  /*    bitmap :: A descriptor for the bitmap.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You can typecast an @FT_Glyph to @FT_BitmapGlyph if you have       */\n  /*    `glyph->format == FT_GLYPH_FORMAT_BITMAP'.  This lets you access   */\n  /*    the bitmap's contents easily.                                      */\n  /*                                                                       */\n  /*    The corresponding pixel buffer is always owned by @FT_BitmapGlyph  */\n  /*    and is thus created and destroyed with it.                         */\n  /*                                                                       */\n  typedef struct  FT_BitmapGlyphRec_\n  {\n    FT_GlyphRec  root;\n    FT_Int       left;\n    FT_Int       top;\n    FT_Bitmap    bitmap;\n\n  } FT_BitmapGlyphRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_OutlineGlyph                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to an object used to model an outline glyph image.  This  */\n  /*    is a sub-class of @FT_Glyph, and a pointer to @FT_OutlineGlyphRec. */\n  /*                                                                       */\n  typedef struct FT_OutlineGlyphRec_*  FT_OutlineGlyph;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_OutlineGlyphRec                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used for outline (vectorial) glyph images.  This       */\n  /*    really is a `sub-class' of @FT_GlyphRec.                           */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    root    :: The root @FT_Glyph fields.                              */\n  /*                                                                       */\n  /*    outline :: A descriptor for the outline.                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You can typecast an @FT_Glyph to @FT_OutlineGlyph if you have      */\n  /*    `glyph->format == FT_GLYPH_FORMAT_OUTLINE'.  This lets you access  */\n  /*    the outline's content easily.                                      */\n  /*                                                                       */\n  /*    As the outline is extracted from a glyph slot, its coordinates are */\n  /*    expressed normally in 26.6 pixels, unless the flag                 */\n  /*    @FT_LOAD_NO_SCALE was used in @FT_Load_Glyph() or @FT_Load_Char(). */\n  /*                                                                       */\n  /*    The outline's tables are always owned by the object and are        */\n  /*    destroyed with it.                                                 */\n  /*                                                                       */\n  typedef struct  FT_OutlineGlyphRec_\n  {\n    FT_GlyphRec  root;\n    FT_Outline   outline;\n\n  } FT_OutlineGlyphRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Glyph                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to extract a glyph image from a slot.  Note that   */\n  /*    the created @FT_Glyph object must be released with @FT_Done_Glyph. */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    slot   :: A handle to the source glyph slot.                       */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aglyph :: A handle to the glyph object.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_Glyph( FT_GlyphSlot  slot,\n                FT_Glyph     *aglyph );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Glyph_Copy                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to copy a glyph image.  Note that the created      */\n  /*    @FT_Glyph object must be released with @FT_Done_Glyph.             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    source :: A handle to the source glyph object.                     */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    target :: A handle to the target glyph object.  0~in case of       */\n  /*              error.                                                   */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Glyph_Copy( FT_Glyph   source,\n                 FT_Glyph  *target );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Glyph_Transform                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Transform a glyph image if its format is scalable.                 */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    glyph  :: A handle to the target glyph object.                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    matrix :: A pointer to a 2x2 matrix to apply.                      */\n  /*                                                                       */\n  /*    delta  :: A pointer to a 2d vector to apply.  Coordinates are      */\n  /*              expressed in 1/64th of a pixel.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code (if not 0, the glyph format is not scalable).  */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The 2x2 transformation matrix is also applied to the glyph's       */\n  /*    advance vector.                                                    */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Glyph_Transform( FT_Glyph    glyph,\n                      FT_Matrix*  matrix,\n                      FT_Vector*  delta );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Glyph_BBox_Mode                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The mode how the values of @FT_Glyph_Get_CBox are returned.        */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_GLYPH_BBOX_UNSCALED ::                                          */\n  /*      Return unscaled font units.                                      */\n  /*                                                                       */\n  /*    FT_GLYPH_BBOX_SUBPIXELS ::                                         */\n  /*      Return unfitted 26.6 coordinates.                                */\n  /*                                                                       */\n  /*    FT_GLYPH_BBOX_GRIDFIT ::                                           */\n  /*      Return grid-fitted 26.6 coordinates.                             */\n  /*                                                                       */\n  /*    FT_GLYPH_BBOX_TRUNCATE ::                                          */\n  /*      Return coordinates in integer pixels.                            */\n  /*                                                                       */\n  /*    FT_GLYPH_BBOX_PIXELS ::                                            */\n  /*      Return grid-fitted pixel coordinates.                            */\n  /*                                                                       */\n  typedef enum  FT_Glyph_BBox_Mode_\n  {\n    FT_GLYPH_BBOX_UNSCALED  = 0,\n    FT_GLYPH_BBOX_SUBPIXELS = 0,\n    FT_GLYPH_BBOX_GRIDFIT   = 1,\n    FT_GLYPH_BBOX_TRUNCATE  = 2,\n    FT_GLYPH_BBOX_PIXELS    = 3\n\n  } FT_Glyph_BBox_Mode;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    ft_glyph_bbox_xxx                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    These constants are deprecated.  Use the corresponding             */\n  /*    @FT_Glyph_BBox_Mode values instead.                                */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*   ft_glyph_bbox_unscaled  :: See @FT_GLYPH_BBOX_UNSCALED.             */\n  /*   ft_glyph_bbox_subpixels :: See @FT_GLYPH_BBOX_SUBPIXELS.            */\n  /*   ft_glyph_bbox_gridfit   :: See @FT_GLYPH_BBOX_GRIDFIT.              */\n  /*   ft_glyph_bbox_truncate  :: See @FT_GLYPH_BBOX_TRUNCATE.             */\n  /*   ft_glyph_bbox_pixels    :: See @FT_GLYPH_BBOX_PIXELS.               */\n  /*                                                                       */\n#define ft_glyph_bbox_unscaled   FT_GLYPH_BBOX_UNSCALED\n#define ft_glyph_bbox_subpixels  FT_GLYPH_BBOX_SUBPIXELS\n#define ft_glyph_bbox_gridfit    FT_GLYPH_BBOX_GRIDFIT\n#define ft_glyph_bbox_truncate   FT_GLYPH_BBOX_TRUNCATE\n#define ft_glyph_bbox_pixels     FT_GLYPH_BBOX_PIXELS\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Glyph_Get_CBox                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return a glyph's `control box'.  The control box encloses all the  */\n  /*    outline's points, including Bézier control points.  Though it      */\n  /*    coincides with the exact bounding box for most glyphs, it can be   */\n  /*    slightly larger in some situations (like when rotating an outline  */\n  /*    which contains Bézier outside arcs).                               */\n  /*                                                                       */\n  /*    Computing the control box is very fast, while getting the bounding */\n  /*    box can take much more time as it needs to walk over all segments  */\n  /*    and arcs in the outline.  To get the latter, you can use the       */\n  /*    `ftbbox' component which is dedicated to this single task.         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    glyph :: A handle to the source glyph object.                      */\n  /*                                                                       */\n  /*    mode  :: The mode which indicates how to interpret the returned    */\n  /*             bounding box values.                                      */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    acbox :: The glyph coordinate bounding box.  Coordinates are       */\n  /*             expressed in 1/64th of pixels if it is grid-fitted.       */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Coordinates are relative to the glyph origin, using the y~upwards  */\n  /*    convention.                                                        */\n  /*                                                                       */\n  /*    If the glyph has been loaded with @FT_LOAD_NO_SCALE, `bbox_mode'   */\n  /*    must be set to @FT_GLYPH_BBOX_UNSCALED to get unscaled font        */\n  /*    units in 26.6 pixel format.  The value @FT_GLYPH_BBOX_SUBPIXELS    */\n  /*    is another name for this constant.                                 */\n  /*                                                                       */\n  /*    If the font is tricky and the glyph has been loaded with           */\n  /*    @FT_LOAD_NO_SCALE, the resulting CBox is meaningless.  To get      */\n  /*    reasonable values for the CBox it is necessary to load the glyph   */\n  /*    at a large ppem value (so that the hinting instructions can        */\n  /*    properly shift and scale the subglyphs), then extracting the CBox  */\n  /*    which can be eventually converted back to font units.              */\n  /*                                                                       */\n  /*    Note that the maximum coordinates are exclusive, which means that  */\n  /*    one can compute the width and height of the glyph image (be it in  */\n  /*    integer or 26.6 pixels) as:                                        */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      width  = bbox.xMax - bbox.xMin;                                  */\n  /*      height = bbox.yMax - bbox.yMin;                                  */\n  /*    }                                                                  */\n  /*                                                                       */\n  /*    Note also that for 26.6 coordinates, if `bbox_mode' is set to      */\n  /*    @FT_GLYPH_BBOX_GRIDFIT, the coordinates will also be grid-fitted,  */\n  /*    which corresponds to:                                              */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      bbox.xMin = FLOOR(bbox.xMin);                                    */\n  /*      bbox.yMin = FLOOR(bbox.yMin);                                    */\n  /*      bbox.xMax = CEILING(bbox.xMax);                                  */\n  /*      bbox.yMax = CEILING(bbox.yMax);                                  */\n  /*    }                                                                  */\n  /*                                                                       */\n  /*    To get the bbox in pixel coordinates, set `bbox_mode' to           */\n  /*    @FT_GLYPH_BBOX_TRUNCATE.                                           */\n  /*                                                                       */\n  /*    To get the bbox in grid-fitted pixel coordinates, set `bbox_mode'  */\n  /*    to @FT_GLYPH_BBOX_PIXELS.                                          */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Glyph_Get_CBox( FT_Glyph  glyph,\n                     FT_UInt   bbox_mode,\n                     FT_BBox  *acbox );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Glyph_To_Bitmap                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Convert a given glyph object to a bitmap glyph object.             */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    the_glyph   :: A pointer to a handle to the target glyph.          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    render_mode :: An enumeration that describes how the data is       */\n  /*                   rendered.                                           */\n  /*                                                                       */\n  /*    origin      :: A pointer to a vector used to translate the glyph   */\n  /*                   image before rendering.  Can be~0 (if no            */\n  /*                   translation).  The origin is expressed in           */\n  /*                   26.6 pixels.                                        */\n  /*                                                                       */\n  /*    destroy     :: A boolean that indicates that the original glyph    */\n  /*                   image should be destroyed by this function.  It is  */\n  /*                   never destroyed in case of error.                   */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function does nothing if the glyph format isn't scalable.     */\n  /*                                                                       */\n  /*    The glyph image is translated with the `origin' vector before      */\n  /*    rendering.                                                         */\n  /*                                                                       */\n  /*    The first parameter is a pointer to an @FT_Glyph handle, that will */\n  /*    be _replaced_ by this function (with newly allocated data).        */\n  /*    Typically, you would use (omitting error handling):                */\n  /*                                                                       */\n  /*                                                                       */\n  /*      {                                                                */\n  /*        FT_Glyph        glyph;                                         */\n  /*        FT_BitmapGlyph  glyph_bitmap;                                  */\n  /*                                                                       */\n  /*                                                                       */\n  /*        // load glyph                                                  */\n  /*        error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAUT );     */\n  /*                                                                       */\n  /*        // extract glyph image                                         */\n  /*        error = FT_Get_Glyph( face->glyph, &glyph );                   */\n  /*                                                                       */\n  /*        // convert to a bitmap (default render mode + destroying old)  */\n  /*        if ( glyph->format != FT_GLYPH_FORMAT_BITMAP )                 */\n  /*        {                                                              */\n  /*          error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL,   */\n  /*                                      0, 1 );                          */\n  /*          if ( error ) // `glyph' unchanged                            */\n  /*            ...                                                        */\n  /*        }                                                              */\n  /*                                                                       */\n  /*        // access bitmap content by typecasting                        */\n  /*        glyph_bitmap = (FT_BitmapGlyph)glyph;                          */\n  /*                                                                       */\n  /*        // do funny stuff with it, like blitting/drawing               */\n  /*        ...                                                            */\n  /*                                                                       */\n  /*        // discard glyph image (bitmap or not)                         */\n  /*        FT_Done_Glyph( glyph );                                        */\n  /*      }                                                                */\n  /*                                                                       */\n  /*                                                                       */\n  /*    Here another example, again without error handling:                */\n  /*                                                                       */\n  /*                                                                       */\n  /*      {                                                                */\n  /*        FT_Glyph  glyphs[MAX_GLYPHS]                                   */\n  /*                                                                       */\n  /*                                                                       */\n  /*        ...                                                            */\n  /*                                                                       */\n  /*        for ( idx = 0; i < MAX_GLYPHS; i++ )                           */\n  /*          error = FT_Load_Glyph( face, idx, FT_LOAD_DEFAULT ) ||       */\n  /*                  FT_Get_Glyph ( face->glyph, &glyph[idx] );           */\n  /*                                                                       */\n  /*        ...                                                            */\n  /*                                                                       */\n  /*        for ( idx = 0; i < MAX_GLYPHS; i++ )                           */\n  /*        {                                                              */\n  /*          FT_Glyph  bitmap = glyphs[idx];                              */\n  /*                                                                       */\n  /*                                                                       */\n  /*          ...                                                          */\n  /*                                                                       */\n  /*          // after this call, `bitmap' no longer points into           */\n  /*          // the `glyphs' array (and the old value isn't destroyed)    */\n  /*          FT_Glyph_To_Bitmap( &bitmap, FT_RENDER_MODE_MONO, 0, 0 );    */\n  /*                                                                       */\n  /*          ...                                                          */\n  /*                                                                       */\n  /*          FT_Done_Glyph( bitmap );                                     */\n  /*        }                                                              */\n  /*                                                                       */\n  /*        ...                                                            */\n  /*                                                                       */\n  /*        for ( idx = 0; i < MAX_GLYPHS; i++ )                           */\n  /*          FT_Done_Glyph( glyphs[idx] );                                */\n  /*      }                                                                */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Glyph_To_Bitmap( FT_Glyph*       the_glyph,\n                      FT_Render_Mode  render_mode,\n                      FT_Vector*      origin,\n                      FT_Bool         destroy );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Done_Glyph                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Destroy a given glyph.                                             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    glyph :: A handle to the target glyph object.                      */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Done_Glyph( FT_Glyph  glyph );\n\n  /* */\n\n\n  /* other helpful functions */\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    computations                                                       */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Matrix_Multiply                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Perform the matrix operation `b = a*b'.                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    a :: A pointer to matrix `a'.                                      */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    b :: A pointer to matrix `b'.                                      */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The result is undefined if either `a' or `b' is zero.              */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Matrix_Multiply( const FT_Matrix*  a,\n                      FT_Matrix*        b );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Matrix_Invert                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Invert a 2x2 matrix.  Return an error if it can't be inverted.     */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    matrix :: A pointer to the target matrix.  Remains untouched in    */\n  /*              case of error.                                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Matrix_Invert( FT_Matrix*  matrix );\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTGLYPH_H__ */\n\n\n/* END */\n\n\n/* Local Variables: */\n/* coding: utf-8    */\n/* End:             */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftgxval.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftgxval.h                                                              */\n/*                                                                         */\n/*    FreeType API for validating TrueTypeGX/AAT tables (specification).   */\n/*                                                                         */\n/*  Copyright 2004, 2005, 2006 by                                          */\n/*  Masatake YAMATO, Redhat K.K,                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTGXVAL_H__\n#define __FTGXVAL_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    gx_validation                                                      */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    TrueTypeGX/AAT Validation                                          */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    An API to validate TrueTypeGX/AAT tables.                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of functions to validate     */\n  /*    some TrueTypeGX tables (feat, mort, morx, bsln, just, kern, opbd,  */\n  /*    trak, prop, lcar).                                                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                                                                       */\n  /* Warning: Use FT_VALIDATE_XXX to validate a table.                     */\n  /*          Following definitions are for gxvalid developers.            */\n  /*                                                                       */\n  /*                                                                       */\n  /*************************************************************************/\n\n#define FT_VALIDATE_feat_INDEX     0\n#define FT_VALIDATE_mort_INDEX     1\n#define FT_VALIDATE_morx_INDEX     2\n#define FT_VALIDATE_bsln_INDEX     3\n#define FT_VALIDATE_just_INDEX     4\n#define FT_VALIDATE_kern_INDEX     5\n#define FT_VALIDATE_opbd_INDEX     6\n#define FT_VALIDATE_trak_INDEX     7\n#define FT_VALIDATE_prop_INDEX     8\n#define FT_VALIDATE_lcar_INDEX     9\n#define FT_VALIDATE_GX_LAST_INDEX  FT_VALIDATE_lcar_INDEX\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_VALIDATE_GX_LENGTH\n   *\n   * @description:\n   *   The number of tables checked in this module.  Use it as a parameter\n   *   for the `table-length' argument of function @FT_TrueTypeGX_Validate.\n   */\n#define FT_VALIDATE_GX_LENGTH     (FT_VALIDATE_GX_LAST_INDEX + 1)\n\n  /* */\n\n  /* Up to 0x1000 is used by otvalid.\n     Ox2xxx is reserved for feature OT extension. */\n#define FT_VALIDATE_GX_START 0x4000\n#define FT_VALIDATE_GX_BITFIELD( tag )                  \\\n  ( FT_VALIDATE_GX_START << FT_VALIDATE_##tag##_INDEX )\n\n\n /**********************************************************************\n  *\n  * @enum:\n  *    FT_VALIDATE_GXXXX\n  *\n  * @description:\n  *    A list of bit-field constants used with @FT_TrueTypeGX_Validate to\n  *    indicate which TrueTypeGX/AAT Type tables should be validated.\n  *\n  * @values:\n  *    FT_VALIDATE_feat ::\n  *      Validate `feat' table.\n  *\n  *    FT_VALIDATE_mort ::\n  *      Validate `mort' table.\n  *\n  *    FT_VALIDATE_morx ::\n  *      Validate `morx' table.\n  *\n  *    FT_VALIDATE_bsln ::\n  *      Validate `bsln' table.\n  *\n  *    FT_VALIDATE_just ::\n  *      Validate `just' table.\n  *\n  *    FT_VALIDATE_kern ::\n  *      Validate `kern' table.\n  *\n  *    FT_VALIDATE_opbd ::\n  *      Validate `opbd' table.\n  *\n  *    FT_VALIDATE_trak ::\n  *      Validate `trak' table.\n  *\n  *    FT_VALIDATE_prop ::\n  *      Validate `prop' table.\n  *\n  *    FT_VALIDATE_lcar ::\n  *      Validate `lcar' table.\n  *\n  *    FT_VALIDATE_GX ::\n  *      Validate all TrueTypeGX tables (feat, mort, morx, bsln, just, kern,\n  *      opbd, trak, prop and lcar).\n  *\n  */\n\n#define FT_VALIDATE_feat  FT_VALIDATE_GX_BITFIELD( feat )\n#define FT_VALIDATE_mort  FT_VALIDATE_GX_BITFIELD( mort )\n#define FT_VALIDATE_morx  FT_VALIDATE_GX_BITFIELD( morx )\n#define FT_VALIDATE_bsln  FT_VALIDATE_GX_BITFIELD( bsln )\n#define FT_VALIDATE_just  FT_VALIDATE_GX_BITFIELD( just )\n#define FT_VALIDATE_kern  FT_VALIDATE_GX_BITFIELD( kern )\n#define FT_VALIDATE_opbd  FT_VALIDATE_GX_BITFIELD( opbd )\n#define FT_VALIDATE_trak  FT_VALIDATE_GX_BITFIELD( trak )\n#define FT_VALIDATE_prop  FT_VALIDATE_GX_BITFIELD( prop )\n#define FT_VALIDATE_lcar  FT_VALIDATE_GX_BITFIELD( lcar )\n\n#define FT_VALIDATE_GX  ( FT_VALIDATE_feat | \\\n                          FT_VALIDATE_mort | \\\n                          FT_VALIDATE_morx | \\\n                          FT_VALIDATE_bsln | \\\n                          FT_VALIDATE_just | \\\n                          FT_VALIDATE_kern | \\\n                          FT_VALIDATE_opbd | \\\n                          FT_VALIDATE_trak | \\\n                          FT_VALIDATE_prop | \\\n                          FT_VALIDATE_lcar )\n\n\n  /* */\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_TrueTypeGX_Validate\n  *\n  * @description:\n  *    Validate various TrueTypeGX tables to assure that all offsets and\n  *    indices are valid.  The idea is that a higher-level library which\n  *    actually does the text layout can access those tables without\n  *    error checking (which can be quite time consuming).\n  *\n  * @input:\n  *    face ::\n  *       A handle to the input face.\n  *\n  *    validation_flags ::\n  *       A bit field which specifies the tables to be validated.  See\n  *       @FT_VALIDATE_GXXXX for possible values.\n  *\n  *    table_length ::\n  *       The size of the `tables' array.  Normally, @FT_VALIDATE_GX_LENGTH\n  *       should be passed.\n  *\n  * @output:\n  *    tables ::\n  *       The array where all validated sfnt tables are stored.\n  *       The array itself must be allocated by a client.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   This function only works with TrueTypeGX fonts, returning an error\n  *   otherwise.\n  *\n  *   After use, the application should deallocate the buffers pointed to by\n  *   each `tables' element, by calling @FT_TrueTypeGX_Free.  A NULL value\n  *   indicates that the table either doesn't exist in the font, the\n  *   application hasn't asked for validation, or the validator doesn't have\n  *   the ability to validate the sfnt table.\n  */\n  FT_EXPORT( FT_Error )\n  FT_TrueTypeGX_Validate( FT_Face   face,\n                          FT_UInt   validation_flags,\n                          FT_Bytes  tables[FT_VALIDATE_GX_LENGTH],\n                          FT_UInt   table_length );\n\n\n  /* */\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_TrueTypeGX_Free\n  *\n  * @description:\n  *    Free the buffer allocated by TrueTypeGX validator.\n  *\n  * @input:\n  *    face ::\n  *       A handle to the input face.\n  *\n  *    table ::\n  *       The pointer to the buffer allocated by\n  *       @FT_TrueTypeGX_Validate.\n  *\n  * @note:\n  *   This function must be used to free the buffer allocated by\n  *   @FT_TrueTypeGX_Validate only.\n  */\n  FT_EXPORT( void )\n  FT_TrueTypeGX_Free( FT_Face   face,\n                      FT_Bytes  table );\n\n\n  /* */\n\n /**********************************************************************\n  *\n  * @enum:\n  *    FT_VALIDATE_CKERNXXX\n  *\n  * @description:\n  *    A list of bit-field constants used with @FT_ClassicKern_Validate\n  *    to indicate the classic kern dialect or dialects.  If the selected\n  *    type doesn't fit, @FT_ClassicKern_Validate regards the table as\n  *    invalid.\n  *\n  * @values:\n  *    FT_VALIDATE_MS ::\n  *      Handle the `kern' table as a classic Microsoft kern table.\n  *\n  *    FT_VALIDATE_APPLE ::\n  *      Handle the `kern' table as a classic Apple kern table.\n  *\n  *    FT_VALIDATE_CKERN ::\n  *      Handle the `kern' as either classic Apple or Microsoft kern table.\n  */\n#define FT_VALIDATE_MS     ( FT_VALIDATE_GX_START << 0 )\n#define FT_VALIDATE_APPLE  ( FT_VALIDATE_GX_START << 1 )\n\n#define FT_VALIDATE_CKERN  ( FT_VALIDATE_MS | FT_VALIDATE_APPLE )\n\n\n  /* */\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_ClassicKern_Validate\n  *\n  * @description:\n  *    Validate classic (16-bit format) kern table to assure that the offsets\n  *    and indices are valid.  The idea is that a higher-level library which\n  *    actually does the text layout can access those tables without error\n  *    checking (which can be quite time consuming).\n  *\n  *    The `kern' table validator in @FT_TrueTypeGX_Validate deals with both\n  *    the new 32-bit format and the classic 16-bit format, while\n  *    FT_ClassicKern_Validate only supports the classic 16-bit format.\n  *\n  * @input:\n  *    face ::\n  *       A handle to the input face.\n  *\n  *    validation_flags ::\n  *       A bit field which specifies the dialect to be validated.  See\n  *       @FT_VALIDATE_CKERNXXX for possible values.\n  *\n  * @output:\n  *    ckern_table ::\n  *       A pointer to the kern table.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   After use, the application should deallocate the buffers pointed to by\n  *   `ckern_table', by calling @FT_ClassicKern_Free.  A NULL value\n  *   indicates that the table doesn't exist in the font.\n  */\n  FT_EXPORT( FT_Error )\n  FT_ClassicKern_Validate( FT_Face    face,\n                           FT_UInt    validation_flags,\n                           FT_Bytes  *ckern_table );\n\n\n  /* */\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_ClassicKern_Free\n  *\n  * @description:\n  *    Free the buffer allocated by classic Kern validator.\n  *\n  * @input:\n  *    face ::\n  *       A handle to the input face.\n  *\n  *    table ::\n  *       The pointer to the buffer that is allocated by\n  *       @FT_ClassicKern_Validate.\n  *\n  * @note:\n  *   This function must be used to free the buffer allocated by\n  *   @FT_ClassicKern_Validate only.\n  */\n  FT_EXPORT( void )\n  FT_ClassicKern_Free( FT_Face   face,\n                       FT_Bytes  table );\n\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTGXVAL_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftgzip.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftgzip.h                                                               */\n/*                                                                         */\n/*    Gzip-compressed stream support.                                      */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2004, 2006 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTGZIP_H__\n#define __FTGZIP_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    gzip                                                               */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    GZIP Streams                                                       */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Using gzip-compressed font files.                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of Gzip-specific functions.  */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n /************************************************************************\n  *\n  * @function:\n  *   FT_Stream_OpenGzip\n  *\n  * @description:\n  *   Open a new stream to parse gzip-compressed font files.  This is\n  *   mainly used to support the compressed `*.pcf.gz' fonts that come\n  *   with XFree86.\n  *\n  * @input:\n  *   stream ::\n  *     The target embedding stream.\n  *\n  *   source ::\n  *     The source stream.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   The source stream must be opened _before_ calling this function.\n  *\n  *   Calling the internal function `FT_Stream_Close' on the new stream will\n  *   *not* call `FT_Stream_Close' on the source stream.  None of the stream\n  *   objects will be released to the heap.\n  *\n  *   The stream implementation is very basic and resets the decompression\n  *   process each time seeking backwards is needed within the stream.\n  *\n  *   In certain builds of the library, gzip compression recognition is\n  *   automatically handled when calling @FT_New_Face or @FT_Open_Face.\n  *   This means that if no font driver is capable of handling the raw\n  *   compressed file, the library will try to open a gzipped stream from\n  *   it and re-open the face with it.\n  *\n  *   This function may return `FT_Err_Unimplemented_Feature' if your build\n  *   of FreeType was not compiled with zlib support.\n  */\n  FT_EXPORT( FT_Error )\n  FT_Stream_OpenGzip( FT_Stream  stream,\n                      FT_Stream  source );\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTGZIP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftimage.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftimage.h                                                              */\n/*                                                                         */\n/*    FreeType glyph image formats and default raster interface            */\n/*    (specification).                                                     */\n/*                                                                         */\n/*  Copyright 1996-2010, 2013 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Note: A `raster' is simply a scan-line converter, used to render      */\n  /*       FT_Outlines into FT_Bitmaps.                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTIMAGE_H__\n#define __FTIMAGE_H__\n\n\n  /* _STANDALONE_ is from ftgrays.c */\n#ifndef _STANDALONE_\n#include \"../ft2build.h\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    basic_types                                                        */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Pos                                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The type FT_Pos is used to store vectorial coordinates.  Depending */\n  /*    on the context, these can represent distances in integer font      */\n  /*    units, or 16.16, or 26.6 fixed-point pixel coordinates.            */\n  /*                                                                       */\n  typedef signed long  FT_Pos;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Vector                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple structure used to store a 2D vector; coordinates are of   */\n  /*    the FT_Pos type.                                                   */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    x :: The horizontal coordinate.                                    */\n  /*    y :: The vertical coordinate.                                      */\n  /*                                                                       */\n  typedef struct  FT_Vector_\n  {\n    FT_Pos  x;\n    FT_Pos  y;\n\n  } FT_Vector;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_BBox                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to hold an outline's bounding box, i.e., the      */\n  /*    coordinates of its extrema in the horizontal and vertical          */\n  /*    directions.                                                        */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    xMin :: The horizontal minimum (left-most).                        */\n  /*                                                                       */\n  /*    yMin :: The vertical minimum (bottom-most).                        */\n  /*                                                                       */\n  /*    xMax :: The horizontal maximum (right-most).                       */\n  /*                                                                       */\n  /*    yMax :: The vertical maximum (top-most).                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The bounding box is specified with the coordinates of the lower    */\n  /*    left and the upper right corner.  In PostScript, those values are  */\n  /*    often called (llx,lly) and (urx,ury), respectively.                */\n  /*                                                                       */\n  /*    If `yMin' is negative, this value gives the glyph's descender.     */\n  /*    Otherwise, the glyph doesn't descend below the baseline.           */\n  /*    Similarly, if `ymax' is positive, this value gives the glyph's     */\n  /*    ascender.                                                          */\n  /*                                                                       */\n  /*    `xMin' gives the horizontal distance from the glyph's origin to    */\n  /*    the left edge of the glyph's bounding box.  If `xMin' is negative, */\n  /*    the glyph extends to the left of the origin.                       */\n  /*                                                                       */\n  typedef struct  FT_BBox_\n  {\n    FT_Pos  xMin, yMin;\n    FT_Pos  xMax, yMax;\n\n  } FT_BBox;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Pixel_Mode                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration type used to describe the format of pixels in a     */\n  /*    given bitmap.  Note that additional formats may be added in the    */\n  /*    future.                                                            */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_PIXEL_MODE_NONE ::                                              */\n  /*      Value~0 is reserved.                                             */\n  /*                                                                       */\n  /*    FT_PIXEL_MODE_MONO ::                                              */\n  /*      A monochrome bitmap, using 1~bit per pixel.  Note that pixels    */\n  /*      are stored in most-significant order (MSB), which means that     */\n  /*      the left-most pixel in a byte has value 128.                     */\n  /*                                                                       */\n  /*    FT_PIXEL_MODE_GRAY ::                                              */\n  /*      An 8-bit bitmap, generally used to represent anti-aliased glyph  */\n  /*      images.  Each pixel is stored in one byte.  Note that the number */\n  /*      of `gray' levels is stored in the `num_grays' field of the       */\n  /*      @FT_Bitmap structure (it generally is 256).                      */\n  /*                                                                       */\n  /*    FT_PIXEL_MODE_GRAY2 ::                                             */\n  /*      A 2-bit per pixel bitmap, used to represent embedded             */\n  /*      anti-aliased bitmaps in font files according to the OpenType     */\n  /*      specification.  We haven't found a single font using this        */\n  /*      format, however.                                                 */\n  /*                                                                       */\n  /*    FT_PIXEL_MODE_GRAY4 ::                                             */\n  /*      A 4-bit per pixel bitmap, representing embedded anti-aliased     */\n  /*      bitmaps in font files according to the OpenType specification.   */\n  /*      We haven't found a single font using this format, however.       */\n  /*                                                                       */\n  /*    FT_PIXEL_MODE_LCD ::                                               */\n  /*      An 8-bit bitmap, representing RGB or BGR decimated glyph images  */\n  /*      used for display on LCD displays; the bitmap is three times      */\n  /*      wider than the original glyph image.  See also                   */\n  /*      @FT_RENDER_MODE_LCD.                                             */\n  /*                                                                       */\n  /*    FT_PIXEL_MODE_LCD_V ::                                             */\n  /*      An 8-bit bitmap, representing RGB or BGR decimated glyph images  */\n  /*      used for display on rotated LCD displays; the bitmap is three    */\n  /*      times taller than the original glyph image.  See also            */\n  /*      @FT_RENDER_MODE_LCD_V.                                           */\n  /*                                                                       */\n  /*    FT_PIXEL_MODE_BGRA ::                                              */\n  /*      An image with four 8-bit channels per pixel, representing a      */\n  /*      color image (such as emoticons) with alpha channel.  For each    */\n  /*      pixel, the format is BGRA, which means, the blue channel comes   */\n  /*      first in memory.  The color channels are pre-multiplied and in   */\n  /*      the sRGB colorspace.  For example, full red at half-translucent  */\n  /*      opacity will be represented as `00,00,80,80', not `00,00,FF,80'. */\n  /*      See also @FT_LOAD_COLOR.                                         */\n  /*                                                                       */\n  typedef enum  FT_Pixel_Mode_\n  {\n    FT_PIXEL_MODE_NONE = 0,\n    FT_PIXEL_MODE_MONO,\n    FT_PIXEL_MODE_GRAY,\n    FT_PIXEL_MODE_GRAY2,\n    FT_PIXEL_MODE_GRAY4,\n    FT_PIXEL_MODE_LCD,\n    FT_PIXEL_MODE_LCD_V,\n    FT_PIXEL_MODE_BGRA,\n\n    FT_PIXEL_MODE_MAX      /* do not remove */\n\n  } FT_Pixel_Mode;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    ft_pixel_mode_xxx                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A list of deprecated constants.  Use the corresponding             */\n  /*    @FT_Pixel_Mode values instead.                                     */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    ft_pixel_mode_none  :: See @FT_PIXEL_MODE_NONE.                    */\n  /*    ft_pixel_mode_mono  :: See @FT_PIXEL_MODE_MONO.                    */\n  /*    ft_pixel_mode_grays :: See @FT_PIXEL_MODE_GRAY.                    */\n  /*    ft_pixel_mode_pal2  :: See @FT_PIXEL_MODE_GRAY2.                   */\n  /*    ft_pixel_mode_pal4  :: See @FT_PIXEL_MODE_GRAY4.                   */\n  /*                                                                       */\n#define ft_pixel_mode_none   FT_PIXEL_MODE_NONE\n#define ft_pixel_mode_mono   FT_PIXEL_MODE_MONO\n#define ft_pixel_mode_grays  FT_PIXEL_MODE_GRAY\n#define ft_pixel_mode_pal2   FT_PIXEL_MODE_GRAY2\n#define ft_pixel_mode_pal4   FT_PIXEL_MODE_GRAY4\n\n /* */\n\n#if 0\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Palette_Mode                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    THIS TYPE IS DEPRECATED.  DO NOT USE IT!                           */\n  /*                                                                       */\n  /*    An enumeration type to describe the format of a bitmap palette,    */\n  /*    used with ft_pixel_mode_pal4 and ft_pixel_mode_pal8.               */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    ft_palette_mode_rgb  :: The palette is an array of 3-byte RGB      */\n  /*                            records.                                   */\n  /*                                                                       */\n  /*    ft_palette_mode_rgba :: The palette is an array of 4-byte RGBA     */\n  /*                            records.                                   */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    As ft_pixel_mode_pal2, pal4 and pal8 are currently unused by       */\n  /*    FreeType, these types are not handled by the library itself.       */\n  /*                                                                       */\n  typedef enum  FT_Palette_Mode_\n  {\n    ft_palette_mode_rgb = 0,\n    ft_palette_mode_rgba,\n\n    ft_palette_mode_max   /* do not remove */\n\n  } FT_Palette_Mode;\n\n  /* */\n\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Bitmap                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to describe a bitmap or pixmap to the raster.     */\n  /*    Note that we now manage pixmaps of various depths through the      */\n  /*    `pixel_mode' field.                                                */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    rows         :: The number of bitmap rows.                         */\n  /*                                                                       */\n  /*    width        :: The number of pixels in bitmap row.                */\n  /*                                                                       */\n  /*    pitch        :: The pitch's absolute value is the number of bytes  */\n  /*                    taken by one bitmap row, including padding.        */\n  /*                    However, the pitch is positive when the bitmap has */\n  /*                    a `down' flow, and negative when it has an `up'    */\n  /*                    flow.  In all cases, the pitch is an offset to add */\n  /*                    to a bitmap pointer in order to go down one row.   */\n  /*                                                                       */\n  /*                    Note that `padding' means the alignment of a       */\n  /*                    bitmap to a byte border, and FreeType functions    */\n  /*                    normally align to the smallest possible integer    */\n  /*                    value.                                             */\n  /*                                                                       */\n  /*                    For the B/W rasterizer, `pitch' is always an even  */\n  /*                    number.                                            */\n  /*                                                                       */\n  /*                    To change the pitch of a bitmap (say, to make it a */\n  /*                    multiple of 4), use @FT_Bitmap_Convert.            */\n  /*                    Alternatively, you might use callback functions to */\n  /*                    directly render to the application's surface; see  */\n  /*                    the file `example2.cpp' in the tutorial for a      */\n  /*                    demonstration.                                     */\n  /*                                                                       */\n  /*    buffer       :: A typeless pointer to the bitmap buffer.  This     */\n  /*                    value should be aligned on 32-bit boundaries in    */\n  /*                    most cases.                                        */\n  /*                                                                       */\n  /*    num_grays    :: This field is only used with                       */\n  /*                    @FT_PIXEL_MODE_GRAY; it gives the number of gray   */\n  /*                    levels used in the bitmap.                         */\n  /*                                                                       */\n  /*    pixel_mode   :: The pixel mode, i.e., how pixel bits are stored.   */\n  /*                    See @FT_Pixel_Mode for possible values.            */\n  /*                                                                       */\n  /*    palette_mode :: This field is intended for paletted pixel modes;   */\n  /*                    it indicates how the palette is stored.  Not       */\n  /*                    used currently.                                    */\n  /*                                                                       */\n  /*    palette      :: A typeless pointer to the bitmap palette; this     */\n  /*                    field is intended for paletted pixel modes.  Not   */\n  /*                    used currently.                                    */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*   For now, the only pixel modes supported by FreeType are mono and    */\n  /*   grays.  However, drivers might be added in the future to support    */\n  /*   more `colorful' options.                                            */\n  /*                                                                       */\n  typedef struct  FT_Bitmap_\n  {\n    int             rows;\n    int             width;\n    int             pitch;\n    unsigned char*  buffer;\n    short           num_grays;\n    char            pixel_mode;\n    char            palette_mode;\n    void*           palette;\n\n  } FT_Bitmap;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    outline_processing                                                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Outline                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This structure is used to describe an outline to the scan-line     */\n  /*    converter.                                                         */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    n_contours :: The number of contours in the outline.               */\n  /*                                                                       */\n  /*    n_points   :: The number of points in the outline.                 */\n  /*                                                                       */\n  /*    points     :: A pointer to an array of `n_points' @FT_Vector       */\n  /*                  elements, giving the outline's point coordinates.    */\n  /*                                                                       */\n  /*    tags       :: A pointer to an array of `n_points' chars, giving    */\n  /*                  each outline point's type.                           */\n  /*                                                                       */\n  /*                  If bit~0 is unset, the point is `off' the curve,     */\n  /*                  i.e., a Bézier control point, while it is `on' if    */\n  /*                  set.                                                 */\n  /*                                                                       */\n  /*                  Bit~1 is meaningful for `off' points only.  If set,  */\n  /*                  it indicates a third-order Bézier arc control point; */\n  /*                  and a second-order control point if unset.           */\n  /*                                                                       */\n  /*                  If bit~2 is set, bits 5-7 contain the drop-out mode  */\n  /*                  (as defined in the OpenType specification; the value */\n  /*                  is the same as the argument to the SCANMODE          */\n  /*                  instruction).                                        */\n  /*                                                                       */\n  /*                  Bits 3 and~4 are reserved for internal purposes.     */\n  /*                                                                       */\n  /*    contours   :: An array of `n_contours' shorts, giving the end      */\n  /*                  point of each contour within the outline.  For       */\n  /*                  example, the first contour is defined by the points  */\n  /*                  `0' to `contours[0]', the second one is defined by   */\n  /*                  the points `contours[0]+1' to `contours[1]', etc.    */\n  /*                                                                       */\n  /*    flags      :: A set of bit flags used to characterize the outline  */\n  /*                  and give hints to the scan-converter and hinter on   */\n  /*                  how to convert/grid-fit it.  See @FT_OUTLINE_FLAGS.  */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The B/W rasterizer only checks bit~2 in the `tags' array for the   */\n  /*    first point of each contour.  The drop-out mode as given with      */\n  /*    @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and       */\n  /*    @FT_OUTLINE_INCLUDE_STUBS in `flags' is then overridden.           */\n  /*                                                                       */\n  typedef struct  FT_Outline_\n  {\n    short       n_contours;      /* number of contours in glyph        */\n    short       n_points;        /* number of points in the glyph      */\n\n    FT_Vector*  points;          /* the outline's points               */\n    char*       tags;            /* the points flags                   */\n    short*      contours;        /* the contour end points             */\n\n    int         flags;           /* outline masks                      */\n\n  } FT_Outline;\n\n  /* Following limits must be consistent with */\n  /* FT_Outline.{n_contours,n_points}         */\n#define FT_OUTLINE_CONTOURS_MAX  SHRT_MAX\n#define FT_OUTLINE_POINTS_MAX    SHRT_MAX\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_OUTLINE_FLAGS                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A list of bit-field constants use for the flags in an outline's    */\n  /*    `flags' field.                                                     */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_OUTLINE_NONE ::                                                 */\n  /*      Value~0 is reserved.                                             */\n  /*                                                                       */\n  /*    FT_OUTLINE_OWNER ::                                                */\n  /*      If set, this flag indicates that the outline's field arrays      */\n  /*      (i.e., `points', `flags', and `contours') are `owned' by the     */\n  /*      outline object, and should thus be freed when it is destroyed.   */\n  /*                                                                       */\n  /*    FT_OUTLINE_EVEN_ODD_FILL ::                                        */\n  /*      By default, outlines are filled using the non-zero winding rule. */\n  /*      If set to 1, the outline will be filled using the even-odd fill  */\n  /*      rule (only works with the smooth rasterizer).                    */\n  /*                                                                       */\n  /*    FT_OUTLINE_REVERSE_FILL ::                                         */\n  /*      By default, outside contours of an outline are oriented in       */\n  /*      clock-wise direction, as defined in the TrueType specification.  */\n  /*      This flag is set if the outline uses the opposite direction      */\n  /*      (typically for Type~1 fonts).  This flag is ignored by the scan  */\n  /*      converter.                                                       */\n  /*                                                                       */\n  /*    FT_OUTLINE_IGNORE_DROPOUTS ::                                      */\n  /*      By default, the scan converter will try to detect drop-outs in   */\n  /*      an outline and correct the glyph bitmap to ensure consistent     */\n  /*      shape continuity.  If set, this flag hints the scan-line         */\n  /*      converter to ignore such cases.  See below for more information. */\n  /*                                                                       */\n  /*    FT_OUTLINE_SMART_DROPOUTS ::                                       */\n  /*      Select smart dropout control.  If unset, use simple dropout      */\n  /*      control.  Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set.  See    */\n  /*      below for more information.                                      */\n  /*                                                                       */\n  /*    FT_OUTLINE_INCLUDE_STUBS ::                                        */\n  /*      If set, turn pixels on for `stubs', otherwise exclude them.      */\n  /*      Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set.  See below for    */\n  /*      more information.                                                */\n  /*                                                                       */\n  /*    FT_OUTLINE_HIGH_PRECISION ::                                       */\n  /*      This flag indicates that the scan-line converter should try to   */\n  /*      convert this outline to bitmaps with the highest possible        */\n  /*      quality.  It is typically set for small character sizes.  Note   */\n  /*      that this is only a hint that might be completely ignored by a   */\n  /*      given scan-converter.                                            */\n  /*                                                                       */\n  /*    FT_OUTLINE_SINGLE_PASS ::                                          */\n  /*      This flag is set to force a given scan-converter to only use a   */\n  /*      single pass over the outline to render a bitmap glyph image.     */\n  /*      Normally, it is set for very large character sizes.  It is only  */\n  /*      a hint that might be completely ignored by a given               */\n  /*      scan-converter.                                                  */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The flags @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, */\n  /*    and @FT_OUTLINE_INCLUDE_STUBS are ignored by the smooth            */\n  /*    rasterizer.                                                        */\n  /*                                                                       */\n  /*    There exists a second mechanism to pass the drop-out mode to the   */\n  /*    B/W rasterizer; see the `tags' field in @FT_Outline.               */\n  /*                                                                       */\n  /*    Please refer to the description of the `SCANTYPE' instruction in   */\n  /*    the OpenType specification (in file `ttinst1.doc') how simple      */\n  /*    drop-outs, smart drop-outs, and stubs are defined.                 */\n  /*                                                                       */\n#define FT_OUTLINE_NONE             0x0\n#define FT_OUTLINE_OWNER            0x1\n#define FT_OUTLINE_EVEN_ODD_FILL    0x2\n#define FT_OUTLINE_REVERSE_FILL     0x4\n#define FT_OUTLINE_IGNORE_DROPOUTS  0x8\n#define FT_OUTLINE_SMART_DROPOUTS   0x10\n#define FT_OUTLINE_INCLUDE_STUBS    0x20\n\n#define FT_OUTLINE_HIGH_PRECISION   0x100\n#define FT_OUTLINE_SINGLE_PASS      0x200\n\n\n /*************************************************************************\n  *\n  * @enum:\n  *   ft_outline_flags\n  *\n  * @description:\n  *   These constants are deprecated.  Please use the corresponding\n  *   @FT_OUTLINE_FLAGS values.\n  *\n  * @values:\n  *   ft_outline_none            :: See @FT_OUTLINE_NONE.\n  *   ft_outline_owner           :: See @FT_OUTLINE_OWNER.\n  *   ft_outline_even_odd_fill   :: See @FT_OUTLINE_EVEN_ODD_FILL.\n  *   ft_outline_reverse_fill    :: See @FT_OUTLINE_REVERSE_FILL.\n  *   ft_outline_ignore_dropouts :: See @FT_OUTLINE_IGNORE_DROPOUTS.\n  *   ft_outline_high_precision  :: See @FT_OUTLINE_HIGH_PRECISION.\n  *   ft_outline_single_pass     :: See @FT_OUTLINE_SINGLE_PASS.\n  */\n#define ft_outline_none             FT_OUTLINE_NONE\n#define ft_outline_owner            FT_OUTLINE_OWNER\n#define ft_outline_even_odd_fill    FT_OUTLINE_EVEN_ODD_FILL\n#define ft_outline_reverse_fill     FT_OUTLINE_REVERSE_FILL\n#define ft_outline_ignore_dropouts  FT_OUTLINE_IGNORE_DROPOUTS\n#define ft_outline_high_precision   FT_OUTLINE_HIGH_PRECISION\n#define ft_outline_single_pass      FT_OUTLINE_SINGLE_PASS\n\n  /* */\n\n#define FT_CURVE_TAG( flag )  ( flag & 3 )\n\n#define FT_CURVE_TAG_ON            1\n#define FT_CURVE_TAG_CONIC         0\n#define FT_CURVE_TAG_CUBIC         2\n\n#define FT_CURVE_TAG_HAS_SCANMODE  4\n\n#define FT_CURVE_TAG_TOUCH_X       8  /* reserved for the TrueType hinter */\n#define FT_CURVE_TAG_TOUCH_Y      16  /* reserved for the TrueType hinter */\n\n#define FT_CURVE_TAG_TOUCH_BOTH    ( FT_CURVE_TAG_TOUCH_X | \\\n                                     FT_CURVE_TAG_TOUCH_Y )\n\n#define FT_Curve_Tag_On       FT_CURVE_TAG_ON\n#define FT_Curve_Tag_Conic    FT_CURVE_TAG_CONIC\n#define FT_Curve_Tag_Cubic    FT_CURVE_TAG_CUBIC\n#define FT_Curve_Tag_Touch_X  FT_CURVE_TAG_TOUCH_X\n#define FT_Curve_Tag_Touch_Y  FT_CURVE_TAG_TOUCH_Y\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Outline_MoveToFunc                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function pointer type used to describe the signature of a `move  */\n  /*    to' function during outline walking/decomposition.                 */\n  /*                                                                       */\n  /*    A `move to' is emitted to start a new contour in an outline.       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    to   :: A pointer to the target point of the `move to'.            */\n  /*                                                                       */\n  /*    user :: A typeless pointer which is passed from the caller of the  */\n  /*            decomposition function.                                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Error code.  0~means success.                                      */\n  /*                                                                       */\n  typedef int\n  (*FT_Outline_MoveToFunc)( const FT_Vector*  to,\n                            void*             user );\n\n#define FT_Outline_MoveTo_Func  FT_Outline_MoveToFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Outline_LineToFunc                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function pointer type used to describe the signature of a `line  */\n  /*    to' function during outline walking/decomposition.                 */\n  /*                                                                       */\n  /*    A `line to' is emitted to indicate a segment in the outline.       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    to   :: A pointer to the target point of the `line to'.            */\n  /*                                                                       */\n  /*    user :: A typeless pointer which is passed from the caller of the  */\n  /*            decomposition function.                                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Error code.  0~means success.                                      */\n  /*                                                                       */\n  typedef int\n  (*FT_Outline_LineToFunc)( const FT_Vector*  to,\n                            void*             user );\n\n#define FT_Outline_LineTo_Func  FT_Outline_LineToFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Outline_ConicToFunc                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function pointer type used to describe the signature of a `conic */\n  /*    to' function during outline walking or decomposition.              */\n  /*                                                                       */\n  /*    A `conic to' is emitted to indicate a second-order Bézier arc in   */\n  /*    the outline.                                                       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    control :: An intermediate control point between the last position */\n  /*               and the new target in `to'.                             */\n  /*                                                                       */\n  /*    to      :: A pointer to the target end point of the conic arc.     */\n  /*                                                                       */\n  /*    user    :: A typeless pointer which is passed from the caller of   */\n  /*               the decomposition function.                             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Error code.  0~means success.                                      */\n  /*                                                                       */\n  typedef int\n  (*FT_Outline_ConicToFunc)( const FT_Vector*  control,\n                             const FT_Vector*  to,\n                             void*             user );\n\n#define FT_Outline_ConicTo_Func  FT_Outline_ConicToFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Outline_CubicToFunc                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function pointer type used to describe the signature of a `cubic */\n  /*    to' function during outline walking or decomposition.              */\n  /*                                                                       */\n  /*    A `cubic to' is emitted to indicate a third-order Bézier arc.      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    control1 :: A pointer to the first Bézier control point.           */\n  /*                                                                       */\n  /*    control2 :: A pointer to the second Bézier control point.          */\n  /*                                                                       */\n  /*    to       :: A pointer to the target end point.                     */\n  /*                                                                       */\n  /*    user     :: A typeless pointer which is passed from the caller of  */\n  /*                the decomposition function.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Error code.  0~means success.                                      */\n  /*                                                                       */\n  typedef int\n  (*FT_Outline_CubicToFunc)( const FT_Vector*  control1,\n                             const FT_Vector*  control2,\n                             const FT_Vector*  to,\n                             void*             user );\n\n#define FT_Outline_CubicTo_Func  FT_Outline_CubicToFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Outline_Funcs                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure to hold various function pointers used during outline  */\n  /*    decomposition in order to emit segments, conic, and cubic Béziers. */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    move_to  :: The `move to' emitter.                                 */\n  /*                                                                       */\n  /*    line_to  :: The segment emitter.                                   */\n  /*                                                                       */\n  /*    conic_to :: The second-order Bézier arc emitter.                   */\n  /*                                                                       */\n  /*    cubic_to :: The third-order Bézier arc emitter.                    */\n  /*                                                                       */\n  /*    shift    :: The shift that is applied to coordinates before they   */\n  /*                are sent to the emitter.                               */\n  /*                                                                       */\n  /*    delta    :: The delta that is applied to coordinates before they   */\n  /*                are sent to the emitter, but after the shift.          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The point coordinates sent to the emitters are the transformed     */\n  /*    version of the original coordinates (this is important for high    */\n  /*    accuracy during scan-conversion).  The transformation is simple:   */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      x' = (x << shift) - delta                                        */\n  /*      y' = (x << shift) - delta                                        */\n  /*    }                                                                  */\n  /*                                                                       */\n  /*    Set the values of `shift' and `delta' to~0 to get the original     */\n  /*    point coordinates.                                                 */\n  /*                                                                       */\n  typedef struct  FT_Outline_Funcs_\n  {\n    FT_Outline_MoveToFunc   move_to;\n    FT_Outline_LineToFunc   line_to;\n    FT_Outline_ConicToFunc  conic_to;\n    FT_Outline_CubicToFunc  cubic_to;\n\n    int                     shift;\n    FT_Pos                  delta;\n\n  } FT_Outline_Funcs;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    basic_types                                                        */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_IMAGE_TAG                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This macro converts four-letter tags to an unsigned long type.     */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Since many 16-bit compilers don't like 32-bit enumerations, you    */\n  /*    should redefine this macro in case of problems to something like   */\n  /*    this:                                                              */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 )  value         */\n  /*    }                                                                  */\n  /*                                                                       */\n  /*    to get a simple enumeration without assigning special numbers.     */\n  /*                                                                       */\n#ifndef FT_IMAGE_TAG\n#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 )  \\\n          value = ( ( (unsigned long)_x1 << 24 ) | \\\n                    ( (unsigned long)_x2 << 16 ) | \\\n                    ( (unsigned long)_x3 << 8  ) | \\\n                      (unsigned long)_x4         )\n#endif /* FT_IMAGE_TAG */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Glyph_Format                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration type used to describe the format of a given glyph   */\n  /*    image.  Note that this version of FreeType only supports two image */\n  /*    formats, even though future font drivers will be able to register  */\n  /*    their own format.                                                  */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_GLYPH_FORMAT_NONE ::                                            */\n  /*      The value~0 is reserved.                                         */\n  /*                                                                       */\n  /*    FT_GLYPH_FORMAT_COMPOSITE ::                                       */\n  /*      The glyph image is a composite of several other images.  This    */\n  /*      format is _only_ used with @FT_LOAD_NO_RECURSE, and is used to   */\n  /*      report compound glyphs (like accented characters).               */\n  /*                                                                       */\n  /*    FT_GLYPH_FORMAT_BITMAP ::                                          */\n  /*      The glyph image is a bitmap, and can be described as an          */\n  /*      @FT_Bitmap.  You generally need to access the `bitmap' field of  */\n  /*      the @FT_GlyphSlotRec structure to read it.                       */\n  /*                                                                       */\n  /*    FT_GLYPH_FORMAT_OUTLINE ::                                         */\n  /*      The glyph image is a vectorial outline made of line segments     */\n  /*      and Bézier arcs; it can be described as an @FT_Outline; you      */\n  /*      generally want to access the `outline' field of the              */\n  /*      @FT_GlyphSlotRec structure to read it.                           */\n  /*                                                                       */\n  /*    FT_GLYPH_FORMAT_PLOTTER ::                                         */\n  /*      The glyph image is a vectorial path with no inside and outside   */\n  /*      contours.  Some Type~1 fonts, like those in the Hershey family,  */\n  /*      contain glyphs in this format.  These are described as           */\n  /*      @FT_Outline, but FreeType isn't currently capable of rendering   */\n  /*      them correctly.                                                  */\n  /*                                                                       */\n  typedef enum  FT_Glyph_Format_\n  {\n    FT_IMAGE_TAG( FT_GLYPH_FORMAT_NONE, 0, 0, 0, 0 ),\n\n    FT_IMAGE_TAG( FT_GLYPH_FORMAT_COMPOSITE, 'c', 'o', 'm', 'p' ),\n    FT_IMAGE_TAG( FT_GLYPH_FORMAT_BITMAP,    'b', 'i', 't', 's' ),\n    FT_IMAGE_TAG( FT_GLYPH_FORMAT_OUTLINE,   'o', 'u', 't', 'l' ),\n    FT_IMAGE_TAG( FT_GLYPH_FORMAT_PLOTTER,   'p', 'l', 'o', 't' )\n\n  } FT_Glyph_Format;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    ft_glyph_format_xxx                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A list of deprecated constants.  Use the corresponding             */\n  /*    @FT_Glyph_Format values instead.                                   */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    ft_glyph_format_none      :: See @FT_GLYPH_FORMAT_NONE.            */\n  /*    ft_glyph_format_composite :: See @FT_GLYPH_FORMAT_COMPOSITE.       */\n  /*    ft_glyph_format_bitmap    :: See @FT_GLYPH_FORMAT_BITMAP.          */\n  /*    ft_glyph_format_outline   :: See @FT_GLYPH_FORMAT_OUTLINE.         */\n  /*    ft_glyph_format_plotter   :: See @FT_GLYPH_FORMAT_PLOTTER.         */\n  /*                                                                       */\n#define ft_glyph_format_none       FT_GLYPH_FORMAT_NONE\n#define ft_glyph_format_composite  FT_GLYPH_FORMAT_COMPOSITE\n#define ft_glyph_format_bitmap     FT_GLYPH_FORMAT_BITMAP\n#define ft_glyph_format_outline    FT_GLYPH_FORMAT_OUTLINE\n#define ft_glyph_format_plotter    FT_GLYPH_FORMAT_PLOTTER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****            R A S T E R   D E F I N I T I O N S                *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* A raster is a scan converter, in charge of rendering an outline into  */\n  /* a a bitmap.  This section contains the public API for rasters.        */\n  /*                                                                       */\n  /* Note that in FreeType 2, all rasters are now encapsulated within      */\n  /* specific modules called `renderers'.  See `freetype/ftrender.h' for   */\n  /* more details on renderers.                                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    raster                                                             */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Scanline Converter                                                 */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    How vectorial outlines are converted into bitmaps and pixmaps.     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains technical definitions.                       */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Raster                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle (pointer) to a raster object.  Each object can be used    */\n  /*    independently to convert an outline into a bitmap or pixmap.       */\n  /*                                                                       */\n  typedef struct FT_RasterRec_*  FT_Raster;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Span                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a single span of gray (or black) pixels  */\n  /*    when rendering a monochrome or anti-aliased bitmap.                */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    x        :: The span's horizontal start position.                  */\n  /*                                                                       */\n  /*    len      :: The span's length in pixels.                           */\n  /*                                                                       */\n  /*    coverage :: The span color/coverage, ranging from 0 (background)   */\n  /*                to 255 (foreground).  Only used for anti-aliased       */\n  /*                rendering.                                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This structure is used by the span drawing callback type named     */\n  /*    @FT_SpanFunc which takes the y~coordinate of the span as a         */\n  /*    a parameter.                                                       */\n  /*                                                                       */\n  /*    The coverage value is always between 0 and 255.  If you want less  */\n  /*    gray values, the callback function has to reduce them.             */\n  /*                                                                       */\n  typedef struct  FT_Span_\n  {\n    short           x;\n    unsigned short  len;\n    unsigned char   coverage;\n\n  } FT_Span;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_SpanFunc                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used as a call-back by the anti-aliased renderer in     */\n  /*    order to let client applications draw themselves the gray pixel    */\n  /*    spans on each scan line.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    y     :: The scanline's y~coordinate.                              */\n  /*                                                                       */\n  /*    count :: The number of spans to draw on this scanline.             */\n  /*                                                                       */\n  /*    spans :: A table of `count' spans to draw on the scanline.         */\n  /*                                                                       */\n  /*    user  :: User-supplied data that is passed to the callback.        */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This callback allows client applications to directly render the    */\n  /*    gray spans of the anti-aliased bitmap to any kind of surfaces.     */\n  /*                                                                       */\n  /*    This can be used to write anti-aliased outlines directly to a      */\n  /*    given background bitmap, and even perform translucency.            */\n  /*                                                                       */\n  /*    Note that the `count' field cannot be greater than a fixed value   */\n  /*    defined by the `FT_MAX_GRAY_SPANS' configuration macro in          */\n  /*    `ftoption.h'.  By default, this value is set to~32, which means    */\n  /*    that if there are more than 32~spans on a given scanline, the      */\n  /*    callback is called several times with the same `y' parameter in    */\n  /*    order to draw all callbacks.                                       */\n  /*                                                                       */\n  /*    Otherwise, the callback is only called once per scan-line, and     */\n  /*    only for those scanlines that do have `gray' pixels on them.       */\n  /*                                                                       */\n  typedef void\n  (*FT_SpanFunc)( int             y,\n                  int             count,\n                  const FT_Span*  spans,\n                  void*           user );\n\n#define FT_Raster_Span_Func  FT_SpanFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Raster_BitTest_Func                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    THIS TYPE IS DEPRECATED.  DO NOT USE IT.                           */\n  /*                                                                       */\n  /*    A function used as a call-back by the monochrome scan-converter    */\n  /*    to test whether a given target pixel is already set to the drawing */\n  /*    `color'.  These tests are crucial to implement drop-out control    */\n  /*    per-se the TrueType spec.                                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    y     :: The pixel's y~coordinate.                                 */\n  /*                                                                       */\n  /*    x     :: The pixel's x~coordinate.                                 */\n  /*                                                                       */\n  /*    user  :: User-supplied data that is passed to the callback.        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*   1~if the pixel is `set', 0~otherwise.                               */\n  /*                                                                       */\n  typedef int\n  (*FT_Raster_BitTest_Func)( int    y,\n                             int    x,\n                             void*  user );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Raster_BitSet_Func                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    THIS TYPE IS DEPRECATED.  DO NOT USE IT.                           */\n  /*                                                                       */\n  /*    A function used as a call-back by the monochrome scan-converter    */\n  /*    to set an individual target pixel.  This is crucial to implement   */\n  /*    drop-out control according to the TrueType specification.          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    y     :: The pixel's y~coordinate.                                 */\n  /*                                                                       */\n  /*    x     :: The pixel's x~coordinate.                                 */\n  /*                                                                       */\n  /*    user  :: User-supplied data that is passed to the callback.        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    1~if the pixel is `set', 0~otherwise.                              */\n  /*                                                                       */\n  typedef void\n  (*FT_Raster_BitSet_Func)( int    y,\n                            int    x,\n                            void*  user );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_RASTER_FLAG_XXX                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A list of bit flag constants as used in the `flags' field of a     */\n  /*    @FT_Raster_Params structure.                                       */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_RASTER_FLAG_DEFAULT :: This value is 0.                         */\n  /*                                                                       */\n  /*    FT_RASTER_FLAG_AA      :: This flag is set to indicate that an     */\n  /*                              anti-aliased glyph image should be       */\n  /*                              generated.  Otherwise, it will be        */\n  /*                              monochrome (1-bit).                      */\n  /*                                                                       */\n  /*    FT_RASTER_FLAG_DIRECT  :: This flag is set to indicate direct      */\n  /*                              rendering.  In this mode, client         */\n  /*                              applications must provide their own span */\n  /*                              callback.  This lets them directly       */\n  /*                              draw or compose over an existing bitmap. */\n  /*                              If this bit is not set, the target       */\n  /*                              pixmap's buffer _must_ be zeroed before  */\n  /*                              rendering.                               */\n  /*                                                                       */\n  /*                              Note that for now, direct rendering is   */\n  /*                              only possible with anti-aliased glyphs.  */\n  /*                                                                       */\n  /*    FT_RASTER_FLAG_CLIP    :: This flag is only used in direct         */\n  /*                              rendering mode.  If set, the output will */\n  /*                              be clipped to a box specified in the     */\n  /*                              `clip_box' field of the                  */\n  /*                              @FT_Raster_Params structure.             */\n  /*                                                                       */\n  /*                              Note that by default, the glyph bitmap   */\n  /*                              is clipped to the target pixmap, except  */\n  /*                              in direct rendering mode where all spans */\n  /*                              are generated if no clipping box is set. */\n  /*                                                                       */\n#define FT_RASTER_FLAG_DEFAULT  0x0\n#define FT_RASTER_FLAG_AA       0x1\n#define FT_RASTER_FLAG_DIRECT   0x2\n#define FT_RASTER_FLAG_CLIP     0x4\n\n  /* deprecated */\n#define ft_raster_flag_default  FT_RASTER_FLAG_DEFAULT\n#define ft_raster_flag_aa       FT_RASTER_FLAG_AA\n#define ft_raster_flag_direct   FT_RASTER_FLAG_DIRECT\n#define ft_raster_flag_clip     FT_RASTER_FLAG_CLIP\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Raster_Params                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure to hold the arguments used by a raster's render        */\n  /*    function.                                                          */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    target      :: The target bitmap.                                  */\n  /*                                                                       */\n  /*    source      :: A pointer to the source glyph image (e.g., an       */\n  /*                   @FT_Outline).                                       */\n  /*                                                                       */\n  /*    flags       :: The rendering flags.                                */\n  /*                                                                       */\n  /*    gray_spans  :: The gray span drawing callback.                     */\n  /*                                                                       */\n  /*    black_spans :: The black span drawing callback.  UNIMPLEMENTED!    */\n  /*                                                                       */\n  /*    bit_test    :: The bit test callback.  UNIMPLEMENTED!              */\n  /*                                                                       */\n  /*    bit_set     :: The bit set callback.  UNIMPLEMENTED!               */\n  /*                                                                       */\n  /*    user        :: User-supplied data that is passed to each drawing   */\n  /*                   callback.                                           */\n  /*                                                                       */\n  /*    clip_box    :: An optional clipping box.  It is only used in       */\n  /*                   direct rendering mode.  Note that coordinates here  */\n  /*                   should be expressed in _integer_ pixels (and not in */\n  /*                   26.6 fixed-point units).                            */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    An anti-aliased glyph bitmap is drawn if the @FT_RASTER_FLAG_AA    */\n  /*    bit flag is set in the `flags' field, otherwise a monochrome       */\n  /*    bitmap is generated.                                               */\n  /*                                                                       */\n  /*    If the @FT_RASTER_FLAG_DIRECT bit flag is set in `flags', the      */\n  /*    raster will call the `gray_spans' callback to draw gray pixel      */\n  /*    spans, in the case of an aa glyph bitmap, it will call             */\n  /*    `black_spans', and `bit_test' and `bit_set' in the case of a       */\n  /*    monochrome bitmap.  This allows direct composition over a          */\n  /*    pre-existing bitmap through user-provided callbacks to perform the */\n  /*    span drawing/composition.                                          */\n  /*                                                                       */\n  /*    Note that the `bit_test' and `bit_set' callbacks are required when */\n  /*    rendering a monochrome bitmap, as they are crucial to implement    */\n  /*    correct drop-out control as defined in the TrueType specification. */\n  /*                                                                       */\n  typedef struct  FT_Raster_Params_\n  {\n    const FT_Bitmap*        target;\n    const void*             source;\n    int                     flags;\n    FT_SpanFunc             gray_spans;\n    FT_SpanFunc             black_spans;  /* doesn't work! */\n    FT_Raster_BitTest_Func  bit_test;     /* doesn't work! */\n    FT_Raster_BitSet_Func   bit_set;      /* doesn't work! */\n    void*                   user;\n    FT_BBox                 clip_box;\n\n  } FT_Raster_Params;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Raster_NewFunc                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to create a new raster object.                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory :: A handle to the memory allocator.                        */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    raster :: A handle to the new raster object.                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Error code.  0~means success.                                      */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The `memory' parameter is a typeless pointer in order to avoid     */\n  /*    un-wanted dependencies on the rest of the FreeType code.  In       */\n  /*    practice, it is an @FT_Memory object, i.e., a handle to the        */\n  /*    standard FreeType memory allocator.  However, this field can be    */\n  /*    completely ignored by a given raster implementation.               */\n  /*                                                                       */\n  typedef int\n  (*FT_Raster_NewFunc)( void*       memory,\n                        FT_Raster*  raster );\n\n#define FT_Raster_New_Func  FT_Raster_NewFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Raster_DoneFunc                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to destroy a given raster object.                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    raster :: A handle to the raster object.                           */\n  /*                                                                       */\n  typedef void\n  (*FT_Raster_DoneFunc)( FT_Raster  raster );\n\n#define FT_Raster_Done_Func  FT_Raster_DoneFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Raster_ResetFunc                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    FreeType provides an area of memory called the `render pool',      */\n  /*    available to all registered rasters.  This pool can be freely used */\n  /*    during a given scan-conversion but is shared by all rasters.  Its  */\n  /*    content is thus transient.                                         */\n  /*                                                                       */\n  /*    This function is called each time the render pool changes, or just */\n  /*    after a new raster object is created.                              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    raster    :: A handle to the new raster object.                    */\n  /*                                                                       */\n  /*    pool_base :: The address in memory of the render pool.             */\n  /*                                                                       */\n  /*    pool_size :: The size in bytes of the render pool.                 */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Rasters can ignore the render pool and rely on dynamic memory      */\n  /*    allocation if they want to (a handle to the memory allocator is    */\n  /*    passed to the raster constructor).  However, this is not           */\n  /*    recommended for efficiency purposes.                               */\n  /*                                                                       */\n  typedef void\n  (*FT_Raster_ResetFunc)( FT_Raster       raster,\n                          unsigned char*  pool_base,\n                          unsigned long   pool_size );\n\n#define FT_Raster_Reset_Func  FT_Raster_ResetFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Raster_SetModeFunc                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function is a generic facility to change modes or attributes  */\n  /*    in a given raster.  This can be used for debugging purposes, or    */\n  /*    simply to allow implementation-specific `features' in a given      */\n  /*    raster module.                                                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    raster :: A handle to the new raster object.                       */\n  /*                                                                       */\n  /*    mode   :: A 4-byte tag used to name the mode or property.          */\n  /*                                                                       */\n  /*    args   :: A pointer to the new mode/property to use.               */\n  /*                                                                       */\n  typedef int\n  (*FT_Raster_SetModeFunc)( FT_Raster      raster,\n                            unsigned long  mode,\n                            void*          args );\n\n#define FT_Raster_Set_Mode_Func  FT_Raster_SetModeFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Raster_RenderFunc                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Invoke a given raster to scan-convert a given glyph image into a   */\n  /*    target bitmap.                                                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    raster :: A handle to the raster object.                           */\n  /*                                                                       */\n  /*    params :: A pointer to an @FT_Raster_Params structure used to      */\n  /*              store the rendering parameters.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Error code.  0~means success.                                      */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The exact format of the source image depends on the raster's glyph */\n  /*    format defined in its @FT_Raster_Funcs structure.  It can be an    */\n  /*    @FT_Outline or anything else in order to support a large array of  */\n  /*    glyph formats.                                                     */\n  /*                                                                       */\n  /*    Note also that the render function can fail and return a           */\n  /*    `FT_Err_Unimplemented_Feature' error code if the raster used does  */\n  /*    not support direct composition.                                    */\n  /*                                                                       */\n  /*    XXX: For now, the standard raster doesn't support direct           */\n  /*         composition but this should change for the final release (see */\n  /*         the files `demos/src/ftgrays.c' and `demos/src/ftgrays2.c'    */\n  /*         for examples of distinct implementations which support direct */\n  /*         composition).                                                 */\n  /*                                                                       */\n  typedef int\n  (*FT_Raster_RenderFunc)( FT_Raster                raster,\n                           const FT_Raster_Params*  params );\n\n#define FT_Raster_Render_Func  FT_Raster_RenderFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Raster_Funcs                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*   A structure used to describe a given raster class to the library.   */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    glyph_format  :: The supported glyph format for this raster.       */\n  /*                                                                       */\n  /*    raster_new    :: The raster constructor.                           */\n  /*                                                                       */\n  /*    raster_reset  :: Used to reset the render pool within the raster.  */\n  /*                                                                       */\n  /*    raster_render :: A function to render a glyph into a given bitmap. */\n  /*                                                                       */\n  /*    raster_done   :: The raster destructor.                            */\n  /*                                                                       */\n  typedef struct  FT_Raster_Funcs_\n  {\n    FT_Glyph_Format        glyph_format;\n    FT_Raster_NewFunc      raster_new;\n    FT_Raster_ResetFunc    raster_reset;\n    FT_Raster_SetModeFunc  raster_set_mode;\n    FT_Raster_RenderFunc   raster_render;\n    FT_Raster_DoneFunc     raster_done;\n\n  } FT_Raster_Funcs;\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTIMAGE_H__ */\n\n\n/* END */\n\n\n/* Local Variables: */\n/* coding: utf-8    */\n/* End:             */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftincrem.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftincrem.h                                                             */\n/*                                                                         */\n/*    FreeType incremental loading (specification).                        */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2006, 2007, 2008, 2010 by                        */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTINCREM_H__\n#define __FTINCREM_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n  /***************************************************************************\n   *\n   * @section:\n   *    incremental\n   *\n   * @title:\n   *    Incremental Loading\n   *\n   * @abstract:\n   *    Custom Glyph Loading.\n   *\n   * @description:\n   *   This section contains various functions used to perform so-called\n   *   `incremental' glyph loading.  This is a mode where all glyphs loaded\n   *   from a given @FT_Face are provided by the client application,\n   *\n   *   Apart from that, all other tables are loaded normally from the font\n   *   file.  This mode is useful when FreeType is used within another\n   *   engine, e.g., a PostScript Imaging Processor.\n   *\n   *   To enable this mode, you must use @FT_Open_Face, passing an\n   *   @FT_Parameter with the @FT_PARAM_TAG_INCREMENTAL tag and an\n   *   @FT_Incremental_Interface value.  See the comments for\n   *   @FT_Incremental_InterfaceRec for an example.\n   *\n   */\n\n\n  /***************************************************************************\n   *\n   * @type:\n   *   FT_Incremental\n   *\n   * @description:\n   *   An opaque type describing a user-provided object used to implement\n   *   `incremental' glyph loading within FreeType.  This is used to support\n   *   embedded fonts in certain environments (e.g., PostScript interpreters),\n   *   where the glyph data isn't in the font file, or must be overridden by\n   *   different values.\n   *\n   * @note:\n   *   It is up to client applications to create and implement @FT_Incremental\n   *   objects, as long as they provide implementations for the methods\n   *   @FT_Incremental_GetGlyphDataFunc, @FT_Incremental_FreeGlyphDataFunc\n   *   and @FT_Incremental_GetGlyphMetricsFunc.\n   *\n   *   See the description of @FT_Incremental_InterfaceRec to understand how\n   *   to use incremental objects with FreeType.\n   *\n   */\n  typedef struct FT_IncrementalRec_*  FT_Incremental;\n\n\n  /***************************************************************************\n   *\n   * @struct:\n   *   FT_Incremental_MetricsRec\n   *\n   * @description:\n   *   A small structure used to contain the basic glyph metrics returned\n   *   by the @FT_Incremental_GetGlyphMetricsFunc method.\n   *\n   * @fields:\n   *   bearing_x ::\n   *     Left bearing, in font units.\n   *\n   *   bearing_y ::\n   *     Top bearing, in font units.\n   *\n   *   advance ::\n   *     Horizontal component of glyph advance, in font units.\n   *\n   *   advance_v ::\n   *     Vertical component of glyph advance, in font units.\n   *\n   * @note:\n   *   These correspond to horizontal or vertical metrics depending on the\n   *   value of the `vertical' argument to the function\n   *   @FT_Incremental_GetGlyphMetricsFunc.\n   *\n   */\n  typedef struct  FT_Incremental_MetricsRec_\n  {\n    FT_Long  bearing_x;\n    FT_Long  bearing_y;\n    FT_Long  advance;\n    FT_Long  advance_v;     /* since 2.3.12 */\n\n  } FT_Incremental_MetricsRec;\n\n\n  /***************************************************************************\n   *\n   * @struct:\n   *   FT_Incremental_Metrics\n   *\n   * @description:\n   *   A handle to an @FT_Incremental_MetricsRec structure.\n   *\n   */\n   typedef struct FT_Incremental_MetricsRec_*  FT_Incremental_Metrics;\n\n\n  /***************************************************************************\n   *\n   * @type:\n   *   FT_Incremental_GetGlyphDataFunc\n   *\n   * @description:\n   *   A function called by FreeType to access a given glyph's data bytes\n   *   during @FT_Load_Glyph or @FT_Load_Char if incremental loading is\n   *   enabled.\n   *\n   *   Note that the format of the glyph's data bytes depends on the font\n   *   file format.  For TrueType, it must correspond to the raw bytes within\n   *   the `glyf' table.  For PostScript formats, it must correspond to the\n   *   *unencrypted* charstring bytes, without any `lenIV' header.  It is\n   *   undefined for any other format.\n   *\n   * @input:\n   *   incremental ::\n   *     Handle to an opaque @FT_Incremental handle provided by the client\n   *     application.\n   *\n   *   glyph_index ::\n   *     Index of relevant glyph.\n   *\n   * @output:\n   *   adata ::\n   *     A structure describing the returned glyph data bytes (which will be\n   *     accessed as a read-only byte block).\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   If this function returns successfully the method\n   *   @FT_Incremental_FreeGlyphDataFunc will be called later to release\n   *   the data bytes.\n   *\n   *   Nested calls to @FT_Incremental_GetGlyphDataFunc can happen for\n   *   compound glyphs.\n   *\n   */\n  typedef FT_Error\n  (*FT_Incremental_GetGlyphDataFunc)( FT_Incremental  incremental,\n                                      FT_UInt         glyph_index,\n                                      FT_Data*        adata );\n\n\n  /***************************************************************************\n   *\n   * @type:\n   *   FT_Incremental_FreeGlyphDataFunc\n   *\n   * @description:\n   *   A function used to release the glyph data bytes returned by a\n   *   successful call to @FT_Incremental_GetGlyphDataFunc.\n   *\n   * @input:\n   *   incremental ::\n   *     A handle to an opaque @FT_Incremental handle provided by the client\n   *     application.\n   *\n   *   data ::\n   *     A structure describing the glyph data bytes (which will be accessed\n   *     as a read-only byte block).\n   *\n   */\n  typedef void\n  (*FT_Incremental_FreeGlyphDataFunc)( FT_Incremental  incremental,\n                                       FT_Data*        data );\n\n\n  /***************************************************************************\n   *\n   * @type:\n   *   FT_Incremental_GetGlyphMetricsFunc\n   *\n   * @description:\n   *   A function used to retrieve the basic metrics of a given glyph index\n   *   before accessing its data.  This is necessary because, in certain\n   *   formats like TrueType, the metrics are stored in a different place from\n   *   the glyph images proper.\n   *\n   * @input:\n   *   incremental ::\n   *     A handle to an opaque @FT_Incremental handle provided by the client\n   *     application.\n   *\n   *   glyph_index ::\n   *     Index of relevant glyph.\n   *\n   *   vertical ::\n   *     If true, return vertical metrics.\n   *\n   *   ametrics ::\n   *     This parameter is used for both input and output.\n   *     The original glyph metrics, if any, in font units.  If metrics are\n   *     not available all the values must be set to zero.\n   *\n   * @output:\n   *   ametrics ::\n   *     The replacement glyph metrics in font units.\n   *\n   */\n  typedef FT_Error\n  (*FT_Incremental_GetGlyphMetricsFunc)\n                      ( FT_Incremental              incremental,\n                        FT_UInt                     glyph_index,\n                        FT_Bool                     vertical,\n                        FT_Incremental_MetricsRec  *ametrics );\n\n\n  /**************************************************************************\n   *\n   * @struct:\n   *   FT_Incremental_FuncsRec\n   *\n   * @description:\n   *   A table of functions for accessing fonts that load data\n   *   incrementally.  Used in @FT_Incremental_InterfaceRec.\n   *\n   * @fields:\n   *   get_glyph_data ::\n   *     The function to get glyph data.  Must not be null.\n   *\n   *   free_glyph_data ::\n   *     The function to release glyph data.  Must not be null.\n   *\n   *   get_glyph_metrics ::\n   *     The function to get glyph metrics.  May be null if the font does\n   *     not provide overriding glyph metrics.\n   *\n   */\n  typedef struct  FT_Incremental_FuncsRec_\n  {\n    FT_Incremental_GetGlyphDataFunc     get_glyph_data;\n    FT_Incremental_FreeGlyphDataFunc    free_glyph_data;\n    FT_Incremental_GetGlyphMetricsFunc  get_glyph_metrics;\n\n  } FT_Incremental_FuncsRec;\n\n\n  /***************************************************************************\n   *\n   * @struct:\n   *   FT_Incremental_InterfaceRec\n   *\n   * @description:\n   *   A structure to be used with @FT_Open_Face to indicate that the user\n   *   wants to support incremental glyph loading.  You should use it with\n   *   @FT_PARAM_TAG_INCREMENTAL as in the following example:\n   *\n   *     {\n   *       FT_Incremental_InterfaceRec  inc_int;\n   *       FT_Parameter                 parameter;\n   *       FT_Open_Args                 open_args;\n   *\n   *\n   *       // set up incremental descriptor\n   *       inc_int.funcs  = my_funcs;\n   *       inc_int.object = my_object;\n   *\n   *       // set up optional parameter\n   *       parameter.tag  = FT_PARAM_TAG_INCREMENTAL;\n   *       parameter.data = &inc_int;\n   *\n   *       // set up FT_Open_Args structure\n   *       open_args.flags      = FT_OPEN_PATHNAME | FT_OPEN_PARAMS;\n   *       open_args.pathname   = my_font_pathname;\n   *       open_args.num_params = 1;\n   *       open_args.params     = &parameter; // we use one optional argument\n   *\n   *       // open the font\n   *       error = FT_Open_Face( library, &open_args, index, &face );\n   *       ...\n   *     }\n   *\n   */\n  typedef struct  FT_Incremental_InterfaceRec_\n  {\n    const FT_Incremental_FuncsRec*  funcs;\n    FT_Incremental                  object;\n\n  } FT_Incremental_InterfaceRec;\n\n\n  /***************************************************************************\n   *\n   * @type:\n   *   FT_Incremental_Interface\n   *\n   * @description:\n   *   A pointer to an @FT_Incremental_InterfaceRec structure.\n   *\n   */\n  typedef FT_Incremental_InterfaceRec*   FT_Incremental_Interface;\n\n\n  /***************************************************************************\n   *\n   * @constant:\n   *   FT_PARAM_TAG_INCREMENTAL\n   *\n   * @description:\n   *   A constant used as the tag of @FT_Parameter structures to indicate\n   *   an incremental loading object to be used by FreeType.\n   *\n   */\n#define FT_PARAM_TAG_INCREMENTAL  FT_MAKE_TAG( 'i', 'n', 'c', 'r' )\n\n  /* */\n\nFT_END_HEADER\n\n#endif /* __FTINCREM_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftlcdfil.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftlcdfil.h                                                             */\n/*                                                                         */\n/*    FreeType API for color filtering of subpixel bitmap glyphs           */\n/*    (specification).                                                     */\n/*                                                                         */\n/*  Copyright 2006, 2007, 2008, 2010 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FT_LCD_FILTER_H__\n#define __FT_LCD_FILTER_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n  /***************************************************************************\n   *\n   * @section:\n   *   lcd_filtering\n   *\n   * @title:\n   *   LCD Filtering\n   *\n   * @abstract:\n   *   Reduce color fringes of LCD-optimized bitmaps.\n   *\n   * @description:\n   *   The @FT_Library_SetLcdFilter API can be used to specify a low-pass\n   *   filter which is then applied to LCD-optimized bitmaps generated\n   *   through @FT_Render_Glyph.  This is useful to reduce color fringes\n   *   which would occur with unfiltered rendering.\n   *\n   *   Note that no filter is active by default, and that this function is\n   *   *not* implemented in default builds of the library.  You need to\n   *   #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING in your `ftoption.h' file\n   *   in order to activate it.\n   *\n   *   FreeType generates alpha coverage maps, which are linear by nature.\n   *   For instance, the value 0x80 in bitmap representation means that\n   *   (within numerical precision) 0x80/0xff fraction of that pixel is\n   *   covered by the glyph's outline.  The blending function for placing\n   *   text over a background is\n   *\n   *   {\n   *     dst = alpha * src + (1 - alpha) * dst    ,\n   *   }\n   *\n   *   which is known as OVER.  However, when calculating the output of the\n   *   OVER operator, the source colors should first be transformed to a\n   *   linear color space, then alpha blended in that space, and transformed\n   *   back to the output color space.\n   *\n   *   When linear light blending is used, the default FIR5 filtering\n   *   weights (as given by FT_LCD_FILTER_DEFAULT) are no longer optimal, as\n   *   they have been designed for black on white rendering while lacking\n   *   gamma correction.  To preserve color neutrality, weights for a FIR5\n   *   filter should be chosen according to two free parameters `a' and `c',\n   *   and the FIR weights should be\n   *\n   *   {\n   *     [a - c, a + c, 2 * a, a + c, a - c]    .\n   *   }\n   *\n   *   This formula generates equal weights for all the color primaries\n   *   across the filter kernel, which makes it colorless.  One suggested\n   *   set of weights is\n   *\n   *   {\n   *     [0x10, 0x50, 0x60, 0x50, 0x10]    ,\n   *   }\n   *\n   *   where `a' has value 0x30 and `b' value 0x20.  The weights in filter\n   *   may have a sum larger than 0x100, which increases coloration slightly\n   *   but also improves contrast.\n   */\n\n\n  /****************************************************************************\n   *\n   * @enum:\n   *   FT_LcdFilter\n   *\n   * @description:\n   *   A list of values to identify various types of LCD filters.\n   *\n   * @values:\n   *   FT_LCD_FILTER_NONE ::\n   *     Do not perform filtering.  When used with subpixel rendering, this\n   *     results in sometimes severe color fringes.\n   *\n   *   FT_LCD_FILTER_DEFAULT ::\n   *     The default filter reduces color fringes considerably, at the cost\n   *     of a slight blurriness in the output.\n   *\n   *   FT_LCD_FILTER_LIGHT ::\n   *     The light filter is a variant that produces less blurriness at the\n   *     cost of slightly more color fringes than the default one.  It might\n   *     be better, depending on taste, your monitor, or your personal vision.\n   *\n   *   FT_LCD_FILTER_LEGACY ::\n   *     This filter corresponds to the original libXft color filter.  It\n   *     provides high contrast output but can exhibit really bad color\n   *     fringes if glyphs are not extremely well hinted to the pixel grid.\n   *     In other words, it only works well if the TrueType bytecode\n   *     interpreter is enabled *and* high-quality hinted fonts are used.\n   *\n   *     This filter is only provided for comparison purposes, and might be\n   *     disabled or stay unsupported in the future.\n   *\n   * @since:\n   *   2.3.0\n   */\n  typedef enum  FT_LcdFilter_\n  {\n    FT_LCD_FILTER_NONE    = 0,\n    FT_LCD_FILTER_DEFAULT = 1,\n    FT_LCD_FILTER_LIGHT   = 2,\n    FT_LCD_FILTER_LEGACY  = 16,\n\n    FT_LCD_FILTER_MAX   /* do not remove */\n\n  } FT_LcdFilter;\n\n\n  /**************************************************************************\n   *\n   * @func:\n   *   FT_Library_SetLcdFilter\n   *\n   * @description:\n   *   This function is used to apply color filtering to LCD decimated\n   *   bitmaps, like the ones used when calling @FT_Render_Glyph with\n   *   @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V.\n   *\n   * @input:\n   *   library ::\n   *     A handle to the target library instance.\n   *\n   *   filter ::\n   *     The filter type.\n   *\n   *     You can use @FT_LCD_FILTER_NONE here to disable this feature, or\n   *     @FT_LCD_FILTER_DEFAULT to use a default filter that should work\n   *     well on most LCD screens.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   This feature is always disabled by default.  Clients must make an\n   *   explicit call to this function with a `filter' value other than\n   *   @FT_LCD_FILTER_NONE in order to enable it.\n   *\n   *   Due to *PATENTS* covering subpixel rendering, this function doesn't\n   *   do anything except returning `FT_Err_Unimplemented_Feature' if the\n   *   configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not\n   *   defined in your build of the library, which should correspond to all\n   *   default builds of FreeType.\n   *\n   *   The filter affects glyph bitmaps rendered through @FT_Render_Glyph,\n   *   @FT_Outline_Get_Bitmap, @FT_Load_Glyph, and @FT_Load_Char.\n   *\n   *   It does _not_ affect the output of @FT_Outline_Render and\n   *   @FT_Outline_Get_Bitmap.\n   *\n   *   If this feature is activated, the dimensions of LCD glyph bitmaps are\n   *   either larger or taller than the dimensions of the corresponding\n   *   outline with regards to the pixel grid.  For example, for\n   *   @FT_RENDER_MODE_LCD, the filter adds up to 3~pixels to the left, and\n   *   up to 3~pixels to the right.\n   *\n   *   The bitmap offset values are adjusted correctly, so clients shouldn't\n   *   need to modify their layout and glyph positioning code when enabling\n   *   the filter.\n   *\n   * @since:\n   *   2.3.0\n   */\n  FT_EXPORT( FT_Error )\n  FT_Library_SetLcdFilter( FT_Library    library,\n                           FT_LcdFilter  filter );\n\n\n  /**************************************************************************\n   *\n   * @func:\n   *   FT_Library_SetLcdFilterWeights\n   *\n   * @description:\n   *   Use this function to override the filter weights selected by\n   *   @FT_Library_SetLcdFilter.  By default, FreeType uses the quintuple\n   *   (0x00, 0x55, 0x56, 0x55, 0x00) for FT_LCD_FILTER_LIGHT, and (0x10,\n   *   0x40, 0x70, 0x40, 0x10) for FT_LCD_FILTER_DEFAULT and\n   *   FT_LCD_FILTER_LEGACY.\n   *\n   * @input:\n   *   library ::\n   *     A handle to the target library instance.\n   *\n   *   weights ::\n   *     A pointer to an array; the function copies the first five bytes and\n   *     uses them to specify the filter weights.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   Due to *PATENTS* covering subpixel rendering, this function doesn't\n   *   do anything except returning `FT_Err_Unimplemented_Feature' if the\n   *   configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not\n   *   defined in your build of the library, which should correspond to all\n   *   default builds of FreeType.\n   *\n   *   This function must be called after @FT_Library_SetLcdFilter to have\n   *   any effect.\n   *\n   * @since:\n   *   2.4.0\n   */\n  FT_EXPORT( FT_Error )\n  FT_Library_SetLcdFilterWeights( FT_Library      library,\n                                  unsigned char  *weights );\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FT_LCD_FILTER_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftlist.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftlist.h                                                               */\n/*                                                                         */\n/*    Generic list support for FreeType (specification).                   */\n/*                                                                         */\n/*  Copyright 1996-2001, 2003, 2007, 2010 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  This file implements functions relative to list processing.  Its     */\n  /*  data structures are defined in `freetype.h'.                         */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTLIST_H__\n#define __FTLIST_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    list_processing                                                    */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    List Processing                                                    */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Simple management of lists.                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains various definitions related to list          */\n  /*    processing using doubly-linked nodes.                              */\n  /*                                                                       */\n  /* <Order>                                                               */\n  /*    FT_List                                                            */\n  /*    FT_ListNode                                                        */\n  /*    FT_ListRec                                                         */\n  /*    FT_ListNodeRec                                                     */\n  /*                                                                       */\n  /*    FT_List_Add                                                        */\n  /*    FT_List_Insert                                                     */\n  /*    FT_List_Find                                                       */\n  /*    FT_List_Remove                                                     */\n  /*    FT_List_Up                                                         */\n  /*    FT_List_Iterate                                                    */\n  /*    FT_List_Iterator                                                   */\n  /*    FT_List_Finalize                                                   */\n  /*    FT_List_Destructor                                                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_List_Find                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Find the list node for a given listed object.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    list :: A pointer to the parent list.                              */\n  /*    data :: The address of the listed object.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    List node.  NULL if it wasn't found.                               */\n  /*                                                                       */\n  FT_EXPORT( FT_ListNode )\n  FT_List_Find( FT_List  list,\n                void*    data );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_List_Add                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Append an element to the end of a list.                            */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    list :: A pointer to the parent list.                              */\n  /*    node :: The node to append.                                        */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_List_Add( FT_List      list,\n               FT_ListNode  node );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_List_Insert                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Insert an element at the head of a list.                           */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    list :: A pointer to parent list.                                  */\n  /*    node :: The node to insert.                                        */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_List_Insert( FT_List      list,\n                  FT_ListNode  node );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_List_Remove                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Remove a node from a list.  This function doesn't check whether    */\n  /*    the node is in the list!                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    node :: The node to remove.                                        */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    list :: A pointer to the parent list.                              */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_List_Remove( FT_List      list,\n                  FT_ListNode  node );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_List_Up                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Move a node to the head/top of a list.  Used to maintain LRU       */\n  /*    lists.                                                             */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    list :: A pointer to the parent list.                              */\n  /*    node :: The node to move.                                          */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_List_Up( FT_List      list,\n              FT_ListNode  node );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_List_Iterator                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An FT_List iterator function which is called during a list parse   */\n  /*    by @FT_List_Iterate.                                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    node :: The current iteration list node.                           */\n  /*                                                                       */\n  /*    user :: A typeless pointer passed to @FT_List_Iterate.             */\n  /*            Can be used to point to the iteration's state.             */\n  /*                                                                       */\n  typedef FT_Error\n  (*FT_List_Iterator)( FT_ListNode  node,\n                       void*        user );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_List_Iterate                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Parse a list and calls a given iterator function on each element.  */\n  /*    Note that parsing is stopped as soon as one of the iterator calls  */\n  /*    returns a non-zero value.                                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    list     :: A handle to the list.                                  */\n  /*    iterator :: An iterator function, called on each node of the list. */\n  /*    user     :: A user-supplied field which is passed as the second    */\n  /*                argument to the iterator.                              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result (a FreeType error code) of the last iterator call.      */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_List_Iterate( FT_List           list,\n                   FT_List_Iterator  iterator,\n                   void*             user );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_List_Destructor                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An @FT_List iterator function which is called during a list        */\n  /*    finalization by @FT_List_Finalize to destroy all elements in a     */\n  /*    given list.                                                        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    system :: The current system object.                               */\n  /*                                                                       */\n  /*    data   :: The current object to destroy.                           */\n  /*                                                                       */\n  /*    user   :: A typeless pointer passed to @FT_List_Iterate.  It can   */\n  /*              be used to point to the iteration's state.               */\n  /*                                                                       */\n  typedef void\n  (*FT_List_Destructor)( FT_Memory  memory,\n                         void*      data,\n                         void*      user );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_List_Finalize                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Destroy all elements in the list as well as the list itself.       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    list    :: A handle to the list.                                   */\n  /*                                                                       */\n  /*    destroy :: A list destructor that will be applied to each element  */\n  /*               of the list.                                            */\n  /*                                                                       */\n  /*    memory  :: The current memory object which handles deallocation.   */\n  /*                                                                       */\n  /*    user    :: A user-supplied field which is passed as the last       */\n  /*               argument to the destructor.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function expects that all nodes added by @FT_List_Add or      */\n  /*    @FT_List_Insert have been dynamically allocated.                   */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_List_Finalize( FT_List             list,\n                    FT_List_Destructor  destroy,\n                    FT_Memory           memory,\n                    void*               user );\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTLIST_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftlzw.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftlzw.h                                                                */\n/*                                                                         */\n/*    LZW-compressed stream support.                                       */\n/*                                                                         */\n/*  Copyright 2004, 2006 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTLZW_H__\n#define __FTLZW_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    lzw                                                                */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    LZW Streams                                                        */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Using LZW-compressed font files.                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of LZW-specific functions.   */\n  /*                                                                       */\n  /*************************************************************************/\n\n /************************************************************************\n  *\n  * @function:\n  *   FT_Stream_OpenLZW\n  *\n  * @description:\n  *   Open a new stream to parse LZW-compressed font files.  This is\n  *   mainly used to support the compressed `*.pcf.Z' fonts that come\n  *   with XFree86.\n  *\n  * @input:\n  *   stream :: The target embedding stream.\n  *\n  *   source :: The source stream.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   The source stream must be opened _before_ calling this function.\n  *\n  *   Calling the internal function `FT_Stream_Close' on the new stream will\n  *   *not* call `FT_Stream_Close' on the source stream.  None of the stream\n  *   objects will be released to the heap.\n  *\n  *   The stream implementation is very basic and resets the decompression\n  *   process each time seeking backwards is needed within the stream\n  *\n  *   In certain builds of the library, LZW compression recognition is\n  *   automatically handled when calling @FT_New_Face or @FT_Open_Face.\n  *   This means that if no font driver is capable of handling the raw\n  *   compressed file, the library will try to open a LZW stream from it\n  *   and re-open the face with it.\n  *\n  *   This function may return `FT_Err_Unimplemented_Feature' if your build\n  *   of FreeType was not compiled with LZW support.\n  */\n  FT_EXPORT( FT_Error )\n  FT_Stream_OpenLZW( FT_Stream  stream,\n                     FT_Stream  source );\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTLZW_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftmac.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftmac.h                                                                */\n/*                                                                         */\n/*    Additional Mac-specific API.                                         */\n/*                                                                         */\n/*  Copyright 1996-2001, 2004, 2006, 2007 by                               */\n/*  Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg.     */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n/***************************************************************************/\n/*                                                                         */\n/* NOTE: Include this file after <freetype/freetype.h> and after any       */\n/*       Mac-specific headers (because this header uses Mac types such as  */\n/*       Handle, FSSpec, FSRef, etc.)                                      */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTMAC_H__\n#define __FTMAC_H__\n\n\n#include \"../ft2build.h\"\n\n\nFT_BEGIN_HEADER\n\n\n/* gcc-3.4.1 and later can warn about functions tagged as deprecated */\n#ifndef FT_DEPRECATED_ATTRIBUTE\n#if defined(__GNUC__)                                               && \\\n    ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)))\n#define FT_DEPRECATED_ATTRIBUTE  __attribute__((deprecated))\n#else\n#define FT_DEPRECATED_ATTRIBUTE\n#endif\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    mac_specific                                                       */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Mac Specific Interface                                             */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Only available on the Macintosh.                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The following definitions are only available if FreeType is        */\n  /*    compiled on a Macintosh.                                           */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Face_From_FOND                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a new face object from a FOND resource.                     */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library    :: A handle to the library resource.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    fond       :: A FOND resource.                                     */\n  /*                                                                       */\n  /*    face_index :: Only supported for the -1 `sanity check' special     */\n  /*                  case.                                                */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aface      :: A handle to a new face object.                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Notes>                                                               */\n  /*    This function can be used to create @FT_Face objects from fonts    */\n  /*    that are installed in the system as follows.                       */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      fond = GetResource( 'FOND', fontName );                          */\n  /*      error = FT_New_Face_From_FOND( library, fond, 0, &face );        */\n  /*    }                                                                  */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_New_Face_From_FOND( FT_Library  library,\n                         Handle      fond,\n                         FT_Long     face_index,\n                         FT_Face    *aface )\n                       FT_DEPRECATED_ATTRIBUTE;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_GetFile_From_Mac_Name                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return an FSSpec for the disk file containing the named font.      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    fontName   :: Mac OS name of the font (e.g., Times New Roman       */\n  /*                  Bold).                                               */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    pathSpec   :: FSSpec to the file.  For passing to                  */\n  /*                  @FT_New_Face_From_FSSpec.                            */\n  /*                                                                       */\n  /*    face_index :: Index of the face.  For passing to                   */\n  /*                  @FT_New_Face_From_FSSpec.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_GetFile_From_Mac_Name( const char*  fontName,\n                            FSSpec*      pathSpec,\n                            FT_Long*     face_index )\n                          FT_DEPRECATED_ATTRIBUTE;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_GetFile_From_Mac_ATS_Name                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return an FSSpec for the disk file containing the named font.      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    fontName   :: Mac OS name of the font in ATS framework.            */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    pathSpec   :: FSSpec to the file. For passing to                   */\n  /*                  @FT_New_Face_From_FSSpec.                            */\n  /*                                                                       */\n  /*    face_index :: Index of the face. For passing to                    */\n  /*                  @FT_New_Face_From_FSSpec.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_GetFile_From_Mac_ATS_Name( const char*  fontName,\n                                FSSpec*      pathSpec,\n                                FT_Long*     face_index )\n                              FT_DEPRECATED_ATTRIBUTE;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_GetFilePath_From_Mac_ATS_Name                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return a pathname of the disk file and face index for given font   */\n  /*    name which is handled by ATS framework.                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    fontName    :: Mac OS name of the font in ATS framework.           */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    path        :: Buffer to store pathname of the file.  For passing  */\n  /*                   to @FT_New_Face.  The client must allocate this     */\n  /*                   buffer before calling this function.                */\n  /*                                                                       */\n  /*    maxPathSize :: Lengths of the buffer `path' that client allocated. */\n  /*                                                                       */\n  /*    face_index  :: Index of the face.  For passing to @FT_New_Face.    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_GetFilePath_From_Mac_ATS_Name( const char*  fontName,\n                                    UInt8*       path,\n                                    UInt32       maxPathSize,\n                                    FT_Long*     face_index )\n                                  FT_DEPRECATED_ATTRIBUTE;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Face_From_FSSpec                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a new face object from a given resource and typeface index  */\n  /*    using an FSSpec to the font file.                                  */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library    :: A handle to the library resource.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    spec       :: FSSpec to the font file.                             */\n  /*                                                                       */\n  /*    face_index :: The index of the face within the resource.  The      */\n  /*                  first face has index~0.                              */\n  /* <Output>                                                              */\n  /*    aface      :: A handle to a new face object.                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    @FT_New_Face_From_FSSpec is identical to @FT_New_Face except       */\n  /*    it accepts an FSSpec instead of a path.                            */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_New_Face_From_FSSpec( FT_Library     library,\n                           const FSSpec  *spec,\n                           FT_Long        face_index,\n                           FT_Face       *aface )\n                         FT_DEPRECATED_ATTRIBUTE;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Face_From_FSRef                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a new face object from a given resource and typeface index  */\n  /*    using an FSRef to the font file.                                   */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library    :: A handle to the library resource.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    spec       :: FSRef to the font file.                              */\n  /*                                                                       */\n  /*    face_index :: The index of the face within the resource.  The      */\n  /*                  first face has index~0.                              */\n  /* <Output>                                                              */\n  /*    aface      :: A handle to a new face object.                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    @FT_New_Face_From_FSRef is identical to @FT_New_Face except        */\n  /*    it accepts an FSRef instead of a path.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_New_Face_From_FSRef( FT_Library    library,\n                          const FSRef  *ref,\n                          FT_Long       face_index,\n                          FT_Face      *aface )\n                        FT_DEPRECATED_ATTRIBUTE;\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __FTMAC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftmm.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftmm.h                                                                 */\n/*                                                                         */\n/*    FreeType Multiple Master font interface (specification).             */\n/*                                                                         */\n/*  Copyright 1996-2001, 2003, 2004, 2006, 2009 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTMM_H__\n#define __FTMM_H__\n\n\n#include \"../ft2build.h\"\n#include \"t1tables.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    multiple_masters                                                   */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Multiple Masters                                                   */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    How to manage Multiple Masters fonts.                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The following types and functions are used to manage Multiple      */\n  /*    Master fonts, i.e., the selection of specific design instances by  */\n  /*    setting design axis coordinates.                                   */\n  /*                                                                       */\n  /*    George Williams has extended this interface to make it work with   */\n  /*    both Type~1 Multiple Masters fonts and GX distortable (var)        */\n  /*    fonts.  Some of these routines only work with MM fonts, others     */\n  /*    will work with both types.  They are similar enough that a         */\n  /*    consistent interface makes sense.                                  */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_MM_Axis                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple structure used to model a given axis in design space for  */\n  /*    Multiple Masters fonts.                                            */\n  /*                                                                       */\n  /*    This structure can't be used for GX var fonts.                     */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    name    :: The axis's name.                                        */\n  /*                                                                       */\n  /*    minimum :: The axis's minimum design coordinate.                   */\n  /*                                                                       */\n  /*    maximum :: The axis's maximum design coordinate.                   */\n  /*                                                                       */\n  typedef struct  FT_MM_Axis_\n  {\n    FT_String*  name;\n    FT_Long     minimum;\n    FT_Long     maximum;\n\n  } FT_MM_Axis;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Multi_Master                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model the axes and space of a Multiple Masters */\n  /*    font.                                                              */\n  /*                                                                       */\n  /*    This structure can't be used for GX var fonts.                     */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    num_axis    :: Number of axes.  Cannot exceed~4.                   */\n  /*                                                                       */\n  /*    num_designs :: Number of designs; should be normally 2^num_axis    */\n  /*                   even though the Type~1 specification strangely      */\n  /*                   allows for intermediate designs to be present. This */\n  /*                   number cannot exceed~16.                            */\n  /*                                                                       */\n  /*    axis        :: A table of axis descriptors.                        */\n  /*                                                                       */\n  typedef struct  FT_Multi_Master_\n  {\n    FT_UInt     num_axis;\n    FT_UInt     num_designs;\n    FT_MM_Axis  axis[T1_MAX_MM_AXIS];\n\n  } FT_Multi_Master;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Var_Axis                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple structure used to model a given axis in design space for  */\n  /*    Multiple Masters and GX var fonts.                                 */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    name    :: The axis's name.                                        */\n  /*               Not always meaningful for GX.                           */\n  /*                                                                       */\n  /*    minimum :: The axis's minimum design coordinate.                   */\n  /*                                                                       */\n  /*    def     :: The axis's default design coordinate.                   */\n  /*               FreeType computes meaningful default values for MM; it  */\n  /*               is then an integer value, not in 16.16 format.          */\n  /*                                                                       */\n  /*    maximum :: The axis's maximum design coordinate.                   */\n  /*                                                                       */\n  /*    tag     :: The axis's tag (the GX equivalent to `name').           */\n  /*               FreeType provides default values for MM if possible.    */\n  /*                                                                       */\n  /*    strid   :: The entry in `name' table (another GX version of        */\n  /*               `name').                                                */\n  /*               Not meaningful for MM.                                  */\n  /*                                                                       */\n  typedef struct  FT_Var_Axis_\n  {\n    FT_String*  name;\n\n    FT_Fixed    minimum;\n    FT_Fixed    def;\n    FT_Fixed    maximum;\n\n    FT_ULong    tag;\n    FT_UInt     strid;\n\n  } FT_Var_Axis;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Var_Named_Style                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple structure used to model a named style in a GX var font.   */\n  /*                                                                       */\n  /*    This structure can't be used for MM fonts.                         */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    coords :: The design coordinates for this style.                   */\n  /*              This is an array with one entry for each axis.           */\n  /*                                                                       */\n  /*    strid  :: The entry in `name' table identifying this style.        */\n  /*                                                                       */\n  typedef struct  FT_Var_Named_Style_\n  {\n    FT_Fixed*  coords;\n    FT_UInt    strid;\n\n  } FT_Var_Named_Style;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_MM_Var                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model the axes and space of a Multiple Masters */\n  /*    or GX var distortable font.                                        */\n  /*                                                                       */\n  /*    Some fields are specific to one format and not to the other.       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    num_axis        :: The number of axes.  The maximum value is~4 for */\n  /*                       MM; no limit in GX.                             */\n  /*                                                                       */\n  /*    num_designs     :: The number of designs; should be normally       */\n  /*                       2^num_axis for MM fonts.  Not meaningful for GX */\n  /*                       (where every glyph could have a different       */\n  /*                       number of designs).                             */\n  /*                                                                       */\n  /*    num_namedstyles :: The number of named styles; only meaningful for */\n  /*                       GX which allows certain design coordinates to   */\n  /*                       have a string ID (in the `name' table)          */\n  /*                       associated with them.  The font can tell the    */\n  /*                       user that, for example, Weight=1.5 is `Bold'.   */\n  /*                                                                       */\n  /*    axis            :: A table of axis descriptors.                    */\n  /*                       GX fonts contain slightly more data than MM.    */\n  /*                                                                       */\n  /*    namedstyles     :: A table of named styles.                        */\n  /*                       Only meaningful with GX.                        */\n  /*                                                                       */\n  typedef struct  FT_MM_Var_\n  {\n    FT_UInt              num_axis;\n    FT_UInt              num_designs;\n    FT_UInt              num_namedstyles;\n    FT_Var_Axis*         axis;\n    FT_Var_Named_Style*  namedstyle;\n\n  } FT_MM_Var;\n\n\n  /* */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Multi_Master                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the Multiple Master descriptor of a given font.           */\n  /*                                                                       */\n  /*    This function can't be used with GX fonts.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face    :: A handle to the source face.                            */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    amaster :: The Multiple Masters descriptor.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_Multi_Master( FT_Face           face,\n                       FT_Multi_Master  *amaster );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_MM_Var                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the Multiple Master/GX var descriptor of a given font.    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face    :: A handle to the source face.                            */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    amaster :: The Multiple Masters/GX var descriptor.                 */\n  /*               Allocates a data structure, which the user must free    */\n  /*               (a single call to FT_FREE will do it).                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_MM_Var( FT_Face      face,\n                 FT_MM_Var*  *amaster );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_MM_Design_Coordinates                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    For Multiple Masters fonts, choose an interpolated font design     */\n  /*    through design coordinates.                                        */\n  /*                                                                       */\n  /*    This function can't be used with GX fonts.                         */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face       :: A handle to the source face.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    num_coords :: The number of design coordinates (must be equal to   */\n  /*                  the number of axes in the font).                     */\n  /*                                                                       */\n  /*    coords     :: An array of design coordinates.                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Set_MM_Design_Coordinates( FT_Face   face,\n                                FT_UInt   num_coords,\n                                FT_Long*  coords );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_Var_Design_Coordinates                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    For Multiple Master or GX Var fonts, choose an interpolated font   */\n  /*    design through design coordinates.                                 */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face       :: A handle to the source face.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    num_coords :: The number of design coordinates (must be equal to   */\n  /*                  the number of axes in the font).                     */\n  /*                                                                       */\n  /*    coords     :: An array of design coordinates.                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Set_Var_Design_Coordinates( FT_Face    face,\n                                 FT_UInt    num_coords,\n                                 FT_Fixed*  coords );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_MM_Blend_Coordinates                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    For Multiple Masters and GX var fonts, choose an interpolated font */\n  /*    design through normalized blend coordinates.                       */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face       :: A handle to the source face.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    num_coords :: The number of design coordinates (must be equal to   */\n  /*                  the number of axes in the font).                     */\n  /*                                                                       */\n  /*    coords     :: The design coordinates array (each element must be   */\n  /*                  between 0 and 1.0).                                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Set_MM_Blend_Coordinates( FT_Face    face,\n                               FT_UInt    num_coords,\n                               FT_Fixed*  coords );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_Var_Blend_Coordinates                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This is another name of @FT_Set_MM_Blend_Coordinates.              */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Set_Var_Blend_Coordinates( FT_Face    face,\n                                FT_UInt    num_coords,\n                                FT_Fixed*  coords );\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTMM_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftmodapi.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftmodapi.h                                                             */\n/*                                                                         */\n/*    FreeType modules public interface (specification).                   */\n/*                                                                         */\n/*  Copyright 1996-2003, 2006, 2008-2010, 2012, 2013 by                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTMODAPI_H__\n#define __FTMODAPI_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    module_management                                                  */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Module Management                                                  */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    How to add, upgrade, remove, and control modules from FreeType.    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The definitions below are used to manage modules within FreeType.  */\n  /*    Modules can be added, upgraded, and removed at runtime.            */\n  /*    Additionally, some module properties can be controlled also.       */\n  /*                                                                       */\n  /*    Here is a list of possible values of the `module_name' field in    */\n  /*    the @FT_Module_Class structure.                                    */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      autofitter                                                       */\n  /*      bdf                                                              */\n  /*      cff                                                              */\n  /*      gxvalid                                                          */\n  /*      otvalid                                                          */\n  /*      pcf                                                              */\n  /*      pfr                                                              */\n  /*      psaux                                                            */\n  /*      pshinter                                                         */\n  /*      psnames                                                          */\n  /*      raster1, raster5                                                 */\n  /*      sfnt                                                             */\n  /*      smooth, smooth-lcd, smooth-lcdv                                  */\n  /*      truetype                                                         */\n  /*      type1                                                            */\n  /*      type42                                                           */\n  /*      t1cid                                                            */\n  /*      winfonts                                                         */\n  /*    }                                                                  */\n  /*                                                                       */\n  /*    Note that the FreeType Cache sub-system is not a FreeType module.  */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* module bit flags */\n#define FT_MODULE_FONT_DRIVER         1  /* this module is a font driver  */\n#define FT_MODULE_RENDERER            2  /* this module is a renderer     */\n#define FT_MODULE_HINTER              4  /* this module is a glyph hinter */\n#define FT_MODULE_STYLER              8  /* this module is a styler       */\n\n#define FT_MODULE_DRIVER_SCALABLE     0x100   /* the driver supports      */\n                                              /* scalable fonts           */\n#define FT_MODULE_DRIVER_NO_OUTLINES  0x200   /* the driver does not      */\n                                              /* support vector outlines  */\n#define FT_MODULE_DRIVER_HAS_HINTER   0x400   /* the driver provides its  */\n                                              /* own hinter               */\n\n\n  /* deprecated values */\n#define ft_module_font_driver         FT_MODULE_FONT_DRIVER\n#define ft_module_renderer            FT_MODULE_RENDERER\n#define ft_module_hinter              FT_MODULE_HINTER\n#define ft_module_styler              FT_MODULE_STYLER\n\n#define ft_module_driver_scalable     FT_MODULE_DRIVER_SCALABLE\n#define ft_module_driver_no_outlines  FT_MODULE_DRIVER_NO_OUTLINES\n#define ft_module_driver_has_hinter   FT_MODULE_DRIVER_HAS_HINTER\n\n\n  typedef FT_Pointer  FT_Module_Interface;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Module_Constructor                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to initialize (not create) a new module object.    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    module :: The module to initialize.                                */\n  /*                                                                       */\n  typedef FT_Error\n  (*FT_Module_Constructor)( FT_Module  module );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Module_Destructor                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to finalize (not destroy) a given module object.   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    module :: The module to finalize.                                  */\n  /*                                                                       */\n  typedef void\n  (*FT_Module_Destructor)( FT_Module  module );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Module_Requester                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to query a given module for a specific interface.  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    module :: The module to be searched.                               */\n  /*                                                                       */\n  /*    name ::   The name of the interface in the module.                 */\n  /*                                                                       */\n  typedef FT_Module_Interface\n  (*FT_Module_Requester)( FT_Module    module,\n                          const char*  name );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Module_Class                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The module class descriptor.                                       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    module_flags    :: Bit flags describing the module.                */\n  /*                                                                       */\n  /*    module_size     :: The size of one module object/instance in       */\n  /*                       bytes.                                          */\n  /*                                                                       */\n  /*    module_name     :: The name of the module.                         */\n  /*                                                                       */\n  /*    module_version  :: The version, as a 16.16 fixed number            */\n  /*                       (major.minor).                                  */\n  /*                                                                       */\n  /*    module_requires :: The version of FreeType this module requires,   */\n  /*                       as a 16.16 fixed number (major.minor).  Starts  */\n  /*                       at version 2.0, i.e., 0x20000.                  */\n  /*                                                                       */\n  /*    module_init     :: The initializing function.                      */\n  /*                                                                       */\n  /*    module_done     :: The finalizing function.                        */\n  /*                                                                       */\n  /*    get_interface   :: The interface requesting function.              */\n  /*                                                                       */\n  typedef struct  FT_Module_Class_\n  {\n    FT_ULong               module_flags;\n    FT_Long                module_size;\n    const FT_String*       module_name;\n    FT_Fixed               module_version;\n    FT_Fixed               module_requires;\n\n    const void*            module_interface;\n\n    FT_Module_Constructor  module_init;\n    FT_Module_Destructor   module_done;\n    FT_Module_Requester    get_interface;\n\n  } FT_Module_Class;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Add_Module                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Add a new module to a given library instance.                      */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library :: A handle to the library object.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    clazz   :: A pointer to class descriptor for the module.           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    An error will be returned if a module already exists by that name, */\n  /*    or if the module requires a version of FreeType that is too great. */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Add_Module( FT_Library              library,\n                 const FT_Module_Class*  clazz );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Module                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Find a module by its name.                                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library     :: A handle to the library object.                     */\n  /*                                                                       */\n  /*    module_name :: The module's name (as an ASCII string).             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A module handle.  0~if none was found.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    FreeType's internal modules aren't documented very well, and you   */\n  /*    should look up the source code for details.                        */\n  /*                                                                       */\n  FT_EXPORT( FT_Module )\n  FT_Get_Module( FT_Library   library,\n                 const char*  module_name );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Remove_Module                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Remove a given module from a library instance.                     */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library :: A handle to a library object.                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    module  :: A handle to a module object.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The module object is destroyed by the function in case of success. */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Remove_Module( FT_Library  library,\n                    FT_Module   module );\n\n\n  /**********************************************************************\n   *\n   * @function:\n   *    FT_Property_Set\n   *\n   * @description:\n   *    Set a property for a given module.\n   *\n   * @input:\n   *    library ::\n   *       A handle to the library the module is part of.\n   *\n   *    module_name ::\n   *       The module name.\n   *\n   *    property_name ::\n   *       The property name.  Properties are described in the `Synopsis'\n   *       subsection of the module's documentation.\n   *\n   *       Note that only a few modules have properties.\n   *\n   *    value ::\n   *       A generic pointer to a variable or structure which gives the new\n   *       value of the property.  The exact definition of `value' is\n   *       dependent on the property; see the `Synopsis' subsection of the\n   *       module's documentation.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *    If `module_name' isn't a valid module name, or `property_name'\n   *    doesn't specify a valid property, or if `value' doesn't represent a\n   *    valid value for the given property, an error is returned.\n   *\n   *    The following example sets property `bar' (a simple integer) in\n   *    module `foo' to value~1.\n   *\n   *    {\n   *      FT_UInt  bar;\n   *\n   *\n   *      bar = 1;\n   *      FT_Property_Set( library, \"foo\", \"bar\", &bar );\n   *    }\n   *\n   *    Note that the FreeType Cache sub-system doesn't recognize module\n   *    property changes.  To avoid glyph lookup confusion within the cache\n   *    you should call @FTC_Manager_Reset to completely flush the cache if\n   *    a module property gets changed after @FTC_Manager_New has been\n   *    called.\n   *\n   *    It is not possible to set properties of the FreeType Cache\n   *    sub-system itself with FT_Property_Set; use @FTC_Property_Set\n   *    instead.\n   *\n   *  @since:\n   *    2.4.11\n   *\n   */\n  FT_EXPORT( FT_Error )\n  FT_Property_Set( FT_Library        library,\n                   const FT_String*  module_name,\n                   const FT_String*  property_name,\n                   const void*       value );\n\n\n  /**********************************************************************\n   *\n   * @function:\n   *    FT_Property_Get\n   *\n   * @description:\n   *    Get a module's property value.\n   *\n   * @input:\n   *    library ::\n   *       A handle to the library the module is part of.\n   *\n   *    module_name ::\n   *       The module name.\n   *\n   *    property_name ::\n   *       The property name.  Properties are described in the `Synopsis'\n   *       subsection of the module's documentation.\n   *\n   * @inout:\n   *    value ::\n   *       A generic pointer to a variable or structure which gives the\n   *       value of the property.  The exact definition of `value' is\n   *       dependent on the property; see the `Synopsis' subsection of the\n   *       module's documentation.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *    If `module_name' isn't a valid module name, or `property_name'\n   *    doesn't specify a valid property, or if `value' doesn't represent a\n   *    valid value for the given property, an error is returned.\n   *\n   *    The following example gets property `baz' (a range) in module `foo'.\n   *\n   *    {\n   *      typedef  range_\n   *      {\n   *        FT_Int32  min;\n   *        FT_Int32  max;\n   *\n   *      } range;\n   *\n   *      range  baz;\n   *\n   *\n   *      FT_Property_Get( library, \"foo\", \"baz\", &baz );\n   *    }\n   *\n   *    It is not possible to retrieve properties of the FreeType Cache\n   *    sub-system with FT_Property_Get; use @FTC_Property_Get instead.\n   *\n   *  @since:\n   *    2.4.11\n   *\n   */\n  FT_EXPORT( FT_Error )\n  FT_Property_Get( FT_Library        library,\n                   const FT_String*  module_name,\n                   const FT_String*  property_name,\n                   void*             value );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Reference_Library                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A counter gets initialized to~1 at the time an @FT_Library         */\n  /*    structure is created.  This function increments the counter.       */\n  /*    @FT_Done_Library then only destroys a library if the counter is~1, */\n  /*    otherwise it simply decrements the counter.                        */\n  /*                                                                       */\n  /*    This function helps in managing life-cycles of structures which    */\n  /*    reference @FT_Library objects.                                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle to a target library object.                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.4.2                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Reference_Library( FT_Library  library );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Library                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function is used to create a new FreeType library instance    */\n  /*    from a given memory object.  It is thus possible to use libraries  */\n  /*    with distinct memory allocators within the same program.           */\n  /*                                                                       */\n  /*    Normally, you would call this function (followed by a call to      */\n  /*    @FT_Add_Default_Modules or a series of calls to @FT_Add_Module)    */\n  /*    instead of @FT_Init_FreeType to initialize the FreeType library.   */\n  /*                                                                       */\n  /*    Don't use @FT_Done_FreeType but @FT_Done_Library to destroy a      */\n  /*    library instance.                                                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory   :: A handle to the original memory object.                */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    alibrary :: A pointer to handle of a new library object.           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    See the discussion of reference counters in the description of     */\n  /*    @FT_Reference_Library.                                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_New_Library( FT_Memory    memory,\n                  FT_Library  *alibrary );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Done_Library                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Discard a given library object.  This closes all drivers and       */\n  /*    discards all resource objects.                                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle to the target library.                         */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    See the discussion of reference counters in the description of     */\n  /*    @FT_Reference_Library.                                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Done_Library( FT_Library  library );\n\n/* */\n\n  typedef void\n  (*FT_DebugHook_Func)( void*  arg );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_Debug_Hook                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Set a debug hook function for debugging the interpreter of a font  */\n  /*    format.                                                            */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library    :: A handle to the library object.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    hook_index :: The index of the debug hook.  You should use the     */\n  /*                  values defined in `ftobjs.h', e.g.,                  */\n  /*                  `FT_DEBUG_HOOK_TRUETYPE'.                            */\n  /*                                                                       */\n  /*    debug_hook :: The function used to debug the interpreter.          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Currently, four debug hook slots are available, but only two (for  */\n  /*    the TrueType and the Type~1 interpreter) are defined.              */\n  /*                                                                       */\n  /*    Since the internal headers of FreeType are no longer installed,    */\n  /*    the symbol `FT_DEBUG_HOOK_TRUETYPE' isn't available publicly.      */\n  /*    This is a bug and will be fixed in a forthcoming release.          */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Set_Debug_Hook( FT_Library         library,\n                     FT_UInt            hook_index,\n                     FT_DebugHook_Func  debug_hook );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Add_Default_Modules                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Add the set of default drivers to a given library object.          */\n  /*    This is only useful when you create a library object with          */\n  /*    @FT_New_Library (usually to plug a custom memory manager).         */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library :: A handle to a new library object.                       */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Add_Default_Modules( FT_Library  library );\n\n\n\n  /**************************************************************************\n   *\n   * @section:\n   *   truetype_engine\n   *\n   * @title:\n   *   The TrueType Engine\n   *\n   * @abstract:\n   *   TrueType bytecode support.\n   *\n   * @description:\n   *   This section contains a function used to query the level of TrueType\n   *   bytecode support compiled in this version of the library.\n   *\n   */\n\n\n  /**************************************************************************\n   *\n   *  @enum:\n   *     FT_TrueTypeEngineType\n   *\n   *  @description:\n   *     A list of values describing which kind of TrueType bytecode\n   *     engine is implemented in a given FT_Library instance.  It is used\n   *     by the @FT_Get_TrueType_Engine_Type function.\n   *\n   *  @values:\n   *     FT_TRUETYPE_ENGINE_TYPE_NONE ::\n   *       The library doesn't implement any kind of bytecode interpreter.\n   *\n   *     FT_TRUETYPE_ENGINE_TYPE_UNPATENTED ::\n   *       The library implements a bytecode interpreter that doesn't\n   *       support the patented operations of the TrueType virtual machine.\n   *\n   *       Its main use is to load certain Asian fonts which position and\n   *       scale glyph components with bytecode instructions.  It produces\n   *       bad output for most other fonts.\n   *\n   *     FT_TRUETYPE_ENGINE_TYPE_PATENTED ::\n   *       The library implements a bytecode interpreter that covers\n   *       the full instruction set of the TrueType virtual machine (this\n   *       was governed by patents until May 2010, hence the name).\n   *\n   *  @since:\n   *     2.2\n   *\n   */\n  typedef enum  FT_TrueTypeEngineType_\n  {\n    FT_TRUETYPE_ENGINE_TYPE_NONE = 0,\n    FT_TRUETYPE_ENGINE_TYPE_UNPATENTED,\n    FT_TRUETYPE_ENGINE_TYPE_PATENTED\n\n  } FT_TrueTypeEngineType;\n\n\n  /**************************************************************************\n   *\n   *  @func:\n   *     FT_Get_TrueType_Engine_Type\n   *\n   *  @description:\n   *     Return an @FT_TrueTypeEngineType value to indicate which level of\n   *     the TrueType virtual machine a given library instance supports.\n   *\n   *  @input:\n   *     library ::\n   *       A library instance.\n   *\n   *  @return:\n   *     A value indicating which level is supported.\n   *\n   *  @since:\n   *     2.2\n   *\n   */\n  FT_EXPORT( FT_TrueTypeEngineType )\n  FT_Get_TrueType_Engine_Type( FT_Library  library );\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTMODAPI_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftmoderr.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftmoderr.h                                                             */\n/*                                                                         */\n/*    FreeType module error offsets (specification).                       */\n/*                                                                         */\n/*  Copyright 2001-2005, 2010, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the FreeType module error codes.          */\n  /*                                                                       */\n  /* If the macro FT_CONFIG_OPTION_USE_MODULE_ERRORS in `ftoption.h' is    */\n  /* set, the lower byte of an error value identifies the error code as    */\n  /* usual.  In addition, the higher byte identifies the module.  For      */\n  /* example, the error `FT_Err_Invalid_File_Format' has value 0x0003, the */\n  /* error `TT_Err_Invalid_File_Format' has value 0x1303, the error        */\n  /* `T1_Err_Invalid_File_Format' has value 0x1403, etc.                   */\n  /*                                                                       */\n  /* Note that `FT_Err_Ok', `TT_Err_Ok', etc. are always equal to zero,    */\n  /* including the high byte.                                              */\n  /*                                                                       */\n  /* If FT_CONFIG_OPTION_USE_MODULE_ERRORS isn't set, the higher byte of   */\n  /* an error value is set to zero.                                        */\n  /*                                                                       */\n  /* To hide the various `XXX_Err_' prefixes in the source code, FreeType  */\n  /* provides some macros in `fttypes.h'.                                  */\n  /*                                                                       */\n  /*   FT_ERR( err )                                                       */\n  /*     Add current error module prefix (as defined with the              */\n  /*     `FT_ERR_PREFIX' macro) to `err'.  For example, in the BDF module  */\n  /*     the line                                                          */\n  /*                                                                       */\n  /*       error = FT_ERR( Invalid_Outline );                              */\n  /*                                                                       */\n  /*     expands to                                                        */\n  /*                                                                       */\n  /*       error = BDF_Err_Invalid_Outline;                                */\n  /*                                                                       */\n  /*     For simplicity, you can always use `FT_Err_Ok' directly instead   */\n  /*     of `FT_ERR( Ok )'.                                                */\n  /*                                                                       */\n  /*   FT_ERR_EQ( errcode, err )                                           */\n  /*   FT_ERR_NEQ( errcode, err )                                          */\n  /*     Compare error code `errcode' with the error `err' for equality    */\n  /*     and inequality, respectively.  Example:                           */\n  /*                                                                       */\n  /*       if ( FT_ERR_EQ( error, Invalid_Outline ) )                      */\n  /*         ...                                                           */\n  /*                                                                       */\n  /*     Using this macro you don't have to think about error prefixes.    */\n  /*     Of course, if module errors are not active, the above example is  */\n  /*     the same as                                                       */\n  /*                                                                       */\n  /*       if ( error == FT_Err_Invalid_Outline )                          */\n  /*         ...                                                           */\n  /*                                                                       */\n  /*   FT_ERROR_BASE( errcode )                                            */\n  /*   FT_ERROR_MODULE( errcode )                                          */\n  /*     Get base error and module error code, respectively.               */\n  /*                                                                       */\n  /*                                                                       */\n  /* It can also be used to create a module error message table easily     */\n  /* with something like                                                   */\n  /*                                                                       */\n  /*   {                                                                   */\n  /*     #undef __FTMODERR_H__                                             */\n  /*     #define FT_MODERRDEF( e, v, s )  { FT_Mod_Err_ ## e, s },         */\n  /*     #define FT_MODERR_START_LIST     {                                */\n  /*     #define FT_MODERR_END_LIST       { 0, 0 } };                      */\n  /*                                                                       */\n  /*     const struct                                                      */\n  /*     {                                                                 */\n  /*       int          mod_err_offset;                                    */\n  /*       const char*  mod_err_msg                                        */\n  /*     } ft_mod_errors[] =                                               */\n  /*                                                                       */\n  /*     #include \"ftmoderr.h\"                                       */\n  /*   }                                                                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTMODERR_H__\n#define __FTMODERR_H__\n\n\n  /*******************************************************************/\n  /*******************************************************************/\n  /*****                                                         *****/\n  /*****                       SETUP MACROS                      *****/\n  /*****                                                         *****/\n  /*******************************************************************/\n  /*******************************************************************/\n\n\n#undef  FT_NEED_EXTERN_C\n\n#ifndef FT_MODERRDEF\n\n#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS\n#define FT_MODERRDEF( e, v, s )  FT_Mod_Err_ ## e = v,\n#else\n#define FT_MODERRDEF( e, v, s )  FT_Mod_Err_ ## e = 0,\n#endif\n\n#define FT_MODERR_START_LIST  enum {\n#define FT_MODERR_END_LIST    FT_Mod_Err_Max };\n\n#ifdef __cplusplus\n#define FT_NEED_EXTERN_C\n  extern \"C\" {\n#endif\n\n#endif /* !FT_MODERRDEF */\n\n\n  /*******************************************************************/\n  /*******************************************************************/\n  /*****                                                         *****/\n  /*****               LIST MODULE ERROR BASES                   *****/\n  /*****                                                         *****/\n  /*******************************************************************/\n  /*******************************************************************/\n\n\n#ifdef FT_MODERR_START_LIST\n  FT_MODERR_START_LIST\n#endif\n\n\n  FT_MODERRDEF( Base,      0x000, \"base module\" )\n  FT_MODERRDEF( Autofit,   0x100, \"autofitter module\" )\n  FT_MODERRDEF( BDF,       0x200, \"BDF module\" )\n  FT_MODERRDEF( Bzip2,     0x300, \"Bzip2 module\" )\n  FT_MODERRDEF( Cache,     0x400, \"cache module\" )\n  FT_MODERRDEF( CFF,       0x500, \"CFF module\" )\n  FT_MODERRDEF( CID,       0x600, \"CID module\" )\n  FT_MODERRDEF( Gzip,      0x700, \"Gzip module\" )\n  FT_MODERRDEF( LZW,       0x800, \"LZW module\" )\n  FT_MODERRDEF( OTvalid,   0x900, \"OpenType validation module\" )\n  FT_MODERRDEF( PCF,       0xA00, \"PCF module\" )\n  FT_MODERRDEF( PFR,       0xB00, \"PFR module\" )\n  FT_MODERRDEF( PSaux,     0xC00, \"PS auxiliary module\" )\n  FT_MODERRDEF( PShinter,  0xD00, \"PS hinter module\" )\n  FT_MODERRDEF( PSnames,   0xE00, \"PS names module\" )\n  FT_MODERRDEF( Raster,    0xF00, \"raster module\" )\n  FT_MODERRDEF( SFNT,     0x1000, \"SFNT module\" )\n  FT_MODERRDEF( Smooth,   0x1100, \"smooth raster module\" )\n  FT_MODERRDEF( TrueType, 0x1200, \"TrueType module\" )\n  FT_MODERRDEF( Type1,    0x1300, \"Type 1 module\" )\n  FT_MODERRDEF( Type42,   0x1400, \"Type 42 module\" )\n  FT_MODERRDEF( Winfonts, 0x1500, \"Windows FON/FNT module\" )\n  FT_MODERRDEF( GXvalid,  0x1600, \"GX validation module\" )\n\n\n#ifdef FT_MODERR_END_LIST\n  FT_MODERR_END_LIST\n#endif\n\n\n  /*******************************************************************/\n  /*******************************************************************/\n  /*****                                                         *****/\n  /*****                      CLEANUP                            *****/\n  /*****                                                         *****/\n  /*******************************************************************/\n  /*******************************************************************/\n\n\n#ifdef FT_NEED_EXTERN_C\n  }\n#endif\n\n#undef FT_MODERR_START_LIST\n#undef FT_MODERR_END_LIST\n#undef FT_MODERRDEF\n#undef FT_NEED_EXTERN_C\n\n\n#endif /* __FTMODERR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftotval.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftotval.h                                                              */\n/*                                                                         */\n/*    FreeType API for validating OpenType tables (specification).         */\n/*                                                                         */\n/*  Copyright 2004, 2005, 2006, 2007 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n/***************************************************************************/\n/*                                                                         */\n/*                                                                         */\n/* Warning: This module might be moved to a different library in the       */\n/*          future to avoid a tight dependency between FreeType and the    */\n/*          OpenType specification.                                        */\n/*                                                                         */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTOTVAL_H__\n#define __FTOTVAL_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    ot_validation                                                      */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    OpenType Validation                                                */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    An API to validate OpenType tables.                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of functions to validate     */\n  /*    some OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH).         */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n /**********************************************************************\n  *\n  * @enum:\n  *    FT_VALIDATE_OTXXX\n  *\n  * @description:\n  *    A list of bit-field constants used with @FT_OpenType_Validate to\n  *    indicate which OpenType tables should be validated.\n  *\n  * @values:\n  *    FT_VALIDATE_BASE ::\n  *      Validate BASE table.\n  *\n  *    FT_VALIDATE_GDEF ::\n  *      Validate GDEF table.\n  *\n  *    FT_VALIDATE_GPOS ::\n  *      Validate GPOS table.\n  *\n  *    FT_VALIDATE_GSUB ::\n  *      Validate GSUB table.\n  *\n  *    FT_VALIDATE_JSTF ::\n  *      Validate JSTF table.\n  *\n  *    FT_VALIDATE_MATH ::\n  *      Validate MATH table.\n  *\n  *    FT_VALIDATE_OT ::\n  *      Validate all OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH).\n  *\n  */\n#define FT_VALIDATE_BASE  0x0100\n#define FT_VALIDATE_GDEF  0x0200\n#define FT_VALIDATE_GPOS  0x0400\n#define FT_VALIDATE_GSUB  0x0800\n#define FT_VALIDATE_JSTF  0x1000\n#define FT_VALIDATE_MATH  0x2000\n\n#define FT_VALIDATE_OT  FT_VALIDATE_BASE | \\\n                        FT_VALIDATE_GDEF | \\\n                        FT_VALIDATE_GPOS | \\\n                        FT_VALIDATE_GSUB | \\\n                        FT_VALIDATE_JSTF | \\\n                        FT_VALIDATE_MATH\n\n  /* */\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_OpenType_Validate\n  *\n  * @description:\n  *    Validate various OpenType tables to assure that all offsets and\n  *    indices are valid.  The idea is that a higher-level library which\n  *    actually does the text layout can access those tables without\n  *    error checking (which can be quite time consuming).\n  *\n  * @input:\n  *    face ::\n  *       A handle to the input face.\n  *\n  *    validation_flags ::\n  *       A bit field which specifies the tables to be validated.  See\n  *       @FT_VALIDATE_OTXXX for possible values.\n  *\n  * @output:\n  *    BASE_table ::\n  *       A pointer to the BASE table.\n  *\n  *    GDEF_table ::\n  *       A pointer to the GDEF table.\n  *\n  *    GPOS_table ::\n  *       A pointer to the GPOS table.\n  *\n  *    GSUB_table ::\n  *       A pointer to the GSUB table.\n  *\n  *    JSTF_table ::\n  *       A pointer to the JSTF table.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   This function only works with OpenType fonts, returning an error\n  *   otherwise.\n  *\n  *   After use, the application should deallocate the five tables with\n  *   @FT_OpenType_Free.  A NULL value indicates that the table either\n  *   doesn't exist in the font, or the application hasn't asked for\n  *   validation.\n  */\n  FT_EXPORT( FT_Error )\n  FT_OpenType_Validate( FT_Face    face,\n                        FT_UInt    validation_flags,\n                        FT_Bytes  *BASE_table,\n                        FT_Bytes  *GDEF_table,\n                        FT_Bytes  *GPOS_table,\n                        FT_Bytes  *GSUB_table,\n                        FT_Bytes  *JSTF_table );\n\n  /* */\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_OpenType_Free\n  *\n  * @description:\n  *    Free the buffer allocated by OpenType validator.\n  *\n  * @input:\n  *    face ::\n  *       A handle to the input face.\n  *\n  *    table ::\n  *       The pointer to the buffer that is allocated by\n  *       @FT_OpenType_Validate.\n  *\n  * @note:\n  *   This function must be used to free the buffer allocated by\n  *   @FT_OpenType_Validate only.\n  */\n  FT_EXPORT( void )\n  FT_OpenType_Free( FT_Face   face,\n                    FT_Bytes  table );\n\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTOTVAL_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftoutln.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftoutln.h                                                              */\n/*                                                                         */\n/*    Support for the FT_Outline type used to store glyph shapes of        */\n/*    most scalable font formats (specification).                          */\n/*                                                                         */\n/*  Copyright 1996-2003, 2005-2012 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTOUTLN_H__\n#define __FTOUTLN_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    outline_processing                                                 */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Outline Processing                                                 */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Functions to create, transform, and render vectorial glyph images. */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains routines used to create and destroy scalable */\n  /*    glyph images known as `outlines'.  These can also be measured,     */\n  /*    transformed, and converted into bitmaps and pixmaps.               */\n  /*                                                                       */\n  /* <Order>                                                               */\n  /*    FT_Outline                                                         */\n  /*    FT_OUTLINE_FLAGS                                                   */\n  /*    FT_Outline_New                                                     */\n  /*    FT_Outline_Done                                                    */\n  /*    FT_Outline_Copy                                                    */\n  /*    FT_Outline_Translate                                               */\n  /*    FT_Outline_Transform                                               */\n  /*    FT_Outline_Embolden                                                */\n  /*    FT_Outline_EmboldenXY                                              */\n  /*    FT_Outline_Reverse                                                 */\n  /*    FT_Outline_Check                                                   */\n  /*                                                                       */\n  /*    FT_Outline_Get_CBox                                                */\n  /*    FT_Outline_Get_BBox                                                */\n  /*                                                                       */\n  /*    FT_Outline_Get_Bitmap                                              */\n  /*    FT_Outline_Render                                                  */\n  /*                                                                       */\n  /*    FT_Outline_Decompose                                               */\n  /*    FT_Outline_Funcs                                                   */\n  /*    FT_Outline_MoveTo_Func                                             */\n  /*    FT_Outline_LineTo_Func                                             */\n  /*    FT_Outline_ConicTo_Func                                            */\n  /*    FT_Outline_CubicTo_Func                                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Decompose                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Walk over an outline's structure to decompose it into individual   */\n  /*    segments and Bézier arcs.  This function also emits `move to'      */\n  /*    operations to indicate the start of new contours in the outline.   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    outline        :: A pointer to the source target.                  */\n  /*                                                                       */\n  /*    func_interface :: A table of `emitters', i.e., function pointers   */\n  /*                      called during decomposition to indicate path     */\n  /*                      operations.                                      */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    user           :: A typeless pointer which is passed to each       */\n  /*                      emitter during the decomposition.  It can be     */\n  /*                      used to store the state during the               */\n  /*                      decomposition.                                   */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_Decompose( FT_Outline*              outline,\n                        const FT_Outline_Funcs*  func_interface,\n                        void*                    user );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_New                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a new outline of a given size.                              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library     :: A handle to the library object from where the       */\n  /*                   outline is allocated.  Note however that the new    */\n  /*                   outline will *not* necessarily be *freed*, when     */\n  /*                   destroying the library, by @FT_Done_FreeType.       */\n  /*                                                                       */\n  /*    numPoints   :: The maximum number of points within the outline.    */\n  /*                   Must be smaller than or equal to 0xFFFF (65535).    */\n  /*                                                                       */\n  /*    numContours :: The maximum number of contours within the outline.  */\n  /*                   This value must be in the range 0 to `numPoints'.   */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    anoutline   :: A handle to the new outline.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The reason why this function takes a `library' parameter is simply */\n  /*    to use the library's memory allocator.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_New( FT_Library   library,\n                  FT_UInt      numPoints,\n                  FT_Int       numContours,\n                  FT_Outline  *anoutline );\n\n\n  FT_EXPORT( FT_Error )\n  FT_Outline_New_Internal( FT_Memory    memory,\n                           FT_UInt      numPoints,\n                           FT_Int       numContours,\n                           FT_Outline  *anoutline );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Done                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Destroy an outline created with @FT_Outline_New.                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle of the library object used to allocate the     */\n  /*               outline.                                                */\n  /*                                                                       */\n  /*    outline :: A pointer to the outline object to be discarded.        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If the outline's `owner' field is not set, only the outline        */\n  /*    descriptor will be released.                                       */\n  /*                                                                       */\n  /*    The reason why this function takes an `library' parameter is       */\n  /*    simply to use ft_mem_free().                                       */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_Done( FT_Library   library,\n                   FT_Outline*  outline );\n\n\n  FT_EXPORT( FT_Error )\n  FT_Outline_Done_Internal( FT_Memory    memory,\n                            FT_Outline*  outline );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Check                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Check the contents of an outline descriptor.                       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    outline :: A handle to a source outline.                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_Check( FT_Outline*  outline );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Get_CBox                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return an outline's `control box'.  The control box encloses all   */\n  /*    the outline's points, including Bézier control points.  Though it  */\n  /*    coincides with the exact bounding box for most glyphs, it can be   */\n  /*    slightly larger in some situations (like when rotating an outline  */\n  /*    which contains Bézier outside arcs).                               */\n  /*                                                                       */\n  /*    Computing the control box is very fast, while getting the bounding */\n  /*    box can take much more time as it needs to walk over all segments  */\n  /*    and arcs in the outline.  To get the latter, you can use the       */\n  /*    `ftbbox' component which is dedicated to this single task.         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    outline :: A pointer to the source outline descriptor.             */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    acbox   :: The outline's control box.                              */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    See @FT_Glyph_Get_CBox for a discussion of tricky fonts.           */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Outline_Get_CBox( const FT_Outline*  outline,\n                       FT_BBox           *acbox );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Translate                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Apply a simple translation to the points of an outline.            */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    outline :: A pointer to the target outline descriptor.             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    xOffset :: The horizontal offset.                                  */\n  /*                                                                       */\n  /*    yOffset :: The vertical offset.                                    */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Outline_Translate( const FT_Outline*  outline,\n                        FT_Pos             xOffset,\n                        FT_Pos             yOffset );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Copy                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Copy an outline into another one.  Both objects must have the      */\n  /*    same sizes (number of points & number of contours) when this       */\n  /*    function is called.                                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    source :: A handle to the source outline.                          */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    target :: A handle to the target outline.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_Copy( const FT_Outline*  source,\n                   FT_Outline        *target );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Transform                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Apply a simple 2x2 matrix to all of an outline's points.  Useful   */\n  /*    for applying rotations, slanting, flipping, etc.                   */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    outline :: A pointer to the target outline descriptor.             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    matrix  :: A pointer to the transformation matrix.                 */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You can use @FT_Outline_Translate if you need to translate the     */\n  /*    outline's points.                                                  */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Outline_Transform( const FT_Outline*  outline,\n                        const FT_Matrix*   matrix );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Embolden                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Embolden an outline.  The new outline will be at most 4~times      */\n  /*    `strength' pixels wider and higher.  You may think of the left and */\n  /*    bottom borders as unchanged.                                       */\n  /*                                                                       */\n  /*    Negative `strength' values to reduce the outline thickness are     */\n  /*    possible also.                                                     */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    outline  :: A handle to the target outline.                        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    strength :: How strong the glyph is emboldened.  Expressed in      */\n  /*                26.6 pixel format.                                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The used algorithm to increase or decrease the thickness of the    */\n  /*    glyph doesn't change the number of points; this means that certain */\n  /*    situations like acute angles or intersections are sometimes        */\n  /*    handled incorrectly.                                               */\n  /*                                                                       */\n  /*    If you need `better' metrics values you should call                */\n  /*    @FT_Outline_Get_CBox or @FT_Outline_Get_BBox.                      */\n  /*                                                                       */\n  /*    Example call:                                                      */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      FT_Load_Glyph( face, index, FT_LOAD_DEFAULT );                   */\n  /*      if ( face->slot->format == FT_GLYPH_FORMAT_OUTLINE )             */\n  /*        FT_Outline_Embolden( &face->slot->outline, strength );         */\n  /*    }                                                                  */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_Embolden( FT_Outline*  outline,\n                       FT_Pos       strength );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_EmboldenXY                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Embolden an outline.  The new outline will be `xstrength' pixels   */\n  /*    wider and `ystrength' pixels higher.  Otherwise, it is similar to  */\n  /*    @FT_Outline_Embolden, which uses the same strength in both         */\n  /*    directions.                                                        */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_EmboldenXY( FT_Outline*  outline,\n                         FT_Pos       xstrength,\n                         FT_Pos       ystrength );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Reverse                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Reverse the drawing direction of an outline.  This is used to      */\n  /*    ensure consistent fill conventions for mirrored glyphs.            */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    outline :: A pointer to the target outline descriptor.             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function toggles the bit flag @FT_OUTLINE_REVERSE_FILL in     */\n  /*    the outline's `flags' field.                                       */\n  /*                                                                       */\n  /*    It shouldn't be used by a normal client application, unless it     */\n  /*    knows what it is doing.                                            */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Outline_Reverse( FT_Outline*  outline );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Get_Bitmap                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Render an outline within a bitmap.  The outline's image is simply  */\n  /*    OR-ed to the target bitmap.                                        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle to a FreeType library object.                  */\n  /*                                                                       */\n  /*    outline :: A pointer to the source outline descriptor.             */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    abitmap :: A pointer to the target bitmap descriptor.              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function does NOT CREATE the bitmap, it only renders an       */\n  /*    outline image within the one you pass to it!  Consequently, the    */\n  /*    various fields in `abitmap' should be set accordingly.             */\n  /*                                                                       */\n  /*    It will use the raster corresponding to the default glyph format.  */\n  /*                                                                       */\n  /*    The value of the `num_grays' field in `abitmap' is ignored.  If    */\n  /*    you select the gray-level rasterizer, and you want less than 256   */\n  /*    gray levels, you have to use @FT_Outline_Render directly.          */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_Get_Bitmap( FT_Library        library,\n                         FT_Outline*       outline,\n                         const FT_Bitmap  *abitmap );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Render                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Render an outline within a bitmap using the current scan-convert.  */\n  /*    This function uses an @FT_Raster_Params structure as an argument,  */\n  /*    allowing advanced features like direct composition, translucency,  */\n  /*    etc.                                                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle to a FreeType library object.                  */\n  /*                                                                       */\n  /*    outline :: A pointer to the source outline descriptor.             */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    params  :: A pointer to an @FT_Raster_Params structure used to     */\n  /*               describe the rendering operation.                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You should know what you are doing and how @FT_Raster_Params works */\n  /*    to use this function.                                              */\n  /*                                                                       */\n  /*    The field `params.source' will be set to `outline' before the scan */\n  /*    converter is called, which means that the value you give to it is  */\n  /*    actually ignored.                                                  */\n  /*                                                                       */\n  /*    The gray-level rasterizer always uses 256 gray levels.  If you     */\n  /*    want less gray levels, you have to provide your own span callback. */\n  /*    See the @FT_RASTER_FLAG_DIRECT value of the `flags' field in the   */\n  /*    @FT_Raster_Params structure for more details.                      */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_Render( FT_Library         library,\n                     FT_Outline*        outline,\n                     FT_Raster_Params*  params );\n\n\n /**************************************************************************\n  *\n  * @enum:\n  *   FT_Orientation\n  *\n  * @description:\n  *   A list of values used to describe an outline's contour orientation.\n  *\n  *   The TrueType and PostScript specifications use different conventions\n  *   to determine whether outline contours should be filled or unfilled.\n  *\n  * @values:\n  *   FT_ORIENTATION_TRUETYPE ::\n  *     According to the TrueType specification, clockwise contours must\n  *     be filled, and counter-clockwise ones must be unfilled.\n  *\n  *   FT_ORIENTATION_POSTSCRIPT ::\n  *     According to the PostScript specification, counter-clockwise contours\n  *     must be filled, and clockwise ones must be unfilled.\n  *\n  *   FT_ORIENTATION_FILL_RIGHT ::\n  *     This is identical to @FT_ORIENTATION_TRUETYPE, but is used to\n  *     remember that in TrueType, everything that is to the right of\n  *     the drawing direction of a contour must be filled.\n  *\n  *   FT_ORIENTATION_FILL_LEFT ::\n  *     This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to\n  *     remember that in PostScript, everything that is to the left of\n  *     the drawing direction of a contour must be filled.\n  *\n  *   FT_ORIENTATION_NONE ::\n  *     The orientation cannot be determined.  That is, different parts of\n  *     the glyph have different orientation.\n  *\n  */\n  typedef enum  FT_Orientation_\n  {\n    FT_ORIENTATION_TRUETYPE   = 0,\n    FT_ORIENTATION_POSTSCRIPT = 1,\n    FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE,\n    FT_ORIENTATION_FILL_LEFT  = FT_ORIENTATION_POSTSCRIPT,\n    FT_ORIENTATION_NONE\n\n  } FT_Orientation;\n\n\n /**************************************************************************\n  *\n  * @function:\n  *   FT_Outline_Get_Orientation\n  *\n  * @description:\n  *   This function analyzes a glyph outline and tries to compute its\n  *   fill orientation (see @FT_Orientation).  This is done by computing\n  *   the direction of each global horizontal and/or vertical extrema\n  *   within the outline.\n  *\n  *   Note that this will return @FT_ORIENTATION_TRUETYPE for empty\n  *   outlines.\n  *\n  * @input:\n  *   outline ::\n  *     A handle to the source outline.\n  *\n  * @return:\n  *   The orientation.\n  *\n  */\n  FT_EXPORT( FT_Orientation )\n  FT_Outline_Get_Orientation( FT_Outline*  outline );\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTOUTLN_H__ */\n\n\n/* END */\n\n\n/* Local Variables: */\n/* coding: utf-8    */\n/* End:             */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftpfr.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftpfr.h                                                                */\n/*                                                                         */\n/*    FreeType API for accessing PFR-specific data (specification only).   */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2004, 2006, 2008, 2009 by                        */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTPFR_H__\n#define __FTPFR_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    pfr_fonts                                                          */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    PFR Fonts                                                          */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    PFR/TrueDoc specific API.                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of PFR-specific functions.   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_Get_PFR_Metrics\n  *\n  * @description:\n  *    Return the outline and metrics resolutions of a given PFR face.\n  *\n  * @input:\n  *    face :: Handle to the input face.  It can be a non-PFR face.\n  *\n  * @output:\n  *    aoutline_resolution ::\n  *      Outline resolution.  This is equivalent to `face->units_per_EM'\n  *      for non-PFR fonts.  Optional (parameter can be NULL).\n  *\n  *    ametrics_resolution ::\n  *      Metrics resolution.  This is equivalent to `outline_resolution'\n  *      for non-PFR fonts.  Optional (parameter can be NULL).\n  *\n  *    ametrics_x_scale ::\n  *      A 16.16 fixed-point number used to scale distance expressed\n  *      in metrics units to device sub-pixels.  This is equivalent to\n  *      `face->size->x_scale', but for metrics only.  Optional (parameter\n  *      can be NULL).\n  *\n  *    ametrics_y_scale ::\n  *      Same as `ametrics_x_scale' but for the vertical direction.\n  *      optional (parameter can be NULL).\n  *\n  * @return:\n  *    FreeType error code.  0~means success.\n  *\n  * @note:\n  *   If the input face is not a PFR, this function will return an error.\n  *   However, in all cases, it will return valid values.\n  */\n  FT_EXPORT( FT_Error )\n  FT_Get_PFR_Metrics( FT_Face    face,\n                      FT_UInt   *aoutline_resolution,\n                      FT_UInt   *ametrics_resolution,\n                      FT_Fixed  *ametrics_x_scale,\n                      FT_Fixed  *ametrics_y_scale );\n\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_Get_PFR_Kerning\n  *\n  * @description:\n  *    Return the kerning pair corresponding to two glyphs in a PFR face.\n  *    The distance is expressed in metrics units, unlike the result of\n  *    @FT_Get_Kerning.\n  *\n  * @input:\n  *    face  :: A handle to the input face.\n  *\n  *    left  :: Index of the left glyph.\n  *\n  *    right :: Index of the right glyph.\n  *\n  * @output:\n  *    avector :: A kerning vector.\n  *\n  * @return:\n  *    FreeType error code.  0~means success.\n  *\n  * @note:\n  *    This function always return distances in original PFR metrics\n  *    units.  This is unlike @FT_Get_Kerning with the @FT_KERNING_UNSCALED\n  *    mode, which always returns distances converted to outline units.\n  *\n  *    You can use the value of the `x_scale' and `y_scale' parameters\n  *    returned by @FT_Get_PFR_Metrics to scale these to device sub-pixels.\n  */\n  FT_EXPORT( FT_Error )\n  FT_Get_PFR_Kerning( FT_Face     face,\n                      FT_UInt     left,\n                      FT_UInt     right,\n                      FT_Vector  *avector );\n\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_Get_PFR_Advance\n  *\n  * @description:\n  *    Return a given glyph advance, expressed in original metrics units,\n  *    from a PFR font.\n  *\n  * @input:\n  *    face   :: A handle to the input face.\n  *\n  *    gindex :: The glyph index.\n  *\n  * @output:\n  *    aadvance :: The glyph advance in metrics units.\n  *\n  * @return:\n  *    FreeType error code.  0~means success.\n  *\n  * @note:\n  *    You can use the `x_scale' or `y_scale' results of @FT_Get_PFR_Metrics\n  *    to convert the advance to device sub-pixels (i.e., 1/64th of pixels).\n  */\n  FT_EXPORT( FT_Error )\n  FT_Get_PFR_Advance( FT_Face   face,\n                      FT_UInt   gindex,\n                      FT_Pos   *aadvance );\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTPFR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftrender.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftrender.h                                                             */\n/*                                                                         */\n/*    FreeType renderer modules public interface (specification).          */\n/*                                                                         */\n/*  Copyright 1996-2001, 2005, 2006, 2010 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTRENDER_H__\n#define __FTRENDER_H__\n\n\n#include \"../ft2build.h\"\n#include \"ftmodapi.h\"\n#include \"ftglyph.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    module_management                                                  */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* create a new glyph object */\n  typedef FT_Error\n  (*FT_Glyph_InitFunc)( FT_Glyph      glyph,\n                        FT_GlyphSlot  slot );\n\n  /* destroys a given glyph object */\n  typedef void\n  (*FT_Glyph_DoneFunc)( FT_Glyph  glyph );\n\n  typedef void\n  (*FT_Glyph_TransformFunc)( FT_Glyph          glyph,\n                             const FT_Matrix*  matrix,\n                             const FT_Vector*  delta );\n\n  typedef void\n  (*FT_Glyph_GetBBoxFunc)( FT_Glyph  glyph,\n                           FT_BBox*  abbox );\n\n  typedef FT_Error\n  (*FT_Glyph_CopyFunc)( FT_Glyph   source,\n                        FT_Glyph   target );\n\n  typedef FT_Error\n  (*FT_Glyph_PrepareFunc)( FT_Glyph      glyph,\n                           FT_GlyphSlot  slot );\n\n/* deprecated */\n#define FT_Glyph_Init_Func       FT_Glyph_InitFunc\n#define FT_Glyph_Done_Func       FT_Glyph_DoneFunc\n#define FT_Glyph_Transform_Func  FT_Glyph_TransformFunc\n#define FT_Glyph_BBox_Func       FT_Glyph_GetBBoxFunc\n#define FT_Glyph_Copy_Func       FT_Glyph_CopyFunc\n#define FT_Glyph_Prepare_Func    FT_Glyph_PrepareFunc\n\n\n  struct  FT_Glyph_Class_\n  {\n    FT_Long                 glyph_size;\n    FT_Glyph_Format         glyph_format;\n    FT_Glyph_InitFunc       glyph_init;\n    FT_Glyph_DoneFunc       glyph_done;\n    FT_Glyph_CopyFunc       glyph_copy;\n    FT_Glyph_TransformFunc  glyph_transform;\n    FT_Glyph_GetBBoxFunc    glyph_bbox;\n    FT_Glyph_PrepareFunc    glyph_prepare;\n  };\n\n\n  typedef FT_Error\n  (*FT_Renderer_RenderFunc)( FT_Renderer       renderer,\n                             FT_GlyphSlot      slot,\n                             FT_UInt           mode,\n                             const FT_Vector*  origin );\n\n  typedef FT_Error\n  (*FT_Renderer_TransformFunc)( FT_Renderer       renderer,\n                                FT_GlyphSlot      slot,\n                                const FT_Matrix*  matrix,\n                                const FT_Vector*  delta );\n\n\n  typedef void\n  (*FT_Renderer_GetCBoxFunc)( FT_Renderer   renderer,\n                              FT_GlyphSlot  slot,\n                              FT_BBox*      cbox );\n\n\n  typedef FT_Error\n  (*FT_Renderer_SetModeFunc)( FT_Renderer  renderer,\n                              FT_ULong     mode_tag,\n                              FT_Pointer   mode_ptr );\n\n/* deprecated identifiers */\n#define FTRenderer_render  FT_Renderer_RenderFunc\n#define FTRenderer_transform  FT_Renderer_TransformFunc\n#define FTRenderer_getCBox  FT_Renderer_GetCBoxFunc\n#define FTRenderer_setMode  FT_Renderer_SetModeFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Renderer_Class                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The renderer module class descriptor.                              */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    root            :: The root @FT_Module_Class fields.               */\n  /*                                                                       */\n  /*    glyph_format    :: The glyph image format this renderer handles.   */\n  /*                                                                       */\n  /*    render_glyph    :: A method used to render the image that is in a  */\n  /*                       given glyph slot into a bitmap.                 */\n  /*                                                                       */\n  /*    transform_glyph :: A method used to transform the image that is in */\n  /*                       a given glyph slot.                             */\n  /*                                                                       */\n  /*    get_glyph_cbox  :: A method used to access the glyph's cbox.       */\n  /*                                                                       */\n  /*    set_mode        :: A method used to pass additional parameters.    */\n  /*                                                                       */\n  /*    raster_class    :: For @FT_GLYPH_FORMAT_OUTLINE renderers only.    */\n  /*                       This is a pointer to its raster's class.        */\n  /*                                                                       */\n  typedef struct  FT_Renderer_Class_\n  {\n    FT_Module_Class            root;\n\n    FT_Glyph_Format            glyph_format;\n\n    FT_Renderer_RenderFunc     render_glyph;\n    FT_Renderer_TransformFunc  transform_glyph;\n    FT_Renderer_GetCBoxFunc    get_glyph_cbox;\n    FT_Renderer_SetModeFunc    set_mode;\n\n    FT_Raster_Funcs*           raster_class;\n\n  } FT_Renderer_Class;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Renderer                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the current renderer for a given glyph format.            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle to the library object.                         */\n  /*                                                                       */\n  /*    format  :: The glyph format.                                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A renderer handle.  0~if none found.                               */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    An error will be returned if a module already exists by that name, */\n  /*    or if the module requires a version of FreeType that is too great. */\n  /*                                                                       */\n  /*    To add a new renderer, simply use @FT_Add_Module.  To retrieve a   */\n  /*    renderer by its name, use @FT_Get_Module.                          */\n  /*                                                                       */\n  FT_EXPORT( FT_Renderer )\n  FT_Get_Renderer( FT_Library       library,\n                   FT_Glyph_Format  format );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_Renderer                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Set the current renderer to use, and set additional mode.          */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library    :: A handle to the library object.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    renderer   :: A handle to the renderer object.                     */\n  /*                                                                       */\n  /*    num_params :: The number of additional parameters.                 */\n  /*                                                                       */\n  /*    parameters :: Additional parameters.                               */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    In case of success, the renderer will be used to convert glyph     */\n  /*    images in the renderer's known format into bitmaps.                */\n  /*                                                                       */\n  /*    This doesn't change the current renderer for other formats.        */\n  /*                                                                       */\n  /*    Currently, only the B/W renderer, if compiled with                 */\n  /*    FT_RASTER_OPTION_ANTI_ALIASING (providing a 5-levels               */\n  /*    anti-aliasing mode; this option must be set directly in            */\n  /*    `ftraster.c' and is undefined by default) accepts a single tag     */\n  /*    `pal5' to set its gray palette as a character string with          */\n  /*    5~elements.  Consequently, the third and fourth argument are zero  */\n  /*    normally.                                                          */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Set_Renderer( FT_Library     library,\n                   FT_Renderer    renderer,\n                   FT_UInt        num_params,\n                   FT_Parameter*  parameters );\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTRENDER_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftsizes.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftsizes.h                                                              */\n/*                                                                         */\n/*    FreeType size objects management (specification).                    */\n/*                                                                         */\n/*  Copyright 1996-2001, 2003, 2004, 2006, 2009 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Typical application would normally not need to use these functions.   */\n  /* However, they have been placed in a public API for the rare cases     */\n  /* where they are needed.                                                */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTSIZES_H__\n#define __FTSIZES_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    sizes_management                                                   */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Size Management                                                    */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Managing multiple sizes per face.                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    When creating a new face object (e.g., with @FT_New_Face), an      */\n  /*    @FT_Size object is automatically created and used to store all     */\n  /*    pixel-size dependent information, available in the `face->size'    */\n  /*    field.                                                             */\n  /*                                                                       */\n  /*    It is however possible to create more sizes for a given face,      */\n  /*    mostly in order to manage several character pixel sizes of the     */\n  /*    same font family and style.  See @FT_New_Size and @FT_Done_Size.   */\n  /*                                                                       */\n  /*    Note that @FT_Set_Pixel_Sizes and @FT_Set_Char_Size only           */\n  /*    modify the contents of the current `active' size; you thus need    */\n  /*    to use @FT_Activate_Size to change it.                             */\n  /*                                                                       */\n  /*    99% of applications won't need the functions provided here,        */\n  /*    especially if they use the caching sub-system, so be cautious      */\n  /*    when using these.                                                  */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Size                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a new size object from a given face object.                 */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to a parent face object.                          */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    asize :: A handle to a new size object.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You need to call @FT_Activate_Size in order to select the new size */\n  /*    for upcoming calls to @FT_Set_Pixel_Sizes, @FT_Set_Char_Size,      */\n  /*    @FT_Load_Glyph, @FT_Load_Char, etc.                                */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_New_Size( FT_Face   face,\n               FT_Size*  size );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Done_Size                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Discard a given size object.  Note that @FT_Done_Face              */\n  /*    automatically discards all size objects allocated with             */\n  /*    @FT_New_Size.                                                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    size :: A handle to a target size object.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Done_Size( FT_Size  size );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Activate_Size                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Even though it is possible to create several size objects for a    */\n  /*    given face (see @FT_New_Size for details), functions like          */\n  /*    @FT_Load_Glyph or @FT_Load_Char only use the one which has been    */\n  /*    activated last to determine the `current character pixel size'.    */\n  /*                                                                       */\n  /*    This function can be used to `activate' a previously created size  */\n  /*    object.                                                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    size :: A handle to a target size object.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If `face' is the size's parent face object, this function changes  */\n  /*    the value of `face->size' to the input size handle.                */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Activate_Size( FT_Size  size );\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTSIZES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftsnames.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftsnames.h                                                             */\n/*                                                                         */\n/*    Simple interface to access SFNT name tables (which are used          */\n/*    to hold font names, copyright info, notices, etc.) (specification).  */\n/*                                                                         */\n/*    This is _not_ used to retrieve glyph names!                          */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2006, 2009, 2010 by                   */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FT_SFNT_NAMES_H__\n#define __FT_SFNT_NAMES_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    sfnt_names                                                         */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    SFNT Names                                                         */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Access the names embedded in TrueType and OpenType files.          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The TrueType and OpenType specifications allow the inclusion of    */\n  /*    a special `names table' in font files.  This table contains        */\n  /*    textual (and internationalized) information regarding the font,    */\n  /*    like family name, copyright, version, etc.                         */\n  /*                                                                       */\n  /*    The definitions below are used to access them if available.        */\n  /*                                                                       */\n  /*    Note that this has nothing to do with glyph names!                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_SfntName                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model an SFNT `name' table entry.              */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    platform_id :: The platform ID for `string'.                       */\n  /*                                                                       */\n  /*    encoding_id :: The encoding ID for `string'.                       */\n  /*                                                                       */\n  /*    language_id :: The language ID for `string'.                       */\n  /*                                                                       */\n  /*    name_id     :: An identifier for `string'.                         */\n  /*                                                                       */\n  /*    string      :: The `name' string.  Note that its format differs    */\n  /*                   depending on the (platform,encoding) pair.  It can  */\n  /*                   be a Pascal String, a UTF-16 one, etc.              */\n  /*                                                                       */\n  /*                   Generally speaking, the string is not               */\n  /*                   zero-terminated.  Please refer to the TrueType      */\n  /*                   specification for details.                          */\n  /*                                                                       */\n  /*    string_len  :: The length of `string' in bytes.                    */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Possible values for `platform_id', `encoding_id', `language_id',   */\n  /*    and `name_id' are given in the file `ttnameid.h'.  For details     */\n  /*    please refer to the TrueType or OpenType specification.            */\n  /*                                                                       */\n  /*    See also @TT_PLATFORM_XXX, @TT_APPLE_ID_XXX, @TT_MAC_ID_XXX,       */\n  /*    @TT_ISO_ID_XXX, and @TT_MS_ID_XXX.                                 */\n  /*                                                                       */\n  typedef struct  FT_SfntName_\n  {\n    FT_UShort  platform_id;\n    FT_UShort  encoding_id;\n    FT_UShort  language_id;\n    FT_UShort  name_id;\n\n    FT_Byte*   string;      /* this string is *not* null-terminated! */\n    FT_UInt    string_len;  /* in bytes */\n\n  } FT_SfntName;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Sfnt_Name_Count                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the number of name strings in the SFNT `name' table.      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to the source face.                               */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The number of strings in the `name' table.                         */\n  /*                                                                       */\n  FT_EXPORT( FT_UInt )\n  FT_Get_Sfnt_Name_Count( FT_Face  face );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Sfnt_Name                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve a string of the SFNT `name' table for a given index.      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face  :: A handle to the source face.                              */\n  /*                                                                       */\n  /*    idx   :: The index of the `name' string.                           */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aname :: The indexed @FT_SfntName structure.                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The `string' array returned in the `aname' structure is not        */\n  /*    null-terminated.  The application should deallocate it if it is no */\n  /*    longer in use.                                                     */\n  /*                                                                       */\n  /*    Use @FT_Get_Sfnt_Name_Count to get the total number of available   */\n  /*    `name' table entries, then do a loop until you get the right       */\n  /*    platform, encoding, and name ID.                                   */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_Sfnt_Name( FT_Face       face,\n                    FT_UInt       idx,\n                    FT_SfntName  *aname );\n\n\n  /***************************************************************************\n   *\n   * @constant:\n   *   FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY\n   *\n   * @description:\n   *   A constant used as the tag of @FT_Parameter structures to make\n   *   FT_Open_Face() ignore preferred family subfamily names in `name'\n   *   table since OpenType version 1.4.  For backwards compatibility with\n   *   legacy systems which has 4-face-per-family restriction.\n   *\n   */\n#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY  FT_MAKE_TAG( 'i', 'g', 'p', 'f' )\n\n\n  /***************************************************************************\n   *\n   * @constant:\n   *   FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY\n   *\n   * @description:\n   *   A constant used as the tag of @FT_Parameter structures to make\n   *   FT_Open_Face() ignore preferred subfamily names in `name' table since\n   *   OpenType version 1.4.  For backwards compatibility with legacy\n   *   systems which has 4-face-per-family restriction.\n   *\n   */\n#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY  FT_MAKE_TAG( 'i', 'g', 'p', 's' )\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FT_SFNT_NAMES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftstroke.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftstroke.h                                                             */\n/*                                                                         */\n/*    FreeType path stroker (specification).                               */\n/*                                                                         */\n/*  Copyright 2002-2006, 2008, 2009, 2011-2012 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FT_STROKE_H__\n#define __FT_STROKE_H__\n\n#include \"../ft2build.h\"\n#include \"ftoutln.h\"\n#include \"ftglyph.h\"\n\n\nFT_BEGIN_HEADER\n\n\n /************************************************************************\n  *\n  * @section:\n  *    glyph_stroker\n  *\n  * @title:\n  *    Glyph Stroker\n  *\n  * @abstract:\n  *    Generating bordered and stroked glyphs.\n  *\n  * @description:\n  *    This component generates stroked outlines of a given vectorial\n  *    glyph.  It also allows you to retrieve the `outside' and/or the\n  *    `inside' borders of the stroke.\n  *\n  *    This can be useful to generate `bordered' glyph, i.e., glyphs\n  *    displayed with a coloured (and anti-aliased) border around their\n  *    shape.\n  */\n\n\n /**************************************************************\n  *\n  * @type:\n  *   FT_Stroker\n  *\n  * @description:\n  *   Opaque handler to a path stroker object.\n  */\n  typedef struct FT_StrokerRec_*  FT_Stroker;\n\n\n  /**************************************************************\n   *\n   * @enum:\n   *   FT_Stroker_LineJoin\n   *\n   * @description:\n   *   These values determine how two joining lines are rendered\n   *   in a stroker.\n   *\n   * @values:\n   *   FT_STROKER_LINEJOIN_ROUND ::\n   *     Used to render rounded line joins.  Circular arcs are used\n   *     to join two lines smoothly.\n   *\n   *   FT_STROKER_LINEJOIN_BEVEL ::\n   *     Used to render beveled line joins.  The outer corner of\n   *     the joined lines is filled by enclosing the triangular\n   *     region of the corner with a straight line between the\n   *     outer corners of each stroke.\n   *\n   *   FT_STROKER_LINEJOIN_MITER_FIXED ::\n   *     Used to render mitered line joins, with fixed bevels if the\n   *     miter limit is exceeded.  The outer edges of the strokes\n   *     for the two segments are extended until they meet at an\n   *     angle.  If the segments meet at too sharp an angle (such\n   *     that the miter would extend from the intersection of the\n   *     segments a distance greater than the product of the miter\n   *     limit value and the border radius), then a bevel join (see\n   *     above) is used instead.  This prevents long spikes being\n   *     created.  FT_STROKER_LINEJOIN_MITER_FIXED generates a miter\n   *     line join as used in PostScript and PDF.\n   *\n   *   FT_STROKER_LINEJOIN_MITER_VARIABLE ::\n   *   FT_STROKER_LINEJOIN_MITER ::\n   *     Used to render mitered line joins, with variable bevels if\n   *     the miter limit is exceeded.  The intersection of the\n   *     strokes is clipped at a line perpendicular to the bisector\n   *     of the angle between the strokes, at the distance from the\n   *     intersection of the segments equal to the product of the\n   *     miter limit value and the border radius.  This prevents\n   *     long spikes being created.\n   *     FT_STROKER_LINEJOIN_MITER_VARIABLE generates a mitered line\n   *     join as used in XPS.  FT_STROKER_LINEJOIN_MITER is an alias\n   *     for FT_STROKER_LINEJOIN_MITER_VARIABLE, retained for\n   *     backwards compatibility.\n   */\n  typedef enum  FT_Stroker_LineJoin_\n  {\n    FT_STROKER_LINEJOIN_ROUND          = 0,\n    FT_STROKER_LINEJOIN_BEVEL          = 1,\n    FT_STROKER_LINEJOIN_MITER_VARIABLE = 2,\n    FT_STROKER_LINEJOIN_MITER          = FT_STROKER_LINEJOIN_MITER_VARIABLE,\n    FT_STROKER_LINEJOIN_MITER_FIXED    = 3\n\n  } FT_Stroker_LineJoin;\n\n\n  /**************************************************************\n   *\n   * @enum:\n   *   FT_Stroker_LineCap\n   *\n   * @description:\n   *   These values determine how the end of opened sub-paths are\n   *   rendered in a stroke.\n   *\n   * @values:\n   *   FT_STROKER_LINECAP_BUTT ::\n   *     The end of lines is rendered as a full stop on the last\n   *     point itself.\n   *\n   *   FT_STROKER_LINECAP_ROUND ::\n   *     The end of lines is rendered as a half-circle around the\n   *     last point.\n   *\n   *   FT_STROKER_LINECAP_SQUARE ::\n   *     The end of lines is rendered as a square around the\n   *     last point.\n   */\n  typedef enum  FT_Stroker_LineCap_\n  {\n    FT_STROKER_LINECAP_BUTT = 0,\n    FT_STROKER_LINECAP_ROUND,\n    FT_STROKER_LINECAP_SQUARE\n\n  } FT_Stroker_LineCap;\n\n\n  /**************************************************************\n   *\n   * @enum:\n   *   FT_StrokerBorder\n   *\n   * @description:\n   *   These values are used to select a given stroke border\n   *   in @FT_Stroker_GetBorderCounts and @FT_Stroker_ExportBorder.\n   *\n   * @values:\n   *   FT_STROKER_BORDER_LEFT ::\n   *     Select the left border, relative to the drawing direction.\n   *\n   *   FT_STROKER_BORDER_RIGHT ::\n   *     Select the right border, relative to the drawing direction.\n   *\n   * @note:\n   *   Applications are generally interested in the `inside' and `outside'\n   *   borders.  However, there is no direct mapping between these and the\n   *   `left' and `right' ones, since this really depends on the glyph's\n   *   drawing orientation, which varies between font formats.\n   *\n   *   You can however use @FT_Outline_GetInsideBorder and\n   *   @FT_Outline_GetOutsideBorder to get these.\n   */\n  typedef enum  FT_StrokerBorder_\n  {\n    FT_STROKER_BORDER_LEFT = 0,\n    FT_STROKER_BORDER_RIGHT\n\n  } FT_StrokerBorder;\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Outline_GetInsideBorder\n   *\n   * @description:\n   *   Retrieve the @FT_StrokerBorder value corresponding to the\n   *   `inside' borders of a given outline.\n   *\n   * @input:\n   *   outline ::\n   *     The source outline handle.\n   *\n   * @return:\n   *   The border index.  @FT_STROKER_BORDER_RIGHT for empty or invalid\n   *   outlines.\n   */\n  FT_EXPORT( FT_StrokerBorder )\n  FT_Outline_GetInsideBorder( FT_Outline*  outline );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Outline_GetOutsideBorder\n   *\n   * @description:\n   *   Retrieve the @FT_StrokerBorder value corresponding to the\n   *   `outside' borders of a given outline.\n   *\n   * @input:\n   *   outline ::\n   *     The source outline handle.\n   *\n   * @return:\n   *   The border index.  @FT_STROKER_BORDER_LEFT for empty or invalid\n   *   outlines.\n   */\n  FT_EXPORT( FT_StrokerBorder )\n  FT_Outline_GetOutsideBorder( FT_Outline*  outline );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_New\n   *\n   * @description:\n   *   Create a new stroker object.\n   *\n   * @input:\n   *   library ::\n   *     FreeType library handle.\n   *\n   * @output:\n   *   astroker ::\n   *     A new stroker object handle.  NULL in case of error.\n   *\n   * @return:\n   *    FreeType error code.  0~means success.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_New( FT_Library   library,\n                  FT_Stroker  *astroker );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_Set\n   *\n   * @description:\n   *   Reset a stroker object's attributes.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   radius ::\n   *     The border radius.\n   *\n   *   line_cap ::\n   *     The line cap style.\n   *\n   *   line_join ::\n   *     The line join style.\n   *\n   *   miter_limit ::\n   *     The miter limit for the FT_STROKER_LINEJOIN_MITER_FIXED and\n   *     FT_STROKER_LINEJOIN_MITER_VARIABLE line join styles,\n   *     expressed as 16.16 fixed-point value.\n   *\n   * @note:\n   *   The radius is expressed in the same units as the outline\n   *   coordinates.\n   */\n  FT_EXPORT( void )\n  FT_Stroker_Set( FT_Stroker           stroker,\n                  FT_Fixed             radius,\n                  FT_Stroker_LineCap   line_cap,\n                  FT_Stroker_LineJoin  line_join,\n                  FT_Fixed             miter_limit );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_Rewind\n   *\n   * @description:\n   *   Reset a stroker object without changing its attributes.\n   *   You should call this function before beginning a new\n   *   series of calls to @FT_Stroker_BeginSubPath or\n   *   @FT_Stroker_EndSubPath.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   */\n  FT_EXPORT( void )\n  FT_Stroker_Rewind( FT_Stroker  stroker );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_ParseOutline\n   *\n   * @description:\n   *   A convenience function used to parse a whole outline with\n   *   the stroker.  The resulting outline(s) can be retrieved\n   *   later by functions like @FT_Stroker_GetCounts and @FT_Stroker_Export.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   outline ::\n   *     The source outline.\n   *\n   *   opened ::\n   *     A boolean.  If~1, the outline is treated as an open path instead\n   *     of a closed one.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   If `opened' is~0 (the default), the outline is treated as a closed\n   *   path, and the stroker generates two distinct `border' outlines.\n   *\n   *   If `opened' is~1, the outline is processed as an open path, and the\n   *   stroker generates a single `stroke' outline.\n   *\n   *   This function calls @FT_Stroker_Rewind automatically.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_ParseOutline( FT_Stroker   stroker,\n                           FT_Outline*  outline,\n                           FT_Bool      opened );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_BeginSubPath\n   *\n   * @description:\n   *   Start a new sub-path in the stroker.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   to ::\n   *     A pointer to the start vector.\n   *\n   *   open ::\n   *     A boolean.  If~1, the sub-path is treated as an open one.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   This function is useful when you need to stroke a path that is\n   *   not stored as an @FT_Outline object.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_BeginSubPath( FT_Stroker  stroker,\n                           FT_Vector*  to,\n                           FT_Bool     open );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_EndSubPath\n   *\n   * @description:\n   *   Close the current sub-path in the stroker.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   You should call this function after @FT_Stroker_BeginSubPath.\n   *   If the subpath was not `opened', this function `draws' a\n   *   single line segment to the start position when needed.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_EndSubPath( FT_Stroker  stroker );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_LineTo\n   *\n   * @description:\n   *   `Draw' a single line segment in the stroker's current sub-path,\n   *   from the last position.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   to ::\n   *     A pointer to the destination point.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   You should call this function between @FT_Stroker_BeginSubPath and\n   *   @FT_Stroker_EndSubPath.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_LineTo( FT_Stroker  stroker,\n                     FT_Vector*  to );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_ConicTo\n   *\n   * @description:\n   *   `Draw' a single quadratic Bézier in the stroker's current sub-path,\n   *   from the last position.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   control ::\n   *     A pointer to a Bézier control point.\n   *\n   *   to ::\n   *     A pointer to the destination point.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   You should call this function between @FT_Stroker_BeginSubPath and\n   *   @FT_Stroker_EndSubPath.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_ConicTo( FT_Stroker  stroker,\n                      FT_Vector*  control,\n                      FT_Vector*  to );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_CubicTo\n   *\n   * @description:\n   *   `Draw' a single cubic Bézier in the stroker's current sub-path,\n   *   from the last position.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   control1 ::\n   *     A pointer to the first Bézier control point.\n   *\n   *   control2 ::\n   *     A pointer to second Bézier control point.\n   *\n   *   to ::\n   *     A pointer to the destination point.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   You should call this function between @FT_Stroker_BeginSubPath and\n   *   @FT_Stroker_EndSubPath.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_CubicTo( FT_Stroker  stroker,\n                      FT_Vector*  control1,\n                      FT_Vector*  control2,\n                      FT_Vector*  to );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_GetBorderCounts\n   *\n   * @description:\n   *   Call this function once you have finished parsing your paths\n   *   with the stroker.  It returns the number of points and\n   *   contours necessary to export one of the `border' or `stroke'\n   *   outlines generated by the stroker.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   border ::\n   *     The border index.\n   *\n   * @output:\n   *   anum_points ::\n   *     The number of points.\n   *\n   *   anum_contours ::\n   *     The number of contours.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   When an outline, or a sub-path, is `closed', the stroker generates\n   *   two independent `border' outlines, named `left' and `right'.\n   *\n   *   When the outline, or a sub-path, is `opened', the stroker merges\n   *   the `border' outlines with caps.  The `left' border receives all\n   *   points, while the `right' border becomes empty.\n   *\n   *   Use the function @FT_Stroker_GetCounts instead if you want to\n   *   retrieve the counts associated to both borders.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_GetBorderCounts( FT_Stroker        stroker,\n                              FT_StrokerBorder  border,\n                              FT_UInt          *anum_points,\n                              FT_UInt          *anum_contours );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_ExportBorder\n   *\n   * @description:\n   *   Call this function after @FT_Stroker_GetBorderCounts to\n   *   export the corresponding border to your own @FT_Outline\n   *   structure.\n   *\n   *   Note that this function appends the border points and\n   *   contours to your outline, but does not try to resize its\n   *   arrays.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   border ::\n   *     The border index.\n   *\n   *   outline ::\n   *     The target outline handle.\n   *\n   * @note:\n   *   Always call this function after @FT_Stroker_GetBorderCounts to\n   *   get sure that there is enough room in your @FT_Outline object to\n   *   receive all new data.\n   *\n   *   When an outline, or a sub-path, is `closed', the stroker generates\n   *   two independent `border' outlines, named `left' and `right'\n   *\n   *   When the outline, or a sub-path, is `opened', the stroker merges\n   *   the `border' outlines with caps. The `left' border receives all\n   *   points, while the `right' border becomes empty.\n   *\n   *   Use the function @FT_Stroker_Export instead if you want to\n   *   retrieve all borders at once.\n   */\n  FT_EXPORT( void )\n  FT_Stroker_ExportBorder( FT_Stroker        stroker,\n                           FT_StrokerBorder  border,\n                           FT_Outline*       outline );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_GetCounts\n   *\n   * @description:\n   *   Call this function once you have finished parsing your paths\n   *   with the stroker.  It returns the number of points and\n   *   contours necessary to export all points/borders from the stroked\n   *   outline/path.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   * @output:\n   *   anum_points ::\n   *     The number of points.\n   *\n   *   anum_contours ::\n   *     The number of contours.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_GetCounts( FT_Stroker  stroker,\n                        FT_UInt    *anum_points,\n                        FT_UInt    *anum_contours );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_Export\n   *\n   * @description:\n   *   Call this function after @FT_Stroker_GetBorderCounts to\n   *   export all borders to your own @FT_Outline structure.\n   *\n   *   Note that this function appends the border points and\n   *   contours to your outline, but does not try to resize its\n   *   arrays.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   outline ::\n   *     The target outline handle.\n   */\n  FT_EXPORT( void )\n  FT_Stroker_Export( FT_Stroker   stroker,\n                     FT_Outline*  outline );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_Done\n   *\n   * @description:\n   *   Destroy a stroker object.\n   *\n   * @input:\n   *   stroker ::\n   *     A stroker handle.  Can be NULL.\n   */\n  FT_EXPORT( void )\n  FT_Stroker_Done( FT_Stroker  stroker );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Glyph_Stroke\n   *\n   * @description:\n   *   Stroke a given outline glyph object with a given stroker.\n   *\n   * @inout:\n   *   pglyph ::\n   *     Source glyph handle on input, new glyph handle on output.\n   *\n   * @input:\n   *   stroker ::\n   *     A stroker handle.\n   *\n   *   destroy ::\n   *     A Boolean.  If~1, the source glyph object is destroyed\n   *     on success.\n   *\n   * @return:\n   *    FreeType error code.  0~means success.\n   *\n   * @note:\n   *   The source glyph is untouched in case of error.\n   *\n   *   Adding stroke may yield a significantly wider and taller glyph\n   *   depending on how large of a radius was used to stroke the glyph.  You\n   *   may need to manually adjust horizontal and vertical advance amounts\n   *   to account for this added size.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Glyph_Stroke( FT_Glyph    *pglyph,\n                   FT_Stroker   stroker,\n                   FT_Bool      destroy );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Glyph_StrokeBorder\n   *\n   * @description:\n   *   Stroke a given outline glyph object with a given stroker, but\n   *   only return either its inside or outside border.\n   *\n   * @inout:\n   *   pglyph ::\n   *     Source glyph handle on input, new glyph handle on output.\n   *\n   * @input:\n   *   stroker ::\n   *     A stroker handle.\n   *\n   *   inside ::\n   *     A Boolean.  If~1, return the inside border, otherwise\n   *     the outside border.\n   *\n   *   destroy ::\n   *     A Boolean.  If~1, the source glyph object is destroyed\n   *     on success.\n   *\n   * @return:\n   *    FreeType error code.  0~means success.\n   *\n   * @note:\n   *   The source glyph is untouched in case of error.\n   *\n   *   Adding stroke may yield a significantly wider and taller glyph\n   *   depending on how large of a radius was used to stroke the glyph.  You\n   *   may need to manually adjust horizontal and vertical advance amounts\n   *   to account for this added size.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Glyph_StrokeBorder( FT_Glyph    *pglyph,\n                         FT_Stroker   stroker,\n                         FT_Bool      inside,\n                         FT_Bool      destroy );\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FT_STROKE_H__ */\n\n\n/* END */\n\n\n/* Local Variables: */\n/* coding: utf-8    */\n/* End:             */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftsynth.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftsynth.h                                                              */\n/*                                                                         */\n/*    FreeType synthesizing code for emboldening and slanting              */\n/*    (specification).                                                     */\n/*                                                                         */\n/*  Copyright 2000-2001, 2003, 2006, 2008, 2012 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*********                                                       *********/\n  /*********        WARNING, THIS IS ALPHA CODE!  THIS API         *********/\n  /*********    IS DUE TO CHANGE UNTIL STRICTLY NOTIFIED BY THE    *********/\n  /*********            FREETYPE DEVELOPMENT TEAM                  *********/\n  /*********                                                       *********/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* Main reason for not lifting the functions in this module to a  */\n  /* `standard' API is that the used parameters for emboldening and */\n  /* slanting are not configurable.  Consider the functions as a    */\n  /* code resource which should be copied into the application and  */\n  /* adapted to the particular needs.                               */\n\n\n#ifndef __FTSYNTH_H__\n#define __FTSYNTH_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n  /* Embolden a glyph by a `reasonable' value (which is highly a matter of */\n  /* taste).  This function is actually a convenience function, providing  */\n  /* a wrapper for @FT_Outline_Embolden and @FT_Bitmap_Embolden.           */\n  /*                                                                       */\n  /* For emboldened outlines the height, width, and advance metrics are    */\n  /* increased by the strength of the emboldening.  You can also call      */\n  /* @FT_Outline_Get_CBox to get precise values.                           */\n  FT_EXPORT( void )\n  FT_GlyphSlot_Embolden( FT_GlyphSlot  slot );\n\n  /* Slant an outline glyph to the right by about 12 degrees. */\n  FT_EXPORT( void )\n  FT_GlyphSlot_Oblique( FT_GlyphSlot  slot );\n\n  /* */\n\nFT_END_HEADER\n\n#endif /* __FTSYNTH_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftsystem.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftsystem.h                                                             */\n/*                                                                         */\n/*    FreeType low-level system interface definition (specification).      */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2005, 2010 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTSYSTEM_H__\n#define __FTSYSTEM_H__\n\n\n#include \"../ft2build.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*   system_interface                                                    */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*   System Interface                                                    */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*   How FreeType manages memory and i/o.                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*   This section contains various definitions related to memory         */\n  /*   management and i/o access.  You need to understand this             */\n  /*   information if you want to use a custom memory manager or you own   */\n  /*   i/o streams.                                                        */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                  M E M O R Y   M A N A G E M E N T                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************\n   *\n   * @type:\n   *   FT_Memory\n   *\n   * @description:\n   *   A handle to a given memory manager object, defined with an\n   *   @FT_MemoryRec structure.\n   *\n   */\n  typedef struct FT_MemoryRec_*  FT_Memory;\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   FT_Alloc_Func\n   *\n   * @description:\n   *   A function used to allocate `size' bytes from `memory'.\n   *\n   * @input:\n   *   memory ::\n   *     A handle to the source memory manager.\n   *\n   *   size ::\n   *     The size in bytes to allocate.\n   *\n   * @return:\n   *   Address of new memory block.  0~in case of failure.\n   *\n   */\n  typedef void*\n  (*FT_Alloc_Func)( FT_Memory  memory,\n                    long       size );\n\n  /* Sunliang.Liu 20100915 sync 221's revison. */\n  typedef void*\n\t  (*FT_AllocDebug_Func)( FT_Memory  memory,\n\t  long       size, const char* filename,  int line);\n\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   FT_Free_Func\n   *\n   * @description:\n   *   A function used to release a given block of memory.\n   *\n   * @input:\n   *   memory ::\n   *     A handle to the source memory manager.\n   *\n   *   block ::\n   *     The address of the target memory block.\n   *\n   */\n  typedef void\n  (*FT_Free_Func)( FT_Memory  memory,\n                   void*      block );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   FT_Realloc_Func\n   *\n   * @description:\n   *   A function used to re-allocate a given block of memory.\n   *\n   * @input:\n   *   memory ::\n   *     A handle to the source memory manager.\n   *\n   *   cur_size ::\n   *     The block's current size in bytes.\n   *\n   *   new_size ::\n   *     The block's requested new size.\n   *\n   *   block ::\n   *     The block's current address.\n   *\n   * @return:\n   *   New block address.  0~in case of memory shortage.\n   *\n   * @note:\n   *   In case of error, the old block must still be available.\n   *\n   */\n  typedef void*\n  (*FT_Realloc_Func)( FT_Memory  memory,\n                      long       cur_size,\n                      long       new_size,\n                      void*      block );\n\n\n  /*************************************************************************\n   *\n   * @struct:\n   *   FT_MemoryRec\n   *\n   * @description:\n   *   A structure used to describe a given memory manager to FreeType~2.\n   *\n   * @fields:\n   *   user ::\n   *     A generic typeless pointer for user data.\n   *\n   *   alloc ::\n   *     A pointer type to an allocation function.\n   *\n   *   free ::\n   *     A pointer type to an memory freeing function.\n   *\n   *   realloc ::\n   *     A pointer type to a reallocation function.\n   *\n   */\n  struct  FT_MemoryRec_\n  {\n    void*            user;\n    FT_Alloc_Func    alloc;\n\tFT_AllocDebug_Func allocdebug;\t/* Sunliang.Liu 20100915 sync 221's revison. */\n    FT_Free_Func     free;\n    FT_Realloc_Func  realloc;\n  };\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                       I / O   M A N A G E M E N T                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************\n   *\n   * @type:\n   *   FT_Stream\n   *\n   * @description:\n   *   A handle to an input stream.\n   *\n   */\n  typedef struct FT_StreamRec_*  FT_Stream;\n\n\n  /*************************************************************************\n   *\n   * @struct:\n   *   FT_StreamDesc\n   *\n   * @description:\n   *   A union type used to store either a long or a pointer.  This is used\n   *   to store a file descriptor or a `FILE*' in an input stream.\n   *\n   */\n  typedef union  FT_StreamDesc_\n  {\n    long   value;\n    void*  pointer;\n\n  } FT_StreamDesc;\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   FT_Stream_IoFunc\n   *\n   * @description:\n   *   A function used to seek and read data from a given input stream.\n   *\n   * @input:\n   *   stream ::\n   *     A handle to the source stream.\n   *\n   *   offset ::\n   *     The offset of read in stream (always from start).\n   *\n   *   buffer ::\n   *     The address of the read buffer.\n   *\n   *   count ::\n   *     The number of bytes to read from the stream.\n   *\n   * @return:\n   *   The number of bytes effectively read by the stream.\n   *\n   * @note:\n   *   This function might be called to perform a seek or skip operation\n   *   with a `count' of~0.  A non-zero return value then indicates an\n   *   error.\n   *\n   */\n  typedef unsigned long\n  (*FT_Stream_IoFunc)( FT_Stream       stream,\n                       unsigned long   offset,\n                       unsigned char*  buffer,\n                       unsigned long   count );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   FT_Stream_CloseFunc\n   *\n   * @description:\n   *   A function used to close a given input stream.\n   *\n   * @input:\n   *  stream ::\n   *     A handle to the target stream.\n   *\n   */\n  typedef void\n  (*FT_Stream_CloseFunc)( FT_Stream  stream );\n\n\n  /*************************************************************************\n   *\n   * @struct:\n   *   FT_StreamRec\n   *\n   * @description:\n   *   A structure used to describe an input stream.\n   *\n   * @input:\n   *   base ::\n   *     For memory-based streams, this is the address of the first stream\n   *     byte in memory.  This field should always be set to NULL for\n   *     disk-based streams.\n   *\n   *   size ::\n   *     The stream size in bytes.\n   *\n   *   pos ::\n   *     The current position within the stream.\n   *\n   *   descriptor ::\n   *     This field is a union that can hold an integer or a pointer.  It is\n   *     used by stream implementations to store file descriptors or `FILE*'\n   *     pointers.\n   *\n   *   pathname ::\n   *     This field is completely ignored by FreeType.  However, it is often\n   *     useful during debugging to use it to store the stream's filename\n   *     (where available).\n   *\n   *   read ::\n   *     The stream's input function.\n   *\n   *   close ::\n   *     The stream's close function.\n   *\n   *   memory ::\n   *     The memory manager to use to preload frames.  This is set\n   *     internally by FreeType and shouldn't be touched by stream\n   *     implementations.\n   *\n   *   cursor ::\n   *     This field is set and used internally by FreeType when parsing\n   *     frames.\n   *\n   *   limit ::\n   *     This field is set and used internally by FreeType when parsing\n   *     frames.\n   *\n   */\n  typedef struct  FT_StreamRec_\n  {\n    unsigned char*       base;\n    unsigned long        size;\n    unsigned long        pos;\n\n    FT_StreamDesc        descriptor;\n    FT_StreamDesc        pathname;\n    FT_Stream_IoFunc     read;\n    FT_Stream_CloseFunc  close;\n\n    FT_Memory            memory;\n    unsigned char*       cursor;\n    unsigned char*       limit;\n\n  } FT_StreamRec;\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTSYSTEM_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/fttrigon.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  fttrigon.h                                                             */\n/*                                                                         */\n/*    FreeType trigonometric functions (specification).                    */\n/*                                                                         */\n/*  Copyright 2001, 2003, 2005, 2007, 2013 by                              */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTTRIGON_H__\n#define __FTTRIGON_H__\n\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*   computations                                                        */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************\n   *\n   * @type:\n   *   FT_Angle\n   *\n   * @description:\n   *   This type is used to model angle values in FreeType.  Note that the\n   *   angle is a 16.16 fixed-point value expressed in degrees.\n   *\n   */\n  typedef FT_Fixed  FT_Angle;\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_ANGLE_PI\n   *\n   * @description:\n   *   The angle pi expressed in @FT_Angle units.\n   *\n   */\n#define FT_ANGLE_PI  ( 180L << 16 )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_ANGLE_2PI\n   *\n   * @description:\n   *   The angle 2*pi expressed in @FT_Angle units.\n   *\n   */\n#define FT_ANGLE_2PI  ( FT_ANGLE_PI * 2 )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_ANGLE_PI2\n   *\n   * @description:\n   *   The angle pi/2 expressed in @FT_Angle units.\n   *\n   */\n#define FT_ANGLE_PI2  ( FT_ANGLE_PI / 2 )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_ANGLE_PI4\n   *\n   * @description:\n   *   The angle pi/4 expressed in @FT_Angle units.\n   *\n   */\n#define FT_ANGLE_PI4  ( FT_ANGLE_PI / 4 )\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Sin\n   *\n   * @description:\n   *   Return the sinus of a given angle in fixed-point format.\n   *\n   * @input:\n   *   angle ::\n   *     The input angle.\n   *\n   * @return:\n   *   The sinus value.\n   *\n   * @note:\n   *   If you need both the sinus and cosinus for a given angle, use the\n   *   function @FT_Vector_Unit.\n   *\n   */\n  FT_EXPORT( FT_Fixed )\n  FT_Sin( FT_Angle  angle );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Cos\n   *\n   * @description:\n   *   Return the cosinus of a given angle in fixed-point format.\n   *\n   * @input:\n   *   angle ::\n   *     The input angle.\n   *\n   * @return:\n   *   The cosinus value.\n   *\n   * @note:\n   *   If you need both the sinus and cosinus for a given angle, use the\n   *   function @FT_Vector_Unit.\n   *\n   */\n  FT_EXPORT( FT_Fixed )\n  FT_Cos( FT_Angle  angle );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Tan\n   *\n   * @description:\n   *   Return the tangent of a given angle in fixed-point format.\n   *\n   * @input:\n   *   angle ::\n   *     The input angle.\n   *\n   * @return:\n   *   The tangent value.\n   *\n   */\n  FT_EXPORT( FT_Fixed )\n  FT_Tan( FT_Angle  angle );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Atan2\n   *\n   * @description:\n   *   Return the arc-tangent corresponding to a given vector (x,y) in\n   *   the 2d plane.\n   *\n   * @input:\n   *   x ::\n   *     The horizontal vector coordinate.\n   *\n   *   y ::\n   *     The vertical vector coordinate.\n   *\n   * @return:\n   *   The arc-tangent value (i.e. angle).\n   *\n   */\n  FT_EXPORT( FT_Angle )\n  FT_Atan2( FT_Fixed  x,\n            FT_Fixed  y );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Angle_Diff\n   *\n   * @description:\n   *   Return the difference between two angles.  The result is always\n   *   constrained to the ]-PI..PI] interval.\n   *\n   * @input:\n   *   angle1 ::\n   *     First angle.\n   *\n   *   angle2 ::\n   *     Second angle.\n   *\n   * @return:\n   *   Constrained value of `value2-value1'.\n   *\n   */\n  FT_EXPORT( FT_Angle )\n  FT_Angle_Diff( FT_Angle  angle1,\n                 FT_Angle  angle2 );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Vector_Unit\n   *\n   * @description:\n   *   Return the unit vector corresponding to a given angle.  After the\n   *   call, the value of `vec.x' will be `sin(angle)', and the value of\n   *   `vec.y' will be `cos(angle)'.\n   *\n   *   This function is useful to retrieve both the sinus and cosinus of a\n   *   given angle quickly.\n   *\n   * @output:\n   *   vec ::\n   *     The address of target vector.\n   *\n   * @input:\n   *   angle ::\n   *     The address of angle.\n   *\n   */\n  FT_EXPORT( void )\n  FT_Vector_Unit( FT_Vector*  vec,\n                  FT_Angle    angle );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Vector_Rotate\n   *\n   * @description:\n   *   Rotate a vector by a given angle.\n   *\n   * @inout:\n   *   vec ::\n   *     The address of target vector.\n   *\n   * @input:\n   *   angle ::\n   *     The address of angle.\n   *\n   */\n  FT_EXPORT( void )\n  FT_Vector_Rotate( FT_Vector*  vec,\n                    FT_Angle    angle );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Vector_Length\n   *\n   * @description:\n   *   Return the length of a given vector.\n   *\n   * @input:\n   *   vec ::\n   *     The address of target vector.\n   *\n   * @return:\n   *   The vector length, expressed in the same units that the original\n   *   vector coordinates.\n   *\n   */\n  FT_EXPORT( FT_Fixed )\n  FT_Vector_Length( FT_Vector*  vec );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Vector_Polarize\n   *\n   * @description:\n   *   Compute both the length and angle of a given vector.\n   *\n   * @input:\n   *   vec ::\n   *     The address of source vector.\n   *\n   * @output:\n   *   length ::\n   *     The vector length.\n   *\n   *   angle ::\n   *     The vector angle.\n   *\n   */\n  FT_EXPORT( void )\n  FT_Vector_Polarize( FT_Vector*  vec,\n                      FT_Fixed   *length,\n                      FT_Angle   *angle );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Vector_From_Polar\n   *\n   * @description:\n   *   Compute vector coordinates from a length and angle.\n   *\n   * @output:\n   *   vec ::\n   *     The address of source vector.\n   *\n   * @input:\n   *   length ::\n   *     The vector length.\n   *\n   *   angle ::\n   *     The vector angle.\n   *\n   */\n  FT_EXPORT( void )\n  FT_Vector_From_Polar( FT_Vector*  vec,\n                        FT_Fixed    length,\n                        FT_Angle    angle );\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTTRIGON_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftttdrv.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftttdrv.h                                                              */\n/*                                                                         */\n/*    FreeType API for controlling the TrueType driver                     */\n/*    (specification only).                                                */\n/*                                                                         */\n/*  Copyright 2013 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTTTDRV_H__\n#define __FTTTDRV_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /**************************************************************************\n   *\n   * @section:\n   *   tt_driver\n   *\n   * @title:\n   *   The TrueType driver\n   *\n   * @abstract:\n   *   Controlling the TrueType driver module.\n   *\n   * @description:\n   *   While FreeType's TrueType driver doesn't expose API functions by\n   *   itself, it is possible to control its behaviour with @FT_Property_Set\n   *   and @FT_Property_Get.  The following lists the available properties\n   *   together with the necessary macros and structures.\n   *\n   *   The TrueType driver's module name is `truetype'.\n   *\n   */\n\n\n  /**************************************************************************\n   *\n   * @property:\n   *   interpreter-version\n   *\n   * @description:\n   *   Currently, two versions are available which represent the bytecode\n   *   interpreter with and without subpixel hinting support,\n   *   respectively.  The default is subpixel support if\n   *   TT_CONFIG_OPTION_SUBPIXEL_HINTING is defined, and no subpixel\n   *   support otherwise (since it isn't available then).\n   *\n   *   If subpixel hinting is on, many TrueType bytecode instructions\n   *   behave differently compared to B/W or grayscale rendering.  The\n   *   main idea is to render at a much increased horizontal resolution,\n   *   then sampling down the created output to subpixel precision.\n   *   However, many older fonts are not suited to this and must be\n   *   specially taken care of by applying (hardcoded) font-specific\n   *   tweaks.\n   *\n   *   Details on subpixel hinting and some of the necessary tweaks can be\n   *   found in Greg Hitchcock's whitepaper at\n   *   `http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx'.\n   *\n   *   The following example code demonstrates how to activate subpixel\n   *   hinting (omitting the error handling).\n   *\n   *   {\n   *     FT_Library  library;\n   *     FT_Face     face;\n   *     FT_UInt     interpreter_version = TT_INTERPRETER_VERSION_38;\n   *\n   *\n   *     FT_Init_FreeType( &library );\n   *\n   *     FT_Property_Set( library, \"truetype\",\n   *                               \"interpreter-version\",\n   *                               &interpreter_version );\n   *   }\n   *\n   * @note:\n   *   This property can be used with @FT_Property_Get also.\n   *\n   */\n\n\n  /**************************************************************************\n   *\n   * @enum:\n   *   TT_INTERPRETER_VERSION_XXX\n   *\n   * @description:\n   *   A list of constants used for the @interpreter-version property to\n   *   select the hinting engine for Truetype fonts.\n   *\n   *   The numeric value in the constant names represents the version\n   *   number as returned by the `GETINFO' bytecode instruction.\n   *\n   * @values:\n   *   TT_INTERPRETER_VERSION_35 ::\n   *     Version~35 corresponds to MS rasterizer v.1.7 as used e.g. in\n   *     Windows~98; only grayscale and B/W rasterizing is supported.\n   *\n   *   TT_INTERPRETER_VERSION_38 ::\n   *     Version~38 corresponds to MS rasterizer v.1.9; it is roughly\n   *     equivalent to the hinting provided by DirectWrite ClearType (as\n   *     can be found, for example, in the Internet Explorer~9 running on\n   *     Windows~7).\n   *\n   * @note:\n   *   This property controls the behaviour of the bytecode interpreter\n   *   and thus how outlines get hinted.  It does *not* control how glyph\n   *   get rasterized!  In particular, it does not control subpixel color\n   *   filtering.\n   *\n   *   If FreeType has not been compiled with configuration option\n   *   FT_CONFIG_OPTION_SUBPIXEL_HINTING, selecting version~38 causes an\n   *   `FT_Err_Unimplemented_Feature' error.\n   *\n   */\n#define TT_INTERPRETER_VERSION_35  35\n#define TT_INTERPRETER_VERSION_38  38\n\n\n /* */\n\nFT_END_HEADER\n\n\n#endif /* __FTTTDRV_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/fttypes.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  fttypes.h                                                              */\n/*                                                                         */\n/*    FreeType simple types definitions (specification only).              */\n/*                                                                         */\n/*  Copyright 1996-2002, 2004, 2006-2009, 2012, 2013 by                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTTYPES_H__\n#define __FTTYPES_H__\n\n\n#include \"../ft2build.h\"\n#include \"config/ftconfig.h\"\n#include \"ftsystem.h\"\n#include \"ftimage.h\"\n\n#include <stddef.h>\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    basic_types                                                        */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Basic Data Types                                                   */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    The basic data types defined by the library.                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the basic data types defined by FreeType~2,  */\n  /*    ranging from simple scalar types to bitmap descriptors.  More      */\n  /*    font-specific structures are defined in a different section.       */\n  /*                                                                       */\n  /* <Order>                                                               */\n  /*    FT_Byte                                                            */\n  /*    FT_Bytes                                                           */\n  /*    FT_Char                                                            */\n  /*    FT_Int                                                             */\n  /*    FT_UInt                                                            */\n  /*    FT_Int16                                                           */\n  /*    FT_UInt16                                                          */\n  /*    FT_Int32                                                           */\n  /*    FT_UInt32                                                          */\n  /*    FT_Short                                                           */\n  /*    FT_UShort                                                          */\n  /*    FT_Long                                                            */\n  /*    FT_ULong                                                           */\n  /*    FT_Bool                                                            */\n  /*    FT_Offset                                                          */\n  /*    FT_PtrDist                                                         */\n  /*    FT_String                                                          */\n  /*    FT_Tag                                                             */\n  /*    FT_Error                                                           */\n  /*    FT_Fixed                                                           */\n  /*    FT_Pointer                                                         */\n  /*    FT_Pos                                                             */\n  /*    FT_Vector                                                          */\n  /*    FT_BBox                                                            */\n  /*    FT_Matrix                                                          */\n  /*    FT_FWord                                                           */\n  /*    FT_UFWord                                                          */\n  /*    FT_F2Dot14                                                         */\n  /*    FT_UnitVector                                                      */\n  /*    FT_F26Dot6                                                         */\n  /*                                                                       */\n  /*                                                                       */\n  /*    FT_Generic                                                         */\n  /*    FT_Generic_Finalizer                                               */\n  /*                                                                       */\n  /*    FT_Bitmap                                                          */\n  /*    FT_Pixel_Mode                                                      */\n  /*    FT_Palette_Mode                                                    */\n  /*    FT_Glyph_Format                                                    */\n  /*    FT_IMAGE_TAG                                                       */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Bool                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef of unsigned char, used for simple booleans.  As usual,   */\n  /*    values 1 and~0 represent true and false, respectively.             */\n  /*                                                                       */\n  typedef unsigned char  FT_Bool;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_FWord                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A signed 16-bit integer used to store a distance in original font  */\n  /*    units.                                                             */\n  /*                                                                       */\n  typedef signed short  FT_FWord;   /* distance in FUnits */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_UFWord                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An unsigned 16-bit integer used to store a distance in original    */\n  /*    font units.                                                        */\n  /*                                                                       */\n  typedef unsigned short  FT_UFWord;  /* unsigned distance */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Char                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple typedef for the _signed_ char type.                       */\n  /*                                                                       */\n  typedef signed char  FT_Char;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Byte                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple typedef for the _unsigned_ char type.                     */\n  /*                                                                       */\n  typedef unsigned char  FT_Byte;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Bytes                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for constant memory areas.                               */\n  /*                                                                       */\n  typedef const FT_Byte*  FT_Bytes;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Tag                                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for 32-bit tags (as used in the SFNT format).            */\n  /*                                                                       */\n  typedef FT_UInt32  FT_Tag;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_String                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple typedef for the char type, usually used for strings.      */\n  /*                                                                       */\n  typedef char  FT_String;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Short                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for signed short.                                        */\n  /*                                                                       */\n  typedef signed short  FT_Short;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_UShort                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for unsigned short.                                      */\n  /*                                                                       */\n  typedef unsigned short  FT_UShort;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Int                                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for the int type.                                        */\n  /*                                                                       */\n  typedef signed int  FT_Int;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_UInt                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for the unsigned int type.                               */\n  /*                                                                       */\n  typedef unsigned int  FT_UInt;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Long                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for signed long.                                         */\n  /*                                                                       */\n  typedef signed long  FT_Long;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_ULong                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for unsigned long.                                       */\n  /*                                                                       */\n  typedef unsigned long  FT_ULong;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_F2Dot14                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A signed 2.14 fixed-point type used for unit vectors.              */\n  /*                                                                       */\n  typedef signed short  FT_F2Dot14;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_F26Dot6                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A signed 26.6 fixed-point type used for vectorial pixel            */\n  /*    coordinates.                                                       */\n  /*                                                                       */\n  typedef signed long  FT_F26Dot6;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Fixed                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This type is used to store 16.16 fixed-point values, like scaling  */\n  /*    values or matrix coefficients.                                     */\n  /*                                                                       */\n  typedef signed long  FT_Fixed;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Error                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The FreeType error code type.  A value of~0 is always interpreted  */\n  /*    as a successful operation.                                         */\n  /*                                                                       */\n  typedef int  FT_Error;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Pointer                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple typedef for a typeless pointer.                           */\n  /*                                                                       */\n  typedef void*  FT_Pointer;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Offset                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This is equivalent to the ANSI~C `size_t' type, i.e., the largest  */\n  /*    _unsigned_ integer type used to express a file size or position,   */\n  /*    or a memory block size.                                            */\n  /*                                                                       */\n  typedef size_t  FT_Offset;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_PtrDist                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This is equivalent to the ANSI~C `ptrdiff_t' type, i.e., the       */\n  /*    largest _signed_ integer type used to express the distance         */\n  /*    between two pointers.                                              */\n  /*                                                                       */\n  typedef ft_ptrdiff_t  FT_PtrDist;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_UnitVector                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple structure used to store a 2D vector unit vector.  Uses    */\n  /*    FT_F2Dot14 types.                                                  */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    x :: Horizontal coordinate.                                        */\n  /*                                                                       */\n  /*    y :: Vertical coordinate.                                          */\n  /*                                                                       */\n  typedef struct  FT_UnitVector_\n  {\n    FT_F2Dot14  x;\n    FT_F2Dot14  y;\n\n  } FT_UnitVector;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Matrix                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple structure used to store a 2x2 matrix.  Coefficients are   */\n  /*    in 16.16 fixed-point format.  The computation performed is:        */\n  /*                                                                       */\n  /*       {                                                               */\n  /*          x' = x*xx + y*xy                                             */\n  /*          y' = x*yx + y*yy                                             */\n  /*       }                                                               */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    xx :: Matrix coefficient.                                          */\n  /*                                                                       */\n  /*    xy :: Matrix coefficient.                                          */\n  /*                                                                       */\n  /*    yx :: Matrix coefficient.                                          */\n  /*                                                                       */\n  /*    yy :: Matrix coefficient.                                          */\n  /*                                                                       */\n  typedef struct  FT_Matrix_\n  {\n    FT_Fixed  xx, xy;\n    FT_Fixed  yx, yy;\n\n  } FT_Matrix;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Data                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Read-only binary data represented as a pointer and a length.       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    pointer :: The data.                                               */\n  /*                                                                       */\n  /*    length  :: The length of the data in bytes.                        */\n  /*                                                                       */\n  typedef struct  FT_Data_\n  {\n    const FT_Byte*  pointer;\n    FT_Int          length;\n\n  } FT_Data;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Generic_Finalizer                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Describe a function used to destroy the `client' data of any       */\n  /*    FreeType object.  See the description of the @FT_Generic type for  */\n  /*    details of usage.                                                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    The address of the FreeType object which is under finalization.    */\n  /*    Its client data is accessed through its `generic' field.           */\n  /*                                                                       */\n  typedef void  (*FT_Generic_Finalizer)(void*  object);\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Generic                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Client applications often need to associate their own data to a    */\n  /*    variety of FreeType core objects.  For example, a text layout API  */\n  /*    might want to associate a glyph cache to a given size object.      */\n  /*                                                                       */\n  /*    Some FreeType object contains a `generic' field, of type           */\n  /*    FT_Generic, which usage is left to client applications and font    */\n  /*    servers.                                                           */\n  /*                                                                       */\n  /*    It can be used to store a pointer to client-specific data, as well */\n  /*    as the address of a `finalizer' function, which will be called by  */\n  /*    FreeType when the object is destroyed (for example, the previous   */\n  /*    client example would put the address of the glyph cache destructor */\n  /*    in the `finalizer' field).                                         */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    data      :: A typeless pointer to any client-specified data. This */\n  /*                 field is completely ignored by the FreeType library.  */\n  /*                                                                       */\n  /*    finalizer :: A pointer to a `generic finalizer' function, which    */\n  /*                 will be called when the object is destroyed.  If this */\n  /*                 field is set to NULL, no code will be called.         */\n  /*                                                                       */\n  typedef struct  FT_Generic_\n  {\n    void*                 data;\n    FT_Generic_Finalizer  finalizer;\n\n  } FT_Generic;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_MAKE_TAG                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This macro converts four-letter tags which are used to label       */\n  /*    TrueType tables into an unsigned long to be used within FreeType.  */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The produced values *must* be 32-bit integers.  Don't redefine     */\n  /*    this macro.                                                        */\n  /*                                                                       */\n#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \\\n          (FT_Tag)                        \\\n          ( ( (FT_ULong)_x1 << 24 ) |     \\\n            ( (FT_ULong)_x2 << 16 ) |     \\\n            ( (FT_ULong)_x3 <<  8 ) |     \\\n              (FT_ULong)_x4         )\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*                                                                       */\n  /*                    L I S T   M A N A G E M E N T                      */\n  /*                                                                       */\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    list_processing                                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_ListNode                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*     Many elements and objects in FreeType are listed through an       */\n  /*     @FT_List record (see @FT_ListRec).  As its name suggests, an      */\n  /*     FT_ListNode is a handle to a single list element.                 */\n  /*                                                                       */\n  typedef struct FT_ListNodeRec_*  FT_ListNode;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_List                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a list record (see @FT_ListRec).                       */\n  /*                                                                       */\n  typedef struct FT_ListRec_*  FT_List;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_ListNodeRec                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to hold a single list element.                    */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    prev :: The previous element in the list.  NULL if first.          */\n  /*                                                                       */\n  /*    next :: The next element in the list.  NULL if last.               */\n  /*                                                                       */\n  /*    data :: A typeless pointer to the listed object.                   */\n  /*                                                                       */\n  typedef struct  FT_ListNodeRec_\n  {\n    FT_ListNode  prev;\n    FT_ListNode  next;\n    void*        data;\n\n  } FT_ListNodeRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_ListRec                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to hold a simple doubly-linked list.  These are   */\n  /*    used in many parts of FreeType.                                    */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    head :: The head (first element) of doubly-linked list.            */\n  /*                                                                       */\n  /*    tail :: The tail (last element) of doubly-linked list.             */\n  /*                                                                       */\n  typedef struct  FT_ListRec_\n  {\n    FT_ListNode  head;\n    FT_ListNode  tail;\n\n  } FT_ListRec;\n\n\n  /* */\n\n#define FT_IS_EMPTY( list )  ( (list).head == 0 )\n#define FT_BOOL( x )  ( (FT_Bool)( x ) )\n\n  /* concatenate C tokens */\n#define FT_ERR_XCAT( x, y )  x ## y\n#define FT_ERR_CAT( x, y )   FT_ERR_XCAT( x, y )\n\n  /* see `ftmoderr.h' for descriptions of the following macros */\n\n#define FT_ERR( e )  FT_ERR_CAT( FT_ERR_PREFIX, e )\n\n#define FT_ERROR_BASE( x )    ( (x) & 0xFF )\n#define FT_ERROR_MODULE( x )  ( (x) & 0xFF00U )\n\n#define FT_ERR_EQ( x, e )                                        \\\n          ( FT_ERROR_BASE( x ) == FT_ERROR_BASE( FT_ERR( e ) ) )\n#define FT_ERR_NEQ( x, e )                                       \\\n          ( FT_ERROR_BASE( x ) != FT_ERROR_BASE( FT_ERR( e ) ) )\n\n\nFT_END_HEADER\n\n#endif /* __FTTYPES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftwinfnt.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftwinfnt.h                                                             */\n/*                                                                         */\n/*    FreeType API for accessing Windows fnt-specific data.                */\n/*                                                                         */\n/*  Copyright 2003, 2004, 2008 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTWINFNT_H__\n#define __FTWINFNT_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    winfnt_fonts                                                       */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Window FNT Files                                                   */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Windows FNT specific API.                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of Windows FNT specific      */\n  /*    functions.                                                         */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************\n   *\n   * @enum:\n   *   FT_WinFNT_ID_XXX\n   *\n   * @description:\n   *   A list of valid values for the `charset' byte in\n   *   @FT_WinFNT_HeaderRec.  Exact mapping tables for the various cpXXXX\n   *   encodings (except for cp1361) can be found at ftp://ftp.unicode.org\n   *   in the MAPPINGS/VENDORS/MICSFT/WINDOWS subdirectory.  cp1361 is\n   *   roughly a superset of MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT.\n   *\n   * @values:\n   *   FT_WinFNT_ID_DEFAULT ::\n   *     This is used for font enumeration and font creation as a\n   *     `don't care' value.  Valid font files don't contain this value.\n   *     When querying for information about the character set of the font\n   *     that is currently selected into a specified device context, this\n   *     return value (of the related Windows API) simply denotes failure.\n   *\n   *   FT_WinFNT_ID_SYMBOL ::\n   *     There is no known mapping table available.\n   *\n   *   FT_WinFNT_ID_MAC ::\n   *     Mac Roman encoding.\n   *\n   *   FT_WinFNT_ID_OEM ::\n   *     From Michael Pöttgen <michael@poettgen.de>:\n   *\n   *       The `Windows Font Mapping' article says that FT_WinFNT_ID_OEM\n   *       is used for the charset of vector fonts, like `modern.fon',\n   *       `roman.fon', and `script.fon' on Windows.\n   *\n   *       The `CreateFont' documentation says: The FT_WinFNT_ID_OEM value\n   *       specifies a character set that is operating-system dependent.\n   *\n   *       The `IFIMETRICS' documentation from the `Windows Driver\n   *       Development Kit' says: This font supports an OEM-specific\n   *       character set.  The OEM character set is system dependent.\n   *\n   *       In general OEM, as opposed to ANSI (i.e., cp1252), denotes the\n   *       second default codepage that most international versions of\n   *       Windows have.  It is one of the OEM codepages from\n   *\n   *         http://www.microsoft.com/globaldev/reference/cphome.mspx,\n   *\n   *       and is used for the `DOS boxes', to support legacy applications.\n   *       A German Windows version for example usually uses ANSI codepage\n   *       1252 and OEM codepage 850.\n   *\n   *   FT_WinFNT_ID_CP874 ::\n   *     A superset of Thai TIS 620 and ISO 8859-11.\n   *\n   *   FT_WinFNT_ID_CP932 ::\n   *     A superset of Japanese Shift-JIS (with minor deviations).\n   *\n   *   FT_WinFNT_ID_CP936 ::\n   *     A superset of simplified Chinese GB 2312-1980 (with different\n   *     ordering and minor deviations).\n   *\n   *   FT_WinFNT_ID_CP949 ::\n   *     A superset of Korean Hangul KS~C 5601-1987 (with different\n   *     ordering and minor deviations).\n   *\n   *   FT_WinFNT_ID_CP950 ::\n   *     A superset of traditional Chinese Big~5 ETen (with different\n   *     ordering and minor deviations).\n   *\n   *   FT_WinFNT_ID_CP1250 ::\n   *     A superset of East European ISO 8859-2 (with slightly different\n   *     ordering).\n   *\n   *   FT_WinFNT_ID_CP1251 ::\n   *     A superset of Russian ISO 8859-5 (with different ordering).\n   *\n   *   FT_WinFNT_ID_CP1252 ::\n   *     ANSI encoding.  A superset of ISO 8859-1.\n   *\n   *   FT_WinFNT_ID_CP1253 ::\n   *     A superset of Greek ISO 8859-7 (with minor modifications).\n   *\n   *   FT_WinFNT_ID_CP1254 ::\n   *     A superset of Turkish ISO 8859-9.\n   *\n   *   FT_WinFNT_ID_CP1255 ::\n   *     A superset of Hebrew ISO 8859-8 (with some modifications).\n   *\n   *   FT_WinFNT_ID_CP1256 ::\n   *     A superset of Arabic ISO 8859-6 (with different ordering).\n   *\n   *   FT_WinFNT_ID_CP1257 ::\n   *     A superset of Baltic ISO 8859-13 (with some deviations).\n   *\n   *   FT_WinFNT_ID_CP1258 ::\n   *     For Vietnamese.  This encoding doesn't cover all necessary\n   *     characters.\n   *\n   *   FT_WinFNT_ID_CP1361 ::\n   *     Korean (Johab).\n   */\n\n#define FT_WinFNT_ID_CP1252    0\n#define FT_WinFNT_ID_DEFAULT   1\n#define FT_WinFNT_ID_SYMBOL    2\n#define FT_WinFNT_ID_MAC      77\n#define FT_WinFNT_ID_CP932   128\n#define FT_WinFNT_ID_CP949   129\n#define FT_WinFNT_ID_CP1361  130\n#define FT_WinFNT_ID_CP936   134\n#define FT_WinFNT_ID_CP950   136\n#define FT_WinFNT_ID_CP1253  161\n#define FT_WinFNT_ID_CP1254  162\n#define FT_WinFNT_ID_CP1258  163\n#define FT_WinFNT_ID_CP1255  177\n#define FT_WinFNT_ID_CP1256  178\n#define FT_WinFNT_ID_CP1257  186\n#define FT_WinFNT_ID_CP1251  204\n#define FT_WinFNT_ID_CP874   222\n#define FT_WinFNT_ID_CP1250  238\n#define FT_WinFNT_ID_OEM     255\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_WinFNT_HeaderRec                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Windows FNT Header info.                                           */\n  /*                                                                       */\n  typedef struct  FT_WinFNT_HeaderRec_\n  {\n    FT_UShort  version;\n    FT_ULong   file_size;\n    FT_Byte    copyright[60];\n    FT_UShort  file_type;\n    FT_UShort  nominal_point_size;\n    FT_UShort  vertical_resolution;\n    FT_UShort  horizontal_resolution;\n    FT_UShort  ascent;\n    FT_UShort  internal_leading;\n    FT_UShort  external_leading;\n    FT_Byte    italic;\n    FT_Byte    underline;\n    FT_Byte    strike_out;\n    FT_UShort  weight;\n    FT_Byte    charset;\n    FT_UShort  pixel_width;\n    FT_UShort  pixel_height;\n    FT_Byte    pitch_and_family;\n    FT_UShort  avg_width;\n    FT_UShort  max_width;\n    FT_Byte    first_char;\n    FT_Byte    last_char;\n    FT_Byte    default_char;\n    FT_Byte    break_char;\n    FT_UShort  bytes_per_row;\n    FT_ULong   device_offset;\n    FT_ULong   face_name_offset;\n    FT_ULong   bits_pointer;\n    FT_ULong   bits_offset;\n    FT_Byte    reserved;\n    FT_ULong   flags;\n    FT_UShort  A_space;\n    FT_UShort  B_space;\n    FT_UShort  C_space;\n    FT_UShort  color_table_offset;\n    FT_ULong   reserved1[4];\n\n  } FT_WinFNT_HeaderRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_WinFNT_Header                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to an @FT_WinFNT_HeaderRec structure.                     */\n  /*                                                                       */\n  typedef struct FT_WinFNT_HeaderRec_*  FT_WinFNT_Header;\n\n\n  /**********************************************************************\n   *\n   * @function:\n   *    FT_Get_WinFNT_Header\n   *\n   * @description:\n   *    Retrieve a Windows FNT font info header.\n   *\n   * @input:\n   *    face    :: A handle to the input face.\n   *\n   * @output:\n   *    aheader :: The WinFNT header.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   This function only works with Windows FNT faces, returning an error\n   *   otherwise.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Get_WinFNT_Header( FT_Face               face,\n                        FT_WinFNT_HeaderRec  *aheader );\n\n\n  /* */\n\nFT_END_HEADER\n\n#endif /* __FTWINFNT_H__ */\n\n\n/* END */\n\n\n/* Local Variables: */\n/* coding: utf-8    */\n/* End:             */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ftxf86.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftxf86.h                                                               */\n/*                                                                         */\n/*    Support functions for X11.                                           */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2004, 2006, 2007 by                              */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTXF86_H__\n#define __FTXF86_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*   font_formats                                                        */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*   Font Formats                                                        */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*   Getting the font format.                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*   The single function in this section can be used to get the font     */\n  /*   format.  Note that this information is not needed normally;         */\n  /*   however, there are special cases (like in PDF devices) where it is  */\n  /*   important to differentiate, in spite of FreeType's uniform API.     */\n  /*                                                                       */\n  /*   This function is in the X11/xf86 namespace for historical reasons   */\n  /*   and in no way depends on that windowing system.                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*   FT_Get_X11_Font_Format                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*   Return a string describing the format of a given face, using values */\n  /*   which can be used as an X11 FONT_PROPERTY.  Possible values are     */\n  /*   `TrueType', `Type~1', `BDF', `PCF', `Type~42', `CID~Type~1', `CFF', */\n  /*   `PFR', and `Windows~FNT'.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*   face ::                                                             */\n  /*     Input face handle.                                                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*   Font format string.  NULL in case of error.                         */\n  /*                                                                       */\n  FT_EXPORT( const char* )\n  FT_Get_X11_Font_Format( FT_Face  face );\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FTXF86_H__ */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/autohint.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  autohint.h                                                             */\n/*                                                                         */\n/*    High-level `autohint' module-specific interface (specification).     */\n/*                                                                         */\n/*  Copyright 1996-2002, 2007, 2009, 2012 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The auto-hinter is used to load and automatically hint glyphs if a    */\n  /* format-specific hinter isn't available.                               */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __AUTOHINT_H__\n#define __AUTOHINT_H__\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* A small technical note regarding automatic hinting in order to        */\n  /* clarify this module interface.                                        */\n  /*                                                                       */\n  /* An automatic hinter might compute two kinds of data for a given face: */\n  /*                                                                       */\n  /* - global hints: Usually some metrics that describe global properties  */\n  /*                 of the face.  It is computed by scanning more or less */\n  /*                 aggressively the glyphs in the face, and thus can be  */\n  /*                 very slow to compute (even if the size of global      */\n  /*                 hints is really small).                               */\n  /*                                                                       */\n  /* - glyph hints:  These describe some important features of the glyph   */\n  /*                 outline, as well as how to align them.  They are      */\n  /*                 generally much faster to compute than global hints.   */\n  /*                                                                       */\n  /* The current FreeType auto-hinter does a pretty good job while         */\n  /* performing fast computations for both global and glyph hints.         */\n  /* However, we might be interested in introducing more complex and       */\n  /* powerful algorithms in the future, like the one described in the John */\n  /* D. Hobby paper, which unfortunately requires a lot more horsepower.   */\n  /*                                                                       */\n  /* Because a sufficiently sophisticated font management system would     */\n  /* typically implement an LRU cache of opened face objects to reduce     */\n  /* memory usage, it is a good idea to be able to avoid recomputing       */\n  /* global hints every time the same face is re-opened.                   */\n  /*                                                                       */\n  /* We thus provide the ability to cache global hints outside of the face */\n  /* object, in order to speed up font re-opening time.  Of course, this   */\n  /* feature is purely optional, so most client programs won't even notice */\n  /* it.                                                                   */\n  /*                                                                       */\n  /* I initially thought that it would be a good idea to cache the glyph   */\n  /* hints too.  However, my general idea now is that if you really need   */\n  /* to cache these too, you are simply in need of a new font format,      */\n  /* where all this information could be stored within the font file and   */\n  /* decoded on the fly.                                                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#include \"../../ft2build.h\"\n#include \"../freetype.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  typedef struct FT_AutoHinterRec_  *FT_AutoHinter;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_AutoHinter_GlobalGetFunc                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the global hints computed for a given face object.  The   */\n  /*    resulting data is dissociated from the face and will survive a     */\n  /*    call to FT_Done_Face().  It must be discarded through the API      */\n  /*    FT_AutoHinter_GlobalDoneFunc().                                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    hinter       :: A handle to the source auto-hinter.                */\n  /*                                                                       */\n  /*    face         :: A handle to the source face object.                */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    global_hints :: A typeless pointer to the global hints.            */\n  /*                                                                       */\n  /*    global_len   :: The size in bytes of the global hints.             */\n  /*                                                                       */\n  typedef void\n  (*FT_AutoHinter_GlobalGetFunc)( FT_AutoHinter  hinter,\n                                  FT_Face        face,\n                                  void**         global_hints,\n                                  long*          global_len );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_AutoHinter_GlobalDoneFunc                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Discard the global hints retrieved through                         */\n  /*    FT_AutoHinter_GlobalGetFunc().  This is the only way these hints   */\n  /*    are freed from memory.                                             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    hinter :: A handle to the auto-hinter module.                      */\n  /*                                                                       */\n  /*    global :: A pointer to retrieved global hints to discard.          */\n  /*                                                                       */\n  typedef void\n  (*FT_AutoHinter_GlobalDoneFunc)( FT_AutoHinter  hinter,\n                                   void*          global );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_AutoHinter_GlobalResetFunc                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function is used to recompute the global metrics in a given   */\n  /*    font.  This is useful when global font data changes (e.g. Multiple */\n  /*    Masters fonts where blend coordinates change).                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    hinter :: A handle to the source auto-hinter.                      */\n  /*                                                                       */\n  /*    face   :: A handle to the face.                                    */\n  /*                                                                       */\n  typedef void\n  (*FT_AutoHinter_GlobalResetFunc)( FT_AutoHinter  hinter,\n                                    FT_Face        face );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_AutoHinter_GlyphLoadFunc                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function is used to load, scale, and automatically hint a     */\n  /*    glyph from a given face.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face        :: A handle to the face.                               */\n  /*                                                                       */\n  /*    glyph_index :: The glyph index.                                    */\n  /*                                                                       */\n  /*    load_flags  :: The load flags.                                     */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function is capable of loading composite glyphs by hinting    */\n  /*    each sub-glyph independently (which improves quality).             */\n  /*                                                                       */\n  /*    It will call the font driver with @FT_Load_Glyph, with             */\n  /*    @FT_LOAD_NO_SCALE set.                                             */\n  /*                                                                       */\n  typedef FT_Error\n  (*FT_AutoHinter_GlyphLoadFunc)( FT_AutoHinter  hinter,\n                                  FT_GlyphSlot   slot,\n                                  FT_Size        size,\n                                  FT_UInt        glyph_index,\n                                  FT_Int32       load_flags );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_AutoHinter_InterfaceRec                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The auto-hinter module's interface.                                */\n  /*                                                                       */\n  typedef struct  FT_AutoHinter_InterfaceRec_\n  {\n    FT_AutoHinter_GlobalResetFunc  reset_face;\n    FT_AutoHinter_GlobalGetFunc    get_global_hints;\n    FT_AutoHinter_GlobalDoneFunc   done_global_hints;\n    FT_AutoHinter_GlyphLoadFunc    load_glyph;\n\n  } FT_AutoHinter_InterfaceRec, *FT_AutoHinter_Interface;\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_AUTOHINTER_INTERFACE(       \\\n          class_,                             \\\n          reset_face_,                        \\\n          get_global_hints_,                  \\\n          done_global_hints_,                 \\\n          load_glyph_ )                       \\\n  FT_CALLBACK_TABLE_DEF                       \\\n  const FT_AutoHinter_InterfaceRec  class_ =  \\\n  {                                           \\\n    reset_face_,                              \\\n    get_global_hints_,                        \\\n    done_global_hints_,                       \\\n    load_glyph_                               \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_AUTOHINTER_INTERFACE(                            \\\n          class_,                                                  \\\n          reset_face_,                                             \\\n          get_global_hints_,                                       \\\n          done_global_hints_,                                      \\\n          load_glyph_ )                                            \\\n  void                                                             \\\n  FT_Init_Class_ ## class_( FT_Library                   library,  \\\n                            FT_AutoHinter_InterfaceRec*  clazz )   \\\n  {                                                                \\\n    FT_UNUSED( library );                                          \\\n                                                                   \\\n    clazz->reset_face        = reset_face_;                        \\\n    clazz->get_global_hints  = get_global_hints_;                  \\\n    clazz->done_global_hints = done_global_hints_;                 \\\n    clazz->load_glyph        = load_glyph_;                        \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\nFT_END_HEADER\n\n#endif /* __AUTOHINT_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/ftcalc.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcalc.h                                                               */\n/*                                                                         */\n/*    Arithmetic computations (specification).                             */\n/*                                                                         */\n/*  Copyright 1996-2006, 2008, 2009, 2012-2013 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTCALC_H__\n#define __FTCALC_H__\n\n\n#include \"../../ft2build.h\"\n#include \"../freetype.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_FixedSqrt                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Computes the square root of a 16.16 fixed-point value.             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    x :: The value to compute the root for.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result of `sqrt(x)'.                                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function is not very fast.                                    */\n  /*                                                                       */\n  FT_BASE( FT_Int32 )\n  FT_SqrtFixed( FT_Int32  x );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* FT_MulDiv() and FT_MulFix() are declared in freetype.h.               */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_MulDiv_No_Round                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A very simple function used to perform the computation `(a*b)/c'   */\n  /*    (without rounding) with maximum accuracy (it uses a 64-bit         */\n  /*    intermediate integer whenever necessary).                          */\n  /*                                                                       */\n  /*    This function isn't necessarily as fast as some processor specific */\n  /*    operations, but is at least completely portable.                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    a :: The first multiplier.                                         */\n  /*    b :: The second multiplier.                                        */\n  /*    c :: The divisor.                                                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result of `(a*b)/c'.  This function never traps when trying to */\n  /*    divide by zero; it simply returns `MaxInt' or `MinInt' depending   */\n  /*    on the signs of `a' and `b'.                                       */\n  /*                                                                       */\n  FT_BASE( FT_Long )\n  FT_MulDiv_No_Round( FT_Long  a,\n                      FT_Long  b,\n                      FT_Long  c );\n\n\n  /*\n   *  A variant of FT_Matrix_Multiply which scales its result afterwards.\n   *  The idea is that both `a' and `b' are scaled by factors of 10 so that\n   *  the values are as precise as possible to get a correct result during\n   *  the 64bit multiplication.  Let `sa' and `sb' be the scaling factors of\n   *  `a' and `b', respectively, then the scaling factor of the result is\n   *  `sa*sb'.\n   */\n  FT_BASE( void )\n  FT_Matrix_Multiply_Scaled( const FT_Matrix*  a,\n                             FT_Matrix        *b,\n                             FT_Long           scaling );\n\n\n  /*\n   *  A variant of FT_Vector_Transform.  See comments for\n   *  FT_Matrix_Multiply_Scaled.\n   */\n  FT_BASE( void )\n  FT_Vector_Transform_Scaled( FT_Vector*        vector,\n                              const FT_Matrix*  matrix,\n                              FT_Long           scaling );\n\n\n  /*\n   *  Return -1, 0, or +1, depending on the orientation of a given corner.\n   *  We use the Cartesian coordinate system, with positive vertical values\n   *  going upwards.  The function returns +1 if the corner turns to the\n   *  left, -1 to the right, and 0 for undecidable cases.\n   */\n  FT_BASE( FT_Int )\n  ft_corner_orientation( FT_Pos  in_x,\n                         FT_Pos  in_y,\n                         FT_Pos  out_x,\n                         FT_Pos  out_y );\n\n  /*\n   *  Return TRUE if a corner is flat or nearly flat.  This is equivalent to\n   *  saying that the angle difference between the `in' and `out' vectors is\n   *  very small.\n   */\n  FT_BASE( FT_Int )\n  ft_corner_is_flat( FT_Pos  in_x,\n                     FT_Pos  in_y,\n                     FT_Pos  out_x,\n                     FT_Pos  out_y );\n\n\n  /*\n   *  Return the most significant bit index.\n   */\n  FT_BASE( FT_Int )\n  FT_MSB( FT_UInt32  z );\n\n\n  /*\n   *  Return sqrt(x*x+y*y), which is the same as `FT_Vector_Length' but uses\n   *  two fixed-point arguments instead.\n   */\n  FT_BASE( FT_Fixed )\n  FT_Hypot( FT_Fixed  x,\n            FT_Fixed  y );\n\n\n#define INT_TO_F26DOT6( x )    ( (FT_Long)(x) << 6  )\n#define INT_TO_F2DOT14( x )    ( (FT_Long)(x) << 14 )\n#define INT_TO_FIXED( x )      ( (FT_Long)(x) << 16 )\n#define F2DOT14_TO_FIXED( x )  ( (FT_Long)(x) << 2  )\n#define FLOAT_TO_FIXED( x )    ( (FT_Long)( x * 65536.0 ) )\n#define FIXED_TO_INT( x )      ( FT_RoundFix( x ) >> 16 )\n\n#define ROUND_F26DOT6( x )     ( x >= 0 ? (    ( (x) + 32 ) & -64 )     \\\n                                        : ( -( ( 32 - (x) ) & -64 ) ) )\n\n\nFT_END_HEADER\n\n#endif /* __FTCALC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/ftdebug.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftdebug.h                                                              */\n/*                                                                         */\n/*    Debugging and logging component (specification).                     */\n/*                                                                         */\n/*  Copyright 1996-2002, 2004, 2006-2009, 2013 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/*                                                                         */\n/*  IMPORTANT: A description of FreeType's debugging support can be        */\n/*             found in `docs/DEBUG.TXT'.  Read it if you need to use or   */\n/*             understand this code.                                       */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTDEBUG_H__\n#define __FTDEBUG_H__\n\n\n#include \"../../ft2build.h\"\n#include \"../config/ftconfig.h\"\n#include \"../freetype.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /* force the definition of FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE */\n  /* is already defined; this simplifies the following #ifdefs            */\n  /*                                                                      */\n#ifdef FT_DEBUG_LEVEL_TRACE\n#undef  FT_DEBUG_LEVEL_ERROR\n#define FT_DEBUG_LEVEL_ERROR\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define the trace enums as well as the trace levels array when they    */\n  /* are needed.                                                           */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n#define FT_TRACE_DEF( x )  trace_ ## x ,\n\n  /* defining the enumeration */\n  typedef enum  FT_Trace_\n  {\n#include \"fttrace.h\"\n    trace_count\n\n  } FT_Trace;\n\n\n  /* defining the array of trace levels, provided by `src/base/ftdebug.c' */\n  extern int  ft_trace_levels[trace_count];\n\n#undef FT_TRACE_DEF\n\n#endif /* FT_DEBUG_LEVEL_TRACE */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define the FT_TRACE macro                                             */\n  /*                                                                       */\n  /* IMPORTANT!                                                            */\n  /*                                                                       */\n  /* Each component must define the macro FT_COMPONENT to a valid FT_Trace */\n  /* value before using any TRACE macro.                                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n#define FT_TRACE( level, varformat )                      \\\n          do                                              \\\n          {                                               \\\n            if ( ft_trace_levels[FT_COMPONENT] >= level ) \\\n              FT_Message varformat;                       \\\n          } while ( 0 )\n\n#else /* !FT_DEBUG_LEVEL_TRACE */\n\n#define FT_TRACE( level, varformat )  do { } while ( 0 )      /* nothing */\n\n#endif /* !FT_DEBUG_LEVEL_TRACE */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Trace_Get_Count                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the number of available trace components.                   */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The number of trace components.  0 if FreeType 2 is not built with */\n  /*    FT_DEBUG_LEVEL_TRACE definition.                                   */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function may be useful if you want to access elements of      */\n  /*    the internal `ft_trace_levels' array by an index.                  */\n  /*                                                                       */\n  FT_BASE( FT_Int )\n  FT_Trace_Get_Count( void );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Trace_Get_Name                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the name of a trace component.                              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    The index of the trace component.                                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The name of the trace component.  This is a statically allocated   */\n  /*    C string, so do not free it after use.  NULL if FreeType 2 is not  */\n  /*    built with FT_DEBUG_LEVEL_TRACE definition.                        */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Use @FT_Trace_Get_Count to get the number of available trace       */\n  /*    components.                                                        */\n  /*                                                                       */\n  /*    This function may be useful if you want to control FreeType 2's    */\n  /*    debug level in your application.                                   */\n  /*                                                                       */\n  FT_BASE( const char * )\n  FT_Trace_Get_Name( FT_Int  idx );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* You need two opening and closing parentheses!                         */\n  /*                                                                       */\n  /* Example: FT_TRACE0(( \"Value is %i\", foo ))                            */\n  /*                                                                       */\n  /* Output of the FT_TRACEX macros is sent to stderr.                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n#define FT_TRACE0( varformat )  FT_TRACE( 0, varformat )\n#define FT_TRACE1( varformat )  FT_TRACE( 1, varformat )\n#define FT_TRACE2( varformat )  FT_TRACE( 2, varformat )\n#define FT_TRACE3( varformat )  FT_TRACE( 3, varformat )\n#define FT_TRACE4( varformat )  FT_TRACE( 4, varformat )\n#define FT_TRACE5( varformat )  FT_TRACE( 5, varformat )\n#define FT_TRACE6( varformat )  FT_TRACE( 6, varformat )\n#define FT_TRACE7( varformat )  FT_TRACE( 7, varformat )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define the FT_ERROR macro.                                            */\n  /*                                                                       */\n  /* Output of this macro is sent to stderr.                               */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifdef FT_DEBUG_LEVEL_ERROR\n\n#define FT_ERROR( varformat )  FT_Message  varformat\n\n#else  /* !FT_DEBUG_LEVEL_ERROR */\n\n#define FT_ERROR( varformat )  do { } while ( 0 )      /* nothing */\n\n#endif /* !FT_DEBUG_LEVEL_ERROR */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define the FT_ASSERT and FT_THROW macros.  The call to `FT_Throw'     */\n  /* makes it possible to easily set a breakpoint at this function.        */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifdef FT_DEBUG_LEVEL_ERROR\n\n#define FT_ASSERT( condition )                                      \\\n          do                                                        \\\n          {                                                         \\\n            if ( !( condition ) )                                   \\\n              FT_Panic( \"assertion failed on line %d of file %s\\n\", \\\n                        __LINE__, __FILE__ );                       \\\n          } while ( 0 )\n\n#define FT_THROW( e )                                   \\\n          ( FT_Throw( FT_ERR_CAT( FT_ERR_PREFIX, e ),   \\\n                      __LINE__,                         \\\n                      __FILE__ )                      | \\\n            FT_ERR_CAT( FT_ERR_PREFIX, e )            )\n\n#else /* !FT_DEBUG_LEVEL_ERROR */\n\n#define FT_ASSERT( condition )  do { } while ( 0 )\n\n#define FT_THROW( e )  FT_ERR_CAT( FT_ERR_PREFIX, e )\n\n#endif /* !FT_DEBUG_LEVEL_ERROR */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define `FT_Message' and `FT_Panic' when needed.                       */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifdef FT_DEBUG_LEVEL_ERROR\n\n#include \"stdio.h\"  /* for vfprintf() */\n\n  /* print a message */\n  FT_BASE( void )\n  FT_Message( const char*  fmt,\n              ... );\n\n  /* print a message and exit */\n  FT_BASE( void )\n  FT_Panic( const char*  fmt,\n            ... );\n\n  /* report file name and line number of an error */\n  FT_BASE( int )\n  FT_Throw( FT_Error     error,\n            int          line,\n            const char*  file );\n\n#endif /* FT_DEBUG_LEVEL_ERROR */\n\n\n  FT_BASE( void )\n  ft_debug_init( void );\n\nFT_END_HEADER\n\n#endif /* __FTDEBUG_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/ftdriver.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftdriver.h                                                             */\n/*                                                                         */\n/*    FreeType font driver interface (specification).                      */\n/*                                                                         */\n/*  Copyright 1996-2003, 2006, 2008, 2011-2013 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTDRIVER_H__\n#define __FTDRIVER_H__\n\n\n#include \"../../ft2build.h\"\n#include \"../ftmodapi.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  typedef FT_Error\n  (*FT_Face_InitFunc)( FT_Stream      stream,\n                       FT_Face        face,\n                       FT_Int         typeface_index,\n                       FT_Int         num_params,\n                       FT_Parameter*  parameters );\n\n  typedef void\n  (*FT_Face_DoneFunc)( FT_Face  face );\n\n\n  typedef FT_Error\n  (*FT_Size_InitFunc)( FT_Size  size );\n\n  typedef void\n  (*FT_Size_DoneFunc)( FT_Size  size );\n\n\n  typedef FT_Error\n  (*FT_Slot_InitFunc)( FT_GlyphSlot  slot );\n\n  typedef void\n  (*FT_Slot_DoneFunc)( FT_GlyphSlot  slot );\n\n\n  typedef FT_Error\n  (*FT_Size_RequestFunc)( FT_Size          size,\n                          FT_Size_Request  req );\n\n  typedef FT_Error\n  (*FT_Size_SelectFunc)( FT_Size   size,\n                         FT_ULong  size_index );\n\n  typedef FT_Error\n  (*FT_Slot_LoadFunc)( FT_GlyphSlot  slot,\n                       FT_Size       size,\n                       FT_UInt       glyph_index,\n                       FT_Int32      load_flags );\n\n\n  typedef FT_UInt\n  (*FT_CharMap_CharIndexFunc)( FT_CharMap  charmap,\n                               FT_Long     charcode );\n\n  typedef FT_Long\n  (*FT_CharMap_CharNextFunc)( FT_CharMap  charmap,\n                              FT_Long     charcode );\n\n\n  typedef FT_Error\n  (*FT_Face_GetKerningFunc)( FT_Face     face,\n                             FT_UInt     left_glyph,\n                             FT_UInt     right_glyph,\n                             FT_Vector*  kerning );\n\n\n  typedef FT_Error\n  (*FT_Face_AttachFunc)( FT_Face    face,\n                         FT_Stream  stream );\n\n\n  typedef FT_Error\n  (*FT_Face_GetAdvancesFunc)( FT_Face    face,\n                              FT_UInt    first,\n                              FT_UInt    count,\n                              FT_Int32   flags,\n                              FT_Fixed*  advances );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Driver_ClassRec                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The font driver class.  This structure mostly contains pointers to */\n  /*    driver methods.                                                    */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    root             :: The parent module.                             */\n  /*                                                                       */\n  /*    face_object_size :: The size of a face object in bytes.            */\n  /*                                                                       */\n  /*    size_object_size :: The size of a size object in bytes.            */\n  /*                                                                       */\n  /*    slot_object_size :: The size of a glyph object in bytes.           */\n  /*                                                                       */\n  /*    init_face        :: The format-specific face constructor.          */\n  /*                                                                       */\n  /*    done_face        :: The format-specific face destructor.           */\n  /*                                                                       */\n  /*    init_size        :: The format-specific size constructor.          */\n  /*                                                                       */\n  /*    done_size        :: The format-specific size destructor.           */\n  /*                                                                       */\n  /*    init_slot        :: The format-specific slot constructor.          */\n  /*                                                                       */\n  /*    done_slot        :: The format-specific slot destructor.           */\n  /*                                                                       */\n  /*                                                                       */\n  /*    load_glyph       :: A function handle to load a glyph to a slot.   */\n  /*                        This field is mandatory!                       */\n  /*                                                                       */\n  /*    get_kerning      :: A function handle to return the unscaled       */\n  /*                        kerning for a given pair of glyphs.  Can be    */\n  /*                        set to 0 if the format doesn't support         */\n  /*                        kerning.                                       */\n  /*                                                                       */\n  /*    attach_file      :: This function handle is used to read           */\n  /*                        additional data for a face from another        */\n  /*                        file/stream.  For example, this can be used to */\n  /*                        add data from AFM or PFM files on a Type 1     */\n  /*                        face, or a CIDMap on a CID-keyed face.         */\n  /*                                                                       */\n  /*    get_advances     :: A function handle used to return advance       */\n  /*                        widths of `count' glyphs (in font units),      */\n  /*                        starting at `first'.  The `vertical' flag must */\n  /*                        be set to get vertical advance heights.  The   */\n  /*                        `advances' buffer is caller-allocated.         */\n  /*                        The idea of this function is to be able to     */\n  /*                        perform device-independent text layout without */\n  /*                        loading a single glyph image.                  */\n  /*                                                                       */\n  /*    request_size     :: A handle to a function used to request the new */\n  /*                        character size.  Can be set to 0 if the        */\n  /*                        scaling done in the base layer suffices.       */\n  /*                                                                       */\n  /*    select_size      :: A handle to a function used to select a new    */\n  /*                        fixed size.  It is used only if                */\n  /*                        @FT_FACE_FLAG_FIXED_SIZES is set.  Can be set  */\n  /*                        to 0 if the scaling done in the base layer     */\n  /*                        suffices.                                      */\n  /* <Note>                                                                */\n  /*    Most function pointers, with the exception of `load_glyph', can be */\n  /*    set to 0 to indicate a default behaviour.                          */\n  /*                                                                       */\n  typedef struct  FT_Driver_ClassRec_\n  {\n    FT_Module_Class          root;\n\n    FT_Long                  face_object_size;\n    FT_Long                  size_object_size;\n    FT_Long                  slot_object_size;\n\n    FT_Face_InitFunc         init_face;\n    FT_Face_DoneFunc         done_face;\n\n    FT_Size_InitFunc         init_size;\n    FT_Size_DoneFunc         done_size;\n\n    FT_Slot_InitFunc         init_slot;\n    FT_Slot_DoneFunc         done_slot;\n\n    FT_Slot_LoadFunc         load_glyph;\n\n    FT_Face_GetKerningFunc   get_kerning;\n    FT_Face_AttachFunc       attach_file;\n    FT_Face_GetAdvancesFunc  get_advances;\n\n    /* since version 2.2 */\n    FT_Size_RequestFunc      request_size;\n    FT_Size_SelectFunc       select_size;\n\n  } FT_Driver_ClassRec, *FT_Driver_Class;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DECLARE_DRIVER                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to create a forward declaration of an FT_Driver_ClassRec      */\n  /*    struct instance.                                                   */\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DEFINE_DRIVER                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to initialize an instance of FT_Driver_ClassRec struct.       */\n  /*                                                                       */\n  /*    When FT_CONFIG_OPTION_PIC is defined a `create' function has to be */\n  /*    called with a pointer where the allocated structure is returned.   */\n  /*    And when it is no longer needed a `destroy' function needs to be   */\n  /*    called to release that allocation.                                 */\n  /*                                                                       */\n  /*    `fcinit.c' (ft_create_default_module_classes) already contains a   */\n  /*    mechanism to call these functions for the default modules          */\n  /*    described in `ftmodule.h'.                                         */\n  /*                                                                       */\n  /*    Notice that the created `create' and `destroy' functions call      */\n  /*    `pic_init' and `pic_free' to allow you to manually allocate and    */\n  /*    initialize any additional global data, like a module specific      */\n  /*    interface, and put them in the global pic container defined in     */\n  /*    `ftpic.h'.  If you don't need them just implement the functions as */\n  /*    empty to resolve the link error.  Also the `pic_init' and          */\n  /*    `pic_free' functions should be declared in `pic.h', to be referred */\n  /*    by driver definition calling `FT_DEFINE_DRIVER' in following.      */\n  /*                                                                       */\n  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */\n  /*    allocated in the global scope (or the scope where the macro is     */\n  /*    used).                                                             */\n  /*                                                                       */\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DECLARE_DRIVER( class_ )  \\\n  FT_CALLBACK_TABLE                  \\\n  const FT_Driver_ClassRec  class_;\n\n#define FT_DEFINE_DRIVER(                    \\\n          class_,                            \\\n          flags_,                            \\\n          size_,                             \\\n          name_,                             \\\n          version_,                          \\\n          requires_,                         \\\n          interface_,                        \\\n          init_,                             \\\n          done_,                             \\\n          get_interface_,                    \\\n          face_object_size_,                 \\\n          size_object_size_,                 \\\n          slot_object_size_,                 \\\n          init_face_,                        \\\n          done_face_,                        \\\n          init_size_,                        \\\n          done_size_,                        \\\n          init_slot_,                        \\\n          done_slot_,                        \\\n          load_glyph_,                       \\\n          get_kerning_,                      \\\n          attach_file_,                      \\\n          get_advances_,                     \\\n          request_size_,                     \\\n          select_size_ )                     \\\n  FT_CALLBACK_TABLE_DEF                      \\\n  const FT_Driver_ClassRec  class_ =         \\\n  {                                          \\\n    FT_DEFINE_ROOT_MODULE( flags_,           \\\n                           size_,            \\\n                           name_,            \\\n                           version_,         \\\n                           requires_,        \\\n                           interface_,       \\\n                           init_,            \\\n                           done_,            \\\n                           get_interface_ )  \\\n                                             \\\n    face_object_size_,                       \\\n    size_object_size_,                       \\\n    slot_object_size_,                       \\\n                                             \\\n    init_face_,                              \\\n    done_face_,                              \\\n                                             \\\n    init_size_,                              \\\n    done_size_,                              \\\n                                             \\\n    init_slot_,                              \\\n    done_slot_,                              \\\n                                             \\\n    load_glyph_,                             \\\n                                             \\\n    get_kerning_,                            \\\n    attach_file_,                            \\\n    get_advances_,                           \\\n                                             \\\n    request_size_,                           \\\n    select_size_                             \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DECLARE_DRIVER( class_ )  FT_DECLARE_MODULE( class_ )\n\n#define FT_DEFINE_DRIVER(                                        \\\n          class_,                                                \\\n          flags_,                                                \\\n          size_,                                                 \\\n          name_,                                                 \\\n          version_,                                              \\\n          requires_,                                             \\\n          interface_,                                            \\\n          init_,                                                 \\\n          done_,                                                 \\\n          get_interface_,                                        \\\n          face_object_size_,                                     \\\n          size_object_size_,                                     \\\n          slot_object_size_,                                     \\\n          init_face_,                                            \\\n          done_face_,                                            \\\n          init_size_,                                            \\\n          done_size_,                                            \\\n          init_slot_,                                            \\\n          done_slot_,                                            \\\n          load_glyph_,                                           \\\n          get_kerning_,                                          \\\n          attach_file_,                                          \\\n          get_advances_,                                         \\\n          request_size_,                                         \\\n          select_size_ )                                         \\\n  void                                                           \\\n  FT_Destroy_Class_ ## class_( FT_Library        library,        \\\n                               FT_Module_Class*  clazz )         \\\n  {                                                              \\\n    FT_Memory        memory = library->memory;                   \\\n    FT_Driver_Class  dclazz = (FT_Driver_Class)clazz;            \\\n                                                                 \\\n                                                                 \\\n    class_ ## _pic_free( library );                              \\\n    if ( dclazz )                                                \\\n      FT_FREE( dclazz );                                         \\\n  }                                                              \\\n                                                                 \\\n                                                                 \\\n  FT_Error                                                       \\\n  FT_Create_Class_ ## class_( FT_Library         library,        \\\n                              FT_Module_Class**  output_class )  \\\n  {                                                              \\\n    FT_Driver_Class  clazz  = NULL;                              \\\n    FT_Error         error;                                      \\\n    FT_Memory        memory = library->memory;                   \\\n                                                                 \\\n                                                                 \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) )                  \\\n      return error;                                              \\\n                                                                 \\\n    error = class_ ## _pic_init( library );                      \\\n    if ( error )                                                 \\\n    {                                                            \\\n      FT_FREE( clazz );                                          \\\n      return error;                                              \\\n    }                                                            \\\n                                                                 \\\n    FT_DEFINE_ROOT_MODULE( flags_,                               \\\n                           size_,                                \\\n                           name_,                                \\\n                           version_,                             \\\n                           requires_,                            \\\n                           interface_,                           \\\n                           init_,                                \\\n                           done_,                                \\\n                           get_interface_ )                      \\\n                                                                 \\\n    clazz->face_object_size = face_object_size_;                 \\\n    clazz->size_object_size = size_object_size_;                 \\\n    clazz->slot_object_size = slot_object_size_;                 \\\n                                                                 \\\n    clazz->init_face        = init_face_;                        \\\n    clazz->done_face        = done_face_;                        \\\n                                                                 \\\n    clazz->init_size        = init_size_;                        \\\n    clazz->done_size        = done_size_;                        \\\n                                                                 \\\n    clazz->init_slot        = init_slot_;                        \\\n    clazz->done_slot        = done_slot_;                        \\\n                                                                 \\\n    clazz->load_glyph       = load_glyph_;                       \\\n                                                                 \\\n    clazz->get_kerning      = get_kerning_;                      \\\n    clazz->attach_file      = attach_file_;                      \\\n    clazz->get_advances     = get_advances_;                     \\\n                                                                 \\\n    clazz->request_size     = request_size_;                     \\\n    clazz->select_size      = select_size_;                      \\\n                                                                 \\\n    *output_class = (FT_Module_Class*)clazz;                     \\\n                                                                 \\\n    return FT_Err_Ok;                                            \\\n  }\n\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\nFT_END_HEADER\n\n#endif /* __FTDRIVER_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/ftgloadr.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftgloadr.h                                                             */\n/*                                                                         */\n/*    The FreeType glyph loader (specification).                           */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2005, 2006 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg                       */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTGLOADR_H__\n#define __FTGLOADR_H__\n\n\n#include \"../../ft2build.h\"\n#include \"../freetype.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_GlyphLoader                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The glyph loader is an internal object used to load several glyphs */\n  /*    together (for example, in the case of composites).                 */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The glyph loader implementation is not part of the high-level API, */\n  /*    hence the forward structure declaration.                           */\n  /*                                                                       */\n  typedef struct FT_GlyphLoaderRec_*  FT_GlyphLoader ;\n\n\n#if 0  /* moved to freetype.h in version 2.2 */\n#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS          1\n#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES      2\n#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID        4\n#define FT_SUBGLYPH_FLAG_SCALE                   8\n#define FT_SUBGLYPH_FLAG_XY_SCALE             0x40\n#define FT_SUBGLYPH_FLAG_2X2                  0x80\n#define FT_SUBGLYPH_FLAG_USE_MY_METRICS      0x200\n#endif\n\n\n  typedef struct  FT_SubGlyphRec_\n  {\n    FT_Int     index;\n    FT_UShort  flags;\n    FT_Int     arg1;\n    FT_Int     arg2;\n    FT_Matrix  transform;\n\n  } FT_SubGlyphRec;\n\n\n  typedef struct  FT_GlyphLoadRec_\n  {\n    FT_Outline   outline;       /* outline                   */\n    FT_Vector*   extra_points;  /* extra points table        */\n    FT_Vector*   extra_points2; /* second extra points table */\n    FT_UInt      num_subglyphs; /* number of subglyphs       */\n    FT_SubGlyph  subglyphs;     /* subglyphs                 */\n\n  } FT_GlyphLoadRec, *FT_GlyphLoad;\n\n\n  typedef struct  FT_GlyphLoaderRec_\n  {\n    FT_Memory        memory;\n    FT_UInt          max_points;\n    FT_UInt          max_contours;\n    FT_UInt          max_subglyphs;\n    FT_Bool          use_extra;\n\n    FT_GlyphLoadRec  base;\n    FT_GlyphLoadRec  current;\n\n    void*            other;            /* for possible future extension? */\n\n  } FT_GlyphLoaderRec;\n\n\n  /* create new empty glyph loader */\n  FT_BASE( FT_Error )\n  FT_GlyphLoader_New( FT_Memory        memory,\n                      FT_GlyphLoader  *aloader );\n\n  /* add an extra points table to a glyph loader */\n  FT_BASE( FT_Error )\n  FT_GlyphLoader_CreateExtra( FT_GlyphLoader  loader );\n\n  /* destroy a glyph loader */\n  FT_BASE( void )\n  FT_GlyphLoader_Done( FT_GlyphLoader  loader );\n\n  /* reset a glyph loader (frees everything int it) */\n  FT_BASE( void )\n  FT_GlyphLoader_Reset( FT_GlyphLoader  loader );\n\n  /* rewind a glyph loader */\n  FT_BASE( void )\n  FT_GlyphLoader_Rewind( FT_GlyphLoader  loader );\n\n  /* check that there is enough space to add `n_points' and `n_contours' */\n  /* to the glyph loader                                                 */\n  FT_BASE( FT_Error )\n  FT_GlyphLoader_CheckPoints( FT_GlyphLoader  loader,\n                              FT_UInt         n_points,\n                              FT_UInt         n_contours );\n\n\n#define FT_GLYPHLOADER_CHECK_P( _loader, _count )                         \\\n   ( (_count) == 0 || ((_loader)->base.outline.n_points    +              \\\n                       (_loader)->current.outline.n_points +              \\\n                       (unsigned long)(_count)) <= (_loader)->max_points )\n\n#define FT_GLYPHLOADER_CHECK_C( _loader, _count )                          \\\n  ( (_count) == 0 || ((_loader)->base.outline.n_contours    +              \\\n                      (_loader)->current.outline.n_contours +              \\\n                      (unsigned long)(_count)) <= (_loader)->max_contours )\n\n#define FT_GLYPHLOADER_CHECK_POINTS( _loader, _points,_contours )      \\\n  ( ( FT_GLYPHLOADER_CHECK_P( _loader, _points )   &&                  \\\n      FT_GLYPHLOADER_CHECK_C( _loader, _contours ) )                   \\\n    ? 0                                                                \\\n    : FT_GlyphLoader_CheckPoints( (_loader), (_points), (_contours) ) )\n\n\n  /* check that there is enough space to add `n_subs' sub-glyphs to */\n  /* a glyph loader                                                 */\n  FT_BASE( FT_Error )\n  FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader  loader,\n                                 FT_UInt         n_subs );\n\n  /* prepare a glyph loader, i.e. empty the current glyph */\n  FT_BASE( void )\n  FT_GlyphLoader_Prepare( FT_GlyphLoader  loader );\n\n  /* add the current glyph to the base glyph */\n  FT_BASE( void )\n  FT_GlyphLoader_Add( FT_GlyphLoader  loader );\n\n  /* copy points from one glyph loader to another */\n  FT_BASE( FT_Error )\n  FT_GlyphLoader_CopyPoints( FT_GlyphLoader  target,\n                             FT_GlyphLoader  source );\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTGLOADR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/ftmemory.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftmemory.h                                                             */\n/*                                                                         */\n/*    The FreeType memory management macros (specification).               */\n/*                                                                         */\n/*  Copyright 1996-2002, 2004-2007, 2010, 2013 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg                       */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTMEMORY_H__\n#define __FTMEMORY_H__\n\n\n#include \"../../ft2build.h\"\n#include \"../config/ftconfig.h\"\n#include \"../fttypes.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_SET_ERROR                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This macro is used to set an implicit `error' variable to a given  */\n  /*    expression's value (usually a function call), and convert it to a  */\n  /*    boolean which is set whenever the value is != 0.                   */\n  /*                                                                       */\n#undef  FT_SET_ERROR\n#define FT_SET_ERROR( expression ) \\\n          ( ( error = (expression) ) != 0 )\n\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                           M E M O R Y                           ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*\n   *  C++ refuses to handle statements like p = (void*)anything, with `p' a\n   *  typed pointer.  Since we don't have a `typeof' operator in standard\n   *  C++, we have to use a template to emulate it.\n   */\n\n#ifdef __cplusplus\n\n  extern \"C++\"\n  template <typename T> inline T*\n  cplusplus_typeof(        T*,\n                    void  *v )\n  {\n    return static_cast <T*> ( v );\n  }\n\n#define FT_ASSIGNP( p, val )  (p) = cplusplus_typeof( (p), (val) )\n\n#else\n\n#define FT_ASSIGNP( p, val )  (p) = (val)\n\n#endif\n\n\n\n#ifdef FT_DEBUG_MEMORY\n\n  FT_BASE( const char* )  _ft_debug_file;\n  FT_BASE( long )         _ft_debug_lineno;\n\n#define FT_DEBUG_INNER( exp )  ( _ft_debug_file   = __FILE__, \\\n                                 _ft_debug_lineno = __LINE__, \\\n                                 (exp) )\n\n#define FT_ASSIGNP_INNER( p, exp )  ( _ft_debug_file   = __FILE__, \\\n                                      _ft_debug_lineno = __LINE__, \\\n                                      FT_ASSIGNP( p, exp ) )\n\n#else /* !FT_DEBUG_MEMORY */\n\n#define FT_DEBUG_INNER( exp )       (exp)\n#define FT_ASSIGNP_INNER( p, exp )  FT_ASSIGNP( p, exp )\n\n#endif /* !FT_DEBUG_MEMORY */\n\n\n  /*\n   *  The allocation functions return a pointer, and the error code\n   *  is written to through the `p_error' parameter.  See below for\n   *  for documentation.\n   */\n\n  FT_BASE( FT_Pointer )\n  ft_mem_alloc( FT_Memory  memory,\n                FT_Long    size,\n                FT_Error  *p_error );\n\n  FT_BASE( FT_Pointer )\n  ft_mem_qalloc( FT_Memory  memory,\n                 FT_Long    size,\n                 FT_Error  *p_error );\n\n  FT_BASE( FT_Pointer )\n  ft_mem_realloc( FT_Memory  memory,\n                  FT_Long    item_size,\n                  FT_Long    cur_count,\n                  FT_Long    new_count,\n                  void*      block,\n                  FT_Error  *p_error );\n\n  FT_BASE( FT_Pointer )\n  ft_mem_qrealloc( FT_Memory  memory,\n                   FT_Long    item_size,\n                   FT_Long    cur_count,\n                   FT_Long    new_count,\n                   void*      block,\n                   FT_Error  *p_error );\n#ifdef _DEBUG\n//#define _XYQ_MEM_DEBUG\n#endif\n  \n#ifdef _XYQ_MEM_DEBUG\t\t/* XYQ */\n  FT_BASE( FT_Pointer )\n\t  ft_mem_allocdebug( FT_Memory  memory,\n\t  FT_Long    size, const char* filename, int line,\n\t  FT_Error  *p_error );\n  \n  FT_BASE( FT_Pointer )\n\t  ft_mem_qallocdebug( FT_Memory  memory,\n\t  FT_Long    size, const char* filename, int line,\n\t  FT_Error  *p_error );\n  \n  FT_BASE( FT_Pointer )\n\t  ft_mem_reallocdebug( FT_Memory  memory,\n\t  FT_Long    item_size,\n\t  FT_Long    cur_count,\n\t  FT_Long    new_count,\n\t  void*      block, const char* filename, int line,\n\t  FT_Error  *p_error );\n  \n  FT_BASE( FT_Pointer )\n\t  ft_mem_qreallocdebug( FT_Memory  memory,\n\t  FT_Long    item_size,\n\t  FT_Long    cur_count,\n\t  FT_Long    new_count,\n\t  void*      block, const char* filename, int line,\n\t  FT_Error  *p_error );\n#endif\n\n\n  FT_BASE( void )\n  ft_mem_free( FT_Memory    memory,\n               const void*  P );\n\n\n#define FT_MEM_FREE( ptr )                \\\n          FT_BEGIN_STMNT                  \\\n            ft_mem_free( memory, (ptr) ); \\\n            (ptr) = NULL;                 \\\n          FT_END_STMNT\n#ifndef _XYQ_MEM_DEBUG\n#define FT_MEM_ALLOC( ptr, size )                                         \\\n\t\t  FT_ASSIGNP_INNER( ptr, ft_mem_alloc( memory, (size), &error ) )\n\n\n#define FT_MEM_REALLOC( ptr, cursz, newsz )                        \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory,           \\\n                                                 1,                \\\n                                                 (FT_Long)(cursz), \\\n                                                 (FT_Long)(newsz), \\\n                                                 (ptr),            \\\n                                                 &error ) )\n\n#define FT_MEM_QALLOC( ptr, size )                               \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qalloc( memory,          \\\n                                                (FT_Long)(size), \\\n                                                &error ) )\n\n#define FT_MEM_QREALLOC( ptr, cursz, newsz )                        \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory,           \\\n                                                  1,                \\\n                                                  (FT_Long)(cursz), \\\n                                                  (FT_Long)(newsz), \\\n                                                  (ptr),            \\\n                                                  &error ) )\n\n#define FT_MEM_ALLOC_MULT( ptr, count, item_size )                     \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory,               \\\n                                                 (FT_Long)(item_size), \\\n                                                 0,                    \\\n                                                 (FT_Long)(count),     \\\n                                                 NULL,                 \\\n                                                 &error ) )\n\n#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz )           \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory,            \\\n                                                 (FT_Long)(itmsz),  \\\n                                                 (FT_Long)(oldcnt), \\\n                                                 (FT_Long)(newcnt), \\\n                                                 (ptr),             \\\n                                                 &error ) )\n\n#define FT_MEM_QALLOC_MULT( ptr, count, item_size )                     \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory,               \\\n                                                  (FT_Long)(item_size), \\\n                                                  0,                    \\\n                                                  (FT_Long)(count),     \\\n                                                  NULL,                 \\\n                                                  &error ) )\n\n#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz)            \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory,            \\\n                                                  (FT_Long)(itmsz),  \\\n                                                  (FT_Long)(oldcnt), \\\n                                                  (FT_Long)(newcnt), \\\n                                                  (ptr),             \\\n                                                  &error ) )\n#define FT_MEM_NEW_ARRAY( ptr, count )                                      \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \\\n                                                 0, (count),                \\\n                                                 NULL, &error ) )\n\n#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz )                             \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \\\n                                                 (cursz), (newsz),          \\\n                                                 (ptr), &error ) )\n\n#define FT_MEM_QNEW_ARRAY( ptr, count )                                      \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \\\n                                                  0, (count),                \\\n                                                  NULL, &error ) )\n\n#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz )                             \\\n\tFT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \\\n\t(cursz), (newsz),          \\\n  (ptr), &error ) )\n  \n#else\n#define FT_MEM_ALLOC( ptr, size )                                         \\\n  FT_ASSIGNP_INNER( ptr, ft_mem_allocdebug( memory, (size), __FILE__, __LINE__, &error ) )\n  \n#define FT_MEM_REALLOC( ptr, cursz, newsz )                        \\\n\tFT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, 1,        \\\n                                                  (cursz), (newsz),          \\\n                                                 (ptr), __FILE__, __LINE__, &error ) )\n\n#define FT_MEM_QALLOC( ptr, size )                                         \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qallocdebug( memory, (size), __FILE__, __LINE__, &error ) )\n\n#define FT_MEM_QREALLOC( ptr, cursz, newsz )                         \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, 1,        \\\n                                                  (cursz), (newsz), \\\n                                                  (ptr), __FILE__, __LINE__, &error ) )\n\n#define FT_MEM_ALLOC_MULT( ptr, count, item_size )                    \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, (item_size), \\\n                                                 0, (count),          \\\n                                                 NULL, __FILE__, __LINE__, &error ) )\n\n#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz )            \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, (itmsz),    \\\n                                                 (oldcnt), (newcnt), \\\n                                                 (ptr), __FILE__, __LINE__, &error ) )\n\n#define FT_MEM_QALLOC_MULT( ptr, count, item_size )                    \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, (item_size), \\\n                                                  0, (count),          \\\n                                                  NULL, __FILE__, __LINE__, &error ) )\n\n#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz)             \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, (itmsz),    \\\n                                                  (oldcnt), (newcnt), \\\n                                                  (ptr), __FILE__, __LINE__, &error ) )\n  /*************************************************************************/\n  /*                                                                       */\n  /* The following functions macros expect that their pointer argument is  */\n  /* _typed_ in order to automatically compute array element sizes.        */\n  /*                                                                       */\n\n#define FT_MEM_NEW_ARRAY( ptr, count )                                      \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, sizeof ( *(ptr) ), \\\n                                                 0, (count),                \\\n                                                 NULL, __FILE__, __LINE__, &error ) )\n\n#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz )                             \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, sizeof ( *(ptr) ), \\\n                                                 (cursz), (newsz),          \\\n                                                 (ptr), __FILE__, __LINE__, &error ) )\n\n#define FT_MEM_QNEW_ARRAY( ptr, count )                                      \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, sizeof ( *(ptr) ), \\\n                                                  0, (count),                \\\n                                                  NULL, __FILE__, __LINE__, &error ) )\n\n#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz )                             \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, sizeof ( *(ptr) ), \\\n                                                  (cursz), (newsz),          \\\n                                                  (ptr), __FILE__, __LINE__, &error ) )\n\n#endif\n\n#define FT_MEM_NEW( ptr )                        \\\n          FT_MEM_ALLOC( ptr, sizeof ( *(ptr) ) )\n\n#define FT_MEM_QNEW( ptr )                        \\\n          FT_MEM_QALLOC( ptr, sizeof ( *(ptr) ) )\n\n#define FT_MEM_SET_ERROR( cond )  ( (cond), error != 0 )\n\n\n#define FT_MEM_SET( dest, byte, count )     ft_memset( dest, byte, count )\n\n#define FT_MEM_COPY( dest, source, count )  ft_memcpy( dest, source, count )\n\n#define FT_MEM_MOVE( dest, source, count )  ft_memmove( dest, source, count )\n\n\n#define FT_MEM_ZERO( dest, count )  FT_MEM_SET( dest, 0, count )\n\n#define FT_ZERO( p )                FT_MEM_ZERO( p, sizeof ( *(p) ) )\n\n\n#define FT_ARRAY_ZERO( dest, count )                        \\\n          FT_MEM_ZERO( dest, (count) * sizeof ( *(dest) ) )\n\n#define FT_ARRAY_COPY( dest, source, count )                        \\\n          FT_MEM_COPY( dest, source, (count) * sizeof ( *(dest) ) )\n\n#define FT_ARRAY_MOVE( dest, source, count )                        \\\n          FT_MEM_MOVE( dest, source, (count) * sizeof ( *(dest) ) )\n\n\n  /*\n   *  Return the maximum number of addressable elements in an array.\n   *  We limit ourselves to INT_MAX, rather than UINT_MAX, to avoid\n   *  any problems.\n   */\n#define FT_ARRAY_MAX( ptr )           ( FT_INT_MAX / sizeof ( *(ptr) ) )\n\n#define FT_ARRAY_CHECK( ptr, count )  ( (count) <= FT_ARRAY_MAX( ptr ) )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The following functions macros expect that their pointer argument is  */\n  /* _typed_ in order to automatically compute array element sizes.        */\n  /*                                                                       */\n\n#define FT_ALLOC( ptr, size )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_ALLOC( ptr, size ) )\n\n#define FT_REALLOC( ptr, cursz, newsz )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_REALLOC( ptr, cursz, newsz ) )\n\n#define FT_ALLOC_MULT( ptr, count, item_size )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_ALLOC_MULT( ptr, count, item_size ) )\n\n#define FT_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz )              \\\n          FT_MEM_SET_ERROR( FT_MEM_REALLOC_MULT( ptr, oldcnt,      \\\n                                                 newcnt, itmsz ) )\n\n#define FT_QALLOC( ptr, size )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_QALLOC( ptr, size ) )\n\n#define FT_QREALLOC( ptr, cursz, newsz )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_QREALLOC( ptr, cursz, newsz ) )\n\n#define FT_QALLOC_MULT( ptr, count, item_size )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_QALLOC_MULT( ptr, count, item_size ) )\n\n#define FT_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz )              \\\n          FT_MEM_SET_ERROR( FT_MEM_QREALLOC_MULT( ptr, oldcnt,      \\\n                                                  newcnt, itmsz ) )\n\n#define FT_FREE( ptr )  FT_MEM_FREE( ptr )\n\n#define FT_NEW( ptr )  FT_MEM_SET_ERROR( FT_MEM_NEW( ptr ) )\n\n#define FT_NEW_ARRAY( ptr, count )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) )\n\n#define FT_RENEW_ARRAY( ptr, curcnt, newcnt )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) )\n\n#define FT_QNEW( ptr )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_QNEW( ptr ) )\n\n#define FT_QNEW_ARRAY( ptr, count )                          \\\n          FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) )\n\n#define FT_QRENEW_ARRAY( ptr, curcnt, newcnt )                          \\\n          FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) )\n\n\n  FT_BASE( FT_Pointer )\n  ft_mem_strdup( FT_Memory    memory,\n                 const char*  str,\n                 FT_Error    *p_error );\n\n  FT_BASE( FT_Pointer )\n  ft_mem_dup( FT_Memory    memory,\n              const void*  address,\n              FT_ULong     size,\n              FT_Error    *p_error );\n\n\n#define FT_MEM_STRDUP( dst, str )                                            \\\n          (dst) = (char*)ft_mem_strdup( memory, (const char*)(str), &error )\n\n#define FT_STRDUP( dst, str )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_STRDUP( dst, str ) )\n\n#define FT_MEM_DUP( dst, address, size )                                    \\\n          (dst) = ft_mem_dup( memory, (address), (FT_ULong)(size), &error )\n\n#define FT_DUP( dst, address, size )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_DUP( dst, address, size ) )\n\n\n  /* Return >= 1 if a truncation occurs.            */\n  /* Return 0 if the source string fits the buffer. */\n  /* This is *not* the same as strlcpy().           */\n  FT_BASE( FT_Int )\n  ft_mem_strcpyn( char*        dst,\n                  const char*  src,\n                  FT_ULong     size );\n\n#define FT_STRCPYN( dst, src, size )                                         \\\n          ft_mem_strcpyn( (char*)dst, (const char*)(src), (FT_ULong)(size) )\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTMEMORY_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/ftobjs.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftobjs.h                                                               */\n/*                                                                         */\n/*    The FreeType private base classes (specification).                   */\n/*                                                                         */\n/*  Copyright 1996-2006, 2008, 2010, 2012-2013 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  This file contains the definition of all internal FreeType classes.  */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTOBJS_H__\n#define __FTOBJS_H__\n\n#include \"../../ft2build.h\"\n#include \"../ftrender.h\"\n#include \"../ftsizes.h\"\n#include \"../ftlcdfil.h\"\n#include \"ftmemory.h\"\n#include \"ftgloadr.h\"\n#include \"ftdriver.h\"\n#include \"autohint.h\"\n#include \"ftserv.h\"\n#include \"ftpic.h\"\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n#include \"../ftincrem.h\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Some generic definitions.                                             */\n  /*                                                                       */\n#ifndef TRUE\n#define TRUE  1\n#endif\n\n#ifndef FALSE\n#define FALSE  0\n#endif\n\n#ifndef NULL\n#define NULL  (void*)0\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The min and max functions missing in C.  As usual, be careful not to  */\n  /* write things like FT_MIN( a++, b++ ) to avoid side effects.           */\n  /*                                                                       */\n#define FT_MIN( a, b )  ( (a) < (b) ? (a) : (b) )\n#define FT_MAX( a, b )  ( (a) > (b) ? (a) : (b) )\n\n#define FT_ABS( a )     ( (a) < 0 ? -(a) : (a) )\n\n\n#define FT_PAD_FLOOR( x, n )  ( (x) & ~((n)-1) )\n#define FT_PAD_ROUND( x, n )  FT_PAD_FLOOR( (x) + ((n)/2), n )\n#define FT_PAD_CEIL( x, n )   FT_PAD_FLOOR( (x) + ((n)-1), n )\n\n#define FT_PIX_FLOOR( x )     ( (x) & ~63 )\n#define FT_PIX_ROUND( x )     FT_PIX_FLOOR( (x) + 32 )\n#define FT_PIX_CEIL( x )      FT_PIX_FLOOR( (x) + 63 )\n\n\n  /*\n   *  Return the highest power of 2 that is <= value; this correspond to\n   *  the highest bit in a given 32-bit value.\n   */\n  FT_BASE( FT_UInt32 )\n  ft_highpow2( FT_UInt32  value );\n\n\n  /*\n   *  character classification functions -- since these are used to parse\n   *  font files, we must not use those in <ctypes.h> which are\n   *  locale-dependent\n   */\n#define  ft_isdigit( x )   ( ( (unsigned)(x) - '0' ) < 10U )\n\n#define  ft_isxdigit( x )  ( ( (unsigned)(x) - '0' ) < 10U || \\\n                             ( (unsigned)(x) - 'a' ) < 6U  || \\\n                             ( (unsigned)(x) - 'A' ) < 6U  )\n\n  /* the next two macros assume ASCII representation */\n#define  ft_isupper( x )  ( ( (unsigned)(x) - 'A' ) < 26U )\n#define  ft_islower( x )  ( ( (unsigned)(x) - 'a' ) < 26U )\n\n#define  ft_isalpha( x )  ( ft_isupper( x ) || ft_islower( x ) )\n#define  ft_isalnum( x )  ( ft_isdigit( x ) || ft_isalpha( x ) )\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                       C H A R M A P S                           ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* handle to internal charmap object */\n  typedef struct FT_CMapRec_*              FT_CMap;\n\n  /* handle to charmap class structure */\n  typedef const struct FT_CMap_ClassRec_*  FT_CMap_Class;\n\n  /* internal charmap object structure */\n  typedef struct  FT_CMapRec_\n  {\n    FT_CharMapRec  charmap;\n    FT_CMap_Class  clazz;\n\n  } FT_CMapRec;\n\n  /* typecase any pointer to a charmap handle */\n#define FT_CMAP( x )              ((FT_CMap)( x ))\n\n  /* obvious macros */\n#define FT_CMAP_PLATFORM_ID( x )  FT_CMAP( x )->charmap.platform_id\n#define FT_CMAP_ENCODING_ID( x )  FT_CMAP( x )->charmap.encoding_id\n#define FT_CMAP_ENCODING( x )     FT_CMAP( x )->charmap.encoding\n#define FT_CMAP_FACE( x )         FT_CMAP( x )->charmap.face\n\n\n  /* class method definitions */\n  typedef FT_Error\n  (*FT_CMap_InitFunc)( FT_CMap     cmap,\n                       FT_Pointer  init_data );\n\n  typedef void\n  (*FT_CMap_DoneFunc)( FT_CMap  cmap );\n\n  typedef FT_UInt\n  (*FT_CMap_CharIndexFunc)( FT_CMap    cmap,\n                            FT_UInt32  char_code );\n\n  typedef FT_UInt\n  (*FT_CMap_CharNextFunc)( FT_CMap     cmap,\n                           FT_UInt32  *achar_code );\n\n  typedef FT_UInt\n  (*FT_CMap_CharVarIndexFunc)( FT_CMap    cmap,\n                               FT_CMap    unicode_cmap,\n                               FT_UInt32  char_code,\n                               FT_UInt32  variant_selector );\n\n  typedef FT_Bool\n  (*FT_CMap_CharVarIsDefaultFunc)( FT_CMap    cmap,\n                                   FT_UInt32  char_code,\n                                   FT_UInt32  variant_selector );\n\n  typedef FT_UInt32 *\n  (*FT_CMap_VariantListFunc)( FT_CMap    cmap,\n                              FT_Memory  mem );\n\n  typedef FT_UInt32 *\n  (*FT_CMap_CharVariantListFunc)( FT_CMap    cmap,\n                                  FT_Memory  mem,\n                                  FT_UInt32  char_code );\n\n  typedef FT_UInt32 *\n  (*FT_CMap_VariantCharListFunc)( FT_CMap    cmap,\n                                  FT_Memory  mem,\n                                  FT_UInt32  variant_selector );\n\n\n  typedef struct  FT_CMap_ClassRec_\n  {\n    FT_ULong               size;\n    FT_CMap_InitFunc       init;\n    FT_CMap_DoneFunc       done;\n    FT_CMap_CharIndexFunc  char_index;\n    FT_CMap_CharNextFunc   char_next;\n\n    /* Subsequent entries are special ones for format 14 -- the variant */\n    /* selector subtable which behaves like no other                    */\n\n    FT_CMap_CharVarIndexFunc      char_var_index;\n    FT_CMap_CharVarIsDefaultFunc  char_var_default;\n    FT_CMap_VariantListFunc       variant_list;\n    FT_CMap_CharVariantListFunc   charvariant_list;\n    FT_CMap_VariantCharListFunc   variantchar_list;\n\n  } FT_CMap_ClassRec;\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DECLARE_CMAP_CLASS( class_ )              \\\n  FT_CALLBACK_TABLE const  FT_CMap_ClassRec class_;\n\n#define FT_DEFINE_CMAP_CLASS(       \\\n          class_,                   \\\n          size_,                    \\\n          init_,                    \\\n          done_,                    \\\n          char_index_,              \\\n          char_next_,               \\\n          char_var_index_,          \\\n          char_var_default_,        \\\n          variant_list_,            \\\n          charvariant_list_,        \\\n          variantchar_list_ )       \\\n  FT_CALLBACK_TABLE_DEF             \\\n  const FT_CMap_ClassRec  class_ =  \\\n  {                                 \\\n    size_,                          \\\n    init_,                          \\\n    done_,                          \\\n    char_index_,                    \\\n    char_next_,                     \\\n    char_var_index_,                \\\n    char_var_default_,              \\\n    variant_list_,                  \\\n    charvariant_list_,              \\\n    variantchar_list_               \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DECLARE_CMAP_CLASS( class_ )                  \\\n  void                                                   \\\n  FT_Init_Class_ ## class_( FT_Library         library,  \\\n                            FT_CMap_ClassRec*  clazz );\n\n#define FT_DEFINE_CMAP_CLASS(                            \\\n          class_,                                        \\\n          size_,                                         \\\n          init_,                                         \\\n          done_,                                         \\\n          char_index_,                                   \\\n          char_next_,                                    \\\n          char_var_index_,                               \\\n          char_var_default_,                             \\\n          variant_list_,                                 \\\n          charvariant_list_,                             \\\n          variantchar_list_ )                            \\\n  void                                                   \\\n  FT_Init_Class_ ## class_( FT_Library         library,  \\\n                            FT_CMap_ClassRec*  clazz )   \\\n  {                                                      \\\n    FT_UNUSED( library );                                \\\n                                                         \\\n    clazz->size             = size_;                     \\\n    clazz->init             = init_;                     \\\n    clazz->done             = done_;                     \\\n    clazz->char_index       = char_index_;               \\\n    clazz->char_next        = char_next_;                \\\n    clazz->char_var_index   = char_var_index_;           \\\n    clazz->char_var_default = char_var_default_;         \\\n    clazz->variant_list     = variant_list_;             \\\n    clazz->charvariant_list = charvariant_list_;         \\\n    clazz->variantchar_list = variantchar_list_;         \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n  /* create a new charmap and add it to charmap->face */\n  FT_BASE( FT_Error )\n  FT_CMap_New( FT_CMap_Class  clazz,\n               FT_Pointer     init_data,\n               FT_CharMap     charmap,\n               FT_CMap       *acmap );\n\n  /* destroy a charmap and remove it from face's list */\n  FT_BASE( void )\n  FT_CMap_Done( FT_CMap  cmap );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Face_InternalRec                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This structure contains the internal fields of each FT_Face        */\n  /*    object.  These fields may change between different releases of     */\n  /*    FreeType.                                                          */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    max_points ::                                                      */\n  /*      The maximum number of points used to store the vectorial outline */\n  /*      of any glyph in this face.  If this value cannot be known in     */\n  /*      advance, or if the face isn't scalable, this should be set to 0. */\n  /*      Only relevant for scalable formats.                              */\n  /*                                                                       */\n  /*    max_contours ::                                                    */\n  /*      The maximum number of contours used to store the vectorial       */\n  /*      outline of any glyph in this face.  If this value cannot be      */\n  /*      known in advance, or if the face isn't scalable, this should be  */\n  /*      set to 0.  Only relevant for scalable formats.                   */\n  /*                                                                       */\n  /*    transform_matrix ::                                                */\n  /*      A 2x2 matrix of 16.16 coefficients used to transform glyph       */\n  /*      outlines after they are loaded from the font.  Only used by the  */\n  /*      convenience functions.                                           */\n  /*                                                                       */\n  /*    transform_delta ::                                                 */\n  /*      A translation vector used to transform glyph outlines after they */\n  /*      are loaded from the font.  Only used by the convenience          */\n  /*      functions.                                                       */\n  /*                                                                       */\n  /*    transform_flags ::                                                 */\n  /*      Some flags used to classify the transform.  Only used by the     */\n  /*      convenience functions.                                           */\n  /*                                                                       */\n  /*    services ::                                                        */\n  /*      A cache for frequently used services.  It should be only         */\n  /*      accessed with the macro `FT_FACE_LOOKUP_SERVICE'.                */\n  /*                                                                       */\n  /*    incremental_interface ::                                           */\n  /*      If non-null, the interface through which glyph data and metrics  */\n  /*      are loaded incrementally for faces that do not provide all of    */\n  /*      this data when first opened.  This field exists only if          */\n  /*      @FT_CONFIG_OPTION_INCREMENTAL is defined.                        */\n  /*                                                                       */\n  /*    ignore_unpatented_hinter ::                                        */\n  /*      This boolean flag instructs the glyph loader to ignore the       */\n  /*      native font hinter, if one is found.  This is exclusively used   */\n  /*      in the case when the unpatented hinter is compiled within the    */\n  /*      library.                                                         */\n  /*                                                                       */\n  /*    refcount ::                                                        */\n  /*      A counter initialized to~1 at the time an @FT_Face structure is  */\n  /*      created.  @FT_Reference_Face increments this counter, and        */\n  /*      @FT_Done_Face only destroys a face if the counter is~1,          */\n  /*      otherwise it simply decrements it.                               */\n  /*                                                                       */\n  typedef struct  FT_Face_InternalRec_\n  {\n    FT_Matrix           transform_matrix;\n    FT_Vector           transform_delta;\n    FT_Int              transform_flags;\n\n    FT_ServiceCacheRec  services;\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    FT_Incremental_InterfaceRec*  incremental_interface;\n#endif\n\n    FT_Bool             ignore_unpatented_hinter;\n    FT_Int              refcount;\n\n  } FT_Face_InternalRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Slot_InternalRec                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This structure contains the internal fields of each FT_GlyphSlot   */\n  /*    object.  These fields may change between different releases of     */\n  /*    FreeType.                                                          */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    loader            :: The glyph loader object used to load outlines */\n  /*                         into the glyph slot.                          */\n  /*                                                                       */\n  /*    flags             :: Possible values are zero or                   */\n  /*                         FT_GLYPH_OWN_BITMAP.  The latter indicates    */\n  /*                         that the FT_GlyphSlot structure owns the      */\n  /*                         bitmap buffer.                                */\n  /*                                                                       */\n  /*    glyph_transformed :: Boolean.  Set to TRUE when the loaded glyph   */\n  /*                         must be transformed through a specific        */\n  /*                         font transformation.  This is _not_ the same  */\n  /*                         as the face transform set through             */\n  /*                         FT_Set_Transform().                           */\n  /*                                                                       */\n  /*    glyph_matrix      :: The 2x2 matrix corresponding to the glyph     */\n  /*                         transformation, if necessary.                 */\n  /*                                                                       */\n  /*    glyph_delta       :: The 2d translation vector corresponding to    */\n  /*                         the glyph transformation, if necessary.       */\n  /*                                                                       */\n  /*    glyph_hints       :: Format-specific glyph hints management.       */\n  /*                                                                       */\n\n#define FT_GLYPH_OWN_BITMAP  0x1\n\n  typedef struct  FT_Slot_InternalRec_\n  {\n    FT_GlyphLoader  loader;\n    FT_UInt         flags;\n    FT_Bool         glyph_transformed;\n    FT_Matrix       glyph_matrix;\n    FT_Vector       glyph_delta;\n    void*           glyph_hints;\n\n  } FT_GlyphSlot_InternalRec;\n\n\n#if 0\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Size_InternalRec                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This structure contains the internal fields of each FT_Size        */\n  /*    object.  Currently, it's empty.                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n  typedef struct  FT_Size_InternalRec_\n  {\n    /* empty */\n\n  } FT_Size_InternalRec;\n\n#endif\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                         M O D U L E S                           ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_ModuleRec                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A module object instance.                                          */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    clazz   :: A pointer to the module's class.                        */\n  /*                                                                       */\n  /*    library :: A handle to the parent library object.                  */\n  /*                                                                       */\n  /*    memory  :: A handle to the memory manager.                         */\n  /*                                                                       */\n  typedef struct  FT_ModuleRec_\n  {\n    FT_Module_Class*  clazz;\n    FT_Library        library;\n    FT_Memory         memory;\n\n  } FT_ModuleRec;\n\n\n  /* typecast an object to an FT_Module */\n#define FT_MODULE( x )          ((FT_Module)( x ))\n#define FT_MODULE_CLASS( x )    FT_MODULE( x )->clazz\n#define FT_MODULE_LIBRARY( x )  FT_MODULE( x )->library\n#define FT_MODULE_MEMORY( x )   FT_MODULE( x )->memory\n\n\n#define FT_MODULE_IS_DRIVER( x )  ( FT_MODULE_CLASS( x )->module_flags & \\\n                                    FT_MODULE_FONT_DRIVER )\n\n#define FT_MODULE_IS_RENDERER( x )  ( FT_MODULE_CLASS( x )->module_flags & \\\n                                      FT_MODULE_RENDERER )\n\n#define FT_MODULE_IS_HINTER( x )  ( FT_MODULE_CLASS( x )->module_flags & \\\n                                    FT_MODULE_HINTER )\n\n#define FT_MODULE_IS_STYLER( x )  ( FT_MODULE_CLASS( x )->module_flags & \\\n                                    FT_MODULE_STYLER )\n\n#define FT_DRIVER_IS_SCALABLE( x )  ( FT_MODULE_CLASS( x )->module_flags & \\\n                                      FT_MODULE_DRIVER_SCALABLE )\n\n#define FT_DRIVER_USES_OUTLINES( x )  !( FT_MODULE_CLASS( x )->module_flags & \\\n                                         FT_MODULE_DRIVER_NO_OUTLINES )\n\n#define FT_DRIVER_HAS_HINTER( x )  ( FT_MODULE_CLASS( x )->module_flags & \\\n                                     FT_MODULE_DRIVER_HAS_HINTER )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Module_Interface                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Finds a module and returns its specific interface as a typeless    */\n  /*    pointer.                                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library     :: A handle to the library object.                     */\n  /*                                                                       */\n  /*    module_name :: The module's name (as an ASCII string).             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A module-specific interface if available, 0 otherwise.             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You should better be familiar with FreeType internals to know      */\n  /*    which module to look for, and what its interface is :-)            */\n  /*                                                                       */\n  FT_BASE( const void* )\n  FT_Get_Module_Interface( FT_Library   library,\n                           const char*  mod_name );\n\n  FT_BASE( FT_Pointer )\n  ft_module_get_service( FT_Module    module,\n                         const char*  service_id );\n\n  /* */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****   F A C E,   S I Z E   &   G L Y P H   S L O T   O B J E C T S  ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* a few macros used to perform easy typecasts with minimal brain damage */\n\n#define FT_FACE( x )          ((FT_Face)(x))\n#define FT_SIZE( x )          ((FT_Size)(x))\n#define FT_SLOT( x )          ((FT_GlyphSlot)(x))\n\n#define FT_FACE_DRIVER( x )   FT_FACE( x )->driver\n#define FT_FACE_LIBRARY( x )  FT_FACE_DRIVER( x )->root.library\n#define FT_FACE_MEMORY( x )   FT_FACE( x )->memory\n#define FT_FACE_STREAM( x )   FT_FACE( x )->stream\n\n#define FT_SIZE_FACE( x )     FT_SIZE( x )->face\n#define FT_SLOT_FACE( x )     FT_SLOT( x )->face\n\n#define FT_FACE_SLOT( x )     FT_FACE( x )->glyph\n#define FT_FACE_SIZE( x )     FT_FACE( x )->size\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_GlyphSlot                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    It is sometimes useful to have more than one glyph slot for a      */\n  /*    given face object.  This function is used to create additional     */\n  /*    slots.  All of them are automatically discarded when the face is   */\n  /*    destroyed.                                                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face  :: A handle to a parent face object.                         */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aslot :: A handle to a new glyph slot object.                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_BASE( FT_Error )\n  FT_New_GlyphSlot( FT_Face        face,\n                    FT_GlyphSlot  *aslot );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Done_GlyphSlot                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Destroys a given glyph slot.  Remember however that all slots are  */\n  /*    automatically destroyed with its parent.  Using this function is   */\n  /*    not always mandatory.                                              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    slot :: A handle to a target glyph slot.                           */\n  /*                                                                       */\n  FT_BASE( void )\n  FT_Done_GlyphSlot( FT_GlyphSlot  slot );\n\n /* */\n\n#define FT_REQUEST_WIDTH( req )                                            \\\n          ( (req)->horiResolution                                          \\\n              ? (FT_Pos)( (req)->width * (req)->horiResolution + 36 ) / 72 \\\n              : (req)->width )\n\n#define FT_REQUEST_HEIGHT( req )                                            \\\n          ( (req)->vertResolution                                           \\\n              ? (FT_Pos)( (req)->height * (req)->vertResolution + 36 ) / 72 \\\n              : (req)->height )\n\n\n  /* Set the metrics according to a bitmap strike. */\n  FT_BASE( void )\n  FT_Select_Metrics( FT_Face   face,\n                     FT_ULong  strike_index );\n\n\n  /* Set the metrics according to a size request. */\n  FT_BASE( void )\n  FT_Request_Metrics( FT_Face          face,\n                      FT_Size_Request  req );\n\n\n  /* Match a size request against `available_sizes'. */\n  FT_BASE( FT_Error )\n  FT_Match_Size( FT_Face          face,\n                 FT_Size_Request  req,\n                 FT_Bool          ignore_width,\n                 FT_ULong*        size_index );\n\n\n  /* Use the horizontal metrics to synthesize the vertical metrics. */\n  /* If `advance' is zero, it is also synthesized.                  */\n  FT_BASE( void )\n  ft_synthesize_vertical_metrics( FT_Glyph_Metrics*  metrics,\n                                  FT_Pos             advance );\n\n\n  /* Free the bitmap of a given glyphslot when needed (i.e., only when it */\n  /* was allocated with ft_glyphslot_alloc_bitmap).                       */\n  FT_BASE( void )\n  ft_glyphslot_free_bitmap( FT_GlyphSlot  slot );\n\n\n  /* Allocate a new bitmap buffer in a glyph slot. */\n  FT_BASE( FT_Error )\n  ft_glyphslot_alloc_bitmap( FT_GlyphSlot  slot,\n                             FT_ULong      size );\n\n\n  /* Set the bitmap buffer in a glyph slot to a given pointer.  The buffer */\n  /* will not be freed by a later call to ft_glyphslot_free_bitmap.        */\n  FT_BASE( void )\n  ft_glyphslot_set_bitmap( FT_GlyphSlot  slot,\n                           FT_Byte*      buffer );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                        R E N D E R E R S                        ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n#define FT_RENDERER( x )      ((FT_Renderer)( x ))\n#define FT_GLYPH( x )         ((FT_Glyph)( x ))\n#define FT_BITMAP_GLYPH( x )  ((FT_BitmapGlyph)( x ))\n#define FT_OUTLINE_GLYPH( x ) ((FT_OutlineGlyph)( x ))\n\n\n  typedef struct  FT_RendererRec_\n  {\n    FT_ModuleRec            root;\n    FT_Renderer_Class*      clazz;\n    FT_Glyph_Format         glyph_format;\n    FT_Glyph_Class          glyph_class;\n\n    FT_Raster               raster;\n    FT_Raster_Render_Func   raster_render;\n    FT_Renderer_RenderFunc  render;\n\n  } FT_RendererRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                    F O N T   D R I V E R S                      ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* typecast a module into a driver easily */\n#define FT_DRIVER( x )        ((FT_Driver)(x))\n\n  /* typecast a module as a driver, and get its driver class */\n#define FT_DRIVER_CLASS( x )  FT_DRIVER( x )->clazz\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_DriverRec                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The root font driver class.  A font driver is responsible for      */\n  /*    managing and loading font files of a given format.                 */\n  /*                                                                       */\n  /*  <Fields>                                                             */\n  /*     root         :: Contains the fields of the root module class.     */\n  /*                                                                       */\n  /*     clazz        :: A pointer to the font driver's class.  Note that  */\n  /*                     this is NOT root.clazz.  `class' wasn't used      */\n  /*                     as it is a reserved word in C++.                  */\n  /*                                                                       */\n  /*     faces_list   :: The list of faces currently opened by this        */\n  /*                     driver.                                           */\n  /*                                                                       */\n  /*     glyph_loader :: The glyph loader for all faces managed by this    */\n  /*                     driver.  This object isn't defined for unscalable */\n  /*                     formats.                                          */\n  /*                                                                       */\n  typedef struct  FT_DriverRec_\n  {\n    FT_ModuleRec     root;\n    FT_Driver_Class  clazz;\n    FT_ListRec       faces_list;\n    FT_GlyphLoader   glyph_loader;\n\n  } FT_DriverRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                       L I B R A R I E S                         ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* This hook is used by the TrueType debugger.  It must be set to an */\n  /* alternate truetype bytecode interpreter function.                 */\n#define FT_DEBUG_HOOK_TRUETYPE            0\n\n\n  /* Set this debug hook to a non-null pointer to force unpatented hinting */\n  /* for all faces when both TT_USE_BYTECODE_INTERPRETER and               */\n  /* TT_CONFIG_OPTION_UNPATENTED_HINTING are defined.  This is only used   */\n  /* during debugging.                                                     */\n#define FT_DEBUG_HOOK_UNPATENTED_HINTING  1\n\n\n  typedef void  (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap*      bitmap,\n                                            FT_Render_Mode  render_mode,\n                                            FT_Library      library );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_LibraryRec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The FreeType library class.  This is the root of all FreeType      */\n  /*    data.  Use FT_New_Library() to create a library object, and        */\n  /*    FT_Done_Library() to discard it and all child objects.             */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    memory           :: The library's memory object.  Manages memory   */\n  /*                        allocation.                                    */\n  /*                                                                       */\n  /*    version_major    :: The major version number of the library.       */\n  /*                                                                       */\n  /*    version_minor    :: The minor version number of the library.       */\n  /*                                                                       */\n  /*    version_patch    :: The current patch level of the library.        */\n  /*                                                                       */\n  /*    num_modules      :: The number of modules currently registered     */\n  /*                        within this library.  This is set to 0 for new */\n  /*                        libraries.  New modules are added through the  */\n  /*                        FT_Add_Module() API function.                  */\n  /*                                                                       */\n  /*    modules          :: A table used to store handles to the currently */\n  /*                        registered modules. Note that each font driver */\n  /*                        contains a list of its opened faces.           */\n  /*                                                                       */\n  /*    renderers        :: The list of renderers currently registered     */\n  /*                        within the library.                            */\n  /*                                                                       */\n  /*    cur_renderer     :: The current outline renderer.  This is a       */\n  /*                        shortcut used to avoid parsing the list on     */\n  /*                        each call to FT_Outline_Render().  It is a     */\n  /*                        handle to the current renderer for the         */\n  /*                        FT_GLYPH_FORMAT_OUTLINE format.                */\n  /*                                                                       */\n  /*    auto_hinter      :: XXX                                            */\n  /*                                                                       */\n  /*    raster_pool      :: The raster object's render pool.  This can     */\n  /*                        ideally be changed dynamically at run-time.    */\n  /*                                                                       */\n  /*    raster_pool_size :: The size of the render pool in bytes.          */\n  /*                                                                       */\n  /*    debug_hooks      :: XXX                                            */\n  /*                                                                       */\n  /*    lcd_filter       :: If subpixel rendering is activated, the        */\n  /*                        selected LCD filter mode.                      */\n  /*                                                                       */\n  /*    lcd_extra        :: If subpixel rendering is activated, the number */\n  /*                        of extra pixels needed for the LCD filter.     */\n  /*                                                                       */\n  /*    lcd_weights      :: If subpixel rendering is activated, the LCD    */\n  /*                        filter weights, if any.                        */\n  /*                                                                       */\n  /*    lcd_filter_func  :: If subpixel rendering is activated, the LCD    */\n  /*                        filtering callback function.                   */\n  /*                                                                       */\n  /*    pic_container    :: Contains global structs and tables, instead    */\n  /*                        of defining them globallly.                    */\n  /*                                                                       */\n  /*    refcount         :: A counter initialized to~1 at the time an      */\n  /*                        @FT_Library structure is created.              */\n  /*                        @FT_Reference_Library increments this counter, */\n  /*                        and @FT_Done_Library only destroys a library   */\n  /*                        if the counter is~1, otherwise it simply       */\n  /*                        decrements it.                                 */\n  /*                                                                       */\n  typedef struct  FT_LibraryRec_\n  {\n    FT_Memory          memory;           /* library's memory manager */\n\n    FT_Int             version_major;\n    FT_Int             version_minor;\n    FT_Int             version_patch;\n\n    FT_UInt            num_modules;\n    FT_Module          modules[FT_MAX_MODULES];  /* module objects  */\n\n    FT_ListRec         renderers;        /* list of renderers        */\n    FT_Renderer        cur_renderer;     /* current outline renderer */\n    FT_Module          auto_hinter;\n\n    FT_Byte*           raster_pool;      /* scan-line conversion */\n                                         /* render pool          */\n    FT_ULong           raster_pool_size; /* size of render pool in bytes */\n\n    FT_DebugHook_Func  debug_hooks[4];\n\n#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING\n    FT_LcdFilter             lcd_filter;\n    FT_Int                   lcd_extra;        /* number of extra pixels */\n    FT_Byte                  lcd_weights[7];   /* filter weights, if any */\n    FT_Bitmap_LcdFilterFunc  lcd_filter_func;  /* filtering callback     */\n#endif\n\n#ifdef FT_CONFIG_OPTION_PIC\n    FT_PIC_Container   pic_container;\n#endif\n\n    FT_Int             refcount;\n\n  } FT_LibraryRec;\n\n\n  FT_BASE( FT_Renderer )\n  FT_Lookup_Renderer( FT_Library       library,\n                      FT_Glyph_Format  format,\n                      FT_ListNode*     node );\n\n  FT_BASE( FT_Error )\n  FT_Render_Glyph_Internal( FT_Library      library,\n                            FT_GlyphSlot    slot,\n                            FT_Render_Mode  render_mode );\n\n  typedef const char*\n  (*FT_Face_GetPostscriptNameFunc)( FT_Face  face );\n\n  typedef FT_Error\n  (*FT_Face_GetGlyphNameFunc)( FT_Face     face,\n                               FT_UInt     glyph_index,\n                               FT_Pointer  buffer,\n                               FT_UInt     buffer_max );\n\n  typedef FT_UInt\n  (*FT_Face_GetGlyphNameIndexFunc)( FT_Face     face,\n                                    FT_String*  glyph_name );\n\n\n#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Memory                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Creates a new memory object.                                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A pointer to the new memory object.  0 in case of error.           */\n  /*                                                                       */\n  FT_BASE( FT_Memory )\n  FT_New_Memory( void );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Done_Memory                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Discards memory manager.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory :: A handle to the memory manager.                          */\n  /*                                                                       */\n  FT_BASE( void )\n  FT_Done_Memory( FT_Memory  memory );\n\n#endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */\n\n\n  /* Define default raster's interface.  The default raster is located in  */\n  /* `src/base/ftraster.c'.                                                */\n  /*                                                                       */\n  /* Client applications can register new rasters through the              */\n  /* FT_Set_Raster() API.                                                  */\n\n#ifndef FT_NO_DEFAULT_RASTER\n  FT_EXPORT_VAR( FT_Raster_Funcs )  ft_default_raster;\n#endif\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                      P I C   S U P P O R T                      ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* PIC support macros for ftimage.h */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DEFINE_OUTLINE_FUNCS                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to initialize an instance of FT_Outline_Funcs struct.         */\n  /*    When FT_CONFIG_OPTION_PIC is defined an init funtion will need to  */\n  /*    be called with a pre-allocated structure to be filled.             */\n  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */\n  /*    allocated in the global scope (or the scope where the macro        */\n  /*    is used).                                                          */\n  /*                                                                       */\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_OUTLINE_FUNCS(           \\\n          class_,                          \\\n          move_to_,                        \\\n          line_to_,                        \\\n          conic_to_,                       \\\n          cubic_to_,                       \\\n          shift_,                          \\\n          delta_ )                         \\\n  static const  FT_Outline_Funcs class_ =  \\\n  {                                        \\\n    move_to_,                              \\\n    line_to_,                              \\\n    conic_to_,                             \\\n    cubic_to_,                             \\\n    shift_,                                \\\n    delta_                                 \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_OUTLINE_FUNCS(                     \\\n          class_,                                    \\\n          move_to_,                                  \\\n          line_to_,                                  \\\n          conic_to_,                                 \\\n          cubic_to_,                                 \\\n          shift_,                                    \\\n          delta_ )                                   \\\n  static FT_Error                                    \\\n  Init_Class_ ## class_( FT_Outline_Funcs*  clazz )  \\\n  {                                                  \\\n    clazz->move_to  = move_to_;                      \\\n    clazz->line_to  = line_to_;                      \\\n    clazz->conic_to = conic_to_;                     \\\n    clazz->cubic_to = cubic_to_;                     \\\n    clazz->shift    = shift_;                        \\\n    clazz->delta    = delta_;                        \\\n                                                     \\\n    return FT_Err_Ok;                                \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DEFINE_RASTER_FUNCS                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to initialize an instance of FT_Raster_Funcs struct.          */\n  /*    When FT_CONFIG_OPTION_PIC is defined an init funtion will need to  */\n  /*    be called with a pre-allocated structure to be filled.             */\n  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */\n  /*    allocated in the global scope (or the scope where the macro        */\n  /*    is used).                                                          */\n  /*                                                                       */\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_RASTER_FUNCS(    \\\n          class_,                  \\\n          glyph_format_,           \\\n          raster_new_,             \\\n          raster_reset_,           \\\n          raster_set_mode_,        \\\n          raster_render_,          \\\n          raster_done_ )           \\\n  const FT_Raster_Funcs  class_ =  \\\n  {                                \\\n    glyph_format_,                 \\\n    raster_new_,                   \\\n    raster_reset_,                 \\\n    raster_set_mode_,              \\\n    raster_render_,                \\\n    raster_done_                   \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_RASTER_FUNCS(                        \\\n          class_,                                      \\\n          glyph_format_,                               \\\n          raster_new_,                                 \\\n          raster_reset_,                               \\\n          raster_set_mode_,                            \\\n          raster_render_,                              \\\n          raster_done_ )                               \\\n  void                                                 \\\n  FT_Init_Class_ ## class_( FT_Raster_Funcs*  clazz )  \\\n  {                                                    \\\n    clazz->glyph_format    = glyph_format_;            \\\n    clazz->raster_new      = raster_new_;              \\\n    clazz->raster_reset    = raster_reset_;            \\\n    clazz->raster_set_mode = raster_set_mode_;         \\\n    clazz->raster_render   = raster_render_;           \\\n    clazz->raster_done     = raster_done_;             \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n  /* PIC support macros for ftrender.h */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DEFINE_GLYPH                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to initialize an instance of FT_Glyph_Class struct.           */\n  /*    When FT_CONFIG_OPTION_PIC is defined an init funtion will need to  */\n  /*    be called with a pre-allocated stcture to be filled.               */\n  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */\n  /*    allocated in the global scope (or the scope where the macro        */\n  /*    is used).                                                          */\n  /*                                                                       */\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_GLYPH(          \\\n          class_,                 \\\n          size_,                  \\\n          format_,                \\\n          init_,                  \\\n          done_,                  \\\n          copy_,                  \\\n          transform_,             \\\n          bbox_,                  \\\n          prepare_ )              \\\n  FT_CALLBACK_TABLE_DEF           \\\n  const FT_Glyph_Class  class_ =  \\\n  {                               \\\n    size_,                        \\\n    format_,                      \\\n    init_,                        \\\n    done_,                        \\\n    copy_,                        \\\n    transform_,                   \\\n    bbox_,                        \\\n    prepare_                      \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_GLYPH(                              \\\n          class_,                                     \\\n          size_,                                      \\\n          format_,                                    \\\n          init_,                                      \\\n          done_,                                      \\\n          copy_,                                      \\\n          transform_,                                 \\\n          bbox_,                                      \\\n          prepare_ )                                  \\\n  void                                                \\\n  FT_Init_Class_ ## class_( FT_Glyph_Class*  clazz )  \\\n  {                                                   \\\n    clazz->glyph_size      = size_;                   \\\n    clazz->glyph_format    = format_;                 \\\n    clazz->glyph_init      = init_;                   \\\n    clazz->glyph_done      = done_;                   \\\n    clazz->glyph_copy      = copy_;                   \\\n    clazz->glyph_transform = transform_;              \\\n    clazz->glyph_bbox      = bbox_;                   \\\n    clazz->glyph_prepare   = prepare_;                \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DECLARE_RENDERER                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to create a forward declaration of a                          */\n  /*    FT_Renderer_Class struct instance.                                 */\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DEFINE_RENDERER                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to initialize an instance of FT_Renderer_Class struct.        */\n  /*                                                                       */\n  /*    When FT_CONFIG_OPTION_PIC is defined a `create' funtion will need  */\n  /*    to be called with a pointer where the allocated structure is       */\n  /*    returned.  And when it is no longer needed a `destroy' function    */\n  /*    needs to be called to release that allocation.                     */\n  /*    `fcinit.c' (ft_create_default_module_classes) already contains     */\n  /*    a mechanism to call these functions for the default modules        */\n  /*    described in `ftmodule.h'.                                         */\n  /*                                                                       */\n  /*    Notice that the created `create' and `destroy' functions call      */\n  /*    `pic_init' and `pic_free' to allow you to manually allocate and    */\n  /*    initialize any additional global data, like a module specific      */\n  /*    interface, and put them in the global pic container defined in     */\n  /*    `ftpic.h'.  If you don't need them just implement the functions as */\n  /*    empty to resolve the link error.  Also the `pic_init' and          */\n  /*    `pic_free' functions should be declared in `pic.h', to be referred */\n  /*    by the renderer definition calling `FT_DEFINE_RENDERER' in the     */\n  /*    following.                                                         */\n  /*                                                                       */\n  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */\n  /*    allocated in the global scope (or the scope where the macro        */\n  /*    is used).                                                          */\n  /*                                                                       */\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DECLARE_RENDERER( class_ )               \\\n  FT_EXPORT_VAR( const FT_Renderer_Class ) class_;\n\n#define FT_DEFINE_RENDERER(                  \\\n          class_,                            \\\n          flags_,                            \\\n          size_,                             \\\n          name_,                             \\\n          version_,                          \\\n          requires_,                         \\\n          interface_,                        \\\n          init_,                             \\\n          done_,                             \\\n          get_interface_,                    \\\n          glyph_format_,                     \\\n          render_glyph_,                     \\\n          transform_glyph_,                  \\\n          get_glyph_cbox_,                   \\\n          set_mode_,                         \\\n          raster_class_ )                    \\\n  FT_CALLBACK_TABLE_DEF                      \\\n  const FT_Renderer_Class  class_ =          \\\n  {                                          \\\n    FT_DEFINE_ROOT_MODULE( flags_,           \\\n                           size_,            \\\n                           name_,            \\\n                           version_,         \\\n                           requires_,        \\\n                           interface_,       \\\n                           init_,            \\\n                           done_,            \\\n                           get_interface_ )  \\\n    glyph_format_,                           \\\n                                             \\\n    render_glyph_,                           \\\n    transform_glyph_,                        \\\n    get_glyph_cbox_,                         \\\n    set_mode_,                               \\\n                                             \\\n    raster_class_                            \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DECLARE_RENDERER( class_ )  FT_DECLARE_MODULE( class_ )\n\n#define FT_DEFINE_RENDERER(                                      \\\n          class_,                                                \\\n          flags_,                                                \\\n          size_,                                                 \\\n          name_,                                                 \\\n          version_,                                              \\\n          requires_,                                             \\\n          interface_,                                            \\\n          init_,                                                 \\\n          done_,                                                 \\\n          get_interface_,                                        \\\n          glyph_format_,                                         \\\n          render_glyph_,                                         \\\n          transform_glyph_,                                      \\\n          get_glyph_cbox_,                                       \\\n          set_mode_,                                             \\\n          raster_class_ )                                        \\\n  void                                                           \\\n  FT_Destroy_Class_ ## class_( FT_Library        library,        \\\n                               FT_Module_Class*  clazz )         \\\n  {                                                              \\\n    FT_Renderer_Class*  rclazz = (FT_Renderer_Class*)clazz;      \\\n    FT_Memory           memory = library->memory;                \\\n                                                                 \\\n                                                                 \\\n    class_ ## _pic_free( library );                              \\\n    if ( rclazz )                                                \\\n      FT_FREE( rclazz );                                         \\\n  }                                                              \\\n                                                                 \\\n                                                                 \\\n  FT_Error                                                       \\\n  FT_Create_Class_ ## class_( FT_Library         library,        \\\n                              FT_Module_Class**  output_class )  \\\n  {                                                              \\\n    FT_Renderer_Class*  clazz = NULL;                            \\\n    FT_Error            error;                                   \\\n    FT_Memory           memory = library->memory;                \\\n                                                                 \\\n                                                                 \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) )                  \\\n      return error;                                              \\\n                                                                 \\\n    error = class_ ## _pic_init( library );                      \\\n    if ( error )                                                 \\\n    {                                                            \\\n      FT_FREE( clazz );                                          \\\n      return error;                                              \\\n    }                                                            \\\n                                                                 \\\n    FT_DEFINE_ROOT_MODULE( flags_,                               \\\n                           size_,                                \\\n                           name_,                                \\\n                           version_,                             \\\n                           requires_,                            \\\n                           interface_,                           \\\n                           init_,                                \\\n                           done_,                                \\\n                           get_interface_ )                      \\\n                                                                 \\\n    clazz->glyph_format    = glyph_format_;                      \\\n                                                                 \\\n    clazz->render_glyph    = render_glyph_;                      \\\n    clazz->transform_glyph = transform_glyph_;                   \\\n    clazz->get_glyph_cbox  = get_glyph_cbox_;                    \\\n    clazz->set_mode        = set_mode_;                          \\\n                                                                 \\\n    clazz->raster_class    = raster_class_;                      \\\n                                                                 \\\n    *output_class = (FT_Module_Class*)clazz;                     \\\n                                                                 \\\n    return FT_Err_Ok;                                            \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n  /* PIC support macros for ftmodapi.h **/\n\n\n#ifdef FT_CONFIG_OPTION_PIC\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Module_Creator                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to create (allocate) a new module class object.    */\n  /*    The object's members are initialized, but the module itself is     */\n  /*    not.                                                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory       :: A handle to the memory manager.                    */\n  /*    output_class :: Initialized with the newly allocated class.        */\n  /*                                                                       */\n  typedef FT_Error\n  (*FT_Module_Creator)( FT_Memory          memory,\n                        FT_Module_Class**  output_class );\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Module_Destroyer                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to destroy (deallocate) a module class object.     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory :: A handle to the memory manager.                          */\n  /*    clazz  :: Module class to destroy.                                 */\n  /*                                                                       */\n  typedef void\n  (*FT_Module_Destroyer)( FT_Memory         memory,\n                          FT_Module_Class*  clazz );\n\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DECLARE_MODULE                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to create a forward declaration of a                          */\n  /*    FT_Module_Class struct instance.                                   */\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DEFINE_MODULE                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to initialize an instance of an FT_Module_Class struct.       */\n  /*                                                                       */\n  /*    When FT_CONFIG_OPTION_PIC is defined a `create' funtion needs to   */\n  /*    be called with a pointer where the allocated structure is          */\n  /*    returned.  And when it is no longer needed a `destroy' function    */\n  /*    needs to be called to release that allocation.                     */\n  /*    `fcinit.c' (ft_create_default_module_classes) already contains     */\n  /*    a mechanism to call these functions for the default modules        */\n  /*    described in `ftmodule.h'.                                         */\n  /*                                                                       */\n  /*    Notice that the created `create' and `destroy' functions call      */\n  /*    `pic_init' and `pic_free' to allow you to manually allocate and    */\n  /*    initialize any additional global data, like a module specific      */\n  /*    interface, and put them in the global pic container defined in     */\n  /*    `ftpic.h'.  If you don't need them just implement the functions as */\n  /*    empty to resolve the link error.  Also the `pic_init' and          */\n  /*    `pic_free' functions should be declared in `pic.h', to be referred */\n  /*    by the module definition calling `FT_DEFINE_MODULE' in the         */\n  /*    following.                                                         */\n  /*                                                                       */\n  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */\n  /*    allocated in the global scope (or the scope where the macro        */\n  /*    is used).                                                          */\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DEFINE_ROOT_MODULE                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to initialize an instance of an FT_Module_Class struct inside */\n  /*    another struct that contains it or in a function that initializes  */\n  /*    that containing struct.                                            */\n  /*                                                                       */\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DECLARE_MODULE( class_ )  \\\n  FT_CALLBACK_TABLE                  \\\n  const FT_Module_Class  class_;\n\n#define FT_DEFINE_ROOT_MODULE(  \\\n          flags_,               \\\n          size_,                \\\n          name_,                \\\n          version_,             \\\n          requires_,            \\\n          interface_,           \\\n          init_,                \\\n          done_,                \\\n          get_interface_ )      \\\n  {                             \\\n    flags_,                     \\\n    size_,                      \\\n                                \\\n    name_,                      \\\n    version_,                   \\\n    requires_,                  \\\n                                \\\n    interface_,                 \\\n                                \\\n    init_,                      \\\n    done_,                      \\\n    get_interface_,             \\\n  },\n\n#define FT_DEFINE_MODULE(         \\\n          class_,                 \\\n          flags_,                 \\\n          size_,                  \\\n          name_,                  \\\n          version_,               \\\n          requires_,              \\\n          interface_,             \\\n          init_,                  \\\n          done_,                  \\\n          get_interface_ )        \\\n  FT_CALLBACK_TABLE_DEF           \\\n  const FT_Module_Class class_ =  \\\n  {                               \\\n    flags_,                       \\\n    size_,                        \\\n                                  \\\n    name_,                        \\\n    version_,                     \\\n    requires_,                    \\\n                                  \\\n    interface_,                   \\\n                                  \\\n    init_,                        \\\n    done_,                        \\\n    get_interface_,               \\\n  };\n\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DECLARE_MODULE( class_ )                               \\\n  FT_Error                                                        \\\n  FT_Create_Class_ ## class_( FT_Library         library,         \\\n                              FT_Module_Class**  output_class );  \\\n  void                                                            \\\n  FT_Destroy_Class_ ## class_( FT_Library        library,         \\\n                               FT_Module_Class*  clazz );\n\n#define FT_DEFINE_ROOT_MODULE(                      \\\n          flags_,                                   \\\n          size_,                                    \\\n          name_,                                    \\\n          version_,                                 \\\n          requires_,                                \\\n          interface_,                               \\\n          init_,                                    \\\n          done_,                                    \\\n          get_interface_ )                          \\\n    clazz->root.module_flags     = flags_;          \\\n    clazz->root.module_size      = size_;           \\\n    clazz->root.module_name      = name_;           \\\n    clazz->root.module_version   = version_;        \\\n    clazz->root.module_requires  = requires_;       \\\n                                                    \\\n    clazz->root.module_interface = interface_;      \\\n                                                    \\\n    clazz->root.module_init      = init_;           \\\n    clazz->root.module_done      = done_;           \\\n    clazz->root.get_interface    = get_interface_;\n\n#define FT_DEFINE_MODULE(                                        \\\n          class_,                                                \\\n          flags_,                                                \\\n          size_,                                                 \\\n          name_,                                                 \\\n          version_,                                              \\\n          requires_,                                             \\\n          interface_,                                            \\\n          init_,                                                 \\\n          done_,                                                 \\\n          get_interface_ )                                       \\\n  void                                                           \\\n  FT_Destroy_Class_ ## class_( FT_Library        library,        \\\n                               FT_Module_Class*  clazz )         \\\n  {                                                              \\\n    FT_Memory memory = library->memory;                          \\\n                                                                 \\\n                                                                 \\\n    class_ ## _pic_free( library );                              \\\n    if ( clazz )                                                 \\\n      FT_FREE( clazz );                                          \\\n  }                                                              \\\n                                                                 \\\n                                                                 \\\n  FT_Error                                                       \\\n  FT_Create_Class_ ## class_( FT_Library         library,        \\\n                              FT_Module_Class**  output_class )  \\\n  {                                                              \\\n    FT_Memory         memory = library->memory;                  \\\n    FT_Module_Class*  clazz  = NULL;                             \\\n    FT_Error          error;                                     \\\n                                                                 \\\n                                                                 \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) )                  \\\n      return error;                                              \\\n    error = class_ ## _pic_init( library );                      \\\n    if ( error )                                                 \\\n    {                                                            \\\n      FT_FREE( clazz );                                          \\\n      return error;                                              \\\n    }                                                            \\\n                                                                 \\\n    clazz->module_flags     = flags_;                            \\\n    clazz->module_size      = size_;                             \\\n    clazz->module_name      = name_;                             \\\n    clazz->module_version   = version_;                          \\\n    clazz->module_requires  = requires_;                         \\\n                                                                 \\\n    clazz->module_interface = interface_;                        \\\n                                                                 \\\n    clazz->module_init      = init_;                             \\\n    clazz->module_done      = done_;                             \\\n    clazz->get_interface    = get_interface_;                    \\\n                                                                 \\\n    *output_class = clazz;                                       \\\n                                                                 \\\n    return FT_Err_Ok;                                            \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\nFT_END_HEADER\n\n#endif /* __FTOBJS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/ftpic.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftpic.h                                                                */\n/*                                                                         */\n/*    The FreeType position independent code services (declaration).       */\n/*                                                                         */\n/*  Copyright 2009, 2012 by                                                */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  Modules that ordinarily have const global data that need address     */\n  /*  can instead define pointers here.                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTPIC_H__\n#define __FTPIC_H__\n\n\nFT_BEGIN_HEADER\n\n#ifdef FT_CONFIG_OPTION_PIC\n\n  typedef struct  FT_PIC_Container_\n  {\n    /* pic containers for base */\n    void*  base;\n\n    /* pic containers for modules */\n    void*  autofit;\n    void*  cff;\n    void*  pshinter;\n    void*  psnames;\n    void*  raster;\n    void*  sfnt;\n    void*  smooth;\n    void*  truetype;\n\n  } FT_PIC_Container;\n\n\n  /* Initialize the various function tables, structs, etc. */\n  /* stored in the container.                              */\n  FT_BASE( FT_Error )\n  ft_pic_container_init( FT_Library  library );\n\n\n  /* Destroy the contents of the container. */\n  FT_BASE( void )\n  ft_pic_container_destroy( FT_Library  library );\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FTPIC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/ftrfork.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftrfork.h                                                              */\n/*                                                                         */\n/*    Embedded resource forks accessor (specification).                    */\n/*                                                                         */\n/*  Copyright 2004, 2006, 2007, 2012 by                                    */\n/*  Masatake YAMATO and Redhat K.K.                                        */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/* Development of the code in this file is support of                      */\n/* Information-technology Promotion Agency, Japan.                         */\n/***************************************************************************/\n\n\n#ifndef __FTRFORK_H__\n#define __FTRFORK_H__\n\n\n#include \"../../ft2build.h\"\n#include \"ftobjs.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /* Number of guessing rules supported in `FT_Raccess_Guess'.            */\n  /* Don't forget to increment the number if you add a new guessing rule. */\n#define FT_RACCESS_N_RULES  9\n\n\n  /* A structure to describe a reference in a resource by its resource ID */\n  /* and internal offset.  The `POST' resource expects to be concatenated */\n  /* by the order of resource IDs instead of its appearance in the file.  */\n\n  typedef struct  FT_RFork_Ref_\n  {\n    FT_UShort  res_id;\n    FT_ULong   offset;\n\n  } FT_RFork_Ref;\n\n#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK\n  typedef FT_Error\n  (*ft_raccess_guess_func)( FT_Library  library,\n                            FT_Stream   stream,\n                            char       *base_file_name,\n                            char      **result_file_name,\n                            FT_Long    *result_offset );\n\n  typedef enum  FT_RFork_Rule_ {\n    FT_RFork_Rule_invalid = -2,\n    FT_RFork_Rule_uknown, /* -1 */\n    FT_RFork_Rule_apple_double,\n    FT_RFork_Rule_apple_single,\n    FT_RFork_Rule_darwin_ufs_export,\n    FT_RFork_Rule_darwin_newvfs,\n    FT_RFork_Rule_darwin_hfsplus,\n    FT_RFork_Rule_vfat,\n    FT_RFork_Rule_linux_cap,\n    FT_RFork_Rule_linux_double,\n    FT_RFork_Rule_linux_netatalk\n  } FT_RFork_Rule;\n\n  /* For fast translation between rule index and rule type,\n   * the macros FT_RFORK_xxx should be kept consistent with\n   * the raccess_guess_funcs table\n   */\n  typedef struct ft_raccess_guess_rec_ {\n    ft_raccess_guess_func  func;\n    FT_RFork_Rule          type;\n  } ft_raccess_guess_rec;\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n  /* this array is a storage in non-PIC mode, so ; is needed in END */\n#define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type )  \\\n          const type name[] = {\n#define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix )  \\\n          { raccess_guess_ ## func_suffix,                           \\\n            FT_RFork_Rule_ ## type_suffix },\n#define CONST_FT_RFORK_RULE_ARRAY_END  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n  /* this array is a function in PIC mode, so no ; is needed in END */\n#define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type )  \\\n          void                                         \\\n          FT_Init_ ## name( type*  storage )           \\\n          {                                            \\\n            type*  local = storage;                    \\\n                                                       \\\n                                                       \\\n            int  i = 0;\n#define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix )  \\\n          local[i].func = raccess_guess_ ## func_suffix;             \\\n          local[i].type = FT_RFork_Rule_ ## type_suffix;             \\\n          i++;\n#define CONST_FT_RFORK_RULE_ARRAY_END  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n#endif /* FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Raccess_Guess                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Guess a file name and offset where the actual resource fork is     */\n  /*    stored.  The macro FT_RACCESS_N_RULES holds the number of          */\n  /*    guessing rules;  the guessed result for the Nth rule is            */\n  /*    represented as a triplet: a new file name (new_names[N]), a file   */\n  /*    offset (offsets[N]), and an error code (errors[N]).                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library ::                                                         */\n  /*      A FreeType library instance.                                     */\n  /*                                                                       */\n  /*    stream ::                                                          */\n  /*      A file stream containing the resource fork.                      */\n  /*                                                                       */\n  /*    base_name ::                                                       */\n  /*      The (base) file name of the resource fork used for some          */\n  /*      guessing rules.                                                  */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    new_names ::                                                       */\n  /*      An array of guessed file names in which the resource forks may   */\n  /*      exist.  If `new_names[N]' is NULL, the guessed file name is      */\n  /*      equal to `base_name'.                                            */\n  /*                                                                       */\n  /*    offsets ::                                                         */\n  /*      An array of guessed file offsets.  `offsets[N]' holds the file   */\n  /*      offset of the possible start of the resource fork in file        */\n  /*      `new_names[N]'.                                                  */\n  /*                                                                       */\n  /*    errors ::                                                          */\n  /*      An array of FreeType error codes.  `errors[N]' is the error      */\n  /*      code of Nth guessing rule function.  If `errors[N]' is not       */\n  /*      FT_Err_Ok, `new_names[N]' and `offsets[N]' are meaningless.      */\n  /*                                                                       */\n  FT_BASE( void )\n  FT_Raccess_Guess( FT_Library  library,\n                    FT_Stream   stream,\n                    char*       base_name,\n                    char**      new_names,\n                    FT_Long*    offsets,\n                    FT_Error*   errors );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Raccess_Get_HeaderInfo                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Get the information from the header of resource fork.  The         */\n  /*    information includes the file offset where the resource map        */\n  /*    starts, and the file offset where the resource data starts.        */\n  /*    `FT_Raccess_Get_DataOffsets' requires these two data.              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library ::                                                         */\n  /*      A FreeType library instance.                                     */\n  /*                                                                       */\n  /*    stream ::                                                          */\n  /*      A file stream containing the resource fork.                      */\n  /*                                                                       */\n  /*    rfork_offset ::                                                    */\n  /*      The file offset where the resource fork starts.                  */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    map_offset ::                                                      */\n  /*      The file offset where the resource map starts.                   */\n  /*                                                                       */\n  /*    rdata_pos ::                                                       */\n  /*      The file offset where the resource data starts.                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  FT_Err_Ok means success.                     */\n  /*                                                                       */\n  FT_BASE( FT_Error )\n  FT_Raccess_Get_HeaderInfo( FT_Library  library,\n                             FT_Stream   stream,\n                             FT_Long     rfork_offset,\n                             FT_Long    *map_offset,\n                             FT_Long    *rdata_pos );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Raccess_Get_DataOffsets                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Get the data offsets for a tag in a resource fork.  Offsets are    */\n  /*    stored in an array because, in some cases, resources in a resource */\n  /*    fork have the same tag.                                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library ::                                                         */\n  /*      A FreeType library instance.                                     */\n  /*                                                                       */\n  /*    stream ::                                                          */\n  /*      A file stream containing the resource fork.                      */\n  /*                                                                       */\n  /*    map_offset ::                                                      */\n  /*      The file offset where the resource map starts.                   */\n  /*                                                                       */\n  /*    rdata_pos ::                                                       */\n  /*      The file offset where the resource data starts.                  */\n  /*                                                                       */\n  /*    tag ::                                                             */\n  /*      The resource tag.                                                */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    offsets ::                                                         */\n  /*      The stream offsets for the resource data specified by `tag'.     */\n  /*      This array is allocated by the function, so you have to call     */\n  /*      @ft_mem_free after use.                                          */\n  /*                                                                       */\n  /*    count ::                                                           */\n  /*      The length of offsets array.                                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  FT_Err_Ok means success.                     */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Normally you should use `FT_Raccess_Get_HeaderInfo' to get the     */\n  /*    value for `map_offset' and `rdata_pos'.                            */\n  /*                                                                       */\n  FT_BASE( FT_Error )\n  FT_Raccess_Get_DataOffsets( FT_Library  library,\n                              FT_Stream   stream,\n                              FT_Long     map_offset,\n                              FT_Long     rdata_pos,\n                              FT_Long     tag,\n                              FT_Long   **offsets,\n                              FT_Long    *count );\n\n\nFT_END_HEADER\n\n#endif /* __FTRFORK_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/ftserv.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftserv.h                                                               */\n/*                                                                         */\n/*    The FreeType services (specification only).                          */\n/*                                                                         */\n/*  Copyright 2003-2007, 2009, 2012, 2013 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  Each module can export one or more `services'.  Each service is      */\n  /*  identified by a constant string and modeled by a pointer; the latter */\n  /*  generally corresponds to a structure containing function pointers.   */\n  /*                                                                       */\n  /*  Note that a service's data cannot be a mere function pointer because */\n  /*  in C it is possible that function pointers might be implemented      */\n  /*  differently than data pointers (e.g. 48 bits instead of 32).         */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTSERV_H__\n#define __FTSERV_H__\n\n\nFT_BEGIN_HEADER\n\n  /*\n   * @macro:\n   *   FT_FACE_FIND_SERVICE\n   *\n   * @description:\n   *   This macro is used to look up a service from a face's driver module.\n   *\n   * @input:\n   *   face ::\n   *     The source face handle.\n   *\n   *   id ::\n   *     A string describing the service as defined in the service's\n   *     header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to\n   *     `multi-masters').  It is automatically prefixed with\n   *     `FT_SERVICE_ID_'.\n   *\n   * @output:\n   *   ptr ::\n   *     A variable that receives the service pointer.  Will be NULL\n   *     if not found.\n   */\n#ifdef __cplusplus\n\n#define FT_FACE_FIND_SERVICE( face, ptr, id )                               \\\n  FT_BEGIN_STMNT                                                            \\\n    FT_Module    module = FT_MODULE( FT_FACE( face )->driver );             \\\n    FT_Pointer   _tmp_  = NULL;                                             \\\n    FT_Pointer*  _pptr_ = (FT_Pointer*)&(ptr);                              \\\n                                                                            \\\n                                                                            \\\n    if ( module->clazz->get_interface )                                     \\\n      _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \\\n    *_pptr_ = _tmp_;                                                        \\\n  FT_END_STMNT\n\n#else /* !C++ */\n\n#define FT_FACE_FIND_SERVICE( face, ptr, id )                               \\\n  FT_BEGIN_STMNT                                                            \\\n    FT_Module   module = FT_MODULE( FT_FACE( face )->driver );              \\\n    FT_Pointer  _tmp_  = NULL;                                              \\\n                                                                            \\\n    if ( module->clazz->get_interface )                                     \\\n      _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \\\n    ptr = _tmp_;                                                            \\\n  FT_END_STMNT\n\n#endif /* !C++ */\n\n\n  /*\n   * @macro:\n   *   FT_FACE_FIND_GLOBAL_SERVICE\n   *\n   * @description:\n   *   This macro is used to look up a service from all modules.\n   *\n   * @input:\n   *   face ::\n   *     The source face handle.\n   *\n   *   id ::\n   *     A string describing the service as defined in the service's\n   *     header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to\n   *     `multi-masters').  It is automatically prefixed with\n   *     `FT_SERVICE_ID_'.\n   *\n   * @output:\n   *   ptr ::\n   *     A variable that receives the service pointer.  Will be NULL\n   *     if not found.\n   */\n#ifdef __cplusplus\n\n#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id )               \\\n  FT_BEGIN_STMNT                                                   \\\n    FT_Module    module = FT_MODULE( FT_FACE( face )->driver );    \\\n    FT_Pointer   _tmp_;                                            \\\n    FT_Pointer*  _pptr_ = (FT_Pointer*)&(ptr);                     \\\n                                                                   \\\n                                                                   \\\n    _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \\\n    *_pptr_ = _tmp_;                                               \\\n  FT_END_STMNT\n\n#else /* !C++ */\n\n#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id )               \\\n  FT_BEGIN_STMNT                                                   \\\n    FT_Module   module = FT_MODULE( FT_FACE( face )->driver );     \\\n    FT_Pointer  _tmp_;                                             \\\n                                                                   \\\n                                                                   \\\n    _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \\\n    ptr   = _tmp_;                                                 \\\n  FT_END_STMNT\n\n#endif /* !C++ */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****         S E R V I C E   D E S C R I P T O R S                 *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*\n   *  The following structure is used to _describe_ a given service\n   *  to the library.  This is useful to build simple static service lists.\n   */\n  typedef struct  FT_ServiceDescRec_\n  {\n    const char*  serv_id;     /* service name         */\n    const void*  serv_data;   /* service pointer/data */\n\n  } FT_ServiceDescRec;\n\n  typedef const FT_ServiceDescRec*  FT_ServiceDesc;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DEFINE_SERVICEDESCREC1                                          */\n  /*    FT_DEFINE_SERVICEDESCREC2                                          */\n  /*    FT_DEFINE_SERVICEDESCREC3                                          */\n  /*    FT_DEFINE_SERVICEDESCREC4                                          */\n  /*    FT_DEFINE_SERVICEDESCREC5                                          */\n  /*    FT_DEFINE_SERVICEDESCREC6                                          */\n  /*    FT_DEFINE_SERVICEDESCREC7                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to initialize an array of FT_ServiceDescRec structures.       */\n  /*                                                                       */\n  /*    When FT_CONFIG_OPTION_PIC is defined a `create' function needs to  */\n  /*    be called with a pointer to return an allocated array.  As soon as */\n  /*    it is no longer needed, a `destroy' function needs to be called to */\n  /*    release that allocation.                                           */\n  /*                                                                       */\n  /*    These functions should be manually called from the `pic_init' and  */\n  /*    `pic_free' functions of your module (see FT_DEFINE_MODULE).        */\n  /*                                                                       */\n  /*    When FT_CONFIG_OPTION_PIC is not defined the array will be         */\n  /*    allocated in the global scope (or the scope where the macro is     */\n  /*    used).                                                             */\n  /*                                                                       */\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICEDESCREC1( class_,                                  \\\n                                   serv_id_1, serv_data_1 )                 \\\n  static const FT_ServiceDescRec  class_[] =                                \\\n  {                                                                         \\\n    { serv_id_1, serv_data_1 },                                             \\\n    { NULL, NULL }                                                          \\\n  };\n\n#define FT_DEFINE_SERVICEDESCREC2( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2 )                 \\\n  static const FT_ServiceDescRec  class_[] =                                \\\n  {                                                                         \\\n    { serv_id_1, serv_data_1 },                                             \\\n    { serv_id_2, serv_data_2 },                                             \\\n    { NULL, NULL }                                                          \\\n  };\n\n#define FT_DEFINE_SERVICEDESCREC3( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3 )                 \\\n  static const FT_ServiceDescRec  class_[] =                                \\\n  {                                                                         \\\n    { serv_id_1, serv_data_1 },                                             \\\n    { serv_id_2, serv_data_2 },                                             \\\n    { serv_id_3, serv_data_3 },                                             \\\n    { NULL, NULL }                                                          \\\n  };\n\n#define FT_DEFINE_SERVICEDESCREC4( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3,                  \\\n                                   serv_id_4, serv_data_4 )                 \\\n  static const FT_ServiceDescRec  class_[] =                                \\\n  {                                                                         \\\n    { serv_id_1, serv_data_1 },                                             \\\n    { serv_id_2, serv_data_2 },                                             \\\n    { serv_id_3, serv_data_3 },                                             \\\n    { serv_id_4, serv_data_4 },                                             \\\n    { NULL, NULL }                                                          \\\n  };\n\n#define FT_DEFINE_SERVICEDESCREC5( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3,                  \\\n                                   serv_id_4, serv_data_4,                  \\\n                                   serv_id_5, serv_data_5 )                 \\\n  static const FT_ServiceDescRec  class_[] =                                \\\n  {                                                                         \\\n    { serv_id_1, serv_data_1 },                                             \\\n    { serv_id_2, serv_data_2 },                                             \\\n    { serv_id_3, serv_data_3 },                                             \\\n    { serv_id_4, serv_data_4 },                                             \\\n    { serv_id_5, serv_data_5 },                                             \\\n    { NULL, NULL }                                                          \\\n  };\n\n#define FT_DEFINE_SERVICEDESCREC6( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3,                  \\\n                                   serv_id_4, serv_data_4,                  \\\n                                   serv_id_5, serv_data_5,                  \\\n                                   serv_id_6, serv_data_6 )                 \\\n  static const FT_ServiceDescRec  class_[] =                                \\\n  {                                                                         \\\n    { serv_id_1, serv_data_1 },                                             \\\n    { serv_id_2, serv_data_2 },                                             \\\n    { serv_id_3, serv_data_3 },                                             \\\n    { serv_id_4, serv_data_4 },                                             \\\n    { serv_id_5, serv_data_5 },                                             \\\n    { serv_id_6, serv_data_6 },                                             \\\n    { NULL, NULL }                                                          \\\n  };\n\n#define FT_DEFINE_SERVICEDESCREC7( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3,                  \\\n                                   serv_id_4, serv_data_4,                  \\\n                                   serv_id_5, serv_data_5,                  \\\n                                   serv_id_6, serv_data_6,                  \\\n                                   serv_id_7, serv_data_7 )                 \\\n  static const FT_ServiceDescRec  class_[] =                                \\\n  {                                                                         \\\n    { serv_id_1, serv_data_1 },                                             \\\n    { serv_id_2, serv_data_2 },                                             \\\n    { serv_id_3, serv_data_3 },                                             \\\n    { serv_id_4, serv_data_4 },                                             \\\n    { serv_id_5, serv_data_5 },                                             \\\n    { serv_id_6, serv_data_6 },                                             \\\n    { serv_id_7, serv_data_7 },                                             \\\n    { NULL, NULL }                                                          \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICEDESCREC1( class_,                                  \\\n                                   serv_id_1, serv_data_1 )                 \\\n  void                                                                      \\\n  FT_Destroy_Class_ ## class_( FT_Library          library,                 \\\n                               FT_ServiceDescRec*  clazz )                  \\\n  {                                                                         \\\n    FT_Memory  memory = library->memory;                                    \\\n                                                                            \\\n                                                                            \\\n    if ( clazz )                                                            \\\n      FT_FREE( clazz );                                                     \\\n  }                                                                         \\\n                                                                            \\\n  FT_Error                                                                  \\\n  FT_Create_Class_ ## class_( FT_Library           library,                 \\\n                              FT_ServiceDescRec**  output_class )           \\\n  {                                                                         \\\n    FT_ServiceDescRec*  clazz  = NULL;                                      \\\n    FT_Error            error;                                              \\\n    FT_Memory           memory = library->memory;                           \\\n                                                                            \\\n                                                                            \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 2 ) )                         \\\n      return error;                                                         \\\n                                                                            \\\n    clazz[0].serv_id   = serv_id_1;                                         \\\n    clazz[0].serv_data = serv_data_1;                                       \\\n    clazz[1].serv_id   = NULL;                                              \\\n    clazz[1].serv_data = NULL;                                              \\\n                                                                            \\\n    *output_class = clazz;                                                  \\\n                                                                            \\\n    return FT_Err_Ok;                                                       \\\n  }\n\n#define FT_DEFINE_SERVICEDESCREC2( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2 )                 \\\n  void                                                                      \\\n  FT_Destroy_Class_ ## class_( FT_Library          library,                 \\\n                               FT_ServiceDescRec*  clazz )                  \\\n  {                                                                         \\\n    FT_Memory  memory = library->memory;                                    \\\n                                                                            \\\n                                                                            \\\n    if ( clazz )                                                            \\\n      FT_FREE( clazz );                                                     \\\n  }                                                                         \\\n                                                                            \\\n  FT_Error                                                                  \\\n  FT_Create_Class_ ## class_( FT_Library           library,                 \\\n                              FT_ServiceDescRec**  output_class )           \\\n  {                                                                         \\\n    FT_ServiceDescRec*  clazz  = NULL;                                      \\\n    FT_Error            error;                                              \\\n    FT_Memory           memory = library->memory;                           \\\n                                                                            \\\n                                                                            \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 3 ) )                         \\\n      return error;                                                         \\\n                                                                            \\\n    clazz[0].serv_id   = serv_id_1;                                         \\\n    clazz[0].serv_data = serv_data_1;                                       \\\n    clazz[1].serv_id   = serv_id_2;                                         \\\n    clazz[1].serv_data = serv_data_2;                                       \\\n    clazz[2].serv_id   = NULL;                                              \\\n    clazz[2].serv_data = NULL;                                              \\\n                                                                            \\\n    *output_class = clazz;                                                  \\\n                                                                            \\\n    return FT_Err_Ok;                                                       \\\n  }\n\n#define FT_DEFINE_SERVICEDESCREC3( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3 )                 \\\n  void                                                                      \\\n  FT_Destroy_Class_ ## class_( FT_Library          library,                 \\\n                               FT_ServiceDescRec*  clazz )                  \\\n  {                                                                         \\\n    FT_Memory  memory = library->memory;                                    \\\n                                                                            \\\n                                                                            \\\n    if ( clazz )                                                            \\\n      FT_FREE( clazz );                                                     \\\n  }                                                                         \\\n                                                                            \\\n  FT_Error                                                                  \\\n  FT_Create_Class_ ## class_( FT_Library           library,                 \\\n                              FT_ServiceDescRec**  output_class )           \\\n  {                                                                         \\\n    FT_ServiceDescRec*  clazz  = NULL;                                      \\\n    FT_Error            error;                                              \\\n    FT_Memory           memory = library->memory;                           \\\n                                                                            \\\n                                                                            \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 4 ) )                         \\\n      return error;                                                         \\\n                                                                            \\\n    clazz[0].serv_id   = serv_id_1;                                         \\\n    clazz[0].serv_data = serv_data_1;                                       \\\n    clazz[1].serv_id   = serv_id_2;                                         \\\n    clazz[1].serv_data = serv_data_2;                                       \\\n    clazz[2].serv_id   = serv_id_3;                                         \\\n    clazz[2].serv_data = serv_data_3;                                       \\\n    clazz[3].serv_id   = NULL;                                              \\\n    clazz[3].serv_data = NULL;                                              \\\n                                                                            \\\n    *output_class = clazz;                                                  \\\n                                                                            \\\n    return FT_Err_Ok;                                                       \\\n  }\n\n#define FT_DEFINE_SERVICEDESCREC4( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3,                  \\\n                                   serv_id_4, serv_data_4 )                 \\\n  void                                                                      \\\n  FT_Destroy_Class_ ## class_( FT_Library          library,                 \\\n                               FT_ServiceDescRec*  clazz )                  \\\n  {                                                                         \\\n    FT_Memory  memory = library->memory;                                    \\\n                                                                            \\\n                                                                            \\\n    if ( clazz )                                                            \\\n      FT_FREE( clazz );                                                     \\\n  }                                                                         \\\n                                                                            \\\n  FT_Error                                                                  \\\n  FT_Create_Class_ ## class_( FT_Library           library,                 \\\n                              FT_ServiceDescRec**  output_class )           \\\n  {                                                                         \\\n    FT_ServiceDescRec*  clazz  = NULL;                                      \\\n    FT_Error            error;                                              \\\n    FT_Memory           memory = library->memory;                           \\\n                                                                            \\\n                                                                            \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 5 ) )                         \\\n      return error;                                                         \\\n                                                                            \\\n    clazz[0].serv_id   = serv_id_1;                                         \\\n    clazz[0].serv_data = serv_data_1;                                       \\\n    clazz[1].serv_id   = serv_id_2;                                         \\\n    clazz[1].serv_data = serv_data_2;                                       \\\n    clazz[2].serv_id   = serv_id_3;                                         \\\n    clazz[2].serv_data = serv_data_3;                                       \\\n    clazz[3].serv_id   = serv_id_4;                                         \\\n    clazz[3].serv_data = serv_data_4;                                       \\\n    clazz[4].serv_id   = NULL;                                              \\\n    clazz[4].serv_data = NULL;                                              \\\n                                                                            \\\n    *output_class = clazz;                                                  \\\n                                                                            \\\n    return FT_Err_Ok;                                                       \\\n  }\n\n#define FT_DEFINE_SERVICEDESCREC5( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3,                  \\\n                                   serv_id_4, serv_data_4,                  \\\n                                   serv_id_5, serv_data_5 )                 \\\n  void                                                                      \\\n  FT_Destroy_Class_ ## class_( FT_Library          library,                 \\\n                               FT_ServiceDescRec*  clazz )                  \\\n  {                                                                         \\\n    FT_Memory  memory = library->memory;                                    \\\n                                                                            \\\n                                                                            \\\n    if ( clazz )                                                            \\\n      FT_FREE( clazz );                                                     \\\n  }                                                                         \\\n                                                                            \\\n  FT_Error                                                                  \\\n  FT_Create_Class_ ## class_( FT_Library           library,                 \\\n                              FT_ServiceDescRec**  output_class )           \\\n  {                                                                         \\\n    FT_ServiceDescRec*  clazz  = NULL;                                      \\\n    FT_Error            error;                                              \\\n    FT_Memory           memory = library->memory;                           \\\n                                                                            \\\n                                                                            \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 6 ) )                         \\\n      return error;                                                         \\\n                                                                            \\\n    clazz[0].serv_id   = serv_id_1;                                         \\\n    clazz[0].serv_data = serv_data_1;                                       \\\n    clazz[1].serv_id   = serv_id_2;                                         \\\n    clazz[1].serv_data = serv_data_2;                                       \\\n    clazz[2].serv_id   = serv_id_3;                                         \\\n    clazz[2].serv_data = serv_data_3;                                       \\\n    clazz[3].serv_id   = serv_id_4;                                         \\\n    clazz[3].serv_data = serv_data_4;                                       \\\n    clazz[4].serv_id   = serv_id_5;                                         \\\n    clazz[4].serv_data = serv_data_5;                                       \\\n    clazz[5].serv_id   = NULL;                                              \\\n    clazz[5].serv_data = NULL;                                              \\\n                                                                            \\\n    *output_class = clazz;                                                  \\\n                                                                            \\\n    return FT_Err_Ok;                                                       \\\n  }\n\n#define FT_DEFINE_SERVICEDESCREC6( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3,                  \\\n                                   serv_id_4, serv_data_4,                  \\\n                                   serv_id_5, serv_data_5,                  \\\n                                   serv_id_6, serv_data_6 )                 \\\n  void                                                                      \\\n  FT_Destroy_Class_ ## class_( FT_Library          library,                 \\\n                               FT_ServiceDescRec*  clazz )                  \\\n  {                                                                         \\\n    FT_Memory  memory = library->memory;                                    \\\n                                                                            \\\n                                                                            \\\n    if ( clazz )                                                            \\\n      FT_FREE( clazz );                                                     \\\n  }                                                                         \\\n                                                                            \\\n  FT_Error                                                                  \\\n  FT_Create_Class_ ## class_( FT_Library           library,                 \\\n                              FT_ServiceDescRec**  output_class)            \\\n  {                                                                         \\\n    FT_ServiceDescRec*  clazz  = NULL;                                      \\\n    FT_Error            error;                                              \\\n    FT_Memory           memory = library->memory;                           \\\n                                                                            \\\n                                                                            \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 7 ) )                         \\\n      return error;                                                         \\\n                                                                            \\\n    clazz[0].serv_id   = serv_id_1;                                         \\\n    clazz[0].serv_data = serv_data_1;                                       \\\n    clazz[1].serv_id   = serv_id_2;                                         \\\n    clazz[1].serv_data = serv_data_2;                                       \\\n    clazz[2].serv_id   = serv_id_3;                                         \\\n    clazz[2].serv_data = serv_data_3;                                       \\\n    clazz[3].serv_id   = serv_id_4;                                         \\\n    clazz[3].serv_data = serv_data_4;                                       \\\n    clazz[4].serv_id   = serv_id_5;                                         \\\n    clazz[4].serv_data = serv_data_5;                                       \\\n    clazz[5].serv_id   = serv_id_6;                                         \\\n    clazz[5].serv_data = serv_data_6;                                       \\\n    clazz[6].serv_id   = NULL;                                              \\\n    clazz[6].serv_data = NULL;                                              \\\n                                                                            \\\n    *output_class = clazz;                                                  \\\n                                                                            \\\n    return FT_Err_Ok;                                                       \\\n  }\n\n#define FT_DEFINE_SERVICEDESCREC7( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3,                  \\\n                                   serv_id_4, serv_data_4,                  \\\n                                   serv_id_5, serv_data_5,                  \\\n                                   serv_id_6, serv_data_6,                  \\\n                                   serv_id_7, serv_data_7 )                 \\\n  void                                                                      \\\n  FT_Destroy_Class_ ## class_( FT_Library          library,                 \\\n                               FT_ServiceDescRec*  clazz )                  \\\n  {                                                                         \\\n    FT_Memory  memory = library->memory;                                    \\\n                                                                            \\\n                                                                            \\\n    if ( clazz )                                                            \\\n      FT_FREE( clazz );                                                     \\\n  }                                                                         \\\n                                                                            \\\n  FT_Error                                                                  \\\n  FT_Create_Class_ ## class_( FT_Library           library,                 \\\n                              FT_ServiceDescRec**  output_class)            \\\n  {                                                                         \\\n    FT_ServiceDescRec*  clazz  = NULL;                                      \\\n    FT_Error            error;                                              \\\n    FT_Memory           memory = library->memory;                           \\\n                                                                            \\\n                                                                            \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 8 ) )                         \\\n      return error;                                                         \\\n                                                                            \\\n    clazz[0].serv_id   = serv_id_1;                                         \\\n    clazz[0].serv_data = serv_data_1;                                       \\\n    clazz[1].serv_id   = serv_id_2;                                         \\\n    clazz[1].serv_data = serv_data_2;                                       \\\n    clazz[2].serv_id   = serv_id_3;                                         \\\n    clazz[2].serv_data = serv_data_3;                                       \\\n    clazz[3].serv_id   = serv_id_4;                                         \\\n    clazz[3].serv_data = serv_data_4;                                       \\\n    clazz[4].serv_id   = serv_id_5;                                         \\\n    clazz[4].serv_data = serv_data_5;                                       \\\n    clazz[5].serv_id   = serv_id_6;                                         \\\n    clazz[5].serv_data = serv_data_6;                                       \\\n    clazz[6].serv_id   = serv_id_7;                                         \\\n    clazz[6].serv_data = serv_data_7;                                       \\\n    clazz[7].serv_id   = NULL;                                              \\\n    clazz[7].serv_data = NULL;                                              \\\n                                                                            \\\n    *output_class = clazz;                                                  \\\n                                                                            \\\n    return FT_Err_Ok;                                                       \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n  /*\n   *  Parse a list of FT_ServiceDescRec descriptors and look for\n   *  a specific service by ID.  Note that the last element in the\n   *  array must be { NULL, NULL }, and that the function should\n   *  return NULL if the service isn't available.\n   *\n   *  This function can be used by modules to implement their\n   *  `get_service' method.\n   */\n  FT_BASE( FT_Pointer )\n  ft_service_list_lookup( FT_ServiceDesc  service_descriptors,\n                          const char*     service_id );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****             S E R V I C E S   C A C H E                       *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*\n   *  This structure is used to store a cache for several frequently used\n   *  services.  It is the type of `face->internal->services'.  You\n   *  should only use FT_FACE_LOOKUP_SERVICE to access it.\n   *\n   *  All fields should have the type FT_Pointer to relax compilation\n   *  dependencies.  We assume the developer isn't completely stupid.\n   *\n   *  Each field must be named `service_XXXX' where `XXX' corresponds to\n   *  the correct FT_SERVICE_ID_XXXX macro.  See the definition of\n   *  FT_FACE_LOOKUP_SERVICE below how this is implemented.\n   *\n   */\n  typedef struct  FT_ServiceCacheRec_\n  {\n    FT_Pointer  service_POSTSCRIPT_FONT_NAME;\n    FT_Pointer  service_MULTI_MASTERS;\n    FT_Pointer  service_GLYPH_DICT;\n    FT_Pointer  service_PFR_METRICS;\n    FT_Pointer  service_WINFNT;\n\n  } FT_ServiceCacheRec, *FT_ServiceCache;\n\n\n  /*\n   *  A magic number used within the services cache.\n   */\n\n  /* ensure that value `1' has the same width as a pointer */\n#define FT_SERVICE_UNAVAILABLE  ((FT_Pointer)~(FT_PtrDist)1)\n\n\n  /*\n   * @macro:\n   *   FT_FACE_LOOKUP_SERVICE\n   *\n   * @description:\n   *   This macro is used to lookup a service from a face's driver module\n   *   using its cache.\n   *\n   * @input:\n   *   face::\n   *     The source face handle containing the cache.\n   *\n   *   field ::\n   *     The field name in the cache.\n   *\n   *   id ::\n   *     The service ID.\n   *\n   * @output:\n   *   ptr ::\n   *     A variable receiving the service data.  NULL if not available.\n   */\n#ifdef __cplusplus\n\n#define FT_FACE_LOOKUP_SERVICE( face, ptr, id )                \\\n  FT_BEGIN_STMNT                                               \\\n    FT_Pointer   svc;                                          \\\n    FT_Pointer*  Pptr = (FT_Pointer*)&(ptr);                   \\\n                                                               \\\n                                                               \\\n    svc = FT_FACE( face )->internal->services. service_ ## id; \\\n    if ( svc == FT_SERVICE_UNAVAILABLE )                       \\\n      svc = NULL;                                              \\\n    else if ( svc == NULL )                                    \\\n    {                                                          \\\n      FT_FACE_FIND_SERVICE( face, svc, id );                   \\\n                                                               \\\n      FT_FACE( face )->internal->services. service_ ## id =    \\\n        (FT_Pointer)( svc != NULL ? svc                        \\\n                                  : FT_SERVICE_UNAVAILABLE );  \\\n    }                                                          \\\n    *Pptr = svc;                                               \\\n  FT_END_STMNT\n\n#else /* !C++ */\n\n#define FT_FACE_LOOKUP_SERVICE( face, ptr, id )                \\\n  FT_BEGIN_STMNT                                               \\\n    FT_Pointer  svc;                                           \\\n                                                               \\\n                                                               \\\n    svc = FT_FACE( face )->internal->services. service_ ## id; \\\n    if ( svc == FT_SERVICE_UNAVAILABLE )                       \\\n      svc = NULL;                                              \\\n    else if ( svc == NULL )                                    \\\n    {                                                          \\\n      FT_FACE_FIND_SERVICE( face, svc, id );                   \\\n                                                               \\\n      FT_FACE( face )->internal->services. service_ ## id =    \\\n        (FT_Pointer)( svc != NULL ? svc                        \\\n                                  : FT_SERVICE_UNAVAILABLE );  \\\n    }                                                          \\\n    ptr = svc;                                                 \\\n  FT_END_STMNT\n\n#endif /* !C++ */\n\n  /*\n   *  A macro used to define new service structure types.\n   */\n\n#define FT_DEFINE_SERVICE( name )            \\\n  typedef struct FT_Service_ ## name ## Rec_ \\\n    FT_Service_ ## name ## Rec ;             \\\n  typedef struct FT_Service_ ## name ## Rec_ \\\n    const * FT_Service_ ## name ;            \\\n  struct FT_Service_ ## name ## Rec_\n\n  /* */\n\n  /*\n   *  The header files containing the services.\n   */\n\n#define FT_SERVICE_BDF_H                <freetype/internal/services/svbdf.h>\n#define FT_SERVICE_CID_H                <freetype/internal/services/svcid.h>\n#define FT_SERVICE_GLYPH_DICT_H         <freetype/internal/services/svgldict.h>\n#define FT_SERVICE_GX_VALIDATE_H        <freetype/internal/services/svgxval.h>\n#define FT_SERVICE_KERNING_H            <freetype/internal/services/svkern.h>\n#define FT_SERVICE_MULTIPLE_MASTERS_H   <freetype/internal/services/svmm.h>\n#define FT_SERVICE_OPENTYPE_VALIDATE_H  <freetype/internal/services/svotval.h>\n#define FT_SERVICE_PFR_H                <freetype/internal/services/svpfr.h>\n#define FT_SERVICE_POSTSCRIPT_CMAPS_H   <freetype/internal/services/svpscmap.h>\n#define FT_SERVICE_POSTSCRIPT_INFO_H    <freetype/internal/services/svpsinfo.h>\n#define FT_SERVICE_POSTSCRIPT_NAME_H    <freetype/internal/services/svpostnm.h>\n#define FT_SERVICE_PROPERTIES_H         <freetype/internal/services/svprop.h>\n#define FT_SERVICE_SFNT_H               <freetype/internal/services/svsfnt.h>\n#define FT_SERVICE_TRUETYPE_ENGINE_H    <freetype/internal/services/svtteng.h>\n#define FT_SERVICE_TT_CMAP_H            <freetype/internal/services/svttcmap.h>\n#define FT_SERVICE_WINFNT_H             <freetype/internal/services/svwinfnt.h>\n#define FT_SERVICE_XFREE86_NAME_H       <freetype/internal/services/svxf86nm.h>\n#define FT_SERVICE_TRUETYPE_GLYF_H      <freetype/internal/services/svttglyf.h>\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FTSERV_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/ftstream.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftstream.h                                                             */\n/*                                                                         */\n/*    Stream handling (specification).                                     */\n/*                                                                         */\n/*  Copyright 1996-2002, 2004-2006, 2011, 2013 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTSTREAM_H__\n#define __FTSTREAM_H__\n\n\n#include \"../../ft2build.h\"\n#include \"../ftsystem.h\"\n#include \"ftobjs.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /* format of an 8-bit frame_op value:           */\n  /*                                              */\n  /* bit  76543210                                */\n  /*      xxxxxxes                                */\n  /*                                              */\n  /* s is set to 1 if the value is signed.        */\n  /* e is set to 1 if the value is little-endian. */\n  /* xxx is a command.                            */\n\n#define FT_FRAME_OP_SHIFT         2\n#define FT_FRAME_OP_SIGNED        1\n#define FT_FRAME_OP_LITTLE        2\n#define FT_FRAME_OP_COMMAND( x )  ( x >> FT_FRAME_OP_SHIFT )\n\n#define FT_MAKE_FRAME_OP( command, little, sign ) \\\n          ( ( command << FT_FRAME_OP_SHIFT ) | ( little << 1 ) | sign )\n\n#define FT_FRAME_OP_END    0\n#define FT_FRAME_OP_START  1  /* start a new frame     */\n#define FT_FRAME_OP_BYTE   2  /* read 1-byte value     */\n#define FT_FRAME_OP_SHORT  3  /* read 2-byte value     */\n#define FT_FRAME_OP_LONG   4  /* read 4-byte value     */\n#define FT_FRAME_OP_OFF3   5  /* read 3-byte value     */\n#define FT_FRAME_OP_BYTES  6  /* read a bytes sequence */\n\n\n  typedef enum  FT_Frame_Op_\n  {\n    ft_frame_end       = 0,\n    ft_frame_start     = FT_MAKE_FRAME_OP( FT_FRAME_OP_START, 0, 0 ),\n\n    ft_frame_byte      = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE,  0, 0 ),\n    ft_frame_schar     = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE,  0, 1 ),\n\n    ft_frame_ushort_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 0 ),\n    ft_frame_short_be  = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 1 ),\n    ft_frame_ushort_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 0 ),\n    ft_frame_short_le  = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 1 ),\n\n    ft_frame_ulong_be  = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 0 ),\n    ft_frame_long_be   = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 1 ),\n    ft_frame_ulong_le  = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 0 ),\n    ft_frame_long_le   = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 1 ),\n\n    ft_frame_uoff3_be  = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 0 ),\n    ft_frame_off3_be   = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 1 ),\n    ft_frame_uoff3_le  = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 0 ),\n    ft_frame_off3_le   = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 1 ),\n\n    ft_frame_bytes     = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 0 ),\n    ft_frame_skip      = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 1 )\n\n  } FT_Frame_Op;\n\n\n  typedef struct  FT_Frame_Field_\n  {\n    FT_Byte    value;\n    FT_Byte    size;\n    FT_UShort  offset;\n\n  } FT_Frame_Field;\n\n\n  /* Construct an FT_Frame_Field out of a structure type and a field name. */\n  /* The structure type must be set in the FT_STRUCTURE macro before       */\n  /* calling the FT_FRAME_START() macro.                                   */\n  /*                                                                       */\n#define FT_FIELD_SIZE( f ) \\\n          (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f )\n\n#define FT_FIELD_SIZE_DELTA( f ) \\\n          (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f[0] )\n\n#define FT_FIELD_OFFSET( f ) \\\n          (FT_UShort)( offsetof( FT_STRUCTURE, f ) )\n\n#define FT_FRAME_FIELD( frame_op, field ) \\\n          {                               \\\n            frame_op,                     \\\n            FT_FIELD_SIZE( field ),       \\\n            FT_FIELD_OFFSET( field )      \\\n          }\n\n#define FT_MAKE_EMPTY_FIELD( frame_op )  { frame_op, 0, 0 }\n\n#define FT_FRAME_START( size )   { ft_frame_start, 0, size }\n#define FT_FRAME_END             { ft_frame_end, 0, 0 }\n\n#define FT_FRAME_LONG( f )       FT_FRAME_FIELD( ft_frame_long_be, f )\n#define FT_FRAME_ULONG( f )      FT_FRAME_FIELD( ft_frame_ulong_be, f )\n#define FT_FRAME_SHORT( f )      FT_FRAME_FIELD( ft_frame_short_be, f )\n#define FT_FRAME_USHORT( f )     FT_FRAME_FIELD( ft_frame_ushort_be, f )\n#define FT_FRAME_OFF3( f )       FT_FRAME_FIELD( ft_frame_off3_be, f )\n#define FT_FRAME_UOFF3( f )      FT_FRAME_FIELD( ft_frame_uoff3_be, f )\n#define FT_FRAME_BYTE( f )       FT_FRAME_FIELD( ft_frame_byte, f )\n#define FT_FRAME_CHAR( f )       FT_FRAME_FIELD( ft_frame_schar, f )\n\n#define FT_FRAME_LONG_LE( f )    FT_FRAME_FIELD( ft_frame_long_le, f )\n#define FT_FRAME_ULONG_LE( f )   FT_FRAME_FIELD( ft_frame_ulong_le, f )\n#define FT_FRAME_SHORT_LE( f )   FT_FRAME_FIELD( ft_frame_short_le, f )\n#define FT_FRAME_USHORT_LE( f )  FT_FRAME_FIELD( ft_frame_ushort_le, f )\n#define FT_FRAME_OFF3_LE( f )    FT_FRAME_FIELD( ft_frame_off3_le, f )\n#define FT_FRAME_UOFF3_LE( f )   FT_FRAME_FIELD( ft_frame_uoff3_le, f )\n\n#define FT_FRAME_SKIP_LONG       { ft_frame_long_be, 0, 0 }\n#define FT_FRAME_SKIP_SHORT      { ft_frame_short_be, 0, 0 }\n#define FT_FRAME_SKIP_BYTE       { ft_frame_byte, 0, 0 }\n\n#define FT_FRAME_BYTES( field, count ) \\\n          {                            \\\n            ft_frame_bytes,            \\\n            count,                     \\\n            FT_FIELD_OFFSET( field )   \\\n          }\n\n#define FT_FRAME_SKIP_BYTES( count )  { ft_frame_skip, count, 0 }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Integer extraction macros -- the `buffer' parameter must ALWAYS be of */\n  /* type `char*' or equivalent (1-byte elements).                         */\n  /*                                                                       */\n\n#define FT_BYTE_( p, i )  ( ((const FT_Byte*)(p))[(i)] )\n\n#define FT_INT16( x )   ( (FT_Int16)(x)  )\n#define FT_UINT16( x )  ( (FT_UInt16)(x) )\n#define FT_INT32( x )   ( (FT_Int32)(x)  )\n#define FT_UINT32( x )  ( (FT_UInt32)(x) )\n\n\n#define FT_BYTE_U16( p, i, s )  ( FT_UINT16( FT_BYTE_( p, i ) ) << (s) )\n#define FT_BYTE_U32( p, i, s )  ( FT_UINT32( FT_BYTE_( p, i ) ) << (s) )\n\n\n#define FT_PEEK_SHORT( p )  FT_INT16( FT_BYTE_U16( p, 0, 8) | \\\n                                      FT_BYTE_U16( p, 1, 0) )\n\n#define FT_PEEK_USHORT( p )  FT_UINT16( FT_BYTE_U16( p, 0, 8 ) | \\\n                                        FT_BYTE_U16( p, 1, 0 ) )\n\n#define FT_PEEK_LONG( p )  FT_INT32( FT_BYTE_U32( p, 0, 24 ) | \\\n                                     FT_BYTE_U32( p, 1, 16 ) | \\\n                                     FT_BYTE_U32( p, 2,  8 ) | \\\n                                     FT_BYTE_U32( p, 3,  0 ) )\n\n#define FT_PEEK_ULONG( p )  FT_UINT32( FT_BYTE_U32( p, 0, 24 ) | \\\n                                       FT_BYTE_U32( p, 1, 16 ) | \\\n                                       FT_BYTE_U32( p, 2,  8 ) | \\\n                                       FT_BYTE_U32( p, 3,  0 ) )\n\n#define FT_PEEK_OFF3( p )  FT_INT32( FT_BYTE_U32( p, 0, 16 ) | \\\n                                     FT_BYTE_U32( p, 1,  8 ) | \\\n                                     FT_BYTE_U32( p, 2,  0 ) )\n\n#define FT_PEEK_UOFF3( p )  FT_UINT32( FT_BYTE_U32( p, 0, 16 ) | \\\n                                       FT_BYTE_U32( p, 1,  8 ) | \\\n                                       FT_BYTE_U32( p, 2,  0 ) )\n\n#define FT_PEEK_SHORT_LE( p )  FT_INT16( FT_BYTE_U16( p, 1, 8 ) | \\\n                                         FT_BYTE_U16( p, 0, 0 ) )\n\n#define FT_PEEK_USHORT_LE( p )  FT_UINT16( FT_BYTE_U16( p, 1, 8 ) |  \\\n                                           FT_BYTE_U16( p, 0, 0 ) )\n\n#define FT_PEEK_LONG_LE( p )  FT_INT32( FT_BYTE_U32( p, 3, 24 ) | \\\n                                        FT_BYTE_U32( p, 2, 16 ) | \\\n                                        FT_BYTE_U32( p, 1,  8 ) | \\\n                                        FT_BYTE_U32( p, 0,  0 ) )\n\n#define FT_PEEK_ULONG_LE( p )  FT_UINT32( FT_BYTE_U32( p, 3, 24 ) | \\\n                                          FT_BYTE_U32( p, 2, 16 ) | \\\n                                          FT_BYTE_U32( p, 1,  8 ) | \\\n                                          FT_BYTE_U32( p, 0,  0 ) )\n\n#define FT_PEEK_OFF3_LE( p )  FT_INT32( FT_BYTE_U32( p, 2, 16 ) | \\\n                                        FT_BYTE_U32( p, 1,  8 ) | \\\n                                        FT_BYTE_U32( p, 0,  0 ) )\n\n#define FT_PEEK_UOFF3_LE( p )  FT_UINT32( FT_BYTE_U32( p, 2, 16 ) | \\\n                                          FT_BYTE_U32( p, 1,  8 ) | \\\n                                          FT_BYTE_U32( p, 0,  0 ) )\n\n\n#define FT_NEXT_CHAR( buffer )       \\\n          ( (signed char)*buffer++ )\n\n#define FT_NEXT_BYTE( buffer )         \\\n          ( (unsigned char)*buffer++ )\n\n#define FT_NEXT_SHORT( buffer )                                   \\\n          ( (short)( buffer += 2, FT_PEEK_SHORT( buffer - 2 ) ) )\n\n#define FT_NEXT_USHORT( buffer )                                            \\\n          ( (unsigned short)( buffer += 2, FT_PEEK_USHORT( buffer - 2 ) ) )\n\n#define FT_NEXT_OFF3( buffer )                                  \\\n          ( (long)( buffer += 3, FT_PEEK_OFF3( buffer - 3 ) ) )\n\n#define FT_NEXT_UOFF3( buffer )                                           \\\n          ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3( buffer - 3 ) ) )\n\n#define FT_NEXT_LONG( buffer )                                  \\\n          ( (long)( buffer += 4, FT_PEEK_LONG( buffer - 4 ) ) )\n\n#define FT_NEXT_ULONG( buffer )                                           \\\n          ( (unsigned long)( buffer += 4, FT_PEEK_ULONG( buffer - 4 ) ) )\n\n\n#define FT_NEXT_SHORT_LE( buffer )                                   \\\n          ( (short)( buffer += 2, FT_PEEK_SHORT_LE( buffer - 2 ) ) )\n\n#define FT_NEXT_USHORT_LE( buffer )                                            \\\n          ( (unsigned short)( buffer += 2, FT_PEEK_USHORT_LE( buffer - 2 ) ) )\n\n#define FT_NEXT_OFF3_LE( buffer )                                  \\\n          ( (long)( buffer += 3, FT_PEEK_OFF3_LE( buffer - 3 ) ) )\n\n#define FT_NEXT_UOFF3_LE( buffer )                                           \\\n          ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3_LE( buffer - 3 ) ) )\n\n#define FT_NEXT_LONG_LE( buffer )                                  \\\n          ( (long)( buffer += 4, FT_PEEK_LONG_LE( buffer - 4 ) ) )\n\n#define FT_NEXT_ULONG_LE( buffer )                                           \\\n          ( (unsigned long)( buffer += 4, FT_PEEK_ULONG_LE( buffer - 4 ) ) )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Each GET_xxxx() macro uses an implicit `stream' variable.             */\n  /*                                                                       */\n#if 0\n#define FT_GET_MACRO( type )    FT_NEXT_ ## type ( stream->cursor )\n\n#define FT_GET_CHAR()       FT_GET_MACRO( CHAR )\n#define FT_GET_BYTE()       FT_GET_MACRO( BYTE )\n#define FT_GET_SHORT()      FT_GET_MACRO( SHORT )\n#define FT_GET_USHORT()     FT_GET_MACRO( USHORT )\n#define FT_GET_OFF3()       FT_GET_MACRO( OFF3 )\n#define FT_GET_UOFF3()      FT_GET_MACRO( UOFF3 )\n#define FT_GET_LONG()       FT_GET_MACRO( LONG )\n#define FT_GET_ULONG()      FT_GET_MACRO( ULONG )\n#define FT_GET_TAG4()       FT_GET_MACRO( ULONG )\n\n#define FT_GET_SHORT_LE()   FT_GET_MACRO( SHORT_LE )\n#define FT_GET_USHORT_LE()  FT_GET_MACRO( USHORT_LE )\n#define FT_GET_LONG_LE()    FT_GET_MACRO( LONG_LE )\n#define FT_GET_ULONG_LE()   FT_GET_MACRO( ULONG_LE )\n\n#else\n#define FT_GET_MACRO( func, type )        ( (type)func( stream ) )\n\n#define FT_GET_CHAR()       FT_GET_MACRO( FT_Stream_GetChar, FT_Char )\n#define FT_GET_BYTE()       FT_GET_MACRO( FT_Stream_GetChar, FT_Byte )\n#define FT_GET_SHORT()      FT_GET_MACRO( FT_Stream_GetUShort, FT_Short )\n#define FT_GET_USHORT()     FT_GET_MACRO( FT_Stream_GetUShort, FT_UShort )\n#define FT_GET_OFF3()       FT_GET_MACRO( FT_Stream_GetUOffset, FT_Long )\n#define FT_GET_UOFF3()      FT_GET_MACRO( FT_Stream_GetUOffset, FT_ULong )\n#define FT_GET_LONG()       FT_GET_MACRO( FT_Stream_GetULong, FT_Long )\n#define FT_GET_ULONG()      FT_GET_MACRO( FT_Stream_GetULong, FT_ULong )\n#define FT_GET_TAG4()       FT_GET_MACRO( FT_Stream_GetULong, FT_ULong )\n\n#define FT_GET_SHORT_LE()   FT_GET_MACRO( FT_Stream_GetUShortLE, FT_Short )\n#define FT_GET_USHORT_LE()  FT_GET_MACRO( FT_Stream_GetUShortLE, FT_UShort )\n#define FT_GET_LONG_LE()    FT_GET_MACRO( FT_Stream_GetULongLE, FT_Long )\n#define FT_GET_ULONG_LE()   FT_GET_MACRO( FT_Stream_GetULongLE, FT_ULong )\n#endif\n\n#define FT_READ_MACRO( func, type, var )        \\\n          ( var = (type)func( stream, &error ), \\\n            error != FT_Err_Ok )\n\n#define FT_READ_BYTE( var )       FT_READ_MACRO( FT_Stream_ReadChar, FT_Byte, var )\n#define FT_READ_CHAR( var )       FT_READ_MACRO( FT_Stream_ReadChar, FT_Char, var )\n#define FT_READ_SHORT( var )      FT_READ_MACRO( FT_Stream_ReadUShort, FT_Short, var )\n#define FT_READ_USHORT( var )     FT_READ_MACRO( FT_Stream_ReadUShort, FT_UShort, var )\n#define FT_READ_OFF3( var )       FT_READ_MACRO( FT_Stream_ReadUOffset, FT_Long, var )\n#define FT_READ_UOFF3( var )      FT_READ_MACRO( FT_Stream_ReadUOffset, FT_ULong, var )\n#define FT_READ_LONG( var )       FT_READ_MACRO( FT_Stream_ReadULong, FT_Long, var )\n#define FT_READ_ULONG( var )      FT_READ_MACRO( FT_Stream_ReadULong, FT_ULong, var )\n\n#define FT_READ_SHORT_LE( var )   FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_Short, var )\n#define FT_READ_USHORT_LE( var )  FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_UShort, var )\n#define FT_READ_LONG_LE( var )    FT_READ_MACRO( FT_Stream_ReadULongLE, FT_Long, var )\n#define FT_READ_ULONG_LE( var )   FT_READ_MACRO( FT_Stream_ReadULongLE, FT_ULong, var )\n\n\n#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM\n\n  /* initialize a stream for reading a regular system stream */\n  FT_BASE( FT_Error )\n  FT_Stream_Open( FT_Stream    stream,\n                  const char*  filepathname );\n\n#endif /* FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */\n\n\n  /* create a new (input) stream from an FT_Open_Args structure */\n  FT_BASE( FT_Error )\n  FT_Stream_New( FT_Library           library,\n                 const FT_Open_Args*  args,\n                 FT_Stream           *astream );\n\n  /* free a stream */\n  FT_BASE( void )\n  FT_Stream_Free( FT_Stream  stream,\n                  FT_Int     external );\n\n  /* initialize a stream for reading in-memory data */\n  FT_BASE( void )\n  FT_Stream_OpenMemory( FT_Stream       stream,\n                        const FT_Byte*  base,\n                        FT_ULong        size );\n\n  /* close a stream (does not destroy the stream structure) */\n  FT_BASE( void )\n  FT_Stream_Close( FT_Stream  stream );\n\n\n  /* seek within a stream. position is relative to start of stream */\n  FT_BASE( FT_Error )\n  FT_Stream_Seek( FT_Stream  stream,\n                  FT_ULong   pos );\n\n  /* skip bytes in a stream */\n  FT_BASE( FT_Error )\n  FT_Stream_Skip( FT_Stream  stream,\n                  FT_Long    distance );\n\n  /* return current stream position */\n  FT_BASE( FT_Long )\n  FT_Stream_Pos( FT_Stream  stream );\n\n  /* read bytes from a stream into a user-allocated buffer, returns an */\n  /* error if not all bytes could be read.                             */\n  FT_BASE( FT_Error )\n  FT_Stream_Read( FT_Stream  stream,\n                  FT_Byte*   buffer,\n                  FT_ULong   count );\n\n  /* read bytes from a stream at a given position */\n  FT_BASE( FT_Error )\n  FT_Stream_ReadAt( FT_Stream  stream,\n                    FT_ULong   pos,\n                    FT_Byte*   buffer,\n                    FT_ULong   count );\n\n  /* try to read bytes at the end of a stream; return number of bytes */\n  /* really available                                                 */\n  FT_BASE( FT_ULong )\n  FT_Stream_TryRead( FT_Stream  stream,\n                     FT_Byte*   buffer,\n                     FT_ULong   count );\n\n  /* Enter a frame of `count' consecutive bytes in a stream.  Returns an */\n  /* error if the frame could not be read/accessed.  The caller can use  */\n  /* the FT_Stream_Get_XXX functions to retrieve frame data without      */\n  /* error checks.                                                       */\n  /*                                                                     */\n  /* You must _always_ call FT_Stream_ExitFrame() once you have entered  */\n  /* a stream frame!                                                     */\n  /*                                                                     */\n  FT_BASE( FT_Error )\n  FT_Stream_EnterFrame( FT_Stream  stream,\n                        FT_ULong   count );\n\n  /* exit a stream frame */\n  FT_BASE( void )\n  FT_Stream_ExitFrame( FT_Stream  stream );\n\n  /* Extract a stream frame.  If the stream is disk-based, a heap block */\n  /* is allocated and the frame bytes are read into it.  If the stream  */\n  /* is memory-based, this function simply set a pointer to the data.   */\n  /*                                                                    */\n  /* Useful to optimize access to memory-based streams transparently.   */\n  /*                                                                    */\n  /* All extracted frames must be `freed' with a call to the function   */\n  /* FT_Stream_ReleaseFrame().                                          */\n  /*                                                                    */\n  FT_BASE( FT_Error )\n  FT_Stream_ExtractFrame( FT_Stream  stream,\n                          FT_ULong   count,\n                          FT_Byte**  pbytes );\n\n  /* release an extract frame (see FT_Stream_ExtractFrame) */\n  FT_BASE( void )\n  FT_Stream_ReleaseFrame( FT_Stream  stream,\n                          FT_Byte**  pbytes );\n\n  /* read a byte from an entered frame */\n  FT_BASE( FT_Char )\n  FT_Stream_GetChar( FT_Stream  stream );\n\n  /* read a 16-bit big-endian unsigned integer from an entered frame */\n  FT_BASE( FT_UShort )\n  FT_Stream_GetUShort( FT_Stream  stream );\n\n  /* read a 24-bit big-endian unsigned integer from an entered frame */\n  FT_BASE( FT_ULong )\n  FT_Stream_GetUOffset( FT_Stream  stream );\n\n  /* read a 32-bit big-endian unsigned integer from an entered frame */\n  FT_BASE( FT_ULong )\n  FT_Stream_GetULong( FT_Stream  stream );\n\n  /* read a 16-bit little-endian unsigned integer from an entered frame */\n  FT_BASE( FT_UShort )\n  FT_Stream_GetUShortLE( FT_Stream  stream );\n\n  /* read a 32-bit little-endian unsigned integer from an entered frame */\n  FT_BASE( FT_ULong )\n  FT_Stream_GetULongLE( FT_Stream  stream );\n\n\n  /* read a byte from a stream */\n  FT_BASE( FT_Char )\n  FT_Stream_ReadChar( FT_Stream  stream,\n                      FT_Error*  error );\n\n  /* read a 16-bit big-endian unsigned integer from a stream */\n  FT_BASE( FT_UShort )\n  FT_Stream_ReadUShort( FT_Stream  stream,\n                        FT_Error*  error );\n\n  /* read a 24-bit big-endian unsigned integer from a stream */\n  FT_BASE( FT_ULong )\n  FT_Stream_ReadUOffset( FT_Stream  stream,\n                         FT_Error*  error );\n\n  /* read a 32-bit big-endian integer from a stream */\n  FT_BASE( FT_ULong )\n  FT_Stream_ReadULong( FT_Stream  stream,\n                       FT_Error*  error );\n\n  /* read a 16-bit little-endian unsigned integer from a stream */\n  FT_BASE( FT_UShort )\n  FT_Stream_ReadUShortLE( FT_Stream  stream,\n                          FT_Error*  error );\n\n  /* read a 32-bit little-endian unsigned integer from a stream */\n  FT_BASE( FT_ULong )\n  FT_Stream_ReadULongLE( FT_Stream  stream,\n                         FT_Error*  error );\n\n  /* Read a structure from a stream.  The structure must be described */\n  /* by an array of FT_Frame_Field records.                           */\n  FT_BASE( FT_Error )\n  FT_Stream_ReadFields( FT_Stream              stream,\n                        const FT_Frame_Field*  fields,\n                        void*                  structure );\n\n\n#define FT_STREAM_POS()           \\\n          FT_Stream_Pos( stream )\n\n#define FT_STREAM_SEEK( position )                               \\\n          FT_SET_ERROR( FT_Stream_Seek( stream,                  \\\n                                        (FT_ULong)(position) ) )\n\n#define FT_STREAM_SKIP( distance )                              \\\n          FT_SET_ERROR( FT_Stream_Skip( stream,                 \\\n                                        (FT_Long)(distance) ) )\n\n#define FT_STREAM_READ( buffer, count )                       \\\n          FT_SET_ERROR( FT_Stream_Read( stream,               \\\n                                        (FT_Byte*)(buffer),   \\\n                                        (FT_ULong)(count) ) )\n\n#define FT_STREAM_READ_AT( position, buffer, count )            \\\n          FT_SET_ERROR( FT_Stream_ReadAt( stream,               \\\n                                          (FT_ULong)(position), \\\n                                          (FT_Byte*)buffer,     \\\n                                          (FT_ULong)(count) ) )\n\n#define FT_STREAM_READ_FIELDS( fields, object )                          \\\n          FT_SET_ERROR( FT_Stream_ReadFields( stream, fields, object ) )\n\n\n#define FT_FRAME_ENTER( size )                                           \\\n          FT_SET_ERROR(                                                  \\\n            FT_DEBUG_INNER( FT_Stream_EnterFrame( stream,                \\\n                                                  (FT_ULong)(size) ) ) )\n\n#define FT_FRAME_EXIT()                                   \\\n          FT_DEBUG_INNER( FT_Stream_ExitFrame( stream ) )\n\n#define FT_FRAME_EXTRACT( size, bytes )                                       \\\n          FT_SET_ERROR(                                                       \\\n            FT_DEBUG_INNER( FT_Stream_ExtractFrame( stream,                   \\\n                                                    (FT_ULong)(size),         \\\n                                                    (FT_Byte**)&(bytes) ) ) )\n\n#define FT_FRAME_RELEASE( bytes )                                         \\\n          FT_DEBUG_INNER( FT_Stream_ReleaseFrame( stream,                 \\\n                                                  (FT_Byte**)&(bytes) ) )\n\n\nFT_END_HEADER\n\n#endif /* __FTSTREAM_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/fttrace.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  fttrace.h                                                              */\n/*                                                                         */\n/*    Tracing handling (specification only).                               */\n/*                                                                         */\n/*  Copyright 2002, 2004-2007, 2009, 2011-2013 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /* definitions of trace levels for FreeType 2 */\n\n  /* the first level must always be `trace_any' */\nFT_TRACE_DEF( any )\n\n  /* base components */\nFT_TRACE_DEF( calc )      /* calculations            (ftcalc.c)   */\nFT_TRACE_DEF( memory )    /* memory manager          (ftobjs.c)   */\nFT_TRACE_DEF( stream )    /* stream manager          (ftstream.c) */\nFT_TRACE_DEF( io )        /* i/o interface           (ftsystem.c) */\nFT_TRACE_DEF( list )      /* list management         (ftlist.c)   */\nFT_TRACE_DEF( init )      /* initialization          (ftinit.c)   */\nFT_TRACE_DEF( objs )      /* base objects            (ftobjs.c)   */\nFT_TRACE_DEF( outline )   /* outline management      (ftoutln.c)  */\nFT_TRACE_DEF( glyph )     /* glyph management        (ftglyph.c)  */\nFT_TRACE_DEF( gloader )   /* glyph loader            (ftgloadr.c) */\n\nFT_TRACE_DEF( raster )    /* monochrome rasterizer   (ftraster.c) */\nFT_TRACE_DEF( smooth )    /* anti-aliasing raster    (ftgrays.c)  */\nFT_TRACE_DEF( mm )        /* MM interface            (ftmm.c)     */\nFT_TRACE_DEF( raccess )   /* resource fork accessor  (ftrfork.c)  */\nFT_TRACE_DEF( synth )     /* bold/slant synthesizer  (ftsynth.c)  */\nFT_TRACE_DEF( bitmap )    /* bitmap checksum         (ftobjs.c)   */\n\n  /* Cache sub-system */\nFT_TRACE_DEF( cache )     /* cache sub-system        (ftcache.c, etc.) */\n\n  /* SFNT driver components */\nFT_TRACE_DEF( sfdriver )  /* SFNT font driver        (sfdriver.c) */\nFT_TRACE_DEF( sfobjs )    /* SFNT object handler     (sfobjs.c)   */\nFT_TRACE_DEF( ttcmap )    /* charmap handler         (ttcmap.c)   */\nFT_TRACE_DEF( ttkern )    /* kerning handler         (ttkern.c)   */\nFT_TRACE_DEF( ttload )    /* basic TrueType tables   (ttload.c)   */\nFT_TRACE_DEF( ttmtx )     /* metrics-related tables  (ttmtx.c)    */\nFT_TRACE_DEF( ttpost )    /* PS table processing     (ttpost.c)   */\nFT_TRACE_DEF( ttsbit )    /* TrueType sbit handling  (ttsbit.c)   */\nFT_TRACE_DEF( ttbdf )     /* TrueType embedded BDF   (ttbdf.c)    */\n\n  /* TrueType driver components */\nFT_TRACE_DEF( ttdriver )  /* TT font driver          (ttdriver.c) */\nFT_TRACE_DEF( ttgload )   /* TT glyph loader         (ttgload.c)  */\nFT_TRACE_DEF( ttinterp )  /* bytecode interpreter    (ttinterp.c) */\nFT_TRACE_DEF( ttobjs )    /* TT objects manager      (ttobjs.c)   */\nFT_TRACE_DEF( ttpload )   /* TT data/program loader  (ttpload.c)  */\nFT_TRACE_DEF( ttgxvar )   /* TrueType GX var handler (ttgxvar.c)  */\n\n  /* Type 1 driver components */\nFT_TRACE_DEF( t1afm )\nFT_TRACE_DEF( t1driver )\nFT_TRACE_DEF( t1gload )\nFT_TRACE_DEF( t1hint )\nFT_TRACE_DEF( t1load )\nFT_TRACE_DEF( t1objs )\nFT_TRACE_DEF( t1parse )\n\n  /* PostScript helper module `psaux' */\nFT_TRACE_DEF( t1decode )\nFT_TRACE_DEF( psobjs )\nFT_TRACE_DEF( psconv )\n\n  /* PostScript hinting module `pshinter' */\nFT_TRACE_DEF( pshrec )\nFT_TRACE_DEF( pshalgo1 )\nFT_TRACE_DEF( pshalgo2 )\n\n  /* Type 2 driver components */\nFT_TRACE_DEF( cffdriver )\nFT_TRACE_DEF( cffgload )\nFT_TRACE_DEF( cffload )\nFT_TRACE_DEF( cffobjs )\nFT_TRACE_DEF( cffparse )\n\nFT_TRACE_DEF( cf2blues )\nFT_TRACE_DEF( cf2hints )\nFT_TRACE_DEF( cf2interp )\n\n  /* Type 42 driver component */\nFT_TRACE_DEF( t42 )\n\n  /* CID driver components */\nFT_TRACE_DEF( cidafm )\nFT_TRACE_DEF( ciddriver )\nFT_TRACE_DEF( cidgload )\nFT_TRACE_DEF( cidload )\nFT_TRACE_DEF( cidobjs )\nFT_TRACE_DEF( cidparse )\n\n  /* Windows font component */\nFT_TRACE_DEF( winfnt )\n\n  /* PCF font components */\nFT_TRACE_DEF( pcfdriver )\nFT_TRACE_DEF( pcfread )\n\n  /* BDF font components */\nFT_TRACE_DEF( bdfdriver )\nFT_TRACE_DEF( bdflib )\n\n  /* PFR font component */\nFT_TRACE_DEF( pfr )\n\n  /* OpenType validation components */\nFT_TRACE_DEF( otvmodule )\nFT_TRACE_DEF( otvcommon )\nFT_TRACE_DEF( otvbase )\nFT_TRACE_DEF( otvgdef )\nFT_TRACE_DEF( otvgpos )\nFT_TRACE_DEF( otvgsub )\nFT_TRACE_DEF( otvjstf )\nFT_TRACE_DEF( otvmath )\n\n  /* TrueTypeGX/AAT validation components */\nFT_TRACE_DEF( gxvmodule )\nFT_TRACE_DEF( gxvcommon )\nFT_TRACE_DEF( gxvfeat )\nFT_TRACE_DEF( gxvmort )\nFT_TRACE_DEF( gxvmorx )\nFT_TRACE_DEF( gxvbsln )\nFT_TRACE_DEF( gxvjust )\nFT_TRACE_DEF( gxvkern )\nFT_TRACE_DEF( gxvopbd )\nFT_TRACE_DEF( gxvtrak )\nFT_TRACE_DEF( gxvprop )\nFT_TRACE_DEF( gxvlcar )\n\n  /* autofit components */\nFT_TRACE_DEF( afmodule )\nFT_TRACE_DEF( afhints )\nFT_TRACE_DEF( afcjk )\nFT_TRACE_DEF( aflatin )\nFT_TRACE_DEF( aflatin2 )\nFT_TRACE_DEF( afwarp )\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/ftvalid.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftvalid.h                                                              */\n/*                                                                         */\n/*    FreeType validation support (specification).                         */\n/*                                                                         */\n/*  Copyright 2004, 2013 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTVALID_H__\n#define __FTVALID_H__\n\n#include \"../../ft2build.h\"\n#include \"../config/ftstdlib.h\"   /* for ft_setjmp and ft_longjmp */\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                    V A L I D A T I O N                          ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* handle to a validation object */\n  typedef struct FT_ValidatorRec_ volatile*  FT_Validator;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* There are three distinct validation levels defined here:              */\n  /*                                                                       */\n  /* FT_VALIDATE_DEFAULT ::                                                */\n  /*   A table that passes this validation level can be used reliably by   */\n  /*   FreeType.  It generally means that all offsets have been checked to */\n  /*   prevent out-of-bound reads, that array counts are correct, etc.     */\n  /*                                                                       */\n  /* FT_VALIDATE_TIGHT ::                                                  */\n  /*   A table that passes this validation level can be used reliably and  */\n  /*   doesn't contain invalid data.  For example, a charmap table that    */\n  /*   returns invalid glyph indices will not pass, even though it can     */\n  /*   be used with FreeType in default mode (the library will simply      */\n  /*   return an error later when trying to load the glyph).               */\n  /*                                                                       */\n  /*   It also checks that fields which must be a multiple of 2, 4, or 8,  */\n  /*   don't have incorrect values, etc.                                   */\n  /*                                                                       */\n  /* FT_VALIDATE_PARANOID ::                                               */\n  /*   Only for font debugging.  Checks that a table follows the           */\n  /*   specification by 100%.  Very few fonts will be able to pass this    */\n  /*   level anyway but it can be useful for certain tools like font       */\n  /*   editors/converters.                                                 */\n  /*                                                                       */\n  typedef enum  FT_ValidationLevel_\n  {\n    FT_VALIDATE_DEFAULT = 0,\n    FT_VALIDATE_TIGHT,\n    FT_VALIDATE_PARANOID\n\n  } FT_ValidationLevel;\n\n\n#if defined( _MSC_VER )      /* Visual C++ (and Intel C++) */\n  /* We disable the warning `structure was padded due to   */\n  /* __declspec(align())' in order to compile cleanly with */\n  /* the maximum level of warnings.                        */\n#pragma warning( push )\n#pragma warning( disable : 4324 )\n#endif /* _MSC_VER */\n\n  /* validator structure */\n  typedef struct  FT_ValidatorRec_\n  {\n    const FT_Byte*      base;        /* address of table in memory       */\n    const FT_Byte*      limit;       /* `base' + sizeof(table) in memory */\n    FT_ValidationLevel  level;       /* validation level                 */\n    FT_Error            error;       /* error returned. 0 means success  */\n\n    ft_jmp_buf          jump_buffer; /* used for exception handling      */\n\n  } FT_ValidatorRec;\n\n#if defined( _MSC_VER )\n#pragma warning( pop )\n#endif\n\n#define FT_VALIDATOR( x )  ( (FT_Validator)( x ) )\n\n\n  FT_BASE( void )\n  ft_validator_init( FT_Validator        valid,\n                     const FT_Byte*      base,\n                     const FT_Byte*      limit,\n                     FT_ValidationLevel  level );\n\n  /* Do not use this. It's broken and will cause your validator to crash */\n  /* if you run it on an invalid font.                                   */\n  FT_BASE( FT_Int )\n  ft_validator_run( FT_Validator  valid );\n\n  /* Sets the error field in a validator, then calls `longjmp' to return */\n  /* to high-level caller.  Using `setjmp/longjmp' avoids many stupid    */\n  /* error checks within the validation routines.                        */\n  /*                                                                     */\n  FT_BASE( void )\n  ft_validator_error( FT_Validator  valid,\n                      FT_Error      error );\n\n\n  /* Calls ft_validate_error.  Assumes that the `valid' local variable */\n  /* holds a pointer to the current validator object.                  */\n  /*                                                                   */\n  /* Use preprocessor prescan to pass FT_ERR_PREFIX.                   */\n  /*                                                                   */\n#define FT_INVALID( _prefix, _error )  FT_INVALID_( _prefix, _error )\n#define FT_INVALID_( _prefix, _error ) \\\n          ft_validator_error( valid, _prefix ## _error )\n\n  /* called when a broken table is detected */\n#define FT_INVALID_TOO_SHORT \\\n          FT_INVALID( FT_ERR_PREFIX, Invalid_Table )\n\n  /* called when an invalid offset is detected */\n#define FT_INVALID_OFFSET \\\n          FT_INVALID( FT_ERR_PREFIX, Invalid_Offset )\n\n  /* called when an invalid format/value is detected */\n#define FT_INVALID_FORMAT \\\n          FT_INVALID( FT_ERR_PREFIX, Invalid_Table )\n\n  /* called when an invalid glyph index is detected */\n#define FT_INVALID_GLYPH_ID \\\n          FT_INVALID( FT_ERR_PREFIX, Invalid_Glyph_Index )\n\n  /* called when an invalid field value is detected */\n#define FT_INVALID_DATA \\\n          FT_INVALID( FT_ERR_PREFIX, Invalid_Table )\n\n\nFT_END_HEADER\n\n#endif /* __FTVALID_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/internal.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  internal.h                                                             */\n/*                                                                         */\n/*    Internal header files (specification only).                          */\n/*                                                                         */\n/*  Copyright 1996-2004, 2013 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is automatically included by `ft2build.h'.                  */\n  /* Do not include it manually!                                           */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#define FT_INTERNAL_OBJECTS_H             <freetype/internal/ftobjs.h>\n#define FT_INTERNAL_PIC_H                 <freetype/internal/ftpic.h>\n#define FT_INTERNAL_STREAM_H              <freetype/internal/ftstream.h>\n#define FT_INTERNAL_MEMORY_H              <freetype/internal/ftmemory.h>\n#define FT_INTERNAL_DEBUG_H               <freetype/internal/ftdebug.h>\n#define FT_INTERNAL_CALC_H                <freetype/internal/ftcalc.h>\n#define FT_INTERNAL_DRIVER_H              <freetype/internal/ftdriver.h>\n#define FT_INTERNAL_TRACE_H               <freetype/internal/fttrace.h>\n#define FT_INTERNAL_GLYPH_LOADER_H        <freetype/internal/ftgloadr.h>\n#define FT_INTERNAL_SFNT_H                <freetype/internal/sfnt.h>\n#define FT_INTERNAL_SERVICE_H             <freetype/internal/ftserv.h>\n#define FT_INTERNAL_RFORK_H               <freetype/internal/ftrfork.h>\n#define FT_INTERNAL_VALIDATE_H            <freetype/internal/ftvalid.h>\n\n#define FT_INTERNAL_TRUETYPE_TYPES_H      <freetype/internal/tttypes.h>\n#define FT_INTERNAL_TYPE1_TYPES_H         <freetype/internal/t1types.h>\n\n#define FT_INTERNAL_POSTSCRIPT_AUX_H      <freetype/internal/psaux.h>\n#define FT_INTERNAL_POSTSCRIPT_HINTS_H    <freetype/internal/pshints.h>\n#define FT_INTERNAL_POSTSCRIPT_GLOBALS_H  <freetype/internal/psglobal.h>\n\n#define FT_INTERNAL_AUTOHINT_H            <freetype/internal/autohint.h>\n\n\n#if defined( _MSC_VER )      /* Visual C++ (and Intel C++) */\n\n  /* We disable the warning `conditional expression is constant' here */\n  /* in order to compile cleanly with the maximum level of warnings.  */\n  /* In particular, the warning complains about stuff like `while(0)' */\n  /* which is very useful in macro definitions.  There is no benefit  */\n  /* in having it enabled.                                            */\n#pragma warning( disable : 4127 )\n\n#endif /* _MSC_VER */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/psaux.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  psaux.h                                                                */\n/*                                                                         */\n/*    Auxiliary functions and data structures related to PostScript fonts  */\n/*    (specification).                                                     */\n/*                                                                         */\n/*  Copyright 1996-2004, 2006, 2008, 2009, 2012 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PSAUX_H__\n#define __PSAUX_H__\n\n\n#include \"../../ft2build.h\"\n#include \"ftobjs.h\"\n#include \"t1types.h\"\n#include \"services/svpscmap.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                             T1_TABLE                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  typedef struct PS_TableRec_*              PS_Table;\n  typedef const struct PS_Table_FuncsRec_*  PS_Table_Funcs;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    PS_Table_FuncsRec                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A set of function pointers to manage PS_Table objects.             */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    table_init    :: Used to initialize a table.                       */\n  /*                                                                       */\n  /*    table_done    :: Finalizes resp. destroy a given table.            */\n  /*                                                                       */\n  /*    table_add     :: Adds a new object to a table.                     */\n  /*                                                                       */\n  /*    table_release :: Releases table data, then finalizes it.           */\n  /*                                                                       */\n  typedef struct  PS_Table_FuncsRec_\n  {\n    FT_Error\n    (*init)( PS_Table   table,\n             FT_Int     count,\n             FT_Memory  memory );\n\n    void\n    (*done)( PS_Table  table );\n\n    FT_Error\n    (*add)( PS_Table    table,\n            FT_Int      idx,\n            void*       object,\n            FT_PtrDist  length );\n\n    void\n    (*release)( PS_Table  table );\n\n  } PS_Table_FuncsRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    PS_TableRec                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A PS_Table is a simple object used to store an array of objects in */\n  /*    a single memory block.                                             */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    block     :: The address in memory of the growheap's block.  This  */\n  /*                 can change between two object adds, due to            */\n  /*                 reallocation.                                         */\n  /*                                                                       */\n  /*    cursor    :: The current top of the grow heap within its block.    */\n  /*                                                                       */\n  /*    capacity  :: The current size of the heap block.  Increments by    */\n  /*                 1kByte chunks.                                        */\n  /*                                                                       */\n  /*    init      :: Set to 0xDEADBEEF if `elements' and `lengths' have    */\n  /*                 been allocated.                                       */\n  /*                                                                       */\n  /*    max_elems :: The maximum number of elements in table.              */\n  /*                                                                       */\n  /*    num_elems :: The current number of elements in table.              */\n  /*                                                                       */\n  /*    elements  :: A table of element addresses within the block.        */\n  /*                                                                       */\n  /*    lengths   :: A table of element sizes within the block.            */\n  /*                                                                       */\n  /*    memory    :: The object used for memory operations                 */\n  /*                 (alloc/realloc).                                      */\n  /*                                                                       */\n  /*    funcs     :: A table of method pointers for this object.           */\n  /*                                                                       */\n  typedef struct  PS_TableRec_\n  {\n    FT_Byte*           block;          /* current memory block           */\n    FT_Offset          cursor;         /* current cursor in memory block */\n    FT_Offset          capacity;       /* current size of memory block   */\n    FT_Long            init;\n\n    FT_Int             max_elems;\n    FT_Int             num_elems;\n    FT_Byte**          elements;       /* addresses of table elements */\n    FT_PtrDist*        lengths;        /* lengths of table elements   */\n\n    FT_Memory          memory;\n    PS_Table_FuncsRec  funcs;\n\n  } PS_TableRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                       T1 FIELDS & TOKENS                      *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct PS_ParserRec_*  PS_Parser;\n\n  typedef struct T1_TokenRec_*   T1_Token;\n\n  typedef struct T1_FieldRec_*   T1_Field;\n\n\n  /* simple enumeration type used to identify token types */\n  typedef enum  T1_TokenType_\n  {\n    T1_TOKEN_TYPE_NONE = 0,\n    T1_TOKEN_TYPE_ANY,\n    T1_TOKEN_TYPE_STRING,\n    T1_TOKEN_TYPE_ARRAY,\n    T1_TOKEN_TYPE_KEY, /* aka `name' */\n\n    /* do not remove */\n    T1_TOKEN_TYPE_MAX\n\n  } T1_TokenType;\n\n\n  /* a simple structure used to identify tokens */\n  typedef struct  T1_TokenRec_\n  {\n    FT_Byte*      start;   /* first character of token in input stream */\n    FT_Byte*      limit;   /* first character after the token          */\n    T1_TokenType  type;    /* type of token                            */\n\n  } T1_TokenRec;\n\n\n  /* enumeration type used to identify object fields */\n  typedef enum  T1_FieldType_\n  {\n    T1_FIELD_TYPE_NONE = 0,\n    T1_FIELD_TYPE_BOOL,\n    T1_FIELD_TYPE_INTEGER,\n    T1_FIELD_TYPE_FIXED,\n    T1_FIELD_TYPE_FIXED_1000,\n    T1_FIELD_TYPE_STRING,\n    T1_FIELD_TYPE_KEY,\n    T1_FIELD_TYPE_BBOX,\n    T1_FIELD_TYPE_MM_BBOX,\n    T1_FIELD_TYPE_INTEGER_ARRAY,\n    T1_FIELD_TYPE_FIXED_ARRAY,\n    T1_FIELD_TYPE_CALLBACK,\n\n    /* do not remove */\n    T1_FIELD_TYPE_MAX\n\n  } T1_FieldType;\n\n\n  typedef enum  T1_FieldLocation_\n  {\n    T1_FIELD_LOCATION_CID_INFO,\n    T1_FIELD_LOCATION_FONT_DICT,\n    T1_FIELD_LOCATION_FONT_EXTRA,\n    T1_FIELD_LOCATION_FONT_INFO,\n    T1_FIELD_LOCATION_PRIVATE,\n    T1_FIELD_LOCATION_BBOX,\n    T1_FIELD_LOCATION_LOADER,\n    T1_FIELD_LOCATION_FACE,\n    T1_FIELD_LOCATION_BLEND,\n\n    /* do not remove */\n    T1_FIELD_LOCATION_MAX\n\n  } T1_FieldLocation;\n\n\n  typedef void\n  (*T1_Field_ParseFunc)( FT_Face     face,\n                         FT_Pointer  parser );\n\n\n  /* structure type used to model object fields */\n  typedef struct  T1_FieldRec_\n  {\n    const char*         ident;        /* field identifier               */\n    T1_FieldLocation    location;\n    T1_FieldType        type;         /* type of field                  */\n    T1_Field_ParseFunc  reader;\n    FT_UInt             offset;       /* offset of field in object      */\n    FT_Byte             size;         /* size of field in bytes         */\n    FT_UInt             array_max;    /* maximum number of elements for */\n                                      /* array                          */\n    FT_UInt             count_offset; /* offset of element count for    */\n                                      /* arrays; must not be zero if in */\n                                      /* use -- in other words, a       */\n                                      /* `num_FOO' element must not     */\n                                      /* start the used structure if we */\n                                      /* parse a `FOO' array            */\n    FT_UInt             dict;         /* where we expect it             */\n  } T1_FieldRec;\n\n#define T1_FIELD_DICT_FONTDICT ( 1 << 0 ) /* also FontInfo and FDArray */\n#define T1_FIELD_DICT_PRIVATE  ( 1 << 1 )\n\n\n\n#define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \\\n          {                                                 \\\n            _ident, T1CODE, _type,                          \\\n            0,                                              \\\n            FT_FIELD_OFFSET( _fname ),                      \\\n            FT_FIELD_SIZE( _fname ),                        \\\n            0, 0,                                           \\\n            _dict                                           \\\n          },\n\n#define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \\\n          {                                             \\\n            _ident, T1CODE, T1_FIELD_TYPE_CALLBACK,     \\\n            (T1_Field_ParseFunc)_reader,                \\\n            0, 0,                                       \\\n            0, 0,                                       \\\n            _dict                                       \\\n          },\n\n#define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \\\n          {                                                      \\\n            _ident, T1CODE, _type,                               \\\n            0,                                                   \\\n            FT_FIELD_OFFSET( _fname ),                           \\\n            FT_FIELD_SIZE_DELTA( _fname ),                       \\\n            _max,                                                \\\n            FT_FIELD_OFFSET( num_ ## _fname ),                   \\\n            _dict                                                \\\n          },\n\n#define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \\\n          {                                                       \\\n            _ident, T1CODE, _type,                                \\\n            0,                                                    \\\n            FT_FIELD_OFFSET( _fname ),                            \\\n            FT_FIELD_SIZE_DELTA( _fname ),                        \\\n            _max, 0,                                              \\\n            _dict                                                 \\\n          },\n\n\n#define T1_FIELD_BOOL( _ident, _fname, _dict )                             \\\n          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname, _dict )\n\n#define T1_FIELD_NUM( _ident, _fname, _dict )                                 \\\n          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname, _dict )\n\n#define T1_FIELD_FIXED( _ident, _fname, _dict )                             \\\n          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname, _dict )\n\n#define T1_FIELD_FIXED_1000( _ident, _fname, _dict )                     \\\n          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \\\n                               _dict )\n\n#define T1_FIELD_STRING( _ident, _fname, _dict )                             \\\n          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict )\n\n#define T1_FIELD_KEY( _ident, _fname, _dict )                             \\\n          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict )\n\n#define T1_FIELD_BBOX( _ident, _fname, _dict )                             \\\n          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname, _dict )\n\n\n#define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict )         \\\n          T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \\\n                              _fname, _fmax, _dict )\n\n#define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict )     \\\n          T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \\\n                              _fname, _fmax, _dict )\n\n#define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict )         \\\n          T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \\\n                               _fname, _fmax, _dict )\n\n#define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict )     \\\n          T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \\\n                               _fname, _fmax, _dict )\n\n#define T1_FIELD_CALLBACK( _ident, _name, _dict )       \\\n          T1_NEW_CALLBACK_FIELD( _ident, _name, _dict )\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                            T1 PARSER                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef const struct PS_Parser_FuncsRec_*  PS_Parser_Funcs;\n\n  typedef struct  PS_Parser_FuncsRec_\n  {\n    void\n    (*init)( PS_Parser  parser,\n             FT_Byte*   base,\n             FT_Byte*   limit,\n             FT_Memory  memory );\n\n    void\n    (*done)( PS_Parser  parser );\n\n    void\n    (*skip_spaces)( PS_Parser  parser );\n    void\n    (*skip_PS_token)( PS_Parser  parser );\n\n    FT_Long\n    (*to_int)( PS_Parser  parser );\n    FT_Fixed\n    (*to_fixed)( PS_Parser  parser,\n                 FT_Int     power_ten );\n\n    FT_Error\n    (*to_bytes)( PS_Parser  parser,\n                 FT_Byte*   bytes,\n                 FT_Offset  max_bytes,\n                 FT_Long*   pnum_bytes,\n                 FT_Bool    delimiters );\n\n    FT_Int\n    (*to_coord_array)( PS_Parser  parser,\n                       FT_Int     max_coords,\n                       FT_Short*  coords );\n    FT_Int\n    (*to_fixed_array)( PS_Parser  parser,\n                       FT_Int     max_values,\n                       FT_Fixed*  values,\n                       FT_Int     power_ten );\n\n    void\n    (*to_token)( PS_Parser  parser,\n                 T1_Token   token );\n    void\n    (*to_token_array)( PS_Parser  parser,\n                       T1_Token   tokens,\n                       FT_UInt    max_tokens,\n                       FT_Int*    pnum_tokens );\n\n    FT_Error\n    (*load_field)( PS_Parser       parser,\n                   const T1_Field  field,\n                   void**          objects,\n                   FT_UInt         max_objects,\n                   FT_ULong*       pflags );\n\n    FT_Error\n    (*load_field_table)( PS_Parser       parser,\n                         const T1_Field  field,\n                         void**          objects,\n                         FT_UInt         max_objects,\n                         FT_ULong*       pflags );\n\n  } PS_Parser_FuncsRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    PS_ParserRec                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A PS_Parser is an object used to parse a Type 1 font very quickly. */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    cursor :: The current position in the text.                        */\n  /*                                                                       */\n  /*    base   :: Start of the processed text.                             */\n  /*                                                                       */\n  /*    limit  :: End of the processed text.                               */\n  /*                                                                       */\n  /*    error  :: The last error returned.                                 */\n  /*                                                                       */\n  /*    memory :: The object used for memory operations (alloc/realloc).   */\n  /*                                                                       */\n  /*    funcs  :: A table of functions for the parser.                     */\n  /*                                                                       */\n  typedef struct  PS_ParserRec_\n  {\n    FT_Byte*   cursor;\n    FT_Byte*   base;\n    FT_Byte*   limit;\n    FT_Error   error;\n    FT_Memory  memory;\n\n    PS_Parser_FuncsRec  funcs;\n\n  } PS_ParserRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                         T1 BUILDER                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  typedef struct T1_BuilderRec_*  T1_Builder;\n\n\n  typedef FT_Error\n  (*T1_Builder_Check_Points_Func)( T1_Builder  builder,\n                                   FT_Int      count );\n\n  typedef void\n  (*T1_Builder_Add_Point_Func)( T1_Builder  builder,\n                                FT_Pos      x,\n                                FT_Pos      y,\n                                FT_Byte     flag );\n\n  typedef FT_Error\n  (*T1_Builder_Add_Point1_Func)( T1_Builder  builder,\n                                 FT_Pos      x,\n                                 FT_Pos      y );\n\n  typedef FT_Error\n  (*T1_Builder_Add_Contour_Func)( T1_Builder  builder );\n\n  typedef FT_Error\n  (*T1_Builder_Start_Point_Func)( T1_Builder  builder,\n                                  FT_Pos      x,\n                                  FT_Pos      y );\n\n  typedef void\n  (*T1_Builder_Close_Contour_Func)( T1_Builder  builder );\n\n\n  typedef const struct T1_Builder_FuncsRec_*  T1_Builder_Funcs;\n\n  typedef struct  T1_Builder_FuncsRec_\n  {\n    void\n    (*init)( T1_Builder    builder,\n             FT_Face       face,\n             FT_Size       size,\n             FT_GlyphSlot  slot,\n             FT_Bool       hinting );\n\n    void\n    (*done)( T1_Builder   builder );\n\n    T1_Builder_Check_Points_Func   check_points;\n    T1_Builder_Add_Point_Func      add_point;\n    T1_Builder_Add_Point1_Func     add_point1;\n    T1_Builder_Add_Contour_Func    add_contour;\n    T1_Builder_Start_Point_Func    start_point;\n    T1_Builder_Close_Contour_Func  close_contour;\n\n  } T1_Builder_FuncsRec;\n\n\n  /* an enumeration type to handle charstring parsing states */\n  typedef enum  T1_ParseState_\n  {\n    T1_Parse_Start,\n    T1_Parse_Have_Width,\n    T1_Parse_Have_Moveto,\n    T1_Parse_Have_Path\n\n  } T1_ParseState;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Structure>                                                           */\n  /*    T1_BuilderRec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*     A structure used during glyph loading to store its outline.       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    memory       :: The current memory object.                         */\n  /*                                                                       */\n  /*    face         :: The current face object.                           */\n  /*                                                                       */\n  /*    glyph        :: The current glyph slot.                            */\n  /*                                                                       */\n  /*    loader       :: XXX                                                */\n  /*                                                                       */\n  /*    base         :: The base glyph outline.                            */\n  /*                                                                       */\n  /*    current      :: The current glyph outline.                         */\n  /*                                                                       */\n  /*    max_points   :: maximum points in builder outline                  */\n  /*                                                                       */\n  /*    max_contours :: Maximum number of contours in builder outline.     */\n  /*                                                                       */\n  /*    pos_x        :: The horizontal translation (if composite glyph).   */\n  /*                                                                       */\n  /*    pos_y        :: The vertical translation (if composite glyph).     */\n  /*                                                                       */\n  /*    left_bearing :: The left side bearing point.                       */\n  /*                                                                       */\n  /*    advance      :: The horizontal advance vector.                     */\n  /*                                                                       */\n  /*    bbox         :: Unused.                                            */\n  /*                                                                       */\n  /*    parse_state  :: An enumeration which controls the charstring       */\n  /*                    parsing state.                                     */\n  /*                                                                       */\n  /*    load_points  :: If this flag is not set, no points are loaded.     */\n  /*                                                                       */\n  /*    no_recurse   :: Set but not used.                                  */\n  /*                                                                       */\n  /*    metrics_only :: A boolean indicating that we only want to compute  */\n  /*                    the metrics of a given glyph, not load all of its  */\n  /*                    points.                                            */\n  /*                                                                       */\n  /*    funcs        :: An array of function pointers for the builder.     */\n  /*                                                                       */\n  typedef struct  T1_BuilderRec_\n  {\n    FT_Memory       memory;\n    FT_Face         face;\n    FT_GlyphSlot    glyph;\n    FT_GlyphLoader  loader;\n    FT_Outline*     base;\n    FT_Outline*     current;\n\n    FT_Pos          pos_x;\n    FT_Pos          pos_y;\n\n    FT_Vector       left_bearing;\n    FT_Vector       advance;\n\n    FT_BBox         bbox;          /* bounding box */\n    T1_ParseState   parse_state;\n    FT_Bool         load_points;\n    FT_Bool         no_recurse;\n\n    FT_Bool         metrics_only;\n\n    void*           hints_funcs;    /* hinter-specific */\n    void*           hints_globals;  /* hinter-specific */\n\n    T1_Builder_FuncsRec  funcs;\n\n  } T1_BuilderRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                         T1 DECODER                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#if 0\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine   */\n  /* calls during glyph loading.                                           */\n  /*                                                                       */\n#define T1_MAX_SUBRS_CALLS  8\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity.  A     */\n  /* minimum of 16 is required.                                            */\n  /*                                                                       */\n#define T1_MAX_CHARSTRINGS_OPERANDS  32\n\n#endif /* 0 */\n\n\n  typedef struct  T1_Decoder_ZoneRec_\n  {\n    FT_Byte*  cursor;\n    FT_Byte*  base;\n    FT_Byte*  limit;\n\n  } T1_Decoder_ZoneRec, *T1_Decoder_Zone;\n\n\n  typedef struct T1_DecoderRec_*              T1_Decoder;\n  typedef const struct T1_Decoder_FuncsRec_*  T1_Decoder_Funcs;\n\n\n  typedef FT_Error\n  (*T1_Decoder_Callback)( T1_Decoder  decoder,\n                          FT_UInt     glyph_index );\n\n\n  typedef struct  T1_Decoder_FuncsRec_\n  {\n    FT_Error\n    (*init)( T1_Decoder           decoder,\n             FT_Face              face,\n             FT_Size              size,\n             FT_GlyphSlot         slot,\n             FT_Byte**            glyph_names,\n             PS_Blend             blend,\n             FT_Bool              hinting,\n             FT_Render_Mode       hint_mode,\n             T1_Decoder_Callback  callback );\n\n    void\n    (*done)( T1_Decoder  decoder );\n\n    FT_Error\n    (*parse_charstrings)( T1_Decoder  decoder,\n                          FT_Byte*    base,\n                          FT_UInt     len );\n\n  } T1_Decoder_FuncsRec;\n\n\n  typedef struct  T1_DecoderRec_\n  {\n    T1_BuilderRec        builder;\n\n    FT_Long              stack[T1_MAX_CHARSTRINGS_OPERANDS];\n    FT_Long*             top;\n\n    T1_Decoder_ZoneRec   zones[T1_MAX_SUBRS_CALLS + 1];\n    T1_Decoder_Zone      zone;\n\n    FT_Service_PsCMaps   psnames;      /* for seac */\n    FT_UInt              num_glyphs;\n    FT_Byte**            glyph_names;\n\n    FT_Int               lenIV;        /* internal for sub routine calls */\n    FT_UInt              num_subrs;\n    FT_Byte**            subrs;\n    FT_PtrDist*          subrs_len;    /* array of subrs length (optional) */\n\n    FT_Matrix            font_matrix;\n    FT_Vector            font_offset;\n\n    FT_Int               flex_state;\n    FT_Int               num_flex_vectors;\n    FT_Vector            flex_vectors[7];\n\n    PS_Blend             blend;       /* for multiple master support */\n\n    FT_Render_Mode       hint_mode;\n\n    T1_Decoder_Callback  parse_callback;\n    T1_Decoder_FuncsRec  funcs;\n\n    FT_Long*             buildchar;\n    FT_UInt              len_buildchar;\n\n    FT_Bool              seac;\n\n  } T1_DecoderRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                            AFM PARSER                         *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct AFM_ParserRec_*  AFM_Parser;\n\n  typedef struct  AFM_Parser_FuncsRec_\n  {\n    FT_Error\n    (*init)( AFM_Parser  parser,\n             FT_Memory   memory,\n             FT_Byte*    base,\n             FT_Byte*    limit );\n\n    void\n    (*done)( AFM_Parser  parser );\n\n    FT_Error\n    (*parse)( AFM_Parser  parser );\n\n  } AFM_Parser_FuncsRec;\n\n\n  typedef struct AFM_StreamRec_*  AFM_Stream;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    AFM_ParserRec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An AFM_Parser is a parser for the AFM files.                       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    memory    :: The object used for memory operations (alloc and      */\n  /*                 realloc).                                             */\n  /*                                                                       */\n  /*    stream    :: This is an opaque object.                             */\n  /*                                                                       */\n  /*    FontInfo  :: The result will be stored here.                       */\n  /*                                                                       */\n  /*    get_index :: A user provided function to get a glyph index by its  */\n  /*                 name.                                                 */\n  /*                                                                       */\n  typedef struct  AFM_ParserRec_\n  {\n    FT_Memory     memory;\n    AFM_Stream    stream;\n\n    AFM_FontInfo  FontInfo;\n\n    FT_Int\n    (*get_index)( const char*  name,\n                  FT_Offset    len,\n                  void*        user_data );\n\n    void*         user_data;\n\n  } AFM_ParserRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                     TYPE1 CHARMAPS                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef const struct T1_CMap_ClassesRec_*  T1_CMap_Classes;\n\n  typedef struct T1_CMap_ClassesRec_\n  {\n    FT_CMap_Class  standard;\n    FT_CMap_Class  expert;\n    FT_CMap_Class  custom;\n    FT_CMap_Class  unicode;\n\n  } T1_CMap_ClassesRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                        PSAux Module Interface                 *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct  PSAux_ServiceRec_\n  {\n    /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */\n    const PS_Table_FuncsRec*    ps_table_funcs;\n    const PS_Parser_FuncsRec*   ps_parser_funcs;\n    const T1_Builder_FuncsRec*  t1_builder_funcs;\n    const T1_Decoder_FuncsRec*  t1_decoder_funcs;\n\n    void\n    (*t1_decrypt)( FT_Byte*   buffer,\n                   FT_Offset  length,\n                   FT_UShort  seed );\n\n    T1_CMap_Classes  t1_cmap_classes;\n\n    /* fields after this comment line were added after version 2.1.10 */\n    const AFM_Parser_FuncsRec*  afm_parser_funcs;\n\n  } PSAux_ServiceRec, *PSAux_Service;\n\n  /* backwards-compatible type definition */\n  typedef PSAux_ServiceRec   PSAux_Interface;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                 Some convenience functions                    *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#define IS_PS_NEWLINE( ch ) \\\n  ( (ch) == '\\r' ||         \\\n    (ch) == '\\n' )\n\n#define IS_PS_SPACE( ch )  \\\n  ( (ch) == ' '         || \\\n    IS_PS_NEWLINE( ch ) || \\\n    (ch) == '\\t'        || \\\n    (ch) == '\\f'        || \\\n    (ch) == '\\0' )\n\n#define IS_PS_SPECIAL( ch )       \\\n  ( (ch) == '/'                || \\\n    (ch) == '(' || (ch) == ')' || \\\n    (ch) == '<' || (ch) == '>' || \\\n    (ch) == '[' || (ch) == ']' || \\\n    (ch) == '{' || (ch) == '}' || \\\n    (ch) == '%'                )\n\n#define IS_PS_DELIM( ch )  \\\n  ( IS_PS_SPACE( ch )   || \\\n    IS_PS_SPECIAL( ch ) )\n\n#define IS_PS_DIGIT( ch )        \\\n  ( (ch) >= '0' && (ch) <= '9' )\n\n#define IS_PS_XDIGIT( ch )            \\\n  ( IS_PS_DIGIT( ch )              || \\\n    ( (ch) >= 'A' && (ch) <= 'F' ) || \\\n    ( (ch) >= 'a' && (ch) <= 'f' ) )\n\n#define IS_PS_BASE85( ch )       \\\n  ( (ch) >= '!' && (ch) <= 'u' )\n\n#define IS_PS_TOKEN( cur, limit, token )                                \\\n  ( (char)(cur)[0] == (token)[0]                                     && \\\n    ( (cur) + sizeof ( (token) ) == (limit) ||                          \\\n      ( (cur) + sizeof( (token) ) < (limit)          &&                 \\\n        IS_PS_DELIM( (cur)[sizeof ( (token) ) - 1] ) ) )             && \\\n    ft_strncmp( (char*)(cur), (token), sizeof ( (token) ) - 1 ) == 0 )\n\n\nFT_END_HEADER\n\n#endif /* __PSAUX_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/pshints.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pshints.h                                                              */\n/*                                                                         */\n/*    Interface to Postscript-specific (Type 1 and Type 2) hints           */\n/*    recorders (specification only).  These are used to support native    */\n/*    T1/T2 hints in the `type1', `cid', and `cff' font drivers.           */\n/*                                                                         */\n/*  Copyright 2001-2003, 2005-2007, 2009, 2012 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PSHINTS_H__\n#define __PSHINTS_H__\n\n\n#include \"../../ft2build.h\"\n#include \"../freetype.h\"\n#include \"../t1tables.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****               INTERNAL REPRESENTATION OF GLOBALS              *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct PSH_GlobalsRec_*  PSH_Globals;\n\n  typedef FT_Error\n  (*PSH_Globals_NewFunc)( FT_Memory     memory,\n                          T1_Private*   private_dict,\n                          PSH_Globals*  aglobals );\n\n  typedef FT_Error\n  (*PSH_Globals_SetScaleFunc)( PSH_Globals  globals,\n                               FT_Fixed     x_scale,\n                               FT_Fixed     y_scale,\n                               FT_Fixed     x_delta,\n                               FT_Fixed     y_delta );\n\n  typedef void\n  (*PSH_Globals_DestroyFunc)( PSH_Globals  globals );\n\n\n  typedef struct  PSH_Globals_FuncsRec_\n  {\n    PSH_Globals_NewFunc       create;\n    PSH_Globals_SetScaleFunc  set_scale;\n    PSH_Globals_DestroyFunc   destroy;\n\n  } PSH_Globals_FuncsRec, *PSH_Globals_Funcs;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                  PUBLIC TYPE 1 HINTS RECORDER                 *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************\n   *\n   * @type:\n   *   T1_Hints\n   *\n   * @description:\n   *   This is a handle to an opaque structure used to record glyph hints\n   *   from a Type 1 character glyph character string.\n   *\n   *   The methods used to operate on this object are defined by the\n   *   @T1_Hints_FuncsRec structure.  Recording glyph hints is normally\n   *   achieved through the following scheme:\n   *\n   *   - Open a new hint recording session by calling the `open' method.\n   *     This rewinds the recorder and prepare it for new input.\n   *\n   *   - For each hint found in the glyph charstring, call the corresponding\n   *     method (`stem', `stem3', or `reset').  Note that these functions do\n   *     not return an error code.\n   *\n   *   - Close the recording session by calling the `close' method.  It\n   *     returns an error code if the hints were invalid or something\n   *     strange happened (e.g., memory shortage).\n   *\n   *   The hints accumulated in the object can later be used by the\n   *   PostScript hinter.\n   *\n   */\n  typedef struct T1_HintsRec_*  T1_Hints;\n\n\n  /*************************************************************************\n   *\n   * @type:\n   *   T1_Hints_Funcs\n   *\n   * @description:\n   *   A pointer to the @T1_Hints_FuncsRec structure that defines the API of\n   *   a given @T1_Hints object.\n   *\n   */\n  typedef const struct T1_Hints_FuncsRec_*  T1_Hints_Funcs;\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T1_Hints_OpenFunc\n   *\n   * @description:\n   *   A method of the @T1_Hints class used to prepare it for a new Type 1\n   *   hints recording session.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 1 hints recorder.\n   *\n   * @note:\n   *   You should always call the @T1_Hints_CloseFunc method in order to\n   *   close an opened recording session.\n   *\n   */\n  typedef void\n  (*T1_Hints_OpenFunc)( T1_Hints  hints );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T1_Hints_SetStemFunc\n   *\n   * @description:\n   *   A method of the @T1_Hints class used to record a new horizontal or\n   *   vertical stem.  This corresponds to the Type 1 `hstem' and `vstem'\n   *   operators.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 1 hints recorder.\n   *\n   *   dimension ::\n   *     0 for horizontal stems (hstem), 1 for vertical ones (vstem).\n   *\n   *   coords ::\n   *     Array of 2 coordinates in 16.16 format, used as (position,length)\n   *     stem descriptor.\n   *\n   * @note:\n   *   Use vertical coordinates (y) for horizontal stems (dim=0).  Use\n   *   horizontal coordinates (x) for vertical stems (dim=1).\n   *\n   *   `coords[0]' is the absolute stem position (lowest coordinate);\n   *   `coords[1]' is the length.\n   *\n   *   The length can be negative, in which case it must be either -20 or\n   *   -21.  It is interpreted as a `ghost' stem, according to the Type 1\n   *   specification.\n   *\n   *   If the length is -21 (corresponding to a bottom ghost stem), then\n   *   the real stem position is `coords[0]+coords[1]'.\n   *\n   */\n  typedef void\n  (*T1_Hints_SetStemFunc)( T1_Hints   hints,\n                           FT_UInt    dimension,\n                           FT_Fixed*  coords );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T1_Hints_SetStem3Func\n   *\n   * @description:\n   *   A method of the @T1_Hints class used to record three\n   *   counter-controlled horizontal or vertical stems at once.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 1 hints recorder.\n   *\n   *   dimension ::\n   *     0 for horizontal stems, 1 for vertical ones.\n   *\n   *   coords ::\n   *     An array of 6 values in 16.16 format, holding 3 (position,length)\n   *     pairs for the counter-controlled stems.\n   *\n   * @note:\n   *   Use vertical coordinates (y) for horizontal stems (dim=0).  Use\n   *   horizontal coordinates (x) for vertical stems (dim=1).\n   *\n   *   The lengths cannot be negative (ghost stems are never\n   *   counter-controlled).\n   *\n   */\n  typedef void\n  (*T1_Hints_SetStem3Func)( T1_Hints   hints,\n                            FT_UInt    dimension,\n                            FT_Fixed*  coords );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T1_Hints_ResetFunc\n   *\n   * @description:\n   *   A method of the @T1_Hints class used to reset the stems hints in a\n   *   recording session.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 1 hints recorder.\n   *\n   *   end_point ::\n   *     The index of the last point in the input glyph in which the\n   *     previously defined hints apply.\n   *\n   */\n  typedef void\n  (*T1_Hints_ResetFunc)( T1_Hints  hints,\n                         FT_UInt   end_point );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T1_Hints_CloseFunc\n   *\n   * @description:\n   *   A method of the @T1_Hints class used to close a hint recording\n   *   session.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 1 hints recorder.\n   *\n   *   end_point ::\n   *     The index of the last point in the input glyph.\n   *\n   * @return:\n   *   FreeType error code.  0 means success.\n   *\n   * @note:\n   *   The error code is set to indicate that an error occurred during the\n   *   recording session.\n   *\n   */\n  typedef FT_Error\n  (*T1_Hints_CloseFunc)( T1_Hints  hints,\n                         FT_UInt   end_point );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T1_Hints_ApplyFunc\n   *\n   * @description:\n   *   A method of the @T1_Hints class used to apply hints to the\n   *   corresponding glyph outline.  Must be called once all hints have been\n   *   recorded.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 1 hints recorder.\n   *\n   *   outline ::\n   *     A pointer to the target outline descriptor.\n   *\n   *   globals ::\n   *     The hinter globals for this font.\n   *\n   *   hint_mode ::\n   *     Hinting information.\n   *\n   * @return:\n   *   FreeType error code.  0 means success.\n   *\n   * @note:\n   *   On input, all points within the outline are in font coordinates. On\n   *   output, they are in 1/64th of pixels.\n   *\n   *   The scaling transformation is taken from the `globals' object which\n   *   must correspond to the same font as the glyph.\n   *\n   */\n  typedef FT_Error\n  (*T1_Hints_ApplyFunc)( T1_Hints        hints,\n                         FT_Outline*     outline,\n                         PSH_Globals     globals,\n                         FT_Render_Mode  hint_mode );\n\n\n  /*************************************************************************\n   *\n   * @struct:\n   *   T1_Hints_FuncsRec\n   *\n   * @description:\n   *   The structure used to provide the API to @T1_Hints objects.\n   *\n   * @fields:\n   *   hints ::\n   *     A handle to the T1 Hints recorder.\n   *\n   *   open ::\n   *     The function to open a recording session.\n   *\n   *   close ::\n   *     The function to close a recording session.\n   *\n   *   stem ::\n   *     The function to set a simple stem.\n   *\n   *   stem3 ::\n   *     The function to set counter-controlled stems.\n   *\n   *   reset ::\n   *     The function to reset stem hints.\n   *\n   *   apply ::\n   *     The function to apply the hints to the corresponding glyph outline.\n   *\n   */\n  typedef struct  T1_Hints_FuncsRec_\n  {\n    T1_Hints               hints;\n    T1_Hints_OpenFunc      open;\n    T1_Hints_CloseFunc     close;\n    T1_Hints_SetStemFunc   stem;\n    T1_Hints_SetStem3Func  stem3;\n    T1_Hints_ResetFunc     reset;\n    T1_Hints_ApplyFunc     apply;\n\n  } T1_Hints_FuncsRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                  PUBLIC TYPE 2 HINTS RECORDER                 *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************\n   *\n   * @type:\n   *   T2_Hints\n   *\n   * @description:\n   *   This is a handle to an opaque structure used to record glyph hints\n   *   from a Type 2 character glyph character string.\n   *\n   *   The methods used to operate on this object are defined by the\n   *   @T2_Hints_FuncsRec structure.  Recording glyph hints is normally\n   *   achieved through the following scheme:\n   *\n   *   - Open a new hint recording session by calling the `open' method.\n   *     This rewinds the recorder and prepare it for new input.\n   *\n   *   - For each hint found in the glyph charstring, call the corresponding\n   *     method (`stems', `hintmask', `counters').  Note that these\n   *     functions do not return an error code.\n   *\n   *   - Close the recording session by calling the `close' method.  It\n   *     returns an error code if the hints were invalid or something\n   *     strange happened (e.g., memory shortage).\n   *\n   *   The hints accumulated in the object can later be used by the\n   *   Postscript hinter.\n   *\n   */\n  typedef struct T2_HintsRec_*  T2_Hints;\n\n\n  /*************************************************************************\n   *\n   * @type:\n   *   T2_Hints_Funcs\n   *\n   * @description:\n   *   A pointer to the @T2_Hints_FuncsRec structure that defines the API of\n   *   a given @T2_Hints object.\n   *\n   */\n  typedef const struct T2_Hints_FuncsRec_*  T2_Hints_Funcs;\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T2_Hints_OpenFunc\n   *\n   * @description:\n   *   A method of the @T2_Hints class used to prepare it for a new Type 2\n   *   hints recording session.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 2 hints recorder.\n   *\n   * @note:\n   *   You should always call the @T2_Hints_CloseFunc method in order to\n   *   close an opened recording session.\n   *\n   */\n  typedef void\n  (*T2_Hints_OpenFunc)( T2_Hints  hints );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T2_Hints_StemsFunc\n   *\n   * @description:\n   *   A method of the @T2_Hints class used to set the table of stems in\n   *   either the vertical or horizontal dimension.  Equivalent to the\n   *   `hstem', `vstem', `hstemhm', and `vstemhm' Type 2 operators.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 2 hints recorder.\n   *\n   *   dimension ::\n   *     0 for horizontal stems (hstem), 1 for vertical ones (vstem).\n   *\n   *   count ::\n   *     The number of stems.\n   *\n   *   coords ::\n   *     An array of `count' (position,length) pairs in 16.16 format.\n   *\n   * @note:\n   *   Use vertical coordinates (y) for horizontal stems (dim=0).  Use\n   *   horizontal coordinates (x) for vertical stems (dim=1).\n   *\n   *   There are `2*count' elements in the `coords' array.  Each even\n   *   element is an absolute position in font units, each odd element is a\n   *   length in font units.\n   *\n   *   A length can be negative, in which case it must be either -20 or\n   *   -21.  It is interpreted as a `ghost' stem, according to the Type 1\n   *   specification.\n   *\n   */\n  typedef void\n  (*T2_Hints_StemsFunc)( T2_Hints   hints,\n                         FT_UInt    dimension,\n                         FT_UInt    count,\n                         FT_Fixed*  coordinates );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T2_Hints_MaskFunc\n   *\n   * @description:\n   *   A method of the @T2_Hints class used to set a given hintmask (this\n   *   corresponds to the `hintmask' Type 2 operator).\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 2 hints recorder.\n   *\n   *   end_point ::\n   *     The glyph index of the last point to which the previously defined\n   *     or activated hints apply.\n   *\n   *   bit_count ::\n   *     The number of bits in the hint mask.\n   *\n   *   bytes ::\n   *     An array of bytes modelling the hint mask.\n   *\n   * @note:\n   *   If the hintmask starts the charstring (before any glyph point\n   *   definition), the value of `end_point' should be 0.\n   *\n   *   `bit_count' is the number of meaningful bits in the `bytes' array; it\n   *   must be equal to the total number of hints defined so far (i.e.,\n   *   horizontal+verticals).\n   *\n   *   The `bytes' array can come directly from the Type 2 charstring and\n   *   respects the same format.\n   *\n   */\n  typedef void\n  (*T2_Hints_MaskFunc)( T2_Hints        hints,\n                        FT_UInt         end_point,\n                        FT_UInt         bit_count,\n                        const FT_Byte*  bytes );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T2_Hints_CounterFunc\n   *\n   * @description:\n   *   A method of the @T2_Hints class used to set a given counter mask\n   *   (this corresponds to the `hintmask' Type 2 operator).\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 2 hints recorder.\n   *\n   *   end_point ::\n   *     A glyph index of the last point to which the previously defined or\n   *     active hints apply.\n   *\n   *   bit_count ::\n   *     The number of bits in the hint mask.\n   *\n   *   bytes ::\n   *     An array of bytes modelling the hint mask.\n   *\n   * @note:\n   *   If the hintmask starts the charstring (before any glyph point\n   *   definition), the value of `end_point' should be 0.\n   *\n   *   `bit_count' is the number of meaningful bits in the `bytes' array; it\n   *   must be equal to the total number of hints defined so far (i.e.,\n   *   horizontal+verticals).\n   *\n   *    The `bytes' array can come directly from the Type 2 charstring and\n   *    respects the same format.\n   *\n   */\n  typedef void\n  (*T2_Hints_CounterFunc)( T2_Hints        hints,\n                           FT_UInt         bit_count,\n                           const FT_Byte*  bytes );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T2_Hints_CloseFunc\n   *\n   * @description:\n   *   A method of the @T2_Hints class used to close a hint recording\n   *   session.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 2 hints recorder.\n   *\n   *   end_point ::\n   *     The index of the last point in the input glyph.\n   *\n   * @return:\n   *   FreeType error code.  0 means success.\n   *\n   * @note:\n   *   The error code is set to indicate that an error occurred during the\n   *   recording session.\n   *\n   */\n  typedef FT_Error\n  (*T2_Hints_CloseFunc)( T2_Hints  hints,\n                         FT_UInt   end_point );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T2_Hints_ApplyFunc\n   *\n   * @description:\n   *   A method of the @T2_Hints class used to apply hints to the\n   *   corresponding glyph outline.  Must be called after the `close'\n   *   method.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 2 hints recorder.\n   *\n   *   outline ::\n   *     A pointer to the target outline descriptor.\n   *\n   *   globals ::\n   *     The hinter globals for this font.\n   *\n   *   hint_mode ::\n   *     Hinting information.\n   *\n   * @return:\n   *   FreeType error code.  0 means success.\n   *\n   * @note:\n   *   On input, all points within the outline are in font coordinates. On\n   *   output, they are in 1/64th of pixels.\n   *\n   *   The scaling transformation is taken from the `globals' object which\n   *   must correspond to the same font than the glyph.\n   *\n   */\n  typedef FT_Error\n  (*T2_Hints_ApplyFunc)( T2_Hints        hints,\n                         FT_Outline*     outline,\n                         PSH_Globals     globals,\n                         FT_Render_Mode  hint_mode );\n\n\n  /*************************************************************************\n   *\n   * @struct:\n   *   T2_Hints_FuncsRec\n   *\n   * @description:\n   *   The structure used to provide the API to @T2_Hints objects.\n   *\n   * @fields:\n   *   hints ::\n   *     A handle to the T2 hints recorder object.\n   *\n   *   open ::\n   *     The function to open a recording session.\n   *\n   *   close ::\n   *     The function to close a recording session.\n   *\n   *   stems ::\n   *     The function to set the dimension's stems table.\n   *\n   *   hintmask ::\n   *     The function to set hint masks.\n   *\n   *   counter ::\n   *     The function to set counter masks.\n   *\n   *   apply ::\n   *     The function to apply the hints on the corresponding glyph outline.\n   *\n   */\n  typedef struct  T2_Hints_FuncsRec_\n  {\n    T2_Hints              hints;\n    T2_Hints_OpenFunc     open;\n    T2_Hints_CloseFunc    close;\n    T2_Hints_StemsFunc    stems;\n    T2_Hints_MaskFunc     hintmask;\n    T2_Hints_CounterFunc  counter;\n    T2_Hints_ApplyFunc    apply;\n\n  } T2_Hints_FuncsRec;\n\n\n  /* */\n\n\n  typedef struct  PSHinter_Interface_\n  {\n    PSH_Globals_Funcs  (*get_globals_funcs)( FT_Module  module );\n    T1_Hints_Funcs     (*get_t1_funcs)     ( FT_Module  module );\n    T2_Hints_Funcs     (*get_t2_funcs)     ( FT_Module  module );\n\n  } PSHinter_Interface;\n\n  typedef PSHinter_Interface*  PSHinter_Service;\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_PSHINTER_INTERFACE(        \\\n          class_,                            \\\n          get_globals_funcs_,                \\\n          get_t1_funcs_,                     \\\n          get_t2_funcs_ )                    \\\n  static const PSHinter_Interface  class_ =  \\\n  {                                          \\\n    get_globals_funcs_,                      \\\n    get_t1_funcs_,                           \\\n    get_t2_funcs_                            \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_PSHINTER_INTERFACE(                      \\\n          class_,                                          \\\n          get_globals_funcs_,                              \\\n          get_t1_funcs_,                                   \\\n          get_t2_funcs_ )                                  \\\n  void                                                     \\\n  FT_Init_Class_ ## class_( FT_Library           library,  \\\n                            PSHinter_Interface*  clazz )   \\\n  {                                                        \\\n    FT_UNUSED( library );                                  \\\n                                                           \\\n    clazz->get_globals_funcs = get_globals_funcs_;         \\\n    clazz->get_t1_funcs      = get_t1_funcs_;              \\\n    clazz->get_t2_funcs      = get_t2_funcs_;              \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\nFT_END_HEADER\n\n#endif /* __PSHINTS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/services/svbdf.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svbdf.h                                                                */\n/*                                                                         */\n/*    The FreeType BDF services (specification).                           */\n/*                                                                         */\n/*  Copyright 2003, 2009, 2012 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVBDF_H__\n#define __SVBDF_H__\n\n#include \"../../ftbdf.h\"\n#include \"../ftserv.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_BDF  \"bdf\"\n\n  typedef FT_Error\n  (*FT_BDF_GetCharsetIdFunc)( FT_Face       face,\n                              const char*  *acharset_encoding,\n                              const char*  *acharset_registry );\n\n  typedef FT_Error\n  (*FT_BDF_GetPropertyFunc)( FT_Face           face,\n                             const char*       prop_name,\n                             BDF_PropertyRec  *aproperty );\n\n\n  FT_DEFINE_SERVICE( BDF )\n  {\n    FT_BDF_GetCharsetIdFunc  get_charset_id;\n    FT_BDF_GetPropertyFunc   get_property;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_BDFRec( class_,                                \\\n                                  get_charset_id_,                       \\\n                                  get_property_ )                        \\\n  static const FT_Service_BDFRec  class_ =                               \\\n  {                                                                      \\\n    get_charset_id_, get_property_                                       \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_BDFRec( class_,                                \\\n                                  get_charset_id_,                       \\\n                                  get_property_ )                        \\\n  void                                                                   \\\n  FT_Init_Class_ ## class_( FT_Service_BDFRec*  clazz )                  \\\n  {                                                                      \\\n    clazz->get_charset_id = get_charset_id_;                             \\\n    clazz->get_property   = get_property_;                               \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVBDF_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/services/svcid.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svcid.h                                                                */\n/*                                                                         */\n/*    The FreeType CID font services (specification).                      */\n/*                                                                         */\n/*  Copyright 2007, 2009, 2012 by Derek Clegg, Michael Toftdal.            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVCID_H__\n#define __SVCID_H__\n\n#include \"../ftserv.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_CID  \"CID\"\n\n  typedef FT_Error\n  (*FT_CID_GetRegistryOrderingSupplementFunc)( FT_Face       face,\n                                               const char*  *registry,\n                                               const char*  *ordering,\n                                               FT_Int       *supplement );\n  typedef FT_Error\n  (*FT_CID_GetIsInternallyCIDKeyedFunc)( FT_Face   face,\n                                         FT_Bool  *is_cid );\n  typedef FT_Error\n  (*FT_CID_GetCIDFromGlyphIndexFunc)( FT_Face   face,\n                                      FT_UInt   glyph_index,\n                                      FT_UInt  *cid );\n\n  FT_DEFINE_SERVICE( CID )\n  {\n    FT_CID_GetRegistryOrderingSupplementFunc  get_ros;\n    FT_CID_GetIsInternallyCIDKeyedFunc        get_is_cid;\n    FT_CID_GetCIDFromGlyphIndexFunc           get_cid_from_glyph_index;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_CIDREC( class_,                                   \\\n                                  get_ros_,                                 \\\n                                  get_is_cid_,                              \\\n                                  get_cid_from_glyph_index_ )               \\\n  static const FT_Service_CIDRec class_ =                                   \\\n  {                                                                         \\\n    get_ros_, get_is_cid_, get_cid_from_glyph_index_                        \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_CIDREC( class_,                                   \\\n                                  get_ros_,                                 \\\n                                  get_is_cid_,                              \\\n                                  get_cid_from_glyph_index_ )               \\\n  void                                                                      \\\n  FT_Init_Class_ ## class_( FT_Library          library,                    \\\n                            FT_Service_CIDRec*  clazz )                     \\\n  {                                                                         \\\n    FT_UNUSED( library );                                                   \\\n                                                                            \\\n    clazz->get_ros                  = get_ros_;                             \\\n    clazz->get_is_cid               = get_is_cid_;                          \\\n    clazz->get_cid_from_glyph_index = get_cid_from_glyph_index_;            \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVCID_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/services/svgldict.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svgldict.h                                                             */\n/*                                                                         */\n/*    The FreeType glyph dictionary services (specification).              */\n/*                                                                         */\n/*  Copyright 2003, 2009, 2012 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVGLDICT_H__\n#define __SVGLDICT_H__\n\n#include \"../ftserv.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*\n   *  A service used to retrieve glyph names, as well as to find the\n   *  index of a given glyph name in a font.\n   *\n   */\n\n#define FT_SERVICE_ID_GLYPH_DICT  \"glyph-dict\"\n\n\n  typedef FT_Error\n  (*FT_GlyphDict_GetNameFunc)( FT_Face     face,\n                               FT_UInt     glyph_index,\n                               FT_Pointer  buffer,\n                               FT_UInt     buffer_max );\n\n  typedef FT_UInt\n  (*FT_GlyphDict_NameIndexFunc)( FT_Face     face,\n                                 FT_String*  glyph_name );\n\n\n  FT_DEFINE_SERVICE( GlyphDict )\n  {\n    FT_GlyphDict_GetNameFunc    get_name;\n    FT_GlyphDict_NameIndexFunc  name_index;  /* optional */\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_GLYPHDICTREC( class_,                        \\\n                                        get_name_,                     \\\n                                        name_index_)                   \\\n  static const FT_Service_GlyphDictRec  class_ =                       \\\n  {                                                                    \\\n    get_name_, name_index_                                             \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_GLYPHDICTREC( class_,                        \\\n                                        get_name_,                     \\\n                                        name_index_)                   \\\n  void                                                                 \\\n  FT_Init_Class_ ## class_( FT_Library                library,         \\\n                            FT_Service_GlyphDictRec*  clazz )          \\\n  {                                                                    \\\n    FT_UNUSED( library );                                              \\\n                                                                       \\\n    clazz->get_name   = get_name_;                                     \\\n    clazz->name_index = name_index_;                                   \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVGLDICT_H__ */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/services/svgxval.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svgxval.h                                                              */\n/*                                                                         */\n/*    FreeType API for validating TrueTypeGX/AAT tables (specification).   */\n/*                                                                         */\n/*  Copyright 2004, 2005 by                                                */\n/*  Masatake YAMATO, Red Hat K.K.,                                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVGXVAL_H__\n#define __SVGXVAL_H__\n\n#include \"../../ftgxval.h\"\n#include \"../ftvalid.h\"\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_GX_VALIDATE           \"truetypegx-validate\"\n#define FT_SERVICE_ID_CLASSICKERN_VALIDATE  \"classickern-validate\"\n\n  typedef FT_Error\n  (*gxv_validate_func)( FT_Face   face,\n                        FT_UInt   gx_flags,\n                        FT_Bytes  tables[FT_VALIDATE_GX_LENGTH],\n                        FT_UInt   table_length );\n\n\n  typedef FT_Error\n  (*ckern_validate_func)( FT_Face   face,\n                          FT_UInt   ckern_flags,\n                          FT_Bytes  *ckern_table );\n\n\n  FT_DEFINE_SERVICE( GXvalidate )\n  {\n    gxv_validate_func  validate;\n  };\n\n  FT_DEFINE_SERVICE( CKERNvalidate )\n  {\n    ckern_validate_func  validate;\n  };\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVGXVAL_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/services/svkern.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svkern.h                                                               */\n/*                                                                         */\n/*    The FreeType Kerning service (specification).                        */\n/*                                                                         */\n/*  Copyright 2006 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVKERN_H__\n#define __SVKERN_H__\n\n#include \"../ftserv.h\"\n#include \"../../tttables.h\"\n\n\nFT_BEGIN_HEADER\n\n#define FT_SERVICE_ID_KERNING  \"kerning\"\n\n\n  typedef FT_Error\n  (*FT_Kerning_TrackGetFunc)( FT_Face    face,\n                              FT_Fixed   point_size,\n                              FT_Int     degree,\n                              FT_Fixed*  akerning );\n\n  FT_DEFINE_SERVICE( Kerning )\n  {\n    FT_Kerning_TrackGetFunc  get_track;\n  };\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVKERN_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/services/svmm.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svmm.h                                                                 */\n/*                                                                         */\n/*    The FreeType Multiple Masters and GX var services (specification).   */\n/*                                                                         */\n/*  Copyright 2003, 2004, 2009, 2012 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVMM_H__\n#define __SVMM_H__\n\n#include \"../ftserv.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*\n   *  A service used to manage multiple-masters data in a given face.\n   *\n   *  See the related APIs in `ftmm.h' (FT_MULTIPLE_MASTERS_H).\n   *\n   */\n\n#define FT_SERVICE_ID_MULTI_MASTERS  \"multi-masters\"\n\n\n  typedef FT_Error\n  (*FT_Get_MM_Func)( FT_Face           face,\n                     FT_Multi_Master*  master );\n\n  typedef FT_Error\n  (*FT_Get_MM_Var_Func)( FT_Face      face,\n                         FT_MM_Var*  *master );\n\n  typedef FT_Error\n  (*FT_Set_MM_Design_Func)( FT_Face   face,\n                            FT_UInt   num_coords,\n                            FT_Long*  coords );\n\n  typedef FT_Error\n  (*FT_Set_Var_Design_Func)( FT_Face    face,\n                             FT_UInt    num_coords,\n                             FT_Fixed*  coords );\n\n  typedef FT_Error\n  (*FT_Set_MM_Blend_Func)( FT_Face   face,\n                           FT_UInt   num_coords,\n                           FT_Long*  coords );\n\n\n  FT_DEFINE_SERVICE( MultiMasters )\n  {\n    FT_Get_MM_Func          get_mm;\n    FT_Set_MM_Design_Func   set_mm_design;\n    FT_Set_MM_Blend_Func    set_mm_blend;\n    FT_Get_MM_Var_Func      get_mm_var;\n    FT_Set_Var_Design_Func  set_var_design;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_,                          \\\n                                           get_mm_,                         \\\n                                           set_mm_design_,                  \\\n                                           set_mm_blend_,                   \\\n                                           get_mm_var_,                     \\\n                                           set_var_design_ )                \\\n  static const FT_Service_MultiMastersRec  class_ =                         \\\n  {                                                                         \\\n    get_mm_, set_mm_design_, set_mm_blend_, get_mm_var_, set_var_design_    \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_,                          \\\n                                           get_mm_,                         \\\n                                           set_mm_design_,                  \\\n                                           set_mm_blend_,                   \\\n                                           get_mm_var_,                     \\\n                                           set_var_design_ )                \\\n  void                                                                      \\\n  FT_Init_Class_ ## class_( FT_Service_MultiMastersRec*  clazz )            \\\n  {                                                                         \\\n    clazz->get_mm         = get_mm_;                                        \\\n    clazz->set_mm_design  = set_mm_design_;                                 \\\n    clazz->set_mm_blend   = set_mm_blend_;                                  \\\n    clazz->get_mm_var     = get_mm_var_;                                    \\\n    clazz->set_var_design = set_var_design_;                                \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __SVMM_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/services/svotval.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svotval.h                                                              */\n/*                                                                         */\n/*    The FreeType OpenType validation service (specification).            */\n/*                                                                         */\n/*  Copyright 2004, 2006 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVOTVAL_H__\n#define __SVOTVAL_H__\n\n#include \"../../ftotval.h\"\n#include \"../ftvalid.h\"\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_OPENTYPE_VALIDATE  \"opentype-validate\"\n\n\n  typedef FT_Error\n  (*otv_validate_func)( FT_Face volatile  face,\n                        FT_UInt           ot_flags,\n                        FT_Bytes         *base,\n                        FT_Bytes         *gdef,\n                        FT_Bytes         *gpos,\n                        FT_Bytes         *gsub,\n                        FT_Bytes         *jstf );\n\n\n  FT_DEFINE_SERVICE( OTvalidate )\n  {\n    otv_validate_func  validate;\n  };\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVOTVAL_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/services/svpfr.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svpfr.h                                                                */\n/*                                                                         */\n/*    Internal PFR service functions (specification).                      */\n/*                                                                         */\n/*  Copyright 2003, 2006 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVPFR_H__\n#define __SVPFR_H__\n\n#include \"../../ftpfr.h\"\n#include \"../ftserv.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_PFR_METRICS  \"pfr-metrics\"\n\n\n  typedef FT_Error\n  (*FT_PFR_GetMetricsFunc)( FT_Face    face,\n                            FT_UInt   *aoutline,\n                            FT_UInt   *ametrics,\n                            FT_Fixed  *ax_scale,\n                            FT_Fixed  *ay_scale );\n\n  typedef FT_Error\n  (*FT_PFR_GetKerningFunc)( FT_Face     face,\n                            FT_UInt     left,\n                            FT_UInt     right,\n                            FT_Vector  *avector );\n\n  typedef FT_Error\n  (*FT_PFR_GetAdvanceFunc)( FT_Face   face,\n                            FT_UInt   gindex,\n                            FT_Pos   *aadvance );\n\n\n  FT_DEFINE_SERVICE( PfrMetrics )\n  {\n    FT_PFR_GetMetricsFunc  get_metrics;\n    FT_PFR_GetKerningFunc  get_kerning;\n    FT_PFR_GetAdvanceFunc  get_advance;\n\n  };\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __SVPFR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/services/svpostnm.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svpostnm.h                                                             */\n/*                                                                         */\n/*    The FreeType PostScript name services (specification).               */\n/*                                                                         */\n/*  Copyright 2003, 2007, 2009, 2012 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVPOSTNM_H__\n#define __SVPOSTNM_H__\n\n#include \"../ftserv.h\"\n\n\nFT_BEGIN_HEADER\n\n  /*\n   *  A trivial service used to retrieve the PostScript name of a given\n   *  font when available.  The `get_name' field should never be NULL.\n   *\n   *  The corresponding function can return NULL to indicate that the\n   *  PostScript name is not available.\n   *\n   *  The name is owned by the face and will be destroyed with it.\n   */\n\n#define FT_SERVICE_ID_POSTSCRIPT_FONT_NAME  \"postscript-font-name\"\n\n\n  typedef const char*\n  (*FT_PsName_GetFunc)( FT_Face  face );\n\n\n  FT_DEFINE_SERVICE( PsFontName )\n  {\n    FT_PsName_GetFunc  get_ps_font_name;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \\\n  static const FT_Service_PsFontNameRec  class_ =                    \\\n  {                                                                  \\\n    get_ps_font_name_                                                \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \\\n  void                                                               \\\n  FT_Init_Class_ ## class_( FT_Library                 library,      \\\n                            FT_Service_PsFontNameRec*  clazz )       \\\n  {                                                                  \\\n    FT_UNUSED( library );                                            \\\n                                                                     \\\n    clazz->get_ps_font_name = get_ps_font_name_;                     \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVPOSTNM_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/services/svprop.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svprop.h                                                               */\n/*                                                                         */\n/*    The FreeType property service (specification).                       */\n/*                                                                         */\n/*  Copyright 2012 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVPROP_H__\n#define __SVPROP_H__\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_PROPERTIES  \"properties\"\n\n\n  typedef FT_Error\n  (*FT_Properties_SetFunc)( FT_Module    module,\n                            const char*  property_name,\n                            const void*  value );\n\n  typedef FT_Error\n  (*FT_Properties_GetFunc)( FT_Module    module,\n                            const char*  property_name,\n                            void*        value );\n\n\n  FT_DEFINE_SERVICE( Properties )\n  {\n    FT_Properties_SetFunc  set_property;\n    FT_Properties_GetFunc  get_property;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_PROPERTIESREC( class_,          \\\n                                         set_property_,   \\\n                                         get_property_ )  \\\n  static const FT_Service_PropertiesRec  class_ =         \\\n  {                                                       \\\n    set_property_,                                        \\\n    get_property_                                         \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_PROPERTIESREC( class_,                \\\n                                         set_property_,         \\\n                                         get_property_ )        \\\n  void                                                          \\\n  FT_Init_Class_ ## class_( FT_Service_PropertiesRec*  clazz )  \\\n  {                                                             \\\n    clazz->set_property = set_property_;                        \\\n    clazz->get_property = get_property_;                        \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVPROP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/services/svpscmap.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svpscmap.h                                                             */\n/*                                                                         */\n/*    The FreeType PostScript charmap service (specification).             */\n/*                                                                         */\n/*  Copyright 2003, 2006, 2009, 2012 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVPSCMAP_H__\n#define __SVPSCMAP_H__\n\n#include \"../ftobjs.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_POSTSCRIPT_CMAPS  \"postscript-cmaps\"\n\n\n  /*\n   *  Adobe glyph name to unicode value.\n   */\n  typedef FT_UInt32\n  (*PS_Unicode_ValueFunc)( const char*  glyph_name );\n\n  /*\n   *  Macintosh name id to glyph name.  NULL if invalid index.\n   */\n  typedef const char*\n  (*PS_Macintosh_NameFunc)( FT_UInt  name_index );\n\n  /*\n   *  Adobe standard string ID to glyph name.  NULL if invalid index.\n   */\n  typedef const char*\n  (*PS_Adobe_Std_StringsFunc)( FT_UInt  string_index );\n\n\n  /*\n   *  Simple unicode -> glyph index charmap built from font glyph names\n   *  table.\n   */\n  typedef struct  PS_UniMap_\n  {\n    FT_UInt32  unicode;      /* bit 31 set: is glyph variant */\n    FT_UInt    glyph_index;\n\n  } PS_UniMap;\n\n\n  typedef struct PS_UnicodesRec_*  PS_Unicodes;\n\n  typedef struct  PS_UnicodesRec_\n  {\n    FT_CMapRec  cmap;\n    FT_UInt     num_maps;\n    PS_UniMap*  maps;\n\n  } PS_UnicodesRec;\n\n\n  /*\n   *  A function which returns a glyph name for a given index.  Returns\n   *  NULL if invalid index.\n   */\n  typedef const char*\n  (*PS_GetGlyphNameFunc)( FT_Pointer  data,\n                          FT_UInt     string_index );\n\n  /*\n   *  A function used to release the glyph name returned by\n   *  PS_GetGlyphNameFunc, when needed\n   */\n  typedef void\n  (*PS_FreeGlyphNameFunc)( FT_Pointer  data,\n                           const char*  name );\n\n  typedef FT_Error\n  (*PS_Unicodes_InitFunc)( FT_Memory             memory,\n                           PS_Unicodes           unicodes,\n                           FT_UInt               num_glyphs,\n                           PS_GetGlyphNameFunc   get_glyph_name,\n                           PS_FreeGlyphNameFunc  free_glyph_name,\n                           FT_Pointer            glyph_data );\n\n  typedef FT_UInt\n  (*PS_Unicodes_CharIndexFunc)( PS_Unicodes  unicodes,\n                                FT_UInt32    unicode );\n\n  typedef FT_UInt32\n  (*PS_Unicodes_CharNextFunc)( PS_Unicodes  unicodes,\n                               FT_UInt32   *unicode );\n\n\n  FT_DEFINE_SERVICE( PsCMaps )\n  {\n    PS_Unicode_ValueFunc       unicode_value;\n\n    PS_Unicodes_InitFunc       unicodes_init;\n    PS_Unicodes_CharIndexFunc  unicodes_char_index;\n    PS_Unicodes_CharNextFunc   unicodes_char_next;\n\n    PS_Macintosh_NameFunc      macintosh_name;\n    PS_Adobe_Std_StringsFunc   adobe_std_strings;\n    const unsigned short*      adobe_std_encoding;\n    const unsigned short*      adobe_expert_encoding;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_PSCMAPSREC( class_,                               \\\n                                      unicode_value_,                       \\\n                                      unicodes_init_,                       \\\n                                      unicodes_char_index_,                 \\\n                                      unicodes_char_next_,                  \\\n                                      macintosh_name_,                      \\\n                                      adobe_std_strings_,                   \\\n                                      adobe_std_encoding_,                  \\\n                                      adobe_expert_encoding_ )              \\\n  static const FT_Service_PsCMapsRec  class_ =                              \\\n  {                                                                         \\\n    unicode_value_, unicodes_init_,                                         \\\n    unicodes_char_index_, unicodes_char_next_, macintosh_name_,             \\\n    adobe_std_strings_, adobe_std_encoding_, adobe_expert_encoding_         \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_PSCMAPSREC( class_,                               \\\n                                      unicode_value_,                       \\\n                                      unicodes_init_,                       \\\n                                      unicodes_char_index_,                 \\\n                                      unicodes_char_next_,                  \\\n                                      macintosh_name_,                      \\\n                                      adobe_std_strings_,                   \\\n                                      adobe_std_encoding_,                  \\\n                                      adobe_expert_encoding_ )              \\\n  void                                                                      \\\n  FT_Init_Class_ ## class_( FT_Library              library,                \\\n                            FT_Service_PsCMapsRec*  clazz )                 \\\n  {                                                                         \\\n    FT_UNUSED( library );                                                   \\\n                                                                            \\\n    clazz->unicode_value         = unicode_value_;                          \\\n    clazz->unicodes_init         = unicodes_init_;                          \\\n    clazz->unicodes_char_index   = unicodes_char_index_;                    \\\n    clazz->unicodes_char_next    = unicodes_char_next_;                     \\\n    clazz->macintosh_name        = macintosh_name_;                         \\\n    clazz->adobe_std_strings     = adobe_std_strings_;                      \\\n    clazz->adobe_std_encoding    = adobe_std_encoding_;                     \\\n    clazz->adobe_expert_encoding = adobe_expert_encoding_;                  \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVPSCMAP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/services/svpsinfo.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svpsinfo.h                                                             */\n/*                                                                         */\n/*    The FreeType PostScript info service (specification).                */\n/*                                                                         */\n/*  Copyright 2003, 2004, 2009, 2011, 2012 by                              */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVPSINFO_H__\n#define __SVPSINFO_H__\n\n#include \"../ftserv.h\"\n#include \"../t1types.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_POSTSCRIPT_INFO  \"postscript-info\"\n\n\n  typedef FT_Error\n  (*PS_GetFontInfoFunc)( FT_Face          face,\n                         PS_FontInfoRec*  afont_info );\n\n  typedef FT_Error\n  (*PS_GetFontExtraFunc)( FT_Face           face,\n                          PS_FontExtraRec*  afont_extra );\n\n  typedef FT_Int\n  (*PS_HasGlyphNamesFunc)( FT_Face  face );\n\n  typedef FT_Error\n  (*PS_GetFontPrivateFunc)( FT_Face         face,\n                            PS_PrivateRec*  afont_private );\n\n  typedef FT_Long\n  (*PS_GetFontValueFunc)( FT_Face       face,\n                          PS_Dict_Keys  key,\n                          FT_UInt       idx,\n                          void         *value,\n                          FT_Long       value_len );\n\n\n  FT_DEFINE_SERVICE( PsInfo )\n  {\n    PS_GetFontInfoFunc     ps_get_font_info;\n    PS_GetFontExtraFunc    ps_get_font_extra;\n    PS_HasGlyphNamesFunc   ps_has_glyph_names;\n    PS_GetFontPrivateFunc  ps_get_font_private;\n    PS_GetFontValueFunc    ps_get_font_value;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_PSINFOREC( class_,                     \\\n                                     get_font_info_,             \\\n                                     ps_get_font_extra_,         \\\n                                     has_glyph_names_,           \\\n                                     get_font_private_,          \\\n                                     get_font_value_ )           \\\n  static const FT_Service_PsInfoRec  class_ =                    \\\n  {                                                              \\\n    get_font_info_, ps_get_font_extra_, has_glyph_names_,        \\\n    get_font_private_, get_font_value_                           \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_PSINFOREC( class_,                     \\\n                                     get_font_info_,             \\\n                                     ps_get_font_extra_,         \\\n                                     has_glyph_names_,           \\\n                                     get_font_private_,          \\\n                                     get_font_value_ )           \\\n  void                                                           \\\n  FT_Init_Class_ ## class_( FT_Library             library,      \\\n                            FT_Service_PsInfoRec*  clazz )       \\\n  {                                                              \\\n    FT_UNUSED( library );                                        \\\n                                                                 \\\n    clazz->ps_get_font_info    = get_font_info_;                 \\\n    clazz->ps_get_font_extra   = ps_get_font_extra_;             \\\n    clazz->ps_has_glyph_names  = has_glyph_names_;               \\\n    clazz->ps_get_font_private = get_font_private_;              \\\n    clazz->ps_get_font_value   = get_font_value_;                \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVPSINFO_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/services/svsfnt.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svsfnt.h                                                               */\n/*                                                                         */\n/*    The FreeType SFNT table loading service (specification).             */\n/*                                                                         */\n/*  Copyright 2003, 2004, 2009, 2012 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVSFNT_H__\n#define __SVSFNT_H__\n\n#include \"../ftserv.h\"\n#include \"../../tttables.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*\n   *  SFNT table loading service.\n   */\n\n#define FT_SERVICE_ID_SFNT_TABLE  \"sfnt-table\"\n\n\n  /*\n   * Used to implement FT_Load_Sfnt_Table().\n   */\n  typedef FT_Error\n  (*FT_SFNT_TableLoadFunc)( FT_Face    face,\n                            FT_ULong   tag,\n                            FT_Long    offset,\n                            FT_Byte*   buffer,\n                            FT_ULong*  length );\n\n  /*\n   * Used to implement FT_Get_Sfnt_Table().\n   */\n  typedef void*\n  (*FT_SFNT_TableGetFunc)( FT_Face      face,\n                           FT_Sfnt_Tag  tag );\n\n\n  /*\n   * Used to implement FT_Sfnt_Table_Info().\n   */\n  typedef FT_Error\n  (*FT_SFNT_TableInfoFunc)( FT_Face    face,\n                            FT_UInt    idx,\n                            FT_ULong  *tag,\n                            FT_ULong  *offset,\n                            FT_ULong  *length );\n\n\n  FT_DEFINE_SERVICE( SFNT_Table )\n  {\n    FT_SFNT_TableLoadFunc  load_table;\n    FT_SFNT_TableGetFunc   get_table;\n    FT_SFNT_TableInfoFunc  table_info;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ )  \\\n  static const FT_Service_SFNT_TableRec  class_ =                      \\\n  {                                                                    \\\n    load_, get_, info_                                                 \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ ) \\\n  void                                                                \\\n  FT_Init_Class_ ## class_( FT_Service_SFNT_TableRec*  clazz )        \\\n  {                                                                   \\\n    clazz->load_table = load_;                                        \\\n    clazz->get_table  = get_;                                         \\\n    clazz->table_info = info_;                                        \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVSFNT_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/services/svttcmap.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svttcmap.h                                                             */\n/*                                                                         */\n/*    The FreeType TrueType/sfnt cmap extra information service.           */\n/*                                                                         */\n/*  Copyright 2003 by                                                      */\n/*  Masatake YAMATO, Redhat K.K.                                           */\n/*                                                                         */\n/*  Copyright 2003, 2008, 2009, 2012 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/* Development of this service is support of\n   Information-technology Promotion Agency, Japan. */\n\n#ifndef __SVTTCMAP_H__\n#define __SVTTCMAP_H__\n\n#include \"../ftserv.h\"\n#include \"../../tttables.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_TT_CMAP  \"tt-cmaps\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_CMapInfo                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to store TrueType/sfnt specific cmap information  */\n  /*    which is not covered by the generic @FT_CharMap structure.  This   */\n  /*    structure can be accessed with the @FT_Get_TT_CMap_Info function.  */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    language ::                                                        */\n  /*      The language ID used in Mac fonts.  Definitions of values are in */\n  /*      freetype/ttnameid.h.                                             */\n  /*                                                                       */\n  /*    format ::                                                          */\n  /*      The cmap format.  OpenType 1.5 defines the formats 0 (byte       */\n  /*      encoding table), 2~(high-byte mapping through table), 4~(segment */\n  /*      mapping to delta values), 6~(trimmed table mapping), 8~(mixed    */\n  /*      16-bit and 32-bit coverage), 10~(trimmed array), 12~(segmented   */\n  /*      coverage), and 14 (Unicode Variation Sequences).                 */\n  /*                                                                       */\n  typedef struct  TT_CMapInfo_\n  {\n    FT_ULong  language;\n    FT_Long   format;\n\n  } TT_CMapInfo;\n\n\n  typedef FT_Error\n  (*TT_CMap_Info_GetFunc)( FT_CharMap    charmap,\n                           TT_CMapInfo  *cmap_info );\n\n\n  FT_DEFINE_SERVICE( TTCMaps )\n  {\n    TT_CMap_Info_GetFunc  get_cmap_info;\n  };\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ )  \\\n  static const FT_Service_TTCMapsRec  class_ =                  \\\n  {                                                             \\\n    get_cmap_info_                                              \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ )  \\\n  void                                                          \\\n  FT_Init_Class_ ## class_( FT_Library              library,    \\\n                            FT_Service_TTCMapsRec*  clazz )     \\\n  {                                                             \\\n    FT_UNUSED( library );                                       \\\n                                                                \\\n    clazz->get_cmap_info = get_cmap_info_;                      \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __SVTTCMAP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/services/svtteng.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svtteng.h                                                              */\n/*                                                                         */\n/*    The FreeType TrueType engine query service (specification).          */\n/*                                                                         */\n/*  Copyright 2006 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVTTENG_H__\n#define __SVTTENG_H__\n\n#include \"../ftserv.h\"\n#include \"../../ftmodapi.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*\n   *  SFNT table loading service.\n   */\n\n#define FT_SERVICE_ID_TRUETYPE_ENGINE  \"truetype-engine\"\n\n  /*\n   * Used to implement FT_Get_TrueType_Engine_Type\n   */\n\n  FT_DEFINE_SERVICE( TrueTypeEngine )\n  {\n    FT_TrueTypeEngineType  engine_type;\n  };\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVTTENG_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/services/svttglyf.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svttglyf.h                                                             */\n/*                                                                         */\n/*    The FreeType TrueType glyph service.                                 */\n/*                                                                         */\n/*  Copyright 2007, 2009, 2012 by David Turner.                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#ifndef __SVTTGLYF_H__\n#define __SVTTGLYF_H__\n\n#include \"../ftserv.h\"\n#include \"../../tttables.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_TT_GLYF  \"tt-glyf\"\n\n\n  typedef FT_ULong\n  (*TT_Glyf_GetLocationFunc)( FT_Face    face,\n                              FT_UInt    gindex,\n                              FT_ULong  *psize );\n\n  FT_DEFINE_SERVICE( TTGlyf )\n  {\n    TT_Glyf_GetLocationFunc  get_location;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ )  \\\n  static const FT_Service_TTGlyfRec  class_ =                 \\\n  {                                                           \\\n    get_location_                                             \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ )  \\\n  void                                                        \\\n  FT_Init_Class_ ## class_( FT_Service_TTGlyfRec*  clazz )    \\\n  {                                                           \\\n    clazz->get_location = get_location_;                      \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __SVTTGLYF_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/services/svwinfnt.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svwinfnt.h                                                             */\n/*                                                                         */\n/*    The FreeType Windows FNT/FONT service (specification).               */\n/*                                                                         */\n/*  Copyright 2003 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVWINFNT_H__\n#define __SVWINFNT_H__\n\n#include \"../ftserv.h\"\n#include \"../../ftwinfnt.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_WINFNT  \"winfonts\"\n\n  typedef FT_Error\n  (*FT_WinFnt_GetHeaderFunc)( FT_Face               face,\n                              FT_WinFNT_HeaderRec  *aheader );\n\n\n  FT_DEFINE_SERVICE( WinFnt )\n  {\n    FT_WinFnt_GetHeaderFunc  get_header;\n  };\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVWINFNT_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/services/svxf86nm.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svxf86nm.h                                                             */\n/*                                                                         */\n/*    The FreeType XFree86 services (specification only).                  */\n/*                                                                         */\n/*  Copyright 2003 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVXF86NM_H__\n#define __SVXF86NM_H__\n\n#include \"../ftserv.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*\n   *  A trivial service used to return the name of a face's font driver,\n   *  according to the XFree86 nomenclature.  Note that the service data\n   *  is a simple constant string pointer.\n   */\n\n#define FT_SERVICE_ID_XF86_NAME  \"xf86-driver-name\"\n\n#define FT_XF86_FORMAT_TRUETYPE  \"TrueType\"\n#define FT_XF86_FORMAT_TYPE_1    \"Type 1\"\n#define FT_XF86_FORMAT_BDF       \"BDF\"\n#define FT_XF86_FORMAT_PCF       \"PCF\"\n#define FT_XF86_FORMAT_TYPE_42   \"Type 42\"\n#define FT_XF86_FORMAT_CID       \"CID Type 1\"\n#define FT_XF86_FORMAT_CFF       \"CFF\"\n#define FT_XF86_FORMAT_PFR       \"PFR\"\n#define FT_XF86_FORMAT_WINFNT    \"Windows FNT\"\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVXF86NM_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/sfnt.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  sfnt.h                                                                 */\n/*                                                                         */\n/*    High-level `sfnt' driver interface (specification).                  */\n/*                                                                         */\n/*  Copyright 1996-2006, 2009, 2012-2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SFNT_H__\n#define __SFNT_H__\n\n\n#include \"../../ft2build.h\"\n#include \"ftdriver.h\"\n#include \"tttypes.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Init_Face_Func                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    First part of the SFNT face object initialization.  This finds     */\n  /*    the face in a SFNT file or collection, and load its format tag in  */\n  /*    face->format_tag.                                                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream     :: The input stream.                                    */\n  /*                                                                       */\n  /*    face       :: A handle to the target face object.                  */\n  /*                                                                       */\n  /*    face_index :: The index of the TrueType font, if we are opening a  */\n  /*                  collection.                                          */\n  /*                                                                       */\n  /*    num_params :: The number of additional parameters.                 */\n  /*                                                                       */\n  /*    params     :: Optional additional parameters.                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The stream cursor must be at the font file's origin.               */\n  /*                                                                       */\n  /*    This function recognizes fonts embedded in a `TrueType             */\n  /*    collection'.                                                       */\n  /*                                                                       */\n  /*    Once the format tag has been validated by the font driver, it      */\n  /*    should then call the TT_Load_Face_Func() callback to read the rest */\n  /*    of the SFNT tables in the object.                                  */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Init_Face_Func)( FT_Stream      stream,\n                        TT_Face        face,\n                        FT_Int         face_index,\n                        FT_Int         num_params,\n                        FT_Parameter*  params );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Load_Face_Func                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Second part of the SFNT face object initialization.  This loads    */\n  /*    the common SFNT tables (head, OS/2, maxp, metrics, etc.) in the    */\n  /*    face object.                                                       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream     :: The input stream.                                    */\n  /*                                                                       */\n  /*    face       :: A handle to the target face object.                  */\n  /*                                                                       */\n  /*    face_index :: The index of the TrueType font, if we are opening a  */\n  /*                  collection.                                          */\n  /*                                                                       */\n  /*    num_params :: The number of additional parameters.                 */\n  /*                                                                       */\n  /*    params     :: Optional additional parameters.                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function must be called after TT_Init_Face_Func().            */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Load_Face_Func)( FT_Stream      stream,\n                        TT_Face        face,\n                        FT_Int         face_index,\n                        FT_Int         num_params,\n                        FT_Parameter*  params );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Done_Face_Func                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A callback used to delete the common SFNT data from a face.        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to the target face object.                        */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function does NOT destroy the face object.                    */\n  /*                                                                       */\n  typedef void\n  (*TT_Done_Face_Func)( TT_Face  face );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Load_Any_Func                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load any font table into client memory.                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: The face object to look for.                             */\n  /*                                                                       */\n  /*    tag    :: The tag of table to load.  Use the value 0 if you want   */\n  /*              to access the whole font file, else set this parameter   */\n  /*              to a valid TrueType table tag that you can forge with    */\n  /*              the MAKE_TT_TAG macro.                                   */\n  /*                                                                       */\n  /*    offset :: The starting offset in the table (or the file if         */\n  /*              tag == 0).                                               */\n  /*                                                                       */\n  /*    length :: The address of the decision variable:                    */\n  /*                                                                       */\n  /*                If length == NULL:                                     */\n  /*                  Loads the whole table.  Returns an error if          */\n  /*                  `offset' == 0!                                       */\n  /*                                                                       */\n  /*                If *length == 0:                                       */\n  /*                  Exits immediately; returning the length of the given */\n  /*                  table or of the font file, depending on the value of */\n  /*                  `tag'.                                               */\n  /*                                                                       */\n  /*                If *length != 0:                                       */\n  /*                  Loads the next `length' bytes of table or font,      */\n  /*                  starting at offset `offset' (in table or font too).  */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    buffer :: The address of target buffer.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    TrueType error code.  0 means success.                             */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Load_Any_Func)( TT_Face    face,\n                       FT_ULong   tag,\n                       FT_Long    offset,\n                       FT_Byte   *buffer,\n                       FT_ULong*  length );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Find_SBit_Image_Func                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Check whether an embedded bitmap (an `sbit') exists for a given    */\n  /*    glyph, at a given strike.                                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face          :: The target face object.                           */\n  /*                                                                       */\n  /*    glyph_index   :: The glyph index.                                  */\n  /*                                                                       */\n  /*    strike_index  :: The current strike index.                         */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    arange        :: The SBit range containing the glyph index.        */\n  /*                                                                       */\n  /*    astrike       :: The SBit strike containing the glyph index.       */\n  /*                                                                       */\n  /*    aglyph_offset :: The offset of the glyph data in `EBDT' table.     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.  Returns                    */\n  /*    SFNT_Err_Invalid_Argument if no sbit exists for the requested      */\n  /*    glyph.                                                             */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Find_SBit_Image_Func)( TT_Face          face,\n                              FT_UInt          glyph_index,\n                              FT_ULong         strike_index,\n                              TT_SBit_Range   *arange,\n                              TT_SBit_Strike  *astrike,\n                              FT_ULong        *aglyph_offset );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Load_SBit_Metrics_Func                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Get the big metrics for a given embedded bitmap.                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream      :: The input stream.                                   */\n  /*                                                                       */\n  /*    range       :: The SBit range containing the glyph.                */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    big_metrics :: A big SBit metrics structure for the glyph.         */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The stream cursor must be positioned at the glyph's offset within  */\n  /*    the `EBDT' table before the call.                                  */\n  /*                                                                       */\n  /*    If the image format uses variable metrics, the stream cursor is    */\n  /*    positioned just after the metrics header in the `EBDT' table on    */\n  /*    function exit.                                                     */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Load_SBit_Metrics_Func)( FT_Stream        stream,\n                                TT_SBit_Range    range,\n                                TT_SBit_Metrics  metrics );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Load_SBit_Image_Func                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load a given glyph sbit image from the font resource.  This also   */\n  /*    returns its metrics.                                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face ::                                                            */\n  /*      The target face object.                                          */\n  /*                                                                       */\n  /*    strike_index ::                                                    */\n  /*      The strike index.                                                */\n  /*                                                                       */\n  /*    glyph_index ::                                                     */\n  /*      The current glyph index.                                         */\n  /*                                                                       */\n  /*    load_flags ::                                                      */\n  /*      The current load flags.                                          */\n  /*                                                                       */\n  /*    stream ::                                                          */\n  /*      The input stream.                                                */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    amap ::                                                            */\n  /*      The target pixmap.                                               */\n  /*                                                                       */\n  /*    ametrics ::                                                        */\n  /*      A big sbit metrics structure for the glyph image.                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.  Returns an error if no     */\n  /*    glyph sbit exists for the index.                                   */\n  /*                                                                       */\n  /*  <Note>                                                               */\n  /*    The `map.buffer' field is always freed before the glyph is loaded. */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Load_SBit_Image_Func)( TT_Face              face,\n                              FT_ULong             strike_index,\n                              FT_UInt              glyph_index,\n                              FT_UInt              load_flags,\n                              FT_Stream            stream,\n                              FT_Bitmap           *amap,\n                              TT_SBit_MetricsRec  *ametrics );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Set_SBit_Strike_Func                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Select an sbit strike for a given size request.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face          :: The target face object.                           */\n  /*                                                                       */\n  /*    req           :: The size request.                                 */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    astrike_index :: The index of the sbit strike.                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.  Returns an error if no     */\n  /*    sbit strike exists for the selected ppem values.                   */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Set_SBit_Strike_Func)( TT_Face          face,\n                              FT_Size_Request  req,\n                              FT_ULong*        astrike_index );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Load_Strike_Metrics_Func                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load the metrics of a given strike.                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face          :: The target face object.                           */\n  /*                                                                       */\n  /*    strike_index  :: The strike index.                                 */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    metrics       :: the metrics of the strike.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.  Returns an error if no     */\n  /*    such sbit strike exists.                                           */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Load_Strike_Metrics_Func)( TT_Face           face,\n                                  FT_ULong          strike_index,\n                                  FT_Size_Metrics*  metrics );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Get_PS_Name_Func                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Get the PostScript glyph name of a glyph.                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    idx  :: The glyph index.                                           */\n  /*                                                                       */\n  /*    PSname :: The address of a string pointer.  Will be NULL in case   */\n  /*              of error, otherwise it is a pointer to the glyph name.   */\n  /*                                                                       */\n  /*              You must not modify the returned string!                 */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Get_PS_Name_Func)( TT_Face      face,\n                          FT_UInt      idx,\n                          FT_String**  PSname );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Load_Metrics_Func                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load a metrics table, which is a table with a horizontal and a     */\n  /*    vertical version.                                                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face     :: A handle to the target face object.                    */\n  /*                                                                       */\n  /*    stream   :: The input stream.                                      */\n  /*                                                                       */\n  /*    vertical :: A boolean flag.  If set, load the vertical one.        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Load_Metrics_Func)( TT_Face    face,\n                           FT_Stream  stream,\n                           FT_Bool    vertical );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Get_Metrics_Func                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load the horizontal or vertical header in a face object.           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face     :: A handle to the target face object.                    */\n  /*                                                                       */\n  /*    stream   :: The input stream.                                      */\n  /*                                                                       */\n  /*    vertical :: A boolean flag.  If set, load vertical metrics.        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Get_Metrics_Func)( TT_Face     face,\n                          FT_Bool     vertical,\n                          FT_UInt     gindex,\n                          FT_Short*   abearing,\n                          FT_UShort*  aadvance );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Load_Table_Func                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load a given TrueType table.                                       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /*    stream :: The input stream.                                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The function uses `face->goto_table' to seek the stream to the     */\n  /*    start of the table, except while loading the font directory.       */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Load_Table_Func)( TT_Face    face,\n                         FT_Stream  stream );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Free_Table_Func                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Free a given TrueType table.                                       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to the target face object.                        */\n  /*                                                                       */\n  typedef void\n  (*TT_Free_Table_Func)( TT_Face  face );\n\n\n  /*\n   * @functype:\n   *    TT_Face_GetKerningFunc\n   *\n   * @description:\n   *    Return the horizontal kerning value between two glyphs.\n   *\n   * @input:\n   *    face        :: A handle to the source face object.\n   *    left_glyph  :: The left glyph index.\n   *    right_glyph :: The right glyph index.\n   *\n   * @return:\n   *    The kerning value in font units.\n   */\n  typedef FT_Int\n  (*TT_Face_GetKerningFunc)( TT_Face  face,\n                             FT_UInt  left_glyph,\n                             FT_UInt  right_glyph );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    SFNT_Interface                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This structure holds pointers to the functions used to load and    */\n  /*    free the basic tables that are required in a `sfnt' font file.     */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    Check the various xxx_Func() descriptions for details.             */\n  /*                                                                       */\n  typedef struct  SFNT_Interface_\n  {\n    TT_Loader_GotoTableFunc      goto_table;\n\n    TT_Init_Face_Func            init_face;\n    TT_Load_Face_Func            load_face;\n    TT_Done_Face_Func            done_face;\n    FT_Module_Requester          get_interface;\n\n    TT_Load_Any_Func             load_any;\n\n    /* these functions are called by `load_face' but they can also  */\n    /* be called from external modules, if there is a need to do so */\n    TT_Load_Table_Func           load_head;\n    TT_Load_Metrics_Func         load_hhea;\n    TT_Load_Table_Func           load_cmap;\n    TT_Load_Table_Func           load_maxp;\n    TT_Load_Table_Func           load_os2;\n    TT_Load_Table_Func           load_post;\n\n    TT_Load_Table_Func           load_name;\n    TT_Free_Table_Func           free_name;\n\n    /* this field was called `load_kerning' up to version 2.1.10 */\n    TT_Load_Table_Func           load_kern;\n\n    TT_Load_Table_Func           load_gasp;\n    TT_Load_Table_Func           load_pclt;\n\n    /* see `ttload.h'; this field was called `load_bitmap_header' up to */\n    /* version 2.1.10                                                   */\n    TT_Load_Table_Func           load_bhed;\n\n    TT_Load_SBit_Image_Func      load_sbit_image;\n\n    /* see `ttpost.h' */\n    TT_Get_PS_Name_Func          get_psname;\n    TT_Free_Table_Func           free_psnames;\n\n    /* starting here, the structure differs from version 2.1.7 */\n\n    /* this field was introduced in version 2.1.8, named `get_psname' */\n    TT_Face_GetKerningFunc       get_kerning;\n\n    /* new elements introduced after version 2.1.10 */\n\n    /* load the font directory, i.e., the offset table and */\n    /* the table directory                                 */\n    TT_Load_Table_Func           load_font_dir;\n    TT_Load_Metrics_Func         load_hmtx;\n\n    TT_Load_Table_Func           load_eblc;\n    TT_Free_Table_Func           free_eblc;\n\n    TT_Set_SBit_Strike_Func      set_sbit_strike;\n    TT_Load_Strike_Metrics_Func  load_strike_metrics;\n\n    TT_Get_Metrics_Func          get_metrics;\n\n  } SFNT_Interface;\n\n\n  /* transitional */\n  typedef SFNT_Interface*   SFNT_Service;\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SFNT_INTERFACE(        \\\n          class_,                        \\\n          goto_table_,                   \\\n          init_face_,                    \\\n          load_face_,                    \\\n          done_face_,                    \\\n          get_interface_,                \\\n          load_any_,                     \\\n          load_head_,                    \\\n          load_hhea_,                    \\\n          load_cmap_,                    \\\n          load_maxp_,                    \\\n          load_os2_,                     \\\n          load_post_,                    \\\n          load_name_,                    \\\n          free_name_,                    \\\n          load_kern_,                    \\\n          load_gasp_,                    \\\n          load_pclt_,                    \\\n          load_bhed_,                    \\\n          load_sbit_image_,              \\\n          get_psname_,                   \\\n          free_psnames_,                 \\\n          get_kerning_,                  \\\n          load_font_dir_,                \\\n          load_hmtx_,                    \\\n          load_eblc_,                    \\\n          free_eblc_,                    \\\n          set_sbit_strike_,              \\\n          load_strike_metrics_,          \\\n          get_metrics_ )                 \\\n  static const SFNT_Interface  class_ =  \\\n  {                                      \\\n    goto_table_,                         \\\n    init_face_,                          \\\n    load_face_,                          \\\n    done_face_,                          \\\n    get_interface_,                      \\\n    load_any_,                           \\\n    load_head_,                          \\\n    load_hhea_,                          \\\n    load_cmap_,                          \\\n    load_maxp_,                          \\\n    load_os2_,                           \\\n    load_post_,                          \\\n    load_name_,                          \\\n    free_name_,                          \\\n    load_kern_,                          \\\n    load_gasp_,                          \\\n    load_pclt_,                          \\\n    load_bhed_,                          \\\n    load_sbit_image_,                    \\\n    get_psname_,                         \\\n    free_psnames_,                       \\\n    get_kerning_,                        \\\n    load_font_dir_,                      \\\n    load_hmtx_,                          \\\n    load_eblc_,                          \\\n    free_eblc_,                          \\\n    set_sbit_strike_,                    \\\n    load_strike_metrics_,                \\\n    get_metrics_,                        \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_INTERNAL( a, a_ )  \\\n          clazz->a = a_;\n\n#define FT_DEFINE_SFNT_INTERFACE(                       \\\n          class_,                                       \\\n          goto_table_,                                  \\\n          init_face_,                                   \\\n          load_face_,                                   \\\n          done_face_,                                   \\\n          get_interface_,                               \\\n          load_any_,                                    \\\n          load_head_,                                   \\\n          load_hhea_,                                   \\\n          load_cmap_,                                   \\\n          load_maxp_,                                   \\\n          load_os2_,                                    \\\n          load_post_,                                   \\\n          load_name_,                                   \\\n          free_name_,                                   \\\n          load_kern_,                                   \\\n          load_gasp_,                                   \\\n          load_pclt_,                                   \\\n          load_bhed_,                                   \\\n          load_sbit_image_,                             \\\n          get_psname_,                                  \\\n          free_psnames_,                                \\\n          get_kerning_,                                 \\\n          load_font_dir_,                               \\\n          load_hmtx_,                                   \\\n          load_eblc_,                                   \\\n          free_eblc_,                                   \\\n          set_sbit_strike_,                             \\\n          load_strike_metrics_,                         \\\n          get_metrics_ )                                \\\n  void                                                  \\\n  FT_Init_Class_ ## class_( FT_Library       library,   \\\n                            SFNT_Interface*  clazz )    \\\n  {                                                     \\\n    FT_UNUSED( library );                               \\\n                                                        \\\n    clazz->goto_table          = goto_table_;           \\\n    clazz->init_face           = init_face_;            \\\n    clazz->load_face           = load_face_;            \\\n    clazz->done_face           = done_face_;            \\\n    clazz->get_interface       = get_interface_;        \\\n    clazz->load_any            = load_any_;             \\\n    clazz->load_head           = load_head_;            \\\n    clazz->load_hhea           = load_hhea_;            \\\n    clazz->load_cmap           = load_cmap_;            \\\n    clazz->load_maxp           = load_maxp_;            \\\n    clazz->load_os2            = load_os2_;             \\\n    clazz->load_post           = load_post_;            \\\n    clazz->load_name           = load_name_;            \\\n    clazz->free_name           = free_name_;            \\\n    clazz->load_kern           = load_kern_;            \\\n    clazz->load_gasp           = load_gasp_;            \\\n    clazz->load_pclt           = load_pclt_;            \\\n    clazz->load_bhed           = load_bhed_;            \\\n    clazz->load_sbit_image     = load_sbit_image_;      \\\n    clazz->get_psname          = get_psname_;           \\\n    clazz->free_psnames        = free_psnames_;         \\\n    clazz->get_kerning         = get_kerning_;          \\\n    clazz->load_font_dir       = load_font_dir_;        \\\n    clazz->load_hmtx           = load_hmtx_;            \\\n    clazz->load_eblc           = load_eblc_;            \\\n    clazz->free_eblc           = free_eblc_;            \\\n    clazz->set_sbit_strike     = set_sbit_strike_;      \\\n    clazz->load_strike_metrics = load_strike_metrics_;  \\\n    clazz->get_metrics         = get_metrics_;          \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\nFT_END_HEADER\n\n#endif /* __SFNT_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/t1types.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1types.h                                                              */\n/*                                                                         */\n/*    Basic Type1/Type2 type definitions and interface (specification      */\n/*    only).                                                               */\n/*                                                                         */\n/*  Copyright 1996-2004, 2006, 2008, 2009, 2011, 2013 by                   */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __T1TYPES_H__\n#define __T1TYPES_H__\n\n\n#include \"../../ft2build.h\"\n#include \"../t1tables.h\"\n#include \"pshints.h\"\n#include \"ftserv.h\"\n#include \"services/svpscmap.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***              REQUIRED TYPE1/TYPE2 TABLES DEFINITIONS              ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    T1_EncodingRec                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure modeling a custom encoding.                            */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    num_chars  :: The number of character codes in the encoding.       */\n  /*                  Usually 256.                                         */\n  /*                                                                       */\n  /*    code_first :: The lowest valid character code in the encoding.     */\n  /*                                                                       */\n  /*    code_last  :: The highest valid character code in the encoding     */\n  /*                  + 1. When equal to code_first there are no valid     */\n  /*                  character codes.                                     */\n  /*                                                                       */\n  /*    char_index :: An array of corresponding glyph indices.             */\n  /*                                                                       */\n  /*    char_name  :: An array of corresponding glyph names.               */\n  /*                                                                       */\n  typedef struct  T1_EncodingRecRec_\n  {\n    FT_Int       num_chars;\n    FT_Int       code_first;\n    FT_Int       code_last;\n\n    FT_UShort*   char_index;\n    FT_String**  char_name;\n\n  } T1_EncodingRec, *T1_Encoding;\n\n\n  /* used to hold extra data of PS_FontInfoRec that\n   * cannot be stored in the publicly defined structure.\n   *\n   * Note these can't be blended with multiple-masters.\n   */\n  typedef struct  PS_FontExtraRec_\n  {\n    FT_UShort  fs_type;\n\n  } PS_FontExtraRec;\n\n\n  typedef struct  T1_FontRec_\n  {\n    PS_FontInfoRec   font_info;         /* font info dictionary   */\n    PS_FontExtraRec  font_extra;        /* font info extra fields */\n    PS_PrivateRec    private_dict;      /* private dictionary     */\n    FT_String*       font_name;         /* top-level dictionary   */\n\n    T1_EncodingType  encoding_type;\n    T1_EncodingRec   encoding;\n\n    FT_Byte*         subrs_block;\n    FT_Byte*         charstrings_block;\n    FT_Byte*         glyph_names_block;\n\n    FT_Int           num_subrs;\n    FT_Byte**        subrs;\n    FT_PtrDist*      subrs_len;\n\n    FT_Int           num_glyphs;\n    FT_String**      glyph_names;       /* array of glyph names       */\n    FT_Byte**        charstrings;       /* array of glyph charstrings */\n    FT_PtrDist*      charstrings_len;\n\n    FT_Byte          paint_type;\n    FT_Byte          font_type;\n    FT_Matrix        font_matrix;\n    FT_Vector        font_offset;\n    FT_BBox          font_bbox;\n    FT_Long          font_id;\n\n    FT_Fixed         stroke_width;\n\n  } T1_FontRec, *T1_Font;\n\n\n  typedef struct  CID_SubrsRec_\n  {\n    FT_UInt    num_subrs;\n    FT_Byte**  code;\n\n  } CID_SubrsRec, *CID_Subrs;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***                AFM FONT INFORMATION STRUCTURES                    ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct  AFM_TrackKernRec_\n  {\n    FT_Int    degree;\n    FT_Fixed  min_ptsize;\n    FT_Fixed  min_kern;\n    FT_Fixed  max_ptsize;\n    FT_Fixed  max_kern;\n\n  } AFM_TrackKernRec, *AFM_TrackKern;\n\n  typedef struct  AFM_KernPairRec_\n  {\n    FT_Int  index1;\n    FT_Int  index2;\n    FT_Int  x;\n    FT_Int  y;\n\n  } AFM_KernPairRec, *AFM_KernPair;\n\n  typedef struct  AFM_FontInfoRec_\n  {\n    FT_Bool        IsCIDFont;\n    FT_BBox        FontBBox;\n    FT_Fixed       Ascender;\n    FT_Fixed       Descender;\n    AFM_TrackKern  TrackKerns;   /* free if non-NULL */\n    FT_Int         NumTrackKern;\n    AFM_KernPair   KernPairs;    /* free if non-NULL */\n    FT_Int         NumKernPair;\n\n  } AFM_FontInfoRec, *AFM_FontInfo;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***                ORIGINAL T1_FACE CLASS DEFINITION                  ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  typedef struct T1_FaceRec_*   T1_Face;\n  typedef struct CID_FaceRec_*  CID_Face;\n\n\n  typedef struct  T1_FaceRec_\n  {\n    FT_FaceRec      root;\n    T1_FontRec      type1;\n    const void*     psnames;\n    const void*     psaux;\n    const void*     afm_data;\n    FT_CharMapRec   charmaprecs[2];\n    FT_CharMap      charmaps[2];\n\n    /* support for Multiple Masters fonts */\n    PS_Blend        blend;\n\n    /* undocumented, optional: indices of subroutines that express      */\n    /* the NormalizeDesignVector and the ConvertDesignVector procedure, */\n    /* respectively, as Type 2 charstrings; -1 if keywords not present  */\n    FT_Int           ndv_idx;\n    FT_Int           cdv_idx;\n\n    /* undocumented, optional: has the same meaning as len_buildchar */\n    /* for Type 2 fonts; manipulated by othersubrs 19, 24, and 25    */\n    FT_UInt          len_buildchar;\n    FT_Long*         buildchar;\n\n    /* since version 2.1 - interface to PostScript hinter */\n    const void*     pshinter;\n\n  } T1_FaceRec;\n\n\n  typedef struct  CID_FaceRec_\n  {\n    FT_FaceRec       root;\n    void*            psnames;\n    void*            psaux;\n    CID_FaceInfoRec  cid;\n    PS_FontExtraRec  font_extra;\n#if 0\n    void*            afm_data;\n#endif\n    CID_Subrs        subrs;\n\n    /* since version 2.1 - interface to PostScript hinter */\n    void*            pshinter;\n\n    /* since version 2.1.8, but was originally positioned after `afm_data' */\n    FT_Byte*         binary_data; /* used if hex data has been converted */\n    FT_Stream        cid_stream;\n\n  } CID_FaceRec;\n\n\nFT_END_HEADER\n\n#endif /* __T1TYPES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/internal/tttypes.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  tttypes.h                                                              */\n/*                                                                         */\n/*    Basic SFNT/TrueType type definitions and interface (specification    */\n/*    only).                                                               */\n/*                                                                         */\n/*  Copyright 1996-2002, 2004-2008, 2012-2013 by                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTTYPES_H__\n#define __TTTYPES_H__\n\n\n#include \"../../ft2build.h\"\n#include \"../tttables.h\"\n#include \"ftobjs.h\"\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n#include \"../ftmm.h\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***             REQUIRED TRUETYPE/OPENTYPE TABLES DEFINITIONS         ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TTC_HeaderRec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    TrueType collection header.  This table contains the offsets of    */\n  /*    the font headers of each distinct TrueType face in the file.       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    tag     :: Must be `ttc ' to indicate a TrueType collection.       */\n  /*                                                                       */\n  /*    version :: The version number.                                     */\n  /*                                                                       */\n  /*    count   :: The number of faces in the collection.  The             */\n  /*               specification says this should be an unsigned long, but */\n  /*               we use a signed long since we need the value -1 for     */\n  /*               specific purposes.                                      */\n  /*                                                                       */\n  /*    offsets :: The offsets of the font headers, one per face.          */\n  /*                                                                       */\n  typedef struct  TTC_HeaderRec_\n  {\n    FT_ULong   tag;\n    FT_Fixed   version;\n    FT_Long    count;\n    FT_ULong*  offsets;\n\n  } TTC_HeaderRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    SFNT_HeaderRec                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    SFNT file format header.                                           */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    format_tag     :: The font format tag.                             */\n  /*                                                                       */\n  /*    num_tables     :: The number of tables in file.                    */\n  /*                                                                       */\n  /*    search_range   :: Must be `16 * (max power of 2 <= num_tables)'.   */\n  /*                                                                       */\n  /*    entry_selector :: Must be log2 of `search_range / 16'.             */\n  /*                                                                       */\n  /*    range_shift    :: Must be `num_tables * 16 - search_range'.        */\n  /*                                                                       */\n  typedef struct  SFNT_HeaderRec_\n  {\n    FT_ULong   format_tag;\n    FT_UShort  num_tables;\n    FT_UShort  search_range;\n    FT_UShort  entry_selector;\n    FT_UShort  range_shift;\n\n    FT_ULong   offset;  /* not in file */\n\n  } SFNT_HeaderRec, *SFNT_Header;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_TableRec                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This structure describes a given table of a TrueType font.         */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    Tag      :: A four-bytes tag describing the table.                 */\n  /*                                                                       */\n  /*    CheckSum :: The table checksum.  This value can be ignored.        */\n  /*                                                                       */\n  /*    Offset   :: The offset of the table from the start of the TrueType */\n  /*                font in its resource.                                  */\n  /*                                                                       */\n  /*    Length   :: The table length (in bytes).                           */\n  /*                                                                       */\n  typedef struct  TT_TableRec_\n  {\n    FT_ULong  Tag;        /*        table type */\n    FT_ULong  CheckSum;   /*    table checksum */\n    FT_ULong  Offset;     /* table file offset */\n    FT_ULong  Length;     /*      table length */\n\n  } TT_TableRec, *TT_Table;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_LongMetricsRec                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure modeling the long metrics of the `hmtx' and `vmtx'     */\n  /*    TrueType tables.  The values are expressed in font units.          */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    advance :: The advance width or height for the glyph.              */\n  /*                                                                       */\n  /*    bearing :: The left-side or top-side bearing for the glyph.        */\n  /*                                                                       */\n  typedef struct  TT_LongMetricsRec_\n  {\n    FT_UShort  advance;\n    FT_Short   bearing;\n\n  } TT_LongMetricsRec, *TT_LongMetrics;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    TT_ShortMetrics                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple type to model the short metrics of the `hmtx' and `vmtx'  */\n  /*    tables.                                                            */\n  /*                                                                       */\n  typedef FT_Short  TT_ShortMetrics;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_NameEntryRec                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure modeling TrueType name records.  Name records are used */\n  /*    to store important strings like family name, style name,           */\n  /*    copyright, etc. in _localized_ versions (i.e., language, encoding, */\n  /*    etc).                                                              */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    platformID   :: The ID of the name's encoding platform.            */\n  /*                                                                       */\n  /*    encodingID   :: The platform-specific ID for the name's encoding.  */\n  /*                                                                       */\n  /*    languageID   :: The platform-specific ID for the name's language.  */\n  /*                                                                       */\n  /*    nameID       :: The ID specifying what kind of name this is.       */\n  /*                                                                       */\n  /*    stringLength :: The length of the string in bytes.                 */\n  /*                                                                       */\n  /*    stringOffset :: The offset to the string in the `name' table.      */\n  /*                                                                       */\n  /*    string       :: A pointer to the string's bytes.  Note that these  */\n  /*                    are usually UTF-16 encoded characters.             */\n  /*                                                                       */\n  typedef struct  TT_NameEntryRec_\n  {\n    FT_UShort  platformID;\n    FT_UShort  encodingID;\n    FT_UShort  languageID;\n    FT_UShort  nameID;\n    FT_UShort  stringLength;\n    FT_ULong   stringOffset;\n\n    /* this last field is not defined in the spec */\n    /* but used by the FreeType engine            */\n\n    FT_Byte*   string;\n\n  } TT_NameEntryRec, *TT_NameEntry;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_NameTableRec                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure modeling the TrueType name table.                      */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    format         :: The format of the name table.                    */\n  /*                                                                       */\n  /*    numNameRecords :: The number of names in table.                    */\n  /*                                                                       */\n  /*    storageOffset  :: The offset of the name table in the `name'       */\n  /*                      TrueType table.                                  */\n  /*                                                                       */\n  /*    names          :: An array of name records.                        */\n  /*                                                                       */\n  /*    stream         :: the file's input stream.                         */\n  /*                                                                       */\n  typedef struct  TT_NameTableRec_\n  {\n    FT_UShort         format;\n    FT_UInt           numNameRecords;\n    FT_UInt           storageOffset;\n    TT_NameEntryRec*  names;\n    FT_Stream         stream;\n\n  } TT_NameTableRec, *TT_NameTable;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***             OPTIONAL TRUETYPE/OPENTYPE TABLES DEFINITIONS         ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_GaspRangeRec                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A tiny structure used to model a gasp range according to the       */\n  /*    TrueType specification.                                            */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    maxPPEM  :: The maximum ppem value to which `gaspFlag' applies.    */\n  /*                                                                       */\n  /*    gaspFlag :: A flag describing the grid-fitting and anti-aliasing   */\n  /*                modes to be used.                                      */\n  /*                                                                       */\n  typedef struct  TT_GaspRangeRec_\n  {\n    FT_UShort  maxPPEM;\n    FT_UShort  gaspFlag;\n\n  } TT_GaspRangeRec, *TT_GaspRange;\n\n\n#define TT_GASP_GRIDFIT  0x01\n#define TT_GASP_DOGRAY   0x02\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_GaspRec                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure modeling the TrueType `gasp' table used to specify     */\n  /*    grid-fitting and anti-aliasing behaviour.                          */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    version    :: The version number.                                  */\n  /*                                                                       */\n  /*    numRanges  :: The number of gasp ranges in table.                  */\n  /*                                                                       */\n  /*    gaspRanges :: An array of gasp ranges.                             */\n  /*                                                                       */\n  typedef struct  TT_Gasp_\n  {\n    FT_UShort     version;\n    FT_UShort     numRanges;\n    TT_GaspRange  gaspRanges;\n\n  } TT_GaspRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***                    EMBEDDED BITMAPS SUPPORT                       ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_SBit_MetricsRec                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to hold the big metrics of a given glyph bitmap   */\n  /*    in a TrueType or OpenType font.  These are usually found in the    */\n  /*    `EBDT' (Microsoft) or `bloc' (Apple) table.                        */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    height       :: The glyph height in pixels.                        */\n  /*                                                                       */\n  /*    width        :: The glyph width in pixels.                         */\n  /*                                                                       */\n  /*    horiBearingX :: The horizontal left bearing.                       */\n  /*                                                                       */\n  /*    horiBearingY :: The horizontal top bearing.                        */\n  /*                                                                       */\n  /*    horiAdvance  :: The horizontal advance.                            */\n  /*                                                                       */\n  /*    vertBearingX :: The vertical left bearing.                         */\n  /*                                                                       */\n  /*    vertBearingY :: The vertical top bearing.                          */\n  /*                                                                       */\n  /*    vertAdvance  :: The vertical advance.                              */\n  /*                                                                       */\n  typedef struct  TT_SBit_MetricsRec_\n  {\n    FT_Byte  height;\n    FT_Byte  width;\n\n    FT_Char  horiBearingX;\n    FT_Char  horiBearingY;\n    FT_Byte  horiAdvance;\n\n    FT_Char  vertBearingX;\n    FT_Char  vertBearingY;\n    FT_Byte  vertAdvance;\n\n  } TT_SBit_MetricsRec, *TT_SBit_Metrics;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_SBit_SmallMetricsRec                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to hold the small metrics of a given glyph bitmap */\n  /*    in a TrueType or OpenType font.  These are usually found in the    */\n  /*    `EBDT' (Microsoft) or the `bdat' (Apple) table.                    */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    height   :: The glyph height in pixels.                            */\n  /*                                                                       */\n  /*    width    :: The glyph width in pixels.                             */\n  /*                                                                       */\n  /*    bearingX :: The left-side bearing.                                 */\n  /*                                                                       */\n  /*    bearingY :: The top-side bearing.                                  */\n  /*                                                                       */\n  /*    advance  :: The advance width or height.                           */\n  /*                                                                       */\n  typedef struct  TT_SBit_Small_Metrics_\n  {\n    FT_Byte  height;\n    FT_Byte  width;\n\n    FT_Char  bearingX;\n    FT_Char  bearingY;\n    FT_Byte  advance;\n\n  } TT_SBit_SmallMetricsRec, *TT_SBit_SmallMetrics;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_SBit_LineMetricsRec                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to describe the text line metrics of a given      */\n  /*    bitmap strike, for either a horizontal or vertical layout.         */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    ascender                :: The ascender in pixels.                 */\n  /*                                                                       */\n  /*    descender               :: The descender in pixels.                */\n  /*                                                                       */\n  /*    max_width               :: The maximum glyph width in pixels.      */\n  /*                                                                       */\n  /*    caret_slope_enumerator  :: Rise of the caret slope, typically set  */\n  /*                               to 1 for non-italic fonts.              */\n  /*                                                                       */\n  /*    caret_slope_denominator :: Rise of the caret slope, typically set  */\n  /*                               to 0 for non-italic fonts.              */\n  /*                                                                       */\n  /*    caret_offset            :: Offset in pixels to move the caret for  */\n  /*                               proper positioning.                     */\n  /*                                                                       */\n  /*    min_origin_SB           :: Minimum of horiBearingX (resp.          */\n  /*                               vertBearingY).                          */\n  /*    min_advance_SB          :: Minimum of                              */\n  /*                                                                       */\n  /*                                 horizontal advance -                  */\n  /*                                   ( horiBearingX + width )            */\n  /*                                                                       */\n  /*                               resp.                                   */\n  /*                                                                       */\n  /*                                 vertical advance -                    */\n  /*                                   ( vertBearingY + height )           */\n  /*                                                                       */\n  /*    max_before_BL           :: Maximum of horiBearingY (resp.          */\n  /*                               vertBearingY).                          */\n  /*                                                                       */\n  /*    min_after_BL            :: Minimum of                              */\n  /*                                                                       */\n  /*                                 horiBearingY - height                 */\n  /*                                                                       */\n  /*                               resp.                                   */\n  /*                                                                       */\n  /*                                 vertBearingX - width                  */\n  /*                                                                       */\n  /*    pads                    :: Unused (to make the size of the record  */\n  /*                               a multiple of 32 bits.                  */\n  /*                                                                       */\n  typedef struct  TT_SBit_LineMetricsRec_\n  {\n    FT_Char  ascender;\n    FT_Char  descender;\n    FT_Byte  max_width;\n    FT_Char  caret_slope_numerator;\n    FT_Char  caret_slope_denominator;\n    FT_Char  caret_offset;\n    FT_Char  min_origin_SB;\n    FT_Char  min_advance_SB;\n    FT_Char  max_before_BL;\n    FT_Char  min_after_BL;\n    FT_Char  pads[2];\n\n  } TT_SBit_LineMetricsRec, *TT_SBit_LineMetrics;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_SBit_RangeRec                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A TrueType/OpenType subIndexTable as defined in the `EBLC'         */\n  /*    (Microsoft) or `bloc' (Apple) tables.                              */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    first_glyph   :: The first glyph index in the range.               */\n  /*                                                                       */\n  /*    last_glyph    :: The last glyph index in the range.                */\n  /*                                                                       */\n  /*    index_format  :: The format of index table.  Valid values are 1    */\n  /*                     to 5.                                             */\n  /*                                                                       */\n  /*    image_format  :: The format of `EBDT' image data.                  */\n  /*                                                                       */\n  /*    image_offset  :: The offset to image data in `EBDT'.               */\n  /*                                                                       */\n  /*    image_size    :: For index formats 2 and 5.  This is the size in   */\n  /*                     bytes of each glyph bitmap.                       */\n  /*                                                                       */\n  /*    big_metrics   :: For index formats 2 and 5.  This is the big       */\n  /*                     metrics for each glyph bitmap.                    */\n  /*                                                                       */\n  /*    num_glyphs    :: For index formats 4 and 5.  This is the number of */\n  /*                     glyphs in the code array.                         */\n  /*                                                                       */\n  /*    glyph_offsets :: For index formats 1 and 3.                        */\n  /*                                                                       */\n  /*    glyph_codes   :: For index formats 4 and 5.                        */\n  /*                                                                       */\n  /*    table_offset  :: The offset of the index table in the `EBLC'       */\n  /*                     table.  Only used during strike loading.          */\n  /*                                                                       */\n  typedef struct  TT_SBit_RangeRec_\n  {\n    FT_UShort           first_glyph;\n    FT_UShort           last_glyph;\n\n    FT_UShort           index_format;\n    FT_UShort           image_format;\n    FT_ULong            image_offset;\n\n    FT_ULong            image_size;\n    TT_SBit_MetricsRec  metrics;\n    FT_ULong            num_glyphs;\n\n    FT_ULong*           glyph_offsets;\n    FT_UShort*          glyph_codes;\n\n    FT_ULong            table_offset;\n\n  } TT_SBit_RangeRec, *TT_SBit_Range;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_SBit_StrikeRec                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used describe a given bitmap strike in the `EBLC'      */\n  /*    (Microsoft) or `bloc' (Apple) tables.                              */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*   num_index_ranges :: The number of index ranges.                     */\n  /*                                                                       */\n  /*   index_ranges     :: An array of glyph index ranges.                 */\n  /*                                                                       */\n  /*   color_ref        :: Unused.  `color_ref' is put in for future       */\n  /*                       enhancements, but these fields are already      */\n  /*                       in use by other platforms (e.g. Newton).        */\n  /*                       For details, please see                         */\n  /*                                                                       */\n  /*                         http://fonts.apple.com/                       */\n  /*                                TTRefMan/RM06/Chap6bloc.html           */\n  /*                                                                       */\n  /*   hori             :: The line metrics for horizontal layouts.        */\n  /*                                                                       */\n  /*   vert             :: The line metrics for vertical layouts.          */\n  /*                                                                       */\n  /*   start_glyph      :: The lowest glyph index for this strike.         */\n  /*                                                                       */\n  /*   end_glyph        :: The highest glyph index for this strike.        */\n  /*                                                                       */\n  /*   x_ppem           :: The number of horizontal pixels per EM.         */\n  /*                                                                       */\n  /*   y_ppem           :: The number of vertical pixels per EM.           */\n  /*                                                                       */\n  /*   bit_depth        :: The bit depth.  Valid values are 1, 2, 4,       */\n  /*                       and 8.                                          */\n  /*                                                                       */\n  /*   flags            :: Is this a vertical or horizontal strike?  For   */\n  /*                       details, please see                             */\n  /*                                                                       */\n  /*                         http://fonts.apple.com/                       */\n  /*                                TTRefMan/RM06/Chap6bloc.html           */\n  /*                                                                       */\n  typedef struct  TT_SBit_StrikeRec_\n  {\n    FT_Int                  num_ranges;\n    TT_SBit_Range           sbit_ranges;\n    FT_ULong                ranges_offset;\n\n    FT_ULong                color_ref;\n\n    TT_SBit_LineMetricsRec  hori;\n    TT_SBit_LineMetricsRec  vert;\n\n    FT_UShort               start_glyph;\n    FT_UShort               end_glyph;\n\n    FT_Byte                 x_ppem;\n    FT_Byte                 y_ppem;\n\n    FT_Byte                 bit_depth;\n    FT_Char                 flags;\n\n  } TT_SBit_StrikeRec, *TT_SBit_Strike;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_SBit_ComponentRec                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple structure to describe a compound sbit element.            */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    glyph_code :: The element's glyph index.                           */\n  /*                                                                       */\n  /*    x_offset   :: The element's left bearing.                          */\n  /*                                                                       */\n  /*    y_offset   :: The element's top bearing.                           */\n  /*                                                                       */\n  typedef struct  TT_SBit_ComponentRec_\n  {\n    FT_UShort  glyph_code;\n    FT_Char    x_offset;\n    FT_Char    y_offset;\n\n  } TT_SBit_ComponentRec, *TT_SBit_Component;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_SBit_ScaleRec                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used describe a given bitmap scaling table, as defined */\n  /*    in the `EBSC' table.                                               */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    hori              :: The horizontal line metrics.                  */\n  /*                                                                       */\n  /*    vert              :: The vertical line metrics.                    */\n  /*                                                                       */\n  /*    x_ppem            :: The number of horizontal pixels per EM.       */\n  /*                                                                       */\n  /*    y_ppem            :: The number of vertical pixels per EM.         */\n  /*                                                                       */\n  /*    x_ppem_substitute :: Substitution x_ppem value.                    */\n  /*                                                                       */\n  /*    y_ppem_substitute :: Substitution y_ppem value.                    */\n  /*                                                                       */\n  typedef struct  TT_SBit_ScaleRec_\n  {\n    TT_SBit_LineMetricsRec  hori;\n    TT_SBit_LineMetricsRec  vert;\n\n    FT_Byte                 x_ppem;\n    FT_Byte                 y_ppem;\n\n    FT_Byte                 x_ppem_substitute;\n    FT_Byte                 y_ppem_substitute;\n\n  } TT_SBit_ScaleRec, *TT_SBit_Scale;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***                  POSTSCRIPT GLYPH NAMES SUPPORT                   ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_Post_20Rec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Postscript names sub-table, format 2.0.  Stores the PS name of     */\n  /*    each glyph in the font face.                                       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    num_glyphs    :: The number of named glyphs in the table.          */\n  /*                                                                       */\n  /*    num_names     :: The number of PS names stored in the table.       */\n  /*                                                                       */\n  /*    glyph_indices :: The indices of the glyphs in the names arrays.    */\n  /*                                                                       */\n  /*    glyph_names   :: The PS names not in Mac Encoding.                 */\n  /*                                                                       */\n  typedef struct  TT_Post_20Rec_\n  {\n    FT_UShort   num_glyphs;\n    FT_UShort   num_names;\n    FT_UShort*  glyph_indices;\n    FT_Char**   glyph_names;\n\n  } TT_Post_20Rec, *TT_Post_20;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_Post_25Rec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Postscript names sub-table, format 2.5.  Stores the PS name of     */\n  /*    each glyph in the font face.                                       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    num_glyphs :: The number of glyphs in the table.                   */\n  /*                                                                       */\n  /*    offsets    :: An array of signed offsets in a normal Mac           */\n  /*                  Postscript name encoding.                            */\n  /*                                                                       */\n  typedef struct  TT_Post_25_\n  {\n    FT_UShort  num_glyphs;\n    FT_Char*   offsets;\n\n  } TT_Post_25Rec, *TT_Post_25;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_Post_NamesRec                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Postscript names table, either format 2.0 or 2.5.                  */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    loaded    :: A flag to indicate whether the PS names are loaded.   */\n  /*                                                                       */\n  /*    format_20 :: The sub-table used for format 2.0.                    */\n  /*                                                                       */\n  /*    format_25 :: The sub-table used for format 2.5.                    */\n  /*                                                                       */\n  typedef struct  TT_Post_NamesRec_\n  {\n    FT_Bool  loaded;\n\n    union\n    {\n      TT_Post_20Rec  format_20;\n      TT_Post_25Rec  format_25;\n\n    } names;\n\n  } TT_Post_NamesRec, *TT_Post_Names;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***                    GX VARIATION TABLE SUPPORT                     ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n  typedef struct GX_BlendRec_  *GX_Blend;\n#endif\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***              EMBEDDED BDF PROPERTIES TABLE SUPPORT                ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*\n   * These types are used to support a `BDF ' table that isn't part of the\n   * official TrueType specification.  It is mainly used in SFNT-based\n   * bitmap fonts that were generated from a set of BDF fonts.\n   *\n   * The format of the table is as follows.\n   *\n   *   USHORT   version      `BDF ' table version number, should be 0x0001.\n   *   USHORT   strikeCount  Number of strikes (bitmap sizes) in this table.\n   *   ULONG    stringTable  Offset (from start of BDF table) to string\n   *                         table.\n   *\n   * This is followed by an array of `strikeCount' descriptors, having the\n   * following format.\n   *\n   *   USHORT   ppem         Vertical pixels per EM for this strike.\n   *   USHORT   numItems     Number of items for this strike (properties and\n   *                         atoms).  Maximum is 255.\n   *\n   * This array in turn is followed by `strikeCount' value sets.  Each\n   * `value set' is an array of `numItems' items with the following format.\n   *\n   *   ULONG    item_name    Offset in string table to item name.\n   *   USHORT   item_type    The item type.  Possible values are\n   *                            0 => string (e.g., COMMENT)\n   *                            1 => atom   (e.g., FONT or even SIZE)\n   *                            2 => int32\n   *                            3 => uint32\n   *                         0x10 => A flag to indicate a properties.  This\n   *                                 is ORed with the above values.\n   *   ULONG    item_value   For strings  => Offset into string table without\n   *                                         the corresponding double quotes.\n   *                         For atoms    => Offset into string table.\n   *                         For integers => Direct value.\n   *\n   * All strings in the string table consist of bytes and are\n   * zero-terminated.\n   *\n   */\n\n#ifdef TT_CONFIG_OPTION_BDF\n\n  typedef struct  TT_BDFRec_\n  {\n    FT_Byte*   table;\n    FT_Byte*   table_end;\n    FT_Byte*   strings;\n    FT_ULong   strings_size;\n    FT_UInt    num_strikes;\n    FT_Bool    loaded;\n\n  } TT_BDFRec, *TT_BDF;\n\n#endif /* TT_CONFIG_OPTION_BDF */\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***                  ORIGINAL TT_FACE CLASS DEFINITION                ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This structure/class is defined here because it is common to the      */\n  /* following formats: TTF, OpenType-TT, and OpenType-CFF.                */\n  /*                                                                       */\n  /* Note, however, that the classes TT_Size and TT_GlyphSlot are not      */\n  /* shared between font drivers, and are thus defined in `ttobjs.h'.      */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    TT_Face                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a TrueType face/font object.  A TT_Face encapsulates   */\n  /*    the resolution and scaling independent parts of a TrueType font    */\n  /*    resource.                                                          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The TT_Face structure is also used as a `parent class' for the     */\n  /*    OpenType-CFF class (T2_Face).                                      */\n  /*                                                                       */\n  typedef struct TT_FaceRec_*  TT_Face;\n\n\n  /* a function type used for the truetype bytecode interpreter hooks */\n  typedef FT_Error\n  (*TT_Interpreter)( void*  exec_context );\n\n  /* forward declaration */\n  typedef struct TT_LoaderRec_*  TT_Loader;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Loader_GotoTableFunc                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Seeks a stream to the start of a given TrueType table.             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /*    tag    :: A 4-byte tag used to name the table.                     */\n  /*                                                                       */\n  /*    stream :: The input stream.                                        */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    length :: The length of the table in bytes.  Set to 0 if not       */\n  /*              needed.                                                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The stream cursor must be at the font file's origin.               */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Loader_GotoTableFunc)( TT_Face    face,\n                              FT_ULong   tag,\n                              FT_Stream  stream,\n                              FT_ULong*  length );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Loader_StartGlyphFunc                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Seeks a stream to the start of a given glyph element, and opens a  */\n  /*    frame for it.                                                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    loader      :: The current TrueType glyph loader object.           */\n  /*                                                                       */\n  /*    glyph index :: The index of the glyph to access.                   */\n  /*                                                                       */\n  /*    offset      :: The offset of the glyph according to the            */\n  /*                   `locations' table.                                  */\n  /*                                                                       */\n  /*    byte_count  :: The size of the frame in bytes.                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function is normally equivalent to FT_STREAM_SEEK(offset)     */\n  /*    followed by FT_FRAME_ENTER(byte_count) with the loader's stream,   */\n  /*    but alternative formats (e.g. compressed ones) might use something */\n  /*    different.                                                         */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Loader_StartGlyphFunc)( TT_Loader  loader,\n                               FT_UInt    glyph_index,\n                               FT_ULong   offset,\n                               FT_UInt    byte_count );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Loader_ReadGlyphFunc                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Reads one glyph element (its header, a simple glyph, or a          */\n  /*    composite) from the loader's current stream frame.                 */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    loader :: The current TrueType glyph loader object.                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Loader_ReadGlyphFunc)( TT_Loader  loader );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Loader_EndGlyphFunc                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Closes the current loader stream frame for the glyph.              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    loader :: The current TrueType glyph loader object.                */\n  /*                                                                       */\n  typedef void\n  (*TT_Loader_EndGlyphFunc)( TT_Loader  loader );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                         TrueType Face Type                            */\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_Face                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The TrueType face class.  These objects model the resolution and   */\n  /*    point-size independent data found in a TrueType font file.         */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    root                 :: The base FT_Face structure, managed by the */\n  /*                            base layer.                                */\n  /*                                                                       */\n  /*    ttc_header           :: The TrueType collection header, used when  */\n  /*                            the file is a `ttc' rather than a `ttf'.   */\n  /*                            For ordinary font files, the field         */\n  /*                            `ttc_header.count' is set to 0.            */\n  /*                                                                       */\n  /*    format_tag           :: The font format tag.                       */\n  /*                                                                       */\n  /*    num_tables           :: The number of TrueType tables in this font */\n  /*                            file.                                      */\n  /*                                                                       */\n  /*    dir_tables           :: The directory of TrueType tables for this  */\n  /*                            font file.                                 */\n  /*                                                                       */\n  /*    header               :: The font's font header (`head' table).     */\n  /*                            Read on font opening.                      */\n  /*                                                                       */\n  /*    horizontal           :: The font's horizontal header (`hhea'       */\n  /*                            table).  This field also contains the      */\n  /*                            associated horizontal metrics table        */\n  /*                            (`hmtx').                                  */\n  /*                                                                       */\n  /*    max_profile          :: The font's maximum profile table.  Read on */\n  /*                            font opening.  Note that some maximum      */\n  /*                            values cannot be taken directly from this  */\n  /*                            table.  We thus define additional fields   */\n  /*                            below to hold the computed maxima.         */\n  /*                                                                       */\n  /*    vertical_info        :: A boolean which is set when the font file  */\n  /*                            contains vertical metrics.  If not, the    */\n  /*                            value of the `vertical' field is           */\n  /*                            undefined.                                 */\n  /*                                                                       */\n  /*    vertical             :: The font's vertical header (`vhea' table). */\n  /*                            This field also contains the associated    */\n  /*                            vertical metrics table (`vmtx'), if found. */\n  /*                            IMPORTANT: The contents of this field is   */\n  /*                            undefined if the `verticalInfo' field is   */\n  /*                            unset.                                     */\n  /*                                                                       */\n  /*    num_names            :: The number of name records within this     */\n  /*                            TrueType font.                             */\n  /*                                                                       */\n  /*    name_table           :: The table of name records (`name').        */\n  /*                                                                       */\n  /*    os2                  :: The font's OS/2 table (`OS/2').            */\n  /*                                                                       */\n  /*    postscript           :: The font's PostScript table (`post'        */\n  /*                            table).  The PostScript glyph names are    */\n  /*                            not loaded by the driver on face opening.  */\n  /*                            See the `ttpost' module for more details.  */\n  /*                                                                       */\n  /*    cmap_table           :: Address of the face's `cmap' SFNT table    */\n  /*                            in memory (it's an extracted frame).       */\n  /*                                                                       */\n  /*    cmap_size            :: The size in bytes of the `cmap_table'      */\n  /*                            described above.                           */\n  /*                                                                       */\n  /*    goto_table           :: A function called by each TrueType table   */\n  /*                            loader to position a stream's cursor to    */\n  /*                            the start of a given table according to    */\n  /*                            its tag.  It defaults to TT_Goto_Face but  */\n  /*                            can be different for strange formats (e.g. */\n  /*                            Type 42).                                  */\n  /*                                                                       */\n  /*    access_glyph_frame   :: A function used to access the frame of a   */\n  /*                            given glyph within the face's font file.   */\n  /*                                                                       */\n  /*    forget_glyph_frame   :: A function used to forget the frame of a   */\n  /*                            given glyph when all data has been loaded. */\n  /*                                                                       */\n  /*    read_glyph_header    :: A function used to read a glyph header.    */\n  /*                            It must be called between an `access' and  */\n  /*                            `forget'.                                  */\n  /*                                                                       */\n  /*    read_simple_glyph    :: A function used to read a simple glyph.    */\n  /*                            It must be called after the header was     */\n  /*                            read, and before the `forget'.             */\n  /*                                                                       */\n  /*    read_composite_glyph :: A function used to read a composite glyph. */\n  /*                            It must be called after the header was     */\n  /*                            read, and before the `forget'.             */\n  /*                                                                       */\n  /*    sfnt                 :: A pointer to the SFNT service.             */\n  /*                                                                       */\n  /*    psnames              :: A pointer to the PostScript names service. */\n  /*                                                                       */\n  /*    hdmx                 :: The face's horizontal device metrics       */\n  /*                            (`hdmx' table).  This table is optional in */\n  /*                            TrueType/OpenType fonts.                   */\n  /*                                                                       */\n  /*    gasp                 :: The grid-fitting and scaling properties    */\n  /*                            table (`gasp').  This table is optional in */\n  /*                            TrueType/OpenType fonts.                   */\n  /*                                                                       */\n  /*    pclt                 :: The `pclt' SFNT table.                     */\n  /*                                                                       */\n  /*    num_sbit_strikes     :: The number of sbit strikes, i.e., bitmap   */\n  /*                            sizes, embedded in this font.              */\n  /*                                                                       */\n  /*    sbit_strikes         :: An array of sbit strikes embedded in this  */\n  /*                            font.  This table is optional in a         */\n  /*                            TrueType/OpenType font.                    */\n  /*                                                                       */\n  /*    num_sbit_scales      :: The number of sbit scales for this font.   */\n  /*                                                                       */\n  /*    sbit_scales          :: Array of sbit scales embedded in this      */\n  /*                            font.  This table is optional in a         */\n  /*                            TrueType/OpenType font.                    */\n  /*                                                                       */\n  /*    postscript_names     :: A table used to store the Postscript names */\n  /*                            of  the glyphs for this font.  See the     */\n  /*                            file  `ttconfig.h' for comments on the     */\n  /*                            TT_CONFIG_OPTION_POSTSCRIPT_NAMES option.  */\n  /*                                                                       */\n  /*    num_locations        :: The number of glyph locations in this      */\n  /*                            TrueType file.  This should be             */\n  /*                            identical to the number of glyphs.         */\n  /*                            Ignored for Type 2 fonts.                  */\n  /*                                                                       */\n  /*    glyph_locations      :: An array of longs.  These are offsets to   */\n  /*                            glyph data within the `glyf' table.        */\n  /*                            Ignored for Type 2 font faces.             */\n  /*                                                                       */\n  /*    glyf_len             :: The length of the `glyf' table.  Needed    */\n  /*                            for malformed `loca' tables.               */\n  /*                                                                       */\n  /*    font_program_size    :: Size in bytecodes of the face's font       */\n  /*                            program.  0 if none defined.  Ignored for  */\n  /*                            Type 2 fonts.                              */\n  /*                                                                       */\n  /*    font_program         :: The face's font program (bytecode stream)  */\n  /*                            executed at load time, also used during    */\n  /*                            glyph rendering.  Comes from the `fpgm'    */\n  /*                            table.  Ignored for Type 2 font fonts.     */\n  /*                                                                       */\n  /*    cvt_program_size     :: The size in bytecodes of the face's cvt    */\n  /*                            program.  Ignored for Type 2 fonts.        */\n  /*                                                                       */\n  /*    cvt_program          :: The face's cvt program (bytecode stream)   */\n  /*                            executed each time an instance/size is     */\n  /*                            changed/reset.  Comes from the `prep'      */\n  /*                            table.  Ignored for Type 2 fonts.          */\n  /*                                                                       */\n  /*    cvt_size             :: Size of the control value table (in        */\n  /*                            entries).   Ignored for Type 2 fonts.      */\n  /*                                                                       */\n  /*    cvt                  :: The face's original control value table.   */\n  /*                            Coordinates are expressed in unscaled font */\n  /*                            units.  Comes from the `cvt ' table.       */\n  /*                            Ignored for Type 2 fonts.                  */\n  /*                                                                       */\n  /*    num_kern_pairs       :: The number of kerning pairs present in the */\n  /*                            font file.  The engine only loads the      */\n  /*                            first horizontal format 0 kern table it    */\n  /*                            finds in the font file.  Ignored for       */\n  /*                            Type 2 fonts.                              */\n  /*                                                                       */\n  /*    kern_table_index     :: The index of the kerning table in the font */\n  /*                            kerning directory.  Ignored for Type 2     */\n  /*                            fonts.                                     */\n  /*                                                                       */\n  /*    interpreter          :: A pointer to the TrueType bytecode         */\n  /*                            interpreters field is also used to hook    */\n  /*                            the debugger in `ttdebug'.                 */\n  /*                                                                       */\n  /*    unpatented_hinting   :: If true, use only unpatented methods in    */\n  /*                            the bytecode interpreter.                  */\n  /*                                                                       */\n  /*    doblend              :: A boolean which is set if the font should  */\n  /*                            be blended (this is for GX var).           */\n  /*                                                                       */\n  /*    blend                :: Contains the data needed to control GX     */\n  /*                            variation tables (rather like Multiple     */\n  /*                            Master data).                              */\n  /*                                                                       */\n  /*    extra                :: Reserved for third-party font drivers.     */\n  /*                                                                       */\n  /*    postscript_name      :: The PS name of the font.  Used by the      */\n  /*                            postscript name service.                   */\n  /*                                                                       */\n  typedef struct  TT_FaceRec_\n  {\n    FT_FaceRec            root;\n\n    TTC_HeaderRec         ttc_header;\n\n    FT_ULong              format_tag;\n    FT_UShort             num_tables;\n    TT_Table              dir_tables;\n\n    TT_Header             header;       /* TrueType header table          */\n    TT_HoriHeader         horizontal;   /* TrueType horizontal header     */\n\n    TT_MaxProfile         max_profile;\n\n    FT_Bool               vertical_info;\n    TT_VertHeader         vertical;     /* TT Vertical header, if present */\n\n    FT_UShort             num_names;    /* number of name records  */\n    TT_NameTableRec       name_table;   /* name table              */\n\n    TT_OS2                os2;          /* TrueType OS/2 table            */\n    TT_Postscript         postscript;   /* TrueType Postscript table      */\n\n    FT_Byte*              cmap_table;   /* extracted `cmap' table */\n    FT_ULong              cmap_size;\n\n    TT_Loader_GotoTableFunc   goto_table;\n\n    TT_Loader_StartGlyphFunc  access_glyph_frame;\n    TT_Loader_EndGlyphFunc    forget_glyph_frame;\n    TT_Loader_ReadGlyphFunc   read_glyph_header;\n    TT_Loader_ReadGlyphFunc   read_simple_glyph;\n    TT_Loader_ReadGlyphFunc   read_composite_glyph;\n\n    /* a typeless pointer to the SFNT_Interface table used to load */\n    /* the basic TrueType tables in the face object                */\n    void*                 sfnt;\n\n    /* a typeless pointer to the FT_Service_PsCMapsRec table used to */\n    /* handle glyph names <-> unicode & Mac values                   */\n    void*                 psnames;\n\n\n    /***********************************************************************/\n    /*                                                                     */\n    /* Optional TrueType/OpenType tables                                   */\n    /*                                                                     */\n    /***********************************************************************/\n\n    /* grid-fitting and scaling table */\n    TT_GaspRec            gasp;                 /* the `gasp' table */\n\n    /* PCL 5 table */\n    TT_PCLT               pclt;\n\n    /* embedded bitmaps support */\n    FT_ULong              num_sbit_scales;\n    TT_SBit_Scale         sbit_scales;\n\n    /* postscript names table */\n    TT_Post_NamesRec      postscript_names;\n\n\n    /***********************************************************************/\n    /*                                                                     */\n    /* TrueType-specific fields (ignored by the OTF-Type2 driver)          */\n    /*                                                                     */\n    /***********************************************************************/\n\n    /* the font program, if any */\n    FT_ULong              font_program_size;\n    FT_Byte*              font_program;\n\n    /* the cvt program, if any */\n    FT_ULong              cvt_program_size;\n    FT_Byte*              cvt_program;\n\n    /* the original, unscaled, control value table */\n    FT_ULong              cvt_size;\n    FT_Short*             cvt;\n\n    /* A pointer to the bytecode interpreter to use.  This is also */\n    /* used to hook the debugger for the `ttdebug' utility.        */\n    TT_Interpreter        interpreter;\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    /* Use unpatented hinting only. */\n    FT_Bool               unpatented_hinting;\n#endif\n\n    /***********************************************************************/\n    /*                                                                     */\n    /* Other tables or fields. This is used by derivative formats like     */\n    /* OpenType.                                                           */\n    /*                                                                     */\n    /***********************************************************************/\n\n    FT_Generic            extra;\n\n    const char*           postscript_name;\n\n    FT_ULong              glyf_len;\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n    FT_Bool               doblend;\n    GX_Blend              blend;\n#endif\n\n    /* since version 2.2 */\n\n    FT_Byte*              horz_metrics;\n    FT_ULong              horz_metrics_size;\n\n    FT_Byte*              vert_metrics;\n    FT_ULong              vert_metrics_size;\n\n    FT_ULong              num_locations; /* in broken TTF, gid > 0xFFFF */\n    FT_Byte*              glyph_locations;\n\n    FT_Byte*              hdmx_table;\n    FT_ULong              hdmx_table_size;\n    FT_UInt               hdmx_record_count;\n    FT_ULong              hdmx_record_size;\n    FT_Byte*              hdmx_record_sizes;\n\n    FT_Byte*              sbit_table;\n    FT_ULong              sbit_table_size;\n    FT_UInt               sbit_num_strikes;\n\n    FT_Byte*              kern_table;\n    FT_ULong              kern_table_size;\n    FT_UInt               num_kern_tables;\n    FT_UInt32             kern_avail_bits;\n    FT_UInt32             kern_order_bits;\n\n#ifdef TT_CONFIG_OPTION_BDF\n    TT_BDFRec             bdf;\n#endif /* TT_CONFIG_OPTION_BDF */\n\n    /* since 2.3.0 */\n    FT_ULong              horz_metrics_offset;\n    FT_ULong              vert_metrics_offset;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    /* since 2.4.12 */\n    FT_ULong              sph_found_func_flags; /* special functions found */\n                                                /* for this face           */\n    FT_Bool               sph_compatibility_mode;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n  } TT_FaceRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  <Struct>                                                             */\n  /*     TT_GlyphZoneRec                                                   */\n  /*                                                                       */\n  /*  <Description>                                                        */\n  /*     A glyph zone is used to load, scale and hint glyph outline        */\n  /*     coordinates.                                                      */\n  /*                                                                       */\n  /*  <Fields>                                                             */\n  /*     memory       :: A handle to the memory manager.                   */\n  /*                                                                       */\n  /*     max_points   :: The maximum size in points of the zone.           */\n  /*                                                                       */\n  /*     max_contours :: Max size in links contours of the zone.           */\n  /*                                                                       */\n  /*     n_points     :: The current number of points in the zone.         */\n  /*                                                                       */\n  /*     n_contours   :: The current number of contours in the zone.       */\n  /*                                                                       */\n  /*     org          :: The original glyph coordinates (font              */\n  /*                     units/scaled).                                    */\n  /*                                                                       */\n  /*     cur          :: The current glyph coordinates (scaled/hinted).    */\n  /*                                                                       */\n  /*     tags         :: The point control tags.                           */\n  /*                                                                       */\n  /*     contours     :: The contours end points.                          */\n  /*                                                                       */\n  /*     first_point  :: Offset of the current subglyph's first point.     */\n  /*                                                                       */\n  typedef struct  TT_GlyphZoneRec_\n  {\n    FT_Memory   memory;\n    FT_UShort   max_points;\n    FT_UShort   max_contours;\n    FT_UShort   n_points;    /* number of points in zone    */\n    FT_Short    n_contours;  /* number of contours          */\n\n    FT_Vector*  org;         /* original point coordinates  */\n    FT_Vector*  cur;         /* current point coordinates   */\n    FT_Vector*  orus;        /* original (unscaled) point coordinates */\n\n    FT_Byte*    tags;        /* current touch flags         */\n    FT_UShort*  contours;    /* contour end points          */\n\n    FT_UShort   first_point; /* offset of first (#0) point  */\n\n  } TT_GlyphZoneRec, *TT_GlyphZone;\n\n\n  /* handle to execution context */\n  typedef struct TT_ExecContextRec_*  TT_ExecContext;\n\n  /* glyph loader structure */\n  typedef struct  TT_LoaderRec_\n  {\n    FT_Face          face;\n    FT_Size          size;\n    FT_GlyphSlot     glyph;\n    FT_GlyphLoader   gloader;\n\n    FT_ULong         load_flags;\n    FT_UInt          glyph_index;\n\n    FT_Stream        stream;\n    FT_Int           byte_len;\n\n    FT_Short         n_contours;\n    FT_BBox          bbox;\n    FT_Int           left_bearing;\n    FT_Int           advance;\n    FT_Int           linear;\n    FT_Bool          linear_def;\n    FT_Bool          preserve_pps;\n    FT_Vector        pp1;\n    FT_Vector        pp2;\n\n    FT_ULong         glyf_offset;\n\n    /* the zone where we load our glyphs */\n    TT_GlyphZoneRec  base;\n    TT_GlyphZoneRec  zone;\n\n    TT_ExecContext   exec;\n    FT_Byte*         instructions;\n    FT_ULong         ins_pos;\n\n    /* for possible extensibility in other formats */\n    void*            other;\n\n    /* since version 2.1.8 */\n    FT_Int           top_bearing;\n    FT_Int           vadvance;\n    FT_Vector        pp3;\n    FT_Vector        pp4;\n\n    /* since version 2.2.1 */\n    FT_Byte*         cursor;\n    FT_Byte*         limit;\n\n  } TT_LoaderRec;\n\n\nFT_END_HEADER\n\n#endif /* __TTTYPES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/t1tables.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1tables.h                                                             */\n/*                                                                         */\n/*    Basic Type 1/Type 2 tables definitions and interface (specification  */\n/*    only).                                                               */\n/*                                                                         */\n/*  Copyright 1996-2004, 2006, 2008, 2009, 2011 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __T1TABLES_H__\n#define __T1TABLES_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    type1_tables                                                       */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Type 1 Tables                                                      */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Type~1 (PostScript) specific font tables.                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the definition of Type 1-specific tables,    */\n  /*    including structures related to other PostScript font formats.     */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* Note that we separate font data in PS_FontInfoRec and PS_PrivateRec */\n  /* structures in order to support Multiple Master fonts.               */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    PS_FontInfoRec                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a Type~1 or Type~2 FontInfo dictionary.  */\n  /*    Note that for Multiple Master fonts, each instance has its own     */\n  /*    FontInfo dictionary.                                               */\n  /*                                                                       */\n  typedef struct  PS_FontInfoRec_\n  {\n    FT_String*  version;\n    FT_String*  notice;\n    FT_String*  full_name;\n    FT_String*  family_name;\n    FT_String*  weight;\n    FT_Long     italic_angle;\n    FT_Bool     is_fixed_pitch;\n    FT_Short    underline_position;\n    FT_UShort   underline_thickness;\n\n  } PS_FontInfoRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    PS_FontInfo                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a @PS_FontInfoRec structure.                           */\n  /*                                                                       */\n  typedef struct PS_FontInfoRec_*  PS_FontInfo;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    T1_FontInfo                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This type is equivalent to @PS_FontInfoRec.  It is deprecated but  */\n  /*    kept to maintain source compatibility between various versions of  */\n  /*    FreeType.                                                          */\n  /*                                                                       */\n  typedef PS_FontInfoRec  T1_FontInfo;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    PS_PrivateRec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a Type~1 or Type~2 private dictionary.   */\n  /*    Note that for Multiple Master fonts, each instance has its own     */\n  /*    Private dictionary.                                                */\n  /*                                                                       */\n  typedef struct  PS_PrivateRec_\n  {\n    FT_Int     unique_id;\n    FT_Int     lenIV;\n\n    FT_Byte    num_blue_values;\n    FT_Byte    num_other_blues;\n    FT_Byte    num_family_blues;\n    FT_Byte    num_family_other_blues;\n\n    FT_Short   blue_values[14];\n    FT_Short   other_blues[10];\n\n    FT_Short   family_blues      [14];\n    FT_Short   family_other_blues[10];\n\n    FT_Fixed   blue_scale;\n    FT_Int     blue_shift;\n    FT_Int     blue_fuzz;\n\n    FT_UShort  standard_width[1];\n    FT_UShort  standard_height[1];\n\n    FT_Byte    num_snap_widths;\n    FT_Byte    num_snap_heights;\n    FT_Bool    force_bold;\n    FT_Bool    round_stem_up;\n\n    FT_Short   snap_widths [13];  /* including std width  */\n    FT_Short   snap_heights[13];  /* including std height */\n\n    FT_Fixed   expansion_factor;\n\n    FT_Long    language_group;\n    FT_Long    password;\n\n    FT_Short   min_feature[2];\n\n  } PS_PrivateRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    PS_Private                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a @PS_PrivateRec structure.                            */\n  /*                                                                       */\n  typedef struct PS_PrivateRec_*  PS_Private;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    T1_Private                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*   This type is equivalent to @PS_PrivateRec.  It is deprecated but    */\n  /*   kept to maintain source compatibility between various versions of   */\n  /*   FreeType.                                                           */\n  /*                                                                       */\n  typedef PS_PrivateRec  T1_Private;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    T1_Blend_Flags                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A set of flags used to indicate which fields are present in a      */\n  /*    given blend dictionary (font info or private).  Used to support    */\n  /*    Multiple Masters fonts.                                            */\n  /*                                                                       */\n  typedef enum  T1_Blend_Flags_\n  {\n    /*# required fields in a FontInfo blend dictionary */\n    T1_BLEND_UNDERLINE_POSITION = 0,\n    T1_BLEND_UNDERLINE_THICKNESS,\n    T1_BLEND_ITALIC_ANGLE,\n\n    /*# required fields in a Private blend dictionary */\n    T1_BLEND_BLUE_VALUES,\n    T1_BLEND_OTHER_BLUES,\n    T1_BLEND_STANDARD_WIDTH,\n    T1_BLEND_STANDARD_HEIGHT,\n    T1_BLEND_STEM_SNAP_WIDTHS,\n    T1_BLEND_STEM_SNAP_HEIGHTS,\n    T1_BLEND_BLUE_SCALE,\n    T1_BLEND_BLUE_SHIFT,\n    T1_BLEND_FAMILY_BLUES,\n    T1_BLEND_FAMILY_OTHER_BLUES,\n    T1_BLEND_FORCE_BOLD,\n\n    /*# never remove */\n    T1_BLEND_MAX\n\n  } T1_Blend_Flags;\n\n  /* */\n\n\n  /*# backwards compatible definitions */\n#define t1_blend_underline_position   T1_BLEND_UNDERLINE_POSITION\n#define t1_blend_underline_thickness  T1_BLEND_UNDERLINE_THICKNESS\n#define t1_blend_italic_angle         T1_BLEND_ITALIC_ANGLE\n#define t1_blend_blue_values          T1_BLEND_BLUE_VALUES\n#define t1_blend_other_blues          T1_BLEND_OTHER_BLUES\n#define t1_blend_standard_widths      T1_BLEND_STANDARD_WIDTH\n#define t1_blend_standard_height      T1_BLEND_STANDARD_HEIGHT\n#define t1_blend_stem_snap_widths     T1_BLEND_STEM_SNAP_WIDTHS\n#define t1_blend_stem_snap_heights    T1_BLEND_STEM_SNAP_HEIGHTS\n#define t1_blend_blue_scale           T1_BLEND_BLUE_SCALE\n#define t1_blend_blue_shift           T1_BLEND_BLUE_SHIFT\n#define t1_blend_family_blues         T1_BLEND_FAMILY_BLUES\n#define t1_blend_family_other_blues   T1_BLEND_FAMILY_OTHER_BLUES\n#define t1_blend_force_bold           T1_BLEND_FORCE_BOLD\n#define t1_blend_max                  T1_BLEND_MAX\n\n\n  /* maximum number of Multiple Masters designs, as defined in the spec */\n#define T1_MAX_MM_DESIGNS     16\n\n  /* maximum number of Multiple Masters axes, as defined in the spec */\n#define T1_MAX_MM_AXIS        4\n\n  /* maximum number of elements in a design map */\n#define T1_MAX_MM_MAP_POINTS  20\n\n\n  /* this structure is used to store the BlendDesignMap entry for an axis */\n  typedef struct  PS_DesignMap_\n  {\n    FT_Byte    num_points;\n    FT_Long*   design_points;\n    FT_Fixed*  blend_points;\n\n  } PS_DesignMapRec, *PS_DesignMap;\n\n  /* backwards-compatible definition */\n  typedef PS_DesignMapRec  T1_DesignMap;\n\n\n  typedef struct  PS_BlendRec_\n  {\n    FT_UInt          num_designs;\n    FT_UInt          num_axis;\n\n    FT_String*       axis_names[T1_MAX_MM_AXIS];\n    FT_Fixed*        design_pos[T1_MAX_MM_DESIGNS];\n    PS_DesignMapRec  design_map[T1_MAX_MM_AXIS];\n\n    FT_Fixed*        weight_vector;\n    FT_Fixed*        default_weight_vector;\n\n    PS_FontInfo      font_infos[T1_MAX_MM_DESIGNS + 1];\n    PS_Private       privates  [T1_MAX_MM_DESIGNS + 1];\n\n    FT_ULong         blend_bitflags;\n\n    FT_BBox*         bboxes    [T1_MAX_MM_DESIGNS + 1];\n\n    /* since 2.3.0 */\n\n    /* undocumented, optional: the default design instance;   */\n    /* corresponds to default_weight_vector --                */\n    /* num_default_design_vector == 0 means it is not present */\n    /* in the font and associated metrics files               */\n    FT_UInt          default_design_vector[T1_MAX_MM_DESIGNS];\n    FT_UInt          num_default_design_vector;\n\n  } PS_BlendRec, *PS_Blend;\n\n\n  /* backwards-compatible definition */\n  typedef PS_BlendRec  T1_Blend;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    CID_FaceDictRec                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to represent data in a CID top-level dictionary.  */\n  /*                                                                       */\n  typedef struct  CID_FaceDictRec_\n  {\n    PS_PrivateRec  private_dict;\n\n    FT_UInt        len_buildchar;\n    FT_Fixed       forcebold_threshold;\n    FT_Pos         stroke_width;\n    FT_Fixed       expansion_factor;\n\n    FT_Byte        paint_type;\n    FT_Byte        font_type;\n    FT_Matrix      font_matrix;\n    FT_Vector      font_offset;\n\n    FT_UInt        num_subrs;\n    FT_ULong       subrmap_offset;\n    FT_Int         sd_bytes;\n\n  } CID_FaceDictRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    CID_FaceDict                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a @CID_FaceDictRec structure.                          */\n  /*                                                                       */\n  typedef struct CID_FaceDictRec_*  CID_FaceDict;\n\n  /* */\n\n\n  /* backwards-compatible definition */\n  typedef CID_FaceDictRec  CID_FontDict;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    CID_FaceInfoRec                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to represent CID Face information.                */\n  /*                                                                       */\n  typedef struct  CID_FaceInfoRec_\n  {\n    FT_String*      cid_font_name;\n    FT_Fixed        cid_version;\n    FT_Int          cid_font_type;\n\n    FT_String*      registry;\n    FT_String*      ordering;\n    FT_Int          supplement;\n\n    PS_FontInfoRec  font_info;\n    FT_BBox         font_bbox;\n    FT_ULong        uid_base;\n\n    FT_Int          num_xuid;\n    FT_ULong        xuid[16];\n\n    FT_ULong        cidmap_offset;\n    FT_Int          fd_bytes;\n    FT_Int          gd_bytes;\n    FT_ULong        cid_count;\n\n    FT_Int          num_dicts;\n    CID_FaceDict    font_dicts;\n\n    FT_ULong        data_offset;\n\n  } CID_FaceInfoRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    CID_FaceInfo                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a @CID_FaceInfoRec structure.                          */\n  /*                                                                       */\n  typedef struct CID_FaceInfoRec_*  CID_FaceInfo;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    CID_Info                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*   This type is equivalent to @CID_FaceInfoRec.  It is deprecated but  */\n  /*   kept to maintain source compatibility between various versions of   */\n  /*   FreeType.                                                           */\n  /*                                                                       */\n  typedef CID_FaceInfoRec  CID_Info;\n\n\n  /************************************************************************\n   *\n   * @function:\n   *    FT_Has_PS_Glyph_Names\n   *\n   * @description:\n   *    Return true if a given face provides reliable PostScript glyph\n   *    names.  This is similar to using the @FT_HAS_GLYPH_NAMES macro,\n   *    except that certain fonts (mostly TrueType) contain incorrect\n   *    glyph name tables.\n   *\n   *    When this function returns true, the caller is sure that the glyph\n   *    names returned by @FT_Get_Glyph_Name are reliable.\n   *\n   * @input:\n   *    face ::\n   *       face handle\n   *\n   * @return:\n   *    Boolean.  True if glyph names are reliable.\n   *\n   */\n  FT_EXPORT( FT_Int )\n  FT_Has_PS_Glyph_Names( FT_Face  face );\n\n\n  /************************************************************************\n   *\n   * @function:\n   *    FT_Get_PS_Font_Info\n   *\n   * @description:\n   *    Retrieve the @PS_FontInfoRec structure corresponding to a given\n   *    PostScript font.\n   *\n   * @input:\n   *    face ::\n   *       PostScript face handle.\n   *\n   * @output:\n   *    afont_info ::\n   *       Output font info structure pointer.\n   *\n   * @return:\n   *    FreeType error code.  0~means success.\n   *\n   * @note:\n   *    The string pointers within the font info structure are owned by\n   *    the face and don't need to be freed by the caller.\n   *\n   *    If the font's format is not PostScript-based, this function will\n   *    return the `FT_Err_Invalid_Argument' error code.\n   *\n   */\n  FT_EXPORT( FT_Error )\n  FT_Get_PS_Font_Info( FT_Face      face,\n                       PS_FontInfo  afont_info );\n\n\n  /************************************************************************\n   *\n   * @function:\n   *    FT_Get_PS_Font_Private\n   *\n   * @description:\n   *    Retrieve the @PS_PrivateRec structure corresponding to a given\n   *    PostScript font.\n   *\n   * @input:\n   *    face ::\n   *       PostScript face handle.\n   *\n   * @output:\n   *    afont_private ::\n   *       Output private dictionary structure pointer.\n   *\n   * @return:\n   *    FreeType error code.  0~means success.\n   *\n   * @note:\n   *    The string pointers within the @PS_PrivateRec structure are owned by\n   *    the face and don't need to be freed by the caller.\n   *\n   *    If the font's format is not PostScript-based, this function returns\n   *    the `FT_Err_Invalid_Argument' error code.\n   *\n   */\n  FT_EXPORT( FT_Error )\n  FT_Get_PS_Font_Private( FT_Face     face,\n                          PS_Private  afont_private );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    T1_EncodingType                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration describing the `Encoding' entry in a Type 1         */\n  /*    dictionary.                                                        */\n  /*                                                                       */\n  typedef enum  T1_EncodingType_\n  {\n    T1_ENCODING_TYPE_NONE = 0,\n    T1_ENCODING_TYPE_ARRAY,\n    T1_ENCODING_TYPE_STANDARD,\n    T1_ENCODING_TYPE_ISOLATIN1,\n    T1_ENCODING_TYPE_EXPERT\n\n  } T1_EncodingType;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    PS_Dict_Keys                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration used in calls to @FT_Get_PS_Font_Value to identify  */\n  /*    the Type~1 dictionary entry to retrieve.                           */\n  /*                                                                       */\n  typedef enum  PS_Dict_Keys_\n  {\n    /* conventionally in the font dictionary */\n    PS_DICT_FONT_TYPE,              /* FT_Byte         */\n    PS_DICT_FONT_MATRIX,            /* FT_Fixed        */\n    PS_DICT_FONT_BBOX,              /* FT_Fixed        */\n    PS_DICT_PAINT_TYPE,             /* FT_Byte         */\n    PS_DICT_FONT_NAME,              /* FT_String*      */\n    PS_DICT_UNIQUE_ID,              /* FT_Int          */\n    PS_DICT_NUM_CHAR_STRINGS,       /* FT_Int          */\n    PS_DICT_CHAR_STRING_KEY,        /* FT_String*      */\n    PS_DICT_CHAR_STRING,            /* FT_String*      */\n    PS_DICT_ENCODING_TYPE,          /* T1_EncodingType */\n    PS_DICT_ENCODING_ENTRY,         /* FT_String*      */\n\n    /* conventionally in the font Private dictionary */\n    PS_DICT_NUM_SUBRS,              /* FT_Int     */\n    PS_DICT_SUBR,                   /* FT_String* */\n    PS_DICT_STD_HW,                 /* FT_UShort  */\n    PS_DICT_STD_VW,                 /* FT_UShort  */\n    PS_DICT_NUM_BLUE_VALUES,        /* FT_Byte    */\n    PS_DICT_BLUE_VALUE,             /* FT_Short   */\n    PS_DICT_BLUE_FUZZ,              /* FT_Int     */\n    PS_DICT_NUM_OTHER_BLUES,        /* FT_Byte    */\n    PS_DICT_OTHER_BLUE,             /* FT_Short   */\n    PS_DICT_NUM_FAMILY_BLUES,       /* FT_Byte    */\n    PS_DICT_FAMILY_BLUE,            /* FT_Short   */\n    PS_DICT_NUM_FAMILY_OTHER_BLUES, /* FT_Byte    */\n    PS_DICT_FAMILY_OTHER_BLUE,      /* FT_Short   */\n    PS_DICT_BLUE_SCALE,             /* FT_Fixed   */\n    PS_DICT_BLUE_SHIFT,             /* FT_Int     */\n    PS_DICT_NUM_STEM_SNAP_H,        /* FT_Byte    */\n    PS_DICT_STEM_SNAP_H,            /* FT_Short   */\n    PS_DICT_NUM_STEM_SNAP_V,        /* FT_Byte    */\n    PS_DICT_STEM_SNAP_V,            /* FT_Short   */\n    PS_DICT_FORCE_BOLD,             /* FT_Bool    */\n    PS_DICT_RND_STEM_UP,            /* FT_Bool    */\n    PS_DICT_MIN_FEATURE,            /* FT_Short   */\n    PS_DICT_LEN_IV,                 /* FT_Int     */\n    PS_DICT_PASSWORD,               /* FT_Long    */\n    PS_DICT_LANGUAGE_GROUP,         /* FT_Long    */\n\n    /* conventionally in the font FontInfo dictionary */\n    PS_DICT_VERSION,                /* FT_String* */\n    PS_DICT_NOTICE,                 /* FT_String* */\n    PS_DICT_FULL_NAME,              /* FT_String* */\n    PS_DICT_FAMILY_NAME,            /* FT_String* */\n    PS_DICT_WEIGHT,                 /* FT_String* */\n    PS_DICT_IS_FIXED_PITCH,         /* FT_Bool    */\n    PS_DICT_UNDERLINE_POSITION,     /* FT_Short   */\n    PS_DICT_UNDERLINE_THICKNESS,    /* FT_UShort  */\n    PS_DICT_FS_TYPE,                /* FT_UShort  */\n    PS_DICT_ITALIC_ANGLE,           /* FT_Long    */\n\n    PS_DICT_MAX = PS_DICT_ITALIC_ANGLE\n\n  } PS_Dict_Keys;\n\n\n  /************************************************************************\n   *\n   * @function:\n   *    FT_Get_PS_Font_Value\n   *\n   * @description:\n   *    Retrieve the value for the supplied key from a PostScript font.\n   *\n   * @input:\n   *    face ::\n   *       PostScript face handle.\n   *\n   *    key ::\n   *       An enumeration value representing the dictionary key to retrieve.\n   *\n   *    idx ::\n   *       For array values, this specifies the index to be returned.\n   *\n   *    value ::\n   *       A pointer to memory into which to write the value.\n   *\n   *    valen_len ::\n   *       The size, in bytes, of the memory supplied for the value.\n   *\n   * @output:\n   *    value ::\n   *       The value matching the above key, if it exists.\n   *\n   * @return:\n   *    The amount of memory (in bytes) required to hold the requested\n   *    value (if it exists, -1 otherwise).\n   *\n   * @note:\n   *    The values returned are not pointers into the internal structures of\n   *    the face, but are `fresh' copies, so that the memory containing them\n   *    belongs to the calling application.  This also enforces the\n   *    `read-only' nature of these values, i.e., this function cannot be\n   *    used to manipulate the face.\n   *\n   *    `value' is a void pointer because the values returned can be of\n   *    various types.\n   *\n   *    If either `value' is NULL or `value_len' is too small, just the\n   *    required memory size for the requested entry is returned.\n   *\n   *    The `idx' parameter is used, not only to retrieve elements of, for\n   *    example, the FontMatrix or FontBBox, but also to retrieve name keys\n   *    from the CharStrings dictionary, and the charstrings themselves.  It\n   *    is ignored for atomic values.\n   *\n   *    PS_DICT_BLUE_SCALE returns a value that is scaled up by 1000.  To\n   *    get the value as in the font stream, you need to divide by\n   *    65536000.0 (to remove the FT_Fixed scale, and the x1000 scale).\n   *\n   *    IMPORTANT: Only key/value pairs read by the FreeType interpreter can\n   *    be retrieved.  So, for example, PostScript procedures such as NP,\n   *    ND, and RD are not available.  Arbitrary keys are, obviously, not be\n   *    available either.\n   *\n   *    If the font's format is not PostScript-based, this function returns\n   *    the `FT_Err_Invalid_Argument' error code.\n   *\n   */\n  FT_EXPORT( FT_Long )\n  FT_Get_PS_Font_Value( FT_Face       face,\n                        PS_Dict_Keys  key,\n                        FT_UInt       idx,\n                        void         *value,\n                        FT_Long       value_len );\n\n  /* */\n\nFT_END_HEADER\n\n#endif /* __T1TABLES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ttnameid.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttnameid.h                                                             */\n/*                                                                         */\n/*    TrueType name ID definitions (specification only).                   */\n/*                                                                         */\n/*  Copyright 1996-2004, 2006-2008, 2012 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTNAMEID_H__\n#define __TTNAMEID_H__\n\n\n#include \"../ft2build.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    truetype_tables                                                    */\n  /*                                                                       */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Possible values for the `platform' identifier code in the name        */\n  /* records of the TTF `name' table.                                      */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /***********************************************************************\n   *\n   * @enum:\n   *   TT_PLATFORM_XXX\n   *\n   * @description:\n   *   A list of valid values for the `platform_id' identifier code in\n   *   @FT_CharMapRec and @FT_SfntName structures.\n   *\n   * @values:\n   *   TT_PLATFORM_APPLE_UNICODE ::\n   *     Used by Apple to indicate a Unicode character map and/or name entry.\n   *     See @TT_APPLE_ID_XXX for corresponding `encoding_id' values.  Note\n   *     that name entries in this format are coded as big-endian UCS-2\n   *     character codes _only_.\n   *\n   *   TT_PLATFORM_MACINTOSH ::\n   *     Used by Apple to indicate a MacOS-specific charmap and/or name entry.\n   *     See @TT_MAC_ID_XXX for corresponding `encoding_id' values.  Note that\n   *     most TrueType fonts contain an Apple roman charmap to be usable on\n   *     MacOS systems (even if they contain a Microsoft charmap as well).\n   *\n   *   TT_PLATFORM_ISO ::\n   *     This value was used to specify ISO/IEC 10646 charmaps.  It is however\n   *     now deprecated.  See @TT_ISO_ID_XXX for a list of corresponding\n   *     `encoding_id' values.\n   *\n   *   TT_PLATFORM_MICROSOFT ::\n   *     Used by Microsoft to indicate Windows-specific charmaps.  See\n   *     @TT_MS_ID_XXX for a list of corresponding `encoding_id' values.\n   *     Note that most fonts contain a Unicode charmap using\n   *     (TT_PLATFORM_MICROSOFT, @TT_MS_ID_UNICODE_CS).\n   *\n   *   TT_PLATFORM_CUSTOM ::\n   *     Used to indicate application-specific charmaps.\n   *\n   *   TT_PLATFORM_ADOBE ::\n   *     This value isn't part of any font format specification, but is used\n   *     by FreeType to report Adobe-specific charmaps in an @FT_CharMapRec\n   *     structure.  See @TT_ADOBE_ID_XXX.\n   */\n\n#define TT_PLATFORM_APPLE_UNICODE  0\n#define TT_PLATFORM_MACINTOSH      1\n#define TT_PLATFORM_ISO            2 /* deprecated */\n#define TT_PLATFORM_MICROSOFT      3\n#define TT_PLATFORM_CUSTOM         4\n#define TT_PLATFORM_ADOBE          7 /* artificial */\n\n\n  /***********************************************************************\n   *\n   * @enum:\n   *   TT_APPLE_ID_XXX\n   *\n   * @description:\n   *   A list of valid values for the `encoding_id' for\n   *   @TT_PLATFORM_APPLE_UNICODE charmaps and name entries.\n   *\n   * @values:\n   *   TT_APPLE_ID_DEFAULT ::\n   *     Unicode version 1.0.\n   *\n   *   TT_APPLE_ID_UNICODE_1_1 ::\n   *     Unicode 1.1; specifies Hangul characters starting at U+34xx.\n   *\n   *   TT_APPLE_ID_ISO_10646 ::\n   *     Deprecated (identical to preceding).\n   *\n   *   TT_APPLE_ID_UNICODE_2_0 ::\n   *     Unicode 2.0 and beyond (UTF-16 BMP only).\n   *\n   *   TT_APPLE_ID_UNICODE_32 ::\n   *     Unicode 3.1 and beyond, using UTF-32.\n   *\n   *   TT_APPLE_ID_VARIANT_SELECTOR ::\n   *     From Adobe, not Apple.  Not a normal cmap.  Specifies variations\n   *     on a real cmap.\n   */\n\n#define TT_APPLE_ID_DEFAULT           0 /* Unicode 1.0 */\n#define TT_APPLE_ID_UNICODE_1_1       1 /* specify Hangul at U+34xx */\n#define TT_APPLE_ID_ISO_10646         2 /* deprecated */\n#define TT_APPLE_ID_UNICODE_2_0       3 /* or later */\n#define TT_APPLE_ID_UNICODE_32        4 /* 2.0 or later, full repertoire */\n#define TT_APPLE_ID_VARIANT_SELECTOR  5 /* variation selector data */\n\n\n  /***********************************************************************\n   *\n   * @enum:\n   *   TT_MAC_ID_XXX\n   *\n   * @description:\n   *   A list of valid values for the `encoding_id' for\n   *   @TT_PLATFORM_MACINTOSH charmaps and name entries.\n   *\n   * @values:\n   *   TT_MAC_ID_ROMAN ::\n   *   TT_MAC_ID_JAPANESE ::\n   *   TT_MAC_ID_TRADITIONAL_CHINESE ::\n   *   TT_MAC_ID_KOREAN ::\n   *   TT_MAC_ID_ARABIC ::\n   *   TT_MAC_ID_HEBREW ::\n   *   TT_MAC_ID_GREEK ::\n   *   TT_MAC_ID_RUSSIAN ::\n   *   TT_MAC_ID_RSYMBOL ::\n   *   TT_MAC_ID_DEVANAGARI ::\n   *   TT_MAC_ID_GURMUKHI ::\n   *   TT_MAC_ID_GUJARATI ::\n   *   TT_MAC_ID_ORIYA ::\n   *   TT_MAC_ID_BENGALI ::\n   *   TT_MAC_ID_TAMIL ::\n   *   TT_MAC_ID_TELUGU ::\n   *   TT_MAC_ID_KANNADA ::\n   *   TT_MAC_ID_MALAYALAM ::\n   *   TT_MAC_ID_SINHALESE ::\n   *   TT_MAC_ID_BURMESE ::\n   *   TT_MAC_ID_KHMER ::\n   *   TT_MAC_ID_THAI ::\n   *   TT_MAC_ID_LAOTIAN ::\n   *   TT_MAC_ID_GEORGIAN ::\n   *   TT_MAC_ID_ARMENIAN ::\n   *   TT_MAC_ID_MALDIVIAN ::\n   *   TT_MAC_ID_SIMPLIFIED_CHINESE ::\n   *   TT_MAC_ID_TIBETAN ::\n   *   TT_MAC_ID_MONGOLIAN ::\n   *   TT_MAC_ID_GEEZ ::\n   *   TT_MAC_ID_SLAVIC ::\n   *   TT_MAC_ID_VIETNAMESE ::\n   *   TT_MAC_ID_SINDHI ::\n   *   TT_MAC_ID_UNINTERP ::\n   */\n\n#define TT_MAC_ID_ROMAN                 0\n#define TT_MAC_ID_JAPANESE              1\n#define TT_MAC_ID_TRADITIONAL_CHINESE   2\n#define TT_MAC_ID_KOREAN                3\n#define TT_MAC_ID_ARABIC                4\n#define TT_MAC_ID_HEBREW                5\n#define TT_MAC_ID_GREEK                 6\n#define TT_MAC_ID_RUSSIAN               7\n#define TT_MAC_ID_RSYMBOL               8\n#define TT_MAC_ID_DEVANAGARI            9\n#define TT_MAC_ID_GURMUKHI             10\n#define TT_MAC_ID_GUJARATI             11\n#define TT_MAC_ID_ORIYA                12\n#define TT_MAC_ID_BENGALI              13\n#define TT_MAC_ID_TAMIL                14\n#define TT_MAC_ID_TELUGU               15\n#define TT_MAC_ID_KANNADA              16\n#define TT_MAC_ID_MALAYALAM            17\n#define TT_MAC_ID_SINHALESE            18\n#define TT_MAC_ID_BURMESE              19\n#define TT_MAC_ID_KHMER                20\n#define TT_MAC_ID_THAI                 21\n#define TT_MAC_ID_LAOTIAN              22\n#define TT_MAC_ID_GEORGIAN             23\n#define TT_MAC_ID_ARMENIAN             24\n#define TT_MAC_ID_MALDIVIAN            25\n#define TT_MAC_ID_SIMPLIFIED_CHINESE   25\n#define TT_MAC_ID_TIBETAN              26\n#define TT_MAC_ID_MONGOLIAN            27\n#define TT_MAC_ID_GEEZ                 28\n#define TT_MAC_ID_SLAVIC               29\n#define TT_MAC_ID_VIETNAMESE           30\n#define TT_MAC_ID_SINDHI               31\n#define TT_MAC_ID_UNINTERP             32\n\n\n  /***********************************************************************\n   *\n   * @enum:\n   *   TT_ISO_ID_XXX\n   *\n   * @description:\n   *   A list of valid values for the `encoding_id' for\n   *   @TT_PLATFORM_ISO charmaps and name entries.\n   *\n   *   Their use is now deprecated.\n   *\n   * @values:\n   *   TT_ISO_ID_7BIT_ASCII ::\n   *     ASCII.\n   *   TT_ISO_ID_10646 ::\n   *     ISO/10646.\n   *   TT_ISO_ID_8859_1 ::\n   *     Also known as Latin-1.\n   */\n\n#define TT_ISO_ID_7BIT_ASCII  0\n#define TT_ISO_ID_10646       1\n#define TT_ISO_ID_8859_1      2\n\n\n  /***********************************************************************\n   *\n   * @enum:\n   *   TT_MS_ID_XXX\n   *\n   * @description:\n   *   A list of valid values for the `encoding_id' for\n   *   @TT_PLATFORM_MICROSOFT charmaps and name entries.\n   *\n   * @values:\n   *   TT_MS_ID_SYMBOL_CS ::\n   *     Corresponds to Microsoft symbol encoding. See\n   *     @FT_ENCODING_MS_SYMBOL.\n   *\n   *   TT_MS_ID_UNICODE_CS ::\n   *     Corresponds to a Microsoft WGL4 charmap, matching Unicode.  See\n   *     @FT_ENCODING_UNICODE.\n   *\n   *   TT_MS_ID_SJIS ::\n   *     Corresponds to SJIS Japanese encoding.  See @FT_ENCODING_SJIS.\n   *\n   *   TT_MS_ID_GB2312 ::\n   *     Corresponds to Simplified Chinese as used in Mainland China.  See\n   *     @FT_ENCODING_GB2312.\n   *\n   *   TT_MS_ID_BIG_5 ::\n   *     Corresponds to Traditional Chinese as used in Taiwan and Hong Kong.\n   *     See @FT_ENCODING_BIG5.\n   *\n   *   TT_MS_ID_WANSUNG ::\n   *     Corresponds to Korean Wansung encoding.  See @FT_ENCODING_WANSUNG.\n   *\n   *   TT_MS_ID_JOHAB ::\n   *     Corresponds to Johab encoding.  See @FT_ENCODING_JOHAB.\n   *\n   *   TT_MS_ID_UCS_4 ::\n   *     Corresponds to UCS-4 or UTF-32 charmaps.  This has been added to\n   *     the OpenType specification version 1.4 (mid-2001.)\n   */\n\n#define TT_MS_ID_SYMBOL_CS    0\n#define TT_MS_ID_UNICODE_CS   1\n#define TT_MS_ID_SJIS         2\n#define TT_MS_ID_GB2312       3\n#define TT_MS_ID_BIG_5        4\n#define TT_MS_ID_WANSUNG      5\n#define TT_MS_ID_JOHAB        6\n#define TT_MS_ID_UCS_4       10\n\n\n  /***********************************************************************\n   *\n   * @enum:\n   *   TT_ADOBE_ID_XXX\n   *\n   * @description:\n   *   A list of valid values for the `encoding_id' for\n   *   @TT_PLATFORM_ADOBE charmaps.  This is a FreeType-specific extension!\n   *\n   * @values:\n   *   TT_ADOBE_ID_STANDARD ::\n   *     Adobe standard encoding.\n   *   TT_ADOBE_ID_EXPERT ::\n   *     Adobe expert encoding.\n   *   TT_ADOBE_ID_CUSTOM ::\n   *     Adobe custom encoding.\n   *   TT_ADOBE_ID_LATIN_1 ::\n   *     Adobe Latin~1 encoding.\n   */\n\n#define TT_ADOBE_ID_STANDARD  0\n#define TT_ADOBE_ID_EXPERT    1\n#define TT_ADOBE_ID_CUSTOM    2\n#define TT_ADOBE_ID_LATIN_1   3\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Possible values of the language identifier field in the name records  */\n  /* of the TTF `name' table if the `platform' identifier code is          */\n  /* TT_PLATFORM_MACINTOSH.  These values are also used as return values   */\n  /* for function @FT_Get_CMap_Language_ID.                                */\n  /*                                                                       */\n  /* The canonical source for the Apple assigned Language ID's is at       */\n  /*                                                                       */\n  /*   https://developer.apple.com/fonts/TTRefMan/RM06/Chap6name.html      */\n  /*                                                                       */\n#define TT_MAC_LANGID_ENGLISH                       0\n#define TT_MAC_LANGID_FRENCH                        1\n#define TT_MAC_LANGID_GERMAN                        2\n#define TT_MAC_LANGID_ITALIAN                       3\n#define TT_MAC_LANGID_DUTCH                         4\n#define TT_MAC_LANGID_SWEDISH                       5\n#define TT_MAC_LANGID_SPANISH                       6\n#define TT_MAC_LANGID_DANISH                        7\n#define TT_MAC_LANGID_PORTUGUESE                    8\n#define TT_MAC_LANGID_NORWEGIAN                     9\n#define TT_MAC_LANGID_HEBREW                       10\n#define TT_MAC_LANGID_JAPANESE                     11\n#define TT_MAC_LANGID_ARABIC                       12\n#define TT_MAC_LANGID_FINNISH                      13\n#define TT_MAC_LANGID_GREEK                        14\n#define TT_MAC_LANGID_ICELANDIC                    15\n#define TT_MAC_LANGID_MALTESE                      16\n#define TT_MAC_LANGID_TURKISH                      17\n#define TT_MAC_LANGID_CROATIAN                     18\n#define TT_MAC_LANGID_CHINESE_TRADITIONAL          19\n#define TT_MAC_LANGID_URDU                         20\n#define TT_MAC_LANGID_HINDI                        21\n#define TT_MAC_LANGID_THAI                         22\n#define TT_MAC_LANGID_KOREAN                       23\n#define TT_MAC_LANGID_LITHUANIAN                   24\n#define TT_MAC_LANGID_POLISH                       25\n#define TT_MAC_LANGID_HUNGARIAN                    26\n#define TT_MAC_LANGID_ESTONIAN                     27\n#define TT_MAC_LANGID_LETTISH                      28\n#define TT_MAC_LANGID_SAAMISK                      29\n#define TT_MAC_LANGID_FAEROESE                     30\n#define TT_MAC_LANGID_FARSI                        31\n#define TT_MAC_LANGID_RUSSIAN                      32\n#define TT_MAC_LANGID_CHINESE_SIMPLIFIED           33\n#define TT_MAC_LANGID_FLEMISH                      34\n#define TT_MAC_LANGID_IRISH                        35\n#define TT_MAC_LANGID_ALBANIAN                     36\n#define TT_MAC_LANGID_ROMANIAN                     37\n#define TT_MAC_LANGID_CZECH                        38\n#define TT_MAC_LANGID_SLOVAK                       39\n#define TT_MAC_LANGID_SLOVENIAN                    40\n#define TT_MAC_LANGID_YIDDISH                      41\n#define TT_MAC_LANGID_SERBIAN                      42\n#define TT_MAC_LANGID_MACEDONIAN                   43\n#define TT_MAC_LANGID_BULGARIAN                    44\n#define TT_MAC_LANGID_UKRAINIAN                    45\n#define TT_MAC_LANGID_BYELORUSSIAN                 46\n#define TT_MAC_LANGID_UZBEK                        47\n#define TT_MAC_LANGID_KAZAKH                       48\n#define TT_MAC_LANGID_AZERBAIJANI                  49\n#define TT_MAC_LANGID_AZERBAIJANI_CYRILLIC_SCRIPT  49\n#define TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT    50\n#define TT_MAC_LANGID_ARMENIAN                     51\n#define TT_MAC_LANGID_GEORGIAN                     52\n#define TT_MAC_LANGID_MOLDAVIAN                    53\n#define TT_MAC_LANGID_KIRGHIZ                      54\n#define TT_MAC_LANGID_TAJIKI                       55\n#define TT_MAC_LANGID_TURKMEN                      56\n#define TT_MAC_LANGID_MONGOLIAN                    57\n#define TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT   57\n#define TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT    58\n#define TT_MAC_LANGID_PASHTO                       59\n#define TT_MAC_LANGID_KURDISH                      60\n#define TT_MAC_LANGID_KASHMIRI                     61\n#define TT_MAC_LANGID_SINDHI                       62\n#define TT_MAC_LANGID_TIBETAN                      63\n#define TT_MAC_LANGID_NEPALI                       64\n#define TT_MAC_LANGID_SANSKRIT                     65\n#define TT_MAC_LANGID_MARATHI                      66\n#define TT_MAC_LANGID_BENGALI                      67\n#define TT_MAC_LANGID_ASSAMESE                     68\n#define TT_MAC_LANGID_GUJARATI                     69\n#define TT_MAC_LANGID_PUNJABI                      70\n#define TT_MAC_LANGID_ORIYA                        71\n#define TT_MAC_LANGID_MALAYALAM                    72\n#define TT_MAC_LANGID_KANNADA                      73\n#define TT_MAC_LANGID_TAMIL                        74\n#define TT_MAC_LANGID_TELUGU                       75\n#define TT_MAC_LANGID_SINHALESE                    76\n#define TT_MAC_LANGID_BURMESE                      77\n#define TT_MAC_LANGID_KHMER                        78\n#define TT_MAC_LANGID_LAO                          79\n#define TT_MAC_LANGID_VIETNAMESE                   80\n#define TT_MAC_LANGID_INDONESIAN                   81\n#define TT_MAC_LANGID_TAGALOG                      82\n#define TT_MAC_LANGID_MALAY_ROMAN_SCRIPT           83\n#define TT_MAC_LANGID_MALAY_ARABIC_SCRIPT          84\n#define TT_MAC_LANGID_AMHARIC                      85\n#define TT_MAC_LANGID_TIGRINYA                     86\n#define TT_MAC_LANGID_GALLA                        87\n#define TT_MAC_LANGID_SOMALI                       88\n#define TT_MAC_LANGID_SWAHILI                      89\n#define TT_MAC_LANGID_RUANDA                       90\n#define TT_MAC_LANGID_RUNDI                        91\n#define TT_MAC_LANGID_CHEWA                        92\n#define TT_MAC_LANGID_MALAGASY                     93\n#define TT_MAC_LANGID_ESPERANTO                    94\n#define TT_MAC_LANGID_WELSH                       128\n#define TT_MAC_LANGID_BASQUE                      129\n#define TT_MAC_LANGID_CATALAN                     130\n#define TT_MAC_LANGID_LATIN                       131\n#define TT_MAC_LANGID_QUECHUA                     132\n#define TT_MAC_LANGID_GUARANI                     133\n#define TT_MAC_LANGID_AYMARA                      134\n#define TT_MAC_LANGID_TATAR                       135\n#define TT_MAC_LANGID_UIGHUR                      136\n#define TT_MAC_LANGID_DZONGKHA                    137\n#define TT_MAC_LANGID_JAVANESE                    138\n#define TT_MAC_LANGID_SUNDANESE                   139\n\n\n#if 0  /* these seem to be errors that have been dropped */\n\n#define TT_MAC_LANGID_SCOTTISH_GAELIC             140\n#define TT_MAC_LANGID_IRISH_GAELIC                141\n\n#endif\n\n\n  /* The following codes are new as of 2000-03-10 */\n#define TT_MAC_LANGID_GALICIAN                    140\n#define TT_MAC_LANGID_AFRIKAANS                   141\n#define TT_MAC_LANGID_BRETON                      142\n#define TT_MAC_LANGID_INUKTITUT                   143\n#define TT_MAC_LANGID_SCOTTISH_GAELIC             144\n#define TT_MAC_LANGID_MANX_GAELIC                 145\n#define TT_MAC_LANGID_IRISH_GAELIC                146\n#define TT_MAC_LANGID_TONGAN                      147\n#define TT_MAC_LANGID_GREEK_POLYTONIC             148\n#define TT_MAC_LANGID_GREELANDIC                  149\n#define TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT    150\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Possible values of the language identifier field in the name records  */\n  /* of the TTF `name' table if the `platform' identifier code is          */\n  /* TT_PLATFORM_MICROSOFT.                                                */\n  /*                                                                       */\n  /* The canonical source for the MS assigned LCIDs is                     */\n  /*                                                                       */\n  /*   http://www.microsoft.com/globaldev/reference/lcid-all.mspx          */\n  /*                                                                       */\n\n#define TT_MS_LANGID_ARABIC_GENERAL                    0x0001\n#define TT_MS_LANGID_ARABIC_SAUDI_ARABIA               0x0401\n#define TT_MS_LANGID_ARABIC_IRAQ                       0x0801\n#define TT_MS_LANGID_ARABIC_EGYPT                      0x0c01\n#define TT_MS_LANGID_ARABIC_LIBYA                      0x1001\n#define TT_MS_LANGID_ARABIC_ALGERIA                    0x1401\n#define TT_MS_LANGID_ARABIC_MOROCCO                    0x1801\n#define TT_MS_LANGID_ARABIC_TUNISIA                    0x1c01\n#define TT_MS_LANGID_ARABIC_OMAN                       0x2001\n#define TT_MS_LANGID_ARABIC_YEMEN                      0x2401\n#define TT_MS_LANGID_ARABIC_SYRIA                      0x2801\n#define TT_MS_LANGID_ARABIC_JORDAN                     0x2c01\n#define TT_MS_LANGID_ARABIC_LEBANON                    0x3001\n#define TT_MS_LANGID_ARABIC_KUWAIT                     0x3401\n#define TT_MS_LANGID_ARABIC_UAE                        0x3801\n#define TT_MS_LANGID_ARABIC_BAHRAIN                    0x3c01\n#define TT_MS_LANGID_ARABIC_QATAR                      0x4001\n#define TT_MS_LANGID_BULGARIAN_BULGARIA                0x0402\n#define TT_MS_LANGID_CATALAN_SPAIN                     0x0403\n#define TT_MS_LANGID_CHINESE_GENERAL                   0x0004\n#define TT_MS_LANGID_CHINESE_TAIWAN                    0x0404\n#define TT_MS_LANGID_CHINESE_PRC                       0x0804\n#define TT_MS_LANGID_CHINESE_HONG_KONG                 0x0c04\n#define TT_MS_LANGID_CHINESE_SINGAPORE                 0x1004\n\n#if 1  /* this looks like the correct value */\n#define TT_MS_LANGID_CHINESE_MACAU                     0x1404\n#else  /* but beware, Microsoft may change its mind...\n          the most recent Word reference has the following: */\n#define TT_MS_LANGID_CHINESE_MACAU  TT_MS_LANGID_CHINESE_HONG_KONG\n#endif\n\n#if 0  /* used only with .NET `cultures'; commented out */\n#define TT_MS_LANGID_CHINESE_TRADITIONAL               0x7C04\n#endif\n\n#define TT_MS_LANGID_CZECH_CZECH_REPUBLIC              0x0405\n#define TT_MS_LANGID_DANISH_DENMARK                    0x0406\n#define TT_MS_LANGID_GERMAN_GERMANY                    0x0407\n#define TT_MS_LANGID_GERMAN_SWITZERLAND                0x0807\n#define TT_MS_LANGID_GERMAN_AUSTRIA                    0x0c07\n#define TT_MS_LANGID_GERMAN_LUXEMBOURG                 0x1007\n#define TT_MS_LANGID_GERMAN_LIECHTENSTEI               0x1407\n#define TT_MS_LANGID_GREEK_GREECE                      0x0408\n\n  /* don't ask what this one means... It is commented out currently. */\n#if 0\n#define TT_MS_LANGID_GREEK_GREECE2                     0x2008\n#endif\n\n#define TT_MS_LANGID_ENGLISH_GENERAL                   0x0009\n#define TT_MS_LANGID_ENGLISH_UNITED_STATES             0x0409\n#define TT_MS_LANGID_ENGLISH_UNITED_KINGDOM            0x0809\n#define TT_MS_LANGID_ENGLISH_AUSTRALIA                 0x0c09\n#define TT_MS_LANGID_ENGLISH_CANADA                    0x1009\n#define TT_MS_LANGID_ENGLISH_NEW_ZEALAND               0x1409\n#define TT_MS_LANGID_ENGLISH_IRELAND                   0x1809\n#define TT_MS_LANGID_ENGLISH_SOUTH_AFRICA              0x1c09\n#define TT_MS_LANGID_ENGLISH_JAMAICA                   0x2009\n#define TT_MS_LANGID_ENGLISH_CARIBBEAN                 0x2409\n#define TT_MS_LANGID_ENGLISH_BELIZE                    0x2809\n#define TT_MS_LANGID_ENGLISH_TRINIDAD                  0x2c09\n#define TT_MS_LANGID_ENGLISH_ZIMBABWE                  0x3009\n#define TT_MS_LANGID_ENGLISH_PHILIPPINES               0x3409\n#define TT_MS_LANGID_ENGLISH_INDONESIA                 0x3809\n#define TT_MS_LANGID_ENGLISH_HONG_KONG                 0x3c09\n#define TT_MS_LANGID_ENGLISH_INDIA                     0x4009\n#define TT_MS_LANGID_ENGLISH_MALAYSIA                  0x4409\n#define TT_MS_LANGID_ENGLISH_SINGAPORE                 0x4809\n#define TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT    0x040a\n#define TT_MS_LANGID_SPANISH_MEXICO                    0x080a\n#define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT  0x0c0a\n#define TT_MS_LANGID_SPANISH_GUATEMALA                 0x100a\n#define TT_MS_LANGID_SPANISH_COSTA_RICA                0x140a\n#define TT_MS_LANGID_SPANISH_PANAMA                    0x180a\n#define TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC        0x1c0a\n#define TT_MS_LANGID_SPANISH_VENEZUELA                 0x200a\n#define TT_MS_LANGID_SPANISH_COLOMBIA                  0x240a\n#define TT_MS_LANGID_SPANISH_PERU                      0x280a\n#define TT_MS_LANGID_SPANISH_ARGENTINA                 0x2c0a\n#define TT_MS_LANGID_SPANISH_ECUADOR                   0x300a\n#define TT_MS_LANGID_SPANISH_CHILE                     0x340a\n#define TT_MS_LANGID_SPANISH_URUGUAY                   0x380a\n#define TT_MS_LANGID_SPANISH_PARAGUAY                  0x3c0a\n#define TT_MS_LANGID_SPANISH_BOLIVIA                   0x400a\n#define TT_MS_LANGID_SPANISH_EL_SALVADOR               0x440a\n#define TT_MS_LANGID_SPANISH_HONDURAS                  0x480a\n#define TT_MS_LANGID_SPANISH_NICARAGUA                 0x4c0a\n#define TT_MS_LANGID_SPANISH_PUERTO_RICO               0x500a\n#define TT_MS_LANGID_SPANISH_UNITED_STATES             0x540a\n  /* The following ID blatantly violate MS specs by using a */\n  /* sublanguage > 0x1F.                                    */\n#define TT_MS_LANGID_SPANISH_LATIN_AMERICA             0xE40aU\n#define TT_MS_LANGID_FINNISH_FINLAND                   0x040b\n#define TT_MS_LANGID_FRENCH_FRANCE                     0x040c\n#define TT_MS_LANGID_FRENCH_BELGIUM                    0x080c\n#define TT_MS_LANGID_FRENCH_CANADA                     0x0c0c\n#define TT_MS_LANGID_FRENCH_SWITZERLAND                0x100c\n#define TT_MS_LANGID_FRENCH_LUXEMBOURG                 0x140c\n#define TT_MS_LANGID_FRENCH_MONACO                     0x180c\n#define TT_MS_LANGID_FRENCH_WEST_INDIES                0x1c0c\n#define TT_MS_LANGID_FRENCH_REUNION                    0x200c\n#define TT_MS_LANGID_FRENCH_CONGO                      0x240c\n  /* which was formerly: */\n#define TT_MS_LANGID_FRENCH_ZAIRE  TT_MS_LANGID_FRENCH_CONGO\n#define TT_MS_LANGID_FRENCH_SENEGAL                    0x280c\n#define TT_MS_LANGID_FRENCH_CAMEROON                   0x2c0c\n#define TT_MS_LANGID_FRENCH_COTE_D_IVOIRE              0x300c\n#define TT_MS_LANGID_FRENCH_MALI                       0x340c\n#define TT_MS_LANGID_FRENCH_MOROCCO                    0x380c\n#define TT_MS_LANGID_FRENCH_HAITI                      0x3c0c\n  /* and another violation of the spec (see 0xE40aU) */\n#define TT_MS_LANGID_FRENCH_NORTH_AFRICA               0xE40cU\n#define TT_MS_LANGID_HEBREW_ISRAEL                     0x040d\n#define TT_MS_LANGID_HUNGARIAN_HUNGARY                 0x040e\n#define TT_MS_LANGID_ICELANDIC_ICELAND                 0x040f\n#define TT_MS_LANGID_ITALIAN_ITALY                     0x0410\n#define TT_MS_LANGID_ITALIAN_SWITZERLAND               0x0810\n#define TT_MS_LANGID_JAPANESE_JAPAN                    0x0411\n#define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA     0x0412\n#define TT_MS_LANGID_KOREAN_JOHAB_KOREA                0x0812\n#define TT_MS_LANGID_DUTCH_NETHERLANDS                 0x0413\n#define TT_MS_LANGID_DUTCH_BELGIUM                     0x0813\n#define TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL           0x0414\n#define TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK          0x0814\n#define TT_MS_LANGID_POLISH_POLAND                     0x0415\n#define TT_MS_LANGID_PORTUGUESE_BRAZIL                 0x0416\n#define TT_MS_LANGID_PORTUGUESE_PORTUGAL               0x0816\n#define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND        0x0417\n#define TT_MS_LANGID_ROMANIAN_ROMANIA                  0x0418\n#define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA                0x0818\n#define TT_MS_LANGID_RUSSIAN_RUSSIA                    0x0419\n#define TT_MS_LANGID_RUSSIAN_MOLDAVIA                  0x0819\n#define TT_MS_LANGID_CROATIAN_CROATIA                  0x041a\n#define TT_MS_LANGID_SERBIAN_SERBIA_LATIN              0x081a\n#define TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC           0x0c1a\n\n#if 0  /* this used to be this value, but it looks like we were wrong */\n#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA        0x101a\n#else  /* current sources say */\n#define TT_MS_LANGID_CROATIAN_BOSNIA_HERZEGOVINA       0x101a\n#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA        0x141a\n       /* and XPsp2 Platform SDK added (2004-07-26) */\n       /* Names are shortened to be significant within 40 chars. */\n#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_LATIN         0x181a\n#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC      0x181a\n#endif\n\n#define TT_MS_LANGID_SLOVAK_SLOVAKIA                   0x041b\n#define TT_MS_LANGID_ALBANIAN_ALBANIA                  0x041c\n#define TT_MS_LANGID_SWEDISH_SWEDEN                    0x041d\n#define TT_MS_LANGID_SWEDISH_FINLAND                   0x081d\n#define TT_MS_LANGID_THAI_THAILAND                     0x041e\n#define TT_MS_LANGID_TURKISH_TURKEY                    0x041f\n#define TT_MS_LANGID_URDU_PAKISTAN                     0x0420\n#define TT_MS_LANGID_URDU_INDIA                        0x0820\n#define TT_MS_LANGID_INDONESIAN_INDONESIA              0x0421\n#define TT_MS_LANGID_UKRAINIAN_UKRAINE                 0x0422\n#define TT_MS_LANGID_BELARUSIAN_BELARUS                0x0423\n#define TT_MS_LANGID_SLOVENE_SLOVENIA                  0x0424\n#define TT_MS_LANGID_ESTONIAN_ESTONIA                  0x0425\n#define TT_MS_LANGID_LATVIAN_LATVIA                    0x0426\n#define TT_MS_LANGID_LITHUANIAN_LITHUANIA              0x0427\n#define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA      0x0827\n#define TT_MS_LANGID_TAJIK_TAJIKISTAN                  0x0428\n#define TT_MS_LANGID_FARSI_IRAN                        0x0429\n#define TT_MS_LANGID_VIETNAMESE_VIET_NAM               0x042a\n#define TT_MS_LANGID_ARMENIAN_ARMENIA                  0x042b\n#define TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN            0x042c\n#define TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC         0x082c\n#define TT_MS_LANGID_BASQUE_SPAIN                      0x042d\n#define TT_MS_LANGID_SORBIAN_GERMANY                   0x042e\n#define TT_MS_LANGID_MACEDONIAN_MACEDONIA              0x042f\n#define TT_MS_LANGID_SUTU_SOUTH_AFRICA                 0x0430\n#define TT_MS_LANGID_TSONGA_SOUTH_AFRICA               0x0431\n#define TT_MS_LANGID_TSWANA_SOUTH_AFRICA               0x0432\n#define TT_MS_LANGID_VENDA_SOUTH_AFRICA                0x0433\n#define TT_MS_LANGID_XHOSA_SOUTH_AFRICA                0x0434\n#define TT_MS_LANGID_ZULU_SOUTH_AFRICA                 0x0435\n#define TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA            0x0436\n#define TT_MS_LANGID_GEORGIAN_GEORGIA                  0x0437\n#define TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS           0x0438\n#define TT_MS_LANGID_HINDI_INDIA                       0x0439\n#define TT_MS_LANGID_MALTESE_MALTA                     0x043a\n  /* Added by XPsp2 Platform SDK (2004-07-26) */\n#define TT_MS_LANGID_SAMI_NORTHERN_NORWAY              0x043b\n#define TT_MS_LANGID_SAMI_NORTHERN_SWEDEN              0x083b\n#define TT_MS_LANGID_SAMI_NORTHERN_FINLAND             0x0C3b\n#define TT_MS_LANGID_SAMI_LULE_NORWAY                  0x103b\n#define TT_MS_LANGID_SAMI_LULE_SWEDEN                  0x143b\n#define TT_MS_LANGID_SAMI_SOUTHERN_NORWAY              0x183b\n#define TT_MS_LANGID_SAMI_SOUTHERN_SWEDEN              0x1C3b\n#define TT_MS_LANGID_SAMI_SKOLT_FINLAND                0x203b\n#define TT_MS_LANGID_SAMI_INARI_FINLAND                0x243b\n  /* ... and we also keep our old identifier... */\n#define TT_MS_LANGID_SAAMI_LAPONIA                     0x043b\n\n#if 0 /* this seems to be a previous inversion */\n#define TT_MS_LANGID_IRISH_GAELIC_IRELAND              0x043c\n#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM    0x083c\n#else\n#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM    0x083c\n#define TT_MS_LANGID_IRISH_GAELIC_IRELAND              0x043c\n#endif\n\n#define TT_MS_LANGID_YIDDISH_GERMANY                   0x043d\n#define TT_MS_LANGID_MALAY_MALAYSIA                    0x043e\n#define TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM           0x083e\n#define TT_MS_LANGID_KAZAK_KAZAKSTAN                   0x043f\n#define TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN /* Cyrillic*/ 0x0440\n  /* alias declared in Windows 2000 */\n#define TT_MS_LANGID_KIRGHIZ_KIRGHIZ_REPUBLIC \\\n          TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN\n\n#define TT_MS_LANGID_SWAHILI_KENYA                     0x0441\n#define TT_MS_LANGID_TURKMEN_TURKMENISTAN              0x0442\n#define TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN            0x0443\n#define TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC         0x0843\n#define TT_MS_LANGID_TATAR_TATARSTAN                   0x0444\n#define TT_MS_LANGID_BENGALI_INDIA                     0x0445\n#define TT_MS_LANGID_BENGALI_BANGLADESH                0x0845\n#define TT_MS_LANGID_PUNJABI_INDIA                     0x0446\n#define TT_MS_LANGID_PUNJABI_ARABIC_PAKISTAN           0x0846\n#define TT_MS_LANGID_GUJARATI_INDIA                    0x0447\n#define TT_MS_LANGID_ORIYA_INDIA                       0x0448\n#define TT_MS_LANGID_TAMIL_INDIA                       0x0449\n#define TT_MS_LANGID_TELUGU_INDIA                      0x044a\n#define TT_MS_LANGID_KANNADA_INDIA                     0x044b\n#define TT_MS_LANGID_MALAYALAM_INDIA                   0x044c\n#define TT_MS_LANGID_ASSAMESE_INDIA                    0x044d\n#define TT_MS_LANGID_MARATHI_INDIA                     0x044e\n#define TT_MS_LANGID_SANSKRIT_INDIA                    0x044f\n#define TT_MS_LANGID_MONGOLIAN_MONGOLIA /* Cyrillic */ 0x0450\n#define TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN      0x0850\n#define TT_MS_LANGID_TIBETAN_CHINA                     0x0451\n  /* Don't use the next constant!  It has            */\n  /*   (1) the wrong spelling (Dzonghka)             */\n  /*   (2) Microsoft doesn't officially define it -- */\n  /*       at least it is not in the List of Local   */\n  /*       ID Values.                                */\n  /*   (3) Dzongkha is not the same language as      */\n  /*       Tibetan, so merging it is wrong anyway.   */\n  /*                                                 */\n  /* TT_MS_LANGID_TIBETAN_BHUTAN is correct, BTW.    */\n#define TT_MS_LANGID_DZONGHKA_BHUTAN                   0x0851\n\n#if 0\n  /* the following used to be defined */\n#define TT_MS_LANGID_TIBETAN_BHUTAN                    0x0451\n  /* ... but it was changed; */\n#else\n  /* So we will continue to #define it, but with the correct value */\n#define TT_MS_LANGID_TIBETAN_BHUTAN   TT_MS_LANGID_DZONGHKA_BHUTAN\n#endif\n\n#define TT_MS_LANGID_WELSH_WALES                       0x0452\n#define TT_MS_LANGID_KHMER_CAMBODIA                    0x0453\n#define TT_MS_LANGID_LAO_LAOS                          0x0454\n#define TT_MS_LANGID_BURMESE_MYANMAR                   0x0455\n#define TT_MS_LANGID_GALICIAN_SPAIN                    0x0456\n#define TT_MS_LANGID_KONKANI_INDIA                     0x0457\n#define TT_MS_LANGID_MANIPURI_INDIA  /* Bengali */     0x0458\n#define TT_MS_LANGID_SINDHI_INDIA /* Arabic */         0x0459\n#define TT_MS_LANGID_SINDHI_PAKISTAN                   0x0859\n  /* Missing a LCID for Sindhi in Devanagari script */\n#define TT_MS_LANGID_SYRIAC_SYRIA                      0x045a\n#define TT_MS_LANGID_SINHALESE_SRI_LANKA               0x045b\n#define TT_MS_LANGID_CHEROKEE_UNITED_STATES            0x045c\n#define TT_MS_LANGID_INUKTITUT_CANADA                  0x045d\n#define TT_MS_LANGID_AMHARIC_ETHIOPIA                  0x045e\n#define TT_MS_LANGID_TAMAZIGHT_MOROCCO /* Arabic */    0x045f\n#define TT_MS_LANGID_TAMAZIGHT_MOROCCO_LATIN           0x085f\n  /* Missing a LCID for Tifinagh script */\n#define TT_MS_LANGID_KASHMIRI_PAKISTAN /* Arabic */    0x0460\n  /* Spelled this way by XPsp2 Platform SDK (2004-07-26) */\n  /* script is yet unclear... might be Arabic, Nagari or Sharada */\n#define TT_MS_LANGID_KASHMIRI_SASIA                    0x0860\n  /* ... and aliased (by MS) for compatibility reasons. */\n#define TT_MS_LANGID_KASHMIRI_INDIA TT_MS_LANGID_KASHMIRI_SASIA\n#define TT_MS_LANGID_NEPALI_NEPAL                      0x0461\n#define TT_MS_LANGID_NEPALI_INDIA                      0x0861\n#define TT_MS_LANGID_FRISIAN_NETHERLANDS               0x0462\n#define TT_MS_LANGID_PASHTO_AFGHANISTAN                0x0463\n#define TT_MS_LANGID_FILIPINO_PHILIPPINES              0x0464\n#define TT_MS_LANGID_DHIVEHI_MALDIVES                  0x0465\n  /* alias declared in Windows 2000 */\n#define TT_MS_LANGID_DIVEHI_MALDIVES  TT_MS_LANGID_DHIVEHI_MALDIVES\n#define TT_MS_LANGID_EDO_NIGERIA                       0x0466\n#define TT_MS_LANGID_FULFULDE_NIGERIA                  0x0467\n#define TT_MS_LANGID_HAUSA_NIGERIA                     0x0468\n#define TT_MS_LANGID_IBIBIO_NIGERIA                    0x0469\n#define TT_MS_LANGID_YORUBA_NIGERIA                    0x046a\n#define TT_MS_LANGID_QUECHUA_BOLIVIA                   0x046b\n#define TT_MS_LANGID_QUECHUA_ECUADOR                   0x086b\n#define TT_MS_LANGID_QUECHUA_PERU                      0x0c6b\n#define TT_MS_LANGID_SEPEDI_SOUTH_AFRICA               0x046c\n  /* Also spelled by XPsp2 Platform SDK (2004-07-26) */\n#define TT_MS_LANGID_SOTHO_SOUTHERN_SOUTH_AFRICA \\\n          TT_MS_LANGID_SEPEDI_SOUTH_AFRICA\n  /* language codes 0x046d, 0x046e and 0x046f are (still) unknown. */\n#define TT_MS_LANGID_IGBO_NIGERIA                      0x0470\n#define TT_MS_LANGID_KANURI_NIGERIA                    0x0471\n#define TT_MS_LANGID_OROMO_ETHIOPIA                    0x0472\n#define TT_MS_LANGID_TIGRIGNA_ETHIOPIA                 0x0473\n#define TT_MS_LANGID_TIGRIGNA_ERYTHREA                 0x0873\n  /* also spelled in the `Passport SDK' list as: */\n#define TT_MS_LANGID_TIGRIGNA_ERYTREA  TT_MS_LANGID_TIGRIGNA_ERYTHREA\n#define TT_MS_LANGID_GUARANI_PARAGUAY                  0x0474\n#define TT_MS_LANGID_HAWAIIAN_UNITED_STATES            0x0475\n#define TT_MS_LANGID_LATIN                             0x0476\n#define TT_MS_LANGID_SOMALI_SOMALIA                    0x0477\n  /* Note: Yi does not have a (proper) ISO 639-2 code, since it is mostly */\n  /*       not written (but OTOH the peculiar writing system is worth     */\n  /*       studying).                                                     */\n#define TT_MS_LANGID_YI_CHINA                          0x0478\n#define TT_MS_LANGID_PAPIAMENTU_NETHERLANDS_ANTILLES   0x0479\n  /* language codes from 0x047a to 0x047f are (still) unknown. */\n#define TT_MS_LANGID_UIGHUR_CHINA                      0x0480\n#define TT_MS_LANGID_MAORI_NEW_ZEALAND                 0x0481\n\n#if 0  /* not deemed useful for fonts */\n#define TT_MS_LANGID_HUMAN_INTERFACE_DEVICE            0x04ff\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Possible values of the `name' identifier field in the name records of */\n  /* the TTF `name' table.  These values are platform independent.         */\n  /*                                                                       */\n#define TT_NAME_ID_COPYRIGHT            0\n#define TT_NAME_ID_FONT_FAMILY          1\n#define TT_NAME_ID_FONT_SUBFAMILY       2\n#define TT_NAME_ID_UNIQUE_ID            3\n#define TT_NAME_ID_FULL_NAME            4\n#define TT_NAME_ID_VERSION_STRING       5\n#define TT_NAME_ID_PS_NAME              6\n#define TT_NAME_ID_TRADEMARK            7\n\n  /* the following values are from the OpenType spec */\n#define TT_NAME_ID_MANUFACTURER         8\n#define TT_NAME_ID_DESIGNER             9\n#define TT_NAME_ID_DESCRIPTION          10\n#define TT_NAME_ID_VENDOR_URL           11\n#define TT_NAME_ID_DESIGNER_URL         12\n#define TT_NAME_ID_LICENSE              13\n#define TT_NAME_ID_LICENSE_URL          14\n  /* number 15 is reserved */\n#define TT_NAME_ID_PREFERRED_FAMILY     16\n#define TT_NAME_ID_PREFERRED_SUBFAMILY  17\n#define TT_NAME_ID_MAC_FULL_NAME        18\n\n  /* The following code is new as of 2000-01-21 */\n#define TT_NAME_ID_SAMPLE_TEXT          19\n\n  /* This is new in OpenType 1.3 */\n#define TT_NAME_ID_CID_FINDFONT_NAME    20\n\n  /* This is new in OpenType 1.5 */\n#define TT_NAME_ID_WWS_FAMILY           21\n#define TT_NAME_ID_WWS_SUBFAMILY        22\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Bit mask values for the Unicode Ranges from the TTF `OS2 ' table.     */\n  /*                                                                       */\n  /* Updated 08-Nov-2008.                                                  */\n  /*                                                                       */\n\n  /* Bit  0   Basic Latin */\n#define TT_UCR_BASIC_LATIN                     (1L <<  0) /* U+0020-U+007E */\n  /* Bit  1   C1 Controls and Latin-1 Supplement */\n#define TT_UCR_LATIN1_SUPPLEMENT               (1L <<  1) /* U+0080-U+00FF */\n  /* Bit  2   Latin Extended-A */\n#define TT_UCR_LATIN_EXTENDED_A                (1L <<  2) /* U+0100-U+017F */\n  /* Bit  3   Latin Extended-B */\n#define TT_UCR_LATIN_EXTENDED_B                (1L <<  3) /* U+0180-U+024F */\n  /* Bit  4   IPA Extensions                 */\n  /*          Phonetic Extensions            */\n  /*          Phonetic Extensions Supplement */\n#define TT_UCR_IPA_EXTENSIONS                  (1L <<  4) /* U+0250-U+02AF */\n                                                          /* U+1D00-U+1D7F */\n                                                          /* U+1D80-U+1DBF */\n  /* Bit  5   Spacing Modifier Letters */\n  /*          Modifier Tone Letters    */\n#define TT_UCR_SPACING_MODIFIER                (1L <<  5) /* U+02B0-U+02FF */\n                                                          /* U+A700-U+A71F */\n  /* Bit  6   Combining Diacritical Marks            */\n  /*          Combining Diacritical Marks Supplement */\n#define TT_UCR_COMBINING_DIACRITICS            (1L <<  6) /* U+0300-U+036F */\n                                                          /* U+1DC0-U+1DFF */\n  /* Bit  7   Greek and Coptic */\n#define TT_UCR_GREEK                           (1L <<  7) /* U+0370-U+03FF */\n  /* Bit  8   Coptic */\n#define TT_UCR_COPTIC                          (1L <<  8) /* U+2C80-U+2CFF */\n  /* Bit  9   Cyrillic            */\n  /*          Cyrillic Supplement */\n  /*          Cyrillic Extended-A */\n  /*          Cyrillic Extended-B */\n#define TT_UCR_CYRILLIC                        (1L <<  9) /* U+0400-U+04FF */\n                                                          /* U+0500-U+052F */\n                                                          /* U+2DE0-U+2DFF */\n                                                          /* U+A640-U+A69F */\n  /* Bit 10   Armenian */\n#define TT_UCR_ARMENIAN                        (1L << 10) /* U+0530-U+058F */\n  /* Bit 11   Hebrew */\n#define TT_UCR_HEBREW                          (1L << 11) /* U+0590-U+05FF */\n  /* Bit 12   Vai */\n#define TT_UCR_VAI                             (1L << 12) /* U+A500-U+A63F */\n  /* Bit 13   Arabic            */\n  /*          Arabic Supplement */\n#define TT_UCR_ARABIC                          (1L << 13) /* U+0600-U+06FF */\n                                                          /* U+0750-U+077F */\n  /* Bit 14   NKo */\n#define TT_UCR_NKO                             (1L << 14) /* U+07C0-U+07FF */\n  /* Bit 15   Devanagari */\n#define TT_UCR_DEVANAGARI                      (1L << 15) /* U+0900-U+097F */\n  /* Bit 16   Bengali */\n#define TT_UCR_BENGALI                         (1L << 16) /* U+0980-U+09FF */\n  /* Bit 17   Gurmukhi */\n#define TT_UCR_GURMUKHI                        (1L << 17) /* U+0A00-U+0A7F */\n  /* Bit 18   Gujarati */\n#define TT_UCR_GUJARATI                        (1L << 18) /* U+0A80-U+0AFF */\n  /* Bit 19   Oriya */\n#define TT_UCR_ORIYA                           (1L << 19) /* U+0B00-U+0B7F */\n  /* Bit 20   Tamil */\n#define TT_UCR_TAMIL                           (1L << 20) /* U+0B80-U+0BFF */\n  /* Bit 21   Telugu */\n#define TT_UCR_TELUGU                          (1L << 21) /* U+0C00-U+0C7F */\n  /* Bit 22   Kannada */\n#define TT_UCR_KANNADA                         (1L << 22) /* U+0C80-U+0CFF */\n  /* Bit 23   Malayalam */\n#define TT_UCR_MALAYALAM                       (1L << 23) /* U+0D00-U+0D7F */\n  /* Bit 24   Thai */\n#define TT_UCR_THAI                            (1L << 24) /* U+0E00-U+0E7F */\n  /* Bit 25   Lao */\n#define TT_UCR_LAO                             (1L << 25) /* U+0E80-U+0EFF */\n  /* Bit 26   Georgian            */\n  /*          Georgian Supplement */\n#define TT_UCR_GEORGIAN                        (1L << 26) /* U+10A0-U+10FF */\n                                                          /* U+2D00-U+2D2F */\n  /* Bit 27   Balinese */\n#define TT_UCR_BALINESE                        (1L << 27) /* U+1B00-U+1B7F */\n  /* Bit 28   Hangul Jamo */\n#define TT_UCR_HANGUL_JAMO                     (1L << 28) /* U+1100-U+11FF */\n  /* Bit 29   Latin Extended Additional */\n  /*          Latin Extended-C          */\n  /*          Latin Extended-D          */\n#define TT_UCR_LATIN_EXTENDED_ADDITIONAL       (1L << 29) /* U+1E00-U+1EFF */\n                                                          /* U+2C60-U+2C7F */\n                                                          /* U+A720-U+A7FF */\n  /* Bit 30   Greek Extended */\n#define TT_UCR_GREEK_EXTENDED                  (1L << 30) /* U+1F00-U+1FFF */\n  /* Bit 31   General Punctuation      */\n  /*          Supplemental Punctuation */\n#define TT_UCR_GENERAL_PUNCTUATION             (1L << 31) /* U+2000-U+206F */\n                                                          /* U+2E00-U+2E7F */\n  /* Bit 32   Superscripts And Subscripts */\n#define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS         (1L <<  0) /* U+2070-U+209F */\n  /* Bit 33   Currency Symbols */\n#define TT_UCR_CURRENCY_SYMBOLS                (1L <<  1) /* U+20A0-U+20CF */\n  /* Bit 34   Combining Diacritical Marks For Symbols */\n#define TT_UCR_COMBINING_DIACRITICS_SYMB       (1L <<  2) /* U+20D0-U+20FF */\n  /* Bit 35   Letterlike Symbols */\n#define TT_UCR_LETTERLIKE_SYMBOLS              (1L <<  3) /* U+2100-U+214F */\n  /* Bit 36   Number Forms */\n#define TT_UCR_NUMBER_FORMS                    (1L <<  4) /* U+2150-U+218F */\n  /* Bit 37   Arrows                           */\n  /*          Supplemental Arrows-A            */\n  /*          Supplemental Arrows-B            */\n  /*          Miscellaneous Symbols and Arrows */\n#define TT_UCR_ARROWS                          (1L <<  5) /* U+2190-U+21FF */\n                                                          /* U+27F0-U+27FF */\n                                                          /* U+2900-U+297F */\n                                                          /* U+2B00-U+2BFF */\n  /* Bit 38   Mathematical Operators               */\n  /*          Supplemental Mathematical Operators  */\n  /*          Miscellaneous Mathematical Symbols-A */\n  /*          Miscellaneous Mathematical Symbols-B */\n#define TT_UCR_MATHEMATICAL_OPERATORS          (1L <<  6) /* U+2200-U+22FF */\n                                                          /* U+2A00-U+2AFF */\n                                                          /* U+27C0-U+27EF */\n                                                          /* U+2980-U+29FF */\n  /* Bit 39 Miscellaneous Technical */\n#define TT_UCR_MISCELLANEOUS_TECHNICAL         (1L <<  7) /* U+2300-U+23FF */\n  /* Bit 40   Control Pictures */\n#define TT_UCR_CONTROL_PICTURES                (1L <<  8) /* U+2400-U+243F */\n  /* Bit 41   Optical Character Recognition */\n#define TT_UCR_OCR                             (1L <<  9) /* U+2440-U+245F */\n  /* Bit 42   Enclosed Alphanumerics */\n#define TT_UCR_ENCLOSED_ALPHANUMERICS          (1L << 10) /* U+2460-U+24FF */\n  /* Bit 43   Box Drawing */\n#define TT_UCR_BOX_DRAWING                     (1L << 11) /* U+2500-U+257F */\n  /* Bit 44   Block Elements */\n#define TT_UCR_BLOCK_ELEMENTS                  (1L << 12) /* U+2580-U+259F */\n  /* Bit 45   Geometric Shapes */\n#define TT_UCR_GEOMETRIC_SHAPES                (1L << 13) /* U+25A0-U+25FF */\n  /* Bit 46   Miscellaneous Symbols */\n#define TT_UCR_MISCELLANEOUS_SYMBOLS           (1L << 14) /* U+2600-U+26FF */\n  /* Bit 47   Dingbats */\n#define TT_UCR_DINGBATS                        (1L << 15) /* U+2700-U+27BF */\n  /* Bit 48   CJK Symbols and Punctuation */\n#define TT_UCR_CJK_SYMBOLS                     (1L << 16) /* U+3000-U+303F */\n  /* Bit 49   Hiragana */\n#define TT_UCR_HIRAGANA                        (1L << 17) /* U+3040-U+309F */\n  /* Bit 50   Katakana                     */\n  /*          Katakana Phonetic Extensions */\n#define TT_UCR_KATAKANA                        (1L << 18) /* U+30A0-U+30FF */\n                                                          /* U+31F0-U+31FF */\n  /* Bit 51   Bopomofo          */\n  /*          Bopomofo Extended */\n#define TT_UCR_BOPOMOFO                        (1L << 19) /* U+3100-U+312F */\n                                                          /* U+31A0-U+31BF */\n  /* Bit 52   Hangul Compatibility Jamo */\n#define TT_UCR_HANGUL_COMPATIBILITY_JAMO       (1L << 20) /* U+3130-U+318F */\n  /* Bit 53   Phags-Pa */\n#define TT_UCR_CJK_MISC                        (1L << 21) /* U+A840-U+A87F */\n#define TT_UCR_KANBUN  TT_UCR_CJK_MISC /* deprecated */\n#define TT_UCR_PHAGSPA\n  /* Bit 54   Enclosed CJK Letters and Months */\n#define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS     (1L << 22) /* U+3200-U+32FF */\n  /* Bit 55   CJK Compatibility */\n#define TT_UCR_CJK_COMPATIBILITY               (1L << 23) /* U+3300-U+33FF */\n  /* Bit 56   Hangul Syllables */\n#define TT_UCR_HANGUL                          (1L << 24) /* U+AC00-U+D7A3 */\n  /* Bit 57   High Surrogates              */\n  /*          High Private Use Surrogates  */\n  /*          Low Surrogates               */\n  /*                                       */\n  /* According to OpenType specs v.1.3+,   */\n  /* setting bit 57 implies that there is  */\n  /* at least one codepoint beyond the     */\n  /* Basic Multilingual Plane that is      */\n  /* supported by this font.  So it really */\n  /* means >= U+10000                      */\n#define TT_UCR_SURROGATES                      (1L << 25) /* U+D800-U+DB7F */\n                                                          /* U+DB80-U+DBFF */\n                                                          /* U+DC00-U+DFFF */\n#define TT_UCR_NON_PLANE_0  TT_UCR_SURROGATES\n  /* Bit 58  Phoenician */\n#define TT_UCR_PHOENICIAN                      (1L << 26) /*U+10900-U+1091F*/\n  /* Bit 59   CJK Unified Ideographs             */\n  /*          CJK Radicals Supplement            */\n  /*          Kangxi Radicals                    */\n  /*          Ideographic Description Characters */\n  /*          CJK Unified Ideographs Extension A */\n  /*          CJK Unified Ideographs Extension B */\n  /*          Kanbun                             */\n#define TT_UCR_CJK_UNIFIED_IDEOGRAPHS          (1L << 27) /* U+4E00-U+9FFF */\n                                                          /* U+2E80-U+2EFF */\n                                                          /* U+2F00-U+2FDF */\n                                                          /* U+2FF0-U+2FFF */\n                                                          /* U+3400-U+4DB5 */\n                                                          /*U+20000-U+2A6DF*/\n                                                          /* U+3190-U+319F */\n  /* Bit 60   Private Use */\n#define TT_UCR_PRIVATE_USE                     (1L << 28) /* U+E000-U+F8FF */\n  /* Bit 61   CJK Strokes                             */\n  /*          CJK Compatibility Ideographs            */\n  /*          CJK Compatibility Ideographs Supplement */\n#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS    (1L << 29) /* U+31C0-U+31EF */\n                                                          /* U+F900-U+FAFF */\n                                                          /*U+2F800-U+2FA1F*/\n  /* Bit 62   Alphabetic Presentation Forms */\n#define TT_UCR_ALPHABETIC_PRESENTATION_FORMS   (1L << 30) /* U+FB00-U+FB4F */\n  /* Bit 63   Arabic Presentation Forms-A */\n#define TT_UCR_ARABIC_PRESENTATIONS_A          (1L << 31) /* U+FB50-U+FDFF */\n  /* Bit 64   Combining Half Marks */\n#define TT_UCR_COMBINING_HALF_MARKS            (1L <<  0) /* U+FE20-U+FE2F */\n  /* Bit 65   Vertical forms          */\n  /*          CJK Compatibility Forms */\n#define TT_UCR_CJK_COMPATIBILITY_FORMS         (1L <<  1) /* U+FE10-U+FE1F */\n                                                          /* U+FE30-U+FE4F */\n  /* Bit 66   Small Form Variants */\n#define TT_UCR_SMALL_FORM_VARIANTS             (1L <<  2) /* U+FE50-U+FE6F */\n  /* Bit 67   Arabic Presentation Forms-B */\n#define TT_UCR_ARABIC_PRESENTATIONS_B          (1L <<  3) /* U+FE70-U+FEFE */\n  /* Bit 68   Halfwidth and Fullwidth Forms */\n#define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS       (1L <<  4) /* U+FF00-U+FFEF */\n  /* Bit 69   Specials */\n#define TT_UCR_SPECIALS                        (1L <<  5) /* U+FFF0-U+FFFD */\n  /* Bit 70   Tibetan */\n#define TT_UCR_TIBETAN                         (1L <<  6) /* U+0F00-U+0FFF */\n  /* Bit 71   Syriac */\n#define TT_UCR_SYRIAC                          (1L <<  7) /* U+0700-U+074F */\n  /* Bit 72   Thaana */\n#define TT_UCR_THAANA                          (1L <<  8) /* U+0780-U+07BF */\n  /* Bit 73   Sinhala */\n#define TT_UCR_SINHALA                         (1L <<  9) /* U+0D80-U+0DFF */\n  /* Bit 74   Myanmar */\n#define TT_UCR_MYANMAR                         (1L << 10) /* U+1000-U+109F */\n  /* Bit 75   Ethiopic            */\n  /*          Ethiopic Supplement */\n  /*          Ethiopic Extended   */\n#define TT_UCR_ETHIOPIC                        (1L << 11) /* U+1200-U+137F */\n                                                          /* U+1380-U+139F */\n                                                          /* U+2D80-U+2DDF */\n  /* Bit 76   Cherokee */\n#define TT_UCR_CHEROKEE                        (1L << 12) /* U+13A0-U+13FF */\n  /* Bit 77   Unified Canadian Aboriginal Syllabics */\n#define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS   (1L << 13) /* U+1400-U+167F */\n  /* Bit 78   Ogham */\n#define TT_UCR_OGHAM                           (1L << 14) /* U+1680-U+169F */\n  /* Bit 79   Runic */\n#define TT_UCR_RUNIC                           (1L << 15) /* U+16A0-U+16FF */\n  /* Bit 80   Khmer         */\n  /*          Khmer Symbols */\n#define TT_UCR_KHMER                           (1L << 16) /* U+1780-U+17FF */\n                                                          /* U+19E0-U+19FF */\n  /* Bit 81   Mongolian */\n#define TT_UCR_MONGOLIAN                       (1L << 17) /* U+1800-U+18AF */\n  /* Bit 82   Braille Patterns */\n#define TT_UCR_BRAILLE                         (1L << 18) /* U+2800-U+28FF */\n  /* Bit 83   Yi Syllables */\n  /*          Yi Radicals  */\n#define TT_UCR_YI                              (1L << 19) /* U+A000-U+A48F */\n                                                          /* U+A490-U+A4CF */\n  /* Bit 84   Tagalog  */\n  /*          Hanunoo  */\n  /*          Buhid    */\n  /*          Tagbanwa */\n#define TT_UCR_PHILIPPINE                      (1L << 20) /* U+1700-U+171F */\n                                                          /* U+1720-U+173F */\n                                                          /* U+1740-U+175F */\n                                                          /* U+1760-U+177F */\n  /* Bit 85   Old Italic */\n#define TT_UCR_OLD_ITALIC                      (1L << 21) /*U+10300-U+1032F*/\n  /* Bit 86   Gothic */\n#define TT_UCR_GOTHIC                          (1L << 22) /*U+10330-U+1034F*/\n  /* Bit 87   Deseret */\n#define TT_UCR_DESERET                         (1L << 23) /*U+10400-U+1044F*/\n  /* Bit 88   Byzantine Musical Symbols      */\n  /*          Musical Symbols                */\n  /*          Ancient Greek Musical Notation */\n#define TT_UCR_MUSICAL_SYMBOLS                 (1L << 24) /*U+1D000-U+1D0FF*/\n                                                          /*U+1D100-U+1D1FF*/\n                                                          /*U+1D200-U+1D24F*/\n  /* Bit 89   Mathematical Alphanumeric Symbols */\n#define TT_UCR_MATH_ALPHANUMERIC_SYMBOLS       (1L << 25) /*U+1D400-U+1D7FF*/\n  /* Bit 90   Private Use (plane 15) */\n  /*          Private Use (plane 16) */\n#define TT_UCR_PRIVATE_USE_SUPPLEMENTARY       (1L << 26) /*U+F0000-U+FFFFD*/\n                                                        /*U+100000-U+10FFFD*/\n  /* Bit 91   Variation Selectors            */\n  /*          Variation Selectors Supplement */\n#define TT_UCR_VARIATION_SELECTORS             (1L << 27) /* U+FE00-U+FE0F */\n                                                          /*U+E0100-U+E01EF*/\n  /* Bit 92   Tags */\n#define TT_UCR_TAGS                            (1L << 28) /*U+E0000-U+E007F*/\n  /* Bit 93   Limbu */\n#define TT_UCR_LIMBU                           (1L << 29) /* U+1900-U+194F */\n  /* Bit 94   Tai Le */\n#define TT_UCR_TAI_LE                          (1L << 30) /* U+1950-U+197F */\n  /* Bit 95   New Tai Lue */\n#define TT_UCR_NEW_TAI_LUE                     (1L << 31) /* U+1980-U+19DF */\n  /* Bit 96   Buginese */\n#define TT_UCR_BUGINESE                        (1L <<  0) /* U+1A00-U+1A1F */\n  /* Bit 97   Glagolitic */\n#define TT_UCR_GLAGOLITIC                      (1L <<  1) /* U+2C00-U+2C5F */\n  /* Bit 98   Tifinagh */\n#define TT_UCR_TIFINAGH                        (1L <<  2) /* U+2D30-U+2D7F */\n  /* Bit 99   Yijing Hexagram Symbols */\n#define TT_UCR_YIJING                          (1L <<  3) /* U+4DC0-U+4DFF */\n  /* Bit 100  Syloti Nagri */\n#define TT_UCR_SYLOTI_NAGRI                    (1L <<  4) /* U+A800-U+A82F */\n  /* Bit 101  Linear B Syllabary */\n  /*          Linear B Ideograms */\n  /*          Aegean Numbers     */\n#define TT_UCR_LINEAR_B                        (1L <<  5) /*U+10000-U+1007F*/\n                                                          /*U+10080-U+100FF*/\n                                                          /*U+10100-U+1013F*/\n  /* Bit 102  Ancient Greek Numbers */\n#define TT_UCR_ANCIENT_GREEK_NUMBERS           (1L <<  6) /*U+10140-U+1018F*/\n  /* Bit 103  Ugaritic */\n#define TT_UCR_UGARITIC                        (1L <<  7) /*U+10380-U+1039F*/\n  /* Bit 104  Old Persian */\n#define TT_UCR_OLD_PERSIAN                     (1L <<  8) /*U+103A0-U+103DF*/\n  /* Bit 105  Shavian */\n#define TT_UCR_SHAVIAN                         (1L <<  9) /*U+10450-U+1047F*/\n  /* Bit 106  Osmanya */\n#define TT_UCR_OSMANYA                         (1L << 10) /*U+10480-U+104AF*/\n  /* Bit 107  Cypriot Syllabary */\n#define TT_UCR_CYPRIOT_SYLLABARY               (1L << 11) /*U+10800-U+1083F*/\n  /* Bit 108  Kharoshthi */\n#define TT_UCR_KHAROSHTHI                      (1L << 12) /*U+10A00-U+10A5F*/\n  /* Bit 109  Tai Xuan Jing Symbols */\n#define TT_UCR_TAI_XUAN_JING                   (1L << 13) /*U+1D300-U+1D35F*/\n  /* Bit 110  Cuneiform                         */\n  /*          Cuneiform Numbers and Punctuation */\n#define TT_UCR_CUNEIFORM                       (1L << 14) /*U+12000-U+123FF*/\n                                                          /*U+12400-U+1247F*/\n  /* Bit 111  Counting Rod Numerals */\n#define TT_UCR_COUNTING_ROD_NUMERALS           (1L << 15) /*U+1D360-U+1D37F*/\n  /* Bit 112  Sundanese */\n#define TT_UCR_SUNDANESE                       (1L << 16) /* U+1B80-U+1BBF */\n  /* Bit 113  Lepcha */\n#define TT_UCR_LEPCHA                          (1L << 17) /* U+1C00-U+1C4F */\n  /* Bit 114  Ol Chiki */\n#define TT_UCR_OL_CHIKI                        (1L << 18) /* U+1C50-U+1C7F */\n  /* Bit 115  Saurashtra */\n#define TT_UCR_SAURASHTRA                      (1L << 19) /* U+A880-U+A8DF */\n  /* Bit 116  Kayah Li */\n#define TT_UCR_KAYAH_LI                        (1L << 20) /* U+A900-U+A92F */\n  /* Bit 117  Rejang */\n#define TT_UCR_REJANG                          (1L << 21) /* U+A930-U+A95F */\n  /* Bit 118  Cham */\n#define TT_UCR_CHAM                            (1L << 22) /* U+AA00-U+AA5F */\n  /* Bit 119  Ancient Symbols */\n#define TT_UCR_ANCIENT_SYMBOLS                 (1L << 23) /*U+10190-U+101CF*/\n  /* Bit 120  Phaistos Disc */\n#define TT_UCR_PHAISTOS_DISC                   (1L << 24) /*U+101D0-U+101FF*/\n  /* Bit 121  Carian */\n  /*          Lycian */\n  /*          Lydian */\n#define TT_UCR_OLD_ANATOLIAN                   (1L << 25) /*U+102A0-U+102DF*/\n                                                          /*U+10280-U+1029F*/\n                                                          /*U+10920-U+1093F*/\n  /* Bit 122  Domino Tiles  */\n  /*          Mahjong Tiles */\n#define TT_UCR_GAME_TILES                      (1L << 26) /*U+1F030-U+1F09F*/\n                                                          /*U+1F000-U+1F02F*/\n  /* Bit 123-127 Reserved for process-internal usage */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Some compilers have a very limited length of identifiers.             */\n  /*                                                                       */\n#if defined( __TURBOC__ ) && __TURBOC__ < 0x0410 || defined( __PACIFIC__ )\n#define HAVE_LIMIT_ON_IDENTS\n#endif\n\n\n#ifndef HAVE_LIMIT_ON_IDENTS\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Here some alias #defines in order to be clearer.                      */\n  /*                                                                       */\n  /* These are not always #defined to stay within the 31~character limit   */\n  /* which some compilers have.                                            */\n  /*                                                                       */\n  /* Credits go to Dave Hoo <dhoo@flash.net> for pointing out that modern  */\n  /* Borland compilers (read: from BC++ 3.1 on) can increase this limit.   */\n  /* If you get a warning with such a compiler, use the -i40 switch.       */\n  /*                                                                       */\n#define TT_UCR_ARABIC_PRESENTATION_FORMS_A      \\\n         TT_UCR_ARABIC_PRESENTATIONS_A\n#define TT_UCR_ARABIC_PRESENTATION_FORMS_B      \\\n         TT_UCR_ARABIC_PRESENTATIONS_B\n\n#define TT_UCR_COMBINING_DIACRITICAL_MARKS      \\\n         TT_UCR_COMBINING_DIACRITICS\n#define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \\\n         TT_UCR_COMBINING_DIACRITICS_SYMB\n\n\n#endif /* !HAVE_LIMIT_ON_IDENTS */\n\n\nFT_END_HEADER\n\n#endif /* __TTNAMEID_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/tttables.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  tttables.h                                                             */\n/*                                                                         */\n/*    Basic SFNT/TrueType tables definitions and interface                 */\n/*    (specification only).                                                */\n/*                                                                         */\n/*  Copyright 1996-2005, 2008-2012 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTTABLES_H__\n#define __TTTABLES_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    truetype_tables                                                    */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    TrueType Tables                                                    */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    TrueType specific table types and functions.                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the definition of TrueType-specific tables   */\n  /*    as well as some routines used to access and process them.          */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_Header                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a TrueType font header table.  All       */\n  /*    fields follow the TrueType specification.                          */\n  /*                                                                       */\n  typedef struct  TT_Header_\n  {\n    FT_Fixed   Table_Version;\n    FT_Fixed   Font_Revision;\n\n    FT_Long    CheckSum_Adjust;\n    FT_Long    Magic_Number;\n\n    FT_UShort  Flags;\n    FT_UShort  Units_Per_EM;\n\n    FT_Long    Created [2];\n    FT_Long    Modified[2];\n\n    FT_Short   xMin;\n    FT_Short   yMin;\n    FT_Short   xMax;\n    FT_Short   yMax;\n\n    FT_UShort  Mac_Style;\n    FT_UShort  Lowest_Rec_PPEM;\n\n    FT_Short   Font_Direction;\n    FT_Short   Index_To_Loc_Format;\n    FT_Short   Glyph_Data_Format;\n\n  } TT_Header;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_HoriHeader                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a TrueType horizontal header, the `hhea' */\n  /*    table, as well as the corresponding horizontal metrics table,      */\n  /*    i.e., the `hmtx' table.                                            */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    Version                :: The table version.                       */\n  /*                                                                       */\n  /*    Ascender               :: The font's ascender, i.e., the distance  */\n  /*                              from the baseline to the top-most of all */\n  /*                              glyph points found in the font.          */\n  /*                                                                       */\n  /*                              This value is invalid in many fonts, as  */\n  /*                              it is usually set by the font designer,  */\n  /*                              and often reflects only a portion of the */\n  /*                              glyphs found in the font (maybe ASCII).  */\n  /*                                                                       */\n  /*                              You should use the `sTypoAscender' field */\n  /*                              of the OS/2 table instead if you want    */\n  /*                              the correct one.                         */\n  /*                                                                       */\n  /*    Descender              :: The font's descender, i.e., the distance */\n  /*                              from the baseline to the bottom-most of  */\n  /*                              all glyph points found in the font.  It  */\n  /*                              is negative.                             */\n  /*                                                                       */\n  /*                              This value is invalid in many fonts, as  */\n  /*                              it is usually set by the font designer,  */\n  /*                              and often reflects only a portion of the */\n  /*                              glyphs found in the font (maybe ASCII).  */\n  /*                                                                       */\n  /*                              You should use the `sTypoDescender'      */\n  /*                              field of the OS/2 table instead if you   */\n  /*                              want the correct one.                    */\n  /*                                                                       */\n  /*    Line_Gap               :: The font's line gap, i.e., the distance  */\n  /*                              to add to the ascender and descender to  */\n  /*                              get the BTB, i.e., the                   */\n  /*                              baseline-to-baseline distance for the    */\n  /*                              font.                                    */\n  /*                                                                       */\n  /*    advance_Width_Max      :: This field is the maximum of all advance */\n  /*                              widths found in the font.  It can be     */\n  /*                              used to compute the maximum width of an  */\n  /*                              arbitrary string of text.                */\n  /*                                                                       */\n  /*    min_Left_Side_Bearing  :: The minimum left side bearing of all     */\n  /*                              glyphs within the font.                  */\n  /*                                                                       */\n  /*    min_Right_Side_Bearing :: The minimum right side bearing of all    */\n  /*                              glyphs within the font.                  */\n  /*                                                                       */\n  /*    xMax_Extent            :: The maximum horizontal extent (i.e., the */\n  /*                              `width' of a glyph's bounding box) for   */\n  /*                              all glyphs in the font.                  */\n  /*                                                                       */\n  /*    caret_Slope_Rise       :: The rise coefficient of the cursor's     */\n  /*                              slope of the cursor (slope=rise/run).    */\n  /*                                                                       */\n  /*    caret_Slope_Run        :: The run coefficient of the cursor's      */\n  /*                              slope.                                   */\n  /*                                                                       */\n  /*    Reserved               :: 8~reserved bytes.                        */\n  /*                                                                       */\n  /*    metric_Data_Format     :: Always~0.                                */\n  /*                                                                       */\n  /*    number_Of_HMetrics     :: Number of HMetrics entries in the `hmtx' */\n  /*                              table -- this value can be smaller than  */\n  /*                              the total number of glyphs in the font.  */\n  /*                                                                       */\n  /*    long_metrics           :: A pointer into the `hmtx' table.         */\n  /*                                                                       */\n  /*    short_metrics          :: A pointer into the `hmtx' table.         */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should   */\n  /*               be identical except for the names of their fields which */\n  /*               are different.                                          */\n  /*                                                                       */\n  /*               This ensures that a single function in the `ttload'     */\n  /*               module is able to read both the horizontal and vertical */\n  /*               headers.                                                */\n  /*                                                                       */\n  typedef struct  TT_HoriHeader_\n  {\n    FT_Fixed   Version;\n    FT_Short   Ascender;\n    FT_Short   Descender;\n    FT_Short   Line_Gap;\n\n    FT_UShort  advance_Width_Max;      /* advance width maximum */\n\n    FT_Short   min_Left_Side_Bearing;  /* minimum left-sb       */\n    FT_Short   min_Right_Side_Bearing; /* minimum right-sb      */\n    FT_Short   xMax_Extent;            /* xmax extents          */\n    FT_Short   caret_Slope_Rise;\n    FT_Short   caret_Slope_Run;\n    FT_Short   caret_Offset;\n\n    FT_Short   Reserved[4];\n\n    FT_Short   metric_Data_Format;\n    FT_UShort  number_Of_HMetrics;\n\n    /* The following fields are not defined by the TrueType specification */\n    /* but they are used to connect the metrics header to the relevant    */\n    /* `HMTX' table.                                                      */\n\n    void*      long_metrics;\n    void*      short_metrics;\n\n  } TT_HoriHeader;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_VertHeader                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a TrueType vertical header, the `vhea'   */\n  /*    table, as well as the corresponding vertical metrics table, i.e.,  */\n  /*    the `vmtx' table.                                                  */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    Version                 :: The table version.                      */\n  /*                                                                       */\n  /*    Ascender                :: The font's ascender, i.e., the distance */\n  /*                               from the baseline to the top-most of    */\n  /*                               all glyph points found in the font.     */\n  /*                                                                       */\n  /*                               This value is invalid in many fonts, as */\n  /*                               it is usually set by the font designer, */\n  /*                               and often reflects only a portion of    */\n  /*                               the glyphs found in the font (maybe     */\n  /*                               ASCII).                                 */\n  /*                                                                       */\n  /*                               You should use the `sTypoAscender'      */\n  /*                               field of the OS/2 table instead if you  */\n  /*                               want the correct one.                   */\n  /*                                                                       */\n  /*    Descender               :: The font's descender, i.e., the         */\n  /*                               distance from the baseline to the       */\n  /*                               bottom-most of all glyph points found   */\n  /*                               in the font.  It is negative.           */\n  /*                                                                       */\n  /*                               This value is invalid in many fonts, as */\n  /*                               it is usually set by the font designer, */\n  /*                               and often reflects only a portion of    */\n  /*                               the glyphs found in the font (maybe     */\n  /*                               ASCII).                                 */\n  /*                                                                       */\n  /*                               You should use the `sTypoDescender'     */\n  /*                               field of the OS/2 table instead if you  */\n  /*                               want the correct one.                   */\n  /*                                                                       */\n  /*    Line_Gap                :: The font's line gap, i.e., the distance */\n  /*                               to add to the ascender and descender to */\n  /*                               get the BTB, i.e., the                  */\n  /*                               baseline-to-baseline distance for the   */\n  /*                               font.                                   */\n  /*                                                                       */\n  /*    advance_Height_Max      :: This field is the maximum of all        */\n  /*                               advance heights found in the font.  It  */\n  /*                               can be used to compute the maximum      */\n  /*                               height of an arbitrary string of text.  */\n  /*                                                                       */\n  /*    min_Top_Side_Bearing    :: The minimum top side bearing of all     */\n  /*                               glyphs within the font.                 */\n  /*                                                                       */\n  /*    min_Bottom_Side_Bearing :: The minimum bottom side bearing of all  */\n  /*                               glyphs within the font.                 */\n  /*                                                                       */\n  /*    yMax_Extent             :: The maximum vertical extent (i.e., the  */\n  /*                               `height' of a glyph's bounding box) for */\n  /*                               all glyphs in the font.                 */\n  /*                                                                       */\n  /*    caret_Slope_Rise        :: The rise coefficient of the cursor's    */\n  /*                               slope of the cursor (slope=rise/run).   */\n  /*                                                                       */\n  /*    caret_Slope_Run         :: The run coefficient of the cursor's     */\n  /*                               slope.                                  */\n  /*                                                                       */\n  /*    caret_Offset            :: The cursor's offset for slanted fonts.  */\n  /*                               This value is `reserved' in vmtx        */\n  /*                               version 1.0.                            */\n  /*                                                                       */\n  /*    Reserved                :: 8~reserved bytes.                       */\n  /*                                                                       */\n  /*    metric_Data_Format      :: Always~0.                               */\n  /*                                                                       */\n  /*    number_Of_HMetrics      :: Number of VMetrics entries in the       */\n  /*                               `vmtx' table -- this value can be       */\n  /*                               smaller than the total number of glyphs */\n  /*                               in the font.                            */\n  /*                                                                       */\n  /*    long_metrics           :: A pointer into the `vmtx' table.         */\n  /*                                                                       */\n  /*    short_metrics          :: A pointer into the `vmtx' table.         */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should   */\n  /*               be identical except for the names of their fields which */\n  /*               are different.                                          */\n  /*                                                                       */\n  /*               This ensures that a single function in the `ttload'     */\n  /*               module is able to read both the horizontal and vertical */\n  /*               headers.                                                */\n  /*                                                                       */\n  typedef struct  TT_VertHeader_\n  {\n    FT_Fixed   Version;\n    FT_Short   Ascender;\n    FT_Short   Descender;\n    FT_Short   Line_Gap;\n\n    FT_UShort  advance_Height_Max;      /* advance height maximum */\n\n    FT_Short   min_Top_Side_Bearing;    /* minimum left-sb or top-sb       */\n    FT_Short   min_Bottom_Side_Bearing; /* minimum right-sb or bottom-sb   */\n    FT_Short   yMax_Extent;             /* xmax or ymax extents            */\n    FT_Short   caret_Slope_Rise;\n    FT_Short   caret_Slope_Run;\n    FT_Short   caret_Offset;\n\n    FT_Short   Reserved[4];\n\n    FT_Short   metric_Data_Format;\n    FT_UShort  number_Of_VMetrics;\n\n    /* The following fields are not defined by the TrueType specification */\n    /* but they're used to connect the metrics header to the relevant     */\n    /* `HMTX' or `VMTX' table.                                            */\n\n    void*      long_metrics;\n    void*      short_metrics;\n\n  } TT_VertHeader;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_OS2                                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a TrueType OS/2 table. This is the long  */\n  /*    table version.  All fields comply to the TrueType specification.   */\n  /*                                                                       */\n  /*    Note that we now support old Mac fonts which do not include an     */\n  /*    OS/2 table.  In this case, the `version' field is always set to    */\n  /*    0xFFFF.                                                            */\n  /*                                                                       */\n  typedef struct  TT_OS2_\n  {\n    FT_UShort  version;                /* 0x0001 - more or 0xFFFF */\n    FT_Short   xAvgCharWidth;\n    FT_UShort  usWeightClass;\n    FT_UShort  usWidthClass;\n    FT_Short   fsType;\n    FT_Short   ySubscriptXSize;\n    FT_Short   ySubscriptYSize;\n    FT_Short   ySubscriptXOffset;\n    FT_Short   ySubscriptYOffset;\n    FT_Short   ySuperscriptXSize;\n    FT_Short   ySuperscriptYSize;\n    FT_Short   ySuperscriptXOffset;\n    FT_Short   ySuperscriptYOffset;\n    FT_Short   yStrikeoutSize;\n    FT_Short   yStrikeoutPosition;\n    FT_Short   sFamilyClass;\n\n    FT_Byte    panose[10];\n\n    FT_ULong   ulUnicodeRange1;        /* Bits 0-31   */\n    FT_ULong   ulUnicodeRange2;        /* Bits 32-63  */\n    FT_ULong   ulUnicodeRange3;        /* Bits 64-95  */\n    FT_ULong   ulUnicodeRange4;        /* Bits 96-127 */\n\n    FT_Char    achVendID[4];\n\n    FT_UShort  fsSelection;\n    FT_UShort  usFirstCharIndex;\n    FT_UShort  usLastCharIndex;\n    FT_Short   sTypoAscender;\n    FT_Short   sTypoDescender;\n    FT_Short   sTypoLineGap;\n    FT_UShort  usWinAscent;\n    FT_UShort  usWinDescent;\n\n    /* only version 1 tables: */\n\n    FT_ULong   ulCodePageRange1;       /* Bits 0-31   */\n    FT_ULong   ulCodePageRange2;       /* Bits 32-63  */\n\n    /* only version 2 tables: */\n\n    FT_Short   sxHeight;\n    FT_Short   sCapHeight;\n    FT_UShort  usDefaultChar;\n    FT_UShort  usBreakChar;\n    FT_UShort  usMaxContext;\n\n  } TT_OS2;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_Postscript                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a TrueType PostScript table.  All fields */\n  /*    comply to the TrueType specification.  This structure does not     */\n  /*    reference the PostScript glyph names, which can be nevertheless    */\n  /*    accessed with the `ttpost' module.                                 */\n  /*                                                                       */\n  typedef struct  TT_Postscript_\n  {\n    FT_Fixed  FormatType;\n    FT_Fixed  italicAngle;\n    FT_Short  underlinePosition;\n    FT_Short  underlineThickness;\n    FT_ULong  isFixedPitch;\n    FT_ULong  minMemType42;\n    FT_ULong  maxMemType42;\n    FT_ULong  minMemType1;\n    FT_ULong  maxMemType1;\n\n    /* Glyph names follow in the file, but we don't   */\n    /* load them by default.  See the ttpost.c file.  */\n\n  } TT_Postscript;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_PCLT                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a TrueType PCLT table.  All fields       */\n  /*    comply to the TrueType specification.                              */\n  /*                                                                       */\n  typedef struct  TT_PCLT_\n  {\n    FT_Fixed   Version;\n    FT_ULong   FontNumber;\n    FT_UShort  Pitch;\n    FT_UShort  xHeight;\n    FT_UShort  Style;\n    FT_UShort  TypeFamily;\n    FT_UShort  CapHeight;\n    FT_UShort  SymbolSet;\n    FT_Char    TypeFace[16];\n    FT_Char    CharacterComplement[8];\n    FT_Char    FileName[6];\n    FT_Char    StrokeWeight;\n    FT_Char    WidthType;\n    FT_Byte    SerifStyle;\n    FT_Byte    Reserved;\n\n  } TT_PCLT;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_MaxProfile                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The maximum profile is a table containing many max values which    */\n  /*    can be used to pre-allocate arrays.  This ensures that no memory   */\n  /*    allocation occurs during a glyph load.                             */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    version               :: The version number.                       */\n  /*                                                                       */\n  /*    numGlyphs             :: The number of glyphs in this TrueType     */\n  /*                             font.                                     */\n  /*                                                                       */\n  /*    maxPoints             :: The maximum number of points in a         */\n  /*                             non-composite TrueType glyph.  See also   */\n  /*                             the structure element                     */\n  /*                             `maxCompositePoints'.                     */\n  /*                                                                       */\n  /*    maxContours           :: The maximum number of contours in a       */\n  /*                             non-composite TrueType glyph.  See also   */\n  /*                             the structure element                     */\n  /*                             `maxCompositeContours'.                   */\n  /*                                                                       */\n  /*    maxCompositePoints    :: The maximum number of points in a         */\n  /*                             composite TrueType glyph.  See also the   */\n  /*                             structure element `maxPoints'.            */\n  /*                                                                       */\n  /*    maxCompositeContours  :: The maximum number of contours in a       */\n  /*                             composite TrueType glyph.  See also the   */\n  /*                             structure element `maxContours'.          */\n  /*                                                                       */\n  /*    maxZones              :: The maximum number of zones used for      */\n  /*                             glyph hinting.                            */\n  /*                                                                       */\n  /*    maxTwilightPoints     :: The maximum number of points in the       */\n  /*                             twilight zone used for glyph hinting.     */\n  /*                                                                       */\n  /*    maxStorage            :: The maximum number of elements in the     */\n  /*                             storage area used for glyph hinting.      */\n  /*                                                                       */\n  /*    maxFunctionDefs       :: The maximum number of function            */\n  /*                             definitions in the TrueType bytecode for  */\n  /*                             this font.                                */\n  /*                                                                       */\n  /*    maxInstructionDefs    :: The maximum number of instruction         */\n  /*                             definitions in the TrueType bytecode for  */\n  /*                             this font.                                */\n  /*                                                                       */\n  /*    maxStackElements      :: The maximum number of stack elements used */\n  /*                             during bytecode interpretation.           */\n  /*                                                                       */\n  /*    maxSizeOfInstructions :: The maximum number of TrueType opcodes    */\n  /*                             used for glyph hinting.                   */\n  /*                                                                       */\n  /*    maxComponentElements  :: The maximum number of simple (i.e., non-  */\n  /*                             composite) glyphs in a composite glyph.   */\n  /*                                                                       */\n  /*    maxComponentDepth     :: The maximum nesting depth of composite    */\n  /*                             glyphs.                                   */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This structure is only used during font loading.                   */\n  /*                                                                       */\n  typedef struct  TT_MaxProfile_\n  {\n    FT_Fixed   version;\n    FT_UShort  numGlyphs;\n    FT_UShort  maxPoints;\n    FT_UShort  maxContours;\n    FT_UShort  maxCompositePoints;\n    FT_UShort  maxCompositeContours;\n    FT_UShort  maxZones;\n    FT_UShort  maxTwilightPoints;\n    FT_UShort  maxStorage;\n    FT_UShort  maxFunctionDefs;\n    FT_UShort  maxInstructionDefs;\n    FT_UShort  maxStackElements;\n    FT_UShort  maxSizeOfInstructions;\n    FT_UShort  maxComponentElements;\n    FT_UShort  maxComponentDepth;\n\n  } TT_MaxProfile;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Sfnt_Tag                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration used to specify the index of an SFNT table.         */\n  /*    Used in the @FT_Get_Sfnt_Table API function.                       */\n  /*                                                                       */\n  typedef enum  FT_Sfnt_Tag_\n  {\n    ft_sfnt_head = 0,    /* TT_Header     */\n    ft_sfnt_maxp = 1,    /* TT_MaxProfile */\n    ft_sfnt_os2  = 2,    /* TT_OS2        */\n    ft_sfnt_hhea = 3,    /* TT_HoriHeader */\n    ft_sfnt_vhea = 4,    /* TT_VertHeader */\n    ft_sfnt_post = 5,    /* TT_Postscript */\n    ft_sfnt_pclt = 6,    /* TT_PCLT       */\n\n    sfnt_max   /* internal end mark */\n\n  } FT_Sfnt_Tag;\n\n  /* */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Sfnt_Table                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return a pointer to a given SFNT table within a face.              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to the source.                                    */\n  /*                                                                       */\n  /*    tag  :: The index of the SFNT table.                               */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A type-less pointer to the table.  This will be~0 in case of       */\n  /*    error, or if the corresponding table was not found *OR* loaded     */\n  /*    from the file.                                                     */\n  /*                                                                       */\n  /*    Use a typecast according to `tag' to access the structure          */\n  /*    elements.                                                          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The table is owned by the face object and disappears with it.      */\n  /*                                                                       */\n  /*    This function is only useful to access SFNT tables that are loaded */\n  /*    by the sfnt, truetype, and opentype drivers.  See @FT_Sfnt_Tag for */\n  /*    a list.                                                            */\n  /*                                                                       */\n  /*    Here an example how to access the `vhea' table:                    */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      TT_VertHeader*  vert_header;                                     */\n  /*                                                                       */\n  /*                                                                       */\n  /*      vert_header =                                                    */\n  /*        (TT_VertHeader*)FT_Get_Sfnt_Table( face, ft_sfnt_vhea );       */\n  /*    }                                                                  */\n  /*                                                                       */\n  FT_EXPORT( void* )\n  FT_Get_Sfnt_Table( FT_Face      face,\n                     FT_Sfnt_Tag  tag );\n\n\n /**************************************************************************\n  *\n  * @function:\n  *   FT_Load_Sfnt_Table\n  *\n  * @description:\n  *   Load any font table into client memory.\n  *\n  * @input:\n  *   face ::\n  *     A handle to the source face.\n  *\n  *   tag ::\n  *     The four-byte tag of the table to load.  Use the value~0 if you want\n  *     to access the whole font file.  Otherwise, you can use one of the\n  *     definitions found in the @FT_TRUETYPE_TAGS_H file, or forge a new\n  *     one with @FT_MAKE_TAG.\n  *\n  *   offset ::\n  *     The starting offset in the table (or file if tag == 0).\n  *\n  * @output:\n  *   buffer ::\n  *     The target buffer address.  The client must ensure that the memory\n  *     array is big enough to hold the data.\n  *\n  * @inout:\n  *   length ::\n  *     If the `length' parameter is NULL, then try to load the whole table.\n  *     Return an error code if it fails.\n  *\n  *     Else, if `*length' is~0, exit immediately while returning the\n  *     table's (or file) full size in it.\n  *\n  *     Else the number of bytes to read from the table or file, from the\n  *     starting offset.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   If you need to determine the table's length you should first call this\n  *   function with `*length' set to~0, as in the following example:\n  *\n  *     {\n  *       FT_ULong  length = 0;\n  *\n  *\n  *       error = FT_Load_Sfnt_Table( face, tag, 0, NULL, &length );\n  *       if ( error ) { ... table does not exist ... }\n  *\n  *       buffer = malloc( length );\n  *       if ( buffer == NULL ) { ... not enough memory ... }\n  *\n  *       error = FT_Load_Sfnt_Table( face, tag, 0, buffer, &length );\n  *       if ( error ) { ... could not load table ... }\n  *     }\n  */\n  FT_EXPORT( FT_Error )\n  FT_Load_Sfnt_Table( FT_Face    face,\n                      FT_ULong   tag,\n                      FT_Long    offset,\n                      FT_Byte*   buffer,\n                      FT_ULong*  length );\n\n\n /**************************************************************************\n  *\n  * @function:\n  *   FT_Sfnt_Table_Info\n  *\n  * @description:\n  *   Return information on an SFNT table.\n  *\n  * @input:\n  *   face ::\n  *     A handle to the source face.\n  *\n  *   table_index ::\n  *     The index of an SFNT table.  The function returns\n  *     FT_Err_Table_Missing for an invalid value.\n  *\n  * @inout:\n  *   tag ::\n  *     The name tag of the SFNT table.  If the value is NULL, `table_index'\n  *     is ignored, and `length' returns the number of SFNT tables in the\n  *     font.\n  *\n  * @output:\n  *   length ::\n  *     The length of the SFNT table (or the number of SFNT tables, depending\n  *     on `tag').\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   While parsing fonts, FreeType handles SFNT tables with length zero as\n  *   missing.\n  *\n  */\n  FT_EXPORT( FT_Error )\n  FT_Sfnt_Table_Info( FT_Face    face,\n                      FT_UInt    table_index,\n                      FT_ULong  *tag,\n                      FT_ULong  *length );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_CMap_Language_ID                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return TrueType/sfnt specific cmap language ID.  Definitions of    */\n  /*    language ID values are in `freetype/ttnameid.h'.                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    charmap ::                                                         */\n  /*      The target charmap.                                              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The language ID of `charmap'.  If `charmap' doesn't belong to a    */\n  /*    TrueType/sfnt face, just return~0 as the default value.            */\n  /*                                                                       */\n  /*    For a format~14 cmap (to access Unicode IVS), the return value is  */\n  /*    0xFFFFFFFF.                                                        */\n  /*                                                                       */\n  FT_EXPORT( FT_ULong )\n  FT_Get_CMap_Language_ID( FT_CharMap  charmap );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_CMap_Format                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return TrueType/sfnt specific cmap format.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    charmap ::                                                         */\n  /*      The target charmap.                                              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The format of `charmap'.  If `charmap' doesn't belong to a         */\n  /*    TrueType/sfnt face, return -1.                                     */\n  /*                                                                       */\n  FT_EXPORT( FT_Long )\n  FT_Get_CMap_Format( FT_CharMap  charmap );\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __TTTABLES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/tttags.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  tttags.h                                                               */\n/*                                                                         */\n/*    Tags for TrueType and OpenType tables (specification only).          */\n/*                                                                         */\n/*  Copyright 1996-2001, 2004, 2005, 2007, 2008, 2013 by                   */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTAGS_H__\n#define __TTAGS_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n#define TTAG_avar  FT_MAKE_TAG( 'a', 'v', 'a', 'r' )\n#define TTAG_BASE  FT_MAKE_TAG( 'B', 'A', 'S', 'E' )\n#define TTAG_bdat  FT_MAKE_TAG( 'b', 'd', 'a', 't' )\n#define TTAG_BDF   FT_MAKE_TAG( 'B', 'D', 'F', ' ' )\n#define TTAG_bhed  FT_MAKE_TAG( 'b', 'h', 'e', 'd' )\n#define TTAG_bloc  FT_MAKE_TAG( 'b', 'l', 'o', 'c' )\n#define TTAG_bsln  FT_MAKE_TAG( 'b', 's', 'l', 'n' )\n#define TTAG_CBDT  FT_MAKE_TAG( 'C', 'B', 'D', 'T' )\n#define TTAG_CBLC  FT_MAKE_TAG( 'C', 'B', 'L', 'C' )\n#define TTAG_CFF   FT_MAKE_TAG( 'C', 'F', 'F', ' ' )\n#define TTAG_CID   FT_MAKE_TAG( 'C', 'I', 'D', ' ' )\n#define TTAG_cmap  FT_MAKE_TAG( 'c', 'm', 'a', 'p' )\n#define TTAG_cvar  FT_MAKE_TAG( 'c', 'v', 'a', 'r' )\n#define TTAG_cvt   FT_MAKE_TAG( 'c', 'v', 't', ' ' )\n#define TTAG_DSIG  FT_MAKE_TAG( 'D', 'S', 'I', 'G' )\n#define TTAG_EBDT  FT_MAKE_TAG( 'E', 'B', 'D', 'T' )\n#define TTAG_EBLC  FT_MAKE_TAG( 'E', 'B', 'L', 'C' )\n#define TTAG_EBSC  FT_MAKE_TAG( 'E', 'B', 'S', 'C' )\n#define TTAG_feat  FT_MAKE_TAG( 'f', 'e', 'a', 't' )\n#define TTAG_FOND  FT_MAKE_TAG( 'F', 'O', 'N', 'D' )\n#define TTAG_fpgm  FT_MAKE_TAG( 'f', 'p', 'g', 'm' )\n#define TTAG_fvar  FT_MAKE_TAG( 'f', 'v', 'a', 'r' )\n#define TTAG_gasp  FT_MAKE_TAG( 'g', 'a', 's', 'p' )\n#define TTAG_GDEF  FT_MAKE_TAG( 'G', 'D', 'E', 'F' )\n#define TTAG_glyf  FT_MAKE_TAG( 'g', 'l', 'y', 'f' )\n#define TTAG_GPOS  FT_MAKE_TAG( 'G', 'P', 'O', 'S' )\n#define TTAG_GSUB  FT_MAKE_TAG( 'G', 'S', 'U', 'B' )\n#define TTAG_gvar  FT_MAKE_TAG( 'g', 'v', 'a', 'r' )\n#define TTAG_hdmx  FT_MAKE_TAG( 'h', 'd', 'm', 'x' )\n#define TTAG_head  FT_MAKE_TAG( 'h', 'e', 'a', 'd' )\n#define TTAG_hhea  FT_MAKE_TAG( 'h', 'h', 'e', 'a' )\n#define TTAG_hmtx  FT_MAKE_TAG( 'h', 'm', 't', 'x' )\n#define TTAG_JSTF  FT_MAKE_TAG( 'J', 'S', 'T', 'F' )\n#define TTAG_just  FT_MAKE_TAG( 'j', 'u', 's', 't' )\n#define TTAG_kern  FT_MAKE_TAG( 'k', 'e', 'r', 'n' )\n#define TTAG_lcar  FT_MAKE_TAG( 'l', 'c', 'a', 'r' )\n#define TTAG_loca  FT_MAKE_TAG( 'l', 'o', 'c', 'a' )\n#define TTAG_LTSH  FT_MAKE_TAG( 'L', 'T', 'S', 'H' )\n#define TTAG_LWFN  FT_MAKE_TAG( 'L', 'W', 'F', 'N' )\n#define TTAG_MATH  FT_MAKE_TAG( 'M', 'A', 'T', 'H' )\n#define TTAG_maxp  FT_MAKE_TAG( 'm', 'a', 'x', 'p' )\n#define TTAG_META  FT_MAKE_TAG( 'M', 'E', 'T', 'A' )\n#define TTAG_MMFX  FT_MAKE_TAG( 'M', 'M', 'F', 'X' )\n#define TTAG_MMSD  FT_MAKE_TAG( 'M', 'M', 'S', 'D' )\n#define TTAG_mort  FT_MAKE_TAG( 'm', 'o', 'r', 't' )\n#define TTAG_morx  FT_MAKE_TAG( 'm', 'o', 'r', 'x' )\n#define TTAG_name  FT_MAKE_TAG( 'n', 'a', 'm', 'e' )\n#define TTAG_opbd  FT_MAKE_TAG( 'o', 'p', 'b', 'd' )\n#define TTAG_OS2   FT_MAKE_TAG( 'O', 'S', '/', '2' )\n#define TTAG_OTTO  FT_MAKE_TAG( 'O', 'T', 'T', 'O' )\n#define TTAG_PCLT  FT_MAKE_TAG( 'P', 'C', 'L', 'T' )\n#define TTAG_POST  FT_MAKE_TAG( 'P', 'O', 'S', 'T' )\n#define TTAG_post  FT_MAKE_TAG( 'p', 'o', 's', 't' )\n#define TTAG_prep  FT_MAKE_TAG( 'p', 'r', 'e', 'p' )\n#define TTAG_prop  FT_MAKE_TAG( 'p', 'r', 'o', 'p' )\n#define TTAG_sfnt  FT_MAKE_TAG( 's', 'f', 'n', 't' )\n#define TTAG_SING  FT_MAKE_TAG( 'S', 'I', 'N', 'G' )\n#define TTAG_trak  FT_MAKE_TAG( 't', 'r', 'a', 'k' )\n#define TTAG_true  FT_MAKE_TAG( 't', 'r', 'u', 'e' )\n#define TTAG_ttc   FT_MAKE_TAG( 't', 't', 'c', ' ' )\n#define TTAG_ttcf  FT_MAKE_TAG( 't', 't', 'c', 'f' )\n#define TTAG_TYP1  FT_MAKE_TAG( 'T', 'Y', 'P', '1' )\n#define TTAG_typ1  FT_MAKE_TAG( 't', 'y', 'p', '1' )\n#define TTAG_VDMX  FT_MAKE_TAG( 'V', 'D', 'M', 'X' )\n#define TTAG_vhea  FT_MAKE_TAG( 'v', 'h', 'e', 'a' )\n#define TTAG_vmtx  FT_MAKE_TAG( 'v', 'm', 't', 'x' )\n\n\nFT_END_HEADER\n\n#endif /* __TTAGS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/freetype/ttunpat.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttunpat.h                                                              */\n/*                                                                         */\n/*    Definitions for the unpatented TrueType hinting system               */\n/*                                                                         */\n/*  Copyright 2003, 2006 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  Written by Graham Asher <graham.asher@btinternet.com>                  */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTUNPAT_H__\n#define __TTUNPAT_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n /***************************************************************************\n  *\n  * @constant:\n  *   FT_PARAM_TAG_UNPATENTED_HINTING\n  *\n  * @description:\n  *   A constant used as the tag of an @FT_Parameter structure to indicate\n  *   that unpatented methods only should be used by the TrueType bytecode\n  *   interpreter for a typeface opened by @FT_Open_Face.\n  *\n  */\n#define FT_PARAM_TAG_UNPATENTED_HINTING  FT_MAKE_TAG( 'u', 'n', 'p', 'a' )\n\n /* */\n\nFT_END_HEADER\n\n\n#endif /* __TTUNPAT_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/freetype/ft2build.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ft2build.h                                                             */\n/*                                                                         */\n/*    FreeType 2 build and setup macros.                                   */\n/*    (Generic version)                                                    */\n/*                                                                         */\n/*  Copyright 1996-2001, 2006 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file corresponds to the default `ft2build.h' file for            */\n  /* FreeType 2.  It uses the `freetype' include root.                     */\n  /*                                                                       */\n  /* Note that specific platforms might use a different configuration.     */\n  /* See builds/unix/ft2unix.h for an example.                             */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FT2_BUILD_GENERIC_H__\n#define __FT2_BUILD_GENERIC_H__\n\n#include \"foxitnames.h\"\n#include \"freetype/config/ftheader.h\"\n\n#endif /* __FT2_BUILD_GENERIC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/include/thirdparties/libjpeg/jconfig.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n/* jconfig.vc --- jconfig.h for Microsoft Visual C++ on Windows 95 or NT. */\n/* see jconfig.doc for explanations */\n\n#define HAVE_PROTOTYPES\n#define HAVE_UNSIGNED_CHAR\n#define HAVE_UNSIGNED_SHORT\n/* #define void char */\n/* #define const */\n#undef CHAR_IS_UNSIGNED\n#define HAVE_STDDEF_H\n#define HAVE_STDLIB_H\n#undef NEED_BSD_STRINGS\n#undef NEED_SYS_TYPES_H\n#undef NEED_FAR_POINTERS\t/* we presume a 32-bit flat memory model */\n#undef NEED_SHORT_EXTERNAL_NAMES\n#undef INCOMPLETE_TYPES_BROKEN\n\n/* Define \"boolean\" as unsigned char, not int, per Windows custom */\n#ifndef __RPCNDR_H__\t\t/* don't conflict if rpcndr.h already read */\ntypedef unsigned char boolean;\n#endif\n#define HAVE_BOOLEAN\t\t/* prevent jmorecfg.h from redefining it */\n\n\n#ifdef JPEG_INTERNALS\n\n#undef RIGHT_SHIFT_IS_UNSIGNED\n\n#endif /* JPEG_INTERNALS */\n\n#ifdef JPEG_CJPEG_DJPEG\n\n#define BMP_SUPPORTED\t\t/* BMP image file format */\n#define GIF_SUPPORTED\t\t/* GIF image file format */\n#define PPM_SUPPORTED\t\t/* PBMPLUS PPM/PGM image file format */\n#undef RLE_SUPPORTED\t\t/* Utah RLE image file format */\n#define TARGA_SUPPORTED\t\t/* Targa image file format */\n\n#define TWO_FILE_COMMANDLINE\t/* optional */\n#define USE_SETMODE\t\t/* Microsoft has setmode() */\n#undef NEED_SIGNAL_CATCHER\n#undef DONT_USE_B_MODE\n#undef PROGRESS_REPORT\t\t/* optional */\n\n#endif /* JPEG_CJPEG_DJPEG */\n"
  },
  {
    "path": "core/include/thirdparties/libjpeg/jerror.h",
    "content": "/*\n * jerror.h\n *\n * Copyright (C) 1994-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file defines the error and message codes for the JPEG library.\n * Edit this file to add new codes, or to translate the message strings to\n * some other language.\n * A set of error-reporting macros are defined too.  Some applications using\n * the JPEG library may wish to include this file to get the error codes\n * and/or the macros.\n */\n\n/*\n * To define the enum list of message codes, include this file without\n * defining macro JMESSAGE.  To create a message string table, include it\n * again with a suitable JMESSAGE definition (see jerror.c for an example).\n */\n#ifndef JMESSAGE\n#ifndef JERROR_H\n/* First time through, define the enum list */\n#define JMAKE_ENUM_LIST\n#else\n/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */\n#define JMESSAGE(code,string)\n#endif /* JERROR_H */\n#endif /* JMESSAGE */\n\n#ifdef JMAKE_ENUM_LIST\n\ntypedef enum {\n\n#define JMESSAGE(code,string)\tcode ,\n\n#endif /* JMAKE_ENUM_LIST */\n\nJMESSAGE(JMSG_NOMESSAGE, \"Bogus message code %d\") /* Must be first entry! */\n\n/* For maintenance convenience, list is alphabetical by message code name */\nJMESSAGE(JERR_ARITH_NOTIMPL,\n\t \"Sorry, there are legal restrictions on arithmetic coding\")\nJMESSAGE(JERR_BAD_ALIGN_TYPE, \"ALIGN_TYPE is wrong, please fix\")\nJMESSAGE(JERR_BAD_ALLOC_CHUNK, \"MAX_ALLOC_CHUNK is wrong, please fix\")\nJMESSAGE(JERR_BAD_BUFFER_MODE, \"Bogus buffer control mode\")\nJMESSAGE(JERR_BAD_COMPONENT_ID, \"Invalid component ID %d in SOS\")\nJMESSAGE(JERR_BAD_DCT_COEF, \"DCT coefficient out of range\")\nJMESSAGE(JERR_BAD_DCTSIZE, \"IDCT output block size %d not supported\")\nJMESSAGE(JERR_BAD_HUFF_TABLE, \"Bogus Huffman table definition\")\nJMESSAGE(JERR_BAD_IN_COLORSPACE, \"Bogus input colorspace\")\nJMESSAGE(JERR_BAD_J_COLORSPACE, \"Bogus JPEG colorspace\")\nJMESSAGE(JERR_BAD_LENGTH, \"Bogus marker length\")\nJMESSAGE(JERR_BAD_LIB_VERSION,\n\t \"Wrong JPEG library version: library is %d, caller expects %d\")\nJMESSAGE(JERR_BAD_MCU_SIZE, \"Sampling factors too large for interleaved scan\")\nJMESSAGE(JERR_BAD_POOL_ID, \"Invalid memory pool code %d\")\nJMESSAGE(JERR_BAD_PRECISION, \"Unsupported JPEG data precision %d\")\nJMESSAGE(JERR_BAD_PROGRESSION,\n\t \"Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d\")\nJMESSAGE(JERR_BAD_PROG_SCRIPT,\n\t \"Invalid progressive parameters at scan script entry %d\")\nJMESSAGE(JERR_BAD_SAMPLING, \"Bogus sampling factors\")\nJMESSAGE(JERR_BAD_SCAN_SCRIPT, \"Invalid scan script at entry %d\")\nJMESSAGE(JERR_BAD_STATE, \"Improper call to JPEG library in state %d\")\nJMESSAGE(JERR_BAD_STRUCT_SIZE,\n\t \"JPEG parameter struct mismatch: library thinks size is %u, caller expects %u\")\nJMESSAGE(JERR_BAD_VIRTUAL_ACCESS, \"Bogus virtual array access\")\nJMESSAGE(JERR_BUFFER_SIZE, \"Buffer passed to JPEG library is too small\")\nJMESSAGE(JERR_CANT_SUSPEND, \"Suspension not allowed here\")\nJMESSAGE(JERR_CCIR601_NOTIMPL, \"CCIR601 sampling not implemented yet\")\nJMESSAGE(JERR_COMPONENT_COUNT, \"Too many color components: %d, max %d\")\nJMESSAGE(JERR_CONVERSION_NOTIMPL, \"Unsupported color conversion request\")\nJMESSAGE(JERR_DAC_INDEX, \"Bogus DAC index %d\")\nJMESSAGE(JERR_DAC_VALUE, \"Bogus DAC value 0x%x\")\nJMESSAGE(JERR_DHT_INDEX, \"Bogus DHT index %d\")\nJMESSAGE(JERR_DQT_INDEX, \"Bogus DQT index %d\")\nJMESSAGE(JERR_EMPTY_IMAGE, \"Empty JPEG image (DNL not supported)\")\nJMESSAGE(JERR_EMS_READ, \"Read from EMS failed\")\nJMESSAGE(JERR_EMS_WRITE, \"Write to EMS failed\")\nJMESSAGE(JERR_EOI_EXPECTED, \"Didn't expect more than one scan\")\nJMESSAGE(JERR_FILE_READ, \"Input file read error\")\nJMESSAGE(JERR_FILE_WRITE, \"Output file write error --- out of disk space?\")\nJMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, \"Fractional sampling not implemented yet\")\nJMESSAGE(JERR_HUFF_CLEN_OVERFLOW, \"Huffman code size table overflow\")\nJMESSAGE(JERR_HUFF_MISSING_CODE, \"Missing Huffman code table entry\")\nJMESSAGE(JERR_IMAGE_TOO_BIG, \"Maximum supported image dimension is %u pixels\")\nJMESSAGE(JERR_INPUT_EMPTY, \"Empty input file\")\nJMESSAGE(JERR_INPUT_EOF, \"Premature end of input file\")\nJMESSAGE(JERR_MISMATCHED_QUANT_TABLE,\n\t \"Cannot transcode due to multiple use of quantization table %d\")\nJMESSAGE(JERR_MISSING_DATA, \"Scan script does not transmit all data\")\nJMESSAGE(JERR_MODE_CHANGE, \"Invalid color quantization mode change\")\nJMESSAGE(JERR_NOTIMPL, \"Not implemented yet\")\nJMESSAGE(JERR_NOT_COMPILED, \"Requested feature was omitted at compile time\")\nJMESSAGE(JERR_NO_BACKING_STORE, \"Backing store not supported\")\nJMESSAGE(JERR_NO_HUFF_TABLE, \"Huffman table 0x%02x was not defined\")\nJMESSAGE(JERR_NO_IMAGE, \"JPEG datastream contains no image\")\nJMESSAGE(JERR_NO_QUANT_TABLE, \"Quantization table 0x%02x was not defined\")\nJMESSAGE(JERR_NO_SOI, \"Not a JPEG file: starts with 0x%02x 0x%02x\")\nJMESSAGE(JERR_OUT_OF_MEMORY, \"Insufficient memory (case %d)\")\nJMESSAGE(JERR_QUANT_COMPONENTS,\n\t \"Cannot quantize more than %d color components\")\nJMESSAGE(JERR_QUANT_FEW_COLORS, \"Cannot quantize to fewer than %d colors\")\nJMESSAGE(JERR_QUANT_MANY_COLORS, \"Cannot quantize to more than %d colors\")\nJMESSAGE(JERR_SOF_DUPLICATE, \"Invalid JPEG file structure: two SOF markers\")\nJMESSAGE(JERR_SOF_NO_SOS, \"Invalid JPEG file structure: missing SOS marker\")\nJMESSAGE(JERR_SOF_UNSUPPORTED, \"Unsupported JPEG process: SOF type 0x%02x\")\nJMESSAGE(JERR_SOI_DUPLICATE, \"Invalid JPEG file structure: two SOI markers\")\nJMESSAGE(JERR_SOS_NO_SOF, \"Invalid JPEG file structure: SOS before SOF\")\nJMESSAGE(JERR_TFILE_CREATE, \"Failed to create temporary file %s\")\nJMESSAGE(JERR_TFILE_READ, \"Read failed on temporary file\")\nJMESSAGE(JERR_TFILE_SEEK, \"Seek failed on temporary file\")\nJMESSAGE(JERR_TFILE_WRITE,\n\t \"Write failed on temporary file --- out of disk space?\")\nJMESSAGE(JERR_TOO_LITTLE_DATA, \"Application transferred too few scanlines\")\nJMESSAGE(JERR_UNKNOWN_MARKER, \"Unsupported marker type 0x%02x\")\nJMESSAGE(JERR_VIRTUAL_BUG, \"Virtual array controller messed up\")\nJMESSAGE(JERR_WIDTH_OVERFLOW, \"Image too wide for this implementation\")\nJMESSAGE(JERR_XMS_READ, \"Read from XMS failed\")\nJMESSAGE(JERR_XMS_WRITE, \"Write to XMS failed\")\nJMESSAGE(JMSG_COPYRIGHT, JCOPYRIGHT)\nJMESSAGE(JMSG_VERSION, JVERSION)\nJMESSAGE(JTRC_16BIT_TABLES,\n\t \"Caution: quantization tables are too coarse for baseline JPEG\")\nJMESSAGE(JTRC_ADOBE,\n\t \"Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d\")\nJMESSAGE(JTRC_APP0, \"Unknown APP0 marker (not JFIF), length %u\")\nJMESSAGE(JTRC_APP14, \"Unknown APP14 marker (not Adobe), length %u\")\nJMESSAGE(JTRC_DAC, \"Define Arithmetic Table 0x%02x: 0x%02x\")\nJMESSAGE(JTRC_DHT, \"Define Huffman Table 0x%02x\")\nJMESSAGE(JTRC_DQT, \"Define Quantization Table %d  precision %d\")\nJMESSAGE(JTRC_DRI, \"Define Restart Interval %u\")\nJMESSAGE(JTRC_EMS_CLOSE, \"Freed EMS handle %u\")\nJMESSAGE(JTRC_EMS_OPEN, \"Obtained EMS handle %u\")\nJMESSAGE(JTRC_EOI, \"End Of Image\")\nJMESSAGE(JTRC_HUFFBITS, \"        %3d %3d %3d %3d %3d %3d %3d %3d\")\nJMESSAGE(JTRC_JFIF, \"JFIF APP0 marker: version %d.%02d, density %dx%d  %d\")\nJMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE,\n\t \"Warning: thumbnail image size does not match data length %u\")\nJMESSAGE(JTRC_JFIF_EXTENSION,\n\t \"JFIF extension marker: type 0x%02x, length %u\")\nJMESSAGE(JTRC_JFIF_THUMBNAIL, \"    with %d x %d thumbnail image\")\nJMESSAGE(JTRC_MISC_MARKER, \"Miscellaneous marker 0x%02x, length %u\")\nJMESSAGE(JTRC_PARMLESS_MARKER, \"Unexpected marker 0x%02x\")\nJMESSAGE(JTRC_QUANTVALS, \"        %4u %4u %4u %4u %4u %4u %4u %4u\")\nJMESSAGE(JTRC_QUANT_3_NCOLORS, \"Quantizing to %d = %d*%d*%d colors\")\nJMESSAGE(JTRC_QUANT_NCOLORS, \"Quantizing to %d colors\")\nJMESSAGE(JTRC_QUANT_SELECTED, \"Selected %d colors for quantization\")\nJMESSAGE(JTRC_RECOVERY_ACTION, \"At marker 0x%02x, recovery action %d\")\nJMESSAGE(JTRC_RST, \"RST%d\")\nJMESSAGE(JTRC_SMOOTH_NOTIMPL,\n\t \"Smoothing not supported with nonstandard sampling ratios\")\nJMESSAGE(JTRC_SOF, \"Start Of Frame 0x%02x: width=%u, height=%u, components=%d\")\nJMESSAGE(JTRC_SOF_COMPONENT, \"    Component %d: %dhx%dv q=%d\")\nJMESSAGE(JTRC_SOI, \"Start of Image\")\nJMESSAGE(JTRC_SOS, \"Start Of Scan: %d components\")\nJMESSAGE(JTRC_SOS_COMPONENT, \"    Component %d: dc=%d ac=%d\")\nJMESSAGE(JTRC_SOS_PARAMS, \"  Ss=%d, Se=%d, Ah=%d, Al=%d\")\nJMESSAGE(JTRC_TFILE_CLOSE, \"Closed temporary file %s\")\nJMESSAGE(JTRC_TFILE_OPEN, \"Opened temporary file %s\")\nJMESSAGE(JTRC_THUMB_JPEG,\n\t \"JFIF extension marker: JPEG-compressed thumbnail image, length %u\")\nJMESSAGE(JTRC_THUMB_PALETTE,\n\t \"JFIF extension marker: palette thumbnail image, length %u\")\nJMESSAGE(JTRC_THUMB_RGB,\n\t \"JFIF extension marker: RGB thumbnail image, length %u\")\nJMESSAGE(JTRC_UNKNOWN_IDS,\n\t \"Unrecognized component IDs %d %d %d, assuming YCbCr\")\nJMESSAGE(JTRC_XMS_CLOSE, \"Freed XMS handle %u\")\nJMESSAGE(JTRC_XMS_OPEN, \"Obtained XMS handle %u\")\nJMESSAGE(JWRN_ADOBE_XFORM, \"Unknown Adobe color transform code %d\")\nJMESSAGE(JWRN_BOGUS_PROGRESSION,\n\t \"Inconsistent progression sequence for component %d coefficient %d\")\nJMESSAGE(JWRN_EXTRANEOUS_DATA,\n\t \"Corrupt JPEG data: %u extraneous bytes before marker 0x%02x\")\nJMESSAGE(JWRN_HIT_MARKER, \"Corrupt JPEG data: premature end of data segment\")\nJMESSAGE(JWRN_HUFF_BAD_CODE, \"Corrupt JPEG data: bad Huffman code\")\nJMESSAGE(JWRN_JFIF_MAJOR, \"Warning: unknown JFIF revision number %d.%02d\")\nJMESSAGE(JWRN_JPEG_EOF, \"Premature end of JPEG file\")\nJMESSAGE(JWRN_MUST_RESYNC,\n\t \"Corrupt JPEG data: found marker 0x%02x instead of RST%d\")\nJMESSAGE(JWRN_NOT_SEQUENTIAL, \"Invalid SOS parameters for sequential JPEG\")\nJMESSAGE(JWRN_TOO_MUCH_DATA, \"Application transferred too many scanlines\")\n\n#ifdef JMAKE_ENUM_LIST\n\n  JMSG_LASTMSGCODE\n} J_MESSAGE_CODE;\n\n#undef JMAKE_ENUM_LIST\n#endif /* JMAKE_ENUM_LIST */\n\n/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */\n#undef JMESSAGE\n\n\n#ifndef JERROR_H\n#define JERROR_H\n\n/* Macros to simplify using the error and trace message stuff */\n/* The first parameter is either type of cinfo pointer */\n\n/* Fatal errors (print message and exit) */\n#define ERREXIT(cinfo,code)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))\n#define ERREXIT1(cinfo,code,p1)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (cinfo)->err->msg_parm.i[0] = (p1), \\\n   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))\n#define ERREXIT2(cinfo,code,p1,p2)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (cinfo)->err->msg_parm.i[0] = (p1), \\\n   (cinfo)->err->msg_parm.i[1] = (p2), \\\n   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))\n#define ERREXIT3(cinfo,code,p1,p2,p3)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (cinfo)->err->msg_parm.i[0] = (p1), \\\n   (cinfo)->err->msg_parm.i[1] = (p2), \\\n   (cinfo)->err->msg_parm.i[2] = (p3), \\\n   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))\n#define ERREXIT4(cinfo,code,p1,p2,p3,p4)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (cinfo)->err->msg_parm.i[0] = (p1), \\\n   (cinfo)->err->msg_parm.i[1] = (p2), \\\n   (cinfo)->err->msg_parm.i[2] = (p3), \\\n   (cinfo)->err->msg_parm.i[3] = (p4), \\\n   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))\n#define ERREXITS(cinfo,code,str)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   FXSYS_strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \\\n   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))\n\n#define MAKESTMT(stuff)\t\tdo { stuff } while (0)\n\n/* Nonfatal errors (we can keep going, but the data is probably corrupt) */\n#define WARNMS(cinfo,code)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))\n#define WARNMS1(cinfo,code,p1)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (cinfo)->err->msg_parm.i[0] = (p1), \\\n   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))\n#define WARNMS2(cinfo,code,p1,p2)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (cinfo)->err->msg_parm.i[0] = (p1), \\\n   (cinfo)->err->msg_parm.i[1] = (p2), \\\n   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))\n\n/* Informational/debugging messages */\n#define TRACEMS(cinfo,lvl,code)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))\n#define TRACEMS1(cinfo,lvl,code,p1)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (cinfo)->err->msg_parm.i[0] = (p1), \\\n   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))\n#define TRACEMS2(cinfo,lvl,code,p1,p2)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (cinfo)->err->msg_parm.i[0] = (p1), \\\n   (cinfo)->err->msg_parm.i[1] = (p2), \\\n   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))\n#define TRACEMS3(cinfo,lvl,code,p1,p2,p3)  \\\n  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \\\n\t   _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); \\\n\t   (cinfo)->err->msg_code = (code); \\\n\t   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )\n#define TRACEMS4(cinfo,lvl,code,p1,p2,p3,p4)  \\\n  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \\\n\t   _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \\\n\t   (cinfo)->err->msg_code = (code); \\\n\t   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )\n#define TRACEMS5(cinfo,lvl,code,p1,p2,p3,p4,p5)  \\\n  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \\\n\t   _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \\\n\t   _mp[4] = (p5); \\\n\t   (cinfo)->err->msg_code = (code); \\\n\t   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )\n#define TRACEMS8(cinfo,lvl,code,p1,p2,p3,p4,p5,p6,p7,p8)  \\\n  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \\\n\t   _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \\\n\t   _mp[4] = (p5); _mp[5] = (p6); _mp[6] = (p7); _mp[7] = (p8); \\\n\t   (cinfo)->err->msg_code = (code); \\\n\t   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )\n#define TRACEMSS(cinfo,lvl,code,str)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   FXSYS_strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \\\n   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))\n\n#endif /* JERROR_H */\n"
  },
  {
    "path": "core/include/thirdparties/libjpeg/jmorecfg.h",
    "content": "/*\n * jmorecfg.h\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains additional configuration options that customize the\n * JPEG software for special applications or support machine-dependent\n * optimizations.  Most users will not need to touch this file.\n */\n\n#ifdef _MSC_VER\n#pragma warning (disable : 4142)\n#endif\n\n/*\n * Define BITS_IN_JSAMPLE as either\n *   8   for 8-bit sample values (the usual setting)\n *   12  for 12-bit sample values\n * Only 8 and 12 are legal data precisions for lossy JPEG according to the\n * JPEG standard, and the IJG code does not support anything else!\n * We do not support run-time selection of data precision, sorry.\n */\n\n#define BITS_IN_JSAMPLE  8\t/* use 8 or 12 */\n\n\n/*\n * Maximum number of components (color channels) allowed in JPEG image.\n * To meet the letter of the JPEG spec, set this to 255.  However, darn\n * few applications need more than 4 channels (maybe 5 for CMYK + alpha\n * mask).  We recommend 10 as a reasonable compromise; use 4 if you are\n * really short on memory.  (Each allowed component costs a hundred or so\n * bytes of storage, whether actually used in an image or not.)\n */\n\n#define MAX_COMPONENTS  10\t/* maximum number of image components */\n\n\n/*\n * Basic data types.\n * You may need to change these if you have a machine with unusual data\n * type sizes; for example, \"char\" not 8 bits, \"short\" not 16 bits,\n * or \"long\" not 32 bits.  We don't care whether \"int\" is 16 or 32 bits,\n * but it had better be at least 16.\n */\n\n/* Representation of a single sample (pixel element value).\n * We frequently allocate large arrays of these, so it's important to keep\n * them small.  But if you have memory to burn and access to char or short\n * arrays is very slow on your hardware, you might want to change these.\n */\n\n#if BITS_IN_JSAMPLE == 8\n/* JSAMPLE should be the smallest type that will hold the values 0..255.\n * You can use a signed char by having GETJSAMPLE mask it with 0xFF.\n */\n\n#ifdef HAVE_UNSIGNED_CHAR\n\ntypedef unsigned char JSAMPLE;\n#define GETJSAMPLE(value)  ((int) (value))\n\n#else /* not HAVE_UNSIGNED_CHAR */\n\ntypedef char JSAMPLE;\n#ifdef CHAR_IS_UNSIGNED\n#define GETJSAMPLE(value)  ((int) (value))\n#else\n#define GETJSAMPLE(value)  ((int) (value) & 0xFF)\n#endif /* CHAR_IS_UNSIGNED */\n\n#endif /* HAVE_UNSIGNED_CHAR */\n\n#define MAXJSAMPLE\t255\n#define CENTERJSAMPLE\t128\n\n#endif /* BITS_IN_JSAMPLE == 8 */\n\n\n#if BITS_IN_JSAMPLE == 12\n/* JSAMPLE should be the smallest type that will hold the values 0..4095.\n * On nearly all machines \"short\" will do nicely.\n */\n\ntypedef short JSAMPLE;\n#define GETJSAMPLE(value)  ((int) (value))\n\n#define MAXJSAMPLE\t4095\n#define CENTERJSAMPLE\t2048\n\n#endif /* BITS_IN_JSAMPLE == 12 */\n\n\n/* Representation of a DCT frequency coefficient.\n * This should be a signed value of at least 16 bits; \"short\" is usually OK.\n * Again, we allocate large arrays of these, but you can change to int\n * if you have memory to burn and \"short\" is really slow.\n */\n\ntypedef short JCOEF;\n\n\n/* Compressed datastreams are represented as arrays of JOCTET.\n * These must be EXACTLY 8 bits wide, at least once they are written to\n * external storage.  Note that when using the stdio data source/destination\n * managers, this is also the data type passed to fread/fwrite.\n */\n\n#ifdef HAVE_UNSIGNED_CHAR\n\ntypedef unsigned char JOCTET;\n#define GETJOCTET(value)  (value)\n\n#else /* not HAVE_UNSIGNED_CHAR */\n\ntypedef char JOCTET;\n#ifdef CHAR_IS_UNSIGNED\n#define GETJOCTET(value)  (value)\n#else\n#define GETJOCTET(value)  ((value) & 0xFF)\n#endif /* CHAR_IS_UNSIGNED */\n\n#endif /* HAVE_UNSIGNED_CHAR */\n\n\n/* These typedefs are used for various table entries and so forth.\n * They must be at least as wide as specified; but making them too big\n * won't cost a huge amount of memory, so we don't provide special\n * extraction code like we did for JSAMPLE.  (In other words, these\n * typedefs live at a different point on the speed/space tradeoff curve.)\n */\n\n#if _FX_OS_ != _FX_VXWORKS_\n\n/* UINT8 must hold at least the values 0..255. */\n\n#ifdef HAVE_UNSIGNED_CHAR\ntypedef unsigned char UINT8;\n#else /* not HAVE_UNSIGNED_CHAR */\n#ifdef CHAR_IS_UNSIGNED\ntypedef char UINT8;\n#else /* not CHAR_IS_UNSIGNED */\ntypedef short UINT8;\n#endif /* CHAR_IS_UNSIGNED */\n#endif /* HAVE_UNSIGNED_CHAR */\n\n\n/* UINT16 must hold at least the values 0..65535. */\n\n#ifdef HAVE_UNSIGNED_SHORT\ntypedef unsigned short UINT16;\n#else /* not HAVE_UNSIGNED_SHORT */\ntypedef unsigned int UINT16;\n#endif /* HAVE_UNSIGNED_SHORT */\n\n/* INT16 must hold at least the values -32768..32767. */\n\n#ifndef XMD_H\t\t\t/* X11/xmd.h correctly defines INT16 */\ntypedef short INT16;\n#endif\n\n/* INT32 must hold at least signed 32-bit values. */\n\n#ifndef XMD_H\t\t\t/* X11/xmd.h correctly defines INT32 */\ntypedef int INT32;\n#endif\n\n#endif \n\n/* Datatype used for image dimensions.  The JPEG standard only supports\n * images up to 64K*64K due to 16-bit fields in SOF markers.  Therefore\n * \"unsigned int\" is sufficient on all machines.  However, if you need to\n * handle larger images and you don't mind deviating from the spec, you\n * can change this datatype.\n */\n\ntypedef unsigned int JDIMENSION;\n\n#define JPEG_MAX_DIMENSION  65500L  /* a tad under 64K to prevent overflows */\n\n\n/* These macros are used in all function definitions and extern declarations.\n * You could modify them if you need to change function linkage conventions;\n * in particular, you'll need to do that to make the library a Windows DLL.\n * Another application is to make all functions global for use with debuggers\n * or code profilers that require it.\n */\n\n/* a function called through method pointers: */\n#define METHODDEF(type)\t\tstatic type\n/* a function used only in its module: */\n#define LOCAL(type)\t\tstatic type\n/* a function referenced thru EXTERNs: */\n#define GLOBAL(type)\t\ttype\n\n#ifdef _FX_MANAGED_CODE_\n#define EXTERN(type)\t\textern \"C\" type\n#else\n/* a reference to a GLOBAL function: */\n#define EXTERN(type)\t\textern type\n#endif\n\n\n/* This macro is used to declare a \"method\", that is, a function pointer.\n * We want to supply prototype parameters if the compiler can cope.\n * Note that the arglist parameter must be parenthesized!\n * Again, you can customize this if you need special linkage keywords.\n */\n\n#ifdef HAVE_PROTOTYPES\n#define JMETHOD(type,methodname,arglist)  type (*methodname) arglist\n#else\n#define JMETHOD(type,methodname,arglist)  type (*methodname) ()\n#endif\n\n\n/* Here is the pseudo-keyword for declaring pointers that must be \"far\"\n * on 80x86 machines.  Most of the specialized coding for 80x86 is handled\n * by just saying \"FAR *\" where such a pointer is needed.  In a few places\n * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol.\n */\n\n#ifdef NEED_FAR_POINTERS\n#define FAR  far\n#else\n//#define FAR\n#endif\n\n\n/*\n * On a few systems, type boolean and/or its values FALSE, TRUE may appear\n * in standard header files.  Or you may have conflicts with application-\n * specific header files that you want to include together with these files.\n * Defining HAVE_BOOLEAN before including jpeglib.h should make it work.\n */\n\n#ifndef HAVE_BOOLEAN\ntypedef int boolean;\n#endif\n#ifndef FALSE\t\t\t/* in case these macros already exist */\n#define FALSE\t0\t\t/* values of boolean */\n#endif\n#ifndef TRUE\n#define TRUE\t1\n#endif\n\n\n/*\n * The remaining options affect code selection within the JPEG library,\n * but they don't need to be visible to most applications using the library.\n * To minimize application namespace pollution, the symbols won't be\n * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined.\n */\n\n#ifdef JPEG_INTERNALS\n#define JPEG_INTERNAL_OPTIONS\n#endif\n\n#ifdef JPEG_INTERNAL_OPTIONS\n\n\n/*\n * These defines indicate whether to include various optional functions.\n * Undefining some of these symbols will produce a smaller but less capable\n * library.  Note that you can leave certain source files out of the\n * compilation/linking process if you've #undef'd the corresponding symbols.\n * (You may HAVE to do that if your compiler doesn't like null source files.)\n */\n\n/* Arithmetic coding is unsupported for legal reasons.  Complaints to IBM. */\n\n/* Capability options common to encoder and decoder: */\n\n#define DCT_ISLOW_SUPPORTED\t/* slow but accurate integer algorithm */\n#define DCT_IFAST_SUPPORTED\t/* faster, less accurate integer method */\n#undef DCT_FLOAT_SUPPORTED\t/* floating-point: accurate, fast on fast HW */\n\n/* Encoder capability options: */\n\n#undef  C_ARITH_CODING_SUPPORTED    /* Arithmetic coding back end? */\n#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */\n#define C_PROGRESSIVE_SUPPORTED\t    /* Progressive JPEG? (Requires MULTISCAN)*/\n#define ENTROPY_OPT_SUPPORTED\t    /* Optimization of entropy coding parms? */\n/* Note: if you selected 12-bit data precision, it is dangerous to turn off\n * ENTROPY_OPT_SUPPORTED.  The standard Huffman tables are only good for 8-bit\n * precision, so jchuff.c normally uses entropy optimization to compute\n * usable tables for higher precision.  If you don't want to do optimization,\n * you'll have to supply different default Huffman tables.\n * The exact same statements apply for progressive JPEG: the default tables\n * don't work for progressive mode.  (This may get fixed, however.)\n */\n#define INPUT_SMOOTHING_SUPPORTED   /* Input image smoothing option? */\n\n/* Decoder capability options: */\n\n#undef  D_ARITH_CODING_SUPPORTED    /* Arithmetic coding back end? */\n#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */\n#define D_PROGRESSIVE_SUPPORTED\t    /* Progressive JPEG? (Requires MULTISCAN)*/\n#define SAVE_MARKERS_SUPPORTED\t    /* jpeg_save_markers() needed? */\n#define BLOCK_SMOOTHING_SUPPORTED   /* Block smoothing? (Progressive only) */\n#define IDCT_SCALING_SUPPORTED\t    /* Output rescaling via IDCT? */\n#undef UPSAMPLE_SCALING_SUPPORTED  /* Output rescaling at upsample stage? */\n#define UPSAMPLE_MERGING_SUPPORTED  /* Fast path for sloppy upsampling? */\n#undef QUANT_1PASS_SUPPORTED\t    /* 1-pass color quantization? */\n#undef QUANT_2PASS_SUPPORTED\t    /* 2-pass color quantization? */\n\n/* more capability options later, no doubt */\n\n\n/*\n * Ordering of RGB data in scanlines passed to or from the application.\n * If your application wants to deal with data in the order B,G,R, just\n * change these macros.  You can also deal with formats such as R,G,B,X\n * (one extra byte per pixel) by changing RGB_PIXELSIZE.  Note that changing\n * the offsets will also change the order in which colormap data is organized.\n * RESTRICTIONS:\n * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats.\n * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not\n *    useful if you are using JPEG color spaces other than YCbCr or grayscale.\n * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE\n *    is not 3 (they don't understand about dummy color components!).  So you\n *    can't use color quantization if you change that value.\n */\n\n#define RGB_RED\t\t0\t/* Offset of Red in an RGB scanline element */\n#define RGB_GREEN\t1\t/* Offset of Green */\n#define RGB_BLUE\t2\t/* Offset of Blue */\n#define RGB_PIXELSIZE\t3\t/* JSAMPLEs per RGB scanline element */\n\n\n/* Definitions for speed-related optimizations. */\n\n\n/* If your compiler supports inline functions, define INLINE\n * as the inline keyword; otherwise define it as empty.\n */\n\n#ifndef INLINE\n#ifdef __GNUC__\t\t\t/* for instance, GNU C knows about inline */\n#define INLINE __inline__\n#endif\n#ifndef INLINE\n#define INLINE\t\t\t/* default is to define it as empty */\n#endif\n#endif\n\n\n/* On some machines (notably 68000 series) \"int\" is 32 bits, but multiplying\n * two 16-bit shorts is faster than multiplying two ints.  Define MULTIPLIER\n * as short on such a machine.  MULTIPLIER must be at least 16 bits wide.\n */\n\n#ifndef MULTIPLIER\n#define MULTIPLIER  int\t\t/* type for fastest integer multiply */\n#endif\n\n\n/* FAST_FLOAT should be either float or double, whichever is done faster\n * by your compiler.  (Note that this type is only used in the floating point\n * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.)\n * Typically, float is faster in ANSI C compilers, while double is faster in\n * pre-ANSI compilers (because they insist on converting to double anyway).\n * The code below therefore chooses float if we have ANSI-style prototypes.\n */\n\n#ifndef FAST_FLOAT\n#ifdef HAVE_PROTOTYPES\n#define FAST_FLOAT  float\n#else\n#define FAST_FLOAT  double\n#endif\n#endif\n\n#endif /* JPEG_INTERNAL_OPTIONS */\n"
  },
  {
    "path": "core/include/thirdparties/libjpeg/jpegint.h",
    "content": "/*\n * jpegint.h\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file provides common declarations for the various JPEG modules.\n * These declarations are considered internal to the JPEG library; most\n * applications using the library shouldn't need to include this file.\n */\n\n\n/* Declarations for both compression & decompression */\n\ntypedef enum {\t\t\t/* Operating modes for buffer controllers */\n\tJBUF_PASS_THRU,\t\t/* Plain stripwise operation */\n\t/* Remaining modes require a full-image buffer to have been created */\n\tJBUF_SAVE_SOURCE,\t/* Run source subobject only, save output */\n\tJBUF_CRANK_DEST,\t/* Run dest subobject only, using saved data */\n\tJBUF_SAVE_AND_PASS\t/* Run both subobjects, save output */\n} J_BUF_MODE;\n\n/* Values of global_state field (jdapi.c has some dependencies on ordering!) */\n#define CSTATE_START\t100\t/* after create_compress */\n#define CSTATE_SCANNING\t101\t/* start_compress done, write_scanlines OK */\n#define CSTATE_RAW_OK\t102\t/* start_compress done, write_raw_data OK */\n#define CSTATE_WRCOEFS\t103\t/* jpeg_write_coefficients done */\n#define DSTATE_START\t200\t/* after create_decompress */\n#define DSTATE_INHEADER\t201\t/* reading header markers, no SOS yet */\n#define DSTATE_READY\t202\t/* found SOS, ready for start_decompress */\n#define DSTATE_PRELOAD\t203\t/* reading multiscan file in start_decompress*/\n#define DSTATE_PRESCAN\t204\t/* performing dummy pass for 2-pass quant */\n#define DSTATE_SCANNING\t205\t/* start_decompress done, read_scanlines OK */\n#define DSTATE_RAW_OK\t206\t/* start_decompress done, read_raw_data OK */\n#define DSTATE_BUFIMAGE\t207\t/* expecting jpeg_start_output */\n#define DSTATE_BUFPOST\t208\t/* looking for SOS/EOI in jpeg_finish_output */\n#define DSTATE_RDCOEFS\t209\t/* reading file in jpeg_read_coefficients */\n#define DSTATE_STOPPING\t210\t/* looking for EOI in jpeg_finish_decompress */\n\n\n/* Declarations for compression modules */\n\n/* Master control module */\nstruct jpeg_comp_master {\n  JMETHOD(void, prepare_for_pass, (j_compress_ptr cinfo));\n  JMETHOD(void, pass_startup, (j_compress_ptr cinfo));\n  JMETHOD(void, finish_pass, (j_compress_ptr cinfo));\n\n  /* State variables made visible to other modules */\n  boolean call_pass_startup;\t/* True if pass_startup must be called */\n  boolean is_last_pass;\t\t/* True during last pass */\n};\n\n/* Main buffer control (downsampled-data buffer) */\nstruct jpeg_c_main_controller {\n  JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));\n  JMETHOD(void, process_data, (j_compress_ptr cinfo,\n\t\t\t       JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,\n\t\t\t       JDIMENSION in_rows_avail));\n};\n\n/* Compression preprocessing (downsampling input buffer control) */\nstruct jpeg_c_prep_controller {\n  JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));\n  JMETHOD(void, pre_process_data, (j_compress_ptr cinfo,\n\t\t\t\t   JSAMPARRAY input_buf,\n\t\t\t\t   JDIMENSION *in_row_ctr,\n\t\t\t\t   JDIMENSION in_rows_avail,\n\t\t\t\t   JSAMPIMAGE output_buf,\n\t\t\t\t   JDIMENSION *out_row_group_ctr,\n\t\t\t\t   JDIMENSION out_row_groups_avail));\n};\n\n/* Coefficient buffer control */\nstruct jpeg_c_coef_controller {\n  JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));\n  JMETHOD(boolean, compress_data, (j_compress_ptr cinfo,\n\t\t\t\t   JSAMPIMAGE input_buf));\n};\n\n/* Colorspace conversion */\nstruct jpeg_color_converter {\n  JMETHOD(void, start_pass, (j_compress_ptr cinfo));\n  JMETHOD(void, color_convert, (j_compress_ptr cinfo,\n\t\t\t\tJSAMPARRAY input_buf, JSAMPIMAGE output_buf,\n\t\t\t\tJDIMENSION output_row, int num_rows));\n};\n\n/* Downsampling */\nstruct jpeg_downsampler {\n  JMETHOD(void, start_pass, (j_compress_ptr cinfo));\n  JMETHOD(void, downsample, (j_compress_ptr cinfo,\n\t\t\t     JSAMPIMAGE input_buf, JDIMENSION in_row_index,\n\t\t\t     JSAMPIMAGE output_buf,\n\t\t\t     JDIMENSION out_row_group_index));\n\n  boolean need_context_rows;\t/* TRUE if need rows above & below */\n};\n\n/* Forward DCT (also controls coefficient quantization) */\nstruct jpeg_forward_dct {\n  JMETHOD(void, start_pass, (j_compress_ptr cinfo));\n  /* perhaps this should be an array??? */\n  JMETHOD(void, forward_DCT, (j_compress_ptr cinfo,\n\t\t\t      jpeg_component_info * compptr,\n\t\t\t      JSAMPARRAY sample_data, JBLOCKROW coef_blocks,\n\t\t\t      JDIMENSION start_row, JDIMENSION start_col,\n\t\t\t      JDIMENSION num_blocks));\n};\n\n/* Entropy encoding */\nstruct jpeg_entropy_encoder {\n  JMETHOD(void, start_pass, (j_compress_ptr cinfo, boolean gather_statistics));\n  JMETHOD(boolean, encode_mcu, (j_compress_ptr cinfo, JBLOCKROW *MCU_data));\n  JMETHOD(void, finish_pass, (j_compress_ptr cinfo));\n};\n\n/* Marker writing */\nstruct jpeg_marker_writer {\n  JMETHOD(void, write_file_header, (j_compress_ptr cinfo));\n  JMETHOD(void, write_frame_header, (j_compress_ptr cinfo));\n  JMETHOD(void, write_scan_header, (j_compress_ptr cinfo));\n  JMETHOD(void, write_file_trailer, (j_compress_ptr cinfo));\n  JMETHOD(void, write_tables_only, (j_compress_ptr cinfo));\n  /* These routines are exported to allow insertion of extra markers */\n  /* Probably only COM and APPn markers should be written this way */\n  JMETHOD(void, write_marker_header, (j_compress_ptr cinfo, int marker,\n\t\t\t\t      unsigned int datalen));\n  JMETHOD(void, write_marker_byte, (j_compress_ptr cinfo, int val));\n};\n\n\n/* Declarations for decompression modules */\n\n/* Master control module */\nstruct jpeg_decomp_master {\n  JMETHOD(void, prepare_for_output_pass, (j_decompress_ptr cinfo));\n  JMETHOD(void, finish_output_pass, (j_decompress_ptr cinfo));\n\n  /* State variables made visible to other modules */\n  boolean is_dummy_pass;\t/* True during 1st pass for 2-pass quant */\n};\n\n/* Input control module */\nstruct jpeg_input_controller {\n  JMETHOD(int, consume_input, (j_decompress_ptr cinfo));\n  JMETHOD(void, reset_input_controller, (j_decompress_ptr cinfo));\n  JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));\n  JMETHOD(void, finish_input_pass, (j_decompress_ptr cinfo));\n\n  /* State variables made visible to other modules */\n  boolean has_multiple_scans;\t/* True if file has multiple scans */\n  boolean eoi_reached;\t\t/* True when EOI has been consumed */\n};\n\n/* Main buffer control (downsampled-data buffer) */\nstruct jpeg_d_main_controller {\n  JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));\n  JMETHOD(void, process_data, (j_decompress_ptr cinfo,\n\t\t\t       JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t\t\t       JDIMENSION out_rows_avail));\n};\n\n/* Coefficient buffer control */\nstruct jpeg_d_coef_controller {\n  JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));\n  JMETHOD(int, consume_data, (j_decompress_ptr cinfo));\n  JMETHOD(void, start_output_pass, (j_decompress_ptr cinfo));\n  JMETHOD(int, decompress_data, (j_decompress_ptr cinfo,\n\t\t\t\t JSAMPIMAGE output_buf));\n  /* Pointer to array of coefficient virtual arrays, or NULL if none */\n  jvirt_barray_ptr *coef_arrays;\n};\n\n/* Decompression postprocessing (color quantization buffer control) */\nstruct jpeg_d_post_controller {\n  JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));\n  JMETHOD(void, post_process_data, (j_decompress_ptr cinfo,\n\t\t\t\t    JSAMPIMAGE input_buf,\n\t\t\t\t    JDIMENSION *in_row_group_ctr,\n\t\t\t\t    JDIMENSION in_row_groups_avail,\n\t\t\t\t    JSAMPARRAY output_buf,\n\t\t\t\t    JDIMENSION *out_row_ctr,\n\t\t\t\t    JDIMENSION out_rows_avail));\n};\n\n/* Marker reading & parsing */\nstruct jpeg_marker_reader {\n  JMETHOD(void, reset_marker_reader, (j_decompress_ptr cinfo));\n  /* Read markers until SOS or EOI.\n   * Returns same codes as are defined for jpeg_consume_input:\n   * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.\n   */\n  JMETHOD(int, read_markers, (j_decompress_ptr cinfo));\n  /* Read a restart marker --- exported for use by entropy decoder only */\n  jpeg_marker_parser_method read_restart_marker;\n\n  /* State of marker reader --- nominally internal, but applications\n   * supplying COM or APPn handlers might like to know the state.\n   */\n  boolean saw_SOI;\t\t/* found SOI? */\n  boolean saw_SOF;\t\t/* found SOF? */\n  int next_restart_num;\t\t/* next restart number expected (0-7) */\n  unsigned int discarded_bytes;\t/* # of bytes skipped looking for a marker */\n};\n\n/* Entropy decoding */\nstruct jpeg_entropy_decoder {\n  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));\n  JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo,\n\t\t\t\tJBLOCKROW *MCU_data));\n\n  /* This is here to share code between baseline and progressive decoders; */\n  /* other modules probably should not use it */\n  boolean insufficient_data;\t/* set TRUE after emitting warning */\n};\n\n/* Inverse DCT (also performs dequantization) */\ntypedef JMETHOD(void, inverse_DCT_method_ptr,\n\t\t(j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\t JCOEFPTR coef_block,\n\t\t JSAMPARRAY output_buf, JDIMENSION output_col));\n\nstruct jpeg_inverse_dct {\n  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));\n  /* It is useful to allow each component to have a separate IDCT method. */\n  inverse_DCT_method_ptr inverse_DCT[MAX_COMPONENTS];\n};\n\n/* Upsampling (note that upsampler must also call color converter) */\nstruct jpeg_upsampler {\n  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));\n  JMETHOD(void, upsample, (j_decompress_ptr cinfo,\n\t\t\t   JSAMPIMAGE input_buf,\n\t\t\t   JDIMENSION *in_row_group_ctr,\n\t\t\t   JDIMENSION in_row_groups_avail,\n\t\t\t   JSAMPARRAY output_buf,\n\t\t\t   JDIMENSION *out_row_ctr,\n\t\t\t   JDIMENSION out_rows_avail));\n\n  boolean need_context_rows;\t/* TRUE if need rows above & below */\n};\n\n/* Colorspace conversion */\nstruct jpeg_color_deconverter {\n  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));\n  JMETHOD(void, color_convert, (j_decompress_ptr cinfo,\n\t\t\t\tJSAMPIMAGE input_buf, JDIMENSION input_row,\n\t\t\t\tJSAMPARRAY output_buf, int num_rows));\n};\n\n/* Color quantization or color precision reduction */\nstruct jpeg_color_quantizer {\n  JMETHOD(void, start_pass, (j_decompress_ptr cinfo, boolean is_pre_scan));\n  JMETHOD(void, color_quantize, (j_decompress_ptr cinfo,\n\t\t\t\t JSAMPARRAY input_buf, JSAMPARRAY output_buf,\n\t\t\t\t int num_rows));\n  JMETHOD(void, finish_pass, (j_decompress_ptr cinfo));\n  JMETHOD(void, new_color_map, (j_decompress_ptr cinfo));\n};\n\n\n/* Miscellaneous useful macros */\n\n#undef MAX\n#define MAX(a,b)\t((a) > (b) ? (a) : (b))\n#undef MIN\n#define MIN(a,b)\t((a) < (b) ? (a) : (b))\n\n\n/* We assume that right shift corresponds to signed division by 2 with\n * rounding towards minus infinity.  This is correct for typical \"arithmetic\n * shift\" instructions that shift in copies of the sign bit.  But some\n * C compilers implement >> with an unsigned shift.  For these machines you\n * must define RIGHT_SHIFT_IS_UNSIGNED.\n * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity.\n * It is only applied with constant shift counts.  SHIFT_TEMPS must be\n * included in the variables of any routine using RIGHT_SHIFT.\n */\n\n#ifdef RIGHT_SHIFT_IS_UNSIGNED\n#define SHIFT_TEMPS\tINT32 shift_temp;\n#define RIGHT_SHIFT(x,shft)  \\\n\t((shift_temp = (x)) < 0 ? \\\n\t (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \\\n\t (shift_temp >> (shft)))\n#else\n#define SHIFT_TEMPS\n#define RIGHT_SHIFT(x,shft)\t((x) >> (shft))\n#endif\n\n\n/* Short forms of external names for systems with brain-damaged linkers. */\n\n#ifdef NEED_SHORT_EXTERNAL_NAMES\n#define jinit_compress_master\tjICompress\n#define jinit_c_master_control\tjICMaster\n#define jinit_c_main_controller\tjICMainC\n#define jinit_c_prep_controller\tjICPrepC\n#define jinit_c_coef_controller\tjICCoefC\n#define jinit_color_converter\tjICColor\n#define jinit_downsampler\tjIDownsampler\n#define jinit_forward_dct\tjIFDCT\n#define jinit_huff_encoder\tjIHEncoder\n#define jinit_phuff_encoder\tjIPHEncoder\n#define jinit_marker_writer\tjIMWriter\n#define jinit_master_decompress\tjIDMaster\n#define jinit_d_main_controller\tjIDMainC\n#define jinit_d_coef_controller\tjIDCoefC\n#define jinit_d_post_controller\tjIDPostC\n#define jinit_input_controller\tjIInCtlr\n#define jinit_marker_reader\tjIMReader\n#define jinit_huff_decoder\tjIHDecoder\n#define jinit_phuff_decoder\tjIPHDecoder\n#define jinit_inverse_dct\tjIIDCT\n#define jinit_upsampler\t\tjIUpsampler\n#define jinit_color_deconverter\tjIDColor\n#define jinit_1pass_quantizer\tjI1Quant\n#define jinit_2pass_quantizer\tjI2Quant\n#define jinit_merged_upsampler\tjIMUpsampler\n#define jinit_memory_mgr\tjIMemMgr\n#define jdiv_round_up\t\tjDivRound\n#define jround_up\t\tjRound\n#define jcopy_sample_rows\tjCopySamples\n#define jcopy_block_row\t\tjCopyBlocks\n#define jzero_far\t\tjZeroFar\n#define jpeg_zigzag_order\tjZIGTable\n#define jpeg_natural_order\tjZAGTable\n#endif /* NEED_SHORT_EXTERNAL_NAMES */\n\n\n/* Compression module initialization routines */\nEXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo));\nEXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo,\n\t\t\t\t\t boolean transcode_only));\nEXTERN(void) jinit_c_main_controller JPP((j_compress_ptr cinfo,\n\t\t\t\t\t  boolean need_full_buffer));\nEXTERN(void) jinit_c_prep_controller JPP((j_compress_ptr cinfo,\n\t\t\t\t\t  boolean need_full_buffer));\nEXTERN(void) jinit_c_coef_controller JPP((j_compress_ptr cinfo,\n\t\t\t\t\t  boolean need_full_buffer));\nEXTERN(void) jinit_color_converter JPP((j_compress_ptr cinfo));\nEXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo));\nEXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo));\nEXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo));\nEXTERN(void) jinit_phuff_encoder JPP((j_compress_ptr cinfo));\nEXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo));\n/* Decompression module initialization routines */\nEXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_d_main_controller JPP((j_decompress_ptr cinfo,\n\t\t\t\t\t  boolean need_full_buffer));\nEXTERN(void) jinit_d_coef_controller JPP((j_decompress_ptr cinfo,\n\t\t\t\t\t  boolean need_full_buffer));\nEXTERN(void) jinit_d_post_controller JPP((j_decompress_ptr cinfo,\n\t\t\t\t\t  boolean need_full_buffer));\nEXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_phuff_decoder JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_1pass_quantizer JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_2pass_quantizer JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_merged_upsampler JPP((j_decompress_ptr cinfo));\n/* Memory manager initialization */\nEXTERN(void) jinit_memory_mgr JPP((j_common_ptr cinfo));\n\n/* Utility routines in jutils.c */\nEXTERN(long) jdiv_round_up JPP((long a, long b));\nEXTERN(long) jround_up JPP((long a, long b));\nEXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row,\n\t\t\t\t    JSAMPARRAY output_array, int dest_row,\n\t\t\t\t    int num_rows, JDIMENSION num_cols));\nEXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row,\n\t\t\t\t  JDIMENSION num_blocks));\nEXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero));\n/* Constant tables in jutils.c */\n#if 0\t\t\t\t/* This table is not actually needed in v6a */\nextern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */\n#endif\nextern const int jpeg_natural_order[]; /* zigzag coef order to natural order */\n\n/* Suppress undefined-structure complaints if necessary. */\n\n#ifdef INCOMPLETE_TYPES_BROKEN\n#ifndef AM_MEMORY_MANAGER\t/* only jmemmgr.c defines these */\nstruct jvirt_sarray_control { long dummy; };\nstruct jvirt_barray_control { long dummy; };\n#endif\n#endif /* INCOMPLETE_TYPES_BROKEN */\n"
  },
  {
    "path": "core/include/thirdparties/libjpeg/jpeglib.h",
    "content": "/*\n * jpeglib.h\n *\n * Copyright (C) 1991-1998, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file defines the application interface for the JPEG library.\n * Most applications using the library need only include this file,\n * and perhaps jerror.h if they want to know the exact error codes.\n */\n\n#ifndef JPEGLIB_H\n#define JPEGLIB_H\n\n#define FOXIT_PREFIX(origName)  FPDFAPIJPEG_##origName\n\n#define jcopy_block_row FOXIT_PREFIX(jcopy_block_row)\n#define jcopy_sample_rows FOXIT_PREFIX(jcopy_sample_rows)\n#define jdiv_round_up FOXIT_PREFIX(jdiv_round_up)\n#define jinit_1pass_quantizer FOXIT_PREFIX(jinit_1pass_quantizer)\n#define jinit_2pass_quantizer FOXIT_PREFIX(jinit_2pass_quantizer)\n#define jinit_color_deconverter FOXIT_PREFIX(jinit_color_deconverter)\n#define jinit_d_coef_controller FOXIT_PREFIX(jinit_d_coef_controller)\n#define jinit_d_main_controller FOXIT_PREFIX(jinit_d_main_controller)\n#define jinit_d_post_controller FOXIT_PREFIX(jinit_d_post_controller)\n#define jinit_huff_decoder FOXIT_PREFIX(jinit_huff_decoder)\n#define jinit_input_controller FOXIT_PREFIX(jinit_input_controller)\n#define jinit_inverse_dct FOXIT_PREFIX(jinit_inverse_dct)\n#define jinit_marker_reader FOXIT_PREFIX(jinit_marker_reader)\n#define jinit_master_decompress FOXIT_PREFIX(jinit_master_decompress)\n#define jinit_memory_mgr FOXIT_PREFIX(jinit_memory_mgr)\n#define jinit_merged_upsampler FOXIT_PREFIX(jinit_merged_upsampler)\n#define jinit_phuff_decoder FOXIT_PREFIX(jinit_phuff_decoder)\n#define jinit_upsampler FOXIT_PREFIX(jinit_upsampler)\n#define jpeg_CreateDecompress FOXIT_PREFIX(jpeg_CreateDecompress)\n#define jpeg_abort FOXIT_PREFIX(jpeg_abort)\n#define jpeg_abort_decompress FOXIT_PREFIX(jpeg_abort_decompress)\n#define jpeg_alloc_huff_table FOXIT_PREFIX(jpeg_alloc_huff_table)\n#define jpeg_alloc_quant_table FOXIT_PREFIX(jpeg_alloc_quant_table)\n#define jpeg_calc_output_dimensions FOXIT_PREFIX(jpeg_calc_output_dimensions)\n#define jpeg_consume_input FOXIT_PREFIX(jpeg_consume_input)\n#define jpeg_destroy FOXIT_PREFIX(jpeg_destroy)\n#define jpeg_destroy_decompress FOXIT_PREFIX(jpeg_destroy_decompress)\n#define jpeg_fill_bit_buffer FOXIT_PREFIX(jpeg_fill_bit_buffer)\n#define jpeg_finish_decompress FOXIT_PREFIX(jpeg_finish_decompress)\n#define jpeg_finish_output FOXIT_PREFIX(jpeg_finish_output)\n#define jpeg_free_large FOXIT_PREFIX(jpeg_free_large)\n#define jpeg_free_small FOXIT_PREFIX(jpeg_free_small)\n#define jpeg_get_large FOXIT_PREFIX(jpeg_get_large)\n#define jpeg_get_small FOXIT_PREFIX(jpeg_get_small)\n#define jpeg_has_multiple_scans FOXIT_PREFIX(jpeg_has_multiple_scans)\n#define jpeg_huff_decode FOXIT_PREFIX(jpeg_huff_decode)\n#define jpeg_idct_1x1 FOXIT_PREFIX(jpeg_idct_1x1)\n#define jpeg_idct_2x2 FOXIT_PREFIX(jpeg_idct_2x2)\n#define jpeg_idct_4x4 FOXIT_PREFIX(jpeg_idct_4x4)\n#define jpeg_idct_float FOXIT_PREFIX(jpeg_idct_float)\n#define jpeg_idct_ifast FOXIT_PREFIX(jpeg_idct_ifast)\n#define jpeg_idct_islow FOXIT_PREFIX(jpeg_idct_islow)\n#define jpeg_input_complete FOXIT_PREFIX(jpeg_input_complete)\n#define jpeg_make_d_derived_tbl FOXIT_PREFIX(jpeg_make_d_derived_tbl)\n#define jpeg_mem_available FOXIT_PREFIX(jpeg_mem_available)\n#define jpeg_mem_init FOXIT_PREFIX(jpeg_mem_init)\n#define jpeg_mem_term FOXIT_PREFIX(jpeg_mem_term)\n#define jpeg_natural_order FOXIT_PREFIX(jpeg_natural_order)\n#define jpeg_new_colormap FOXIT_PREFIX(jpeg_new_colormap)\n#define jpeg_open_backing_store FOXIT_PREFIX(jpeg_open_backing_store)\n#define jpeg_read_coefficients FOXIT_PREFIX(jpeg_read_coefficients)\n#define jpeg_read_header FOXIT_PREFIX(jpeg_read_header)\n#define jpeg_read_raw_data FOXIT_PREFIX(jpeg_read_raw_data)\n#define jpeg_read_scanlines FOXIT_PREFIX(jpeg_read_scanlines)\n#define jpeg_resync_to_restart FOXIT_PREFIX(jpeg_resync_to_restart)\n#define jpeg_save_markers FOXIT_PREFIX(jpeg_save_markers)\n#define jpeg_set_marker_processor FOXIT_PREFIX(jpeg_set_marker_processor)\n#define jpeg_start_decompress FOXIT_PREFIX(jpeg_start_decompress)\n#define jpeg_start_output FOXIT_PREFIX(jpeg_start_output)\n#define jpeg_std_error FOXIT_PREFIX(jpeg_std_error)\n#define jpeg_std_message_table FOXIT_PREFIX(jpeg_std_message_table)\n#define jpeg_stdio_src FOXIT_PREFIX(jpeg_stdio_src)\n#define jround_up FOXIT_PREFIX(jround_up)\n#define jzero_far FOXIT_PREFIX(jzero_far)\n\n /*\n * First we include the configuration files that record how this\n * installation of the JPEG library is set up.  jconfig.h can be\n * generated automatically for many systems.  jmorecfg.h contains\n * manual configuration options that most people need not worry about.\n */\n\n#ifndef JCONFIG_INCLUDED\t/* in case jinclude.h already did */\n#include \"jconfig.h\"\t\t/* widely used configuration options */\n#endif\n#include \"jmorecfg.h\"\t\t/* seldom changed options */\n\n\n/* Version ID for the JPEG library.\n * Might be useful for tests like \"#if JPEG_LIB_VERSION >= 60\".\n */\n\n#define JPEG_LIB_VERSION  62\t/* Version 6b */\n\n\n/* Various constants determining the sizes of things.\n * All of these are specified by the JPEG standard, so don't change them\n * if you want to be compatible.\n */\n\n#define DCTSIZE\t\t    8\t/* The basic DCT block is 8x8 samples */\n#define DCTSIZE2\t    64\t/* DCTSIZE squared; # of elements in a block */\n#define NUM_QUANT_TBLS      4\t/* Quantization tables are numbered 0..3 */\n#define NUM_HUFF_TBLS       4\t/* Huffman tables are numbered 0..3 */\n#define NUM_ARITH_TBLS      16\t/* Arith-coding tables are numbered 0..15 */\n#define MAX_COMPS_IN_SCAN   4\t/* JPEG limit on # of components in one scan */\n#define MAX_SAMP_FACTOR     4\t/* JPEG limit on sampling factors */\n/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard;\n * the PostScript DCT filter can emit files with many more than 10 blocks/MCU.\n * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU\n * to handle it.  We even let you do this from the jconfig.h file.  However,\n * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe\n * sometimes emits noncompliant files doesn't mean you should too.\n */\n#define C_MAX_BLOCKS_IN_MCU   10 /* compressor's limit on blocks per MCU */\n#ifndef D_MAX_BLOCKS_IN_MCU\n#define D_MAX_BLOCKS_IN_MCU   10 /* decompressor's limit on blocks per MCU */\n#endif\n\n\n/* Data structures for images (arrays of samples and of DCT coefficients).\n * On 80x86 machines, the image arrays are too big for near pointers,\n * but the pointer arrays can fit in near memory.\n */\n\ntypedef JSAMPLE  *JSAMPROW;\t/* ptr to one image row of pixel samples. */\ntypedef JSAMPROW *JSAMPARRAY;\t/* ptr to some rows (a 2-D sample array) */\ntypedef JSAMPARRAY *JSAMPIMAGE;\t/* a 3-D sample array: top index is color */\n\ntypedef JCOEF JBLOCK[DCTSIZE2];\t/* one block of coefficients */\ntypedef JBLOCK  *JBLOCKROW;\t/* pointer to one row of coefficient blocks */\ntypedef JBLOCKROW *JBLOCKARRAY;\t\t/* a 2-D array of coefficient blocks */\ntypedef JBLOCKARRAY *JBLOCKIMAGE;\t/* a 3-D array of coefficient blocks */\n\ntypedef JCOEF  *JCOEFPTR;\t/* useful in a couple of places */\n\n\n/* Types for JPEG compression parameters and working tables. */\n\n\n/* DCT coefficient quantization tables. */\n\ntypedef struct {\n  /* This array gives the coefficient quantizers in natural array order\n   * (not the zigzag order in which they are stored in a JPEG DQT marker).\n   * CAUTION: IJG versions prior to v6a kept this array in zigzag order.\n   */\n  UINT16 quantval[DCTSIZE2];\t/* quantization step for each coefficient */\n  /* This field is used only during compression.  It's initialized FALSE when\n   * the table is created, and set TRUE when it's been output to the file.\n   * You could suppress output of a table by setting this to TRUE.\n   * (See jpeg_suppress_tables for an example.)\n   */\n  boolean sent_table;\t\t/* TRUE when table has been output */\n} JQUANT_TBL;\n\n\n/* Huffman coding tables. */\n\ntypedef struct {\n  /* These two fields directly represent the contents of a JPEG DHT marker */\n  UINT8 bits[17];\t\t/* bits[k] = # of symbols with codes of */\n\t\t\t\t/* length k bits; bits[0] is unused */\n  UINT8 huffval[256];\t\t/* The symbols, in order of incr code length */\n  /* This field is used only during compression.  It's initialized FALSE when\n   * the table is created, and set TRUE when it's been output to the file.\n   * You could suppress output of a table by setting this to TRUE.\n   * (See jpeg_suppress_tables for an example.)\n   */\n  boolean sent_table;\t\t/* TRUE when table has been output */\n} JHUFF_TBL;\n\n\n/* Basic info about one component (color channel). */\n\ntypedef struct {\n  /* These values are fixed over the whole image. */\n  /* For compression, they must be supplied by parameter setup; */\n  /* for decompression, they are read from the SOF marker. */\n  int component_id;\t\t/* identifier for this component (0..255) */\n  int component_index;\t\t/* its index in SOF or cinfo->comp_info[] */\n  int h_samp_factor;\t\t/* horizontal sampling factor (1..4) */\n  int v_samp_factor;\t\t/* vertical sampling factor (1..4) */\n  int quant_tbl_no;\t\t/* quantization table selector (0..3) */\n  /* These values may vary between scans. */\n  /* For compression, they must be supplied by parameter setup; */\n  /* for decompression, they are read from the SOS marker. */\n  /* The decompressor output side may not use these variables. */\n  int dc_tbl_no;\t\t/* DC entropy table selector (0..3) */\n  int ac_tbl_no;\t\t/* AC entropy table selector (0..3) */\n  \n  /* Remaining fields should be treated as private by applications. */\n  \n  /* These values are computed during compression or decompression startup: */\n  /* Component's size in DCT blocks.\n   * Any dummy blocks added to complete an MCU are not counted; therefore\n   * these values do not depend on whether a scan is interleaved or not.\n   */\n  JDIMENSION width_in_blocks;\n  JDIMENSION height_in_blocks;\n  /* Size of a DCT block in samples.  Always DCTSIZE for compression.\n   * For decompression this is the size of the output from one DCT block,\n   * reflecting any scaling we choose to apply during the IDCT step.\n   * Values of 1,2,4,8 are likely to be supported.  Note that different\n   * components may receive different IDCT scalings.\n   */\n  int DCT_scaled_size;\n  /* The downsampled dimensions are the component's actual, unpadded number\n   * of samples at the main buffer (preprocessing/compression interface), thus\n   * downsampled_width = ceil(image_width * Hi/Hmax)\n   * and similarly for height.  For decompression, IDCT scaling is included, so\n   * downsampled_width = ceil(image_width * Hi/Hmax * DCT_scaled_size/DCTSIZE)\n   */\n  JDIMENSION downsampled_width;\t /* actual width in samples */\n  JDIMENSION downsampled_height; /* actual height in samples */\n  /* This flag is used only for decompression.  In cases where some of the\n   * components will be ignored (eg grayscale output from YCbCr image),\n   * we can skip most computations for the unused components.\n   */\n  boolean component_needed;\t/* do we need the value of this component? */\n\n  /* These values are computed before starting a scan of the component. */\n  /* The decompressor output side may not use these variables. */\n  int MCU_width;\t\t/* number of blocks per MCU, horizontally */\n  int MCU_height;\t\t/* number of blocks per MCU, vertically */\n  int MCU_blocks;\t\t/* MCU_width * MCU_height */\n  int MCU_sample_width;\t\t/* MCU width in samples, MCU_width*DCT_scaled_size */\n  int last_col_width;\t\t/* # of non-dummy blocks across in last MCU */\n  int last_row_height;\t\t/* # of non-dummy blocks down in last MCU */\n\n  /* Saved quantization table for component; NULL if none yet saved.\n   * See jdinput.c comments about the need for this information.\n   * This field is currently used only for decompression.\n   */\n  JQUANT_TBL * quant_table;\n\n  /* Private per-component storage for DCT or IDCT subsystem. */\n  void * dct_table;\n} jpeg_component_info;\n\n\n/* The script for encoding a multiple-scan file is an array of these: */\n\ntypedef struct {\n  int comps_in_scan;\t\t/* number of components encoded in this scan */\n  int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */\n  int Ss, Se;\t\t\t/* progressive JPEG spectral selection parms */\n  int Ah, Al;\t\t\t/* progressive JPEG successive approx. parms */\n} jpeg_scan_info;\n\n/* The decompressor can save APPn and COM markers in a list of these: */\n\ntypedef struct jpeg_marker_struct  * jpeg_saved_marker_ptr;\n\nstruct jpeg_marker_struct {\n  jpeg_saved_marker_ptr next;\t/* next in list, or NULL */\n  UINT8 marker;\t\t\t/* marker code: JPEG_COM, or JPEG_APP0+n */\n  unsigned int original_length;\t/* # bytes of data in the file */\n  unsigned int data_length;\t/* # bytes of data saved at data[] */\n  JOCTET  * data;\t\t/* the data contained in the marker */\n  /* the marker length word is not counted in data_length or original_length */\n};\n\n/* Known color spaces. */\n\ntypedef enum {\n\tJCS_UNKNOWN,\t\t/* error/unspecified */\n\tJCS_GRAYSCALE,\t\t/* monochrome */\n\tJCS_RGB,\t\t/* red/green/blue */\n\tJCS_YCbCr,\t\t/* Y/Cb/Cr (also known as YUV) */\n\tJCS_CMYK,\t\t/* C/M/Y/K */\n\tJCS_YCCK\t\t/* Y/Cb/Cr/K */\n} J_COLOR_SPACE;\n\n/* DCT/IDCT algorithm options. */\n\ntypedef enum {\n\tJDCT_ISLOW,\t\t/* slow but accurate integer algorithm */\n\tJDCT_IFAST,\t\t/* faster, less accurate integer method */\n\tJDCT_FLOAT\t\t/* floating-point: accurate, fast on fast HW */\n} J_DCT_METHOD;\n\n#ifndef JDCT_DEFAULT\t\t/* may be overridden in jconfig.h */\n#define JDCT_DEFAULT  JDCT_ISLOW\n#endif\n#ifndef JDCT_FASTEST\t\t/* may be overridden in jconfig.h */\n#define JDCT_FASTEST  JDCT_IFAST\n#endif\n\n/* Dithering options for decompression. */\n\ntypedef enum {\n\tJDITHER_NONE,\t\t/* no dithering */\n\tJDITHER_ORDERED,\t/* simple ordered dither */\n\tJDITHER_FS\t\t/* Floyd-Steinberg error diffusion dither */\n} J_DITHER_MODE;\n\n\n/* Common fields between JPEG compression and decompression master structs. */\n\n#define jpeg_common_fields \\\n  struct jpeg_error_mgr * err;\t/* Error handler module */\\\n  struct jpeg_memory_mgr * mem;\t/* Memory manager module */\\\n  struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\\\n  void * client_data;\t\t/* Available for use by application */\\\n  boolean is_decompressor;\t/* So common code can tell which is which */\\\n  int global_state\t\t/* For checking call sequence validity */\n\n/* Routines that are to be used by both halves of the library are declared\n * to receive a pointer to this structure.  There are no actual instances of\n * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct.\n */\nstruct jpeg_common_struct {\n  jpeg_common_fields;\t\t/* Fields common to both master struct types */\n  /* Additional fields follow in an actual jpeg_compress_struct or\n   * jpeg_decompress_struct.  All three structs must agree on these\n   * initial fields!  (This would be a lot cleaner in C++.)\n   */\n};\n\ntypedef struct jpeg_common_struct * j_common_ptr;\ntypedef struct jpeg_compress_struct * j_compress_ptr;\ntypedef struct jpeg_decompress_struct * j_decompress_ptr;\n\n\n/* Master record for a compression instance */\n\nstruct jpeg_compress_struct {\n  jpeg_common_fields;\t\t/* Fields shared with jpeg_decompress_struct */\n\n  /* Destination for compressed data */\n  struct jpeg_destination_mgr * dest;\n\n  /* Description of source image --- these fields must be filled in by\n   * outer application before starting compression.  in_color_space must\n   * be correct before you can even call jpeg_set_defaults().\n   */\n\n  JDIMENSION image_width;\t/* input image width */\n  JDIMENSION image_height;\t/* input image height */\n  int input_components;\t\t/* # of color components in input image */\n  J_COLOR_SPACE in_color_space;\t/* colorspace of input image */\n\n  double input_gamma;\t\t/* image gamma of input image */\n\n  /* Compression parameters --- these fields must be set before calling\n   * jpeg_start_compress().  We recommend calling jpeg_set_defaults() to\n   * initialize everything to reasonable defaults, then changing anything\n   * the application specifically wants to change.  That way you won't get\n   * burnt when new parameters are added.  Also note that there are several\n   * helper routines to simplify changing parameters.\n   */\n\n  int data_precision;\t\t/* bits of precision in image data */\n\n  int num_components;\t\t/* # of color components in JPEG image */\n  J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */\n\n  jpeg_component_info * comp_info;\n  /* comp_info[i] describes component that appears i'th in SOF */\n  \n  JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS];\n  /* ptrs to coefficient quantization tables, or NULL if not defined */\n  \n  JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];\n  JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];\n  /* ptrs to Huffman coding tables, or NULL if not defined */\n  \n  UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */\n  UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */\n  UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */\n\n  int num_scans;\t\t/* # of entries in scan_info array */\n  const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */\n  /* The default value of scan_info is NULL, which causes a single-scan\n   * sequential JPEG file to be emitted.  To create a multi-scan file,\n   * set num_scans and scan_info to point to an array of scan definitions.\n   */\n\n  boolean raw_data_in;\t\t/* TRUE=caller supplies downsampled data */\n  boolean arith_code;\t\t/* TRUE=arithmetic coding, FALSE=Huffman */\n  boolean optimize_coding;\t/* TRUE=optimize entropy encoding parms */\n  boolean CCIR601_sampling;\t/* TRUE=first samples are cosited */\n  int smoothing_factor;\t\t/* 1..100, or 0 for no input smoothing */\n  J_DCT_METHOD dct_method;\t/* DCT algorithm selector */\n\n  /* The restart interval can be specified in absolute MCUs by setting\n   * restart_interval, or in MCU rows by setting restart_in_rows\n   * (in which case the correct restart_interval will be figured\n   * for each scan).\n   */\n  unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */\n  int restart_in_rows;\t\t/* if > 0, MCU rows per restart interval */\n\n  /* Parameters controlling emission of special markers. */\n\n  boolean write_JFIF_header;\t/* should a JFIF marker be written? */\n  UINT8 JFIF_major_version;\t/* What to write for the JFIF version number */\n  UINT8 JFIF_minor_version;\n  /* These three values are not used by the JPEG code, merely copied */\n  /* into the JFIF APP0 marker.  density_unit can be 0 for unknown, */\n  /* 1 for dots/inch, or 2 for dots/cm.  Note that the pixel aspect */\n  /* ratio is defined by X_density/Y_density even when density_unit=0. */\n  UINT8 density_unit;\t\t/* JFIF code for pixel size units */\n  UINT16 X_density;\t\t/* Horizontal pixel density */\n  UINT16 Y_density;\t\t/* Vertical pixel density */\n  boolean write_Adobe_marker;\t/* should an Adobe marker be written? */\n  \n  /* State variable: index of next scanline to be written to\n   * jpeg_write_scanlines().  Application may use this to control its\n   * processing loop, e.g., \"while (next_scanline < image_height)\".\n   */\n\n  JDIMENSION next_scanline;\t/* 0 .. image_height-1  */\n\n  /* Remaining fields are known throughout compressor, but generally\n   * should not be touched by a surrounding application.\n   */\n\n  /*\n   * These fields are computed during compression startup\n   */\n  boolean progressive_mode;\t/* TRUE if scan script uses progressive mode */\n  int max_h_samp_factor;\t/* largest h_samp_factor */\n  int max_v_samp_factor;\t/* largest v_samp_factor */\n\n  JDIMENSION total_iMCU_rows;\t/* # of iMCU rows to be input to coef ctlr */\n  /* The coefficient controller receives data in units of MCU rows as defined\n   * for fully interleaved scans (whether the JPEG file is interleaved or not).\n   * There are v_samp_factor * DCTSIZE sample rows of each component in an\n   * \"iMCU\" (interleaved MCU) row.\n   */\n  \n  /*\n   * These fields are valid during any one scan.\n   * They describe the components and MCUs actually appearing in the scan.\n   */\n  int comps_in_scan;\t\t/* # of JPEG components in this scan */\n  jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];\n  /* *cur_comp_info[i] describes component that appears i'th in SOS */\n  \n  JDIMENSION MCUs_per_row;\t/* # of MCUs across the image */\n  JDIMENSION MCU_rows_in_scan;\t/* # of MCU rows in the image */\n  \n  int blocks_in_MCU;\t\t/* # of DCT blocks per MCU */\n  int MCU_membership[C_MAX_BLOCKS_IN_MCU];\n  /* MCU_membership[i] is index in cur_comp_info of component owning */\n  /* i'th block in an MCU */\n\n  int Ss, Se, Ah, Al;\t\t/* progressive JPEG parameters for scan */\n\n  /*\n   * Links to compression subobjects (methods and private variables of modules)\n   */\n  struct jpeg_comp_master * master;\n  struct jpeg_c_main_controller * main;\n  struct jpeg_c_prep_controller * prep;\n  struct jpeg_c_coef_controller * coef;\n  struct jpeg_marker_writer * marker;\n  struct jpeg_color_converter * cconvert;\n  struct jpeg_downsampler * downsample;\n  struct jpeg_forward_dct * fdct;\n  struct jpeg_entropy_encoder * entropy;\n  jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */\n  int script_space_size;\n};\n\n\n/* Master record for a decompression instance */\n\nstruct jpeg_decompress_struct {\n  jpeg_common_fields;\t\t/* Fields shared with jpeg_compress_struct */\n\n  /* Source of compressed data */\n  struct jpeg_source_mgr * src;\n\n  /* Basic description of image --- filled in by jpeg_read_header(). */\n  /* Application may inspect these values to decide how to process image. */\n\n  JDIMENSION image_width;\t/* nominal image width (from SOF marker) */\n  JDIMENSION image_height;\t/* nominal image height */\n  int num_components;\t\t/* # of color components in JPEG image */\n  J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */\n\n  /* Decompression processing parameters --- these fields must be set before\n   * calling jpeg_start_decompress().  Note that jpeg_read_header() initializes\n   * them to default values.\n   */\n\n  J_COLOR_SPACE out_color_space; /* colorspace for output */\n\n  unsigned int scale_num, scale_denom; /* fraction by which to scale image */\n\n  double output_gamma;\t\t/* image gamma wanted in output */\n\n  boolean buffered_image;\t/* TRUE=multiple output passes */\n  boolean raw_data_out;\t\t/* TRUE=downsampled data wanted */\n\n  J_DCT_METHOD dct_method;\t/* IDCT algorithm selector */\n  boolean do_fancy_upsampling;\t/* TRUE=apply fancy upsampling */\n  boolean do_block_smoothing;\t/* TRUE=apply interblock smoothing */\n\n  boolean quantize_colors;\t/* TRUE=colormapped output wanted */\n  /* the following are ignored if not quantize_colors: */\n  J_DITHER_MODE dither_mode;\t/* type of color dithering to use */\n  boolean two_pass_quantize;\t/* TRUE=use two-pass color quantization */\n  int desired_number_of_colors;\t/* max # colors to use in created colormap */\n  /* these are significant only in buffered-image mode: */\n  boolean enable_1pass_quant;\t/* enable future use of 1-pass quantizer */\n  boolean enable_external_quant;/* enable future use of external colormap */\n  boolean enable_2pass_quant;\t/* enable future use of 2-pass quantizer */\n\n  /* Description of actual output image that will be returned to application.\n   * These fields are computed by jpeg_start_decompress().\n   * You can also use jpeg_calc_output_dimensions() to determine these values\n   * in advance of calling jpeg_start_decompress().\n   */\n\n  JDIMENSION output_width;\t/* scaled image width */\n  JDIMENSION output_height;\t/* scaled image height */\n  int out_color_components;\t/* # of color components in out_color_space */\n  int output_components;\t/* # of color components returned */\n  /* output_components is 1 (a colormap index) when quantizing colors;\n   * otherwise it equals out_color_components.\n   */\n  int rec_outbuf_height;\t/* min recommended height of scanline buffer */\n  /* If the buffer passed to jpeg_read_scanlines() is less than this many rows\n   * high, space and time will be wasted due to unnecessary data copying.\n   * Usually rec_outbuf_height will be 1 or 2, at most 4.\n   */\n\n  /* When quantizing colors, the output colormap is described by these fields.\n   * The application can supply a colormap by setting colormap non-NULL before\n   * calling jpeg_start_decompress; otherwise a colormap is created during\n   * jpeg_start_decompress or jpeg_start_output.\n   * The map has out_color_components rows and actual_number_of_colors columns.\n   */\n  int actual_number_of_colors;\t/* number of entries in use */\n  JSAMPARRAY colormap;\t\t/* The color map as a 2-D pixel array */\n\n  /* State variables: these variables indicate the progress of decompression.\n   * The application may examine these but must not modify them.\n   */\n\n  /* Row index of next scanline to be read from jpeg_read_scanlines().\n   * Application may use this to control its processing loop, e.g.,\n   * \"while (output_scanline < output_height)\".\n   */\n  JDIMENSION output_scanline;\t/* 0 .. output_height-1  */\n\n  /* Current input scan number and number of iMCU rows completed in scan.\n   * These indicate the progress of the decompressor input side.\n   */\n  int input_scan_number;\t/* Number of SOS markers seen so far */\n  JDIMENSION input_iMCU_row;\t/* Number of iMCU rows completed */\n\n  /* The \"output scan number\" is the notional scan being displayed by the\n   * output side.  The decompressor will not allow output scan/row number\n   * to get ahead of input scan/row, but it can fall arbitrarily far behind.\n   */\n  int output_scan_number;\t/* Nominal scan number being displayed */\n  JDIMENSION output_iMCU_row;\t/* Number of iMCU rows read */\n\n  /* Current progression status.  coef_bits[c][i] indicates the precision\n   * with which component c's DCT coefficient i (in zigzag order) is known.\n   * It is -1 when no data has yet been received, otherwise it is the point\n   * transform (shift) value for the most recent scan of the coefficient\n   * (thus, 0 at completion of the progression).\n   * This pointer is NULL when reading a non-progressive file.\n   */\n  int (*coef_bits)[DCTSIZE2];\t/* -1 or current Al value for each coef */\n\n  /* Internal JPEG parameters --- the application usually need not look at\n   * these fields.  Note that the decompressor output side may not use\n   * any parameters that can change between scans.\n   */\n\n  /* Quantization and Huffman tables are carried forward across input\n   * datastreams when processing abbreviated JPEG datastreams.\n   */\n\n  JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS];\n  /* ptrs to coefficient quantization tables, or NULL if not defined */\n\n  JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];\n  JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];\n  /* ptrs to Huffman coding tables, or NULL if not defined */\n\n  /* These parameters are never carried across datastreams, since they\n   * are given in SOF/SOS markers or defined to be reset by SOI.\n   */\n\n  int data_precision;\t\t/* bits of precision in image data */\n\n  jpeg_component_info * comp_info;\n  /* comp_info[i] describes component that appears i'th in SOF */\n\n  boolean progressive_mode;\t/* TRUE if SOFn specifies progressive mode */\n  boolean arith_code;\t\t/* TRUE=arithmetic coding, FALSE=Huffman */\n\n  UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */\n  UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */\n  UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */\n\n  unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */\n\n  /* These fields record data obtained from optional markers recognized by\n   * the JPEG library.\n   */\n  boolean saw_JFIF_marker;\t/* TRUE iff a JFIF APP0 marker was found */\n  /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */\n  UINT8 JFIF_major_version;\t/* JFIF version number */\n  UINT8 JFIF_minor_version;\n  UINT8 density_unit;\t\t/* JFIF code for pixel size units */\n  UINT16 X_density;\t\t/* Horizontal pixel density */\n  UINT16 Y_density;\t\t/* Vertical pixel density */\n  boolean saw_Adobe_marker;\t/* TRUE iff an Adobe APP14 marker was found */\n  UINT8 Adobe_transform;\t/* Color transform code from Adobe marker */\n\n  boolean CCIR601_sampling;\t/* TRUE=first samples are cosited */\n\n  /* Aside from the specific data retained from APPn markers known to the\n   * library, the uninterpreted contents of any or all APPn and COM markers\n   * can be saved in a list for examination by the application.\n   */\n  jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */\n\n  /* Remaining fields are known throughout decompressor, but generally\n   * should not be touched by a surrounding application.\n   */\n\n  /*\n   * These fields are computed during decompression startup\n   */\n  int max_h_samp_factor;\t/* largest h_samp_factor */\n  int max_v_samp_factor;\t/* largest v_samp_factor */\n\n  int min_DCT_scaled_size;\t/* smallest DCT_scaled_size of any component */\n\n  JDIMENSION total_iMCU_rows;\t/* # of iMCU rows in image */\n  /* The coefficient controller's input and output progress is measured in\n   * units of \"iMCU\" (interleaved MCU) rows.  These are the same as MCU rows\n   * in fully interleaved JPEG scans, but are used whether the scan is\n   * interleaved or not.  We define an iMCU row as v_samp_factor DCT block\n   * rows of each component.  Therefore, the IDCT output contains\n   * v_samp_factor*DCT_scaled_size sample rows of a component per iMCU row.\n   */\n\n  JSAMPLE * sample_range_limit; /* table for fast range-limiting */\n\n  /*\n   * These fields are valid during any one scan.\n   * They describe the components and MCUs actually appearing in the scan.\n   * Note that the decompressor output side must not use these fields.\n   */\n  int comps_in_scan;\t\t/* # of JPEG components in this scan */\n  jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];\n  /* *cur_comp_info[i] describes component that appears i'th in SOS */\n\n  JDIMENSION MCUs_per_row;\t/* # of MCUs across the image */\n  JDIMENSION MCU_rows_in_scan;\t/* # of MCU rows in the image */\n\n  int blocks_in_MCU;\t\t/* # of DCT blocks per MCU */\n  int MCU_membership[D_MAX_BLOCKS_IN_MCU];\n  /* MCU_membership[i] is index in cur_comp_info of component owning */\n  /* i'th block in an MCU */\n\n  int Ss, Se, Ah, Al;\t\t/* progressive JPEG parameters for scan */\n\n  /* This field is shared between entropy decoder and marker parser.\n   * It is either zero or the code of a JPEG marker that has been\n   * read from the data source, but has not yet been processed.\n   */\n  int unread_marker;\n\n  /*\n   * Links to decompression subobjects (methods, private variables of modules)\n   */\n  struct jpeg_decomp_master * master;\n  struct jpeg_d_main_controller * main;\n  struct jpeg_d_coef_controller * coef;\n  struct jpeg_d_post_controller * post;\n  struct jpeg_input_controller * inputctl;\n  struct jpeg_marker_reader * marker;\n  struct jpeg_entropy_decoder * entropy;\n  struct jpeg_inverse_dct * idct;\n  struct jpeg_upsampler * upsample;\n  struct jpeg_color_deconverter * cconvert;\n  struct jpeg_color_quantizer * cquantize;\n};\n\n\n/* \"Object\" declarations for JPEG modules that may be supplied or called\n * directly by the surrounding application.\n * As with all objects in the JPEG library, these structs only define the\n * publicly visible methods and state variables of a module.  Additional\n * private fields may exist after the public ones.\n */\n\n\n/* Error handler object */\n\nstruct jpeg_error_mgr {\n  /* Error exit handler: does not return to caller */\n  JMETHOD(void, error_exit, (j_common_ptr cinfo));\n  /* Conditionally emit a trace or warning message */\n  JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level));\n  /* Routine that actually outputs a trace or error message */\n  JMETHOD(void, output_message, (j_common_ptr cinfo));\n  /* Format a message string for the most recent JPEG error or message */\n  JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer));\n#define JMSG_LENGTH_MAX  200\t/* recommended size of format_message buffer */\n  /* Reset error state variables at start of a new image */\n  JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo));\n  \n  /* The message ID code and any parameters are saved here.\n   * A message can have one string parameter or up to 8 int parameters.\n   */\n  int msg_code;\n#define JMSG_STR_PARM_MAX  80\n  union {\n    int i[8];\n    char s[JMSG_STR_PARM_MAX];\n  } msg_parm;\n  \n  /* Standard state variables for error facility */\n  \n  int trace_level;\t\t/* max msg_level that will be displayed */\n  \n  /* For recoverable corrupt-data errors, we emit a warning message,\n   * but keep going unless emit_message chooses to abort.  emit_message\n   * should count warnings in num_warnings.  The surrounding application\n   * can check for bad data by seeing if num_warnings is nonzero at the\n   * end of processing.\n   */\n  long num_warnings;\t\t/* number of corrupt-data warnings */\n\n  /* These fields point to the table(s) of error message strings.\n   * An application can change the table pointer to switch to a different\n   * message list (typically, to change the language in which errors are\n   * reported).  Some applications may wish to add additional error codes\n   * that will be handled by the JPEG library error mechanism; the second\n   * table pointer is used for this purpose.\n   *\n   * First table includes all errors generated by JPEG library itself.\n   * Error code 0 is reserved for a \"no such error string\" message.\n   */\n  const char * const * jpeg_message_table; /* Library errors */\n  int last_jpeg_message;    /* Table contains strings 0..last_jpeg_message */\n  /* Second table can be added by application (see cjpeg/djpeg for example).\n   * It contains strings numbered first_addon_message..last_addon_message.\n   */\n  const char * const * addon_message_table; /* Non-library errors */\n  int first_addon_message;\t/* code for first string in addon table */\n  int last_addon_message;\t/* code for last string in addon table */\n};\n\n\n/* Progress monitor object */\n\nstruct jpeg_progress_mgr {\n  JMETHOD(void, progress_monitor, (j_common_ptr cinfo));\n\n  long pass_counter;\t\t/* work units completed in this pass */\n  long pass_limit;\t\t/* total number of work units in this pass */\n  int completed_passes;\t\t/* passes completed so far */\n  int total_passes;\t\t/* total number of passes expected */\n};\n\n\n/* Data destination object for compression */\n\nstruct jpeg_destination_mgr {\n  JOCTET * next_output_byte;\t/* => next byte to write in buffer */\n  size_t free_in_buffer;\t/* # of byte spaces remaining in buffer */\n\n  JMETHOD(void, init_destination, (j_compress_ptr cinfo));\n  JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo));\n  JMETHOD(void, term_destination, (j_compress_ptr cinfo));\n};\n\n\n/* Data source object for decompression */\n\nstruct jpeg_source_mgr {\n  const JOCTET * next_input_byte; /* => next byte to read from buffer */\n  size_t bytes_in_buffer;\t/* # of bytes remaining in buffer */\n\n  JMETHOD(void, init_source, (j_decompress_ptr cinfo));\n  JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo));\n  JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes));\n  JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired));\n  JMETHOD(void, term_source, (j_decompress_ptr cinfo));\n};\n\n\n/* Memory manager object.\n * Allocates \"small\" objects (a few K total), \"large\" objects (tens of K),\n * and \"really big\" objects (virtual arrays with backing store if needed).\n * The memory manager does not allow individual objects to be freed; rather,\n * each created object is assigned to a pool, and whole pools can be freed\n * at once.  This is faster and more convenient than remembering exactly what\n * to free, especially where malloc()/free() are not too speedy.\n * NB: alloc routines never return NULL.  They exit to error_exit if not\n * successful.\n */\n\n#define JPOOL_PERMANENT\t0\t/* lasts until master record is destroyed */\n#define JPOOL_IMAGE\t1\t/* lasts until done with image/datastream */\n#define JPOOL_NUMPOOLS\t2\n\ntypedef struct jvirt_sarray_control * jvirt_sarray_ptr;\ntypedef struct jvirt_barray_control * jvirt_barray_ptr;\n\n\nstruct jpeg_memory_mgr {\n  /* Method pointers */\n  JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id,\n\t\t\t\tsize_t sizeofobject));\n  JMETHOD(void  *, alloc_large, (j_common_ptr cinfo, int pool_id,\n\t\t\t\t     size_t sizeofobject));\n  JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id,\n\t\t\t\t     JDIMENSION samplesperrow,\n\t\t\t\t     JDIMENSION numrows));\n  JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id,\n\t\t\t\t      JDIMENSION blocksperrow,\n\t\t\t\t      JDIMENSION numrows));\n  JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo,\n\t\t\t\t\t\t  int pool_id,\n\t\t\t\t\t\t  boolean pre_zero,\n\t\t\t\t\t\t  JDIMENSION samplesperrow,\n\t\t\t\t\t\t  JDIMENSION numrows,\n\t\t\t\t\t\t  JDIMENSION maxaccess));\n  JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo,\n\t\t\t\t\t\t  int pool_id,\n\t\t\t\t\t\t  boolean pre_zero,\n\t\t\t\t\t\t  JDIMENSION blocksperrow,\n\t\t\t\t\t\t  JDIMENSION numrows,\n\t\t\t\t\t\t  JDIMENSION maxaccess));\n  JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo));\n  JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo,\n\t\t\t\t\t   jvirt_sarray_ptr ptr,\n\t\t\t\t\t   JDIMENSION start_row,\n\t\t\t\t\t   JDIMENSION num_rows,\n\t\t\t\t\t   boolean writable));\n  JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo,\n\t\t\t\t\t    jvirt_barray_ptr ptr,\n\t\t\t\t\t    JDIMENSION start_row,\n\t\t\t\t\t    JDIMENSION num_rows,\n\t\t\t\t\t    boolean writable));\n  JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id));\n  JMETHOD(void, self_destruct, (j_common_ptr cinfo));\n\n  /* Limit on memory allocation for this JPEG object.  (Note that this is\n   * merely advisory, not a guaranteed maximum; it only affects the space\n   * used for virtual-array buffers.)  May be changed by outer application\n   * after creating the JPEG object.\n   */\n  long max_memory_to_use;\n\n  /* Maximum allocation request accepted by alloc_large. */\n  long max_alloc_chunk;\n};\n\n\n/* Routine signature for application-supplied marker processing methods.\n * Need not pass marker code since it is stored in cinfo->unread_marker.\n */\ntypedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo));\n\n\n/* Declarations for routines called by application.\n * The JPP macro hides prototype parameters from compilers that can't cope.\n * Note JPP requires double parentheses.\n */\n\n#ifdef HAVE_PROTOTYPES\n#define JPP(arglist)\targlist\n#else\n#define JPP(arglist)\t()\n#endif\n\n\n/* Short forms of external names for systems with brain-damaged linkers.\n * We shorten external names to be unique in the first six letters, which\n * is good enough for all known systems.\n * (If your compiler itself needs names to be unique in less than 15 \n * characters, you are out of luck.  Get a better compiler.)\n */\n\n#ifdef NEED_SHORT_EXTERNAL_NAMES\n#define jpeg_std_error\t\tjStdError\n#define jpeg_CreateCompress\tjCreaCompress\n#define jpeg_CreateDecompress\tjCreaDecompress\n#define jpeg_destroy_compress\tjDestCompress\n#define jpeg_destroy_decompress\tjDestDecompress\n#define jpeg_stdio_dest\t\tjStdDest\n#define jpeg_stdio_src\t\tjStdSrc\n#define jpeg_set_defaults\tjSetDefaults\n#define jpeg_set_colorspace\tjSetColorspace\n#define jpeg_default_colorspace\tjDefColorspace\n#define jpeg_set_quality\tjSetQuality\n#define jpeg_set_linear_quality\tjSetLQuality\n#define jpeg_add_quant_table\tjAddQuantTable\n#define jpeg_quality_scaling\tjQualityScaling\n#define jpeg_simple_progression\tjSimProgress\n#define jpeg_suppress_tables\tjSuppressTables\n#define jpeg_alloc_quant_table\tjAlcQTable\n#define jpeg_alloc_huff_table\tjAlcHTable\n#define jpeg_start_compress\tjStrtCompress\n#define jpeg_write_scanlines\tjWrtScanlines\n#define jpeg_finish_compress\tjFinCompress\n#define jpeg_write_raw_data\tjWrtRawData\n#define jpeg_write_marker\tjWrtMarker\n#define jpeg_write_m_header\tjWrtMHeader\n#define jpeg_write_m_byte\tjWrtMByte\n#define jpeg_write_tables\tjWrtTables\n#define jpeg_read_header\tjReadHeader\n#define jpeg_start_decompress\tjStrtDecompress\n#define jpeg_read_scanlines\tjReadScanlines\n#define jpeg_finish_decompress\tjFinDecompress\n#define jpeg_read_raw_data\tjReadRawData\n#define jpeg_has_multiple_scans\tjHasMultScn\n#define jpeg_start_output\tjStrtOutput\n#define jpeg_finish_output\tjFinOutput\n#define jpeg_input_complete\tjInComplete\n#define jpeg_new_colormap\tjNewCMap\n#define jpeg_consume_input\tjConsumeInput\n#define jpeg_calc_output_dimensions\tjCalcDimensions\n#define jpeg_save_markers\tjSaveMarkers\n#define jpeg_set_marker_processor\tjSetMarker\n#define jpeg_read_coefficients\tjReadCoefs\n#define jpeg_write_coefficients\tjWrtCoefs\n#define jpeg_copy_critical_parameters\tjCopyCrit\n#define jpeg_abort_compress\tjAbrtCompress\n#define jpeg_abort_decompress\tjAbrtDecompress\n#define jpeg_abort\t\tjAbort\n#define jpeg_destroy\t\tjDestroy\n#define jpeg_resync_to_restart\tjResyncRestart\n#endif /* NEED_SHORT_EXTERNAL_NAMES */\n\n\n/* Default error-management setup */\nEXTERN(struct jpeg_error_mgr *) jpeg_std_error\n\tJPP((struct jpeg_error_mgr * err));\n\n/* Initialization of JPEG compression objects.\n * jpeg_create_compress() and jpeg_create_decompress() are the exported\n * names that applications should call.  These expand to calls on\n * jpeg_CreateCompress and jpeg_CreateDecompress with additional information\n * passed for version mismatch checking.\n * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx.\n */\n#define jpeg_create_compress(cinfo) \\\n    jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \\\n\t\t\t(size_t) sizeof(struct jpeg_compress_struct))\n#define jpeg_create_decompress(cinfo) \\\n    jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \\\n\t\t\t  (size_t) sizeof(struct jpeg_decompress_struct))\nEXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo,\n\t\t\t\t      int version, size_t structsize));\nEXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo,\n\t\t\t\t\tint version, size_t structsize));\n/* Destruction of JPEG compression objects */\nEXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo));\nEXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo));\n\n#if 0\n/* Standard data source and destination managers: stdio streams. */\n/* Caller is responsible for opening the file before and closing after. */\nEXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FXSYS_FILE * outfile));\nEXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FXSYS_FILE * infile));\n#endif\n\n/* Default parameter setup for compression */\nEXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo));\n/* Compression parameter setup aids */\nEXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo,\n\t\t\t\t      J_COLOR_SPACE colorspace));\nEXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo));\nEXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality,\n\t\t\t\t   boolean force_baseline));\nEXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo,\n\t\t\t\t\t  int scale_factor,\n\t\t\t\t\t  boolean force_baseline));\nEXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl,\n\t\t\t\t       const unsigned int *basic_table,\n\t\t\t\t       int scale_factor,\n\t\t\t\t       boolean force_baseline));\nEXTERN(int) jpeg_quality_scaling JPP((int quality));\nEXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo));\nEXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo,\n\t\t\t\t       boolean suppress));\nEXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo));\nEXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo));\n\n/* Main entry points for compression */\nEXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo,\n\t\t\t\t      boolean write_all_tables));\nEXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo,\n\t\t\t\t\t     JSAMPARRAY scanlines,\n\t\t\t\t\t     JDIMENSION num_lines));\nEXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo));\n\n/* Replaces jpeg_write_scanlines when writing raw downsampled data. */\nEXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo,\n\t\t\t\t\t    JSAMPIMAGE data,\n\t\t\t\t\t    JDIMENSION num_lines));\n\n/* Write a special marker.  See libjpeg.doc concerning safe usage. */\nEXTERN(void) jpeg_write_marker\n\tJPP((j_compress_ptr cinfo, int marker,\n\t     const JOCTET * dataptr, unsigned int datalen));\n/* Same, but piecemeal. */\nEXTERN(void) jpeg_write_m_header\n\tJPP((j_compress_ptr cinfo, int marker, unsigned int datalen));\nEXTERN(void) jpeg_write_m_byte\n\tJPP((j_compress_ptr cinfo, int val));\n\n/* Alternate compression function: just write an abbreviated table file */\nEXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo));\n\n/* Decompression startup: read start of JPEG datastream to see what's there */\nEXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo,\n\t\t\t\t  boolean require_image));\n/* Return value is one of: */\n#define JPEG_SUSPENDED\t\t0 /* Suspended due to lack of input data */\n#define JPEG_HEADER_OK\t\t1 /* Found valid image datastream */\n#define JPEG_HEADER_TABLES_ONLY\t2 /* Found valid table-specs-only datastream */\n/* If you pass require_image = TRUE (normal case), you need not check for\n * a TABLES_ONLY return code; an abbreviated file will cause an error exit.\n * JPEG_SUSPENDED is only possible if you use a data source module that can\n * give a suspension return (the stdio source module doesn't).\n */\n\n/* Main entry points for decompression */\nEXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo));\nEXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo,\n\t\t\t\t\t    JSAMPARRAY scanlines,\n\t\t\t\t\t    JDIMENSION max_lines));\nEXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo));\n\n/* Replaces jpeg_read_scanlines when reading raw downsampled data. */\nEXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo,\n\t\t\t\t\t   JSAMPIMAGE data,\n\t\t\t\t\t   JDIMENSION max_lines));\n\n/* Additional entry points for buffered-image mode. */\nEXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo));\nEXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo,\n\t\t\t\t       int scan_number));\nEXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo));\nEXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo));\nEXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo));\nEXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo));\n/* Return value is one of: */\n/* #define JPEG_SUSPENDED\t0    Suspended due to lack of input data */\n#define JPEG_REACHED_SOS\t1 /* Reached start of new scan */\n#define JPEG_REACHED_EOI\t2 /* Reached end of image */\n#define JPEG_ROW_COMPLETED\t3 /* Completed one iMCU row */\n#define JPEG_SCAN_COMPLETED\t4 /* Completed last iMCU row of a scan */\n\n/* Precalculate output dimensions for current decompression parameters. */\nEXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo));\n\n/* Control saving of COM and APPn markers into marker_list. */\nEXTERN(void) jpeg_save_markers\n\tJPP((j_decompress_ptr cinfo, int marker_code,\n\t     unsigned int length_limit));\n\n/* Install a special processing method for COM or APPn markers. */\nEXTERN(void) jpeg_set_marker_processor\n\tJPP((j_decompress_ptr cinfo, int marker_code,\n\t     jpeg_marker_parser_method routine));\n\n/* Read or write raw DCT coefficients --- useful for lossless transcoding. */\nEXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo));\nEXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo,\n\t\t\t\t\t  jvirt_barray_ptr * coef_arrays));\nEXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo,\n\t\t\t\t\t\tj_compress_ptr dstinfo));\n\n/* If you choose to abort compression or decompression before completing\n * jpeg_finish_(de)compress, then you need to clean up to release memory,\n * temporary files, etc.  You can just call jpeg_destroy_(de)compress\n * if you're done with the JPEG object, but if you want to clean it up and\n * reuse it, call this:\n */\nEXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo));\nEXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo));\n\n/* Generic versions of jpeg_abort and jpeg_destroy that work on either\n * flavor of JPEG object.  These may be more convenient in some places.\n */\nEXTERN(void) jpeg_abort JPP((j_common_ptr cinfo));\nEXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo));\n\n/* Default restart-marker-resync procedure for use by data source modules */\nEXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo,\n\t\t\t\t\t    int desired));\n\n\n/* These marker codes are exported since applications and data source modules\n * are likely to want to use them.\n */\n\n#define JPEG_RST0\t0xD0\t/* RST0 marker code */\n#define JPEG_EOI\t0xD9\t/* EOI marker code */\n#define JPEG_APP0\t0xE0\t/* APP0 marker code */\n#define JPEG_COM\t0xFE\t/* COM marker code */\n\n\n/* If we have a brain-damaged compiler that emits warnings (or worse, errors)\n * for structure definitions that are never filled in, keep it quiet by\n * supplying dummy definitions for the various substructures.\n */\n\n#ifdef INCOMPLETE_TYPES_BROKEN\n#ifndef JPEG_INTERNALS\t\t/* will be defined in jpegint.h */\nstruct jvirt_sarray_control { long dummy; };\nstruct jvirt_barray_control { long dummy; };\nstruct jpeg_comp_master { long dummy; };\nstruct jpeg_c_main_controller { long dummy; };\nstruct jpeg_c_prep_controller { long dummy; };\nstruct jpeg_c_coef_controller { long dummy; };\nstruct jpeg_marker_writer { long dummy; };\nstruct jpeg_color_converter { long dummy; };\nstruct jpeg_downsampler { long dummy; };\nstruct jpeg_forward_dct { long dummy; };\nstruct jpeg_entropy_encoder { long dummy; };\nstruct jpeg_decomp_master { long dummy; };\nstruct jpeg_d_main_controller { long dummy; };\nstruct jpeg_d_coef_controller { long dummy; };\nstruct jpeg_d_post_controller { long dummy; };\nstruct jpeg_input_controller { long dummy; };\nstruct jpeg_marker_reader { long dummy; };\nstruct jpeg_entropy_decoder { long dummy; };\nstruct jpeg_inverse_dct { long dummy; };\nstruct jpeg_upsampler { long dummy; };\nstruct jpeg_color_deconverter { long dummy; };\nstruct jpeg_color_quantizer { long dummy; };\n#endif /* JPEG_INTERNALS */\n#endif /* INCOMPLETE_TYPES_BROKEN */\n\n\n/*\n * The JPEG library modules define JPEG_INTERNALS before including this file.\n * The internal structure declarations are read only when that is true.\n * Applications using the library should not include jpegint.h, but may wish\n * to include jerror.h.\n */\n\n#ifdef JPEG_INTERNALS\n#include \"jpegint.h\"\t\t/* fetch private declarations */\n#include \"jerror.h\"\t\t/* fetch error codes too */\n#endif\n\n#endif /* JPEGLIB_H */\n"
  },
  {
    "path": "core/include/thirdparties/zlib/zconf.h",
    "content": "/* zconf.h -- configuration of the zlib compression library\n * Copyright (C) 1995-2013 Jean-loup Gailly.\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* @(#) $Id$ */\n\n#ifndef ZCONF_H\n#define ZCONF_H\n\n/*\n * If you *really* need a unique prefix for all types and library functions,\n * compile with -DZ_PREFIX. The \"standard\" zlib should be compiled without it.\n * Even better than compiling with -DZ_PREFIX would be to use configure to set\n * this permanently in zconf.h using \"./configure --zprefix\".\n */\n#ifdef Z_PREFIX     /* may be set to #if 1 by ./configure */\n#  define Z_PREFIX_SET\n\n/* all linked symbols */\n#  define _dist_code            z__dist_code\n#  define _length_code          z__length_code\n#  define _tr_align             z__tr_align\n#  define _tr_flush_bits        z__tr_flush_bits\n#  define _tr_flush_block       z__tr_flush_block\n#  define _tr_init              z__tr_init\n#  define _tr_stored_block      z__tr_stored_block\n#  define _tr_tally             z__tr_tally\n#  define adler32               z_adler32\n#  define adler32_combine       z_adler32_combine\n#  define adler32_combine64     z_adler32_combine64\n#  ifndef Z_SOLO\n#    define compress              z_compress\n#    define compress2             z_compress2\n#    define compressBound         z_compressBound\n#  endif\n#  define crc32                 z_crc32\n#  define crc32_combine         z_crc32_combine\n#  define crc32_combine64       z_crc32_combine64\n#  define deflate               z_deflate\n#  define deflateBound          z_deflateBound\n#  define deflateCopy           z_deflateCopy\n#  define deflateEnd            z_deflateEnd\n#  define deflateInit2_         z_deflateInit2_\n#  define deflateInit_          z_deflateInit_\n#  define deflateParams         z_deflateParams\n#  define deflatePending        z_deflatePending\n#  define deflatePrime          z_deflatePrime\n#  define deflateReset          z_deflateReset\n#  define deflateResetKeep      z_deflateResetKeep\n#  define deflateSetDictionary  z_deflateSetDictionary\n#  define deflateSetHeader      z_deflateSetHeader\n#  define deflateTune           z_deflateTune\n#  define deflate_copyright     z_deflate_copyright\n#  define get_crc_table         z_get_crc_table\n#  ifndef Z_SOLO\n#    define gz_error              z_gz_error\n#    define gz_intmax             z_gz_intmax\n#    define gz_strwinerror        z_gz_strwinerror\n#    define gzbuffer              z_gzbuffer\n#    define gzclearerr            z_gzclearerr\n#    define gzclose               z_gzclose\n#    define gzclose_r             z_gzclose_r\n#    define gzclose_w             z_gzclose_w\n#    define gzdirect              z_gzdirect\n#    define gzdopen               z_gzdopen\n#    define gzeof                 z_gzeof\n#    define gzerror               z_gzerror\n#    define gzflush               z_gzflush\n#    define gzgetc                z_gzgetc\n#    define gzgetc_               z_gzgetc_\n#    define gzgets                z_gzgets\n#    define gzoffset              z_gzoffset\n#    define gzoffset64            z_gzoffset64\n#    define gzopen                z_gzopen\n#    define gzopen64              z_gzopen64\n#    ifdef _WIN32\n#      define gzopen_w              z_gzopen_w\n#    endif\n#    define gzprintf              z_gzprintf\n#    define gzvprintf             z_gzvprintf\n#    define gzputc                z_gzputc\n#    define gzputs                z_gzputs\n#    define gzread                z_gzread\n#    define gzrewind              z_gzrewind\n#    define gzseek                z_gzseek\n#    define gzseek64              z_gzseek64\n#    define gzsetparams           z_gzsetparams\n#    define gztell                z_gztell\n#    define gztell64              z_gztell64\n#    define gzungetc              z_gzungetc\n#    define gzwrite               z_gzwrite\n#  endif\n#  define inflate               z_inflate\n#  define inflateBack           z_inflateBack\n#  define inflateBackEnd        z_inflateBackEnd\n#  define inflateBackInit_      z_inflateBackInit_\n#  define inflateCopy           z_inflateCopy\n#  define inflateEnd            z_inflateEnd\n#  define inflateGetHeader      z_inflateGetHeader\n#  define inflateInit2_         z_inflateInit2_\n#  define inflateInit_          z_inflateInit_\n#  define inflateMark           z_inflateMark\n#  define inflatePrime          z_inflatePrime\n#  define inflateReset          z_inflateReset\n#  define inflateReset2         z_inflateReset2\n#  define inflateSetDictionary  z_inflateSetDictionary\n#  define inflateGetDictionary  z_inflateGetDictionary\n#  define inflateSync           z_inflateSync\n#  define inflateSyncPoint      z_inflateSyncPoint\n#  define inflateUndermine      z_inflateUndermine\n#  define inflateResetKeep      z_inflateResetKeep\n#  define inflate_copyright     z_inflate_copyright\n#  define inflate_fast          z_inflate_fast\n#  define inflate_table         z_inflate_table\n#  ifndef Z_SOLO\n#    define uncompress            z_uncompress\n#  endif\n#  define zError                z_zError\n#  ifndef Z_SOLO\n#    define zcalloc               z_zcalloc\n#    define zcfree                z_zcfree\n#  endif\n#  define zlibCompileFlags      z_zlibCompileFlags\n#  define zlibVersion           z_zlibVersion\n\n/* all zlib typedefs in zlib.h and zconf.h */\n#  define Byte                  z_Byte\n#  define Bytef                 z_Bytef\n#  define alloc_func            z_alloc_func\n#  define charf                 z_charf\n#  define free_func             z_free_func\n#  ifndef Z_SOLO\n#    define gzFile                z_gzFile\n#  endif\n#  define gz_header             z_gz_header\n#  define gz_headerp            z_gz_headerp\n#  define in_func               z_in_func\n#  define intf                  z_intf\n#  define out_func              z_out_func\n#  define uInt                  z_uInt\n#  define uIntf                 z_uIntf\n#  define uLong                 z_uLong\n#  define uLongf                z_uLongf\n#  define voidp                 z_voidp\n#  define voidpc                z_voidpc\n#  define voidpf                z_voidpf\n\n/* all zlib structs in zlib.h and zconf.h */\n#  define gz_header_s           z_gz_header_s\n#  define internal_state        z_internal_state\n\n#endif\n\n#if defined(__MSDOS__) && !defined(MSDOS)\n#  define MSDOS\n#endif\n#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)\n#  define OS2\n#endif\n#if defined(_WINDOWS) && !defined(WINDOWS)\n#  define WINDOWS\n#endif\n#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__)\n#  ifndef WIN32\n#    define WIN32\n#  endif\n#endif\n#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)\n#  if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)\n#    ifndef SYS16BIT\n#      define SYS16BIT\n#    endif\n#  endif\n#endif\n\n/*\n * Compile with -DMAXSEG_64K if the alloc function cannot allocate more\n * than 64k bytes at a time (needed on systems with 16-bit int).\n */\n#ifdef SYS16BIT\n#  define MAXSEG_64K\n#endif\n#ifdef MSDOS\n#  define UNALIGNED_OK\n#endif\n\n#ifdef __STDC_VERSION__\n#  ifndef STDC\n#    define STDC\n#  endif\n#  if __STDC_VERSION__ >= 199901L\n#    ifndef STDC99\n#      define STDC99\n#    endif\n#  endif\n#endif\n#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))\n#  define STDC\n#endif\n#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))\n#  define STDC\n#endif\n#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))\n#  define STDC\n#endif\n#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))\n#  define STDC\n#endif\n\n#if defined(__OS400__) && !defined(STDC)    /* iSeries (formerly AS/400). */\n#  define STDC\n#endif\n\n#ifndef STDC\n#  ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */\n#    define const       /* note: need a more gentle solution here */\n#  endif\n#endif\n\n#if defined(ZLIB_CONST) && !defined(z_const)\n#  define z_const const\n#else\n#  define z_const\n#endif\n\n/* Some Mac compilers merge all .h files incorrectly: */\n#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__)\n#  define NO_DUMMY_DECL\n#endif\n\n/* Maximum value for memLevel in deflateInit2 */\n#ifndef MAX_MEM_LEVEL\n#  ifdef MAXSEG_64K\n#    define MAX_MEM_LEVEL 8\n#  else\n#    define MAX_MEM_LEVEL 9\n#  endif\n#endif\n\n/* Maximum value for windowBits in deflateInit2 and inflateInit2.\n * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files\n * created by gzip. (Files created by minigzip can still be extracted by\n * gzip.)\n */\n#ifndef MAX_WBITS\n#  define MAX_WBITS   15 /* 32K LZ77 window */\n#endif\n\n/* The memory requirements for deflate are (in bytes):\n            (1 << (windowBits+2)) +  (1 << (memLevel+9))\n that is: 128K for windowBits=15  +  128K for memLevel = 8  (default values)\n plus a few kilobytes for small objects. For example, if you want to reduce\n the default memory requirements from 256K to 128K, compile with\n     make CFLAGS=\"-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7\"\n Of course this will generally degrade compression (there's no free lunch).\n\n   The memory requirements for inflate are (in bytes) 1 << windowBits\n that is, 32K for windowBits=15 (default value) plus a few kilobytes\n for small objects.\n*/\n\n                        /* Type declarations */\n\n#ifndef OF /* function prototypes */\n#  ifdef STDC\n#    define OF(args)  args\n#  else\n#    define OF(args)  ()\n#  endif\n#endif\n\n#ifndef Z_ARG /* function prototypes for stdarg */\n#  if defined(STDC) || defined(Z_HAVE_STDARG_H)\n#    define Z_ARG(args)  args\n#  else\n#    define Z_ARG(args)  ()\n#  endif\n#endif\n\n/* The following definitions for FAR are needed only for MSDOS mixed\n * model programming (small or medium model with some far allocations).\n * This was tested only with MSC; for other MSDOS compilers you may have\n * to define NO_MEMCPY in zutil.h.  If you don't need the mixed model,\n * just define FAR to be empty.\n */\n#ifdef SYS16BIT\n#  if defined(M_I86SM) || defined(M_I86MM)\n     /* MSC small or medium model */\n#    define SMALL_MEDIUM\n#    ifdef _MSC_VER\n#      define FAR _far\n#    else\n#      define FAR far\n#    endif\n#  endif\n#  if (defined(__SMALL__) || defined(__MEDIUM__))\n     /* Turbo C small or medium model */\n#    define SMALL_MEDIUM\n#    ifdef __BORLANDC__\n#      define FAR _far\n#    else\n#      define FAR far\n#    endif\n#  endif\n#endif\n\n#if defined(WINDOWS) || defined(WIN32)\n   /* If building or using zlib as a DLL, define ZLIB_DLL.\n    * This is not mandatory, but it offers a little performance increase.\n    */\n#  ifdef ZLIB_DLL\n#    if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))\n#      ifdef ZLIB_INTERNAL\n#        define ZEXTERN extern __declspec(dllexport)\n#      else\n#        define ZEXTERN extern __declspec(dllimport)\n#      endif\n#    endif\n#  endif  /* ZLIB_DLL */\n   /* If building or using zlib with the WINAPI/WINAPIV calling convention,\n    * define ZLIB_WINAPI.\n    * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.\n    */\n#  ifdef ZLIB_WINAPI\n#    ifdef FAR\n#      undef FAR\n#    endif\n#    include <windows.h>\n     /* No need for _export, use ZLIB.DEF instead. */\n     /* For complete Windows compatibility, use WINAPI, not __stdcall. */\n#    define ZEXPORT WINAPI\n#    ifdef WIN32\n#      define ZEXPORTVA WINAPIV\n#    else\n#      define ZEXPORTVA FAR CDECL\n#    endif\n#  endif\n#endif\n\n#if defined (__BEOS__)\n#  ifdef ZLIB_DLL\n#    ifdef ZLIB_INTERNAL\n#      define ZEXPORT   __declspec(dllexport)\n#      define ZEXPORTVA __declspec(dllexport)\n#    else\n#      define ZEXPORT   __declspec(dllimport)\n#      define ZEXPORTVA __declspec(dllimport)\n#    endif\n#  endif\n#endif\n\n#ifndef ZEXTERN\n#  define ZEXTERN extern\n#endif\n#ifndef ZEXPORT\n#  define ZEXPORT\n#endif\n#ifndef ZEXPORTVA\n#  define ZEXPORTVA\n#endif\n\n#ifndef FAR\n#  define FAR\n#endif\n\n#if !defined(__MACTYPES__)\ntypedef unsigned char  Byte;  /* 8 bits */\n#endif\ntypedef unsigned int   uInt;  /* 16 bits or more */\ntypedef unsigned long  uLong; /* 32 bits or more */\n\n#ifdef SMALL_MEDIUM\n   /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */\n#  define Bytef Byte FAR\n#else\n   typedef Byte  FAR Bytef;\n#endif\ntypedef char  FAR charf;\ntypedef int   FAR intf;\ntypedef uInt  FAR uIntf;\ntypedef uLong FAR uLongf;\n\n#ifdef STDC\n   typedef void const *voidpc;\n   typedef void FAR   *voidpf;\n   typedef void       *voidp;\n#else\n   typedef Byte const *voidpc;\n   typedef Byte FAR   *voidpf;\n   typedef Byte       *voidp;\n#endif\n\n#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC)\n#  include <limits.h>\n#  if (UINT_MAX == 0xffffffffUL)\n#    define Z_U4 unsigned\n#  elif (ULONG_MAX == 0xffffffffUL)\n#    define Z_U4 unsigned long\n#  elif (USHRT_MAX == 0xffffffffUL)\n#    define Z_U4 unsigned short\n#  endif\n#endif\n\n#ifdef Z_U4\n   typedef Z_U4 z_crc_t;\n#else\n   typedef unsigned long z_crc_t;\n#endif\n\n#if 0\t\t\t\t/* Sunliang.Liu 20100908 sync the config to the old revision, otherwise, evc compile failed. */\n#ifdef HAVE_UNISTD_H    /* may be set to #if 1 by ./configure */\n#  define Z_HAVE_UNISTD_H\n#endif\n#endif /* 0 */\n\n#ifdef HAVE_STDARG_H    /* may be set to #if 1 by ./configure */\n#  define Z_HAVE_STDARG_H\n#endif\n\n#if 0\t\t\t\t/* Sunliang.Liu 20100908 sync the config to the old revision, otherwise, evc compile failed. */\n#ifdef STDC\n#  ifndef Z_SOLO\n#    include <sys/types.h>      /* for off_t */\n#  endif\n#endif\n#endif /* 0 */\n\n#if defined(STDC) || defined(Z_HAVE_STDARG_H)\n#  ifndef Z_SOLO\n#    include <stdarg.h>         /* for va_list */\n#  endif\n#endif\n\n#ifdef _WIN32\n#  ifndef Z_SOLO\n#    include <stddef.h>         /* for wchar_t */\n#  endif\n#endif\n\n#if 0\t\t\t\t/* Sunliang.Liu 20100908 sync the config to the old revision, otherwise, evc compile failed. */\n/* a little trick to accommodate both \"#define _LARGEFILE64_SOURCE\" and\n * \"#define _LARGEFILE64_SOURCE 1\" as requesting 64-bit operations, (even\n * though the former does not conform to the LFS document), but considering\n * both \"#undef _LARGEFILE64_SOURCE\" and \"#define _LARGEFILE64_SOURCE 0\" as\n * equivalently requesting no 64-bit operations\n */\n#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1\n#  undef _LARGEFILE64_SOURCE\n#endif\n#endif /* 0 */\n\n#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H)\n#  define Z_HAVE_UNISTD_H\n#endif\n#ifndef Z_SOLO\n#if 0\t\t\t\t/* Sunliang.Liu 20100908 sync the config to the old revision, otherwise, evc compile failed. */\n#  if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE)\n#    include <unistd.h>         /* for SEEK_*, off_t, and _LFS64_LARGEFILE */\n#    ifdef VMS\n#      include <unixio.h>       /* for off_t */\n#    endif\n#    ifndef z_off_t\n#      define z_off_t off_t\n#    endif\n#  endif\n#endif /* 0 */\n#endif\n\n#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0\n#  define Z_LFS64\n#endif\n\n#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64)\n#  define Z_LARGE64\n#endif\n\n#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64)\n#  define Z_WANT64\n#endif\n\n#if !defined(SEEK_SET) && !defined(Z_SOLO)\n#  define SEEK_SET        0       /* Seek from beginning of file.  */\n#  define SEEK_CUR        1       /* Seek from current position.  */\n#  define SEEK_END        2       /* Set file pointer to EOF plus \"offset\" */\n#endif\n\n#ifndef z_off_t\n#  define z_off_t long\n#endif\n\n#if !defined(_WIN32) && defined(Z_LARGE64)\n#  define z_off64_t off64_t\n#else\n#  if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO)\n#    define z_off64_t __int64\n#  else\n#    define z_off64_t z_off_t\n#  endif\n#endif\n\n/* MVS linker does not support external names larger than 8 bytes */\n#if defined(__MVS__)\n  #pragma map(deflateInit_,\"DEIN\")\n  #pragma map(deflateInit2_,\"DEIN2\")\n  #pragma map(deflateEnd,\"DEEND\")\n  #pragma map(deflateBound,\"DEBND\")\n  #pragma map(inflateInit_,\"ININ\")\n  #pragma map(inflateInit2_,\"ININ2\")\n  #pragma map(inflateEnd,\"INEND\")\n  #pragma map(inflateSync,\"INSY\")\n  #pragma map(inflateSetDictionary,\"INSEDI\")\n  #pragma map(compressBound,\"CMBND\")\n  #pragma map(inflate_table,\"INTABL\")\n  #pragma map(inflate_fast,\"INFA\")\n  #pragma map(inflate_copyright,\"INCOPY\")\n#endif\n\n#endif /* ZCONF_H */\n"
  },
  {
    "path": "core/include/thirdparties/zlib/zlib.h",
    "content": "/* zlib.h -- interface of the 'zlib' general purpose compression library\n  version 1.2.8, April 28th, 2013\n\n  Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n\n  Jean-loup Gailly        Mark Adler\n  jloup@gzip.org          madler@alumni.caltech.edu\n\n\n  The data format used by the zlib library is described by RFCs (Request for\n  Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950\n  (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format).\n*/\n\n#ifndef ZLIB_H\n#define ZLIB_H\n\n#define deflate_copyright FPDFAPI_deflate_copyright\n#define adler32 FPDFAPI_adler32\n#define compress2 FPDFAPI_compress2\n#define compress FPDFAPI_compress\n#define compressBound FPDFAPI_compressBound\n#define get_crc_table FPDFAPI_get_crc_table\n#define crc32 FPDFAPI_crc32\n#define deflateInit_ FPDFAPI_deflateInit_\n#define deflateInit2_ FPDFAPI_deflateInit2_\n#define deflateSetDictionary FPDFAPI_deflateSetDictionary\n#define deflateReset FPDFAPI_deflateReset\n#define deflatePending FPDFAPI_deflatePending\n#define deflatePrime FPDFAPI_deflatePrime\n#define deflateParams FPDFAPI_deflateParams\n#define deflateBound FPDFAPI_deflateBound\n#define deflateSetHeader FPDFAPI_deflateSetHeader\n#define deflateTune FPDFAPI_deflateTune\n#define deflate FPDFAPI_deflate\n#define deflateEnd FPDFAPI_deflateEnd\n#define deflateCopy FPDFAPI_deflateCopy\n#define inflateBackInit_ FPDFAPI_inflateBackInit_\n#define inflateBack FPDFAPI_inflateBack\n#define inflateBackEnd FPDFAPI_inflateBackEnd\n#define inflateReset FPDFAPI_inflateReset\n#define inflateInit2_ FPDFAPI_inflateInit2_\n#define inflateInit_ FPDFAPI_inflateInit_\n#define inflate FPDFAPI_inflate\n#define inflateEnd FPDFAPI_inflateEnd\n#define inflateSetDictionary FPDFAPI_inflateSetDictionary\n#define inflateSync FPDFAPI_inflateSync\n#define inflateSyncPoint FPDFAPI_inflateSyncPoint\n#define inflateCopy FPDFAPI_inflateCopy\n#define uncompress FPDFAPI_uncompress\n#define zlibVersion FPDFAPI_zlibVersion\n#define zlibCompileFlags FPDFAPI_zlibCompileFlags\n#define zError FPDFAPI_zError\n#define z_errmsg FPDFAPI_z_errmsg\n#define zcfree FPDFAPI_zcfree\n#define zcalloc FPDFAPI_zcalloc\n#define inflate_fast FPDFAPI_inflate_fast\n#define inflate_table FPDFAPI_inflate_table\n#define inflate_copyright FPDFAPI_inflate_copyright\n#define _length_code FPDFAPI_length_code\n#define _tr_flush_block FPDFAPI_tr_flush_block\n#define _dist_code FPDFAPI_dist_code\n#define _tr_stored_block FPDFAPI_tr_stored_block\n#define _tr_init FPDFAPI_tr_init\n#define _tr_align FPDFAPI_tr_align\n#define _tr_tally FPDFAPI_tr_tally\n#define _tr_flush_bits FPDFAPI_tr_flush_bits\n#define adler32_combine FPDFAPI_adler32_combine\n#define inflatePrime FPDFAPI_inflatePrime\n#define inflateGetDictionary FPDFAPI_inflateGetDictionary\n#define inflateGetHeader FPDFAPI_inflateGetHeader\n#define crc32_combine FPDFAPI_crc32_combine\n#define inflateReset2 FPDFAPI_inflateReset2\n#define inflateUndermine FPDFAPI_inflateUndermine\n#define inflateMark FPDFAPI_inflateMark\n#define adler32_combine64 FPDFAPI_adler32_combine64\n#define inflateResetKeep FPDFAPI_inflateResetKeep\n#define deflateResetKeep FPDFAPI_deflateResetKeep\n\n#include \"zconf.h\"\n\n/* Sunliang.Liu 20100908 sync the config to the old revision. NO_GZIP */\n#define NO_GZIP\t\t/* XYQ */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define ZLIB_VERSION \"1.2.8\"\n#define ZLIB_VERNUM 0x1280\n#define ZLIB_VER_MAJOR 1\n#define ZLIB_VER_MINOR 2\n#define ZLIB_VER_REVISION 8\n#define ZLIB_VER_SUBREVISION 0\n\n/*\n    The 'zlib' compression library provides in-memory compression and\n  decompression functions, including integrity checks of the uncompressed data.\n  This version of the library supports only one compression method (deflation)\n  but other algorithms will be added later and will have the same stream\n  interface.\n\n    Compression can be done in a single step if the buffers are large enough,\n  or can be done by repeated calls of the compression function.  In the latter\n  case, the application must provide more input and/or consume the output\n  (providing more output space) before each call.\n\n    The compressed data format used by default by the in-memory functions is\n  the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped\n  around a deflate stream, which is itself documented in RFC 1951.\n\n    The library also supports reading and writing files in gzip (.gz) format\n  with an interface similar to that of stdio using the functions that start\n  with \"gz\".  The gzip format is different from the zlib format.  gzip is a\n  gzip wrapper, documented in RFC 1952, wrapped around a deflate stream.\n\n    This library can optionally read and write gzip streams in memory as well.\n\n    The zlib format was designed to be compact and fast for use in memory\n  and on communications channels.  The gzip format was designed for single-\n  file compression on file systems, has a larger header than zlib to maintain\n  directory information, and uses a different, slower check method than zlib.\n\n    The library does not install any signal handler.  The decoder checks\n  the consistency of the compressed data, so the library should never crash\n  even in case of corrupted input.\n*/\n\ntypedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));\ntypedef void   (*free_func)  OF((voidpf opaque, voidpf address));\n\nstruct internal_state;\n\ntypedef struct z_stream_s {\n    z_const Bytef *next_in;     /* next input byte */\n    uInt     avail_in;  /* number of bytes available at next_in */\n    uLong    total_in;  /* total number of input bytes read so far */\n\n    Bytef    *next_out; /* next output byte should be put there */\n    uInt     avail_out; /* remaining free space at next_out */\n    uLong    total_out; /* total number of bytes output so far */\n\n    z_const char *msg;  /* last error message, NULL if no error */\n    struct internal_state FAR *state; /* not visible by applications */\n\n    alloc_func zalloc;  /* used to allocate the internal state */\n    free_func  zfree;   /* used to free the internal state */\n    voidpf     opaque;  /* private data object passed to zalloc and zfree */\n\n    int     data_type;  /* best guess about the data type: binary or text */\n    uLong   adler;      /* adler32 value of the uncompressed data */\n    uLong   reserved;   /* reserved for future use */\n} z_stream;\n\ntypedef z_stream FAR *z_streamp;\n\n/*\n     gzip header information passed to and from zlib routines.  See RFC 1952\n  for more details on the meanings of these fields.\n*/\ntypedef struct gz_header_s {\n    int     text;       /* true if compressed data believed to be text */\n    uLong   time;       /* modification time */\n    int     xflags;     /* extra flags (not used when writing a gzip file) */\n    int     os;         /* operating system */\n    Bytef   *extra;     /* pointer to extra field or Z_NULL if none */\n    uInt    extra_len;  /* extra field length (valid if extra != Z_NULL) */\n    uInt    extra_max;  /* space at extra (only when reading header) */\n    Bytef   *name;      /* pointer to zero-terminated file name or Z_NULL */\n    uInt    name_max;   /* space at name (only when reading header) */\n    Bytef   *comment;   /* pointer to zero-terminated comment or Z_NULL */\n    uInt    comm_max;   /* space at comment (only when reading header) */\n    int     hcrc;       /* true if there was or will be a header crc */\n    int     done;       /* true when done reading gzip header (not used\n                           when writing a gzip file) */\n} gz_header;\n\ntypedef gz_header FAR *gz_headerp;\n\n/*\n     The application must update next_in and avail_in when avail_in has dropped\n   to zero.  It must update next_out and avail_out when avail_out has dropped\n   to zero.  The application must initialize zalloc, zfree and opaque before\n   calling the init function.  All other fields are set by the compression\n   library and must not be updated by the application.\n\n     The opaque value provided by the application will be passed as the first\n   parameter for calls of zalloc and zfree.  This can be useful for custom\n   memory management.  The compression library attaches no meaning to the\n   opaque value.\n\n     zalloc must return Z_NULL if there is not enough memory for the object.\n   If zlib is used in a multi-threaded application, zalloc and zfree must be\n   thread safe.\n\n     On 16-bit systems, the functions zalloc and zfree must be able to allocate\n   exactly 65536 bytes, but will not be required to allocate more than this if\n   the symbol MAXSEG_64K is defined (see zconf.h).  WARNING: On MSDOS, pointers\n   returned by zalloc for objects of exactly 65536 bytes *must* have their\n   offset normalized to zero.  The default allocation function provided by this\n   library ensures this (see zutil.c).  To reduce memory requirements and avoid\n   any allocation of 64K objects, at the expense of compression ratio, compile\n   the library with -DMAX_WBITS=14 (see zconf.h).\n\n     The fields total_in and total_out can be used for statistics or progress\n   reports.  After compression, total_in holds the total size of the\n   uncompressed data and may be saved for use in the decompressor (particularly\n   if the decompressor wants to decompress everything in a single step).\n*/\n\n                        /* constants */\n\n#define Z_NO_FLUSH      0\n#define Z_PARTIAL_FLUSH 1\n#define Z_SYNC_FLUSH    2\n#define Z_FULL_FLUSH    3\n#define Z_FINISH        4\n#define Z_BLOCK         5\n#define Z_TREES         6\n/* Allowed flush values; see deflate() and inflate() below for details */\n\n#define Z_OK            0\n#define Z_STREAM_END    1\n#define Z_NEED_DICT     2\n#define Z_ERRNO        (-1)\n#define Z_STREAM_ERROR (-2)\n#define Z_DATA_ERROR   (-3)\n#define Z_MEM_ERROR    (-4)\n#define Z_BUF_ERROR    (-5)\n#define Z_VERSION_ERROR (-6)\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\n\n#define Z_NO_COMPRESSION         0\n#define Z_BEST_SPEED             1\n#define Z_BEST_COMPRESSION       9\n#define Z_DEFAULT_COMPRESSION  (-1)\n/* compression levels */\n\n#define Z_FILTERED            1\n#define Z_HUFFMAN_ONLY        2\n#define Z_RLE                 3\n#define Z_FIXED               4\n#define Z_DEFAULT_STRATEGY    0\n/* compression strategy; see deflateInit2() below for details */\n\n#define Z_BINARY   0\n#define Z_TEXT     1\n#define Z_ASCII    Z_TEXT   /* for compatibility with 1.2.2 and earlier */\n#define Z_UNKNOWN  2\n/* Possible values of the data_type field (though see inflate()) */\n\n#define Z_DEFLATED   8\n/* The deflate compression method (the only one supported in this version) */\n\n#define Z_NULL  0  /* for initializing zalloc, zfree, opaque */\n\n#define zlib_version zlibVersion()\n/* for compatibility with versions < 1.0.2 */\n\n\n                        /* basic functions */\n\nZEXTERN const char * ZEXPORT zlibVersion OF((void));\n/* The application can compare zlibVersion and ZLIB_VERSION for consistency.\n   If the first character differs, the library code actually used is not\n   compatible with the zlib.h header file used by the application.  This check\n   is automatically made by deflateInit and inflateInit.\n */\n\n/*\nZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));\n\n     Initializes the internal stream state for compression.  The fields\n   zalloc, zfree and opaque must be initialized before by the caller.  If\n   zalloc and zfree are set to Z_NULL, deflateInit updates them to use default\n   allocation functions.\n\n     The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:\n   1 gives best speed, 9 gives best compression, 0 gives no compression at all\n   (the input data is simply copied a block at a time).  Z_DEFAULT_COMPRESSION\n   requests a default compromise between speed and compression (currently\n   equivalent to level 6).\n\n     deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough\n   memory, Z_STREAM_ERROR if level is not a valid compression level, or\n   Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible\n   with the version assumed by the caller (ZLIB_VERSION).  msg is set to null\n   if there is no error message.  deflateInit does not perform any compression:\n   this will be done by deflate().\n*/\n\n\nZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));\n/*\n    deflate compresses as much data as possible, and stops when the input\n  buffer becomes empty or the output buffer becomes full.  It may introduce\n  some output latency (reading input without producing any output) except when\n  forced to flush.\n\n    The detailed semantics are as follows.  deflate performs one or both of the\n  following actions:\n\n  - Compress more input starting at next_in and update next_in and avail_in\n    accordingly.  If not all input can be processed (because there is not\n    enough room in the output buffer), next_in and avail_in are updated and\n    processing will resume at this point for the next call of deflate().\n\n  - Provide more output starting at next_out and update next_out and avail_out\n    accordingly.  This action is forced if the parameter flush is non zero.\n    Forcing flush frequently degrades the compression ratio, so this parameter\n    should be set only when necessary (in interactive applications).  Some\n    output may be provided even if flush is not set.\n\n    Before the call of deflate(), the application should ensure that at least\n  one of the actions is possible, by providing more input and/or consuming more\n  output, and updating avail_in or avail_out accordingly; avail_out should\n  never be zero before the call.  The application can consume the compressed\n  output when it wants, for example when the output buffer is full (avail_out\n  == 0), or after each call of deflate().  If deflate returns Z_OK and with\n  zero avail_out, it must be called again after making room in the output\n  buffer because there might be more output pending.\n\n    Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to\n  decide how much data to accumulate before producing output, in order to\n  maximize compression.\n\n    If the parameter flush is set to Z_SYNC_FLUSH, all pending output is\n  flushed to the output buffer and the output is aligned on a byte boundary, so\n  that the decompressor can get all input data available so far.  (In\n  particular avail_in is zero after the call if enough output space has been\n  provided before the call.) Flushing may degrade compression for some\n  compression algorithms and so it should be used only when necessary.  This\n  completes the current deflate block and follows it with an empty stored block\n  that is three bits plus filler bits to the next byte, followed by four bytes\n  (00 00 ff ff).\n\n    If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the\n  output buffer, but the output is not aligned to a byte boundary.  All of the\n  input data so far will be available to the decompressor, as for Z_SYNC_FLUSH.\n  This completes the current deflate block and follows it with an empty fixed\n  codes block that is 10 bits long.  This assures that enough bytes are output\n  in order for the decompressor to finish the block before the empty fixed code\n  block.\n\n    If flush is set to Z_BLOCK, a deflate block is completed and emitted, as\n  for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to\n  seven bits of the current block are held to be written as the next byte after\n  the next deflate block is completed.  In this case, the decompressor may not\n  be provided enough bits at this point in order to complete decompression of\n  the data provided so far to the compressor.  It may need to wait for the next\n  block to be emitted.  This is for advanced applications that need to control\n  the emission of deflate blocks.\n\n    If flush is set to Z_FULL_FLUSH, all output is flushed as with\n  Z_SYNC_FLUSH, and the compression state is reset so that decompression can\n  restart from this point if previous compressed data has been damaged or if\n  random access is desired.  Using Z_FULL_FLUSH too often can seriously degrade\n  compression.\n\n    If deflate returns with avail_out == 0, this function must be called again\n  with the same value of the flush parameter and more output space (updated\n  avail_out), until the flush is complete (deflate returns with non-zero\n  avail_out).  In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that\n  avail_out is greater than six to avoid repeated flush markers due to\n  avail_out == 0 on return.\n\n    If the parameter flush is set to Z_FINISH, pending input is processed,\n  pending output is flushed and deflate returns with Z_STREAM_END if there was\n  enough output space; if deflate returns with Z_OK, this function must be\n  called again with Z_FINISH and more output space (updated avail_out) but no\n  more input data, until it returns with Z_STREAM_END or an error.  After\n  deflate has returned Z_STREAM_END, the only possible operations on the stream\n  are deflateReset or deflateEnd.\n\n    Z_FINISH can be used immediately after deflateInit if all the compression\n  is to be done in a single step.  In this case, avail_out must be at least the\n  value returned by deflateBound (see below).  Then deflate is guaranteed to\n  return Z_STREAM_END.  If not enough output space is provided, deflate will\n  not return Z_STREAM_END, and it must be called again as described above.\n\n    deflate() sets strm->adler to the adler32 checksum of all input read\n  so far (that is, total_in bytes).\n\n    deflate() may update strm->data_type if it can make a good guess about\n  the input data type (Z_BINARY or Z_TEXT).  In doubt, the data is considered\n  binary.  This field is only for information purposes and does not affect the\n  compression algorithm in any manner.\n\n    deflate() returns Z_OK if some progress has been made (more input\n  processed or more output produced), Z_STREAM_END if all input has been\n  consumed and all output has been produced (only when flush is set to\n  Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example\n  if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible\n  (for example avail_in or avail_out was zero).  Note that Z_BUF_ERROR is not\n  fatal, and deflate() can be called again with more input and more output\n  space to continue compressing.\n*/\n\n\nZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));\n/*\n     All dynamically allocated data structures for this stream are freed.\n   This function discards any unprocessed input and does not flush any pending\n   output.\n\n     deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the\n   stream state was inconsistent, Z_DATA_ERROR if the stream was freed\n   prematurely (some input or output was discarded).  In the error case, msg\n   may be set but then points to a static string (which must not be\n   deallocated).\n*/\n\n\n/*\nZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));\n\n     Initializes the internal stream state for decompression.  The fields\n   next_in, avail_in, zalloc, zfree and opaque must be initialized before by\n   the caller.  If next_in is not Z_NULL and avail_in is large enough (the\n   exact value depends on the compression method), inflateInit determines the\n   compression method from the zlib header and allocates all data structures\n   accordingly; otherwise the allocation will be deferred to the first call of\n   inflate.  If zalloc and zfree are set to Z_NULL, inflateInit updates them to\n   use default allocation functions.\n\n     inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough\n   memory, Z_VERSION_ERROR if the zlib library version is incompatible with the\n   version assumed by the caller, or Z_STREAM_ERROR if the parameters are\n   invalid, such as a null pointer to the structure.  msg is set to null if\n   there is no error message.  inflateInit does not perform any decompression\n   apart from possibly reading the zlib header if present: actual decompression\n   will be done by inflate().  (So next_in and avail_in may be modified, but\n   next_out and avail_out are unused and unchanged.) The current implementation\n   of inflateInit() does not process any header information -- that is deferred\n   until inflate() is called.\n*/\n\n\nZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));\n/*\n    inflate decompresses as much data as possible, and stops when the input\n  buffer becomes empty or the output buffer becomes full.  It may introduce\n  some output latency (reading input without producing any output) except when\n  forced to flush.\n\n  The detailed semantics are as follows.  inflate performs one or both of the\n  following actions:\n\n  - Decompress more input starting at next_in and update next_in and avail_in\n    accordingly.  If not all input can be processed (because there is not\n    enough room in the output buffer), next_in is updated and processing will\n    resume at this point for the next call of inflate().\n\n  - Provide more output starting at next_out and update next_out and avail_out\n    accordingly.  inflate() provides as much output as possible, until there is\n    no more input data or no more space in the output buffer (see below about\n    the flush parameter).\n\n    Before the call of inflate(), the application should ensure that at least\n  one of the actions is possible, by providing more input and/or consuming more\n  output, and updating the next_* and avail_* values accordingly.  The\n  application can consume the uncompressed output when it wants, for example\n  when the output buffer is full (avail_out == 0), or after each call of\n  inflate().  If inflate returns Z_OK and with zero avail_out, it must be\n  called again after making room in the output buffer because there might be\n  more output pending.\n\n    The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH,\n  Z_BLOCK, or Z_TREES.  Z_SYNC_FLUSH requests that inflate() flush as much\n  output as possible to the output buffer.  Z_BLOCK requests that inflate()\n  stop if and when it gets to the next deflate block boundary.  When decoding\n  the zlib or gzip format, this will cause inflate() to return immediately\n  after the header and before the first block.  When doing a raw inflate,\n  inflate() will go ahead and process the first block, and will return when it\n  gets to the end of that block, or when it runs out of data.\n\n    The Z_BLOCK option assists in appending to or combining deflate streams.\n  Also to assist in this, on return inflate() will set strm->data_type to the\n  number of unused bits in the last byte taken from strm->next_in, plus 64 if\n  inflate() is currently decoding the last block in the deflate stream, plus\n  128 if inflate() returned immediately after decoding an end-of-block code or\n  decoding the complete header up to just before the first byte of the deflate\n  stream.  The end-of-block will not be indicated until all of the uncompressed\n  data from that block has been written to strm->next_out.  The number of\n  unused bits may in general be greater than seven, except when bit 7 of\n  data_type is set, in which case the number of unused bits will be less than\n  eight.  data_type is set as noted here every time inflate() returns for all\n  flush options, and so can be used to determine the amount of currently\n  consumed input in bits.\n\n    The Z_TREES option behaves as Z_BLOCK does, but it also returns when the\n  end of each deflate block header is reached, before any actual data in that\n  block is decoded.  This allows the caller to determine the length of the\n  deflate block header for later use in random access within a deflate block.\n  256 is added to the value of strm->data_type when inflate() returns\n  immediately after reaching the end of the deflate block header.\n\n    inflate() should normally be called until it returns Z_STREAM_END or an\n  error.  However if all decompression is to be performed in a single step (a\n  single call of inflate), the parameter flush should be set to Z_FINISH.  In\n  this case all pending input is processed and all pending output is flushed;\n  avail_out must be large enough to hold all of the uncompressed data for the\n  operation to complete.  (The size of the uncompressed data may have been\n  saved by the compressor for this purpose.) The use of Z_FINISH is not\n  required to perform an inflation in one step.  However it may be used to\n  inform inflate that a faster approach can be used for the single inflate()\n  call.  Z_FINISH also informs inflate to not maintain a sliding window if the\n  stream completes, which reduces inflate's memory footprint.  If the stream\n  does not complete, either because not all of the stream is provided or not\n  enough output space is provided, then a sliding window will be allocated and\n  inflate() can be called again to continue the operation as if Z_NO_FLUSH had\n  been used.\n\n     In this implementation, inflate() always flushes as much output as\n  possible to the output buffer, and always uses the faster approach on the\n  first call.  So the effects of the flush parameter in this implementation are\n  on the return value of inflate() as noted below, when inflate() returns early\n  when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of\n  memory for a sliding window when Z_FINISH is used.\n\n     If a preset dictionary is needed after this call (see inflateSetDictionary\n  below), inflate sets strm->adler to the Adler-32 checksum of the dictionary\n  chosen by the compressor and returns Z_NEED_DICT; otherwise it sets\n  strm->adler to the Adler-32 checksum of all output produced so far (that is,\n  total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described\n  below.  At the end of the stream, inflate() checks that its computed adler32\n  checksum is equal to that saved by the compressor and returns Z_STREAM_END\n  only if the checksum is correct.\n\n    inflate() can decompress and check either zlib-wrapped or gzip-wrapped\n  deflate data.  The header type is detected automatically, if requested when\n  initializing with inflateInit2().  Any information contained in the gzip\n  header is not retained, so applications that need that information should\n  instead use raw inflate, see inflateInit2() below, or inflateBack() and\n  perform their own processing of the gzip header and trailer.  When processing\n  gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output\n  producted so far.  The CRC-32 is checked against the gzip trailer.\n\n    inflate() returns Z_OK if some progress has been made (more input processed\n  or more output produced), Z_STREAM_END if the end of the compressed data has\n  been reached and all uncompressed output has been produced, Z_NEED_DICT if a\n  preset dictionary is needed at this point, Z_DATA_ERROR if the input data was\n  corrupted (input stream not conforming to the zlib format or incorrect check\n  value), Z_STREAM_ERROR if the stream structure was inconsistent (for example\n  next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory,\n  Z_BUF_ERROR if no progress is possible or if there was not enough room in the\n  output buffer when Z_FINISH is used.  Note that Z_BUF_ERROR is not fatal, and\n  inflate() can be called again with more input and more output space to\n  continue decompressing.  If Z_DATA_ERROR is returned, the application may\n  then call inflateSync() to look for a good compression block if a partial\n  recovery of the data is desired.\n*/\n\n\nZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));\n/*\n     All dynamically allocated data structures for this stream are freed.\n   This function discards any unprocessed input and does not flush any pending\n   output.\n\n     inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state\n   was inconsistent.  In the error case, msg may be set but then points to a\n   static string (which must not be deallocated).\n*/\n\n\n                        /* Advanced functions */\n\n/*\n    The following functions are needed only in some special applications.\n*/\n\n/*\nZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,\n                                     int  level,\n                                     int  method,\n                                     int  windowBits,\n                                     int  memLevel,\n                                     int  strategy));\n\n     This is another version of deflateInit with more compression options.  The\n   fields next_in, zalloc, zfree and opaque must be initialized before by the\n   caller.\n\n     The method parameter is the compression method.  It must be Z_DEFLATED in\n   this version of the library.\n\n     The windowBits parameter is the base two logarithm of the window size\n   (the size of the history buffer).  It should be in the range 8..15 for this\n   version of the library.  Larger values of this parameter result in better\n   compression at the expense of memory usage.  The default value is 15 if\n   deflateInit is used instead.\n\n     windowBits can also be -8..-15 for raw deflate.  In this case, -windowBits\n   determines the window size.  deflate() will then generate raw deflate data\n   with no zlib header or trailer, and will not compute an adler32 check value.\n\n     windowBits can also be greater than 15 for optional gzip encoding.  Add\n   16 to windowBits to write a simple gzip header and trailer around the\n   compressed data instead of a zlib wrapper.  The gzip header will have no\n   file name, no extra data, no comment, no modification time (set to zero), no\n   header crc, and the operating system will be set to 255 (unknown).  If a\n   gzip stream is being written, strm->adler is a crc32 instead of an adler32.\n\n     The memLevel parameter specifies how much memory should be allocated\n   for the internal compression state.  memLevel=1 uses minimum memory but is\n   slow and reduces compression ratio; memLevel=9 uses maximum memory for\n   optimal speed.  The default value is 8.  See zconf.h for total memory usage\n   as a function of windowBits and memLevel.\n\n     The strategy parameter is used to tune the compression algorithm.  Use the\n   value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a\n   filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no\n   string match), or Z_RLE to limit match distances to one (run-length\n   encoding).  Filtered data consists mostly of small values with a somewhat\n   random distribution.  In this case, the compression algorithm is tuned to\n   compress them better.  The effect of Z_FILTERED is to force more Huffman\n   coding and less string matching; it is somewhat intermediate between\n   Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY.  Z_RLE is designed to be almost as\n   fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data.  The\n   strategy parameter only affects the compression ratio but not the\n   correctness of the compressed output even if it is not set appropriately.\n   Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler\n   decoder for special applications.\n\n     deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough\n   memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid\n   method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is\n   incompatible with the version assumed by the caller (ZLIB_VERSION).  msg is\n   set to null if there is no error message.  deflateInit2 does not perform any\n   compression: this will be done by deflate().\n*/\n\nZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,\n                                             const Bytef *dictionary,\n                                             uInt  dictLength));\n/*\n     Initializes the compression dictionary from the given byte sequence\n   without producing any compressed output.  When using the zlib format, this\n   function must be called immediately after deflateInit, deflateInit2 or\n   deflateReset, and before any call of deflate.  When doing raw deflate, this\n   function must be called either before any call of deflate, or immediately\n   after the completion of a deflate block, i.e. after all input has been\n   consumed and all output has been delivered when using any of the flush\n   options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH.  The\n   compressor and decompressor must use exactly the same dictionary (see\n   inflateSetDictionary).\n\n     The dictionary should consist of strings (byte sequences) that are likely\n   to be encountered later in the data to be compressed, with the most commonly\n   used strings preferably put towards the end of the dictionary.  Using a\n   dictionary is most useful when the data to be compressed is short and can be\n   predicted with good accuracy; the data can then be compressed better than\n   with the default empty dictionary.\n\n     Depending on the size of the compression data structures selected by\n   deflateInit or deflateInit2, a part of the dictionary may in effect be\n   discarded, for example if the dictionary is larger than the window size\n   provided in deflateInit or deflateInit2.  Thus the strings most likely to be\n   useful should be put at the end of the dictionary, not at the front.  In\n   addition, the current implementation of deflate will use at most the window\n   size minus 262 bytes of the provided dictionary.\n\n     Upon return of this function, strm->adler is set to the adler32 value\n   of the dictionary; the decompressor may later use this value to determine\n   which dictionary has been used by the compressor.  (The adler32 value\n   applies to the whole dictionary even if only a subset of the dictionary is\n   actually used by the compressor.) If a raw deflate was requested, then the\n   adler32 value is not computed and strm->adler is not set.\n\n     deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a\n   parameter is invalid (e.g.  dictionary being Z_NULL) or the stream state is\n   inconsistent (for example if deflate has already been called for this stream\n   or if not at a block boundary for raw deflate).  deflateSetDictionary does\n   not perform any compression: this will be done by deflate().\n*/\n\nZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,\n                                    z_streamp source));\n/*\n     Sets the destination stream as a complete copy of the source stream.\n\n     This function can be useful when several compression strategies will be\n   tried, for example when there are several ways of pre-processing the input\n   data with a filter.  The streams that will be discarded should then be freed\n   by calling deflateEnd.  Note that deflateCopy duplicates the internal\n   compression state which can be quite large, so this strategy is slow and can\n   consume lots of memory.\n\n     deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not\n   enough memory, Z_STREAM_ERROR if the source stream state was inconsistent\n   (such as zalloc being Z_NULL).  msg is left unchanged in both source and\n   destination.\n*/\n\nZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));\n/*\n     This function is equivalent to deflateEnd followed by deflateInit,\n   but does not free and reallocate all the internal compression state.  The\n   stream will keep the same compression level and any other attributes that\n   may have been set by deflateInit2.\n\n     deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source\n   stream state was inconsistent (such as zalloc or state being Z_NULL).\n*/\n\nZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,\n                                      int level,\n                                      int strategy));\n/*\n     Dynamically update the compression level and compression strategy.  The\n   interpretation of level and strategy is as in deflateInit2.  This can be\n   used to switch between compression and straight copy of the input data, or\n   to switch to a different kind of input data requiring a different strategy.\n   If the compression level is changed, the input available so far is\n   compressed with the old level (and may be flushed); the new level will take\n   effect only at the next call of deflate().\n\n     Before the call of deflateParams, the stream state must be set as for\n   a call of deflate(), since the currently available input may have to be\n   compressed and flushed.  In particular, strm->avail_out must be non-zero.\n\n     deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source\n   stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if\n   strm->avail_out was zero.\n*/\n\nZEXTERN int ZEXPORT deflateTune OF((z_streamp strm,\n                                    int good_length,\n                                    int max_lazy,\n                                    int nice_length,\n                                    int max_chain));\n/*\n     Fine tune deflate's internal compression parameters.  This should only be\n   used by someone who understands the algorithm used by zlib's deflate for\n   searching for the best matching string, and even then only by the most\n   fanatic optimizer trying to squeeze out the last compressed bit for their\n   specific input data.  Read the deflate.c source code for the meaning of the\n   max_lazy, good_length, nice_length, and max_chain parameters.\n\n     deflateTune() can be called after deflateInit() or deflateInit2(), and\n   returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream.\n */\n\nZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm,\n                                       uLong sourceLen));\n/*\n     deflateBound() returns an upper bound on the compressed size after\n   deflation of sourceLen bytes.  It must be called after deflateInit() or\n   deflateInit2(), and after deflateSetHeader(), if used.  This would be used\n   to allocate an output buffer for deflation in a single pass, and so would be\n   called before deflate().  If that first deflate() call is provided the\n   sourceLen input bytes, an output buffer allocated to the size returned by\n   deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed\n   to return Z_STREAM_END.  Note that it is possible for the compressed size to\n   be larger than the value returned by deflateBound() if flush options other\n   than Z_FINISH or Z_NO_FLUSH are used.\n*/\n\nZEXTERN int ZEXPORT deflatePending OF((z_streamp strm,\n                                       unsigned *pending,\n                                       int *bits));\n/*\n     deflatePending() returns the number of bytes and bits of output that have\n   been generated, but not yet provided in the available output.  The bytes not\n   provided would be due to the available output space having being consumed.\n   The number of bits of output not provided are between 0 and 7, where they\n   await more bits to join them in order to fill out a full byte.  If pending\n   or bits are Z_NULL, then those values are not set.\n\n     deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source\n   stream state was inconsistent.\n */\n\nZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm,\n                                     int bits,\n                                     int value));\n/*\n     deflatePrime() inserts bits in the deflate output stream.  The intent\n   is that this function is used to start off the deflate output with the bits\n   leftover from a previous deflate stream when appending to it.  As such, this\n   function can only be used for raw deflate, and must be used before the first\n   deflate() call after a deflateInit2() or deflateReset().  bits must be less\n   than or equal to 16, and that many of the least significant bits of value\n   will be inserted in the output.\n\n     deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough\n   room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the\n   source stream state was inconsistent.\n*/\n\nZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm,\n                                         gz_headerp head));\n/*\n     deflateSetHeader() provides gzip header information for when a gzip\n   stream is requested by deflateInit2().  deflateSetHeader() may be called\n   after deflateInit2() or deflateReset() and before the first call of\n   deflate().  The text, time, os, extra field, name, and comment information\n   in the provided gz_header structure are written to the gzip header (xflag is\n   ignored -- the extra flags are set according to the compression level).  The\n   caller must assure that, if not Z_NULL, name and comment are terminated with\n   a zero byte, and that if extra is not Z_NULL, that extra_len bytes are\n   available there.  If hcrc is true, a gzip header crc is included.  Note that\n   the current versions of the command-line version of gzip (up through version\n   1.3.x) do not support header crc's, and will report that it is a \"multi-part\n   gzip file\" and give up.\n\n     If deflateSetHeader is not used, the default gzip header has text false,\n   the time set to zero, and os set to 255, with no extra, name, or comment\n   fields.  The gzip header is returned to the default state by deflateReset().\n\n     deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source\n   stream state was inconsistent.\n*/\n\n/*\nZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,\n                                     int  windowBits));\n\n     This is another version of inflateInit with an extra parameter.  The\n   fields next_in, avail_in, zalloc, zfree and opaque must be initialized\n   before by the caller.\n\n     The windowBits parameter is the base two logarithm of the maximum window\n   size (the size of the history buffer).  It should be in the range 8..15 for\n   this version of the library.  The default value is 15 if inflateInit is used\n   instead.  windowBits must be greater than or equal to the windowBits value\n   provided to deflateInit2() while compressing, or it must be equal to 15 if\n   deflateInit2() was not used.  If a compressed stream with a larger window\n   size is given as input, inflate() will return with the error code\n   Z_DATA_ERROR instead of trying to allocate a larger window.\n\n     windowBits can also be zero to request that inflate use the window size in\n   the zlib header of the compressed stream.\n\n     windowBits can also be -8..-15 for raw inflate.  In this case, -windowBits\n   determines the window size.  inflate() will then process raw deflate data,\n   not looking for a zlib or gzip header, not generating a check value, and not\n   looking for any check values for comparison at the end of the stream.  This\n   is for use with other formats that use the deflate compressed data format\n   such as zip.  Those formats provide their own check values.  If a custom\n   format is developed using the raw deflate format for compressed data, it is\n   recommended that a check value such as an adler32 or a crc32 be applied to\n   the uncompressed data as is done in the zlib, gzip, and zip formats.  For\n   most applications, the zlib format should be used as is.  Note that comments\n   above on the use in deflateInit2() applies to the magnitude of windowBits.\n\n     windowBits can also be greater than 15 for optional gzip decoding.  Add\n   32 to windowBits to enable zlib and gzip decoding with automatic header\n   detection, or add 16 to decode only the gzip format (the zlib format will\n   return a Z_DATA_ERROR).  If a gzip stream is being decoded, strm->adler is a\n   crc32 instead of an adler32.\n\n     inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough\n   memory, Z_VERSION_ERROR if the zlib library version is incompatible with the\n   version assumed by the caller, or Z_STREAM_ERROR if the parameters are\n   invalid, such as a null pointer to the structure.  msg is set to null if\n   there is no error message.  inflateInit2 does not perform any decompression\n   apart from possibly reading the zlib header if present: actual decompression\n   will be done by inflate().  (So next_in and avail_in may be modified, but\n   next_out and avail_out are unused and unchanged.) The current implementation\n   of inflateInit2() does not process any header information -- that is\n   deferred until inflate() is called.\n*/\n\nZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,\n                                             const Bytef *dictionary,\n                                             uInt  dictLength));\n/*\n     Initializes the decompression dictionary from the given uncompressed byte\n   sequence.  This function must be called immediately after a call of inflate,\n   if that call returned Z_NEED_DICT.  The dictionary chosen by the compressor\n   can be determined from the adler32 value returned by that call of inflate.\n   The compressor and decompressor must use exactly the same dictionary (see\n   deflateSetDictionary).  For raw inflate, this function can be called at any\n   time to set the dictionary.  If the provided dictionary is smaller than the\n   window and there is already data in the window, then the provided dictionary\n   will amend what's there.  The application must insure that the dictionary\n   that was used for compression is provided.\n\n     inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a\n   parameter is invalid (e.g.  dictionary being Z_NULL) or the stream state is\n   inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the\n   expected one (incorrect adler32 value).  inflateSetDictionary does not\n   perform any decompression: this will be done by subsequent calls of\n   inflate().\n*/\n\nZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm,\n                                             Bytef *dictionary,\n                                             uInt  *dictLength));\n/*\n     Returns the sliding dictionary being maintained by inflate.  dictLength is\n   set to the number of bytes in the dictionary, and that many bytes are copied\n   to dictionary.  dictionary must have enough space, where 32768 bytes is\n   always enough.  If inflateGetDictionary() is called with dictionary equal to\n   Z_NULL, then only the dictionary length is returned, and nothing is copied.\n   Similary, if dictLength is Z_NULL, then it is not set.\n\n     inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the\n   stream state is inconsistent.\n*/\n\nZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));\n/*\n     Skips invalid compressed data until a possible full flush point (see above\n   for the description of deflate with Z_FULL_FLUSH) can be found, or until all\n   available input is skipped.  No output is provided.\n\n     inflateSync searches for a 00 00 FF FF pattern in the compressed data.\n   All full flush points have this pattern, but not all occurrences of this\n   pattern are full flush points.\n\n     inflateSync returns Z_OK if a possible full flush point has been found,\n   Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point\n   has been found, or Z_STREAM_ERROR if the stream structure was inconsistent.\n   In the success case, the application may save the current current value of\n   total_in which indicates where valid compressed data was found.  In the\n   error case, the application may repeatedly call inflateSync, providing more\n   input each time, until success or end of the input data.\n*/\n\nZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,\n                                    z_streamp source));\n/*\n     Sets the destination stream as a complete copy of the source stream.\n\n     This function can be useful when randomly accessing a large stream.  The\n   first pass through the stream can periodically record the inflate state,\n   allowing restarting inflate at those points when randomly accessing the\n   stream.\n\n     inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not\n   enough memory, Z_STREAM_ERROR if the source stream state was inconsistent\n   (such as zalloc being Z_NULL).  msg is left unchanged in both source and\n   destination.\n*/\n\nZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));\n/*\n     This function is equivalent to inflateEnd followed by inflateInit,\n   but does not free and reallocate all the internal decompression state.  The\n   stream will keep attributes that may have been set by inflateInit2.\n\n     inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source\n   stream state was inconsistent (such as zalloc or state being Z_NULL).\n*/\n\nZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm,\n                                      int windowBits));\n/*\n     This function is the same as inflateReset, but it also permits changing\n   the wrap and window size requests.  The windowBits parameter is interpreted\n   the same as it is for inflateInit2.\n\n     inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source\n   stream state was inconsistent (such as zalloc or state being Z_NULL), or if\n   the windowBits parameter is invalid.\n*/\n\nZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm,\n                                     int bits,\n                                     int value));\n/*\n     This function inserts bits in the inflate input stream.  The intent is\n   that this function is used to start inflating at a bit position in the\n   middle of a byte.  The provided bits will be used before any bytes are used\n   from next_in.  This function should only be used with raw inflate, and\n   should be used before the first inflate() call after inflateInit2() or\n   inflateReset().  bits must be less than or equal to 16, and that many of the\n   least significant bits of value will be inserted in the input.\n\n     If bits is negative, then the input stream bit buffer is emptied.  Then\n   inflatePrime() can be called again to put bits in the buffer.  This is used\n   to clear out bits leftover after feeding inflate a block description prior\n   to feeding inflate codes.\n\n     inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source\n   stream state was inconsistent.\n*/\n\nZEXTERN long ZEXPORT inflateMark OF((z_streamp strm));\n/*\n     This function returns two values, one in the lower 16 bits of the return\n   value, and the other in the remaining upper bits, obtained by shifting the\n   return value down 16 bits.  If the upper value is -1 and the lower value is\n   zero, then inflate() is currently decoding information outside of a block.\n   If the upper value is -1 and the lower value is non-zero, then inflate is in\n   the middle of a stored block, with the lower value equaling the number of\n   bytes from the input remaining to copy.  If the upper value is not -1, then\n   it is the number of bits back from the current bit position in the input of\n   the code (literal or length/distance pair) currently being processed.  In\n   that case the lower value is the number of bytes already emitted for that\n   code.\n\n     A code is being processed if inflate is waiting for more input to complete\n   decoding of the code, or if it has completed decoding but is waiting for\n   more output space to write the literal or match data.\n\n     inflateMark() is used to mark locations in the input data for random\n   access, which may be at bit positions, and to note those cases where the\n   output of a code may span boundaries of random access blocks.  The current\n   location in the input stream can be determined from avail_in and data_type\n   as noted in the description for the Z_BLOCK flush parameter for inflate.\n\n     inflateMark returns the value noted above or -1 << 16 if the provided\n   source stream state was inconsistent.\n*/\n\nZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm,\n                                         gz_headerp head));\n/*\n     inflateGetHeader() requests that gzip header information be stored in the\n   provided gz_header structure.  inflateGetHeader() may be called after\n   inflateInit2() or inflateReset(), and before the first call of inflate().\n   As inflate() processes the gzip stream, head->done is zero until the header\n   is completed, at which time head->done is set to one.  If a zlib stream is\n   being decoded, then head->done is set to -1 to indicate that there will be\n   no gzip header information forthcoming.  Note that Z_BLOCK or Z_TREES can be\n   used to force inflate() to return immediately after header processing is\n   complete and before any actual data is decompressed.\n\n     The text, time, xflags, and os fields are filled in with the gzip header\n   contents.  hcrc is set to true if there is a header CRC.  (The header CRC\n   was valid if done is set to one.) If extra is not Z_NULL, then extra_max\n   contains the maximum number of bytes to write to extra.  Once done is true,\n   extra_len contains the actual extra field length, and extra contains the\n   extra field, or that field truncated if extra_max is less than extra_len.\n   If name is not Z_NULL, then up to name_max characters are written there,\n   terminated with a zero unless the length is greater than name_max.  If\n   comment is not Z_NULL, then up to comm_max characters are written there,\n   terminated with a zero unless the length is greater than comm_max.  When any\n   of extra, name, or comment are not Z_NULL and the respective field is not\n   present in the header, then that field is set to Z_NULL to signal its\n   absence.  This allows the use of deflateSetHeader() with the returned\n   structure to duplicate the header.  However if those fields are set to\n   allocated memory, then the application will need to save those pointers\n   elsewhere so that they can be eventually freed.\n\n     If inflateGetHeader is not used, then the header information is simply\n   discarded.  The header is always checked for validity, including the header\n   CRC if present.  inflateReset() will reset the process to discard the header\n   information.  The application would need to call inflateGetHeader() again to\n   retrieve the header from the next gzip stream.\n\n     inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source\n   stream state was inconsistent.\n*/\n\n/*\nZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,\n                                        unsigned char FAR *window));\n\n     Initialize the internal stream state for decompression using inflateBack()\n   calls.  The fields zalloc, zfree and opaque in strm must be initialized\n   before the call.  If zalloc and zfree are Z_NULL, then the default library-\n   derived memory allocation routines are used.  windowBits is the base two\n   logarithm of the window size, in the range 8..15.  window is a caller\n   supplied buffer of that size.  Except for special applications where it is\n   assured that deflate was used with small window sizes, windowBits must be 15\n   and a 32K byte window must be supplied to be able to decompress general\n   deflate streams.\n\n     See inflateBack() for the usage of these routines.\n\n     inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of\n   the parameters are invalid, Z_MEM_ERROR if the internal state could not be\n   allocated, or Z_VERSION_ERROR if the version of the library does not match\n   the version of the header file.\n*/\n\ntypedef unsigned (*in_func) OF((void FAR *,\n                                z_const unsigned char FAR * FAR *));\ntypedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));\n\nZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,\n                                    in_func in, void FAR *in_desc,\n                                    out_func out, void FAR *out_desc));\n/*\n     inflateBack() does a raw inflate with a single call using a call-back\n   interface for input and output.  This is potentially more efficient than\n   inflate() for file i/o applications, in that it avoids copying between the\n   output and the sliding window by simply making the window itself the output\n   buffer.  inflate() can be faster on modern CPUs when used with large\n   buffers.  inflateBack() trusts the application to not change the output\n   buffer passed by the output function, at least until inflateBack() returns.\n\n     inflateBackInit() must be called first to allocate the internal state\n   and to initialize the state with the user-provided window buffer.\n   inflateBack() may then be used multiple times to inflate a complete, raw\n   deflate stream with each call.  inflateBackEnd() is then called to free the\n   allocated state.\n\n     A raw deflate stream is one with no zlib or gzip header or trailer.\n   This routine would normally be used in a utility that reads zip or gzip\n   files and writes out uncompressed files.  The utility would decode the\n   header and process the trailer on its own, hence this routine expects only\n   the raw deflate stream to decompress.  This is different from the normal\n   behavior of inflate(), which expects either a zlib or gzip header and\n   trailer around the deflate stream.\n\n     inflateBack() uses two subroutines supplied by the caller that are then\n   called by inflateBack() for input and output.  inflateBack() calls those\n   routines until it reads a complete deflate stream and writes out all of the\n   uncompressed data, or until it encounters an error.  The function's\n   parameters and return types are defined above in the in_func and out_func\n   typedefs.  inflateBack() will call in(in_desc, &buf) which should return the\n   number of bytes of provided input, and a pointer to that input in buf.  If\n   there is no input available, in() must return zero--buf is ignored in that\n   case--and inflateBack() will return a buffer error.  inflateBack() will call\n   out(out_desc, buf, len) to write the uncompressed data buf[0..len-1].  out()\n   should return zero on success, or non-zero on failure.  If out() returns\n   non-zero, inflateBack() will return with an error.  Neither in() nor out()\n   are permitted to change the contents of the window provided to\n   inflateBackInit(), which is also the buffer that out() uses to write from.\n   The length written by out() will be at most the window size.  Any non-zero\n   amount of input may be provided by in().\n\n     For convenience, inflateBack() can be provided input on the first call by\n   setting strm->next_in and strm->avail_in.  If that input is exhausted, then\n   in() will be called.  Therefore strm->next_in must be initialized before\n   calling inflateBack().  If strm->next_in is Z_NULL, then in() will be called\n   immediately for input.  If strm->next_in is not Z_NULL, then strm->avail_in\n   must also be initialized, and then if strm->avail_in is not zero, input will\n   initially be taken from strm->next_in[0 ..  strm->avail_in - 1].\n\n     The in_desc and out_desc parameters of inflateBack() is passed as the\n   first parameter of in() and out() respectively when they are called.  These\n   descriptors can be optionally used to pass any information that the caller-\n   supplied in() and out() functions need to do their job.\n\n     On return, inflateBack() will set strm->next_in and strm->avail_in to\n   pass back any unused input that was provided by the last in() call.  The\n   return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR\n   if in() or out() returned an error, Z_DATA_ERROR if there was a format error\n   in the deflate stream (in which case strm->msg is set to indicate the nature\n   of the error), or Z_STREAM_ERROR if the stream was not properly initialized.\n   In the case of Z_BUF_ERROR, an input or output error can be distinguished\n   using strm->next_in which will be Z_NULL only if in() returned an error.  If\n   strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning\n   non-zero.  (in() will always be called before out(), so strm->next_in is\n   assured to be defined if out() returns non-zero.) Note that inflateBack()\n   cannot return Z_OK.\n*/\n\nZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm));\n/*\n     All memory allocated by inflateBackInit() is freed.\n\n     inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream\n   state was inconsistent.\n*/\n\nZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));\n/* Return flags indicating compile-time options.\n\n    Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other:\n     1.0: size of uInt\n     3.2: size of uLong\n     5.4: size of voidpf (pointer)\n     7.6: size of z_off_t\n\n    Compiler, assembler, and debug options:\n     8: DEBUG\n     9: ASMV or ASMINF -- use ASM code\n     10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention\n     11: 0 (reserved)\n\n    One-time table building (smaller code, but not thread-safe if true):\n     12: BUILDFIXED -- build static block decoding tables when needed\n     13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed\n     14,15: 0 (reserved)\n\n    Library content (indicates missing functionality):\n     16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking\n                          deflate code when not needed)\n     17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect\n                    and decode gzip streams (to avoid linking crc code)\n     18-19: 0 (reserved)\n\n    Operation variations (changes in library functionality):\n     20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate\n     21: FASTEST -- deflate algorithm with only one, lowest compression level\n     22,23: 0 (reserved)\n\n    The sprintf variant used by gzprintf (zero is best):\n     24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format\n     25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure!\n     26: 0 = returns value, 1 = void -- 1 means inferred string length returned\n\n    Remainder:\n     27-31: 0 (reserved)\n */\n\n#ifndef Z_SOLO\n\n                        /* utility functions */\n\n/*\n     The following utility functions are implemented on top of the basic\n   stream-oriented functions.  To simplify the interface, some default options\n   are assumed (compression level and memory usage, standard memory allocation\n   functions).  The source code of these utility functions can be modified if\n   you need special options.\n*/\n\nZEXTERN int ZEXPORT compress OF((Bytef *dest,   uLongf *destLen,\n                                 const Bytef *source, uLong sourceLen));\n/*\n     Compresses the source buffer into the destination buffer.  sourceLen is\n   the byte length of the source buffer.  Upon entry, destLen is the total size\n   of the destination buffer, which must be at least the value returned by\n   compressBound(sourceLen).  Upon exit, destLen is the actual size of the\n   compressed buffer.\n\n     compress returns Z_OK if success, Z_MEM_ERROR if there was not\n   enough memory, Z_BUF_ERROR if there was not enough room in the output\n   buffer.\n*/\n\nZEXTERN int ZEXPORT compress2 OF((Bytef *dest,   uLongf *destLen,\n                                  const Bytef *source, uLong sourceLen,\n                                  int level));\n/*\n     Compresses the source buffer into the destination buffer.  The level\n   parameter has the same meaning as in deflateInit.  sourceLen is the byte\n   length of the source buffer.  Upon entry, destLen is the total size of the\n   destination buffer, which must be at least the value returned by\n   compressBound(sourceLen).  Upon exit, destLen is the actual size of the\n   compressed buffer.\n\n     compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough\n   memory, Z_BUF_ERROR if there was not enough room in the output buffer,\n   Z_STREAM_ERROR if the level parameter is invalid.\n*/\n\nZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen));\n/*\n     compressBound() returns an upper bound on the compressed size after\n   compress() or compress2() on sourceLen bytes.  It would be used before a\n   compress() or compress2() call to allocate the destination buffer.\n*/\n\nZEXTERN int ZEXPORT uncompress OF((Bytef *dest,   uLongf *destLen,\n                                   const Bytef *source, uLong sourceLen));\n/*\n     Decompresses the source buffer into the destination buffer.  sourceLen is\n   the byte length of the source buffer.  Upon entry, destLen is the total size\n   of the destination buffer, which must be large enough to hold the entire\n   uncompressed data.  (The size of the uncompressed data must have been saved\n   previously by the compressor and transmitted to the decompressor by some\n   mechanism outside the scope of this compression library.) Upon exit, destLen\n   is the actual size of the uncompressed buffer.\n\n     uncompress returns Z_OK if success, Z_MEM_ERROR if there was not\n   enough memory, Z_BUF_ERROR if there was not enough room in the output\n   buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete.  In\n   the case where there is not enough room, uncompress() will fill the output\n   buffer with the uncompressed data up to that point.\n*/\n\n                        /* gzip file access functions */\n\n/*\n     This library supports reading and writing files in gzip (.gz) format with\n   an interface similar to that of stdio, using the functions that start with\n   \"gz\".  The gzip format is different from the zlib format.  gzip is a gzip\n   wrapper, documented in RFC 1952, wrapped around a deflate stream.\n*/\n\ntypedef struct gzFile_s *gzFile;    /* semi-opaque gzip file descriptor */\n\n/*\nZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));\n\n     Opens a gzip (.gz) file for reading or writing.  The mode parameter is as\n   in fopen (\"rb\" or \"wb\") but can also include a compression level (\"wb9\") or\n   a strategy: 'f' for filtered data as in \"wb6f\", 'h' for Huffman-only\n   compression as in \"wb1h\", 'R' for run-length encoding as in \"wb1R\", or 'F'\n   for fixed code compression as in \"wb9F\".  (See the description of\n   deflateInit2 for more information about the strategy parameter.)  'T' will\n   request transparent writing or appending with no compression and not using\n   the gzip format.\n\n     \"a\" can be used instead of \"w\" to request that the gzip stream that will\n   be written be appended to the file.  \"+\" will result in an error, since\n   reading and writing to the same gzip file is not supported.  The addition of\n   \"x\" when writing will create the file exclusively, which fails if the file\n   already exists.  On systems that support it, the addition of \"e\" when\n   reading or writing will set the flag to close the file on an execve() call.\n\n     These functions, as well as gzip, will read and decode a sequence of gzip\n   streams in a file.  The append function of gzopen() can be used to create\n   such a file.  (Also see gzflush() for another way to do this.)  When\n   appending, gzopen does not test whether the file begins with a gzip stream,\n   nor does it look for the end of the gzip streams to begin appending.  gzopen\n   will simply append a gzip stream to the existing file.\n\n     gzopen can be used to read a file which is not in gzip format; in this\n   case gzread will directly read from the file without decompression.  When\n   reading, this will be detected automatically by looking for the magic two-\n   byte gzip header.\n\n     gzopen returns NULL if the file could not be opened, if there was\n   insufficient memory to allocate the gzFile state, or if an invalid mode was\n   specified (an 'r', 'w', or 'a' was not provided, or '+' was provided).\n   errno can be checked to determine if the reason gzopen failed was that the\n   file could not be opened.\n*/\n\nZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));\n/*\n     gzdopen associates a gzFile with the file descriptor fd.  File descriptors\n   are obtained from calls like open, dup, creat, pipe or fileno (if the file\n   has been previously opened with fopen).  The mode parameter is as in gzopen.\n\n     The next call of gzclose on the returned gzFile will also close the file\n   descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor\n   fd.  If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd,\n   mode);.  The duplicated descriptor should be saved to avoid a leak, since\n   gzdopen does not close fd if it fails.  If you are using fileno() to get the\n   file descriptor from a FILE *, then you will have to use dup() to avoid\n   double-close()ing the file descriptor.  Both gzclose() and fclose() will\n   close the associated file descriptor, so they need to have different file\n   descriptors.\n\n     gzdopen returns NULL if there was insufficient memory to allocate the\n   gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not\n   provided, or '+' was provided), or if fd is -1.  The file descriptor is not\n   used until the next gz* read, write, seek, or close operation, so gzdopen\n   will not detect if fd is invalid (unless fd is -1).\n*/\n\nZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size));\n/*\n     Set the internal buffer size used by this library's functions.  The\n   default buffer size is 8192 bytes.  This function must be called after\n   gzopen() or gzdopen(), and before any other calls that read or write the\n   file.  The buffer memory allocation is always deferred to the first read or\n   write.  Two buffers are allocated, either both of the specified size when\n   writing, or one of the specified size and the other twice that size when\n   reading.  A larger buffer size of, for example, 64K or 128K bytes will\n   noticeably increase the speed of decompression (reading).\n\n     The new buffer size also affects the maximum length for gzprintf().\n\n     gzbuffer() returns 0 on success, or -1 on failure, such as being called\n   too late.\n*/\n\nZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));\n/*\n     Dynamically update the compression level or strategy.  See the description\n   of deflateInit2 for the meaning of these parameters.\n\n     gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not\n   opened for writing.\n*/\n\nZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));\n/*\n     Reads the given number of uncompressed bytes from the compressed file.  If\n   the input file is not in gzip format, gzread copies the given number of\n   bytes into the buffer directly from the file.\n\n     After reaching the end of a gzip stream in the input, gzread will continue\n   to read, looking for another gzip stream.  Any number of gzip streams may be\n   concatenated in the input file, and will all be decompressed by gzread().\n   If something other than a gzip stream is encountered after a gzip stream,\n   that remaining trailing garbage is ignored (and no error is returned).\n\n     gzread can be used to read a gzip file that is being concurrently written.\n   Upon reaching the end of the input, gzread will return with the available\n   data.  If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then\n   gzclearerr can be used to clear the end of file indicator in order to permit\n   gzread to be tried again.  Z_OK indicates that a gzip stream was completed\n   on the last gzread.  Z_BUF_ERROR indicates that the input file ended in the\n   middle of a gzip stream.  Note that gzread does not return -1 in the event\n   of an incomplete gzip stream.  This error is deferred until gzclose(), which\n   will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip\n   stream.  Alternatively, gzerror can be used before gzclose to detect this\n   case.\n\n     gzread returns the number of uncompressed bytes actually read, less than\n   len for end of file, or -1 for error.\n*/\n\nZEXTERN int ZEXPORT gzwrite OF((gzFile file,\n                                voidpc buf, unsigned len));\n/*\n     Writes the given number of uncompressed bytes into the compressed file.\n   gzwrite returns the number of uncompressed bytes written or 0 in case of\n   error.\n*/\n\nZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...));\n/*\n     Converts, formats, and writes the arguments to the compressed file under\n   control of the format string, as in fprintf.  gzprintf returns the number of\n   uncompressed bytes actually written, or 0 in case of error.  The number of\n   uncompressed bytes written is limited to 8191, or one less than the buffer\n   size given to gzbuffer().  The caller should assure that this limit is not\n   exceeded.  If it is exceeded, then gzprintf() will return an error (0) with\n   nothing written.  In this case, there may also be a buffer overflow with\n   unpredictable consequences, which is possible only if zlib was compiled with\n   the insecure functions sprintf() or vsprintf() because the secure snprintf()\n   or vsnprintf() functions were not available.  This can be determined using\n   zlibCompileFlags().\n*/\n\nZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));\n/*\n     Writes the given null-terminated string to the compressed file, excluding\n   the terminating null character.\n\n     gzputs returns the number of characters written, or -1 in case of error.\n*/\n\nZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));\n/*\n     Reads bytes from the compressed file until len-1 characters are read, or a\n   newline character is read and transferred to buf, or an end-of-file\n   condition is encountered.  If any characters are read or if len == 1, the\n   string is terminated with a null character.  If no characters are read due\n   to an end-of-file or len < 1, then the buffer is left untouched.\n\n     gzgets returns buf which is a null-terminated string, or it returns NULL\n   for end-of-file or in case of error.  If there was an error, the contents at\n   buf are indeterminate.\n*/\n\nZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));\n/*\n     Writes c, converted to an unsigned char, into the compressed file.  gzputc\n   returns the value that was written, or -1 in case of error.\n*/\n\nZEXTERN int ZEXPORT gzgetc OF((gzFile file));\n/*\n     Reads one byte from the compressed file.  gzgetc returns this byte or -1\n   in case of end of file or error.  This is implemented as a macro for speed.\n   As such, it does not do all of the checking the other functions do.  I.e.\n   it does not check to see if file is NULL, nor whether the structure file\n   points to has been clobbered or not.\n*/\n\nZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));\n/*\n     Push one character back onto the stream to be read as the first character\n   on the next read.  At least one character of push-back is allowed.\n   gzungetc() returns the character pushed, or -1 on failure.  gzungetc() will\n   fail if c is -1, and may fail if a character has been pushed but not read\n   yet.  If gzungetc is used immediately after gzopen or gzdopen, at least the\n   output buffer size of pushed characters is allowed.  (See gzbuffer above.)\n   The pushed character will be discarded if the stream is repositioned with\n   gzseek() or gzrewind().\n*/\n\nZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));\n/*\n     Flushes all pending output into the compressed file.  The parameter flush\n   is as in the deflate() function.  The return value is the zlib error number\n   (see function gzerror below).  gzflush is only permitted when writing.\n\n     If the flush parameter is Z_FINISH, the remaining data is written and the\n   gzip stream is completed in the output.  If gzwrite() is called again, a new\n   gzip stream will be started in the output.  gzread() is able to read such\n   concatented gzip streams.\n\n     gzflush should be called only when strictly necessary because it will\n   degrade compression if called too often.\n*/\n\n/*\nZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,\n                                   z_off_t offset, int whence));\n\n     Sets the starting position for the next gzread or gzwrite on the given\n   compressed file.  The offset represents a number of bytes in the\n   uncompressed data stream.  The whence parameter is defined as in lseek(2);\n   the value SEEK_END is not supported.\n\n     If the file is opened for reading, this function is emulated but can be\n   extremely slow.  If the file is opened for writing, only forward seeks are\n   supported; gzseek then compresses a sequence of zeroes up to the new\n   starting position.\n\n     gzseek returns the resulting offset location as measured in bytes from\n   the beginning of the uncompressed stream, or -1 in case of error, in\n   particular if the file is opened for writing and the new starting position\n   would be before the current position.\n*/\n\nZEXTERN int ZEXPORT    gzrewind OF((gzFile file));\n/*\n     Rewinds the given file. This function is supported only for reading.\n\n     gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)\n*/\n\n/*\nZEXTERN z_off_t ZEXPORT    gztell OF((gzFile file));\n\n     Returns the starting position for the next gzread or gzwrite on the given\n   compressed file.  This position represents a number of bytes in the\n   uncompressed data stream, and is zero when starting, even if appending or\n   reading a gzip stream from the middle of a file using gzdopen().\n\n     gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)\n*/\n\n/*\nZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file));\n\n     Returns the current offset in the file being read or written.  This offset\n   includes the count of bytes that precede the gzip stream, for example when\n   appending or when using gzdopen() for reading.  When reading, the offset\n   does not include as yet unused buffered input.  This information can be used\n   for a progress indicator.  On error, gzoffset() returns -1.\n*/\n\nZEXTERN int ZEXPORT gzeof OF((gzFile file));\n/*\n     Returns true (1) if the end-of-file indicator has been set while reading,\n   false (0) otherwise.  Note that the end-of-file indicator is set only if the\n   read tried to go past the end of the input, but came up short.  Therefore,\n   just like feof(), gzeof() may return false even if there is no more data to\n   read, in the event that the last read request was for the exact number of\n   bytes remaining in the input file.  This will happen if the input file size\n   is an exact multiple of the buffer size.\n\n     If gzeof() returns true, then the read functions will return no more data,\n   unless the end-of-file indicator is reset by gzclearerr() and the input file\n   has grown since the previous end of file was detected.\n*/\n\nZEXTERN int ZEXPORT gzdirect OF((gzFile file));\n/*\n     Returns true (1) if file is being copied directly while reading, or false\n   (0) if file is a gzip stream being decompressed.\n\n     If the input file is empty, gzdirect() will return true, since the input\n   does not contain a gzip stream.\n\n     If gzdirect() is used immediately after gzopen() or gzdopen() it will\n   cause buffers to be allocated to allow reading the file to determine if it\n   is a gzip file.  Therefore if gzbuffer() is used, it should be called before\n   gzdirect().\n\n     When writing, gzdirect() returns true (1) if transparent writing was\n   requested (\"wT\" for the gzopen() mode), or false (0) otherwise.  (Note:\n   gzdirect() is not needed when writing.  Transparent writing must be\n   explicitly requested, so the application already knows the answer.  When\n   linking statically, using gzdirect() will include all of the zlib code for\n   gzip file reading and decompression, which may not be desired.)\n*/\n\nZEXTERN int ZEXPORT    gzclose OF((gzFile file));\n/*\n     Flushes all pending output if necessary, closes the compressed file and\n   deallocates the (de)compression state.  Note that once file is closed, you\n   cannot call gzerror with file, since its structures have been deallocated.\n   gzclose must not be called more than once on the same file, just as free\n   must not be called more than once on the same allocation.\n\n     gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a\n   file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the\n   last read ended in the middle of a gzip stream, or Z_OK on success.\n*/\n\nZEXTERN int ZEXPORT gzclose_r OF((gzFile file));\nZEXTERN int ZEXPORT gzclose_w OF((gzFile file));\n/*\n     Same as gzclose(), but gzclose_r() is only for use when reading, and\n   gzclose_w() is only for use when writing or appending.  The advantage to\n   using these instead of gzclose() is that they avoid linking in zlib\n   compression or decompression code that is not used when only reading or only\n   writing respectively.  If gzclose() is used, then both compression and\n   decompression code will be included the application when linking to a static\n   zlib library.\n*/\n\nZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));\n/*\n     Returns the error message for the last error which occurred on the given\n   compressed file.  errnum is set to zlib error number.  If an error occurred\n   in the file system and not in the compression library, errnum is set to\n   Z_ERRNO and the application may consult errno to get the exact error code.\n\n     The application must not modify the returned string.  Future calls to\n   this function may invalidate the previously returned string.  If file is\n   closed, then the string previously returned by gzerror will no longer be\n   available.\n\n     gzerror() should be used to distinguish errors from end-of-file for those\n   functions above that do not distinguish those cases in their return values.\n*/\n\nZEXTERN void ZEXPORT gzclearerr OF((gzFile file));\n/*\n     Clears the error and end-of-file flags for file.  This is analogous to the\n   clearerr() function in stdio.  This is useful for continuing to read a gzip\n   file that is being written concurrently.\n*/\n\n#endif /* !Z_SOLO */\n\n                        /* checksum functions */\n\n/*\n     These functions are not related to compression but are exported\n   anyway because they might be useful in applications using the compression\n   library.\n*/\n\nZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));\n/*\n     Update a running Adler-32 checksum with the bytes buf[0..len-1] and\n   return the updated checksum.  If buf is Z_NULL, this function returns the\n   required initial value for the checksum.\n\n     An Adler-32 checksum is almost as reliable as a CRC32 but can be computed\n   much faster.\n\n   Usage example:\n\n     uLong adler = adler32(0L, Z_NULL, 0);\n\n     while (read_buffer(buffer, length) != EOF) {\n       adler = adler32(adler, buffer, length);\n     }\n     if (adler != original_adler) error();\n*/\n\n/*\nZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,\n                                          z_off_t len2));\n\n     Combine two Adler-32 checksums into one.  For two sequences of bytes, seq1\n   and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for\n   each, adler1 and adler2.  adler32_combine() returns the Adler-32 checksum of\n   seq1 and seq2 concatenated, requiring only adler1, adler2, and len2.  Note\n   that the z_off_t type (like off_t) is a signed integer.  If len2 is\n   negative, the result has no meaning or utility.\n*/\n\nZEXTERN uLong ZEXPORT crc32   OF((uLong crc, const Bytef *buf, uInt len));\n/*\n     Update a running CRC-32 with the bytes buf[0..len-1] and return the\n   updated CRC-32.  If buf is Z_NULL, this function returns the required\n   initial value for the crc.  Pre- and post-conditioning (one's complement) is\n   performed within this function so it shouldn't be done by the application.\n\n   Usage example:\n\n     uLong crc = crc32(0L, Z_NULL, 0);\n\n     while (read_buffer(buffer, length) != EOF) {\n       crc = crc32(crc, buffer, length);\n     }\n     if (crc != original_crc) error();\n*/\n\n/*\nZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2));\n\n     Combine two CRC-32 check values into one.  For two sequences of bytes,\n   seq1 and seq2 with lengths len1 and len2, CRC-32 check values were\n   calculated for each, crc1 and crc2.  crc32_combine() returns the CRC-32\n   check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and\n   len2.\n*/\n\n\n                        /* various hacks, don't look :) */\n\n/* deflateInit and inflateInit are macros to allow checking the zlib version\n * and the compiler's view of z_stream:\n */\nZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,\n                                     const char *version, int stream_size));\nZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,\n                                     const char *version, int stream_size));\nZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int  level, int  method,\n                                      int windowBits, int memLevel,\n                                      int strategy, const char *version,\n                                      int stream_size));\nZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int  windowBits,\n                                      const char *version, int stream_size));\nZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,\n                                         unsigned char FAR *window,\n                                         const char *version,\n                                         int stream_size));\n#define deflateInit(strm, level) \\\n        deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream))\n#define inflateInit(strm) \\\n        inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream))\n#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \\\n        deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\\\n                      (strategy), ZLIB_VERSION, (int)sizeof(z_stream))\n#define inflateInit2(strm, windowBits) \\\n        inflateInit2_((strm), (windowBits), ZLIB_VERSION, \\\n                      (int)sizeof(z_stream))\n#define inflateBackInit(strm, windowBits, window) \\\n        inflateBackInit_((strm), (windowBits), (window), \\\n                      ZLIB_VERSION, (int)sizeof(z_stream))\n\n#ifndef Z_SOLO\n\n/* gzgetc() macro and its supporting function and exposed data structure.  Note\n * that the real internal state is much larger than the exposed structure.\n * This abbreviated structure exposes just enough for the gzgetc() macro.  The\n * user should not mess with these exposed elements, since their names or\n * behavior could change in the future, perhaps even capriciously.  They can\n * only be used by the gzgetc() macro.  You have been warned.\n */\nstruct gzFile_s {\n    unsigned have;\n    unsigned char *next;\n    z_off64_t pos;\n};\nZEXTERN int ZEXPORT gzgetc_ OF((gzFile file));  /* backward compatibility */\n#ifdef Z_PREFIX_SET\n#  undef z_gzgetc\n#  define z_gzgetc(g) \\\n          ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g))\n#else\n#  define gzgetc(g) \\\n          ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g))\n#endif\n\n/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or\n * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if\n * both are true, the application gets the *64 functions, and the regular\n * functions are changed to 64 bits) -- in case these are set on systems\n * without large file support, _LFS64_LARGEFILE must also be true\n */\n#ifdef Z_LARGE64\n   ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));\n   ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));\n   ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));\n   ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));\n   ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t));\n   ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t));\n#endif\n\n#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64)\n#  ifdef Z_PREFIX_SET\n#    define z_gzopen z_gzopen64\n#    define z_gzseek z_gzseek64\n#    define z_gztell z_gztell64\n#    define z_gzoffset z_gzoffset64\n#    define z_adler32_combine z_adler32_combine64\n#    define z_crc32_combine z_crc32_combine64\n#  else\n#    define gzopen gzopen64\n#    define gzseek gzseek64\n#    define gztell gztell64\n#    define gzoffset gzoffset64\n#    define adler32_combine adler32_combine64\n#    define crc32_combine crc32_combine64\n#  endif\n#  ifndef Z_LARGE64\n     ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));\n     ZEXTERN off64_t ZEXPORT gzseek64 OF((gzFile, off64_t, int));\n     ZEXTERN off64_t ZEXPORT gztell64 OF((gzFile));\n     ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));\n     ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, off64_t));\n     ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, off64_t));\n#  endif\n#else\n   ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *));\n   ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int));\n   ZEXTERN z_off_t ZEXPORT gztell OF((gzFile));\n   ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile));\n   ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));\n   ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));\n#endif\n\n#else /* Z_SOLO */\n\n   ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));\n   ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));\n\n#endif /* !Z_SOLO */\n\n/* hack for buggy compilers */\n#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL)\n    struct internal_state {int dummy;};\n#endif\n\n/* undocumented functions */\nZEXTERN const char   * ZEXPORT zError           OF((int));\nZEXTERN int            ZEXPORT inflateSyncPoint OF((z_streamp));\nZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table    OF((void));\nZEXTERN int            ZEXPORT inflateUndermine OF((z_streamp, int));\nZEXTERN int            ZEXPORT inflateResetKeep OF((z_streamp));\nZEXTERN int            ZEXPORT deflateResetKeep OF((z_streamp));\n#if defined(_WIN32) && !defined(Z_SOLO)\nZEXTERN gzFile         ZEXPORT gzopen_w OF((const wchar_t *path,\n                                            const char *mode));\n#endif\n#if defined(STDC) || defined(Z_HAVE_STDARG_H)\n#  ifndef Z_SOLO\nZEXTERN int            ZEXPORTVA gzvprintf Z_ARG((gzFile file,\n                                                  const char *format,\n                                                  va_list va));\n#  endif\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ZLIB_H */\n"
  },
  {
    "path": "core/src/fdrm/crypto/fx_crypt.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxcrt/fx_basic.h\"\n#include \"../../../include/fdrm/fx_crypt.h\"\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nstruct rc4_state {\n    int x, y, m[256];\n};\nvoid CRYPT_ArcFourSetup(void* context,  FX_LPCBYTE key,  FX_DWORD length )\n{\n    rc4_state *s = (rc4_state*)context;\n    int i, j, k, *m, a;\n    s->x = 0;\n    s->y = 0;\n    m = s->m;\n    for( i = 0; i < 256; i++ ) {\n        m[i] = i;\n    }\n    j = k = 0;\n    for( i = 0; i < 256; i++ ) {\n        a = m[i];\n        j = ( j + a + key[k] ) & 0xFF;\n        m[i] = m[j];\n        m[j] = a;\n        if( ++k >= (int)length ) {\n            k = 0;\n        }\n    }\n}\nvoid CRYPT_ArcFourCrypt(void* context, unsigned char *data, FX_DWORD length )\n{\n    struct rc4_state* s = (struct rc4_state*)context;\n    int i, x, y, *m, a, b;\n    x = s->x;\n    y = s->y;\n    m = s->m;\n    for( i = 0; i < (int)length; i++ ) {\n        x = ( x + 1 ) & 0xFF;\n        a = m[x];\n        y = ( y + a ) & 0xFF;\n        m[x] = b = m[y];\n        m[y] = a;\n        data[i] ^= m[( a + b ) & 0xFF];\n    }\n    s->x = x;\n    s->y = y;\n}\nvoid CRYPT_ArcFourCryptBlock(FX_LPBYTE pData, FX_DWORD size, FX_LPCBYTE key, FX_DWORD keylen)\n{\n    rc4_state s;\n    CRYPT_ArcFourSetup(&s, key, keylen);\n    CRYPT_ArcFourCrypt(&s, pData, size);\n}\nstruct md5_context {\n    FX_DWORD total[2];\n    FX_DWORD state[4];\n    FX_BYTE buffer[64];\n};\n#define GET_FX_DWORD(n,b,i)                                       \\\n    {                                                               \\\n        (n) = (FX_DWORD) ((FX_BYTE *) b)[(i)]                           \\\n              | (((FX_DWORD) ((FX_BYTE *) b)[(i)+1]) <<  8)                 \\\n              | (((FX_DWORD) ((FX_BYTE *) b)[(i)+2]) << 16)                 \\\n              | (((FX_DWORD) ((FX_BYTE *) b)[(i)+3]) << 24);                \\\n    }\n#define PUT_FX_DWORD(n,b,i)                                       \\\n    {                                                               \\\n        (((FX_BYTE *) b)[(i)]  ) = (FX_BYTE) (((n)      ) & 0xFF);      \\\n        (((FX_BYTE *) b)[(i)+1]) = (FX_BYTE) (((n) >>  8) & 0xFF);      \\\n        (((FX_BYTE *) b)[(i)+2]) = (FX_BYTE) (((n) >> 16) & 0xFF);      \\\n        (((FX_BYTE *) b)[(i)+3]) = (FX_BYTE) (((n) >> 24) & 0xFF);      \\\n    }\nvoid md5_process( struct md5_context *ctx, const FX_BYTE data[64] )\n{\n    FX_DWORD A, B, C, D, X[16];\n    GET_FX_DWORD( X[0],  data,  0 );\n    GET_FX_DWORD( X[1],  data,  4 );\n    GET_FX_DWORD( X[2],  data,  8 );\n    GET_FX_DWORD( X[3],  data, 12 );\n    GET_FX_DWORD( X[4],  data, 16 );\n    GET_FX_DWORD( X[5],  data, 20 );\n    GET_FX_DWORD( X[6],  data, 24 );\n    GET_FX_DWORD( X[7],  data, 28 );\n    GET_FX_DWORD( X[8],  data, 32 );\n    GET_FX_DWORD( X[9],  data, 36 );\n    GET_FX_DWORD( X[10], data, 40 );\n    GET_FX_DWORD( X[11], data, 44 );\n    GET_FX_DWORD( X[12], data, 48 );\n    GET_FX_DWORD( X[13], data, 52 );\n    GET_FX_DWORD( X[14], data, 56 );\n    GET_FX_DWORD( X[15], data, 60 );\n#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))\n#define P(a,b,c,d,k,s,t)                                \\\n    {                                                       \\\n        a += F(b,c,d) + X[k] + t; a = S(a,s) + b;           \\\n    }\n    A = ctx->state[0];\n    B = ctx->state[1];\n    C = ctx->state[2];\n    D = ctx->state[3];\n#define F(x,y,z) (z ^ (x & (y ^ z)))\n    P( A, B, C, D,  0,  7, 0xD76AA478 );\n    P( D, A, B, C,  1, 12, 0xE8C7B756 );\n    P( C, D, A, B,  2, 17, 0x242070DB );\n    P( B, C, D, A,  3, 22, 0xC1BDCEEE );\n    P( A, B, C, D,  4,  7, 0xF57C0FAF );\n    P( D, A, B, C,  5, 12, 0x4787C62A );\n    P( C, D, A, B,  6, 17, 0xA8304613 );\n    P( B, C, D, A,  7, 22, 0xFD469501 );\n    P( A, B, C, D,  8,  7, 0x698098D8 );\n    P( D, A, B, C,  9, 12, 0x8B44F7AF );\n    P( C, D, A, B, 10, 17, 0xFFFF5BB1 );\n    P( B, C, D, A, 11, 22, 0x895CD7BE );\n    P( A, B, C, D, 12,  7, 0x6B901122 );\n    P( D, A, B, C, 13, 12, 0xFD987193 );\n    P( C, D, A, B, 14, 17, 0xA679438E );\n    P( B, C, D, A, 15, 22, 0x49B40821 );\n#undef F\n#define F(x,y,z) (y ^ (z & (x ^ y)))\n    P( A, B, C, D,  1,  5, 0xF61E2562 );\n    P( D, A, B, C,  6,  9, 0xC040B340 );\n    P( C, D, A, B, 11, 14, 0x265E5A51 );\n    P( B, C, D, A,  0, 20, 0xE9B6C7AA );\n    P( A, B, C, D,  5,  5, 0xD62F105D );\n    P( D, A, B, C, 10,  9, 0x02441453 );\n    P( C, D, A, B, 15, 14, 0xD8A1E681 );\n    P( B, C, D, A,  4, 20, 0xE7D3FBC8 );\n    P( A, B, C, D,  9,  5, 0x21E1CDE6 );\n    P( D, A, B, C, 14,  9, 0xC33707D6 );\n    P( C, D, A, B,  3, 14, 0xF4D50D87 );\n    P( B, C, D, A,  8, 20, 0x455A14ED );\n    P( A, B, C, D, 13,  5, 0xA9E3E905 );\n    P( D, A, B, C,  2,  9, 0xFCEFA3F8 );\n    P( C, D, A, B,  7, 14, 0x676F02D9 );\n    P( B, C, D, A, 12, 20, 0x8D2A4C8A );\n#undef F\n#define F(x,y,z) (x ^ y ^ z)\n    P( A, B, C, D,  5,  4, 0xFFFA3942 );\n    P( D, A, B, C,  8, 11, 0x8771F681 );\n    P( C, D, A, B, 11, 16, 0x6D9D6122 );\n    P( B, C, D, A, 14, 23, 0xFDE5380C );\n    P( A, B, C, D,  1,  4, 0xA4BEEA44 );\n    P( D, A, B, C,  4, 11, 0x4BDECFA9 );\n    P( C, D, A, B,  7, 16, 0xF6BB4B60 );\n    P( B, C, D, A, 10, 23, 0xBEBFBC70 );\n    P( A, B, C, D, 13,  4, 0x289B7EC6 );\n    P( D, A, B, C,  0, 11, 0xEAA127FA );\n    P( C, D, A, B,  3, 16, 0xD4EF3085 );\n    P( B, C, D, A,  6, 23, 0x04881D05 );\n    P( A, B, C, D,  9,  4, 0xD9D4D039 );\n    P( D, A, B, C, 12, 11, 0xE6DB99E5 );\n    P( C, D, A, B, 15, 16, 0x1FA27CF8 );\n    P( B, C, D, A,  2, 23, 0xC4AC5665 );\n#undef F\n#define F(x,y,z) (y ^ (x | ~z))\n    P( A, B, C, D,  0,  6, 0xF4292244 );\n    P( D, A, B, C,  7, 10, 0x432AFF97 );\n    P( C, D, A, B, 14, 15, 0xAB9423A7 );\n    P( B, C, D, A,  5, 21, 0xFC93A039 );\n    P( A, B, C, D, 12,  6, 0x655B59C3 );\n    P( D, A, B, C,  3, 10, 0x8F0CCC92 );\n    P( C, D, A, B, 10, 15, 0xFFEFF47D );\n    P( B, C, D, A,  1, 21, 0x85845DD1 );\n    P( A, B, C, D,  8,  6, 0x6FA87E4F );\n    P( D, A, B, C, 15, 10, 0xFE2CE6E0 );\n    P( C, D, A, B,  6, 15, 0xA3014314 );\n    P( B, C, D, A, 13, 21, 0x4E0811A1 );\n    P( A, B, C, D,  4,  6, 0xF7537E82 );\n    P( D, A, B, C, 11, 10, 0xBD3AF235 );\n    P( C, D, A, B,  2, 15, 0x2AD7D2BB );\n    P( B, C, D, A,  9, 21, 0xEB86D391 );\n#undef F\n    ctx->state[0] += A;\n    ctx->state[1] += B;\n    ctx->state[2] += C;\n    ctx->state[3] += D;\n}\nvoid CRYPT_MD5Start(void* context)\n{\n    struct md5_context *ctx = (struct md5_context*)context;\n    ctx->total[0] = 0;\n    ctx->total[1] = 0;\n    ctx->state[0] = 0x67452301;\n    ctx->state[1] = 0xEFCDAB89;\n    ctx->state[2] = 0x98BADCFE;\n    ctx->state[3] = 0x10325476;\n}\nvoid CRYPT_MD5Update(FX_LPVOID pctx, FX_LPCBYTE input, FX_DWORD length )\n{\n    struct md5_context *ctx = (struct md5_context *)pctx;\n    FX_DWORD left, fill;\n    if( ! length ) {\n        return;\n    }\n    left = ( ctx->total[0] >> 3 ) & 0x3F;\n    fill = 64 - left;\n    ctx->total[0] += length <<  3;\n    ctx->total[1] += length >> 29;\n    ctx->total[0] &= 0xFFFFFFFF;\n    ctx->total[1] += ctx->total[0] < length << 3;\n    if( left && length >= fill ) {\n        FXSYS_memcpy32( (void *) (ctx->buffer + left), (void *) input, fill );\n        md5_process( ctx, ctx->buffer );\n        length -= fill;\n        input  += fill;\n        left = 0;\n    }\n    while( length >= 64 ) {\n        md5_process( ctx, input );\n        length -= 64;\n        input  += 64;\n    }\n    if( length ) {\n        FXSYS_memcpy32( (void *) (ctx->buffer + left), (void *) input, length );\n    }\n}\nconst FX_BYTE md5_padding[64] = {\n    0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n};\nvoid CRYPT_MD5Finish(FX_LPVOID pctx, FX_BYTE digest[16] )\n{\n    struct md5_context *ctx = (struct md5_context *)pctx;\n    FX_DWORD last, padn;\n    FX_BYTE msglen[8];\n    PUT_FX_DWORD( ctx->total[0], msglen, 0 );\n    PUT_FX_DWORD( ctx->total[1], msglen, 4 );\n    last = ( ctx->total[0] >> 3 ) & 0x3F;\n    padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );\n    CRYPT_MD5Update( ctx, md5_padding, padn );\n    CRYPT_MD5Update( ctx, msglen, 8 );\n    PUT_FX_DWORD( ctx->state[0], digest,  0 );\n    PUT_FX_DWORD( ctx->state[1], digest,  4 );\n    PUT_FX_DWORD( ctx->state[2], digest,  8 );\n    PUT_FX_DWORD( ctx->state[3], digest, 12 );\n}\nvoid CRYPT_MD5Generate(FX_LPCBYTE input, FX_DWORD length, FX_BYTE digest[16])\n{\n    md5_context ctx;\n    CRYPT_MD5Start(&ctx);\n    CRYPT_MD5Update(&ctx, input, length);\n    CRYPT_MD5Finish(&ctx, digest);\n}\nstatic FX_BOOL (*g_PubKeyDecryptor)(FX_LPCBYTE pData, FX_DWORD size, FX_LPBYTE data_buf, FX_DWORD& data_len) = NULL;\nvoid CRYPT_SetPubKeyDecryptor(FX_BOOL (*func)(FX_LPCBYTE pData, FX_DWORD size, FX_LPBYTE data_buf, FX_DWORD& data_len))\n{\n    g_PubKeyDecryptor = func;\n}\n#ifdef __cplusplus\n};\n#endif\n"
  },
  {
    "path": "core/src/fdrm/crypto/fx_crypt_aes.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxcrt/fx_basic.h\"\n#include \"../../../include/fdrm/fx_crypt.h\"\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n#define MAX_NR 14\n#define MAX_NK 8\n#define MAX_NB 8\n#define mulby2(x) ( ((x&0x7F) << 1) ^ (x & 0x80 ? 0x1B : 0) )\n#define GET_32BIT_MSB_FIRST(cp) \\\n    (((unsigned long)(unsigned char)(cp)[3]) | \\\n     ((unsigned long)(unsigned char)(cp)[2] << 8) | \\\n     ((unsigned long)(unsigned char)(cp)[1] << 16) | \\\n     ((unsigned long)(unsigned char)(cp)[0] << 24))\n#define PUT_32BIT_MSB_FIRST(cp, value) do { \\\n        (cp)[3] = (value); \\\n        (cp)[2] = (value) >> 8; \\\n        (cp)[1] = (value) >> 16; \\\n        (cp)[0] = (value) >> 24; } while (0)\nstruct AESContext {\n    unsigned int keysched[(MAX_NR + 1) * MAX_NB];\n    unsigned int invkeysched[(MAX_NR + 1) * MAX_NB];\n    void (*encrypt) (AESContext * ctx, unsigned int * block);\n    void (*decrypt) (AESContext * ctx, unsigned int * block);\n    unsigned int iv[MAX_NB];\n    int Nb, Nr;\n};\nstatic const unsigned char Sbox[256] = {\n    0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,\n    0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,\n    0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,\n    0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,\n    0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,\n    0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,\n    0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,\n    0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,\n    0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,\n    0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,\n    0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,\n    0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,\n    0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,\n    0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,\n    0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,\n    0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,\n    0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,\n    0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,\n    0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,\n    0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,\n    0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,\n    0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,\n    0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,\n    0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,\n    0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,\n    0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,\n    0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,\n    0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,\n    0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,\n    0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,\n    0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,\n    0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16\n};\nstatic const unsigned char Sboxinv[256] = {\n    0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38,\n    0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,\n    0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,\n    0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,\n    0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d,\n    0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,\n    0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2,\n    0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,\n    0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,\n    0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,\n    0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda,\n    0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,\n    0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a,\n    0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,\n    0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,\n    0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,\n    0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea,\n    0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,\n    0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85,\n    0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,\n    0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,\n    0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,\n    0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20,\n    0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,\n    0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31,\n    0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,\n    0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,\n    0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,\n    0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0,\n    0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,\n    0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26,\n    0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d\n};\nstatic const unsigned int E0[256] = {\n    0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d,\n    0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554,\n    0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d,\n    0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a,\n    0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87,\n    0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b,\n    0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea,\n    0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b,\n    0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a,\n    0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f,\n    0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108,\n    0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f,\n    0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e,\n    0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5,\n    0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d,\n    0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f,\n    0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e,\n    0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb,\n    0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce,\n    0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497,\n    0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c,\n    0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed,\n    0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b,\n    0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a,\n    0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16,\n    0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594,\n    0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81,\n    0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3,\n    0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a,\n    0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504,\n    0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163,\n    0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d,\n    0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f,\n    0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739,\n    0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47,\n    0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395,\n    0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f,\n    0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883,\n    0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c,\n    0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76,\n    0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e,\n    0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4,\n    0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6,\n    0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b,\n    0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7,\n    0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0,\n    0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25,\n    0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818,\n    0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72,\n    0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651,\n    0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21,\n    0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85,\n    0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa,\n    0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12,\n    0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0,\n    0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9,\n    0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133,\n    0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7,\n    0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920,\n    0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a,\n    0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17,\n    0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8,\n    0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11,\n    0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a,\n};\nstatic const unsigned int E1[256] = {\n    0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b,\n    0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5,\n    0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b,\n    0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676,\n    0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d,\n    0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0,\n    0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf,\n    0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0,\n    0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626,\n    0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc,\n    0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1,\n    0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515,\n    0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3,\n    0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a,\n    0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2,\n    0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575,\n    0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a,\n    0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0,\n    0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3,\n    0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484,\n    0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded,\n    0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b,\n    0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939,\n    0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf,\n    0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb,\n    0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585,\n    0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f,\n    0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8,\n    0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f,\n    0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5,\n    0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121,\n    0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2,\n    0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec,\n    0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717,\n    0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d,\n    0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373,\n    0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc,\n    0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888,\n    0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414,\n    0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb,\n    0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a,\n    0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c,\n    0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262,\n    0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979,\n    0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d,\n    0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9,\n    0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea,\n    0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808,\n    0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e,\n    0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6,\n    0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f,\n    0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a,\n    0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666,\n    0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e,\n    0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9,\n    0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e,\n    0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111,\n    0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494,\n    0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9,\n    0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf,\n    0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d,\n    0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868,\n    0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f,\n    0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616,\n};\nstatic const unsigned int E2[256] = {\n    0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b,\n    0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5,\n    0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b,\n    0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76,\n    0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d,\n    0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0,\n    0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af,\n    0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0,\n    0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26,\n    0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc,\n    0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1,\n    0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15,\n    0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3,\n    0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a,\n    0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2,\n    0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75,\n    0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a,\n    0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0,\n    0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3,\n    0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384,\n    0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed,\n    0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b,\n    0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239,\n    0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf,\n    0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb,\n    0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185,\n    0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f,\n    0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8,\n    0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f,\n    0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5,\n    0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221,\n    0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2,\n    0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec,\n    0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17,\n    0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d,\n    0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673,\n    0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc,\n    0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88,\n    0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814,\n    0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb,\n    0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a,\n    0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c,\n    0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462,\n    0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279,\n    0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d,\n    0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9,\n    0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea,\n    0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008,\n    0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e,\n    0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6,\n    0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f,\n    0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a,\n    0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66,\n    0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e,\n    0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9,\n    0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e,\n    0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211,\n    0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394,\n    0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9,\n    0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df,\n    0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d,\n    0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068,\n    0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f,\n    0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16,\n};\nstatic const unsigned int E3[256] = {\n    0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6,\n    0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491,\n    0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56,\n    0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec,\n    0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa,\n    0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb,\n    0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45,\n    0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b,\n    0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c,\n    0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83,\n    0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9,\n    0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a,\n    0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d,\n    0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f,\n    0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf,\n    0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea,\n    0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34,\n    0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b,\n    0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d,\n    0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713,\n    0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1,\n    0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6,\n    0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72,\n    0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85,\n    0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed,\n    0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411,\n    0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe,\n    0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b,\n    0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05,\n    0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1,\n    0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342,\n    0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf,\n    0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3,\n    0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e,\n    0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a,\n    0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6,\n    0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3,\n    0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b,\n    0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28,\n    0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad,\n    0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14,\n    0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8,\n    0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4,\n    0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2,\n    0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da,\n    0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049,\n    0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf,\n    0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810,\n    0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c,\n    0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197,\n    0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e,\n    0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f,\n    0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc,\n    0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c,\n    0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069,\n    0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927,\n    0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322,\n    0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733,\n    0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9,\n    0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5,\n    0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a,\n    0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0,\n    0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e,\n    0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c,\n};\nstatic const unsigned int D0[256] = {\n    0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96,\n    0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393,\n    0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25,\n    0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f,\n    0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1,\n    0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6,\n    0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da,\n    0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844,\n    0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd,\n    0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4,\n    0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45,\n    0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94,\n    0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7,\n    0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a,\n    0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5,\n    0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c,\n    0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1,\n    0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a,\n    0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75,\n    0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051,\n    0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46,\n    0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff,\n    0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77,\n    0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb,\n    0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000,\n    0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e,\n    0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927,\n    0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a,\n    0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e,\n    0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16,\n    0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d,\n    0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8,\n    0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd,\n    0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34,\n    0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163,\n    0xd731dcca, 0x42638510, 0x13972240, 0x84c61120,\n    0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d,\n    0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0,\n    0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422,\n    0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef,\n    0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36,\n    0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4,\n    0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662,\n    0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5,\n    0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3,\n    0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b,\n    0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8,\n    0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6,\n    0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6,\n    0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0,\n    0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815,\n    0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f,\n    0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df,\n    0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f,\n    0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e,\n    0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713,\n    0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89,\n    0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c,\n    0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf,\n    0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86,\n    0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f,\n    0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541,\n    0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190,\n    0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742,\n};\nstatic const unsigned int D1[256] = {\n    0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e,\n    0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303,\n    0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c,\n    0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3,\n    0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0,\n    0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9,\n    0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259,\n    0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8,\n    0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971,\n    0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a,\n    0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f,\n    0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b,\n    0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8,\n    0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab,\n    0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708,\n    0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682,\n    0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2,\n    0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe,\n    0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb,\n    0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10,\n    0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd,\n    0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015,\n    0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e,\n    0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee,\n    0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000,\n    0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72,\n    0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39,\n    0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e,\n    0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91,\n    0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a,\n    0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17,\n    0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9,\n    0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60,\n    0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e,\n    0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1,\n    0xcad731dc, 0x10426385, 0x40139722, 0x2084c611,\n    0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1,\n    0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3,\n    0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964,\n    0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390,\n    0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b,\n    0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf,\n    0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46,\n    0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af,\n    0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512,\n    0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb,\n    0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a,\n    0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8,\n    0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c,\n    0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266,\n    0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8,\n    0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6,\n    0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604,\n    0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551,\n    0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41,\n    0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647,\n    0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c,\n    0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1,\n    0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737,\n    0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db,\n    0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340,\n    0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95,\n    0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1,\n    0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857,\n};\nstatic const unsigned int D2[256] = {\n    0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27,\n    0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3,\n    0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502,\n    0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562,\n    0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe,\n    0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3,\n    0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552,\n    0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9,\n    0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9,\n    0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce,\n    0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253,\n    0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908,\n    0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b,\n    0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655,\n    0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337,\n    0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16,\n    0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69,\n    0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6,\n    0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6,\n    0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e,\n    0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6,\n    0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050,\n    0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9,\n    0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8,\n    0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000,\n    0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a,\n    0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d,\n    0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436,\n    0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b,\n    0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12,\n    0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b,\n    0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e,\n    0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f,\n    0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb,\n    0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4,\n    0xdccad731, 0x85104263, 0x22401397, 0x112084c6,\n    0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729,\n    0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1,\n    0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9,\n    0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233,\n    0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4,\n    0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad,\n    0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e,\n    0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3,\n    0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25,\n    0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b,\n    0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f,\n    0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15,\n    0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0,\n    0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2,\n    0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7,\n    0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791,\n    0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496,\n    0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665,\n    0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b,\n    0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6,\n    0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13,\n    0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47,\n    0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7,\n    0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844,\n    0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3,\n    0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d,\n    0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456,\n    0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8,\n};\nstatic const unsigned int D3[256] = {\n    0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a,\n    0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b,\n    0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5,\n    0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5,\n    0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d,\n    0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b,\n    0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95,\n    0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e,\n    0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27,\n    0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d,\n    0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562,\n    0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9,\n    0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752,\n    0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66,\n    0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3,\n    0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced,\n    0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e,\n    0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4,\n    0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4,\n    0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd,\n    0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d,\n    0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60,\n    0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767,\n    0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79,\n    0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000,\n    0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c,\n    0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736,\n    0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24,\n    0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b,\n    0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c,\n    0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12,\n    0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814,\n    0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3,\n    0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b,\n    0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8,\n    0x31dccad7, 0x63851042, 0x97224013, 0xc6112084,\n    0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7,\n    0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077,\n    0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247,\n    0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22,\n    0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698,\n    0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f,\n    0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254,\n    0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582,\n    0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf,\n    0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb,\n    0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883,\n    0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef,\n    0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629,\n    0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035,\n    0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533,\n    0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17,\n    0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4,\n    0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46,\n    0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb,\n    0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d,\n    0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb,\n    0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a,\n    0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73,\n    0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678,\n    0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2,\n    0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff,\n    0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064,\n    0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0,\n};\n#define ADD_ROUND_KEY_4 (block[0]^=*keysched++, block[1]^=*keysched++, \\\n                         block[2]^=*keysched++, block[3]^=*keysched++)\n#define ADD_ROUND_KEY_6 (block[0]^=*keysched++, block[1]^=*keysched++, \\\n                         block[2]^=*keysched++, block[3]^=*keysched++, \\\n                         block[4]^=*keysched++, block[5]^=*keysched++)\n#define ADD_ROUND_KEY_8 (block[0]^=*keysched++, block[1]^=*keysched++, \\\n                         block[2]^=*keysched++, block[3]^=*keysched++, \\\n                         block[4]^=*keysched++, block[5]^=*keysched++, \\\n                         block[6]^=*keysched++, block[7]^=*keysched++)\n#define MOVEWORD(i) ( block[i] = newstate[i] )\n#undef MAKEWORD\n#define MAKEWORD(i) ( newstate[i] = (E0[(block[i] >> 24) & 0xFF] ^ \\\n                                     E1[(block[(i+C1)%Nb] >> 16) & 0xFF] ^ \\\n                                     E2[(block[(i+C2)%Nb] >> 8) & 0xFF] ^ \\\n                                     E3[block[(i+C3)%Nb] & 0xFF]) )\n#define LASTWORD(i) ( newstate[i] = (Sbox[(block[i] >> 24) & 0xFF] << 24) | \\\n                                    (Sbox[(block[(i+C1)%Nb] >> 16) & 0xFF] << 16) | \\\n                                    (Sbox[(block[(i+C2)%Nb] >>  8) & 0xFF] <<  8) | \\\n                                    (Sbox[(block[(i+C3)%Nb]      ) & 0xFF]      ) )\nstatic void aes_encrypt_nb_4(AESContext * ctx, unsigned int * block)\n{\n    int i;\n    static const int C1 = 1, C2 = 2, C3 = 3, Nb = 4;\n    unsigned int *keysched = ctx->keysched;\n    unsigned int newstate[4];\n    for (i = 0; i < ctx->Nr - 1; i++) {\n        ADD_ROUND_KEY_4;\n        MAKEWORD(0);\n        MAKEWORD(1);\n        MAKEWORD(2);\n        MAKEWORD(3);\n        MOVEWORD(0);\n        MOVEWORD(1);\n        MOVEWORD(2);\n        MOVEWORD(3);\n    }\n    ADD_ROUND_KEY_4;\n    LASTWORD(0);\n    LASTWORD(1);\n    LASTWORD(2);\n    LASTWORD(3);\n    MOVEWORD(0);\n    MOVEWORD(1);\n    MOVEWORD(2);\n    MOVEWORD(3);\n    ADD_ROUND_KEY_4;\n}\nstatic void aes_encrypt_nb_6(AESContext * ctx, unsigned int * block)\n{\n    int i;\n    static const int C1 = 1, C2 = 2, C3 = 3, Nb = 6;\n    unsigned int *keysched = ctx->keysched;\n    unsigned int newstate[6];\n    for (i = 0; i < ctx->Nr - 1; i++) {\n        ADD_ROUND_KEY_6;\n        MAKEWORD(0);\n        MAKEWORD(1);\n        MAKEWORD(2);\n        MAKEWORD(3);\n        MAKEWORD(4);\n        MAKEWORD(5);\n        MOVEWORD(0);\n        MOVEWORD(1);\n        MOVEWORD(2);\n        MOVEWORD(3);\n        MOVEWORD(4);\n        MOVEWORD(5);\n    }\n    ADD_ROUND_KEY_6;\n    LASTWORD(0);\n    LASTWORD(1);\n    LASTWORD(2);\n    LASTWORD(3);\n    LASTWORD(4);\n    LASTWORD(5);\n    MOVEWORD(0);\n    MOVEWORD(1);\n    MOVEWORD(2);\n    MOVEWORD(3);\n    MOVEWORD(4);\n    MOVEWORD(5);\n    ADD_ROUND_KEY_6;\n}\nstatic void aes_encrypt_nb_8(AESContext * ctx, unsigned int * block)\n{\n    int i;\n    static const int C1 = 1, C2 = 3, C3 = 4, Nb = 8;\n    unsigned int *keysched = ctx->keysched;\n    unsigned int newstate[8];\n    for (i = 0; i < ctx->Nr - 1; i++) {\n        ADD_ROUND_KEY_8;\n        MAKEWORD(0);\n        MAKEWORD(1);\n        MAKEWORD(2);\n        MAKEWORD(3);\n        MAKEWORD(4);\n        MAKEWORD(5);\n        MAKEWORD(6);\n        MAKEWORD(7);\n        MOVEWORD(0);\n        MOVEWORD(1);\n        MOVEWORD(2);\n        MOVEWORD(3);\n        MOVEWORD(4);\n        MOVEWORD(5);\n        MOVEWORD(6);\n        MOVEWORD(7);\n    }\n    ADD_ROUND_KEY_8;\n    LASTWORD(0);\n    LASTWORD(1);\n    LASTWORD(2);\n    LASTWORD(3);\n    LASTWORD(4);\n    LASTWORD(5);\n    LASTWORD(6);\n    LASTWORD(7);\n    MOVEWORD(0);\n    MOVEWORD(1);\n    MOVEWORD(2);\n    MOVEWORD(3);\n    MOVEWORD(4);\n    MOVEWORD(5);\n    MOVEWORD(6);\n    MOVEWORD(7);\n    ADD_ROUND_KEY_8;\n}\n#undef MAKEWORD\n#undef LASTWORD\n#define MAKEWORD(i) ( newstate[i] = (D0[(block[i] >> 24) & 0xFF] ^ \\\n                                     D1[(block[(i+C1)%Nb] >> 16) & 0xFF] ^ \\\n                                     D2[(block[(i+C2)%Nb] >> 8) & 0xFF] ^ \\\n                                     D3[block[(i+C3)%Nb] & 0xFF]) )\n#define LASTWORD(i) (newstate[i] = (Sboxinv[(block[i] >> 24) & 0xFF] << 24) | \\\n                                   (Sboxinv[(block[(i+C1)%Nb] >> 16) & 0xFF] << 16) | \\\n                                   (Sboxinv[(block[(i+C2)%Nb] >>  8) & 0xFF] <<  8) | \\\n                                   (Sboxinv[(block[(i+C3)%Nb]      ) & 0xFF]      ) )\nstatic void aes_decrypt_nb_4(AESContext * ctx, unsigned int * block)\n{\n    int i;\n    static const int C1 = 4 - 1, C2 = 4 - 2, C3 = 4 - 3, Nb = 4;\n    unsigned int *keysched = ctx->invkeysched;\n    unsigned int newstate[4];\n    for (i = 0; i < ctx->Nr - 1; i++) {\n        ADD_ROUND_KEY_4;\n        MAKEWORD(0);\n        MAKEWORD(1);\n        MAKEWORD(2);\n        MAKEWORD(3);\n        MOVEWORD(0);\n        MOVEWORD(1);\n        MOVEWORD(2);\n        MOVEWORD(3);\n    }\n    ADD_ROUND_KEY_4;\n    LASTWORD(0);\n    LASTWORD(1);\n    LASTWORD(2);\n    LASTWORD(3);\n    MOVEWORD(0);\n    MOVEWORD(1);\n    MOVEWORD(2);\n    MOVEWORD(3);\n    ADD_ROUND_KEY_4;\n}\nstatic void aes_decrypt_nb_6(AESContext * ctx, unsigned int * block)\n{\n    int i;\n    static const int C1 = 6 - 1, C2 = 6 - 2, C3 = 6 - 3, Nb = 6;\n    unsigned int *keysched = ctx->invkeysched;\n    unsigned int newstate[6];\n    for (i = 0; i < ctx->Nr - 1; i++) {\n        ADD_ROUND_KEY_6;\n        MAKEWORD(0);\n        MAKEWORD(1);\n        MAKEWORD(2);\n        MAKEWORD(3);\n        MAKEWORD(4);\n        MAKEWORD(5);\n        MOVEWORD(0);\n        MOVEWORD(1);\n        MOVEWORD(2);\n        MOVEWORD(3);\n        MOVEWORD(4);\n        MOVEWORD(5);\n    }\n    ADD_ROUND_KEY_6;\n    LASTWORD(0);\n    LASTWORD(1);\n    LASTWORD(2);\n    LASTWORD(3);\n    LASTWORD(4);\n    LASTWORD(5);\n    MOVEWORD(0);\n    MOVEWORD(1);\n    MOVEWORD(2);\n    MOVEWORD(3);\n    MOVEWORD(4);\n    MOVEWORD(5);\n    ADD_ROUND_KEY_6;\n}\nstatic void aes_decrypt_nb_8(AESContext * ctx, unsigned int * block)\n{\n    int i;\n    static const int C1 = 8 - 1, C2 = 8 - 3, C3 = 8 - 4, Nb = 8;\n    unsigned int *keysched = ctx->invkeysched;\n    unsigned int newstate[8];\n    for (i = 0; i < ctx->Nr - 1; i++) {\n        ADD_ROUND_KEY_8;\n        MAKEWORD(0);\n        MAKEWORD(1);\n        MAKEWORD(2);\n        MAKEWORD(3);\n        MAKEWORD(4);\n        MAKEWORD(5);\n        MAKEWORD(6);\n        MAKEWORD(7);\n        MOVEWORD(0);\n        MOVEWORD(1);\n        MOVEWORD(2);\n        MOVEWORD(3);\n        MOVEWORD(4);\n        MOVEWORD(5);\n        MOVEWORD(6);\n        MOVEWORD(7);\n    }\n    ADD_ROUND_KEY_8;\n    LASTWORD(0);\n    LASTWORD(1);\n    LASTWORD(2);\n    LASTWORD(3);\n    LASTWORD(4);\n    LASTWORD(5);\n    LASTWORD(6);\n    LASTWORD(7);\n    MOVEWORD(0);\n    MOVEWORD(1);\n    MOVEWORD(2);\n    MOVEWORD(3);\n    MOVEWORD(4);\n    MOVEWORD(5);\n    MOVEWORD(6);\n    MOVEWORD(7);\n    ADD_ROUND_KEY_8;\n}\n#undef MAKEWORD\n#undef LASTWORD\nstatic void aes_setup(AESContext * ctx, int blocklen,\n                      const unsigned char *key, int keylen)\n{\n    int i, j, Nk, rconst;\n    ASSERT(blocklen == 16 || blocklen == 24 || blocklen == 32);\n    ASSERT(keylen == 16 || keylen == 24 || keylen == 32);\n    Nk = keylen / 4;\n    ctx->Nb = blocklen / 4;\n    ctx->Nr = 6 + (ctx->Nb > Nk ? ctx->Nb : Nk);\n    if (ctx->Nb == 8) {\n        ctx->encrypt = aes_encrypt_nb_8, ctx->decrypt = aes_decrypt_nb_8;\n    } else if (ctx->Nb == 6) {\n        ctx->encrypt = aes_encrypt_nb_6, ctx->decrypt = aes_decrypt_nb_6;\n    } else if (ctx->Nb == 4) {\n        ctx->encrypt = aes_encrypt_nb_4, ctx->decrypt = aes_decrypt_nb_4;\n    }\n    rconst = 1;\n    for (i = 0; i < (ctx->Nr + 1) * ctx->Nb; i++) {\n        if (i < Nk) {\n            ctx->keysched[i] = GET_32BIT_MSB_FIRST(key + 4 * i);\n        } else {\n            unsigned int temp = ctx->keysched[i - 1];\n            if (i % Nk == 0) {\n                int a, b, c, d;\n                a = (temp >> 16) & 0xFF;\n                b = (temp >> 8) & 0xFF;\n                c = (temp >> 0) & 0xFF;\n                d = (temp >> 24) & 0xFF;\n                temp = Sbox[a] ^ rconst;\n                temp = (temp << 8) | Sbox[b];\n                temp = (temp << 8) | Sbox[c];\n                temp = (temp << 8) | Sbox[d];\n                rconst = mulby2(rconst);\n            } else if (i % Nk == 4 && Nk > 6) {\n                int a, b, c, d;\n                a = (temp >> 24) & 0xFF;\n                b = (temp >> 16) & 0xFF;\n                c = (temp >> 8) & 0xFF;\n                d = (temp >> 0) & 0xFF;\n                temp = Sbox[a];\n                temp = (temp << 8) | Sbox[b];\n                temp = (temp << 8) | Sbox[c];\n                temp = (temp << 8) | Sbox[d];\n            }\n            ctx->keysched[i] = ctx->keysched[i - Nk] ^ temp;\n        }\n    }\n    for (i = 0; i <= ctx->Nr; i++) {\n        for (j = 0; j < ctx->Nb; j++) {\n            unsigned int temp;\n            temp = ctx->keysched[(ctx->Nr - i) * ctx->Nb + j];\n            if (i != 0 && i != ctx->Nr) {\n                int a, b, c, d;\n                a = (temp >> 24) & 0xFF;\n                b = (temp >> 16) & 0xFF;\n                c = (temp >> 8) & 0xFF;\n                d = (temp >> 0) & 0xFF;\n                temp = D0[Sbox[a]];\n                temp ^= D1[Sbox[b]];\n                temp ^= D2[Sbox[c]];\n                temp ^= D3[Sbox[d]];\n            }\n            ctx->invkeysched[i * ctx->Nb + j] = temp;\n        }\n    }\n}\nstatic void aes_decrypt(AESContext * ctx, unsigned int * block)\n{\n    ctx->decrypt(ctx, block);\n}\nstatic void aes_decrypt_cbc(unsigned char *dest, const unsigned char *src, int len, AESContext * ctx)\n{\n    unsigned int iv[4], x[4], ct[4];\n    int i;\n    ASSERT((len & 15) == 0);\n    FXSYS_memcpy32(iv, ctx->iv, sizeof(iv));\n    while (len > 0) {\n        for (i = 0; i < 4; i++) {\n            x[i] = ct[i] = GET_32BIT_MSB_FIRST(src + 4 * i);\n        }\n        aes_decrypt(ctx, x);\n        for (i = 0; i < 4; i++) {\n            PUT_32BIT_MSB_FIRST(dest + 4 * i, iv[i] ^ x[i]);\n            iv[i] = ct[i];\n        }\n        dest += 16;\n        src += 16;\n        len -= 16;\n    }\n    FXSYS_memcpy32(ctx->iv, iv, sizeof(iv));\n}\nstatic void aes_encrypt(AESContext * ctx, unsigned int * block)\n{\n    ctx->encrypt(ctx, block);\n}\nstatic void aes_encrypt_cbc(unsigned char *dest, const unsigned char *src, int len, AESContext * ctx)\n{\n    unsigned int iv[4];\n    int i;\n    ASSERT((len & 15) == 0);\n    FXSYS_memcpy32(iv, ctx->iv, sizeof(iv));\n    while (len > 0) {\n        for (i = 0; i < 4; i++) {\n            iv[i] ^= GET_32BIT_MSB_FIRST(src + 4 * i);\n        }\n        aes_encrypt(ctx, iv);\n        for (i = 0; i < 4; i++) {\n            PUT_32BIT_MSB_FIRST(dest + 4 * i, iv[i]);\n        }\n        dest += 16;\n        src += 16;\n        len -= 16;\n    }\n    FXSYS_memcpy32(ctx->iv, iv, sizeof(iv));\n}\nvoid CRYPT_AESSetKey(FX_LPVOID context, FX_DWORD blocklen, FX_LPCBYTE key, FX_DWORD keylen, FX_BOOL bEncrypt)\n{\n    aes_setup((AESContext*)context, blocklen, key, keylen);\n}\nvoid CRYPT_AESSetIV(FX_LPVOID context, FX_LPCBYTE iv)\n{\n    int i;\n    for (i = 0; i < ((AESContext*)context)->Nb; i++) {\n        ((AESContext*)context)->iv[i] = GET_32BIT_MSB_FIRST(iv + 4 * i);\n    }\n}\nvoid CRYPT_AESDecrypt(FX_LPVOID context, FX_LPBYTE dest, FX_LPCBYTE src, FX_DWORD len)\n{\n    aes_decrypt_cbc(dest, src, len, (AESContext*)context);\n}\nvoid CRYPT_AESEncrypt(FX_LPVOID context, FX_LPBYTE dest, FX_LPCBYTE src, FX_DWORD len)\n{\n    aes_encrypt_cbc(dest, src, len, (AESContext*)context);\n}\n#ifdef __cplusplus\n};\n#endif\n"
  },
  {
    "path": "core/src/fdrm/crypto/fx_crypt_sha.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxcrt/fx_basic.h\"\n#include \"../../../include/fdrm/fx_crypt.h\"\n#ifdef __cplusplus\nextern \"C\" {\n#endif\ntypedef struct {\n    unsigned int h[5];\n    unsigned char block[64];\n    int blkused;\n    unsigned int lenhi, lenlo;\n} SHA_State;\n#define rol(x,y) ( ((x) << (y)) | (((unsigned int)x) >> (32-y)) )\nstatic void SHA_Core_Init(unsigned int h[5])\n{\n    h[0] = 0x67452301;\n    h[1] = 0xefcdab89;\n    h[2] = 0x98badcfe;\n    h[3] = 0x10325476;\n    h[4] = 0xc3d2e1f0;\n}\nstatic void SHATransform(unsigned int * digest, unsigned int * block)\n{\n    unsigned int w[80];\n    unsigned int a, b, c, d, e;\n    int t;\n    for (t = 0; t < 16; t++) {\n        w[t] = block[t];\n    }\n    for (t = 16; t < 80; t++) {\n        unsigned int tmp = w[t - 3] ^ w[t - 8] ^ w[t - 14] ^ w[t - 16];\n        w[t] = rol(tmp, 1);\n    }\n    a = digest[0];\n    b = digest[1];\n    c = digest[2];\n    d = digest[3];\n    e = digest[4];\n    for (t = 0; t < 20; t++) {\n        unsigned int tmp =\n            rol(a, 5) + ((b & c) | (d & ~b)) + e + w[t] + 0x5a827999;\n        e = d;\n        d = c;\n        c = rol(b, 30);\n        b = a;\n        a = tmp;\n    }\n    for (t = 20; t < 40; t++) {\n        unsigned int tmp = rol(a, 5) + (b ^ c ^ d) + e + w[t] + 0x6ed9eba1;\n        e = d;\n        d = c;\n        c = rol(b, 30);\n        b = a;\n        a = tmp;\n    }\n    for (t = 40; t < 60; t++) {\n        unsigned int tmp = rol(a,\n                               5) + ((b & c) | (b & d) | (c & d)) + e + w[t] +\n                           0x8f1bbcdc;\n        e = d;\n        d = c;\n        c = rol(b, 30);\n        b = a;\n        a = tmp;\n    }\n    for (t = 60; t < 80; t++) {\n        unsigned int tmp = rol(a, 5) + (b ^ c ^ d) + e + w[t] + 0xca62c1d6;\n        e = d;\n        d = c;\n        c = rol(b, 30);\n        b = a;\n        a = tmp;\n    }\n    digest[0] += a;\n    digest[1] += b;\n    digest[2] += c;\n    digest[3] += d;\n    digest[4] += e;\n}\nvoid CRYPT_SHA1Start(FX_LPVOID context)\n{\n    SHA_State * s = (SHA_State*)context;\n    SHA_Core_Init(s->h);\n    s->blkused = 0;\n    s->lenhi = s->lenlo = 0;\n}\nvoid CRYPT_SHA1Update(FX_LPVOID context, FX_LPCBYTE data, FX_DWORD size)\n{\n    SHA_State * s = (SHA_State*)context;\n    unsigned char *q = (unsigned char *)data;\n    unsigned int wordblock[16];\n    int len = size;\n    unsigned int lenw = len;\n    int i;\n    s->lenlo += lenw;\n    s->lenhi += (s->lenlo < lenw);\n    if (s->blkused && s->blkused + len < 64) {\n        FXSYS_memcpy32(s->block + s->blkused, q, len);\n        s->blkused += len;\n    } else {\n        while (s->blkused + len >= 64) {\n            FXSYS_memcpy32(s->block + s->blkused, q, 64 - s->blkused);\n            q += 64 - s->blkused;\n            len -= 64 - s->blkused;\n            for (i = 0; i < 16; i++) {\n                wordblock[i] =\n                    (((unsigned int) s->block[i * 4 + 0]) << 24) |\n                    (((unsigned int) s->block[i * 4 + 1]) << 16) |\n                    (((unsigned int) s->block[i * 4 + 2]) << 8) |\n                    (((unsigned int) s->block[i * 4 + 3]) << 0);\n            }\n            SHATransform(s->h, wordblock);\n            s->blkused = 0;\n        }\n        FXSYS_memcpy32(s->block, q, len);\n        s->blkused = len;\n    }\n}\nvoid CRYPT_SHA1Finish(FX_LPVOID context, FX_BYTE digest[20])\n{\n    SHA_State * s = (SHA_State*)context;\n    int i;\n    int pad;\n    unsigned char c[64];\n    unsigned int lenhi, lenlo;\n    if (s->blkused >= 56) {\n        pad = 56 + 64 - s->blkused;\n    } else {\n        pad = 56 - s->blkused;\n    }\n    lenhi = (s->lenhi << 3) | (s->lenlo >> (32 - 3));\n    lenlo = (s->lenlo << 3);\n    FXSYS_memset32(c, 0, pad);\n    c[0] = 0x80;\n    CRYPT_SHA1Update(s, c, pad);\n    c[0] = (lenhi >> 24) & 0xFF;\n    c[1] = (lenhi >> 16) & 0xFF;\n    c[2] = (lenhi >> 8) & 0xFF;\n    c[3] = (lenhi >> 0) & 0xFF;\n    c[4] = (lenlo >> 24) & 0xFF;\n    c[5] = (lenlo >> 16) & 0xFF;\n    c[6] = (lenlo >> 8) & 0xFF;\n    c[7] = (lenlo >> 0) & 0xFF;\n    CRYPT_SHA1Update(s, c, 8);\n    for (i = 0; i < 5; i++) {\n        digest[i * 4] = (s->h[i] >> 24) & 0xFF;\n        digest[i * 4 + 1] = (s->h[i] >> 16) & 0xFF;\n        digest[i * 4 + 2] = (s->h[i] >> 8) & 0xFF;\n        digest[i * 4 + 3] = (s->h[i]) & 0xFF;\n    }\n}\nvoid CRYPT_SHA1Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[20])\n{\n    SHA_State s;\n    CRYPT_SHA1Start(&s);\n    CRYPT_SHA1Update(&s, data, size);\n    CRYPT_SHA1Finish(&s, digest);\n}\ntypedef struct {\n    FX_DWORD total[2];\n    FX_DWORD state[8];\n    FX_BYTE buffer[64];\n}\nsha256_context;\n#define GET_FX_DWORD(n,b,i)                       \\\n    {                                               \\\n        (n) = ( (FX_DWORD) (b)[(i)    ] << 24 )       \\\n              | ( (FX_DWORD) (b)[(i) + 1] << 16 )       \\\n              | ( (FX_DWORD) (b)[(i) + 2] <<  8 )       \\\n              | ( (FX_DWORD) (b)[(i) + 3]       );      \\\n    }\n#define PUT_FX_DWORD(n,b,i)                       \\\n    {                                               \\\n        (b)[(i)    ] = (FX_BYTE) ( (n) >> 24 );       \\\n        (b)[(i) + 1] = (FX_BYTE) ( (n) >> 16 );       \\\n        (b)[(i) + 2] = (FX_BYTE) ( (n) >>  8 );       \\\n        (b)[(i) + 3] = (FX_BYTE) ( (n)       );       \\\n    }\nvoid CRYPT_SHA256Start( FX_LPVOID context )\n{\n    sha256_context *ctx = (sha256_context *)context;\n    ctx->total[0] = 0;\n    ctx->total[1] = 0;\n    ctx->state[0] = 0x6A09E667;\n    ctx->state[1] = 0xBB67AE85;\n    ctx->state[2] = 0x3C6EF372;\n    ctx->state[3] = 0xA54FF53A;\n    ctx->state[4] = 0x510E527F;\n    ctx->state[5] = 0x9B05688C;\n    ctx->state[6] = 0x1F83D9AB;\n    ctx->state[7] = 0x5BE0CD19;\n}\nstatic void sha256_process( sha256_context *ctx, const FX_BYTE data[64] )\n{\n    FX_DWORD temp1, temp2, W[64];\n    FX_DWORD A, B, C, D, E, F, G, H;\n    GET_FX_DWORD( W[0],  data,  0 );\n    GET_FX_DWORD( W[1],  data,  4 );\n    GET_FX_DWORD( W[2],  data,  8 );\n    GET_FX_DWORD( W[3],  data, 12 );\n    GET_FX_DWORD( W[4],  data, 16 );\n    GET_FX_DWORD( W[5],  data, 20 );\n    GET_FX_DWORD( W[6],  data, 24 );\n    GET_FX_DWORD( W[7],  data, 28 );\n    GET_FX_DWORD( W[8],  data, 32 );\n    GET_FX_DWORD( W[9],  data, 36 );\n    GET_FX_DWORD( W[10], data, 40 );\n    GET_FX_DWORD( W[11], data, 44 );\n    GET_FX_DWORD( W[12], data, 48 );\n    GET_FX_DWORD( W[13], data, 52 );\n    GET_FX_DWORD( W[14], data, 56 );\n    GET_FX_DWORD( W[15], data, 60 );\n#define  SHR(x,n) ((x & 0xFFFFFFFF) >> n)\n#define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))\n#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^  SHR(x, 3))\n#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^  SHR(x,10))\n#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))\n#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))\n#define F0(x,y,z) ((x & y) | (z & (x | y)))\n#define F1(x,y,z) (z ^ (x & (y ^ z)))\n#define R(t)                                    \\\n    (                                               \\\n            W[t] = S1(W[t -  2]) + W[t -  7] +          \\\n                   S0(W[t - 15]) + W[t - 16]            \\\n    )\n#define P(a,b,c,d,e,f,g,h,x,K)                  \\\n    {                                               \\\n        temp1 = h + S3(e) + F1(e,f,g) + K + x;      \\\n        temp2 = S2(a) + F0(a,b,c);                  \\\n        d += temp1; h = temp1 + temp2;              \\\n    }\n    A = ctx->state[0];\n    B = ctx->state[1];\n    C = ctx->state[2];\n    D = ctx->state[3];\n    E = ctx->state[4];\n    F = ctx->state[5];\n    G = ctx->state[6];\n    H = ctx->state[7];\n    P( A, B, C, D, E, F, G, H, W[ 0], 0x428A2F98 );\n    P( H, A, B, C, D, E, F, G, W[ 1], 0x71374491 );\n    P( G, H, A, B, C, D, E, F, W[ 2], 0xB5C0FBCF );\n    P( F, G, H, A, B, C, D, E, W[ 3], 0xE9B5DBA5 );\n    P( E, F, G, H, A, B, C, D, W[ 4], 0x3956C25B );\n    P( D, E, F, G, H, A, B, C, W[ 5], 0x59F111F1 );\n    P( C, D, E, F, G, H, A, B, W[ 6], 0x923F82A4 );\n    P( B, C, D, E, F, G, H, A, W[ 7], 0xAB1C5ED5 );\n    P( A, B, C, D, E, F, G, H, W[ 8], 0xD807AA98 );\n    P( H, A, B, C, D, E, F, G, W[ 9], 0x12835B01 );\n    P( G, H, A, B, C, D, E, F, W[10], 0x243185BE );\n    P( F, G, H, A, B, C, D, E, W[11], 0x550C7DC3 );\n    P( E, F, G, H, A, B, C, D, W[12], 0x72BE5D74 );\n    P( D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE );\n    P( C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7 );\n    P( B, C, D, E, F, G, H, A, W[15], 0xC19BF174 );\n    P( A, B, C, D, E, F, G, H, R(16), 0xE49B69C1 );\n    P( H, A, B, C, D, E, F, G, R(17), 0xEFBE4786 );\n    P( G, H, A, B, C, D, E, F, R(18), 0x0FC19DC6 );\n    P( F, G, H, A, B, C, D, E, R(19), 0x240CA1CC );\n    P( E, F, G, H, A, B, C, D, R(20), 0x2DE92C6F );\n    P( D, E, F, G, H, A, B, C, R(21), 0x4A7484AA );\n    P( C, D, E, F, G, H, A, B, R(22), 0x5CB0A9DC );\n    P( B, C, D, E, F, G, H, A, R(23), 0x76F988DA );\n    P( A, B, C, D, E, F, G, H, R(24), 0x983E5152 );\n    P( H, A, B, C, D, E, F, G, R(25), 0xA831C66D );\n    P( G, H, A, B, C, D, E, F, R(26), 0xB00327C8 );\n    P( F, G, H, A, B, C, D, E, R(27), 0xBF597FC7 );\n    P( E, F, G, H, A, B, C, D, R(28), 0xC6E00BF3 );\n    P( D, E, F, G, H, A, B, C, R(29), 0xD5A79147 );\n    P( C, D, E, F, G, H, A, B, R(30), 0x06CA6351 );\n    P( B, C, D, E, F, G, H, A, R(31), 0x14292967 );\n    P( A, B, C, D, E, F, G, H, R(32), 0x27B70A85 );\n    P( H, A, B, C, D, E, F, G, R(33), 0x2E1B2138 );\n    P( G, H, A, B, C, D, E, F, R(34), 0x4D2C6DFC );\n    P( F, G, H, A, B, C, D, E, R(35), 0x53380D13 );\n    P( E, F, G, H, A, B, C, D, R(36), 0x650A7354 );\n    P( D, E, F, G, H, A, B, C, R(37), 0x766A0ABB );\n    P( C, D, E, F, G, H, A, B, R(38), 0x81C2C92E );\n    P( B, C, D, E, F, G, H, A, R(39), 0x92722C85 );\n    P( A, B, C, D, E, F, G, H, R(40), 0xA2BFE8A1 );\n    P( H, A, B, C, D, E, F, G, R(41), 0xA81A664B );\n    P( G, H, A, B, C, D, E, F, R(42), 0xC24B8B70 );\n    P( F, G, H, A, B, C, D, E, R(43), 0xC76C51A3 );\n    P( E, F, G, H, A, B, C, D, R(44), 0xD192E819 );\n    P( D, E, F, G, H, A, B, C, R(45), 0xD6990624 );\n    P( C, D, E, F, G, H, A, B, R(46), 0xF40E3585 );\n    P( B, C, D, E, F, G, H, A, R(47), 0x106AA070 );\n    P( A, B, C, D, E, F, G, H, R(48), 0x19A4C116 );\n    P( H, A, B, C, D, E, F, G, R(49), 0x1E376C08 );\n    P( G, H, A, B, C, D, E, F, R(50), 0x2748774C );\n    P( F, G, H, A, B, C, D, E, R(51), 0x34B0BCB5 );\n    P( E, F, G, H, A, B, C, D, R(52), 0x391C0CB3 );\n    P( D, E, F, G, H, A, B, C, R(53), 0x4ED8AA4A );\n    P( C, D, E, F, G, H, A, B, R(54), 0x5B9CCA4F );\n    P( B, C, D, E, F, G, H, A, R(55), 0x682E6FF3 );\n    P( A, B, C, D, E, F, G, H, R(56), 0x748F82EE );\n    P( H, A, B, C, D, E, F, G, R(57), 0x78A5636F );\n    P( G, H, A, B, C, D, E, F, R(58), 0x84C87814 );\n    P( F, G, H, A, B, C, D, E, R(59), 0x8CC70208 );\n    P( E, F, G, H, A, B, C, D, R(60), 0x90BEFFFA );\n    P( D, E, F, G, H, A, B, C, R(61), 0xA4506CEB );\n    P( C, D, E, F, G, H, A, B, R(62), 0xBEF9A3F7 );\n    P( B, C, D, E, F, G, H, A, R(63), 0xC67178F2 );\n    ctx->state[0] += A;\n    ctx->state[1] += B;\n    ctx->state[2] += C;\n    ctx->state[3] += D;\n    ctx->state[4] += E;\n    ctx->state[5] += F;\n    ctx->state[6] += G;\n    ctx->state[7] += H;\n}\nvoid CRYPT_SHA256Update( void* context, FX_LPCBYTE input, FX_DWORD length )\n{\n    sha256_context *ctx = (sha256_context *)context;\n    FX_DWORD left, fill;\n    if( ! length ) {\n        return;\n    }\n    left = ctx->total[0] & 0x3F;\n    fill = 64 - left;\n    ctx->total[0] += length;\n    ctx->total[0] &= 0xFFFFFFFF;\n    if( ctx->total[0] < length ) {\n        ctx->total[1]++;\n    }\n    if( left && length >= fill ) {\n        FXSYS_memcpy32( (void *) (ctx->buffer + left),\n                        (void *) input, fill );\n        sha256_process( ctx, ctx->buffer );\n        length -= fill;\n        input  += fill;\n        left = 0;\n    }\n    while( length >= 64 ) {\n        sha256_process( ctx, input );\n        length -= 64;\n        input  += 64;\n    }\n    if( length ) {\n        FXSYS_memcpy32( (void *) (ctx->buffer + left),\n                        (void *) input, length );\n    }\n}\nstatic const FX_BYTE sha256_padding[64] = {\n    0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n};\nvoid CRYPT_SHA256Finish( FX_LPVOID context, FX_BYTE digest[32] )\n{\n    sha256_context *ctx = (sha256_context *)context;\n    FX_DWORD last, padn;\n    FX_DWORD high, low;\n    FX_BYTE msglen[8];\n    high = ( ctx->total[0] >> 29 )\n           | ( ctx->total[1] <<  3 );\n    low  = ( ctx->total[0] <<  3 );\n    PUT_FX_DWORD( high, msglen, 0 );\n    PUT_FX_DWORD( low,  msglen, 4 );\n    last = ctx->total[0] & 0x3F;\n    padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );\n    CRYPT_SHA256Update( ctx, sha256_padding, padn );\n    CRYPT_SHA256Update( ctx, msglen, 8 );\n    PUT_FX_DWORD( ctx->state[0], digest,  0 );\n    PUT_FX_DWORD( ctx->state[1], digest,  4 );\n    PUT_FX_DWORD( ctx->state[2], digest,  8 );\n    PUT_FX_DWORD( ctx->state[3], digest, 12 );\n    PUT_FX_DWORD( ctx->state[4], digest, 16 );\n    PUT_FX_DWORD( ctx->state[5], digest, 20 );\n    PUT_FX_DWORD( ctx->state[6], digest, 24 );\n    PUT_FX_DWORD( ctx->state[7], digest, 28 );\n}\nvoid CRYPT_SHA256Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[32])\n{\n    sha256_context ctx;\n    CRYPT_SHA256Start(&ctx);\n    CRYPT_SHA256Update(&ctx, data, size);\n    CRYPT_SHA256Finish(&ctx, digest);\n}\ntypedef struct {\n    FX_UINT64\ttotal[2];\n    FX_UINT64\tstate[8];\n    FX_BYTE\t\tbuffer[128];\n} sha384_context;\nFX_UINT64 FX_ato64i(FX_LPCSTR str)\n{\n    FXSYS_assert(str != NULL);\n    FX_UINT64 ret = 0;\n    int len = (int)FXSYS_strlen(str);\n    len = len > 16 ? 16 : len;\n    for (int i = 0; i < len; ++i) {\n        if (i) {\n            ret <<= 4;\n        }\n        if (str[i] >= '0' && str[i] <= '9') {\n            ret |= (str[i] - '0') & 0xFF;\n        } else if (str[i] >= 'a' && str[i] <= 'f') {\n            ret |= (str[i] - 'a' + 10) & 0xFF;\n        } else if (str[i] >= 'A' && str[i] <= 'F') {\n            ret |= (str[i] - 'A' + 10) & 0xFF;\n        } else {\n            FXSYS_assert(FALSE);\n        }\n    }\n    return ret;\n}\nvoid CRYPT_SHA384Start(FX_LPVOID context)\n{\n    if (context == NULL) {\n        return;\n    }\n    sha384_context *ctx = (sha384_context *)context;\n    FXSYS_memset32(ctx, 0, sizeof(sha384_context));\n    ctx->state[0] = FX_ato64i(\"cbbb9d5dc1059ed8\");\n    ctx->state[1] = FX_ato64i(\"629a292a367cd507\");\n    ctx->state[2] = FX_ato64i(\"9159015a3070dd17\");\n    ctx->state[3] = FX_ato64i(\"152fecd8f70e5939\");\n    ctx->state[4] = FX_ato64i(\"67332667ffc00b31\");\n    ctx->state[5] = FX_ato64i(\"8eb44a8768581511\");\n    ctx->state[6] = FX_ato64i(\"db0c2e0d64f98fa7\");\n    ctx->state[7] = FX_ato64i(\"47b5481dbefa4fa4\");\n}\n#define SHA384_F0(x,y,z) ((x & y) | (z & (x | y)))\n#define SHA384_F1(x,y,z) (z ^ (x & (y ^ z)))\n#define SHA384_SHR(x,n) (x >> n)\n#define SHA384_ROTR(x,n) (SHA384_SHR(x, n) | x << (64 - n))\n#define SHA384_S0(x) (SHA384_ROTR(x, 1) ^ SHA384_ROTR(x, 8) ^  SHA384_SHR(x, 7))\n#define SHA384_S1(x) (SHA384_ROTR(x,19) ^ SHA384_ROTR(x, 61) ^  SHA384_SHR(x, 6))\n#define SHA384_S2(x) (SHA384_ROTR(x, 28) ^ SHA384_ROTR(x, 34) ^ SHA384_ROTR(x, 39))\n#define SHA384_S3(x) (SHA384_ROTR(x, 14) ^ SHA384_ROTR(x,18) ^ SHA384_ROTR(x, 41))\n#define SHA384_P(a,b,c,d,e,f,g,h,x,K)\t\t\t\t\t\t\t\\\n    {\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n        temp1 = h + SHA384_S3(e) + SHA384_F1(e,f,g) + K + x;\t\t\\\n        temp2 = SHA384_S2(a) + SHA384_F0(a,b,c);\t\t\t\t\t\\\n        d += temp1; h = temp1 + temp2;\t\t\t\t\t\t\t\t\\\n    }\nstatic const FX_BYTE sha384_padding[128] = {\n    0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n};\n#define SHA384_R(t) (W[t] = SHA384_S1(W[t -  2]) + W[t -  7] + SHA384_S0(W[t - 15]) + W[t - 16])\nstatic FX_LPCSTR constants[] = {\n    \"428a2f98d728ae22\",\n    \"7137449123ef65cd\",\n    \"b5c0fbcfec4d3b2f\",\n    \"e9b5dba58189dbbc\",\n    \"3956c25bf348b538\",\n    \"59f111f1b605d019\",\n    \"923f82a4af194f9b\",\n    \"ab1c5ed5da6d8118\",\n    \"d807aa98a3030242\",\n    \"12835b0145706fbe\",\n    \"243185be4ee4b28c\",\n    \"550c7dc3d5ffb4e2\",\n    \"72be5d74f27b896f\",\n    \"80deb1fe3b1696b1\",\n    \"9bdc06a725c71235\",\n    \"c19bf174cf692694\",\n    \"e49b69c19ef14ad2\",\n    \"efbe4786384f25e3\",\n    \"0fc19dc68b8cd5b5\",\n    \"240ca1cc77ac9c65\",\n    \"2de92c6f592b0275\",\n    \"4a7484aa6ea6e483\",\n    \"5cb0a9dcbd41fbd4\",\n    \"76f988da831153b5\",\n    \"983e5152ee66dfab\",\n    \"a831c66d2db43210\",\n    \"b00327c898fb213f\",\n    \"bf597fc7beef0ee4\",\n    \"c6e00bf33da88fc2\",\n    \"d5a79147930aa725\",\n    \"06ca6351e003826f\",\n    \"142929670a0e6e70\",\n    \"27b70a8546d22ffc\",\n    \"2e1b21385c26c926\",\n    \"4d2c6dfc5ac42aed\",\n    \"53380d139d95b3df\",\n    \"650a73548baf63de\",\n    \"766a0abb3c77b2a8\",\n    \"81c2c92e47edaee6\",\n    \"92722c851482353b\",\n    \"a2bfe8a14cf10364\",\n    \"a81a664bbc423001\",\n    \"c24b8b70d0f89791\",\n    \"c76c51a30654be30\",\n    \"d192e819d6ef5218\",\n    \"d69906245565a910\",\n    \"f40e35855771202a\",\n    \"106aa07032bbd1b8\",\n    \"19a4c116b8d2d0c8\",\n    \"1e376c085141ab53\",\n    \"2748774cdf8eeb99\",\n    \"34b0bcb5e19b48a8\",\n    \"391c0cb3c5c95a63\",\n    \"4ed8aa4ae3418acb\",\n    \"5b9cca4f7763e373\",\n    \"682e6ff3d6b2b8a3\",\n    \"748f82ee5defb2fc\",\n    \"78a5636f43172f60\",\n    \"84c87814a1f0ab72\",\n    \"8cc702081a6439ec\",\n    \"90befffa23631e28\",\n    \"a4506cebde82bde9\",\n    \"bef9a3f7b2c67915\",\n    \"c67178f2e372532b\",\n    \"ca273eceea26619c\",\n    \"d186b8c721c0c207\",\n    \"eada7dd6cde0eb1e\",\n    \"f57d4f7fee6ed178\",\n    \"06f067aa72176fba\",\n    \"0a637dc5a2c898a6\",\n    \"113f9804bef90dae\",\n    \"1b710b35131c471b\",\n    \"28db77f523047d84\",\n    \"32caab7b40c72493\",\n    \"3c9ebe0a15c9bebc\",\n    \"431d67c49c100d4c\",\n    \"4cc5d4becb3e42b6\",\n    \"597f299cfc657e2a\",\n    \"5fcb6fab3ad6faec\",\n    \"6c44198c4a475817\",\n};\n#define GET_FX_64WORD(n,b,i)                       \\\n    {                                               \\\n        (n) = ( (FX_UINT64) (b)[(i)    ] << 56 )       \\\n              | ( (FX_UINT64) (b)[(i) + 1] << 48 )       \\\n              | ( (FX_UINT64) (b)[(i) + 2] << 40 )       \\\n              | ( (FX_UINT64) (b)[(i) + 3] << 32 )      \\\n              | ( (FX_UINT64) (b)[(i) + 4] << 24 )       \\\n              | ( (FX_UINT64) (b)[(i) + 5] << 16 )       \\\n              | ( (FX_UINT64) (b)[(i) + 6] <<  8 )       \\\n              | ( (FX_UINT64) (b)[(i) + 7]       );      \\\n    }\n#define PUT_FX_64DWORD(n,b,i)                       \\\n    {                                               \\\n        (b)[(i)    ] = (FX_BYTE) ( (n) >> 56 );       \\\n        (b)[(i) + 1] = (FX_BYTE) ( (n) >> 48 );       \\\n        (b)[(i) + 2] = (FX_BYTE) ( (n) >> 40 );       \\\n        (b)[(i) + 3] = (FX_BYTE) ( (n) >> 32 );       \\\n        (b)[(i) + 4] = (FX_BYTE) ( (n) >> 24 );       \\\n        (b)[(i) + 5] = (FX_BYTE) ( (n) >> 16 );       \\\n        (b)[(i) + 6] = (FX_BYTE) ( (n) >>  8 );       \\\n        (b)[(i) + 7] = (FX_BYTE) ( (n) );       \\\n    }\nstatic void sha384_process( sha384_context *ctx, const FX_BYTE data[128] )\n{\n    FX_UINT64 temp1, temp2;\n    FX_UINT64 A, B, C, D, E, F, G, H;\n    FX_UINT64 W[80];\n    GET_FX_64WORD(W[0], data, 0);\n    GET_FX_64WORD(W[1], data, 8);\n    GET_FX_64WORD(W[2], data, 16);\n    GET_FX_64WORD(W[3], data, 24);\n    GET_FX_64WORD(W[4], data, 32);\n    GET_FX_64WORD(W[5], data, 40);\n    GET_FX_64WORD(W[6], data, 48);\n    GET_FX_64WORD(W[7], data, 56);\n    GET_FX_64WORD(W[8], data, 64);\n    GET_FX_64WORD(W[9], data, 72);\n    GET_FX_64WORD(W[10], data, 80);\n    GET_FX_64WORD(W[11], data, 88);\n    GET_FX_64WORD(W[12], data, 96);\n    GET_FX_64WORD(W[13], data, 104);\n    GET_FX_64WORD(W[14], data, 112);\n    GET_FX_64WORD(W[15], data, 120);\n    A = ctx->state[0];\n    B = ctx->state[1];\n    C = ctx->state[2];\n    D = ctx->state[3];\n    E = ctx->state[4];\n    F = ctx->state[5];\n    G = ctx->state[6];\n    H = ctx->state[7];\n    for (int i = 0; i < 10; ++i) {\n        FX_UINT64 temp[8];\n        if (i < 2) {\n            temp[0] = W[i * 8];\n            temp[1] = W[i * 8 + 1];\n            temp[2] = W[i * 8 + 2];\n            temp[3] = W[i * 8 + 3];\n            temp[4] = W[i * 8 + 4];\n            temp[5] = W[i * 8 + 5];\n            temp[6] = W[i * 8 + 6];\n            temp[7] = W[i * 8 + 7];\n        } else {\n            temp[0] = SHA384_R(i * 8);\n            temp[1] = SHA384_R(i * 8 + 1);\n            temp[2] = SHA384_R(i * 8 + 2);\n            temp[3] = SHA384_R(i * 8 + 3);\n            temp[4] = SHA384_R(i * 8 + 4);\n            temp[5] = SHA384_R(i * 8 + 5);\n            temp[6] = SHA384_R(i * 8 + 6);\n            temp[7] = SHA384_R(i * 8 + 7);\n        }\n        SHA384_P( A, B, C, D, E, F, G, H, temp[ 0], FX_ato64i(constants[i * 8    ]) );\n        SHA384_P( H, A, B, C, D, E, F, G, temp[ 1], FX_ato64i(constants[i * 8 + 1]) );\n        SHA384_P( G, H, A, B, C, D, E, F, temp[ 2], FX_ato64i(constants[i * 8 + 2]) );\n        SHA384_P( F, G, H, A, B, C, D, E, temp[ 3], FX_ato64i(constants[i * 8 + 3]) );\n        SHA384_P( E, F, G, H, A, B, C, D, temp[ 4], FX_ato64i(constants[i * 8 + 4]) );\n        SHA384_P( D, E, F, G, H, A, B, C, temp[ 5], FX_ato64i(constants[i * 8 + 5]) );\n        SHA384_P( C, D, E, F, G, H, A, B, temp[ 6], FX_ato64i(constants[i * 8 + 6]) );\n        SHA384_P( B, C, D, E, F, G, H, A, temp[ 7], FX_ato64i(constants[i * 8 + 7]) );\n    }\n    ctx->state[0] += A;\n    ctx->state[1] += B;\n    ctx->state[2] += C;\n    ctx->state[3] += D;\n    ctx->state[4] += E;\n    ctx->state[5] += F;\n    ctx->state[6] += G;\n    ctx->state[7] += H;\n}\nvoid CRYPT_SHA384Update(FX_LPVOID context, FX_LPCBYTE input, FX_DWORD length)\n{\n    sha384_context *ctx = (sha384_context *)context;\n    FX_DWORD left, fill;\n    if( ! length ) {\n        return;\n    }\n    left = (FX_DWORD)ctx->total[0] & 0x7F;\n    fill = 128 - left;\n    ctx->total[0] += length;\n    if( ctx->total[0] < length ) {\n        ctx->total[1]++;\n    }\n    if( left && length >= fill ) {\n        FXSYS_memcpy32( (void *) (ctx->buffer + left),\n                        (void *) input, fill );\n        sha384_process( ctx, ctx->buffer );\n        length -= fill;\n        input  += fill;\n        left = 0;\n    }\n    while( length >= 128 ) {\n        sha384_process( ctx, input );\n        length -= 128;\n        input  += 128;\n    }\n    if( length ) {\n        FXSYS_memcpy32( (void *) (ctx->buffer + left),\n                        (void *) input, length );\n    }\n}\nvoid CRYPT_SHA384Finish(FX_LPVOID context, FX_BYTE digest[48])\n{\n    sha384_context *ctx = (sha384_context *)context;\n    FX_DWORD last, padn;\n    FX_BYTE msglen[16];\n    FXSYS_memset32(msglen, 0, 16);\n    FX_UINT64 high, low;\n    high = ( ctx->total[0] >> 29 )\n           | ( ctx->total[1] <<  3 );\n    low  = ( ctx->total[0] <<  3 );\n    PUT_FX_64DWORD( high, msglen, 0 );\n    PUT_FX_64DWORD( low,  msglen, 8 );\n    last = (FX_DWORD)ctx->total[0] & 0x7F;\n    padn = ( last < 112 ) ? ( 112 - last ) : ( 240 - last );\n    CRYPT_SHA384Update( ctx, sha384_padding, padn );\n    CRYPT_SHA384Update( ctx, msglen, 16 );\n    PUT_FX_64DWORD(ctx->state[0], digest, 0);\n    PUT_FX_64DWORD(ctx->state[1], digest, 8);\n    PUT_FX_64DWORD(ctx->state[2], digest, 16);\n    PUT_FX_64DWORD(ctx->state[3], digest, 24);\n    PUT_FX_64DWORD(ctx->state[4], digest, 32);\n    PUT_FX_64DWORD(ctx->state[5], digest, 40);\n}\nvoid CRYPT_SHA384Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[64])\n{\n    sha384_context context;\n    CRYPT_SHA384Start(&context);\n    CRYPT_SHA384Update(&context, data, size);\n    CRYPT_SHA384Finish(&context, digest);\n}\nvoid CRYPT_SHA512Start(FX_LPVOID context)\n{\n    if (context == NULL) {\n        return;\n    }\n    sha384_context *ctx = (sha384_context *)context;\n    FXSYS_memset32(ctx, 0, sizeof(sha384_context));\n    ctx->state[0] = FX_ato64i(\"6a09e667f3bcc908\");\n    ctx->state[1] = FX_ato64i(\"bb67ae8584caa73b\");\n    ctx->state[2] = FX_ato64i(\"3c6ef372fe94f82b\");\n    ctx->state[3] = FX_ato64i(\"a54ff53a5f1d36f1\");\n    ctx->state[4] = FX_ato64i(\"510e527fade682d1\");\n    ctx->state[5] = FX_ato64i(\"9b05688c2b3e6c1f\");\n    ctx->state[6] = FX_ato64i(\"1f83d9abfb41bd6b\");\n    ctx->state[7] = FX_ato64i(\"5be0cd19137e2179\");\n}\nvoid CRYPT_SHA512Update(FX_LPVOID context, FX_LPCBYTE data, FX_DWORD size)\n{\n    CRYPT_SHA384Update(context, data, size);\n}\nvoid CRYPT_SHA512Finish(FX_LPVOID context, FX_BYTE digest[64])\n{\n    sha384_context *ctx = (sha384_context *)context;\n    FX_DWORD last, padn;\n    FX_BYTE msglen[16];\n    FXSYS_memset32(msglen, 0, 16);\n    FX_UINT64 high, low;\n    high = ( ctx->total[0] >> 29 )\n           | ( ctx->total[1] <<  3 );\n    low  = ( ctx->total[0] <<  3 );\n    PUT_FX_64DWORD( high, msglen, 0 );\n    PUT_FX_64DWORD( low,  msglen, 8 );\n    last = (FX_DWORD)ctx->total[0] & 0x7F;\n    padn = ( last < 112 ) ? ( 112 - last ) : ( 240 - last );\n    CRYPT_SHA512Update( ctx, sha384_padding, padn );\n    CRYPT_SHA512Update( ctx, msglen, 16 );\n    PUT_FX_64DWORD(ctx->state[0], digest, 0);\n    PUT_FX_64DWORD(ctx->state[1], digest, 8);\n    PUT_FX_64DWORD(ctx->state[2], digest, 16);\n    PUT_FX_64DWORD(ctx->state[3], digest, 24);\n    PUT_FX_64DWORD(ctx->state[4], digest, 32);\n    PUT_FX_64DWORD(ctx->state[5], digest, 40);\n    PUT_FX_64DWORD(ctx->state[6], digest, 48);\n    PUT_FX_64DWORD(ctx->state[7], digest, 56);\n}\nvoid CRYPT_SHA512Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[64])\n{\n    sha384_context context;\n    CRYPT_SHA512Start(&context);\n    CRYPT_SHA512Update(&context, data, size);\n    CRYPT_SHA512Finish(&context, digest);\n}\n#ifdef __cplusplus\n};\n#endif\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_basic_module.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxcodec/fx_codec.h\"\n#include \"../../include/fpdfapi/fpdf_module.h\"\nstatic CPDF_ModuleMgr*\tg_FPDFAPI_pDefaultMgr = NULL;\nCPDF_ModuleMgr* CPDF_ModuleMgr::Get()\n{\n    return g_FPDFAPI_pDefaultMgr;\n}\nvoid CPDF_ModuleMgr::Create()\n{\n    g_FPDFAPI_pDefaultMgr = FX_NEW CPDF_ModuleMgr;\n    g_FPDFAPI_pDefaultMgr->Initialize();\n}\nvoid CPDF_ModuleMgr::Destroy()\n{\n    if (g_FPDFAPI_pDefaultMgr) {\n        delete g_FPDFAPI_pDefaultMgr;\n    }\n    g_FPDFAPI_pDefaultMgr = NULL;\n}\nCPDF_ModuleMgr::CPDF_ModuleMgr()\n{\n    m_pCodecModule = NULL;\n    m_pPageModule = NULL;\n    m_pRenderModule = NULL;\n    m_FileBufSize = 512;\n}\nvoid CPDF_ModuleMgr::Initialize()\n{\n    InitModules();\n    m_FileBufSize = 512;\n}\nvoid CPDF_ModuleMgr::InitModules()\n{\n    m_pCodecModule = NULL;\n    m_pPageModule = FX_NEW CPDF_PageModuleDef;\n    m_pRenderModule = FX_NEW CPDF_RenderModuleDef;\n}\nCPDF_ModuleMgr::~CPDF_ModuleMgr()\n{\n    if (m_pPageModule) {\n        delete m_pPageModule;\n    }\n    if (m_pRenderModule) {\n        delete m_pRenderModule;\n    }\n}\nvoid CPDF_ModuleMgr::SetDownloadCallback(FX_BOOL (*callback)(FX_LPCSTR module_name))\n{\n    m_pDownloadCallback = callback;\n}\nFX_BOOL CPDF_ModuleMgr::DownloadModule(FX_LPCSTR module_name)\n{\n    if (m_pDownloadCallback == NULL) {\n        return FALSE;\n    }\n    return m_pDownloadCallback(module_name);\n}\nstatic CFX_ByteString _GetPath(const CFX_ByteString& folder, FX_LPCSTR name)\n{\n    FX_STRSIZE folder_len = folder.GetLength();\n#if _FX_OS_ == _FX_SYMBIAN_ || _FXM_PLATFORM_  == _FXM_PLATFORM_WINDOWS_\n    if (folder[folder_len - 1] == '\\\\') {\n        return folder + name;\n    } else {\n        return (folder + \"\\\\\") + name;\n    }\n#else\n    if (folder[folder_len - 1] == '/') {\n        return folder + name;\n    } else {\n        return (folder + \"/\") + name;\n    }\n#endif\n}\nvoid CPDF_ModuleMgr::SetModulePath(FX_LPCSTR module_name, FX_LPCSTR path)\n{\n    if (module_name == NULL || module_name[0] == 0) {\n        m_DefaultModulePath = path;\n    } else {\n        m_ModulePathList.SetAt(module_name, FX_NEW CFX_ByteString(path, -1));\n    }\n}\nCFX_ByteString CPDF_ModuleMgr::GetModuleFilePath(FX_LPCSTR module_name, FX_LPCSTR name)\n{\n    CFX_ByteString* pPath = NULL;\n    if (m_ModulePathList.Lookup(module_name, (FX_LPVOID&)pPath)) {\n        return _GetPath(*pPath, name);\n    }\n    if (!m_DefaultModulePath.IsEmpty()) {\n        return _GetPath(m_DefaultModulePath, name);\n    }\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_WINDOWS_\n    FX_WCHAR app_path[260];\n    ::GetModuleFileNameW(NULL, (LPWSTR)app_path, 260);\n    FX_INTPTR len = FXSYS_wcslen(app_path);\n    for (FX_INTPTR i = len; i >= 0; i --)\n        if (app_path[i] == '\\\\') {\n            app_path[i] = 0;\n            break;\n        }\n    CFX_ByteString path = CFX_ByteString::FromUnicode(app_path);\n    path += '\\\\';\n    path += name;\n    return path;\n#else\n    return name;\n#endif\n}\nvoid CPDF_ModuleMgr::NotifyModuleAvailable(FX_LPCSTR module_name)\n{\n    if (FXSYS_strcmp(module_name, ADDIN_NAME_CJK) == 0) {\n        m_pPageModule->NotifyCJKAvailable();\n    } else if (FXSYS_strcmp(module_name, ADDIN_NAME_DECODER) == 0) {\n        m_pRenderModule->NotifyDecoderAvailable();\n    }\n}\nvoid CPDF_ModuleMgr::RegisterSecurityHandler(FX_LPCSTR filter, CPDF_SecurityHandler * (*CreateHandler)(void* param), void* param)\n{\n    if (CreateHandler == NULL) {\n        m_SecurityHandlerMap.RemoveKey(filter);\n    } else {\n        m_SecurityHandlerMap.SetAt(filter, (void*)CreateHandler);\n    }\n    if (param) {\n        m_SecurityHandlerMap.SetAt(FX_BSTRC(\"_param_\") + filter, param);\n    }\n}\nvoid CPDF_ModuleMgr::SetPrivateData(FX_LPVOID module_id, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback)\n{\n    m_privateData.SetPrivateData(module_id, pData, callback);\n}\nFX_LPVOID CPDF_ModuleMgr::GetPrivateData(FX_LPVOID module_id)\n{\n    return m_privateData.GetPrivateData(module_id);\n}\nCPDF_SecurityHandler* CPDF_ModuleMgr::CreateSecurityHandler(FX_LPCSTR filter)\n{\n    CPDF_SecurityHandler* (*CreateHandler)(void*) = NULL;\n    if (!m_SecurityHandlerMap.Lookup(filter, (void*&)CreateHandler)) {\n        return NULL;\n    }\n    if (CreateHandler == NULL) {\n        return NULL;\n    }\n    void* param = NULL;\n    m_SecurityHandlerMap.Lookup(FX_BSTRC(\"_param_\") + filter, param);\n    return CreateHandler(param);\n}\nICodec_FaxModule* CPDF_ModuleMgr::GetFaxModule()\n{\n    return m_pCodecModule ? m_pCodecModule->GetFaxModule() : NULL;\n}\nICodec_JpegModule* CPDF_ModuleMgr::GetJpegModule()\n{\n    return m_pCodecModule ? m_pCodecModule->GetJpegModule() : NULL;\n}\nICodec_JpxModule* CPDF_ModuleMgr::GetJpxModule()\n{\n    return m_pCodecModule ? m_pCodecModule->GetJpxModule() : NULL;\n}\nICodec_Jbig2Module* CPDF_ModuleMgr::GetJbig2Module()\n{\n    return m_pCodecModule ? m_pCodecModule->GetJbig2Module() : NULL;\n}\nICodec_IccModule* CPDF_ModuleMgr::GetIccModule()\n{\n    return m_pCodecModule ? m_pCodecModule->GetIccModule() : NULL;\n}\nICodec_FlateModule* CPDF_ModuleMgr::GetFlateModule()\n{\n    return m_pCodecModule ? m_pCodecModule->GetFlateModule() : NULL;\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/CNS1/Adobe-CNS1-UCS2_5.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_CNS1CID2Unicode_5[19088] = {\n    0xFFFD, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026,\n    0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E,\n    0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036,\n    0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E,\n    0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046,\n    0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E,\n    0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,\n    0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E,\n    0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066,\n    0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E,\n    0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076,\n    0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E,\n    0x00A9, 0x2122, 0x2026, 0x3000, 0xFF0C, 0x3001, 0x3002, 0xFF0E,\n    0x2027, 0xFF1B, 0xFF1A, 0xFF1F, 0xFF01, 0xFE30, 0x22EF, 0x2025,\n    0xFE50, 0xFE51, 0xFE52, 0x00B7, 0xFE54, 0xFE55, 0xFE56, 0xFE57,\n    0xFF5C, 0x2013, 0xFE31, 0x2014, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,\n    0xFF08, 0xFF09, 0xFE35, 0xFE36, 0xFF5B, 0xFF5D, 0xFE37, 0xFE38,\n    0x3014, 0x3015, 0xFE39, 0xFE3A, 0x3010, 0x3011, 0xFE3B, 0xFE3C,\n    0x300A, 0x300B, 0xFE3D, 0xFE3E, 0x3008, 0x3009, 0xFE3F, 0xFE40,\n    0x300C, 0x300D, 0xFE41, 0xFE42, 0x300E, 0x300F, 0xFE43, 0xFE44,\n    0xFE59, 0xFE5A, 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0x2018, 0x2019,\n    0x201C, 0x201D, 0x301D, 0x301E, 0x2035, 0x2032, 0xFF03, 0xFF06,\n    0xFF0A, 0x203B, 0x00A7, 0x3003, 0x25CB, 0x25CF, 0x25B3, 0x25B2,\n    0x25CE, 0x2606, 0x2605, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25BD,\n    0x25BC, 0x32A3, 0x2105, 0x203E, 0xFFE3, 0xFF3F, 0x02CD, 0xFE49,\n    0xFE4A, 0xFE4D, 0xFE4E, 0xFE4B, 0xFE4C, 0xFE5F, 0xFE60, 0xFE61,\n    0xFF0B, 0xFF0D, 0x00D7, 0x00F7, 0x00B1, 0x221A, 0xFF1C, 0xFF1E,\n    0xFF1D, 0x2266, 0x2267, 0x2260, 0x221E, 0x2252, 0x2261, 0xFE62,\n    0xFE63, 0xFE64, 0xFE65, 0xFE66, 0x223C, 0x2229, 0x222A, 0x22A5,\n    0x2220, 0x221F, 0x22BF, 0x33D2, 0x33D1, 0x222B, 0x222E, 0x2235,\n    0x2234, 0x2640, 0x2642, 0x2295, 0x2609, 0x2191, 0x2193, 0x2192,\n    0x2190, 0x2196, 0x2197, 0x2199, 0x2198, 0x2225, 0x2223, 0xFF0F,\n    0xFF3C, 0xFF0F, 0xFF3C, 0xFF04, 0x00A5, 0x3012, 0x00A2, 0x00A3,\n    0xFF05, 0xFF20, 0x2103, 0x2109, 0xFE69, 0xFE6A, 0xFE6B, 0x33D5,\n    0x339C, 0x339D, 0x339E, 0x33CE, 0x33A1, 0x338E, 0x338F, 0x33C4,\n    0x00B0, 0x5159, 0x515B, 0x515E, 0x515D, 0x5161, 0x5163, 0x55E7,\n    0x74E9, 0x7CCE, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586,\n    0x2587, 0x2588, 0x258F, 0x258E, 0x258D, 0x258C, 0x258B, 0x258A,\n    0x2589, 0x253C, 0x2534, 0x252C, 0x2524, 0x251C, 0x2594, 0x2500,\n    0x2502, 0x2595, 0x250C, 0x2510, 0x2514, 0x2518, 0x256D, 0x256E,\n    0x2570, 0x256F, 0x2550, 0x255E, 0x256A, 0x2561, 0x25E2, 0x25E3,\n    0x25E5, 0x25E4, 0x2571, 0x2572, 0x2573, 0xFF10, 0xFF11, 0xFF12,\n    0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0x2160,\n    0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168,\n    0x2169, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027,\n    0x3028, 0x3029, 0x3038, 0x5344, 0x303A, 0xFF21, 0xFF22, 0xFF23,\n    0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B,\n    0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33,\n    0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0xFF41,\n    0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49,\n    0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51,\n    0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59,\n    0xFF5A, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,\n    0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,\n    0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8,\n    0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7,\n    0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,\n    0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8,\n    0x03C9, 0x3105, 0x3106, 0x3107, 0x3108, 0x3109, 0x310A, 0x310B,\n    0x310C, 0x310D, 0x310E, 0x310F, 0x3110, 0x3111, 0x3112, 0x3113,\n    0x3114, 0x3115, 0x3116, 0x3117, 0x3118, 0x3119, 0x311A, 0x311B,\n    0x311C, 0x311D, 0x311E, 0x311F, 0x3120, 0x3121, 0x3122, 0x3123,\n    0x3124, 0x3125, 0x3126, 0x3127, 0x3128, 0x3129, 0x02D9, 0x02CA,\n    0x02C7, 0x02CB, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465,\n    0x2466, 0x2467, 0x2468, 0x2469, 0x2474, 0x2475, 0x2476, 0x2477,\n    0x2478, 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, 0x2170, 0x2171,\n    0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179,\n    0x4E28, 0x4E36, 0x4E3F, 0x4E85, 0x4EA0, 0x5182, 0x5196, 0x51AB,\n    0x52F9, 0x5338, 0x5369, 0x53B6, 0x5902, 0x5B80, 0x5DDB, 0x5E7A,\n    0x5E7F, 0x5EF4, 0x5F50, 0x5F61, 0x6534, 0x65E0, 0x7592, 0x7676,\n    0x8FB5, 0x96B6, 0x2400, 0x2401, 0x2402, 0x2403, 0x2404, 0x2405,\n    0x2406, 0x2407, 0x2408, 0x2409, 0x240A, 0x240B, 0x240C, 0x240D,\n    0x240E, 0x240F, 0x2410, 0x2411, 0x2412, 0x2413, 0x2414, 0x2415,\n    0x2416, 0x2417, 0x2418, 0x2419, 0x241A, 0x241B, 0x241C, 0x241D,\n    0x241E, 0x241F, 0x2421, 0x4E00, 0x4E59, 0x4E01, 0x4E03, 0x4E43,\n    0x4E5D, 0x4E86, 0x4E8C, 0x4EBA, 0x513F, 0x5165, 0x516B, 0x51E0,\n    0x5200, 0x5201, 0x529B, 0x5315, 0x5341, 0x535C, 0x53C8, 0x4E09,\n    0x4E0B, 0x4E08, 0x4E0A, 0x4E2B, 0x4E38, 0x51E1, 0x4E45, 0x4E48,\n    0x4E5F, 0x4E5E, 0x4E8E, 0x4EA1, 0x5140, 0x5203, 0x52FA, 0x5343,\n    0x53C9, 0x53E3, 0x571F, 0x58EB, 0x5915, 0x5927, 0x5973, 0x5B50,\n    0x5B51, 0x5B53, 0x5BF8, 0x5C0F, 0x5C22, 0x5C38, 0x5C71, 0x5DDD,\n    0x5DE5, 0x5DF1, 0x5DF2, 0x5DF3, 0x5DFE, 0x5E72, 0x5EFE, 0x5F0B,\n    0x5F13, 0x624D, 0x4E11, 0x4E10, 0x4E0D, 0x4E2D, 0x4E30, 0x4E39,\n    0x4E4B, 0x5C39, 0x4E88, 0x4E91, 0x4E95, 0x4E92, 0x4E94, 0x4EA2,\n    0x4EC1, 0x4EC0, 0x4EC3, 0x4EC6, 0x4EC7, 0x4ECD, 0x4ECA, 0x4ECB,\n    0x4EC4, 0x5143, 0x5141, 0x5167, 0x516D, 0x516E, 0x516C, 0x5197,\n    0x51F6, 0x5206, 0x5207, 0x5208, 0x52FB, 0x52FE, 0x52FF, 0x5316,\n    0x5339, 0x5348, 0x5347, 0x5345, 0x535E, 0x5384, 0x53CB, 0x53CA,\n    0x53CD, 0x58EC, 0x5929, 0x592B, 0x592A, 0x592D, 0x5B54, 0x5C11,\n    0x5C24, 0x5C3A, 0x5C6F, 0x5DF4, 0x5E7B, 0x5EFF, 0x5F14, 0x5F15,\n    0x5FC3, 0x6208, 0x6236, 0x624B, 0x624E, 0x652F, 0x6587, 0x6597,\n    0x65A4, 0x65B9, 0x65E5, 0x66F0, 0x6708, 0x6728, 0x6B20, 0x6B62,\n    0x6B79, 0x6BCB, 0x6BD4, 0x6BDB, 0x6C0F, 0x6C34, 0x706B, 0x722A,\n    0x7236, 0x723B, 0x7247, 0x7259, 0x725B, 0x72AC, 0x738B, 0x4E19,\n    0x4E16, 0x4E15, 0x4E14, 0x4E18, 0x4E3B, 0x4E4D, 0x4E4F, 0x4E4E,\n    0x4EE5, 0x4ED8, 0x4ED4, 0x4ED5, 0x4ED6, 0x4ED7, 0x4EE3, 0x4EE4,\n    0x4ED9, 0x4EDE, 0x5145, 0x5144, 0x5189, 0x518A, 0x51AC, 0x51F9,\n    0x51FA, 0x51F8, 0x520A, 0x52A0, 0x529F, 0x5305, 0x5306, 0x5317,\n    0x531D, 0x4EDF, 0x534A, 0x5349, 0x5361, 0x5360, 0x536F, 0x536E,\n    0x53BB, 0x53EF, 0x53E4, 0x53F3, 0x53EC, 0x53EE, 0x53E9, 0x53E8,\n    0x53FC, 0x53F8, 0x53F5, 0x53EB, 0x53E6, 0x53EA, 0x53F2, 0x53F1,\n    0x53F0, 0x53E5, 0x53ED, 0x53FB, 0x56DB, 0x56DA, 0x5916, 0x592E,\n    0x5931, 0x5974, 0x5976, 0x5B55, 0x5B83, 0x5C3C, 0x5DE8, 0x5DE7,\n    0x5DE6, 0x5E02, 0x5E03, 0x5E73, 0x5E7C, 0x5F01, 0x5F18, 0x5F17,\n    0x5FC5, 0x620A, 0x6253, 0x6254, 0x6252, 0x6251, 0x65A5, 0x65E6,\n    0x672E, 0x672C, 0x672A, 0x672B, 0x672D, 0x6B63, 0x6BCD, 0x6C11,\n    0x6C10, 0x6C38, 0x6C41, 0x6C40, 0x6C3E, 0x72AF, 0x7384, 0x7389,\n    0x74DC, 0x74E6, 0x7518, 0x751F, 0x7528, 0x7529, 0x7530, 0x7531,\n    0x7532, 0x7533, 0x758B, 0x767D, 0x76AE, 0x76BF, 0x76EE, 0x77DB,\n    0x77E2, 0x77F3, 0x793A, 0x79BE, 0x7A74, 0x7ACB, 0x4E1E, 0x4E1F,\n    0x4E52, 0x4E53, 0x4E69, 0x4E99, 0x4EA4, 0x4EA6, 0x4EA5, 0x4EFF,\n    0x4F09, 0x4F19, 0x4F0A, 0x4F15, 0x4F0D, 0x4F10, 0x4F11, 0x4F0F,\n    0x4EF2, 0x4EF6, 0x4EFB, 0x4EF0, 0x4EF3, 0x4EFD, 0x4F01, 0x4F0B,\n    0x5149, 0x5147, 0x5146, 0x5148, 0x5168, 0x5171, 0x518D, 0x51B0,\n    0x5217, 0x5211, 0x5212, 0x520E, 0x5216, 0x52A3, 0x5308, 0x5321,\n    0x5320, 0x5370, 0x5371, 0x5409, 0x540F, 0x540C, 0x540A, 0x5410,\n    0x5401, 0x540B, 0x5404, 0x5411, 0x540D, 0x5408, 0x5403, 0x540E,\n    0x5406, 0x5412, 0x56E0, 0x56DE, 0x56DD, 0x5733, 0x5730, 0x5728,\n    0x572D, 0x572C, 0x572F, 0x5729, 0x5919, 0x591A, 0x5937, 0x5938,\n    0x5984, 0x5978, 0x5983, 0x597D, 0x5979, 0x5982, 0x5981, 0x5B57,\n    0x5B58, 0x5B87, 0x5B88, 0x5B85, 0x5B89, 0x5BFA, 0x5C16, 0x5C79,\n    0x5DDE, 0x5E06, 0x5E76, 0x5E74, 0x5F0F, 0x5F1B, 0x5FD9, 0x5FD6,\n    0x620E, 0x620C, 0x620D, 0x6210, 0x6263, 0x625B, 0x6258, 0x6536,\n    0x65E9, 0x65E8, 0x65EC, 0x65ED, 0x66F2, 0x66F3, 0x6709, 0x673D,\n    0x6734, 0x6731, 0x6735, 0x6B21, 0x6B64, 0x6B7B, 0x6C16, 0x6C5D,\n    0x6C57, 0x6C59, 0x6C5F, 0x6C60, 0x6C50, 0x6C55, 0x6C61, 0x6C5B,\n    0x6C4D, 0x6C4E, 0x7070, 0x725F, 0x725D, 0x767E, 0x7AF9, 0x7C73,\n    0x7CF8, 0x7F36, 0x7F8A, 0x7FBD, 0x8001, 0x8003, 0x800C, 0x8012,\n    0x8033, 0x807F, 0x8089, 0x808B, 0x808C, 0x81E3, 0x81EA, 0x81F3,\n    0x81FC, 0x820C, 0x821B, 0x821F, 0x826E, 0x8272, 0x827E, 0x866B,\n    0x8840, 0x884C, 0x8863, 0x897F, 0x9621, 0x4E32, 0x4EA8, 0x4F4D,\n    0x4F4F, 0x4F47, 0x4F57, 0x4F5E, 0x4F34, 0x4F5B, 0x4F55, 0x4F30,\n    0x4F50, 0x4F51, 0x4F3D, 0x4F3A, 0x4F38, 0x4F43, 0x4F54, 0x4F3C,\n    0x4F46, 0x4F63, 0x4F5C, 0x4F60, 0x4F2F, 0x4F4E, 0x4F36, 0x4F59,\n    0x4F5D, 0x4F48, 0x4F5A, 0x514C, 0x514B, 0x514D, 0x5175, 0x51B6,\n    0x51B7, 0x5225, 0x5224, 0x5229, 0x522A, 0x5228, 0x52AB, 0x52A9,\n    0x52AA, 0x52AC, 0x5323, 0x5373, 0x5375, 0x541D, 0x542D, 0x541E,\n    0x543E, 0x5426, 0x544E, 0x5427, 0x5446, 0x5443, 0x5433, 0x5448,\n    0x5442, 0x541B, 0x5429, 0x544A, 0x5439, 0x543B, 0x5438, 0x542E,\n    0x5435, 0x5436, 0x5420, 0x543C, 0x5440, 0x5431, 0x542B, 0x541F,\n    0x542C, 0x56EA, 0x56F0, 0x56E4, 0x56EB, 0x574A, 0x5751, 0x5740,\n    0x574D, 0x5747, 0x574E, 0x573E, 0x5750, 0x574F, 0x573B, 0x58EF,\n    0x593E, 0x599D, 0x5992, 0x59A8, 0x599E, 0x59A3, 0x5999, 0x5996,\n    0x598D, 0x59A4, 0x5993, 0x598A, 0x59A5, 0x5B5D, 0x5B5C, 0x5B5A,\n    0x5B5B, 0x5B8C, 0x5B8B, 0x5B8F, 0x5C2C, 0x5C40, 0x5C41, 0x5C3F,\n    0x5C3E, 0x5C90, 0x5C91, 0x5C94, 0x5C8C, 0x5DEB, 0x5E0C, 0x5E8F,\n    0x5E87, 0x5E8A, 0x5EF7, 0x5F04, 0x5F1F, 0x5F64, 0x5F62, 0x5F77,\n    0x5F79, 0x5FD8, 0x5FCC, 0x5FD7, 0x5FCD, 0x5FF1, 0x5FEB, 0x5FF8,\n    0x5FEA, 0x6212, 0x6211, 0x6284, 0x6297, 0x6296, 0x6280, 0x6276,\n    0x6289, 0x626D, 0x628A, 0x627C, 0x627E, 0x6279, 0x6273, 0x6292,\n    0x626F, 0x6298, 0x626E, 0x6295, 0x6293, 0x6291, 0x6286, 0x6539,\n    0x653B, 0x6538, 0x65F1, 0x66F4, 0x675F, 0x674E, 0x674F, 0x6750,\n    0x6751, 0x675C, 0x6756, 0x675E, 0x6749, 0x6746, 0x6760, 0x6753,\n    0x6757, 0x6B65, 0x6BCF, 0x6C42, 0x6C5E, 0x6C99, 0x6C81, 0x6C88,\n    0x6C89, 0x6C85, 0x6C9B, 0x6C6A, 0x6C7A, 0x6C90, 0x6C70, 0x6C8C,\n    0x6C68, 0x6C96, 0x6C92, 0x6C7D, 0x6C83, 0x6C72, 0x6C7E, 0x6C74,\n    0x6C86, 0x6C76, 0x6C8D, 0x6C94, 0x6C98, 0x6C82, 0x7076, 0x707C,\n    0x707D, 0x7078, 0x7262, 0x7261, 0x7260, 0x72C4, 0x72C2, 0x7396,\n    0x752C, 0x752B, 0x7537, 0x7538, 0x7682, 0x76EF, 0x77E3, 0x79C1,\n    0x79C0, 0x79BF, 0x7A76, 0x7CFB, 0x7F55, 0x8096, 0x8093, 0x809D,\n    0x8098, 0x809B, 0x809A, 0x80B2, 0x826F, 0x8292, 0x828B, 0x828D,\n    0x898B, 0x89D2, 0x8A00, 0x8C37, 0x8C46, 0x8C55, 0x8C9D, 0x8D64,\n    0x8D70, 0x8DB3, 0x8EAB, 0x8ECA, 0x8F9B, 0x8FB0, 0x8FC2, 0x8FC6,\n    0x8FC5, 0x8FC4, 0x5DE1, 0x9091, 0x90A2, 0x90AA, 0x90A6, 0x90A3,\n    0x9149, 0x91C6, 0x91CC, 0x9632, 0x962E, 0x9631, 0x962A, 0x962C,\n    0x4E26, 0x4E56, 0x4E73, 0x4E8B, 0x4E9B, 0x4E9E, 0x4EAB, 0x4EAC,\n    0x4F6F, 0x4F9D, 0x4F8D, 0x4F73, 0x4F7F, 0x4F6C, 0x4F9B, 0x4F8B,\n    0x4F86, 0x4F83, 0x4F70, 0x4F75, 0x4F88, 0x4F69, 0x4F7B, 0x4F96,\n    0x4F7E, 0x4F8F, 0x4F91, 0x4F7A, 0x5154, 0x5152, 0x5155, 0x5169,\n    0x5177, 0x5176, 0x5178, 0x51BD, 0x51FD, 0x523B, 0x5238, 0x5237,\n    0x523A, 0x5230, 0x522E, 0x5236, 0x5241, 0x52BE, 0x52BB, 0x5352,\n    0x5354, 0x5353, 0x5351, 0x5366, 0x5377, 0x5378, 0x5379, 0x53D6,\n    0x53D4, 0x53D7, 0x5473, 0x5475, 0x5496, 0x5478, 0x5495, 0x5480,\n    0x547B, 0x5477, 0x5484, 0x5492, 0x5486, 0x547C, 0x5490, 0x5471,\n    0x5476, 0x548C, 0x549A, 0x5462, 0x5468, 0x548B, 0x547D, 0x548E,\n    0x56FA, 0x5783, 0x5777, 0x576A, 0x5769, 0x5761, 0x5766, 0x5764,\n    0x577C, 0x591C, 0x5949, 0x5947, 0x5948, 0x5944, 0x5954, 0x59BE,\n    0x59BB, 0x59D4, 0x59B9, 0x59AE, 0x59D1, 0x59C6, 0x59D0, 0x59CD,\n    0x59CB, 0x59D3, 0x59CA, 0x59AF, 0x59B3, 0x59D2, 0x59C5, 0x5B5F,\n    0x5B64, 0x5B63, 0x5B97, 0x5B9A, 0x5B98, 0x5B9C, 0x5B99, 0x5B9B,\n    0x5C1A, 0x5C48, 0x5C45, 0x5C46, 0x5CB7, 0x5CA1, 0x5CB8, 0x5CA9,\n    0x5CAB, 0x5CB1, 0x5CB3, 0x5E18, 0x5E1A, 0x5E16, 0x5E15, 0x5E1B,\n    0x5E11, 0x5E78, 0x5E9A, 0x5E97, 0x5E9C, 0x5E95, 0x5E96, 0x5EF6,\n    0x5F26, 0x5F27, 0x5F29, 0x5F80, 0x5F81, 0x5F7F, 0x5F7C, 0x5FDD,\n    0x5FE0, 0x5FFD, 0x5FF5, 0x5FFF, 0x600F, 0x6014, 0x602F, 0x6035,\n    0x6016, 0x602A, 0x6015, 0x6021, 0x6027, 0x6029, 0x602B, 0x601B,\n    0x6216, 0x6215, 0x623F, 0x623E, 0x6240, 0x627F, 0x62C9, 0x62CC,\n    0x62C4, 0x62BF, 0x62C2, 0x62B9, 0x62D2, 0x62DB, 0x62AB, 0x62D3,\n    0x62D4, 0x62CB, 0x62C8, 0x62A8, 0x62BD, 0x62BC, 0x62D0, 0x62D9,\n    0x62C7, 0x62CD, 0x62B5, 0x62DA, 0x62B1, 0x62D8, 0x62D6, 0x62D7,\n    0x62C6, 0x62AC, 0x62CE, 0x653E, 0x65A7, 0x65BC, 0x65FA, 0x6614,\n    0x6613, 0x660C, 0x6606, 0x6602, 0x660E, 0x6600, 0x660F, 0x6615,\n    0x660A, 0x6607, 0x670D, 0x670B, 0x676D, 0x678B, 0x6795, 0x6771,\n    0x679C, 0x6773, 0x6777, 0x6787, 0x679D, 0x6797, 0x676F, 0x6770,\n    0x677F, 0x6789, 0x677E, 0x6790, 0x6775, 0x679A, 0x6793, 0x677C,\n    0x676A, 0x6772, 0x6B23, 0x6B66, 0x6B67, 0x6B7F, 0x6C13, 0x6C1B,\n    0x6CE3, 0x6CE8, 0x6CF3, 0x6CB1, 0x6CCC, 0x6CE5, 0x6CB3, 0x6CBD,\n    0x6CBE, 0x6CBC, 0x6CE2, 0x6CAB, 0x6CD5, 0x6CD3, 0x6CB8, 0x6CC4,\n    0x6CB9, 0x6CC1, 0x6CAE, 0x6CD7, 0x6CC5, 0x6CF1, 0x6CBF, 0x6CBB,\n    0x6CE1, 0x6CDB, 0x6CCA, 0x6CAC, 0x6CEF, 0x6CDC, 0x6CD6, 0x6CE0,\n    0x7095, 0x708E, 0x7092, 0x708A, 0x7099, 0x722C, 0x722D, 0x7238,\n    0x7248, 0x7267, 0x7269, 0x72C0, 0x72CE, 0x72D9, 0x72D7, 0x72D0,\n    0x73A9, 0x73A8, 0x739F, 0x73AB, 0x73A5, 0x753D, 0x759D, 0x7599,\n    0x759A, 0x7684, 0x76C2, 0x76F2, 0x76F4, 0x77E5, 0x77FD, 0x793E,\n    0x7940, 0x7941, 0x79C9, 0x79C8, 0x7A7A, 0x7A79, 0x7AFA, 0x7CFE,\n    0x7F54, 0x7F8C, 0x7F8B, 0x8005, 0x80BA, 0x80A5, 0x80A2, 0x80B1,\n    0x80A1, 0x80AB, 0x80A9, 0x80B4, 0x80AA, 0x80AF, 0x81E5, 0x81FE,\n    0x820D, 0x82B3, 0x829D, 0x8299, 0x82AD, 0x82BD, 0x829F, 0x82B9,\n    0x82B1, 0x82AC, 0x82A5, 0x82AF, 0x82B8, 0x82A3, 0x82B0, 0x82BE,\n    0x82B7, 0x864E, 0x8671, 0x521D, 0x8868, 0x8ECB, 0x8FCE, 0x8FD4,\n    0x8FD1, 0x90B5, 0x90B8, 0x90B1, 0x90B6, 0x91C7, 0x91D1, 0x9577,\n    0x9580, 0x961C, 0x9640, 0x963F, 0x963B, 0x9644, 0x9642, 0x96B9,\n    0x96E8, 0x9752, 0x975E, 0x4E9F, 0x4EAD, 0x4EAE, 0x4FE1, 0x4FB5,\n    0x4FAF, 0x4FBF, 0x4FE0, 0x4FD1, 0x4FCF, 0x4FDD, 0x4FC3, 0x4FB6,\n    0x4FD8, 0x4FDF, 0x4FCA, 0x4FD7, 0x4FAE, 0x4FD0, 0x4FC4, 0x4FC2,\n    0x4FDA, 0x4FCE, 0x4FDE, 0x4FB7, 0x5157, 0x5192, 0x5191, 0x51A0,\n    0x524E, 0x5243, 0x524A, 0x524D, 0x524C, 0x524B, 0x5247, 0x52C7,\n    0x52C9, 0x52C3, 0x52C1, 0x530D, 0x5357, 0x537B, 0x539A, 0x53DB,\n    0x54AC, 0x54C0, 0x54A8, 0x54CE, 0x54C9, 0x54B8, 0x54A6, 0x54B3,\n    0x54C7, 0x54C2, 0x54BD, 0x54AA, 0x54C1, 0x54C4, 0x54C8, 0x54AF,\n    0x54AB, 0x54B1, 0x54BB, 0x54A9, 0x54A7, 0x54BF, 0x56FF, 0x5782,\n    0x578B, 0x57A0, 0x57A3, 0x57A2, 0x57CE, 0x57AE, 0x5793, 0x5955,\n    0x5951, 0x594F, 0x594E, 0x5950, 0x59DC, 0x59D8, 0x59FF, 0x59E3,\n    0x59E8, 0x5A03, 0x59E5, 0x59EA, 0x59DA, 0x59E6, 0x5A01, 0x59FB,\n    0x5B69, 0x5BA3, 0x5BA6, 0x5BA4, 0x5BA2, 0x5BA5, 0x5C01, 0x5C4E,\n    0x5C4F, 0x5C4D, 0x5C4B, 0x5CD9, 0x5CD2, 0x5DF7, 0x5E1D, 0x5E25,\n    0x5E1F, 0x5E7D, 0x5EA0, 0x5EA6, 0x5EFA, 0x5F08, 0x5F2D, 0x5F65,\n    0x5F88, 0x5F85, 0x5F8A, 0x5F8B, 0x5F87, 0x5F8C, 0x5F89, 0x6012,\n    0x601D, 0x6020, 0x6025, 0x600E, 0x6028, 0x604D, 0x6070, 0x6068,\n    0x6062, 0x6046, 0x6043, 0x606C, 0x606B, 0x606A, 0x6064, 0x6241,\n    0x62DC, 0x6316, 0x6309, 0x62FC, 0x62ED, 0x6301, 0x62EE, 0x62FD,\n    0x6307, 0x62F1, 0x62F7, 0x62EF, 0x62EC, 0x62FE, 0x62F4, 0x6311,\n    0x6302, 0x653F, 0x6545, 0x65AB, 0x65BD, 0x65E2, 0x6625, 0x662D,\n    0x6620, 0x6627, 0x662F, 0x661F, 0x6628, 0x6631, 0x6624, 0x66F7,\n    0x67FF, 0x67D3, 0x67F1, 0x67D4, 0x67D0, 0x67EC, 0x67B6, 0x67AF,\n    0x67F5, 0x67E9, 0x67EF, 0x67C4, 0x67D1, 0x67B4, 0x67DA, 0x67E5,\n    0x67B8, 0x67CF, 0x67DE, 0x67F3, 0x67B0, 0x67D9, 0x67E2, 0x67DD,\n    0x67D2, 0x6B6A, 0x6B83, 0x6B86, 0x6BB5, 0x6BD2, 0x6BD7, 0x6C1F,\n    0x6CC9, 0x6D0B, 0x6D32, 0x6D2A, 0x6D41, 0x6D25, 0x6D0C, 0x6D31,\n    0x6D1E, 0x6D17, 0x6D3B, 0x6D3D, 0x6D3E, 0x6D36, 0x6D1B, 0x6CF5,\n    0x6D39, 0x6D27, 0x6D38, 0x6D29, 0x6D2E, 0x6D35, 0x6D0E, 0x6D2B,\n    0x70AB, 0x70BA, 0x70B3, 0x70AC, 0x70AF, 0x70AD, 0x70B8, 0x70AE,\n    0x70A4, 0x7230, 0x7272, 0x726F, 0x7274, 0x72E9, 0x72E0, 0x72E1,\n    0x73B7, 0x73CA, 0x73BB, 0x73B2, 0x73CD, 0x73C0, 0x73B3, 0x751A,\n    0x752D, 0x754F, 0x754C, 0x754E, 0x754B, 0x75AB, 0x75A4, 0x75A5,\n    0x75A2, 0x75A3, 0x7678, 0x7686, 0x7687, 0x7688, 0x76C8, 0x76C6,\n    0x76C3, 0x76C5, 0x7701, 0x76F9, 0x76F8, 0x7709, 0x770B, 0x76FE,\n    0x76FC, 0x7707, 0x77DC, 0x7802, 0x7814, 0x780C, 0x780D, 0x7946,\n    0x7949, 0x7948, 0x7947, 0x79B9, 0x79BA, 0x79D1, 0x79D2, 0x79CB,\n    0x7A7F, 0x7A81, 0x7AFF, 0x7AFD, 0x7C7D, 0x7D02, 0x7D05, 0x7D00,\n    0x7D09, 0x7D07, 0x7D04, 0x7D06, 0x7F38, 0x7F8E, 0x7FBF, 0x8010,\n    0x800D, 0x8011, 0x8036, 0x80D6, 0x80E5, 0x80DA, 0x80C3, 0x80C4,\n    0x80CC, 0x80E1, 0x80DB, 0x80CE, 0x80DE, 0x80E4, 0x80DD, 0x81F4,\n    0x8222, 0x82E7, 0x8303, 0x8305, 0x82E3, 0x82DB, 0x82E6, 0x8304,\n    0x82E5, 0x8302, 0x8309, 0x82D2, 0x82D7, 0x82F1, 0x8301, 0x82DC,\n    0x82D4, 0x82D1, 0x82DE, 0x82D3, 0x82DF, 0x82EF, 0x8306, 0x8650,\n    0x8679, 0x867B, 0x867A, 0x884D, 0x886B, 0x8981, 0x89D4, 0x8A08,\n    0x8A02, 0x8A03, 0x8C9E, 0x8CA0, 0x8D74, 0x8D73, 0x8DB4, 0x8ECD,\n    0x8ECC, 0x8FF0, 0x8FE6, 0x8FE2, 0x8FEA, 0x8FE5, 0x8FED, 0x8FEB,\n    0x8FE4, 0x8FE8, 0x90CA, 0x90CE, 0x90C1, 0x90C3, 0x914B, 0x914A,\n    0x91CD, 0x9582, 0x9650, 0x964B, 0x964C, 0x964D, 0x9762, 0x9769,\n    0x97CB, 0x97ED, 0x97F3, 0x9801, 0x98A8, 0x98DB, 0x98DF, 0x9996,\n    0x9999, 0x4E58, 0x4EB3, 0x500C, 0x500D, 0x5023, 0x4FEF, 0x5026,\n    0x5025, 0x4FF8, 0x5029, 0x5016, 0x5006, 0x503C, 0x501F, 0x501A,\n    0x5012, 0x5011, 0x4FFA, 0x5000, 0x5014, 0x5028, 0x4FF1, 0x5021,\n    0x500B, 0x5019, 0x5018, 0x4FF3, 0x4FEE, 0x502D, 0x502A, 0x4FFE,\n    0x502B, 0x5009, 0x517C, 0x51A4, 0x51A5, 0x51A2, 0x51CD, 0x51CC,\n    0x51C6, 0x51CB, 0x5256, 0x525C, 0x5254, 0x525B, 0x525D, 0x532A,\n    0x537F, 0x539F, 0x539D, 0x53DF, 0x54E8, 0x5510, 0x5501, 0x5537,\n    0x54FC, 0x54E5, 0x54F2, 0x5506, 0x54FA, 0x5514, 0x54E9, 0x54ED,\n    0x54E1, 0x5509, 0x54EE, 0x54EA, 0x54E6, 0x5527, 0x5507, 0x54FD,\n    0x550F, 0x5703, 0x5704, 0x57C2, 0x57D4, 0x57CB, 0x57C3, 0x5809,\n    0x590F, 0x5957, 0x5958, 0x595A, 0x5A11, 0x5A18, 0x5A1C, 0x5A1F,\n    0x5A1B, 0x5A13, 0x59EC, 0x5A20, 0x5A23, 0x5A29, 0x5A25, 0x5A0C,\n    0x5A09, 0x5B6B, 0x5C58, 0x5BB0, 0x5BB3, 0x5BB6, 0x5BB4, 0x5BAE,\n    0x5BB5, 0x5BB9, 0x5BB8, 0x5C04, 0x5C51, 0x5C55, 0x5C50, 0x5CED,\n    0x5CFD, 0x5CFB, 0x5CEA, 0x5CE8, 0x5CF0, 0x5CF6, 0x5D01, 0x5CF4,\n    0x5DEE, 0x5E2D, 0x5E2B, 0x5EAB, 0x5EAD, 0x5EA7, 0x5F31, 0x5F92,\n    0x5F91, 0x5F90, 0x6059, 0x6063, 0x6065, 0x6050, 0x6055, 0x606D,\n    0x6069, 0x606F, 0x6084, 0x609F, 0x609A, 0x608D, 0x6094, 0x608C,\n    0x6085, 0x6096, 0x6247, 0x62F3, 0x6308, 0x62FF, 0x634E, 0x633E,\n    0x632F, 0x6355, 0x6342, 0x6346, 0x634F, 0x6349, 0x633A, 0x6350,\n    0x633D, 0x632A, 0x632B, 0x6328, 0x634D, 0x634C, 0x6548, 0x6549,\n    0x6599, 0x65C1, 0x65C5, 0x6642, 0x6649, 0x664F, 0x6643, 0x6652,\n    0x664C, 0x6645, 0x6641, 0x66F8, 0x6714, 0x6715, 0x6717, 0x6821,\n    0x6838, 0x6848, 0x6846, 0x6853, 0x6839, 0x6842, 0x6854, 0x6829,\n    0x68B3, 0x6817, 0x684C, 0x6851, 0x683D, 0x67F4, 0x6850, 0x6840,\n    0x683C, 0x6843, 0x682A, 0x6845, 0x6813, 0x6818, 0x6841, 0x6B8A,\n    0x6B89, 0x6BB7, 0x6C23, 0x6C27, 0x6C28, 0x6C26, 0x6C24, 0x6CF0,\n    0x6D6A, 0x6D95, 0x6D88, 0x6D87, 0x6D66, 0x6D78, 0x6D77, 0x6D59,\n    0x6D93, 0x6D6C, 0x6D89, 0x6D6E, 0x6D5A, 0x6D74, 0x6D69, 0x6D8C,\n    0x6D8A, 0x6D79, 0x6D85, 0x6D65, 0x6D94, 0x70CA, 0x70D8, 0x70E4,\n    0x70D9, 0x70C8, 0x70CF, 0x7239, 0x7279, 0x72FC, 0x72F9, 0x72FD,\n    0x72F8, 0x72F7, 0x7386, 0x73ED, 0x7409, 0x73EE, 0x73E0, 0x73EA,\n    0x73DE, 0x7554, 0x755D, 0x755C, 0x755A, 0x7559, 0x75BE, 0x75C5,\n    0x75C7, 0x75B2, 0x75B3, 0x75BD, 0x75BC, 0x75B9, 0x75C2, 0x75B8,\n    0x768B, 0x76B0, 0x76CA, 0x76CD, 0x76CE, 0x7729, 0x771F, 0x7720,\n    0x7728, 0x77E9, 0x7830, 0x7827, 0x7838, 0x781D, 0x7834, 0x7837,\n    0x7825, 0x782D, 0x7820, 0x781F, 0x7832, 0x7955, 0x7950, 0x7960,\n    0x795F, 0x7956, 0x795E, 0x795D, 0x7957, 0x795A, 0x79E4, 0x79E3,\n    0x79E7, 0x79DF, 0x79E6, 0x79E9, 0x79D8, 0x7A84, 0x7A88, 0x7AD9,\n    0x7B06, 0x7B11, 0x7C89, 0x7D21, 0x7D17, 0x7D0B, 0x7D0A, 0x7D20,\n    0x7D22, 0x7D14, 0x7D10, 0x7D15, 0x7D1A, 0x7D1C, 0x7D0D, 0x7D19,\n    0x7D1B, 0x7F3A, 0x7F5F, 0x7F94, 0x7FC5, 0x7FC1, 0x8006, 0x8004,\n    0x8018, 0x8015, 0x8019, 0x8017, 0x803D, 0x803F, 0x80F1, 0x8102,\n    0x80F0, 0x8105, 0x80ED, 0x80F4, 0x8106, 0x80F8, 0x80F3, 0x8108,\n    0x80FD, 0x810A, 0x80FC, 0x80EF, 0x81ED, 0x81EC, 0x8200, 0x8210,\n    0x822A, 0x822B, 0x8228, 0x822C, 0x82BB, 0x832B, 0x8352, 0x8354,\n    0x834A, 0x8338, 0x8350, 0x8349, 0x8335, 0x8334, 0x834F, 0x8332,\n    0x8339, 0x8336, 0x8317, 0x8340, 0x8331, 0x8328, 0x8343, 0x8654,\n    0x868A, 0x86AA, 0x8693, 0x86A4, 0x86A9, 0x868C, 0x86A3, 0x869C,\n    0x8870, 0x8877, 0x8881, 0x8882, 0x887D, 0x8879, 0x8A18, 0x8A10,\n    0x8A0E, 0x8A0C, 0x8A15, 0x8A0A, 0x8A17, 0x8A13, 0x8A16, 0x8A0F,\n    0x8A11, 0x8C48, 0x8C7A, 0x8C79, 0x8CA1, 0x8CA2, 0x8D77, 0x8EAC,\n    0x8ED2, 0x8ED4, 0x8ECF, 0x8FB1, 0x9001, 0x9006, 0x8FF7, 0x9000,\n    0x8FFA, 0x8FF4, 0x9003, 0x8FFD, 0x9005, 0x8FF8, 0x9095, 0x90E1,\n    0x90DD, 0x90E2, 0x9152, 0x914D, 0x914C, 0x91D8, 0x91DD, 0x91D7,\n    0x91DC, 0x91D9, 0x9583, 0x9662, 0x9663, 0x9661, 0x965B, 0x965D,\n    0x9664, 0x9658, 0x965E, 0x96BB, 0x98E2, 0x99AC, 0x9AA8, 0x9AD8,\n    0x9B25, 0x9B32, 0x9B3C, 0x4E7E, 0x507A, 0x507D, 0x505C, 0x5047,\n    0x5043, 0x504C, 0x505A, 0x5049, 0x5065, 0x5076, 0x504E, 0x5055,\n    0x5075, 0x5074, 0x5077, 0x504F, 0x500F, 0x506F, 0x506D, 0x515C,\n    0x5195, 0x51F0, 0x526A, 0x526F, 0x52D2, 0x52D9, 0x52D8, 0x52D5,\n    0x5310, 0x530F, 0x5319, 0x533F, 0x5340, 0x533E, 0x53C3, 0x66FC,\n    0x5546, 0x556A, 0x5566, 0x5544, 0x555E, 0x5561, 0x5543, 0x554A,\n    0x5531, 0x5556, 0x554F, 0x5555, 0x552F, 0x5564, 0x5538, 0x552E,\n    0x555C, 0x552C, 0x5563, 0x5533, 0x5541, 0x5557, 0x5708, 0x570B,\n    0x5709, 0x57DF, 0x5805, 0x580A, 0x5806, 0x57E0, 0x57E4, 0x57FA,\n    0x5802, 0x5835, 0x57F7, 0x57F9, 0x5920, 0x5962, 0x5A36, 0x5A41,\n    0x5A49, 0x5A66, 0x5A6A, 0x5A40, 0x5A3C, 0x5A62, 0x5A5A, 0x5A46,\n    0x5A4A, 0x5B70, 0x5BC7, 0x5BC5, 0x5BC4, 0x5BC2, 0x5BBF, 0x5BC6,\n    0x5C09, 0x5C08, 0x5C07, 0x5C60, 0x5C5C, 0x5C5D, 0x5D07, 0x5D06,\n    0x5D0E, 0x5D1B, 0x5D16, 0x5D22, 0x5D11, 0x5D29, 0x5D14, 0x5D19,\n    0x5D24, 0x5D27, 0x5D17, 0x5DE2, 0x5E38, 0x5E36, 0x5E33, 0x5E37,\n    0x5EB7, 0x5EB8, 0x5EB6, 0x5EB5, 0x5EBE, 0x5F35, 0x5F37, 0x5F57,\n    0x5F6C, 0x5F69, 0x5F6B, 0x5F97, 0x5F99, 0x5F9E, 0x5F98, 0x5FA1,\n    0x5FA0, 0x5F9C, 0x607F, 0x60A3, 0x6089, 0x60A0, 0x60A8, 0x60CB,\n    0x60B4, 0x60E6, 0x60BD, 0x60C5, 0x60BB, 0x60B5, 0x60DC, 0x60BC,\n    0x60D8, 0x60D5, 0x60C6, 0x60DF, 0x60B8, 0x60DA, 0x60C7, 0x621A,\n    0x621B, 0x6248, 0x63A0, 0x63A7, 0x6372, 0x6396, 0x63A2, 0x63A5,\n    0x6377, 0x6367, 0x6398, 0x63AA, 0x6371, 0x63A9, 0x6389, 0x6383,\n    0x639B, 0x636B, 0x63A8, 0x6384, 0x6388, 0x6399, 0x63A1, 0x63AC,\n    0x6392, 0x638F, 0x6380, 0x637B, 0x6369, 0x6368, 0x637A, 0x655D,\n    0x6556, 0x6551, 0x6559, 0x6557, 0x555F, 0x654F, 0x6558, 0x6555,\n    0x6554, 0x659C, 0x659B, 0x65AC, 0x65CF, 0x65CB, 0x65CC, 0x65CE,\n    0x665D, 0x665A, 0x6664, 0x6668, 0x6666, 0x665E, 0x66F9, 0x52D7,\n    0x671B, 0x6881, 0x68AF, 0x68A2, 0x6893, 0x68B5, 0x687F, 0x6876,\n    0x68B1, 0x68A7, 0x6897, 0x68B0, 0x6883, 0x68C4, 0x68AD, 0x6886,\n    0x6885, 0x6894, 0x689D, 0x68A8, 0x689F, 0x68A1, 0x6882, 0x6B32,\n    0x6BBA, 0x6BEB, 0x6BEC, 0x6C2B, 0x6D8E, 0x6DBC, 0x6DF3, 0x6DD9,\n    0x6DB2, 0x6DE1, 0x6DCC, 0x6DE4, 0x6DFB, 0x6DFA, 0x6E05, 0x6DC7,\n    0x6DCB, 0x6DAF, 0x6DD1, 0x6DAE, 0x6DDE, 0x6DF9, 0x6DB8, 0x6DF7,\n    0x6DF5, 0x6DC5, 0x6DD2, 0x6E1A, 0x6DB5, 0x6DDA, 0x6DEB, 0x6DD8,\n    0x6DEA, 0x6DF1, 0x6DEE, 0x6DE8, 0x6DC6, 0x6DC4, 0x6DAA, 0x6DEC,\n    0x6DBF, 0x6DE6, 0x70F9, 0x7109, 0x710A, 0x70FD, 0x70EF, 0x723D,\n    0x727D, 0x7281, 0x731C, 0x731B, 0x7316, 0x7313, 0x7319, 0x7387,\n    0x7405, 0x740A, 0x7403, 0x7406, 0x73FE, 0x740D, 0x74E0, 0x74F6,\n    0x74F7, 0x751C, 0x7522, 0x7565, 0x7566, 0x7562, 0x7570, 0x758F,\n    0x75D4, 0x75D5, 0x75B5, 0x75CA, 0x75CD, 0x768E, 0x76D4, 0x76D2,\n    0x76DB, 0x7737, 0x773E, 0x773C, 0x7736, 0x7738, 0x773A, 0x786B,\n    0x7843, 0x784E, 0x7965, 0x7968, 0x796D, 0x79FB, 0x7A92, 0x7A95,\n    0x7B20, 0x7B28, 0x7B1B, 0x7B2C, 0x7B26, 0x7B19, 0x7B1E, 0x7B2E,\n    0x7C92, 0x7C97, 0x7C95, 0x7D46, 0x7D43, 0x7D71, 0x7D2E, 0x7D39,\n    0x7D3C, 0x7D40, 0x7D30, 0x7D33, 0x7D44, 0x7D2F, 0x7D42, 0x7D32,\n    0x7D31, 0x7F3D, 0x7F9E, 0x7F9A, 0x7FCC, 0x7FCE, 0x7FD2, 0x801C,\n    0x804A, 0x8046, 0x812F, 0x8116, 0x8123, 0x812B, 0x8129, 0x8130,\n    0x8124, 0x8202, 0x8235, 0x8237, 0x8236, 0x8239, 0x838E, 0x839E,\n    0x8398, 0x8378, 0x83A2, 0x8396, 0x83BD, 0x83AB, 0x8392, 0x838A,\n    0x8393, 0x8389, 0x83A0, 0x8377, 0x837B, 0x837C, 0x8386, 0x83A7,\n    0x8655, 0x5F6A, 0x86C7, 0x86C0, 0x86B6, 0x86C4, 0x86B5, 0x86C6,\n    0x86CB, 0x86B1, 0x86AF, 0x86C9, 0x8853, 0x889E, 0x8888, 0x88AB,\n    0x8892, 0x8896, 0x888D, 0x888B, 0x8993, 0x898F, 0x8A2A, 0x8A1D,\n    0x8A23, 0x8A25, 0x8A31, 0x8A2D, 0x8A1F, 0x8A1B, 0x8A22, 0x8C49,\n    0x8C5A, 0x8CA9, 0x8CAC, 0x8CAB, 0x8CA8, 0x8CAA, 0x8CA7, 0x8D67,\n    0x8D66, 0x8DBE, 0x8DBA, 0x8EDB, 0x8EDF, 0x9019, 0x900D, 0x901A,\n    0x9017, 0x9023, 0x901F, 0x901D, 0x9010, 0x9015, 0x901E, 0x9020,\n    0x900F, 0x9022, 0x9016, 0x901B, 0x9014, 0x90E8, 0x90ED, 0x90FD,\n    0x9157, 0x91CE, 0x91F5, 0x91E6, 0x91E3, 0x91E7, 0x91ED, 0x91E9,\n    0x9589, 0x966A, 0x9675, 0x9673, 0x9678, 0x9670, 0x9674, 0x9676,\n    0x9677, 0x966C, 0x96C0, 0x96EA, 0x96E9, 0x7AE0, 0x7ADF, 0x9802,\n    0x9803, 0x9B5A, 0x9CE5, 0x9E75, 0x9E7F, 0x9EA5, 0x9EBB, 0x50A2,\n    0x508D, 0x5085, 0x5099, 0x5091, 0x5080, 0x5096, 0x5098, 0x509A,\n    0x6700, 0x51F1, 0x5272, 0x5274, 0x5275, 0x5269, 0x52DE, 0x52DD,\n    0x52DB, 0x535A, 0x53A5, 0x557B, 0x5580, 0x55A7, 0x557C, 0x558A,\n    0x559D, 0x5598, 0x5582, 0x559C, 0x55AA, 0x5594, 0x5587, 0x558B,\n    0x5583, 0x55B3, 0x55AE, 0x559F, 0x553E, 0x55B2, 0x559A, 0x55BB,\n    0x55AC, 0x55B1, 0x557E, 0x5589, 0x55AB, 0x5599, 0x570D, 0x582F,\n    0x582A, 0x5834, 0x5824, 0x5830, 0x5831, 0x5821, 0x581D, 0x5820,\n    0x58F9, 0x58FA, 0x5960, 0x5A77, 0x5A9A, 0x5A7F, 0x5A92, 0x5A9B,\n    0x5AA7, 0x5B73, 0x5B71, 0x5BD2, 0x5BCC, 0x5BD3, 0x5BD0, 0x5C0A,\n    0x5C0B, 0x5C31, 0x5D4C, 0x5D50, 0x5D34, 0x5D47, 0x5DFD, 0x5E45,\n    0x5E3D, 0x5E40, 0x5E43, 0x5E7E, 0x5ECA, 0x5EC1, 0x5EC2, 0x5EC4,\n    0x5F3C, 0x5F6D, 0x5FA9, 0x5FAA, 0x5FA8, 0x60D1, 0x60E1, 0x60B2,\n    0x60B6, 0x60E0, 0x611C, 0x6123, 0x60FA, 0x6115, 0x60F0, 0x60FB,\n    0x60F4, 0x6168, 0x60F1, 0x610E, 0x60F6, 0x6109, 0x6100, 0x6112,\n    0x621F, 0x6249, 0x63A3, 0x638C, 0x63CF, 0x63C0, 0x63E9, 0x63C9,\n    0x63C6, 0x63CD, 0x63D2, 0x63E3, 0x63D0, 0x63E1, 0x63D6, 0x63ED,\n    0x63EE, 0x6376, 0x63F4, 0x63EA, 0x63DB, 0x6452, 0x63DA, 0x63F9,\n    0x655E, 0x6566, 0x6562, 0x6563, 0x6591, 0x6590, 0x65AF, 0x666E,\n    0x6670, 0x6674, 0x6676, 0x666F, 0x6691, 0x667A, 0x667E, 0x6677,\n    0x66FE, 0x66FF, 0x671F, 0x671D, 0x68FA, 0x68D5, 0x68E0, 0x68D8,\n    0x68D7, 0x6905, 0x68DF, 0x68F5, 0x68EE, 0x68E7, 0x68F9, 0x68D2,\n    0x68F2, 0x68E3, 0x68CB, 0x68CD, 0x690D, 0x6912, 0x690E, 0x68C9,\n    0x68DA, 0x696E, 0x68FB, 0x6B3E, 0x6B3A, 0x6B3D, 0x6B98, 0x6B96,\n    0x6BBC, 0x6BEF, 0x6C2E, 0x6C2F, 0x6C2C, 0x6E2F, 0x6E38, 0x6E54,\n    0x6E21, 0x6E32, 0x6E67, 0x6E4A, 0x6E20, 0x6E25, 0x6E23, 0x6E1B,\n    0x6E5B, 0x6E58, 0x6E24, 0x6E56, 0x6E6E, 0x6E2D, 0x6E26, 0x6E6F,\n    0x6E34, 0x6E4D, 0x6E3A, 0x6E2C, 0x6E43, 0x6E1D, 0x6E3E, 0x6ECB,\n    0x6E89, 0x6E19, 0x6E4E, 0x6E63, 0x6E44, 0x6E72, 0x6E69, 0x6E5F,\n    0x7119, 0x711A, 0x7126, 0x7130, 0x7121, 0x7136, 0x716E, 0x711C,\n    0x724C, 0x7284, 0x7280, 0x7336, 0x7325, 0x7334, 0x7329, 0x743A,\n    0x742A, 0x7433, 0x7422, 0x7425, 0x7435, 0x7436, 0x7434, 0x742F,\n    0x741B, 0x7426, 0x7428, 0x7525, 0x7526, 0x756B, 0x756A, 0x75E2,\n    0x75DB, 0x75E3, 0x75D9, 0x75D8, 0x75DE, 0x75E0, 0x767B, 0x767C,\n    0x7696, 0x7693, 0x76B4, 0x76DC, 0x774F, 0x77ED, 0x785D, 0x786C,\n    0x786F, 0x7A0D, 0x7A08, 0x7A0B, 0x7A05, 0x7A00, 0x7A98, 0x7A97,\n    0x7A96, 0x7AE5, 0x7AE3, 0x7B49, 0x7B56, 0x7B46, 0x7B50, 0x7B52,\n    0x7B54, 0x7B4D, 0x7B4B, 0x7B4F, 0x7B51, 0x7C9F, 0x7CA5, 0x7D5E,\n    0x7D50, 0x7D68, 0x7D55, 0x7D2B, 0x7D6E, 0x7D72, 0x7D61, 0x7D66,\n    0x7D62, 0x7D70, 0x7D73, 0x5584, 0x7FD4, 0x7FD5, 0x800B, 0x8052,\n    0x8085, 0x8155, 0x8154, 0x814B, 0x8151, 0x814E, 0x8139, 0x8146,\n    0x813E, 0x814C, 0x8153, 0x8174, 0x8212, 0x821C, 0x83E9, 0x8403,\n    0x83F8, 0x840D, 0x83E0, 0x83C5, 0x840B, 0x83C1, 0x83EF, 0x83F1,\n    0x83F4, 0x8457, 0x840A, 0x83F0, 0x840C, 0x83CC, 0x83FD, 0x83F2,\n    0x83CA, 0x8438, 0x840E, 0x8404, 0x83DC, 0x8407, 0x83D4, 0x83DF,\n    0x865B, 0x86DF, 0x86D9, 0x86ED, 0x86D4, 0x86DB, 0x86E4, 0x86D0,\n    0x86DE, 0x8857, 0x88C1, 0x88C2, 0x88B1, 0x8983, 0x8996, 0x8A3B,\n    0x8A60, 0x8A55, 0x8A5E, 0x8A3C, 0x8A41, 0x8A54, 0x8A5B, 0x8A50,\n    0x8A46, 0x8A34, 0x8A3A, 0x8A36, 0x8A56, 0x8C61, 0x8C82, 0x8CAF,\n    0x8CBC, 0x8CB3, 0x8CBD, 0x8CC1, 0x8CBB, 0x8CC0, 0x8CB4, 0x8CB7,\n    0x8CB6, 0x8CBF, 0x8CB8, 0x8D8A, 0x8D85, 0x8D81, 0x8DCE, 0x8DDD,\n    0x8DCB, 0x8DDA, 0x8DD1, 0x8DCC, 0x8DDB, 0x8DC6, 0x8EFB, 0x8EF8,\n    0x8EFC, 0x8F9C, 0x902E, 0x9035, 0x9031, 0x9038, 0x9032, 0x9036,\n    0x9102, 0x90F5, 0x9109, 0x90FE, 0x9163, 0x9165, 0x91CF, 0x9214,\n    0x9215, 0x9223, 0x9209, 0x921E, 0x920D, 0x9210, 0x9207, 0x9211,\n    0x9594, 0x958F, 0x958B, 0x9591, 0x9593, 0x9592, 0x958E, 0x968A,\n    0x968E, 0x968B, 0x967D, 0x9685, 0x9686, 0x968D, 0x9672, 0x9684,\n    0x96C1, 0x96C5, 0x96C4, 0x96C6, 0x96C7, 0x96EF, 0x96F2, 0x97CC,\n    0x9805, 0x9806, 0x9808, 0x98E7, 0x98EA, 0x98EF, 0x98E9, 0x98F2,\n    0x98ED, 0x99AE, 0x99AD, 0x9EC3, 0x9ECD, 0x9ED1, 0x4E82, 0x50AD,\n    0x50B5, 0x50B2, 0x50B3, 0x50C5, 0x50BE, 0x50AC, 0x50B7, 0x50BB,\n    0x50AF, 0x50C7, 0x527F, 0x5277, 0x527D, 0x52DF, 0x52E6, 0x52E4,\n    0x52E2, 0x52E3, 0x532F, 0x55DF, 0x55E8, 0x55D3, 0x55E6, 0x55CE,\n    0x55DC, 0x55C7, 0x55D1, 0x55E3, 0x55E4, 0x55EF, 0x55DA, 0x55E1,\n    0x55C5, 0x55C6, 0x55E5, 0x55C9, 0x5712, 0x5713, 0x585E, 0x5851,\n    0x5858, 0x5857, 0x585A, 0x5854, 0x586B, 0x584C, 0x586D, 0x584A,\n    0x5862, 0x5852, 0x584B, 0x5967, 0x5AC1, 0x5AC9, 0x5ACC, 0x5ABE,\n    0x5ABD, 0x5ABC, 0x5AB3, 0x5AC2, 0x5AB2, 0x5D69, 0x5D6F, 0x5E4C,\n    0x5E79, 0x5EC9, 0x5EC8, 0x5F12, 0x5F59, 0x5FAC, 0x5FAE, 0x611A,\n    0x610F, 0x6148, 0x611F, 0x60F3, 0x611B, 0x60F9, 0x6101, 0x6108,\n    0x614E, 0x614C, 0x6144, 0x614D, 0x613E, 0x6134, 0x6127, 0x610D,\n    0x6106, 0x6137, 0x6221, 0x6222, 0x6413, 0x643E, 0x641E, 0x642A,\n    0x642D, 0x643D, 0x642C, 0x640F, 0x641C, 0x6414, 0x640D, 0x6436,\n    0x6416, 0x6417, 0x6406, 0x656C, 0x659F, 0x65B0, 0x6697, 0x6689,\n    0x6687, 0x6688, 0x6696, 0x6684, 0x6698, 0x668D, 0x6703, 0x6994,\n    0x696D, 0x695A, 0x6977, 0x6960, 0x6954, 0x6975, 0x6930, 0x6982,\n    0x694A, 0x6968, 0x696B, 0x695E, 0x6953, 0x6979, 0x6986, 0x695D,\n    0x6963, 0x695B, 0x6B47, 0x6B72, 0x6BC0, 0x6BBF, 0x6BD3, 0x6BFD,\n    0x6EA2, 0x6EAF, 0x6ED3, 0x6EB6, 0x6EC2, 0x6E90, 0x6E9D, 0x6EC7,\n    0x6EC5, 0x6EA5, 0x6E98, 0x6EBC, 0x6EBA, 0x6EAB, 0x6ED1, 0x6E96,\n    0x6E9C, 0x6EC4, 0x6ED4, 0x6EAA, 0x6EA7, 0x6EB4, 0x714E, 0x7159,\n    0x7169, 0x7164, 0x7149, 0x7167, 0x715C, 0x716C, 0x7166, 0x714C,\n    0x7165, 0x715E, 0x7146, 0x7168, 0x7156, 0x723A, 0x7252, 0x7337,\n    0x7345, 0x733F, 0x733E, 0x746F, 0x745A, 0x7455, 0x745F, 0x745E,\n    0x7441, 0x743F, 0x7459, 0x745B, 0x745C, 0x7576, 0x7578, 0x7600,\n    0x75F0, 0x7601, 0x75F2, 0x75F1, 0x75FA, 0x75FF, 0x75F4, 0x75F3,\n    0x76DE, 0x76DF, 0x775B, 0x776B, 0x7766, 0x775E, 0x7763, 0x7779,\n    0x776A, 0x776C, 0x775C, 0x7765, 0x7768, 0x7762, 0x77EE, 0x788E,\n    0x78B0, 0x7897, 0x7898, 0x788C, 0x7889, 0x787C, 0x7891, 0x7893,\n    0x787F, 0x797A, 0x797F, 0x7981, 0x842C, 0x79BD, 0x7A1C, 0x7A1A,\n    0x7A20, 0x7A14, 0x7A1F, 0x7A1E, 0x7A9F, 0x7AA0, 0x7B77, 0x7BC0,\n    0x7B60, 0x7B6E, 0x7B67, 0x7CB1, 0x7CB3, 0x7CB5, 0x7D93, 0x7D79,\n    0x7D91, 0x7D81, 0x7D8F, 0x7D5B, 0x7F6E, 0x7F69, 0x7F6A, 0x7F72,\n    0x7FA9, 0x7FA8, 0x7FA4, 0x8056, 0x8058, 0x8086, 0x8084, 0x8171,\n    0x8170, 0x8178, 0x8165, 0x816E, 0x8173, 0x816B, 0x8179, 0x817A,\n    0x8166, 0x8205, 0x8247, 0x8482, 0x8477, 0x843D, 0x8431, 0x8475,\n    0x8466, 0x846B, 0x8449, 0x846C, 0x845B, 0x843C, 0x8435, 0x8461,\n    0x8463, 0x8469, 0x846D, 0x8446, 0x865E, 0x865C, 0x865F, 0x86F9,\n    0x8713, 0x8708, 0x8707, 0x8700, 0x86FE, 0x86FB, 0x8702, 0x8703,\n    0x8706, 0x870A, 0x8859, 0x88DF, 0x88D4, 0x88D9, 0x88DC, 0x88D8,\n    0x88DD, 0x88E1, 0x88CA, 0x88D5, 0x88D2, 0x899C, 0x89E3, 0x8A6B,\n    0x8A72, 0x8A73, 0x8A66, 0x8A69, 0x8A70, 0x8A87, 0x8A7C, 0x8A63,\n    0x8AA0, 0x8A71, 0x8A85, 0x8A6D, 0x8A62, 0x8A6E, 0x8A6C, 0x8A79,\n    0x8A7B, 0x8A3E, 0x8A68, 0x8C62, 0x8C8A, 0x8C89, 0x8CCA, 0x8CC7,\n    0x8CC8, 0x8CC4, 0x8CB2, 0x8CC3, 0x8CC2, 0x8CC5, 0x8DE1, 0x8DDF,\n    0x8DE8, 0x8DEF, 0x8DF3, 0x8DFA, 0x8DEA, 0x8DE4, 0x8DE6, 0x8EB2,\n    0x8F03, 0x8F09, 0x8EFE, 0x8F0A, 0x8F9F, 0x8FB2, 0x904B, 0x904A,\n    0x9053, 0x9042, 0x9054, 0x903C, 0x9055, 0x9050, 0x9047, 0x904F,\n    0x904E, 0x904D, 0x9051, 0x903E, 0x9041, 0x9112, 0x9117, 0x916C,\n    0x916A, 0x9169, 0x91C9, 0x9237, 0x9257, 0x9238, 0x923D, 0x9240,\n    0x923E, 0x925B, 0x924B, 0x9264, 0x9251, 0x9234, 0x9249, 0x924D,\n    0x9245, 0x9239, 0x923F, 0x925A, 0x9598, 0x9698, 0x9694, 0x9695,\n    0x96CD, 0x96CB, 0x96C9, 0x96CA, 0x96F7, 0x96FB, 0x96F9, 0x96F6,\n    0x9756, 0x9774, 0x9776, 0x9810, 0x9811, 0x9813, 0x980A, 0x9812,\n    0x980C, 0x98FC, 0x98F4, 0x98FD, 0x98FE, 0x99B3, 0x99B1, 0x99B4,\n    0x9AE1, 0x9CE9, 0x9E82, 0x9F0E, 0x9F13, 0x9F20, 0x50E7, 0x50EE,\n    0x50E5, 0x50D6, 0x50ED, 0x50DA, 0x50D5, 0x50CF, 0x50D1, 0x50F1,\n    0x50CE, 0x50E9, 0x5162, 0x51F3, 0x5283, 0x5282, 0x5331, 0x53AD,\n    0x55FE, 0x5600, 0x561B, 0x5617, 0x55FD, 0x5614, 0x5606, 0x5609,\n    0x560D, 0x560E, 0x55F7, 0x5616, 0x561F, 0x5608, 0x5610, 0x55F6,\n    0x5718, 0x5716, 0x5875, 0x587E, 0x5883, 0x5893, 0x588A, 0x5879,\n    0x5885, 0x587D, 0x58FD, 0x5925, 0x5922, 0x5924, 0x596A, 0x5969,\n    0x5AE1, 0x5AE6, 0x5AE9, 0x5AD7, 0x5AD6, 0x5AD8, 0x5AE3, 0x5B75,\n    0x5BDE, 0x5BE7, 0x5BE1, 0x5BE5, 0x5BE6, 0x5BE8, 0x5BE2, 0x5BE4,\n    0x5BDF, 0x5C0D, 0x5C62, 0x5D84, 0x5D87, 0x5E5B, 0x5E63, 0x5E55,\n    0x5E57, 0x5E54, 0x5ED3, 0x5ED6, 0x5F0A, 0x5F46, 0x5F70, 0x5FB9,\n    0x6147, 0x613F, 0x614B, 0x6177, 0x6162, 0x6163, 0x615F, 0x615A,\n    0x6158, 0x6175, 0x622A, 0x6487, 0x6458, 0x6454, 0x64A4, 0x6478,\n    0x645F, 0x647A, 0x6451, 0x6467, 0x6434, 0x646D, 0x647B, 0x6572,\n    0x65A1, 0x65D7, 0x65D6, 0x66A2, 0x66A8, 0x669D, 0x699C, 0x69A8,\n    0x6995, 0x69C1, 0x69AE, 0x69D3, 0x69CB, 0x699B, 0x69B7, 0x69BB,\n    0x69AB, 0x69B4, 0x69D0, 0x69CD, 0x69AD, 0x69CC, 0x69A6, 0x69C3,\n    0x69A3, 0x6B49, 0x6B4C, 0x6C33, 0x6F33, 0x6F14, 0x6EFE, 0x6F13,\n    0x6EF4, 0x6F29, 0x6F3E, 0x6F20, 0x6F2C, 0x6F0F, 0x6F02, 0x6F22,\n    0x6EFF, 0x6EEF, 0x6F06, 0x6F31, 0x6F38, 0x6F32, 0x6F23, 0x6F15,\n    0x6F2B, 0x6F2F, 0x6F88, 0x6F2A, 0x6EEC, 0x6F01, 0x6EF2, 0x6ECC,\n    0x6EF7, 0x7194, 0x7199, 0x717D, 0x718A, 0x7184, 0x7192, 0x723E,\n    0x7292, 0x7296, 0x7344, 0x7350, 0x7464, 0x7463, 0x746A, 0x7470,\n    0x746D, 0x7504, 0x7591, 0x7627, 0x760D, 0x760B, 0x7609, 0x7613,\n    0x76E1, 0x76E3, 0x7784, 0x777D, 0x777F, 0x7761, 0x78C1, 0x789F,\n    0x78A7, 0x78B3, 0x78A9, 0x78A3, 0x798E, 0x798F, 0x798D, 0x7A2E,\n    0x7A31, 0x7AAA, 0x7AA9, 0x7AED, 0x7AEF, 0x7BA1, 0x7B95, 0x7B8B,\n    0x7B75, 0x7B97, 0x7B9D, 0x7B94, 0x7B8F, 0x7BB8, 0x7B87, 0x7B84,\n    0x7CB9, 0x7CBD, 0x7CBE, 0x7DBB, 0x7DB0, 0x7D9C, 0x7DBD, 0x7DBE,\n    0x7DA0, 0x7DCA, 0x7DB4, 0x7DB2, 0x7DB1, 0x7DBA, 0x7DA2, 0x7DBF,\n    0x7DB5, 0x7DB8, 0x7DAD, 0x7DD2, 0x7DC7, 0x7DAC, 0x7F70, 0x7FE0,\n    0x7FE1, 0x7FDF, 0x805E, 0x805A, 0x8087, 0x8150, 0x8180, 0x818F,\n    0x8188, 0x818A, 0x817F, 0x8182, 0x81E7, 0x81FA, 0x8207, 0x8214,\n    0x821E, 0x824B, 0x84C9, 0x84BF, 0x84C6, 0x84C4, 0x8499, 0x849E,\n    0x84B2, 0x849C, 0x84CB, 0x84B8, 0x84C0, 0x84D3, 0x8490, 0x84BC,\n    0x84D1, 0x84CA, 0x873F, 0x871C, 0x873B, 0x8722, 0x8725, 0x8734,\n    0x8718, 0x8755, 0x8737, 0x8729, 0x88F3, 0x8902, 0x88F4, 0x88F9,\n    0x88F8, 0x88FD, 0x88E8, 0x891A, 0x88EF, 0x8AA6, 0x8A8C, 0x8A9E,\n    0x8AA3, 0x8A8D, 0x8AA1, 0x8A93, 0x8AA4, 0x8AAA, 0x8AA5, 0x8AA8,\n    0x8A98, 0x8A91, 0x8A9A, 0x8AA7, 0x8C6A, 0x8C8D, 0x8C8C, 0x8CD3,\n    0x8CD1, 0x8CD2, 0x8D6B, 0x8D99, 0x8D95, 0x8DFC, 0x8F14, 0x8F12,\n    0x8F15, 0x8F13, 0x8FA3, 0x9060, 0x9058, 0x905C, 0x9063, 0x9059,\n    0x905E, 0x9062, 0x905D, 0x905B, 0x9119, 0x9118, 0x911E, 0x9175,\n    0x9178, 0x9177, 0x9174, 0x9278, 0x92AC, 0x9280, 0x9285, 0x9298,\n    0x9296, 0x927B, 0x9293, 0x929C, 0x92A8, 0x927C, 0x9291, 0x95A1,\n    0x95A8, 0x95A9, 0x95A3, 0x95A5, 0x95A4, 0x9699, 0x969C, 0x969B,\n    0x96CC, 0x96D2, 0x9700, 0x977C, 0x9785, 0x97F6, 0x9817, 0x9818,\n    0x98AF, 0x98B1, 0x9903, 0x9905, 0x990C, 0x9909, 0x99C1, 0x9AAF,\n    0x9AB0, 0x9AE6, 0x9B41, 0x9B42, 0x9CF4, 0x9CF6, 0x9CF3, 0x9EBC,\n    0x9F3B, 0x9F4A, 0x5104, 0x5100, 0x50FB, 0x50F5, 0x50F9, 0x5102,\n    0x5108, 0x5109, 0x5105, 0x51DC, 0x5287, 0x5288, 0x5289, 0x528D,\n    0x528A, 0x52F0, 0x53B2, 0x562E, 0x563B, 0x5639, 0x5632, 0x563F,\n    0x5634, 0x5629, 0x5653, 0x564E, 0x5657, 0x5674, 0x5636, 0x562F,\n    0x5630, 0x5880, 0x589F, 0x589E, 0x58B3, 0x589C, 0x58AE, 0x58A9,\n    0x58A6, 0x596D, 0x5B09, 0x5AFB, 0x5B0B, 0x5AF5, 0x5B0C, 0x5B08,\n    0x5BEE, 0x5BEC, 0x5BE9, 0x5BEB, 0x5C64, 0x5C65, 0x5D9D, 0x5D94,\n    0x5E62, 0x5E5F, 0x5E61, 0x5EE2, 0x5EDA, 0x5EDF, 0x5EDD, 0x5EE3,\n    0x5EE0, 0x5F48, 0x5F71, 0x5FB7, 0x5FB5, 0x6176, 0x6167, 0x616E,\n    0x615D, 0x6155, 0x6182, 0x617C, 0x6170, 0x616B, 0x617E, 0x61A7,\n    0x6190, 0x61AB, 0x618E, 0x61AC, 0x619A, 0x61A4, 0x6194, 0x61AE,\n    0x622E, 0x6469, 0x646F, 0x6479, 0x649E, 0x64B2, 0x6488, 0x6490,\n    0x64B0, 0x64A5, 0x6493, 0x6495, 0x64A9, 0x6492, 0x64AE, 0x64AD,\n    0x64AB, 0x649A, 0x64AC, 0x6499, 0x64A2, 0x64B3, 0x6575, 0x6577,\n    0x6578, 0x66AE, 0x66AB, 0x66B4, 0x66B1, 0x6A23, 0x6A1F, 0x69E8,\n    0x6A01, 0x6A1E, 0x6A19, 0x69FD, 0x6A21, 0x6A13, 0x6A0A, 0x69F3,\n    0x6A02, 0x6A05, 0x69ED, 0x6A11, 0x6B50, 0x6B4E, 0x6BA4, 0x6BC5,\n    0x6BC6, 0x6F3F, 0x6F7C, 0x6F84, 0x6F51, 0x6F66, 0x6F54, 0x6F86,\n    0x6F6D, 0x6F5B, 0x6F78, 0x6F6E, 0x6F8E, 0x6F7A, 0x6F70, 0x6F64,\n    0x6F97, 0x6F58, 0x6ED5, 0x6F6F, 0x6F60, 0x6F5F, 0x719F, 0x71AC,\n    0x71B1, 0x71A8, 0x7256, 0x729B, 0x734E, 0x7357, 0x7469, 0x748B,\n    0x7483, 0x747E, 0x7480, 0x757F, 0x7620, 0x7629, 0x761F, 0x7624,\n    0x7626, 0x7621, 0x7622, 0x769A, 0x76BA, 0x76E4, 0x778E, 0x7787,\n    0x778C, 0x7791, 0x778B, 0x78CB, 0x78C5, 0x78BA, 0x78CA, 0x78BE,\n    0x78D5, 0x78BC, 0x78D0, 0x7A3F, 0x7A3C, 0x7A40, 0x7A3D, 0x7A37,\n    0x7A3B, 0x7AAF, 0x7AAE, 0x7BAD, 0x7BB1, 0x7BC4, 0x7BB4, 0x7BC6,\n    0x7BC7, 0x7BC1, 0x7BA0, 0x7BCC, 0x7CCA, 0x7DE0, 0x7DF4, 0x7DEF,\n    0x7DFB, 0x7DD8, 0x7DEC, 0x7DDD, 0x7DE8, 0x7DE3, 0x7DDA, 0x7DDE,\n    0x7DE9, 0x7D9E, 0x7DD9, 0x7DF2, 0x7DF9, 0x7F75, 0x7F77, 0x7FAF,\n    0x7FE9, 0x8026, 0x819B, 0x819C, 0x819D, 0x81A0, 0x819A, 0x8198,\n    0x8517, 0x853D, 0x851A, 0x84EE, 0x852C, 0x852D, 0x8513, 0x8511,\n    0x8523, 0x8521, 0x8514, 0x84EC, 0x8525, 0x84FF, 0x8506, 0x8782,\n    0x8774, 0x8776, 0x8760, 0x8766, 0x8778, 0x8768, 0x8759, 0x8757,\n    0x874C, 0x8753, 0x885B, 0x885D, 0x8910, 0x8907, 0x8912, 0x8913,\n    0x8915, 0x890A, 0x8ABC, 0x8AD2, 0x8AC7, 0x8AC4, 0x8A95, 0x8ACB,\n    0x8AF8, 0x8AB2, 0x8AC9, 0x8AC2, 0x8ABF, 0x8AB0, 0x8AD6, 0x8ACD,\n    0x8AB6, 0x8AB9, 0x8ADB, 0x8C4C, 0x8C4E, 0x8C6C, 0x8CE0, 0x8CDE,\n    0x8CE6, 0x8CE4, 0x8CEC, 0x8CED, 0x8CE2, 0x8CE3, 0x8CDC, 0x8CEA,\n    0x8CE1, 0x8D6D, 0x8D9F, 0x8DA3, 0x8E2B, 0x8E10, 0x8E1D, 0x8E22,\n    0x8E0F, 0x8E29, 0x8E1F, 0x8E21, 0x8E1E, 0x8EBA, 0x8F1D, 0x8F1B,\n    0x8F1F, 0x8F29, 0x8F26, 0x8F2A, 0x8F1C, 0x8F1E, 0x8F25, 0x9069,\n    0x906E, 0x9068, 0x906D, 0x9077, 0x9130, 0x912D, 0x9127, 0x9131,\n    0x9187, 0x9189, 0x918B, 0x9183, 0x92C5, 0x92BB, 0x92B7, 0x92EA,\n    0x92E4, 0x92C1, 0x92B3, 0x92BC, 0x92D2, 0x92C7, 0x92F0, 0x92B2,\n    0x95AD, 0x95B1, 0x9704, 0x9706, 0x9707, 0x9709, 0x9760, 0x978D,\n    0x978B, 0x978F, 0x9821, 0x982B, 0x981C, 0x98B3, 0x990A, 0x9913,\n    0x9912, 0x9918, 0x99DD, 0x99D0, 0x99DF, 0x99DB, 0x99D1, 0x99D5,\n    0x99D2, 0x99D9, 0x9AB7, 0x9AEE, 0x9AEF, 0x9B27, 0x9B45, 0x9B44,\n    0x9B77, 0x9B6F, 0x9D06, 0x9D09, 0x9D03, 0x9EA9, 0x9EBE, 0x9ECE,\n    0x58A8, 0x9F52, 0x5112, 0x5118, 0x5114, 0x5110, 0x5115, 0x5180,\n    0x51AA, 0x51DD, 0x5291, 0x5293, 0x52F3, 0x5659, 0x566B, 0x5679,\n    0x5669, 0x5664, 0x5678, 0x566A, 0x5668, 0x5665, 0x5671, 0x566F,\n    0x566C, 0x5662, 0x5676, 0x58C1, 0x58BE, 0x58C7, 0x58C5, 0x596E,\n    0x5B1D, 0x5B34, 0x5B78, 0x5BF0, 0x5C0E, 0x5F4A, 0x61B2, 0x6191,\n    0x61A9, 0x618A, 0x61CD, 0x61B6, 0x61BE, 0x61CA, 0x61C8, 0x6230,\n    0x64C5, 0x64C1, 0x64CB, 0x64BB, 0x64BC, 0x64DA, 0x64C4, 0x64C7,\n    0x64C2, 0x64CD, 0x64BF, 0x64D2, 0x64D4, 0x64BE, 0x6574, 0x66C6,\n    0x66C9, 0x66B9, 0x66C4, 0x66C7, 0x66B8, 0x6A3D, 0x6A38, 0x6A3A,\n    0x6A59, 0x6A6B, 0x6A58, 0x6A39, 0x6A44, 0x6A62, 0x6A61, 0x6A4B,\n    0x6A47, 0x6A35, 0x6A5F, 0x6A48, 0x6B59, 0x6B77, 0x6C05, 0x6FC2,\n    0x6FB1, 0x6FA1, 0x6FC3, 0x6FA4, 0x6FC1, 0x6FA7, 0x6FB3, 0x6FC0,\n    0x6FB9, 0x6FB6, 0x6FA6, 0x6FA0, 0x6FB4, 0x71BE, 0x71C9, 0x71D0,\n    0x71D2, 0x71C8, 0x71D5, 0x71B9, 0x71CE, 0x71D9, 0x71DC, 0x71C3,\n    0x71C4, 0x7368, 0x749C, 0x74A3, 0x7498, 0x749F, 0x749E, 0x74E2,\n    0x750C, 0x750D, 0x7634, 0x7638, 0x763A, 0x76E7, 0x76E5, 0x77A0,\n    0x779E, 0x779F, 0x77A5, 0x78E8, 0x78DA, 0x78EC, 0x78E7, 0x79A6,\n    0x7A4D, 0x7A4E, 0x7A46, 0x7A4C, 0x7A4B, 0x7ABA, 0x7BD9, 0x7C11,\n    0x7BC9, 0x7BE4, 0x7BDB, 0x7BE1, 0x7BE9, 0x7BE6, 0x7CD5, 0x7CD6,\n    0x7E0A, 0x7E11, 0x7E08, 0x7E1B, 0x7E23, 0x7E1E, 0x7E1D, 0x7E09,\n    0x7E10, 0x7F79, 0x7FB2, 0x7FF0, 0x7FF1, 0x7FEE, 0x8028, 0x81B3,\n    0x81A9, 0x81A8, 0x81FB, 0x8208, 0x8258, 0x8259, 0x854A, 0x8559,\n    0x8548, 0x8568, 0x8569, 0x8543, 0x8549, 0x856D, 0x856A, 0x855E,\n    0x8783, 0x879F, 0x879E, 0x87A2, 0x878D, 0x8861, 0x892A, 0x8932,\n    0x8925, 0x892B, 0x8921, 0x89AA, 0x89A6, 0x8AE6, 0x8AFA, 0x8AEB,\n    0x8AF1, 0x8B00, 0x8ADC, 0x8AE7, 0x8AEE, 0x8AFE, 0x8B01, 0x8B02,\n    0x8AF7, 0x8AED, 0x8AF3, 0x8AF6, 0x8AFC, 0x8C6B, 0x8C6D, 0x8C93,\n    0x8CF4, 0x8E44, 0x8E31, 0x8E34, 0x8E42, 0x8E39, 0x8E35, 0x8F3B,\n    0x8F2F, 0x8F38, 0x8F33, 0x8FA8, 0x8FA6, 0x9075, 0x9074, 0x9078,\n    0x9072, 0x907C, 0x907A, 0x9134, 0x9192, 0x9320, 0x9336, 0x92F8,\n    0x9333, 0x932F, 0x9322, 0x92FC, 0x932B, 0x9304, 0x931A, 0x9310,\n    0x9326, 0x9321, 0x9315, 0x932E, 0x9319, 0x95BB, 0x96A7, 0x96A8,\n    0x96AA, 0x96D5, 0x970E, 0x9711, 0x9716, 0x970D, 0x9713, 0x970F,\n    0x975B, 0x975C, 0x9766, 0x9798, 0x9830, 0x9838, 0x983B, 0x9837,\n    0x982D, 0x9839, 0x9824, 0x9910, 0x9928, 0x991E, 0x991B, 0x9921,\n    0x991A, 0x99ED, 0x99E2, 0x99F1, 0x9AB8, 0x9ABC, 0x9AFB, 0x9AED,\n    0x9B28, 0x9B91, 0x9D15, 0x9D23, 0x9D26, 0x9D28, 0x9D12, 0x9D1B,\n    0x9ED8, 0x9ED4, 0x9F8D, 0x9F9C, 0x512A, 0x511F, 0x5121, 0x5132,\n    0x52F5, 0x568E, 0x5680, 0x5690, 0x5685, 0x5687, 0x568F, 0x58D5,\n    0x58D3, 0x58D1, 0x58CE, 0x5B30, 0x5B2A, 0x5B24, 0x5B7A, 0x5C37,\n    0x5C68, 0x5DBC, 0x5DBA, 0x5DBD, 0x5DB8, 0x5E6B, 0x5F4C, 0x5FBD,\n    0x61C9, 0x61C2, 0x61C7, 0x61E6, 0x61CB, 0x6232, 0x6234, 0x64CE,\n    0x64CA, 0x64D8, 0x64E0, 0x64F0, 0x64E6, 0x64EC, 0x64F1, 0x64E2,\n    0x64ED, 0x6582, 0x6583, 0x66D9, 0x66D6, 0x6A80, 0x6A94, 0x6A84,\n    0x6AA2, 0x6A9C, 0x6ADB, 0x6AA3, 0x6A7E, 0x6A97, 0x6A90, 0x6AA0,\n    0x6B5C, 0x6BAE, 0x6BDA, 0x6C08, 0x6FD8, 0x6FF1, 0x6FDF, 0x6FE0,\n    0x6FDB, 0x6FE4, 0x6FEB, 0x6FEF, 0x6F80, 0x6FEC, 0x6FE1, 0x6FE9,\n    0x6FD5, 0x6FEE, 0x6FF0, 0x71E7, 0x71DF, 0x71EE, 0x71E6, 0x71E5,\n    0x71ED, 0x71EC, 0x71F4, 0x71E0, 0x7235, 0x7246, 0x7370, 0x7372,\n    0x74A9, 0x74B0, 0x74A6, 0x74A8, 0x7646, 0x7642, 0x764C, 0x76EA,\n    0x77B3, 0x77AA, 0x77B0, 0x77AC, 0x77A7, 0x77AD, 0x77EF, 0x78F7,\n    0x78FA, 0x78F4, 0x78EF, 0x7901, 0x79A7, 0x79AA, 0x7A57, 0x7ABF,\n    0x7C07, 0x7C0D, 0x7BFE, 0x7BF7, 0x7C0C, 0x7BE0, 0x7CE0, 0x7CDC,\n    0x7CDE, 0x7CE2, 0x7CDF, 0x7CD9, 0x7CDD, 0x7E2E, 0x7E3E, 0x7E46,\n    0x7E37, 0x7E32, 0x7E43, 0x7E2B, 0x7E3D, 0x7E31, 0x7E45, 0x7E41,\n    0x7E34, 0x7E39, 0x7E48, 0x7E35, 0x7E3F, 0x7E2F, 0x7F44, 0x7FF3,\n    0x7FFC, 0x8071, 0x8072, 0x8070, 0x806F, 0x8073, 0x81C6, 0x81C3,\n    0x81BA, 0x81C2, 0x81C0, 0x81BF, 0x81BD, 0x81C9, 0x81BE, 0x81E8,\n    0x8209, 0x8271, 0x85AA, 0x8584, 0x857E, 0x859C, 0x8591, 0x8594,\n    0x85AF, 0x859B, 0x8587, 0x85A8, 0x858A, 0x85A6, 0x8667, 0x87C0,\n    0x87D1, 0x87B3, 0x87D2, 0x87C6, 0x87AB, 0x87BB, 0x87BA, 0x87C8,\n    0x87CB, 0x893B, 0x8936, 0x8944, 0x8938, 0x893D, 0x89AC, 0x8B0E,\n    0x8B17, 0x8B19, 0x8B1B, 0x8B0A, 0x8B20, 0x8B1D, 0x8B04, 0x8B10,\n    0x8C41, 0x8C3F, 0x8C73, 0x8CFA, 0x8CFD, 0x8CFC, 0x8CF8, 0x8CFB,\n    0x8DA8, 0x8E49, 0x8E4B, 0x8E48, 0x8E4A, 0x8F44, 0x8F3E, 0x8F42,\n    0x8F45, 0x8F3F, 0x907F, 0x907D, 0x9084, 0x9081, 0x9082, 0x9080,\n    0x9139, 0x91A3, 0x919E, 0x919C, 0x934D, 0x9382, 0x9328, 0x9375,\n    0x934A, 0x9365, 0x934B, 0x9318, 0x937E, 0x936C, 0x935B, 0x9370,\n    0x935A, 0x9354, 0x95CA, 0x95CB, 0x95CC, 0x95C8, 0x95C6, 0x96B1,\n    0x96B8, 0x96D6, 0x971C, 0x971E, 0x97A0, 0x97D3, 0x9846, 0x98B6,\n    0x9935, 0x9A01, 0x99FF, 0x9BAE, 0x9BAB, 0x9BAA, 0x9BAD, 0x9D3B,\n    0x9D3F, 0x9E8B, 0x9ECF, 0x9EDE, 0x9EDC, 0x9EDD, 0x9EDB, 0x9F3E,\n    0x9F4B, 0x53E2, 0x5695, 0x56AE, 0x58D9, 0x58D8, 0x5B38, 0x5F5D,\n    0x61E3, 0x6233, 0x64F4, 0x64F2, 0x64FE, 0x6506, 0x64FA, 0x64FB,\n    0x64F7, 0x65B7, 0x66DC, 0x6726, 0x6AB3, 0x6AAC, 0x6AC3, 0x6ABB,\n    0x6AB8, 0x6AC2, 0x6AAE, 0x6AAF, 0x6B5F, 0x6B78, 0x6BAF, 0x7009,\n    0x700B, 0x6FFE, 0x7006, 0x6FFA, 0x7011, 0x700F, 0x71FB, 0x71FC,\n    0x71FE, 0x71F8, 0x7377, 0x7375, 0x74A7, 0x74BF, 0x7515, 0x7656,\n    0x7658, 0x7652, 0x77BD, 0x77BF, 0x77BB, 0x77BC, 0x790E, 0x79AE,\n    0x7A61, 0x7A62, 0x7A60, 0x7AC4, 0x7AC5, 0x7C2B, 0x7C27, 0x7C2A,\n    0x7C1E, 0x7C23, 0x7C21, 0x7CE7, 0x7E54, 0x7E55, 0x7E5E, 0x7E5A,\n    0x7E61, 0x7E52, 0x7E59, 0x7F48, 0x7FF9, 0x7FFB, 0x8077, 0x8076,\n    0x81CD, 0x81CF, 0x820A, 0x85CF, 0x85A9, 0x85CD, 0x85D0, 0x85C9,\n    0x85B0, 0x85BA, 0x85B9, 0x87EF, 0x87EC, 0x87F2, 0x87E0, 0x8986,\n    0x89B2, 0x89F4, 0x8B28, 0x8B39, 0x8B2C, 0x8B2B, 0x8C50, 0x8D05,\n    0x8E59, 0x8E63, 0x8E66, 0x8E64, 0x8E5F, 0x8E55, 0x8EC0, 0x8F49,\n    0x8F4D, 0x9087, 0x9083, 0x9088, 0x91AB, 0x91AC, 0x91D0, 0x9394,\n    0x938A, 0x9396, 0x93A2, 0x93B3, 0x93AE, 0x93AC, 0x93B0, 0x9398,\n    0x939A, 0x9397, 0x95D4, 0x95D6, 0x95D0, 0x95D5, 0x96E2, 0x96DC,\n    0x96D9, 0x96DB, 0x96DE, 0x9724, 0x97A3, 0x97A6, 0x97AD, 0x97F9,\n    0x984D, 0x984F, 0x984C, 0x984E, 0x9853, 0x98BA, 0x993E, 0x993F,\n    0x993D, 0x992E, 0x99A5, 0x9A0E, 0x9AC1, 0x9B03, 0x9B06, 0x9B4F,\n    0x9B4E, 0x9B4D, 0x9BCA, 0x9BC9, 0x9BFD, 0x9BC8, 0x9BC0, 0x9D51,\n    0x9D5D, 0x9D60, 0x9EE0, 0x9F15, 0x9F2C, 0x5133, 0x56A5, 0x56A8,\n    0x58DE, 0x58DF, 0x58E2, 0x5BF5, 0x9F90, 0x5EEC, 0x61F2, 0x61F7,\n    0x61F6, 0x61F5, 0x6500, 0x650F, 0x66E0, 0x66DD, 0x6AE5, 0x6ADD,\n    0x6ADA, 0x6AD3, 0x701B, 0x701F, 0x7028, 0x701A, 0x701D, 0x7015,\n    0x7018, 0x7206, 0x720D, 0x7258, 0x72A2, 0x7378, 0x737A, 0x74BD,\n    0x74CA, 0x74E3, 0x7587, 0x7586, 0x765F, 0x7661, 0x77C7, 0x7919,\n    0x79B1, 0x7A6B, 0x7A69, 0x7C3E, 0x7C3F, 0x7C38, 0x7C3D, 0x7C37,\n    0x7C40, 0x7E6B, 0x7E6D, 0x7E79, 0x7E69, 0x7E6A, 0x7E73, 0x7F85,\n    0x7FB6, 0x7FB9, 0x7FB8, 0x81D8, 0x85E9, 0x85DD, 0x85EA, 0x85D5,\n    0x85E4, 0x85E5, 0x85F7, 0x87FB, 0x8805, 0x880D, 0x87F9, 0x87FE,\n    0x8960, 0x895F, 0x8956, 0x895E, 0x8B41, 0x8B5C, 0x8B58, 0x8B49,\n    0x8B5A, 0x8B4E, 0x8B4F, 0x8B46, 0x8B59, 0x8D08, 0x8D0A, 0x8E7C,\n    0x8E72, 0x8E87, 0x8E76, 0x8E6C, 0x8E7A, 0x8E74, 0x8F54, 0x8F4E,\n    0x8FAD, 0x908A, 0x908B, 0x91B1, 0x91AE, 0x93E1, 0x93D1, 0x93DF,\n    0x93C3, 0x93C8, 0x93DC, 0x93DD, 0x93D6, 0x93E2, 0x93CD, 0x93D8,\n    0x93E4, 0x93D7, 0x93E8, 0x95DC, 0x96B4, 0x96E3, 0x972A, 0x9727,\n    0x9761, 0x97DC, 0x97FB, 0x985E, 0x9858, 0x985B, 0x98BC, 0x9945,\n    0x9949, 0x9A16, 0x9A19, 0x9B0D, 0x9BE8, 0x9BE7, 0x9BD6, 0x9BDB,\n    0x9D89, 0x9D61, 0x9D72, 0x9D6A, 0x9D6C, 0x9E92, 0x9E97, 0x9E93,\n    0x9EB4, 0x52F8, 0x56B7, 0x56B6, 0x56B4, 0x56BC, 0x58E4, 0x5B40,\n    0x5B43, 0x5B7D, 0x5BF6, 0x5DC9, 0x61F8, 0x61FA, 0x6518, 0x6514,\n    0x6519, 0x66E6, 0x6727, 0x6AEC, 0x703E, 0x7030, 0x7032, 0x7210,\n    0x737B, 0x74CF, 0x7662, 0x7665, 0x7926, 0x792A, 0x792C, 0x792B,\n    0x7AC7, 0x7AF6, 0x7C4C, 0x7C43, 0x7C4D, 0x7CEF, 0x7CF0, 0x8FAE,\n    0x7E7D, 0x7E7C, 0x7E82, 0x7F4C, 0x8000, 0x81DA, 0x8266, 0x85FB,\n    0x85F9, 0x8611, 0x85FA, 0x8606, 0x860B, 0x8607, 0x860A, 0x8814,\n    0x8815, 0x8964, 0x89BA, 0x89F8, 0x8B70, 0x8B6C, 0x8B66, 0x8B6F,\n    0x8B5F, 0x8B6B, 0x8D0F, 0x8D0D, 0x8E89, 0x8E81, 0x8E85, 0x8E82,\n    0x91B4, 0x91CB, 0x9418, 0x9403, 0x93FD, 0x95E1, 0x9730, 0x98C4,\n    0x9952, 0x9951, 0x99A8, 0x9A2B, 0x9A30, 0x9A37, 0x9A35, 0x9C13,\n    0x9C0D, 0x9E79, 0x9EB5, 0x9EE8, 0x9F2F, 0x9F5F, 0x9F63, 0x9F61,\n    0x5137, 0x5138, 0x56C1, 0x56C0, 0x56C2, 0x5914, 0x5C6C, 0x5DCD,\n    0x61FC, 0x61FE, 0x651D, 0x651C, 0x6595, 0x66E9, 0x6AFB, 0x6B04,\n    0x6AFA, 0x6BB2, 0x704C, 0x721B, 0x72A7, 0x74D6, 0x74D4, 0x7669,\n    0x77D3, 0x7C50, 0x7E8F, 0x7E8C, 0x7FBC, 0x8617, 0x862D, 0x861A,\n    0x8823, 0x8822, 0x8821, 0x881F, 0x896A, 0x896C, 0x89BD, 0x8B74,\n    0x8B77, 0x8B7D, 0x8D13, 0x8E8A, 0x8E8D, 0x8E8B, 0x8F5F, 0x8FAF,\n    0x91BA, 0x942E, 0x9433, 0x9435, 0x943A, 0x9438, 0x9432, 0x942B,\n    0x95E2, 0x9738, 0x9739, 0x9732, 0x97FF, 0x9867, 0x9865, 0x9957,\n    0x9A45, 0x9A43, 0x9A40, 0x9A3E, 0x9ACF, 0x9B54, 0x9B51, 0x9C2D,\n    0x9C25, 0x9DAF, 0x9DB4, 0x9DC2, 0x9DB8, 0x9E9D, 0x9EEF, 0x9F19,\n    0x9F5C, 0x9F66, 0x9F67, 0x513C, 0x513B, 0x56C8, 0x56CA, 0x56C9,\n    0x5B7F, 0x5DD4, 0x5DD2, 0x5F4E, 0x61FF, 0x6524, 0x6B0A, 0x6B61,\n    0x7051, 0x7058, 0x7380, 0x74E4, 0x758A, 0x766E, 0x766C, 0x79B3,\n    0x7C60, 0x7C5F, 0x807E, 0x807D, 0x81DF, 0x8972, 0x896F, 0x89FC,\n    0x8B80, 0x8D16, 0x8D17, 0x8E91, 0x8E93, 0x8F61, 0x9148, 0x9444,\n    0x9451, 0x9452, 0x973D, 0x973E, 0x97C3, 0x97C1, 0x986B, 0x9955,\n    0x9A55, 0x9A4D, 0x9AD2, 0x9B1A, 0x9C49, 0x9C31, 0x9C3E, 0x9C3B,\n    0x9DD3, 0x9DD7, 0x9F34, 0x9F6C, 0x9F6A, 0x9F94, 0x56CC, 0x5DD6,\n    0x6200, 0x6523, 0x652B, 0x652A, 0x66EC, 0x6B10, 0x74DA, 0x7ACA,\n    0x7C64, 0x7C63, 0x7C65, 0x7E93, 0x7E96, 0x7E94, 0x81E2, 0x8638,\n    0x863F, 0x8831, 0x8B8A, 0x9090, 0x908F, 0x9463, 0x9460, 0x9464,\n    0x9768, 0x986F, 0x995C, 0x9A5A, 0x9A5B, 0x9A57, 0x9AD3, 0x9AD4,\n    0x9AD1, 0x9C54, 0x9C57, 0x9C56, 0x9DE5, 0x9E9F, 0x9EF4, 0x56D1,\n    0x58E9, 0x652C, 0x705E, 0x7671, 0x7672, 0x77D7, 0x7F50, 0x7F88,\n    0x8836, 0x8839, 0x8862, 0x8B93, 0x8B92, 0x8B96, 0x8277, 0x8D1B,\n    0x91C0, 0x946A, 0x9742, 0x9748, 0x9744, 0x97C6, 0x9870, 0x9A5F,\n    0x9B22, 0x9B58, 0x9C5F, 0x9DF9, 0x9DFA, 0x9E7C, 0x9E7D, 0x9F07,\n    0x9F77, 0x9F72, 0x5EF3, 0x6B16, 0x7063, 0x7C6C, 0x7C6E, 0x883B,\n    0x89C0, 0x8EA1, 0x91C1, 0x9472, 0x9470, 0x9871, 0x995E, 0x9AD6,\n    0x9B23, 0x9ECC, 0x7064, 0x77DA, 0x8B9A, 0x9477, 0x97C9, 0x9A62,\n    0x9A65, 0x7E9C, 0x8B9C, 0x8EAA, 0x91C5, 0x947D, 0x947E, 0x947C,\n    0x9C77, 0x9C78, 0x9EF7, 0x8C54, 0x947F, 0x9E1A, 0x7228, 0x9A6A,\n    0x9B31, 0x9E1B, 0x9E1E, 0x7C72, 0x4E42, 0x4E5C, 0x51F5, 0x531A,\n    0x5382, 0x4E07, 0x4E0C, 0x4E47, 0x4E8D, 0x56D7, 0x5C6E, 0x5F73,\n    0x4E0F, 0x5187, 0x4E0E, 0x4E2E, 0x4E93, 0x4EC2, 0x4EC9, 0x4EC8,\n    0x5198, 0x52FC, 0x536C, 0x53B9, 0x5720, 0x5903, 0x592C, 0x5C10,\n    0x5DFF, 0x65E1, 0x6BB3, 0x6BCC, 0x6C14, 0x723F, 0x4E31, 0x4E3C,\n    0x4EE8, 0x4EDC, 0x4EE9, 0x4EE1, 0x4EDD, 0x4EDA, 0x520C, 0x5209,\n    0x531C, 0x534C, 0x5722, 0x5723, 0x5917, 0x592F, 0x5B81, 0x5B84,\n    0x5C12, 0x5C3B, 0x5C74, 0x5C73, 0x5E04, 0x5E80, 0x5E82, 0x5FC9,\n    0x6209, 0x6250, 0x6C15, 0x6C36, 0x6C43, 0x6C3F, 0x6C3B, 0x72AE,\n    0x72B0, 0x738A, 0x79B8, 0x808A, 0x961E, 0x4F0E, 0x4F18, 0x4F2C,\n    0x4EF5, 0x4F14, 0x4EF1, 0x4F00, 0x4EF7, 0x4F08, 0x4F1D, 0x4F02,\n    0x4F05, 0x4F22, 0x4F13, 0x4F04, 0x4EF4, 0x4F12, 0x51B1, 0x5213,\n    0x5210, 0x52A6, 0x5322, 0x531F, 0x534D, 0x538A, 0x5407, 0x56E1,\n    0x56DF, 0x572E, 0x572A, 0x5734, 0x593C, 0x5980, 0x597C, 0x5985,\n    0x597B, 0x597E, 0x5977, 0x597F, 0x5B56, 0x5C15, 0x5C25, 0x5C7C,\n    0x5C7A, 0x5C7B, 0x5C7E, 0x5DDF, 0x5E75, 0x5E84, 0x5F02, 0x5F1A,\n    0x5F74, 0x5FD5, 0x5FD4, 0x5FCF, 0x625C, 0x625E, 0x6264, 0x6261,\n    0x6266, 0x6262, 0x6259, 0x6260, 0x625A, 0x6265, 0x6537, 0x65EF,\n    0x65EE, 0x673E, 0x6739, 0x6738, 0x673B, 0x673A, 0x673F, 0x673C,\n    0x6733, 0x6C18, 0x6C46, 0x6C52, 0x6C5C, 0x6C4F, 0x6C4A, 0x6C54,\n    0x6C4B, 0x6C4C, 0x7071, 0x725E, 0x72B4, 0x72B5, 0x738E, 0x752A,\n    0x767F, 0x7A75, 0x7F51, 0x8278, 0x827C, 0x8280, 0x827D, 0x827F,\n    0x864D, 0x897E, 0x9099, 0x9097, 0x9098, 0x909B, 0x9094, 0x9622,\n    0x9624, 0x9620, 0x9623, 0x4F56, 0x4F3B, 0x4F62, 0x4F49, 0x4F53,\n    0x4F64, 0x4F3E, 0x4F67, 0x4F52, 0x4F5F, 0x4F41, 0x4F58, 0x4F2D,\n    0x4F33, 0x4F3F, 0x4F61, 0x518F, 0x51B9, 0x521C, 0x521E, 0x5221,\n    0x52AD, 0x52AE, 0x5309, 0x5363, 0x5372, 0x538E, 0x538F, 0x5430,\n    0x5437, 0x542A, 0x5454, 0x5445, 0x5419, 0x541C, 0x5425, 0x5418,\n    0x543D, 0x544F, 0x5441, 0x5428, 0x5424, 0x5447, 0x56EE, 0x56E7,\n    0x56E5, 0x5741, 0x5745, 0x574C, 0x5749, 0x574B, 0x5752, 0x5906,\n    0x5940, 0x59A6, 0x5998, 0x59A0, 0x5997, 0x598E, 0x59A2, 0x5990,\n    0x598F, 0x59A7, 0x59A1, 0x5B8E, 0x5B92, 0x5C28, 0x5C2A, 0x5C8D,\n    0x5C8F, 0x5C88, 0x5C8B, 0x5C89, 0x5C92, 0x5C8A, 0x5C86, 0x5C93,\n    0x5C95, 0x5DE0, 0x5E0A, 0x5E0E, 0x5E8B, 0x5E89, 0x5E8C, 0x5E88,\n    0x5E8D, 0x5F05, 0x5F1D, 0x5F78, 0x5F76, 0x5FD2, 0x5FD1, 0x5FD0,\n    0x5FED, 0x5FE8, 0x5FEE, 0x5FF3, 0x5FE1, 0x5FE4, 0x5FE3, 0x5FFA,\n    0x5FEF, 0x5FF7, 0x5FFB, 0x6000, 0x5FF4, 0x623A, 0x6283, 0x628C,\n    0x628E, 0x628F, 0x6294, 0x6287, 0x6271, 0x627B, 0x627A, 0x6270,\n    0x6281, 0x6288, 0x6277, 0x627D, 0x6272, 0x6274, 0x65F0, 0x65F4,\n    0x65F3, 0x65F2, 0x65F5, 0x6745, 0x6747, 0x6759, 0x6755, 0x674C,\n    0x6748, 0x675D, 0x674D, 0x675A, 0x674B, 0x6BD0, 0x6C19, 0x6C1A,\n    0x6C78, 0x6C67, 0x6C6B, 0x6C84, 0x6C8B, 0x6C8F, 0x6C71, 0x6C6F,\n    0x6C69, 0x6C9A, 0x6C6D, 0x6C87, 0x6C95, 0x6C9C, 0x6C66, 0x6C73,\n    0x6C65, 0x6C7B, 0x6C8E, 0x7074, 0x707A, 0x7263, 0x72BF, 0x72BD,\n    0x72C3, 0x72C6, 0x72C1, 0x72BA, 0x72C5, 0x7395, 0x7397, 0x7393,\n    0x7394, 0x7392, 0x753A, 0x7539, 0x7594, 0x7595, 0x7681, 0x793D,\n    0x8034, 0x8095, 0x8099, 0x8090, 0x8092, 0x809C, 0x8290, 0x828F,\n    0x8285, 0x828E, 0x8291, 0x8293, 0x828A, 0x8283, 0x8284, 0x8C78,\n    0x8FC9, 0x8FBF, 0x909F, 0x90A1, 0x90A5, 0x909E, 0x90A7, 0x90A0,\n    0x9630, 0x9628, 0x962F, 0x962D, 0x4E33, 0x4F98, 0x4F7C, 0x4F85,\n    0x4F7D, 0x4F80, 0x4F87, 0x4F76, 0x4F74, 0x4F89, 0x4F84, 0x4F77,\n    0x4F4C, 0x4F97, 0x4F6A, 0x4F9A, 0x4F79, 0x4F81, 0x4F78, 0x4F90,\n    0x4F9C, 0x4F94, 0x4F9E, 0x4F92, 0x4F82, 0x4F95, 0x4F6B, 0x4F6E,\n    0x519E, 0x51BC, 0x51BE, 0x5235, 0x5232, 0x5233, 0x5246, 0x5231,\n    0x52BC, 0x530A, 0x530B, 0x533C, 0x5392, 0x5394, 0x5487, 0x547F,\n    0x5481, 0x5491, 0x5482, 0x5488, 0x546B, 0x547A, 0x547E, 0x5465,\n    0x546C, 0x5474, 0x5466, 0x548D, 0x546F, 0x5461, 0x5460, 0x5498,\n    0x5463, 0x5467, 0x5464, 0x56F7, 0x56F9, 0x576F, 0x5772, 0x576D,\n    0x576B, 0x5771, 0x5770, 0x5776, 0x5780, 0x5775, 0x577B, 0x5773,\n    0x5774, 0x5762, 0x5768, 0x577D, 0x590C, 0x5945, 0x59B5, 0x59BA,\n    0x59CF, 0x59CE, 0x59B2, 0x59CC, 0x59C1, 0x59B6, 0x59BC, 0x59C3,\n    0x59D6, 0x59B1, 0x59BD, 0x59C0, 0x59C8, 0x59B4, 0x59C7, 0x5B62,\n    0x5B65, 0x5B93, 0x5B95, 0x5C44, 0x5C47, 0x5CAE, 0x5CA4, 0x5CA0,\n    0x5CB5, 0x5CAF, 0x5CA8, 0x5CAC, 0x5C9F, 0x5CA3, 0x5CAD, 0x5CA2,\n    0x5CAA, 0x5CA7, 0x5C9D, 0x5CA5, 0x5CB6, 0x5CB0, 0x5CA6, 0x5E17,\n    0x5E14, 0x5E19, 0x5F28, 0x5F22, 0x5F23, 0x5F24, 0x5F54, 0x5F82,\n    0x5F7E, 0x5F7D, 0x5FDE, 0x5FE5, 0x602D, 0x6026, 0x6019, 0x6032,\n    0x600B, 0x6034, 0x600A, 0x6017, 0x6033, 0x601A, 0x601E, 0x602C,\n    0x6022, 0x600D, 0x6010, 0x602E, 0x6013, 0x6011, 0x600C, 0x6009,\n    0x601C, 0x6214, 0x623D, 0x62AD, 0x62B4, 0x62D1, 0x62BE, 0x62AA,\n    0x62B6, 0x62CA, 0x62AE, 0x62B3, 0x62AF, 0x62BB, 0x62A9, 0x62B0,\n    0x62B8, 0x653D, 0x65A8, 0x65BB, 0x6609, 0x65FC, 0x6604, 0x6612,\n    0x6608, 0x65FB, 0x6603, 0x660B, 0x660D, 0x6605, 0x65FD, 0x6611,\n    0x6610, 0x66F6, 0x670A, 0x6785, 0x676C, 0x678E, 0x6792, 0x6776,\n    0x677B, 0x6798, 0x6786, 0x6784, 0x6774, 0x678D, 0x678C, 0x677A,\n    0x679F, 0x6791, 0x6799, 0x6783, 0x677D, 0x6781, 0x6778, 0x6779,\n    0x6794, 0x6B25, 0x6B80, 0x6B7E, 0x6BDE, 0x6C1D, 0x6C93, 0x6CEC,\n    0x6CEB, 0x6CEE, 0x6CD9, 0x6CB6, 0x6CD4, 0x6CAD, 0x6CE7, 0x6CB7,\n    0x6CD0, 0x6CC2, 0x6CBA, 0x6CC3, 0x6CC6, 0x6CED, 0x6CF2, 0x6CD2,\n    0x6CDD, 0x6CB4, 0x6C8A, 0x6C9D, 0x6C80, 0x6CDE, 0x6CC0, 0x6D30,\n    0x6CCD, 0x6CC7, 0x6CB0, 0x6CF9, 0x6CCF, 0x6CE9, 0x6CD1, 0x7094,\n    0x7098, 0x7085, 0x7093, 0x7086, 0x7084, 0x7091, 0x7096, 0x7082,\n    0x709A, 0x7083, 0x726A, 0x72D6, 0x72CB, 0x72D8, 0x72C9, 0x72DC,\n    0x72D2, 0x72D4, 0x72DA, 0x72CC, 0x72D1, 0x73A4, 0x73A1, 0x73AD,\n    0x73A6, 0x73A2, 0x73A0, 0x73AC, 0x739D, 0x74DD, 0x74E8, 0x753F,\n    0x7540, 0x753E, 0x758C, 0x7598, 0x76AF, 0x76F3, 0x76F1, 0x76F0,\n    0x76F5, 0x77F8, 0x77FC, 0x77F9, 0x77FB, 0x77FA, 0x77F7, 0x7942,\n    0x793F, 0x79C5, 0x7A78, 0x7A7B, 0x7AFB, 0x7C75, 0x7CFD, 0x8035,\n    0x808F, 0x80AE, 0x80A3, 0x80B8, 0x80B5, 0x80AD, 0x8220, 0x82A0,\n    0x82C0, 0x82AB, 0x829A, 0x8298, 0x829B, 0x82B5, 0x82A7, 0x82AE,\n    0x82BC, 0x829E, 0x82BA, 0x82B4, 0x82A8, 0x82A1, 0x82A9, 0x82C2,\n    0x82A4, 0x82C3, 0x82B6, 0x82A2, 0x8670, 0x866F, 0x866D, 0x866E,\n    0x8C56, 0x8FD2, 0x8FCB, 0x8FD3, 0x8FCD, 0x8FD6, 0x8FD5, 0x8FD7,\n    0x90B2, 0x90B4, 0x90AF, 0x90B3, 0x90B0, 0x9639, 0x963D, 0x963C,\n    0x963A, 0x9643, 0x4FCD, 0x4FC5, 0x4FD3, 0x4FB2, 0x4FC9, 0x4FCB,\n    0x4FC1, 0x4FD4, 0x4FDC, 0x4FD9, 0x4FBB, 0x4FB3, 0x4FDB, 0x4FC7,\n    0x4FD6, 0x4FBA, 0x4FC0, 0x4FB9, 0x4FEC, 0x5244, 0x5249, 0x52C0,\n    0x52C2, 0x533D, 0x537C, 0x5397, 0x5396, 0x5399, 0x5398, 0x54BA,\n    0x54A1, 0x54AD, 0x54A5, 0x54CF, 0x54C3, 0x830D, 0x54B7, 0x54AE,\n    0x54D6, 0x54B6, 0x54C5, 0x54C6, 0x54A0, 0x5470, 0x54BC, 0x54A2,\n    0x54BE, 0x5472, 0x54DE, 0x54B0, 0x57B5, 0x579E, 0x579F, 0x57A4,\n    0x578C, 0x5797, 0x579D, 0x579B, 0x5794, 0x5798, 0x578F, 0x5799,\n    0x57A5, 0x579A, 0x5795, 0x58F4, 0x590D, 0x5953, 0x59E1, 0x59DE,\n    0x59EE, 0x5A00, 0x59F1, 0x59DD, 0x59FA, 0x59FD, 0x59FC, 0x59F6,\n    0x59E4, 0x59F2, 0x59F7, 0x59DB, 0x59E9, 0x59F3, 0x59F5, 0x59E0,\n    0x59FE, 0x59F4, 0x59ED, 0x5BA8, 0x5C4C, 0x5CD0, 0x5CD8, 0x5CCC,\n    0x5CD7, 0x5CCB, 0x5CDB, 0x5CDE, 0x5CDA, 0x5CC9, 0x5CC7, 0x5CCA,\n    0x5CD6, 0x5CD3, 0x5CD4, 0x5CCF, 0x5CC8, 0x5CC6, 0x5CCE, 0x5CDF,\n    0x5CF8, 0x5DF9, 0x5E21, 0x5E22, 0x5E23, 0x5E20, 0x5E24, 0x5EB0,\n    0x5EA4, 0x5EA2, 0x5E9B, 0x5EA3, 0x5EA5, 0x5F07, 0x5F2E, 0x5F56,\n    0x5F86, 0x6037, 0x6039, 0x6054, 0x6072, 0x605E, 0x6045, 0x6053,\n    0x6047, 0x6049, 0x605B, 0x604C, 0x6040, 0x6042, 0x605F, 0x6024,\n    0x6044, 0x6058, 0x6066, 0x606E, 0x6242, 0x6243, 0x62CF, 0x630D,\n    0x630B, 0x62F5, 0x630E, 0x6303, 0x62EB, 0x62F9, 0x630F, 0x630C,\n    0x62F8, 0x62F6, 0x6300, 0x6313, 0x6314, 0x62FA, 0x6315, 0x62FB,\n    0x62F0, 0x6541, 0x6543, 0x65AA, 0x65BF, 0x6636, 0x6621, 0x6632,\n    0x6635, 0x661C, 0x6626, 0x6622, 0x6633, 0x662B, 0x663A, 0x661D,\n    0x6634, 0x6639, 0x662E, 0x670F, 0x6710, 0x67C1, 0x67F2, 0x67C8,\n    0x67BA, 0x67DC, 0x67BB, 0x67F8, 0x67D8, 0x67C0, 0x67B7, 0x67C5,\n    0x67EB, 0x67E4, 0x67DF, 0x67B5, 0x67CD, 0x67B3, 0x67F7, 0x67F6,\n    0x67EE, 0x67E3, 0x67C2, 0x67B9, 0x67CE, 0x67E7, 0x67F0, 0x67B2,\n    0x67FC, 0x67C6, 0x67ED, 0x67CC, 0x67AE, 0x67E6, 0x67DB, 0x67FA,\n    0x67C9, 0x67CA, 0x67C3, 0x67EA, 0x67CB, 0x6B28, 0x6B82, 0x6B84,\n    0x6BB6, 0x6BD6, 0x6BD8, 0x6BE0, 0x6C20, 0x6C21, 0x6D28, 0x6D34,\n    0x6D2D, 0x6D1F, 0x6D3C, 0x6D3F, 0x6D12, 0x6D0A, 0x6CDA, 0x6D33,\n    0x6D04, 0x6D19, 0x6D3A, 0x6D1A, 0x6D11, 0x6D00, 0x6D1D, 0x6D42,\n    0x6D01, 0x6D18, 0x6D37, 0x6D03, 0x6D0F, 0x6D40, 0x6D07, 0x6D20,\n    0x6D2C, 0x6D08, 0x6D22, 0x6D09, 0x6D10, 0x70B7, 0x709F, 0x70BE,\n    0x70B1, 0x70B0, 0x70A1, 0x70B4, 0x70B5, 0x70A9, 0x7241, 0x7249,\n    0x724A, 0x726C, 0x7270, 0x7273, 0x726E, 0x72CA, 0x72E4, 0x72E8,\n    0x72EB, 0x72DF, 0x72EA, 0x72E6, 0x72E3, 0x7385, 0x73CC, 0x73C2,\n    0x73C8, 0x73C5, 0x73B9, 0x73B6, 0x73B5, 0x73B4, 0x73EB, 0x73BF,\n    0x73C7, 0x73BE, 0x73C3, 0x73C6, 0x73B8, 0x73CB, 0x74EC, 0x74EE,\n    0x752E, 0x7547, 0x7548, 0x75A7, 0x75AA, 0x7679, 0x76C4, 0x7708,\n    0x7703, 0x7704, 0x7705, 0x770A, 0x76F7, 0x76FB, 0x76FA, 0x77E7,\n    0x77E8, 0x7806, 0x7811, 0x7812, 0x7805, 0x7810, 0x780F, 0x780E,\n    0x7809, 0x7803, 0x7813, 0x794A, 0x794C, 0x794B, 0x7945, 0x7944,\n    0x79D5, 0x79CD, 0x79CF, 0x79D6, 0x79CE, 0x7A80, 0x7A7E, 0x7AD1,\n    0x7B00, 0x7B01, 0x7C7A, 0x7C78, 0x7C79, 0x7C7F, 0x7C80, 0x7C81,\n    0x7D03, 0x7D08, 0x7D01, 0x7F58, 0x7F91, 0x7F8D, 0x7FBE, 0x8007,\n    0x800E, 0x800F, 0x8014, 0x8037, 0x80D8, 0x80C7, 0x80E0, 0x80D1,\n    0x80C8, 0x80C2, 0x80D0, 0x80C5, 0x80E3, 0x80D9, 0x80DC, 0x80CA,\n    0x80D5, 0x80C9, 0x80CF, 0x80D7, 0x80E6, 0x80CD, 0x81FF, 0x8221,\n    0x8294, 0x82D9, 0x82FE, 0x82F9, 0x8307, 0x82E8, 0x8300, 0x82D5,\n    0x833A, 0x82EB, 0x82D6, 0x82F4, 0x82EC, 0x82E1, 0x82F2, 0x82F5,\n    0x830C, 0x82FB, 0x82F6, 0x82F0, 0x82EA, 0x82E4, 0x82E0, 0x82FA,\n    0x82F3, 0x82ED, 0x8677, 0x8674, 0x867C, 0x8673, 0x8841, 0x884E,\n    0x8867, 0x886A, 0x8869, 0x89D3, 0x8A04, 0x8A07, 0x8D72, 0x8FE3,\n    0x8FE1, 0x8FEE, 0x8FE0, 0x90F1, 0x90BD, 0x90BF, 0x90D5, 0x90C5,\n    0x90BE, 0x90C7, 0x90CB, 0x90C8, 0x91D4, 0x91D3, 0x9654, 0x964F,\n    0x9651, 0x9653, 0x964A, 0x964E, 0x501E, 0x5005, 0x5007, 0x5013,\n    0x5022, 0x5030, 0x501B, 0x4FF5, 0x4FF4, 0x5033, 0x5037, 0x502C,\n    0x4FF6, 0x4FF7, 0x5017, 0x501C, 0x5020, 0x5027, 0x5035, 0x502F,\n    0x5031, 0x500E, 0x515A, 0x5194, 0x5193, 0x51CA, 0x51C4, 0x51C5,\n    0x51C8, 0x51CE, 0x5261, 0x525A, 0x5252, 0x525E, 0x525F, 0x5255,\n    0x5262, 0x52CD, 0x530E, 0x539E, 0x5526, 0x54E2, 0x5517, 0x5512,\n    0x54E7, 0x54F3, 0x54E4, 0x551A, 0x54FF, 0x5504, 0x5508, 0x54EB,\n    0x5511, 0x5505, 0x54F1, 0x550A, 0x54FB, 0x54F7, 0x54F8, 0x54E0,\n    0x550E, 0x5503, 0x550B, 0x5701, 0x5702, 0x57CC, 0x5832, 0x57D5,\n    0x57D2, 0x57BA, 0x57C6, 0x57BD, 0x57BC, 0x57B8, 0x57B6, 0x57BF,\n    0x57C7, 0x57D0, 0x57B9, 0x57C1, 0x590E, 0x594A, 0x5A19, 0x5A16,\n    0x5A2D, 0x5A2E, 0x5A15, 0x5A0F, 0x5A17, 0x5A0A, 0x5A1E, 0x5A33,\n    0x5B6C, 0x5BA7, 0x5BAD, 0x5BAC, 0x5C03, 0x5C56, 0x5C54, 0x5CEC,\n    0x5CFF, 0x5CEE, 0x5CF1, 0x5CF7, 0x5D00, 0x5CF9, 0x5E29, 0x5E28,\n    0x5EA8, 0x5EAE, 0x5EAA, 0x5EAC, 0x5F33, 0x5F30, 0x5F67, 0x605D,\n    0x605A, 0x6067, 0x6041, 0x60A2, 0x6088, 0x6080, 0x6092, 0x6081,\n    0x609D, 0x6083, 0x6095, 0x609B, 0x6097, 0x6087, 0x609C, 0x608E,\n    0x6219, 0x6246, 0x62F2, 0x6310, 0x6356, 0x632C, 0x6344, 0x6345,\n    0x6336, 0x6343, 0x63E4, 0x6339, 0x634B, 0x634A, 0x633C, 0x6329,\n    0x6341, 0x6334, 0x6358, 0x6354, 0x6359, 0x632D, 0x6347, 0x6333,\n    0x635A, 0x6351, 0x6338, 0x6357, 0x6340, 0x6348, 0x654A, 0x6546,\n    0x65C6, 0x65C3, 0x65C4, 0x65C2, 0x664A, 0x665F, 0x6647, 0x6651,\n    0x6712, 0x6713, 0x681F, 0x681A, 0x6849, 0x6832, 0x6833, 0x683B,\n    0x684B, 0x684F, 0x6816, 0x6831, 0x681C, 0x6835, 0x682B, 0x682D,\n    0x682F, 0x684E, 0x6844, 0x6834, 0x681D, 0x6812, 0x6814, 0x6826,\n    0x6828, 0x682E, 0x684D, 0x683A, 0x6825, 0x6820, 0x6B2C, 0x6B2F,\n    0x6B2D, 0x6B31, 0x6B34, 0x6B6D, 0x8082, 0x6B88, 0x6BE6, 0x6BE4,\n    0x6BE8, 0x6BE3, 0x6BE2, 0x6BE7, 0x6C25, 0x6D7A, 0x6D63, 0x6D64,\n    0x6D76, 0x6D0D, 0x6D61, 0x6D92, 0x6D58, 0x6D62, 0x6D6D, 0x6D6F,\n    0x6D91, 0x6D8D, 0x6DEF, 0x6D7F, 0x6D86, 0x6D5E, 0x6D67, 0x6D60,\n    0x6D97, 0x6D70, 0x6D7C, 0x6D5F, 0x6D82, 0x6D98, 0x6D2F, 0x6D68,\n    0x6D8B, 0x6D7E, 0x6D80, 0x6D84, 0x6D16, 0x6D83, 0x6D7B, 0x6D7D,\n    0x6D75, 0x6D90, 0x70DC, 0x70D3, 0x70D1, 0x70DD, 0x70CB, 0x7F39,\n    0x70E2, 0x70D7, 0x70D2, 0x70DE, 0x70E0, 0x70D4, 0x70CD, 0x70C5,\n    0x70C6, 0x70C7, 0x70DA, 0x70CE, 0x70E1, 0x7242, 0x7278, 0x7277,\n    0x7276, 0x7300, 0x72FA, 0x72F4, 0x72FE, 0x72F6, 0x72F3, 0x72FB,\n    0x7301, 0x73D3, 0x73D9, 0x73E5, 0x73D6, 0x73BC, 0x73E7, 0x73E3,\n    0x73E9, 0x73DC, 0x73D2, 0x73DB, 0x73D4, 0x73DD, 0x73DA, 0x73D7,\n    0x73D8, 0x73E8, 0x74DE, 0x74DF, 0x74F4, 0x74F5, 0x7521, 0x755B,\n    0x755F, 0x75B0, 0x75C1, 0x75BB, 0x75C4, 0x75C0, 0x75BF, 0x75B6,\n    0x75BA, 0x768A, 0x76C9, 0x771D, 0x771B, 0x7710, 0x7713, 0x7712,\n    0x7723, 0x7711, 0x7715, 0x7719, 0x771A, 0x7722, 0x7727, 0x7823,\n    0x782C, 0x7822, 0x7835, 0x782F, 0x7828, 0x782E, 0x782B, 0x7821,\n    0x7829, 0x7833, 0x782A, 0x7831, 0x7954, 0x795B, 0x794F, 0x795C,\n    0x7953, 0x7952, 0x7951, 0x79EB, 0x79EC, 0x79E0, 0x79EE, 0x79ED,\n    0x79EA, 0x79DC, 0x79DE, 0x79DD, 0x7A86, 0x7A89, 0x7A85, 0x7A8B,\n    0x7A8C, 0x7A8A, 0x7A87, 0x7AD8, 0x7B10, 0x7B04, 0x7B13, 0x7B05,\n    0x7B0F, 0x7B08, 0x7B0A, 0x7B0E, 0x7B09, 0x7B12, 0x7C84, 0x7C91,\n    0x7C8A, 0x7C8C, 0x7C88, 0x7C8D, 0x7C85, 0x7D1E, 0x7D1D, 0x7D11,\n    0x7D0E, 0x7D18, 0x7D16, 0x7D13, 0x7D1F, 0x7D12, 0x7D0F, 0x7D0C,\n    0x7F5C, 0x7F61, 0x7F5E, 0x7F60, 0x7F5D, 0x7F5B, 0x7F96, 0x7F92,\n    0x7FC3, 0x7FC2, 0x7FC0, 0x8016, 0x803E, 0x8039, 0x80FA, 0x80F2,\n    0x80F9, 0x80F5, 0x8101, 0x80FB, 0x8100, 0x8201, 0x822F, 0x8225,\n    0x8333, 0x832D, 0x8344, 0x8319, 0x8351, 0x8325, 0x8356, 0x833F,\n    0x8341, 0x8326, 0x831C, 0x8322, 0x8342, 0x834E, 0x831B, 0x832A,\n    0x8308, 0x833C, 0x834D, 0x8316, 0x8324, 0x8320, 0x8337, 0x832F,\n    0x8329, 0x8347, 0x8345, 0x834C, 0x8353, 0x831E, 0x832C, 0x834B,\n    0x8327, 0x8348, 0x8653, 0x8652, 0x86A2, 0x86A8, 0x8696, 0x868D,\n    0x8691, 0x869E, 0x8687, 0x8697, 0x8686, 0x868B, 0x869A, 0x8685,\n    0x86A5, 0x8699, 0x86A1, 0x86A7, 0x8695, 0x8698, 0x868E, 0x869D,\n    0x8690, 0x8694, 0x8843, 0x8844, 0x886D, 0x8875, 0x8876, 0x8872,\n    0x8880, 0x8871, 0x887F, 0x886F, 0x8883, 0x887E, 0x8874, 0x887C,\n    0x8A12, 0x8C47, 0x8C57, 0x8C7B, 0x8CA4, 0x8CA3, 0x8D76, 0x8D78,\n    0x8DB5, 0x8DB7, 0x8DB6, 0x8ED1, 0x8ED3, 0x8FFE, 0x8FF5, 0x9002,\n    0x8FFF, 0x8FFB, 0x9004, 0x8FFC, 0x8FF6, 0x90D6, 0x90E0, 0x90D9,\n    0x90DA, 0x90E3, 0x90DF, 0x90E5, 0x90D8, 0x90DB, 0x90D7, 0x90DC,\n    0x90E4, 0x9150, 0x914E, 0x914F, 0x91D5, 0x91E2, 0x91DA, 0x965C,\n    0x965F, 0x96BC, 0x98E3, 0x9ADF, 0x9B2F, 0x4E7F, 0x5070, 0x506A,\n    0x5061, 0x505E, 0x5060, 0x5053, 0x504B, 0x505D, 0x5072, 0x5048,\n    0x504D, 0x5041, 0x505B, 0x504A, 0x5062, 0x5015, 0x5045, 0x505F,\n    0x5069, 0x506B, 0x5063, 0x5064, 0x5046, 0x5040, 0x506E, 0x5073,\n    0x5057, 0x5051, 0x51D0, 0x526B, 0x526D, 0x526C, 0x526E, 0x52D6,\n    0x52D3, 0x532D, 0x539C, 0x5575, 0x5576, 0x553C, 0x554D, 0x5550,\n    0x5534, 0x552A, 0x5551, 0x5562, 0x5536, 0x5535, 0x5530, 0x5552,\n    0x5545, 0x550C, 0x5532, 0x5565, 0x554E, 0x5539, 0x5548, 0x552D,\n    0x553B, 0x5540, 0x554B, 0x570A, 0x5707, 0x57FB, 0x5814, 0x57E2,\n    0x57F6, 0x57DC, 0x57F4, 0x5800, 0x57ED, 0x57FD, 0x5808, 0x57F8,\n    0x580B, 0x57F3, 0x57CF, 0x5807, 0x57EE, 0x57E3, 0x57F2, 0x57E5,\n    0x57EC, 0x57E1, 0x580E, 0x57FC, 0x5810, 0x57E7, 0x5801, 0x580C,\n    0x57F1, 0x57E9, 0x57F0, 0x580D, 0x5804, 0x595C, 0x5A60, 0x5A58,\n    0x5A55, 0x5A67, 0x5A5E, 0x5A38, 0x5A35, 0x5A6D, 0x5A50, 0x5A5F,\n    0x5A65, 0x5A6C, 0x5A53, 0x5A64, 0x5A57, 0x5A43, 0x5A5D, 0x5A52,\n    0x5A44, 0x5A5B, 0x5A48, 0x5A8E, 0x5A3E, 0x5A4D, 0x5A39, 0x5A4C,\n    0x5A70, 0x5A69, 0x5A47, 0x5A51, 0x5A56, 0x5A42, 0x5A5C, 0x5B72,\n    0x5B6E, 0x5BC1, 0x5BC0, 0x5C59, 0x5D1E, 0x5D0B, 0x5D1D, 0x5D1A,\n    0x5D20, 0x5D0C, 0x5D28, 0x5D0D, 0x5D26, 0x5D25, 0x5D0F, 0x5D30,\n    0x5D12, 0x5D23, 0x5D1F, 0x5D2E, 0x5E3E, 0x5E34, 0x5EB1, 0x5EB4,\n    0x5EB9, 0x5EB2, 0x5EB3, 0x5F36, 0x5F38, 0x5F9B, 0x5F96, 0x5F9F,\n    0x608A, 0x6090, 0x6086, 0x60BE, 0x60B0, 0x60BA, 0x60D3, 0x60D4,\n    0x60CF, 0x60E4, 0x60D9, 0x60DD, 0x60C8, 0x60B1, 0x60DB, 0x60B7,\n    0x60CA, 0x60BF, 0x60C3, 0x60CD, 0x60C0, 0x6332, 0x6365, 0x638A,\n    0x6382, 0x637D, 0x63BD, 0x639E, 0x63AD, 0x639D, 0x6397, 0x63AB,\n    0x638E, 0x636F, 0x6387, 0x6390, 0x636E, 0x63AF, 0x6375, 0x639C,\n    0x636D, 0x63AE, 0x637C, 0x63A4, 0x633B, 0x639F, 0x6378, 0x6385,\n    0x6381, 0x6391, 0x638D, 0x6370, 0x6553, 0x65CD, 0x6665, 0x6661,\n    0x665B, 0x6659, 0x665C, 0x6662, 0x6718, 0x6879, 0x6887, 0x6890,\n    0x689C, 0x686D, 0x686E, 0x68AE, 0x68AB, 0x6956, 0x686F, 0x68A3,\n    0x68AC, 0x68A9, 0x6875, 0x6874, 0x68B2, 0x688F, 0x6877, 0x6892,\n    0x687C, 0x686B, 0x6872, 0x68AA, 0x6880, 0x6871, 0x687E, 0x689B,\n    0x6896, 0x688B, 0x68A0, 0x6889, 0x68A4, 0x6878, 0x687B, 0x6891,\n    0x688C, 0x688A, 0x687D, 0x6B36, 0x6B33, 0x6B37, 0x6B38, 0x6B91,\n    0x6B8F, 0x6B8D, 0x6B8E, 0x6B8C, 0x6C2A, 0x6DC0, 0x6DAB, 0x6DB4,\n    0x6DB3, 0x6E74, 0x6DAC, 0x6DE9, 0x6DE2, 0x6DB7, 0x6DF6, 0x6DD4,\n    0x6E00, 0x6DC8, 0x6DE0, 0x6DDF, 0x6DD6, 0x6DBE, 0x6DE5, 0x6DDC,\n    0x6DDD, 0x6DDB, 0x6DF4, 0x6DCA, 0x6DBD, 0x6DED, 0x6DF0, 0x6DBA,\n    0x6DD5, 0x6DC2, 0x6DCF, 0x6DC9, 0x6DD0, 0x6DF2, 0x6DD3, 0x6DFD,\n    0x6DD7, 0x6DCD, 0x6DE3, 0x6DBB, 0x70FA, 0x710D, 0x70F7, 0x7117,\n    0x70F4, 0x710C, 0x70F0, 0x7104, 0x70F3, 0x7110, 0x70FC, 0x70FF,\n    0x7106, 0x7113, 0x7100, 0x70F8, 0x70F6, 0x710B, 0x7102, 0x710E,\n    0x727E, 0x727B, 0x727C, 0x727F, 0x731D, 0x7317, 0x7307, 0x7311,\n    0x7318, 0x730A, 0x7308, 0x72FF, 0x730F, 0x731E, 0x7388, 0x73F6,\n    0x73F8, 0x73F5, 0x7404, 0x7401, 0x73FD, 0x7407, 0x7400, 0x73FA,\n    0x73FC, 0x73FF, 0x740C, 0x740B, 0x73F4, 0x7408, 0x7564, 0x7563,\n    0x75CE, 0x75D2, 0x75CF, 0x75CB, 0x75CC, 0x75D1, 0x75D0, 0x768F,\n    0x7689, 0x76D3, 0x7739, 0x772F, 0x772D, 0x7731, 0x7732, 0x7734,\n    0x7733, 0x773D, 0x7725, 0x773B, 0x7735, 0x7848, 0x7852, 0x7849,\n    0x784D, 0x784A, 0x784C, 0x7826, 0x7845, 0x7850, 0x7964, 0x7967,\n    0x7969, 0x796A, 0x7963, 0x796B, 0x7961, 0x79BB, 0x79FA, 0x79F8,\n    0x79F6, 0x79F7, 0x7A8F, 0x7A94, 0x7A90, 0x7B35, 0x7B3B, 0x7B34,\n    0x7B25, 0x7B30, 0x7B22, 0x7B24, 0x7B33, 0x7B18, 0x7B2A, 0x7B1D,\n    0x7B31, 0x7B2B, 0x7B2D, 0x7B2F, 0x7B32, 0x7B38, 0x7B1A, 0x7B23,\n    0x7C94, 0x7C98, 0x7C96, 0x7CA3, 0x7D35, 0x7D3D, 0x7D38, 0x7D36,\n    0x7D3A, 0x7D45, 0x7D2C, 0x7D29, 0x7D41, 0x7D47, 0x7D3E, 0x7D3F,\n    0x7D4A, 0x7D3B, 0x7D28, 0x7F63, 0x7F95, 0x7F9C, 0x7F9D, 0x7F9B,\n    0x7FCA, 0x7FCB, 0x7FCD, 0x7FD0, 0x7FD1, 0x7FC7, 0x7FCF, 0x7FC9,\n    0x801F, 0x801E, 0x801B, 0x8047, 0x8043, 0x8048, 0x8118, 0x8125,\n    0x8119, 0x811B, 0x812D, 0x811F, 0x812C, 0x811E, 0x8121, 0x8115,\n    0x8127, 0x811D, 0x8122, 0x8211, 0x8238, 0x8233, 0x823A, 0x8234,\n    0x8232, 0x8274, 0x8390, 0x83A3, 0x83A8, 0x838D, 0x837A, 0x8373,\n    0x83A4, 0x8374, 0x838F, 0x8381, 0x8395, 0x8399, 0x8375, 0x8394,\n    0x83A9, 0x837D, 0x8383, 0x838C, 0x839D, 0x839B, 0x83AA, 0x838B,\n    0x837E, 0x83A5, 0x83AF, 0x8388, 0x8397, 0x83B0, 0x837F, 0x83A6,\n    0x8387, 0x83AE, 0x8376, 0x8659, 0x8656, 0x86BF, 0x86B7, 0x86C2,\n    0x86C1, 0x86C5, 0x86BA, 0x86B0, 0x86C8, 0x86B9, 0x86B3, 0x86B8,\n    0x86CC, 0x86B4, 0x86BB, 0x86BC, 0x86C3, 0x86BD, 0x86BE, 0x8852,\n    0x8889, 0x8895, 0x88A8, 0x88A2, 0x88AA, 0x889A, 0x8891, 0x88A1,\n    0x889F, 0x8898, 0x88A7, 0x8899, 0x889B, 0x8897, 0x88A4, 0x88AC,\n    0x888C, 0x8893, 0x888E, 0x8982, 0x89D6, 0x89D9, 0x89D5, 0x8A30,\n    0x8A27, 0x8A2C, 0x8A1E, 0x8C39, 0x8C3B, 0x8C5C, 0x8C5D, 0x8C7D,\n    0x8CA5, 0x8D7D, 0x8D7B, 0x8D79, 0x8DBC, 0x8DC2, 0x8DB9, 0x8DBF,\n    0x8DC1, 0x8ED8, 0x8EDE, 0x8EDD, 0x8EDC, 0x8ED7, 0x8EE0, 0x8EE1,\n    0x9024, 0x900B, 0x9011, 0x901C, 0x900C, 0x9021, 0x90EF, 0x90EA,\n    0x90F0, 0x90F4, 0x90F2, 0x90F3, 0x90D4, 0x90EB, 0x90EC, 0x90E9,\n    0x9156, 0x9158, 0x915A, 0x9153, 0x9155, 0x91EC, 0x91F4, 0x91F1,\n    0x91F3, 0x91F8, 0x91E4, 0x91F9, 0x91EA, 0x91EB, 0x91F7, 0x91E8,\n    0x91EE, 0x957A, 0x9586, 0x9588, 0x967C, 0x966D, 0x966B, 0x9671,\n    0x966F, 0x96BF, 0x976A, 0x9804, 0x98E5, 0x9997, 0x509B, 0x5095,\n    0x5094, 0x509E, 0x508B, 0x50A3, 0x5083, 0x508C, 0x508E, 0x509D,\n    0x5068, 0x509C, 0x5092, 0x5082, 0x5087, 0x515F, 0x51D4, 0x5312,\n    0x5311, 0x53A4, 0x53A7, 0x5591, 0x55A8, 0x55A5, 0x55AD, 0x5577,\n    0x5645, 0x55A2, 0x5593, 0x5588, 0x558F, 0x55B5, 0x5581, 0x55A3,\n    0x5592, 0x55A4, 0x557D, 0x558C, 0x55A6, 0x557F, 0x5595, 0x55A1,\n    0x558E, 0x570C, 0x5829, 0x5837, 0x5819, 0x581E, 0x5827, 0x5823,\n    0x5828, 0x57F5, 0x5848, 0x5825, 0x581C, 0x581B, 0x5833, 0x583F,\n    0x5836, 0x582E, 0x5839, 0x5838, 0x582D, 0x582C, 0x583B, 0x5961,\n    0x5AAF, 0x5A94, 0x5A9F, 0x5A7A, 0x5AA2, 0x5A9E, 0x5A78, 0x5AA6,\n    0x5A7C, 0x5AA5, 0x5AAC, 0x5A95, 0x5AAE, 0x5A37, 0x5A84, 0x5A8A,\n    0x5A97, 0x5A83, 0x5A8B, 0x5AA9, 0x5A7B, 0x5A7D, 0x5A8C, 0x5A9C,\n    0x5A8F, 0x5A93, 0x5A9D, 0x5BEA, 0x5BCD, 0x5BCB, 0x5BD4, 0x5BD1,\n    0x5BCA, 0x5BCE, 0x5C0C, 0x5C30, 0x5D37, 0x5D43, 0x5D6B, 0x5D41,\n    0x5D4B, 0x5D3F, 0x5D35, 0x5D51, 0x5D4E, 0x5D55, 0x5D33, 0x5D3A,\n    0x5D52, 0x5D3D, 0x5D31, 0x5D59, 0x5D42, 0x5D39, 0x5D49, 0x5D38,\n    0x5D3C, 0x5D32, 0x5D36, 0x5D40, 0x5D45, 0x5E44, 0x5E41, 0x5F58,\n    0x5FA6, 0x5FA5, 0x5FAB, 0x60C9, 0x60B9, 0x60CC, 0x60E2, 0x60CE,\n    0x60C4, 0x6114, 0x60F2, 0x610A, 0x6116, 0x6105, 0x60F5, 0x6113,\n    0x60F8, 0x60FC, 0x60FE, 0x60C1, 0x6103, 0x6118, 0x611D, 0x6110,\n    0x60FF, 0x6104, 0x610B, 0x624A, 0x6394, 0x63B1, 0x63B0, 0x63CE,\n    0x63E5, 0x63E8, 0x63EF, 0x63C3, 0x649D, 0x63F3, 0x63CA, 0x63E0,\n    0x63F6, 0x63D5, 0x63F2, 0x63F5, 0x6461, 0x63DF, 0x63BE, 0x63DD,\n    0x63DC, 0x63C4, 0x63D8, 0x63D3, 0x63C2, 0x63C7, 0x63CC, 0x63CB,\n    0x63C8, 0x63F0, 0x63D7, 0x63D9, 0x6532, 0x6567, 0x656A, 0x6564,\n    0x655C, 0x6568, 0x6565, 0x658C, 0x659D, 0x659E, 0x65AE, 0x65D0,\n    0x65D2, 0x667C, 0x666C, 0x667B, 0x6680, 0x6671, 0x6679, 0x666A,\n    0x6672, 0x6701, 0x690C, 0x68D3, 0x6904, 0x68DC, 0x692A, 0x68EC,\n    0x68EA, 0x68F1, 0x690F, 0x68D6, 0x68F7, 0x68EB, 0x68E4, 0x68F6,\n    0x6913, 0x6910, 0x68F3, 0x68E1, 0x6907, 0x68CC, 0x6908, 0x6970,\n    0x68B4, 0x6911, 0x68EF, 0x68C6, 0x6914, 0x68F8, 0x68D0, 0x68FD,\n    0x68FC, 0x68E8, 0x690B, 0x690A, 0x6917, 0x68CE, 0x68C8, 0x68DD,\n    0x68DE, 0x68E6, 0x68F4, 0x68D1, 0x6906, 0x68D4, 0x68E9, 0x6915,\n    0x6925, 0x68C7, 0x6B39, 0x6B3B, 0x6B3F, 0x6B3C, 0x6B94, 0x6B97,\n    0x6B99, 0x6B95, 0x6BBD, 0x6BF0, 0x6BF2, 0x6BF3, 0x6C30, 0x6DFC,\n    0x6E46, 0x6E47, 0x6E1F, 0x6E49, 0x6E88, 0x6E3C, 0x6E3D, 0x6E45,\n    0x6E62, 0x6E2B, 0x6E3F, 0x6E41, 0x6E5D, 0x6E73, 0x6E1C, 0x6E33,\n    0x6E4B, 0x6E40, 0x6E51, 0x6E3B, 0x6E03, 0x6E2E, 0x6E5E, 0x6E68,\n    0x6E5C, 0x6E61, 0x6E31, 0x6E28, 0x6E60, 0x6E71, 0x6E6B, 0x6E39,\n    0x6E22, 0x6E30, 0x6E53, 0x6E65, 0x6E27, 0x6E78, 0x6E64, 0x6E77,\n    0x6E55, 0x6E79, 0x6E52, 0x6E66, 0x6E35, 0x6E36, 0x6E5A, 0x7120,\n    0x711E, 0x712F, 0x70FB, 0x712E, 0x7131, 0x7123, 0x7125, 0x7122,\n    0x7132, 0x711F, 0x7128, 0x713A, 0x711B, 0x724B, 0x725A, 0x7288,\n    0x7289, 0x7286, 0x7285, 0x728B, 0x7312, 0x730B, 0x7330, 0x7322,\n    0x7331, 0x7333, 0x7327, 0x7332, 0x732D, 0x7326, 0x7323, 0x7335,\n    0x730C, 0x742E, 0x742C, 0x7430, 0x742B, 0x7416, 0x741A, 0x7421,\n    0x742D, 0x7431, 0x7424, 0x7423, 0x741D, 0x7429, 0x7420, 0x7432,\n    0x74FB, 0x752F, 0x756F, 0x756C, 0x75E7, 0x75DA, 0x75E1, 0x75E6,\n    0x75DD, 0x75DF, 0x75E4, 0x75D7, 0x7695, 0x7692, 0x76DA, 0x7746,\n    0x7747, 0x7744, 0x774D, 0x7745, 0x774A, 0x774E, 0x774B, 0x774C,\n    0x77DE, 0x77EC, 0x7860, 0x7864, 0x7865, 0x785C, 0x786D, 0x7871,\n    0x786A, 0x786E, 0x7870, 0x7869, 0x7868, 0x785E, 0x7862, 0x7974,\n    0x7973, 0x7972, 0x7970, 0x7A02, 0x7A0A, 0x7A03, 0x7A0C, 0x7A04,\n    0x7A99, 0x7AE6, 0x7AE4, 0x7B4A, 0x7B47, 0x7B44, 0x7B48, 0x7B4C,\n    0x7B4E, 0x7B40, 0x7B58, 0x7B45, 0x7CA2, 0x7C9E, 0x7CA8, 0x7CA1,\n    0x7D58, 0x7D6F, 0x7D63, 0x7D53, 0x7D56, 0x7D67, 0x7D6A, 0x7D4F,\n    0x7D6D, 0x7D5C, 0x7D6B, 0x7D52, 0x7D54, 0x7D69, 0x7D51, 0x7D5F,\n    0x7D4E, 0x7F3E, 0x7F3F, 0x7F65, 0x7F66, 0x7FA2, 0x7FA0, 0x7FA1,\n    0x7FD7, 0x8051, 0x804F, 0x8050, 0x80FE, 0x80D4, 0x8143, 0x814A,\n    0x8152, 0x814F, 0x8147, 0x813D, 0x814D, 0x813A, 0x81E6, 0x81EE,\n    0x81F7, 0x81F8, 0x81F9, 0x8204, 0x823C, 0x823D, 0x823F, 0x8275,\n    0x833B, 0x83CF, 0x83F9, 0x8423, 0x83C0, 0x83E8, 0x8412, 0x83E7,\n    0x83E4, 0x83FC, 0x83F6, 0x8410, 0x83C6, 0x83C8, 0x83EB, 0x83E3,\n    0x83BF, 0x8401, 0x83DD, 0x83E5, 0x83D8, 0x83FF, 0x83E1, 0x83CB,\n    0x83CE, 0x83D6, 0x83F5, 0x83C9, 0x8409, 0x840F, 0x83DE, 0x8411,\n    0x8406, 0x83C2, 0x83F3, 0x83D5, 0x83FA, 0x83C7, 0x83D1, 0x83EA,\n    0x8413, 0x839A, 0x83C3, 0x83EC, 0x83EE, 0x83C4, 0x83FB, 0x83D7,\n    0x83E2, 0x841B, 0x83DB, 0x83FE, 0x86D8, 0x86E2, 0x86E6, 0x86D3,\n    0x86E3, 0x86DA, 0x86EA, 0x86DD, 0x86EB, 0x86DC, 0x86EC, 0x86E9,\n    0x86D7, 0x86E8, 0x86D1, 0x8848, 0x8856, 0x8855, 0x88BA, 0x88D7,\n    0x88B9, 0x88B8, 0x88C0, 0x88BE, 0x88B6, 0x88BC, 0x88B7, 0x88BD,\n    0x88B2, 0x8901, 0x88C9, 0x8995, 0x8998, 0x8997, 0x89DD, 0x89DA,\n    0x89DB, 0x8A4E, 0x8A4D, 0x8A39, 0x8A59, 0x8A40, 0x8A57, 0x8A58,\n    0x8A44, 0x8A45, 0x8A52, 0x8A48, 0x8A51, 0x8A4A, 0x8A4C, 0x8A4F,\n    0x8C5F, 0x8C81, 0x8C80, 0x8CBA, 0x8CBE, 0x8CB0, 0x8CB9, 0x8CB5,\n    0x8D84, 0x8D80, 0x8D89, 0x8DD8, 0x8DD3, 0x8DCD, 0x8DC7, 0x8DD6,\n    0x8DDC, 0x8DCF, 0x8DD5, 0x8DD9, 0x8DC8, 0x8DD7, 0x8DC5, 0x8EEF,\n    0x8EF7, 0x8EFA, 0x8EF9, 0x8EE6, 0x8EEE, 0x8EE5, 0x8EF5, 0x8EE7,\n    0x8EE8, 0x8EF6, 0x8EEB, 0x8EF1, 0x8EEC, 0x8EF4, 0x8EE9, 0x902D,\n    0x9034, 0x902F, 0x9106, 0x912C, 0x9104, 0x90FF, 0x90FC, 0x9108,\n    0x90F9, 0x90FB, 0x9101, 0x9100, 0x9107, 0x9105, 0x9103, 0x9161,\n    0x9164, 0x915F, 0x9162, 0x9160, 0x9201, 0x920A, 0x9225, 0x9203,\n    0x921A, 0x9226, 0x920F, 0x920C, 0x9200, 0x9212, 0x91FF, 0x91FD,\n    0x9206, 0x9204, 0x9227, 0x9202, 0x921C, 0x9224, 0x9219, 0x9217,\n    0x9205, 0x9216, 0x957B, 0x958D, 0x958C, 0x9590, 0x9687, 0x967E,\n    0x9688, 0x9689, 0x9683, 0x9680, 0x96C2, 0x96C8, 0x96C3, 0x96F1,\n    0x96F0, 0x976C, 0x9770, 0x976E, 0x9807, 0x98A9, 0x98EB, 0x9CE6,\n    0x9EF9, 0x4E83, 0x4E84, 0x4EB6, 0x50BD, 0x50BF, 0x50C6, 0x50AE,\n    0x50C4, 0x50CA, 0x50B4, 0x50C8, 0x50C2, 0x50B0, 0x50C1, 0x50BA,\n    0x50B1, 0x50CB, 0x50C9, 0x50B6, 0x50B8, 0x51D7, 0x527A, 0x5278,\n    0x527B, 0x527C, 0x55C3, 0x55DB, 0x55CC, 0x55D0, 0x55CB, 0x55CA,\n    0x55DD, 0x55C0, 0x55D4, 0x55C4, 0x55E9, 0x55BF, 0x55D2, 0x558D,\n    0x55CF, 0x55D5, 0x55E2, 0x55D6, 0x55C8, 0x55F2, 0x55CD, 0x55D9,\n    0x55C2, 0x5714, 0x5853, 0x5868, 0x5864, 0x584F, 0x584D, 0x5849,\n    0x586F, 0x5855, 0x584E, 0x585D, 0x5859, 0x5865, 0x585B, 0x583D,\n    0x5863, 0x5871, 0x58FC, 0x5AC7, 0x5AC4, 0x5ACB, 0x5ABA, 0x5AB8,\n    0x5AB1, 0x5AB5, 0x5AB0, 0x5ABF, 0x5AC8, 0x5ABB, 0x5AC6, 0x5AB7,\n    0x5AC0, 0x5ACA, 0x5AB4, 0x5AB6, 0x5ACD, 0x5AB9, 0x5A90, 0x5BD6,\n    0x5BD8, 0x5BD9, 0x5C1F, 0x5C33, 0x5D71, 0x5D63, 0x5D4A, 0x5D65,\n    0x5D72, 0x5D6C, 0x5D5E, 0x5D68, 0x5D67, 0x5D62, 0x5DF0, 0x5E4F,\n    0x5E4E, 0x5E4A, 0x5E4D, 0x5E4B, 0x5EC5, 0x5ECC, 0x5EC6, 0x5ECB,\n    0x5EC7, 0x5F40, 0x5FAF, 0x5FAD, 0x60F7, 0x6149, 0x614A, 0x612B,\n    0x6145, 0x6136, 0x6132, 0x612E, 0x6146, 0x612F, 0x614F, 0x6129,\n    0x6140, 0x6220, 0x9168, 0x6223, 0x6225, 0x6224, 0x63C5, 0x63F1,\n    0x63EB, 0x6410, 0x6412, 0x6409, 0x6420, 0x6424, 0x6433, 0x6443,\n    0x641F, 0x6415, 0x6418, 0x6439, 0x6437, 0x6422, 0x6423, 0x640C,\n    0x6426, 0x6430, 0x6428, 0x6441, 0x6435, 0x642F, 0x640A, 0x641A,\n    0x6440, 0x6425, 0x6427, 0x640B, 0x63E7, 0x641B, 0x642E, 0x6421,\n    0x640E, 0x656F, 0x6592, 0x65D3, 0x6686, 0x668C, 0x6695, 0x6690,\n    0x668B, 0x668A, 0x6699, 0x6694, 0x6678, 0x6720, 0x6966, 0x695F,\n    0x6938, 0x694E, 0x6962, 0x6971, 0x693F, 0x6945, 0x696A, 0x6939,\n    0x6942, 0x6957, 0x6959, 0x697A, 0x6948, 0x6949, 0x6935, 0x696C,\n    0x6933, 0x693D, 0x6965, 0x68F0, 0x6978, 0x6934, 0x6969, 0x6940,\n    0x696F, 0x6944, 0x6976, 0x6958, 0x6941, 0x6974, 0x694C, 0x693B,\n    0x694B, 0x6937, 0x695C, 0x694F, 0x6951, 0x6932, 0x6952, 0x692F,\n    0x697B, 0x693C, 0x6B46, 0x6B45, 0x6B43, 0x6B42, 0x6B48, 0x6B41,\n    0x6B9B, 0x6BFB, 0x6BFC, 0x6BF9, 0x6BF7, 0x6BF8, 0x6E9B, 0x6ED6,\n    0x6EC8, 0x6E8F, 0x6EC0, 0x6E9F, 0x6E93, 0x6E94, 0x6EA0, 0x6EB1,\n    0x6EB9, 0x6EC6, 0x6ED2, 0x6EBD, 0x6EC1, 0x6E9E, 0x6EC9, 0x6EB7,\n    0x6EB0, 0x6ECD, 0x6EA6, 0x6ECF, 0x6EB2, 0x6EBE, 0x6EC3, 0x6EDC,\n    0x6ED8, 0x6E99, 0x6E92, 0x6E8E, 0x6E8D, 0x6EA4, 0x6EA1, 0x6EBF,\n    0x6EB3, 0x6ED0, 0x6ECA, 0x6E97, 0x6EAE, 0x6EA3, 0x7147, 0x7154,\n    0x7152, 0x7163, 0x7160, 0x7141, 0x715D, 0x7162, 0x7172, 0x7178,\n    0x716A, 0x7161, 0x7142, 0x7158, 0x7143, 0x714B, 0x7170, 0x715F,\n    0x7150, 0x7153, 0x7144, 0x714D, 0x715A, 0x724F, 0x728D, 0x728C,\n    0x7291, 0x7290, 0x728E, 0x733C, 0x7342, 0x733B, 0x733A, 0x7340,\n    0x734A, 0x7349, 0x7444, 0x744A, 0x744B, 0x7452, 0x7451, 0x7457,\n    0x7440, 0x744F, 0x7450, 0x744E, 0x7442, 0x7446, 0x744D, 0x7454,\n    0x74E1, 0x74FF, 0x74FE, 0x74FD, 0x751D, 0x7579, 0x7577, 0x6983,\n    0x75EF, 0x760F, 0x7603, 0x75F7, 0x75FE, 0x75FC, 0x75F9, 0x75F8,\n    0x7610, 0x75FB, 0x75F6, 0x75ED, 0x75F5, 0x75FD, 0x7699, 0x76B5,\n    0x76DD, 0x7755, 0x775F, 0x7760, 0x7752, 0x7756, 0x775A, 0x7769,\n    0x7767, 0x7754, 0x7759, 0x776D, 0x77E0, 0x7887, 0x789A, 0x7894,\n    0x788F, 0x7884, 0x7895, 0x7885, 0x7886, 0x78A1, 0x7883, 0x7879,\n    0x7899, 0x7880, 0x7896, 0x787B, 0x797C, 0x7982, 0x797D, 0x7979,\n    0x7A11, 0x7A18, 0x7A19, 0x7A12, 0x7A17, 0x7A15, 0x7A22, 0x7A13,\n    0x7A1B, 0x7A10, 0x7AA3, 0x7AA2, 0x7A9E, 0x7AEB, 0x7B66, 0x7B64,\n    0x7B6D, 0x7B74, 0x7B69, 0x7B72, 0x7B65, 0x7B73, 0x7B71, 0x7B70,\n    0x7B61, 0x7B78, 0x7B76, 0x7B63, 0x7CB2, 0x7CB4, 0x7CAF, 0x7D88,\n    0x7D86, 0x7D80, 0x7D8D, 0x7D7F, 0x7D85, 0x7D7A, 0x7D8E, 0x7D7B,\n    0x7D83, 0x7D7C, 0x7D8C, 0x7D94, 0x7D84, 0x7D7D, 0x7D92, 0x7F6D,\n    0x7F6B, 0x7F67, 0x7F68, 0x7F6C, 0x7FA6, 0x7FA5, 0x7FA7, 0x7FDB,\n    0x7FDC, 0x8021, 0x8164, 0x8160, 0x8177, 0x815C, 0x8169, 0x815B,\n    0x8162, 0x8172, 0x6721, 0x815E, 0x8176, 0x8167, 0x816F, 0x8144,\n    0x8161, 0x821D, 0x8249, 0x8244, 0x8240, 0x8242, 0x8245, 0x84F1,\n    0x843F, 0x8456, 0x8476, 0x8479, 0x848F, 0x848D, 0x8465, 0x8451,\n    0x8440, 0x8486, 0x8467, 0x8430, 0x844D, 0x847D, 0x845A, 0x8459,\n    0x8474, 0x8473, 0x845D, 0x8507, 0x845E, 0x8437, 0x843A, 0x8434,\n    0x847A, 0x8443, 0x8478, 0x8432, 0x8445, 0x8429, 0x83D9, 0x844B,\n    0x842F, 0x8442, 0x842D, 0x845F, 0x8470, 0x8439, 0x844E, 0x844C,\n    0x8452, 0x846F, 0x84C5, 0x848E, 0x843B, 0x8447, 0x8436, 0x8433,\n    0x8468, 0x847E, 0x8444, 0x842B, 0x8460, 0x8454, 0x846E, 0x8450,\n    0x870B, 0x8704, 0x86F7, 0x870C, 0x86FA, 0x86D6, 0x86F5, 0x874D,\n    0x86F8, 0x870E, 0x8709, 0x8701, 0x86F6, 0x870D, 0x8705, 0x88D6,\n    0x88CB, 0x88CD, 0x88CE, 0x88DE, 0x88DB, 0x88DA, 0x88CC, 0x88D0,\n    0x8985, 0x899B, 0x89DF, 0x89E5, 0x89E4, 0x89E1, 0x89E0, 0x89E2,\n    0x89DC, 0x89E6, 0x8A76, 0x8A86, 0x8A7F, 0x8A61, 0x8A3F, 0x8A77,\n    0x8A82, 0x8A84, 0x8A75, 0x8A83, 0x8A81, 0x8A74, 0x8A7A, 0x8C3C,\n    0x8C4B, 0x8C4A, 0x8C65, 0x8C64, 0x8C66, 0x8C86, 0x8C84, 0x8C85,\n    0x8CCC, 0x8D68, 0x8D69, 0x8D91, 0x8D8C, 0x8D8E, 0x8D8F, 0x8D8D,\n    0x8D93, 0x8D94, 0x8D90, 0x8D92, 0x8DF0, 0x8DE0, 0x8DEC, 0x8DF1,\n    0x8DEE, 0x8DD0, 0x8DE9, 0x8DE3, 0x8DE2, 0x8DE7, 0x8DF2, 0x8DEB,\n    0x8DF4, 0x8F06, 0x8EFF, 0x8F01, 0x8F00, 0x8F05, 0x8F07, 0x8F08,\n    0x8F02, 0x8F0B, 0x9052, 0x903F, 0x9044, 0x9049, 0x903D, 0x9110,\n    0x910D, 0x910F, 0x9111, 0x9116, 0x9114, 0x910B, 0x910E, 0x916E,\n    0x916F, 0x9248, 0x9252, 0x9230, 0x923A, 0x9266, 0x9233, 0x9265,\n    0x925E, 0x9283, 0x922E, 0x924A, 0x9246, 0x926D, 0x926C, 0x924F,\n    0x9260, 0x9267, 0x926F, 0x9236, 0x9261, 0x9270, 0x9231, 0x9254,\n    0x9263, 0x9250, 0x9272, 0x924E, 0x9253, 0x924C, 0x9256, 0x9232,\n    0x959F, 0x959C, 0x959E, 0x959B, 0x9692, 0x9693, 0x9691, 0x9697,\n    0x96CE, 0x96FA, 0x96FD, 0x96F8, 0x96F5, 0x9773, 0x9777, 0x9778,\n    0x9772, 0x980F, 0x980D, 0x980E, 0x98AC, 0x98F6, 0x98F9, 0x99AF,\n    0x99B2, 0x99B0, 0x99B5, 0x9AAD, 0x9AAB, 0x9B5B, 0x9CEA, 0x9CED,\n    0x9CE7, 0x9E80, 0x9EFD, 0x50E6, 0x50D4, 0x50D7, 0x50E8, 0x50F3,\n    0x50DB, 0x50EA, 0x50DD, 0x50E4, 0x50D3, 0x50EC, 0x50F0, 0x50EF,\n    0x50E3, 0x50E0, 0x51D8, 0x5280, 0x5281, 0x52E9, 0x52EB, 0x5330,\n    0x53AC, 0x5627, 0x5615, 0x560C, 0x5612, 0x55FC, 0x560F, 0x561C,\n    0x5601, 0x5613, 0x5602, 0x55FA, 0x561D, 0x5604, 0x55FF, 0x55F9,\n    0x5889, 0x587C, 0x5890, 0x5898, 0x5886, 0x5881, 0x587F, 0x5874,\n    0x588B, 0x587A, 0x5887, 0x5891, 0x588E, 0x5876, 0x5882, 0x5888,\n    0x587B, 0x5894, 0x588F, 0x58FE, 0x596B, 0x5ADC, 0x5AEE, 0x5AE5,\n    0x5AD5, 0x5AEA, 0x5ADA, 0x5AED, 0x5AEB, 0x5AF3, 0x5AE2, 0x5AE0,\n    0x5ADB, 0x5AEC, 0x5ADE, 0x5ADD, 0x5AD9, 0x5AE8, 0x5ADF, 0x5B77,\n    0x5BE0, 0x5BE3, 0x5C63, 0x5D82, 0x5D80, 0x5D7D, 0x5D86, 0x5D7A,\n    0x5D81, 0x5D77, 0x5D8A, 0x5D89, 0x5D88, 0x5D7E, 0x5D7C, 0x5D8D,\n    0x5D79, 0x5D7F, 0x5E58, 0x5E59, 0x5E53, 0x5ED8, 0x5ED1, 0x5ED7,\n    0x5ECE, 0x5EDC, 0x5ED5, 0x5ED9, 0x5ED2, 0x5ED4, 0x5F44, 0x5F43,\n    0x5F6F, 0x5FB6, 0x612C, 0x6128, 0x6141, 0x615E, 0x6171, 0x6173,\n    0x6152, 0x6153, 0x6172, 0x616C, 0x6180, 0x6174, 0x6154, 0x617A,\n    0x615B, 0x6165, 0x613B, 0x616A, 0x6161, 0x6156, 0x6229, 0x6227,\n    0x622B, 0x642B, 0x644D, 0x645B, 0x645D, 0x6474, 0x6476, 0x6472,\n    0x6473, 0x647D, 0x6475, 0x6466, 0x64A6, 0x644E, 0x6482, 0x645E,\n    0x645C, 0x644B, 0x6453, 0x6460, 0x6450, 0x647F, 0x643F, 0x646C,\n    0x646B, 0x6459, 0x6465, 0x6477, 0x6573, 0x65A0, 0x66A1, 0x66A0,\n    0x669F, 0x6705, 0x6704, 0x6722, 0x69B1, 0x69B6, 0x69C9, 0x69A0,\n    0x69CE, 0x6996, 0x69B0, 0x69AC, 0x69BC, 0x6991, 0x6999, 0x698E,\n    0x69A7, 0x698D, 0x69A9, 0x69BE, 0x69AF, 0x69BF, 0x69C4, 0x69BD,\n    0x69A4, 0x69D4, 0x69B9, 0x69CA, 0x699A, 0x69CF, 0x69B3, 0x6993,\n    0x69AA, 0x69A1, 0x699E, 0x69D9, 0x6997, 0x6990, 0x69C2, 0x69B5,\n    0x69A5, 0x69C6, 0x6B4A, 0x6B4D, 0x6B4B, 0x6B9E, 0x6B9F, 0x6BA0,\n    0x6BC3, 0x6BC4, 0x6BFE, 0x6ECE, 0x6EF5, 0x6EF1, 0x6F03, 0x6F25,\n    0x6EF8, 0x6F37, 0x6EFB, 0x6F2E, 0x6F09, 0x6F4E, 0x6F19, 0x6F1A,\n    0x6F27, 0x6F18, 0x6F3B, 0x6F12, 0x6EED, 0x6F0A, 0x6F36, 0x6F73,\n    0x6EF9, 0x6EEE, 0x6F2D, 0x6F40, 0x6F30, 0x6F3C, 0x6F35, 0x6EEB,\n    0x6F07, 0x6F0E, 0x6F43, 0x6F05, 0x6EFD, 0x6EF6, 0x6F39, 0x6F1C,\n    0x6EFC, 0x6F3A, 0x6F1F, 0x6F0D, 0x6F1E, 0x6F08, 0x6F21, 0x7187,\n    0x7190, 0x7189, 0x7180, 0x7185, 0x7182, 0x718F, 0x717B, 0x7186,\n    0x7181, 0x7197, 0x7244, 0x7253, 0x7297, 0x7295, 0x7293, 0x7343,\n    0x734D, 0x7351, 0x734C, 0x7462, 0x7473, 0x7471, 0x7475, 0x7472,\n    0x7467, 0x746E, 0x7500, 0x7502, 0x7503, 0x757D, 0x7590, 0x7616,\n    0x7608, 0x760C, 0x7615, 0x7611, 0x760A, 0x7614, 0x76B8, 0x7781,\n    0x777C, 0x7785, 0x7782, 0x776E, 0x7780, 0x776F, 0x777E, 0x7783,\n    0x78B2, 0x78AA, 0x78B4, 0x78AD, 0x78A8, 0x787E, 0x78AB, 0x789E,\n    0x78A5, 0x78A0, 0x78AC, 0x78A2, 0x78A4, 0x7998, 0x798A, 0x798B,\n    0x7996, 0x7995, 0x7994, 0x7993, 0x7997, 0x7988, 0x7992, 0x7990,\n    0x7A2B, 0x7A4A, 0x7A30, 0x7A2F, 0x7A28, 0x7A26, 0x7AA8, 0x7AAB,\n    0x7AAC, 0x7AEE, 0x7B88, 0x7B9C, 0x7B8A, 0x7B91, 0x7B90, 0x7B96,\n    0x7B8D, 0x7B8C, 0x7B9B, 0x7B8E, 0x7B85, 0x7B98, 0x5284, 0x7B99,\n    0x7BA4, 0x7B82, 0x7CBB, 0x7CBF, 0x7CBC, 0x7CBA, 0x7DA7, 0x7DB7,\n    0x7DC2, 0x7DA3, 0x7DAA, 0x7DC1, 0x7DC0, 0x7DC5, 0x7D9D, 0x7DCE,\n    0x7DC4, 0x7DC6, 0x7DCB, 0x7DCC, 0x7DAF, 0x7DB9, 0x7D96, 0x7DBC,\n    0x7D9F, 0x7DA6, 0x7DAE, 0x7DA9, 0x7DA1, 0x7DC9, 0x7F73, 0x7FE2,\n    0x7FE3, 0x7FE5, 0x7FDE, 0x8024, 0x805D, 0x805C, 0x8189, 0x8186,\n    0x8183, 0x8187, 0x818D, 0x818C, 0x818B, 0x8215, 0x8497, 0x84A4,\n    0x84A1, 0x849F, 0x84BA, 0x84CE, 0x84C2, 0x84AC, 0x84AE, 0x84AB,\n    0x84B9, 0x84B4, 0x84C1, 0x84CD, 0x84AA, 0x849A, 0x84B1, 0x84D0,\n    0x849D, 0x84A7, 0x84BB, 0x84A2, 0x8494, 0x84C7, 0x84CC, 0x849B,\n    0x84A9, 0x84AF, 0x84A8, 0x84D6, 0x8498, 0x84B6, 0x84CF, 0x84A0,\n    0x84D7, 0x84D4, 0x84D2, 0x84DB, 0x84B0, 0x8491, 0x8661, 0x8733,\n    0x8723, 0x8728, 0x876B, 0x8740, 0x872E, 0x871E, 0x8721, 0x8719,\n    0x871B, 0x8743, 0x872C, 0x8741, 0x873E, 0x8746, 0x8720, 0x8732,\n    0x872A, 0x872D, 0x873C, 0x8712, 0x873A, 0x8731, 0x8735, 0x8742,\n    0x8726, 0x8727, 0x8738, 0x8724, 0x871A, 0x8730, 0x8711, 0x88F7,\n    0x88E7, 0x88F1, 0x88F2, 0x88FA, 0x88FE, 0x88EE, 0x88FC, 0x88F6,\n    0x88FB, 0x88F0, 0x88EC, 0x88EB, 0x899D, 0x89A1, 0x899F, 0x899E,\n    0x89E9, 0x89EB, 0x89E8, 0x8AAB, 0x8A99, 0x8A8B, 0x8A92, 0x8A8F,\n    0x8A96, 0x8C3D, 0x8C68, 0x8C69, 0x8CD5, 0x8CCF, 0x8CD7, 0x8D96,\n    0x8E09, 0x8E02, 0x8DFF, 0x8E0D, 0x8DFD, 0x8E0A, 0x8E03, 0x8E07,\n    0x8E06, 0x8E05, 0x8DFE, 0x8E00, 0x8E04, 0x8F10, 0x8F11, 0x8F0E,\n    0x8F0D, 0x9123, 0x911C, 0x9120, 0x9122, 0x911F, 0x911D, 0x911A,\n    0x9124, 0x9121, 0x911B, 0x917A, 0x9172, 0x9179, 0x9173, 0x92A5,\n    0x92A4, 0x9276, 0x929B, 0x927A, 0x92A0, 0x9294, 0x92AA, 0x928D,\n    0x92A6, 0x929A, 0x92AB, 0x9279, 0x9297, 0x927F, 0x92A3, 0x92EE,\n    0x928E, 0x9282, 0x9295, 0x92A2, 0x927D, 0x9288, 0x92A1, 0x928A,\n    0x9286, 0x928C, 0x9299, 0x92A7, 0x927E, 0x9287, 0x92A9, 0x929D,\n    0x928B, 0x922D, 0x969E, 0x96A1, 0x96FF, 0x9758, 0x977D, 0x977A,\n    0x977E, 0x9783, 0x9780, 0x9782, 0x977B, 0x9784, 0x9781, 0x977F,\n    0x97CE, 0x97CD, 0x9816, 0x98AD, 0x98AE, 0x9902, 0x9900, 0x9907,\n    0x999D, 0x999C, 0x99C3, 0x99B9, 0x99BB, 0x99BA, 0x99C2, 0x99BD,\n    0x99C7, 0x9AB1, 0x9AE3, 0x9AE7, 0x9B3E, 0x9B3F, 0x9B60, 0x9B61,\n    0x9B5F, 0x9CF1, 0x9CF2, 0x9CF5, 0x9EA7, 0x50FF, 0x5103, 0x5130,\n    0x50F8, 0x5106, 0x5107, 0x50F6, 0x50FE, 0x510B, 0x510C, 0x50FD,\n    0x510A, 0x528B, 0x528C, 0x52F1, 0x52EF, 0x5648, 0x5642, 0x564C,\n    0x5635, 0x5641, 0x564A, 0x5649, 0x5646, 0x5658, 0x565A, 0x5640,\n    0x5633, 0x563D, 0x562C, 0x563E, 0x5638, 0x562A, 0x563A, 0x571A,\n    0x58AB, 0x589D, 0x58B1, 0x58A0, 0x58A3, 0x58AF, 0x58AC, 0x58A5,\n    0x58A1, 0x58FF, 0x5AFF, 0x5AF4, 0x5AFD, 0x5AF7, 0x5AF6, 0x5B03,\n    0x5AF8, 0x5B02, 0x5AF9, 0x5B01, 0x5B07, 0x5B05, 0x5B0F, 0x5C67,\n    0x5D99, 0x5D97, 0x5D9F, 0x5D92, 0x5DA2, 0x5D93, 0x5D95, 0x5DA0,\n    0x5D9C, 0x5DA1, 0x5D9A, 0x5D9E, 0x5E69, 0x5E5D, 0x5E60, 0x5E5C,\n    0x7DF3, 0x5EDB, 0x5EDE, 0x5EE1, 0x5F49, 0x5FB2, 0x618B, 0x6183,\n    0x6179, 0x61B1, 0x61B0, 0x61A2, 0x6189, 0x619B, 0x6193, 0x61AF,\n    0x61AD, 0x619F, 0x6192, 0x61AA, 0x61A1, 0x618D, 0x6166, 0x61B3,\n    0x622D, 0x646E, 0x6470, 0x6496, 0x64A0, 0x6485, 0x6497, 0x649C,\n    0x648F, 0x648B, 0x648A, 0x648C, 0x64A3, 0x649F, 0x6468, 0x64B1,\n    0x6498, 0x6576, 0x657A, 0x6579, 0x657B, 0x65B2, 0x65B3, 0x66B5,\n    0x66B0, 0x66A9, 0x66B2, 0x66B7, 0x66AA, 0x66AF, 0x6A00, 0x6A06,\n    0x6A17, 0x69E5, 0x69F8, 0x6A15, 0x69F1, 0x69E4, 0x6A20, 0x69FF,\n    0x69EC, 0x69E2, 0x6A1B, 0x6A1D, 0x69FE, 0x6A27, 0x69F2, 0x69EE,\n    0x6A14, 0x69F7, 0x69E7, 0x6A40, 0x6A08, 0x69E6, 0x69FB, 0x6A0D,\n    0x69FC, 0x69EB, 0x6A09, 0x6A04, 0x6A18, 0x6A25, 0x6A0F, 0x69F6,\n    0x6A26, 0x6A07, 0x69F4, 0x6A16, 0x6B51, 0x6BA5, 0x6BA3, 0x6BA2,\n    0x6BA6, 0x6C01, 0x6C00, 0x6BFF, 0x6C02, 0x6F41, 0x6F26, 0x6F7E,\n    0x6F87, 0x6FC6, 0x6F92, 0x6F8D, 0x6F89, 0x6F8C, 0x6F62, 0x6F4F,\n    0x6F85, 0x6F5A, 0x6F96, 0x6F76, 0x6F6C, 0x6F82, 0x6F55, 0x6F72,\n    0x6F52, 0x6F50, 0x6F57, 0x6F94, 0x6F93, 0x6F5D, 0x6F00, 0x6F61,\n    0x6F6B, 0x6F7D, 0x6F67, 0x6F90, 0x6F53, 0x6F8B, 0x6F69, 0x6F7F,\n    0x6F95, 0x6F63, 0x6F77, 0x6F6A, 0x6F7B, 0x71B2, 0x71AF, 0x719B,\n    0x71B0, 0x71A0, 0x719A, 0x71A9, 0x71B5, 0x719D, 0x71A5, 0x719E,\n    0x71A4, 0x71A1, 0x71AA, 0x719C, 0x71A7, 0x71B3, 0x7298, 0x729A,\n    0x7358, 0x7352, 0x735E, 0x735F, 0x7360, 0x735D, 0x735B, 0x7361,\n    0x735A, 0x7359, 0x7362, 0x7487, 0x7489, 0x748A, 0x7486, 0x7481,\n    0x747D, 0x7485, 0x7488, 0x747C, 0x7479, 0x7508, 0x7507, 0x757E,\n    0x7625, 0x761E, 0x7619, 0x761D, 0x761C, 0x7623, 0x761A, 0x7628,\n    0x761B, 0x769C, 0x769D, 0x769E, 0x769B, 0x778D, 0x778F, 0x7789,\n    0x7788, 0x78CD, 0x78BB, 0x78CF, 0x78CC, 0x78D1, 0x78CE, 0x78D4,\n    0x78C8, 0x78C3, 0x78C4, 0x78C9, 0x799A, 0x79A1, 0x79A0, 0x799C,\n    0x79A2, 0x799B, 0x6B76, 0x7A39, 0x7AB2, 0x7AB4, 0x7AB3, 0x7BB7,\n    0x7BCB, 0x7BBE, 0x7BAC, 0x7BCE, 0x7BAF, 0x7BB9, 0x7BCA, 0x7BB5,\n    0x7CC5, 0x7CC8, 0x7CCC, 0x7CCB, 0x7DF7, 0x7DDB, 0x7DEA, 0x7DE7,\n    0x7DD7, 0x7DE1, 0x7E03, 0x7DFA, 0x7DE6, 0x7DF6, 0x7DF1, 0x7DF0,\n    0x7DEE, 0x7DDF, 0x7F76, 0x7FAC, 0x7FB0, 0x7FAD, 0x7FED, 0x7FEB,\n    0x7FEA, 0x7FEC, 0x7FE6, 0x7FE8, 0x8064, 0x8067, 0x81A3, 0x819F,\n    0x819E, 0x8195, 0x81A2, 0x8199, 0x8197, 0x8216, 0x824F, 0x8253,\n    0x8252, 0x8250, 0x824E, 0x8251, 0x8524, 0x853B, 0x850F, 0x8500,\n    0x8529, 0x850E, 0x8509, 0x850D, 0x851F, 0x850A, 0x8527, 0x851C,\n    0x84FB, 0x852B, 0x84FA, 0x8508, 0x850C, 0x84F4, 0x852A, 0x84F2,\n    0x8515, 0x84F7, 0x84EB, 0x84F3, 0x84FC, 0x8512, 0x84EA, 0x84E9,\n    0x8516, 0x84FE, 0x8528, 0x851D, 0x852E, 0x8502, 0x84FD, 0x851E,\n    0x84F6, 0x8531, 0x8526, 0x84E7, 0x84E8, 0x84F0, 0x84EF, 0x84F9,\n    0x8518, 0x8520, 0x8530, 0x850B, 0x8519, 0x852F, 0x8662, 0x8756,\n    0x8763, 0x8764, 0x8777, 0x87E1, 0x8773, 0x8758, 0x8754, 0x875B,\n    0x8752, 0x8761, 0x875A, 0x8751, 0x875E, 0x876D, 0x876A, 0x8750,\n    0x874E, 0x875F, 0x875D, 0x876F, 0x876C, 0x877A, 0x876E, 0x875C,\n    0x8765, 0x874F, 0x877B, 0x8775, 0x8762, 0x8767, 0x8769, 0x885A,\n    0x8905, 0x890C, 0x8914, 0x890B, 0x8917, 0x8918, 0x8919, 0x8906,\n    0x8916, 0x8911, 0x890E, 0x8909, 0x89A2, 0x89A4, 0x89A3, 0x89ED,\n    0x89F0, 0x89EC, 0x8ACF, 0x8AC6, 0x8AB8, 0x8AD3, 0x8AD1, 0x8AD4,\n    0x8AD5, 0x8ABB, 0x8AD7, 0x8ABE, 0x8AC0, 0x8AC5, 0x8AD8, 0x8AC3,\n    0x8ABA, 0x8ABD, 0x8AD9, 0x8C3E, 0x8C4D, 0x8C8F, 0x8CE5, 0x8CDF,\n    0x8CD9, 0x8CE8, 0x8CDA, 0x8CDD, 0x8CE7, 0x8DA0, 0x8D9C, 0x8DA1,\n    0x8D9B, 0x8E20, 0x8E23, 0x8E25, 0x8E24, 0x8E2E, 0x8E15, 0x8E1B,\n    0x8E16, 0x8E11, 0x8E19, 0x8E26, 0x8E27, 0x8E14, 0x8E12, 0x8E18,\n    0x8E13, 0x8E1C, 0x8E17, 0x8E1A, 0x8F2C, 0x8F24, 0x8F18, 0x8F1A,\n    0x8F20, 0x8F23, 0x8F16, 0x8F17, 0x9073, 0x9070, 0x906F, 0x9067,\n    0x906B, 0x912F, 0x912B, 0x9129, 0x912A, 0x9132, 0x9126, 0x912E,\n    0x9185, 0x9186, 0x918A, 0x9181, 0x9182, 0x9184, 0x9180, 0x92D0,\n    0x92C3, 0x92C4, 0x92C0, 0x92D9, 0x92B6, 0x92CF, 0x92F1, 0x92DF,\n    0x92D8, 0x92E9, 0x92D7, 0x92DD, 0x92CC, 0x92EF, 0x92C2, 0x92E8,\n    0x92CA, 0x92C8, 0x92CE, 0x92E6, 0x92CD, 0x92D5, 0x92C9, 0x92E0,\n    0x92DE, 0x92E7, 0x92D1, 0x92D3, 0x92B5, 0x92E1, 0x9325, 0x92C6,\n    0x92B4, 0x957C, 0x95AC, 0x95AB, 0x95AE, 0x95B0, 0x96A4, 0x96A2,\n    0x96D3, 0x9705, 0x9708, 0x9702, 0x975A, 0x978A, 0x978E, 0x9788,\n    0x97D0, 0x97CF, 0x981E, 0x981D, 0x9826, 0x9829, 0x9828, 0x9820,\n    0x981B, 0x9827, 0x98B2, 0x9908, 0x98FA, 0x9911, 0x9914, 0x9916,\n    0x9917, 0x9915, 0x99DC, 0x99CD, 0x99CF, 0x99D3, 0x99D4, 0x99CE,\n    0x99C9, 0x99D6, 0x99D8, 0x99CB, 0x99D7, 0x99CC, 0x9AB3, 0x9AEC,\n    0x9AEB, 0x9AF3, 0x9AF2, 0x9AF1, 0x9B46, 0x9B43, 0x9B67, 0x9B74,\n    0x9B71, 0x9B66, 0x9B76, 0x9B75, 0x9B70, 0x9B68, 0x9B64, 0x9B6C,\n    0x9CFC, 0x9CFA, 0x9CFD, 0x9CFF, 0x9CF7, 0x9D07, 0x9D00, 0x9CF9,\n    0x9CFB, 0x9D08, 0x9D05, 0x9D04, 0x9E83, 0x9ED3, 0x9F0F, 0x9F10,\n    0x511C, 0x5113, 0x5117, 0x511A, 0x5111, 0x51DE, 0x5334, 0x53E1,\n    0x5670, 0x5660, 0x566E, 0x5673, 0x5666, 0x5663, 0x566D, 0x5672,\n    0x565E, 0x5677, 0x571C, 0x571B, 0x58C8, 0x58BD, 0x58C9, 0x58BF,\n    0x58BA, 0x58C2, 0x58BC, 0x58C6, 0x5B17, 0x5B19, 0x5B1B, 0x5B21,\n    0x5B14, 0x5B13, 0x5B10, 0x5B16, 0x5B28, 0x5B1A, 0x5B20, 0x5B1E,\n    0x5BEF, 0x5DAC, 0x5DB1, 0x5DA9, 0x5DA7, 0x5DB5, 0x5DB0, 0x5DAE,\n    0x5DAA, 0x5DA8, 0x5DB2, 0x5DAD, 0x5DAF, 0x5DB4, 0x5E67, 0x5E68,\n    0x5E66, 0x5E6F, 0x5EE9, 0x5EE7, 0x5EE6, 0x5EE8, 0x5EE5, 0x5F4B,\n    0x5FBC, 0x5FBB, 0x619D, 0x61A8, 0x6196, 0x61C5, 0x61B4, 0x61C6,\n    0x61C1, 0x61CC, 0x61BA, 0x61BF, 0x61B8, 0x618C, 0x64D7, 0x64D6,\n    0x64D0, 0x64CF, 0x64C9, 0x64BD, 0x6489, 0x64C3, 0x64DB, 0x64F3,\n    0x64D9, 0x6533, 0x657F, 0x657C, 0x65A2, 0x66C8, 0x66BE, 0x66C0,\n    0x66CA, 0x66CB, 0x66CF, 0x66BD, 0x66BB, 0x66BA, 0x66CC, 0x6723,\n    0x6A34, 0x6A66, 0x6A49, 0x6A67, 0x6A32, 0x6A68, 0x6A3E, 0x6A5D,\n    0x6A6D, 0x6A76, 0x6A5B, 0x6A51, 0x6A28, 0x6A5A, 0x6A3B, 0x6A3F,\n    0x6A41, 0x6A6A, 0x6A64, 0x6A50, 0x6A4F, 0x6A54, 0x6A6F, 0x6A69,\n    0x6A60, 0x6A3C, 0x6A5E, 0x6A56, 0x6A55, 0x6A4D, 0x6A4E, 0x6A46,\n    0x6B55, 0x6B54, 0x6B56, 0x6BA7, 0x6BAA, 0x6BAB, 0x6BC8, 0x6BC7,\n    0x6C04, 0x6C03, 0x6C06, 0x6FAD, 0x6FCB, 0x6FA3, 0x6FC7, 0x6FBC,\n    0x6FCE, 0x6FC8, 0x6F5E, 0x6FC4, 0x6FBD, 0x6F9E, 0x6FCA, 0x6FA8,\n    0x7004, 0x6FA5, 0x6FAE, 0x6FBA, 0x6FAC, 0x6FAA, 0x6FCF, 0x6FBF,\n    0x6FB8, 0x6FA2, 0x6FC9, 0x6FAB, 0x6FCD, 0x6FAF, 0x6FB2, 0x6FB0,\n    0x71C5, 0x71C2, 0x71BF, 0x71B8, 0x71D6, 0x71C0, 0x71C1, 0x71CB,\n    0x71D4, 0x71CA, 0x71C7, 0x71CF, 0x71BD, 0x71D8, 0x71BC, 0x71C6,\n    0x71DA, 0x71DB, 0x729D, 0x729E, 0x7369, 0x7366, 0x7367, 0x736C,\n    0x7365, 0x736B, 0x736A, 0x747F, 0x749A, 0x74A0, 0x7494, 0x7492,\n    0x7495, 0x74A1, 0x750B, 0x7580, 0x762F, 0x762D, 0x7631, 0x763D,\n    0x7633, 0x763C, 0x7635, 0x7632, 0x7630, 0x76BB, 0x76E6, 0x779A,\n    0x779D, 0x77A1, 0x779C, 0x779B, 0x77A2, 0x77A3, 0x7795, 0x7799,\n    0x7797, 0x78DD, 0x78E9, 0x78E5, 0x78EA, 0x78DE, 0x78E3, 0x78DB,\n    0x78E1, 0x78E2, 0x78ED, 0x78DF, 0x78E0, 0x79A4, 0x7A44, 0x7A48,\n    0x7A47, 0x7AB6, 0x7AB8, 0x7AB5, 0x7AB1, 0x7AB7, 0x7BDE, 0x7BE3,\n    0x7BE7, 0x7BDD, 0x7BD5, 0x7BE5, 0x7BDA, 0x7BE8, 0x7BF9, 0x7BD4,\n    0x7BEA, 0x7BE2, 0x7BDC, 0x7BEB, 0x7BD8, 0x7BDF, 0x7CD2, 0x7CD4,\n    0x7CD7, 0x7CD0, 0x7CD1, 0x7E12, 0x7E21, 0x7E17, 0x7E0C, 0x7E1F,\n    0x7E20, 0x7E13, 0x7E0E, 0x7E1C, 0x7E15, 0x7E1A, 0x7E22, 0x7E0B,\n    0x7E0F, 0x7E16, 0x7E0D, 0x7E14, 0x7E25, 0x7E24, 0x7F43, 0x7F7B,\n    0x7F7C, 0x7F7A, 0x7FB1, 0x7FEF, 0x802A, 0x8029, 0x806C, 0x81B1,\n    0x81A6, 0x81AE, 0x81B9, 0x81B5, 0x81AB, 0x81B0, 0x81AC, 0x81B4,\n    0x81B2, 0x81B7, 0x81A7, 0x81F2, 0x8255, 0x8256, 0x8257, 0x8556,\n    0x8545, 0x856B, 0x854D, 0x8553, 0x8561, 0x8558, 0x8540, 0x8546,\n    0x8564, 0x8541, 0x8562, 0x8544, 0x8551, 0x8547, 0x8563, 0x853E,\n    0x855B, 0x8571, 0x854E, 0x856E, 0x8575, 0x8555, 0x8567, 0x8560,\n    0x858C, 0x8566, 0x855D, 0x8554, 0x8565, 0x856C, 0x8663, 0x8665,\n    0x8664, 0x87A4, 0x879B, 0x878F, 0x8797, 0x8793, 0x8792, 0x8788,\n    0x8781, 0x8796, 0x8798, 0x8779, 0x8787, 0x87A3, 0x8785, 0x8790,\n    0x8791, 0x879D, 0x8784, 0x8794, 0x879C, 0x879A, 0x8789, 0x891E,\n    0x8926, 0x8930, 0x892D, 0x892E, 0x8927, 0x8931, 0x8922, 0x8929,\n    0x8923, 0x892F, 0x892C, 0x891F, 0x89F1, 0x8AE0, 0x8AE2, 0x8AF2,\n    0x8AF4, 0x8AF5, 0x8ADD, 0x8B14, 0x8AE4, 0x8ADF, 0x8AF0, 0x8AC8,\n    0x8ADE, 0x8AE1, 0x8AE8, 0x8AFF, 0x8AEF, 0x8AFB, 0x8C91, 0x8C92,\n    0x8C90, 0x8CF5, 0x8CEE, 0x8CF1, 0x8CF0, 0x8CF3, 0x8D6C, 0x8D6E,\n    0x8DA5, 0x8DA7, 0x8E33, 0x8E3E, 0x8E38, 0x8E40, 0x8E45, 0x8E36,\n    0x8E3C, 0x8E3D, 0x8E41, 0x8E30, 0x8E3F, 0x8EBD, 0x8F36, 0x8F2E,\n    0x8F35, 0x8F32, 0x8F39, 0x8F37, 0x8F34, 0x9076, 0x9079, 0x907B,\n    0x9086, 0x90FA, 0x9133, 0x9135, 0x9136, 0x9193, 0x9190, 0x9191,\n    0x918D, 0x918F, 0x9327, 0x931E, 0x9308, 0x931F, 0x9306, 0x930F,\n    0x937A, 0x9338, 0x933C, 0x931B, 0x9323, 0x9312, 0x9301, 0x9346,\n    0x932D, 0x930E, 0x930D, 0x92CB, 0x931D, 0x92FA, 0x9313, 0x92F9,\n    0x92F7, 0x9334, 0x9302, 0x9324, 0x92FF, 0x9329, 0x9339, 0x9335,\n    0x932A, 0x9314, 0x930C, 0x930B, 0x92FE, 0x9309, 0x9300, 0x92FB,\n    0x9316, 0x95BC, 0x95CD, 0x95BE, 0x95B9, 0x95BA, 0x95B6, 0x95BF,\n    0x95B5, 0x95BD, 0x96A9, 0x96D4, 0x970B, 0x9712, 0x9710, 0x9799,\n    0x9797, 0x9794, 0x97F0, 0x97F8, 0x9835, 0x982F, 0x9832, 0x9924,\n    0x991F, 0x9927, 0x9929, 0x999E, 0x99EE, 0x99EC, 0x99E5, 0x99E4,\n    0x99F0, 0x99E3, 0x99EA, 0x99E9, 0x99E7, 0x9AB9, 0x9ABF, 0x9AB4,\n    0x9ABB, 0x9AF6, 0x9AFA, 0x9AF9, 0x9AF7, 0x9B33, 0x9B80, 0x9B85,\n    0x9B87, 0x9B7C, 0x9B7E, 0x9B7B, 0x9B82, 0x9B93, 0x9B92, 0x9B90,\n    0x9B7A, 0x9B95, 0x9B7D, 0x9B88, 0x9D25, 0x9D17, 0x9D20, 0x9D1E,\n    0x9D14, 0x9D29, 0x9D1D, 0x9D18, 0x9D22, 0x9D10, 0x9D19, 0x9D1F,\n    0x9E88, 0x9E86, 0x9E87, 0x9EAE, 0x9EAD, 0x9ED5, 0x9ED6, 0x9EFA,\n    0x9F12, 0x9F3D, 0x5126, 0x5125, 0x5122, 0x5124, 0x5120, 0x5129,\n    0x52F4, 0x5693, 0x568C, 0x568D, 0x5686, 0x5684, 0x5683, 0x567E,\n    0x5682, 0x567F, 0x5681, 0x58D6, 0x58D4, 0x58CF, 0x58D2, 0x5B2D,\n    0x5B25, 0x5B32, 0x5B23, 0x5B2C, 0x5B27, 0x5B26, 0x5B2F, 0x5B2E,\n    0x5B7B, 0x5BF1, 0x5BF2, 0x5DB7, 0x5E6C, 0x5E6A, 0x5FBE, 0x61C3,\n    0x61B5, 0x61BC, 0x61E7, 0x61E0, 0x61E5, 0x61E4, 0x61E8, 0x61DE,\n    0x64EF, 0x64E9, 0x64E3, 0x64EB, 0x64E4, 0x64E8, 0x6581, 0x6580,\n    0x65B6, 0x65DA, 0x66D2, 0x6A8D, 0x6A96, 0x6A81, 0x6AA5, 0x6A89,\n    0x6A9F, 0x6A9B, 0x6AA1, 0x6A9E, 0x6A87, 0x6A93, 0x6A8E, 0x6A95,\n    0x6A83, 0x6AA8, 0x6AA4, 0x6A91, 0x6A7F, 0x6AA6, 0x6A9A, 0x6A85,\n    0x6A8C, 0x6A92, 0x6B5B, 0x6BAD, 0x6C09, 0x6FCC, 0x6FA9, 0x6FF4,\n    0x6FD4, 0x6FE3, 0x6FDC, 0x6FED, 0x6FE7, 0x6FE6, 0x6FDE, 0x6FF2,\n    0x6FDD, 0x6FE2, 0x6FE8, 0x71E1, 0x71F1, 0x71E8, 0x71F2, 0x71E4,\n    0x71F0, 0x71E2, 0x7373, 0x736E, 0x736F, 0x7497, 0x74B2, 0x74AB,\n    0x7490, 0x74AA, 0x74AD, 0x74B1, 0x74A5, 0x74AF, 0x7510, 0x7511,\n    0x7512, 0x750F, 0x7584, 0x7643, 0x7648, 0x7649, 0x7647, 0x76A4,\n    0x76E9, 0x77B5, 0x77AB, 0x77B2, 0x77B7, 0x77B6, 0x77B4, 0x77B1,\n    0x77A8, 0x77F0, 0x78F3, 0x78FD, 0x7902, 0x78FB, 0x78FC, 0x78FF,\n    0x78F2, 0x7905, 0x78F9, 0x78FE, 0x7904, 0x79AB, 0x79A8, 0x7A5C,\n    0x7A5B, 0x7A56, 0x7A58, 0x7A54, 0x7A5A, 0x7ABE, 0x7AC0, 0x7AC1,\n    0x7C05, 0x7C0F, 0x7BF2, 0x7C00, 0x7BFF, 0x7BFB, 0x7C0E, 0x7BF4,\n    0x7C0B, 0x7BF3, 0x7C02, 0x7C09, 0x7C03, 0x7C01, 0x7BF8, 0x7BFD,\n    0x7C06, 0x7BF0, 0x7BF1, 0x7C10, 0x7C0A, 0x7CE8, 0x7E2D, 0x7E3C,\n    0x7E42, 0x7E33, 0x9848, 0x7E38, 0x7E2A, 0x7E49, 0x7E40, 0x7E47,\n    0x7E29, 0x7E4C, 0x7E30, 0x7E3B, 0x7E36, 0x7E44, 0x7E3A, 0x7F45,\n    0x7F7F, 0x7F7E, 0x7F7D, 0x7FF4, 0x7FF2, 0x802C, 0x81BB, 0x81C4,\n    0x81CC, 0x81CA, 0x81C5, 0x81C7, 0x81BC, 0x81E9, 0x825B, 0x825A,\n    0x825C, 0x8583, 0x8580, 0x858F, 0x85A7, 0x8595, 0x85A0, 0x858B,\n    0x85A3, 0x857B, 0x85A4, 0x859A, 0x859E, 0x8577, 0x857C, 0x8589,\n    0x85A1, 0x857A, 0x8578, 0x8557, 0x858E, 0x8596, 0x8586, 0x858D,\n    0x8599, 0x859D, 0x8581, 0x85A2, 0x8582, 0x8588, 0x8585, 0x8579,\n    0x8576, 0x8598, 0x8590, 0x859F, 0x8668, 0x87BE, 0x87AA, 0x87AD,\n    0x87C5, 0x87B0, 0x87AC, 0x87B9, 0x87B5, 0x87BC, 0x87AE, 0x87C9,\n    0x87C3, 0x87C2, 0x87CC, 0x87B7, 0x87AF, 0x87C4, 0x87CA, 0x87B4,\n    0x87B6, 0x87BF, 0x87B8, 0x87BD, 0x87DE, 0x87B2, 0x8935, 0x8933,\n    0x893C, 0x893E, 0x8941, 0x8952, 0x8937, 0x8942, 0x89AD, 0x89AF,\n    0x89AE, 0x89F2, 0x89F3, 0x8B1E, 0x8B18, 0x8B16, 0x8B11, 0x8B05,\n    0x8B0B, 0x8B22, 0x8B0F, 0x8B12, 0x8B15, 0x8B07, 0x8B0D, 0x8B08,\n    0x8B06, 0x8B1C, 0x8B13, 0x8B1A, 0x8C4F, 0x8C70, 0x8C72, 0x8C71,\n    0x8C6F, 0x8C95, 0x8C94, 0x8CF9, 0x8D6F, 0x8E4E, 0x8E4D, 0x8E53,\n    0x8E50, 0x8E4C, 0x8E47, 0x8F43, 0x8F40, 0x9085, 0x907E, 0x9138,\n    0x919A, 0x91A2, 0x919B, 0x9199, 0x919F, 0x91A1, 0x919D, 0x91A0,\n    0x93A1, 0x9383, 0x93AF, 0x9364, 0x9356, 0x9347, 0x937C, 0x9358,\n    0x935C, 0x9376, 0x9349, 0x9350, 0x9351, 0x9360, 0x936D, 0x938F,\n    0x934C, 0x936A, 0x9379, 0x9357, 0x9355, 0x9352, 0x934F, 0x9371,\n    0x9377, 0x937B, 0x9361, 0x935E, 0x9363, 0x9367, 0x934E, 0x9359,\n    0x95C7, 0x95C0, 0x95C9, 0x95C3, 0x95C5, 0x95B7, 0x96AE, 0x96B0,\n    0x96AC, 0x9720, 0x971F, 0x9718, 0x971D, 0x9719, 0x979A, 0x97A1,\n    0x979C, 0x979E, 0x979D, 0x97D5, 0x97D4, 0x97F1, 0x9841, 0x9844,\n    0x984A, 0x9849, 0x9845, 0x9843, 0x9925, 0x992B, 0x992C, 0x992A,\n    0x9933, 0x9932, 0x992F, 0x992D, 0x9931, 0x9930, 0x9998, 0x99A3,\n    0x99A1, 0x9A02, 0x99FA, 0x99F4, 0x99F7, 0x99F9, 0x99F8, 0x99F6,\n    0x99FB, 0x99FD, 0x99FE, 0x99FC, 0x9A03, 0x9ABE, 0x9AFE, 0x9AFD,\n    0x9B01, 0x9AFC, 0x9B48, 0x9B9A, 0x9BA8, 0x9B9E, 0x9B9B, 0x9BA6,\n    0x9BA1, 0x9BA5, 0x9BA4, 0x9B86, 0x9BA2, 0x9BA0, 0x9BAF, 0x9D33,\n    0x9D41, 0x9D67, 0x9D36, 0x9D2E, 0x9D2F, 0x9D31, 0x9D38, 0x9D30,\n    0x9D45, 0x9D42, 0x9D43, 0x9D3E, 0x9D37, 0x9D40, 0x9D3D, 0x7FF5,\n    0x9D2D, 0x9E8A, 0x9E89, 0x9E8D, 0x9EB0, 0x9EC8, 0x9EDA, 0x9EFB,\n    0x9EFF, 0x9F24, 0x9F23, 0x9F22, 0x9F54, 0x9FA0, 0x5131, 0x512D,\n    0x512E, 0x5698, 0x569C, 0x5697, 0x569A, 0x569D, 0x5699, 0x5970,\n    0x5B3C, 0x5C69, 0x5C6A, 0x5DC0, 0x5E6D, 0x5E6E, 0x61D8, 0x61DF,\n    0x61ED, 0x61EE, 0x61F1, 0x61EA, 0x61F0, 0x61EB, 0x61D6, 0x61E9,\n    0x64FF, 0x6504, 0x64FD, 0x64F8, 0x6501, 0x6503, 0x64FC, 0x6594,\n    0x65DB, 0x66DA, 0x66DB, 0x66D8, 0x6AC5, 0x6AB9, 0x6ABD, 0x6AE1,\n    0x6AC6, 0x6ABA, 0x6AB6, 0x6AB7, 0x6AC7, 0x6AB4, 0x6AAD, 0x6B5E,\n    0x6BC9, 0x6C0B, 0x7007, 0x700C, 0x700D, 0x7001, 0x7005, 0x7014,\n    0x700E, 0x6FFF, 0x7000, 0x6FFB, 0x7026, 0x6FFC, 0x6FF7, 0x700A,\n    0x7201, 0x71FF, 0x71F9, 0x7203, 0x71FD, 0x7376, 0x74B8, 0x74C0,\n    0x74B5, 0x74C1, 0x74BE, 0x74B6, 0x74BB, 0x74C2, 0x7514, 0x7513,\n    0x765C, 0x7664, 0x7659, 0x7650, 0x7653, 0x7657, 0x765A, 0x76A6,\n    0x76BD, 0x76EC, 0x77C2, 0x77BA, 0x790C, 0x7913, 0x7914, 0x7909,\n    0x7910, 0x7912, 0x7911, 0x79AD, 0x79AC, 0x7A5F, 0x7C1C, 0x7C29,\n    0x7C19, 0x7C20, 0x7C1F, 0x7C2D, 0x7C1D, 0x7C26, 0x7C28, 0x7C22,\n    0x7C25, 0x7C30, 0x7E5C, 0x7E50, 0x7E56, 0x7E63, 0x7E58, 0x7E62,\n    0x7E5F, 0x7E51, 0x7E60, 0x7E57, 0x7E53, 0x7FB5, 0x7FB3, 0x7FF7,\n    0x7FF8, 0x8075, 0x81D1, 0x81D2, 0x81D0, 0x825F, 0x825E, 0x85B4,\n    0x85C6, 0x85C0, 0x85C3, 0x85C2, 0x85B3, 0x85B5, 0x85BD, 0x85C7,\n    0x85C4, 0x85BF, 0x85CB, 0x85CE, 0x85C8, 0x85C5, 0x85B1, 0x85B6,\n    0x85D2, 0x8624, 0x85B8, 0x85B7, 0x85BE, 0x8669, 0x87E7, 0x87E6,\n    0x87E2, 0x87DB, 0x87EB, 0x87EA, 0x87E5, 0x87DF, 0x87F3, 0x87E4,\n    0x87D4, 0x87DC, 0x87D3, 0x87ED, 0x87D8, 0x87E3, 0x87D7, 0x87D9,\n    0x8801, 0x87F4, 0x87E8, 0x87DD, 0x8953, 0x894B, 0x894F, 0x894C,\n    0x8946, 0x8950, 0x8951, 0x8949, 0x8B2A, 0x8B27, 0x8B23, 0x8B33,\n    0x8B30, 0x8B35, 0x8B47, 0x8B2F, 0x8B3C, 0x8B3E, 0x8B31, 0x8B25,\n    0x8B37, 0x8B26, 0x8B36, 0x8B2E, 0x8B24, 0x8B3B, 0x8B3D, 0x8B3A,\n    0x8C42, 0x8C75, 0x8C99, 0x8C98, 0x8C97, 0x8CFE, 0x8D04, 0x8D02,\n    0x8D00, 0x8E5C, 0x8E62, 0x8E60, 0x8E57, 0x8E56, 0x8E5E, 0x8E65,\n    0x8E67, 0x8E5B, 0x8E5A, 0x8E61, 0x8E5D, 0x8E69, 0x8E54, 0x8F46,\n    0x8F47, 0x8F48, 0x8F4B, 0x9128, 0x913A, 0x913B, 0x913E, 0x91A8,\n    0x91A5, 0x91A7, 0x91AF, 0x91AA, 0x93B5, 0x938C, 0x9392, 0x93B7,\n    0x939B, 0x939D, 0x9389, 0x93A7, 0x938E, 0x93AA, 0x939E, 0x93A6,\n    0x9395, 0x9388, 0x9399, 0x939F, 0x9380, 0x938D, 0x93B1, 0x9391,\n    0x93B2, 0x93A4, 0x93A8, 0x93B4, 0x93A3, 0x95D2, 0x95D3, 0x95D1,\n    0x96B3, 0x96D7, 0x96DA, 0x5DC2, 0x96DF, 0x96D8, 0x96DD, 0x9723,\n    0x9722, 0x9725, 0x97AC, 0x97AE, 0x97A8, 0x97AB, 0x97A4, 0x97AA,\n    0x97A2, 0x97A5, 0x97D7, 0x97D9, 0x97D6, 0x97D8, 0x97FA, 0x9850,\n    0x9851, 0x9852, 0x98B8, 0x9941, 0x993C, 0x993A, 0x9A0F, 0x9A0B,\n    0x9A09, 0x9A0D, 0x9A04, 0x9A11, 0x9A0A, 0x9A05, 0x9A07, 0x9A06,\n    0x9AC0, 0x9ADC, 0x9B08, 0x9B04, 0x9B05, 0x9B29, 0x9B35, 0x9B4A,\n    0x9B4C, 0x9B4B, 0x9BC7, 0x9BC6, 0x9BC3, 0x9BBF, 0x9BC1, 0x9BB5,\n    0x9BB8, 0x9BD3, 0x9BB6, 0x9BC4, 0x9BB9, 0x9BBD, 0x9D5C, 0x9D53,\n    0x9D4F, 0x9D4A, 0x9D5B, 0x9D4B, 0x9D59, 0x9D56, 0x9D4C, 0x9D57,\n    0x9D52, 0x9D54, 0x9D5F, 0x9D58, 0x9D5A, 0x9E8E, 0x9E8C, 0x9EDF,\n    0x9F01, 0x9F00, 0x9F16, 0x9F25, 0x9F2B, 0x9F2A, 0x9F29, 0x9F28,\n    0x9F4C, 0x9F55, 0x5134, 0x5135, 0x5296, 0x52F7, 0x53B4, 0x56AB,\n    0x56AD, 0x56A6, 0x56A7, 0x56AA, 0x56AC, 0x58DA, 0x58DD, 0x58DB,\n    0x5912, 0x5B3D, 0x5B3E, 0x5B3F, 0x5DC3, 0x5E70, 0x5FBF, 0x61FB,\n    0x6507, 0x6510, 0x650D, 0x6509, 0x650C, 0x650E, 0x6584, 0x65DE,\n    0x65DD, 0x66DE, 0x6AE7, 0x6AE0, 0x6ACC, 0x6AD1, 0x6AD9, 0x6ACB,\n    0x6ADF, 0x6ADC, 0x6AD0, 0x6AEB, 0x6ACF, 0x6ACD, 0x6ADE, 0x6B60,\n    0x6BB0, 0x6C0C, 0x7019, 0x7027, 0x7020, 0x7016, 0x702B, 0x7021,\n    0x7022, 0x7023, 0x7029, 0x7017, 0x7024, 0x701C, 0x720C, 0x720A,\n    0x7207, 0x7202, 0x7205, 0x72A5, 0x72A6, 0x72A4, 0x72A3, 0x72A1,\n    0x74CB, 0x74C5, 0x74B7, 0x74C3, 0x7516, 0x7660, 0x77C9, 0x77CA,\n    0x77C4, 0x77F1, 0x791D, 0x791B, 0x7921, 0x791C, 0x7917, 0x791E,\n    0x79B0, 0x7A67, 0x7A68, 0x7C33, 0x7C3C, 0x7C39, 0x7C2C, 0x7C3B,\n    0x7CEC, 0x7CEA, 0x7E76, 0x7E75, 0x7E78, 0x7E70, 0x7E77, 0x7E6F,\n    0x7E7A, 0x7E72, 0x7E74, 0x7E68, 0x7F4B, 0x7F4A, 0x7F83, 0x7F86,\n    0x7FB7, 0x7FFD, 0x7FFE, 0x8078, 0x81D7, 0x81D5, 0x820B, 0x8264,\n    0x8261, 0x8263, 0x85EB, 0x85F1, 0x85ED, 0x85D9, 0x85E1, 0x85E8,\n    0x85DA, 0x85D7, 0x85EC, 0x85F2, 0x85F8, 0x85D8, 0x85DF, 0x85E3,\n    0x85DC, 0x85D1, 0x85F0, 0x85E6, 0x85EF, 0x85DE, 0x85E2, 0x8800,\n    0x87FA, 0x8803, 0x87F6, 0x87F7, 0x8809, 0x880C, 0x880B, 0x8806,\n    0x87FC, 0x8808, 0x87FF, 0x880A, 0x8802, 0x8962, 0x895A, 0x895B,\n    0x8957, 0x8961, 0x895C, 0x8958, 0x895D, 0x8959, 0x8988, 0x89B7,\n    0x89B6, 0x89F6, 0x8B50, 0x8B48, 0x8B4A, 0x8B40, 0x8B53, 0x8B56,\n    0x8B54, 0x8B4B, 0x8B55, 0x8B51, 0x8B42, 0x8B52, 0x8B57, 0x8C43,\n    0x8C77, 0x8C76, 0x8C9A, 0x8D06, 0x8D07, 0x8D09, 0x8DAC, 0x8DAA,\n    0x8DAD, 0x8DAB, 0x8E6D, 0x8E78, 0x8E73, 0x8E6A, 0x8E6F, 0x8E7B,\n    0x8EC2, 0x8F52, 0x8F51, 0x8F4F, 0x8F50, 0x8F53, 0x8FB4, 0x9140,\n    0x913F, 0x91B0, 0x91AD, 0x93DE, 0x93C7, 0x93CF, 0x93C2, 0x93DA,\n    0x93D0, 0x93F9, 0x93EC, 0x93CC, 0x93D9, 0x93A9, 0x93E6, 0x93CA,\n    0x93D4, 0x93EE, 0x93E3, 0x93D5, 0x93C4, 0x93CE, 0x93C0, 0x93D2,\n    0x93A5, 0x93E7, 0x957D, 0x95DA, 0x95DB, 0x96E1, 0x9729, 0x972B,\n    0x972C, 0x9728, 0x9726, 0x97B3, 0x97B7, 0x97B6, 0x97DD, 0x97DE,\n    0x97DF, 0x985C, 0x9859, 0x985D, 0x9857, 0x98BF, 0x98BD, 0x98BB,\n    0x98BE, 0x9948, 0x9947, 0x9943, 0x99A6, 0x99A7, 0x9A1A, 0x9A15,\n    0x9A25, 0x9A1D, 0x9A24, 0x9A1B, 0x9A22, 0x9A20, 0x9A27, 0x9A23,\n    0x9A1E, 0x9A1C, 0x9A14, 0x9AC2, 0x9B0B, 0x9B0A, 0x9B0E, 0x9B0C,\n    0x9B37, 0x9BEA, 0x9BEB, 0x9BE0, 0x9BDE, 0x9BE4, 0x9BE6, 0x9BE2,\n    0x9BF0, 0x9BD4, 0x9BD7, 0x9BEC, 0x9BDC, 0x9BD9, 0x9BE5, 0x9BD5,\n    0x9BE1, 0x9BDA, 0x9D77, 0x9D81, 0x9D8A, 0x9D84, 0x9D88, 0x9D71,\n    0x9D80, 0x9D78, 0x9D86, 0x9D8B, 0x9D8C, 0x9D7D, 0x9D6B, 0x9D74,\n    0x9D75, 0x9D70, 0x9D69, 0x9D85, 0x9D73, 0x9D7B, 0x9D82, 0x9D6F,\n    0x9D79, 0x9D7F, 0x9D87, 0x9D68, 0x9E94, 0x9E91, 0x9EC0, 0x9EFC,\n    0x9F2D, 0x9F40, 0x9F41, 0x9F4D, 0x9F56, 0x9F57, 0x9F58, 0x5337,\n    0x56B2, 0x56B5, 0x56B3, 0x58E3, 0x5B45, 0x5DC6, 0x5DC7, 0x5EEE,\n    0x5EEF, 0x5FC0, 0x5FC1, 0x61F9, 0x6517, 0x6516, 0x6515, 0x6513,\n    0x65DF, 0x66E8, 0x66E3, 0x66E4, 0x6AF3, 0x6AF0, 0x6AEA, 0x6AE8,\n    0x6AF9, 0x6AF1, 0x6AEE, 0x6AEF, 0x703C, 0x7035, 0x702F, 0x7037,\n    0x7034, 0x7031, 0x7042, 0x7038, 0x703F, 0x703A, 0x7039, 0x702A,\n    0x7040, 0x703B, 0x7033, 0x7041, 0x7213, 0x7214, 0x72A8, 0x737D,\n    0x737C, 0x74BA, 0x76AB, 0x76AA, 0x76BE, 0x76ED, 0x77CC, 0x77CE,\n    0x77CF, 0x77CD, 0x77F2, 0x7925, 0x7923, 0x7927, 0x7928, 0x7924,\n    0x7929, 0x79B2, 0x7A6E, 0x7A6C, 0x7A6D, 0x7AF7, 0x7C49, 0x7C48,\n    0x7C4A, 0x7C47, 0x7C45, 0x7CEE, 0x7E7B, 0x7E7E, 0x7E81, 0x7E80,\n    0x7FBA, 0x7FFF, 0x8079, 0x81DB, 0x81D9, 0x8268, 0x8269, 0x8622,\n    0x85FF, 0x8601, 0x85FE, 0x861B, 0x8600, 0x85F6, 0x8604, 0x8609,\n    0x8605, 0x860C, 0x85FD, 0x8819, 0x8810, 0x8811, 0x8817, 0x8813,\n    0x8816, 0x8963, 0x8966, 0x89B9, 0x89F7, 0x8B60, 0x8B6A, 0x8B5D,\n    0x8B68, 0x8B63, 0x8B65, 0x8B67, 0x8B6D, 0x8DAE, 0x8E86, 0x8E88,\n    0x8E84, 0x8F59, 0x8F56, 0x8F57, 0x8F55, 0x8F58, 0x8F5A, 0x908D,\n    0x9143, 0x9141, 0x91B7, 0x91B5, 0x91B2, 0x91B3, 0x940B, 0x9413,\n    0x93FB, 0x9420, 0x940F, 0x9414, 0x93FE, 0x9415, 0x9410, 0x9428,\n    0x9419, 0x940D, 0x93F5, 0x9400, 0x93F7, 0x9407, 0x940E, 0x9416,\n    0x9412, 0x93FA, 0x9409, 0x93F8, 0x943C, 0x940A, 0x93FF, 0x93FC,\n    0x940C, 0x93F6, 0x9411, 0x9406, 0x95DE, 0x95E0, 0x95DF, 0x972E,\n    0x972F, 0x97B9, 0x97BB, 0x97FD, 0x97FE, 0x9860, 0x9862, 0x9863,\n    0x985F, 0x98C1, 0x98C2, 0x9950, 0x994E, 0x9959, 0x994C, 0x994B,\n    0x9953, 0x9A32, 0x9A34, 0x9A31, 0x9A2C, 0x9A2A, 0x9A36, 0x9A29,\n    0x9A2E, 0x9A38, 0x9A2D, 0x9AC7, 0x9ACA, 0x9AC6, 0x9B10, 0x9B12,\n    0x9B11, 0x9C0B, 0x9C08, 0x9BF7, 0x9C05, 0x9C12, 0x9BF8, 0x9C40,\n    0x9C07, 0x9C0E, 0x9C06, 0x9C17, 0x9C14, 0x9C09, 0x9D9F, 0x9D99,\n    0x9DA4, 0x9D9D, 0x9D92, 0x9D98, 0x9D90, 0x9D9B, 0x9DA0, 0x9D94,\n    0x9D9C, 0x9DAA, 0x9D97, 0x9DA1, 0x9D9A, 0x9DA2, 0x9DA8, 0x9D9E,\n    0x9DA3, 0x9DBF, 0x9DA9, 0x9D96, 0x9DA6, 0x9DA7, 0x9E99, 0x9E9B,\n    0x9E9A, 0x9EE5, 0x9EE4, 0x9EE7, 0x9EE6, 0x9F30, 0x9F2E, 0x9F5B,\n    0x9F60, 0x9F5E, 0x9F5D, 0x9F59, 0x9F91, 0x513A, 0x5139, 0x5298,\n    0x5297, 0x56C3, 0x56BD, 0x56BE, 0x5B48, 0x5B47, 0x5DCB, 0x5DCF,\n    0x5EF1, 0x61FD, 0x651B, 0x6B02, 0x6AFC, 0x6B03, 0x6AF8, 0x6B00,\n    0x7043, 0x7044, 0x704A, 0x7048, 0x7049, 0x7045, 0x7046, 0x721D,\n    0x721A, 0x7219, 0x737E, 0x7517, 0x766A, 0x77D0, 0x792D, 0x7931,\n    0x792F, 0x7C54, 0x7C53, 0x7CF2, 0x7E8A, 0x7E87, 0x7E88, 0x7E8B,\n    0x7E86, 0x7E8D, 0x7F4D, 0x7FBB, 0x8030, 0x81DD, 0x8618, 0x862A,\n    0x8626, 0x861F, 0x8623, 0x861C, 0x8619, 0x8627, 0x862E, 0x8621,\n    0x8620, 0x8629, 0x861E, 0x8625, 0x8829, 0x881D, 0x881B, 0x8820,\n    0x8824, 0x881C, 0x882B, 0x884A, 0x896D, 0x8969, 0x896E, 0x896B,\n    0x89FA, 0x8B79, 0x8B78, 0x8B45, 0x8B7A, 0x8B7B, 0x8D10, 0x8D14,\n    0x8DAF, 0x8E8E, 0x8E8C, 0x8F5E, 0x8F5B, 0x8F5D, 0x9146, 0x9144,\n    0x9145, 0x91B9, 0x943F, 0x943B, 0x9436, 0x9429, 0x943D, 0x9430,\n    0x9439, 0x942A, 0x9437, 0x942C, 0x9440, 0x9431, 0x95E5, 0x95E4,\n    0x95E3, 0x9735, 0x973A, 0x97BF, 0x97E1, 0x9864, 0x98C9, 0x98C6,\n    0x98C0, 0x9958, 0x9956, 0x9A39, 0x9A3D, 0x9A46, 0x9A44, 0x9A42,\n    0x9A41, 0x9A3A, 0x9A3F, 0x9ACD, 0x9B15, 0x9B17, 0x9B18, 0x9B16,\n    0x9B3A, 0x9B52, 0x9C2B, 0x9C1D, 0x9C1C, 0x9C2C, 0x9C23, 0x9C28,\n    0x9C29, 0x9C24, 0x9C21, 0x9DB7, 0x9DB6, 0x9DBC, 0x9DC1, 0x9DC7,\n    0x9DCA, 0x9DCF, 0x9DBE, 0x9DC5, 0x9DC3, 0x9DBB, 0x9DB5, 0x9DCE,\n    0x9DB9, 0x9DBA, 0x9DAC, 0x9DC8, 0x9DB1, 0x9DAD, 0x9DCC, 0x9DB3,\n    0x9DCD, 0x9DB2, 0x9E7A, 0x9E9C, 0x9EEB, 0x9EEE, 0x9EED, 0x9F1B,\n    0x9F18, 0x9F1A, 0x9F31, 0x9F4E, 0x9F65, 0x9F64, 0x9F92, 0x4EB9,\n    0x56C6, 0x56C5, 0x56CB, 0x5971, 0x5B4B, 0x5B4C, 0x5DD5, 0x5DD1,\n    0x5EF2, 0x6521, 0x6520, 0x6526, 0x6522, 0x6B0B, 0x6B08, 0x6B09,\n    0x6C0D, 0x7055, 0x7056, 0x7057, 0x7052, 0x721E, 0x721F, 0x72A9,\n    0x737F, 0x74D8, 0x74D5, 0x74D9, 0x74D7, 0x766D, 0x76AD, 0x7935,\n    0x79B4, 0x7A70, 0x7A71, 0x7C57, 0x7C5C, 0x7C59, 0x7C5B, 0x7C5A,\n    0x7CF4, 0x7CF1, 0x7E91, 0x7F4F, 0x7F87, 0x81DE, 0x826B, 0x8634,\n    0x8635, 0x8633, 0x862C, 0x8632, 0x8636, 0x882C, 0x8828, 0x8826,\n    0x882A, 0x8825, 0x8971, 0x89BF, 0x89BE, 0x89FB, 0x8B7E, 0x8B84,\n    0x8B82, 0x8B86, 0x8B85, 0x8B7F, 0x8D15, 0x8E95, 0x8E94, 0x8E9A,\n    0x8E92, 0x8E90, 0x8E96, 0x8E97, 0x8F60, 0x8F62, 0x9147, 0x944C,\n    0x9450, 0x944A, 0x944B, 0x944F, 0x9447, 0x9445, 0x9448, 0x9449,\n    0x9446, 0x973F, 0x97E3, 0x986A, 0x9869, 0x98CB, 0x9954, 0x995B,\n    0x9A4E, 0x9A53, 0x9A54, 0x9A4C, 0x9A4F, 0x9A48, 0x9A4A, 0x9A49,\n    0x9A52, 0x9A50, 0x9AD0, 0x9B19, 0x9B2B, 0x9B3B, 0x9B56, 0x9B55,\n    0x9C46, 0x9C48, 0x9C3F, 0x9C44, 0x9C39, 0x9C33, 0x9C41, 0x9C3C,\n    0x9C37, 0x9C34, 0x9C32, 0x9C3D, 0x9C36, 0x9DDB, 0x9DD2, 0x9DDE,\n    0x9DDA, 0x9DCB, 0x9DD0, 0x9DDC, 0x9DD1, 0x9DDF, 0x9DE9, 0x9DD9,\n    0x9DD8, 0x9DD6, 0x9DF5, 0x9DD5, 0x9DDD, 0x9EB6, 0x9EF0, 0x9F35,\n    0x9F33, 0x9F32, 0x9F42, 0x9F6B, 0x9F95, 0x9FA2, 0x513D, 0x5299,\n    0x58E8, 0x58E7, 0x5972, 0x5B4D, 0x5DD8, 0x882F, 0x5F4F, 0x6201,\n    0x6203, 0x6204, 0x6529, 0x6525, 0x6596, 0x66EB, 0x6B11, 0x6B12,\n    0x6B0F, 0x6BCA, 0x705B, 0x705A, 0x7222, 0x7382, 0x7381, 0x7383,\n    0x7670, 0x77D4, 0x7C67, 0x7C66, 0x7E95, 0x826C, 0x863A, 0x8640,\n    0x8639, 0x863C, 0x8631, 0x863B, 0x863E, 0x8830, 0x8832, 0x882E,\n    0x8833, 0x8976, 0x8974, 0x8973, 0x89FE, 0x8B8C, 0x8B8E, 0x8B8B,\n    0x8B88, 0x8C45, 0x8D19, 0x8E98, 0x8F64, 0x8F63, 0x91BC, 0x9462,\n    0x9455, 0x945D, 0x9457, 0x945E, 0x97C4, 0x97C5, 0x9800, 0x9A56,\n    0x9A59, 0x9B1E, 0x9B1F, 0x9B20, 0x9C52, 0x9C58, 0x9C50, 0x9C4A,\n    0x9C4D, 0x9C4B, 0x9C55, 0x9C59, 0x9C4C, 0x9C4E, 0x9DFB, 0x9DF7,\n    0x9DEF, 0x9DE3, 0x9DEB, 0x9DF8, 0x9DE4, 0x9DF6, 0x9DE1, 0x9DEE,\n    0x9DE6, 0x9DF2, 0x9DF0, 0x9DE2, 0x9DEC, 0x9DF4, 0x9DF3, 0x9DE8,\n    0x9DED, 0x9EC2, 0x9ED0, 0x9EF2, 0x9EF3, 0x9F06, 0x9F1C, 0x9F38,\n    0x9F37, 0x9F36, 0x9F43, 0x9F4F, 0x9F71, 0x9F70, 0x9F6E, 0x9F6F,\n    0x56D3, 0x56CD, 0x5B4E, 0x5C6D, 0x652D, 0x66ED, 0x66EE, 0x6B13,\n    0x705F, 0x7061, 0x705D, 0x7060, 0x7223, 0x74DB, 0x74E5, 0x77D5,\n    0x7938, 0x79B7, 0x79B6, 0x7C6A, 0x7E97, 0x7F89, 0x826D, 0x8643,\n    0x8838, 0x8837, 0x8835, 0x884B, 0x8B94, 0x8B95, 0x8E9E, 0x8E9F,\n    0x8EA0, 0x8E9D, 0x91BE, 0x91BD, 0x91C2, 0x946B, 0x9468, 0x9469,\n    0x96E5, 0x9746, 0x9743, 0x9747, 0x97C7, 0x97E5, 0x9A5E, 0x9AD5,\n    0x9B59, 0x9C63, 0x9C67, 0x9C66, 0x9C62, 0x9C5E, 0x9C60, 0x9E02,\n    0x9DFE, 0x9E07, 0x9E03, 0x9E06, 0x9E05, 0x9E00, 0x9E01, 0x9E09,\n    0x9DFF, 0x9DFD, 0x9E04, 0x9EA0, 0x9F1E, 0x9F46, 0x9F74, 0x9F75,\n    0x9F76, 0x56D4, 0x652E, 0x65B8, 0x6B18, 0x6B19, 0x6B17, 0x6B1A,\n    0x7062, 0x7226, 0x72AA, 0x77D8, 0x77D9, 0x7939, 0x7C69, 0x7C6B,\n    0x7CF6, 0x7E9A, 0x7E98, 0x7E9B, 0x7E99, 0x81E0, 0x81E1, 0x8646,\n    0x8647, 0x8648, 0x8979, 0x897A, 0x897C, 0x897B, 0x89FF, 0x8B98,\n    0x8B99, 0x8EA5, 0x8EA4, 0x8EA3, 0x946E, 0x946D, 0x946F, 0x9471,\n    0x9473, 0x9749, 0x9872, 0x995F, 0x9C68, 0x9C6E, 0x9C6D, 0x9E0B,\n    0x9E0D, 0x9E10, 0x9E0F, 0x9E12, 0x9E11, 0x9EA1, 0x9EF5, 0x9F09,\n    0x9F47, 0x9F78, 0x9F7B, 0x9F7A, 0x9F79, 0x571E, 0x7066, 0x7C6F,\n    0x883C, 0x8DB2, 0x8EA6, 0x91C3, 0x9474, 0x9478, 0x9476, 0x9475,\n    0x9A60, 0x9B2E, 0x9C74, 0x9C73, 0x9C71, 0x9C75, 0x9E14, 0x9E13,\n    0x9EF6, 0x9F0A, 0x9FA4, 0x7068, 0x7065, 0x7CF7, 0x866A, 0x883E,\n    0x883D, 0x883F, 0x8B9E, 0x8C9C, 0x8EA9, 0x8EC9, 0x974B, 0x9873,\n    0x9874, 0x98CC, 0x9961, 0x99AB, 0x9A64, 0x9A66, 0x9A67, 0x9B24,\n    0x9E15, 0x9E17, 0x9F48, 0x6207, 0x6B1E, 0x7227, 0x864C, 0x8EA8,\n    0x9482, 0x9480, 0x9481, 0x9A69, 0x9A68, 0x9E19, 0x864B, 0x8B9F,\n    0x9483, 0x9C79, 0x9EB7, 0x7675, 0x9A6B, 0x9C7A, 0x9E1D, 0x7069,\n    0x706A, 0x7229, 0x9EA4, 0x9F7E, 0x9F49, 0x9F98, 0xFE19, 0x223C,\n    0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,\n    0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,\n    0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,\n    0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,\n    0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,\n    0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,\n    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,\n    0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,\n    0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,\n    0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,\n    0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,\n    0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0xFE33,\n    0x2574, 0xFE34, 0xFE4F, 0x0308, 0xFF3E, 0x30FD, 0x30FE, 0x309D,\n    0x309E, 0xFFFD, 0x3005, 0x3006, 0x3007, 0x30FC, 0xFF3B, 0xFF3D,\n    0x273D, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047,\n    0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F,\n    0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057,\n    0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F,\n    0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067,\n    0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,\n    0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077,\n    0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F,\n    0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087,\n    0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F,\n    0x3090, 0x3091, 0x3092, 0x3093, 0x30A1, 0x30A2, 0x30A3, 0x30A4,\n    0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC,\n    0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4,\n    0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC,\n    0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4,\n    0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC,\n    0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4,\n    0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC,\n    0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4,\n    0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC,\n    0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4,\n    0x30F5, 0x30F6, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415,\n    0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C,\n    0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424,\n    0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C,\n    0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434,\n    0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B,\n    0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443,\n    0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B,\n    0x044C, 0x044D, 0x044E, 0x044F, 0x21E7, 0x21B8, 0x21B9, 0x4E41,\n    0x0000, 0x4E5A, 0x0000, 0x5202, 0x4491, 0x9FB0, 0x5188, 0x9FB1,\n    0x0000, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,\n    0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,\n    0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,\n    0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,\n    0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,\n    0xFFFD, 0x00AC, 0xFFE4, 0xFF07, 0xFF02, 0x3231, 0x2116, 0x2121,\n    0x7881, 0x92B9, 0x88CF, 0x58BB, 0x6052, 0x7CA7, 0x5AFA, 0x2554,\n    0x2566, 0x2557, 0x2560, 0x256C, 0x2563, 0x255A, 0x2569, 0x255D,\n    0x2552, 0x2564, 0x2555, 0xFFFD, 0xFFFD, 0xFFFD, 0x2558, 0x2567,\n    0x255B, 0x2553, 0x2565, 0x2556, 0x255F, 0x256B, 0x2562, 0x2559,\n    0x2568, 0x255C, 0x2551, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,\n    0x2593, 0xFFFD, 0xFFFD, 0xFE10, 0xFE11, 0xFE12, 0xFFFD, 0xFE14,\n    0xFE13, 0xFE16, 0xFE15, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,\n    0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,\n    0xFFFD, 0xFFFD, 0xFFFD, 0x0000, 0x57BE, 0x0000, 0x713E, 0x0000,\n    0x69A2, 0x0000, 0x5B74, 0x7A49, 0x0000, 0x0000, 0x7A65, 0x7A7D,\n    0x0000, 0x7ABB, 0x7AB0, 0x7AC2, 0x7AC3, 0x71D1, 0x0000, 0x41CA,\n    0x7ADA, 0x7ADD, 0x7AEA, 0x41EF, 0x54B2, 0x0000, 0x7B0B, 0x7B55,\n    0x7B29, 0x0000, 0x0000, 0x7BA2, 0x7B6F, 0x839C, 0x0000, 0x0000,\n    0x7BD0, 0x8421, 0x7B92, 0xFFFD, 0x0000, 0xFFFD, 0x8492, 0x7BFA,\n    0xFFFD, 0x7C35, 0x0000, 0x7C44, 0x7C83, 0x0000, 0x7CA6, 0x0000,\n    0x7CC9, 0x7CC7, 0x7CE6, 0xFFFD, 0x7CF3, 0x7CF5, 0x7E67, 0x451D,\n    0x0000, 0x7D5D, 0x0000, 0x7D89, 0x7DAB, 0x7135, 0x7DB3, 0x7DD6,\n    0x0000, 0x0000, 0x7DE4, 0x3D13, 0x7DF5, 0x0000, 0x7DE5, 0x0000,\n    0xFFFD, 0x0000, 0x0000, 0x7E6E, 0xFFFD, 0x432B, 0x946C, 0x7E27,\n    0x7F40, 0x7F41, 0x7F47, 0x7936, 0x0000, 0x99E1, 0x7F97, 0x0000,\n    0x7FA3, 0x0000, 0x0000, 0x455C, 0x0000, 0x0000, 0x7FFA, 0x0000,\n    0xFA5B, 0x8008, 0x801D, 0xFFFD, 0x802F, 0x0000, 0x0000, 0x803B,\n    0x803C, 0x8061, 0x0000, 0x4989, 0x0000, 0x0000, 0x0000, 0x6725,\n    0x80A7, 0x0000, 0x8107, 0x811A, 0x58B0, 0x0000, 0x6C7F, 0x0000,\n    0x64E7, 0x0000, 0x8218, 0x0000, 0x6A53, 0x0000, 0x0000, 0x447A,\n    0x8229, 0x0000, 0x0000, 0x4FF9, 0x0000, 0x84E2, 0x8362, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x82AA, 0x691B, 0x0000, 0x41DB,\n    0x854B, 0x82D0, 0x831A, 0x0000, 0x0000, 0x36C1, 0x0000, 0x0000,\n    0x827B, 0x82E2, 0x8318, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x3DBF, 0x831D, 0x55EC, 0x8385, 0x450B, 0x0000, 0x83AC, 0xFFFD,\n    0x83D3, 0x0000, 0x6A57, 0x855A, 0x3496, 0x0000, 0x8458, 0x0000,\n    0x8471, 0x3DD3, 0x44E4, 0x6AA7, 0x844A, 0x7958, 0xFFFD, 0x0000,\n    0x0000, 0x0000, 0x84DE, 0xFFFD, 0x8391, 0x44A0, 0x8493, 0x84E4,\n    0x0000, 0x4240, 0x0000, 0x4543, 0x8534, 0x5AF2, 0x4523, 0x4527,\n    0x8573, 0x4516, 0x67BF, 0x8616, 0x0000, 0x0000, 0x85C1, 0x0000,\n    0x8602, 0x0000, 0x0000, 0x0000, 0x456A, 0x8628, 0x3648, 0x0000,\n    0x53F7, 0x0000, 0x867E, 0xFFFD, 0x0000, 0x87EE, 0x0000, 0x87B1,\n    0x87DA, 0x880F, 0x5661, 0x866C, 0x6856, 0x460F, 0x8845, 0x8846,\n    0x0000, 0x0000, 0x0000, 0x885E, 0x889C, 0x465B, 0x88B4, 0x88B5,\n    0x88C5, 0x0000, 0x8987, 0xFFFD, 0xFFFD, 0xFFFD, 0x89A7, 0x89BC,\n    0x0000, 0x89E7, 0x0000, 0x0000, 0x8A9C, 0x7793, 0x91FE, 0x8A90,\n    0x0000, 0x7AE9, 0x0000, 0x4713, 0x0000, 0x717C, 0x8B0C, 0x8B1F,\n    0x0000, 0x0000, 0x8B3F, 0xFFFD, 0x8B4D, 0x8AA9, 0x0000, 0x8B90,\n    0x8B9B, 0x8AAF, 0x0000, 0x4615, 0x884F, 0x8C9B, 0x0000, 0x0000,\n    0x0000, 0x3725, 0x0000, 0x8CD6, 0x0000, 0x0000, 0x8D12, 0x8D03,\n    0x0000, 0x8CDB, 0x705C, 0x8D11, 0x3ED0, 0x0000, 0x8DA9, 0x0000,\n    0x0000, 0x0000, 0x3B7C, 0x0000, 0x0000, 0x7AE7, 0x8EAD, 0x8EB6,\n    0x8EC3, 0x92D4, 0x8F19, 0x8F2D, 0x0000, 0x0000, 0x8FA5, 0x9303,\n    0x0000, 0x0000, 0x8FB3, 0xFFFD, 0x0000, 0x0000, 0x0000, 0x5EF8,\n    0x0000, 0x8FF9, 0xFFFD, 0x0000, 0x3980, 0x0000, 0x9037, 0x0000,\n    0x0000, 0x9061, 0x0000, 0x0000, 0x90A8, 0x0000, 0x90C4, 0x0000,\n    0x90AE, 0xFA26, 0x9167, 0x91A9, 0x91C4, 0x7CAC, 0x0000, 0x0000,\n    0x920E, 0x6C9F, 0x9241, 0x9262, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x932C, 0x936B, 0x0000, 0x0000, 0x5AC3, 0x0000,\n    0x0000, 0x4965, 0x9244, 0x0000, 0x0000, 0x0000, 0x9373, 0x945B,\n    0x8EBC, 0x9585, 0x95A6, 0x9426, 0x95A0, 0x6FF6, 0x42B9, 0x0000,\n    0x0000, 0x0000, 0x49DF, 0x6C1C, 0x967B, 0x9696, 0x416C, 0x96A3,\n    0x0000, 0x61DA, 0xE4AD, 0x78F5, 0x0000, 0x96BD, 0x53CC, 0x49A1,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x9731, 0x8642, 0x9736, 0x4A0F, 0x453D, 0x4585, 0x0000, 0x7075,\n    0x5B41, 0x971B, 0xFFFD, 0x0000, 0x9757, 0x5B4A, 0x0000, 0x975F,\n    0x9425, 0x50D0, 0x0000, 0x0000, 0x9789, 0x979F, 0x97B1, 0x97BE,\n    0x97C0, 0x97D2, 0x97E0, 0x0000, 0x97EE, 0x741C, 0x0000, 0xFFFD,\n    0x97F5, 0x0000, 0x0000, 0x4AD1, 0x9834, 0x9833, 0x984B, 0x9866,\n    0x3B0E, 0x0000, 0x3D51, 0x0000, 0x0000, 0x0000, 0x98CA, 0x98B7,\n    0x98C8, 0x98C7, 0x4AFF, 0x0000, 0x0000, 0x55B0, 0x98E1, 0x98E6,\n    0x98EC, 0x9378, 0x9939, 0x0000, 0x4B72, 0x0000, 0x0000, 0x99F5,\n    0x9A0C, 0x9A3B, 0x9A10, 0x9A58, 0x0000, 0x36C4, 0x0000, 0x0000,\n    0x9AE0, 0x9AE2, 0x0000, 0x9AF4, 0x4C0E, 0x9B14, 0x9B2D, 0x0000,\n    0x5034, 0x9B34, 0x38C3, 0x0000, 0x9B50, 0x9B40, 0x0000, 0x5A45,\n    0x0000, 0x9B8E, 0x9C02, 0x9BFF, 0x9C0C, 0x0000, 0x9DD4, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9D7E, 0x9D83, 0x0000,\n    0x9E0E, 0x9DC4, 0x0000, 0x0000, 0x0000, 0x0000, 0x9D39, 0x0000,\n    0x0000, 0x9E90, 0x9E95, 0x9E9E, 0x9EA2, 0x4D34, 0x9EAA, 0x9EAF,\n    0x0000, 0x9EC1, 0x3B60, 0x39E5, 0x3D1D, 0x4F32, 0x37BE, 0x0000,\n    0x9F02, 0x9F08, 0x4B96, 0x9424, 0x0000, 0x9F17, 0x0000, 0x9F39,\n    0x569F, 0x568A, 0x9F45, 0x99B8, 0x0000, 0x97F2, 0x847F, 0xFFFD,\n    0x9F69, 0x7ADC, 0x9F8E, 0x7216, 0x4BBE, 0x0000, 0x0000, 0x7177,\n    0x0000, 0x0000, 0x0000, 0x739E, 0x0000, 0x0000, 0x799F, 0x0000,\n    0x0000, 0x9369, 0x93F3, 0x0000, 0x92EC, 0x9381, 0x93CB, 0x0000,\n    0x0000, 0x7217, 0x3EEB, 0x7772, 0x7A43, 0x70D0, 0x0000, 0x0000,\n    0x717E, 0x0000, 0x70A3, 0x0000, 0x0000, 0x3EC7, 0x0000, 0x0000,\n    0x0000, 0x3722, 0x0000, 0x0000, 0x36E1, 0x0000, 0x0000, 0x0000,\n    0x3723, 0x0000, 0x575B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8503, 0x0000, 0xFFFD, 0x8455, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x44F4, 0x0000, 0x0000, 0x0000, 0x67F9, 0x3733,\n    0x3C15, 0x3DE7, 0x586C, 0x0000, 0x6810, 0x4057, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x54CB, 0x569E, 0x0000, 0x5692, 0x0000,\n    0x0000, 0x0000, 0xFFFD, 0x0000, 0x939C, 0x4EF8, 0x512B, 0x3819,\n    0x0000, 0x4EBC, 0x0000, 0xFFFD, 0x4F4B, 0x4F8A, 0x0000, 0x5A68,\n    0x0000, 0x0000, 0x3999, 0x0000, 0x0000, 0x3435, 0x4F29, 0x0000,\n    0x0000, 0x0000, 0x8ADA, 0x0000, 0x4E98, 0x50CD, 0x510D, 0x4FA2,\n    0x4F03, 0x0000, 0x0000, 0x4F42, 0x502E, 0x506C, 0x5081, 0x4FCC,\n    0x4FE5, 0x5058, 0x50FC, 0x6E76, 0x0000, 0x0000, 0x0000, 0x6D72,\n    0x0000, 0x0000, 0x51A8, 0x51C3, 0x0000, 0x44DD, 0x0000, 0x0000,\n    0x0000, 0x8D7A, 0x0000, 0x0000, 0x5259, 0x52A4, 0x0000, 0x52E1,\n    0xFFFD, 0x467A, 0x718C, 0x0000, 0x0000, 0x0000, 0x0000, 0x69D1,\n    0x0000, 0xFFFD, 0x3EDE, 0x7499, 0x7414, 0x7456, 0x7398, 0x4B8E,\n    0x0000, 0x0000, 0x53D0, 0x3584, 0x720F, 0x0000, 0x55B4, 0x0000,\n    0x54CD, 0x0000, 0x571D, 0x925D, 0x96F4, 0x57DD, 0x578D, 0x577F,\n    0x363E, 0x58CB, 0x5A99, 0x0000, 0x0000, 0x0000, 0x0000, 0x5A2C,\n    0x59B8, 0x5A7E, 0x5ACF, 0x5A12, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x36F5, 0x6D05, 0x7443, 0x5A21, 0x0000, 0x5A81, 0x0000, 0x0000,\n    0x93E0, 0x748C, 0x0000, 0x7105, 0x4972, 0x9408, 0x0000, 0x93BD,\n    0x37A0, 0x5C1E, 0x5C9E, 0x5E5E, 0x5E48, 0x0000, 0x0000, 0x0000,\n    0x5ECD, 0x5B4F, 0x0000, 0x0000, 0x3701, 0x0000, 0x36DD, 0x0000,\n    0x36D3, 0x812A, 0x0000, 0x0000, 0x0000, 0x0000, 0x5F0C, 0x5F0E,\n    0x0000, 0x0000, 0x5A6B, 0x0000, 0x5B44, 0x0000, 0x8860, 0x607E,\n    0x0000, 0x0000, 0x5FDB, 0x3EB8, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x61C0, 0x0000, 0x0000, 0x0000, 0x6199, 0x6198, 0x6075, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x6471, 0x0000, 0x0000, 0x3A29, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x6337, 0x64B6, 0x6331, 0x63D1, 0x0000,\n    0x0000, 0x62A4, 0x0000, 0x643B, 0x656B, 0x6972, 0x3BF4, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x550D, 0x0000, 0x0000, 0x0000, 0x66CE,\n    0x0000, 0x0000, 0x3AE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x78EE, 0x0000, 0x0000, 0x0000, 0x3464, 0x0000, 0x0000,\n    0x0000, 0x668E, 0x0000, 0x666B, 0x4B93, 0x6630, 0x0000, 0x0000,\n    0x6663, 0x0000, 0x0000, 0x661E, 0x0000, 0x38D1, 0x0000, 0x0000,\n    0x3B99, 0x0000, 0x0000, 0x74D0, 0x3B96, 0x0000, 0x68B6, 0xFFFD,\n    0x3BC4, 0x6ABE, 0x0000, 0x0000, 0x6A33, 0x6A52, 0x6AC9, 0x6B05,\n    0x0000, 0x6511, 0x6898, 0x6A4C, 0x3BD7, 0x6A7A, 0x6B57, 0x0000,\n    0x0000, 0x93A0, 0x92F2, 0x0000, 0x0000, 0x9289, 0x0000, 0x0000,\n    0x9467, 0x6DA5, 0x6F0B, 0xFFFD, 0x0000, 0x3D8F, 0x6E04, 0x0000,\n    0x5A3D, 0x6E0A, 0x5847, 0x6D24, 0x7842, 0x713B, 0x0000, 0x0000,\n    0x70F1, 0x7250, 0x7287, 0x7294, 0x0000, 0x0000, 0x5179, 0x0000,\n    0x0000, 0x747A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3F06,\n    0x3EB1, 0x0000, 0x0000, 0x0000, 0x60A7, 0x3EF3, 0x74CC, 0x743C,\n    0x9387, 0x7437, 0x449F, 0x0000, 0x4551, 0x7583, 0x3F63, 0x0000,\n    0x0000, 0x3F58, 0x7555, 0x7673, 0x0000, 0xFFFD, 0x7468, 0x0000,\n    0x0000, 0x0000, 0x3AFB, 0x3DCD, 0x0000, 0x3EFF, 0x0000, 0x0000,\n    0x91FA, 0x5732, 0x9342, 0x0000, 0x0000, 0x50DF, 0x0000, 0x0000,\n    0x7778, 0x0000, 0x770E, 0x770F, 0x777B, 0x0000, 0x0000, 0x3A5E,\n    0x0000, 0x7438, 0x749B, 0x3EBF, 0x0000, 0x0000, 0x40C8, 0x0000,\n    0x0000, 0x9307, 0x0000, 0x781E, 0x788D, 0x7888, 0x78D2, 0x73D0,\n    0x7959, 0x0000, 0x0000, 0x410E, 0xFFFD, 0xFFFD, 0x79A5, 0x6A2D,\n    0x0000, 0x7A3A, 0x79F4, 0x416E, 0x0000, 0x4132, 0x9235, 0x79F1,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3597, 0x556B, 0x3570,\n    0x36AA, 0x0000, 0x0000, 0x7AE2, 0x5A59, 0x0000, 0x0000, 0x0000,\n    0x5A0D, 0x0000, 0x78F0, 0x5A2A, 0x0000, 0x7AFE, 0x41F9, 0x7C5D,\n    0x7C6D, 0x4211, 0x0000, 0x0000, 0x0000, 0x7CCD, 0x0000, 0x0000,\n    0x7C8E, 0x7C7C, 0x7CAE, 0x6AB2, 0x7DDC, 0x7E07, 0x7DD3, 0x7F4E,\n    0x0000, 0x0000, 0x0000, 0x7D97, 0x0000, 0x426A, 0x0000, 0x0000,\n    0x67D6, 0x0000, 0x0000, 0x57C4, 0x0000, 0x0000, 0x7FDD, 0x7B27,\n    0x0000, 0x0000, 0x0000, 0x7B0C, 0x0000, 0x99E6, 0x8645, 0x9A63,\n    0x6A1C, 0x0000, 0x0000, 0x0000, 0x9A1F, 0x0000, 0x8495, 0x0000,\n    0x0000, 0x44EA, 0x8137, 0x4402, 0x80C6, 0x8109, 0x8142, 0x0000,\n    0x98C3, 0x0000, 0x8262, 0x8265, 0x0000, 0x8453, 0x0000, 0x8610,\n    0x0000, 0x5A86, 0x417F, 0x0000, 0x5B2B, 0x0000, 0x5AE4, 0x0000,\n    0x86A0, 0x0000, 0x0000, 0x882D, 0x0000, 0x5A02, 0x886E, 0x4F45,\n    0x8887, 0x88BF, 0x88E6, 0x8965, 0x894D, 0x0000, 0x8954, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3EAD, 0x84A3, 0x46F5,\n    0x46CF, 0x37F2, 0x8A3D, 0x8A1C, 0x0000, 0x5F4D, 0x922B, 0x0000,\n    0x65D4, 0x7129, 0x70C4, 0x0000, 0x9D6D, 0x8C9F, 0x8CE9, 0x0000,\n    0x599A, 0x77C3, 0x59F0, 0x36D4, 0x8E2A, 0x8EA7, 0x0000, 0x8F30,\n    0x8F4A, 0x42F4, 0x6C58, 0x6FBB, 0x0000, 0x489B, 0x6F79, 0x6E8B,\n    0x0000, 0x9BE9, 0x36B5, 0x0000, 0x90BB, 0x48B4, 0x5571, 0x4906,\n    0x91BB, 0x9404, 0x0000, 0x4062, 0x0000, 0x9427, 0x0000, 0x0000,\n    0x84E5, 0x8A2B, 0x9599, 0x95A7, 0x9597, 0x9596, 0x0000, 0x7445,\n    0x3EC2, 0x0000, 0x0000, 0x0000, 0x3EE7, 0x0000, 0x968F, 0x0000,\n    0x0000, 0x0000, 0x3ECC, 0x0000, 0x0000, 0x0000, 0x7412, 0x746B,\n    0x3EFC, 0x9741, 0x0000, 0x6847, 0x4A1D, 0x0000, 0x0000, 0xFFFD,\n    0x9368, 0x0000, 0x0000, 0x0000, 0x0000, 0x92BA, 0x5B11, 0x8B69,\n    0x493C, 0x73F9, 0x0000, 0x979B, 0xFFFD, 0x9938, 0x0000, 0x5DC1,\n    0x0000, 0x0000, 0x981F, 0x0000, 0x92F6, 0x0000, 0x91E5, 0x44C0,\n    0x0000, 0x0000, 0x0000, 0x98DC, 0x0000, 0x3F00, 0x922A, 0x4925,\n    0x8414, 0x993B, 0x994D, 0x0000, 0x3DFD, 0xFFFD, 0x4B6F, 0x99AA,\n    0x9A5C, 0x0000, 0x0000, 0x6A8F, 0x9A21, 0x5AFE, 0x9A2F, 0x0000,\n    0x4B90, 0x0000, 0x99BC, 0x4BBD, 0x4B97, 0x937D, 0x5872, 0x0000,\n    0x5822, 0x0000, 0x0000, 0x7844, 0x0000, 0x0000, 0x68C5, 0x3D7D,\n    0x9458, 0x3927, 0x6150, 0x0000, 0x0000, 0x6107, 0x9C4F, 0x9C53,\n    0x9C7B, 0x9C35, 0x9C10, 0x9B7F, 0x9BCF, 0x0000, 0x9B9F, 0x0000,\n    0x0000, 0x9D21, 0x4CAE, 0x0000, 0x9E18, 0x4CB0, 0x9D0C, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x9DA5, 0x84BD, 0x0000, 0x0000, 0x0000,\n    0x85FC, 0x4533, 0x0000, 0x0000, 0x0000, 0x8420, 0x85EE, 0x0000,\n    0x0000, 0x0000, 0x79E2, 0x0000, 0x0000, 0x0000, 0x3D62, 0x93DB,\n    0x92BE, 0x9348, 0x0000, 0x78B9, 0x9277, 0x944D, 0x4FE4, 0x3440,\n    0x9064, 0x0000, 0x783D, 0x7854, 0x78B6, 0x784B, 0x0000, 0x0000,\n    0x0000, 0x369A, 0x4F72, 0x6FDA, 0x6FD9, 0xFFFD, 0x701E, 0x5414,\n    0x0000, 0x57BB, 0x58F3, 0x578A, 0x9D16, 0x57D7, 0x7134, 0x34AF,\n    0x0000, 0x71EB, 0x0000, 0x0000, 0xFFFD, 0x0000, 0x0000, 0x610C,\n    0x5ACE, 0x5A0B, 0x42BC, 0x0000, 0x372C, 0x4B7B, 0x0000, 0x93BB,\n    0x93B8, 0x0000, 0x0000, 0x8472, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x5994, 0x0000, 0x0000, 0x7DA8, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x92E5, 0x73E2, 0x3EE9, 0x74B4, 0x0000, 0x0000,\n    0x3EE1, 0x0000, 0x6AD8, 0x73F3, 0x73FB, 0x3ED6, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7448, 0x0000, 0x70A5,\n    0x0000, 0x9284, 0x73E6, 0x935F, 0x0000, 0x9331, 0x0000, 0x0000,\n    0x9386, 0x0000, 0x0000, 0x4935, 0x0000, 0x716B, 0x0000, 0x0000,\n    0x56A4, 0x0000, 0x0000, 0x0000, 0x5502, 0x79C4, 0x0000, 0x7DFE,\n    0x0000, 0x0000, 0x0000, 0x452E, 0x9401, 0x370A, 0x0000, 0x0000,\n    0x59B0, 0x0000, 0x0000, 0x0000, 0x5AA1, 0x36E2, 0x0000, 0x36B0,\n    0x925F, 0x5A79, 0x0000, 0x0000, 0x9374, 0x3CCD, 0x0000, 0x4A96,\n    0x398A, 0x50F4, 0x3D69, 0x3D4C, 0x0000, 0x7175, 0x42FB, 0x0000,\n    0x6E0F, 0x0000, 0x44EB, 0x6D57, 0x0000, 0x7067, 0x6CAF, 0x3CD6,\n    0x0000, 0x0000, 0x6E02, 0x6F0C, 0x3D6F, 0x0000, 0x7551, 0x36BC,\n    0x34C8, 0x4680, 0x3EDA, 0x4871, 0x59C4, 0x926E, 0x493E, 0x8F41,\n    0x0000, 0x0000, 0x5812, 0x57C8, 0x36D6, 0x0000, 0x70FE, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x68B9, 0x6967, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6A1A, 0x0000,\n    0x0000, 0x843E, 0x44DF, 0x44CE, 0x0000, 0x0000, 0x0000, 0x0000,\n    0xFFFD, 0xFFFD, 0x833D, 0x0000, 0x83ED, 0x0000, 0x0000, 0x0000,\n    0x5989, 0x5A82, 0x0000, 0x5A61, 0x5A71, 0x0000, 0x0000, 0x372D,\n    0x59EF, 0x0000, 0x36C7, 0x718E, 0x9390, 0x669A, 0x0000, 0x5A6E,\n    0x5A2B, 0x0000, 0x6A2B, 0x0000, 0x0000, 0x0000, 0x0000, 0x711D,\n    0x0000, 0x0000, 0x4FB0, 0x0000, 0x5CC2, 0x0000, 0x0000, 0x0000,\n    0x6A0C, 0x0000, 0x0000, 0xFFFD, 0x7133, 0x0000, 0x3DA5, 0x6CDF,\n    0x0000, 0x59EB, 0x5F5C, 0x0000, 0x7CD3, 0x0000, 0x0000, 0x0000,\n    0x906C, 0x81F6, 0x770C, 0x6CA2, 0x56FD, 0x5869, 0x6761, 0x5C5E,\n    0x58F2, 0x70B9, 0x6803, 0x8FBB, 0x8FBC, 0x4E21, 0x7B39, 0x3DCC,\n    0x732A, 0x7560, 0x583A, 0x82A6, 0x698A, 0x60E3, 0x4EEE, 0x99C4,\n    0x9EBF, 0x5301, 0x67A0, 0x60E8, 0x51B4, 0x7A83, 0x9C3A, 0x7AC8,\n    0x691A, 0x59AC, 0x5840, 0x546A, 0x60E7, 0x567A, 0x6955, 0x9C2F,\n    0x87A5, 0x5C20, 0x5E0B, 0x671E, 0x84AD, 0x8B81, 0x4E78, 0x62C3,\n    0x6855, 0xFFFD, 0x82FD, 0x89A5, 0x8FA0, 0x97B8, 0x9847, 0x9ABD,\n    0x5FB1, 0x6648, 0x66BF, 0x0000, 0xFFFD, 0x0000, 0xFFFD, 0xFFFD,\n    0x0000, 0x670E, 0x6918, 0x0000, 0x0000, 0x0000, 0x0000, 0x48D0,\n    0x4AB8, 0x0000, 0x0000, 0x0000, 0x0000, 0x51D2, 0x0000, 0x599F,\n    0x0000, 0x3BBE, 0x0000, 0x399B, 0x0000, 0x0000, 0x3762, 0x0000,\n    0x8B5E, 0x0000, 0xFFFD, 0x7209, 0x0000, 0x0000, 0x8EDA, 0x528F,\n    0x7171, 0x0000, 0x0000, 0x55BC, 0x0000, 0x3473, 0x0000, 0x4718,\n    0x0000, 0x5066, 0x34FB, 0x0000, 0xFFFD, 0x477C, 0x0000, 0x0000,\n    0xFFFD, 0x0000, 0x9056, 0x0000, 0x8B62, 0x5D5B, 0x0000, 0xFFFD,\n    0x0000, 0x8AEA, 0x0000, 0x0000, 0x4BC0, 0x0000, 0x9465, 0x0000,\n    0x6195, 0x5A27, 0x0000, 0x0000, 0x0000, 0x4E6A, 0x0000, 0x9656,\n    0x6D8F, 0x0000, 0x8977, 0x0000, 0xFFFD, 0x7B42, 0x0000, 0x0000,\n    0xFFFD, 0x7A45, 0x9A26, 0x365F, 0x0000, 0x0000, 0x7983, 0x5D2C,\n    0x0000, 0xFFFD, 0x46D0, 0x753B, 0x8865, 0x58B6, 0x371C, 0x0000,\n    0x3C54, 0x9281, 0x0000, 0x9330, 0x0000, 0x6C39, 0x0000, 0x8827,\n    0x88F5, 0x0000, 0x0000, 0x0000, 0x6EB8, 0x0000, 0x0000, 0x39A4,\n    0xFFFD, 0xFFFD, 0x453F, 0x66B6, 0x0000, 0x0000, 0x8943, 0x40DF,\n    0x0000, 0x39A1, 0x0000, 0x0000, 0x0000, 0x71AD, 0x8366, 0x0000,\n    0xFFFD, 0x4CB7, 0x0000, 0x0000, 0x0000, 0x7B43, 0x797E, 0x6FB5,\n    0x0000, 0x6A03, 0x0000, 0x53A2, 0x0000, 0x93BF, 0x6836, 0x975D,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x5D85, 0x0000, 0x5715, 0x9823,\n    0x0000, 0x5DAB, 0x0000, 0x65BE, 0x69D5, 0x53D2, 0x0000, 0x0000,\n    0x3C11, 0x6736, 0x0000, 0x35CA, 0x48FA, 0xFFFD, 0x7808, 0x9255,\n    0x43F2, 0x43DF, 0x59F8, 0xFFFD, 0x568B, 0x0000, 0x9012, 0x55C1,\n    0x4509, 0x7E7F, 0x6F56, 0x6AB1, 0x34E4, 0x0000, 0x373A, 0xFFFD,\n    0x0000, 0x0000, 0x3DEB, 0x0000, 0x0000, 0x56BF, 0x8E0E, 0x5B6D,\n    0x63DE, 0xFFFD, 0x6530, 0x562D, 0x541A, 0x0000, 0x4C7D, 0x5622,\n    0x561E, 0x7F49, 0x5975, 0x0000, 0x8770, 0x8117, 0x9D5E, 0x8D18,\n    0x763B, 0x9C45, 0x764E, 0x77B9, 0x9345, 0x5432, 0x8148, 0x82F7,\n    0x5625, 0x8132, 0x8418, 0x80BD, 0x55EA, 0x7962, 0x5643, 0x5416,\n    0x0000, 0x35CE, 0x5605, 0x55F1, 0x66F1, 0x0000, 0x362D, 0x7534,\n    0x55F0, 0x55BA, 0x5497, 0x5572, 0x0000, 0x0000, 0x5ED0, 0x0000,\n    0x0000, 0x0000, 0x9EAB, 0x7D5A, 0xFFFD, 0x0000, 0x629D, 0x976D,\n    0x5494, 0x8CCD, 0x71F6, 0x9176, 0x63FC, 0x63B9, 0x63FE, 0x5569,\n    0x0000, 0x9C72, 0x0000, 0x519A, 0x34DF, 0x0000, 0x51A7, 0x544D,\n    0x551E, 0x5513, 0x7666, 0x8E2D, 0x0000, 0x75B1, 0x80B6, 0x8804,\n    0xFFFD, 0x88C7, 0x81B6, 0x841C, 0x44EC, 0x7304, 0x830B, 0x567B,\n    0x9170, 0x9208, 0x0000, 0x7266, 0x474E, 0x0000, 0x40FA, 0x9C5D,\n    0x651F, 0x48F3, 0x0000, 0x0000, 0xFFFD, 0x0000, 0xED2B, 0x0000,\n    0x71A3, 0x7E8E, 0x9D50, 0x3577, 0x6CB2, 0x5367, 0x39DC, 0x0000,\n    0x822D, 0x544B, 0xED43, 0x3A52, 0x7374, 0x0000, 0x4D09, 0x9BED,\n    0xFFFD, 0x4C5B, 0x0000, 0x845C, 0x0000, 0x632E, 0x7D25, 0x3A2A,\n    0x9008, 0x52CC, 0x3E74, 0x367A, 0x45E9, 0x0000, 0x7640, 0x5AF0,\n    0x0000, 0x787A, 0x0000, 0x58A7, 0x40BF, 0x567C, 0x9B8B, 0x5D74,\n    0x7654, 0x0000, 0x9E85, 0x4CE1, 0xFFFD, 0x37FB, 0x6119, 0x0000,\n    0xED73, 0x565D, 0x0000, 0x5234, 0x35AD, 0xFFFD, 0x9D7C, 0x7C56,\n    0x9B39, 0x57DE, 0x5C53, 0x64D3, 0x0000, 0x0000, 0x86AD, 0x0000,\n    0x0000, 0xED8C, 0x51FE, 0x0000, 0x5D8E, 0x9703, 0x0000, 0x9E81,\n    0x904C, 0x7B1F, 0x9B02, 0x5CD1, 0x7BA3, 0x6268, 0x6335, 0x9AFF,\n    0x7BCF, 0x9B2A, 0x7C7E, 0xFFFD, 0x7C42, 0x7C86, 0x9C15, 0x7BFC,\n    0x9B09, 0xFFFD, 0x9C2E, 0x9F5A, 0x5573, 0x5BC3, 0x4FFD, 0x9E98,\n    0x4FF2, 0x5260, 0x52D1, 0x5767, 0x5056, 0x59B7, 0x5E12, 0x97C8,\n    0x9DAB, 0x8F5C, 0x5469, 0x97B4, 0x9940, 0x97BA, 0x532C, 0x6130,\n    0x692C, 0x53DA, 0x9C0A, 0x9D02, 0x4C3B, 0x9641, 0x6980, 0x50A6,\n    0x7546, 0x0000, 0x99DA, 0x5273, 0xEDC9, 0x9159, 0x9681, 0x915C,\n    0xEDCD, 0x9151, 0x0000, 0x637F, 0x6ACA, 0x5611, 0x918E, 0x757A,\n    0x6285, 0x734F, 0x7C70, 0x0000, 0xEDDC, 0x76D6, 0x9B9D, 0x4E2A,\n    0x0000, 0x83BE, 0x8842, 0xEDE4, 0x5C4A, 0x69C0, 0xFFFD, 0xFFFD,\n    0x521F, 0x5DF5, 0x4ECE, 0x6C31, 0x0000, 0x4F39, 0x549C, 0xFFFD,\n    0x529A, 0x8D82, 0x35FE, 0xFFFD, 0x35F3, 0xEDF6, 0x6B52, 0x917C,\n    0x9FA5, 0x9B97, 0x982E, 0x98B4, 0x9ABA, 0x9EA8, 0x9E84, 0x7B14,\n    0xEE02, 0x6BFA, 0x8818, 0x7F78, 0xEE06, 0x5620, 0x0000, 0x8E77,\n    0x9F53, 0xEE0B, 0x8DD4, 0x8E4F, 0x9E1C, 0x8E01, 0x6282, 0x0000,\n    0x8E28, 0x8E75, 0x7AD3, 0x7A3E, 0x78D8, 0x6CEA, 0x8A67, 0x7607,\n    0x9F26, 0x6CCE, 0x87D6, 0x75C3, 0x0000, 0x7853, 0x8D0C, 0x72E2,\n    0x7371, 0x8B2D, 0x7302, 0x74F1, 0x8CEB, 0x0000, 0x862F, 0x5FBA,\n    0x88A0, 0x44B7, 0xEE2F, 0x0000, 0xEE32, 0x8A7E, 0x0000, 0xEE35,\n    0x60FD, 0x7667, 0x9AD7, 0x9D44, 0x936E, 0x9B8F, 0x87F5, 0xEE3D,\n    0xFFFD, 0x8CF7, 0x732C, 0x9721, 0x9BB0, 0x35D6, 0x72B2, 0x4C07,\n    0x7C51, 0x994A, 0x6159, 0x4C04, 0x9E96, 0x617D, 0xEE4D, 0x575F,\n    0x616F, 0x62A6, 0x6239, 0xFFFD, 0x3A5C, 0x61E2, 0x53AA, 0x6364,\n    0x6802, 0x35D2, 0x5D57, 0x8FDA, 0x0000, 0xEE5E, 0x50D9, 0x7906,\n    0x5332, 0x9638, 0x0000, 0x4065, 0xEE66, 0x77FE, 0xEE68, 0x7CC2,\n    0x0000, 0x7CDA, 0x7A2D, 0x8066, 0x8063, 0x7D4D, 0x7505, 0x74F2,\n    0x8994, 0x821A, 0x670C, 0x8062, 0x0000, 0x805B, 0x74F0, 0x8103,\n    0x7724, 0x8989, 0x0000, 0x7553, 0x87A9, 0x87CE, 0x81C8, 0x878C,\n    0x8A49, 0x8CAD, 0x8B43, 0x772B, 0x74F8, 0x84DA, 0x69B2, 0x8DA6,\n    0xEE8C, 0x89A9, 0xFFFD, 0x6DB9, 0x87C1, 0x0000, 0x74E7, 0x3DDB,\n    0x7176, 0x60A4, 0x619C, 0x3CD1, 0xFFFD, 0x6077, 0xEE9A, 0x7F71,\n    0x0000, 0x60E9, 0x4B7E, 0x0000, 0x92DB, 0x0000, 0x0000, 0x854C,\n    0x42B5, 0x73EF, 0x51B5, 0x3649, 0x0000, 0x0000, 0x9344, 0x0000,\n    0x82EE, 0x0000, 0x783C, 0x6744, 0x62DF, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x4FAB, 0x0000, 0x5008, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0xFFFD, 0x0000, 0x5FA4, 0x0000, 0x0000, 0x6EDB,\n    0x0000, 0x50DE, 0x5101, 0x347A, 0x510E, 0x986C, 0x3743, 0x8416,\n    0x0000, 0x0000, 0x5160, 0x0000, 0x516A, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x5B82, 0x877D, 0x0000, 0x0000,\n    0x51B2, 0x51B8, 0x9D34, 0x51C9, 0x51CF, 0x51D1, 0x3CDC, 0x51D3,\n    0x0000, 0x51B3, 0xFFFD, 0xFFFD, 0x51ED, 0x83CD, 0x693E, 0x0000,\n    0x5F7B, 0x520B, 0x5226, 0x523C, 0x52B5, 0x5257, 0x5294, 0x52B9,\n    0x52C5, 0x7C15, 0x8542, 0x52E0, 0x860D, 0x0000, 0x0000, 0x0000,\n    0x5549, 0x6ED9, 0x0000, 0x0000, 0x0000, 0x5333, 0xFFFD, 0x0000,\n    0x6CCB, 0x0000, 0x681B, 0x73D5, 0x604A, 0x3EAA, 0x38CC, 0x0000,\n    0x71DD, 0x44A2, 0x536D, 0x5374, 0x0000, 0x537E, 0x0000, 0x0000,\n    0x0000, 0x77E6, 0x5393, 0x0000, 0x53A0, 0x53AB, 0x53AE, 0x73A7,\n    0x0000, 0x3F59, 0x739C, 0x53C1, 0x53C5, 0x6C49, 0x4E49, 0x57FE,\n    0x53D9, 0x3AAB, 0x0000, 0x53E0, 0x0000, 0x0000, 0x53F6, 0x0000,\n    0x5413, 0x7079, 0x552B, 0x6657, 0x6D5B, 0x546D, 0x0000, 0x0000,\n    0x555D, 0x548F, 0x54A4, 0x47A6, 0x0000, 0x0000, 0x3DB4, 0x0000,\n    0x0000, 0x0000, 0x5547, 0x4CED, 0x542F, 0x7417, 0x5586, 0x55A9,\n    0xFFFD, 0x0000, 0x0000, 0x4552, 0x0000, 0x66B3, 0x0000, 0x5637,\n    0x66CD, 0x0000, 0x66A4, 0xFFFD, 0x564D, 0x564F, 0x78F1, 0x56F1,\n    0x9787, 0x53FE, 0x5700, 0x56EF, 0x56ED, 0x0000, 0x3623, 0x0000,\n    0x5746, 0x0000, 0x6C6E, 0x708B, 0x5742, 0x36B1, 0x0000, 0x57E6,\n    0x0000, 0x5803, 0x0000, 0x0000, 0x5826, 0x0000, 0x581F, 0x58AA,\n    0x3561, 0x58E0, 0x58DC, 0x0000, 0x58FB, 0x5BFF, 0x5743, 0x0000,\n    0x0000, 0x93D3, 0x35A1, 0x591F, 0x68A6, 0x36C3, 0x6E59, 0x0000,\n    0x5A24, 0xFFFD, 0x0000, 0x8505, 0x59C9, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x59D9, 0x0000, 0x0000, 0x0000, 0x6D71, 0x0000, 0x0000,\n    0x59F9, 0x0000, 0x5AAB, 0x5A63, 0x36E6, 0x0000, 0xFFFD, 0x3708,\n    0x5A96, 0x7465, 0x5AD3, 0x0000, 0x0000, 0x0000, 0x3732, 0x0000,\n    0x5E83, 0x52D0, 0x5B76, 0x6588, 0x5B7C, 0x0000, 0x4004, 0x485D,\n    0x0000, 0x5BD5, 0x0000, 0x0000, 0x0000, 0x5BF3, 0x5B9D, 0x4D10,\n    0x5C05, 0x0000, 0x5C13, 0x73CE, 0x5C14, 0x0000, 0x0000, 0x5C49,\n    0x48DD, 0x5C85, 0x5CE9, 0x5CEF, 0x5D8B, 0x0000, 0x0000, 0x5D10,\n    0x5D18, 0x5D46, 0x0000, 0x5CBA, 0x5DD7, 0x82FC, 0x382D, 0x0000,\n    0x0000, 0x0000, 0x8287, 0x3836, 0x3BC2, 0x5E2E, 0x6A8A, 0xFFFD,\n    0xE12F, 0x0000, 0x0000, 0x53A6, 0x4EB7, 0xFFFD, 0x53A8, 0x0000,\n    0x5E09, 0xE138, 0x0000, 0x5EF9, 0x5EFB, 0x38A0, 0x5EFC, 0x683E,\n    0x941B, 0x5F0D, 0x0000, 0x0000, 0x3ADE, 0x0000, 0x5F3A, 0x0000,\n    0x0000, 0x0000, 0x5F63, 0x0000, 0x5F72, 0x9340, 0x0000, 0x5FA7,\n    0x5DB6, 0x3D5F, 0x0000, 0x0000, 0x0000, 0x0000, 0x91D6, 0x0000,\n    0x0000, 0x6031, 0x6685, 0x3963, 0x3DC7, 0x3639, 0x5790, 0x0000,\n    0x7971, 0x3E40, 0x609E, 0xFFFD, 0x60EA, 0x0000, 0x0000, 0x0000,\n    0x74A4, 0x50E1, 0x5AA0, 0x6164, 0x6142, 0x0000, 0x0000, 0x6181,\n    0x51F4, 0x0000, 0x6187, 0x5BAA, 0x0000, 0x0000, 0x61D3, 0x0000,\n    0x0000, 0x61D0, 0x3932, 0x0000, 0x0000, 0x6023, 0x615C, 0x651E,\n    0x638B, 0x0000, 0x62C5, 0x0000, 0x62D5, 0x0000, 0x636C, 0x0000,\n    0x3A17, 0x6438, 0x63F8, 0x0000, 0x0000, 0x6F8A, 0x0000, 0xFFFD,\n    0x0000, 0x64E1, 0x64E5, 0x947B, 0x3A66, 0x643A, 0x3A57, 0x654D,\n    0x6F16, 0x0000, 0x0000, 0x6585, 0x656D, 0x655F, 0xFFFD, 0x65B5,\n    0x0000, 0x4B37, 0x65D1, 0x40D8, 0x0000, 0xE1AB, 0x65E3, 0x5FDF,\n    0x0000, 0x6618, 0x0000, 0x0000, 0x6644, 0x0000, 0x0000, 0x664B,\n    0x0000, 0x6667, 0x0000, 0x6673, 0xFA12, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x77C5, 0x0000, 0x99A4, 0x6702, 0x0000, 0x0000, 0x69FA,\n    0x0000, 0x0000, 0x6767, 0x6762, 0x0000, 0x0000, 0x67D7, 0x44E9,\n    0x6822, 0x6E50, 0x923C, 0x6801, 0x0000, 0x0000, 0x685D, 0x0000,\n    0x69E1, 0x6A0B, 0x0000, 0x6973, 0x68C3, 0x0000, 0x6901, 0x6900,\n    0x3A01, 0x0000, 0x3B80, 0x67AC, 0x6961, 0x0000, 0x42FC, 0x6936,\n    0x6998, 0x3BA1, 0x0000, 0x8363, 0x5090, 0x69F9, 0x0000, 0x0000,\n    0x6A45, 0x0000, 0x6A9D, 0x3BF3, 0x67B1, 0x6AC8, 0x0000, 0x3C0D,\n    0x6B1D, 0x0000, 0x60DE, 0x6B35, 0x6B74, 0x0000, 0x6EB5, 0x0000,\n    0xFFFD, 0x0000, 0x3740, 0x5421, 0x0000, 0x6BE1, 0x0000, 0x6BDC,\n    0x6C37, 0x0000, 0x0000, 0x0000, 0x6C5A, 0x8226, 0x6C79, 0x0000,\n    0x44C5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x36E5, 0x3CEB,\n    0x0000, 0x9B83, 0x0000, 0x0000, 0x7F8F, 0x6837, 0x0000, 0x0000,\n    0x0000, 0x6D96, 0x6D5C, 0x6E7C, 0x6F04, 0x0000, 0x0000, 0x0000,\n    0x8533, 0x0000, 0x51C7, 0xFFFD, 0xFFFD, 0x842E, 0x0000, 0x0000,\n    0x0000, 0x7453, 0x0000, 0x79CC, 0x6E4F, 0x5A91, 0x0000, 0x6FF8,\n    0x370D, 0x6F9D, 0x0000, 0x6EFA, 0x0000, 0x0000, 0x4555, 0x93F0,\n    0x6F44, 0x6F5C, 0x3D4E, 0x6F74, 0x0000, 0x3D3B, 0x6F9F, 0x0000,\n    0x6FD3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x51DF,\n    0xE251, 0xE252, 0x0000, 0x0000, 0x704B, 0x707E, 0x70A7, 0xFFFD,\n    0x70CC, 0x70D5, 0x70D6, 0x70DF, 0x4104, 0x3DE8, 0x71B4, 0x7196,\n    0x0000, 0x712B, 0x7145, 0x5A88, 0x714A, 0xFA48, 0x0000, 0x714F,\n    0x9362, 0x0000, 0x712C, 0x0000, 0x0000, 0x0000, 0x71BA, 0x0000,\n    0x70BD, 0x720E, 0x9442, 0x7215, 0x5911, 0x9443, 0x7224, 0x9341,\n    0x0000, 0x722E, 0x7240, 0x0000, 0x68BD, 0x7255, 0x7257, 0x3E55,\n    0x0000, 0x680D, 0x6F3D, 0x7282, 0xFFFD, 0x732B, 0x0000, 0x0000,\n    0x48ED, 0x0000, 0x7328, 0x732E, 0x73CF, 0x73AA, 0x0000, 0x0000,\n    0x73C9, 0x7449, 0x0000, 0x0000, 0x0000, 0x6623, 0x36C5, 0x0000,\n    0x0000, 0x0000, 0x73F7, 0x7415, 0x6903, 0x0000, 0x7439, 0x3ED7,\n    0x0000, 0x0000, 0x7460, 0x0000, 0x7447, 0x73E4, 0x7476, 0x83B9,\n    0x746C, 0x7474, 0x93F1, 0x6A2C, 0x7482, 0x4953, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x5B46, 0x0000, 0x0000, 0x74C8, 0x0000, 0x750E,\n    0x751E, 0x0000, 0x0000, 0x5BD7, 0x0000, 0x9385, 0x754D, 0x754A,\n    0x7567, 0x756E, 0x0000, 0x3F04, 0x0000, 0x758E, 0x745D, 0x759E,\n    0x75B4, 0x7602, 0x762C, 0x7651, 0x764F, 0x766F, 0xE2D3, 0x0000,\n    0x7690, 0x81EF, 0x37F8, 0x0000, 0x0000, 0x76A1, 0x76A5, 0x76B7,\n    0x76CC, 0x0000, 0x8462, 0x0000, 0x0000, 0x0000, 0x771E, 0x7726,\n    0x7740, 0x64AF, 0x0000, 0x7758, 0x0000, 0x77AF, 0x0000, 0x0000,\n    0x0000, 0x77F4, 0xFFFD, 0x68CA, 0x78AF, 0x78C7, 0x78D3, 0x96A5,\n    0x792E, 0x0000, 0x78D7, 0x7934, 0x78B1, 0x0000, 0x8FB8, 0x8884,\n    0x0000, 0x7986, 0x8900, 0x6902, 0x7980, 0x0000, 0x799D, 0x0000,\n    0x793C, 0x79A9, 0x6E2A, 0x0000, 0x3EA8, 0x79C6, 0x0000, 0x79D4,\n    0xFFFD, 0x5525, 0xFFFD, 0x0000, 0x0000, 0x0000, 0x5590, 0x0000,\n    0x39EC, 0x0000, 0x8E46, 0x0000, 0x0000, 0xFFFD, 0x0000, 0x777A,\n    0x0000, 0x3A34, 0x47D5, 0x0000, 0x0000, 0x0000, 0x64DD, 0x0000,\n    0x0000, 0x0000, 0xFFFD, 0x648D, 0x8E7E, 0x0000, 0xFFFD, 0x0000,\n    0x0000, 0x0000, 0x0000, 0xFFFD, 0x0000, 0x0000, 0x0000, 0x47F4,\n    0x0000, 0x0000, 0x9AB2, 0x3A67, 0x0000, 0x3FED, 0x3506, 0x0000,\n    0x0000, 0xFFFD, 0x0000, 0x9D6E, 0x9815, 0xFFFD, 0x43D9, 0xFFFD,\n    0x64B4, 0x54E3, 0xFFFD, 0x0000, 0xFFFD, 0x39FB, 0xFFFD, 0x0000,\n    0x0000, 0x0000, 0x64EA, 0x0000, 0x0000, 0x8E68, 0xFFFD, 0x0000,\n    0x0000, 0xFFFD, 0x480B, 0x0000, 0x3FFA, 0x5873, 0x0000, 0xFFFD,\n    0x0000, 0x0000, 0x0000, 0x0000, 0xFFFD, 0x5579, 0xFFFD, 0x43BA,\n    0xFFFD, 0x4AB4, 0x0000, 0x0000, 0x81AA, 0x98F5, 0x0000, 0x6379,\n    0x39FE, 0x0000, 0x8DC0, 0x56A1, 0x647C, 0x3E43, 0xFFFD, 0x0000,\n    0x0000, 0x0000, 0xFFFD, 0xFFFD, 0x0000, 0x0000, 0x3992, 0x3A06,\n    0x0000, 0x3578, 0x0000, 0x0000, 0xFFFD, 0xFFFD, 0x0000, 0x0000,\n    0x34BC, 0x6C3D, 0x0000, 0xFFFD, 0xFFFD, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3A18,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x95AA, 0xFFFD, 0x0000,\n    0x7140, 0xFFFD, 0x5156, 0x4EFE, 0x5088, 0xFFFD, 0x3493, 0x5186,\n    0x5E42, 0x5205, 0x5227, 0x5279, 0x0000, 0x3553, 0x53C2, 0x535F,\n    0xFFFD, 0x553F, 0xFFFD, 0x55D8, 0x35DD, 0x5621, 0xFFFD, 0x5654,\n    0x0000, 0xFFFD, 0x0000, 0xFFFD, 0x0000, 0xFFFD, 0xFFFD, 0x37B9,\n    0x5CC1, 0x5D15, 0x5D56, 0x3838, 0x4E81, 0x5EBD, 0x3914, 0x61B9,\n    0x6290, 0x6318, 0x645A, 0x6491, 0x816D, 0x8184, 0x8193, 0x6800,\n    0x3BBC, 0x728F, 0x72CD, 0x0000, 0x7339, 0x7542, 0x75DC, 0x3FC0,\n    0x0000, 0x3FD7, 0xFFFD, 0x7680, 0x768C, 0x40A8, 0x7839, 0x4103,\n    0x7A91, 0x7C1B, 0x7CED, 0x7F93, 0x7FAE, 0xFFFD, 0x82FF, 0x585F,\n    0x86B2, 0x45AC, 0x878B, 0x8947, 0xFFFD, 0x8A29, 0xFFFD, 0x8E71,\n    0x0000, 0x8EB0, 0xFFFD, 0x915E, 0x918C, 0x990E, 0x991C, 0xFFFD,\n    0xFFFD, 0x9B81, 0x9DC0, 0x9D93, 0x9EAC, 0x4D91, 0xFFFD, 0x93BA,\n    0x9E7B, 0x7089, 0x7348, 0xFFFD, 0x7999, 0x8FB7, 0xFFFD, 0x9942,\n    0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,\n    0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,\n    0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,\n    0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,\n    0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,\n    0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,\n    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,\n    0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,\n    0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,\n    0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,\n    0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,\n    0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x00A9,\n    0x2122, 0x2026, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025,\n    0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D,\n    0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035,\n    0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D,\n    0x003E, 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045,\n    0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D,\n    0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055,\n    0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D,\n    0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065,\n    0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D,\n    0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075,\n    0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D,\n    0x007E, 0x20AC, 0x20AC, 0x2110, 0x20AC, 0x20AC, 0x309B, 0x309C,\n    0x2E80, 0x31C0, 0x31C1, 0x31C2, 0x31C3, 0x31C4, 0x0000, 0x31C5,\n    0x0000, 0x0000, 0x31C6, 0x31C7, 0x0000, 0x0000, 0x31C8, 0x0000,\n    0x31C9, 0x31CA, 0x31CB, 0x31CC, 0x0000, 0x31CD, 0x31CE, 0xF538,\n    0xF539, 0x0000, 0x0000, 0x9751, 0x0000, 0x4E5B, 0x4EBB, 0x353E,\n    0x5C23, 0x5F51, 0x5FC4, 0x38FA, 0x624C, 0x6535, 0x6B7A, 0x6C35,\n    0x6C3A, 0x706C, 0x722B, 0x4E2C, 0x72AD, 0x0000, 0x7F52, 0x793B,\n    0x7CF9, 0x7F53, 0x0000, 0x34C1, 0x0000, 0x8002, 0x8080, 0x0000,\n    0x0000, 0x535D, 0x8864, 0x89C1, 0x0000, 0x8BA0, 0x8D1D, 0x9485,\n    0x9578, 0x957F, 0x95E8, 0x0000, 0x97E6, 0x9875, 0x98CE, 0x98DE,\n    0x9963, 0x0000, 0x9C7C, 0x9E1F, 0x9EC4, 0x6B6F, 0xF907, 0x4E37,\n    0x0000, 0x961D, 0x6237, 0x94A2, 0x2E84, 0x2E86, 0x2E87, 0x2E88,\n    0x2E8A, 0x2E8C, 0x2E8D, 0x2E95, 0x2E9C, 0x2EA5, 0x2EA7, 0x2EAA,\n    0x2EAC, 0x2EAE, 0x2EB6, 0x2EBC, 0x2EBE, 0x2ECA, 0x2ECC, 0x2ECD,\n    0x2ECF, 0x2ED6, 0x2ED7, 0x2EDE, 0x0000, 0x0000, 0x650A, 0x4E3D,\n    0x6EDD, 0x9D4E, 0x91DF, 0x0000, 0x4F1A, 0x4F28, 0x4FA8, 0x5174,\n    0x519C, 0x51E4, 0x52A1, 0x52A8, 0x533B, 0x534E, 0x53D1, 0x53D8,\n    0x56E2, 0x58F0, 0x5904, 0x5907, 0x5932, 0x5934, 0x5B66, 0x5B9E,\n    0x5B9F, 0x5C9A, 0x5E86, 0x603B, 0x6589, 0x67FE, 0x6804, 0x6865,\n    0x6D4E, 0x70BC, 0x7535, 0x7EA4, 0x7EAC, 0x7EBA, 0x7EC7, 0x7ECF,\n    0x7EDF, 0x7F06, 0x7F37, 0x827A, 0x82CF, 0x836F, 0x89C6, 0x8BBE,\n    0x8BE2, 0x8F66, 0x8F67, 0x8F6E, 0x7411, 0x7CFC, 0x7DCD, 0x6946,\n    0x7AC9, 0x78B8, 0x80BC, 0x8D0B, 0x80F6, 0x0000, 0x809F, 0x9EC7,\n    0x4CCD, 0x9DC9, 0x9E0C, 0x4C3E, 0x0000, 0x0000, 0x9E0A, 0x0000,\n    0x35C1, 0x6E9A, 0x823E, 0x7519, 0x4911, 0x9A6C, 0x9A8F, 0x9F99,\n    0x7987, 0x0000, 0x0000, 0x0000, 0x0000, 0x4E24, 0x4E80, 0x4E87,\n    0x4EBF, 0x4EEB, 0x4F37, 0x344C, 0x4FBD, 0x3E48, 0x5003, 0x347D,\n    0x34A5, 0x5905, 0x51DB, 0x51FC, 0x4E89, 0x5290, 0x5327, 0x35C7,\n    0x53A9, 0x3551, 0x53B0, 0x5423, 0x356D, 0x3572, 0x3681, 0x5493,\n    0x54A3, 0x54B4, 0x54B9, 0x54D0, 0x54EF, 0x5518, 0x5523, 0x5528,\n    0x3598, 0x35A5, 0x35BF, 0x55D7, 0x35C5, 0x0000, 0x4053, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x40BB, 0x0000, 0x5652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x35FB, 0x0000, 0x0000, 0x0000, 0x0000, 0x3F93, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3FF9,\n    0x0000, 0x6432, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x54CC, 0x82C4, 0x55B9, 0x0000, 0x9C26, 0x9AB6,\n    0x0000, 0x80EC, 0x5C1C, 0x0000, 0x8134, 0x3797, 0x0000, 0x91B6,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3609, 0x0000, 0x56AF,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x5A54, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x579C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3703,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x5899, 0x5268, 0x361A, 0x0000, 0x7BB2, 0x5B68, 0x4800, 0x4B2C,\n    0x9F27, 0x49E7, 0x9C1F, 0x9B8D, 0x0000, 0x0000, 0x55FB, 0x35F2,\n    0x5689, 0x5D3E, 0x5D48, 0x3DFC, 0x380F, 0x5DA4, 0x5DB9, 0x3820,\n    0x5F25, 0x5F83, 0x3908, 0x393F, 0x394D, 0x60D7, 0x613D, 0x5CE5,\n    0x3989, 0x61B7, 0x61CF, 0x39B8, 0x622C, 0x62E5, 0x39F8, 0x56B1,\n    0x3A03, 0x63E2, 0x63FB, 0x6407, 0x3A4B, 0x64C0, 0x9F9F, 0x3A97,\n    0x6586, 0x3ABD, 0x65FF, 0x6653, 0x3AF2, 0x6692, 0x3B22, 0x6716,\n    0x3B42, 0x67A4, 0x3B58, 0x684A, 0x6884, 0x3B72, 0x3B71, 0x3B7B,\n    0x6909, 0x6943, 0x725C, 0x6964, 0x699F, 0x6985, 0x69D6, 0x3BDD,\n    0x6A65, 0x6A74, 0x6A71, 0x6A82, 0x3BEC, 0x6A99, 0x3BF2, 0x6AAB,\n    0x6AB5, 0x6AD4, 0x6AF6, 0x6B81, 0x6BC1, 0x6BEA, 0x6C75, 0x6CAA,\n    0x3CCB, 0x6D02, 0x6D06, 0x6D26, 0x6D81, 0x3CEF, 0x6DA4, 0x6DB1,\n    0x6E15, 0x6E18, 0x6E29, 0x6E86, 0x0000, 0x6EBB, 0x6EE2, 0x6EDA,\n    0x9F7F, 0x6EE8, 0x6EE9, 0x6F24, 0x6F34, 0x3D46, 0x0000, 0x6F81,\n    0x6FBE, 0x3D6A, 0x3D75, 0x71B7, 0x5C99, 0x3D8A, 0x702C, 0x3D91,\n    0x7050, 0x7054, 0x706F, 0x707F, 0x0000, 0x43C1, 0x35F1, 0x0000,\n    0x364E, 0x3DAD, 0x0000, 0x667D, 0x7C74, 0x748D, 0x7E92, 0x4503,\n    0x0000, 0x0000, 0x0000, 0x347E, 0x0000, 0x0000, 0x0000, 0x8771,\n    0x63C1, 0x7777, 0x898A, 0x0000, 0x8B4C, 0x0000, 0x492A, 0x0000,\n    0x0000, 0x0000, 0x3AF0, 0x708F, 0x0000, 0x0000, 0x0000, 0x6888,\n    0x0000, 0x9F62, 0x93C6, 0x0000, 0x9366, 0x928F, 0x8614, 0x0000,\n    0x4190, 0x678F, 0x681E, 0x3863, 0x0000, 0x3B19, 0x8496, 0x0000,\n    0x39E2, 0x8480, 0x436E, 0x9771, 0x999B, 0x492D, 0x6F17, 0x0000,\n    0x70A6, 0x0000, 0x7E65, 0x5D2F, 0x3DF3, 0x0000, 0x0000, 0x7DA4,\n    0x8426, 0x5485, 0x0000, 0x0000, 0x577E, 0x0000, 0x0000, 0x3FE5,\n    0x0000, 0x0000, 0x7003, 0x0000, 0x5D70, 0x738F, 0x0000, 0x0000,\n    0x4FC8, 0x7FE7, 0x7310, 0x7338, 0x7341, 0x3EA9, 0x71F5, 0x0000,\n    0x73E1, 0x3ECA, 0x3ED1, 0x7419, 0x741E, 0x741F, 0x3EE2, 0x3EF0,\n    0x3EF4, 0x3EFA, 0x74D3, 0x3F0E, 0x3F53, 0x756D, 0x7572, 0x758D,\n    0x3F7C, 0x75C8, 0x764D, 0x7674, 0x3FDC, 0x767A, 0x7188, 0x5623,\n    0x8980, 0x401D, 0x7743, 0x4039, 0x4045, 0x35DB, 0x7798, 0x406A,\n    0x406F, 0x77BE, 0x77CB, 0x7818, 0x781C, 0x7847, 0x7851, 0x7866,\n    0x8448, 0x0000, 0x7933, 0x7932, 0x4109, 0x7991, 0x7A06, 0x4167,\n    0x41B2, 0x7ABC, 0x8279, 0x41C4, 0x7ACF, 0x7ADB, 0x41CF, 0x7B62,\n    0x7B6C, 0x7B7B, 0x7C12, 0x4260, 0x427A, 0x7C7B, 0x7C9C, 0x428C,\n    0x7CB8, 0x4294, 0x8F93, 0x70C0, 0x0000, 0x7DCF, 0x7DD4, 0x7DD0,\n    0x7DFD, 0x7FB4, 0x729F, 0x4397, 0x8020, 0x8025, 0x802E, 0x8031,\n    0x8054, 0x57B4, 0x70A0, 0x80B7, 0x80E9, 0x43ED, 0x810C, 0x810E,\n    0x8112, 0x8114, 0x4401, 0x3B39, 0x8156, 0x8159, 0x815A, 0x4413,\n    0x817C, 0x4425, 0x442D, 0x81A5, 0x57EF, 0x81C1, 0x81E4, 0x8254,\n    0x448F, 0x8276, 0x82CA, 0x82D8, 0x44B0, 0x8357, 0x9669, 0x8405,\n    0x70F5, 0x8464, 0x8488, 0x4504, 0x84BE, 0x84E1, 0x84F8, 0x8510,\n    0x8538, 0x8552, 0x453B, 0x856F, 0x8570, 0x85E0, 0x4577, 0x8672,\n    0x8692, 0x86EF, 0x9645, 0x4606, 0x4617, 0x88AE, 0x88FF, 0x8924,\n    0x8991, 0x0000, 0x8A38, 0x8A94, 0x8AB4, 0x8C51, 0x8CD4, 0x8CF2,\n    0x8D1C, 0x4798, 0x8DC3, 0x47ED, 0x8E3A, 0x5754, 0x55F5, 0x4837,\n    0x8ECE, 0x8EE2, 0x8EE4, 0x8EED, 0x8EF2, 0x8FC1, 0x8FCA, 0x8FCC,\n    0x9033, 0x48AD, 0x98E0, 0x9213, 0x491E, 0x9228, 0x9258, 0x926B,\n    0x92B1, 0x92AE, 0x92BF, 0x92E3, 0x92EB, 0x92F3, 0x92F4, 0x92FD,\n    0x9343, 0x9384, 0x93AD, 0x4945, 0x4951, 0x9417, 0x941D, 0x942D,\n    0x943E, 0x496A, 0x9454, 0x9479, 0x952D, 0x95A2, 0x49A7, 0x95F4,\n    0x9633, 0x49E5, 0x4A24, 0x9740, 0x4A35, 0x97B2, 0x97C2, 0x4AE4,\n    0x98B9, 0x4B19, 0x98F1, 0x5844, 0x9919, 0x9937, 0x995D, 0x9962,\n    0x4B70, 0x99C5, 0x4B9D, 0x9A3C, 0x9B0F, 0x9B69, 0x9BDD, 0x9BF1,\n    0x9BF4, 0x4C6D, 0x9C20, 0x376F, 0x0000, 0x9D49, 0x9EFE, 0x5650,\n    0x9DBD, 0x9DFC, 0x94F6, 0x8FB6, 0x9EB1, 0x9EBD, 0x9EC6, 0x94DC,\n    0x9EE2, 0x9EF1, 0x9EF8, 0x9F44, 0x0000, 0x0000, 0x0000, 0x94C3,\n    0x0000, 0x94C1, 0x0000, 0x0000, 0x0000, 0x0000, 0x5757, 0x7173,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x549E, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3647, 0x0000,\n    0x0000, 0x0000, 0x5364, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x70BB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7198, 0x0000, 0x69E9,\n    0x36C8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x58B5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x5788, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x5965, 0x0000, 0x0000, 0x573F, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x57A1, 0x7151, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x56B9,\n    0x0000, 0x3618, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x949F, 0x0000, 0x36B9,\n    0x0000, 0x0000, 0x56D6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x63E6,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x3DF7, 0x0000, 0x0000, 0x8FD0, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x7E9F, 0x0000, 0x0000, 0x4CA4, 0x9547,\n    0x0000, 0x71A2, 0x0000, 0x0000, 0x4D9C, 0x0000, 0x8FBE, 0x8FBA,\n    0x0000, 0x8FB9, 0x0000, 0x4EEA, 0x0000, 0x8E80, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4E9A, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3DC6, 0x0000,\n    0x4E1C, 0x0000, 0x0000, 0x0000, 0x0000, 0x55DE, 0x8786, 0x0000,\n    0x0000, 0x5B90, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4E1A, 0x4E04, 0x5B0D,\n    0x36AC, 0x537D, 0x36A5, 0x589A, 0x0000, 0x57AA, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x57A7, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x9C1B, 0x0000, 0x3E06, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x577A, 0x54DA, 0x717A, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3635, 0x0000,\n    0x5220, 0x3C18, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x4562, 0x5B1F, 0x0000, 0x9F50, 0x9EA6, 0x0000, 0x51E2, 0x5342,\n    0x66AD, 0x585C, 0x5553, 0x3D85, 0x6160, 0x48AE, 0x97BD, 0x0000,\n    0x60B3, 0x8424, 0x9814, 0x0000, 0x0000, 0x0000, 0x3B2B, 0x3D32,\n    0x0000, 0x7081, 0x5C9C, 0x0000, 0x3730, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0100, 0x00C1, 0x01CD, 0x00C0, 0x0112, 0x00C9, 0x011A,\n    0x00C8, 0x014C, 0x00D3, 0x01D1, 0x00D2, 0xF325, 0x1EBE, 0xF327,\n    0x1EC0, 0x00CA, 0x0101, 0x00E1, 0x01CE, 0x00E0, 0x0251, 0x0113,\n    0x00E9, 0x011B, 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC, 0x014D,\n    0x00F3, 0x01D2, 0x00F2, 0x016B, 0x00FA, 0x01D4, 0x00F9, 0x01D6,\n    0x01D8, 0x01DA, 0x01DC, 0x00FC, 0xF344, 0x1EBF, 0xF346, 0x1EC1,\n    0x00EA, 0x0261, 0x0283, 0x0250, 0x025B, 0x0254, 0x0275, 0x0153,\n    0x00F8, 0x014B, 0x028A, 0x026A, 0x23DA, 0x23DB, 0x2E9D, 0x2EC6,\n    0x2EE3, 0x503B, 0x6DFE, 0x0000, 0x9FA6, 0x3DC9, 0x888F, 0x0000,\n    0x7077, 0x5CF5, 0x4B20, 0x0000, 0x3559, 0x0000, 0x6122, 0x0000,\n    0x8FA7, 0x91F6, 0x7191, 0x6719, 0x73BA, 0x0000, 0x0000, 0x3C8B,\n    0x0000, 0x4B10, 0x78E4, 0x7402, 0x51AE, 0x0000, 0x4009, 0x6A63,\n    0x0000, 0x4223, 0x860F, 0x7A2A, 0x0000, 0x0000, 0x9755, 0x704D,\n    0x5324, 0x0000, 0x93F4, 0x76D9, 0x0000, 0x9FA7, 0x77DD, 0x4EA3,\n    0x4FF0, 0x50BC, 0x4E2F, 0x4F17, 0x9FA8, 0x5434, 0x7D8B, 0x5892,\n    0x58D0, 0x0000, 0x5E92, 0x5E99, 0x5FC2, 0x0000, 0x658B, 0x0000,\n    0x6919, 0x6A43, 0x0000, 0x6CFF, 0x7200, 0x0000, 0x738C, 0x3EDB,\n    0x0000, 0x5B15, 0x74B9, 0x8B83, 0x0000, 0x0000, 0x7A93, 0x7BEC,\n    0x7CC3, 0x7E6C, 0x82F8, 0x8597, 0x9FA9, 0x8890, 0x9FAA, 0x8EB9,\n    0x9FAB, 0x8FCF, 0x855F, 0x99E0, 0x9221, 0x9FAC, 0x0000, 0x0000,\n    0x4071, 0x42A2, 0x5A1A, 0x9868, 0x676B, 0x4276, 0x573D, 0x85D6,\n    0x0000, 0x82BF, 0x0000, 0x4C81, 0x0000, 0x5D7B, 0x0000, 0x0000,\n    0x9FAD, 0x9FAE, 0x5B96, 0x9FAF, 0x7E5B, 0x43F0, 0x4C32, 0x4603,\n    0x45A6, 0x4578, 0x0000, 0x4D77, 0x45B3, 0x0000, 0x4CE2, 0x0000,\n    0x3B95, 0x4736, 0x4744, 0x4C47, 0x4C40, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x4C57, 0x0000, 0x474F, 0x45DA, 0x4C85, 0x0000,\n    0x4D07, 0x4AA4, 0x46A1, 0x0000, 0x7225, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x664D, 0x56FB, 0x7D95, 0x591D, 0x0000, 0x3DF4, 0x9734,\n    0x0000, 0x5BDB, 0x0000, 0x5AA4, 0x3625, 0x0000, 0x5AD1, 0x5BB7,\n    0x5CFC, 0x676E, 0x8593, 0x0000, 0x7461, 0x749D, 0x0000, 0x66E7,\n    0x6E57, 0x79CA, 0x3D88, 0x44C3, 0x0000, 0x0000, 0x439A, 0x4536,\n    0x5CD5, 0x0000, 0x8AF9, 0x5C78, 0x3D12, 0x0000, 0x5D78, 0x9FB2,\n    0x7157, 0x4558, 0x0000, 0x0000, 0x4C77, 0x3978, 0x344A, 0x0000,\n    0x0000, 0x8ACC, 0x4FB4, 0x0000, 0x59BF, 0x816C, 0x9856, 0x0000,\n    0x5F3B, 0x0000, 0x0000, 0x0000, 0x4102, 0x46BB, 0x0000, 0x3F07,\n    0x9FB3, 0x0000, 0x40F8, 0x37D6, 0x46F7, 0x0000, 0x417C, 0x0000,\n    0x0000, 0x456D, 0x38D4, 0x0000, 0x4561, 0x451B, 0x4D89, 0x4C7B,\n    0x4D76, 0x45EA, 0x3FC8, 0x0000, 0x3661, 0x44DE, 0x44BD, 0x41ED,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-H_0.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_B5pc_H_0[247 * 3] = {\n    0x0020, 0x007E, 0x0001, 0x0080, 0x0080, 0x003D, 0x00FD, 0x00FF, 0x0060,\n    0xA140, 0xA158, 0x0063, 0xA159, 0xA15C, 0x35AF, 0xA15D, 0xA17E, 0x0080,\n    0xA1A1, 0xA1F5, 0x00A2, 0xA1F6, 0xA1F6, 0x00F8, 0xA1F7, 0xA1F7, 0x00F7,\n    0xA1F8, 0xA1FE, 0x00F9, 0xA240, 0xA27E, 0x0100, 0xA2A1, 0xA2FE, 0x013F,\n    0xA340, 0xA37E, 0x019D, 0xA3A1, 0xA3BB, 0x01DC, 0xA3BD, 0xA3BF, 0x01F7,\n    0xA3C0, 0xA3E0, 0x0232, 0xA440, 0xA47E, 0x0253, 0xA4A1, 0xA4FE, 0x0292,\n    0xA540, 0xA57E, 0x02F0, 0xA5A1, 0xA5FE, 0x032F, 0xA640, 0xA67E, 0x038D,\n    0xA6A1, 0xA6FE, 0x03CC, 0xA740, 0xA77E, 0x042A, 0xA7A1, 0xA7FE, 0x0469,\n    0xA840, 0xA87E, 0x04C7, 0xA8A1, 0xA8FE, 0x0506, 0xA940, 0xA97E, 0x0564,\n    0xA9A1, 0xA9FE, 0x05A3, 0xAA40, 0xAA7E, 0x0601, 0xAAA1, 0xAAFE, 0x0640,\n    0xAB40, 0xAB7E, 0x069E, 0xABA1, 0xABFE, 0x06DD, 0xAC40, 0xAC7E, 0x073B,\n    0xACA1, 0xACFD, 0x077A, 0xACFE, 0xACFE, 0x097F, 0xAD40, 0xAD7E, 0x07D7,\n    0xADA1, 0xADFE, 0x0816, 0xAE40, 0xAE7E, 0x0874, 0xAEA1, 0xAEFE, 0x08B3,\n    0xAF40, 0xAF7E, 0x0911, 0xAFA1, 0xAFCF, 0x0950, 0xAFD0, 0xAFFE, 0x0980,\n    0xB040, 0xB07E, 0x09AF, 0xB0A1, 0xB0FE, 0x09EE, 0xB140, 0xB17E, 0x0A4C,\n    0xB1A1, 0xB1FE, 0x0A8B, 0xB240, 0xB27E, 0x0AE9, 0xB2A1, 0xB2FE, 0x0B28,\n    0xB340, 0xB37E, 0x0B86, 0xB3A1, 0xB3FE, 0x0BC5, 0xB440, 0xB47E, 0x0C23,\n    0xB4A1, 0xB4FE, 0x0C62, 0xB540, 0xB57E, 0x0CC0, 0xB5A1, 0xB5FE, 0x0CFF,\n    0xB640, 0xB67E, 0x0D5D, 0xB6A1, 0xB6FE, 0x0D9C, 0xB740, 0xB77E, 0x0DFA,\n    0xB7A1, 0xB7FE, 0x0E39, 0xB840, 0xB87E, 0x0E97, 0xB8A1, 0xB8FE, 0x0ED6,\n    0xB940, 0xB97E, 0x0F34, 0xB9A1, 0xB9FE, 0x0F73, 0xBA40, 0xBA7E, 0x0FD1,\n    0xBAA1, 0xBAFE, 0x1010, 0xBB40, 0xBB7E, 0x106E, 0xBBA1, 0xBBC7, 0x10AD,\n    0xBBC8, 0xBBFE, 0x10D5, 0xBC40, 0xBC7E, 0x110C, 0xBCA1, 0xBCFE, 0x114B,\n    0xBD40, 0xBD7E, 0x11A9, 0xBDA1, 0xBDFE, 0x11E8, 0xBE40, 0xBE51, 0x1246,\n    0xBE52, 0xBE52, 0x10D4, 0xBE53, 0xBE7E, 0x1258, 0xBEA1, 0xBEFE, 0x1284,\n    0xBF40, 0xBF7E, 0x12E2, 0xBFA1, 0xBFFE, 0x1321, 0xC040, 0xC07E, 0x137F,\n    0xC0A1, 0xC0FE, 0x13BE, 0xC140, 0xC17E, 0x141C, 0xC1A1, 0xC1AA, 0x145B,\n    0xC1AB, 0xC1FE, 0x1466, 0xC240, 0xC27E, 0x14BA, 0xC2A1, 0xC2CA, 0x14F9,\n    0xC2CB, 0xC2CB, 0x1465, 0xC2CC, 0xC2FE, 0x1523, 0xC340, 0xC360, 0x1556,\n    0xC361, 0xC37E, 0x1578, 0xC3A1, 0xC3B8, 0x1596, 0xC3B9, 0xC3B9, 0x15AF,\n    0xC3BA, 0xC3BA, 0x15AE, 0xC3BB, 0xC3FE, 0x15B0, 0xC440, 0xC455, 0x15F4,\n    0xC456, 0xC456, 0x1577, 0xC457, 0xC47E, 0x160A, 0xC4A1, 0xC4FE, 0x1632,\n    0xC540, 0xC57E, 0x1690, 0xC5A1, 0xC5FE, 0x16CF, 0xC640, 0xC67E, 0x172D,\n    0xC940, 0xC949, 0x176C, 0xC94A, 0xC94A, 0x0274, 0xC94B, 0xC96B, 0x1776,\n    0xC96C, 0xC97E, 0x1798, 0xC9A1, 0xC9BD, 0x17AB, 0xC9BE, 0xC9BE, 0x1797,\n    0xC9BF, 0xC9EC, 0x17C8, 0xC9ED, 0xC9FE, 0x17F7, 0xCA40, 0xCA7E, 0x1809,\n    0xCAA1, 0xCAF6, 0x1848, 0xCAF7, 0xCAF7, 0x17F6, 0xCAF8, 0xCAFE, 0x189E,\n    0xCB40, 0xCB7E, 0x18A5, 0xCBA1, 0xCBFE, 0x18E4, 0xCC40, 0xCC7E, 0x1942,\n    0xCCA1, 0xCCFE, 0x1981, 0xCD40, 0xCD7E, 0x19DF, 0xCDA1, 0xCDFE, 0x1A1E,\n    0xCE40, 0xCE7E, 0x1A7C, 0xCEA1, 0xCEFE, 0x1ABB, 0xCF40, 0xCF7E, 0x1B19,\n    0xCFA1, 0xCFFE, 0x1B58, 0xD040, 0xD07E, 0x1BB6, 0xD0A1, 0xD0FE, 0x1BF5,\n    0xD140, 0xD17E, 0x1C53, 0xD1A1, 0xD1FE, 0x1C92, 0xD240, 0xD27E, 0x1CF0,\n    0xD2A1, 0xD2FE, 0x1D2F, 0xD340, 0xD37E, 0x1D8D, 0xD3A1, 0xD3FE, 0x1DCC,\n    0xD440, 0xD47E, 0x1E2A, 0xD4A1, 0xD4FE, 0x1E69, 0xD540, 0xD57E, 0x1EC7,\n    0xD5A1, 0xD5FE, 0x1F06, 0xD640, 0xD67E, 0x1F64, 0xD6A1, 0xD6CB, 0x1FA3,\n    0xD6CC, 0xD6CC, 0x2254, 0xD6CD, 0xD6FE, 0x1FCF, 0xD740, 0xD779, 0x2001,\n    0xD77A, 0xD77A, 0x22B9, 0xD77B, 0xD77E, 0x203B, 0xD7A1, 0xD7FE, 0x203F,\n    0xD840, 0xD87E, 0x209D, 0xD8A1, 0xD8FE, 0x20DC, 0xD940, 0xD97E, 0x213A,\n    0xD9A1, 0xD9FE, 0x2179, 0xDA40, 0xDA7E, 0x21D7, 0xDAA1, 0xDADE, 0x2216,\n    0xDADF, 0xDADF, 0x1FCE, 0xDAE0, 0xDAFE, 0x2255, 0xDB40, 0xDB7E, 0x2274,\n    0xDBA1, 0xDBA6, 0x22B3, 0xDBA7, 0xDBFE, 0x22BA, 0xDC40, 0xDC7E, 0x2312,\n    0xDCA1, 0xDCFE, 0x2351, 0xDD40, 0xDD7E, 0x23AF, 0xDDA1, 0xDDFB, 0x23EE,\n    0xDDFC, 0xDDFC, 0x2381, 0xDDFD, 0xDDFE, 0x2449, 0xDE40, 0xDE7E, 0x244B,\n    0xDEA1, 0xDEFE, 0x248A, 0xDF40, 0xDF7E, 0x24E8, 0xDFA1, 0xDFFE, 0x2527,\n    0xE040, 0xE07E, 0x2585, 0xE0A1, 0xE0FE, 0x25C4, 0xE140, 0xE17E, 0x2622,\n    0xE1A1, 0xE1FE, 0x2661, 0xE240, 0xE27E, 0x26BF, 0xE2A1, 0xE2FE, 0x26FE,\n    0xE340, 0xE37E, 0x275C, 0xE3A1, 0xE3FE, 0x279B, 0xE440, 0xE47E, 0x27F9,\n    0xE4A1, 0xE4FE, 0x2838, 0xE540, 0xE57E, 0x2896, 0xE5A1, 0xE5FE, 0x28D5,\n    0xE640, 0xE67E, 0x2933, 0xE6A1, 0xE6FE, 0x2972, 0xE740, 0xE77E, 0x29D0,\n    0xE7A1, 0xE7FE, 0x2A0F, 0xE840, 0xE87E, 0x2A6D, 0xE8A1, 0xE8A2, 0x2AAC,\n    0xE8A3, 0xE8FE, 0x2AAF, 0xE940, 0xE975, 0x2B0B, 0xE976, 0xE97E, 0x2B42,\n    0xE9A1, 0xE9FE, 0x2B4B, 0xEA40, 0xEA7E, 0x2BA9, 0xEAA1, 0xEAFE, 0x2BE8,\n    0xEB40, 0xEB5A, 0x2C46, 0xEB5B, 0xEB7E, 0x2C62, 0xEBA1, 0xEBF0, 0x2C86,\n    0xEBF1, 0xEBF1, 0x2AAE, 0xEBF2, 0xEBFE, 0x2CD6, 0xEC40, 0xEC7E, 0x2CE3,\n    0xECA1, 0xECDD, 0x2D22, 0xECDE, 0xECDE, 0x2B41, 0xECDF, 0xECFE, 0x2D5F,\n    0xED40, 0xED7E, 0x2D7F, 0xEDA1, 0xEDA9, 0x2DBE, 0xEDAA, 0xEDFE, 0x2DC8,\n    0xEE40, 0xEE7E, 0x2E1D, 0xEEA1, 0xEEEA, 0x2E5C, 0xEEEB, 0xEEEB, 0x3014,\n    0xEEEC, 0xEEFE, 0x2EA6, 0xEF40, 0xEF7E, 0x2EB9, 0xEFA1, 0xEFFE, 0x2EF8,\n    0xF040, 0xF055, 0x2F56, 0xF056, 0xF056, 0x2DC7, 0xF057, 0xF07E, 0x2F6C,\n    0xF0A1, 0xF0CA, 0x2F94, 0xF0CB, 0xF0CB, 0x2C61, 0xF0CC, 0xF0FE, 0x2FBE,\n    0xF140, 0xF162, 0x2FF1, 0xF163, 0xF16A, 0x3015, 0xF16B, 0xF16B, 0x3160,\n    0xF16C, 0xF17E, 0x301D, 0xF1A1, 0xF1FE, 0x3030, 0xF240, 0xF267, 0x308E,\n    0xF268, 0xF268, 0x31EF, 0xF269, 0xF27E, 0x30B6, 0xF2A1, 0xF2C2, 0x30CC,\n    0xF2C3, 0xF2FE, 0x30EF, 0xF340, 0xF374, 0x312B, 0xF375, 0xF37E, 0x3161,\n    0xF3A1, 0xF3FE, 0x316B, 0xF440, 0xF465, 0x31C9, 0xF466, 0xF47E, 0x31F0,\n    0xF4A1, 0xF4B4, 0x3209, 0xF4B5, 0xF4B5, 0x30EE, 0xF4B6, 0xF4FC, 0x321D,\n    0xF4FD, 0xF4FE, 0x3265, 0xF540, 0xF57E, 0x3267, 0xF5A1, 0xF5FE, 0x32A6,\n    0xF640, 0xF662, 0x3304, 0xF663, 0xF663, 0x3264, 0xF664, 0xF67E, 0x3327,\n    0xF6A1, 0xF6FE, 0x3342, 0xF740, 0xF77E, 0x33A0, 0xF7A1, 0xF7FE, 0x33DF,\n    0xF840, 0xF87E, 0x343D, 0xF8A1, 0xF8FE, 0x347C, 0xF940, 0xF976, 0x34DA,\n    0xF977, 0xF97E, 0x3512, 0xF9A1, 0xF9C3, 0x351A, 0xF9C4, 0xF9C4, 0x3511,\n    0xF9C5, 0xF9C5, 0x353D, 0xF9C6, 0xF9C6, 0x3549, 0xF9C7, 0xF9D1, 0x353E,\n    0xF9D2, 0xF9D5, 0x354A,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-V_0.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_B5pc_V_0[12 * 3] = {\n    0xA14B, 0xA14B, 0x354E, 0xA15A, 0xA15A, 0x35AF, 0xA15C, 0xA15C, 0x35B1,\n    0xA15D, 0xA15E, 0x0082, 0xA161, 0xA162, 0x0086, 0xA165, 0xA166, 0x008A,\n    0xA169, 0xA16A, 0x008E, 0xA16D, 0xA16E, 0x0092, 0xA171, 0xA172, 0x0096,\n    0xA175, 0xA176, 0x009A, 0xA179, 0xA17A, 0x009E, 0xA1E3, 0xA1E3, 0x354F,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-H_0.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_CNS_EUC_H_0[157 * 3] = {\n    0x0020, 0x007E, 0x3550, 0xA1A1, 0xA1FE, 0x0063, 0xA2A1, 0xA2FE, 0x00C1,\n    0xA3A1, 0xA3CE, 0x011F, 0xA4A1, 0xA4FE, 0x014D, 0xA5A1, 0xA5EC, 0x01AB,\n    0xA5EE, 0xA5F0, 0x01F7, 0xA6A1, 0xA6BE, 0x01FA, 0xA7A1, 0xA7A1, 0x0253,\n    0xA7A2, 0xA7A4, 0x0218, 0xA7A5, 0xA7A5, 0x0254, 0xA7A6, 0xA7A6, 0x021B,\n    0xA7A7, 0xA7A7, 0x025A, 0xA7A8, 0xA7A8, 0x021C, 0xA7A9, 0xA7AC, 0x025B,\n    0xA7AD, 0xA7AF, 0x021D, 0xA7B0, 0xA7B0, 0x025F, 0xA7B1, 0xA7B1, 0x176E,\n    0xA7B2, 0xA7B2, 0x0260, 0xA7B3, 0xA7B3, 0x0262, 0xA7B4, 0xA7B4, 0x0220,\n    0xA7B5, 0xA7B5, 0x0263, 0xA7B6, 0xA7B6, 0x176F, 0xA7B7, 0xA7B7, 0x0221,\n    0xA7B8, 0xA7B9, 0x0264, 0xA7BA, 0xA7BA, 0x0222, 0xA7BB, 0xA7BB, 0x1770,\n    0xA7BC, 0xA7BC, 0x0223, 0xA7BD, 0xA7BD, 0x0266, 0xA7BE, 0xA7BE, 0x0279,\n    0xA7BF, 0xA7BF, 0x1775, 0xA7C0, 0xA7C1, 0x027A, 0xA7C2, 0xA7C2, 0x0224,\n    0xA7C3, 0xA7C6, 0x027C, 0xA7C7, 0xA7C7, 0x0225, 0xA7C8, 0xA7CB, 0x0282,\n    0xA7CC, 0xA7CC, 0x1776, 0xA7CD, 0xA7CD, 0x0286, 0xA7CE, 0xA7CE, 0x0226,\n    0xA7CF, 0xA7D0, 0x0288, 0xA7D1, 0xA7D2, 0x028C, 0xA7D3, 0xA7D5, 0x0227,\n    0xA7D6, 0xA7D8, 0x028E, 0xA7D9, 0xA7DA, 0x022A, 0xA7DB, 0xA7DB, 0x1777,\n    0xA7DC, 0xA7DF, 0x02D0, 0xA7E0, 0xA7E0, 0x02D5, 0xA7E1, 0xA7E1, 0x022C,\n    0xA7E2, 0xA7E5, 0x02D6, 0xA7E6, 0xA7E6, 0x022D, 0xA7E7, 0xA7ED, 0x02DA,\n    0xA7EE, 0xA7EE, 0x178A, 0xA7EF, 0xA7F2, 0x02E1, 0xA7F3, 0xA7F3, 0x178C,\n    0xA7F4, 0xA7F8, 0x02E5, 0xA7F9, 0xA7F9, 0x178D, 0xA7FA, 0xA7FD, 0x02EA,\n    0xA7FE, 0xA7FE, 0x0356, 0xA8A1, 0xA8A6, 0x0357, 0xA8A7, 0xA8A7, 0x035E,\n    0xA8A8, 0xA8A8, 0x0362, 0xA8A9, 0xA8AA, 0x022E, 0xA8AB, 0xA8B2, 0x0363,\n    0xA8B3, 0xA8B3, 0x17B2, 0xA8B4, 0xA8B6, 0x036B, 0xA8B7, 0xA8BA, 0x03F6,\n    0xA8BB, 0xA8BB, 0x1812, 0xA8BC, 0xA8BE, 0x03FA, 0xA8BF, 0xA8C3, 0x03FE,\n    0xA8C4, 0xA8CC, 0x0405, 0xA8CD, 0xA8CD, 0x1813, 0xA8CE, 0xA8CE, 0x1818,\n    0xA8CF, 0xA8D2, 0x040F, 0xA8D3, 0xA8D3, 0x1819, 0xA8D4, 0xA8D9, 0x0508,\n    0xA8DA, 0xA8DA, 0x18E7, 0xA8DB, 0xA8E2, 0x050E, 0xA8E3, 0xA8E3, 0x0230,\n    0xA8E4, 0xA8E4, 0x051B, 0xA8E5, 0xA8E7, 0x0520, 0xA8E8, 0xA8EB, 0x0696,\n    0xA8EC, 0xA8EC, 0x0231, 0xA8ED, 0xA8F0, 0x069F, 0xA8F1, 0xA8FB, 0x0826,\n    0xA8FC, 0xA8FE, 0x09F5, 0xA9A1, 0xA9A1, 0x1E33, 0xA9A2, 0xA9A2, 0x09F8,\n    0xA9A3, 0xA9A3, 0x1E34, 0xA9A4, 0xA9A5, 0x09F9, 0xA9A6, 0xA9AB, 0x0BE1,\n    0xA9AC, 0xA9AE, 0x0DBB, 0xA9AF, 0xA9AF, 0x2360, 0xA9B0, 0xA9B0, 0x2612,\n    0xA9B1, 0xA9B3, 0x0F7B, 0xA9B4, 0xA9B5, 0x1100, 0xA9B6, 0xA9B6, 0x1289,\n    0xA9B7, 0xA9B8, 0x13B2, 0xA9B9, 0xA9B9, 0x2F0D, 0xC2A1, 0xC2C1, 0x0232,\n    0xC4A1, 0xC4FE, 0x0253, 0xC5A1, 0xC5FE, 0x02B1, 0xC6A1, 0xC6FE, 0x030F,\n    0xC7A1, 0xC7FE, 0x036D, 0xC8A1, 0xC8FE, 0x03CB, 0xC9A1, 0xC9FE, 0x0429,\n    0xCAA1, 0xCAFE, 0x0487, 0xCBA1, 0xCBFE, 0x04E5, 0xCCA1, 0xCCFE, 0x0543,\n    0xCDA1, 0xCDFE, 0x05A1, 0xCEA1, 0xCEFE, 0x05FF, 0xCFA1, 0xCFFE, 0x065D,\n    0xD0A1, 0xD0FE, 0x06BB, 0xD1A1, 0xD1FE, 0x0719, 0xD2A1, 0xD2FE, 0x0777,\n    0xD3A1, 0xD3FE, 0x07D5, 0xD4A1, 0xD4FE, 0x0833, 0xD5A1, 0xD5FE, 0x0891,\n    0xD6A1, 0xD6FE, 0x08EF, 0xD7A1, 0xD7FE, 0x094D, 0xD8A1, 0xD8FE, 0x09AB,\n    0xD9A1, 0xD9FE, 0x0A09, 0xDAA1, 0xDAFE, 0x0A67, 0xDBA1, 0xDBFE, 0x0AC5,\n    0xDCA1, 0xDCFE, 0x0B23, 0xDDA1, 0xDDFE, 0x0B81, 0xDEA1, 0xDEFE, 0x0BDF,\n    0xDFA1, 0xDFFE, 0x0C3D, 0xE0A1, 0xE0FE, 0x0C9B, 0xE1A1, 0xE1FE, 0x0CF9,\n    0xE2A1, 0xE2FE, 0x0D57, 0xE3A1, 0xE3FE, 0x0DB5, 0xE4A1, 0xE4FE, 0x0E13,\n    0xE5A1, 0xE5FE, 0x0E71, 0xE6A1, 0xE6FE, 0x0ECF, 0xE7A1, 0xE7FE, 0x0F2D,\n    0xE8A1, 0xE8FE, 0x0F8B, 0xE9A1, 0xE9FE, 0x0FE9, 0xEAA1, 0xEAFE, 0x1047,\n    0xEBA1, 0xEBFE, 0x10A5, 0xECA1, 0xECFE, 0x1103, 0xEDA1, 0xEDFE, 0x1161,\n    0xEEA1, 0xEEFE, 0x11BF, 0xEFA1, 0xEFFE, 0x121D, 0xF0A1, 0xF0FE, 0x127B,\n    0xF1A1, 0xF1FE, 0x12D9, 0xF2A1, 0xF2FE, 0x1337, 0xF3A1, 0xF3FE, 0x1395,\n    0xF4A1, 0xF4FE, 0x13F3, 0xF5A1, 0xF5FE, 0x1451, 0xF6A1, 0xF6FE, 0x14AF,\n    0xF7A1, 0xF7FE, 0x150D, 0xF8A1, 0xF8FE, 0x156B, 0xF9A1, 0xF9FE, 0x15C9,\n    0xFAA1, 0xFAFE, 0x1627, 0xFBA1, 0xFBFE, 0x1685, 0xFCA1, 0xFCFE, 0x16E3,\n    0xFDA1, 0xFDCB, 0x1741,\n};\nextern const unsigned short g_FXCMAP_CNS_EUC_H_0_DWord[238 * 4] = {\n    0x8EA1, 0xA1A1, 0xA1FE, 0x0063, 0x8EA1, 0xA2A1, 0xA2FE, 0x00C1,\n    0x8EA1, 0xA3A1, 0xA3CE, 0x011F, 0x8EA1, 0xA4A1, 0xA4FE, 0x014D,\n    0x8EA1, 0xA5A1, 0xA5EC, 0x01AB, 0x8EA1, 0xA5EE, 0xA5F0, 0x01F7,\n    0x8EA1, 0xA6A1, 0xA6BE, 0x01FA, 0x8EA1, 0xA7A1, 0xA7A1, 0x0253,\n    0x8EA1, 0xA7A2, 0xA7A4, 0x0218, 0x8EA1, 0xA7A5, 0xA7A5, 0x0254,\n    0x8EA1, 0xA7A6, 0xA7A6, 0x021B, 0x8EA1, 0xA7A7, 0xA7A7, 0x025A,\n    0x8EA1, 0xA7A8, 0xA7A8, 0x021C, 0x8EA1, 0xA7A9, 0xA7AC, 0x025B,\n    0x8EA1, 0xA7AD, 0xA7AF, 0x021D, 0x8EA1, 0xA7B0, 0xA7B0, 0x025F,\n    0x8EA1, 0xA7B1, 0xA7B1, 0x176E, 0x8EA1, 0xA7B2, 0xA7B2, 0x0260,\n    0x8EA1, 0xA7B3, 0xA7B3, 0x0262, 0x8EA1, 0xA7B4, 0xA7B4, 0x0220,\n    0x8EA1, 0xA7B5, 0xA7B5, 0x0263, 0x8EA1, 0xA7B6, 0xA7B6, 0x176F,\n    0x8EA1, 0xA7B7, 0xA7B7, 0x0221, 0x8EA1, 0xA7B8, 0xA7B9, 0x0264,\n    0x8EA1, 0xA7BA, 0xA7BA, 0x0222, 0x8EA1, 0xA7BB, 0xA7BB, 0x1770,\n    0x8EA1, 0xA7BC, 0xA7BC, 0x0223, 0x8EA1, 0xA7BD, 0xA7BD, 0x0266,\n    0x8EA1, 0xA7BE, 0xA7BE, 0x0279, 0x8EA1, 0xA7BF, 0xA7BF, 0x1775,\n    0x8EA1, 0xA7C0, 0xA7C1, 0x027A, 0x8EA1, 0xA7C2, 0xA7C2, 0x0224,\n    0x8EA1, 0xA7C3, 0xA7C6, 0x027C, 0x8EA1, 0xA7C7, 0xA7C7, 0x0225,\n    0x8EA1, 0xA7C8, 0xA7CB, 0x0282, 0x8EA1, 0xA7CC, 0xA7CC, 0x1776,\n    0x8EA1, 0xA7CD, 0xA7CD, 0x0286, 0x8EA1, 0xA7CE, 0xA7CE, 0x0226,\n    0x8EA1, 0xA7CF, 0xA7D0, 0x0288, 0x8EA1, 0xA7D1, 0xA7D2, 0x028C,\n    0x8EA1, 0xA7D3, 0xA7D5, 0x0227, 0x8EA1, 0xA7D6, 0xA7D8, 0x028E,\n    0x8EA1, 0xA7D9, 0xA7DA, 0x022A, 0x8EA1, 0xA7DB, 0xA7DB, 0x1777,\n    0x8EA1, 0xA7DC, 0xA7DF, 0x02D0, 0x8EA1, 0xA7E0, 0xA7E0, 0x02D5,\n    0x8EA1, 0xA7E1, 0xA7E1, 0x022C, 0x8EA1, 0xA7E2, 0xA7E5, 0x02D6,\n    0x8EA1, 0xA7E6, 0xA7E6, 0x022D, 0x8EA1, 0xA7E7, 0xA7ED, 0x02DA,\n    0x8EA1, 0xA7EE, 0xA7EE, 0x178A, 0x8EA1, 0xA7EF, 0xA7F2, 0x02E1,\n    0x8EA1, 0xA7F3, 0xA7F3, 0x178C, 0x8EA1, 0xA7F4, 0xA7F8, 0x02E5,\n    0x8EA1, 0xA7F9, 0xA7F9, 0x178D, 0x8EA1, 0xA7FA, 0xA7FD, 0x02EA,\n    0x8EA1, 0xA7FE, 0xA7FE, 0x0356, 0x8EA1, 0xA8A1, 0xA8A6, 0x0357,\n    0x8EA1, 0xA8A7, 0xA8A7, 0x035E, 0x8EA1, 0xA8A8, 0xA8A8, 0x0362,\n    0x8EA1, 0xA8A9, 0xA8AA, 0x022E, 0x8EA1, 0xA8AB, 0xA8B2, 0x0363,\n    0x8EA1, 0xA8B3, 0xA8B3, 0x17B2, 0x8EA1, 0xA8B4, 0xA8B6, 0x036B,\n    0x8EA1, 0xA8B7, 0xA8BA, 0x03F6, 0x8EA1, 0xA8BB, 0xA8BB, 0x1812,\n    0x8EA1, 0xA8BC, 0xA8BE, 0x03FA, 0x8EA1, 0xA8BF, 0xA8C3, 0x03FE,\n    0x8EA1, 0xA8C4, 0xA8CC, 0x0405, 0x8EA1, 0xA8CD, 0xA8CD, 0x1813,\n    0x8EA1, 0xA8CE, 0xA8CE, 0x1818, 0x8EA1, 0xA8CF, 0xA8D2, 0x040F,\n    0x8EA1, 0xA8D3, 0xA8D3, 0x1819, 0x8EA1, 0xA8D4, 0xA8D9, 0x0508,\n    0x8EA1, 0xA8DA, 0xA8DA, 0x18E7, 0x8EA1, 0xA8DB, 0xA8E2, 0x050E,\n    0x8EA1, 0xA8E3, 0xA8E3, 0x0230, 0x8EA1, 0xA8E4, 0xA8E4, 0x051B,\n    0x8EA1, 0xA8E5, 0xA8E7, 0x0520, 0x8EA1, 0xA8E8, 0xA8EB, 0x0696,\n    0x8EA1, 0xA8EC, 0xA8EC, 0x0231, 0x8EA1, 0xA8ED, 0xA8F0, 0x069F,\n    0x8EA1, 0xA8F1, 0xA8FB, 0x0826, 0x8EA1, 0xA8FC, 0xA8FE, 0x09F5,\n    0x8EA1, 0xA9A1, 0xA9A1, 0x1E33, 0x8EA1, 0xA9A2, 0xA9A2, 0x09F8,\n    0x8EA1, 0xA9A3, 0xA9A3, 0x1E34, 0x8EA1, 0xA9A4, 0xA9A5, 0x09F9,\n    0x8EA1, 0xA9A6, 0xA9AB, 0x0BE1, 0x8EA1, 0xA9AC, 0xA9AE, 0x0DBB,\n    0x8EA1, 0xA9AF, 0xA9AF, 0x2360, 0x8EA1, 0xA9B0, 0xA9B0, 0x2612,\n    0x8EA1, 0xA9B1, 0xA9B3, 0x0F7B, 0x8EA1, 0xA9B4, 0xA9B5, 0x1100,\n    0x8EA1, 0xA9B6, 0xA9B6, 0x1289, 0x8EA1, 0xA9B7, 0xA9B8, 0x13B2,\n    0x8EA1, 0xA9B9, 0xA9B9, 0x2F0D, 0x8EA1, 0xC2A1, 0xC2C1, 0x0232,\n    0x8EA1, 0xC4A1, 0xC4FE, 0x0253, 0x8EA1, 0xC5A1, 0xC5FE, 0x02B1,\n    0x8EA1, 0xC6A1, 0xC6FE, 0x030F, 0x8EA1, 0xC7A1, 0xC7FE, 0x036D,\n    0x8EA1, 0xC8A1, 0xC8FE, 0x03CB, 0x8EA1, 0xC9A1, 0xC9FE, 0x0429,\n    0x8EA1, 0xCAA1, 0xCAFE, 0x0487, 0x8EA1, 0xCBA1, 0xCBFE, 0x04E5,\n    0x8EA1, 0xCCA1, 0xCCFE, 0x0543, 0x8EA1, 0xCDA1, 0xCDFE, 0x05A1,\n    0x8EA1, 0xCEA1, 0xCEFE, 0x05FF, 0x8EA1, 0xCFA1, 0xCFFE, 0x065D,\n    0x8EA1, 0xD0A1, 0xD0FE, 0x06BB, 0x8EA1, 0xD1A1, 0xD1FE, 0x0719,\n    0x8EA1, 0xD2A1, 0xD2FE, 0x0777, 0x8EA1, 0xD3A1, 0xD3FE, 0x07D5,\n    0x8EA1, 0xD4A1, 0xD4FE, 0x0833, 0x8EA1, 0xD5A1, 0xD5FE, 0x0891,\n    0x8EA1, 0xD6A1, 0xD6FE, 0x08EF, 0x8EA1, 0xD7A1, 0xD7FE, 0x094D,\n    0x8EA1, 0xD8A1, 0xD8FE, 0x09AB, 0x8EA1, 0xD9A1, 0xD9FE, 0x0A09,\n    0x8EA1, 0xDAA1, 0xDAFE, 0x0A67, 0x8EA1, 0xDBA1, 0xDBFE, 0x0AC5,\n    0x8EA1, 0xDCA1, 0xDCFE, 0x0B23, 0x8EA1, 0xDDA1, 0xDDFE, 0x0B81,\n    0x8EA1, 0xDEA1, 0xDEFE, 0x0BDF, 0x8EA1, 0xDFA1, 0xDFFE, 0x0C3D,\n    0x8EA1, 0xE0A1, 0xE0FE, 0x0C9B, 0x8EA1, 0xE1A1, 0xE1FE, 0x0CF9,\n    0x8EA1, 0xE2A1, 0xE2FE, 0x0D57, 0x8EA1, 0xE3A1, 0xE3FE, 0x0DB5,\n    0x8EA1, 0xE4A1, 0xE4FE, 0x0E13, 0x8EA1, 0xE5A1, 0xE5FE, 0x0E71,\n    0x8EA1, 0xE6A1, 0xE6FE, 0x0ECF, 0x8EA1, 0xE7A1, 0xE7FE, 0x0F2D,\n    0x8EA1, 0xE8A1, 0xE8FE, 0x0F8B, 0x8EA1, 0xE9A1, 0xE9FE, 0x0FE9,\n    0x8EA1, 0xEAA1, 0xEAFE, 0x1047, 0x8EA1, 0xEBA1, 0xEBFE, 0x10A5,\n    0x8EA1, 0xECA1, 0xECFE, 0x1103, 0x8EA1, 0xEDA1, 0xEDFE, 0x1161,\n    0x8EA1, 0xEEA1, 0xEEFE, 0x11BF, 0x8EA1, 0xEFA1, 0xEFFE, 0x121D,\n    0x8EA1, 0xF0A1, 0xF0FE, 0x127B, 0x8EA1, 0xF1A1, 0xF1FE, 0x12D9,\n    0x8EA1, 0xF2A1, 0xF2FE, 0x1337, 0x8EA1, 0xF3A1, 0xF3FE, 0x1395,\n    0x8EA1, 0xF4A1, 0xF4FE, 0x13F3, 0x8EA1, 0xF5A1, 0xF5FE, 0x1451,\n    0x8EA1, 0xF6A1, 0xF6FE, 0x14AF, 0x8EA1, 0xF7A1, 0xF7FE, 0x150D,\n    0x8EA1, 0xF8A1, 0xF8FE, 0x156B, 0x8EA1, 0xF9A1, 0xF9FE, 0x15C9,\n    0x8EA1, 0xFAA1, 0xFAFE, 0x1627, 0x8EA1, 0xFBA1, 0xFBFE, 0x1685,\n    0x8EA1, 0xFCA1, 0xFCFE, 0x16E3, 0x8EA1, 0xFDA1, 0xFDCB, 0x1741,\n    0x8EA2, 0xA1A1, 0xA1FE, 0x176C, 0x8EA2, 0xA2A1, 0xA2FE, 0x17CA,\n    0x8EA2, 0xA3A1, 0xA3FE, 0x1828, 0x8EA2, 0xA4A1, 0xA4FE, 0x1886,\n    0x8EA2, 0xA5A1, 0xA5FE, 0x18E4, 0x8EA2, 0xA6A1, 0xA6FE, 0x1942,\n    0x8EA2, 0xA7A1, 0xA7FE, 0x19A0, 0x8EA2, 0xA8A1, 0xA8FE, 0x19FE,\n    0x8EA2, 0xA9A1, 0xA9FE, 0x1A5C, 0x8EA2, 0xAAA1, 0xAAFE, 0x1ABA,\n    0x8EA2, 0xABA1, 0xABFE, 0x1B18, 0x8EA2, 0xACA1, 0xACFE, 0x1B76,\n    0x8EA2, 0xADA1, 0xADFE, 0x1BD4, 0x8EA2, 0xAEA1, 0xAEFE, 0x1C32,\n    0x8EA2, 0xAFA1, 0xAFFE, 0x1C90, 0x8EA2, 0xB0A1, 0xB0FE, 0x1CEE,\n    0x8EA2, 0xB1A1, 0xB1FE, 0x1D4C, 0x8EA2, 0xB2A1, 0xB2FE, 0x1DAA,\n    0x8EA2, 0xB3A1, 0xB3FE, 0x1E08, 0x8EA2, 0xB4A1, 0xB4FE, 0x1E66,\n    0x8EA2, 0xB5A1, 0xB5FE, 0x1EC4, 0x8EA2, 0xB6A1, 0xB6FE, 0x1F22,\n    0x8EA2, 0xB7A1, 0xB7FE, 0x1F80, 0x8EA2, 0xB8A1, 0xB8FE, 0x1FDE,\n    0x8EA2, 0xB9A1, 0xB9FE, 0x203C, 0x8EA2, 0xBAA1, 0xBAFE, 0x209A,\n    0x8EA2, 0xBBA1, 0xBBFE, 0x20F8, 0x8EA2, 0xBCA1, 0xBCFE, 0x2156,\n    0x8EA2, 0xBDA1, 0xBDFE, 0x21B4, 0x8EA2, 0xBEA1, 0xBEFE, 0x2212,\n    0x8EA2, 0xBFA1, 0xBFFE, 0x2270, 0x8EA2, 0xC0A1, 0xC0FE, 0x22CE,\n    0x8EA2, 0xC1A1, 0xC1FE, 0x232C, 0x8EA2, 0xC2A1, 0xC2FE, 0x238A,\n    0x8EA2, 0xC3A1, 0xC3FE, 0x23E8, 0x8EA2, 0xC4A1, 0xC4FE, 0x2446,\n    0x8EA2, 0xC5A1, 0xC5FE, 0x24A4, 0x8EA2, 0xC6A1, 0xC6FE, 0x2502,\n    0x8EA2, 0xC7A1, 0xC7FE, 0x2560, 0x8EA2, 0xC8A1, 0xC8FE, 0x25BE,\n    0x8EA2, 0xC9A1, 0xC9FE, 0x261C, 0x8EA2, 0xCAA1, 0xCAFE, 0x267A,\n    0x8EA2, 0xCBA1, 0xCBFE, 0x26D8, 0x8EA2, 0xCCA1, 0xCCFE, 0x2736,\n    0x8EA2, 0xCDA1, 0xCDFE, 0x2794, 0x8EA2, 0xCEA1, 0xCEFE, 0x27F2,\n    0x8EA2, 0xCFA1, 0xCFFE, 0x2850, 0x8EA2, 0xD0A1, 0xD0FE, 0x28AE,\n    0x8EA2, 0xD1A1, 0xD1FE, 0x290C, 0x8EA2, 0xD2A1, 0xD2FE, 0x296A,\n    0x8EA2, 0xD3A1, 0xD3FE, 0x29C8, 0x8EA2, 0xD4A1, 0xD4FE, 0x2A26,\n    0x8EA2, 0xD5A1, 0xD5FE, 0x2A84, 0x8EA2, 0xD6A1, 0xD6FE, 0x2AE2,\n    0x8EA2, 0xD7A1, 0xD7FE, 0x2B40, 0x8EA2, 0xD8A1, 0xD8FE, 0x2B9E,\n    0x8EA2, 0xD9A1, 0xD9FE, 0x2BFC, 0x8EA2, 0xDAA1, 0xDAFE, 0x2C5A,\n    0x8EA2, 0xDBA1, 0xDBFE, 0x2CB8, 0x8EA2, 0xDCA1, 0xDCFE, 0x2D16,\n    0x8EA2, 0xDDA1, 0xDDFE, 0x2D74, 0x8EA2, 0xDEA1, 0xDEFE, 0x2DD2,\n    0x8EA2, 0xDFA1, 0xDFFE, 0x2E30, 0x8EA2, 0xE0A1, 0xE0FE, 0x2E8E,\n    0x8EA2, 0xE1A1, 0xE1FE, 0x2EEC, 0x8EA2, 0xE2A1, 0xE2FE, 0x2F4A,\n    0x8EA2, 0xE3A1, 0xE3FE, 0x2FA8, 0x8EA2, 0xE4A1, 0xE4FE, 0x3006,\n    0x8EA2, 0xE5A1, 0xE5FE, 0x3064, 0x8EA2, 0xE6A1, 0xE6FE, 0x30C2,\n    0x8EA2, 0xE7A1, 0xE7FE, 0x3120, 0x8EA2, 0xE8A1, 0xE8FE, 0x317E,\n    0x8EA2, 0xE9A1, 0xE9FE, 0x31DC, 0x8EA2, 0xEAA1, 0xEAFE, 0x323A,\n    0x8EA2, 0xEBA1, 0xEBFE, 0x3298, 0x8EA2, 0xECA1, 0xECFE, 0x32F6,\n    0x8EA2, 0xEDA1, 0xEDFE, 0x3354, 0x8EA2, 0xEEA1, 0xEEFE, 0x33B2,\n    0x8EA2, 0xEFA1, 0xEFFE, 0x3410, 0x8EA2, 0xF0A1, 0xF0FE, 0x346E,\n    0x8EA2, 0xF1A1, 0xF1FE, 0x34CC, 0x8EA2, 0xF2A1, 0xF2C4, 0x352A,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-V_0.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_CNS_EUC_V_0[180 * 3] = {\n    0x0020, 0x007E, 0x3550, 0xA1A1, 0xA1AB, 0x0063, 0xA1AC, 0xA1AC, 0x354E,\n    0xA1AD, 0xA1BA, 0x006F, 0xA1BB, 0xA1BB, 0x007C, 0xA1BC, 0xA1BC, 0x007E,\n    0xA1BD, 0xA1BD, 0x007E, 0xA1BE, 0xA1BF, 0x0082, 0xA1C0, 0xA1C1, 0x0082,\n    0xA1C2, 0xA1C3, 0x0086, 0xA1C4, 0xA1C5, 0x0086, 0xA1C6, 0xA1C7, 0x008A,\n    0xA1C8, 0xA1C9, 0x008A, 0xA1CA, 0xA1CB, 0x008E, 0xA1CC, 0xA1CD, 0x008E,\n    0xA1CE, 0xA1CF, 0x0092, 0xA1D0, 0xA1D1, 0x0092, 0xA1D2, 0xA1D3, 0x0096,\n    0xA1D4, 0xA1D5, 0x0096, 0xA1D6, 0xA1D7, 0x009A, 0xA1D8, 0xA1D9, 0x009A,\n    0xA1DA, 0xA1DB, 0x009E, 0xA1DC, 0xA1FE, 0x009E, 0xA2A1, 0xA2C3, 0x00C1,\n    0xA2C4, 0xA2C4, 0x354F, 0xA2C5, 0xA2FE, 0x00E5, 0xA3A1, 0xA3CE, 0x011F,\n    0xA4A1, 0xA4FE, 0x014D, 0xA5A1, 0xA5EC, 0x01AB, 0xA5EE, 0xA5F0, 0x01F7,\n    0xA6A1, 0xA6BE, 0x01FA, 0xA7A1, 0xA7A1, 0x0253, 0xA7A2, 0xA7A4, 0x0218,\n    0xA7A5, 0xA7A5, 0x0254, 0xA7A6, 0xA7A6, 0x021B, 0xA7A7, 0xA7A7, 0x025A,\n    0xA7A8, 0xA7A8, 0x021C, 0xA7A9, 0xA7AC, 0x025B, 0xA7AD, 0xA7AF, 0x021D,\n    0xA7B0, 0xA7B0, 0x025F, 0xA7B1, 0xA7B1, 0x176E, 0xA7B2, 0xA7B2, 0x0260,\n    0xA7B3, 0xA7B3, 0x0262, 0xA7B4, 0xA7B4, 0x0220, 0xA7B5, 0xA7B5, 0x0263,\n    0xA7B6, 0xA7B6, 0x176F, 0xA7B7, 0xA7B7, 0x0221, 0xA7B8, 0xA7B9, 0x0264,\n    0xA7BA, 0xA7BA, 0x0222, 0xA7BB, 0xA7BB, 0x1770, 0xA7BC, 0xA7BC, 0x0223,\n    0xA7BD, 0xA7BD, 0x0266, 0xA7BE, 0xA7BE, 0x0279, 0xA7BF, 0xA7BF, 0x1775,\n    0xA7C0, 0xA7C1, 0x027A, 0xA7C2, 0xA7C2, 0x0224, 0xA7C3, 0xA7C6, 0x027C,\n    0xA7C7, 0xA7C7, 0x0225, 0xA7C8, 0xA7CB, 0x0282, 0xA7CC, 0xA7CC, 0x1776,\n    0xA7CD, 0xA7CD, 0x0286, 0xA7CE, 0xA7CE, 0x0226, 0xA7CF, 0xA7D0, 0x0288,\n    0xA7D1, 0xA7D2, 0x028C, 0xA7D3, 0xA7D5, 0x0227, 0xA7D6, 0xA7D8, 0x028E,\n    0xA7D9, 0xA7DA, 0x022A, 0xA7DB, 0xA7DB, 0x1777, 0xA7DC, 0xA7DF, 0x02D0,\n    0xA7E0, 0xA7E0, 0x02D5, 0xA7E1, 0xA7E1, 0x022C, 0xA7E2, 0xA7E5, 0x02D6,\n    0xA7E6, 0xA7E6, 0x022D, 0xA7E7, 0xA7ED, 0x02DA, 0xA7EE, 0xA7EE, 0x178A,\n    0xA7EF, 0xA7F2, 0x02E1, 0xA7F3, 0xA7F3, 0x178C, 0xA7F4, 0xA7F8, 0x02E5,\n    0xA7F9, 0xA7F9, 0x178D, 0xA7FA, 0xA7FD, 0x02EA, 0xA7FE, 0xA7FE, 0x0356,\n    0xA8A1, 0xA8A6, 0x0357, 0xA8A7, 0xA8A7, 0x035E, 0xA8A8, 0xA8A8, 0x0362,\n    0xA8A9, 0xA8AA, 0x022E, 0xA8AB, 0xA8B2, 0x0363, 0xA8B3, 0xA8B3, 0x17B2,\n    0xA8B4, 0xA8B6, 0x036B, 0xA8B7, 0xA8BA, 0x03F6, 0xA8BB, 0xA8BB, 0x1812,\n    0xA8BC, 0xA8BE, 0x03FA, 0xA8BF, 0xA8C3, 0x03FE, 0xA8C4, 0xA8CC, 0x0405,\n    0xA8CD, 0xA8CD, 0x1813, 0xA8CE, 0xA8CE, 0x1818, 0xA8CF, 0xA8D2, 0x040F,\n    0xA8D3, 0xA8D3, 0x1819, 0xA8D4, 0xA8D9, 0x0508, 0xA8DA, 0xA8DA, 0x18E7,\n    0xA8DB, 0xA8E2, 0x050E, 0xA8E3, 0xA8E3, 0x0230, 0xA8E4, 0xA8E4, 0x051B,\n    0xA8E5, 0xA8E7, 0x0520, 0xA8E8, 0xA8EB, 0x0696, 0xA8EC, 0xA8EC, 0x0231,\n    0xA8ED, 0xA8F0, 0x069F, 0xA8F1, 0xA8FB, 0x0826, 0xA8FC, 0xA8FE, 0x09F5,\n    0xA9A1, 0xA9A1, 0x1E33, 0xA9A2, 0xA9A2, 0x09F8, 0xA9A3, 0xA9A3, 0x1E34,\n    0xA9A4, 0xA9A5, 0x09F9, 0xA9A6, 0xA9AB, 0x0BE1, 0xA9AC, 0xA9AE, 0x0DBB,\n    0xA9AF, 0xA9AF, 0x2360, 0xA9B0, 0xA9B0, 0x2612, 0xA9B1, 0xA9B3, 0x0F7B,\n    0xA9B4, 0xA9B5, 0x1100, 0xA9B6, 0xA9B6, 0x1289, 0xA9B7, 0xA9B8, 0x13B2,\n    0xA9B9, 0xA9B9, 0x2F0D, 0xC2A1, 0xC2C1, 0x0232, 0xC4A1, 0xC4FE, 0x0253,\n    0xC5A1, 0xC5FE, 0x02B1, 0xC6A1, 0xC6FE, 0x030F, 0xC7A1, 0xC7FE, 0x036D,\n    0xC8A1, 0xC8FE, 0x03CB, 0xC9A1, 0xC9FE, 0x0429, 0xCAA1, 0xCAFE, 0x0487,\n    0xCBA1, 0xCBFE, 0x04E5, 0xCCA1, 0xCCFE, 0x0543, 0xCDA1, 0xCDFE, 0x05A1,\n    0xCEA1, 0xCEFE, 0x05FF, 0xCFA1, 0xCFFE, 0x065D, 0xD0A1, 0xD0FE, 0x06BB,\n    0xD1A1, 0xD1FE, 0x0719, 0xD2A1, 0xD2FE, 0x0777, 0xD3A1, 0xD3FE, 0x07D5,\n    0xD4A1, 0xD4FE, 0x0833, 0xD5A1, 0xD5FE, 0x0891, 0xD6A1, 0xD6FE, 0x08EF,\n    0xD7A1, 0xD7FE, 0x094D, 0xD8A1, 0xD8FE, 0x09AB, 0xD9A1, 0xD9FE, 0x0A09,\n    0xDAA1, 0xDAFE, 0x0A67, 0xDBA1, 0xDBFE, 0x0AC5, 0xDCA1, 0xDCFE, 0x0B23,\n    0xDDA1, 0xDDFE, 0x0B81, 0xDEA1, 0xDEFE, 0x0BDF, 0xDFA1, 0xDFFE, 0x0C3D,\n    0xE0A1, 0xE0FE, 0x0C9B, 0xE1A1, 0xE1FE, 0x0CF9, 0xE2A1, 0xE2FE, 0x0D57,\n    0xE3A1, 0xE3FE, 0x0DB5, 0xE4A1, 0xE4FE, 0x0E13, 0xE5A1, 0xE5FE, 0x0E71,\n    0xE6A1, 0xE6FE, 0x0ECF, 0xE7A1, 0xE7FE, 0x0F2D, 0xE8A1, 0xE8FE, 0x0F8B,\n    0xE9A1, 0xE9FE, 0x0FE9, 0xEAA1, 0xEAFE, 0x1047, 0xEBA1, 0xEBFE, 0x10A5,\n    0xECA1, 0xECFE, 0x1103, 0xEDA1, 0xEDFE, 0x1161, 0xEEA1, 0xEEFE, 0x11BF,\n    0xEFA1, 0xEFFE, 0x121D, 0xF0A1, 0xF0FE, 0x127B, 0xF1A1, 0xF1FE, 0x12D9,\n    0xF2A1, 0xF2FE, 0x1337, 0xF3A1, 0xF3FE, 0x1395, 0xF4A1, 0xF4FE, 0x13F3,\n    0xF5A1, 0xF5FE, 0x1451, 0xF6A1, 0xF6FE, 0x14AF, 0xF7A1, 0xF7FE, 0x150D,\n    0xF8A1, 0xF8FE, 0x156B, 0xF9A1, 0xF9FE, 0x15C9, 0xFAA1, 0xFAFE, 0x1627,\n    0xFBA1, 0xFBFE, 0x1685, 0xFCA1, 0xFCFE, 0x16E3, 0xFDA1, 0xFDCB, 0x1741,\n};\nextern const unsigned short g_FXCMAP_CNS_EUC_V_0_DWord[261 * 4] = {\n    0x8EA1, 0xA1A1, 0xA1AB, 0x0063, 0x8EA1, 0xA1AC, 0xA1AC, 0x354E,\n    0x8EA1, 0xA1AD, 0xA1BA, 0x006F, 0x8EA1, 0xA1BB, 0xA1BB, 0x007C,\n    0x8EA1, 0xA1BC, 0xA1BC, 0x007E, 0x8EA1, 0xA1BD, 0xA1BD, 0x007E,\n    0x8EA1, 0xA1BE, 0xA1BF, 0x0082, 0x8EA1, 0xA1C0, 0xA1C1, 0x0082,\n    0x8EA1, 0xA1C2, 0xA1C3, 0x0086, 0x8EA1, 0xA1C4, 0xA1C5, 0x0086,\n    0x8EA1, 0xA1C6, 0xA1C7, 0x008A, 0x8EA1, 0xA1C8, 0xA1C9, 0x008A,\n    0x8EA1, 0xA1CA, 0xA1CB, 0x008E, 0x8EA1, 0xA1CC, 0xA1CD, 0x008E,\n    0x8EA1, 0xA1CE, 0xA1CF, 0x0092, 0x8EA1, 0xA1D0, 0xA1D1, 0x0092,\n    0x8EA1, 0xA1D2, 0xA1D3, 0x0096, 0x8EA1, 0xA1D4, 0xA1D5, 0x0096,\n    0x8EA1, 0xA1D6, 0xA1D7, 0x009A, 0x8EA1, 0xA1D8, 0xA1D9, 0x009A,\n    0x8EA1, 0xA1DA, 0xA1DB, 0x009E, 0x8EA1, 0xA1DC, 0xA1FE, 0x009E,\n    0x8EA1, 0xA2A1, 0xA2C3, 0x00C1, 0x8EA1, 0xA2C4, 0xA2C4, 0x354F,\n    0x8EA1, 0xA2C5, 0xA2FE, 0x00E5, 0x8EA1, 0xA3A1, 0xA3CE, 0x011F,\n    0x8EA1, 0xA4A1, 0xA4FE, 0x014D, 0x8EA1, 0xA5A1, 0xA5EC, 0x01AB,\n    0x8EA1, 0xA5EE, 0xA5F0, 0x01F7, 0x8EA1, 0xA6A1, 0xA6BE, 0x01FA,\n    0x8EA1, 0xA7A1, 0xA7A1, 0x0253, 0x8EA1, 0xA7A2, 0xA7A4, 0x0218,\n    0x8EA1, 0xA7A5, 0xA7A5, 0x0254, 0x8EA1, 0xA7A6, 0xA7A6, 0x021B,\n    0x8EA1, 0xA7A7, 0xA7A7, 0x025A, 0x8EA1, 0xA7A8, 0xA7A8, 0x021C,\n    0x8EA1, 0xA7A9, 0xA7AC, 0x025B, 0x8EA1, 0xA7AD, 0xA7AF, 0x021D,\n    0x8EA1, 0xA7B0, 0xA7B0, 0x025F, 0x8EA1, 0xA7B1, 0xA7B1, 0x176E,\n    0x8EA1, 0xA7B2, 0xA7B2, 0x0260, 0x8EA1, 0xA7B3, 0xA7B3, 0x0262,\n    0x8EA1, 0xA7B4, 0xA7B4, 0x0220, 0x8EA1, 0xA7B5, 0xA7B5, 0x0263,\n    0x8EA1, 0xA7B6, 0xA7B6, 0x176F, 0x8EA1, 0xA7B7, 0xA7B7, 0x0221,\n    0x8EA1, 0xA7B8, 0xA7B9, 0x0264, 0x8EA1, 0xA7BA, 0xA7BA, 0x0222,\n    0x8EA1, 0xA7BB, 0xA7BB, 0x1770, 0x8EA1, 0xA7BC, 0xA7BC, 0x0223,\n    0x8EA1, 0xA7BD, 0xA7BD, 0x0266, 0x8EA1, 0xA7BE, 0xA7BE, 0x0279,\n    0x8EA1, 0xA7BF, 0xA7BF, 0x1775, 0x8EA1, 0xA7C0, 0xA7C1, 0x027A,\n    0x8EA1, 0xA7C2, 0xA7C2, 0x0224, 0x8EA1, 0xA7C3, 0xA7C6, 0x027C,\n    0x8EA1, 0xA7C7, 0xA7C7, 0x0225, 0x8EA1, 0xA7C8, 0xA7CB, 0x0282,\n    0x8EA1, 0xA7CC, 0xA7CC, 0x1776, 0x8EA1, 0xA7CD, 0xA7CD, 0x0286,\n    0x8EA1, 0xA7CE, 0xA7CE, 0x0226, 0x8EA1, 0xA7CF, 0xA7D0, 0x0288,\n    0x8EA1, 0xA7D1, 0xA7D2, 0x028C, 0x8EA1, 0xA7D3, 0xA7D5, 0x0227,\n    0x8EA1, 0xA7D6, 0xA7D8, 0x028E, 0x8EA1, 0xA7D9, 0xA7DA, 0x022A,\n    0x8EA1, 0xA7DB, 0xA7DB, 0x1777, 0x8EA1, 0xA7DC, 0xA7DF, 0x02D0,\n    0x8EA1, 0xA7E0, 0xA7E0, 0x02D5, 0x8EA1, 0xA7E1, 0xA7E1, 0x022C,\n    0x8EA1, 0xA7E2, 0xA7E5, 0x02D6, 0x8EA1, 0xA7E6, 0xA7E6, 0x022D,\n    0x8EA1, 0xA7E7, 0xA7ED, 0x02DA, 0x8EA1, 0xA7EE, 0xA7EE, 0x178A,\n    0x8EA1, 0xA7EF, 0xA7F2, 0x02E1, 0x8EA1, 0xA7F3, 0xA7F3, 0x178C,\n    0x8EA1, 0xA7F4, 0xA7F8, 0x02E5, 0x8EA1, 0xA7F9, 0xA7F9, 0x178D,\n    0x8EA1, 0xA7FA, 0xA7FD, 0x02EA, 0x8EA1, 0xA7FE, 0xA7FE, 0x0356,\n    0x8EA1, 0xA8A1, 0xA8A6, 0x0357, 0x8EA1, 0xA8A7, 0xA8A7, 0x035E,\n    0x8EA1, 0xA8A8, 0xA8A8, 0x0362, 0x8EA1, 0xA8A9, 0xA8AA, 0x022E,\n    0x8EA1, 0xA8AB, 0xA8B2, 0x0363, 0x8EA1, 0xA8B3, 0xA8B3, 0x17B2,\n    0x8EA1, 0xA8B4, 0xA8B6, 0x036B, 0x8EA1, 0xA8B7, 0xA8BA, 0x03F6,\n    0x8EA1, 0xA8BB, 0xA8BB, 0x1812, 0x8EA1, 0xA8BC, 0xA8BE, 0x03FA,\n    0x8EA1, 0xA8BF, 0xA8C3, 0x03FE, 0x8EA1, 0xA8C4, 0xA8CC, 0x0405,\n    0x8EA1, 0xA8CD, 0xA8CD, 0x1813, 0x8EA1, 0xA8CE, 0xA8CE, 0x1818,\n    0x8EA1, 0xA8CF, 0xA8D2, 0x040F, 0x8EA1, 0xA8D3, 0xA8D3, 0x1819,\n    0x8EA1, 0xA8D4, 0xA8D9, 0x0508, 0x8EA1, 0xA8DA, 0xA8DA, 0x18E7,\n    0x8EA1, 0xA8DB, 0xA8E2, 0x050E, 0x8EA1, 0xA8E3, 0xA8E3, 0x0230,\n    0x8EA1, 0xA8E4, 0xA8E4, 0x051B, 0x8EA1, 0xA8E5, 0xA8E7, 0x0520,\n    0x8EA1, 0xA8E8, 0xA8EB, 0x0696, 0x8EA1, 0xA8EC, 0xA8EC, 0x0231,\n    0x8EA1, 0xA8ED, 0xA8F0, 0x069F, 0x8EA1, 0xA8F1, 0xA8FB, 0x0826,\n    0x8EA1, 0xA8FC, 0xA8FE, 0x09F5, 0x8EA1, 0xA9A1, 0xA9A1, 0x1E33,\n    0x8EA1, 0xA9A2, 0xA9A2, 0x09F8, 0x8EA1, 0xA9A3, 0xA9A3, 0x1E34,\n    0x8EA1, 0xA9A4, 0xA9A5, 0x09F9, 0x8EA1, 0xA9A6, 0xA9AB, 0x0BE1,\n    0x8EA1, 0xA9AC, 0xA9AE, 0x0DBB, 0x8EA1, 0xA9AF, 0xA9AF, 0x2360,\n    0x8EA1, 0xA9B0, 0xA9B0, 0x2612, 0x8EA1, 0xA9B1, 0xA9B3, 0x0F7B,\n    0x8EA1, 0xA9B4, 0xA9B5, 0x1100, 0x8EA1, 0xA9B6, 0xA9B6, 0x1289,\n    0x8EA1, 0xA9B7, 0xA9B8, 0x13B2, 0x8EA1, 0xA9B9, 0xA9B9, 0x2F0D,\n    0x8EA1, 0xC2A1, 0xC2C1, 0x0232, 0x8EA1, 0xC4A1, 0xC4FE, 0x0253,\n    0x8EA1, 0xC5A1, 0xC5FE, 0x02B1, 0x8EA1, 0xC6A1, 0xC6FE, 0x030F,\n    0x8EA1, 0xC7A1, 0xC7FE, 0x036D, 0x8EA1, 0xC8A1, 0xC8FE, 0x03CB,\n    0x8EA1, 0xC9A1, 0xC9FE, 0x0429, 0x8EA1, 0xCAA1, 0xCAFE, 0x0487,\n    0x8EA1, 0xCBA1, 0xCBFE, 0x04E5, 0x8EA1, 0xCCA1, 0xCCFE, 0x0543,\n    0x8EA1, 0xCDA1, 0xCDFE, 0x05A1, 0x8EA1, 0xCEA1, 0xCEFE, 0x05FF,\n    0x8EA1, 0xCFA1, 0xCFFE, 0x065D, 0x8EA1, 0xD0A1, 0xD0FE, 0x06BB,\n    0x8EA1, 0xD1A1, 0xD1FE, 0x0719, 0x8EA1, 0xD2A1, 0xD2FE, 0x0777,\n    0x8EA1, 0xD3A1, 0xD3FE, 0x07D5, 0x8EA1, 0xD4A1, 0xD4FE, 0x0833,\n    0x8EA1, 0xD5A1, 0xD5FE, 0x0891, 0x8EA1, 0xD6A1, 0xD6FE, 0x08EF,\n    0x8EA1, 0xD7A1, 0xD7FE, 0x094D, 0x8EA1, 0xD8A1, 0xD8FE, 0x09AB,\n    0x8EA1, 0xD9A1, 0xD9FE, 0x0A09, 0x8EA1, 0xDAA1, 0xDAFE, 0x0A67,\n    0x8EA1, 0xDBA1, 0xDBFE, 0x0AC5, 0x8EA1, 0xDCA1, 0xDCFE, 0x0B23,\n    0x8EA1, 0xDDA1, 0xDDFE, 0x0B81, 0x8EA1, 0xDEA1, 0xDEFE, 0x0BDF,\n    0x8EA1, 0xDFA1, 0xDFFE, 0x0C3D, 0x8EA1, 0xE0A1, 0xE0FE, 0x0C9B,\n    0x8EA1, 0xE1A1, 0xE1FE, 0x0CF9, 0x8EA1, 0xE2A1, 0xE2FE, 0x0D57,\n    0x8EA1, 0xE3A1, 0xE3FE, 0x0DB5, 0x8EA1, 0xE4A1, 0xE4FE, 0x0E13,\n    0x8EA1, 0xE5A1, 0xE5FE, 0x0E71, 0x8EA1, 0xE6A1, 0xE6FE, 0x0ECF,\n    0x8EA1, 0xE7A1, 0xE7FE, 0x0F2D, 0x8EA1, 0xE8A1, 0xE8FE, 0x0F8B,\n    0x8EA1, 0xE9A1, 0xE9FE, 0x0FE9, 0x8EA1, 0xEAA1, 0xEAFE, 0x1047,\n    0x8EA1, 0xEBA1, 0xEBFE, 0x10A5, 0x8EA1, 0xECA1, 0xECFE, 0x1103,\n    0x8EA1, 0xEDA1, 0xEDFE, 0x1161, 0x8EA1, 0xEEA1, 0xEEFE, 0x11BF,\n    0x8EA1, 0xEFA1, 0xEFFE, 0x121D, 0x8EA1, 0xF0A1, 0xF0FE, 0x127B,\n    0x8EA1, 0xF1A1, 0xF1FE, 0x12D9, 0x8EA1, 0xF2A1, 0xF2FE, 0x1337,\n    0x8EA1, 0xF3A1, 0xF3FE, 0x1395, 0x8EA1, 0xF4A1, 0xF4FE, 0x13F3,\n    0x8EA1, 0xF5A1, 0xF5FE, 0x1451, 0x8EA1, 0xF6A1, 0xF6FE, 0x14AF,\n    0x8EA1, 0xF7A1, 0xF7FE, 0x150D, 0x8EA1, 0xF8A1, 0xF8FE, 0x156B,\n    0x8EA1, 0xF9A1, 0xF9FE, 0x15C9, 0x8EA1, 0xFAA1, 0xFAFE, 0x1627,\n    0x8EA1, 0xFBA1, 0xFBFE, 0x1685, 0x8EA1, 0xFCA1, 0xFCFE, 0x16E3,\n    0x8EA1, 0xFDA1, 0xFDCB, 0x1741, 0x8EA2, 0xA1A1, 0xA1FE, 0x176C,\n    0x8EA2, 0xA2A1, 0xA2FE, 0x17CA, 0x8EA2, 0xA3A1, 0xA3FE, 0x1828,\n    0x8EA2, 0xA4A1, 0xA4FE, 0x1886, 0x8EA2, 0xA5A1, 0xA5FE, 0x18E4,\n    0x8EA2, 0xA6A1, 0xA6FE, 0x1942, 0x8EA2, 0xA7A1, 0xA7FE, 0x19A0,\n    0x8EA2, 0xA8A1, 0xA8FE, 0x19FE, 0x8EA2, 0xA9A1, 0xA9FE, 0x1A5C,\n    0x8EA2, 0xAAA1, 0xAAFE, 0x1ABA, 0x8EA2, 0xABA1, 0xABFE, 0x1B18,\n    0x8EA2, 0xACA1, 0xACFE, 0x1B76, 0x8EA2, 0xADA1, 0xADFE, 0x1BD4,\n    0x8EA2, 0xAEA1, 0xAEFE, 0x1C32, 0x8EA2, 0xAFA1, 0xAFFE, 0x1C90,\n    0x8EA2, 0xB0A1, 0xB0FE, 0x1CEE, 0x8EA2, 0xB1A1, 0xB1FE, 0x1D4C,\n    0x8EA2, 0xB2A1, 0xB2FE, 0x1DAA, 0x8EA2, 0xB3A1, 0xB3FE, 0x1E08,\n    0x8EA2, 0xB4A1, 0xB4FE, 0x1E66, 0x8EA2, 0xB5A1, 0xB5FE, 0x1EC4,\n    0x8EA2, 0xB6A1, 0xB6FE, 0x1F22, 0x8EA2, 0xB7A1, 0xB7FE, 0x1F80,\n    0x8EA2, 0xB8A1, 0xB8FE, 0x1FDE, 0x8EA2, 0xB9A1, 0xB9FE, 0x203C,\n    0x8EA2, 0xBAA1, 0xBAFE, 0x209A, 0x8EA2, 0xBBA1, 0xBBFE, 0x20F8,\n    0x8EA2, 0xBCA1, 0xBCFE, 0x2156, 0x8EA2, 0xBDA1, 0xBDFE, 0x21B4,\n    0x8EA2, 0xBEA1, 0xBEFE, 0x2212, 0x8EA2, 0xBFA1, 0xBFFE, 0x2270,\n    0x8EA2, 0xC0A1, 0xC0FE, 0x22CE, 0x8EA2, 0xC1A1, 0xC1FE, 0x232C,\n    0x8EA2, 0xC2A1, 0xC2FE, 0x238A, 0x8EA2, 0xC3A1, 0xC3FE, 0x23E8,\n    0x8EA2, 0xC4A1, 0xC4FE, 0x2446, 0x8EA2, 0xC5A1, 0xC5FE, 0x24A4,\n    0x8EA2, 0xC6A1, 0xC6FE, 0x2502, 0x8EA2, 0xC7A1, 0xC7FE, 0x2560,\n    0x8EA2, 0xC8A1, 0xC8FE, 0x25BE, 0x8EA2, 0xC9A1, 0xC9FE, 0x261C,\n    0x8EA2, 0xCAA1, 0xCAFE, 0x267A, 0x8EA2, 0xCBA1, 0xCBFE, 0x26D8,\n    0x8EA2, 0xCCA1, 0xCCFE, 0x2736, 0x8EA2, 0xCDA1, 0xCDFE, 0x2794,\n    0x8EA2, 0xCEA1, 0xCEFE, 0x27F2, 0x8EA2, 0xCFA1, 0xCFFE, 0x2850,\n    0x8EA2, 0xD0A1, 0xD0FE, 0x28AE, 0x8EA2, 0xD1A1, 0xD1FE, 0x290C,\n    0x8EA2, 0xD2A1, 0xD2FE, 0x296A, 0x8EA2, 0xD3A1, 0xD3FE, 0x29C8,\n    0x8EA2, 0xD4A1, 0xD4FE, 0x2A26, 0x8EA2, 0xD5A1, 0xD5FE, 0x2A84,\n    0x8EA2, 0xD6A1, 0xD6FE, 0x2AE2, 0x8EA2, 0xD7A1, 0xD7FE, 0x2B40,\n    0x8EA2, 0xD8A1, 0xD8FE, 0x2B9E, 0x8EA2, 0xD9A1, 0xD9FE, 0x2BFC,\n    0x8EA2, 0xDAA1, 0xDAFE, 0x2C5A, 0x8EA2, 0xDBA1, 0xDBFE, 0x2CB8,\n    0x8EA2, 0xDCA1, 0xDCFE, 0x2D16, 0x8EA2, 0xDDA1, 0xDDFE, 0x2D74,\n    0x8EA2, 0xDEA1, 0xDEFE, 0x2DD2, 0x8EA2, 0xDFA1, 0xDFFE, 0x2E30,\n    0x8EA2, 0xE0A1, 0xE0FE, 0x2E8E, 0x8EA2, 0xE1A1, 0xE1FE, 0x2EEC,\n    0x8EA2, 0xE2A1, 0xE2FE, 0x2F4A, 0x8EA2, 0xE3A1, 0xE3FE, 0x2FA8,\n    0x8EA2, 0xE4A1, 0xE4FE, 0x3006, 0x8EA2, 0xE5A1, 0xE5FE, 0x3064,\n    0x8EA2, 0xE6A1, 0xE6FE, 0x30C2, 0x8EA2, 0xE7A1, 0xE7FE, 0x3120,\n    0x8EA2, 0xE8A1, 0xE8FE, 0x317E, 0x8EA2, 0xE9A1, 0xE9FE, 0x31DC,\n    0x8EA2, 0xEAA1, 0xEAFE, 0x323A, 0x8EA2, 0xEBA1, 0xEBFE, 0x3298,\n    0x8EA2, 0xECA1, 0xECFE, 0x32F6, 0x8EA2, 0xEDA1, 0xEDFE, 0x3354,\n    0x8EA2, 0xEEA1, 0xEEFE, 0x33B2, 0x8EA2, 0xEFA1, 0xEFFE, 0x3410,\n    0x8EA2, 0xF0A1, 0xF0FE, 0x346E, 0x8EA2, 0xF1A1, 0xF1FE, 0x34CC,\n    0x8EA2, 0xF2A1, 0xF2C4, 0x352A,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-H_0.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_ETen_B5_H_0[254 * 3] = {\n    0x0020, 0x007E, 0x3550, 0xA140, 0xA158, 0x0063, 0xA159, 0xA15C, 0x35AF,\n    0xA15D, 0xA17E, 0x0080, 0xA1A1, 0xA1F5, 0x00A2, 0xA1F6, 0xA1F6, 0x00F8,\n    0xA1F7, 0xA1F7, 0x00F7, 0xA1F8, 0xA1FE, 0x00F9, 0xA240, 0xA27E, 0x0100,\n    0xA2A1, 0xA2FE, 0x013F, 0xA340, 0xA37E, 0x019D, 0xA3A1, 0xA3BB, 0x01DC,\n    0xA3BD, 0xA3BF, 0x01F7, 0xA440, 0xA47E, 0x0253, 0xA4A1, 0xA4FE, 0x0292,\n    0xA540, 0xA57E, 0x02F0, 0xA5A1, 0xA5FE, 0x032F, 0xA640, 0xA67E, 0x038D,\n    0xA6A1, 0xA6FE, 0x03CC, 0xA740, 0xA77E, 0x042A, 0xA7A1, 0xA7FE, 0x0469,\n    0xA840, 0xA87E, 0x04C7, 0xA8A1, 0xA8FE, 0x0506, 0xA940, 0xA97E, 0x0564,\n    0xA9A1, 0xA9FE, 0x05A3, 0xAA40, 0xAA7E, 0x0601, 0xAAA1, 0xAAFE, 0x0640,\n    0xAB40, 0xAB7E, 0x069E, 0xABA1, 0xABFE, 0x06DD, 0xAC40, 0xAC7E, 0x073B,\n    0xACA1, 0xACFD, 0x077A, 0xACFE, 0xACFE, 0x097F, 0xAD40, 0xAD7E, 0x07D7,\n    0xADA1, 0xADFE, 0x0816, 0xAE40, 0xAE7E, 0x0874, 0xAEA1, 0xAEFE, 0x08B3,\n    0xAF40, 0xAF7E, 0x0911, 0xAFA1, 0xAFCF, 0x0950, 0xAFD0, 0xAFFE, 0x0980,\n    0xB040, 0xB07E, 0x09AF, 0xB0A1, 0xB0FE, 0x09EE, 0xB140, 0xB17E, 0x0A4C,\n    0xB1A1, 0xB1FE, 0x0A8B, 0xB240, 0xB27E, 0x0AE9, 0xB2A1, 0xB2FE, 0x0B28,\n    0xB340, 0xB37E, 0x0B86, 0xB3A1, 0xB3FE, 0x0BC5, 0xB440, 0xB47E, 0x0C23,\n    0xB4A1, 0xB4FE, 0x0C62, 0xB540, 0xB57E, 0x0CC0, 0xB5A1, 0xB5FE, 0x0CFF,\n    0xB640, 0xB67E, 0x0D5D, 0xB6A1, 0xB6FE, 0x0D9C, 0xB740, 0xB77E, 0x0DFA,\n    0xB7A1, 0xB7FE, 0x0E39, 0xB840, 0xB87E, 0x0E97, 0xB8A1, 0xB8FE, 0x0ED6,\n    0xB940, 0xB97E, 0x0F34, 0xB9A1, 0xB9FE, 0x0F73, 0xBA40, 0xBA7E, 0x0FD1,\n    0xBAA1, 0xBAFE, 0x1010, 0xBB40, 0xBB7E, 0x106E, 0xBBA1, 0xBBC7, 0x10AD,\n    0xBBC8, 0xBBFE, 0x10D5, 0xBC40, 0xBC7E, 0x110C, 0xBCA1, 0xBCFE, 0x114B,\n    0xBD40, 0xBD7E, 0x11A9, 0xBDA1, 0xBDFE, 0x11E8, 0xBE40, 0xBE51, 0x1246,\n    0xBE52, 0xBE52, 0x10D4, 0xBE53, 0xBE7E, 0x1258, 0xBEA1, 0xBEFE, 0x1284,\n    0xBF40, 0xBF7E, 0x12E2, 0xBFA1, 0xBFFE, 0x1321, 0xC040, 0xC07E, 0x137F,\n    0xC0A1, 0xC0FE, 0x13BE, 0xC140, 0xC17E, 0x141C, 0xC1A1, 0xC1AA, 0x145B,\n    0xC1AB, 0xC1FE, 0x1466, 0xC240, 0xC27E, 0x14BA, 0xC2A1, 0xC2CA, 0x14F9,\n    0xC2CB, 0xC2CB, 0x1465, 0xC2CC, 0xC2FE, 0x1523, 0xC340, 0xC360, 0x1556,\n    0xC361, 0xC37E, 0x1578, 0xC3A1, 0xC3B8, 0x1596, 0xC3B9, 0xC3B9, 0x15AF,\n    0xC3BA, 0xC3BA, 0x15AE, 0xC3BB, 0xC3FE, 0x15B0, 0xC440, 0xC455, 0x15F4,\n    0xC456, 0xC456, 0x1577, 0xC457, 0xC47E, 0x160A, 0xC4A1, 0xC4FE, 0x1632,\n    0xC540, 0xC57E, 0x1690, 0xC5A1, 0xC5FE, 0x16CF, 0xC640, 0xC67E, 0x172D,\n    0xC6A1, 0xC6BE, 0x01FA, 0xC6BF, 0xC6D7, 0x0219, 0xC6D8, 0xC6DE, 0x35B3,\n    0xC6DF, 0xC6DF, 0x1794, 0xC6E0, 0xC6FE, 0x35BA, 0xC740, 0xC77E, 0x35D9,\n    0xC7A1, 0xC7FE, 0x3618, 0xC840, 0xC87E, 0x3676, 0xC8A1, 0xC8D3, 0x36B5,\n    0xC940, 0xC949, 0x176C, 0xC94A, 0xC94A, 0x0274, 0xC94B, 0xC96B, 0x1776,\n    0xC96C, 0xC97E, 0x1798, 0xC9A1, 0xC9BD, 0x17AB, 0xC9BE, 0xC9BE, 0x1797,\n    0xC9BF, 0xC9EC, 0x17C8, 0xC9ED, 0xC9FE, 0x17F7, 0xCA40, 0xCA7E, 0x1809,\n    0xCAA1, 0xCAF6, 0x1848, 0xCAF7, 0xCAF7, 0x17F6, 0xCAF8, 0xCAFE, 0x189E,\n    0xCB40, 0xCB7E, 0x18A5, 0xCBA1, 0xCBFE, 0x18E4, 0xCC40, 0xCC7E, 0x1942,\n    0xCCA1, 0xCCFE, 0x1981, 0xCD40, 0xCD7E, 0x19DF, 0xCDA1, 0xCDFE, 0x1A1E,\n    0xCE40, 0xCE7E, 0x1A7C, 0xCEA1, 0xCEFE, 0x1ABB, 0xCF40, 0xCF7E, 0x1B19,\n    0xCFA1, 0xCFFE, 0x1B58, 0xD040, 0xD07E, 0x1BB6, 0xD0A1, 0xD0FE, 0x1BF5,\n    0xD140, 0xD17E, 0x1C53, 0xD1A1, 0xD1FE, 0x1C92, 0xD240, 0xD27E, 0x1CF0,\n    0xD2A1, 0xD2FE, 0x1D2F, 0xD340, 0xD37E, 0x1D8D, 0xD3A1, 0xD3FE, 0x1DCC,\n    0xD440, 0xD47E, 0x1E2A, 0xD4A1, 0xD4FE, 0x1E69, 0xD540, 0xD57E, 0x1EC7,\n    0xD5A1, 0xD5FE, 0x1F06, 0xD640, 0xD67E, 0x1F64, 0xD6A1, 0xD6CB, 0x1FA3,\n    0xD6CC, 0xD6CC, 0x2254, 0xD6CD, 0xD6FE, 0x1FCF, 0xD740, 0xD779, 0x2001,\n    0xD77A, 0xD77A, 0x22B9, 0xD77B, 0xD77E, 0x203B, 0xD7A1, 0xD7FE, 0x203F,\n    0xD840, 0xD87E, 0x209D, 0xD8A1, 0xD8FE, 0x20DC, 0xD940, 0xD97E, 0x213A,\n    0xD9A1, 0xD9FE, 0x2179, 0xDA40, 0xDA7E, 0x21D7, 0xDAA1, 0xDADE, 0x2216,\n    0xDADF, 0xDADF, 0x1FCE, 0xDAE0, 0xDAFE, 0x2255, 0xDB40, 0xDB7E, 0x2274,\n    0xDBA1, 0xDBA6, 0x22B3, 0xDBA7, 0xDBFE, 0x22BA, 0xDC40, 0xDC7E, 0x2312,\n    0xDCA1, 0xDCFE, 0x2351, 0xDD40, 0xDD7E, 0x23AF, 0xDDA1, 0xDDFB, 0x23EE,\n    0xDDFC, 0xDDFC, 0x2381, 0xDDFD, 0xDDFE, 0x2449, 0xDE40, 0xDE7E, 0x244B,\n    0xDEA1, 0xDEFE, 0x248A, 0xDF40, 0xDF7E, 0x24E8, 0xDFA1, 0xDFFE, 0x2527,\n    0xE040, 0xE07E, 0x2585, 0xE0A1, 0xE0FE, 0x25C4, 0xE140, 0xE17E, 0x2622,\n    0xE1A1, 0xE1FE, 0x2661, 0xE240, 0xE27E, 0x26BF, 0xE2A1, 0xE2FE, 0x26FE,\n    0xE340, 0xE37E, 0x275C, 0xE3A1, 0xE3FE, 0x279B, 0xE440, 0xE47E, 0x27F9,\n    0xE4A1, 0xE4FE, 0x2838, 0xE540, 0xE57E, 0x2896, 0xE5A1, 0xE5FE, 0x28D5,\n    0xE640, 0xE67E, 0x2933, 0xE6A1, 0xE6FE, 0x2972, 0xE740, 0xE77E, 0x29D0,\n    0xE7A1, 0xE7FE, 0x2A0F, 0xE840, 0xE87E, 0x2A6D, 0xE8A1, 0xE8A2, 0x2AAC,\n    0xE8A3, 0xE8FE, 0x2AAF, 0xE940, 0xE975, 0x2B0B, 0xE976, 0xE97E, 0x2B42,\n    0xE9A1, 0xE9FE, 0x2B4B, 0xEA40, 0xEA7E, 0x2BA9, 0xEAA1, 0xEAFE, 0x2BE8,\n    0xEB40, 0xEB5A, 0x2C46, 0xEB5B, 0xEB7E, 0x2C62, 0xEBA1, 0xEBF0, 0x2C86,\n    0xEBF1, 0xEBF1, 0x2AAE, 0xEBF2, 0xEBFE, 0x2CD6, 0xEC40, 0xEC7E, 0x2CE3,\n    0xECA1, 0xECDD, 0x2D22, 0xECDE, 0xECDE, 0x2B41, 0xECDF, 0xECFE, 0x2D5F,\n    0xED40, 0xED7E, 0x2D7F, 0xEDA1, 0xEDA9, 0x2DBE, 0xEDAA, 0xEDFE, 0x2DC8,\n    0xEE40, 0xEE7E, 0x2E1D, 0xEEA1, 0xEEEA, 0x2E5C, 0xEEEB, 0xEEEB, 0x3014,\n    0xEEEC, 0xEEFE, 0x2EA6, 0xEF40, 0xEF7E, 0x2EB9, 0xEFA1, 0xEFFE, 0x2EF8,\n    0xF040, 0xF055, 0x2F56, 0xF056, 0xF056, 0x2DC7, 0xF057, 0xF07E, 0x2F6C,\n    0xF0A1, 0xF0CA, 0x2F94, 0xF0CB, 0xF0CB, 0x2C61, 0xF0CC, 0xF0FE, 0x2FBE,\n    0xF140, 0xF162, 0x2FF1, 0xF163, 0xF16A, 0x3015, 0xF16B, 0xF16B, 0x3160,\n    0xF16C, 0xF17E, 0x301D, 0xF1A1, 0xF1FE, 0x3030, 0xF240, 0xF267, 0x308E,\n    0xF268, 0xF268, 0x31EF, 0xF269, 0xF27E, 0x30B6, 0xF2A1, 0xF2C2, 0x30CC,\n    0xF2C3, 0xF2FE, 0x30EF, 0xF340, 0xF374, 0x312B, 0xF375, 0xF37E, 0x3161,\n    0xF3A1, 0xF3FE, 0x316B, 0xF440, 0xF465, 0x31C9, 0xF466, 0xF47E, 0x31F0,\n    0xF4A1, 0xF4B4, 0x3209, 0xF4B5, 0xF4B5, 0x30EE, 0xF4B6, 0xF4FC, 0x321D,\n    0xF4FD, 0xF4FE, 0x3265, 0xF540, 0xF57E, 0x3267, 0xF5A1, 0xF5FE, 0x32A6,\n    0xF640, 0xF662, 0x3304, 0xF663, 0xF663, 0x3264, 0xF664, 0xF67E, 0x3327,\n    0xF6A1, 0xF6FE, 0x3342, 0xF740, 0xF77E, 0x33A0, 0xF7A1, 0xF7FE, 0x33DF,\n    0xF840, 0xF87E, 0x343D, 0xF8A1, 0xF8FE, 0x347C, 0xF940, 0xF976, 0x34DA,\n    0xF977, 0xF97E, 0x3512, 0xF9A1, 0xF9C3, 0x351A, 0xF9C4, 0xF9C4, 0x3511,\n    0xF9C5, 0xF9C5, 0x353D, 0xF9C6, 0xF9C6, 0x3549, 0xF9C7, 0xF9D1, 0x353E,\n    0xF9D2, 0xF9D5, 0x354A, 0xF9D6, 0xF9FE, 0x36E8,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-V_0.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_ETen_B5_V_0[13 * 3] = {\n    0xA14B, 0xA14B, 0x354E, 0xA15A, 0xA15A, 0x35AF, 0xA15C, 0xA15C, 0x35B1,\n    0xA15D, 0xA15E, 0x0082, 0xA161, 0xA162, 0x0086, 0xA165, 0xA166, 0x008A,\n    0xA169, 0xA16A, 0x008E, 0xA16D, 0xA16E, 0x0092, 0xA171, 0xA172, 0x0096,\n    0xA175, 0xA176, 0x009A, 0xA179, 0xA17A, 0x009E, 0xA1E3, 0xA1E3, 0x354F,\n    0xC6E4, 0xC6E5, 0x3711,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-H_0.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_ETenms_B5_H_0[1 * 3] = {\n    0x0020, 0x007E, 0x0001,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-V_0.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_ETenms_B5_V_0[18 * 3] = {\n    0xA14B, 0xA14B, 0x354E, 0xA14C, 0xA14C, 0x006D, 0xA156, 0xA156, 0x0138,\n    0xA158, 0xA158, 0x007A, 0xA15A, 0xA15A, 0x35AF, 0xA15C, 0xA15C, 0x35B1,\n    0xA15D, 0xA15E, 0x0082, 0xA161, 0xA162, 0x0086, 0xA165, 0xA166, 0x008A,\n    0xA169, 0xA16A, 0x008E, 0xA16D, 0xA16E, 0x0092, 0xA171, 0xA172, 0x0096,\n    0xA175, 0xA176, 0x009A, 0xA179, 0xA17A, 0x009E, 0xA17D, 0xA17E, 0x0082,\n    0xA1A1, 0xA1A2, 0x0086, 0xA1A3, 0xA1A4, 0x008A, 0xC6E4, 0xC6E5, 0x3711,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/CNS1/HKscs-B5-H_5.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_HKscs_B5_H_5[1210 * 3] = {\n    0x0020, 0x007E, 0x0001, 0x8740, 0x8765, 0x4A15, 0x8767, 0x8779, 0x4A3B,\n    0x8840, 0x8855, 0x44C9, 0x8856, 0x887E, 0x4961, 0x88A1, 0x88A8, 0x498A,\n    0x88A9, 0x88AA, 0x499C, 0x8940, 0x8941, 0x4534, 0x8943, 0x8943, 0x4536,\n    0x8946, 0x8949, 0x4537, 0x894C, 0x894C, 0x453B, 0x894D, 0x894D, 0x43C3,\n    0x894E, 0x8950, 0x453C, 0x8951, 0x8951, 0x439A, 0x8952, 0x897E, 0x453F,\n    0x89A1, 0x89A5, 0x456C, 0x89A6, 0x89A6, 0x43A2, 0x89AB, 0x89AB, 0x43EC,\n    0x89AC, 0x89AC, 0x4571, 0x89AD, 0x89AD, 0x43EB, 0x89AE, 0x89AE, 0x4572,\n    0x89B0, 0x89B2, 0x4573, 0x89B5, 0x89BF, 0x4576, 0x89C1, 0x89C3, 0x4581,\n    0x89C5, 0x89CE, 0x4584, 0x89CF, 0x89CF, 0x43BC, 0x89D0, 0x89D8, 0x458E,\n    0x89D9, 0x89D9, 0x439C, 0x89DA, 0x89DA, 0x4597, 0x89DB, 0x89DB, 0x439E,\n    0x89DC, 0x89DC, 0x4598, 0x89DD, 0x89DD, 0x439F, 0x89DE, 0x89E0, 0x4599,\n    0x89E1, 0x89E1, 0x43A1, 0x89E2, 0x89E2, 0x459C, 0x89E3, 0x89E3, 0x43A3,\n    0x89E4, 0x89E9, 0x459D, 0x89EA, 0x89EB, 0x43A5, 0x89EC, 0x89F9, 0x45A3,\n    0x89FA, 0x89FA, 0x43A9, 0x89FB, 0x89FE, 0x45B1, 0x8A40, 0x8A40, 0x45B5,\n    0x8A41, 0x8A41, 0x4309, 0x8A43, 0x8A4C, 0x430B, 0x8A4D, 0x8A4D, 0x45B6,\n    0x8A4E, 0x8A59, 0x4316, 0x8A5A, 0x8A5A, 0x45B7, 0x8A5B, 0x8A5D, 0x4323,\n    0x8A5E, 0x8A5E, 0x45B8, 0x8A5F, 0x8A62, 0x4327, 0x8A64, 0x8A70, 0x432C,\n    0x8A71, 0x8A71, 0x45B9, 0x8A72, 0x8A74, 0x433A, 0x8A76, 0x8A76, 0x433E,\n    0x8A77, 0x8A77, 0x45BA, 0x8A78, 0x8A79, 0x4340, 0x8A7A, 0x8A7A, 0x45BB,\n    0x8A7B, 0x8A7B, 0x4343, 0x8A7C, 0x8A7C, 0x45BC, 0x8A7D, 0x8A7D, 0x4345,\n    0x8A7E, 0x8A7E, 0x45BD, 0x8AA1, 0x8AA7, 0x4347, 0x8AA8, 0x8AA8, 0x45BE,\n    0x8AA9, 0x8AAA, 0x434F, 0x8AAC, 0x8AB0, 0x4352, 0x8AB2, 0x8AB5, 0x4358,\n    0x8AB6, 0x8AB6, 0x45BF, 0x8AB7, 0x8AB7, 0x435D, 0x8AB8, 0x8AB8, 0x45C0,\n    0x8AB9, 0x8AB9, 0x435F, 0x8ABB, 0x8AC7, 0x4361, 0x8AC9, 0x8ACB, 0x436F,\n    0x8ACC, 0x8ACC, 0x45C1, 0x8ACE, 0x8AD5, 0x4374, 0x8AD6, 0x8AD7, 0x45C2,\n    0x8AD8, 0x8ADC, 0x437E, 0x8ADF, 0x8AE5, 0x4385, 0x8AE6, 0x8AE6, 0x45C4,\n    0x8AE7, 0x8AE7, 0x43DB, 0x8AE8, 0x8AF4, 0x45C5, 0x8AF6, 0x8AFE, 0x45D2,\n    0x8B40, 0x8B40, 0x45DB, 0x8B41, 0x8B42, 0x438C, 0x8B43, 0x8B44, 0x45DC,\n    0x8B45, 0x8B45, 0x438E, 0x8B46, 0x8B46, 0x45DE, 0x8B47, 0x8B47, 0x438F,\n    0x8B48, 0x8B48, 0x45DF, 0x8B49, 0x8B49, 0x4390, 0x8B4A, 0x8B4A, 0x45E0,\n    0x8B4B, 0x8B4B, 0x4391, 0x8B4C, 0x8B4C, 0x45E1, 0x8B4D, 0x8B50, 0x4392,\n    0x8B51, 0x8B53, 0x45E2, 0x8B55, 0x8B57, 0x45E5, 0x8B58, 0x8B58, 0x4397,\n    0x8B59, 0x8B59, 0x45E8, 0x8B5A, 0x8B5A, 0x4398, 0x8B5B, 0x8B5B, 0x43C4,\n    0x8B5C, 0x8B60, 0x45E9, 0x8B61, 0x8B61, 0x43A7, 0x8B62, 0x8B67, 0x45EE,\n    0x8B68, 0x8B68, 0x43AC, 0x8B69, 0x8B7E, 0x45F4, 0x8BA1, 0x8BBF, 0x460A,\n    0x8BC0, 0x8BDC, 0x44DF, 0x8BDE, 0x8BFD, 0x44FC, 0x8C40, 0x8C61, 0x49A1,\n    0x8C62, 0x8C62, 0x4A4E, 0x8C63, 0x8C7E, 0x49C3, 0x8CA1, 0x8CA5, 0x49DF,\n    0x8CA7, 0x8CC5, 0x49E4, 0x8CC9, 0x8CCC, 0x4A03, 0x8CCE, 0x8CDA, 0x4A07,\n    0x8CDB, 0x8CDB, 0x4A4F, 0x8CDC, 0x8CDC, 0x4A14, 0x8CDD, 0x8CE4, 0x4A50,\n    0x8CE6, 0x8CFE, 0x4A58, 0x8D40, 0x8D40, 0x4A71, 0x8D42, 0x8D5F, 0x4A72,\n    0x8D60, 0x8D61, 0x4629, 0x8D62, 0x8D62, 0x43BA, 0x8D63, 0x8D67, 0x462B,\n    0x8D68, 0x8D68, 0x43BB, 0x8D69, 0x8D69, 0x43A0, 0x8D6A, 0x8D6A, 0x43BD,\n    0x8D6B, 0x8D6D, 0x4630, 0x8D6E, 0x8D6E, 0x43BE, 0x8D6F, 0x8D75, 0x4633,\n    0x8D76, 0x8D76, 0x43BF, 0x8D77, 0x8D79, 0x463A, 0x8D7A, 0x8D7A, 0x43C0,\n    0x8D7B, 0x8D7B, 0x463D, 0x8D7C, 0x8D7C, 0x43C1, 0x8D7D, 0x8D7E, 0x463E,\n    0x8DA1, 0x8DA4, 0x4640, 0x8DA5, 0x8DA5, 0x43C2, 0x8DA6, 0x8DA7, 0x4644,\n    0x8DA8, 0x8DA8, 0x43B9, 0x8DA9, 0x8DA9, 0x43AD, 0x8DAA, 0x8DB5, 0x4646,\n    0x8DB6, 0x8DB6, 0x43C7, 0x8DB7, 0x8DC2, 0x4652, 0x8DC3, 0x8DC3, 0x43C8,\n    0x8DC4, 0x8DF9, 0x465E, 0x8DFA, 0x8DFA, 0x43F9, 0x8DFB, 0x8DFE, 0x4694,\n    0x8E40, 0x8E44, 0x372B, 0x8E45, 0x8E45, 0x4698, 0x8E46, 0x8E68, 0x3730,\n    0x8E69, 0x8E69, 0x1055, 0x8E6A, 0x8E6A, 0x3754, 0x8E6B, 0x8E6C, 0x4699,\n    0x8E6D, 0x8E6E, 0x3756, 0x8E6F, 0x8E6F, 0x2DE8, 0x8E70, 0x8E75, 0x3759,\n    0x8E76, 0x8E76, 0x469B, 0x8E77, 0x8E7A, 0x375F, 0x8E7B, 0x8E7B, 0x469C,\n    0x8E7C, 0x8E7D, 0x3764, 0x8E7E, 0x8E7E, 0x0121, 0x8EA1, 0x8EA5, 0x3766,\n    0x8EA6, 0x8EA6, 0x469D, 0x8EA7, 0x8EAA, 0x376B, 0x8EAB, 0x8EAB, 0x106B,\n    0x8EAC, 0x8EB3, 0x3770, 0x8EB4, 0x8EB4, 0x1326, 0x8EB5, 0x8EB7, 0x3779,\n    0x8EB8, 0x8EB8, 0x469E, 0x8EB9, 0x8EC8, 0x377D, 0x8EC9, 0x8EC9, 0x469F,\n    0x8ECA, 0x8ECC, 0x378D, 0x8ECD, 0x8ECD, 0x066B, 0x8ECE, 0x8ECF, 0x3791,\n    0x8ED0, 0x8ED0, 0x132E, 0x8ED1, 0x8EE4, 0x3794, 0x8EE5, 0x8EE5, 0x46A0,\n    0x8EE6, 0x8EEE, 0x37A8, 0x8EEF, 0x8EEF, 0x46A1, 0x8EF0, 0x8EF5, 0x37B1,\n    0x8EF6, 0x8EF6, 0x46A2, 0x8EF7, 0x8EFE, 0x37B8, 0x8F40, 0x8F56, 0x37C0,\n    0x8F57, 0x8F57, 0x0D35, 0x8F58, 0x8F58, 0x37D8, 0x8F59, 0x8F59, 0x46A3,\n    0x8F5A, 0x8F5E, 0x37D9, 0x8F5F, 0x8F5F, 0x46A4, 0x8F60, 0x8F66, 0x37DE,\n    0x8F67, 0x8F67, 0x46A5, 0x8F68, 0x8F68, 0x37E5, 0x8F69, 0x8F69, 0x27C2,\n    0x8F6A, 0x8F6D, 0x37E7, 0x8F6E, 0x8F6E, 0x22AD, 0x8F6F, 0x8F78, 0x37EC,\n    0x8F79, 0x8F79, 0x46A6, 0x8F7A, 0x8F7E, 0x37F7, 0x8FA1, 0x8FAF, 0x37FC,\n    0x8FB0, 0x8FB0, 0x46A7, 0x8FB1, 0x8FC4, 0x380C, 0x8FC5, 0x8FC5, 0x46A8,\n    0x8FC6, 0x8FC6, 0x3820, 0x8FC7, 0x8FC7, 0x46A9, 0x8FC8, 0x8FC9, 0x3821,\n    0x8FCA, 0x8FCA, 0x46AA, 0x8FCB, 0x8FCB, 0x134C, 0x8FCC, 0x8FCC, 0x3FF9,\n    0x8FCD, 0x8FD9, 0x3826, 0x8FDA, 0x8FDA, 0x46AB, 0x8FDB, 0x8FE2, 0x3833,\n    0x8FE3, 0x8FE3, 0x46AC, 0x8FE4, 0x8FFB, 0x383C, 0x8FFC, 0x8FFC, 0x46AD,\n    0x8FFD, 0x8FFD, 0x3854, 0x8FFE, 0x8FFE, 0x09CE, 0x9040, 0x9054, 0x3856,\n    0x9055, 0x9055, 0x46AE, 0x9056, 0x905B, 0x386C, 0x905C, 0x905E, 0x46AF,\n    0x905F, 0x906C, 0x3873, 0x906D, 0x906D, 0x0BC7, 0x906E, 0x906E, 0x3882,\n    0x906F, 0x906F, 0x46B2, 0x9070, 0x9079, 0x3883, 0x907A, 0x907A, 0x36E9,\n    0x907B, 0x907E, 0x388D, 0x90A1, 0x90A5, 0x3891, 0x90A6, 0x90A6, 0x46B3,\n    0x90A7, 0x90B7, 0x3896, 0x90B8, 0x90B8, 0x46B4, 0x90B9, 0x90DB, 0x38A7,\n    0x90DC, 0x90DC, 0x1391, 0x90DD, 0x90F0, 0x38CB, 0x90F1, 0x90F1, 0x16A4,\n    0x90F2, 0x90FE, 0x38E0, 0x9140, 0x9164, 0x38ED, 0x9165, 0x9165, 0x46B5,\n    0x9166, 0x916D, 0x3912, 0x916E, 0x916E, 0x46B6, 0x916F, 0x917D, 0x391A,\n    0x917E, 0x917E, 0x46B7, 0x91A1, 0x91A1, 0x3929, 0x91A2, 0x91A2, 0x46B8,\n    0x91A3, 0x91BE, 0x392A, 0x91BF, 0x91BF, 0x3072, 0x91C0, 0x91C7, 0x3947,\n    0x91C8, 0x91C8, 0x46B9, 0x91C9, 0x91FE, 0x3950, 0x9240, 0x9243, 0x3986,\n    0x9244, 0x9244, 0x3988, 0x9245, 0x9263, 0x398B, 0x9264, 0x9264, 0x46BA,\n    0x9265, 0x926C, 0x39AB, 0x926D, 0x926D, 0x46BB, 0x926E, 0x927E, 0x39B4,\n    0x92A1, 0x92AE, 0x39C5, 0x92AF, 0x92B0, 0x0119, 0x92B1, 0x92B1, 0x011C,\n    0x92B2, 0x92B2, 0x011B, 0x92B3, 0x92C7, 0x39D3, 0x92C8, 0x92C8, 0x3FAC,\n    0x92C9, 0x92D0, 0x39E9, 0x92D1, 0x92D1, 0x297C, 0x92D2, 0x92E4, 0x39F2,\n    0x92E5, 0x92E5, 0x46BC, 0x92E6, 0x92F1, 0x3A05, 0x92F2, 0x92F2, 0x46BD,\n    0x92F3, 0x92FE, 0x3A11, 0x9340, 0x9367, 0x3A1D, 0x9368, 0x9368, 0x46BE,\n    0x9369, 0x937E, 0x3A45, 0x93A1, 0x93A9, 0x3A5B, 0x93AA, 0x93AA, 0x46BF,\n    0x93AB, 0x93C1, 0x3A64, 0x93C2, 0x93C2, 0x46C0, 0x93C3, 0x93E4, 0x3A7B,\n    0x93E5, 0x93E5, 0x46C1, 0x93E6, 0x93E7, 0x3A9D, 0x93E8, 0x93E8, 0x46C2,\n    0x93E9, 0x93EA, 0x3AA0, 0x93EB, 0x93EB, 0x46C3, 0x93EC, 0x93FE, 0x3AA2,\n    0x9440, 0x9445, 0x3AB5, 0x9446, 0x9446, 0x46C4, 0x9447, 0x9447, 0x1D06,\n    0x9448, 0x9478, 0x3ABC, 0x9479, 0x9479, 0x46C5, 0x947A, 0x947E, 0x3AEE,\n    0x94A1, 0x94C9, 0x3AF3, 0x94CA, 0x94CA, 0x29A1, 0x94CB, 0x94CB, 0x46C6,\n    0x94CC, 0x94FE, 0x3B1E, 0x9540, 0x954C, 0x3B51, 0x954D, 0x954D, 0x46C7,\n    0x954E, 0x9559, 0x3B5E, 0x955A, 0x955A, 0x46C8, 0x955B, 0x955E, 0x3B6A,\n    0x955F, 0x955F, 0x46C9, 0x9560, 0x957E, 0x3B6F, 0x95A1, 0x95C5, 0x3B8E,\n    0x95C6, 0x95C6, 0x46CA, 0x95C7, 0x95D8, 0x3BB3, 0x95D9, 0x95D9, 0x181B,\n    0x95DA, 0x95FE, 0x3BC6, 0x9640, 0x9643, 0x3BEB, 0x9644, 0x9644, 0x3E2F,\n    0x9645, 0x9650, 0x3BF0, 0x9651, 0x9651, 0x46CB, 0x9652, 0x9669, 0x3BFD,\n    0x966A, 0x966A, 0x46CC, 0x966B, 0x967E, 0x3C16, 0x96A1, 0x96D3, 0x3C2A,\n    0x96D4, 0x96D4, 0x46CD, 0x96D5, 0x96EC, 0x3C5D, 0x96ED, 0x96ED, 0x3C76,\n    0x96EE, 0x96FB, 0x3C76, 0x96FC, 0x96FC, 0x2B24, 0x96FD, 0x96FE, 0x3C85,\n    0x9740, 0x977E, 0x3C87, 0x97A1, 0x97FE, 0x3CC6, 0x9840, 0x9843, 0x3D24,\n    0x9844, 0x9845, 0x46CE, 0x9846, 0x986E, 0x3D2A, 0x986F, 0x986F, 0x46D0,\n    0x9870, 0x9874, 0x3D54, 0x9875, 0x9876, 0x46D1, 0x9877, 0x9877, 0x3D59,\n    0x9878, 0x9879, 0x46D3, 0x987A, 0x987A, 0x3D5A, 0x987B, 0x987E, 0x46D5,\n    0x98A1, 0x98A2, 0x46D9, 0x98A3, 0x98A3, 0x3D5B, 0x98A4, 0x98AE, 0x46DB,\n    0x98AF, 0x98AF, 0x3D5C, 0x98B0, 0x98B3, 0x46E6, 0x98B4, 0x98B4, 0x43CA,\n    0x98B5, 0x98B5, 0x46EA, 0x98B6, 0x98B6, 0x3D5D, 0x98B7, 0x98B7, 0x46EB,\n    0x98B8, 0x98B8, 0x43CC, 0x98B9, 0x98B9, 0x3D5E, 0x98BA, 0x98BA, 0x46EC,\n    0x98BB, 0x98BB, 0x43FA, 0x98BC, 0x98BC, 0x46ED, 0x98BD, 0x98BE, 0x3D5F,\n    0x98BF, 0x98C1, 0x46EE, 0x98C2, 0x98C2, 0x3D61, 0x98C3, 0x98C3, 0x46F1,\n    0x98C4, 0x98C4, 0x3D62, 0x98C5, 0x98C5, 0x46F2, 0x98C6, 0x98C7, 0x3D63,\n    0x98C8, 0x98D1, 0x46F3, 0x98D2, 0x98D2, 0x43CD, 0x98D3, 0x98D7, 0x46FD,\n    0x98D8, 0x98D9, 0x43CE, 0x98DA, 0x98DA, 0x4702, 0x98DB, 0x98DB, 0x43D1,\n    0x98DC, 0x98DE, 0x4703, 0x98DF, 0x98DF, 0x43D4, 0x98E0, 0x98E2, 0x4706,\n    0x98E3, 0x98E3, 0x3D65, 0x98E4, 0x98E6, 0x4709, 0x98E7, 0x98E7, 0x3D66,\n    0x98E8, 0x98EC, 0x470C, 0x98ED, 0x98ED, 0x3D67, 0x98EE, 0x98EF, 0x4711,\n    0x98F0, 0x98F0, 0x3D68, 0x98F1, 0x98F1, 0x4713, 0x98F2, 0x98F2, 0x3D69,\n    0x98F3, 0x98F3, 0x4714, 0x98F4, 0x98F5, 0x43D5, 0x98F6, 0x98FB, 0x4715,\n    0x98FC, 0x98FC, 0x3D6A, 0x98FD, 0x98FD, 0x471B, 0x98FE, 0x98FE, 0x43D7,\n    0x9940, 0x9941, 0x471C, 0x9942, 0x9942, 0x43FC, 0x9943, 0x9943, 0x3D6B,\n    0x9944, 0x9944, 0x471E, 0x9945, 0x9945, 0x3D6C, 0x9946, 0x9946, 0x471F,\n    0x9947, 0x9947, 0x43D8, 0x9948, 0x994E, 0x4720, 0x994F, 0x994F, 0x3D6D,\n    0x9950, 0x9953, 0x4727, 0x9954, 0x9954, 0x43D9, 0x9955, 0x995B, 0x472B,\n    0x995C, 0x995C, 0x43DA, 0x995D, 0x9963, 0x4732, 0x9964, 0x9964, 0x43DC,\n    0x9965, 0x9969, 0x4739, 0x996A, 0x996A, 0x3D6E, 0x996B, 0x996D, 0x473E,\n    0x996E, 0x996E, 0x3D6F, 0x996F, 0x9974, 0x4741, 0x9975, 0x9975, 0x3D70,\n    0x9976, 0x9977, 0x4747, 0x9978, 0x9978, 0x3D71, 0x9979, 0x997E, 0x4749,\n    0x99A1, 0x99A1, 0x474F, 0x99A2, 0x99A2, 0x3D72, 0x99A3, 0x99A3, 0x4750,\n    0x99A4, 0x99A4, 0x43C5, 0x99A5, 0x99A5, 0x4751, 0x99A6, 0x99A6, 0x43C6,\n    0x99A7, 0x99AD, 0x4752, 0x99AE, 0x99AE, 0x3D73, 0x99AF, 0x99B1, 0x4759,\n    0x99B2, 0x99B2, 0x43DE, 0x99B3, 0x99B5, 0x475C, 0x99B6, 0x99B6, 0x3D74,\n    0x99B7, 0x99B9, 0x475F, 0x99BA, 0x99BA, 0x3D75, 0x99BB, 0x99C9, 0x4762,\n    0x99CA, 0x99CA, 0x43E0, 0x99CB, 0x99CC, 0x4771, 0x99CD, 0x99CD, 0x43E2,\n    0x99CE, 0x99D2, 0x4773, 0x99D3, 0x99D3, 0x43E3, 0x99D4, 0x99D5, 0x4778,\n    0x99D6, 0x99D6, 0x43E5, 0x99D7, 0x99DE, 0x477A, 0x99DF, 0x99DF, 0x43DF,\n    0x99E0, 0x99E1, 0x4782, 0x99E2, 0x99E2, 0x3D76, 0x99E3, 0x99E3, 0x4784,\n    0x99E4, 0x99E4, 0x43AB, 0x99E5, 0x99E5, 0x4785, 0x99E6, 0x99E6, 0x43E7,\n    0x99E7, 0x99E7, 0x4786, 0x99E8, 0x99E8, 0x43E9, 0x99E9, 0x99EE, 0x4787,\n    0x99EF, 0x99EF, 0x43FD, 0x99F0, 0x99F3, 0x478D, 0x99F4, 0x99F4, 0x3D77,\n    0x99F5, 0x99FE, 0x4791, 0x9A40, 0x9A49, 0x479B, 0x9A4A, 0x9A4A, 0x3D78,\n    0x9A4B, 0x9A4B, 0x47A5, 0x9A4C, 0x9A4C, 0x3D79, 0x9A4D, 0x9A58, 0x47A6,\n    0x9A59, 0x9A59, 0x3D7A, 0x9A5A, 0x9A5E, 0x47B2, 0x9A5F, 0x9A5F, 0x43AF,\n    0x9A60, 0x9A60, 0x47B7, 0x9A61, 0x9A61, 0x3D7B, 0x9A62, 0x9A65, 0x47B8,\n    0x9A66, 0x9A66, 0x43ED, 0x9A67, 0x9A67, 0x47BC, 0x9A68, 0x9A68, 0x3D7C,\n    0x9A69, 0x9A69, 0x43EE, 0x9A6A, 0x9A6A, 0x47BD, 0x9A6B, 0x9A6B, 0x43FF,\n    0x9A6C, 0x9A72, 0x47BE, 0x9A73, 0x9A73, 0x3D7D, 0x9A74, 0x9A74, 0x47C5,\n    0x9A75, 0x9A75, 0x43F1, 0x9A76, 0x9A7D, 0x47C6, 0x9A7E, 0x9A7E, 0x3D7E,\n    0x9AA1, 0x9AA2, 0x47CE, 0x9AA3, 0x9AA3, 0x43F3, 0x9AA4, 0x9AA4, 0x47D0,\n    0x9AA5, 0x9AA5, 0x43F2, 0x9AA6, 0x9AA8, 0x47D1, 0x9AA9, 0x9AA9, 0x43F8,\n    0x9AAA, 0x9AAA, 0x43F4, 0x9AAB, 0x9AB1, 0x47D4, 0x9AB2, 0x9AB2, 0x3D7F,\n    0x9AB3, 0x9AB6, 0x47DB, 0x9AB7, 0x9AB7, 0x3D80, 0x9AB8, 0x9AB8, 0x47DF,\n    0x9AB9, 0x9AB9, 0x3D81, 0x9ABA, 0x9ABA, 0x47E0, 0x9ABB, 0x9ABB, 0x3D82,\n    0x9ABC, 0x9ABC, 0x47E1, 0x9ABD, 0x9ABD, 0x43B7, 0x9ABE, 0x9AC6, 0x47E2,\n    0x9AC7, 0x9AC7, 0x3D83, 0x9AC8, 0x9ACF, 0x47EB, 0x9AD0, 0x9AD0, 0x3D84,\n    0x9AD1, 0x9AD1, 0x47F3, 0x9AD2, 0x9AD2, 0x3D85, 0x9AD3, 0x9AD8, 0x47F4,\n    0x9AD9, 0x9ADB, 0x3D86, 0x9ADC, 0x9AE1, 0x47FA, 0x9AE2, 0x9AE2, 0x3D89,\n    0x9AE3, 0x9AE3, 0x4800, 0x9AE4, 0x9AE4, 0x3D8A, 0x9AE5, 0x9AE7, 0x4801,\n    0x9AE8, 0x9AE8, 0x3D8B, 0x9AE9, 0x9AE9, 0x43B0, 0x9AEA, 0x9AED, 0x4804,\n    0x9AEE, 0x9AEE, 0x43B2, 0x9AEF, 0x9AF1, 0x4808, 0x9AF2, 0x9AF2, 0x3D8C,\n    0x9AF3, 0x9AF5, 0x480B, 0x9AF6, 0x9AF6, 0x3D8D, 0x9AF7, 0x9AFA, 0x480E,\n    0x9AFB, 0x9AFB, 0x3D8E, 0x9AFC, 0x9AFE, 0x4812, 0x9B40, 0x9B45, 0x4815,\n    0x9B46, 0x9B46, 0x3D8F, 0x9B47, 0x9B49, 0x481B, 0x9B4A, 0x9B4A, 0x3D90,\n    0x9B4B, 0x9B53, 0x481E, 0x9B54, 0x9B54, 0x3D92, 0x9B55, 0x9B57, 0x4827,\n    0x9B58, 0x9B58, 0x3D93, 0x9B59, 0x9B59, 0x482A, 0x9B5A, 0x9B5A, 0x3D94,\n    0x9B5B, 0x9B5B, 0x482B, 0x9B5C, 0x9B5C, 0x3D95, 0x9B5D, 0x9B5D, 0x482C,\n    0x9B5E, 0x9B5F, 0x3D96, 0x9B60, 0x9B60, 0x482D, 0x9B62, 0x9B6F, 0x482E,\n    0x9B70, 0x9B73, 0x3D98, 0x9B74, 0x9B75, 0x483C, 0x9B76, 0x9B76, 0x2F50,\n    0x9B77, 0x9B77, 0x3D9D, 0x9B78, 0x9B78, 0x1725, 0x9B79, 0x9B7A, 0x483E,\n    0x9B7B, 0x9B7B, 0x32ED, 0x9B7C, 0x9B7C, 0x3DA0, 0x9B7D, 0x9B7D, 0x4840,\n    0x9B7E, 0x9B7E, 0x3DA1, 0x9BA1, 0x9BA1, 0x3DA2, 0x9BA2, 0x9BA2, 0x4841,\n    0x9BA3, 0x9BA4, 0x3DA3, 0x9BA5, 0x9BA6, 0x4842, 0x9BA7, 0x9BAA, 0x3DA5,\n    0x9BAB, 0x9BAB, 0x4844, 0x9BAC, 0x9BAC, 0x3DA9, 0x9BAD, 0x9BAE, 0x4845,\n    0x9BAF, 0x9BAF, 0x3DAA, 0x9BB0, 0x9BB1, 0x4847, 0x9BB2, 0x9BB9, 0x3DAB,\n    0x9BBA, 0x9BBD, 0x4849, 0x9BBE, 0x9BBE, 0x3DB3, 0x9BBF, 0x9BBF, 0x484D,\n    0x9BC0, 0x9BC5, 0x3DB4, 0x9BC6, 0x9BC6, 0x2AD9, 0x9BC7, 0x9BC9, 0x484E,\n    0x9BCA, 0x9BCA, 0x3DBB, 0x9BCB, 0x9BCB, 0x4851, 0x9BCC, 0x9BCC, 0x3DBC,\n    0x9BCD, 0x9BCD, 0x4852, 0x9BCE, 0x9BCE, 0x43D0, 0x9BCF, 0x9BCF, 0x4853,\n    0x9BD0, 0x9BD1, 0x3DBD, 0x9BD2, 0x9BD2, 0x4854, 0x9BD3, 0x9BD3, 0x3DBF,\n    0x9BD4, 0x9BD4, 0x4855, 0x9BD5, 0x9BD5, 0x3DC0, 0x9BD6, 0x9BD7, 0x4856,\n    0x9BD8, 0x9BDA, 0x3DC1, 0x9BDB, 0x9BDC, 0x4858, 0x9BDD, 0x9BDD, 0x3DC4,\n    0x9BDE, 0x9BDE, 0x1C14, 0x9BDF, 0x9BDF, 0x3DC5, 0x9BE0, 0x9BE0, 0x485A,\n    0x9BE1, 0x9BE1, 0x3DC6, 0x9BE2, 0x9BE2, 0x485B, 0x9BE3, 0x9BE3, 0x3DC7,\n    0x9BE4, 0x9BE6, 0x485C, 0x9BE7, 0x9BE7, 0x3DC8, 0x9BE8, 0x9BE8, 0x485F,\n    0x9BE9, 0x9BEB, 0x3DC9, 0x9BEC, 0x9BEC, 0x41FA, 0x9BED, 0x9BED, 0x4860,\n    0x9BEE, 0x9BEF, 0x3DCD, 0x9BF0, 0x9BF2, 0x4861, 0x9BF3, 0x9BF3, 0x3DCF,\n    0x9BF4, 0x9BF5, 0x4864, 0x9BF6, 0x9BF6, 0x12E9, 0x9BF7, 0x9BF7, 0x4866,\n    0x9BF8, 0x9BF9, 0x3DD1, 0x9BFA, 0x9BFA, 0x4867, 0x9BFB, 0x9BFC, 0x3DD3,\n    0x9BFD, 0x9BFE, 0x4868, 0x9C40, 0x9C41, 0x3DD5, 0x9C42, 0x9C42, 0x2CAE,\n    0x9C43, 0x9C43, 0x486A, 0x9C44, 0x9C46, 0x3DD8, 0x9C47, 0x9C47, 0x486B,\n    0x9C48, 0x9C48, 0x3DDB, 0x9C49, 0x9C49, 0x486C, 0x9C4A, 0x9C4A, 0x3DDC,\n    0x9C4B, 0x9C4C, 0x486D, 0x9C4D, 0x9C52, 0x3DDD, 0x9C53, 0x9C53, 0x1A64,\n    0x9C54, 0x9C54, 0x486F, 0x9C55, 0x9C55, 0x3DE4, 0x9C56, 0x9C56, 0x4870,\n    0x9C57, 0x9C5B, 0x3DE5, 0x9C5C, 0x9C5C, 0x4871, 0x9C5D, 0x9C5D, 0x3DEA,\n    0x9C5E, 0x9C5F, 0x4872, 0x9C60, 0x9C60, 0x3DEB, 0x9C61, 0x9C61, 0x4874,\n    0x9C62, 0x9C62, 0x1404, 0x9C63, 0x9C63, 0x4875, 0x9C64, 0x9C66, 0x3DED,\n    0x9C67, 0x9C67, 0x4876, 0x9C68, 0x9C68, 0x2324, 0x9C69, 0x9C69, 0x4877,\n    0x9C6A, 0x9C6A, 0x3DF1, 0x9C6B, 0x9C6B, 0x346A, 0x9C6C, 0x9C6C, 0x4878,\n    0x9C6D, 0x9C6D, 0x3DF2, 0x9C6E, 0x9C6E, 0x4879, 0x9C6F, 0x9C72, 0x3DF3,\n    0x9C73, 0x9C74, 0x487A, 0x9C75, 0x9C76, 0x3DF7, 0x9C77, 0x9C77, 0x2291,\n    0x9C78, 0x9C78, 0x487C, 0x9C79, 0x9C79, 0x3DFA, 0x9C7A, 0x9C7A, 0x487D,\n    0x9C7B, 0x9C7C, 0x3DFB, 0x9C7D, 0x9C7D, 0x487E, 0x9C7E, 0x9C7E, 0x3DFD,\n    0x9CA1, 0x9CA2, 0x3DFE, 0x9CA3, 0x9CA4, 0x487F, 0x9CA5, 0x9CA5, 0x3E00,\n    0x9CA6, 0x9CA7, 0x4881, 0x9CA8, 0x9CA9, 0x3E01, 0x9CAA, 0x9CAA, 0x4883,\n    0x9CAB, 0x9CAB, 0x3E03, 0x9CAC, 0x9CAC, 0x4884, 0x9CAD, 0x9CAE, 0x3E04,\n    0x9CAF, 0x9CB0, 0x4885, 0x9CB1, 0x9CBA, 0x3E06, 0x9CBB, 0x9CBB, 0x4887,\n    0x9CBC, 0x9CBC, 0x1787, 0x9CBD, 0x9CBD, 0x095F, 0x9CBE, 0x9CC2, 0x3E12,\n    0x9CC3, 0x9CC5, 0x4888, 0x9CC6, 0x9CCD, 0x3E17, 0x9CCE, 0x9CCE, 0x488B,\n    0x9CCF, 0x9CCF, 0x3E1F, 0x9CD0, 0x9CD0, 0x1E99, 0x9CD1, 0x9CD3, 0x3E21,\n    0x9CD4, 0x9CD7, 0x488C, 0x9CD8, 0x9CDA, 0x3E24, 0x9CDB, 0x9CDB, 0x4890,\n    0x9CDC, 0x9CE5, 0x3E27, 0x9CE6, 0x9CE6, 0x4891, 0x9CE7, 0x9CE9, 0x3E31,\n    0x9CEA, 0x9CEA, 0x4892, 0x9CEB, 0x9CEC, 0x3E34, 0x9CED, 0x9CED, 0x4893,\n    0x9CEE, 0x9CF9, 0x3E36, 0x9CFA, 0x9CFC, 0x4894, 0x9CFD, 0x9CFD, 0x3E42,\n    0x9CFE, 0x9CFE, 0x4897, 0x9D40, 0x9D40, 0x43E8, 0x9D41, 0x9D45, 0x4898,\n    0x9D46, 0x9D46, 0x3E43, 0x9D47, 0x9D48, 0x489D, 0x9D49, 0x9D49, 0x3E44,\n    0x9D4A, 0x9D4B, 0x489F, 0x9D4C, 0x9D4D, 0x3E46, 0x9D4E, 0x9D4E, 0x48A1,\n    0x9D4F, 0x9D4F, 0x3E48, 0x9D50, 0x9D50, 0x48A2, 0x9D51, 0x9D51, 0x3E49,\n    0x9D52, 0x9D54, 0x48A3, 0x9D55, 0x9D55, 0x3E4A, 0x9D56, 0x9D56, 0x48A6,\n    0x9D57, 0x9D57, 0x25C1, 0x9D58, 0x9D59, 0x48A7, 0x9D5A, 0x9D5A, 0x0D0C,\n    0x9D5B, 0x9D60, 0x48A9, 0x9D61, 0x9D61, 0x43C9, 0x9D62, 0x9D62, 0x3E4C,\n    0x9D63, 0x9D63, 0x48AF, 0x9D64, 0x9D64, 0x3E4D, 0x9D65, 0x9D77, 0x48B0,\n    0x9D78, 0x9D78, 0x43F5, 0x9D79, 0x9D79, 0x3E4E, 0x9D7A, 0x9D7D, 0x48C3,\n    0x9D7E, 0x9D7E, 0x3E4F, 0x9DA1, 0x9DA4, 0x48C7, 0x9DA5, 0x9DA8, 0x3E50,\n    0x9DA9, 0x9DA9, 0x48CB, 0x9DAA, 0x9DAA, 0x3E54, 0x9DAB, 0x9DAB, 0x48CC,\n    0x9DAC, 0x9DAD, 0x3E55, 0x9DAE, 0x9DAF, 0x48CD, 0x9DB0, 0x9DB0, 0x3E58,\n    0x9DB1, 0x9DB2, 0x48CF, 0x9DB3, 0x9DB3, 0x3E59, 0x9DB4, 0x9DB4, 0x48D1,\n    0x9DB5, 0x9DB5, 0x3E5A, 0x9DB6, 0x9DB6, 0x48D2, 0x9DB7, 0x9DB7, 0x3E5B,\n    0x9DB8, 0x9DBB, 0x48D3, 0x9DBC, 0x9DBD, 0x3E5C, 0x9DBE, 0x9DBE, 0x48D7,\n    0x9DBF, 0x9DC0, 0x3E5E, 0x9DC1, 0x9DC2, 0x48D8, 0x9DC3, 0x9DC3, 0x3E60,\n    0x9DC4, 0x9DC4, 0x05E6, 0x9DC5, 0x9DC6, 0x48DA, 0x9DC7, 0x9DC8, 0x3E62,\n    0x9DC9, 0x9DC9, 0x48DC, 0x9DCA, 0x9DCA, 0x3E64, 0x9DCB, 0x9DCC, 0x48DD,\n    0x9DCD, 0x9DD1, 0x3E65, 0x9DD2, 0x9DD2, 0x48DF, 0x9DD3, 0x9DD5, 0x3E6A,\n    0x9DD6, 0x9DD9, 0x48E0, 0x9DDA, 0x9DFB, 0x3E6D, 0x9DFC, 0x9DFC, 0x48E4,\n    0x9DFD, 0x9DFE, 0x3E8F, 0x9E40, 0x9E42, 0x3E91, 0x9E43, 0x9E43, 0x48E5,\n    0x9E44, 0x9E5E, 0x3E95, 0x9E5F, 0x9E5F, 0x48E6, 0x9E60, 0x9E62, 0x3EB1,\n    0x9E63, 0x9E63, 0x48E7, 0x9E64, 0x9E65, 0x3EB4, 0x9E66, 0x9E67, 0x48E8,\n    0x9E68, 0x9E68, 0x3EB6, 0x9E69, 0x9E69, 0x48EA, 0x9E6A, 0x9E6A, 0x3EB7,\n    0x9E6B, 0x9E70, 0x48EB, 0x9E71, 0x9E71, 0x3EB8, 0x9E72, 0x9E72, 0x48F1,\n    0x9E73, 0x9E73, 0x3EB9, 0x9E74, 0x9E76, 0x48F2, 0x9E77, 0x9E78, 0x3EBA,\n    0x9E79, 0x9E79, 0x48F5, 0x9E7A, 0x9E7A, 0x3EBC, 0x9E7B, 0x9E7B, 0x48F6,\n    0x9E7C, 0x9E7C, 0x3EBD, 0x9E7D, 0x9E7D, 0x48F7, 0x9E7E, 0x9E7E, 0x3EBE,\n    0x9EA1, 0x9EA2, 0x3EBF, 0x9EA3, 0x9EA3, 0x48F8, 0x9EA4, 0x9EA6, 0x3EC1,\n    0x9EA7, 0x9EA8, 0x48F9, 0x9EA9, 0x9EA9, 0x0728, 0x9EAA, 0x9EAA, 0x3EC5,\n    0x9EAB, 0x9EAB, 0x48FB, 0x9EAC, 0x9EAD, 0x3EC6, 0x9EAE, 0x9EAE, 0x48FC,\n    0x9EAF, 0x9EB1, 0x3EC8, 0x9EB2, 0x9EB3, 0x48FD, 0x9EB4, 0x9EB4, 0x3ECB,\n    0x9EB5, 0x9EB5, 0x48FF, 0x9EB6, 0x9EB7, 0x3ECC, 0x9EB8, 0x9EB8, 0x4900,\n    0x9EB9, 0x9EB9, 0x3ECE, 0x9EBA, 0x9EBB, 0x4901, 0x9EBC, 0x9EBC, 0x3ECF,\n    0x9EBD, 0x9EBE, 0x4903, 0x9EBF, 0x9EC0, 0x3ED0, 0x9EC1, 0x9EC3, 0x4905,\n    0x9EC4, 0x9EC5, 0x3ED2, 0x9EC6, 0x9EC6, 0x4908, 0x9EC7, 0x9ECA, 0x3ED4,\n    0x9ECB, 0x9ECC, 0x4909, 0x9ECD, 0x9ECD, 0x3ED9, 0x9ECE, 0x9ECF, 0x490B,\n    0x9ED0, 0x9ED1, 0x3EDA, 0x9ED2, 0x9ED2, 0x490D, 0x9ED3, 0x9ED3, 0x3EDC,\n    0x9ED4, 0x9ED5, 0x490E, 0x9ED6, 0x9ED7, 0x3EDD, 0x9ED8, 0x9ED9, 0x4910,\n    0x9EDA, 0x9EEE, 0x3EDF, 0x9EEF, 0x9EEF, 0x24B6, 0x9EF0, 0x9EF1, 0x3EF5,\n    0x9EF2, 0x9EF2, 0x4912, 0x9EF3, 0x9EF5, 0x3EF7, 0x9EF6, 0x9EF8, 0x4913,\n    0x9EF9, 0x9EFA, 0x3EFA, 0x9EFB, 0x9EFB, 0x4916, 0x9EFC, 0x9EFC, 0x3EFC,\n    0x9EFD, 0x9EFD, 0x1806, 0x9EFE, 0x9EFE, 0x3EFE, 0x9F40, 0x9F42, 0x3EFF,\n    0x9F43, 0x9F43, 0x4917, 0x9F44, 0x9F47, 0x3F02, 0x9F48, 0x9F48, 0x4918,\n    0x9F49, 0x9F4A, 0x3F06, 0x9F4B, 0x9F4C, 0x4919, 0x9F4D, 0x9F5F, 0x3F08,\n    0x9F60, 0x9F60, 0x3511, 0x9F61, 0x9F65, 0x3F1C, 0x9F66, 0x9F66, 0x3945,\n    0x9F67, 0x9F68, 0x491B, 0x9F69, 0x9F6F, 0x3F23, 0x9F70, 0x9F70, 0x491D,\n    0x9F71, 0x9F7E, 0x3F2A, 0x9FA1, 0x9FB4, 0x3F38, 0x9FB5, 0x9FB5, 0x491E,\n    0x9FB6, 0x9FBA, 0x3F4C, 0x9FBB, 0x9FBB, 0x491F, 0x9FBC, 0x9FBE, 0x3F51,\n    0x9FBF, 0x9FBF, 0x4920, 0x9FC0, 0x9FC0, 0x3F54, 0x9FC1, 0x9FC1, 0x4921,\n    0x9FC2, 0x9FCA, 0x3F55, 0x9FCB, 0x9FCB, 0x0F82, 0x9FCC, 0x9FCC, 0x4922,\n    0x9FCD, 0x9FD3, 0x3F60, 0x9FD4, 0x9FD4, 0x4923, 0x9FD5, 0x9FD7, 0x3F68,\n    0x9FD8, 0x9FD8, 0x3A3E, 0x9FD9, 0x9FE3, 0x3F6C, 0x9FE4, 0x9FE4, 0x4924,\n    0x9FE5, 0x9FF8, 0x3F77, 0x9FF9, 0x9FF9, 0x4925, 0x9FFA, 0x9FFE, 0x3F8B,\n    0xA040, 0xA040, 0x4926, 0xA041, 0xA046, 0x3F90, 0xA047, 0xA047, 0x4927,\n    0xA048, 0xA054, 0x3F96, 0xA055, 0xA055, 0x4928, 0xA056, 0xA062, 0x3FA3,\n    0xA063, 0xA063, 0x3811, 0xA064, 0xA06C, 0x3FB1, 0xA06D, 0xA06D, 0x4929,\n    0xA06E, 0xA076, 0x3FBA, 0xA077, 0xA077, 0x05F2, 0xA078, 0xA07A, 0x3FC4,\n    0xA07B, 0xA07B, 0x492A, 0xA07C, 0xA07E, 0x3FC7, 0xA0A1, 0xA0A1, 0x3FCA,\n    0xA0A2, 0xA0A2, 0x492B, 0xA0A3, 0xA0A6, 0x3FCB, 0xA0A7, 0xA0A7, 0x492C,\n    0xA0A8, 0xA0C4, 0x3FCF, 0xA0C5, 0xA0C5, 0x492D, 0xA0C6, 0xA0CF, 0x3FEC,\n    0xA0D0, 0xA0D0, 0x492E, 0xA0D1, 0xA0D4, 0x3FF6, 0xA0D5, 0xA0D5, 0x3AEE,\n    0xA0D6, 0xA0DE, 0x3FFB, 0xA0DF, 0xA0DF, 0x247D, 0xA0E0, 0xA0E2, 0x4005,\n    0xA0E3, 0xA0E3, 0x492F, 0xA0E4, 0xA0E4, 0x3AC9, 0xA0E5, 0xA0E6, 0x4009,\n    0xA0E7, 0xA0ED, 0x4930, 0xA0EE, 0xA0EE, 0x43B4, 0xA0EF, 0xA0F1, 0x4937,\n    0xA0F2, 0xA0F2, 0x43B8, 0xA0F3, 0xA0FE, 0x493A, 0xA140, 0xA158, 0x0063,\n    0xA159, 0xA15C, 0x35AF, 0xA15D, 0xA17E, 0x0080, 0xA1A1, 0xA1F5, 0x00A2,\n    0xA1F6, 0xA1F6, 0x00F8, 0xA1F7, 0xA1F7, 0x00F7, 0xA1F8, 0xA1FE, 0x00F9,\n    0xA240, 0xA27E, 0x0100, 0xA2A1, 0xA2FE, 0x013F, 0xA340, 0xA37E, 0x019D,\n    0xA3A1, 0xA3BB, 0x01DC, 0xA3BD, 0xA3BF, 0x01F7, 0xA440, 0xA47E, 0x0253,\n    0xA4A1, 0xA4FE, 0x0292, 0xA540, 0xA57E, 0x02F0, 0xA5A1, 0xA5FE, 0x032F,\n    0xA640, 0xA67E, 0x038D, 0xA6A1, 0xA6FE, 0x03CC, 0xA740, 0xA77E, 0x042A,\n    0xA7A1, 0xA7FE, 0x0469, 0xA840, 0xA87E, 0x04C7, 0xA8A1, 0xA8FE, 0x0506,\n    0xA940, 0xA97E, 0x0564, 0xA9A1, 0xA9FE, 0x05A3, 0xAA40, 0xAA7E, 0x0601,\n    0xAAA1, 0xAAFE, 0x0640, 0xAB40, 0xAB7E, 0x069E, 0xABA1, 0xABFE, 0x06DD,\n    0xAC40, 0xAC7E, 0x073B, 0xACA1, 0xACFD, 0x077A, 0xACFE, 0xACFE, 0x097F,\n    0xAD40, 0xAD7E, 0x07D7, 0xADA1, 0xADFE, 0x0816, 0xAE40, 0xAE7E, 0x0874,\n    0xAEA1, 0xAEFE, 0x08B3, 0xAF40, 0xAF7E, 0x0911, 0xAFA1, 0xAFCF, 0x0950,\n    0xAFD0, 0xAFFE, 0x0980, 0xB040, 0xB07E, 0x09AF, 0xB0A1, 0xB0FE, 0x09EE,\n    0xB140, 0xB17E, 0x0A4C, 0xB1A1, 0xB1FE, 0x0A8B, 0xB240, 0xB27E, 0x0AE9,\n    0xB2A1, 0xB2FE, 0x0B28, 0xB340, 0xB37E, 0x0B86, 0xB3A1, 0xB3FE, 0x0BC5,\n    0xB440, 0xB47E, 0x0C23, 0xB4A1, 0xB4FE, 0x0C62, 0xB540, 0xB57E, 0x0CC0,\n    0xB5A1, 0xB5FE, 0x0CFF, 0xB640, 0xB67E, 0x0D5D, 0xB6A1, 0xB6FE, 0x0D9C,\n    0xB740, 0xB77E, 0x0DFA, 0xB7A1, 0xB7FE, 0x0E39, 0xB840, 0xB87E, 0x0E97,\n    0xB8A1, 0xB8FE, 0x0ED6, 0xB940, 0xB97E, 0x0F34, 0xB9A1, 0xB9FE, 0x0F73,\n    0xBA40, 0xBA7E, 0x0FD1, 0xBAA1, 0xBAFE, 0x1010, 0xBB40, 0xBB7E, 0x106E,\n    0xBBA1, 0xBBC7, 0x10AD, 0xBBC8, 0xBBFE, 0x10D5, 0xBC40, 0xBC7E, 0x110C,\n    0xBCA1, 0xBCFE, 0x114B, 0xBD40, 0xBD7E, 0x11A9, 0xBDA1, 0xBDFE, 0x11E8,\n    0xBE40, 0xBE51, 0x1246, 0xBE52, 0xBE52, 0x10D4, 0xBE53, 0xBE7E, 0x1258,\n    0xBEA1, 0xBEFE, 0x1284, 0xBF40, 0xBF7E, 0x12E2, 0xBFA1, 0xBFFE, 0x1321,\n    0xC040, 0xC07E, 0x137F, 0xC0A1, 0xC0FE, 0x13BE, 0xC140, 0xC17E, 0x141C,\n    0xC1A1, 0xC1AA, 0x145B, 0xC1AB, 0xC1FE, 0x1466, 0xC240, 0xC27E, 0x14BA,\n    0xC2A1, 0xC2CA, 0x14F9, 0xC2CB, 0xC2CB, 0x1465, 0xC2CC, 0xC2FE, 0x1523,\n    0xC340, 0xC360, 0x1556, 0xC361, 0xC37E, 0x1578, 0xC3A1, 0xC3B8, 0x1596,\n    0xC3B9, 0xC3B9, 0x15AF, 0xC3BA, 0xC3BA, 0x15AE, 0xC3BB, 0xC3FE, 0x15B0,\n    0xC440, 0xC455, 0x15F4, 0xC456, 0xC456, 0x1577, 0xC457, 0xC47E, 0x160A,\n    0xC4A1, 0xC4FE, 0x1632, 0xC540, 0xC57E, 0x1690, 0xC5A1, 0xC5FE, 0x16CF,\n    0xC640, 0xC67E, 0x172D, 0xC6A1, 0xC6BE, 0x01FA, 0xC6BF, 0xC6CE, 0x0219,\n    0xC6D0, 0xC6D2, 0x022A, 0xC6D4, 0xC6D4, 0x022E, 0xC6D6, 0xC6D6, 0x0230,\n    0xC6D8, 0xC6DD, 0x35B3, 0xC6E0, 0xC6FE, 0x35BA, 0xC740, 0xC77E, 0x35D9,\n    0xC7A1, 0xC7FE, 0x3618, 0xC840, 0xC87E, 0x3676, 0xC8A1, 0xC8A4, 0x36B5,\n    0xC8CD, 0xC8D3, 0x36E1, 0xC8D4, 0xC8D6, 0x44C6, 0xC8D7, 0xC8DF, 0x451C,\n    0xC8E0, 0xC8E0, 0x499E, 0xC8E1, 0xC8E8, 0x4525, 0xC8E9, 0xC8E9, 0x499F,\n    0xC8EA, 0xC8F0, 0x452D, 0xC8F1, 0xC8F1, 0x49A0, 0xC8F5, 0xC8FE, 0x4992,\n    0xC940, 0xC949, 0x176C, 0xC94A, 0xC94A, 0x0274, 0xC94B, 0xC96B, 0x1776,\n    0xC96C, 0xC97E, 0x1798, 0xC9A1, 0xC9BD, 0x17AB, 0xC9BE, 0xC9BE, 0x1797,\n    0xC9BF, 0xC9EC, 0x17C8, 0xC9ED, 0xC9FE, 0x17F7, 0xCA40, 0xCA7E, 0x1809,\n    0xCAA1, 0xCAF6, 0x1848, 0xCAF7, 0xCAF7, 0x17F6, 0xCAF8, 0xCAFE, 0x189E,\n    0xCB40, 0xCB7E, 0x18A5, 0xCBA1, 0xCBFE, 0x18E4, 0xCC40, 0xCC7E, 0x1942,\n    0xCCA1, 0xCCFE, 0x1981, 0xCD40, 0xCD7E, 0x19DF, 0xCDA1, 0xCDFE, 0x1A1E,\n    0xCE40, 0xCE7E, 0x1A7C, 0xCEA1, 0xCEFE, 0x1ABB, 0xCF40, 0xCF7E, 0x1B19,\n    0xCFA1, 0xCFFE, 0x1B58, 0xD040, 0xD07E, 0x1BB6, 0xD0A1, 0xD0FE, 0x1BF5,\n    0xD140, 0xD17E, 0x1C53, 0xD1A1, 0xD1FE, 0x1C92, 0xD240, 0xD27E, 0x1CF0,\n    0xD2A1, 0xD2FE, 0x1D2F, 0xD340, 0xD37E, 0x1D8D, 0xD3A1, 0xD3FE, 0x1DCC,\n    0xD440, 0xD47E, 0x1E2A, 0xD4A1, 0xD4FE, 0x1E69, 0xD540, 0xD57E, 0x1EC7,\n    0xD5A1, 0xD5FE, 0x1F06, 0xD640, 0xD67E, 0x1F64, 0xD6A1, 0xD6CB, 0x1FA3,\n    0xD6CC, 0xD6CC, 0x2254, 0xD6CD, 0xD6FE, 0x1FCF, 0xD740, 0xD779, 0x2001,\n    0xD77A, 0xD77A, 0x22B9, 0xD77B, 0xD77E, 0x203B, 0xD7A1, 0xD7FE, 0x203F,\n    0xD840, 0xD87E, 0x209D, 0xD8A1, 0xD8FE, 0x20DC, 0xD940, 0xD97E, 0x213A,\n    0xD9A1, 0xD9FE, 0x2179, 0xDA40, 0xDA7E, 0x21D7, 0xDAA1, 0xDADE, 0x2216,\n    0xDADF, 0xDADF, 0x1FCE, 0xDAE0, 0xDAFE, 0x2255, 0xDB40, 0xDB7E, 0x2274,\n    0xDBA1, 0xDBA6, 0x22B3, 0xDBA7, 0xDBFE, 0x22BA, 0xDC40, 0xDC7E, 0x2312,\n    0xDCA1, 0xDCFE, 0x2351, 0xDD40, 0xDD7E, 0x23AF, 0xDDA1, 0xDDFB, 0x23EE,\n    0xDDFC, 0xDDFC, 0x2381, 0xDDFD, 0xDDFE, 0x2449, 0xDE40, 0xDE7E, 0x244B,\n    0xDEA1, 0xDEFE, 0x248A, 0xDF40, 0xDF7E, 0x24E8, 0xDFA1, 0xDFFE, 0x2527,\n    0xE040, 0xE07E, 0x2585, 0xE0A1, 0xE0FE, 0x25C4, 0xE140, 0xE17E, 0x2622,\n    0xE1A1, 0xE1FE, 0x2661, 0xE240, 0xE27E, 0x26BF, 0xE2A1, 0xE2FE, 0x26FE,\n    0xE340, 0xE37E, 0x275C, 0xE3A1, 0xE3FE, 0x279B, 0xE440, 0xE47E, 0x27F9,\n    0xE4A1, 0xE4FE, 0x2838, 0xE540, 0xE57E, 0x2896, 0xE5A1, 0xE5FE, 0x28D5,\n    0xE640, 0xE67E, 0x2933, 0xE6A1, 0xE6FE, 0x2972, 0xE740, 0xE77E, 0x29D0,\n    0xE7A1, 0xE7FE, 0x2A0F, 0xE840, 0xE87E, 0x2A6D, 0xE8A1, 0xE8A2, 0x2AAC,\n    0xE8A3, 0xE8FE, 0x2AAF, 0xE940, 0xE975, 0x2B0B, 0xE976, 0xE97E, 0x2B42,\n    0xE9A1, 0xE9FE, 0x2B4B, 0xEA40, 0xEA7E, 0x2BA9, 0xEAA1, 0xEAFE, 0x2BE8,\n    0xEB40, 0xEB5A, 0x2C46, 0xEB5B, 0xEB7E, 0x2C62, 0xEBA1, 0xEBF0, 0x2C86,\n    0xEBF1, 0xEBF1, 0x2AAE, 0xEBF2, 0xEBFE, 0x2CD6, 0xEC40, 0xEC7E, 0x2CE3,\n    0xECA1, 0xECDD, 0x2D22, 0xECDE, 0xECDE, 0x2B41, 0xECDF, 0xECFE, 0x2D5F,\n    0xED40, 0xED7E, 0x2D7F, 0xEDA1, 0xEDA9, 0x2DBE, 0xEDAA, 0xEDFE, 0x2DC8,\n    0xEE40, 0xEE7E, 0x2E1D, 0xEEA1, 0xEEEA, 0x2E5C, 0xEEEB, 0xEEEB, 0x3014,\n    0xEEEC, 0xEEFE, 0x2EA6, 0xEF40, 0xEF7E, 0x2EB9, 0xEFA1, 0xEFFE, 0x2EF8,\n    0xF040, 0xF055, 0x2F56, 0xF056, 0xF056, 0x2DC7, 0xF057, 0xF07E, 0x2F6C,\n    0xF0A1, 0xF0CA, 0x2F94, 0xF0CB, 0xF0CB, 0x2C61, 0xF0CC, 0xF0FE, 0x2FBE,\n    0xF140, 0xF162, 0x2FF1, 0xF163, 0xF16A, 0x3015, 0xF16B, 0xF16B, 0x3160,\n    0xF16C, 0xF17E, 0x301D, 0xF1A1, 0xF1FE, 0x3030, 0xF240, 0xF267, 0x308E,\n    0xF268, 0xF268, 0x31EF, 0xF269, 0xF27E, 0x30B6, 0xF2A1, 0xF2C2, 0x30CC,\n    0xF2C3, 0xF2FE, 0x30EF, 0xF340, 0xF374, 0x312B, 0xF375, 0xF37E, 0x3161,\n    0xF3A1, 0xF3FE, 0x316B, 0xF440, 0xF465, 0x31C9, 0xF466, 0xF47E, 0x31F0,\n    0xF4A1, 0xF4B4, 0x3209, 0xF4B5, 0xF4B5, 0x30EE, 0xF4B6, 0xF4FC, 0x321D,\n    0xF4FD, 0xF4FE, 0x3265, 0xF540, 0xF57E, 0x3267, 0xF5A1, 0xF5FE, 0x32A6,\n    0xF640, 0xF662, 0x3304, 0xF663, 0xF663, 0x3264, 0xF664, 0xF67E, 0x3327,\n    0xF6A1, 0xF6FE, 0x3342, 0xF740, 0xF77E, 0x33A0, 0xF7A1, 0xF7FE, 0x33DF,\n    0xF840, 0xF87E, 0x343D, 0xF8A1, 0xF8FE, 0x347C, 0xF940, 0xF976, 0x34DA,\n    0xF977, 0xF97E, 0x3512, 0xF9A1, 0xF9C3, 0x351A, 0xF9C4, 0xF9C4, 0x3511,\n    0xF9C5, 0xF9C5, 0x353D, 0xF9C6, 0xF9C6, 0x3549, 0xF9C7, 0xF9D1, 0x353E,\n    0xF9D2, 0xF9D5, 0x354A, 0xF9D6, 0xF9FE, 0x36E8, 0xFA40, 0xFA5E, 0x400B,\n    0xFA5F, 0xFA5F, 0x083A, 0xFA60, 0xFA65, 0x402B, 0xFA66, 0xFA66, 0x09FD,\n    0xFA67, 0xFA7E, 0x4032, 0xFAA1, 0xFAA8, 0x404A, 0xFAA9, 0xFAAA, 0x4946,\n    0xFAAB, 0xFABC, 0x4054, 0xFABD, 0xFABD, 0x030D, 0xFABE, 0xFAC4, 0x4067,\n    0xFAC5, 0xFAC5, 0x016B, 0xFAC6, 0xFAD4, 0x406F, 0xFAD5, 0xFAD5, 0x0860,\n    0xFAD6, 0xFAFE, 0x407F, 0xFB40, 0xFB47, 0x40A8, 0xFB48, 0xFB48, 0x3E82,\n    0xFB49, 0xFB52, 0x40B1, 0xFB53, 0xFB53, 0x4948, 0xFB54, 0xFB6D, 0x40BC,\n    0xFB6E, 0xFB6E, 0x4949, 0xFB6F, 0xFB7E, 0x40D7, 0xFBA1, 0xFBA2, 0x40E7,\n    0xFBA3, 0xFBA3, 0x494A, 0xFBA4, 0xFBB7, 0x40EA, 0xFBB8, 0xFBB8, 0x0C23,\n    0xFBB9, 0xFBBE, 0x40FF, 0xFBBF, 0xFBBF, 0x494B, 0xFBC0, 0xFBCC, 0x4105,\n    0xFBCD, 0xFBCD, 0x494C, 0xFBCE, 0xFBF2, 0x4112, 0xFBF3, 0xFBF3, 0x17E4,\n    0xFBF4, 0xFBF8, 0x4138, 0xFBF9, 0xFBF9, 0x3E8E, 0xFBFA, 0xFBFE, 0x413E,\n    0xFC40, 0xFC49, 0x4143, 0xFC4A, 0xFC4A, 0x494D, 0xFC4B, 0xFC4E, 0x414D,\n    0xFC4F, 0xFC4F, 0x212F, 0xFC50, 0xFC51, 0x4151, 0xFC52, 0xFC52, 0x494E,\n    0xFC53, 0xFC62, 0x4153, 0xFC63, 0xFC63, 0x494F, 0xFC64, 0xFC6B, 0x4163,\n    0xFC6C, 0xFC6C, 0x4001, 0xFC6D, 0xFC6D, 0x4950, 0xFC6E, 0xFC74, 0x416D,\n    0xFC75, 0xFC75, 0x4951, 0xFC76, 0xFC7E, 0x4174, 0xFCA1, 0xFCB8, 0x417D,\n    0xFCB9, 0xFCB9, 0x115F, 0xFCBA, 0xFCBB, 0x4195, 0xFCBC, 0xFCBD, 0x4952,\n    0xFCBE, 0xFCCB, 0x4198, 0xFCCC, 0xFCCC, 0x4954, 0xFCCD, 0xFCE1, 0x41A7,\n    0xFCE2, 0xFCE2, 0x0C79, 0xFCE3, 0xFCE3, 0x4955, 0xFCE4, 0xFCED, 0x41BD,\n    0xFCEE, 0xFCEE, 0x4956, 0xFCEF, 0xFCF0, 0x41C7, 0xFCF1, 0xFCF1, 0x04C3,\n    0xFCF2, 0xFCFE, 0x41CA, 0xFD40, 0xFD48, 0x41D7, 0xFD49, 0xFD49, 0x4957,\n    0xFD4A, 0xFD69, 0x41E0, 0xFD6A, 0xFD6A, 0x4958, 0xFD6B, 0xFD7E, 0x4201,\n    0xFDA1, 0xFDB6, 0x4215, 0xFDB7, 0xFDB7, 0x18BD, 0xFDB8, 0xFDB8, 0x0CBD,\n    0xFDB9, 0xFDBA, 0x422D, 0xFDBB, 0xFDBB, 0x0CA5, 0xFDBC, 0xFDE2, 0x4230,\n    0xFDE3, 0xFDE3, 0x4959, 0xFDE4, 0xFDF0, 0x4258, 0xFDF1, 0xFDF1, 0x0CCE,\n    0xFDF2, 0xFDF2, 0x495A, 0xFDF3, 0xFDFE, 0x4266, 0xFE40, 0xFE51, 0x4272,\n    0xFE52, 0xFE52, 0x3D70, 0xFE53, 0xFE6C, 0x4285, 0xFE6D, 0xFE6D, 0x495B,\n    0xFE6E, 0xFE6E, 0x429F, 0xFE6F, 0xFE6F, 0x0E84, 0xFE70, 0xFE77, 0x42A1,\n    0xFE78, 0xFE78, 0x495C, 0xFE79, 0xFE7E, 0x42A9, 0xFEA1, 0xFEA9, 0x42AF,\n    0xFEAA, 0xFEAA, 0x0120, 0xFEAB, 0xFEDC, 0x42B8, 0xFEDD, 0xFEDD, 0x1BA8,\n    0xFEDE, 0xFEDF, 0x495D, 0xFEE0, 0xFEEC, 0x42EB, 0xFEED, 0xFEEE, 0x495F,\n    0xFEEF, 0xFEFE, 0x42F8,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/CNS1/HKscs-B5-V_5.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_HKscs_B5_V_5[13 * 3] = {\n    0xA14B, 0xA14B, 0x354E, 0xA15A, 0xA15A, 0x35AF, 0xA15C, 0xA15C, 0x35B1,\n    0xA15D, 0xA15E, 0x0082, 0xA161, 0xA162, 0x0086, 0xA165, 0xA166, 0x008A,\n    0xA169, 0xA16A, 0x008E, 0xA16D, 0xA16E, 0x0092, 0xA171, 0xA172, 0x0096,\n    0xA175, 0xA176, 0x009A, 0xA179, 0xA17A, 0x009E, 0xA1E3, 0xA1E3, 0x354F,\n    0xC6E4, 0xC6E5, 0x3711,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UCS2-H_3.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_UniCNS_UCS2_H_3[16418 * 3] = {\n    0x0020, 0x007E, 0x0001, 0x00A2, 0x00A3, 0x0106, 0x00A5, 0x00A5, 0x0104,\n    0x00A7, 0x00A7, 0x00B2, 0x00A8, 0x00A8, 0x35B3, 0x00AC, 0x00AC, 0x36E1,\n    0x00B0, 0x00B0, 0x0118, 0x00B1, 0x00B1, 0x00D4, 0x00B7, 0x00B7, 0x0073,\n    0x00C0, 0x00C0, 0x4964, 0x00C1, 0x00C1, 0x4962, 0x00C8, 0x00C8, 0x4968,\n    0x00C9, 0x00C9, 0x4966, 0x00CA, 0x00CA, 0x4971, 0x00D2, 0x00D2, 0x496C,\n    0x00D3, 0x00D3, 0x496A, 0x00D7, 0x00D7, 0x00D2, 0x00E0, 0x00E0, 0x4975,\n    0x00E1, 0x00E1, 0x4973, 0x00E8, 0x00E8, 0x497A, 0x00E9, 0x00E9, 0x4978,\n    0x00EA, 0x00EA, 0x4990, 0x00EC, 0x00EC, 0x497E, 0x00ED, 0x00ED, 0x497C,\n    0x00F2, 0x00F2, 0x4982, 0x00F3, 0x00F3, 0x4980, 0x00F7, 0x00F7, 0x00D3,\n    0x00F8, 0x00F8, 0x4998, 0x00F9, 0x00F9, 0x4986, 0x00FA, 0x00FA, 0x4984,\n    0x00FC, 0x00FC, 0x498B, 0x0100, 0x0100, 0x4961, 0x0101, 0x0101, 0x4972,\n    0x0112, 0x0112, 0x4965, 0x0113, 0x0113, 0x4977, 0x011A, 0x011A, 0x4967,\n    0x011B, 0x011B, 0x4979, 0x012B, 0x012B, 0x497B, 0x014B, 0x014B, 0x4999,\n    0x014C, 0x014C, 0x4969, 0x014D, 0x014D, 0x497F, 0x0153, 0x0153, 0x4997,\n    0x016B, 0x016B, 0x4983, 0x01CD, 0x01CD, 0x4963, 0x01CE, 0x01CE, 0x4974,\n    0x01D0, 0x01D0, 0x497D, 0x01D1, 0x01D1, 0x496B, 0x01D2, 0x01D2, 0x4981,\n    0x01D4, 0x01D4, 0x4985, 0x01D6, 0x01D6, 0x4987, 0x01D8, 0x01D8, 0x4988,\n    0x01DA, 0x01DA, 0x4989, 0x01DC, 0x01DC, 0x498A, 0x0250, 0x0250, 0x4993,\n    0x0251, 0x0251, 0x4976, 0x0254, 0x0254, 0x4995, 0x025B, 0x025B, 0x4994,\n    0x0261, 0x0261, 0x4991, 0x026A, 0x026A, 0x499B, 0x0275, 0x0275, 0x4996,\n    0x0283, 0x0283, 0x4992, 0x028A, 0x028A, 0x499A, 0x02C6, 0x02C6, 0x35B4,\n    0x02C7, 0x02C7, 0x01F8, 0x02CA, 0x02CA, 0x01F7, 0x02CB, 0x02CB, 0x01F9,\n    0x02D9, 0x02D9, 0x01F6, 0x0308, 0x0308, 0x35B3, 0x0391, 0x03A1, 0x01A1,\n    0x03A3, 0x03A9, 0x01B2, 0x03B1, 0x03C1, 0x01B9, 0x03C3, 0x03C9, 0x01CA,\n    0x0401, 0x0401, 0x3670, 0x0410, 0x0415, 0x366A, 0x0416, 0x0435, 0x3671,\n    0x0436, 0x044F, 0x3692, 0x0451, 0x0451, 0x3691, 0x1EBE, 0x1EBE, 0x496E,\n    0x1EBF, 0x1EBF, 0x498D, 0x1EC0, 0x1EC0, 0x4970, 0x1EC1, 0x1EC1, 0x498F,\n    0x2013, 0x2013, 0x0079, 0x2014, 0x2014, 0x007B, 0x2018, 0x2019, 0x00A6,\n    0x201C, 0x201D, 0x00A8, 0x2022, 0x2022, 0x0068, 0x2025, 0x2025, 0x006F,\n    0x2026, 0x2026, 0x006E, 0x2032, 0x2032, 0x00AD, 0x2035, 0x2035, 0x00AC,\n    0x203B, 0x203B, 0x00B1, 0x203E, 0x203E, 0x00C3, 0x20AC, 0x20AC, 0x44C1,\n    0x2103, 0x2103, 0x010A, 0x2105, 0x2105, 0x00C2, 0x2109, 0x2109, 0x010B,\n    0x2116, 0x2116, 0x36E6, 0x2121, 0x2121, 0x36E7, 0x2160, 0x2169, 0x0157,\n    0x2170, 0x2179, 0x020E, 0x2190, 0x2190, 0x00F8, 0x2191, 0x2191, 0x00F5,\n    0x2192, 0x2192, 0x00F7, 0x2193, 0x2193, 0x00F6, 0x2196, 0x2197, 0x00F9,\n    0x2198, 0x2198, 0x00FC, 0x2199, 0x2199, 0x00FB, 0x21B8, 0x21B9, 0x36AD,\n    0x21E7, 0x21E7, 0x36AC, 0x221A, 0x221A, 0x00D5, 0x221E, 0x221E, 0x00DC,\n    0x221F, 0x221F, 0x00E9, 0x2220, 0x2220, 0x00E8, 0x2223, 0x2223, 0x00FE,\n    0x2225, 0x2225, 0x00FD, 0x2229, 0x222A, 0x00E5, 0x222B, 0x222B, 0x00ED,\n    0x222E, 0x222E, 0x00EE, 0x2234, 0x2234, 0x00F0, 0x2235, 0x2235, 0x00EF,\n    0x223C, 0x223C, 0x00E4, 0x2252, 0x2252, 0x00DD, 0x2260, 0x2260, 0x00DB,\n    0x2261, 0x2261, 0x00DE, 0x2266, 0x2267, 0x00D9, 0x22A5, 0x22A5, 0x00E7,\n    0x22BF, 0x22BF, 0x00EA, 0x2400, 0x241F, 0x0232, 0x2421, 0x2421, 0x0252,\n    0x2460, 0x2469, 0x01FA, 0x2474, 0x247D, 0x0204, 0x2500, 0x2500, 0x0137,\n    0x2502, 0x2502, 0x0138, 0x250C, 0x250C, 0x013A, 0x2510, 0x2510, 0x013B,\n    0x2514, 0x2514, 0x013C, 0x2518, 0x2518, 0x013D, 0x251C, 0x251C, 0x0135,\n    0x2524, 0x2524, 0x0134, 0x252C, 0x252C, 0x0133, 0x2534, 0x2534, 0x0132,\n    0x253C, 0x253C, 0x0131, 0x2550, 0x2550, 0x0142, 0x2551, 0x2551, 0x370A,\n    0x2552, 0x2552, 0x36F8, 0x2553, 0x2553, 0x3701, 0x2554, 0x2554, 0x36EF,\n    0x2555, 0x2555, 0x36FA, 0x2556, 0x2556, 0x3703, 0x2557, 0x2557, 0x36F1,\n    0x2558, 0x2558, 0x36FE, 0x2559, 0x2559, 0x3707, 0x255A, 0x255A, 0x36F5,\n    0x255B, 0x255B, 0x3700, 0x255C, 0x255C, 0x3709, 0x255D, 0x255D, 0x36F7,\n    0x255E, 0x255E, 0x0143, 0x255F, 0x255F, 0x3704, 0x2560, 0x2560, 0x36F2,\n    0x2561, 0x2561, 0x0145, 0x2562, 0x2562, 0x3706, 0x2563, 0x2563, 0x36F4,\n    0x2564, 0x2564, 0x36F9, 0x2565, 0x2565, 0x3702, 0x2566, 0x2566, 0x36F0,\n    0x2567, 0x2567, 0x36FF, 0x2568, 0x2568, 0x3708, 0x2569, 0x2569, 0x36F6,\n    0x256A, 0x256A, 0x0144, 0x256B, 0x256B, 0x3705, 0x256C, 0x256C, 0x36F3,\n    0x256D, 0x256E, 0x013E, 0x256F, 0x256F, 0x0141, 0x2570, 0x2570, 0x0140,\n    0x2571, 0x2573, 0x014A, 0x2581, 0x2588, 0x0122, 0x2589, 0x2589, 0x0130,\n    0x258A, 0x258A, 0x012F, 0x258B, 0x258B, 0x012E, 0x258C, 0x258C, 0x012D,\n    0x258D, 0x258D, 0x012C, 0x258E, 0x258E, 0x012B, 0x258F, 0x258F, 0x012A,\n    0x2593, 0x2593, 0x3710, 0x2594, 0x2594, 0x0136, 0x2595, 0x2595, 0x0139,\n    0x25A0, 0x25A0, 0x00BE, 0x25A1, 0x25A1, 0x00BD, 0x25B2, 0x25B2, 0x00B7,\n    0x25B3, 0x25B3, 0x00B6, 0x25BC, 0x25BC, 0x00C0, 0x25BD, 0x25BD, 0x00BF,\n    0x25C6, 0x25C6, 0x00BC, 0x25C7, 0x25C7, 0x00BB, 0x25CB, 0x25CB, 0x00B4,\n    0x25CE, 0x25CE, 0x00B8, 0x25CF, 0x25CF, 0x00B5, 0x25E2, 0x25E3, 0x0146,\n    0x25E4, 0x25E4, 0x0149, 0x25E5, 0x25E5, 0x0148, 0x2605, 0x2605, 0x00BA,\n    0x2606, 0x2606, 0x00B9, 0x2609, 0x2609, 0x00F4, 0x2640, 0x2640, 0x00F1,\n    0x2641, 0x2641, 0x00F3, 0x2642, 0x2642, 0x00F2, 0x273D, 0x273D, 0x35C0,\n    0x2E80, 0x2E80, 0x44C8, 0x2E84, 0x2E84, 0x451C, 0x2E86, 0x2E88, 0x451D,\n    0x2E8A, 0x2E8A, 0x4520, 0x2E8C, 0x2E8D, 0x4521, 0x2E95, 0x2E95, 0x4523,\n    0x2E9C, 0x2E9C, 0x4524, 0x2E9D, 0x2E9D, 0x02DC, 0x2EA5, 0x2EA5, 0x4525,\n    0x2EA7, 0x2EA7, 0x4526, 0x2EAA, 0x2EAA, 0x4527, 0x2EAC, 0x2EAC, 0x4528,\n    0x2EAE, 0x2EAE, 0x4529, 0x2EB6, 0x2EB6, 0x452A, 0x2EBC, 0x2EBC, 0x452B,\n    0x2EBE, 0x2EBE, 0x452C, 0x2EC6, 0x2EC6, 0x0509, 0x2ECA, 0x2ECA, 0x452D,\n    0x2ECC, 0x2ECD, 0x452E, 0x2ECF, 0x2ECF, 0x4530, 0x2ED6, 0x2ED7, 0x4531,\n    0x2EDE, 0x2EDE, 0x4533, 0x2EE3, 0x2EE3, 0x09F6, 0x2F33, 0x2F33, 0x0227,\n    0x3000, 0x3000, 0x0063, 0x3001, 0x3002, 0x0065, 0x3003, 0x3003, 0x00B3,\n    0x3005, 0x3007, 0x35BA, 0x3008, 0x3009, 0x0094, 0x300A, 0x300B, 0x0090,\n    0x300C, 0x300D, 0x0098, 0x300E, 0x300F, 0x009C, 0x3010, 0x3011, 0x008C,\n    0x3012, 0x3012, 0x0105, 0x3014, 0x3015, 0x0088, 0x301D, 0x301E, 0x00AA,\n    0x3021, 0x3029, 0x0161, 0x3041, 0x3093, 0x35C1, 0x309B, 0x309C, 0x44C6,\n    0x309D, 0x309E, 0x35B7, 0x30A1, 0x30F6, 0x3614, 0x30FC, 0x30FC, 0x35BD,\n    0x30FD, 0x30FE, 0x35B5, 0x3105, 0x3129, 0x01D1, 0x3231, 0x3231, 0x36E5,\n    0x32A3, 0x32A3, 0x00C1, 0x338E, 0x338F, 0x0115, 0x339C, 0x339E, 0x0110,\n    0x33A1, 0x33A1, 0x0114, 0x33C4, 0x33C4, 0x0117, 0x33CE, 0x33CE, 0x0113,\n    0x33D1, 0x33D1, 0x00EC, 0x33D2, 0x33D2, 0x00EB, 0x33D5, 0x33D5, 0x010F,\n    0x3435, 0x3435, 0x39BD, 0x3440, 0x3440, 0x3C67, 0x344C, 0x344C, 0x4593,\n    0x3464, 0x3464, 0x3A85, 0x3473, 0x3473, 0x3DC5, 0x347A, 0x347A, 0x4033,\n    0x347D, 0x347D, 0x4597, 0x347E, 0x347E, 0x46A3, 0x3493, 0x3493, 0x439E,\n    0x3496, 0x3496, 0x37DC, 0x34A5, 0x34A5, 0x4598, 0x34AF, 0x34AF, 0x3C7F,\n    0x34BC, 0x34BC, 0x4380, 0x34C1, 0x34C1, 0x44FB, 0x34C8, 0x34C8, 0x3D00,\n    0x34DF, 0x34DF, 0x3EA4, 0x34E4, 0x34E4, 0x3E54, 0x34FB, 0x34FB, 0x3DCA,\n    0x3506, 0x3506, 0x4336, 0x353E, 0x353E, 0x44E7, 0x3551, 0x3551, 0x45A1,\n    0x3553, 0x3553, 0x43A5, 0x3561, 0x3561, 0x40D8, 0x356D, 0x356D, 0x45A4,\n    0x3570, 0x3570, 0x3B2F, 0x3572, 0x3572, 0x45A5, 0x3577, 0x3577, 0x3ECB,\n    0x3578, 0x3578, 0x4379, 0x3584, 0x3584, 0x39FB, 0x3597, 0x3597, 0x3B2D,\n    0x3598, 0x3598, 0x45B0, 0x35A1, 0x35A1, 0x40E2, 0x35A5, 0x35A5, 0x45B1,\n    0x35AD, 0x35AD, 0x3EFC, 0x35BF, 0x35BF, 0x45B2, 0x35C1, 0x35C1, 0x4580,\n    0x35C5, 0x35C5, 0x45B4, 0x35C7, 0x35C7, 0x459F, 0x35CA, 0x35CA, 0x3E43,\n    0x35CE, 0x35CE, 0x3E81, 0x35D2, 0x35D2, 0x3FC9, 0x35D6, 0x35D6, 0x3FB5,\n    0x35DB, 0x35DB, 0x470D, 0x35DD, 0x35DD, 0x43AC, 0x35F1, 0x35F1, 0x4696,\n    0x35F2, 0x35F2, 0x4627, 0x35F3, 0x35F3, 0x3F6C, 0x35FB, 0x35FB, 0x45C8,\n    0x35FE, 0x35FE, 0x3F6A, 0x3609, 0x3609, 0x45F5, 0x3618, 0x3618, 0x4871,\n    0x361A, 0x361A, 0x461A, 0x3623, 0x3623, 0x40C6, 0x362D, 0x362D, 0x3E86,\n    0x3635, 0x3635, 0x492E, 0x3639, 0x3639, 0x4165, 0x363E, 0x363E, 0x3A08,\n    0x3647, 0x3647, 0x4806, 0x3648, 0x3648, 0x3806, 0x3649, 0x3649, 0x4013,\n    0x364E, 0x364E, 0x4698, 0x365F, 0x365F, 0x3DF3, 0x367A, 0x367A, 0x3EE3,\n    0x3681, 0x3681, 0x45A6, 0x369A, 0x369A, 0x3C71, 0x36A5, 0x36A5, 0x4902,\n    0x36AA, 0x36AA, 0x3B30, 0x36AC, 0x36AC, 0x4900, 0x36B0, 0x36B0, 0x3CDF,\n    0x36B1, 0x36B1, 0x40CD, 0x36B5, 0x36B5, 0x3BC2, 0x36B9, 0x36B9, 0x4887,\n    0x36BC, 0x36BC, 0x3CFF, 0x36C1, 0x36C1, 0x37C5, 0x36C3, 0x36C3, 0x40E5,\n    0x36C4, 0x36C4, 0x3905, 0x36C5, 0x36C5, 0x4296, 0x36C7, 0x36C7, 0x3D3A,\n    0x36C8, 0x36C8, 0x4820, 0x36D3, 0x36D3, 0x3A38, 0x36D4, 0x36D4, 0x3BB3,\n    0x36D6, 0x36D6, 0x3D0C, 0x36DD, 0x36DD, 0x3A36, 0x36E1, 0x36E1, 0x397C,\n    0x36E2, 0x36E2, 0x3CDD, 0x36E5, 0x36E5, 0x4216, 0x36E6, 0x36E6, 0x40FC,\n    0x36F5, 0x36F5, 0x3A18, 0x3701, 0x3701, 0x3A34, 0x3703, 0x3703, 0x460F,\n    0x3708, 0x3708, 0x40FF, 0x370A, 0x370A, 0x3CD5, 0x370D, 0x370D, 0x4238,\n    0x371C, 0x371C, 0x3DFE, 0x3722, 0x3722, 0x3979, 0x3723, 0x3723, 0x3980,\n    0x3725, 0x3725, 0x3849, 0x372C, 0x372C, 0x3C8C, 0x372D, 0x372D, 0x3D37,\n    0x3730, 0x3730, 0x495C, 0x3732, 0x3732, 0x4106, 0x3733, 0x3733, 0x3997,\n    0x373A, 0x373A, 0x3E56, 0x3740, 0x3740, 0x4202, 0x3743, 0x3743, 0x4036,\n    0x3762, 0x3762, 0x3DB6, 0x376F, 0x376F, 0x47CB, 0x3797, 0x3797, 0x45ED,\n    0x37A0, 0x37A0, 0x3A28, 0x37B9, 0x37B9, 0x43B7, 0x37BE, 0x37BE, 0x393E,\n    0x37F2, 0x37F2, 0x3BA1, 0x37F8, 0x37F8, 0x42D2, 0x37FB, 0x37FB, 0x3EF5,\n    0x380F, 0x380F, 0x462C, 0x3819, 0x3819, 0x39AF, 0x3820, 0x3820, 0x462F,\n    0x382D, 0x382D, 0x412E, 0x3836, 0x3836, 0x4133, 0x3838, 0x3838, 0x43BB,\n    0x3863, 0x3863, 0x46C3, 0x38A0, 0x38A0, 0x4145, 0x38C3, 0x38C3, 0x3912,\n    0x38CC, 0x38CC, 0x4076, 0x38D1, 0x38D1, 0x3A95, 0x38FA, 0x38FA, 0x44EB,\n    0x3908, 0x3908, 0x4632, 0x3914, 0x3914, 0x43BE, 0x3927, 0x3927, 0x3C31,\n    0x3932, 0x3932, 0x4182, 0x393F, 0x393F, 0x4633, 0x394D, 0x394D, 0x4634,\n    0x3963, 0x3963, 0x4163, 0x3980, 0x3980, 0x3874, 0x3989, 0x3989, 0x4638,\n    0x398A, 0x398A, 0x3CE8, 0x3992, 0x3992, 0x4376, 0x3999, 0x3999, 0x39BA,\n    0x399B, 0x399B, 0x3DB3, 0x39A1, 0x39A1, 0x3E19, 0x39A4, 0x39A4, 0x3E0F,\n    0x39B8, 0x39B8, 0x463B, 0x39DC, 0x39DC, 0x3ECE, 0x39E2, 0x39E2, 0x46C8,\n    0x39E5, 0x39E5, 0x393B, 0x39EC, 0x39EC, 0x4310, 0x39F8, 0x39F8, 0x463E,\n    0x39FB, 0x39FB, 0x4345, 0x39FE, 0x39FE, 0x4368, 0x3A01, 0x3A01, 0x41E0,\n    0x3A03, 0x3A03, 0x4640, 0x3A06, 0x3A06, 0x4377, 0x3A17, 0x3A17, 0x4190,\n    0x3A18, 0x3A18, 0x438F, 0x3A29, 0x3A29, 0x3A5E, 0x3A2A, 0x3A2A, 0x3EDF,\n    0x3A34, 0x3A34, 0x4319, 0x3A4B, 0x3A4B, 0x4644, 0x3A52, 0x3A52, 0x3ED3,\n    0x3A57, 0x3A57, 0x419E, 0x3A5C, 0x3A5C, 0x3FC4, 0x3A5E, 0x3A5E, 0x3B07,\n    0x3A66, 0x3A66, 0x419C, 0x3A67, 0x3A67, 0x4333, 0x3A97, 0x3A97, 0x4647,\n    0x3AAB, 0x3AAB, 0x4091, 0x3ABD, 0x3ABD, 0x4649, 0x3ADE, 0x3ADE, 0x414C,\n    0x3AE0, 0x3AE0, 0x3A7A, 0x3AF0, 0x3AF0, 0x46B2, 0x3AF2, 0x3AF2, 0x464C,\n    0x3AFB, 0x3AFB, 0x3AF2, 0x3B0E, 0x3B0E, 0x38E8, 0x3B19, 0x3B19, 0x46C5,\n    0x3B22, 0x3B22, 0x464E, 0x3B2B, 0x3B2B, 0x4956, 0x3B39, 0x3B39, 0x474B,\n    0x3B42, 0x3B42, 0x4650, 0x3B58, 0x3B58, 0x4652, 0x3B60, 0x3B60, 0x393A,\n    0x3B71, 0x3B71, 0x4656, 0x3B72, 0x3B72, 0x4655, 0x3B7B, 0x3B7B, 0x4657,\n    0x3B7C, 0x3B7C, 0x385A, 0x3B80, 0x3B80, 0x41E2, 0x3B96, 0x3B96, 0x3A9C,\n    0x3B99, 0x3B99, 0x3A98, 0x3BA1, 0x3BA1, 0x41E9, 0x3BBC, 0x3BBC, 0x43C8,\n    0x3BBE, 0x3BBE, 0x3DB1, 0x3BC2, 0x3BC2, 0x4134, 0x3BC4, 0x3BC4, 0x3AA0,\n    0x3BD7, 0x3BD7, 0x3AAC, 0x3BDD, 0x3BDD, 0x465F, 0x3BEC, 0x3BEC, 0x4664,\n    0x3BF2, 0x3BF2, 0x4666, 0x3BF3, 0x3BF3, 0x41F3, 0x3BF4, 0x3BF4, 0x3A6E,\n    0x3C0D, 0x3C0D, 0x41F7, 0x3C11, 0x3C11, 0x3E40, 0x3C15, 0x3C15, 0x3998,\n    0x3C54, 0x3C54, 0x3E00, 0x3CCB, 0x3CCB, 0x4670, 0x3CCD, 0x3CCD, 0x3CE5,\n    0x3CD1, 0x3CD1, 0x4003, 0x3CD6, 0x3CD6, 0x3CF7, 0x3CDC, 0x3CDC, 0x404E,\n    0x3CEB, 0x3CEB, 0x4217, 0x3CEF, 0x3CEF, 0x4675, 0x3D13, 0x3D13, 0x3773,\n    0x3D1D, 0x3D1D, 0x393C, 0x3D32, 0x3D32, 0x4957, 0x3D3B, 0x3D3B, 0x4245,\n    0x3D46, 0x3D46, 0x4685, 0x3D4C, 0x3D4C, 0x3CEB, 0x3D4E, 0x3D4E, 0x4242,\n    0x3D51, 0x3D51, 0x38EA, 0x3D5F, 0x3D5F, 0x4159, 0x3D62, 0x3D62, 0x3C5E,\n    0x3D69, 0x3D69, 0x3CEA, 0x3D6A, 0x3D6A, 0x4689, 0x3D6F, 0x3D6F, 0x3CFC,\n    0x3D75, 0x3D75, 0x468A, 0x3D7D, 0x3D7D, 0x3C2F, 0x3D85, 0x3D85, 0x494B,\n    0x3D8A, 0x3D8A, 0x468D, 0x3D8F, 0x3D8F, 0x3ABD, 0x3D91, 0x3D91, 0x468F,\n    0x3DA5, 0x3DA5, 0x3D56, 0x3DAD, 0x3DAD, 0x4699, 0x3DB4, 0x3DB4, 0x40A6,\n    0x3DBF, 0x3DBF, 0x37D0, 0x3DC6, 0x3DC6, 0x48DE, 0x3DC7, 0x3DC7, 0x4164,\n    0x3DCC, 0x3DCC, 0x3D6F, 0x3DCD, 0x3DCD, 0x3AF3, 0x3DD3, 0x3DD3, 0x37E1,\n    0x3DDB, 0x3DDB, 0x3FFF, 0x3DE7, 0x3DE7, 0x3999, 0x3DE8, 0x3DE8, 0x425D,\n    0x3DEB, 0x3DEB, 0x3E5A, 0x3DF3, 0x3DF3, 0x46D4, 0x3DF7, 0x3DF7, 0x48AB,\n    0x3DFC, 0x3DFC, 0x462B, 0x3DFD, 0x3DFD, 0x3C14, 0x3E06, 0x3E06, 0x491D,\n    0x3E40, 0x3E40, 0x4169, 0x3E43, 0x3E43, 0x436D, 0x3E48, 0x3E48, 0x4595,\n    0x3E55, 0x3E55, 0x427F, 0x3E74, 0x3E74, 0x3EE2, 0x3EA8, 0x3EA8, 0x4304,\n    0x3EA9, 0x3EA9, 0x46ED, 0x3EAA, 0x3EAA, 0x4075, 0x3EAD, 0x3EAD, 0x3B9D,\n    0x3EB1, 0x3EB1, 0x3AD8, 0x3EB8, 0x3EB8, 0x3A4B, 0x3EBF, 0x3EBF, 0x3B0B,\n    0x3EC2, 0x3EC2, 0x3BD8, 0x3EC7, 0x3EC7, 0x3975, 0x3ECA, 0x3ECA, 0x46F1,\n    0x3ECC, 0x3ECC, 0x3BE2, 0x3ED0, 0x3ED0, 0x3854, 0x3ED1, 0x3ED1, 0x46F2,\n    0x3ED6, 0x3ED6, 0x3CAD, 0x3ED7, 0x3ED7, 0x429F, 0x3EDA, 0x3EDA, 0x3D02,\n    0x3EDE, 0x3EDE, 0x39F2, 0x3EE1, 0x3EE1, 0x3CA8, 0x3EE2, 0x3EE2, 0x46F6,\n    0x3EE7, 0x3EE7, 0x3BDC, 0x3EE9, 0x3EE9, 0x3CA4, 0x3EEB, 0x3EEB, 0x396A,\n    0x3EF0, 0x3EF0, 0x46F7, 0x3EF3, 0x3EF3, 0x3ADD, 0x3EF4, 0x3EF4, 0x46F8,\n    0x3EFA, 0x3EFA, 0x46F9, 0x3EFC, 0x3EFC, 0x3BE8, 0x3EFF, 0x3EFF, 0x3AF5,\n    0x3F00, 0x3F00, 0x3C0D, 0x3F04, 0x3F04, 0x42C3, 0x3F06, 0x3F06, 0x3AD7,\n    0x3F0E, 0x3F0E, 0x46FB, 0x3F53, 0x3F53, 0x46FC, 0x3F58, 0x3F58, 0x3AE9,\n    0x3F59, 0x3F59, 0x4089, 0x3F63, 0x3F63, 0x3AE6, 0x3F7C, 0x3F7C, 0x4700,\n    0x3F93, 0x3F93, 0x45CD, 0x3FC0, 0x3FC0, 0x43CF, 0x3FD7, 0x3FD7, 0x43D1,\n    0x3FDC, 0x3FDC, 0x4704, 0x3FE5, 0x3FE5, 0x46DF, 0x3FED, 0x3FED, 0x4335,\n    0x3FF9, 0x3FF9, 0x45D7, 0x3FFA, 0x3FFA, 0x4354, 0x4004, 0x4004, 0x410E,\n    0x401D, 0x401D, 0x4709, 0x4039, 0x4039, 0x470B, 0x4045, 0x4045, 0x470C,\n    0x4053, 0x4053, 0x45B6, 0x4057, 0x4057, 0x399D, 0x4062, 0x4062, 0x3BCB,\n    0x4065, 0x4065, 0x3FD3, 0x406A, 0x406A, 0x470F, 0x406F, 0x406F, 0x4710,\n    0x40A8, 0x40A8, 0x43D5, 0x40BB, 0x40BB, 0x45C0, 0x40BF, 0x40BF, 0x3EEC,\n    0x40C8, 0x40C8, 0x3B0E, 0x40D8, 0x40D8, 0x41AB, 0x40DF, 0x40DF, 0x3E17,\n    0x40FA, 0x40FA, 0x3EBE, 0x4103, 0x4103, 0x43D7, 0x4104, 0x4104, 0x425C,\n    0x4109, 0x4109, 0x471C, 0x410E, 0x410E, 0x3B1B, 0x4132, 0x4132, 0x3B25,\n    0x4167, 0x4167, 0x471F, 0x416C, 0x416C, 0x38AE, 0x416E, 0x416E, 0x3B23,\n    0x417F, 0x417F, 0x3B82, 0x4190, 0x4190, 0x46C0, 0x41B2, 0x41B2, 0x4720,\n    0x41C4, 0x41C4, 0x4723, 0x41CA, 0x41CA, 0x373F, 0x41CF, 0x41CF, 0x4726,\n    0x41DB, 0x41DB, 0x37BF, 0x41EF, 0x41EF, 0x3743, 0x41F9, 0x41F9, 0x3B3E,\n    0x4211, 0x4211, 0x3B41, 0x4240, 0x4240, 0x37F1, 0x4260, 0x4260, 0x472B,\n    0x426A, 0x426A, 0x3B55, 0x427A, 0x427A, 0x472C, 0x428C, 0x428C, 0x472F,\n    0x4294, 0x4294, 0x4731, 0x42B5, 0x42B5, 0x4010, 0x42B9, 0x42B9, 0x38A6,\n    0x42BC, 0x42BC, 0x3C8A, 0x42F4, 0x42F4, 0x3BB9, 0x42FB, 0x42FB, 0x3CEE,\n    0x42FC, 0x42FC, 0x41E6, 0x432B, 0x432B, 0x377D, 0x436E, 0x436E, 0x46CA,\n    0x4397, 0x4397, 0x473B, 0x43BA, 0x43BA, 0x435F, 0x43C1, 0x43C1, 0x4695,\n    0x43D9, 0x43D9, 0x433E, 0x43DF, 0x43DF, 0x3E49, 0x43ED, 0x43ED, 0x4745,\n    0x43F2, 0x43F2, 0x3E48, 0x4401, 0x4401, 0x474A, 0x4402, 0x4402, 0x3B73,\n    0x4413, 0x4413, 0x474F, 0x4425, 0x4425, 0x4751, 0x442D, 0x442D, 0x4752,\n    0x447A, 0x447A, 0x37AF, 0x448F, 0x448F, 0x4758, 0x449F, 0x449F, 0x3AE2,\n    0x44A0, 0x44A0, 0x37ED, 0x44A2, 0x44A2, 0x4079, 0x44B0, 0x44B0, 0x475C,\n    0x44B7, 0x44B7, 0x3FA1, 0x44C0, 0x44C0, 0x3C07, 0x44C5, 0x44C5, 0x4210,\n    0x44CE, 0x44CE, 0x3D23, 0x44DD, 0x44DD, 0x39DD, 0x44DF, 0x44DF, 0x3D22,\n    0x44E4, 0x44E4, 0x37E2, 0x44E9, 0x44E9, 0x41CF, 0x44EA, 0x44EA, 0x3B71,\n    0x44EB, 0x44EB, 0x3CF2, 0x44EC, 0x44EC, 0x3EB4, 0x44F4, 0x44F4, 0x3992,\n    0x4503, 0x4503, 0x469F, 0x4504, 0x4504, 0x4763, 0x4509, 0x4509, 0x3E50,\n    0x450B, 0x450B, 0x37D4, 0x4516, 0x4516, 0x37F9, 0x451D, 0x451D, 0x3767,\n    0x4527, 0x4527, 0x37F7, 0x452E, 0x452E, 0x3CD3, 0x4533, 0x4533, 0x3C51,\n    0x453B, 0x453B, 0x476A, 0x453D, 0x453D, 0x38C4, 0x453F, 0x453F, 0x3E12,\n    0x4543, 0x4543, 0x37F3, 0x4551, 0x4551, 0x3AE4, 0x4552, 0x4552, 0x40B3,\n    0x4555, 0x4555, 0x423E, 0x455C, 0x455C, 0x378B, 0x4562, 0x4562, 0x4940,\n    0x456A, 0x456A, 0x3804, 0x4577, 0x4577, 0x476E, 0x4585, 0x4585, 0x38C5,\n    0x45E9, 0x45E9, 0x3EE4, 0x4606, 0x4606, 0x4773, 0x460F, 0x460F, 0x3815,\n    0x4615, 0x4615, 0x3843, 0x4617, 0x4617, 0x4774, 0x465B, 0x465B, 0x381D,\n    0x467A, 0x467A, 0x39E9, 0x4680, 0x4680, 0x3D01, 0x46CF, 0x46CF, 0x3BA0,\n    0x46D0, 0x46D0, 0x3DFA, 0x46F5, 0x46F5, 0x3B9F, 0x4713, 0x4713, 0x3833,\n    0x4718, 0x4718, 0x3DC7, 0x474E, 0x474E, 0x3EBC, 0x477C, 0x477C, 0x3DCD,\n    0x4798, 0x4798, 0x4781, 0x47A6, 0x47A6, 0x40A3, 0x47B6, 0x47B6, 0x3EEA,\n    0x47D5, 0x47D5, 0x431A, 0x47ED, 0x47ED, 0x4783, 0x47F4, 0x47F4, 0x432F,\n    0x4800, 0x4800, 0x461E, 0x480B, 0x480B, 0x4352, 0x4837, 0x4837, 0x4787,\n    0x485D, 0x485D, 0x410F, 0x4871, 0x4871, 0x3D03, 0x489B, 0x489B, 0x3BBD,\n    0x48AD, 0x48AD, 0x4791, 0x48AE, 0x48AE, 0x494D, 0x48D0, 0x48D0, 0x3DA7,\n    0x48DD, 0x48DD, 0x4120, 0x48ED, 0x48ED, 0x4288, 0x48F3, 0x48F3, 0x3EC1,\n    0x48FA, 0x48FA, 0x3E44, 0x4906, 0x4906, 0x3BC7, 0x4911, 0x4911, 0x4584,\n    0x491E, 0x491E, 0x4794, 0x4925, 0x4925, 0x3C0F, 0x492A, 0x492A, 0x46AE,\n    0x492D, 0x492D, 0x46CD, 0x4935, 0x4935, 0x3CC3, 0x493C, 0x493C, 0x3BF8,\n    0x493E, 0x493E, 0x3D06, 0x4945, 0x4945, 0x47A3, 0x4951, 0x4951, 0x47A4,\n    0x4953, 0x4953, 0x42AD, 0x4965, 0x4965, 0x3899, 0x496A, 0x496A, 0x47A9,\n    0x4972, 0x4972, 0x3A24, 0x4989, 0x4989, 0x379B, 0x49A1, 0x49A1, 0x38B7,\n    0x49A7, 0x49A7, 0x47AE, 0x49DF, 0x49DF, 0x38AA, 0x49E5, 0x49E5, 0x47B1,\n    0x49E7, 0x49E7, 0x4621, 0x4A0F, 0x4A0F, 0x38C3, 0x4A1D, 0x4A1D, 0x3BEC,\n    0x4A24, 0x4A24, 0x47B2, 0x4A35, 0x4A35, 0x47B4, 0x4A96, 0x4A96, 0x3CE7,\n    0x4AB4, 0x4AB4, 0x4361, 0x4AB8, 0x4AB8, 0x3DA8, 0x4AD1, 0x4AD1, 0x38E3,\n    0x4AE4, 0x4AE4, 0x47B7, 0x4AFF, 0x4AFF, 0x38F2, 0x4B19, 0x4B19, 0x47B9,\n    0x4B2C, 0x4B2C, 0x461F, 0x4B37, 0x4B37, 0x41A9, 0x4B6F, 0x4B6F, 0x3C16,\n    0x4B70, 0x4B70, 0x47C0, 0x4B72, 0x4B72, 0x38FC, 0x4B7B, 0x4B7B, 0x3C8D,\n    0x4B7E, 0x4B7E, 0x400A, 0x4B8E, 0x4B8E, 0x39F7, 0x4B90, 0x4B90, 0x3C20,\n    0x4B93, 0x4B93, 0x3A8C, 0x4B96, 0x4B96, 0x3942, 0x4B97, 0x4B97, 0x3C24,\n    0x4B9D, 0x4B9D, 0x47C2, 0x4BBD, 0x4BBD, 0x3C23, 0x4BBE, 0x4BBE, 0x3954,\n    0x4BC0, 0x4BC0, 0x3DDC, 0x4C04, 0x4C04, 0x3FBB, 0x4C07, 0x4C07, 0x3FB7,\n    0x4C0E, 0x4C0E, 0x390C, 0x4C3B, 0x4C3B, 0x3F3C, 0x4C3E, 0x4C3E, 0x457B,\n    0x4C5B, 0x4C5B, 0x3ED9, 0x4C6D, 0x4C6D, 0x47C9, 0x4C7D, 0x4C7D, 0x3E66,\n    0x4CA4, 0x4CA4, 0x48BE, 0x4CAE, 0x4CAE, 0x3C42, 0x4CB0, 0x4CB0, 0x3C45,\n    0x4CB7, 0x4CB7, 0x3E21, 0x4CCD, 0x4CCD, 0x4578, 0x4CE1, 0x4CE1, 0x3EF3,\n    0x4CED, 0x4CED, 0x40AB, 0x4D09, 0x4D09, 0x3ED6, 0x4D10, 0x4D10, 0x4117,\n    0x4D34, 0x4D34, 0x3935, 0x4D91, 0x4D91, 0x43F5, 0x4D9C, 0x4D9C, 0x48C4,\n    0x4E00, 0x4E00, 0x0253, 0x4E01, 0x4E01, 0x0255, 0x4E03, 0x4E03, 0x0256,\n    0x4E04, 0x4E04, 0x48FE, 0x4E07, 0x4E07, 0x1771, 0x4E08, 0x4E08, 0x0269,\n    0x4E09, 0x4E09, 0x0267, 0x4E0A, 0x4E0A, 0x026A, 0x4E0B, 0x4E0B, 0x0268,\n    0x4E0C, 0x4E0C, 0x1772, 0x4E0D, 0x4E0D, 0x0294, 0x4E0E, 0x4E0E, 0x177A,\n    0x4E0F, 0x4E0F, 0x1778, 0x4E10, 0x4E10, 0x0293, 0x4E11, 0x4E11, 0x0292,\n    0x4E14, 0x4E14, 0x02F2, 0x4E15, 0x4E15, 0x02F1, 0x4E16, 0x4E16, 0x02F0,\n    0x4E18, 0x4E18, 0x02F3, 0x4E19, 0x4E19, 0x02EF, 0x4E1A, 0x4E1A, 0x48FD,\n    0x4E1C, 0x4E1C, 0x48E0, 0x4E1E, 0x4E1F, 0x036E, 0x4E21, 0x4E21, 0x3D6D,\n    0x4E24, 0x4E24, 0x458D, 0x4E26, 0x4E26, 0x0528, 0x4E28, 0x4E28, 0x0218,\n    0x4E2A, 0x4E2A, 0x3F57, 0x4E2B, 0x4E2B, 0x026B, 0x4E2C, 0x4E2C, 0x44F3,\n    0x4E2D, 0x4E2D, 0x0295, 0x4E2E, 0x4E2E, 0x177B, 0x4E30, 0x4E30, 0x0296,\n    0x4E31, 0x4E31, 0x178E, 0x4E32, 0x4E32, 0x0415, 0x4E33, 0x4E33, 0x18F4,\n    0x4E36, 0x4E36, 0x0219, 0x4E37, 0x4E37, 0x4517, 0x4E38, 0x4E38, 0x026C,\n    0x4E39, 0x4E39, 0x0297, 0x4E3B, 0x4E3B, 0x02F4, 0x4E3C, 0x4E3C, 0x178F,\n    0x4E3D, 0x4E3D, 0x4537, 0x4E3F, 0x4E3F, 0x021A, 0x4E41, 0x4E41, 0x36AF,\n    0x4E42, 0x4E42, 0x176C, 0x4E43, 0x4E43, 0x0257, 0x4E45, 0x4E45, 0x026E,\n    0x4E47, 0x4E47, 0x1773, 0x4E48, 0x4E48, 0x026F, 0x4E49, 0x4E49, 0x408E,\n    0x4E4B, 0x4E4B, 0x0298, 0x4E4D, 0x4E4D, 0x02F5, 0x4E4E, 0x4E4E, 0x02F7,\n    0x4E4F, 0x4E4F, 0x02F6, 0x4E52, 0x4E53, 0x0370, 0x4E56, 0x4E56, 0x0529,\n    0x4E58, 0x4E58, 0x0831, 0x4E59, 0x4E59, 0x0254, 0x4E5A, 0x4E5A, 0x36B1,\n    0x4E5B, 0x4E5B, 0x44E5, 0x4E5C, 0x4E5C, 0x176D, 0x4E5D, 0x4E5D, 0x0258,\n    0x4E5E, 0x4E5E, 0x0271, 0x4E5F, 0x4E5F, 0x0270, 0x4E69, 0x4E69, 0x0372,\n    0x4E6A, 0x4E6A, 0x3DE5, 0x4E73, 0x4E73, 0x052A, 0x4E78, 0x4E78, 0x3D8E,\n    0x4E7E, 0x4E7E, 0x09FB, 0x4E7F, 0x4E7F, 0x1E35, 0x4E80, 0x4E80, 0x458E,\n    0x4E81, 0x4E81, 0x43BC, 0x4E82, 0x4E82, 0x0DBE, 0x4E83, 0x4E84, 0x2361,\n    0x4E85, 0x4E85, 0x021B, 0x4E86, 0x4E86, 0x0259, 0x4E87, 0x4E87, 0x458F,\n    0x4E88, 0x4E88, 0x029A, 0x4E89, 0x4E89, 0x459C, 0x4E8B, 0x4E8B, 0x052B,\n    0x4E8C, 0x4E8C, 0x025A, 0x4E8D, 0x4E8D, 0x1774, 0x4E8E, 0x4E8E, 0x0272,\n    0x4E91, 0x4E91, 0x029B, 0x4E92, 0x4E92, 0x029D, 0x4E93, 0x4E93, 0x177C,\n    0x4E94, 0x4E94, 0x029E, 0x4E95, 0x4E95, 0x029C, 0x4E98, 0x4E98, 0x39C4,\n    0x4E99, 0x4E99, 0x0373, 0x4E9A, 0x4E9A, 0x48D5, 0x4E9B, 0x4E9B, 0x052C,\n    0x4E9E, 0x4E9E, 0x052D, 0x4E9F, 0x4E9F, 0x06A3, 0x4EA0, 0x4EA0, 0x021C,\n    0x4EA1, 0x4EA1, 0x0273, 0x4EA2, 0x4EA2, 0x029F, 0x4EA4, 0x4EA4, 0x0374,\n    0x4EA5, 0x4EA5, 0x0376, 0x4EA6, 0x4EA6, 0x0375, 0x4EA8, 0x4EA8, 0x0416,\n    0x4EAB, 0x4EAC, 0x052E, 0x4EAD, 0x4EAE, 0x06A4, 0x4EB3, 0x4EB3, 0x0832,\n    0x4EB6, 0x4EB6, 0x2363, 0x4EB7, 0x4EB7, 0x413C, 0x4EB9, 0x4EB9, 0x3377,\n    0x4EBA, 0x4EBA, 0x025B, 0x4EBB, 0x4EBB, 0x44E6, 0x4EBC, 0x4EBC, 0x39B1,\n    0x4EBF, 0x4EBF, 0x4590, 0x4EC0, 0x4EC0, 0x02A1, 0x4EC1, 0x4EC1, 0x02A0,\n    0x4EC2, 0x4EC2, 0x177D, 0x4EC3, 0x4EC3, 0x02A2, 0x4EC4, 0x4EC4, 0x02A8,\n    0x4EC6, 0x4EC7, 0x02A3, 0x4EC8, 0x4EC8, 0x177F, 0x4EC9, 0x4EC9, 0x177E,\n    0x4ECA, 0x4ECB, 0x02A6, 0x4ECD, 0x4ECD, 0x02A5, 0x4ECE, 0x4ECE, 0x3F62,\n    0x4ED4, 0x4ED7, 0x02FA, 0x4ED8, 0x4ED8, 0x02F9, 0x4ED9, 0x4ED9, 0x0300,\n    0x4EDA, 0x4EDA, 0x1795, 0x4EDC, 0x4EDC, 0x1791, 0x4EDD, 0x4EDD, 0x1794,\n    0x4EDE, 0x4EDE, 0x0301, 0x4EDF, 0x4EDF, 0x0311, 0x4EE1, 0x4EE1, 0x1793,\n    0x4EE3, 0x4EE4, 0x02FE, 0x4EE5, 0x4EE5, 0x02F8, 0x4EE8, 0x4EE8, 0x1790,\n    0x4EE9, 0x4EE9, 0x1792, 0x4EEA, 0x4EEA, 0x48CB, 0x4EEB, 0x4EEB, 0x4591,\n    0x4EEE, 0x4EEE, 0x3D76, 0x4EF0, 0x4EF0, 0x0383, 0x4EF1, 0x4EF1, 0x17BA,\n    0x4EF2, 0x4EF2, 0x0380, 0x4EF3, 0x4EF3, 0x0384, 0x4EF4, 0x4EF4, 0x17C4,\n    0x4EF5, 0x4EF5, 0x17B8, 0x4EF6, 0x4EF6, 0x0381, 0x4EF7, 0x4EF7, 0x17BC,\n    0x4EF8, 0x4EF8, 0x39AD, 0x4EFB, 0x4EFB, 0x0382, 0x4EFD, 0x4EFD, 0x0385,\n    0x4EFF, 0x4EFF, 0x0377, 0x4F00, 0x4F00, 0x17BB, 0x4F01, 0x4F01, 0x0386,\n    0x4F02, 0x4F02, 0x17BF, 0x4F03, 0x4F03, 0x39C8, 0x4F04, 0x4F04, 0x17C3,\n    0x4F05, 0x4F05, 0x17C0, 0x4F08, 0x4F08, 0x17BD, 0x4F09, 0x4F09, 0x0378,\n    0x4F0A, 0x4F0A, 0x037A, 0x4F0B, 0x4F0B, 0x0387, 0x4F0D, 0x4F0D, 0x037C,\n    0x4F0E, 0x4F0E, 0x17B5, 0x4F0F, 0x4F0F, 0x037F, 0x4F10, 0x4F11, 0x037D,\n    0x4F12, 0x4F12, 0x17C5, 0x4F13, 0x4F13, 0x17C2, 0x4F14, 0x4F14, 0x17B9,\n    0x4F15, 0x4F15, 0x037B, 0x4F18, 0x4F18, 0x17B6, 0x4F19, 0x4F19, 0x0379,\n    0x4F1A, 0x4F1A, 0x453C, 0x4F1D, 0x4F1D, 0x17BE, 0x4F22, 0x4F22, 0x17C1,\n    0x4F28, 0x4F28, 0x453D, 0x4F29, 0x4F29, 0x39BE, 0x4F2C, 0x4F2C, 0x17B7,\n    0x4F2D, 0x4F2D, 0x182F, 0x4F2F, 0x4F2F, 0x042C, 0x4F30, 0x4F30, 0x041F,\n    0x4F32, 0x4F32, 0x393D, 0x4F33, 0x4F33, 0x1830, 0x4F34, 0x4F34, 0x041C,\n    0x4F36, 0x4F36, 0x042E, 0x4F37, 0x4F37, 0x4592, 0x4F38, 0x4F38, 0x0424,\n    0x4F39, 0x4F39, 0x3F65, 0x4F3A, 0x4F3A, 0x0423, 0x4F3B, 0x4F3B, 0x1824,\n    0x4F3C, 0x4F3C, 0x0427, 0x4F3D, 0x4F3D, 0x0422, 0x4F3E, 0x4F3E, 0x1829,\n    0x4F3F, 0x4F3F, 0x1831, 0x4F41, 0x4F41, 0x182D, 0x4F42, 0x4F42, 0x39CB,\n    0x4F43, 0x4F43, 0x0425, 0x4F45, 0x4F45, 0x3B8F, 0x4F46, 0x4F46, 0x0428,\n    0x4F47, 0x4F47, 0x0419, 0x4F48, 0x4F48, 0x0431, 0x4F49, 0x4F49, 0x1826,\n    0x4F4B, 0x4F4B, 0x39B4, 0x4F4C, 0x4F4C, 0x1900, 0x4F4D, 0x4F4D, 0x0417,\n    0x4F4E, 0x4F4E, 0x042D, 0x4F4F, 0x4F4F, 0x0418, 0x4F50, 0x4F51, 0x0420,\n    0x4F52, 0x4F52, 0x182B, 0x4F53, 0x4F53, 0x1827, 0x4F54, 0x4F54, 0x0426,\n    0x4F55, 0x4F55, 0x041E, 0x4F56, 0x4F56, 0x1823, 0x4F57, 0x4F57, 0x041A,\n    0x4F58, 0x4F58, 0x182E, 0x4F59, 0x4F59, 0x042F, 0x4F5A, 0x4F5A, 0x0432,\n    0x4F5B, 0x4F5B, 0x041D, 0x4F5C, 0x4F5C, 0x042A, 0x4F5D, 0x4F5D, 0x0430,\n    0x4F5E, 0x4F5E, 0x041B, 0x4F5F, 0x4F5F, 0x182C, 0x4F60, 0x4F60, 0x042B,\n    0x4F61, 0x4F61, 0x1832, 0x4F62, 0x4F62, 0x1825, 0x4F63, 0x4F63, 0x0429,\n    0x4F64, 0x4F64, 0x1828, 0x4F67, 0x4F67, 0x182A, 0x4F69, 0x4F69, 0x053D,\n    0x4F6A, 0x4F6A, 0x1902, 0x4F6B, 0x4F6B, 0x190E, 0x4F6C, 0x4F6C, 0x0535,\n    0x4F6E, 0x4F6E, 0x190F, 0x4F6F, 0x4F6F, 0x0530, 0x4F70, 0x4F70, 0x053A,\n    0x4F72, 0x4F72, 0x3C72, 0x4F73, 0x4F73, 0x0533, 0x4F74, 0x4F74, 0x18FC,\n    0x4F75, 0x4F75, 0x053B, 0x4F76, 0x4F76, 0x18FB, 0x4F77, 0x4F77, 0x18FF,\n    0x4F78, 0x4F78, 0x1906, 0x4F79, 0x4F79, 0x1904, 0x4F7A, 0x4F7A, 0x0543,\n    0x4F7B, 0x4F7B, 0x053E, 0x4F7C, 0x4F7C, 0x18F6, 0x4F7D, 0x4F7D, 0x18F8,\n    0x4F7E, 0x4F7E, 0x0540, 0x4F7F, 0x4F7F, 0x0534, 0x4F80, 0x4F80, 0x18F9,\n    0x4F81, 0x4F81, 0x1905, 0x4F82, 0x4F82, 0x190C, 0x4F83, 0x4F83, 0x0539,\n    0x4F84, 0x4F84, 0x18FE, 0x4F85, 0x4F85, 0x18F7, 0x4F86, 0x4F86, 0x0538,\n    0x4F87, 0x4F87, 0x18FA, 0x4F88, 0x4F88, 0x053C, 0x4F89, 0x4F89, 0x18FD,\n    0x4F8A, 0x4F8A, 0x39B5, 0x4F8B, 0x4F8B, 0x0537, 0x4F8D, 0x4F8D, 0x0532,\n    0x4F8F, 0x4F8F, 0x0541, 0x4F90, 0x4F90, 0x1907, 0x4F91, 0x4F91, 0x0542,\n    0x4F92, 0x4F92, 0x190B, 0x4F94, 0x4F94, 0x1909, 0x4F95, 0x4F95, 0x190D,\n    0x4F96, 0x4F96, 0x053F, 0x4F97, 0x4F97, 0x1901, 0x4F98, 0x4F98, 0x18F5,\n    0x4F9A, 0x4F9A, 0x1903, 0x4F9B, 0x4F9B, 0x0536, 0x4F9C, 0x4F9C, 0x1908,\n    0x4F9D, 0x4F9D, 0x0531, 0x4F9E, 0x4F9E, 0x190A, 0x4FA2, 0x4FA2, 0x39C7,\n    0x4FA8, 0x4FA8, 0x453E, 0x4FAB, 0x4FAB, 0x4022, 0x4FAE, 0x4FAE, 0x06B4,\n    0x4FAF, 0x4FAF, 0x06A8, 0x4FB0, 0x4FB0, 0x3D4A, 0x4FB2, 0x4FB2, 0x1A5D,\n    0x4FB3, 0x4FB3, 0x1A65, 0x4FB5, 0x4FB5, 0x06A7, 0x4FB6, 0x4FB6, 0x06AF,\n    0x4FB7, 0x4FB7, 0x06BB, 0x4FB9, 0x4FB9, 0x1A6B, 0x4FBA, 0x4FBA, 0x1A69,\n    0x4FBB, 0x4FBB, 0x1A64, 0x4FBD, 0x4FBD, 0x4594, 0x4FBF, 0x4FBF, 0x06A9,\n    0x4FC0, 0x4FC0, 0x1A6A, 0x4FC1, 0x4FC1, 0x1A60, 0x4FC2, 0x4FC2, 0x06B7,\n    0x4FC3, 0x4FC3, 0x06AE, 0x4FC4, 0x4FC4, 0x06B6, 0x4FC5, 0x4FC5, 0x1A5B,\n    0x4FC7, 0x4FC7, 0x1A67, 0x4FC8, 0x4FC8, 0x46E8, 0x4FC9, 0x4FC9, 0x1A5E,\n    0x4FCA, 0x4FCA, 0x06B2, 0x4FCB, 0x4FCB, 0x1A5F, 0x4FCC, 0x4FCC, 0x39CF,\n    0x4FCD, 0x4FCD, 0x1A5A, 0x4FCE, 0x4FCE, 0x06B9, 0x4FCF, 0x4FCF, 0x06AC,\n    0x4FD0, 0x4FD0, 0x06B5, 0x4FD1, 0x4FD1, 0x06AB, 0x4FD3, 0x4FD3, 0x1A5C,\n    0x4FD4, 0x4FD4, 0x1A61, 0x4FD6, 0x4FD6, 0x1A68, 0x4FD7, 0x4FD7, 0x06B3,\n    0x4FD8, 0x4FD8, 0x06B0, 0x4FD9, 0x4FD9, 0x1A63, 0x4FDA, 0x4FDA, 0x06B8,\n    0x4FDB, 0x4FDB, 0x1A66, 0x4FDC, 0x4FDC, 0x1A62, 0x4FDD, 0x4FDD, 0x06AD,\n    0x4FDE, 0x4FDE, 0x06BA, 0x4FDF, 0x4FDF, 0x06B1, 0x4FE0, 0x4FE0, 0x06AA,\n    0x4FE1, 0x4FE1, 0x06A6, 0x4FE4, 0x4FE4, 0x3C66, 0x4FE5, 0x4FE5, 0x39D0,\n    0x4FEC, 0x4FEC, 0x1A6C, 0x4FEE, 0x4FEE, 0x084C, 0x4FEF, 0x4FEF, 0x0836,\n    0x4FF1, 0x4FF1, 0x0846, 0x4FF2, 0x4FF2, 0x3F28, 0x4FF3, 0x4FF3, 0x084B,\n    0x4FF4, 0x4FF4, 0x1C24, 0x4FF5, 0x4FF5, 0x1C23, 0x4FF6, 0x4FF7, 0x1C28,\n    0x4FF8, 0x4FF8, 0x0839, 0x4FF9, 0x4FF9, 0x37B3, 0x4FFA, 0x4FFA, 0x0842,\n    0x4FFD, 0x4FFD, 0x3F26, 0x4FFE, 0x4FFE, 0x084F, 0x5000, 0x5000, 0x0843,\n    0x5003, 0x5003, 0x4596, 0x5005, 0x5005, 0x1C1D, 0x5006, 0x5006, 0x083C,\n    0x5007, 0x5007, 0x1C1E, 0x5008, 0x5008, 0x4024, 0x5009, 0x5009, 0x0851,\n    0x500B, 0x500B, 0x0848, 0x500C, 0x500D, 0x0833, 0x500E, 0x500E, 0x1C31,\n    0x500F, 0x500F, 0x0A0C, 0x5011, 0x5011, 0x0841, 0x5012, 0x5012, 0x0840,\n    0x5013, 0x5013, 0x1C1F, 0x5014, 0x5014, 0x0844, 0x5015, 0x5015, 0x1E45,\n    0x5016, 0x5016, 0x083B, 0x5017, 0x5017, 0x1C2A, 0x5018, 0x5018, 0x084A,\n    0x5019, 0x5019, 0x0849, 0x501A, 0x501A, 0x083F, 0x501B, 0x501B, 0x1C22,\n    0x501C, 0x501C, 0x1C2B, 0x501E, 0x501E, 0x1C1C, 0x501F, 0x501F, 0x083E,\n    0x5020, 0x5020, 0x1C2C, 0x5021, 0x5021, 0x0847, 0x5022, 0x5022, 0x1C20,\n    0x5023, 0x5023, 0x0835, 0x5025, 0x5025, 0x0838, 0x5026, 0x5026, 0x0837,\n    0x5027, 0x5027, 0x1C2D, 0x5028, 0x5028, 0x0845, 0x5029, 0x5029, 0x083A,\n    0x502A, 0x502A, 0x084E, 0x502B, 0x502B, 0x0850, 0x502C, 0x502C, 0x1C27,\n    0x502D, 0x502D, 0x084D, 0x502E, 0x502E, 0x39CC, 0x502F, 0x502F, 0x1C2F,\n    0x5030, 0x5030, 0x1C21, 0x5031, 0x5031, 0x1C30, 0x5033, 0x5033, 0x1C25,\n    0x5034, 0x5034, 0x3910, 0x5035, 0x5035, 0x1C2E, 0x5037, 0x5037, 0x1C26,\n    0x503C, 0x503C, 0x083D, 0x5040, 0x5040, 0x1E4D, 0x5041, 0x5041, 0x1E41,\n    0x5043, 0x5043, 0x0A00, 0x5045, 0x5045, 0x1E46, 0x5046, 0x5046, 0x1E4C,\n    0x5047, 0x5047, 0x09FF, 0x5048, 0x5048, 0x1E3F, 0x5049, 0x5049, 0x0A03,\n    0x504A, 0x504A, 0x1E43, 0x504B, 0x504B, 0x1E3C, 0x504C, 0x504C, 0x0A01,\n    0x504D, 0x504D, 0x1E40, 0x504E, 0x504E, 0x0A06, 0x504F, 0x504F, 0x0A0B,\n    0x5051, 0x5051, 0x1E51, 0x5053, 0x5053, 0x1E3B, 0x5055, 0x5055, 0x0A07,\n    0x5056, 0x5056, 0x3F2C, 0x5057, 0x5057, 0x1E50, 0x5058, 0x5058, 0x39D1,\n    0x505A, 0x505A, 0x0A02, 0x505B, 0x505B, 0x1E42, 0x505C, 0x505C, 0x09FE,\n    0x505D, 0x505D, 0x1E3D, 0x505E, 0x505E, 0x1E39, 0x505F, 0x505F, 0x1E47,\n    0x5060, 0x5060, 0x1E3A, 0x5061, 0x5061, 0x1E38, 0x5062, 0x5062, 0x1E44,\n    0x5063, 0x5064, 0x1E4A, 0x5065, 0x5065, 0x0A04, 0x5066, 0x5066, 0x3DC9,\n    0x5068, 0x5068, 0x20B8, 0x5069, 0x5069, 0x1E48, 0x506A, 0x506A, 0x1E37,\n    0x506B, 0x506B, 0x1E49, 0x506C, 0x506C, 0x39CD, 0x506D, 0x506D, 0x0A0E,\n    0x506E, 0x506E, 0x1E4E, 0x506F, 0x506F, 0x0A0D, 0x5070, 0x5070, 0x1E36,\n    0x5072, 0x5072, 0x1E3E, 0x5073, 0x5073, 0x1E4F, 0x5074, 0x5074, 0x0A09,\n    0x5075, 0x5075, 0x0A08, 0x5076, 0x5076, 0x0A05, 0x5077, 0x5077, 0x0A0A,\n    0x507A, 0x507A, 0x09FC, 0x507D, 0x507D, 0x09FD, 0x5080, 0x5080, 0x0BEC,\n    0x5081, 0x5081, 0x39CE, 0x5082, 0x5082, 0x20BB, 0x5083, 0x5083, 0x20B4,\n    0x5085, 0x5085, 0x0BE9, 0x5087, 0x5087, 0x20BC, 0x5088, 0x5088, 0x439C,\n    0x508B, 0x508B, 0x20B2, 0x508C, 0x508C, 0x20B5, 0x508D, 0x508D, 0x0BE8,\n    0x508E, 0x508E, 0x20B6, 0x5090, 0x5090, 0x41EC, 0x5091, 0x5091, 0x0BEB,\n    0x5092, 0x5092, 0x20BA, 0x5094, 0x5094, 0x20B0, 0x5095, 0x5095, 0x20AF,\n    0x5096, 0x5096, 0x0BED, 0x5098, 0x5098, 0x0BEE, 0x5099, 0x5099, 0x0BEA,\n    0x509A, 0x509A, 0x0BEF, 0x509B, 0x509B, 0x20AE, 0x509C, 0x509C, 0x20B9,\n    0x509D, 0x509D, 0x20B7, 0x509E, 0x509E, 0x20B1, 0x50A2, 0x50A2, 0x0BE7,\n    0x50A3, 0x50A3, 0x20B3, 0x50A6, 0x50A6, 0x3F3F, 0x50AC, 0x50AC, 0x0DC5,\n    0x50AD, 0x50AD, 0x0DBF, 0x50AE, 0x50AE, 0x2367, 0x50AF, 0x50AF, 0x0DC8,\n    0x50B0, 0x50B0, 0x236D, 0x50B1, 0x50B1, 0x2370, 0x50B2, 0x50B3, 0x0DC1,\n    0x50B4, 0x50B4, 0x236A, 0x50B5, 0x50B5, 0x0DC0, 0x50B6, 0x50B6, 0x2373,\n    0x50B7, 0x50B7, 0x0DC6, 0x50B8, 0x50B8, 0x2374, 0x50BA, 0x50BA, 0x236F,\n    0x50BB, 0x50BB, 0x0DC7, 0x50BD, 0x50BD, 0x2364, 0x50BE, 0x50BE, 0x0DC4,\n    0x50BF, 0x50BF, 0x2365, 0x50C1, 0x50C1, 0x236E, 0x50C2, 0x50C2, 0x236C,\n    0x50C4, 0x50C4, 0x2368, 0x50C5, 0x50C5, 0x0DC3, 0x50C6, 0x50C6, 0x2366,\n    0x50C7, 0x50C7, 0x0DC9, 0x50C8, 0x50C8, 0x236B, 0x50C9, 0x50C9, 0x2372,\n    0x50CA, 0x50CA, 0x2369, 0x50CB, 0x50CB, 0x2371, 0x50CD, 0x50CD, 0x39C5,\n    0x50CE, 0x50CE, 0x0F88, 0x50CF, 0x50CF, 0x0F85, 0x50D0, 0x50D0, 0x38D1,\n    0x50D1, 0x50D1, 0x0F86, 0x50D3, 0x50D3, 0x261C, 0x50D4, 0x50D4, 0x2614,\n    0x50D5, 0x50D5, 0x0F84, 0x50D6, 0x50D6, 0x0F81, 0x50D7, 0x50D7, 0x2615,\n    0x50D9, 0x50D9, 0x3FCE, 0x50DA, 0x50DA, 0x0F83, 0x50DB, 0x50DB, 0x2618,\n    0x50DD, 0x50DD, 0x261A, 0x50DE, 0x50DE, 0x4031, 0x50DF, 0x50DF, 0x3AFD,\n    0x50E0, 0x50E0, 0x2621, 0x50E1, 0x50E1, 0x4171, 0x50E3, 0x50E3, 0x2620,\n    0x50E4, 0x50E4, 0x261B, 0x50E5, 0x50E5, 0x0F80, 0x50E6, 0x50E6, 0x2613,\n    0x50E7, 0x50E7, 0x0F7E, 0x50E8, 0x50E8, 0x2616, 0x50E9, 0x50E9, 0x0F89,\n    0x50EA, 0x50EA, 0x2619, 0x50EC, 0x50EC, 0x261D, 0x50ED, 0x50ED, 0x0F82,\n    0x50EE, 0x50EE, 0x0F7F, 0x50EF, 0x50EF, 0x261F, 0x50F0, 0x50F0, 0x261E,\n    0x50F1, 0x50F1, 0x0F87, 0x50F3, 0x50F3, 0x2617, 0x50F4, 0x50F4, 0x3CE9,\n    0x50F5, 0x50F5, 0x1105, 0x50F6, 0x50F6, 0x2883, 0x50F8, 0x50F8, 0x2880,\n    0x50F9, 0x50F9, 0x1106, 0x50FB, 0x50FB, 0x1104, 0x50FC, 0x50FC, 0x39D2,\n    0x50FD, 0x50FD, 0x2887, 0x50FE, 0x50FE, 0x2884, 0x50FF, 0x50FF, 0x287D,\n    0x5100, 0x5100, 0x1103, 0x5101, 0x5101, 0x4032, 0x5102, 0x5102, 0x1107,\n    0x5103, 0x5103, 0x287E, 0x5104, 0x5104, 0x1102, 0x5105, 0x5105, 0x110A,\n    0x5106, 0x5107, 0x2881, 0x5108, 0x5109, 0x1108, 0x510A, 0x510A, 0x2888,\n    0x510B, 0x510C, 0x2885, 0x510D, 0x510D, 0x39C6, 0x510E, 0x510E, 0x4034,\n    0x5110, 0x5110, 0x128D, 0x5111, 0x5111, 0x2B04, 0x5112, 0x5112, 0x128A,\n    0x5113, 0x5113, 0x2B01, 0x5114, 0x5114, 0x128C, 0x5115, 0x5115, 0x128E,\n    0x5117, 0x5117, 0x2B02, 0x5118, 0x5118, 0x128B, 0x511A, 0x511A, 0x2B03,\n    0x511C, 0x511C, 0x2B00, 0x511F, 0x511F, 0x13B5, 0x5120, 0x5120, 0x2D3E,\n    0x5121, 0x5121, 0x13B6, 0x5122, 0x5122, 0x2D3C, 0x5124, 0x5124, 0x2D3D,\n    0x5125, 0x5125, 0x2D3B, 0x5126, 0x5126, 0x2D3A, 0x5129, 0x5129, 0x2D3F,\n    0x512A, 0x512A, 0x13B4, 0x512B, 0x512B, 0x39AE, 0x512D, 0x512E, 0x2F0F,\n    0x5130, 0x5130, 0x287F, 0x5131, 0x5131, 0x2F0E, 0x5132, 0x5132, 0x13B7,\n    0x5133, 0x5133, 0x1575, 0x5134, 0x5135, 0x307A, 0x5137, 0x5138, 0x1668,\n    0x5139, 0x5139, 0x32C6, 0x513A, 0x513A, 0x32C5, 0x513B, 0x513B, 0x16BC,\n    0x513C, 0x513C, 0x16BB, 0x513D, 0x513D, 0x340E, 0x513F, 0x513F, 0x025C,\n    0x5140, 0x5140, 0x0274, 0x5141, 0x5141, 0x02AA, 0x5143, 0x5143, 0x02A9,\n    0x5144, 0x5144, 0x0303, 0x5145, 0x5145, 0x0302, 0x5146, 0x5146, 0x038A,\n    0x5147, 0x5147, 0x0389, 0x5148, 0x5148, 0x038B, 0x5149, 0x5149, 0x0388,\n    0x514B, 0x514B, 0x0434, 0x514C, 0x514C, 0x0433, 0x514D, 0x514D, 0x0435,\n    0x5152, 0x5152, 0x0545, 0x5154, 0x5154, 0x0544, 0x5155, 0x5155, 0x0546,\n    0x5156, 0x5156, 0x439A, 0x5157, 0x5157, 0x06BC, 0x5159, 0x5159, 0x0119,\n    0x515A, 0x515A, 0x1C32, 0x515B, 0x515B, 0x011A, 0x515C, 0x515C, 0x0A0F,\n    0x515D, 0x515D, 0x011C, 0x515E, 0x515E, 0x011B, 0x515F, 0x515F, 0x20BD,\n    0x5160, 0x5160, 0x403A, 0x5161, 0x5161, 0x011D, 0x5162, 0x5162, 0x0F8A,\n    0x5163, 0x5163, 0x011E, 0x5165, 0x5165, 0x025D, 0x5167, 0x5167, 0x02AB,\n    0x5168, 0x5168, 0x038C, 0x5169, 0x5169, 0x0547, 0x516A, 0x516A, 0x403C,\n    0x516B, 0x516B, 0x025E, 0x516C, 0x516C, 0x02AE, 0x516D, 0x516E, 0x02AC,\n    0x5171, 0x5171, 0x038D, 0x5174, 0x5174, 0x453F, 0x5175, 0x5175, 0x0436,\n    0x5176, 0x5176, 0x0549, 0x5177, 0x5177, 0x0548, 0x5178, 0x5178, 0x054A,\n    0x5179, 0x5179, 0x3ACE, 0x517C, 0x517C, 0x0852, 0x5180, 0x5180, 0x128F,\n    0x5182, 0x5182, 0x021D, 0x5186, 0x5186, 0x439F, 0x5187, 0x5187, 0x1779,\n    0x5188, 0x5188, 0x36B6, 0x5189, 0x518A, 0x0304, 0x518D, 0x518D, 0x038E,\n    0x518F, 0x518F, 0x1833, 0x5191, 0x5191, 0x06BE, 0x5192, 0x5192, 0x06BD,\n    0x5193, 0x5193, 0x1C34, 0x5194, 0x5194, 0x1C33, 0x5195, 0x5195, 0x0A10,\n    0x5196, 0x5196, 0x021E, 0x5197, 0x5197, 0x02AF, 0x5198, 0x5198, 0x1780,\n    0x519A, 0x519A, 0x3EA3, 0x519C, 0x519C, 0x4540, 0x519E, 0x519E, 0x1910,\n    0x51A0, 0x51A0, 0x06BF, 0x51A2, 0x51A2, 0x0855, 0x51A4, 0x51A5, 0x0853,\n    0x51A7, 0x51A7, 0x3EA6, 0x51A8, 0x51A8, 0x39DA, 0x51AA, 0x51AA, 0x1290,\n    0x51AB, 0x51AB, 0x021F, 0x51AC, 0x51AC, 0x0306, 0x51B0, 0x51B0, 0x038F,\n    0x51B1, 0x51B1, 0x17C6, 0x51B2, 0x51B2, 0x4048, 0x51B3, 0x51B3, 0x4051,\n    0x51B4, 0x51B4, 0x3D7C, 0x51B5, 0x51B5, 0x4012, 0x51B6, 0x51B7, 0x0437,\n    0x51B8, 0x51B8, 0x4049, 0x51B9, 0x51B9, 0x1834, 0x51BC, 0x51BC, 0x1911,\n    0x51BD, 0x51BD, 0x054B, 0x51BE, 0x51BE, 0x1912, 0x51C3, 0x51C3, 0x39DB,\n    0x51C4, 0x51C5, 0x1C36, 0x51C6, 0x51C6, 0x0858, 0x51C7, 0x51C7, 0x422A,\n    0x51C8, 0x51C8, 0x1C38, 0x51C9, 0x51C9, 0x404B, 0x51CA, 0x51CA, 0x1C35,\n    0x51CB, 0x51CB, 0x0859, 0x51CC, 0x51CC, 0x0857, 0x51CD, 0x51CD, 0x0856,\n    0x51CE, 0x51CE, 0x1C39, 0x51CF, 0x51CF, 0x404C, 0x51D0, 0x51D0, 0x1E52,\n    0x51D1, 0x51D1, 0x404D, 0x51D2, 0x51D2, 0x3DAD, 0x51D3, 0x51D3, 0x404F,\n    0x51D4, 0x51D4, 0x20BE, 0x51D7, 0x51D7, 0x2375, 0x51D8, 0x51D8, 0x2622,\n    0x51DB, 0x51DB, 0x459A, 0x51DC, 0x51DC, 0x110B, 0x51DD, 0x51DD, 0x1291,\n    0x51DE, 0x51DE, 0x2B05, 0x51DF, 0x51DF, 0x424F, 0x51E0, 0x51E0, 0x025F,\n    0x51E1, 0x51E1, 0x026D, 0x51E2, 0x51E2, 0x4052, 0x51E4, 0x51E4, 0x4541,\n    0x51ED, 0x51ED, 0x4054, 0x51F0, 0x51F0, 0x0A11, 0x51F1, 0x51F1, 0x0BF1,\n    0x51F3, 0x51F3, 0x0F8B, 0x51F4, 0x51F4, 0x4178, 0x51F5, 0x51F5, 0x176E,\n    0x51F6, 0x51F6, 0x02B0, 0x51F8, 0x51F8, 0x0309, 0x51F9, 0x51FA, 0x0307,\n    0x51FC, 0x51FC, 0x459B, 0x51FD, 0x51FD, 0x054C, 0x51FE, 0x51FE, 0x3F0A,\n    0x5200, 0x5201, 0x0260, 0x5202, 0x5202, 0x36B3, 0x5203, 0x5203, 0x0275,\n    0x5205, 0x5205, 0x43A1, 0x5206, 0x5208, 0x02B1, 0x5209, 0x5209, 0x1797,\n    0x520A, 0x520A, 0x030A, 0x520B, 0x520B, 0x4059, 0x520C, 0x520C, 0x1796,\n    0x520E, 0x520E, 0x0393, 0x5210, 0x5210, 0x17C8, 0x5211, 0x5212, 0x0391,\n    0x5213, 0x5213, 0x17C7, 0x5216, 0x5216, 0x0394, 0x5217, 0x5217, 0x0390,\n    0x521C, 0x521C, 0x1835, 0x521D, 0x521D, 0x068B, 0x521E, 0x521E, 0x1836,\n    0x521F, 0x521F, 0x3F60, 0x5220, 0x5220, 0x4930, 0x5221, 0x5221, 0x1837,\n    0x5224, 0x5224, 0x043A, 0x5225, 0x5225, 0x0439, 0x5226, 0x5226, 0x405A,\n    0x5227, 0x5227, 0x43A2, 0x5228, 0x5228, 0x043D, 0x5229, 0x522A, 0x043B,\n    0x522E, 0x522E, 0x0552, 0x5230, 0x5230, 0x0551, 0x5231, 0x5231, 0x1917,\n    0x5232, 0x5233, 0x1914, 0x5234, 0x5234, 0x3EFB, 0x5235, 0x5235, 0x1913,\n    0x5236, 0x5236, 0x0553, 0x5237, 0x5237, 0x054F, 0x5238, 0x5238, 0x054E,\n    0x523A, 0x523A, 0x0550, 0x523B, 0x523B, 0x054D, 0x523C, 0x523C, 0x405B,\n    0x5241, 0x5241, 0x0554, 0x5243, 0x5243, 0x06C1, 0x5244, 0x5244, 0x1A6D,\n    0x5246, 0x5246, 0x1916, 0x5247, 0x5247, 0x06C6, 0x5249, 0x5249, 0x1A6E,\n    0x524A, 0x524A, 0x06C2, 0x524B, 0x524B, 0x06C5, 0x524C, 0x524C, 0x06C4,\n    0x524D, 0x524D, 0x06C3, 0x524E, 0x524E, 0x06C0, 0x5252, 0x5252, 0x1C3C,\n    0x5254, 0x5254, 0x085C, 0x5255, 0x5255, 0x1C3F, 0x5256, 0x5256, 0x085A,\n    0x5257, 0x5257, 0x405D, 0x5259, 0x5259, 0x39E4, 0x525A, 0x525A, 0x1C3B,\n    0x525B, 0x525B, 0x085D, 0x525C, 0x525C, 0x085B, 0x525D, 0x525D, 0x085E,\n    0x525E, 0x525F, 0x1C3D, 0x5260, 0x5260, 0x3F29, 0x5261, 0x5261, 0x1C3A,\n    0x5262, 0x5262, 0x1C40, 0x5268, 0x5268, 0x4619, 0x5269, 0x5269, 0x0BF5,\n    0x526A, 0x526A, 0x0A12, 0x526B, 0x526B, 0x1E53, 0x526C, 0x526C, 0x1E55,\n    0x526D, 0x526D, 0x1E54, 0x526E, 0x526E, 0x1E56, 0x526F, 0x526F, 0x0A13,\n    0x5272, 0x5272, 0x0BF2, 0x5273, 0x5273, 0x3F43, 0x5274, 0x5275, 0x0BF3,\n    0x5277, 0x5277, 0x0DCB, 0x5278, 0x5278, 0x2377, 0x5279, 0x5279, 0x43A3,\n    0x527A, 0x527A, 0x2376, 0x527B, 0x527C, 0x2378, 0x527D, 0x527D, 0x0DCC,\n    0x527F, 0x527F, 0x0DCA, 0x5280, 0x5281, 0x2623, 0x5282, 0x5282, 0x0F8D,\n    0x5283, 0x5283, 0x0F8C, 0x5284, 0x5284, 0x2776, 0x5287, 0x5289, 0x110C,\n    0x528A, 0x528A, 0x1110, 0x528B, 0x528C, 0x2889, 0x528D, 0x528D, 0x110F,\n    0x528F, 0x528F, 0x3DBF, 0x5290, 0x5290, 0x459D, 0x5291, 0x5291, 0x1292,\n    0x5293, 0x5293, 0x1293, 0x5294, 0x5294, 0x405E, 0x5296, 0x5296, 0x307C,\n    0x5297, 0x5297, 0x32C8, 0x5298, 0x5298, 0x32C7, 0x5299, 0x5299, 0x340F,\n    0x529A, 0x529A, 0x3F68, 0x529B, 0x529B, 0x0262, 0x529F, 0x529F, 0x030C,\n    0x52A0, 0x52A0, 0x030B, 0x52A1, 0x52A1, 0x4542, 0x52A3, 0x52A3, 0x0395,\n    0x52A4, 0x52A4, 0x39E5, 0x52A6, 0x52A6, 0x17C9, 0x52A8, 0x52A8, 0x4543,\n    0x52A9, 0x52AA, 0x043F, 0x52AB, 0x52AB, 0x043E, 0x52AC, 0x52AC, 0x0441,\n    0x52AD, 0x52AE, 0x1838, 0x52B5, 0x52B5, 0x405C, 0x52B9, 0x52B9, 0x405F,\n    0x52BB, 0x52BB, 0x0556, 0x52BC, 0x52BC, 0x1918, 0x52BE, 0x52BE, 0x0555,\n    0x52C0, 0x52C0, 0x1A6F, 0x52C1, 0x52C1, 0x06CA, 0x52C2, 0x52C2, 0x1A70,\n    0x52C3, 0x52C3, 0x06C9, 0x52C5, 0x52C5, 0x4060, 0x52C7, 0x52C7, 0x06C7,\n    0x52C9, 0x52C9, 0x06C8, 0x52CC, 0x52CC, 0x3EE1, 0x52CD, 0x52CD, 0x1C41,\n    0x52D0, 0x52D0, 0x4109, 0x52D1, 0x52D1, 0x3F2A, 0x52D2, 0x52D2, 0x0A14,\n    0x52D3, 0x52D3, 0x1E58, 0x52D5, 0x52D5, 0x0A17, 0x52D6, 0x52D6, 0x1E57,\n    0x52D7, 0x52D7, 0x0ACF, 0x52D8, 0x52D8, 0x0A16, 0x52D9, 0x52D9, 0x0A15,\n    0x52DB, 0x52DB, 0x0BF8, 0x52DD, 0x52DD, 0x0BF7, 0x52DE, 0x52DE, 0x0BF6,\n    0x52DF, 0x52DF, 0x0DCD, 0x52E0, 0x52E0, 0x4063, 0x52E1, 0x52E1, 0x39E7,\n    0x52E2, 0x52E3, 0x0DD0, 0x52E4, 0x52E4, 0x0DCF, 0x52E6, 0x52E6, 0x0DCE,\n    0x52E9, 0x52E9, 0x2625, 0x52EB, 0x52EB, 0x2626, 0x52EF, 0x52EF, 0x288C,\n    0x52F0, 0x52F0, 0x1111, 0x52F1, 0x52F1, 0x288B, 0x52F3, 0x52F3, 0x1294,\n    0x52F4, 0x52F4, 0x2D40, 0x52F5, 0x52F5, 0x13B8, 0x52F7, 0x52F7, 0x307D,\n    0x52F8, 0x52F8, 0x1609, 0x52F9, 0x52F9, 0x0220, 0x52FA, 0x52FA, 0x0276,\n    0x52FB, 0x52FB, 0x02B4, 0x52FC, 0x52FC, 0x1781, 0x52FE, 0x52FF, 0x02B5,\n    0x5301, 0x5301, 0x3D79, 0x5305, 0x5306, 0x030D, 0x5308, 0x5308, 0x0396,\n    0x5309, 0x5309, 0x183A, 0x530A, 0x530B, 0x1919, 0x530D, 0x530D, 0x06CB,\n    0x530E, 0x530E, 0x1C42, 0x530F, 0x530F, 0x0A19, 0x5310, 0x5310, 0x0A18,\n    0x5311, 0x5311, 0x20C0, 0x5312, 0x5312, 0x20BF, 0x5315, 0x5315, 0x0263,\n    0x5316, 0x5316, 0x02B7, 0x5317, 0x5317, 0x030F, 0x5319, 0x5319, 0x0A1A,\n    0x531A, 0x531A, 0x176F, 0x531C, 0x531C, 0x1798, 0x531D, 0x531D, 0x0310,\n    0x531F, 0x531F, 0x17CB, 0x5320, 0x5320, 0x0398, 0x5321, 0x5321, 0x0397,\n    0x5322, 0x5322, 0x17CA, 0x5323, 0x5323, 0x0442, 0x5327, 0x5327, 0x459E,\n    0x532A, 0x532A, 0x085F, 0x532C, 0x532C, 0x3F36, 0x532D, 0x532D, 0x1E59,\n    0x532F, 0x532F, 0x0DD2, 0x5330, 0x5330, 0x2627, 0x5331, 0x5331, 0x0F8E,\n    0x5332, 0x5332, 0x3FD0, 0x5333, 0x5333, 0x406D, 0x5334, 0x5334, 0x2B06,\n    0x5337, 0x5337, 0x31C7, 0x5338, 0x5338, 0x0221, 0x5339, 0x5339, 0x02B8,\n    0x533B, 0x533B, 0x4544, 0x533C, 0x533C, 0x191B, 0x533D, 0x533D, 0x1A71,\n    0x533E, 0x533E, 0x0A1D, 0x533F, 0x5340, 0x0A1B, 0x5341, 0x5341, 0x0264,\n    0x5342, 0x5342, 0x4947, 0x5343, 0x5343, 0x0277, 0x5344, 0x5344, 0x016B,\n    0x5345, 0x5345, 0x02BB, 0x5347, 0x5347, 0x02BA, 0x5348, 0x5348, 0x02B9,\n    0x5349, 0x5349, 0x0313, 0x534A, 0x534A, 0x0312, 0x534C, 0x534C, 0x1799,\n    0x534D, 0x534D, 0x17CC, 0x534E, 0x534E, 0x4545, 0x5351, 0x5351, 0x055A,\n    0x5352, 0x5352, 0x0557, 0x5353, 0x5353, 0x0559, 0x5354, 0x5354, 0x0558,\n    0x5357, 0x5357, 0x06CC, 0x535A, 0x535A, 0x0BF9, 0x535C, 0x535C, 0x0265,\n    0x535D, 0x535D, 0x4501, 0x535E, 0x535E, 0x02BC, 0x535F, 0x535F, 0x43A7,\n    0x5360, 0x5360, 0x0315, 0x5361, 0x5361, 0x0314, 0x5363, 0x5363, 0x183B,\n    0x5364, 0x5364, 0x480A, 0x5366, 0x5366, 0x055B, 0x5367, 0x5367, 0x3ECD,\n    0x5369, 0x5369, 0x0222, 0x536C, 0x536C, 0x1782, 0x536D, 0x536D, 0x407A,\n    0x536E, 0x536E, 0x0317, 0x536F, 0x536F, 0x0316, 0x5370, 0x5371, 0x0399,\n    0x5372, 0x5372, 0x183C, 0x5373, 0x5373, 0x0443, 0x5374, 0x5374, 0x407B,\n    0x5375, 0x5375, 0x0444, 0x5377, 0x5379, 0x055C, 0x537B, 0x537B, 0x06CD,\n    0x537C, 0x537C, 0x1A72, 0x537D, 0x537D, 0x4901, 0x537E, 0x537E, 0x407D,\n    0x537F, 0x537F, 0x0860, 0x5382, 0x5382, 0x1770, 0x5384, 0x5384, 0x02BD,\n    0x538A, 0x538A, 0x17CD, 0x538E, 0x538F, 0x183D, 0x5392, 0x5392, 0x191C,\n    0x5393, 0x5393, 0x4082, 0x5394, 0x5394, 0x191D, 0x5396, 0x5396, 0x1A74,\n    0x5397, 0x5397, 0x1A73, 0x5398, 0x5398, 0x1A76, 0x5399, 0x5399, 0x1A75,\n    0x539A, 0x539A, 0x06CE, 0x539C, 0x539C, 0x1E5A, 0x539D, 0x539D, 0x0862,\n    0x539E, 0x539E, 0x1C43, 0x539F, 0x539F, 0x0861, 0x53A0, 0x53A0, 0x4084,\n    0x53A2, 0x53A2, 0x3E2B, 0x53A4, 0x53A4, 0x20C1, 0x53A5, 0x53A5, 0x0BFA,\n    0x53A6, 0x53A6, 0x413B, 0x53A7, 0x53A7, 0x20C2, 0x53A8, 0x53A8, 0x413E,\n    0x53A9, 0x53A9, 0x45A0, 0x53AA, 0x53AA, 0x3FC6, 0x53AB, 0x53AB, 0x4085,\n    0x53AC, 0x53AC, 0x2628, 0x53AD, 0x53AD, 0x0F8F, 0x53AE, 0x53AE, 0x4086,\n    0x53B0, 0x53B0, 0x45A2, 0x53B2, 0x53B2, 0x1112, 0x53B4, 0x53B4, 0x307E,\n    0x53B6, 0x53B6, 0x0223, 0x53B9, 0x53B9, 0x1783, 0x53BB, 0x53BB, 0x0318,\n    0x53C1, 0x53C1, 0x408B, 0x53C2, 0x53C2, 0x43A6, 0x53C3, 0x53C3, 0x0A1E,\n    0x53C5, 0x53C5, 0x408C, 0x53C8, 0x53C8, 0x0266, 0x53C9, 0x53C9, 0x0278,\n    0x53CA, 0x53CA, 0x02BF, 0x53CB, 0x53CB, 0x02BE, 0x53CC, 0x53CC, 0x38B6,\n    0x53CD, 0x53CD, 0x02C0, 0x53D0, 0x53D0, 0x39FA, 0x53D1, 0x53D1, 0x4546,\n    0x53D2, 0x53D2, 0x3E3D, 0x53D4, 0x53D4, 0x0560, 0x53D6, 0x53D6, 0x055F,\n    0x53D7, 0x53D7, 0x0561, 0x53D8, 0x53D8, 0x4547, 0x53D9, 0x53D9, 0x4090,\n    0x53DA, 0x53DA, 0x3F39, 0x53DB, 0x53DB, 0x06CF, 0x53DF, 0x53DF, 0x0863,\n    0x53E0, 0x53E0, 0x4093, 0x53E1, 0x53E1, 0x2B07, 0x53E2, 0x53E2, 0x14C9,\n    0x53E3, 0x53E3, 0x0279, 0x53E4, 0x53E4, 0x031A, 0x53E5, 0x53E5, 0x0329,\n    0x53E6, 0x53E6, 0x0324, 0x53E8, 0x53E8, 0x031F, 0x53E9, 0x53E9, 0x031E,\n    0x53EA, 0x53EA, 0x0325, 0x53EB, 0x53EB, 0x0323, 0x53EC, 0x53EC, 0x031C,\n    0x53ED, 0x53ED, 0x032A, 0x53EE, 0x53EE, 0x031D, 0x53EF, 0x53EF, 0x0319,\n    0x53F0, 0x53F0, 0x0328, 0x53F1, 0x53F1, 0x0327, 0x53F2, 0x53F2, 0x0326,\n    0x53F3, 0x53F3, 0x031B, 0x53F5, 0x53F5, 0x0322, 0x53F6, 0x53F6, 0x4096,\n    0x53F7, 0x53F7, 0x3808, 0x53F8, 0x53F8, 0x0321, 0x53FB, 0x53FB, 0x032B,\n    0x53FC, 0x53FC, 0x0320, 0x53FE, 0x53FE, 0x40C1, 0x5401, 0x5401, 0x03A0,\n    0x5403, 0x5403, 0x03A6, 0x5404, 0x5404, 0x03A2, 0x5406, 0x5406, 0x03A8,\n    0x5407, 0x5407, 0x17CE, 0x5408, 0x5408, 0x03A5, 0x5409, 0x5409, 0x039B,\n    0x540A, 0x540A, 0x039E, 0x540B, 0x540B, 0x03A1, 0x540C, 0x540C, 0x039D,\n    0x540D, 0x540D, 0x03A4, 0x540E, 0x540E, 0x03A7, 0x540F, 0x540F, 0x039C,\n    0x5410, 0x5410, 0x039F, 0x5411, 0x5411, 0x03A3, 0x5412, 0x5412, 0x03A9,\n    0x5413, 0x5413, 0x4098, 0x5414, 0x5414, 0x3C77, 0x5416, 0x5416, 0x3E7F,\n    0x5418, 0x5418, 0x1847, 0x5419, 0x5419, 0x1844, 0x541A, 0x541A, 0x3E64,\n    0x541B, 0x541B, 0x0451, 0x541C, 0x541C, 0x1845, 0x541D, 0x541D, 0x0445,\n    0x541E, 0x541E, 0x0447, 0x541F, 0x541F, 0x045F, 0x5420, 0x5420, 0x045A,\n    0x5421, 0x5421, 0x4203, 0x5423, 0x5423, 0x45A3, 0x5424, 0x5424, 0x184C,\n    0x5425, 0x5425, 0x1846, 0x5426, 0x5426, 0x0449, 0x5427, 0x5427, 0x044B,\n    0x5428, 0x5428, 0x184B, 0x5429, 0x5429, 0x0452, 0x542A, 0x542A, 0x1841,\n    0x542B, 0x542B, 0x045E, 0x542C, 0x542C, 0x0460, 0x542D, 0x542D, 0x0446,\n    0x542E, 0x542E, 0x0457, 0x542F, 0x542F, 0x40AC, 0x5430, 0x5430, 0x183F,\n    0x5431, 0x5431, 0x045D, 0x5432, 0x5432, 0x3E75, 0x5433, 0x5433, 0x044E,\n    0x5435, 0x5436, 0x0458, 0x5437, 0x5437, 0x1840, 0x5438, 0x5438, 0x0456,\n    0x5439, 0x5439, 0x0454, 0x543B, 0x543B, 0x0455, 0x543C, 0x543C, 0x045B,\n    0x543D, 0x543D, 0x1848, 0x543E, 0x543E, 0x0448, 0x5440, 0x5440, 0x045C,\n    0x5441, 0x5441, 0x184A, 0x5442, 0x5442, 0x0450, 0x5443, 0x5443, 0x044D,\n    0x5445, 0x5445, 0x1843, 0x5446, 0x5446, 0x044C, 0x5447, 0x5447, 0x184D,\n    0x5448, 0x5448, 0x044F, 0x544A, 0x544A, 0x0453, 0x544B, 0x544B, 0x3ED1,\n    0x544D, 0x544D, 0x3EA7, 0x544E, 0x544E, 0x044A, 0x544F, 0x544F, 0x1849,\n    0x5454, 0x5454, 0x1842, 0x5460, 0x5460, 0x192E, 0x5461, 0x5461, 0x192D,\n    0x5462, 0x5462, 0x0573, 0x5463, 0x5463, 0x1930, 0x5464, 0x5464, 0x1932,\n    0x5465, 0x5465, 0x1927, 0x5466, 0x5466, 0x192A, 0x5467, 0x5467, 0x1931,\n    0x5468, 0x5468, 0x0574, 0x5469, 0x5469, 0x3F32, 0x546A, 0x546A, 0x3D83,\n    0x546B, 0x546B, 0x1924, 0x546C, 0x546C, 0x1928, 0x546D, 0x546D, 0x409D,\n    0x546F, 0x546F, 0x192C, 0x5470, 0x5470, 0x1A85, 0x5471, 0x5471, 0x056F,\n    0x5472, 0x5472, 0x1A89, 0x5473, 0x5473, 0x0562, 0x5474, 0x5474, 0x1929,\n    0x5475, 0x5475, 0x0563, 0x5476, 0x5476, 0x0570, 0x5477, 0x5477, 0x0569,\n    0x5478, 0x5478, 0x0565, 0x547A, 0x547A, 0x1925, 0x547B, 0x547B, 0x0568,\n    0x547C, 0x547C, 0x056D, 0x547D, 0x547D, 0x0576, 0x547E, 0x547E, 0x1926,\n    0x547F, 0x547F, 0x191F, 0x5480, 0x5480, 0x0567, 0x5481, 0x5481, 0x1920,\n    0x5482, 0x5482, 0x1922, 0x5484, 0x5484, 0x056A, 0x5485, 0x5485, 0x46D9,\n    0x5486, 0x5486, 0x056C, 0x5487, 0x5487, 0x191E, 0x5488, 0x5488, 0x1923,\n    0x548B, 0x548B, 0x0575, 0x548C, 0x548C, 0x0571, 0x548D, 0x548D, 0x192B,\n    0x548E, 0x548E, 0x0577, 0x548F, 0x548F, 0x40A1, 0x5490, 0x5490, 0x056E,\n    0x5491, 0x5491, 0x1921, 0x5492, 0x5492, 0x056B, 0x5493, 0x5493, 0x45A7,\n    0x5494, 0x5494, 0x3E98, 0x5495, 0x5495, 0x0566, 0x5496, 0x5496, 0x0564,\n    0x5497, 0x5497, 0x3E8A, 0x5498, 0x5498, 0x192F, 0x549A, 0x549A, 0x0572,\n    0x549C, 0x549C, 0x3F66, 0x549E, 0x549E, 0x47ED, 0x54A0, 0x54A0, 0x1A84,\n    0x54A1, 0x54A1, 0x1A78, 0x54A2, 0x54A2, 0x1A87, 0x54A3, 0x54A3, 0x45A8,\n    0x54A4, 0x54A4, 0x40A2, 0x54A5, 0x54A5, 0x1A7A, 0x54A6, 0x54A6, 0x06D6,\n    0x54A7, 0x54A7, 0x06E4, 0x54A8, 0x54A8, 0x06D2, 0x54A9, 0x54A9, 0x06E3,\n    0x54AA, 0x54AA, 0x06DB, 0x54AB, 0x54AB, 0x06E0, 0x54AC, 0x54AC, 0x06D0,\n    0x54AD, 0x54AD, 0x1A79, 0x54AE, 0x54AE, 0x1A7F, 0x54AF, 0x54AF, 0x06DF,\n    0x54B0, 0x54B0, 0x1A8B, 0x54B1, 0x54B1, 0x06E1, 0x54B2, 0x54B2, 0x3744,\n    0x54B3, 0x54B3, 0x06D7, 0x54B4, 0x54B4, 0x45A9, 0x54B6, 0x54B6, 0x1A81,\n    0x54B7, 0x54B7, 0x1A7E, 0x54B8, 0x54B8, 0x06D5, 0x54B9, 0x54B9, 0x45AA,\n    0x54BA, 0x54BA, 0x1A77, 0x54BB, 0x54BB, 0x06E2, 0x54BC, 0x54BC, 0x1A86,\n    0x54BD, 0x54BD, 0x06DA, 0x54BE, 0x54BE, 0x1A88, 0x54BF, 0x54BF, 0x06E5,\n    0x54C0, 0x54C0, 0x06D1, 0x54C1, 0x54C1, 0x06DC, 0x54C2, 0x54C2, 0x06D9,\n    0x54C3, 0x54C3, 0x1A7C, 0x54C4, 0x54C4, 0x06DD, 0x54C5, 0x54C6, 0x1A82,\n    0x54C7, 0x54C7, 0x06D8, 0x54C8, 0x54C8, 0x06DE, 0x54C9, 0x54C9, 0x06D4,\n    0x54CB, 0x54CB, 0x39A3, 0x54CC, 0x54CC, 0x43A8, 0x54CD, 0x54CD, 0x3A00,\n    0x54CE, 0x54CE, 0x06D3, 0x54CF, 0x54CF, 0x1A7B, 0x54D0, 0x54D0, 0x45AB,\n    0x54D6, 0x54D6, 0x1A80, 0x54DA, 0x54DA, 0x4923, 0x54DE, 0x54DE, 0x1A8A,\n    0x54E0, 0x54E0, 0x1C57, 0x54E1, 0x54E1, 0x0870, 0x54E2, 0x54E2, 0x1C45,\n    0x54E3, 0x54E3, 0x4341, 0x54E4, 0x54E4, 0x1C4A, 0x54E5, 0x54E5, 0x0869,\n    0x54E6, 0x54E6, 0x0874, 0x54E7, 0x54E7, 0x1C48, 0x54E8, 0x54E8, 0x0864,\n    0x54E9, 0x54E9, 0x086E, 0x54EA, 0x54EA, 0x0873, 0x54EB, 0x54EB, 0x1C4F,\n    0x54ED, 0x54ED, 0x086F, 0x54EE, 0x54EE, 0x0872, 0x54EF, 0x54EF, 0x45AC,\n    0x54F1, 0x54F1, 0x1C52, 0x54F2, 0x54F2, 0x086A, 0x54F3, 0x54F3, 0x1C49,\n    0x54F7, 0x54F8, 0x1C55, 0x54FA, 0x54FA, 0x086C, 0x54FB, 0x54FB, 0x1C54,\n    0x54FC, 0x54FC, 0x0868, 0x54FD, 0x54FD, 0x0877, 0x54FF, 0x54FF, 0x1C4C,\n    0x5501, 0x5501, 0x0866, 0x5502, 0x5502, 0x3CCC, 0x5503, 0x5503, 0x1C59,\n    0x5504, 0x5504, 0x1C4D, 0x5505, 0x5505, 0x1C51, 0x5506, 0x5506, 0x086B,\n    0x5507, 0x5507, 0x0876, 0x5508, 0x5508, 0x1C4E, 0x5509, 0x5509, 0x0871,\n    0x550A, 0x550A, 0x1C53, 0x550B, 0x550B, 0x1C5A, 0x550C, 0x550C, 0x1E69,\n    0x550D, 0x550D, 0x3A73, 0x550E, 0x550E, 0x1C58, 0x550F, 0x550F, 0x0878,\n    0x5510, 0x5510, 0x0865, 0x5511, 0x5511, 0x1C50, 0x5512, 0x5512, 0x1C47,\n    0x5513, 0x5513, 0x3EA9, 0x5514, 0x5514, 0x086D, 0x5517, 0x5517, 0x1C46,\n    0x5518, 0x5518, 0x45AD, 0x551A, 0x551A, 0x1C4B, 0x551E, 0x551E, 0x3EA8,\n    0x5523, 0x5523, 0x45AE, 0x5525, 0x5525, 0x4309, 0x5526, 0x5526, 0x1C44,\n    0x5527, 0x5527, 0x0875, 0x5528, 0x5528, 0x45AF, 0x552A, 0x552A, 0x1E61,\n    0x552B, 0x552B, 0x409A, 0x552C, 0x552C, 0x0A31, 0x552D, 0x552D, 0x1E6F,\n    0x552E, 0x552E, 0x0A2F, 0x552F, 0x552F, 0x0A2C, 0x5530, 0x5530, 0x1E66,\n    0x5531, 0x5531, 0x0A28, 0x5532, 0x5532, 0x1E6A, 0x5533, 0x5533, 0x0A33,\n    0x5534, 0x5534, 0x1E60, 0x5535, 0x5535, 0x1E65, 0x5536, 0x5536, 0x1E64,\n    0x5537, 0x5537, 0x0867, 0x5538, 0x5538, 0x0A2E, 0x5539, 0x5539, 0x1E6D,\n    0x553B, 0x553B, 0x1E70, 0x553C, 0x553C, 0x1E5D, 0x553E, 0x553E, 0x0C0C,\n    0x553F, 0x553F, 0x43A9, 0x5540, 0x5540, 0x1E71, 0x5541, 0x5541, 0x0A34,\n    0x5543, 0x5543, 0x0A26, 0x5544, 0x5544, 0x0A23, 0x5545, 0x5545, 0x1E68,\n    0x5546, 0x5546, 0x0A20, 0x5547, 0x5547, 0x40AA, 0x5548, 0x5548, 0x1E6E,\n    0x5549, 0x5549, 0x4068, 0x554A, 0x554A, 0x0A27, 0x554B, 0x554B, 0x1E72,\n    0x554D, 0x554D, 0x1E5E, 0x554E, 0x554E, 0x1E6C, 0x554F, 0x554F, 0x0A2A,\n    0x5550, 0x5550, 0x1E5F, 0x5551, 0x5551, 0x1E62, 0x5552, 0x5552, 0x1E67,\n    0x5553, 0x5553, 0x43AE, 0x5555, 0x5555, 0x0A2B, 0x5556, 0x5556, 0x0A29,\n    0x5557, 0x5557, 0x0A35, 0x555C, 0x555C, 0x0A30, 0x555D, 0x555D, 0x40A0,\n    0x555E, 0x555E, 0x0A24, 0x555F, 0x555F, 0x0ABC, 0x5561, 0x5561, 0x0A25,\n    0x5562, 0x5562, 0x1E63, 0x5563, 0x5563, 0x0A32, 0x5564, 0x5564, 0x0A2D,\n    0x5565, 0x5565, 0x1E6B, 0x5566, 0x5566, 0x0A22, 0x5569, 0x5569, 0x3E9F,\n    0x556A, 0x556A, 0x0A21, 0x556B, 0x556B, 0x3B2E, 0x5571, 0x5571, 0x3BC6,\n    0x5572, 0x5572, 0x3E8B, 0x5573, 0x5573, 0x3F24, 0x5575, 0x5576, 0x1E5B,\n    0x5577, 0x5577, 0x20C7, 0x5579, 0x5579, 0x435D, 0x557B, 0x557B, 0x0BFB,\n    0x557C, 0x557C, 0x0BFE, 0x557D, 0x557D, 0x20D2, 0x557E, 0x557E, 0x0C12,\n    0x557F, 0x557F, 0x20D5, 0x5580, 0x5580, 0x0BFC, 0x5581, 0x5581, 0x20CE,\n    0x5582, 0x5582, 0x0C02, 0x5583, 0x5583, 0x0C08, 0x5584, 0x5584, 0x0D1B,\n    0x5586, 0x5586, 0x40AE, 0x5587, 0x5587, 0x0C06, 0x5588, 0x5588, 0x20CB,\n    0x5589, 0x5589, 0x0C13, 0x558A, 0x558A, 0x0BFF, 0x558B, 0x558B, 0x0C07,\n    0x558C, 0x558C, 0x20D3, 0x558D, 0x558D, 0x2387, 0x558E, 0x558E, 0x20D8,\n    0x558F, 0x558F, 0x20CC, 0x5590, 0x5590, 0x430E, 0x5591, 0x5591, 0x20C3,\n    0x5592, 0x5592, 0x20D0, 0x5593, 0x5593, 0x20CA, 0x5594, 0x5594, 0x0C05,\n    0x5595, 0x5595, 0x20D6, 0x5598, 0x5598, 0x0C01, 0x5599, 0x5599, 0x0C15,\n    0x559A, 0x559A, 0x0C0E, 0x559C, 0x559C, 0x0C03, 0x559D, 0x559D, 0x0C00,\n    0x559F, 0x559F, 0x0C0B, 0x55A1, 0x55A1, 0x20D7, 0x55A2, 0x55A2, 0x20C9,\n    0x55A3, 0x55A3, 0x20CF, 0x55A4, 0x55A4, 0x20D1, 0x55A5, 0x55A5, 0x20C5,\n    0x55A6, 0x55A6, 0x20D4, 0x55A7, 0x55A7, 0x0BFD, 0x55A8, 0x55A8, 0x20C4,\n    0x55A9, 0x55A9, 0x40AF, 0x55AA, 0x55AA, 0x0C04, 0x55AB, 0x55AB, 0x0C14,\n    0x55AC, 0x55AC, 0x0C10, 0x55AD, 0x55AD, 0x20C6, 0x55AE, 0x55AE, 0x0C0A,\n    0x55B0, 0x55B0, 0x38F5, 0x55B1, 0x55B1, 0x0C11, 0x55B2, 0x55B2, 0x0C0D,\n    0x55B3, 0x55B3, 0x0C09, 0x55B4, 0x55B4, 0x39FE, 0x55B5, 0x55B5, 0x20CD,\n    0x55B9, 0x55B9, 0x43AA, 0x55BA, 0x55BA, 0x3E89, 0x55BB, 0x55BB, 0x0C0F,\n    0x55BC, 0x55BC, 0x3DC3, 0x55BF, 0x55BF, 0x2385, 0x55C0, 0x55C0, 0x2381,\n    0x55C1, 0x55C1, 0x3E4F, 0x55C2, 0x55C2, 0x2390, 0x55C3, 0x55C3, 0x237A,\n    0x55C4, 0x55C4, 0x2383, 0x55C5, 0x55C6, 0x0DE0, 0x55C7, 0x55C7, 0x0DD9,\n    0x55C8, 0x55C8, 0x238C, 0x55C9, 0x55C9, 0x0DE3, 0x55CA, 0x55CA, 0x237F,\n    0x55CB, 0x55CB, 0x237E, 0x55CC, 0x55CC, 0x237C, 0x55CD, 0x55CD, 0x238E,\n    0x55CE, 0x55CE, 0x0DD7, 0x55CF, 0x55CF, 0x2388, 0x55D0, 0x55D0, 0x237D,\n    0x55D1, 0x55D1, 0x0DDA, 0x55D2, 0x55D2, 0x2386, 0x55D3, 0x55D3, 0x0DD5,\n    0x55D4, 0x55D4, 0x2382, 0x55D5, 0x55D5, 0x2389, 0x55D6, 0x55D6, 0x238B,\n    0x55D7, 0x55D7, 0x45B3, 0x55D8, 0x55D8, 0x43AB, 0x55D9, 0x55D9, 0x238F,\n    0x55DA, 0x55DA, 0x0DDE, 0x55DB, 0x55DB, 0x237B, 0x55DC, 0x55DC, 0x0DD8,\n    0x55DD, 0x55DD, 0x2380, 0x55DE, 0x55DE, 0x3E94, 0x55DF, 0x55DF, 0x0DD3,\n    0x55E1, 0x55E1, 0x0DDF, 0x55E2, 0x55E2, 0x238A, 0x55E3, 0x55E4, 0x0DDB,\n    0x55E5, 0x55E5, 0x0DE2, 0x55E6, 0x55E6, 0x0DD6, 0x55E7, 0x55E7, 0x011F,\n    0x55E8, 0x55E8, 0x0DD4, 0x55E9, 0x55E9, 0x2384, 0x55EA, 0x55EA, 0x3E7C,\n    0x55EC, 0x55EC, 0x37D2, 0x55EF, 0x55EF, 0x0DDD, 0x55F0, 0x55F0, 0x3E88,\n    0x55F1, 0x55F1, 0x3E83, 0x55F2, 0x55F2, 0x238D, 0x55F5, 0x55F5, 0x4786,\n    0x55F6, 0x55F6, 0x0F9F, 0x55F7, 0x55F7, 0x0F9A, 0x55F9, 0x55F9, 0x2637,\n    0x55FA, 0x55FA, 0x2633, 0x55FB, 0x55FB, 0x4626, 0x55FC, 0x55FC, 0x262D,\n    0x55FD, 0x55FD, 0x0F94, 0x55FE, 0x55FE, 0x0F90, 0x55FF, 0x55FF, 0x2636,\n    0x5600, 0x5600, 0x0F91, 0x5601, 0x5601, 0x2630, 0x5602, 0x5602, 0x2632,\n    0x5604, 0x5604, 0x2635, 0x5605, 0x5605, 0x3E82, 0x5606, 0x5606, 0x0F96,\n    0x5608, 0x5608, 0x0F9D, 0x5609, 0x5609, 0x0F97, 0x560C, 0x560C, 0x262B,\n    0x560D, 0x560E, 0x0F98, 0x560F, 0x560F, 0x262E, 0x5610, 0x5610, 0x0F9E,\n    0x5611, 0x5611, 0x3F4D, 0x5612, 0x5612, 0x262C, 0x5613, 0x5613, 0x2631,\n    0x5614, 0x5614, 0x0F95, 0x5615, 0x5615, 0x262A, 0x5616, 0x5616, 0x0F9B,\n    0x5617, 0x5617, 0x0F93, 0x561B, 0x561B, 0x0F92, 0x561C, 0x561C, 0x262F,\n    0x561D, 0x561D, 0x2634, 0x561E, 0x561E, 0x3E68, 0x561F, 0x561F, 0x0F9C,\n    0x5620, 0x5620, 0x3F7D, 0x5621, 0x5621, 0x43AD, 0x5622, 0x5622, 0x3E67,\n    0x5623, 0x5623, 0x4707, 0x5625, 0x5625, 0x3E78, 0x5627, 0x5627, 0x2629,\n    0x5629, 0x5629, 0x1119, 0x562A, 0x562A, 0x289D, 0x562C, 0x562C, 0x289A,\n    0x562D, 0x562D, 0x3E63, 0x562E, 0x562E, 0x1113, 0x562F, 0x5630, 0x111F,\n    0x5632, 0x5632, 0x1116, 0x5633, 0x5633, 0x2898, 0x5634, 0x5634, 0x1118,\n    0x5635, 0x5635, 0x2890, 0x5636, 0x5636, 0x111E, 0x5637, 0x5637, 0x40B7,\n    0x5638, 0x5638, 0x289C, 0x5639, 0x5639, 0x1115, 0x563A, 0x563A, 0x289E,\n    0x563B, 0x563B, 0x1114, 0x563D, 0x563D, 0x2899, 0x563E, 0x563E, 0x289B,\n    0x563F, 0x563F, 0x1117, 0x5640, 0x5640, 0x2897, 0x5641, 0x5641, 0x2891,\n    0x5642, 0x5642, 0x288E, 0x5643, 0x5643, 0x3E7E, 0x5645, 0x5645, 0x20C8,\n    0x5646, 0x5646, 0x2894, 0x5648, 0x5648, 0x288D, 0x5649, 0x5649, 0x2893,\n    0x564A, 0x564A, 0x2892, 0x564C, 0x564C, 0x288F, 0x564D, 0x564D, 0x40BC,\n    0x564E, 0x564E, 0x111B, 0x564F, 0x564F, 0x40BD, 0x5650, 0x5650, 0x47CF,\n    0x5652, 0x5652, 0x45C2, 0x5653, 0x5653, 0x111A, 0x5654, 0x5654, 0x43AF,\n    0x5657, 0x5657, 0x111C, 0x5658, 0x5658, 0x2895, 0x5659, 0x5659, 0x1295,\n    0x565A, 0x565A, 0x2896, 0x565D, 0x565D, 0x3EF9, 0x565E, 0x565E, 0x2B10,\n    0x5660, 0x5660, 0x2B09, 0x5661, 0x5661, 0x3812, 0x5662, 0x5662, 0x12A1,\n    0x5663, 0x5663, 0x2B0D, 0x5664, 0x5664, 0x1299, 0x5665, 0x5665, 0x129D,\n    0x5666, 0x5666, 0x2B0C, 0x5668, 0x5668, 0x129C, 0x5669, 0x5669, 0x1298,\n    0x566A, 0x566A, 0x129B, 0x566B, 0x566B, 0x1296, 0x566C, 0x566C, 0x12A0,\n    0x566D, 0x566D, 0x2B0E, 0x566E, 0x566E, 0x2B0A, 0x566F, 0x566F, 0x129F,\n    0x5670, 0x5670, 0x2B08, 0x5671, 0x5671, 0x129E, 0x5672, 0x5672, 0x2B0F,\n    0x5673, 0x5673, 0x2B0B, 0x5674, 0x5674, 0x111D, 0x5676, 0x5676, 0x12A2,\n    0x5677, 0x5677, 0x2B11, 0x5678, 0x5678, 0x129A, 0x5679, 0x5679, 0x1297,\n    0x567A, 0x567A, 0x3D85, 0x567B, 0x567B, 0x3EB7, 0x567C, 0x567C, 0x3EED,\n    0x567E, 0x567E, 0x2D47, 0x567F, 0x567F, 0x2D49, 0x5680, 0x5680, 0x13BA,\n    0x5681, 0x5681, 0x2D4A, 0x5682, 0x5682, 0x2D48, 0x5683, 0x5683, 0x2D46,\n    0x5684, 0x5684, 0x2D45, 0x5685, 0x5685, 0x13BC, 0x5686, 0x5686, 0x2D44,\n    0x5687, 0x5687, 0x13BD, 0x5689, 0x5689, 0x4628, 0x568A, 0x568A, 0x3949,\n    0x568B, 0x568B, 0x3E4C, 0x568C, 0x568D, 0x2D42, 0x568E, 0x568E, 0x13B9,\n    0x568F, 0x568F, 0x13BE, 0x5690, 0x5690, 0x13BB, 0x5692, 0x5692, 0x39A6,\n    0x5693, 0x5693, 0x2D41, 0x5695, 0x5695, 0x14CA, 0x5697, 0x5697, 0x2F13,\n    0x5698, 0x5698, 0x2F11, 0x5699, 0x5699, 0x2F16, 0x569A, 0x569A, 0x2F14,\n    0x569C, 0x569C, 0x2F12, 0x569D, 0x569D, 0x2F15, 0x569E, 0x569E, 0x39A4,\n    0x569F, 0x569F, 0x3948, 0x56A1, 0x56A1, 0x436B, 0x56A4, 0x56A4, 0x3CC8,\n    0x56A5, 0x56A5, 0x1576, 0x56A6, 0x56A7, 0x3081, 0x56A8, 0x56A8, 0x1577,\n    0x56AA, 0x56AA, 0x3083, 0x56AB, 0x56AB, 0x307F, 0x56AC, 0x56AC, 0x3084,\n    0x56AD, 0x56AD, 0x3080, 0x56AE, 0x56AE, 0x14CB, 0x56AF, 0x56AF, 0x45F7,\n    0x56B1, 0x56B1, 0x463F, 0x56B2, 0x56B2, 0x31C8, 0x56B3, 0x56B3, 0x31CA,\n    0x56B4, 0x56B4, 0x160C, 0x56B5, 0x56B5, 0x31C9, 0x56B6, 0x56B6, 0x160B,\n    0x56B7, 0x56B7, 0x160A, 0x56B9, 0x56B9, 0x486F, 0x56BC, 0x56BC, 0x160D,\n    0x56BD, 0x56BE, 0x32CA, 0x56BF, 0x56BF, 0x3E5D, 0x56C0, 0x56C0, 0x166B,\n    0x56C1, 0x56C1, 0x166A, 0x56C2, 0x56C2, 0x166C, 0x56C3, 0x56C3, 0x32C9,\n    0x56C5, 0x56C5, 0x3379, 0x56C6, 0x56C6, 0x3378, 0x56C8, 0x56C8, 0x16BD,\n    0x56C9, 0x56C9, 0x16BF, 0x56CA, 0x56CA, 0x16BE, 0x56CB, 0x56CB, 0x337A,\n    0x56CC, 0x56CC, 0x16F6, 0x56CD, 0x56CD, 0x3481, 0x56D1, 0x56D1, 0x171F,\n    0x56D3, 0x56D3, 0x3480, 0x56D4, 0x56D4, 0x34C9, 0x56D6, 0x56D6, 0x488A,\n    0x56D7, 0x56D7, 0x1775, 0x56DA, 0x56DA, 0x032D, 0x56DB, 0x56DB, 0x032C,\n    0x56DD, 0x56DD, 0x03AC, 0x56DE, 0x56DE, 0x03AB, 0x56DF, 0x56DF, 0x17D0,\n    0x56E0, 0x56E0, 0x03AA, 0x56E1, 0x56E1, 0x17CF, 0x56E2, 0x56E2, 0x4548,\n    0x56E4, 0x56E4, 0x0463, 0x56E5, 0x56E5, 0x1850, 0x56E7, 0x56E7, 0x184F,\n    0x56EA, 0x56EA, 0x0461, 0x56EB, 0x56EB, 0x0464, 0x56ED, 0x56ED, 0x40C4,\n    0x56EE, 0x56EE, 0x184E, 0x56EF, 0x56EF, 0x40C3, 0x56F0, 0x56F0, 0x0462,\n    0x56F1, 0x56F1, 0x40BF, 0x56F7, 0x56F7, 0x1933, 0x56F9, 0x56F9, 0x1934,\n    0x56FA, 0x56FA, 0x0578, 0x56FD, 0x56FD, 0x3D64, 0x56FF, 0x56FF, 0x06E6,\n    0x5700, 0x5700, 0x40C2, 0x5701, 0x5702, 0x1C5B, 0x5703, 0x5704, 0x0879,\n    0x5707, 0x5707, 0x1E74, 0x5708, 0x5708, 0x0A36, 0x5709, 0x5709, 0x0A38,\n    0x570A, 0x570A, 0x1E73, 0x570B, 0x570B, 0x0A37, 0x570C, 0x570C, 0x20D9,\n    0x570D, 0x570D, 0x0C16, 0x5712, 0x5713, 0x0DE4, 0x5714, 0x5714, 0x2391,\n    0x5715, 0x5715, 0x3E36, 0x5716, 0x5716, 0x0FA1, 0x5718, 0x5718, 0x0FA0,\n    0x571A, 0x571A, 0x289F, 0x571B, 0x571B, 0x2B13, 0x571C, 0x571C, 0x2B12,\n    0x571D, 0x571D, 0x3A02, 0x571E, 0x571E, 0x3505, 0x571F, 0x571F, 0x027A,\n    0x5720, 0x5720, 0x1784, 0x5722, 0x5723, 0x179A, 0x5728, 0x5728, 0x03AF,\n    0x5729, 0x5729, 0x03B3, 0x572A, 0x572A, 0x17D2, 0x572C, 0x572C, 0x03B1,\n    0x572D, 0x572D, 0x03B0, 0x572E, 0x572E, 0x17D1, 0x572F, 0x572F, 0x03B2,\n    0x5730, 0x5730, 0x03AE, 0x5732, 0x5732, 0x3AF9, 0x5733, 0x5733, 0x03AD,\n    0x5734, 0x5734, 0x17D3, 0x573B, 0x573B, 0x046E, 0x573E, 0x573E, 0x046B,\n    0x573F, 0x573F, 0x4855, 0x5740, 0x5740, 0x0467, 0x5741, 0x5741, 0x1851,\n    0x5742, 0x5742, 0x40CC, 0x5743, 0x5743, 0x40DE, 0x5745, 0x5745, 0x1852,\n    0x5746, 0x5746, 0x40C8, 0x5747, 0x5747, 0x0469, 0x5749, 0x5749, 0x1854,\n    0x574A, 0x574A, 0x0465, 0x574B, 0x574B, 0x1855, 0x574C, 0x574C, 0x1853,\n    0x574D, 0x574D, 0x0468, 0x574E, 0x574E, 0x046A, 0x574F, 0x574F, 0x046D,\n    0x5750, 0x5750, 0x046C, 0x5751, 0x5751, 0x0466, 0x5752, 0x5752, 0x1856,\n    0x5754, 0x5754, 0x4785, 0x5757, 0x5757, 0x47E6, 0x575B, 0x575B, 0x3982,\n    0x575F, 0x575F, 0x3FBF, 0x5761, 0x5761, 0x057D, 0x5762, 0x5762, 0x1941,\n    0x5764, 0x5764, 0x057F, 0x5766, 0x5766, 0x057E, 0x5767, 0x5767, 0x3F2B,\n    0x5768, 0x5768, 0x1942, 0x5769, 0x5769, 0x057C, 0x576A, 0x576A, 0x057B,\n    0x576B, 0x576B, 0x1938, 0x576D, 0x576D, 0x1937, 0x576F, 0x576F, 0x1935,\n    0x5770, 0x5770, 0x193A, 0x5771, 0x5771, 0x1939, 0x5772, 0x5772, 0x1936,\n    0x5773, 0x5774, 0x193F, 0x5775, 0x5775, 0x193D, 0x5776, 0x5776, 0x193B,\n    0x5777, 0x5777, 0x057A, 0x577A, 0x577A, 0x3F5F, 0x577B, 0x577B, 0x193E,\n    0x577C, 0x577C, 0x0580, 0x577D, 0x577D, 0x1943, 0x577E, 0x577E, 0x46DC,\n    0x577F, 0x577F, 0x3A07, 0x5780, 0x5780, 0x193C, 0x5782, 0x5782, 0x06E7,\n    0x5783, 0x5783, 0x0579, 0x5788, 0x5788, 0x484B, 0x578A, 0x578A, 0x3C7B,\n    0x578B, 0x578B, 0x06E8, 0x578C, 0x578C, 0x1A90, 0x578D, 0x578D, 0x3A06,\n    0x578F, 0x578F, 0x1A96, 0x5790, 0x5790, 0x4166, 0x5793, 0x5793, 0x06EE,\n    0x5794, 0x5794, 0x1A94, 0x5795, 0x5795, 0x1A9A, 0x5797, 0x5797, 0x1A91,\n    0x5798, 0x5798, 0x1A95, 0x5799, 0x5799, 0x1A97, 0x579A, 0x579A, 0x1A99,\n    0x579B, 0x579B, 0x1A93, 0x579C, 0x579C, 0x4608, 0x579D, 0x579D, 0x1A92,\n    0x579E, 0x579F, 0x1A8D, 0x57A0, 0x57A0, 0x06E9, 0x57A1, 0x57A1, 0x4864,\n    0x57A2, 0x57A2, 0x06EB, 0x57A3, 0x57A3, 0x06EA, 0x57A4, 0x57A4, 0x1A8F,\n    0x57A5, 0x57A5, 0x1A98, 0x57A7, 0x57A7, 0x4914, 0x57AA, 0x57AA, 0x4905,\n    0x57AE, 0x57AE, 0x06ED, 0x57B4, 0x57B4, 0x4741, 0x57B5, 0x57B5, 0x1A8C,\n    0x57B6, 0x57B6, 0x1C66, 0x57B8, 0x57B8, 0x1C65, 0x57B9, 0x57B9, 0x1C6A,\n    0x57BA, 0x57BA, 0x1C61, 0x57BB, 0x57BB, 0x3C79, 0x57BC, 0x57BC, 0x1C64,\n    0x57BD, 0x57BD, 0x1C63, 0x57BE, 0x57BE, 0x372C, 0x57BF, 0x57BF, 0x1C67,\n    0x57C1, 0x57C1, 0x1C6B, 0x57C2, 0x57C2, 0x087B, 0x57C3, 0x57C3, 0x087E,\n    0x57C4, 0x57C4, 0x3B5B, 0x57C6, 0x57C6, 0x1C62, 0x57C7, 0x57C7, 0x1C68,\n    0x57C8, 0x57C8, 0x3D0B, 0x57CB, 0x57CB, 0x087D, 0x57CC, 0x57CC, 0x1C5D,\n    0x57CE, 0x57CE, 0x06EC, 0x57CF, 0x57CF, 0x1E82, 0x57D0, 0x57D0, 0x1C69,\n    0x57D2, 0x57D2, 0x1C60, 0x57D4, 0x57D4, 0x087C, 0x57D5, 0x57D5, 0x1C5F,\n    0x57D7, 0x57D7, 0x3C7D, 0x57DC, 0x57DC, 0x1E79, 0x57DD, 0x57DD, 0x3A05,\n    0x57DE, 0x57DE, 0x3F01, 0x57DF, 0x57DF, 0x0A39, 0x57E0, 0x57E0, 0x0A3D,\n    0x57E1, 0x57E1, 0x1E89, 0x57E2, 0x57E2, 0x1E77, 0x57E3, 0x57E3, 0x1E85,\n    0x57E4, 0x57E4, 0x0A3E, 0x57E5, 0x57E5, 0x1E87, 0x57E6, 0x57E6, 0x40CF,\n    0x57E7, 0x57E7, 0x1E8D, 0x57E9, 0x57E9, 0x1E91, 0x57EC, 0x57EC, 0x1E88,\n    0x57ED, 0x57ED, 0x1E7C, 0x57EE, 0x57EE, 0x1E84, 0x57EF, 0x57EF, 0x4754,\n    0x57F0, 0x57F0, 0x1E92, 0x57F1, 0x57F1, 0x1E90, 0x57F2, 0x57F2, 0x1E86,\n    0x57F3, 0x57F3, 0x1E81, 0x57F4, 0x57F4, 0x1E7A, 0x57F5, 0x57F5, 0x20E1,\n    0x57F6, 0x57F6, 0x1E78, 0x57F7, 0x57F7, 0x0A42, 0x57F8, 0x57F8, 0x1E7F,\n    0x57F9, 0x57F9, 0x0A43, 0x57FA, 0x57FA, 0x0A3F, 0x57FB, 0x57FB, 0x1E75,\n    0x57FC, 0x57FC, 0x1E8B, 0x57FD, 0x57FD, 0x1E7D, 0x57FE, 0x57FE, 0x408F,\n    0x5800, 0x5800, 0x1E7B, 0x5801, 0x5801, 0x1E8E, 0x5802, 0x5802, 0x0A40,\n    0x5803, 0x5803, 0x40D1, 0x5804, 0x5804, 0x1E94, 0x5805, 0x5805, 0x0A3A,\n    0x5806, 0x5806, 0x0A3C, 0x5807, 0x5807, 0x1E83, 0x5808, 0x5808, 0x1E7E,\n    0x5809, 0x5809, 0x087F, 0x580A, 0x580A, 0x0A3B, 0x580B, 0x580B, 0x1E80,\n    0x580C, 0x580C, 0x1E8F, 0x580D, 0x580D, 0x1E93, 0x580E, 0x580E, 0x1E8A,\n    0x5810, 0x5810, 0x1E8C, 0x5812, 0x5812, 0x3D0A, 0x5814, 0x5814, 0x1E76,\n    0x5819, 0x5819, 0x20DC, 0x581B, 0x581B, 0x20E5, 0x581C, 0x581C, 0x20E4,\n    0x581D, 0x581D, 0x0C1E, 0x581E, 0x581E, 0x20DD, 0x5820, 0x5820, 0x0C1F,\n    0x5821, 0x5821, 0x0C1D, 0x5822, 0x5822, 0x3C28, 0x5823, 0x5823, 0x20DF,\n    0x5824, 0x5824, 0x0C1A, 0x5825, 0x5825, 0x20E3, 0x5826, 0x5826, 0x40D4,\n    0x5827, 0x5827, 0x20DE, 0x5828, 0x5828, 0x20E0, 0x5829, 0x5829, 0x20DA,\n    0x582A, 0x582A, 0x0C18, 0x582C, 0x582C, 0x20ED, 0x582D, 0x582D, 0x20EC,\n    0x582E, 0x582E, 0x20E9, 0x582F, 0x582F, 0x0C17, 0x5830, 0x5831, 0x0C1B,\n    0x5832, 0x5832, 0x1C5E, 0x5833, 0x5833, 0x20E6, 0x5834, 0x5834, 0x0C19,\n    0x5835, 0x5835, 0x0A41, 0x5836, 0x5836, 0x20E8, 0x5837, 0x5837, 0x20DB,\n    0x5838, 0x5838, 0x20EB, 0x5839, 0x5839, 0x20EA, 0x583A, 0x583A, 0x3D72,\n    0x583B, 0x583B, 0x20EE, 0x583D, 0x583D, 0x239F, 0x583F, 0x583F, 0x20E7,\n    0x5840, 0x5840, 0x3D82, 0x5844, 0x5844, 0x47BB, 0x5847, 0x5847, 0x3AC2,\n    0x5848, 0x5848, 0x20E2, 0x5849, 0x5849, 0x2397, 0x584A, 0x584A, 0x0DEF,\n    0x584B, 0x584B, 0x0DF2, 0x584C, 0x584C, 0x0DED, 0x584D, 0x584D, 0x2396,\n    0x584E, 0x584E, 0x239A, 0x584F, 0x584F, 0x2395, 0x5851, 0x5851, 0x0DE7,\n    0x5852, 0x5852, 0x0DF1, 0x5853, 0x5853, 0x2392, 0x5854, 0x5854, 0x0DEB,\n    0x5855, 0x5855, 0x2399, 0x5857, 0x5857, 0x0DE9, 0x5858, 0x5858, 0x0DE8,\n    0x5859, 0x5859, 0x239C, 0x585A, 0x585A, 0x0DEA, 0x585B, 0x585B, 0x239E,\n    0x585C, 0x585C, 0x4949, 0x585D, 0x585D, 0x239B, 0x585E, 0x585E, 0x0DE6,\n    0x585F, 0x585F, 0x43DF, 0x5862, 0x5862, 0x0DF0, 0x5863, 0x5863, 0x23A0,\n    0x5864, 0x5864, 0x2394, 0x5865, 0x5865, 0x239D, 0x5868, 0x5868, 0x2393,\n    0x5869, 0x5869, 0x3D65, 0x586B, 0x586B, 0x0DEC, 0x586C, 0x586C, 0x399A,\n    0x586D, 0x586D, 0x0DEE, 0x586F, 0x586F, 0x2398, 0x5871, 0x5871, 0x23A1,\n    0x5872, 0x5872, 0x3C26, 0x5873, 0x5873, 0x4355, 0x5874, 0x5874, 0x263F,\n    0x5875, 0x5875, 0x0FA2, 0x5876, 0x5876, 0x2645, 0x5879, 0x5879, 0x0FA7,\n    0x587A, 0x587A, 0x2641, 0x587B, 0x587B, 0x2648, 0x587C, 0x587C, 0x2639,\n    0x587D, 0x587D, 0x0FA9, 0x587E, 0x587E, 0x0FA3, 0x587F, 0x587F, 0x263E,\n    0x5880, 0x5880, 0x1121, 0x5881, 0x5881, 0x263D, 0x5882, 0x5882, 0x2646,\n    0x5883, 0x5883, 0x0FA4, 0x5885, 0x5885, 0x0FA8, 0x5886, 0x5886, 0x263C,\n    0x5887, 0x5887, 0x2642, 0x5888, 0x5888, 0x2647, 0x5889, 0x5889, 0x2638,\n    0x588A, 0x588A, 0x0FA6, 0x588B, 0x588B, 0x2640, 0x588E, 0x588E, 0x2644,\n    0x588F, 0x588F, 0x264A, 0x5890, 0x5890, 0x263A, 0x5891, 0x5891, 0x2643,\n    0x5893, 0x5893, 0x0FA5, 0x5894, 0x5894, 0x2649, 0x5898, 0x5898, 0x263B,\n    0x5899, 0x5899, 0x4618, 0x589A, 0x589A, 0x4903, 0x589C, 0x589C, 0x1125,\n    0x589D, 0x589D, 0x28A1, 0x589E, 0x589E, 0x1123, 0x589F, 0x589F, 0x1122,\n    0x58A0, 0x58A0, 0x28A3, 0x58A1, 0x58A1, 0x28A8, 0x58A3, 0x58A3, 0x28A4,\n    0x58A5, 0x58A5, 0x28A7, 0x58A6, 0x58A6, 0x1128, 0x58A7, 0x58A7, 0x3EEB,\n    0x58A8, 0x58A8, 0x1288, 0x58A9, 0x58A9, 0x1127, 0x58AA, 0x58AA, 0x40D7,\n    0x58AB, 0x58AB, 0x28A0, 0x58AC, 0x58AC, 0x28A6, 0x58AE, 0x58AE, 0x1126,\n    0x58AF, 0x58AF, 0x28A5, 0x58B0, 0x58B0, 0x37A4, 0x58B1, 0x58B1, 0x28A2,\n    0x58B3, 0x58B3, 0x1124, 0x58B5, 0x58B5, 0x4840, 0x58B6, 0x58B6, 0x3DFD,\n    0x58BA, 0x58BA, 0x2B18, 0x58BB, 0x58BB, 0x36EB, 0x58BC, 0x58BC, 0x2B1A,\n    0x58BD, 0x58BD, 0x2B15, 0x58BE, 0x58BE, 0x12A4, 0x58BF, 0x58BF, 0x2B17,\n    0x58C1, 0x58C1, 0x12A3, 0x58C2, 0x58C2, 0x2B19, 0x58C5, 0x58C5, 0x12A6,\n    0x58C6, 0x58C6, 0x2B1B, 0x58C7, 0x58C7, 0x12A5, 0x58C8, 0x58C8, 0x2B14,\n    0x58C9, 0x58C9, 0x2B16, 0x58CB, 0x58CB, 0x3A09, 0x58CE, 0x58CE, 0x13C2,\n    0x58CF, 0x58CF, 0x2D4D, 0x58D1, 0x58D1, 0x13C1, 0x58D2, 0x58D2, 0x2D4E,\n    0x58D3, 0x58D3, 0x13C0, 0x58D4, 0x58D4, 0x2D4C, 0x58D5, 0x58D5, 0x13BF,\n    0x58D6, 0x58D6, 0x2D4B, 0x58D8, 0x58D8, 0x14CD, 0x58D9, 0x58D9, 0x14CC,\n    0x58DA, 0x58DA, 0x3085, 0x58DB, 0x58DB, 0x3087, 0x58DC, 0x58DC, 0x40DA,\n    0x58DD, 0x58DD, 0x3086, 0x58DE, 0x58DF, 0x1578, 0x58E0, 0x58E0, 0x40D9,\n    0x58E2, 0x58E2, 0x157A, 0x58E3, 0x58E3, 0x31CB, 0x58E4, 0x58E4, 0x160E,\n    0x58E7, 0x58E7, 0x3411, 0x58E8, 0x58E8, 0x3410, 0x58E9, 0x58E9, 0x1720,\n    0x58EB, 0x58EB, 0x027B, 0x58EC, 0x58EC, 0x02C1, 0x58EF, 0x58EF, 0x046F,\n    0x58F0, 0x58F0, 0x4549, 0x58F2, 0x58F2, 0x3D68, 0x58F3, 0x58F3, 0x3C7A,\n    0x58F4, 0x58F4, 0x1A9B, 0x58F9, 0x58FA, 0x0C20, 0x58FB, 0x58FB, 0x40DC,\n    0x58FC, 0x58FC, 0x23A2, 0x58FD, 0x58FD, 0x0FAA, 0x58FE, 0x58FE, 0x264B,\n    0x58FF, 0x58FF, 0x28A9, 0x5902, 0x5902, 0x0224, 0x5903, 0x5903, 0x1785,\n    0x5904, 0x5904, 0x454A, 0x5905, 0x5905, 0x4599, 0x5906, 0x5906, 0x1857,\n    0x5907, 0x5907, 0x454B, 0x590A, 0x590A, 0x0224, 0x590C, 0x590C, 0x1944,\n    0x590D, 0x590D, 0x1A9C, 0x590E, 0x590E, 0x1C6C, 0x590F, 0x590F, 0x0880,\n    0x5911, 0x5911, 0x4274, 0x5912, 0x5912, 0x3088, 0x5914, 0x5914, 0x166D,\n    0x5915, 0x5915, 0x027C, 0x5916, 0x5916, 0x032E, 0x5917, 0x5917, 0x179C,\n    0x5919, 0x591A, 0x03B4, 0x591C, 0x591C, 0x0581, 0x591F, 0x591F, 0x40E3,\n    0x5920, 0x5920, 0x0A44, 0x5922, 0x5922, 0x0FAC, 0x5924, 0x5924, 0x0FAD,\n    0x5925, 0x5925, 0x0FAB, 0x5927, 0x5927, 0x027D, 0x5929, 0x5929, 0x02C2,\n    0x592A, 0x592A, 0x02C4, 0x592B, 0x592B, 0x02C3, 0x592C, 0x592C, 0x1786,\n    0x592D, 0x592D, 0x02C5, 0x592E, 0x592E, 0x032F, 0x592F, 0x592F, 0x179D,\n    0x5931, 0x5931, 0x0330, 0x5932, 0x5932, 0x454C, 0x5934, 0x5934, 0x454D,\n    0x5937, 0x5938, 0x03B6, 0x593C, 0x593C, 0x17D4, 0x593E, 0x593E, 0x0470,\n    0x5940, 0x5940, 0x1858, 0x5944, 0x5944, 0x0585, 0x5945, 0x5945, 0x1945,\n    0x5947, 0x5948, 0x0583, 0x5949, 0x5949, 0x0582, 0x594A, 0x594A, 0x1C6D,\n    0x594E, 0x594E, 0x06F2, 0x594F, 0x594F, 0x06F1, 0x5950, 0x5950, 0x06F3,\n    0x5951, 0x5951, 0x06F0, 0x5953, 0x5953, 0x1A9D, 0x5954, 0x5954, 0x0586,\n    0x5955, 0x5955, 0x06EF, 0x5957, 0x5958, 0x0881, 0x595A, 0x595A, 0x0883,\n    0x595C, 0x595C, 0x1E95, 0x5960, 0x5960, 0x0C22, 0x5961, 0x5961, 0x20EF,\n    0x5962, 0x5962, 0x0A45, 0x5965, 0x5965, 0x4852, 0x5967, 0x5967, 0x0DF3,\n    0x5969, 0x5969, 0x0FAF, 0x596A, 0x596A, 0x0FAE, 0x596B, 0x596B, 0x264C,\n    0x596D, 0x596D, 0x1129, 0x596E, 0x596E, 0x12A7, 0x5970, 0x5970, 0x2F17,\n    0x5971, 0x5971, 0x337B, 0x5972, 0x5972, 0x3412, 0x5973, 0x5973, 0x027E,\n    0x5974, 0x5974, 0x0331, 0x5975, 0x5975, 0x3E6A, 0x5976, 0x5976, 0x0332,\n    0x5977, 0x5977, 0x17DA, 0x5978, 0x5978, 0x03B9, 0x5979, 0x5979, 0x03BC,\n    0x597B, 0x597B, 0x17D8, 0x597C, 0x597C, 0x17D6, 0x597D, 0x597D, 0x03BB,\n    0x597E, 0x597E, 0x17D9, 0x597F, 0x597F, 0x17DB, 0x5980, 0x5980, 0x17D5,\n    0x5981, 0x5981, 0x03BE, 0x5982, 0x5982, 0x03BD, 0x5983, 0x5983, 0x03BA,\n    0x5984, 0x5984, 0x03B8, 0x5985, 0x5985, 0x17D7, 0x5989, 0x5989, 0x3D30,\n    0x598A, 0x598A, 0x047B, 0x598D, 0x598D, 0x0478, 0x598E, 0x598E, 0x185D,\n    0x598F, 0x598F, 0x1860, 0x5990, 0x5990, 0x185F, 0x5992, 0x5992, 0x0472,\n    0x5993, 0x5993, 0x047A, 0x5994, 0x5994, 0x3C99, 0x5996, 0x5996, 0x0477,\n    0x5997, 0x5997, 0x185C, 0x5998, 0x5998, 0x185A, 0x5999, 0x5999, 0x0476,\n    0x599A, 0x599A, 0x3BB0, 0x599D, 0x599D, 0x0471, 0x599E, 0x599E, 0x0474,\n    0x599F, 0x599F, 0x3DAF, 0x59A0, 0x59A0, 0x185B, 0x59A1, 0x59A1, 0x1862,\n    0x59A2, 0x59A2, 0x185E, 0x59A3, 0x59A3, 0x0475, 0x59A4, 0x59A4, 0x0479,\n    0x59A5, 0x59A5, 0x047C, 0x59A6, 0x59A6, 0x1859, 0x59A7, 0x59A7, 0x1861,\n    0x59A8, 0x59A8, 0x0473, 0x59AC, 0x59AC, 0x3D81, 0x59AE, 0x59AE, 0x058B,\n    0x59AF, 0x59AF, 0x0593, 0x59B0, 0x59B0, 0x3CD8, 0x59B1, 0x59B1, 0x1951,\n    0x59B2, 0x59B2, 0x194A, 0x59B3, 0x59B3, 0x0594, 0x59B4, 0x59B4, 0x1955,\n    0x59B5, 0x59B5, 0x1946, 0x59B6, 0x59B6, 0x194D, 0x59B7, 0x59B7, 0x3F2D,\n    0x59B8, 0x59B8, 0x3A10, 0x59B9, 0x59B9, 0x058A, 0x59BA, 0x59BA, 0x1947,\n    0x59BB, 0x59BB, 0x0588, 0x59BC, 0x59BC, 0x194E, 0x59BD, 0x59BD, 0x1952,\n    0x59BE, 0x59BE, 0x0587, 0x59C0, 0x59C0, 0x1953, 0x59C1, 0x59C1, 0x194C,\n    0x59C3, 0x59C3, 0x194F, 0x59C4, 0x59C4, 0x3D04, 0x59C5, 0x59C5, 0x0596,\n    0x59C6, 0x59C6, 0x058D, 0x59C7, 0x59C7, 0x1956, 0x59C8, 0x59C8, 0x1954,\n    0x59C9, 0x59C9, 0x40EC, 0x59CA, 0x59CA, 0x0592, 0x59CB, 0x59CB, 0x0590,\n    0x59CC, 0x59CC, 0x194B, 0x59CD, 0x59CD, 0x058F, 0x59CE, 0x59CE, 0x1949,\n    0x59CF, 0x59CF, 0x1948, 0x59D0, 0x59D0, 0x058E, 0x59D1, 0x59D1, 0x058C,\n    0x59D2, 0x59D2, 0x0595, 0x59D3, 0x59D3, 0x0591, 0x59D4, 0x59D4, 0x0589,\n    0x59D6, 0x59D6, 0x1950, 0x59D8, 0x59D8, 0x06F5, 0x59D9, 0x59D9, 0x40F1,\n    0x59DA, 0x59DA, 0x06FC, 0x59DB, 0x59DB, 0x1AAB, 0x59DC, 0x59DC, 0x06F4,\n    0x59DD, 0x59DD, 0x1AA3, 0x59DE, 0x59DE, 0x1A9F, 0x59E0, 0x59E0, 0x1AAF,\n    0x59E1, 0x59E1, 0x1A9E, 0x59E3, 0x59E3, 0x06F7, 0x59E4, 0x59E4, 0x1AA8,\n    0x59E5, 0x59E5, 0x06FA, 0x59E6, 0x59E6, 0x06FD, 0x59E8, 0x59E8, 0x06F8,\n    0x59E9, 0x59E9, 0x1AAC, 0x59EA, 0x59EA, 0x06FB, 0x59EB, 0x59EB, 0x3D59,\n    0x59EC, 0x59EC, 0x088A, 0x59ED, 0x59ED, 0x1AB2, 0x59EE, 0x59EE, 0x1AA0,\n    0x59EF, 0x59EF, 0x3D38, 0x59F0, 0x59F0, 0x3BB2, 0x59F1, 0x59F1, 0x1AA2,\n    0x59F2, 0x59F2, 0x1AA9, 0x59F3, 0x59F3, 0x1AAD, 0x59F4, 0x59F4, 0x1AB1,\n    0x59F5, 0x59F5, 0x1AAE, 0x59F6, 0x59F6, 0x1AA7, 0x59F7, 0x59F7, 0x1AAA,\n    0x59F8, 0x59F8, 0x3E4A, 0x59F9, 0x59F9, 0x40F8, 0x59FA, 0x59FA, 0x1AA4,\n    0x59FB, 0x59FB, 0x06FF, 0x59FC, 0x59FC, 0x1AA6, 0x59FD, 0x59FD, 0x1AA5,\n    0x59FE, 0x59FE, 0x1AB0, 0x59FF, 0x59FF, 0x06F6, 0x5A00, 0x5A00, 0x1AA1,\n    0x5A01, 0x5A01, 0x06FE, 0x5A02, 0x5A02, 0x3B8D, 0x5A03, 0x5A03, 0x06F9,\n    0x5A09, 0x5A09, 0x0890, 0x5A0A, 0x5A0A, 0x1C75, 0x5A0B, 0x5A0B, 0x3C89,\n    0x5A0C, 0x5A0C, 0x088F, 0x5A0D, 0x5A0D, 0x3B38, 0x5A0F, 0x5A0F, 0x1C73,\n    0x5A11, 0x5A11, 0x0884, 0x5A12, 0x5A12, 0x3A13, 0x5A13, 0x5A13, 0x0889,\n    0x5A15, 0x5A15, 0x1C72, 0x5A16, 0x5A16, 0x1C6F, 0x5A17, 0x5A17, 0x1C74,\n    0x5A18, 0x5A18, 0x0885, 0x5A19, 0x5A19, 0x1C6E, 0x5A1B, 0x5A1B, 0x0888,\n    0x5A1C, 0x5A1C, 0x0886, 0x5A1E, 0x5A1E, 0x1C76, 0x5A1F, 0x5A1F, 0x0887,\n    0x5A20, 0x5A20, 0x088B, 0x5A21, 0x5A21, 0x3A1B, 0x5A23, 0x5A23, 0x088C,\n    0x5A24, 0x5A24, 0x40E8, 0x5A25, 0x5A25, 0x088E, 0x5A27, 0x5A27, 0x3DE1,\n    0x5A29, 0x5A29, 0x088D, 0x5A2A, 0x5A2A, 0x3B3B, 0x5A2B, 0x5A2B, 0x3D40,\n    0x5A2C, 0x5A2C, 0x3A0F, 0x5A2D, 0x5A2E, 0x1C70, 0x5A33, 0x5A33, 0x1C77,\n    0x5A35, 0x5A35, 0x1E9C, 0x5A36, 0x5A36, 0x0A46, 0x5A37, 0x5A37, 0x20FD,\n    0x5A38, 0x5A38, 0x1E9B, 0x5A39, 0x5A39, 0x1EAE, 0x5A3C, 0x5A3C, 0x0A4C,\n    0x5A3D, 0x5A3D, 0x3AC0, 0x5A3E, 0x5A3E, 0x1EAC, 0x5A40, 0x5A40, 0x0A4B,\n    0x5A41, 0x5A41, 0x0A47, 0x5A42, 0x5A42, 0x1EB5, 0x5A43, 0x5A43, 0x1EA5,\n    0x5A44, 0x5A44, 0x1EA8, 0x5A45, 0x5A45, 0x3917, 0x5A46, 0x5A46, 0x0A4F,\n    0x5A47, 0x5A47, 0x1EB2, 0x5A48, 0x5A48, 0x1EAA, 0x5A49, 0x5A49, 0x0A48,\n    0x5A4A, 0x5A4A, 0x0A50, 0x5A4C, 0x5A4C, 0x1EAF, 0x5A4D, 0x5A4D, 0x1EAD,\n    0x5A50, 0x5A50, 0x1E9E, 0x5A51, 0x5A51, 0x1EB3, 0x5A52, 0x5A52, 0x1EA7,\n    0x5A53, 0x5A53, 0x1EA2, 0x5A54, 0x5A54, 0x4603, 0x5A55, 0x5A55, 0x1E98,\n    0x5A56, 0x5A56, 0x1EB4, 0x5A57, 0x5A57, 0x1EA4, 0x5A58, 0x5A58, 0x1E97,\n    0x5A59, 0x5A59, 0x3B34, 0x5A5A, 0x5A5A, 0x0A4E, 0x5A5B, 0x5A5B, 0x1EA9,\n    0x5A5C, 0x5A5C, 0x1EB6, 0x5A5D, 0x5A5D, 0x1EA6, 0x5A5E, 0x5A5E, 0x1E9A,\n    0x5A5F, 0x5A5F, 0x1E9F, 0x5A60, 0x5A60, 0x1E96, 0x5A61, 0x5A61, 0x3D33,\n    0x5A62, 0x5A62, 0x0A4D, 0x5A63, 0x5A63, 0x40FB, 0x5A64, 0x5A64, 0x1EA3,\n    0x5A65, 0x5A65, 0x1EA0, 0x5A66, 0x5A66, 0x0A49, 0x5A67, 0x5A67, 0x1E99,\n    0x5A68, 0x5A68, 0x39B7, 0x5A69, 0x5A69, 0x1EB1, 0x5A6A, 0x5A6A, 0x0A4A,\n    0x5A6B, 0x5A6B, 0x3A42, 0x5A6C, 0x5A6C, 0x1EA1, 0x5A6D, 0x5A6D, 0x1E9D,\n    0x5A6E, 0x5A6E, 0x3D3F, 0x5A70, 0x5A70, 0x1EB0, 0x5A71, 0x5A71, 0x3D34,\n    0x5A77, 0x5A77, 0x0C23, 0x5A78, 0x5A78, 0x20F6, 0x5A79, 0x5A79, 0x3CE1,\n    0x5A7A, 0x5A7A, 0x20F3, 0x5A7B, 0x5A7B, 0x2104, 0x5A7C, 0x5A7C, 0x20F8,\n    0x5A7D, 0x5A7D, 0x2105, 0x5A7E, 0x5A7E, 0x3A11, 0x5A7F, 0x5A7F, 0x0C25,\n    0x5A81, 0x5A81, 0x3A1D, 0x5A82, 0x5A82, 0x3D31, 0x5A83, 0x5A83, 0x2101,\n    0x5A84, 0x5A84, 0x20FE, 0x5A86, 0x5A86, 0x3B81, 0x5A88, 0x5A88, 0x4263,\n    0x5A8A, 0x5A8A, 0x20FF, 0x5A8B, 0x5A8B, 0x2102, 0x5A8C, 0x5A8C, 0x2106,\n    0x5A8E, 0x5A8E, 0x1EAB, 0x5A8F, 0x5A8F, 0x2108, 0x5A90, 0x5A90, 0x23B6,\n    0x5A91, 0x5A91, 0x4235, 0x5A92, 0x5A92, 0x0C26, 0x5A93, 0x5A93, 0x2109,\n    0x5A94, 0x5A94, 0x20F1, 0x5A95, 0x5A95, 0x20FB, 0x5A96, 0x5A96, 0x4100,\n    0x5A97, 0x5A97, 0x2100, 0x5A99, 0x5A99, 0x3A0A, 0x5A9A, 0x5A9A, 0x0C24,\n    0x5A9B, 0x5A9B, 0x0C27, 0x5A9C, 0x5A9C, 0x2107, 0x5A9D, 0x5A9D, 0x210A,\n    0x5A9E, 0x5A9E, 0x20F5, 0x5A9F, 0x5A9F, 0x20F2, 0x5AA0, 0x5AA0, 0x4172,\n    0x5AA1, 0x5AA1, 0x3CDC, 0x5AA2, 0x5AA2, 0x20F4, 0x5AA5, 0x5AA5, 0x20F9,\n    0x5AA6, 0x5AA6, 0x20F7, 0x5AA7, 0x5AA7, 0x0C28, 0x5AA9, 0x5AA9, 0x2103,\n    0x5AAB, 0x5AAB, 0x40FA, 0x5AAC, 0x5AAC, 0x20FA, 0x5AAE, 0x5AAE, 0x20FC,\n    0x5AAF, 0x5AAF, 0x20F0, 0x5AB0, 0x5AB0, 0x23AA, 0x5AB1, 0x5AB1, 0x23A8,\n    0x5AB2, 0x5AB2, 0x0DFC, 0x5AB3, 0x5AB3, 0x0DFA, 0x5AB4, 0x5AB4, 0x23B2,\n    0x5AB5, 0x5AB5, 0x23A9, 0x5AB6, 0x5AB6, 0x23B3, 0x5AB7, 0x5AB7, 0x23AF,\n    0x5AB8, 0x5AB8, 0x23A7, 0x5AB9, 0x5AB9, 0x23B5, 0x5ABA, 0x5ABA, 0x23A6,\n    0x5ABB, 0x5ABB, 0x23AD, 0x5ABC, 0x5ABC, 0x0DF9, 0x5ABD, 0x5ABD, 0x0DF8,\n    0x5ABE, 0x5ABE, 0x0DF7, 0x5ABF, 0x5ABF, 0x23AB, 0x5AC0, 0x5AC0, 0x23B0,\n    0x5AC1, 0x5AC1, 0x0DF4, 0x5AC2, 0x5AC2, 0x0DFB, 0x5AC3, 0x5AC3, 0x3896,\n    0x5AC4, 0x5AC4, 0x23A4, 0x5AC6, 0x5AC6, 0x23AE, 0x5AC7, 0x5AC7, 0x23A3,\n    0x5AC8, 0x5AC8, 0x23AC, 0x5AC9, 0x5AC9, 0x0DF5, 0x5ACA, 0x5ACA, 0x23B1,\n    0x5ACB, 0x5ACB, 0x23A5, 0x5ACC, 0x5ACC, 0x0DF6, 0x5ACD, 0x5ACD, 0x23B4,\n    0x5ACE, 0x5ACE, 0x3C88, 0x5ACF, 0x5ACF, 0x43B5, 0x5AD3, 0x5AD3, 0x4102,\n    0x5AD5, 0x5AD5, 0x2650, 0x5AD6, 0x5AD6, 0x0FB4, 0x5AD7, 0x5AD7, 0x0FB3,\n    0x5AD8, 0x5AD8, 0x0FB5, 0x5AD9, 0x5AD9, 0x265C, 0x5ADA, 0x5ADA, 0x2652,\n    0x5ADB, 0x5ADB, 0x2658, 0x5ADC, 0x5ADC, 0x264D, 0x5ADD, 0x5ADD, 0x265B,\n    0x5ADE, 0x5ADE, 0x265A, 0x5ADF, 0x5ADF, 0x265E, 0x5AE0, 0x5AE0, 0x2657,\n    0x5AE1, 0x5AE1, 0x0FB0, 0x5AE2, 0x5AE2, 0x2656, 0x5AE3, 0x5AE3, 0x0FB6,\n    0x5AE4, 0x5AE4, 0x3B86, 0x5AE5, 0x5AE5, 0x264F, 0x5AE6, 0x5AE6, 0x0FB1,\n    0x5AE8, 0x5AE8, 0x265D, 0x5AE9, 0x5AE9, 0x0FB2, 0x5AEA, 0x5AEA, 0x2651,\n    0x5AEB, 0x5AEB, 0x2654, 0x5AEC, 0x5AEC, 0x2659, 0x5AED, 0x5AED, 0x2653,\n    0x5AEE, 0x5AEE, 0x264E, 0x5AF0, 0x5AF0, 0x3EE7, 0x5AF2, 0x5AF2, 0x37F5,\n    0x5AF3, 0x5AF3, 0x2655, 0x5AF4, 0x5AF4, 0x28AB, 0x5AF5, 0x5AF5, 0x112D,\n    0x5AF6, 0x5AF6, 0x28AE, 0x5AF7, 0x5AF7, 0x28AD, 0x5AF8, 0x5AF8, 0x28B0,\n    0x5AF9, 0x5AF9, 0x28B2, 0x5AFA, 0x5AFA, 0x36EE, 0x5AFB, 0x5AFB, 0x112B,\n    0x5AFD, 0x5AFD, 0x28AC, 0x5AFE, 0x5AFE, 0x3C1D, 0x5AFF, 0x5AFF, 0x28AA,\n    0x5B01, 0x5B01, 0x28B3, 0x5B02, 0x5B02, 0x28B1, 0x5B03, 0x5B03, 0x28AF,\n    0x5B05, 0x5B05, 0x28B5, 0x5B07, 0x5B07, 0x28B4, 0x5B08, 0x5B08, 0x112F,\n    0x5B09, 0x5B09, 0x112A, 0x5B0B, 0x5B0B, 0x112C, 0x5B0C, 0x5B0C, 0x112E,\n    0x5B0D, 0x5B0D, 0x48FF, 0x5B0F, 0x5B0F, 0x28B6, 0x5B10, 0x5B10, 0x2B22,\n    0x5B11, 0x5B11, 0x3BF6, 0x5B13, 0x5B13, 0x2B21, 0x5B14, 0x5B14, 0x2B20,\n    0x5B16, 0x5B16, 0x2B23, 0x5B17, 0x5B17, 0x2B1C, 0x5B19, 0x5B19, 0x2B1D,\n    0x5B1A, 0x5B1A, 0x2B25, 0x5B1B, 0x5B1B, 0x2B1E, 0x5B1D, 0x5B1D, 0x12A8,\n    0x5B1E, 0x5B1E, 0x2B27, 0x5B1F, 0x5B1F, 0x4941, 0x5B20, 0x5B20, 0x2B26,\n    0x5B21, 0x5B21, 0x2B1F, 0x5B23, 0x5B23, 0x2D52, 0x5B24, 0x5B24, 0x13C5,\n    0x5B25, 0x5B25, 0x2D50, 0x5B26, 0x5B26, 0x2D55, 0x5B27, 0x5B27, 0x2D54,\n    0x5B28, 0x5B28, 0x2B24, 0x5B2A, 0x5B2A, 0x13C4, 0x5B2B, 0x5B2B, 0x3B84,\n    0x5B2C, 0x5B2C, 0x2D53, 0x5B2D, 0x5B2D, 0x2D4F, 0x5B2E, 0x5B2E, 0x2D57,\n    0x5B2F, 0x5B2F, 0x2D56, 0x5B30, 0x5B30, 0x13C3, 0x5B32, 0x5B32, 0x2D51,\n    0x5B34, 0x5B34, 0x12A9, 0x5B38, 0x5B38, 0x14CE, 0x5B3C, 0x5B3C, 0x2F18,\n    0x5B3D, 0x5B3F, 0x3089, 0x5B40, 0x5B40, 0x160F, 0x5B41, 0x5B41, 0x38C8,\n    0x5B43, 0x5B43, 0x1610, 0x5B44, 0x5B44, 0x3A44, 0x5B45, 0x5B45, 0x31CC,\n    0x5B46, 0x5B46, 0x42B2, 0x5B47, 0x5B47, 0x32CD, 0x5B48, 0x5B48, 0x32CC,\n    0x5B4A, 0x5B4A, 0x38CD, 0x5B4B, 0x5B4C, 0x337C, 0x5B4D, 0x5B4D, 0x3413,\n    0x5B4E, 0x5B4E, 0x3482, 0x5B4F, 0x5B4F, 0x3A31, 0x5B50, 0x5B51, 0x027F,\n    0x5B53, 0x5B53, 0x0281, 0x5B54, 0x5B54, 0x02C6, 0x5B55, 0x5B55, 0x0333,\n    0x5B56, 0x5B56, 0x17DC, 0x5B57, 0x5B58, 0x03BF, 0x5B5A, 0x5B5B, 0x047F,\n    0x5B5C, 0x5B5C, 0x047E, 0x5B5D, 0x5B5D, 0x047D, 0x5B5F, 0x5B5F, 0x0597,\n    0x5B62, 0x5B62, 0x1957, 0x5B63, 0x5B63, 0x0599, 0x5B64, 0x5B64, 0x0598,\n    0x5B65, 0x5B65, 0x1958, 0x5B66, 0x5B66, 0x454E, 0x5B68, 0x5B68, 0x461D,\n    0x5B69, 0x5B69, 0x0700, 0x5B6B, 0x5B6B, 0x0891, 0x5B6C, 0x5B6C, 0x1C78,\n    0x5B6D, 0x5B6D, 0x3E5F, 0x5B6E, 0x5B6E, 0x1EB8, 0x5B70, 0x5B70, 0x0A51,\n    0x5B71, 0x5B71, 0x0C2A, 0x5B72, 0x5B72, 0x1EB7, 0x5B73, 0x5B73, 0x0C29,\n    0x5B74, 0x5B74, 0x3732, 0x5B75, 0x5B75, 0x0FB7, 0x5B76, 0x5B76, 0x410A,\n    0x5B77, 0x5B77, 0x265F, 0x5B78, 0x5B78, 0x12AA, 0x5B7A, 0x5B7A, 0x13C6,\n    0x5B7B, 0x5B7B, 0x2D58, 0x5B7C, 0x5B7C, 0x410C, 0x5B7D, 0x5B7D, 0x1611,\n    0x5B7F, 0x5B7F, 0x16C0, 0x5B80, 0x5B80, 0x0225, 0x5B81, 0x5B81, 0x179E,\n    0x5B82, 0x5B82, 0x4044, 0x5B83, 0x5B83, 0x0334, 0x5B84, 0x5B84, 0x179F,\n    0x5B85, 0x5B85, 0x03C3, 0x5B87, 0x5B88, 0x03C1, 0x5B89, 0x5B89, 0x03C4,\n    0x5B8B, 0x5B8B, 0x0482, 0x5B8C, 0x5B8C, 0x0481, 0x5B8E, 0x5B8E, 0x1863,\n    0x5B8F, 0x5B8F, 0x0483, 0x5B90, 0x5B90, 0x48E9, 0x5B92, 0x5B92, 0x1864,\n    0x5B93, 0x5B93, 0x1959, 0x5B95, 0x5B95, 0x195A, 0x5B97, 0x5B97, 0x059A,\n    0x5B98, 0x5B98, 0x059C, 0x5B99, 0x5B99, 0x059E, 0x5B9A, 0x5B9A, 0x059B,\n    0x5B9B, 0x5B9B, 0x059F, 0x5B9C, 0x5B9C, 0x059D, 0x5B9D, 0x5B9D, 0x4116,\n    0x5B9E, 0x5B9F, 0x454F, 0x5BA2, 0x5BA2, 0x0704, 0x5BA3, 0x5BA3, 0x0701,\n    0x5BA4, 0x5BA4, 0x0703, 0x5BA5, 0x5BA5, 0x0705, 0x5BA6, 0x5BA6, 0x0702,\n    0x5BA7, 0x5BA7, 0x1C79, 0x5BA8, 0x5BA8, 0x1AB3, 0x5BAA, 0x5BAA, 0x417B,\n    0x5BAC, 0x5BAC, 0x1C7B, 0x5BAD, 0x5BAD, 0x1C7A, 0x5BAE, 0x5BAE, 0x0897,\n    0x5BB0, 0x5BB0, 0x0893, 0x5BB3, 0x5BB3, 0x0894, 0x5BB4, 0x5BB4, 0x0896,\n    0x5BB5, 0x5BB5, 0x0898, 0x5BB6, 0x5BB6, 0x0895, 0x5BB8, 0x5BB8, 0x089A,\n    0x5BB9, 0x5BB9, 0x0899, 0x5BBF, 0x5BBF, 0x0A56, 0x5BC0, 0x5BC0, 0x1EBA,\n    0x5BC1, 0x5BC1, 0x1EB9, 0x5BC2, 0x5BC2, 0x0A55, 0x5BC3, 0x5BC3, 0x3F25,\n    0x5BC4, 0x5BC4, 0x0A54, 0x5BC5, 0x5BC5, 0x0A53, 0x5BC6, 0x5BC6, 0x0A57,\n    0x5BC7, 0x5BC7, 0x0A52, 0x5BCA, 0x5BCA, 0x2110, 0x5BCB, 0x5BCB, 0x210D,\n    0x5BCC, 0x5BCC, 0x0C2C, 0x5BCD, 0x5BCD, 0x210C, 0x5BCE, 0x5BCE, 0x2111,\n    0x5BD0, 0x5BD0, 0x0C2E, 0x5BD1, 0x5BD1, 0x210F, 0x5BD2, 0x5BD2, 0x0C2B,\n    0x5BD3, 0x5BD3, 0x0C2D, 0x5BD4, 0x5BD4, 0x210E, 0x5BD5, 0x5BD5, 0x4111,\n    0x5BD6, 0x5BD6, 0x23B7, 0x5BD7, 0x5BD7, 0x42BB, 0x5BD8, 0x5BD9, 0x23B8,\n    0x5BDE, 0x5BDE, 0x0FB8, 0x5BDF, 0x5BDF, 0x0FC0, 0x5BE0, 0x5BE0, 0x2660,\n    0x5BE1, 0x5BE1, 0x0FBA, 0x5BE2, 0x5BE2, 0x0FBE, 0x5BE3, 0x5BE3, 0x2661,\n    0x5BE4, 0x5BE4, 0x0FBF, 0x5BE5, 0x5BE6, 0x0FBB, 0x5BE7, 0x5BE7, 0x0FB9,\n    0x5BE8, 0x5BE8, 0x0FBD, 0x5BE9, 0x5BE9, 0x1132, 0x5BEA, 0x5BEA, 0x210B,\n    0x5BEB, 0x5BEB, 0x1133, 0x5BEC, 0x5BEC, 0x1131, 0x5BEE, 0x5BEE, 0x1130,\n    0x5BEF, 0x5BEF, 0x2B28, 0x5BF0, 0x5BF0, 0x12AB, 0x5BF1, 0x5BF2, 0x2D59,\n    0x5BF3, 0x5BF3, 0x4115, 0x5BF5, 0x5BF5, 0x157B, 0x5BF6, 0x5BF6, 0x1612,\n    0x5BF8, 0x5BF8, 0x0282, 0x5BFA, 0x5BFA, 0x03C5, 0x5BFF, 0x5BFF, 0x40DD,\n    0x5C01, 0x5C01, 0x0706, 0x5C03, 0x5C03, 0x1C7C, 0x5C04, 0x5C04, 0x089B,\n    0x5C05, 0x5C05, 0x4118, 0x5C07, 0x5C07, 0x0A5A, 0x5C08, 0x5C08, 0x0A59,\n    0x5C09, 0x5C09, 0x0A58, 0x5C0A, 0x5C0B, 0x0C2F, 0x5C0C, 0x5C0C, 0x2112,\n    0x5C0D, 0x5C0D, 0x0FC1, 0x5C0E, 0x5C0E, 0x12AC, 0x5C0F, 0x5C0F, 0x0283,\n    0x5C10, 0x5C10, 0x1787, 0x5C11, 0x5C11, 0x02C7, 0x5C12, 0x5C12, 0x17A0,\n    0x5C13, 0x5C13, 0x411A, 0x5C14, 0x5C14, 0x411C, 0x5C15, 0x5C15, 0x17DD,\n    0x5C16, 0x5C16, 0x03C6, 0x5C1A, 0x5C1A, 0x05A0, 0x5C1C, 0x5C1C, 0x45EA,\n    0x5C1E, 0x5C1E, 0x3A29, 0x5C1F, 0x5C1F, 0x23BA, 0x5C20, 0x5C20, 0x3D89,\n    0x5C22, 0x5C22, 0x0284, 0x5C23, 0x5C23, 0x44E8, 0x5C24, 0x5C24, 0x02C8,\n    0x5C25, 0x5C25, 0x17DE, 0x5C28, 0x5C28, 0x1865, 0x5C2A, 0x5C2A, 0x1866,\n    0x5C2C, 0x5C2C, 0x0484, 0x5C30, 0x5C30, 0x2113, 0x5C31, 0x5C31, 0x0C31,\n    0x5C33, 0x5C33, 0x23BB, 0x5C37, 0x5C37, 0x13C7, 0x5C38, 0x5C38, 0x0285,\n    0x5C39, 0x5C39, 0x0299, 0x5C3A, 0x5C3A, 0x02C9, 0x5C3B, 0x5C3B, 0x17A1,\n    0x5C3C, 0x5C3C, 0x0335, 0x5C3E, 0x5C3E, 0x0488, 0x5C3F, 0x5C3F, 0x0487,\n    0x5C40, 0x5C41, 0x0485, 0x5C44, 0x5C44, 0x195B, 0x5C45, 0x5C46, 0x05A2,\n    0x5C47, 0x5C47, 0x195C, 0x5C48, 0x5C48, 0x05A1, 0x5C49, 0x5C49, 0x411F,\n    0x5C4A, 0x5C4A, 0x3F5C, 0x5C4B, 0x5C4B, 0x070A, 0x5C4C, 0x5C4C, 0x1AB4,\n    0x5C4D, 0x5C4D, 0x0709, 0x5C4E, 0x5C4F, 0x0707, 0x5C50, 0x5C50, 0x089E,\n    0x5C51, 0x5C51, 0x089C, 0x5C53, 0x5C53, 0x3F02, 0x5C54, 0x5C54, 0x1C7E,\n    0x5C55, 0x5C55, 0x089D, 0x5C56, 0x5C56, 0x1C7D, 0x5C58, 0x5C58, 0x0892,\n    0x5C59, 0x5C59, 0x1EBB, 0x5C5C, 0x5C5D, 0x0A5C, 0x5C5E, 0x5C5E, 0x3D67,\n    0x5C60, 0x5C60, 0x0A5B, 0x5C62, 0x5C62, 0x0FC2, 0x5C63, 0x5C63, 0x2662,\n    0x5C64, 0x5C65, 0x1134, 0x5C67, 0x5C67, 0x28B7, 0x5C68, 0x5C68, 0x13C8,\n    0x5C69, 0x5C6A, 0x2F19, 0x5C6C, 0x5C6C, 0x166E, 0x5C6D, 0x5C6D, 0x3483,\n    0x5C6E, 0x5C6E, 0x1776, 0x5C6F, 0x5C6F, 0x02CA, 0x5C71, 0x5C71, 0x0286,\n    0x5C73, 0x5C73, 0x17A3, 0x5C74, 0x5C74, 0x17A2, 0x5C79, 0x5C79, 0x03C7,\n    0x5C7A, 0x5C7B, 0x17E0, 0x5C7C, 0x5C7C, 0x17DF, 0x5C7E, 0x5C7E, 0x17E2,\n    0x5C85, 0x5C85, 0x4121, 0x5C86, 0x5C86, 0x186E, 0x5C88, 0x5C88, 0x1869,\n    0x5C89, 0x5C89, 0x186B, 0x5C8A, 0x5C8A, 0x186D, 0x5C8B, 0x5C8B, 0x186A,\n    0x5C8C, 0x5C8C, 0x048C, 0x5C8D, 0x5C8D, 0x1867, 0x5C8F, 0x5C8F, 0x1868,\n    0x5C90, 0x5C91, 0x0489, 0x5C92, 0x5C92, 0x186C, 0x5C93, 0x5C93, 0x186F,\n    0x5C94, 0x5C94, 0x048B, 0x5C95, 0x5C95, 0x1870, 0x5C99, 0x5C99, 0x468C,\n    0x5C9A, 0x5C9A, 0x4551, 0x5C9C, 0x5C9C, 0x495A, 0x5C9D, 0x5C9D, 0x196A,\n    0x5C9E, 0x5C9E, 0x3A2A, 0x5C9F, 0x5C9F, 0x1964, 0x5CA0, 0x5CA0, 0x195F,\n    0x5CA1, 0x5CA1, 0x05A5, 0x5CA2, 0x5CA2, 0x1967, 0x5CA3, 0x5CA3, 0x1965,\n    0x5CA4, 0x5CA4, 0x195E, 0x5CA5, 0x5CA5, 0x196B, 0x5CA6, 0x5CA6, 0x196E,\n    0x5CA7, 0x5CA7, 0x1969, 0x5CA8, 0x5CA8, 0x1962, 0x5CA9, 0x5CA9, 0x05A7,\n    0x5CAA, 0x5CAA, 0x1968, 0x5CAB, 0x5CAB, 0x05A8, 0x5CAC, 0x5CAC, 0x1963,\n    0x5CAD, 0x5CAD, 0x1966, 0x5CAE, 0x5CAE, 0x195D, 0x5CAF, 0x5CAF, 0x1961,\n    0x5CB0, 0x5CB0, 0x196D, 0x5CB1, 0x5CB1, 0x05A9, 0x5CB3, 0x5CB3, 0x05AA,\n    0x5CB5, 0x5CB5, 0x1960, 0x5CB6, 0x5CB6, 0x196C, 0x5CB7, 0x5CB7, 0x05A4,\n    0x5CB8, 0x5CB8, 0x05A6, 0x5CBA, 0x5CBA, 0x412B, 0x5CC1, 0x5CC1, 0x43B8,\n    0x5CC2, 0x5CC2, 0x3D4C, 0x5CC6, 0x5CC6, 0x1AC5, 0x5CC7, 0x5CC7, 0x1ABE,\n    0x5CC8, 0x5CC8, 0x1AC4, 0x5CC9, 0x5CC9, 0x1ABD, 0x5CCA, 0x5CCA, 0x1ABF,\n    0x5CCB, 0x5CCB, 0x1AB9, 0x5CCC, 0x5CCC, 0x1AB7, 0x5CCE, 0x5CCE, 0x1AC6,\n    0x5CCF, 0x5CCF, 0x1AC3, 0x5CD0, 0x5CD0, 0x1AB5, 0x5CD1, 0x5CD1, 0x3F13,\n    0x5CD2, 0x5CD2, 0x070C, 0x5CD3, 0x5CD4, 0x1AC1, 0x5CD6, 0x5CD6, 0x1AC0,\n    0x5CD7, 0x5CD7, 0x1AB8, 0x5CD8, 0x5CD8, 0x1AB6, 0x5CD9, 0x5CD9, 0x070B,\n    0x5CDA, 0x5CDA, 0x1ABC, 0x5CDB, 0x5CDB, 0x1ABA, 0x5CDE, 0x5CDE, 0x1ABB,\n    0x5CDF, 0x5CDF, 0x1AC7, 0x5CE5, 0x5CE5, 0x4637, 0x5CE8, 0x5CE8, 0x08A3,\n    0x5CE9, 0x5CE9, 0x4122, 0x5CEA, 0x5CEA, 0x08A2, 0x5CEC, 0x5CEC, 0x1C7F,\n    0x5CED, 0x5CED, 0x089F, 0x5CEE, 0x5CEE, 0x1C81, 0x5CEF, 0x5CEF, 0x4123,\n    0x5CF0, 0x5CF0, 0x08A4, 0x5CF1, 0x5CF1, 0x1C82, 0x5CF4, 0x5CF4, 0x08A7,\n    0x5CF6, 0x5CF6, 0x08A5, 0x5CF7, 0x5CF7, 0x1C83, 0x5CF8, 0x5CF8, 0x1AC8,\n    0x5CF9, 0x5CF9, 0x1C85, 0x5CFB, 0x5CFB, 0x08A1, 0x5CFD, 0x5CFD, 0x08A0,\n    0x5CFF, 0x5CFF, 0x1C80, 0x5D00, 0x5D00, 0x1C84, 0x5D01, 0x5D01, 0x08A6,\n    0x5D06, 0x5D06, 0x0A5F, 0x5D07, 0x5D07, 0x0A5E, 0x5D0B, 0x5D0B, 0x1EBD,\n    0x5D0C, 0x5D0C, 0x1EC1, 0x5D0D, 0x5D0D, 0x1EC3, 0x5D0E, 0x5D0E, 0x0A60,\n    0x5D0F, 0x5D0F, 0x1EC6, 0x5D10, 0x5D10, 0x4127, 0x5D11, 0x5D11, 0x0A64,\n    0x5D12, 0x5D12, 0x1EC8, 0x5D14, 0x5D14, 0x0A66, 0x5D15, 0x5D15, 0x43B9,\n    0x5D16, 0x5D16, 0x0A62, 0x5D17, 0x5D17, 0x0A6A, 0x5D18, 0x5D18, 0x4128,\n    0x5D19, 0x5D19, 0x0A67, 0x5D1A, 0x5D1A, 0x1EBF, 0x5D1B, 0x5D1B, 0x0A61,\n    0x5D1D, 0x5D1D, 0x1EBE, 0x5D1E, 0x5D1E, 0x1EBC, 0x5D1F, 0x5D1F, 0x1ECA,\n    0x5D20, 0x5D20, 0x1EC0, 0x5D22, 0x5D22, 0x0A63, 0x5D23, 0x5D23, 0x1EC9,\n    0x5D24, 0x5D24, 0x0A68, 0x5D25, 0x5D25, 0x1EC5, 0x5D26, 0x5D26, 0x1EC4,\n    0x5D27, 0x5D27, 0x0A69, 0x5D28, 0x5D28, 0x1EC2, 0x5D29, 0x5D29, 0x0A65,\n    0x5D2C, 0x5D2C, 0x3DF7, 0x5D2E, 0x5D2E, 0x1ECB, 0x5D2F, 0x5D2F, 0x46D3,\n    0x5D30, 0x5D30, 0x1EC7, 0x5D31, 0x5D31, 0x2122, 0x5D32, 0x5D32, 0x2129,\n    0x5D33, 0x5D33, 0x211E, 0x5D34, 0x5D34, 0x0C34, 0x5D35, 0x5D35, 0x211A,\n    0x5D36, 0x5D36, 0x212A, 0x5D37, 0x5D37, 0x2114, 0x5D38, 0x5D38, 0x2127,\n    0x5D39, 0x5D39, 0x2125, 0x5D3A, 0x5D3A, 0x211F, 0x5D3C, 0x5D3C, 0x2128,\n    0x5D3D, 0x5D3D, 0x2121, 0x5D3E, 0x5D3E, 0x4629, 0x5D3F, 0x5D3F, 0x2119,\n    0x5D40, 0x5D40, 0x212B, 0x5D41, 0x5D41, 0x2117, 0x5D42, 0x5D42, 0x2124,\n    0x5D43, 0x5D43, 0x2115, 0x5D45, 0x5D45, 0x212C, 0x5D46, 0x5D46, 0x4129,\n    0x5D47, 0x5D47, 0x0C35, 0x5D48, 0x5D48, 0x462A, 0x5D49, 0x5D49, 0x2126,\n    0x5D4A, 0x5D4A, 0x23BE, 0x5D4B, 0x5D4B, 0x2118, 0x5D4C, 0x5D4C, 0x0C32,\n    0x5D4E, 0x5D4E, 0x211C, 0x5D50, 0x5D50, 0x0C33, 0x5D51, 0x5D51, 0x211B,\n    0x5D52, 0x5D52, 0x2120, 0x5D55, 0x5D55, 0x211D, 0x5D56, 0x5D56, 0x43BA,\n    0x5D57, 0x5D57, 0x3FCA, 0x5D59, 0x5D59, 0x2123, 0x5D5B, 0x5D5B, 0x3DD5,\n    0x5D5E, 0x5D5E, 0x23C2, 0x5D62, 0x5D62, 0x23C5, 0x5D63, 0x5D63, 0x23BD,\n    0x5D65, 0x5D65, 0x23BF, 0x5D67, 0x5D67, 0x23C4, 0x5D68, 0x5D68, 0x23C3,\n    0x5D69, 0x5D69, 0x0DFD, 0x5D6B, 0x5D6B, 0x2116, 0x5D6C, 0x5D6C, 0x23C1,\n    0x5D6F, 0x5D6F, 0x0DFE, 0x5D70, 0x5D70, 0x46E4, 0x5D71, 0x5D71, 0x23BC,\n    0x5D72, 0x5D72, 0x23C0, 0x5D74, 0x5D74, 0x3EEF, 0x5D77, 0x5D77, 0x2669,\n    0x5D79, 0x5D79, 0x2670, 0x5D7A, 0x5D7A, 0x2667, 0x5D7C, 0x5D7C, 0x266E,\n    0x5D7D, 0x5D7D, 0x2665, 0x5D7E, 0x5D7E, 0x266D, 0x5D7F, 0x5D7F, 0x2671,\n    0x5D80, 0x5D80, 0x2664, 0x5D81, 0x5D81, 0x2668, 0x5D82, 0x5D82, 0x2663,\n    0x5D84, 0x5D84, 0x0FC3, 0x5D85, 0x5D85, 0x3E34, 0x5D86, 0x5D86, 0x2666,\n    0x5D87, 0x5D87, 0x0FC4, 0x5D88, 0x5D88, 0x266C, 0x5D89, 0x5D89, 0x266B,\n    0x5D8A, 0x5D8A, 0x266A, 0x5D8B, 0x5D8B, 0x4124, 0x5D8D, 0x5D8D, 0x266F,\n    0x5D8E, 0x5D8E, 0x3F0C, 0x5D92, 0x5D92, 0x28BB, 0x5D93, 0x5D93, 0x28BD,\n    0x5D94, 0x5D94, 0x1137, 0x5D95, 0x5D95, 0x28BE, 0x5D97, 0x5D97, 0x28B9,\n    0x5D99, 0x5D99, 0x28B8, 0x5D9A, 0x5D9A, 0x28C2, 0x5D9C, 0x5D9C, 0x28C0,\n    0x5D9D, 0x5D9D, 0x1136, 0x5D9E, 0x5D9E, 0x28C3, 0x5D9F, 0x5D9F, 0x28BA,\n    0x5DA0, 0x5DA0, 0x28BF, 0x5DA1, 0x5DA1, 0x28C1, 0x5DA2, 0x5DA2, 0x28BC,\n    0x5DA4, 0x5DA4, 0x462D, 0x5DA7, 0x5DA7, 0x2B2C, 0x5DA8, 0x5DA8, 0x2B31,\n    0x5DA9, 0x5DA9, 0x2B2B, 0x5DAA, 0x5DAA, 0x2B30, 0x5DAB, 0x5DAB, 0x3E39,\n    0x5DAC, 0x5DAC, 0x2B29, 0x5DAD, 0x5DAD, 0x2B33, 0x5DAE, 0x5DAE, 0x2B2F,\n    0x5DAF, 0x5DAF, 0x2B34, 0x5DB0, 0x5DB0, 0x2B2E, 0x5DB1, 0x5DB1, 0x2B2A,\n    0x5DB2, 0x5DB2, 0x2B32, 0x5DB4, 0x5DB4, 0x2B35, 0x5DB5, 0x5DB5, 0x2B2D,\n    0x5DB6, 0x5DB6, 0x4158, 0x5DB7, 0x5DB7, 0x2D5B, 0x5DB8, 0x5DB8, 0x13CC,\n    0x5DB9, 0x5DB9, 0x462E, 0x5DBA, 0x5DBA, 0x13CA, 0x5DBC, 0x5DBC, 0x13C9,\n    0x5DBD, 0x5DBD, 0x13CB, 0x5DC0, 0x5DC0, 0x2F1B, 0x5DC1, 0x5DC1, 0x3BFF,\n    0x5DC2, 0x5DC2, 0x3023, 0x5DC3, 0x5DC3, 0x308C, 0x5DC6, 0x5DC7, 0x31CD,\n    0x5DC9, 0x5DC9, 0x1613, 0x5DCB, 0x5DCB, 0x32CE, 0x5DCD, 0x5DCD, 0x166F,\n    0x5DCF, 0x5DCF, 0x32CF, 0x5DD1, 0x5DD1, 0x337F, 0x5DD2, 0x5DD2, 0x16C2,\n    0x5DD4, 0x5DD4, 0x16C1, 0x5DD5, 0x5DD5, 0x337E, 0x5DD6, 0x5DD6, 0x16F7,\n    0x5DD7, 0x5DD7, 0x412C, 0x5DD8, 0x5DD8, 0x3414, 0x5DDB, 0x5DDB, 0x0226,\n    0x5DDD, 0x5DDD, 0x0287, 0x5DDE, 0x5DDE, 0x03C8, 0x5DDF, 0x5DDF, 0x17E3,\n    0x5DE0, 0x5DE0, 0x1871, 0x5DE1, 0x5DE1, 0x051A, 0x5DE2, 0x5DE2, 0x0A6B,\n    0x5DE5, 0x5DE5, 0x0288, 0x5DE6, 0x5DE6, 0x0338, 0x5DE7, 0x5DE7, 0x0337,\n    0x5DE8, 0x5DE8, 0x0336, 0x5DEB, 0x5DEB, 0x048D, 0x5DEE, 0x5DEE, 0x08A8,\n    0x5DF0, 0x5DF0, 0x23C6, 0x5DF1, 0x5DF3, 0x0289, 0x5DF4, 0x5DF4, 0x02CB,\n    0x5DF5, 0x5DF5, 0x3F61, 0x5DF7, 0x5DF7, 0x070D, 0x5DF9, 0x5DF9, 0x1AC9,\n    0x5DFD, 0x5DFD, 0x0C36, 0x5DFE, 0x5DFE, 0x028C, 0x5DFF, 0x5DFF, 0x1788,\n    0x5E02, 0x5E03, 0x0339, 0x5E04, 0x5E04, 0x17A4, 0x5E06, 0x5E06, 0x03C9,\n    0x5E09, 0x5E09, 0x4140, 0x5E0A, 0x5E0A, 0x1872, 0x5E0B, 0x5E0B, 0x3D8A,\n    0x5E0C, 0x5E0C, 0x048E, 0x5E0E, 0x5E0E, 0x1873, 0x5E11, 0x5E11, 0x05B0,\n    0x5E12, 0x5E12, 0x3F2E, 0x5E14, 0x5E14, 0x1970, 0x5E15, 0x5E15, 0x05AE,\n    0x5E16, 0x5E16, 0x05AD, 0x5E17, 0x5E17, 0x196F, 0x5E18, 0x5E18, 0x05AB,\n    0x5E19, 0x5E19, 0x1971, 0x5E1A, 0x5E1A, 0x05AC, 0x5E1B, 0x5E1B, 0x05AF,\n    0x5E1D, 0x5E1D, 0x070E, 0x5E1F, 0x5E1F, 0x0710, 0x5E20, 0x5E20, 0x1ACD,\n    0x5E21, 0x5E23, 0x1ACA, 0x5E24, 0x5E24, 0x1ACE, 0x5E25, 0x5E25, 0x070F,\n    0x5E28, 0x5E28, 0x1C87, 0x5E29, 0x5E29, 0x1C86, 0x5E2B, 0x5E2B, 0x08AA,\n    0x5E2D, 0x5E2D, 0x08A9, 0x5E2E, 0x5E2E, 0x4135, 0x5E33, 0x5E33, 0x0A6E,\n    0x5E34, 0x5E34, 0x1ECD, 0x5E36, 0x5E36, 0x0A6D, 0x5E37, 0x5E37, 0x0A6F,\n    0x5E38, 0x5E38, 0x0A6C, 0x5E3D, 0x5E3D, 0x0C38, 0x5E3E, 0x5E3E, 0x1ECC,\n    0x5E40, 0x5E40, 0x0C39, 0x5E41, 0x5E41, 0x212E, 0x5E42, 0x5E42, 0x43A0,\n    0x5E43, 0x5E43, 0x0C3A, 0x5E44, 0x5E44, 0x212D, 0x5E45, 0x5E45, 0x0C37,\n    0x5E48, 0x5E48, 0x3A2C, 0x5E4A, 0x5E4A, 0x23C9, 0x5E4B, 0x5E4B, 0x23CB,\n    0x5E4C, 0x5E4C, 0x0DFF, 0x5E4D, 0x5E4D, 0x23CA, 0x5E4E, 0x5E4E, 0x23C8,\n    0x5E4F, 0x5E4F, 0x23C7, 0x5E53, 0x5E53, 0x2674, 0x5E54, 0x5E54, 0x0FC9,\n    0x5E55, 0x5E55, 0x0FC7, 0x5E57, 0x5E57, 0x0FC8, 0x5E58, 0x5E59, 0x2672,\n    0x5E5B, 0x5E5B, 0x0FC5, 0x5E5C, 0x5E5C, 0x28C7, 0x5E5D, 0x5E5D, 0x28C5,\n    0x5E5E, 0x5E5E, 0x3A2B, 0x5E5F, 0x5E5F, 0x1139, 0x5E60, 0x5E60, 0x28C6,\n    0x5E61, 0x5E61, 0x113A, 0x5E62, 0x5E62, 0x1138, 0x5E63, 0x5E63, 0x0FC6,\n    0x5E66, 0x5E66, 0x2B38, 0x5E67, 0x5E68, 0x2B36, 0x5E69, 0x5E69, 0x28C4,\n    0x5E6A, 0x5E6A, 0x2D5D, 0x5E6B, 0x5E6B, 0x13CD, 0x5E6C, 0x5E6C, 0x2D5C,\n    0x5E6D, 0x5E6E, 0x2F1C, 0x5E6F, 0x5E6F, 0x2B39, 0x5E70, 0x5E70, 0x308D,\n    0x5E72, 0x5E72, 0x028D, 0x5E73, 0x5E73, 0x033B, 0x5E74, 0x5E74, 0x03CB,\n    0x5E75, 0x5E75, 0x17E4, 0x5E76, 0x5E76, 0x03CA, 0x5E78, 0x5E78, 0x05B1,\n    0x5E79, 0x5E79, 0x0E00, 0x5E7A, 0x5E7A, 0x0227, 0x5E7B, 0x5E7B, 0x02CC,\n    0x5E7C, 0x5E7C, 0x033C, 0x5E7D, 0x5E7D, 0x0711, 0x5E7E, 0x5E7E, 0x0C3B,\n    0x5E7F, 0x5E7F, 0x0228, 0x5E80, 0x5E80, 0x17A5, 0x5E82, 0x5E82, 0x17A6,\n    0x5E83, 0x5E83, 0x4108, 0x5E84, 0x5E84, 0x17E5, 0x5E86, 0x5E86, 0x4552,\n    0x5E87, 0x5E87, 0x0490, 0x5E88, 0x5E88, 0x1877, 0x5E89, 0x5E89, 0x1875,\n    0x5E8A, 0x5E8A, 0x0491, 0x5E8B, 0x5E8B, 0x1874, 0x5E8C, 0x5E8C, 0x1876,\n    0x5E8D, 0x5E8D, 0x1878, 0x5E8F, 0x5E8F, 0x048F, 0x5E95, 0x5E96, 0x05B5,\n    0x5E97, 0x5E97, 0x05B3, 0x5E9A, 0x5E9A, 0x05B2, 0x5E9B, 0x5E9B, 0x1AD2,\n    0x5E9C, 0x5E9C, 0x05B4, 0x5EA0, 0x5EA0, 0x0712, 0x5EA2, 0x5EA2, 0x1AD1,\n    0x5EA3, 0x5EA3, 0x1AD3, 0x5EA4, 0x5EA4, 0x1AD0, 0x5EA5, 0x5EA5, 0x1AD4,\n    0x5EA6, 0x5EA6, 0x0713, 0x5EA7, 0x5EA7, 0x08AD, 0x5EA8, 0x5EA8, 0x1C88,\n    0x5EAA, 0x5EAA, 0x1C8A, 0x5EAB, 0x5EAB, 0x08AB, 0x5EAC, 0x5EAC, 0x1C8B,\n    0x5EAD, 0x5EAD, 0x08AC, 0x5EAE, 0x5EAE, 0x1C89, 0x5EB0, 0x5EB0, 0x1ACF,\n    0x5EB1, 0x5EB1, 0x1ECE, 0x5EB2, 0x5EB3, 0x1ED1, 0x5EB4, 0x5EB4, 0x1ECF,\n    0x5EB5, 0x5EB5, 0x0A73, 0x5EB6, 0x5EB6, 0x0A72, 0x5EB7, 0x5EB8, 0x0A70,\n    0x5EB9, 0x5EB9, 0x1ED0, 0x5EBD, 0x5EBD, 0x43BD, 0x5EBE, 0x5EBE, 0x0A74,\n    0x5EC1, 0x5EC2, 0x0C3D, 0x5EC4, 0x5EC4, 0x0C3F, 0x5EC5, 0x5EC5, 0x23CC,\n    0x5EC6, 0x5EC6, 0x23CE, 0x5EC7, 0x5EC7, 0x23D0, 0x5EC8, 0x5EC8, 0x0E02,\n    0x5EC9, 0x5EC9, 0x0E01, 0x5ECA, 0x5ECA, 0x0C3C, 0x5ECB, 0x5ECB, 0x23CF,\n    0x5ECC, 0x5ECC, 0x23CD, 0x5ECD, 0x5ECD, 0x3A30, 0x5ECE, 0x5ECE, 0x2678,\n    0x5ED0, 0x5ED0, 0x413D, 0x5ED1, 0x5ED1, 0x2676, 0x5ED2, 0x5ED2, 0x267C,\n    0x5ED3, 0x5ED3, 0x0FCA, 0x5ED4, 0x5ED4, 0x267D, 0x5ED5, 0x5ED5, 0x267A,\n    0x5ED6, 0x5ED6, 0x0FCB, 0x5ED7, 0x5ED7, 0x2677, 0x5ED8, 0x5ED8, 0x2675,\n    0x5ED9, 0x5ED9, 0x267B, 0x5EDA, 0x5EDA, 0x113C, 0x5EDB, 0x5EDB, 0x28C9,\n    0x5EDC, 0x5EDC, 0x2679, 0x5EDD, 0x5EDD, 0x113E, 0x5EDE, 0x5EDE, 0x28CA,\n    0x5EDF, 0x5EDF, 0x113D, 0x5EE0, 0x5EE0, 0x1140, 0x5EE1, 0x5EE1, 0x28CB,\n    0x5EE2, 0x5EE2, 0x113B, 0x5EE3, 0x5EE3, 0x113F, 0x5EE5, 0x5EE5, 0x2B3E,\n    0x5EE6, 0x5EE6, 0x2B3C, 0x5EE7, 0x5EE7, 0x2B3B, 0x5EE8, 0x5EE8, 0x2B3D,\n    0x5EE9, 0x5EE9, 0x2B3A, 0x5EEC, 0x5EEC, 0x157D, 0x5EEE, 0x5EEF, 0x31CF,\n    0x5EF1, 0x5EF1, 0x32D0, 0x5EF2, 0x5EF2, 0x3380, 0x5EF3, 0x5EF3, 0x1742,\n    0x5EF4, 0x5EF4, 0x0229, 0x5EF6, 0x5EF6, 0x05B7, 0x5EF7, 0x5EF7, 0x0492,\n    0x5EF8, 0x5EF8, 0x386F, 0x5EF9, 0x5EF9, 0x4143, 0x5EFA, 0x5EFA, 0x0714,\n    0x5EFB, 0x5EFB, 0x4144, 0x5EFC, 0x5EFC, 0x4146, 0x5EFE, 0x5EFE, 0x028E,\n    0x5EFF, 0x5EFF, 0x02CD, 0x5F01, 0x5F01, 0x033D, 0x5F02, 0x5F02, 0x17E6,\n    0x5F04, 0x5F04, 0x0493, 0x5F05, 0x5F05, 0x1879, 0x5F07, 0x5F07, 0x1AD5,\n    0x5F08, 0x5F08, 0x0715, 0x5F0A, 0x5F0A, 0x0FCC, 0x5F0B, 0x5F0B, 0x028F,\n    0x5F0C, 0x5F0C, 0x3A3E, 0x5F0D, 0x5F0D, 0x4149, 0x5F0E, 0x5F0E, 0x3A3F,\n    0x5F0F, 0x5F0F, 0x03CC, 0x5F12, 0x5F12, 0x0E03, 0x5F13, 0x5F13, 0x0290,\n    0x5F14, 0x5F15, 0x02CE, 0x5F17, 0x5F17, 0x033F, 0x5F18, 0x5F18, 0x033E,\n    0x5F1A, 0x5F1A, 0x17E7, 0x5F1B, 0x5F1B, 0x03CD, 0x5F1D, 0x5F1D, 0x187A,\n    0x5F1F, 0x5F1F, 0x0494, 0x5F22, 0x5F24, 0x1973, 0x5F25, 0x5F25, 0x4630,\n    0x5F26, 0x5F27, 0x05B8, 0x5F28, 0x5F28, 0x1972, 0x5F29, 0x5F29, 0x05BA,\n    0x5F2D, 0x5F2D, 0x0716, 0x5F2E, 0x5F2E, 0x1AD6, 0x5F30, 0x5F30, 0x1C8D,\n    0x5F31, 0x5F31, 0x08AE, 0x5F33, 0x5F33, 0x1C8C, 0x5F35, 0x5F35, 0x0A75,\n    0x5F36, 0x5F36, 0x1ED3, 0x5F37, 0x5F37, 0x0A76, 0x5F38, 0x5F38, 0x1ED4,\n    0x5F3A, 0x5F3A, 0x414E, 0x5F3C, 0x5F3C, 0x0C40, 0x5F40, 0x5F40, 0x23D1,\n    0x5F43, 0x5F43, 0x267F, 0x5F44, 0x5F44, 0x267E, 0x5F46, 0x5F46, 0x0FCD,\n    0x5F48, 0x5F48, 0x1141, 0x5F49, 0x5F49, 0x28CC, 0x5F4A, 0x5F4A, 0x12AD,\n    0x5F4B, 0x5F4B, 0x2B3F, 0x5F4C, 0x5F4C, 0x13CE, 0x5F4D, 0x5F4D, 0x3BA5,\n    0x5F4E, 0x5F4E, 0x16C3, 0x5F4F, 0x5F4F, 0x3416, 0x5F50, 0x5F50, 0x022A,\n    0x5F51, 0x5F51, 0x44E9, 0x5F54, 0x5F54, 0x1976, 0x5F56, 0x5F56, 0x1AD7,\n    0x5F57, 0x5F57, 0x0A77, 0x5F58, 0x5F58, 0x212F, 0x5F59, 0x5F59, 0x0E04,\n    0x5F5C, 0x5F5C, 0x3D5A, 0x5F5D, 0x5F5D, 0x14CF, 0x5F61, 0x5F61, 0x022B,\n    0x5F62, 0x5F62, 0x0496, 0x5F63, 0x5F63, 0x4152, 0x5F64, 0x5F64, 0x0495,\n    0x5F65, 0x5F65, 0x0717, 0x5F67, 0x5F67, 0x1C8E, 0x5F69, 0x5F69, 0x0A79,\n    0x5F6A, 0x5F6A, 0x0B89, 0x5F6B, 0x5F6B, 0x0A7A, 0x5F6C, 0x5F6C, 0x0A78,\n    0x5F6D, 0x5F6D, 0x0C41, 0x5F6F, 0x5F6F, 0x2680, 0x5F70, 0x5F70, 0x0FCE,\n    0x5F71, 0x5F71, 0x1142, 0x5F72, 0x5F72, 0x4154, 0x5F73, 0x5F73, 0x1777,\n    0x5F74, 0x5F74, 0x17E8, 0x5F76, 0x5F76, 0x187C, 0x5F77, 0x5F77, 0x0497,\n    0x5F78, 0x5F78, 0x187B, 0x5F79, 0x5F79, 0x0498, 0x5F7B, 0x5F7B, 0x4058,\n    0x5F7C, 0x5F7C, 0x05BE, 0x5F7D, 0x5F7D, 0x1979, 0x5F7E, 0x5F7E, 0x1978,\n    0x5F7F, 0x5F7F, 0x05BD, 0x5F80, 0x5F81, 0x05BB, 0x5F82, 0x5F82, 0x1977,\n    0x5F83, 0x5F83, 0x4631, 0x5F85, 0x5F85, 0x0719, 0x5F86, 0x5F86, 0x1AD8,\n    0x5F87, 0x5F87, 0x071C, 0x5F88, 0x5F88, 0x0718, 0x5F89, 0x5F89, 0x071E,\n    0x5F8A, 0x5F8B, 0x071A, 0x5F8C, 0x5F8C, 0x071D, 0x5F90, 0x5F90, 0x08B1,\n    0x5F91, 0x5F91, 0x08B0, 0x5F92, 0x5F92, 0x08AF, 0x5F96, 0x5F96, 0x1ED6,\n    0x5F97, 0x5F97, 0x0A7B, 0x5F98, 0x5F98, 0x0A7E, 0x5F99, 0x5F99, 0x0A7C,\n    0x5F9B, 0x5F9B, 0x1ED5, 0x5F9C, 0x5F9C, 0x0A81, 0x5F9E, 0x5F9E, 0x0A7D,\n    0x5F9F, 0x5F9F, 0x1ED7, 0x5FA0, 0x5FA0, 0x0A80, 0x5FA1, 0x5FA1, 0x0A7F,\n    0x5FA4, 0x5FA4, 0x402C, 0x5FA5, 0x5FA5, 0x2131, 0x5FA6, 0x5FA6, 0x2130,\n    0x5FA7, 0x5FA7, 0x4157, 0x5FA8, 0x5FA8, 0x0C44, 0x5FA9, 0x5FAA, 0x0C42,\n    0x5FAB, 0x5FAB, 0x2132, 0x5FAC, 0x5FAC, 0x0E05, 0x5FAD, 0x5FAD, 0x23D3,\n    0x5FAE, 0x5FAE, 0x0E06, 0x5FAF, 0x5FAF, 0x23D2, 0x5FB1, 0x5FB1, 0x3D98,\n    0x5FB2, 0x5FB2, 0x28CD, 0x5FB5, 0x5FB5, 0x1144, 0x5FB6, 0x5FB6, 0x2681,\n    0x5FB7, 0x5FB7, 0x1143, 0x5FB9, 0x5FB9, 0x0FCF, 0x5FBA, 0x5FBA, 0x3F9F,\n    0x5FBB, 0x5FBB, 0x2B41, 0x5FBC, 0x5FBC, 0x2B40, 0x5FBD, 0x5FBD, 0x13CF,\n    0x5FBE, 0x5FBE, 0x2D5E, 0x5FBF, 0x5FBF, 0x308E, 0x5FC0, 0x5FC1, 0x31D1,\n    0x5FC3, 0x5FC3, 0x02D0, 0x5FC4, 0x5FC4, 0x44EA, 0x5FC5, 0x5FC5, 0x0340,\n    0x5FC9, 0x5FC9, 0x17A7, 0x5FCC, 0x5FCC, 0x049A, 0x5FCD, 0x5FCD, 0x049C,\n    0x5FCF, 0x5FCF, 0x17EB, 0x5FD0, 0x5FD0, 0x187F, 0x5FD1, 0x5FD1, 0x187E,\n    0x5FD2, 0x5FD2, 0x187D, 0x5FD4, 0x5FD4, 0x17EA, 0x5FD5, 0x5FD5, 0x17E9,\n    0x5FD6, 0x5FD6, 0x03CF, 0x5FD7, 0x5FD7, 0x049B, 0x5FD8, 0x5FD8, 0x0499,\n    0x5FD9, 0x5FD9, 0x03CE, 0x5FDB, 0x5FDB, 0x3A4A, 0x5FDD, 0x5FDD, 0x05BF,\n    0x5FDE, 0x5FDE, 0x197A, 0x5FDF, 0x5FDF, 0x41AF, 0x5FE0, 0x5FE0, 0x05C0,\n    0x5FE1, 0x5FE1, 0x1884, 0x5FE3, 0x5FE3, 0x1886, 0x5FE4, 0x5FE4, 0x1885,\n    0x5FE5, 0x5FE5, 0x197B, 0x5FE8, 0x5FE8, 0x1881, 0x5FEA, 0x5FEA, 0x04A0,\n    0x5FEB, 0x5FEB, 0x049E, 0x5FED, 0x5FED, 0x1880, 0x5FEE, 0x5FEE, 0x1882,\n    0x5FEF, 0x5FEF, 0x1888, 0x5FF1, 0x5FF1, 0x049D, 0x5FF3, 0x5FF3, 0x1883,\n    0x5FF4, 0x5FF4, 0x188C, 0x5FF5, 0x5FF5, 0x05C2, 0x5FF7, 0x5FF7, 0x1889,\n    0x5FF8, 0x5FF8, 0x049F, 0x5FFA, 0x5FFA, 0x1887, 0x5FFB, 0x5FFB, 0x188A,\n    0x5FFD, 0x5FFD, 0x05C1, 0x5FFF, 0x5FFF, 0x05C3, 0x6000, 0x6000, 0x188B,\n    0x6009, 0x6009, 0x198F, 0x600A, 0x600A, 0x1982, 0x600B, 0x600B, 0x1980,\n    0x600C, 0x600C, 0x198E, 0x600D, 0x600D, 0x1989, 0x600E, 0x600E, 0x0723,\n    0x600F, 0x600F, 0x05C4, 0x6010, 0x6010, 0x198A, 0x6011, 0x6011, 0x198D,\n    0x6012, 0x6012, 0x071F, 0x6013, 0x6013, 0x198C, 0x6014, 0x6014, 0x05C5,\n    0x6015, 0x6015, 0x05CA, 0x6016, 0x6016, 0x05C8, 0x6017, 0x6017, 0x1983,\n    0x6019, 0x6019, 0x197E, 0x601A, 0x601A, 0x1985, 0x601B, 0x601B, 0x05CF,\n    0x601C, 0x601C, 0x1990, 0x601D, 0x601D, 0x0720, 0x601E, 0x601E, 0x1986,\n    0x6020, 0x6020, 0x0721, 0x6021, 0x6021, 0x05CB, 0x6022, 0x6022, 0x1988,\n    0x6023, 0x6023, 0x4185, 0x6024, 0x6024, 0x1AE7, 0x6025, 0x6025, 0x0722,\n    0x6026, 0x6026, 0x197D, 0x6027, 0x6027, 0x05CC, 0x6028, 0x6028, 0x0724,\n    0x6029, 0x6029, 0x05CD, 0x602A, 0x602A, 0x05C9, 0x602B, 0x602B, 0x05CE,\n    0x602C, 0x602C, 0x1987, 0x602D, 0x602D, 0x197C, 0x602E, 0x602E, 0x198B,\n    0x602F, 0x602F, 0x05C6, 0x6031, 0x6031, 0x4161, 0x6032, 0x6032, 0x197F,\n    0x6033, 0x6033, 0x1984, 0x6034, 0x6034, 0x1981, 0x6035, 0x6035, 0x05C7,\n    0x6037, 0x6037, 0x1AD9, 0x6039, 0x6039, 0x1ADA, 0x603B, 0x603B, 0x4553,\n    0x6040, 0x6040, 0x1AE4, 0x6041, 0x6041, 0x1C92, 0x6042, 0x6042, 0x1AE5,\n    0x6043, 0x6043, 0x072A, 0x6044, 0x6044, 0x1AE8, 0x6045, 0x6045, 0x1ADE,\n    0x6046, 0x6046, 0x0729, 0x6047, 0x6047, 0x1AE0, 0x6049, 0x6049, 0x1AE1,\n    0x604A, 0x604A, 0x4074, 0x604C, 0x604C, 0x1AE3, 0x604D, 0x604D, 0x0725,\n    0x6050, 0x6050, 0x08B5, 0x6052, 0x6052, 0x36EC, 0x6053, 0x6053, 0x1ADF,\n    0x6054, 0x6054, 0x1ADB, 0x6055, 0x6055, 0x08B6, 0x6058, 0x6058, 0x1AE9,\n    0x6059, 0x6059, 0x08B2, 0x605A, 0x605A, 0x1C90, 0x605B, 0x605B, 0x1AE2,\n    0x605D, 0x605D, 0x1C8F, 0x605E, 0x605E, 0x1ADD, 0x605F, 0x605F, 0x1AE6,\n    0x6062, 0x6062, 0x0728, 0x6063, 0x6063, 0x08B3, 0x6064, 0x6064, 0x072E,\n    0x6065, 0x6065, 0x08B4, 0x6066, 0x6066, 0x1AEA, 0x6067, 0x6067, 0x1C91,\n    0x6068, 0x6068, 0x0727, 0x6069, 0x6069, 0x08B8, 0x606A, 0x606A, 0x072D,\n    0x606B, 0x606B, 0x072C, 0x606C, 0x606C, 0x072B, 0x606D, 0x606D, 0x08B7,\n    0x606E, 0x606E, 0x1AEB, 0x606F, 0x606F, 0x08B9, 0x6070, 0x6070, 0x0726,\n    0x6072, 0x6072, 0x1ADC, 0x6075, 0x6075, 0x3A56, 0x6077, 0x6077, 0x4005,\n    0x607E, 0x607E, 0x3A47, 0x607F, 0x607F, 0x0A82, 0x6080, 0x6080, 0x1C95,\n    0x6081, 0x6081, 0x1C97, 0x6083, 0x6083, 0x1C99, 0x6084, 0x6084, 0x08BA,\n    0x6085, 0x6085, 0x08C0, 0x6086, 0x6086, 0x1EDA, 0x6087, 0x6087, 0x1C9D,\n    0x6088, 0x6088, 0x1C94, 0x6089, 0x6089, 0x0A84, 0x608A, 0x608A, 0x1ED8,\n    0x608C, 0x608C, 0x08BF, 0x608D, 0x608D, 0x08BD, 0x608E, 0x608E, 0x1C9F,\n    0x6090, 0x6090, 0x1ED9, 0x6092, 0x6092, 0x1C96, 0x6094, 0x6094, 0x08BE,\n    0x6095, 0x6095, 0x1C9A, 0x6096, 0x6096, 0x08C1, 0x6097, 0x6097, 0x1C9C,\n    0x609A, 0x609A, 0x08BC, 0x609B, 0x609B, 0x1C9B, 0x609C, 0x609C, 0x1C9E,\n    0x609D, 0x609D, 0x1C98, 0x609E, 0x609E, 0x416A, 0x609F, 0x609F, 0x08BB,\n    0x60A0, 0x60A0, 0x0A85, 0x60A2, 0x60A2, 0x1C93, 0x60A3, 0x60A3, 0x0A83,\n    0x60A4, 0x60A4, 0x4001, 0x60A7, 0x60A7, 0x3ADC, 0x60A8, 0x60A8, 0x0A86,\n    0x60B0, 0x60B0, 0x1EDC, 0x60B1, 0x60B1, 0x1EE5, 0x60B2, 0x60B2, 0x0C47,\n    0x60B3, 0x60B3, 0x416C, 0x60B4, 0x60B4, 0x0A88, 0x60B5, 0x60B5, 0x0A8D,\n    0x60B6, 0x60B6, 0x0C48, 0x60B7, 0x60B7, 0x1EE7, 0x60B8, 0x60B8, 0x0A94,\n    0x60B9, 0x60B9, 0x2134, 0x60BA, 0x60BA, 0x1EDD, 0x60BB, 0x60BB, 0x0A8C,\n    0x60BC, 0x60BC, 0x0A8F, 0x60BD, 0x60BD, 0x0A8A, 0x60BE, 0x60BE, 0x1EDB,\n    0x60BF, 0x60BF, 0x1EE9, 0x60C0, 0x60C0, 0x1EEC, 0x60C1, 0x60C1, 0x2143,\n    0x60C3, 0x60C3, 0x1EEA, 0x60C4, 0x60C4, 0x2138, 0x60C5, 0x60C5, 0x0A8B,\n    0x60C6, 0x60C6, 0x0A92, 0x60C7, 0x60C7, 0x0A96, 0x60C8, 0x60C8, 0x1EE4,\n    0x60C9, 0x60C9, 0x2133, 0x60CA, 0x60CA, 0x1EE8, 0x60CB, 0x60CB, 0x0A87,\n    0x60CC, 0x60CC, 0x2135, 0x60CD, 0x60CD, 0x1EEB, 0x60CE, 0x60CE, 0x2137,\n    0x60CF, 0x60CF, 0x1EE0, 0x60D1, 0x60D1, 0x0C45, 0x60D3, 0x60D4, 0x1EDE,\n    0x60D5, 0x60D5, 0x0A91, 0x60D7, 0x60D7, 0x4635, 0x60D8, 0x60D8, 0x0A90,\n    0x60D9, 0x60D9, 0x1EE2, 0x60DA, 0x60DA, 0x0A95, 0x60DB, 0x60DB, 0x1EE6,\n    0x60DC, 0x60DC, 0x0A8E, 0x60DD, 0x60DD, 0x1EE3, 0x60DE, 0x60DE, 0x3DCC,\n    0x60DF, 0x60DF, 0x0A93, 0x60E0, 0x60E0, 0x0C49, 0x60E1, 0x60E1, 0x0C46,\n    0x60E2, 0x60E2, 0x2136, 0x60E3, 0x60E3, 0x3D75, 0x60E4, 0x60E4, 0x1EE1,\n    0x60E6, 0x60E6, 0x0A89, 0x60E7, 0x60E7, 0x3D84, 0x60E8, 0x60E8, 0x3D7B,\n    0x60E9, 0x60E9, 0x4009, 0x60F0, 0x60F0, 0x0C4E, 0x60F1, 0x60F1, 0x0C52,\n    0x60F2, 0x60F2, 0x213A, 0x60F3, 0x60F3, 0x0E0B, 0x60F4, 0x60F4, 0x0C50,\n    0x60F5, 0x60F5, 0x213E, 0x60F6, 0x60F6, 0x0C54, 0x60F7, 0x60F7, 0x23D4,\n    0x60F8, 0x60F8, 0x2140, 0x60F9, 0x60F9, 0x0E0D, 0x60FA, 0x60FA, 0x0C4C,\n    0x60FB, 0x60FB, 0x0C4F, 0x60FC, 0x60FC, 0x2141, 0x60FD, 0x60FD, 0x3FA8,\n    0x60FE, 0x60FE, 0x2142, 0x60FF, 0x60FF, 0x2148, 0x6100, 0x6100, 0x0C56,\n    0x6101, 0x6101, 0x0E0E, 0x6103, 0x6103, 0x2144, 0x6104, 0x6104, 0x2149,\n    0x6105, 0x6105, 0x213D, 0x6106, 0x6106, 0x0E18, 0x6107, 0x6107, 0x3C35,\n    0x6108, 0x6108, 0x0E0F, 0x6109, 0x6109, 0x0C55, 0x610A, 0x610A, 0x213B,\n    0x610B, 0x610B, 0x214A, 0x610C, 0x610C, 0x3C87, 0x610D, 0x610D, 0x0E17,\n    0x610E, 0x610E, 0x0C53, 0x610F, 0x610F, 0x0E08, 0x6110, 0x6110, 0x2147,\n    0x6112, 0x6112, 0x0C57, 0x6113, 0x6113, 0x213F, 0x6114, 0x6114, 0x2139,\n    0x6115, 0x6115, 0x0C4D, 0x6116, 0x6116, 0x213C, 0x6118, 0x6118, 0x2145,\n    0x6119, 0x6119, 0x3EF6, 0x611A, 0x611A, 0x0E07, 0x611B, 0x611B, 0x0E0C,\n    0x611C, 0x611C, 0x0C4A, 0x611D, 0x611D, 0x2146, 0x611F, 0x611F, 0x0E0A,\n    0x6123, 0x6123, 0x0C4B, 0x6127, 0x6127, 0x0E16, 0x6128, 0x6128, 0x2683,\n    0x6129, 0x6129, 0x23DF, 0x612B, 0x612B, 0x23D7, 0x612C, 0x612C, 0x2682,\n    0x612E, 0x612E, 0x23DB, 0x612F, 0x612F, 0x23DD, 0x6130, 0x6130, 0x3F37,\n    0x6132, 0x6132, 0x23DA, 0x6134, 0x6134, 0x0E15, 0x6136, 0x6136, 0x23D9,\n    0x6137, 0x6137, 0x0E19, 0x613B, 0x613B, 0x2692, 0x613D, 0x613D, 0x4636,\n    0x613E, 0x613E, 0x0E14, 0x613F, 0x613F, 0x0FD1, 0x6140, 0x6140, 0x23E0,\n    0x6141, 0x6141, 0x2684, 0x6142, 0x6142, 0x4174, 0x6144, 0x6144, 0x0E12,\n    0x6145, 0x6145, 0x23D8, 0x6146, 0x6146, 0x23DC, 0x6147, 0x6147, 0x0FD0,\n    0x6148, 0x6148, 0x0E09, 0x6149, 0x614A, 0x23D5, 0x614B, 0x614B, 0x0FD2,\n    0x614C, 0x614C, 0x0E11, 0x614D, 0x614D, 0x0E13, 0x614E, 0x614E, 0x0E10,\n    0x614F, 0x614F, 0x23DE, 0x6150, 0x6150, 0x3C32, 0x6152, 0x6153, 0x2688,\n    0x6154, 0x6154, 0x268E, 0x6155, 0x6155, 0x1149, 0x6156, 0x6156, 0x2695,\n    0x6158, 0x6158, 0x0FD8, 0x6159, 0x6159, 0x3FBA, 0x615A, 0x615A, 0x0FD7,\n    0x615B, 0x615B, 0x2690, 0x615C, 0x615C, 0x4186, 0x615D, 0x615D, 0x1148,\n    0x615E, 0x615E, 0x2685, 0x615F, 0x615F, 0x0FD6, 0x6160, 0x6160, 0x494C,\n    0x6161, 0x6161, 0x2694, 0x6162, 0x6163, 0x0FD4, 0x6164, 0x6164, 0x4173,\n    0x6165, 0x6165, 0x2691, 0x6166, 0x6166, 0x28DE, 0x6167, 0x6167, 0x1146,\n    0x6168, 0x6168, 0x0C51, 0x616A, 0x616A, 0x2693, 0x616B, 0x616B, 0x114D,\n    0x616C, 0x616C, 0x268B, 0x616E, 0x616E, 0x1147, 0x616F, 0x616F, 0x3FC0,\n    0x6170, 0x6170, 0x114C, 0x6171, 0x6171, 0x2686, 0x6172, 0x6172, 0x268A,\n    0x6173, 0x6173, 0x2687, 0x6174, 0x6174, 0x268D, 0x6175, 0x6175, 0x0FD9,\n    0x6176, 0x6176, 0x1145, 0x6177, 0x6177, 0x0FD3, 0x6179, 0x6179, 0x28D0,\n    0x617A, 0x617A, 0x268F, 0x617C, 0x617C, 0x114B, 0x617D, 0x617D, 0x3FBD,\n    0x617E, 0x617E, 0x114E, 0x6180, 0x6180, 0x268C, 0x6181, 0x6181, 0x4177,\n    0x6182, 0x6182, 0x114A, 0x6183, 0x6183, 0x28CF, 0x6187, 0x6187, 0x417A,\n    0x6189, 0x6189, 0x28D4, 0x618A, 0x618A, 0x12B1, 0x618B, 0x618B, 0x28CE,\n    0x618C, 0x618C, 0x2B4D, 0x618D, 0x618D, 0x28DD, 0x618E, 0x618E, 0x1152,\n    0x6190, 0x6190, 0x1150, 0x6191, 0x6191, 0x12AF, 0x6192, 0x6192, 0x28DA,\n    0x6193, 0x6193, 0x28D6, 0x6194, 0x6194, 0x1156, 0x6195, 0x6195, 0x3DE0,\n    0x6196, 0x6196, 0x2B44, 0x6198, 0x6198, 0x3A55, 0x6199, 0x6199, 0x3A54,\n    0x619A, 0x619A, 0x1154, 0x619B, 0x619B, 0x28D5, 0x619C, 0x619C, 0x4002,\n    0x619D, 0x619D, 0x2B42, 0x619F, 0x619F, 0x28D9, 0x61A1, 0x61A1, 0x28DC,\n    0x61A2, 0x61A2, 0x28D3, 0x61A4, 0x61A4, 0x1155, 0x61A7, 0x61A7, 0x114F,\n    0x61A8, 0x61A8, 0x2B43, 0x61A9, 0x61A9, 0x12B0, 0x61AA, 0x61AA, 0x28DB,\n    0x61AB, 0x61AB, 0x1151, 0x61AC, 0x61AC, 0x1153, 0x61AD, 0x61AD, 0x28D8,\n    0x61AE, 0x61AE, 0x1157, 0x61AF, 0x61AF, 0x28D7, 0x61B0, 0x61B0, 0x28D2,\n    0x61B1, 0x61B1, 0x28D1, 0x61B2, 0x61B2, 0x12AE, 0x61B3, 0x61B3, 0x28DF,\n    0x61B4, 0x61B4, 0x2B46, 0x61B5, 0x61B5, 0x2D60, 0x61B6, 0x61B6, 0x12B3,\n    0x61B7, 0x61B7, 0x4639, 0x61B8, 0x61B8, 0x2B4C, 0x61B9, 0x61B9, 0x43BF,\n    0x61BA, 0x61BA, 0x2B4A, 0x61BC, 0x61BC, 0x2D61, 0x61BE, 0x61BE, 0x12B4,\n    0x61BF, 0x61BF, 0x2B4B, 0x61C0, 0x61C0, 0x3A50, 0x61C1, 0x61C1, 0x2B48,\n    0x61C2, 0x61C2, 0x13D1, 0x61C3, 0x61C3, 0x2D5F, 0x61C5, 0x61C5, 0x2B45,\n    0x61C6, 0x61C6, 0x2B47, 0x61C7, 0x61C7, 0x13D2, 0x61C8, 0x61C8, 0x12B6,\n    0x61C9, 0x61C9, 0x13D0, 0x61CA, 0x61CA, 0x12B5, 0x61CB, 0x61CB, 0x13D4,\n    0x61CC, 0x61CC, 0x2B49, 0x61CD, 0x61CD, 0x12B2, 0x61CF, 0x61CF, 0x463A,\n    0x61D0, 0x61D0, 0x4181, 0x61D3, 0x61D3, 0x417E, 0x61D6, 0x61D6, 0x2F26,\n    0x61D8, 0x61D8, 0x2F1E, 0x61DA, 0x61DA, 0x38B1, 0x61DE, 0x61DE, 0x2D67,\n    0x61DF, 0x61DF, 0x2F1F, 0x61E0, 0x61E0, 0x2D63, 0x61E2, 0x61E2, 0x3FC5,\n    0x61E3, 0x61E3, 0x14D0, 0x61E4, 0x61E4, 0x2D65, 0x61E5, 0x61E5, 0x2D64,\n    0x61E6, 0x61E6, 0x13D3, 0x61E7, 0x61E7, 0x2D62, 0x61E8, 0x61E8, 0x2D66,\n    0x61E9, 0x61E9, 0x2F27, 0x61EA, 0x61EA, 0x2F23, 0x61EB, 0x61EB, 0x2F25,\n    0x61ED, 0x61EE, 0x2F20, 0x61F0, 0x61F0, 0x2F24, 0x61F1, 0x61F1, 0x2F22,\n    0x61F2, 0x61F2, 0x157E, 0x61F5, 0x61F5, 0x1581, 0x61F6, 0x61F6, 0x1580,\n    0x61F7, 0x61F7, 0x157F, 0x61F8, 0x61F8, 0x1614, 0x61F9, 0x61F9, 0x31D3,\n    0x61FA, 0x61FA, 0x1615, 0x61FB, 0x61FB, 0x308F, 0x61FC, 0x61FC, 0x1670,\n    0x61FD, 0x61FD, 0x32D1, 0x61FE, 0x61FE, 0x1671, 0x61FF, 0x61FF, 0x16C4,\n    0x6200, 0x6200, 0x16F8, 0x6201, 0x6201, 0x3417, 0x6203, 0x6204, 0x3418,\n    0x6207, 0x6207, 0x3533, 0x6208, 0x6208, 0x02D1, 0x6209, 0x6209, 0x17A8,\n    0x620A, 0x620A, 0x0341, 0x620C, 0x620D, 0x03D1, 0x620E, 0x620E, 0x03D0,\n    0x6210, 0x6210, 0x03D3, 0x6211, 0x6211, 0x04A2, 0x6212, 0x6212, 0x04A1,\n    0x6214, 0x6214, 0x1991, 0x6215, 0x6215, 0x05D1, 0x6216, 0x6216, 0x05D0,\n    0x6219, 0x6219, 0x1CA0, 0x621A, 0x621B, 0x0A97, 0x621F, 0x621F, 0x0C58,\n    0x6220, 0x6220, 0x23E1, 0x6221, 0x6222, 0x0E1A, 0x6223, 0x6223, 0x23E3,\n    0x6224, 0x6224, 0x23E5, 0x6225, 0x6225, 0x23E4, 0x6227, 0x6227, 0x2697,\n    0x6229, 0x6229, 0x2696, 0x622A, 0x622A, 0x0FDA, 0x622B, 0x622B, 0x2698,\n    0x622C, 0x622C, 0x463C, 0x622D, 0x622D, 0x28E0, 0x622E, 0x622E, 0x1158,\n    0x6230, 0x6230, 0x12B7, 0x6232, 0x6232, 0x13D5, 0x6233, 0x6233, 0x14D1,\n    0x6234, 0x6234, 0x13D6, 0x6236, 0x6236, 0x02D2, 0x6237, 0x6237, 0x451A,\n    0x6239, 0x6239, 0x3FC2, 0x623A, 0x623A, 0x188D, 0x623D, 0x623D, 0x1992,\n    0x623E, 0x623E, 0x05D3, 0x623F, 0x623F, 0x05D2, 0x6240, 0x6240, 0x05D4,\n    0x6241, 0x6241, 0x072F, 0x6242, 0x6243, 0x1AEC, 0x6246, 0x6246, 0x1CA1,\n    0x6247, 0x6247, 0x08C2, 0x6248, 0x6248, 0x0A99, 0x6249, 0x6249, 0x0C59,\n    0x624A, 0x624A, 0x214B, 0x624B, 0x624B, 0x02D3, 0x624C, 0x624C, 0x44EC,\n    0x624D, 0x624D, 0x0291, 0x624E, 0x624E, 0x02D4, 0x6250, 0x6250, 0x17A9,\n    0x6251, 0x6251, 0x0345, 0x6252, 0x6252, 0x0344, 0x6253, 0x6254, 0x0342,\n    0x6258, 0x6258, 0x03D6, 0x6259, 0x6259, 0x17F2, 0x625A, 0x625A, 0x17F4,\n    0x625B, 0x625B, 0x03D5, 0x625C, 0x625C, 0x17EC, 0x625E, 0x625E, 0x17ED,\n    0x6260, 0x6260, 0x17F3, 0x6261, 0x6261, 0x17EF, 0x6262, 0x6262, 0x17F1,\n    0x6263, 0x6263, 0x03D4, 0x6264, 0x6264, 0x17EE, 0x6265, 0x6265, 0x17F5,\n    0x6266, 0x6266, 0x17F0, 0x6268, 0x6268, 0x3F15, 0x626D, 0x626D, 0x04A9,\n    0x626E, 0x626E, 0x04B2, 0x626F, 0x626F, 0x04B0, 0x6270, 0x6270, 0x1897,\n    0x6271, 0x6271, 0x1894, 0x6272, 0x6272, 0x189C, 0x6273, 0x6273, 0x04AE,\n    0x6274, 0x6274, 0x189D, 0x6276, 0x6276, 0x04A7, 0x6277, 0x6277, 0x189A,\n    0x6279, 0x6279, 0x04AD, 0x627A, 0x627A, 0x1896, 0x627B, 0x627B, 0x1895,\n    0x627C, 0x627C, 0x04AB, 0x627D, 0x627D, 0x189B, 0x627E, 0x627E, 0x04AC,\n    0x627F, 0x627F, 0x05D5, 0x6280, 0x6280, 0x04A6, 0x6281, 0x6281, 0x1898,\n    0x6282, 0x6282, 0x3F86, 0x6283, 0x6283, 0x188E, 0x6284, 0x6284, 0x04A3,\n    0x6285, 0x6285, 0x3F50, 0x6286, 0x6286, 0x04B6, 0x6287, 0x6287, 0x1893,\n    0x6288, 0x6288, 0x1899, 0x6289, 0x6289, 0x04A8, 0x628A, 0x628A, 0x04AA,\n    0x628C, 0x628C, 0x188F, 0x628E, 0x628F, 0x1890, 0x6290, 0x6290, 0x43C0,\n    0x6291, 0x6291, 0x04B5, 0x6292, 0x6292, 0x04AF, 0x6293, 0x6293, 0x04B4,\n    0x6294, 0x6294, 0x1892, 0x6295, 0x6295, 0x04B3, 0x6296, 0x6296, 0x04A5,\n    0x6297, 0x6297, 0x04A4, 0x6298, 0x6298, 0x04B1, 0x629D, 0x629D, 0x3E96,\n    0x62A4, 0x62A4, 0x3A69, 0x62A6, 0x62A6, 0x3FC1, 0x62A8, 0x62A8, 0x05E3,\n    0x62A9, 0x62A9, 0x199E, 0x62AA, 0x62AA, 0x1997, 0x62AB, 0x62AB, 0x05DE,\n    0x62AC, 0x62AC, 0x05F1, 0x62AD, 0x62AD, 0x1993, 0x62AE, 0x62AE, 0x199A,\n    0x62AF, 0x62AF, 0x199C, 0x62B0, 0x62B0, 0x199F, 0x62B1, 0x62B1, 0x05EC,\n    0x62B3, 0x62B3, 0x199B, 0x62B4, 0x62B4, 0x1994, 0x62B5, 0x62B5, 0x05EA,\n    0x62B6, 0x62B6, 0x1998, 0x62B8, 0x62B8, 0x19A0, 0x62B9, 0x62B9, 0x05DB,\n    0x62BB, 0x62BB, 0x199D, 0x62BC, 0x62BC, 0x05E5, 0x62BD, 0x62BD, 0x05E4,\n    0x62BE, 0x62BE, 0x1996, 0x62BF, 0x62BF, 0x05D9, 0x62C2, 0x62C2, 0x05DA,\n    0x62C3, 0x62C3, 0x3D8F, 0x62C4, 0x62C4, 0x05D8, 0x62C5, 0x62C5, 0x418A,\n    0x62C6, 0x62C6, 0x05F0, 0x62C7, 0x62C7, 0x05E8, 0x62C8, 0x62C8, 0x05E2,\n    0x62C9, 0x62C9, 0x05D6, 0x62CA, 0x62CA, 0x1999, 0x62CB, 0x62CB, 0x05E1,\n    0x62CC, 0x62CC, 0x05D7, 0x62CD, 0x62CD, 0x05E9, 0x62CE, 0x62CE, 0x05F2,\n    0x62CF, 0x62CF, 0x1AEE, 0x62D0, 0x62D0, 0x05E6, 0x62D1, 0x62D1, 0x1995,\n    0x62D2, 0x62D2, 0x05DC, 0x62D3, 0x62D4, 0x05DF, 0x62D5, 0x62D5, 0x418C,\n    0x62D6, 0x62D7, 0x05EE, 0x62D8, 0x62D8, 0x05ED, 0x62D9, 0x62D9, 0x05E7,\n    0x62DA, 0x62DA, 0x05EB, 0x62DB, 0x62DB, 0x05DD, 0x62DC, 0x62DC, 0x0730,\n    0x62DF, 0x62DF, 0x401C, 0x62E5, 0x62E5, 0x463D, 0x62EB, 0x62EB, 0x1AF4,\n    0x62EC, 0x62EC, 0x073C, 0x62ED, 0x62ED, 0x0734, 0x62EE, 0x62EE, 0x0736,\n    0x62EF, 0x62EF, 0x073B, 0x62F0, 0x62F0, 0x1B00, 0x62F1, 0x62F1, 0x0739,\n    0x62F2, 0x62F2, 0x1CA2, 0x62F3, 0x62F3, 0x08C3, 0x62F4, 0x62F4, 0x073E,\n    0x62F5, 0x62F5, 0x1AF1, 0x62F6, 0x62F6, 0x1AF9, 0x62F7, 0x62F7, 0x073A,\n    0x62F8, 0x62F8, 0x1AF8, 0x62F9, 0x62F9, 0x1AF5, 0x62FA, 0x62FA, 0x1AFD,\n    0x62FB, 0x62FB, 0x1AFF, 0x62FC, 0x62FC, 0x0733, 0x62FD, 0x62FD, 0x0737,\n    0x62FE, 0x62FE, 0x073D, 0x62FF, 0x62FF, 0x08C5, 0x6300, 0x6300, 0x1AFA,\n    0x6301, 0x6301, 0x0735, 0x6302, 0x6302, 0x0740, 0x6303, 0x6303, 0x1AF3,\n    0x6307, 0x6307, 0x0738, 0x6308, 0x6308, 0x08C4, 0x6309, 0x6309, 0x0732,\n    0x630B, 0x630B, 0x1AF0, 0x630C, 0x630C, 0x1AF7, 0x630D, 0x630D, 0x1AEF,\n    0x630E, 0x630E, 0x1AF2, 0x630F, 0x630F, 0x1AF6, 0x6310, 0x6310, 0x1CA3,\n    0x6311, 0x6311, 0x073F, 0x6313, 0x6314, 0x1AFB, 0x6315, 0x6315, 0x1AFE,\n    0x6316, 0x6316, 0x0731, 0x6318, 0x6318, 0x43C1, 0x6328, 0x6328, 0x08D3,\n    0x6329, 0x6329, 0x1CAF, 0x632A, 0x632B, 0x08D1, 0x632C, 0x632C, 0x1CA5,\n    0x632D, 0x632D, 0x1CB5, 0x632E, 0x632E, 0x3EDD, 0x632F, 0x632F, 0x08C8,\n    0x6331, 0x6331, 0x3A65, 0x6332, 0x6332, 0x1EED, 0x6333, 0x6333, 0x1CB7,\n    0x6334, 0x6334, 0x1CB1, 0x6335, 0x6335, 0x3F16, 0x6336, 0x6336, 0x1CA8,\n    0x6337, 0x6337, 0x3A63, 0x6338, 0x6338, 0x1CBA, 0x6339, 0x6339, 0x1CAB,\n    0x633A, 0x633A, 0x08CE, 0x633B, 0x633B, 0x1F04, 0x633C, 0x633C, 0x1CAE,\n    0x633D, 0x633D, 0x08D0, 0x633E, 0x633E, 0x08C7, 0x6340, 0x6340, 0x1CBC,\n    0x6341, 0x6341, 0x1CB0, 0x6342, 0x6342, 0x08CA, 0x6343, 0x6343, 0x1CA9,\n    0x6344, 0x6345, 0x1CA6, 0x6346, 0x6346, 0x08CB, 0x6347, 0x6347, 0x1CB6,\n    0x6348, 0x6348, 0x1CBD, 0x6349, 0x6349, 0x08CD, 0x634A, 0x634A, 0x1CAD,\n    0x634B, 0x634B, 0x1CAC, 0x634C, 0x634C, 0x08D5, 0x634D, 0x634D, 0x08D4,\n    0x634E, 0x634E, 0x08C6, 0x634F, 0x634F, 0x08CC, 0x6350, 0x6350, 0x08CF,\n    0x6351, 0x6351, 0x1CB9, 0x6354, 0x6354, 0x1CB3, 0x6355, 0x6355, 0x08C9,\n    0x6356, 0x6356, 0x1CA4, 0x6357, 0x6357, 0x1CBB, 0x6358, 0x6358, 0x1CB2,\n    0x6359, 0x6359, 0x1CB4, 0x635A, 0x635A, 0x1CB8, 0x6364, 0x6364, 0x3FC7,\n    0x6365, 0x6365, 0x1EEE, 0x6367, 0x6367, 0x0AA1, 0x6368, 0x6368, 0x0AB5,\n    0x6369, 0x6369, 0x0AB4, 0x636B, 0x636B, 0x0AA9, 0x636C, 0x636C, 0x418E,\n    0x636D, 0x636D, 0x1F00, 0x636E, 0x636E, 0x1EFC, 0x636F, 0x636F, 0x1EF9,\n    0x6370, 0x6370, 0x1F0B, 0x6371, 0x6371, 0x0AA4, 0x6372, 0x6372, 0x0A9C,\n    0x6375, 0x6375, 0x1EFE, 0x6376, 0x6376, 0x0C69, 0x6377, 0x6377, 0x0AA0,\n    0x6378, 0x6378, 0x1F06, 0x6379, 0x6379, 0x4367, 0x637A, 0x637A, 0x0AB6,\n    0x637B, 0x637B, 0x0AB3, 0x637C, 0x637C, 0x1F02, 0x637D, 0x637D, 0x1EF1,\n    0x637F, 0x637F, 0x3F4B, 0x6380, 0x6380, 0x0AB2, 0x6381, 0x6381, 0x1F08,\n    0x6382, 0x6382, 0x1EF0, 0x6383, 0x6383, 0x0AA7, 0x6384, 0x6384, 0x0AAB,\n    0x6385, 0x6385, 0x1F07, 0x6387, 0x6387, 0x1EFA, 0x6388, 0x6388, 0x0AAC,\n    0x6389, 0x6389, 0x0AA6, 0x638A, 0x638A, 0x1EEF, 0x638B, 0x638B, 0x4188,\n    0x638C, 0x638C, 0x0C5B, 0x638D, 0x638D, 0x1F0A, 0x638E, 0x638E, 0x1EF8,\n    0x638F, 0x638F, 0x0AB1, 0x6390, 0x6390, 0x1EFB, 0x6391, 0x6391, 0x1F09,\n    0x6392, 0x6392, 0x0AB0, 0x6394, 0x6394, 0x214C, 0x6396, 0x6396, 0x0A9D,\n    0x6397, 0x6397, 0x1EF6, 0x6398, 0x6398, 0x0AA2, 0x6399, 0x6399, 0x0AAD,\n    0x639B, 0x639B, 0x0AA8, 0x639C, 0x639C, 0x1EFF, 0x639D, 0x639D, 0x1EF5,\n    0x639E, 0x639E, 0x1EF3, 0x639F, 0x639F, 0x1F05, 0x63A0, 0x63A0, 0x0A9A,\n    0x63A1, 0x63A1, 0x0AAE, 0x63A2, 0x63A2, 0x0A9E, 0x63A3, 0x63A3, 0x0C5A,\n    0x63A4, 0x63A4, 0x1F03, 0x63A5, 0x63A5, 0x0A9F, 0x63A7, 0x63A7, 0x0A9B,\n    0x63A8, 0x63A8, 0x0AAA, 0x63A9, 0x63A9, 0x0AA5, 0x63AA, 0x63AA, 0x0AA3,\n    0x63AB, 0x63AB, 0x1EF7, 0x63AC, 0x63AC, 0x0AAF, 0x63AD, 0x63AD, 0x1EF4,\n    0x63AE, 0x63AE, 0x1F01, 0x63AF, 0x63AF, 0x1EFD, 0x63B0, 0x63B0, 0x214E,\n    0x63B1, 0x63B1, 0x214D, 0x63B9, 0x63B9, 0x3E9D, 0x63BD, 0x63BD, 0x1EF2,\n    0x63BE, 0x63BE, 0x215E, 0x63C0, 0x63C0, 0x0C5D, 0x63C1, 0x63C1, 0x46A8,\n    0x63C2, 0x63C2, 0x2164, 0x63C3, 0x63C3, 0x2153, 0x63C4, 0x63C4, 0x2161,\n    0x63C5, 0x63C5, 0x23E6, 0x63C6, 0x63C6, 0x0C60, 0x63C7, 0x63C7, 0x2165,\n    0x63C8, 0x63C8, 0x2168, 0x63C9, 0x63C9, 0x0C5F, 0x63CA, 0x63CA, 0x2156,\n    0x63CB, 0x63CB, 0x2167, 0x63CC, 0x63CC, 0x2166, 0x63CD, 0x63CD, 0x0C61,\n    0x63CE, 0x63CE, 0x214F, 0x63CF, 0x63CF, 0x0C5C, 0x63D0, 0x63D0, 0x0C64,\n    0x63D1, 0x63D1, 0x3A66, 0x63D2, 0x63D2, 0x0C62, 0x63D3, 0x63D3, 0x2163,\n    0x63D5, 0x63D5, 0x2159, 0x63D6, 0x63D6, 0x0C66, 0x63D7, 0x63D7, 0x216A,\n    0x63D8, 0x63D8, 0x2162, 0x63D9, 0x63D9, 0x216B, 0x63DA, 0x63DA, 0x0C6E,\n    0x63DB, 0x63DB, 0x0C6C, 0x63DC, 0x63DC, 0x2160, 0x63DD, 0x63DD, 0x215F,\n    0x63DE, 0x63DE, 0x3E60, 0x63DF, 0x63DF, 0x215D, 0x63E0, 0x63E0, 0x2157,\n    0x63E1, 0x63E1, 0x0C65, 0x63E2, 0x63E2, 0x4641, 0x63E3, 0x63E3, 0x0C63,\n    0x63E4, 0x63E4, 0x1CAA, 0x63E5, 0x63E5, 0x2150, 0x63E6, 0x63E6, 0x489F,\n    0x63E7, 0x63E7, 0x2404, 0x63E8, 0x63E8, 0x2151, 0x63E9, 0x63E9, 0x0C5E,\n    0x63EA, 0x63EA, 0x0C6B, 0x63EB, 0x63EB, 0x23E8, 0x63ED, 0x63EE, 0x0C67,\n    0x63EF, 0x63EF, 0x2152, 0x63F0, 0x63F0, 0x2169, 0x63F1, 0x63F1, 0x23E7,\n    0x63F2, 0x63F2, 0x215A, 0x63F3, 0x63F3, 0x2155, 0x63F4, 0x63F4, 0x0C6A,\n    0x63F5, 0x63F5, 0x215B, 0x63F6, 0x63F6, 0x2158, 0x63F8, 0x63F8, 0x4192,\n    0x63F9, 0x63F9, 0x0C6F, 0x63FB, 0x63FB, 0x4642, 0x63FC, 0x63FC, 0x3E9C,\n    0x63FE, 0x63FE, 0x3E9E, 0x6406, 0x6406, 0x0E2A, 0x6407, 0x6407, 0x4643,\n    0x6409, 0x6409, 0x23EB, 0x640A, 0x640A, 0x23FE, 0x640B, 0x640B, 0x2403,\n    0x640C, 0x640C, 0x23F7, 0x640D, 0x640D, 0x0E26, 0x640E, 0x640E, 0x2408,\n    0x640F, 0x640F, 0x0E23, 0x6410, 0x6410, 0x23E9, 0x6412, 0x6412, 0x23EA,\n    0x6413, 0x6413, 0x0E1C, 0x6414, 0x6414, 0x0E25, 0x6415, 0x6415, 0x23F1,\n    0x6416, 0x6417, 0x0E28, 0x6418, 0x6418, 0x23F2, 0x641A, 0x641A, 0x23FF,\n    0x641B, 0x641B, 0x2405, 0x641C, 0x641C, 0x0E24, 0x641E, 0x641E, 0x0E1E,\n    0x641F, 0x641F, 0x23F0, 0x6420, 0x6420, 0x23EC, 0x6421, 0x6421, 0x2407,\n    0x6422, 0x6423, 0x23F5, 0x6424, 0x6424, 0x23ED, 0x6425, 0x6425, 0x2401,\n    0x6426, 0x6426, 0x23F8, 0x6427, 0x6427, 0x2402, 0x6428, 0x6428, 0x23FA,\n    0x642A, 0x642A, 0x0E1F, 0x642B, 0x642B, 0x2699, 0x642C, 0x642C, 0x0E22,\n    0x642D, 0x642D, 0x0E20, 0x642E, 0x642E, 0x2406, 0x642F, 0x642F, 0x23FD,\n    0x6430, 0x6430, 0x23F9, 0x6432, 0x6432, 0x45D9, 0x6433, 0x6433, 0x23EE,\n    0x6434, 0x6434, 0x0FE4, 0x6435, 0x6435, 0x23FC, 0x6436, 0x6436, 0x0E27,\n    0x6437, 0x6437, 0x23F4, 0x6438, 0x6438, 0x4191, 0x6439, 0x6439, 0x23F3,\n    0x643A, 0x643A, 0x419D, 0x643B, 0x643B, 0x3A6B, 0x643D, 0x643D, 0x0E21,\n    0x643E, 0x643E, 0x0E1D, 0x643F, 0x643F, 0x26AE, 0x6440, 0x6440, 0x2400,\n    0x6441, 0x6441, 0x23FB, 0x6443, 0x6443, 0x23EF, 0x644B, 0x644B, 0x26A9,\n    0x644D, 0x644D, 0x269A, 0x644E, 0x644E, 0x26A5, 0x6450, 0x6450, 0x26AC,\n    0x6451, 0x6451, 0x0FE2, 0x6452, 0x6452, 0x0C6D, 0x6453, 0x6453, 0x26AA,\n    0x6454, 0x6454, 0x0FDD, 0x6458, 0x6458, 0x0FDC, 0x6459, 0x6459, 0x26B1,\n    0x645A, 0x645A, 0x43C2, 0x645B, 0x645B, 0x269B, 0x645C, 0x645C, 0x26A8,\n    0x645D, 0x645D, 0x269C, 0x645E, 0x645E, 0x26A7, 0x645F, 0x645F, 0x0FE0,\n    0x6460, 0x6460, 0x26AB, 0x6461, 0x6461, 0x215C, 0x6465, 0x6465, 0x26B2,\n    0x6466, 0x6466, 0x26A3, 0x6467, 0x6467, 0x0FE3, 0x6468, 0x6468, 0x28EE,\n    0x6469, 0x6469, 0x1159, 0x646B, 0x646B, 0x26B0, 0x646C, 0x646C, 0x26AF,\n    0x646D, 0x646D, 0x0FE5, 0x646E, 0x646E, 0x28E1, 0x646F, 0x646F, 0x115A,\n    0x6470, 0x6470, 0x28E2, 0x6471, 0x6471, 0x3A5B, 0x6472, 0x6473, 0x269F,\n    0x6474, 0x6474, 0x269D, 0x6475, 0x6475, 0x26A2, 0x6476, 0x6476, 0x269E,\n    0x6477, 0x6477, 0x26B3, 0x6478, 0x6478, 0x0FDF, 0x6479, 0x6479, 0x115B,\n    0x647A, 0x647A, 0x0FE1, 0x647B, 0x647B, 0x0FE6, 0x647C, 0x647C, 0x436C,\n    0x647D, 0x647D, 0x26A1, 0x647F, 0x647F, 0x26AD, 0x6482, 0x6482, 0x26A6,\n    0x6485, 0x6485, 0x28E5, 0x6487, 0x6487, 0x0FDB, 0x6488, 0x6488, 0x115E,\n    0x6489, 0x6489, 0x2B54, 0x648A, 0x648A, 0x28EA, 0x648B, 0x648B, 0x28E9,\n    0x648C, 0x648C, 0x28EB, 0x648D, 0x648D, 0x4323, 0x648F, 0x648F, 0x28E8,\n    0x6490, 0x6490, 0x115F, 0x6491, 0x6491, 0x43C3, 0x6492, 0x6492, 0x1165,\n    0x6493, 0x6493, 0x1162, 0x6495, 0x6495, 0x1163, 0x6496, 0x6496, 0x28E3,\n    0x6497, 0x6497, 0x28E6, 0x6498, 0x6498, 0x28F0, 0x6499, 0x6499, 0x116B,\n    0x649A, 0x649A, 0x1169, 0x649C, 0x649C, 0x28E7, 0x649D, 0x649D, 0x2154,\n    0x649E, 0x649E, 0x115C, 0x649F, 0x649F, 0x28ED, 0x64A0, 0x64A0, 0x28E4,\n    0x64A2, 0x64A2, 0x116C, 0x64A3, 0x64A3, 0x28EC, 0x64A4, 0x64A4, 0x0FDE,\n    0x64A5, 0x64A5, 0x1161, 0x64A6, 0x64A6, 0x26A4, 0x64A9, 0x64A9, 0x1164,\n    0x64AB, 0x64AB, 0x1168, 0x64AC, 0x64AC, 0x116A, 0x64AD, 0x64AD, 0x1167,\n    0x64AE, 0x64AE, 0x1166, 0x64AF, 0x64AF, 0x42E1, 0x64B0, 0x64B0, 0x1160,\n    0x64B1, 0x64B1, 0x28EF, 0x64B2, 0x64B2, 0x115D, 0x64B3, 0x64B3, 0x116D,\n    0x64B4, 0x64B4, 0x4340, 0x64B6, 0x64B6, 0x3A64, 0x64BB, 0x64BC, 0x12BB,\n    0x64BD, 0x64BD, 0x2B53, 0x64BE, 0x64BE, 0x12C5, 0x64BF, 0x64BF, 0x12C2,\n    0x64C0, 0x64C0, 0x4645, 0x64C1, 0x64C1, 0x12B9, 0x64C2, 0x64C2, 0x12C0,\n    0x64C3, 0x64C3, 0x2B55, 0x64C4, 0x64C4, 0x12BE, 0x64C5, 0x64C5, 0x12B8,\n    0x64C7, 0x64C7, 0x12BF, 0x64C9, 0x64C9, 0x2B52, 0x64CA, 0x64CA, 0x13D8,\n    0x64CB, 0x64CB, 0x12BA, 0x64CD, 0x64CD, 0x12C1, 0x64CE, 0x64CE, 0x13D7,\n    0x64CF, 0x64CF, 0x2B51, 0x64D0, 0x64D0, 0x2B50, 0x64D2, 0x64D2, 0x12C3,\n    0x64D3, 0x64D3, 0x3F03, 0x64D4, 0x64D4, 0x12C4, 0x64D6, 0x64D6, 0x2B4F,\n    0x64D7, 0x64D7, 0x2B4E, 0x64D8, 0x64D8, 0x13D9, 0x64D9, 0x64D9, 0x2B58,\n    0x64DA, 0x64DA, 0x12BD, 0x64DB, 0x64DB, 0x2B56, 0x64DD, 0x64DD, 0x431E,\n    0x64E0, 0x64E0, 0x13DA, 0x64E1, 0x64E1, 0x4199, 0x64E2, 0x64E2, 0x13DF,\n    0x64E3, 0x64E3, 0x2D6A, 0x64E4, 0x64E4, 0x2D6C, 0x64E5, 0x64E5, 0x419A,\n    0x64E6, 0x64E6, 0x13DC, 0x64E7, 0x64E7, 0x37A8, 0x64E8, 0x64E8, 0x2D6D,\n    0x64E9, 0x64E9, 0x2D69, 0x64EA, 0x64EA, 0x434A, 0x64EB, 0x64EB, 0x2D6B,\n    0x64EC, 0x64EC, 0x13DD, 0x64ED, 0x64ED, 0x13E0, 0x64EF, 0x64EF, 0x2D68,\n    0x64F0, 0x64F0, 0x13DB, 0x64F1, 0x64F1, 0x13DE, 0x64F2, 0x64F2, 0x14D3,\n    0x64F3, 0x64F3, 0x2B57, 0x64F4, 0x64F4, 0x14D2, 0x64F7, 0x64F7, 0x14D8,\n    0x64F8, 0x64F8, 0x2F2B, 0x64FA, 0x64FB, 0x14D6, 0x64FC, 0x64FC, 0x2F2E,\n    0x64FD, 0x64FD, 0x2F2A, 0x64FE, 0x64FE, 0x14D4, 0x64FF, 0x64FF, 0x2F28,\n    0x6500, 0x6500, 0x1582, 0x6501, 0x6501, 0x2F2C, 0x6503, 0x6503, 0x2F2D,\n    0x6504, 0x6504, 0x2F29, 0x6506, 0x6506, 0x14D5, 0x6507, 0x6507, 0x3090,\n    0x6509, 0x6509, 0x3093, 0x650A, 0x650A, 0x4536, 0x650C, 0x650C, 0x3094,\n    0x650D, 0x650D, 0x3092, 0x650E, 0x650E, 0x3095, 0x650F, 0x650F, 0x1583,\n    0x6510, 0x6510, 0x3091, 0x6511, 0x6511, 0x3AA9, 0x6513, 0x6513, 0x31D7,\n    0x6514, 0x6514, 0x1617, 0x6515, 0x6515, 0x31D6, 0x6516, 0x6516, 0x31D5,\n    0x6517, 0x6517, 0x31D4, 0x6518, 0x6518, 0x1616, 0x6519, 0x6519, 0x1618,\n    0x651B, 0x651B, 0x32D2, 0x651C, 0x651C, 0x1673, 0x651D, 0x651D, 0x1672,\n    0x651E, 0x651E, 0x4187, 0x651F, 0x651F, 0x3EC0, 0x6520, 0x6520, 0x3382,\n    0x6521, 0x6521, 0x3381, 0x6522, 0x6522, 0x3384, 0x6523, 0x6523, 0x16F9,\n    0x6524, 0x6524, 0x16C5, 0x6525, 0x6525, 0x341B, 0x6526, 0x6526, 0x3383,\n    0x6529, 0x6529, 0x341A, 0x652A, 0x652A, 0x16FB, 0x652B, 0x652B, 0x16FA,\n    0x652C, 0x652C, 0x1721, 0x652D, 0x652D, 0x3484, 0x652E, 0x652E, 0x34CA,\n    0x652F, 0x652F, 0x02D5, 0x6530, 0x6530, 0x3E62, 0x6532, 0x6532, 0x216C,\n    0x6533, 0x6533, 0x2B59, 0x6534, 0x6534, 0x022C, 0x6535, 0x6535, 0x44ED,\n    0x6536, 0x6536, 0x03D7, 0x6537, 0x6537, 0x17F6, 0x6538, 0x6538, 0x04B9,\n    0x6539, 0x6539, 0x04B7, 0x653B, 0x653B, 0x04B8, 0x653D, 0x653D, 0x19A1,\n    0x653E, 0x653E, 0x05F3, 0x653F, 0x653F, 0x0741, 0x6541, 0x6541, 0x1B01,\n    0x6543, 0x6543, 0x1B02, 0x6545, 0x6545, 0x0742, 0x6546, 0x6546, 0x1CBF,\n    0x6548, 0x6549, 0x08D6, 0x654A, 0x654A, 0x1CBE, 0x654D, 0x654D, 0x419F,\n    0x654F, 0x654F, 0x0ABD, 0x6551, 0x6551, 0x0AB9, 0x6553, 0x6553, 0x1F0C,\n    0x6554, 0x6554, 0x0AC0, 0x6555, 0x6555, 0x0ABF, 0x6556, 0x6556, 0x0AB8,\n    0x6557, 0x6557, 0x0ABB, 0x6558, 0x6558, 0x0ABE, 0x6559, 0x6559, 0x0ABA,\n    0x655C, 0x655C, 0x2170, 0x655D, 0x655D, 0x0AB7, 0x655E, 0x655E, 0x0C70,\n    0x655F, 0x655F, 0x41A5, 0x6562, 0x6563, 0x0C72, 0x6564, 0x6564, 0x216F,\n    0x6565, 0x6565, 0x2172, 0x6566, 0x6566, 0x0C71, 0x6567, 0x6567, 0x216D,\n    0x6568, 0x6568, 0x2171, 0x656A, 0x656A, 0x216E, 0x656B, 0x656B, 0x3A6C,\n    0x656C, 0x656C, 0x0E2B, 0x656D, 0x656D, 0x41A4, 0x656F, 0x656F, 0x2409,\n    0x6572, 0x6572, 0x0FE7, 0x6573, 0x6573, 0x26B4, 0x6574, 0x6574, 0x12C6,\n    0x6575, 0x6575, 0x116E, 0x6576, 0x6576, 0x28F1, 0x6577, 0x6578, 0x116F,\n    0x6579, 0x6579, 0x28F3, 0x657A, 0x657A, 0x28F2, 0x657B, 0x657B, 0x28F4,\n    0x657C, 0x657C, 0x2B5B, 0x657F, 0x657F, 0x2B5A, 0x6580, 0x6580, 0x2D6F,\n    0x6581, 0x6581, 0x2D6E, 0x6582, 0x6583, 0x13E1, 0x6584, 0x6584, 0x3096,\n    0x6585, 0x6585, 0x41A3, 0x6586, 0x6586, 0x4648, 0x6587, 0x6587, 0x02D6,\n    0x6588, 0x6588, 0x410B, 0x6589, 0x6589, 0x4554, 0x658C, 0x658C, 0x2173,\n    0x6590, 0x6590, 0x0C75, 0x6591, 0x6591, 0x0C74, 0x6592, 0x6592, 0x240A,\n    0x6594, 0x6594, 0x2F2F, 0x6595, 0x6595, 0x1674, 0x6596, 0x6596, 0x341C,\n    0x6597, 0x6597, 0x02D7, 0x6599, 0x6599, 0x08D8, 0x659B, 0x659B, 0x0AC2,\n    0x659C, 0x659C, 0x0AC1, 0x659D, 0x659E, 0x2174, 0x659F, 0x659F, 0x0E2C,\n    0x65A0, 0x65A0, 0x26B5, 0x65A1, 0x65A1, 0x0FE8, 0x65A2, 0x65A2, 0x2B5C,\n    0x65A4, 0x65A4, 0x02D8, 0x65A5, 0x65A5, 0x0346, 0x65A7, 0x65A7, 0x05F4,\n    0x65A8, 0x65A8, 0x19A2, 0x65AA, 0x65AA, 0x1B03, 0x65AB, 0x65AB, 0x0743,\n    0x65AC, 0x65AC, 0x0AC3, 0x65AE, 0x65AE, 0x2176, 0x65AF, 0x65AF, 0x0C76,\n    0x65B0, 0x65B0, 0x0E2D, 0x65B2, 0x65B3, 0x28F5, 0x65B5, 0x65B5, 0x41A7,\n    0x65B6, 0x65B6, 0x2D70, 0x65B7, 0x65B7, 0x14D9, 0x65B8, 0x65B8, 0x34CB,\n    0x65B9, 0x65B9, 0x02D9, 0x65BB, 0x65BB, 0x19A3, 0x65BC, 0x65BC, 0x05F5,\n    0x65BD, 0x65BD, 0x0744, 0x65BE, 0x65BE, 0x3E3B, 0x65BF, 0x65BF, 0x1B04,\n    0x65C1, 0x65C1, 0x08D9, 0x65C2, 0x65C2, 0x1CC3, 0x65C3, 0x65C4, 0x1CC1,\n    0x65C5, 0x65C5, 0x08DA, 0x65C6, 0x65C6, 0x1CC0, 0x65CB, 0x65CC, 0x0AC5,\n    0x65CD, 0x65CD, 0x1F0D, 0x65CE, 0x65CE, 0x0AC7, 0x65CF, 0x65CF, 0x0AC4,\n    0x65D0, 0x65D0, 0x2177, 0x65D1, 0x65D1, 0x41AA, 0x65D2, 0x65D2, 0x2178,\n    0x65D3, 0x65D3, 0x240B, 0x65D4, 0x65D4, 0x3BA8, 0x65D6, 0x65D6, 0x0FEA,\n    0x65D7, 0x65D7, 0x0FE9, 0x65DA, 0x65DA, 0x2D71, 0x65DB, 0x65DB, 0x2F30,\n    0x65DD, 0x65DD, 0x3098, 0x65DE, 0x65DE, 0x3097, 0x65DF, 0x65DF, 0x31D8,\n    0x65E0, 0x65E0, 0x022D, 0x65E1, 0x65E1, 0x1789, 0x65E2, 0x65E2, 0x0745,\n    0x65E3, 0x65E3, 0x41AE, 0x65E5, 0x65E5, 0x02DA, 0x65E6, 0x65E6, 0x0347,\n    0x65E8, 0x65E8, 0x03D9, 0x65E9, 0x65E9, 0x03D8, 0x65EC, 0x65ED, 0x03DA,\n    0x65EE, 0x65EE, 0x17F8, 0x65EF, 0x65EF, 0x17F7, 0x65F0, 0x65F0, 0x189E,\n    0x65F1, 0x65F1, 0x04BA, 0x65F2, 0x65F2, 0x18A1, 0x65F3, 0x65F3, 0x18A0,\n    0x65F4, 0x65F4, 0x189F, 0x65F5, 0x65F5, 0x18A2, 0x65FA, 0x65FA, 0x05F6,\n    0x65FB, 0x65FB, 0x19A9, 0x65FC, 0x65FC, 0x19A5, 0x65FD, 0x65FD, 0x19AE,\n    0x65FF, 0x65FF, 0x464A, 0x6600, 0x6600, 0x05FD, 0x6602, 0x6602, 0x05FB,\n    0x6603, 0x6603, 0x19AA, 0x6604, 0x6604, 0x19A6, 0x6605, 0x6605, 0x19AD,\n    0x6606, 0x6606, 0x05FA, 0x6607, 0x6607, 0x0601, 0x6608, 0x6608, 0x19A8,\n    0x6609, 0x6609, 0x19A4, 0x660A, 0x660A, 0x0600, 0x660B, 0x660B, 0x19AB,\n    0x660C, 0x660C, 0x05F9, 0x660D, 0x660D, 0x19AC, 0x660E, 0x660E, 0x05FC,\n    0x660F, 0x660F, 0x05FE, 0x6610, 0x6610, 0x19B0, 0x6611, 0x6611, 0x19AF,\n    0x6612, 0x6612, 0x19A7, 0x6613, 0x6613, 0x05F8, 0x6614, 0x6614, 0x05F7,\n    0x6615, 0x6615, 0x05FF, 0x6618, 0x6618, 0x41B1, 0x661C, 0x661C, 0x1B09,\n    0x661D, 0x661D, 0x1B0F, 0x661E, 0x661E, 0x3A93, 0x661F, 0x661F, 0x074B,\n    0x6620, 0x6620, 0x0748, 0x6621, 0x6621, 0x1B06, 0x6622, 0x6622, 0x1B0B,\n    0x6623, 0x6623, 0x4295, 0x6624, 0x6624, 0x074E, 0x6625, 0x6625, 0x0746,\n    0x6626, 0x6626, 0x1B0A, 0x6627, 0x6627, 0x0749, 0x6628, 0x6628, 0x074C,\n    0x662B, 0x662B, 0x1B0D, 0x662D, 0x662D, 0x0747, 0x662E, 0x662E, 0x1B12,\n    0x662F, 0x662F, 0x074A, 0x6630, 0x6630, 0x3A8D, 0x6631, 0x6631, 0x074D,\n    0x6632, 0x6632, 0x1B07, 0x6633, 0x6633, 0x1B0C, 0x6634, 0x6634, 0x1B10,\n    0x6635, 0x6635, 0x1B08, 0x6636, 0x6636, 0x1B05, 0x6639, 0x6639, 0x1B11,\n    0x663A, 0x663A, 0x1B0E, 0x6641, 0x6641, 0x08E2, 0x6642, 0x6642, 0x08DB,\n    0x6643, 0x6643, 0x08DE, 0x6644, 0x6644, 0x41B4, 0x6645, 0x6645, 0x08E1,\n    0x6647, 0x6647, 0x1CC6, 0x6648, 0x6648, 0x3D99, 0x6649, 0x6649, 0x08DC,\n    0x664A, 0x664A, 0x1CC4, 0x664B, 0x664B, 0x41B7, 0x664C, 0x664C, 0x08E0,\n    0x664F, 0x664F, 0x08DD, 0x6651, 0x6651, 0x1CC7, 0x6652, 0x6652, 0x08DF,\n    0x6653, 0x6653, 0x464B, 0x6657, 0x6657, 0x409B, 0x6659, 0x6659, 0x1F11,\n    0x665A, 0x665A, 0x0AC9, 0x665B, 0x665B, 0x1F10, 0x665C, 0x665C, 0x1F12,\n    0x665D, 0x665D, 0x0AC8, 0x665E, 0x665E, 0x0ACD, 0x665F, 0x665F, 0x1CC5,\n    0x6661, 0x6661, 0x1F0F, 0x6662, 0x6662, 0x1F13, 0x6663, 0x6663, 0x3A90,\n    0x6664, 0x6664, 0x0ACA, 0x6665, 0x6665, 0x1F0E, 0x6666, 0x6666, 0x0ACC,\n    0x6667, 0x6667, 0x41B9, 0x6668, 0x6668, 0x0ACB, 0x666A, 0x666A, 0x217F,\n    0x666B, 0x666B, 0x3A8B, 0x666C, 0x666C, 0x217A, 0x666E, 0x666E, 0x0C77,\n    0x666F, 0x666F, 0x0C7B, 0x6670, 0x6670, 0x0C78, 0x6671, 0x6671, 0x217D,\n    0x6672, 0x6672, 0x2180, 0x6673, 0x6673, 0x41BB, 0x6674, 0x6674, 0x0C79,\n    0x6676, 0x6676, 0x0C7A, 0x6677, 0x6677, 0x0C7F, 0x6678, 0x6678, 0x2414,\n    0x6679, 0x6679, 0x217E, 0x667A, 0x667A, 0x0C7D, 0x667B, 0x667B, 0x217B,\n    0x667C, 0x667C, 0x2179, 0x667D, 0x667D, 0x469B, 0x667E, 0x667E, 0x0C7E,\n    0x6680, 0x6680, 0x217C, 0x6684, 0x6684, 0x0E33, 0x6685, 0x6685, 0x4162,\n    0x6686, 0x6686, 0x240C, 0x6687, 0x6688, 0x0E30, 0x6689, 0x6689, 0x0E2F,\n    0x668A, 0x668A, 0x2411, 0x668B, 0x668B, 0x2410, 0x668C, 0x668C, 0x240D,\n    0x668D, 0x668D, 0x0E35, 0x668E, 0x668E, 0x3A89, 0x6690, 0x6690, 0x240F,\n    0x6691, 0x6691, 0x0C7C, 0x6692, 0x6692, 0x464D, 0x6694, 0x6694, 0x2413,\n    0x6695, 0x6695, 0x240E, 0x6696, 0x6696, 0x0E32, 0x6697, 0x6697, 0x0E2E,\n    0x6698, 0x6698, 0x0E34, 0x6699, 0x6699, 0x2412, 0x669A, 0x669A, 0x3D3D,\n    0x669D, 0x669D, 0x0FED, 0x669F, 0x669F, 0x26B8, 0x66A0, 0x66A0, 0x26B7,\n    0x66A1, 0x66A1, 0x26B6, 0x66A2, 0x66A2, 0x0FEB, 0x66A4, 0x66A4, 0x40BA,\n    0x66A8, 0x66A8, 0x0FEC, 0x66A9, 0x66A9, 0x28F9, 0x66AA, 0x66AA, 0x28FC,\n    0x66AB, 0x66AB, 0x1172, 0x66AD, 0x66AD, 0x4948, 0x66AE, 0x66AE, 0x1171,\n    0x66AF, 0x66AF, 0x28FD, 0x66B0, 0x66B0, 0x28F8, 0x66B1, 0x66B1, 0x1174,\n    0x66B2, 0x66B2, 0x28FA, 0x66B3, 0x66B3, 0x40B5, 0x66B4, 0x66B4, 0x1173,\n    0x66B5, 0x66B5, 0x28F7, 0x66B6, 0x66B6, 0x3E13, 0x66B7, 0x66B7, 0x28FB,\n    0x66B8, 0x66B8, 0x12CC, 0x66B9, 0x66B9, 0x12C9, 0x66BA, 0x66BA, 0x2B65,\n    0x66BB, 0x66BB, 0x2B64, 0x66BD, 0x66BD, 0x2B63, 0x66BE, 0x66BE, 0x2B5E,\n    0x66BF, 0x66BF, 0x3D9A, 0x66C0, 0x66C0, 0x2B5F, 0x66C4, 0x66C4, 0x12CA,\n    0x66C6, 0x66C6, 0x12C7, 0x66C7, 0x66C7, 0x12CB, 0x66C8, 0x66C8, 0x2B5D,\n    0x66C9, 0x66C9, 0x12C8, 0x66CA, 0x66CB, 0x2B60, 0x66CC, 0x66CC, 0x2B66,\n    0x66CD, 0x66CD, 0x40B8, 0x66CE, 0x66CE, 0x3A77, 0x66CF, 0x66CF, 0x2B62,\n    0x66D2, 0x66D2, 0x2D72, 0x66D6, 0x66D6, 0x13E4, 0x66D8, 0x66D8, 0x2F33,\n    0x66D9, 0x66D9, 0x13E3, 0x66DA, 0x66DB, 0x2F31, 0x66DC, 0x66DC, 0x14DA,\n    0x66DD, 0x66DD, 0x1585, 0x66DE, 0x66DE, 0x3099, 0x66E0, 0x66E0, 0x1584,\n    0x66E3, 0x66E4, 0x31DA, 0x66E6, 0x66E6, 0x1619, 0x66E8, 0x66E8, 0x31D9,\n    0x66E9, 0x66E9, 0x1675, 0x66EB, 0x66EB, 0x341D, 0x66EC, 0x66EC, 0x16FC,\n    0x66ED, 0x66EE, 0x3485, 0x66F0, 0x66F0, 0x02DB, 0x66F1, 0x66F1, 0x3E84,\n    0x66F2, 0x66F3, 0x03DC, 0x66F4, 0x66F4, 0x04BB, 0x66F6, 0x66F6, 0x19B1,\n    0x66F7, 0x66F7, 0x074F, 0x66F8, 0x66F8, 0x08E3, 0x66F9, 0x66F9, 0x0ACE,\n    0x66FC, 0x66FC, 0x0A1F, 0x66FE, 0x66FF, 0x0C80, 0x6700, 0x6700, 0x0BF0,\n    0x6701, 0x6701, 0x2181, 0x6702, 0x6702, 0x41C4, 0x6703, 0x6703, 0x0E36,\n    0x6704, 0x6704, 0x26BA, 0x6705, 0x6705, 0x26B9, 0x6708, 0x6708, 0x02DC,\n    0x6709, 0x6709, 0x03DE, 0x670A, 0x670A, 0x19B2, 0x670B, 0x670B, 0x0603,\n    0x670C, 0x670C, 0x3FE2, 0x670D, 0x670D, 0x0602, 0x670E, 0x670E, 0x3DA1,\n    0x670F, 0x6710, 0x1B13, 0x6712, 0x6713, 0x1CC8, 0x6714, 0x6715, 0x08E4,\n    0x6716, 0x6716, 0x464F, 0x6717, 0x6717, 0x08E6, 0x6718, 0x6718, 0x1F14,\n    0x671B, 0x671B, 0x0AD0, 0x671D, 0x671D, 0x0C83, 0x671E, 0x671E, 0x3D8B,\n    0x671F, 0x671F, 0x0C82, 0x6720, 0x6720, 0x2415, 0x6721, 0x6721, 0x2522,\n    0x6722, 0x6722, 0x26BB, 0x6723, 0x6723, 0x2B67, 0x6725, 0x6725, 0x379F,\n    0x6726, 0x6726, 0x14DB, 0x6727, 0x6727, 0x161A, 0x6728, 0x6728, 0x02DD,\n    0x672A, 0x672B, 0x034A, 0x672C, 0x672C, 0x0349, 0x672D, 0x672D, 0x034C,\n    0x672E, 0x672E, 0x0348, 0x6731, 0x6731, 0x03E1, 0x6733, 0x6733, 0x1800,\n    0x6734, 0x6734, 0x03E0, 0x6735, 0x6735, 0x03E2, 0x6736, 0x6736, 0x3E41,\n    0x6738, 0x6738, 0x17FB, 0x6739, 0x6739, 0x17FA, 0x673A, 0x673A, 0x17FD,\n    0x673B, 0x673B, 0x17FC, 0x673C, 0x673C, 0x17FF, 0x673D, 0x673D, 0x03DF,\n    0x673E, 0x673E, 0x17F9, 0x673F, 0x673F, 0x17FE, 0x6744, 0x6744, 0x401B,\n    0x6745, 0x6745, 0x18A3, 0x6746, 0x6746, 0x04C5, 0x6747, 0x6747, 0x18A4,\n    0x6748, 0x6748, 0x18A8, 0x6749, 0x6749, 0x04C4, 0x674B, 0x674B, 0x18AC,\n    0x674C, 0x674C, 0x18A7, 0x674D, 0x674D, 0x18AA, 0x674E, 0x6751, 0x04BD,\n    0x6753, 0x6753, 0x04C7, 0x6755, 0x6755, 0x18A6, 0x6756, 0x6756, 0x04C2,\n    0x6757, 0x6757, 0x04C8, 0x6759, 0x6759, 0x18A5, 0x675A, 0x675A, 0x18AB,\n    0x675C, 0x675C, 0x04C1, 0x675D, 0x675D, 0x18A9, 0x675E, 0x675E, 0x04C3,\n    0x675F, 0x675F, 0x04BC, 0x6760, 0x6760, 0x04C6, 0x6761, 0x6761, 0x3D66,\n    0x6762, 0x6762, 0x41CB, 0x6767, 0x6767, 0x41CA, 0x676A, 0x676A, 0x0618,\n    0x676C, 0x676C, 0x19B4, 0x676D, 0x676D, 0x0604, 0x676F, 0x6770, 0x060E,\n    0x6771, 0x6771, 0x0607, 0x6772, 0x6772, 0x0619, 0x6773, 0x6773, 0x0609,\n    0x6774, 0x6774, 0x19BC, 0x6775, 0x6775, 0x0614, 0x6776, 0x6776, 0x19B7,\n    0x6777, 0x6777, 0x060A, 0x6778, 0x6779, 0x19C6, 0x677A, 0x677A, 0x19BF,\n    0x677B, 0x677B, 0x19B8, 0x677C, 0x677C, 0x0617, 0x677D, 0x677D, 0x19C4,\n    0x677E, 0x677E, 0x0612, 0x677F, 0x677F, 0x0610, 0x6781, 0x6781, 0x19C5,\n    0x6783, 0x6783, 0x19C3, 0x6784, 0x6784, 0x19BB, 0x6785, 0x6785, 0x19B3,\n    0x6786, 0x6786, 0x19BA, 0x6787, 0x6787, 0x060B, 0x6789, 0x6789, 0x0611,\n    0x678B, 0x678B, 0x0605, 0x678C, 0x678C, 0x19BE, 0x678D, 0x678D, 0x19BD,\n    0x678E, 0x678E, 0x19B5, 0x678F, 0x678F, 0x46C1, 0x6790, 0x6790, 0x0613,\n    0x6791, 0x6791, 0x19C1, 0x6792, 0x6792, 0x19B6, 0x6793, 0x6793, 0x0616,\n    0x6794, 0x6794, 0x19C8, 0x6795, 0x6795, 0x0606, 0x6797, 0x6797, 0x060D,\n    0x6798, 0x6798, 0x19B9, 0x6799, 0x6799, 0x19C2, 0x679A, 0x679A, 0x0615,\n    0x679C, 0x679C, 0x0608, 0x679D, 0x679D, 0x060C, 0x679F, 0x679F, 0x19C0,\n    0x67A0, 0x67A0, 0x3D7A, 0x67A4, 0x67A4, 0x4651, 0x67AC, 0x67AC, 0x41E3,\n    0x67AE, 0x67AE, 0x1B34, 0x67AF, 0x67AF, 0x0757, 0x67B0, 0x67B0, 0x0764,\n    0x67B1, 0x67B1, 0x41F4, 0x67B2, 0x67B2, 0x1B2F, 0x67B3, 0x67B3, 0x1B25,\n    0x67B4, 0x67B4, 0x075D, 0x67B5, 0x67B5, 0x1B23, 0x67B6, 0x67B6, 0x0756,\n    0x67B7, 0x67B7, 0x1B1E, 0x67B8, 0x67B8, 0x0760, 0x67B9, 0x67B9, 0x1B2B,\n    0x67BA, 0x67BA, 0x1B18, 0x67BB, 0x67BB, 0x1B1A, 0x67BF, 0x67BF, 0x37FA,\n    0x67C0, 0x67C0, 0x1B1D, 0x67C1, 0x67C1, 0x1B15, 0x67C2, 0x67C2, 0x1B2A,\n    0x67C3, 0x67C3, 0x1B3A, 0x67C4, 0x67C4, 0x075B, 0x67C5, 0x67C5, 0x1B1F,\n    0x67C6, 0x67C6, 0x1B31, 0x67C8, 0x67C8, 0x1B17, 0x67C9, 0x67CA, 0x1B38,\n    0x67CB, 0x67CB, 0x1B3C, 0x67CC, 0x67CC, 0x1B33, 0x67CD, 0x67CD, 0x1B24,\n    0x67CE, 0x67CE, 0x1B2C, 0x67CF, 0x67CF, 0x0761, 0x67D0, 0x67D0, 0x0754,\n    0x67D1, 0x67D1, 0x075C, 0x67D2, 0x67D2, 0x0768, 0x67D3, 0x67D3, 0x0751,\n    0x67D4, 0x67D4, 0x0753, 0x67D6, 0x67D6, 0x3B58, 0x67D7, 0x67D7, 0x41CE,\n    0x67D8, 0x67D8, 0x1B1C, 0x67D9, 0x67D9, 0x0765, 0x67DA, 0x67DA, 0x075E,\n    0x67DB, 0x67DB, 0x1B36, 0x67DC, 0x67DC, 0x1B19, 0x67DD, 0x67DD, 0x0767,\n    0x67DE, 0x67DE, 0x0762, 0x67DF, 0x67DF, 0x1B22, 0x67E2, 0x67E2, 0x0766,\n    0x67E3, 0x67E3, 0x1B29, 0x67E4, 0x67E4, 0x1B21, 0x67E5, 0x67E5, 0x075F,\n    0x67E6, 0x67E6, 0x1B35, 0x67E7, 0x67E7, 0x1B2D, 0x67E9, 0x67E9, 0x0759,\n    0x67EA, 0x67EA, 0x1B3B, 0x67EB, 0x67EB, 0x1B20, 0x67EC, 0x67EC, 0x0755,\n    0x67ED, 0x67ED, 0x1B32, 0x67EE, 0x67EE, 0x1B28, 0x67EF, 0x67EF, 0x075A,\n    0x67F0, 0x67F0, 0x1B2E, 0x67F1, 0x67F1, 0x0752, 0x67F2, 0x67F2, 0x1B16,\n    0x67F3, 0x67F3, 0x0763, 0x67F4, 0x67F4, 0x08F5, 0x67F5, 0x67F5, 0x0758,\n    0x67F6, 0x67F6, 0x1B27, 0x67F7, 0x67F7, 0x1B26, 0x67F8, 0x67F8, 0x1B1B,\n    0x67F9, 0x67F9, 0x3996, 0x67FA, 0x67FA, 0x1B37, 0x67FC, 0x67FC, 0x1B30,\n    0x67FE, 0x67FE, 0x4555, 0x67FF, 0x67FF, 0x0750, 0x6800, 0x6800, 0x43C7,\n    0x6801, 0x6801, 0x41D3, 0x6802, 0x6802, 0x3FC8, 0x6803, 0x6803, 0x3D6A,\n    0x6804, 0x6804, 0x4556, 0x680D, 0x680D, 0x4281, 0x6810, 0x6810, 0x399C,\n    0x6812, 0x6812, 0x1CDD, 0x6813, 0x6813, 0x08FC, 0x6814, 0x6814, 0x1CDE,\n    0x6816, 0x6816, 0x1CD2, 0x6817, 0x6817, 0x08F1, 0x6818, 0x6818, 0x08FD,\n    0x681A, 0x681A, 0x1CCB, 0x681B, 0x681B, 0x4072, 0x681C, 0x681C, 0x1CD4,\n    0x681D, 0x681D, 0x1CDC, 0x681E, 0x681E, 0x46C2, 0x681F, 0x681F, 0x1CCA,\n    0x6820, 0x6820, 0x1CE5, 0x6821, 0x6821, 0x08E7, 0x6822, 0x6822, 0x41D0,\n    0x6825, 0x6825, 0x1CE4, 0x6826, 0x6826, 0x1CDF, 0x6828, 0x6828, 0x1CE0,\n    0x6829, 0x6829, 0x08EF, 0x682A, 0x682A, 0x08FA, 0x682B, 0x682B, 0x1CD6,\n    0x682D, 0x682D, 0x1CD7, 0x682E, 0x682E, 0x1CE1, 0x682F, 0x682F, 0x1CD8,\n    0x6831, 0x6831, 0x1CD3, 0x6832, 0x6833, 0x1CCD, 0x6834, 0x6834, 0x1CDB,\n    0x6835, 0x6835, 0x1CD5, 0x6836, 0x6836, 0x3E2E, 0x6837, 0x6837, 0x421D,\n    0x6838, 0x6838, 0x08E8, 0x6839, 0x6839, 0x08EC, 0x683A, 0x683A, 0x1CE3,\n    0x683B, 0x683B, 0x1CCF, 0x683C, 0x683C, 0x08F8, 0x683D, 0x683D, 0x08F4,\n    0x683E, 0x683E, 0x4147, 0x6840, 0x6840, 0x08F7, 0x6841, 0x6841, 0x08FE,\n    0x6842, 0x6842, 0x08ED, 0x6843, 0x6843, 0x08F9, 0x6844, 0x6844, 0x1CDA,\n    0x6845, 0x6845, 0x08FB, 0x6846, 0x6846, 0x08EA, 0x6847, 0x6847, 0x3BEB,\n    0x6848, 0x6848, 0x08E9, 0x6849, 0x6849, 0x1CCC, 0x684A, 0x684A, 0x4653,\n    0x684B, 0x684B, 0x1CD0, 0x684C, 0x684C, 0x08F2, 0x684D, 0x684D, 0x1CE2,\n    0x684E, 0x684E, 0x1CD9, 0x684F, 0x684F, 0x1CD1, 0x6850, 0x6850, 0x08F6,\n    0x6851, 0x6851, 0x08F3, 0x6853, 0x6853, 0x08EB, 0x6854, 0x6854, 0x08EE,\n    0x6855, 0x6855, 0x3D90, 0x6856, 0x6856, 0x3814, 0x685D, 0x685D, 0x41D6,\n    0x6865, 0x6865, 0x4557, 0x686B, 0x686B, 0x1F29, 0x686D, 0x686E, 0x1F19,\n    0x686F, 0x686F, 0x1F1E, 0x6871, 0x6871, 0x1F2D, 0x6872, 0x6872, 0x1F2A,\n    0x6874, 0x6874, 0x1F23, 0x6875, 0x6875, 0x1F22, 0x6876, 0x6876, 0x0AD7,\n    0x6877, 0x6877, 0x1F26, 0x6878, 0x6878, 0x1F35, 0x6879, 0x6879, 0x1F15,\n    0x687B, 0x687B, 0x1F36, 0x687C, 0x687C, 0x1F28, 0x687D, 0x687D, 0x1F3A,\n    0x687E, 0x687E, 0x1F2E, 0x687F, 0x687F, 0x0AD6, 0x6880, 0x6880, 0x1F2C,\n    0x6881, 0x6881, 0x0AD1, 0x6882, 0x6882, 0x0AE6, 0x6883, 0x6883, 0x0ADC,\n    0x6884, 0x6884, 0x4654, 0x6885, 0x6885, 0x0AE0, 0x6886, 0x6886, 0x0ADF,\n    0x6887, 0x6887, 0x1F16, 0x6888, 0x6888, 0x46B7, 0x6889, 0x6889, 0x1F33,\n    0x688A, 0x688A, 0x1F39, 0x688B, 0x688B, 0x1F31, 0x688C, 0x688C, 0x1F38,\n    0x688F, 0x688F, 0x1F25, 0x6890, 0x6890, 0x1F17, 0x6891, 0x6891, 0x1F37,\n    0x6892, 0x6892, 0x1F27, 0x6893, 0x6893, 0x0AD4, 0x6894, 0x6894, 0x0AE1,\n    0x6896, 0x6896, 0x1F30, 0x6897, 0x6897, 0x0ADA, 0x6898, 0x6898, 0x3AAA,\n    0x689B, 0x689B, 0x1F2F, 0x689C, 0x689C, 0x1F18, 0x689D, 0x689D, 0x0AE2,\n    0x689F, 0x689F, 0x0AE4, 0x68A0, 0x68A0, 0x1F32, 0x68A1, 0x68A1, 0x0AE5,\n    0x68A2, 0x68A2, 0x0AD3, 0x68A3, 0x68A3, 0x1F1F, 0x68A4, 0x68A4, 0x1F34,\n    0x68A6, 0x68A6, 0x40E4, 0x68A7, 0x68A7, 0x0AD9, 0x68A8, 0x68A8, 0x0AE3,\n    0x68A9, 0x68A9, 0x1F21, 0x68AA, 0x68AA, 0x1F2B, 0x68AB, 0x68AB, 0x1F1C,\n    0x68AC, 0x68AC, 0x1F20, 0x68AD, 0x68AD, 0x0ADE, 0x68AE, 0x68AE, 0x1F1B,\n    0x68AF, 0x68AF, 0x0AD2, 0x68B0, 0x68B0, 0x0ADB, 0x68B1, 0x68B1, 0x0AD8,\n    0x68B2, 0x68B2, 0x1F24, 0x68B3, 0x68B3, 0x08F0, 0x68B4, 0x68B4, 0x2198,\n    0x68B5, 0x68B5, 0x0AD5, 0x68B6, 0x68B6, 0x3A9E, 0x68B9, 0x68B9, 0x3D14,\n    0x68BD, 0x68BD, 0x427C, 0x68C3, 0x68C3, 0x41DC, 0x68C4, 0x68C4, 0x0ADD,\n    0x68C5, 0x68C5, 0x3C2E, 0x68C6, 0x68C6, 0x219B, 0x68C7, 0x68C7, 0x21B1,\n    0x68C8, 0x68C8, 0x21A6, 0x68C9, 0x68C9, 0x0C97, 0x68CA, 0x68CA, 0x42EB,\n    0x68CB, 0x68CB, 0x0C92, 0x68CC, 0x68CC, 0x2195, 0x68CD, 0x68CD, 0x0C93,\n    0x68CE, 0x68CE, 0x21A5, 0x68D0, 0x68D0, 0x219E, 0x68D1, 0x68D1, 0x21AB,\n    0x68D2, 0x68D2, 0x0C8F, 0x68D3, 0x68D3, 0x2183, 0x68D4, 0x68D4, 0x21AD,\n    0x68D5, 0x68D5, 0x0C85, 0x68D6, 0x68D6, 0x218B, 0x68D7, 0x68D7, 0x0C88,\n    0x68D8, 0x68D8, 0x0C87, 0x68DA, 0x68DA, 0x0C98, 0x68DC, 0x68DC, 0x2185,\n    0x68DD, 0x68DE, 0x21A7, 0x68DF, 0x68DF, 0x0C8A, 0x68E0, 0x68E0, 0x0C86,\n    0x68E1, 0x68E1, 0x2193, 0x68E3, 0x68E3, 0x0C91, 0x68E4, 0x68E4, 0x218E,\n    0x68E6, 0x68E6, 0x21A9, 0x68E7, 0x68E7, 0x0C8D, 0x68E8, 0x68E8, 0x21A1,\n    0x68E9, 0x68E9, 0x21AE, 0x68EA, 0x68EA, 0x2188, 0x68EB, 0x68EB, 0x218D,\n    0x68EC, 0x68EC, 0x2187, 0x68EE, 0x68EE, 0x0C8C, 0x68EF, 0x68EF, 0x219A,\n    0x68F0, 0x68F0, 0x242B, 0x68F1, 0x68F1, 0x2189, 0x68F2, 0x68F2, 0x0C90,\n    0x68F3, 0x68F3, 0x2192, 0x68F4, 0x68F4, 0x21AA, 0x68F5, 0x68F5, 0x0C8B,\n    0x68F6, 0x68F6, 0x218F, 0x68F7, 0x68F7, 0x218C, 0x68F8, 0x68F8, 0x219D,\n    0x68F9, 0x68F9, 0x0C8E, 0x68FA, 0x68FA, 0x0C84, 0x68FB, 0x68FB, 0x0C9A,\n    0x68FC, 0x68FC, 0x21A0, 0x68FD, 0x68FD, 0x219F, 0x6900, 0x6900, 0x41DF,\n    0x6901, 0x6901, 0x41DE, 0x6902, 0x6902, 0x42FB, 0x6903, 0x6903, 0x429C,\n    0x6904, 0x6904, 0x2184, 0x6905, 0x6905, 0x0C89, 0x6906, 0x6906, 0x21AC,\n    0x6907, 0x6907, 0x2194, 0x6908, 0x6908, 0x2196, 0x6909, 0x6909, 0x4658,\n    0x690A, 0x690A, 0x21A3, 0x690B, 0x690B, 0x21A2, 0x690C, 0x690C, 0x2182,\n    0x690D, 0x690D, 0x0C94, 0x690E, 0x690E, 0x0C96, 0x690F, 0x690F, 0x218A,\n    0x6910, 0x6910, 0x2191, 0x6911, 0x6911, 0x2199, 0x6912, 0x6912, 0x0C95,\n    0x6913, 0x6913, 0x2190, 0x6914, 0x6914, 0x219C, 0x6915, 0x6915, 0x21AF,\n    0x6917, 0x6917, 0x21A4, 0x6918, 0x6918, 0x3DA2, 0x691A, 0x691A, 0x3D80,\n    0x691B, 0x691B, 0x37BD, 0x6925, 0x6925, 0x21B0, 0x692A, 0x692A, 0x2186,\n    0x692C, 0x692C, 0x3F38, 0x692F, 0x692F, 0x243F, 0x6930, 0x6930, 0x0E3E,\n    0x6932, 0x6932, 0x243D, 0x6933, 0x6933, 0x2428, 0x6934, 0x6934, 0x242D,\n    0x6935, 0x6935, 0x2426, 0x6936, 0x6936, 0x41E7, 0x6937, 0x6937, 0x2439,\n    0x6938, 0x6938, 0x2418, 0x6939, 0x6939, 0x241F, 0x693B, 0x693B, 0x2437,\n    0x693C, 0x693C, 0x2441, 0x693D, 0x693D, 0x2429, 0x693E, 0x693E, 0x4056,\n    0x693F, 0x693F, 0x241C, 0x6940, 0x6940, 0x242F, 0x6941, 0x6941, 0x2434,\n    0x6942, 0x6942, 0x2420, 0x6943, 0x6943, 0x4659, 0x6944, 0x6944, 0x2431,\n    0x6945, 0x6945, 0x241D, 0x6946, 0x6946, 0x456F, 0x6948, 0x6949, 0x2424,\n    0x694A, 0x694A, 0x0E40, 0x694B, 0x694B, 0x2438, 0x694C, 0x694C, 0x2436,\n    0x694E, 0x694E, 0x2419, 0x694F, 0x694F, 0x243B, 0x6951, 0x6951, 0x243C,\n    0x6952, 0x6952, 0x243E, 0x6953, 0x6953, 0x0E44, 0x6954, 0x6954, 0x0E3C,\n    0x6955, 0x6955, 0x3D86, 0x6956, 0x6956, 0x1F1D, 0x6957, 0x6957, 0x2421,\n    0x6958, 0x6958, 0x2433, 0x6959, 0x6959, 0x2422, 0x695A, 0x695A, 0x0E39,\n    0x695B, 0x695B, 0x0E49, 0x695C, 0x695C, 0x243A, 0x695D, 0x695D, 0x0E47,\n    0x695E, 0x695E, 0x0E43, 0x695F, 0x695F, 0x2417, 0x6960, 0x6960, 0x0E3B,\n    0x6961, 0x6961, 0x41E4, 0x6962, 0x6962, 0x241A, 0x6963, 0x6963, 0x0E48,\n    0x6964, 0x6964, 0x465B, 0x6965, 0x6965, 0x242A, 0x6966, 0x6966, 0x2416,\n    0x6967, 0x6967, 0x3D15, 0x6968, 0x6968, 0x0E41, 0x6969, 0x6969, 0x242E,\n    0x696A, 0x696A, 0x241E, 0x696B, 0x696B, 0x0E42, 0x696C, 0x696C, 0x2427,\n    0x696D, 0x696D, 0x0E38, 0x696E, 0x696E, 0x0C99, 0x696F, 0x696F, 0x2430,\n    0x6970, 0x6970, 0x2197, 0x6971, 0x6971, 0x241B, 0x6972, 0x6972, 0x3A6D,\n    0x6973, 0x6973, 0x41DB, 0x6974, 0x6974, 0x2435, 0x6975, 0x6975, 0x0E3D,\n    0x6976, 0x6976, 0x2432, 0x6977, 0x6977, 0x0E3A, 0x6978, 0x6978, 0x242C,\n    0x6979, 0x6979, 0x0E45, 0x697A, 0x697A, 0x2423, 0x697B, 0x697B, 0x2440,\n    0x6980, 0x6980, 0x3F3E, 0x6982, 0x6982, 0x0E3F, 0x6983, 0x6983, 0x24AF,\n    0x6985, 0x6985, 0x465D, 0x6986, 0x6986, 0x0E46, 0x698A, 0x698A, 0x3D74,\n    0x698D, 0x698D, 0x26C9, 0x698E, 0x698E, 0x26C7, 0x6990, 0x6990, 0x26DD,\n    0x6991, 0x6991, 0x26C5, 0x6993, 0x6993, 0x26D7, 0x6994, 0x6994, 0x0E37,\n    0x6995, 0x6995, 0x0FF0, 0x6996, 0x6996, 0x26C1, 0x6997, 0x6997, 0x26DC,\n    0x6998, 0x6998, 0x41E8, 0x6999, 0x6999, 0x26C6, 0x699A, 0x699A, 0x26D4,\n    0x699B, 0x699B, 0x0FF5, 0x699C, 0x699C, 0x0FEE, 0x699E, 0x699E, 0x26DA,\n    0x699F, 0x699F, 0x465C, 0x69A0, 0x69A0, 0x26BF, 0x69A1, 0x69A1, 0x26D9,\n    0x69A2, 0x69A2, 0x3730, 0x69A3, 0x69A3, 0x1000, 0x69A4, 0x69A4, 0x26D0,\n    0x69A5, 0x69A5, 0x26E0, 0x69A6, 0x69A6, 0x0FFE, 0x69A7, 0x69A7, 0x26C8,\n    0x69A8, 0x69A8, 0x0FEF, 0x69A9, 0x69A9, 0x26CA, 0x69AA, 0x69AA, 0x26D8,\n    0x69AB, 0x69AB, 0x0FF8, 0x69AC, 0x69AC, 0x26C3, 0x69AD, 0x69AD, 0x0FFC,\n    0x69AE, 0x69AE, 0x0FF2, 0x69AF, 0x69AF, 0x26CC, 0x69B0, 0x69B0, 0x26C2,\n    0x69B1, 0x69B1, 0x26BC, 0x69B2, 0x69B2, 0x3FF6, 0x69B3, 0x69B3, 0x26D6,\n    0x69B4, 0x69B4, 0x0FF9, 0x69B5, 0x69B5, 0x26DF, 0x69B6, 0x69B6, 0x26BD,\n    0x69B7, 0x69B7, 0x0FF6, 0x69B9, 0x69B9, 0x26D2, 0x69BB, 0x69BB, 0x0FF7,\n    0x69BC, 0x69BC, 0x26C4, 0x69BD, 0x69BD, 0x26CF, 0x69BE, 0x69BE, 0x26CB,\n    0x69BF, 0x69BF, 0x26CD, 0x69C0, 0x69C0, 0x3F5D, 0x69C1, 0x69C1, 0x0FF1,\n    0x69C2, 0x69C2, 0x26DE, 0x69C3, 0x69C3, 0x0FFF, 0x69C4, 0x69C4, 0x26CE,\n    0x69C6, 0x69C6, 0x26E1, 0x69C9, 0x69C9, 0x26BE, 0x69CA, 0x69CA, 0x26D3,\n    0x69CB, 0x69CB, 0x0FF4, 0x69CC, 0x69CC, 0x0FFD, 0x69CD, 0x69CD, 0x0FFB,\n    0x69CE, 0x69CE, 0x26C0, 0x69CF, 0x69CF, 0x26D5, 0x69D0, 0x69D0, 0x0FFA,\n    0x69D1, 0x69D1, 0x39EF, 0x69D3, 0x69D3, 0x0FF3, 0x69D4, 0x69D4, 0x26D1,\n    0x69D5, 0x69D5, 0x3E3C, 0x69D6, 0x69D6, 0x465E, 0x69D9, 0x69D9, 0x26DB,\n    0x69E1, 0x69E1, 0x41D8, 0x69E2, 0x69E2, 0x2909, 0x69E4, 0x69E4, 0x2905,\n    0x69E5, 0x69E5, 0x2901, 0x69E6, 0x69E6, 0x2915, 0x69E7, 0x69E7, 0x2912,\n    0x69E8, 0x69E8, 0x1177, 0x69E9, 0x69E9, 0x3D91, 0x69EB, 0x69EB, 0x2919,\n    0x69EC, 0x69EC, 0x2908, 0x69ED, 0x69ED, 0x1182, 0x69EE, 0x69EE, 0x290F,\n    0x69F1, 0x69F1, 0x2904, 0x69F2, 0x69F2, 0x290E, 0x69F3, 0x69F3, 0x117F,\n    0x69F4, 0x69F4, 0x2922, 0x69F6, 0x69F6, 0x291F, 0x69F7, 0x69F7, 0x2911,\n    0x69F8, 0x69F8, 0x2902, 0x69F9, 0x69F9, 0x41ED, 0x69FA, 0x69FA, 0x41C7,\n    0x69FB, 0x69FB, 0x2916, 0x69FC, 0x69FC, 0x2918, 0x69FD, 0x69FD, 0x117B,\n    0x69FE, 0x69FE, 0x290C, 0x69FF, 0x69FF, 0x2907, 0x6A00, 0x6A00, 0x28FE,\n    0x6A01, 0x6A01, 0x1178, 0x6A02, 0x6A02, 0x1180, 0x6A03, 0x6A03, 0x3E29,\n    0x6A04, 0x6A04, 0x291B, 0x6A05, 0x6A05, 0x1181, 0x6A06, 0x6A06, 0x28FF,\n    0x6A07, 0x6A07, 0x2921, 0x6A08, 0x6A08, 0x2914, 0x6A09, 0x6A09, 0x291A,\n    0x6A0A, 0x6A0A, 0x117E, 0x6A0B, 0x6A0B, 0x41D9, 0x6A0C, 0x6A0C, 0x3D50,\n    0x6A0D, 0x6A0D, 0x2917, 0x6A0F, 0x6A0F, 0x291E, 0x6A11, 0x6A11, 0x1183,\n    0x6A13, 0x6A13, 0x117D, 0x6A14, 0x6A14, 0x2910, 0x6A15, 0x6A15, 0x2903,\n    0x6A16, 0x6A16, 0x2923, 0x6A17, 0x6A17, 0x2900, 0x6A18, 0x6A18, 0x291C,\n    0x6A19, 0x6A19, 0x117A, 0x6A1A, 0x6A1A, 0x3D1E, 0x6A1B, 0x6A1B, 0x290A,\n    0x6A1C, 0x6A1C, 0x3B68, 0x6A1D, 0x6A1D, 0x290B, 0x6A1E, 0x6A1E, 0x1179,\n    0x6A1F, 0x6A1F, 0x1176, 0x6A20, 0x6A20, 0x2906, 0x6A21, 0x6A21, 0x117C,\n    0x6A23, 0x6A23, 0x1175, 0x6A25, 0x6A25, 0x291D, 0x6A26, 0x6A26, 0x2920,\n    0x6A27, 0x6A27, 0x290D, 0x6A28, 0x6A28, 0x2B74, 0x6A2B, 0x6A2B, 0x3D42,\n    0x6A2C, 0x6A2C, 0x42AB, 0x6A2D, 0x6A2D, 0x3B1F, 0x6A32, 0x6A32, 0x2B6C,\n    0x6A33, 0x6A33, 0x3AA4, 0x6A34, 0x6A34, 0x2B68, 0x6A35, 0x6A35, 0x12D9,\n    0x6A38, 0x6A38, 0x12CE, 0x6A39, 0x6A39, 0x12D3, 0x6A3A, 0x6A3A, 0x12CF,\n    0x6A3B, 0x6A3B, 0x2B76, 0x6A3C, 0x6A3C, 0x2B81, 0x6A3D, 0x6A3D, 0x12CD,\n    0x6A3E, 0x6A3E, 0x2B6E, 0x6A3F, 0x6A3F, 0x2B77, 0x6A40, 0x6A40, 0x2913,\n    0x6A41, 0x6A41, 0x2B78, 0x6A44, 0x6A44, 0x12D4, 0x6A45, 0x6A45, 0x41F0,\n    0x6A46, 0x6A46, 0x2B87, 0x6A47, 0x6A47, 0x12D8, 0x6A48, 0x6A48, 0x12DB,\n    0x6A49, 0x6A49, 0x2B6A, 0x6A4B, 0x6A4B, 0x12D7, 0x6A4C, 0x6A4C, 0x3AAB,\n    0x6A4D, 0x6A4E, 0x2B85, 0x6A4F, 0x6A4F, 0x2B7C, 0x6A50, 0x6A50, 0x2B7B,\n    0x6A51, 0x6A51, 0x2B73, 0x6A52, 0x6A52, 0x3AA5, 0x6A53, 0x6A53, 0x37AC,\n    0x6A54, 0x6A54, 0x2B7D, 0x6A55, 0x6A55, 0x2B84, 0x6A56, 0x6A56, 0x2B83,\n    0x6A57, 0x6A57, 0x37DA, 0x6A58, 0x6A58, 0x12D2, 0x6A59, 0x6A59, 0x12D0,\n    0x6A5A, 0x6A5A, 0x2B75, 0x6A5B, 0x6A5B, 0x2B72, 0x6A5D, 0x6A5D, 0x2B6F,\n    0x6A5E, 0x6A5E, 0x2B82, 0x6A5F, 0x6A5F, 0x12DA, 0x6A60, 0x6A60, 0x2B80,\n    0x6A61, 0x6A61, 0x12D6, 0x6A62, 0x6A62, 0x12D5, 0x6A64, 0x6A64, 0x2B7A,\n    0x6A65, 0x6A65, 0x4660, 0x6A66, 0x6A66, 0x2B69, 0x6A67, 0x6A67, 0x2B6B,\n    0x6A68, 0x6A68, 0x2B6D, 0x6A69, 0x6A69, 0x2B7F, 0x6A6A, 0x6A6A, 0x2B79,\n    0x6A6B, 0x6A6B, 0x12D1, 0x6A6D, 0x6A6D, 0x2B70, 0x6A6F, 0x6A6F, 0x2B7E,\n    0x6A71, 0x6A71, 0x4662, 0x6A74, 0x6A74, 0x4661, 0x6A76, 0x6A76, 0x2B71,\n    0x6A7A, 0x6A7A, 0x3AAD, 0x6A7E, 0x6A7E, 0x13EC, 0x6A7F, 0x6A7F, 0x2D84,\n    0x6A80, 0x6A80, 0x13E5, 0x6A81, 0x6A81, 0x2D75, 0x6A82, 0x6A82, 0x4663,\n    0x6A83, 0x6A83, 0x2D80, 0x6A84, 0x6A84, 0x13E7, 0x6A85, 0x6A85, 0x2D87,\n    0x6A87, 0x6A87, 0x2D7C, 0x6A89, 0x6A89, 0x2D77, 0x6A8A, 0x6A8A, 0x4136,\n    0x6A8C, 0x6A8C, 0x2D88, 0x6A8D, 0x6A8D, 0x2D73, 0x6A8E, 0x6A8E, 0x2D7E,\n    0x6A8F, 0x6A8F, 0x3C1B, 0x6A90, 0x6A90, 0x13EE, 0x6A91, 0x6A91, 0x2D83,\n    0x6A92, 0x6A92, 0x2D89, 0x6A93, 0x6A93, 0x2D7D, 0x6A94, 0x6A94, 0x13E6,\n    0x6A95, 0x6A95, 0x2D7F, 0x6A96, 0x6A96, 0x2D74, 0x6A97, 0x6A97, 0x13ED,\n    0x6A99, 0x6A99, 0x4665, 0x6A9A, 0x6A9A, 0x2D86, 0x6A9B, 0x6A9B, 0x2D79,\n    0x6A9C, 0x6A9C, 0x13E9, 0x6A9D, 0x6A9D, 0x41F2, 0x6A9E, 0x6A9E, 0x2D7B,\n    0x6A9F, 0x6A9F, 0x2D78, 0x6AA0, 0x6AA0, 0x13EF, 0x6AA1, 0x6AA1, 0x2D7A,\n    0x6AA2, 0x6AA2, 0x13E8, 0x6AA3, 0x6AA3, 0x13EB, 0x6AA4, 0x6AA4, 0x2D82,\n    0x6AA5, 0x6AA5, 0x2D76, 0x6AA6, 0x6AA6, 0x2D85, 0x6AA7, 0x6AA7, 0x37E3,\n    0x6AA8, 0x6AA8, 0x2D81, 0x6AAB, 0x6AAB, 0x4667, 0x6AAC, 0x6AAC, 0x14DD,\n    0x6AAD, 0x6AAD, 0x2F3E, 0x6AAE, 0x6AAF, 0x14E2, 0x6AB1, 0x6AB1, 0x3E53,\n    0x6AB2, 0x6AB2, 0x3B4B, 0x6AB3, 0x6AB3, 0x14DC, 0x6AB4, 0x6AB4, 0x2F3D,\n    0x6AB5, 0x6AB5, 0x4668, 0x6AB6, 0x6AB7, 0x2F3A, 0x6AB8, 0x6AB8, 0x14E0,\n    0x6AB9, 0x6AB9, 0x2F35, 0x6ABA, 0x6ABA, 0x2F39, 0x6ABB, 0x6ABB, 0x14DF,\n    0x6ABD, 0x6ABD, 0x2F36, 0x6ABE, 0x6ABE, 0x3AA1, 0x6AC2, 0x6AC2, 0x14E1,\n    0x6AC3, 0x6AC3, 0x14DE, 0x6AC5, 0x6AC5, 0x2F34, 0x6AC6, 0x6AC6, 0x2F38,\n    0x6AC7, 0x6AC7, 0x2F3C, 0x6AC8, 0x6AC8, 0x41F5, 0x6AC9, 0x6AC9, 0x3AA6,\n    0x6ACA, 0x6ACA, 0x3F4C, 0x6ACB, 0x6ACB, 0x309F, 0x6ACC, 0x6ACC, 0x309C,\n    0x6ACD, 0x6ACD, 0x30A5, 0x6ACF, 0x6ACF, 0x30A4, 0x6AD0, 0x6AD0, 0x30A2,\n    0x6AD1, 0x6AD1, 0x309D, 0x6AD3, 0x6AD3, 0x1589, 0x6AD4, 0x6AD4, 0x4669,\n    0x6AD8, 0x6AD8, 0x3CAA, 0x6AD9, 0x6AD9, 0x309E, 0x6ADA, 0x6ADA, 0x1588,\n    0x6ADB, 0x6ADB, 0x13EA, 0x6ADC, 0x6ADC, 0x30A1, 0x6ADD, 0x6ADD, 0x1587,\n    0x6ADE, 0x6ADE, 0x30A6, 0x6ADF, 0x6ADF, 0x30A0, 0x6AE0, 0x6AE0, 0x309B,\n    0x6AE1, 0x6AE1, 0x2F37, 0x6AE5, 0x6AE5, 0x1586, 0x6AE7, 0x6AE7, 0x309A,\n    0x6AE8, 0x6AE8, 0x31DF, 0x6AEA, 0x6AEA, 0x31DE, 0x6AEB, 0x6AEB, 0x30A3,\n    0x6AEC, 0x6AEC, 0x161B, 0x6AEE, 0x6AEF, 0x31E2, 0x6AF0, 0x6AF0, 0x31DD,\n    0x6AF1, 0x6AF1, 0x31E1, 0x6AF3, 0x6AF3, 0x31DC, 0x6AF6, 0x6AF6, 0x466A,\n    0x6AF8, 0x6AF8, 0x32D6, 0x6AF9, 0x6AF9, 0x31E0, 0x6AFA, 0x6AFA, 0x1678,\n    0x6AFB, 0x6AFB, 0x1676, 0x6AFC, 0x6AFC, 0x32D4, 0x6B00, 0x6B00, 0x32D7,\n    0x6B02, 0x6B02, 0x32D3, 0x6B03, 0x6B03, 0x32D5, 0x6B04, 0x6B04, 0x1677,\n    0x6B05, 0x6B05, 0x3AA7, 0x6B08, 0x6B09, 0x3386, 0x6B0A, 0x6B0A, 0x16C6,\n    0x6B0B, 0x6B0B, 0x3385, 0x6B0F, 0x6B0F, 0x3420, 0x6B10, 0x6B10, 0x16FD,\n    0x6B11, 0x6B12, 0x341E, 0x6B13, 0x6B13, 0x3487, 0x6B16, 0x6B16, 0x1743,\n    0x6B17, 0x6B17, 0x34CE, 0x6B18, 0x6B19, 0x34CC, 0x6B1A, 0x6B1A, 0x34CF,\n    0x6B1D, 0x6B1D, 0x41F8, 0x6B1E, 0x6B1E, 0x3534, 0x6B20, 0x6B20, 0x02DE,\n    0x6B21, 0x6B21, 0x03E3, 0x6B23, 0x6B23, 0x061A, 0x6B25, 0x6B25, 0x19C9,\n    0x6B28, 0x6B28, 0x1B3D, 0x6B2C, 0x6B2C, 0x1CE6, 0x6B2D, 0x6B2D, 0x1CE8,\n    0x6B2F, 0x6B2F, 0x1CE7, 0x6B31, 0x6B31, 0x1CE9, 0x6B32, 0x6B32, 0x0AE7,\n    0x6B33, 0x6B33, 0x1F3C, 0x6B34, 0x6B34, 0x1CEA, 0x6B35, 0x6B35, 0x41FB,\n    0x6B36, 0x6B36, 0x1F3B, 0x6B37, 0x6B38, 0x1F3D, 0x6B39, 0x6B39, 0x21B2,\n    0x6B3A, 0x6B3A, 0x0C9C, 0x6B3B, 0x6B3B, 0x21B3, 0x6B3C, 0x6B3C, 0x21B5,\n    0x6B3D, 0x6B3D, 0x0C9D, 0x6B3E, 0x6B3E, 0x0C9B, 0x6B3F, 0x6B3F, 0x21B4,\n    0x6B41, 0x6B41, 0x2447, 0x6B42, 0x6B42, 0x2445, 0x6B43, 0x6B43, 0x2444,\n    0x6B45, 0x6B45, 0x2443, 0x6B46, 0x6B46, 0x2442, 0x6B47, 0x6B47, 0x0E4A,\n    0x6B48, 0x6B48, 0x2446, 0x6B49, 0x6B49, 0x1001, 0x6B4A, 0x6B4A, 0x26E2,\n    0x6B4B, 0x6B4B, 0x26E4, 0x6B4C, 0x6B4C, 0x1002, 0x6B4D, 0x6B4D, 0x26E3,\n    0x6B4E, 0x6B4E, 0x1185, 0x6B50, 0x6B50, 0x1184, 0x6B51, 0x6B51, 0x2924,\n    0x6B52, 0x6B52, 0x3F6E, 0x6B54, 0x6B54, 0x2B89, 0x6B55, 0x6B55, 0x2B88,\n    0x6B56, 0x6B56, 0x2B8A, 0x6B57, 0x6B57, 0x3AAE, 0x6B59, 0x6B59, 0x12DC,\n    0x6B5B, 0x6B5B, 0x2D8A, 0x6B5C, 0x6B5C, 0x13F0, 0x6B5E, 0x6B5E, 0x2F3F,\n    0x6B5F, 0x6B5F, 0x14E4, 0x6B60, 0x6B60, 0x30A7, 0x6B61, 0x6B61, 0x16C7,\n    0x6B62, 0x6B62, 0x02DF, 0x6B63, 0x6B63, 0x034D, 0x6B64, 0x6B64, 0x03E4,\n    0x6B65, 0x6B65, 0x04C9, 0x6B66, 0x6B67, 0x061B, 0x6B6A, 0x6B6A, 0x0769,\n    0x6B6D, 0x6B6D, 0x1CEB, 0x6B6F, 0x6B6F, 0x4515, 0x6B72, 0x6B72, 0x0E4B,\n    0x6B74, 0x6B74, 0x41FC, 0x6B76, 0x6B76, 0x29A2, 0x6B77, 0x6B77, 0x12DD,\n    0x6B78, 0x6B78, 0x14E5, 0x6B79, 0x6B79, 0x02E0, 0x6B7A, 0x6B7A, 0x44EE,\n    0x6B7B, 0x6B7B, 0x03E5, 0x6B7E, 0x6B7E, 0x19CB, 0x6B7F, 0x6B7F, 0x061D,\n    0x6B80, 0x6B80, 0x19CA, 0x6B81, 0x6B81, 0x466B, 0x6B82, 0x6B82, 0x1B3E,\n    0x6B83, 0x6B83, 0x076A, 0x6B84, 0x6B84, 0x1B3F, 0x6B86, 0x6B86, 0x076B,\n    0x6B88, 0x6B88, 0x1CED, 0x6B89, 0x6B89, 0x0900, 0x6B8A, 0x6B8A, 0x08FF,\n    0x6B8C, 0x6B8C, 0x1F43, 0x6B8D, 0x6B8E, 0x1F41, 0x6B8F, 0x6B8F, 0x1F40,\n    0x6B91, 0x6B91, 0x1F3F, 0x6B94, 0x6B94, 0x21B6, 0x6B95, 0x6B95, 0x21B9,\n    0x6B96, 0x6B96, 0x0C9F, 0x6B97, 0x6B97, 0x21B7, 0x6B98, 0x6B98, 0x0C9E,\n    0x6B99, 0x6B99, 0x21B8, 0x6B9B, 0x6B9B, 0x2448, 0x6B9E, 0x6BA0, 0x26E5,\n    0x6BA2, 0x6BA2, 0x2927, 0x6BA3, 0x6BA3, 0x2926, 0x6BA4, 0x6BA4, 0x1186,\n    0x6BA5, 0x6BA5, 0x2925, 0x6BA6, 0x6BA6, 0x2928, 0x6BA7, 0x6BA7, 0x2B8B,\n    0x6BAA, 0x6BAB, 0x2B8C, 0x6BAD, 0x6BAD, 0x2D8B, 0x6BAE, 0x6BAE, 0x13F1,\n    0x6BAF, 0x6BAF, 0x14E6, 0x6BB0, 0x6BB0, 0x30A8, 0x6BB2, 0x6BB2, 0x1679,\n    0x6BB3, 0x6BB3, 0x178A, 0x6BB5, 0x6BB5, 0x076C, 0x6BB6, 0x6BB6, 0x1B40,\n    0x6BB7, 0x6BB7, 0x0901, 0x6BBA, 0x6BBA, 0x0AE8, 0x6BBC, 0x6BBC, 0x0CA0,\n    0x6BBD, 0x6BBD, 0x21BA, 0x6BBF, 0x6BBF, 0x0E4D, 0x6BC0, 0x6BC0, 0x0E4C,\n    0x6BC1, 0x6BC1, 0x466C, 0x6BC3, 0x6BC4, 0x26E8, 0x6BC5, 0x6BC6, 0x1187,\n    0x6BC7, 0x6BC7, 0x2B8F, 0x6BC8, 0x6BC8, 0x2B8E, 0x6BC9, 0x6BC9, 0x2F40,\n    0x6BCA, 0x6BCA, 0x3421, 0x6BCB, 0x6BCB, 0x02E1, 0x6BCC, 0x6BCC, 0x178B,\n    0x6BCD, 0x6BCD, 0x034E, 0x6BCF, 0x6BCF, 0x04CA, 0x6BD0, 0x6BD0, 0x18AD,\n    0x6BD2, 0x6BD2, 0x076D, 0x6BD3, 0x6BD3, 0x0E4E, 0x6BD4, 0x6BD4, 0x02E2,\n    0x6BD6, 0x6BD6, 0x1B41, 0x6BD7, 0x6BD7, 0x076E, 0x6BD8, 0x6BD8, 0x1B42,\n    0x6BDA, 0x6BDA, 0x13F2, 0x6BDB, 0x6BDB, 0x02E3, 0x6BDC, 0x6BDC, 0x4207,\n    0x6BDE, 0x6BDE, 0x19CC, 0x6BE0, 0x6BE0, 0x1B43, 0x6BE1, 0x6BE1, 0x4205,\n    0x6BE2, 0x6BE2, 0x1CF2, 0x6BE3, 0x6BE3, 0x1CF1, 0x6BE4, 0x6BE4, 0x1CEF,\n    0x6BE6, 0x6BE6, 0x1CEE, 0x6BE7, 0x6BE7, 0x1CF3, 0x6BE8, 0x6BE8, 0x1CF0,\n    0x6BEA, 0x6BEA, 0x466D, 0x6BEB, 0x6BEC, 0x0AE9, 0x6BEF, 0x6BEF, 0x0CA1,\n    0x6BF0, 0x6BF0, 0x21BB, 0x6BF2, 0x6BF3, 0x21BC, 0x6BF7, 0x6BF8, 0x244C,\n    0x6BF9, 0x6BF9, 0x244B, 0x6BFA, 0x6BFA, 0x3F79, 0x6BFB, 0x6BFC, 0x2449,\n    0x6BFD, 0x6BFD, 0x0E4F, 0x6BFE, 0x6BFE, 0x26EA, 0x6BFF, 0x6BFF, 0x292B,\n    0x6C00, 0x6C00, 0x292A, 0x6C01, 0x6C01, 0x2929, 0x6C02, 0x6C02, 0x292C,\n    0x6C03, 0x6C03, 0x2B91, 0x6C04, 0x6C04, 0x2B90, 0x6C05, 0x6C05, 0x12DE,\n    0x6C06, 0x6C06, 0x2B92, 0x6C08, 0x6C08, 0x13F3, 0x6C09, 0x6C09, 0x2D8C,\n    0x6C0B, 0x6C0B, 0x2F41, 0x6C0C, 0x6C0C, 0x30A9, 0x6C0D, 0x6C0D, 0x3388,\n    0x6C0F, 0x6C0F, 0x02E4, 0x6C10, 0x6C10, 0x0350, 0x6C11, 0x6C11, 0x034F,\n    0x6C13, 0x6C13, 0x061E, 0x6C14, 0x6C14, 0x178C, 0x6C15, 0x6C15, 0x17AA,\n    0x6C16, 0x6C16, 0x03E6, 0x6C18, 0x6C18, 0x1801, 0x6C19, 0x6C1A, 0x18AE,\n    0x6C1B, 0x6C1B, 0x061F, 0x6C1C, 0x6C1C, 0x38AB, 0x6C1D, 0x6C1D, 0x19CD,\n    0x6C1F, 0x6C1F, 0x076F, 0x6C20, 0x6C21, 0x1B44, 0x6C23, 0x6C23, 0x0902,\n    0x6C24, 0x6C24, 0x0906, 0x6C25, 0x6C25, 0x1CF4, 0x6C26, 0x6C26, 0x0905,\n    0x6C27, 0x6C28, 0x0903, 0x6C2A, 0x6C2A, 0x1F44, 0x6C2B, 0x6C2B, 0x0AEB,\n    0x6C2C, 0x6C2C, 0x0CA4, 0x6C2E, 0x6C2F, 0x0CA2, 0x6C30, 0x6C30, 0x21BE,\n    0x6C31, 0x6C31, 0x3F63, 0x6C33, 0x6C33, 0x1003, 0x6C34, 0x6C34, 0x02E5,\n    0x6C35, 0x6C35, 0x44EF, 0x6C36, 0x6C36, 0x17AB, 0x6C37, 0x6C37, 0x4208,\n    0x6C38, 0x6C38, 0x0351, 0x6C39, 0x6C39, 0x3E05, 0x6C3A, 0x6C3A, 0x44F0,\n    0x6C3B, 0x6C3B, 0x17AE, 0x6C3D, 0x6C3D, 0x4381, 0x6C3E, 0x6C3E, 0x0354,\n    0x6C3F, 0x6C3F, 0x17AD, 0x6C40, 0x6C40, 0x0353, 0x6C41, 0x6C41, 0x0352,\n    0x6C42, 0x6C42, 0x04CB, 0x6C43, 0x6C43, 0x17AC, 0x6C46, 0x6C46, 0x1802,\n    0x6C49, 0x6C49, 0x408D, 0x6C4A, 0x6C4A, 0x1806, 0x6C4B, 0x6C4C, 0x1808,\n    0x6C4D, 0x6C4E, 0x03F0, 0x6C4F, 0x6C4F, 0x1805, 0x6C50, 0x6C50, 0x03EC,\n    0x6C52, 0x6C52, 0x1803, 0x6C54, 0x6C54, 0x1807, 0x6C55, 0x6C55, 0x03ED,\n    0x6C57, 0x6C57, 0x03E8, 0x6C58, 0x6C58, 0x3BBA, 0x6C59, 0x6C59, 0x03E9,\n    0x6C5A, 0x6C5A, 0x420C, 0x6C5B, 0x6C5B, 0x03EF, 0x6C5C, 0x6C5C, 0x1804,\n    0x6C5D, 0x6C5D, 0x03E7, 0x6C5E, 0x6C5E, 0x04CC, 0x6C5F, 0x6C60, 0x03EA,\n    0x6C61, 0x6C61, 0x03EE, 0x6C65, 0x6C65, 0x18C0, 0x6C66, 0x6C66, 0x18BE,\n    0x6C67, 0x6C67, 0x18B1, 0x6C68, 0x6C68, 0x04D8, 0x6C69, 0x6C69, 0x18B8,\n    0x6C6A, 0x6C6A, 0x04D3, 0x6C6B, 0x6C6B, 0x18B2, 0x6C6D, 0x6C6D, 0x18BA,\n    0x6C6E, 0x6C6E, 0x40CA, 0x6C6F, 0x6C6F, 0x18B7, 0x6C70, 0x6C70, 0x04D6,\n    0x6C71, 0x6C71, 0x18B6, 0x6C72, 0x6C72, 0x04DD, 0x6C73, 0x6C73, 0x18BF,\n    0x6C74, 0x6C74, 0x04DF, 0x6C75, 0x6C75, 0x466E, 0x6C76, 0x6C76, 0x04E1,\n    0x6C78, 0x6C78, 0x18B0, 0x6C79, 0x6C79, 0x420E, 0x6C7A, 0x6C7A, 0x04D4,\n    0x6C7B, 0x6C7B, 0x18C1, 0x6C7D, 0x6C7D, 0x04DB, 0x6C7E, 0x6C7E, 0x04DE,\n    0x6C7F, 0x6C7F, 0x37A6, 0x6C80, 0x6C80, 0x19E4, 0x6C81, 0x6C81, 0x04CE,\n    0x6C82, 0x6C82, 0x04E5, 0x6C83, 0x6C83, 0x04DC, 0x6C84, 0x6C84, 0x18B3,\n    0x6C85, 0x6C85, 0x04D1, 0x6C86, 0x6C86, 0x04E0, 0x6C87, 0x6C87, 0x18BB,\n    0x6C88, 0x6C89, 0x04CF, 0x6C8A, 0x6C8A, 0x19E2, 0x6C8B, 0x6C8B, 0x18B4,\n    0x6C8C, 0x6C8C, 0x04D7, 0x6C8D, 0x6C8D, 0x04E2, 0x6C8E, 0x6C8E, 0x18C2,\n    0x6C8F, 0x6C8F, 0x18B5, 0x6C90, 0x6C90, 0x04D5, 0x6C92, 0x6C92, 0x04DA,\n    0x6C93, 0x6C93, 0x19CE, 0x6C94, 0x6C94, 0x04E3, 0x6C95, 0x6C95, 0x18BC,\n    0x6C96, 0x6C96, 0x04D9, 0x6C98, 0x6C98, 0x04E4, 0x6C99, 0x6C99, 0x04CD,\n    0x6C9A, 0x6C9A, 0x18B9, 0x6C9B, 0x6C9B, 0x04D2, 0x6C9C, 0x6C9C, 0x18BD,\n    0x6C9D, 0x6C9D, 0x19E3, 0x6C9F, 0x6C9F, 0x3889, 0x6CA2, 0x6CA2, 0x3D63,\n    0x6CAA, 0x6CAA, 0x466F, 0x6CAB, 0x6CAB, 0x062B, 0x6CAC, 0x6CAC, 0x063B,\n    0x6CAD, 0x6CAD, 0x19D5, 0x6CAE, 0x6CAE, 0x0632, 0x6CAF, 0x6CAF, 0x3CF6,\n    0x6CB0, 0x6CB0, 0x19EA, 0x6CB1, 0x6CB1, 0x0623, 0x6CB2, 0x6CB2, 0x3ECC,\n    0x6CB3, 0x6CB3, 0x0626, 0x6CB4, 0x6CB4, 0x19E1, 0x6CB6, 0x6CB6, 0x19D3,\n    0x6CB7, 0x6CB7, 0x19D7, 0x6CB8, 0x6CB8, 0x062E, 0x6CB9, 0x6CB9, 0x0630,\n    0x6CBA, 0x6CBA, 0x19DA, 0x6CBB, 0x6CBB, 0x0637, 0x6CBC, 0x6CBC, 0x0629,\n    0x6CBD, 0x6CBE, 0x0627, 0x6CBF, 0x6CBF, 0x0636, 0x6CC0, 0x6CC0, 0x19E6,\n    0x6CC1, 0x6CC1, 0x0631, 0x6CC2, 0x6CC2, 0x19D9, 0x6CC3, 0x6CC3, 0x19DB,\n    0x6CC4, 0x6CC4, 0x062F, 0x6CC5, 0x6CC5, 0x0634, 0x6CC6, 0x6CC6, 0x19DC,\n    0x6CC7, 0x6CC7, 0x19E9, 0x6CC9, 0x6CC9, 0x0770, 0x6CCA, 0x6CCA, 0x063A,\n    0x6CCB, 0x6CCB, 0x4070, 0x6CCC, 0x6CCC, 0x0624, 0x6CCD, 0x6CCD, 0x19E8,\n    0x6CCE, 0x6CCE, 0x3F91, 0x6CCF, 0x6CCF, 0x19EC, 0x6CD0, 0x6CD0, 0x19D8,\n    0x6CD1, 0x6CD1, 0x19EE, 0x6CD2, 0x6CD2, 0x19DF, 0x6CD3, 0x6CD3, 0x062D,\n    0x6CD4, 0x6CD4, 0x19D4, 0x6CD5, 0x6CD5, 0x062C, 0x6CD6, 0x6CD6, 0x063E,\n    0x6CD7, 0x6CD7, 0x0633, 0x6CD9, 0x6CD9, 0x19D2, 0x6CDA, 0x6CDA, 0x1B4E,\n    0x6CDB, 0x6CDB, 0x0639, 0x6CDC, 0x6CDC, 0x063D, 0x6CDD, 0x6CDD, 0x19E0,\n    0x6CDE, 0x6CDE, 0x19E5, 0x6CDF, 0x6CDF, 0x3D57, 0x6CE0, 0x6CE0, 0x063F,\n    0x6CE1, 0x6CE1, 0x0638, 0x6CE2, 0x6CE2, 0x062A, 0x6CE3, 0x6CE3, 0x0620,\n    0x6CE5, 0x6CE5, 0x0625, 0x6CE7, 0x6CE7, 0x19D6, 0x6CE8, 0x6CE8, 0x0621,\n    0x6CE9, 0x6CE9, 0x19ED, 0x6CEA, 0x6CEA, 0x3F8D, 0x6CEB, 0x6CEB, 0x19D0,\n    0x6CEC, 0x6CEC, 0x19CF, 0x6CED, 0x6CED, 0x19DD, 0x6CEE, 0x6CEE, 0x19D1,\n    0x6CEF, 0x6CEF, 0x063C, 0x6CF0, 0x6CF0, 0x0907, 0x6CF1, 0x6CF1, 0x0635,\n    0x6CF2, 0x6CF2, 0x19DE, 0x6CF3, 0x6CF3, 0x0622, 0x6CF5, 0x6CF5, 0x077F,\n    0x6CF9, 0x6CF9, 0x19EB, 0x6D00, 0x6D00, 0x1B55, 0x6D01, 0x6D01, 0x1B58,\n    0x6D02, 0x6D02, 0x4671, 0x6D03, 0x6D03, 0x1B5B, 0x6D04, 0x6D04, 0x1B50,\n    0x6D05, 0x6D05, 0x3A19, 0x6D06, 0x6D06, 0x4672, 0x6D07, 0x6D07, 0x1B5E,\n    0x6D08, 0x6D08, 0x1B61, 0x6D09, 0x6D09, 0x1B63, 0x6D0A, 0x6D0A, 0x1B4D,\n    0x6D0B, 0x6D0B, 0x0771, 0x6D0C, 0x6D0C, 0x0776, 0x6D0D, 0x6D0D, 0x1CF9,\n    0x6D0E, 0x6D0E, 0x0786, 0x6D0F, 0x6D0F, 0x1B5C, 0x6D10, 0x6D10, 0x1B64,\n    0x6D11, 0x6D11, 0x1B54, 0x6D12, 0x6D12, 0x1B4C, 0x6D16, 0x6D16, 0x1D14,\n    0x6D17, 0x6D17, 0x0779, 0x6D18, 0x6D18, 0x1B59, 0x6D19, 0x6D19, 0x1B51,\n    0x6D1A, 0x6D1A, 0x1B53, 0x6D1B, 0x6D1B, 0x077E, 0x6D1D, 0x6D1D, 0x1B56,\n    0x6D1E, 0x6D1E, 0x0778, 0x6D1F, 0x6D1F, 0x1B49, 0x6D20, 0x6D20, 0x1B5F,\n    0x6D22, 0x6D22, 0x1B62, 0x6D24, 0x6D24, 0x3AC3, 0x6D25, 0x6D25, 0x0775,\n    0x6D26, 0x6D26, 0x4673, 0x6D27, 0x6D27, 0x0781, 0x6D28, 0x6D28, 0x1B46,\n    0x6D29, 0x6D29, 0x0783, 0x6D2A, 0x6D2A, 0x0773, 0x6D2B, 0x6D2B, 0x0787,\n    0x6D2C, 0x6D2C, 0x1B60, 0x6D2D, 0x6D2D, 0x1B48, 0x6D2E, 0x6D2E, 0x0784,\n    0x6D2F, 0x6D2F, 0x1D0E, 0x6D30, 0x6D30, 0x19E7, 0x6D31, 0x6D31, 0x0777,\n    0x6D32, 0x6D32, 0x0772, 0x6D33, 0x6D33, 0x1B4F, 0x6D34, 0x6D34, 0x1B47,\n    0x6D35, 0x6D35, 0x0785, 0x6D36, 0x6D36, 0x077D, 0x6D37, 0x6D37, 0x1B5A,\n    0x6D38, 0x6D38, 0x0782, 0x6D39, 0x6D39, 0x0780, 0x6D3A, 0x6D3A, 0x1B52,\n    0x6D3B, 0x6D3B, 0x077A, 0x6D3C, 0x6D3C, 0x1B4A, 0x6D3D, 0x6D3E, 0x077B,\n    0x6D3F, 0x6D3F, 0x1B4B, 0x6D40, 0x6D40, 0x1B5D, 0x6D41, 0x6D41, 0x0774,\n    0x6D42, 0x6D42, 0x1B57, 0x6D4E, 0x6D4E, 0x4558, 0x6D57, 0x6D57, 0x3CF3,\n    0x6D58, 0x6D58, 0x1CFC, 0x6D59, 0x6D59, 0x090F, 0x6D5A, 0x6D5A, 0x0914,\n    0x6D5B, 0x6D5B, 0x409C, 0x6D5C, 0x6D5C, 0x4222, 0x6D5E, 0x6D5E, 0x1D05,\n    0x6D5F, 0x6D5F, 0x1D0B, 0x6D60, 0x6D60, 0x1D07, 0x6D61, 0x6D61, 0x1CFA,\n    0x6D62, 0x6D62, 0x1CFD, 0x6D63, 0x6D64, 0x1CF6, 0x6D65, 0x6D65, 0x091B,\n    0x6D66, 0x6D66, 0x090C, 0x6D67, 0x6D67, 0x1D06, 0x6D68, 0x6D68, 0x1D0F,\n    0x6D69, 0x6D69, 0x0916, 0x6D6A, 0x6D6A, 0x0908, 0x6D6C, 0x6D6C, 0x0911,\n    0x6D6D, 0x6D6D, 0x1CFE, 0x6D6E, 0x6D6E, 0x0913, 0x6D6F, 0x6D6F, 0x1CFF,\n    0x6D70, 0x6D70, 0x1D09, 0x6D71, 0x6D71, 0x40F5, 0x6D72, 0x6D72, 0x39D7,\n    0x6D74, 0x6D74, 0x0915, 0x6D75, 0x6D75, 0x1D18, 0x6D76, 0x6D76, 0x1CF8,\n    0x6D77, 0x6D77, 0x090E, 0x6D78, 0x6D78, 0x090D, 0x6D79, 0x6D79, 0x0919,\n    0x6D7A, 0x6D7A, 0x1CF5, 0x6D7B, 0x6D7B, 0x1D16, 0x6D7C, 0x6D7C, 0x1D0A,\n    0x6D7D, 0x6D7D, 0x1D17, 0x6D7E, 0x6D7E, 0x1D11, 0x6D7F, 0x6D7F, 0x1D03,\n    0x6D80, 0x6D80, 0x1D12, 0x6D81, 0x6D81, 0x4674, 0x6D82, 0x6D82, 0x1D0C,\n    0x6D83, 0x6D83, 0x1D15, 0x6D84, 0x6D84, 0x1D13, 0x6D85, 0x6D85, 0x091A,\n    0x6D86, 0x6D86, 0x1D04, 0x6D87, 0x6D87, 0x090B, 0x6D88, 0x6D88, 0x090A,\n    0x6D89, 0x6D89, 0x0912, 0x6D8A, 0x6D8A, 0x0918, 0x6D8B, 0x6D8B, 0x1D10,\n    0x6D8C, 0x6D8C, 0x0917, 0x6D8D, 0x6D8D, 0x1D01, 0x6D8E, 0x6D8E, 0x0AEC,\n    0x6D8F, 0x6D8F, 0x3DE8, 0x6D90, 0x6D90, 0x1D19, 0x6D91, 0x6D91, 0x1D00,\n    0x6D92, 0x6D92, 0x1CFB, 0x6D93, 0x6D93, 0x0910, 0x6D94, 0x6D94, 0x091C,\n    0x6D95, 0x6D95, 0x0909, 0x6D96, 0x6D96, 0x4221, 0x6D97, 0x6D97, 0x1D08,\n    0x6D98, 0x6D98, 0x1D0D, 0x6DA4, 0x6DA4, 0x4676, 0x6DA5, 0x6DA5, 0x3AB9,\n    0x6DAA, 0x6DAA, 0x0B0E, 0x6DAB, 0x6DAB, 0x1F46, 0x6DAC, 0x6DAC, 0x1F4A,\n    0x6DAE, 0x6DAE, 0x0AFB, 0x6DAF, 0x6DAF, 0x0AF9, 0x6DB1, 0x6DB1, 0x4677,\n    0x6DB2, 0x6DB2, 0x0AF0, 0x6DB3, 0x6DB3, 0x1F48, 0x6DB4, 0x6DB4, 0x1F47,\n    0x6DB5, 0x6DB5, 0x0B04, 0x6DB7, 0x6DB7, 0x1F4D, 0x6DB8, 0x6DB8, 0x0AFE,\n    0x6DB9, 0x6DB9, 0x3FFB, 0x6DBA, 0x6DBA, 0x1F5F, 0x6DBB, 0x6DBB, 0x1F6B,\n    0x6DBC, 0x6DBC, 0x0AED, 0x6DBD, 0x6DBD, 0x1F5C, 0x6DBE, 0x6DBE, 0x1F55,\n    0x6DBF, 0x6DBF, 0x0B10, 0x6DC0, 0x6DC0, 0x1F45, 0x6DC2, 0x6DC2, 0x1F61,\n    0x6DC4, 0x6DC4, 0x0B0D, 0x6DC5, 0x6DC5, 0x0B01, 0x6DC6, 0x6DC6, 0x0B0C,\n    0x6DC7, 0x6DC7, 0x0AF7, 0x6DC8, 0x6DC8, 0x1F51, 0x6DC9, 0x6DC9, 0x1F63,\n    0x6DCA, 0x6DCA, 0x1F5B, 0x6DCB, 0x6DCB, 0x0AF8, 0x6DCC, 0x6DCC, 0x0AF2,\n    0x6DCD, 0x6DCD, 0x1F69, 0x6DCF, 0x6DCF, 0x1F62, 0x6DD0, 0x6DD0, 0x1F64,\n    0x6DD1, 0x6DD1, 0x0AFA, 0x6DD2, 0x6DD2, 0x0B02, 0x6DD3, 0x6DD3, 0x1F66,\n    0x6DD4, 0x6DD4, 0x1F4F, 0x6DD5, 0x6DD5, 0x1F60, 0x6DD6, 0x6DD6, 0x1F54,\n    0x6DD7, 0x6DD7, 0x1F68, 0x6DD8, 0x6DD8, 0x0B07, 0x6DD9, 0x6DD9, 0x0AEF,\n    0x6DDA, 0x6DDA, 0x0B05, 0x6DDB, 0x6DDB, 0x1F59, 0x6DDC, 0x6DDD, 0x1F57,\n    0x6DDE, 0x6DDE, 0x0AFC, 0x6DDF, 0x6DDF, 0x1F53, 0x6DE0, 0x6DE0, 0x1F52,\n    0x6DE1, 0x6DE1, 0x0AF1, 0x6DE2, 0x6DE2, 0x1F4C, 0x6DE3, 0x6DE3, 0x1F6A,\n    0x6DE4, 0x6DE4, 0x0AF3, 0x6DE5, 0x6DE5, 0x1F56, 0x6DE6, 0x6DE6, 0x0B11,\n    0x6DE8, 0x6DE8, 0x0B0B, 0x6DE9, 0x6DE9, 0x1F4B, 0x6DEA, 0x6DEA, 0x0B08,\n    0x6DEB, 0x6DEB, 0x0B06, 0x6DEC, 0x6DEC, 0x0B0F, 0x6DED, 0x6DED, 0x1F5D,\n    0x6DEE, 0x6DEE, 0x0B0A, 0x6DEF, 0x6DEF, 0x1D02, 0x6DF0, 0x6DF0, 0x1F5E,\n    0x6DF1, 0x6DF1, 0x0B09, 0x6DF2, 0x6DF2, 0x1F65, 0x6DF3, 0x6DF3, 0x0AEE,\n    0x6DF4, 0x6DF4, 0x1F5A, 0x6DF5, 0x6DF5, 0x0B00, 0x6DF6, 0x6DF6, 0x1F4E,\n    0x6DF7, 0x6DF7, 0x0AFF, 0x6DF9, 0x6DF9, 0x0AFD, 0x6DFA, 0x6DFA, 0x0AF5,\n    0x6DFB, 0x6DFB, 0x0AF4, 0x6DFC, 0x6DFC, 0x21BF, 0x6DFD, 0x6DFD, 0x1F67,\n    0x6E00, 0x6E00, 0x1F50, 0x6E02, 0x6E02, 0x3CFA, 0x6E03, 0x6E03, 0x21D4,\n    0x6E04, 0x6E04, 0x3ABE, 0x6E05, 0x6E05, 0x0AF6, 0x6E0A, 0x6E0A, 0x3AC1,\n    0x6E0F, 0x6E0F, 0x3CF0, 0x6E15, 0x6E15, 0x4678, 0x6E18, 0x6E18, 0x4679,\n    0x6E19, 0x6E19, 0x0CC1, 0x6E1A, 0x6E1A, 0x0B03, 0x6E1B, 0x6E1B, 0x0CAF,\n    0x6E1C, 0x6E1C, 0x21CE, 0x6E1D, 0x6E1D, 0x0CBD, 0x6E1F, 0x6E1F, 0x21C2,\n    0x6E20, 0x6E20, 0x0CAC, 0x6E21, 0x6E21, 0x0CA8, 0x6E22, 0x6E22, 0x21E0,\n    0x6E23, 0x6E23, 0x0CAE, 0x6E24, 0x6E24, 0x0CB2, 0x6E25, 0x6E25, 0x0CAD,\n    0x6E26, 0x6E26, 0x0CB6, 0x6E27, 0x6E27, 0x21E4, 0x6E28, 0x6E28, 0x21DB,\n    0x6E29, 0x6E29, 0x467A, 0x6E2A, 0x6E2A, 0x4302, 0x6E2B, 0x6E2B, 0x21C9,\n    0x6E2C, 0x6E2C, 0x0CBB, 0x6E2D, 0x6E2D, 0x0CB5, 0x6E2E, 0x6E2E, 0x21D5,\n    0x6E2F, 0x6E2F, 0x0CA5, 0x6E30, 0x6E30, 0x21E1, 0x6E31, 0x6E31, 0x21DA,\n    0x6E32, 0x6E32, 0x0CA9, 0x6E33, 0x6E33, 0x21CF, 0x6E34, 0x6E34, 0x0CB8,\n    0x6E35, 0x6E36, 0x21EC, 0x6E38, 0x6E38, 0x0CA6, 0x6E39, 0x6E39, 0x21DF,\n    0x6E3A, 0x6E3A, 0x0CBA, 0x6E3B, 0x6E3B, 0x21D3, 0x6E3C, 0x6E3D, 0x21C5,\n    0x6E3E, 0x6E3E, 0x0CBE, 0x6E3F, 0x6E3F, 0x21CA, 0x6E40, 0x6E40, 0x21D1,\n    0x6E41, 0x6E41, 0x21CB, 0x6E43, 0x6E43, 0x0CBC, 0x6E44, 0x6E44, 0x0CC4,\n    0x6E45, 0x6E45, 0x21C7, 0x6E46, 0x6E47, 0x21C0, 0x6E49, 0x6E49, 0x21C3,\n    0x6E4A, 0x6E4A, 0x0CAB, 0x6E4B, 0x6E4B, 0x21D0, 0x6E4D, 0x6E4D, 0x0CB9,\n    0x6E4E, 0x6E4E, 0x0CC2, 0x6E4F, 0x6E4F, 0x4234, 0x6E50, 0x6E50, 0x41D1,\n    0x6E51, 0x6E51, 0x21D2, 0x6E52, 0x6E52, 0x21EA, 0x6E53, 0x6E53, 0x21E2,\n    0x6E54, 0x6E54, 0x0CA7, 0x6E55, 0x6E55, 0x21E8, 0x6E56, 0x6E56, 0x0CB3,\n    0x6E58, 0x6E58, 0x0CB1, 0x6E59, 0x6E59, 0x40E6, 0x6E5A, 0x6E5A, 0x21EE,\n    0x6E5B, 0x6E5B, 0x0CB0, 0x6E5C, 0x6E5C, 0x21D8, 0x6E5D, 0x6E5D, 0x21CC,\n    0x6E5E, 0x6E5E, 0x21D6, 0x6E5F, 0x6E5F, 0x0CC7, 0x6E60, 0x6E60, 0x21DC,\n    0x6E61, 0x6E61, 0x21D9, 0x6E62, 0x6E62, 0x21C8, 0x6E63, 0x6E63, 0x0CC3,\n    0x6E64, 0x6E64, 0x21E6, 0x6E65, 0x6E65, 0x21E3, 0x6E66, 0x6E66, 0x21EB,\n    0x6E67, 0x6E67, 0x0CAA, 0x6E68, 0x6E68, 0x21D7, 0x6E69, 0x6E69, 0x0CC6,\n    0x6E6B, 0x6E6B, 0x21DE, 0x6E6E, 0x6E6E, 0x0CB4, 0x6E6F, 0x6E6F, 0x0CB7,\n    0x6E71, 0x6E71, 0x21DD, 0x6E72, 0x6E72, 0x0CC5, 0x6E73, 0x6E73, 0x21CD,\n    0x6E74, 0x6E74, 0x1F49, 0x6E76, 0x6E76, 0x39D3, 0x6E77, 0x6E77, 0x21E7,\n    0x6E78, 0x6E78, 0x21E5, 0x6E79, 0x6E79, 0x21E9, 0x6E7C, 0x6E7C, 0x4223,\n    0x6E86, 0x6E86, 0x467B, 0x6E88, 0x6E88, 0x21C4, 0x6E89, 0x6E89, 0x0CC0,\n    0x6E8B, 0x6E8B, 0x3BBF, 0x6E8D, 0x6E8D, 0x246C, 0x6E8E, 0x6E8E, 0x246B,\n    0x6E8F, 0x6E8F, 0x2451, 0x6E90, 0x6E90, 0x0E55, 0x6E92, 0x6E92, 0x246A,\n    0x6E93, 0x6E94, 0x2454, 0x6E96, 0x6E96, 0x0E5F, 0x6E97, 0x6E97, 0x2473,\n    0x6E98, 0x6E98, 0x0E5A, 0x6E99, 0x6E99, 0x2469, 0x6E9A, 0x6E9A, 0x4581,\n    0x6E9B, 0x6E9B, 0x244E, 0x6E9C, 0x6E9C, 0x0E60, 0x6E9D, 0x6E9D, 0x0E56,\n    0x6E9E, 0x6E9E, 0x245D, 0x6E9F, 0x6E9F, 0x2453, 0x6EA0, 0x6EA0, 0x2456,\n    0x6EA1, 0x6EA1, 0x246E, 0x6EA2, 0x6EA2, 0x0E50, 0x6EA3, 0x6EA3, 0x2475,\n    0x6EA4, 0x6EA4, 0x246D, 0x6EA5, 0x6EA5, 0x0E59, 0x6EA6, 0x6EA6, 0x2462,\n    0x6EA7, 0x6EA7, 0x0E64, 0x6EAA, 0x6EAA, 0x0E63, 0x6EAB, 0x6EAB, 0x0E5D,\n    0x6EAE, 0x6EAE, 0x2474, 0x6EAF, 0x6EAF, 0x0E51, 0x6EB0, 0x6EB0, 0x2460,\n    0x6EB1, 0x6EB1, 0x2457, 0x6EB2, 0x6EB2, 0x2464, 0x6EB3, 0x6EB3, 0x2470,\n    0x6EB4, 0x6EB4, 0x0E65, 0x6EB5, 0x6EB5, 0x41FE, 0x6EB6, 0x6EB6, 0x0E53,\n    0x6EB7, 0x6EB7, 0x245F, 0x6EB8, 0x6EB8, 0x3E0C, 0x6EB9, 0x6EB9, 0x2458,\n    0x6EBA, 0x6EBA, 0x0E5C, 0x6EBB, 0x6EBB, 0x467D, 0x6EBC, 0x6EBC, 0x0E5B,\n    0x6EBD, 0x6EBD, 0x245B, 0x6EBE, 0x6EBE, 0x2465, 0x6EBF, 0x6EBF, 0x246F,\n    0x6EC0, 0x6EC0, 0x2452, 0x6EC1, 0x6EC1, 0x245C, 0x6EC2, 0x6EC2, 0x0E54,\n    0x6EC3, 0x6EC3, 0x2466, 0x6EC4, 0x6EC4, 0x0E61, 0x6EC5, 0x6EC5, 0x0E58,\n    0x6EC6, 0x6EC6, 0x2459, 0x6EC7, 0x6EC7, 0x0E57, 0x6EC8, 0x6EC8, 0x2450,\n    0x6EC9, 0x6EC9, 0x245E, 0x6ECA, 0x6ECA, 0x2472, 0x6ECB, 0x6ECB, 0x0CBF,\n    0x6ECC, 0x6ECC, 0x101F, 0x6ECD, 0x6ECD, 0x2461, 0x6ECE, 0x6ECE, 0x26EB,\n    0x6ECF, 0x6ECF, 0x2463, 0x6ED0, 0x6ED0, 0x2471, 0x6ED1, 0x6ED1, 0x0E5E,\n    0x6ED2, 0x6ED2, 0x245A, 0x6ED3, 0x6ED3, 0x0E52, 0x6ED4, 0x6ED4, 0x0E62,\n    0x6ED5, 0x6ED5, 0x119A, 0x6ED6, 0x6ED6, 0x244F, 0x6ED8, 0x6ED8, 0x2468,\n    0x6ED9, 0x6ED9, 0x4069, 0x6EDA, 0x6EDA, 0x467F, 0x6EDB, 0x6EDB, 0x402F,\n    0x6EDC, 0x6EDC, 0x2467, 0x6EDD, 0x6EDD, 0x4538, 0x6EE2, 0x6EE2, 0x467E,\n    0x6EE8, 0x6EE9, 0x4681, 0x6EEB, 0x6EEB, 0x2707, 0x6EEC, 0x6EEC, 0x101C,\n    0x6EED, 0x6EED, 0x26FC, 0x6EEE, 0x6EEE, 0x2701, 0x6EEF, 0x6EEF, 0x1011,\n    0x6EF1, 0x6EF1, 0x26ED, 0x6EF2, 0x6EF2, 0x101E, 0x6EF4, 0x6EF4, 0x1008,\n    0x6EF5, 0x6EF5, 0x26EC, 0x6EF6, 0x6EF6, 0x270D, 0x6EF7, 0x6EF7, 0x1020,\n    0x6EF8, 0x6EF8, 0x26F0, 0x6EF9, 0x6EF9, 0x2700, 0x6EFA, 0x6EFA, 0x423B,\n    0x6EFB, 0x6EFB, 0x26F2, 0x6EFC, 0x6EFC, 0x2710, 0x6EFD, 0x6EFD, 0x270C,\n    0x6EFE, 0x6EFE, 0x1006, 0x6EFF, 0x6EFF, 0x1010, 0x6F00, 0x6F00, 0x2946,\n    0x6F01, 0x6F01, 0x101D, 0x6F02, 0x6F02, 0x100E, 0x6F03, 0x6F03, 0x26EE,\n    0x6F04, 0x6F04, 0x4224, 0x6F05, 0x6F05, 0x270B, 0x6F06, 0x6F06, 0x1012,\n    0x6F07, 0x6F07, 0x2708, 0x6F08, 0x6F08, 0x2715, 0x6F09, 0x6F09, 0x26F4,\n    0x6F0A, 0x6F0A, 0x26FD, 0x6F0B, 0x6F0B, 0x3ABA, 0x6F0C, 0x6F0C, 0x3CFB,\n    0x6F0D, 0x6F0D, 0x2713, 0x6F0E, 0x6F0E, 0x2709, 0x6F0F, 0x6F0F, 0x100D,\n    0x6F12, 0x6F12, 0x26FB, 0x6F13, 0x6F13, 0x1007, 0x6F14, 0x6F14, 0x1005,\n    0x6F15, 0x6F15, 0x1017, 0x6F16, 0x6F16, 0x41A0, 0x6F17, 0x6F17, 0x46CE,\n    0x6F18, 0x6F18, 0x26F9, 0x6F19, 0x6F1A, 0x26F6, 0x6F1C, 0x6F1C, 0x270F,\n    0x6F1E, 0x6F1E, 0x2714, 0x6F1F, 0x6F1F, 0x2712, 0x6F20, 0x6F20, 0x100B,\n    0x6F21, 0x6F21, 0x2716, 0x6F22, 0x6F22, 0x100F, 0x6F23, 0x6F23, 0x1016,\n    0x6F24, 0x6F24, 0x4683, 0x6F25, 0x6F25, 0x26EF, 0x6F26, 0x6F26, 0x292E,\n    0x6F27, 0x6F27, 0x26F8, 0x6F29, 0x6F29, 0x1009, 0x6F2A, 0x6F2A, 0x101B,\n    0x6F2B, 0x6F2B, 0x1018, 0x6F2C, 0x6F2C, 0x100C, 0x6F2D, 0x6F2D, 0x2702,\n    0x6F2E, 0x6F2E, 0x26F3, 0x6F2F, 0x6F2F, 0x1019, 0x6F30, 0x6F30, 0x2704,\n    0x6F31, 0x6F31, 0x1013, 0x6F32, 0x6F32, 0x1015, 0x6F33, 0x6F33, 0x1004,\n    0x6F34, 0x6F34, 0x4684, 0x6F35, 0x6F35, 0x2706, 0x6F36, 0x6F36, 0x26FE,\n    0x6F37, 0x6F37, 0x26F1, 0x6F38, 0x6F38, 0x1014, 0x6F39, 0x6F39, 0x270E,\n    0x6F3A, 0x6F3A, 0x2711, 0x6F3B, 0x6F3B, 0x26FA, 0x6F3C, 0x6F3C, 0x2705,\n    0x6F3D, 0x6F3D, 0x4282, 0x6F3E, 0x6F3E, 0x100A, 0x6F3F, 0x6F3F, 0x1189,\n    0x6F40, 0x6F40, 0x2703, 0x6F41, 0x6F41, 0x292D, 0x6F43, 0x6F43, 0x270A,\n    0x6F44, 0x6F44, 0x4240, 0x6F4E, 0x6F4E, 0x26F5, 0x6F4F, 0x6F4F, 0x2937,\n    0x6F50, 0x6F50, 0x2941, 0x6F51, 0x6F51, 0x118C, 0x6F52, 0x6F52, 0x2940,\n    0x6F53, 0x6F53, 0x294C, 0x6F54, 0x6F54, 0x118E, 0x6F55, 0x6F55, 0x293E,\n    0x6F56, 0x6F56, 0x3E52, 0x6F57, 0x6F57, 0x2942, 0x6F58, 0x6F58, 0x1199,\n    0x6F5A, 0x6F5A, 0x2939, 0x6F5B, 0x6F5B, 0x1191, 0x6F5C, 0x6F5C, 0x4241,\n    0x6F5D, 0x6F5D, 0x2945, 0x6F5E, 0x6F5E, 0x2B9A, 0x6F5F, 0x6F5F, 0x119D,\n    0x6F60, 0x6F60, 0x119C, 0x6F61, 0x6F61, 0x2947, 0x6F62, 0x6F62, 0x2936,\n    0x6F63, 0x6F63, 0x2951, 0x6F64, 0x6F64, 0x1197, 0x6F66, 0x6F66, 0x118D,\n    0x6F67, 0x6F67, 0x294A, 0x6F69, 0x6F69, 0x294E, 0x6F6A, 0x6F6A, 0x2953,\n    0x6F6B, 0x6F6B, 0x2948, 0x6F6C, 0x6F6C, 0x293C, 0x6F6D, 0x6F6D, 0x1190,\n    0x6F6E, 0x6F6E, 0x1193, 0x6F6F, 0x6F6F, 0x119B, 0x6F70, 0x6F70, 0x1196,\n    0x6F72, 0x6F72, 0x293F, 0x6F73, 0x6F73, 0x26FF, 0x6F74, 0x6F74, 0x4243,\n    0x6F76, 0x6F76, 0x293B, 0x6F77, 0x6F77, 0x2952, 0x6F78, 0x6F78, 0x1192,\n    0x6F79, 0x6F79, 0x3BBE, 0x6F7A, 0x6F7A, 0x1195, 0x6F7B, 0x6F7B, 0x2954,\n    0x6F7C, 0x6F7C, 0x118A, 0x6F7D, 0x6F7D, 0x2949, 0x6F7E, 0x6F7E, 0x292F,\n    0x6F7F, 0x6F7F, 0x294F, 0x6F80, 0x6F80, 0x13FC, 0x6F81, 0x6F81, 0x4687,\n    0x6F82, 0x6F82, 0x293D, 0x6F84, 0x6F84, 0x118B, 0x6F85, 0x6F85, 0x2938,\n    0x6F86, 0x6F86, 0x118F, 0x6F87, 0x6F87, 0x2930, 0x6F88, 0x6F88, 0x101A,\n    0x6F89, 0x6F89, 0x2934, 0x6F8A, 0x6F8A, 0x4195, 0x6F8B, 0x6F8B, 0x294D,\n    0x6F8C, 0x6F8C, 0x2935, 0x6F8D, 0x6F8D, 0x2933, 0x6F8E, 0x6F8E, 0x1194,\n    0x6F90, 0x6F90, 0x294B, 0x6F92, 0x6F92, 0x2932, 0x6F93, 0x6F93, 0x2944,\n    0x6F94, 0x6F94, 0x2943, 0x6F95, 0x6F95, 0x2950, 0x6F96, 0x6F96, 0x293A,\n    0x6F97, 0x6F97, 0x1198, 0x6F9D, 0x6F9D, 0x4239, 0x6F9E, 0x6F9E, 0x2B9D,\n    0x6F9F, 0x6F9F, 0x4246, 0x6FA0, 0x6FA0, 0x12EB, 0x6FA1, 0x6FA1, 0x12E1,\n    0x6FA2, 0x6FA2, 0x2BA9, 0x6FA3, 0x6FA3, 0x2B95, 0x6FA4, 0x6FA4, 0x12E3,\n    0x6FA5, 0x6FA5, 0x2BA1, 0x6FA6, 0x6FA6, 0x12EA, 0x6FA7, 0x6FA7, 0x12E5,\n    0x6FA8, 0x6FA8, 0x2B9F, 0x6FA9, 0x6FA9, 0x2D8E, 0x6FAA, 0x6FAA, 0x2BA5,\n    0x6FAB, 0x6FAB, 0x2BAB, 0x6FAC, 0x6FAC, 0x2BA4, 0x6FAD, 0x6FAD, 0x2B93,\n    0x6FAE, 0x6FAE, 0x2BA2, 0x6FAF, 0x6FAF, 0x2BAD, 0x6FB0, 0x6FB0, 0x2BAF,\n    0x6FB1, 0x6FB1, 0x12E0, 0x6FB2, 0x6FB2, 0x2BAE, 0x6FB3, 0x6FB3, 0x12E6,\n    0x6FB4, 0x6FB4, 0x12EC, 0x6FB5, 0x6FB5, 0x3E27, 0x6FB6, 0x6FB6, 0x12E9,\n    0x6FB8, 0x6FB8, 0x2BA8, 0x6FB9, 0x6FB9, 0x12E8, 0x6FBA, 0x6FBA, 0x2BA3,\n    0x6FBB, 0x6FBB, 0x3BBB, 0x6FBC, 0x6FBC, 0x2B97, 0x6FBD, 0x6FBD, 0x2B9C,\n    0x6FBE, 0x6FBE, 0x4688, 0x6FBF, 0x6FBF, 0x2BA7, 0x6FC0, 0x6FC0, 0x12E7,\n    0x6FC1, 0x6FC1, 0x12E4, 0x6FC2, 0x6FC2, 0x12DF, 0x6FC3, 0x6FC3, 0x12E2,\n    0x6FC4, 0x6FC4, 0x2B9B, 0x6FC6, 0x6FC6, 0x2931, 0x6FC7, 0x6FC7, 0x2B96,\n    0x6FC8, 0x6FC8, 0x2B99, 0x6FC9, 0x6FC9, 0x2BAA, 0x6FCA, 0x6FCA, 0x2B9E,\n    0x6FCB, 0x6FCB, 0x2B94, 0x6FCC, 0x6FCC, 0x2D8D, 0x6FCD, 0x6FCD, 0x2BAC,\n    0x6FCE, 0x6FCE, 0x2B98, 0x6FCF, 0x6FCF, 0x2BA6, 0x6FD3, 0x6FD3, 0x4248,\n    0x6FD4, 0x6FD4, 0x2D90, 0x6FD5, 0x6FD5, 0x1400, 0x6FD8, 0x6FD8, 0x13F4,\n    0x6FD9, 0x6FD9, 0x3C74, 0x6FDA, 0x6FDA, 0x3C73, 0x6FDB, 0x6FDB, 0x13F8,\n    0x6FDC, 0x6FDC, 0x2D92, 0x6FDD, 0x6FDD, 0x2D98, 0x6FDE, 0x6FDE, 0x2D96,\n    0x6FDF, 0x6FE0, 0x13F6, 0x6FE1, 0x6FE1, 0x13FE, 0x6FE2, 0x6FE2, 0x2D99,\n    0x6FE3, 0x6FE3, 0x2D91, 0x6FE4, 0x6FE4, 0x13F9, 0x6FE6, 0x6FE6, 0x2D95,\n    0x6FE7, 0x6FE7, 0x2D94, 0x6FE8, 0x6FE8, 0x2D9A, 0x6FE9, 0x6FE9, 0x13FF,\n    0x6FEB, 0x6FEB, 0x13FA, 0x6FEC, 0x6FEC, 0x13FD, 0x6FED, 0x6FED, 0x2D93,\n    0x6FEE, 0x6FEE, 0x1401, 0x6FEF, 0x6FEF, 0x13FB, 0x6FF0, 0x6FF0, 0x1402,\n    0x6FF1, 0x6FF1, 0x13F5, 0x6FF2, 0x6FF2, 0x2D97, 0x6FF4, 0x6FF4, 0x2D8F,\n    0x6FF6, 0x6FF6, 0x38A5, 0x6FF7, 0x6FF7, 0x2F4E, 0x6FF8, 0x6FF8, 0x4237,\n    0x6FFA, 0x6FFA, 0x14EB, 0x6FFB, 0x6FFB, 0x2F4B, 0x6FFC, 0x6FFC, 0x2F4D,\n    0x6FFE, 0x6FFE, 0x14E9, 0x6FFF, 0x6FFF, 0x2F49, 0x7000, 0x7000, 0x2F4A,\n    0x7001, 0x7001, 0x2F45, 0x7003, 0x7003, 0x46E2, 0x7004, 0x7004, 0x2BA0,\n    0x7005, 0x7005, 0x2F46, 0x7006, 0x7006, 0x14EA, 0x7007, 0x7007, 0x2F42,\n    0x7009, 0x7009, 0x14E7, 0x700A, 0x700A, 0x2F4F, 0x700B, 0x700B, 0x14E8,\n    0x700C, 0x700D, 0x2F43, 0x700E, 0x700E, 0x2F48, 0x700F, 0x700F, 0x14ED,\n    0x7011, 0x7011, 0x14EC, 0x7014, 0x7014, 0x2F47, 0x7015, 0x7015, 0x158F,\n    0x7016, 0x7016, 0x30AD, 0x7017, 0x7017, 0x30B3, 0x7018, 0x7018, 0x1590,\n    0x7019, 0x7019, 0x30AA, 0x701A, 0x701A, 0x158D, 0x701B, 0x701B, 0x158A,\n    0x701C, 0x701C, 0x30B5, 0x701D, 0x701D, 0x158E, 0x701E, 0x701E, 0x3C76,\n    0x701F, 0x701F, 0x158B, 0x7020, 0x7020, 0x30AC, 0x7021, 0x7023, 0x30AF,\n    0x7024, 0x7024, 0x30B4, 0x7026, 0x7026, 0x2F4C, 0x7027, 0x7027, 0x30AB,\n    0x7028, 0x7028, 0x158C, 0x7029, 0x7029, 0x30B2, 0x702A, 0x702A, 0x31EF,\n    0x702B, 0x702B, 0x30AE, 0x702C, 0x702C, 0x468E, 0x702F, 0x702F, 0x31E6,\n    0x7030, 0x7030, 0x161D, 0x7031, 0x7031, 0x31E9, 0x7032, 0x7032, 0x161E,\n    0x7033, 0x7033, 0x31F2, 0x7034, 0x7034, 0x31E8, 0x7035, 0x7035, 0x31E5,\n    0x7037, 0x7037, 0x31E7, 0x7038, 0x7038, 0x31EB, 0x7039, 0x7039, 0x31EE,\n    0x703A, 0x703A, 0x31ED, 0x703B, 0x703B, 0x31F1, 0x703C, 0x703C, 0x31E4,\n    0x703E, 0x703E, 0x161C, 0x703F, 0x703F, 0x31EC, 0x7040, 0x7040, 0x31F0,\n    0x7041, 0x7041, 0x31F3, 0x7042, 0x7042, 0x31EA, 0x7043, 0x7044, 0x32D8,\n    0x7045, 0x7046, 0x32DD, 0x7048, 0x7049, 0x32DB, 0x704A, 0x704A, 0x32DA,\n    0x704B, 0x704B, 0x4254, 0x704C, 0x704C, 0x167A, 0x7050, 0x7050, 0x4690,\n    0x7051, 0x7051, 0x16C8, 0x7052, 0x7052, 0x338C, 0x7054, 0x7054, 0x4691,\n    0x7055, 0x7057, 0x3389, 0x7058, 0x7058, 0x16C9, 0x705A, 0x705A, 0x3423,\n    0x705B, 0x705B, 0x3422, 0x705C, 0x705C, 0x3852, 0x705D, 0x705D, 0x348A,\n    0x705E, 0x705E, 0x1722, 0x705F, 0x705F, 0x3488, 0x7060, 0x7060, 0x348B,\n    0x7061, 0x7061, 0x3489, 0x7062, 0x7062, 0x34D0, 0x7063, 0x7063, 0x1744,\n    0x7064, 0x7064, 0x1752, 0x7065, 0x7065, 0x351C, 0x7066, 0x7066, 0x3506,\n    0x7067, 0x7067, 0x3CF5, 0x7068, 0x7068, 0x351B, 0x7069, 0x706A, 0x3547,\n    0x706B, 0x706B, 0x02E6, 0x706C, 0x706C, 0x44F1, 0x706F, 0x706F, 0x4692,\n    0x7070, 0x7070, 0x03F2, 0x7071, 0x7071, 0x180A, 0x7074, 0x7074, 0x18C3,\n    0x7075, 0x7075, 0x38C7, 0x7076, 0x7076, 0x04E6, 0x7078, 0x7078, 0x04E9,\n    0x7079, 0x7079, 0x4099, 0x707A, 0x707A, 0x18C4, 0x707C, 0x707D, 0x04E7,\n    0x707E, 0x707E, 0x4255, 0x707F, 0x707F, 0x4693, 0x7081, 0x7081, 0x4959,\n    0x7082, 0x7082, 0x19F7, 0x7083, 0x7083, 0x19F9, 0x7084, 0x7084, 0x19F4,\n    0x7085, 0x7085, 0x19F1, 0x7086, 0x7086, 0x19F3, 0x7089, 0x7089, 0x43F9,\n    0x708A, 0x708A, 0x0643, 0x708B, 0x708B, 0x40CB, 0x708E, 0x708E, 0x0641,\n    0x708F, 0x708F, 0x46B3, 0x7091, 0x7091, 0x19F5, 0x7092, 0x7092, 0x0642,\n    0x7093, 0x7093, 0x19F2, 0x7094, 0x7094, 0x19EF, 0x7095, 0x7095, 0x0640,\n    0x7096, 0x7096, 0x19F6, 0x7098, 0x7098, 0x19F0, 0x7099, 0x7099, 0x0644,\n    0x709A, 0x709A, 0x19F8, 0x709F, 0x709F, 0x1B66, 0x70A0, 0x70A0, 0x4742,\n    0x70A1, 0x70A1, 0x1B6A, 0x70A3, 0x70A3, 0x3972, 0x70A4, 0x70A4, 0x0790,\n    0x70A5, 0x70A5, 0x3CB7, 0x70A6, 0x70A6, 0x3D53, 0x70A7, 0x70A7, 0x4256,\n    0x70A9, 0x70A9, 0x1B6D, 0x70AB, 0x70AB, 0x0788, 0x70AC, 0x70AC, 0x078B,\n    0x70AD, 0x70AD, 0x078D, 0x70AE, 0x70AE, 0x078F, 0x70AF, 0x70AF, 0x078C,\n    0x70B0, 0x70B0, 0x1B69, 0x70B1, 0x70B1, 0x1B68, 0x70B3, 0x70B3, 0x078A,\n    0x70B4, 0x70B5, 0x1B6B, 0x70B7, 0x70B7, 0x1B65, 0x70B8, 0x70B8, 0x078E,\n    0x70B9, 0x70B9, 0x3D69, 0x70BA, 0x70BA, 0x0789, 0x70BB, 0x70BB, 0x4812,\n    0x70BC, 0x70BC, 0x4559, 0x70BD, 0x70BD, 0x4270, 0x70BE, 0x70BE, 0x1B67,\n    0x70C0, 0x70C0, 0x4733, 0x70C4, 0x70C4, 0x3BAA, 0x70C5, 0x70C7, 0x1D27,\n    0x70C8, 0x70C8, 0x0921, 0x70CA, 0x70CA, 0x091D, 0x70CB, 0x70CB, 0x1D1E,\n    0x70CC, 0x70CC, 0x4258, 0x70CD, 0x70CD, 0x1D26, 0x70CE, 0x70CE, 0x1D2B,\n    0x70CF, 0x70CF, 0x0922, 0x70D0, 0x70D0, 0x396D, 0x70D1, 0x70D1, 0x1D1C,\n    0x70D2, 0x70D2, 0x1D22, 0x70D3, 0x70D3, 0x1D1B, 0x70D4, 0x70D4, 0x1D25,\n    0x70D5, 0x70D6, 0x4259, 0x70D7, 0x70D7, 0x1D21, 0x70D8, 0x70D8, 0x091E,\n    0x70D9, 0x70D9, 0x0920, 0x70DA, 0x70DA, 0x1D2A, 0x70DC, 0x70DC, 0x1D1A,\n    0x70DD, 0x70DD, 0x1D1D, 0x70DE, 0x70DE, 0x1D23, 0x70DF, 0x70DF, 0x425B,\n    0x70E0, 0x70E0, 0x1D24, 0x70E1, 0x70E1, 0x1D2C, 0x70E2, 0x70E2, 0x1D20,\n    0x70E4, 0x70E4, 0x091F, 0x70EF, 0x70EF, 0x0B16, 0x70F0, 0x70F0, 0x1F72,\n    0x70F1, 0x70F1, 0x3AC8, 0x70F3, 0x70F3, 0x1F74, 0x70F4, 0x70F4, 0x1F70,\n    0x70F5, 0x70F5, 0x4760, 0x70F6, 0x70F6, 0x1F7C, 0x70F7, 0x70F7, 0x1F6E,\n    0x70F8, 0x70F8, 0x1F7B, 0x70F9, 0x70F9, 0x0B12, 0x70FA, 0x70FA, 0x1F6C,\n    0x70FB, 0x70FB, 0x21F2, 0x70FC, 0x70FC, 0x1F76, 0x70FD, 0x70FD, 0x0B15,\n    0x70FE, 0x70FE, 0x3D0E, 0x70FF, 0x70FF, 0x1F77, 0x7100, 0x7100, 0x1F7A,\n    0x7102, 0x7102, 0x1F7E, 0x7104, 0x7104, 0x1F73, 0x7105, 0x7105, 0x3A23,\n    0x7106, 0x7106, 0x1F78, 0x7109, 0x710A, 0x0B13, 0x710B, 0x710B, 0x1F7D,\n    0x710C, 0x710C, 0x1F71, 0x710D, 0x710D, 0x1F6D, 0x710E, 0x710E, 0x1F7F,\n    0x7110, 0x7110, 0x1F75, 0x7113, 0x7113, 0x1F79, 0x7117, 0x7117, 0x1F6F,\n    0x7119, 0x711A, 0x0CC8, 0x711B, 0x711B, 0x21FC, 0x711C, 0x711C, 0x0CCF,\n    0x711D, 0x711D, 0x3D47, 0x711E, 0x711E, 0x21F0, 0x711F, 0x711F, 0x21F9,\n    0x7120, 0x7120, 0x21EF, 0x7121, 0x7121, 0x0CCC, 0x7122, 0x7122, 0x21F7,\n    0x7123, 0x7123, 0x21F5, 0x7125, 0x7125, 0x21F6, 0x7126, 0x7126, 0x0CCA,\n    0x7128, 0x7128, 0x21FA, 0x7129, 0x7129, 0x3BA9, 0x712B, 0x712B, 0x4261,\n    0x712C, 0x712C, 0x426A, 0x712E, 0x712E, 0x21F3, 0x712F, 0x712F, 0x21F1,\n    0x7130, 0x7130, 0x0CCB, 0x7131, 0x7131, 0x21F4, 0x7132, 0x7132, 0x21F8,\n    0x7133, 0x7133, 0x3D54, 0x7134, 0x7134, 0x3C7E, 0x7135, 0x7135, 0x376D,\n    0x7136, 0x7136, 0x0CCD, 0x713A, 0x713A, 0x21FB, 0x713B, 0x713B, 0x3AC5,\n    0x713E, 0x713E, 0x372E, 0x7140, 0x7140, 0x4398, 0x7141, 0x7141, 0x247B,\n    0x7142, 0x7142, 0x2482, 0x7143, 0x7143, 0x2484, 0x7144, 0x7144, 0x248A,\n    0x7145, 0x7145, 0x4262, 0x7146, 0x7146, 0x0E72, 0x7147, 0x7147, 0x2476,\n    0x7149, 0x7149, 0x0E6A, 0x714A, 0x714A, 0x4264, 0x714B, 0x714B, 0x2485,\n    0x714C, 0x714C, 0x0E6F, 0x714D, 0x714D, 0x248B, 0x714E, 0x714E, 0x0E66,\n    0x714F, 0x714F, 0x4267, 0x7150, 0x7150, 0x2488, 0x7151, 0x7151, 0x4865,\n    0x7152, 0x7152, 0x2478, 0x7153, 0x7153, 0x2489, 0x7154, 0x7154, 0x2477,\n    0x7156, 0x7156, 0x0E74, 0x7158, 0x7158, 0x2483, 0x7159, 0x7159, 0x0E67,\n    0x715A, 0x715A, 0x248C, 0x715C, 0x715C, 0x0E6C, 0x715D, 0x715D, 0x247C,\n    0x715E, 0x715E, 0x0E71, 0x715F, 0x715F, 0x2487, 0x7160, 0x7160, 0x247A,\n    0x7161, 0x7161, 0x2481, 0x7162, 0x7162, 0x247D, 0x7163, 0x7163, 0x2479,\n    0x7164, 0x7164, 0x0E69, 0x7165, 0x7165, 0x0E70, 0x7166, 0x7166, 0x0E6E,\n    0x7167, 0x7167, 0x0E6B, 0x7168, 0x7168, 0x0E73, 0x7169, 0x7169, 0x0E68,\n    0x716A, 0x716A, 0x2480, 0x716B, 0x716B, 0x3CC5, 0x716C, 0x716C, 0x0E6D,\n    0x716E, 0x716E, 0x0CCE, 0x7170, 0x7170, 0x2486, 0x7171, 0x7171, 0x3DC0,\n    0x7172, 0x7172, 0x247E, 0x7173, 0x7173, 0x47E7, 0x7175, 0x7175, 0x3CED,\n    0x7176, 0x7176, 0x4000, 0x7177, 0x7177, 0x3957, 0x7178, 0x7178, 0x247F,\n    0x717A, 0x717A, 0x4924, 0x717B, 0x717B, 0x271E, 0x717C, 0x717C, 0x3835,\n    0x717D, 0x717D, 0x1023, 0x717E, 0x717E, 0x3970, 0x7180, 0x7180, 0x271A,\n    0x7181, 0x7181, 0x2720, 0x7182, 0x7182, 0x271C, 0x7184, 0x7184, 0x1025,\n    0x7185, 0x7185, 0x271B, 0x7186, 0x7186, 0x271F, 0x7187, 0x7187, 0x2717,\n    0x7188, 0x7188, 0x4706, 0x7189, 0x7189, 0x2719, 0x718A, 0x718A, 0x1024,\n    0x718C, 0x718C, 0x39EA, 0x718E, 0x718E, 0x3D3B, 0x718F, 0x718F, 0x271D,\n    0x7190, 0x7190, 0x2718, 0x7192, 0x7192, 0x1026, 0x7194, 0x7194, 0x1021,\n    0x7196, 0x7196, 0x425F, 0x7197, 0x7197, 0x2721, 0x7198, 0x7198, 0x481D,\n    0x7199, 0x7199, 0x1022, 0x719A, 0x719A, 0x295A, 0x719B, 0x719B, 0x2957,\n    0x719C, 0x719C, 0x2963, 0x719D, 0x719D, 0x295D, 0x719E, 0x719E, 0x295F,\n    0x719F, 0x719F, 0x119E, 0x71A0, 0x71A0, 0x2959, 0x71A1, 0x71A1, 0x2961,\n    0x71A2, 0x71A2, 0x48C1, 0x71A3, 0x71A3, 0x3EC8, 0x71A4, 0x71A4, 0x2960,\n    0x71A5, 0x71A5, 0x295E, 0x71A7, 0x71A7, 0x2964, 0x71A8, 0x71A8, 0x11A1,\n    0x71A9, 0x71A9, 0x295B, 0x71AA, 0x71AA, 0x2962, 0x71AC, 0x71AC, 0x119F,\n    0x71AD, 0x71AD, 0x3E1D, 0x71AF, 0x71AF, 0x2956, 0x71B0, 0x71B0, 0x2958,\n    0x71B1, 0x71B1, 0x11A0, 0x71B2, 0x71B2, 0x2955, 0x71B3, 0x71B3, 0x2965,\n    0x71B4, 0x71B4, 0x425E, 0x71B5, 0x71B5, 0x295C, 0x71B7, 0x71B7, 0x468B,\n    0x71B8, 0x71B8, 0x2BB3, 0x71B9, 0x71B9, 0x12F3, 0x71BA, 0x71BA, 0x426E,\n    0x71BC, 0x71BC, 0x2BBE, 0x71BD, 0x71BD, 0x2BBC, 0x71BE, 0x71BE, 0x12ED,\n    0x71BF, 0x71BF, 0x2BB2, 0x71C0, 0x71C1, 0x2BB5, 0x71C2, 0x71C2, 0x2BB1,\n    0x71C3, 0x71C4, 0x12F7, 0x71C5, 0x71C5, 0x2BB0, 0x71C6, 0x71C6, 0x2BBF,\n    0x71C7, 0x71C7, 0x2BBA, 0x71C8, 0x71C8, 0x12F1, 0x71C9, 0x71C9, 0x12EE,\n    0x71CA, 0x71CA, 0x2BB9, 0x71CB, 0x71CB, 0x2BB7, 0x71CE, 0x71CE, 0x12F4,\n    0x71CF, 0x71CF, 0x2BBB, 0x71D0, 0x71D0, 0x12EF, 0x71D1, 0x71D1, 0x373D,\n    0x71D2, 0x71D2, 0x12F0, 0x71D4, 0x71D4, 0x2BB8, 0x71D5, 0x71D5, 0x12F2,\n    0x71D6, 0x71D6, 0x2BB4, 0x71D8, 0x71D8, 0x2BBD, 0x71D9, 0x71D9, 0x12F5,\n    0x71DA, 0x71DB, 0x2BC0, 0x71DC, 0x71DC, 0x12F6, 0x71DD, 0x71DD, 0x4078,\n    0x71DF, 0x71DF, 0x1404, 0x71E0, 0x71E0, 0x140B, 0x71E1, 0x71E1, 0x2D9B,\n    0x71E2, 0x71E2, 0x2DA1, 0x71E4, 0x71E4, 0x2D9F, 0x71E5, 0x71E5, 0x1407,\n    0x71E6, 0x71E6, 0x1406, 0x71E7, 0x71E7, 0x1403, 0x71E8, 0x71E8, 0x2D9D,\n    0x71EB, 0x71EB, 0x3C81, 0x71EC, 0x71EC, 0x1409, 0x71ED, 0x71ED, 0x1408,\n    0x71EE, 0x71EE, 0x1405, 0x71F0, 0x71F0, 0x2DA0, 0x71F1, 0x71F1, 0x2D9C,\n    0x71F2, 0x71F2, 0x2D9E, 0x71F4, 0x71F4, 0x140A, 0x71F5, 0x71F5, 0x46EE,\n    0x71F6, 0x71F6, 0x3E9A, 0x71F8, 0x71F8, 0x14F1, 0x71F9, 0x71F9, 0x2F52,\n    0x71FB, 0x71FC, 0x14EE, 0x71FD, 0x71FD, 0x2F54, 0x71FE, 0x71FE, 0x14F0,\n    0x71FF, 0x71FF, 0x2F51, 0x7201, 0x7201, 0x2F50, 0x7202, 0x7202, 0x30B9,\n    0x7203, 0x7203, 0x2F53, 0x7205, 0x7205, 0x30BA, 0x7206, 0x7206, 0x1591,\n    0x7207, 0x7207, 0x30B8, 0x7209, 0x7209, 0x3DBB, 0x720A, 0x720A, 0x30B7,\n    0x720C, 0x720C, 0x30B6, 0x720D, 0x720D, 0x1592, 0x720E, 0x720E, 0x4271,\n    0x720F, 0x720F, 0x39FC, 0x7210, 0x7210, 0x161F, 0x7213, 0x7214, 0x31F4,\n    0x7215, 0x7215, 0x4273, 0x7216, 0x7216, 0x3953, 0x7217, 0x7217, 0x3969,\n    0x7219, 0x7219, 0x32E1, 0x721A, 0x721A, 0x32E0, 0x721B, 0x721B, 0x167B,\n    0x721D, 0x721D, 0x32DF, 0x721E, 0x721F, 0x338D, 0x7222, 0x7222, 0x3424,\n    0x7223, 0x7223, 0x348C, 0x7224, 0x7224, 0x4276, 0x7226, 0x7226, 0x34D1,\n    0x7227, 0x7227, 0x3535, 0x7228, 0x7228, 0x1766, 0x7229, 0x7229, 0x3549,\n    0x722A, 0x722A, 0x02E7, 0x722B, 0x722B, 0x44F2, 0x722C, 0x722D, 0x0645,\n    0x722E, 0x722E, 0x4279, 0x7230, 0x7230, 0x0791, 0x7235, 0x7235, 0x140C,\n    0x7236, 0x7236, 0x02E8, 0x7238, 0x7238, 0x0647, 0x7239, 0x7239, 0x0923,\n    0x723A, 0x723A, 0x0E75, 0x723B, 0x723B, 0x02E9, 0x723D, 0x723D, 0x0B17,\n    0x723E, 0x723E, 0x1027, 0x723F, 0x723F, 0x178D, 0x7240, 0x7240, 0x427A,\n    0x7241, 0x7241, 0x1B6E, 0x7242, 0x7242, 0x1D2D, 0x7244, 0x7244, 0x2722,\n    0x7246, 0x7246, 0x140D, 0x7247, 0x7247, 0x02EA, 0x7248, 0x7248, 0x0648,\n    0x7249, 0x724A, 0x1B6F, 0x724B, 0x724B, 0x21FD, 0x724C, 0x724C, 0x0CD0,\n    0x724F, 0x724F, 0x248D, 0x7250, 0x7250, 0x3AC9, 0x7252, 0x7252, 0x0E76,\n    0x7253, 0x7253, 0x2723, 0x7255, 0x7255, 0x427D, 0x7256, 0x7256, 0x11A2,\n    0x7257, 0x7257, 0x427E, 0x7258, 0x7258, 0x1593, 0x7259, 0x7259, 0x02EB,\n    0x725A, 0x725A, 0x21FE, 0x725B, 0x725B, 0x02EC, 0x725C, 0x725C, 0x465A,\n    0x725D, 0x725D, 0x03F4, 0x725E, 0x725E, 0x180B, 0x725F, 0x725F, 0x03F3,\n    0x7260, 0x7260, 0x04EC, 0x7261, 0x7261, 0x04EB, 0x7262, 0x7262, 0x04EA,\n    0x7263, 0x7263, 0x18C5, 0x7266, 0x7266, 0x3EBB, 0x7267, 0x7267, 0x0649,\n    0x7269, 0x7269, 0x064A, 0x726A, 0x726A, 0x19FA, 0x726C, 0x726C, 0x1B71,\n    0x726E, 0x726E, 0x1B74, 0x726F, 0x726F, 0x0793, 0x7270, 0x7270, 0x1B72,\n    0x7272, 0x7272, 0x0792, 0x7273, 0x7273, 0x1B73, 0x7274, 0x7274, 0x0794,\n    0x7276, 0x7276, 0x1D30, 0x7277, 0x7277, 0x1D2F, 0x7278, 0x7278, 0x1D2E,\n    0x7279, 0x7279, 0x0924, 0x727B, 0x727C, 0x1F81, 0x727D, 0x727D, 0x0B18,\n    0x727E, 0x727E, 0x1F80, 0x727F, 0x727F, 0x1F83, 0x7280, 0x7280, 0x0CD2,\n    0x7281, 0x7281, 0x0B19, 0x7282, 0x7282, 0x4283, 0x7284, 0x7284, 0x0CD1,\n    0x7285, 0x7285, 0x2202, 0x7286, 0x7286, 0x2201, 0x7287, 0x7287, 0x3ACA,\n    0x7288, 0x7289, 0x21FF, 0x728B, 0x728B, 0x2203, 0x728C, 0x728C, 0x248F,\n    0x728D, 0x728D, 0x248E, 0x728E, 0x728E, 0x2492, 0x728F, 0x728F, 0x43C9,\n    0x7290, 0x7290, 0x2491, 0x7291, 0x7291, 0x2490, 0x7292, 0x7292, 0x1028,\n    0x7293, 0x7293, 0x2726, 0x7294, 0x7294, 0x3ACB, 0x7295, 0x7295, 0x2725,\n    0x7296, 0x7296, 0x1029, 0x7297, 0x7297, 0x2724, 0x7298, 0x7298, 0x2966,\n    0x729A, 0x729A, 0x2967, 0x729B, 0x729B, 0x11A3, 0x729D, 0x729E, 0x2BC2,\n    0x729F, 0x729F, 0x473A, 0x72A1, 0x72A1, 0x30BF, 0x72A2, 0x72A2, 0x1594,\n    0x72A3, 0x72A3, 0x30BE, 0x72A4, 0x72A4, 0x30BD, 0x72A5, 0x72A6, 0x30BB,\n    0x72A7, 0x72A7, 0x167C, 0x72A8, 0x72A8, 0x31F6, 0x72A9, 0x72A9, 0x338F,\n    0x72AA, 0x72AA, 0x34D2, 0x72AC, 0x72AC, 0x02ED, 0x72AD, 0x72AD, 0x44F4,\n    0x72AE, 0x72AE, 0x17AF, 0x72AF, 0x72AF, 0x0355, 0x72B0, 0x72B0, 0x17B0,\n    0x72B2, 0x72B2, 0x3FB6, 0x72B4, 0x72B5, 0x180C, 0x72BA, 0x72BA, 0x18CB,\n    0x72BD, 0x72BD, 0x18C7, 0x72BF, 0x72BF, 0x18C6, 0x72C0, 0x72C0, 0x064B,\n    0x72C1, 0x72C1, 0x18CA, 0x72C2, 0x72C2, 0x04EE, 0x72C3, 0x72C3, 0x18C8,\n    0x72C4, 0x72C4, 0x04ED, 0x72C5, 0x72C5, 0x18CC, 0x72C6, 0x72C6, 0x18C9,\n    0x72C9, 0x72C9, 0x19FE, 0x72CA, 0x72CA, 0x1B75, 0x72CB, 0x72CB, 0x19FC,\n    0x72CC, 0x72CC, 0x1A03, 0x72CD, 0x72CD, 0x43CA, 0x72CE, 0x72CE, 0x064C,\n    0x72D0, 0x72D0, 0x064F, 0x72D1, 0x72D1, 0x1A04, 0x72D2, 0x72D2, 0x1A00,\n    0x72D4, 0x72D4, 0x1A01, 0x72D6, 0x72D6, 0x19FB, 0x72D7, 0x72D7, 0x064E,\n    0x72D8, 0x72D8, 0x19FD, 0x72D9, 0x72D9, 0x064D, 0x72DA, 0x72DA, 0x1A02,\n    0x72DC, 0x72DC, 0x19FF, 0x72DF, 0x72DF, 0x1B79, 0x72E0, 0x72E1, 0x0796,\n    0x72E2, 0x72E2, 0x3F97, 0x72E3, 0x72E3, 0x1B7C, 0x72E4, 0x72E4, 0x1B76,\n    0x72E6, 0x72E6, 0x1B7B, 0x72E8, 0x72E8, 0x1B77, 0x72E9, 0x72E9, 0x0795,\n    0x72EA, 0x72EA, 0x1B7A, 0x72EB, 0x72EB, 0x1B78, 0x72F3, 0x72F3, 0x1D36,\n    0x72F4, 0x72F4, 0x1D33, 0x72F6, 0x72F6, 0x1D35, 0x72F7, 0x72F7, 0x0929,\n    0x72F8, 0x72F8, 0x0928, 0x72F9, 0x72F9, 0x0926, 0x72FA, 0x72FA, 0x1D32,\n    0x72FB, 0x72FB, 0x1D37, 0x72FC, 0x72FC, 0x0925, 0x72FD, 0x72FD, 0x0927,\n    0x72FE, 0x72FE, 0x1D34, 0x72FF, 0x72FF, 0x1F8B, 0x7300, 0x7300, 0x1D31,\n    0x7301, 0x7301, 0x1D38, 0x7302, 0x7302, 0x3F9A, 0x7304, 0x7304, 0x3EB5,\n    0x7307, 0x7307, 0x1F86, 0x7308, 0x7308, 0x1F8A, 0x730A, 0x730A, 0x1F89,\n    0x730B, 0x730B, 0x2205, 0x730C, 0x730C, 0x2210, 0x730F, 0x730F, 0x1F8C,\n    0x7310, 0x7310, 0x46EA, 0x7311, 0x7311, 0x1F87, 0x7312, 0x7312, 0x2204,\n    0x7313, 0x7313, 0x0B1D, 0x7316, 0x7316, 0x0B1C, 0x7317, 0x7317, 0x1F85,\n    0x7318, 0x7318, 0x1F88, 0x7319, 0x7319, 0x0B1E, 0x731B, 0x731B, 0x0B1B,\n    0x731C, 0x731C, 0x0B1A, 0x731D, 0x731D, 0x1F84, 0x731E, 0x731E, 0x1F8D,\n    0x7322, 0x7322, 0x2207, 0x7323, 0x7323, 0x220E, 0x7325, 0x7325, 0x0CD4,\n    0x7326, 0x7326, 0x220D, 0x7327, 0x7327, 0x220A, 0x7328, 0x7328, 0x428A,\n    0x7329, 0x7329, 0x0CD6, 0x732A, 0x732A, 0x3D70, 0x732B, 0x732B, 0x4285,\n    0x732C, 0x732C, 0x3FB2, 0x732D, 0x732D, 0x220C, 0x732E, 0x732E, 0x428B,\n    0x7330, 0x7330, 0x2206, 0x7331, 0x7331, 0x2208, 0x7332, 0x7332, 0x220B,\n    0x7333, 0x7333, 0x2209, 0x7334, 0x7334, 0x0CD5, 0x7335, 0x7335, 0x220F,\n    0x7336, 0x7336, 0x0CD3, 0x7337, 0x7337, 0x0E77, 0x7338, 0x7338, 0x46EB,\n    0x7339, 0x7339, 0x43CC, 0x733A, 0x733A, 0x2496, 0x733B, 0x733B, 0x2495,\n    0x733C, 0x733C, 0x2493, 0x733E, 0x733E, 0x0E7A, 0x733F, 0x733F, 0x0E79,\n    0x7340, 0x7340, 0x2497, 0x7341, 0x7341, 0x46EC, 0x7342, 0x7342, 0x2494,\n    0x7343, 0x7343, 0x2727, 0x7344, 0x7344, 0x102A, 0x7345, 0x7345, 0x0E78,\n    0x7348, 0x7348, 0x43FA, 0x7349, 0x7349, 0x2499, 0x734A, 0x734A, 0x2498,\n    0x734C, 0x734C, 0x272A, 0x734D, 0x734D, 0x2728, 0x734E, 0x734E, 0x11A4,\n    0x734F, 0x734F, 0x3F51, 0x7350, 0x7350, 0x102B, 0x7351, 0x7351, 0x2729,\n    0x7352, 0x7352, 0x2969, 0x7357, 0x7357, 0x11A5, 0x7358, 0x7358, 0x2968,\n    0x7359, 0x7359, 0x2971, 0x735A, 0x735A, 0x2970, 0x735B, 0x735B, 0x296E,\n    0x735D, 0x735D, 0x296D, 0x735E, 0x7360, 0x296A, 0x7361, 0x7361, 0x296F,\n    0x7362, 0x7362, 0x2972, 0x7365, 0x7365, 0x2BC8, 0x7366, 0x7367, 0x2BC5,\n    0x7368, 0x7368, 0x12F9, 0x7369, 0x7369, 0x2BC4, 0x736A, 0x736A, 0x2BCA,\n    0x736B, 0x736B, 0x2BC9, 0x736C, 0x736C, 0x2BC7, 0x736E, 0x736F, 0x2DA3,\n    0x7370, 0x7370, 0x140E, 0x7371, 0x7371, 0x3F98, 0x7372, 0x7372, 0x140F,\n    0x7373, 0x7373, 0x2DA2, 0x7374, 0x7374, 0x3ED4, 0x7375, 0x7375, 0x14F3,\n    0x7376, 0x7376, 0x2F55, 0x7377, 0x7377, 0x14F2, 0x7378, 0x7378, 0x1595,\n    0x737A, 0x737A, 0x1596, 0x737B, 0x737B, 0x1620, 0x737C, 0x737C, 0x31F8,\n    0x737D, 0x737D, 0x31F7, 0x737E, 0x737E, 0x32E2, 0x737F, 0x737F, 0x3390,\n    0x7380, 0x7380, 0x16CA, 0x7381, 0x7381, 0x3426, 0x7382, 0x7382, 0x3425,\n    0x7383, 0x7383, 0x3427, 0x7384, 0x7384, 0x0356, 0x7385, 0x7385, 0x1B7D,\n    0x7386, 0x7386, 0x092A, 0x7387, 0x7387, 0x0B1F, 0x7388, 0x7388, 0x1F8E,\n    0x7389, 0x7389, 0x0357, 0x738A, 0x738A, 0x17B1, 0x738B, 0x738B, 0x02EE,\n    0x738E, 0x738E, 0x180E, 0x738F, 0x738F, 0x46E5, 0x7392, 0x7392, 0x18D1,\n    0x7393, 0x7394, 0x18CF, 0x7395, 0x7395, 0x18CD, 0x7396, 0x7396, 0x04EF,\n    0x7397, 0x7397, 0x18CE, 0x7398, 0x7398, 0x39F6, 0x739C, 0x739C, 0x408A,\n    0x739D, 0x739D, 0x1A0C, 0x739E, 0x739E, 0x395B, 0x739F, 0x739F, 0x0652,\n    0x73A0, 0x73A0, 0x1A0A, 0x73A1, 0x73A1, 0x1A06, 0x73A2, 0x73A2, 0x1A09,\n    0x73A4, 0x73A4, 0x1A05, 0x73A5, 0x73A5, 0x0654, 0x73A6, 0x73A6, 0x1A08,\n    0x73A7, 0x73A7, 0x4087, 0x73A8, 0x73A8, 0x0651, 0x73A9, 0x73A9, 0x0650,\n    0x73AA, 0x73AA, 0x428D, 0x73AB, 0x73AB, 0x0653, 0x73AC, 0x73AC, 0x1A0B,\n    0x73AD, 0x73AD, 0x1A07, 0x73B2, 0x73B2, 0x079B, 0x73B3, 0x73B3, 0x079E,\n    0x73B4, 0x73B4, 0x1B85, 0x73B5, 0x73B5, 0x1B84, 0x73B6, 0x73B6, 0x1B83,\n    0x73B7, 0x73B7, 0x0798, 0x73B8, 0x73B8, 0x1B8C, 0x73B9, 0x73B9, 0x1B82,\n    0x73BB, 0x73BB, 0x079A, 0x73BC, 0x73BC, 0x1D3D, 0x73BE, 0x73BE, 0x1B89,\n    0x73BF, 0x73BF, 0x1B87, 0x73C0, 0x73C0, 0x079D, 0x73C2, 0x73C2, 0x1B7F,\n    0x73C3, 0x73C3, 0x1B8A, 0x73C5, 0x73C5, 0x1B81, 0x73C6, 0x73C6, 0x1B8B,\n    0x73C7, 0x73C7, 0x1B88, 0x73C8, 0x73C8, 0x1B80, 0x73C9, 0x73C9, 0x4290,\n    0x73CA, 0x73CA, 0x0799, 0x73CB, 0x73CB, 0x1B8D, 0x73CC, 0x73CC, 0x1B7E,\n    0x73CD, 0x73CD, 0x079C, 0x73CE, 0x73CE, 0x411B, 0x73CF, 0x73CF, 0x428C,\n    0x73D0, 0x73D0, 0x3B17, 0x73D2, 0x73D2, 0x1D42, 0x73D3, 0x73D3, 0x1D39,\n    0x73D4, 0x73D4, 0x1D44, 0x73D5, 0x73D5, 0x4073, 0x73D6, 0x73D6, 0x1D3C,\n    0x73D7, 0x73D8, 0x1D47, 0x73D9, 0x73D9, 0x1D3A, 0x73DA, 0x73DA, 0x1D46,\n    0x73DB, 0x73DB, 0x1D43, 0x73DC, 0x73DC, 0x1D41, 0x73DD, 0x73DD, 0x1D45,\n    0x73DE, 0x73DE, 0x0930, 0x73E0, 0x73E0, 0x092E, 0x73E1, 0x73E1, 0x46F0,\n    0x73E2, 0x73E2, 0x3CA3, 0x73E3, 0x73E3, 0x1D3F, 0x73E4, 0x73E4, 0x42A5,\n    0x73E5, 0x73E5, 0x1D3B, 0x73E6, 0x73E6, 0x3CBA, 0x73E7, 0x73E7, 0x1D3E,\n    0x73E8, 0x73E8, 0x1D49, 0x73E9, 0x73E9, 0x1D40, 0x73EA, 0x73EA, 0x092F,\n    0x73EB, 0x73EB, 0x1B86, 0x73ED, 0x73ED, 0x092B, 0x73EE, 0x73EE, 0x092D,\n    0x73EF, 0x73EF, 0x4011, 0x73F3, 0x73F3, 0x3CAB, 0x73F4, 0x73F4, 0x1F9C,\n    0x73F5, 0x73F5, 0x1F91, 0x73F6, 0x73F6, 0x1F8F, 0x73F7, 0x73F7, 0x429A,\n    0x73F8, 0x73F8, 0x1F90, 0x73F9, 0x73F9, 0x3BF9, 0x73FA, 0x73FA, 0x1F97,\n    0x73FB, 0x73FB, 0x3CAC, 0x73FC, 0x73FC, 0x1F98, 0x73FD, 0x73FD, 0x1F94,\n    0x73FE, 0x73FE, 0x0B24, 0x73FF, 0x73FF, 0x1F99, 0x7400, 0x7400, 0x1F96,\n    0x7401, 0x7401, 0x1F93, 0x7403, 0x7403, 0x0B22, 0x7404, 0x7404, 0x1F92,\n    0x7405, 0x7405, 0x0B20, 0x7406, 0x7406, 0x0B23, 0x7407, 0x7407, 0x1F95,\n    0x7408, 0x7408, 0x1F9D, 0x7409, 0x7409, 0x092C, 0x740A, 0x740A, 0x0B21,\n    0x740B, 0x740B, 0x1F9B, 0x740C, 0x740C, 0x1F9A, 0x740D, 0x740D, 0x0B25,\n    0x7411, 0x7411, 0x456C, 0x7412, 0x7412, 0x3BE6, 0x7414, 0x7414, 0x39F4,\n    0x7415, 0x7415, 0x429B, 0x7416, 0x7416, 0x2215, 0x7417, 0x7417, 0x40AD,\n    0x7419, 0x7419, 0x46F3, 0x741A, 0x741A, 0x2216, 0x741B, 0x741B, 0x0CE0,\n    0x741C, 0x741C, 0x38DD, 0x741D, 0x741D, 0x221C, 0x741E, 0x741F, 0x46F4,\n    0x7420, 0x7420, 0x221E, 0x7421, 0x7421, 0x2217, 0x7422, 0x7422, 0x0CDA,\n    0x7423, 0x7423, 0x221B, 0x7424, 0x7424, 0x221A, 0x7425, 0x7425, 0x0CDB,\n    0x7426, 0x7426, 0x0CE1, 0x7428, 0x7428, 0x0CE2, 0x7429, 0x7429, 0x221D,\n    0x742A, 0x742A, 0x0CD8, 0x742B, 0x742B, 0x2214, 0x742C, 0x742C, 0x2212,\n    0x742D, 0x742D, 0x2218, 0x742E, 0x742E, 0x2211, 0x742F, 0x742F, 0x0CDF,\n    0x7430, 0x7430, 0x2213, 0x7431, 0x7431, 0x2219, 0x7432, 0x7432, 0x221F,\n    0x7433, 0x7433, 0x0CD9, 0x7434, 0x7434, 0x0CDE, 0x7435, 0x7436, 0x0CDC,\n    0x7437, 0x7437, 0x3AE1, 0x7438, 0x7438, 0x3B09, 0x7439, 0x7439, 0x429E,\n    0x743A, 0x743A, 0x0CD7, 0x743C, 0x743C, 0x3ADF, 0x743F, 0x743F, 0x0E81,\n    0x7440, 0x7440, 0x24A0, 0x7441, 0x7441, 0x0E80, 0x7442, 0x7442, 0x24A4,\n    0x7443, 0x7443, 0x3A1A, 0x7444, 0x7444, 0x249A, 0x7445, 0x7445, 0x3BD7,\n    0x7446, 0x7446, 0x24A5, 0x7447, 0x7447, 0x42A4, 0x7448, 0x7448, 0x3CB5,\n    0x7449, 0x7449, 0x4291, 0x744A, 0x744B, 0x249B, 0x744D, 0x744D, 0x24A6,\n    0x744E, 0x744E, 0x24A3, 0x744F, 0x7450, 0x24A1, 0x7451, 0x7451, 0x249E,\n    0x7452, 0x7452, 0x249D, 0x7453, 0x7453, 0x4231, 0x7454, 0x7454, 0x24A7,\n    0x7455, 0x7455, 0x0E7D, 0x7456, 0x7456, 0x39F5, 0x7457, 0x7457, 0x249F,\n    0x7459, 0x7459, 0x0E82, 0x745A, 0x745A, 0x0E7C, 0x745B, 0x745C, 0x0E83,\n    0x745D, 0x745D, 0x42C6, 0x745E, 0x745E, 0x0E7F, 0x745F, 0x745F, 0x0E7E,\n    0x7460, 0x7460, 0x42A2, 0x7462, 0x7462, 0x272B, 0x7463, 0x7463, 0x102D,\n    0x7464, 0x7464, 0x102C, 0x7465, 0x7465, 0x4101, 0x7467, 0x7467, 0x2730,\n    0x7468, 0x7468, 0x3AEE, 0x7469, 0x7469, 0x11A6, 0x746A, 0x746A, 0x102E,\n    0x746B, 0x746B, 0x3BE7, 0x746C, 0x746C, 0x42A8, 0x746D, 0x746D, 0x1030,\n    0x746E, 0x746E, 0x2731, 0x746F, 0x746F, 0x0E7B, 0x7470, 0x7470, 0x102F,\n    0x7471, 0x7471, 0x272D, 0x7472, 0x7472, 0x272F, 0x7473, 0x7473, 0x272C,\n    0x7474, 0x7474, 0x42A9, 0x7475, 0x7475, 0x272E, 0x7476, 0x7476, 0x42A6,\n    0x7479, 0x7479, 0x297C, 0x747A, 0x747A, 0x3AD1, 0x747C, 0x747C, 0x297B,\n    0x747D, 0x747D, 0x2978, 0x747E, 0x747E, 0x11A9, 0x747F, 0x747F, 0x2BCB,\n    0x7480, 0x7480, 0x11AA, 0x7481, 0x7481, 0x2977, 0x7482, 0x7482, 0x42AC,\n    0x7483, 0x7483, 0x11A8, 0x7485, 0x7485, 0x2979, 0x7486, 0x7486, 0x2976,\n    0x7487, 0x7487, 0x2973, 0x7488, 0x7488, 0x297A, 0x7489, 0x748A, 0x2974,\n    0x748B, 0x748B, 0x11A7, 0x748C, 0x748C, 0x3A21, 0x748D, 0x748D, 0x469D,\n    0x7490, 0x7490, 0x2DA8, 0x7492, 0x7492, 0x2BCF, 0x7494, 0x7494, 0x2BCE,\n    0x7495, 0x7495, 0x2BD0, 0x7497, 0x7497, 0x2DA5, 0x7498, 0x7498, 0x12FC,\n    0x7499, 0x7499, 0x39F3, 0x749A, 0x749A, 0x2BCC, 0x749B, 0x749B, 0x3B0A,\n    0x749C, 0x749C, 0x12FA, 0x749E, 0x749E, 0x12FE, 0x749F, 0x749F, 0x12FD,\n    0x74A0, 0x74A0, 0x2BCD, 0x74A1, 0x74A1, 0x2BD1, 0x74A3, 0x74A3, 0x12FB,\n    0x74A4, 0x74A4, 0x4170, 0x74A5, 0x74A5, 0x2DAC, 0x74A6, 0x74A6, 0x1412,\n    0x74A7, 0x74A7, 0x14F4, 0x74A8, 0x74A8, 0x1413, 0x74A9, 0x74A9, 0x1410,\n    0x74AA, 0x74AA, 0x2DA9, 0x74AB, 0x74AB, 0x2DA7, 0x74AD, 0x74AD, 0x2DAA,\n    0x74AF, 0x74AF, 0x2DAD, 0x74B0, 0x74B0, 0x1411, 0x74B1, 0x74B1, 0x2DAB,\n    0x74B2, 0x74B2, 0x2DA6, 0x74B4, 0x74B4, 0x3CA5, 0x74B5, 0x74B5, 0x2F58,\n    0x74B6, 0x74B6, 0x2F5B, 0x74B7, 0x74B7, 0x30C2, 0x74B8, 0x74B8, 0x2F56,\n    0x74BA, 0x74BA, 0x31F9, 0x74BB, 0x74BB, 0x2F5C, 0x74BD, 0x74BD, 0x1597,\n    0x74BE, 0x74BE, 0x2F5A, 0x74BF, 0x74BF, 0x14F5, 0x74C0, 0x74C0, 0x2F57,\n    0x74C1, 0x74C1, 0x2F59, 0x74C2, 0x74C2, 0x2F5D, 0x74C3, 0x74C3, 0x30C3,\n    0x74C5, 0x74C5, 0x30C1, 0x74C8, 0x74C8, 0x42B5, 0x74CA, 0x74CA, 0x1598,\n    0x74CB, 0x74CB, 0x30C0, 0x74CC, 0x74CC, 0x3ADE, 0x74CF, 0x74CF, 0x1621,\n    0x74D0, 0x74D0, 0x3A9B, 0x74D3, 0x74D3, 0x46FA, 0x74D4, 0x74D4, 0x167E,\n    0x74D5, 0x74D5, 0x3392, 0x74D6, 0x74D6, 0x167D, 0x74D7, 0x74D7, 0x3394,\n    0x74D8, 0x74D8, 0x3391, 0x74D9, 0x74D9, 0x3393, 0x74DA, 0x74DA, 0x16FE,\n    0x74DB, 0x74DB, 0x348D, 0x74DC, 0x74DC, 0x0358, 0x74DD, 0x74DD, 0x1A0D,\n    0x74DE, 0x74DF, 0x1D4A, 0x74E0, 0x74E0, 0x0B26, 0x74E1, 0x74E1, 0x24A8,\n    0x74E2, 0x74E2, 0x12FF, 0x74E3, 0x74E3, 0x1599, 0x74E4, 0x74E4, 0x16CB,\n    0x74E5, 0x74E5, 0x348E, 0x74E6, 0x74E6, 0x0359, 0x74E7, 0x74E7, 0x3FFE,\n    0x74E8, 0x74E8, 0x1A0E, 0x74E9, 0x74E9, 0x0120, 0x74EC, 0x74EC, 0x1B8E,\n    0x74EE, 0x74EE, 0x1B8F, 0x74F0, 0x74F0, 0x3FE6, 0x74F1, 0x74F1, 0x3F9B,\n    0x74F2, 0x74F2, 0x3FDF, 0x74F4, 0x74F5, 0x1D4C, 0x74F6, 0x74F7, 0x0B27,\n    0x74F8, 0x74F8, 0x3FF4, 0x74FB, 0x74FB, 0x2220, 0x74FD, 0x74FD, 0x24AB,\n    0x74FE, 0x74FE, 0x24AA, 0x74FF, 0x74FF, 0x24A9, 0x7500, 0x7500, 0x2732,\n    0x7502, 0x7503, 0x2733, 0x7504, 0x7504, 0x1031, 0x7505, 0x7505, 0x3FDE,\n    0x7507, 0x7507, 0x297E, 0x7508, 0x7508, 0x297D, 0x750B, 0x750B, 0x2BD2,\n    0x750C, 0x750D, 0x1300, 0x750E, 0x750E, 0x42B7, 0x750F, 0x750F, 0x2DB1,\n    0x7510, 0x7512, 0x2DAE, 0x7513, 0x7513, 0x2F5F, 0x7514, 0x7514, 0x2F5E,\n    0x7515, 0x7515, 0x14F6, 0x7516, 0x7516, 0x30C4, 0x7517, 0x7517, 0x32E3,\n    0x7518, 0x7518, 0x035A, 0x7519, 0x7519, 0x4583, 0x751A, 0x751A, 0x079F,\n    0x751C, 0x751C, 0x0B29, 0x751D, 0x751D, 0x24AC, 0x751E, 0x751E, 0x42B8,\n    0x751F, 0x751F, 0x035B, 0x7521, 0x7521, 0x1D4E, 0x7522, 0x7522, 0x0B2A,\n    0x7525, 0x7526, 0x0CE3, 0x7528, 0x7529, 0x035C, 0x752A, 0x752A, 0x180F,\n    0x752B, 0x752B, 0x04F1, 0x752C, 0x752C, 0x04F0, 0x752D, 0x752D, 0x07A0,\n    0x752E, 0x752E, 0x1B90, 0x752F, 0x752F, 0x2221, 0x7530, 0x7533, 0x035E,\n    0x7534, 0x7534, 0x3E87, 0x7535, 0x7535, 0x455A, 0x7537, 0x7538, 0x04F2,\n    0x7539, 0x7539, 0x18D3, 0x753A, 0x753A, 0x18D2, 0x753B, 0x753B, 0x3DFB,\n    0x753D, 0x753D, 0x0655, 0x753E, 0x753E, 0x1A11, 0x753F, 0x7540, 0x1A0F,\n    0x7542, 0x7542, 0x43CD, 0x7546, 0x7546, 0x3F40, 0x7547, 0x7548, 0x1B91,\n    0x754A, 0x754A, 0x42BF, 0x754B, 0x754B, 0x07A4, 0x754C, 0x754C, 0x07A2,\n    0x754D, 0x754D, 0x42BE, 0x754E, 0x754E, 0x07A3, 0x754F, 0x754F, 0x07A1,\n    0x7551, 0x7551, 0x3CFE, 0x7553, 0x7553, 0x3FEB, 0x7554, 0x7554, 0x0931,\n    0x7555, 0x7555, 0x3AEA, 0x7559, 0x7559, 0x0935, 0x755A, 0x755A, 0x0934,\n    0x755B, 0x755B, 0x1D4F, 0x755C, 0x755C, 0x0933, 0x755D, 0x755D, 0x0932,\n    0x755F, 0x755F, 0x1D50, 0x7560, 0x7560, 0x3D71, 0x7562, 0x7562, 0x0B2D,\n    0x7563, 0x7563, 0x1F9F, 0x7564, 0x7564, 0x1F9E, 0x7565, 0x7566, 0x0B2B,\n    0x7567, 0x7567, 0x42C0, 0x756A, 0x756A, 0x0CE6, 0x756B, 0x756B, 0x0CE5,\n    0x756C, 0x756C, 0x2223, 0x756D, 0x756D, 0x46FD, 0x756E, 0x756E, 0x42C1,\n    0x756F, 0x756F, 0x2222, 0x7570, 0x7570, 0x0B2E, 0x7572, 0x7572, 0x46FE,\n    0x7576, 0x7576, 0x0E85, 0x7577, 0x7577, 0x24AE, 0x7578, 0x7578, 0x0E86,\n    0x7579, 0x7579, 0x24AD, 0x757A, 0x757A, 0x3F4F, 0x757D, 0x757D, 0x2735,\n    0x757E, 0x757E, 0x297F, 0x757F, 0x757F, 0x11AB, 0x7580, 0x7580, 0x2BD3,\n    0x7583, 0x7583, 0x3AE5, 0x7584, 0x7584, 0x2DB2, 0x7586, 0x7586, 0x159B,\n    0x7587, 0x7587, 0x159A, 0x758A, 0x758A, 0x16CC, 0x758B, 0x758B, 0x0362,\n    0x758C, 0x758C, 0x1A12, 0x758D, 0x758D, 0x46FF, 0x758E, 0x758E, 0x42C5,\n    0x758F, 0x758F, 0x0B2F, 0x7590, 0x7590, 0x2736, 0x7591, 0x7591, 0x1032,\n    0x7592, 0x7592, 0x022E, 0x7594, 0x7595, 0x18D4, 0x7598, 0x7598, 0x1A13,\n    0x7599, 0x759A, 0x0657, 0x759D, 0x759D, 0x0656, 0x759E, 0x759E, 0x42C7,\n    0x75A2, 0x75A3, 0x07A8, 0x75A4, 0x75A5, 0x07A6, 0x75A7, 0x75A7, 0x1B93,\n    0x75AA, 0x75AA, 0x1B94, 0x75AB, 0x75AB, 0x07A5, 0x75B0, 0x75B0, 0x1D51,\n    0x75B1, 0x75B1, 0x3EAD, 0x75B2, 0x75B3, 0x0939, 0x75B4, 0x75B4, 0x42C8,\n    0x75B5, 0x75B5, 0x0B32, 0x75B6, 0x75B6, 0x1D57, 0x75B8, 0x75B8, 0x093F,\n    0x75B9, 0x75B9, 0x093D, 0x75BA, 0x75BA, 0x1D58, 0x75BB, 0x75BB, 0x1D53,\n    0x75BC, 0x75BC, 0x093C, 0x75BD, 0x75BD, 0x093B, 0x75BE, 0x75BE, 0x0936,\n    0x75BF, 0x75BF, 0x1D56, 0x75C0, 0x75C0, 0x1D55, 0x75C1, 0x75C1, 0x1D52,\n    0x75C2, 0x75C2, 0x093E, 0x75C3, 0x75C3, 0x3F93, 0x75C4, 0x75C4, 0x1D54,\n    0x75C5, 0x75C5, 0x0937, 0x75C7, 0x75C7, 0x0938, 0x75C8, 0x75C8, 0x4701,\n    0x75CA, 0x75CA, 0x0B33, 0x75CB, 0x75CC, 0x1FA3, 0x75CD, 0x75CD, 0x0B34,\n    0x75CE, 0x75CE, 0x1FA0, 0x75CF, 0x75CF, 0x1FA2, 0x75D0, 0x75D0, 0x1FA6,\n    0x75D1, 0x75D1, 0x1FA5, 0x75D2, 0x75D2, 0x1FA1, 0x75D4, 0x75D5, 0x0B30,\n    0x75D7, 0x75D7, 0x222B, 0x75D8, 0x75D8, 0x0CEB, 0x75D9, 0x75D9, 0x0CEA,\n    0x75DA, 0x75DA, 0x2225, 0x75DB, 0x75DB, 0x0CE8, 0x75DC, 0x75DC, 0x43CE,\n    0x75DD, 0x75DD, 0x2228, 0x75DE, 0x75DE, 0x0CEC, 0x75DF, 0x75DF, 0x2229,\n    0x75E0, 0x75E0, 0x0CED, 0x75E1, 0x75E1, 0x2226, 0x75E2, 0x75E2, 0x0CE7,\n    0x75E3, 0x75E3, 0x0CE9, 0x75E4, 0x75E4, 0x222A, 0x75E6, 0x75E6, 0x2227,\n    0x75E7, 0x75E7, 0x2224, 0x75ED, 0x75ED, 0x24BB, 0x75EF, 0x75EF, 0x24B0,\n    0x75F0, 0x75F0, 0x0E88, 0x75F1, 0x75F1, 0x0E8B, 0x75F2, 0x75F2, 0x0E8A,\n    0x75F3, 0x75F3, 0x0E8F, 0x75F4, 0x75F4, 0x0E8E, 0x75F5, 0x75F5, 0x24BC,\n    0x75F6, 0x75F6, 0x24BA, 0x75F7, 0x75F7, 0x24B3, 0x75F8, 0x75F8, 0x24B7,\n    0x75F9, 0x75F9, 0x24B6, 0x75FA, 0x75FA, 0x0E8C, 0x75FB, 0x75FB, 0x24B9,\n    0x75FC, 0x75FC, 0x24B5, 0x75FD, 0x75FD, 0x24BD, 0x75FE, 0x75FE, 0x24B4,\n    0x75FF, 0x75FF, 0x0E8D, 0x7600, 0x7600, 0x0E87, 0x7601, 0x7601, 0x0E89,\n    0x7602, 0x7602, 0x42C9, 0x7603, 0x7603, 0x24B2, 0x7607, 0x7607, 0x3F8F,\n    0x7608, 0x7608, 0x2738, 0x7609, 0x7609, 0x1036, 0x760A, 0x760A, 0x273C,\n    0x760B, 0x760B, 0x1035, 0x760C, 0x760C, 0x2739, 0x760D, 0x760D, 0x1034,\n    0x760F, 0x760F, 0x24B1, 0x7610, 0x7610, 0x24B8, 0x7611, 0x7611, 0x273B,\n    0x7613, 0x7613, 0x1037, 0x7614, 0x7614, 0x273D, 0x7615, 0x7615, 0x273A,\n    0x7616, 0x7616, 0x2737, 0x7619, 0x7619, 0x2982, 0x761A, 0x761A, 0x2986,\n    0x761B, 0x761B, 0x2988, 0x761C, 0x761C, 0x2984, 0x761D, 0x761D, 0x2983,\n    0x761E, 0x761E, 0x2981, 0x761F, 0x761F, 0x11AE, 0x7620, 0x7620, 0x11AC,\n    0x7621, 0x7622, 0x11B1, 0x7623, 0x7623, 0x2985, 0x7624, 0x7624, 0x11AF,\n    0x7625, 0x7625, 0x2980, 0x7626, 0x7626, 0x11B0, 0x7627, 0x7627, 0x1033,\n    0x7628, 0x7628, 0x2987, 0x7629, 0x7629, 0x11AD, 0x762C, 0x762C, 0x42CA,\n    0x762D, 0x762D, 0x2BD5, 0x762F, 0x762F, 0x2BD4, 0x7630, 0x7630, 0x2BDC,\n    0x7631, 0x7631, 0x2BD6, 0x7632, 0x7632, 0x2BDB, 0x7633, 0x7633, 0x2BD8,\n    0x7634, 0x7634, 0x1302, 0x7635, 0x7635, 0x2BDA, 0x7638, 0x7638, 0x1303,\n    0x763A, 0x763A, 0x1304, 0x763B, 0x763B, 0x3E70, 0x763C, 0x763C, 0x2BD9,\n    0x763D, 0x763D, 0x2BD7, 0x7640, 0x7640, 0x3EE6, 0x7642, 0x7642, 0x1415,\n    0x7643, 0x7643, 0x2DB3, 0x7646, 0x7646, 0x1414, 0x7647, 0x7647, 0x2DB6,\n    0x7648, 0x7649, 0x2DB4, 0x764C, 0x764C, 0x1416, 0x764D, 0x764D, 0x4702,\n    0x764E, 0x764E, 0x3E72, 0x764F, 0x764F, 0x42CC, 0x7650, 0x7650, 0x2F63,\n    0x7651, 0x7651, 0x42CB, 0x7652, 0x7652, 0x14F9, 0x7653, 0x7653, 0x2F64,\n    0x7654, 0x7654, 0x3EF0, 0x7656, 0x7656, 0x14F7, 0x7657, 0x7657, 0x2F65,\n    0x7658, 0x7658, 0x14F8, 0x7659, 0x7659, 0x2F62, 0x765A, 0x765A, 0x2F66,\n    0x765C, 0x765C, 0x2F60, 0x765F, 0x765F, 0x159C, 0x7660, 0x7660, 0x30C5,\n    0x7661, 0x7661, 0x159D, 0x7662, 0x7662, 0x1622, 0x7664, 0x7664, 0x2F61,\n    0x7665, 0x7665, 0x1623, 0x7666, 0x7666, 0x3EAA, 0x7667, 0x7667, 0x3FA9,\n    0x7669, 0x7669, 0x167F, 0x766A, 0x766A, 0x32E4, 0x766C, 0x766C, 0x16CE,\n    0x766D, 0x766D, 0x3395, 0x766E, 0x766E, 0x16CD, 0x766F, 0x766F, 0x42CD,\n    0x7670, 0x7670, 0x3428, 0x7671, 0x7672, 0x1723, 0x7673, 0x7673, 0x3AEB,\n    0x7674, 0x7674, 0x4703, 0x7675, 0x7675, 0x3543, 0x7676, 0x7676, 0x022F,\n    0x7678, 0x7678, 0x07AA, 0x7679, 0x7679, 0x1B95, 0x767A, 0x767A, 0x4705,\n    0x767B, 0x767C, 0x0CEE, 0x767D, 0x767D, 0x0363, 0x767E, 0x767E, 0x03F5,\n    0x767F, 0x767F, 0x1810, 0x7680, 0x7680, 0x43D3, 0x7681, 0x7681, 0x18D6,\n    0x7682, 0x7682, 0x04F4, 0x7684, 0x7684, 0x0659, 0x7686, 0x7688, 0x07AB,\n    0x7689, 0x7689, 0x1FA8, 0x768A, 0x768A, 0x1D59, 0x768B, 0x768B, 0x0940,\n    0x768C, 0x768C, 0x43D4, 0x768E, 0x768E, 0x0B35, 0x768F, 0x768F, 0x1FA7,\n    0x7690, 0x7690, 0x42D0, 0x7692, 0x7692, 0x222D, 0x7693, 0x7693, 0x0CF1,\n    0x7695, 0x7695, 0x222C, 0x7696, 0x7696, 0x0CF0, 0x7699, 0x7699, 0x24BE,\n    0x769A, 0x769A, 0x11B3, 0x769B, 0x769B, 0x298C, 0x769C, 0x769E, 0x2989,\n    0x76A1, 0x76A1, 0x42D5, 0x76A4, 0x76A4, 0x2DB7, 0x76A5, 0x76A5, 0x42D6,\n    0x76A6, 0x76A6, 0x2F67, 0x76AA, 0x76AA, 0x31FB, 0x76AB, 0x76AB, 0x31FA,\n    0x76AD, 0x76AD, 0x3396, 0x76AE, 0x76AE, 0x0364, 0x76AF, 0x76AF, 0x1A14,\n    0x76B0, 0x76B0, 0x0941, 0x76B4, 0x76B4, 0x0CF2, 0x76B5, 0x76B5, 0x24BF,\n    0x76B7, 0x76B7, 0x42D7, 0x76B8, 0x76B8, 0x273E, 0x76BA, 0x76BA, 0x11B4,\n    0x76BB, 0x76BB, 0x2BDD, 0x76BD, 0x76BD, 0x2F68, 0x76BE, 0x76BE, 0x31FC,\n    0x76BF, 0x76BF, 0x0365, 0x76C2, 0x76C2, 0x065A, 0x76C3, 0x76C3, 0x07B0,\n    0x76C4, 0x76C4, 0x1B96, 0x76C5, 0x76C5, 0x07B1, 0x76C6, 0x76C6, 0x07AF,\n    0x76C8, 0x76C8, 0x07AE, 0x76C9, 0x76C9, 0x1D5A, 0x76CA, 0x76CA, 0x0942,\n    0x76CC, 0x76CC, 0x42D8, 0x76CD, 0x76CE, 0x0943, 0x76D2, 0x76D2, 0x0B37,\n    0x76D3, 0x76D3, 0x1FA9, 0x76D4, 0x76D4, 0x0B36, 0x76D6, 0x76D6, 0x3F55,\n    0x76DA, 0x76DA, 0x222E, 0x76DB, 0x76DB, 0x0B38, 0x76DC, 0x76DC, 0x0CF3,\n    0x76DD, 0x76DD, 0x24C0, 0x76DE, 0x76DF, 0x0E90, 0x76E1, 0x76E1, 0x1038,\n    0x76E3, 0x76E3, 0x1039, 0x76E4, 0x76E4, 0x11B5, 0x76E5, 0x76E5, 0x1306,\n    0x76E6, 0x76E6, 0x2BDE, 0x76E7, 0x76E7, 0x1305, 0x76E9, 0x76E9, 0x2DB8,\n    0x76EA, 0x76EA, 0x1417, 0x76EC, 0x76EC, 0x2F69, 0x76ED, 0x76ED, 0x31FD,\n    0x76EE, 0x76EE, 0x0366, 0x76EF, 0x76EF, 0x04F5, 0x76F0, 0x76F0, 0x1A17,\n    0x76F1, 0x76F1, 0x1A16, 0x76F2, 0x76F2, 0x065B, 0x76F3, 0x76F3, 0x1A15,\n    0x76F4, 0x76F4, 0x065C, 0x76F5, 0x76F5, 0x1A18, 0x76F7, 0x76F7, 0x1B9C,\n    0x76F8, 0x76F8, 0x07B4, 0x76F9, 0x76F9, 0x07B3, 0x76FA, 0x76FA, 0x1B9E,\n    0x76FB, 0x76FB, 0x1B9D, 0x76FC, 0x76FC, 0x07B8, 0x76FE, 0x76FE, 0x07B7,\n    0x7701, 0x7701, 0x07B2, 0x7703, 0x7705, 0x1B98, 0x7707, 0x7707, 0x07B9,\n    0x7708, 0x7708, 0x1B97, 0x7709, 0x7709, 0x07B5, 0x770A, 0x770A, 0x1B9B,\n    0x770B, 0x770B, 0x07B6, 0x770C, 0x770C, 0x3D62, 0x770E, 0x770F, 0x3B02,\n    0x7710, 0x7710, 0x1D5D, 0x7711, 0x7711, 0x1D61, 0x7712, 0x7712, 0x1D5F,\n    0x7713, 0x7713, 0x1D5E, 0x7715, 0x7715, 0x1D62, 0x7719, 0x771A, 0x1D63,\n    0x771B, 0x771B, 0x1D5C, 0x771D, 0x771D, 0x1D5B, 0x771E, 0x771E, 0x42DE,\n    0x771F, 0x7720, 0x0946, 0x7722, 0x7722, 0x1D65, 0x7723, 0x7723, 0x1D60,\n    0x7724, 0x7724, 0x3FE8, 0x7725, 0x7725, 0x1FB2, 0x7726, 0x7726, 0x42DF,\n    0x7727, 0x7727, 0x1D66, 0x7728, 0x7728, 0x0948, 0x7729, 0x7729, 0x0945,\n    0x772B, 0x772B, 0x3FF3, 0x772D, 0x772D, 0x1FAC, 0x772F, 0x772F, 0x1FAB,\n    0x7731, 0x7732, 0x1FAD, 0x7733, 0x7733, 0x1FB0, 0x7734, 0x7734, 0x1FAF,\n    0x7735, 0x7735, 0x1FB4, 0x7736, 0x7736, 0x0B3C, 0x7737, 0x7737, 0x0B39,\n    0x7738, 0x7738, 0x0B3D, 0x7739, 0x7739, 0x1FAA, 0x773A, 0x773A, 0x0B3E,\n    0x773B, 0x773B, 0x1FB3, 0x773C, 0x773C, 0x0B3B, 0x773D, 0x773D, 0x1FB1,\n    0x773E, 0x773E, 0x0B3A, 0x7740, 0x7740, 0x42E0, 0x7743, 0x7743, 0x470A,\n    0x7744, 0x7744, 0x2231, 0x7745, 0x7745, 0x2233, 0x7746, 0x7747, 0x222F,\n    0x774A, 0x774A, 0x2234, 0x774B, 0x774C, 0x2236, 0x774D, 0x774D, 0x2232,\n    0x774E, 0x774E, 0x2235, 0x774F, 0x774F, 0x0CF4, 0x7752, 0x7752, 0x24C4,\n    0x7754, 0x7754, 0x24C9, 0x7755, 0x7755, 0x24C1, 0x7756, 0x7756, 0x24C5,\n    0x7758, 0x7758, 0x42E3, 0x7759, 0x7759, 0x24CA, 0x775A, 0x775A, 0x24C6,\n    0x775B, 0x775B, 0x0E92, 0x775C, 0x775C, 0x0E9A, 0x775E, 0x775E, 0x0E95,\n    0x775F, 0x7760, 0x24C2, 0x7761, 0x7761, 0x103D, 0x7762, 0x7762, 0x0E9D,\n    0x7763, 0x7763, 0x0E96, 0x7765, 0x7765, 0x0E9B, 0x7766, 0x7766, 0x0E94,\n    0x7767, 0x7767, 0x24C8, 0x7768, 0x7768, 0x0E9C, 0x7769, 0x7769, 0x24C7,\n    0x776A, 0x776A, 0x0E98, 0x776B, 0x776B, 0x0E93, 0x776C, 0x776C, 0x0E99,\n    0x776D, 0x776D, 0x24CB, 0x776E, 0x776E, 0x2743, 0x776F, 0x776F, 0x2745,\n    0x7772, 0x7772, 0x396B, 0x7777, 0x7777, 0x46A9, 0x7778, 0x7778, 0x3B00,\n    0x7779, 0x7779, 0x0E97, 0x777A, 0x777A, 0x4317, 0x777B, 0x777B, 0x3B04,\n    0x777C, 0x777C, 0x2740, 0x777D, 0x777D, 0x103B, 0x777E, 0x777E, 0x2746,\n    0x777F, 0x777F, 0x103C, 0x7780, 0x7780, 0x2744, 0x7781, 0x7781, 0x273F,\n    0x7782, 0x7782, 0x2742, 0x7783, 0x7783, 0x2747, 0x7784, 0x7784, 0x103A,\n    0x7785, 0x7785, 0x2741, 0x7787, 0x7787, 0x11B7, 0x7788, 0x7788, 0x2990,\n    0x7789, 0x7789, 0x298F, 0x778B, 0x778B, 0x11BA, 0x778C, 0x778C, 0x11B8,\n    0x778D, 0x778D, 0x298D, 0x778E, 0x778E, 0x11B6, 0x778F, 0x778F, 0x298E,\n    0x7791, 0x7791, 0x11B9, 0x7793, 0x7793, 0x382D, 0x7795, 0x7795, 0x2BE6,\n    0x7797, 0x7797, 0x2BE8, 0x7798, 0x7798, 0x470E, 0x7799, 0x7799, 0x2BE7,\n    0x779A, 0x779A, 0x2BDF, 0x779B, 0x779B, 0x2BE3, 0x779C, 0x779C, 0x2BE2,\n    0x779D, 0x779D, 0x2BE0, 0x779E, 0x779F, 0x1308, 0x77A0, 0x77A0, 0x1307,\n    0x77A1, 0x77A1, 0x2BE1, 0x77A2, 0x77A3, 0x2BE4, 0x77A5, 0x77A5, 0x130A,\n    0x77A7, 0x77A7, 0x141C, 0x77A8, 0x77A8, 0x2DC0, 0x77AA, 0x77AA, 0x1419,\n    0x77AB, 0x77AB, 0x2DBA, 0x77AC, 0x77AC, 0x141B, 0x77AD, 0x77AD, 0x141D,\n    0x77AF, 0x77AF, 0x42E5, 0x77B0, 0x77B0, 0x141A, 0x77B1, 0x77B1, 0x2DBF,\n    0x77B2, 0x77B2, 0x2DBB, 0x77B3, 0x77B3, 0x1418, 0x77B4, 0x77B4, 0x2DBE,\n    0x77B5, 0x77B5, 0x2DB9, 0x77B6, 0x77B6, 0x2DBD, 0x77B7, 0x77B7, 0x2DBC,\n    0x77B9, 0x77B9, 0x3E73, 0x77BA, 0x77BA, 0x2F6B, 0x77BB, 0x77BC, 0x14FC,\n    0x77BD, 0x77BD, 0x14FA, 0x77BE, 0x77BE, 0x4711, 0x77BF, 0x77BF, 0x14FB,\n    0x77C2, 0x77C2, 0x2F6A, 0x77C3, 0x77C3, 0x3BB1, 0x77C4, 0x77C4, 0x30C8,\n    0x77C5, 0x77C5, 0x41C1, 0x77C7, 0x77C7, 0x159E, 0x77C9, 0x77CA, 0x30C6,\n    0x77CB, 0x77CB, 0x4712, 0x77CC, 0x77CC, 0x31FE, 0x77CD, 0x77CD, 0x3201,\n    0x77CE, 0x77CF, 0x31FF, 0x77D0, 0x77D0, 0x32E5, 0x77D3, 0x77D3, 0x1680,\n    0x77D4, 0x77D4, 0x3429, 0x77D5, 0x77D5, 0x348F, 0x77D7, 0x77D7, 0x1725,\n    0x77D8, 0x77D9, 0x34D3, 0x77DA, 0x77DA, 0x1753, 0x77DB, 0x77DB, 0x0367,\n    0x77DC, 0x77DC, 0x07BA, 0x77DE, 0x77DE, 0x2238, 0x77E0, 0x77E0, 0x24CC,\n    0x77E2, 0x77E2, 0x0368, 0x77E3, 0x77E3, 0x04F6, 0x77E5, 0x77E5, 0x065D,\n    0x77E6, 0x77E6, 0x4081, 0x77E7, 0x77E8, 0x1B9F, 0x77E9, 0x77E9, 0x0949,\n    0x77EC, 0x77EC, 0x2239, 0x77ED, 0x77ED, 0x0CF5, 0x77EE, 0x77EE, 0x0E9E,\n    0x77EF, 0x77EF, 0x141E, 0x77F0, 0x77F0, 0x2DC1, 0x77F1, 0x77F1, 0x30C9,\n    0x77F2, 0x77F2, 0x3202, 0x77F3, 0x77F3, 0x0369, 0x77F4, 0x77F4, 0x42E9,\n    0x77F7, 0x77F7, 0x1A1E, 0x77F8, 0x77F8, 0x1A19, 0x77F9, 0x77F9, 0x1A1B,\n    0x77FA, 0x77FA, 0x1A1D, 0x77FB, 0x77FB, 0x1A1C, 0x77FC, 0x77FC, 0x1A1A,\n    0x77FD, 0x77FD, 0x065E, 0x77FE, 0x77FE, 0x3FD5, 0x7802, 0x7802, 0x07BB,\n    0x7803, 0x7803, 0x1BA9, 0x7805, 0x7805, 0x1BA4, 0x7806, 0x7806, 0x1BA1,\n    0x7808, 0x7808, 0x3E46, 0x7809, 0x7809, 0x1BA8, 0x780C, 0x780D, 0x07BD,\n    0x780E, 0x780E, 0x1BA7, 0x780F, 0x780F, 0x1BA6, 0x7810, 0x7810, 0x1BA5,\n    0x7811, 0x7812, 0x1BA2, 0x7813, 0x7813, 0x1BAA, 0x7814, 0x7814, 0x07BC,\n    0x7818, 0x7818, 0x4713, 0x781C, 0x781C, 0x4714, 0x781D, 0x781D, 0x094D,\n    0x781E, 0x781E, 0x3B13, 0x781F, 0x781F, 0x0953, 0x7820, 0x7820, 0x0952,\n    0x7821, 0x7821, 0x1D6F, 0x7822, 0x7822, 0x1D69, 0x7823, 0x7823, 0x1D67,\n    0x7825, 0x7825, 0x0950, 0x7826, 0x7826, 0x1FBB, 0x7827, 0x7827, 0x094B,\n    0x7828, 0x7828, 0x1D6C, 0x7829, 0x7829, 0x1D70, 0x782A, 0x782A, 0x1D72,\n    0x782B, 0x782B, 0x1D6E, 0x782C, 0x782C, 0x1D68, 0x782D, 0x782D, 0x0951,\n    0x782E, 0x782E, 0x1D6D, 0x782F, 0x782F, 0x1D6B, 0x7830, 0x7830, 0x094A,\n    0x7831, 0x7831, 0x1D73, 0x7832, 0x7832, 0x0954, 0x7833, 0x7833, 0x1D71,\n    0x7834, 0x7834, 0x094E, 0x7835, 0x7835, 0x1D6A, 0x7837, 0x7837, 0x094F,\n    0x7838, 0x7838, 0x094C, 0x7839, 0x7839, 0x43D6, 0x783C, 0x783C, 0x401A,\n    0x783D, 0x783D, 0x3C6A, 0x7842, 0x7842, 0x3AC4, 0x7843, 0x7843, 0x0B40,\n    0x7844, 0x7844, 0x3C2B, 0x7845, 0x7845, 0x1FBC, 0x7847, 0x7847, 0x4715,\n    0x7848, 0x7848, 0x1FB5, 0x7849, 0x7849, 0x1FB7, 0x784A, 0x784A, 0x1FB9,\n    0x784B, 0x784B, 0x3C6D, 0x784C, 0x784C, 0x1FBA, 0x784D, 0x784D, 0x1FB8,\n    0x784E, 0x784E, 0x0B41, 0x7850, 0x7850, 0x1FBD, 0x7851, 0x7851, 0x4716,\n    0x7852, 0x7852, 0x1FB6, 0x7853, 0x7853, 0x3F95, 0x7854, 0x7854, 0x3C6B,\n    0x785C, 0x785C, 0x223D, 0x785D, 0x785D, 0x0CF6, 0x785E, 0x785E, 0x2245,\n    0x7860, 0x7860, 0x223A, 0x7862, 0x7862, 0x2246, 0x7864, 0x7865, 0x223B,\n    0x7866, 0x7866, 0x4717, 0x7868, 0x7868, 0x2244, 0x7869, 0x7869, 0x2243,\n    0x786A, 0x786A, 0x2240, 0x786B, 0x786B, 0x0B3F, 0x786C, 0x786C, 0x0CF7,\n    0x786D, 0x786D, 0x223E, 0x786E, 0x786E, 0x2241, 0x786F, 0x786F, 0x0CF8,\n    0x7870, 0x7870, 0x2242, 0x7871, 0x7871, 0x223F, 0x7879, 0x7879, 0x24D7,\n    0x787A, 0x787A, 0x3EE9, 0x787B, 0x787B, 0x24DB, 0x787C, 0x787C, 0x0EA5,\n    0x787E, 0x787E, 0x274D, 0x787F, 0x787F, 0x0EA8, 0x7880, 0x7880, 0x24D9,\n    0x7881, 0x7881, 0x36E8, 0x7883, 0x7883, 0x24D6, 0x7884, 0x7884, 0x24D1,\n    0x7885, 0x7886, 0x24D3, 0x7887, 0x7887, 0x24CD, 0x7888, 0x7888, 0x3B15,\n    0x7889, 0x7889, 0x0EA4, 0x788C, 0x788C, 0x0EA3, 0x788D, 0x788D, 0x3B14,\n    0x788E, 0x788E, 0x0E9F, 0x788F, 0x788F, 0x24D0, 0x7891, 0x7891, 0x0EA6,\n    0x7893, 0x7893, 0x0EA7, 0x7894, 0x7894, 0x24CF, 0x7895, 0x7895, 0x24D2,\n    0x7896, 0x7896, 0x24DA, 0x7897, 0x7898, 0x0EA1, 0x7899, 0x7899, 0x24D8,\n    0x789A, 0x789A, 0x24CE, 0x789E, 0x789E, 0x274F, 0x789F, 0x789F, 0x103F,\n    0x78A0, 0x78A0, 0x2751, 0x78A1, 0x78A1, 0x24D5, 0x78A2, 0x78A2, 0x2753,\n    0x78A3, 0x78A3, 0x1043, 0x78A4, 0x78A4, 0x2754, 0x78A5, 0x78A5, 0x2750,\n    0x78A7, 0x78A7, 0x1040, 0x78A8, 0x78A8, 0x274C, 0x78A9, 0x78A9, 0x1042,\n    0x78AA, 0x78AA, 0x2749, 0x78AB, 0x78AB, 0x274E, 0x78AC, 0x78AC, 0x2752,\n    0x78AD, 0x78AD, 0x274B, 0x78AF, 0x78AF, 0x42EC, 0x78B0, 0x78B0, 0x0EA0,\n    0x78B1, 0x78B1, 0x42F4, 0x78B2, 0x78B2, 0x2748, 0x78B3, 0x78B3, 0x1041,\n    0x78B4, 0x78B4, 0x274A, 0x78B6, 0x78B6, 0x3C6C, 0x78B8, 0x78B8, 0x4571,\n    0x78B9, 0x78B9, 0x3C63, 0x78BA, 0x78BA, 0x11BD, 0x78BB, 0x78BB, 0x2992,\n    0x78BC, 0x78BC, 0x11C1, 0x78BE, 0x78BE, 0x11BF, 0x78C1, 0x78C1, 0x103E,\n    0x78C3, 0x78C4, 0x2999, 0x78C5, 0x78C5, 0x11BC, 0x78C7, 0x78C7, 0x42ED,\n    0x78C8, 0x78C8, 0x2998, 0x78C9, 0x78C9, 0x299B, 0x78CA, 0x78CA, 0x11BE,\n    0x78CB, 0x78CB, 0x11BB, 0x78CC, 0x78CC, 0x2994, 0x78CD, 0x78CD, 0x2991,\n    0x78CE, 0x78CE, 0x2996, 0x78CF, 0x78CF, 0x2993, 0x78D0, 0x78D0, 0x11C2,\n    0x78D1, 0x78D1, 0x2995, 0x78D2, 0x78D2, 0x3B16, 0x78D3, 0x78D3, 0x42EE,\n    0x78D4, 0x78D4, 0x2997, 0x78D5, 0x78D5, 0x11C0, 0x78D7, 0x78D7, 0x42F2,\n    0x78D8, 0x78D8, 0x3F8C, 0x78DA, 0x78DA, 0x130C, 0x78DB, 0x78DB, 0x2BEF,\n    0x78DD, 0x78DD, 0x2BE9, 0x78DE, 0x78DE, 0x2BED, 0x78DF, 0x78E0, 0x2BF3,\n    0x78E1, 0x78E2, 0x2BF0, 0x78E3, 0x78E3, 0x2BEE, 0x78E5, 0x78E5, 0x2BEB,\n    0x78E7, 0x78E7, 0x130E, 0x78E8, 0x78E8, 0x130B, 0x78E9, 0x78E9, 0x2BEA,\n    0x78EA, 0x78EA, 0x2BEC, 0x78EC, 0x78EC, 0x130D, 0x78ED, 0x78ED, 0x2BF2,\n    0x78EE, 0x78EE, 0x3A81, 0x78EF, 0x78EF, 0x1422, 0x78F0, 0x78F0, 0x3B3A,\n    0x78F1, 0x78F1, 0x40BE, 0x78F2, 0x78F2, 0x2DC8, 0x78F3, 0x78F3, 0x2DC2,\n    0x78F4, 0x78F4, 0x1421, 0x78F5, 0x78F5, 0x38B3, 0x78F7, 0x78F7, 0x141F,\n    0x78F9, 0x78F9, 0x2DCA, 0x78FA, 0x78FA, 0x1420, 0x78FB, 0x78FC, 0x2DC5,\n    0x78FD, 0x78FD, 0x2DC3, 0x78FE, 0x78FE, 0x2DCB, 0x78FF, 0x78FF, 0x2DC7,\n    0x7901, 0x7901, 0x1423, 0x7902, 0x7902, 0x2DC4, 0x7904, 0x7904, 0x2DCC,\n    0x7905, 0x7905, 0x2DC9, 0x7906, 0x7906, 0x3FCF, 0x7909, 0x7909, 0x2F6F,\n    0x790C, 0x790C, 0x2F6C, 0x790E, 0x790E, 0x14FE, 0x7910, 0x7910, 0x2F70,\n    0x7911, 0x7911, 0x2F72, 0x7912, 0x7912, 0x2F71, 0x7913, 0x7914, 0x2F6D,\n    0x7917, 0x7917, 0x30CE, 0x7919, 0x7919, 0x159F, 0x791B, 0x791B, 0x30CB,\n    0x791C, 0x791C, 0x30CD, 0x791D, 0x791D, 0x30CA, 0x791E, 0x791E, 0x30CF,\n    0x7921, 0x7921, 0x30CC, 0x7923, 0x7923, 0x3204, 0x7924, 0x7924, 0x3207,\n    0x7925, 0x7925, 0x3203, 0x7926, 0x7926, 0x1624, 0x7927, 0x7928, 0x3205,\n    0x7929, 0x7929, 0x3208, 0x792A, 0x792A, 0x1625, 0x792B, 0x792B, 0x1627,\n    0x792C, 0x792C, 0x1626, 0x792D, 0x792D, 0x32E6, 0x792E, 0x792E, 0x42F0,\n    0x792F, 0x792F, 0x32E8, 0x7931, 0x7931, 0x32E7, 0x7932, 0x7932, 0x471B,\n    0x7933, 0x7933, 0x471A, 0x7934, 0x7934, 0x42F3, 0x7935, 0x7935, 0x3397,\n    0x7936, 0x7936, 0x3783, 0x7938, 0x7938, 0x3490, 0x7939, 0x7939, 0x34D5,\n    0x793A, 0x793A, 0x036A, 0x793B, 0x793B, 0x44F7, 0x793C, 0x793C, 0x4300,\n    0x793D, 0x793D, 0x18D7, 0x793E, 0x793E, 0x065F, 0x793F, 0x793F, 0x1A20,\n    0x7940, 0x7941, 0x0660, 0x7942, 0x7942, 0x1A1F, 0x7944, 0x7944, 0x1BAF,\n    0x7945, 0x7945, 0x1BAE, 0x7946, 0x7946, 0x07BF, 0x7947, 0x7947, 0x07C2,\n    0x7948, 0x7948, 0x07C1, 0x7949, 0x7949, 0x07C0, 0x794A, 0x794A, 0x1BAB,\n    0x794B, 0x794B, 0x1BAD, 0x794C, 0x794C, 0x1BAC, 0x794F, 0x794F, 0x1D76,\n    0x7950, 0x7950, 0x0956, 0x7951, 0x7951, 0x1D7A, 0x7952, 0x7952, 0x1D79,\n    0x7953, 0x7953, 0x1D78, 0x7954, 0x7954, 0x1D74, 0x7955, 0x7955, 0x0955,\n    0x7956, 0x7956, 0x0959, 0x7957, 0x7957, 0x095C, 0x7958, 0x7958, 0x37E5,\n    0x7959, 0x7959, 0x3B18, 0x795A, 0x795A, 0x095D, 0x795B, 0x795B, 0x1D75,\n    0x795C, 0x795C, 0x1D77, 0x795D, 0x795D, 0x095B, 0x795E, 0x795E, 0x095A,\n    0x795F, 0x795F, 0x0958, 0x7960, 0x7960, 0x0957, 0x7961, 0x7961, 0x1FC4,\n    0x7962, 0x7962, 0x3E7D, 0x7963, 0x7963, 0x1FC2, 0x7964, 0x7964, 0x1FBE,\n    0x7965, 0x7965, 0x0B42, 0x7967, 0x7967, 0x1FBF, 0x7968, 0x7968, 0x0B43,\n    0x7969, 0x796A, 0x1FC0, 0x796B, 0x796B, 0x1FC3, 0x796D, 0x796D, 0x0B44,\n    0x7970, 0x7970, 0x224A, 0x7971, 0x7971, 0x4168, 0x7972, 0x7972, 0x2249,\n    0x7973, 0x7973, 0x2248, 0x7974, 0x7974, 0x2247, 0x7979, 0x7979, 0x24DF,\n    0x797A, 0x797A, 0x0EA9, 0x797C, 0x797C, 0x24DC, 0x797D, 0x797D, 0x24DE,\n    0x797E, 0x797E, 0x3E26, 0x797F, 0x797F, 0x0EAA, 0x7980, 0x7980, 0x42FC,\n    0x7981, 0x7981, 0x0EAB, 0x7982, 0x7982, 0x24DD, 0x7983, 0x7983, 0x3DF6,\n    0x7986, 0x7986, 0x42F9, 0x7987, 0x7987, 0x4588, 0x7988, 0x7988, 0x275D,\n    0x798A, 0x798B, 0x2756, 0x798D, 0x798D, 0x1046, 0x798E, 0x798F, 0x1044,\n    0x7990, 0x7990, 0x275F, 0x7991, 0x7991, 0x471D, 0x7992, 0x7992, 0x275E,\n    0x7993, 0x7993, 0x275B, 0x7994, 0x7994, 0x275A, 0x7995, 0x7995, 0x2759,\n    0x7996, 0x7996, 0x2758, 0x7997, 0x7997, 0x275C, 0x7998, 0x7998, 0x2755,\n    0x7999, 0x7999, 0x43FC, 0x799A, 0x799A, 0x299C, 0x799B, 0x799B, 0x29A1,\n    0x799C, 0x799C, 0x299F, 0x799D, 0x799D, 0x42FE, 0x799F, 0x799F, 0x395E,\n    0x79A0, 0x79A0, 0x299E, 0x79A1, 0x79A1, 0x299D, 0x79A2, 0x79A2, 0x29A0,\n    0x79A4, 0x79A4, 0x2BF5, 0x79A5, 0x79A5, 0x3B1E, 0x79A6, 0x79A6, 0x130F,\n    0x79A7, 0x79A7, 0x1424, 0x79A8, 0x79A8, 0x2DCE, 0x79A9, 0x79A9, 0x4301,\n    0x79AA, 0x79AA, 0x1425, 0x79AB, 0x79AB, 0x2DCD, 0x79AC, 0x79AC, 0x2F74,\n    0x79AD, 0x79AD, 0x2F73, 0x79AE, 0x79AE, 0x14FF, 0x79B0, 0x79B0, 0x30D0,\n    0x79B1, 0x79B1, 0x15A0, 0x79B2, 0x79B2, 0x3209, 0x79B3, 0x79B3, 0x16CF,\n    0x79B4, 0x79B4, 0x3398, 0x79B6, 0x79B6, 0x3492, 0x79B7, 0x79B7, 0x3491,\n    0x79B8, 0x79B8, 0x17B2, 0x79B9, 0x79BA, 0x07C3, 0x79BB, 0x79BB, 0x1FC5,\n    0x79BD, 0x79BD, 0x0EAD, 0x79BE, 0x79BE, 0x036B, 0x79BF, 0x79BF, 0x04F9,\n    0x79C0, 0x79C0, 0x04F8, 0x79C1, 0x79C1, 0x04F7, 0x79C4, 0x79C4, 0x3CCD,\n    0x79C5, 0x79C5, 0x1A21, 0x79C6, 0x79C6, 0x4305, 0x79C8, 0x79C8, 0x0663,\n    0x79C9, 0x79C9, 0x0662, 0x79CB, 0x79CB, 0x07C7, 0x79CC, 0x79CC, 0x4233,\n    0x79CD, 0x79CD, 0x1BB1, 0x79CE, 0x79CE, 0x1BB4, 0x79CF, 0x79CF, 0x1BB2,\n    0x79D1, 0x79D2, 0x07C5, 0x79D4, 0x79D4, 0x4307, 0x79D5, 0x79D5, 0x1BB0,\n    0x79D6, 0x79D6, 0x1BB3, 0x79D8, 0x79D8, 0x0964, 0x79DC, 0x79DC, 0x1D81,\n    0x79DD, 0x79DD, 0x1D83, 0x79DE, 0x79DE, 0x1D82, 0x79DF, 0x79DF, 0x0961,\n    0x79E0, 0x79E0, 0x1D7D, 0x79E2, 0x79E2, 0x3C5A, 0x79E3, 0x79E3, 0x095F,\n    0x79E4, 0x79E4, 0x095E, 0x79E6, 0x79E6, 0x0962, 0x79E7, 0x79E7, 0x0960,\n    0x79E9, 0x79E9, 0x0963, 0x79EA, 0x79EA, 0x1D80, 0x79EB, 0x79EC, 0x1D7B,\n    0x79ED, 0x79ED, 0x1D7F, 0x79EE, 0x79EE, 0x1D7E, 0x79F1, 0x79F1, 0x3B27,\n    0x79F4, 0x79F4, 0x3B22, 0x79F6, 0x79F7, 0x1FC8, 0x79F8, 0x79F8, 0x1FC7,\n    0x79FA, 0x79FA, 0x1FC6, 0x79FB, 0x79FB, 0x0B45, 0x7A00, 0x7A00, 0x0CFD,\n    0x7A02, 0x7A02, 0x224B, 0x7A03, 0x7A03, 0x224D, 0x7A04, 0x7A04, 0x224F,\n    0x7A05, 0x7A05, 0x0CFC, 0x7A06, 0x7A06, 0x471E, 0x7A08, 0x7A08, 0x0CFA,\n    0x7A0A, 0x7A0A, 0x224C, 0x7A0B, 0x7A0B, 0x0CFB, 0x7A0C, 0x7A0C, 0x224E,\n    0x7A0D, 0x7A0D, 0x0CF9, 0x7A10, 0x7A10, 0x24E9, 0x7A11, 0x7A11, 0x24E0,\n    0x7A12, 0x7A12, 0x24E3, 0x7A13, 0x7A13, 0x24E7, 0x7A14, 0x7A14, 0x0EB1,\n    0x7A15, 0x7A15, 0x24E5, 0x7A17, 0x7A17, 0x24E4, 0x7A18, 0x7A19, 0x24E1,\n    0x7A1A, 0x7A1A, 0x0EAF, 0x7A1B, 0x7A1B, 0x24E8, 0x7A1C, 0x7A1C, 0x0EAE,\n    0x7A1E, 0x7A1E, 0x0EB3, 0x7A1F, 0x7A1F, 0x0EB2, 0x7A20, 0x7A20, 0x0EB0,\n    0x7A22, 0x7A22, 0x24E6, 0x7A26, 0x7A26, 0x2765, 0x7A28, 0x7A28, 0x2764,\n    0x7A2B, 0x7A2B, 0x2760, 0x7A2D, 0x7A2D, 0x3FDA, 0x7A2E, 0x7A2E, 0x1047,\n    0x7A2F, 0x7A2F, 0x2763, 0x7A30, 0x7A30, 0x2762, 0x7A31, 0x7A31, 0x1048,\n    0x7A37, 0x7A37, 0x11C7, 0x7A39, 0x7A39, 0x29A3, 0x7A3A, 0x7A3A, 0x3B21,\n    0x7A3B, 0x7A3B, 0x11C8, 0x7A3C, 0x7A3C, 0x11C4, 0x7A3D, 0x7A3D, 0x11C6,\n    0x7A3E, 0x7A3E, 0x3F8B, 0x7A3F, 0x7A3F, 0x11C3, 0x7A40, 0x7A40, 0x11C5,\n    0x7A43, 0x7A43, 0x396C, 0x7A44, 0x7A44, 0x2BF6, 0x7A45, 0x7A45, 0x3DF1,\n    0x7A46, 0x7A46, 0x1312, 0x7A47, 0x7A47, 0x2BF8, 0x7A48, 0x7A48, 0x2BF7,\n    0x7A49, 0x7A49, 0x3733, 0x7A4A, 0x7A4A, 0x2761, 0x7A4B, 0x7A4B, 0x1314,\n    0x7A4C, 0x7A4C, 0x1313, 0x7A4D, 0x7A4E, 0x1310, 0x7A54, 0x7A54, 0x2DD3,\n    0x7A56, 0x7A56, 0x2DD1, 0x7A57, 0x7A57, 0x1426, 0x7A58, 0x7A58, 0x2DD2,\n    0x7A5A, 0x7A5A, 0x2DD4, 0x7A5B, 0x7A5B, 0x2DD0, 0x7A5C, 0x7A5C, 0x2DCF,\n    0x7A5F, 0x7A5F, 0x2F75, 0x7A60, 0x7A60, 0x1502, 0x7A61, 0x7A62, 0x1500,\n    0x7A65, 0x7A65, 0x3736, 0x7A67, 0x7A68, 0x30D1, 0x7A69, 0x7A69, 0x15A2,\n    0x7A6B, 0x7A6B, 0x15A1, 0x7A6C, 0x7A6D, 0x320B, 0x7A6E, 0x7A6E, 0x320A,\n    0x7A70, 0x7A71, 0x3399, 0x7A74, 0x7A74, 0x036C, 0x7A75, 0x7A75, 0x1811,\n    0x7A76, 0x7A76, 0x04FA, 0x7A78, 0x7A78, 0x1A22, 0x7A79, 0x7A79, 0x0665,\n    0x7A7A, 0x7A7A, 0x0664, 0x7A7B, 0x7A7B, 0x1A23, 0x7A7D, 0x7A7D, 0x3737,\n    0x7A7E, 0x7A7E, 0x1BB6, 0x7A7F, 0x7A7F, 0x07C8, 0x7A80, 0x7A80, 0x1BB5,\n    0x7A81, 0x7A81, 0x07C9, 0x7A83, 0x7A83, 0x3D7D, 0x7A84, 0x7A84, 0x0965,\n    0x7A85, 0x7A85, 0x1D86, 0x7A86, 0x7A86, 0x1D84, 0x7A87, 0x7A87, 0x1D8A,\n    0x7A88, 0x7A88, 0x0966, 0x7A89, 0x7A89, 0x1D85, 0x7A8A, 0x7A8A, 0x1D89,\n    0x7A8B, 0x7A8C, 0x1D87, 0x7A8F, 0x7A8F, 0x1FCA, 0x7A90, 0x7A90, 0x1FCC,\n    0x7A91, 0x7A91, 0x43D8, 0x7A92, 0x7A92, 0x0B46, 0x7A94, 0x7A94, 0x1FCB,\n    0x7A95, 0x7A95, 0x0B47, 0x7A96, 0x7A96, 0x0D00, 0x7A97, 0x7A97, 0x0CFF,\n    0x7A98, 0x7A98, 0x0CFE, 0x7A99, 0x7A99, 0x2250, 0x7A9E, 0x7A9E, 0x24EC,\n    0x7A9F, 0x7AA0, 0x0EB4, 0x7AA2, 0x7AA2, 0x24EB, 0x7AA3, 0x7AA3, 0x24EA,\n    0x7AA8, 0x7AA8, 0x2766, 0x7AA9, 0x7AA9, 0x104A, 0x7AAA, 0x7AAA, 0x1049,\n    0x7AAB, 0x7AAC, 0x2767, 0x7AAE, 0x7AAE, 0x11CA, 0x7AAF, 0x7AAF, 0x11C9,\n    0x7AB0, 0x7AB0, 0x373A, 0x7AB1, 0x7AB1, 0x2BFC, 0x7AB2, 0x7AB2, 0x29A4,\n    0x7AB3, 0x7AB3, 0x29A6, 0x7AB4, 0x7AB4, 0x29A5, 0x7AB5, 0x7AB5, 0x2BFB,\n    0x7AB6, 0x7AB6, 0x2BF9, 0x7AB7, 0x7AB7, 0x2BFD, 0x7AB8, 0x7AB8, 0x2BFA,\n    0x7ABA, 0x7ABA, 0x1315, 0x7ABB, 0x7ABB, 0x3739, 0x7ABC, 0x7ABC, 0x4721,\n    0x7ABE, 0x7ABE, 0x2DD5, 0x7ABF, 0x7ABF, 0x1427, 0x7AC0, 0x7AC1, 0x2DD6,\n    0x7AC2, 0x7AC3, 0x373B, 0x7AC4, 0x7AC5, 0x1503, 0x7AC7, 0x7AC7, 0x1628,\n    0x7AC8, 0x7AC8, 0x3D7F, 0x7AC9, 0x7AC9, 0x4570, 0x7ACA, 0x7ACA, 0x16FF,\n    0x7ACB, 0x7ACB, 0x036D, 0x7ACF, 0x7ACF, 0x4724, 0x7AD1, 0x7AD1, 0x1BB7,\n    0x7AD3, 0x7AD3, 0x3F8A, 0x7AD8, 0x7AD8, 0x1D8B, 0x7AD9, 0x7AD9, 0x0967,\n    0x7ADA, 0x7ADA, 0x3740, 0x7ADB, 0x7ADB, 0x4725, 0x7ADC, 0x7ADC, 0x3951,\n    0x7ADD, 0x7ADD, 0x3741, 0x7ADF, 0x7ADF, 0x0BDE, 0x7AE0, 0x7AE0, 0x0BDD,\n    0x7AE2, 0x7AE2, 0x3B33, 0x7AE3, 0x7AE3, 0x0D02, 0x7AE4, 0x7AE4, 0x2252,\n    0x7AE5, 0x7AE5, 0x0D01, 0x7AE6, 0x7AE6, 0x2251, 0x7AE7, 0x7AE7, 0x385D,\n    0x7AE9, 0x7AE9, 0x3831, 0x7AEA, 0x7AEA, 0x3742, 0x7AEB, 0x7AEB, 0x24ED,\n    0x7AED, 0x7AED, 0x104B, 0x7AEE, 0x7AEE, 0x2769, 0x7AEF, 0x7AEF, 0x104C,\n    0x7AF6, 0x7AF6, 0x1629, 0x7AF7, 0x7AF7, 0x320D, 0x7AF9, 0x7AF9, 0x03F6,\n    0x7AFA, 0x7AFA, 0x0666, 0x7AFB, 0x7AFB, 0x1A24, 0x7AFD, 0x7AFD, 0x07CB,\n    0x7AFE, 0x7AFE, 0x3B3D, 0x7AFF, 0x7AFF, 0x07CA, 0x7B00, 0x7B01, 0x1BB8,\n    0x7B04, 0x7B04, 0x1D8D, 0x7B05, 0x7B05, 0x1D8F, 0x7B06, 0x7B06, 0x0968,\n    0x7B08, 0x7B08, 0x1D91, 0x7B09, 0x7B09, 0x1D94, 0x7B0A, 0x7B0A, 0x1D92,\n    0x7B0B, 0x7B0B, 0x3746, 0x7B0C, 0x7B0C, 0x3B63, 0x7B0E, 0x7B0E, 0x1D93,\n    0x7B0F, 0x7B0F, 0x1D90, 0x7B10, 0x7B10, 0x1D8C, 0x7B11, 0x7B11, 0x0969,\n    0x7B12, 0x7B12, 0x1D95, 0x7B13, 0x7B13, 0x1D8E, 0x7B14, 0x7B14, 0x3F77,\n    0x7B18, 0x7B18, 0x1FD5, 0x7B19, 0x7B19, 0x0B4D, 0x7B1A, 0x7B1A, 0x1FDE,\n    0x7B1B, 0x7B1B, 0x0B4A, 0x7B1D, 0x7B1D, 0x1FD7, 0x7B1E, 0x7B1E, 0x0B4E,\n    0x7B1F, 0x7B1F, 0x3F11, 0x7B20, 0x7B20, 0x0B48, 0x7B22, 0x7B22, 0x1FD2,\n    0x7B23, 0x7B23, 0x1FDF, 0x7B24, 0x7B24, 0x1FD3, 0x7B25, 0x7B25, 0x1FD0,\n    0x7B26, 0x7B26, 0x0B4C, 0x7B27, 0x7B27, 0x3B5F, 0x7B28, 0x7B28, 0x0B49,\n    0x7B29, 0x7B29, 0x3748, 0x7B2A, 0x7B2A, 0x1FD6, 0x7B2B, 0x7B2B, 0x1FD9,\n    0x7B2C, 0x7B2C, 0x0B4B, 0x7B2D, 0x7B2D, 0x1FDA, 0x7B2E, 0x7B2E, 0x0B4F,\n    0x7B2F, 0x7B2F, 0x1FDB, 0x7B30, 0x7B30, 0x1FD1, 0x7B31, 0x7B31, 0x1FD8,\n    0x7B32, 0x7B32, 0x1FDC, 0x7B33, 0x7B33, 0x1FD4, 0x7B34, 0x7B34, 0x1FCF,\n    0x7B35, 0x7B35, 0x1FCD, 0x7B38, 0x7B38, 0x1FDD, 0x7B39, 0x7B39, 0x3D6E,\n    0x7B3B, 0x7B3B, 0x1FCE, 0x7B40, 0x7B40, 0x2259, 0x7B42, 0x7B42, 0x3DED,\n    0x7B43, 0x7B43, 0x3E25, 0x7B44, 0x7B44, 0x2255, 0x7B45, 0x7B45, 0x225B,\n    0x7B46, 0x7B46, 0x0D05, 0x7B47, 0x7B47, 0x2254, 0x7B48, 0x7B48, 0x2256,\n    0x7B49, 0x7B49, 0x0D03, 0x7B4A, 0x7B4A, 0x2253, 0x7B4B, 0x7B4B, 0x0D0A,\n    0x7B4C, 0x7B4C, 0x2257, 0x7B4D, 0x7B4D, 0x0D09, 0x7B4E, 0x7B4E, 0x2258,\n    0x7B4F, 0x7B4F, 0x0D0B, 0x7B50, 0x7B50, 0x0D06, 0x7B51, 0x7B51, 0x0D0C,\n    0x7B52, 0x7B52, 0x0D07, 0x7B54, 0x7B54, 0x0D08, 0x7B55, 0x7B55, 0x3747,\n    0x7B56, 0x7B56, 0x0D04, 0x7B58, 0x7B58, 0x225A, 0x7B60, 0x7B60, 0x0EB8,\n    0x7B61, 0x7B61, 0x24F8, 0x7B62, 0x7B62, 0x4727, 0x7B63, 0x7B63, 0x24FB,\n    0x7B64, 0x7B64, 0x24EF, 0x7B65, 0x7B65, 0x24F4, 0x7B66, 0x7B66, 0x24EE,\n    0x7B67, 0x7B67, 0x0EBA, 0x7B69, 0x7B69, 0x24F2, 0x7B6C, 0x7B6C, 0x4728,\n    0x7B6D, 0x7B6D, 0x24F0, 0x7B6E, 0x7B6E, 0x0EB9, 0x7B6F, 0x7B6F, 0x374C,\n    0x7B70, 0x7B70, 0x24F7, 0x7B71, 0x7B71, 0x24F6, 0x7B72, 0x7B72, 0x24F3,\n    0x7B73, 0x7B73, 0x24F5, 0x7B74, 0x7B74, 0x24F1, 0x7B75, 0x7B75, 0x1050,\n    0x7B76, 0x7B76, 0x24FA, 0x7B77, 0x7B77, 0x0EB6, 0x7B78, 0x7B78, 0x24F9,\n    0x7B7B, 0x7B7B, 0x4729, 0x7B82, 0x7B82, 0x2779, 0x7B84, 0x7B84, 0x1057,\n    0x7B85, 0x7B85, 0x2774, 0x7B87, 0x7B87, 0x1056, 0x7B88, 0x7B88, 0x276A,\n    0x7B8A, 0x7B8A, 0x276C, 0x7B8B, 0x7B8B, 0x104F, 0x7B8C, 0x7B8C, 0x2771,\n    0x7B8D, 0x7B8D, 0x2770, 0x7B8E, 0x7B8E, 0x2773, 0x7B8F, 0x7B8F, 0x1054,\n    0x7B90, 0x7B90, 0x276E, 0x7B91, 0x7B91, 0x276D, 0x7B92, 0x7B92, 0x3752,\n    0x7B94, 0x7B94, 0x1053, 0x7B95, 0x7B95, 0x104E, 0x7B96, 0x7B96, 0x276F,\n    0x7B97, 0x7B97, 0x1051, 0x7B98, 0x7B98, 0x2775, 0x7B99, 0x7B99, 0x2777,\n    0x7B9B, 0x7B9B, 0x2772, 0x7B9C, 0x7B9C, 0x276B, 0x7B9D, 0x7B9D, 0x1052,\n    0x7BA0, 0x7BA0, 0x11D2, 0x7BA1, 0x7BA1, 0x104D, 0x7BA2, 0x7BA2, 0x374B,\n    0x7BA3, 0x7BA3, 0x3F14, 0x7BA4, 0x7BA4, 0x2778, 0x7BAC, 0x7BAC, 0x29AA,\n    0x7BAD, 0x7BAD, 0x11CB, 0x7BAF, 0x7BAF, 0x29AC, 0x7BB1, 0x7BB1, 0x11CC,\n    0x7BB2, 0x7BB2, 0x461C, 0x7BB4, 0x7BB4, 0x11CE, 0x7BB5, 0x7BB5, 0x29AF,\n    0x7BB7, 0x7BB7, 0x29A7, 0x7BB8, 0x7BB8, 0x1055, 0x7BB9, 0x7BB9, 0x29AD,\n    0x7BBE, 0x7BBE, 0x29A9, 0x7BC0, 0x7BC0, 0x0EB7, 0x7BC1, 0x7BC1, 0x11D1,\n    0x7BC4, 0x7BC4, 0x11CD, 0x7BC6, 0x7BC7, 0x11CF, 0x7BC9, 0x7BC9, 0x1318,\n    0x7BCA, 0x7BCA, 0x29AE, 0x7BCB, 0x7BCB, 0x29A8, 0x7BCC, 0x7BCC, 0x11D3,\n    0x7BCE, 0x7BCE, 0x29AB, 0x7BCF, 0x7BCF, 0x3F18, 0x7BD0, 0x7BD0, 0x3750,\n    0x7BD4, 0x7BD4, 0x2C07, 0x7BD5, 0x7BD5, 0x2C02, 0x7BD8, 0x7BD8, 0x2C0C,\n    0x7BD9, 0x7BD9, 0x1316, 0x7BDA, 0x7BDA, 0x2C04, 0x7BDB, 0x7BDB, 0x131A,\n    0x7BDC, 0x7BDC, 0x2C0A, 0x7BDD, 0x7BDD, 0x2C01, 0x7BDE, 0x7BDE, 0x2BFE,\n    0x7BDF, 0x7BDF, 0x2C0D, 0x7BE0, 0x7BE0, 0x142D, 0x7BE1, 0x7BE1, 0x131B,\n    0x7BE2, 0x7BE2, 0x2C09, 0x7BE3, 0x7BE3, 0x2BFF, 0x7BE4, 0x7BE4, 0x1319,\n    0x7BE5, 0x7BE5, 0x2C03, 0x7BE6, 0x7BE6, 0x131D, 0x7BE7, 0x7BE7, 0x2C00,\n    0x7BE8, 0x7BE8, 0x2C05, 0x7BE9, 0x7BE9, 0x131C, 0x7BEA, 0x7BEA, 0x2C08,\n    0x7BEB, 0x7BEB, 0x2C0B, 0x7BF0, 0x7BF1, 0x2DE9, 0x7BF2, 0x7BF2, 0x2DDA,\n    0x7BF3, 0x7BF3, 0x2DE1, 0x7BF4, 0x7BF4, 0x2DDF, 0x7BF7, 0x7BF7, 0x142B,\n    0x7BF8, 0x7BF8, 0x2DE6, 0x7BF9, 0x7BF9, 0x2C06, 0x7BFA, 0x7BFA, 0x3757,\n    0x7BFB, 0x7BFB, 0x2DDD, 0x7BFC, 0x7BFC, 0x3F1F, 0x7BFD, 0x7BFD, 0x2DE7,\n    0x7BFE, 0x7BFE, 0x142A, 0x7BFF, 0x7BFF, 0x2DDC, 0x7C00, 0x7C00, 0x2DDB,\n    0x7C01, 0x7C01, 0x2DE5, 0x7C02, 0x7C02, 0x2DE2, 0x7C03, 0x7C03, 0x2DE4,\n    0x7C05, 0x7C05, 0x2DD8, 0x7C06, 0x7C06, 0x2DE8, 0x7C07, 0x7C07, 0x1428,\n    0x7C09, 0x7C09, 0x2DE3, 0x7C0A, 0x7C0A, 0x2DEC, 0x7C0B, 0x7C0B, 0x2DE0,\n    0x7C0C, 0x7C0C, 0x142C, 0x7C0D, 0x7C0D, 0x1429, 0x7C0E, 0x7C0E, 0x2DDE,\n    0x7C0F, 0x7C0F, 0x2DD9, 0x7C10, 0x7C10, 0x2DEB, 0x7C11, 0x7C11, 0x1317,\n    0x7C12, 0x7C12, 0x472A, 0x7C15, 0x7C15, 0x4061, 0x7C19, 0x7C19, 0x2F78,\n    0x7C1B, 0x7C1B, 0x43D9, 0x7C1C, 0x7C1C, 0x2F76, 0x7C1D, 0x7C1D, 0x2F7C,\n    0x7C1E, 0x7C1E, 0x1508, 0x7C1F, 0x7C1F, 0x2F7A, 0x7C20, 0x7C20, 0x2F79,\n    0x7C21, 0x7C21, 0x150A, 0x7C22, 0x7C22, 0x2F7F, 0x7C23, 0x7C23, 0x1509,\n    0x7C25, 0x7C25, 0x2F80, 0x7C26, 0x7C26, 0x2F7D, 0x7C27, 0x7C27, 0x1506,\n    0x7C28, 0x7C28, 0x2F7E, 0x7C29, 0x7C29, 0x2F77, 0x7C2A, 0x7C2A, 0x1507,\n    0x7C2B, 0x7C2B, 0x1505, 0x7C2C, 0x7C2C, 0x30D6, 0x7C2D, 0x7C2D, 0x2F7B,\n    0x7C30, 0x7C30, 0x2F81, 0x7C33, 0x7C33, 0x30D3, 0x7C35, 0x7C35, 0x3759,\n    0x7C37, 0x7C37, 0x15A7, 0x7C38, 0x7C38, 0x15A5, 0x7C39, 0x7C39, 0x30D5,\n    0x7C3B, 0x7C3B, 0x30D7, 0x7C3C, 0x7C3C, 0x30D4, 0x7C3D, 0x7C3D, 0x15A6,\n    0x7C3E, 0x7C3F, 0x15A3, 0x7C40, 0x7C40, 0x15A8, 0x7C42, 0x7C42, 0x3F1C,\n    0x7C43, 0x7C43, 0x162B, 0x7C44, 0x7C44, 0x375B, 0x7C45, 0x7C45, 0x3212,\n    0x7C47, 0x7C47, 0x3211, 0x7C48, 0x7C48, 0x320F, 0x7C49, 0x7C49, 0x320E,\n    0x7C4A, 0x7C4A, 0x3210, 0x7C4C, 0x7C4C, 0x162A, 0x7C4D, 0x7C4D, 0x162C,\n    0x7C50, 0x7C50, 0x1681, 0x7C51, 0x7C51, 0x3FB8, 0x7C53, 0x7C53, 0x32EA,\n    0x7C54, 0x7C54, 0x32E9, 0x7C56, 0x7C56, 0x3EFF, 0x7C57, 0x7C57, 0x339B,\n    0x7C59, 0x7C59, 0x339D, 0x7C5A, 0x7C5A, 0x339F, 0x7C5B, 0x7C5B, 0x339E,\n    0x7C5C, 0x7C5C, 0x339C, 0x7C5D, 0x7C5D, 0x3B3F, 0x7C5F, 0x7C5F, 0x16D1,\n    0x7C60, 0x7C60, 0x16D0, 0x7C63, 0x7C63, 0x1701, 0x7C64, 0x7C64, 0x1700,\n    0x7C65, 0x7C65, 0x1702, 0x7C66, 0x7C66, 0x342B, 0x7C67, 0x7C67, 0x342A,\n    0x7C69, 0x7C69, 0x34D6, 0x7C6A, 0x7C6A, 0x3493, 0x7C6B, 0x7C6B, 0x34D7,\n    0x7C6C, 0x7C6C, 0x1745, 0x7C6D, 0x7C6D, 0x3B40, 0x7C6E, 0x7C6E, 0x1746,\n    0x7C6F, 0x7C6F, 0x3507, 0x7C70, 0x7C70, 0x3F52, 0x7C72, 0x7C72, 0x176B,\n    0x7C73, 0x7C73, 0x03F7, 0x7C74, 0x7C74, 0x469C, 0x7C75, 0x7C75, 0x1A25,\n    0x7C78, 0x7C79, 0x1BBB, 0x7C7A, 0x7C7A, 0x1BBA, 0x7C7B, 0x7C7B, 0x472D,\n    0x7C7C, 0x7C7C, 0x3B49, 0x7C7D, 0x7C7D, 0x07CC, 0x7C7E, 0x7C7E, 0x3F1A,\n    0x7C7F, 0x7C81, 0x1BBD, 0x7C83, 0x7C83, 0x375C, 0x7C84, 0x7C84, 0x1D96,\n    0x7C85, 0x7C85, 0x1D9C, 0x7C86, 0x7C86, 0x3F1D, 0x7C88, 0x7C88, 0x1D9A,\n    0x7C89, 0x7C89, 0x096A, 0x7C8A, 0x7C8A, 0x1D98, 0x7C8C, 0x7C8C, 0x1D99,\n    0x7C8D, 0x7C8D, 0x1D9B, 0x7C8E, 0x7C8E, 0x3B48, 0x7C91, 0x7C91, 0x1D97,\n    0x7C92, 0x7C92, 0x0B50, 0x7C94, 0x7C94, 0x1FE0, 0x7C95, 0x7C95, 0x0B52,\n    0x7C96, 0x7C96, 0x1FE2, 0x7C97, 0x7C97, 0x0B51, 0x7C98, 0x7C98, 0x1FE1,\n    0x7C9C, 0x7C9C, 0x472E, 0x7C9E, 0x7C9E, 0x225D, 0x7C9F, 0x7C9F, 0x0D0D,\n    0x7CA1, 0x7CA1, 0x225F, 0x7CA2, 0x7CA2, 0x225C, 0x7CA3, 0x7CA3, 0x1FE3,\n    0x7CA5, 0x7CA5, 0x0D0E, 0x7CA6, 0x7CA6, 0x375E, 0x7CA7, 0x7CA7, 0x36ED,\n    0x7CA8, 0x7CA8, 0x225E, 0x7CAC, 0x7CAC, 0x3885, 0x7CAE, 0x7CAE, 0x3B4A,\n    0x7CAF, 0x7CAF, 0x24FE, 0x7CB1, 0x7CB1, 0x0EBB, 0x7CB2, 0x7CB2, 0x24FC,\n    0x7CB3, 0x7CB3, 0x0EBC, 0x7CB4, 0x7CB4, 0x24FD, 0x7CB5, 0x7CB5, 0x0EBD,\n    0x7CB8, 0x7CB8, 0x4730, 0x7CB9, 0x7CB9, 0x1058, 0x7CBA, 0x7CBA, 0x277D,\n    0x7CBB, 0x7CBB, 0x277A, 0x7CBC, 0x7CBC, 0x277C, 0x7CBD, 0x7CBE, 0x1059,\n    0x7CBF, 0x7CBF, 0x277B, 0x7CC2, 0x7CC2, 0x3FD7, 0x7CC5, 0x7CC5, 0x29B0,\n    0x7CC7, 0x7CC7, 0x3761, 0x7CC8, 0x7CC8, 0x29B1, 0x7CC9, 0x7CC9, 0x3760,\n    0x7CCA, 0x7CCA, 0x11D4, 0x7CCB, 0x7CCB, 0x29B3, 0x7CCC, 0x7CCC, 0x29B2,\n    0x7CCD, 0x7CCD, 0x3B45, 0x7CCE, 0x7CCE, 0x0121, 0x7CD0, 0x7CD1, 0x2C11,\n    0x7CD2, 0x7CD2, 0x2C0E, 0x7CD3, 0x7CD3, 0x3D5C, 0x7CD4, 0x7CD4, 0x2C0F,\n    0x7CD5, 0x7CD6, 0x131E, 0x7CD7, 0x7CD7, 0x2C10, 0x7CD9, 0x7CD9, 0x1433,\n    0x7CDA, 0x7CDA, 0x3FD9, 0x7CDC, 0x7CDC, 0x142F, 0x7CDD, 0x7CDD, 0x1434,\n    0x7CDE, 0x7CDE, 0x1430, 0x7CDF, 0x7CDF, 0x1432, 0x7CE0, 0x7CE0, 0x142E,\n    0x7CE2, 0x7CE2, 0x1431, 0x7CE6, 0x7CE6, 0x3762, 0x7CE7, 0x7CE7, 0x150B,\n    0x7CE8, 0x7CE8, 0x2DED, 0x7CEA, 0x7CEA, 0x30D9, 0x7CEC, 0x7CEC, 0x30D8,\n    0x7CED, 0x7CED, 0x43DA, 0x7CEE, 0x7CEE, 0x3213, 0x7CEF, 0x7CF0, 0x162D,\n    0x7CF1, 0x7CF1, 0x33A1, 0x7CF2, 0x7CF2, 0x32EB, 0x7CF3, 0x7CF3, 0x3764,\n    0x7CF4, 0x7CF4, 0x33A0, 0x7CF5, 0x7CF5, 0x3765, 0x7CF6, 0x7CF6, 0x34D8,\n    0x7CF7, 0x7CF7, 0x351D, 0x7CF8, 0x7CF8, 0x03F8, 0x7CF9, 0x7CF9, 0x44F8,\n    0x7CFB, 0x7CFB, 0x04FB, 0x7CFC, 0x7CFC, 0x456D, 0x7CFD, 0x7CFD, 0x1A26,\n    0x7CFE, 0x7CFE, 0x0667, 0x7D00, 0x7D00, 0x07CF, 0x7D01, 0x7D01, 0x1BC2,\n    0x7D02, 0x7D02, 0x07CD, 0x7D03, 0x7D03, 0x1BC0, 0x7D04, 0x7D04, 0x07D2,\n    0x7D05, 0x7D05, 0x07CE, 0x7D06, 0x7D06, 0x07D3, 0x7D07, 0x7D07, 0x07D1,\n    0x7D08, 0x7D08, 0x1BC1, 0x7D09, 0x7D09, 0x07D0, 0x7D0A, 0x7D0A, 0x096E,\n    0x7D0B, 0x7D0B, 0x096D, 0x7D0C, 0x7D0C, 0x1DA7, 0x7D0D, 0x7D0D, 0x0976,\n    0x7D0E, 0x7D0E, 0x1DA0, 0x7D0F, 0x7D0F, 0x1DA6, 0x7D10, 0x7D10, 0x0972,\n    0x7D11, 0x7D11, 0x1D9F, 0x7D12, 0x7D12, 0x1DA5, 0x7D13, 0x7D13, 0x1DA3,\n    0x7D14, 0x7D14, 0x0971, 0x7D15, 0x7D15, 0x0973, 0x7D16, 0x7D16, 0x1DA2,\n    0x7D17, 0x7D17, 0x096C, 0x7D18, 0x7D18, 0x1DA1, 0x7D19, 0x7D19, 0x0977,\n    0x7D1A, 0x7D1A, 0x0974, 0x7D1B, 0x7D1B, 0x0978, 0x7D1C, 0x7D1C, 0x0975,\n    0x7D1D, 0x7D1D, 0x1D9E, 0x7D1E, 0x7D1E, 0x1D9D, 0x7D1F, 0x7D1F, 0x1DA4,\n    0x7D20, 0x7D20, 0x096F, 0x7D21, 0x7D21, 0x096B, 0x7D22, 0x7D22, 0x0970,\n    0x7D25, 0x7D25, 0x3EDE, 0x7D28, 0x7D28, 0x1FF2, 0x7D29, 0x7D29, 0x1FEB,\n    0x7D2B, 0x7D2B, 0x0D13, 0x7D2C, 0x7D2C, 0x1FEA, 0x7D2E, 0x7D2E, 0x0B56,\n    0x7D2F, 0x7D2F, 0x0B5D, 0x7D30, 0x7D30, 0x0B5A, 0x7D31, 0x7D31, 0x0B60,\n    0x7D32, 0x7D32, 0x0B5F, 0x7D33, 0x7D33, 0x0B5B, 0x7D35, 0x7D35, 0x1FE4,\n    0x7D36, 0x7D36, 0x1FE7, 0x7D38, 0x7D38, 0x1FE6, 0x7D39, 0x7D39, 0x0B57,\n    0x7D3A, 0x7D3A, 0x1FE8, 0x7D3B, 0x7D3B, 0x1FF1, 0x7D3C, 0x7D3C, 0x0B58,\n    0x7D3D, 0x7D3D, 0x1FE5, 0x7D3E, 0x7D3F, 0x1FEE, 0x7D40, 0x7D40, 0x0B59,\n    0x7D41, 0x7D41, 0x1FEC, 0x7D42, 0x7D42, 0x0B5E, 0x7D43, 0x7D43, 0x0B54,\n    0x7D44, 0x7D44, 0x0B5C, 0x7D45, 0x7D45, 0x1FE9, 0x7D46, 0x7D46, 0x0B53,\n    0x7D47, 0x7D47, 0x1FED, 0x7D4A, 0x7D4A, 0x1FF0, 0x7D4D, 0x7D4D, 0x3FDD,\n    0x7D4E, 0x7D4E, 0x2270, 0x7D4F, 0x7D4F, 0x2267, 0x7D50, 0x7D50, 0x0D10,\n    0x7D51, 0x7D51, 0x226E, 0x7D52, 0x7D52, 0x226B, 0x7D53, 0x7D53, 0x2263,\n    0x7D54, 0x7D54, 0x226C, 0x7D55, 0x7D55, 0x0D12, 0x7D56, 0x7D56, 0x2264,\n    0x7D58, 0x7D58, 0x2260, 0x7D5A, 0x7D5A, 0x3E93, 0x7D5B, 0x7D5B, 0x0EC3,\n    0x7D5C, 0x7D5C, 0x2269, 0x7D5D, 0x7D5D, 0x3769, 0x7D5E, 0x7D5E, 0x0D0F,\n    0x7D5F, 0x7D5F, 0x226F, 0x7D61, 0x7D61, 0x0D16, 0x7D62, 0x7D62, 0x0D18,\n    0x7D63, 0x7D63, 0x2262, 0x7D66, 0x7D66, 0x0D17, 0x7D67, 0x7D67, 0x2265,\n    0x7D68, 0x7D68, 0x0D11, 0x7D69, 0x7D69, 0x226D, 0x7D6A, 0x7D6A, 0x2266,\n    0x7D6B, 0x7D6B, 0x226A, 0x7D6D, 0x7D6D, 0x2268, 0x7D6E, 0x7D6E, 0x0D14,\n    0x7D6F, 0x7D6F, 0x2261, 0x7D70, 0x7D70, 0x0D19, 0x7D71, 0x7D71, 0x0B55,\n    0x7D72, 0x7D72, 0x0D15, 0x7D73, 0x7D73, 0x0D1A, 0x7D79, 0x7D79, 0x0EBF,\n    0x7D7A, 0x7D7A, 0x2505, 0x7D7B, 0x7D7B, 0x2507, 0x7D7C, 0x7D7C, 0x2509,\n    0x7D7D, 0x7D7D, 0x250D, 0x7D7F, 0x7D7F, 0x2503, 0x7D80, 0x7D80, 0x2501,\n    0x7D81, 0x7D81, 0x0EC1, 0x7D83, 0x7D83, 0x2508, 0x7D84, 0x7D84, 0x250C,\n    0x7D85, 0x7D85, 0x2504, 0x7D86, 0x7D86, 0x2500, 0x7D88, 0x7D88, 0x24FF,\n    0x7D89, 0x7D89, 0x376B, 0x7D8C, 0x7D8C, 0x250A, 0x7D8D, 0x7D8D, 0x2502,\n    0x7D8E, 0x7D8E, 0x2506, 0x7D8F, 0x7D8F, 0x0EC2, 0x7D91, 0x7D91, 0x0EC0,\n    0x7D92, 0x7D92, 0x250E, 0x7D93, 0x7D93, 0x0EBE, 0x7D94, 0x7D94, 0x250B,\n    0x7D96, 0x7D96, 0x278E, 0x7D97, 0x7D97, 0x3B53, 0x7D9C, 0x7D9C, 0x105D,\n    0x7D9D, 0x7D9D, 0x2786, 0x7D9E, 0x7D9E, 0x11E1, 0x7D9F, 0x7D9F, 0x2790,\n    0x7DA0, 0x7DA0, 0x1060, 0x7DA1, 0x7DA1, 0x2794, 0x7DA2, 0x7DA2, 0x1066,\n    0x7DA3, 0x7DA3, 0x2781, 0x7DA4, 0x7DA4, 0x46D7, 0x7DA6, 0x7DA6, 0x2791,\n    0x7DA7, 0x7DA7, 0x277E, 0x7DA8, 0x7DA8, 0x3C9C, 0x7DA9, 0x7DA9, 0x2793,\n    0x7DAA, 0x7DAA, 0x2782, 0x7DAB, 0x7DAB, 0x376C, 0x7DAC, 0x7DAC, 0x106D,\n    0x7DAD, 0x7DAD, 0x106A, 0x7DAE, 0x7DAE, 0x2792, 0x7DAF, 0x7DAF, 0x278C,\n    0x7DB0, 0x7DB0, 0x105C, 0x7DB1, 0x7DB1, 0x1064, 0x7DB2, 0x7DB2, 0x1063,\n    0x7DB3, 0x7DB3, 0x376E, 0x7DB4, 0x7DB4, 0x1062, 0x7DB5, 0x7DB5, 0x1068,\n    0x7DB7, 0x7DB7, 0x277F, 0x7DB8, 0x7DB8, 0x1069, 0x7DB9, 0x7DB9, 0x278D,\n    0x7DBA, 0x7DBA, 0x1065, 0x7DBB, 0x7DBB, 0x105B, 0x7DBC, 0x7DBC, 0x278F,\n    0x7DBD, 0x7DBE, 0x105E, 0x7DBF, 0x7DBF, 0x1067, 0x7DC0, 0x7DC0, 0x2784,\n    0x7DC1, 0x7DC1, 0x2783, 0x7DC2, 0x7DC2, 0x2780, 0x7DC4, 0x7DC4, 0x2788,\n    0x7DC5, 0x7DC5, 0x2785, 0x7DC6, 0x7DC6, 0x2789, 0x7DC7, 0x7DC7, 0x106C,\n    0x7DC9, 0x7DC9, 0x2795, 0x7DCA, 0x7DCA, 0x1061, 0x7DCB, 0x7DCC, 0x278A,\n    0x7DCD, 0x7DCD, 0x456E, 0x7DCE, 0x7DCE, 0x2787, 0x7DCF, 0x7DCF, 0x4735,\n    0x7DD0, 0x7DD0, 0x4737, 0x7DD2, 0x7DD2, 0x106B, 0x7DD3, 0x7DD3, 0x3B4E,\n    0x7DD4, 0x7DD4, 0x4736, 0x7DD6, 0x7DD6, 0x376F, 0x7DD7, 0x7DD7, 0x29B8,\n    0x7DD8, 0x7DD8, 0x11D9, 0x7DD9, 0x7DD9, 0x11E2, 0x7DDA, 0x7DDA, 0x11DE,\n    0x7DDB, 0x7DDB, 0x29B5, 0x7DDC, 0x7DDC, 0x3B4C, 0x7DDD, 0x7DDD, 0x11DB,\n    0x7DDE, 0x7DDE, 0x11DF, 0x7DDF, 0x7DDF, 0x29C1, 0x7DE0, 0x7DE0, 0x11D5,\n    0x7DE1, 0x7DE1, 0x29B9, 0x7DE3, 0x7DE3, 0x11DD, 0x7DE4, 0x7DE4, 0x3772,\n    0x7DE5, 0x7DE5, 0x3776, 0x7DE6, 0x7DE6, 0x29BC, 0x7DE7, 0x7DE7, 0x29B7,\n    0x7DE8, 0x7DE8, 0x11DC, 0x7DE9, 0x7DE9, 0x11E0, 0x7DEA, 0x7DEA, 0x29B6,\n    0x7DEC, 0x7DEC, 0x11DA, 0x7DEE, 0x7DEE, 0x29C0, 0x7DEF, 0x7DEF, 0x11D7,\n    0x7DF0, 0x7DF0, 0x29BF, 0x7DF1, 0x7DF1, 0x29BE, 0x7DF2, 0x7DF2, 0x11E3,\n    0x7DF3, 0x7DF3, 0x28C8, 0x7DF4, 0x7DF4, 0x11D6, 0x7DF5, 0x7DF5, 0x3774,\n    0x7DF6, 0x7DF6, 0x29BD, 0x7DF7, 0x7DF7, 0x29B4, 0x7DF9, 0x7DF9, 0x11E4,\n    0x7DFA, 0x7DFA, 0x29BB, 0x7DFB, 0x7DFB, 0x11D8, 0x7DFD, 0x7DFD, 0x4738,\n    0x7DFE, 0x7DFE, 0x3CCF, 0x7E03, 0x7E03, 0x29BA, 0x7E07, 0x7E07, 0x3B4D,\n    0x7E08, 0x7E08, 0x1322, 0x7E09, 0x7E09, 0x1327, 0x7E0A, 0x7E0A, 0x1320,\n    0x7E0B, 0x7E0B, 0x2C1F, 0x7E0C, 0x7E0C, 0x2C16, 0x7E0D, 0x7E0D, 0x2C22,\n    0x7E0E, 0x7E0E, 0x2C1A, 0x7E0F, 0x7E0F, 0x2C20, 0x7E10, 0x7E10, 0x1328,\n    0x7E11, 0x7E11, 0x1321, 0x7E12, 0x7E12, 0x2C13, 0x7E13, 0x7E13, 0x2C19,\n    0x7E14, 0x7E14, 0x2C23, 0x7E15, 0x7E15, 0x2C1C, 0x7E16, 0x7E16, 0x2C21,\n    0x7E17, 0x7E17, 0x2C15, 0x7E1A, 0x7E1A, 0x2C1D, 0x7E1B, 0x7E1B, 0x1323,\n    0x7E1C, 0x7E1C, 0x2C1B, 0x7E1D, 0x7E1D, 0x1326, 0x7E1E, 0x7E1E, 0x1325,\n    0x7E1F, 0x7E20, 0x2C17, 0x7E21, 0x7E21, 0x2C14, 0x7E22, 0x7E22, 0x2C1E,\n    0x7E23, 0x7E23, 0x1324, 0x7E24, 0x7E24, 0x2C25, 0x7E25, 0x7E25, 0x2C24,\n    0x7E27, 0x7E27, 0x377F, 0x7E29, 0x7E29, 0x2DF8, 0x7E2A, 0x7E2A, 0x2DF4,\n    0x7E2B, 0x7E2B, 0x143B, 0x7E2D, 0x7E2D, 0x2DEE, 0x7E2E, 0x7E2E, 0x1435,\n    0x7E2F, 0x7E2F, 0x1445, 0x7E30, 0x7E30, 0x2DFA, 0x7E31, 0x7E31, 0x143D,\n    0x7E32, 0x7E32, 0x1439, 0x7E33, 0x7E33, 0x2DF1, 0x7E34, 0x7E34, 0x1440,\n    0x7E35, 0x7E35, 0x1443, 0x7E36, 0x7E36, 0x2DFC, 0x7E37, 0x7E37, 0x1438,\n    0x7E38, 0x7E38, 0x2DF3, 0x7E39, 0x7E39, 0x1441, 0x7E3A, 0x7E3A, 0x2DFE,\n    0x7E3B, 0x7E3B, 0x2DFB, 0x7E3C, 0x7E3C, 0x2DEF, 0x7E3D, 0x7E3D, 0x143C,\n    0x7E3E, 0x7E3E, 0x1436, 0x7E3F, 0x7E3F, 0x1444, 0x7E40, 0x7E40, 0x2DF6,\n    0x7E41, 0x7E41, 0x143F, 0x7E42, 0x7E42, 0x2DF0, 0x7E43, 0x7E43, 0x143A,\n    0x7E44, 0x7E44, 0x2DFD, 0x7E45, 0x7E45, 0x143E, 0x7E46, 0x7E46, 0x1437,\n    0x7E47, 0x7E47, 0x2DF7, 0x7E48, 0x7E48, 0x1442, 0x7E49, 0x7E49, 0x2DF5,\n    0x7E4C, 0x7E4C, 0x2DF9, 0x7E50, 0x7E50, 0x2F83, 0x7E51, 0x7E51, 0x2F89,\n    0x7E52, 0x7E52, 0x1511, 0x7E53, 0x7E53, 0x2F8C, 0x7E54, 0x7E55, 0x150C,\n    0x7E56, 0x7E56, 0x2F84, 0x7E57, 0x7E57, 0x2F8B, 0x7E58, 0x7E58, 0x2F86,\n    0x7E59, 0x7E59, 0x1512, 0x7E5A, 0x7E5A, 0x150F, 0x7E5C, 0x7E5C, 0x2F82,\n    0x7E5E, 0x7E5E, 0x150E, 0x7E5F, 0x7E5F, 0x2F88, 0x7E60, 0x7E60, 0x2F8A,\n    0x7E61, 0x7E61, 0x1510, 0x7E62, 0x7E62, 0x2F87, 0x7E63, 0x7E63, 0x2F85,\n    0x7E65, 0x7E65, 0x46D2, 0x7E67, 0x7E67, 0x3766, 0x7E68, 0x7E68, 0x30E3,\n    0x7E69, 0x7E6A, 0x15AC, 0x7E6B, 0x7E6B, 0x15A9, 0x7E6D, 0x7E6D, 0x15AA,\n    0x7E6E, 0x7E6E, 0x377B, 0x7E6F, 0x7E6F, 0x30DF, 0x7E70, 0x7E70, 0x30DD,\n    0x7E72, 0x7E72, 0x30E1, 0x7E73, 0x7E73, 0x15AE, 0x7E74, 0x7E74, 0x30E2,\n    0x7E75, 0x7E75, 0x30DB, 0x7E76, 0x7E76, 0x30DA, 0x7E77, 0x7E77, 0x30DE,\n    0x7E78, 0x7E78, 0x30DC, 0x7E79, 0x7E79, 0x15AB, 0x7E7A, 0x7E7A, 0x30E0,\n    0x7E7B, 0x7E7B, 0x3214, 0x7E7C, 0x7E7C, 0x1631, 0x7E7D, 0x7E7D, 0x1630,\n    0x7E7E, 0x7E7E, 0x3215, 0x7E7F, 0x7E7F, 0x3E51, 0x7E80, 0x7E80, 0x3217,\n    0x7E81, 0x7E81, 0x3216, 0x7E82, 0x7E82, 0x1632, 0x7E86, 0x7E86, 0x32F0,\n    0x7E87, 0x7E88, 0x32ED, 0x7E8A, 0x7E8A, 0x32EC, 0x7E8B, 0x7E8B, 0x32EF,\n    0x7E8C, 0x7E8C, 0x1683, 0x7E8D, 0x7E8D, 0x32F1, 0x7E8E, 0x7E8E, 0x3EC9,\n    0x7E8F, 0x7E8F, 0x1682, 0x7E91, 0x7E91, 0x33A2, 0x7E92, 0x7E92, 0x469E,\n    0x7E93, 0x7E93, 0x1703, 0x7E94, 0x7E94, 0x1705, 0x7E95, 0x7E95, 0x342C,\n    0x7E96, 0x7E96, 0x1704, 0x7E97, 0x7E97, 0x3494, 0x7E98, 0x7E98, 0x34DA,\n    0x7E99, 0x7E99, 0x34DC, 0x7E9A, 0x7E9A, 0x34D9, 0x7E9B, 0x7E9B, 0x34DB,\n    0x7E9C, 0x7E9C, 0x1759, 0x7E9F, 0x7E9F, 0x48BB, 0x7EA4, 0x7EA4, 0x455B,\n    0x7EAC, 0x7EAC, 0x455C, 0x7EBA, 0x7EBA, 0x455D, 0x7EC7, 0x7EC7, 0x455E,\n    0x7ECF, 0x7ECF, 0x455F, 0x7EDF, 0x7EDF, 0x4560, 0x7F06, 0x7F06, 0x4561,\n    0x7F36, 0x7F36, 0x03F9, 0x7F37, 0x7F37, 0x4562, 0x7F38, 0x7F38, 0x07D4,\n    0x7F39, 0x7F39, 0x1D1F, 0x7F3A, 0x7F3A, 0x0979, 0x7F3D, 0x7F3D, 0x0B61,\n    0x7F3E, 0x7F3F, 0x2271, 0x7F40, 0x7F41, 0x3780, 0x7F43, 0x7F43, 0x2C26,\n    0x7F44, 0x7F44, 0x1446, 0x7F45, 0x7F45, 0x2DFF, 0x7F47, 0x7F47, 0x3782,\n    0x7F48, 0x7F48, 0x1513, 0x7F49, 0x7F49, 0x3E69, 0x7F4A, 0x7F4A, 0x30E5,\n    0x7F4B, 0x7F4B, 0x30E4, 0x7F4C, 0x7F4C, 0x1633, 0x7F4D, 0x7F4D, 0x32F2,\n    0x7F4E, 0x7F4E, 0x3B4F, 0x7F4F, 0x7F4F, 0x33A3, 0x7F50, 0x7F50, 0x1726,\n    0x7F51, 0x7F51, 0x1812, 0x7F52, 0x7F52, 0x44F6, 0x7F53, 0x7F53, 0x44F9,\n    0x7F54, 0x7F54, 0x0668, 0x7F55, 0x7F55, 0x04FC, 0x7F58, 0x7F58, 0x1BC3,\n    0x7F5B, 0x7F5B, 0x1DAD, 0x7F5C, 0x7F5C, 0x1DA8, 0x7F5D, 0x7F5D, 0x1DAC,\n    0x7F5E, 0x7F5E, 0x1DAA, 0x7F5F, 0x7F5F, 0x097A, 0x7F60, 0x7F60, 0x1DAB,\n    0x7F61, 0x7F61, 0x1DA9, 0x7F63, 0x7F63, 0x1FF3, 0x7F65, 0x7F66, 0x2273,\n    0x7F67, 0x7F68, 0x2511, 0x7F69, 0x7F6A, 0x0EC5, 0x7F6B, 0x7F6B, 0x2510,\n    0x7F6C, 0x7F6C, 0x2513, 0x7F6D, 0x7F6D, 0x250F, 0x7F6E, 0x7F6E, 0x0EC4,\n    0x7F70, 0x7F70, 0x106E, 0x7F71, 0x7F71, 0x4007, 0x7F72, 0x7F72, 0x0EC7,\n    0x7F73, 0x7F73, 0x2796, 0x7F75, 0x7F75, 0x11E5, 0x7F76, 0x7F76, 0x29C2,\n    0x7F77, 0x7F77, 0x11E6, 0x7F78, 0x7F78, 0x3F7B, 0x7F79, 0x7F79, 0x1329,\n    0x7F7A, 0x7F7A, 0x2C29, 0x7F7B, 0x7F7C, 0x2C27, 0x7F7D, 0x7F7D, 0x2E02,\n    0x7F7E, 0x7F7E, 0x2E01, 0x7F7F, 0x7F7F, 0x2E00, 0x7F83, 0x7F83, 0x30E6,\n    0x7F85, 0x7F85, 0x15AF, 0x7F86, 0x7F86, 0x30E7, 0x7F87, 0x7F87, 0x33A4,\n    0x7F88, 0x7F88, 0x1727, 0x7F89, 0x7F89, 0x3495, 0x7F8A, 0x7F8A, 0x03FA,\n    0x7F8B, 0x7F8B, 0x066A, 0x7F8C, 0x7F8C, 0x0669, 0x7F8D, 0x7F8D, 0x1BC5,\n    0x7F8E, 0x7F8E, 0x07D5, 0x7F8F, 0x7F8F, 0x421C, 0x7F91, 0x7F91, 0x1BC4,\n    0x7F92, 0x7F92, 0x1DAF, 0x7F93, 0x7F93, 0x43DB, 0x7F94, 0x7F94, 0x097B,\n    0x7F95, 0x7F95, 0x1FF4, 0x7F96, 0x7F96, 0x1DAE, 0x7F97, 0x7F97, 0x3786,\n    0x7F9A, 0x7F9A, 0x0B63, 0x7F9B, 0x7F9B, 0x1FF7, 0x7F9C, 0x7F9D, 0x1FF5,\n    0x7F9E, 0x7F9E, 0x0B62, 0x7FA0, 0x7FA1, 0x2276, 0x7FA2, 0x7FA2, 0x2275,\n    0x7FA3, 0x7FA3, 0x3788, 0x7FA4, 0x7FA4, 0x0ECA, 0x7FA5, 0x7FA5, 0x2515,\n    0x7FA6, 0x7FA6, 0x2514, 0x7FA7, 0x7FA7, 0x2516, 0x7FA8, 0x7FA8, 0x0EC9,\n    0x7FA9, 0x7FA9, 0x0EC8, 0x7FAC, 0x7FAC, 0x29C3, 0x7FAD, 0x7FAD, 0x29C5,\n    0x7FAE, 0x7FAE, 0x43DC, 0x7FAF, 0x7FAF, 0x11E7, 0x7FB0, 0x7FB0, 0x29C4,\n    0x7FB1, 0x7FB1, 0x2C2A, 0x7FB2, 0x7FB2, 0x132A, 0x7FB3, 0x7FB3, 0x2F8E,\n    0x7FB4, 0x7FB4, 0x4739, 0x7FB5, 0x7FB5, 0x2F8D, 0x7FB6, 0x7FB6, 0x15B0,\n    0x7FB7, 0x7FB7, 0x30E8, 0x7FB8, 0x7FB8, 0x15B2, 0x7FB9, 0x7FB9, 0x15B1,\n    0x7FBA, 0x7FBA, 0x3218, 0x7FBB, 0x7FBB, 0x32F3, 0x7FBC, 0x7FBC, 0x1684,\n    0x7FBD, 0x7FBD, 0x03FB, 0x7FBE, 0x7FBE, 0x1BC6, 0x7FBF, 0x7FBF, 0x07D6,\n    0x7FC0, 0x7FC0, 0x1DB2, 0x7FC1, 0x7FC1, 0x097D, 0x7FC2, 0x7FC2, 0x1DB1,\n    0x7FC3, 0x7FC3, 0x1DB0, 0x7FC5, 0x7FC5, 0x097C, 0x7FC7, 0x7FC7, 0x1FFD,\n    0x7FC9, 0x7FC9, 0x1FFF, 0x7FCA, 0x7FCB, 0x1FF8, 0x7FCC, 0x7FCC, 0x0B64,\n    0x7FCD, 0x7FCD, 0x1FFA, 0x7FCE, 0x7FCE, 0x0B65, 0x7FCF, 0x7FCF, 0x1FFE,\n    0x7FD0, 0x7FD1, 0x1FFB, 0x7FD2, 0x7FD2, 0x0B66, 0x7FD4, 0x7FD5, 0x0D1C,\n    0x7FD7, 0x7FD7, 0x2278, 0x7FDB, 0x7FDC, 0x2517, 0x7FDD, 0x7FDD, 0x3B5E,\n    0x7FDE, 0x7FDE, 0x279A, 0x7FDF, 0x7FDF, 0x1071, 0x7FE0, 0x7FE1, 0x106F,\n    0x7FE2, 0x7FE3, 0x2797, 0x7FE5, 0x7FE5, 0x2799, 0x7FE6, 0x7FE6, 0x29CA,\n    0x7FE7, 0x7FE7, 0x46E9, 0x7FE8, 0x7FE8, 0x29CB, 0x7FE9, 0x7FE9, 0x11E8,\n    0x7FEA, 0x7FEA, 0x29C8, 0x7FEB, 0x7FEB, 0x29C7, 0x7FEC, 0x7FEC, 0x29C9,\n    0x7FED, 0x7FED, 0x29C6, 0x7FEE, 0x7FEE, 0x132D, 0x7FEF, 0x7FEF, 0x2C2B,\n    0x7FF0, 0x7FF1, 0x132B, 0x7FF2, 0x7FF2, 0x2E04, 0x7FF3, 0x7FF3, 0x1447,\n    0x7FF4, 0x7FF4, 0x2E03, 0x7FF5, 0x7FF5, 0x2EFF, 0x7FF7, 0x7FF8, 0x2F8F,\n    0x7FF9, 0x7FF9, 0x1514, 0x7FFA, 0x7FFA, 0x378E, 0x7FFB, 0x7FFB, 0x1515,\n    0x7FFC, 0x7FFC, 0x1448, 0x7FFD, 0x7FFE, 0x30E9, 0x7FFF, 0x7FFF, 0x3219,\n    0x8000, 0x8000, 0x1634, 0x8001, 0x8001, 0x03FC, 0x8002, 0x8002, 0x44FD,\n    0x8003, 0x8003, 0x03FD, 0x8004, 0x8004, 0x097F, 0x8005, 0x8005, 0x066B,\n    0x8006, 0x8006, 0x097E, 0x8007, 0x8007, 0x1BC7, 0x8008, 0x8008, 0x3791,\n    0x800B, 0x800B, 0x0D1E, 0x800C, 0x800C, 0x03FE, 0x800D, 0x800D, 0x07D8,\n    0x800E, 0x800F, 0x1BC8, 0x8010, 0x8010, 0x07D7, 0x8011, 0x8011, 0x07D9,\n    0x8012, 0x8012, 0x03FF, 0x8014, 0x8014, 0x1BCA, 0x8015, 0x8015, 0x0981,\n    0x8016, 0x8016, 0x1DB3, 0x8017, 0x8017, 0x0983, 0x8018, 0x8018, 0x0980,\n    0x8019, 0x8019, 0x0982, 0x801B, 0x801B, 0x2002, 0x801C, 0x801C, 0x0B67,\n    0x801D, 0x801D, 0x3792, 0x801E, 0x801E, 0x2001, 0x801F, 0x801F, 0x2000,\n    0x8020, 0x8020, 0x473C, 0x8021, 0x8021, 0x2519, 0x8024, 0x8024, 0x279B,\n    0x8025, 0x8025, 0x473D, 0x8026, 0x8026, 0x11E9, 0x8028, 0x8028, 0x132E,\n    0x8029, 0x8029, 0x2C2D, 0x802A, 0x802A, 0x2C2C, 0x802C, 0x802C, 0x2E05,\n    0x802E, 0x802E, 0x473E, 0x802F, 0x802F, 0x3794, 0x8030, 0x8030, 0x32F4,\n    0x8031, 0x8031, 0x473F, 0x8033, 0x8033, 0x0400, 0x8034, 0x8034, 0x18D8,\n    0x8035, 0x8035, 0x1A27, 0x8036, 0x8036, 0x07DA, 0x8037, 0x8037, 0x1BCB,\n    0x8039, 0x8039, 0x1DB5, 0x803B, 0x803C, 0x3797, 0x803D, 0x803D, 0x0984,\n    0x803E, 0x803E, 0x1DB4, 0x803F, 0x803F, 0x0985, 0x8043, 0x8043, 0x2004,\n    0x8046, 0x8046, 0x0B69, 0x8047, 0x8047, 0x2003, 0x8048, 0x8048, 0x2005,\n    0x804A, 0x804A, 0x0B68, 0x804F, 0x8050, 0x227A, 0x8051, 0x8051, 0x2279,\n    0x8052, 0x8052, 0x0D1F, 0x8054, 0x8054, 0x4740, 0x8056, 0x8056, 0x0ECB,\n    0x8058, 0x8058, 0x0ECC, 0x805A, 0x805A, 0x1073, 0x805B, 0x805B, 0x3FE5,\n    0x805C, 0x805C, 0x279D, 0x805D, 0x805D, 0x279C, 0x805E, 0x805E, 0x1072,\n    0x8061, 0x8061, 0x3799, 0x8062, 0x8062, 0x3FE3, 0x8063, 0x8063, 0x3FDC,\n    0x8064, 0x8064, 0x29CC, 0x8066, 0x8066, 0x3FDB, 0x8067, 0x8067, 0x29CD,\n    0x806C, 0x806C, 0x2C2E, 0x806F, 0x806F, 0x144C, 0x8070, 0x8070, 0x144B,\n    0x8071, 0x8072, 0x1449, 0x8073, 0x8073, 0x144D, 0x8075, 0x8075, 0x2F91,\n    0x8076, 0x8076, 0x1517, 0x8077, 0x8077, 0x1516, 0x8078, 0x8078, 0x30EB,\n    0x8079, 0x8079, 0x321A, 0x807D, 0x807D, 0x16D3, 0x807E, 0x807E, 0x16D2,\n    0x807F, 0x807F, 0x0401, 0x8080, 0x8080, 0x44FE, 0x8082, 0x8082, 0x1CEC,\n    0x8084, 0x8084, 0x0ECE, 0x8085, 0x8085, 0x0D20, 0x8086, 0x8086, 0x0ECD,\n    0x8087, 0x8087, 0x1074, 0x8089, 0x8089, 0x0402, 0x808A, 0x808A, 0x17B3,\n    0x808B, 0x808C, 0x0403, 0x808F, 0x808F, 0x1A28, 0x8090, 0x8090, 0x18DB,\n    0x8092, 0x8092, 0x18DC, 0x8093, 0x8093, 0x04FE, 0x8095, 0x8095, 0x18D9,\n    0x8096, 0x8096, 0x04FD, 0x8098, 0x8098, 0x0500, 0x8099, 0x8099, 0x18DA,\n    0x809A, 0x809A, 0x0502, 0x809B, 0x809B, 0x0501, 0x809C, 0x809C, 0x18DD,\n    0x809D, 0x809D, 0x04FF, 0x809F, 0x809F, 0x4576, 0x80A1, 0x80A1, 0x0670,\n    0x80A2, 0x80A2, 0x066E, 0x80A3, 0x80A3, 0x1A2A, 0x80A5, 0x80A5, 0x066D,\n    0x80A7, 0x80A7, 0x37A0, 0x80A9, 0x80A9, 0x0672, 0x80AA, 0x80AA, 0x0674,\n    0x80AB, 0x80AB, 0x0671, 0x80AD, 0x80AD, 0x1A2D, 0x80AE, 0x80AE, 0x1A29,\n    0x80AF, 0x80AF, 0x0675, 0x80B1, 0x80B1, 0x066F, 0x80B2, 0x80B2, 0x0503,\n    0x80B4, 0x80B4, 0x0673, 0x80B5, 0x80B5, 0x1A2C, 0x80B6, 0x80B6, 0x3EAE,\n    0x80B7, 0x80B7, 0x4743, 0x80B8, 0x80B8, 0x1A2B, 0x80BA, 0x80BA, 0x066C,\n    0x80BC, 0x80BC, 0x4572, 0x80BD, 0x80BD, 0x3E7B, 0x80C2, 0x80C2, 0x1BD1,\n    0x80C3, 0x80C4, 0x07DE, 0x80C5, 0x80C5, 0x1BD3, 0x80C6, 0x80C6, 0x3B74,\n    0x80C7, 0x80C7, 0x1BCD, 0x80C8, 0x80C8, 0x1BD0, 0x80C9, 0x80C9, 0x1BD9,\n    0x80CA, 0x80CA, 0x1BD7, 0x80CC, 0x80CC, 0x07E0, 0x80CD, 0x80CD, 0x1BDD,\n    0x80CE, 0x80CE, 0x07E3, 0x80CF, 0x80CF, 0x1BDA, 0x80D0, 0x80D0, 0x1BD2,\n    0x80D1, 0x80D1, 0x1BCF, 0x80D4, 0x80D4, 0x227D, 0x80D5, 0x80D5, 0x1BD8,\n    0x80D6, 0x80D6, 0x07DB, 0x80D7, 0x80D7, 0x1BDB, 0x80D8, 0x80D8, 0x1BCC,\n    0x80D9, 0x80D9, 0x1BD5, 0x80DA, 0x80DA, 0x07DD, 0x80DB, 0x80DB, 0x07E2,\n    0x80DC, 0x80DC, 0x1BD6, 0x80DD, 0x80DD, 0x07E6, 0x80DE, 0x80DE, 0x07E4,\n    0x80E0, 0x80E0, 0x1BCE, 0x80E1, 0x80E1, 0x07E1, 0x80E3, 0x80E3, 0x1BD4,\n    0x80E4, 0x80E4, 0x07E5, 0x80E5, 0x80E5, 0x07DC, 0x80E6, 0x80E6, 0x1BDC,\n    0x80E9, 0x80E9, 0x4744, 0x80EC, 0x80EC, 0x45E9, 0x80ED, 0x80ED, 0x098A,\n    0x80EF, 0x80EF, 0x0993, 0x80F0, 0x80F0, 0x0988, 0x80F1, 0x80F1, 0x0986,\n    0x80F2, 0x80F2, 0x1DB7, 0x80F3, 0x80F3, 0x098E, 0x80F4, 0x80F4, 0x098B,\n    0x80F5, 0x80F5, 0x1DB9, 0x80F6, 0x80F6, 0x4574, 0x80F8, 0x80F8, 0x098D,\n    0x80F9, 0x80F9, 0x1DB8, 0x80FA, 0x80FA, 0x1DB6, 0x80FB, 0x80FB, 0x1DBB,\n    0x80FC, 0x80FC, 0x0992, 0x80FD, 0x80FD, 0x0990, 0x80FE, 0x80FE, 0x227C,\n    0x8100, 0x8100, 0x1DBC, 0x8101, 0x8101, 0x1DBA, 0x8102, 0x8102, 0x0987,\n    0x8103, 0x8103, 0x3FE7, 0x8105, 0x8105, 0x0989, 0x8106, 0x8106, 0x098C,\n    0x8107, 0x8107, 0x37A2, 0x8108, 0x8108, 0x098F, 0x8109, 0x8109, 0x3B75,\n    0x810A, 0x810A, 0x0991, 0x810C, 0x810C, 0x4746, 0x810E, 0x810E, 0x4747,\n    0x8112, 0x8112, 0x4748, 0x8114, 0x8114, 0x4749, 0x8115, 0x8115, 0x200F,\n    0x8116, 0x8116, 0x0B6B, 0x8117, 0x8117, 0x3E6D, 0x8118, 0x8118, 0x2006,\n    0x8119, 0x8119, 0x2008, 0x811A, 0x811A, 0x37A3, 0x811B, 0x811B, 0x2009,\n    0x811D, 0x811D, 0x2011, 0x811E, 0x811E, 0x200D, 0x811F, 0x811F, 0x200B,\n    0x8121, 0x8121, 0x200E, 0x8122, 0x8122, 0x2012, 0x8123, 0x8123, 0x0B6C,\n    0x8124, 0x8124, 0x0B70, 0x8125, 0x8125, 0x2007, 0x8127, 0x8127, 0x2010,\n    0x8129, 0x8129, 0x0B6E, 0x812A, 0x812A, 0x3A39, 0x812B, 0x812B, 0x0B6D,\n    0x812C, 0x812C, 0x200C, 0x812D, 0x812D, 0x200A, 0x812F, 0x812F, 0x0B6A,\n    0x8130, 0x8130, 0x0B6F, 0x8132, 0x8132, 0x3E79, 0x8134, 0x8134, 0x45EC,\n    0x8137, 0x8137, 0x3B72, 0x8139, 0x8139, 0x0D26, 0x813A, 0x813A, 0x2285,\n    0x813D, 0x813D, 0x2283, 0x813E, 0x813E, 0x0D28, 0x8142, 0x8142, 0x3B76,\n    0x8143, 0x8143, 0x227E, 0x8144, 0x8144, 0x2527, 0x8146, 0x8146, 0x0D27,\n    0x8147, 0x8147, 0x2282, 0x8148, 0x8148, 0x3E76, 0x814A, 0x814A, 0x227F,\n    0x814B, 0x814B, 0x0D23, 0x814C, 0x814C, 0x0D29, 0x814D, 0x814D, 0x2284,\n    0x814E, 0x814E, 0x0D25, 0x814F, 0x814F, 0x2281, 0x8150, 0x8150, 0x1075,\n    0x8151, 0x8151, 0x0D24, 0x8152, 0x8152, 0x2280, 0x8153, 0x8153, 0x0D2A,\n    0x8154, 0x8154, 0x0D22, 0x8155, 0x8155, 0x0D21, 0x8156, 0x8156, 0x474C,\n    0x8159, 0x815A, 0x474D, 0x815B, 0x815B, 0x251F, 0x815C, 0x815C, 0x251D,\n    0x815E, 0x815E, 0x2523, 0x8160, 0x8160, 0x251B, 0x8161, 0x8161, 0x2528,\n    0x8162, 0x8162, 0x2520, 0x8164, 0x8164, 0x251A, 0x8165, 0x8165, 0x0ED2,\n    0x8166, 0x8166, 0x0ED8, 0x8167, 0x8167, 0x2525, 0x8169, 0x8169, 0x251E,\n    0x816B, 0x816B, 0x0ED5, 0x816D, 0x816D, 0x43C4, 0x816E, 0x816E, 0x0ED3,\n    0x816F, 0x816F, 0x2526, 0x8170, 0x8170, 0x0ED0, 0x8171, 0x8171, 0x0ECF,\n    0x8172, 0x8172, 0x2521, 0x8173, 0x8173, 0x0ED4, 0x8174, 0x8174, 0x0D2B,\n    0x8176, 0x8176, 0x2524, 0x8177, 0x8177, 0x251C, 0x8178, 0x8178, 0x0ED1,\n    0x8179, 0x817A, 0x0ED6, 0x817C, 0x817C, 0x4750, 0x817F, 0x817F, 0x107A,\n    0x8180, 0x8180, 0x1076, 0x8182, 0x8182, 0x107B, 0x8183, 0x8183, 0x27A0,\n    0x8184, 0x8184, 0x43C5, 0x8186, 0x8186, 0x279F, 0x8187, 0x8187, 0x27A1,\n    0x8188, 0x8188, 0x1078, 0x8189, 0x8189, 0x279E, 0x818A, 0x818A, 0x1079,\n    0x818B, 0x818B, 0x27A4, 0x818C, 0x818C, 0x27A3, 0x818D, 0x818D, 0x27A2,\n    0x818F, 0x818F, 0x1077, 0x8193, 0x8193, 0x43C6, 0x8195, 0x8195, 0x29D1,\n    0x8197, 0x8197, 0x29D4, 0x8198, 0x8198, 0x11EF, 0x8199, 0x8199, 0x29D3,\n    0x819A, 0x819A, 0x11EE, 0x819B, 0x819D, 0x11EA, 0x819E, 0x819E, 0x29D0,\n    0x819F, 0x819F, 0x29CF, 0x81A0, 0x81A0, 0x11ED, 0x81A2, 0x81A2, 0x29D2,\n    0x81A3, 0x81A3, 0x29CE, 0x81A5, 0x81A5, 0x4753, 0x81A6, 0x81A6, 0x2C30,\n    0x81A7, 0x81A7, 0x2C3A, 0x81A8, 0x81A8, 0x1331, 0x81A9, 0x81A9, 0x1330,\n    0x81AA, 0x81AA, 0x4364, 0x81AB, 0x81AB, 0x2C34, 0x81AC, 0x81AC, 0x2C36,\n    0x81AE, 0x81AE, 0x2C31, 0x81B0, 0x81B0, 0x2C35, 0x81B1, 0x81B1, 0x2C2F,\n    0x81B2, 0x81B2, 0x2C38, 0x81B3, 0x81B3, 0x132F, 0x81B4, 0x81B4, 0x2C37,\n    0x81B5, 0x81B5, 0x2C33, 0x81B6, 0x81B6, 0x3EB2, 0x81B7, 0x81B7, 0x2C39,\n    0x81B9, 0x81B9, 0x2C32, 0x81BA, 0x81BA, 0x1450, 0x81BB, 0x81BB, 0x2E06,\n    0x81BC, 0x81BC, 0x2E0C, 0x81BD, 0x81BD, 0x1454, 0x81BE, 0x81BE, 0x1456,\n    0x81BF, 0x81BF, 0x1453, 0x81C0, 0x81C0, 0x1452, 0x81C1, 0x81C1, 0x4755,\n    0x81C2, 0x81C2, 0x1451, 0x81C3, 0x81C3, 0x144F, 0x81C4, 0x81C4, 0x2E07,\n    0x81C5, 0x81C5, 0x2E0A, 0x81C6, 0x81C6, 0x144E, 0x81C7, 0x81C7, 0x2E0B,\n    0x81C8, 0x81C8, 0x3FEE, 0x81C9, 0x81C9, 0x1455, 0x81CA, 0x81CA, 0x2E09,\n    0x81CC, 0x81CC, 0x2E08, 0x81CD, 0x81CD, 0x1518, 0x81CF, 0x81CF, 0x1519,\n    0x81D0, 0x81D0, 0x2F94, 0x81D1, 0x81D2, 0x2F92, 0x81D5, 0x81D5, 0x30ED,\n    0x81D7, 0x81D7, 0x30EC, 0x81D8, 0x81D8, 0x15B3, 0x81D9, 0x81D9, 0x321C,\n    0x81DA, 0x81DA, 0x1635, 0x81DB, 0x81DB, 0x321B, 0x81DD, 0x81DD, 0x32F5,\n    0x81DE, 0x81DE, 0x33A5, 0x81DF, 0x81DF, 0x16D4, 0x81E0, 0x81E1, 0x34DD,\n    0x81E2, 0x81E2, 0x1706, 0x81E3, 0x81E3, 0x0405, 0x81E4, 0x81E4, 0x4756,\n    0x81E5, 0x81E5, 0x0676, 0x81E6, 0x81E6, 0x2286, 0x81E7, 0x81E7, 0x107C,\n    0x81E8, 0x81E8, 0x1457, 0x81E9, 0x81E9, 0x2E0D, 0x81EA, 0x81EA, 0x0406,\n    0x81EC, 0x81EC, 0x0995, 0x81ED, 0x81ED, 0x0994, 0x81EE, 0x81EE, 0x2287,\n    0x81EF, 0x81EF, 0x42D1, 0x81F2, 0x81F2, 0x2C3B, 0x81F3, 0x81F3, 0x0407,\n    0x81F4, 0x81F4, 0x07E7, 0x81F6, 0x81F6, 0x3D61, 0x81F7, 0x81F9, 0x2288,\n    0x81FA, 0x81FA, 0x107D, 0x81FB, 0x81FB, 0x1332, 0x81FC, 0x81FC, 0x0408,\n    0x81FE, 0x81FE, 0x0677, 0x81FF, 0x81FF, 0x1BDE, 0x8200, 0x8200, 0x0996,\n    0x8201, 0x8201, 0x1DBD, 0x8202, 0x8202, 0x0B71, 0x8204, 0x8204, 0x228B,\n    0x8205, 0x8205, 0x0ED9, 0x8207, 0x8207, 0x107E, 0x8208, 0x8208, 0x1333,\n    0x8209, 0x8209, 0x1458, 0x820A, 0x820A, 0x151A, 0x820B, 0x820B, 0x30EE,\n    0x820C, 0x820C, 0x0409, 0x820D, 0x820D, 0x0678, 0x8210, 0x8210, 0x0997,\n    0x8211, 0x8211, 0x2013, 0x8212, 0x8212, 0x0D2C, 0x8214, 0x8214, 0x107F,\n    0x8215, 0x8215, 0x27A5, 0x8216, 0x8216, 0x29D5, 0x8218, 0x8218, 0x37AA,\n    0x821A, 0x821A, 0x3FE1, 0x821B, 0x821B, 0x040A, 0x821C, 0x821C, 0x0D2D,\n    0x821D, 0x821D, 0x2529, 0x821E, 0x821E, 0x1080, 0x821F, 0x821F, 0x040B,\n    0x8220, 0x8220, 0x1A2E, 0x8221, 0x8221, 0x1BDF, 0x8222, 0x8222, 0x07E8,\n    0x8225, 0x8225, 0x1DBF, 0x8226, 0x8226, 0x420D, 0x8228, 0x8228, 0x099A,\n    0x8229, 0x8229, 0x37B0, 0x822A, 0x822B, 0x0998, 0x822C, 0x822C, 0x099B,\n    0x822D, 0x822D, 0x3ED0, 0x822F, 0x822F, 0x1DBE, 0x8232, 0x8232, 0x2018,\n    0x8233, 0x8233, 0x2015, 0x8234, 0x8234, 0x2017, 0x8235, 0x8235, 0x0B72,\n    0x8236, 0x8236, 0x0B74, 0x8237, 0x8237, 0x0B73, 0x8238, 0x8238, 0x2014,\n    0x8239, 0x8239, 0x0B75, 0x823A, 0x823A, 0x2016, 0x823C, 0x823D, 0x228C,\n    0x823E, 0x823E, 0x4582, 0x823F, 0x823F, 0x228E, 0x8240, 0x8240, 0x252C,\n    0x8242, 0x8242, 0x252D, 0x8244, 0x8244, 0x252B, 0x8245, 0x8245, 0x252E,\n    0x8247, 0x8247, 0x0EDA, 0x8249, 0x8249, 0x252A, 0x824B, 0x824B, 0x1081,\n    0x824E, 0x824E, 0x29DA, 0x824F, 0x824F, 0x29D6, 0x8250, 0x8250, 0x29D9,\n    0x8251, 0x8251, 0x29DB, 0x8252, 0x8252, 0x29D8, 0x8253, 0x8253, 0x29D7,\n    0x8254, 0x8254, 0x4757, 0x8255, 0x8257, 0x2C3C, 0x8258, 0x8259, 0x1334,\n    0x825A, 0x825A, 0x2E0F, 0x825B, 0x825B, 0x2E0E, 0x825C, 0x825C, 0x2E10,\n    0x825E, 0x825E, 0x2F96, 0x825F, 0x825F, 0x2F95, 0x8261, 0x8261, 0x30F0,\n    0x8262, 0x8262, 0x3B7A, 0x8263, 0x8263, 0x30F1, 0x8264, 0x8264, 0x30EF,\n    0x8265, 0x8265, 0x3B7B, 0x8266, 0x8266, 0x1636, 0x8268, 0x8269, 0x321D,\n    0x826B, 0x826B, 0x33A6, 0x826C, 0x826C, 0x342D, 0x826D, 0x826D, 0x3496,\n    0x826E, 0x826E, 0x040C, 0x826F, 0x826F, 0x0504, 0x8271, 0x8271, 0x1459,\n    0x8272, 0x8272, 0x040D, 0x8274, 0x8274, 0x2019, 0x8275, 0x8275, 0x228F,\n    0x8276, 0x8276, 0x4759, 0x8277, 0x8277, 0x172E, 0x8278, 0x8278, 0x1813,\n    0x8279, 0x8279, 0x4722, 0x827A, 0x827A, 0x4563, 0x827B, 0x827B, 0x37C8,\n    0x827C, 0x827C, 0x1814, 0x827D, 0x827D, 0x1816, 0x827E, 0x827E, 0x040E,\n    0x827F, 0x827F, 0x1817, 0x8280, 0x8280, 0x1815, 0x8283, 0x8284, 0x18E5,\n    0x8285, 0x8285, 0x18E0, 0x8287, 0x8287, 0x4132, 0x828A, 0x828A, 0x18E4,\n    0x828B, 0x828B, 0x0506, 0x828D, 0x828D, 0x0507, 0x828E, 0x828E, 0x18E1,\n    0x828F, 0x828F, 0x18DF, 0x8290, 0x8290, 0x18DE, 0x8291, 0x8291, 0x18E2,\n    0x8292, 0x8292, 0x0505, 0x8293, 0x8293, 0x18E3, 0x8294, 0x8294, 0x1BE0,\n    0x8298, 0x8298, 0x1A33, 0x8299, 0x8299, 0x067B, 0x829A, 0x829A, 0x1A32,\n    0x829B, 0x829B, 0x1A34, 0x829D, 0x829D, 0x067A, 0x829E, 0x829E, 0x1A39,\n    0x829F, 0x829F, 0x067E, 0x82A0, 0x82A0, 0x1A2F, 0x82A1, 0x82A1, 0x1A3D,\n    0x82A2, 0x82A2, 0x1A43, 0x82A3, 0x82A3, 0x0685, 0x82A4, 0x82A4, 0x1A40,\n    0x82A5, 0x82A5, 0x0682, 0x82A6, 0x82A6, 0x3D73, 0x82A7, 0x82A7, 0x1A36,\n    0x82A8, 0x82A8, 0x1A3C, 0x82A9, 0x82A9, 0x1A3E, 0x82AA, 0x82AA, 0x37BC,\n    0x82AB, 0x82AB, 0x1A31, 0x82AC, 0x82AC, 0x0681, 0x82AD, 0x82AD, 0x067C,\n    0x82AE, 0x82AE, 0x1A37, 0x82AF, 0x82AF, 0x0683, 0x82B0, 0x82B0, 0x0686,\n    0x82B1, 0x82B1, 0x0680, 0x82B3, 0x82B3, 0x0679, 0x82B4, 0x82B4, 0x1A3B,\n    0x82B5, 0x82B5, 0x1A35, 0x82B6, 0x82B6, 0x1A42, 0x82B7, 0x82B7, 0x0688,\n    0x82B8, 0x82B8, 0x0684, 0x82B9, 0x82B9, 0x067F, 0x82BA, 0x82BA, 0x1A3A,\n    0x82BB, 0x82BB, 0x099C, 0x82BC, 0x82BC, 0x1A38, 0x82BD, 0x82BD, 0x067D,\n    0x82BE, 0x82BE, 0x0687, 0x82C0, 0x82C0, 0x1A30, 0x82C2, 0x82C2, 0x1A3F,\n    0x82C3, 0x82C3, 0x1A41, 0x82C4, 0x82C4, 0x45E3, 0x82CA, 0x82CA, 0x475A,\n    0x82CF, 0x82CF, 0x4564, 0x82D0, 0x82D0, 0x37C1, 0x82D1, 0x82D1, 0x07F9,\n    0x82D2, 0x82D2, 0x07F3, 0x82D3, 0x82D3, 0x07FB, 0x82D4, 0x82D4, 0x07F8,\n    0x82D5, 0x82D5, 0x1BE7, 0x82D6, 0x82D6, 0x1BEA, 0x82D7, 0x82D7, 0x07F4,\n    0x82D8, 0x82D8, 0x475B, 0x82D9, 0x82D9, 0x1BE1, 0x82DB, 0x82DB, 0x07ED,\n    0x82DC, 0x82DC, 0x07F7, 0x82DE, 0x82DE, 0x07FA, 0x82DF, 0x82DF, 0x07FC,\n    0x82E0, 0x82E0, 0x1BF6, 0x82E1, 0x82E1, 0x1BED, 0x82E2, 0x82E2, 0x37C9,\n    0x82E3, 0x82E3, 0x07EC, 0x82E4, 0x82E4, 0x1BF5, 0x82E5, 0x82E5, 0x07F0,\n    0x82E6, 0x82E6, 0x07EE, 0x82E7, 0x82E7, 0x07E9, 0x82E8, 0x82E8, 0x1BE5,\n    0x82EA, 0x82EA, 0x1BF4, 0x82EB, 0x82EB, 0x1BE9, 0x82EC, 0x82EC, 0x1BEC,\n    0x82ED, 0x82ED, 0x1BF9, 0x82EE, 0x82EE, 0x4018, 0x82EF, 0x82EF, 0x07FD,\n    0x82F0, 0x82F0, 0x1BF3, 0x82F1, 0x82F1, 0x07F5, 0x82F2, 0x82F2, 0x1BEE,\n    0x82F3, 0x82F3, 0x1BF8, 0x82F4, 0x82F4, 0x1BEB, 0x82F5, 0x82F5, 0x1BEF,\n    0x82F6, 0x82F6, 0x1BF2, 0x82F7, 0x82F7, 0x3E77, 0x82F9, 0x82F9, 0x1BE3,\n    0x82FA, 0x82FA, 0x1BF7, 0x82FB, 0x82FB, 0x1BF1, 0x82FC, 0x82FC, 0x412D,\n    0x82FD, 0x82FD, 0x3D92, 0x82FE, 0x82FE, 0x1BE2, 0x82FF, 0x82FF, 0x43DE,\n    0x8300, 0x8300, 0x1BE6, 0x8301, 0x8301, 0x07F6, 0x8302, 0x8302, 0x07F1,\n    0x8303, 0x8303, 0x07EA, 0x8304, 0x8304, 0x07EF, 0x8305, 0x8305, 0x07EB,\n    0x8306, 0x8306, 0x07FE, 0x8307, 0x8307, 0x1BE4, 0x8308, 0x8308, 0x1DD0,\n    0x8309, 0x8309, 0x07F2, 0x830B, 0x830B, 0x3EB6, 0x830C, 0x830C, 0x1BF0,\n    0x830D, 0x830D, 0x1A7D, 0x8316, 0x8316, 0x1DD3, 0x8317, 0x8317, 0x09AA,\n    0x8318, 0x8318, 0x37CA, 0x8319, 0x8319, 0x1DC3, 0x831A, 0x831A, 0x37C2,\n    0x831B, 0x831B, 0x1DCE, 0x831C, 0x831C, 0x1DCA, 0x831D, 0x831D, 0x37D1,\n    0x831E, 0x831E, 0x1DDD, 0x8320, 0x8320, 0x1DD5, 0x8322, 0x8322, 0x1DCB,\n    0x8324, 0x8324, 0x1DD4, 0x8325, 0x8325, 0x1DC5, 0x8326, 0x8326, 0x1DC9,\n    0x8327, 0x8327, 0x1DE0, 0x8328, 0x8328, 0x09AD, 0x8329, 0x8329, 0x1DD8,\n    0x832A, 0x832A, 0x1DCF, 0x832B, 0x832B, 0x099D, 0x832C, 0x832C, 0x1DDE,\n    0x832D, 0x832D, 0x1DC1, 0x832F, 0x832F, 0x1DD7, 0x8331, 0x8331, 0x09AC,\n    0x8332, 0x8332, 0x09A7, 0x8333, 0x8333, 0x1DC0, 0x8334, 0x8334, 0x09A5,\n    0x8335, 0x8335, 0x09A4, 0x8336, 0x8336, 0x09A9, 0x8337, 0x8337, 0x1DD6,\n    0x8338, 0x8338, 0x09A1, 0x8339, 0x8339, 0x09A8, 0x833A, 0x833A, 0x1BE8,\n    0x833B, 0x833B, 0x2290, 0x833C, 0x833C, 0x1DD1, 0x833D, 0x833D, 0x3D2A,\n    0x833F, 0x833F, 0x1DC7, 0x8340, 0x8340, 0x09AB, 0x8341, 0x8341, 0x1DC8,\n    0x8342, 0x8342, 0x1DCC, 0x8343, 0x8343, 0x09AE, 0x8344, 0x8344, 0x1DC2,\n    0x8345, 0x8345, 0x1DDA, 0x8347, 0x8347, 0x1DD9, 0x8348, 0x8348, 0x1DE1,\n    0x8349, 0x8349, 0x09A3, 0x834A, 0x834A, 0x09A0, 0x834B, 0x834B, 0x1DDF,\n    0x834C, 0x834C, 0x1DDB, 0x834D, 0x834D, 0x1DD2, 0x834E, 0x834E, 0x1DCD,\n    0x834F, 0x834F, 0x09A6, 0x8350, 0x8350, 0x09A2, 0x8351, 0x8351, 0x1DC4,\n    0x8352, 0x8352, 0x099E, 0x8353, 0x8353, 0x1DDC, 0x8354, 0x8354, 0x099F,\n    0x8356, 0x8356, 0x1DC6, 0x8357, 0x8357, 0x475D, 0x8362, 0x8362, 0x37B6,\n    0x8363, 0x8363, 0x41EB, 0x8366, 0x8366, 0x3E1E, 0x836F, 0x836F, 0x4565,\n    0x8373, 0x8373, 0x201F, 0x8374, 0x8374, 0x2021, 0x8375, 0x8375, 0x2026,\n    0x8376, 0x8376, 0x203A, 0x8377, 0x8377, 0x0B83, 0x8378, 0x8378, 0x0B79,\n    0x837A, 0x837A, 0x201E, 0x837B, 0x837C, 0x0B84, 0x837D, 0x837D, 0x2029,\n    0x837E, 0x837E, 0x2030, 0x837F, 0x837F, 0x2036, 0x8381, 0x8381, 0x2023,\n    0x8383, 0x8383, 0x202A, 0x8385, 0x8385, 0x37D3, 0x8386, 0x8386, 0x0B86,\n    0x8387, 0x8387, 0x2038, 0x8388, 0x8388, 0x2033, 0x8389, 0x8389, 0x0B81,\n    0x838A, 0x838A, 0x0B7F, 0x838B, 0x838B, 0x202F, 0x838C, 0x838C, 0x202B,\n    0x838D, 0x838D, 0x201D, 0x838E, 0x838E, 0x0B76, 0x838F, 0x838F, 0x2022,\n    0x8390, 0x8390, 0x201A, 0x8391, 0x8391, 0x37EC, 0x8392, 0x8392, 0x0B7E,\n    0x8393, 0x8393, 0x0B80, 0x8394, 0x8394, 0x2027, 0x8395, 0x8395, 0x2024,\n    0x8396, 0x8396, 0x0B7B, 0x8397, 0x8397, 0x2034, 0x8398, 0x8398, 0x0B78,\n    0x8399, 0x8399, 0x2025, 0x839A, 0x839A, 0x22B9, 0x839B, 0x839B, 0x202D,\n    0x839C, 0x839C, 0x374D, 0x839D, 0x839D, 0x202C, 0x839E, 0x839E, 0x0B77,\n    0x83A0, 0x83A0, 0x0B82, 0x83A2, 0x83A2, 0x0B7A, 0x83A3, 0x83A3, 0x201B,\n    0x83A4, 0x83A4, 0x2020, 0x83A5, 0x83A5, 0x2031, 0x83A6, 0x83A6, 0x2037,\n    0x83A7, 0x83A7, 0x0B87, 0x83A8, 0x83A8, 0x201C, 0x83A9, 0x83A9, 0x2028,\n    0x83AA, 0x83AA, 0x202E, 0x83AB, 0x83AB, 0x0B7D, 0x83AC, 0x83AC, 0x37D6,\n    0x83AE, 0x83AE, 0x2039, 0x83AF, 0x83AF, 0x2032, 0x83B0, 0x83B0, 0x2035,\n    0x83B9, 0x83B9, 0x42A7, 0x83BD, 0x83BD, 0x0B7C, 0x83BE, 0x83BE, 0x3F59,\n    0x83BF, 0x83BF, 0x22A0, 0x83C0, 0x83C0, 0x2294, 0x83C1, 0x83C1, 0x0D35,\n    0x83C2, 0x83C2, 0x22B1, 0x83C3, 0x83C3, 0x22BA, 0x83C4, 0x83C4, 0x22BD,\n    0x83C5, 0x83C5, 0x0D33, 0x83C6, 0x83C6, 0x229C, 0x83C7, 0x83C7, 0x22B5,\n    0x83C8, 0x83C8, 0x229D, 0x83C9, 0x83C9, 0x22AB, 0x83CA, 0x83CA, 0x0D40,\n    0x83CB, 0x83CB, 0x22A7, 0x83CC, 0x83CC, 0x0D3D, 0x83CD, 0x83CD, 0x4055,\n    0x83CE, 0x83CE, 0x22A8, 0x83CF, 0x83CF, 0x2291, 0x83D1, 0x83D1, 0x22B6,\n    0x83D3, 0x83D3, 0x37D8, 0x83D4, 0x83D4, 0x0D46, 0x83D5, 0x83D5, 0x22B3,\n    0x83D6, 0x83D6, 0x22A9, 0x83D7, 0x83D7, 0x22BF, 0x83D8, 0x83D8, 0x22A4,\n    0x83D9, 0x83D9, 0x254E, 0x83DB, 0x83DB, 0x22C2, 0x83DC, 0x83DC, 0x0D44,\n    0x83DD, 0x83DD, 0x22A2, 0x83DE, 0x83DE, 0x22AE, 0x83DF, 0x83DF, 0x0D47,\n    0x83E0, 0x83E0, 0x0D32, 0x83E1, 0x83E1, 0x22A6, 0x83E2, 0x83E2, 0x22C0,\n    0x83E3, 0x83E3, 0x229F, 0x83E4, 0x83E4, 0x2298, 0x83E5, 0x83E5, 0x22A3,\n    0x83E7, 0x83E7, 0x2297, 0x83E8, 0x83E8, 0x2295, 0x83E9, 0x83E9, 0x0D2E,\n    0x83EA, 0x83EA, 0x22B7, 0x83EB, 0x83EB, 0x229E, 0x83EC, 0x83EC, 0x22BB,\n    0x83ED, 0x83ED, 0x3D2C, 0x83EE, 0x83EE, 0x22BC, 0x83EF, 0x83EF, 0x0D36,\n    0x83F0, 0x83F0, 0x0D3B, 0x83F1, 0x83F1, 0x0D37, 0x83F2, 0x83F2, 0x0D3F,\n    0x83F3, 0x83F3, 0x22B2, 0x83F4, 0x83F4, 0x0D38, 0x83F5, 0x83F5, 0x22AA,\n    0x83F6, 0x83F6, 0x229A, 0x83F8, 0x83F8, 0x0D30, 0x83F9, 0x83F9, 0x2292,\n    0x83FA, 0x83FA, 0x22B4, 0x83FB, 0x83FB, 0x22BE, 0x83FC, 0x83FC, 0x2299,\n    0x83FD, 0x83FD, 0x0D3E, 0x83FE, 0x83FE, 0x22C3, 0x83FF, 0x83FF, 0x22A5,\n    0x8401, 0x8401, 0x22A1, 0x8403, 0x8403, 0x0D2F, 0x8404, 0x8404, 0x0D43,\n    0x8405, 0x8405, 0x475F, 0x8406, 0x8406, 0x22B0, 0x8407, 0x8407, 0x0D45,\n    0x8409, 0x8409, 0x22AC, 0x840A, 0x840A, 0x0D3A, 0x840B, 0x840B, 0x0D34,\n    0x840C, 0x840C, 0x0D3C, 0x840D, 0x840D, 0x0D31, 0x840E, 0x840E, 0x0D42,\n    0x840F, 0x840F, 0x22AD, 0x8410, 0x8410, 0x229B, 0x8411, 0x8411, 0x22AF,\n    0x8412, 0x8412, 0x2296, 0x8413, 0x8413, 0x22B8, 0x8414, 0x8414, 0x3C10,\n    0x8416, 0x8416, 0x4037, 0x8418, 0x8418, 0x3E7A, 0x841B, 0x841B, 0x22C1,\n    0x841C, 0x841C, 0x3EB3, 0x8420, 0x8420, 0x3C55, 0x8421, 0x8421, 0x3751,\n    0x8423, 0x8423, 0x2293, 0x8424, 0x8424, 0x4951, 0x8426, 0x8426, 0x46D8,\n    0x8429, 0x8429, 0x254D, 0x842B, 0x842B, 0x2563, 0x842C, 0x842C, 0x0EAC,\n    0x842D, 0x842D, 0x2552, 0x842E, 0x842E, 0x422D, 0x842F, 0x842F, 0x2550,\n    0x8430, 0x8430, 0x253B, 0x8431, 0x8431, 0x0EDE, 0x8432, 0x8432, 0x254B,\n    0x8433, 0x8433, 0x255F, 0x8434, 0x8434, 0x2547, 0x8435, 0x8435, 0x0EE6,\n    0x8436, 0x8436, 0x255E, 0x8437, 0x8437, 0x2545, 0x8438, 0x8438, 0x0D41,\n    0x8439, 0x8439, 0x2555, 0x843A, 0x843A, 0x2546, 0x843B, 0x843B, 0x255C,\n    0x843C, 0x843C, 0x0EE5, 0x843D, 0x843D, 0x0EDD, 0x843E, 0x843E, 0x3D21,\n    0x843F, 0x843F, 0x2530, 0x8440, 0x8440, 0x2538, 0x8442, 0x8442, 0x2551,\n    0x8443, 0x8443, 0x2549, 0x8444, 0x8444, 0x2562, 0x8445, 0x8445, 0x254C,\n    0x8446, 0x8446, 0x0EEB, 0x8447, 0x8447, 0x255D, 0x8448, 0x8448, 0x4718,\n    0x8449, 0x8449, 0x0EE2, 0x844A, 0x844A, 0x37E4, 0x844B, 0x844B, 0x254F,\n    0x844C, 0x844C, 0x2557, 0x844D, 0x844D, 0x253C, 0x844E, 0x844E, 0x2556,\n    0x8450, 0x8450, 0x2567, 0x8451, 0x8451, 0x2537, 0x8452, 0x8452, 0x2558,\n    0x8453, 0x8453, 0x3B7D, 0x8454, 0x8454, 0x2565, 0x8455, 0x8455, 0x398B,\n    0x8456, 0x8456, 0x2531, 0x8457, 0x8457, 0x0D39, 0x8458, 0x8458, 0x37DE,\n    0x8459, 0x8459, 0x253F, 0x845A, 0x845A, 0x253E, 0x845B, 0x845B, 0x0EE4,\n    0x845C, 0x845C, 0x3EDB, 0x845D, 0x845D, 0x2542, 0x845E, 0x845E, 0x2544,\n    0x845F, 0x845F, 0x2553, 0x8460, 0x8460, 0x2564, 0x8461, 0x8461, 0x0EE7,\n    0x8462, 0x8462, 0x42DA, 0x8463, 0x8463, 0x0EE8, 0x8464, 0x8464, 0x4761,\n    0x8465, 0x8465, 0x2536, 0x8466, 0x8466, 0x0EE0, 0x8467, 0x8467, 0x253A,\n    0x8468, 0x8468, 0x2560, 0x8469, 0x8469, 0x0EE9, 0x846B, 0x846B, 0x0EE1,\n    0x846C, 0x846C, 0x0EE3, 0x846D, 0x846D, 0x0EEA, 0x846E, 0x846E, 0x2566,\n    0x846F, 0x846F, 0x2559, 0x8470, 0x8470, 0x2554, 0x8471, 0x8471, 0x37E0,\n    0x8472, 0x8472, 0x3C93, 0x8473, 0x8473, 0x2541, 0x8474, 0x8474, 0x2540,\n    0x8475, 0x8475, 0x0EDF, 0x8476, 0x8476, 0x2532, 0x8477, 0x8477, 0x0EDC,\n    0x8478, 0x8478, 0x254A, 0x8479, 0x8479, 0x2533, 0x847A, 0x847A, 0x2548,\n    0x847D, 0x847D, 0x253D, 0x847E, 0x847E, 0x2561, 0x847F, 0x847F, 0x394E,\n    0x8480, 0x8480, 0x3B6E, 0x8482, 0x8482, 0x0EDB, 0x8486, 0x8486, 0x2539,\n    0x8488, 0x8488, 0x4762, 0x848D, 0x848D, 0x2535, 0x848E, 0x848E, 0x255B,\n    0x848F, 0x848F, 0x2534, 0x8490, 0x8490, 0x108E, 0x8491, 0x8491, 0x27CD,\n    0x8492, 0x8492, 0x3756, 0x8493, 0x8493, 0x37EE, 0x8494, 0x8494, 0x27BC,\n    0x8496, 0x8496, 0x3B1D, 0x8497, 0x8497, 0x27A6, 0x8498, 0x8498, 0x27C4,\n    0x8499, 0x8499, 0x1086, 0x849A, 0x849A, 0x27B5, 0x849B, 0x849B, 0x27BF,\n    0x849C, 0x849C, 0x1089, 0x849D, 0x849D, 0x27B8, 0x849E, 0x849E, 0x1087,\n    0x849F, 0x849F, 0x27A9, 0x84A0, 0x84A0, 0x27C7, 0x84A1, 0x84A1, 0x27A8,\n    0x84A2, 0x84A2, 0x27BB, 0x84A3, 0x84A3, 0x3B9E, 0x84A4, 0x84A4, 0x27A7,\n    0x84A7, 0x84A7, 0x27B9, 0x84A8, 0x84A8, 0x27C2, 0x84A9, 0x84A9, 0x27C0,\n    0x84AA, 0x84AA, 0x27B4, 0x84AB, 0x84AB, 0x27AF, 0x84AC, 0x84AC, 0x27AD,\n    0x84AD, 0x84AD, 0x3D8C, 0x84AE, 0x84AE, 0x27AE, 0x84AF, 0x84AF, 0x27C1,\n    0x84B0, 0x84B0, 0x27CC, 0x84B1, 0x84B1, 0x27B6, 0x84B2, 0x84B2, 0x1088,\n    0x84B4, 0x84B4, 0x27B1, 0x84B6, 0x84B6, 0x27C5, 0x84B8, 0x84B8, 0x108B,\n    0x84B9, 0x84B9, 0x27B0, 0x84BA, 0x84BA, 0x27AA, 0x84BB, 0x84BB, 0x27BA,\n    0x84BC, 0x84BC, 0x108F, 0x84BD, 0x84BD, 0x3C4C, 0x84BE, 0x84BE, 0x4764,\n    0x84BF, 0x84BF, 0x1083, 0x84C0, 0x84C0, 0x108C, 0x84C1, 0x84C1, 0x27B2,\n    0x84C2, 0x84C2, 0x27AC, 0x84C4, 0x84C4, 0x1085, 0x84C5, 0x84C5, 0x255A,\n    0x84C6, 0x84C6, 0x1084, 0x84C7, 0x84C7, 0x27BD, 0x84C9, 0x84C9, 0x1082,\n    0x84CA, 0x84CA, 0x1091, 0x84CB, 0x84CB, 0x108A, 0x84CC, 0x84CC, 0x27BE,\n    0x84CD, 0x84CD, 0x27B3, 0x84CE, 0x84CE, 0x27AB, 0x84CF, 0x84CF, 0x27C6,\n    0x84D0, 0x84D0, 0x27B7, 0x84D1, 0x84D1, 0x1090, 0x84D2, 0x84D2, 0x27CA,\n    0x84D3, 0x84D3, 0x108D, 0x84D4, 0x84D4, 0x27C9, 0x84D6, 0x84D6, 0x27C3,\n    0x84D7, 0x84D7, 0x27C8, 0x84DA, 0x84DA, 0x3FF5, 0x84DB, 0x84DB, 0x27CB,\n    0x84DE, 0x84DE, 0x37EA, 0x84E1, 0x84E1, 0x4765, 0x84E2, 0x84E2, 0x37B5,\n    0x84E4, 0x84E4, 0x37EF, 0x84E5, 0x84E5, 0x3BD0, 0x84E7, 0x84E8, 0x2A03,\n    0x84E9, 0x84E9, 0x29F7, 0x84EA, 0x84EA, 0x29F6, 0x84EB, 0x84EB, 0x29F2,\n    0x84EC, 0x84EC, 0x11FB, 0x84EE, 0x84EE, 0x11F3, 0x84EF, 0x84EF, 0x2A06,\n    0x84F0, 0x84F0, 0x2A05, 0x84F1, 0x84F1, 0x252F, 0x84F2, 0x84F2, 0x29EF,\n    0x84F3, 0x84F3, 0x29F3, 0x84F4, 0x84F4, 0x29ED, 0x84F6, 0x84F6, 0x2A00,\n    0x84F7, 0x84F7, 0x29F1, 0x84F8, 0x84F8, 0x4766, 0x84F9, 0x84F9, 0x2A07,\n    0x84FA, 0x84FA, 0x29EA, 0x84FB, 0x84FB, 0x29E8, 0x84FC, 0x84FC, 0x29F4,\n    0x84FD, 0x84FD, 0x29FE, 0x84FE, 0x84FE, 0x29F9, 0x84FF, 0x84FF, 0x11FD,\n    0x8500, 0x8500, 0x29DF, 0x8502, 0x8502, 0x29FD, 0x8503, 0x8503, 0x398A,\n    0x8505, 0x8505, 0x40EB, 0x8506, 0x8506, 0x11FE, 0x8507, 0x8507, 0x2543,\n    0x8508, 0x8508, 0x29EB, 0x8509, 0x8509, 0x29E2, 0x850A, 0x850A, 0x29E5,\n    0x850B, 0x850B, 0x2A0B, 0x850C, 0x850C, 0x29EC, 0x850D, 0x850D, 0x29E3,\n    0x850E, 0x850E, 0x29E1, 0x850F, 0x850F, 0x29DE, 0x8510, 0x8510, 0x4767,\n    0x8511, 0x8511, 0x11F7, 0x8512, 0x8512, 0x29F5, 0x8513, 0x8513, 0x11F6,\n    0x8514, 0x8514, 0x11FA, 0x8515, 0x8515, 0x29F0, 0x8516, 0x8516, 0x29F8,\n    0x8517, 0x8517, 0x11F0, 0x8518, 0x8518, 0x2A08, 0x8519, 0x8519, 0x2A0C,\n    0x851A, 0x851A, 0x11F2, 0x851C, 0x851C, 0x29E7, 0x851D, 0x851D, 0x29FB,\n    0x851E, 0x851E, 0x29FF, 0x851F, 0x851F, 0x29E4, 0x8520, 0x8520, 0x2A09,\n    0x8521, 0x8521, 0x11F9, 0x8523, 0x8523, 0x11F8, 0x8524, 0x8524, 0x29DC,\n    0x8525, 0x8525, 0x11FC, 0x8526, 0x8526, 0x2A02, 0x8527, 0x8527, 0x29E6,\n    0x8528, 0x8528, 0x29FA, 0x8529, 0x8529, 0x29E0, 0x852A, 0x852A, 0x29EE,\n    0x852B, 0x852B, 0x29E9, 0x852C, 0x852D, 0x11F4, 0x852E, 0x852E, 0x29FC,\n    0x852F, 0x852F, 0x2A0D, 0x8530, 0x8530, 0x2A0A, 0x8531, 0x8531, 0x2A01,\n    0x8533, 0x8533, 0x4228, 0x8534, 0x8534, 0x37F4, 0x8538, 0x8538, 0x4768,\n    0x853B, 0x853B, 0x29DD, 0x853D, 0x853D, 0x11F1, 0x853E, 0x853E, 0x2C4F,\n    0x8540, 0x8540, 0x2C46, 0x8541, 0x8541, 0x2C49, 0x8542, 0x8542, 0x4062,\n    0x8543, 0x8543, 0x133B, 0x8544, 0x8544, 0x2C4B, 0x8545, 0x8545, 0x2C40,\n    0x8546, 0x8546, 0x2C47, 0x8547, 0x8547, 0x2C4D, 0x8548, 0x8548, 0x1338,\n    0x8549, 0x8549, 0x133C, 0x854A, 0x854A, 0x1336, 0x854B, 0x854B, 0x37C0,\n    0x854C, 0x854C, 0x400F, 0x854D, 0x854D, 0x2C42, 0x854E, 0x854E, 0x2C52,\n    0x8551, 0x8551, 0x2C4C, 0x8552, 0x8552, 0x4769, 0x8553, 0x8553, 0x2C43,\n    0x8554, 0x8554, 0x2C5B, 0x8555, 0x8555, 0x2C55, 0x8556, 0x8556, 0x2C3F,\n    0x8557, 0x8557, 0x2E23, 0x8558, 0x8558, 0x2C45, 0x8559, 0x8559, 0x1337,\n    0x855A, 0x855A, 0x37DB, 0x855B, 0x855B, 0x2C50, 0x855D, 0x855D, 0x2C5A,\n    0x855E, 0x855E, 0x133F, 0x8560, 0x8560, 0x2C57, 0x8561, 0x8561, 0x2C44,\n    0x8562, 0x8562, 0x2C4A, 0x8563, 0x8563, 0x2C4E, 0x8564, 0x8564, 0x2C48,\n    0x8565, 0x8565, 0x2C5C, 0x8566, 0x8566, 0x2C59, 0x8567, 0x8567, 0x2C56,\n    0x8568, 0x8569, 0x1339, 0x856A, 0x856A, 0x133E, 0x856B, 0x856B, 0x2C41,\n    0x856C, 0x856C, 0x2C5D, 0x856D, 0x856D, 0x133D, 0x856E, 0x856E, 0x2C53,\n    0x856F, 0x8570, 0x476B, 0x8571, 0x8571, 0x2C51, 0x8573, 0x8573, 0x37F8,\n    0x8575, 0x8575, 0x2C54, 0x8576, 0x8576, 0x2E30, 0x8577, 0x8577, 0x2E1D,\n    0x8578, 0x8578, 0x2E22, 0x8579, 0x8579, 0x2E2F, 0x857A, 0x857A, 0x2E21,\n    0x857B, 0x857B, 0x2E19, 0x857C, 0x857C, 0x2E1E, 0x857E, 0x857E, 0x145C,\n    0x8580, 0x8580, 0x2E12, 0x8581, 0x8581, 0x2E2A, 0x8582, 0x8582, 0x2E2C,\n    0x8583, 0x8583, 0x2E11, 0x8584, 0x8584, 0x145B, 0x8585, 0x8585, 0x2E2E,\n    0x8586, 0x8586, 0x2E26, 0x8587, 0x8587, 0x1462, 0x8588, 0x8588, 0x2E2D,\n    0x8589, 0x8589, 0x2E1F, 0x858A, 0x858A, 0x1464, 0x858B, 0x858B, 0x2E17,\n    0x858C, 0x858C, 0x2C58, 0x858D, 0x858D, 0x2E27, 0x858E, 0x858E, 0x2E24,\n    0x858F, 0x858F, 0x2E13, 0x8590, 0x8590, 0x2E32, 0x8591, 0x8591, 0x145E,\n    0x8594, 0x8594, 0x145F, 0x8595, 0x8595, 0x2E15, 0x8596, 0x8596, 0x2E25,\n    0x8598, 0x8598, 0x2E31, 0x8599, 0x8599, 0x2E28, 0x859A, 0x859A, 0x2E1B,\n    0x859B, 0x859B, 0x1461, 0x859C, 0x859C, 0x145D, 0x859D, 0x859D, 0x2E29,\n    0x859E, 0x859E, 0x2E1C, 0x859F, 0x859F, 0x2E33, 0x85A0, 0x85A0, 0x2E16,\n    0x85A1, 0x85A1, 0x2E20, 0x85A2, 0x85A2, 0x2E2B, 0x85A3, 0x85A3, 0x2E18,\n    0x85A4, 0x85A4, 0x2E1A, 0x85A6, 0x85A6, 0x1465, 0x85A7, 0x85A7, 0x2E14,\n    0x85A8, 0x85A8, 0x1463, 0x85A9, 0x85A9, 0x151C, 0x85AA, 0x85AA, 0x145A,\n    0x85AF, 0x85AF, 0x1460, 0x85B0, 0x85B0, 0x1520, 0x85B1, 0x85B1, 0x2FA6,\n    0x85B3, 0x85B3, 0x2F9C, 0x85B4, 0x85B4, 0x2F97, 0x85B5, 0x85B5, 0x2F9D,\n    0x85B6, 0x85B6, 0x2FA7, 0x85B7, 0x85B7, 0x2FAB, 0x85B8, 0x85B8, 0x2FAA,\n    0x85B9, 0x85B9, 0x1522, 0x85BA, 0x85BA, 0x1521, 0x85BD, 0x85BD, 0x2F9E,\n    0x85BE, 0x85BE, 0x2FAC, 0x85BF, 0x85BF, 0x2FA1, 0x85C0, 0x85C0, 0x2F99,\n    0x85C1, 0x85C1, 0x37FE, 0x85C2, 0x85C2, 0x2F9B, 0x85C3, 0x85C3, 0x2F9A,\n    0x85C4, 0x85C4, 0x2FA0, 0x85C5, 0x85C5, 0x2FA5, 0x85C6, 0x85C6, 0x2F98,\n    0x85C7, 0x85C7, 0x2F9F, 0x85C8, 0x85C8, 0x2FA4, 0x85C9, 0x85C9, 0x151F,\n    0x85CB, 0x85CB, 0x2FA2, 0x85CD, 0x85CD, 0x151D, 0x85CE, 0x85CE, 0x2FA3,\n    0x85CF, 0x85CF, 0x151B, 0x85D0, 0x85D0, 0x151E, 0x85D1, 0x85D1, 0x3101,\n    0x85D2, 0x85D2, 0x2FA8, 0x85D5, 0x85D5, 0x15B7, 0x85D7, 0x85D7, 0x30F9,\n    0x85D8, 0x85D8, 0x30FD, 0x85D9, 0x85D9, 0x30F5, 0x85DA, 0x85DA, 0x30F8,\n    0x85DC, 0x85DC, 0x3100, 0x85DD, 0x85DD, 0x15B5, 0x85DE, 0x85DE, 0x3105,\n    0x85DF, 0x85DF, 0x30FE, 0x85E0, 0x85E0, 0x476D, 0x85E1, 0x85E1, 0x30F6,\n    0x85E2, 0x85E2, 0x3106, 0x85E3, 0x85E3, 0x30FF, 0x85E4, 0x85E5, 0x15B8,\n    0x85E6, 0x85E6, 0x3103, 0x85E8, 0x85E8, 0x30F7, 0x85E9, 0x85E9, 0x15B4,\n    0x85EA, 0x85EA, 0x15B6, 0x85EB, 0x85EB, 0x30F2, 0x85EC, 0x85EC, 0x30FA,\n    0x85ED, 0x85ED, 0x30F4, 0x85EE, 0x85EE, 0x3C56, 0x85EF, 0x85EF, 0x3104,\n    0x85F0, 0x85F0, 0x3102, 0x85F1, 0x85F1, 0x30F3, 0x85F2, 0x85F2, 0x30FB,\n    0x85F6, 0x85F6, 0x3225, 0x85F7, 0x85F7, 0x15BA, 0x85F8, 0x85F8, 0x30FC,\n    0x85F9, 0x85F9, 0x1638, 0x85FA, 0x85FA, 0x163A, 0x85FB, 0x85FB, 0x1637,\n    0x85FC, 0x85FC, 0x3C50, 0x85FD, 0x85FD, 0x322A, 0x85FE, 0x85FE, 0x3222,\n    0x85FF, 0x85FF, 0x3220, 0x8600, 0x8600, 0x3224, 0x8601, 0x8601, 0x3221,\n    0x8602, 0x8602, 0x3800, 0x8604, 0x8604, 0x3226, 0x8605, 0x8605, 0x3228,\n    0x8606, 0x8606, 0x163B, 0x8607, 0x8607, 0x163D, 0x8609, 0x8609, 0x3227,\n    0x860A, 0x860A, 0x163E, 0x860B, 0x860B, 0x163C, 0x860C, 0x860C, 0x3229,\n    0x860D, 0x860D, 0x4064, 0x8610, 0x8610, 0x3B7F, 0x8611, 0x8611, 0x1639,\n    0x8614, 0x8614, 0x46BE, 0x8616, 0x8616, 0x37FB, 0x8617, 0x8617, 0x1685,\n    0x8618, 0x8618, 0x32F6, 0x8619, 0x8619, 0x32FC, 0x861A, 0x861A, 0x1687,\n    0x861B, 0x861B, 0x3223, 0x861C, 0x861C, 0x32FB, 0x861E, 0x861E, 0x3302,\n    0x861F, 0x861F, 0x32F9, 0x8620, 0x8620, 0x3300, 0x8621, 0x8621, 0x32FF,\n    0x8622, 0x8622, 0x321F, 0x8623, 0x8623, 0x32FA, 0x8624, 0x8624, 0x2FA9,\n    0x8625, 0x8625, 0x3303, 0x8626, 0x8626, 0x32F8, 0x8627, 0x8627, 0x32FD,\n    0x8628, 0x8628, 0x3805, 0x8629, 0x8629, 0x3301, 0x862A, 0x862A, 0x32F7,\n    0x862C, 0x862C, 0x33AA, 0x862D, 0x862D, 0x1686, 0x862E, 0x862E, 0x32FE,\n    0x862F, 0x862F, 0x3F9E, 0x8631, 0x8631, 0x3432, 0x8632, 0x8632, 0x33AB,\n    0x8633, 0x8633, 0x33A9, 0x8634, 0x8635, 0x33A7, 0x8636, 0x8636, 0x33AC,\n    0x8638, 0x8638, 0x1707, 0x8639, 0x8639, 0x3430, 0x863A, 0x863A, 0x342E,\n    0x863B, 0x863B, 0x3433, 0x863C, 0x863C, 0x3431, 0x863E, 0x863E, 0x3434,\n    0x863F, 0x863F, 0x1708, 0x8640, 0x8640, 0x342F, 0x8642, 0x8642, 0x38C1,\n    0x8643, 0x8643, 0x3497, 0x8645, 0x8645, 0x3B66, 0x8646, 0x8648, 0x34DF,\n    0x864B, 0x864B, 0x353E, 0x864C, 0x864C, 0x3536, 0x864D, 0x864D, 0x1818,\n    0x864E, 0x864E, 0x0689, 0x8650, 0x8650, 0x07FF, 0x8652, 0x8652, 0x1DE3,\n    0x8653, 0x8653, 0x1DE2, 0x8654, 0x8654, 0x09AF, 0x8655, 0x8655, 0x0B88,\n    0x8656, 0x8656, 0x203C, 0x8659, 0x8659, 0x203B, 0x865B, 0x865B, 0x0D48,\n    0x865C, 0x865C, 0x0EED, 0x865E, 0x865E, 0x0EEC, 0x865F, 0x865F, 0x0EEE,\n    0x8661, 0x8661, 0x27CE, 0x8662, 0x8662, 0x2A0E, 0x8663, 0x8663, 0x2C5E,\n    0x8664, 0x8664, 0x2C60, 0x8665, 0x8665, 0x2C5F, 0x8667, 0x8667, 0x1466,\n    0x8668, 0x8668, 0x2E34, 0x8669, 0x8669, 0x2FAD, 0x866A, 0x866A, 0x351E,\n    0x866B, 0x866B, 0x040F, 0x866C, 0x866C, 0x3813, 0x866D, 0x866E, 0x1A46,\n    0x866F, 0x866F, 0x1A45, 0x8670, 0x8670, 0x1A44, 0x8671, 0x8671, 0x068A,\n    0x8672, 0x8672, 0x476F, 0x8673, 0x8673, 0x1BFD, 0x8674, 0x8674, 0x1BFB,\n    0x8677, 0x8677, 0x1BFA, 0x8679, 0x8679, 0x0800, 0x867A, 0x867A, 0x0802,\n    0x867B, 0x867B, 0x0801, 0x867C, 0x867C, 0x1BFC, 0x867E, 0x867E, 0x380A,\n    0x8685, 0x8685, 0x1DEF, 0x8686, 0x8686, 0x1DEC, 0x8687, 0x8687, 0x1DEA,\n    0x868A, 0x868A, 0x09B0, 0x868B, 0x868B, 0x1DED, 0x868C, 0x868C, 0x09B5,\n    0x868D, 0x868D, 0x1DE7, 0x868E, 0x868E, 0x1DF6, 0x8690, 0x8690, 0x1DF8,\n    0x8691, 0x8691, 0x1DE8, 0x8692, 0x8692, 0x4770, 0x8693, 0x8693, 0x09B2,\n    0x8694, 0x8694, 0x1DF9, 0x8695, 0x8695, 0x1DF4, 0x8696, 0x8696, 0x1DE6,\n    0x8697, 0x8697, 0x1DEB, 0x8698, 0x8698, 0x1DF5, 0x8699, 0x8699, 0x1DF1,\n    0x869A, 0x869A, 0x1DEE, 0x869C, 0x869C, 0x09B7, 0x869D, 0x869D, 0x1DF7,\n    0x869E, 0x869E, 0x1DE9, 0x86A0, 0x86A0, 0x3B88, 0x86A1, 0x86A1, 0x1DF2,\n    0x86A2, 0x86A2, 0x1DE4, 0x86A3, 0x86A3, 0x09B6, 0x86A4, 0x86A4, 0x09B3,\n    0x86A5, 0x86A5, 0x1DF0, 0x86A7, 0x86A7, 0x1DF3, 0x86A8, 0x86A8, 0x1DE5,\n    0x86A9, 0x86A9, 0x09B4, 0x86AA, 0x86AA, 0x09B1, 0x86AD, 0x86AD, 0x3F06,\n    0x86AF, 0x86AF, 0x0B92, 0x86B0, 0x86B0, 0x2043, 0x86B1, 0x86B1, 0x0B91,\n    0x86B2, 0x86B2, 0x43E0, 0x86B3, 0x86B3, 0x2046, 0x86B4, 0x86B4, 0x2049,\n    0x86B5, 0x86B5, 0x0B8E, 0x86B6, 0x86B6, 0x0B8C, 0x86B7, 0x86B7, 0x203E,\n    0x86B8, 0x86B8, 0x2047, 0x86B9, 0x86B9, 0x2045, 0x86BA, 0x86BA, 0x2042,\n    0x86BB, 0x86BC, 0x204A, 0x86BD, 0x86BE, 0x204D, 0x86BF, 0x86BF, 0x203D,\n    0x86C0, 0x86C0, 0x0B8B, 0x86C1, 0x86C1, 0x2040, 0x86C2, 0x86C2, 0x203F,\n    0x86C3, 0x86C3, 0x204C, 0x86C4, 0x86C4, 0x0B8D, 0x86C5, 0x86C5, 0x2041,\n    0x86C6, 0x86C6, 0x0B8F, 0x86C7, 0x86C7, 0x0B8A, 0x86C8, 0x86C8, 0x2044,\n    0x86C9, 0x86C9, 0x0B93, 0x86CB, 0x86CB, 0x0B90, 0x86CC, 0x86CC, 0x2048,\n    0x86D0, 0x86D0, 0x0D4F, 0x86D1, 0x86D1, 0x22D2, 0x86D3, 0x86D3, 0x22C7,\n    0x86D4, 0x86D4, 0x0D4C, 0x86D6, 0x86D6, 0x256D, 0x86D7, 0x86D7, 0x22D0,\n    0x86D8, 0x86D8, 0x22C4, 0x86D9, 0x86D9, 0x0D4A, 0x86DA, 0x86DA, 0x22C9,\n    0x86DB, 0x86DB, 0x0D4D, 0x86DC, 0x86DC, 0x22CD, 0x86DD, 0x86DD, 0x22CB,\n    0x86DE, 0x86DE, 0x0D50, 0x86DF, 0x86DF, 0x0D49, 0x86E2, 0x86E2, 0x22C5,\n    0x86E3, 0x86E3, 0x22C8, 0x86E4, 0x86E4, 0x0D4E, 0x86E6, 0x86E6, 0x22C6,\n    0x86E8, 0x86E8, 0x22D1, 0x86E9, 0x86E9, 0x22CF, 0x86EA, 0x86EA, 0x22CA,\n    0x86EB, 0x86EB, 0x22CC, 0x86EC, 0x86EC, 0x22CE, 0x86ED, 0x86ED, 0x0D4B,\n    0x86EF, 0x86EF, 0x4771, 0x86F5, 0x86F5, 0x256E, 0x86F6, 0x86F6, 0x2574,\n    0x86F7, 0x86F7, 0x256A, 0x86F8, 0x86F8, 0x2570, 0x86F9, 0x86F9, 0x0EEF,\n    0x86FA, 0x86FA, 0x256C, 0x86FB, 0x86FB, 0x0EF5, 0x86FE, 0x86FE, 0x0EF4,\n    0x8700, 0x8700, 0x0EF3, 0x8701, 0x8701, 0x2573, 0x8702, 0x8703, 0x0EF6,\n    0x8704, 0x8704, 0x2569, 0x8705, 0x8705, 0x2576, 0x8706, 0x8706, 0x0EF8,\n    0x8707, 0x8707, 0x0EF2, 0x8708, 0x8708, 0x0EF1, 0x8709, 0x8709, 0x2572,\n    0x870A, 0x870A, 0x0EF9, 0x870B, 0x870B, 0x2568, 0x870C, 0x870C, 0x256B,\n    0x870D, 0x870D, 0x2575, 0x870E, 0x870E, 0x2571, 0x8711, 0x8711, 0x27EE,\n    0x8712, 0x8712, 0x27E3, 0x8713, 0x8713, 0x0EF0, 0x8718, 0x8718, 0x1098,\n    0x8719, 0x8719, 0x27D7, 0x871A, 0x871A, 0x27EC, 0x871B, 0x871B, 0x27D8,\n    0x871C, 0x871C, 0x1093, 0x871E, 0x871E, 0x27D5, 0x8720, 0x8720, 0x27DE,\n    0x8721, 0x8721, 0x27D6, 0x8722, 0x8722, 0x1095, 0x8723, 0x8723, 0x27D0,\n    0x8724, 0x8724, 0x27EB, 0x8725, 0x8725, 0x1096, 0x8726, 0x8727, 0x27E8,\n    0x8728, 0x8728, 0x27D1, 0x8729, 0x8729, 0x109B, 0x872A, 0x872A, 0x27E0,\n    0x872C, 0x872C, 0x27DA, 0x872D, 0x872D, 0x27E1, 0x872E, 0x872E, 0x27D4,\n    0x8730, 0x8730, 0x27ED, 0x8731, 0x8731, 0x27E5, 0x8732, 0x8732, 0x27DF,\n    0x8733, 0x8733, 0x27CF, 0x8734, 0x8734, 0x1097, 0x8735, 0x8735, 0x27E6,\n    0x8737, 0x8737, 0x109A, 0x8738, 0x8738, 0x27EA, 0x873A, 0x873A, 0x27E4,\n    0x873B, 0x873B, 0x1094, 0x873C, 0x873C, 0x27E2, 0x873E, 0x873E, 0x27DC,\n    0x873F, 0x873F, 0x1092, 0x8740, 0x8740, 0x27D3, 0x8741, 0x8741, 0x27DB,\n    0x8742, 0x8742, 0x27E7, 0x8743, 0x8743, 0x27D9, 0x8746, 0x8746, 0x27DD,\n    0x874C, 0x874C, 0x1208, 0x874D, 0x874D, 0x256F, 0x874E, 0x874E, 0x2A20,\n    0x874F, 0x874F, 0x2A29, 0x8750, 0x8750, 0x2A1F, 0x8751, 0x8751, 0x2A1B,\n    0x8752, 0x8752, 0x2A18, 0x8753, 0x8753, 0x1209, 0x8754, 0x8754, 0x2A16,\n    0x8755, 0x8755, 0x1099, 0x8756, 0x8756, 0x2A0F, 0x8757, 0x8757, 0x1207,\n    0x8758, 0x8758, 0x2A15, 0x8759, 0x8759, 0x1206, 0x875A, 0x875A, 0x2A1A,\n    0x875B, 0x875B, 0x2A17, 0x875C, 0x875C, 0x2A27, 0x875D, 0x875D, 0x2A22,\n    0x875E, 0x875E, 0x2A1C, 0x875F, 0x875F, 0x2A21, 0x8760, 0x8760, 0x1202,\n    0x8761, 0x8761, 0x2A19, 0x8762, 0x8762, 0x2A2C, 0x8763, 0x8764, 0x2A10,\n    0x8765, 0x8765, 0x2A28, 0x8766, 0x8766, 0x1203, 0x8767, 0x8767, 0x2A2D,\n    0x8768, 0x8768, 0x1205, 0x8769, 0x8769, 0x2A2E, 0x876A, 0x876A, 0x2A1E,\n    0x876B, 0x876B, 0x27D2, 0x876C, 0x876C, 0x2A24, 0x876D, 0x876D, 0x2A1D,\n    0x876E, 0x876E, 0x2A26, 0x876F, 0x876F, 0x2A23, 0x8770, 0x8770, 0x3E6C,\n    0x8771, 0x8771, 0x380B, 0x8773, 0x8773, 0x2A14, 0x8774, 0x8774, 0x1200,\n    0x8775, 0x8775, 0x2A2B, 0x8776, 0x8776, 0x1201, 0x8777, 0x8777, 0x2A12,\n    0x8778, 0x8778, 0x1204, 0x8779, 0x8779, 0x2C6B, 0x877A, 0x877A, 0x2A25,\n    0x877B, 0x877B, 0x2A2A, 0x877D, 0x877D, 0x4045, 0x8781, 0x8781, 0x2C68,\n    0x8782, 0x8782, 0x11FF, 0x8783, 0x8783, 0x1340, 0x8784, 0x8784, 0x2C72,\n    0x8785, 0x8785, 0x2C6E, 0x8786, 0x8786, 0x3EB0, 0x8787, 0x8787, 0x2C6C,\n    0x8788, 0x8788, 0x2C67, 0x8789, 0x8789, 0x2C76, 0x878B, 0x878B, 0x43E2,\n    0x878C, 0x878C, 0x3FEF, 0x878D, 0x878D, 0x1344, 0x878F, 0x878F, 0x2C63,\n    0x8790, 0x8791, 0x2C6F, 0x8792, 0x8792, 0x2C66, 0x8793, 0x8793, 0x2C65,\n    0x8794, 0x8794, 0x2C73, 0x8796, 0x8796, 0x2C69, 0x8797, 0x8797, 0x2C64,\n    0x8798, 0x8798, 0x2C6A, 0x879A, 0x879A, 0x2C75, 0x879B, 0x879B, 0x2C62,\n    0x879C, 0x879C, 0x2C74, 0x879D, 0x879D, 0x2C71, 0x879E, 0x879E, 0x1342,\n    0x879F, 0x879F, 0x1341, 0x87A2, 0x87A2, 0x1343, 0x87A3, 0x87A3, 0x2C6D,\n    0x87A4, 0x87A4, 0x2C61, 0x87A5, 0x87A5, 0x3D88, 0x87A9, 0x87A9, 0x3FEC,\n    0x87AA, 0x87AA, 0x2E36, 0x87AB, 0x87AB, 0x146C, 0x87AC, 0x87AC, 0x2E3A,\n    0x87AD, 0x87AD, 0x2E37, 0x87AE, 0x87AE, 0x2E3E, 0x87AF, 0x87AF, 0x2E44,\n    0x87B0, 0x87B0, 0x2E39, 0x87B1, 0x87B1, 0x380F, 0x87B2, 0x87B2, 0x2E4D,\n    0x87B3, 0x87B3, 0x1469, 0x87B4, 0x87B4, 0x2E47, 0x87B5, 0x87B5, 0x2E3C,\n    0x87B6, 0x87B6, 0x2E48, 0x87B7, 0x87B7, 0x2E43, 0x87B8, 0x87B8, 0x2E4A,\n    0x87B9, 0x87B9, 0x2E3B, 0x87BA, 0x87BA, 0x146E, 0x87BB, 0x87BB, 0x146D,\n    0x87BC, 0x87BC, 0x2E3D, 0x87BD, 0x87BD, 0x2E4B, 0x87BE, 0x87BE, 0x2E35,\n    0x87BF, 0x87BF, 0x2E49, 0x87C0, 0x87C0, 0x1467, 0x87C1, 0x87C1, 0x3FFC,\n    0x87C2, 0x87C2, 0x2E41, 0x87C3, 0x87C3, 0x2E40, 0x87C4, 0x87C4, 0x2E45,\n    0x87C5, 0x87C5, 0x2E38, 0x87C6, 0x87C6, 0x146B, 0x87C8, 0x87C8, 0x146F,\n    0x87C9, 0x87C9, 0x2E3F, 0x87CA, 0x87CA, 0x2E46, 0x87CB, 0x87CB, 0x1470,\n    0x87CC, 0x87CC, 0x2E42, 0x87CE, 0x87CE, 0x3FED, 0x87D1, 0x87D1, 0x1468,\n    0x87D2, 0x87D2, 0x146A, 0x87D3, 0x87D3, 0x2FBA, 0x87D4, 0x87D4, 0x2FB8,\n    0x87D6, 0x87D6, 0x3F92, 0x87D7, 0x87D7, 0x2FBE, 0x87D8, 0x87D8, 0x2FBC,\n    0x87D9, 0x87D9, 0x2FBF, 0x87DA, 0x87DA, 0x3810, 0x87DB, 0x87DB, 0x2FB1,\n    0x87DC, 0x87DC, 0x2FB9, 0x87DD, 0x87DD, 0x2FC3, 0x87DE, 0x87DE, 0x2E4C,\n    0x87DF, 0x87DF, 0x2FB5, 0x87E0, 0x87E0, 0x1526, 0x87E1, 0x87E1, 0x2A13,\n    0x87E2, 0x87E2, 0x2FB0, 0x87E3, 0x87E3, 0x2FBD, 0x87E4, 0x87E4, 0x2FB7,\n    0x87E5, 0x87E5, 0x2FB4, 0x87E6, 0x87E6, 0x2FAF, 0x87E7, 0x87E7, 0x2FAE,\n    0x87E8, 0x87E8, 0x2FC2, 0x87EA, 0x87EA, 0x2FB3, 0x87EB, 0x87EB, 0x2FB2,\n    0x87EC, 0x87EC, 0x1524, 0x87ED, 0x87ED, 0x2FBB, 0x87EE, 0x87EE, 0x380D,\n    0x87EF, 0x87EF, 0x1523, 0x87F2, 0x87F2, 0x1525, 0x87F3, 0x87F3, 0x2FB6,\n    0x87F4, 0x87F4, 0x2FC1, 0x87F5, 0x87F5, 0x3FAE, 0x87F6, 0x87F7, 0x310A,\n    0x87F9, 0x87F9, 0x15BE, 0x87FA, 0x87FA, 0x3108, 0x87FB, 0x87FB, 0x15BB,\n    0x87FC, 0x87FC, 0x3110, 0x87FE, 0x87FE, 0x15BF, 0x87FF, 0x87FF, 0x3112,\n    0x8800, 0x8800, 0x3107, 0x8801, 0x8801, 0x2FC0, 0x8802, 0x8802, 0x3114,\n    0x8803, 0x8803, 0x3109, 0x8804, 0x8804, 0x3EAF, 0x8805, 0x8805, 0x15BC,\n    0x8806, 0x8806, 0x310F, 0x8808, 0x8808, 0x3111, 0x8809, 0x8809, 0x310C,\n    0x880A, 0x880A, 0x3113, 0x880B, 0x880B, 0x310E, 0x880C, 0x880C, 0x310D,\n    0x880D, 0x880D, 0x15BD, 0x880F, 0x880F, 0x3811, 0x8810, 0x8811, 0x322C,\n    0x8813, 0x8813, 0x322F, 0x8814, 0x8815, 0x163F, 0x8816, 0x8816, 0x3230,\n    0x8817, 0x8817, 0x322E, 0x8818, 0x8818, 0x3F7A, 0x8819, 0x8819, 0x322B,\n    0x881B, 0x881B, 0x3306, 0x881C, 0x881C, 0x3309, 0x881D, 0x881D, 0x3305,\n    0x881F, 0x881F, 0x168B, 0x8820, 0x8820, 0x3307, 0x8821, 0x8821, 0x168A,\n    0x8822, 0x8822, 0x1689, 0x8823, 0x8823, 0x1688, 0x8824, 0x8824, 0x3308,\n    0x8825, 0x8825, 0x33B1, 0x8826, 0x8826, 0x33AF, 0x8827, 0x8827, 0x3E07,\n    0x8828, 0x8828, 0x33AE, 0x8829, 0x8829, 0x3304, 0x882A, 0x882A, 0x33B0,\n    0x882B, 0x882B, 0x330A, 0x882C, 0x882C, 0x33AD, 0x882D, 0x882D, 0x3B8B,\n    0x882E, 0x882E, 0x3437, 0x882F, 0x882F, 0x3415, 0x8830, 0x8830, 0x3435,\n    0x8831, 0x8831, 0x1709, 0x8832, 0x8832, 0x3436, 0x8833, 0x8833, 0x3438,\n    0x8835, 0x8835, 0x349A, 0x8836, 0x8836, 0x1728, 0x8837, 0x8837, 0x3499,\n    0x8838, 0x8838, 0x3498, 0x8839, 0x8839, 0x1729, 0x883B, 0x883B, 0x1747,\n    0x883C, 0x883C, 0x3508, 0x883D, 0x883D, 0x3520, 0x883E, 0x883E, 0x351F,\n    0x883F, 0x883F, 0x3521, 0x8840, 0x8840, 0x0410, 0x8841, 0x8841, 0x1BFE,\n    0x8842, 0x8842, 0x3F5A, 0x8843, 0x8844, 0x1DFA, 0x8845, 0x8846, 0x3816,\n    0x8848, 0x8848, 0x22D3, 0x884A, 0x884A, 0x330B, 0x884B, 0x884B, 0x349B,\n    0x884C, 0x884C, 0x0411, 0x884D, 0x884D, 0x0803, 0x884E, 0x884E, 0x1BFF,\n    0x884F, 0x884F, 0x3844, 0x8852, 0x8852, 0x204F, 0x8853, 0x8853, 0x0B94,\n    0x8855, 0x8855, 0x22D5, 0x8856, 0x8856, 0x22D4, 0x8857, 0x8857, 0x0D51,\n    0x8859, 0x8859, 0x0EFA, 0x885A, 0x885A, 0x2A2F, 0x885B, 0x885B, 0x120A,\n    0x885D, 0x885D, 0x120B, 0x885E, 0x885E, 0x381B, 0x8860, 0x8860, 0x3A46,\n    0x8861, 0x8861, 0x1345, 0x8862, 0x8862, 0x172A, 0x8863, 0x8863, 0x0412,\n    0x8864, 0x8864, 0x4502, 0x8865, 0x8865, 0x3DFC, 0x8867, 0x8867, 0x1C00,\n    0x8868, 0x8868, 0x068C, 0x8869, 0x8869, 0x1C02, 0x886A, 0x886A, 0x1C01,\n    0x886B, 0x886B, 0x0804, 0x886D, 0x886D, 0x1DFC, 0x886E, 0x886E, 0x3B8E,\n    0x886F, 0x886F, 0x1E03, 0x8870, 0x8870, 0x09B8, 0x8871, 0x8871, 0x1E01,\n    0x8872, 0x8872, 0x1DFF, 0x8874, 0x8874, 0x1E06, 0x8875, 0x8876, 0x1DFD,\n    0x8877, 0x8877, 0x09B9, 0x8879, 0x8879, 0x09BD, 0x887C, 0x887C, 0x1E07,\n    0x887D, 0x887D, 0x09BC, 0x887E, 0x887E, 0x1E05, 0x887F, 0x887F, 0x1E02,\n    0x8880, 0x8880, 0x1E00, 0x8881, 0x8882, 0x09BA, 0x8883, 0x8883, 0x1E04,\n    0x8884, 0x8884, 0x42F7, 0x8887, 0x8887, 0x3B90, 0x8888, 0x8888, 0x0B96,\n    0x8889, 0x8889, 0x2050, 0x888B, 0x888B, 0x0B9B, 0x888C, 0x888C, 0x2060,\n    0x888D, 0x888D, 0x0B9A, 0x888E, 0x888E, 0x2062, 0x8891, 0x8891, 0x2056,\n    0x8892, 0x8892, 0x0B98, 0x8893, 0x8893, 0x2061, 0x8895, 0x8895, 0x2051,\n    0x8896, 0x8896, 0x0B99, 0x8897, 0x8897, 0x205D, 0x8898, 0x8898, 0x2059,\n    0x8899, 0x8899, 0x205B, 0x889A, 0x889A, 0x2055, 0x889B, 0x889B, 0x205C,\n    0x889C, 0x889C, 0x381C, 0x889E, 0x889E, 0x0B95, 0x889F, 0x889F, 0x2058,\n    0x88A0, 0x88A0, 0x3FA0, 0x88A1, 0x88A1, 0x2057, 0x88A2, 0x88A2, 0x2053,\n    0x88A4, 0x88A4, 0x205E, 0x88A7, 0x88A7, 0x205A, 0x88A8, 0x88A8, 0x2052,\n    0x88AA, 0x88AA, 0x2054, 0x88AB, 0x88AB, 0x0B97, 0x88AC, 0x88AC, 0x205F,\n    0x88AE, 0x88AE, 0x4775, 0x88B1, 0x88B1, 0x0D54, 0x88B2, 0x88B2, 0x22E0,\n    0x88B4, 0x88B5, 0x381E, 0x88B6, 0x88B6, 0x22DC, 0x88B7, 0x88B7, 0x22DE,\n    0x88B8, 0x88B8, 0x22D9, 0x88B9, 0x88B9, 0x22D8, 0x88BA, 0x88BA, 0x22D6,\n    0x88BC, 0x88BC, 0x22DD, 0x88BD, 0x88BD, 0x22DF, 0x88BE, 0x88BE, 0x22DB,\n    0x88BF, 0x88BF, 0x3B91, 0x88C0, 0x88C0, 0x22DA, 0x88C1, 0x88C2, 0x0D52,\n    0x88C5, 0x88C5, 0x3820, 0x88C7, 0x88C7, 0x3EB1, 0x88C9, 0x88C9, 0x22E2,\n    0x88CA, 0x88CA, 0x0F02, 0x88CB, 0x88CB, 0x2578, 0x88CC, 0x88CC, 0x257E,\n    0x88CD, 0x88CE, 0x2579, 0x88CF, 0x88CF, 0x36EA, 0x88D0, 0x88D0, 0x257F,\n    0x88D2, 0x88D2, 0x0F04, 0x88D4, 0x88D4, 0x0EFC, 0x88D5, 0x88D5, 0x0F03,\n    0x88D6, 0x88D6, 0x2577, 0x88D7, 0x88D7, 0x22D7, 0x88D8, 0x88D8, 0x0EFF,\n    0x88D9, 0x88D9, 0x0EFD, 0x88DA, 0x88DA, 0x257D, 0x88DB, 0x88DB, 0x257C,\n    0x88DC, 0x88DC, 0x0EFE, 0x88DD, 0x88DD, 0x0F00, 0x88DE, 0x88DE, 0x257B,\n    0x88DF, 0x88DF, 0x0EFB, 0x88E1, 0x88E1, 0x0F01, 0x88E6, 0x88E6, 0x3B92,\n    0x88E7, 0x88E7, 0x27F0, 0x88E8, 0x88E8, 0x10A2, 0x88EB, 0x88EB, 0x27FB,\n    0x88EC, 0x88EC, 0x27FA, 0x88EE, 0x88EE, 0x27F5, 0x88EF, 0x88EF, 0x10A4,\n    0x88F0, 0x88F0, 0x27F9, 0x88F1, 0x88F2, 0x27F1, 0x88F3, 0x88F3, 0x109C,\n    0x88F4, 0x88F4, 0x109E, 0x88F5, 0x88F5, 0x3E08, 0x88F6, 0x88F6, 0x27F7,\n    0x88F7, 0x88F7, 0x27EF, 0x88F8, 0x88F8, 0x10A0, 0x88F9, 0x88F9, 0x109F,\n    0x88FA, 0x88FA, 0x27F3, 0x88FB, 0x88FB, 0x27F8, 0x88FC, 0x88FC, 0x27F6,\n    0x88FD, 0x88FD, 0x10A1, 0x88FE, 0x88FE, 0x27F4, 0x88FF, 0x88FF, 0x4776,\n    0x8900, 0x8900, 0x42FA, 0x8901, 0x8901, 0x22E1, 0x8902, 0x8902, 0x109D,\n    0x8905, 0x8905, 0x2A30, 0x8906, 0x8906, 0x2A37, 0x8907, 0x8907, 0x120D,\n    0x8909, 0x8909, 0x2A3B, 0x890A, 0x890A, 0x1211, 0x890B, 0x890B, 0x2A33,\n    0x890C, 0x890C, 0x2A31, 0x890E, 0x890E, 0x2A3A, 0x8910, 0x8910, 0x120C,\n    0x8911, 0x8911, 0x2A39, 0x8912, 0x8913, 0x120E, 0x8914, 0x8914, 0x2A32,\n    0x8915, 0x8915, 0x1210, 0x8916, 0x8916, 0x2A38, 0x8917, 0x8919, 0x2A34,\n    0x891A, 0x891A, 0x10A3, 0x891E, 0x891E, 0x2C77, 0x891F, 0x891F, 0x2C83,\n    0x8921, 0x8921, 0x134A, 0x8922, 0x8922, 0x2C7E, 0x8923, 0x8923, 0x2C80,\n    0x8924, 0x8924, 0x4777, 0x8925, 0x8925, 0x1348, 0x8926, 0x8926, 0x2C78,\n    0x8927, 0x8927, 0x2C7C, 0x8929, 0x8929, 0x2C7F, 0x892A, 0x892A, 0x1346,\n    0x892B, 0x892B, 0x1349, 0x892C, 0x892C, 0x2C82, 0x892D, 0x892E, 0x2C7A,\n    0x892F, 0x892F, 0x2C81, 0x8930, 0x8930, 0x2C79, 0x8931, 0x8931, 0x2C7D,\n    0x8932, 0x8932, 0x1347, 0x8933, 0x8933, 0x2E4F, 0x8935, 0x8935, 0x2E4E,\n    0x8936, 0x8936, 0x1472, 0x8937, 0x8937, 0x2E54, 0x8938, 0x8938, 0x1474,\n    0x893B, 0x893B, 0x1471, 0x893C, 0x893C, 0x2E50, 0x893D, 0x893D, 0x1475,\n    0x893E, 0x893E, 0x2E51, 0x8941, 0x8941, 0x2E52, 0x8942, 0x8942, 0x2E55,\n    0x8943, 0x8943, 0x3E16, 0x8944, 0x8944, 0x1473, 0x8946, 0x8946, 0x2FC8,\n    0x8947, 0x8947, 0x43E3, 0x8949, 0x8949, 0x2FCB, 0x894B, 0x894B, 0x2FC5,\n    0x894C, 0x894C, 0x2FC7, 0x894D, 0x894D, 0x3B94, 0x894F, 0x894F, 0x2FC6,\n    0x8950, 0x8951, 0x2FC9, 0x8952, 0x8952, 0x2E53, 0x8953, 0x8953, 0x2FC4,\n    0x8954, 0x8954, 0x3B96, 0x8956, 0x8956, 0x15C2, 0x8957, 0x8957, 0x3118,\n    0x8958, 0x8958, 0x311B, 0x8959, 0x8959, 0x311D, 0x895A, 0x895B, 0x3116,\n    0x895C, 0x895C, 0x311A, 0x895D, 0x895D, 0x311C, 0x895E, 0x895E, 0x15C3,\n    0x895F, 0x895F, 0x15C1, 0x8960, 0x8960, 0x15C0, 0x8961, 0x8961, 0x3119,\n    0x8962, 0x8962, 0x3115, 0x8963, 0x8963, 0x3231, 0x8964, 0x8964, 0x1641,\n    0x8965, 0x8965, 0x3B93, 0x8966, 0x8966, 0x3232, 0x8969, 0x8969, 0x330D,\n    0x896A, 0x896A, 0x168C, 0x896B, 0x896B, 0x330F, 0x896C, 0x896C, 0x168D,\n    0x896D, 0x896D, 0x330C, 0x896E, 0x896E, 0x330E, 0x896F, 0x896F, 0x16D6,\n    0x8971, 0x8971, 0x33B2, 0x8972, 0x8972, 0x16D5, 0x8973, 0x8973, 0x343B,\n    0x8974, 0x8974, 0x343A, 0x8976, 0x8976, 0x3439, 0x8977, 0x8977, 0x3DEA,\n    0x8979, 0x897A, 0x34E2, 0x897B, 0x897B, 0x34E5, 0x897C, 0x897C, 0x34E4,\n    0x897E, 0x897E, 0x1819, 0x897F, 0x897F, 0x0413, 0x8980, 0x8980, 0x4708,\n    0x8981, 0x8981, 0x0805, 0x8982, 0x8982, 0x2063, 0x8983, 0x8983, 0x0D55,\n    0x8985, 0x8985, 0x2580, 0x8986, 0x8986, 0x1527, 0x8987, 0x8987, 0x3822,\n    0x8988, 0x8988, 0x311E, 0x8989, 0x8989, 0x3FE9, 0x898A, 0x898A, 0x3823,\n    0x898B, 0x898B, 0x0508, 0x898F, 0x898F, 0x0B9D, 0x8991, 0x8991, 0x4778,\n    0x8993, 0x8993, 0x0B9C, 0x8994, 0x8994, 0x3FE0, 0x8995, 0x8995, 0x22E3,\n    0x8996, 0x8996, 0x0D56, 0x8997, 0x8997, 0x22E5, 0x8998, 0x8998, 0x22E4,\n    0x899B, 0x899B, 0x2581, 0x899C, 0x899C, 0x0F05, 0x899D, 0x899D, 0x27FC,\n    0x899E, 0x899E, 0x27FF, 0x899F, 0x899F, 0x27FE, 0x89A1, 0x89A1, 0x27FD,\n    0x89A2, 0x89A2, 0x2A3C, 0x89A3, 0x89A3, 0x2A3E, 0x89A4, 0x89A4, 0x2A3D,\n    0x89A5, 0x89A5, 0x3D93, 0x89A6, 0x89A6, 0x134C, 0x89A7, 0x89A7, 0x3826,\n    0x89A9, 0x89A9, 0x3825, 0x89AA, 0x89AA, 0x134B, 0x89AC, 0x89AC, 0x1476,\n    0x89AD, 0x89AD, 0x2E56, 0x89AE, 0x89AE, 0x2E58, 0x89AF, 0x89AF, 0x2E57,\n    0x89B2, 0x89B2, 0x1528, 0x89B6, 0x89B6, 0x3120, 0x89B7, 0x89B7, 0x311F,\n    0x89B9, 0x89B9, 0x3233, 0x89BA, 0x89BA, 0x1642, 0x89BC, 0x89BC, 0x3827,\n    0x89BD, 0x89BD, 0x168E, 0x89BE, 0x89BE, 0x33B4, 0x89BF, 0x89BF, 0x33B3,\n    0x89C0, 0x89C0, 0x1748, 0x89C1, 0x89C1, 0x4503, 0x89C6, 0x89C6, 0x4566,\n    0x89D2, 0x89D2, 0x0509, 0x89D3, 0x89D3, 0x1C03, 0x89D4, 0x89D4, 0x0806,\n    0x89D5, 0x89D5, 0x2066, 0x89D6, 0x89D6, 0x2064, 0x89D9, 0x89D9, 0x2065,\n    0x89DA, 0x89DB, 0x22E7, 0x89DC, 0x89DC, 0x2588, 0x89DD, 0x89DD, 0x22E6,\n    0x89DF, 0x89DF, 0x2582, 0x89E0, 0x89E0, 0x2586, 0x89E1, 0x89E1, 0x2585,\n    0x89E2, 0x89E2, 0x2587, 0x89E3, 0x89E3, 0x0F06, 0x89E4, 0x89E4, 0x2584,\n    0x89E5, 0x89E5, 0x2583, 0x89E6, 0x89E6, 0x2589, 0x89E7, 0x89E7, 0x3829,\n    0x89E8, 0x89E8, 0x2802, 0x89E9, 0x89E9, 0x2800, 0x89EB, 0x89EB, 0x2801,\n    0x89EC, 0x89EC, 0x2A41, 0x89ED, 0x89ED, 0x2A3F, 0x89F0, 0x89F0, 0x2A40,\n    0x89F1, 0x89F1, 0x2C84, 0x89F2, 0x89F3, 0x2E59, 0x89F4, 0x89F4, 0x1529,\n    0x89F6, 0x89F6, 0x3121, 0x89F7, 0x89F7, 0x3234, 0x89F8, 0x89F8, 0x1643,\n    0x89FA, 0x89FA, 0x3310, 0x89FB, 0x89FB, 0x33B5, 0x89FC, 0x89FC, 0x16D7,\n    0x89FE, 0x89FE, 0x343C, 0x89FF, 0x89FF, 0x34E6, 0x8A00, 0x8A00, 0x050A,\n    0x8A02, 0x8A03, 0x0808, 0x8A04, 0x8A04, 0x1C04, 0x8A07, 0x8A07, 0x1C05,\n    0x8A08, 0x8A08, 0x0807, 0x8A0A, 0x8A0A, 0x09C3, 0x8A0C, 0x8A0C, 0x09C1,\n    0x8A0E, 0x8A0E, 0x09C0, 0x8A0F, 0x8A0F, 0x09C7, 0x8A10, 0x8A10, 0x09BF,\n    0x8A11, 0x8A11, 0x09C8, 0x8A12, 0x8A12, 0x1E08, 0x8A13, 0x8A13, 0x09C5,\n    0x8A15, 0x8A15, 0x09C2, 0x8A16, 0x8A16, 0x09C6, 0x8A17, 0x8A17, 0x09C4,\n    0x8A18, 0x8A18, 0x09BE, 0x8A1B, 0x8A1B, 0x0BA5, 0x8A1C, 0x8A1C, 0x3BA3,\n    0x8A1D, 0x8A1D, 0x0B9F, 0x8A1E, 0x8A1E, 0x206A, 0x8A1F, 0x8A1F, 0x0BA4,\n    0x8A22, 0x8A22, 0x0BA6, 0x8A23, 0x8A23, 0x0BA0, 0x8A25, 0x8A25, 0x0BA1,\n    0x8A27, 0x8A27, 0x2068, 0x8A29, 0x8A29, 0x43E5, 0x8A2A, 0x8A2A, 0x0B9E,\n    0x8A2B, 0x8A2B, 0x3BD1, 0x8A2C, 0x8A2C, 0x2069, 0x8A2D, 0x8A2D, 0x0BA3,\n    0x8A30, 0x8A30, 0x2067, 0x8A31, 0x8A31, 0x0BA2, 0x8A34, 0x8A34, 0x0D61,\n    0x8A36, 0x8A36, 0x0D63, 0x8A38, 0x8A38, 0x477A, 0x8A39, 0x8A39, 0x22EB,\n    0x8A3A, 0x8A3A, 0x0D62, 0x8A3B, 0x8A3B, 0x0D57, 0x8A3C, 0x8A3C, 0x0D5B,\n    0x8A3D, 0x8A3D, 0x3BA2, 0x8A3E, 0x8A3E, 0x0F19, 0x8A3F, 0x8A3F, 0x258E,\n    0x8A40, 0x8A40, 0x22ED, 0x8A41, 0x8A41, 0x0D5C, 0x8A44, 0x8A45, 0x22F0,\n    0x8A46, 0x8A46, 0x0D60, 0x8A48, 0x8A48, 0x22F3, 0x8A49, 0x8A49, 0x3FF0,\n    0x8A4A, 0x8A4A, 0x22F5, 0x8A4C, 0x8A4C, 0x22F6, 0x8A4D, 0x8A4D, 0x22EA,\n    0x8A4E, 0x8A4E, 0x22E9, 0x8A4F, 0x8A4F, 0x22F7, 0x8A50, 0x8A50, 0x0D5F,\n    0x8A51, 0x8A51, 0x22F4, 0x8A52, 0x8A52, 0x22F2, 0x8A54, 0x8A54, 0x0D5D,\n    0x8A55, 0x8A55, 0x0D59, 0x8A56, 0x8A56, 0x0D64, 0x8A57, 0x8A58, 0x22EE,\n    0x8A59, 0x8A59, 0x22EC, 0x8A5B, 0x8A5B, 0x0D5E, 0x8A5E, 0x8A5E, 0x0D5A,\n    0x8A60, 0x8A60, 0x0D58, 0x8A61, 0x8A61, 0x258D, 0x8A62, 0x8A62, 0x0F14,\n    0x8A63, 0x8A63, 0x0F0F, 0x8A66, 0x8A66, 0x0F0A, 0x8A67, 0x8A67, 0x3F8E,\n    0x8A68, 0x8A68, 0x0F1A, 0x8A69, 0x8A69, 0x0F0B, 0x8A6B, 0x8A6B, 0x0F07,\n    0x8A6C, 0x8A6C, 0x0F16, 0x8A6D, 0x8A6D, 0x0F13, 0x8A6E, 0x8A6E, 0x0F15,\n    0x8A70, 0x8A70, 0x0F0C, 0x8A71, 0x8A71, 0x0F11, 0x8A72, 0x8A73, 0x0F08,\n    0x8A74, 0x8A74, 0x2595, 0x8A75, 0x8A75, 0x2592, 0x8A76, 0x8A76, 0x258A,\n    0x8A77, 0x8A77, 0x258F, 0x8A79, 0x8A79, 0x0F17, 0x8A7A, 0x8A7A, 0x2596,\n    0x8A7B, 0x8A7B, 0x0F18, 0x8A7C, 0x8A7C, 0x0F0E, 0x8A7E, 0x8A7E, 0x3FA5,\n    0x8A7F, 0x8A7F, 0x258C, 0x8A81, 0x8A81, 0x2594, 0x8A82, 0x8A82, 0x2590,\n    0x8A83, 0x8A83, 0x2593, 0x8A84, 0x8A84, 0x2591, 0x8A85, 0x8A85, 0x0F12,\n    0x8A86, 0x8A86, 0x258B, 0x8A87, 0x8A87, 0x0F0D, 0x8A8B, 0x8A8B, 0x2805,\n    0x8A8C, 0x8A8C, 0x10A6, 0x8A8D, 0x8A8D, 0x10A9, 0x8A8F, 0x8A8F, 0x2807,\n    0x8A90, 0x8A90, 0x382F, 0x8A91, 0x8A91, 0x10B1, 0x8A92, 0x8A92, 0x2806,\n    0x8A93, 0x8A93, 0x10AB, 0x8A94, 0x8A94, 0x477B, 0x8A95, 0x8A95, 0x1216,\n    0x8A96, 0x8A96, 0x2808, 0x8A98, 0x8A98, 0x10B0, 0x8A99, 0x8A99, 0x2804,\n    0x8A9A, 0x8A9A, 0x10B2, 0x8A9C, 0x8A9C, 0x382C, 0x8A9E, 0x8A9E, 0x10A7,\n    0x8AA0, 0x8AA0, 0x0F10, 0x8AA1, 0x8AA1, 0x10AA, 0x8AA3, 0x8AA3, 0x10A8,\n    0x8AA4, 0x8AA4, 0x10AC, 0x8AA5, 0x8AA5, 0x10AE, 0x8AA6, 0x8AA6, 0x10A5,\n    0x8AA7, 0x8AA7, 0x10B3, 0x8AA8, 0x8AA8, 0x10AF, 0x8AA9, 0x8AA9, 0x383D,\n    0x8AAA, 0x8AAA, 0x10AD, 0x8AAB, 0x8AAB, 0x2803, 0x8AAF, 0x8AAF, 0x3841,\n    0x8AB0, 0x8AB0, 0x121D, 0x8AB2, 0x8AB2, 0x1219, 0x8AB4, 0x8AB4, 0x477C,\n    0x8AB6, 0x8AB6, 0x1220, 0x8AB8, 0x8AB8, 0x2A44, 0x8AB9, 0x8AB9, 0x1221,\n    0x8ABA, 0x8ABA, 0x2A50, 0x8ABB, 0x8ABB, 0x2A49, 0x8ABC, 0x8ABC, 0x1212,\n    0x8ABD, 0x8ABD, 0x2A51, 0x8ABE, 0x8ABE, 0x2A4B, 0x8ABF, 0x8ABF, 0x121C,\n    0x8AC0, 0x8AC0, 0x2A4C, 0x8AC2, 0x8AC2, 0x121B, 0x8AC3, 0x8AC3, 0x2A4F,\n    0x8AC4, 0x8AC4, 0x1215, 0x8AC5, 0x8AC5, 0x2A4D, 0x8AC6, 0x8AC6, 0x2A43,\n    0x8AC7, 0x8AC7, 0x1214, 0x8AC8, 0x8AC8, 0x2C8F, 0x8AC9, 0x8AC9, 0x121A,\n    0x8ACB, 0x8ACB, 0x1217, 0x8ACD, 0x8ACD, 0x121F, 0x8ACF, 0x8ACF, 0x2A42,\n    0x8AD1, 0x8AD1, 0x2A46, 0x8AD2, 0x8AD2, 0x1213, 0x8AD3, 0x8AD3, 0x2A45,\n    0x8AD4, 0x8AD5, 0x2A47, 0x8AD6, 0x8AD6, 0x121E, 0x8AD7, 0x8AD7, 0x2A4A,\n    0x8AD8, 0x8AD8, 0x2A4E, 0x8AD9, 0x8AD9, 0x2A52, 0x8ADA, 0x8ADA, 0x39C2,\n    0x8ADB, 0x8ADB, 0x1222, 0x8ADC, 0x8ADC, 0x1352, 0x8ADD, 0x8ADD, 0x2C8A,\n    0x8ADE, 0x8ADE, 0x2C90, 0x8ADF, 0x8ADF, 0x2C8D, 0x8AE0, 0x8AE0, 0x2C85,\n    0x8AE1, 0x8AE1, 0x2C91, 0x8AE2, 0x8AE2, 0x2C86, 0x8AE4, 0x8AE4, 0x2C8C,\n    0x8AE6, 0x8AE6, 0x134D, 0x8AE7, 0x8AE7, 0x1353, 0x8AE8, 0x8AE8, 0x2C92,\n    0x8AEA, 0x8AEA, 0x3DD9, 0x8AEB, 0x8AEB, 0x134F, 0x8AED, 0x8AED, 0x1359,\n    0x8AEE, 0x8AEE, 0x1354, 0x8AEF, 0x8AEF, 0x2C94, 0x8AF0, 0x8AF0, 0x2C8E,\n    0x8AF1, 0x8AF1, 0x1350, 0x8AF2, 0x8AF2, 0x2C87, 0x8AF3, 0x8AF3, 0x135A,\n    0x8AF4, 0x8AF5, 0x2C88, 0x8AF6, 0x8AF6, 0x135B, 0x8AF7, 0x8AF7, 0x1358,\n    0x8AF8, 0x8AF8, 0x1218, 0x8AFA, 0x8AFA, 0x134E, 0x8AFB, 0x8AFB, 0x2C95,\n    0x8AFC, 0x8AFC, 0x135C, 0x8AFE, 0x8AFE, 0x1355, 0x8AFF, 0x8AFF, 0x2C93,\n    0x8B00, 0x8B00, 0x1351, 0x8B01, 0x8B02, 0x1356, 0x8B04, 0x8B04, 0x147E,\n    0x8B05, 0x8B05, 0x2E5F, 0x8B06, 0x8B06, 0x2E68, 0x8B07, 0x8B07, 0x2E65,\n    0x8B08, 0x8B08, 0x2E67, 0x8B0A, 0x8B0A, 0x147B, 0x8B0B, 0x8B0B, 0x2E60,\n    0x8B0C, 0x8B0C, 0x3836, 0x8B0D, 0x8B0D, 0x2E66, 0x8B0E, 0x8B0E, 0x1477,\n    0x8B0F, 0x8B0F, 0x2E62, 0x8B10, 0x8B10, 0x147F, 0x8B11, 0x8B11, 0x2E5E,\n    0x8B12, 0x8B12, 0x2E63, 0x8B13, 0x8B13, 0x2E6A, 0x8B14, 0x8B14, 0x2C8B,\n    0x8B15, 0x8B15, 0x2E64, 0x8B16, 0x8B16, 0x2E5D, 0x8B17, 0x8B17, 0x1478,\n    0x8B18, 0x8B18, 0x2E5C, 0x8B19, 0x8B19, 0x1479, 0x8B1A, 0x8B1A, 0x2E6B,\n    0x8B1B, 0x8B1B, 0x147A, 0x8B1C, 0x8B1C, 0x2E69, 0x8B1D, 0x8B1D, 0x147D,\n    0x8B1E, 0x8B1E, 0x2E5B, 0x8B1F, 0x8B1F, 0x3837, 0x8B20, 0x8B20, 0x147C,\n    0x8B22, 0x8B22, 0x2E61, 0x8B23, 0x8B23, 0x2FCE, 0x8B24, 0x8B24, 0x2FDC,\n    0x8B25, 0x8B25, 0x2FD7, 0x8B26, 0x8B26, 0x2FD9, 0x8B27, 0x8B27, 0x2FCD,\n    0x8B28, 0x8B28, 0x152A, 0x8B2A, 0x8B2A, 0x2FCC, 0x8B2B, 0x8B2B, 0x152D,\n    0x8B2C, 0x8B2C, 0x152C, 0x8B2D, 0x8B2D, 0x3F99, 0x8B2E, 0x8B2E, 0x2FDB,\n    0x8B2F, 0x8B2F, 0x2FD3, 0x8B30, 0x8B30, 0x2FD0, 0x8B31, 0x8B31, 0x2FD6,\n    0x8B33, 0x8B33, 0x2FCF, 0x8B35, 0x8B35, 0x2FD1, 0x8B36, 0x8B36, 0x2FDA,\n    0x8B37, 0x8B37, 0x2FD8, 0x8B39, 0x8B39, 0x152B, 0x8B3A, 0x8B3A, 0x2FDF,\n    0x8B3B, 0x8B3B, 0x2FDD, 0x8B3C, 0x8B3C, 0x2FD4, 0x8B3D, 0x8B3D, 0x2FDE,\n    0x8B3E, 0x8B3E, 0x2FD5, 0x8B3F, 0x8B3F, 0x383A, 0x8B40, 0x8B40, 0x3125,\n    0x8B41, 0x8B41, 0x15C4, 0x8B42, 0x8B42, 0x312C, 0x8B43, 0x8B43, 0x3FF2,\n    0x8B45, 0x8B45, 0x3313, 0x8B46, 0x8B46, 0x15CB, 0x8B47, 0x8B47, 0x2FD2,\n    0x8B48, 0x8B48, 0x3123, 0x8B49, 0x8B49, 0x15C7, 0x8B4A, 0x8B4A, 0x3124,\n    0x8B4B, 0x8B4B, 0x3129, 0x8B4C, 0x8B4D, 0x383B, 0x8B4E, 0x8B4F, 0x15C9,\n    0x8B50, 0x8B50, 0x3122, 0x8B51, 0x8B51, 0x312B, 0x8B52, 0x8B52, 0x312D,\n    0x8B53, 0x8B53, 0x3126, 0x8B54, 0x8B54, 0x3128, 0x8B55, 0x8B55, 0x312A,\n    0x8B56, 0x8B56, 0x3127, 0x8B57, 0x8B57, 0x312E, 0x8B58, 0x8B58, 0x15C6,\n    0x8B59, 0x8B59, 0x15CC, 0x8B5A, 0x8B5A, 0x15C8, 0x8B5C, 0x8B5C, 0x15C5,\n    0x8B5D, 0x8B5D, 0x3237, 0x8B5E, 0x8B5E, 0x3DB8, 0x8B5F, 0x8B5F, 0x1648,\n    0x8B60, 0x8B60, 0x3235, 0x8B62, 0x8B62, 0x3DD4, 0x8B63, 0x8B63, 0x3239,\n    0x8B65, 0x8B65, 0x323A, 0x8B66, 0x8B66, 0x1646, 0x8B67, 0x8B67, 0x323B,\n    0x8B68, 0x8B68, 0x3238, 0x8B69, 0x8B69, 0x3BF7, 0x8B6A, 0x8B6A, 0x3236,\n    0x8B6B, 0x8B6B, 0x1649, 0x8B6C, 0x8B6C, 0x1645, 0x8B6D, 0x8B6D, 0x323C,\n    0x8B6F, 0x8B6F, 0x1647, 0x8B70, 0x8B70, 0x1644, 0x8B74, 0x8B74, 0x168F,\n    0x8B77, 0x8B77, 0x1690, 0x8B78, 0x8B78, 0x3312, 0x8B79, 0x8B79, 0x3311,\n    0x8B7A, 0x8B7B, 0x3314, 0x8B7D, 0x8B7D, 0x1691, 0x8B7E, 0x8B7E, 0x33B6,\n    0x8B7F, 0x8B7F, 0x33BB, 0x8B80, 0x8B80, 0x16D8, 0x8B81, 0x8B81, 0x3D8D,\n    0x8B82, 0x8B82, 0x33B8, 0x8B84, 0x8B84, 0x33B7, 0x8B85, 0x8B85, 0x33BA,\n    0x8B86, 0x8B86, 0x33B9, 0x8B88, 0x8B88, 0x3440, 0x8B8A, 0x8B8A, 0x170A,\n    0x8B8B, 0x8B8B, 0x343F, 0x8B8C, 0x8B8C, 0x343D, 0x8B8E, 0x8B8E, 0x343E,\n    0x8B90, 0x8B90, 0x383F, 0x8B92, 0x8B92, 0x172C, 0x8B93, 0x8B93, 0x172B,\n    0x8B94, 0x8B95, 0x349C, 0x8B96, 0x8B96, 0x172D, 0x8B98, 0x8B99, 0x34E7,\n    0x8B9A, 0x8B9A, 0x1754, 0x8B9B, 0x8B9B, 0x3840, 0x8B9C, 0x8B9C, 0x175A,\n    0x8B9E, 0x8B9E, 0x3522, 0x8B9F, 0x8B9F, 0x353F, 0x8BA0, 0x8BA0, 0x4505,\n    0x8BBE, 0x8BBE, 0x4567, 0x8BE2, 0x8BE2, 0x4568, 0x8C37, 0x8C37, 0x050B,\n    0x8C39, 0x8C39, 0x206B, 0x8C3B, 0x8C3B, 0x206C, 0x8C3C, 0x8C3C, 0x2597,\n    0x8C3D, 0x8C3D, 0x2809, 0x8C3E, 0x8C3E, 0x2A53, 0x8C3F, 0x8C3F, 0x1481,\n    0x8C41, 0x8C41, 0x1480, 0x8C42, 0x8C42, 0x2FE0, 0x8C43, 0x8C43, 0x312F,\n    0x8C45, 0x8C45, 0x3441, 0x8C46, 0x8C46, 0x050C, 0x8C47, 0x8C47, 0x1E09,\n    0x8C48, 0x8C48, 0x09C9, 0x8C49, 0x8C49, 0x0BA7, 0x8C4A, 0x8C4A, 0x2599,\n    0x8C4B, 0x8C4B, 0x2598, 0x8C4C, 0x8C4C, 0x1223, 0x8C4D, 0x8C4D, 0x2A54,\n    0x8C4E, 0x8C4E, 0x1224, 0x8C4F, 0x8C4F, 0x2E6C, 0x8C50, 0x8C50, 0x152E,\n    0x8C51, 0x8C51, 0x477D, 0x8C54, 0x8C54, 0x1763, 0x8C55, 0x8C55, 0x050D,\n    0x8C56, 0x8C56, 0x1A48, 0x8C57, 0x8C57, 0x1E0A, 0x8C5A, 0x8C5A, 0x0BA8,\n    0x8C5C, 0x8C5D, 0x206D, 0x8C5F, 0x8C5F, 0x22F8, 0x8C61, 0x8C61, 0x0D65,\n    0x8C62, 0x8C62, 0x0F1B, 0x8C64, 0x8C64, 0x259B, 0x8C65, 0x8C65, 0x259A,\n    0x8C66, 0x8C66, 0x259C, 0x8C68, 0x8C69, 0x280A, 0x8C6A, 0x8C6A, 0x10B4,\n    0x8C6B, 0x8C6B, 0x135D, 0x8C6C, 0x8C6C, 0x1225, 0x8C6D, 0x8C6D, 0x135E,\n    0x8C6F, 0x8C6F, 0x2E70, 0x8C70, 0x8C70, 0x2E6D, 0x8C71, 0x8C71, 0x2E6F,\n    0x8C72, 0x8C72, 0x2E6E, 0x8C73, 0x8C73, 0x1482, 0x8C75, 0x8C75, 0x2FE1,\n    0x8C76, 0x8C76, 0x3131, 0x8C77, 0x8C77, 0x3130, 0x8C78, 0x8C78, 0x18E7,\n    0x8C79, 0x8C79, 0x09CB, 0x8C7A, 0x8C7A, 0x09CA, 0x8C7B, 0x8C7B, 0x1E0B,\n    0x8C7D, 0x8C7D, 0x206F, 0x8C80, 0x8C80, 0x22FA, 0x8C81, 0x8C81, 0x22F9,\n    0x8C82, 0x8C82, 0x0D66, 0x8C84, 0x8C85, 0x259E, 0x8C86, 0x8C86, 0x259D,\n    0x8C89, 0x8C89, 0x0F1D, 0x8C8A, 0x8C8A, 0x0F1C, 0x8C8C, 0x8C8C, 0x10B6,\n    0x8C8D, 0x8C8D, 0x10B5, 0x8C8F, 0x8C8F, 0x2A55, 0x8C90, 0x8C90, 0x2C98,\n    0x8C91, 0x8C92, 0x2C96, 0x8C93, 0x8C93, 0x135F, 0x8C94, 0x8C94, 0x2E72,\n    0x8C95, 0x8C95, 0x2E71, 0x8C97, 0x8C97, 0x2FE4, 0x8C98, 0x8C98, 0x2FE3,\n    0x8C99, 0x8C99, 0x2FE2, 0x8C9A, 0x8C9A, 0x3132, 0x8C9B, 0x8C9B, 0x3845,\n    0x8C9C, 0x8C9C, 0x3523, 0x8C9D, 0x8C9D, 0x050E, 0x8C9E, 0x8C9E, 0x080A,\n    0x8C9F, 0x8C9F, 0x3BAD, 0x8CA0, 0x8CA0, 0x080B, 0x8CA1, 0x8CA2, 0x09CC,\n    0x8CA3, 0x8CA3, 0x1E0D, 0x8CA4, 0x8CA4, 0x1E0C, 0x8CA5, 0x8CA5, 0x2070,\n    0x8CA7, 0x8CA7, 0x0BAE, 0x8CA8, 0x8CA8, 0x0BAC, 0x8CA9, 0x8CA9, 0x0BA9,\n    0x8CAA, 0x8CAA, 0x0BAD, 0x8CAB, 0x8CAB, 0x0BAB, 0x8CAC, 0x8CAC, 0x0BAA,\n    0x8CAD, 0x8CAD, 0x3FF1, 0x8CAF, 0x8CAF, 0x0D67, 0x8CB0, 0x8CB0, 0x22FD,\n    0x8CB2, 0x8CB2, 0x0F22, 0x8CB3, 0x8CB3, 0x0D69, 0x8CB4, 0x8CB4, 0x0D6E,\n    0x8CB5, 0x8CB5, 0x22FF, 0x8CB6, 0x8CB6, 0x0D70, 0x8CB7, 0x8CB7, 0x0D6F,\n    0x8CB8, 0x8CB8, 0x0D72, 0x8CB9, 0x8CB9, 0x22FE, 0x8CBA, 0x8CBA, 0x22FB,\n    0x8CBB, 0x8CBB, 0x0D6C, 0x8CBC, 0x8CBC, 0x0D68, 0x8CBD, 0x8CBD, 0x0D6A,\n    0x8CBE, 0x8CBE, 0x22FC, 0x8CBF, 0x8CBF, 0x0D71, 0x8CC0, 0x8CC0, 0x0D6D,\n    0x8CC1, 0x8CC1, 0x0D6B, 0x8CC2, 0x8CC2, 0x0F24, 0x8CC3, 0x8CC3, 0x0F23,\n    0x8CC4, 0x8CC4, 0x0F21, 0x8CC5, 0x8CC5, 0x0F25, 0x8CC7, 0x8CC8, 0x0F1F,\n    0x8CCA, 0x8CCA, 0x0F1E, 0x8CCC, 0x8CCC, 0x25A0, 0x8CCD, 0x8CCD, 0x3E99,\n    0x8CCF, 0x8CCF, 0x280D, 0x8CD1, 0x8CD2, 0x10B8, 0x8CD3, 0x8CD3, 0x10B7,\n    0x8CD4, 0x8CD4, 0x477E, 0x8CD5, 0x8CD5, 0x280C, 0x8CD6, 0x8CD6, 0x384B,\n    0x8CD7, 0x8CD7, 0x280E, 0x8CD9, 0x8CD9, 0x2A58, 0x8CDA, 0x8CDA, 0x2A5A,\n    0x8CDB, 0x8CDB, 0x3851, 0x8CDC, 0x8CDC, 0x122E, 0x8CDD, 0x8CDD, 0x2A5B,\n    0x8CDE, 0x8CDE, 0x1227, 0x8CDF, 0x8CDF, 0x2A57, 0x8CE0, 0x8CE0, 0x1226,\n    0x8CE1, 0x8CE1, 0x1230, 0x8CE2, 0x8CE3, 0x122C, 0x8CE4, 0x8CE4, 0x1229,\n    0x8CE5, 0x8CE5, 0x2A56, 0x8CE6, 0x8CE6, 0x1228, 0x8CE7, 0x8CE7, 0x2A5C,\n    0x8CE8, 0x8CE8, 0x2A59, 0x8CE9, 0x8CE9, 0x3BAE, 0x8CEA, 0x8CEA, 0x122F,\n    0x8CEB, 0x8CEB, 0x3F9C, 0x8CEC, 0x8CED, 0x122A, 0x8CEE, 0x8CEE, 0x2C9A,\n    0x8CF0, 0x8CF0, 0x2C9C, 0x8CF1, 0x8CF1, 0x2C9B, 0x8CF2, 0x8CF2, 0x477F,\n    0x8CF3, 0x8CF3, 0x2C9D, 0x8CF4, 0x8CF4, 0x1360, 0x8CF5, 0x8CF5, 0x2C99,\n    0x8CF7, 0x8CF7, 0x3FB1, 0x8CF8, 0x8CF8, 0x1486, 0x8CF9, 0x8CF9, 0x2E73,\n    0x8CFA, 0x8CFA, 0x1483, 0x8CFB, 0x8CFB, 0x1487, 0x8CFC, 0x8CFC, 0x1485,\n    0x8CFD, 0x8CFD, 0x1484, 0x8CFE, 0x8CFE, 0x2FE5, 0x8D00, 0x8D00, 0x2FE8,\n    0x8D02, 0x8D02, 0x2FE7, 0x8D03, 0x8D03, 0x384F, 0x8D04, 0x8D04, 0x2FE6,\n    0x8D05, 0x8D05, 0x152F, 0x8D06, 0x8D07, 0x3133, 0x8D08, 0x8D08, 0x15CD,\n    0x8D09, 0x8D09, 0x3135, 0x8D0A, 0x8D0A, 0x15CE, 0x8D0B, 0x8D0B, 0x4573,\n    0x8D0C, 0x8D0C, 0x3F96, 0x8D0D, 0x8D0D, 0x164B, 0x8D0F, 0x8D0F, 0x164A,\n    0x8D10, 0x8D10, 0x3316, 0x8D11, 0x8D11, 0x3853, 0x8D12, 0x8D12, 0x384E,\n    0x8D13, 0x8D13, 0x1692, 0x8D14, 0x8D14, 0x3317, 0x8D15, 0x8D15, 0x33BC,\n    0x8D16, 0x8D17, 0x16D9, 0x8D18, 0x8D18, 0x3E6F, 0x8D19, 0x8D19, 0x3442,\n    0x8D1B, 0x8D1B, 0x172F, 0x8D1C, 0x8D1C, 0x4780, 0x8D1D, 0x8D1D, 0x4506,\n    0x8D64, 0x8D64, 0x050F, 0x8D66, 0x8D66, 0x0BB0, 0x8D67, 0x8D67, 0x0BAF,\n    0x8D68, 0x8D69, 0x25A1, 0x8D6B, 0x8D6B, 0x10BA, 0x8D6C, 0x8D6C, 0x2C9E,\n    0x8D6D, 0x8D6D, 0x1231, 0x8D6E, 0x8D6E, 0x2C9F, 0x8D6F, 0x8D6F, 0x2E74,\n    0x8D70, 0x8D70, 0x0510, 0x8D72, 0x8D72, 0x1C06, 0x8D73, 0x8D73, 0x080D,\n    0x8D74, 0x8D74, 0x080C, 0x8D76, 0x8D76, 0x1E0E, 0x8D77, 0x8D77, 0x09CE,\n    0x8D78, 0x8D78, 0x1E0F, 0x8D79, 0x8D79, 0x2073, 0x8D7A, 0x8D7A, 0x39E1,\n    0x8D7B, 0x8D7B, 0x2072, 0x8D7D, 0x8D7D, 0x2071, 0x8D80, 0x8D80, 0x2301,\n    0x8D81, 0x8D81, 0x0D75, 0x8D82, 0x8D82, 0x3F69, 0x8D84, 0x8D84, 0x2300,\n    0x8D85, 0x8D85, 0x0D74, 0x8D89, 0x8D89, 0x2302, 0x8D8A, 0x8D8A, 0x0D73,\n    0x8D8C, 0x8D8C, 0x25A4, 0x8D8D, 0x8D8D, 0x25A7, 0x8D8E, 0x8D8F, 0x25A5,\n    0x8D90, 0x8D90, 0x25AA, 0x8D91, 0x8D91, 0x25A3, 0x8D92, 0x8D92, 0x25AB,\n    0x8D93, 0x8D94, 0x25A8, 0x8D95, 0x8D95, 0x10BC, 0x8D96, 0x8D96, 0x280F,\n    0x8D99, 0x8D99, 0x10BB, 0x8D9B, 0x8D9B, 0x2A60, 0x8D9C, 0x8D9C, 0x2A5E,\n    0x8D9F, 0x8D9F, 0x1232, 0x8DA0, 0x8DA0, 0x2A5D, 0x8DA1, 0x8DA1, 0x2A5F,\n    0x8DA3, 0x8DA3, 0x1233, 0x8DA5, 0x8DA5, 0x2CA0, 0x8DA6, 0x8DA6, 0x3FF7,\n    0x8DA7, 0x8DA7, 0x2CA1, 0x8DA8, 0x8DA8, 0x1488, 0x8DA9, 0x8DA9, 0x3856,\n    0x8DAA, 0x8DAA, 0x3137, 0x8DAB, 0x8DAB, 0x3139, 0x8DAC, 0x8DAC, 0x3136,\n    0x8DAD, 0x8DAD, 0x3138, 0x8DAE, 0x8DAE, 0x323D, 0x8DAF, 0x8DAF, 0x3318,\n    0x8DB2, 0x8DB2, 0x3509, 0x8DB3, 0x8DB3, 0x0511, 0x8DB4, 0x8DB4, 0x080E,\n    0x8DB5, 0x8DB5, 0x1E10, 0x8DB6, 0x8DB6, 0x1E12, 0x8DB7, 0x8DB7, 0x1E11,\n    0x8DB9, 0x8DB9, 0x2076, 0x8DBA, 0x8DBA, 0x0BB2, 0x8DBC, 0x8DBC, 0x2074,\n    0x8DBE, 0x8DBE, 0x0BB1, 0x8DBF, 0x8DBF, 0x2077, 0x8DC0, 0x8DC0, 0x436A,\n    0x8DC1, 0x8DC1, 0x2078, 0x8DC2, 0x8DC2, 0x2075, 0x8DC3, 0x8DC3, 0x4782,\n    0x8DC5, 0x8DC5, 0x230E, 0x8DC6, 0x8DC6, 0x0D7D, 0x8DC7, 0x8DC7, 0x2306,\n    0x8DC8, 0x8DC8, 0x230C, 0x8DCB, 0x8DCB, 0x0D78, 0x8DCC, 0x8DCC, 0x0D7B,\n    0x8DCD, 0x8DCD, 0x2305, 0x8DCE, 0x8DCE, 0x0D76, 0x8DCF, 0x8DCF, 0x2309,\n    0x8DD0, 0x8DD0, 0x25B1, 0x8DD1, 0x8DD1, 0x0D7A, 0x8DD3, 0x8DD3, 0x2304,\n    0x8DD4, 0x8DD4, 0x3F82, 0x8DD5, 0x8DD5, 0x230A, 0x8DD6, 0x8DD6, 0x2307,\n    0x8DD7, 0x8DD7, 0x230D, 0x8DD8, 0x8DD8, 0x2303, 0x8DD9, 0x8DD9, 0x230B,\n    0x8DDA, 0x8DDA, 0x0D79, 0x8DDB, 0x8DDB, 0x0D7C, 0x8DDC, 0x8DDC, 0x2308,\n    0x8DDD, 0x8DDD, 0x0D77, 0x8DDF, 0x8DDF, 0x0F27, 0x8DE0, 0x8DE0, 0x25AD,\n    0x8DE1, 0x8DE1, 0x0F26, 0x8DE2, 0x8DE2, 0x25B4, 0x8DE3, 0x8DE3, 0x25B3,\n    0x8DE4, 0x8DE4, 0x0F2D, 0x8DE6, 0x8DE6, 0x0F2E, 0x8DE7, 0x8DE7, 0x25B5,\n    0x8DE8, 0x8DE8, 0x0F28, 0x8DE9, 0x8DE9, 0x25B2, 0x8DEA, 0x8DEA, 0x0F2C,\n    0x8DEB, 0x8DEB, 0x25B7, 0x8DEC, 0x8DEC, 0x25AE, 0x8DEE, 0x8DEE, 0x25B0,\n    0x8DEF, 0x8DEF, 0x0F29, 0x8DF0, 0x8DF0, 0x25AC, 0x8DF1, 0x8DF1, 0x25AF,\n    0x8DF2, 0x8DF2, 0x25B6, 0x8DF3, 0x8DF3, 0x0F2A, 0x8DF4, 0x8DF4, 0x25B8,\n    0x8DFA, 0x8DFA, 0x0F2B, 0x8DFC, 0x8DFC, 0x10BD, 0x8DFD, 0x8DFD, 0x2814,\n    0x8DFE, 0x8DFE, 0x281A, 0x8DFF, 0x8DFF, 0x2812, 0x8E00, 0x8E00, 0x281B,\n    0x8E01, 0x8E01, 0x3F85, 0x8E02, 0x8E02, 0x2811, 0x8E03, 0x8E03, 0x2816,\n    0x8E04, 0x8E04, 0x281C, 0x8E05, 0x8E05, 0x2819, 0x8E06, 0x8E06, 0x2818,\n    0x8E07, 0x8E07, 0x2817, 0x8E09, 0x8E09, 0x2810, 0x8E0A, 0x8E0A, 0x2815,\n    0x8E0D, 0x8E0D, 0x2813, 0x8E0E, 0x8E0E, 0x3E5E, 0x8E0F, 0x8E0F, 0x1238,\n    0x8E10, 0x8E10, 0x1235, 0x8E11, 0x8E11, 0x2A69, 0x8E12, 0x8E12, 0x2A6E,\n    0x8E13, 0x8E13, 0x2A70, 0x8E14, 0x8E14, 0x2A6D, 0x8E15, 0x8E15, 0x2A66,\n    0x8E16, 0x8E16, 0x2A68, 0x8E17, 0x8E17, 0x2A72, 0x8E18, 0x8E18, 0x2A6F,\n    0x8E19, 0x8E19, 0x2A6A, 0x8E1A, 0x8E1A, 0x2A73, 0x8E1B, 0x8E1B, 0x2A67,\n    0x8E1C, 0x8E1C, 0x2A71, 0x8E1D, 0x8E1D, 0x1236, 0x8E1E, 0x8E1E, 0x123C,\n    0x8E1F, 0x8E1F, 0x123A, 0x8E20, 0x8E20, 0x2A61, 0x8E21, 0x8E21, 0x123B,\n    0x8E22, 0x8E22, 0x1237, 0x8E23, 0x8E23, 0x2A62, 0x8E24, 0x8E24, 0x2A64,\n    0x8E25, 0x8E25, 0x2A63, 0x8E26, 0x8E27, 0x2A6B, 0x8E28, 0x8E28, 0x3F88,\n    0x8E29, 0x8E29, 0x1239, 0x8E2A, 0x8E2A, 0x3BB4, 0x8E2B, 0x8E2B, 0x1234,\n    0x8E2D, 0x8E2D, 0x3EAB, 0x8E2E, 0x8E2E, 0x2A65, 0x8E30, 0x8E30, 0x2CAB,\n    0x8E31, 0x8E31, 0x1362, 0x8E33, 0x8E33, 0x2CA2, 0x8E34, 0x8E34, 0x1363,\n    0x8E35, 0x8E35, 0x1366, 0x8E36, 0x8E36, 0x2CA7, 0x8E38, 0x8E38, 0x2CA4,\n    0x8E39, 0x8E39, 0x1365, 0x8E3A, 0x8E3A, 0x4784, 0x8E3C, 0x8E3D, 0x2CA8,\n    0x8E3E, 0x8E3E, 0x2CA3, 0x8E3F, 0x8E3F, 0x2CAC, 0x8E40, 0x8E40, 0x2CA5,\n    0x8E41, 0x8E41, 0x2CAA, 0x8E42, 0x8E42, 0x1364, 0x8E44, 0x8E44, 0x1361,\n    0x8E45, 0x8E45, 0x2CA6, 0x8E46, 0x8E46, 0x4312, 0x8E47, 0x8E47, 0x2E7A,\n    0x8E48, 0x8E48, 0x148B, 0x8E49, 0x8E49, 0x1489, 0x8E4A, 0x8E4A, 0x148C,\n    0x8E4B, 0x8E4B, 0x148A, 0x8E4C, 0x8E4C, 0x2E79, 0x8E4D, 0x8E4D, 0x2E76,\n    0x8E4E, 0x8E4E, 0x2E75, 0x8E4F, 0x8E4F, 0x3F83, 0x8E50, 0x8E50, 0x2E78,\n    0x8E53, 0x8E53, 0x2E77, 0x8E54, 0x8E54, 0x2FF6, 0x8E55, 0x8E55, 0x1535,\n    0x8E56, 0x8E56, 0x2FED, 0x8E57, 0x8E57, 0x2FEC, 0x8E59, 0x8E59, 0x1530,\n    0x8E5A, 0x8E5A, 0x2FF2, 0x8E5B, 0x8E5B, 0x2FF1, 0x8E5C, 0x8E5C, 0x2FE9,\n    0x8E5D, 0x8E5D, 0x2FF4, 0x8E5E, 0x8E5E, 0x2FEE, 0x8E5F, 0x8E5F, 0x1534,\n    0x8E60, 0x8E60, 0x2FEB, 0x8E61, 0x8E61, 0x2FF3, 0x8E62, 0x8E62, 0x2FEA,\n    0x8E63, 0x8E63, 0x1531, 0x8E64, 0x8E64, 0x1533, 0x8E65, 0x8E65, 0x2FEF,\n    0x8E66, 0x8E66, 0x1532, 0x8E67, 0x8E67, 0x2FF0, 0x8E68, 0x8E68, 0x434D,\n    0x8E69, 0x8E69, 0x2FF5, 0x8E6A, 0x8E6A, 0x313D, 0x8E6C, 0x8E6C, 0x15D3,\n    0x8E6D, 0x8E6D, 0x313A, 0x8E6F, 0x8E6F, 0x313E, 0x8E71, 0x8E71, 0x43E7,\n    0x8E72, 0x8E72, 0x15D0, 0x8E73, 0x8E73, 0x313C, 0x8E74, 0x8E74, 0x15D5,\n    0x8E75, 0x8E75, 0x3F89, 0x8E76, 0x8E76, 0x15D2, 0x8E77, 0x8E77, 0x3F7F,\n    0x8E78, 0x8E78, 0x313B, 0x8E7A, 0x8E7A, 0x15D4, 0x8E7B, 0x8E7B, 0x313F,\n    0x8E7C, 0x8E7C, 0x15CF, 0x8E7E, 0x8E7E, 0x4324, 0x8E80, 0x8E80, 0x3E57,\n    0x8E81, 0x8E81, 0x164D, 0x8E82, 0x8E82, 0x164F, 0x8E84, 0x8E84, 0x3240,\n    0x8E85, 0x8E85, 0x164E, 0x8E86, 0x8E86, 0x323E, 0x8E87, 0x8E87, 0x15D1,\n    0x8E88, 0x8E88, 0x323F, 0x8E89, 0x8E89, 0x164C, 0x8E8A, 0x8E8A, 0x1693,\n    0x8E8B, 0x8E8B, 0x1695, 0x8E8C, 0x8E8C, 0x331A, 0x8E8D, 0x8E8D, 0x1694,\n    0x8E8E, 0x8E8E, 0x3319, 0x8E90, 0x8E90, 0x33C1, 0x8E91, 0x8E91, 0x16DB,\n    0x8E92, 0x8E92, 0x33C0, 0x8E93, 0x8E93, 0x16DC, 0x8E94, 0x8E94, 0x33BE,\n    0x8E95, 0x8E95, 0x33BD, 0x8E96, 0x8E97, 0x33C2, 0x8E98, 0x8E98, 0x3443,\n    0x8E9A, 0x8E9A, 0x33BF, 0x8E9D, 0x8E9D, 0x34A1, 0x8E9E, 0x8EA0, 0x349E,\n    0x8EA1, 0x8EA1, 0x1749, 0x8EA3, 0x8EA3, 0x34EB, 0x8EA4, 0x8EA4, 0x34EA,\n    0x8EA5, 0x8EA5, 0x34E9, 0x8EA6, 0x8EA6, 0x350A, 0x8EA7, 0x8EA7, 0x3BB5,\n    0x8EA8, 0x8EA8, 0x3537, 0x8EA9, 0x8EA9, 0x3524, 0x8EAA, 0x8EAA, 0x175B,\n    0x8EAB, 0x8EAB, 0x0512, 0x8EAC, 0x8EAC, 0x09CF, 0x8EAD, 0x8EAD, 0x385E,\n    0x8EB0, 0x8EB0, 0x43E9, 0x8EB2, 0x8EB2, 0x0F2F, 0x8EB6, 0x8EB6, 0x385F,\n    0x8EBA, 0x8EBA, 0x123D, 0x8EBC, 0x8EBC, 0x38A0, 0x8EBD, 0x8EBD, 0x2CAD,\n    0x8EC0, 0x8EC0, 0x1536, 0x8EC2, 0x8EC2, 0x3140, 0x8EC3, 0x8EC3, 0x3860,\n    0x8EC9, 0x8EC9, 0x3525, 0x8ECA, 0x8ECA, 0x0513, 0x8ECB, 0x8ECB, 0x068D,\n    0x8ECC, 0x8ECC, 0x0810, 0x8ECD, 0x8ECD, 0x080F, 0x8ECE, 0x8ECE, 0x4788,\n    0x8ECF, 0x8ECF, 0x09D2, 0x8ED1, 0x8ED1, 0x1E13, 0x8ED2, 0x8ED2, 0x09D0,\n    0x8ED3, 0x8ED3, 0x1E14, 0x8ED4, 0x8ED4, 0x09D1, 0x8ED7, 0x8ED7, 0x207D,\n    0x8ED8, 0x8ED8, 0x2079, 0x8EDA, 0x8EDA, 0x3DBE, 0x8EDB, 0x8EDB, 0x0BB3,\n    0x8EDC, 0x8EDC, 0x207C, 0x8EDD, 0x8EDD, 0x207B, 0x8EDE, 0x8EDE, 0x207A,\n    0x8EDF, 0x8EDF, 0x0BB4, 0x8EE0, 0x8EE1, 0x207E, 0x8EE2, 0x8EE2, 0x4789,\n    0x8EE4, 0x8EE4, 0x478A, 0x8EE5, 0x8EE5, 0x2315, 0x8EE6, 0x8EE6, 0x2313,\n    0x8EE7, 0x8EE8, 0x2317, 0x8EE9, 0x8EE9, 0x231E, 0x8EEB, 0x8EEB, 0x231A,\n    0x8EEC, 0x8EEC, 0x231C, 0x8EED, 0x8EED, 0x478B, 0x8EEE, 0x8EEE, 0x2314,\n    0x8EEF, 0x8EEF, 0x230F, 0x8EF1, 0x8EF1, 0x231B, 0x8EF2, 0x8EF2, 0x478C,\n    0x8EF4, 0x8EF4, 0x231D, 0x8EF5, 0x8EF5, 0x2316, 0x8EF6, 0x8EF6, 0x2319,\n    0x8EF7, 0x8EF7, 0x2310, 0x8EF8, 0x8EF8, 0x0D7F, 0x8EF9, 0x8EF9, 0x2312,\n    0x8EFA, 0x8EFA, 0x2311, 0x8EFB, 0x8EFB, 0x0D7E, 0x8EFC, 0x8EFC, 0x0D80,\n    0x8EFE, 0x8EFE, 0x0F32, 0x8EFF, 0x8EFF, 0x25BA, 0x8F00, 0x8F00, 0x25BC,\n    0x8F01, 0x8F01, 0x25BB, 0x8F02, 0x8F02, 0x25C0, 0x8F03, 0x8F03, 0x0F30,\n    0x8F05, 0x8F05, 0x25BD, 0x8F06, 0x8F06, 0x25B9, 0x8F07, 0x8F08, 0x25BE,\n    0x8F09, 0x8F09, 0x0F31, 0x8F0A, 0x8F0A, 0x0F33, 0x8F0B, 0x8F0B, 0x25C1,\n    0x8F0D, 0x8F0D, 0x2820, 0x8F0E, 0x8F0E, 0x281F, 0x8F10, 0x8F11, 0x281D,\n    0x8F12, 0x8F12, 0x10BF, 0x8F13, 0x8F13, 0x10C1, 0x8F14, 0x8F14, 0x10BE,\n    0x8F15, 0x8F15, 0x10C0, 0x8F16, 0x8F17, 0x2A7A, 0x8F18, 0x8F18, 0x2A76,\n    0x8F19, 0x8F19, 0x3862, 0x8F1A, 0x8F1A, 0x2A77, 0x8F1B, 0x8F1B, 0x123F,\n    0x8F1C, 0x8F1C, 0x1244, 0x8F1D, 0x8F1D, 0x123E, 0x8F1E, 0x8F1E, 0x1245,\n    0x8F1F, 0x8F1F, 0x1240, 0x8F20, 0x8F20, 0x2A78, 0x8F23, 0x8F23, 0x2A79,\n    0x8F24, 0x8F24, 0x2A75, 0x8F25, 0x8F25, 0x1246, 0x8F26, 0x8F26, 0x1242,\n    0x8F29, 0x8F29, 0x1241, 0x8F2A, 0x8F2A, 0x1243, 0x8F2C, 0x8F2C, 0x2A74,\n    0x8F2D, 0x8F2D, 0x3863, 0x8F2E, 0x8F2E, 0x2CAF, 0x8F2F, 0x8F2F, 0x1368,\n    0x8F30, 0x8F30, 0x3BB7, 0x8F32, 0x8F32, 0x2CB1, 0x8F33, 0x8F33, 0x136A,\n    0x8F34, 0x8F34, 0x2CB4, 0x8F35, 0x8F35, 0x2CB0, 0x8F36, 0x8F36, 0x2CAE,\n    0x8F37, 0x8F37, 0x2CB3, 0x8F38, 0x8F38, 0x1369, 0x8F39, 0x8F39, 0x2CB2,\n    0x8F3B, 0x8F3B, 0x1367, 0x8F3E, 0x8F3E, 0x148E, 0x8F3F, 0x8F3F, 0x1491,\n    0x8F40, 0x8F40, 0x2E7C, 0x8F41, 0x8F41, 0x3D07, 0x8F42, 0x8F42, 0x148F,\n    0x8F43, 0x8F43, 0x2E7B, 0x8F44, 0x8F44, 0x148D, 0x8F45, 0x8F45, 0x1490,\n    0x8F46, 0x8F48, 0x2FF7, 0x8F49, 0x8F49, 0x1537, 0x8F4A, 0x8F4A, 0x3BB8,\n    0x8F4B, 0x8F4B, 0x2FFA, 0x8F4D, 0x8F4D, 0x1538, 0x8F4E, 0x8F4E, 0x15D7,\n    0x8F4F, 0x8F50, 0x3143, 0x8F51, 0x8F51, 0x3142, 0x8F52, 0x8F52, 0x3141,\n    0x8F53, 0x8F53, 0x3145, 0x8F54, 0x8F54, 0x15D6, 0x8F55, 0x8F55, 0x3244,\n    0x8F56, 0x8F57, 0x3242, 0x8F58, 0x8F58, 0x3245, 0x8F59, 0x8F59, 0x3241,\n    0x8F5A, 0x8F5A, 0x3246, 0x8F5B, 0x8F5B, 0x331C, 0x8F5C, 0x8F5C, 0x3F31,\n    0x8F5D, 0x8F5D, 0x331D, 0x8F5E, 0x8F5E, 0x331B, 0x8F5F, 0x8F5F, 0x1696,\n    0x8F60, 0x8F60, 0x33C4, 0x8F61, 0x8F61, 0x16DD, 0x8F62, 0x8F62, 0x33C5,\n    0x8F63, 0x8F63, 0x3445, 0x8F64, 0x8F64, 0x3444, 0x8F66, 0x8F67, 0x4569,\n    0x8F6E, 0x8F6E, 0x456B, 0x8F93, 0x8F93, 0x4732, 0x8F9B, 0x8F9B, 0x0514,\n    0x8F9C, 0x8F9C, 0x0D81, 0x8F9F, 0x8F9F, 0x0F34, 0x8FA0, 0x8FA0, 0x3D94,\n    0x8FA3, 0x8FA3, 0x10C2, 0x8FA5, 0x8FA5, 0x3866, 0x8FA6, 0x8FA6, 0x136C,\n    0x8FA8, 0x8FA8, 0x136B, 0x8FAD, 0x8FAD, 0x15D8, 0x8FAE, 0x8FAE, 0x162F,\n    0x8FAF, 0x8FAF, 0x1697, 0x8FB0, 0x8FB0, 0x0515, 0x8FB1, 0x8FB1, 0x09D3,\n    0x8FB2, 0x8FB2, 0x0F35, 0x8FB3, 0x8FB3, 0x386A, 0x8FB4, 0x8FB4, 0x3146,\n    0x8FB5, 0x8FB5, 0x0230, 0x8FB6, 0x8FB6, 0x47D3, 0x8FB7, 0x8FB7, 0x43FD,\n    0x8FB8, 0x8FB8, 0x42F6, 0x8FB9, 0x8FB9, 0x48C9, 0x8FBA, 0x8FBA, 0x48C7,\n    0x8FBB, 0x8FBC, 0x3D6B, 0x8FBE, 0x8FBE, 0x48C6, 0x8FBF, 0x8FBF, 0x18E9,\n    0x8FC1, 0x8FC1, 0x478D, 0x8FC2, 0x8FC2, 0x0516, 0x8FC4, 0x8FC4, 0x0519,\n    0x8FC5, 0x8FC5, 0x0518, 0x8FC6, 0x8FC6, 0x0517, 0x8FC9, 0x8FC9, 0x18E8,\n    0x8FCA, 0x8FCA, 0x478E, 0x8FCB, 0x8FCB, 0x1A4A, 0x8FCC, 0x8FCC, 0x478F,\n    0x8FCD, 0x8FCD, 0x1A4C, 0x8FCE, 0x8FCE, 0x068E, 0x8FD0, 0x8FD0, 0x48AE,\n    0x8FD1, 0x8FD1, 0x0690, 0x8FD2, 0x8FD2, 0x1A49, 0x8FD3, 0x8FD3, 0x1A4B,\n    0x8FD4, 0x8FD4, 0x068F, 0x8FD5, 0x8FD5, 0x1A4E, 0x8FD6, 0x8FD6, 0x1A4D,\n    0x8FD7, 0x8FD7, 0x1A4F, 0x8FDA, 0x8FDA, 0x3FCB, 0x8FE0, 0x8FE0, 0x1C0A,\n    0x8FE1, 0x8FE1, 0x1C08, 0x8FE2, 0x8FE2, 0x0813, 0x8FE3, 0x8FE3, 0x1C07,\n    0x8FE4, 0x8FE4, 0x0818, 0x8FE5, 0x8FE5, 0x0815, 0x8FE6, 0x8FE6, 0x0812,\n    0x8FE8, 0x8FE8, 0x0819, 0x8FEA, 0x8FEA, 0x0814, 0x8FEB, 0x8FEB, 0x0817,\n    0x8FED, 0x8FED, 0x0816, 0x8FEE, 0x8FEE, 0x1C09, 0x8FF0, 0x8FF0, 0x0811,\n    0x8FF4, 0x8FF4, 0x09D9, 0x8FF5, 0x8FF5, 0x1E16, 0x8FF6, 0x8FF6, 0x1E1C,\n    0x8FF7, 0x8FF7, 0x09D6, 0x8FF8, 0x8FF8, 0x09DD, 0x8FF9, 0x8FF9, 0x3871,\n    0x8FFA, 0x8FFA, 0x09D8, 0x8FFB, 0x8FFB, 0x1E19, 0x8FFC, 0x8FFC, 0x1E1B,\n    0x8FFD, 0x8FFD, 0x09DB, 0x8FFE, 0x8FFE, 0x1E15, 0x8FFF, 0x8FFF, 0x1E18,\n    0x9000, 0x9000, 0x09D7, 0x9001, 0x9001, 0x09D4, 0x9002, 0x9002, 0x1E17,\n    0x9003, 0x9003, 0x09DA, 0x9004, 0x9004, 0x1E1A, 0x9005, 0x9005, 0x09DC,\n    0x9006, 0x9006, 0x09D5, 0x9008, 0x9008, 0x3EE0, 0x900B, 0x900B, 0x2081,\n    0x900C, 0x900C, 0x2084, 0x900D, 0x900D, 0x0BB6, 0x900F, 0x900F, 0x0BC0,\n    0x9010, 0x9010, 0x0BBC, 0x9011, 0x9011, 0x2082, 0x9012, 0x9012, 0x3E4E,\n    0x9014, 0x9014, 0x0BC4, 0x9015, 0x9015, 0x0BBD, 0x9016, 0x9016, 0x0BC2,\n    0x9017, 0x9017, 0x0BB8, 0x9019, 0x9019, 0x0BB5, 0x901A, 0x901A, 0x0BB7,\n    0x901B, 0x901B, 0x0BC3, 0x901C, 0x901C, 0x2083, 0x901D, 0x901D, 0x0BBB,\n    0x901E, 0x901E, 0x0BBE, 0x901F, 0x901F, 0x0BBA, 0x9020, 0x9020, 0x0BBF,\n    0x9021, 0x9021, 0x2085, 0x9022, 0x9022, 0x0BC1, 0x9023, 0x9023, 0x0BB9,\n    0x9024, 0x9024, 0x2080, 0x902D, 0x902D, 0x231F, 0x902E, 0x902E, 0x0D82,\n    0x902F, 0x902F, 0x2321, 0x9031, 0x9031, 0x0D84, 0x9032, 0x9032, 0x0D86,\n    0x9033, 0x9033, 0x4790, 0x9034, 0x9034, 0x2320, 0x9035, 0x9035, 0x0D83,\n    0x9036, 0x9036, 0x0D87, 0x9037, 0x9037, 0x3876, 0x9038, 0x9038, 0x0D85,\n    0x903C, 0x903C, 0x0F3B, 0x903D, 0x903D, 0x25C6, 0x903E, 0x903E, 0x0F43,\n    0x903F, 0x903F, 0x25C3, 0x9041, 0x9041, 0x0F44, 0x9042, 0x9042, 0x0F39,\n    0x9044, 0x9044, 0x25C4, 0x9047, 0x9047, 0x0F3E, 0x9049, 0x9049, 0x25C5,\n    0x904A, 0x904A, 0x0F37, 0x904B, 0x904B, 0x0F36, 0x904C, 0x904C, 0x3F10,\n    0x904D, 0x904D, 0x0F41, 0x904E, 0x904E, 0x0F40, 0x904F, 0x904F, 0x0F3F,\n    0x9050, 0x9050, 0x0F3D, 0x9051, 0x9051, 0x0F42, 0x9052, 0x9052, 0x25C2,\n    0x9053, 0x9053, 0x0F38, 0x9054, 0x9054, 0x0F3A, 0x9055, 0x9055, 0x0F3C,\n    0x9056, 0x9056, 0x3DD2, 0x9058, 0x9058, 0x10C4, 0x9059, 0x9059, 0x10C7,\n    0x905B, 0x905B, 0x10CB, 0x905C, 0x905C, 0x10C5, 0x905D, 0x905D, 0x10CA,\n    0x905E, 0x905E, 0x10C8, 0x9060, 0x9060, 0x10C3, 0x9061, 0x9061, 0x3879,\n    0x9062, 0x9062, 0x10C9, 0x9063, 0x9063, 0x10C6, 0x9064, 0x9064, 0x3C68,\n    0x9067, 0x9067, 0x2A7F, 0x9068, 0x9068, 0x1249, 0x9069, 0x9069, 0x1247,\n    0x906B, 0x906B, 0x2A80, 0x906C, 0x906C, 0x3D60, 0x906D, 0x906D, 0x124A,\n    0x906E, 0x906E, 0x1248, 0x906F, 0x906F, 0x2A7E, 0x9070, 0x9070, 0x2A7D,\n    0x9072, 0x9072, 0x1370, 0x9073, 0x9073, 0x2A7C, 0x9074, 0x9074, 0x136E,\n    0x9075, 0x9075, 0x136D, 0x9076, 0x9076, 0x2CB5, 0x9077, 0x9077, 0x124B,\n    0x9078, 0x9078, 0x136F, 0x9079, 0x9079, 0x2CB6, 0x907A, 0x907A, 0x1372,\n    0x907B, 0x907B, 0x2CB7, 0x907C, 0x907C, 0x1371, 0x907D, 0x907D, 0x1493,\n    0x907E, 0x907E, 0x2E7E, 0x907F, 0x907F, 0x1492, 0x9080, 0x9080, 0x1497,\n    0x9081, 0x9082, 0x1495, 0x9083, 0x9083, 0x153A, 0x9084, 0x9084, 0x1494,\n    0x9085, 0x9085, 0x2E7D, 0x9086, 0x9086, 0x2CB8, 0x9087, 0x9087, 0x1539,\n    0x9088, 0x9088, 0x153B, 0x908A, 0x908B, 0x15D9, 0x908D, 0x908D, 0x3247,\n    0x908F, 0x908F, 0x170C, 0x9090, 0x9090, 0x170B, 0x9091, 0x9091, 0x051B,\n    0x9094, 0x9094, 0x181E, 0x9095, 0x9095, 0x09DE, 0x9097, 0x9098, 0x181B,\n    0x9099, 0x9099, 0x181A, 0x909B, 0x909B, 0x181D, 0x909E, 0x909E, 0x18ED,\n    0x909F, 0x909F, 0x18EA, 0x90A0, 0x90A0, 0x18EF, 0x90A1, 0x90A1, 0x18EB,\n    0x90A2, 0x90A2, 0x051C, 0x90A3, 0x90A3, 0x051F, 0x90A5, 0x90A5, 0x18EC,\n    0x90A6, 0x90A6, 0x051E, 0x90A7, 0x90A7, 0x18EE, 0x90A8, 0x90A8, 0x387C,\n    0x90AA, 0x90AA, 0x051D, 0x90AE, 0x90AE, 0x3880, 0x90AF, 0x90AF, 0x1A52,\n    0x90B0, 0x90B0, 0x1A54, 0x90B1, 0x90B1, 0x0693, 0x90B2, 0x90B2, 0x1A50,\n    0x90B3, 0x90B3, 0x1A53, 0x90B4, 0x90B4, 0x1A51, 0x90B5, 0x90B5, 0x0691,\n    0x90B6, 0x90B6, 0x0694, 0x90B8, 0x90B8, 0x0692, 0x90BB, 0x90BB, 0x3BC4,\n    0x90BD, 0x90BD, 0x1C0C, 0x90BE, 0x90BE, 0x1C10, 0x90BF, 0x90BF, 0x1C0D,\n    0x90C1, 0x90C1, 0x081C, 0x90C3, 0x90C3, 0x081D, 0x90C4, 0x90C4, 0x387E,\n    0x90C5, 0x90C5, 0x1C0F, 0x90C7, 0x90C7, 0x1C11, 0x90C8, 0x90C8, 0x1C13,\n    0x90CA, 0x90CA, 0x081A, 0x90CB, 0x90CB, 0x1C12, 0x90CE, 0x90CE, 0x081B,\n    0x90D4, 0x90D4, 0x208C, 0x90D5, 0x90D5, 0x1C0E, 0x90D6, 0x90D6, 0x1E1D,\n    0x90D7, 0x90D7, 0x1E26, 0x90D8, 0x90D8, 0x1E24, 0x90D9, 0x90DA, 0x1E1F,\n    0x90DB, 0x90DB, 0x1E25, 0x90DC, 0x90DC, 0x1E27, 0x90DD, 0x90DD, 0x09E0,\n    0x90DF, 0x90DF, 0x1E22, 0x90E0, 0x90E0, 0x1E1E, 0x90E1, 0x90E1, 0x09DF,\n    0x90E2, 0x90E2, 0x09E1, 0x90E3, 0x90E3, 0x1E21, 0x90E4, 0x90E4, 0x1E28,\n    0x90E5, 0x90E5, 0x1E23, 0x90E8, 0x90E8, 0x0BC5, 0x90E9, 0x90E9, 0x208F,\n    0x90EA, 0x90EA, 0x2087, 0x90EB, 0x90EC, 0x208D, 0x90ED, 0x90ED, 0x0BC6,\n    0x90EF, 0x90EF, 0x2086, 0x90F0, 0x90F0, 0x2088, 0x90F1, 0x90F1, 0x1C0B,\n    0x90F2, 0x90F3, 0x208A, 0x90F4, 0x90F4, 0x2089, 0x90F5, 0x90F5, 0x0D89,\n    0x90F9, 0x90F9, 0x2328, 0x90FA, 0x90FA, 0x2CB9, 0x90FB, 0x90FB, 0x2329,\n    0x90FC, 0x90FC, 0x2326, 0x90FD, 0x90FD, 0x0BC7, 0x90FE, 0x90FE, 0x0D8B,\n    0x90FF, 0x90FF, 0x2325, 0x9100, 0x9100, 0x232B, 0x9101, 0x9101, 0x232A,\n    0x9102, 0x9102, 0x0D88, 0x9103, 0x9103, 0x232E, 0x9104, 0x9104, 0x2324,\n    0x9105, 0x9105, 0x232D, 0x9106, 0x9106, 0x2322, 0x9107, 0x9107, 0x232C,\n    0x9108, 0x9108, 0x2327, 0x9109, 0x9109, 0x0D8A, 0x910B, 0x910B, 0x25CD,\n    0x910D, 0x910D, 0x25C8, 0x910E, 0x910E, 0x25CE, 0x910F, 0x910F, 0x25C9,\n    0x9110, 0x9110, 0x25C7, 0x9111, 0x9111, 0x25CA, 0x9112, 0x9112, 0x0F45,\n    0x9114, 0x9114, 0x25CC, 0x9116, 0x9116, 0x25CB, 0x9117, 0x9117, 0x0F46,\n    0x9118, 0x9118, 0x10CD, 0x9119, 0x9119, 0x10CC, 0x911A, 0x911A, 0x2827,\n    0x911B, 0x911B, 0x282A, 0x911C, 0x911C, 0x2822, 0x911D, 0x911D, 0x2826,\n    0x911E, 0x911E, 0x10CE, 0x911F, 0x911F, 0x2825, 0x9120, 0x9120, 0x2823,\n    0x9121, 0x9121, 0x2829, 0x9122, 0x9122, 0x2824, 0x9123, 0x9123, 0x2821,\n    0x9124, 0x9124, 0x2828, 0x9126, 0x9126, 0x2A86, 0x9127, 0x9127, 0x124E,\n    0x9128, 0x9128, 0x2FFB, 0x9129, 0x912A, 0x2A83, 0x912B, 0x912B, 0x2A82,\n    0x912C, 0x912C, 0x2323, 0x912D, 0x912D, 0x124D, 0x912E, 0x912E, 0x2A87,\n    0x912F, 0x912F, 0x2A81, 0x9130, 0x9130, 0x124C, 0x9131, 0x9131, 0x124F,\n    0x9132, 0x9132, 0x2A85, 0x9133, 0x9133, 0x2CBA, 0x9134, 0x9134, 0x1373,\n    0x9135, 0x9136, 0x2CBB, 0x9138, 0x9138, 0x2E7F, 0x9139, 0x9139, 0x1498,\n    0x913A, 0x913B, 0x2FFC, 0x913E, 0x913E, 0x2FFE, 0x913F, 0x913F, 0x3148,\n    0x9140, 0x9140, 0x3147, 0x9141, 0x9141, 0x3249, 0x9143, 0x9143, 0x3248,\n    0x9144, 0x9145, 0x331F, 0x9146, 0x9146, 0x331E, 0x9147, 0x9147, 0x33C6,\n    0x9148, 0x9148, 0x16DE, 0x9149, 0x9149, 0x0520, 0x914A, 0x914A, 0x081F,\n    0x914B, 0x914B, 0x081E, 0x914C, 0x914C, 0x09E4, 0x914D, 0x914D, 0x09E3,\n    0x914E, 0x914F, 0x1E2A, 0x9150, 0x9150, 0x1E29, 0x9151, 0x9151, 0x3F49,\n    0x9152, 0x9152, 0x09E2, 0x9153, 0x9153, 0x2093, 0x9155, 0x9155, 0x2094,\n    0x9156, 0x9156, 0x2090, 0x9157, 0x9157, 0x0BC8, 0x9158, 0x9158, 0x2091,\n    0x9159, 0x9159, 0x3F45, 0x915A, 0x915A, 0x2092, 0x915C, 0x915C, 0x3F47,\n    0x915E, 0x915E, 0x43EB, 0x915F, 0x915F, 0x2331, 0x9160, 0x9160, 0x2333,\n    0x9161, 0x9161, 0x232F, 0x9162, 0x9162, 0x2332, 0x9163, 0x9163, 0x0D8C,\n    0x9164, 0x9164, 0x2330, 0x9165, 0x9165, 0x0D8D, 0x9167, 0x9167, 0x3882,\n    0x9168, 0x9168, 0x23E2, 0x9169, 0x9169, 0x0F49, 0x916A, 0x916A, 0x0F48,\n    0x916C, 0x916C, 0x0F47, 0x916E, 0x916F, 0x25CF, 0x9170, 0x9170, 0x3EB8,\n    0x9172, 0x9172, 0x282C, 0x9173, 0x9173, 0x282E, 0x9174, 0x9174, 0x10D2,\n    0x9175, 0x9175, 0x10CF, 0x9176, 0x9176, 0x3E9B, 0x9177, 0x9177, 0x10D1,\n    0x9178, 0x9178, 0x10D0, 0x9179, 0x9179, 0x282D, 0x917A, 0x917A, 0x282B,\n    0x917C, 0x917C, 0x3F6F, 0x9180, 0x9180, 0x2A8E, 0x9181, 0x9182, 0x2A8B,\n    0x9183, 0x9183, 0x1253, 0x9184, 0x9184, 0x2A8D, 0x9185, 0x9186, 0x2A88,\n    0x9187, 0x9187, 0x1250, 0x9189, 0x9189, 0x1251, 0x918A, 0x918A, 0x2A8A,\n    0x918B, 0x918B, 0x1252, 0x918C, 0x918C, 0x43EC, 0x918D, 0x918D, 0x2CC0,\n    0x918E, 0x918E, 0x3F4E, 0x918F, 0x918F, 0x2CC1, 0x9190, 0x9191, 0x2CBE,\n    0x9192, 0x9192, 0x1374, 0x9193, 0x9193, 0x2CBD, 0x9199, 0x9199, 0x2E83,\n    0x919A, 0x919A, 0x2E80, 0x919B, 0x919B, 0x2E82, 0x919C, 0x919C, 0x149B,\n    0x919D, 0x919D, 0x2E86, 0x919E, 0x919E, 0x149A, 0x919F, 0x919F, 0x2E84,\n    0x91A0, 0x91A0, 0x2E87, 0x91A1, 0x91A1, 0x2E85, 0x91A2, 0x91A2, 0x2E81,\n    0x91A3, 0x91A3, 0x1499, 0x91A5, 0x91A5, 0x3000, 0x91A7, 0x91A7, 0x3001,\n    0x91A8, 0x91A8, 0x2FFF, 0x91A9, 0x91A9, 0x3883, 0x91AA, 0x91AA, 0x3003,\n    0x91AB, 0x91AC, 0x153C, 0x91AD, 0x91AD, 0x314A, 0x91AE, 0x91AE, 0x15DC,\n    0x91AF, 0x91AF, 0x3002, 0x91B0, 0x91B0, 0x3149, 0x91B1, 0x91B1, 0x15DB,\n    0x91B2, 0x91B3, 0x324C, 0x91B4, 0x91B4, 0x1650, 0x91B5, 0x91B5, 0x324B,\n    0x91B6, 0x91B6, 0x45EF, 0x91B7, 0x91B7, 0x324A, 0x91B9, 0x91B9, 0x3321,\n    0x91BA, 0x91BA, 0x1698, 0x91BB, 0x91BB, 0x3BC8, 0x91BC, 0x91BC, 0x3446,\n    0x91BD, 0x91BD, 0x34A3, 0x91BE, 0x91BE, 0x34A2, 0x91C0, 0x91C0, 0x1730,\n    0x91C1, 0x91C1, 0x174A, 0x91C2, 0x91C2, 0x34A4, 0x91C3, 0x91C3, 0x350B,\n    0x91C4, 0x91C4, 0x3884, 0x91C5, 0x91C5, 0x175C, 0x91C6, 0x91C6, 0x0521,\n    0x91C7, 0x91C7, 0x0695, 0x91C9, 0x91C9, 0x0F4A, 0x91CB, 0x91CB, 0x1651,\n    0x91CC, 0x91CC, 0x0522, 0x91CD, 0x91CD, 0x0820, 0x91CE, 0x91CE, 0x0BC9,\n    0x91CF, 0x91CF, 0x0D8E, 0x91D0, 0x91D0, 0x153E, 0x91D1, 0x91D1, 0x0696,\n    0x91D3, 0x91D3, 0x1C15, 0x91D4, 0x91D4, 0x1C14, 0x91D5, 0x91D5, 0x1E2C,\n    0x91D6, 0x91D6, 0x415E, 0x91D7, 0x91D7, 0x09E7, 0x91D8, 0x91D8, 0x09E5,\n    0x91D9, 0x91D9, 0x09E9, 0x91DA, 0x91DA, 0x1E2E, 0x91DC, 0x91DC, 0x09E8,\n    0x91DD, 0x91DD, 0x09E6, 0x91DF, 0x91DF, 0x453A, 0x91E2, 0x91E2, 0x1E2D,\n    0x91E3, 0x91E3, 0x0BCC, 0x91E4, 0x91E4, 0x209A, 0x91E5, 0x91E5, 0x3C06,\n    0x91E6, 0x91E6, 0x0BCB, 0x91E7, 0x91E7, 0x0BCD, 0x91E8, 0x91E8, 0x209F,\n    0x91E9, 0x91E9, 0x0BCF, 0x91EA, 0x91EB, 0x209C, 0x91EC, 0x91EC, 0x2095,\n    0x91ED, 0x91ED, 0x0BCE, 0x91EE, 0x91EE, 0x20A0, 0x91F1, 0x91F1, 0x2097,\n    0x91F3, 0x91F3, 0x2098, 0x91F4, 0x91F4, 0x2096, 0x91F5, 0x91F5, 0x0BCA,\n    0x91F7, 0x91F7, 0x209E, 0x91F8, 0x91F8, 0x2099, 0x91F9, 0x91F9, 0x209B,\n    0x91FA, 0x91FA, 0x3AF8, 0x91FD, 0x91FD, 0x233F, 0x91FE, 0x91FE, 0x382E,\n    0x91FF, 0x91FF, 0x233E, 0x9200, 0x9200, 0x233C, 0x9201, 0x9201, 0x2334,\n    0x9202, 0x9202, 0x2343, 0x9203, 0x9203, 0x2337, 0x9204, 0x9204, 0x2341,\n    0x9205, 0x9205, 0x2348, 0x9206, 0x9206, 0x2340, 0x9207, 0x9207, 0x0D96,\n    0x9208, 0x9208, 0x3EB9, 0x9209, 0x9209, 0x0D92, 0x920A, 0x920A, 0x2335,\n    0x920C, 0x920C, 0x233B, 0x920D, 0x920D, 0x0D94, 0x920E, 0x920E, 0x3888,\n    0x920F, 0x920F, 0x233A, 0x9210, 0x9210, 0x0D95, 0x9211, 0x9211, 0x0D97,\n    0x9212, 0x9212, 0x233D, 0x9213, 0x9213, 0x4793, 0x9214, 0x9215, 0x0D8F,\n    0x9216, 0x9216, 0x2349, 0x9217, 0x9217, 0x2347, 0x9219, 0x9219, 0x2346,\n    0x921A, 0x921A, 0x2338, 0x921C, 0x921C, 0x2344, 0x921E, 0x921E, 0x0D93,\n    0x9223, 0x9223, 0x0D91, 0x9224, 0x9224, 0x2345, 0x9225, 0x9225, 0x2336,\n    0x9226, 0x9226, 0x2339, 0x9227, 0x9227, 0x2342, 0x9228, 0x9228, 0x4795,\n    0x922A, 0x922A, 0x3C0E, 0x922B, 0x922B, 0x3BA6, 0x922D, 0x922D, 0x2851,\n    0x922E, 0x922E, 0x25DA, 0x9230, 0x9230, 0x25D3, 0x9231, 0x9231, 0x25E6,\n    0x9232, 0x9232, 0x25EF, 0x9233, 0x9233, 0x25D6, 0x9234, 0x9234, 0x0F55,\n    0x9235, 0x9235, 0x3B26, 0x9236, 0x9236, 0x25E3, 0x9237, 0x9237, 0x0F4B,\n    0x9238, 0x9238, 0x0F4D, 0x9239, 0x9239, 0x0F59, 0x923A, 0x923A, 0x25D4,\n    0x923C, 0x923C, 0x41D2, 0x923D, 0x923D, 0x0F4E, 0x923E, 0x923E, 0x0F50,\n    0x923F, 0x923F, 0x0F5A, 0x9240, 0x9240, 0x0F4F, 0x9241, 0x9241, 0x388A,\n    0x9244, 0x9244, 0x389A, 0x9245, 0x9245, 0x0F58, 0x9246, 0x9246, 0x25DC,\n    0x9248, 0x9248, 0x25D1, 0x9249, 0x9249, 0x0F56, 0x924A, 0x924A, 0x25DB,\n    0x924B, 0x924B, 0x0F52, 0x924C, 0x924C, 0x25ED, 0x924D, 0x924D, 0x0F57,\n    0x924E, 0x924E, 0x25EB, 0x924F, 0x924F, 0x25DF, 0x9250, 0x9250, 0x25E9,\n    0x9251, 0x9251, 0x0F54, 0x9252, 0x9252, 0x25D2, 0x9253, 0x9253, 0x25EC,\n    0x9254, 0x9254, 0x25E7, 0x9255, 0x9255, 0x3E47, 0x9256, 0x9256, 0x25EE,\n    0x9257, 0x9257, 0x0F4C, 0x9258, 0x9258, 0x4796, 0x925A, 0x925A, 0x0F5B,\n    0x925B, 0x925B, 0x0F51, 0x925D, 0x925D, 0x3A03, 0x925E, 0x925E, 0x25D8,\n    0x925F, 0x925F, 0x3CE0, 0x9260, 0x9260, 0x25E0, 0x9261, 0x9261, 0x25E4,\n    0x9262, 0x9262, 0x388B, 0x9263, 0x9263, 0x25E8, 0x9264, 0x9264, 0x0F53,\n    0x9265, 0x9265, 0x25D7, 0x9266, 0x9266, 0x25D5, 0x9267, 0x9267, 0x25E1,\n    0x926B, 0x926B, 0x4797, 0x926C, 0x926C, 0x25DE, 0x926D, 0x926D, 0x25DD,\n    0x926E, 0x926E, 0x3D05, 0x926F, 0x926F, 0x25E2, 0x9270, 0x9270, 0x25E5,\n    0x9272, 0x9272, 0x25EA, 0x9276, 0x9276, 0x2831, 0x9277, 0x9277, 0x3C64,\n    0x9278, 0x9278, 0x10D3, 0x9279, 0x9279, 0x283B, 0x927A, 0x927A, 0x2833,\n    0x927B, 0x927B, 0x10D9, 0x927C, 0x927C, 0x10DD, 0x927D, 0x927D, 0x2844,\n    0x927E, 0x927E, 0x284C, 0x927F, 0x927F, 0x283D, 0x9280, 0x9280, 0x10D5,\n    0x9281, 0x9281, 0x3E01, 0x9282, 0x9282, 0x2841, 0x9283, 0x9283, 0x25D9,\n    0x9284, 0x9284, 0x3CB9, 0x9285, 0x9285, 0x10D6, 0x9286, 0x9286, 0x2848,\n    0x9287, 0x9287, 0x284D, 0x9288, 0x9288, 0x2845, 0x9289, 0x9289, 0x3AB5,\n    0x928A, 0x928A, 0x2847, 0x928B, 0x928B, 0x2850, 0x928C, 0x928C, 0x2849,\n    0x928D, 0x928D, 0x2837, 0x928E, 0x928E, 0x2840, 0x928F, 0x928F, 0x46BD,\n    0x9291, 0x9291, 0x10DE, 0x9293, 0x9293, 0x10DA, 0x9294, 0x9294, 0x2835,\n    0x9295, 0x9295, 0x2842, 0x9296, 0x9296, 0x10D8, 0x9297, 0x9297, 0x283C,\n    0x9298, 0x9298, 0x10D7, 0x9299, 0x9299, 0x284A, 0x929A, 0x929A, 0x2839,\n    0x929B, 0x929B, 0x2832, 0x929C, 0x929C, 0x10DB, 0x929D, 0x929D, 0x284F,\n    0x92A0, 0x92A0, 0x2834, 0x92A1, 0x92A1, 0x2846, 0x92A2, 0x92A2, 0x2843,\n    0x92A3, 0x92A3, 0x283E, 0x92A4, 0x92A4, 0x2830, 0x92A5, 0x92A5, 0x282F,\n    0x92A6, 0x92A6, 0x2838, 0x92A7, 0x92A7, 0x284B, 0x92A8, 0x92A8, 0x10DC,\n    0x92A9, 0x92A9, 0x284E, 0x92AA, 0x92AA, 0x2836, 0x92AB, 0x92AB, 0x283A,\n    0x92AC, 0x92AC, 0x10D4, 0x92AE, 0x92AE, 0x4799, 0x92B1, 0x92B1, 0x4798,\n    0x92B2, 0x92B2, 0x125F, 0x92B3, 0x92B3, 0x125A, 0x92B4, 0x92B4, 0x2AB0,\n    0x92B5, 0x92B5, 0x2AAC, 0x92B6, 0x92B6, 0x2A94, 0x92B7, 0x92B7, 0x1256,\n    0x92B9, 0x92B9, 0x36E9, 0x92BA, 0x92BA, 0x3BF5, 0x92BB, 0x92BB, 0x1255,\n    0x92BC, 0x92BC, 0x125B, 0x92BE, 0x92BE, 0x3C60, 0x92BF, 0x92BF, 0x479A,\n    0x92C0, 0x92C0, 0x2A92, 0x92C1, 0x92C1, 0x1259, 0x92C2, 0x92C2, 0x2A9E,\n    0x92C3, 0x92C4, 0x2A90, 0x92C5, 0x92C5, 0x1254, 0x92C6, 0x92C6, 0x2AAF,\n    0x92C7, 0x92C7, 0x125D, 0x92C8, 0x92C8, 0x2AA1, 0x92C9, 0x92C9, 0x2AA6,\n    0x92CA, 0x92CA, 0x2AA0, 0x92CB, 0x92CB, 0x2CD3, 0x92CC, 0x92CC, 0x2A9C,\n    0x92CD, 0x92CD, 0x2AA4, 0x92CE, 0x92CE, 0x2AA2, 0x92CF, 0x92CF, 0x2A95,\n    0x92D0, 0x92D0, 0x2A8F, 0x92D1, 0x92D1, 0x2AAA, 0x92D2, 0x92D2, 0x125C,\n    0x92D3, 0x92D3, 0x2AAB, 0x92D4, 0x92D4, 0x3861, 0x92D5, 0x92D5, 0x2AA5,\n    0x92D7, 0x92D7, 0x2A9A, 0x92D8, 0x92D8, 0x2A98, 0x92D9, 0x92D9, 0x2A93,\n    0x92DB, 0x92DB, 0x400C, 0x92DD, 0x92DD, 0x2A9B, 0x92DE, 0x92DE, 0x2AA8,\n    0x92DF, 0x92DF, 0x2A97, 0x92E0, 0x92E0, 0x2AA7, 0x92E1, 0x92E1, 0x2AAD,\n    0x92E3, 0x92E3, 0x479B, 0x92E4, 0x92E4, 0x1258, 0x92E5, 0x92E5, 0x3CA2,\n    0x92E6, 0x92E6, 0x2AA3, 0x92E7, 0x92E7, 0x2AA9, 0x92E8, 0x92E8, 0x2A9F,\n    0x92E9, 0x92E9, 0x2A99, 0x92EA, 0x92EA, 0x1257, 0x92EB, 0x92EB, 0x479C,\n    0x92EC, 0x92EC, 0x3964, 0x92EE, 0x92EE, 0x283F, 0x92EF, 0x92EF, 0x2A9D,\n    0x92F0, 0x92F0, 0x125E, 0x92F1, 0x92F1, 0x2A96, 0x92F2, 0x92F2, 0x3AB2,\n    0x92F3, 0x92F4, 0x479D, 0x92F6, 0x92F6, 0x3C04, 0x92F7, 0x92F7, 0x2CD8,\n    0x92F8, 0x92F8, 0x1377, 0x92F9, 0x92F9, 0x2CD7, 0x92FA, 0x92FA, 0x2CD5,\n    0x92FB, 0x92FB, 0x2CE7, 0x92FC, 0x92FC, 0x137B, 0x92FD, 0x92FD, 0x479F,\n    0x92FE, 0x92FE, 0x2CE4, 0x92FF, 0x92FF, 0x2CDC, 0x9300, 0x9300, 0x2CE6,\n    0x9301, 0x9301, 0x2CCE, 0x9302, 0x9302, 0x2CDA, 0x9303, 0x9303, 0x3867,\n    0x9304, 0x9304, 0x137D, 0x9306, 0x9306, 0x2CC6, 0x9307, 0x9307, 0x3B11,\n    0x9308, 0x9308, 0x2CC4, 0x9309, 0x9309, 0x2CE5, 0x930B, 0x930B, 0x2CE3,\n    0x930C, 0x930C, 0x2CE2, 0x930D, 0x930D, 0x2CD2, 0x930E, 0x930E, 0x2CD1,\n    0x930F, 0x930F, 0x2CC7, 0x9310, 0x9310, 0x137F, 0x9312, 0x9312, 0x2CCD,\n    0x9313, 0x9313, 0x2CD6, 0x9314, 0x9314, 0x2CE1, 0x9315, 0x9315, 0x1382,\n    0x9316, 0x9316, 0x2CE8, 0x9318, 0x9318, 0x14A3, 0x9319, 0x9319, 0x1384,\n    0x931A, 0x931A, 0x137E, 0x931B, 0x931B, 0x2CCB, 0x931D, 0x931D, 0x2CD4,\n    0x931E, 0x931E, 0x2CC3, 0x931F, 0x931F, 0x2CC5, 0x9320, 0x9320, 0x1375,\n    0x9321, 0x9321, 0x1381, 0x9322, 0x9322, 0x137A, 0x9323, 0x9323, 0x2CCC,\n    0x9324, 0x9324, 0x2CDB, 0x9325, 0x9325, 0x2AAE, 0x9326, 0x9326, 0x1380,\n    0x9327, 0x9327, 0x2CC2, 0x9328, 0x9328, 0x149E, 0x9329, 0x9329, 0x2CDD,\n    0x932A, 0x932A, 0x2CE0, 0x932B, 0x932B, 0x137C, 0x932C, 0x932C, 0x3892,\n    0x932D, 0x932D, 0x2CD0, 0x932E, 0x932E, 0x1383, 0x932F, 0x932F, 0x1379,\n    0x9330, 0x9330, 0x3E03, 0x9331, 0x9331, 0x3CBD, 0x9333, 0x9333, 0x1378,\n    0x9334, 0x9334, 0x2CD9, 0x9335, 0x9335, 0x2CDF, 0x9336, 0x9336, 0x1376,\n    0x9338, 0x9338, 0x2CC9, 0x9339, 0x9339, 0x2CDE, 0x933C, 0x933C, 0x2CCA,\n    0x9340, 0x9340, 0x4155, 0x9341, 0x9341, 0x4277, 0x9342, 0x9342, 0x3AFA,\n    0x9343, 0x9343, 0x47A0, 0x9344, 0x9344, 0x4016, 0x9345, 0x9345, 0x3E74,\n    0x9346, 0x9346, 0x2CCF, 0x9347, 0x9347, 0x2E8D, 0x9348, 0x9348, 0x3C61,\n    0x9349, 0x9349, 0x2E92, 0x934A, 0x934A, 0x14A0, 0x934B, 0x934B, 0x14A2,\n    0x934C, 0x934C, 0x2E98, 0x934D, 0x934D, 0x149C, 0x934E, 0x934E, 0x2EA6,\n    0x934F, 0x934F, 0x2E9E, 0x9350, 0x9351, 0x2E93, 0x9352, 0x9352, 0x2E9D,\n    0x9354, 0x9354, 0x14A9, 0x9355, 0x9355, 0x2E9C, 0x9356, 0x9356, 0x2E8C,\n    0x9357, 0x9357, 0x2E9B, 0x9358, 0x9358, 0x2E8F, 0x9359, 0x9359, 0x2EA7,\n    0x935A, 0x935A, 0x14A8, 0x935B, 0x935B, 0x14A6, 0x935C, 0x935C, 0x2E90,\n    0x935E, 0x935E, 0x2EA3, 0x935F, 0x935F, 0x3CBB, 0x9360, 0x9360, 0x2E95,\n    0x9361, 0x9361, 0x2EA2, 0x9362, 0x9362, 0x4268, 0x9363, 0x9363, 0x2EA4,\n    0x9364, 0x9364, 0x2E8B, 0x9365, 0x9365, 0x14A1, 0x9366, 0x9366, 0x46BC,\n    0x9367, 0x9367, 0x2EA5, 0x9368, 0x9368, 0x3BF0, 0x9369, 0x9369, 0x3961,\n    0x936A, 0x936A, 0x2E99, 0x936B, 0x936B, 0x3893, 0x936C, 0x936C, 0x14A5,\n    0x936D, 0x936D, 0x2E96, 0x936E, 0x936E, 0x39E8, 0x9370, 0x9370, 0x14A7,\n    0x9371, 0x9371, 0x2E9F, 0x9373, 0x9373, 0x389E, 0x9374, 0x9374, 0x3CE4,\n    0x9375, 0x9375, 0x149F, 0x9376, 0x9376, 0x2E91, 0x9377, 0x9377, 0x2EA0,\n    0x9378, 0x9378, 0x38F9, 0x9379, 0x9379, 0x2E9A, 0x937A, 0x937A, 0x2CC8,\n    0x937B, 0x937B, 0x2EA1, 0x937C, 0x937C, 0x2E8E, 0x937D, 0x937D, 0x3C25,\n    0x937E, 0x937E, 0x14A4, 0x9380, 0x9380, 0x3014, 0x9381, 0x9381, 0x3965,\n    0x9382, 0x9382, 0x149D, 0x9383, 0x9383, 0x2E89, 0x9384, 0x9384, 0x47A1,\n    0x9385, 0x9385, 0x42BD, 0x9386, 0x9386, 0x3CC0, 0x9387, 0x9387, 0x3AE0,\n    0x9388, 0x9388, 0x3011, 0x9389, 0x9389, 0x300A, 0x938A, 0x938A, 0x1540,\n    0x938C, 0x938C, 0x3005, 0x938D, 0x938D, 0x3015, 0x938E, 0x938E, 0x300C,\n    0x938F, 0x938F, 0x2E97, 0x9390, 0x9390, 0x3D3C, 0x9391, 0x9391, 0x3017,\n    0x9392, 0x9392, 0x3006, 0x9394, 0x9394, 0x153F, 0x9395, 0x9395, 0x3010,\n    0x9396, 0x9396, 0x1541, 0x9397, 0x9397, 0x1549, 0x9398, 0x9398, 0x1547,\n    0x9399, 0x9399, 0x3012, 0x939A, 0x939A, 0x1548, 0x939B, 0x939B, 0x3008,\n    0x939C, 0x939C, 0x39AC, 0x939D, 0x939D, 0x3009, 0x939E, 0x939E, 0x300E,\n    0x939F, 0x939F, 0x3013, 0x93A0, 0x93A0, 0x3AB1, 0x93A1, 0x93A1, 0x2E88,\n    0x93A2, 0x93A2, 0x1542, 0x93A3, 0x93A3, 0x301C, 0x93A4, 0x93A4, 0x3019,\n    0x93A5, 0x93A5, 0x3160, 0x93A6, 0x93A6, 0x300F, 0x93A7, 0x93A7, 0x300B,\n    0x93A8, 0x93A8, 0x301A, 0x93A9, 0x93A9, 0x3155, 0x93AA, 0x93AA, 0x300D,\n    0x93AC, 0x93AC, 0x1545, 0x93AD, 0x93AD, 0x47A2, 0x93AE, 0x93AE, 0x1544,\n    0x93AF, 0x93AF, 0x2E8A, 0x93B0, 0x93B0, 0x1546, 0x93B1, 0x93B1, 0x3016,\n    0x93B2, 0x93B2, 0x3018, 0x93B3, 0x93B3, 0x1543, 0x93B4, 0x93B4, 0x301B,\n    0x93B5, 0x93B5, 0x3004, 0x93B7, 0x93B7, 0x3007, 0x93B8, 0x93B8, 0x3C90,\n    0x93BA, 0x93BA, 0x43F7, 0x93BB, 0x93BB, 0x3C8F, 0x93BD, 0x93BD, 0x3A27,\n    0x93BF, 0x93BF, 0x3E2D, 0x93C0, 0x93C0, 0x315E, 0x93C2, 0x93C2, 0x314E,\n    0x93C3, 0x93C3, 0x15E0, 0x93C4, 0x93C4, 0x315C, 0x93C6, 0x93C6, 0x39AA,\n    0x93C7, 0x93C7, 0x314C, 0x93C8, 0x93C8, 0x15E1, 0x93CA, 0x93CA, 0x3157,\n    0x93CB, 0x93CB, 0x3966, 0x93CC, 0x93CC, 0x3153, 0x93CD, 0x93CD, 0x15E6,\n    0x93CE, 0x93CE, 0x315D, 0x93CF, 0x93CF, 0x314D, 0x93D0, 0x93D0, 0x3150,\n    0x93D1, 0x93D1, 0x15DE, 0x93D2, 0x93D2, 0x315F, 0x93D3, 0x93D3, 0x40E1,\n    0x93D4, 0x93D4, 0x3158, 0x93D5, 0x93D5, 0x315B, 0x93D6, 0x93D6, 0x15E4,\n    0x93D7, 0x93D7, 0x15E9, 0x93D8, 0x93D8, 0x15E7, 0x93D9, 0x93D9, 0x3154,\n    0x93DA, 0x93DA, 0x314F, 0x93DB, 0x93DB, 0x3C5F, 0x93DC, 0x93DD, 0x15E2,\n    0x93DE, 0x93DE, 0x314B, 0x93DF, 0x93DF, 0x15DF, 0x93E0, 0x93E0, 0x3A20,\n    0x93E1, 0x93E1, 0x15DD, 0x93E2, 0x93E2, 0x15E5, 0x93E3, 0x93E3, 0x315A,\n    0x93E4, 0x93E4, 0x15E8, 0x93E6, 0x93E6, 0x3156, 0x93E7, 0x93E7, 0x3161,\n    0x93E8, 0x93E8, 0x15EA, 0x93EC, 0x93EC, 0x3152, 0x93EE, 0x93EE, 0x3159,\n    0x93F0, 0x93F0, 0x423F, 0x93F1, 0x93F1, 0x42AA, 0x93F3, 0x93F3, 0x3962,\n    0x93F5, 0x93F5, 0x325A, 0x93F6, 0x93F6, 0x3269, 0x93F7, 0x93F7, 0x325C,\n    0x93F8, 0x93F8, 0x3263, 0x93F9, 0x93F9, 0x3151, 0x93FA, 0x93FA, 0x3261,\n    0x93FB, 0x93FB, 0x3250, 0x93FC, 0x93FC, 0x3267, 0x93FD, 0x93FD, 0x1654,\n    0x93FE, 0x93FE, 0x3254, 0x93FF, 0x93FF, 0x3266, 0x9400, 0x9400, 0x325B,\n    0x9401, 0x9401, 0x3CD4, 0x9403, 0x9403, 0x1653, 0x9404, 0x9404, 0x3BC9,\n    0x9406, 0x9406, 0x326B, 0x9407, 0x9407, 0x325D, 0x9408, 0x9408, 0x3A25,\n    0x9409, 0x9409, 0x3262, 0x940A, 0x940A, 0x3265, 0x940B, 0x940B, 0x324E,\n    0x940C, 0x940C, 0x3268, 0x940D, 0x940D, 0x3259, 0x940E, 0x940E, 0x325E,\n    0x940F, 0x940F, 0x3252, 0x9410, 0x9410, 0x3256, 0x9411, 0x9411, 0x326A,\n    0x9412, 0x9412, 0x3260, 0x9413, 0x9413, 0x324F, 0x9414, 0x9414, 0x3253,\n    0x9415, 0x9415, 0x3255, 0x9416, 0x9416, 0x325F, 0x9417, 0x9417, 0x47A5,\n    0x9418, 0x9418, 0x1652, 0x9419, 0x9419, 0x3258, 0x941B, 0x941B, 0x4148,\n    0x941D, 0x941D, 0x47A6, 0x9420, 0x9420, 0x3251, 0x9424, 0x9424, 0x3943,\n    0x9425, 0x9425, 0x38D0, 0x9426, 0x9426, 0x38A3, 0x9427, 0x9427, 0x3BCD,\n    0x9428, 0x9428, 0x3257, 0x9429, 0x9429, 0x3325, 0x942A, 0x942A, 0x3329,\n    0x942B, 0x942B, 0x169F, 0x942C, 0x942C, 0x332B, 0x942D, 0x942D, 0x47A7,\n    0x942E, 0x942E, 0x1699, 0x9430, 0x9430, 0x3327, 0x9431, 0x9431, 0x332D,\n    0x9432, 0x9432, 0x169E, 0x9433, 0x9433, 0x169A, 0x9435, 0x9435, 0x169B,\n    0x9436, 0x9436, 0x3324, 0x9437, 0x9437, 0x332A, 0x9438, 0x9438, 0x169D,\n    0x9439, 0x9439, 0x3328, 0x943A, 0x943A, 0x169C, 0x943B, 0x943B, 0x3323,\n    0x943C, 0x943C, 0x3264, 0x943D, 0x943D, 0x3326, 0x943E, 0x943E, 0x47A8,\n    0x943F, 0x943F, 0x3322, 0x9440, 0x9440, 0x332C, 0x9442, 0x9442, 0x4272,\n    0x9443, 0x9443, 0x4275, 0x9444, 0x9444, 0x16DF, 0x9445, 0x9445, 0x33CD,\n    0x9446, 0x9446, 0x33D0, 0x9447, 0x9447, 0x33CC, 0x9448, 0x9449, 0x33CE,\n    0x944A, 0x944B, 0x33C9, 0x944C, 0x944C, 0x33C7, 0x944D, 0x944D, 0x3C65,\n    0x944F, 0x944F, 0x33CB, 0x9450, 0x9450, 0x33C8, 0x9451, 0x9452, 0x16E0,\n    0x9454, 0x9454, 0x47AA, 0x9455, 0x9455, 0x3448, 0x9457, 0x9457, 0x344A,\n    0x9458, 0x9458, 0x3C30, 0x945B, 0x945B, 0x389F, 0x945D, 0x945D, 0x3449,\n    0x945E, 0x945E, 0x344B, 0x9460, 0x9460, 0x170E, 0x9462, 0x9462, 0x3447,\n    0x9463, 0x9463, 0x170D, 0x9464, 0x9464, 0x170F, 0x9465, 0x9465, 0x3DDE,\n    0x9467, 0x9467, 0x3AB8, 0x9468, 0x9469, 0x34A6, 0x946A, 0x946A, 0x1731,\n    0x946B, 0x946B, 0x34A5, 0x946C, 0x946C, 0x377E, 0x946D, 0x946D, 0x34ED,\n    0x946E, 0x946E, 0x34EC, 0x946F, 0x946F, 0x34EE, 0x9470, 0x9470, 0x174C,\n    0x9471, 0x9471, 0x34EF, 0x9472, 0x9472, 0x174B, 0x9473, 0x9473, 0x34F0,\n    0x9474, 0x9474, 0x350C, 0x9475, 0x9475, 0x350F, 0x9476, 0x9476, 0x350E,\n    0x9477, 0x9477, 0x1755, 0x9478, 0x9478, 0x350D, 0x9479, 0x9479, 0x47AB,\n    0x947B, 0x947B, 0x419B, 0x947C, 0x947C, 0x175F, 0x947D, 0x947E, 0x175D,\n    0x947F, 0x947F, 0x1764, 0x9480, 0x9481, 0x3539, 0x9482, 0x9482, 0x3538,\n    0x9483, 0x9483, 0x3540, 0x9485, 0x9485, 0x4507, 0x949F, 0x949F, 0x4885,\n    0x94A2, 0x94A2, 0x451B, 0x94C1, 0x94C1, 0x47E1, 0x94C3, 0x94C3, 0x47DF,\n    0x94DC, 0x94DC, 0x47D7, 0x94F6, 0x94F6, 0x47D2, 0x952D, 0x952D, 0x47AC,\n    0x9547, 0x9547, 0x48BF, 0x9577, 0x9577, 0x0697, 0x9578, 0x9578, 0x4508,\n    0x957A, 0x957A, 0x20A1, 0x957B, 0x957B, 0x234A, 0x957C, 0x957C, 0x2AB1,\n    0x957D, 0x957D, 0x3162, 0x957F, 0x957F, 0x4509, 0x9580, 0x9580, 0x0698,\n    0x9582, 0x9582, 0x0821, 0x9583, 0x9583, 0x09EA, 0x9585, 0x9585, 0x38A1,\n    0x9586, 0x9586, 0x20A2, 0x9588, 0x9588, 0x20A3, 0x9589, 0x9589, 0x0BD0,\n    0x958B, 0x958B, 0x0D9A, 0x958C, 0x958C, 0x234C, 0x958D, 0x958D, 0x234B,\n    0x958E, 0x958E, 0x0D9E, 0x958F, 0x958F, 0x0D99, 0x9590, 0x9590, 0x234D,\n    0x9591, 0x9591, 0x0D9B, 0x9592, 0x9592, 0x0D9D, 0x9593, 0x9593, 0x0D9C,\n    0x9594, 0x9594, 0x0D98, 0x9596, 0x9596, 0x3BD5, 0x9597, 0x9597, 0x3BD4,\n    0x9598, 0x9598, 0x0F5C, 0x9599, 0x9599, 0x3BD2, 0x959B, 0x959B, 0x25F3,\n    0x959C, 0x959C, 0x25F1, 0x959E, 0x959E, 0x25F2, 0x959F, 0x959F, 0x25F0,\n    0x95A0, 0x95A0, 0x38A4, 0x95A1, 0x95A1, 0x10DF, 0x95A2, 0x95A2, 0x47AD,\n    0x95A3, 0x95A3, 0x10E2, 0x95A4, 0x95A4, 0x10E4, 0x95A5, 0x95A5, 0x10E3,\n    0x95A6, 0x95A6, 0x38A2, 0x95A7, 0x95A7, 0x3BD3, 0x95A8, 0x95A9, 0x10E0,\n    0x95AA, 0x95AA, 0x4395, 0x95AB, 0x95AB, 0x2AB3, 0x95AC, 0x95AC, 0x2AB2,\n    0x95AD, 0x95AD, 0x1260, 0x95AE, 0x95AE, 0x2AB4, 0x95B0, 0x95B0, 0x2AB5,\n    0x95B1, 0x95B1, 0x1261, 0x95B5, 0x95B5, 0x2CF0, 0x95B6, 0x95B6, 0x2CEE,\n    0x95B7, 0x95B7, 0x2EAD, 0x95B9, 0x95BA, 0x2CEC, 0x95BB, 0x95BB, 0x1385,\n    0x95BC, 0x95BC, 0x2CE9, 0x95BD, 0x95BD, 0x2CF1, 0x95BE, 0x95BE, 0x2CEB,\n    0x95BF, 0x95BF, 0x2CEF, 0x95C0, 0x95C0, 0x2EA9, 0x95C3, 0x95C3, 0x2EAB,\n    0x95C5, 0x95C5, 0x2EAC, 0x95C6, 0x95C6, 0x14AE, 0x95C7, 0x95C7, 0x2EA8,\n    0x95C8, 0x95C8, 0x14AD, 0x95C9, 0x95C9, 0x2EAA, 0x95CA, 0x95CC, 0x14AA,\n    0x95CD, 0x95CD, 0x2CEA, 0x95D0, 0x95D0, 0x154C, 0x95D1, 0x95D1, 0x301F,\n    0x95D2, 0x95D3, 0x301D, 0x95D4, 0x95D4, 0x154A, 0x95D5, 0x95D5, 0x154D,\n    0x95D6, 0x95D6, 0x154B, 0x95DA, 0x95DB, 0x3163, 0x95DC, 0x95DC, 0x15EB,\n    0x95DE, 0x95DE, 0x326C, 0x95DF, 0x95DF, 0x326E, 0x95E0, 0x95E0, 0x326D,\n    0x95E1, 0x95E1, 0x1655, 0x95E2, 0x95E2, 0x16A0, 0x95E3, 0x95E3, 0x3330,\n    0x95E4, 0x95E4, 0x332F, 0x95E5, 0x95E5, 0x332E, 0x95E8, 0x95E8, 0x450A,\n    0x95F4, 0x95F4, 0x47AF, 0x961C, 0x961C, 0x0699, 0x961D, 0x961D, 0x4519,\n    0x961E, 0x961E, 0x17B4, 0x9620, 0x9620, 0x1821, 0x9621, 0x9621, 0x0414,\n    0x9622, 0x9622, 0x181F, 0x9623, 0x9623, 0x1822, 0x9624, 0x9624, 0x1820,\n    0x9628, 0x9628, 0x18F1, 0x962A, 0x962A, 0x0526, 0x962C, 0x962C, 0x0527,\n    0x962D, 0x962D, 0x18F3, 0x962E, 0x962E, 0x0524, 0x962F, 0x962F, 0x18F2,\n    0x9630, 0x9630, 0x18F0, 0x9631, 0x9631, 0x0525, 0x9632, 0x9632, 0x0523,\n    0x9633, 0x9633, 0x47B0, 0x9638, 0x9638, 0x3FD1, 0x9639, 0x9639, 0x1A55,\n    0x963A, 0x963A, 0x1A58, 0x963B, 0x963B, 0x069C, 0x963C, 0x963C, 0x1A57,\n    0x963D, 0x963D, 0x1A56, 0x963F, 0x963F, 0x069B, 0x9640, 0x9640, 0x069A,\n    0x9641, 0x9641, 0x3F3D, 0x9642, 0x9642, 0x069E, 0x9643, 0x9643, 0x1A59,\n    0x9644, 0x9644, 0x069D, 0x9645, 0x9645, 0x4772, 0x964A, 0x964A, 0x1C1A,\n    0x964B, 0x964D, 0x0823, 0x964E, 0x964E, 0x1C1B, 0x964F, 0x964F, 0x1C17,\n    0x9650, 0x9650, 0x0822, 0x9651, 0x9651, 0x1C18, 0x9653, 0x9653, 0x1C19,\n    0x9654, 0x9654, 0x1C16, 0x9656, 0x9656, 0x3DE7, 0x9658, 0x9658, 0x09F1,\n    0x965B, 0x965B, 0x09EE, 0x965C, 0x965C, 0x1E2F, 0x965D, 0x965D, 0x09EF,\n    0x965E, 0x965E, 0x09F2, 0x965F, 0x965F, 0x1E30, 0x9661, 0x9661, 0x09ED,\n    0x9662, 0x9663, 0x09EB, 0x9664, 0x9664, 0x09F0, 0x9669, 0x9669, 0x475E,\n    0x966A, 0x966A, 0x0BD1, 0x966B, 0x966B, 0x20A6, 0x966C, 0x966C, 0x0BD9,\n    0x966D, 0x966D, 0x20A5, 0x966F, 0x966F, 0x20A8, 0x9670, 0x9670, 0x0BD5,\n    0x9671, 0x9671, 0x20A7, 0x9672, 0x9672, 0x0DA6, 0x9673, 0x9673, 0x0BD3,\n    0x9674, 0x9674, 0x0BD6, 0x9675, 0x9675, 0x0BD2, 0x9676, 0x9677, 0x0BD7,\n    0x9678, 0x9678, 0x0BD4, 0x967B, 0x967B, 0x38AC, 0x967C, 0x967C, 0x20A4,\n    0x967D, 0x967D, 0x0DA2, 0x967E, 0x967E, 0x234F, 0x9680, 0x9680, 0x2353,\n    0x9681, 0x9681, 0x3F46, 0x9683, 0x9683, 0x2352, 0x9684, 0x9684, 0x0DA7,\n    0x9685, 0x9686, 0x0DA3, 0x9687, 0x9687, 0x234E, 0x9688, 0x9689, 0x2350,\n    0x968A, 0x968A, 0x0D9F, 0x968B, 0x968B, 0x0DA1, 0x968D, 0x968D, 0x0DA5,\n    0x968E, 0x968E, 0x0DA0, 0x968F, 0x968F, 0x3BDE, 0x9691, 0x9691, 0x25F6,\n    0x9692, 0x9693, 0x25F4, 0x9694, 0x9695, 0x0F5E, 0x9696, 0x9696, 0x38AD,\n    0x9697, 0x9697, 0x25F7, 0x9698, 0x9698, 0x0F5D, 0x9699, 0x9699, 0x10E5,\n    0x969B, 0x969B, 0x10E7, 0x969C, 0x969C, 0x10E6, 0x969E, 0x969E, 0x2852,\n    0x96A1, 0x96A1, 0x2853, 0x96A2, 0x96A2, 0x2AB7, 0x96A3, 0x96A3, 0x38AF,\n    0x96A4, 0x96A4, 0x2AB6, 0x96A5, 0x96A5, 0x42EF, 0x96A7, 0x96A8, 0x1386,\n    0x96A9, 0x96A9, 0x2CF2, 0x96AA, 0x96AA, 0x1388, 0x96AC, 0x96AC, 0x2EB0,\n    0x96AE, 0x96AE, 0x2EAE, 0x96B0, 0x96B0, 0x2EAF, 0x96B1, 0x96B1, 0x14AF,\n    0x96B3, 0x96B3, 0x3020, 0x96B4, 0x96B4, 0x15EC, 0x96B6, 0x96B6, 0x0231,\n    0x96B8, 0x96B8, 0x14B0, 0x96B9, 0x96B9, 0x069F, 0x96BB, 0x96BB, 0x09F3,\n    0x96BC, 0x96BC, 0x1E31, 0x96BD, 0x96BD, 0x38B5, 0x96BF, 0x96BF, 0x20A9,\n    0x96C0, 0x96C0, 0x0BDA, 0x96C1, 0x96C1, 0x0DA8, 0x96C2, 0x96C2, 0x2354,\n    0x96C3, 0x96C3, 0x2356, 0x96C4, 0x96C4, 0x0DAA, 0x96C5, 0x96C5, 0x0DA9,\n    0x96C6, 0x96C7, 0x0DAB, 0x96C8, 0x96C8, 0x2355, 0x96C9, 0x96CA, 0x0F62,\n    0x96CB, 0x96CB, 0x0F61, 0x96CC, 0x96CC, 0x10E8, 0x96CD, 0x96CD, 0x0F60,\n    0x96CE, 0x96CE, 0x25F8, 0x96D2, 0x96D2, 0x10E9, 0x96D3, 0x96D3, 0x2AB8,\n    0x96D4, 0x96D4, 0x2CF3, 0x96D5, 0x96D5, 0x1389, 0x96D6, 0x96D6, 0x14B1,\n    0x96D7, 0x96D7, 0x3021, 0x96D8, 0x96D8, 0x3025, 0x96D9, 0x96D9, 0x1550,\n    0x96DA, 0x96DA, 0x3022, 0x96DB, 0x96DB, 0x1551, 0x96DC, 0x96DC, 0x154F,\n    0x96DD, 0x96DD, 0x3026, 0x96DE, 0x96DE, 0x1552, 0x96DF, 0x96DF, 0x3024,\n    0x96E1, 0x96E1, 0x3165, 0x96E2, 0x96E2, 0x154E, 0x96E3, 0x96E3, 0x15ED,\n    0x96E5, 0x96E5, 0x34A8, 0x96E8, 0x96E8, 0x06A0, 0x96E9, 0x96E9, 0x0BDC,\n    0x96EA, 0x96EA, 0x0BDB, 0x96EF, 0x96EF, 0x0DAD, 0x96F0, 0x96F0, 0x2358,\n    0x96F1, 0x96F1, 0x2357, 0x96F2, 0x96F2, 0x0DAE, 0x96F4, 0x96F4, 0x3A04,\n    0x96F5, 0x96F5, 0x25FC, 0x96F6, 0x96F6, 0x0F67, 0x96F7, 0x96F7, 0x0F64,\n    0x96F8, 0x96F8, 0x25FB, 0x96F9, 0x96F9, 0x0F66, 0x96FA, 0x96FA, 0x25F9,\n    0x96FB, 0x96FB, 0x0F65, 0x96FD, 0x96FD, 0x25FA, 0x96FF, 0x96FF, 0x2854,\n    0x9700, 0x9700, 0x10EA, 0x9702, 0x9702, 0x2ABB, 0x9703, 0x9703, 0x3F0D,\n    0x9704, 0x9704, 0x1262, 0x9705, 0x9705, 0x2AB9, 0x9706, 0x9707, 0x1263,\n    0x9708, 0x9708, 0x2ABA, 0x9709, 0x9709, 0x1265, 0x970B, 0x970B, 0x2CF4,\n    0x970D, 0x970D, 0x138D, 0x970E, 0x970E, 0x138A, 0x970F, 0x970F, 0x138F,\n    0x9710, 0x9710, 0x2CF6, 0x9711, 0x9711, 0x138B, 0x9712, 0x9712, 0x2CF5,\n    0x9713, 0x9713, 0x138E, 0x9716, 0x9716, 0x138C, 0x9718, 0x9718, 0x2EB3,\n    0x9719, 0x9719, 0x2EB5, 0x971B, 0x971B, 0x38C9, 0x971C, 0x971C, 0x14B2,\n    0x971D, 0x971D, 0x2EB4, 0x971E, 0x971E, 0x14B3, 0x971F, 0x971F, 0x2EB2,\n    0x9720, 0x9720, 0x2EB1, 0x9721, 0x9721, 0x3FB3, 0x9722, 0x9722, 0x3028,\n    0x9723, 0x9723, 0x3027, 0x9724, 0x9724, 0x1553, 0x9725, 0x9725, 0x3029,\n    0x9726, 0x9726, 0x316A, 0x9727, 0x9727, 0x15EF, 0x9728, 0x9728, 0x3169,\n    0x9729, 0x9729, 0x3166, 0x972A, 0x972A, 0x15EE, 0x972B, 0x972C, 0x3167,\n    0x972E, 0x972F, 0x326F, 0x9730, 0x9730, 0x1656, 0x9731, 0x9731, 0x38C0,\n    0x9732, 0x9732, 0x16A3, 0x9735, 0x9735, 0x3331, 0x9736, 0x9736, 0x38C2,\n    0x9738, 0x9739, 0x16A1, 0x973A, 0x973A, 0x3332, 0x973D, 0x973E, 0x16E2,\n    0x973F, 0x973F, 0x33D1, 0x9740, 0x9740, 0x47B3, 0x9741, 0x9741, 0x3BE9,\n    0x9742, 0x9742, 0x1732, 0x9743, 0x9743, 0x34AA, 0x9744, 0x9744, 0x1734,\n    0x9746, 0x9746, 0x34A9, 0x9747, 0x9747, 0x34AB, 0x9748, 0x9748, 0x1733,\n    0x9749, 0x9749, 0x34F1, 0x974B, 0x974B, 0x3526, 0x9751, 0x9751, 0x44E3,\n    0x9752, 0x9752, 0x06A1, 0x9756, 0x9756, 0x0F68, 0x9757, 0x9757, 0x38CC,\n    0x9758, 0x9758, 0x2855, 0x975A, 0x975A, 0x2ABC, 0x975B, 0x975C, 0x1390,\n    0x975D, 0x975D, 0x3BEF, 0x975E, 0x975E, 0x06A2, 0x975F, 0x975F, 0x38CF,\n    0x9760, 0x9760, 0x1266, 0x9761, 0x9761, 0x15F0, 0x9762, 0x9762, 0x0826,\n    0x9766, 0x9766, 0x1392, 0x9768, 0x9768, 0x1710, 0x9769, 0x9769, 0x0827,\n    0x976A, 0x976A, 0x20AA, 0x976C, 0x976C, 0x2359, 0x976D, 0x976D, 0x3E97,\n    0x976E, 0x976E, 0x235B, 0x9770, 0x9770, 0x235A, 0x9771, 0x9771, 0x3BFC,\n    0x9772, 0x9772, 0x2600, 0x9773, 0x9773, 0x25FD, 0x9774, 0x9774, 0x0F69,\n    0x9776, 0x9776, 0x0F6A, 0x9777, 0x9778, 0x25FE, 0x977A, 0x977A, 0x2857,\n    0x977B, 0x977B, 0x285C, 0x977C, 0x977C, 0x10EB, 0x977D, 0x977D, 0x2856,\n    0x977E, 0x977E, 0x2858, 0x977F, 0x977F, 0x285F, 0x9780, 0x9780, 0x285A,\n    0x9781, 0x9781, 0x285E, 0x9782, 0x9782, 0x285B, 0x9783, 0x9783, 0x2859,\n    0x9784, 0x9784, 0x285D, 0x9785, 0x9785, 0x10EC, 0x9787, 0x9787, 0x40C0,\n    0x9788, 0x9788, 0x2ABF, 0x9789, 0x9789, 0x38D4, 0x978A, 0x978A, 0x2ABD,\n    0x978B, 0x978B, 0x1268, 0x978D, 0x978D, 0x1267, 0x978E, 0x978E, 0x2ABE,\n    0x978F, 0x978F, 0x1269, 0x9794, 0x9794, 0x2CF9, 0x9797, 0x9797, 0x2CF8,\n    0x9798, 0x9798, 0x1393, 0x9799, 0x9799, 0x2CF7, 0x979A, 0x979A, 0x2EB6,\n    0x979B, 0x979B, 0x3BFB, 0x979C, 0x979C, 0x2EB8, 0x979D, 0x979D, 0x2EBA,\n    0x979E, 0x979E, 0x2EB9, 0x979F, 0x979F, 0x38D5, 0x97A0, 0x97A0, 0x14B4,\n    0x97A1, 0x97A1, 0x2EB7, 0x97A2, 0x97A2, 0x3030, 0x97A3, 0x97A3, 0x1554,\n    0x97A4, 0x97A4, 0x302E, 0x97A5, 0x97A5, 0x3031, 0x97A6, 0x97A6, 0x1555,\n    0x97A8, 0x97A8, 0x302C, 0x97AA, 0x97AA, 0x302F, 0x97AB, 0x97AB, 0x302D,\n    0x97AC, 0x97AC, 0x302A, 0x97AD, 0x97AD, 0x1556, 0x97AE, 0x97AE, 0x302B,\n    0x97B1, 0x97B1, 0x38D6, 0x97B2, 0x97B2, 0x47B5, 0x97B3, 0x97B3, 0x316B,\n    0x97B4, 0x97B4, 0x3F33, 0x97B6, 0x97B6, 0x316D, 0x97B7, 0x97B7, 0x316C,\n    0x97B8, 0x97B8, 0x3D95, 0x97B9, 0x97B9, 0x3271, 0x97BA, 0x97BA, 0x3F35,\n    0x97BB, 0x97BB, 0x3272, 0x97BD, 0x97BD, 0x494E, 0x97BE, 0x97BE, 0x38D7,\n    0x97BF, 0x97BF, 0x3333, 0x97C0, 0x97C0, 0x38D8, 0x97C1, 0x97C1, 0x16E5,\n    0x97C2, 0x97C2, 0x47B6, 0x97C3, 0x97C3, 0x16E4, 0x97C4, 0x97C5, 0x344C,\n    0x97C6, 0x97C6, 0x1735, 0x97C7, 0x97C7, 0x34AC, 0x97C8, 0x97C8, 0x3F2F,\n    0x97C9, 0x97C9, 0x1756, 0x97CB, 0x97CB, 0x0828, 0x97CC, 0x97CC, 0x0DAF,\n    0x97CD, 0x97CD, 0x2861, 0x97CE, 0x97CE, 0x2860, 0x97CF, 0x97CF, 0x2AC1,\n    0x97D0, 0x97D0, 0x2AC0, 0x97D2, 0x97D2, 0x38D9, 0x97D3, 0x97D3, 0x14B5,\n    0x97D4, 0x97D4, 0x2EBC, 0x97D5, 0x97D5, 0x2EBB, 0x97D6, 0x97D6, 0x3034,\n    0x97D7, 0x97D7, 0x3032, 0x97D8, 0x97D8, 0x3035, 0x97D9, 0x97D9, 0x3033,\n    0x97DC, 0x97DC, 0x15F1, 0x97DD, 0x97DF, 0x316E, 0x97E0, 0x97E0, 0x38DA,\n    0x97E1, 0x97E1, 0x3334, 0x97E3, 0x97E3, 0x33D2, 0x97E5, 0x97E5, 0x34AD,\n    0x97E6, 0x97E6, 0x450C, 0x97ED, 0x97ED, 0x0829, 0x97EE, 0x97EE, 0x38DC,\n    0x97F0, 0x97F0, 0x2CFA, 0x97F1, 0x97F1, 0x2EBD, 0x97F2, 0x97F2, 0x394D,\n    0x97F3, 0x97F3, 0x082A, 0x97F5, 0x97F5, 0x38E0, 0x97F6, 0x97F6, 0x10ED,\n    0x97F8, 0x97F8, 0x2CFB, 0x97F9, 0x97F9, 0x1557, 0x97FA, 0x97FA, 0x3036,\n    0x97FB, 0x97FB, 0x15F2, 0x97FD, 0x97FE, 0x3273, 0x97FF, 0x97FF, 0x16A4,\n    0x9800, 0x9800, 0x344E, 0x9801, 0x9801, 0x082B, 0x9802, 0x9803, 0x0BDF,\n    0x9804, 0x9804, 0x20AB, 0x9805, 0x9806, 0x0DB0, 0x9807, 0x9807, 0x235C,\n    0x9808, 0x9808, 0x0DB2, 0x980A, 0x980A, 0x0F6E, 0x980C, 0x980C, 0x0F70,\n    0x980D, 0x980E, 0x2602, 0x980F, 0x980F, 0x2601, 0x9810, 0x9811, 0x0F6B,\n    0x9812, 0x9812, 0x0F6F, 0x9813, 0x9813, 0x0F6D, 0x9814, 0x9814, 0x4952,\n    0x9815, 0x9815, 0x433C, 0x9816, 0x9816, 0x2862, 0x9817, 0x9818, 0x10EE,\n    0x981B, 0x981B, 0x2AC8, 0x981C, 0x981C, 0x126C, 0x981D, 0x981D, 0x2AC3,\n    0x981E, 0x981E, 0x2AC2, 0x981F, 0x981F, 0x3C02, 0x9820, 0x9820, 0x2AC7,\n    0x9821, 0x9821, 0x126A, 0x9823, 0x9823, 0x3E37, 0x9824, 0x9824, 0x139A,\n    0x9826, 0x9826, 0x2AC4, 0x9827, 0x9827, 0x2AC9, 0x9828, 0x9828, 0x2AC6,\n    0x9829, 0x9829, 0x2AC5, 0x982B, 0x982B, 0x126B, 0x982D, 0x982D, 0x1398,\n    0x982E, 0x982E, 0x3F72, 0x982F, 0x982F, 0x2CFD, 0x9830, 0x9830, 0x1394,\n    0x9832, 0x9832, 0x2CFE, 0x9833, 0x9833, 0x38E5, 0x9834, 0x9834, 0x38E4,\n    0x9835, 0x9835, 0x2CFC, 0x9837, 0x9837, 0x1397, 0x9838, 0x9838, 0x1395,\n    0x9839, 0x9839, 0x1399, 0x983B, 0x983B, 0x1396, 0x9841, 0x9841, 0x2EBE,\n    0x9843, 0x9843, 0x2EC3, 0x9844, 0x9844, 0x2EBF, 0x9845, 0x9845, 0x2EC2,\n    0x9846, 0x9846, 0x14B6, 0x9847, 0x9847, 0x3D96, 0x9848, 0x9848, 0x2DF2,\n    0x9849, 0x9849, 0x2EC1, 0x984A, 0x984A, 0x2EC0, 0x984B, 0x984B, 0x38E6,\n    0x984C, 0x984C, 0x155A, 0x984D, 0x984D, 0x1558, 0x984E, 0x984E, 0x155B,\n    0x984F, 0x984F, 0x1559, 0x9850, 0x9852, 0x3037, 0x9853, 0x9853, 0x155C,\n    0x9857, 0x9857, 0x3174, 0x9858, 0x9858, 0x15F4, 0x9859, 0x9859, 0x3172,\n    0x985B, 0x985B, 0x15F5, 0x985C, 0x985C, 0x3171, 0x985D, 0x985D, 0x3173,\n    0x985E, 0x985E, 0x15F3, 0x985F, 0x985F, 0x3278, 0x9860, 0x9860, 0x3275,\n    0x9862, 0x9863, 0x3276, 0x9864, 0x9864, 0x3335, 0x9865, 0x9865, 0x16A6,\n    0x9866, 0x9866, 0x38E7, 0x9867, 0x9867, 0x16A5, 0x9869, 0x9869, 0x33D4,\n    0x986A, 0x986A, 0x33D3, 0x986B, 0x986B, 0x16E6, 0x986C, 0x986C, 0x4035,\n    0x986F, 0x986F, 0x1711, 0x9870, 0x9870, 0x1736, 0x9871, 0x9871, 0x174D,\n    0x9872, 0x9872, 0x34F2, 0x9873, 0x9874, 0x3527, 0x9875, 0x9875, 0x450D,\n    0x98A8, 0x98A8, 0x082C, 0x98A9, 0x98A9, 0x235D, 0x98AC, 0x98AC, 0x2604,\n    0x98AD, 0x98AE, 0x2863, 0x98AF, 0x98AF, 0x10F0, 0x98B1, 0x98B1, 0x10F1,\n    0x98B2, 0x98B2, 0x2ACA, 0x98B3, 0x98B3, 0x126D, 0x98B4, 0x98B4, 0x3F73,\n    0x98B6, 0x98B6, 0x14B7, 0x98B7, 0x98B7, 0x38EF, 0x98B8, 0x98B8, 0x303A,\n    0x98B9, 0x98B9, 0x47B8, 0x98BA, 0x98BA, 0x155D, 0x98BB, 0x98BB, 0x3177,\n    0x98BC, 0x98BC, 0x15F6, 0x98BD, 0x98BD, 0x3176, 0x98BE, 0x98BE, 0x3178,\n    0x98BF, 0x98BF, 0x3175, 0x98C0, 0x98C0, 0x3338, 0x98C1, 0x98C2, 0x3279,\n    0x98C3, 0x98C3, 0x3B78, 0x98C4, 0x98C4, 0x1657, 0x98C6, 0x98C6, 0x3337,\n    0x98C7, 0x98C7, 0x38F1, 0x98C8, 0x98C8, 0x38F0, 0x98C9, 0x98C9, 0x3336,\n    0x98CA, 0x98CA, 0x38EE, 0x98CB, 0x98CB, 0x33D5, 0x98CC, 0x98CC, 0x3529,\n    0x98CE, 0x98CE, 0x450E, 0x98DB, 0x98DB, 0x082D, 0x98DC, 0x98DC, 0x3C0B,\n    0x98DE, 0x98DE, 0x450F, 0x98DF, 0x98DF, 0x082E, 0x98E0, 0x98E0, 0x4792,\n    0x98E1, 0x98E1, 0x38F6, 0x98E2, 0x98E2, 0x09F4, 0x98E3, 0x98E3, 0x1E32,\n    0x98E5, 0x98E5, 0x20AC, 0x98E6, 0x98E6, 0x38F7, 0x98E7, 0x98E7, 0x0DB3,\n    0x98E9, 0x98E9, 0x0DB6, 0x98EA, 0x98EA, 0x0DB4, 0x98EB, 0x98EB, 0x235E,\n    0x98EC, 0x98EC, 0x38F8, 0x98ED, 0x98ED, 0x0DB8, 0x98EF, 0x98EF, 0x0DB5,\n    0x98F1, 0x98F1, 0x47BA, 0x98F2, 0x98F2, 0x0DB7, 0x98F4, 0x98F4, 0x0F72,\n    0x98F5, 0x98F5, 0x4365, 0x98F6, 0x98F6, 0x2605, 0x98F9, 0x98F9, 0x2606,\n    0x98FA, 0x98FA, 0x2ACC, 0x98FC, 0x98FC, 0x0F71, 0x98FD, 0x98FE, 0x0F73,\n    0x9900, 0x9900, 0x2866, 0x9902, 0x9902, 0x2865, 0x9903, 0x9903, 0x10F2,\n    0x9905, 0x9905, 0x10F3, 0x9907, 0x9907, 0x2867, 0x9908, 0x9908, 0x2ACB,\n    0x9909, 0x9909, 0x10F5, 0x990A, 0x990A, 0x126E, 0x990C, 0x990C, 0x10F4,\n    0x990E, 0x990E, 0x43ED, 0x9910, 0x9910, 0x139B, 0x9911, 0x9911, 0x2ACD,\n    0x9912, 0x9912, 0x1270, 0x9913, 0x9913, 0x126F, 0x9914, 0x9914, 0x2ACE,\n    0x9915, 0x9915, 0x2AD1, 0x9916, 0x9917, 0x2ACF, 0x9918, 0x9918, 0x1271,\n    0x9919, 0x9919, 0x47BC, 0x991A, 0x991A, 0x13A0, 0x991B, 0x991B, 0x139E,\n    0x991C, 0x991C, 0x43EE, 0x991E, 0x991E, 0x139D, 0x991F, 0x991F, 0x2D00,\n    0x9921, 0x9921, 0x139F, 0x9924, 0x9924, 0x2CFF, 0x9925, 0x9925, 0x2EC4,\n    0x9927, 0x9927, 0x2D01, 0x9928, 0x9928, 0x139C, 0x9929, 0x9929, 0x2D02,\n    0x992A, 0x992A, 0x2EC7, 0x992B, 0x992C, 0x2EC5, 0x992D, 0x992D, 0x2ECB,\n    0x992E, 0x992E, 0x1561, 0x992F, 0x992F, 0x2ECA, 0x9930, 0x9930, 0x2ECD,\n    0x9931, 0x9931, 0x2ECC, 0x9932, 0x9932, 0x2EC9, 0x9933, 0x9933, 0x2EC8,\n    0x9935, 0x9935, 0x14B8, 0x9937, 0x9937, 0x47BD, 0x9938, 0x9938, 0x3BFD,\n    0x9939, 0x9939, 0x38FA, 0x993A, 0x993A, 0x303D, 0x993B, 0x993B, 0x3C11,\n    0x993C, 0x993C, 0x303C, 0x993D, 0x993D, 0x1560, 0x993E, 0x993F, 0x155E,\n    0x9940, 0x9940, 0x3F34, 0x9941, 0x9941, 0x303B, 0x9942, 0x9942, 0x43FF,\n    0x9943, 0x9943, 0x317B, 0x9945, 0x9945, 0x15F7, 0x9947, 0x9947, 0x317A,\n    0x9948, 0x9948, 0x3179, 0x9949, 0x9949, 0x15F8, 0x994A, 0x994A, 0x3FB9,\n    0x994B, 0x994B, 0x327F, 0x994C, 0x994C, 0x327E, 0x994D, 0x994D, 0x3C12,\n    0x994E, 0x994E, 0x327C, 0x9950, 0x9950, 0x327B, 0x9951, 0x9951, 0x1659,\n    0x9952, 0x9952, 0x1658, 0x9953, 0x9953, 0x3280, 0x9954, 0x9954, 0x33D6,\n    0x9955, 0x9955, 0x16E7, 0x9956, 0x9956, 0x333A, 0x9957, 0x9957, 0x16A7,\n    0x9958, 0x9958, 0x3339, 0x9959, 0x9959, 0x327D, 0x995B, 0x995B, 0x33D7,\n    0x995C, 0x995C, 0x1712, 0x995D, 0x995D, 0x47BE, 0x995E, 0x995E, 0x174E,\n    0x995F, 0x995F, 0x34F3, 0x9961, 0x9961, 0x352A, 0x9962, 0x9962, 0x43EF,\n    0x9963, 0x9963, 0x4510, 0x9996, 0x9996, 0x082F, 0x9997, 0x9997, 0x20AD,\n    0x9998, 0x9998, 0x2ECE, 0x9999, 0x9999, 0x0830, 0x999B, 0x999B, 0x3C15,\n    0x999C, 0x999C, 0x2869, 0x999D, 0x999D, 0x2868, 0x999E, 0x999E, 0x2D03,\n    0x99A1, 0x99A1, 0x2ED0, 0x99A3, 0x99A3, 0x2ECF, 0x99A4, 0x99A4, 0x41C3,\n    0x99A5, 0x99A5, 0x1562, 0x99A6, 0x99A7, 0x317C, 0x99A8, 0x99A8, 0x165A,\n    0x99AA, 0x99AA, 0x3C17, 0x99AB, 0x99AB, 0x352B, 0x99AC, 0x99AC, 0x09F5,\n    0x99AD, 0x99AD, 0x0DBA, 0x99AE, 0x99AE, 0x0DB9, 0x99AF, 0x99AF, 0x2607,\n    0x99B0, 0x99B0, 0x2609, 0x99B1, 0x99B1, 0x0F76, 0x99B2, 0x99B2, 0x2608,\n    0x99B3, 0x99B3, 0x0F75, 0x99B4, 0x99B4, 0x0F77, 0x99B5, 0x99B5, 0x260A,\n    0x99B8, 0x99B8, 0x394B, 0x99B9, 0x99B9, 0x286B, 0x99BA, 0x99BA, 0x286D,\n    0x99BB, 0x99BB, 0x286C, 0x99BC, 0x99BC, 0x3C22, 0x99BD, 0x99BD, 0x286F,\n    0x99C1, 0x99C1, 0x10F6, 0x99C2, 0x99C2, 0x286E, 0x99C3, 0x99C3, 0x286A,\n    0x99C4, 0x99C4, 0x3D77, 0x99C5, 0x99C5, 0x47C1, 0x99C7, 0x99C7, 0x2870,\n    0x99C9, 0x99C9, 0x2AD8, 0x99CB, 0x99CB, 0x2ADB, 0x99CC, 0x99CC, 0x2ADD,\n    0x99CD, 0x99CD, 0x2AD3, 0x99CE, 0x99CE, 0x2AD7, 0x99CF, 0x99CF, 0x2AD4,\n    0x99D0, 0x99D0, 0x1273, 0x99D1, 0x99D1, 0x1276, 0x99D2, 0x99D2, 0x1278,\n    0x99D3, 0x99D4, 0x2AD5, 0x99D5, 0x99D5, 0x1277, 0x99D6, 0x99D6, 0x2AD9,\n    0x99D7, 0x99D7, 0x2ADC, 0x99D8, 0x99D8, 0x2ADA, 0x99D9, 0x99D9, 0x1279,\n    0x99DA, 0x99DA, 0x3F42, 0x99DB, 0x99DB, 0x1275, 0x99DC, 0x99DC, 0x2AD2,\n    0x99DD, 0x99DD, 0x1272, 0x99DF, 0x99DF, 0x1274, 0x99E1, 0x99E1, 0x3785,\n    0x99E2, 0x99E2, 0x13A2, 0x99E3, 0x99E3, 0x2D09, 0x99E4, 0x99E4, 0x2D07,\n    0x99E5, 0x99E5, 0x2D06, 0x99E6, 0x99E6, 0x3B65, 0x99E7, 0x99E7, 0x2D0C,\n    0x99E9, 0x99E9, 0x2D0B, 0x99EA, 0x99EA, 0x2D0A, 0x99EC, 0x99EC, 0x2D05,\n    0x99ED, 0x99ED, 0x13A1, 0x99EE, 0x99EE, 0x2D04, 0x99F0, 0x99F0, 0x2D08,\n    0x99F1, 0x99F1, 0x13A3, 0x99F4, 0x99F4, 0x2ED3, 0x99F5, 0x99F5, 0x38FF,\n    0x99F6, 0x99F6, 0x2ED7, 0x99F7, 0x99F7, 0x2ED4, 0x99F8, 0x99F8, 0x2ED6,\n    0x99F9, 0x99F9, 0x2ED5, 0x99FA, 0x99FA, 0x2ED2, 0x99FB, 0x99FB, 0x2ED8,\n    0x99FC, 0x99FC, 0x2EDB, 0x99FD, 0x99FE, 0x2ED9, 0x99FF, 0x99FF, 0x14BA,\n    0x9A01, 0x9A01, 0x14B9, 0x9A02, 0x9A02, 0x2ED1, 0x9A03, 0x9A03, 0x2EDC,\n    0x9A04, 0x9A04, 0x3042, 0x9A05, 0x9A05, 0x3045, 0x9A06, 0x9A06, 0x3047,\n    0x9A07, 0x9A07, 0x3046, 0x9A09, 0x9A09, 0x3040, 0x9A0A, 0x9A0A, 0x3044,\n    0x9A0B, 0x9A0B, 0x303F, 0x9A0C, 0x9A0C, 0x3900, 0x9A0D, 0x9A0D, 0x3041,\n    0x9A0E, 0x9A0E, 0x1563, 0x9A0F, 0x9A0F, 0x303E, 0x9A10, 0x9A10, 0x3902,\n    0x9A11, 0x9A11, 0x3043, 0x9A14, 0x9A14, 0x318A, 0x9A15, 0x9A15, 0x317F,\n    0x9A16, 0x9A16, 0x15F9, 0x9A19, 0x9A19, 0x15FA, 0x9A1A, 0x9A1A, 0x317E,\n    0x9A1B, 0x9A1B, 0x3183, 0x9A1C, 0x9A1C, 0x3189, 0x9A1D, 0x9A1D, 0x3181,\n    0x9A1E, 0x9A1E, 0x3188, 0x9A1F, 0x9A1F, 0x3B6C, 0x9A20, 0x9A20, 0x3185,\n    0x9A21, 0x9A21, 0x3C1C, 0x9A22, 0x9A22, 0x3184, 0x9A23, 0x9A23, 0x3187,\n    0x9A24, 0x9A24, 0x3182, 0x9A25, 0x9A25, 0x3180, 0x9A26, 0x9A26, 0x3DF2,\n    0x9A27, 0x9A27, 0x3186, 0x9A29, 0x9A29, 0x3287, 0x9A2A, 0x9A2A, 0x3285,\n    0x9A2B, 0x9A2B, 0x165B, 0x9A2C, 0x9A2C, 0x3284, 0x9A2D, 0x9A2D, 0x328A,\n    0x9A2E, 0x9A2E, 0x3288, 0x9A2F, 0x9A2F, 0x3C1E, 0x9A30, 0x9A30, 0x165C,\n    0x9A31, 0x9A31, 0x3283, 0x9A32, 0x9A32, 0x3281, 0x9A34, 0x9A34, 0x3282,\n    0x9A35, 0x9A35, 0x165E, 0x9A36, 0x9A36, 0x3286, 0x9A37, 0x9A37, 0x165D,\n    0x9A38, 0x9A38, 0x3289, 0x9A39, 0x9A39, 0x333B, 0x9A3A, 0x9A3A, 0x3341,\n    0x9A3B, 0x9A3B, 0x3901, 0x9A3C, 0x9A3C, 0x47C3, 0x9A3D, 0x9A3D, 0x333C,\n    0x9A3E, 0x9A3E, 0x16AB, 0x9A3F, 0x9A3F, 0x3342, 0x9A40, 0x9A40, 0x16AA,\n    0x9A41, 0x9A41, 0x3340, 0x9A42, 0x9A42, 0x333F, 0x9A43, 0x9A43, 0x16A9,\n    0x9A44, 0x9A44, 0x333E, 0x9A45, 0x9A45, 0x16A8, 0x9A46, 0x9A46, 0x333D,\n    0x9A48, 0x9A48, 0x33DD, 0x9A49, 0x9A49, 0x33DF, 0x9A4A, 0x9A4A, 0x33DE,\n    0x9A4C, 0x9A4C, 0x33DB, 0x9A4D, 0x9A4D, 0x16E9, 0x9A4E, 0x9A4E, 0x33D8,\n    0x9A4F, 0x9A4F, 0x33DC, 0x9A50, 0x9A50, 0x33E1, 0x9A52, 0x9A52, 0x33E0,\n    0x9A53, 0x9A54, 0x33D9, 0x9A55, 0x9A55, 0x16E8, 0x9A56, 0x9A56, 0x344F,\n    0x9A57, 0x9A57, 0x1715, 0x9A58, 0x9A58, 0x3903, 0x9A59, 0x9A59, 0x3450,\n    0x9A5A, 0x9A5B, 0x1713, 0x9A5C, 0x9A5C, 0x3C18, 0x9A5E, 0x9A5E, 0x34AE,\n    0x9A5F, 0x9A5F, 0x1737, 0x9A60, 0x9A60, 0x3510, 0x9A62, 0x9A62, 0x1757,\n    0x9A63, 0x9A63, 0x3B67, 0x9A64, 0x9A64, 0x352C, 0x9A65, 0x9A65, 0x1758,\n    0x9A66, 0x9A67, 0x352D, 0x9A68, 0x9A68, 0x353C, 0x9A69, 0x9A69, 0x353B,\n    0x9A6A, 0x9A6A, 0x1767, 0x9A6B, 0x9A6B, 0x3544, 0x9A6C, 0x9A6C, 0x4585,\n    0x9A8F, 0x9A8F, 0x4586, 0x9AA8, 0x9AA8, 0x09F6, 0x9AAB, 0x9AAB, 0x260C,\n    0x9AAD, 0x9AAD, 0x260B, 0x9AAF, 0x9AB0, 0x10F7, 0x9AB1, 0x9AB1, 0x2871,\n    0x9AB2, 0x9AB2, 0x4332, 0x9AB3, 0x9AB3, 0x2ADE, 0x9AB4, 0x9AB4, 0x2D0F,\n    0x9AB6, 0x9AB6, 0x43F0, 0x9AB7, 0x9AB7, 0x127A, 0x9AB8, 0x9AB8, 0x13A4,\n    0x9AB9, 0x9AB9, 0x2D0D, 0x9ABA, 0x9ABA, 0x3F74, 0x9ABB, 0x9ABB, 0x2D10,\n    0x9ABC, 0x9ABC, 0x13A5, 0x9ABD, 0x9ABD, 0x3D97, 0x9ABE, 0x9ABE, 0x2EDD,\n    0x9ABF, 0x9ABF, 0x2D0E, 0x9AC0, 0x9AC0, 0x3048, 0x9AC1, 0x9AC1, 0x1564,\n    0x9AC2, 0x9AC2, 0x318B, 0x9AC6, 0x9AC6, 0x328D, 0x9AC7, 0x9AC7, 0x328B,\n    0x9ACA, 0x9ACA, 0x328C, 0x9ACD, 0x9ACD, 0x3343, 0x9ACF, 0x9ACF, 0x16AC,\n    0x9AD0, 0x9AD0, 0x33E2, 0x9AD1, 0x9AD1, 0x1718, 0x9AD2, 0x9AD2, 0x16EA,\n    0x9AD3, 0x9AD4, 0x1716, 0x9AD5, 0x9AD5, 0x34AF, 0x9AD6, 0x9AD6, 0x174F,\n    0x9AD7, 0x9AD7, 0x3FAA, 0x9AD8, 0x9AD8, 0x09F7, 0x9ADC, 0x9ADC, 0x3049,\n    0x9ADF, 0x9ADF, 0x1E33, 0x9AE0, 0x9AE0, 0x3908, 0x9AE1, 0x9AE1, 0x0F78,\n    0x9AE2, 0x9AE2, 0x3909, 0x9AE3, 0x9AE3, 0x2872, 0x9AE6, 0x9AE6, 0x10F9,\n    0x9AE7, 0x9AE7, 0x2873, 0x9AEB, 0x9AEB, 0x2AE0, 0x9AEC, 0x9AEC, 0x2ADF,\n    0x9AED, 0x9AED, 0x13A7, 0x9AEE, 0x9AEF, 0x127B, 0x9AF1, 0x9AF1, 0x2AE3,\n    0x9AF2, 0x9AF2, 0x2AE2, 0x9AF3, 0x9AF3, 0x2AE1, 0x9AF4, 0x9AF4, 0x390B,\n    0x9AF6, 0x9AF6, 0x2D11, 0x9AF7, 0x9AF7, 0x2D14, 0x9AF9, 0x9AF9, 0x2D13,\n    0x9AFA, 0x9AFA, 0x2D12, 0x9AFB, 0x9AFB, 0x13A6, 0x9AFC, 0x9AFC, 0x2EE1,\n    0x9AFD, 0x9AFD, 0x2EDF, 0x9AFE, 0x9AFE, 0x2EDE, 0x9AFF, 0x9AFF, 0x3F17,\n    0x9B01, 0x9B01, 0x2EE0, 0x9B02, 0x9B02, 0x3F12, 0x9B03, 0x9B03, 0x1565,\n    0x9B04, 0x9B05, 0x304B, 0x9B06, 0x9B06, 0x1566, 0x9B08, 0x9B08, 0x304A,\n    0x9B09, 0x9B09, 0x3F20, 0x9B0A, 0x9B0A, 0x318D, 0x9B0B, 0x9B0B, 0x318C,\n    0x9B0C, 0x9B0C, 0x318F, 0x9B0D, 0x9B0D, 0x15FB, 0x9B0E, 0x9B0E, 0x318E,\n    0x9B0F, 0x9B0F, 0x47C4, 0x9B10, 0x9B10, 0x328E, 0x9B11, 0x9B11, 0x3290,\n    0x9B12, 0x9B12, 0x328F, 0x9B14, 0x9B14, 0x390D, 0x9B15, 0x9B15, 0x3344,\n    0x9B16, 0x9B16, 0x3347, 0x9B17, 0x9B18, 0x3345, 0x9B19, 0x9B19, 0x33E3,\n    0x9B1A, 0x9B1A, 0x16EB, 0x9B1E, 0x9B20, 0x3451, 0x9B22, 0x9B22, 0x1738,\n    0x9B23, 0x9B23, 0x1750, 0x9B24, 0x9B24, 0x352F, 0x9B25, 0x9B25, 0x09F8,\n    0x9B27, 0x9B27, 0x127D, 0x9B28, 0x9B28, 0x13A8, 0x9B29, 0x9B29, 0x304D,\n    0x9B2A, 0x9B2A, 0x3F19, 0x9B2B, 0x9B2B, 0x33E4, 0x9B2D, 0x9B2D, 0x390E,\n    0x9B2E, 0x9B2E, 0x3511, 0x9B2F, 0x9B2F, 0x1E34, 0x9B31, 0x9B31, 0x1768,\n    0x9B32, 0x9B32, 0x09F9, 0x9B33, 0x9B33, 0x2D15, 0x9B34, 0x9B34, 0x3911,\n    0x9B35, 0x9B35, 0x304E, 0x9B37, 0x9B37, 0x3190, 0x9B39, 0x9B39, 0x3F00,\n    0x9B3A, 0x9B3A, 0x3348, 0x9B3B, 0x9B3B, 0x33E5, 0x9B3C, 0x9B3C, 0x09FA,\n    0x9B3E, 0x9B3F, 0x2874, 0x9B40, 0x9B40, 0x3915, 0x9B41, 0x9B42, 0x10FA,\n    0x9B43, 0x9B43, 0x2AE5, 0x9B44, 0x9B44, 0x127F, 0x9B45, 0x9B45, 0x127E,\n    0x9B46, 0x9B46, 0x2AE4, 0x9B48, 0x9B48, 0x2EE2, 0x9B4A, 0x9B4A, 0x304F,\n    0x9B4B, 0x9B4B, 0x3051, 0x9B4C, 0x9B4C, 0x3050, 0x9B4D, 0x9B4D, 0x1569,\n    0x9B4E, 0x9B4E, 0x1568, 0x9B4F, 0x9B4F, 0x1567, 0x9B50, 0x9B50, 0x3914,\n    0x9B51, 0x9B51, 0x16AE, 0x9B52, 0x9B52, 0x3349, 0x9B54, 0x9B54, 0x16AD,\n    0x9B55, 0x9B55, 0x33E7, 0x9B56, 0x9B56, 0x33E6, 0x9B58, 0x9B58, 0x1739,\n    0x9B59, 0x9B59, 0x34B0, 0x9B5A, 0x9B5A, 0x0BE1, 0x9B5B, 0x9B5B, 0x260D,\n    0x9B5F, 0x9B5F, 0x2878, 0x9B60, 0x9B61, 0x2876, 0x9B64, 0x9B64, 0x2AEE,\n    0x9B66, 0x9B66, 0x2AE9, 0x9B67, 0x9B67, 0x2AE6, 0x9B68, 0x9B68, 0x2AED,\n    0x9B69, 0x9B69, 0x47C5, 0x9B6C, 0x9B6C, 0x2AEF, 0x9B6F, 0x9B6F, 0x1281,\n    0x9B70, 0x9B70, 0x2AEC, 0x9B71, 0x9B71, 0x2AE8, 0x9B74, 0x9B74, 0x2AE7,\n    0x9B75, 0x9B75, 0x2AEB, 0x9B76, 0x9B76, 0x2AEA, 0x9B77, 0x9B77, 0x1280,\n    0x9B7A, 0x9B7A, 0x2D20, 0x9B7B, 0x9B7B, 0x2D1B, 0x9B7C, 0x9B7C, 0x2D19,\n    0x9B7D, 0x9B7D, 0x2D22, 0x9B7E, 0x9B7E, 0x2D1A, 0x9B7F, 0x9B7F, 0x3C3B,\n    0x9B80, 0x9B80, 0x2D16, 0x9B81, 0x9B81, 0x43F1, 0x9B82, 0x9B82, 0x2D1C,\n    0x9B83, 0x9B83, 0x4219, 0x9B85, 0x9B85, 0x2D17, 0x9B86, 0x9B86, 0x2EEB,\n    0x9B87, 0x9B87, 0x2D18, 0x9B88, 0x9B88, 0x2D23, 0x9B8B, 0x9B8B, 0x3EEE,\n    0x9B8D, 0x9B8D, 0x4623, 0x9B8E, 0x9B8E, 0x3919, 0x9B8F, 0x9B8F, 0x3FAD,\n    0x9B90, 0x9B90, 0x2D1F, 0x9B91, 0x9B91, 0x13A9, 0x9B92, 0x9B92, 0x2D1E,\n    0x9B93, 0x9B93, 0x2D1D, 0x9B95, 0x9B95, 0x2D21, 0x9B97, 0x9B97, 0x3F71,\n    0x9B9A, 0x9B9A, 0x2EE3, 0x9B9B, 0x9B9B, 0x2EE6, 0x9B9D, 0x9B9D, 0x3F56,\n    0x9B9E, 0x9B9E, 0x2EE5, 0x9B9F, 0x9B9F, 0x3C3E, 0x9BA0, 0x9BA0, 0x2EED,\n    0x9BA1, 0x9BA1, 0x2EE8, 0x9BA2, 0x9BA2, 0x2EEC, 0x9BA4, 0x9BA4, 0x2EEA,\n    0x9BA5, 0x9BA5, 0x2EE9, 0x9BA6, 0x9BA6, 0x2EE7, 0x9BA8, 0x9BA8, 0x2EE4,\n    0x9BAA, 0x9BAA, 0x14BD, 0x9BAB, 0x9BAB, 0x14BC, 0x9BAD, 0x9BAD, 0x14BE,\n    0x9BAE, 0x9BAE, 0x14BB, 0x9BAF, 0x9BAF, 0x2EEE, 0x9BB0, 0x9BB0, 0x3FB4,\n    0x9BB5, 0x9BB5, 0x3057, 0x9BB6, 0x9BB6, 0x305A, 0x9BB8, 0x9BB8, 0x3058,\n    0x9BB9, 0x9BB9, 0x305C, 0x9BBD, 0x9BBD, 0x305D, 0x9BBF, 0x9BBF, 0x3055,\n    0x9BC0, 0x9BC0, 0x156E, 0x9BC1, 0x9BC1, 0x3056, 0x9BC3, 0x9BC3, 0x3054,\n    0x9BC4, 0x9BC4, 0x305B, 0x9BC6, 0x9BC6, 0x3053, 0x9BC7, 0x9BC7, 0x3052,\n    0x9BC8, 0x9BC8, 0x156D, 0x9BC9, 0x9BC9, 0x156B, 0x9BCA, 0x9BCA, 0x156A,\n    0x9BCF, 0x9BCF, 0x3C3C, 0x9BD3, 0x9BD3, 0x3059, 0x9BD4, 0x9BD4, 0x3199,\n    0x9BD5, 0x9BD5, 0x319F, 0x9BD6, 0x9BD6, 0x15FE, 0x9BD7, 0x9BD7, 0x319A,\n    0x9BD9, 0x9BD9, 0x319D, 0x9BDA, 0x9BDA, 0x31A1, 0x9BDB, 0x9BDB, 0x15FF,\n    0x9BDC, 0x9BDC, 0x319C, 0x9BDD, 0x9BDD, 0x47C6, 0x9BDE, 0x9BDE, 0x3194,\n    0x9BE0, 0x9BE0, 0x3193, 0x9BE1, 0x9BE1, 0x31A0, 0x9BE2, 0x9BE2, 0x3197,\n    0x9BE4, 0x9BE4, 0x3195, 0x9BE5, 0x9BE5, 0x319E, 0x9BE6, 0x9BE6, 0x3196,\n    0x9BE7, 0x9BE7, 0x15FD, 0x9BE8, 0x9BE8, 0x15FC, 0x9BE9, 0x9BE9, 0x3BC1,\n    0x9BEA, 0x9BEB, 0x3191, 0x9BEC, 0x9BEC, 0x319B, 0x9BED, 0x9BED, 0x3ED7,\n    0x9BF0, 0x9BF0, 0x3198, 0x9BF1, 0x9BF1, 0x47C7, 0x9BF4, 0x9BF4, 0x47C8,\n    0x9BF7, 0x9BF7, 0x3293, 0x9BF8, 0x9BF8, 0x3296, 0x9BFD, 0x9BFD, 0x156C,\n    0x9BFF, 0x9BFF, 0x391B, 0x9C02, 0x9C02, 0x391A, 0x9C05, 0x9C05, 0x3294,\n    0x9C06, 0x9C06, 0x329A, 0x9C07, 0x9C07, 0x3298, 0x9C08, 0x9C08, 0x3292,\n    0x9C09, 0x9C09, 0x329D, 0x9C0A, 0x9C0A, 0x3F3A, 0x9C0B, 0x9C0B, 0x3291,\n    0x9C0C, 0x9C0C, 0x391C, 0x9C0D, 0x9C0D, 0x1660, 0x9C0E, 0x9C0E, 0x3299,\n    0x9C10, 0x9C10, 0x3C3A, 0x9C12, 0x9C12, 0x3295, 0x9C13, 0x9C13, 0x165F,\n    0x9C14, 0x9C14, 0x329C, 0x9C15, 0x9C15, 0x3F1E, 0x9C17, 0x9C17, 0x329B,\n    0x9C1B, 0x9C1B, 0x491B, 0x9C1C, 0x9C1C, 0x334C, 0x9C1D, 0x9C1D, 0x334B,\n    0x9C1F, 0x9C1F, 0x4622, 0x9C20, 0x9C20, 0x47CA, 0x9C21, 0x9C21, 0x3352,\n    0x9C23, 0x9C23, 0x334E, 0x9C24, 0x9C24, 0x3351, 0x9C25, 0x9C25, 0x16B0,\n    0x9C26, 0x9C26, 0x45E6, 0x9C28, 0x9C29, 0x334F, 0x9C2B, 0x9C2B, 0x334A,\n    0x9C2C, 0x9C2C, 0x334D, 0x9C2D, 0x9C2D, 0x16AF, 0x9C2E, 0x9C2E, 0x3F22,\n    0x9C2F, 0x9C2F, 0x3D87, 0x9C31, 0x9C31, 0x16ED, 0x9C32, 0x9C32, 0x33F2,\n    0x9C33, 0x9C33, 0x33ED, 0x9C34, 0x9C34, 0x33F1, 0x9C35, 0x9C35, 0x3C39,\n    0x9C36, 0x9C36, 0x33F4, 0x9C37, 0x9C37, 0x33F0, 0x9C39, 0x9C39, 0x33EC,\n    0x9C3A, 0x9C3A, 0x3D7E, 0x9C3B, 0x9C3B, 0x16EF, 0x9C3C, 0x9C3C, 0x33EF,\n    0x9C3D, 0x9C3D, 0x33F3, 0x9C3E, 0x9C3E, 0x16EE, 0x9C3F, 0x9C3F, 0x33EA,\n    0x9C40, 0x9C40, 0x3297, 0x9C41, 0x9C41, 0x33EE, 0x9C44, 0x9C44, 0x33EB,\n    0x9C45, 0x9C45, 0x3E71, 0x9C46, 0x9C46, 0x33E8, 0x9C48, 0x9C48, 0x33E9,\n    0x9C49, 0x9C49, 0x16EC, 0x9C4A, 0x9C4A, 0x3457, 0x9C4B, 0x9C4B, 0x3459,\n    0x9C4C, 0x9C4C, 0x345C, 0x9C4D, 0x9C4D, 0x3458, 0x9C4E, 0x9C4E, 0x345D,\n    0x9C4F, 0x9C4F, 0x3C36, 0x9C50, 0x9C50, 0x3456, 0x9C52, 0x9C52, 0x3454,\n    0x9C53, 0x9C53, 0x3C37, 0x9C54, 0x9C54, 0x1719, 0x9C55, 0x9C55, 0x345A,\n    0x9C56, 0x9C56, 0x171B, 0x9C57, 0x9C57, 0x171A, 0x9C58, 0x9C58, 0x3455,\n    0x9C59, 0x9C59, 0x345B, 0x9C5D, 0x9C5D, 0x3EBF, 0x9C5E, 0x9C5E, 0x34B5,\n    0x9C5F, 0x9C5F, 0x173A, 0x9C60, 0x9C60, 0x34B6, 0x9C62, 0x9C62, 0x34B4,\n    0x9C63, 0x9C63, 0x34B1, 0x9C66, 0x9C66, 0x34B3, 0x9C67, 0x9C67, 0x34B2,\n    0x9C68, 0x9C68, 0x34F4, 0x9C6D, 0x9C6D, 0x34F6, 0x9C6E, 0x9C6E, 0x34F5,\n    0x9C71, 0x9C71, 0x3514, 0x9C72, 0x9C72, 0x3EA1, 0x9C73, 0x9C73, 0x3513,\n    0x9C74, 0x9C74, 0x3512, 0x9C75, 0x9C75, 0x3515, 0x9C77, 0x9C78, 0x1760,\n    0x9C79, 0x9C79, 0x3541, 0x9C7A, 0x9C7A, 0x3545, 0x9C7B, 0x9C7B, 0x3C38,\n    0x9C7C, 0x9C7C, 0x4512, 0x9CE5, 0x9CE5, 0x0BE2, 0x9CE6, 0x9CE6, 0x235F,\n    0x9CE7, 0x9CE7, 0x2610, 0x9CE9, 0x9CE9, 0x0F79, 0x9CEA, 0x9CEA, 0x260E,\n    0x9CED, 0x9CED, 0x260F, 0x9CF1, 0x9CF2, 0x2879, 0x9CF3, 0x9CF3, 0x10FE,\n    0x9CF4, 0x9CF4, 0x10FC, 0x9CF5, 0x9CF5, 0x287B, 0x9CF6, 0x9CF6, 0x10FD,\n    0x9CF7, 0x9CF7, 0x2AF4, 0x9CF9, 0x9CF9, 0x2AF7, 0x9CFA, 0x9CFA, 0x2AF1,\n    0x9CFB, 0x9CFB, 0x2AF8, 0x9CFC, 0x9CFC, 0x2AF0, 0x9CFD, 0x9CFD, 0x2AF2,\n    0x9CFF, 0x9CFF, 0x2AF3, 0x9D00, 0x9D00, 0x2AF6, 0x9D02, 0x9D02, 0x3F3B,\n    0x9D03, 0x9D03, 0x1284, 0x9D04, 0x9D04, 0x2AFB, 0x9D05, 0x9D05, 0x2AFA,\n    0x9D06, 0x9D06, 0x1282, 0x9D07, 0x9D07, 0x2AF5, 0x9D08, 0x9D08, 0x2AF9,\n    0x9D09, 0x9D09, 0x1283, 0x9D0C, 0x9D0C, 0x3C46, 0x9D10, 0x9D10, 0x2D2D,\n    0x9D12, 0x9D12, 0x13AE, 0x9D14, 0x9D14, 0x2D28, 0x9D15, 0x9D15, 0x13AA,\n    0x9D16, 0x9D16, 0x3C7C, 0x9D17, 0x9D17, 0x2D25, 0x9D18, 0x9D18, 0x2D2B,\n    0x9D19, 0x9D19, 0x2D2E, 0x9D1B, 0x9D1B, 0x13AF, 0x9D1D, 0x9D1D, 0x2D2A,\n    0x9D1E, 0x9D1E, 0x2D27, 0x9D1F, 0x9D1F, 0x2D2F, 0x9D20, 0x9D20, 0x2D26,\n    0x9D21, 0x9D21, 0x3C41, 0x9D22, 0x9D22, 0x2D2C, 0x9D23, 0x9D23, 0x13AB,\n    0x9D25, 0x9D25, 0x2D24, 0x9D26, 0x9D26, 0x13AC, 0x9D28, 0x9D28, 0x13AD,\n    0x9D29, 0x9D29, 0x2D29, 0x9D2D, 0x9D2D, 0x2F00, 0x9D2E, 0x9D2F, 0x2EF3,\n    0x9D30, 0x9D30, 0x2EF7, 0x9D31, 0x9D31, 0x2EF5, 0x9D33, 0x9D33, 0x2EEF,\n    0x9D34, 0x9D34, 0x404A, 0x9D36, 0x9D36, 0x2EF2, 0x9D37, 0x9D37, 0x2EFC,\n    0x9D38, 0x9D38, 0x2EF6, 0x9D39, 0x9D39, 0x392E, 0x9D3B, 0x9D3B, 0x14BF,\n    0x9D3D, 0x9D3D, 0x2EFE, 0x9D3E, 0x9D3E, 0x2EFB, 0x9D3F, 0x9D3F, 0x14C0,\n    0x9D40, 0x9D40, 0x2EFD, 0x9D41, 0x9D41, 0x2EF0, 0x9D42, 0x9D43, 0x2EF9,\n    0x9D44, 0x9D44, 0x3FAB, 0x9D45, 0x9D45, 0x2EF8, 0x9D49, 0x9D49, 0x47CD,\n    0x9D4A, 0x9D4A, 0x3061, 0x9D4B, 0x9D4B, 0x3063, 0x9D4C, 0x9D4C, 0x3066,\n    0x9D4E, 0x9D4E, 0x4539, 0x9D4F, 0x9D4F, 0x3060, 0x9D50, 0x9D50, 0x3ECA,\n    0x9D51, 0x9D51, 0x156F, 0x9D52, 0x9D52, 0x3068, 0x9D53, 0x9D53, 0x305F,\n    0x9D54, 0x9D54, 0x3069, 0x9D56, 0x9D56, 0x3065, 0x9D57, 0x9D57, 0x3067,\n    0x9D58, 0x9D58, 0x306B, 0x9D59, 0x9D59, 0x3064, 0x9D5A, 0x9D5A, 0x306C,\n    0x9D5B, 0x9D5B, 0x3062, 0x9D5C, 0x9D5C, 0x305E, 0x9D5D, 0x9D5D, 0x1570,\n    0x9D5E, 0x9D5E, 0x3E6E, 0x9D5F, 0x9D5F, 0x306A, 0x9D60, 0x9D60, 0x1571,\n    0x9D61, 0x9D61, 0x1601, 0x9D67, 0x9D67, 0x2EF1, 0x9D68, 0x9D68, 0x31BB,\n    0x9D69, 0x9D69, 0x31B2, 0x9D6A, 0x9D6A, 0x1603, 0x9D6B, 0x9D6B, 0x31AE,\n    0x9D6C, 0x9D6C, 0x1604, 0x9D6D, 0x9D6D, 0x3BAC, 0x9D6E, 0x9D6E, 0x433B,\n    0x9D6F, 0x9D6F, 0x31B7, 0x9D70, 0x9D70, 0x31B1, 0x9D71, 0x9D71, 0x31A7,\n    0x9D72, 0x9D72, 0x1602, 0x9D73, 0x9D73, 0x31B4, 0x9D74, 0x9D75, 0x31AF,\n    0x9D77, 0x9D77, 0x31A2, 0x9D78, 0x9D78, 0x31A9, 0x9D79, 0x9D79, 0x31B8,\n    0x9D7B, 0x9D7B, 0x31B5, 0x9D7C, 0x9D7C, 0x3EFE, 0x9D7D, 0x9D7D, 0x31AD,\n    0x9D7E, 0x9D7E, 0x3925, 0x9D7F, 0x9D7F, 0x31B9, 0x9D80, 0x9D80, 0x31A8,\n    0x9D81, 0x9D81, 0x31A3, 0x9D82, 0x9D82, 0x31B6, 0x9D83, 0x9D83, 0x3926,\n    0x9D84, 0x9D84, 0x31A5, 0x9D85, 0x9D85, 0x31B3, 0x9D86, 0x9D86, 0x31AA,\n    0x9D87, 0x9D87, 0x31BA, 0x9D88, 0x9D88, 0x31A6, 0x9D89, 0x9D89, 0x1600,\n    0x9D8A, 0x9D8A, 0x31A4, 0x9D8B, 0x9D8C, 0x31AB, 0x9D90, 0x9D90, 0x32A4,\n    0x9D92, 0x9D92, 0x32A2, 0x9D93, 0x9D93, 0x43F3, 0x9D94, 0x9D94, 0x32A7,\n    0x9D96, 0x9D96, 0x32B3, 0x9D97, 0x9D97, 0x32AA, 0x9D98, 0x9D98, 0x32A3,\n    0x9D99, 0x9D99, 0x329F, 0x9D9A, 0x9D9A, 0x32AC, 0x9D9B, 0x9D9B, 0x32A5,\n    0x9D9C, 0x9D9C, 0x32A8, 0x9D9D, 0x9D9D, 0x32A1, 0x9D9E, 0x9D9E, 0x32AF,\n    0x9D9F, 0x9D9F, 0x329E, 0x9DA0, 0x9DA0, 0x32A6, 0x9DA1, 0x9DA1, 0x32AB,\n    0x9DA2, 0x9DA2, 0x32AD, 0x9DA3, 0x9DA3, 0x32B0, 0x9DA4, 0x9DA4, 0x32A0,\n    0x9DA5, 0x9DA5, 0x3C4B, 0x9DA6, 0x9DA7, 0x32B4, 0x9DA8, 0x9DA8, 0x32AE,\n    0x9DA9, 0x9DA9, 0x32B2, 0x9DAA, 0x9DAA, 0x32A9, 0x9DAB, 0x9DAB, 0x3F30,\n    0x9DAC, 0x9DAC, 0x3362, 0x9DAD, 0x9DAD, 0x3365, 0x9DAF, 0x9DAF, 0x16B1,\n    0x9DB1, 0x9DB1, 0x3364, 0x9DB2, 0x9DB2, 0x3369, 0x9DB3, 0x9DB3, 0x3367,\n    0x9DB4, 0x9DB4, 0x16B2, 0x9DB5, 0x9DB5, 0x335E, 0x9DB6, 0x9DB6, 0x3354,\n    0x9DB7, 0x9DB7, 0x3353, 0x9DB8, 0x9DB8, 0x16B4, 0x9DB9, 0x9DBA, 0x3360,\n    0x9DBB, 0x9DBB, 0x335D, 0x9DBC, 0x9DBC, 0x3355, 0x9DBD, 0x9DBD, 0x47D0,\n    0x9DBE, 0x9DBE, 0x335A, 0x9DBF, 0x9DBF, 0x32B1, 0x9DC0, 0x9DC0, 0x43F2,\n    0x9DC1, 0x9DC1, 0x3356, 0x9DC2, 0x9DC2, 0x16B3, 0x9DC3, 0x9DC3, 0x335C,\n    0x9DC4, 0x9DC4, 0x3929, 0x9DC5, 0x9DC5, 0x335B, 0x9DC7, 0x9DC7, 0x3357,\n    0x9DC8, 0x9DC8, 0x3363, 0x9DC9, 0x9DC9, 0x4579, 0x9DCA, 0x9DCA, 0x3358,\n    0x9DCB, 0x9DCB, 0x33F9, 0x9DCC, 0x9DCC, 0x3366, 0x9DCD, 0x9DCD, 0x3368,\n    0x9DCE, 0x9DCE, 0x335F, 0x9DCF, 0x9DCF, 0x3359, 0x9DD0, 0x9DD0, 0x33FA,\n    0x9DD1, 0x9DD1, 0x33FC, 0x9DD2, 0x9DD2, 0x33F6, 0x9DD3, 0x9DD3, 0x16F0,\n    0x9DD4, 0x9DD4, 0x391E, 0x9DD5, 0x9DD5, 0x3403, 0x9DD6, 0x9DD6, 0x3401,\n    0x9DD7, 0x9DD7, 0x16F1, 0x9DD8, 0x9DD8, 0x3400, 0x9DD9, 0x9DD9, 0x33FF,\n    0x9DDA, 0x9DDA, 0x33F8, 0x9DDB, 0x9DDB, 0x33F5, 0x9DDC, 0x9DDC, 0x33FB,\n    0x9DDD, 0x9DDD, 0x3404, 0x9DDE, 0x9DDE, 0x33F7, 0x9DDF, 0x9DDF, 0x33FD,\n    0x9DE1, 0x9DE1, 0x3466, 0x9DE2, 0x9DE2, 0x346B, 0x9DE3, 0x9DE3, 0x3461,\n    0x9DE4, 0x9DE4, 0x3464, 0x9DE5, 0x9DE5, 0x171C, 0x9DE6, 0x9DE6, 0x3468,\n    0x9DE8, 0x9DE8, 0x346F, 0x9DE9, 0x9DE9, 0x33FE, 0x9DEB, 0x9DEB, 0x3462,\n    0x9DEC, 0x9DEC, 0x346C, 0x9DED, 0x9DED, 0x3470, 0x9DEE, 0x9DEE, 0x3467,\n    0x9DEF, 0x9DEF, 0x3460, 0x9DF0, 0x9DF0, 0x346A, 0x9DF2, 0x9DF2, 0x3469,\n    0x9DF3, 0x9DF3, 0x346E, 0x9DF4, 0x9DF4, 0x346D, 0x9DF5, 0x9DF5, 0x3402,\n    0x9DF6, 0x9DF6, 0x3465, 0x9DF7, 0x9DF7, 0x345F, 0x9DF8, 0x9DF8, 0x3463,\n    0x9DF9, 0x9DFA, 0x173B, 0x9DFB, 0x9DFB, 0x345E, 0x9DFC, 0x9DFC, 0x47D1,\n    0x9DFD, 0x9DFD, 0x34C1, 0x9DFE, 0x9DFE, 0x34B8, 0x9DFF, 0x9DFF, 0x34C0,\n    0x9E00, 0x9E01, 0x34BD, 0x9E02, 0x9E02, 0x34B7, 0x9E03, 0x9E03, 0x34BA,\n    0x9E04, 0x9E04, 0x34C2, 0x9E05, 0x9E05, 0x34BC, 0x9E06, 0x9E06, 0x34BB,\n    0x9E07, 0x9E07, 0x34B9, 0x9E09, 0x9E09, 0x34BF, 0x9E0A, 0x9E0A, 0x457E,\n    0x9E0B, 0x9E0B, 0x34F7, 0x9E0C, 0x9E0C, 0x457A, 0x9E0D, 0x9E0D, 0x34F8,\n    0x9E0E, 0x9E0E, 0x3928, 0x9E0F, 0x9E0F, 0x34FA, 0x9E10, 0x9E10, 0x34F9,\n    0x9E11, 0x9E11, 0x34FC, 0x9E12, 0x9E12, 0x34FB, 0x9E13, 0x9E13, 0x3517,\n    0x9E14, 0x9E14, 0x3516, 0x9E15, 0x9E15, 0x3530, 0x9E17, 0x9E17, 0x3531,\n    0x9E18, 0x9E18, 0x3C44, 0x9E19, 0x9E19, 0x353D, 0x9E1A, 0x9E1A, 0x1765,\n    0x9E1B, 0x9E1B, 0x1769, 0x9E1C, 0x9E1C, 0x3F84, 0x9E1D, 0x9E1D, 0x3546,\n    0x9E1E, 0x9E1E, 0x176A, 0x9E1F, 0x9E1F, 0x4513, 0x9E75, 0x9E75, 0x0BE3,\n    0x9E79, 0x9E79, 0x1661, 0x9E7A, 0x9E7A, 0x336A, 0x9E7B, 0x9E7B, 0x43F8,\n    0x9E7C, 0x9E7D, 0x173D, 0x9E7F, 0x9E7F, 0x0BE4, 0x9E80, 0x9E80, 0x2611,\n    0x9E81, 0x9E81, 0x3F0F, 0x9E82, 0x9E82, 0x0F7A, 0x9E83, 0x9E83, 0x2AFC,\n    0x9E84, 0x9E84, 0x3F76, 0x9E85, 0x9E85, 0x3EF2, 0x9E86, 0x9E87, 0x2D31,\n    0x9E88, 0x9E88, 0x2D30, 0x9E89, 0x9E89, 0x2F02, 0x9E8A, 0x9E8A, 0x2F01,\n    0x9E8B, 0x9E8B, 0x14C1, 0x9E8C, 0x9E8C, 0x306E, 0x9E8D, 0x9E8D, 0x2F03,\n    0x9E8E, 0x9E8E, 0x306D, 0x9E90, 0x9E90, 0x3931, 0x9E91, 0x9E91, 0x31BD,\n    0x9E92, 0x9E92, 0x1605, 0x9E93, 0x9E93, 0x1607, 0x9E94, 0x9E94, 0x31BC,\n    0x9E95, 0x9E95, 0x3932, 0x9E96, 0x9E96, 0x3FBC, 0x9E97, 0x9E97, 0x1606,\n    0x9E98, 0x9E98, 0x3F27, 0x9E99, 0x9E99, 0x32B6, 0x9E9A, 0x9E9A, 0x32B8,\n    0x9E9B, 0x9E9B, 0x32B7, 0x9E9C, 0x9E9C, 0x336B, 0x9E9D, 0x9E9D, 0x16B5,\n    0x9E9E, 0x9E9E, 0x3933, 0x9E9F, 0x9E9F, 0x171D, 0x9EA0, 0x9EA0, 0x34C3,\n    0x9EA1, 0x9EA1, 0x34FD, 0x9EA2, 0x9EA2, 0x3934, 0x9EA4, 0x9EA4, 0x354A,\n    0x9EA5, 0x9EA5, 0x0BE5, 0x9EA6, 0x9EA6, 0x4944, 0x9EA7, 0x9EA7, 0x287C,\n    0x9EA8, 0x9EA8, 0x3F75, 0x9EA9, 0x9EA9, 0x1285, 0x9EAA, 0x9EAA, 0x3936,\n    0x9EAB, 0x9EAB, 0x3E92, 0x9EAC, 0x9EAC, 0x43F4, 0x9EAD, 0x9EAD, 0x2D34,\n    0x9EAE, 0x9EAE, 0x2D33, 0x9EAF, 0x9EAF, 0x3937, 0x9EB0, 0x9EB0, 0x2F04,\n    0x9EB1, 0x9EB1, 0x47D4, 0x9EB4, 0x9EB4, 0x1608, 0x9EB5, 0x9EB5, 0x1662,\n    0x9EB6, 0x9EB6, 0x3405, 0x9EB7, 0x9EB7, 0x3542, 0x9EBB, 0x9EBB, 0x0BE6,\n    0x9EBC, 0x9EBC, 0x10FF, 0x9EBD, 0x9EBD, 0x47D5, 0x9EBE, 0x9EBE, 0x1286,\n    0x9EBF, 0x9EBF, 0x3D78, 0x9EC0, 0x9EC0, 0x31BE, 0x9EC1, 0x9EC1, 0x3939,\n    0x9EC2, 0x9EC2, 0x3471, 0x9EC3, 0x9EC3, 0x0DBB, 0x9EC4, 0x9EC4, 0x4514,\n    0x9EC6, 0x9EC6, 0x47D6, 0x9EC7, 0x9EC7, 0x4577, 0x9EC8, 0x9EC8, 0x2F05,\n    0x9ECC, 0x9ECC, 0x1751, 0x9ECD, 0x9ECD, 0x0DBC, 0x9ECE, 0x9ECE, 0x1287,\n    0x9ECF, 0x9ECF, 0x14C2, 0x9ED0, 0x9ED0, 0x3472, 0x9ED1, 0x9ED1, 0x0DBD,\n    0x9ED3, 0x9ED3, 0x2AFD, 0x9ED4, 0x9ED4, 0x13B1, 0x9ED5, 0x9ED6, 0x2D35,\n    0x9ED8, 0x9ED8, 0x13B0, 0x9EDA, 0x9EDA, 0x2F06, 0x9EDB, 0x9EDB, 0x14C6,\n    0x9EDC, 0x9EDD, 0x14C4, 0x9EDE, 0x9EDE, 0x14C3, 0x9EDF, 0x9EDF, 0x306F,\n    0x9EE0, 0x9EE0, 0x1572, 0x9EE2, 0x9EE2, 0x47D8, 0x9EE4, 0x9EE4, 0x32BA,\n    0x9EE5, 0x9EE5, 0x32B9, 0x9EE6, 0x9EE6, 0x32BC, 0x9EE7, 0x9EE7, 0x32BB,\n    0x9EE8, 0x9EE8, 0x1663, 0x9EEB, 0x9EEB, 0x336C, 0x9EED, 0x9EED, 0x336E,\n    0x9EEE, 0x9EEE, 0x336D, 0x9EEF, 0x9EEF, 0x16B6, 0x9EF0, 0x9EF0, 0x3406,\n    0x9EF1, 0x9EF1, 0x47D9, 0x9EF2, 0x9EF3, 0x3473, 0x9EF4, 0x9EF4, 0x171E,\n    0x9EF5, 0x9EF5, 0x34FE, 0x9EF6, 0x9EF6, 0x3518, 0x9EF7, 0x9EF7, 0x1762,\n    0x9EF8, 0x9EF8, 0x47DA, 0x9EF9, 0x9EF9, 0x2360, 0x9EFA, 0x9EFA, 0x2D37,\n    0x9EFB, 0x9EFB, 0x2F07, 0x9EFC, 0x9EFC, 0x31BF, 0x9EFD, 0x9EFD, 0x2612,\n    0x9EFE, 0x9EFE, 0x47CE, 0x9EFF, 0x9EFF, 0x2F08, 0x9F00, 0x9F00, 0x3071,\n    0x9F01, 0x9F01, 0x3070, 0x9F02, 0x9F02, 0x3940, 0x9F06, 0x9F06, 0x3475,\n    0x9F07, 0x9F07, 0x173F, 0x9F08, 0x9F08, 0x3941, 0x9F09, 0x9F09, 0x34FF,\n    0x9F0A, 0x9F0A, 0x3519, 0x9F0E, 0x9F0E, 0x0F7B, 0x9F0F, 0x9F10, 0x2AFE,\n    0x9F12, 0x9F12, 0x2D38, 0x9F13, 0x9F13, 0x0F7C, 0x9F15, 0x9F15, 0x1573,\n    0x9F16, 0x9F16, 0x3072, 0x9F17, 0x9F17, 0x3945, 0x9F18, 0x9F18, 0x3370,\n    0x9F19, 0x9F19, 0x16B7, 0x9F1A, 0x9F1A, 0x3371, 0x9F1B, 0x9F1B, 0x336F,\n    0x9F1C, 0x9F1C, 0x3476, 0x9F1E, 0x9F1E, 0x34C4, 0x9F20, 0x9F20, 0x0F7D,\n    0x9F22, 0x9F22, 0x2F0B, 0x9F23, 0x9F23, 0x2F0A, 0x9F24, 0x9F24, 0x2F09,\n    0x9F25, 0x9F25, 0x3073, 0x9F26, 0x9F26, 0x3F90, 0x9F27, 0x9F27, 0x4620,\n    0x9F28, 0x9F28, 0x3077, 0x9F29, 0x9F29, 0x3076, 0x9F2A, 0x9F2A, 0x3075,\n    0x9F2B, 0x9F2B, 0x3074, 0x9F2C, 0x9F2C, 0x1574, 0x9F2D, 0x9F2D, 0x31C0,\n    0x9F2E, 0x9F2E, 0x32BE, 0x9F2F, 0x9F2F, 0x1664, 0x9F30, 0x9F30, 0x32BD,\n    0x9F31, 0x9F31, 0x3372, 0x9F32, 0x9F32, 0x3409, 0x9F33, 0x9F33, 0x3408,\n    0x9F34, 0x9F34, 0x16F2, 0x9F35, 0x9F35, 0x3407, 0x9F36, 0x9F36, 0x3479,\n    0x9F37, 0x9F37, 0x3478, 0x9F38, 0x9F38, 0x3477, 0x9F39, 0x9F39, 0x3947,\n    0x9F3B, 0x9F3B, 0x1100, 0x9F3D, 0x9F3D, 0x2D39, 0x9F3E, 0x9F3E, 0x14C7,\n    0x9F40, 0x9F41, 0x31C1, 0x9F42, 0x9F42, 0x340A, 0x9F43, 0x9F43, 0x347A,\n    0x9F44, 0x9F44, 0x47DB, 0x9F45, 0x9F45, 0x394A, 0x9F46, 0x9F46, 0x34C5,\n    0x9F47, 0x9F47, 0x3500, 0x9F48, 0x9F48, 0x3532, 0x9F49, 0x9F49, 0x354C,\n    0x9F4A, 0x9F4A, 0x1101, 0x9F4B, 0x9F4B, 0x14C8, 0x9F4C, 0x9F4C, 0x3078,\n    0x9F4D, 0x9F4D, 0x31C3, 0x9F4E, 0x9F4E, 0x3373, 0x9F4F, 0x9F4F, 0x347B,\n    0x9F50, 0x9F50, 0x4943, 0x9F52, 0x9F52, 0x1289, 0x9F53, 0x9F53, 0x3F80,\n    0x9F54, 0x9F54, 0x2F0C, 0x9F55, 0x9F55, 0x3079, 0x9F56, 0x9F58, 0x31C4,\n    0x9F59, 0x9F59, 0x32C3, 0x9F5A, 0x9F5A, 0x3F23, 0x9F5B, 0x9F5B, 0x32BF,\n    0x9F5C, 0x9F5C, 0x16B8, 0x9F5D, 0x9F5D, 0x32C2, 0x9F5E, 0x9F5E, 0x32C1,\n    0x9F5F, 0x9F5F, 0x1665, 0x9F60, 0x9F60, 0x32C0, 0x9F61, 0x9F61, 0x1667,\n    0x9F62, 0x9F62, 0x394F, 0x9F63, 0x9F63, 0x1666, 0x9F64, 0x9F64, 0x3375,\n    0x9F65, 0x9F65, 0x3374, 0x9F66, 0x9F67, 0x16B9, 0x9F69, 0x9F69, 0x3950,\n    0x9F6A, 0x9F6A, 0x16F4, 0x9F6B, 0x9F6B, 0x340B, 0x9F6C, 0x9F6C, 0x16F3,\n    0x9F6E, 0x9F6F, 0x347E, 0x9F70, 0x9F70, 0x347D, 0x9F71, 0x9F71, 0x347C,\n    0x9F72, 0x9F72, 0x1741, 0x9F74, 0x9F76, 0x34C6, 0x9F77, 0x9F77, 0x1740,\n    0x9F78, 0x9F78, 0x3501, 0x9F79, 0x9F79, 0x3504, 0x9F7A, 0x9F7A, 0x3503,\n    0x9F7B, 0x9F7B, 0x3502, 0x9F7E, 0x9F7E, 0x354B, 0x9F7F, 0x9F7F, 0x4680,\n    0x9F8D, 0x9F8D, 0x13B2, 0x9F8E, 0x9F8E, 0x3952, 0x9F90, 0x9F90, 0x157C,\n    0x9F91, 0x9F91, 0x32C4, 0x9F92, 0x9F92, 0x3376, 0x9F94, 0x9F94, 0x16F5,\n    0x9F95, 0x9F95, 0x340C, 0x9F98, 0x9F98, 0x354D, 0x9F99, 0x9F99, 0x4587,\n    0x9F9C, 0x9F9C, 0x13B3, 0x9F9F, 0x9F9F, 0x4646, 0x9FA0, 0x9FA0, 0x2F0D,\n    0x9FA2, 0x9FA2, 0x340D, 0x9FA4, 0x9FA4, 0x351A, 0x9FA5, 0x9FA5, 0x3F70,\n    0xE000, 0xE000, 0x400B, 0xE002, 0xE003, 0x400D, 0xE009, 0xE00A, 0x4014,\n    0xE00C, 0xE00C, 0x4017, 0xE00E, 0xE00E, 0x4019, 0xE012, 0xE016, 0x401D,\n    0xE018, 0xE018, 0x4023, 0xE01A, 0xE01E, 0x4025, 0xE020, 0xE020, 0x402B,\n    0xE022, 0xE023, 0x402D, 0xE025, 0xE025, 0x4030, 0xE02D, 0xE02E, 0x4038,\n    0xE030, 0xE030, 0x403B, 0xE032, 0xE038, 0x403D, 0xE03B, 0xE03C, 0x4046,\n    0xE045, 0xE045, 0x4050, 0xE04C, 0xE04C, 0x4057, 0xE05A, 0xE05A, 0x4065,\n    0xE05C, 0xE05C, 0x4067, 0xE05F, 0xE061, 0x406A, 0xE064, 0xE064, 0x406F,\n    0xE066, 0xE066, 0x4071, 0xE06C, 0xE06C, 0x4077, 0xE071, 0xE071, 0x407C,\n    0xE074, 0xE075, 0x407F, 0xE078, 0xE078, 0x4083, 0xE07D, 0xE07D, 0x4088,\n    0xE087, 0xE087, 0x4092, 0xE089, 0xE08A, 0x4094, 0xE08C, 0xE08C, 0x4097,\n    0xE093, 0xE094, 0x409E, 0xE099, 0xE09A, 0x40A4, 0xE09C, 0xE09E, 0x40A7,\n    0xE0A6, 0xE0A7, 0x40B1, 0xE0A9, 0xE0A9, 0x40B4, 0xE0AB, 0xE0AB, 0x40B6,\n    0xE0AE, 0xE0AE, 0x40B9, 0xE0BA, 0xE0BA, 0x40C5, 0xE0BC, 0xE0BC, 0x40C7,\n    0xE0BE, 0xE0BE, 0x40C9, 0xE0C3, 0xE0C3, 0x40CE, 0xE0C5, 0xE0C5, 0x40D0,\n    0xE0C7, 0xE0C8, 0x40D2, 0xE0CA, 0xE0CA, 0x40D5, 0xE0D0, 0xE0D0, 0x40DB,\n    0xE0D4, 0xE0D5, 0x40DF, 0xE0DC, 0xE0DC, 0x40E7, 0xE0DF, 0xE0DF, 0x40EA,\n    0xE0E2, 0xE0E5, 0x40ED, 0xE0E7, 0xE0E9, 0x40F2, 0xE0EB, 0xE0EC, 0x40F6,\n    0xE0EE, 0xE0EE, 0x40F9, 0xE0F2, 0xE0F2, 0x40FD, 0xE0F8, 0xE0F9, 0x4103,\n    0xE0FB, 0xE0FB, 0x4105, 0xE0FD, 0xE0FD, 0x4107, 0xE103, 0xE103, 0x410D,\n    0xE106, 0xE106, 0x4110, 0xE109, 0xE10B, 0x4112, 0xE110, 0xE110, 0x4119,\n    0xE114, 0xE115, 0x411D, 0xE11C, 0xE11D, 0x4125, 0xE121, 0xE121, 0x412A,\n    0xE126, 0xE128, 0x412F, 0xE130, 0xE131, 0x4139, 0xE136, 0xE136, 0x413F,\n    0xE139, 0xE139, 0x4142, 0xE141, 0xE142, 0x414A, 0xE145, 0xE145, 0x414D,\n    0xE147, 0xE148, 0x414F, 0xE14A, 0xE14A, 0x4151, 0xE14D, 0xE14D, 0x4153,\n    0xE150, 0xE150, 0x4156, 0xE154, 0xE157, 0x415A, 0xE159, 0xE15A, 0x415F,\n    0xE15D, 0xE15D, 0x494F, 0xE162, 0xE162, 0x4167, 0xE168, 0xE16A, 0x416D,\n    0xE171, 0xE172, 0x4175, 0xE175, 0xE175, 0x4179, 0xE178, 0xE179, 0x417C,\n    0xE17B, 0xE17C, 0x417F, 0xE17F, 0xE180, 0x4183, 0xE185, 0xE185, 0x4189,\n    0xE187, 0xE187, 0x418B, 0xE189, 0xE189, 0x418D, 0xE18B, 0xE18B, 0x418F,\n    0xE18F, 0xE190, 0x4193, 0xE193, 0xE193, 0x4196, 0xE195, 0xE195, 0x4953,\n    0xE196, 0xE196, 0x4198, 0xE19F, 0xE1A0, 0x41A1, 0xE1A4, 0xE1A4, 0x4954,\n    0xE1A6, 0xE1A6, 0x41A8, 0xE1AA, 0xE1AA, 0x41AC, 0xE1AE, 0xE1AE, 0x41B0,\n    0xE1B0, 0xE1B1, 0x41B2, 0xE1B3, 0xE1B4, 0x41B5, 0xE1B6, 0xE1B6, 0x41B8,\n    0xE1B8, 0xE1B8, 0x41BA, 0xE1BB, 0xE1BB, 0x4955, 0xE1BC, 0xE1BF, 0x41BD,\n    0xE1C1, 0xE1C1, 0x41C2, 0xE1C4, 0xE1C5, 0x41C5, 0xE1C8, 0xE1C8, 0x41C8,\n    0xE1CC, 0xE1CD, 0x41CC, 0xE1D4, 0xE1D5, 0x41D4, 0xE1D7, 0xE1D7, 0x41D7,\n    0xE1DA, 0xE1DA, 0x41DA, 0xE1DD, 0xE1DD, 0x41DD, 0xE1E2, 0xE1E2, 0x41E1,\n    0xE1E6, 0xE1E6, 0x41E5, 0xE1EB, 0xE1EB, 0x41EA, 0xE1EF, 0xE1F0, 0x41EE,\n    0xE1F2, 0xE1F2, 0x41F1, 0xE1F7, 0xE1F7, 0x41F6, 0xE1FA, 0xE1FA, 0x41F9,\n    0xE1FE, 0xE1FE, 0x41FD, 0xE200, 0xE200, 0x41FF, 0xE201, 0xE201, 0x4958,\n    0xE202, 0xE202, 0x4201, 0xE205, 0xE205, 0x4204, 0xE207, 0xE207, 0x4206,\n    0xE20A, 0xE20C, 0x4209, 0xE210, 0xE210, 0x420F, 0xE212, 0xE216, 0x4211,\n    0xE219, 0xE219, 0x4218, 0xE21B, 0xE21C, 0x421A, 0xE21F, 0xE221, 0x421E,\n    0xE226, 0xE228, 0x4225, 0xE22A, 0xE22A, 0x4229, 0xE22F, 0xE22F, 0x422E,\n    0xE231, 0xE231, 0x4230, 0xE233, 0xE233, 0x4232, 0xE237, 0xE237, 0x4236,\n    0xE23B, 0xE23B, 0x423A, 0xE23D, 0xE23E, 0x423C, 0xE245, 0xE245, 0x4244,\n    0xE248, 0xE248, 0x4247, 0xE24A, 0xE24F, 0x4249, 0xE251, 0xE254, 0x4250,\n    0xE261, 0xE261, 0x4260, 0xE268, 0xE268, 0x4266, 0xE26B, 0xE26B, 0x4269,\n    0xE26D, 0xE26F, 0x426B, 0xE271, 0xE271, 0x426F, 0xE27A, 0xE27A, 0x4278,\n    0xE27D, 0xE27D, 0x427B, 0xE282, 0xE282, 0x4280, 0xE288, 0xE289, 0x4286,\n    0xE28B, 0xE28B, 0x4289, 0xE290, 0xE291, 0x428E, 0xE294, 0xE296, 0x4292,\n    0xE299, 0xE29B, 0x4297, 0xE29F, 0xE29F, 0x429D, 0xE2A1, 0xE2A1, 0x495B,\n    0xE2A4, 0xE2A4, 0x42A1, 0xE2A6, 0xE2A6, 0x42A3, 0xE2B2, 0xE2B5, 0x42AE,\n    0xE2B7, 0xE2B8, 0x42B3, 0xE2BA, 0xE2BA, 0x42B6, 0xE2BE, 0xE2BF, 0x42B9,\n    0xE2C1, 0xE2C1, 0x42BC, 0xE2C7, 0xE2C7, 0x42C2, 0xE2C9, 0xE2C9, 0x42C4,\n    0xE2D4, 0xE2D4, 0x42CF, 0xE2D8, 0xE2D9, 0x42D3, 0xE2DE, 0xE2DE, 0x42D9,\n    0xE2E0, 0xE2E2, 0x42DB, 0xE2E7, 0xE2E7, 0x42E2, 0xE2E9, 0xE2E9, 0x42E4,\n    0xE2EB, 0xE2ED, 0x42E6, 0xE2F0, 0xE2F1, 0x495D, 0xE2F8, 0xE2F8, 0x42F1,\n    0xE2FC, 0xE2FC, 0x42F5, 0xE2FF, 0xE2FF, 0x495F, 0xE300, 0xE300, 0x4960,\n    0xE301, 0xE301, 0x42F8, 0xE306, 0xE306, 0x42FD, 0xE308, 0xE308, 0x42FF,\n    0xE30C, 0xE30C, 0x4303, 0xE30F, 0xE30F, 0x4306, 0xE311, 0xE311, 0x372B,\n    0xE313, 0xE313, 0x372D, 0xE315, 0xE315, 0x372F, 0xE318, 0xE318, 0x3731,\n    0xE31B, 0xE31C, 0x3734, 0xE31F, 0xE31F, 0x3738, 0xE325, 0xE325, 0x373E,\n    0xE32C, 0xE32C, 0x3745, 0xE330, 0xE331, 0x3749, 0xE335, 0xE336, 0x374E,\n    0xE33B, 0xE33B, 0x3754, 0xE33D, 0xE33D, 0x469A, 0xE342, 0xE342, 0x375A,\n    0xE345, 0xE345, 0x375D, 0xE348, 0xE348, 0x375F, 0xE352, 0xE352, 0x3768,\n    0xE354, 0xE354, 0x376A, 0xE35B, 0xE35C, 0x3770, 0xE360, 0xE360, 0x3775,\n    0xE362, 0xE362, 0x3777, 0xE364, 0xE365, 0x3779, 0xE36F, 0xE36F, 0x3784,\n    0xE372, 0xE372, 0x3787, 0xE374, 0xE375, 0x3789, 0xE377, 0xE377, 0x378C,\n    0xE379, 0xE379, 0x378D, 0xE37B, 0xE37B, 0x378F, 0xE381, 0xE382, 0x3795,\n    0xE386, 0xE386, 0x379A, 0xE388, 0xE38A, 0x379C, 0xE38D, 0xE38D, 0x37A1,\n    0xE391, 0xE391, 0x37A5, 0xE393, 0xE393, 0x37A7, 0xE394, 0xE394, 0x46A0,\n    0xE396, 0xE396, 0x37A9, 0xE398, 0xE398, 0x37AB, 0xE39A, 0xE39B, 0x37AD,\n    0xE39E, 0xE39E, 0x46A1, 0xE39F, 0xE3A0, 0x37B1, 0xE3A2, 0xE3A2, 0x37B4,\n    0xE3A5, 0xE3A5, 0x46A2, 0xE3A6, 0xE3A9, 0x37B8, 0xE3AC, 0xE3AC, 0x37BE,\n    0xE3B1, 0xE3B2, 0x37C3, 0xE3B4, 0xE3B5, 0x37C6, 0xE3B9, 0xE3BD, 0x37CB,\n    0xE3C3, 0xE3C3, 0x37D5, 0xE3C8, 0xE3C8, 0x37D9, 0xE3CC, 0xE3CC, 0x37DD,\n    0xE3CD, 0xE3CD, 0x46A4, 0xE3CF, 0xE3CF, 0x37DF, 0xE3D5, 0xE3D5, 0x46A5,\n    0xE3D8, 0xE3DA, 0x37E7, 0xE3E1, 0xE3E1, 0x37F0, 0xE3E3, 0xE3E3, 0x37F2,\n    0xE3E7, 0xE3E7, 0x46A6, 0xE3ED, 0xE3EE, 0x37FC, 0xE3F0, 0xE3F0, 0x37FF,\n    0xE3F2, 0xE3F4, 0x3801, 0xE3F8, 0xE3F8, 0x3807, 0xE3FA, 0xE3FA, 0x3809,\n    0xE3FD, 0xE3FD, 0x380C, 0xE3FF, 0xE3FF, 0x380E, 0xE409, 0xE40B, 0x3818,\n    0xE414, 0xE414, 0x3821, 0xE41B, 0xE41B, 0x3828, 0xE41D, 0xE41E, 0x382A,\n    0xE423, 0xE423, 0x3830, 0xE425, 0xE425, 0x3832, 0xE426, 0xE426, 0x46AB,\n    0xE428, 0xE428, 0x3834, 0xE42C, 0xE42D, 0x3838, 0xE432, 0xE432, 0x383E,\n    0xE436, 0xE436, 0x3842, 0xE43A, 0xE43C, 0x3846, 0xE43E, 0xE43E, 0x384A,\n    0xE440, 0xE441, 0x384C, 0xE444, 0xE444, 0x3850, 0xE448, 0xE448, 0x46AD,\n    0xE44C, 0xE44E, 0x3857, 0xE450, 0xE451, 0x385B, 0xE459, 0xE45A, 0x3864,\n    0xE45D, 0xE45E, 0x3868, 0xE461, 0xE463, 0x386C, 0xE465, 0xE465, 0x3870,\n    0xE467, 0xE469, 0x46AF, 0xE46A, 0xE46A, 0x3873, 0xE46C, 0xE46C, 0x3875,\n    0xE46E, 0xE46F, 0x3877, 0xE471, 0xE472, 0x387A, 0xE474, 0xE474, 0x387D,\n    0xE476, 0xE476, 0x387F, 0xE47E, 0xE47F, 0x3886, 0xE484, 0xE484, 0x388C,\n    0xE486, 0xE48A, 0x388D, 0xE48D, 0xE48E, 0x3894, 0xE491, 0xE492, 0x3897,\n    0xE495, 0xE497, 0x389B, 0xE4A1, 0xE4A1, 0x46B4, 0xE4A2, 0xE4A4, 0x38A7,\n    0xE4AB, 0xE4AB, 0x38B0, 0xE4AF, 0xE4AF, 0x38B4, 0xE4B3, 0xE4BA, 0x38B8,\n    0xE4C1, 0xE4C1, 0x38C6, 0xE4C6, 0xE4C6, 0x38CB, 0xE4C9, 0xE4C9, 0x38CE,\n    0xE4CD, 0xE4CE, 0x38D2, 0xE4D6, 0xE4D6, 0x38DB, 0xE4D9, 0xE4D9, 0x38DE,\n    0xE4DC, 0xE4DD, 0x38E1, 0xE4E4, 0xE4E4, 0x38E9, 0xE4E6, 0xE4E8, 0x38EB,\n    0xE4EE, 0xE4EF, 0x38F3, 0xE4F6, 0xE4F6, 0x38FB, 0xE4F8, 0xE4F9, 0x38FD,\n    0xE4FF, 0xE4FF, 0x3904, 0xE501, 0xE502, 0x3906, 0xE505, 0xE505, 0x390A,\n    0xE50A, 0xE50A, 0x390F, 0xE50D, 0xE50D, 0x46B5, 0xE50F, 0xE50F, 0x3913,\n    0xE512, 0xE512, 0x3916, 0xE514, 0xE514, 0x3918, 0xE516, 0xE516, 0x46B6,\n    0xE51A, 0xE51A, 0x391D, 0xE51C, 0xE521, 0x391F, 0xE524, 0xE524, 0x3927,\n    0xE528, 0xE528, 0x46B8, 0xE529, 0xE52C, 0x392A, 0xE52E, 0xE52F, 0x392F,\n    0xE537, 0xE537, 0x3938, 0xE53E, 0xE53E, 0x393F, 0xE543, 0xE543, 0x3944,\n    0xE54B, 0xE54B, 0x394C, 0xE554, 0xE555, 0x3955, 0xE557, 0xE559, 0x3958,\n    0xE55B, 0xE55C, 0x395C, 0xE55E, 0xE55F, 0x395F, 0xE562, 0xE562, 0x3963,\n    0xE566, 0xE567, 0x3967, 0xE56D, 0xE56E, 0x396E, 0xE570, 0xE570, 0x3971,\n    0xE572, 0xE573, 0x3973, 0xE575, 0xE577, 0x3976, 0xE579, 0xE57A, 0x397A,\n    0xE57C, 0xE57E, 0x397D, 0xE580, 0xE580, 0x3981, 0xE582, 0xE586, 0x3983,\n    0xE588, 0xE588, 0x3989, 0xE58B, 0xE590, 0x398C, 0xE592, 0xE594, 0x3993,\n    0xE59A, 0xE59A, 0x399B, 0xE59D, 0xE5A1, 0x399E, 0xE5A4, 0xE5A4, 0x39A5,\n    0xE5A6, 0xE5A8, 0x39A7, 0xE5AA, 0xE5AA, 0x39AB, 0xE5AF, 0xE5AF, 0x39B0,\n    0xE5B1, 0xE5B1, 0x39B2, 0xE5B2, 0xE5B2, 0x46BB, 0xE5B5, 0xE5B5, 0x39B6,\n    0xE5B7, 0xE5B8, 0x39B8, 0xE5BA, 0xE5BB, 0x39BB, 0xE5BE, 0xE5C0, 0x39BF,\n    0xE5C2, 0xE5C2, 0x39C3, 0xE5C8, 0xE5C9, 0x39C9, 0xE5D7, 0xE5D9, 0x39D4,\n    0xE5DB, 0xE5DC, 0x39D8, 0xE5DF, 0xE5DF, 0x39DC, 0xE5E1, 0xE5E3, 0x39DE,\n    0xE5E5, 0xE5E6, 0x39E2, 0xE5E9, 0xE5E9, 0x39E6, 0xE5EE, 0xE5F1, 0x39EB,\n    0xE5F3, 0xE5F3, 0x39F0, 0xE5FB, 0xE5FC, 0x39F8, 0xE600, 0xE600, 0x39FD,\n    0xE602, 0xE602, 0x39FF, 0xE604, 0xE604, 0x3A01, 0xE60F, 0xE612, 0x3A0B,\n    0xE619, 0xE61C, 0x3A14, 0xE621, 0xE621, 0x3A1C, 0xE623, 0xE624, 0x3A1E,\n    0xE627, 0xE627, 0x3A22, 0xE62B, 0xE62B, 0x3A26, 0xE632, 0xE634, 0x3A2D,\n    0xE637, 0xE638, 0x3A32, 0xE63A, 0xE63A, 0x3A35, 0xE63C, 0xE63C, 0x3A37,\n    0xE63F, 0xE642, 0x3A3A, 0xE645, 0xE646, 0x3A40, 0xE648, 0xE648, 0x3A43,\n    0xE64B, 0xE64B, 0x3A45, 0xE64E, 0xE64F, 0x3A48, 0xE652, 0xE655, 0x3A4C,\n    0xE657, 0xE659, 0x3A51, 0xE65D, 0xE660, 0x3A57, 0xE662, 0xE663, 0x3A5C,\n    0xE665, 0xE668, 0x3A5F, 0xE66A, 0xE66A, 0x46BF, 0xE66E, 0xE66F, 0x3A67,\n    0xE671, 0xE671, 0x3A6A, 0xE676, 0xE679, 0x3A6F, 0xE67B, 0xE67D, 0x3A74,\n    0xE67F, 0xE680, 0x3A78, 0xE683, 0xE688, 0x3A7B, 0xE68A, 0xE68C, 0x3A82,\n    0xE68E, 0xE690, 0x3A86, 0xE692, 0xE692, 0x3A8A, 0xE696, 0xE697, 0x3A8E,\n    0xE699, 0xE69A, 0x3A91, 0xE69C, 0xE69C, 0x3A94, 0xE69E, 0xE69F, 0x3A96,\n    0xE6A1, 0xE6A2, 0x3A99, 0xE6A6, 0xE6A6, 0x3A9D, 0xE6AC, 0xE6AD, 0x3AA2,\n    0xE6B2, 0xE6B2, 0x3AA8, 0xE6B9, 0xE6BA, 0x3AAF, 0xE6BD, 0xE6BE, 0x3AB3,\n    0xE6C0, 0xE6C1, 0x3AB6, 0xE6C5, 0xE6C5, 0x46C4, 0xE6C7, 0xE6C7, 0x3ABC,\n    0xE6CA, 0xE6CA, 0x3ABF, 0xE6D1, 0xE6D2, 0x3AC6, 0xE6D7, 0xE6D8, 0x3ACC,\n    0xE6DA, 0xE6DB, 0x3ACF, 0xE6DD, 0xE6E1, 0x3AD2, 0xE6E4, 0xE6E6, 0x3AD9,\n    0xE6EE, 0xE6EE, 0x3AE3, 0xE6F2, 0xE6F3, 0x3AE7, 0xE6F7, 0xE6F7, 0x3AEC,\n    0xE6FA, 0xE6FC, 0x3AEF, 0xE6FF, 0xE6FF, 0x3AF4, 0xE701, 0xE702, 0x3AF6,\n    0xE706, 0xE707, 0x3AFB, 0xE709, 0xE70A, 0x3AFE, 0xE70C, 0xE70C, 0x3B01,\n    0xE710, 0xE711, 0x3B05, 0xE713, 0xE713, 0x3B08, 0xE717, 0xE718, 0x3B0C,\n    0xE71A, 0xE71B, 0x3B0F, 0xE71D, 0xE71D, 0x3B12, 0xE724, 0xE725, 0x3B19,\n    0xE72B, 0xE72B, 0x3B20, 0xE72F, 0xE72F, 0x3B24, 0xE733, 0xE737, 0x3B28,\n    0xE73C, 0xE73D, 0x3B31, 0xE740, 0xE742, 0x3B35, 0xE744, 0xE744, 0x3B39,\n    0xE747, 0xE747, 0x3B3C, 0xE74D, 0xE74F, 0x3B42, 0xE751, 0xE752, 0x3B46,\n    0xE75B, 0xE75D, 0x3B50, 0xE75F, 0xE75F, 0x3B54, 0xE761, 0xE762, 0x3B56,\n    0xE764, 0xE765, 0x3B59, 0xE767, 0xE768, 0x3B5C, 0xE769, 0xE769, 0x46C7,\n    0xE76C, 0xE76E, 0x3B60, 0xE770, 0xE770, 0x3B64, 0xE775, 0xE775, 0x3B69,\n    0xE777, 0xE778, 0x3B6A, 0xE77A, 0xE77A, 0x3B6D, 0xE77C, 0xE77D, 0x3B6F,\n    0xE784, 0xE784, 0x3B77, 0xE786, 0xE786, 0x3B79, 0xE789, 0xE789, 0x3B7C,\n    0xE78B, 0xE78B, 0x3B7E, 0xE78D, 0xE78D, 0x3B80, 0xE790, 0xE790, 0x3B83,\n    0xE792, 0xE792, 0x3B85, 0xE794, 0xE794, 0x3B87, 0xE796, 0xE797, 0x3B89,\n    0xE799, 0xE799, 0x3B8C, 0xE7A2, 0xE7A2, 0x3B95, 0xE7A4, 0xE7A9, 0x3B97,\n    0xE7B1, 0xE7B1, 0x3BA4, 0xE7B4, 0xE7B4, 0x3BA7, 0xE7B8, 0xE7B8, 0x3BAB,\n    0xE7BC, 0xE7BC, 0x3BAF, 0xE7C4, 0xE7C4, 0x3BB6, 0xE7CA, 0xE7CA, 0x3BBC,\n    0xE7CE, 0xE7CE, 0x3BC0, 0xE7D1, 0xE7D1, 0x3BC3, 0xE7D8, 0xE7D8, 0x3BCA,\n    0xE7DA, 0xE7DA, 0x3BCC, 0xE7DC, 0xE7DD, 0x3BCE, 0xE7E4, 0xE7E4, 0x3BD6,\n    0xE7E7, 0xE7E9, 0x3BD9, 0xE7EB, 0xE7EB, 0x3BDD, 0xE7ED, 0xE7EF, 0x3BDF,\n    0xE7F1, 0xE7F3, 0x3BE3, 0xE7F8, 0xE7F8, 0x3BEA, 0xE7FB, 0xE7FC, 0x3BED,\n    0xE7FF, 0xE7FF, 0x3BF1, 0xE800, 0xE802, 0x3BF2, 0xE808, 0xE808, 0x3BFA,\n    0xE80C, 0xE80C, 0x3BFE, 0xE80E, 0xE80F, 0x3C00, 0xE811, 0xE811, 0x3C03,\n    0xE813, 0xE813, 0x3C05, 0xE816, 0xE818, 0x3C08, 0xE81A, 0xE81A, 0x3C0C,\n    0xE821, 0xE821, 0x3C13, 0xE827, 0xE828, 0x3C19, 0xE82D, 0xE82D, 0x3C1F,\n    0xE82F, 0xE82F, 0x3C21, 0xE835, 0xE835, 0x3C27, 0xE837, 0xE838, 0x3C29,\n    0xE83A, 0xE83B, 0x3C2C, 0xE841, 0xE842, 0x3C33, 0xE84B, 0xE84B, 0x3C3D,\n    0xE84D, 0xE84E, 0x3C3F, 0xE851, 0xE851, 0x3C43, 0xE855, 0xE858, 0x3C47,\n    0xE85B, 0xE85D, 0x3C4D, 0xE860, 0xE862, 0x3C52, 0xE865, 0xE867, 0x3C57,\n    0xE869, 0xE86A, 0x3C5B, 0xE86C, 0xE86C, 0x3C5D, 0xE871, 0xE871, 0x3C62,\n    0xE878, 0xE878, 0x3C69, 0xE87D, 0xE87F, 0x3C6E, 0xE887, 0xE887, 0x3C78,\n    0xE88F, 0xE88F, 0x3C80, 0xE891, 0xE892, 0x3C82, 0xE894, 0xE895, 0x3C85,\n    0xE89A, 0xE89A, 0x3C8B, 0xE89D, 0xE89D, 0x3C8E, 0xE8A0, 0xE8A1, 0x3C91,\n    0xE8A3, 0xE8A7, 0x3C94, 0xE8A9, 0xE8AA, 0x3C9A, 0xE8AC, 0xE8B0, 0x3C9D,\n    0xE8B5, 0xE8B6, 0x3CA6, 0xE8B8, 0xE8B8, 0x3CA9, 0xE8BD, 0xE8C3, 0x3CAE,\n    0xE8C5, 0xE8C5, 0x3CB6, 0xE8C7, 0xE8C7, 0x3CB8, 0xE8CB, 0xE8CB, 0x3CBC,\n    0xE8CD, 0xE8CE, 0x3CBE, 0xE8D0, 0xE8D1, 0x3CC1, 0xE8D3, 0xE8D3, 0x3CC4,\n    0xE8D5, 0xE8D6, 0x3CC6, 0xE8D8, 0xE8DA, 0x3CC9, 0xE8DD, 0xE8DD, 0x3CCE,\n    0xE8DF, 0xE8E1, 0x3CD0, 0xE8E5, 0xE8E6, 0x3CD6, 0xE8E8, 0xE8EA, 0x3CD9,\n    0xE8ED, 0xE8ED, 0x3CDE, 0xE8F1, 0xE8F2, 0x3CE2, 0xE8F5, 0xE8F5, 0x3CE6,\n    0xE8FB, 0xE8FB, 0x3CEC, 0xE8FE, 0xE8FE, 0x3CEF, 0xE900, 0xE900, 0x3CF1,\n    0xE903, 0xE903, 0x3CF4, 0xE907, 0xE908, 0x3CF8, 0xE90C, 0xE90C, 0x3CFD,\n    0xE917, 0xE918, 0x3D08, 0xE91C, 0xE91C, 0x3D0D, 0xE91E, 0xE922, 0x3D0F,\n    0xE925, 0xE92C, 0x3D16, 0xE92E, 0xE92F, 0x3D1F, 0xE933, 0xE936, 0x3D24,\n    0xE938, 0xE938, 0x46CF, 0xE93A, 0xE93A, 0x3D2B, 0xE93C, 0xE93E, 0x3D2D,\n    0xE941, 0xE941, 0x3D32, 0xE944, 0xE945, 0x3D35, 0xE948, 0xE948, 0x3D39,\n    0xE94D, 0xE94D, 0x3D3E, 0xE950, 0xE950, 0x3D41, 0xE952, 0xE955, 0x3D43,\n    0xE957, 0xE958, 0x3D48, 0xE95A, 0xE95A, 0x3D4B, 0xE95C, 0xE95E, 0x3D4D,\n    0xE960, 0xE961, 0x3D51, 0xE964, 0xE964, 0x3D55, 0xE967, 0xE967, 0x3D58,\n    0xE968, 0xE968, 0x46D1, 0xE96E, 0xE96F, 0x46D5, 0xE973, 0xE973, 0x46DA,\n    0xE974, 0xE974, 0x3D5B, 0xE975, 0xE975, 0x46DB, 0xE977, 0xE978, 0x46DD,\n    0xE97A, 0xE97B, 0x46E0, 0xE97D, 0xE97D, 0x46E3, 0xE981, 0xE982, 0x46E6,\n    0xE987, 0xE987, 0x3D5D, 0xE98A, 0xE98A, 0x3D5E, 0xE98E, 0xE98E, 0x3D5F,\n    0xE991, 0xE991, 0x46EF, 0xE9B0, 0xE9B0, 0x43D4, 0xE9CB, 0xE9CB, 0x4719,\n    0xE9EF, 0xE9EF, 0x4734, 0xEA43, 0xEA43, 0x4779, 0xEAA9, 0xEAA9, 0x47CC,\n    0xEABF, 0xEAC1, 0x47DC, 0xEAC5, 0xEAC5, 0x47E0, 0xEAC9, 0xEACC, 0x47E2,\n    0xEACF, 0xEAD1, 0x47E8, 0xEAD3, 0xEAD4, 0x47EB, 0xEAD6, 0xEADA, 0x47EE,\n    0xEADC, 0xEADC, 0x47F3, 0xEADE, 0xEAE3, 0x47F4, 0xEAE7, 0xEAEC, 0x47FA,\n    0xEAEE, 0xEAEE, 0x4800, 0xEAF0, 0xEAF2, 0x4801, 0xEAF4, 0xEAF4, 0x43B0,\n    0xEAF5, 0xEAF6, 0x4804, 0xEAF8, 0xEAF8, 0x4807, 0xEAF9, 0xEAF9, 0x43B2,\n    0xEAFA, 0xEAFB, 0x4808, 0xEAFE, 0xEAFF, 0x480B, 0xEB00, 0xEB00, 0x480D,\n    0xEB02, 0xEB05, 0x480E, 0xEB08, 0xEB0F, 0x4813, 0xEB11, 0xEB12, 0x481B,\n    0xEB15, 0xEB15, 0x481E, 0xEB18, 0xEB1D, 0x4821, 0xEB1F, 0xEB21, 0x4827,\n    0xEB23, 0xEB23, 0x482A, 0xEB25, 0xEB25, 0x482B, 0xEB27, 0xEB27, 0x482C,\n    0xEB2A, 0xEB2A, 0x482D, 0xEB2C, 0xEB39, 0x482E, 0xEB3D, 0xEB3D, 0x3D9B,\n    0xEB3E, 0xEB3F, 0x483C, 0xEB41, 0xEB41, 0x3D9D, 0xEB43, 0xEB44, 0x483E,\n    0xEB46, 0xEB46, 0x3DA0, 0xEB4A, 0xEB4A, 0x4841, 0xEB4B, 0xEB4C, 0x3DA3,\n    0xEB4D, 0xEB4E, 0x4842, 0xEB4F, 0xEB50, 0x3DA5, 0xEB53, 0xEB53, 0x4844,\n    0xEB54, 0xEB54, 0x3DA9, 0xEB55, 0xEB56, 0x4845, 0xEB57, 0xEB57, 0x3DAA,\n    0xEB58, 0xEB59, 0x4847, 0xEB5A, 0xEB5B, 0x3DAB, 0xEB5D, 0xEB5D, 0x3DAE,\n    0xEB5F, 0xEB5F, 0x3DB0, 0xEB61, 0xEB61, 0x3DB2, 0xEB62, 0xEB63, 0x4849,\n    0xEB65, 0xEB65, 0x484C, 0xEB67, 0xEB67, 0x484D, 0xEB68, 0xEB69, 0x3DB4,\n    0xEB6B, 0xEB6B, 0x3DB7, 0xEB6D, 0xEB6D, 0x3DB9, 0xEB6F, 0xEB71, 0x484E,\n    0xEB73, 0xEB73, 0x4851, 0xEB74, 0xEB74, 0x3DBC, 0xEB76, 0xEB76, 0x43D0,\n    0xEB77, 0xEB77, 0x4853, 0xEB78, 0xEB78, 0x3DBD, 0xEB7A, 0xEB7A, 0x4854,\n    0xEB7E, 0xEB7F, 0x4856, 0xEB80, 0xEB81, 0x3DC1, 0xEB83, 0xEB84, 0x4858,\n    0xEB85, 0xEB85, 0x3DC4, 0xEB88, 0xEB88, 0x485A, 0xEB89, 0xEB89, 0x3DC6,\n    0xEB8A, 0xEB8A, 0x485B, 0xEB8C, 0xEB8E, 0x485C, 0xEB8F, 0xEB8F, 0x3DC8,\n    0xEB90, 0xEB90, 0x485F, 0xEB93, 0xEB93, 0x3DCB, 0xEB95, 0xEB95, 0x4860,\n    0xEB97, 0xEB97, 0x3DCE, 0xEB98, 0xEB9A, 0x4861, 0xEB9B, 0xEB9B, 0x3DCF,\n    0xEB9F, 0xEB9F, 0x4866, 0xEBA0, 0xEBA0, 0x3DD1, 0xEBA2, 0xEBA2, 0x4867,\n    0xEBA3, 0xEBA3, 0x3DD3, 0xEBA5, 0xEBA6, 0x4868, 0xEBA8, 0xEBA8, 0x3DD6,\n    0xEBAA, 0xEBAA, 0x486A, 0xEBAB, 0xEBAB, 0x3DD8, 0xEBAD, 0xEBAD, 0x3DDA,\n    0xEBAE, 0xEBAE, 0x486B, 0xEBAF, 0xEBAF, 0x3DDB, 0xEBB0, 0xEBB0, 0x486C,\n    0xEBB2, 0xEBB3, 0x486D, 0xEBB4, 0xEBB4, 0x3DDD, 0xEBB6, 0xEBB6, 0x3DDF,\n    0xEBB9, 0xEBB9, 0x3DE2, 0xEBBC, 0xEBBC, 0x3DE4, 0xEBBD, 0xEBBD, 0x4870,\n    0xEBBF, 0xEBBF, 0x3DE6, 0xEBC2, 0xEBC2, 0x3DE9, 0xEBC5, 0xEBC6, 0x4872,\n    0xEBC7, 0xEBC7, 0x3DEB, 0xEBC8, 0xEBC8, 0x4874, 0xEBCA, 0xEBCA, 0x4875,\n    0xEBCC, 0xEBCD, 0x3DEE, 0xEBCE, 0xEBCE, 0x4876, 0xEBD0, 0xEBD0, 0x4877,\n    0xEBD3, 0xEBD3, 0x4878, 0xEBD5, 0xEBD5, 0x4879, 0xEBD7, 0xEBD8, 0x3DF4,\n    0xEBDA, 0xEBDB, 0x487A, 0xEBDD, 0xEBDD, 0x3DF8, 0xEBDF, 0xEBDF, 0x487C,\n    0xEBE1, 0xEBE1, 0x487D, 0xEBE4, 0xEBE4, 0x487E, 0xEBE7, 0xEBE7, 0x3DFF,\n    0xEBE8, 0xEBE9, 0x487F, 0xEBEB, 0xEBEC, 0x4881, 0xEBEE, 0xEBEE, 0x3E02,\n    0xEBEF, 0xEBEF, 0x4883, 0xEBF1, 0xEBF1, 0x4884, 0xEBF2, 0xEBF2, 0x3E04,\n    0xEBF5, 0xEBF5, 0x4886, 0xEBF6, 0xEBF6, 0x3E06, 0xEBF9, 0xEBFB, 0x3E09,\n    0xEBFD, 0xEBFE, 0x3E0D, 0xEC05, 0xEC06, 0x3E14, 0xEC08, 0xEC09, 0x4888,\n    0xEC0C, 0xEC0C, 0x3E18, 0xEC0E, 0xEC10, 0x3E1A, 0xEC13, 0xEC13, 0x488B,\n    0xEC14, 0xEC14, 0x3E1F, 0xEC17, 0xEC18, 0x3E22, 0xEC19, 0xEC1C, 0x488C,\n    0xEC1D, 0xEC1D, 0x3E24, 0xEC20, 0xEC20, 0x4890, 0xEC22, 0xEC22, 0x3E28,\n    0xEC24, 0xEC24, 0x3E2A, 0xEC26, 0xEC26, 0x3E2C, 0xEC2A, 0xEC2A, 0x3E30,\n    0xEC2B, 0xEC2B, 0x4891, 0xEC2C, 0xEC2E, 0x3E31, 0xEC2F, 0xEC2F, 0x4892,\n    0xEC31, 0xEC31, 0x3E35, 0xEC32, 0xEC32, 0x4893, 0xEC35, 0xEC35, 0x3E38,\n    0xEC37, 0xEC37, 0x3E3A, 0xEC3B, 0xEC3C, 0x3E3E, 0xEC3F, 0xEC41, 0x4894,\n    0xEC42, 0xEC42, 0x3E42, 0xEC43, 0xEC43, 0x4897, 0xEC44, 0xEC44, 0x43E8,\n    0xEC45, 0xEC49, 0x4898, 0xEC4B, 0xEC4C, 0x489D, 0xEC4F, 0xEC4F, 0x48A0,\n    0xEC52, 0xEC52, 0x48A1, 0xEC54, 0xEC54, 0x48A2, 0xEC56, 0xEC58, 0x48A3,\n    0xEC5A, 0xEC5A, 0x48A6, 0xEC5C, 0xEC5D, 0x48A7, 0xEC5F, 0xEC60, 0x48A9,\n    0xEC62, 0xEC63, 0x48AC, 0xEC67, 0xEC67, 0x48AF, 0xEC68, 0xEC68, 0x3E4D,\n    0xEC69, 0xEC73, 0x48B0, 0xEC75, 0xEC76, 0x48BC, 0xEC79, 0xEC79, 0x48C0,\n    0xEC7B, 0xEC7B, 0x48C2, 0xEC7E, 0xEC7E, 0x48C3, 0xEC80, 0xEC80, 0x48C5,\n    0xEC84, 0xEC84, 0x48C8, 0xEC86, 0xEC86, 0x48CA, 0xEC8D, 0xEC8D, 0x48CC,\n    0xEC8E, 0xEC8E, 0x3E55, 0xEC91, 0xEC91, 0x48CE, 0xEC92, 0xEC92, 0x3E58,\n    0xEC93, 0xEC94, 0x48CF, 0xEC95, 0xEC95, 0x3E59, 0xEC96, 0xEC96, 0x48D1,\n    0xEC98, 0xEC98, 0x48D2, 0xEC99, 0xEC99, 0x3E5B, 0xEC9A, 0xEC9B, 0x48D3,\n    0xEC9D, 0xEC9D, 0x48D6, 0xEC9E, 0xEC9E, 0x3E5C, 0xECA0, 0xECA0, 0x48D7,\n    0xECA3, 0xECA4, 0x48D8, 0xECA7, 0xECA8, 0x48DA, 0xECAB, 0xECAB, 0x48DC,\n    0xECAD, 0xECAD, 0x48DD, 0xECAF, 0xECAF, 0x3E65, 0xECB4, 0xECB4, 0x48DF,\n    0xECB6, 0xECB6, 0x3E6B, 0xECB9, 0xECBB, 0x48E1, 0xECCF, 0xECCF, 0x3E80,\n    0xECD4, 0xECD4, 0x3E85, 0xECDB, 0xECDC, 0x3E8C, 0xECDE, 0xECDE, 0x48E4,\n    0xECDF, 0xECE1, 0x3E8F, 0xECE5, 0xECE5, 0x3E95, 0xECF0, 0xECF0, 0x3EA0,\n    0xECF2, 0xECF2, 0x3EA2, 0xECF5, 0xECF5, 0x3EA5, 0xECFC, 0xECFC, 0x3EAC,\n    0xED04, 0xED04, 0x48E7, 0xED07, 0xED07, 0x48E8, 0xED0A, 0xED0A, 0x48EA,\n    0xED0C, 0xED11, 0x48EB, 0xED13, 0xED13, 0x48F1, 0xED15, 0xED17, 0x48F2,\n    0xED18, 0xED18, 0x3EBA, 0xED1A, 0xED1A, 0x48F5, 0xED1C, 0xED1C, 0x48F6,\n    0xED1D, 0xED1D, 0x3EBD, 0xED1E, 0xED1E, 0x48F7, 0xED22, 0xED22, 0x48F8,\n    0xED24, 0xED25, 0x3EC2, 0xED26, 0xED27, 0x48F9, 0xED29, 0xED29, 0x3EC5,\n    0xED2A, 0xED2A, 0x48FB, 0xED2C, 0xED2C, 0x3EC7, 0xED2D, 0xED2D, 0x48FC,\n    0xED3B, 0xED3B, 0x3ECF, 0xED3D, 0xED3D, 0x4904, 0xED41, 0xED42, 0x4906,\n    0xED45, 0xED45, 0x4908, 0xED47, 0xED47, 0x3ED5, 0xED4A, 0xED4B, 0x4909,\n    0xED4D, 0xED4E, 0x490B, 0xED4F, 0xED4F, 0x3EDA, 0xED51, 0xED51, 0x490D,\n    0xED52, 0xED52, 0x3EDC, 0xED53, 0xED54, 0x490E, 0xED57, 0xED58, 0x4910,\n    0xED5F, 0xED5F, 0x3EE5, 0xED62, 0xED62, 0x3EE8, 0xED6B, 0xED6B, 0x3EF1,\n    0xED71, 0xED71, 0x4912, 0xED72, 0xED72, 0x3EF7, 0xED75, 0xED75, 0x4913,\n    0xED77, 0xED77, 0x4915, 0xED78, 0xED78, 0x3EFA, 0xED7A, 0xED7A, 0x4916,\n    0xED81, 0xED81, 0x4917, 0xED84, 0xED85, 0x3F04, 0xED86, 0xED86, 0x4918,\n    0xED88, 0xED88, 0x3F07, 0xED89, 0xED8A, 0x4919, 0xED8B, 0xED8B, 0x3F08,\n    0xED8E, 0xED8E, 0x3F0B, 0xED91, 0xED91, 0x3F0E, 0xEDA6, 0xEDA6, 0x491C,\n    0xEDC6, 0xEDC6, 0x3F41, 0xEDCF, 0xEDCF, 0x3F4A, 0xEDD1, 0xEDD1, 0x491E,\n    0xEDD7, 0xEDD7, 0x491F, 0xEDDA, 0xEDDA, 0x3F53, 0xEDDB, 0xEDDB, 0x4920,\n    0xEDDD, 0xEDDD, 0x4921, 0xEDE1, 0xEDE1, 0x3F58, 0xEDED, 0xEDED, 0x3F64,\n    0xEE08, 0xEE08, 0x3F7E, 0xEE11, 0xEE11, 0x3F87, 0xEE15, 0xEE15, 0x4925,\n    0xEE1B, 0xEE1B, 0x4926, 0xEE20, 0xEE20, 0x3F94, 0xEE22, 0xEE22, 0x4927,\n    0xEE2A, 0xEE2A, 0x3F9D, 0xEE30, 0xEE30, 0x4928, 0xEE31, 0xEE31, 0x3FA3,\n    0xEE34, 0xEE34, 0x3FA6, 0xEE48, 0xEE48, 0x4929, 0xEE56, 0xEE56, 0x492A,\n    0xEE5B, 0xEE5B, 0x492B, 0xEE5D, 0xEE5D, 0x3FCC, 0xEE60, 0xEE60, 0x492C,\n    0xEE64, 0xEE64, 0x3FD2, 0xEE6A, 0xEE6A, 0x3FD8, 0xEE76, 0xEE76, 0x3FE4,\n    0xEE7C, 0xEE7C, 0x3FEA, 0xEE7E, 0xEE7E, 0x492D, 0xEE91, 0xEE91, 0x3FFD,\n    0xEE9C, 0xEE9C, 0x492F, 0xEEA1, 0xEEA6, 0x4931, 0xEEA7, 0xEEA7, 0x43B4,\n    0xEEA8, 0xEEAA, 0x4937, 0xEEAC, 0xEEB1, 0x493A, 0xEEB4, 0xEEB4, 0x4942,\n    0xEEB7, 0xEEB7, 0x4945, 0xF303, 0xF318, 0x44C9, 0xF325, 0xF325, 0x496D,\n    0xF327, 0xF327, 0x496F, 0xF344, 0xF344, 0x498C, 0xF346, 0xF346, 0x498E,\n    0xF34A, 0xF34B, 0x499C, 0xF3A0, 0xF3A1, 0x4534, 0xF3AC, 0xF3AC, 0x453B,\n    0xF3F0, 0xF3F0, 0x4575, 0xF3F9, 0xF3FA, 0x457C, 0xF3FC, 0xF3FC, 0x457F,\n    0xF408, 0xF40B, 0x4589, 0xF43D, 0xF43D, 0x45B5, 0xF440, 0xF442, 0x430B,\n    0xF444, 0xF444, 0x430F, 0xF446, 0xF446, 0x4311, 0xF448, 0xF449, 0x4313,\n    0xF44B, 0xF44B, 0x4316, 0xF44D, 0xF44D, 0x4318, 0xF450, 0xF452, 0x431B,\n    0xF454, 0xF456, 0x431F, 0xF457, 0xF457, 0x45B7, 0xF45A, 0xF45A, 0x4325,\n    0xF45B, 0xF45B, 0x45B8, 0xF45C, 0xF45F, 0x4327, 0xF461, 0xF463, 0x432C,\n    0xF465, 0xF466, 0x4330, 0xF469, 0xF469, 0x4334, 0xF46C, 0xF46D, 0x4337,\n    0xF46E, 0xF46E, 0x45B9, 0xF46F, 0xF46F, 0x433A, 0xF474, 0xF474, 0x45BA,\n    0xF477, 0xF477, 0x45BB, 0xF478, 0xF478, 0x4343, 0xF479, 0xF479, 0x45BC,\n    0xF47B, 0xF47B, 0x45BD, 0xF47C, 0xF47E, 0x4347, 0xF480, 0xF481, 0x434B,\n    0xF483, 0xF483, 0x45BE, 0xF484, 0xF485, 0x434F, 0xF488, 0xF488, 0x4353,\n    0xF48B, 0xF48B, 0x4356, 0xF48D, 0xF490, 0x4358, 0xF491, 0xF491, 0x45BF,\n    0xF497, 0xF498, 0x4362, 0xF49B, 0xF49B, 0x4366, 0xF49E, 0xF49E, 0x4369,\n    0xF4A4, 0xF4A6, 0x436F, 0xF4A7, 0xF4A7, 0x45C1, 0xF4A9, 0xF4AA, 0x4374,\n    0xF4AD, 0xF4AD, 0x4378, 0xF4AF, 0xF4B0, 0x437A, 0xF4B2, 0xF4B2, 0x45C3,\n    0xF4B3, 0xF4B4, 0x437E, 0xF4B7, 0xF4B7, 0x4382, 0xF4BA, 0xF4C0, 0x4385,\n    0xF4C1, 0xF4C1, 0x45C4, 0xF4C3, 0xF4C5, 0x45C5, 0xF4C7, 0xF4CA, 0x45C9,\n    0xF4CC, 0xF4CF, 0x45CE, 0xF4D1, 0xF4D5, 0x45D2, 0xF4D7, 0xF4D7, 0x45D8,\n    0xF4D9, 0xF4DA, 0x45DA, 0xF4DB, 0xF4DC, 0x438C, 0xF4DD, 0xF4DE, 0x45DC,\n    0xF4DF, 0xF4DF, 0x438E, 0xF4E0, 0xF4E0, 0x45DE, 0xF4E2, 0xF4E2, 0x45DF,\n    0xF4E3, 0xF4E3, 0x4390, 0xF4E4, 0xF4E4, 0x45E0, 0xF4E5, 0xF4E5, 0x4391,\n    0xF4E6, 0xF4E6, 0x45E1, 0xF4E7, 0xF4E9, 0x4392, 0xF4EF, 0xF4EF, 0x45E5,\n    0xF4F2, 0xF4F2, 0x4397, 0xF4F3, 0xF4F3, 0x45E8, 0xF4F8, 0xF4F8, 0x45EB,\n    0xF4FC, 0xF4FC, 0x45EE, 0xF4FE, 0xF4FF, 0x45F0, 0xF500, 0xF501, 0x45F2,\n    0xF503, 0xF503, 0x45F4, 0xF505, 0xF505, 0x45F6, 0xF507, 0xF511, 0x45F8,\n    0xF513, 0xF516, 0x4604, 0xF518, 0xF51D, 0x4609, 0xF51F, 0xF526, 0x4610,\n    0xF52A, 0xF52A, 0x461B, 0xF533, 0xF534, 0x4624, 0xF53A, 0xF53B, 0x44E1,\n    0xF53D, 0xF53D, 0x44E4, 0xF54E, 0xF54E, 0x44F5, 0xF553, 0xF553, 0x44FA,\n    0xF556, 0xF556, 0x44FC, 0xF559, 0xF55A, 0x44FF, 0xF55E, 0xF55E, 0x4504,\n    0xF565, 0xF565, 0x450B, 0xF56B, 0xF56B, 0x4511, 0xF572, 0xF572, 0x4518,\n    0xF694, 0xF694, 0x467C, 0xF69E, 0xF69E, 0x4686, 0xF6AD, 0xF6AD, 0x4694,\n    0xF6B0, 0xF6B0, 0x4697, 0xF7E5, 0xF7E6, 0x36AF, 0xF7E8, 0xF7E8, 0x36B2,\n    0xF7EA, 0xF7EB, 0x36B4, 0xF7ED, 0xF7EE, 0x36B7, 0xFA0C, 0xFA0C, 0x0274,\n    0xFA0D, 0xFA0D, 0x2381, 0xFE30, 0xFE30, 0x006D, 0xFE31, 0xFE31, 0x007A,\n    0xFE33, 0xFE33, 0x35AF, 0xFE34, 0xFE34, 0x35B1, 0xFE35, 0xFE36, 0x0082,\n    0xFE37, 0xFE38, 0x0086, 0xFE39, 0xFE3A, 0x008A, 0xFE3B, 0xFE3C, 0x008E,\n    0xFE3D, 0xFE3E, 0x0092, 0xFE3F, 0xFE40, 0x0096, 0xFE41, 0xFE42, 0x009A,\n    0xFE43, 0xFE44, 0x009E, 0xFE49, 0xFE4A, 0x00C7, 0xFE4B, 0xFE4C, 0x00CB,\n    0xFE4D, 0xFE4E, 0x00C9, 0xFE4F, 0xFE4F, 0x35B2, 0xFE50, 0xFE50, 0x0070,\n    0xFE52, 0xFE52, 0x0072, 0xFE54, 0xFE57, 0x0074, 0xFE59, 0xFE5E, 0x00A0,\n    0xFE5F, 0xFE61, 0x00CD, 0xFE62, 0xFE66, 0x00DF, 0xFE69, 0xFE6B, 0x010C,\n    0xFF01, 0xFF01, 0x006C, 0xFF02, 0xFF02, 0x36E4, 0xFF03, 0xFF03, 0x00AE,\n    0xFF04, 0xFF04, 0x0103, 0xFF05, 0xFF05, 0x0108, 0xFF06, 0xFF06, 0x00AF,\n    0xFF07, 0xFF07, 0x36E3, 0xFF08, 0xFF09, 0x0080, 0xFF0A, 0xFF0A, 0x00B0,\n    0xFF0B, 0xFF0B, 0x00D0, 0xFF0C, 0xFF0C, 0x0064, 0xFF0D, 0xFF0D, 0x00D1,\n    0xFF0E, 0xFF0E, 0x0067, 0xFF0F, 0xFF0F, 0x0101, 0xFF10, 0xFF19, 0x014D,\n    0xFF1A, 0xFF1A, 0x006A, 0xFF1B, 0xFF1B, 0x0069, 0xFF1C, 0xFF1C, 0x00D6,\n    0xFF1D, 0xFF1D, 0x00D8, 0xFF1E, 0xFF1E, 0x00D7, 0xFF1F, 0xFF1F, 0x006B,\n    0xFF20, 0xFF20, 0x0109, 0xFF21, 0xFF3A, 0x016D, 0xFF3B, 0xFF3B, 0x35BE,\n    0xFF3C, 0xFF3C, 0x0102, 0xFF3D, 0xFF3D, 0x35BF, 0xFF3E, 0xFF3E, 0x35B4,\n    0xFF3F, 0xFF3F, 0x00C5, 0xFF41, 0xFF5A, 0x0187, 0xFF5B, 0xFF5B, 0x0084,\n    0xFF5C, 0xFF5C, 0x0078, 0xFF5D, 0xFF5D, 0x0085, 0xFF64, 0xFF64, 0x0071,\n    0xFFE2, 0xFFE2, 0x36E1, 0xFFE4, 0xFFE4, 0x36E2,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UCS2-V_3.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_UniCNS_UCS2_V_3[13 * 3] = {\n    0x2013, 0x2013, 0x0078, 0x2014, 0x2014, 0x007A, 0x2025, 0x2025, 0x006D,\n    0x3008, 0x3009, 0x0096, 0x300A, 0x300B, 0x0092, 0x300C, 0x300D, 0x009A,\n    0x300E, 0x300F, 0x009E, 0x3010, 0x3011, 0x008E, 0x3014, 0x3015, 0x008A,\n    0xFE4F, 0xFE4F, 0x35B1, 0xFF08, 0xFF09, 0x0082, 0xFF5B, 0xFF5B, 0x0086,\n    0xFF5D, 0xFF5D, 0x0087,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UTF16-H_0.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_UniCNS_UTF16_H_0[14557 * 2] = {\n    0x0020, 0x0001, 0x0021, 0x0002, 0x0022, 0x0003, 0x0023, 0x0004,\n    0x0024, 0x0005, 0x0025, 0x0006, 0x0026, 0x0007, 0x0027, 0x0008,\n    0x0028, 0x0009, 0x0029, 0x000A, 0x002A, 0x000B, 0x002B, 0x000C,\n    0x002C, 0x000D, 0x002D, 0x000E, 0x002E, 0x000F, 0x002F, 0x0010,\n    0x0030, 0x0011, 0x0031, 0x0012, 0x0032, 0x0013, 0x0033, 0x0014,\n    0x0034, 0x0015, 0x0035, 0x0016, 0x0036, 0x0017, 0x0037, 0x0018,\n    0x0038, 0x0019, 0x0039, 0x001A, 0x003A, 0x001B, 0x003B, 0x001C,\n    0x003C, 0x001D, 0x003D, 0x001E, 0x003E, 0x001F, 0x003F, 0x0020,\n    0x0040, 0x0021, 0x0041, 0x0022, 0x0042, 0x0023, 0x0043, 0x0024,\n    0x0044, 0x0025, 0x0045, 0x0026, 0x0046, 0x0027, 0x0047, 0x0028,\n    0x0048, 0x0029, 0x0049, 0x002A, 0x004A, 0x002B, 0x004B, 0x002C,\n    0x004C, 0x002D, 0x004D, 0x002E, 0x004E, 0x002F, 0x004F, 0x0030,\n    0x0050, 0x0031, 0x0051, 0x0032, 0x0052, 0x0033, 0x0053, 0x0034,\n    0x0054, 0x0035, 0x0055, 0x0036, 0x0056, 0x0037, 0x0057, 0x0038,\n    0x0058, 0x0039, 0x0059, 0x003A, 0x005A, 0x003B, 0x005B, 0x003C,\n    0x005C, 0x003D, 0x005D, 0x003E, 0x005E, 0x003F, 0x005F, 0x0040,\n    0x0060, 0x0041, 0x0061, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044,\n    0x0064, 0x0045, 0x0065, 0x0046, 0x0066, 0x0047, 0x0067, 0x0048,\n    0x0068, 0x0049, 0x0069, 0x004A, 0x006A, 0x004B, 0x006B, 0x004C,\n    0x006C, 0x004D, 0x006D, 0x004E, 0x006E, 0x004F, 0x006F, 0x0050,\n    0x0070, 0x0051, 0x0071, 0x0052, 0x0072, 0x0053, 0x0073, 0x0054,\n    0x0074, 0x0055, 0x0075, 0x0056, 0x0076, 0x0057, 0x0077, 0x0058,\n    0x0078, 0x0059, 0x0079, 0x005A, 0x007A, 0x005B, 0x007B, 0x005C,\n    0x007C, 0x005D, 0x007D, 0x005E, 0x007E, 0x005F, 0x00A2, 0x0106,\n    0x00A3, 0x0107, 0x00A5, 0x0104, 0x00A7, 0x00B2, 0x00A8, 0x35B3,\n    0x00AC, 0x36E1, 0x00AF, 0x00C3, 0x00B0, 0x0118, 0x00B1, 0x00D4,\n    0x00B7, 0x0073, 0x00D7, 0x00D2, 0x00F7, 0x00D3, 0x02C6, 0x35B4,\n    0x02C7, 0x01F8, 0x02CA, 0x01F7, 0x02CB, 0x01F9, 0x02CD, 0x00C6,\n    0x02D9, 0x01F6, 0x0308, 0x35B3, 0x0391, 0x01A1, 0x0392, 0x01A2,\n    0x0393, 0x01A3, 0x0394, 0x01A4, 0x0395, 0x01A5, 0x0396, 0x01A6,\n    0x0397, 0x01A7, 0x0398, 0x01A8, 0x0399, 0x01A9, 0x039A, 0x01AA,\n    0x039B, 0x01AB, 0x039C, 0x01AC, 0x039D, 0x01AD, 0x039E, 0x01AE,\n    0x039F, 0x01AF, 0x03A0, 0x01B0, 0x03A1, 0x01B1, 0x03A3, 0x01B2,\n    0x03A4, 0x01B3, 0x03A5, 0x01B4, 0x03A6, 0x01B5, 0x03A7, 0x01B6,\n    0x03A8, 0x01B7, 0x03A9, 0x01B8, 0x03B1, 0x01B9, 0x03B2, 0x01BA,\n    0x03B3, 0x01BB, 0x03B4, 0x01BC, 0x03B5, 0x01BD, 0x03B6, 0x01BE,\n    0x03B7, 0x01BF, 0x03B8, 0x01C0, 0x03B9, 0x01C1, 0x03BA, 0x01C2,\n    0x03BB, 0x01C3, 0x03BC, 0x01C4, 0x03BD, 0x01C5, 0x03BE, 0x01C6,\n    0x03BF, 0x01C7, 0x03C0, 0x01C8, 0x03C1, 0x01C9, 0x03C3, 0x01CA,\n    0x03C4, 0x01CB, 0x03C5, 0x01CC, 0x03C6, 0x01CD, 0x03C7, 0x01CE,\n    0x03C8, 0x01CF, 0x03C9, 0x01D0, 0x0401, 0x3670, 0x0410, 0x366A,\n    0x0411, 0x366B, 0x0412, 0x366C, 0x0413, 0x366D, 0x0414, 0x366E,\n    0x0415, 0x366F, 0x0416, 0x3671, 0x0417, 0x3672, 0x0418, 0x3673,\n    0x0419, 0x3674, 0x041A, 0x3675, 0x041B, 0x3676, 0x041C, 0x3677,\n    0x041D, 0x3678, 0x041E, 0x3679, 0x041F, 0x367A, 0x0420, 0x367B,\n    0x0421, 0x367C, 0x0422, 0x367D, 0x0423, 0x367E, 0x0424, 0x367F,\n    0x0425, 0x3680, 0x0426, 0x3681, 0x0427, 0x3682, 0x0428, 0x3683,\n    0x0429, 0x3684, 0x042A, 0x3685, 0x042B, 0x3686, 0x042C, 0x3687,\n    0x042D, 0x3688, 0x042E, 0x3689, 0x042F, 0x368A, 0x0430, 0x368B,\n    0x0431, 0x368C, 0x0432, 0x368D, 0x0433, 0x368E, 0x0434, 0x368F,\n    0x0435, 0x3690, 0x0436, 0x3692, 0x0437, 0x3693, 0x0438, 0x3694,\n    0x0439, 0x3695, 0x043A, 0x3696, 0x043B, 0x3697, 0x043C, 0x3698,\n    0x043D, 0x3699, 0x043E, 0x369A, 0x043F, 0x369B, 0x0440, 0x369C,\n    0x0441, 0x369D, 0x0442, 0x369E, 0x0443, 0x369F, 0x0444, 0x36A0,\n    0x0445, 0x36A1, 0x0446, 0x36A2, 0x0447, 0x36A3, 0x0448, 0x36A4,\n    0x0449, 0x36A5, 0x044A, 0x36A6, 0x044B, 0x36A7, 0x044C, 0x36A8,\n    0x044D, 0x36A9, 0x044E, 0x36AA, 0x044F, 0x36AB, 0x0451, 0x3691,\n    0x2013, 0x0079, 0x2014, 0x007B, 0x2018, 0x00A6, 0x2019, 0x00A7,\n    0x201C, 0x00A8, 0x201D, 0x00A9, 0x2022, 0x0068, 0x2025, 0x006F,\n    0x2026, 0x006E, 0x2027, 0x0068, 0x2032, 0x00AD, 0x2035, 0x00AC,\n    0x203B, 0x00B1, 0x203E, 0x00C3, 0x2103, 0x010A, 0x2105, 0x00C2,\n    0x2109, 0x010B, 0x2116, 0x36E6, 0x2121, 0x36E7, 0x2160, 0x0157,\n    0x2161, 0x0158, 0x2162, 0x0159, 0x2163, 0x015A, 0x2164, 0x015B,\n    0x2165, 0x015C, 0x2166, 0x015D, 0x2167, 0x015E, 0x2168, 0x015F,\n    0x2169, 0x0160, 0x2170, 0x020E, 0x2171, 0x020F, 0x2172, 0x0210,\n    0x2173, 0x0211, 0x2174, 0x0212, 0x2175, 0x0213, 0x2176, 0x0214,\n    0x2177, 0x0215, 0x2178, 0x0216, 0x2179, 0x0217, 0x2190, 0x00F8,\n    0x2191, 0x00F5, 0x2192, 0x00F7, 0x2193, 0x00F6, 0x2196, 0x00F9,\n    0x2197, 0x00FA, 0x2198, 0x00FC, 0x2199, 0x00FB, 0x21B8, 0x36AD,\n    0x21B9, 0x36AE, 0x21E7, 0x36AC, 0x2215, 0x0101, 0x221A, 0x00D5,\n    0x221E, 0x00DC, 0x221F, 0x00E9, 0x2220, 0x00E8, 0x2223, 0x00FE,\n    0x2225, 0x00FD, 0x2229, 0x00E5, 0x222A, 0x00E6, 0x222B, 0x00ED,\n    0x222E, 0x00EE, 0x2234, 0x00F0, 0x2235, 0x00EF, 0x223C, 0x00E4,\n    0x2252, 0x00DD, 0x2260, 0x00DB, 0x2261, 0x00DE, 0x2266, 0x00D9,\n    0x2267, 0x00DA, 0x2295, 0x00F3, 0x2299, 0x00F4, 0x22A5, 0x00E7,\n    0x22BF, 0x00EA, 0x22EF, 0x006E, 0x2400, 0x0232, 0x2401, 0x0233,\n    0x2402, 0x0234, 0x2403, 0x0235, 0x2404, 0x0236, 0x2405, 0x0237,\n    0x2406, 0x0238, 0x2407, 0x0239, 0x2408, 0x023A, 0x2409, 0x023B,\n    0x240A, 0x023C, 0x240B, 0x023D, 0x240C, 0x023E, 0x240D, 0x023F,\n    0x240E, 0x0240, 0x240F, 0x0241, 0x2410, 0x0242, 0x2411, 0x0243,\n    0x2412, 0x0244, 0x2413, 0x0245, 0x2414, 0x0246, 0x2415, 0x0247,\n    0x2416, 0x0248, 0x2417, 0x0249, 0x2418, 0x024A, 0x2419, 0x024B,\n    0x241A, 0x024C, 0x241B, 0x024D, 0x241C, 0x024E, 0x241D, 0x024F,\n    0x241E, 0x0250, 0x241F, 0x0251, 0x2421, 0x0252, 0x2460, 0x01FA,\n    0x2461, 0x01FB, 0x2462, 0x01FC, 0x2463, 0x01FD, 0x2464, 0x01FE,\n    0x2465, 0x01FF, 0x2466, 0x0200, 0x2467, 0x0201, 0x2468, 0x0202,\n    0x2469, 0x0203, 0x2474, 0x0204, 0x2475, 0x0205, 0x2476, 0x0206,\n    0x2477, 0x0207, 0x2478, 0x0208, 0x2479, 0x0209, 0x247A, 0x020A,\n    0x247B, 0x020B, 0x247C, 0x020C, 0x247D, 0x020D, 0x2500, 0x0137,\n    0x2502, 0x0138, 0x250C, 0x013A, 0x2510, 0x013B, 0x2514, 0x013C,\n    0x2518, 0x013D, 0x251C, 0x0135, 0x2524, 0x0134, 0x252C, 0x0133,\n    0x2534, 0x0132, 0x253C, 0x0131, 0x2550, 0x0142, 0x2551, 0x370A,\n    0x2552, 0x36F8, 0x2553, 0x3701, 0x2554, 0x36EF, 0x2555, 0x36FA,\n    0x2556, 0x3703, 0x2557, 0x36F1, 0x2558, 0x36FE, 0x2559, 0x3707,\n    0x255A, 0x36F5, 0x255B, 0x3700, 0x255C, 0x3709, 0x255D, 0x36F7,\n    0x255E, 0x0143, 0x255F, 0x3704, 0x2560, 0x36F2, 0x2561, 0x0145,\n    0x2562, 0x3706, 0x2563, 0x36F4, 0x2564, 0x36F9, 0x2565, 0x3702,\n    0x2566, 0x36F0, 0x2567, 0x36FF, 0x2568, 0x3708, 0x2569, 0x36F6,\n    0x256A, 0x0144, 0x256B, 0x3705, 0x256C, 0x36F3, 0x256D, 0x013E,\n    0x256E, 0x013F, 0x256F, 0x0141, 0x2570, 0x0140, 0x2571, 0x014A,\n    0x2572, 0x014B, 0x2573, 0x014C, 0x2574, 0x35B0, 0x2581, 0x0122,\n    0x2582, 0x0123, 0x2583, 0x0124, 0x2584, 0x0125, 0x2585, 0x0126,\n    0x2586, 0x0127, 0x2587, 0x0128, 0x2588, 0x0129, 0x2589, 0x0130,\n    0x258A, 0x012F, 0x258B, 0x012E, 0x258C, 0x012D, 0x258D, 0x012C,\n    0x258E, 0x012B, 0x258F, 0x012A, 0x2593, 0x3710, 0x2594, 0x0136,\n    0x2595, 0x0139, 0x25A0, 0x00BE, 0x25A1, 0x00BD, 0x25B2, 0x00B7,\n    0x25B3, 0x00B6, 0x25BC, 0x00C0, 0x25BD, 0x00BF, 0x25C6, 0x00BC,\n    0x25C7, 0x00BB, 0x25CB, 0x00B4, 0x25CE, 0x00B8, 0x25CF, 0x00B5,\n    0x25E2, 0x0146, 0x25E3, 0x0147, 0x25E4, 0x0149, 0x25E5, 0x0148,\n    0x2605, 0x00BA, 0x2606, 0x00B9, 0x2609, 0x00F4, 0x2640, 0x00F1,\n    0x2641, 0x00F3, 0x2642, 0x00F2, 0x273D, 0x35C0, 0x2F00, 0x0253,\n    0x2F01, 0x0218, 0x2F02, 0x0219, 0x2F03, 0x021A, 0x2F04, 0x0254,\n    0x2F05, 0x021B, 0x2F06, 0x025A, 0x2F07, 0x021C, 0x2F08, 0x025B,\n    0x2F09, 0x025C, 0x2F0A, 0x025D, 0x2F0B, 0x025E, 0x2F0C, 0x021D,\n    0x2F0D, 0x021E, 0x2F0E, 0x021F, 0x2F0F, 0x025F, 0x2F10, 0x176E,\n    0x2F11, 0x0260, 0x2F12, 0x0262, 0x2F13, 0x0220, 0x2F14, 0x0263,\n    0x2F15, 0x176F, 0x2F16, 0x0221, 0x2F17, 0x0264, 0x2F18, 0x0265,\n    0x2F19, 0x0222, 0x2F1A, 0x1770, 0x2F1B, 0x0223, 0x2F1C, 0x0266,\n    0x2F1D, 0x0279, 0x2F1E, 0x1775, 0x2F1F, 0x027A, 0x2F20, 0x027B,\n    0x2F21, 0x0224, 0x2F22, 0x0224, 0x2F23, 0x027C, 0x2F24, 0x027D,\n    0x2F25, 0x027E, 0x2F26, 0x027F, 0x2F27, 0x0225, 0x2F28, 0x0282,\n    0x2F29, 0x0283, 0x2F2A, 0x0284, 0x2F2B, 0x0285, 0x2F2C, 0x1776,\n    0x2F2D, 0x0286, 0x2F2E, 0x0226, 0x2F2F, 0x0288, 0x2F30, 0x0289,\n    0x2F31, 0x028C, 0x2F32, 0x028D, 0x2F33, 0x0227, 0x2F34, 0x0228,\n    0x2F35, 0x0229, 0x2F36, 0x028E, 0x2F37, 0x028F, 0x2F38, 0x0290,\n    0x2F39, 0x022A, 0x2F3A, 0x022B, 0x2F3B, 0x1777, 0x2F3C, 0x02D0,\n    0x2F3D, 0x02D1, 0x2F3E, 0x02D2, 0x2F3F, 0x02D3, 0x2F40, 0x02D5,\n    0x2F41, 0x022C, 0x2F42, 0x02D6, 0x2F43, 0x02D7, 0x2F44, 0x02D8,\n    0x2F45, 0x02D9, 0x2F46, 0x022D, 0x2F47, 0x02DA, 0x2F48, 0x02DB,\n    0x2F49, 0x02DC, 0x2F4A, 0x02DD, 0x2F4B, 0x02DE, 0x2F4C, 0x02DF,\n    0x2F4D, 0x02E0, 0x2F4E, 0x178A, 0x2F4F, 0x02E1, 0x2F50, 0x02E2,\n    0x2F51, 0x02E3, 0x2F52, 0x02E4, 0x2F53, 0x178C, 0x2F54, 0x02E5,\n    0x2F55, 0x02E6, 0x2F56, 0x02E7, 0x2F57, 0x02E8, 0x2F58, 0x02E9,\n    0x2F59, 0x178D, 0x2F5A, 0x02EA, 0x2F5B, 0x02EB, 0x2F5C, 0x02EC,\n    0x2F5D, 0x02ED, 0x2F5E, 0x0356, 0x2F5F, 0x0357, 0x2F60, 0x0358,\n    0x2F61, 0x0359, 0x2F62, 0x035A, 0x2F63, 0x035B, 0x2F64, 0x035C,\n    0x2F65, 0x035E, 0x2F66, 0x0362, 0x2F67, 0x022E, 0x2F68, 0x022F,\n    0x2F69, 0x0363, 0x2F6A, 0x0364, 0x2F6B, 0x0365, 0x2F6C, 0x0366,\n    0x2F6D, 0x0367, 0x2F6E, 0x0368, 0x2F6F, 0x0369, 0x2F70, 0x036A,\n    0x2F71, 0x17B2, 0x2F72, 0x036B, 0x2F73, 0x036C, 0x2F74, 0x036D,\n    0x2F75, 0x03F6, 0x2F76, 0x03F7, 0x2F77, 0x03F8, 0x2F78, 0x03F9,\n    0x2F79, 0x1812, 0x2F7A, 0x03FA, 0x2F7B, 0x03FB, 0x2F7C, 0x03FC,\n    0x2F7D, 0x03FE, 0x2F7E, 0x03FF, 0x2F7F, 0x0400, 0x2F80, 0x0401,\n    0x2F81, 0x0402, 0x2F82, 0x0405, 0x2F83, 0x0406, 0x2F84, 0x0407,\n    0x2F85, 0x0408, 0x2F86, 0x0409, 0x2F87, 0x040A, 0x2F88, 0x040B,\n    0x2F89, 0x040C, 0x2F8A, 0x040D, 0x2F8B, 0x1813, 0x2F8C, 0x1818,\n    0x2F8D, 0x040F, 0x2F8E, 0x0410, 0x2F8F, 0x0411, 0x2F90, 0x0412,\n    0x2F91, 0x1819, 0x2F92, 0x0508, 0x2F93, 0x0509, 0x2F94, 0x050A,\n    0x2F95, 0x050B, 0x2F96, 0x050C, 0x2F97, 0x050D, 0x2F98, 0x18E7,\n    0x2F99, 0x050E, 0x2F9A, 0x050F, 0x2F9B, 0x0510, 0x2F9C, 0x0511,\n    0x2F9D, 0x0512, 0x2F9E, 0x0513, 0x2F9F, 0x0514, 0x2FA0, 0x0515,\n    0x2FA1, 0x0230, 0x2FA2, 0x051B, 0x2FA3, 0x0520, 0x2FA4, 0x0521,\n    0x2FA5, 0x0522, 0x2FA6, 0x0696, 0x2FA7, 0x0697, 0x2FA8, 0x0698,\n    0x2FA9, 0x0699, 0x2FAA, 0x0231, 0x2FAB, 0x069F, 0x2FAC, 0x06A0,\n    0x2FAE, 0x06A2, 0x2FAF, 0x0826, 0x2FB0, 0x0827, 0x2FB1, 0x0828,\n    0x2FB2, 0x0829, 0x2FB3, 0x082A, 0x2FB4, 0x082B, 0x2FB5, 0x082C,\n    0x2FB6, 0x082D, 0x2FB7, 0x082E, 0x2FB8, 0x082F, 0x2FB9, 0x0830,\n    0x2FBA, 0x09F5, 0x2FBB, 0x09F6, 0x2FBC, 0x09F7, 0x2FBD, 0x1E33,\n    0x2FBE, 0x09F8, 0x2FBF, 0x1E34, 0x2FC0, 0x09F9, 0x2FC1, 0x09FA,\n    0x2FC2, 0x0BE1, 0x2FC3, 0x0BE2, 0x2FC4, 0x0BE3, 0x2FC5, 0x0BE4,\n    0x2FC6, 0x0BE5, 0x2FC7, 0x0BE6, 0x2FC8, 0x0DBB, 0x2FC9, 0x0DBC,\n    0x2FCA, 0x0DBD, 0x2FCB, 0x2360, 0x2FCC, 0x2612, 0x2FCD, 0x0F7B,\n    0x2FCE, 0x0F7C, 0x2FCF, 0x0F7D, 0x2FD0, 0x1100, 0x2FD1, 0x1101,\n    0x2FD2, 0x1289, 0x2FD3, 0x13B2, 0x2FD4, 0x13B3, 0x2FD5, 0x2F0D,\n    0x3000, 0x0063, 0x3001, 0x0065, 0x3002, 0x0066, 0x3003, 0x00B3,\n    0x3005, 0x35BA, 0x3006, 0x35BB, 0x3007, 0x35BC, 0x3008, 0x0094,\n    0x3009, 0x0095, 0x300A, 0x0090, 0x300B, 0x0091, 0x300C, 0x0098,\n    0x300D, 0x0099, 0x300E, 0x009C, 0x300F, 0x009D, 0x3010, 0x008C,\n    0x3011, 0x008D, 0x3012, 0x0105, 0x3014, 0x0088, 0x3015, 0x0089,\n    0x301D, 0x00AA, 0x301E, 0x00AB, 0x3021, 0x0161, 0x3022, 0x0162,\n    0x3023, 0x0163, 0x3024, 0x0164, 0x3025, 0x0165, 0x3026, 0x0166,\n    0x3027, 0x0167, 0x3028, 0x0168, 0x3029, 0x0169, 0x3038, 0x016A,\n    0x3039, 0x016B, 0x303A, 0x016C, 0x3041, 0x35C1, 0x3042, 0x35C2,\n    0x3043, 0x35C3, 0x3044, 0x35C4, 0x3045, 0x35C5, 0x3046, 0x35C6,\n    0x3047, 0x35C7, 0x3048, 0x35C8, 0x3049, 0x35C9, 0x304A, 0x35CA,\n    0x304B, 0x35CB, 0x304C, 0x35CC, 0x304D, 0x35CD, 0x304E, 0x35CE,\n    0x304F, 0x35CF, 0x3050, 0x35D0, 0x3051, 0x35D1, 0x3052, 0x35D2,\n    0x3053, 0x35D3, 0x3054, 0x35D4, 0x3055, 0x35D5, 0x3056, 0x35D6,\n    0x3057, 0x35D7, 0x3058, 0x35D8, 0x3059, 0x35D9, 0x305A, 0x35DA,\n    0x305B, 0x35DB, 0x305C, 0x35DC, 0x305D, 0x35DD, 0x305E, 0x35DE,\n    0x305F, 0x35DF, 0x3060, 0x35E0, 0x3061, 0x35E1, 0x3062, 0x35E2,\n    0x3063, 0x35E3, 0x3064, 0x35E4, 0x3065, 0x35E5, 0x3066, 0x35E6,\n    0x3067, 0x35E7, 0x3068, 0x35E8, 0x3069, 0x35E9, 0x306A, 0x35EA,\n    0x306B, 0x35EB, 0x306C, 0x35EC, 0x306D, 0x35ED, 0x306E, 0x35EE,\n    0x306F, 0x35EF, 0x3070, 0x35F0, 0x3071, 0x35F1, 0x3072, 0x35F2,\n    0x3073, 0x35F3, 0x3074, 0x35F4, 0x3075, 0x35F5, 0x3076, 0x35F6,\n    0x3077, 0x35F7, 0x3078, 0x35F8, 0x3079, 0x35F9, 0x307A, 0x35FA,\n    0x307B, 0x35FB, 0x307C, 0x35FC, 0x307D, 0x35FD, 0x307E, 0x35FE,\n    0x307F, 0x35FF, 0x3080, 0x3600, 0x3081, 0x3601, 0x3082, 0x3602,\n    0x3083, 0x3603, 0x3084, 0x3604, 0x3085, 0x3605, 0x3086, 0x3606,\n    0x3087, 0x3607, 0x3088, 0x3608, 0x3089, 0x3609, 0x308A, 0x360A,\n    0x308B, 0x360B, 0x308C, 0x360C, 0x308D, 0x360D, 0x308E, 0x360E,\n    0x308F, 0x360F, 0x3090, 0x3610, 0x3091, 0x3611, 0x3092, 0x3612,\n    0x3093, 0x3613, 0x309D, 0x35B7, 0x309E, 0x35B8, 0x30A1, 0x3614,\n    0x30A2, 0x3615, 0x30A3, 0x3616, 0x30A4, 0x3617, 0x30A5, 0x3618,\n    0x30A6, 0x3619, 0x30A7, 0x361A, 0x30A8, 0x361B, 0x30A9, 0x361C,\n    0x30AA, 0x361D, 0x30AB, 0x361E, 0x30AC, 0x361F, 0x30AD, 0x3620,\n    0x30AE, 0x3621, 0x30AF, 0x3622, 0x30B0, 0x3623, 0x30B1, 0x3624,\n    0x30B2, 0x3625, 0x30B3, 0x3626, 0x30B4, 0x3627, 0x30B5, 0x3628,\n    0x30B6, 0x3629, 0x30B7, 0x362A, 0x30B8, 0x362B, 0x30B9, 0x362C,\n    0x30BA, 0x362D, 0x30BB, 0x362E, 0x30BC, 0x362F, 0x30BD, 0x3630,\n    0x30BE, 0x3631, 0x30BF, 0x3632, 0x30C0, 0x3633, 0x30C1, 0x3634,\n    0x30C2, 0x3635, 0x30C3, 0x3636, 0x30C4, 0x3637, 0x30C5, 0x3638,\n    0x30C6, 0x3639, 0x30C7, 0x363A, 0x30C8, 0x363B, 0x30C9, 0x363C,\n    0x30CA, 0x363D, 0x30CB, 0x363E, 0x30CC, 0x363F, 0x30CD, 0x3640,\n    0x30CE, 0x3641, 0x30CF, 0x3642, 0x30D0, 0x3643, 0x30D1, 0x3644,\n    0x30D2, 0x3645, 0x30D3, 0x3646, 0x30D4, 0x3647, 0x30D5, 0x3648,\n    0x30D6, 0x3649, 0x30D7, 0x364A, 0x30D8, 0x364B, 0x30D9, 0x364C,\n    0x30DA, 0x364D, 0x30DB, 0x364E, 0x30DC, 0x364F, 0x30DD, 0x3650,\n    0x30DE, 0x3651, 0x30DF, 0x3652, 0x30E0, 0x3653, 0x30E1, 0x3654,\n    0x30E2, 0x3655, 0x30E3, 0x3656, 0x30E4, 0x3657, 0x30E5, 0x3658,\n    0x30E6, 0x3659, 0x30E7, 0x365A, 0x30E8, 0x365B, 0x30E9, 0x365C,\n    0x30EA, 0x365D, 0x30EB, 0x365E, 0x30EC, 0x365F, 0x30ED, 0x3660,\n    0x30EE, 0x3661, 0x30EF, 0x3662, 0x30F0, 0x3663, 0x30F1, 0x3664,\n    0x30F2, 0x3665, 0x30F3, 0x3666, 0x30F4, 0x3667, 0x30F5, 0x3668,\n    0x30F6, 0x3669, 0x30FC, 0x35BD, 0x30FD, 0x35B5, 0x30FE, 0x35B6,\n    0x3105, 0x01D1, 0x3106, 0x01D2, 0x3107, 0x01D3, 0x3108, 0x01D4,\n    0x3109, 0x01D5, 0x310A, 0x01D6, 0x310B, 0x01D7, 0x310C, 0x01D8,\n    0x310D, 0x01D9, 0x310E, 0x01DA, 0x310F, 0x01DB, 0x3110, 0x01DC,\n    0x3111, 0x01DD, 0x3112, 0x01DE, 0x3113, 0x01DF, 0x3114, 0x01E0,\n    0x3115, 0x01E1, 0x3116, 0x01E2, 0x3117, 0x01E3, 0x3118, 0x01E4,\n    0x3119, 0x01E5, 0x311A, 0x01E6, 0x311B, 0x01E7, 0x311C, 0x01E8,\n    0x311D, 0x01E9, 0x311E, 0x01EA, 0x311F, 0x01EB, 0x3120, 0x01EC,\n    0x3121, 0x01ED, 0x3122, 0x01EE, 0x3123, 0x01EF, 0x3124, 0x01F0,\n    0x3125, 0x01F1, 0x3126, 0x01F2, 0x3127, 0x01F3, 0x3128, 0x01F4,\n    0x3129, 0x01F5, 0x3231, 0x36E5, 0x32A3, 0x00C1, 0x338E, 0x0115,\n    0x338F, 0x0116, 0x339C, 0x0110, 0x339D, 0x0111, 0x339E, 0x0112,\n    0x33A1, 0x0114, 0x33C4, 0x0117, 0x33CE, 0x0113, 0x33D1, 0x00EC,\n    0x33D2, 0x00EB, 0x33D5, 0x010F, 0x361D, 0x36B7, 0x4491, 0x36B4,\n    0x4E00, 0x0253, 0x4E01, 0x0255, 0x4E03, 0x0256, 0x4E07, 0x1771,\n    0x4E08, 0x0269, 0x4E09, 0x0267, 0x4E0A, 0x026A, 0x4E0B, 0x0268,\n    0x4E0C, 0x1772, 0x4E0D, 0x0294, 0x4E0E, 0x177A, 0x4E0F, 0x1778,\n    0x4E10, 0x0293, 0x4E11, 0x0292, 0x4E14, 0x02F2, 0x4E15, 0x02F1,\n    0x4E16, 0x02F0, 0x4E18, 0x02F3, 0x4E19, 0x02EF, 0x4E1E, 0x036E,\n    0x4E1F, 0x036F, 0x4E26, 0x0528, 0x4E28, 0x0218, 0x4E2B, 0x026B,\n    0x4E2D, 0x0295, 0x4E2E, 0x177B, 0x4E30, 0x0296, 0x4E31, 0x178E,\n    0x4E32, 0x0415, 0x4E33, 0x18F4, 0x4E36, 0x0219, 0x4E38, 0x026C,\n    0x4E39, 0x0297, 0x4E3B, 0x02F4, 0x4E3C, 0x178F, 0x4E3F, 0x021A,\n    0x4E41, 0x36AF, 0x4E42, 0x176C, 0x4E43, 0x0257, 0x4E45, 0x026E,\n    0x4E47, 0x1773, 0x4E48, 0x026F, 0x4E4B, 0x0298, 0x4E4D, 0x02F5,\n    0x4E4E, 0x02F7, 0x4E4F, 0x02F6, 0x4E52, 0x0370, 0x4E53, 0x0371,\n    0x4E56, 0x0529, 0x4E58, 0x0831, 0x4E59, 0x0254, 0x4E5A, 0x36B1,\n    0x4E5C, 0x176D, 0x4E5D, 0x0258, 0x4E5E, 0x0271, 0x4E5F, 0x0270,\n    0x4E69, 0x0372, 0x4E73, 0x052A, 0x4E7E, 0x09FB, 0x4E7F, 0x1E35,\n    0x4E82, 0x0DBE, 0x4E83, 0x2361, 0x4E84, 0x2362, 0x4E85, 0x021B,\n    0x4E86, 0x0259, 0x4E88, 0x029A, 0x4E8B, 0x052B, 0x4E8C, 0x025A,\n    0x4E8D, 0x1774, 0x4E8E, 0x0272, 0x4E91, 0x029B, 0x4E92, 0x029D,\n    0x4E93, 0x177C, 0x4E94, 0x029E, 0x4E95, 0x029C, 0x4E99, 0x0373,\n    0x4E9B, 0x052C, 0x4E9E, 0x052D, 0x4E9F, 0x06A3, 0x4EA0, 0x021C,\n    0x4EA1, 0x0273, 0x4EA2, 0x029F, 0x4EA4, 0x0374, 0x4EA5, 0x0376,\n    0x4EA6, 0x0375, 0x4EA8, 0x0416, 0x4EAB, 0x052E, 0x4EAC, 0x052F,\n    0x4EAD, 0x06A4, 0x4EAE, 0x06A5, 0x4EB3, 0x0832, 0x4EB6, 0x2363,\n    0x4EB9, 0x3377, 0x4EBA, 0x025B, 0x4EC0, 0x02A1, 0x4EC1, 0x02A0,\n    0x4EC2, 0x177D, 0x4EC3, 0x02A2, 0x4EC4, 0x02A8, 0x4EC6, 0x02A3,\n    0x4EC7, 0x02A4, 0x4EC8, 0x177F, 0x4EC9, 0x177E, 0x4ECA, 0x02A6,\n    0x4ECB, 0x02A7, 0x4ECD, 0x02A5, 0x4ED4, 0x02FA, 0x4ED5, 0x02FB,\n    0x4ED6, 0x02FC, 0x4ED7, 0x02FD, 0x4ED8, 0x02F9, 0x4ED9, 0x0300,\n    0x4EDA, 0x1795, 0x4EDC, 0x1791, 0x4EDD, 0x1794, 0x4EDE, 0x0301,\n    0x4EDF, 0x0311, 0x4EE1, 0x1793, 0x4EE3, 0x02FE, 0x4EE4, 0x02FF,\n    0x4EE5, 0x02F8, 0x4EE8, 0x1790, 0x4EE9, 0x1792, 0x4EF0, 0x0383,\n    0x4EF1, 0x17BA, 0x4EF2, 0x0380, 0x4EF3, 0x0384, 0x4EF4, 0x17C4,\n    0x4EF5, 0x17B8, 0x4EF6, 0x0381, 0x4EF7, 0x17BC, 0x4EFB, 0x0382,\n    0x4EFD, 0x0385, 0x4EFF, 0x0377, 0x4F00, 0x17BB, 0x4F01, 0x0386,\n    0x4F02, 0x17BF, 0x4F04, 0x17C3, 0x4F05, 0x17C0, 0x4F08, 0x17BD,\n    0x4F09, 0x0378, 0x4F0A, 0x037A, 0x4F0B, 0x0387, 0x4F0D, 0x037C,\n    0x4F0E, 0x17B5, 0x4F0F, 0x037F, 0x4F10, 0x037D, 0x4F11, 0x037E,\n    0x4F12, 0x17C5, 0x4F13, 0x17C2, 0x4F14, 0x17B9, 0x4F15, 0x037B,\n    0x4F18, 0x17B6, 0x4F19, 0x0379, 0x4F1D, 0x17BE, 0x4F22, 0x17C1,\n    0x4F2C, 0x17B7, 0x4F2D, 0x182F, 0x4F2F, 0x042C, 0x4F30, 0x041F,\n    0x4F33, 0x1830, 0x4F34, 0x041C, 0x4F36, 0x042E, 0x4F38, 0x0424,\n    0x4F3A, 0x0423, 0x4F3B, 0x1824, 0x4F3C, 0x0427, 0x4F3D, 0x0422,\n    0x4F3E, 0x1829, 0x4F3F, 0x1831, 0x4F41, 0x182D, 0x4F43, 0x0425,\n    0x4F46, 0x0428, 0x4F47, 0x0419, 0x4F48, 0x0431, 0x4F49, 0x1826,\n    0x4F4C, 0x1900, 0x4F4D, 0x0417, 0x4F4E, 0x042D, 0x4F4F, 0x0418,\n    0x4F50, 0x0420, 0x4F51, 0x0421, 0x4F52, 0x182B, 0x4F53, 0x1827,\n    0x4F54, 0x0426, 0x4F55, 0x041E, 0x4F56, 0x1823, 0x4F57, 0x041A,\n    0x4F58, 0x182E, 0x4F59, 0x042F, 0x4F5A, 0x0432, 0x4F5B, 0x041D,\n    0x4F5C, 0x042A, 0x4F5D, 0x0430, 0x4F5E, 0x041B, 0x4F5F, 0x182C,\n    0x4F60, 0x042B, 0x4F61, 0x1832, 0x4F62, 0x1825, 0x4F63, 0x0429,\n    0x4F64, 0x1828, 0x4F67, 0x182A, 0x4F69, 0x053D, 0x4F6A, 0x1902,\n    0x4F6B, 0x190E, 0x4F6C, 0x0535, 0x4F6E, 0x190F, 0x4F6F, 0x0530,\n    0x4F70, 0x053A, 0x4F73, 0x0533, 0x4F74, 0x18FC, 0x4F75, 0x053B,\n    0x4F76, 0x18FB, 0x4F77, 0x18FF, 0x4F78, 0x1906, 0x4F79, 0x1904,\n    0x4F7A, 0x0543, 0x4F7B, 0x053E, 0x4F7C, 0x18F6, 0x4F7D, 0x18F8,\n    0x4F7E, 0x0540, 0x4F7F, 0x0534, 0x4F80, 0x18F9, 0x4F81, 0x1905,\n    0x4F82, 0x190C, 0x4F83, 0x0539, 0x4F84, 0x18FE, 0x4F85, 0x18F7,\n    0x4F86, 0x0538, 0x4F87, 0x18FA, 0x4F88, 0x053C, 0x4F89, 0x18FD,\n    0x4F8B, 0x0537, 0x4F8D, 0x0532, 0x4F8F, 0x0541, 0x4F90, 0x1907,\n    0x4F91, 0x0542, 0x4F92, 0x190B, 0x4F94, 0x1909, 0x4F95, 0x190D,\n    0x4F96, 0x053F, 0x4F97, 0x1901, 0x4F98, 0x18F5, 0x4F9A, 0x1903,\n    0x4F9B, 0x0536, 0x4F9C, 0x1908, 0x4F9D, 0x0531, 0x4F9E, 0x190A,\n    0x4FAE, 0x06B4, 0x4FAF, 0x06A8, 0x4FB2, 0x1A5D, 0x4FB3, 0x1A65,\n    0x4FB5, 0x06A7, 0x4FB6, 0x06AF, 0x4FB7, 0x06BB, 0x4FB9, 0x1A6B,\n    0x4FBA, 0x1A69, 0x4FBB, 0x1A64, 0x4FBF, 0x06A9, 0x4FC0, 0x1A6A,\n    0x4FC1, 0x1A60, 0x4FC2, 0x06B7, 0x4FC3, 0x06AE, 0x4FC4, 0x06B6,\n    0x4FC5, 0x1A5B, 0x4FC7, 0x1A67, 0x4FC9, 0x1A5E, 0x4FCA, 0x06B2,\n    0x4FCB, 0x1A5F, 0x4FCD, 0x1A5A, 0x4FCE, 0x06B9, 0x4FCF, 0x06AC,\n    0x4FD0, 0x06B5, 0x4FD1, 0x06AB, 0x4FD3, 0x1A5C, 0x4FD4, 0x1A61,\n    0x4FD6, 0x1A68, 0x4FD7, 0x06B3, 0x4FD8, 0x06B0, 0x4FD9, 0x1A63,\n    0x4FDA, 0x06B8, 0x4FDB, 0x1A66, 0x4FDC, 0x1A62, 0x4FDD, 0x06AD,\n    0x4FDE, 0x06BA, 0x4FDF, 0x06B1, 0x4FE0, 0x06AA, 0x4FE1, 0x06A6,\n    0x4FEC, 0x1A6C, 0x4FEE, 0x084C, 0x4FEF, 0x0836, 0x4FF1, 0x0846,\n    0x4FF3, 0x084B, 0x4FF4, 0x1C24, 0x4FF5, 0x1C23, 0x4FF6, 0x1C28,\n    0x4FF7, 0x1C29, 0x4FF8, 0x0839, 0x4FFA, 0x0842, 0x4FFE, 0x084F,\n    0x5000, 0x0843, 0x5005, 0x1C1D, 0x5006, 0x083C, 0x5007, 0x1C1E,\n    0x5009, 0x0851, 0x500B, 0x0848, 0x500C, 0x0833, 0x500D, 0x0834,\n    0x500E, 0x1C31, 0x500F, 0x0A0C, 0x5011, 0x0841, 0x5012, 0x0840,\n    0x5013, 0x1C1F, 0x5014, 0x0844, 0x5015, 0x1E45, 0x5016, 0x083B,\n    0x5017, 0x1C2A, 0x5018, 0x084A, 0x5019, 0x0849, 0x501A, 0x083F,\n    0x501B, 0x1C22, 0x501C, 0x1C2B, 0x501E, 0x1C1C, 0x501F, 0x083E,\n    0x5020, 0x1C2C, 0x5021, 0x0847, 0x5022, 0x1C20, 0x5023, 0x0835,\n    0x5025, 0x0838, 0x5026, 0x0837, 0x5027, 0x1C2D, 0x5028, 0x0845,\n    0x5029, 0x083A, 0x502A, 0x084E, 0x502B, 0x0850, 0x502C, 0x1C27,\n    0x502D, 0x084D, 0x502F, 0x1C2F, 0x5030, 0x1C21, 0x5031, 0x1C30,\n    0x5033, 0x1C25, 0x5035, 0x1C2E, 0x5037, 0x1C26, 0x503C, 0x083D,\n    0x5040, 0x1E4D, 0x5041, 0x1E41, 0x5043, 0x0A00, 0x5045, 0x1E46,\n    0x5046, 0x1E4C, 0x5047, 0x09FF, 0x5048, 0x1E3F, 0x5049, 0x0A03,\n    0x504A, 0x1E43, 0x504B, 0x1E3C, 0x504C, 0x0A01, 0x504D, 0x1E40,\n    0x504E, 0x0A06, 0x504F, 0x0A0B, 0x5051, 0x1E51, 0x5053, 0x1E3B,\n    0x5055, 0x0A07, 0x5057, 0x1E50, 0x505A, 0x0A02, 0x505B, 0x1E42,\n    0x505C, 0x09FE, 0x505D, 0x1E3D, 0x505E, 0x1E39, 0x505F, 0x1E47,\n    0x5060, 0x1E3A, 0x5061, 0x1E38, 0x5062, 0x1E44, 0x5063, 0x1E4A,\n    0x5064, 0x1E4B, 0x5065, 0x0A04, 0x5068, 0x20B8, 0x5069, 0x1E48,\n    0x506A, 0x1E37, 0x506B, 0x1E49, 0x506D, 0x0A0E, 0x506E, 0x1E4E,\n    0x506F, 0x0A0D, 0x5070, 0x1E36, 0x5072, 0x1E3E, 0x5073, 0x1E4F,\n    0x5074, 0x0A09, 0x5075, 0x0A08, 0x5076, 0x0A05, 0x5077, 0x0A0A,\n    0x507A, 0x09FC, 0x507D, 0x09FD, 0x5080, 0x0BEC, 0x5082, 0x20BB,\n    0x5083, 0x20B4, 0x5085, 0x0BE9, 0x5087, 0x20BC, 0x508B, 0x20B2,\n    0x508C, 0x20B5, 0x508D, 0x0BE8, 0x508E, 0x20B6, 0x5091, 0x0BEB,\n    0x5092, 0x20BA, 0x5094, 0x20B0, 0x5095, 0x20AF, 0x5096, 0x0BED,\n    0x5098, 0x0BEE, 0x5099, 0x0BEA, 0x509A, 0x0BEF, 0x509B, 0x20AE,\n    0x509C, 0x20B9, 0x509D, 0x20B7, 0x509E, 0x20B1, 0x50A2, 0x0BE7,\n    0x50A3, 0x20B3, 0x50AC, 0x0DC5, 0x50AD, 0x0DBF, 0x50AE, 0x2367,\n    0x50AF, 0x0DC8, 0x50B0, 0x236D, 0x50B1, 0x2370, 0x50B2, 0x0DC1,\n    0x50B3, 0x0DC2, 0x50B4, 0x236A, 0x50B5, 0x0DC0, 0x50B6, 0x2373,\n    0x50B7, 0x0DC6, 0x50B8, 0x2374, 0x50BA, 0x236F, 0x50BB, 0x0DC7,\n    0x50BD, 0x2364, 0x50BE, 0x0DC4, 0x50BF, 0x2365, 0x50C1, 0x236E,\n    0x50C2, 0x236C, 0x50C4, 0x2368, 0x50C5, 0x0DC3, 0x50C6, 0x2366,\n    0x50C7, 0x0DC9, 0x50C8, 0x236B, 0x50C9, 0x2372, 0x50CA, 0x2369,\n    0x50CB, 0x2371, 0x50CE, 0x0F88, 0x50CF, 0x0F85, 0x50D1, 0x0F86,\n    0x50D3, 0x261C, 0x50D4, 0x2614, 0x50D5, 0x0F84, 0x50D6, 0x0F81,\n    0x50D7, 0x2615, 0x50DA, 0x0F83, 0x50DB, 0x2618, 0x50DD, 0x261A,\n    0x50E0, 0x2621, 0x50E3, 0x2620, 0x50E4, 0x261B, 0x50E5, 0x0F80,\n    0x50E6, 0x2613, 0x50E7, 0x0F7E, 0x50E8, 0x2616, 0x50E9, 0x0F89,\n    0x50EA, 0x2619, 0x50EC, 0x261D, 0x50ED, 0x0F82, 0x50EE, 0x0F7F,\n    0x50EF, 0x261F, 0x50F0, 0x261E, 0x50F1, 0x0F87, 0x50F3, 0x2617,\n    0x50F5, 0x1105, 0x50F6, 0x2883, 0x50F8, 0x2880, 0x50F9, 0x1106,\n    0x50FB, 0x1104, 0x50FD, 0x2887, 0x50FE, 0x2884, 0x50FF, 0x287D,\n    0x5100, 0x1103, 0x5102, 0x1107, 0x5103, 0x287E, 0x5104, 0x1102,\n    0x5105, 0x110A, 0x5106, 0x2881, 0x5107, 0x2882, 0x5108, 0x1108,\n    0x5109, 0x1109, 0x510A, 0x2888, 0x510B, 0x2885, 0x510C, 0x2886,\n    0x5110, 0x128D, 0x5111, 0x2B04, 0x5112, 0x128A, 0x5113, 0x2B01,\n    0x5114, 0x128C, 0x5115, 0x128E, 0x5117, 0x2B02, 0x5118, 0x128B,\n    0x511A, 0x2B03, 0x511C, 0x2B00, 0x511F, 0x13B5, 0x5120, 0x2D3E,\n    0x5121, 0x13B6, 0x5122, 0x2D3C, 0x5124, 0x2D3D, 0x5125, 0x2D3B,\n    0x5126, 0x2D3A, 0x5129, 0x2D3F, 0x512A, 0x13B4, 0x512D, 0x2F0F,\n    0x512E, 0x2F10, 0x5130, 0x287F, 0x5131, 0x2F0E, 0x5132, 0x13B7,\n    0x5133, 0x1575, 0x5134, 0x307A, 0x5135, 0x307B, 0x5137, 0x1668,\n    0x5138, 0x1669, 0x5139, 0x32C6, 0x513A, 0x32C5, 0x513B, 0x16BC,\n    0x513C, 0x16BB, 0x513D, 0x340E, 0x513F, 0x025C, 0x5140, 0x0274,\n    0x5141, 0x02AA, 0x5143, 0x02A9, 0x5144, 0x0303, 0x5145, 0x0302,\n    0x5146, 0x038A, 0x5147, 0x0389, 0x5148, 0x038B, 0x5149, 0x0388,\n    0x514B, 0x0434, 0x514C, 0x0433, 0x514D, 0x0435, 0x5152, 0x0545,\n    0x5154, 0x0544, 0x5155, 0x0546, 0x5157, 0x06BC, 0x5159, 0x0119,\n    0x515A, 0x1C32, 0x515B, 0x011A, 0x515C, 0x0A0F, 0x515D, 0x011C,\n    0x515E, 0x011B, 0x515F, 0x20BD, 0x5161, 0x011D, 0x5162, 0x0F8A,\n    0x5163, 0x011E, 0x5165, 0x025D, 0x5167, 0x02AB, 0x5168, 0x038C,\n    0x5169, 0x0547, 0x516B, 0x025E, 0x516C, 0x02AE, 0x516D, 0x02AC,\n    0x516E, 0x02AD, 0x5171, 0x038D, 0x5175, 0x0436, 0x5176, 0x0549,\n    0x5177, 0x0548, 0x5178, 0x054A, 0x517C, 0x0852, 0x5180, 0x128F,\n    0x5182, 0x021D, 0x5187, 0x1779, 0x5188, 0x36B6, 0x5189, 0x0304,\n    0x518A, 0x0305, 0x518D, 0x038E, 0x518F, 0x1833, 0x5191, 0x06BE,\n    0x5192, 0x06BD, 0x5193, 0x1C34, 0x5194, 0x1C33, 0x5195, 0x0A10,\n    0x5196, 0x021E, 0x5197, 0x02AF, 0x5198, 0x1780, 0x519E, 0x1910,\n    0x51A0, 0x06BF, 0x51A2, 0x0855, 0x51A4, 0x0853, 0x51A5, 0x0854,\n    0x51AA, 0x1290, 0x51AB, 0x021F, 0x51AC, 0x0306, 0x51B0, 0x038F,\n    0x51B1, 0x17C6, 0x51B6, 0x0437, 0x51B7, 0x0438, 0x51B9, 0x1834,\n    0x51BC, 0x1911, 0x51BD, 0x054B, 0x51BE, 0x1912, 0x51C4, 0x1C36,\n    0x51C5, 0x1C37, 0x51C6, 0x0858, 0x51C8, 0x1C38, 0x51CA, 0x1C35,\n    0x51CB, 0x0859, 0x51CC, 0x0857, 0x51CD, 0x0856, 0x51CE, 0x1C39,\n    0x51D0, 0x1E52, 0x51D4, 0x20BE, 0x51D7, 0x2375, 0x51D8, 0x2622,\n    0x51DC, 0x110B, 0x51DD, 0x1291, 0x51DE, 0x2B05, 0x51E0, 0x025F,\n    0x51E1, 0x026D, 0x51F0, 0x0A11, 0x51F1, 0x0BF1, 0x51F3, 0x0F8B,\n    0x51F5, 0x176E, 0x51F6, 0x02B0, 0x51F8, 0x0309, 0x51F9, 0x0307,\n    0x51FA, 0x0308, 0x51FD, 0x054C, 0x5200, 0x0260, 0x5201, 0x0261,\n    0x5202, 0x36B3, 0x5203, 0x0275, 0x5206, 0x02B1, 0x5207, 0x02B2,\n    0x5208, 0x02B3, 0x5209, 0x1797, 0x520A, 0x030A, 0x520C, 0x1796,\n    0x520E, 0x0393, 0x5210, 0x17C8, 0x5211, 0x0391, 0x5212, 0x0392,\n    0x5213, 0x17C7, 0x5216, 0x0394, 0x5217, 0x0390, 0x521C, 0x1835,\n    0x521D, 0x068B, 0x521E, 0x1836, 0x5221, 0x1837, 0x5224, 0x043A,\n    0x5225, 0x0439, 0x5228, 0x043D, 0x5229, 0x043B, 0x522A, 0x043C,\n    0x522E, 0x0552, 0x5230, 0x0551, 0x5231, 0x1917, 0x5232, 0x1914,\n    0x5233, 0x1915, 0x5235, 0x1913, 0x5236, 0x0553, 0x5237, 0x054F,\n    0x5238, 0x054E, 0x523A, 0x0550, 0x523B, 0x054D, 0x5241, 0x0554,\n    0x5243, 0x06C1, 0x5244, 0x1A6D, 0x5246, 0x1916, 0x5247, 0x06C6,\n    0x5249, 0x1A6E, 0x524A, 0x06C2, 0x524B, 0x06C5, 0x524C, 0x06C4,\n    0x524D, 0x06C3, 0x524E, 0x06C0, 0x5252, 0x1C3C, 0x5254, 0x085C,\n    0x5255, 0x1C3F, 0x5256, 0x085A, 0x525A, 0x1C3B, 0x525B, 0x085D,\n    0x525C, 0x085B, 0x525D, 0x085E, 0x525E, 0x1C3D, 0x525F, 0x1C3E,\n    0x5261, 0x1C3A, 0x5262, 0x1C40, 0x5269, 0x0BF5, 0x526A, 0x0A12,\n    0x526B, 0x1E53, 0x526C, 0x1E55, 0x526D, 0x1E54, 0x526E, 0x1E56,\n    0x526F, 0x0A13, 0x5272, 0x0BF2, 0x5274, 0x0BF3, 0x5275, 0x0BF4,\n    0x5277, 0x0DCB, 0x5278, 0x2377, 0x527A, 0x2376, 0x527B, 0x2378,\n    0x527C, 0x2379, 0x527D, 0x0DCC, 0x527F, 0x0DCA, 0x5280, 0x2623,\n    0x5281, 0x2624, 0x5282, 0x0F8D, 0x5283, 0x0F8C, 0x5284, 0x2776,\n    0x5287, 0x110C, 0x5288, 0x110D, 0x5289, 0x110E, 0x528A, 0x1110,\n    0x528B, 0x2889, 0x528C, 0x288A, 0x528D, 0x110F, 0x5291, 0x1292,\n    0x5293, 0x1293, 0x5296, 0x307C, 0x5297, 0x32C8, 0x5298, 0x32C7,\n    0x5299, 0x340F, 0x529B, 0x0262, 0x529F, 0x030C, 0x52A0, 0x030B,\n    0x52A3, 0x0395, 0x52A6, 0x17C9, 0x52A9, 0x043F, 0x52AA, 0x0440,\n    0x52AB, 0x043E, 0x52AC, 0x0441, 0x52AD, 0x1838, 0x52AE, 0x1839,\n    0x52BB, 0x0556, 0x52BC, 0x1918, 0x52BE, 0x0555, 0x52C0, 0x1A6F,\n    0x52C1, 0x06CA, 0x52C2, 0x1A70, 0x52C3, 0x06C9, 0x52C7, 0x06C7,\n    0x52C9, 0x06C8, 0x52CD, 0x1C41, 0x52D2, 0x0A14, 0x52D3, 0x1E58,\n    0x52D5, 0x0A17, 0x52D6, 0x1E57, 0x52D7, 0x0ACF, 0x52D8, 0x0A16,\n    0x52D9, 0x0A15, 0x52DB, 0x0BF8, 0x52DD, 0x0BF7, 0x52DE, 0x0BF6,\n    0x52DF, 0x0DCD, 0x52E2, 0x0DD0, 0x52E3, 0x0DD1, 0x52E4, 0x0DCF,\n    0x52E6, 0x0DCE, 0x52E9, 0x2625, 0x52EB, 0x2626, 0x52EF, 0x288C,\n    0x52F0, 0x1111, 0x52F1, 0x288B, 0x52F3, 0x1294, 0x52F4, 0x2D40,\n    0x52F5, 0x13B8, 0x52F7, 0x307D, 0x52F8, 0x1609, 0x52F9, 0x0220,\n    0x52FA, 0x0276, 0x52FB, 0x02B4, 0x52FC, 0x1781, 0x52FE, 0x02B5,\n    0x52FF, 0x02B6, 0x5305, 0x030D, 0x5306, 0x030E, 0x5308, 0x0396,\n    0x5309, 0x183A, 0x530A, 0x1919, 0x530B, 0x191A, 0x530D, 0x06CB,\n    0x530E, 0x1C42, 0x530F, 0x0A19, 0x5310, 0x0A18, 0x5311, 0x20C0,\n    0x5312, 0x20BF, 0x5315, 0x0263, 0x5316, 0x02B7, 0x5317, 0x030F,\n    0x5319, 0x0A1A, 0x531A, 0x176F, 0x531C, 0x1798, 0x531D, 0x0310,\n    0x531F, 0x17CB, 0x5320, 0x0398, 0x5321, 0x0397, 0x5322, 0x17CA,\n    0x5323, 0x0442, 0x532A, 0x085F, 0x532D, 0x1E59, 0x532F, 0x0DD2,\n    0x5330, 0x2627, 0x5331, 0x0F8E, 0x5334, 0x2B06, 0x5337, 0x31C7,\n    0x5338, 0x0221, 0x5339, 0x02B8, 0x533C, 0x191B, 0x533D, 0x1A71,\n    0x533E, 0x0A1D, 0x533F, 0x0A1B, 0x5340, 0x0A1C, 0x5341, 0x0264,\n    0x5343, 0x0277, 0x5344, 0x016B, 0x5345, 0x02BB, 0x5347, 0x02BA,\n    0x5348, 0x02B9, 0x5349, 0x0313, 0x534A, 0x0312, 0x534C, 0x1799,\n    0x534D, 0x17CC, 0x5351, 0x055A, 0x5352, 0x0557, 0x5353, 0x0559,\n    0x5354, 0x0558, 0x5357, 0x06CC, 0x535A, 0x0BF9, 0x535C, 0x0265,\n    0x535E, 0x02BC, 0x5360, 0x0315, 0x5361, 0x0314, 0x5363, 0x183B,\n    0x5366, 0x055B, 0x5369, 0x0222, 0x536C, 0x1782, 0x536E, 0x0317,\n    0x536F, 0x0316, 0x5370, 0x0399, 0x5371, 0x039A, 0x5372, 0x183C,\n    0x5373, 0x0443, 0x5375, 0x0444, 0x5377, 0x055C, 0x5378, 0x055D,\n    0x5379, 0x055E, 0x537B, 0x06CD, 0x537C, 0x1A72, 0x537F, 0x0860,\n    0x5382, 0x1770, 0x5384, 0x02BD, 0x538A, 0x17CD, 0x538E, 0x183D,\n    0x538F, 0x183E, 0x5392, 0x191C, 0x5394, 0x191D, 0x5396, 0x1A74,\n    0x5397, 0x1A73, 0x5398, 0x1A76, 0x5399, 0x1A75, 0x539A, 0x06CE,\n    0x539C, 0x1E5A, 0x539D, 0x0862, 0x539E, 0x1C43, 0x539F, 0x0861,\n    0x53A4, 0x20C1, 0x53A5, 0x0BFA, 0x53A7, 0x20C2, 0x53AC, 0x2628,\n    0x53AD, 0x0F8F, 0x53B2, 0x1112, 0x53B4, 0x307E, 0x53B6, 0x0223,\n    0x53B9, 0x1783, 0x53BB, 0x0318, 0x53C3, 0x0A1E, 0x53C8, 0x0266,\n    0x53C9, 0x0278, 0x53CA, 0x02BF, 0x53CB, 0x02BE, 0x53CD, 0x02C0,\n    0x53D4, 0x0560, 0x53D6, 0x055F, 0x53D7, 0x0561, 0x53DB, 0x06CF,\n    0x53DF, 0x0863, 0x53E1, 0x2B07, 0x53E2, 0x14C9, 0x53E3, 0x0279,\n    0x53E4, 0x031A, 0x53E5, 0x0329, 0x53E6, 0x0324, 0x53E8, 0x031F,\n    0x53E9, 0x031E, 0x53EA, 0x0325, 0x53EB, 0x0323, 0x53EC, 0x031C,\n    0x53ED, 0x032A, 0x53EE, 0x031D, 0x53EF, 0x0319, 0x53F0, 0x0328,\n    0x53F1, 0x0327, 0x53F2, 0x0326, 0x53F3, 0x031B, 0x53F5, 0x0322,\n    0x53F8, 0x0321, 0x53FB, 0x032B, 0x53FC, 0x0320, 0x5401, 0x03A0,\n    0x5403, 0x03A6, 0x5404, 0x03A2, 0x5406, 0x03A8, 0x5407, 0x17CE,\n    0x5408, 0x03A5, 0x5409, 0x039B, 0x540A, 0x039E, 0x540B, 0x03A1,\n    0x540C, 0x039D, 0x540D, 0x03A4, 0x540E, 0x03A7, 0x540F, 0x039C,\n    0x5410, 0x039F, 0x5411, 0x03A3, 0x5412, 0x03A9, 0x5418, 0x1847,\n    0x5419, 0x1844, 0x541B, 0x0451, 0x541C, 0x1845, 0x541D, 0x0445,\n    0x541E, 0x0447, 0x541F, 0x045F, 0x5420, 0x045A, 0x5424, 0x184C,\n    0x5425, 0x1846, 0x5426, 0x0449, 0x5427, 0x044B, 0x5428, 0x184B,\n    0x5429, 0x0452, 0x542A, 0x1841, 0x542B, 0x045E, 0x542C, 0x0460,\n    0x542D, 0x0446, 0x542E, 0x0457, 0x5430, 0x183F, 0x5431, 0x045D,\n    0x5433, 0x044E, 0x5435, 0x0458, 0x5436, 0x0459, 0x5437, 0x1840,\n    0x5438, 0x0456, 0x5439, 0x0454, 0x543B, 0x0455, 0x543C, 0x045B,\n    0x543D, 0x1848, 0x543E, 0x0448, 0x5440, 0x045C, 0x5441, 0x184A,\n    0x5442, 0x0450, 0x5443, 0x044D, 0x5445, 0x1843, 0x5446, 0x044C,\n    0x5447, 0x184D, 0x5448, 0x044F, 0x544A, 0x0453, 0x544E, 0x044A,\n    0x544F, 0x1849, 0x5454, 0x1842, 0x5460, 0x192E, 0x5461, 0x192D,\n    0x5462, 0x0573, 0x5463, 0x1930, 0x5464, 0x1932, 0x5465, 0x1927,\n    0x5466, 0x192A, 0x5467, 0x1931, 0x5468, 0x0574, 0x546B, 0x1924,\n    0x546C, 0x1928, 0x546F, 0x192C, 0x5470, 0x1A85, 0x5471, 0x056F,\n    0x5472, 0x1A89, 0x5473, 0x0562, 0x5474, 0x1929, 0x5475, 0x0563,\n    0x5476, 0x0570, 0x5477, 0x0569, 0x5478, 0x0565, 0x547A, 0x1925,\n    0x547B, 0x0568, 0x547C, 0x056D, 0x547D, 0x0576, 0x547E, 0x1926,\n    0x547F, 0x191F, 0x5480, 0x0567, 0x5481, 0x1920, 0x5482, 0x1922,\n    0x5484, 0x056A, 0x5486, 0x056C, 0x5487, 0x191E, 0x5488, 0x1923,\n    0x548B, 0x0575, 0x548C, 0x0571, 0x548D, 0x192B, 0x548E, 0x0577,\n    0x5490, 0x056E, 0x5491, 0x1921, 0x5492, 0x056B, 0x5495, 0x0566,\n    0x5496, 0x0564, 0x5498, 0x192F, 0x549A, 0x0572, 0x54A0, 0x1A84,\n    0x54A1, 0x1A78, 0x54A2, 0x1A87, 0x54A5, 0x1A7A, 0x54A6, 0x06D6,\n    0x54A7, 0x06E4, 0x54A8, 0x06D2, 0x54A9, 0x06E3, 0x54AA, 0x06DB,\n    0x54AB, 0x06E0, 0x54AC, 0x06D0, 0x54AD, 0x1A79, 0x54AE, 0x1A7F,\n    0x54AF, 0x06DF, 0x54B0, 0x1A8B, 0x54B1, 0x06E1, 0x54B3, 0x06D7,\n    0x54B6, 0x1A81, 0x54B7, 0x1A7E, 0x54B8, 0x06D5, 0x54BA, 0x1A77,\n    0x54BB, 0x06E2, 0x54BC, 0x1A86, 0x54BD, 0x06DA, 0x54BE, 0x1A88,\n    0x54BF, 0x06E5, 0x54C0, 0x06D1, 0x54C1, 0x06DC, 0x54C2, 0x06D9,\n    0x54C3, 0x1A7C, 0x54C4, 0x06DD, 0x54C5, 0x1A82, 0x54C6, 0x1A83,\n    0x54C7, 0x06D8, 0x54C8, 0x06DE, 0x54C9, 0x06D4, 0x54CE, 0x06D3,\n    0x54CF, 0x1A7B, 0x54D6, 0x1A80, 0x54DE, 0x1A8A, 0x54E0, 0x1C57,\n    0x54E1, 0x0870, 0x54E2, 0x1C45, 0x54E4, 0x1C4A, 0x54E5, 0x0869,\n    0x54E6, 0x0874, 0x54E7, 0x1C48, 0x54E8, 0x0864, 0x54E9, 0x086E,\n    0x54EA, 0x0873, 0x54EB, 0x1C4F, 0x54ED, 0x086F, 0x54EE, 0x0872,\n    0x54F1, 0x1C52, 0x54F2, 0x086A, 0x54F3, 0x1C49, 0x54F7, 0x1C55,\n    0x54F8, 0x1C56, 0x54FA, 0x086C, 0x54FB, 0x1C54, 0x54FC, 0x0868,\n    0x54FD, 0x0877, 0x54FF, 0x1C4C, 0x5501, 0x0866, 0x5503, 0x1C59,\n    0x5504, 0x1C4D, 0x5505, 0x1C51, 0x5506, 0x086B, 0x5507, 0x0876,\n    0x5508, 0x1C4E, 0x5509, 0x0871, 0x550A, 0x1C53, 0x550B, 0x1C5A,\n    0x550C, 0x1E69, 0x550E, 0x1C58, 0x550F, 0x0878, 0x5510, 0x0865,\n    0x5511, 0x1C50, 0x5512, 0x1C47, 0x5514, 0x086D, 0x5517, 0x1C46,\n    0x551A, 0x1C4B, 0x5526, 0x1C44, 0x5527, 0x0875, 0x552A, 0x1E61,\n    0x552C, 0x0A31, 0x552D, 0x1E6F, 0x552E, 0x0A2F, 0x552F, 0x0A2C,\n    0x5530, 0x1E66, 0x5531, 0x0A28, 0x5532, 0x1E6A, 0x5533, 0x0A33,\n    0x5534, 0x1E60, 0x5535, 0x1E65, 0x5536, 0x1E64, 0x5537, 0x0867,\n    0x5538, 0x0A2E, 0x5539, 0x1E6D, 0x553B, 0x1E70, 0x553C, 0x1E5D,\n    0x553E, 0x0C0C, 0x5540, 0x1E71, 0x5541, 0x0A34, 0x5543, 0x0A26,\n    0x5544, 0x0A23, 0x5545, 0x1E68, 0x5546, 0x0A20, 0x5548, 0x1E6E,\n    0x554A, 0x0A27, 0x554B, 0x1E72, 0x554D, 0x1E5E, 0x554E, 0x1E6C,\n    0x554F, 0x0A2A, 0x5550, 0x1E5F, 0x5551, 0x1E62, 0x5552, 0x1E67,\n    0x5555, 0x0A2B, 0x5556, 0x0A29, 0x5557, 0x0A35, 0x555C, 0x0A30,\n    0x555E, 0x0A24, 0x555F, 0x0ABC, 0x5561, 0x0A25, 0x5562, 0x1E63,\n    0x5563, 0x0A32, 0x5564, 0x0A2D, 0x5565, 0x1E6B, 0x5566, 0x0A22,\n    0x556A, 0x0A21, 0x5575, 0x1E5B, 0x5576, 0x1E5C, 0x5577, 0x20C7,\n    0x557B, 0x0BFB, 0x557C, 0x0BFE, 0x557D, 0x20D2, 0x557E, 0x0C12,\n    0x557F, 0x20D5, 0x5580, 0x0BFC, 0x5581, 0x20CE, 0x5582, 0x0C02,\n    0x5583, 0x0C08, 0x5584, 0x0D1B, 0x5587, 0x0C06, 0x5588, 0x20CB,\n    0x5589, 0x0C13, 0x558A, 0x0BFF, 0x558B, 0x0C07, 0x558C, 0x20D3,\n    0x558D, 0x2387, 0x558E, 0x20D8, 0x558F, 0x20CC, 0x5591, 0x20C3,\n    0x5592, 0x20D0, 0x5593, 0x20CA, 0x5594, 0x0C05, 0x5595, 0x20D6,\n    0x5598, 0x0C01, 0x5599, 0x0C15, 0x559A, 0x0C0E, 0x559C, 0x0C03,\n    0x559D, 0x0C00, 0x559F, 0x0C0B, 0x55A1, 0x20D7, 0x55A2, 0x20C9,\n    0x55A3, 0x20CF, 0x55A4, 0x20D1, 0x55A5, 0x20C5, 0x55A6, 0x20D4,\n    0x55A7, 0x0BFD, 0x55A8, 0x20C4, 0x55AA, 0x0C04, 0x55AB, 0x0C14,\n    0x55AC, 0x0C10, 0x55AD, 0x20C6, 0x55AE, 0x0C0A, 0x55B1, 0x0C11,\n    0x55B2, 0x0C0D, 0x55B3, 0x0C09, 0x55B5, 0x20CD, 0x55BB, 0x0C0F,\n    0x55BF, 0x2385, 0x55C0, 0x2381, 0x55C2, 0x2390, 0x55C3, 0x237A,\n    0x55C4, 0x2383, 0x55C5, 0x0DE0, 0x55C6, 0x0DE1, 0x55C7, 0x0DD9,\n    0x55C8, 0x238C, 0x55C9, 0x0DE3, 0x55CA, 0x237F, 0x55CB, 0x237E,\n    0x55CC, 0x237C, 0x55CD, 0x238E, 0x55CE, 0x0DD7, 0x55CF, 0x2388,\n    0x55D0, 0x237D, 0x55D1, 0x0DDA, 0x55D2, 0x2386, 0x55D3, 0x0DD5,\n    0x55D4, 0x2382, 0x55D5, 0x2389, 0x55D6, 0x238B, 0x55D9, 0x238F,\n    0x55DA, 0x0DDE, 0x55DB, 0x237B, 0x55DC, 0x0DD8, 0x55DD, 0x2380,\n    0x55DF, 0x0DD3, 0x55E1, 0x0DDF, 0x55E2, 0x238A, 0x55E3, 0x0DDB,\n    0x55E4, 0x0DDC, 0x55E5, 0x0DE2, 0x55E6, 0x0DD6, 0x55E7, 0x011F,\n    0x55E8, 0x0DD4, 0x55E9, 0x2384, 0x55EF, 0x0DDD, 0x55F2, 0x238D,\n    0x55F6, 0x0F9F, 0x55F7, 0x0F9A, 0x55F9, 0x2637, 0x55FA, 0x2633,\n    0x55FC, 0x262D, 0x55FD, 0x0F94, 0x55FE, 0x0F90, 0x55FF, 0x2636,\n    0x5600, 0x0F91, 0x5601, 0x2630, 0x5602, 0x2632, 0x5604, 0x2635,\n    0x5606, 0x0F96, 0x5608, 0x0F9D, 0x5609, 0x0F97, 0x560C, 0x262B,\n    0x560D, 0x0F98, 0x560E, 0x0F99, 0x560F, 0x262E, 0x5610, 0x0F9E,\n    0x5612, 0x262C, 0x5613, 0x2631, 0x5614, 0x0F95, 0x5615, 0x262A,\n    0x5616, 0x0F9B, 0x5617, 0x0F93, 0x561B, 0x0F92, 0x561C, 0x262F,\n    0x561D, 0x2634, 0x561F, 0x0F9C, 0x5627, 0x2629, 0x5629, 0x1119,\n    0x562A, 0x289D, 0x562C, 0x289A, 0x562E, 0x1113, 0x562F, 0x111F,\n    0x5630, 0x1120, 0x5632, 0x1116, 0x5633, 0x2898, 0x5634, 0x1118,\n    0x5635, 0x2890, 0x5636, 0x111E, 0x5638, 0x289C, 0x5639, 0x1115,\n    0x563A, 0x289E, 0x563B, 0x1114, 0x563D, 0x2899, 0x563E, 0x289B,\n    0x563F, 0x1117, 0x5640, 0x2897, 0x5641, 0x2891, 0x5642, 0x288E,\n    0x5645, 0x20C8, 0x5646, 0x2894, 0x5648, 0x288D, 0x5649, 0x2893,\n    0x564A, 0x2892, 0x564C, 0x288F, 0x564E, 0x111B, 0x5653, 0x111A,\n    0x5657, 0x111C, 0x5658, 0x2895, 0x5659, 0x1295, 0x565A, 0x2896,\n    0x565E, 0x2B10, 0x5660, 0x2B09, 0x5662, 0x12A1, 0x5663, 0x2B0D,\n    0x5664, 0x1299, 0x5665, 0x129D, 0x5666, 0x2B0C, 0x5668, 0x129C,\n    0x5669, 0x1298, 0x566A, 0x129B, 0x566B, 0x1296, 0x566C, 0x12A0,\n    0x566D, 0x2B0E, 0x566E, 0x2B0A, 0x566F, 0x129F, 0x5670, 0x2B08,\n    0x5671, 0x129E, 0x5672, 0x2B0F, 0x5673, 0x2B0B, 0x5674, 0x111D,\n    0x5676, 0x12A2, 0x5677, 0x2B11, 0x5678, 0x129A, 0x5679, 0x1297,\n    0x567E, 0x2D47, 0x567F, 0x2D49, 0x5680, 0x13BA, 0x5681, 0x2D4A,\n    0x5682, 0x2D48, 0x5683, 0x2D46, 0x5684, 0x2D45, 0x5685, 0x13BC,\n    0x5686, 0x2D44, 0x5687, 0x13BD, 0x568C, 0x2D42, 0x568D, 0x2D43,\n    0x568E, 0x13B9, 0x568F, 0x13BE, 0x5690, 0x13BB, 0x5693, 0x2D41,\n    0x5695, 0x14CA, 0x5697, 0x2F13, 0x5698, 0x2F11, 0x5699, 0x2F16,\n    0x569A, 0x2F14, 0x569C, 0x2F12, 0x569D, 0x2F15, 0x56A5, 0x1576,\n    0x56A6, 0x3081, 0x56A7, 0x3082, 0x56A8, 0x1577, 0x56AA, 0x3083,\n    0x56AB, 0x307F, 0x56AC, 0x3084, 0x56AD, 0x3080, 0x56AE, 0x14CB,\n    0x56B2, 0x31C8, 0x56B3, 0x31CA, 0x56B4, 0x160C, 0x56B5, 0x31C9,\n    0x56B6, 0x160B, 0x56B7, 0x160A, 0x56BC, 0x160D, 0x56BD, 0x32CA,\n    0x56BE, 0x32CB, 0x56C0, 0x166B, 0x56C1, 0x166A, 0x56C2, 0x166C,\n    0x56C3, 0x32C9, 0x56C5, 0x3379, 0x56C6, 0x3378, 0x56C8, 0x16BD,\n    0x56C9, 0x16BF, 0x56CA, 0x16BE, 0x56CB, 0x337A, 0x56CC, 0x16F6,\n    0x56CD, 0x3481, 0x56D1, 0x171F, 0x56D3, 0x3480, 0x56D4, 0x34C9,\n    0x56D7, 0x1775, 0x56DA, 0x032D, 0x56DB, 0x032C, 0x56DD, 0x03AC,\n    0x56DE, 0x03AB, 0x56DF, 0x17D0, 0x56E0, 0x03AA, 0x56E1, 0x17CF,\n    0x56E4, 0x0463, 0x56E5, 0x1850, 0x56E7, 0x184F, 0x56EA, 0x0461,\n    0x56EB, 0x0464, 0x56EE, 0x184E, 0x56F0, 0x0462, 0x56F7, 0x1933,\n    0x56F9, 0x1934, 0x56FA, 0x0578, 0x56FF, 0x06E6, 0x5701, 0x1C5B,\n    0x5702, 0x1C5C, 0x5703, 0x0879, 0x5704, 0x087A, 0x5707, 0x1E74,\n    0x5708, 0x0A36, 0x5709, 0x0A38, 0x570A, 0x1E73, 0x570B, 0x0A37,\n    0x570C, 0x20D9, 0x570D, 0x0C16, 0x5712, 0x0DE4, 0x5713, 0x0DE5,\n    0x5714, 0x2391, 0x5716, 0x0FA1, 0x5718, 0x0FA0, 0x571A, 0x289F,\n    0x571B, 0x2B13, 0x571C, 0x2B12, 0x571E, 0x3505, 0x571F, 0x027A,\n    0x5720, 0x1784, 0x5722, 0x179A, 0x5723, 0x179B, 0x5728, 0x03AF,\n    0x5729, 0x03B3, 0x572A, 0x17D2, 0x572C, 0x03B1, 0x572D, 0x03B0,\n    0x572E, 0x17D1, 0x572F, 0x03B2, 0x5730, 0x03AE, 0x5733, 0x03AD,\n    0x5734, 0x17D3, 0x573B, 0x046E, 0x573E, 0x046B, 0x5740, 0x0467,\n    0x5741, 0x1851, 0x5745, 0x1852, 0x5747, 0x0469, 0x5749, 0x1854,\n    0x574A, 0x0465, 0x574B, 0x1855, 0x574C, 0x1853, 0x574D, 0x0468,\n    0x574E, 0x046A, 0x574F, 0x046D, 0x5750, 0x046C, 0x5751, 0x0466,\n    0x5752, 0x1856, 0x5761, 0x057D, 0x5762, 0x1941, 0x5764, 0x057F,\n    0x5766, 0x057E, 0x5768, 0x1942, 0x5769, 0x057C, 0x576A, 0x057B,\n    0x576B, 0x1938, 0x576D, 0x1937, 0x576F, 0x1935, 0x5770, 0x193A,\n    0x5771, 0x1939, 0x5772, 0x1936, 0x5773, 0x193F, 0x5774, 0x1940,\n    0x5775, 0x193D, 0x5776, 0x193B, 0x5777, 0x057A, 0x577B, 0x193E,\n    0x577C, 0x0580, 0x577D, 0x1943, 0x5780, 0x193C, 0x5782, 0x06E7,\n    0x5783, 0x0579, 0x578B, 0x06E8, 0x578C, 0x1A90, 0x578F, 0x1A96,\n    0x5793, 0x06EE, 0x5794, 0x1A94, 0x5795, 0x1A9A, 0x5797, 0x1A91,\n    0x5798, 0x1A95, 0x5799, 0x1A97, 0x579A, 0x1A99, 0x579B, 0x1A93,\n    0x579D, 0x1A92, 0x579E, 0x1A8D, 0x579F, 0x1A8E, 0x57A0, 0x06E9,\n    0x57A2, 0x06EB, 0x57A3, 0x06EA, 0x57A4, 0x1A8F, 0x57A5, 0x1A98,\n    0x57AE, 0x06ED, 0x57B5, 0x1A8C, 0x57B6, 0x1C66, 0x57B8, 0x1C65,\n    0x57B9, 0x1C6A, 0x57BA, 0x1C61, 0x57BC, 0x1C64, 0x57BD, 0x1C63,\n    0x57BF, 0x1C67, 0x57C1, 0x1C6B, 0x57C2, 0x087B, 0x57C3, 0x087E,\n    0x57C6, 0x1C62, 0x57C7, 0x1C68, 0x57CB, 0x087D, 0x57CC, 0x1C5D,\n    0x57CE, 0x06EC, 0x57CF, 0x1E82, 0x57D0, 0x1C69, 0x57D2, 0x1C60,\n    0x57D4, 0x087C, 0x57D5, 0x1C5F, 0x57DC, 0x1E79, 0x57DF, 0x0A39,\n    0x57E0, 0x0A3D, 0x57E1, 0x1E89, 0x57E2, 0x1E77, 0x57E3, 0x1E85,\n    0x57E4, 0x0A3E, 0x57E5, 0x1E87, 0x57E7, 0x1E8D, 0x57E9, 0x1E91,\n    0x57EC, 0x1E88, 0x57ED, 0x1E7C, 0x57EE, 0x1E84, 0x57F0, 0x1E92,\n    0x57F1, 0x1E90, 0x57F2, 0x1E86, 0x57F3, 0x1E81, 0x57F4, 0x1E7A,\n    0x57F5, 0x20E1, 0x57F6, 0x1E78, 0x57F7, 0x0A42, 0x57F8, 0x1E7F,\n    0x57F9, 0x0A43, 0x57FA, 0x0A3F, 0x57FB, 0x1E75, 0x57FC, 0x1E8B,\n    0x57FD, 0x1E7D, 0x5800, 0x1E7B, 0x5801, 0x1E8E, 0x5802, 0x0A40,\n    0x5804, 0x1E94, 0x5805, 0x0A3A, 0x5806, 0x0A3C, 0x5807, 0x1E83,\n    0x5808, 0x1E7E, 0x5809, 0x087F, 0x580A, 0x0A3B, 0x580B, 0x1E80,\n    0x580C, 0x1E8F, 0x580D, 0x1E93, 0x580E, 0x1E8A, 0x5810, 0x1E8C,\n    0x5814, 0x1E76, 0x5819, 0x20DC, 0x581B, 0x20E5, 0x581C, 0x20E4,\n    0x581D, 0x0C1E, 0x581E, 0x20DD, 0x5820, 0x0C1F, 0x5821, 0x0C1D,\n    0x5823, 0x20DF, 0x5824, 0x0C1A, 0x5825, 0x20E3, 0x5827, 0x20DE,\n    0x5828, 0x20E0, 0x5829, 0x20DA, 0x582A, 0x0C18, 0x582C, 0x20ED,\n    0x582D, 0x20EC, 0x582E, 0x20E9, 0x582F, 0x0C17, 0x5830, 0x0C1B,\n    0x5831, 0x0C1C, 0x5832, 0x1C5E, 0x5833, 0x20E6, 0x5834, 0x0C19,\n    0x5835, 0x0A41, 0x5836, 0x20E8, 0x5837, 0x20DB, 0x5838, 0x20EB,\n    0x5839, 0x20EA, 0x583B, 0x20EE, 0x583D, 0x239F, 0x583F, 0x20E7,\n    0x5848, 0x20E2, 0x5849, 0x2397, 0x584A, 0x0DEF, 0x584B, 0x0DF2,\n    0x584C, 0x0DED, 0x584D, 0x2396, 0x584E, 0x239A, 0x584F, 0x2395,\n    0x5851, 0x0DE7, 0x5852, 0x0DF1, 0x5853, 0x2392, 0x5854, 0x0DEB,\n    0x5855, 0x2399, 0x5857, 0x0DE9, 0x5858, 0x0DE8, 0x5859, 0x239C,\n    0x585A, 0x0DEA, 0x585B, 0x239E, 0x585D, 0x239B, 0x585E, 0x0DE6,\n    0x5862, 0x0DF0, 0x5863, 0x23A0, 0x5864, 0x2394, 0x5865, 0x239D,\n    0x5868, 0x2393, 0x586B, 0x0DEC, 0x586D, 0x0DEE, 0x586F, 0x2398,\n    0x5871, 0x23A1, 0x5874, 0x263F, 0x5875, 0x0FA2, 0x5876, 0x2645,\n    0x5879, 0x0FA7, 0x587A, 0x2641, 0x587B, 0x2648, 0x587C, 0x2639,\n    0x587D, 0x0FA9, 0x587E, 0x0FA3, 0x587F, 0x263E, 0x5880, 0x1121,\n    0x5881, 0x263D, 0x5882, 0x2646, 0x5883, 0x0FA4, 0x5885, 0x0FA8,\n    0x5886, 0x263C, 0x5887, 0x2642, 0x5888, 0x2647, 0x5889, 0x2638,\n    0x588A, 0x0FA6, 0x588B, 0x2640, 0x588E, 0x2644, 0x588F, 0x264A,\n    0x5890, 0x263A, 0x5891, 0x2643, 0x5893, 0x0FA5, 0x5894, 0x2649,\n    0x5898, 0x263B, 0x589C, 0x1125, 0x589D, 0x28A1, 0x589E, 0x1123,\n    0x589F, 0x1122, 0x58A0, 0x28A3, 0x58A1, 0x28A8, 0x58A3, 0x28A4,\n    0x58A5, 0x28A7, 0x58A6, 0x1128, 0x58A8, 0x1288, 0x58A9, 0x1127,\n    0x58AB, 0x28A0, 0x58AC, 0x28A6, 0x58AE, 0x1126, 0x58AF, 0x28A5,\n    0x58B1, 0x28A2, 0x58B3, 0x1124, 0x58BA, 0x2B18, 0x58BB, 0x36EB,\n    0x58BC, 0x2B1A, 0x58BD, 0x2B15, 0x58BE, 0x12A4, 0x58BF, 0x2B17,\n    0x58C1, 0x12A3, 0x58C2, 0x2B19, 0x58C5, 0x12A6, 0x58C6, 0x2B1B,\n    0x58C7, 0x12A5, 0x58C8, 0x2B14, 0x58C9, 0x2B16, 0x58CE, 0x13C2,\n    0x58CF, 0x2D4D, 0x58D1, 0x13C1, 0x58D2, 0x2D4E, 0x58D3, 0x13C0,\n    0x58D4, 0x2D4C, 0x58D5, 0x13BF, 0x58D6, 0x2D4B, 0x58D8, 0x14CD,\n    0x58D9, 0x14CC, 0x58DA, 0x3085, 0x58DB, 0x3087, 0x58DD, 0x3086,\n    0x58DE, 0x1578, 0x58DF, 0x1579, 0x58E2, 0x157A, 0x58E3, 0x31CB,\n    0x58E4, 0x160E, 0x58E7, 0x3411, 0x58E8, 0x3410, 0x58E9, 0x1720,\n    0x58EB, 0x027B, 0x58EC, 0x02C1, 0x58EF, 0x046F, 0x58F4, 0x1A9B,\n    0x58F9, 0x0C20, 0x58FA, 0x0C21, 0x58FC, 0x23A2, 0x58FD, 0x0FAA,\n    0x58FE, 0x264B, 0x58FF, 0x28A9, 0x5902, 0x0224, 0x5903, 0x1785,\n    0x5906, 0x1857, 0x590A, 0x0224, 0x590C, 0x1944, 0x590D, 0x1A9C,\n    0x590E, 0x1C6C, 0x590F, 0x0880, 0x5912, 0x3088, 0x5914, 0x166D,\n    0x5915, 0x027C, 0x5916, 0x032E, 0x5917, 0x179C, 0x5919, 0x03B4,\n    0x591A, 0x03B5, 0x591C, 0x0581, 0x5920, 0x0A44, 0x5922, 0x0FAC,\n    0x5924, 0x0FAD, 0x5925, 0x0FAB, 0x5927, 0x027D, 0x5929, 0x02C2,\n    0x592A, 0x02C4, 0x592B, 0x02C3, 0x592C, 0x1786, 0x592D, 0x02C5,\n    0x592E, 0x032F, 0x592F, 0x179D, 0x5931, 0x0330, 0x5937, 0x03B6,\n    0x5938, 0x03B7, 0x593C, 0x17D4, 0x593E, 0x0470, 0x5940, 0x1858,\n    0x5944, 0x0585, 0x5945, 0x1945, 0x5947, 0x0583, 0x5948, 0x0584,\n    0x5949, 0x0582, 0x594A, 0x1C6D, 0x594E, 0x06F2, 0x594F, 0x06F1,\n    0x5950, 0x06F3, 0x5951, 0x06F0, 0x5953, 0x1A9D, 0x5954, 0x0586,\n    0x5955, 0x06EF, 0x5957, 0x0881, 0x5958, 0x0882, 0x595A, 0x0883,\n    0x595C, 0x1E95, 0x5960, 0x0C22, 0x5961, 0x20EF, 0x5962, 0x0A45,\n    0x5967, 0x0DF3, 0x5969, 0x0FAF, 0x596A, 0x0FAE, 0x596B, 0x264C,\n    0x596D, 0x1129, 0x596E, 0x12A7, 0x5970, 0x2F17, 0x5971, 0x337B,\n    0x5972, 0x3412, 0x5973, 0x027E, 0x5974, 0x0331, 0x5976, 0x0332,\n    0x5977, 0x17DA, 0x5978, 0x03B9, 0x5979, 0x03BC, 0x597B, 0x17D8,\n    0x597C, 0x17D6, 0x597D, 0x03BB, 0x597E, 0x17D9, 0x597F, 0x17DB,\n    0x5980, 0x17D5, 0x5981, 0x03BE, 0x5982, 0x03BD, 0x5983, 0x03BA,\n    0x5984, 0x03B8, 0x5985, 0x17D7, 0x598A, 0x047B, 0x598D, 0x0478,\n    0x598E, 0x185D, 0x598F, 0x1860, 0x5990, 0x185F, 0x5992, 0x0472,\n    0x5993, 0x047A, 0x5996, 0x0477, 0x5997, 0x185C, 0x5998, 0x185A,\n    0x5999, 0x0476, 0x599D, 0x0471, 0x599E, 0x0474, 0x59A0, 0x185B,\n    0x59A1, 0x1862, 0x59A2, 0x185E, 0x59A3, 0x0475, 0x59A4, 0x0479,\n    0x59A5, 0x047C, 0x59A6, 0x1859, 0x59A7, 0x1861, 0x59A8, 0x0473,\n    0x59AE, 0x058B, 0x59AF, 0x0593, 0x59B1, 0x1951, 0x59B2, 0x194A,\n    0x59B3, 0x0594, 0x59B4, 0x1955, 0x59B5, 0x1946, 0x59B6, 0x194D,\n    0x59B9, 0x058A, 0x59BA, 0x1947, 0x59BB, 0x0588, 0x59BC, 0x194E,\n    0x59BD, 0x1952, 0x59BE, 0x0587, 0x59C0, 0x1953, 0x59C1, 0x194C,\n    0x59C3, 0x194F, 0x59C5, 0x0596, 0x59C6, 0x058D, 0x59C7, 0x1956,\n    0x59C8, 0x1954, 0x59CA, 0x0592, 0x59CB, 0x0590, 0x59CC, 0x194B,\n    0x59CD, 0x058F, 0x59CE, 0x1949, 0x59CF, 0x1948, 0x59D0, 0x058E,\n    0x59D1, 0x058C, 0x59D2, 0x0595, 0x59D3, 0x0591, 0x59D4, 0x0589,\n    0x59D6, 0x1950, 0x59D8, 0x06F5, 0x59DA, 0x06FC, 0x59DB, 0x1AAB,\n    0x59DC, 0x06F4, 0x59DD, 0x1AA3, 0x59DE, 0x1A9F, 0x59E0, 0x1AAF,\n    0x59E1, 0x1A9E, 0x59E3, 0x06F7, 0x59E4, 0x1AA8, 0x59E5, 0x06FA,\n    0x59E6, 0x06FD, 0x59E8, 0x06F8, 0x59E9, 0x1AAC, 0x59EA, 0x06FB,\n    0x59EC, 0x088A, 0x59ED, 0x1AB2, 0x59EE, 0x1AA0, 0x59F1, 0x1AA2,\n    0x59F2, 0x1AA9, 0x59F3, 0x1AAD, 0x59F4, 0x1AB1, 0x59F5, 0x1AAE,\n    0x59F6, 0x1AA7, 0x59F7, 0x1AAA, 0x59FA, 0x1AA4, 0x59FB, 0x06FF,\n    0x59FC, 0x1AA6, 0x59FD, 0x1AA5, 0x59FE, 0x1AB0, 0x59FF, 0x06F6,\n    0x5A00, 0x1AA1, 0x5A01, 0x06FE, 0x5A03, 0x06F9, 0x5A09, 0x0890,\n    0x5A0A, 0x1C75, 0x5A0C, 0x088F, 0x5A0F, 0x1C73, 0x5A11, 0x0884,\n    0x5A13, 0x0889, 0x5A15, 0x1C72, 0x5A16, 0x1C6F, 0x5A17, 0x1C74,\n    0x5A18, 0x0885, 0x5A19, 0x1C6E, 0x5A1B, 0x0888, 0x5A1C, 0x0886,\n    0x5A1E, 0x1C76, 0x5A1F, 0x0887, 0x5A20, 0x088B, 0x5A23, 0x088C,\n    0x5A25, 0x088E, 0x5A29, 0x088D, 0x5A2D, 0x1C70, 0x5A2E, 0x1C71,\n    0x5A33, 0x1C77, 0x5A35, 0x1E9C, 0x5A36, 0x0A46, 0x5A37, 0x20FD,\n    0x5A38, 0x1E9B, 0x5A39, 0x1EAE, 0x5A3C, 0x0A4C, 0x5A3E, 0x1EAC,\n    0x5A40, 0x0A4B, 0x5A41, 0x0A47, 0x5A42, 0x1EB5, 0x5A43, 0x1EA5,\n    0x5A44, 0x1EA8, 0x5A46, 0x0A4F, 0x5A47, 0x1EB2, 0x5A48, 0x1EAA,\n    0x5A49, 0x0A48, 0x5A4A, 0x0A50, 0x5A4C, 0x1EAF, 0x5A4D, 0x1EAD,\n    0x5A50, 0x1E9E, 0x5A51, 0x1EB3, 0x5A52, 0x1EA7, 0x5A53, 0x1EA2,\n    0x5A55, 0x1E98, 0x5A56, 0x1EB4, 0x5A57, 0x1EA4, 0x5A58, 0x1E97,\n    0x5A5A, 0x0A4E, 0x5A5B, 0x1EA9, 0x5A5C, 0x1EB6, 0x5A5D, 0x1EA6,\n    0x5A5E, 0x1E9A, 0x5A5F, 0x1E9F, 0x5A60, 0x1E96, 0x5A62, 0x0A4D,\n    0x5A64, 0x1EA3, 0x5A65, 0x1EA0, 0x5A66, 0x0A49, 0x5A67, 0x1E99,\n    0x5A69, 0x1EB1, 0x5A6A, 0x0A4A, 0x5A6C, 0x1EA1, 0x5A6D, 0x1E9D,\n    0x5A70, 0x1EB0, 0x5A77, 0x0C23, 0x5A78, 0x20F6, 0x5A7A, 0x20F3,\n    0x5A7B, 0x2104, 0x5A7C, 0x20F8, 0x5A7D, 0x2105, 0x5A7F, 0x0C25,\n    0x5A83, 0x2101, 0x5A84, 0x20FE, 0x5A8A, 0x20FF, 0x5A8B, 0x2102,\n    0x5A8C, 0x2106, 0x5A8E, 0x1EAB, 0x5A8F, 0x2108, 0x5A90, 0x23B6,\n    0x5A92, 0x0C26, 0x5A93, 0x2109, 0x5A94, 0x20F1, 0x5A95, 0x20FB,\n    0x5A97, 0x2100, 0x5A9A, 0x0C24, 0x5A9B, 0x0C27, 0x5A9C, 0x2107,\n    0x5A9D, 0x210A, 0x5A9E, 0x20F5, 0x5A9F, 0x20F2, 0x5AA2, 0x20F4,\n    0x5AA5, 0x20F9, 0x5AA6, 0x20F7, 0x5AA7, 0x0C28, 0x5AA9, 0x2103,\n    0x5AAC, 0x20FA, 0x5AAE, 0x20FC, 0x5AAF, 0x20F0, 0x5AB0, 0x23AA,\n    0x5AB1, 0x23A8, 0x5AB2, 0x0DFC, 0x5AB3, 0x0DFA, 0x5AB4, 0x23B2,\n    0x5AB5, 0x23A9, 0x5AB6, 0x23B3, 0x5AB7, 0x23AF, 0x5AB8, 0x23A7,\n    0x5AB9, 0x23B5, 0x5ABA, 0x23A6, 0x5ABB, 0x23AD, 0x5ABC, 0x0DF9,\n    0x5ABD, 0x0DF8, 0x5ABE, 0x0DF7, 0x5ABF, 0x23AB, 0x5AC0, 0x23B0,\n    0x5AC1, 0x0DF4, 0x5AC2, 0x0DFB, 0x5AC4, 0x23A4, 0x5AC6, 0x23AE,\n    0x5AC7, 0x23A3, 0x5AC8, 0x23AC, 0x5AC9, 0x0DF5, 0x5ACA, 0x23B1,\n    0x5ACB, 0x23A5, 0x5ACC, 0x0DF6, 0x5ACD, 0x23B4, 0x5AD5, 0x2650,\n    0x5AD6, 0x0FB4, 0x5AD7, 0x0FB3, 0x5AD8, 0x0FB5, 0x5AD9, 0x265C,\n    0x5ADA, 0x2652, 0x5ADB, 0x2658, 0x5ADC, 0x264D, 0x5ADD, 0x265B,\n    0x5ADE, 0x265A, 0x5ADF, 0x265E, 0x5AE0, 0x2657, 0x5AE1, 0x0FB0,\n    0x5AE2, 0x2656, 0x5AE3, 0x0FB6, 0x5AE5, 0x264F, 0x5AE6, 0x0FB1,\n    0x5AE8, 0x265D, 0x5AE9, 0x0FB2, 0x5AEA, 0x2651, 0x5AEB, 0x2654,\n    0x5AEC, 0x2659, 0x5AED, 0x2653, 0x5AEE, 0x264E, 0x5AF3, 0x2655,\n    0x5AF4, 0x28AB, 0x5AF5, 0x112D, 0x5AF6, 0x28AE, 0x5AF7, 0x28AD,\n    0x5AF8, 0x28B0, 0x5AF9, 0x28B2, 0x5AFA, 0x36EE, 0x5AFB, 0x112B,\n    0x5AFD, 0x28AC, 0x5AFF, 0x28AA, 0x5B01, 0x28B3, 0x5B02, 0x28B1,\n    0x5B03, 0x28AF, 0x5B05, 0x28B5, 0x5B07, 0x28B4, 0x5B08, 0x112F,\n    0x5B09, 0x112A, 0x5B0B, 0x112C, 0x5B0C, 0x112E, 0x5B0F, 0x28B6,\n    0x5B10, 0x2B22, 0x5B13, 0x2B21, 0x5B14, 0x2B20, 0x5B16, 0x2B23,\n    0x5B17, 0x2B1C, 0x5B19, 0x2B1D, 0x5B1A, 0x2B25, 0x5B1B, 0x2B1E,\n    0x5B1D, 0x12A8, 0x5B1E, 0x2B27, 0x5B20, 0x2B26, 0x5B21, 0x2B1F,\n    0x5B23, 0x2D52, 0x5B24, 0x13C5, 0x5B25, 0x2D50, 0x5B26, 0x2D55,\n    0x5B27, 0x2D54, 0x5B28, 0x2B24, 0x5B2A, 0x13C4, 0x5B2C, 0x2D53,\n    0x5B2D, 0x2D4F, 0x5B2E, 0x2D57, 0x5B2F, 0x2D56, 0x5B30, 0x13C3,\n    0x5B32, 0x2D51, 0x5B34, 0x12A9, 0x5B38, 0x14CE, 0x5B3C, 0x2F18,\n    0x5B3D, 0x3089, 0x5B3E, 0x308A, 0x5B3F, 0x308B, 0x5B40, 0x160F,\n    0x5B43, 0x1610, 0x5B45, 0x31CC, 0x5B47, 0x32CD, 0x5B48, 0x32CC,\n    0x5B4B, 0x337C, 0x5B4C, 0x337D, 0x5B4D, 0x3413, 0x5B4E, 0x3482,\n    0x5B50, 0x027F, 0x5B51, 0x0280, 0x5B53, 0x0281, 0x5B54, 0x02C6,\n    0x5B55, 0x0333, 0x5B56, 0x17DC, 0x5B57, 0x03BF, 0x5B58, 0x03C0,\n    0x5B5A, 0x047F, 0x5B5B, 0x0480, 0x5B5C, 0x047E, 0x5B5D, 0x047D,\n    0x5B5F, 0x0597, 0x5B62, 0x1957, 0x5B63, 0x0599, 0x5B64, 0x0598,\n    0x5B65, 0x1958, 0x5B69, 0x0700, 0x5B6B, 0x0891, 0x5B6C, 0x1C78,\n    0x5B6E, 0x1EB8, 0x5B70, 0x0A51, 0x5B71, 0x0C2A, 0x5B72, 0x1EB7,\n    0x5B73, 0x0C29, 0x5B75, 0x0FB7, 0x5B77, 0x265F, 0x5B78, 0x12AA,\n    0x5B7A, 0x13C6, 0x5B7B, 0x2D58, 0x5B7D, 0x1611, 0x5B7F, 0x16C0,\n    0x5B80, 0x0225, 0x5B81, 0x179E, 0x5B83, 0x0334, 0x5B84, 0x179F,\n    0x5B85, 0x03C3, 0x5B87, 0x03C1, 0x5B88, 0x03C2, 0x5B89, 0x03C4,\n    0x5B8B, 0x0482, 0x5B8C, 0x0481, 0x5B8E, 0x1863, 0x5B8F, 0x0483,\n    0x5B92, 0x1864, 0x5B93, 0x1959, 0x5B95, 0x195A, 0x5B97, 0x059A,\n    0x5B98, 0x059C, 0x5B99, 0x059E, 0x5B9A, 0x059B, 0x5B9B, 0x059F,\n    0x5B9C, 0x059D, 0x5BA2, 0x0704, 0x5BA3, 0x0701, 0x5BA4, 0x0703,\n    0x5BA5, 0x0705, 0x5BA6, 0x0702, 0x5BA7, 0x1C79, 0x5BA8, 0x1AB3,\n    0x5BAC, 0x1C7B, 0x5BAD, 0x1C7A, 0x5BAE, 0x0897, 0x5BB0, 0x0893,\n    0x5BB3, 0x0894, 0x5BB4, 0x0896, 0x5BB5, 0x0898, 0x5BB6, 0x0895,\n    0x5BB8, 0x089A, 0x5BB9, 0x0899, 0x5BBF, 0x0A56, 0x5BC0, 0x1EBA,\n    0x5BC1, 0x1EB9, 0x5BC2, 0x0A55, 0x5BC4, 0x0A54, 0x5BC5, 0x0A53,\n    0x5BC6, 0x0A57, 0x5BC7, 0x0A52, 0x5BCA, 0x2110, 0x5BCB, 0x210D,\n    0x5BCC, 0x0C2C, 0x5BCD, 0x210C, 0x5BCE, 0x2111, 0x5BD0, 0x0C2E,\n    0x5BD1, 0x210F, 0x5BD2, 0x0C2B, 0x5BD3, 0x0C2D, 0x5BD4, 0x210E,\n    0x5BD6, 0x23B7, 0x5BD8, 0x23B8, 0x5BD9, 0x23B9, 0x5BDE, 0x0FB8,\n    0x5BDF, 0x0FC0, 0x5BE0, 0x2660, 0x5BE1, 0x0FBA, 0x5BE2, 0x0FBE,\n    0x5BE3, 0x2661, 0x5BE4, 0x0FBF, 0x5BE5, 0x0FBB, 0x5BE6, 0x0FBC,\n    0x5BE7, 0x0FB9, 0x5BE8, 0x0FBD, 0x5BE9, 0x1132, 0x5BEA, 0x210B,\n    0x5BEB, 0x1133, 0x5BEC, 0x1131, 0x5BEE, 0x1130, 0x5BEF, 0x2B28,\n    0x5BF0, 0x12AB, 0x5BF1, 0x2D59, 0x5BF2, 0x2D5A, 0x5BF5, 0x157B,\n    0x5BF6, 0x1612, 0x5BF8, 0x0282, 0x5BFA, 0x03C5, 0x5C01, 0x0706,\n    0x5C03, 0x1C7C, 0x5C04, 0x089B, 0x5C07, 0x0A5A, 0x5C08, 0x0A59,\n    0x5C09, 0x0A58, 0x5C0A, 0x0C2F, 0x5C0B, 0x0C30, 0x5C0C, 0x2112,\n    0x5C0D, 0x0FC1, 0x5C0E, 0x12AC, 0x5C0F, 0x0283, 0x5C10, 0x1787,\n    0x5C11, 0x02C7, 0x5C12, 0x17A0, 0x5C15, 0x17DD, 0x5C16, 0x03C6,\n    0x5C1A, 0x05A0, 0x5C1F, 0x23BA, 0x5C22, 0x0284, 0x5C24, 0x02C8,\n    0x5C25, 0x17DE, 0x5C28, 0x1865, 0x5C2A, 0x1866, 0x5C2C, 0x0484,\n    0x5C30, 0x2113, 0x5C31, 0x0C31, 0x5C33, 0x23BB, 0x5C37, 0x13C7,\n    0x5C38, 0x0285, 0x5C39, 0x0299, 0x5C3A, 0x02C9, 0x5C3B, 0x17A1,\n    0x5C3C, 0x0335, 0x5C3E, 0x0488, 0x5C3F, 0x0487, 0x5C40, 0x0485,\n    0x5C41, 0x0486, 0x5C44, 0x195B, 0x5C45, 0x05A2, 0x5C46, 0x05A3,\n    0x5C47, 0x195C, 0x5C48, 0x05A1, 0x5C4B, 0x070A, 0x5C4C, 0x1AB4,\n    0x5C4D, 0x0709, 0x5C4E, 0x0707, 0x5C4F, 0x0708, 0x5C50, 0x089E,\n    0x5C51, 0x089C, 0x5C54, 0x1C7E, 0x5C55, 0x089D, 0x5C56, 0x1C7D,\n    0x5C58, 0x0892, 0x5C59, 0x1EBB, 0x5C5C, 0x0A5C, 0x5C5D, 0x0A5D,\n    0x5C60, 0x0A5B, 0x5C62, 0x0FC2, 0x5C63, 0x2662, 0x5C64, 0x1134,\n    0x5C65, 0x1135, 0x5C67, 0x28B7, 0x5C68, 0x13C8, 0x5C69, 0x2F19,\n    0x5C6A, 0x2F1A, 0x5C6C, 0x166E, 0x5C6D, 0x3483, 0x5C6E, 0x1776,\n    0x5C6F, 0x02CA, 0x5C71, 0x0286, 0x5C73, 0x17A3, 0x5C74, 0x17A2,\n    0x5C79, 0x03C7, 0x5C7A, 0x17E0, 0x5C7B, 0x17E1, 0x5C7C, 0x17DF,\n    0x5C7E, 0x17E2, 0x5C86, 0x186E, 0x5C88, 0x1869, 0x5C89, 0x186B,\n    0x5C8A, 0x186D, 0x5C8B, 0x186A, 0x5C8C, 0x048C, 0x5C8D, 0x1867,\n    0x5C8F, 0x1868, 0x5C90, 0x0489, 0x5C91, 0x048A, 0x5C92, 0x186C,\n    0x5C93, 0x186F, 0x5C94, 0x048B, 0x5C95, 0x1870, 0x5C9D, 0x196A,\n    0x5C9F, 0x1964, 0x5CA0, 0x195F, 0x5CA1, 0x05A5, 0x5CA2, 0x1967,\n    0x5CA3, 0x1965, 0x5CA4, 0x195E, 0x5CA5, 0x196B, 0x5CA6, 0x196E,\n    0x5CA7, 0x1969, 0x5CA8, 0x1962, 0x5CA9, 0x05A7, 0x5CAA, 0x1968,\n    0x5CAB, 0x05A8, 0x5CAC, 0x1963, 0x5CAD, 0x1966, 0x5CAE, 0x195D,\n    0x5CAF, 0x1961, 0x5CB0, 0x196D, 0x5CB1, 0x05A9, 0x5CB3, 0x05AA,\n    0x5CB5, 0x1960, 0x5CB6, 0x196C, 0x5CB7, 0x05A4, 0x5CB8, 0x05A6,\n    0x5CC6, 0x1AC5, 0x5CC7, 0x1ABE, 0x5CC8, 0x1AC4, 0x5CC9, 0x1ABD,\n    0x5CCA, 0x1ABF, 0x5CCB, 0x1AB9, 0x5CCC, 0x1AB7, 0x5CCE, 0x1AC6,\n    0x5CCF, 0x1AC3, 0x5CD0, 0x1AB5, 0x5CD2, 0x070C, 0x5CD3, 0x1AC1,\n    0x5CD4, 0x1AC2, 0x5CD6, 0x1AC0, 0x5CD7, 0x1AB8, 0x5CD8, 0x1AB6,\n    0x5CD9, 0x070B, 0x5CDA, 0x1ABC, 0x5CDB, 0x1ABA, 0x5CDE, 0x1ABB,\n    0x5CDF, 0x1AC7, 0x5CE8, 0x08A3, 0x5CEA, 0x08A2, 0x5CEC, 0x1C7F,\n    0x5CED, 0x089F, 0x5CEE, 0x1C81, 0x5CF0, 0x08A4, 0x5CF1, 0x1C82,\n    0x5CF4, 0x08A7, 0x5CF6, 0x08A5, 0x5CF7, 0x1C83, 0x5CF8, 0x1AC8,\n    0x5CF9, 0x1C85, 0x5CFB, 0x08A1, 0x5CFD, 0x08A0, 0x5CFF, 0x1C80,\n    0x5D00, 0x1C84, 0x5D01, 0x08A6, 0x5D06, 0x0A5F, 0x5D07, 0x0A5E,\n    0x5D0B, 0x1EBD, 0x5D0C, 0x1EC1, 0x5D0D, 0x1EC3, 0x5D0E, 0x0A60,\n    0x5D0F, 0x1EC6, 0x5D11, 0x0A64, 0x5D12, 0x1EC8, 0x5D14, 0x0A66,\n    0x5D16, 0x0A62, 0x5D17, 0x0A6A, 0x5D19, 0x0A67, 0x5D1A, 0x1EBF,\n    0x5D1B, 0x0A61, 0x5D1D, 0x1EBE, 0x5D1E, 0x1EBC, 0x5D1F, 0x1ECA,\n    0x5D20, 0x1EC0, 0x5D22, 0x0A63, 0x5D23, 0x1EC9, 0x5D24, 0x0A68,\n    0x5D25, 0x1EC5, 0x5D26, 0x1EC4, 0x5D27, 0x0A69, 0x5D28, 0x1EC2,\n    0x5D29, 0x0A65, 0x5D2E, 0x1ECB, 0x5D30, 0x1EC7, 0x5D31, 0x2122,\n    0x5D32, 0x2129, 0x5D33, 0x211E, 0x5D34, 0x0C34, 0x5D35, 0x211A,\n    0x5D36, 0x212A, 0x5D37, 0x2114, 0x5D38, 0x2127, 0x5D39, 0x2125,\n    0x5D3A, 0x211F, 0x5D3C, 0x2128, 0x5D3D, 0x2121, 0x5D3F, 0x2119,\n    0x5D40, 0x212B, 0x5D41, 0x2117, 0x5D42, 0x2124, 0x5D43, 0x2115,\n    0x5D45, 0x212C, 0x5D47, 0x0C35, 0x5D49, 0x2126, 0x5D4A, 0x23BE,\n    0x5D4B, 0x2118, 0x5D4C, 0x0C32, 0x5D4E, 0x211C, 0x5D50, 0x0C33,\n    0x5D51, 0x211B, 0x5D52, 0x2120, 0x5D55, 0x211D, 0x5D59, 0x2123,\n    0x5D5E, 0x23C2, 0x5D62, 0x23C5, 0x5D63, 0x23BD, 0x5D65, 0x23BF,\n    0x5D67, 0x23C4, 0x5D68, 0x23C3, 0x5D69, 0x0DFD, 0x5D6B, 0x2116,\n    0x5D6C, 0x23C1, 0x5D6F, 0x0DFE, 0x5D71, 0x23BC, 0x5D72, 0x23C0,\n    0x5D77, 0x2669, 0x5D79, 0x2670, 0x5D7A, 0x2667, 0x5D7C, 0x266E,\n    0x5D7D, 0x2665, 0x5D7E, 0x266D, 0x5D7F, 0x2671, 0x5D80, 0x2664,\n    0x5D81, 0x2668, 0x5D82, 0x2663, 0x5D84, 0x0FC3, 0x5D86, 0x2666,\n    0x5D87, 0x0FC4, 0x5D88, 0x266C, 0x5D89, 0x266B, 0x5D8A, 0x266A,\n    0x5D8D, 0x266F, 0x5D92, 0x28BB, 0x5D93, 0x28BD, 0x5D94, 0x1137,\n    0x5D95, 0x28BE, 0x5D97, 0x28B9, 0x5D99, 0x28B8, 0x5D9A, 0x28C2,\n    0x5D9C, 0x28C0, 0x5D9D, 0x1136, 0x5D9E, 0x28C3, 0x5D9F, 0x28BA,\n    0x5DA0, 0x28BF, 0x5DA1, 0x28C1, 0x5DA2, 0x28BC, 0x5DA7, 0x2B2C,\n    0x5DA8, 0x2B31, 0x5DA9, 0x2B2B, 0x5DAA, 0x2B30, 0x5DAC, 0x2B29,\n    0x5DAD, 0x2B33, 0x5DAE, 0x2B2F, 0x5DAF, 0x2B34, 0x5DB0, 0x2B2E,\n    0x5DB1, 0x2B2A, 0x5DB2, 0x2B32, 0x5DB4, 0x2B35, 0x5DB5, 0x2B2D,\n    0x5DB7, 0x2D5B, 0x5DB8, 0x13CC, 0x5DBA, 0x13CA, 0x5DBC, 0x13C9,\n    0x5DBD, 0x13CB, 0x5DC0, 0x2F1B, 0x5DC2, 0x3023, 0x5DC3, 0x308C,\n    0x5DC6, 0x31CD, 0x5DC7, 0x31CE, 0x5DC9, 0x1613, 0x5DCB, 0x32CE,\n    0x5DCD, 0x166F, 0x5DCF, 0x32CF, 0x5DD1, 0x337F, 0x5DD2, 0x16C2,\n    0x5DD4, 0x16C1, 0x5DD5, 0x337E, 0x5DD6, 0x16F7, 0x5DD8, 0x3414,\n    0x5DDB, 0x0226, 0x5DDD, 0x0287, 0x5DDE, 0x03C8, 0x5DDF, 0x17E3,\n    0x5DE0, 0x1871, 0x5DE1, 0x051A, 0x5DE2, 0x0A6B, 0x5DE5, 0x0288,\n    0x5DE6, 0x0338, 0x5DE7, 0x0337, 0x5DE8, 0x0336, 0x5DEB, 0x048D,\n    0x5DEE, 0x08A8, 0x5DF0, 0x23C6, 0x5DF1, 0x0289, 0x5DF2, 0x028A,\n    0x5DF3, 0x028B, 0x5DF4, 0x02CB, 0x5DF7, 0x070D, 0x5DF9, 0x1AC9,\n    0x5DFD, 0x0C36, 0x5DFE, 0x028C, 0x5DFF, 0x1788, 0x5E02, 0x0339,\n    0x5E03, 0x033A, 0x5E04, 0x17A4, 0x5E06, 0x03C9, 0x5E0A, 0x1872,\n    0x5E0C, 0x048E, 0x5E0E, 0x1873, 0x5E11, 0x05B0, 0x5E14, 0x1970,\n    0x5E15, 0x05AE, 0x5E16, 0x05AD, 0x5E17, 0x196F, 0x5E18, 0x05AB,\n    0x5E19, 0x1971, 0x5E1A, 0x05AC, 0x5E1B, 0x05AF, 0x5E1D, 0x070E,\n    0x5E1F, 0x0710, 0x5E20, 0x1ACD, 0x5E21, 0x1ACA, 0x5E22, 0x1ACB,\n    0x5E23, 0x1ACC, 0x5E24, 0x1ACE, 0x5E25, 0x070F, 0x5E28, 0x1C87,\n    0x5E29, 0x1C86, 0x5E2B, 0x08AA, 0x5E2D, 0x08A9, 0x5E33, 0x0A6E,\n    0x5E34, 0x1ECD, 0x5E36, 0x0A6D, 0x5E37, 0x0A6F, 0x5E38, 0x0A6C,\n    0x5E3D, 0x0C38, 0x5E3E, 0x1ECC, 0x5E40, 0x0C39, 0x5E41, 0x212E,\n    0x5E43, 0x0C3A, 0x5E44, 0x212D, 0x5E45, 0x0C37, 0x5E4A, 0x23C9,\n    0x5E4B, 0x23CB, 0x5E4C, 0x0DFF, 0x5E4D, 0x23CA, 0x5E4E, 0x23C8,\n    0x5E4F, 0x23C7, 0x5E53, 0x2674, 0x5E54, 0x0FC9, 0x5E55, 0x0FC7,\n    0x5E57, 0x0FC8, 0x5E58, 0x2672, 0x5E59, 0x2673, 0x5E5B, 0x0FC5,\n    0x5E5C, 0x28C7, 0x5E5D, 0x28C5, 0x5E5F, 0x1139, 0x5E60, 0x28C6,\n    0x5E61, 0x113A, 0x5E62, 0x1138, 0x5E63, 0x0FC6, 0x5E66, 0x2B38,\n    0x5E67, 0x2B36, 0x5E68, 0x2B37, 0x5E69, 0x28C4, 0x5E6A, 0x2D5D,\n    0x5E6B, 0x13CD, 0x5E6C, 0x2D5C, 0x5E6D, 0x2F1C, 0x5E6E, 0x2F1D,\n    0x5E6F, 0x2B39, 0x5E70, 0x308D, 0x5E72, 0x028D, 0x5E73, 0x033B,\n    0x5E74, 0x03CB, 0x5E75, 0x17E4, 0x5E76, 0x03CA, 0x5E78, 0x05B1,\n    0x5E79, 0x0E00, 0x5E7A, 0x0227, 0x5E7B, 0x02CC, 0x5E7C, 0x033C,\n    0x5E7D, 0x0711, 0x5E7E, 0x0C3B, 0x5E7F, 0x0228, 0x5E80, 0x17A5,\n    0x5E82, 0x17A6, 0x5E84, 0x17E5, 0x5E87, 0x0490, 0x5E88, 0x1877,\n    0x5E89, 0x1875, 0x5E8A, 0x0491, 0x5E8B, 0x1874, 0x5E8C, 0x1876,\n    0x5E8D, 0x1878, 0x5E8F, 0x048F, 0x5E95, 0x05B5, 0x5E96, 0x05B6,\n    0x5E97, 0x05B3, 0x5E9A, 0x05B2, 0x5E9B, 0x1AD2, 0x5E9C, 0x05B4,\n    0x5EA0, 0x0712, 0x5EA2, 0x1AD1, 0x5EA3, 0x1AD3, 0x5EA4, 0x1AD0,\n    0x5EA5, 0x1AD4, 0x5EA6, 0x0713, 0x5EA7, 0x08AD, 0x5EA8, 0x1C88,\n    0x5EAA, 0x1C8A, 0x5EAB, 0x08AB, 0x5EAC, 0x1C8B, 0x5EAD, 0x08AC,\n    0x5EAE, 0x1C89, 0x5EB0, 0x1ACF, 0x5EB1, 0x1ECE, 0x5EB2, 0x1ED1,\n    0x5EB3, 0x1ED2, 0x5EB4, 0x1ECF, 0x5EB5, 0x0A73, 0x5EB6, 0x0A72,\n    0x5EB7, 0x0A70, 0x5EB8, 0x0A71, 0x5EB9, 0x1ED0, 0x5EBE, 0x0A74,\n    0x5EC1, 0x0C3D, 0x5EC2, 0x0C3E, 0x5EC4, 0x0C3F, 0x5EC5, 0x23CC,\n    0x5EC6, 0x23CE, 0x5EC7, 0x23D0, 0x5EC8, 0x0E02, 0x5EC9, 0x0E01,\n    0x5ECA, 0x0C3C, 0x5ECB, 0x23CF, 0x5ECC, 0x23CD, 0x5ECE, 0x2678,\n    0x5ED1, 0x2676, 0x5ED2, 0x267C, 0x5ED3, 0x0FCA, 0x5ED4, 0x267D,\n    0x5ED5, 0x267A, 0x5ED6, 0x0FCB, 0x5ED7, 0x2677, 0x5ED8, 0x2675,\n    0x5ED9, 0x267B, 0x5EDA, 0x113C, 0x5EDB, 0x28C9, 0x5EDC, 0x2679,\n    0x5EDD, 0x113E, 0x5EDE, 0x28CA, 0x5EDF, 0x113D, 0x5EE0, 0x1140,\n    0x5EE1, 0x28CB, 0x5EE2, 0x113B, 0x5EE3, 0x113F, 0x5EE5, 0x2B3E,\n    0x5EE6, 0x2B3C, 0x5EE7, 0x2B3B, 0x5EE8, 0x2B3D, 0x5EE9, 0x2B3A,\n    0x5EEC, 0x157D, 0x5EEE, 0x31CF, 0x5EEF, 0x31D0, 0x5EF1, 0x32D0,\n    0x5EF2, 0x3380, 0x5EF3, 0x1742, 0x5EF4, 0x0229, 0x5EF6, 0x05B7,\n    0x5EF7, 0x0492, 0x5EFA, 0x0714, 0x5EFE, 0x028E, 0x5EFF, 0x02CD,\n    0x5F01, 0x033D, 0x5F02, 0x17E6, 0x5F04, 0x0493, 0x5F05, 0x1879,\n    0x5F07, 0x1AD5, 0x5F08, 0x0715, 0x5F0A, 0x0FCC, 0x5F0B, 0x028F,\n    0x5F0F, 0x03CC, 0x5F12, 0x0E03, 0x5F13, 0x0290, 0x5F14, 0x02CE,\n    0x5F15, 0x02CF, 0x5F17, 0x033F, 0x5F18, 0x033E, 0x5F1A, 0x17E7,\n    0x5F1B, 0x03CD, 0x5F1D, 0x187A, 0x5F1F, 0x0494, 0x5F22, 0x1973,\n    0x5F23, 0x1974, 0x5F24, 0x1975, 0x5F26, 0x05B8, 0x5F27, 0x05B9,\n    0x5F28, 0x1972, 0x5F29, 0x05BA, 0x5F2D, 0x0716, 0x5F2E, 0x1AD6,\n    0x5F30, 0x1C8D, 0x5F31, 0x08AE, 0x5F33, 0x1C8C, 0x5F35, 0x0A75,\n    0x5F36, 0x1ED3, 0x5F37, 0x0A76, 0x5F38, 0x1ED4, 0x5F3C, 0x0C40,\n    0x5F40, 0x23D1, 0x5F43, 0x267F, 0x5F44, 0x267E, 0x5F46, 0x0FCD,\n    0x5F48, 0x1141, 0x5F49, 0x28CC, 0x5F4A, 0x12AD, 0x5F4B, 0x2B3F,\n    0x5F4C, 0x13CE, 0x5F4E, 0x16C3, 0x5F4F, 0x3416, 0x5F50, 0x022A,\n    0x5F54, 0x1976, 0x5F56, 0x1AD7, 0x5F57, 0x0A77, 0x5F58, 0x212F,\n    0x5F59, 0x0E04, 0x5F5D, 0x14CF, 0x5F61, 0x022B, 0x5F62, 0x0496,\n    0x5F64, 0x0495, 0x5F65, 0x0717, 0x5F67, 0x1C8E, 0x5F69, 0x0A79,\n    0x5F6A, 0x0B89, 0x5F6B, 0x0A7A, 0x5F6C, 0x0A78, 0x5F6D, 0x0C41,\n    0x5F6F, 0x2680, 0x5F70, 0x0FCE, 0x5F71, 0x1142, 0x5F73, 0x1777,\n    0x5F74, 0x17E8, 0x5F76, 0x187C, 0x5F77, 0x0497, 0x5F78, 0x187B,\n    0x5F79, 0x0498, 0x5F7C, 0x05BE, 0x5F7D, 0x1979, 0x5F7E, 0x1978,\n    0x5F7F, 0x05BD, 0x5F80, 0x05BB, 0x5F81, 0x05BC, 0x5F82, 0x1977,\n    0x5F85, 0x0719, 0x5F86, 0x1AD8, 0x5F87, 0x071C, 0x5F88, 0x0718,\n    0x5F89, 0x071E, 0x5F8A, 0x071A, 0x5F8B, 0x071B, 0x5F8C, 0x071D,\n    0x5F90, 0x08B1, 0x5F91, 0x08B0, 0x5F92, 0x08AF, 0x5F96, 0x1ED6,\n    0x5F97, 0x0A7B, 0x5F98, 0x0A7E, 0x5F99, 0x0A7C, 0x5F9B, 0x1ED5,\n    0x5F9C, 0x0A81, 0x5F9E, 0x0A7D, 0x5F9F, 0x1ED7, 0x5FA0, 0x0A80,\n    0x5FA1, 0x0A7F, 0x5FA5, 0x2131, 0x5FA6, 0x2130, 0x5FA8, 0x0C44,\n    0x5FA9, 0x0C42, 0x5FAA, 0x0C43, 0x5FAB, 0x2132, 0x5FAC, 0x0E05,\n    0x5FAD, 0x23D3, 0x5FAE, 0x0E06, 0x5FAF, 0x23D2, 0x5FB2, 0x28CD,\n    0x5FB5, 0x1144, 0x5FB6, 0x2681, 0x5FB7, 0x1143, 0x5FB9, 0x0FCF,\n    0x5FBB, 0x2B41, 0x5FBC, 0x2B40, 0x5FBD, 0x13CF, 0x5FBE, 0x2D5E,\n    0x5FBF, 0x308E, 0x5FC0, 0x31D1, 0x5FC1, 0x31D2, 0x5FC3, 0x02D0,\n    0x5FC5, 0x0340, 0x5FC9, 0x17A7, 0x5FCC, 0x049A, 0x5FCD, 0x049C,\n    0x5FCF, 0x17EB, 0x5FD0, 0x187F, 0x5FD1, 0x187E, 0x5FD2, 0x187D,\n    0x5FD4, 0x17EA, 0x5FD5, 0x17E9, 0x5FD6, 0x03CF, 0x5FD7, 0x049B,\n    0x5FD8, 0x0499, 0x5FD9, 0x03CE, 0x5FDD, 0x05BF, 0x5FDE, 0x197A,\n    0x5FE0, 0x05C0, 0x5FE1, 0x1884, 0x5FE3, 0x1886, 0x5FE4, 0x1885,\n    0x5FE5, 0x197B, 0x5FE8, 0x1881, 0x5FEA, 0x04A0, 0x5FEB, 0x049E,\n    0x5FED, 0x1880, 0x5FEE, 0x1882, 0x5FEF, 0x1888, 0x5FF1, 0x049D,\n    0x5FF3, 0x1883, 0x5FF4, 0x188C, 0x5FF5, 0x05C2, 0x5FF7, 0x1889,\n    0x5FF8, 0x049F, 0x5FFA, 0x1887, 0x5FFB, 0x188A, 0x5FFD, 0x05C1,\n    0x5FFF, 0x05C3, 0x6000, 0x188B, 0x6009, 0x198F, 0x600A, 0x1982,\n    0x600B, 0x1980, 0x600C, 0x198E, 0x600D, 0x1989, 0x600E, 0x0723,\n    0x600F, 0x05C4, 0x6010, 0x198A, 0x6011, 0x198D, 0x6012, 0x071F,\n    0x6013, 0x198C, 0x6014, 0x05C5, 0x6015, 0x05CA, 0x6016, 0x05C8,\n    0x6017, 0x1983, 0x6019, 0x197E, 0x601A, 0x1985, 0x601B, 0x05CF,\n    0x601C, 0x1990, 0x601D, 0x0720, 0x601E, 0x1986, 0x6020, 0x0721,\n    0x6021, 0x05CB, 0x6022, 0x1988, 0x6024, 0x1AE7, 0x6025, 0x0722,\n    0x6026, 0x197D, 0x6027, 0x05CC, 0x6028, 0x0724, 0x6029, 0x05CD,\n    0x602A, 0x05C9, 0x602B, 0x05CE, 0x602C, 0x1987, 0x602D, 0x197C,\n    0x602E, 0x198B, 0x602F, 0x05C6, 0x6032, 0x197F, 0x6033, 0x1984,\n    0x6034, 0x1981, 0x6035, 0x05C7, 0x6037, 0x1AD9, 0x6039, 0x1ADA,\n    0x6040, 0x1AE4, 0x6041, 0x1C92, 0x6042, 0x1AE5, 0x6043, 0x072A,\n    0x6044, 0x1AE8, 0x6045, 0x1ADE, 0x6046, 0x0729, 0x6047, 0x1AE0,\n    0x6049, 0x1AE1, 0x604C, 0x1AE3, 0x604D, 0x0725, 0x6050, 0x08B5,\n    0x6052, 0x36EC, 0x6053, 0x1ADF, 0x6054, 0x1ADB, 0x6055, 0x08B6,\n    0x6058, 0x1AE9, 0x6059, 0x08B2, 0x605A, 0x1C90, 0x605B, 0x1AE2,\n    0x605D, 0x1C8F, 0x605E, 0x1ADD, 0x605F, 0x1AE6, 0x6062, 0x0728,\n    0x6063, 0x08B3, 0x6064, 0x072E, 0x6065, 0x08B4, 0x6066, 0x1AEA,\n    0x6067, 0x1C91, 0x6068, 0x0727, 0x6069, 0x08B8, 0x606A, 0x072D,\n    0x606B, 0x072C, 0x606C, 0x072B, 0x606D, 0x08B7, 0x606E, 0x1AEB,\n    0x606F, 0x08B9, 0x6070, 0x0726, 0x6072, 0x1ADC, 0x607F, 0x0A82,\n    0x6080, 0x1C95, 0x6081, 0x1C97, 0x6083, 0x1C99, 0x6084, 0x08BA,\n    0x6085, 0x08C0, 0x6086, 0x1EDA, 0x6087, 0x1C9D, 0x6088, 0x1C94,\n    0x6089, 0x0A84, 0x608A, 0x1ED8, 0x608C, 0x08BF, 0x608D, 0x08BD,\n    0x608E, 0x1C9F, 0x6090, 0x1ED9, 0x6092, 0x1C96, 0x6094, 0x08BE,\n    0x6095, 0x1C9A, 0x6096, 0x08C1, 0x6097, 0x1C9C, 0x609A, 0x08BC,\n    0x609B, 0x1C9B, 0x609C, 0x1C9E, 0x609D, 0x1C98, 0x609F, 0x08BB,\n    0x60A0, 0x0A85, 0x60A2, 0x1C93, 0x60A3, 0x0A83, 0x60A8, 0x0A86,\n    0x60B0, 0x1EDC, 0x60B1, 0x1EE5, 0x60B2, 0x0C47, 0x60B4, 0x0A88,\n    0x60B5, 0x0A8D, 0x60B6, 0x0C48, 0x60B7, 0x1EE7, 0x60B8, 0x0A94,\n    0x60B9, 0x2134, 0x60BA, 0x1EDD, 0x60BB, 0x0A8C, 0x60BC, 0x0A8F,\n    0x60BD, 0x0A8A, 0x60BE, 0x1EDB, 0x60BF, 0x1EE9, 0x60C0, 0x1EEC,\n    0x60C1, 0x2143, 0x60C3, 0x1EEA, 0x60C4, 0x2138, 0x60C5, 0x0A8B,\n    0x60C6, 0x0A92, 0x60C7, 0x0A96, 0x60C8, 0x1EE4, 0x60C9, 0x2133,\n    0x60CA, 0x1EE8, 0x60CB, 0x0A87, 0x60CC, 0x2135, 0x60CD, 0x1EEB,\n    0x60CE, 0x2137, 0x60CF, 0x1EE0, 0x60D1, 0x0C45, 0x60D3, 0x1EDE,\n    0x60D4, 0x1EDF, 0x60D5, 0x0A91, 0x60D8, 0x0A90, 0x60D9, 0x1EE2,\n    0x60DA, 0x0A95, 0x60DB, 0x1EE6, 0x60DC, 0x0A8E, 0x60DD, 0x1EE3,\n    0x60DF, 0x0A93, 0x60E0, 0x0C49, 0x60E1, 0x0C46, 0x60E2, 0x2136,\n    0x60E4, 0x1EE1, 0x60E6, 0x0A89, 0x60F0, 0x0C4E, 0x60F1, 0x0C52,\n    0x60F2, 0x213A, 0x60F3, 0x0E0B, 0x60F4, 0x0C50, 0x60F5, 0x213E,\n    0x60F6, 0x0C54, 0x60F7, 0x23D4, 0x60F8, 0x2140, 0x60F9, 0x0E0D,\n    0x60FA, 0x0C4C, 0x60FB, 0x0C4F, 0x60FC, 0x2141, 0x60FE, 0x2142,\n    0x60FF, 0x2148, 0x6100, 0x0C56, 0x6101, 0x0E0E, 0x6103, 0x2144,\n    0x6104, 0x2149, 0x6105, 0x213D, 0x6106, 0x0E18, 0x6108, 0x0E0F,\n    0x6109, 0x0C55, 0x610A, 0x213B, 0x610B, 0x214A, 0x610D, 0x0E17,\n    0x610E, 0x0C53, 0x610F, 0x0E08, 0x6110, 0x2147, 0x6112, 0x0C57,\n    0x6113, 0x213F, 0x6114, 0x2139, 0x6115, 0x0C4D, 0x6116, 0x213C,\n    0x6118, 0x2145, 0x611A, 0x0E07, 0x611B, 0x0E0C, 0x611C, 0x0C4A,\n    0x611D, 0x2146, 0x611F, 0x0E0A, 0x6123, 0x0C4B, 0x6127, 0x0E16,\n    0x6128, 0x2683, 0x6129, 0x23DF, 0x612B, 0x23D7, 0x612C, 0x2682,\n    0x612E, 0x23DB, 0x612F, 0x23DD, 0x6132, 0x23DA, 0x6134, 0x0E15,\n    0x6136, 0x23D9, 0x6137, 0x0E19, 0x613B, 0x2692, 0x613E, 0x0E14,\n    0x613F, 0x0FD1, 0x6140, 0x23E0, 0x6141, 0x2684, 0x6144, 0x0E12,\n    0x6145, 0x23D8, 0x6146, 0x23DC, 0x6147, 0x0FD0, 0x6148, 0x0E09,\n    0x6149, 0x23D5, 0x614A, 0x23D6, 0x614B, 0x0FD2, 0x614C, 0x0E11,\n    0x614D, 0x0E13, 0x614E, 0x0E10, 0x614F, 0x23DE, 0x6152, 0x2688,\n    0x6153, 0x2689, 0x6154, 0x268E, 0x6155, 0x1149, 0x6156, 0x2695,\n    0x6158, 0x0FD8, 0x615A, 0x0FD7, 0x615B, 0x2690, 0x615D, 0x1148,\n    0x615E, 0x2685, 0x615F, 0x0FD6, 0x6161, 0x2694, 0x6162, 0x0FD4,\n    0x6163, 0x0FD5, 0x6165, 0x2691, 0x6166, 0x28DE, 0x6167, 0x1146,\n    0x6168, 0x0C51, 0x616A, 0x2693, 0x616B, 0x114D, 0x616C, 0x268B,\n    0x616E, 0x1147, 0x6170, 0x114C, 0x6171, 0x2686, 0x6172, 0x268A,\n    0x6173, 0x2687, 0x6174, 0x268D, 0x6175, 0x0FD9, 0x6176, 0x1145,\n    0x6177, 0x0FD3, 0x6179, 0x28D0, 0x617A, 0x268F, 0x617C, 0x114B,\n    0x617E, 0x114E, 0x6180, 0x268C, 0x6182, 0x114A, 0x6183, 0x28CF,\n    0x6189, 0x28D4, 0x618A, 0x12B1, 0x618B, 0x28CE, 0x618C, 0x2B4D,\n    0x618D, 0x28DD, 0x618E, 0x1152, 0x6190, 0x1150, 0x6191, 0x12AF,\n    0x6192, 0x28DA, 0x6193, 0x28D6, 0x6194, 0x1156, 0x6196, 0x2B44,\n    0x619A, 0x1154, 0x619B, 0x28D5, 0x619D, 0x2B42, 0x619F, 0x28D9,\n    0x61A1, 0x28DC, 0x61A2, 0x28D3, 0x61A4, 0x1155, 0x61A7, 0x114F,\n    0x61A8, 0x2B43, 0x61A9, 0x12B0, 0x61AA, 0x28DB, 0x61AB, 0x1151,\n    0x61AC, 0x1153, 0x61AD, 0x28D8, 0x61AE, 0x1157, 0x61AF, 0x28D7,\n    0x61B0, 0x28D2, 0x61B1, 0x28D1, 0x61B2, 0x12AE, 0x61B3, 0x28DF,\n    0x61B4, 0x2B46, 0x61B5, 0x2D60, 0x61B6, 0x12B3, 0x61B8, 0x2B4C,\n    0x61BA, 0x2B4A, 0x61BC, 0x2D61, 0x61BE, 0x12B4, 0x61BF, 0x2B4B,\n    0x61C1, 0x2B48, 0x61C2, 0x13D1, 0x61C3, 0x2D5F, 0x61C5, 0x2B45,\n    0x61C6, 0x2B47, 0x61C7, 0x13D2, 0x61C8, 0x12B6, 0x61C9, 0x13D0,\n    0x61CA, 0x12B5, 0x61CB, 0x13D4, 0x61CC, 0x2B49, 0x61CD, 0x12B2,\n    0x61D6, 0x2F26, 0x61D8, 0x2F1E, 0x61DE, 0x2D67, 0x61DF, 0x2F1F,\n    0x61E0, 0x2D63, 0x61E3, 0x14D0, 0x61E4, 0x2D65, 0x61E5, 0x2D64,\n    0x61E6, 0x13D3, 0x61E7, 0x2D62, 0x61E8, 0x2D66, 0x61E9, 0x2F27,\n    0x61EA, 0x2F23, 0x61EB, 0x2F25, 0x61ED, 0x2F20, 0x61EE, 0x2F21,\n    0x61F0, 0x2F24, 0x61F1, 0x2F22, 0x61F2, 0x157E, 0x61F5, 0x1581,\n    0x61F6, 0x1580, 0x61F7, 0x157F, 0x61F8, 0x1614, 0x61F9, 0x31D3,\n    0x61FA, 0x1615, 0x61FB, 0x308F, 0x61FC, 0x1670, 0x61FD, 0x32D1,\n    0x61FE, 0x1671, 0x61FF, 0x16C4, 0x6200, 0x16F8, 0x6201, 0x3417,\n    0x6203, 0x3418, 0x6204, 0x3419, 0x6207, 0x3533, 0x6208, 0x02D1,\n    0x6209, 0x17A8, 0x620A, 0x0341, 0x620C, 0x03D1, 0x620D, 0x03D2,\n    0x620E, 0x03D0, 0x6210, 0x03D3, 0x6211, 0x04A2, 0x6212, 0x04A1,\n    0x6214, 0x1991, 0x6215, 0x05D1, 0x6216, 0x05D0, 0x6219, 0x1CA0,\n    0x621A, 0x0A97, 0x621B, 0x0A98, 0x621F, 0x0C58, 0x6220, 0x23E1,\n    0x6221, 0x0E1A, 0x6222, 0x0E1B, 0x6223, 0x23E3, 0x6224, 0x23E5,\n    0x6225, 0x23E4, 0x6227, 0x2697, 0x6229, 0x2696, 0x622A, 0x0FDA,\n    0x622B, 0x2698, 0x622D, 0x28E0, 0x622E, 0x1158, 0x6230, 0x12B7,\n    0x6232, 0x13D5, 0x6233, 0x14D1, 0x6234, 0x13D6, 0x6236, 0x02D2,\n    0x623A, 0x188D, 0x623D, 0x1992, 0x623E, 0x05D3, 0x623F, 0x05D2,\n    0x6240, 0x05D4, 0x6241, 0x072F, 0x6242, 0x1AEC, 0x6243, 0x1AED,\n    0x6246, 0x1CA1, 0x6247, 0x08C2, 0x6248, 0x0A99, 0x6249, 0x0C59,\n    0x624A, 0x214B, 0x624B, 0x02D3, 0x624D, 0x0291, 0x624E, 0x02D4,\n    0x6250, 0x17A9, 0x6251, 0x0345, 0x6252, 0x0344, 0x6253, 0x0342,\n    0x6254, 0x0343, 0x6258, 0x03D6, 0x6259, 0x17F2, 0x625A, 0x17F4,\n    0x625B, 0x03D5, 0x625C, 0x17EC, 0x625E, 0x17ED, 0x6260, 0x17F3,\n    0x6261, 0x17EF, 0x6262, 0x17F1, 0x6263, 0x03D4, 0x6264, 0x17EE,\n    0x6265, 0x17F5, 0x6266, 0x17F0, 0x626D, 0x04A9, 0x626E, 0x04B2,\n    0x626F, 0x04B0, 0x6270, 0x1897, 0x6271, 0x1894, 0x6272, 0x189C,\n    0x6273, 0x04AE, 0x6274, 0x189D, 0x6276, 0x04A7, 0x6277, 0x189A,\n    0x6279, 0x04AD, 0x627A, 0x1896, 0x627B, 0x1895, 0x627C, 0x04AB,\n    0x627D, 0x189B, 0x627E, 0x04AC, 0x627F, 0x05D5, 0x6280, 0x04A6,\n    0x6281, 0x1898, 0x6283, 0x188E, 0x6284, 0x04A3, 0x6286, 0x04B6,\n    0x6287, 0x1893, 0x6288, 0x1899, 0x6289, 0x04A8, 0x628A, 0x04AA,\n    0x628C, 0x188F, 0x628E, 0x1890, 0x628F, 0x1891, 0x6291, 0x04B5,\n    0x6292, 0x04AF, 0x6293, 0x04B4, 0x6294, 0x1892, 0x6295, 0x04B3,\n    0x6296, 0x04A5, 0x6297, 0x04A4, 0x6298, 0x04B1, 0x62A8, 0x05E3,\n    0x62A9, 0x199E, 0x62AA, 0x1997, 0x62AB, 0x05DE, 0x62AC, 0x05F1,\n    0x62AD, 0x1993, 0x62AE, 0x199A, 0x62AF, 0x199C, 0x62B0, 0x199F,\n    0x62B1, 0x05EC, 0x62B3, 0x199B, 0x62B4, 0x1994, 0x62B5, 0x05EA,\n    0x62B6, 0x1998, 0x62B8, 0x19A0, 0x62B9, 0x05DB, 0x62BB, 0x199D,\n    0x62BC, 0x05E5, 0x62BD, 0x05E4, 0x62BE, 0x1996, 0x62BF, 0x05D9,\n    0x62C2, 0x05DA, 0x62C4, 0x05D8, 0x62C6, 0x05F0, 0x62C7, 0x05E8,\n    0x62C8, 0x05E2, 0x62C9, 0x05D6, 0x62CA, 0x1999, 0x62CB, 0x05E1,\n    0x62CC, 0x05D7, 0x62CD, 0x05E9, 0x62CE, 0x05F2, 0x62CF, 0x1AEE,\n    0x62D0, 0x05E6, 0x62D1, 0x1995, 0x62D2, 0x05DC, 0x62D3, 0x05DF,\n    0x62D4, 0x05E0, 0x62D6, 0x05EE, 0x62D7, 0x05EF, 0x62D8, 0x05ED,\n    0x62D9, 0x05E7, 0x62DA, 0x05EB, 0x62DB, 0x05DD, 0x62DC, 0x0730,\n    0x62EB, 0x1AF4, 0x62EC, 0x073C, 0x62ED, 0x0734, 0x62EE, 0x0736,\n    0x62EF, 0x073B, 0x62F0, 0x1B00, 0x62F1, 0x0739, 0x62F2, 0x1CA2,\n    0x62F3, 0x08C3, 0x62F4, 0x073E, 0x62F5, 0x1AF1, 0x62F6, 0x1AF9,\n    0x62F7, 0x073A, 0x62F8, 0x1AF8, 0x62F9, 0x1AF5, 0x62FA, 0x1AFD,\n    0x62FB, 0x1AFF, 0x62FC, 0x0733, 0x62FD, 0x0737, 0x62FE, 0x073D,\n    0x62FF, 0x08C5, 0x6300, 0x1AFA, 0x6301, 0x0735, 0x6302, 0x0740,\n    0x6303, 0x1AF3, 0x6307, 0x0738, 0x6308, 0x08C4, 0x6309, 0x0732,\n    0x630B, 0x1AF0, 0x630C, 0x1AF7, 0x630D, 0x1AEF, 0x630E, 0x1AF2,\n    0x630F, 0x1AF6, 0x6310, 0x1CA3, 0x6311, 0x073F, 0x6313, 0x1AFB,\n    0x6314, 0x1AFC, 0x6315, 0x1AFE, 0x6316, 0x0731, 0x6328, 0x08D3,\n    0x6329, 0x1CAF, 0x632A, 0x08D1, 0x632B, 0x08D2, 0x632C, 0x1CA5,\n    0x632D, 0x1CB5, 0x632F, 0x08C8, 0x6332, 0x1EED, 0x6333, 0x1CB7,\n    0x6334, 0x1CB1, 0x6336, 0x1CA8, 0x6338, 0x1CBA, 0x6339, 0x1CAB,\n    0x633A, 0x08CE, 0x633B, 0x1F04, 0x633C, 0x1CAE, 0x633D, 0x08D0,\n    0x633E, 0x08C7, 0x6340, 0x1CBC, 0x6341, 0x1CB0, 0x6342, 0x08CA,\n    0x6343, 0x1CA9, 0x6344, 0x1CA6, 0x6345, 0x1CA7, 0x6346, 0x08CB,\n    0x6347, 0x1CB6, 0x6348, 0x1CBD, 0x6349, 0x08CD, 0x634A, 0x1CAD,\n    0x634B, 0x1CAC, 0x634C, 0x08D5, 0x634D, 0x08D4, 0x634E, 0x08C6,\n    0x634F, 0x08CC, 0x6350, 0x08CF, 0x6351, 0x1CB9, 0x6354, 0x1CB3,\n    0x6355, 0x08C9, 0x6356, 0x1CA4, 0x6357, 0x1CBB, 0x6358, 0x1CB2,\n    0x6359, 0x1CB4, 0x635A, 0x1CB8, 0x6365, 0x1EEE, 0x6367, 0x0AA1,\n    0x6368, 0x0AB5, 0x6369, 0x0AB4, 0x636B, 0x0AA9, 0x636D, 0x1F00,\n    0x636E, 0x1EFC, 0x636F, 0x1EF9, 0x6370, 0x1F0B, 0x6371, 0x0AA4,\n    0x6372, 0x0A9C, 0x6375, 0x1EFE, 0x6376, 0x0C69, 0x6377, 0x0AA0,\n    0x6378, 0x1F06, 0x637A, 0x0AB6, 0x637B, 0x0AB3, 0x637C, 0x1F02,\n    0x637D, 0x1EF1, 0x6380, 0x0AB2, 0x6381, 0x1F08, 0x6382, 0x1EF0,\n    0x6383, 0x0AA7, 0x6384, 0x0AAB, 0x6385, 0x1F07, 0x6387, 0x1EFA,\n    0x6388, 0x0AAC, 0x6389, 0x0AA6, 0x638A, 0x1EEF, 0x638C, 0x0C5B,\n    0x638D, 0x1F0A, 0x638E, 0x1EF8, 0x638F, 0x0AB1, 0x6390, 0x1EFB,\n    0x6391, 0x1F09, 0x6392, 0x0AB0, 0x6394, 0x214C, 0x6396, 0x0A9D,\n    0x6397, 0x1EF6, 0x6398, 0x0AA2, 0x6399, 0x0AAD, 0x639B, 0x0AA8,\n    0x639C, 0x1EFF, 0x639D, 0x1EF5, 0x639E, 0x1EF3, 0x639F, 0x1F05,\n    0x63A0, 0x0A9A, 0x63A1, 0x0AAE, 0x63A2, 0x0A9E, 0x63A3, 0x0C5A,\n    0x63A4, 0x1F03, 0x63A5, 0x0A9F, 0x63A7, 0x0A9B, 0x63A8, 0x0AAA,\n    0x63A9, 0x0AA5, 0x63AA, 0x0AA3, 0x63AB, 0x1EF7, 0x63AC, 0x0AAF,\n    0x63AD, 0x1EF4, 0x63AE, 0x1F01, 0x63AF, 0x1EFD, 0x63B0, 0x214E,\n    0x63B1, 0x214D, 0x63BD, 0x1EF2, 0x63BE, 0x215E, 0x63C0, 0x0C5D,\n    0x63C2, 0x2164, 0x63C3, 0x2153, 0x63C4, 0x2161, 0x63C5, 0x23E6,\n    0x63C6, 0x0C60, 0x63C7, 0x2165, 0x63C8, 0x2168, 0x63C9, 0x0C5F,\n    0x63CA, 0x2156, 0x63CB, 0x2167, 0x63CC, 0x2166, 0x63CD, 0x0C61,\n    0x63CE, 0x214F, 0x63CF, 0x0C5C, 0x63D0, 0x0C64, 0x63D2, 0x0C62,\n    0x63D3, 0x2163, 0x63D5, 0x2159, 0x63D6, 0x0C66, 0x63D7, 0x216A,\n    0x63D8, 0x2162, 0x63D9, 0x216B, 0x63DA, 0x0C6E, 0x63DB, 0x0C6C,\n    0x63DC, 0x2160, 0x63DD, 0x215F, 0x63DF, 0x215D, 0x63E0, 0x2157,\n    0x63E1, 0x0C65, 0x63E3, 0x0C63, 0x63E4, 0x1CAA, 0x63E5, 0x2150,\n    0x63E7, 0x2404, 0x63E8, 0x2151, 0x63E9, 0x0C5E, 0x63EA, 0x0C6B,\n    0x63EB, 0x23E8, 0x63ED, 0x0C67, 0x63EE, 0x0C68, 0x63EF, 0x2152,\n    0x63F0, 0x2169, 0x63F1, 0x23E7, 0x63F2, 0x215A, 0x63F3, 0x2155,\n    0x63F4, 0x0C6A, 0x63F5, 0x215B, 0x63F6, 0x2158, 0x63F9, 0x0C6F,\n    0x6406, 0x0E2A, 0x6409, 0x23EB, 0x640A, 0x23FE, 0x640B, 0x2403,\n    0x640C, 0x23F7, 0x640D, 0x0E26, 0x640E, 0x2408, 0x640F, 0x0E23,\n    0x6410, 0x23E9, 0x6412, 0x23EA, 0x6413, 0x0E1C, 0x6414, 0x0E25,\n    0x6415, 0x23F1, 0x6416, 0x0E28, 0x6417, 0x0E29, 0x6418, 0x23F2,\n    0x641A, 0x23FF, 0x641B, 0x2405, 0x641C, 0x0E24, 0x641E, 0x0E1E,\n    0x641F, 0x23F0, 0x6420, 0x23EC, 0x6421, 0x2407, 0x6422, 0x23F5,\n    0x6423, 0x23F6, 0x6424, 0x23ED, 0x6425, 0x2401, 0x6426, 0x23F8,\n    0x6427, 0x2402, 0x6428, 0x23FA, 0x642A, 0x0E1F, 0x642B, 0x2699,\n    0x642C, 0x0E22, 0x642D, 0x0E20, 0x642E, 0x2406, 0x642F, 0x23FD,\n    0x6430, 0x23F9, 0x6433, 0x23EE, 0x6434, 0x0FE4, 0x6435, 0x23FC,\n    0x6436, 0x0E27, 0x6437, 0x23F4, 0x6439, 0x23F3, 0x643D, 0x0E21,\n    0x643E, 0x0E1D, 0x643F, 0x26AE, 0x6440, 0x2400, 0x6441, 0x23FB,\n    0x6443, 0x23EF, 0x644B, 0x26A9, 0x644D, 0x269A, 0x644E, 0x26A5,\n    0x6450, 0x26AC, 0x6451, 0x0FE2, 0x6452, 0x0C6D, 0x6453, 0x26AA,\n    0x6454, 0x0FDD, 0x6458, 0x0FDC, 0x6459, 0x26B1, 0x645B, 0x269B,\n    0x645C, 0x26A8, 0x645D, 0x269C, 0x645E, 0x26A7, 0x645F, 0x0FE0,\n    0x6460, 0x26AB, 0x6461, 0x215C, 0x6465, 0x26B2, 0x6466, 0x26A3,\n    0x6467, 0x0FE3, 0x6468, 0x28EE, 0x6469, 0x1159, 0x646B, 0x26B0,\n    0x646C, 0x26AF, 0x646D, 0x0FE5, 0x646E, 0x28E1, 0x646F, 0x115A,\n    0x6470, 0x28E2, 0x6472, 0x269F, 0x6473, 0x26A0, 0x6474, 0x269D,\n    0x6475, 0x26A2, 0x6476, 0x269E, 0x6477, 0x26B3, 0x6478, 0x0FDF,\n    0x6479, 0x115B, 0x647A, 0x0FE1, 0x647B, 0x0FE6, 0x647D, 0x26A1,\n    0x647F, 0x26AD, 0x6482, 0x26A6, 0x6485, 0x28E5, 0x6487, 0x0FDB,\n    0x6488, 0x115E, 0x6489, 0x2B54, 0x648A, 0x28EA, 0x648B, 0x28E9,\n    0x648C, 0x28EB, 0x648F, 0x28E8, 0x6490, 0x115F, 0x6492, 0x1165,\n    0x6493, 0x1162, 0x6495, 0x1163, 0x6496, 0x28E3, 0x6497, 0x28E6,\n    0x6498, 0x28F0, 0x6499, 0x116B, 0x649A, 0x1169, 0x649C, 0x28E7,\n    0x649D, 0x2154, 0x649E, 0x115C, 0x649F, 0x28ED, 0x64A0, 0x28E4,\n    0x64A2, 0x116C, 0x64A3, 0x28EC, 0x64A4, 0x0FDE, 0x64A5, 0x1161,\n    0x64A6, 0x26A4, 0x64A9, 0x1164, 0x64AB, 0x1168, 0x64AC, 0x116A,\n    0x64AD, 0x1167, 0x64AE, 0x1166, 0x64B0, 0x1160, 0x64B1, 0x28EF,\n    0x64B2, 0x115D, 0x64B3, 0x116D, 0x64BB, 0x12BB, 0x64BC, 0x12BC,\n    0x64BD, 0x2B53, 0x64BE, 0x12C5, 0x64BF, 0x12C2, 0x64C1, 0x12B9,\n    0x64C2, 0x12C0, 0x64C3, 0x2B55, 0x64C4, 0x12BE, 0x64C5, 0x12B8,\n    0x64C7, 0x12BF, 0x64C9, 0x2B52, 0x64CA, 0x13D8, 0x64CB, 0x12BA,\n    0x64CD, 0x12C1, 0x64CE, 0x13D7, 0x64CF, 0x2B51, 0x64D0, 0x2B50,\n    0x64D2, 0x12C3, 0x64D4, 0x12C4, 0x64D6, 0x2B4F, 0x64D7, 0x2B4E,\n    0x64D8, 0x13D9, 0x64D9, 0x2B58, 0x64DA, 0x12BD, 0x64DB, 0x2B56,\n    0x64E0, 0x13DA, 0x64E2, 0x13DF, 0x64E3, 0x2D6A, 0x64E4, 0x2D6C,\n    0x64E6, 0x13DC, 0x64E8, 0x2D6D, 0x64E9, 0x2D69, 0x64EB, 0x2D6B,\n    0x64EC, 0x13DD, 0x64ED, 0x13E0, 0x64EF, 0x2D68, 0x64F0, 0x13DB,\n    0x64F1, 0x13DE, 0x64F2, 0x14D3, 0x64F3, 0x2B57, 0x64F4, 0x14D2,\n    0x64F7, 0x14D8, 0x64F8, 0x2F2B, 0x64FA, 0x14D6, 0x64FB, 0x14D7,\n    0x64FC, 0x2F2E, 0x64FD, 0x2F2A, 0x64FE, 0x14D4, 0x64FF, 0x2F28,\n    0x6500, 0x1582, 0x6501, 0x2F2C, 0x6503, 0x2F2D, 0x6504, 0x2F29,\n    0x6506, 0x14D5, 0x6507, 0x3090, 0x6509, 0x3093, 0x650C, 0x3094,\n    0x650D, 0x3092, 0x650E, 0x3095, 0x650F, 0x1583, 0x6510, 0x3091,\n    0x6513, 0x31D7, 0x6514, 0x1617, 0x6515, 0x31D6, 0x6516, 0x31D5,\n    0x6517, 0x31D4, 0x6518, 0x1616, 0x6519, 0x1618, 0x651B, 0x32D2,\n    0x651C, 0x1673, 0x651D, 0x1672, 0x6520, 0x3382, 0x6521, 0x3381,\n    0x6522, 0x3384, 0x6523, 0x16F9, 0x6524, 0x16C5, 0x6525, 0x341B,\n    0x6526, 0x3383, 0x6529, 0x341A, 0x652A, 0x16FB, 0x652B, 0x16FA,\n    0x652C, 0x1721, 0x652D, 0x3484, 0x652E, 0x34CA, 0x652F, 0x02D5,\n    0x6532, 0x216C, 0x6533, 0x2B59, 0x6534, 0x022C, 0x6536, 0x03D7,\n    0x6537, 0x17F6, 0x6538, 0x04B9, 0x6539, 0x04B7, 0x653B, 0x04B8,\n    0x653D, 0x19A1, 0x653E, 0x05F3, 0x653F, 0x0741, 0x6541, 0x1B01,\n    0x6543, 0x1B02, 0x6545, 0x0742, 0x6546, 0x1CBF, 0x6548, 0x08D6,\n    0x6549, 0x08D7, 0x654A, 0x1CBE, 0x654F, 0x0ABD, 0x6551, 0x0AB9,\n    0x6553, 0x1F0C, 0x6554, 0x0AC0, 0x6555, 0x0ABF, 0x6556, 0x0AB8,\n    0x6557, 0x0ABB, 0x6558, 0x0ABE, 0x6559, 0x0ABA, 0x655C, 0x2170,\n    0x655D, 0x0AB7, 0x655E, 0x0C70, 0x6562, 0x0C72, 0x6563, 0x0C73,\n    0x6564, 0x216F, 0x6565, 0x2172, 0x6566, 0x0C71, 0x6567, 0x216D,\n    0x6568, 0x2171, 0x656A, 0x216E, 0x656C, 0x0E2B, 0x656F, 0x2409,\n    0x6572, 0x0FE7, 0x6573, 0x26B4, 0x6574, 0x12C6, 0x6575, 0x116E,\n    0x6576, 0x28F1, 0x6577, 0x116F, 0x6578, 0x1170, 0x6579, 0x28F3,\n    0x657A, 0x28F2, 0x657B, 0x28F4, 0x657C, 0x2B5B, 0x657F, 0x2B5A,\n    0x6580, 0x2D6F, 0x6581, 0x2D6E, 0x6582, 0x13E1, 0x6583, 0x13E2,\n    0x6584, 0x3096, 0x6587, 0x02D6, 0x658C, 0x2173, 0x6590, 0x0C75,\n    0x6591, 0x0C74, 0x6592, 0x240A, 0x6594, 0x2F2F, 0x6595, 0x1674,\n    0x6596, 0x341C, 0x6597, 0x02D7, 0x6599, 0x08D8, 0x659B, 0x0AC2,\n    0x659C, 0x0AC1, 0x659D, 0x2174, 0x659E, 0x2175, 0x659F, 0x0E2C,\n    0x65A0, 0x26B5, 0x65A1, 0x0FE8, 0x65A2, 0x2B5C, 0x65A4, 0x02D8,\n    0x65A5, 0x0346, 0x65A7, 0x05F4, 0x65A8, 0x19A2, 0x65AA, 0x1B03,\n    0x65AB, 0x0743, 0x65AC, 0x0AC3, 0x65AE, 0x2176, 0x65AF, 0x0C76,\n    0x65B0, 0x0E2D, 0x65B2, 0x28F5, 0x65B3, 0x28F6, 0x65B6, 0x2D70,\n    0x65B7, 0x14D9, 0x65B8, 0x34CB, 0x65B9, 0x02D9, 0x65BB, 0x19A3,\n    0x65BC, 0x05F5, 0x65BD, 0x0744, 0x65BF, 0x1B04, 0x65C1, 0x08D9,\n    0x65C2, 0x1CC3, 0x65C3, 0x1CC1, 0x65C4, 0x1CC2, 0x65C5, 0x08DA,\n    0x65C6, 0x1CC0, 0x65CB, 0x0AC5, 0x65CC, 0x0AC6, 0x65CD, 0x1F0D,\n    0x65CE, 0x0AC7, 0x65CF, 0x0AC4, 0x65D0, 0x2177, 0x65D2, 0x2178,\n    0x65D3, 0x240B, 0x65D6, 0x0FEA, 0x65D7, 0x0FE9, 0x65DA, 0x2D71,\n    0x65DB, 0x2F30, 0x65DD, 0x3098, 0x65DE, 0x3097, 0x65DF, 0x31D8,\n    0x65E0, 0x022D, 0x65E1, 0x1789, 0x65E2, 0x0745, 0x65E5, 0x02DA,\n    0x65E6, 0x0347, 0x65E8, 0x03D9, 0x65E9, 0x03D8, 0x65EC, 0x03DA,\n    0x65ED, 0x03DB, 0x65EE, 0x17F8, 0x65EF, 0x17F7, 0x65F0, 0x189E,\n    0x65F1, 0x04BA, 0x65F2, 0x18A1, 0x65F3, 0x18A0, 0x65F4, 0x189F,\n    0x65F5, 0x18A2, 0x65FA, 0x05F6, 0x65FB, 0x19A9, 0x65FC, 0x19A5,\n    0x65FD, 0x19AE, 0x6600, 0x05FD, 0x6602, 0x05FB, 0x6603, 0x19AA,\n    0x6604, 0x19A6, 0x6605, 0x19AD, 0x6606, 0x05FA, 0x6607, 0x0601,\n    0x6608, 0x19A8, 0x6609, 0x19A4, 0x660A, 0x0600, 0x660B, 0x19AB,\n    0x660C, 0x05F9, 0x660D, 0x19AC, 0x660E, 0x05FC, 0x660F, 0x05FE,\n    0x6610, 0x19B0, 0x6611, 0x19AF, 0x6612, 0x19A7, 0x6613, 0x05F8,\n    0x6614, 0x05F7, 0x6615, 0x05FF, 0x661C, 0x1B09, 0x661D, 0x1B0F,\n    0x661F, 0x074B, 0x6620, 0x0748, 0x6621, 0x1B06, 0x6622, 0x1B0B,\n    0x6624, 0x074E, 0x6625, 0x0746, 0x6626, 0x1B0A, 0x6627, 0x0749,\n    0x6628, 0x074C, 0x662B, 0x1B0D, 0x662D, 0x0747, 0x662E, 0x1B12,\n    0x662F, 0x074A, 0x6631, 0x074D, 0x6632, 0x1B07, 0x6633, 0x1B0C,\n    0x6634, 0x1B10, 0x6635, 0x1B08, 0x6636, 0x1B05, 0x6639, 0x1B11,\n    0x663A, 0x1B0E, 0x6641, 0x08E2, 0x6642, 0x08DB, 0x6643, 0x08DE,\n    0x6645, 0x08E1, 0x6647, 0x1CC6, 0x6649, 0x08DC, 0x664A, 0x1CC4,\n    0x664C, 0x08E0, 0x664F, 0x08DD, 0x6651, 0x1CC7, 0x6652, 0x08DF,\n    0x6659, 0x1F11, 0x665A, 0x0AC9, 0x665B, 0x1F10, 0x665C, 0x1F12,\n    0x665D, 0x0AC8, 0x665E, 0x0ACD, 0x665F, 0x1CC5, 0x6661, 0x1F0F,\n    0x6662, 0x1F13, 0x6664, 0x0ACA, 0x6665, 0x1F0E, 0x6666, 0x0ACC,\n    0x6668, 0x0ACB, 0x666A, 0x217F, 0x666C, 0x217A, 0x666E, 0x0C77,\n    0x666F, 0x0C7B, 0x6670, 0x0C78, 0x6671, 0x217D, 0x6672, 0x2180,\n    0x6674, 0x0C79, 0x6676, 0x0C7A, 0x6677, 0x0C7F, 0x6678, 0x2414,\n    0x6679, 0x217E, 0x667A, 0x0C7D, 0x667B, 0x217B, 0x667C, 0x2179,\n    0x667E, 0x0C7E, 0x6680, 0x217C, 0x6684, 0x0E33, 0x6686, 0x240C,\n    0x6687, 0x0E30, 0x6688, 0x0E31, 0x6689, 0x0E2F, 0x668A, 0x2411,\n    0x668B, 0x2410, 0x668C, 0x240D, 0x668D, 0x0E35, 0x6690, 0x240F,\n    0x6691, 0x0C7C, 0x6694, 0x2413, 0x6695, 0x240E, 0x6696, 0x0E32,\n    0x6697, 0x0E2E, 0x6698, 0x0E34, 0x6699, 0x2412, 0x669D, 0x0FED,\n    0x669F, 0x26B8, 0x66A0, 0x26B7, 0x66A1, 0x26B6, 0x66A2, 0x0FEB,\n    0x66A8, 0x0FEC, 0x66A9, 0x28F9, 0x66AA, 0x28FC, 0x66AB, 0x1172,\n    0x66AE, 0x1171, 0x66AF, 0x28FD, 0x66B0, 0x28F8, 0x66B1, 0x1174,\n    0x66B2, 0x28FA, 0x66B4, 0x1173, 0x66B5, 0x28F7, 0x66B7, 0x28FB,\n    0x66B8, 0x12CC, 0x66B9, 0x12C9, 0x66BA, 0x2B65, 0x66BB, 0x2B64,\n    0x66BD, 0x2B63, 0x66BE, 0x2B5E, 0x66C0, 0x2B5F, 0x66C4, 0x12CA,\n    0x66C6, 0x12C7, 0x66C7, 0x12CB, 0x66C8, 0x2B5D, 0x66C9, 0x12C8,\n    0x66CA, 0x2B60, 0x66CB, 0x2B61, 0x66CC, 0x2B66, 0x66CF, 0x2B62,\n    0x66D2, 0x2D72, 0x66D6, 0x13E4, 0x66D8, 0x2F33, 0x66D9, 0x13E3,\n    0x66DA, 0x2F31, 0x66DB, 0x2F32, 0x66DC, 0x14DA, 0x66DD, 0x1585,\n    0x66DE, 0x3099, 0x66E0, 0x1584, 0x66E3, 0x31DA, 0x66E4, 0x31DB,\n    0x66E6, 0x1619, 0x66E8, 0x31D9, 0x66E9, 0x1675, 0x66EB, 0x341D,\n    0x66EC, 0x16FC, 0x66ED, 0x3485, 0x66EE, 0x3486, 0x66F0, 0x02DB,\n    0x66F2, 0x03DC, 0x66F3, 0x03DD, 0x66F4, 0x04BB, 0x66F6, 0x19B1,\n    0x66F7, 0x074F, 0x66F8, 0x08E3, 0x66F9, 0x0ACE, 0x66FC, 0x0A1F,\n    0x66FE, 0x0C80, 0x66FF, 0x0C81, 0x6700, 0x0BF0, 0x6701, 0x2181,\n    0x6703, 0x0E36, 0x6704, 0x26BA, 0x6705, 0x26B9, 0x6708, 0x02DC,\n    0x6709, 0x03DE, 0x670A, 0x19B2, 0x670B, 0x0603, 0x670D, 0x0602,\n    0x670F, 0x1B13, 0x6710, 0x1B14, 0x6712, 0x1CC8, 0x6713, 0x1CC9,\n    0x6714, 0x08E4, 0x6715, 0x08E5, 0x6717, 0x08E6, 0x6718, 0x1F14,\n    0x671B, 0x0AD0, 0x671D, 0x0C83, 0x671F, 0x0C82, 0x6720, 0x2415,\n    0x6721, 0x2522, 0x6722, 0x26BB, 0x6723, 0x2B67, 0x6726, 0x14DB,\n    0x6727, 0x161A, 0x6728, 0x02DD, 0x672A, 0x034A, 0x672B, 0x034B,\n    0x672C, 0x0349, 0x672D, 0x034C, 0x672E, 0x0348, 0x6731, 0x03E1,\n    0x6733, 0x1800, 0x6734, 0x03E0, 0x6735, 0x03E2, 0x6738, 0x17FB,\n    0x6739, 0x17FA, 0x673A, 0x17FD, 0x673B, 0x17FC, 0x673C, 0x17FF,\n    0x673D, 0x03DF, 0x673E, 0x17F9, 0x673F, 0x17FE, 0x6745, 0x18A3,\n    0x6746, 0x04C5, 0x6747, 0x18A4, 0x6748, 0x18A8, 0x6749, 0x04C4,\n    0x674B, 0x18AC, 0x674C, 0x18A7, 0x674D, 0x18AA, 0x674E, 0x04BD,\n    0x674F, 0x04BE, 0x6750, 0x04BF, 0x6751, 0x04C0, 0x6753, 0x04C7,\n    0x6755, 0x18A6, 0x6756, 0x04C2, 0x6757, 0x04C8, 0x6759, 0x18A5,\n    0x675A, 0x18AB, 0x675C, 0x04C1, 0x675D, 0x18A9, 0x675E, 0x04C3,\n    0x675F, 0x04BC, 0x6760, 0x04C6, 0x676A, 0x0618, 0x676C, 0x19B4,\n    0x676D, 0x0604, 0x676F, 0x060E, 0x6770, 0x060F, 0x6771, 0x0607,\n    0x6772, 0x0619, 0x6773, 0x0609, 0x6774, 0x19BC, 0x6775, 0x0614,\n    0x6776, 0x19B7, 0x6777, 0x060A, 0x6778, 0x19C6, 0x6779, 0x19C7,\n    0x677A, 0x19BF, 0x677B, 0x19B8, 0x677C, 0x0617, 0x677D, 0x19C4,\n    0x677E, 0x0612, 0x677F, 0x0610, 0x6781, 0x19C5, 0x6783, 0x19C3,\n    0x6784, 0x19BB, 0x6785, 0x19B3, 0x6786, 0x19BA, 0x6787, 0x060B,\n    0x6789, 0x0611, 0x678B, 0x0605, 0x678C, 0x19BE, 0x678D, 0x19BD,\n    0x678E, 0x19B5, 0x6790, 0x0613, 0x6791, 0x19C1, 0x6792, 0x19B6,\n    0x6793, 0x0616, 0x6794, 0x19C8, 0x6795, 0x0606, 0x6797, 0x060D,\n    0x6798, 0x19B9, 0x6799, 0x19C2, 0x679A, 0x0615, 0x679C, 0x0608,\n    0x679D, 0x060C, 0x679F, 0x19C0, 0x67AE, 0x1B34, 0x67AF, 0x0757,\n    0x67B0, 0x0764, 0x67B2, 0x1B2F, 0x67B3, 0x1B25, 0x67B4, 0x075D,\n    0x67B5, 0x1B23, 0x67B6, 0x0756, 0x67B7, 0x1B1E, 0x67B8, 0x0760,\n    0x67B9, 0x1B2B, 0x67BA, 0x1B18, 0x67BB, 0x1B1A, 0x67C0, 0x1B1D,\n    0x67C1, 0x1B15, 0x67C2, 0x1B2A, 0x67C3, 0x1B3A, 0x67C4, 0x075B,\n    0x67C5, 0x1B1F, 0x67C6, 0x1B31, 0x67C8, 0x1B17, 0x67C9, 0x1B38,\n    0x67CA, 0x1B39, 0x67CB, 0x1B3C, 0x67CC, 0x1B33, 0x67CD, 0x1B24,\n    0x67CE, 0x1B2C, 0x67CF, 0x0761, 0x67D0, 0x0754, 0x67D1, 0x075C,\n    0x67D2, 0x0768, 0x67D3, 0x0751, 0x67D4, 0x0753, 0x67D8, 0x1B1C,\n    0x67D9, 0x0765, 0x67DA, 0x075E, 0x67DB, 0x1B36, 0x67DC, 0x1B19,\n    0x67DD, 0x0767, 0x67DE, 0x0762, 0x67DF, 0x1B22, 0x67E2, 0x0766,\n    0x67E3, 0x1B29, 0x67E4, 0x1B21, 0x67E5, 0x075F, 0x67E6, 0x1B35,\n    0x67E7, 0x1B2D, 0x67E9, 0x0759, 0x67EA, 0x1B3B, 0x67EB, 0x1B20,\n    0x67EC, 0x0755, 0x67ED, 0x1B32, 0x67EE, 0x1B28, 0x67EF, 0x075A,\n    0x67F0, 0x1B2E, 0x67F1, 0x0752, 0x67F2, 0x1B16, 0x67F3, 0x0763,\n    0x67F4, 0x08F5, 0x67F5, 0x0758, 0x67F6, 0x1B27, 0x67F7, 0x1B26,\n    0x67F8, 0x1B1B, 0x67FA, 0x1B37, 0x67FC, 0x1B30, 0x67FF, 0x0750,\n    0x6812, 0x1CDD, 0x6813, 0x08FC, 0x6814, 0x1CDE, 0x6816, 0x1CD2,\n    0x6817, 0x08F1, 0x6818, 0x08FD, 0x681A, 0x1CCB, 0x681C, 0x1CD4,\n    0x681D, 0x1CDC, 0x681F, 0x1CCA, 0x6820, 0x1CE5, 0x6821, 0x08E7,\n    0x6825, 0x1CE4, 0x6826, 0x1CDF, 0x6828, 0x1CE0, 0x6829, 0x08EF,\n    0x682A, 0x08FA, 0x682B, 0x1CD6, 0x682D, 0x1CD7, 0x682E, 0x1CE1,\n    0x682F, 0x1CD8, 0x6831, 0x1CD3, 0x6832, 0x1CCD, 0x6833, 0x1CCE,\n    0x6834, 0x1CDB, 0x6835, 0x1CD5, 0x6838, 0x08E8, 0x6839, 0x08EC,\n    0x683A, 0x1CE3, 0x683B, 0x1CCF, 0x683C, 0x08F8, 0x683D, 0x08F4,\n    0x6840, 0x08F7, 0x6841, 0x08FE, 0x6842, 0x08ED, 0x6843, 0x08F9,\n    0x6844, 0x1CDA, 0x6845, 0x08FB, 0x6846, 0x08EA, 0x6848, 0x08E9,\n    0x6849, 0x1CCC, 0x684B, 0x1CD0, 0x684C, 0x08F2, 0x684D, 0x1CE2,\n    0x684E, 0x1CD9, 0x684F, 0x1CD1, 0x6850, 0x08F6, 0x6851, 0x08F3,\n    0x6853, 0x08EB, 0x6854, 0x08EE, 0x686B, 0x1F29, 0x686D, 0x1F19,\n    0x686E, 0x1F1A, 0x686F, 0x1F1E, 0x6871, 0x1F2D, 0x6872, 0x1F2A,\n    0x6874, 0x1F23, 0x6875, 0x1F22, 0x6876, 0x0AD7, 0x6877, 0x1F26,\n    0x6878, 0x1F35, 0x6879, 0x1F15, 0x687B, 0x1F36, 0x687C, 0x1F28,\n    0x687D, 0x1F3A, 0x687E, 0x1F2E, 0x687F, 0x0AD6, 0x6880, 0x1F2C,\n    0x6881, 0x0AD1, 0x6882, 0x0AE6, 0x6883, 0x0ADC, 0x6885, 0x0AE0,\n    0x6886, 0x0ADF, 0x6887, 0x1F16, 0x6889, 0x1F33, 0x688A, 0x1F39,\n    0x688B, 0x1F31, 0x688C, 0x1F38, 0x688F, 0x1F25, 0x6890, 0x1F17,\n    0x6891, 0x1F37, 0x6892, 0x1F27, 0x6893, 0x0AD4, 0x6894, 0x0AE1,\n    0x6896, 0x1F30, 0x6897, 0x0ADA, 0x689B, 0x1F2F, 0x689C, 0x1F18,\n    0x689D, 0x0AE2, 0x689F, 0x0AE4, 0x68A0, 0x1F32, 0x68A1, 0x0AE5,\n    0x68A2, 0x0AD3, 0x68A3, 0x1F1F, 0x68A4, 0x1F34, 0x68A7, 0x0AD9,\n    0x68A8, 0x0AE3, 0x68A9, 0x1F21, 0x68AA, 0x1F2B, 0x68AB, 0x1F1C,\n    0x68AC, 0x1F20, 0x68AD, 0x0ADE, 0x68AE, 0x1F1B, 0x68AF, 0x0AD2,\n    0x68B0, 0x0ADB, 0x68B1, 0x0AD8, 0x68B2, 0x1F24, 0x68B3, 0x08F0,\n    0x68B4, 0x2198, 0x68B5, 0x0AD5, 0x68C4, 0x0ADD, 0x68C6, 0x219B,\n    0x68C7, 0x21B1, 0x68C8, 0x21A6, 0x68C9, 0x0C97, 0x68CB, 0x0C92,\n    0x68CC, 0x2195, 0x68CD, 0x0C93, 0x68CE, 0x21A5, 0x68D0, 0x219E,\n    0x68D1, 0x21AB, 0x68D2, 0x0C8F, 0x68D3, 0x2183, 0x68D4, 0x21AD,\n    0x68D5, 0x0C85, 0x68D6, 0x218B, 0x68D7, 0x0C88, 0x68D8, 0x0C87,\n    0x68DA, 0x0C98, 0x68DC, 0x2185, 0x68DD, 0x21A7, 0x68DE, 0x21A8,\n    0x68DF, 0x0C8A, 0x68E0, 0x0C86, 0x68E1, 0x2193, 0x68E3, 0x0C91,\n    0x68E4, 0x218E, 0x68E6, 0x21A9, 0x68E7, 0x0C8D, 0x68E8, 0x21A1,\n    0x68E9, 0x21AE, 0x68EA, 0x2188, 0x68EB, 0x218D, 0x68EC, 0x2187,\n    0x68EE, 0x0C8C, 0x68EF, 0x219A, 0x68F0, 0x242B, 0x68F1, 0x2189,\n    0x68F2, 0x0C90, 0x68F3, 0x2192, 0x68F4, 0x21AA, 0x68F5, 0x0C8B,\n    0x68F6, 0x218F, 0x68F7, 0x218C, 0x68F8, 0x219D, 0x68F9, 0x0C8E,\n    0x68FA, 0x0C84, 0x68FB, 0x0C9A, 0x68FC, 0x21A0, 0x68FD, 0x219F,\n    0x6904, 0x2184, 0x6905, 0x0C89, 0x6906, 0x21AC, 0x6907, 0x2194,\n    0x6908, 0x2196, 0x690A, 0x21A3, 0x690B, 0x21A2, 0x690C, 0x2182,\n    0x690D, 0x0C94, 0x690E, 0x0C96, 0x690F, 0x218A, 0x6910, 0x2191,\n    0x6911, 0x2199, 0x6912, 0x0C95, 0x6913, 0x2190, 0x6914, 0x219C,\n    0x6915, 0x21AF, 0x6917, 0x21A4, 0x6925, 0x21B0, 0x692A, 0x2186,\n    0x692F, 0x243F, 0x6930, 0x0E3E, 0x6932, 0x243D, 0x6933, 0x2428,\n    0x6934, 0x242D, 0x6935, 0x2426, 0x6937, 0x2439, 0x6938, 0x2418,\n    0x6939, 0x241F, 0x693B, 0x2437, 0x693C, 0x2441, 0x693D, 0x2429,\n    0x693F, 0x241C, 0x6940, 0x242F, 0x6941, 0x2434, 0x6942, 0x2420,\n    0x6944, 0x2431, 0x6945, 0x241D, 0x6948, 0x2424, 0x6949, 0x2425,\n    0x694A, 0x0E40, 0x694B, 0x2438, 0x694C, 0x2436, 0x694E, 0x2419,\n    0x694F, 0x243B, 0x6951, 0x243C, 0x6952, 0x243E, 0x6953, 0x0E44,\n    0x6954, 0x0E3C, 0x6956, 0x1F1D, 0x6957, 0x2421, 0x6958, 0x2433,\n    0x6959, 0x2422, 0x695A, 0x0E39, 0x695B, 0x0E49, 0x695C, 0x243A,\n    0x695D, 0x0E47, 0x695E, 0x0E43, 0x695F, 0x2417, 0x6960, 0x0E3B,\n    0x6962, 0x241A, 0x6963, 0x0E48, 0x6965, 0x242A, 0x6966, 0x2416,\n    0x6968, 0x0E41, 0x6969, 0x242E, 0x696A, 0x241E, 0x696B, 0x0E42,\n    0x696C, 0x2427, 0x696D, 0x0E38, 0x696E, 0x0C99, 0x696F, 0x2430,\n    0x6970, 0x2197, 0x6971, 0x241B, 0x6974, 0x2435, 0x6975, 0x0E3D,\n    0x6976, 0x2432, 0x6977, 0x0E3A, 0x6978, 0x242C, 0x6979, 0x0E45,\n    0x697A, 0x2423, 0x697B, 0x2440, 0x6982, 0x0E3F, 0x6983, 0x24AF,\n    0x6986, 0x0E46, 0x698D, 0x26C9, 0x698E, 0x26C7, 0x6990, 0x26DD,\n    0x6991, 0x26C5, 0x6993, 0x26D7, 0x6994, 0x0E37, 0x6995, 0x0FF0,\n    0x6996, 0x26C1, 0x6997, 0x26DC, 0x6999, 0x26C6, 0x699A, 0x26D4,\n    0x699B, 0x0FF5, 0x699C, 0x0FEE, 0x699E, 0x26DA, 0x69A0, 0x26BF,\n    0x69A1, 0x26D9, 0x69A3, 0x1000, 0x69A4, 0x26D0, 0x69A5, 0x26E0,\n    0x69A6, 0x0FFE, 0x69A7, 0x26C8, 0x69A8, 0x0FEF, 0x69A9, 0x26CA,\n    0x69AA, 0x26D8, 0x69AB, 0x0FF8, 0x69AC, 0x26C3, 0x69AD, 0x0FFC,\n    0x69AE, 0x0FF2, 0x69AF, 0x26CC, 0x69B0, 0x26C2, 0x69B1, 0x26BC,\n    0x69B3, 0x26D6, 0x69B4, 0x0FF9, 0x69B5, 0x26DF, 0x69B6, 0x26BD,\n    0x69B7, 0x0FF6, 0x69B9, 0x26D2, 0x69BB, 0x0FF7, 0x69BC, 0x26C4,\n    0x69BD, 0x26CF, 0x69BE, 0x26CB, 0x69BF, 0x26CD, 0x69C1, 0x0FF1,\n    0x69C2, 0x26DE, 0x69C3, 0x0FFF, 0x69C4, 0x26CE, 0x69C6, 0x26E1,\n    0x69C9, 0x26BE, 0x69CA, 0x26D3, 0x69CB, 0x0FF4, 0x69CC, 0x0FFD,\n    0x69CD, 0x0FFB, 0x69CE, 0x26C0, 0x69CF, 0x26D5, 0x69D0, 0x0FFA,\n    0x69D3, 0x0FF3, 0x69D4, 0x26D1, 0x69D9, 0x26DB, 0x69E2, 0x2909,\n    0x69E4, 0x2905, 0x69E5, 0x2901, 0x69E6, 0x2915, 0x69E7, 0x2912,\n    0x69E8, 0x1177, 0x69EB, 0x2919, 0x69EC, 0x2908, 0x69ED, 0x1182,\n    0x69EE, 0x290F, 0x69F1, 0x2904, 0x69F2, 0x290E, 0x69F3, 0x117F,\n    0x69F4, 0x2922, 0x69F6, 0x291F, 0x69F7, 0x2911, 0x69F8, 0x2902,\n    0x69FB, 0x2916, 0x69FC, 0x2918, 0x69FD, 0x117B, 0x69FE, 0x290C,\n    0x69FF, 0x2907, 0x6A00, 0x28FE, 0x6A01, 0x1178, 0x6A02, 0x1180,\n    0x6A04, 0x291B, 0x6A05, 0x1181, 0x6A06, 0x28FF, 0x6A07, 0x2921,\n    0x6A08, 0x2914, 0x6A09, 0x291A, 0x6A0A, 0x117E, 0x6A0D, 0x2917,\n    0x6A0F, 0x291E, 0x6A11, 0x1183, 0x6A13, 0x117D, 0x6A14, 0x2910,\n    0x6A15, 0x2903, 0x6A16, 0x2923, 0x6A17, 0x2900, 0x6A18, 0x291C,\n    0x6A19, 0x117A, 0x6A1B, 0x290A, 0x6A1D, 0x290B, 0x6A1E, 0x1179,\n    0x6A1F, 0x1176, 0x6A20, 0x2906, 0x6A21, 0x117C, 0x6A23, 0x1175,\n    0x6A25, 0x291D, 0x6A26, 0x2920, 0x6A27, 0x290D, 0x6A28, 0x2B74,\n    0x6A32, 0x2B6C, 0x6A34, 0x2B68, 0x6A35, 0x12D9, 0x6A38, 0x12CE,\n    0x6A39, 0x12D3, 0x6A3A, 0x12CF, 0x6A3B, 0x2B76, 0x6A3C, 0x2B81,\n    0x6A3D, 0x12CD, 0x6A3E, 0x2B6E, 0x6A3F, 0x2B77, 0x6A40, 0x2913,\n    0x6A41, 0x2B78, 0x6A44, 0x12D4, 0x6A46, 0x2B87, 0x6A47, 0x12D8,\n    0x6A48, 0x12DB, 0x6A49, 0x2B6A, 0x6A4B, 0x12D7, 0x6A4D, 0x2B85,\n    0x6A4E, 0x2B86, 0x6A4F, 0x2B7C, 0x6A50, 0x2B7B, 0x6A51, 0x2B73,\n    0x6A54, 0x2B7D, 0x6A55, 0x2B84, 0x6A56, 0x2B83, 0x6A58, 0x12D2,\n    0x6A59, 0x12D0, 0x6A5A, 0x2B75, 0x6A5B, 0x2B72, 0x6A5D, 0x2B6F,\n    0x6A5E, 0x2B82, 0x6A5F, 0x12DA, 0x6A60, 0x2B80, 0x6A61, 0x12D6,\n    0x6A62, 0x12D5, 0x6A64, 0x2B7A, 0x6A66, 0x2B69, 0x6A67, 0x2B6B,\n    0x6A68, 0x2B6D, 0x6A69, 0x2B7F, 0x6A6A, 0x2B79, 0x6A6B, 0x12D1,\n    0x6A6D, 0x2B70, 0x6A6F, 0x2B7E, 0x6A76, 0x2B71, 0x6A7E, 0x13EC,\n    0x6A7F, 0x2D84, 0x6A80, 0x13E5, 0x6A81, 0x2D75, 0x6A83, 0x2D80,\n    0x6A84, 0x13E7, 0x6A85, 0x2D87, 0x6A87, 0x2D7C, 0x6A89, 0x2D77,\n    0x6A8C, 0x2D88, 0x6A8D, 0x2D73, 0x6A8E, 0x2D7E, 0x6A90, 0x13EE,\n    0x6A91, 0x2D83, 0x6A92, 0x2D89, 0x6A93, 0x2D7D, 0x6A94, 0x13E6,\n    0x6A95, 0x2D7F, 0x6A96, 0x2D74, 0x6A97, 0x13ED, 0x6A9A, 0x2D86,\n    0x6A9B, 0x2D79, 0x6A9C, 0x13E9, 0x6A9E, 0x2D7B, 0x6A9F, 0x2D78,\n    0x6AA0, 0x13EF, 0x6AA1, 0x2D7A, 0x6AA2, 0x13E8, 0x6AA3, 0x13EB,\n    0x6AA4, 0x2D82, 0x6AA5, 0x2D76, 0x6AA6, 0x2D85, 0x6AA8, 0x2D81,\n    0x6AAC, 0x14DD, 0x6AAD, 0x2F3E, 0x6AAE, 0x14E2, 0x6AAF, 0x14E3,\n    0x6AB3, 0x14DC, 0x6AB4, 0x2F3D, 0x6AB6, 0x2F3A, 0x6AB7, 0x2F3B,\n    0x6AB8, 0x14E0, 0x6AB9, 0x2F35, 0x6ABA, 0x2F39, 0x6ABB, 0x14DF,\n    0x6ABD, 0x2F36, 0x6AC2, 0x14E1, 0x6AC3, 0x14DE, 0x6AC5, 0x2F34,\n    0x6AC6, 0x2F38, 0x6AC7, 0x2F3C, 0x6ACB, 0x309F, 0x6ACC, 0x309C,\n    0x6ACD, 0x30A5, 0x6ACF, 0x30A4, 0x6AD0, 0x30A2, 0x6AD1, 0x309D,\n    0x6AD3, 0x1589, 0x6AD9, 0x309E, 0x6ADA, 0x1588, 0x6ADB, 0x13EA,\n    0x6ADC, 0x30A1, 0x6ADD, 0x1587, 0x6ADE, 0x30A6, 0x6ADF, 0x30A0,\n    0x6AE0, 0x309B, 0x6AE1, 0x2F37, 0x6AE5, 0x1586, 0x6AE7, 0x309A,\n    0x6AE8, 0x31DF, 0x6AEA, 0x31DE, 0x6AEB, 0x30A3, 0x6AEC, 0x161B,\n    0x6AEE, 0x31E2, 0x6AEF, 0x31E3, 0x6AF0, 0x31DD, 0x6AF1, 0x31E1,\n    0x6AF3, 0x31DC, 0x6AF8, 0x32D6, 0x6AF9, 0x31E0, 0x6AFA, 0x1678,\n    0x6AFB, 0x1676, 0x6AFC, 0x32D4, 0x6B00, 0x32D7, 0x6B02, 0x32D3,\n    0x6B03, 0x32D5, 0x6B04, 0x1677, 0x6B08, 0x3386, 0x6B09, 0x3387,\n    0x6B0A, 0x16C6, 0x6B0B, 0x3385, 0x6B0F, 0x3420, 0x6B10, 0x16FD,\n    0x6B11, 0x341E, 0x6B12, 0x341F, 0x6B13, 0x3487, 0x6B16, 0x1743,\n    0x6B17, 0x34CE, 0x6B18, 0x34CC, 0x6B19, 0x34CD, 0x6B1A, 0x34CF,\n    0x6B1E, 0x3534, 0x6B20, 0x02DE, 0x6B21, 0x03E3, 0x6B23, 0x061A,\n    0x6B25, 0x19C9, 0x6B28, 0x1B3D, 0x6B2C, 0x1CE6, 0x6B2D, 0x1CE8,\n    0x6B2F, 0x1CE7, 0x6B31, 0x1CE9, 0x6B32, 0x0AE7, 0x6B33, 0x1F3C,\n    0x6B34, 0x1CEA, 0x6B36, 0x1F3B, 0x6B37, 0x1F3D, 0x6B38, 0x1F3E,\n    0x6B39, 0x21B2, 0x6B3A, 0x0C9C, 0x6B3B, 0x21B3, 0x6B3C, 0x21B5,\n    0x6B3D, 0x0C9D, 0x6B3E, 0x0C9B, 0x6B3F, 0x21B4, 0x6B41, 0x2447,\n    0x6B42, 0x2445, 0x6B43, 0x2444, 0x6B45, 0x2443, 0x6B46, 0x2442,\n    0x6B47, 0x0E4A, 0x6B48, 0x2446, 0x6B49, 0x1001, 0x6B4A, 0x26E2,\n    0x6B4B, 0x26E4, 0x6B4C, 0x1002, 0x6B4D, 0x26E3, 0x6B4E, 0x1185,\n    0x6B50, 0x1184, 0x6B51, 0x2924, 0x6B54, 0x2B89, 0x6B55, 0x2B88,\n    0x6B56, 0x2B8A, 0x6B59, 0x12DC, 0x6B5B, 0x2D8A, 0x6B5C, 0x13F0,\n    0x6B5E, 0x2F3F, 0x6B5F, 0x14E4, 0x6B60, 0x30A7, 0x6B61, 0x16C7,\n    0x6B62, 0x02DF, 0x6B63, 0x034D, 0x6B64, 0x03E4, 0x6B65, 0x04C9,\n    0x6B66, 0x061B, 0x6B67, 0x061C, 0x6B6A, 0x0769, 0x6B6D, 0x1CEB,\n    0x6B72, 0x0E4B, 0x6B76, 0x29A2, 0x6B77, 0x12DD, 0x6B78, 0x14E5,\n    0x6B79, 0x02E0, 0x6B7B, 0x03E5, 0x6B7E, 0x19CB, 0x6B7F, 0x061D,\n    0x6B80, 0x19CA, 0x6B82, 0x1B3E, 0x6B83, 0x076A, 0x6B84, 0x1B3F,\n    0x6B86, 0x076B, 0x6B88, 0x1CED, 0x6B89, 0x0900, 0x6B8A, 0x08FF,\n    0x6B8C, 0x1F43, 0x6B8D, 0x1F41, 0x6B8E, 0x1F42, 0x6B8F, 0x1F40,\n    0x6B91, 0x1F3F, 0x6B94, 0x21B6, 0x6B95, 0x21B9, 0x6B96, 0x0C9F,\n    0x6B97, 0x21B7, 0x6B98, 0x0C9E, 0x6B99, 0x21B8, 0x6B9B, 0x2448,\n    0x6B9E, 0x26E5, 0x6B9F, 0x26E6, 0x6BA0, 0x26E7, 0x6BA2, 0x2927,\n    0x6BA3, 0x2926, 0x6BA4, 0x1186, 0x6BA5, 0x2925, 0x6BA6, 0x2928,\n    0x6BA7, 0x2B8B, 0x6BAA, 0x2B8C, 0x6BAB, 0x2B8D, 0x6BAD, 0x2D8B,\n    0x6BAE, 0x13F1, 0x6BAF, 0x14E6, 0x6BB0, 0x30A8, 0x6BB2, 0x1679,\n    0x6BB3, 0x178A, 0x6BB5, 0x076C, 0x6BB6, 0x1B40, 0x6BB7, 0x0901,\n    0x6BBA, 0x0AE8, 0x6BBC, 0x0CA0, 0x6BBD, 0x21BA, 0x6BBF, 0x0E4D,\n    0x6BC0, 0x0E4C, 0x6BC3, 0x26E8, 0x6BC4, 0x26E9, 0x6BC5, 0x1187,\n    0x6BC6, 0x1188, 0x6BC7, 0x2B8F, 0x6BC8, 0x2B8E, 0x6BC9, 0x2F40,\n    0x6BCA, 0x3421, 0x6BCB, 0x02E1, 0x6BCC, 0x178B, 0x6BCD, 0x034E,\n    0x6BCF, 0x04CA, 0x6BD0, 0x18AD, 0x6BD2, 0x076D, 0x6BD3, 0x0E4E,\n    0x6BD4, 0x02E2, 0x6BD6, 0x1B41, 0x6BD7, 0x076E, 0x6BD8, 0x1B42,\n    0x6BDA, 0x13F2, 0x6BDB, 0x02E3, 0x6BDE, 0x19CC, 0x6BE0, 0x1B43,\n    0x6BE2, 0x1CF2, 0x6BE3, 0x1CF1, 0x6BE4, 0x1CEF, 0x6BE6, 0x1CEE,\n    0x6BE7, 0x1CF3, 0x6BE8, 0x1CF0, 0x6BEB, 0x0AE9, 0x6BEC, 0x0AEA,\n    0x6BEF, 0x0CA1, 0x6BF0, 0x21BB, 0x6BF2, 0x21BC, 0x6BF3, 0x21BD,\n    0x6BF7, 0x244C, 0x6BF8, 0x244D, 0x6BF9, 0x244B, 0x6BFB, 0x2449,\n    0x6BFC, 0x244A, 0x6BFD, 0x0E4F, 0x6BFE, 0x26EA, 0x6BFF, 0x292B,\n    0x6C00, 0x292A, 0x6C01, 0x2929, 0x6C02, 0x292C, 0x6C03, 0x2B91,\n    0x6C04, 0x2B90, 0x6C05, 0x12DE, 0x6C06, 0x2B92, 0x6C08, 0x13F3,\n    0x6C09, 0x2D8C, 0x6C0B, 0x2F41, 0x6C0C, 0x30A9, 0x6C0D, 0x3388,\n    0x6C0F, 0x02E4, 0x6C10, 0x0350, 0x6C11, 0x034F, 0x6C13, 0x061E,\n    0x6C14, 0x178C, 0x6C15, 0x17AA, 0x6C16, 0x03E6, 0x6C18, 0x1801,\n    0x6C19, 0x18AE, 0x6C1A, 0x18AF, 0x6C1B, 0x061F, 0x6C1D, 0x19CD,\n    0x6C1F, 0x076F, 0x6C20, 0x1B44, 0x6C21, 0x1B45, 0x6C23, 0x0902,\n    0x6C24, 0x0906, 0x6C25, 0x1CF4, 0x6C26, 0x0905, 0x6C27, 0x0903,\n    0x6C28, 0x0904, 0x6C2A, 0x1F44, 0x6C2B, 0x0AEB, 0x6C2C, 0x0CA4,\n    0x6C2E, 0x0CA2, 0x6C2F, 0x0CA3, 0x6C30, 0x21BE, 0x6C33, 0x1003,\n    0x6C34, 0x02E5, 0x6C36, 0x17AB, 0x6C38, 0x0351, 0x6C3B, 0x17AE,\n    0x6C3E, 0x0354, 0x6C3F, 0x17AD, 0x6C40, 0x0353, 0x6C41, 0x0352,\n    0x6C42, 0x04CB, 0x6C43, 0x17AC, 0x6C46, 0x1802, 0x6C4A, 0x1806,\n    0x6C4B, 0x1808, 0x6C4C, 0x1809, 0x6C4D, 0x03F0, 0x6C4E, 0x03F1,\n    0x6C4F, 0x1805, 0x6C50, 0x03EC, 0x6C52, 0x1803, 0x6C54, 0x1807,\n    0x6C55, 0x03ED, 0x6C57, 0x03E8, 0x6C59, 0x03E9, 0x6C5B, 0x03EF,\n    0x6C5C, 0x1804, 0x6C5D, 0x03E7, 0x6C5E, 0x04CC, 0x6C5F, 0x03EA,\n    0x6C60, 0x03EB, 0x6C61, 0x03EE, 0x6C65, 0x18C0, 0x6C66, 0x18BE,\n    0x6C67, 0x18B1, 0x6C68, 0x04D8, 0x6C69, 0x18B8, 0x6C6A, 0x04D3,\n    0x6C6B, 0x18B2, 0x6C6D, 0x18BA, 0x6C6F, 0x18B7, 0x6C70, 0x04D6,\n    0x6C71, 0x18B6, 0x6C72, 0x04DD, 0x6C73, 0x18BF, 0x6C74, 0x04DF,\n    0x6C76, 0x04E1, 0x6C78, 0x18B0, 0x6C7A, 0x04D4, 0x6C7B, 0x18C1,\n    0x6C7D, 0x04DB, 0x6C7E, 0x04DE, 0x6C80, 0x19E4, 0x6C81, 0x04CE,\n    0x6C82, 0x04E5, 0x6C83, 0x04DC, 0x6C84, 0x18B3, 0x6C85, 0x04D1,\n    0x6C86, 0x04E0, 0x6C87, 0x18BB, 0x6C88, 0x04CF, 0x6C89, 0x04D0,\n    0x6C8A, 0x19E2, 0x6C8B, 0x18B4, 0x6C8C, 0x04D7, 0x6C8D, 0x04E2,\n    0x6C8E, 0x18C2, 0x6C8F, 0x18B5, 0x6C90, 0x04D5, 0x6C92, 0x04DA,\n    0x6C93, 0x19CE, 0x6C94, 0x04E3, 0x6C95, 0x18BC, 0x6C96, 0x04D9,\n    0x6C98, 0x04E4, 0x6C99, 0x04CD, 0x6C9A, 0x18B9, 0x6C9B, 0x04D2,\n    0x6C9C, 0x18BD, 0x6C9D, 0x19E3, 0x6CAB, 0x062B, 0x6CAC, 0x063B,\n    0x6CAD, 0x19D5, 0x6CAE, 0x0632, 0x6CB0, 0x19EA, 0x6CB1, 0x0623,\n    0x6CB3, 0x0626, 0x6CB4, 0x19E1, 0x6CB6, 0x19D3, 0x6CB7, 0x19D7,\n    0x6CB8, 0x062E, 0x6CB9, 0x0630, 0x6CBA, 0x19DA, 0x6CBB, 0x0637,\n    0x6CBC, 0x0629, 0x6CBD, 0x0627, 0x6CBE, 0x0628, 0x6CBF, 0x0636,\n    0x6CC0, 0x19E6, 0x6CC1, 0x0631, 0x6CC2, 0x19D9, 0x6CC3, 0x19DB,\n    0x6CC4, 0x062F, 0x6CC5, 0x0634, 0x6CC6, 0x19DC, 0x6CC7, 0x19E9,\n    0x6CC9, 0x0770, 0x6CCA, 0x063A, 0x6CCC, 0x0624, 0x6CCD, 0x19E8,\n    0x6CCF, 0x19EC, 0x6CD0, 0x19D8, 0x6CD1, 0x19EE, 0x6CD2, 0x19DF,\n    0x6CD3, 0x062D, 0x6CD4, 0x19D4, 0x6CD5, 0x062C, 0x6CD6, 0x063E,\n    0x6CD7, 0x0633, 0x6CD9, 0x19D2, 0x6CDA, 0x1B4E, 0x6CDB, 0x0639,\n    0x6CDC, 0x063D, 0x6CDD, 0x19E0, 0x6CDE, 0x19E5, 0x6CE0, 0x063F,\n    0x6CE1, 0x0638, 0x6CE2, 0x062A, 0x6CE3, 0x0620, 0x6CE5, 0x0625,\n    0x6CE7, 0x19D6, 0x6CE8, 0x0621, 0x6CE9, 0x19ED, 0x6CEB, 0x19D0,\n    0x6CEC, 0x19CF, 0x6CED, 0x19DD, 0x6CEE, 0x19D1, 0x6CEF, 0x063C,\n    0x6CF0, 0x0907, 0x6CF1, 0x0635, 0x6CF2, 0x19DE, 0x6CF3, 0x0622,\n    0x6CF5, 0x077F, 0x6CF9, 0x19EB, 0x6D00, 0x1B55, 0x6D01, 0x1B58,\n    0x6D03, 0x1B5B, 0x6D04, 0x1B50, 0x6D07, 0x1B5E, 0x6D08, 0x1B61,\n    0x6D09, 0x1B63, 0x6D0A, 0x1B4D, 0x6D0B, 0x0771, 0x6D0C, 0x0776,\n    0x6D0D, 0x1CF9, 0x6D0E, 0x0786, 0x6D0F, 0x1B5C, 0x6D10, 0x1B64,\n    0x6D11, 0x1B54, 0x6D12, 0x1B4C, 0x6D16, 0x1D14, 0x6D17, 0x0779,\n    0x6D18, 0x1B59, 0x6D19, 0x1B51, 0x6D1A, 0x1B53, 0x6D1B, 0x077E,\n    0x6D1D, 0x1B56, 0x6D1E, 0x0778, 0x6D1F, 0x1B49, 0x6D20, 0x1B5F,\n    0x6D22, 0x1B62, 0x6D25, 0x0775, 0x6D27, 0x0781, 0x6D28, 0x1B46,\n    0x6D29, 0x0783, 0x6D2A, 0x0773, 0x6D2B, 0x0787, 0x6D2C, 0x1B60,\n    0x6D2D, 0x1B48, 0x6D2E, 0x0784, 0x6D2F, 0x1D0E, 0x6D30, 0x19E7,\n    0x6D31, 0x0777, 0x6D32, 0x0772, 0x6D33, 0x1B4F, 0x6D34, 0x1B47,\n    0x6D35, 0x0785, 0x6D36, 0x077D, 0x6D37, 0x1B5A, 0x6D38, 0x0782,\n    0x6D39, 0x0780, 0x6D3A, 0x1B52, 0x6D3B, 0x077A, 0x6D3C, 0x1B4A,\n    0x6D3D, 0x077B, 0x6D3E, 0x077C, 0x6D3F, 0x1B4B, 0x6D40, 0x1B5D,\n    0x6D41, 0x0774, 0x6D42, 0x1B57, 0x6D58, 0x1CFC, 0x6D59, 0x090F,\n    0x6D5A, 0x0914, 0x6D5E, 0x1D05, 0x6D5F, 0x1D0B, 0x6D60, 0x1D07,\n    0x6D61, 0x1CFA, 0x6D62, 0x1CFD, 0x6D63, 0x1CF6, 0x6D64, 0x1CF7,\n    0x6D65, 0x091B, 0x6D66, 0x090C, 0x6D67, 0x1D06, 0x6D68, 0x1D0F,\n    0x6D69, 0x0916, 0x6D6A, 0x0908, 0x6D6C, 0x0911, 0x6D6D, 0x1CFE,\n    0x6D6E, 0x0913, 0x6D6F, 0x1CFF, 0x6D70, 0x1D09, 0x6D74, 0x0915,\n    0x6D75, 0x1D18, 0x6D76, 0x1CF8, 0x6D77, 0x090E, 0x6D78, 0x090D,\n    0x6D79, 0x0919, 0x6D7A, 0x1CF5, 0x6D7B, 0x1D16, 0x6D7C, 0x1D0A,\n    0x6D7D, 0x1D17, 0x6D7E, 0x1D11, 0x6D7F, 0x1D03, 0x6D80, 0x1D12,\n    0x6D82, 0x1D0C, 0x6D83, 0x1D15, 0x6D84, 0x1D13, 0x6D85, 0x091A,\n    0x6D86, 0x1D04, 0x6D87, 0x090B, 0x6D88, 0x090A, 0x6D89, 0x0912,\n    0x6D8A, 0x0918, 0x6D8B, 0x1D10, 0x6D8C, 0x0917, 0x6D8D, 0x1D01,\n    0x6D8E, 0x0AEC, 0x6D90, 0x1D19, 0x6D91, 0x1D00, 0x6D92, 0x1CFB,\n    0x6D93, 0x0910, 0x6D94, 0x091C, 0x6D95, 0x0909, 0x6D97, 0x1D08,\n    0x6D98, 0x1D0D, 0x6DAA, 0x0B0E, 0x6DAB, 0x1F46, 0x6DAC, 0x1F4A,\n    0x6DAE, 0x0AFB, 0x6DAF, 0x0AF9, 0x6DB2, 0x0AF0, 0x6DB3, 0x1F48,\n    0x6DB4, 0x1F47, 0x6DB5, 0x0B04, 0x6DB7, 0x1F4D, 0x6DB8, 0x0AFE,\n    0x6DBA, 0x1F5F, 0x6DBB, 0x1F6B, 0x6DBC, 0x0AED, 0x6DBD, 0x1F5C,\n    0x6DBE, 0x1F55, 0x6DBF, 0x0B10, 0x6DC0, 0x1F45, 0x6DC2, 0x1F61,\n    0x6DC4, 0x0B0D, 0x6DC5, 0x0B01, 0x6DC6, 0x0B0C, 0x6DC7, 0x0AF7,\n    0x6DC8, 0x1F51, 0x6DC9, 0x1F63, 0x6DCA, 0x1F5B, 0x6DCB, 0x0AF8,\n    0x6DCC, 0x0AF2, 0x6DCD, 0x1F69, 0x6DCF, 0x1F62, 0x6DD0, 0x1F64,\n    0x6DD1, 0x0AFA, 0x6DD2, 0x0B02, 0x6DD3, 0x1F66, 0x6DD4, 0x1F4F,\n    0x6DD5, 0x1F60, 0x6DD6, 0x1F54, 0x6DD7, 0x1F68, 0x6DD8, 0x0B07,\n    0x6DD9, 0x0AEF, 0x6DDA, 0x0B05, 0x6DDB, 0x1F59, 0x6DDC, 0x1F57,\n    0x6DDD, 0x1F58, 0x6DDE, 0x0AFC, 0x6DDF, 0x1F53, 0x6DE0, 0x1F52,\n    0x6DE1, 0x0AF1, 0x6DE2, 0x1F4C, 0x6DE3, 0x1F6A, 0x6DE4, 0x0AF3,\n    0x6DE5, 0x1F56, 0x6DE6, 0x0B11, 0x6DE8, 0x0B0B, 0x6DE9, 0x1F4B,\n    0x6DEA, 0x0B08, 0x6DEB, 0x0B06, 0x6DEC, 0x0B0F, 0x6DED, 0x1F5D,\n    0x6DEE, 0x0B0A, 0x6DEF, 0x1D02, 0x6DF0, 0x1F5E, 0x6DF1, 0x0B09,\n    0x6DF2, 0x1F65, 0x6DF3, 0x0AEE, 0x6DF4, 0x1F5A, 0x6DF5, 0x0B00,\n    0x6DF6, 0x1F4E, 0x6DF7, 0x0AFF, 0x6DF9, 0x0AFD, 0x6DFA, 0x0AF5,\n    0x6DFB, 0x0AF4, 0x6DFC, 0x21BF, 0x6DFD, 0x1F67, 0x6E00, 0x1F50,\n    0x6E03, 0x21D4, 0x6E05, 0x0AF6, 0x6E19, 0x0CC1, 0x6E1A, 0x0B03,\n    0x6E1B, 0x0CAF, 0x6E1C, 0x21CE, 0x6E1D, 0x0CBD, 0x6E1F, 0x21C2,\n    0x6E20, 0x0CAC, 0x6E21, 0x0CA8, 0x6E22, 0x21E0, 0x6E23, 0x0CAE,\n    0x6E24, 0x0CB2, 0x6E25, 0x0CAD, 0x6E26, 0x0CB6, 0x6E27, 0x21E4,\n    0x6E28, 0x21DB, 0x6E2B, 0x21C9, 0x6E2C, 0x0CBB, 0x6E2D, 0x0CB5,\n    0x6E2E, 0x21D5, 0x6E2F, 0x0CA5, 0x6E30, 0x21E1, 0x6E31, 0x21DA,\n    0x6E32, 0x0CA9, 0x6E33, 0x21CF, 0x6E34, 0x0CB8, 0x6E35, 0x21EC,\n    0x6E36, 0x21ED, 0x6E38, 0x0CA6, 0x6E39, 0x21DF, 0x6E3A, 0x0CBA,\n    0x6E3B, 0x21D3, 0x6E3C, 0x21C5, 0x6E3D, 0x21C6, 0x6E3E, 0x0CBE,\n    0x6E3F, 0x21CA, 0x6E40, 0x21D1, 0x6E41, 0x21CB, 0x6E43, 0x0CBC,\n    0x6E44, 0x0CC4, 0x6E45, 0x21C7, 0x6E46, 0x21C0, 0x6E47, 0x21C1,\n    0x6E49, 0x21C3, 0x6E4A, 0x0CAB, 0x6E4B, 0x21D0, 0x6E4D, 0x0CB9,\n    0x6E4E, 0x0CC2, 0x6E51, 0x21D2, 0x6E52, 0x21EA, 0x6E53, 0x21E2,\n    0x6E54, 0x0CA7, 0x6E55, 0x21E8, 0x6E56, 0x0CB3, 0x6E58, 0x0CB1,\n    0x6E5A, 0x21EE, 0x6E5B, 0x0CB0, 0x6E5C, 0x21D8, 0x6E5D, 0x21CC,\n    0x6E5E, 0x21D6, 0x6E5F, 0x0CC7, 0x6E60, 0x21DC, 0x6E61, 0x21D9,\n    0x6E62, 0x21C8, 0x6E63, 0x0CC3, 0x6E64, 0x21E6, 0x6E65, 0x21E3,\n    0x6E66, 0x21EB, 0x6E67, 0x0CAA, 0x6E68, 0x21D7, 0x6E69, 0x0CC6,\n    0x6E6B, 0x21DE, 0x6E6E, 0x0CB4, 0x6E6F, 0x0CB7, 0x6E71, 0x21DD,\n    0x6E72, 0x0CC5, 0x6E73, 0x21CD, 0x6E74, 0x1F49, 0x6E77, 0x21E7,\n    0x6E78, 0x21E5, 0x6E79, 0x21E9, 0x6E88, 0x21C4, 0x6E89, 0x0CC0,\n    0x6E8D, 0x246C, 0x6E8E, 0x246B, 0x6E8F, 0x2451, 0x6E90, 0x0E55,\n    0x6E92, 0x246A, 0x6E93, 0x2454, 0x6E94, 0x2455, 0x6E96, 0x0E5F,\n    0x6E97, 0x2473, 0x6E98, 0x0E5A, 0x6E99, 0x2469, 0x6E9B, 0x244E,\n    0x6E9C, 0x0E60, 0x6E9D, 0x0E56, 0x6E9E, 0x245D, 0x6E9F, 0x2453,\n    0x6EA0, 0x2456, 0x6EA1, 0x246E, 0x6EA2, 0x0E50, 0x6EA3, 0x2475,\n    0x6EA4, 0x246D, 0x6EA5, 0x0E59, 0x6EA6, 0x2462, 0x6EA7, 0x0E64,\n    0x6EAA, 0x0E63, 0x6EAB, 0x0E5D, 0x6EAE, 0x2474, 0x6EAF, 0x0E51,\n    0x6EB0, 0x2460, 0x6EB1, 0x2457, 0x6EB2, 0x2464, 0x6EB3, 0x2470,\n    0x6EB4, 0x0E65, 0x6EB6, 0x0E53, 0x6EB7, 0x245F, 0x6EB9, 0x2458,\n    0x6EBA, 0x0E5C, 0x6EBC, 0x0E5B, 0x6EBD, 0x245B, 0x6EBE, 0x2465,\n    0x6EBF, 0x246F, 0x6EC0, 0x2452, 0x6EC1, 0x245C, 0x6EC2, 0x0E54,\n    0x6EC3, 0x2466, 0x6EC4, 0x0E61, 0x6EC5, 0x0E58, 0x6EC6, 0x2459,\n    0x6EC7, 0x0E57, 0x6EC8, 0x2450, 0x6EC9, 0x245E, 0x6ECA, 0x2472,\n    0x6ECB, 0x0CBF, 0x6ECC, 0x101F, 0x6ECD, 0x2461, 0x6ECE, 0x26EB,\n    0x6ECF, 0x2463, 0x6ED0, 0x2471, 0x6ED1, 0x0E5E, 0x6ED2, 0x245A,\n    0x6ED3, 0x0E52, 0x6ED4, 0x0E62, 0x6ED5, 0x119A, 0x6ED6, 0x244F,\n    0x6ED8, 0x2468, 0x6EDC, 0x2467, 0x6EEB, 0x2707, 0x6EEC, 0x101C,\n    0x6EED, 0x26FC, 0x6EEE, 0x2701, 0x6EEF, 0x1011, 0x6EF1, 0x26ED,\n    0x6EF2, 0x101E, 0x6EF4, 0x1008, 0x6EF5, 0x26EC, 0x6EF6, 0x270D,\n    0x6EF7, 0x1020, 0x6EF8, 0x26F0, 0x6EF9, 0x2700, 0x6EFB, 0x26F2,\n    0x6EFC, 0x2710, 0x6EFD, 0x270C, 0x6EFE, 0x1006, 0x6EFF, 0x1010,\n    0x6F00, 0x2946, 0x6F01, 0x101D, 0x6F02, 0x100E, 0x6F03, 0x26EE,\n    0x6F05, 0x270B, 0x6F06, 0x1012, 0x6F07, 0x2708, 0x6F08, 0x2715,\n    0x6F09, 0x26F4, 0x6F0A, 0x26FD, 0x6F0D, 0x2713, 0x6F0E, 0x2709,\n    0x6F0F, 0x100D, 0x6F12, 0x26FB, 0x6F13, 0x1007, 0x6F14, 0x1005,\n    0x6F15, 0x1017, 0x6F18, 0x26F9, 0x6F19, 0x26F6, 0x6F1A, 0x26F7,\n    0x6F1C, 0x270F, 0x6F1E, 0x2714, 0x6F1F, 0x2712, 0x6F20, 0x100B,\n    0x6F21, 0x2716, 0x6F22, 0x100F, 0x6F23, 0x1016, 0x6F25, 0x26EF,\n    0x6F26, 0x292E, 0x6F27, 0x26F8, 0x6F29, 0x1009, 0x6F2A, 0x101B,\n    0x6F2B, 0x1018, 0x6F2C, 0x100C, 0x6F2D, 0x2702, 0x6F2E, 0x26F3,\n    0x6F2F, 0x1019, 0x6F30, 0x2704, 0x6F31, 0x1013, 0x6F32, 0x1015,\n    0x6F33, 0x1004, 0x6F35, 0x2706, 0x6F36, 0x26FE, 0x6F37, 0x26F1,\n    0x6F38, 0x1014, 0x6F39, 0x270E, 0x6F3A, 0x2711, 0x6F3B, 0x26FA,\n    0x6F3C, 0x2705, 0x6F3E, 0x100A, 0x6F3F, 0x1189, 0x6F40, 0x2703,\n    0x6F41, 0x292D, 0x6F43, 0x270A, 0x6F4E, 0x26F5, 0x6F4F, 0x2937,\n    0x6F50, 0x2941, 0x6F51, 0x118C, 0x6F52, 0x2940, 0x6F53, 0x294C,\n    0x6F54, 0x118E, 0x6F55, 0x293E, 0x6F57, 0x2942, 0x6F58, 0x1199,\n    0x6F5A, 0x2939, 0x6F5B, 0x1191, 0x6F5D, 0x2945, 0x6F5E, 0x2B9A,\n    0x6F5F, 0x119D, 0x6F60, 0x119C, 0x6F61, 0x2947, 0x6F62, 0x2936,\n    0x6F63, 0x2951, 0x6F64, 0x1197, 0x6F66, 0x118D, 0x6F67, 0x294A,\n    0x6F69, 0x294E, 0x6F6A, 0x2953, 0x6F6B, 0x2948, 0x6F6C, 0x293C,\n    0x6F6D, 0x1190, 0x6F6E, 0x1193, 0x6F6F, 0x119B, 0x6F70, 0x1196,\n    0x6F72, 0x293F, 0x6F73, 0x26FF, 0x6F76, 0x293B, 0x6F77, 0x2952,\n    0x6F78, 0x1192, 0x6F7A, 0x1195, 0x6F7B, 0x2954, 0x6F7C, 0x118A,\n    0x6F7D, 0x2949, 0x6F7E, 0x292F, 0x6F7F, 0x294F, 0x6F80, 0x13FC,\n    0x6F82, 0x293D, 0x6F84, 0x118B, 0x6F85, 0x2938, 0x6F86, 0x118F,\n    0x6F87, 0x2930, 0x6F88, 0x101A, 0x6F89, 0x2934, 0x6F8B, 0x294D,\n    0x6F8C, 0x2935, 0x6F8D, 0x2933, 0x6F8E, 0x1194, 0x6F90, 0x294B,\n    0x6F92, 0x2932, 0x6F93, 0x2944, 0x6F94, 0x2943, 0x6F95, 0x2950,\n    0x6F96, 0x293A, 0x6F97, 0x1198, 0x6F9E, 0x2B9D, 0x6FA0, 0x12EB,\n    0x6FA1, 0x12E1, 0x6FA2, 0x2BA9, 0x6FA3, 0x2B95, 0x6FA4, 0x12E3,\n    0x6FA5, 0x2BA1, 0x6FA6, 0x12EA, 0x6FA7, 0x12E5, 0x6FA8, 0x2B9F,\n    0x6FA9, 0x2D8E, 0x6FAA, 0x2BA5, 0x6FAB, 0x2BAB, 0x6FAC, 0x2BA4,\n    0x6FAD, 0x2B93, 0x6FAE, 0x2BA2, 0x6FAF, 0x2BAD, 0x6FB0, 0x2BAF,\n    0x6FB1, 0x12E0, 0x6FB2, 0x2BAE, 0x6FB3, 0x12E6, 0x6FB4, 0x12EC,\n    0x6FB6, 0x12E9, 0x6FB8, 0x2BA8, 0x6FB9, 0x12E8, 0x6FBA, 0x2BA3,\n    0x6FBC, 0x2B97, 0x6FBD, 0x2B9C, 0x6FBF, 0x2BA7, 0x6FC0, 0x12E7,\n    0x6FC1, 0x12E4, 0x6FC2, 0x12DF, 0x6FC3, 0x12E2, 0x6FC4, 0x2B9B,\n    0x6FC6, 0x2931, 0x6FC7, 0x2B96, 0x6FC8, 0x2B99, 0x6FC9, 0x2BAA,\n    0x6FCA, 0x2B9E, 0x6FCB, 0x2B94, 0x6FCC, 0x2D8D, 0x6FCD, 0x2BAC,\n    0x6FCE, 0x2B98, 0x6FCF, 0x2BA6, 0x6FD4, 0x2D90, 0x6FD5, 0x1400,\n    0x6FD8, 0x13F4, 0x6FDB, 0x13F8, 0x6FDC, 0x2D92, 0x6FDD, 0x2D98,\n    0x6FDE, 0x2D96, 0x6FDF, 0x13F6, 0x6FE0, 0x13F7, 0x6FE1, 0x13FE,\n    0x6FE2, 0x2D99, 0x6FE3, 0x2D91, 0x6FE4, 0x13F9, 0x6FE6, 0x2D95,\n    0x6FE7, 0x2D94, 0x6FE8, 0x2D9A, 0x6FE9, 0x13FF, 0x6FEB, 0x13FA,\n    0x6FEC, 0x13FD, 0x6FED, 0x2D93, 0x6FEE, 0x1401, 0x6FEF, 0x13FB,\n    0x6FF0, 0x1402, 0x6FF1, 0x13F5, 0x6FF2, 0x2D97, 0x6FF4, 0x2D8F,\n    0x6FF7, 0x2F4E, 0x6FFA, 0x14EB, 0x6FFB, 0x2F4B, 0x6FFC, 0x2F4D,\n    0x6FFE, 0x14E9, 0x6FFF, 0x2F49, 0x7000, 0x2F4A, 0x7001, 0x2F45,\n    0x7004, 0x2BA0, 0x7005, 0x2F46, 0x7006, 0x14EA, 0x7007, 0x2F42,\n    0x7009, 0x14E7, 0x700A, 0x2F4F, 0x700B, 0x14E8, 0x700C, 0x2F43,\n    0x700D, 0x2F44, 0x700E, 0x2F48, 0x700F, 0x14ED, 0x7011, 0x14EC,\n    0x7014, 0x2F47, 0x7015, 0x158F, 0x7016, 0x30AD, 0x7017, 0x30B3,\n    0x7018, 0x1590, 0x7019, 0x30AA, 0x701A, 0x158D, 0x701B, 0x158A,\n    0x701C, 0x30B5, 0x701D, 0x158E, 0x701F, 0x158B, 0x7020, 0x30AC,\n    0x7021, 0x30AF, 0x7022, 0x30B0, 0x7023, 0x30B1, 0x7024, 0x30B4,\n    0x7026, 0x2F4C, 0x7027, 0x30AB, 0x7028, 0x158C, 0x7029, 0x30B2,\n    0x702A, 0x31EF, 0x702B, 0x30AE, 0x702F, 0x31E6, 0x7030, 0x161D,\n    0x7031, 0x31E9, 0x7032, 0x161E, 0x7033, 0x31F2, 0x7034, 0x31E8,\n    0x7035, 0x31E5, 0x7037, 0x31E7, 0x7038, 0x31EB, 0x7039, 0x31EE,\n    0x703A, 0x31ED, 0x703B, 0x31F1, 0x703C, 0x31E4, 0x703E, 0x161C,\n    0x703F, 0x31EC, 0x7040, 0x31F0, 0x7041, 0x31F3, 0x7042, 0x31EA,\n    0x7043, 0x32D8, 0x7044, 0x32D9, 0x7045, 0x32DD, 0x7046, 0x32DE,\n    0x7048, 0x32DB, 0x7049, 0x32DC, 0x704A, 0x32DA, 0x704C, 0x167A,\n    0x7051, 0x16C8, 0x7052, 0x338C, 0x7055, 0x3389, 0x7056, 0x338A,\n    0x7057, 0x338B, 0x7058, 0x16C9, 0x705A, 0x3423, 0x705B, 0x3422,\n    0x705D, 0x348A, 0x705E, 0x1722, 0x705F, 0x3488, 0x7060, 0x348B,\n    0x7061, 0x3489, 0x7062, 0x34D0, 0x7063, 0x1744, 0x7064, 0x1752,\n    0x7065, 0x351C, 0x7066, 0x3506, 0x7068, 0x351B, 0x7069, 0x3547,\n    0x706A, 0x3548, 0x706B, 0x02E6, 0x7070, 0x03F2, 0x7071, 0x180A,\n    0x7074, 0x18C3, 0x7076, 0x04E6, 0x7078, 0x04E9, 0x707A, 0x18C4,\n    0x707C, 0x04E7, 0x707D, 0x04E8, 0x7082, 0x19F7, 0x7083, 0x19F9,\n    0x7084, 0x19F4, 0x7085, 0x19F1, 0x7086, 0x19F3, 0x708A, 0x0643,\n    0x708E, 0x0641, 0x7091, 0x19F5, 0x7092, 0x0642, 0x7093, 0x19F2,\n    0x7094, 0x19EF, 0x7095, 0x0640, 0x7096, 0x19F6, 0x7098, 0x19F0,\n    0x7099, 0x0644, 0x709A, 0x19F8, 0x709F, 0x1B66, 0x70A1, 0x1B6A,\n    0x70A4, 0x0790, 0x70A9, 0x1B6D, 0x70AB, 0x0788, 0x70AC, 0x078B,\n    0x70AD, 0x078D, 0x70AE, 0x078F, 0x70AF, 0x078C, 0x70B0, 0x1B69,\n    0x70B1, 0x1B68, 0x70B3, 0x078A, 0x70B4, 0x1B6B, 0x70B5, 0x1B6C,\n    0x70B7, 0x1B65, 0x70B8, 0x078E, 0x70BA, 0x0789, 0x70BE, 0x1B67,\n    0x70C5, 0x1D27, 0x70C6, 0x1D28, 0x70C7, 0x1D29, 0x70C8, 0x0921,\n    0x70CA, 0x091D, 0x70CB, 0x1D1E, 0x70CD, 0x1D26, 0x70CE, 0x1D2B,\n    0x70CF, 0x0922, 0x70D1, 0x1D1C, 0x70D2, 0x1D22, 0x70D3, 0x1D1B,\n    0x70D4, 0x1D25, 0x70D7, 0x1D21, 0x70D8, 0x091E, 0x70D9, 0x0920,\n    0x70DA, 0x1D2A, 0x70DC, 0x1D1A, 0x70DD, 0x1D1D, 0x70DE, 0x1D23,\n    0x70E0, 0x1D24, 0x70E1, 0x1D2C, 0x70E2, 0x1D20, 0x70E4, 0x091F,\n    0x70EF, 0x0B16, 0x70F0, 0x1F72, 0x70F3, 0x1F74, 0x70F4, 0x1F70,\n    0x70F6, 0x1F7C, 0x70F7, 0x1F6E, 0x70F8, 0x1F7B, 0x70F9, 0x0B12,\n    0x70FA, 0x1F6C, 0x70FB, 0x21F2, 0x70FC, 0x1F76, 0x70FD, 0x0B15,\n    0x70FF, 0x1F77, 0x7100, 0x1F7A, 0x7102, 0x1F7E, 0x7104, 0x1F73,\n    0x7106, 0x1F78, 0x7109, 0x0B13, 0x710A, 0x0B14, 0x710B, 0x1F7D,\n    0x710C, 0x1F71, 0x710D, 0x1F6D, 0x710E, 0x1F7F, 0x7110, 0x1F75,\n    0x7113, 0x1F79, 0x7117, 0x1F6F, 0x7119, 0x0CC8, 0x711A, 0x0CC9,\n    0x711B, 0x21FC, 0x711C, 0x0CCF, 0x711E, 0x21F0, 0x711F, 0x21F9,\n    0x7120, 0x21EF, 0x7121, 0x0CCC, 0x7122, 0x21F7, 0x7123, 0x21F5,\n    0x7125, 0x21F6, 0x7126, 0x0CCA, 0x7128, 0x21FA, 0x712E, 0x21F3,\n    0x712F, 0x21F1, 0x7130, 0x0CCB, 0x7131, 0x21F4, 0x7132, 0x21F8,\n    0x7136, 0x0CCD, 0x713A, 0x21FB, 0x7141, 0x247B, 0x7142, 0x2482,\n    0x7143, 0x2484, 0x7144, 0x248A, 0x7146, 0x0E72, 0x7147, 0x2476,\n    0x7149, 0x0E6A, 0x714B, 0x2485, 0x714C, 0x0E6F, 0x714D, 0x248B,\n    0x714E, 0x0E66, 0x7150, 0x2488, 0x7152, 0x2478, 0x7153, 0x2489,\n    0x7154, 0x2477, 0x7156, 0x0E74, 0x7158, 0x2483, 0x7159, 0x0E67,\n    0x715A, 0x248C, 0x715C, 0x0E6C, 0x715D, 0x247C, 0x715E, 0x0E71,\n    0x715F, 0x2487, 0x7160, 0x247A, 0x7161, 0x2481, 0x7162, 0x247D,\n    0x7163, 0x2479, 0x7164, 0x0E69, 0x7165, 0x0E70, 0x7166, 0x0E6E,\n    0x7167, 0x0E6B, 0x7168, 0x0E73, 0x7169, 0x0E68, 0x716A, 0x2480,\n    0x716C, 0x0E6D, 0x716E, 0x0CCE, 0x7170, 0x2486, 0x7172, 0x247E,\n    0x7178, 0x247F, 0x717B, 0x271E, 0x717D, 0x1023, 0x7180, 0x271A,\n    0x7181, 0x2720, 0x7182, 0x271C, 0x7184, 0x1025, 0x7185, 0x271B,\n    0x7186, 0x271F, 0x7187, 0x2717, 0x7189, 0x2719, 0x718A, 0x1024,\n    0x718F, 0x271D, 0x7190, 0x2718, 0x7192, 0x1026, 0x7194, 0x1021,\n    0x7197, 0x2721, 0x7199, 0x1022, 0x719A, 0x295A, 0x719B, 0x2957,\n    0x719C, 0x2963, 0x719D, 0x295D, 0x719E, 0x295F, 0x719F, 0x119E,\n    0x71A0, 0x2959, 0x71A1, 0x2961, 0x71A4, 0x2960, 0x71A5, 0x295E,\n    0x71A7, 0x2964, 0x71A8, 0x11A1, 0x71A9, 0x295B, 0x71AA, 0x2962,\n    0x71AC, 0x119F, 0x71AF, 0x2956, 0x71B0, 0x2958, 0x71B1, 0x11A0,\n    0x71B2, 0x2955, 0x71B3, 0x2965, 0x71B5, 0x295C, 0x71B8, 0x2BB3,\n    0x71B9, 0x12F3, 0x71BC, 0x2BBE, 0x71BD, 0x2BBC, 0x71BE, 0x12ED,\n    0x71BF, 0x2BB2, 0x71C0, 0x2BB5, 0x71C1, 0x2BB6, 0x71C2, 0x2BB1,\n    0x71C3, 0x12F7, 0x71C4, 0x12F8, 0x71C5, 0x2BB0, 0x71C6, 0x2BBF,\n    0x71C7, 0x2BBA, 0x71C8, 0x12F1, 0x71C9, 0x12EE, 0x71CA, 0x2BB9,\n    0x71CB, 0x2BB7, 0x71CE, 0x12F4, 0x71CF, 0x2BBB, 0x71D0, 0x12EF,\n    0x71D2, 0x12F0, 0x71D4, 0x2BB8, 0x71D5, 0x12F2, 0x71D6, 0x2BB4,\n    0x71D8, 0x2BBD, 0x71D9, 0x12F5, 0x71DA, 0x2BC0, 0x71DB, 0x2BC1,\n    0x71DC, 0x12F6, 0x71DF, 0x1404, 0x71E0, 0x140B, 0x71E1, 0x2D9B,\n    0x71E2, 0x2DA1, 0x71E4, 0x2D9F, 0x71E5, 0x1407, 0x71E6, 0x1406,\n    0x71E7, 0x1403, 0x71E8, 0x2D9D, 0x71EC, 0x1409, 0x71ED, 0x1408,\n    0x71EE, 0x1405, 0x71F0, 0x2DA0, 0x71F1, 0x2D9C, 0x71F2, 0x2D9E,\n    0x71F4, 0x140A, 0x71F8, 0x14F1, 0x71F9, 0x2F52, 0x71FB, 0x14EE,\n    0x71FC, 0x14EF, 0x71FD, 0x2F54, 0x71FE, 0x14F0, 0x71FF, 0x2F51,\n    0x7201, 0x2F50, 0x7202, 0x30B9, 0x7203, 0x2F53, 0x7205, 0x30BA,\n    0x7206, 0x1591, 0x7207, 0x30B8, 0x720A, 0x30B7, 0x720C, 0x30B6,\n    0x720D, 0x1592, 0x7210, 0x161F, 0x7213, 0x31F4, 0x7214, 0x31F5,\n    0x7219, 0x32E1, 0x721A, 0x32E0, 0x721B, 0x167B, 0x721D, 0x32DF,\n    0x721E, 0x338D, 0x721F, 0x338E, 0x7222, 0x3424, 0x7223, 0x348C,\n    0x7226, 0x34D1, 0x7227, 0x3535, 0x7228, 0x1766, 0x7229, 0x3549,\n    0x722A, 0x02E7, 0x722C, 0x0645, 0x722D, 0x0646, 0x7230, 0x0791,\n    0x7235, 0x140C, 0x7236, 0x02E8, 0x7238, 0x0647, 0x7239, 0x0923,\n    0x723A, 0x0E75, 0x723B, 0x02E9, 0x723D, 0x0B17, 0x723E, 0x1027,\n    0x723F, 0x178D, 0x7241, 0x1B6E, 0x7242, 0x1D2D, 0x7244, 0x2722,\n    0x7246, 0x140D, 0x7247, 0x02EA, 0x7248, 0x0648, 0x7249, 0x1B6F,\n    0x724A, 0x1B70, 0x724B, 0x21FD, 0x724C, 0x0CD0, 0x724F, 0x248D,\n    0x7252, 0x0E76, 0x7253, 0x2723, 0x7256, 0x11A2, 0x7258, 0x1593,\n    0x7259, 0x02EB, 0x725A, 0x21FE, 0x725B, 0x02EC, 0x725D, 0x03F4,\n    0x725E, 0x180B, 0x725F, 0x03F3, 0x7260, 0x04EC, 0x7261, 0x04EB,\n    0x7262, 0x04EA, 0x7263, 0x18C5, 0x7267, 0x0649, 0x7269, 0x064A,\n    0x726A, 0x19FA, 0x726C, 0x1B71, 0x726E, 0x1B74, 0x726F, 0x0793,\n    0x7270, 0x1B72, 0x7272, 0x0792, 0x7273, 0x1B73, 0x7274, 0x0794,\n    0x7276, 0x1D30, 0x7277, 0x1D2F, 0x7278, 0x1D2E, 0x7279, 0x0924,\n    0x727B, 0x1F81, 0x727C, 0x1F82, 0x727D, 0x0B18, 0x727E, 0x1F80,\n    0x727F, 0x1F83, 0x7280, 0x0CD2, 0x7281, 0x0B19, 0x7284, 0x0CD1,\n    0x7285, 0x2202, 0x7286, 0x2201, 0x7288, 0x21FF, 0x7289, 0x2200,\n    0x728B, 0x2203, 0x728C, 0x248F, 0x728D, 0x248E, 0x728E, 0x2492,\n    0x7290, 0x2491, 0x7291, 0x2490, 0x7292, 0x1028, 0x7293, 0x2726,\n    0x7295, 0x2725, 0x7296, 0x1029, 0x7297, 0x2724, 0x7298, 0x2966,\n    0x729A, 0x2967, 0x729B, 0x11A3, 0x729D, 0x2BC2, 0x729E, 0x2BC3,\n    0x72A1, 0x30BF, 0x72A2, 0x1594, 0x72A3, 0x30BE, 0x72A4, 0x30BD,\n    0x72A5, 0x30BB, 0x72A6, 0x30BC, 0x72A7, 0x167C, 0x72A8, 0x31F6,\n    0x72A9, 0x338F, 0x72AA, 0x34D2, 0x72AC, 0x02ED, 0x72AE, 0x17AF,\n    0x72AF, 0x0355, 0x72B0, 0x17B0, 0x72B4, 0x180C, 0x72B5, 0x180D,\n    0x72BA, 0x18CB, 0x72BD, 0x18C7, 0x72BF, 0x18C6, 0x72C0, 0x064B,\n    0x72C1, 0x18CA, 0x72C2, 0x04EE, 0x72C3, 0x18C8, 0x72C4, 0x04ED,\n    0x72C5, 0x18CC, 0x72C6, 0x18C9, 0x72C9, 0x19FE, 0x72CA, 0x1B75,\n    0x72CB, 0x19FC, 0x72CC, 0x1A03, 0x72CE, 0x064C, 0x72D0, 0x064F,\n    0x72D1, 0x1A04, 0x72D2, 0x1A00, 0x72D4, 0x1A01, 0x72D6, 0x19FB,\n    0x72D7, 0x064E, 0x72D8, 0x19FD, 0x72D9, 0x064D, 0x72DA, 0x1A02,\n    0x72DC, 0x19FF, 0x72DF, 0x1B79, 0x72E0, 0x0796, 0x72E1, 0x0797,\n    0x72E3, 0x1B7C, 0x72E4, 0x1B76, 0x72E6, 0x1B7B, 0x72E8, 0x1B77,\n    0x72E9, 0x0795, 0x72EA, 0x1B7A, 0x72EB, 0x1B78, 0x72F3, 0x1D36,\n    0x72F4, 0x1D33, 0x72F6, 0x1D35, 0x72F7, 0x0929, 0x72F8, 0x0928,\n    0x72F9, 0x0926, 0x72FA, 0x1D32, 0x72FB, 0x1D37, 0x72FC, 0x0925,\n    0x72FD, 0x0927, 0x72FE, 0x1D34, 0x72FF, 0x1F8B, 0x7300, 0x1D31,\n    0x7301, 0x1D38, 0x7307, 0x1F86, 0x7308, 0x1F8A, 0x730A, 0x1F89,\n    0x730B, 0x2205, 0x730C, 0x2210, 0x730F, 0x1F8C, 0x7311, 0x1F87,\n    0x7312, 0x2204, 0x7313, 0x0B1D, 0x7316, 0x0B1C, 0x7317, 0x1F85,\n    0x7318, 0x1F88, 0x7319, 0x0B1E, 0x731B, 0x0B1B, 0x731C, 0x0B1A,\n    0x731D, 0x1F84, 0x731E, 0x1F8D, 0x7322, 0x2207, 0x7323, 0x220E,\n    0x7325, 0x0CD4, 0x7326, 0x220D, 0x7327, 0x220A, 0x7329, 0x0CD6,\n    0x732D, 0x220C, 0x7330, 0x2206, 0x7331, 0x2208, 0x7332, 0x220B,\n    0x7333, 0x2209, 0x7334, 0x0CD5, 0x7335, 0x220F, 0x7336, 0x0CD3,\n    0x7337, 0x0E77, 0x733A, 0x2496, 0x733B, 0x2495, 0x733C, 0x2493,\n    0x733E, 0x0E7A, 0x733F, 0x0E79, 0x7340, 0x2497, 0x7342, 0x2494,\n    0x7343, 0x2727, 0x7344, 0x102A, 0x7345, 0x0E78, 0x7349, 0x2499,\n    0x734A, 0x2498, 0x734C, 0x272A, 0x734D, 0x2728, 0x734E, 0x11A4,\n    0x7350, 0x102B, 0x7351, 0x2729, 0x7352, 0x2969, 0x7357, 0x11A5,\n    0x7358, 0x2968, 0x7359, 0x2971, 0x735A, 0x2970, 0x735B, 0x296E,\n    0x735D, 0x296D, 0x735E, 0x296A, 0x735F, 0x296B, 0x7360, 0x296C,\n    0x7361, 0x296F, 0x7362, 0x2972, 0x7365, 0x2BC8, 0x7366, 0x2BC5,\n    0x7367, 0x2BC6, 0x7368, 0x12F9, 0x7369, 0x2BC4, 0x736A, 0x2BCA,\n    0x736B, 0x2BC9, 0x736C, 0x2BC7, 0x736E, 0x2DA3, 0x736F, 0x2DA4,\n    0x7370, 0x140E, 0x7372, 0x140F, 0x7373, 0x2DA2, 0x7375, 0x14F3,\n    0x7376, 0x2F55, 0x7377, 0x14F2, 0x7378, 0x1595, 0x737A, 0x1596,\n    0x737B, 0x1620, 0x737C, 0x31F8, 0x737D, 0x31F7, 0x737E, 0x32E2,\n    0x737F, 0x3390, 0x7380, 0x16CA, 0x7381, 0x3426, 0x7382, 0x3425,\n    0x7383, 0x3427, 0x7384, 0x0356, 0x7385, 0x1B7D, 0x7386, 0x092A,\n    0x7387, 0x0B1F, 0x7388, 0x1F8E, 0x7389, 0x0357, 0x738A, 0x17B1,\n    0x738B, 0x02EE, 0x738E, 0x180E, 0x7392, 0x18D1, 0x7393, 0x18CF,\n    0x7394, 0x18D0, 0x7395, 0x18CD, 0x7396, 0x04EF, 0x7397, 0x18CE,\n    0x739D, 0x1A0C, 0x739F, 0x0652, 0x73A0, 0x1A0A, 0x73A1, 0x1A06,\n    0x73A2, 0x1A09, 0x73A4, 0x1A05, 0x73A5, 0x0654, 0x73A6, 0x1A08,\n    0x73A8, 0x0651, 0x73A9, 0x0650, 0x73AB, 0x0653, 0x73AC, 0x1A0B,\n    0x73AD, 0x1A07, 0x73B2, 0x079B, 0x73B3, 0x079E, 0x73B4, 0x1B85,\n    0x73B5, 0x1B84, 0x73B6, 0x1B83, 0x73B7, 0x0798, 0x73B8, 0x1B8C,\n    0x73B9, 0x1B82, 0x73BB, 0x079A, 0x73BC, 0x1D3D, 0x73BE, 0x1B89,\n    0x73BF, 0x1B87, 0x73C0, 0x079D, 0x73C2, 0x1B7F, 0x73C3, 0x1B8A,\n    0x73C5, 0x1B81, 0x73C6, 0x1B8B, 0x73C7, 0x1B88, 0x73C8, 0x1B80,\n    0x73CA, 0x0799, 0x73CB, 0x1B8D, 0x73CC, 0x1B7E, 0x73CD, 0x079C,\n    0x73D2, 0x1D42, 0x73D3, 0x1D39, 0x73D4, 0x1D44, 0x73D6, 0x1D3C,\n    0x73D7, 0x1D47, 0x73D8, 0x1D48, 0x73D9, 0x1D3A, 0x73DA, 0x1D46,\n    0x73DB, 0x1D43, 0x73DC, 0x1D41, 0x73DD, 0x1D45, 0x73DE, 0x0930,\n    0x73E0, 0x092E, 0x73E3, 0x1D3F, 0x73E5, 0x1D3B, 0x73E7, 0x1D3E,\n    0x73E8, 0x1D49, 0x73E9, 0x1D40, 0x73EA, 0x092F, 0x73EB, 0x1B86,\n    0x73ED, 0x092B, 0x73EE, 0x092D, 0x73F4, 0x1F9C, 0x73F5, 0x1F91,\n    0x73F6, 0x1F8F, 0x73F8, 0x1F90, 0x73FA, 0x1F97, 0x73FC, 0x1F98,\n    0x73FD, 0x1F94, 0x73FE, 0x0B24, 0x73FF, 0x1F99, 0x7400, 0x1F96,\n    0x7401, 0x1F93, 0x7403, 0x0B22, 0x7404, 0x1F92, 0x7405, 0x0B20,\n    0x7406, 0x0B23, 0x7407, 0x1F95, 0x7408, 0x1F9D, 0x7409, 0x092C,\n    0x740A, 0x0B21, 0x740B, 0x1F9B, 0x740C, 0x1F9A, 0x740D, 0x0B25,\n    0x7416, 0x2215, 0x741A, 0x2216, 0x741B, 0x0CE0, 0x741D, 0x221C,\n    0x7420, 0x221E, 0x7421, 0x2217, 0x7422, 0x0CDA, 0x7423, 0x221B,\n    0x7424, 0x221A, 0x7425, 0x0CDB, 0x7426, 0x0CE1, 0x7428, 0x0CE2,\n    0x7429, 0x221D, 0x742A, 0x0CD8, 0x742B, 0x2214, 0x742C, 0x2212,\n    0x742D, 0x2218, 0x742E, 0x2211, 0x742F, 0x0CDF, 0x7430, 0x2213,\n    0x7431, 0x2219, 0x7432, 0x221F, 0x7433, 0x0CD9, 0x7434, 0x0CDE,\n    0x7435, 0x0CDC, 0x7436, 0x0CDD, 0x743A, 0x0CD7, 0x743F, 0x0E81,\n    0x7440, 0x24A0, 0x7441, 0x0E80, 0x7442, 0x24A4, 0x7444, 0x249A,\n    0x7446, 0x24A5, 0x744A, 0x249B, 0x744B, 0x249C, 0x744D, 0x24A6,\n    0x744E, 0x24A3, 0x744F, 0x24A1, 0x7450, 0x24A2, 0x7451, 0x249E,\n    0x7452, 0x249D, 0x7454, 0x24A7, 0x7455, 0x0E7D, 0x7457, 0x249F,\n    0x7459, 0x0E82, 0x745A, 0x0E7C, 0x745B, 0x0E83, 0x745C, 0x0E84,\n    0x745E, 0x0E7F, 0x745F, 0x0E7E, 0x7462, 0x272B, 0x7463, 0x102D,\n    0x7464, 0x102C, 0x7467, 0x2730, 0x7469, 0x11A6, 0x746A, 0x102E,\n    0x746D, 0x1030, 0x746E, 0x2731, 0x746F, 0x0E7B, 0x7470, 0x102F,\n    0x7471, 0x272D, 0x7472, 0x272F, 0x7473, 0x272C, 0x7475, 0x272E,\n    0x7479, 0x297C, 0x747C, 0x297B, 0x747D, 0x2978, 0x747E, 0x11A9,\n    0x747F, 0x2BCB, 0x7480, 0x11AA, 0x7481, 0x2977, 0x7483, 0x11A8,\n    0x7485, 0x2979, 0x7486, 0x2976, 0x7487, 0x2973, 0x7488, 0x297A,\n    0x7489, 0x2974, 0x748A, 0x2975, 0x748B, 0x11A7, 0x7490, 0x2DA8,\n    0x7492, 0x2BCF, 0x7494, 0x2BCE, 0x7495, 0x2BD0, 0x7497, 0x2DA5,\n    0x7498, 0x12FC, 0x749A, 0x2BCC, 0x749C, 0x12FA, 0x749E, 0x12FE,\n    0x749F, 0x12FD, 0x74A0, 0x2BCD, 0x74A1, 0x2BD1, 0x74A3, 0x12FB,\n    0x74A5, 0x2DAC, 0x74A6, 0x1412, 0x74A7, 0x14F4, 0x74A8, 0x1413,\n    0x74A9, 0x1410, 0x74AA, 0x2DA9, 0x74AB, 0x2DA7, 0x74AD, 0x2DAA,\n    0x74AF, 0x2DAD, 0x74B0, 0x1411, 0x74B1, 0x2DAB, 0x74B2, 0x2DA6,\n    0x74B5, 0x2F58, 0x74B6, 0x2F5B, 0x74B7, 0x30C2, 0x74B8, 0x2F56,\n    0x74BA, 0x31F9, 0x74BB, 0x2F5C, 0x74BD, 0x1597, 0x74BE, 0x2F5A,\n    0x74BF, 0x14F5, 0x74C0, 0x2F57, 0x74C1, 0x2F59, 0x74C2, 0x2F5D,\n    0x74C3, 0x30C3, 0x74C5, 0x30C1, 0x74CA, 0x1598, 0x74CB, 0x30C0,\n    0x74CF, 0x1621, 0x74D4, 0x167E, 0x74D5, 0x3392, 0x74D6, 0x167D,\n    0x74D7, 0x3394, 0x74D8, 0x3391, 0x74D9, 0x3393, 0x74DA, 0x16FE,\n    0x74DB, 0x348D, 0x74DC, 0x0358, 0x74DD, 0x1A0D, 0x74DE, 0x1D4A,\n    0x74DF, 0x1D4B, 0x74E0, 0x0B26, 0x74E1, 0x24A8, 0x74E2, 0x12FF,\n    0x74E3, 0x1599, 0x74E4, 0x16CB, 0x74E5, 0x348E, 0x74E6, 0x0359,\n    0x74E8, 0x1A0E, 0x74E9, 0x0120, 0x74EC, 0x1B8E, 0x74EE, 0x1B8F,\n    0x74F4, 0x1D4C, 0x74F5, 0x1D4D, 0x74F6, 0x0B27, 0x74F7, 0x0B28,\n    0x74FB, 0x2220, 0x74FD, 0x24AB, 0x74FE, 0x24AA, 0x74FF, 0x24A9,\n    0x7500, 0x2732, 0x7502, 0x2733, 0x7503, 0x2734, 0x7504, 0x1031,\n    0x7507, 0x297E, 0x7508, 0x297D, 0x750B, 0x2BD2, 0x750C, 0x1300,\n    0x750D, 0x1301, 0x750F, 0x2DB1, 0x7510, 0x2DAE, 0x7511, 0x2DAF,\n    0x7512, 0x2DB0, 0x7513, 0x2F5F, 0x7514, 0x2F5E, 0x7515, 0x14F6,\n    0x7516, 0x30C4, 0x7517, 0x32E3, 0x7518, 0x035A, 0x751A, 0x079F,\n    0x751C, 0x0B29, 0x751D, 0x24AC, 0x751F, 0x035B, 0x7521, 0x1D4E,\n    0x7522, 0x0B2A, 0x7525, 0x0CE3, 0x7526, 0x0CE4, 0x7528, 0x035C,\n    0x7529, 0x035D, 0x752A, 0x180F, 0x752B, 0x04F1, 0x752C, 0x04F0,\n    0x752D, 0x07A0, 0x752E, 0x1B90, 0x752F, 0x2221, 0x7530, 0x035E,\n    0x7531, 0x035F, 0x7532, 0x0360, 0x7533, 0x0361, 0x7537, 0x04F2,\n    0x7538, 0x04F3, 0x7539, 0x18D3, 0x753A, 0x18D2, 0x753D, 0x0655,\n    0x753E, 0x1A11, 0x753F, 0x1A0F, 0x7540, 0x1A10, 0x7547, 0x1B91,\n    0x7548, 0x1B92, 0x754B, 0x07A4, 0x754C, 0x07A2, 0x754E, 0x07A3,\n    0x754F, 0x07A1, 0x7554, 0x0931, 0x7559, 0x0935, 0x755A, 0x0934,\n    0x755B, 0x1D4F, 0x755C, 0x0933, 0x755D, 0x0932, 0x755F, 0x1D50,\n    0x7562, 0x0B2D, 0x7563, 0x1F9F, 0x7564, 0x1F9E, 0x7565, 0x0B2B,\n    0x7566, 0x0B2C, 0x756A, 0x0CE6, 0x756B, 0x0CE5, 0x756C, 0x2223,\n    0x756F, 0x2222, 0x7570, 0x0B2E, 0x7576, 0x0E85, 0x7577, 0x24AE,\n    0x7578, 0x0E86, 0x7579, 0x24AD, 0x757D, 0x2735, 0x757E, 0x297F,\n    0x757F, 0x11AB, 0x7580, 0x2BD3, 0x7584, 0x2DB2, 0x7586, 0x159B,\n    0x7587, 0x159A, 0x758A, 0x16CC, 0x758B, 0x0362, 0x758C, 0x1A12,\n    0x758F, 0x0B2F, 0x7590, 0x2736, 0x7591, 0x1032, 0x7592, 0x022E,\n    0x7594, 0x18D4, 0x7595, 0x18D5, 0x7598, 0x1A13, 0x7599, 0x0657,\n    0x759A, 0x0658, 0x759D, 0x0656, 0x75A2, 0x07A8, 0x75A3, 0x07A9,\n    0x75A4, 0x07A6, 0x75A5, 0x07A7, 0x75A7, 0x1B93, 0x75AA, 0x1B94,\n    0x75AB, 0x07A5, 0x75B0, 0x1D51, 0x75B2, 0x0939, 0x75B3, 0x093A,\n    0x75B5, 0x0B32, 0x75B6, 0x1D57, 0x75B8, 0x093F, 0x75B9, 0x093D,\n    0x75BA, 0x1D58, 0x75BB, 0x1D53, 0x75BC, 0x093C, 0x75BD, 0x093B,\n    0x75BE, 0x0936, 0x75BF, 0x1D56, 0x75C0, 0x1D55, 0x75C1, 0x1D52,\n    0x75C2, 0x093E, 0x75C4, 0x1D54, 0x75C5, 0x0937, 0x75C7, 0x0938,\n    0x75CA, 0x0B33, 0x75CB, 0x1FA3, 0x75CC, 0x1FA4, 0x75CD, 0x0B34,\n    0x75CE, 0x1FA0, 0x75CF, 0x1FA2, 0x75D0, 0x1FA6, 0x75D1, 0x1FA5,\n    0x75D2, 0x1FA1, 0x75D4, 0x0B30, 0x75D5, 0x0B31, 0x75D7, 0x222B,\n    0x75D8, 0x0CEB, 0x75D9, 0x0CEA, 0x75DA, 0x2225, 0x75DB, 0x0CE8,\n    0x75DD, 0x2228, 0x75DE, 0x0CEC, 0x75DF, 0x2229, 0x75E0, 0x0CED,\n    0x75E1, 0x2226, 0x75E2, 0x0CE7, 0x75E3, 0x0CE9, 0x75E4, 0x222A,\n    0x75E6, 0x2227, 0x75E7, 0x2224, 0x75ED, 0x24BB, 0x75EF, 0x24B0,\n    0x75F0, 0x0E88, 0x75F1, 0x0E8B, 0x75F2, 0x0E8A, 0x75F3, 0x0E8F,\n    0x75F4, 0x0E8E, 0x75F5, 0x24BC, 0x75F6, 0x24BA, 0x75F7, 0x24B3,\n    0x75F8, 0x24B7, 0x75F9, 0x24B6, 0x75FA, 0x0E8C, 0x75FB, 0x24B9,\n    0x75FC, 0x24B5, 0x75FD, 0x24BD, 0x75FE, 0x24B4, 0x75FF, 0x0E8D,\n    0x7600, 0x0E87, 0x7601, 0x0E89, 0x7603, 0x24B2, 0x7608, 0x2738,\n    0x7609, 0x1036, 0x760A, 0x273C, 0x760B, 0x1035, 0x760C, 0x2739,\n    0x760D, 0x1034, 0x760F, 0x24B1, 0x7610, 0x24B8, 0x7611, 0x273B,\n    0x7613, 0x1037, 0x7614, 0x273D, 0x7615, 0x273A, 0x7616, 0x2737,\n    0x7619, 0x2982, 0x761A, 0x2986, 0x761B, 0x2988, 0x761C, 0x2984,\n    0x761D, 0x2983, 0x761E, 0x2981, 0x761F, 0x11AE, 0x7620, 0x11AC,\n    0x7621, 0x11B1, 0x7622, 0x11B2, 0x7623, 0x2985, 0x7624, 0x11AF,\n    0x7625, 0x2980, 0x7626, 0x11B0, 0x7627, 0x1033, 0x7628, 0x2987,\n    0x7629, 0x11AD, 0x762D, 0x2BD5, 0x762F, 0x2BD4, 0x7630, 0x2BDC,\n    0x7631, 0x2BD6, 0x7632, 0x2BDB, 0x7633, 0x2BD8, 0x7634, 0x1302,\n    0x7635, 0x2BDA, 0x7638, 0x1303, 0x763A, 0x1304, 0x763C, 0x2BD9,\n    0x763D, 0x2BD7, 0x7642, 0x1415, 0x7643, 0x2DB3, 0x7646, 0x1414,\n    0x7647, 0x2DB6, 0x7648, 0x2DB4, 0x7649, 0x2DB5, 0x764C, 0x1416,\n    0x7650, 0x2F63, 0x7652, 0x14F9, 0x7653, 0x2F64, 0x7656, 0x14F7,\n    0x7657, 0x2F65, 0x7658, 0x14F8, 0x7659, 0x2F62, 0x765A, 0x2F66,\n    0x765C, 0x2F60, 0x765F, 0x159C, 0x7660, 0x30C5, 0x7661, 0x159D,\n    0x7662, 0x1622, 0x7664, 0x2F61, 0x7665, 0x1623, 0x7669, 0x167F,\n    0x766A, 0x32E4, 0x766C, 0x16CE, 0x766D, 0x3395, 0x766E, 0x16CD,\n    0x7670, 0x3428, 0x7671, 0x1723, 0x7672, 0x1724, 0x7675, 0x3543,\n    0x7676, 0x022F, 0x7678, 0x07AA, 0x7679, 0x1B95, 0x767B, 0x0CEE,\n    0x767C, 0x0CEF, 0x767D, 0x0363, 0x767E, 0x03F5, 0x767F, 0x1810,\n    0x7681, 0x18D6, 0x7682, 0x04F4, 0x7684, 0x0659, 0x7686, 0x07AB,\n    0x7687, 0x07AC, 0x7688, 0x07AD, 0x7689, 0x1FA8, 0x768A, 0x1D59,\n    0x768B, 0x0940, 0x768E, 0x0B35, 0x768F, 0x1FA7, 0x7692, 0x222D,\n    0x7693, 0x0CF1, 0x7695, 0x222C, 0x7696, 0x0CF0, 0x7699, 0x24BE,\n    0x769A, 0x11B3, 0x769B, 0x298C, 0x769C, 0x2989, 0x769D, 0x298A,\n    0x769E, 0x298B, 0x76A4, 0x2DB7, 0x76A6, 0x2F67, 0x76AA, 0x31FB,\n    0x76AB, 0x31FA, 0x76AD, 0x3396, 0x76AE, 0x0364, 0x76AF, 0x1A14,\n    0x76B0, 0x0941, 0x76B4, 0x0CF2, 0x76B5, 0x24BF, 0x76B8, 0x273E,\n    0x76BA, 0x11B4, 0x76BB, 0x2BDD, 0x76BD, 0x2F68, 0x76BE, 0x31FC,\n    0x76BF, 0x0365, 0x76C2, 0x065A, 0x76C3, 0x07B0, 0x76C4, 0x1B96,\n    0x76C5, 0x07B1, 0x76C6, 0x07AF, 0x76C8, 0x07AE, 0x76C9, 0x1D5A,\n    0x76CA, 0x0942, 0x76CD, 0x0943, 0x76CE, 0x0944, 0x76D2, 0x0B37,\n    0x76D3, 0x1FA9, 0x76D4, 0x0B36, 0x76DA, 0x222E, 0x76DB, 0x0B38,\n    0x76DC, 0x0CF3, 0x76DD, 0x24C0, 0x76DE, 0x0E90, 0x76DF, 0x0E91,\n    0x76E1, 0x1038, 0x76E3, 0x1039, 0x76E4, 0x11B5, 0x76E5, 0x1306,\n    0x76E6, 0x2BDE, 0x76E7, 0x1305, 0x76E9, 0x2DB8, 0x76EA, 0x1417,\n    0x76EC, 0x2F69, 0x76ED, 0x31FD, 0x76EE, 0x0366, 0x76EF, 0x04F5,\n    0x76F0, 0x1A17, 0x76F1, 0x1A16, 0x76F2, 0x065B, 0x76F3, 0x1A15,\n    0x76F4, 0x065C, 0x76F5, 0x1A18, 0x76F7, 0x1B9C, 0x76F8, 0x07B4,\n    0x76F9, 0x07B3, 0x76FA, 0x1B9E, 0x76FB, 0x1B9D, 0x76FC, 0x07B8,\n    0x76FE, 0x07B7, 0x7701, 0x07B2, 0x7703, 0x1B98, 0x7704, 0x1B99,\n    0x7705, 0x1B9A, 0x7707, 0x07B9, 0x7708, 0x1B97, 0x7709, 0x07B5,\n    0x770A, 0x1B9B, 0x770B, 0x07B6, 0x7710, 0x1D5D, 0x7711, 0x1D61,\n    0x7712, 0x1D5F, 0x7713, 0x1D5E, 0x7715, 0x1D62, 0x7719, 0x1D63,\n    0x771A, 0x1D64, 0x771B, 0x1D5C, 0x771D, 0x1D5B, 0x771F, 0x0946,\n    0x7720, 0x0947, 0x7722, 0x1D65, 0x7723, 0x1D60, 0x7725, 0x1FB2,\n    0x7727, 0x1D66, 0x7728, 0x0948, 0x7729, 0x0945, 0x772D, 0x1FAC,\n    0x772F, 0x1FAB, 0x7731, 0x1FAD, 0x7732, 0x1FAE, 0x7733, 0x1FB0,\n    0x7734, 0x1FAF, 0x7735, 0x1FB4, 0x7736, 0x0B3C, 0x7737, 0x0B39,\n    0x7738, 0x0B3D, 0x7739, 0x1FAA, 0x773A, 0x0B3E, 0x773B, 0x1FB3,\n    0x773C, 0x0B3B, 0x773D, 0x1FB1, 0x773E, 0x0B3A, 0x7744, 0x2231,\n    0x7745, 0x2233, 0x7746, 0x222F, 0x7747, 0x2230, 0x774A, 0x2234,\n    0x774B, 0x2236, 0x774C, 0x2237, 0x774D, 0x2232, 0x774E, 0x2235,\n    0x774F, 0x0CF4, 0x7752, 0x24C4, 0x7754, 0x24C9, 0x7755, 0x24C1,\n    0x7756, 0x24C5, 0x7759, 0x24CA, 0x775A, 0x24C6, 0x775B, 0x0E92,\n    0x775C, 0x0E9A, 0x775E, 0x0E95, 0x775F, 0x24C2, 0x7760, 0x24C3,\n    0x7761, 0x103D, 0x7762, 0x0E9D, 0x7763, 0x0E96, 0x7765, 0x0E9B,\n    0x7766, 0x0E94, 0x7767, 0x24C8, 0x7768, 0x0E9C, 0x7769, 0x24C7,\n    0x776A, 0x0E98, 0x776B, 0x0E93, 0x776C, 0x0E99, 0x776D, 0x24CB,\n    0x776E, 0x2743, 0x776F, 0x2745, 0x7779, 0x0E97, 0x777C, 0x2740,\n    0x777D, 0x103B, 0x777E, 0x2746, 0x777F, 0x103C, 0x7780, 0x2744,\n    0x7781, 0x273F, 0x7782, 0x2742, 0x7783, 0x2747, 0x7784, 0x103A,\n    0x7785, 0x2741, 0x7787, 0x11B7, 0x7788, 0x2990, 0x7789, 0x298F,\n    0x778B, 0x11BA, 0x778C, 0x11B8, 0x778D, 0x298D, 0x778E, 0x11B6,\n    0x778F, 0x298E, 0x7791, 0x11B9, 0x7795, 0x2BE6, 0x7797, 0x2BE8,\n    0x7799, 0x2BE7, 0x779A, 0x2BDF, 0x779B, 0x2BE3, 0x779C, 0x2BE2,\n    0x779D, 0x2BE0, 0x779E, 0x1308, 0x779F, 0x1309, 0x77A0, 0x1307,\n    0x77A1, 0x2BE1, 0x77A2, 0x2BE4, 0x77A3, 0x2BE5, 0x77A5, 0x130A,\n    0x77A7, 0x141C, 0x77A8, 0x2DC0, 0x77AA, 0x1419, 0x77AB, 0x2DBA,\n    0x77AC, 0x141B, 0x77AD, 0x141D, 0x77B0, 0x141A, 0x77B1, 0x2DBF,\n    0x77B2, 0x2DBB, 0x77B3, 0x1418, 0x77B4, 0x2DBE, 0x77B5, 0x2DB9,\n    0x77B6, 0x2DBD, 0x77B7, 0x2DBC, 0x77BA, 0x2F6B, 0x77BB, 0x14FC,\n    0x77BC, 0x14FD, 0x77BD, 0x14FA, 0x77BF, 0x14FB, 0x77C2, 0x2F6A,\n    0x77C4, 0x30C8, 0x77C7, 0x159E, 0x77C9, 0x30C6, 0x77CA, 0x30C7,\n    0x77CC, 0x31FE, 0x77CD, 0x3201, 0x77CE, 0x31FF, 0x77CF, 0x3200,\n    0x77D0, 0x32E5, 0x77D3, 0x1680, 0x77D4, 0x3429, 0x77D5, 0x348F,\n    0x77D7, 0x1725, 0x77D8, 0x34D3, 0x77D9, 0x34D4, 0x77DA, 0x1753,\n    0x77DB, 0x0367, 0x77DC, 0x07BA, 0x77DE, 0x2238, 0x77E0, 0x24CC,\n    0x77E2, 0x0368, 0x77E3, 0x04F6, 0x77E5, 0x065D, 0x77E7, 0x1B9F,\n    0x77E8, 0x1BA0, 0x77E9, 0x0949, 0x77EC, 0x2239, 0x77ED, 0x0CF5,\n    0x77EE, 0x0E9E, 0x77EF, 0x141E, 0x77F0, 0x2DC1, 0x77F1, 0x30C9,\n    0x77F2, 0x3202, 0x77F3, 0x0369, 0x77F7, 0x1A1E, 0x77F8, 0x1A19,\n    0x77F9, 0x1A1B, 0x77FA, 0x1A1D, 0x77FB, 0x1A1C, 0x77FC, 0x1A1A,\n    0x77FD, 0x065E, 0x7802, 0x07BB, 0x7803, 0x1BA9, 0x7805, 0x1BA4,\n    0x7806, 0x1BA1, 0x7809, 0x1BA8, 0x780C, 0x07BD, 0x780D, 0x07BE,\n    0x780E, 0x1BA7, 0x780F, 0x1BA6, 0x7810, 0x1BA5, 0x7811, 0x1BA2,\n    0x7812, 0x1BA3, 0x7813, 0x1BAA, 0x7814, 0x07BC, 0x781D, 0x094D,\n    0x781F, 0x0953, 0x7820, 0x0952, 0x7821, 0x1D6F, 0x7822, 0x1D69,\n    0x7823, 0x1D67, 0x7825, 0x0950, 0x7826, 0x1FBB, 0x7827, 0x094B,\n    0x7828, 0x1D6C, 0x7829, 0x1D70, 0x782A, 0x1D72, 0x782B, 0x1D6E,\n    0x782C, 0x1D68, 0x782D, 0x0951, 0x782E, 0x1D6D, 0x782F, 0x1D6B,\n    0x7830, 0x094A, 0x7831, 0x1D73, 0x7832, 0x0954, 0x7833, 0x1D71,\n    0x7834, 0x094E, 0x7835, 0x1D6A, 0x7837, 0x094F, 0x7838, 0x094C,\n    0x7843, 0x0B40, 0x7845, 0x1FBC, 0x7848, 0x1FB5, 0x7849, 0x1FB7,\n    0x784A, 0x1FB9, 0x784C, 0x1FBA, 0x784D, 0x1FB8, 0x784E, 0x0B41,\n    0x7850, 0x1FBD, 0x7852, 0x1FB6, 0x785C, 0x223D, 0x785D, 0x0CF6,\n    0x785E, 0x2245, 0x7860, 0x223A, 0x7862, 0x2246, 0x7864, 0x223B,\n    0x7865, 0x223C, 0x7868, 0x2244, 0x7869, 0x2243, 0x786A, 0x2240,\n    0x786B, 0x0B3F, 0x786C, 0x0CF7, 0x786D, 0x223E, 0x786E, 0x2241,\n    0x786F, 0x0CF8, 0x7870, 0x2242, 0x7871, 0x223F, 0x7879, 0x24D7,\n    0x787B, 0x24DB, 0x787C, 0x0EA5, 0x787E, 0x274D, 0x787F, 0x0EA8,\n    0x7880, 0x24D9, 0x7881, 0x36E8, 0x7883, 0x24D6, 0x7884, 0x24D1,\n    0x7885, 0x24D3, 0x7886, 0x24D4, 0x7887, 0x24CD, 0x7889, 0x0EA4,\n    0x788C, 0x0EA3, 0x788E, 0x0E9F, 0x788F, 0x24D0, 0x7891, 0x0EA6,\n    0x7893, 0x0EA7, 0x7894, 0x24CF, 0x7895, 0x24D2, 0x7896, 0x24DA,\n    0x7897, 0x0EA1, 0x7898, 0x0EA2, 0x7899, 0x24D8, 0x789A, 0x24CE,\n    0x789E, 0x274F, 0x789F, 0x103F, 0x78A0, 0x2751, 0x78A1, 0x24D5,\n    0x78A2, 0x2753, 0x78A3, 0x1043, 0x78A4, 0x2754, 0x78A5, 0x2750,\n    0x78A7, 0x1040, 0x78A8, 0x274C, 0x78A9, 0x1042, 0x78AA, 0x2749,\n    0x78AB, 0x274E, 0x78AC, 0x2752, 0x78AD, 0x274B, 0x78B0, 0x0EA0,\n    0x78B2, 0x2748, 0x78B3, 0x1041, 0x78B4, 0x274A, 0x78BA, 0x11BD,\n    0x78BB, 0x2992, 0x78BC, 0x11C1, 0x78BE, 0x11BF, 0x78C1, 0x103E,\n    0x78C3, 0x2999, 0x78C4, 0x299A, 0x78C5, 0x11BC, 0x78C8, 0x2998,\n    0x78C9, 0x299B, 0x78CA, 0x11BE, 0x78CB, 0x11BB, 0x78CC, 0x2994,\n    0x78CD, 0x2991, 0x78CE, 0x2996, 0x78CF, 0x2993, 0x78D0, 0x11C2,\n    0x78D1, 0x2995, 0x78D4, 0x2997, 0x78D5, 0x11C0, 0x78DA, 0x130C,\n    0x78DB, 0x2BEF, 0x78DD, 0x2BE9, 0x78DE, 0x2BED, 0x78DF, 0x2BF3,\n    0x78E0, 0x2BF4, 0x78E1, 0x2BF0, 0x78E2, 0x2BF1, 0x78E3, 0x2BEE,\n    0x78E5, 0x2BEB, 0x78E7, 0x130E, 0x78E8, 0x130B, 0x78E9, 0x2BEA,\n    0x78EA, 0x2BEC, 0x78EC, 0x130D, 0x78ED, 0x2BF2, 0x78EF, 0x1422,\n    0x78F2, 0x2DC8, 0x78F3, 0x2DC2, 0x78F4, 0x1421, 0x78F7, 0x141F,\n    0x78F9, 0x2DCA, 0x78FA, 0x1420, 0x78FB, 0x2DC5, 0x78FC, 0x2DC6,\n    0x78FD, 0x2DC3, 0x78FE, 0x2DCB, 0x78FF, 0x2DC7, 0x7901, 0x1423,\n    0x7902, 0x2DC4, 0x7904, 0x2DCC, 0x7905, 0x2DC9, 0x7909, 0x2F6F,\n    0x790C, 0x2F6C, 0x790E, 0x14FE, 0x7910, 0x2F70, 0x7911, 0x2F72,\n    0x7912, 0x2F71, 0x7913, 0x2F6D, 0x7914, 0x2F6E, 0x7917, 0x30CE,\n    0x7919, 0x159F, 0x791B, 0x30CB, 0x791C, 0x30CD, 0x791D, 0x30CA,\n    0x791E, 0x30CF, 0x7921, 0x30CC, 0x7923, 0x3204, 0x7924, 0x3207,\n    0x7925, 0x3203, 0x7926, 0x1624, 0x7927, 0x3205, 0x7928, 0x3206,\n    0x7929, 0x3208, 0x792A, 0x1625, 0x792B, 0x1627, 0x792C, 0x1626,\n    0x792D, 0x32E6, 0x792F, 0x32E8, 0x7931, 0x32E7, 0x7935, 0x3397,\n    0x7938, 0x3490, 0x7939, 0x34D5, 0x793A, 0x036A, 0x793D, 0x18D7,\n    0x793E, 0x065F, 0x793F, 0x1A20, 0x7940, 0x0660, 0x7941, 0x0661,\n    0x7942, 0x1A1F, 0x7944, 0x1BAF, 0x7945, 0x1BAE, 0x7946, 0x07BF,\n    0x7947, 0x07C2, 0x7948, 0x07C1, 0x7949, 0x07C0, 0x794A, 0x1BAB,\n    0x794B, 0x1BAD, 0x794C, 0x1BAC, 0x794F, 0x1D76, 0x7950, 0x0956,\n    0x7951, 0x1D7A, 0x7952, 0x1D79, 0x7953, 0x1D78, 0x7954, 0x1D74,\n    0x7955, 0x0955, 0x7956, 0x0959, 0x7957, 0x095C, 0x795A, 0x095D,\n    0x795B, 0x1D75, 0x795C, 0x1D77, 0x795D, 0x095B, 0x795E, 0x095A,\n    0x795F, 0x0958, 0x7960, 0x0957, 0x7961, 0x1FC4, 0x7963, 0x1FC2,\n    0x7964, 0x1FBE, 0x7965, 0x0B42, 0x7967, 0x1FBF, 0x7968, 0x0B43,\n    0x7969, 0x1FC0, 0x796A, 0x1FC1, 0x796B, 0x1FC3, 0x796D, 0x0B44,\n    0x7970, 0x224A, 0x7972, 0x2249, 0x7973, 0x2248, 0x7974, 0x2247,\n    0x7979, 0x24DF, 0x797A, 0x0EA9, 0x797C, 0x24DC, 0x797D, 0x24DE,\n    0x797F, 0x0EAA, 0x7981, 0x0EAB, 0x7982, 0x24DD, 0x7988, 0x275D,\n    0x798A, 0x2756, 0x798B, 0x2757, 0x798D, 0x1046, 0x798E, 0x1044,\n    0x798F, 0x1045, 0x7990, 0x275F, 0x7992, 0x275E, 0x7993, 0x275B,\n    0x7994, 0x275A, 0x7995, 0x2759, 0x7996, 0x2758, 0x7997, 0x275C,\n    0x7998, 0x2755, 0x799A, 0x299C, 0x799B, 0x29A1, 0x799C, 0x299F,\n    0x79A0, 0x299E, 0x79A1, 0x299D, 0x79A2, 0x29A0, 0x79A4, 0x2BF5,\n    0x79A6, 0x130F, 0x79A7, 0x1424, 0x79A8, 0x2DCE, 0x79AA, 0x1425,\n    0x79AB, 0x2DCD, 0x79AC, 0x2F74, 0x79AD, 0x2F73, 0x79AE, 0x14FF,\n    0x79B0, 0x30D0, 0x79B1, 0x15A0, 0x79B2, 0x3209, 0x79B3, 0x16CF,\n    0x79B4, 0x3398, 0x79B6, 0x3492, 0x79B7, 0x3491, 0x79B8, 0x17B2,\n    0x79B9, 0x07C3, 0x79BA, 0x07C4, 0x79BB, 0x1FC5, 0x79BD, 0x0EAD,\n    0x79BE, 0x036B, 0x79BF, 0x04F9, 0x79C0, 0x04F8, 0x79C1, 0x04F7,\n    0x79C5, 0x1A21, 0x79C8, 0x0663, 0x79C9, 0x0662, 0x79CB, 0x07C7,\n    0x79CD, 0x1BB1, 0x79CE, 0x1BB4, 0x79CF, 0x1BB2, 0x79D1, 0x07C5,\n    0x79D2, 0x07C6, 0x79D5, 0x1BB0, 0x79D6, 0x1BB3, 0x79D8, 0x0964,\n    0x79DC, 0x1D81, 0x79DD, 0x1D83, 0x79DE, 0x1D82, 0x79DF, 0x0961,\n    0x79E0, 0x1D7D, 0x79E3, 0x095F, 0x79E4, 0x095E, 0x79E6, 0x0962,\n    0x79E7, 0x0960, 0x79E9, 0x0963, 0x79EA, 0x1D80, 0x79EB, 0x1D7B,\n    0x79EC, 0x1D7C, 0x79ED, 0x1D7F, 0x79EE, 0x1D7E, 0x79F6, 0x1FC8,\n    0x79F7, 0x1FC9, 0x79F8, 0x1FC7, 0x79FA, 0x1FC6, 0x79FB, 0x0B45,\n    0x7A00, 0x0CFD, 0x7A02, 0x224B, 0x7A03, 0x224D, 0x7A04, 0x224F,\n    0x7A05, 0x0CFC, 0x7A08, 0x0CFA, 0x7A0A, 0x224C, 0x7A0B, 0x0CFB,\n    0x7A0C, 0x224E, 0x7A0D, 0x0CF9, 0x7A10, 0x24E9, 0x7A11, 0x24E0,\n    0x7A12, 0x24E3, 0x7A13, 0x24E7, 0x7A14, 0x0EB1, 0x7A15, 0x24E5,\n    0x7A17, 0x24E4, 0x7A18, 0x24E1, 0x7A19, 0x24E2, 0x7A1A, 0x0EAF,\n    0x7A1B, 0x24E8, 0x7A1C, 0x0EAE, 0x7A1E, 0x0EB3, 0x7A1F, 0x0EB2,\n    0x7A20, 0x0EB0, 0x7A22, 0x24E6, 0x7A26, 0x2765, 0x7A28, 0x2764,\n    0x7A2B, 0x2760, 0x7A2E, 0x1047, 0x7A2F, 0x2763, 0x7A30, 0x2762,\n    0x7A31, 0x1048, 0x7A37, 0x11C7, 0x7A39, 0x29A3, 0x7A3B, 0x11C8,\n    0x7A3C, 0x11C4, 0x7A3D, 0x11C6, 0x7A3F, 0x11C3, 0x7A40, 0x11C5,\n    0x7A44, 0x2BF6, 0x7A46, 0x1312, 0x7A47, 0x2BF8, 0x7A48, 0x2BF7,\n    0x7A4A, 0x2761, 0x7A4B, 0x1314, 0x7A4C, 0x1313, 0x7A4D, 0x1310,\n    0x7A4E, 0x1311, 0x7A54, 0x2DD3, 0x7A56, 0x2DD1, 0x7A57, 0x1426,\n    0x7A58, 0x2DD2, 0x7A5A, 0x2DD4, 0x7A5B, 0x2DD0, 0x7A5C, 0x2DCF,\n    0x7A5F, 0x2F75, 0x7A60, 0x1502, 0x7A61, 0x1500, 0x7A62, 0x1501,\n    0x7A67, 0x30D1, 0x7A68, 0x30D2, 0x7A69, 0x15A2, 0x7A6B, 0x15A1,\n    0x7A6C, 0x320B, 0x7A6D, 0x320C, 0x7A6E, 0x320A, 0x7A70, 0x3399,\n    0x7A71, 0x339A, 0x7A74, 0x036C, 0x7A75, 0x1811, 0x7A76, 0x04FA,\n    0x7A78, 0x1A22, 0x7A79, 0x0665, 0x7A7A, 0x0664, 0x7A7B, 0x1A23,\n    0x7A7E, 0x1BB6, 0x7A7F, 0x07C8, 0x7A80, 0x1BB5, 0x7A81, 0x07C9,\n    0x7A84, 0x0965, 0x7A85, 0x1D86, 0x7A86, 0x1D84, 0x7A87, 0x1D8A,\n    0x7A88, 0x0966, 0x7A89, 0x1D85, 0x7A8A, 0x1D89, 0x7A8B, 0x1D87,\n    0x7A8C, 0x1D88, 0x7A8F, 0x1FCA, 0x7A90, 0x1FCC, 0x7A92, 0x0B46,\n    0x7A94, 0x1FCB, 0x7A95, 0x0B47, 0x7A96, 0x0D00, 0x7A97, 0x0CFF,\n    0x7A98, 0x0CFE, 0x7A99, 0x2250, 0x7A9E, 0x24EC, 0x7A9F, 0x0EB4,\n    0x7AA0, 0x0EB5, 0x7AA2, 0x24EB, 0x7AA3, 0x24EA, 0x7AA8, 0x2766,\n    0x7AA9, 0x104A, 0x7AAA, 0x1049, 0x7AAB, 0x2767, 0x7AAC, 0x2768,\n    0x7AAE, 0x11CA, 0x7AAF, 0x11C9, 0x7AB1, 0x2BFC, 0x7AB2, 0x29A4,\n    0x7AB3, 0x29A6, 0x7AB4, 0x29A5, 0x7AB5, 0x2BFB, 0x7AB6, 0x2BF9,\n    0x7AB7, 0x2BFD, 0x7AB8, 0x2BFA, 0x7ABA, 0x1315, 0x7ABE, 0x2DD5,\n    0x7ABF, 0x1427, 0x7AC0, 0x2DD6, 0x7AC1, 0x2DD7, 0x7AC4, 0x1503,\n    0x7AC5, 0x1504, 0x7AC7, 0x1628, 0x7ACA, 0x16FF, 0x7ACB, 0x036D,\n    0x7AD1, 0x1BB7, 0x7AD8, 0x1D8B, 0x7AD9, 0x0967, 0x7ADF, 0x0BDE,\n    0x7AE0, 0x0BDD, 0x7AE3, 0x0D02, 0x7AE4, 0x2252, 0x7AE5, 0x0D01,\n    0x7AE6, 0x2251, 0x7AEB, 0x24ED, 0x7AED, 0x104B, 0x7AEE, 0x2769,\n    0x7AEF, 0x104C, 0x7AF6, 0x1629, 0x7AF7, 0x320D, 0x7AF9, 0x03F6,\n    0x7AFA, 0x0666, 0x7AFB, 0x1A24, 0x7AFD, 0x07CB, 0x7AFF, 0x07CA,\n    0x7B00, 0x1BB8, 0x7B01, 0x1BB9, 0x7B04, 0x1D8D, 0x7B05, 0x1D8F,\n    0x7B06, 0x0968, 0x7B08, 0x1D91, 0x7B09, 0x1D94, 0x7B0A, 0x1D92,\n    0x7B0E, 0x1D93, 0x7B0F, 0x1D90, 0x7B10, 0x1D8C, 0x7B11, 0x0969,\n    0x7B12, 0x1D95, 0x7B13, 0x1D8E, 0x7B18, 0x1FD5, 0x7B19, 0x0B4D,\n    0x7B1A, 0x1FDE, 0x7B1B, 0x0B4A, 0x7B1D, 0x1FD7, 0x7B1E, 0x0B4E,\n    0x7B20, 0x0B48, 0x7B22, 0x1FD2, 0x7B23, 0x1FDF, 0x7B24, 0x1FD3,\n    0x7B25, 0x1FD0, 0x7B26, 0x0B4C, 0x7B28, 0x0B49, 0x7B2A, 0x1FD6,\n    0x7B2B, 0x1FD9, 0x7B2C, 0x0B4B, 0x7B2D, 0x1FDA, 0x7B2E, 0x0B4F,\n    0x7B2F, 0x1FDB, 0x7B30, 0x1FD1, 0x7B31, 0x1FD8, 0x7B32, 0x1FDC,\n    0x7B33, 0x1FD4, 0x7B34, 0x1FCF, 0x7B35, 0x1FCD, 0x7B38, 0x1FDD,\n    0x7B3B, 0x1FCE, 0x7B40, 0x2259, 0x7B44, 0x2255, 0x7B45, 0x225B,\n    0x7B46, 0x0D05, 0x7B47, 0x2254, 0x7B48, 0x2256, 0x7B49, 0x0D03,\n    0x7B4A, 0x2253, 0x7B4B, 0x0D0A, 0x7B4C, 0x2257, 0x7B4D, 0x0D09,\n    0x7B4E, 0x2258, 0x7B4F, 0x0D0B, 0x7B50, 0x0D06, 0x7B51, 0x0D0C,\n    0x7B52, 0x0D07, 0x7B54, 0x0D08, 0x7B56, 0x0D04, 0x7B58, 0x225A,\n    0x7B60, 0x0EB8, 0x7B61, 0x24F8, 0x7B63, 0x24FB, 0x7B64, 0x24EF,\n    0x7B65, 0x24F4, 0x7B66, 0x24EE, 0x7B67, 0x0EBA, 0x7B69, 0x24F2,\n    0x7B6D, 0x24F0, 0x7B6E, 0x0EB9, 0x7B70, 0x24F7, 0x7B71, 0x24F6,\n    0x7B72, 0x24F3, 0x7B73, 0x24F5, 0x7B74, 0x24F1, 0x7B75, 0x1050,\n    0x7B76, 0x24FA, 0x7B77, 0x0EB6, 0x7B78, 0x24F9, 0x7B82, 0x2779,\n    0x7B84, 0x1057, 0x7B85, 0x2774, 0x7B87, 0x1056, 0x7B88, 0x276A,\n    0x7B8A, 0x276C, 0x7B8B, 0x104F, 0x7B8C, 0x2771, 0x7B8D, 0x2770,\n    0x7B8E, 0x2773, 0x7B8F, 0x1054, 0x7B90, 0x276E, 0x7B91, 0x276D,\n    0x7B94, 0x1053, 0x7B95, 0x104E, 0x7B96, 0x276F, 0x7B97, 0x1051,\n    0x7B98, 0x2775, 0x7B99, 0x2777, 0x7B9B, 0x2772, 0x7B9C, 0x276B,\n    0x7B9D, 0x1052, 0x7BA0, 0x11D2, 0x7BA1, 0x104D, 0x7BA4, 0x2778,\n    0x7BAC, 0x29AA, 0x7BAD, 0x11CB, 0x7BAF, 0x29AC, 0x7BB1, 0x11CC,\n    0x7BB4, 0x11CE, 0x7BB5, 0x29AF, 0x7BB7, 0x29A7, 0x7BB8, 0x1055,\n    0x7BB9, 0x29AD, 0x7BBE, 0x29A9, 0x7BC0, 0x0EB7, 0x7BC1, 0x11D1,\n    0x7BC4, 0x11CD, 0x7BC6, 0x11CF, 0x7BC7, 0x11D0, 0x7BC9, 0x1318,\n    0x7BCA, 0x29AE, 0x7BCB, 0x29A8, 0x7BCC, 0x11D3, 0x7BCE, 0x29AB,\n    0x7BD4, 0x2C07, 0x7BD5, 0x2C02, 0x7BD8, 0x2C0C, 0x7BD9, 0x1316,\n    0x7BDA, 0x2C04, 0x7BDB, 0x131A, 0x7BDC, 0x2C0A, 0x7BDD, 0x2C01,\n    0x7BDE, 0x2BFE, 0x7BDF, 0x2C0D, 0x7BE0, 0x142D, 0x7BE1, 0x131B,\n    0x7BE2, 0x2C09, 0x7BE3, 0x2BFF, 0x7BE4, 0x1319, 0x7BE5, 0x2C03,\n    0x7BE6, 0x131D, 0x7BE7, 0x2C00, 0x7BE8, 0x2C05, 0x7BE9, 0x131C,\n    0x7BEA, 0x2C08, 0x7BEB, 0x2C0B, 0x7BF0, 0x2DE9, 0x7BF1, 0x2DEA,\n    0x7BF2, 0x2DDA, 0x7BF3, 0x2DE1, 0x7BF4, 0x2DDF, 0x7BF7, 0x142B,\n    0x7BF8, 0x2DE6, 0x7BF9, 0x2C06, 0x7BFB, 0x2DDD, 0x7BFD, 0x2DE7,\n    0x7BFE, 0x142A, 0x7BFF, 0x2DDC, 0x7C00, 0x2DDB, 0x7C01, 0x2DE5,\n    0x7C02, 0x2DE2, 0x7C03, 0x2DE4, 0x7C05, 0x2DD8, 0x7C06, 0x2DE8,\n    0x7C07, 0x1428, 0x7C09, 0x2DE3, 0x7C0A, 0x2DEC, 0x7C0B, 0x2DE0,\n    0x7C0C, 0x142C, 0x7C0D, 0x1429, 0x7C0E, 0x2DDE, 0x7C0F, 0x2DD9,\n    0x7C10, 0x2DEB, 0x7C11, 0x1317, 0x7C19, 0x2F78, 0x7C1C, 0x2F76,\n    0x7C1D, 0x2F7C, 0x7C1E, 0x1508, 0x7C1F, 0x2F7A, 0x7C20, 0x2F79,\n    0x7C21, 0x150A, 0x7C22, 0x2F7F, 0x7C23, 0x1509, 0x7C25, 0x2F80,\n    0x7C26, 0x2F7D, 0x7C27, 0x1506, 0x7C28, 0x2F7E, 0x7C29, 0x2F77,\n    0x7C2A, 0x1507, 0x7C2B, 0x1505, 0x7C2C, 0x30D6, 0x7C2D, 0x2F7B,\n    0x7C30, 0x2F81, 0x7C33, 0x30D3, 0x7C37, 0x15A7, 0x7C38, 0x15A5,\n    0x7C39, 0x30D5, 0x7C3B, 0x30D7, 0x7C3C, 0x30D4, 0x7C3D, 0x15A6,\n    0x7C3E, 0x15A3, 0x7C3F, 0x15A4, 0x7C40, 0x15A8, 0x7C43, 0x162B,\n    0x7C45, 0x3212, 0x7C47, 0x3211, 0x7C48, 0x320F, 0x7C49, 0x320E,\n    0x7C4A, 0x3210, 0x7C4C, 0x162A, 0x7C4D, 0x162C, 0x7C50, 0x1681,\n    0x7C53, 0x32EA, 0x7C54, 0x32E9, 0x7C57, 0x339B, 0x7C59, 0x339D,\n    0x7C5A, 0x339F, 0x7C5B, 0x339E, 0x7C5C, 0x339C, 0x7C5F, 0x16D1,\n    0x7C60, 0x16D0, 0x7C63, 0x1701, 0x7C64, 0x1700, 0x7C65, 0x1702,\n    0x7C66, 0x342B, 0x7C67, 0x342A, 0x7C69, 0x34D6, 0x7C6A, 0x3493,\n    0x7C6B, 0x34D7, 0x7C6C, 0x1745, 0x7C6E, 0x1746, 0x7C6F, 0x3507,\n    0x7C72, 0x176B, 0x7C73, 0x03F7, 0x7C75, 0x1A25, 0x7C78, 0x1BBB,\n    0x7C79, 0x1BBC, 0x7C7A, 0x1BBA, 0x7C7D, 0x07CC, 0x7C7F, 0x1BBD,\n    0x7C80, 0x1BBE, 0x7C81, 0x1BBF, 0x7C84, 0x1D96, 0x7C85, 0x1D9C,\n    0x7C88, 0x1D9A, 0x7C89, 0x096A, 0x7C8A, 0x1D98, 0x7C8C, 0x1D99,\n    0x7C8D, 0x1D9B, 0x7C91, 0x1D97, 0x7C92, 0x0B50, 0x7C94, 0x1FE0,\n    0x7C95, 0x0B52, 0x7C96, 0x1FE2, 0x7C97, 0x0B51, 0x7C98, 0x1FE1,\n    0x7C9E, 0x225D, 0x7C9F, 0x0D0D, 0x7CA1, 0x225F, 0x7CA2, 0x225C,\n    0x7CA3, 0x1FE3, 0x7CA5, 0x0D0E, 0x7CA7, 0x36ED, 0x7CA8, 0x225E,\n    0x7CAF, 0x24FE, 0x7CB1, 0x0EBB, 0x7CB2, 0x24FC, 0x7CB3, 0x0EBC,\n    0x7CB4, 0x24FD, 0x7CB5, 0x0EBD, 0x7CB9, 0x1058, 0x7CBA, 0x277D,\n    0x7CBB, 0x277A, 0x7CBC, 0x277C, 0x7CBD, 0x1059, 0x7CBE, 0x105A,\n    0x7CBF, 0x277B, 0x7CC5, 0x29B0, 0x7CC8, 0x29B1, 0x7CCA, 0x11D4,\n    0x7CCB, 0x29B3, 0x7CCC, 0x29B2, 0x7CCE, 0x0121, 0x7CD0, 0x2C11,\n    0x7CD1, 0x2C12, 0x7CD2, 0x2C0E, 0x7CD4, 0x2C0F, 0x7CD5, 0x131E,\n    0x7CD6, 0x131F, 0x7CD7, 0x2C10, 0x7CD9, 0x1433, 0x7CDC, 0x142F,\n    0x7CDD, 0x1434, 0x7CDE, 0x1430, 0x7CDF, 0x1432, 0x7CE0, 0x142E,\n    0x7CE2, 0x1431, 0x7CE7, 0x150B, 0x7CE8, 0x2DED, 0x7CEA, 0x30D9,\n    0x7CEC, 0x30D8, 0x7CEE, 0x3213, 0x7CEF, 0x162D, 0x7CF0, 0x162E,\n    0x7CF1, 0x33A1, 0x7CF2, 0x32EB, 0x7CF4, 0x33A0, 0x7CF6, 0x34D8,\n    0x7CF7, 0x351D, 0x7CF8, 0x03F8, 0x7CFB, 0x04FB, 0x7CFD, 0x1A26,\n    0x7CFE, 0x0667, 0x7D00, 0x07CF, 0x7D01, 0x1BC2, 0x7D02, 0x07CD,\n    0x7D03, 0x1BC0, 0x7D04, 0x07D2, 0x7D05, 0x07CE, 0x7D06, 0x07D3,\n    0x7D07, 0x07D1, 0x7D08, 0x1BC1, 0x7D09, 0x07D0, 0x7D0A, 0x096E,\n    0x7D0B, 0x096D, 0x7D0C, 0x1DA7, 0x7D0D, 0x0976, 0x7D0E, 0x1DA0,\n    0x7D0F, 0x1DA6, 0x7D10, 0x0972, 0x7D11, 0x1D9F, 0x7D12, 0x1DA5,\n    0x7D13, 0x1DA3, 0x7D14, 0x0971, 0x7D15, 0x0973, 0x7D16, 0x1DA2,\n    0x7D17, 0x096C, 0x7D18, 0x1DA1, 0x7D19, 0x0977, 0x7D1A, 0x0974,\n    0x7D1B, 0x0978, 0x7D1C, 0x0975, 0x7D1D, 0x1D9E, 0x7D1E, 0x1D9D,\n    0x7D1F, 0x1DA4, 0x7D20, 0x096F, 0x7D21, 0x096B, 0x7D22, 0x0970,\n    0x7D28, 0x1FF2, 0x7D29, 0x1FEB, 0x7D2B, 0x0D13, 0x7D2C, 0x1FEA,\n    0x7D2E, 0x0B56, 0x7D2F, 0x0B5D, 0x7D30, 0x0B5A, 0x7D31, 0x0B60,\n    0x7D32, 0x0B5F, 0x7D33, 0x0B5B, 0x7D35, 0x1FE4, 0x7D36, 0x1FE7,\n    0x7D38, 0x1FE6, 0x7D39, 0x0B57, 0x7D3A, 0x1FE8, 0x7D3B, 0x1FF1,\n    0x7D3C, 0x0B58, 0x7D3D, 0x1FE5, 0x7D3E, 0x1FEE, 0x7D3F, 0x1FEF,\n    0x7D40, 0x0B59, 0x7D41, 0x1FEC, 0x7D42, 0x0B5E, 0x7D43, 0x0B54,\n    0x7D44, 0x0B5C, 0x7D45, 0x1FE9, 0x7D46, 0x0B53, 0x7D47, 0x1FED,\n    0x7D4A, 0x1FF0, 0x7D4E, 0x2270, 0x7D4F, 0x2267, 0x7D50, 0x0D10,\n    0x7D51, 0x226E, 0x7D52, 0x226B, 0x7D53, 0x2263, 0x7D54, 0x226C,\n    0x7D55, 0x0D12, 0x7D56, 0x2264, 0x7D58, 0x2260, 0x7D5B, 0x0EC3,\n    0x7D5C, 0x2269, 0x7D5E, 0x0D0F, 0x7D5F, 0x226F, 0x7D61, 0x0D16,\n    0x7D62, 0x0D18, 0x7D63, 0x2262, 0x7D66, 0x0D17, 0x7D67, 0x2265,\n    0x7D68, 0x0D11, 0x7D69, 0x226D, 0x7D6A, 0x2266, 0x7D6B, 0x226A,\n    0x7D6D, 0x2268, 0x7D6E, 0x0D14, 0x7D6F, 0x2261, 0x7D70, 0x0D19,\n    0x7D71, 0x0B55, 0x7D72, 0x0D15, 0x7D73, 0x0D1A, 0x7D79, 0x0EBF,\n    0x7D7A, 0x2505, 0x7D7B, 0x2507, 0x7D7C, 0x2509, 0x7D7D, 0x250D,\n    0x7D7F, 0x2503, 0x7D80, 0x2501, 0x7D81, 0x0EC1, 0x7D83, 0x2508,\n    0x7D84, 0x250C, 0x7D85, 0x2504, 0x7D86, 0x2500, 0x7D88, 0x24FF,\n    0x7D8C, 0x250A, 0x7D8D, 0x2502, 0x7D8E, 0x2506, 0x7D8F, 0x0EC2,\n    0x7D91, 0x0EC0, 0x7D92, 0x250E, 0x7D93, 0x0EBE, 0x7D94, 0x250B,\n    0x7D96, 0x278E, 0x7D9C, 0x105D, 0x7D9D, 0x2786, 0x7D9E, 0x11E1,\n    0x7D9F, 0x2790, 0x7DA0, 0x1060, 0x7DA1, 0x2794, 0x7DA2, 0x1066,\n    0x7DA3, 0x2781, 0x7DA6, 0x2791, 0x7DA7, 0x277E, 0x7DA9, 0x2793,\n    0x7DAA, 0x2782, 0x7DAC, 0x106D, 0x7DAD, 0x106A, 0x7DAE, 0x2792,\n    0x7DAF, 0x278C, 0x7DB0, 0x105C, 0x7DB1, 0x1064, 0x7DB2, 0x1063,\n    0x7DB4, 0x1062, 0x7DB5, 0x1068, 0x7DB7, 0x277F, 0x7DB8, 0x1069,\n    0x7DB9, 0x278D, 0x7DBA, 0x1065, 0x7DBB, 0x105B, 0x7DBC, 0x278F,\n    0x7DBD, 0x105E, 0x7DBE, 0x105F, 0x7DBF, 0x1067, 0x7DC0, 0x2784,\n    0x7DC1, 0x2783, 0x7DC2, 0x2780, 0x7DC4, 0x2788, 0x7DC5, 0x2785,\n    0x7DC6, 0x2789, 0x7DC7, 0x106C, 0x7DC9, 0x2795, 0x7DCA, 0x1061,\n    0x7DCB, 0x278A, 0x7DCC, 0x278B, 0x7DCE, 0x2787, 0x7DD2, 0x106B,\n    0x7DD7, 0x29B8, 0x7DD8, 0x11D9, 0x7DD9, 0x11E2, 0x7DDA, 0x11DE,\n    0x7DDB, 0x29B5, 0x7DDD, 0x11DB, 0x7DDE, 0x11DF, 0x7DDF, 0x29C1,\n    0x7DE0, 0x11D5, 0x7DE1, 0x29B9, 0x7DE3, 0x11DD, 0x7DE6, 0x29BC,\n    0x7DE7, 0x29B7, 0x7DE8, 0x11DC, 0x7DE9, 0x11E0, 0x7DEA, 0x29B6,\n    0x7DEC, 0x11DA, 0x7DEE, 0x29C0, 0x7DEF, 0x11D7, 0x7DF0, 0x29BF,\n    0x7DF1, 0x29BE, 0x7DF2, 0x11E3, 0x7DF3, 0x28C8, 0x7DF4, 0x11D6,\n    0x7DF6, 0x29BD, 0x7DF7, 0x29B4, 0x7DF9, 0x11E4, 0x7DFA, 0x29BB,\n    0x7DFB, 0x11D8, 0x7E03, 0x29BA, 0x7E08, 0x1322, 0x7E09, 0x1327,\n    0x7E0A, 0x1320, 0x7E0B, 0x2C1F, 0x7E0C, 0x2C16, 0x7E0D, 0x2C22,\n    0x7E0E, 0x2C1A, 0x7E0F, 0x2C20, 0x7E10, 0x1328, 0x7E11, 0x1321,\n    0x7E12, 0x2C13, 0x7E13, 0x2C19, 0x7E14, 0x2C23, 0x7E15, 0x2C1C,\n    0x7E16, 0x2C21, 0x7E17, 0x2C15, 0x7E1A, 0x2C1D, 0x7E1B, 0x1323,\n    0x7E1C, 0x2C1B, 0x7E1D, 0x1326, 0x7E1E, 0x1325, 0x7E1F, 0x2C17,\n    0x7E20, 0x2C18, 0x7E21, 0x2C14, 0x7E22, 0x2C1E, 0x7E23, 0x1324,\n    0x7E24, 0x2C25, 0x7E25, 0x2C24, 0x7E29, 0x2DF8, 0x7E2A, 0x2DF4,\n    0x7E2B, 0x143B, 0x7E2D, 0x2DEE, 0x7E2E, 0x1435, 0x7E2F, 0x1445,\n    0x7E30, 0x2DFA, 0x7E31, 0x143D, 0x7E32, 0x1439, 0x7E33, 0x2DF1,\n    0x7E34, 0x1440, 0x7E35, 0x1443, 0x7E36, 0x2DFC, 0x7E37, 0x1438,\n    0x7E38, 0x2DF3, 0x7E39, 0x1441, 0x7E3A, 0x2DFE, 0x7E3B, 0x2DFB,\n    0x7E3C, 0x2DEF, 0x7E3D, 0x143C, 0x7E3E, 0x1436, 0x7E3F, 0x1444,\n    0x7E40, 0x2DF6, 0x7E41, 0x143F, 0x7E42, 0x2DF0, 0x7E43, 0x143A,\n    0x7E44, 0x2DFD, 0x7E45, 0x143E, 0x7E46, 0x1437, 0x7E47, 0x2DF7,\n    0x7E48, 0x1442, 0x7E49, 0x2DF5, 0x7E4C, 0x2DF9, 0x7E50, 0x2F83,\n    0x7E51, 0x2F89, 0x7E52, 0x1511, 0x7E53, 0x2F8C, 0x7E54, 0x150C,\n    0x7E55, 0x150D, 0x7E56, 0x2F84, 0x7E57, 0x2F8B, 0x7E58, 0x2F86,\n    0x7E59, 0x1512, 0x7E5A, 0x150F, 0x7E5C, 0x2F82, 0x7E5E, 0x150E,\n    0x7E5F, 0x2F88, 0x7E60, 0x2F8A, 0x7E61, 0x1510, 0x7E62, 0x2F87,\n    0x7E63, 0x2F85, 0x7E68, 0x30E3, 0x7E69, 0x15AC, 0x7E6A, 0x15AD,\n    0x7E6B, 0x15A9, 0x7E6D, 0x15AA, 0x7E6F, 0x30DF, 0x7E70, 0x30DD,\n    0x7E72, 0x30E1, 0x7E73, 0x15AE, 0x7E74, 0x30E2, 0x7E75, 0x30DB,\n    0x7E76, 0x30DA, 0x7E77, 0x30DE, 0x7E78, 0x30DC, 0x7E79, 0x15AB,\n    0x7E7A, 0x30E0, 0x7E7B, 0x3214, 0x7E7C, 0x1631, 0x7E7D, 0x1630,\n    0x7E7E, 0x3215, 0x7E80, 0x3217, 0x7E81, 0x3216, 0x7E82, 0x1632,\n    0x7E86, 0x32F0, 0x7E87, 0x32ED, 0x7E88, 0x32EE, 0x7E8A, 0x32EC,\n    0x7E8B, 0x32EF, 0x7E8C, 0x1683, 0x7E8D, 0x32F1, 0x7E8F, 0x1682,\n    0x7E91, 0x33A2, 0x7E93, 0x1703, 0x7E94, 0x1705, 0x7E95, 0x342C,\n    0x7E96, 0x1704, 0x7E97, 0x3494, 0x7E98, 0x34DA, 0x7E99, 0x34DC,\n    0x7E9A, 0x34D9, 0x7E9B, 0x34DB, 0x7E9C, 0x1759, 0x7F36, 0x03F9,\n    0x7F38, 0x07D4, 0x7F39, 0x1D1F, 0x7F3A, 0x0979, 0x7F3D, 0x0B61,\n    0x7F3E, 0x2271, 0x7F3F, 0x2272, 0x7F43, 0x2C26, 0x7F44, 0x1446,\n    0x7F45, 0x2DFF, 0x7F48, 0x1513, 0x7F4A, 0x30E5, 0x7F4B, 0x30E4,\n    0x7F4C, 0x1633, 0x7F4D, 0x32F2, 0x7F4F, 0x33A3, 0x7F50, 0x1726,\n    0x7F51, 0x1812, 0x7F54, 0x0668, 0x7F55, 0x04FC, 0x7F58, 0x1BC3,\n    0x7F5B, 0x1DAD, 0x7F5C, 0x1DA8, 0x7F5D, 0x1DAC, 0x7F5E, 0x1DAA,\n    0x7F5F, 0x097A, 0x7F60, 0x1DAB, 0x7F61, 0x1DA9, 0x7F63, 0x1FF3,\n    0x7F65, 0x2273, 0x7F66, 0x2274, 0x7F67, 0x2511, 0x7F68, 0x2512,\n    0x7F69, 0x0EC5, 0x7F6A, 0x0EC6, 0x7F6B, 0x2510, 0x7F6C, 0x2513,\n    0x7F6D, 0x250F, 0x7F6E, 0x0EC4, 0x7F70, 0x106E, 0x7F72, 0x0EC7,\n    0x7F73, 0x2796, 0x7F75, 0x11E5, 0x7F76, 0x29C2, 0x7F77, 0x11E6,\n    0x7F79, 0x1329, 0x7F7A, 0x2C29, 0x7F7B, 0x2C27, 0x7F7C, 0x2C28,\n    0x7F7D, 0x2E02, 0x7F7E, 0x2E01, 0x7F7F, 0x2E00, 0x7F83, 0x30E6,\n    0x7F85, 0x15AF, 0x7F86, 0x30E7, 0x7F87, 0x33A4, 0x7F88, 0x1727,\n    0x7F89, 0x3495, 0x7F8A, 0x03FA, 0x7F8B, 0x066A, 0x7F8C, 0x0669,\n    0x7F8D, 0x1BC5, 0x7F8E, 0x07D5, 0x7F91, 0x1BC4, 0x7F92, 0x1DAF,\n    0x7F94, 0x097B, 0x7F95, 0x1FF4, 0x7F96, 0x1DAE, 0x7F9A, 0x0B63,\n    0x7F9B, 0x1FF7, 0x7F9C, 0x1FF5, 0x7F9D, 0x1FF6, 0x7F9E, 0x0B62,\n    0x7FA0, 0x2276, 0x7FA1, 0x2277, 0x7FA2, 0x2275, 0x7FA4, 0x0ECA,\n    0x7FA5, 0x2515, 0x7FA6, 0x2514, 0x7FA7, 0x2516, 0x7FA8, 0x0EC9,\n    0x7FA9, 0x0EC8, 0x7FAC, 0x29C3, 0x7FAD, 0x29C5, 0x7FAF, 0x11E7,\n    0x7FB0, 0x29C4, 0x7FB1, 0x2C2A, 0x7FB2, 0x132A, 0x7FB3, 0x2F8E,\n    0x7FB5, 0x2F8D, 0x7FB6, 0x15B0, 0x7FB7, 0x30E8, 0x7FB8, 0x15B2,\n    0x7FB9, 0x15B1, 0x7FBA, 0x3218, 0x7FBB, 0x32F3, 0x7FBC, 0x1684,\n    0x7FBD, 0x03FB, 0x7FBE, 0x1BC6, 0x7FBF, 0x07D6, 0x7FC0, 0x1DB2,\n    0x7FC1, 0x097D, 0x7FC2, 0x1DB1, 0x7FC3, 0x1DB0, 0x7FC5, 0x097C,\n    0x7FC7, 0x1FFD, 0x7FC9, 0x1FFF, 0x7FCA, 0x1FF8, 0x7FCB, 0x1FF9,\n    0x7FCC, 0x0B64, 0x7FCD, 0x1FFA, 0x7FCE, 0x0B65, 0x7FCF, 0x1FFE,\n    0x7FD0, 0x1FFB, 0x7FD1, 0x1FFC, 0x7FD2, 0x0B66, 0x7FD4, 0x0D1C,\n    0x7FD5, 0x0D1D, 0x7FD7, 0x2278, 0x7FDB, 0x2517, 0x7FDC, 0x2518,\n    0x7FDE, 0x279A, 0x7FDF, 0x1071, 0x7FE0, 0x106F, 0x7FE1, 0x1070,\n    0x7FE2, 0x2797, 0x7FE3, 0x2798, 0x7FE5, 0x2799, 0x7FE6, 0x29CA,\n    0x7FE8, 0x29CB, 0x7FE9, 0x11E8, 0x7FEA, 0x29C8, 0x7FEB, 0x29C7,\n    0x7FEC, 0x29C9, 0x7FED, 0x29C6, 0x7FEE, 0x132D, 0x7FEF, 0x2C2B,\n    0x7FF0, 0x132B, 0x7FF1, 0x132C, 0x7FF2, 0x2E04, 0x7FF3, 0x1447,\n    0x7FF4, 0x2E03, 0x7FF5, 0x2EFF, 0x7FF7, 0x2F8F, 0x7FF8, 0x2F90,\n    0x7FF9, 0x1514, 0x7FFB, 0x1515, 0x7FFC, 0x1448, 0x7FFD, 0x30E9,\n    0x7FFE, 0x30EA, 0x7FFF, 0x3219, 0x8000, 0x1634, 0x8001, 0x03FC,\n    0x8003, 0x03FD, 0x8004, 0x097F, 0x8005, 0x066B, 0x8006, 0x097E,\n    0x8007, 0x1BC7, 0x800B, 0x0D1E, 0x800C, 0x03FE, 0x800D, 0x07D8,\n    0x800E, 0x1BC8, 0x800F, 0x1BC9, 0x8010, 0x07D7, 0x8011, 0x07D9,\n    0x8012, 0x03FF, 0x8014, 0x1BCA, 0x8015, 0x0981, 0x8016, 0x1DB3,\n    0x8017, 0x0983, 0x8018, 0x0980, 0x8019, 0x0982, 0x801B, 0x2002,\n    0x801C, 0x0B67, 0x801E, 0x2001, 0x801F, 0x2000, 0x8021, 0x2519,\n    0x8024, 0x279B, 0x8026, 0x11E9, 0x8028, 0x132E, 0x8029, 0x2C2D,\n    0x802A, 0x2C2C, 0x802C, 0x2E05, 0x8030, 0x32F4, 0x8033, 0x0400,\n    0x8034, 0x18D8, 0x8035, 0x1A27, 0x8036, 0x07DA, 0x8037, 0x1BCB,\n    0x8039, 0x1DB5, 0x803D, 0x0984, 0x803E, 0x1DB4, 0x803F, 0x0985,\n    0x8043, 0x2004, 0x8046, 0x0B69, 0x8047, 0x2003, 0x8048, 0x2005,\n    0x804A, 0x0B68, 0x804F, 0x227A, 0x8050, 0x227B, 0x8051, 0x2279,\n    0x8052, 0x0D1F, 0x8056, 0x0ECB, 0x8058, 0x0ECC, 0x805A, 0x1073,\n    0x805C, 0x279D, 0x805D, 0x279C, 0x805E, 0x1072, 0x8064, 0x29CC,\n    0x8067, 0x29CD, 0x806C, 0x2C2E, 0x806F, 0x144C, 0x8070, 0x144B,\n    0x8071, 0x1449, 0x8072, 0x144A, 0x8073, 0x144D, 0x8075, 0x2F91,\n    0x8076, 0x1517, 0x8077, 0x1516, 0x8078, 0x30EB, 0x8079, 0x321A,\n    0x807D, 0x16D3, 0x807E, 0x16D2, 0x807F, 0x0401, 0x8082, 0x1CEC,\n    0x8084, 0x0ECE, 0x8085, 0x0D20, 0x8086, 0x0ECD, 0x8087, 0x1074,\n    0x8089, 0x0402, 0x808A, 0x17B3, 0x808B, 0x0403, 0x808C, 0x0404,\n    0x808F, 0x1A28, 0x8090, 0x18DB, 0x8092, 0x18DC, 0x8093, 0x04FE,\n    0x8095, 0x18D9, 0x8096, 0x04FD, 0x8098, 0x0500, 0x8099, 0x18DA,\n    0x809A, 0x0502, 0x809B, 0x0501, 0x809C, 0x18DD, 0x809D, 0x04FF,\n    0x80A1, 0x0670, 0x80A2, 0x066E, 0x80A3, 0x1A2A, 0x80A5, 0x066D,\n    0x80A9, 0x0672, 0x80AA, 0x0674, 0x80AB, 0x0671, 0x80AD, 0x1A2D,\n    0x80AE, 0x1A29, 0x80AF, 0x0675, 0x80B1, 0x066F, 0x80B2, 0x0503,\n    0x80B4, 0x0673, 0x80B5, 0x1A2C, 0x80B8, 0x1A2B, 0x80BA, 0x066C,\n    0x80C2, 0x1BD1, 0x80C3, 0x07DE, 0x80C4, 0x07DF, 0x80C5, 0x1BD3,\n    0x80C7, 0x1BCD, 0x80C8, 0x1BD0, 0x80C9, 0x1BD9, 0x80CA, 0x1BD7,\n    0x80CC, 0x07E0, 0x80CD, 0x1BDD, 0x80CE, 0x07E3, 0x80CF, 0x1BDA,\n    0x80D0, 0x1BD2, 0x80D1, 0x1BCF, 0x80D4, 0x227D, 0x80D5, 0x1BD8,\n    0x80D6, 0x07DB, 0x80D7, 0x1BDB, 0x80D8, 0x1BCC, 0x80D9, 0x1BD5,\n    0x80DA, 0x07DD, 0x80DB, 0x07E2, 0x80DC, 0x1BD6, 0x80DD, 0x07E6,\n    0x80DE, 0x07E4, 0x80E0, 0x1BCE, 0x80E1, 0x07E1, 0x80E3, 0x1BD4,\n    0x80E4, 0x07E5, 0x80E5, 0x07DC, 0x80E6, 0x1BDC, 0x80ED, 0x098A,\n    0x80EF, 0x0993, 0x80F0, 0x0988, 0x80F1, 0x0986, 0x80F2, 0x1DB7,\n    0x80F3, 0x098E, 0x80F4, 0x098B, 0x80F5, 0x1DB9, 0x80F8, 0x098D,\n    0x80F9, 0x1DB8, 0x80FA, 0x1DB6, 0x80FB, 0x1DBB, 0x80FC, 0x0992,\n    0x80FD, 0x0990, 0x80FE, 0x227C, 0x8100, 0x1DBC, 0x8101, 0x1DBA,\n    0x8102, 0x0987, 0x8105, 0x0989, 0x8106, 0x098C, 0x8108, 0x098F,\n    0x810A, 0x0991, 0x8115, 0x200F, 0x8116, 0x0B6B, 0x8118, 0x2006,\n    0x8119, 0x2008, 0x811B, 0x2009, 0x811D, 0x2011, 0x811E, 0x200D,\n    0x811F, 0x200B, 0x8121, 0x200E, 0x8122, 0x2012, 0x8123, 0x0B6C,\n    0x8124, 0x0B70, 0x8125, 0x2007, 0x8127, 0x2010, 0x8129, 0x0B6E,\n    0x812B, 0x0B6D, 0x812C, 0x200C, 0x812D, 0x200A, 0x812F, 0x0B6A,\n    0x8130, 0x0B6F, 0x8139, 0x0D26, 0x813A, 0x2285, 0x813D, 0x2283,\n    0x813E, 0x0D28, 0x8143, 0x227E, 0x8144, 0x2527, 0x8146, 0x0D27,\n    0x8147, 0x2282, 0x814A, 0x227F, 0x814B, 0x0D23, 0x814C, 0x0D29,\n    0x814D, 0x2284, 0x814E, 0x0D25, 0x814F, 0x2281, 0x8150, 0x1075,\n    0x8151, 0x0D24, 0x8152, 0x2280, 0x8153, 0x0D2A, 0x8154, 0x0D22,\n    0x8155, 0x0D21, 0x815B, 0x251F, 0x815C, 0x251D, 0x815E, 0x2523,\n    0x8160, 0x251B, 0x8161, 0x2528, 0x8162, 0x2520, 0x8164, 0x251A,\n    0x8165, 0x0ED2, 0x8166, 0x0ED8, 0x8167, 0x2525, 0x8169, 0x251E,\n    0x816B, 0x0ED5, 0x816E, 0x0ED3, 0x816F, 0x2526, 0x8170, 0x0ED0,\n    0x8171, 0x0ECF, 0x8172, 0x2521, 0x8173, 0x0ED4, 0x8174, 0x0D2B,\n    0x8176, 0x2524, 0x8177, 0x251C, 0x8178, 0x0ED1, 0x8179, 0x0ED6,\n    0x817A, 0x0ED7, 0x817F, 0x107A, 0x8180, 0x1076, 0x8182, 0x107B,\n    0x8183, 0x27A0, 0x8186, 0x279F, 0x8187, 0x27A1, 0x8188, 0x1078,\n    0x8189, 0x279E, 0x818A, 0x1079, 0x818B, 0x27A4, 0x818C, 0x27A3,\n    0x818D, 0x27A2, 0x818F, 0x1077, 0x8195, 0x29D1, 0x8197, 0x29D4,\n    0x8198, 0x11EF, 0x8199, 0x29D3, 0x819A, 0x11EE, 0x819B, 0x11EA,\n    0x819C, 0x11EB, 0x819D, 0x11EC, 0x819E, 0x29D0, 0x819F, 0x29CF,\n    0x81A0, 0x11ED, 0x81A2, 0x29D2, 0x81A3, 0x29CE, 0x81A6, 0x2C30,\n    0x81A7, 0x2C3A, 0x81A8, 0x1331, 0x81A9, 0x1330, 0x81AB, 0x2C34,\n    0x81AC, 0x2C36, 0x81AE, 0x2C31, 0x81B0, 0x2C35, 0x81B1, 0x2C2F,\n    0x81B2, 0x2C38, 0x81B3, 0x132F, 0x81B4, 0x2C37, 0x81B5, 0x2C33,\n    0x81B7, 0x2C39, 0x81B9, 0x2C32, 0x81BA, 0x1450, 0x81BB, 0x2E06,\n    0x81BC, 0x2E0C, 0x81BD, 0x1454, 0x81BE, 0x1456, 0x81BF, 0x1453,\n    0x81C0, 0x1452, 0x81C2, 0x1451, 0x81C3, 0x144F, 0x81C4, 0x2E07,\n    0x81C5, 0x2E0A, 0x81C6, 0x144E, 0x81C7, 0x2E0B, 0x81C9, 0x1455,\n    0x81CA, 0x2E09, 0x81CC, 0x2E08, 0x81CD, 0x1518, 0x81CF, 0x1519,\n    0x81D0, 0x2F94, 0x81D1, 0x2F92, 0x81D2, 0x2F93, 0x81D5, 0x30ED,\n    0x81D7, 0x30EC, 0x81D8, 0x15B3, 0x81D9, 0x321C, 0x81DA, 0x1635,\n    0x81DB, 0x321B, 0x81DD, 0x32F5, 0x81DE, 0x33A5, 0x81DF, 0x16D4,\n    0x81E0, 0x34DD, 0x81E1, 0x34DE, 0x81E2, 0x1706, 0x81E3, 0x0405,\n    0x81E5, 0x0676, 0x81E6, 0x2286, 0x81E7, 0x107C, 0x81E8, 0x1457,\n    0x81E9, 0x2E0D, 0x81EA, 0x0406, 0x81EC, 0x0995, 0x81ED, 0x0994,\n    0x81EE, 0x2287, 0x81F2, 0x2C3B, 0x81F3, 0x0407, 0x81F4, 0x07E7,\n    0x81F7, 0x2288, 0x81F8, 0x2289, 0x81F9, 0x228A, 0x81FA, 0x107D,\n    0x81FB, 0x1332, 0x81FC, 0x0408, 0x81FE, 0x0677, 0x81FF, 0x1BDE,\n    0x8200, 0x0996, 0x8201, 0x1DBD, 0x8202, 0x0B71, 0x8204, 0x228B,\n    0x8205, 0x0ED9, 0x8207, 0x107E, 0x8208, 0x1333, 0x8209, 0x1458,\n    0x820A, 0x151A, 0x820B, 0x30EE, 0x820C, 0x0409, 0x820D, 0x0678,\n    0x8210, 0x0997, 0x8211, 0x2013, 0x8212, 0x0D2C, 0x8214, 0x107F,\n    0x8215, 0x27A5, 0x8216, 0x29D5, 0x821B, 0x040A, 0x821C, 0x0D2D,\n    0x821D, 0x2529, 0x821E, 0x1080, 0x821F, 0x040B, 0x8220, 0x1A2E,\n    0x8221, 0x1BDF, 0x8222, 0x07E8, 0x8225, 0x1DBF, 0x8228, 0x099A,\n    0x822A, 0x0998, 0x822B, 0x0999, 0x822C, 0x099B, 0x822F, 0x1DBE,\n    0x8232, 0x2018, 0x8233, 0x2015, 0x8234, 0x2017, 0x8235, 0x0B72,\n    0x8236, 0x0B74, 0x8237, 0x0B73, 0x8238, 0x2014, 0x8239, 0x0B75,\n    0x823A, 0x2016, 0x823C, 0x228C, 0x823D, 0x228D, 0x823F, 0x228E,\n    0x8240, 0x252C, 0x8242, 0x252D, 0x8244, 0x252B, 0x8245, 0x252E,\n    0x8247, 0x0EDA, 0x8249, 0x252A, 0x824B, 0x1081, 0x824E, 0x29DA,\n    0x824F, 0x29D6, 0x8250, 0x29D9, 0x8251, 0x29DB, 0x8252, 0x29D8,\n    0x8253, 0x29D7, 0x8255, 0x2C3C, 0x8256, 0x2C3D, 0x8257, 0x2C3E,\n    0x8258, 0x1334, 0x8259, 0x1335, 0x825A, 0x2E0F, 0x825B, 0x2E0E,\n    0x825C, 0x2E10, 0x825E, 0x2F96, 0x825F, 0x2F95, 0x8261, 0x30F0,\n    0x8263, 0x30F1, 0x8264, 0x30EF, 0x8266, 0x1636, 0x8268, 0x321D,\n    0x8269, 0x321E, 0x826B, 0x33A6, 0x826C, 0x342D, 0x826D, 0x3496,\n    0x826E, 0x040C, 0x826F, 0x0504, 0x8271, 0x1459, 0x8272, 0x040D,\n    0x8274, 0x2019, 0x8275, 0x228F, 0x8277, 0x172E, 0x8278, 0x1813,\n    0x827C, 0x1814, 0x827D, 0x1816, 0x827E, 0x040E, 0x827F, 0x1817,\n    0x8280, 0x1815, 0x8283, 0x18E5, 0x8284, 0x18E6, 0x8285, 0x18E0,\n    0x828A, 0x18E4, 0x828B, 0x0506, 0x828D, 0x0507, 0x828E, 0x18E1,\n    0x828F, 0x18DF, 0x8290, 0x18DE, 0x8291, 0x18E2, 0x8292, 0x0505,\n    0x8293, 0x18E3, 0x8294, 0x1BE0, 0x8298, 0x1A33, 0x8299, 0x067B,\n    0x829A, 0x1A32, 0x829B, 0x1A34, 0x829D, 0x067A, 0x829E, 0x1A39,\n    0x829F, 0x067E, 0x82A0, 0x1A2F, 0x82A1, 0x1A3D, 0x82A2, 0x1A43,\n    0x82A3, 0x0685, 0x82A4, 0x1A40, 0x82A5, 0x0682, 0x82A7, 0x1A36,\n    0x82A8, 0x1A3C, 0x82A9, 0x1A3E, 0x82AB, 0x1A31, 0x82AC, 0x0681,\n    0x82AD, 0x067C, 0x82AE, 0x1A37, 0x82AF, 0x0683, 0x82B0, 0x0686,\n    0x82B1, 0x0680, 0x82B3, 0x0679, 0x82B4, 0x1A3B, 0x82B5, 0x1A35,\n    0x82B6, 0x1A42, 0x82B7, 0x0688, 0x82B8, 0x0684, 0x82B9, 0x067F,\n    0x82BA, 0x1A3A, 0x82BB, 0x099C, 0x82BC, 0x1A38, 0x82BD, 0x067D,\n    0x82BE, 0x0687, 0x82C0, 0x1A30, 0x82C2, 0x1A3F, 0x82C3, 0x1A41,\n    0x82D1, 0x07F9, 0x82D2, 0x07F3, 0x82D3, 0x07FB, 0x82D4, 0x07F8,\n    0x82D5, 0x1BE7, 0x82D6, 0x1BEA, 0x82D7, 0x07F4, 0x82D9, 0x1BE1,\n    0x82DB, 0x07ED, 0x82DC, 0x07F7, 0x82DE, 0x07FA, 0x82DF, 0x07FC,\n    0x82E0, 0x1BF6, 0x82E1, 0x1BED, 0x82E3, 0x07EC, 0x82E4, 0x1BF5,\n    0x82E5, 0x07F0, 0x82E6, 0x07EE, 0x82E7, 0x07E9, 0x82E8, 0x1BE5,\n    0x82EA, 0x1BF4, 0x82EB, 0x1BE9, 0x82EC, 0x1BEC, 0x82ED, 0x1BF9,\n    0x82EF, 0x07FD, 0x82F0, 0x1BF3, 0x82F1, 0x07F5, 0x82F2, 0x1BEE,\n    0x82F3, 0x1BF8, 0x82F4, 0x1BEB, 0x82F5, 0x1BEF, 0x82F6, 0x1BF2,\n    0x82F9, 0x1BE3, 0x82FA, 0x1BF7, 0x82FB, 0x1BF1, 0x82FE, 0x1BE2,\n    0x8300, 0x1BE6, 0x8301, 0x07F6, 0x8302, 0x07F1, 0x8303, 0x07EA,\n    0x8304, 0x07EF, 0x8305, 0x07EB, 0x8306, 0x07FE, 0x8307, 0x1BE4,\n    0x8308, 0x1DD0, 0x8309, 0x07F2, 0x830C, 0x1BF0, 0x830D, 0x1A7D,\n    0x8316, 0x1DD3, 0x8317, 0x09AA, 0x8319, 0x1DC3, 0x831B, 0x1DCE,\n    0x831C, 0x1DCA, 0x831E, 0x1DDD, 0x8320, 0x1DD5, 0x8322, 0x1DCB,\n    0x8324, 0x1DD4, 0x8325, 0x1DC5, 0x8326, 0x1DC9, 0x8327, 0x1DE0,\n    0x8328, 0x09AD, 0x8329, 0x1DD8, 0x832A, 0x1DCF, 0x832B, 0x099D,\n    0x832C, 0x1DDE, 0x832D, 0x1DC1, 0x832F, 0x1DD7, 0x8331, 0x09AC,\n    0x8332, 0x09A7, 0x8333, 0x1DC0, 0x8334, 0x09A5, 0x8335, 0x09A4,\n    0x8336, 0x09A9, 0x8337, 0x1DD6, 0x8338, 0x09A1, 0x8339, 0x09A8,\n    0x833A, 0x1BE8, 0x833B, 0x2290, 0x833C, 0x1DD1, 0x833F, 0x1DC7,\n    0x8340, 0x09AB, 0x8341, 0x1DC8, 0x8342, 0x1DCC, 0x8343, 0x09AE,\n    0x8344, 0x1DC2, 0x8345, 0x1DDA, 0x8347, 0x1DD9, 0x8348, 0x1DE1,\n    0x8349, 0x09A3, 0x834A, 0x09A0, 0x834B, 0x1DDF, 0x834C, 0x1DDB,\n    0x834D, 0x1DD2, 0x834E, 0x1DCD, 0x834F, 0x09A6, 0x8350, 0x09A2,\n    0x8351, 0x1DC4, 0x8352, 0x099E, 0x8353, 0x1DDC, 0x8354, 0x099F,\n    0x8356, 0x1DC6, 0x8373, 0x201F, 0x8374, 0x2021, 0x8375, 0x2026,\n    0x8376, 0x203A, 0x8377, 0x0B83, 0x8378, 0x0B79, 0x837A, 0x201E,\n    0x837B, 0x0B84, 0x837C, 0x0B85, 0x837D, 0x2029, 0x837E, 0x2030,\n    0x837F, 0x2036, 0x8381, 0x2023, 0x8383, 0x202A, 0x8386, 0x0B86,\n    0x8387, 0x2038, 0x8388, 0x2033, 0x8389, 0x0B81, 0x838A, 0x0B7F,\n    0x838B, 0x202F, 0x838C, 0x202B, 0x838D, 0x201D, 0x838E, 0x0B76,\n    0x838F, 0x2022, 0x8390, 0x201A, 0x8392, 0x0B7E, 0x8393, 0x0B80,\n    0x8394, 0x2027, 0x8395, 0x2024, 0x8396, 0x0B7B, 0x8397, 0x2034,\n    0x8398, 0x0B78, 0x8399, 0x2025, 0x839A, 0x22B9, 0x839B, 0x202D,\n    0x839D, 0x202C, 0x839E, 0x0B77, 0x83A0, 0x0B82, 0x83A2, 0x0B7A,\n    0x83A3, 0x201B, 0x83A4, 0x2020, 0x83A5, 0x2031, 0x83A6, 0x2037,\n    0x83A7, 0x0B87, 0x83A8, 0x201C, 0x83A9, 0x2028, 0x83AA, 0x202E,\n    0x83AB, 0x0B7D, 0x83AE, 0x2039, 0x83AF, 0x2032, 0x83B0, 0x2035,\n    0x83BD, 0x0B7C, 0x83BF, 0x22A0, 0x83C0, 0x2294, 0x83C1, 0x0D35,\n    0x83C2, 0x22B1, 0x83C3, 0x22BA, 0x83C4, 0x22BD, 0x83C5, 0x0D33,\n    0x83C6, 0x229C, 0x83C7, 0x22B5, 0x83C8, 0x229D, 0x83C9, 0x22AB,\n    0x83CA, 0x0D40, 0x83CB, 0x22A7, 0x83CC, 0x0D3D, 0x83CE, 0x22A8,\n    0x83CF, 0x2291, 0x83D1, 0x22B6, 0x83D4, 0x0D46, 0x83D5, 0x22B3,\n    0x83D6, 0x22A9, 0x83D7, 0x22BF, 0x83D8, 0x22A4, 0x83D9, 0x254E,\n    0x83DB, 0x22C2, 0x83DC, 0x0D44, 0x83DD, 0x22A2, 0x83DE, 0x22AE,\n    0x83DF, 0x0D47, 0x83E0, 0x0D32, 0x83E1, 0x22A6, 0x83E2, 0x22C0,\n    0x83E3, 0x229F, 0x83E4, 0x2298, 0x83E5, 0x22A3, 0x83E7, 0x2297,\n    0x83E8, 0x2295, 0x83E9, 0x0D2E, 0x83EA, 0x22B7, 0x83EB, 0x229E,\n    0x83EC, 0x22BB, 0x83EE, 0x22BC, 0x83EF, 0x0D36, 0x83F0, 0x0D3B,\n    0x83F1, 0x0D37, 0x83F2, 0x0D3F, 0x83F3, 0x22B2, 0x83F4, 0x0D38,\n    0x83F5, 0x22AA, 0x83F6, 0x229A, 0x83F8, 0x0D30, 0x83F9, 0x2292,\n    0x83FA, 0x22B4, 0x83FB, 0x22BE, 0x83FC, 0x2299, 0x83FD, 0x0D3E,\n    0x83FE, 0x22C3, 0x83FF, 0x22A5, 0x8401, 0x22A1, 0x8403, 0x0D2F,\n    0x8404, 0x0D43, 0x8406, 0x22B0, 0x8407, 0x0D45, 0x8409, 0x22AC,\n    0x840A, 0x0D3A, 0x840B, 0x0D34, 0x840C, 0x0D3C, 0x840D, 0x0D31,\n    0x840E, 0x0D42, 0x840F, 0x22AD, 0x8410, 0x229B, 0x8411, 0x22AF,\n    0x8412, 0x2296, 0x8413, 0x22B8, 0x841B, 0x22C1, 0x8423, 0x2293,\n    0x8429, 0x254D, 0x842B, 0x2563, 0x842C, 0x0EAC, 0x842D, 0x2552,\n    0x842F, 0x2550, 0x8430, 0x253B, 0x8431, 0x0EDE, 0x8432, 0x254B,\n    0x8433, 0x255F, 0x8434, 0x2547, 0x8435, 0x0EE6, 0x8436, 0x255E,\n    0x8437, 0x2545, 0x8438, 0x0D41, 0x8439, 0x2555, 0x843A, 0x2546,\n    0x843B, 0x255C, 0x843C, 0x0EE5, 0x843D, 0x0EDD, 0x843F, 0x2530,\n    0x8440, 0x2538, 0x8442, 0x2551, 0x8443, 0x2549, 0x8444, 0x2562,\n    0x8445, 0x254C, 0x8446, 0x0EEB, 0x8447, 0x255D, 0x8449, 0x0EE2,\n    0x844B, 0x254F, 0x844C, 0x2557, 0x844D, 0x253C, 0x844E, 0x2556,\n    0x8450, 0x2567, 0x8451, 0x2537, 0x8452, 0x2558, 0x8454, 0x2565,\n    0x8456, 0x2531, 0x8457, 0x0D39, 0x8459, 0x253F, 0x845A, 0x253E,\n    0x845B, 0x0EE4, 0x845D, 0x2542, 0x845E, 0x2544, 0x845F, 0x2553,\n    0x8460, 0x2564, 0x8461, 0x0EE7, 0x8463, 0x0EE8, 0x8465, 0x2536,\n    0x8466, 0x0EE0, 0x8467, 0x253A, 0x8468, 0x2560, 0x8469, 0x0EE9,\n    0x846B, 0x0EE1, 0x846C, 0x0EE3, 0x846D, 0x0EEA, 0x846E, 0x2566,\n    0x846F, 0x2559, 0x8470, 0x2554, 0x8473, 0x2541, 0x8474, 0x2540,\n    0x8475, 0x0EDF, 0x8476, 0x2532, 0x8477, 0x0EDC, 0x8478, 0x254A,\n    0x8479, 0x2533, 0x847A, 0x2548, 0x847D, 0x253D, 0x847E, 0x2561,\n    0x8482, 0x0EDB, 0x8486, 0x2539, 0x848D, 0x2535, 0x848E, 0x255B,\n    0x848F, 0x2534, 0x8490, 0x108E, 0x8491, 0x27CD, 0x8494, 0x27BC,\n    0x8497, 0x27A6, 0x8498, 0x27C4, 0x8499, 0x1086, 0x849A, 0x27B5,\n    0x849B, 0x27BF, 0x849C, 0x1089, 0x849D, 0x27B8, 0x849E, 0x1087,\n    0x849F, 0x27A9, 0x84A0, 0x27C7, 0x84A1, 0x27A8, 0x84A2, 0x27BB,\n    0x84A4, 0x27A7, 0x84A7, 0x27B9, 0x84A8, 0x27C2, 0x84A9, 0x27C0,\n    0x84AA, 0x27B4, 0x84AB, 0x27AF, 0x84AC, 0x27AD, 0x84AE, 0x27AE,\n    0x84AF, 0x27C1, 0x84B0, 0x27CC, 0x84B1, 0x27B6, 0x84B2, 0x1088,\n    0x84B4, 0x27B1, 0x84B6, 0x27C5, 0x84B8, 0x108B, 0x84B9, 0x27B0,\n    0x84BA, 0x27AA, 0x84BB, 0x27BA, 0x84BC, 0x108F, 0x84BF, 0x1083,\n    0x84C0, 0x108C, 0x84C1, 0x27B2, 0x84C2, 0x27AC, 0x84C4, 0x1085,\n    0x84C5, 0x255A, 0x84C6, 0x1084, 0x84C7, 0x27BD, 0x84C9, 0x1082,\n    0x84CA, 0x1091, 0x84CB, 0x108A, 0x84CC, 0x27BE, 0x84CD, 0x27B3,\n    0x84CE, 0x27AB, 0x84CF, 0x27C6, 0x84D0, 0x27B7, 0x84D1, 0x1090,\n    0x84D2, 0x27CA, 0x84D3, 0x108D, 0x84D4, 0x27C9, 0x84D6, 0x27C3,\n    0x84D7, 0x27C8, 0x84DB, 0x27CB, 0x84E7, 0x2A03, 0x84E8, 0x2A04,\n    0x84E9, 0x29F7, 0x84EA, 0x29F6, 0x84EB, 0x29F2, 0x84EC, 0x11FB,\n    0x84EE, 0x11F3, 0x84EF, 0x2A06, 0x84F0, 0x2A05, 0x84F1, 0x252F,\n    0x84F2, 0x29EF, 0x84F3, 0x29F3, 0x84F4, 0x29ED, 0x84F6, 0x2A00,\n    0x84F7, 0x29F1, 0x84F9, 0x2A07, 0x84FA, 0x29EA, 0x84FB, 0x29E8,\n    0x84FC, 0x29F4, 0x84FD, 0x29FE, 0x84FE, 0x29F9, 0x84FF, 0x11FD,\n    0x8500, 0x29DF, 0x8502, 0x29FD, 0x8506, 0x11FE, 0x8507, 0x2543,\n    0x8508, 0x29EB, 0x8509, 0x29E2, 0x850A, 0x29E5, 0x850B, 0x2A0B,\n    0x850C, 0x29EC, 0x850D, 0x29E3, 0x850E, 0x29E1, 0x850F, 0x29DE,\n    0x8511, 0x11F7, 0x8512, 0x29F5, 0x8513, 0x11F6, 0x8514, 0x11FA,\n    0x8515, 0x29F0, 0x8516, 0x29F8, 0x8517, 0x11F0, 0x8518, 0x2A08,\n    0x8519, 0x2A0C, 0x851A, 0x11F2, 0x851C, 0x29E7, 0x851D, 0x29FB,\n    0x851E, 0x29FF, 0x851F, 0x29E4, 0x8520, 0x2A09, 0x8521, 0x11F9,\n    0x8523, 0x11F8, 0x8524, 0x29DC, 0x8525, 0x11FC, 0x8526, 0x2A02,\n    0x8527, 0x29E6, 0x8528, 0x29FA, 0x8529, 0x29E0, 0x852A, 0x29EE,\n    0x852B, 0x29E9, 0x852C, 0x11F4, 0x852D, 0x11F5, 0x852E, 0x29FC,\n    0x852F, 0x2A0D, 0x8530, 0x2A0A, 0x8531, 0x2A01, 0x853B, 0x29DD,\n    0x853D, 0x11F1, 0x853E, 0x2C4F, 0x8540, 0x2C46, 0x8541, 0x2C49,\n    0x8543, 0x133B, 0x8544, 0x2C4B, 0x8545, 0x2C40, 0x8546, 0x2C47,\n    0x8547, 0x2C4D, 0x8548, 0x1338, 0x8549, 0x133C, 0x854A, 0x1336,\n    0x854D, 0x2C42, 0x854E, 0x2C52, 0x8551, 0x2C4C, 0x8553, 0x2C43,\n    0x8554, 0x2C5B, 0x8555, 0x2C55, 0x8556, 0x2C3F, 0x8557, 0x2E23,\n    0x8558, 0x2C45, 0x8559, 0x1337, 0x855B, 0x2C50, 0x855D, 0x2C5A,\n    0x855E, 0x133F, 0x8560, 0x2C57, 0x8561, 0x2C44, 0x8562, 0x2C4A,\n    0x8563, 0x2C4E, 0x8564, 0x2C48, 0x8565, 0x2C5C, 0x8566, 0x2C59,\n    0x8567, 0x2C56, 0x8568, 0x1339, 0x8569, 0x133A, 0x856A, 0x133E,\n    0x856B, 0x2C41, 0x856C, 0x2C5D, 0x856D, 0x133D, 0x856E, 0x2C53,\n    0x8571, 0x2C51, 0x8575, 0x2C54, 0x8576, 0x2E30, 0x8577, 0x2E1D,\n    0x8578, 0x2E22, 0x8579, 0x2E2F, 0x857A, 0x2E21, 0x857B, 0x2E19,\n    0x857C, 0x2E1E, 0x857E, 0x145C, 0x8580, 0x2E12, 0x8581, 0x2E2A,\n    0x8582, 0x2E2C, 0x8583, 0x2E11, 0x8584, 0x145B, 0x8585, 0x2E2E,\n    0x8586, 0x2E26, 0x8587, 0x1462, 0x8588, 0x2E2D, 0x8589, 0x2E1F,\n    0x858A, 0x1464, 0x858B, 0x2E17, 0x858C, 0x2C58, 0x858D, 0x2E27,\n    0x858E, 0x2E24, 0x858F, 0x2E13, 0x8590, 0x2E32, 0x8591, 0x145E,\n    0x8594, 0x145F, 0x8595, 0x2E15, 0x8596, 0x2E25, 0x8598, 0x2E31,\n    0x8599, 0x2E28, 0x859A, 0x2E1B, 0x859B, 0x1461, 0x859C, 0x145D,\n    0x859D, 0x2E29, 0x859E, 0x2E1C, 0x859F, 0x2E33, 0x85A0, 0x2E16,\n    0x85A1, 0x2E20, 0x85A2, 0x2E2B, 0x85A3, 0x2E18, 0x85A4, 0x2E1A,\n    0x85A6, 0x1465, 0x85A7, 0x2E14, 0x85A8, 0x1463, 0x85A9, 0x151C,\n    0x85AA, 0x145A, 0x85AF, 0x1460, 0x85B0, 0x1520, 0x85B1, 0x2FA6,\n    0x85B3, 0x2F9C, 0x85B4, 0x2F97, 0x85B5, 0x2F9D, 0x85B6, 0x2FA7,\n    0x85B7, 0x2FAB, 0x85B8, 0x2FAA, 0x85B9, 0x1522, 0x85BA, 0x1521,\n    0x85BD, 0x2F9E, 0x85BE, 0x2FAC, 0x85BF, 0x2FA1, 0x85C0, 0x2F99,\n    0x85C2, 0x2F9B, 0x85C3, 0x2F9A, 0x85C4, 0x2FA0, 0x85C5, 0x2FA5,\n    0x85C6, 0x2F98, 0x85C7, 0x2F9F, 0x85C8, 0x2FA4, 0x85C9, 0x151F,\n    0x85CB, 0x2FA2, 0x85CD, 0x151D, 0x85CE, 0x2FA3, 0x85CF, 0x151B,\n    0x85D0, 0x151E, 0x85D1, 0x3101, 0x85D2, 0x2FA8, 0x85D5, 0x15B7,\n    0x85D7, 0x30F9, 0x85D8, 0x30FD, 0x85D9, 0x30F5, 0x85DA, 0x30F8,\n    0x85DC, 0x3100, 0x85DD, 0x15B5, 0x85DE, 0x3105, 0x85DF, 0x30FE,\n    0x85E1, 0x30F6, 0x85E2, 0x3106, 0x85E3, 0x30FF, 0x85E4, 0x15B8,\n    0x85E5, 0x15B9, 0x85E6, 0x3103, 0x85E8, 0x30F7, 0x85E9, 0x15B4,\n    0x85EA, 0x15B6, 0x85EB, 0x30F2, 0x85EC, 0x30FA, 0x85ED, 0x30F4,\n    0x85EF, 0x3104, 0x85F0, 0x3102, 0x85F1, 0x30F3, 0x85F2, 0x30FB,\n    0x85F6, 0x3225, 0x85F7, 0x15BA, 0x85F8, 0x30FC, 0x85F9, 0x1638,\n    0x85FA, 0x163A, 0x85FB, 0x1637, 0x85FD, 0x322A, 0x85FE, 0x3222,\n    0x85FF, 0x3220, 0x8600, 0x3224, 0x8601, 0x3221, 0x8604, 0x3226,\n    0x8605, 0x3228, 0x8606, 0x163B, 0x8607, 0x163D, 0x8609, 0x3227,\n    0x860A, 0x163E, 0x860B, 0x163C, 0x860C, 0x3229, 0x8611, 0x1639,\n    0x8617, 0x1685, 0x8618, 0x32F6, 0x8619, 0x32FC, 0x861A, 0x1687,\n    0x861B, 0x3223, 0x861C, 0x32FB, 0x861E, 0x3302, 0x861F, 0x32F9,\n    0x8620, 0x3300, 0x8621, 0x32FF, 0x8622, 0x321F, 0x8623, 0x32FA,\n    0x8624, 0x2FA9, 0x8625, 0x3303, 0x8626, 0x32F8, 0x8627, 0x32FD,\n    0x8629, 0x3301, 0x862A, 0x32F7, 0x862C, 0x33AA, 0x862D, 0x1686,\n    0x862E, 0x32FE, 0x8631, 0x3432, 0x8632, 0x33AB, 0x8633, 0x33A9,\n    0x8634, 0x33A7, 0x8635, 0x33A8, 0x8636, 0x33AC, 0x8638, 0x1707,\n    0x8639, 0x3430, 0x863A, 0x342E, 0x863B, 0x3433, 0x863C, 0x3431,\n    0x863E, 0x3434, 0x863F, 0x1708, 0x8640, 0x342F, 0x8643, 0x3497,\n    0x8646, 0x34DF, 0x8647, 0x34E0, 0x8648, 0x34E1, 0x864B, 0x353E,\n    0x864C, 0x3536, 0x864D, 0x1818, 0x864E, 0x0689, 0x8650, 0x07FF,\n    0x8652, 0x1DE3, 0x8653, 0x1DE2, 0x8654, 0x09AF, 0x8655, 0x0B88,\n    0x8656, 0x203C, 0x8659, 0x203B, 0x865B, 0x0D48, 0x865C, 0x0EED,\n    0x865E, 0x0EEC, 0x865F, 0x0EEE, 0x8661, 0x27CE, 0x8662, 0x2A0E,\n    0x8663, 0x2C5E, 0x8664, 0x2C60, 0x8665, 0x2C5F, 0x8667, 0x1466,\n    0x8668, 0x2E34, 0x8669, 0x2FAD, 0x866A, 0x351E, 0x866B, 0x040F,\n    0x866D, 0x1A46, 0x866E, 0x1A47, 0x866F, 0x1A45, 0x8670, 0x1A44,\n    0x8671, 0x068A, 0x8673, 0x1BFD, 0x8674, 0x1BFB, 0x8677, 0x1BFA,\n    0x8679, 0x0800, 0x867A, 0x0802, 0x867B, 0x0801, 0x867C, 0x1BFC,\n    0x8685, 0x1DEF, 0x8686, 0x1DEC, 0x8687, 0x1DEA, 0x868A, 0x09B0,\n    0x868B, 0x1DED, 0x868C, 0x09B5, 0x868D, 0x1DE7, 0x868E, 0x1DF6,\n    0x8690, 0x1DF8, 0x8691, 0x1DE8, 0x8693, 0x09B2, 0x8694, 0x1DF9,\n    0x8695, 0x1DF4, 0x8696, 0x1DE6, 0x8697, 0x1DEB, 0x8698, 0x1DF5,\n    0x8699, 0x1DF1, 0x869A, 0x1DEE, 0x869C, 0x09B7, 0x869D, 0x1DF7,\n    0x869E, 0x1DE9, 0x86A1, 0x1DF2, 0x86A2, 0x1DE4, 0x86A3, 0x09B6,\n    0x86A4, 0x09B3, 0x86A5, 0x1DF0, 0x86A7, 0x1DF3, 0x86A8, 0x1DE5,\n    0x86A9, 0x09B4, 0x86AA, 0x09B1, 0x86AF, 0x0B92, 0x86B0, 0x2043,\n    0x86B1, 0x0B91, 0x86B3, 0x2046, 0x86B4, 0x2049, 0x86B5, 0x0B8E,\n    0x86B6, 0x0B8C, 0x86B7, 0x203E, 0x86B8, 0x2047, 0x86B9, 0x2045,\n    0x86BA, 0x2042, 0x86BB, 0x204A, 0x86BC, 0x204B, 0x86BD, 0x204D,\n    0x86BE, 0x204E, 0x86BF, 0x203D, 0x86C0, 0x0B8B, 0x86C1, 0x2040,\n    0x86C2, 0x203F, 0x86C3, 0x204C, 0x86C4, 0x0B8D, 0x86C5, 0x2041,\n    0x86C6, 0x0B8F, 0x86C7, 0x0B8A, 0x86C8, 0x2044, 0x86C9, 0x0B93,\n    0x86CB, 0x0B90, 0x86CC, 0x2048, 0x86D0, 0x0D4F, 0x86D1, 0x22D2,\n    0x86D3, 0x22C7, 0x86D4, 0x0D4C, 0x86D6, 0x256D, 0x86D7, 0x22D0,\n    0x86D8, 0x22C4, 0x86D9, 0x0D4A, 0x86DA, 0x22C9, 0x86DB, 0x0D4D,\n    0x86DC, 0x22CD, 0x86DD, 0x22CB, 0x86DE, 0x0D50, 0x86DF, 0x0D49,\n    0x86E2, 0x22C5, 0x86E3, 0x22C8, 0x86E4, 0x0D4E, 0x86E6, 0x22C6,\n    0x86E8, 0x22D1, 0x86E9, 0x22CF, 0x86EA, 0x22CA, 0x86EB, 0x22CC,\n    0x86EC, 0x22CE, 0x86ED, 0x0D4B, 0x86F5, 0x256E, 0x86F6, 0x2574,\n    0x86F7, 0x256A, 0x86F8, 0x2570, 0x86F9, 0x0EEF, 0x86FA, 0x256C,\n    0x86FB, 0x0EF5, 0x86FE, 0x0EF4, 0x8700, 0x0EF3, 0x8701, 0x2573,\n    0x8702, 0x0EF6, 0x8703, 0x0EF7, 0x8704, 0x2569, 0x8705, 0x2576,\n    0x8706, 0x0EF8, 0x8707, 0x0EF2, 0x8708, 0x0EF1, 0x8709, 0x2572,\n    0x870A, 0x0EF9, 0x870B, 0x2568, 0x870C, 0x256B, 0x870D, 0x2575,\n    0x870E, 0x2571, 0x8711, 0x27EE, 0x8712, 0x27E3, 0x8713, 0x0EF0,\n    0x8718, 0x1098, 0x8719, 0x27D7, 0x871A, 0x27EC, 0x871B, 0x27D8,\n    0x871C, 0x1093, 0x871E, 0x27D5, 0x8720, 0x27DE, 0x8721, 0x27D6,\n    0x8722, 0x1095, 0x8723, 0x27D0, 0x8724, 0x27EB, 0x8725, 0x1096,\n    0x8726, 0x27E8, 0x8727, 0x27E9, 0x8728, 0x27D1, 0x8729, 0x109B,\n    0x872A, 0x27E0, 0x872C, 0x27DA, 0x872D, 0x27E1, 0x872E, 0x27D4,\n    0x8730, 0x27ED, 0x8731, 0x27E5, 0x8732, 0x27DF, 0x8733, 0x27CF,\n    0x8734, 0x1097, 0x8735, 0x27E6, 0x8737, 0x109A, 0x8738, 0x27EA,\n    0x873A, 0x27E4, 0x873B, 0x1094, 0x873C, 0x27E2, 0x873E, 0x27DC,\n    0x873F, 0x1092, 0x8740, 0x27D3, 0x8741, 0x27DB, 0x8742, 0x27E7,\n    0x8743, 0x27D9, 0x8746, 0x27DD, 0x874C, 0x1208, 0x874D, 0x256F,\n    0x874E, 0x2A20, 0x874F, 0x2A29, 0x8750, 0x2A1F, 0x8751, 0x2A1B,\n    0x8752, 0x2A18, 0x8753, 0x1209, 0x8754, 0x2A16, 0x8755, 0x1099,\n    0x8756, 0x2A0F, 0x8757, 0x1207, 0x8758, 0x2A15, 0x8759, 0x1206,\n    0x875A, 0x2A1A, 0x875B, 0x2A17, 0x875C, 0x2A27, 0x875D, 0x2A22,\n    0x875E, 0x2A1C, 0x875F, 0x2A21, 0x8760, 0x1202, 0x8761, 0x2A19,\n    0x8762, 0x2A2C, 0x8763, 0x2A10, 0x8764, 0x2A11, 0x8765, 0x2A28,\n    0x8766, 0x1203, 0x8767, 0x2A2D, 0x8768, 0x1205, 0x8769, 0x2A2E,\n    0x876A, 0x2A1E, 0x876B, 0x27D2, 0x876C, 0x2A24, 0x876D, 0x2A1D,\n    0x876E, 0x2A26, 0x876F, 0x2A23, 0x8773, 0x2A14, 0x8774, 0x1200,\n    0x8775, 0x2A2B, 0x8776, 0x1201, 0x8777, 0x2A12, 0x8778, 0x1204,\n    0x8779, 0x2C6B, 0x877A, 0x2A25, 0x877B, 0x2A2A, 0x8781, 0x2C68,\n    0x8782, 0x11FF, 0x8783, 0x1340, 0x8784, 0x2C72, 0x8785, 0x2C6E,\n    0x8787, 0x2C6C, 0x8788, 0x2C67, 0x8789, 0x2C76, 0x878D, 0x1344,\n    0x878F, 0x2C63, 0x8790, 0x2C6F, 0x8791, 0x2C70, 0x8792, 0x2C66,\n    0x8793, 0x2C65, 0x8794, 0x2C73, 0x8796, 0x2C69, 0x8797, 0x2C64,\n    0x8798, 0x2C6A, 0x879A, 0x2C75, 0x879B, 0x2C62, 0x879C, 0x2C74,\n    0x879D, 0x2C71, 0x879E, 0x1342, 0x879F, 0x1341, 0x87A2, 0x1343,\n    0x87A3, 0x2C6D, 0x87A4, 0x2C61, 0x87AA, 0x2E36, 0x87AB, 0x146C,\n    0x87AC, 0x2E3A, 0x87AD, 0x2E37, 0x87AE, 0x2E3E, 0x87AF, 0x2E44,\n    0x87B0, 0x2E39, 0x87B2, 0x2E4D, 0x87B3, 0x1469, 0x87B4, 0x2E47,\n    0x87B5, 0x2E3C, 0x87B6, 0x2E48, 0x87B7, 0x2E43, 0x87B8, 0x2E4A,\n    0x87B9, 0x2E3B, 0x87BA, 0x146E, 0x87BB, 0x146D, 0x87BC, 0x2E3D,\n    0x87BD, 0x2E4B, 0x87BE, 0x2E35, 0x87BF, 0x2E49, 0x87C0, 0x1467,\n    0x87C2, 0x2E41, 0x87C3, 0x2E40, 0x87C4, 0x2E45, 0x87C5, 0x2E38,\n    0x87C6, 0x146B, 0x87C8, 0x146F, 0x87C9, 0x2E3F, 0x87CA, 0x2E46,\n    0x87CB, 0x1470, 0x87CC, 0x2E42, 0x87D1, 0x1468, 0x87D2, 0x146A,\n    0x87D3, 0x2FBA, 0x87D4, 0x2FB8, 0x87D7, 0x2FBE, 0x87D8, 0x2FBC,\n    0x87D9, 0x2FBF, 0x87DB, 0x2FB1, 0x87DC, 0x2FB9, 0x87DD, 0x2FC3,\n    0x87DE, 0x2E4C, 0x87DF, 0x2FB5, 0x87E0, 0x1526, 0x87E1, 0x2A13,\n    0x87E2, 0x2FB0, 0x87E3, 0x2FBD, 0x87E4, 0x2FB7, 0x87E5, 0x2FB4,\n    0x87E6, 0x2FAF, 0x87E7, 0x2FAE, 0x87E8, 0x2FC2, 0x87EA, 0x2FB3,\n    0x87EB, 0x2FB2, 0x87EC, 0x1524, 0x87ED, 0x2FBB, 0x87EF, 0x1523,\n    0x87F2, 0x1525, 0x87F3, 0x2FB6, 0x87F4, 0x2FC1, 0x87F6, 0x310A,\n    0x87F7, 0x310B, 0x87F9, 0x15BE, 0x87FA, 0x3108, 0x87FB, 0x15BB,\n    0x87FC, 0x3110, 0x87FE, 0x15BF, 0x87FF, 0x3112, 0x8800, 0x3107,\n    0x8801, 0x2FC0, 0x8802, 0x3114, 0x8803, 0x3109, 0x8805, 0x15BC,\n    0x8806, 0x310F, 0x8808, 0x3111, 0x8809, 0x310C, 0x880A, 0x3113,\n    0x880B, 0x310E, 0x880C, 0x310D, 0x880D, 0x15BD, 0x8810, 0x322C,\n    0x8811, 0x322D, 0x8813, 0x322F, 0x8814, 0x163F, 0x8815, 0x1640,\n    0x8816, 0x3230, 0x8817, 0x322E, 0x8819, 0x322B, 0x881B, 0x3306,\n    0x881C, 0x3309, 0x881D, 0x3305, 0x881F, 0x168B, 0x8820, 0x3307,\n    0x8821, 0x168A, 0x8822, 0x1689, 0x8823, 0x1688, 0x8824, 0x3308,\n    0x8825, 0x33B1, 0x8826, 0x33AF, 0x8828, 0x33AE, 0x8829, 0x3304,\n    0x882A, 0x33B0, 0x882B, 0x330A, 0x882C, 0x33AD, 0x882E, 0x3437,\n    0x882F, 0x3415, 0x8830, 0x3435, 0x8831, 0x1709, 0x8832, 0x3436,\n    0x8833, 0x3438, 0x8835, 0x349A, 0x8836, 0x1728, 0x8837, 0x3499,\n    0x8838, 0x3498, 0x8839, 0x1729, 0x883B, 0x1747, 0x883C, 0x3508,\n    0x883D, 0x3520, 0x883E, 0x351F, 0x883F, 0x3521, 0x8840, 0x0410,\n    0x8841, 0x1BFE, 0x8843, 0x1DFA, 0x8844, 0x1DFB, 0x8848, 0x22D3,\n    0x884A, 0x330B, 0x884B, 0x349B, 0x884C, 0x0411, 0x884D, 0x0803,\n    0x884E, 0x1BFF, 0x8852, 0x204F, 0x8853, 0x0B94, 0x8855, 0x22D5,\n    0x8856, 0x22D4, 0x8857, 0x0D51, 0x8859, 0x0EFA, 0x885A, 0x2A2F,\n    0x885B, 0x120A, 0x885D, 0x120B, 0x8861, 0x1345, 0x8862, 0x172A,\n    0x8863, 0x0412, 0x8867, 0x1C00, 0x8868, 0x068C, 0x8869, 0x1C02,\n    0x886A, 0x1C01, 0x886B, 0x0804, 0x886D, 0x1DFC, 0x886F, 0x1E03,\n    0x8870, 0x09B8, 0x8871, 0x1E01, 0x8872, 0x1DFF, 0x8874, 0x1E06,\n    0x8875, 0x1DFD, 0x8876, 0x1DFE, 0x8877, 0x09B9, 0x8879, 0x09BD,\n    0x887C, 0x1E07, 0x887D, 0x09BC, 0x887E, 0x1E05, 0x887F, 0x1E02,\n    0x8880, 0x1E00, 0x8881, 0x09BA, 0x8882, 0x09BB, 0x8883, 0x1E04,\n    0x8888, 0x0B96, 0x8889, 0x2050, 0x888B, 0x0B9B, 0x888C, 0x2060,\n    0x888D, 0x0B9A, 0x888E, 0x2062, 0x8891, 0x2056, 0x8892, 0x0B98,\n    0x8893, 0x2061, 0x8895, 0x2051, 0x8896, 0x0B99, 0x8897, 0x205D,\n    0x8898, 0x2059, 0x8899, 0x205B, 0x889A, 0x2055, 0x889B, 0x205C,\n    0x889E, 0x0B95, 0x889F, 0x2058, 0x88A1, 0x2057, 0x88A2, 0x2053,\n    0x88A4, 0x205E, 0x88A7, 0x205A, 0x88A8, 0x2052, 0x88AA, 0x2054,\n    0x88AB, 0x0B97, 0x88AC, 0x205F, 0x88B1, 0x0D54, 0x88B2, 0x22E0,\n    0x88B6, 0x22DC, 0x88B7, 0x22DE, 0x88B8, 0x22D9, 0x88B9, 0x22D8,\n    0x88BA, 0x22D6, 0x88BC, 0x22DD, 0x88BD, 0x22DF, 0x88BE, 0x22DB,\n    0x88C0, 0x22DA, 0x88C1, 0x0D52, 0x88C2, 0x0D53, 0x88C9, 0x22E2,\n    0x88CA, 0x0F02, 0x88CB, 0x2578, 0x88CC, 0x257E, 0x88CD, 0x2579,\n    0x88CE, 0x257A, 0x88CF, 0x36EA, 0x88D0, 0x257F, 0x88D2, 0x0F04,\n    0x88D4, 0x0EFC, 0x88D5, 0x0F03, 0x88D6, 0x2577, 0x88D7, 0x22D7,\n    0x88D8, 0x0EFF, 0x88D9, 0x0EFD, 0x88DA, 0x257D, 0x88DB, 0x257C,\n    0x88DC, 0x0EFE, 0x88DD, 0x0F00, 0x88DE, 0x257B, 0x88DF, 0x0EFB,\n    0x88E1, 0x0F01, 0x88E7, 0x27F0, 0x88E8, 0x10A2, 0x88EB, 0x27FB,\n    0x88EC, 0x27FA, 0x88EE, 0x27F5, 0x88EF, 0x10A4, 0x88F0, 0x27F9,\n    0x88F1, 0x27F1, 0x88F2, 0x27F2, 0x88F3, 0x109C, 0x88F4, 0x109E,\n    0x88F6, 0x27F7, 0x88F7, 0x27EF, 0x88F8, 0x10A0, 0x88F9, 0x109F,\n    0x88FA, 0x27F3, 0x88FB, 0x27F8, 0x88FC, 0x27F6, 0x88FD, 0x10A1,\n    0x88FE, 0x27F4, 0x8901, 0x22E1, 0x8902, 0x109D, 0x8905, 0x2A30,\n    0x8906, 0x2A37, 0x8907, 0x120D, 0x8909, 0x2A3B, 0x890A, 0x1211,\n    0x890B, 0x2A33, 0x890C, 0x2A31, 0x890E, 0x2A3A, 0x8910, 0x120C,\n    0x8911, 0x2A39, 0x8912, 0x120E, 0x8913, 0x120F, 0x8914, 0x2A32,\n    0x8915, 0x1210, 0x8916, 0x2A38, 0x8917, 0x2A34, 0x8918, 0x2A35,\n    0x8919, 0x2A36, 0x891A, 0x10A3, 0x891E, 0x2C77, 0x891F, 0x2C83,\n    0x8921, 0x134A, 0x8922, 0x2C7E, 0x8923, 0x2C80, 0x8925, 0x1348,\n    0x8926, 0x2C78, 0x8927, 0x2C7C, 0x8929, 0x2C7F, 0x892A, 0x1346,\n    0x892B, 0x1349, 0x892C, 0x2C82, 0x892D, 0x2C7A, 0x892E, 0x2C7B,\n    0x892F, 0x2C81, 0x8930, 0x2C79, 0x8931, 0x2C7D, 0x8932, 0x1347,\n    0x8933, 0x2E4F, 0x8935, 0x2E4E, 0x8936, 0x1472, 0x8937, 0x2E54,\n    0x8938, 0x1474, 0x893B, 0x1471, 0x893C, 0x2E50, 0x893D, 0x1475,\n    0x893E, 0x2E51, 0x8941, 0x2E52, 0x8942, 0x2E55, 0x8944, 0x1473,\n    0x8946, 0x2FC8, 0x8949, 0x2FCB, 0x894B, 0x2FC5, 0x894C, 0x2FC7,\n    0x894F, 0x2FC6, 0x8950, 0x2FC9, 0x8951, 0x2FCA, 0x8952, 0x2E53,\n    0x8953, 0x2FC4, 0x8956, 0x15C2, 0x8957, 0x3118, 0x8958, 0x311B,\n    0x8959, 0x311D, 0x895A, 0x3116, 0x895B, 0x3117, 0x895C, 0x311A,\n    0x895D, 0x311C, 0x895E, 0x15C3, 0x895F, 0x15C1, 0x8960, 0x15C0,\n    0x8961, 0x3119, 0x8962, 0x3115, 0x8963, 0x3231, 0x8964, 0x1641,\n    0x8966, 0x3232, 0x8969, 0x330D, 0x896A, 0x168C, 0x896B, 0x330F,\n    0x896C, 0x168D, 0x896D, 0x330C, 0x896E, 0x330E, 0x896F, 0x16D6,\n    0x8971, 0x33B2, 0x8972, 0x16D5, 0x8973, 0x343B, 0x8974, 0x343A,\n    0x8976, 0x3439, 0x8979, 0x34E2, 0x897A, 0x34E3, 0x897B, 0x34E5,\n    0x897C, 0x34E4, 0x897E, 0x1819, 0x897F, 0x0413, 0x8981, 0x0805,\n    0x8982, 0x2063, 0x8983, 0x0D55, 0x8985, 0x2580, 0x8986, 0x1527,\n    0x8988, 0x311E, 0x898B, 0x0508, 0x898F, 0x0B9D, 0x8993, 0x0B9C,\n    0x8995, 0x22E3, 0x8996, 0x0D56, 0x8997, 0x22E5, 0x8998, 0x22E4,\n    0x899B, 0x2581, 0x899C, 0x0F05, 0x899D, 0x27FC, 0x899E, 0x27FF,\n    0x899F, 0x27FE, 0x89A1, 0x27FD, 0x89A2, 0x2A3C, 0x89A3, 0x2A3E,\n    0x89A4, 0x2A3D, 0x89A6, 0x134C, 0x89AA, 0x134B, 0x89AC, 0x1476,\n    0x89AD, 0x2E56, 0x89AE, 0x2E58, 0x89AF, 0x2E57, 0x89B2, 0x1528,\n    0x89B6, 0x3120, 0x89B7, 0x311F, 0x89B9, 0x3233, 0x89BA, 0x1642,\n    0x89BD, 0x168E, 0x89BE, 0x33B4, 0x89BF, 0x33B3, 0x89C0, 0x1748,\n    0x89D2, 0x0509, 0x89D3, 0x1C03, 0x89D4, 0x0806, 0x89D5, 0x2066,\n    0x89D6, 0x2064, 0x89D9, 0x2065, 0x89DA, 0x22E7, 0x89DB, 0x22E8,\n    0x89DC, 0x2588, 0x89DD, 0x22E6, 0x89DF, 0x2582, 0x89E0, 0x2586,\n    0x89E1, 0x2585, 0x89E2, 0x2587, 0x89E3, 0x0F06, 0x89E4, 0x2584,\n    0x89E5, 0x2583, 0x89E6, 0x2589, 0x89E8, 0x2802, 0x89E9, 0x2800,\n    0x89EB, 0x2801, 0x89EC, 0x2A41, 0x89ED, 0x2A3F, 0x89F0, 0x2A40,\n    0x89F1, 0x2C84, 0x89F2, 0x2E59, 0x89F3, 0x2E5A, 0x89F4, 0x1529,\n    0x89F6, 0x3121, 0x89F7, 0x3234, 0x89F8, 0x1643, 0x89FA, 0x3310,\n    0x89FB, 0x33B5, 0x89FC, 0x16D7, 0x89FE, 0x343C, 0x89FF, 0x34E6,\n    0x8A00, 0x050A, 0x8A02, 0x0808, 0x8A03, 0x0809, 0x8A04, 0x1C04,\n    0x8A07, 0x1C05, 0x8A08, 0x0807, 0x8A0A, 0x09C3, 0x8A0C, 0x09C1,\n    0x8A0E, 0x09C0, 0x8A0F, 0x09C7, 0x8A10, 0x09BF, 0x8A11, 0x09C8,\n    0x8A12, 0x1E08, 0x8A13, 0x09C5, 0x8A15, 0x09C2, 0x8A16, 0x09C6,\n    0x8A17, 0x09C4, 0x8A18, 0x09BE, 0x8A1B, 0x0BA5, 0x8A1D, 0x0B9F,\n    0x8A1E, 0x206A, 0x8A1F, 0x0BA4, 0x8A22, 0x0BA6, 0x8A23, 0x0BA0,\n    0x8A25, 0x0BA1, 0x8A27, 0x2068, 0x8A2A, 0x0B9E, 0x8A2C, 0x2069,\n    0x8A2D, 0x0BA3, 0x8A30, 0x2067, 0x8A31, 0x0BA2, 0x8A34, 0x0D61,\n    0x8A36, 0x0D63, 0x8A39, 0x22EB, 0x8A3A, 0x0D62, 0x8A3B, 0x0D57,\n    0x8A3C, 0x0D5B, 0x8A3E, 0x0F19, 0x8A3F, 0x258E, 0x8A40, 0x22ED,\n    0x8A41, 0x0D5C, 0x8A44, 0x22F0, 0x8A45, 0x22F1, 0x8A46, 0x0D60,\n    0x8A48, 0x22F3, 0x8A4A, 0x22F5, 0x8A4C, 0x22F6, 0x8A4D, 0x22EA,\n    0x8A4E, 0x22E9, 0x8A4F, 0x22F7, 0x8A50, 0x0D5F, 0x8A51, 0x22F4,\n    0x8A52, 0x22F2, 0x8A54, 0x0D5D, 0x8A55, 0x0D59, 0x8A56, 0x0D64,\n    0x8A57, 0x22EE, 0x8A58, 0x22EF, 0x8A59, 0x22EC, 0x8A5B, 0x0D5E,\n    0x8A5E, 0x0D5A, 0x8A60, 0x0D58, 0x8A61, 0x258D, 0x8A62, 0x0F14,\n    0x8A63, 0x0F0F, 0x8A66, 0x0F0A, 0x8A68, 0x0F1A, 0x8A69, 0x0F0B,\n    0x8A6B, 0x0F07, 0x8A6C, 0x0F16, 0x8A6D, 0x0F13, 0x8A6E, 0x0F15,\n    0x8A70, 0x0F0C, 0x8A71, 0x0F11, 0x8A72, 0x0F08, 0x8A73, 0x0F09,\n    0x8A74, 0x2595, 0x8A75, 0x2592, 0x8A76, 0x258A, 0x8A77, 0x258F,\n    0x8A79, 0x0F17, 0x8A7A, 0x2596, 0x8A7B, 0x0F18, 0x8A7C, 0x0F0E,\n    0x8A7F, 0x258C, 0x8A81, 0x2594, 0x8A82, 0x2590, 0x8A83, 0x2593,\n    0x8A84, 0x2591, 0x8A85, 0x0F12, 0x8A86, 0x258B, 0x8A87, 0x0F0D,\n    0x8A8B, 0x2805, 0x8A8C, 0x10A6, 0x8A8D, 0x10A9, 0x8A8F, 0x2807,\n    0x8A91, 0x10B1, 0x8A92, 0x2806, 0x8A93, 0x10AB, 0x8A95, 0x1216,\n    0x8A96, 0x2808, 0x8A98, 0x10B0, 0x8A99, 0x2804, 0x8A9A, 0x10B2,\n    0x8A9E, 0x10A7, 0x8AA0, 0x0F10, 0x8AA1, 0x10AA, 0x8AA3, 0x10A8,\n    0x8AA4, 0x10AC, 0x8AA5, 0x10AE, 0x8AA6, 0x10A5, 0x8AA7, 0x10B3,\n    0x8AA8, 0x10AF, 0x8AAA, 0x10AD, 0x8AAB, 0x2803, 0x8AB0, 0x121D,\n    0x8AB2, 0x1219, 0x8AB6, 0x1220, 0x8AB8, 0x2A44, 0x8AB9, 0x1221,\n    0x8ABA, 0x2A50, 0x8ABB, 0x2A49, 0x8ABC, 0x1212, 0x8ABD, 0x2A51,\n    0x8ABE, 0x2A4B, 0x8ABF, 0x121C, 0x8AC0, 0x2A4C, 0x8AC2, 0x121B,\n    0x8AC3, 0x2A4F, 0x8AC4, 0x1215, 0x8AC5, 0x2A4D, 0x8AC6, 0x2A43,\n    0x8AC7, 0x1214, 0x8AC8, 0x2C8F, 0x8AC9, 0x121A, 0x8ACB, 0x1217,\n    0x8ACD, 0x121F, 0x8ACF, 0x2A42, 0x8AD1, 0x2A46, 0x8AD2, 0x1213,\n    0x8AD3, 0x2A45, 0x8AD4, 0x2A47, 0x8AD5, 0x2A48, 0x8AD6, 0x121E,\n    0x8AD7, 0x2A4A, 0x8AD8, 0x2A4E, 0x8AD9, 0x2A52, 0x8ADB, 0x1222,\n    0x8ADC, 0x1352, 0x8ADD, 0x2C8A, 0x8ADE, 0x2C90, 0x8ADF, 0x2C8D,\n    0x8AE0, 0x2C85, 0x8AE1, 0x2C91, 0x8AE2, 0x2C86, 0x8AE4, 0x2C8C,\n    0x8AE6, 0x134D, 0x8AE7, 0x1353, 0x8AE8, 0x2C92, 0x8AEB, 0x134F,\n    0x8AED, 0x1359, 0x8AEE, 0x1354, 0x8AEF, 0x2C94, 0x8AF0, 0x2C8E,\n    0x8AF1, 0x1350, 0x8AF2, 0x2C87, 0x8AF3, 0x135A, 0x8AF4, 0x2C88,\n    0x8AF5, 0x2C89, 0x8AF6, 0x135B, 0x8AF7, 0x1358, 0x8AF8, 0x1218,\n    0x8AFA, 0x134E, 0x8AFB, 0x2C95, 0x8AFC, 0x135C, 0x8AFE, 0x1355,\n    0x8AFF, 0x2C93, 0x8B00, 0x1351, 0x8B01, 0x1356, 0x8B02, 0x1357,\n    0x8B04, 0x147E, 0x8B05, 0x2E5F, 0x8B06, 0x2E68, 0x8B07, 0x2E65,\n    0x8B08, 0x2E67, 0x8B0A, 0x147B, 0x8B0B, 0x2E60, 0x8B0D, 0x2E66,\n    0x8B0E, 0x1477, 0x8B0F, 0x2E62, 0x8B10, 0x147F, 0x8B11, 0x2E5E,\n    0x8B12, 0x2E63, 0x8B13, 0x2E6A, 0x8B14, 0x2C8B, 0x8B15, 0x2E64,\n    0x8B16, 0x2E5D, 0x8B17, 0x1478, 0x8B18, 0x2E5C, 0x8B19, 0x1479,\n    0x8B1A, 0x2E6B, 0x8B1B, 0x147A, 0x8B1C, 0x2E69, 0x8B1D, 0x147D,\n    0x8B1E, 0x2E5B, 0x8B20, 0x147C, 0x8B22, 0x2E61, 0x8B23, 0x2FCE,\n    0x8B24, 0x2FDC, 0x8B25, 0x2FD7, 0x8B26, 0x2FD9, 0x8B27, 0x2FCD,\n    0x8B28, 0x152A, 0x8B2A, 0x2FCC, 0x8B2B, 0x152D, 0x8B2C, 0x152C,\n    0x8B2E, 0x2FDB, 0x8B2F, 0x2FD3, 0x8B30, 0x2FD0, 0x8B31, 0x2FD6,\n    0x8B33, 0x2FCF, 0x8B35, 0x2FD1, 0x8B36, 0x2FDA, 0x8B37, 0x2FD8,\n    0x8B39, 0x152B, 0x8B3A, 0x2FDF, 0x8B3B, 0x2FDD, 0x8B3C, 0x2FD4,\n    0x8B3D, 0x2FDE, 0x8B3E, 0x2FD5, 0x8B40, 0x3125, 0x8B41, 0x15C4,\n    0x8B42, 0x312C, 0x8B45, 0x3313, 0x8B46, 0x15CB, 0x8B47, 0x2FD2,\n    0x8B48, 0x3123, 0x8B49, 0x15C7, 0x8B4A, 0x3124, 0x8B4B, 0x3129,\n    0x8B4E, 0x15C9, 0x8B4F, 0x15CA, 0x8B50, 0x3122, 0x8B51, 0x312B,\n    0x8B52, 0x312D, 0x8B53, 0x3126, 0x8B54, 0x3128, 0x8B55, 0x312A,\n    0x8B56, 0x3127, 0x8B57, 0x312E, 0x8B58, 0x15C6, 0x8B59, 0x15CC,\n    0x8B5A, 0x15C8, 0x8B5C, 0x15C5, 0x8B5D, 0x3237, 0x8B5F, 0x1648,\n    0x8B60, 0x3235, 0x8B63, 0x3239, 0x8B65, 0x323A, 0x8B66, 0x1646,\n    0x8B67, 0x323B, 0x8B68, 0x3238, 0x8B6A, 0x3236, 0x8B6B, 0x1649,\n    0x8B6C, 0x1645, 0x8B6D, 0x323C, 0x8B6F, 0x1647, 0x8B70, 0x1644,\n    0x8B74, 0x168F, 0x8B77, 0x1690, 0x8B78, 0x3312, 0x8B79, 0x3311,\n    0x8B7A, 0x3314, 0x8B7B, 0x3315, 0x8B7D, 0x1691, 0x8B7E, 0x33B6,\n    0x8B7F, 0x33BB, 0x8B80, 0x16D8, 0x8B82, 0x33B8, 0x8B84, 0x33B7,\n    0x8B85, 0x33BA, 0x8B86, 0x33B9, 0x8B88, 0x3440, 0x8B8A, 0x170A,\n    0x8B8B, 0x343F, 0x8B8C, 0x343D, 0x8B8E, 0x343E, 0x8B92, 0x172C,\n    0x8B93, 0x172B, 0x8B94, 0x349C, 0x8B95, 0x349D, 0x8B96, 0x172D,\n    0x8B98, 0x34E7, 0x8B99, 0x34E8, 0x8B9A, 0x1754, 0x8B9C, 0x175A,\n    0x8B9E, 0x3522, 0x8B9F, 0x353F, 0x8C37, 0x050B, 0x8C39, 0x206B,\n    0x8C3B, 0x206C, 0x8C3C, 0x2597, 0x8C3D, 0x2809, 0x8C3E, 0x2A53,\n    0x8C3F, 0x1481, 0x8C41, 0x1480, 0x8C42, 0x2FE0, 0x8C43, 0x312F,\n    0x8C45, 0x3441, 0x8C46, 0x050C, 0x8C47, 0x1E09, 0x8C48, 0x09C9,\n    0x8C49, 0x0BA7, 0x8C4A, 0x2599, 0x8C4B, 0x2598, 0x8C4C, 0x1223,\n    0x8C4D, 0x2A54, 0x8C4E, 0x1224, 0x8C4F, 0x2E6C, 0x8C50, 0x152E,\n    0x8C54, 0x1763, 0x8C55, 0x050D, 0x8C56, 0x1A48, 0x8C57, 0x1E0A,\n    0x8C5A, 0x0BA8, 0x8C5C, 0x206D, 0x8C5D, 0x206E, 0x8C5F, 0x22F8,\n    0x8C61, 0x0D65, 0x8C62, 0x0F1B, 0x8C64, 0x259B, 0x8C65, 0x259A,\n    0x8C66, 0x259C, 0x8C68, 0x280A, 0x8C69, 0x280B, 0x8C6A, 0x10B4,\n    0x8C6B, 0x135D, 0x8C6C, 0x1225, 0x8C6D, 0x135E, 0x8C6F, 0x2E70,\n    0x8C70, 0x2E6D, 0x8C71, 0x2E6F, 0x8C72, 0x2E6E, 0x8C73, 0x1482,\n    0x8C75, 0x2FE1, 0x8C76, 0x3131, 0x8C77, 0x3130, 0x8C78, 0x18E7,\n    0x8C79, 0x09CB, 0x8C7A, 0x09CA, 0x8C7B, 0x1E0B, 0x8C7D, 0x206F,\n    0x8C80, 0x22FA, 0x8C81, 0x22F9, 0x8C82, 0x0D66, 0x8C84, 0x259E,\n    0x8C85, 0x259F, 0x8C86, 0x259D, 0x8C89, 0x0F1D, 0x8C8A, 0x0F1C,\n    0x8C8C, 0x10B6, 0x8C8D, 0x10B5, 0x8C8F, 0x2A55, 0x8C90, 0x2C98,\n    0x8C91, 0x2C96, 0x8C92, 0x2C97, 0x8C93, 0x135F, 0x8C94, 0x2E72,\n    0x8C95, 0x2E71, 0x8C97, 0x2FE4, 0x8C98, 0x2FE3, 0x8C99, 0x2FE2,\n    0x8C9A, 0x3132, 0x8C9C, 0x3523, 0x8C9D, 0x050E, 0x8C9E, 0x080A,\n    0x8CA0, 0x080B, 0x8CA1, 0x09CC, 0x8CA2, 0x09CD, 0x8CA3, 0x1E0D,\n    0x8CA4, 0x1E0C, 0x8CA5, 0x2070, 0x8CA7, 0x0BAE, 0x8CA8, 0x0BAC,\n    0x8CA9, 0x0BA9, 0x8CAA, 0x0BAD, 0x8CAB, 0x0BAB, 0x8CAC, 0x0BAA,\n    0x8CAF, 0x0D67, 0x8CB0, 0x22FD, 0x8CB2, 0x0F22, 0x8CB3, 0x0D69,\n    0x8CB4, 0x0D6E, 0x8CB5, 0x22FF, 0x8CB6, 0x0D70, 0x8CB7, 0x0D6F,\n    0x8CB8, 0x0D72, 0x8CB9, 0x22FE, 0x8CBA, 0x22FB, 0x8CBB, 0x0D6C,\n    0x8CBC, 0x0D68, 0x8CBD, 0x0D6A, 0x8CBE, 0x22FC, 0x8CBF, 0x0D71,\n    0x8CC0, 0x0D6D, 0x8CC1, 0x0D6B, 0x8CC2, 0x0F24, 0x8CC3, 0x0F23,\n    0x8CC4, 0x0F21, 0x8CC5, 0x0F25, 0x8CC7, 0x0F1F, 0x8CC8, 0x0F20,\n    0x8CCA, 0x0F1E, 0x8CCC, 0x25A0, 0x8CCF, 0x280D, 0x8CD1, 0x10B8,\n    0x8CD2, 0x10B9, 0x8CD3, 0x10B7, 0x8CD5, 0x280C, 0x8CD7, 0x280E,\n    0x8CD9, 0x2A58, 0x8CDA, 0x2A5A, 0x8CDC, 0x122E, 0x8CDD, 0x2A5B,\n    0x8CDE, 0x1227, 0x8CDF, 0x2A57, 0x8CE0, 0x1226, 0x8CE1, 0x1230,\n    0x8CE2, 0x122C, 0x8CE3, 0x122D, 0x8CE4, 0x1229, 0x8CE5, 0x2A56,\n    0x8CE6, 0x1228, 0x8CE7, 0x2A5C, 0x8CE8, 0x2A59, 0x8CEA, 0x122F,\n    0x8CEC, 0x122A, 0x8CED, 0x122B, 0x8CEE, 0x2C9A, 0x8CF0, 0x2C9C,\n    0x8CF1, 0x2C9B, 0x8CF3, 0x2C9D, 0x8CF4, 0x1360, 0x8CF5, 0x2C99,\n    0x8CF8, 0x1486, 0x8CF9, 0x2E73, 0x8CFA, 0x1483, 0x8CFB, 0x1487,\n    0x8CFC, 0x1485, 0x8CFD, 0x1484, 0x8CFE, 0x2FE5, 0x8D00, 0x2FE8,\n    0x8D02, 0x2FE7, 0x8D04, 0x2FE6, 0x8D05, 0x152F, 0x8D06, 0x3133,\n    0x8D07, 0x3134, 0x8D08, 0x15CD, 0x8D09, 0x3135, 0x8D0A, 0x15CE,\n    0x8D0D, 0x164B, 0x8D0F, 0x164A, 0x8D10, 0x3316, 0x8D13, 0x1692,\n    0x8D14, 0x3317, 0x8D15, 0x33BC, 0x8D16, 0x16D9, 0x8D17, 0x16DA,\n    0x8D19, 0x3442, 0x8D1B, 0x172F, 0x8D64, 0x050F, 0x8D66, 0x0BB0,\n    0x8D67, 0x0BAF, 0x8D68, 0x25A1, 0x8D69, 0x25A2, 0x8D6B, 0x10BA,\n    0x8D6C, 0x2C9E, 0x8D6D, 0x1231, 0x8D6E, 0x2C9F, 0x8D6F, 0x2E74,\n    0x8D70, 0x0510, 0x8D72, 0x1C06, 0x8D73, 0x080D, 0x8D74, 0x080C,\n    0x8D76, 0x1E0E, 0x8D77, 0x09CE, 0x8D78, 0x1E0F, 0x8D79, 0x2073,\n    0x8D7B, 0x2072, 0x8D7D, 0x2071, 0x8D80, 0x2301, 0x8D81, 0x0D75,\n    0x8D84, 0x2300, 0x8D85, 0x0D74, 0x8D89, 0x2302, 0x8D8A, 0x0D73,\n    0x8D8C, 0x25A4, 0x8D8D, 0x25A7, 0x8D8E, 0x25A5, 0x8D8F, 0x25A6,\n    0x8D90, 0x25AA, 0x8D91, 0x25A3, 0x8D92, 0x25AB, 0x8D93, 0x25A8,\n    0x8D94, 0x25A9, 0x8D95, 0x10BC, 0x8D96, 0x280F, 0x8D99, 0x10BB,\n    0x8D9B, 0x2A60, 0x8D9C, 0x2A5E, 0x8D9F, 0x1232, 0x8DA0, 0x2A5D,\n    0x8DA1, 0x2A5F, 0x8DA3, 0x1233, 0x8DA5, 0x2CA0, 0x8DA7, 0x2CA1,\n    0x8DA8, 0x1488, 0x8DAA, 0x3137, 0x8DAB, 0x3139, 0x8DAC, 0x3136,\n    0x8DAD, 0x3138, 0x8DAE, 0x323D, 0x8DAF, 0x3318, 0x8DB2, 0x3509,\n    0x8DB3, 0x0511, 0x8DB4, 0x080E, 0x8DB5, 0x1E10, 0x8DB6, 0x1E12,\n    0x8DB7, 0x1E11, 0x8DB9, 0x2076, 0x8DBA, 0x0BB2, 0x8DBC, 0x2074,\n    0x8DBE, 0x0BB1, 0x8DBF, 0x2077, 0x8DC1, 0x2078, 0x8DC2, 0x2075,\n    0x8DC5, 0x230E, 0x8DC6, 0x0D7D, 0x8DC7, 0x2306, 0x8DC8, 0x230C,\n    0x8DCB, 0x0D78, 0x8DCC, 0x0D7B, 0x8DCD, 0x2305, 0x8DCE, 0x0D76,\n    0x8DCF, 0x2309, 0x8DD0, 0x25B1, 0x8DD1, 0x0D7A, 0x8DD3, 0x2304,\n    0x8DD5, 0x230A, 0x8DD6, 0x2307, 0x8DD7, 0x230D, 0x8DD8, 0x2303,\n    0x8DD9, 0x230B, 0x8DDA, 0x0D79, 0x8DDB, 0x0D7C, 0x8DDC, 0x2308,\n    0x8DDD, 0x0D77, 0x8DDF, 0x0F27, 0x8DE0, 0x25AD, 0x8DE1, 0x0F26,\n    0x8DE2, 0x25B4, 0x8DE3, 0x25B3, 0x8DE4, 0x0F2D, 0x8DE6, 0x0F2E,\n    0x8DE7, 0x25B5, 0x8DE8, 0x0F28, 0x8DE9, 0x25B2, 0x8DEA, 0x0F2C,\n    0x8DEB, 0x25B7, 0x8DEC, 0x25AE, 0x8DEE, 0x25B0, 0x8DEF, 0x0F29,\n    0x8DF0, 0x25AC, 0x8DF1, 0x25AF, 0x8DF2, 0x25B6, 0x8DF3, 0x0F2A,\n    0x8DF4, 0x25B8, 0x8DFA, 0x0F2B, 0x8DFC, 0x10BD, 0x8DFD, 0x2814,\n    0x8DFE, 0x281A, 0x8DFF, 0x2812, 0x8E00, 0x281B, 0x8E02, 0x2811,\n    0x8E03, 0x2816, 0x8E04, 0x281C, 0x8E05, 0x2819, 0x8E06, 0x2818,\n    0x8E07, 0x2817, 0x8E09, 0x2810, 0x8E0A, 0x2815, 0x8E0D, 0x2813,\n    0x8E0F, 0x1238, 0x8E10, 0x1235, 0x8E11, 0x2A69, 0x8E12, 0x2A6E,\n    0x8E13, 0x2A70, 0x8E14, 0x2A6D, 0x8E15, 0x2A66, 0x8E16, 0x2A68,\n    0x8E17, 0x2A72, 0x8E18, 0x2A6F, 0x8E19, 0x2A6A, 0x8E1A, 0x2A73,\n    0x8E1B, 0x2A67, 0x8E1C, 0x2A71, 0x8E1D, 0x1236, 0x8E1E, 0x123C,\n    0x8E1F, 0x123A, 0x8E20, 0x2A61, 0x8E21, 0x123B, 0x8E22, 0x1237,\n    0x8E23, 0x2A62, 0x8E24, 0x2A64, 0x8E25, 0x2A63, 0x8E26, 0x2A6B,\n    0x8E27, 0x2A6C, 0x8E29, 0x1239, 0x8E2B, 0x1234, 0x8E2E, 0x2A65,\n    0x8E30, 0x2CAB, 0x8E31, 0x1362, 0x8E33, 0x2CA2, 0x8E34, 0x1363,\n    0x8E35, 0x1366, 0x8E36, 0x2CA7, 0x8E38, 0x2CA4, 0x8E39, 0x1365,\n    0x8E3C, 0x2CA8, 0x8E3D, 0x2CA9, 0x8E3E, 0x2CA3, 0x8E3F, 0x2CAC,\n    0x8E40, 0x2CA5, 0x8E41, 0x2CAA, 0x8E42, 0x1364, 0x8E44, 0x1361,\n    0x8E45, 0x2CA6, 0x8E47, 0x2E7A, 0x8E48, 0x148B, 0x8E49, 0x1489,\n    0x8E4A, 0x148C, 0x8E4B, 0x148A, 0x8E4C, 0x2E79, 0x8E4D, 0x2E76,\n    0x8E4E, 0x2E75, 0x8E50, 0x2E78, 0x8E53, 0x2E77, 0x8E54, 0x2FF6,\n    0x8E55, 0x1535, 0x8E56, 0x2FED, 0x8E57, 0x2FEC, 0x8E59, 0x1530,\n    0x8E5A, 0x2FF2, 0x8E5B, 0x2FF1, 0x8E5C, 0x2FE9, 0x8E5D, 0x2FF4,\n    0x8E5E, 0x2FEE, 0x8E5F, 0x1534, 0x8E60, 0x2FEB, 0x8E61, 0x2FF3,\n    0x8E62, 0x2FEA, 0x8E63, 0x1531, 0x8E64, 0x1533, 0x8E65, 0x2FEF,\n    0x8E66, 0x1532, 0x8E67, 0x2FF0, 0x8E69, 0x2FF5, 0x8E6A, 0x313D,\n    0x8E6C, 0x15D3, 0x8E6D, 0x313A, 0x8E6F, 0x313E, 0x8E72, 0x15D0,\n    0x8E73, 0x313C, 0x8E74, 0x15D5, 0x8E76, 0x15D2, 0x8E78, 0x313B,\n    0x8E7A, 0x15D4, 0x8E7B, 0x313F, 0x8E7C, 0x15CF, 0x8E81, 0x164D,\n    0x8E82, 0x164F, 0x8E84, 0x3240, 0x8E85, 0x164E, 0x8E86, 0x323E,\n    0x8E87, 0x15D1, 0x8E88, 0x323F, 0x8E89, 0x164C, 0x8E8A, 0x1693,\n    0x8E8B, 0x1695, 0x8E8C, 0x331A, 0x8E8D, 0x1694, 0x8E8E, 0x3319,\n    0x8E90, 0x33C1, 0x8E91, 0x16DB, 0x8E92, 0x33C0, 0x8E93, 0x16DC,\n    0x8E94, 0x33BE, 0x8E95, 0x33BD, 0x8E96, 0x33C2, 0x8E97, 0x33C3,\n    0x8E98, 0x3443, 0x8E9A, 0x33BF, 0x8E9D, 0x34A1, 0x8E9E, 0x349E,\n    0x8E9F, 0x349F, 0x8EA0, 0x34A0, 0x8EA1, 0x1749, 0x8EA3, 0x34EB,\n    0x8EA4, 0x34EA, 0x8EA5, 0x34E9, 0x8EA6, 0x350A, 0x8EA8, 0x3537,\n    0x8EA9, 0x3524, 0x8EAA, 0x175B, 0x8EAB, 0x0512, 0x8EAC, 0x09CF,\n    0x8EB2, 0x0F2F, 0x8EBA, 0x123D, 0x8EBD, 0x2CAD, 0x8EC0, 0x1536,\n    0x8EC2, 0x3140, 0x8EC9, 0x3525, 0x8ECA, 0x0513, 0x8ECB, 0x068D,\n    0x8ECC, 0x0810, 0x8ECD, 0x080F, 0x8ECF, 0x09D2, 0x8ED1, 0x1E13,\n    0x8ED2, 0x09D0, 0x8ED3, 0x1E14, 0x8ED4, 0x09D1, 0x8ED7, 0x207D,\n    0x8ED8, 0x2079, 0x8EDB, 0x0BB3, 0x8EDC, 0x207C, 0x8EDD, 0x207B,\n    0x8EDE, 0x207A, 0x8EDF, 0x0BB4, 0x8EE0, 0x207E, 0x8EE1, 0x207F,\n    0x8EE5, 0x2315, 0x8EE6, 0x2313, 0x8EE7, 0x2317, 0x8EE8, 0x2318,\n    0x8EE9, 0x231E, 0x8EEB, 0x231A, 0x8EEC, 0x231C, 0x8EEE, 0x2314,\n    0x8EEF, 0x230F, 0x8EF1, 0x231B, 0x8EF4, 0x231D, 0x8EF5, 0x2316,\n    0x8EF6, 0x2319, 0x8EF7, 0x2310, 0x8EF8, 0x0D7F, 0x8EF9, 0x2312,\n    0x8EFA, 0x2311, 0x8EFB, 0x0D7E, 0x8EFC, 0x0D80, 0x8EFE, 0x0F32,\n    0x8EFF, 0x25BA, 0x8F00, 0x25BC, 0x8F01, 0x25BB, 0x8F02, 0x25C0,\n    0x8F03, 0x0F30, 0x8F05, 0x25BD, 0x8F06, 0x25B9, 0x8F07, 0x25BE,\n    0x8F08, 0x25BF, 0x8F09, 0x0F31, 0x8F0A, 0x0F33, 0x8F0B, 0x25C1,\n    0x8F0D, 0x2820, 0x8F0E, 0x281F, 0x8F10, 0x281D, 0x8F11, 0x281E,\n    0x8F12, 0x10BF, 0x8F13, 0x10C1, 0x8F14, 0x10BE, 0x8F15, 0x10C0,\n    0x8F16, 0x2A7A, 0x8F17, 0x2A7B, 0x8F18, 0x2A76, 0x8F1A, 0x2A77,\n    0x8F1B, 0x123F, 0x8F1C, 0x1244, 0x8F1D, 0x123E, 0x8F1E, 0x1245,\n    0x8F1F, 0x1240, 0x8F20, 0x2A78, 0x8F23, 0x2A79, 0x8F24, 0x2A75,\n    0x8F25, 0x1246, 0x8F26, 0x1242, 0x8F29, 0x1241, 0x8F2A, 0x1243,\n    0x8F2C, 0x2A74, 0x8F2E, 0x2CAF, 0x8F2F, 0x1368, 0x8F32, 0x2CB1,\n    0x8F33, 0x136A, 0x8F34, 0x2CB4, 0x8F35, 0x2CB0, 0x8F36, 0x2CAE,\n    0x8F37, 0x2CB3, 0x8F38, 0x1369, 0x8F39, 0x2CB2, 0x8F3B, 0x1367,\n    0x8F3E, 0x148E, 0x8F3F, 0x1491, 0x8F40, 0x2E7C, 0x8F42, 0x148F,\n    0x8F43, 0x2E7B, 0x8F44, 0x148D, 0x8F45, 0x1490, 0x8F46, 0x2FF7,\n    0x8F47, 0x2FF8, 0x8F48, 0x2FF9, 0x8F49, 0x1537, 0x8F4B, 0x2FFA,\n    0x8F4D, 0x1538, 0x8F4E, 0x15D7, 0x8F4F, 0x3143, 0x8F50, 0x3144,\n    0x8F51, 0x3142, 0x8F52, 0x3141, 0x8F53, 0x3145, 0x8F54, 0x15D6,\n    0x8F55, 0x3244, 0x8F56, 0x3242, 0x8F57, 0x3243, 0x8F58, 0x3245,\n    0x8F59, 0x3241, 0x8F5A, 0x3246, 0x8F5B, 0x331C, 0x8F5D, 0x331D,\n    0x8F5E, 0x331B, 0x8F5F, 0x1696, 0x8F60, 0x33C4, 0x8F61, 0x16DD,\n    0x8F62, 0x33C5, 0x8F63, 0x3445, 0x8F64, 0x3444, 0x8F9B, 0x0514,\n    0x8F9C, 0x0D81, 0x8F9F, 0x0F34, 0x8FA3, 0x10C2, 0x8FA6, 0x136C,\n    0x8FA8, 0x136B, 0x8FAD, 0x15D8, 0x8FAE, 0x162F, 0x8FAF, 0x1697,\n    0x8FB0, 0x0515, 0x8FB1, 0x09D3, 0x8FB2, 0x0F35, 0x8FB4, 0x3146,\n    0x8FB5, 0x0230, 0x8FBF, 0x18E9, 0x8FC2, 0x0516, 0x8FC4, 0x0519,\n    0x8FC5, 0x0518, 0x8FC6, 0x0517, 0x8FC9, 0x18E8, 0x8FCB, 0x1A4A,\n    0x8FCD, 0x1A4C, 0x8FCE, 0x068E, 0x8FD1, 0x0690, 0x8FD2, 0x1A49,\n    0x8FD3, 0x1A4B, 0x8FD4, 0x068F, 0x8FD5, 0x1A4E, 0x8FD6, 0x1A4D,\n    0x8FD7, 0x1A4F, 0x8FE0, 0x1C0A, 0x8FE1, 0x1C08, 0x8FE2, 0x0813,\n    0x8FE3, 0x1C07, 0x8FE4, 0x0818, 0x8FE5, 0x0815, 0x8FE6, 0x0812,\n    0x8FE8, 0x0819, 0x8FEA, 0x0814, 0x8FEB, 0x0817, 0x8FED, 0x0816,\n    0x8FEE, 0x1C09, 0x8FF0, 0x0811, 0x8FF4, 0x09D9, 0x8FF5, 0x1E16,\n    0x8FF6, 0x1E1C, 0x8FF7, 0x09D6, 0x8FF8, 0x09DD, 0x8FFA, 0x09D8,\n    0x8FFB, 0x1E19, 0x8FFC, 0x1E1B, 0x8FFD, 0x09DB, 0x8FFE, 0x1E15,\n    0x8FFF, 0x1E18, 0x9000, 0x09D7, 0x9001, 0x09D4, 0x9002, 0x1E17,\n    0x9003, 0x09DA, 0x9004, 0x1E1A, 0x9005, 0x09DC, 0x9006, 0x09D5,\n    0x900B, 0x2081, 0x900C, 0x2084, 0x900D, 0x0BB6, 0x900F, 0x0BC0,\n    0x9010, 0x0BBC, 0x9011, 0x2082, 0x9014, 0x0BC4, 0x9015, 0x0BBD,\n    0x9016, 0x0BC2, 0x9017, 0x0BB8, 0x9019, 0x0BB5, 0x901A, 0x0BB7,\n    0x901B, 0x0BC3, 0x901C, 0x2083, 0x901D, 0x0BBB, 0x901E, 0x0BBE,\n    0x901F, 0x0BBA, 0x9020, 0x0BBF, 0x9021, 0x2085, 0x9022, 0x0BC1,\n    0x9023, 0x0BB9, 0x9024, 0x2080, 0x902D, 0x231F, 0x902E, 0x0D82,\n    0x902F, 0x2321, 0x9031, 0x0D84, 0x9032, 0x0D86, 0x9034, 0x2320,\n    0x9035, 0x0D83, 0x9036, 0x0D87, 0x9038, 0x0D85, 0x903C, 0x0F3B,\n    0x903D, 0x25C6, 0x903E, 0x0F43, 0x903F, 0x25C3, 0x9041, 0x0F44,\n    0x9042, 0x0F39, 0x9044, 0x25C4, 0x9047, 0x0F3E, 0x9049, 0x25C5,\n    0x904A, 0x0F37, 0x904B, 0x0F36, 0x904D, 0x0F41, 0x904E, 0x0F40,\n    0x904F, 0x0F3F, 0x9050, 0x0F3D, 0x9051, 0x0F42, 0x9052, 0x25C2,\n    0x9053, 0x0F38, 0x9054, 0x0F3A, 0x9055, 0x0F3C, 0x9058, 0x10C4,\n    0x9059, 0x10C7, 0x905B, 0x10CB, 0x905C, 0x10C5, 0x905D, 0x10CA,\n    0x905E, 0x10C8, 0x9060, 0x10C3, 0x9062, 0x10C9, 0x9063, 0x10C6,\n    0x9067, 0x2A7F, 0x9068, 0x1249, 0x9069, 0x1247, 0x906B, 0x2A80,\n    0x906D, 0x124A, 0x906E, 0x1248, 0x906F, 0x2A7E, 0x9070, 0x2A7D,\n    0x9072, 0x1370, 0x9073, 0x2A7C, 0x9074, 0x136E, 0x9075, 0x136D,\n    0x9076, 0x2CB5, 0x9077, 0x124B, 0x9078, 0x136F, 0x9079, 0x2CB6,\n    0x907A, 0x1372, 0x907B, 0x2CB7, 0x907C, 0x1371, 0x907D, 0x1493,\n    0x907E, 0x2E7E, 0x907F, 0x1492, 0x9080, 0x1497, 0x9081, 0x1495,\n    0x9082, 0x1496, 0x9083, 0x153A, 0x9084, 0x1494, 0x9085, 0x2E7D,\n    0x9086, 0x2CB8, 0x9087, 0x1539, 0x9088, 0x153B, 0x908A, 0x15D9,\n    0x908B, 0x15DA, 0x908D, 0x3247, 0x908F, 0x170C, 0x9090, 0x170B,\n    0x9091, 0x051B, 0x9094, 0x181E, 0x9095, 0x09DE, 0x9097, 0x181B,\n    0x9098, 0x181C, 0x9099, 0x181A, 0x909B, 0x181D, 0x909E, 0x18ED,\n    0x909F, 0x18EA, 0x90A0, 0x18EF, 0x90A1, 0x18EB, 0x90A2, 0x051C,\n    0x90A3, 0x051F, 0x90A5, 0x18EC, 0x90A6, 0x051E, 0x90A7, 0x18EE,\n    0x90AA, 0x051D, 0x90AF, 0x1A52, 0x90B0, 0x1A54, 0x90B1, 0x0693,\n    0x90B2, 0x1A50, 0x90B3, 0x1A53, 0x90B4, 0x1A51, 0x90B5, 0x0691,\n    0x90B6, 0x0694, 0x90B8, 0x0692, 0x90BD, 0x1C0C, 0x90BE, 0x1C10,\n    0x90BF, 0x1C0D, 0x90C1, 0x081C, 0x90C3, 0x081D, 0x90C5, 0x1C0F,\n    0x90C7, 0x1C11, 0x90C8, 0x1C13, 0x90CA, 0x081A, 0x90CB, 0x1C12,\n    0x90CE, 0x081B, 0x90D4, 0x208C, 0x90D5, 0x1C0E, 0x90D6, 0x1E1D,\n    0x90D7, 0x1E26, 0x90D8, 0x1E24, 0x90D9, 0x1E1F, 0x90DA, 0x1E20,\n    0x90DB, 0x1E25, 0x90DC, 0x1E27, 0x90DD, 0x09E0, 0x90DF, 0x1E22,\n    0x90E0, 0x1E1E, 0x90E1, 0x09DF, 0x90E2, 0x09E1, 0x90E3, 0x1E21,\n    0x90E4, 0x1E28, 0x90E5, 0x1E23, 0x90E8, 0x0BC5, 0x90E9, 0x208F,\n    0x90EA, 0x2087, 0x90EB, 0x208D, 0x90EC, 0x208E, 0x90ED, 0x0BC6,\n    0x90EF, 0x2086, 0x90F0, 0x2088, 0x90F1, 0x1C0B, 0x90F2, 0x208A,\n    0x90F3, 0x208B, 0x90F4, 0x2089, 0x90F5, 0x0D89, 0x90F9, 0x2328,\n    0x90FA, 0x2CB9, 0x90FB, 0x2329, 0x90FC, 0x2326, 0x90FD, 0x0BC7,\n    0x90FE, 0x0D8B, 0x90FF, 0x2325, 0x9100, 0x232B, 0x9101, 0x232A,\n    0x9102, 0x0D88, 0x9103, 0x232E, 0x9104, 0x2324, 0x9105, 0x232D,\n    0x9106, 0x2322, 0x9107, 0x232C, 0x9108, 0x2327, 0x9109, 0x0D8A,\n    0x910B, 0x25CD, 0x910D, 0x25C8, 0x910E, 0x25CE, 0x910F, 0x25C9,\n    0x9110, 0x25C7, 0x9111, 0x25CA, 0x9112, 0x0F45, 0x9114, 0x25CC,\n    0x9116, 0x25CB, 0x9117, 0x0F46, 0x9118, 0x10CD, 0x9119, 0x10CC,\n    0x911A, 0x2827, 0x911B, 0x282A, 0x911C, 0x2822, 0x911D, 0x2826,\n    0x911E, 0x10CE, 0x911F, 0x2825, 0x9120, 0x2823, 0x9121, 0x2829,\n    0x9122, 0x2824, 0x9123, 0x2821, 0x9124, 0x2828, 0x9126, 0x2A86,\n    0x9127, 0x124E, 0x9128, 0x2FFB, 0x9129, 0x2A83, 0x912A, 0x2A84,\n    0x912B, 0x2A82, 0x912C, 0x2323, 0x912D, 0x124D, 0x912E, 0x2A87,\n    0x912F, 0x2A81, 0x9130, 0x124C, 0x9131, 0x124F, 0x9132, 0x2A85,\n    0x9133, 0x2CBA, 0x9134, 0x1373, 0x9135, 0x2CBB, 0x9136, 0x2CBC,\n    0x9138, 0x2E7F, 0x9139, 0x1498, 0x913A, 0x2FFC, 0x913B, 0x2FFD,\n    0x913E, 0x2FFE, 0x913F, 0x3148, 0x9140, 0x3147, 0x9141, 0x3249,\n    0x9143, 0x3248, 0x9144, 0x331F, 0x9145, 0x3320, 0x9146, 0x331E,\n    0x9147, 0x33C6, 0x9148, 0x16DE, 0x9149, 0x0520, 0x914A, 0x081F,\n    0x914B, 0x081E, 0x914C, 0x09E4, 0x914D, 0x09E3, 0x914E, 0x1E2A,\n    0x914F, 0x1E2B, 0x9150, 0x1E29, 0x9152, 0x09E2, 0x9153, 0x2093,\n    0x9155, 0x2094, 0x9156, 0x2090, 0x9157, 0x0BC8, 0x9158, 0x2091,\n    0x915A, 0x2092, 0x915F, 0x2331, 0x9160, 0x2333, 0x9161, 0x232F,\n    0x9162, 0x2332, 0x9163, 0x0D8C, 0x9164, 0x2330, 0x9165, 0x0D8D,\n    0x9168, 0x23E2, 0x9169, 0x0F49, 0x916A, 0x0F48, 0x916C, 0x0F47,\n    0x916E, 0x25CF, 0x916F, 0x25D0, 0x9172, 0x282C, 0x9173, 0x282E,\n    0x9174, 0x10D2, 0x9175, 0x10CF, 0x9177, 0x10D1, 0x9178, 0x10D0,\n    0x9179, 0x282D, 0x917A, 0x282B, 0x9180, 0x2A8E, 0x9181, 0x2A8B,\n    0x9182, 0x2A8C, 0x9183, 0x1253, 0x9184, 0x2A8D, 0x9185, 0x2A88,\n    0x9186, 0x2A89, 0x9187, 0x1250, 0x9189, 0x1251, 0x918A, 0x2A8A,\n    0x918B, 0x1252, 0x918D, 0x2CC0, 0x918F, 0x2CC1, 0x9190, 0x2CBE,\n    0x9191, 0x2CBF, 0x9192, 0x1374, 0x9193, 0x2CBD, 0x9199, 0x2E83,\n    0x919A, 0x2E80, 0x919B, 0x2E82, 0x919C, 0x149B, 0x919D, 0x2E86,\n    0x919E, 0x149A, 0x919F, 0x2E84, 0x91A0, 0x2E87, 0x91A1, 0x2E85,\n    0x91A2, 0x2E81, 0x91A3, 0x1499, 0x91A5, 0x3000, 0x91A7, 0x3001,\n    0x91A8, 0x2FFF, 0x91AA, 0x3003, 0x91AB, 0x153C, 0x91AC, 0x153D,\n    0x91AD, 0x314A, 0x91AE, 0x15DC, 0x91AF, 0x3002, 0x91B0, 0x3149,\n    0x91B1, 0x15DB, 0x91B2, 0x324C, 0x91B3, 0x324D, 0x91B4, 0x1650,\n    0x91B5, 0x324B, 0x91B7, 0x324A, 0x91B9, 0x3321, 0x91BA, 0x1698,\n    0x91BC, 0x3446, 0x91BD, 0x34A3, 0x91BE, 0x34A2, 0x91C0, 0x1730,\n    0x91C1, 0x174A, 0x91C2, 0x34A4, 0x91C3, 0x350B, 0x91C5, 0x175C,\n    0x91C6, 0x0521, 0x91C7, 0x0695, 0x91C9, 0x0F4A, 0x91CB, 0x1651,\n    0x91CC, 0x0522, 0x91CD, 0x0820, 0x91CE, 0x0BC9, 0x91CF, 0x0D8E,\n    0x91D0, 0x153E, 0x91D1, 0x0696, 0x91D3, 0x1C15, 0x91D4, 0x1C14,\n    0x91D5, 0x1E2C, 0x91D7, 0x09E7, 0x91D8, 0x09E5, 0x91D9, 0x09E9,\n    0x91DA, 0x1E2E, 0x91DC, 0x09E8, 0x91DD, 0x09E6, 0x91E2, 0x1E2D,\n    0x91E3, 0x0BCC, 0x91E4, 0x209A, 0x91E6, 0x0BCB, 0x91E7, 0x0BCD,\n    0x91E8, 0x209F, 0x91E9, 0x0BCF, 0x91EA, 0x209C, 0x91EB, 0x209D,\n    0x91EC, 0x2095, 0x91ED, 0x0BCE, 0x91EE, 0x20A0, 0x91F1, 0x2097,\n    0x91F3, 0x2098, 0x91F4, 0x2096, 0x91F5, 0x0BCA, 0x91F7, 0x209E,\n    0x91F8, 0x2099, 0x91F9, 0x209B, 0x91FD, 0x233F, 0x91FF, 0x233E,\n    0x9200, 0x233C, 0x9201, 0x2334, 0x9202, 0x2343, 0x9203, 0x2337,\n    0x9204, 0x2341, 0x9205, 0x2348, 0x9206, 0x2340, 0x9207, 0x0D96,\n    0x9209, 0x0D92, 0x920A, 0x2335, 0x920C, 0x233B, 0x920D, 0x0D94,\n    0x920F, 0x233A, 0x9210, 0x0D95, 0x9211, 0x0D97, 0x9212, 0x233D,\n    0x9214, 0x0D8F, 0x9215, 0x0D90, 0x9216, 0x2349, 0x9217, 0x2347,\n    0x9219, 0x2346, 0x921A, 0x2338, 0x921C, 0x2344, 0x921E, 0x0D93,\n    0x9223, 0x0D91, 0x9224, 0x2345, 0x9225, 0x2336, 0x9226, 0x2339,\n    0x9227, 0x2342, 0x922D, 0x2851, 0x922E, 0x25DA, 0x9230, 0x25D3,\n    0x9231, 0x25E6, 0x9232, 0x25EF, 0x9233, 0x25D6, 0x9234, 0x0F55,\n    0x9236, 0x25E3, 0x9237, 0x0F4B, 0x9238, 0x0F4D, 0x9239, 0x0F59,\n    0x923A, 0x25D4, 0x923D, 0x0F4E, 0x923E, 0x0F50, 0x923F, 0x0F5A,\n    0x9240, 0x0F4F, 0x9245, 0x0F58, 0x9246, 0x25DC, 0x9248, 0x25D1,\n    0x9249, 0x0F56, 0x924A, 0x25DB, 0x924B, 0x0F52, 0x924C, 0x25ED,\n    0x924D, 0x0F57, 0x924E, 0x25EB, 0x924F, 0x25DF, 0x9250, 0x25E9,\n    0x9251, 0x0F54, 0x9252, 0x25D2, 0x9253, 0x25EC, 0x9254, 0x25E7,\n    0x9256, 0x25EE, 0x9257, 0x0F4C, 0x925A, 0x0F5B, 0x925B, 0x0F51,\n    0x925E, 0x25D8, 0x9260, 0x25E0, 0x9261, 0x25E4, 0x9263, 0x25E8,\n    0x9264, 0x0F53, 0x9265, 0x25D7, 0x9266, 0x25D5, 0x9267, 0x25E1,\n    0x926C, 0x25DE, 0x926D, 0x25DD, 0x926F, 0x25E2, 0x9270, 0x25E5,\n    0x9272, 0x25EA, 0x9276, 0x2831, 0x9278, 0x10D3, 0x9279, 0x283B,\n    0x927A, 0x2833, 0x927B, 0x10D9, 0x927C, 0x10DD, 0x927D, 0x2844,\n    0x927E, 0x284C, 0x927F, 0x283D, 0x9280, 0x10D5, 0x9282, 0x2841,\n    0x9283, 0x25D9, 0x9285, 0x10D6, 0x9286, 0x2848, 0x9287, 0x284D,\n    0x9288, 0x2845, 0x928A, 0x2847, 0x928B, 0x2850, 0x928C, 0x2849,\n    0x928D, 0x2837, 0x928E, 0x2840, 0x9291, 0x10DE, 0x9293, 0x10DA,\n    0x9294, 0x2835, 0x9295, 0x2842, 0x9296, 0x10D8, 0x9297, 0x283C,\n    0x9298, 0x10D7, 0x9299, 0x284A, 0x929A, 0x2839, 0x929B, 0x2832,\n    0x929C, 0x10DB, 0x929D, 0x284F, 0x92A0, 0x2834, 0x92A1, 0x2846,\n    0x92A2, 0x2843, 0x92A3, 0x283E, 0x92A4, 0x2830, 0x92A5, 0x282F,\n    0x92A6, 0x2838, 0x92A7, 0x284B, 0x92A8, 0x10DC, 0x92A9, 0x284E,\n    0x92AA, 0x2836, 0x92AB, 0x283A, 0x92AC, 0x10D4, 0x92B2, 0x125F,\n    0x92B3, 0x125A, 0x92B4, 0x2AB0, 0x92B5, 0x2AAC, 0x92B6, 0x2A94,\n    0x92B7, 0x1256, 0x92B9, 0x36E9, 0x92BB, 0x1255, 0x92BC, 0x125B,\n    0x92C0, 0x2A92, 0x92C1, 0x1259, 0x92C2, 0x2A9E, 0x92C3, 0x2A90,\n    0x92C4, 0x2A91, 0x92C5, 0x1254, 0x92C6, 0x2AAF, 0x92C7, 0x125D,\n    0x92C8, 0x2AA1, 0x92C9, 0x2AA6, 0x92CA, 0x2AA0, 0x92CB, 0x2CD3,\n    0x92CC, 0x2A9C, 0x92CD, 0x2AA4, 0x92CE, 0x2AA2, 0x92CF, 0x2A95,\n    0x92D0, 0x2A8F, 0x92D1, 0x2AAA, 0x92D2, 0x125C, 0x92D3, 0x2AAB,\n    0x92D5, 0x2AA5, 0x92D7, 0x2A9A, 0x92D8, 0x2A98, 0x92D9, 0x2A93,\n    0x92DD, 0x2A9B, 0x92DE, 0x2AA8, 0x92DF, 0x2A97, 0x92E0, 0x2AA7,\n    0x92E1, 0x2AAD, 0x92E4, 0x1258, 0x92E6, 0x2AA3, 0x92E7, 0x2AA9,\n    0x92E8, 0x2A9F, 0x92E9, 0x2A99, 0x92EA, 0x1257, 0x92EE, 0x283F,\n    0x92EF, 0x2A9D, 0x92F0, 0x125E, 0x92F1, 0x2A96, 0x92F7, 0x2CD8,\n    0x92F8, 0x1377, 0x92F9, 0x2CD7, 0x92FA, 0x2CD5, 0x92FB, 0x2CE7,\n    0x92FC, 0x137B, 0x92FE, 0x2CE4, 0x92FF, 0x2CDC, 0x9300, 0x2CE6,\n    0x9301, 0x2CCE, 0x9302, 0x2CDA, 0x9304, 0x137D, 0x9306, 0x2CC6,\n    0x9308, 0x2CC4, 0x9309, 0x2CE5, 0x930B, 0x2CE3, 0x930C, 0x2CE2,\n    0x930D, 0x2CD2, 0x930E, 0x2CD1, 0x930F, 0x2CC7, 0x9310, 0x137F,\n    0x9312, 0x2CCD, 0x9313, 0x2CD6, 0x9314, 0x2CE1, 0x9315, 0x1382,\n    0x9316, 0x2CE8, 0x9318, 0x14A3, 0x9319, 0x1384, 0x931A, 0x137E,\n    0x931B, 0x2CCB, 0x931D, 0x2CD4, 0x931E, 0x2CC3, 0x931F, 0x2CC5,\n    0x9320, 0x1375, 0x9321, 0x1381, 0x9322, 0x137A, 0x9323, 0x2CCC,\n    0x9324, 0x2CDB, 0x9325, 0x2AAE, 0x9326, 0x1380, 0x9327, 0x2CC2,\n    0x9328, 0x149E, 0x9329, 0x2CDD, 0x932A, 0x2CE0, 0x932B, 0x137C,\n    0x932D, 0x2CD0, 0x932E, 0x1383, 0x932F, 0x1379, 0x9333, 0x1378,\n    0x9334, 0x2CD9, 0x9335, 0x2CDF, 0x9336, 0x1376, 0x9338, 0x2CC9,\n    0x9339, 0x2CDE, 0x933C, 0x2CCA, 0x9346, 0x2CCF, 0x9347, 0x2E8D,\n    0x9349, 0x2E92, 0x934A, 0x14A0, 0x934B, 0x14A2, 0x934C, 0x2E98,\n    0x934D, 0x149C, 0x934E, 0x2EA6, 0x934F, 0x2E9E, 0x9350, 0x2E93,\n    0x9351, 0x2E94, 0x9352, 0x2E9D, 0x9354, 0x14A9, 0x9355, 0x2E9C,\n    0x9356, 0x2E8C, 0x9357, 0x2E9B, 0x9358, 0x2E8F, 0x9359, 0x2EA7,\n    0x935A, 0x14A8, 0x935B, 0x14A6, 0x935C, 0x2E90, 0x935E, 0x2EA3,\n    0x9360, 0x2E95, 0x9361, 0x2EA2, 0x9363, 0x2EA4, 0x9364, 0x2E8B,\n    0x9365, 0x14A1, 0x9367, 0x2EA5, 0x936A, 0x2E99, 0x936C, 0x14A5,\n    0x936D, 0x2E96, 0x9370, 0x14A7, 0x9371, 0x2E9F, 0x9375, 0x149F,\n    0x9376, 0x2E91, 0x9377, 0x2EA0, 0x9379, 0x2E9A, 0x937A, 0x2CC8,\n    0x937B, 0x2EA1, 0x937C, 0x2E8E, 0x937E, 0x14A4, 0x9380, 0x3014,\n    0x9382, 0x149D, 0x9383, 0x2E89, 0x9388, 0x3011, 0x9389, 0x300A,\n    0x938A, 0x1540, 0x938C, 0x3005, 0x938D, 0x3015, 0x938E, 0x300C,\n    0x938F, 0x2E97, 0x9391, 0x3017, 0x9392, 0x3006, 0x9394, 0x153F,\n    0x9395, 0x3010, 0x9396, 0x1541, 0x9397, 0x1549, 0x9398, 0x1547,\n    0x9399, 0x3012, 0x939A, 0x1548, 0x939B, 0x3008, 0x939D, 0x3009,\n    0x939E, 0x300E, 0x939F, 0x3013, 0x93A1, 0x2E88, 0x93A2, 0x1542,\n    0x93A3, 0x301C, 0x93A4, 0x3019, 0x93A5, 0x3160, 0x93A6, 0x300F,\n    0x93A7, 0x300B, 0x93A8, 0x301A, 0x93A9, 0x3155, 0x93AA, 0x300D,\n    0x93AC, 0x1545, 0x93AE, 0x1544, 0x93AF, 0x2E8A, 0x93B0, 0x1546,\n    0x93B1, 0x3016, 0x93B2, 0x3018, 0x93B3, 0x1543, 0x93B4, 0x301B,\n    0x93B5, 0x3004, 0x93B7, 0x3007, 0x93C0, 0x315E, 0x93C2, 0x314E,\n    0x93C3, 0x15E0, 0x93C4, 0x315C, 0x93C7, 0x314C, 0x93C8, 0x15E1,\n    0x93CA, 0x3157, 0x93CC, 0x3153, 0x93CD, 0x15E6, 0x93CE, 0x315D,\n    0x93CF, 0x314D, 0x93D0, 0x3150, 0x93D1, 0x15DE, 0x93D2, 0x315F,\n    0x93D4, 0x3158, 0x93D5, 0x315B, 0x93D6, 0x15E4, 0x93D7, 0x15E9,\n    0x93D8, 0x15E7, 0x93D9, 0x3154, 0x93DA, 0x314F, 0x93DC, 0x15E2,\n    0x93DD, 0x15E3, 0x93DE, 0x314B, 0x93DF, 0x15DF, 0x93E1, 0x15DD,\n    0x93E2, 0x15E5, 0x93E3, 0x315A, 0x93E4, 0x15E8, 0x93E6, 0x3156,\n    0x93E7, 0x3161, 0x93E8, 0x15EA, 0x93EC, 0x3152, 0x93EE, 0x3159,\n    0x93F5, 0x325A, 0x93F6, 0x3269, 0x93F7, 0x325C, 0x93F8, 0x3263,\n    0x93F9, 0x3151, 0x93FA, 0x3261, 0x93FB, 0x3250, 0x93FC, 0x3267,\n    0x93FD, 0x1654, 0x93FE, 0x3254, 0x93FF, 0x3266, 0x9400, 0x325B,\n    0x9403, 0x1653, 0x9406, 0x326B, 0x9407, 0x325D, 0x9409, 0x3262,\n    0x940A, 0x3265, 0x940B, 0x324E, 0x940C, 0x3268, 0x940D, 0x3259,\n    0x940E, 0x325E, 0x940F, 0x3252, 0x9410, 0x3256, 0x9411, 0x326A,\n    0x9412, 0x3260, 0x9413, 0x324F, 0x9414, 0x3253, 0x9415, 0x3255,\n    0x9416, 0x325F, 0x9418, 0x1652, 0x9419, 0x3258, 0x9420, 0x3251,\n    0x9428, 0x3257, 0x9429, 0x3325, 0x942A, 0x3329, 0x942B, 0x169F,\n    0x942C, 0x332B, 0x942E, 0x1699, 0x9430, 0x3327, 0x9431, 0x332D,\n    0x9432, 0x169E, 0x9433, 0x169A, 0x9435, 0x169B, 0x9436, 0x3324,\n    0x9437, 0x332A, 0x9438, 0x169D, 0x9439, 0x3328, 0x943A, 0x169C,\n    0x943B, 0x3323, 0x943C, 0x3264, 0x943D, 0x3326, 0x943F, 0x3322,\n    0x9440, 0x332C, 0x9444, 0x16DF, 0x9445, 0x33CD, 0x9446, 0x33D0,\n    0x9447, 0x33CC, 0x9448, 0x33CE, 0x9449, 0x33CF, 0x944A, 0x33C9,\n    0x944B, 0x33CA, 0x944C, 0x33C7, 0x944F, 0x33CB, 0x9450, 0x33C8,\n    0x9451, 0x16E0, 0x9452, 0x16E1, 0x9455, 0x3448, 0x9457, 0x344A,\n    0x945D, 0x3449, 0x945E, 0x344B, 0x9460, 0x170E, 0x9462, 0x3447,\n    0x9463, 0x170D, 0x9464, 0x170F, 0x9468, 0x34A6, 0x9469, 0x34A7,\n    0x946A, 0x1731, 0x946B, 0x34A5, 0x946D, 0x34ED, 0x946E, 0x34EC,\n    0x946F, 0x34EE, 0x9470, 0x174C, 0x9471, 0x34EF, 0x9472, 0x174B,\n    0x9473, 0x34F0, 0x9474, 0x350C, 0x9475, 0x350F, 0x9476, 0x350E,\n    0x9477, 0x1755, 0x9478, 0x350D, 0x947C, 0x175F, 0x947D, 0x175D,\n    0x947E, 0x175E, 0x947F, 0x1764, 0x9480, 0x3539, 0x9481, 0x353A,\n    0x9482, 0x3538, 0x9483, 0x3540, 0x9577, 0x0697, 0x957A, 0x20A1,\n    0x957B, 0x234A, 0x957C, 0x2AB1, 0x957D, 0x3162, 0x9580, 0x0698,\n    0x9582, 0x0821, 0x9583, 0x09EA, 0x9586, 0x20A2, 0x9588, 0x20A3,\n    0x9589, 0x0BD0, 0x958B, 0x0D9A, 0x958C, 0x234C, 0x958D, 0x234B,\n    0x958E, 0x0D9E, 0x958F, 0x0D99, 0x9590, 0x234D, 0x9591, 0x0D9B,\n    0x9592, 0x0D9D, 0x9593, 0x0D9C, 0x9594, 0x0D98, 0x9598, 0x0F5C,\n    0x959B, 0x25F3, 0x959C, 0x25F1, 0x959E, 0x25F2, 0x959F, 0x25F0,\n    0x95A1, 0x10DF, 0x95A3, 0x10E2, 0x95A4, 0x10E4, 0x95A5, 0x10E3,\n    0x95A8, 0x10E0, 0x95A9, 0x10E1, 0x95AB, 0x2AB3, 0x95AC, 0x2AB2,\n    0x95AD, 0x1260, 0x95AE, 0x2AB4, 0x95B0, 0x2AB5, 0x95B1, 0x1261,\n    0x95B5, 0x2CF0, 0x95B6, 0x2CEE, 0x95B7, 0x2EAD, 0x95B9, 0x2CEC,\n    0x95BA, 0x2CED, 0x95BB, 0x1385, 0x95BC, 0x2CE9, 0x95BD, 0x2CF1,\n    0x95BE, 0x2CEB, 0x95BF, 0x2CEF, 0x95C0, 0x2EA9, 0x95C3, 0x2EAB,\n    0x95C5, 0x2EAC, 0x95C6, 0x14AE, 0x95C7, 0x2EA8, 0x95C8, 0x14AD,\n    0x95C9, 0x2EAA, 0x95CA, 0x14AA, 0x95CB, 0x14AB, 0x95CC, 0x14AC,\n    0x95CD, 0x2CEA, 0x95D0, 0x154C, 0x95D1, 0x301F, 0x95D2, 0x301D,\n    0x95D3, 0x301E, 0x95D4, 0x154A, 0x95D5, 0x154D, 0x95D6, 0x154B,\n    0x95DA, 0x3163, 0x95DB, 0x3164, 0x95DC, 0x15EB, 0x95DE, 0x326C,\n    0x95DF, 0x326E, 0x95E0, 0x326D, 0x95E1, 0x1655, 0x95E2, 0x16A0,\n    0x95E3, 0x3330, 0x95E4, 0x332F, 0x95E5, 0x332E, 0x961C, 0x0699,\n    0x961E, 0x17B4, 0x9620, 0x1821, 0x9621, 0x0414, 0x9622, 0x181F,\n    0x9623, 0x1822, 0x9624, 0x1820, 0x9628, 0x18F1, 0x962A, 0x0526,\n    0x962C, 0x0527, 0x962D, 0x18F3, 0x962E, 0x0524, 0x962F, 0x18F2,\n    0x9630, 0x18F0, 0x9631, 0x0525, 0x9632, 0x0523, 0x9639, 0x1A55,\n    0x963A, 0x1A58, 0x963B, 0x069C, 0x963C, 0x1A57, 0x963D, 0x1A56,\n    0x963F, 0x069B, 0x9640, 0x069A, 0x9642, 0x069E, 0x9643, 0x1A59,\n    0x9644, 0x069D, 0x964A, 0x1C1A, 0x964B, 0x0823, 0x964C, 0x0824,\n    0x964D, 0x0825, 0x964E, 0x1C1B, 0x964F, 0x1C17, 0x9650, 0x0822,\n    0x9651, 0x1C18, 0x9653, 0x1C19, 0x9654, 0x1C16, 0x9658, 0x09F1,\n    0x965B, 0x09EE, 0x965C, 0x1E2F, 0x965D, 0x09EF, 0x965E, 0x09F2,\n    0x965F, 0x1E30, 0x9661, 0x09ED, 0x9662, 0x09EB, 0x9663, 0x09EC,\n    0x9664, 0x09F0, 0x966A, 0x0BD1, 0x966B, 0x20A6, 0x966C, 0x0BD9,\n    0x966D, 0x20A5, 0x966F, 0x20A8, 0x9670, 0x0BD5, 0x9671, 0x20A7,\n    0x9672, 0x0DA6, 0x9673, 0x0BD3, 0x9674, 0x0BD6, 0x9675, 0x0BD2,\n    0x9676, 0x0BD7, 0x9677, 0x0BD8, 0x9678, 0x0BD4, 0x967C, 0x20A4,\n    0x967D, 0x0DA2, 0x967E, 0x234F, 0x9680, 0x2353, 0x9683, 0x2352,\n    0x9684, 0x0DA7, 0x9685, 0x0DA3, 0x9686, 0x0DA4, 0x9687, 0x234E,\n    0x9688, 0x2350, 0x9689, 0x2351, 0x968A, 0x0D9F, 0x968B, 0x0DA1,\n    0x968D, 0x0DA5, 0x968E, 0x0DA0, 0x9691, 0x25F6, 0x9692, 0x25F4,\n    0x9693, 0x25F5, 0x9694, 0x0F5E, 0x9695, 0x0F5F, 0x9697, 0x25F7,\n    0x9698, 0x0F5D, 0x9699, 0x10E5, 0x969B, 0x10E7, 0x969C, 0x10E6,\n    0x969E, 0x2852, 0x96A1, 0x2853, 0x96A2, 0x2AB7, 0x96A4, 0x2AB6,\n    0x96A7, 0x1386, 0x96A8, 0x1387, 0x96A9, 0x2CF2, 0x96AA, 0x1388,\n    0x96AC, 0x2EB0, 0x96AE, 0x2EAE, 0x96B0, 0x2EAF, 0x96B1, 0x14AF,\n    0x96B3, 0x3020, 0x96B4, 0x15EC, 0x96B6, 0x0231, 0x96B8, 0x14B0,\n    0x96B9, 0x069F, 0x96BB, 0x09F3, 0x96BC, 0x1E31, 0x96BF, 0x20A9,\n    0x96C0, 0x0BDA, 0x96C1, 0x0DA8, 0x96C2, 0x2354, 0x96C3, 0x2356,\n    0x96C4, 0x0DAA, 0x96C5, 0x0DA9, 0x96C6, 0x0DAB, 0x96C7, 0x0DAC,\n    0x96C8, 0x2355, 0x96C9, 0x0F62, 0x96CA, 0x0F63, 0x96CB, 0x0F61,\n    0x96CC, 0x10E8, 0x96CD, 0x0F60, 0x96CE, 0x25F8, 0x96D2, 0x10E9,\n    0x96D3, 0x2AB8, 0x96D4, 0x2CF3, 0x96D5, 0x1389, 0x96D6, 0x14B1,\n    0x96D7, 0x3021, 0x96D8, 0x3025, 0x96D9, 0x1550, 0x96DA, 0x3022,\n    0x96DB, 0x1551, 0x96DC, 0x154F, 0x96DD, 0x3026, 0x96DE, 0x1552,\n    0x96DF, 0x3024, 0x96E1, 0x3165, 0x96E2, 0x154E, 0x96E3, 0x15ED,\n    0x96E5, 0x34A8, 0x96E8, 0x06A0, 0x96E9, 0x0BDC, 0x96EA, 0x0BDB,\n    0x96EF, 0x0DAD, 0x96F0, 0x2358, 0x96F1, 0x2357, 0x96F2, 0x0DAE,\n    0x96F5, 0x25FC, 0x96F6, 0x0F67, 0x96F7, 0x0F64, 0x96F8, 0x25FB,\n    0x96F9, 0x0F66, 0x96FA, 0x25F9, 0x96FB, 0x0F65, 0x96FD, 0x25FA,\n    0x96FF, 0x2854, 0x9700, 0x10EA, 0x9702, 0x2ABB, 0x9704, 0x1262,\n    0x9705, 0x2AB9, 0x9706, 0x1263, 0x9707, 0x1264, 0x9708, 0x2ABA,\n    0x9709, 0x1265, 0x970B, 0x2CF4, 0x970D, 0x138D, 0x970E, 0x138A,\n    0x970F, 0x138F, 0x9710, 0x2CF6, 0x9711, 0x138B, 0x9712, 0x2CF5,\n    0x9713, 0x138E, 0x9716, 0x138C, 0x9718, 0x2EB3, 0x9719, 0x2EB5,\n    0x971C, 0x14B2, 0x971D, 0x2EB4, 0x971E, 0x14B3, 0x971F, 0x2EB2,\n    0x9720, 0x2EB1, 0x9722, 0x3028, 0x9723, 0x3027, 0x9724, 0x1553,\n    0x9725, 0x3029, 0x9726, 0x316A, 0x9727, 0x15EF, 0x9728, 0x3169,\n    0x9729, 0x3166, 0x972A, 0x15EE, 0x972B, 0x3167, 0x972C, 0x3168,\n    0x972E, 0x326F, 0x972F, 0x3270, 0x9730, 0x1656, 0x9732, 0x16A3,\n    0x9735, 0x3331, 0x9738, 0x16A1, 0x9739, 0x16A2, 0x973A, 0x3332,\n    0x973D, 0x16E2, 0x973E, 0x16E3, 0x973F, 0x33D1, 0x9742, 0x1732,\n    0x9743, 0x34AA, 0x9744, 0x1734, 0x9746, 0x34A9, 0x9747, 0x34AB,\n    0x9748, 0x1733, 0x9749, 0x34F1, 0x974B, 0x3526, 0x9752, 0x06A1,\n    0x9756, 0x0F68, 0x9758, 0x2855, 0x975A, 0x2ABC, 0x975B, 0x1390,\n    0x975C, 0x1391, 0x975E, 0x06A2, 0x9760, 0x1266, 0x9761, 0x15F0,\n    0x9762, 0x0826, 0x9766, 0x1392, 0x9768, 0x1710, 0x9769, 0x0827,\n    0x976A, 0x20AA, 0x976C, 0x2359, 0x976E, 0x235B, 0x9770, 0x235A,\n    0x9772, 0x2600, 0x9773, 0x25FD, 0x9774, 0x0F69, 0x9776, 0x0F6A,\n    0x9777, 0x25FE, 0x9778, 0x25FF, 0x977A, 0x2857, 0x977B, 0x285C,\n    0x977C, 0x10EB, 0x977D, 0x2856, 0x977E, 0x2858, 0x977F, 0x285F,\n    0x9780, 0x285A, 0x9781, 0x285E, 0x9782, 0x285B, 0x9783, 0x2859,\n    0x9784, 0x285D, 0x9785, 0x10EC, 0x9788, 0x2ABF, 0x978A, 0x2ABD,\n    0x978B, 0x1268, 0x978D, 0x1267, 0x978E, 0x2ABE, 0x978F, 0x1269,\n    0x9794, 0x2CF9, 0x9797, 0x2CF8, 0x9798, 0x1393, 0x9799, 0x2CF7,\n    0x979A, 0x2EB6, 0x979C, 0x2EB8, 0x979D, 0x2EBA, 0x979E, 0x2EB9,\n    0x97A0, 0x14B4, 0x97A1, 0x2EB7, 0x97A2, 0x3030, 0x97A3, 0x1554,\n    0x97A4, 0x302E, 0x97A5, 0x3031, 0x97A6, 0x1555, 0x97A8, 0x302C,\n    0x97AA, 0x302F, 0x97AB, 0x302D, 0x97AC, 0x302A, 0x97AD, 0x1556,\n    0x97AE, 0x302B, 0x97B3, 0x316B, 0x97B6, 0x316D, 0x97B7, 0x316C,\n    0x97B9, 0x3271, 0x97BB, 0x3272, 0x97BF, 0x3333, 0x97C1, 0x16E5,\n    0x97C3, 0x16E4, 0x97C4, 0x344C, 0x97C5, 0x344D, 0x97C6, 0x1735,\n    0x97C7, 0x34AC, 0x97C9, 0x1756, 0x97CB, 0x0828, 0x97CC, 0x0DAF,\n    0x97CD, 0x2861, 0x97CE, 0x2860, 0x97CF, 0x2AC1, 0x97D0, 0x2AC0,\n    0x97D3, 0x14B5, 0x97D4, 0x2EBC, 0x97D5, 0x2EBB, 0x97D6, 0x3034,\n    0x97D7, 0x3032, 0x97D8, 0x3035, 0x97D9, 0x3033, 0x97DC, 0x15F1,\n    0x97DD, 0x316E, 0x97DE, 0x316F, 0x97DF, 0x3170, 0x97E1, 0x3334,\n    0x97E3, 0x33D2, 0x97E5, 0x34AD, 0x97ED, 0x0829, 0x97F0, 0x2CFA,\n    0x97F1, 0x2EBD, 0x97F3, 0x082A, 0x97F6, 0x10ED, 0x97F8, 0x2CFB,\n    0x97F9, 0x1557, 0x97FA, 0x3036, 0x97FB, 0x15F2, 0x97FD, 0x3273,\n    0x97FE, 0x3274, 0x97FF, 0x16A4, 0x9800, 0x344E, 0x9801, 0x082B,\n    0x9802, 0x0BDF, 0x9803, 0x0BE0, 0x9804, 0x20AB, 0x9805, 0x0DB0,\n    0x9806, 0x0DB1, 0x9807, 0x235C, 0x9808, 0x0DB2, 0x980A, 0x0F6E,\n    0x980C, 0x0F70, 0x980D, 0x2602, 0x980E, 0x2603, 0x980F, 0x2601,\n    0x9810, 0x0F6B, 0x9811, 0x0F6C, 0x9812, 0x0F6F, 0x9813, 0x0F6D,\n    0x9816, 0x2862, 0x9817, 0x10EE, 0x9818, 0x10EF, 0x981B, 0x2AC8,\n    0x981C, 0x126C, 0x981D, 0x2AC3, 0x981E, 0x2AC2, 0x9820, 0x2AC7,\n    0x9821, 0x126A, 0x9824, 0x139A, 0x9826, 0x2AC4, 0x9827, 0x2AC9,\n    0x9828, 0x2AC6, 0x9829, 0x2AC5, 0x982B, 0x126B, 0x982D, 0x1398,\n    0x982F, 0x2CFD, 0x9830, 0x1394, 0x9832, 0x2CFE, 0x9835, 0x2CFC,\n    0x9837, 0x1397, 0x9838, 0x1395, 0x9839, 0x1399, 0x983B, 0x1396,\n    0x9841, 0x2EBE, 0x9843, 0x2EC3, 0x9844, 0x2EBF, 0x9845, 0x2EC2,\n    0x9846, 0x14B6, 0x9848, 0x2DF2, 0x9849, 0x2EC1, 0x984A, 0x2EC0,\n    0x984C, 0x155A, 0x984D, 0x1558, 0x984E, 0x155B, 0x984F, 0x1559,\n    0x9850, 0x3037, 0x9851, 0x3038, 0x9852, 0x3039, 0x9853, 0x155C,\n    0x9857, 0x3174, 0x9858, 0x15F4, 0x9859, 0x3172, 0x985B, 0x15F5,\n    0x985C, 0x3171, 0x985D, 0x3173, 0x985E, 0x15F3, 0x985F, 0x3278,\n    0x9860, 0x3275, 0x9862, 0x3276, 0x9863, 0x3277, 0x9864, 0x3335,\n    0x9865, 0x16A6, 0x9867, 0x16A5, 0x9869, 0x33D4, 0x986A, 0x33D3,\n    0x986B, 0x16E6, 0x986F, 0x1711, 0x9870, 0x1736, 0x9871, 0x174D,\n    0x9872, 0x34F2, 0x9873, 0x3527, 0x9874, 0x3528, 0x98A8, 0x082C,\n    0x98A9, 0x235D, 0x98AC, 0x2604, 0x98AD, 0x2863, 0x98AE, 0x2864,\n    0x98AF, 0x10F0, 0x98B1, 0x10F1, 0x98B2, 0x2ACA, 0x98B3, 0x126D,\n    0x98B6, 0x14B7, 0x98B8, 0x303A, 0x98BA, 0x155D, 0x98BB, 0x3177,\n    0x98BC, 0x15F6, 0x98BD, 0x3176, 0x98BE, 0x3178, 0x98BF, 0x3175,\n    0x98C0, 0x3338, 0x98C1, 0x3279, 0x98C2, 0x327A, 0x98C4, 0x1657,\n    0x98C6, 0x3337, 0x98C9, 0x3336, 0x98CB, 0x33D5, 0x98CC, 0x3529,\n    0x98DB, 0x082D, 0x98DF, 0x082E, 0x98E2, 0x09F4, 0x98E3, 0x1E32,\n    0x98E5, 0x20AC, 0x98E7, 0x0DB3, 0x98E9, 0x0DB6, 0x98EA, 0x0DB4,\n    0x98EB, 0x235E, 0x98ED, 0x0DB8, 0x98EF, 0x0DB5, 0x98F2, 0x0DB7,\n    0x98F4, 0x0F72, 0x98F6, 0x2605, 0x98F9, 0x2606, 0x98FA, 0x2ACC,\n    0x98FC, 0x0F71, 0x98FD, 0x0F73, 0x98FE, 0x0F74, 0x9900, 0x2866,\n    0x9902, 0x2865, 0x9903, 0x10F2, 0x9905, 0x10F3, 0x9907, 0x2867,\n    0x9908, 0x2ACB, 0x9909, 0x10F5, 0x990A, 0x126E, 0x990C, 0x10F4,\n    0x9910, 0x139B, 0x9911, 0x2ACD, 0x9912, 0x1270, 0x9913, 0x126F,\n    0x9914, 0x2ACE, 0x9915, 0x2AD1, 0x9916, 0x2ACF, 0x9917, 0x2AD0,\n    0x9918, 0x1271, 0x991A, 0x13A0, 0x991B, 0x139E, 0x991E, 0x139D,\n    0x991F, 0x2D00, 0x9921, 0x139F, 0x9924, 0x2CFF, 0x9925, 0x2EC4,\n    0x9927, 0x2D01, 0x9928, 0x139C, 0x9929, 0x2D02, 0x992A, 0x2EC7,\n    0x992B, 0x2EC5, 0x992C, 0x2EC6, 0x992D, 0x2ECB, 0x992E, 0x1561,\n    0x992F, 0x2ECA, 0x9930, 0x2ECD, 0x9931, 0x2ECC, 0x9932, 0x2EC9,\n    0x9933, 0x2EC8, 0x9935, 0x14B8, 0x993A, 0x303D, 0x993C, 0x303C,\n    0x993D, 0x1560, 0x993E, 0x155E, 0x993F, 0x155F, 0x9941, 0x303B,\n    0x9943, 0x317B, 0x9945, 0x15F7, 0x9947, 0x317A, 0x9948, 0x3179,\n    0x9949, 0x15F8, 0x994B, 0x327F, 0x994C, 0x327E, 0x994E, 0x327C,\n    0x9950, 0x327B, 0x9951, 0x1659, 0x9952, 0x1658, 0x9953, 0x3280,\n    0x9954, 0x33D6, 0x9955, 0x16E7, 0x9956, 0x333A, 0x9957, 0x16A7,\n    0x9958, 0x3339, 0x9959, 0x327D, 0x995B, 0x33D7, 0x995C, 0x1712,\n    0x995E, 0x174E, 0x995F, 0x34F3, 0x9961, 0x352A, 0x9996, 0x082F,\n    0x9997, 0x20AD, 0x9998, 0x2ECE, 0x9999, 0x0830, 0x999C, 0x2869,\n    0x999D, 0x2868, 0x999E, 0x2D03, 0x99A1, 0x2ED0, 0x99A3, 0x2ECF,\n    0x99A5, 0x1562, 0x99A6, 0x317C, 0x99A7, 0x317D, 0x99A8, 0x165A,\n    0x99AB, 0x352B, 0x99AC, 0x09F5, 0x99AD, 0x0DBA, 0x99AE, 0x0DB9,\n    0x99AF, 0x2607, 0x99B0, 0x2609, 0x99B1, 0x0F76, 0x99B2, 0x2608,\n    0x99B3, 0x0F75, 0x99B4, 0x0F77, 0x99B5, 0x260A, 0x99B9, 0x286B,\n    0x99BA, 0x286D, 0x99BB, 0x286C, 0x99BD, 0x286F, 0x99C1, 0x10F6,\n    0x99C2, 0x286E, 0x99C3, 0x286A, 0x99C7, 0x2870, 0x99C9, 0x2AD8,\n    0x99CB, 0x2ADB, 0x99CC, 0x2ADD, 0x99CD, 0x2AD3, 0x99CE, 0x2AD7,\n    0x99CF, 0x2AD4, 0x99D0, 0x1273, 0x99D1, 0x1276, 0x99D2, 0x1278,\n    0x99D3, 0x2AD5, 0x99D4, 0x2AD6, 0x99D5, 0x1277, 0x99D6, 0x2AD9,\n    0x99D7, 0x2ADC, 0x99D8, 0x2ADA, 0x99D9, 0x1279, 0x99DB, 0x1275,\n    0x99DC, 0x2AD2, 0x99DD, 0x1272, 0x99DF, 0x1274, 0x99E2, 0x13A2,\n    0x99E3, 0x2D09, 0x99E4, 0x2D07, 0x99E5, 0x2D06, 0x99E7, 0x2D0C,\n    0x99E9, 0x2D0B, 0x99EA, 0x2D0A, 0x99EC, 0x2D05, 0x99ED, 0x13A1,\n    0x99EE, 0x2D04, 0x99F0, 0x2D08, 0x99F1, 0x13A3, 0x99F4, 0x2ED3,\n    0x99F6, 0x2ED7, 0x99F7, 0x2ED4, 0x99F8, 0x2ED6, 0x99F9, 0x2ED5,\n    0x99FA, 0x2ED2, 0x99FB, 0x2ED8, 0x99FC, 0x2EDB, 0x99FD, 0x2ED9,\n    0x99FE, 0x2EDA, 0x99FF, 0x14BA, 0x9A01, 0x14B9, 0x9A02, 0x2ED1,\n    0x9A03, 0x2EDC, 0x9A04, 0x3042, 0x9A05, 0x3045, 0x9A06, 0x3047,\n    0x9A07, 0x3046, 0x9A09, 0x3040, 0x9A0A, 0x3044, 0x9A0B, 0x303F,\n    0x9A0D, 0x3041, 0x9A0E, 0x1563, 0x9A0F, 0x303E, 0x9A11, 0x3043,\n    0x9A14, 0x318A, 0x9A15, 0x317F, 0x9A16, 0x15F9, 0x9A19, 0x15FA,\n    0x9A1A, 0x317E, 0x9A1B, 0x3183, 0x9A1C, 0x3189, 0x9A1D, 0x3181,\n    0x9A1E, 0x3188, 0x9A20, 0x3185, 0x9A22, 0x3184, 0x9A23, 0x3187,\n    0x9A24, 0x3182, 0x9A25, 0x3180, 0x9A27, 0x3186, 0x9A29, 0x3287,\n    0x9A2A, 0x3285, 0x9A2B, 0x165B, 0x9A2C, 0x3284, 0x9A2D, 0x328A,\n    0x9A2E, 0x3288, 0x9A30, 0x165C, 0x9A31, 0x3283, 0x9A32, 0x3281,\n    0x9A34, 0x3282, 0x9A35, 0x165E, 0x9A36, 0x3286, 0x9A37, 0x165D,\n    0x9A38, 0x3289, 0x9A39, 0x333B, 0x9A3A, 0x3341, 0x9A3D, 0x333C,\n    0x9A3E, 0x16AB, 0x9A3F, 0x3342, 0x9A40, 0x16AA, 0x9A41, 0x3340,\n    0x9A42, 0x333F, 0x9A43, 0x16A9, 0x9A44, 0x333E, 0x9A45, 0x16A8,\n    0x9A46, 0x333D, 0x9A48, 0x33DD, 0x9A49, 0x33DF, 0x9A4A, 0x33DE,\n    0x9A4C, 0x33DB, 0x9A4D, 0x16E9, 0x9A4E, 0x33D8, 0x9A4F, 0x33DC,\n    0x9A50, 0x33E1, 0x9A52, 0x33E0, 0x9A53, 0x33D9, 0x9A54, 0x33DA,\n    0x9A55, 0x16E8, 0x9A56, 0x344F, 0x9A57, 0x1715, 0x9A59, 0x3450,\n    0x9A5A, 0x1713, 0x9A5B, 0x1714, 0x9A5E, 0x34AE, 0x9A5F, 0x1737,\n    0x9A60, 0x3510, 0x9A62, 0x1757, 0x9A64, 0x352C, 0x9A65, 0x1758,\n    0x9A66, 0x352D, 0x9A67, 0x352E, 0x9A68, 0x353C, 0x9A69, 0x353B,\n    0x9A6A, 0x1767, 0x9A6B, 0x3544, 0x9AA8, 0x09F6, 0x9AAB, 0x260C,\n    0x9AAD, 0x260B, 0x9AAF, 0x10F7, 0x9AB0, 0x10F8, 0x9AB1, 0x2871,\n    0x9AB3, 0x2ADE, 0x9AB4, 0x2D0F, 0x9AB7, 0x127A, 0x9AB8, 0x13A4,\n    0x9AB9, 0x2D0D, 0x9ABB, 0x2D10, 0x9ABC, 0x13A5, 0x9ABE, 0x2EDD,\n    0x9ABF, 0x2D0E, 0x9AC0, 0x3048, 0x9AC1, 0x1564, 0x9AC2, 0x318B,\n    0x9AC6, 0x328D, 0x9AC7, 0x328B, 0x9ACA, 0x328C, 0x9ACD, 0x3343,\n    0x9ACF, 0x16AC, 0x9AD0, 0x33E2, 0x9AD1, 0x1718, 0x9AD2, 0x16EA,\n    0x9AD3, 0x1716, 0x9AD4, 0x1717, 0x9AD5, 0x34AF, 0x9AD6, 0x174F,\n    0x9AD8, 0x09F7, 0x9ADC, 0x3049, 0x9ADF, 0x1E33, 0x9AE1, 0x0F78,\n    0x9AE3, 0x2872, 0x9AE6, 0x10F9, 0x9AE7, 0x2873, 0x9AEB, 0x2AE0,\n    0x9AEC, 0x2ADF, 0x9AED, 0x13A7, 0x9AEE, 0x127B, 0x9AEF, 0x127C,\n    0x9AF1, 0x2AE3, 0x9AF2, 0x2AE2, 0x9AF3, 0x2AE1, 0x9AF6, 0x2D11,\n    0x9AF7, 0x2D14, 0x9AF9, 0x2D13, 0x9AFA, 0x2D12, 0x9AFB, 0x13A6,\n    0x9AFC, 0x2EE1, 0x9AFD, 0x2EDF, 0x9AFE, 0x2EDE, 0x9B01, 0x2EE0,\n    0x9B03, 0x1565, 0x9B04, 0x304B, 0x9B05, 0x304C, 0x9B06, 0x1566,\n    0x9B08, 0x304A, 0x9B0A, 0x318D, 0x9B0B, 0x318C, 0x9B0C, 0x318F,\n    0x9B0D, 0x15FB, 0x9B0E, 0x318E, 0x9B10, 0x328E, 0x9B11, 0x3290,\n    0x9B12, 0x328F, 0x9B15, 0x3344, 0x9B16, 0x3347, 0x9B17, 0x3345,\n    0x9B18, 0x3346, 0x9B19, 0x33E3, 0x9B1A, 0x16EB, 0x9B1E, 0x3451,\n    0x9B1F, 0x3452, 0x9B20, 0x3453, 0x9B22, 0x1738, 0x9B23, 0x1750,\n    0x9B24, 0x352F, 0x9B25, 0x09F8, 0x9B27, 0x127D, 0x9B28, 0x13A8,\n    0x9B29, 0x304D, 0x9B2B, 0x33E4, 0x9B2E, 0x3511, 0x9B2F, 0x1E34,\n    0x9B31, 0x1768, 0x9B32, 0x09F9, 0x9B33, 0x2D15, 0x9B35, 0x304E,\n    0x9B37, 0x3190, 0x9B3A, 0x3348, 0x9B3B, 0x33E5, 0x9B3C, 0x09FA,\n    0x9B3E, 0x2874, 0x9B3F, 0x2875, 0x9B41, 0x10FA, 0x9B42, 0x10FB,\n    0x9B43, 0x2AE5, 0x9B44, 0x127F, 0x9B45, 0x127E, 0x9B46, 0x2AE4,\n    0x9B48, 0x2EE2, 0x9B4A, 0x304F, 0x9B4B, 0x3051, 0x9B4C, 0x3050,\n    0x9B4D, 0x1569, 0x9B4E, 0x1568, 0x9B4F, 0x1567, 0x9B51, 0x16AE,\n    0x9B52, 0x3349, 0x9B54, 0x16AD, 0x9B55, 0x33E7, 0x9B56, 0x33E6,\n    0x9B58, 0x1739, 0x9B59, 0x34B0, 0x9B5A, 0x0BE1, 0x9B5B, 0x260D,\n    0x9B5F, 0x2878, 0x9B60, 0x2876, 0x9B61, 0x2877, 0x9B64, 0x2AEE,\n    0x9B66, 0x2AE9, 0x9B67, 0x2AE6, 0x9B68, 0x2AED, 0x9B6C, 0x2AEF,\n    0x9B6F, 0x1281, 0x9B70, 0x2AEC, 0x9B71, 0x2AE8, 0x9B74, 0x2AE7,\n    0x9B75, 0x2AEB, 0x9B76, 0x2AEA, 0x9B77, 0x1280, 0x9B7A, 0x2D20,\n    0x9B7B, 0x2D1B, 0x9B7C, 0x2D19, 0x9B7D, 0x2D22, 0x9B7E, 0x2D1A,\n    0x9B80, 0x2D16, 0x9B82, 0x2D1C, 0x9B85, 0x2D17, 0x9B86, 0x2EEB,\n    0x9B87, 0x2D18, 0x9B88, 0x2D23, 0x9B90, 0x2D1F, 0x9B91, 0x13A9,\n    0x9B92, 0x2D1E, 0x9B93, 0x2D1D, 0x9B95, 0x2D21, 0x9B9A, 0x2EE3,\n    0x9B9B, 0x2EE6, 0x9B9E, 0x2EE5, 0x9BA0, 0x2EED, 0x9BA1, 0x2EE8,\n    0x9BA2, 0x2EEC, 0x9BA4, 0x2EEA, 0x9BA5, 0x2EE9, 0x9BA6, 0x2EE7,\n    0x9BA8, 0x2EE4, 0x9BAA, 0x14BD, 0x9BAB, 0x14BC, 0x9BAD, 0x14BE,\n    0x9BAE, 0x14BB, 0x9BAF, 0x2EEE, 0x9BB5, 0x3057, 0x9BB6, 0x305A,\n    0x9BB8, 0x3058, 0x9BB9, 0x305C, 0x9BBD, 0x305D, 0x9BBF, 0x3055,\n    0x9BC0, 0x156E, 0x9BC1, 0x3056, 0x9BC3, 0x3054, 0x9BC4, 0x305B,\n    0x9BC6, 0x3053, 0x9BC7, 0x3052, 0x9BC8, 0x156D, 0x9BC9, 0x156B,\n    0x9BCA, 0x156A, 0x9BD3, 0x3059, 0x9BD4, 0x3199, 0x9BD5, 0x319F,\n    0x9BD6, 0x15FE, 0x9BD7, 0x319A, 0x9BD9, 0x319D, 0x9BDA, 0x31A1,\n    0x9BDB, 0x15FF, 0x9BDC, 0x319C, 0x9BDE, 0x3194, 0x9BE0, 0x3193,\n    0x9BE1, 0x31A0, 0x9BE2, 0x3197, 0x9BE4, 0x3195, 0x9BE5, 0x319E,\n    0x9BE6, 0x3196, 0x9BE7, 0x15FD, 0x9BE8, 0x15FC, 0x9BEA, 0x3191,\n    0x9BEB, 0x3192, 0x9BEC, 0x319B, 0x9BF0, 0x3198, 0x9BF7, 0x3293,\n    0x9BF8, 0x3296, 0x9BFD, 0x156C, 0x9C05, 0x3294, 0x9C06, 0x329A,\n    0x9C07, 0x3298, 0x9C08, 0x3292, 0x9C09, 0x329D, 0x9C0B, 0x3291,\n    0x9C0D, 0x1660, 0x9C0E, 0x3299, 0x9C12, 0x3295, 0x9C13, 0x165F,\n    0x9C14, 0x329C, 0x9C17, 0x329B, 0x9C1C, 0x334C, 0x9C1D, 0x334B,\n    0x9C21, 0x3352, 0x9C23, 0x334E, 0x9C24, 0x3351, 0x9C25, 0x16B0,\n    0x9C28, 0x334F, 0x9C29, 0x3350, 0x9C2B, 0x334A, 0x9C2C, 0x334D,\n    0x9C2D, 0x16AF, 0x9C31, 0x16ED, 0x9C32, 0x33F2, 0x9C33, 0x33ED,\n    0x9C34, 0x33F1, 0x9C36, 0x33F4, 0x9C37, 0x33F0, 0x9C39, 0x33EC,\n    0x9C3B, 0x16EF, 0x9C3C, 0x33EF, 0x9C3D, 0x33F3, 0x9C3E, 0x16EE,\n    0x9C3F, 0x33EA, 0x9C40, 0x3297, 0x9C41, 0x33EE, 0x9C44, 0x33EB,\n    0x9C46, 0x33E8, 0x9C48, 0x33E9, 0x9C49, 0x16EC, 0x9C4A, 0x3457,\n    0x9C4B, 0x3459, 0x9C4C, 0x345C, 0x9C4D, 0x3458, 0x9C4E, 0x345D,\n    0x9C50, 0x3456, 0x9C52, 0x3454, 0x9C54, 0x1719, 0x9C55, 0x345A,\n    0x9C56, 0x171B, 0x9C57, 0x171A, 0x9C58, 0x3455, 0x9C59, 0x345B,\n    0x9C5E, 0x34B5, 0x9C5F, 0x173A, 0x9C60, 0x34B6, 0x9C62, 0x34B4,\n    0x9C63, 0x34B1, 0x9C66, 0x34B3, 0x9C67, 0x34B2, 0x9C68, 0x34F4,\n    0x9C6D, 0x34F6, 0x9C6E, 0x34F5, 0x9C71, 0x3514, 0x9C73, 0x3513,\n    0x9C74, 0x3512, 0x9C75, 0x3515, 0x9C77, 0x1760, 0x9C78, 0x1761,\n    0x9C79, 0x3541, 0x9C7A, 0x3545, 0x9CE5, 0x0BE2, 0x9CE6, 0x235F,\n    0x9CE7, 0x2610, 0x9CE9, 0x0F79, 0x9CEA, 0x260E, 0x9CED, 0x260F,\n    0x9CF1, 0x2879, 0x9CF2, 0x287A, 0x9CF3, 0x10FE, 0x9CF4, 0x10FC,\n    0x9CF5, 0x287B, 0x9CF6, 0x10FD, 0x9CF7, 0x2AF4, 0x9CF9, 0x2AF7,\n    0x9CFA, 0x2AF1, 0x9CFB, 0x2AF8, 0x9CFC, 0x2AF0, 0x9CFD, 0x2AF2,\n    0x9CFF, 0x2AF3, 0x9D00, 0x2AF6, 0x9D03, 0x1284, 0x9D04, 0x2AFB,\n    0x9D05, 0x2AFA, 0x9D06, 0x1282, 0x9D07, 0x2AF5, 0x9D08, 0x2AF9,\n    0x9D09, 0x1283, 0x9D10, 0x2D2D, 0x9D12, 0x13AE, 0x9D14, 0x2D28,\n    0x9D15, 0x13AA, 0x9D17, 0x2D25, 0x9D18, 0x2D2B, 0x9D19, 0x2D2E,\n    0x9D1B, 0x13AF, 0x9D1D, 0x2D2A, 0x9D1E, 0x2D27, 0x9D1F, 0x2D2F,\n    0x9D20, 0x2D26, 0x9D22, 0x2D2C, 0x9D23, 0x13AB, 0x9D25, 0x2D24,\n    0x9D26, 0x13AC, 0x9D28, 0x13AD, 0x9D29, 0x2D29, 0x9D2D, 0x2F00,\n    0x9D2E, 0x2EF3, 0x9D2F, 0x2EF4, 0x9D30, 0x2EF7, 0x9D31, 0x2EF5,\n    0x9D33, 0x2EEF, 0x9D36, 0x2EF2, 0x9D37, 0x2EFC, 0x9D38, 0x2EF6,\n    0x9D3B, 0x14BF, 0x9D3D, 0x2EFE, 0x9D3E, 0x2EFB, 0x9D3F, 0x14C0,\n    0x9D40, 0x2EFD, 0x9D41, 0x2EF0, 0x9D42, 0x2EF9, 0x9D43, 0x2EFA,\n    0x9D45, 0x2EF8, 0x9D4A, 0x3061, 0x9D4B, 0x3063, 0x9D4C, 0x3066,\n    0x9D4F, 0x3060, 0x9D51, 0x156F, 0x9D52, 0x3068, 0x9D53, 0x305F,\n    0x9D54, 0x3069, 0x9D56, 0x3065, 0x9D57, 0x3067, 0x9D58, 0x306B,\n    0x9D59, 0x3064, 0x9D5A, 0x306C, 0x9D5B, 0x3062, 0x9D5C, 0x305E,\n    0x9D5D, 0x1570, 0x9D5F, 0x306A, 0x9D60, 0x1571, 0x9D61, 0x1601,\n    0x9D67, 0x2EF1, 0x9D68, 0x31BB, 0x9D69, 0x31B2, 0x9D6A, 0x1603,\n    0x9D6B, 0x31AE, 0x9D6C, 0x1604, 0x9D6F, 0x31B7, 0x9D70, 0x31B1,\n    0x9D71, 0x31A7, 0x9D72, 0x1602, 0x9D73, 0x31B4, 0x9D74, 0x31AF,\n    0x9D75, 0x31B0, 0x9D77, 0x31A2, 0x9D78, 0x31A9, 0x9D79, 0x31B8,\n    0x9D7B, 0x31B5, 0x9D7D, 0x31AD, 0x9D7F, 0x31B9, 0x9D80, 0x31A8,\n    0x9D81, 0x31A3, 0x9D82, 0x31B6, 0x9D84, 0x31A5, 0x9D85, 0x31B3,\n    0x9D86, 0x31AA, 0x9D87, 0x31BA, 0x9D88, 0x31A6, 0x9D89, 0x1600,\n    0x9D8A, 0x31A4, 0x9D8B, 0x31AB, 0x9D8C, 0x31AC, 0x9D90, 0x32A4,\n    0x9D92, 0x32A2, 0x9D94, 0x32A7, 0x9D96, 0x32B3, 0x9D97, 0x32AA,\n    0x9D98, 0x32A3, 0x9D99, 0x329F, 0x9D9A, 0x32AC, 0x9D9B, 0x32A5,\n    0x9D9C, 0x32A8, 0x9D9D, 0x32A1, 0x9D9E, 0x32AF, 0x9D9F, 0x329E,\n    0x9DA0, 0x32A6, 0x9DA1, 0x32AB, 0x9DA2, 0x32AD, 0x9DA3, 0x32B0,\n    0x9DA4, 0x32A0, 0x9DA6, 0x32B4, 0x9DA7, 0x32B5, 0x9DA8, 0x32AE,\n    0x9DA9, 0x32B2, 0x9DAA, 0x32A9, 0x9DAC, 0x3362, 0x9DAD, 0x3365,\n    0x9DAF, 0x16B1, 0x9DB1, 0x3364, 0x9DB2, 0x3369, 0x9DB3, 0x3367,\n    0x9DB4, 0x16B2, 0x9DB5, 0x335E, 0x9DB6, 0x3354, 0x9DB7, 0x3353,\n    0x9DB8, 0x16B4, 0x9DB9, 0x3360, 0x9DBA, 0x3361, 0x9DBB, 0x335D,\n    0x9DBC, 0x3355, 0x9DBE, 0x335A, 0x9DBF, 0x32B1, 0x9DC1, 0x3356,\n    0x9DC2, 0x16B3, 0x9DC3, 0x335C, 0x9DC5, 0x335B, 0x9DC7, 0x3357,\n    0x9DC8, 0x3363, 0x9DCA, 0x3358, 0x9DCB, 0x33F9, 0x9DCC, 0x3366,\n    0x9DCD, 0x3368, 0x9DCE, 0x335F, 0x9DCF, 0x3359, 0x9DD0, 0x33FA,\n    0x9DD1, 0x33FC, 0x9DD2, 0x33F6, 0x9DD3, 0x16F0, 0x9DD5, 0x3403,\n    0x9DD6, 0x3401, 0x9DD7, 0x16F1, 0x9DD8, 0x3400, 0x9DD9, 0x33FF,\n    0x9DDA, 0x33F8, 0x9DDB, 0x33F5, 0x9DDC, 0x33FB, 0x9DDD, 0x3404,\n    0x9DDE, 0x33F7, 0x9DDF, 0x33FD, 0x9DE1, 0x3466, 0x9DE2, 0x346B,\n    0x9DE3, 0x3461, 0x9DE4, 0x3464, 0x9DE5, 0x171C, 0x9DE6, 0x3468,\n    0x9DE8, 0x346F, 0x9DE9, 0x33FE, 0x9DEB, 0x3462, 0x9DEC, 0x346C,\n    0x9DED, 0x3470, 0x9DEE, 0x3467, 0x9DEF, 0x3460, 0x9DF0, 0x346A,\n    0x9DF2, 0x3469, 0x9DF3, 0x346E, 0x9DF4, 0x346D, 0x9DF5, 0x3402,\n    0x9DF6, 0x3465, 0x9DF7, 0x345F, 0x9DF8, 0x3463, 0x9DF9, 0x173B,\n    0x9DFA, 0x173C, 0x9DFB, 0x345E, 0x9DFD, 0x34C1, 0x9DFE, 0x34B8,\n    0x9DFF, 0x34C0, 0x9E00, 0x34BD, 0x9E01, 0x34BE, 0x9E02, 0x34B7,\n    0x9E03, 0x34BA, 0x9E04, 0x34C2, 0x9E05, 0x34BC, 0x9E06, 0x34BB,\n    0x9E07, 0x34B9, 0x9E09, 0x34BF, 0x9E0B, 0x34F7, 0x9E0D, 0x34F8,\n    0x9E0F, 0x34FA, 0x9E10, 0x34F9, 0x9E11, 0x34FC, 0x9E12, 0x34FB,\n    0x9E13, 0x3517, 0x9E14, 0x3516, 0x9E15, 0x3530, 0x9E17, 0x3531,\n    0x9E19, 0x353D, 0x9E1A, 0x1765, 0x9E1B, 0x1769, 0x9E1D, 0x3546,\n    0x9E1E, 0x176A, 0x9E75, 0x0BE3, 0x9E79, 0x1661, 0x9E7A, 0x336A,\n    0x9E7C, 0x173D, 0x9E7D, 0x173E, 0x9E7F, 0x0BE4, 0x9E80, 0x2611,\n    0x9E82, 0x0F7A, 0x9E83, 0x2AFC, 0x9E86, 0x2D31, 0x9E87, 0x2D32,\n    0x9E88, 0x2D30, 0x9E89, 0x2F02, 0x9E8A, 0x2F01, 0x9E8B, 0x14C1,\n    0x9E8C, 0x306E, 0x9E8D, 0x2F03, 0x9E8E, 0x306D, 0x9E91, 0x31BD,\n    0x9E92, 0x1605, 0x9E93, 0x1607, 0x9E94, 0x31BC, 0x9E97, 0x1606,\n    0x9E99, 0x32B6, 0x9E9A, 0x32B8, 0x9E9B, 0x32B7, 0x9E9C, 0x336B,\n    0x9E9D, 0x16B5, 0x9E9F, 0x171D, 0x9EA0, 0x34C3, 0x9EA1, 0x34FD,\n    0x9EA4, 0x354A, 0x9EA5, 0x0BE5, 0x9EA7, 0x287C, 0x9EA9, 0x1285,\n    0x9EAD, 0x2D34, 0x9EAE, 0x2D33, 0x9EB0, 0x2F04, 0x9EB4, 0x1608,\n    0x9EB5, 0x1662, 0x9EB6, 0x3405, 0x9EB7, 0x3542, 0x9EBB, 0x0BE6,\n    0x9EBC, 0x10FF, 0x9EBE, 0x1286, 0x9EC0, 0x31BE, 0x9EC2, 0x3471,\n    0x9EC3, 0x0DBB, 0x9EC8, 0x2F05, 0x9ECC, 0x1751, 0x9ECD, 0x0DBC,\n    0x9ECE, 0x1287, 0x9ECF, 0x14C2, 0x9ED0, 0x3472, 0x9ED1, 0x0DBD,\n    0x9ED3, 0x2AFD, 0x9ED4, 0x13B1, 0x9ED5, 0x2D35, 0x9ED6, 0x2D36,\n    0x9ED8, 0x13B0, 0x9EDA, 0x2F06, 0x9EDB, 0x14C6, 0x9EDC, 0x14C4,\n    0x9EDD, 0x14C5, 0x9EDE, 0x14C3, 0x9EDF, 0x306F, 0x9EE0, 0x1572,\n    0x9EE4, 0x32BA, 0x9EE5, 0x32B9, 0x9EE6, 0x32BC, 0x9EE7, 0x32BB,\n    0x9EE8, 0x1663, 0x9EEB, 0x336C, 0x9EED, 0x336E, 0x9EEE, 0x336D,\n    0x9EEF, 0x16B6, 0x9EF0, 0x3406, 0x9EF2, 0x3473, 0x9EF3, 0x3474,\n    0x9EF4, 0x171E, 0x9EF5, 0x34FE, 0x9EF6, 0x3518, 0x9EF7, 0x1762,\n    0x9EF9, 0x2360, 0x9EFA, 0x2D37, 0x9EFB, 0x2F07, 0x9EFC, 0x31BF,\n    0x9EFD, 0x2612, 0x9EFF, 0x2F08, 0x9F00, 0x3071, 0x9F01, 0x3070,\n    0x9F06, 0x3475, 0x9F07, 0x173F, 0x9F09, 0x34FF, 0x9F0A, 0x3519,\n    0x9F0E, 0x0F7B, 0x9F0F, 0x2AFE, 0x9F10, 0x2AFF, 0x9F12, 0x2D38,\n    0x9F13, 0x0F7C, 0x9F15, 0x1573, 0x9F16, 0x3072, 0x9F18, 0x3370,\n    0x9F19, 0x16B7, 0x9F1A, 0x3371, 0x9F1B, 0x336F, 0x9F1C, 0x3476,\n    0x9F1E, 0x34C4, 0x9F20, 0x0F7D, 0x9F22, 0x2F0B, 0x9F23, 0x2F0A,\n    0x9F24, 0x2F09, 0x9F25, 0x3073, 0x9F28, 0x3077, 0x9F29, 0x3076,\n    0x9F2A, 0x3075, 0x9F2B, 0x3074, 0x9F2C, 0x1574, 0x9F2D, 0x31C0,\n    0x9F2E, 0x32BE, 0x9F2F, 0x1664, 0x9F30, 0x32BD, 0x9F31, 0x3372,\n    0x9F32, 0x3409, 0x9F33, 0x3408, 0x9F34, 0x16F2, 0x9F35, 0x3407,\n    0x9F36, 0x3479, 0x9F37, 0x3478, 0x9F38, 0x3477, 0x9F3B, 0x1100,\n    0x9F3D, 0x2D39, 0x9F3E, 0x14C7, 0x9F40, 0x31C1, 0x9F41, 0x31C2,\n    0x9F42, 0x340A, 0x9F43, 0x347A, 0x9F46, 0x34C5, 0x9F47, 0x3500,\n    0x9F48, 0x3532, 0x9F49, 0x354C, 0x9F4A, 0x1101, 0x9F4B, 0x14C8,\n    0x9F4C, 0x3078, 0x9F4D, 0x31C3, 0x9F4E, 0x3373, 0x9F4F, 0x347B,\n    0x9F52, 0x1289, 0x9F54, 0x2F0C, 0x9F55, 0x3079, 0x9F56, 0x31C4,\n    0x9F57, 0x31C5, 0x9F58, 0x31C6, 0x9F59, 0x32C3, 0x9F5B, 0x32BF,\n    0x9F5C, 0x16B8, 0x9F5D, 0x32C2, 0x9F5E, 0x32C1, 0x9F5F, 0x1665,\n    0x9F60, 0x32C0, 0x9F61, 0x1667, 0x9F63, 0x1666, 0x9F64, 0x3375,\n    0x9F65, 0x3374, 0x9F66, 0x16B9, 0x9F67, 0x16BA, 0x9F6A, 0x16F4,\n    0x9F6B, 0x340B, 0x9F6C, 0x16F3, 0x9F6E, 0x347E, 0x9F6F, 0x347F,\n    0x9F70, 0x347D, 0x9F71, 0x347C, 0x9F72, 0x1741, 0x9F74, 0x34C6,\n    0x9F75, 0x34C7, 0x9F76, 0x34C8, 0x9F77, 0x1740, 0x9F78, 0x3501,\n    0x9F79, 0x3504, 0x9F7A, 0x3503, 0x9F7B, 0x3502, 0x9F7E, 0x354B,\n    0x9F8D, 0x13B2, 0x9F90, 0x157C, 0x9F91, 0x32C4, 0x9F92, 0x3376,\n    0x9F94, 0x16F5, 0x9F95, 0x340C, 0x9F98, 0x354D, 0x9F9C, 0x13B3,\n    0x9FA0, 0x2F0D, 0x9FA2, 0x340D, 0x9FA4, 0x351A, 0xE01F, 0x083A,\n    0xE026, 0x09FD, 0xE05B, 0x030D, 0xE063, 0x016B, 0xE073, 0x0860,\n    0xE0F3, 0x0C23, 0xE12E, 0x17E4, 0xE149, 0x212F, 0xE191, 0x115F,\n    0xE1BA, 0x0C79, 0xE1C9, 0x04C3, 0xE22C, 0x18BD, 0xE22D, 0x0CBD,\n    0xE230, 0x0CA5, 0xE266, 0x0CCE, 0xE2A3, 0x0E84, 0xE2BC, 0x0120,\n    0xE2EF, 0x1BA8, 0xE33A, 0x1055, 0xE340, 0x2DE8, 0xE34F, 0x0121,\n    0xE35A, 0x106B, 0xE363, 0x1326, 0xE37C, 0x066B, 0xE37F, 0x132E,\n    0xE3C5, 0x0D35, 0xE3D7, 0x27C2, 0xE3DC, 0x22AD, 0xE417, 0x134C,\n    0xE44A, 0x09CE, 0xE478, 0x0BC7, 0xE485, 0x36E9, 0xE4C5, 0x1391,\n    0xE4DA, 0x16A4, 0xE545, 0x3072, 0xE5D2, 0x0119, 0xE5D3, 0x011A,\n    0xE5D4, 0x011C, 0xE5D5, 0x011B, 0xE5F4, 0x297C, 0xE6C6, 0x1D06,\n    0xE727, 0x29A1, 0xE7D3, 0x181B, 0xE893, 0x2B24, 0xEB40, 0x2F50,\n    0xEB42, 0x1725, 0xEB45, 0x32ED, 0xEB6E, 0x2AD9, 0xEB86, 0x1C14,\n    0xEB9E, 0x12E9, 0xEBA9, 0x2CAE, 0xEBBA, 0x1A64, 0xEBC9, 0x1404,\n    0xEBCF, 0x2324, 0xEBD2, 0x346A, 0xEBDE, 0x2291, 0xEC01, 0x1787,\n    0xEC02, 0x095F, 0xEC15, 0x1E99, 0xEC5B, 0x25C1, 0xEC5E, 0x0D0C,\n    0xECA6, 0x05E6, 0xED28, 0x0728, 0xED6E, 0x24B6, 0xED7C, 0x1806,\n    0xED9E, 0x3511, 0xEDE7, 0x0F82, 0xEE52, 0x05F2, 0xEE98, 0x247D,\n    0xF6B1, 0x01FA, 0xF6B2, 0x01FB, 0xF6B3, 0x01FC, 0xF6B4, 0x01FD,\n    0xF6B5, 0x01FE, 0xF6B6, 0x01FF, 0xF6B7, 0x0200, 0xF6B8, 0x0201,\n    0xF6B9, 0x0202, 0xF6BA, 0x0203, 0xF6BB, 0x0204, 0xF6BC, 0x0205,\n    0xF6BD, 0x0206, 0xF6BE, 0x0207, 0xF6BF, 0x0208, 0xF6C0, 0x0209,\n    0xF6C1, 0x020A, 0xF6C2, 0x020B, 0xF6C3, 0x020C, 0xF6C4, 0x020D,\n    0xF6C5, 0x020E, 0xF6C6, 0x020F, 0xF6C7, 0x0210, 0xF6C8, 0x0211,\n    0xF6C9, 0x0212, 0xF6CA, 0x0213, 0xF6CB, 0x0214, 0xF6CC, 0x0215,\n    0xF6CD, 0x0216, 0xF6CE, 0x0217, 0xF6CF, 0x0219, 0xF6D0, 0x021A,\n    0xF6D1, 0x021B, 0xF6D2, 0x021C, 0xF6D3, 0x021D, 0xF6D4, 0x021E,\n    0xF6D5, 0x021F, 0xF6D6, 0x0220, 0xF6D7, 0x0221, 0xF6D8, 0x0222,\n    0xF6D9, 0x0223, 0xF6DA, 0x0224, 0xF6DB, 0x0225, 0xF6DC, 0x0226,\n    0xF6DD, 0x0227, 0xF6DE, 0x0228, 0xF6E0, 0x022A, 0xF6E1, 0x022B,\n    0xF6E2, 0x022C, 0xF6E4, 0x022E, 0xF6E6, 0x0230, 0xF6E8, 0x35B3,\n    0xF6E9, 0x35B4, 0xF6EA, 0x35B5, 0xF6EB, 0x35B6, 0xF6EC, 0x35B7,\n    0xF6ED, 0x35B8, 0xF6F0, 0x35BA, 0xF6F1, 0x35BB, 0xF6F2, 0x35BC,\n    0xF6F3, 0x35BD, 0xF6F4, 0x35BE, 0xF6F5, 0x35BF, 0xF6F6, 0x35C0,\n    0xF6F7, 0x35C1, 0xF6F8, 0x35C2, 0xF6F9, 0x35C3, 0xF6FA, 0x35C4,\n    0xF6FB, 0x35C5, 0xF6FC, 0x35C6, 0xF6FD, 0x35C7, 0xF6FE, 0x35C8,\n    0xF6FF, 0x35C9, 0xF700, 0x35CA, 0xF701, 0x35CB, 0xF702, 0x35CC,\n    0xF703, 0x35CD, 0xF704, 0x35CE, 0xF705, 0x35CF, 0xF706, 0x35D0,\n    0xF707, 0x35D1, 0xF708, 0x35D2, 0xF709, 0x35D3, 0xF70A, 0x35D4,\n    0xF70B, 0x35D5, 0xF70C, 0x35D6, 0xF70D, 0x35D7, 0xF70E, 0x35D8,\n    0xF70F, 0x35D9, 0xF710, 0x35DA, 0xF711, 0x35DB, 0xF712, 0x35DC,\n    0xF713, 0x35DD, 0xF714, 0x35DE, 0xF715, 0x35DF, 0xF716, 0x35E0,\n    0xF717, 0x35E1, 0xF718, 0x35E2, 0xF719, 0x35E3, 0xF71A, 0x35E4,\n    0xF71B, 0x35E5, 0xF71C, 0x35E6, 0xF71D, 0x35E7, 0xF71E, 0x35E8,\n    0xF71F, 0x35E9, 0xF720, 0x35EA, 0xF721, 0x35EB, 0xF722, 0x35EC,\n    0xF723, 0x35ED, 0xF724, 0x35EE, 0xF725, 0x35EF, 0xF726, 0x35F0,\n    0xF727, 0x35F1, 0xF728, 0x35F2, 0xF729, 0x35F3, 0xF72A, 0x35F4,\n    0xF72B, 0x35F5, 0xF72C, 0x35F6, 0xF72D, 0x35F7, 0xF72E, 0x35F8,\n    0xF72F, 0x35F9, 0xF730, 0x35FA, 0xF731, 0x35FB, 0xF732, 0x35FC,\n    0xF733, 0x35FD, 0xF734, 0x35FE, 0xF735, 0x35FF, 0xF736, 0x3600,\n    0xF737, 0x3601, 0xF738, 0x3602, 0xF739, 0x3603, 0xF73A, 0x3604,\n    0xF73B, 0x3605, 0xF73C, 0x3606, 0xF73D, 0x3607, 0xF73E, 0x3608,\n    0xF73F, 0x3609, 0xF740, 0x360A, 0xF741, 0x360B, 0xF742, 0x360C,\n    0xF743, 0x360D, 0xF744, 0x360E, 0xF745, 0x360F, 0xF746, 0x3610,\n    0xF747, 0x3611, 0xF748, 0x3612, 0xF749, 0x3613, 0xF74A, 0x3614,\n    0xF74B, 0x3615, 0xF74C, 0x3616, 0xF74D, 0x3617, 0xF74E, 0x3618,\n    0xF74F, 0x3619, 0xF750, 0x361A, 0xF751, 0x361B, 0xF752, 0x361C,\n    0xF753, 0x361D, 0xF754, 0x361E, 0xF755, 0x361F, 0xF756, 0x3620,\n    0xF757, 0x3621, 0xF758, 0x3622, 0xF759, 0x3623, 0xF75A, 0x3624,\n    0xF75B, 0x3625, 0xF75C, 0x3626, 0xF75D, 0x3627, 0xF75E, 0x3628,\n    0xF75F, 0x3629, 0xF760, 0x362A, 0xF761, 0x362B, 0xF762, 0x362C,\n    0xF763, 0x362D, 0xF764, 0x362E, 0xF765, 0x362F, 0xF766, 0x3630,\n    0xF767, 0x3631, 0xF768, 0x3632, 0xF769, 0x3633, 0xF76A, 0x3634,\n    0xF76B, 0x3635, 0xF76C, 0x3636, 0xF76D, 0x3637, 0xF76E, 0x3638,\n    0xF76F, 0x3639, 0xF770, 0x363A, 0xF771, 0x363B, 0xF772, 0x363C,\n    0xF773, 0x363D, 0xF774, 0x363E, 0xF775, 0x363F, 0xF776, 0x3640,\n    0xF777, 0x3641, 0xF778, 0x3642, 0xF779, 0x3643, 0xF77A, 0x3644,\n    0xF77B, 0x3645, 0xF77C, 0x3646, 0xF77D, 0x3647, 0xF77E, 0x3648,\n    0xF77F, 0x3649, 0xF780, 0x364A, 0xF781, 0x364B, 0xF782, 0x364C,\n    0xF783, 0x364D, 0xF784, 0x364E, 0xF785, 0x364F, 0xF786, 0x3650,\n    0xF787, 0x3651, 0xF788, 0x3652, 0xF789, 0x3653, 0xF78A, 0x3654,\n    0xF78B, 0x3655, 0xF78C, 0x3656, 0xF78D, 0x3657, 0xF78E, 0x3658,\n    0xF78F, 0x3659, 0xF790, 0x365A, 0xF791, 0x365B, 0xF792, 0x365C,\n    0xF793, 0x365D, 0xF794, 0x365E, 0xF795, 0x365F, 0xF796, 0x3660,\n    0xF797, 0x3661, 0xF798, 0x3662, 0xF799, 0x3663, 0xF79A, 0x3664,\n    0xF79B, 0x3665, 0xF79C, 0x3666, 0xF79D, 0x3667, 0xF79E, 0x3668,\n    0xF79F, 0x3669, 0xF7A0, 0x366A, 0xF7A1, 0x366B, 0xF7A2, 0x366C,\n    0xF7A3, 0x366D, 0xF7A4, 0x366E, 0xF7A5, 0x366F, 0xF7A6, 0x3670,\n    0xF7A7, 0x3671, 0xF7A8, 0x3672, 0xF7A9, 0x3673, 0xF7AA, 0x3674,\n    0xF7AB, 0x3675, 0xF7AC, 0x3676, 0xF7AD, 0x3677, 0xF7AE, 0x3678,\n    0xF7AF, 0x3679, 0xF7B0, 0x367A, 0xF7B1, 0x367B, 0xF7B2, 0x367C,\n    0xF7B3, 0x367D, 0xF7B4, 0x367E, 0xF7B5, 0x367F, 0xF7B6, 0x3680,\n    0xF7B7, 0x3681, 0xF7B8, 0x3682, 0xF7B9, 0x3683, 0xF7BA, 0x3684,\n    0xF7BB, 0x3685, 0xF7BC, 0x3686, 0xF7BD, 0x3687, 0xF7BE, 0x3688,\n    0xF7BF, 0x3689, 0xF7C0, 0x368A, 0xF7C1, 0x368B, 0xF7C2, 0x368C,\n    0xF7C3, 0x368D, 0xF7C4, 0x368E, 0xF7C5, 0x368F, 0xF7C6, 0x3690,\n    0xF7C7, 0x3691, 0xF7C8, 0x3692, 0xF7C9, 0x3693, 0xF7CA, 0x3694,\n    0xF7CB, 0x3695, 0xF7CC, 0x3696, 0xF7CD, 0x3697, 0xF7CE, 0x3698,\n    0xF7CF, 0x3699, 0xF7D0, 0x369A, 0xF7D1, 0x369B, 0xF7D2, 0x369C,\n    0xF7D3, 0x369D, 0xF7D4, 0x369E, 0xF7D5, 0x369F, 0xF7D6, 0x36A0,\n    0xF7D7, 0x36A1, 0xF7D8, 0x36A2, 0xF7D9, 0x36A3, 0xF7DA, 0x36A4,\n    0xF7DB, 0x36A5, 0xF7DC, 0x36A6, 0xF7DD, 0x36A7, 0xF7DE, 0x36A8,\n    0xF7DF, 0x36A9, 0xF7E0, 0x36AA, 0xF7E1, 0x36AB, 0xF7E2, 0x36AC,\n    0xF7E3, 0x36AD, 0xF7E4, 0x36AE, 0xF7E5, 0x36AF, 0xF7E6, 0x36B0,\n    0xF7E7, 0x36B1, 0xF7E8, 0x36B2, 0xF7E9, 0x36B3, 0xF7EA, 0x36B4,\n    0xF7EB, 0x36B5, 0xF7EC, 0x36B6, 0xF7ED, 0x36B7, 0xF7EE, 0x36B8,\n    0xF817, 0x36E1, 0xF818, 0x36E2, 0xF819, 0x36E3, 0xF81A, 0x36E4,\n    0xF81B, 0x36E5, 0xF81C, 0x36E6, 0xF81D, 0x36E7, 0xFA0C, 0x0274,\n    0xFA0D, 0x2381, 0xFE30, 0x006D, 0xFE31, 0x007A, 0xFE33, 0x35AF,\n    0xFE34, 0x35B1, 0xFE35, 0x0082, 0xFE36, 0x0083, 0xFE37, 0x0086,\n    0xFE38, 0x0087, 0xFE39, 0x008A, 0xFE3A, 0x008B, 0xFE3B, 0x008E,\n    0xFE3C, 0x008F, 0xFE3D, 0x0092, 0xFE3E, 0x0093, 0xFE3F, 0x0096,\n    0xFE40, 0x0097, 0xFE41, 0x009A, 0xFE42, 0x009B, 0xFE43, 0x009E,\n    0xFE44, 0x009F, 0xFE49, 0x00C7, 0xFE4A, 0x00C8, 0xFE4B, 0x00CB,\n    0xFE4C, 0x00CC, 0xFE4D, 0x00C9, 0xFE4E, 0x00CA, 0xFE4F, 0x35B2,\n    0xFE50, 0x0070, 0xFE51, 0x0071, 0xFE52, 0x0072, 0xFE54, 0x0074,\n    0xFE55, 0x0075, 0xFE56, 0x0076, 0xFE57, 0x0077, 0xFE59, 0x00A0,\n    0xFE5A, 0x00A1, 0xFE5B, 0x00A2, 0xFE5C, 0x00A3, 0xFE5D, 0x00A4,\n    0xFE5E, 0x00A5, 0xFE5F, 0x00CD, 0xFE60, 0x00CE, 0xFE61, 0x00CF,\n    0xFE62, 0x00DF, 0xFE63, 0x00E0, 0xFE64, 0x00E1, 0xFE65, 0x00E2,\n    0xFE66, 0x00E3, 0xFE68, 0x0102, 0xFE69, 0x010C, 0xFE6A, 0x010D,\n    0xFE6B, 0x010E, 0xFF01, 0x006C, 0xFF02, 0x36E4, 0xFF03, 0x00AE,\n    0xFF04, 0x0103, 0xFF05, 0x0108, 0xFF06, 0x00AF, 0xFF07, 0x36E3,\n    0xFF08, 0x0080, 0xFF09, 0x0081, 0xFF0A, 0x00B0, 0xFF0B, 0x00D0,\n    0xFF0C, 0x0064, 0xFF0D, 0x00D1, 0xFF0E, 0x0067, 0xFF0F, 0x0101,\n    0xFF10, 0x014D, 0xFF11, 0x014E, 0xFF12, 0x014F, 0xFF13, 0x0150,\n    0xFF14, 0x0151, 0xFF15, 0x0152, 0xFF16, 0x0153, 0xFF17, 0x0154,\n    0xFF18, 0x0155, 0xFF19, 0x0156, 0xFF1A, 0x006A, 0xFF1B, 0x0069,\n    0xFF1C, 0x00D6, 0xFF1D, 0x00D8, 0xFF1E, 0x00D7, 0xFF1F, 0x006B,\n    0xFF20, 0x0109, 0xFF21, 0x016D, 0xFF22, 0x016E, 0xFF23, 0x016F,\n    0xFF24, 0x0170, 0xFF25, 0x0171, 0xFF26, 0x0172, 0xFF27, 0x0173,\n    0xFF28, 0x0174, 0xFF29, 0x0175, 0xFF2A, 0x0176, 0xFF2B, 0x0177,\n    0xFF2C, 0x0178, 0xFF2D, 0x0179, 0xFF2E, 0x017A, 0xFF2F, 0x017B,\n    0xFF30, 0x017C, 0xFF31, 0x017D, 0xFF32, 0x017E, 0xFF33, 0x017F,\n    0xFF34, 0x0180, 0xFF35, 0x0181, 0xFF36, 0x0182, 0xFF37, 0x0183,\n    0xFF38, 0x0184, 0xFF39, 0x0185, 0xFF3A, 0x0186, 0xFF3B, 0x35BE,\n    0xFF3C, 0x0102, 0xFF3D, 0x35BF, 0xFF3E, 0x35B4, 0xFF3F, 0x00C5,\n    0xFF41, 0x0187, 0xFF42, 0x0188, 0xFF43, 0x0189, 0xFF44, 0x018A,\n    0xFF45, 0x018B, 0xFF46, 0x018C, 0xFF47, 0x018D, 0xFF48, 0x018E,\n    0xFF49, 0x018F, 0xFF4A, 0x0190, 0xFF4B, 0x0191, 0xFF4C, 0x0192,\n    0xFF4D, 0x0193, 0xFF4E, 0x0194, 0xFF4F, 0x0195, 0xFF50, 0x0196,\n    0xFF51, 0x0197, 0xFF52, 0x0198, 0xFF53, 0x0199, 0xFF54, 0x019A,\n    0xFF55, 0x019B, 0xFF56, 0x019C, 0xFF57, 0x019D, 0xFF58, 0x019E,\n    0xFF59, 0x019F, 0xFF5A, 0x01A0, 0xFF5B, 0x0084, 0xFF5C, 0x0078,\n    0xFF5D, 0x0085, 0xFF5E, 0x00E4, 0xFF64, 0x0071, 0xFFE0, 0x0106,\n    0xFFE1, 0x0107, 0xFFE2, 0x36E1, 0xFFE3, 0x00C4, 0xFFE4, 0x36E2,\n    0xFFE5, 0x0104,\n};\nextern const unsigned short g_FXCMAP_UniCNS_UTF16_H_0_DWord[3 * 3] = {\n    0xD840, 0xDC8A, 0x36B2, 0xD840, 0xDCCC, 0x36B0, 0xD85D, 0xDE07, 0x36B8,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/CNS1/cmaps_cns1.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../../include/fpdfapi/fpdf_resource.h\"\n#include \"../../../../include/fpdfapi/fpdf_module.h\"\n#include \"../../fpdf_font/font_int.h\"\n#include \"../cmap_int.h\"\nextern const FX_WORD g_FXCMAP_B5pc_H_0[];\nextern const FX_WORD g_FXCMAP_B5pc_V_0[];\nextern const FX_WORD g_FXCMAP_HKscs_B5_H_5[];\nextern const FX_WORD g_FXCMAP_HKscs_B5_V_5[];\nextern const FX_WORD g_FXCMAP_ETen_B5_H_0[];\nextern const FX_WORD g_FXCMAP_ETen_B5_V_0[];\nextern const FX_WORD g_FXCMAP_ETenms_B5_H_0[];\nextern const FX_WORD g_FXCMAP_ETenms_B5_V_0[];\nextern const FX_WORD g_FXCMAP_CNS_EUC_H_0[];\nextern const FX_WORD g_FXCMAP_CNS_EUC_H_0_DWord[];\nextern const FX_WORD g_FXCMAP_CNS_EUC_V_0[];\nextern const FX_WORD g_FXCMAP_CNS_EUC_V_0_DWord[];\nextern const FX_WORD g_FXCMAP_UniCNS_UCS2_H_3[];\nextern const FX_WORD g_FXCMAP_UniCNS_UCS2_V_3[];\nextern const FX_WORD g_FXCMAP_UniCNS_UTF16_H_0[];\nextern const FX_WORD g_FXCMAP_CNS1CID2Unicode_5[];\nconst FXCMAP_CMap g_FXCMAP_CNS1_cmaps[] = {\n    { \"B5pc-H\", FXCMAP_CMap::Range, g_FXCMAP_B5pc_H_0, 247, FXCMAP_CMap::None, NULL, 0, 0 },\n    { \"B5pc-V\", FXCMAP_CMap::Range, g_FXCMAP_B5pc_V_0, 12, FXCMAP_CMap::None, NULL, 0, -1 },\n    { \"HKscs-B5-H\", FXCMAP_CMap::Range, g_FXCMAP_HKscs_B5_H_5, 1210, FXCMAP_CMap::None, NULL, 0, 0 },\n    { \"HKscs-B5-V\", FXCMAP_CMap::Range, g_FXCMAP_HKscs_B5_V_5, 13, FXCMAP_CMap::None, NULL, 0, -1 },\n    { \"ETen-B5-H\", FXCMAP_CMap::Range, g_FXCMAP_ETen_B5_H_0, 254, FXCMAP_CMap::None, NULL, 0, 0 },\n    { \"ETen-B5-V\", FXCMAP_CMap::Range, g_FXCMAP_ETen_B5_V_0, 13, FXCMAP_CMap::None, NULL, 0, -1 },\n    { \"ETenms-B5-H\", FXCMAP_CMap::Range, g_FXCMAP_ETenms_B5_H_0, 1, FXCMAP_CMap::None, NULL, 0, -2 },\n    { \"ETenms-B5-V\", FXCMAP_CMap::Range, g_FXCMAP_ETenms_B5_V_0, 18, FXCMAP_CMap::None, NULL, 0, -1 },\n    { \"CNS-EUC-H\", FXCMAP_CMap::Range, g_FXCMAP_CNS_EUC_H_0, 157, FXCMAP_CMap::Range, g_FXCMAP_CNS_EUC_H_0_DWord, 238, 0 },\n    { \"CNS-EUC-V\", FXCMAP_CMap::Range, g_FXCMAP_CNS_EUC_V_0, 180, FXCMAP_CMap::Range, g_FXCMAP_CNS_EUC_V_0_DWord, 261, 0 },\n    { \"UniCNS-UCS2-H\", FXCMAP_CMap::Range, g_FXCMAP_UniCNS_UCS2_H_3, 16418, FXCMAP_CMap::None, NULL, 0, 0 },\n    { \"UniCNS-UCS2-V\", FXCMAP_CMap::Range, g_FXCMAP_UniCNS_UCS2_V_3, 13, FXCMAP_CMap::None, NULL, 0, -1 },\n    { \"UniCNS-UTF16-H\", FXCMAP_CMap::Single, g_FXCMAP_UniCNS_UTF16_H_0, 14557, FXCMAP_CMap::None, NULL, 0, 0 },\n    { \"UniCNS-UTF16-V\", FXCMAP_CMap::Range, g_FXCMAP_UniCNS_UCS2_V_3, 13, FXCMAP_CMap::None, NULL, 0, -1 },\n};\nvoid CPDF_ModuleMgr::LoadEmbeddedCNS1CMaps()\n{\n    CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();\n    pFontGlobals->m_EmbeddedCharsets[CIDSET_CNS1].m_pMapList = g_FXCMAP_CNS1_cmaps;\n    pFontGlobals->m_EmbeddedCharsets[CIDSET_CNS1].m_Count = sizeof g_FXCMAP_CNS1_cmaps / sizeof (FXCMAP_CMap);\n    pFontGlobals->m_EmbeddedToUnicodes[CIDSET_CNS1].m_pMap = g_FXCMAP_CNS1CID2Unicode_5;\n    pFontGlobals->m_EmbeddedToUnicodes[CIDSET_CNS1].m_Count = 19088;\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/GB1/Adobe-GB1-UCS2_5.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_GB1CID2Unicode_5[30284] = {\n    0xFFFD, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026,\n    0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E,\n    0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036,\n    0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E,\n    0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046,\n    0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E,\n    0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,\n    0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E,\n    0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066,\n    0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E,\n    0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076,\n    0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E,\n    0x3000, 0x3001, 0x3002, 0x00B7, 0x02C9, 0x02C7, 0x00A8, 0x3003,\n    0x3005, 0x2014, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x2019, 0x201C,\n    0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C,\n    0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x3011, 0x00B1,\n    0x00D7, 0x00F7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220F, 0x222A,\n    0x2229, 0x2208, 0x2237, 0x221A, 0x22A5, 0x2225, 0x2220, 0x2312,\n    0x2299, 0x222B, 0x222E, 0x2261, 0x224C, 0x2248, 0x223D, 0x221D,\n    0x2260, 0x226E, 0x226F, 0x2264, 0x2265, 0x221E, 0x2235, 0x2234,\n    0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFF04, 0x00A4,\n    0xFFE0, 0xFFE1, 0x2030, 0x00A7, 0x2116, 0x2606, 0x2605, 0x25CB,\n    0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3, 0x25B2,\n    0x203B, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0x2488, 0x2489,\n    0x248A, 0x248B, 0x248C, 0x248D, 0x248E, 0x248F, 0x2490, 0x2491,\n    0x2492, 0x2493, 0x2494, 0x2495, 0x2496, 0x2497, 0x2498, 0x2499,\n    0x249A, 0x249B, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479,\n    0x247A, 0x247B, 0x247C, 0x247D, 0x247E, 0x247F, 0x2480, 0x2481,\n    0x2482, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, 0x2460, 0x2461,\n    0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469,\n    0x3220, 0x3221, 0x3222, 0x3223, 0x3224, 0x3225, 0x3226, 0x3227,\n    0x3228, 0x3229, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165,\n    0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0xFF01, 0xFF02,\n    0xFF03, 0xFFE5, 0xFF05, 0xFF06, 0xFF07, 0xFF08, 0xFF09, 0xFF0A,\n    0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F, 0xFF10, 0xFF11, 0xFF12,\n    0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0xFF1A,\n    0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, 0xFF20, 0xFF21, 0xFF22,\n    0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A,\n    0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32,\n    0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A,\n    0xFF3B, 0xFF3C, 0xFF3D, 0xFF3E, 0xFF3F, 0xFF40, 0xFF41, 0xFF42,\n    0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A,\n    0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52,\n    0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A,\n    0xFF5B, 0xFF5C, 0xFF5D, 0xFFE3, 0x3041, 0x3042, 0x3043, 0x3044,\n    0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C,\n    0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054,\n    0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C,\n    0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064,\n    0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C,\n    0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074,\n    0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C,\n    0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084,\n    0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C,\n    0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A1,\n    0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9,\n    0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1,\n    0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9,\n    0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1,\n    0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9,\n    0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1,\n    0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9,\n    0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1,\n    0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9,\n    0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1,\n    0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, 0x0391, 0x0392, 0x0393,\n    0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B,\n    0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A4,\n    0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3,\n    0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB,\n    0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C4,\n    0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0xFF0C, 0x3002, 0x3001,\n    0xFF1A, 0xFF1B, 0xFF01, 0xFF1F, 0xFE35, 0xFE36, 0xFE39, 0xFE3A,\n    0xFE3F, 0xFE40, 0xFE3D, 0xFE3E, 0xFE41, 0xFE42, 0xFE43, 0xFE44,\n    0x3016, 0x3017, 0xFE3B, 0xFE3C, 0xFE37, 0xFE38, 0xFE31, 0x2026,\n    0xFE33, 0xFE34, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415,\n    0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C,\n    0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424,\n    0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C,\n    0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434,\n    0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B,\n    0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443,\n    0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B,\n    0x044C, 0x044D, 0x044E, 0x044F, 0x0101, 0x00E1, 0x01CE, 0x00E0,\n    0x0113, 0x00E9, 0x011B, 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC,\n    0x014D, 0x00F3, 0x01D2, 0x00F2, 0x016B, 0x00FA, 0x01D4, 0x00F9,\n    0x01D6, 0x01D8, 0x01DA, 0x01DC, 0x00FC, 0x00EA, 0x0251, 0x1E3F,\n    0x0144, 0x0148, 0x01F9, 0x0261, 0x3105, 0x3106, 0x3107, 0x3108,\n    0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, 0x310F, 0x3110,\n    0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118,\n    0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E, 0x311F, 0x3120,\n    0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128,\n    0x3129, 0xE7CD, 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, 0x2505,\n    0x2506, 0x2507, 0x2508, 0x2509, 0x250A, 0x250B, 0x250C, 0x250D,\n    0x250E, 0x250F, 0x2510, 0x2511, 0x2512, 0x2513, 0x2514, 0x2515,\n    0x2516, 0x2517, 0x2518, 0x2519, 0x251A, 0x251B, 0x251C, 0x251D,\n    0x251E, 0x251F, 0x2520, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525,\n    0x2526, 0x2527, 0x2528, 0x2529, 0x252A, 0x252B, 0x252C, 0x252D,\n    0x252E, 0x252F, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535,\n    0x2536, 0x2537, 0x2538, 0x2539, 0x253A, 0x253B, 0x253C, 0x253D,\n    0x253E, 0x253F, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545,\n    0x2546, 0x2547, 0x2548, 0x2549, 0x254A, 0x254B, 0x0021, 0x0022,\n    0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A,\n    0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032,\n    0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A,\n    0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042,\n    0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A,\n    0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052,\n    0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A,\n    0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062,\n    0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A,\n    0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072,\n    0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A,\n    0x007B, 0x007C, 0x007D, 0x007E, 0x0101, 0x00E1, 0x01CE, 0x00E0,\n    0x0113, 0x00E9, 0x011B, 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC,\n    0x014D, 0x00F3, 0x01D2, 0x00F2, 0x016B, 0x00FA, 0x01D4, 0x00F9,\n    0x01D6, 0x01D8, 0x01DA, 0x01DC, 0x00FC, 0x00EA, 0x0251, 0x1E3F,\n    0x0144, 0x0148, 0x01F9, 0x0261, 0x554A, 0x963F, 0x57C3, 0x6328,\n    0x54CE, 0x5509, 0x54C0, 0x7691, 0x764C, 0x853C, 0x77EE, 0x827E,\n    0x788D, 0x7231, 0x9698, 0x978D, 0x6C28, 0x5B89, 0x4FFA, 0x6309,\n    0x6697, 0x5CB8, 0x80FA, 0x6848, 0x80AE, 0x6602, 0x76CE, 0x51F9,\n    0x6556, 0x71AC, 0x7FF1, 0x8884, 0x50B2, 0x5965, 0x61CA, 0x6FB3,\n    0x82AD, 0x634C, 0x6252, 0x53ED, 0x5427, 0x7B06, 0x516B, 0x75A4,\n    0x5DF4, 0x62D4, 0x8DCB, 0x9776, 0x628A, 0x8019, 0x575D, 0x9738,\n    0x7F62, 0x7238, 0x767D, 0x67CF, 0x767E, 0x6446, 0x4F70, 0x8D25,\n    0x62DC, 0x7A17, 0x6591, 0x73ED, 0x642C, 0x6273, 0x822C, 0x9881,\n    0x677F, 0x7248, 0x626E, 0x62CC, 0x4F34, 0x74E3, 0x534A, 0x529E,\n    0x7ECA, 0x90A6, 0x5E2E, 0x6886, 0x699C, 0x8180, 0x7ED1, 0x68D2,\n    0x78C5, 0x868C, 0x9551, 0x508D, 0x8C24, 0x82DE, 0x80DE, 0x5305,\n    0x8912, 0x5265, 0x8584, 0x96F9, 0x4FDD, 0x5821, 0x9971, 0x5B9D,\n    0x62B1, 0x62A5, 0x66B4, 0x8C79, 0x9C8D, 0x7206, 0x676F, 0x7891,\n    0x60B2, 0x5351, 0x5317, 0x8F88, 0x80CC, 0x8D1D, 0x94A1, 0x500D,\n    0x72C8, 0x5907, 0x60EB, 0x7119, 0x88AB, 0x5954, 0x82EF, 0x672C,\n    0x7B28, 0x5D29, 0x7EF7, 0x752D, 0x6CF5, 0x8E66, 0x8FF8, 0x903C,\n    0x9F3B, 0x6BD4, 0x9119, 0x7B14, 0x5F7C, 0x78A7, 0x84D6, 0x853D,\n    0x6BD5, 0x6BD9, 0x6BD6, 0x5E01, 0x5E87, 0x75F9, 0x95ED, 0x655D,\n    0x5F0A, 0x5FC5, 0x8F9F, 0x58C1, 0x81C2, 0x907F, 0x965B, 0x97AD,\n    0x8FB9, 0x7F16, 0x8D2C, 0x6241, 0x4FBF, 0x53D8, 0x535E, 0x8FA8,\n    0x8FA9, 0x8FAB, 0x904D, 0x6807, 0x5F6A, 0x8198, 0x8868, 0x9CD6,\n    0x618B, 0x522B, 0x762A, 0x5F6C, 0x658C, 0x6FD2, 0x6EE8, 0x5BBE,\n    0x6448, 0x5175, 0x51B0, 0x67C4, 0x4E19, 0x79C9, 0x997C, 0x70B3,\n    0x75C5, 0x5E76, 0x73BB, 0x83E0, 0x64AD, 0x62E8, 0x94B5, 0x6CE2,\n    0x535A, 0x52C3, 0x640F, 0x94C2, 0x7B94, 0x4F2F, 0x5E1B, 0x8236,\n    0x8116, 0x818A, 0x6E24, 0x6CCA, 0x9A73, 0x6355, 0x535C, 0x54FA,\n    0x8865, 0x57E0, 0x4E0D, 0x5E03, 0x6B65, 0x7C3F, 0x90E8, 0x6016,\n    0x64E6, 0x731C, 0x88C1, 0x6750, 0x624D, 0x8D22, 0x776C, 0x8E29,\n    0x91C7, 0x5F69, 0x83DC, 0x8521, 0x9910, 0x53C2, 0x8695, 0x6B8B,\n    0x60ED, 0x60E8, 0x707F, 0x82CD, 0x8231, 0x4ED3, 0x6CA7, 0x85CF,\n    0x64CD, 0x7CD9, 0x69FD, 0x66F9, 0x8349, 0x5395, 0x7B56, 0x4FA7,\n    0x518C, 0x6D4B, 0x5C42, 0x8E6D, 0x63D2, 0x53C9, 0x832C, 0x8336,\n    0x67E5, 0x78B4, 0x643D, 0x5BDF, 0x5C94, 0x5DEE, 0x8BE7, 0x62C6,\n    0x67F4, 0x8C7A, 0x6400, 0x63BA, 0x8749, 0x998B, 0x8C17, 0x7F20,\n    0x94F2, 0x4EA7, 0x9610, 0x98A4, 0x660C, 0x7316, 0x573A, 0x5C1D,\n    0x5E38, 0x957F, 0x507F, 0x80A0, 0x5382, 0x655E, 0x7545, 0x5531,\n    0x5021, 0x8D85, 0x6284, 0x949E, 0x671D, 0x5632, 0x6F6E, 0x5DE2,\n    0x5435, 0x7092, 0x8F66, 0x626F, 0x64A4, 0x63A3, 0x5F7B, 0x6F88,\n    0x90F4, 0x81E3, 0x8FB0, 0x5C18, 0x6668, 0x5FF1, 0x6C89, 0x9648,\n    0x8D81, 0x886C, 0x6491, 0x79F0, 0x57CE, 0x6A59, 0x6210, 0x5448,\n    0x4E58, 0x7A0B, 0x60E9, 0x6F84, 0x8BDA, 0x627F, 0x901E, 0x9A8B,\n    0x79E4, 0x5403, 0x75F4, 0x6301, 0x5319, 0x6C60, 0x8FDF, 0x5F1B,\n    0x9A70, 0x803B, 0x9F7F, 0x4F88, 0x5C3A, 0x8D64, 0x7FC5, 0x65A5,\n    0x70BD, 0x5145, 0x51B2, 0x866B, 0x5D07, 0x5BA0, 0x62BD, 0x916C,\n    0x7574, 0x8E0C, 0x7A20, 0x6101, 0x7B79, 0x4EC7, 0x7EF8, 0x7785,\n    0x4E11, 0x81ED, 0x521D, 0x51FA, 0x6A71, 0x53A8, 0x8E87, 0x9504,\n    0x96CF, 0x6EC1, 0x9664, 0x695A, 0x7840, 0x50A8, 0x77D7, 0x6410,\n    0x89E6, 0x5904, 0x63E3, 0x5DDD, 0x7A7F, 0x693D, 0x4F20, 0x8239,\n    0x5598, 0x4E32, 0x75AE, 0x7A97, 0x5E62, 0x5E8A, 0x95EF, 0x521B,\n    0x5439, 0x708A, 0x6376, 0x9524, 0x5782, 0x6625, 0x693F, 0x9187,\n    0x5507, 0x6DF3, 0x7EAF, 0x8822, 0x6233, 0x7EF0, 0x75B5, 0x8328,\n    0x78C1, 0x96CC, 0x8F9E, 0x6148, 0x74F7, 0x8BCD, 0x6B64, 0x523A,\n    0x8D50, 0x6B21, 0x806A, 0x8471, 0x56F1, 0x5306, 0x4ECE, 0x4E1B,\n    0x51D1, 0x7C97, 0x918B, 0x7C07, 0x4FC3, 0x8E7F, 0x7BE1, 0x7A9C,\n    0x6467, 0x5D14, 0x50AC, 0x8106, 0x7601, 0x7CB9, 0x6DEC, 0x7FE0,\n    0x6751, 0x5B58, 0x5BF8, 0x78CB, 0x64AE, 0x6413, 0x63AA, 0x632B,\n    0x9519, 0x642D, 0x8FBE, 0x7B54, 0x7629, 0x6253, 0x5927, 0x5446,\n    0x6B79, 0x50A3, 0x6234, 0x5E26, 0x6B86, 0x4EE3, 0x8D37, 0x888B,\n    0x5F85, 0x902E, 0x6020, 0x803D, 0x62C5, 0x4E39, 0x5355, 0x90F8,\n    0x63B8, 0x80C6, 0x65E6, 0x6C2E, 0x4F46, 0x60EE, 0x6DE1, 0x8BDE,\n    0x5F39, 0x86CB, 0x5F53, 0x6321, 0x515A, 0x8361, 0x6863, 0x5200,\n    0x6363, 0x8E48, 0x5012, 0x5C9B, 0x7977, 0x5BFC, 0x5230, 0x7A3B,\n    0x60BC, 0x9053, 0x76D7, 0x5FB7, 0x5F97, 0x7684, 0x8E6C, 0x706F,\n    0x767B, 0x7B49, 0x77AA, 0x51F3, 0x9093, 0x5824, 0x4F4E, 0x6EF4,\n    0x8FEA, 0x654C, 0x7B1B, 0x72C4, 0x6DA4, 0x7FDF, 0x5AE1, 0x62B5,\n    0x5E95, 0x5730, 0x8482, 0x7B2C, 0x5E1D, 0x5F1F, 0x9012, 0x7F14,\n    0x98A0, 0x6382, 0x6EC7, 0x7898, 0x70B9, 0x5178, 0x975B, 0x57AB,\n    0x7535, 0x4F43, 0x7538, 0x5E97, 0x60E6, 0x5960, 0x6DC0, 0x6BBF,\n    0x7889, 0x53FC, 0x96D5, 0x51CB, 0x5201, 0x6389, 0x540A, 0x9493,\n    0x8C03, 0x8DCC, 0x7239, 0x789F, 0x8776, 0x8FED, 0x8C0D, 0x53E0,\n    0x4E01, 0x76EF, 0x53EE, 0x9489, 0x9876, 0x9F0E, 0x952D, 0x5B9A,\n    0x8BA2, 0x4E22, 0x4E1C, 0x51AC, 0x8463, 0x61C2, 0x52A8, 0x680B,\n    0x4F97, 0x606B, 0x51BB, 0x6D1E, 0x515C, 0x6296, 0x6597, 0x9661,\n    0x8C46, 0x9017, 0x75D8, 0x90FD, 0x7763, 0x6BD2, 0x728A, 0x72EC,\n    0x8BFB, 0x5835, 0x7779, 0x8D4C, 0x675C, 0x9540, 0x809A, 0x5EA6,\n    0x6E21, 0x5992, 0x7AEF, 0x77ED, 0x953B, 0x6BB5, 0x65AD, 0x7F0E,\n    0x5806, 0x5151, 0x961F, 0x5BF9, 0x58A9, 0x5428, 0x8E72, 0x6566,\n    0x987F, 0x56E4, 0x949D, 0x76FE, 0x9041, 0x6387, 0x54C6, 0x591A,\n    0x593A, 0x579B, 0x8EB2, 0x6735, 0x8DFA, 0x8235, 0x5241, 0x60F0,\n    0x5815, 0x86FE, 0x5CE8, 0x9E45, 0x4FC4, 0x989D, 0x8BB9, 0x5A25,\n    0x6076, 0x5384, 0x627C, 0x904F, 0x9102, 0x997F, 0x6069, 0x800C,\n    0x513F, 0x8033, 0x5C14, 0x9975, 0x6D31, 0x4E8C, 0x8D30, 0x53D1,\n    0x7F5A, 0x7B4F, 0x4F10, 0x4E4F, 0x9600, 0x6CD5, 0x73D0, 0x85E9,\n    0x5E06, 0x756A, 0x7FFB, 0x6A0A, 0x77FE, 0x9492, 0x7E41, 0x51E1,\n    0x70E6, 0x53CD, 0x8FD4, 0x8303, 0x8D29, 0x72AF, 0x996D, 0x6CDB,\n    0x574A, 0x82B3, 0x65B9, 0x80AA, 0x623F, 0x9632, 0x59A8, 0x4EFF,\n    0x8BBF, 0x7EBA, 0x653E, 0x83F2, 0x975E, 0x5561, 0x98DE, 0x80A5,\n    0x532A, 0x8BFD, 0x5420, 0x80BA, 0x5E9F, 0x6CB8, 0x8D39, 0x82AC,\n    0x915A, 0x5429, 0x6C1B, 0x5206, 0x7EB7, 0x575F, 0x711A, 0x6C7E,\n    0x7C89, 0x594B, 0x4EFD, 0x5FFF, 0x6124, 0x7CAA, 0x4E30, 0x5C01,\n    0x67AB, 0x8702, 0x5CF0, 0x950B, 0x98CE, 0x75AF, 0x70FD, 0x9022,\n    0x51AF, 0x7F1D, 0x8BBD, 0x5949, 0x51E4, 0x4F5B, 0x5426, 0x592B,\n    0x6577, 0x80A4, 0x5B75, 0x6276, 0x62C2, 0x8F90, 0x5E45, 0x6C1F,\n    0x7B26, 0x4F0F, 0x4FD8, 0x670D, 0x6D6E, 0x6DAA, 0x798F, 0x88B1,\n    0x5F17, 0x752B, 0x629A, 0x8F85, 0x4FEF, 0x91DC, 0x65A7, 0x812F,\n    0x8151, 0x5E9C, 0x8150, 0x8D74, 0x526F, 0x8986, 0x8D4B, 0x590D,\n    0x5085, 0x4ED8, 0x961C, 0x7236, 0x8179, 0x8D1F, 0x5BCC, 0x8BA3,\n    0x9644, 0x5987, 0x7F1A, 0x5490, 0x5676, 0x560E, 0x8BE5, 0x6539,\n    0x6982, 0x9499, 0x76D6, 0x6E89, 0x5E72, 0x7518, 0x6746, 0x67D1,\n    0x7AFF, 0x809D, 0x8D76, 0x611F, 0x79C6, 0x6562, 0x8D63, 0x5188,\n    0x521A, 0x94A2, 0x7F38, 0x809B, 0x7EB2, 0x5C97, 0x6E2F, 0x6760,\n    0x7BD9, 0x768B, 0x9AD8, 0x818F, 0x7F94, 0x7CD5, 0x641E, 0x9550,\n    0x7A3F, 0x544A, 0x54E5, 0x6B4C, 0x6401, 0x6208, 0x9E3D, 0x80F3,\n    0x7599, 0x5272, 0x9769, 0x845B, 0x683C, 0x86E4, 0x9601, 0x9694,\n    0x94EC, 0x4E2A, 0x5404, 0x7ED9, 0x6839, 0x8DDF, 0x8015, 0x66F4,\n    0x5E9A, 0x7FB9, 0x57C2, 0x803F, 0x6897, 0x5DE5, 0x653B, 0x529F,\n    0x606D, 0x9F9A, 0x4F9B, 0x8EAC, 0x516C, 0x5BAB, 0x5F13, 0x5DE9,\n    0x6C5E, 0x62F1, 0x8D21, 0x5171, 0x94A9, 0x52FE, 0x6C9F, 0x82DF,\n    0x72D7, 0x57A2, 0x6784, 0x8D2D, 0x591F, 0x8F9C, 0x83C7, 0x5495,\n    0x7B8D, 0x4F30, 0x6CBD, 0x5B64, 0x59D1, 0x9F13, 0x53E4, 0x86CA,\n    0x9AA8, 0x8C37, 0x80A1, 0x6545, 0x987E, 0x56FA, 0x96C7, 0x522E,\n    0x74DC, 0x5250, 0x5BE1, 0x6302, 0x8902, 0x4E56, 0x62D0, 0x602A,\n    0x68FA, 0x5173, 0x5B98, 0x51A0, 0x89C2, 0x7BA1, 0x9986, 0x7F50,\n    0x60EF, 0x704C, 0x8D2F, 0x5149, 0x5E7F, 0x901B, 0x7470, 0x89C4,\n    0x572D, 0x7845, 0x5F52, 0x9F9F, 0x95FA, 0x8F68, 0x9B3C, 0x8BE1,\n    0x7678, 0x6842, 0x67DC, 0x8DEA, 0x8D35, 0x523D, 0x8F8A, 0x6EDA,\n    0x68CD, 0x9505, 0x90ED, 0x56FD, 0x679C, 0x88F9, 0x8FC7, 0x54C8,\n    0x9AB8, 0x5B69, 0x6D77, 0x6C26, 0x4EA5, 0x5BB3, 0x9A87, 0x9163,\n    0x61A8, 0x90AF, 0x97E9, 0x542B, 0x6DB5, 0x5BD2, 0x51FD, 0x558A,\n    0x7F55, 0x7FF0, 0x64BC, 0x634D, 0x65F1, 0x61BE, 0x608D, 0x710A,\n    0x6C57, 0x6C49, 0x592F, 0x676D, 0x822A, 0x58D5, 0x568E, 0x8C6A,\n    0x6BEB, 0x90DD, 0x597D, 0x8017, 0x53F7, 0x6D69, 0x5475, 0x559D,\n    0x8377, 0x83CF, 0x6838, 0x79BE, 0x548C, 0x4F55, 0x5408, 0x76D2,\n    0x8C89, 0x9602, 0x6CB3, 0x6DB8, 0x8D6B, 0x8910, 0x9E64, 0x8D3A,\n    0x563F, 0x9ED1, 0x75D5, 0x5F88, 0x72E0, 0x6068, 0x54FC, 0x4EA8,\n    0x6A2A, 0x8861, 0x6052, 0x8F70, 0x54C4, 0x70D8, 0x8679, 0x9E3F,\n    0x6D2A, 0x5B8F, 0x5F18, 0x7EA2, 0x5589, 0x4FAF, 0x7334, 0x543C,\n    0x539A, 0x5019, 0x540E, 0x547C, 0x4E4E, 0x5FFD, 0x745A, 0x58F6,\n    0x846B, 0x80E1, 0x8774, 0x72D0, 0x7CCA, 0x6E56, 0x5F27, 0x864E,\n    0x552C, 0x62A4, 0x4E92, 0x6CAA, 0x6237, 0x82B1, 0x54D7, 0x534E,\n    0x733E, 0x6ED1, 0x753B, 0x5212, 0x5316, 0x8BDD, 0x69D0, 0x5F8A,\n    0x6000, 0x6DEE, 0x574F, 0x6B22, 0x73AF, 0x6853, 0x8FD8, 0x7F13,\n    0x6362, 0x60A3, 0x5524, 0x75EA, 0x8C62, 0x7115, 0x6DA3, 0x5BA6,\n    0x5E7B, 0x8352, 0x614C, 0x9EC4, 0x78FA, 0x8757, 0x7C27, 0x7687,\n    0x51F0, 0x60F6, 0x714C, 0x6643, 0x5E4C, 0x604D, 0x8C0E, 0x7070,\n    0x6325, 0x8F89, 0x5FBD, 0x6062, 0x86D4, 0x56DE, 0x6BC1, 0x6094,\n    0x6167, 0x5349, 0x60E0, 0x6666, 0x8D3F, 0x79FD, 0x4F1A, 0x70E9,\n    0x6C47, 0x8BB3, 0x8BF2, 0x7ED8, 0x8364, 0x660F, 0x5A5A, 0x9B42,\n    0x6D51, 0x6DF7, 0x8C41, 0x6D3B, 0x4F19, 0x706B, 0x83B7, 0x6216,\n    0x60D1, 0x970D, 0x8D27, 0x7978, 0x51FB, 0x573E, 0x57FA, 0x673A,\n    0x7578, 0x7A3D, 0x79EF, 0x7B95, 0x808C, 0x9965, 0x8FF9, 0x6FC0,\n    0x8BA5, 0x9E21, 0x59EC, 0x7EE9, 0x7F09, 0x5409, 0x6781, 0x68D8,\n    0x8F91, 0x7C4D, 0x96C6, 0x53CA, 0x6025, 0x75BE, 0x6C72, 0x5373,\n    0x5AC9, 0x7EA7, 0x6324, 0x51E0, 0x810A, 0x5DF1, 0x84DF, 0x6280,\n    0x5180, 0x5B63, 0x4F0E, 0x796D, 0x5242, 0x60B8, 0x6D4E, 0x5BC4,\n    0x5BC2, 0x8BA1, 0x8BB0, 0x65E2, 0x5FCC, 0x9645, 0x5993, 0x7EE7,\n    0x7EAA, 0x5609, 0x67B7, 0x5939, 0x4F73, 0x5BB6, 0x52A0, 0x835A,\n    0x988A, 0x8D3E, 0x7532, 0x94BE, 0x5047, 0x7A3C, 0x4EF7, 0x67B6,\n    0x9A7E, 0x5AC1, 0x6B7C, 0x76D1, 0x575A, 0x5C16, 0x7B3A, 0x95F4,\n    0x714E, 0x517C, 0x80A9, 0x8270, 0x5978, 0x7F04, 0x8327, 0x68C0,\n    0x67EC, 0x78B1, 0x7877, 0x62E3, 0x6361, 0x7B80, 0x4FED, 0x526A,\n    0x51CF, 0x8350, 0x69DB, 0x9274, 0x8DF5, 0x8D31, 0x89C1, 0x952E,\n    0x7BAD, 0x4EF6, 0x5065, 0x8230, 0x5251, 0x996F, 0x6E10, 0x6E85,\n    0x6DA7, 0x5EFA, 0x50F5, 0x59DC, 0x5C06, 0x6D46, 0x6C5F, 0x7586,\n    0x848B, 0x6868, 0x5956, 0x8BB2, 0x5320, 0x9171, 0x964D, 0x8549,\n    0x6912, 0x7901, 0x7126, 0x80F6, 0x4EA4, 0x90CA, 0x6D47, 0x9A84,\n    0x5A07, 0x56BC, 0x6405, 0x94F0, 0x77EB, 0x4FA5, 0x811A, 0x72E1,\n    0x89D2, 0x997A, 0x7F34, 0x7EDE, 0x527F, 0x6559, 0x9175, 0x8F7F,\n    0x8F83, 0x53EB, 0x7A96, 0x63ED, 0x63A5, 0x7686, 0x79F8, 0x8857,\n    0x9636, 0x622A, 0x52AB, 0x8282, 0x6854, 0x6770, 0x6377, 0x776B,\n    0x7AED, 0x6D01, 0x7ED3, 0x89E3, 0x59D0, 0x6212, 0x85C9, 0x82A5,\n    0x754C, 0x501F, 0x4ECB, 0x75A5, 0x8BEB, 0x5C4A, 0x5DFE, 0x7B4B,\n    0x65A4, 0x91D1, 0x4ECA, 0x6D25, 0x895F, 0x7D27, 0x9526, 0x4EC5,\n    0x8C28, 0x8FDB, 0x9773, 0x664B, 0x7981, 0x8FD1, 0x70EC, 0x6D78,\n    0x5C3D, 0x52B2, 0x8346, 0x5162, 0x830E, 0x775B, 0x6676, 0x9CB8,\n    0x4EAC, 0x60CA, 0x7CBE, 0x7CB3, 0x7ECF, 0x4E95, 0x8B66, 0x666F,\n    0x9888, 0x9759, 0x5883, 0x656C, 0x955C, 0x5F84, 0x75C9, 0x9756,\n    0x7ADF, 0x7ADE, 0x51C0, 0x70AF, 0x7A98, 0x63EA, 0x7A76, 0x7EA0,\n    0x7396, 0x97ED, 0x4E45, 0x7078, 0x4E5D, 0x9152, 0x53A9, 0x6551,\n    0x65E7, 0x81FC, 0x8205, 0x548E, 0x5C31, 0x759A, 0x97A0, 0x62D8,\n    0x72D9, 0x75BD, 0x5C45, 0x9A79, 0x83CA, 0x5C40, 0x5480, 0x77E9,\n    0x4E3E, 0x6CAE, 0x805A, 0x62D2, 0x636E, 0x5DE8, 0x5177, 0x8DDD,\n    0x8E1E, 0x952F, 0x4FF1, 0x53E5, 0x60E7, 0x70AC, 0x5267, 0x6350,\n    0x9E43, 0x5A1F, 0x5026, 0x7737, 0x5377, 0x7EE2, 0x6485, 0x652B,\n    0x6289, 0x6398, 0x5014, 0x7235, 0x89C9, 0x51B3, 0x8BC0, 0x7EDD,\n    0x5747, 0x83CC, 0x94A7, 0x519B, 0x541B, 0x5CFB, 0x4FCA, 0x7AE3,\n    0x6D5A, 0x90E1, 0x9A8F, 0x5580, 0x5496, 0x5361, 0x54AF, 0x5F00,\n    0x63E9, 0x6977, 0x51EF, 0x6168, 0x520A, 0x582A, 0x52D8, 0x574E,\n    0x780D, 0x770B, 0x5EB7, 0x6177, 0x7CE0, 0x625B, 0x6297, 0x4EA2,\n    0x7095, 0x8003, 0x62F7, 0x70E4, 0x9760, 0x5777, 0x82DB, 0x67EF,\n    0x68F5, 0x78D5, 0x9897, 0x79D1, 0x58F3, 0x54B3, 0x53EF, 0x6E34,\n    0x514B, 0x523B, 0x5BA2, 0x8BFE, 0x80AF, 0x5543, 0x57A6, 0x6073,\n    0x5751, 0x542D, 0x7A7A, 0x6050, 0x5B54, 0x63A7, 0x62A0, 0x53E3,\n    0x6263, 0x5BC7, 0x67AF, 0x54ED, 0x7A9F, 0x82E6, 0x9177, 0x5E93,\n    0x88E4, 0x5938, 0x57AE, 0x630E, 0x8DE8, 0x80EF, 0x5757, 0x7B77,\n    0x4FA9, 0x5FEB, 0x5BBD, 0x6B3E, 0x5321, 0x7B50, 0x72C2, 0x6846,\n    0x77FF, 0x7736, 0x65F7, 0x51B5, 0x4E8F, 0x76D4, 0x5CBF, 0x7AA5,\n    0x8475, 0x594E, 0x9B41, 0x5080, 0x9988, 0x6127, 0x6E83, 0x5764,\n    0x6606, 0x6346, 0x56F0, 0x62EC, 0x6269, 0x5ED3, 0x9614, 0x5783,\n    0x62C9, 0x5587, 0x8721, 0x814A, 0x8FA3, 0x5566, 0x83B1, 0x6765,\n    0x8D56, 0x84DD, 0x5A6A, 0x680F, 0x62E6, 0x7BEE, 0x9611, 0x5170,\n    0x6F9C, 0x8C30, 0x63FD, 0x89C8, 0x61D2, 0x7F06, 0x70C2, 0x6EE5,\n    0x7405, 0x6994, 0x72FC, 0x5ECA, 0x90CE, 0x6717, 0x6D6A, 0x635E,\n    0x52B3, 0x7262, 0x8001, 0x4F6C, 0x59E5, 0x916A, 0x70D9, 0x6D9D,\n    0x52D2, 0x4E50, 0x96F7, 0x956D, 0x857E, 0x78CA, 0x7D2F, 0x5121,\n    0x5792, 0x64C2, 0x808B, 0x7C7B, 0x6CEA, 0x68F1, 0x695E, 0x51B7,\n    0x5398, 0x68A8, 0x7281, 0x9ECE, 0x7BF1, 0x72F8, 0x79BB, 0x6F13,\n    0x7406, 0x674E, 0x91CC, 0x9CA4, 0x793C, 0x8389, 0x8354, 0x540F,\n    0x6817, 0x4E3D, 0x5389, 0x52B1, 0x783E, 0x5386, 0x5229, 0x5088,\n    0x4F8B, 0x4FD0, 0x75E2, 0x7ACB, 0x7C92, 0x6CA5, 0x96B6, 0x529B,\n    0x7483, 0x54E9, 0x4FE9, 0x8054, 0x83B2, 0x8FDE, 0x9570, 0x5EC9,\n    0x601C, 0x6D9F, 0x5E18, 0x655B, 0x8138, 0x94FE, 0x604B, 0x70BC,\n    0x7EC3, 0x7CAE, 0x51C9, 0x6881, 0x7CB1, 0x826F, 0x4E24, 0x8F86,\n    0x91CF, 0x667E, 0x4EAE, 0x8C05, 0x64A9, 0x804A, 0x50DA, 0x7597,\n    0x71CE, 0x5BE5, 0x8FBD, 0x6F66, 0x4E86, 0x6482, 0x9563, 0x5ED6,\n    0x6599, 0x5217, 0x88C2, 0x70C8, 0x52A3, 0x730E, 0x7433, 0x6797,\n    0x78F7, 0x9716, 0x4E34, 0x90BB, 0x9CDE, 0x6DCB, 0x51DB, 0x8D41,\n    0x541D, 0x62CE, 0x73B2, 0x83F1, 0x96F6, 0x9F84, 0x94C3, 0x4F36,\n    0x7F9A, 0x51CC, 0x7075, 0x9675, 0x5CAD, 0x9886, 0x53E6, 0x4EE4,\n    0x6E9C, 0x7409, 0x69B4, 0x786B, 0x998F, 0x7559, 0x5218, 0x7624,\n    0x6D41, 0x67F3, 0x516D, 0x9F99, 0x804B, 0x5499, 0x7B3C, 0x7ABF,\n    0x9686, 0x5784, 0x62E2, 0x9647, 0x697C, 0x5A04, 0x6402, 0x7BD3,\n    0x6F0F, 0x964B, 0x82A6, 0x5362, 0x9885, 0x5E90, 0x7089, 0x63B3,\n    0x5364, 0x864F, 0x9C81, 0x9E93, 0x788C, 0x9732, 0x8DEF, 0x8D42,\n    0x9E7F, 0x6F5E, 0x7984, 0x5F55, 0x9646, 0x622E, 0x9A74, 0x5415,\n    0x94DD, 0x4FA3, 0x65C5, 0x5C65, 0x5C61, 0x7F15, 0x8651, 0x6C2F,\n    0x5F8B, 0x7387, 0x6EE4, 0x7EFF, 0x5CE6, 0x631B, 0x5B6A, 0x6EE6,\n    0x5375, 0x4E71, 0x63A0, 0x7565, 0x62A1, 0x8F6E, 0x4F26, 0x4ED1,\n    0x6CA6, 0x7EB6, 0x8BBA, 0x841D, 0x87BA, 0x7F57, 0x903B, 0x9523,\n    0x7BA9, 0x9AA1, 0x88F8, 0x843D, 0x6D1B, 0x9A86, 0x7EDC, 0x5988,\n    0x9EBB, 0x739B, 0x7801, 0x8682, 0x9A6C, 0x9A82, 0x561B, 0x5417,\n    0x57CB, 0x4E70, 0x9EA6, 0x5356, 0x8FC8, 0x8109, 0x7792, 0x9992,\n    0x86EE, 0x6EE1, 0x8513, 0x66FC, 0x6162, 0x6F2B, 0x8C29, 0x8292,\n    0x832B, 0x76F2, 0x6C13, 0x5FD9, 0x83BD, 0x732B, 0x8305, 0x951A,\n    0x6BDB, 0x77DB, 0x94C6, 0x536F, 0x8302, 0x5192, 0x5E3D, 0x8C8C,\n    0x8D38, 0x4E48, 0x73AB, 0x679A, 0x6885, 0x9176, 0x9709, 0x7164,\n    0x6CA1, 0x7709, 0x5A92, 0x9541, 0x6BCF, 0x7F8E, 0x6627, 0x5BD0,\n    0x59B9, 0x5A9A, 0x95E8, 0x95F7, 0x4EEC, 0x840C, 0x8499, 0x6AAC,\n    0x76DF, 0x9530, 0x731B, 0x68A6, 0x5B5F, 0x772F, 0x919A, 0x9761,\n    0x7CDC, 0x8FF7, 0x8C1C, 0x5F25, 0x7C73, 0x79D8, 0x89C5, 0x6CCC,\n    0x871C, 0x5BC6, 0x5E42, 0x68C9, 0x7720, 0x7EF5, 0x5195, 0x514D,\n    0x52C9, 0x5A29, 0x7F05, 0x9762, 0x82D7, 0x63CF, 0x7784, 0x85D0,\n    0x79D2, 0x6E3A, 0x5E99, 0x5999, 0x8511, 0x706D, 0x6C11, 0x62BF,\n    0x76BF, 0x654F, 0x60AF, 0x95FD, 0x660E, 0x879F, 0x9E23, 0x94ED,\n    0x540D, 0x547D, 0x8C2C, 0x6478, 0x6479, 0x8611, 0x6A21, 0x819C,\n    0x78E8, 0x6469, 0x9B54, 0x62B9, 0x672B, 0x83AB, 0x58A8, 0x9ED8,\n    0x6CAB, 0x6F20, 0x5BDE, 0x964C, 0x8C0B, 0x725F, 0x67D0, 0x62C7,\n    0x7261, 0x4EA9, 0x59C6, 0x6BCD, 0x5893, 0x66AE, 0x5E55, 0x52DF,\n    0x6155, 0x6728, 0x76EE, 0x7766, 0x7267, 0x7A46, 0x62FF, 0x54EA,\n    0x5450, 0x94A0, 0x90A3, 0x5A1C, 0x7EB3, 0x6C16, 0x4E43, 0x5976,\n    0x8010, 0x5948, 0x5357, 0x7537, 0x96BE, 0x56CA, 0x6320, 0x8111,\n    0x607C, 0x95F9, 0x6DD6, 0x5462, 0x9981, 0x5185, 0x5AE9, 0x80FD,\n    0x59AE, 0x9713, 0x502A, 0x6CE5, 0x5C3C, 0x62DF, 0x4F60, 0x533F,\n    0x817B, 0x9006, 0x6EBA, 0x852B, 0x62C8, 0x5E74, 0x78BE, 0x64B5,\n    0x637B, 0x5FF5, 0x5A18, 0x917F, 0x9E1F, 0x5C3F, 0x634F, 0x8042,\n    0x5B7D, 0x556E, 0x954A, 0x954D, 0x6D85, 0x60A8, 0x67E0, 0x72DE,\n    0x51DD, 0x5B81, 0x62E7, 0x6CDE, 0x725B, 0x626D, 0x94AE, 0x7EBD,\n    0x8113, 0x6D53, 0x519C, 0x5F04, 0x5974, 0x52AA, 0x6012, 0x5973,\n    0x6696, 0x8650, 0x759F, 0x632A, 0x61E6, 0x7CEF, 0x8BFA, 0x54E6,\n    0x6B27, 0x9E25, 0x6BB4, 0x85D5, 0x5455, 0x5076, 0x6CA4, 0x556A,\n    0x8DB4, 0x722C, 0x5E15, 0x6015, 0x7436, 0x62CD, 0x6392, 0x724C,\n    0x5F98, 0x6E43, 0x6D3E, 0x6500, 0x6F58, 0x76D8, 0x78D0, 0x76FC,\n    0x7554, 0x5224, 0x53DB, 0x4E53, 0x5E9E, 0x65C1, 0x802A, 0x80D6,\n    0x629B, 0x5486, 0x5228, 0x70AE, 0x888D, 0x8DD1, 0x6CE1, 0x5478,\n    0x80DA, 0x57F9, 0x88F4, 0x8D54, 0x966A, 0x914D, 0x4F69, 0x6C9B,\n    0x55B7, 0x76C6, 0x7830, 0x62A8, 0x70F9, 0x6F8E, 0x5F6D, 0x84EC,\n    0x68DA, 0x787C, 0x7BF7, 0x81A8, 0x670B, 0x9E4F, 0x6367, 0x78B0,\n    0x576F, 0x7812, 0x9739, 0x6279, 0x62AB, 0x5288, 0x7435, 0x6BD7,\n    0x5564, 0x813E, 0x75B2, 0x76AE, 0x5339, 0x75DE, 0x50FB, 0x5C41,\n    0x8B6C, 0x7BC7, 0x504F, 0x7247, 0x9A97, 0x98D8, 0x6F02, 0x74E2,\n    0x7968, 0x6487, 0x77A5, 0x62FC, 0x9891, 0x8D2B, 0x54C1, 0x8058,\n    0x4E52, 0x576A, 0x82F9, 0x840D, 0x5E73, 0x51ED, 0x74F6, 0x8BC4,\n    0x5C4F, 0x5761, 0x6CFC, 0x9887, 0x5A46, 0x7834, 0x9B44, 0x8FEB,\n    0x7C95, 0x5256, 0x6251, 0x94FA, 0x4EC6, 0x8386, 0x8461, 0x83E9,\n    0x84B2, 0x57D4, 0x6734, 0x5703, 0x666E, 0x6D66, 0x8C31, 0x66DD,\n    0x7011, 0x671F, 0x6B3A, 0x6816, 0x621A, 0x59BB, 0x4E03, 0x51C4,\n    0x6F06, 0x67D2, 0x6C8F, 0x5176, 0x68CB, 0x5947, 0x6B67, 0x7566,\n    0x5D0E, 0x8110, 0x9F50, 0x65D7, 0x7948, 0x7941, 0x9A91, 0x8D77,\n    0x5C82, 0x4E5E, 0x4F01, 0x542F, 0x5951, 0x780C, 0x5668, 0x6C14,\n    0x8FC4, 0x5F03, 0x6C7D, 0x6CE3, 0x8BAB, 0x6390, 0x6070, 0x6D3D,\n    0x7275, 0x6266, 0x948E, 0x94C5, 0x5343, 0x8FC1, 0x7B7E, 0x4EDF,\n    0x8C26, 0x4E7E, 0x9ED4, 0x94B1, 0x94B3, 0x524D, 0x6F5C, 0x9063,\n    0x6D45, 0x8C34, 0x5811, 0x5D4C, 0x6B20, 0x6B49, 0x67AA, 0x545B,\n    0x8154, 0x7F8C, 0x5899, 0x8537, 0x5F3A, 0x62A2, 0x6A47, 0x9539,\n    0x6572, 0x6084, 0x6865, 0x77A7, 0x4E54, 0x4FA8, 0x5DE7, 0x9798,\n    0x64AC, 0x7FD8, 0x5CED, 0x4FCF, 0x7A8D, 0x5207, 0x8304, 0x4E14,\n    0x602F, 0x7A83, 0x94A6, 0x4FB5, 0x4EB2, 0x79E6, 0x7434, 0x52E4,\n    0x82B9, 0x64D2, 0x79BD, 0x5BDD, 0x6C81, 0x9752, 0x8F7B, 0x6C22,\n    0x503E, 0x537F, 0x6E05, 0x64CE, 0x6674, 0x6C30, 0x60C5, 0x9877,\n    0x8BF7, 0x5E86, 0x743C, 0x7A77, 0x79CB, 0x4E18, 0x90B1, 0x7403,\n    0x6C42, 0x56DA, 0x914B, 0x6CC5, 0x8D8B, 0x533A, 0x86C6, 0x66F2,\n    0x8EAF, 0x5C48, 0x9A71, 0x6E20, 0x53D6, 0x5A36, 0x9F8B, 0x8DA3,\n    0x53BB, 0x5708, 0x98A7, 0x6743, 0x919B, 0x6CC9, 0x5168, 0x75CA,\n    0x62F3, 0x72AC, 0x5238, 0x529D, 0x7F3A, 0x7094, 0x7638, 0x5374,\n    0x9E4A, 0x69B7, 0x786E, 0x96C0, 0x88D9, 0x7FA4, 0x7136, 0x71C3,\n    0x5189, 0x67D3, 0x74E4, 0x58E4, 0x6518, 0x56B7, 0x8BA9, 0x9976,\n    0x6270, 0x7ED5, 0x60F9, 0x70ED, 0x58EC, 0x4EC1, 0x4EBA, 0x5FCD,\n    0x97E7, 0x4EFB, 0x8BA4, 0x5203, 0x598A, 0x7EAB, 0x6254, 0x4ECD,\n    0x65E5, 0x620E, 0x8338, 0x84C9, 0x8363, 0x878D, 0x7194, 0x6EB6,\n    0x5BB9, 0x7ED2, 0x5197, 0x63C9, 0x67D4, 0x8089, 0x8339, 0x8815,\n    0x5112, 0x5B7A, 0x5982, 0x8FB1, 0x4E73, 0x6C5D, 0x5165, 0x8925,\n    0x8F6F, 0x962E, 0x854A, 0x745E, 0x9510, 0x95F0, 0x6DA6, 0x82E5,\n    0x5F31, 0x6492, 0x6D12, 0x8428, 0x816E, 0x9CC3, 0x585E, 0x8D5B,\n    0x4E09, 0x53C1, 0x4F1E, 0x6563, 0x6851, 0x55D3, 0x4E27, 0x6414,\n    0x9A9A, 0x626B, 0x5AC2, 0x745F, 0x8272, 0x6DA9, 0x68EE, 0x50E7,\n    0x838E, 0x7802, 0x6740, 0x5239, 0x6C99, 0x7EB1, 0x50BB, 0x5565,\n    0x715E, 0x7B5B, 0x6652, 0x73CA, 0x82EB, 0x6749, 0x5C71, 0x5220,\n    0x717D, 0x886B, 0x95EA, 0x9655, 0x64C5, 0x8D61, 0x81B3, 0x5584,\n    0x6C55, 0x6247, 0x7F2E, 0x5892, 0x4F24, 0x5546, 0x8D4F, 0x664C,\n    0x4E0A, 0x5C1A, 0x88F3, 0x68A2, 0x634E, 0x7A0D, 0x70E7, 0x828D,\n    0x52FA, 0x97F6, 0x5C11, 0x54E8, 0x90B5, 0x7ECD, 0x5962, 0x8D4A,\n    0x86C7, 0x820C, 0x820D, 0x8D66, 0x6444, 0x5C04, 0x6151, 0x6D89,\n    0x793E, 0x8BBE, 0x7837, 0x7533, 0x547B, 0x4F38, 0x8EAB, 0x6DF1,\n    0x5A20, 0x7EC5, 0x795E, 0x6C88, 0x5BA1, 0x5A76, 0x751A, 0x80BE,\n    0x614E, 0x6E17, 0x58F0, 0x751F, 0x7525, 0x7272, 0x5347, 0x7EF3,\n    0x7701, 0x76DB, 0x5269, 0x80DC, 0x5723, 0x5E08, 0x5931, 0x72EE,\n    0x65BD, 0x6E7F, 0x8BD7, 0x5C38, 0x8671, 0x5341, 0x77F3, 0x62FE,\n    0x65F6, 0x4EC0, 0x98DF, 0x8680, 0x5B9E, 0x8BC6, 0x53F2, 0x77E2,\n    0x4F7F, 0x5C4E, 0x9A76, 0x59CB, 0x5F0F, 0x793A, 0x58EB, 0x4E16,\n    0x67FF, 0x4E8B, 0x62ED, 0x8A93, 0x901D, 0x52BF, 0x662F, 0x55DC,\n    0x566C, 0x9002, 0x4ED5, 0x4F8D, 0x91CA, 0x9970, 0x6C0F, 0x5E02,\n    0x6043, 0x5BA4, 0x89C6, 0x8BD5, 0x6536, 0x624B, 0x9996, 0x5B88,\n    0x5BFF, 0x6388, 0x552E, 0x53D7, 0x7626, 0x517D, 0x852C, 0x67A2,\n    0x68B3, 0x6B8A, 0x6292, 0x8F93, 0x53D4, 0x8212, 0x6DD1, 0x758F,\n    0x4E66, 0x8D4E, 0x5B70, 0x719F, 0x85AF, 0x6691, 0x66D9, 0x7F72,\n    0x8700, 0x9ECD, 0x9F20, 0x5C5E, 0x672F, 0x8FF0, 0x6811, 0x675F,\n    0x620D, 0x7AD6, 0x5885, 0x5EB6, 0x6570, 0x6F31, 0x6055, 0x5237,\n    0x800D, 0x6454, 0x8870, 0x7529, 0x5E05, 0x6813, 0x62F4, 0x971C,\n    0x53CC, 0x723D, 0x8C01, 0x6C34, 0x7761, 0x7A0E, 0x542E, 0x77AC,\n    0x987A, 0x821C, 0x8BF4, 0x7855, 0x6714, 0x70C1, 0x65AF, 0x6495,\n    0x5636, 0x601D, 0x79C1, 0x53F8, 0x4E1D, 0x6B7B, 0x8086, 0x5BFA,\n    0x55E3, 0x56DB, 0x4F3A, 0x4F3C, 0x9972, 0x5DF3, 0x677E, 0x8038,\n    0x6002, 0x9882, 0x9001, 0x5B8B, 0x8BBC, 0x8BF5, 0x641C, 0x8258,\n    0x64DE, 0x55FD, 0x82CF, 0x9165, 0x4FD7, 0x7D20, 0x901F, 0x7C9F,\n    0x50F3, 0x5851, 0x6EAF, 0x5BBF, 0x8BC9, 0x8083, 0x9178, 0x849C,\n    0x7B97, 0x867D, 0x968B, 0x968F, 0x7EE5, 0x9AD3, 0x788E, 0x5C81,\n    0x7A57, 0x9042, 0x96A7, 0x795F, 0x5B59, 0x635F, 0x7B0B, 0x84D1,\n    0x68AD, 0x5506, 0x7F29, 0x7410, 0x7D22, 0x9501, 0x6240, 0x584C,\n    0x4ED6, 0x5B83, 0x5979, 0x5854, 0x736D, 0x631E, 0x8E4B, 0x8E0F,\n    0x80CE, 0x82D4, 0x62AC, 0x53F0, 0x6CF0, 0x915E, 0x592A, 0x6001,\n    0x6C70, 0x574D, 0x644A, 0x8D2A, 0x762B, 0x6EE9, 0x575B, 0x6A80,\n    0x75F0, 0x6F6D, 0x8C2D, 0x8C08, 0x5766, 0x6BEF, 0x8892, 0x78B3,\n    0x63A2, 0x53F9, 0x70AD, 0x6C64, 0x5858, 0x642A, 0x5802, 0x68E0,\n    0x819B, 0x5510, 0x7CD6, 0x5018, 0x8EBA, 0x6DCC, 0x8D9F, 0x70EB,\n    0x638F, 0x6D9B, 0x6ED4, 0x7EE6, 0x8404, 0x6843, 0x9003, 0x6DD8,\n    0x9676, 0x8BA8, 0x5957, 0x7279, 0x85E4, 0x817E, 0x75BC, 0x8A8A,\n    0x68AF, 0x5254, 0x8E22, 0x9511, 0x63D0, 0x9898, 0x8E44, 0x557C,\n    0x4F53, 0x66FF, 0x568F, 0x60D5, 0x6D95, 0x5243, 0x5C49, 0x5929,\n    0x6DFB, 0x586B, 0x7530, 0x751C, 0x606C, 0x8214, 0x8146, 0x6311,\n    0x6761, 0x8FE2, 0x773A, 0x8DF3, 0x8D34, 0x94C1, 0x5E16, 0x5385,\n    0x542C, 0x70C3, 0x6C40, 0x5EF7, 0x505C, 0x4EAD, 0x5EAD, 0x633A,\n    0x8247, 0x901A, 0x6850, 0x916E, 0x77B3, 0x540C, 0x94DC, 0x5F64,\n    0x7AE5, 0x6876, 0x6345, 0x7B52, 0x7EDF, 0x75DB, 0x5077, 0x6295,\n    0x5934, 0x900F, 0x51F8, 0x79C3, 0x7A81, 0x56FE, 0x5F92, 0x9014,\n    0x6D82, 0x5C60, 0x571F, 0x5410, 0x5154, 0x6E4D, 0x56E2, 0x63A8,\n    0x9893, 0x817F, 0x8715, 0x892A, 0x9000, 0x541E, 0x5C6F, 0x81C0,\n    0x62D6, 0x6258, 0x8131, 0x9E35, 0x9640, 0x9A6E, 0x9A7C, 0x692D,\n    0x59A5, 0x62D3, 0x553E, 0x6316, 0x54C7, 0x86D9, 0x6D3C, 0x5A03,\n    0x74E6, 0x889C, 0x6B6A, 0x5916, 0x8C4C, 0x5F2F, 0x6E7E, 0x73A9,\n    0x987D, 0x4E38, 0x70F7, 0x5B8C, 0x7897, 0x633D, 0x665A, 0x7696,\n    0x60CB, 0x5B9B, 0x5A49, 0x4E07, 0x8155, 0x6C6A, 0x738B, 0x4EA1,\n    0x6789, 0x7F51, 0x5F80, 0x65FA, 0x671B, 0x5FD8, 0x5984, 0x5A01,\n    0x5DCD, 0x5FAE, 0x5371, 0x97E6, 0x8FDD, 0x6845, 0x56F4, 0x552F,\n    0x60DF, 0x4E3A, 0x6F4D, 0x7EF4, 0x82C7, 0x840E, 0x59D4, 0x4F1F,\n    0x4F2A, 0x5C3E, 0x7EAC, 0x672A, 0x851A, 0x5473, 0x754F, 0x80C3,\n    0x5582, 0x9B4F, 0x4F4D, 0x6E2D, 0x8C13, 0x5C09, 0x6170, 0x536B,\n    0x761F, 0x6E29, 0x868A, 0x6587, 0x95FB, 0x7EB9, 0x543B, 0x7A33,\n    0x7D0A, 0x95EE, 0x55E1, 0x7FC1, 0x74EE, 0x631D, 0x8717, 0x6DA1,\n    0x7A9D, 0x6211, 0x65A1, 0x5367, 0x63E1, 0x6C83, 0x5DEB, 0x545C,\n    0x94A8, 0x4E4C, 0x6C61, 0x8BEC, 0x5C4B, 0x65E0, 0x829C, 0x68A7,\n    0x543E, 0x5434, 0x6BCB, 0x6B66, 0x4E94, 0x6342, 0x5348, 0x821E,\n    0x4F0D, 0x4FAE, 0x575E, 0x620A, 0x96FE, 0x6664, 0x7269, 0x52FF,\n    0x52A1, 0x609F, 0x8BEF, 0x6614, 0x7199, 0x6790, 0x897F, 0x7852,\n    0x77FD, 0x6670, 0x563B, 0x5438, 0x9521, 0x727A, 0x7A00, 0x606F,\n    0x5E0C, 0x6089, 0x819D, 0x5915, 0x60DC, 0x7184, 0x70EF, 0x6EAA,\n    0x6C50, 0x7280, 0x6A84, 0x88AD, 0x5E2D, 0x4E60, 0x5AB3, 0x559C,\n    0x94E3, 0x6D17, 0x7CFB, 0x9699, 0x620F, 0x7EC6, 0x778E, 0x867E,\n    0x5323, 0x971E, 0x8F96, 0x6687, 0x5CE1, 0x4FA0, 0x72ED, 0x4E0B,\n    0x53A6, 0x590F, 0x5413, 0x6380, 0x9528, 0x5148, 0x4ED9, 0x9C9C,\n    0x7EA4, 0x54B8, 0x8D24, 0x8854, 0x8237, 0x95F2, 0x6D8E, 0x5F26,\n    0x5ACC, 0x663E, 0x9669, 0x73B0, 0x732E, 0x53BF, 0x817A, 0x9985,\n    0x7FA1, 0x5BAA, 0x9677, 0x9650, 0x7EBF, 0x76F8, 0x53A2, 0x9576,\n    0x9999, 0x7BB1, 0x8944, 0x6E58, 0x4E61, 0x7FD4, 0x7965, 0x8BE6,\n    0x60F3, 0x54CD, 0x4EAB, 0x9879, 0x5DF7, 0x6A61, 0x50CF, 0x5411,\n    0x8C61, 0x8427, 0x785D, 0x9704, 0x524A, 0x54EE, 0x56A3, 0x9500,\n    0x6D88, 0x5BB5, 0x6DC6, 0x6653, 0x5C0F, 0x5B5D, 0x6821, 0x8096,\n    0x5578, 0x7B11, 0x6548, 0x6954, 0x4E9B, 0x6B47, 0x874E, 0x978B,\n    0x534F, 0x631F, 0x643A, 0x90AA, 0x659C, 0x80C1, 0x8C10, 0x5199,\n    0x68B0, 0x5378, 0x87F9, 0x61C8, 0x6CC4, 0x6CFB, 0x8C22, 0x5C51,\n    0x85AA, 0x82AF, 0x950C, 0x6B23, 0x8F9B, 0x65B0, 0x5FFB, 0x5FC3,\n    0x4FE1, 0x8845, 0x661F, 0x8165, 0x7329, 0x60FA, 0x5174, 0x5211,\n    0x578B, 0x5F62, 0x90A2, 0x884C, 0x9192, 0x5E78, 0x674F, 0x6027,\n    0x59D3, 0x5144, 0x51F6, 0x80F8, 0x5308, 0x6C79, 0x96C4, 0x718A,\n    0x4F11, 0x4FEE, 0x7F9E, 0x673D, 0x55C5, 0x9508, 0x79C0, 0x8896,\n    0x7EE3, 0x589F, 0x620C, 0x9700, 0x865A, 0x5618, 0x987B, 0x5F90,\n    0x8BB8, 0x84C4, 0x9157, 0x53D9, 0x65ED, 0x5E8F, 0x755C, 0x6064,\n    0x7D6E, 0x5A7F, 0x7EEA, 0x7EED, 0x8F69, 0x55A7, 0x5BA3, 0x60AC,\n    0x65CB, 0x7384, 0x9009, 0x7663, 0x7729, 0x7EDA, 0x9774, 0x859B,\n    0x5B66, 0x7A74, 0x96EA, 0x8840, 0x52CB, 0x718F, 0x5FAA, 0x65EC,\n    0x8BE2, 0x5BFB, 0x9A6F, 0x5DE1, 0x6B89, 0x6C5B, 0x8BAD, 0x8BAF,\n    0x900A, 0x8FC5, 0x538B, 0x62BC, 0x9E26, 0x9E2D, 0x5440, 0x4E2B,\n    0x82BD, 0x7259, 0x869C, 0x5D16, 0x8859, 0x6DAF, 0x96C5, 0x54D1,\n    0x4E9A, 0x8BB6, 0x7109, 0x54BD, 0x9609, 0x70DF, 0x6DF9, 0x76D0,\n    0x4E25, 0x7814, 0x8712, 0x5CA9, 0x5EF6, 0x8A00, 0x989C, 0x960E,\n    0x708E, 0x6CBF, 0x5944, 0x63A9, 0x773C, 0x884D, 0x6F14, 0x8273,\n    0x5830, 0x71D5, 0x538C, 0x781A, 0x96C1, 0x5501, 0x5F66, 0x7130,\n    0x5BB4, 0x8C1A, 0x9A8C, 0x6B83, 0x592E, 0x9E2F, 0x79E7, 0x6768,\n    0x626C, 0x4F6F, 0x75A1, 0x7F8A, 0x6D0B, 0x9633, 0x6C27, 0x4EF0,\n    0x75D2, 0x517B, 0x6837, 0x6F3E, 0x9080, 0x8170, 0x5996, 0x7476,\n    0x6447, 0x5C27, 0x9065, 0x7A91, 0x8C23, 0x59DA, 0x54AC, 0x8200,\n    0x836F, 0x8981, 0x8000, 0x6930, 0x564E, 0x8036, 0x7237, 0x91CE,\n    0x51B6, 0x4E5F, 0x9875, 0x6396, 0x4E1A, 0x53F6, 0x66F3, 0x814B,\n    0x591C, 0x6DB2, 0x4E00, 0x58F9, 0x533B, 0x63D6, 0x94F1, 0x4F9D,\n    0x4F0A, 0x8863, 0x9890, 0x5937, 0x9057, 0x79FB, 0x4EEA, 0x80F0,\n    0x7591, 0x6C82, 0x5B9C, 0x59E8, 0x5F5D, 0x6905, 0x8681, 0x501A,\n    0x5DF2, 0x4E59, 0x77E3, 0x4EE5, 0x827A, 0x6291, 0x6613, 0x9091,\n    0x5C79, 0x4EBF, 0x5F79, 0x81C6, 0x9038, 0x8084, 0x75AB, 0x4EA6,\n    0x88D4, 0x610F, 0x6BC5, 0x5FC6, 0x4E49, 0x76CA, 0x6EA2, 0x8BE3,\n    0x8BAE, 0x8C0A, 0x8BD1, 0x5F02, 0x7FFC, 0x7FCC, 0x7ECE, 0x8335,\n    0x836B, 0x56E0, 0x6BB7, 0x97F3, 0x9634, 0x59FB, 0x541F, 0x94F6,\n    0x6DEB, 0x5BC5, 0x996E, 0x5C39, 0x5F15, 0x9690, 0x5370, 0x82F1,\n    0x6A31, 0x5A74, 0x9E70, 0x5E94, 0x7F28, 0x83B9, 0x8424, 0x8425,\n    0x8367, 0x8747, 0x8FCE, 0x8D62, 0x76C8, 0x5F71, 0x9896, 0x786C,\n    0x6620, 0x54DF, 0x62E5, 0x4F63, 0x81C3, 0x75C8, 0x5EB8, 0x96CD,\n    0x8E0A, 0x86F9, 0x548F, 0x6CF3, 0x6D8C, 0x6C38, 0x607F, 0x52C7,\n    0x7528, 0x5E7D, 0x4F18, 0x60A0, 0x5FE7, 0x5C24, 0x7531, 0x90AE,\n    0x94C0, 0x72B9, 0x6CB9, 0x6E38, 0x9149, 0x6709, 0x53CB, 0x53F3,\n    0x4F51, 0x91C9, 0x8BF1, 0x53C8, 0x5E7C, 0x8FC2, 0x6DE4, 0x4E8E,\n    0x76C2, 0x6986, 0x865E, 0x611A, 0x8206, 0x4F59, 0x4FDE, 0x903E,\n    0x9C7C, 0x6109, 0x6E1D, 0x6E14, 0x9685, 0x4E88, 0x5A31, 0x96E8,\n    0x4E0E, 0x5C7F, 0x79B9, 0x5B87, 0x8BED, 0x7FBD, 0x7389, 0x57DF,\n    0x828B, 0x90C1, 0x5401, 0x9047, 0x55BB, 0x5CEA, 0x5FA1, 0x6108,\n    0x6B32, 0x72F1, 0x80B2, 0x8A89, 0x6D74, 0x5BD3, 0x88D5, 0x9884,\n    0x8C6B, 0x9A6D, 0x9E33, 0x6E0A, 0x51A4, 0x5143, 0x57A3, 0x8881,\n    0x539F, 0x63F4, 0x8F95, 0x56ED, 0x5458, 0x5706, 0x733F, 0x6E90,\n    0x7F18, 0x8FDC, 0x82D1, 0x613F, 0x6028, 0x9662, 0x66F0, 0x7EA6,\n    0x8D8A, 0x8DC3, 0x94A5, 0x5CB3, 0x7CA4, 0x6708, 0x60A6, 0x9605,\n    0x8018, 0x4E91, 0x90E7, 0x5300, 0x9668, 0x5141, 0x8FD0, 0x8574,\n    0x915D, 0x6655, 0x97F5, 0x5B55, 0x531D, 0x7838, 0x6742, 0x683D,\n    0x54C9, 0x707E, 0x5BB0, 0x8F7D, 0x518D, 0x5728, 0x54B1, 0x6512,\n    0x6682, 0x8D5E, 0x8D43, 0x810F, 0x846C, 0x906D, 0x7CDF, 0x51FF,\n    0x85FB, 0x67A3, 0x65E9, 0x6FA1, 0x86A4, 0x8E81, 0x566A, 0x9020,\n    0x7682, 0x7076, 0x71E5, 0x8D23, 0x62E9, 0x5219, 0x6CFD, 0x8D3C,\n    0x600E, 0x589E, 0x618E, 0x66FE, 0x8D60, 0x624E, 0x55B3, 0x6E23,\n    0x672D, 0x8F67, 0x94E1, 0x95F8, 0x7728, 0x6805, 0x69A8, 0x548B,\n    0x4E4D, 0x70B8, 0x8BC8, 0x6458, 0x658B, 0x5B85, 0x7A84, 0x503A,\n    0x5BE8, 0x77BB, 0x6BE1, 0x8A79, 0x7C98, 0x6CBE, 0x76CF, 0x65A9,\n    0x8F97, 0x5D2D, 0x5C55, 0x8638, 0x6808, 0x5360, 0x6218, 0x7AD9,\n    0x6E5B, 0x7EFD, 0x6A1F, 0x7AE0, 0x5F70, 0x6F33, 0x5F20, 0x638C,\n    0x6DA8, 0x6756, 0x4E08, 0x5E10, 0x8D26, 0x4ED7, 0x80C0, 0x7634,\n    0x969C, 0x62DB, 0x662D, 0x627E, 0x6CBC, 0x8D75, 0x7167, 0x7F69,\n    0x5146, 0x8087, 0x53EC, 0x906E, 0x6298, 0x54F2, 0x86F0, 0x8F99,\n    0x8005, 0x9517, 0x8517, 0x8FD9, 0x6D59, 0x73CD, 0x659F, 0x771F,\n    0x7504, 0x7827, 0x81FB, 0x8D1E, 0x9488, 0x4FA6, 0x6795, 0x75B9,\n    0x8BCA, 0x9707, 0x632F, 0x9547, 0x9635, 0x84B8, 0x6323, 0x7741,\n    0x5F81, 0x72F0, 0x4E89, 0x6014, 0x6574, 0x62EF, 0x6B63, 0x653F,\n    0x5E27, 0x75C7, 0x90D1, 0x8BC1, 0x829D, 0x679D, 0x652F, 0x5431,\n    0x8718, 0x77E5, 0x80A2, 0x8102, 0x6C41, 0x4E4B, 0x7EC7, 0x804C,\n    0x76F4, 0x690D, 0x6B96, 0x6267, 0x503C, 0x4F84, 0x5740, 0x6307,\n    0x6B62, 0x8DBE, 0x53EA, 0x65E8, 0x7EB8, 0x5FD7, 0x631A, 0x63B7,\n    0x81F3, 0x81F4, 0x7F6E, 0x5E1C, 0x5CD9, 0x5236, 0x667A, 0x79E9,\n    0x7A1A, 0x8D28, 0x7099, 0x75D4, 0x6EDE, 0x6CBB, 0x7A92, 0x4E2D,\n    0x76C5, 0x5FE0, 0x949F, 0x8877, 0x7EC8, 0x79CD, 0x80BF, 0x91CD,\n    0x4EF2, 0x4F17, 0x821F, 0x5468, 0x5DDE, 0x6D32, 0x8BCC, 0x7CA5,\n    0x8F74, 0x8098, 0x5E1A, 0x5492, 0x76B1, 0x5B99, 0x663C, 0x9AA4,\n    0x73E0, 0x682A, 0x86DB, 0x6731, 0x732A, 0x8BF8, 0x8BDB, 0x9010,\n    0x7AF9, 0x70DB, 0x716E, 0x62C4, 0x77A9, 0x5631, 0x4E3B, 0x8457,\n    0x67F1, 0x52A9, 0x86C0, 0x8D2E, 0x94F8, 0x7B51, 0x4F4F, 0x6CE8,\n    0x795D, 0x9A7B, 0x6293, 0x722A, 0x62FD, 0x4E13, 0x7816, 0x8F6C,\n    0x64B0, 0x8D5A, 0x7BC6, 0x6869, 0x5E84, 0x88C5, 0x5986, 0x649E,\n    0x58EE, 0x72B6, 0x690E, 0x9525, 0x8FFD, 0x8D58, 0x5760, 0x7F00,\n    0x8C06, 0x51C6, 0x6349, 0x62D9, 0x5353, 0x684C, 0x7422, 0x8301,\n    0x914C, 0x5544, 0x7740, 0x707C, 0x6D4A, 0x5179, 0x54A8, 0x8D44,\n    0x59FF, 0x6ECB, 0x6DC4, 0x5B5C, 0x7D2B, 0x4ED4, 0x7C7D, 0x6ED3,\n    0x5B50, 0x81EA, 0x6E0D, 0x5B57, 0x9B03, 0x68D5, 0x8E2A, 0x5B97,\n    0x7EFC, 0x603B, 0x7EB5, 0x90B9, 0x8D70, 0x594F, 0x63CD, 0x79DF,\n    0x8DB3, 0x5352, 0x65CF, 0x7956, 0x8BC5, 0x963B, 0x7EC4, 0x94BB,\n    0x7E82, 0x5634, 0x9189, 0x6700, 0x7F6A, 0x5C0A, 0x9075, 0x6628,\n    0x5DE6, 0x4F50, 0x67DE, 0x505A, 0x4F5C, 0x5750, 0x5EA7, 0x4E8D,\n    0x4E0C, 0x5140, 0x4E10, 0x5EFF, 0x5345, 0x4E15, 0x4E98, 0x4E1E,\n    0x9B32, 0x5B6C, 0x5669, 0x4E28, 0x79BA, 0x4E3F, 0x5315, 0x4E47,\n    0x592D, 0x723B, 0x536E, 0x6C10, 0x56DF, 0x80E4, 0x9997, 0x6BD3,\n    0x777E, 0x9F17, 0x4E36, 0x4E9F, 0x9F10, 0x4E5C, 0x4E69, 0x4E93,\n    0x8288, 0x5B5B, 0x556C, 0x560F, 0x4EC4, 0x538D, 0x539D, 0x53A3,\n    0x53A5, 0x53AE, 0x9765, 0x8D5D, 0x531A, 0x53F5, 0x5326, 0x532E,\n    0x533E, 0x8D5C, 0x5366, 0x5363, 0x5202, 0x5208, 0x520E, 0x522D,\n    0x5233, 0x523F, 0x5240, 0x524C, 0x525E, 0x5261, 0x525C, 0x84AF,\n    0x527D, 0x5282, 0x5281, 0x5290, 0x5293, 0x5182, 0x7F54, 0x4EBB,\n    0x4EC3, 0x4EC9, 0x4EC2, 0x4EE8, 0x4EE1, 0x4EEB, 0x4EDE, 0x4F1B,\n    0x4EF3, 0x4F22, 0x4F64, 0x4EF5, 0x4F25, 0x4F27, 0x4F09, 0x4F2B,\n    0x4F5E, 0x4F67, 0x6538, 0x4F5A, 0x4F5D, 0x4F5F, 0x4F57, 0x4F32,\n    0x4F3D, 0x4F76, 0x4F74, 0x4F91, 0x4F89, 0x4F83, 0x4F8F, 0x4F7E,\n    0x4F7B, 0x4FAA, 0x4F7C, 0x4FAC, 0x4F94, 0x4FE6, 0x4FE8, 0x4FEA,\n    0x4FC5, 0x4FDA, 0x4FE3, 0x4FDC, 0x4FD1, 0x4FDF, 0x4FF8, 0x5029,\n    0x504C, 0x4FF3, 0x502C, 0x500F, 0x502E, 0x502D, 0x4FFE, 0x501C,\n    0x500C, 0x5025, 0x5028, 0x507E, 0x5043, 0x5055, 0x5048, 0x504E,\n    0x506C, 0x507B, 0x50A5, 0x50A7, 0x50A9, 0x50BA, 0x50D6, 0x5106,\n    0x50ED, 0x50EC, 0x50E6, 0x50EE, 0x5107, 0x510B, 0x4EDD, 0x6C3D,\n    0x4F58, 0x4F65, 0x4FCE, 0x9FA0, 0x6C46, 0x7C74, 0x516E, 0x5DFD,\n    0x9EC9, 0x9998, 0x5181, 0x5914, 0x52F9, 0x530D, 0x8A07, 0x5310,\n    0x51EB, 0x5919, 0x5155, 0x4EA0, 0x5156, 0x4EB3, 0x886E, 0x88A4,\n    0x4EB5, 0x8114, 0x88D2, 0x7980, 0x5B34, 0x8803, 0x7FB8, 0x51AB,\n    0x51B1, 0x51BD, 0x51BC, 0x51C7, 0x5196, 0x51A2, 0x51A5, 0x8BA0,\n    0x8BA6, 0x8BA7, 0x8BAA, 0x8BB4, 0x8BB5, 0x8BB7, 0x8BC2, 0x8BC3,\n    0x8BCB, 0x8BCF, 0x8BCE, 0x8BD2, 0x8BD3, 0x8BD4, 0x8BD6, 0x8BD8,\n    0x8BD9, 0x8BDC, 0x8BDF, 0x8BE0, 0x8BE4, 0x8BE8, 0x8BE9, 0x8BEE,\n    0x8BF0, 0x8BF3, 0x8BF6, 0x8BF9, 0x8BFC, 0x8BFF, 0x8C00, 0x8C02,\n    0x8C04, 0x8C07, 0x8C0C, 0x8C0F, 0x8C11, 0x8C12, 0x8C14, 0x8C15,\n    0x8C16, 0x8C19, 0x8C1B, 0x8C18, 0x8C1D, 0x8C1F, 0x8C20, 0x8C21,\n    0x8C25, 0x8C27, 0x8C2A, 0x8C2B, 0x8C2E, 0x8C2F, 0x8C32, 0x8C33,\n    0x8C35, 0x8C36, 0x5369, 0x537A, 0x961D, 0x9622, 0x9621, 0x9631,\n    0x962A, 0x963D, 0x963C, 0x9642, 0x9649, 0x9654, 0x965F, 0x9667,\n    0x966C, 0x9672, 0x9674, 0x9688, 0x968D, 0x9697, 0x96B0, 0x9097,\n    0x909B, 0x909D, 0x9099, 0x90AC, 0x90A1, 0x90B4, 0x90B3, 0x90B6,\n    0x90BA, 0x90B8, 0x90B0, 0x90CF, 0x90C5, 0x90BE, 0x90D0, 0x90C4,\n    0x90C7, 0x90D3, 0x90E6, 0x90E2, 0x90DC, 0x90D7, 0x90DB, 0x90EB,\n    0x90EF, 0x90FE, 0x9104, 0x9122, 0x911E, 0x9123, 0x9131, 0x912F,\n    0x9139, 0x9143, 0x9146, 0x520D, 0x5942, 0x52A2, 0x52AC, 0x52AD,\n    0x52BE, 0x54FF, 0x52D0, 0x52D6, 0x52F0, 0x53DF, 0x71EE, 0x77CD,\n    0x5EF4, 0x51F5, 0x51FC, 0x9B2F, 0x53B6, 0x5F01, 0x755A, 0x5DEF,\n    0x574C, 0x57A9, 0x57A1, 0x587E, 0x58BC, 0x58C5, 0x58D1, 0x5729,\n    0x572C, 0x572A, 0x5733, 0x5739, 0x572E, 0x572F, 0x575C, 0x573B,\n    0x5742, 0x5769, 0x5785, 0x576B, 0x5786, 0x577C, 0x577B, 0x5768,\n    0x576D, 0x5776, 0x5773, 0x57AD, 0x57A4, 0x578C, 0x57B2, 0x57CF,\n    0x57A7, 0x57B4, 0x5793, 0x57A0, 0x57D5, 0x57D8, 0x57DA, 0x57D9,\n    0x57D2, 0x57B8, 0x57F4, 0x57EF, 0x57F8, 0x57E4, 0x57DD, 0x580B,\n    0x580D, 0x57FD, 0x57ED, 0x5800, 0x581E, 0x5819, 0x5844, 0x5820,\n    0x5865, 0x586C, 0x5881, 0x5889, 0x589A, 0x5880, 0x99A8, 0x9F19,\n    0x61FF, 0x8279, 0x827D, 0x827F, 0x828F, 0x828A, 0x82A8, 0x8284,\n    0x828E, 0x8291, 0x8297, 0x8299, 0x82AB, 0x82B8, 0x82BE, 0x82B0,\n    0x82C8, 0x82CA, 0x82E3, 0x8298, 0x82B7, 0x82AE, 0x82CB, 0x82CC,\n    0x82C1, 0x82A9, 0x82B4, 0x82A1, 0x82AA, 0x829F, 0x82C4, 0x82CE,\n    0x82A4, 0x82E1, 0x8309, 0x82F7, 0x82E4, 0x830F, 0x8307, 0x82DC,\n    0x82F4, 0x82D2, 0x82D8, 0x830C, 0x82FB, 0x82D3, 0x8311, 0x831A,\n    0x8306, 0x8314, 0x8315, 0x82E0, 0x82D5, 0x831C, 0x8351, 0x835B,\n    0x835C, 0x8308, 0x8392, 0x833C, 0x8334, 0x8331, 0x839B, 0x835E,\n    0x832F, 0x834F, 0x8347, 0x8343, 0x835F, 0x8340, 0x8317, 0x8360,\n    0x832D, 0x833A, 0x8333, 0x8366, 0x8365, 0x8368, 0x831B, 0x8369,\n    0x836C, 0x836A, 0x836D, 0x836E, 0x83B0, 0x8378, 0x83B3, 0x83B4,\n    0x83A0, 0x83AA, 0x8393, 0x839C, 0x8385, 0x837C, 0x83B6, 0x83A9,\n    0x837D, 0x83B8, 0x837B, 0x8398, 0x839E, 0x83A8, 0x83BA, 0x83BC,\n    0x83C1, 0x8401, 0x83E5, 0x83D8, 0x5807, 0x8418, 0x840B, 0x83DD,\n    0x83FD, 0x83D6, 0x841C, 0x8438, 0x8411, 0x8406, 0x83D4, 0x83DF,\n    0x840F, 0x8403, 0x83F8, 0x83F9, 0x83EA, 0x83C5, 0x83C0, 0x8426,\n    0x83F0, 0x83E1, 0x845C, 0x8451, 0x845A, 0x8459, 0x8473, 0x8487,\n    0x8488, 0x847A, 0x8489, 0x8478, 0x843C, 0x8446, 0x8469, 0x8476,\n    0x848C, 0x848E, 0x8431, 0x846D, 0x84C1, 0x84CD, 0x84D0, 0x84E6,\n    0x84BD, 0x84D3, 0x84CA, 0x84BF, 0x84BA, 0x84E0, 0x84A1, 0x84B9,\n    0x84B4, 0x8497, 0x84E5, 0x84E3, 0x850C, 0x750D, 0x8538, 0x84F0,\n    0x8539, 0x851F, 0x853A, 0x8556, 0x853B, 0x84FF, 0x84FC, 0x8559,\n    0x8548, 0x8568, 0x8564, 0x855E, 0x857A, 0x77A2, 0x8543, 0x8572,\n    0x857B, 0x85A4, 0x85A8, 0x8587, 0x858F, 0x8579, 0x85AE, 0x859C,\n    0x8585, 0x85B9, 0x85B7, 0x85B0, 0x85D3, 0x85C1, 0x85DC, 0x85FF,\n    0x8627, 0x8605, 0x8629, 0x8616, 0x863C, 0x5EFE, 0x5F08, 0x593C,\n    0x5941, 0x8037, 0x5955, 0x595A, 0x5958, 0x530F, 0x5C22, 0x5C25,\n    0x5C2C, 0x5C34, 0x624C, 0x626A, 0x629F, 0x62BB, 0x62CA, 0x62DA,\n    0x62D7, 0x62EE, 0x6322, 0x62F6, 0x6339, 0x634B, 0x6343, 0x63AD,\n    0x63F6, 0x6371, 0x637A, 0x638E, 0x63B4, 0x636D, 0x63AC, 0x638A,\n    0x6369, 0x63AE, 0x63BC, 0x63F2, 0x63F8, 0x63E0, 0x63FF, 0x63C4,\n    0x63DE, 0x63CE, 0x6452, 0x63C6, 0x63BE, 0x6445, 0x6441, 0x640B,\n    0x641B, 0x6420, 0x640C, 0x6426, 0x6421, 0x645E, 0x6484, 0x646D,\n    0x6496, 0x647A, 0x64B7, 0x64B8, 0x6499, 0x64BA, 0x64C0, 0x64D0,\n    0x64D7, 0x64E4, 0x64E2, 0x6509, 0x6525, 0x652E, 0x5F0B, 0x5FD2,\n    0x7519, 0x5F11, 0x535F, 0x53F1, 0x53FD, 0x53E9, 0x53E8, 0x53FB,\n    0x5412, 0x5416, 0x5406, 0x544B, 0x5452, 0x5453, 0x5454, 0x5456,\n    0x5443, 0x5421, 0x5457, 0x5459, 0x5423, 0x5432, 0x5482, 0x5494,\n    0x5477, 0x5471, 0x5464, 0x549A, 0x549B, 0x5484, 0x5476, 0x5466,\n    0x549D, 0x54D0, 0x54AD, 0x54C2, 0x54B4, 0x54D2, 0x54A7, 0x54A6,\n    0x54D3, 0x54D4, 0x5472, 0x54A3, 0x54D5, 0x54BB, 0x54BF, 0x54CC,\n    0x54D9, 0x54DA, 0x54DC, 0x54A9, 0x54AA, 0x54A4, 0x54DD, 0x54CF,\n    0x54DE, 0x551B, 0x54E7, 0x5520, 0x54FD, 0x5514, 0x54F3, 0x5522,\n    0x5523, 0x550F, 0x5511, 0x5527, 0x552A, 0x5567, 0x558F, 0x55B5,\n    0x5549, 0x556D, 0x5541, 0x5555, 0x553F, 0x5550, 0x553C, 0x5537,\n    0x5556, 0x5575, 0x5576, 0x5577, 0x5533, 0x5530, 0x555C, 0x558B,\n    0x55D2, 0x5583, 0x55B1, 0x55B9, 0x5588, 0x5581, 0x559F, 0x557E,\n    0x55D6, 0x5591, 0x557B, 0x55DF, 0x55BD, 0x55BE, 0x5594, 0x5599,\n    0x55EA, 0x55F7, 0x55C9, 0x561F, 0x55D1, 0x55EB, 0x55EC, 0x55D4,\n    0x55E6, 0x55DD, 0x55C4, 0x55EF, 0x55E5, 0x55F2, 0x55F3, 0x55CC,\n    0x55CD, 0x55E8, 0x55F5, 0x55E4, 0x8F94, 0x561E, 0x5608, 0x560C,\n    0x5601, 0x5624, 0x5623, 0x55FE, 0x5600, 0x5627, 0x562D, 0x5658,\n    0x5639, 0x5657, 0x562C, 0x564D, 0x5662, 0x5659, 0x565C, 0x564C,\n    0x5654, 0x5686, 0x5664, 0x5671, 0x566B, 0x567B, 0x567C, 0x5685,\n    0x5693, 0x56AF, 0x56D4, 0x56D7, 0x56DD, 0x56E1, 0x56F5, 0x56EB,\n    0x56F9, 0x56FF, 0x5704, 0x570A, 0x5709, 0x571C, 0x5E0F, 0x5E19,\n    0x5E14, 0x5E11, 0x5E31, 0x5E3B, 0x5E3C, 0x5E37, 0x5E44, 0x5E54,\n    0x5E5B, 0x5E5E, 0x5E61, 0x5C8C, 0x5C7A, 0x5C8D, 0x5C90, 0x5C96,\n    0x5C88, 0x5C98, 0x5C99, 0x5C91, 0x5C9A, 0x5C9C, 0x5CB5, 0x5CA2,\n    0x5CBD, 0x5CAC, 0x5CAB, 0x5CB1, 0x5CA3, 0x5CC1, 0x5CB7, 0x5CC4,\n    0x5CD2, 0x5CE4, 0x5CCB, 0x5CE5, 0x5D02, 0x5D03, 0x5D27, 0x5D26,\n    0x5D2E, 0x5D24, 0x5D1E, 0x5D06, 0x5D1B, 0x5D58, 0x5D3E, 0x5D34,\n    0x5D3D, 0x5D6C, 0x5D5B, 0x5D6F, 0x5D5D, 0x5D6B, 0x5D4B, 0x5D4A,\n    0x5D69, 0x5D74, 0x5D82, 0x5D99, 0x5D9D, 0x8C73, 0x5DB7, 0x5DC5,\n    0x5F73, 0x5F77, 0x5F82, 0x5F87, 0x5F89, 0x5F8C, 0x5F95, 0x5F99,\n    0x5F9C, 0x5FA8, 0x5FAD, 0x5FB5, 0x5FBC, 0x8862, 0x5F61, 0x72AD,\n    0x72B0, 0x72B4, 0x72B7, 0x72B8, 0x72C3, 0x72C1, 0x72CE, 0x72CD,\n    0x72D2, 0x72E8, 0x72EF, 0x72E9, 0x72F2, 0x72F4, 0x72F7, 0x7301,\n    0x72F3, 0x7303, 0x72FA, 0x72FB, 0x7317, 0x7313, 0x7321, 0x730A,\n    0x731E, 0x731D, 0x7315, 0x7322, 0x7339, 0x7325, 0x732C, 0x7338,\n    0x7331, 0x7350, 0x734D, 0x7357, 0x7360, 0x736C, 0x736F, 0x737E,\n    0x821B, 0x5925, 0x98E7, 0x5924, 0x5902, 0x9963, 0x9967, 0x9968,\n    0x9969, 0x996A, 0x996B, 0x996C, 0x9974, 0x9977, 0x997D, 0x9980,\n    0x9984, 0x9987, 0x998A, 0x998D, 0x9990, 0x9991, 0x9993, 0x9994,\n    0x9995, 0x5E80, 0x5E91, 0x5E8B, 0x5E96, 0x5EA5, 0x5EA0, 0x5EB9,\n    0x5EB5, 0x5EBE, 0x5EB3, 0x8D53, 0x5ED2, 0x5ED1, 0x5EDB, 0x5EE8,\n    0x5EEA, 0x81BA, 0x5FC4, 0x5FC9, 0x5FD6, 0x5FCF, 0x6003, 0x5FEE,\n    0x6004, 0x5FE1, 0x5FE4, 0x5FFE, 0x6005, 0x6006, 0x5FEA, 0x5FED,\n    0x5FF8, 0x6019, 0x6035, 0x6026, 0x601B, 0x600F, 0x600D, 0x6029,\n    0x602B, 0x600A, 0x603F, 0x6021, 0x6078, 0x6079, 0x607B, 0x607A,\n    0x6042, 0x606A, 0x607D, 0x6096, 0x609A, 0x60AD, 0x609D, 0x6083,\n    0x6092, 0x608C, 0x609B, 0x60EC, 0x60BB, 0x60B1, 0x60DD, 0x60D8,\n    0x60C6, 0x60DA, 0x60B4, 0x6120, 0x6126, 0x6115, 0x6123, 0x60F4,\n    0x6100, 0x610E, 0x612B, 0x614A, 0x6175, 0x61AC, 0x6194, 0x61A7,\n    0x61B7, 0x61D4, 0x61F5, 0x5FDD, 0x96B3, 0x95E9, 0x95EB, 0x95F1,\n    0x95F3, 0x95F5, 0x95F6, 0x95FC, 0x95FE, 0x9603, 0x9604, 0x9606,\n    0x9608, 0x960A, 0x960B, 0x960C, 0x960D, 0x960F, 0x9612, 0x9615,\n    0x9616, 0x9617, 0x9619, 0x961A, 0x4E2C, 0x723F, 0x6215, 0x6C35,\n    0x6C54, 0x6C5C, 0x6C4A, 0x6CA3, 0x6C85, 0x6C90, 0x6C94, 0x6C8C,\n    0x6C68, 0x6C69, 0x6C74, 0x6C76, 0x6C86, 0x6CA9, 0x6CD0, 0x6CD4,\n    0x6CAD, 0x6CF7, 0x6CF8, 0x6CF1, 0x6CD7, 0x6CB2, 0x6CE0, 0x6CD6,\n    0x6CFA, 0x6CEB, 0x6CEE, 0x6CB1, 0x6CD3, 0x6CEF, 0x6CFE, 0x6D39,\n    0x6D27, 0x6D0C, 0x6D43, 0x6D48, 0x6D07, 0x6D04, 0x6D19, 0x6D0E,\n    0x6D2B, 0x6D4D, 0x6D2E, 0x6D35, 0x6D1A, 0x6D4F, 0x6D52, 0x6D54,\n    0x6D33, 0x6D91, 0x6D6F, 0x6D9E, 0x6DA0, 0x6D5E, 0x6D93, 0x6D94,\n    0x6D5C, 0x6D60, 0x6D7C, 0x6D63, 0x6E1A, 0x6DC7, 0x6DC5, 0x6DDE,\n    0x6E0E, 0x6DBF, 0x6DE0, 0x6E11, 0x6DE6, 0x6DDD, 0x6DD9, 0x6E16,\n    0x6DAB, 0x6E0C, 0x6DAE, 0x6E2B, 0x6E6E, 0x6E4E, 0x6E6B, 0x6EB2,\n    0x6E5F, 0x6E86, 0x6E53, 0x6E54, 0x6E32, 0x6E25, 0x6E44, 0x6EDF,\n    0x6EB1, 0x6E98, 0x6EE0, 0x6F2D, 0x6EE2, 0x6EA5, 0x6EA7, 0x6EBD,\n    0x6EBB, 0x6EB7, 0x6ED7, 0x6EB4, 0x6ECF, 0x6E8F, 0x6EC2, 0x6E9F,\n    0x6F62, 0x6F46, 0x6F47, 0x6F24, 0x6F15, 0x6EF9, 0x6F2F, 0x6F36,\n    0x6F4B, 0x6F74, 0x6F2A, 0x6F09, 0x6F29, 0x6F89, 0x6F8D, 0x6F8C,\n    0x6F78, 0x6F72, 0x6F7C, 0x6F7A, 0x6FD1, 0x6FC9, 0x6FA7, 0x6FB9,\n    0x6FB6, 0x6FC2, 0x6FE1, 0x6FEE, 0x6FDE, 0x6FE0, 0x6FEF, 0x701A,\n    0x7023, 0x701B, 0x7039, 0x7035, 0x704F, 0x705E, 0x5B80, 0x5B84,\n    0x5B95, 0x5B93, 0x5BA5, 0x5BB8, 0x752F, 0x9A9E, 0x6434, 0x5BE4,\n    0x5BEE, 0x8930, 0x5BF0, 0x8E47, 0x8B07, 0x8FB6, 0x8FD3, 0x8FD5,\n    0x8FE5, 0x8FEE, 0x8FE4, 0x8FE9, 0x8FE6, 0x8FF3, 0x8FE8, 0x9005,\n    0x9004, 0x900B, 0x9026, 0x9011, 0x900D, 0x9016, 0x9021, 0x9035,\n    0x9036, 0x902D, 0x902F, 0x9044, 0x9051, 0x9052, 0x9050, 0x9068,\n    0x9058, 0x9062, 0x905B, 0x66B9, 0x9074, 0x907D, 0x9082, 0x9088,\n    0x9083, 0x908B, 0x5F50, 0x5F57, 0x5F56, 0x5F58, 0x5C3B, 0x54AB,\n    0x5C50, 0x5C59, 0x5B71, 0x5C63, 0x5C66, 0x7FBC, 0x5F2A, 0x5F29,\n    0x5F2D, 0x8274, 0x5F3C, 0x9B3B, 0x5C6E, 0x5981, 0x5983, 0x598D,\n    0x59A9, 0x59AA, 0x59A3, 0x5997, 0x59CA, 0x59AB, 0x599E, 0x59A4,\n    0x59D2, 0x59B2, 0x59AF, 0x59D7, 0x59BE, 0x5A05, 0x5A06, 0x59DD,\n    0x5A08, 0x59E3, 0x59D8, 0x59F9, 0x5A0C, 0x5A09, 0x5A32, 0x5A34,\n    0x5A11, 0x5A23, 0x5A13, 0x5A40, 0x5A67, 0x5A4A, 0x5A55, 0x5A3C,\n    0x5A62, 0x5A75, 0x80EC, 0x5AAA, 0x5A9B, 0x5A77, 0x5A7A, 0x5ABE,\n    0x5AEB, 0x5AB2, 0x5AD2, 0x5AD4, 0x5AB8, 0x5AE0, 0x5AE3, 0x5AF1,\n    0x5AD6, 0x5AE6, 0x5AD8, 0x5ADC, 0x5B09, 0x5B17, 0x5B16, 0x5B32,\n    0x5B37, 0x5B40, 0x5C15, 0x5C1C, 0x5B5A, 0x5B65, 0x5B73, 0x5B51,\n    0x5B53, 0x5B62, 0x9A75, 0x9A77, 0x9A78, 0x9A7A, 0x9A7F, 0x9A7D,\n    0x9A80, 0x9A81, 0x9A85, 0x9A88, 0x9A8A, 0x9A90, 0x9A92, 0x9A93,\n    0x9A96, 0x9A98, 0x9A9B, 0x9A9C, 0x9A9D, 0x9A9F, 0x9AA0, 0x9AA2,\n    0x9AA3, 0x9AA5, 0x9AA7, 0x7E9F, 0x7EA1, 0x7EA3, 0x7EA5, 0x7EA8,\n    0x7EA9, 0x7EAD, 0x7EB0, 0x7EBE, 0x7EC0, 0x7EC1, 0x7EC2, 0x7EC9,\n    0x7ECB, 0x7ECC, 0x7ED0, 0x7ED4, 0x7ED7, 0x7EDB, 0x7EE0, 0x7EE1,\n    0x7EE8, 0x7EEB, 0x7EEE, 0x7EEF, 0x7EF1, 0x7EF2, 0x7F0D, 0x7EF6,\n    0x7EFA, 0x7EFB, 0x7EFE, 0x7F01, 0x7F02, 0x7F03, 0x7F07, 0x7F08,\n    0x7F0B, 0x7F0C, 0x7F0F, 0x7F11, 0x7F12, 0x7F17, 0x7F19, 0x7F1C,\n    0x7F1B, 0x7F1F, 0x7F21, 0x7F22, 0x7F23, 0x7F24, 0x7F25, 0x7F26,\n    0x7F27, 0x7F2A, 0x7F2B, 0x7F2C, 0x7F2D, 0x7F2F, 0x7F30, 0x7F31,\n    0x7F32, 0x7F33, 0x7F35, 0x5E7A, 0x757F, 0x5DDB, 0x753E, 0x9095,\n    0x738E, 0x7391, 0x73AE, 0x73A2, 0x739F, 0x73CF, 0x73C2, 0x73D1,\n    0x73B7, 0x73B3, 0x73C0, 0x73C9, 0x73C8, 0x73E5, 0x73D9, 0x987C,\n    0x740A, 0x73E9, 0x73E7, 0x73DE, 0x73BA, 0x73F2, 0x740F, 0x742A,\n    0x745B, 0x7426, 0x7425, 0x7428, 0x7430, 0x742E, 0x742C, 0x741B,\n    0x741A, 0x7441, 0x745C, 0x7457, 0x7455, 0x7459, 0x7477, 0x746D,\n    0x747E, 0x749C, 0x748E, 0x7480, 0x7481, 0x7487, 0x748B, 0x749E,\n    0x74A8, 0x74A9, 0x7490, 0x74A7, 0x74D2, 0x74BA, 0x97EA, 0x97EB,\n    0x97EC, 0x674C, 0x6753, 0x675E, 0x6748, 0x6769, 0x67A5, 0x6787,\n    0x676A, 0x6773, 0x6798, 0x67A7, 0x6775, 0x67A8, 0x679E, 0x67AD,\n    0x678B, 0x6777, 0x677C, 0x67F0, 0x6809, 0x67D8, 0x680A, 0x67E9,\n    0x67B0, 0x680C, 0x67D9, 0x67B5, 0x67DA, 0x67B3, 0x67DD, 0x6800,\n    0x67C3, 0x67B8, 0x67E2, 0x680E, 0x67C1, 0x67FD, 0x6832, 0x6833,\n    0x6860, 0x6861, 0x684E, 0x6862, 0x6844, 0x6864, 0x6883, 0x681D,\n    0x6855, 0x6866, 0x6841, 0x6867, 0x6840, 0x683E, 0x684A, 0x6849,\n    0x6829, 0x68B5, 0x688F, 0x6874, 0x6877, 0x6893, 0x686B, 0x68C2,\n    0x696E, 0x68FC, 0x691F, 0x6920, 0x68F9, 0x6924, 0x68F0, 0x690B,\n    0x6901, 0x6957, 0x68E3, 0x6910, 0x6971, 0x6939, 0x6960, 0x6942,\n    0x695D, 0x6984, 0x696B, 0x6980, 0x6998, 0x6978, 0x6934, 0x69CC,\n    0x6987, 0x6988, 0x69CE, 0x6989, 0x6966, 0x6963, 0x6979, 0x699B,\n    0x69A7, 0x69BB, 0x69AB, 0x69AD, 0x69D4, 0x69B1, 0x69C1, 0x69CA,\n    0x69DF, 0x6995, 0x69E0, 0x698D, 0x69FF, 0x6A2F, 0x69ED, 0x6A17,\n    0x6A18, 0x6A65, 0x69F2, 0x6A44, 0x6A3E, 0x6AA0, 0x6A50, 0x6A5B,\n    0x6A35, 0x6A8E, 0x6A79, 0x6A3D, 0x6A28, 0x6A58, 0x6A7C, 0x6A91,\n    0x6A90, 0x6AA9, 0x6A97, 0x6AAB, 0x7337, 0x7352, 0x6B81, 0x6B82,\n    0x6B87, 0x6B84, 0x6B92, 0x6B93, 0x6B8D, 0x6B9A, 0x6B9B, 0x6BA1,\n    0x6BAA, 0x8F6B, 0x8F6D, 0x8F71, 0x8F72, 0x8F73, 0x8F75, 0x8F76,\n    0x8F78, 0x8F77, 0x8F79, 0x8F7A, 0x8F7C, 0x8F7E, 0x8F81, 0x8F82,\n    0x8F84, 0x8F87, 0x8F8B, 0x8F8D, 0x8F8E, 0x8F8F, 0x8F98, 0x8F9A,\n    0x8ECE, 0x620B, 0x6217, 0x621B, 0x621F, 0x6222, 0x6221, 0x6225,\n    0x6224, 0x622C, 0x81E7, 0x74EF, 0x74F4, 0x74FF, 0x750F, 0x7511,\n    0x7513, 0x6534, 0x65EE, 0x65EF, 0x65F0, 0x660A, 0x6619, 0x6772,\n    0x6603, 0x6615, 0x6600, 0x7085, 0x66F7, 0x661D, 0x6634, 0x6631,\n    0x6636, 0x6635, 0x8006, 0x665F, 0x6654, 0x6641, 0x664F, 0x6656,\n    0x6661, 0x6657, 0x6677, 0x6684, 0x668C, 0x66A7, 0x669D, 0x66BE,\n    0x66DB, 0x66DC, 0x66E6, 0x66E9, 0x8D32, 0x8D33, 0x8D36, 0x8D3B,\n    0x8D3D, 0x8D40, 0x8D45, 0x8D46, 0x8D48, 0x8D49, 0x8D47, 0x8D4D,\n    0x8D55, 0x8D59, 0x89C7, 0x89CA, 0x89CB, 0x89CC, 0x89CE, 0x89CF,\n    0x89D0, 0x89D1, 0x726E, 0x729F, 0x725D, 0x7266, 0x726F, 0x727E,\n    0x727F, 0x7284, 0x728B, 0x728D, 0x728F, 0x7292, 0x6308, 0x6332,\n    0x63B0, 0x643F, 0x64D8, 0x8004, 0x6BEA, 0x6BF3, 0x6BFD, 0x6BF5,\n    0x6BF9, 0x6C05, 0x6C07, 0x6C06, 0x6C0D, 0x6C15, 0x6C18, 0x6C19,\n    0x6C1A, 0x6C21, 0x6C29, 0x6C24, 0x6C2A, 0x6C32, 0x6535, 0x6555,\n    0x656B, 0x724D, 0x7252, 0x7256, 0x7230, 0x8662, 0x5216, 0x809F,\n    0x809C, 0x8093, 0x80BC, 0x670A, 0x80BD, 0x80B1, 0x80AB, 0x80AD,\n    0x80B4, 0x80B7, 0x80E7, 0x80E8, 0x80E9, 0x80EA, 0x80DB, 0x80C2,\n    0x80C4, 0x80D9, 0x80CD, 0x80D7, 0x6710, 0x80DD, 0x80EB, 0x80F1,\n    0x80F4, 0x80ED, 0x810D, 0x810E, 0x80F2, 0x80FC, 0x6715, 0x8112,\n    0x8C5A, 0x8136, 0x811E, 0x812C, 0x8118, 0x8132, 0x8148, 0x814C,\n    0x8153, 0x8174, 0x8159, 0x815A, 0x8171, 0x8160, 0x8169, 0x817C,\n    0x817D, 0x816D, 0x8167, 0x584D, 0x5AB5, 0x8188, 0x8182, 0x8191,\n    0x6ED5, 0x81A3, 0x81AA, 0x81CC, 0x6726, 0x81CA, 0x81BB, 0x81C1,\n    0x81A6, 0x6B24, 0x6B37, 0x6B39, 0x6B43, 0x6B46, 0x6B59, 0x98D1,\n    0x98D2, 0x98D3, 0x98D5, 0x98D9, 0x98DA, 0x6BB3, 0x5F40, 0x6BC2,\n    0x89F3, 0x6590, 0x9F51, 0x6593, 0x65BC, 0x65C6, 0x65C4, 0x65C3,\n    0x65CC, 0x65CE, 0x65D2, 0x65D6, 0x7080, 0x709C, 0x7096, 0x709D,\n    0x70BB, 0x70C0, 0x70B7, 0x70AB, 0x70B1, 0x70E8, 0x70CA, 0x7110,\n    0x7113, 0x7116, 0x712F, 0x7131, 0x7173, 0x715C, 0x7168, 0x7145,\n    0x7172, 0x714A, 0x7178, 0x717A, 0x7198, 0x71B3, 0x71B5, 0x71A8,\n    0x71A0, 0x71E0, 0x71D4, 0x71E7, 0x71F9, 0x721D, 0x7228, 0x706C,\n    0x7118, 0x7166, 0x71B9, 0x623E, 0x623D, 0x6243, 0x6248, 0x6249,\n    0x793B, 0x7940, 0x7946, 0x7949, 0x795B, 0x795C, 0x7953, 0x795A,\n    0x7962, 0x7957, 0x7960, 0x796F, 0x7967, 0x797A, 0x7985, 0x798A,\n    0x799A, 0x79A7, 0x79B3, 0x5FD1, 0x5FD0, 0x603C, 0x605D, 0x605A,\n    0x6067, 0x6041, 0x6059, 0x6063, 0x60AB, 0x6106, 0x610D, 0x615D,\n    0x61A9, 0x619D, 0x61CB, 0x61D1, 0x6206, 0x8080, 0x807F, 0x6C93,\n    0x6CF6, 0x6DFC, 0x77F6, 0x77F8, 0x7800, 0x7809, 0x7817, 0x7818,\n    0x7811, 0x65AB, 0x782D, 0x781C, 0x781D, 0x7839, 0x783A, 0x783B,\n    0x781F, 0x783C, 0x7825, 0x782C, 0x7823, 0x7829, 0x784E, 0x786D,\n    0x7856, 0x7857, 0x7826, 0x7850, 0x7847, 0x784C, 0x786A, 0x789B,\n    0x7893, 0x789A, 0x7887, 0x789C, 0x78A1, 0x78A3, 0x78B2, 0x78B9,\n    0x78A5, 0x78D4, 0x78D9, 0x78C9, 0x78EC, 0x78F2, 0x7905, 0x78F4,\n    0x7913, 0x7924, 0x791E, 0x7934, 0x9F9B, 0x9EF9, 0x9EFB, 0x9EFC,\n    0x76F1, 0x7704, 0x770D, 0x76F9, 0x7707, 0x7708, 0x771A, 0x7722,\n    0x7719, 0x772D, 0x7726, 0x7735, 0x7738, 0x7750, 0x7751, 0x7747,\n    0x7743, 0x775A, 0x7768, 0x7762, 0x7765, 0x777F, 0x778D, 0x777D,\n    0x7780, 0x778C, 0x7791, 0x779F, 0x77A0, 0x77B0, 0x77B5, 0x77BD,\n    0x753A, 0x7540, 0x754E, 0x754B, 0x7548, 0x755B, 0x7572, 0x7579,\n    0x7583, 0x7F58, 0x7F61, 0x7F5F, 0x8A48, 0x7F68, 0x7F74, 0x7F71,\n    0x7F79, 0x7F81, 0x7F7E, 0x76CD, 0x76E5, 0x8832, 0x9485, 0x9486,\n    0x9487, 0x948B, 0x948A, 0x948C, 0x948D, 0x948F, 0x9490, 0x9494,\n    0x9497, 0x9495, 0x949A, 0x949B, 0x949C, 0x94A3, 0x94A4, 0x94AB,\n    0x94AA, 0x94AD, 0x94AC, 0x94AF, 0x94B0, 0x94B2, 0x94B4, 0x94B6,\n    0x94B7, 0x94B8, 0x94B9, 0x94BA, 0x94BC, 0x94BD, 0x94BF, 0x94C4,\n    0x94C8, 0x94C9, 0x94CA, 0x94CB, 0x94CC, 0x94CD, 0x94CE, 0x94D0,\n    0x94D1, 0x94D2, 0x94D5, 0x94D6, 0x94D7, 0x94D9, 0x94D8, 0x94DB,\n    0x94DE, 0x94DF, 0x94E0, 0x94E2, 0x94E4, 0x94E5, 0x94E7, 0x94E8,\n    0x94EA, 0x94E9, 0x94EB, 0x94EE, 0x94EF, 0x94F3, 0x94F4, 0x94F5,\n    0x94F7, 0x94F9, 0x94FC, 0x94FD, 0x94FF, 0x9503, 0x9502, 0x9506,\n    0x9507, 0x9509, 0x950A, 0x950D, 0x950E, 0x950F, 0x9512, 0x9513,\n    0x9514, 0x9515, 0x9516, 0x9518, 0x951B, 0x951D, 0x951E, 0x951F,\n    0x9522, 0x952A, 0x952B, 0x9529, 0x952C, 0x9531, 0x9532, 0x9534,\n    0x9536, 0x9537, 0x9538, 0x953C, 0x953E, 0x953F, 0x9542, 0x9535,\n    0x9544, 0x9545, 0x9546, 0x9549, 0x954C, 0x954E, 0x954F, 0x9552,\n    0x9553, 0x9554, 0x9556, 0x9557, 0x9558, 0x9559, 0x955B, 0x955E,\n    0x955F, 0x955D, 0x9561, 0x9562, 0x9564, 0x9565, 0x9566, 0x9567,\n    0x9568, 0x9569, 0x956A, 0x956B, 0x956C, 0x956F, 0x9571, 0x9572,\n    0x9573, 0x953A, 0x77E7, 0x77EC, 0x96C9, 0x79D5, 0x79ED, 0x79E3,\n    0x79EB, 0x7A06, 0x5D47, 0x7A03, 0x7A02, 0x7A1E, 0x7A14, 0x7A39,\n    0x7A37, 0x7A51, 0x9ECF, 0x99A5, 0x7A70, 0x7688, 0x768E, 0x7693,\n    0x7699, 0x76A4, 0x74DE, 0x74E0, 0x752C, 0x9E20, 0x9E22, 0x9E28,\n    0x9E29, 0x9E2A, 0x9E2B, 0x9E2C, 0x9E32, 0x9E31, 0x9E36, 0x9E38,\n    0x9E37, 0x9E39, 0x9E3A, 0x9E3E, 0x9E41, 0x9E42, 0x9E44, 0x9E46,\n    0x9E47, 0x9E48, 0x9E49, 0x9E4B, 0x9E4C, 0x9E4E, 0x9E51, 0x9E55,\n    0x9E57, 0x9E5A, 0x9E5B, 0x9E5C, 0x9E5E, 0x9E63, 0x9E66, 0x9E67,\n    0x9E68, 0x9E69, 0x9E6A, 0x9E6B, 0x9E6C, 0x9E71, 0x9E6D, 0x9E73,\n    0x7592, 0x7594, 0x7596, 0x75A0, 0x759D, 0x75AC, 0x75A3, 0x75B3,\n    0x75B4, 0x75B8, 0x75C4, 0x75B1, 0x75B0, 0x75C3, 0x75C2, 0x75D6,\n    0x75CD, 0x75E3, 0x75E8, 0x75E6, 0x75E4, 0x75EB, 0x75E7, 0x7603,\n    0x75F1, 0x75FC, 0x75FF, 0x7610, 0x7600, 0x7605, 0x760C, 0x7617,\n    0x760A, 0x7625, 0x7618, 0x7615, 0x7619, 0x761B, 0x763C, 0x7622,\n    0x7620, 0x7640, 0x762D, 0x7630, 0x763F, 0x7635, 0x7643, 0x763E,\n    0x7633, 0x764D, 0x765E, 0x7654, 0x765C, 0x7656, 0x766B, 0x766F,\n    0x7FCA, 0x7AE6, 0x7A78, 0x7A79, 0x7A80, 0x7A86, 0x7A88, 0x7A95,\n    0x7AA6, 0x7AA0, 0x7AAC, 0x7AA8, 0x7AAD, 0x7AB3, 0x8864, 0x8869,\n    0x8872, 0x887D, 0x887F, 0x8882, 0x88A2, 0x88C6, 0x88B7, 0x88BC,\n    0x88C9, 0x88E2, 0x88CE, 0x88E3, 0x88E5, 0x88F1, 0x891A, 0x88FC,\n    0x88E8, 0x88FE, 0x88F0, 0x8921, 0x8919, 0x8913, 0x891B, 0x890A,\n    0x8934, 0x892B, 0x8936, 0x8941, 0x8966, 0x897B, 0x758B, 0x80E5,\n    0x76B2, 0x76B4, 0x77DC, 0x8012, 0x8014, 0x8016, 0x801C, 0x8020,\n    0x8022, 0x8025, 0x8026, 0x8027, 0x8029, 0x8028, 0x8031, 0x800B,\n    0x8035, 0x8043, 0x8046, 0x804D, 0x8052, 0x8069, 0x8071, 0x8983,\n    0x9878, 0x9880, 0x9883, 0x9889, 0x988C, 0x988D, 0x988F, 0x9894,\n    0x989A, 0x989B, 0x989E, 0x989F, 0x98A1, 0x98A2, 0x98A5, 0x98A6,\n    0x864D, 0x8654, 0x866C, 0x866E, 0x867F, 0x867A, 0x867C, 0x867B,\n    0x86A8, 0x868D, 0x868B, 0x86AC, 0x869D, 0x86A7, 0x86A3, 0x86AA,\n    0x8693, 0x86A9, 0x86B6, 0x86C4, 0x86B5, 0x86CE, 0x86B0, 0x86BA,\n    0x86B1, 0x86AF, 0x86C9, 0x86CF, 0x86B4, 0x86E9, 0x86F1, 0x86F2,\n    0x86ED, 0x86F3, 0x86D0, 0x8713, 0x86DE, 0x86F4, 0x86DF, 0x86D8,\n    0x86D1, 0x8703, 0x8707, 0x86F8, 0x8708, 0x870A, 0x870D, 0x8709,\n    0x8723, 0x873B, 0x871E, 0x8725, 0x872E, 0x871A, 0x873E, 0x8748,\n    0x8734, 0x8731, 0x8729, 0x8737, 0x873F, 0x8782, 0x8722, 0x877D,\n    0x877E, 0x877B, 0x8760, 0x8770, 0x874C, 0x876E, 0x878B, 0x8753,\n    0x8763, 0x877C, 0x8764, 0x8759, 0x8765, 0x8793, 0x87AF, 0x87A8,\n    0x87D2, 0x87C6, 0x8788, 0x8785, 0x87AD, 0x8797, 0x8783, 0x87AB,\n    0x87E5, 0x87AC, 0x87B5, 0x87B3, 0x87CB, 0x87D3, 0x87BD, 0x87D1,\n    0x87C0, 0x87CA, 0x87DB, 0x87EA, 0x87E0, 0x87EE, 0x8816, 0x8813,\n    0x87FE, 0x880A, 0x881B, 0x8821, 0x8839, 0x883C, 0x7F36, 0x7F42,\n    0x7F44, 0x7F45, 0x8210, 0x7AFA, 0x7AFD, 0x7B08, 0x7B03, 0x7B04,\n    0x7B15, 0x7B0A, 0x7B2B, 0x7B0F, 0x7B47, 0x7B38, 0x7B2A, 0x7B19,\n    0x7B2E, 0x7B31, 0x7B20, 0x7B25, 0x7B24, 0x7B33, 0x7B3E, 0x7B1E,\n    0x7B58, 0x7B5A, 0x7B45, 0x7B75, 0x7B4C, 0x7B5D, 0x7B60, 0x7B6E,\n    0x7B7B, 0x7B62, 0x7B72, 0x7B71, 0x7B90, 0x7BA6, 0x7BA7, 0x7BB8,\n    0x7BAC, 0x7B9D, 0x7BA8, 0x7B85, 0x7BAA, 0x7B9C, 0x7BA2, 0x7BAB,\n    0x7BB4, 0x7BD1, 0x7BC1, 0x7BCC, 0x7BDD, 0x7BDA, 0x7BE5, 0x7BE6,\n    0x7BEA, 0x7C0C, 0x7BFE, 0x7BFC, 0x7C0F, 0x7C16, 0x7C0B, 0x7C1F,\n    0x7C2A, 0x7C26, 0x7C38, 0x7C41, 0x7C40, 0x81FE, 0x8201, 0x8202,\n    0x8204, 0x81EC, 0x8844, 0x8221, 0x8222, 0x8223, 0x822D, 0x822F,\n    0x8228, 0x822B, 0x8238, 0x823B, 0x8233, 0x8234, 0x823E, 0x8244,\n    0x8249, 0x824B, 0x824F, 0x825A, 0x825F, 0x8268, 0x887E, 0x8885,\n    0x8888, 0x88D8, 0x88DF, 0x895E, 0x7F9D, 0x7F9F, 0x7FA7, 0x7FAF,\n    0x7FB0, 0x7FB2, 0x7C7C, 0x6549, 0x7C91, 0x7C9D, 0x7C9C, 0x7C9E,\n    0x7CA2, 0x7CB2, 0x7CBC, 0x7CBD, 0x7CC1, 0x7CC7, 0x7CCC, 0x7CCD,\n    0x7CC8, 0x7CC5, 0x7CD7, 0x7CE8, 0x826E, 0x66A8, 0x7FBF, 0x7FCE,\n    0x7FD5, 0x7FE5, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FEE, 0x7FF3, 0x7CF8,\n    0x7D77, 0x7DA6, 0x7DAE, 0x7E47, 0x7E9B, 0x9EB8, 0x9EB4, 0x8D73,\n    0x8D84, 0x8D94, 0x8D91, 0x8DB1, 0x8D67, 0x8D6D, 0x8C47, 0x8C49,\n    0x914A, 0x9150, 0x914E, 0x914F, 0x9164, 0x9162, 0x9161, 0x9170,\n    0x9169, 0x916F, 0x917D, 0x917E, 0x9172, 0x9174, 0x9179, 0x918C,\n    0x9185, 0x9190, 0x918D, 0x9191, 0x91A2, 0x91A3, 0x91AA, 0x91AD,\n    0x91AE, 0x91AF, 0x91B5, 0x91B4, 0x91BA, 0x8C55, 0x9E7E, 0x8DB8,\n    0x8DEB, 0x8E05, 0x8E59, 0x8E69, 0x8DB5, 0x8DBF, 0x8DBC, 0x8DBA,\n    0x8DC4, 0x8DD6, 0x8DD7, 0x8DDA, 0x8DDE, 0x8DCE, 0x8DCF, 0x8DDB,\n    0x8DC6, 0x8DEC, 0x8DF7, 0x8DF8, 0x8DE3, 0x8DF9, 0x8DFB, 0x8DE4,\n    0x8E09, 0x8DFD, 0x8E14, 0x8E1D, 0x8E1F, 0x8E2C, 0x8E2E, 0x8E23,\n    0x8E2F, 0x8E3A, 0x8E40, 0x8E39, 0x8E35, 0x8E3D, 0x8E31, 0x8E49,\n    0x8E41, 0x8E42, 0x8E51, 0x8E52, 0x8E4A, 0x8E70, 0x8E76, 0x8E7C,\n    0x8E6F, 0x8E74, 0x8E85, 0x8E8F, 0x8E94, 0x8E90, 0x8E9C, 0x8E9E,\n    0x8C78, 0x8C82, 0x8C8A, 0x8C85, 0x8C98, 0x8C94, 0x659B, 0x89D6,\n    0x89DE, 0x89DA, 0x89DC, 0x89E5, 0x89EB, 0x89EF, 0x8A3E, 0x8B26,\n    0x9753, 0x96E9, 0x96F3, 0x96EF, 0x9706, 0x9701, 0x9708, 0x970F,\n    0x970E, 0x972A, 0x972D, 0x9730, 0x973E, 0x9F80, 0x9F83, 0x9F85,\n    0x9F86, 0x9F87, 0x9F88, 0x9F89, 0x9F8A, 0x9F8C, 0x9EFE, 0x9F0B,\n    0x9F0D, 0x96B9, 0x96BC, 0x96BD, 0x96CE, 0x96D2, 0x77BF, 0x96E0,\n    0x928E, 0x92AE, 0x92C8, 0x933E, 0x936A, 0x93CA, 0x938F, 0x943E,\n    0x946B, 0x9C7F, 0x9C82, 0x9C85, 0x9C86, 0x9C87, 0x9C88, 0x7A23,\n    0x9C8B, 0x9C8E, 0x9C90, 0x9C91, 0x9C92, 0x9C94, 0x9C95, 0x9C9A,\n    0x9C9B, 0x9C9E, 0x9C9F, 0x9CA0, 0x9CA1, 0x9CA2, 0x9CA3, 0x9CA5,\n    0x9CA6, 0x9CA7, 0x9CA8, 0x9CA9, 0x9CAB, 0x9CAD, 0x9CAE, 0x9CB0,\n    0x9CB1, 0x9CB2, 0x9CB3, 0x9CB4, 0x9CB5, 0x9CB6, 0x9CB7, 0x9CBA,\n    0x9CBB, 0x9CBC, 0x9CBD, 0x9CC4, 0x9CC5, 0x9CC6, 0x9CC7, 0x9CCA,\n    0x9CCB, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x9CD4,\n    0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x9CE2,\n    0x977C, 0x9785, 0x9791, 0x9792, 0x9794, 0x97AF, 0x97AB, 0x97A3,\n    0x97B2, 0x97B4, 0x9AB1, 0x9AB0, 0x9AB7, 0x9E58, 0x9AB6, 0x9ABA,\n    0x9ABC, 0x9AC1, 0x9AC0, 0x9AC5, 0x9AC2, 0x9ACB, 0x9ACC, 0x9AD1,\n    0x9B45, 0x9B43, 0x9B47, 0x9B49, 0x9B48, 0x9B4D, 0x9B51, 0x98E8,\n    0x990D, 0x992E, 0x9955, 0x9954, 0x9ADF, 0x9AE1, 0x9AE6, 0x9AEF,\n    0x9AEB, 0x9AFB, 0x9AED, 0x9AF9, 0x9B08, 0x9B0F, 0x9B13, 0x9B1F,\n    0x9B23, 0x9EBD, 0x9EBE, 0x7E3B, 0x9E82, 0x9E87, 0x9E88, 0x9E8B,\n    0x9E92, 0x93D6, 0x9E9D, 0x9E9F, 0x9EDB, 0x9EDC, 0x9EDD, 0x9EE0,\n    0x9EDF, 0x9EE2, 0x9EE9, 0x9EE7, 0x9EE5, 0x9EEA, 0x9EEF, 0x9F22,\n    0x9F2C, 0x9F2F, 0x9F39, 0x9F37, 0x9F3D, 0x9F3E, 0x9F44, 0x3007,\n    0xFF5E, 0x2016, 0x3013, 0xFF0E, 0xFF1D, 0xFF3B, 0xFF3D, 0xFFE3,\n    0x00FC, 0x00A9, 0x2122, 0x2026, 0x0020, 0x769A, 0x85F9, 0x7919,\n    0x611B, 0x9AAF, 0x8956, 0x58E9, 0x7F77, 0x64FA, 0x6557, 0x9812,\n    0x8FA6, 0x7D46, 0x5E6B, 0x7D81, 0x938A, 0x8B17, 0x98FD, 0x5BF6,\n    0x5831, 0x9B91, 0x8F29, 0x8C9D, 0x92C7, 0x72FD, 0x5099, 0x618A,\n    0x7DB3, 0x7B46, 0x7562, 0x6583, 0x5E63, 0x9589, 0x908A, 0x7DE8,\n    0x8CB6, 0x8B8A, 0x8FAF, 0x8FAE, 0x6A19, 0x9C49, 0x765F, 0x7015,\n    0x6FF1, 0x8CD3, 0x64EF, 0x9905, 0x64A5, 0x9262, 0x9251, 0x99C1,\n    0x88DC, 0x8CA1, 0x53C3, 0x8836, 0x6B98, 0x615A, 0x6158, 0x71E6,\n    0x84BC, 0x8259, 0x5009, 0x6EC4, 0x53A0, 0x5074, 0x6E2C, 0x5C64,\n    0x8A6B, 0x6519, 0x647B, 0x87EC, 0x995E, 0x8B92, 0x7E8F, 0x93DF,\n    0x7523, 0x95E1, 0x986B, 0x5834, 0x5617, 0x9577, 0x511F, 0x8178,\n    0x5EE0, 0x66A2, 0x9214, 0x8ECA, 0x5FB9, 0x5875, 0x9673, 0x896F,\n    0x7A31, 0x61F2, 0x8AA0, 0x9A01, 0x9072, 0x99B3, 0x9F52, 0x71BE,\n    0x885D, 0x87F2, 0x5BF5, 0x7587, 0x8E8A, 0x7C4C, 0x7DA2, 0x919C,\n    0x92E4, 0x96DB, 0x790E, 0x5132, 0x89F8, 0x8655, 0x50B3, 0x7621,\n    0x95D6, 0x5275, 0x9318, 0x7D14, 0x7DBD, 0x8FAD, 0x8A5E, 0x8CDC,\n    0x8070, 0x5F9E, 0x53E2, 0x8EA5, 0x7AC4, 0x932F, 0x9054, 0x5E36,\n    0x8CB8, 0x64D4, 0x55AE, 0x9132, 0x64A3, 0x81BD, 0x619A, 0x8A95,\n    0x5F48, 0x7576, 0x64CB, 0x9EE8, 0x8569, 0x6A94, 0x6417, 0x5CF6,\n    0x79B1, 0x5C0E, 0x71C8, 0x9127, 0x6575, 0x6ECC, 0x905E, 0x7DE0,\n    0x985B, 0x9EDE, 0x588A, 0x96FB, 0x6FB1, 0x91E3, 0x8ABF, 0x8ADC,\n    0x91D8, 0x9802, 0x9320, 0x8A02, 0x6771, 0x52D5, 0x68DF, 0x51CD,\n    0x9B25, 0x72A2, 0x7368, 0x8B80, 0x8CED, 0x934D, 0x935B, 0x65B7,\n    0x7DDE, 0x968A, 0x5C0D, 0x5678, 0x9813, 0x920D, 0x596A, 0x58AE,\n    0x9D5D, 0x984D, 0x8A1B, 0x60E1, 0x9913, 0x5152, 0x723E, 0x990C,\n    0x8CB3, 0x767C, 0x7F70, 0x95A5, 0x792C, 0x91E9, 0x7169, 0x7BC4,\n    0x8CA9, 0x98EF, 0x8A2A, 0x7D21, 0x98DB, 0x8AB9, 0x5EE2, 0x8CBB,\n    0x7D1B, 0x58B3, 0x596E, 0x61A4, 0x7CDE, 0x8C50, 0x6953, 0x92D2,\n    0x98A8, 0x760B, 0x99AE, 0x7E2B, 0x8AF7, 0x9CF3, 0x819A, 0x8F3B,\n    0x64AB, 0x8F14, 0x8CE6, 0x5FA9, 0x8CA0, 0x8A03, 0x5A66, 0x7E1B,\n    0x8A72, 0x9223, 0x84CB, 0x5E79, 0x8D95, 0x8D1B, 0x5CA1, 0x525B,\n    0x92FC, 0x7DB1, 0x5D17, 0x93AC, 0x64F1, 0x9D3F, 0x95A3, 0x927B,\n    0x500B, 0x7D66, 0x9F94, 0x978F, 0x8CA2, 0x920E, 0x6E9D, 0x69CB,\n    0x8CFC, 0x8831, 0x9867, 0x526E, 0x95DC, 0x89C0, 0x9928, 0x6163,\n    0x8CAB, 0x5EE3, 0x898F, 0x6B78, 0x9F9C, 0x95A8, 0x8ECC, 0x8A6D,\n    0x6AC3, 0x8CB4, 0x528A, 0x8F25, 0x934B, 0x570B, 0x904E, 0x99ED,\n    0x97D3, 0x6F22, 0x865F, 0x95A1, 0x9DB4, 0x8CC0, 0x8F5F, 0x9D3B,\n    0x7D05, 0x58FA, 0x8B77, 0x6EEC, 0x5629, 0x83EF, 0x756B, 0x5283,\n    0x8A71, 0x61F7, 0x58DE, 0x6B61, 0x74B0, 0x9084, 0x7DE9, 0x8B0A,\n    0x63EE, 0x8F1D, 0x8CC4, 0x7A62, 0x6703, 0x71F4, 0x532F, 0x8AF1,\n    0x8AA8, 0x7E6A, 0x8477, 0x6E3E, 0x7372, 0x8CA8, 0x798D, 0x64CA,\n    0x6A5F, 0x7A4D, 0x9951, 0x8B4F, 0x9DC4, 0x7E3E, 0x7DDD, 0x6975,\n    0x8F2F, 0x7D1A, 0x64E0, 0x5E7E, 0x858A, 0x5291, 0x6FDF, 0x8A08,\n    0x8A18, 0x969B, 0x7E7C, 0x7D00, 0x593E, 0x83A2, 0x9830, 0x8CC8,\n    0x9240, 0x50F9, 0x99D5, 0x6BB2, 0x76E3, 0x5805, 0x7B8B, 0x9593,\n    0x8271, 0x7DD8, 0x7E6D, 0x6AA2, 0x9E7C, 0x63C0, 0x64BF, 0x7C21,\n    0x5109, 0x85A6, 0x6ABB, 0x9452, 0x8E10, 0x8CE4, 0x898B, 0x9375,\n    0x8266, 0x528D, 0x991E, 0x6F38, 0x6FFA, 0x6F97, 0x5C07, 0x6F3F,\n    0x8523, 0x69F3, 0x596C, 0x8B1B, 0x91AC, 0x81A0, 0x6F86, 0x9A55,\n    0x5B0C, 0x652A, 0x9278, 0x77EF, 0x50E5, 0x9903, 0x7E73, 0x7D5E,\n    0x8F4E, 0x8F03, 0x968E, 0x7BC0, 0x6F54, 0x7D50, 0x8AA1, 0x7DCA,\n    0x9326, 0x50C5, 0x8B39, 0x9032, 0x71FC, 0x76E1, 0x52C1, 0x8396,\n    0x9BE8, 0x9A5A, 0x7D93, 0x9838, 0x93E1, 0x5F91, 0x75D9, 0x7AF6,\n    0x7CFE, 0x820A, 0x99D2, 0x8209, 0x64DA, 0x92F8, 0x61FC, 0x5287,\n    0x9D51, 0x7D79, 0x89BA, 0x8A23, 0x7D76, 0x921E, 0x8ECD, 0x99FF,\n    0x958B, 0x51F1, 0x9846, 0x6BBB, 0x8AB2, 0x58BE, 0x61C7, 0x6473,\n    0x5EAB, 0x8932, 0x8A87, 0x584A, 0x5108, 0x5BEC, 0x7926, 0x66E0,\n    0x8667, 0x5DCB, 0x7ABA, 0x994B, 0x6F70, 0x64F4, 0x95CA, 0x881F,\n    0x81D8, 0x840A, 0x4F86, 0x8CF4, 0x85CD, 0x6B04, 0x6514, 0x7C43,\n    0x95CC, 0x862D, 0x703E, 0x8B95, 0x652C, 0x89BD, 0x61F6, 0x7E9C,\n    0x721B, 0x6FEB, 0x6488, 0x52DE, 0x6F87, 0x6A02, 0x9433, 0x58D8,\n    0x985E, 0x7C6C, 0x96E2, 0x7055, 0x88CF, 0x9BC9, 0x79AE, 0x9E97,\n    0x53B2, 0x52F5, 0x792B, 0x6B77, 0x701D, 0x96B8, 0x5006, 0x806F,\n    0x84EE, 0x9023, 0x942E, 0x6190, 0x6F23, 0x7C3E, 0x6582, 0x81C9,\n    0x93C8, 0x6200, 0x7149, 0x7DF4, 0x7CE7, 0x5169, 0x8F1B, 0x8AD2,\n    0x7642, 0x907C, 0x9410, 0x7375, 0x81E8, 0x9130, 0x9C57, 0x8CC3,\n    0x9F61, 0x9234, 0x9748, 0x5DBA, 0x9818, 0x993E, 0x5289, 0x9F8D,\n    0x807E, 0x56A8, 0x7C60, 0x58DF, 0x650F, 0x96B4, 0x6A13, 0x5A41,\n    0x645F, 0x7C0D, 0x8606, 0x76E7, 0x9871, 0x5EEC, 0x7210, 0x64C4,\n    0x6EF7, 0x865C, 0x9B6F, 0x8CC2, 0x9332, 0x9678, 0x9A62, 0x92C1,\n    0x5C62, 0x7E37, 0x616E, 0x6FFE, 0x7DD1, 0x5DD2, 0x6523, 0x5B7F,\n    0x7064, 0x4E82, 0x6384, 0x8F2A, 0x502B, 0x4F96, 0x6DEA, 0x7DB8,\n    0x8AD6, 0x863F, 0x7F85, 0x908F, 0x947C, 0x7C6E, 0x9A3E, 0x99F1,\n    0x7D61, 0x5ABD, 0x746A, 0x78BC, 0x879E, 0x99AC, 0x99E1, 0x55CE,\n    0x8CB7, 0x9EA5, 0x8CE3, 0x9081, 0x779E, 0x9945, 0x883B, 0x6EFF,\n    0x8B3E, 0x9328, 0x925A, 0x8CBF, 0x9382, 0x9580, 0x60B6, 0x5011,\n    0x9333, 0x5922, 0x8B0E, 0x5F4C, 0x8993, 0x7DBF, 0x7DEC, 0x5EDF,\n    0x6EC5, 0x61AB, 0x95A9, 0x9CF4, 0x9298, 0x8B2C, 0x8B00, 0x755D,\n    0x9209, 0x7D0D, 0x96E3, 0x6493, 0x8166, 0x60F1, 0x9B27, 0x9912,\n    0x64EC, 0x81A9, 0x6506, 0x91C0, 0x9CE5, 0x8076, 0x5699, 0x9477,\n    0x93B3, 0x6AB8, 0x7370, 0x5BE7, 0x64F0, 0x6FD8, 0x9215, 0x7D10,\n    0x81BF, 0x6FC3, 0x8FB2, 0x7627, 0x8AFE, 0x6B50, 0x9DD7, 0x6BC6,\n    0x5614, 0x6F1A, 0x76E4, 0x9F90, 0x8CE0, 0x5674, 0x9D6C, 0x9A19,\n    0x98C4, 0x983B, 0x8CA7, 0x860B, 0x6191, 0x8A55, 0x6F51, 0x9817,\n    0x64B2, 0x92EA, 0x50D5, 0x6A38, 0x8B5C, 0x81CD, 0x9F4A, 0x9A0E,\n    0x8C48, 0x5553, 0x6C23, 0x8A16, 0x727D, 0x91FA, 0x925B, 0x9077,\n    0x7C3D, 0x8B19, 0x9322, 0x9257, 0x6DFA, 0x8B74, 0x5879, 0x69CD,\n    0x55C6, 0x58BB, 0x8594, 0x6436, 0x936C, 0x6A4B, 0x55AC, 0x50D1,\n    0x7FF9, 0x7AC5, 0x7ACA, 0x6B3D, 0x89AA, 0x5BE2, 0x8F15, 0x6C2B,\n    0x50BE, 0x9803, 0x8ACB, 0x6176, 0x74CA, 0x7AAE, 0x8DA8, 0x5340,\n    0x8EC0, 0x9A45, 0x9F72, 0x9874, 0x6B0A, 0x52F8, 0x9D72, 0x78BA,\n    0x8B93, 0x9952, 0x64FE, 0x7E5E, 0x71B1, 0x97CC, 0x8A8D, 0x7D09,\n    0x69AE, 0x7D68, 0x8EDF, 0x92ED, 0x958F, 0x6F64, 0x7051, 0x85A9,\n    0x9C13, 0x8CFD, 0x5098, 0x55AA, 0x9A37, 0x6383, 0x6F80, 0x6BBA,\n    0x7D17, 0x7BE9, 0x66EC, 0x9583, 0x965D, 0x8D0D, 0x7E55, 0x50B7,\n    0x8CDE, 0x71D2, 0x7D39, 0x8CD2, 0x6368, 0x651D, 0x61FE, 0x8A2D,\n    0x7D33, 0x5BE9, 0x5B38, 0x814E, 0x6EF2, 0x8072, 0x7E69, 0x52DD,\n    0x8056, 0x5E2B, 0x7345, 0x6FD5, 0x8A69, 0x6642, 0x8755, 0x5BE6,\n    0x8B58, 0x99DB, 0x52E2, 0x9069, 0x91CB, 0x98FE, 0x8996, 0x8A66,\n    0x58FD, 0x7378, 0x6A1E, 0x8F38, 0x66F8, 0x8D16, 0x5C6C, 0x8853,\n    0x6A39, 0x7AEA, 0x6578, 0x5E25, 0x96D9, 0x8AB0, 0x9806, 0x8AAC,\n    0x78A9, 0x720D, 0x7D72, 0x98FC, 0x9B06, 0x8073, 0x616B, 0x980C,\n    0x8A1F, 0x8AA6, 0x64FB, 0x8607, 0x8A34, 0x8085, 0x96D6, 0x96A8,\n    0x7D8F, 0x6B72, 0x5B6B, 0x640D, 0x7E2E, 0x7463, 0x9396, 0x737A,\n    0x64BB, 0x81FA, 0x614B, 0x6524, 0x8CAA, 0x7671, 0x7058, 0x58C7,\n    0x8B5A, 0x8AC7, 0x5606, 0x6E6F, 0x71D9, 0x6FE4, 0x7E27, 0x8A0E,\n    0x9A30, 0x8B04, 0x92BB, 0x984C, 0x9AD4, 0x689D, 0x8CBC, 0x9435,\n    0x5EF3, 0x807D, 0x70F4, 0x9285, 0x7D71, 0x982D, 0x5716, 0x5857,\n    0x5718, 0x983D, 0x9D15, 0x99B1, 0x99DD, 0x6A62, 0x7AAA, 0x896A,\n    0x5F4E, 0x7063, 0x9811, 0x842C, 0x7DB2, 0x97CB, 0x9055, 0x570D,\n    0x7232, 0x6FF0, 0x7DAD, 0x8466, 0x5049, 0x50DE, 0x7DEF, 0x8B02,\n    0x885B, 0x805E, 0x7D0B, 0x7A69, 0x554F, 0x64BE, 0x8778, 0x6E26,\n    0x7AA9, 0x55DA, 0x93A2, 0x70CF, 0x8AA3, 0x7121, 0x856A, 0x5862,\n    0x9727, 0x52D9, 0x8AA4, 0x932B, 0x72A7, 0x8972, 0x7FD2, 0x9291,\n    0x6232, 0x7D30, 0x8766, 0x8F44, 0x5CFD, 0x4FE0, 0x72F9, 0x5687,\n    0x9341, 0x9BAE, 0x7E96, 0x8CE2, 0x929C, 0x9591, 0x986F, 0x96AA,\n    0x73FE, 0x737B, 0x7E23, 0x9921, 0x61B2, 0x7DAB, 0x9472, 0x9109,\n    0x8A73, 0x97FF, 0x9805, 0x856D, 0x56C2, 0x92B7, 0x66C9, 0x562F,\n    0x5354, 0x633E, 0x8105, 0x8AE7, 0x5BEB, 0x7009, 0x8B1D, 0x92C5,\n    0x91C1, 0x8208, 0x92B9, 0x7D89, 0x9808, 0x8A31, 0x7DD2, 0x7E8C,\n    0x8ED2, 0x61F8, 0x9078, 0x766C, 0x7D62, 0x5B78, 0x52DB, 0x8A62,\n    0x5C0B, 0x99B4, 0x8A13, 0x8A0A, 0x905C, 0x58D3, 0x9D09, 0x9D28,\n    0x555E, 0x4E9E, 0x8A1D, 0x95B9, 0x9E7D, 0x56B4, 0x9854, 0x95BB,\n    0x8277, 0x53AD, 0x786F, 0x8AFA, 0x9A57, 0x9D26, 0x694A, 0x63DA,\n    0x760D, 0x967D, 0x7662, 0x990A, 0x6A23, 0x582F, 0x8B21, 0x85E5,\n    0x723A, 0x9801, 0x696D, 0x8449, 0x91AB, 0x92A5, 0x9824, 0x907A,\n    0x5100, 0x87FB, 0x85DD, 0x5104, 0x61B6, 0x7FA9, 0x8A63, 0x8B70,\n    0x8ABC, 0x8B6F, 0x7E79, 0x852D, 0x9670, 0x9280, 0x98F2, 0x96B1,\n    0x6AFB, 0x5B30, 0x9DF9, 0x61C9, 0x7E93, 0x7469, 0x87A2, 0x71DF,\n    0x7192, 0x8805, 0x8D0F, 0x7A4E, 0x55B2, 0x64C1, 0x50AD, 0x7670,\n    0x8E34, 0x512A, 0x6182, 0x90F5, 0x923E, 0x7336, 0x8A98, 0x8F3F,\n    0x9918, 0x9B5A, 0x6F01, 0x8207, 0x5DBC, 0x8A9E, 0x9B31, 0x7344,\n    0x8B7D, 0x9810, 0x99AD, 0x9D1B, 0x6DF5, 0x8F45, 0x5712, 0x54E1,\n    0x5713, 0x7DE3, 0x9060, 0x9858, 0x7D04, 0x8E8D, 0x9470, 0x95B2,\n    0x96F2, 0x9116, 0x9695, 0x904B, 0x85F4, 0x9196, 0x6688, 0x96DC,\n    0x8F09, 0x6522, 0x66AB, 0x8D0A, 0x8D1C, 0x81DF, 0x947F, 0x68D7,\n    0x7AC8, 0x8CAC, 0x64C7, 0x5247, 0x6FA4, 0x8CCA, 0x8D08, 0x8ECB,\n    0x9358, 0x9598, 0x8A50, 0x9F4B, 0x50B5, 0x6C08, 0x76DE, 0x65AC,\n    0x8F3E, 0x5D84, 0x68E7, 0x6230, 0x7DBB, 0x5F35, 0x6F32, 0x5E33,\n    0x8CEC, 0x8139, 0x8D99, 0x87C4, 0x8F4D, 0x937A, 0x9019, 0x8C9E,\n    0x91DD, 0x5075, 0x8A3A, 0x93AE, 0x9663, 0x5E40, 0x7665, 0x912D,\n    0x8B49, 0x7E54, 0x8077, 0x57F7, 0x8879, 0x7D19, 0x646F, 0x64F2,\n    0x5E5F, 0x8CEA, 0x6EEF, 0x9418, 0x7D42, 0x7A2E, 0x816B, 0x8846,\n    0x8B05, 0x8EF8, 0x76BA, 0x665D, 0x9A5F, 0x8AF8, 0x8A85, 0x71ED,\n    0x77DA, 0x56D1, 0x8CAF, 0x9444, 0x7BC9, 0x99D0, 0x5C08, 0x78DA,\n    0x8F49, 0x8CFA, 0x6A01, 0x838A, 0x88DD, 0x599D, 0x58EF, 0x72C0,\n    0x9310, 0x8D05, 0x589C, 0x7DB4, 0x8AC4, 0x6E96, 0x6FC1, 0x8CC7,\n    0x6F2C, 0x7D9C, 0x7E3D, 0x7E31, 0x9112, 0x8A5B, 0x7D44, 0x947D,\n    0x55C7, 0x5399, 0x53B4, 0x9768, 0x8D0B, 0x532D, 0x5331, 0x8CFE,\n    0x5244, 0x528C, 0x5274, 0x50B4, 0x5000, 0x5096, 0x5115, 0x5102,\n    0x5114, 0x513C, 0x5137, 0x50E8, 0x50C2, 0x513B, 0x5110, 0x513A,\n    0x50C9, 0x7CF4, 0x9ECC, 0x56C5, 0x9CEC, 0x893B, 0x81E0, 0x8A01,\n    0x8A10, 0x8A0C, 0x8A15, 0x8B33, 0x8A4E, 0x8A25, 0x8A41, 0x8A36,\n    0x8A46, 0x8A54, 0x8A58, 0x8A52, 0x8A86, 0x8A84, 0x8A7F, 0x8A70,\n    0x8A7C, 0x8A75, 0x8A6C, 0x8A6E, 0x8ACD, 0x8AE2, 0x8A61, 0x8A9A,\n    0x8AA5, 0x8A91, 0x8A92, 0x8ACF, 0x8AD1, 0x8AC9, 0x8ADB, 0x8AD7,\n    0x8AC2, 0x8AB6, 0x8AF6, 0x8AEB, 0x8B14, 0x8B01, 0x8AE4, 0x8AED,\n    0x8AFC, 0x8AF3, 0x8AE6, 0x8AEE, 0x8ADE, 0x8B28, 0x8B9C, 0x8B16,\n    0x8B1A, 0x8B10, 0x8B2B, 0x8B2D, 0x8B56, 0x8B59, 0x8B4E, 0x8B9E,\n    0x8B6B, 0x8B96, 0x9658, 0x913A, 0x9114, 0x9134, 0x90DF, 0x9136,\n    0x9106, 0x9148, 0x82BB, 0x52F1, 0x5DF0, 0x580A, 0x58D9, 0x58E2,\n    0x58E0, 0x58DA, 0x57E1, 0x584F, 0x5816, 0x5852, 0x581D, 0x5864,\n    0x858C, 0x8553, 0x85F6, 0x83A7, 0x8407, 0x84EF, 0x82E7, 0x8622,\n    0x8526, 0x584B, 0x7162, 0x8558, 0x84FD, 0x854E, 0x8588, 0x85BA,\n    0x7296, 0x6ECE, 0x8541, 0x85CE, 0x8552, 0x84C0, 0x8452, 0x8464,\n    0x8494, 0x8435, 0x859F, 0x8555, 0x9DAF, 0x8493, 0x7E08, 0x8546,\n    0x8562, 0x851E, 0x9A40, 0x863A, 0x93A3, 0x8577, 0x861E, 0x85FA,\n    0x8604, 0x85EA, 0x861A, 0x5969, 0x5C37, 0x636B, 0x6476, 0x649F,\n    0x6451, 0x645C, 0x64B3, 0x6504, 0x6516, 0x64F7, 0x64FC, 0x651B,\n    0x5630, 0x5638, 0x56C8, 0x56A6, 0x5504, 0x54BC, 0x5680, 0x565D,\n    0x5660, 0x5635, 0x55F6, 0x5666, 0x5672, 0x568C, 0x5665, 0x561C,\n    0x562E, 0x55E9, 0x5616, 0x56C0, 0x560D, 0x56B3, 0x56C1, 0x566F,\n    0x8F61, 0x56B6, 0x5695, 0x5707, 0x5E43, 0x5E6C, 0x5E58, 0x5E57,\n    0x5D87, 0x5CF4, 0x5D50, 0x5D2C, 0x5DA7, 0x5DA0, 0x5D97, 0x5D0D,\n    0x5DB8, 0x5D81, 0x5DD4, 0x5FA0, 0x7377, 0x7341, 0x736A, 0x733B,\n    0x736B, 0x7380, 0x737C, 0x98E0, 0x9933, 0x98E9, 0x993C, 0x98EA,\n    0x98EB, 0x98ED, 0x98F4, 0x9909, 0x9911, 0x991B, 0x9937, 0x993F,\n    0x9943, 0x9948, 0x9949, 0x994A, 0x994C, 0x9962, 0x5EE1, 0x8CE1,\n    0x61FA, 0x61AE, 0x616A, 0x613E, 0x60B5, 0x6134, 0x61CC, 0x615F,\n    0x61E8, 0x60FB, 0x6137, 0x60F2, 0x6173, 0x611C, 0x6192, 0x9582,\n    0x9586, 0x95C8, 0x958E, 0x9594, 0x958C, 0x95E5, 0x95AD, 0x95AB,\n    0x9B2E, 0x95AC, 0x95BE, 0x95B6, 0x9B29, 0x95BF, 0x95BD, 0x95BC,\n    0x95C3, 0x95CB, 0x95D4, 0x95D0, 0x95D5, 0x95DE, 0x7043, 0x6F59,\n    0x7027, 0x7018, 0x6FFC, 0x6D87, 0x6D79, 0x6E5E, 0x6FAE, 0x700F,\n    0x6EF8, 0x6F6F, 0x6DF6, 0x6F7F, 0x7006, 0x6FA0, 0x700B, 0x7067,\n    0x7044, 0x7005, 0x6F77, 0x7020, 0x701F, 0x7032, 0x7028, 0x705D,\n    0x9A2B, 0x9087, 0x9015, 0x9090, 0x5C68, 0x5F33, 0x5AF5, 0x5AD7,\n    0x5B00, 0x5A6D, 0x5B08, 0x5B4C, 0x5AA7, 0x5AFB, 0x5B0B, 0x5B21,\n    0x5B2A, 0x5B19, 0x99D4, 0x99DF, 0x99D9, 0x9A36, 0x9A5B, 0x99D1,\n    0x99D8, 0x9A4D, 0x9A4A, 0x99E2, 0x9A6A, 0x9A0F, 0x9A0D, 0x9A05,\n    0x9A42, 0x9A2D, 0x9A16, 0x9A41, 0x9A2E, 0x9A38, 0x9A43, 0x9A44,\n    0x9A4F, 0x9A65, 0x9A64, 0x7CF9, 0x7D06, 0x7D02, 0x7D07, 0x7D08,\n    0x7E8A, 0x7D1C, 0x7D15, 0x7D13, 0x7D3A, 0x7D32, 0x7D31, 0x7E10,\n    0x7D3C, 0x7D40, 0x7D3F, 0x7D5D, 0x7D4E, 0x7D73, 0x7D86, 0x7D83,\n    0x7D88, 0x7DBE, 0x7DBA, 0x7DCB, 0x7DD4, 0x7DC4, 0x7D9E, 0x7DAC,\n    0x7DB9, 0x7DA3, 0x7DB0, 0x7DC7, 0x7DD9, 0x7DD7, 0x7DF9, 0x7DF2,\n    0x7E62, 0x7DE6, 0x7DF6, 0x7DF1, 0x7E0B, 0x7DE1, 0x7E09, 0x7E1D,\n    0x7E1F, 0x7E1E, 0x7E2D, 0x7E0A, 0x7E11, 0x7E7D, 0x7E39, 0x7E35,\n    0x7E32, 0x7E46, 0x7E45, 0x7E88, 0x7E5A, 0x7E52, 0x7E6E, 0x7E7E,\n    0x7E70, 0x7E6F, 0x7E98, 0x74A3, 0x744B, 0x74CF, 0x980A, 0x74BD,\n    0x743F, 0x7489, 0x74A6, 0x74D4, 0x74DA, 0x97D9, 0x97DE, 0x97DC,\n    0x69AA, 0x6AEA, 0x6898, 0x68D6, 0x6A05, 0x689F, 0x6ADB, 0x6AF3,\n    0x6AE8, 0x6ADF, 0x6A89, 0x690F, 0x6A48, 0x6968, 0x69BF, 0x6A3A,\n    0x6A9C, 0x6B12, 0x6B1E, 0x6ADD, 0x69E7, 0x6B0F, 0x6B16, 0x6AEC,\n    0x6ADA, 0x6AF8, 0x6AB3, 0x6AE7, 0x6AA3, 0x6AD3, 0x6ADE, 0x6BA4,\n    0x6B9E, 0x6BAE, 0x6BAB, 0x6BAF, 0x8ED4, 0x8EDB, 0x8EF2, 0x8EFB,\n    0x8F64, 0x8EF9, 0x8EFC, 0x8EEB, 0x8EE4, 0x8F62, 0x8EFA, 0x8EFE,\n    0x8F0A, 0x8F07, 0x8F05, 0x8F12, 0x8F26, 0x8F1E, 0x8F1F, 0x8F1C,\n    0x8F33, 0x8F46, 0x8F54, 0x6214, 0x6227, 0x750C, 0x66C7, 0x66C4,\n    0x6689, 0x66D6, 0x8CC1, 0x8CB0, 0x8CBA, 0x8CBD, 0x8D04, 0x8CB2,\n    0x8CC5, 0x8D10, 0x8CD1, 0x8CDA, 0x8CD5, 0x8CEB, 0x8CE7, 0x8CFB,\n    0x8998, 0x89AC, 0x89A1, 0x89BF, 0x89A6, 0x89AF, 0x89B2, 0x89B7,\n    0x6BFF, 0x6C0C, 0x6C2C, 0x7258, 0x6727, 0x8156, 0x81DA, 0x811B,\n    0x81BE, 0x8161, 0x81CF, 0x6B5F, 0x98AE, 0x98AF, 0x98B6, 0x98BC,\n    0x98C6, 0x98C8, 0x8F42, 0x9F4F, 0x6595, 0x716C, 0x7152, 0x7197,\n    0x71C1, 0x71DC, 0x71FE, 0x79B0, 0x798E, 0x79AA, 0x61DF, 0x6164,\n    0x61E3, 0x6207, 0x6FA9, 0x78EF, 0x78AD, 0x7868, 0x78B8, 0x792A,\n    0x7931, 0x7864, 0x78FD, 0x78E7, 0x78E3, 0x9F95, 0x7798, 0x775E,\n    0x77BC, 0x7F86, 0x7F88, 0x91D2, 0x91D3, 0x91D4, 0x91D9, 0x91D7,\n    0x91D5, 0x91F7, 0x91E7, 0x91E4, 0x9346, 0x91F5, 0x91F9, 0x9208,\n    0x9226, 0x9245, 0x9211, 0x9210, 0x9201, 0x9227, 0x9204, 0x9225,\n    0x9200, 0x923A, 0x9266, 0x9237, 0x9233, 0x9255, 0x923D, 0x9238,\n    0x925E, 0x926C, 0x926D, 0x923F, 0x9460, 0x9230, 0x9249, 0x9248,\n    0x924D, 0x922E, 0x9239, 0x9438, 0x92AC, 0x92A0, 0x927A, 0x92AA,\n    0x92EE, 0x92CF, 0x9403, 0x92E3, 0x943A, 0x92B1, 0x92A6, 0x93A7,\n    0x9296, 0x92CC, 0x92A9, 0x93F5, 0x9293, 0x927F, 0x93A9, 0x929A,\n    0x931A, 0x92AB, 0x9283, 0x940B, 0x92A8, 0x92A3, 0x9412, 0x9338,\n    0x92F1, 0x93D7, 0x92E5, 0x92F0, 0x92EF, 0x92E8, 0x92BC, 0x92DD,\n    0x92F6, 0x9426, 0x9427, 0x92C3, 0x92DF, 0x92E6, 0x9312, 0x9306,\n    0x9369, 0x931B, 0x9340, 0x9301, 0x9315, 0x932E, 0x9343, 0x9307,\n    0x9308, 0x931F, 0x9319, 0x9365, 0x9347, 0x9376, 0x9354, 0x9364,\n    0x93AA, 0x9370, 0x9384, 0x93E4, 0x93D8, 0x9428, 0x9387, 0x93CC,\n    0x9398, 0x93B8, 0x93BF, 0x93A6, 0x93B0, 0x93B5, 0x944C, 0x93E2,\n    0x93DC, 0x93DD, 0x93CD, 0x93DE, 0x93C3, 0x93C7, 0x93D1, 0x9414,\n    0x941D, 0x93F7, 0x9465, 0x9413, 0x946D, 0x9420, 0x9479, 0x93F9,\n    0x9419, 0x944A, 0x9432, 0x943F, 0x9454, 0x9463, 0x937E, 0x7A61,\n    0x9CE9, 0x9CF6, 0x9D07, 0x9D06, 0x9D23, 0x9D87, 0x9E15, 0x9D1D,\n    0x9D1F, 0x9DE5, 0x9D2F, 0x9DD9, 0x9D30, 0x9D42, 0x9E1E, 0x9D53,\n    0x9E1D, 0x9D60, 0x9D52, 0x9DF3, 0x9D5C, 0x9D61, 0x9D93, 0x9D6A,\n    0x9D6F, 0x9D89, 0x9D98, 0x9D9A, 0x9DC0, 0x9DA5, 0x9DA9, 0x9DC2,\n    0x9DBC, 0x9E1A, 0x9DD3, 0x9DDA, 0x9DEF, 0x9DE6, 0x9DF2, 0x9DF8,\n    0x9E0C, 0x9DFA, 0x9E1B, 0x7664, 0x7658, 0x7667, 0x7602, 0x7646,\n    0x7647, 0x7649, 0x761E, 0x763B, 0x766D, 0x766E, 0x7669, 0x7672,\n    0x7AC7, 0x7AB6, 0x8960, 0x8933, 0x895D, 0x8947, 0x8938, 0x8964,\n    0x76B8, 0x802E, 0x802C, 0x8079, 0x8075, 0x9807, 0x980E, 0x980F,\n    0x9821, 0x981C, 0x6F41, 0x9826, 0x9837, 0x984E, 0x9853, 0x9873,\n    0x9862, 0x9859, 0x9865, 0x986C, 0x9870, 0x87E3, 0x8806, 0x8706,\n    0x8823, 0x87F6, 0x86FA, 0x87EF, 0x8784, 0x8810, 0x87C8, 0x8811,\n    0x87BB, 0x87CE, 0x7F4C, 0x7BE4, 0x7B67, 0x7C69, 0x7BF3, 0x7C00,\n    0x7BCB, 0x7C5C, 0x7C1E, 0x7C2B, 0x7C23, 0x7C6A, 0x7C5F, 0x8264,\n    0x826B, 0x88CA, 0x7FA5, 0x7CF2, 0x7CF6, 0x7CDD, 0x7E36, 0x9EA9,\n    0x8DB2, 0x91C5, 0x91C3, 0x9E7A, 0x8E89, 0x8E4C, 0x8E92, 0x8E7A,\n    0x8E55, 0x8E9A, 0x8E8B, 0x8E93, 0x8E91, 0x8EA1, 0x8E63, 0x8EAA,\n    0x8EA6, 0x89F4, 0x89F6, 0x975A, 0x9742, 0x973D, 0x9744, 0x9F54,\n    0x9F5F, 0x9F59, 0x9F60, 0x9F5C, 0x9F66, 0x9F6C, 0x9F6A, 0x9F77,\n    0x9EFD, 0x9EFF, 0x9F09, 0x8B8E, 0x947E, 0x93E8, 0x9B77, 0x9B74,\n    0x9B81, 0x9B83, 0x9B8E, 0x9C78, 0x7A4C, 0x9B92, 0x9C5F, 0x9B90,\n    0x9BAD, 0x9B9A, 0x9BAA, 0x9B9E, 0x9C6D, 0x9BAB, 0x9B9D, 0x9C58,\n    0x9BC1, 0x9C7A, 0x9C31, 0x9C39, 0x9C23, 0x9C37, 0x9BC0, 0x9BCA,\n    0x9BC7, 0x9BFD, 0x9BD6, 0x9BEA, 0x9BEB, 0x9BE1, 0x9BE4, 0x9BE7,\n    0x9BDD, 0x9BE2, 0x9BF0, 0x9BDB, 0x9BF4, 0x9BD4, 0x9C5D, 0x9C08,\n    0x9C10, 0x9C0D, 0x9C12, 0x9C09, 0x9BFF, 0x9C20, 0x9C32, 0x9C2D,\n    0x9C28, 0x9C25, 0x9C29, 0x9C33, 0x9C3E, 0x9C48, 0x9C3B, 0x9C35,\n    0x9C45, 0x9C56, 0x9C54, 0x9C52, 0x9C67, 0x97C3, 0x97BD, 0x97C9,\n    0x9DBB, 0x9ACF, 0x9AD6, 0x9AD5, 0x9B58, 0x9B4E, 0x9957, 0x995C,\n    0x9B22, 0x9EF7, 0x9EF2, 0x896C, 0x95C6, 0x9336, 0x5F46, 0x8514,\n    0x7E94, 0x9F63, 0x5679, 0x9F15, 0x5641, 0x9AEE, 0x8907, 0x7A40,\n    0x98B3, 0x95A4, 0x9B0D, 0x8FF4, 0x5F59, 0x7A6B, 0x98E2, 0x50A2,\n    0x8591, 0x5118, 0x6372, 0x524B, 0x774F, 0x7E8D, 0x66C6, 0x77AD,\n    0x9E75, 0x56C9, 0x9EF4, 0x6FDB, 0x61DE, 0x77C7, 0x7030, 0x9EB5,\n    0x884A, 0x95E2, 0x97C6, 0x7C64, 0x7E34, 0x97A6, 0x9EAF, 0x56CC,\n    0x98B1, 0x6AAF, 0x7F4E, 0x7CF0, 0x4FC2, 0x7E6B, 0x9E79, 0x56AE,\n    0x9B1A, 0x846F, 0x79A6, 0x7C72, 0x9AD2, 0x96BB, 0x7DFB, 0x88FD,\n    0x7843, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176,\n    0x2177, 0x2178, 0x2179, 0x02CA, 0x02CB, 0x02D9, 0x2013, 0x2015,\n    0x2025, 0x2035, 0x2105, 0x2109, 0x2196, 0x2197, 0x2198, 0x2199,\n    0x2215, 0x221F, 0x2223, 0x2252, 0x2266, 0x2267, 0x22BF, 0x2550,\n    0x2551, 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558,\n    0x2559, 0x255A, 0x255B, 0x255C, 0x255D, 0x255E, 0x255F, 0x2560,\n    0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568,\n    0x2569, 0x256A, 0x256B, 0x256C, 0x256D, 0x256E, 0x256F, 0x2570,\n    0x2571, 0x2572, 0x2573, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585,\n    0x2586, 0x2587, 0x2588, 0x2589, 0x258A, 0x258B, 0x258C, 0x258D,\n    0x258E, 0x258F, 0x2593, 0x2594, 0x2595, 0x25BC, 0x25BD, 0x25E2,\n    0x25E3, 0x25E4, 0x25E5, 0x2609, 0x2295, 0x3012, 0x301D, 0x301E,\n    0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028,\n    0x3029, 0x32A3, 0x338E, 0x338F, 0x339C, 0x339D, 0x339E, 0x33A1,\n    0x33C4, 0x33CE, 0x33D1, 0x33D2, 0x33D5, 0xFE30, 0xFFE2, 0xFFE4,\n    0x2121, 0x3231, 0x2010, 0x30FC, 0x309B, 0x309C, 0x30FD, 0x30FE,\n    0x3006, 0x309D, 0x309E, 0xFE49, 0xFE4A, 0xFE4B, 0xFE4C, 0xFE4D,\n    0xFE4E, 0xFE4F, 0xFE50, 0xFE51, 0xFE52, 0xFE54, 0xFE55, 0xFE56,\n    0xFE57, 0xFE59, 0xFE5A, 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0xFE5F,\n    0xFE60, 0xFE61, 0xFE62, 0xFE63, 0xFE64, 0xFE65, 0xFE66, 0xFE68,\n    0xFE69, 0xFE6A, 0xFE6B, 0x303E, 0x2FF0, 0x2FF1, 0x2FF2, 0x2FF3,\n    0x2FF4, 0x2FF5, 0x2FF6, 0x2FF7, 0x2FF8, 0x2FF9, 0x2FFA, 0x2FFB,\n    0x4E02, 0x4E04, 0x4E05, 0x4E06, 0x4E0F, 0x4E12, 0x4E17, 0x4E1F,\n    0x4E20, 0x4E21, 0x4E23, 0x4E26, 0x4E29, 0x4E2E, 0x4E2F, 0x4E31,\n    0x4E33, 0x4E35, 0x4E37, 0x4E3C, 0x4E40, 0x4E41, 0x4E42, 0x4E44,\n    0x4E46, 0x4E4A, 0x4E51, 0x4E55, 0x4E57, 0x4E5A, 0x4E5B, 0x4E62,\n    0x4E63, 0x4E64, 0x4E65, 0x4E67, 0x4E68, 0x4E6A, 0x4E6B, 0x4E6C,\n    0x4E6D, 0x4E6E, 0x4E6F, 0x4E72, 0x4E74, 0x4E75, 0x4E76, 0x4E77,\n    0x4E78, 0x4E79, 0x4E7A, 0x4E7B, 0x4E7C, 0x4E7D, 0x4E7F, 0x4E80,\n    0x4E81, 0x4E83, 0x4E84, 0x4E85, 0x4E87, 0x4E8A, 0x4E90, 0x4E96,\n    0x4E97, 0x4E99, 0x4E9C, 0x4E9D, 0x4EA3, 0x4EAA, 0x4EAF, 0x4EB0,\n    0x4EB1, 0x4EB4, 0x4EB6, 0x4EB7, 0x4EB8, 0x4EB9, 0x4EBC, 0x4EBD,\n    0x4EBE, 0x4EC8, 0x4ECC, 0x4ECF, 0x4ED0, 0x4ED2, 0x4EDA, 0x4EDB,\n    0x4EDC, 0x4EE0, 0x4EE2, 0x4EE6, 0x4EE7, 0x4EE9, 0x4EED, 0x4EEE,\n    0x4EEF, 0x4EF1, 0x4EF4, 0x4EF8, 0x4EF9, 0x4EFA, 0x4EFC, 0x4EFE,\n    0x4F00, 0x4F02, 0x4F03, 0x4F04, 0x4F05, 0x4F06, 0x4F07, 0x4F08,\n    0x4F0B, 0x4F0C, 0x4F12, 0x4F13, 0x4F14, 0x4F15, 0x4F16, 0x4F1C,\n    0x4F1D, 0x4F21, 0x4F23, 0x4F28, 0x4F29, 0x4F2C, 0x4F2D, 0x4F2E,\n    0x4F31, 0x4F33, 0x4F35, 0x4F37, 0x4F39, 0x4F3B, 0x4F3E, 0x4F3F,\n    0x4F40, 0x4F41, 0x4F42, 0x4F44, 0x4F45, 0x4F47, 0x4F48, 0x4F49,\n    0x4F4A, 0x4F4B, 0x4F4C, 0x4F52, 0x4F54, 0x4F56, 0x4F61, 0x4F62,\n    0x4F66, 0x4F68, 0x4F6A, 0x4F6B, 0x4F6D, 0x4F6E, 0x4F71, 0x4F72,\n    0x4F75, 0x4F77, 0x4F78, 0x4F79, 0x4F7A, 0x4F7D, 0x4F80, 0x4F81,\n    0x4F82, 0x4F85, 0x4F87, 0x4F8A, 0x4F8C, 0x4F8E, 0x4F90, 0x4F92,\n    0x4F93, 0x4F95, 0x4F98, 0x4F99, 0x4F9A, 0x4F9C, 0x4F9E, 0x4F9F,\n    0x4FA1, 0x4FA2, 0x4FA4, 0x4FAB, 0x4FAD, 0x4FB0, 0x4FB1, 0x4FB2,\n    0x4FB3, 0x4FB4, 0x4FB6, 0x4FB7, 0x4FB8, 0x4FB9, 0x4FBA, 0x4FBB,\n    0x4FBC, 0x4FBD, 0x4FBE, 0x4FC0, 0x4FC1, 0x4FC6, 0x4FC7, 0x4FC8,\n    0x4FC9, 0x4FCB, 0x4FCC, 0x4FCD, 0x4FD2, 0x4FD3, 0x4FD4, 0x4FD5,\n    0x4FD6, 0x4FD9, 0x4FDB, 0x4FE2, 0x4FE4, 0x4FE5, 0x4FE7, 0x4FEB,\n    0x4FEC, 0x4FF0, 0x4FF2, 0x4FF4, 0x4FF5, 0x4FF6, 0x4FF7, 0x4FF9,\n    0x4FFB, 0x4FFC, 0x4FFD, 0x4FFF, 0x5001, 0x5002, 0x5003, 0x5004,\n    0x5005, 0x5007, 0x5008, 0x500A, 0x500E, 0x5010, 0x5013, 0x5015,\n    0x5016, 0x5017, 0x501B, 0x501D, 0x501E, 0x5020, 0x5022, 0x5023,\n    0x5024, 0x5027, 0x502F, 0x5030, 0x5031, 0x5032, 0x5033, 0x5034,\n    0x5035, 0x5036, 0x5037, 0x5038, 0x5039, 0x503B, 0x503D, 0x503F,\n    0x5040, 0x5041, 0x5042, 0x5044, 0x5045, 0x5046, 0x504A, 0x504B,\n    0x504D, 0x5050, 0x5051, 0x5052, 0x5053, 0x5054, 0x5056, 0x5057,\n    0x5058, 0x5059, 0x505B, 0x505D, 0x505E, 0x505F, 0x5060, 0x5061,\n    0x5062, 0x5063, 0x5064, 0x5066, 0x5067, 0x5068, 0x5069, 0x506A,\n    0x506B, 0x506D, 0x506E, 0x506F, 0x5070, 0x5071, 0x5072, 0x5073,\n    0x5078, 0x5079, 0x507A, 0x507C, 0x507D, 0x5081, 0x5082, 0x5083,\n    0x5084, 0x5086, 0x5087, 0x5089, 0x508A, 0x508B, 0x508C, 0x508E,\n    0x508F, 0x5090, 0x5091, 0x5092, 0x5093, 0x5094, 0x5095, 0x5097,\n    0x509A, 0x509B, 0x509C, 0x509D, 0x509E, 0x509F, 0x50A0, 0x50A1,\n    0x50A4, 0x50A6, 0x50AA, 0x50AB, 0x50AE, 0x50AF, 0x50B0, 0x50B1,\n    0x50B6, 0x50B8, 0x50B9, 0x50BC, 0x50BD, 0x50BF, 0x50C0, 0x50C1,\n    0x50C3, 0x50C4, 0x50C6, 0x50C7, 0x50C8, 0x50CA, 0x50CB, 0x50CC,\n    0x50CD, 0x50CE, 0x50D0, 0x50D2, 0x50D3, 0x50D4, 0x50D7, 0x50D8,\n    0x50D9, 0x50DB, 0x50DC, 0x50DD, 0x50DF, 0x50E0, 0x50E1, 0x50E2,\n    0x50E3, 0x50E4, 0x50E9, 0x50EA, 0x50EB, 0x50EF, 0x50F0, 0x50F1,\n    0x50F2, 0x50F4, 0x50F6, 0x50F7, 0x50F8, 0x50FA, 0x50FC, 0x50FD,\n    0x50FE, 0x50FF, 0x5101, 0x5103, 0x5105, 0x510A, 0x510C, 0x510D,\n    0x510E, 0x510F, 0x5111, 0x5113, 0x5116, 0x5117, 0x5119, 0x511A,\n    0x511B, 0x511C, 0x511D, 0x511E, 0x5120, 0x5122, 0x5123, 0x5124,\n    0x5125, 0x5126, 0x5127, 0x5128, 0x5129, 0x512B, 0x512C, 0x512D,\n    0x512E, 0x512F, 0x5130, 0x5131, 0x5133, 0x5134, 0x5135, 0x5136,\n    0x5138, 0x5139, 0x513D, 0x513E, 0x5142, 0x5147, 0x514A, 0x514C,\n    0x514E, 0x514F, 0x5150, 0x5153, 0x5157, 0x5158, 0x5159, 0x515B,\n    0x515D, 0x515E, 0x515F, 0x5160, 0x5161, 0x5163, 0x5164, 0x5166,\n    0x5167, 0x516A, 0x516F, 0x5172, 0x517A, 0x517E, 0x517F, 0x5183,\n    0x5184, 0x5186, 0x5187, 0x518A, 0x518B, 0x518E, 0x518F, 0x5190,\n    0x5191, 0x5193, 0x5194, 0x5198, 0x519A, 0x519D, 0x519E, 0x519F,\n    0x51A1, 0x51A3, 0x51A6, 0x51A7, 0x51A8, 0x51A9, 0x51AA, 0x51AD,\n    0x51AE, 0x51B4, 0x51B8, 0x51B9, 0x51BA, 0x51BE, 0x51BF, 0x51C1,\n    0x51C2, 0x51C3, 0x51C5, 0x51C8, 0x51CA, 0x51CE, 0x51D0, 0x51D2,\n    0x51D3, 0x51D4, 0x51D5, 0x51D6, 0x51D7, 0x51D8, 0x51D9, 0x51DA,\n    0x51DC, 0x51DE, 0x51DF, 0x51E2, 0x51E3, 0x51E5, 0x51E6, 0x51E7,\n    0x51E8, 0x51E9, 0x51EA, 0x51EC, 0x51EE, 0x51F2, 0x51F4, 0x51F7,\n    0x51FE, 0x5204, 0x5205, 0x5209, 0x520B, 0x520C, 0x520F, 0x5210,\n    0x5213, 0x5214, 0x5215, 0x521C, 0x521E, 0x521F, 0x5221, 0x5222,\n    0x5223, 0x5225, 0x5226, 0x5227, 0x522A, 0x522C, 0x522F, 0x5231,\n    0x5232, 0x5234, 0x5235, 0x523C, 0x523E, 0x5245, 0x5246, 0x5248,\n    0x5249, 0x524E, 0x524F, 0x5252, 0x5253, 0x5255, 0x5257, 0x5258,\n    0x5259, 0x525A, 0x525D, 0x525F, 0x5260, 0x5262, 0x5263, 0x5264,\n    0x5266, 0x5268, 0x526B, 0x526C, 0x526D, 0x5270, 0x5271, 0x5273,\n    0x5276, 0x5277, 0x5278, 0x5279, 0x527A, 0x527B, 0x527C, 0x527E,\n    0x5280, 0x5284, 0x5285, 0x5286, 0x528B, 0x528E, 0x528F, 0x5292,\n    0x5294, 0x5295, 0x5296, 0x5297, 0x5298, 0x5299, 0x529A, 0x529C,\n    0x52A4, 0x52A5, 0x52A6, 0x52A7, 0x52AE, 0x52AF, 0x52B0, 0x52B4,\n    0x52B5, 0x52B6, 0x52B7, 0x52B8, 0x52B9, 0x52BA, 0x52BB, 0x52BC,\n    0x52BD, 0x52C0, 0x52C2, 0x52C4, 0x52C5, 0x52C6, 0x52C8, 0x52CA,\n    0x52CC, 0x52CD, 0x52CE, 0x52CF, 0x52D1, 0x52D3, 0x52D4, 0x52D7,\n    0x52DA, 0x52DC, 0x52E0, 0x52E1, 0x52E3, 0x52E5, 0x52E6, 0x52E7,\n    0x52E8, 0x52E9, 0x52EA, 0x52EB, 0x52EC, 0x52ED, 0x52EE, 0x52EF,\n    0x52F2, 0x52F3, 0x52F4, 0x52F6, 0x52F7, 0x52FB, 0x52FC, 0x52FD,\n    0x5301, 0x5302, 0x5303, 0x5304, 0x5307, 0x5309, 0x530A, 0x530B,\n    0x530C, 0x530E, 0x5311, 0x5312, 0x5313, 0x5314, 0x5318, 0x531B,\n    0x531C, 0x531E, 0x531F, 0x5322, 0x5324, 0x5325, 0x5327, 0x5328,\n    0x5329, 0x532B, 0x532C, 0x5330, 0x5332, 0x5333, 0x5334, 0x5335,\n    0x5336, 0x5337, 0x5338, 0x533C, 0x533D, 0x5342, 0x5344, 0x5346,\n    0x534B, 0x534C, 0x534D, 0x5350, 0x5358, 0x5359, 0x535B, 0x535D,\n    0x5365, 0x5368, 0x536A, 0x536C, 0x536D, 0x5372, 0x5376, 0x5379,\n    0x537B, 0x537C, 0x537D, 0x537E, 0x5380, 0x5381, 0x5383, 0x5387,\n    0x5388, 0x538A, 0x538E, 0x538F, 0x5390, 0x5391, 0x5392, 0x5393,\n    0x5394, 0x5396, 0x5397, 0x539B, 0x539C, 0x539E, 0x53A1, 0x53A4,\n    0x53A7, 0x53AA, 0x53AB, 0x53AC, 0x53AF, 0x53B0, 0x53B1, 0x53B3,\n    0x53B5, 0x53B7, 0x53B8, 0x53B9, 0x53BA, 0x53BC, 0x53BD, 0x53BE,\n    0x53C0, 0x53C4, 0x53C5, 0x53C6, 0x53C7, 0x53CE, 0x53CF, 0x53D0,\n    0x53D2, 0x53D3, 0x53D5, 0x53DA, 0x53DC, 0x53DD, 0x53DE, 0x53E1,\n    0x53E7, 0x53F4, 0x53FA, 0x53FE, 0x53FF, 0x5400, 0x5402, 0x5405,\n    0x5407, 0x540B, 0x5414, 0x5418, 0x5419, 0x541A, 0x541C, 0x5422,\n    0x5424, 0x5425, 0x542A, 0x5430, 0x5433, 0x5436, 0x5437, 0x543A,\n    0x543D, 0x543F, 0x5441, 0x5442, 0x5444, 0x5445, 0x5447, 0x5449,\n    0x544C, 0x544D, 0x544E, 0x544F, 0x5451, 0x545A, 0x545D, 0x545E,\n    0x545F, 0x5460, 0x5461, 0x5463, 0x5465, 0x5467, 0x5469, 0x546A,\n    0x546B, 0x546C, 0x546D, 0x546E, 0x546F, 0x5470, 0x5474, 0x5479,\n    0x547A, 0x547E, 0x547F, 0x5481, 0x5483, 0x5485, 0x5487, 0x5488,\n    0x5489, 0x548A, 0x548D, 0x5491, 0x5493, 0x5497, 0x5498, 0x549C,\n    0x549E, 0x549F, 0x54A0, 0x54A1, 0x54A2, 0x54A5, 0x54AE, 0x54B0,\n    0x54B2, 0x54B5, 0x54B6, 0x54B7, 0x54B9, 0x54BA, 0x54BE, 0x54C3,\n    0x54C5, 0x54CA, 0x54CB, 0x54D6, 0x54D8, 0x54DB, 0x54E0, 0x54E2,\n    0x54E3, 0x54E4, 0x54EB, 0x54EC, 0x54EF, 0x54F0, 0x54F1, 0x54F4,\n    0x54F5, 0x54F6, 0x54F7, 0x54F8, 0x54F9, 0x54FB, 0x54FE, 0x5500,\n    0x5502, 0x5503, 0x5505, 0x5508, 0x550A, 0x550B, 0x550C, 0x550D,\n    0x550E, 0x5512, 0x5513, 0x5515, 0x5516, 0x5517, 0x5518, 0x5519,\n    0x551A, 0x551C, 0x551D, 0x551E, 0x551F, 0x5521, 0x5525, 0x5526,\n    0x5528, 0x5529, 0x552B, 0x552D, 0x5532, 0x5534, 0x5535, 0x5536,\n    0x5538, 0x5539, 0x553A, 0x553B, 0x553D, 0x5540, 0x5542, 0x5545,\n    0x5547, 0x5548, 0x554B, 0x554C, 0x554D, 0x554E, 0x5551, 0x5552,\n    0x5554, 0x5557, 0x5558, 0x5559, 0x555A, 0x555B, 0x555D, 0x555F,\n    0x5560, 0x5562, 0x5563, 0x5568, 0x5569, 0x556B, 0x556F, 0x5570,\n    0x5571, 0x5572, 0x5573, 0x5574, 0x5579, 0x557A, 0x557D, 0x557F,\n    0x5585, 0x5586, 0x558C, 0x558D, 0x558E, 0x5590, 0x5592, 0x5593,\n    0x5595, 0x5596, 0x5597, 0x559A, 0x559B, 0x559E, 0x55A0, 0x55A1,\n    0x55A2, 0x55A3, 0x55A4, 0x55A5, 0x55A6, 0x55A8, 0x55A9, 0x55AB,\n    0x55AD, 0x55AF, 0x55B0, 0x55B4, 0x55B6, 0x55B8, 0x55BA, 0x55BC,\n    0x55BF, 0x55C0, 0x55C1, 0x55C2, 0x55C3, 0x55C8, 0x55CA, 0x55CB,\n    0x55CF, 0x55D0, 0x55D5, 0x55D7, 0x55D8, 0x55D9, 0x55DB, 0x55DE,\n    0x55E0, 0x55E2, 0x55E7, 0x55ED, 0x55EE, 0x55F0, 0x55F1, 0x55F4,\n    0x55F8, 0x55F9, 0x55FA, 0x55FB, 0x55FC, 0x55FF, 0x5602, 0x5603,\n    0x5604, 0x5605, 0x5607, 0x560A, 0x560B, 0x5610, 0x5611, 0x5612,\n    0x5613, 0x5615, 0x5619, 0x561A, 0x561D, 0x5620, 0x5621, 0x5622,\n    0x5625, 0x5626, 0x5628, 0x562A, 0x562B, 0x5633, 0x5637, 0x563A,\n    0x563C, 0x563D, 0x563E, 0x5640, 0x5642, 0x5643, 0x5644, 0x5645,\n    0x5646, 0x5647, 0x5648, 0x5649, 0x564A, 0x564B, 0x564F, 0x5650,\n    0x5651, 0x5652, 0x5653, 0x5655, 0x5656, 0x565A, 0x565B, 0x565E,\n    0x565F, 0x5661, 0x5663, 0x5667, 0x566D, 0x566E, 0x5670, 0x5673,\n    0x5675, 0x5677, 0x567A, 0x567D, 0x567E, 0x567F, 0x5681, 0x5682,\n    0x5683, 0x5684, 0x5688, 0x5689, 0x568A, 0x568B, 0x568D, 0x5690,\n    0x5691, 0x5692, 0x5694, 0x5696, 0x5697, 0x5698, 0x569A, 0x569B,\n    0x569C, 0x569D, 0x569E, 0x569F, 0x56A0, 0x56A1, 0x56A2, 0x56A4,\n    0x56A5, 0x56A7, 0x56A9, 0x56AA, 0x56AB, 0x56AC, 0x56AD, 0x56B0,\n    0x56B1, 0x56B2, 0x56B5, 0x56B8, 0x56B9, 0x56BA, 0x56BB, 0x56BD,\n    0x56BE, 0x56BF, 0x56C3, 0x56C4, 0x56C6, 0x56C7, 0x56CB, 0x56CD,\n    0x56CE, 0x56CF, 0x56D0, 0x56D2, 0x56D3, 0x56D5, 0x56D6, 0x56D8,\n    0x56D9, 0x56DC, 0x56E3, 0x56E5, 0x56E6, 0x56E7, 0x56E8, 0x56E9,\n    0x56EA, 0x56EC, 0x56EE, 0x56EF, 0x56F2, 0x56F3, 0x56F6, 0x56F7,\n    0x56F8, 0x56FB, 0x56FC, 0x5700, 0x5701, 0x5702, 0x5705, 0x570C,\n    0x570E, 0x570F, 0x5710, 0x5711, 0x5714, 0x5715, 0x5717, 0x5719,\n    0x571A, 0x571B, 0x571D, 0x571E, 0x5720, 0x5721, 0x5722, 0x5724,\n    0x5725, 0x5726, 0x5727, 0x572B, 0x5731, 0x5732, 0x5734, 0x5735,\n    0x5736, 0x5737, 0x5738, 0x573C, 0x573D, 0x573F, 0x5741, 0x5743,\n    0x5744, 0x5745, 0x5746, 0x5748, 0x5749, 0x574B, 0x5752, 0x5753,\n    0x5754, 0x5755, 0x5756, 0x5758, 0x5759, 0x5762, 0x5763, 0x5765,\n    0x5767, 0x576C, 0x576E, 0x5770, 0x5771, 0x5772, 0x5774, 0x5775,\n    0x5778, 0x5779, 0x577A, 0x577D, 0x577E, 0x577F, 0x5780, 0x5781,\n    0x5787, 0x5788, 0x5789, 0x578A, 0x578D, 0x578E, 0x578F, 0x5790,\n    0x5791, 0x5794, 0x5795, 0x5796, 0x5797, 0x5798, 0x5799, 0x579A,\n    0x579C, 0x579D, 0x579E, 0x579F, 0x57A5, 0x57A8, 0x57AA, 0x57AC,\n    0x57AF, 0x57B0, 0x57B1, 0x57B3, 0x57B5, 0x57B6, 0x57B7, 0x57B9,\n    0x57BA, 0x57BB, 0x57BC, 0x57BD, 0x57BE, 0x57BF, 0x57C0, 0x57C1,\n    0x57C4, 0x57C5, 0x57C6, 0x57C7, 0x57C8, 0x57C9, 0x57CA, 0x57CC,\n    0x57CD, 0x57D0, 0x57D1, 0x57D3, 0x57D6, 0x57D7, 0x57DB, 0x57DC,\n    0x57DE, 0x57E2, 0x57E3, 0x57E5, 0x57E6, 0x57E7, 0x57E8, 0x57E9,\n    0x57EA, 0x57EB, 0x57EC, 0x57EE, 0x57F0, 0x57F1, 0x57F2, 0x57F3,\n    0x57F5, 0x57F6, 0x57FB, 0x57FC, 0x57FE, 0x57FF, 0x5801, 0x5803,\n    0x5804, 0x5808, 0x5809, 0x580C, 0x580E, 0x580F, 0x5810, 0x5812,\n    0x5813, 0x5814, 0x5817, 0x5818, 0x581A, 0x581B, 0x581C, 0x581F,\n    0x5822, 0x5823, 0x5825, 0x5826, 0x5827, 0x5828, 0x5829, 0x582B,\n    0x582C, 0x582D, 0x582E, 0x5832, 0x5833, 0x5836, 0x5837, 0x5838,\n    0x5839, 0x583A, 0x583B, 0x583C, 0x583D, 0x583E, 0x583F, 0x5840,\n    0x5841, 0x5842, 0x5843, 0x5845, 0x5846, 0x5847, 0x5848, 0x5849,\n    0x584E, 0x5850, 0x5853, 0x5855, 0x5856, 0x5859, 0x585A, 0x585B,\n    0x585C, 0x585D, 0x585F, 0x5860, 0x5861, 0x5863, 0x5866, 0x5867,\n    0x5868, 0x5869, 0x586A, 0x586D, 0x586E, 0x586F, 0x5870, 0x5871,\n    0x5872, 0x5873, 0x5874, 0x5876, 0x5877, 0x5878, 0x587A, 0x587B,\n    0x587C, 0x587D, 0x587F, 0x5882, 0x5884, 0x5886, 0x5887, 0x5888,\n    0x588B, 0x588C, 0x588D, 0x588E, 0x588F, 0x5890, 0x5891, 0x5894,\n    0x5895, 0x5896, 0x5897, 0x5898, 0x589B, 0x589D, 0x58A0, 0x58A1,\n    0x58A2, 0x58A3, 0x58A4, 0x58A5, 0x58A6, 0x58A7, 0x58AA, 0x58AB,\n    0x58AC, 0x58AD, 0x58AF, 0x58B0, 0x58B1, 0x58B2, 0x58B4, 0x58B5,\n    0x58B6, 0x58B7, 0x58B8, 0x58B9, 0x58BA, 0x58BD, 0x58BF, 0x58C0,\n    0x58C2, 0x58C3, 0x58C4, 0x58C6, 0x58C8, 0x58C9, 0x58CA, 0x58CB,\n    0x58CC, 0x58CD, 0x58CE, 0x58CF, 0x58D0, 0x58D2, 0x58D4, 0x58D6,\n    0x58D7, 0x58DB, 0x58DC, 0x58DD, 0x58E1, 0x58E3, 0x58E5, 0x58E6,\n    0x58E7, 0x58E8, 0x58EA, 0x58ED, 0x58F1, 0x58F2, 0x58F4, 0x58F5,\n    0x58F7, 0x58F8, 0x58FB, 0x58FC, 0x58FE, 0x58FF, 0x5900, 0x5901,\n    0x5903, 0x5905, 0x5906, 0x5908, 0x5909, 0x590A, 0x590B, 0x590C,\n    0x590E, 0x5910, 0x5911, 0x5912, 0x5913, 0x5917, 0x5918, 0x591B,\n    0x591D, 0x591E, 0x5920, 0x5921, 0x5923, 0x5926, 0x5928, 0x592C,\n    0x5930, 0x5932, 0x5933, 0x5935, 0x5936, 0x593B, 0x593D, 0x593F,\n    0x5940, 0x5943, 0x5945, 0x5946, 0x594A, 0x594C, 0x594D, 0x5950,\n    0x5952, 0x5953, 0x5959, 0x595B, 0x595C, 0x595D, 0x595E, 0x595F,\n    0x5961, 0x5963, 0x5964, 0x5966, 0x5967, 0x5968, 0x596B, 0x596D,\n    0x596F, 0x5970, 0x5971, 0x5972, 0x5975, 0x5977, 0x597A, 0x597B,\n    0x597C, 0x597E, 0x597F, 0x5980, 0x5985, 0x5989, 0x598B, 0x598C,\n    0x598E, 0x598F, 0x5990, 0x5991, 0x5994, 0x5995, 0x5998, 0x599A,\n    0x599B, 0x599C, 0x599F, 0x59A0, 0x59A1, 0x59A2, 0x59A6, 0x59A7,\n    0x59AC, 0x59AD, 0x59B0, 0x59B1, 0x59B3, 0x59B4, 0x59B5, 0x59B6,\n    0x59B7, 0x59B8, 0x59BA, 0x59BC, 0x59BD, 0x59BF, 0x59C0, 0x59C1,\n    0x59C2, 0x59C3, 0x59C4, 0x59C5, 0x59C7, 0x59C8, 0x59C9, 0x59CC,\n    0x59CD, 0x59CE, 0x59CF, 0x59D5, 0x59D6, 0x59D9, 0x59DB, 0x59DE,\n    0x59DF, 0x59E0, 0x59E1, 0x59E2, 0x59E4, 0x59E6, 0x59E7, 0x59E9,\n    0x59EA, 0x59EB, 0x59ED, 0x59EE, 0x59EF, 0x59F0, 0x59F1, 0x59F2,\n    0x59F3, 0x59F4, 0x59F5, 0x59F6, 0x59F7, 0x59F8, 0x59FA, 0x59FC,\n    0x59FD, 0x59FE, 0x5A00, 0x5A02, 0x5A0A, 0x5A0B, 0x5A0D, 0x5A0E,\n    0x5A0F, 0x5A10, 0x5A12, 0x5A14, 0x5A15, 0x5A16, 0x5A17, 0x5A19,\n    0x5A1A, 0x5A1B, 0x5A1D, 0x5A1E, 0x5A21, 0x5A22, 0x5A24, 0x5A26,\n    0x5A27, 0x5A28, 0x5A2A, 0x5A2B, 0x5A2C, 0x5A2D, 0x5A2E, 0x5A2F,\n    0x5A30, 0x5A33, 0x5A35, 0x5A37, 0x5A38, 0x5A39, 0x5A3A, 0x5A3B,\n    0x5A3D, 0x5A3E, 0x5A3F, 0x5A42, 0x5A43, 0x5A44, 0x5A45, 0x5A47,\n    0x5A48, 0x5A4B, 0x5A4C, 0x5A4D, 0x5A4E, 0x5A4F, 0x5A50, 0x5A51,\n    0x5A52, 0x5A53, 0x5A54, 0x5A56, 0x5A57, 0x5A58, 0x5A59, 0x5A5B,\n    0x5A5C, 0x5A5D, 0x5A5E, 0x5A5F, 0x5A60, 0x5A61, 0x5A63, 0x5A64,\n    0x5A65, 0x5A68, 0x5A69, 0x5A6B, 0x5A6C, 0x5A6E, 0x5A6F, 0x5A70,\n    0x5A71, 0x5A72, 0x5A73, 0x5A78, 0x5A79, 0x5A7B, 0x5A7C, 0x5A7D,\n    0x5A7E, 0x5A80, 0x5A81, 0x5A82, 0x5A83, 0x5A84, 0x5A85, 0x5A86,\n    0x5A87, 0x5A88, 0x5A89, 0x5A8A, 0x5A8B, 0x5A8C, 0x5A8D, 0x5A8E,\n    0x5A8F, 0x5A90, 0x5A91, 0x5A93, 0x5A94, 0x5A95, 0x5A96, 0x5A97,\n    0x5A98, 0x5A99, 0x5A9C, 0x5A9D, 0x5A9E, 0x5A9F, 0x5AA0, 0x5AA1,\n    0x5AA2, 0x5AA3, 0x5AA4, 0x5AA5, 0x5AA6, 0x5AA8, 0x5AA9, 0x5AAB,\n    0x5AAC, 0x5AAD, 0x5AAE, 0x5AAF, 0x5AB0, 0x5AB1, 0x5AB4, 0x5AB6,\n    0x5AB7, 0x5AB9, 0x5ABA, 0x5ABB, 0x5ABC, 0x5ABF, 0x5AC0, 0x5AC3,\n    0x5AC4, 0x5AC5, 0x5AC6, 0x5AC7, 0x5AC8, 0x5ACA, 0x5ACB, 0x5ACD,\n    0x5ACE, 0x5ACF, 0x5AD0, 0x5AD1, 0x5AD3, 0x5AD5, 0x5AD9, 0x5ADA,\n    0x5ADB, 0x5ADD, 0x5ADE, 0x5ADF, 0x5AE2, 0x5AE4, 0x5AE5, 0x5AE7,\n    0x5AE8, 0x5AEA, 0x5AEC, 0x5AED, 0x5AEE, 0x5AEF, 0x5AF0, 0x5AF2,\n    0x5AF3, 0x5AF4, 0x5AF6, 0x5AF7, 0x5AF8, 0x5AF9, 0x5AFA, 0x5AFC,\n    0x5AFD, 0x5AFE, 0x5AFF, 0x5B01, 0x5B02, 0x5B03, 0x5B04, 0x5B05,\n    0x5B06, 0x5B07, 0x5B0A, 0x5B0D, 0x5B0E, 0x5B0F, 0x5B10, 0x5B11,\n    0x5B12, 0x5B13, 0x5B14, 0x5B15, 0x5B18, 0x5B1A, 0x5B1B, 0x5B1C,\n    0x5B1D, 0x5B1E, 0x5B1F, 0x5B20, 0x5B22, 0x5B23, 0x5B24, 0x5B25,\n    0x5B26, 0x5B27, 0x5B28, 0x5B29, 0x5B2B, 0x5B2C, 0x5B2D, 0x5B2E,\n    0x5B2F, 0x5B31, 0x5B33, 0x5B35, 0x5B36, 0x5B39, 0x5B3A, 0x5B3B,\n    0x5B3C, 0x5B3D, 0x5B3E, 0x5B3F, 0x5B41, 0x5B42, 0x5B43, 0x5B44,\n    0x5B45, 0x5B46, 0x5B47, 0x5B48, 0x5B49, 0x5B4A, 0x5B4B, 0x5B4D,\n    0x5B4E, 0x5B4F, 0x5B52, 0x5B56, 0x5B5E, 0x5B60, 0x5B61, 0x5B67,\n    0x5B68, 0x5B6D, 0x5B6E, 0x5B6F, 0x5B72, 0x5B74, 0x5B76, 0x5B77,\n    0x5B79, 0x5B7B, 0x5B7C, 0x5B7E, 0x5B82, 0x5B86, 0x5B8A, 0x5B8D,\n    0x5B8E, 0x5B90, 0x5B91, 0x5B92, 0x5B94, 0x5B96, 0x5B9F, 0x5BA7,\n    0x5BA8, 0x5BA9, 0x5BAC, 0x5BAD, 0x5BAE, 0x5BAF, 0x5BB1, 0x5BB2,\n    0x5BB7, 0x5BBA, 0x5BBB, 0x5BBC, 0x5BC0, 0x5BC1, 0x5BC3, 0x5BC8,\n    0x5BC9, 0x5BCA, 0x5BCB, 0x5BCD, 0x5BCE, 0x5BCF, 0x5BD1, 0x5BD4,\n    0x5BD5, 0x5BD6, 0x5BD7, 0x5BD8, 0x5BD9, 0x5BDA, 0x5BDB, 0x5BDC,\n    0x5BE0, 0x5BE3, 0x5BEA, 0x5BED, 0x5BEF, 0x5BF1, 0x5BF2, 0x5BF3,\n    0x5BF4, 0x5BF7, 0x5BFD, 0x5BFE, 0x5C00, 0x5C02, 0x5C03, 0x5C05,\n    0x5C0C, 0x5C10, 0x5C12, 0x5C13, 0x5C17, 0x5C19, 0x5C1B, 0x5C1E,\n    0x5C1F, 0x5C20, 0x5C21, 0x5C23, 0x5C26, 0x5C28, 0x5C29, 0x5C2A,\n    0x5C2B, 0x5C2D, 0x5C2E, 0x5C2F, 0x5C30, 0x5C32, 0x5C33, 0x5C35,\n    0x5C36, 0x5C43, 0x5C44, 0x5C46, 0x5C47, 0x5C4C, 0x5C4D, 0x5C52,\n    0x5C53, 0x5C54, 0x5C56, 0x5C57, 0x5C58, 0x5C5A, 0x5C5B, 0x5C5C,\n    0x5C5D, 0x5C5F, 0x5C67, 0x5C69, 0x5C6A, 0x5C6B, 0x5C6D, 0x5C70,\n    0x5C72, 0x5C73, 0x5C74, 0x5C75, 0x5C76, 0x5C77, 0x5C78, 0x5C7B,\n    0x5C7C, 0x5C7D, 0x5C7E, 0x5C80, 0x5C83, 0x5C84, 0x5C85, 0x5C86,\n    0x5C87, 0x5C89, 0x5C8A, 0x5C8B, 0x5C8E, 0x5C8F, 0x5C92, 0x5C93,\n    0x5C95, 0x5C9D, 0x5C9E, 0x5C9F, 0x5CA0, 0x5CA4, 0x5CA5, 0x5CA6,\n    0x5CA7, 0x5CA8, 0x5CAA, 0x5CAE, 0x5CAF, 0x5CB0, 0x5CB2, 0x5CB4,\n    0x5CB6, 0x5CB9, 0x5CBA, 0x5CBB, 0x5CBC, 0x5CBE, 0x5CC0, 0x5CC2,\n    0x5CC3, 0x5CC5, 0x5CC6, 0x5CC7, 0x5CC8, 0x5CC9, 0x5CCA, 0x5CCC,\n    0x5CCD, 0x5CCE, 0x5CCF, 0x5CD0, 0x5CD1, 0x5CD3, 0x5CD4, 0x5CD5,\n    0x5CD6, 0x5CD7, 0x5CD8, 0x5CDA, 0x5CDB, 0x5CDC, 0x5CDD, 0x5CDE,\n    0x5CDF, 0x5CE0, 0x5CE2, 0x5CE3, 0x5CE7, 0x5CE9, 0x5CEB, 0x5CEC,\n    0x5CEE, 0x5CEF, 0x5CF1, 0x5CF2, 0x5CF3, 0x5CF5, 0x5CF7, 0x5CF8,\n    0x5CF9, 0x5CFA, 0x5CFC, 0x5CFE, 0x5CFF, 0x5D00, 0x5D01, 0x5D04,\n    0x5D05, 0x5D08, 0x5D09, 0x5D0A, 0x5D0B, 0x5D0C, 0x5D0F, 0x5D10,\n    0x5D11, 0x5D12, 0x5D13, 0x5D15, 0x5D18, 0x5D19, 0x5D1A, 0x5D1C,\n    0x5D1D, 0x5D1F, 0x5D20, 0x5D21, 0x5D22, 0x5D23, 0x5D25, 0x5D28,\n    0x5D2A, 0x5D2B, 0x5D2F, 0x5D30, 0x5D31, 0x5D32, 0x5D33, 0x5D35,\n    0x5D36, 0x5D37, 0x5D38, 0x5D39, 0x5D3A, 0x5D3B, 0x5D3C, 0x5D3F,\n    0x5D40, 0x5D41, 0x5D42, 0x5D43, 0x5D44, 0x5D45, 0x5D46, 0x5D48,\n    0x5D49, 0x5D4D, 0x5D4E, 0x5D4F, 0x5D51, 0x5D52, 0x5D53, 0x5D54,\n    0x5D55, 0x5D56, 0x5D57, 0x5D59, 0x5D5A, 0x5D5C, 0x5D5E, 0x5D5F,\n    0x5D60, 0x5D61, 0x5D62, 0x5D63, 0x5D64, 0x5D65, 0x5D66, 0x5D67,\n    0x5D68, 0x5D6A, 0x5D6D, 0x5D6E, 0x5D70, 0x5D71, 0x5D72, 0x5D73,\n    0x5D75, 0x5D76, 0x5D77, 0x5D78, 0x5D79, 0x5D7A, 0x5D7B, 0x5D7C,\n    0x5D7D, 0x5D7E, 0x5D7F, 0x5D80, 0x5D83, 0x5D85, 0x5D86, 0x5D88,\n    0x5D89, 0x5D8A, 0x5D8B, 0x5D8C, 0x5D8D, 0x5D8E, 0x5D8F, 0x5D90,\n    0x5D91, 0x5D92, 0x5D93, 0x5D94, 0x5D95, 0x5D96, 0x5D98, 0x5D9A,\n    0x5D9B, 0x5D9C, 0x5D9E, 0x5D9F, 0x5DA1, 0x5DA2, 0x5DA3, 0x5DA4,\n    0x5DA5, 0x5DA6, 0x5DA8, 0x5DA9, 0x5DAA, 0x5DAB, 0x5DAC, 0x5DAD,\n    0x5DAE, 0x5DAF, 0x5DB0, 0x5DB1, 0x5DB2, 0x5DB3, 0x5DB4, 0x5DB5,\n    0x5DB6, 0x5DB9, 0x5DBB, 0x5DBD, 0x5DBE, 0x5DBF, 0x5DC0, 0x5DC1,\n    0x5DC2, 0x5DC3, 0x5DC4, 0x5DC6, 0x5DC7, 0x5DC8, 0x5DC9, 0x5DCA,\n    0x5DCC, 0x5DCE, 0x5DCF, 0x5DD0, 0x5DD1, 0x5DD3, 0x5DD5, 0x5DD6,\n    0x5DD7, 0x5DD8, 0x5DD9, 0x5DDA, 0x5DDC, 0x5DDF, 0x5DE0, 0x5DE3,\n    0x5DE4, 0x5DEA, 0x5DEC, 0x5DED, 0x5DF5, 0x5DF6, 0x5DF8, 0x5DF9,\n    0x5DFA, 0x5DFB, 0x5DFC, 0x5DFF, 0x5E00, 0x5E04, 0x5E07, 0x5E09,\n    0x5E0A, 0x5E0B, 0x5E0D, 0x5E0E, 0x5E12, 0x5E13, 0x5E17, 0x5E1E,\n    0x5E1F, 0x5E20, 0x5E21, 0x5E22, 0x5E23, 0x5E24, 0x5E28, 0x5E29,\n    0x5E2A, 0x5E2C, 0x5E2F, 0x5E30, 0x5E32, 0x5E34, 0x5E35, 0x5E39,\n    0x5E3A, 0x5E3E, 0x5E3F, 0x5E41, 0x5E46, 0x5E47, 0x5E48, 0x5E49,\n    0x5E4A, 0x5E4B, 0x5E4D, 0x5E4E, 0x5E4F, 0x5E50, 0x5E51, 0x5E52,\n    0x5E53, 0x5E56, 0x5E59, 0x5E5A, 0x5E5C, 0x5E5D, 0x5E60, 0x5E64,\n    0x5E65, 0x5E66, 0x5E67, 0x5E68, 0x5E69, 0x5E6A, 0x5E6D, 0x5E6E,\n    0x5E6F, 0x5E70, 0x5E71, 0x5E75, 0x5E77, 0x5E81, 0x5E82, 0x5E83,\n    0x5E85, 0x5E88, 0x5E89, 0x5E8C, 0x5E8D, 0x5E8E, 0x5E92, 0x5E98,\n    0x5E9B, 0x5E9D, 0x5EA1, 0x5EA2, 0x5EA3, 0x5EA4, 0x5EA8, 0x5EA9,\n    0x5EAA, 0x5EAC, 0x5EAE, 0x5EAF, 0x5EB0, 0x5EB1, 0x5EB2, 0x5EB4,\n    0x5EBA, 0x5EBB, 0x5EBC, 0x5EBD, 0x5EBF, 0x5EC0, 0x5EC1, 0x5EC2,\n    0x5EC3, 0x5EC4, 0x5EC5, 0x5EC6, 0x5EC7, 0x5EC8, 0x5ECB, 0x5ECC,\n    0x5ECD, 0x5ECE, 0x5ECF, 0x5ED0, 0x5ED4, 0x5ED5, 0x5ED7, 0x5ED8,\n    0x5ED9, 0x5EDA, 0x5EDC, 0x5EDD, 0x5EDE, 0x5EE4, 0x5EE5, 0x5EE6,\n    0x5EE7, 0x5EE9, 0x5EEB, 0x5EED, 0x5EEE, 0x5EEF, 0x5EF0, 0x5EF1,\n    0x5EF2, 0x5EF5, 0x5EF8, 0x5EF9, 0x5EFB, 0x5EFC, 0x5EFD, 0x5F05,\n    0x5F06, 0x5F07, 0x5F09, 0x5F0C, 0x5F0D, 0x5F0E, 0x5F10, 0x5F12,\n    0x5F14, 0x5F16, 0x5F19, 0x5F1A, 0x5F1C, 0x5F1D, 0x5F1E, 0x5F21,\n    0x5F22, 0x5F23, 0x5F24, 0x5F28, 0x5F2B, 0x5F2C, 0x5F2E, 0x5F30,\n    0x5F32, 0x5F34, 0x5F36, 0x5F37, 0x5F38, 0x5F3B, 0x5F3D, 0x5F3E,\n    0x5F3F, 0x5F41, 0x5F42, 0x5F43, 0x5F44, 0x5F45, 0x5F47, 0x5F49,\n    0x5F4A, 0x5F4B, 0x5F4D, 0x5F4F, 0x5F51, 0x5F54, 0x5F5A, 0x5F5B,\n    0x5F5C, 0x5F5E, 0x5F5F, 0x5F60, 0x5F63, 0x5F65, 0x5F67, 0x5F68,\n    0x5F6B, 0x5F6E, 0x5F6F, 0x5F72, 0x5F74, 0x5F75, 0x5F76, 0x5F78,\n    0x5F7A, 0x5F7D, 0x5F7E, 0x5F7F, 0x5F83, 0x5F86, 0x5F8D, 0x5F8E,\n    0x5F8F, 0x5F93, 0x5F94, 0x5F96, 0x5F9A, 0x5F9B, 0x5F9D, 0x5F9F,\n    0x5FA2, 0x5FA3, 0x5FA4, 0x5FA5, 0x5FA6, 0x5FA7, 0x5FAB, 0x5FAC,\n    0x5FAF, 0x5FB0, 0x5FB1, 0x5FB2, 0x5FB3, 0x5FB4, 0x5FB6, 0x5FB8,\n    0x5FBA, 0x5FBB, 0x5FBE, 0x5FBF, 0x5FC0, 0x5FC1, 0x5FC2, 0x5FC7,\n    0x5FC8, 0x5FCA, 0x5FCB, 0x5FCE, 0x5FD3, 0x5FD4, 0x5FD5, 0x5FDA,\n    0x5FDB, 0x5FDC, 0x5FDE, 0x5FDF, 0x5FE2, 0x5FE3, 0x5FE5, 0x5FE6,\n    0x5FE8, 0x5FE9, 0x5FEC, 0x5FEF, 0x5FF0, 0x5FF2, 0x5FF3, 0x5FF4,\n    0x5FF6, 0x5FF7, 0x5FF9, 0x5FFA, 0x5FFC, 0x6007, 0x6008, 0x6009,\n    0x600B, 0x600C, 0x6010, 0x6011, 0x6013, 0x6017, 0x6018, 0x601A,\n    0x601E, 0x601F, 0x6022, 0x6023, 0x6024, 0x602C, 0x602D, 0x602E,\n    0x6030, 0x6031, 0x6032, 0x6033, 0x6034, 0x6036, 0x6037, 0x6038,\n    0x6039, 0x603A, 0x603D, 0x603E, 0x6040, 0x6044, 0x6045, 0x6046,\n    0x6047, 0x6048, 0x6049, 0x604A, 0x604C, 0x604E, 0x604F, 0x6051,\n    0x6053, 0x6054, 0x6056, 0x6057, 0x6058, 0x605B, 0x605C, 0x605E,\n    0x605F, 0x6060, 0x6061, 0x6065, 0x6066, 0x606E, 0x6071, 0x6072,\n    0x6074, 0x6075, 0x6077, 0x607E, 0x6080, 0x6081, 0x6082, 0x6085,\n    0x6086, 0x6087, 0x6088, 0x608A, 0x608B, 0x608E, 0x608F, 0x6090,\n    0x6091, 0x6093, 0x6095, 0x6097, 0x6098, 0x6099, 0x609C, 0x609E,\n    0x60A1, 0x60A2, 0x60A4, 0x60A5, 0x60A7, 0x60A9, 0x60AA, 0x60AE,\n    0x60B0, 0x60B3, 0x60B7, 0x60B9, 0x60BA, 0x60BD, 0x60BE, 0x60BF,\n    0x60C0, 0x60C1, 0x60C2, 0x60C3, 0x60C4, 0x60C7, 0x60C8, 0x60C9,\n    0x60CC, 0x60CD, 0x60CE, 0x60CF, 0x60D0, 0x60D2, 0x60D3, 0x60D4,\n    0x60D6, 0x60D7, 0x60D9, 0x60DB, 0x60DE, 0x60E2, 0x60E3, 0x60E4,\n    0x60E5, 0x60EA, 0x60F5, 0x60F7, 0x60F8, 0x60FC, 0x60FD, 0x60FE,\n    0x60FF, 0x6102, 0x6103, 0x6104, 0x6105, 0x6107, 0x610A, 0x610B,\n    0x610C, 0x6110, 0x6111, 0x6112, 0x6113, 0x6114, 0x6116, 0x6117,\n    0x6118, 0x6119, 0x611D, 0x611E, 0x6121, 0x6122, 0x6125, 0x6128,\n    0x6129, 0x612A, 0x612C, 0x612D, 0x612E, 0x612F, 0x6130, 0x6131,\n    0x6132, 0x6133, 0x6135, 0x6136, 0x6138, 0x6139, 0x613A, 0x613B,\n    0x613C, 0x613D, 0x6140, 0x6141, 0x6142, 0x6143, 0x6144, 0x6145,\n    0x6146, 0x6147, 0x6149, 0x614D, 0x614F, 0x6150, 0x6152, 0x6153,\n    0x6154, 0x6156, 0x6157, 0x6159, 0x615B, 0x615C, 0x615E, 0x6160,\n    0x6161, 0x6165, 0x6166, 0x6169, 0x616C, 0x616D, 0x616F, 0x6171,\n    0x6172, 0x6174, 0x6178, 0x6179, 0x617A, 0x617B, 0x617C, 0x617D,\n    0x617E, 0x617F, 0x6180, 0x6181, 0x6183, 0x6184, 0x6185, 0x6186,\n    0x6187, 0x6188, 0x6189, 0x618C, 0x618D, 0x618F, 0x6193, 0x6195,\n    0x6196, 0x6197, 0x6198, 0x6199, 0x619B, 0x619C, 0x619E, 0x619F,\n    0x61A0, 0x61A1, 0x61A2, 0x61A3, 0x61A5, 0x61A6, 0x61AA, 0x61AD,\n    0x61AF, 0x61B0, 0x61B1, 0x61B3, 0x61B4, 0x61B5, 0x61B8, 0x61B9,\n    0x61BA, 0x61BB, 0x61BC, 0x61BD, 0x61BF, 0x61C0, 0x61C1, 0x61C3,\n    0x61C4, 0x61C5, 0x61C6, 0x61CD, 0x61CE, 0x61CF, 0x61D0, 0x61D3,\n    0x61D5, 0x61D6, 0x61D7, 0x61D8, 0x61D9, 0x61DA, 0x61DB, 0x61DC,\n    0x61DD, 0x61E0, 0x61E1, 0x61E2, 0x61E4, 0x61E5, 0x61E7, 0x61E9,\n    0x61EA, 0x61EB, 0x61EC, 0x61ED, 0x61EE, 0x61EF, 0x61F0, 0x61F1,\n    0x61F3, 0x61F4, 0x61F9, 0x61FB, 0x61FD, 0x6201, 0x6202, 0x6203,\n    0x6204, 0x6205, 0x6209, 0x6213, 0x6219, 0x621C, 0x621D, 0x621E,\n    0x6220, 0x6223, 0x6226, 0x6228, 0x6229, 0x622B, 0x622D, 0x622F,\n    0x6231, 0x6235, 0x6236, 0x6238, 0x6239, 0x623A, 0x623B, 0x623C,\n    0x6242, 0x6244, 0x6245, 0x6246, 0x624A, 0x624F, 0x6250, 0x6255,\n    0x6256, 0x6257, 0x6259, 0x625A, 0x625C, 0x625D, 0x625E, 0x625F,\n    0x6260, 0x6261, 0x6262, 0x6264, 0x6265, 0x6268, 0x6271, 0x6272,\n    0x6274, 0x6275, 0x6277, 0x6278, 0x627A, 0x627B, 0x627D, 0x6281,\n    0x6282, 0x6283, 0x6285, 0x6286, 0x6287, 0x6288, 0x628B, 0x628C,\n    0x628D, 0x628E, 0x628F, 0x6290, 0x6294, 0x6299, 0x629C, 0x629D,\n    0x629E, 0x62A3, 0x62A6, 0x62A7, 0x62A9, 0x62AA, 0x62AD, 0x62AE,\n    0x62AF, 0x62B0, 0x62B2, 0x62B3, 0x62B4, 0x62B6, 0x62B7, 0x62B8,\n    0x62BA, 0x62BE, 0x62C0, 0x62C1, 0x62C3, 0x62CB, 0x62CF, 0x62D1,\n    0x62D5, 0x62DD, 0x62DE, 0x62E0, 0x62E1, 0x62E4, 0x62EA, 0x62EB,\n    0x62F0, 0x62F2, 0x62F5, 0x62F8, 0x62F9, 0x62FA, 0x62FB, 0x6300,\n    0x6303, 0x6304, 0x6305, 0x6306, 0x630A, 0x630B, 0x630C, 0x630D,\n    0x630F, 0x6310, 0x6312, 0x6313, 0x6314, 0x6315, 0x6317, 0x6318,\n    0x6319, 0x631C, 0x6326, 0x6327, 0x6329, 0x632C, 0x632D, 0x632E,\n    0x6330, 0x6331, 0x6333, 0x6334, 0x6335, 0x6336, 0x6337, 0x6338,\n    0x633B, 0x633C, 0x633F, 0x6340, 0x6341, 0x6344, 0x6347, 0x6348,\n    0x634A, 0x6351, 0x6352, 0x6353, 0x6354, 0x6356, 0x6357, 0x6358,\n    0x6359, 0x635A, 0x635B, 0x635C, 0x635D, 0x6360, 0x6364, 0x6365,\n    0x6366, 0x636A, 0x636C, 0x636F, 0x6370, 0x6373, 0x6374, 0x6375,\n    0x6378, 0x6379, 0x637C, 0x637D, 0x637E, 0x637F, 0x6381, 0x6385,\n    0x6386, 0x638B, 0x638D, 0x6391, 0x6393, 0x6394, 0x6395, 0x6397,\n    0x6399, 0x639A, 0x639B, 0x639C, 0x639D, 0x639E, 0x639F, 0x63A1,\n    0x63A4, 0x63A6, 0x63AB, 0x63AF, 0x63B1, 0x63B2, 0x63B5, 0x63B6,\n    0x63B9, 0x63BB, 0x63BD, 0x63BF, 0x63C1, 0x63C2, 0x63C3, 0x63C5,\n    0x63C7, 0x63C8, 0x63CA, 0x63CB, 0x63CC, 0x63D1, 0x63D3, 0x63D4,\n    0x63D5, 0x63D7, 0x63D8, 0x63D9, 0x63DB, 0x63DC, 0x63DD, 0x63DF,\n    0x63E2, 0x63E4, 0x63E5, 0x63E6, 0x63E7, 0x63E8, 0x63EB, 0x63EC,\n    0x63EF, 0x63F0, 0x63F1, 0x63F3, 0x63F5, 0x63F7, 0x63F9, 0x63FA,\n    0x63FB, 0x63FC, 0x63FE, 0x6403, 0x6404, 0x6406, 0x6407, 0x6408,\n    0x6409, 0x640A, 0x640E, 0x6411, 0x6412, 0x6415, 0x6416, 0x6418,\n    0x6419, 0x641A, 0x641D, 0x641F, 0x6422, 0x6423, 0x6424, 0x6425,\n    0x6427, 0x6428, 0x6429, 0x642B, 0x642E, 0x642F, 0x6430, 0x6431,\n    0x6432, 0x6433, 0x6435, 0x6437, 0x6438, 0x6439, 0x643B, 0x643C,\n    0x643E, 0x6440, 0x6442, 0x6443, 0x6449, 0x644B, 0x644C, 0x644D,\n    0x644E, 0x644F, 0x6450, 0x6453, 0x6455, 0x6456, 0x6457, 0x6459,\n    0x645A, 0x645B, 0x645D, 0x6460, 0x6461, 0x6462, 0x6463, 0x6464,\n    0x6465, 0x6466, 0x6468, 0x646A, 0x646B, 0x646C, 0x646E, 0x6470,\n    0x6471, 0x6472, 0x6474, 0x6475, 0x6477, 0x647C, 0x647D, 0x647E,\n    0x647F, 0x6480, 0x6481, 0x6483, 0x6486, 0x6489, 0x648A, 0x648B,\n    0x648C, 0x648D, 0x648E, 0x648F, 0x6490, 0x6494, 0x6497, 0x6498,\n    0x649A, 0x649B, 0x649C, 0x649D, 0x64A0, 0x64A1, 0x64A2, 0x64A6,\n    0x64A7, 0x64A8, 0x64AA, 0x64AF, 0x64B1, 0x64B4, 0x64B6, 0x64B9,\n    0x64BD, 0x64C3, 0x64C6, 0x64C8, 0x64C9, 0x64CC, 0x64CF, 0x64D1,\n    0x64D3, 0x64D5, 0x64D6, 0x64D9, 0x64DB, 0x64DC, 0x64DD, 0x64DF,\n    0x64E1, 0x64E3, 0x64E5, 0x64E7, 0x64E8, 0x64E9, 0x64EA, 0x64EB,\n    0x64ED, 0x64EE, 0x64F3, 0x64F5, 0x64F6, 0x64F8, 0x64F9, 0x64FD,\n    0x64FF, 0x6501, 0x6502, 0x6503, 0x6505, 0x6507, 0x6508, 0x650A,\n    0x650B, 0x650C, 0x650D, 0x650E, 0x6510, 0x6511, 0x6513, 0x6515,\n    0x6517, 0x651A, 0x651C, 0x651E, 0x651F, 0x6520, 0x6521, 0x6526,\n    0x6527, 0x6528, 0x6529, 0x652D, 0x6530, 0x6531, 0x6532, 0x6533,\n    0x6537, 0x653A, 0x653C, 0x653D, 0x6540, 0x6541, 0x6542, 0x6543,\n    0x6544, 0x6546, 0x6547, 0x654A, 0x654B, 0x654D, 0x654E, 0x6550,\n    0x6552, 0x6553, 0x6554, 0x6558, 0x655A, 0x655C, 0x655F, 0x6560,\n    0x6561, 0x6564, 0x6565, 0x6567, 0x6568, 0x6569, 0x656A, 0x656D,\n    0x656E, 0x656F, 0x6571, 0x6573, 0x6576, 0x6579, 0x657A, 0x657B,\n    0x657C, 0x657D, 0x657E, 0x657F, 0x6580, 0x6581, 0x6584, 0x6585,\n    0x6586, 0x6588, 0x6589, 0x658A, 0x658D, 0x658E, 0x658F, 0x6592,\n    0x6594, 0x6596, 0x6598, 0x659A, 0x659D, 0x659E, 0x65A0, 0x65A2,\n    0x65A3, 0x65A6, 0x65A8, 0x65AA, 0x65AE, 0x65B1, 0x65B2, 0x65B3,\n    0x65B4, 0x65B5, 0x65B6, 0x65B8, 0x65BA, 0x65BB, 0x65BE, 0x65BF,\n    0x65C0, 0x65C2, 0x65C7, 0x65C8, 0x65C9, 0x65CA, 0x65CD, 0x65D0,\n    0x65D1, 0x65D3, 0x65D4, 0x65D5, 0x65D8, 0x65D9, 0x65DA, 0x65DB,\n    0x65DC, 0x65DD, 0x65DE, 0x65DF, 0x65E1, 0x65E3, 0x65E4, 0x65EA,\n    0x65EB, 0x65F2, 0x65F3, 0x65F4, 0x65F5, 0x65F8, 0x65F9, 0x65FB,\n    0x65FC, 0x65FD, 0x65FE, 0x65FF, 0x6601, 0x6604, 0x6605, 0x6607,\n    0x6608, 0x6609, 0x660B, 0x660D, 0x6610, 0x6611, 0x6612, 0x6616,\n    0x6617, 0x6618, 0x661A, 0x661B, 0x661C, 0x661E, 0x6621, 0x6622,\n    0x6623, 0x6624, 0x6626, 0x6629, 0x662A, 0x662B, 0x662C, 0x662E,\n    0x6630, 0x6632, 0x6633, 0x6637, 0x6638, 0x6639, 0x663A, 0x663B,\n    0x663D, 0x663F, 0x6640, 0x6644, 0x6645, 0x6646, 0x6647, 0x6648,\n    0x6649, 0x664A, 0x664D, 0x664E, 0x6650, 0x6651, 0x6658, 0x6659,\n    0x665B, 0x665C, 0x665E, 0x6660, 0x6662, 0x6663, 0x6665, 0x6667,\n    0x6669, 0x666A, 0x666B, 0x666C, 0x666D, 0x6671, 0x6672, 0x6673,\n    0x6675, 0x6678, 0x6679, 0x667B, 0x667C, 0x667D, 0x667F, 0x6680,\n    0x6681, 0x6683, 0x6685, 0x6686, 0x668A, 0x668B, 0x668D, 0x668E,\n    0x668F, 0x6690, 0x6692, 0x6693, 0x6694, 0x6695, 0x6698, 0x6699,\n    0x669A, 0x669B, 0x669C, 0x669E, 0x669F, 0x66A0, 0x66A1, 0x66A3,\n    0x66A4, 0x66A5, 0x66A6, 0x66A9, 0x66AA, 0x66AC, 0x66AD, 0x66AF,\n    0x66B0, 0x66B1, 0x66B2, 0x66B3, 0x66B5, 0x66B6, 0x66B7, 0x66B8,\n    0x66BA, 0x66BB, 0x66BC, 0x66BD, 0x66BF, 0x66C0, 0x66C1, 0x66C2,\n    0x66C3, 0x66C5, 0x66C8, 0x66CA, 0x66CB, 0x66CC, 0x66CD, 0x66CE,\n    0x66CF, 0x66D0, 0x66D1, 0x66D2, 0x66D3, 0x66D4, 0x66D5, 0x66D7,\n    0x66D8, 0x66DA, 0x66DE, 0x66DF, 0x66E1, 0x66E2, 0x66E3, 0x66E4,\n    0x66E5, 0x66E7, 0x66E8, 0x66EA, 0x66EB, 0x66ED, 0x66EE, 0x66EF,\n    0x66F1, 0x66F5, 0x66F6, 0x66FA, 0x66FB, 0x66FD, 0x6701, 0x6702,\n    0x6704, 0x6705, 0x6706, 0x6707, 0x670C, 0x670E, 0x670F, 0x6711,\n    0x6712, 0x6713, 0x6716, 0x6718, 0x6719, 0x671A, 0x671C, 0x671E,\n    0x6720, 0x6721, 0x6722, 0x6723, 0x6724, 0x6725, 0x6729, 0x672E,\n    0x6730, 0x6732, 0x6733, 0x6736, 0x6737, 0x6738, 0x6739, 0x673B,\n    0x673C, 0x673E, 0x673F, 0x6741, 0x6744, 0x6745, 0x6747, 0x674A,\n    0x674B, 0x674D, 0x6752, 0x6754, 0x6755, 0x6757, 0x6758, 0x6759,\n    0x675A, 0x675B, 0x675D, 0x6762, 0x6763, 0x6764, 0x6766, 0x6767,\n    0x676B, 0x676C, 0x676E, 0x6774, 0x6776, 0x6778, 0x6779, 0x677A,\n    0x677B, 0x677D, 0x6780, 0x6782, 0x6783, 0x6785, 0x6786, 0x6788,\n    0x678A, 0x678C, 0x678D, 0x678E, 0x678F, 0x6791, 0x6792, 0x6793,\n    0x6794, 0x6796, 0x6799, 0x679B, 0x679F, 0x67A0, 0x67A1, 0x67A4,\n    0x67A6, 0x67A9, 0x67AC, 0x67AE, 0x67B1, 0x67B2, 0x67B4, 0x67B9,\n    0x67BA, 0x67BB, 0x67BC, 0x67BD, 0x67BE, 0x67BF, 0x67C0, 0x67C2,\n    0x67C5, 0x67C6, 0x67C7, 0x67C8, 0x67C9, 0x67CA, 0x67CB, 0x67CC,\n    0x67CD, 0x67CE, 0x67D5, 0x67D6, 0x67D7, 0x67DB, 0x67DF, 0x67E1,\n    0x67E3, 0x67E4, 0x67E6, 0x67E7, 0x67E8, 0x67EA, 0x67EB, 0x67ED,\n    0x67EE, 0x67F2, 0x67F5, 0x67F6, 0x67F7, 0x67F8, 0x67F9, 0x67FA,\n    0x67FB, 0x67FC, 0x67FE, 0x6801, 0x6802, 0x6803, 0x6804, 0x6806,\n    0x680D, 0x6810, 0x6812, 0x6814, 0x6815, 0x6818, 0x6819, 0x681A,\n    0x681B, 0x681C, 0x681E, 0x681F, 0x6820, 0x6822, 0x6823, 0x6824,\n    0x6825, 0x6826, 0x6827, 0x6828, 0x682B, 0x682C, 0x682D, 0x682E,\n    0x682F, 0x6830, 0x6831, 0x6834, 0x6835, 0x6836, 0x683A, 0x683B,\n    0x683F, 0x6847, 0x684B, 0x684D, 0x684F, 0x6852, 0x6856, 0x6857,\n    0x6858, 0x6859, 0x685A, 0x685B, 0x685C, 0x685D, 0x685E, 0x685F,\n    0x686A, 0x686C, 0x686D, 0x686E, 0x686F, 0x6870, 0x6871, 0x6872,\n    0x6873, 0x6875, 0x6878, 0x6879, 0x687A, 0x687B, 0x687C, 0x687D,\n    0x687E, 0x687F, 0x6880, 0x6882, 0x6884, 0x6887, 0x6888, 0x6889,\n    0x688A, 0x688B, 0x688C, 0x688D, 0x688E, 0x6890, 0x6891, 0x6892,\n    0x6894, 0x6895, 0x6896, 0x6899, 0x689A, 0x689B, 0x689C, 0x689E,\n    0x68A0, 0x68A1, 0x68A3, 0x68A4, 0x68A5, 0x68A9, 0x68AA, 0x68AB,\n    0x68AC, 0x68AE, 0x68B1, 0x68B2, 0x68B4, 0x68B6, 0x68B7, 0x68B8,\n    0x68B9, 0x68BA, 0x68BB, 0x68BC, 0x68BD, 0x68BE, 0x68BF, 0x68C1,\n    0x68C3, 0x68C4, 0x68C5, 0x68C6, 0x68C7, 0x68C8, 0x68CA, 0x68CC,\n    0x68CE, 0x68CF, 0x68D0, 0x68D1, 0x68D3, 0x68D4, 0x68D9, 0x68DB,\n    0x68DC, 0x68DD, 0x68DE, 0x68E1, 0x68E2, 0x68E4, 0x68E5, 0x68E6,\n    0x68E8, 0x68E9, 0x68EA, 0x68EB, 0x68EC, 0x68ED, 0x68EF, 0x68F2,\n    0x68F3, 0x68F4, 0x68F6, 0x68F7, 0x68F8, 0x68FB, 0x68FD, 0x68FE,\n    0x68FF, 0x6900, 0x6902, 0x6903, 0x6904, 0x6906, 0x6907, 0x6908,\n    0x6909, 0x690A, 0x690C, 0x6911, 0x6913, 0x6914, 0x6915, 0x6916,\n    0x6917, 0x6918, 0x6919, 0x691A, 0x691B, 0x691C, 0x691D, 0x691E,\n    0x6921, 0x6922, 0x6923, 0x6925, 0x6926, 0x6927, 0x6928, 0x6929,\n    0x692A, 0x692B, 0x692C, 0x692E, 0x692F, 0x6931, 0x6932, 0x6933,\n    0x6935, 0x6936, 0x6937, 0x6938, 0x693A, 0x693B, 0x693C, 0x693E,\n    0x6940, 0x6941, 0x6943, 0x6944, 0x6945, 0x6946, 0x6947, 0x6948,\n    0x6949, 0x694B, 0x694C, 0x694D, 0x694E, 0x694F, 0x6950, 0x6951,\n    0x6952, 0x6955, 0x6956, 0x6958, 0x6959, 0x695B, 0x695C, 0x695F,\n    0x6961, 0x6962, 0x6964, 0x6965, 0x6967, 0x6969, 0x696A, 0x696C,\n    0x696F, 0x6970, 0x6972, 0x6973, 0x6974, 0x6976, 0x697A, 0x697B,\n    0x697D, 0x697E, 0x697F, 0x6981, 0x6983, 0x6985, 0x698A, 0x698B,\n    0x698C, 0x698E, 0x698F, 0x6990, 0x6991, 0x6992, 0x6993, 0x6996,\n    0x6997, 0x6999, 0x699A, 0x699D, 0x699E, 0x699F, 0x69A0, 0x69A1,\n    0x69A2, 0x69A3, 0x69A4, 0x69A5, 0x69A6, 0x69A9, 0x69AC, 0x69AF,\n    0x69B0, 0x69B2, 0x69B3, 0x69B5, 0x69B6, 0x69B8, 0x69B9, 0x69BA,\n    0x69BC, 0x69BD, 0x69BE, 0x69C0, 0x69C2, 0x69C3, 0x69C4, 0x69C5,\n    0x69C6, 0x69C7, 0x69C8, 0x69C9, 0x69CF, 0x69D1, 0x69D2, 0x69D3,\n    0x69D5, 0x69D6, 0x69D7, 0x69D8, 0x69D9, 0x69DA, 0x69DC, 0x69DD,\n    0x69DE, 0x69E1, 0x69E2, 0x69E3, 0x69E4, 0x69E5, 0x69E6, 0x69E8,\n    0x69E9, 0x69EA, 0x69EB, 0x69EC, 0x69EE, 0x69EF, 0x69F0, 0x69F1,\n    0x69F4, 0x69F5, 0x69F6, 0x69F7, 0x69F8, 0x69F9, 0x69FA, 0x69FB,\n    0x69FC, 0x69FE, 0x6A00, 0x6A03, 0x6A04, 0x6A06, 0x6A07, 0x6A08,\n    0x6A09, 0x6A0B, 0x6A0C, 0x6A0D, 0x6A0E, 0x6A0F, 0x6A10, 0x6A11,\n    0x6A12, 0x6A14, 0x6A15, 0x6A16, 0x6A1A, 0x6A1B, 0x6A1C, 0x6A1D,\n    0x6A20, 0x6A22, 0x6A24, 0x6A25, 0x6A26, 0x6A27, 0x6A29, 0x6A2B,\n    0x6A2C, 0x6A2D, 0x6A2E, 0x6A30, 0x6A32, 0x6A33, 0x6A34, 0x6A36,\n    0x6A37, 0x6A3B, 0x6A3C, 0x6A3F, 0x6A40, 0x6A41, 0x6A42, 0x6A43,\n    0x6A45, 0x6A46, 0x6A49, 0x6A4A, 0x6A4C, 0x6A4D, 0x6A4E, 0x6A4F,\n    0x6A51, 0x6A52, 0x6A53, 0x6A54, 0x6A55, 0x6A56, 0x6A57, 0x6A5A,\n    0x6A5C, 0x6A5D, 0x6A5E, 0x6A60, 0x6A63, 0x6A64, 0x6A66, 0x6A67,\n    0x6A68, 0x6A69, 0x6A6A, 0x6A6B, 0x6A6C, 0x6A6D, 0x6A6E, 0x6A6F,\n    0x6A70, 0x6A72, 0x6A73, 0x6A74, 0x6A75, 0x6A76, 0x6A77, 0x6A78,\n    0x6A7A, 0x6A7B, 0x6A7D, 0x6A7E, 0x6A7F, 0x6A81, 0x6A82, 0x6A83,\n    0x6A85, 0x6A86, 0x6A87, 0x6A88, 0x6A8A, 0x6A8B, 0x6A8C, 0x6A8D,\n    0x6A8F, 0x6A92, 0x6A93, 0x6A95, 0x6A96, 0x6A98, 0x6A99, 0x6A9A,\n    0x6A9B, 0x6A9D, 0x6A9E, 0x6A9F, 0x6AA1, 0x6AA4, 0x6AA5, 0x6AA6,\n    0x6AA7, 0x6AA8, 0x6AAA, 0x6AAD, 0x6AAE, 0x6AB0, 0x6AB1, 0x6AB2,\n    0x6AB4, 0x6AB5, 0x6AB6, 0x6AB7, 0x6AB9, 0x6ABA, 0x6ABC, 0x6ABD,\n    0x6ABE, 0x6ABF, 0x6AC0, 0x6AC1, 0x6AC2, 0x6AC4, 0x6AC5, 0x6AC6,\n    0x6AC7, 0x6AC8, 0x6AC9, 0x6ACA, 0x6ACB, 0x6ACC, 0x6ACD, 0x6ACE,\n    0x6ACF, 0x6AD0, 0x6AD1, 0x6AD2, 0x6AD4, 0x6AD5, 0x6AD6, 0x6AD7,\n    0x6AD8, 0x6AD9, 0x6ADC, 0x6AE0, 0x6AE1, 0x6AE2, 0x6AE3, 0x6AE4,\n    0x6AE5, 0x6AE6, 0x6AE9, 0x6AEB, 0x6AED, 0x6AEE, 0x6AEF, 0x6AF0,\n    0x6AF1, 0x6AF2, 0x6AF4, 0x6AF5, 0x6AF6, 0x6AF7, 0x6AF9, 0x6AFA,\n    0x6AFC, 0x6AFD, 0x6AFE, 0x6AFF, 0x6B00, 0x6B01, 0x6B02, 0x6B03,\n    0x6B05, 0x6B06, 0x6B07, 0x6B08, 0x6B09, 0x6B0B, 0x6B0C, 0x6B0D,\n    0x6B0E, 0x6B10, 0x6B11, 0x6B13, 0x6B14, 0x6B15, 0x6B17, 0x6B18,\n    0x6B19, 0x6B1A, 0x6B1B, 0x6B1C, 0x6B1D, 0x6B1F, 0x6B25, 0x6B26,\n    0x6B28, 0x6B29, 0x6B2A, 0x6B2B, 0x6B2C, 0x6B2D, 0x6B2E, 0x6B2F,\n    0x6B30, 0x6B31, 0x6B33, 0x6B34, 0x6B35, 0x6B36, 0x6B38, 0x6B3B,\n    0x6B3C, 0x6B3F, 0x6B40, 0x6B41, 0x6B42, 0x6B44, 0x6B45, 0x6B48,\n    0x6B4A, 0x6B4B, 0x6B4D, 0x6B4E, 0x6B4F, 0x6B51, 0x6B52, 0x6B53,\n    0x6B54, 0x6B55, 0x6B56, 0x6B57, 0x6B58, 0x6B5A, 0x6B5B, 0x6B5C,\n    0x6B5D, 0x6B5E, 0x6B60, 0x6B68, 0x6B69, 0x6B6B, 0x6B6C, 0x6B6D,\n    0x6B6E, 0x6B6F, 0x6B70, 0x6B71, 0x6B73, 0x6B74, 0x6B75, 0x6B76,\n    0x6B7A, 0x6B7D, 0x6B7E, 0x6B7F, 0x6B80, 0x6B85, 0x6B88, 0x6B8C,\n    0x6B8E, 0x6B8F, 0x6B90, 0x6B91, 0x6B94, 0x6B95, 0x6B97, 0x6B99,\n    0x6B9C, 0x6B9D, 0x6B9F, 0x6BA0, 0x6BA2, 0x6BA3, 0x6BA5, 0x6BA6,\n    0x6BA7, 0x6BA8, 0x6BA9, 0x6BAC, 0x6BAD, 0x6BB0, 0x6BB1, 0x6BB6,\n    0x6BB8, 0x6BB9, 0x6BBC, 0x6BBD, 0x6BBE, 0x6BC0, 0x6BC3, 0x6BC4,\n    0x6BC7, 0x6BC8, 0x6BC9, 0x6BCA, 0x6BCC, 0x6BCE, 0x6BD0, 0x6BD1,\n    0x6BD8, 0x6BDA, 0x6BDC, 0x6BDD, 0x6BDE, 0x6BDF, 0x6BE0, 0x6BE2,\n    0x6BE3, 0x6BE4, 0x6BE5, 0x6BE6, 0x6BE7, 0x6BE8, 0x6BE9, 0x6BEC,\n    0x6BED, 0x6BEE, 0x6BF0, 0x6BF1, 0x6BF2, 0x6BF4, 0x6BF6, 0x6BF7,\n    0x6BF8, 0x6BFA, 0x6BFB, 0x6BFC, 0x6BFE, 0x6C00, 0x6C01, 0x6C02,\n    0x6C03, 0x6C04, 0x6C09, 0x6C0A, 0x6C0B, 0x6C0E, 0x6C12, 0x6C17,\n    0x6C1C, 0x6C1D, 0x6C1E, 0x6C20, 0x6C25, 0x6C2D, 0x6C31, 0x6C33,\n    0x6C36, 0x6C37, 0x6C39, 0x6C3A, 0x6C3B, 0x6C3C, 0x6C3E, 0x6C3F,\n    0x6C43, 0x6C44, 0x6C45, 0x6C48, 0x6C4B, 0x6C4C, 0x6C4D, 0x6C4E,\n    0x6C4F, 0x6C51, 0x6C52, 0x6C53, 0x6C56, 0x6C58, 0x6C59, 0x6C5A,\n    0x6C62, 0x6C63, 0x6C65, 0x6C66, 0x6C67, 0x6C6B, 0x6C6C, 0x6C6D,\n    0x6C6E, 0x6C6F, 0x6C71, 0x6C73, 0x6C75, 0x6C77, 0x6C78, 0x6C7A,\n    0x6C7B, 0x6C7C, 0x6C7F, 0x6C80, 0x6C84, 0x6C87, 0x6C8A, 0x6C8B,\n    0x6C8D, 0x6C8E, 0x6C91, 0x6C92, 0x6C95, 0x6C96, 0x6C97, 0x6C98,\n    0x6C9A, 0x6C9C, 0x6C9D, 0x6C9E, 0x6CA0, 0x6CA2, 0x6CA8, 0x6CAC,\n    0x6CAF, 0x6CB0, 0x6CB4, 0x6CB5, 0x6CB6, 0x6CB7, 0x6CBA, 0x6CC0,\n    0x6CC1, 0x6CC2, 0x6CC3, 0x6CC6, 0x6CC7, 0x6CC8, 0x6CCB, 0x6CCD,\n    0x6CCE, 0x6CCF, 0x6CD1, 0x6CD2, 0x6CD8, 0x6CD9, 0x6CDA, 0x6CDC,\n    0x6CDD, 0x6CDF, 0x6CE4, 0x6CE6, 0x6CE7, 0x6CE9, 0x6CEC, 0x6CED,\n    0x6CF2, 0x6CF4, 0x6CF9, 0x6CFF, 0x6D00, 0x6D02, 0x6D03, 0x6D05,\n    0x6D06, 0x6D08, 0x6D09, 0x6D0A, 0x6D0D, 0x6D0F, 0x6D10, 0x6D11,\n    0x6D13, 0x6D14, 0x6D15, 0x6D16, 0x6D18, 0x6D1C, 0x6D1D, 0x6D1F,\n    0x6D20, 0x6D21, 0x6D22, 0x6D23, 0x6D24, 0x6D26, 0x6D28, 0x6D29,\n    0x6D2C, 0x6D2D, 0x6D2F, 0x6D30, 0x6D34, 0x6D36, 0x6D37, 0x6D38,\n    0x6D3A, 0x6D3F, 0x6D40, 0x6D42, 0x6D44, 0x6D49, 0x6D4C, 0x6D50,\n    0x6D55, 0x6D56, 0x6D57, 0x6D58, 0x6D5B, 0x6D5D, 0x6D5F, 0x6D61,\n    0x6D62, 0x6D64, 0x6D65, 0x6D67, 0x6D68, 0x6D6B, 0x6D6C, 0x6D6D,\n    0x6D70, 0x6D71, 0x6D72, 0x6D73, 0x6D75, 0x6D76, 0x6D7A, 0x6D7B,\n    0x6D7D, 0x6D7E, 0x6D7F, 0x6D80, 0x6D81, 0x6D83, 0x6D84, 0x6D86,\n    0x6D8A, 0x6D8B, 0x6D8D, 0x6D8F, 0x6D90, 0x6D92, 0x6D96, 0x6D97,\n    0x6D98, 0x6D99, 0x6D9A, 0x6D9C, 0x6DA2, 0x6DA5, 0x6DAC, 0x6DAD,\n    0x6DB0, 0x6DB1, 0x6DB3, 0x6DB4, 0x6DB6, 0x6DB7, 0x6DB9, 0x6DBA,\n    0x6DBB, 0x6DBC, 0x6DBD, 0x6DBE, 0x6DC1, 0x6DC2, 0x6DC3, 0x6DC8,\n    0x6DC9, 0x6DCA, 0x6DCD, 0x6DCE, 0x6DCF, 0x6DD0, 0x6DD2, 0x6DD3,\n    0x6DD4, 0x6DD5, 0x6DD7, 0x6DDA, 0x6DDB, 0x6DDC, 0x6DDF, 0x6DE2,\n    0x6DE3, 0x6DE5, 0x6DE7, 0x6DE8, 0x6DE9, 0x6DED, 0x6DEF, 0x6DF0,\n    0x6DF2, 0x6DF4, 0x6DF8, 0x6DFD, 0x6DFE, 0x6DFF, 0x6E00, 0x6E01,\n    0x6E02, 0x6E03, 0x6E04, 0x6E06, 0x6E07, 0x6E08, 0x6E09, 0x6E0B,\n    0x6E0F, 0x6E12, 0x6E13, 0x6E15, 0x6E18, 0x6E19, 0x6E1B, 0x6E1C,\n    0x6E1E, 0x6E1F, 0x6E22, 0x6E27, 0x6E28, 0x6E2A, 0x6E2E, 0x6E30,\n    0x6E31, 0x6E33, 0x6E35, 0x6E36, 0x6E37, 0x6E39, 0x6E3B, 0x6E3C,\n    0x6E3D, 0x6E3F, 0x6E40, 0x6E41, 0x6E42, 0x6E45, 0x6E46, 0x6E47,\n    0x6E48, 0x6E49, 0x6E4A, 0x6E4B, 0x6E4C, 0x6E4F, 0x6E50, 0x6E51,\n    0x6E52, 0x6E55, 0x6E57, 0x6E59, 0x6E5A, 0x6E5C, 0x6E5D, 0x6E60,\n    0x6E61, 0x6E62, 0x6E63, 0x6E64, 0x6E65, 0x6E66, 0x6E67, 0x6E68,\n    0x6E69, 0x6E6A, 0x6E6C, 0x6E6D, 0x6E70, 0x6E71, 0x6E72, 0x6E73,\n    0x6E74, 0x6E75, 0x6E76, 0x6E77, 0x6E78, 0x6E79, 0x6E7A, 0x6E7B,\n    0x6E7C, 0x6E7D, 0x6E80, 0x6E81, 0x6E82, 0x6E84, 0x6E87, 0x6E88,\n    0x6E8A, 0x6E8B, 0x6E8C, 0x6E8D, 0x6E8E, 0x6E91, 0x6E92, 0x6E93,\n    0x6E94, 0x6E95, 0x6E97, 0x6E99, 0x6E9A, 0x6E9B, 0x6E9E, 0x6EA0,\n    0x6EA1, 0x6EA3, 0x6EA4, 0x6EA6, 0x6EA8, 0x6EA9, 0x6EAB, 0x6EAC,\n    0x6EAD, 0x6EAE, 0x6EB0, 0x6EB3, 0x6EB5, 0x6EB8, 0x6EB9, 0x6EBC,\n    0x6EBE, 0x6EBF, 0x6EC0, 0x6EC3, 0x6EC6, 0x6EC8, 0x6EC9, 0x6ECA,\n    0x6ECD, 0x6ED0, 0x6ED2, 0x6ED6, 0x6ED8, 0x6ED9, 0x6EDB, 0x6EDC,\n    0x6EDD, 0x6EE3, 0x6EE7, 0x6EEA, 0x6EEB, 0x6EED, 0x6EEE, 0x6EF0,\n    0x6EF1, 0x6EF3, 0x6EF5, 0x6EF6, 0x6EFA, 0x6EFB, 0x6EFC, 0x6EFD,\n    0x6EFE, 0x6F00, 0x6F03, 0x6F04, 0x6F05, 0x6F07, 0x6F08, 0x6F0A,\n    0x6F0B, 0x6F0C, 0x6F0D, 0x6F0E, 0x6F10, 0x6F11, 0x6F12, 0x6F16,\n    0x6F17, 0x6F18, 0x6F19, 0x6F1B, 0x6F1C, 0x6F1D, 0x6F1E, 0x6F1F,\n    0x6F21, 0x6F25, 0x6F26, 0x6F27, 0x6F28, 0x6F2E, 0x6F30, 0x6F34,\n    0x6F35, 0x6F37, 0x6F39, 0x6F3A, 0x6F3B, 0x6F3C, 0x6F3D, 0x6F40,\n    0x6F42, 0x6F43, 0x6F44, 0x6F45, 0x6F48, 0x6F49, 0x6F4A, 0x6F4C,\n    0x6F4E, 0x6F4F, 0x6F50, 0x6F52, 0x6F53, 0x6F55, 0x6F56, 0x6F57,\n    0x6F5A, 0x6F5B, 0x6F5D, 0x6F5F, 0x6F60, 0x6F61, 0x6F63, 0x6F65,\n    0x6F67, 0x6F68, 0x6F69, 0x6F6A, 0x6F6B, 0x6F6C, 0x6F71, 0x6F73,\n    0x6F75, 0x6F76, 0x6F79, 0x6F7B, 0x6F7D, 0x6F7E, 0x6F81, 0x6F82,\n    0x6F83, 0x6F85, 0x6F8A, 0x6F8B, 0x6F8F, 0x6F90, 0x6F91, 0x6F92,\n    0x6F93, 0x6F94, 0x6F95, 0x6F96, 0x6F98, 0x6F99, 0x6F9A, 0x6F9B,\n    0x6F9D, 0x6F9E, 0x6F9F, 0x6FA2, 0x6FA3, 0x6FA5, 0x6FA6, 0x6FA8,\n    0x6FAA, 0x6FAB, 0x6FAC, 0x6FAD, 0x6FAF, 0x6FB0, 0x6FB2, 0x6FB4,\n    0x6FB5, 0x6FB7, 0x6FB8, 0x6FBA, 0x6FBB, 0x6FBC, 0x6FBD, 0x6FBE,\n    0x6FBF, 0x6FC4, 0x6FC5, 0x6FC6, 0x6FC7, 0x6FC8, 0x6FCA, 0x6FCB,\n    0x6FCC, 0x6FCD, 0x6FCE, 0x6FCF, 0x6FD0, 0x6FD3, 0x6FD4, 0x6FD6,\n    0x6FD7, 0x6FD9, 0x6FDA, 0x6FDC, 0x6FDD, 0x6FE2, 0x6FE3, 0x6FE5,\n    0x6FE6, 0x6FE7, 0x6FE8, 0x6FE9, 0x6FEA, 0x6FEC, 0x6FED, 0x6FF2,\n    0x6FF3, 0x6FF4, 0x6FF5, 0x6FF6, 0x6FF7, 0x6FF8, 0x6FF9, 0x6FFB,\n    0x6FFD, 0x6FFF, 0x7000, 0x7001, 0x7002, 0x7003, 0x7004, 0x7007,\n    0x7008, 0x700A, 0x700C, 0x700D, 0x700E, 0x7010, 0x7012, 0x7013,\n    0x7014, 0x7016, 0x7017, 0x7019, 0x701C, 0x701E, 0x7021, 0x7022,\n    0x7024, 0x7025, 0x7026, 0x7029, 0x702A, 0x702B, 0x702C, 0x702D,\n    0x702E, 0x702F, 0x7031, 0x7033, 0x7034, 0x7036, 0x7037, 0x7038,\n    0x703A, 0x703B, 0x703C, 0x703D, 0x703F, 0x7040, 0x7041, 0x7042,\n    0x7045, 0x7046, 0x7047, 0x7048, 0x7049, 0x704A, 0x704B, 0x704D,\n    0x704E, 0x7050, 0x7052, 0x7053, 0x7054, 0x7056, 0x7057, 0x7059,\n    0x705A, 0x705B, 0x705C, 0x705F, 0x7060, 0x7061, 0x7062, 0x7065,\n    0x7066, 0x7068, 0x7069, 0x706A, 0x706E, 0x7071, 0x7072, 0x7073,\n    0x7074, 0x7077, 0x7079, 0x707A, 0x707B, 0x707D, 0x7081, 0x7082,\n    0x7083, 0x7084, 0x7086, 0x7087, 0x7088, 0x708B, 0x708C, 0x708D,\n    0x708F, 0x7090, 0x7091, 0x7093, 0x7097, 0x7098, 0x709A, 0x709B,\n    0x709E, 0x709F, 0x70A0, 0x70A1, 0x70A2, 0x70A3, 0x70A4, 0x70A5,\n    0x70A6, 0x70A7, 0x70A8, 0x70A9, 0x70AA, 0x70B0, 0x70B2, 0x70B4,\n    0x70B5, 0x70B6, 0x70BA, 0x70BE, 0x70BF, 0x70C4, 0x70C5, 0x70C6,\n    0x70C7, 0x70C9, 0x70CB, 0x70CC, 0x70CD, 0x70CE, 0x70D0, 0x70D1,\n    0x70D2, 0x70D3, 0x70D4, 0x70D5, 0x70D6, 0x70D7, 0x70DA, 0x70DC,\n    0x70DD, 0x70DE, 0x70E0, 0x70E1, 0x70E2, 0x70E3, 0x70E5, 0x70EA,\n    0x70EE, 0x70F0, 0x70F1, 0x70F2, 0x70F3, 0x70F5, 0x70F6, 0x70F8,\n    0x70FA, 0x70FB, 0x70FC, 0x70FE, 0x70FF, 0x7100, 0x7101, 0x7102,\n    0x7103, 0x7104, 0x7105, 0x7106, 0x7107, 0x7108, 0x710B, 0x710C,\n    0x710D, 0x710E, 0x710F, 0x7111, 0x7112, 0x7114, 0x7117, 0x711B,\n    0x711C, 0x711D, 0x711E, 0x711F, 0x7120, 0x7122, 0x7123, 0x7124,\n    0x7125, 0x7127, 0x7128, 0x7129, 0x712A, 0x712B, 0x712C, 0x712D,\n    0x712E, 0x7132, 0x7133, 0x7134, 0x7135, 0x7137, 0x7138, 0x7139,\n    0x713A, 0x713B, 0x713C, 0x713D, 0x713E, 0x713F, 0x7140, 0x7141,\n    0x7142, 0x7143, 0x7144, 0x7146, 0x7147, 0x7148, 0x714B, 0x714D,\n    0x714F, 0x7150, 0x7151, 0x7153, 0x7154, 0x7155, 0x7156, 0x7157,\n    0x7158, 0x7159, 0x715A, 0x715B, 0x715D, 0x715F, 0x7160, 0x7161,\n    0x7163, 0x7165, 0x716A, 0x716B, 0x716D, 0x716F, 0x7170, 0x7171,\n    0x7174, 0x7175, 0x7176, 0x7177, 0x7179, 0x717B, 0x717C, 0x717E,\n    0x717F, 0x7180, 0x7181, 0x7182, 0x7183, 0x7185, 0x7186, 0x7187,\n    0x7188, 0x7189, 0x718B, 0x718C, 0x718D, 0x718E, 0x7190, 0x7191,\n    0x7193, 0x7195, 0x7196, 0x719A, 0x719B, 0x719C, 0x719D, 0x719E,\n    0x71A1, 0x71A2, 0x71A3, 0x71A4, 0x71A5, 0x71A6, 0x71A7, 0x71A9,\n    0x71AA, 0x71AB, 0x71AD, 0x71AE, 0x71AF, 0x71B0, 0x71B2, 0x71B4,\n    0x71B6, 0x71B7, 0x71B8, 0x71BA, 0x71BB, 0x71BC, 0x71BD, 0x71BF,\n    0x71C0, 0x71C2, 0x71C4, 0x71C5, 0x71C6, 0x71C7, 0x71C9, 0x71CA,\n    0x71CB, 0x71CC, 0x71CD, 0x71CF, 0x71D0, 0x71D1, 0x71D3, 0x71D6,\n    0x71D7, 0x71D8, 0x71DA, 0x71DB, 0x71DD, 0x71DE, 0x71E1, 0x71E2,\n    0x71E3, 0x71E4, 0x71E8, 0x71E9, 0x71EA, 0x71EB, 0x71EC, 0x71EF,\n    0x71F0, 0x71F1, 0x71F2, 0x71F3, 0x71F5, 0x71F6, 0x71F7, 0x71F8,\n    0x71FA, 0x71FB, 0x71FD, 0x71FF, 0x7200, 0x7201, 0x7202, 0x7203,\n    0x7204, 0x7205, 0x7207, 0x7208, 0x7209, 0x720A, 0x720B, 0x720C,\n    0x720E, 0x720F, 0x7211, 0x7212, 0x7213, 0x7214, 0x7215, 0x7216,\n    0x7217, 0x7218, 0x7219, 0x721A, 0x721C, 0x721E, 0x721F, 0x7220,\n    0x7221, 0x7222, 0x7223, 0x7224, 0x7225, 0x7226, 0x7227, 0x7229,\n    0x722B, 0x722D, 0x722E, 0x722F, 0x7233, 0x7234, 0x723C, 0x7240,\n    0x7241, 0x7242, 0x7243, 0x7244, 0x7245, 0x7246, 0x7249, 0x724A,\n    0x724B, 0x724E, 0x724F, 0x7250, 0x7251, 0x7253, 0x7254, 0x7255,\n    0x7257, 0x725A, 0x725C, 0x725E, 0x7260, 0x7263, 0x7264, 0x7265,\n    0x7268, 0x726A, 0x726B, 0x726C, 0x726D, 0x7270, 0x7271, 0x7273,\n    0x7274, 0x7276, 0x7277, 0x7278, 0x727B, 0x727C, 0x7282, 0x7283,\n    0x7285, 0x7286, 0x7287, 0x7288, 0x7289, 0x728C, 0x728E, 0x7290,\n    0x7291, 0x7293, 0x7294, 0x7295, 0x7297, 0x7298, 0x7299, 0x729A,\n    0x729B, 0x729C, 0x729D, 0x729E, 0x72A0, 0x72A1, 0x72A3, 0x72A4,\n    0x72A5, 0x72A6, 0x72A8, 0x72A9, 0x72AA, 0x72AB, 0x72AE, 0x72B1,\n    0x72B2, 0x72B3, 0x72B5, 0x72BA, 0x72BB, 0x72BC, 0x72BD, 0x72BE,\n    0x72BF, 0x72C5, 0x72C6, 0x72C7, 0x72C9, 0x72CA, 0x72CB, 0x72CC,\n    0x72CF, 0x72D1, 0x72D3, 0x72D4, 0x72D5, 0x72D6, 0x72D8, 0x72DA,\n    0x72DB, 0x72DC, 0x72DD, 0x72DF, 0x72E2, 0x72E3, 0x72E4, 0x72E5,\n    0x72E6, 0x72E7, 0x72EA, 0x72EB, 0x72F5, 0x72F6, 0x72FE, 0x72FF,\n    0x7300, 0x7302, 0x7304, 0x7305, 0x7306, 0x7307, 0x7308, 0x7309,\n    0x730B, 0x730C, 0x730D, 0x730F, 0x7310, 0x7311, 0x7312, 0x7314,\n    0x7318, 0x7319, 0x731A, 0x731F, 0x7320, 0x7323, 0x7324, 0x7326,\n    0x7327, 0x7328, 0x732D, 0x732F, 0x7330, 0x7332, 0x7333, 0x7335,\n    0x733A, 0x733C, 0x733D, 0x7340, 0x7342, 0x7343, 0x7346, 0x7347,\n    0x7348, 0x7349, 0x734A, 0x734B, 0x734C, 0x734E, 0x734F, 0x7351,\n    0x7353, 0x7354, 0x7355, 0x7356, 0x7358, 0x7359, 0x735A, 0x735B,\n    0x735C, 0x735D, 0x735E, 0x735F, 0x7361, 0x7362, 0x7363, 0x7364,\n    0x7365, 0x7366, 0x7367, 0x7369, 0x736E, 0x7371, 0x7373, 0x7374,\n    0x7376, 0x7379, 0x737D, 0x737F, 0x7381, 0x7382, 0x7383, 0x7385,\n    0x7386, 0x7388, 0x738A, 0x738C, 0x738D, 0x738F, 0x7390, 0x7392,\n    0x7393, 0x7394, 0x7395, 0x7397, 0x7398, 0x7399, 0x739A, 0x739C,\n    0x739D, 0x739E, 0x73A0, 0x73A1, 0x73A3, 0x73A4, 0x73A5, 0x73A6,\n    0x73A7, 0x73A8, 0x73AA, 0x73AC, 0x73AD, 0x73B1, 0x73B4, 0x73B5,\n    0x73B6, 0x73B8, 0x73B9, 0x73BC, 0x73BD, 0x73BE, 0x73BF, 0x73C1,\n    0x73C3, 0x73C4, 0x73C5, 0x73C6, 0x73C7, 0x73CB, 0x73CC, 0x73CE,\n    0x73D2, 0x73D3, 0x73D4, 0x73D5, 0x73D6, 0x73D7, 0x73D8, 0x73DA,\n    0x73DB, 0x73DC, 0x73DD, 0x73DF, 0x73E1, 0x73E2, 0x73E3, 0x73E4,\n    0x73E6, 0x73E8, 0x73EA, 0x73EB, 0x73EC, 0x73EE, 0x73EF, 0x73F0,\n    0x73F1, 0x73F3, 0x73F4, 0x73F5, 0x73F6, 0x73F7, 0x73F8, 0x73F9,\n    0x73FA, 0x73FB, 0x73FC, 0x73FD, 0x73FF, 0x7400, 0x7401, 0x7402,\n    0x7404, 0x7407, 0x7408, 0x740B, 0x740C, 0x740D, 0x740E, 0x7411,\n    0x7412, 0x7413, 0x7414, 0x7415, 0x7416, 0x7417, 0x7418, 0x7419,\n    0x741C, 0x741D, 0x741E, 0x741F, 0x7420, 0x7421, 0x7423, 0x7424,\n    0x7427, 0x7429, 0x742B, 0x742D, 0x742F, 0x7431, 0x7432, 0x7437,\n    0x7438, 0x7439, 0x743A, 0x743B, 0x743D, 0x743E, 0x7440, 0x7442,\n    0x7443, 0x7444, 0x7445, 0x7446, 0x7447, 0x7448, 0x7449, 0x744A,\n    0x744C, 0x744D, 0x744E, 0x744F, 0x7450, 0x7451, 0x7452, 0x7453,\n    0x7454, 0x7456, 0x7458, 0x745D, 0x7460, 0x7461, 0x7462, 0x7464,\n    0x7465, 0x7466, 0x7467, 0x7468, 0x746B, 0x746C, 0x746E, 0x746F,\n    0x7471, 0x7472, 0x7473, 0x7474, 0x7475, 0x7478, 0x7479, 0x747A,\n    0x747B, 0x747C, 0x747D, 0x747F, 0x7482, 0x7484, 0x7485, 0x7486,\n    0x7488, 0x748A, 0x748C, 0x748D, 0x748F, 0x7491, 0x7492, 0x7493,\n    0x7494, 0x7495, 0x7496, 0x7497, 0x7498, 0x7499, 0x749A, 0x749B,\n    0x749D, 0x749F, 0x74A0, 0x74A1, 0x74A2, 0x74A4, 0x74A5, 0x74AA,\n    0x74AB, 0x74AC, 0x74AD, 0x74AE, 0x74AF, 0x74B1, 0x74B2, 0x74B3,\n    0x74B4, 0x74B5, 0x74B6, 0x74B7, 0x74B8, 0x74B9, 0x74BB, 0x74BC,\n    0x74BE, 0x74BF, 0x74C0, 0x74C1, 0x74C2, 0x74C3, 0x74C4, 0x74C5,\n    0x74C6, 0x74C7, 0x74C8, 0x74C9, 0x74CB, 0x74CC, 0x74CD, 0x74CE,\n    0x74D0, 0x74D1, 0x74D3, 0x74D5, 0x74D6, 0x74D7, 0x74D8, 0x74D9,\n    0x74DB, 0x74DD, 0x74DF, 0x74E1, 0x74E5, 0x74E7, 0x74E8, 0x74E9,\n    0x74EA, 0x74EB, 0x74EC, 0x74ED, 0x74F0, 0x74F1, 0x74F2, 0x74F3,\n    0x74F5, 0x74F8, 0x74F9, 0x74FA, 0x74FB, 0x74FC, 0x74FD, 0x74FE,\n    0x7500, 0x7501, 0x7502, 0x7503, 0x7505, 0x7506, 0x7507, 0x7508,\n    0x7509, 0x750A, 0x750B, 0x750E, 0x7510, 0x7512, 0x7514, 0x7515,\n    0x7516, 0x7517, 0x751B, 0x751D, 0x751E, 0x7520, 0x7521, 0x7522,\n    0x7524, 0x7526, 0x7527, 0x752A, 0x752E, 0x7534, 0x7536, 0x7539,\n    0x753C, 0x753D, 0x753F, 0x7541, 0x7542, 0x7543, 0x7544, 0x7546,\n    0x7547, 0x7549, 0x754A, 0x754D, 0x7550, 0x7551, 0x7552, 0x7553,\n    0x7555, 0x7556, 0x7557, 0x7558, 0x755E, 0x755F, 0x7560, 0x7561,\n    0x7563, 0x7564, 0x7567, 0x7568, 0x7569, 0x756C, 0x756D, 0x756E,\n    0x756F, 0x7570, 0x7571, 0x7573, 0x7575, 0x7577, 0x757A, 0x757B,\n    0x757C, 0x757D, 0x757E, 0x7580, 0x7581, 0x7582, 0x7584, 0x7585,\n    0x7588, 0x7589, 0x758A, 0x758C, 0x758D, 0x758E, 0x7590, 0x7593,\n    0x7595, 0x7598, 0x759B, 0x759C, 0x759E, 0x75A2, 0x75A6, 0x75A7,\n    0x75A8, 0x75A9, 0x75AA, 0x75AD, 0x75B6, 0x75B7, 0x75BA, 0x75BB,\n    0x75BF, 0x75C0, 0x75C1, 0x75C6, 0x75CB, 0x75CC, 0x75CE, 0x75CF,\n    0x75D0, 0x75D1, 0x75D3, 0x75D7, 0x75DA, 0x75DC, 0x75DD, 0x75DF,\n    0x75E0, 0x75E1, 0x75E5, 0x75E9, 0x75EC, 0x75ED, 0x75EE, 0x75EF,\n    0x75F2, 0x75F3, 0x75F5, 0x75F6, 0x75F7, 0x75F8, 0x75FA, 0x75FB,\n    0x75FD, 0x75FE, 0x7604, 0x7606, 0x7607, 0x7608, 0x7609, 0x760E,\n    0x760F, 0x7611, 0x7612, 0x7613, 0x7614, 0x7616, 0x761A, 0x761C,\n    0x761D, 0x7623, 0x7628, 0x762C, 0x762E, 0x762F, 0x7631, 0x7632,\n    0x7636, 0x7637, 0x7639, 0x763A, 0x763D, 0x7641, 0x7644, 0x7645,\n    0x7648, 0x764A, 0x764B, 0x764E, 0x764F, 0x7650, 0x7651, 0x7652,\n    0x7653, 0x7655, 0x7657, 0x7659, 0x765A, 0x765B, 0x765D, 0x7660,\n    0x7661, 0x7666, 0x7668, 0x766A, 0x7673, 0x7674, 0x7675, 0x7676,\n    0x7677, 0x7679, 0x767A, 0x767F, 0x7680, 0x7681, 0x7683, 0x7685,\n    0x7689, 0x768A, 0x768C, 0x768D, 0x768F, 0x7690, 0x7692, 0x7694,\n    0x7695, 0x7697, 0x7698, 0x769B, 0x769C, 0x769D, 0x769E, 0x769F,\n    0x76A0, 0x76A1, 0x76A2, 0x76A3, 0x76A5, 0x76A6, 0x76A7, 0x76A8,\n    0x76A9, 0x76AA, 0x76AB, 0x76AC, 0x76AD, 0x76AF, 0x76B0, 0x76B3,\n    0x76B5, 0x76B6, 0x76B7, 0x76B9, 0x76BB, 0x76BC, 0x76BD, 0x76BE,\n    0x76C0, 0x76C1, 0x76C3, 0x76C4, 0x76C7, 0x76C9, 0x76CB, 0x76CC,\n    0x76D3, 0x76D5, 0x76D9, 0x76DA, 0x76DC, 0x76DD, 0x76E0, 0x76E2,\n    0x76E6, 0x76E8, 0x76E9, 0x76EA, 0x76EB, 0x76EC, 0x76ED, 0x76F0,\n    0x76F3, 0x76F5, 0x76F6, 0x76F7, 0x76FA, 0x76FB, 0x76FD, 0x76FF,\n    0x7700, 0x7702, 0x7703, 0x7705, 0x7706, 0x770A, 0x770C, 0x770E,\n    0x770F, 0x7710, 0x7711, 0x7712, 0x7713, 0x7714, 0x7715, 0x7716,\n    0x7717, 0x7718, 0x771B, 0x771C, 0x771D, 0x771E, 0x7721, 0x7723,\n    0x7724, 0x7725, 0x7727, 0x772A, 0x772B, 0x772C, 0x772E, 0x7730,\n    0x7731, 0x7732, 0x7733, 0x7734, 0x7739, 0x773B, 0x773D, 0x773E,\n    0x773F, 0x7742, 0x7744, 0x7745, 0x7746, 0x7748, 0x7749, 0x774A,\n    0x774B, 0x774C, 0x774D, 0x774E, 0x7752, 0x7753, 0x7754, 0x7755,\n    0x7756, 0x7757, 0x7758, 0x7759, 0x775C, 0x775D, 0x775F, 0x7760,\n    0x7764, 0x7767, 0x7769, 0x776A, 0x776D, 0x776E, 0x776F, 0x7770,\n    0x7771, 0x7772, 0x7773, 0x7774, 0x7775, 0x7776, 0x7777, 0x7778,\n    0x777A, 0x777B, 0x777C, 0x7781, 0x7782, 0x7783, 0x7786, 0x7787,\n    0x7788, 0x7789, 0x778A, 0x778B, 0x778F, 0x7790, 0x7793, 0x7794,\n    0x7795, 0x7796, 0x7797, 0x7799, 0x779A, 0x779B, 0x779C, 0x779D,\n    0x77A1, 0x77A3, 0x77A4, 0x77A6, 0x77A8, 0x77AB, 0x77AE, 0x77AF,\n    0x77B1, 0x77B2, 0x77B4, 0x77B6, 0x77B7, 0x77B8, 0x77B9, 0x77BA,\n    0x77BE, 0x77C0, 0x77C1, 0x77C2, 0x77C3, 0x77C4, 0x77C5, 0x77C6,\n    0x77C8, 0x77C9, 0x77CA, 0x77CB, 0x77CC, 0x77CE, 0x77CF, 0x77D0,\n    0x77D1, 0x77D2, 0x77D3, 0x77D4, 0x77D5, 0x77D6, 0x77D8, 0x77D9,\n    0x77DD, 0x77DE, 0x77DF, 0x77E0, 0x77E1, 0x77E4, 0x77E6, 0x77E8,\n    0x77EA, 0x77F0, 0x77F1, 0x77F2, 0x77F4, 0x77F5, 0x77F7, 0x77F9,\n    0x77FA, 0x77FB, 0x77FC, 0x7803, 0x7804, 0x7805, 0x7806, 0x7807,\n    0x7808, 0x780A, 0x780B, 0x780E, 0x780F, 0x7810, 0x7813, 0x7815,\n    0x7819, 0x781B, 0x781E, 0x7820, 0x7821, 0x7822, 0x7824, 0x7828,\n    0x782A, 0x782B, 0x782E, 0x782F, 0x7831, 0x7832, 0x7833, 0x7835,\n    0x7836, 0x783D, 0x783F, 0x7841, 0x7842, 0x7844, 0x7846, 0x7848,\n    0x7849, 0x784A, 0x784B, 0x784D, 0x784F, 0x7851, 0x7853, 0x7854,\n    0x7858, 0x7859, 0x785A, 0x785B, 0x785C, 0x785E, 0x785F, 0x7860,\n    0x7861, 0x7862, 0x7863, 0x7865, 0x7866, 0x7867, 0x7869, 0x7870,\n    0x7871, 0x7872, 0x7873, 0x7874, 0x7875, 0x7876, 0x7878, 0x7879,\n    0x787A, 0x787B, 0x787D, 0x787E, 0x787F, 0x7880, 0x7881, 0x7882,\n    0x7883, 0x7884, 0x7885, 0x7886, 0x7888, 0x788A, 0x788B, 0x788F,\n    0x7890, 0x7892, 0x7894, 0x7895, 0x7896, 0x7899, 0x789D, 0x789E,\n    0x78A0, 0x78A2, 0x78A4, 0x78A6, 0x78A8, 0x78AA, 0x78AB, 0x78AC,\n    0x78AE, 0x78AF, 0x78B5, 0x78B6, 0x78B7, 0x78BB, 0x78BD, 0x78BF,\n    0x78C0, 0x78C2, 0x78C3, 0x78C4, 0x78C6, 0x78C7, 0x78C8, 0x78CC,\n    0x78CD, 0x78CE, 0x78CF, 0x78D1, 0x78D2, 0x78D3, 0x78D6, 0x78D7,\n    0x78D8, 0x78DB, 0x78DC, 0x78DD, 0x78DE, 0x78DF, 0x78E0, 0x78E1,\n    0x78E2, 0x78E4, 0x78E5, 0x78E6, 0x78E9, 0x78EA, 0x78EB, 0x78ED,\n    0x78EE, 0x78F0, 0x78F1, 0x78F3, 0x78F5, 0x78F6, 0x78F8, 0x78F9,\n    0x78FB, 0x78FC, 0x78FE, 0x78FF, 0x7900, 0x7902, 0x7903, 0x7904,\n    0x7906, 0x7907, 0x7908, 0x7909, 0x790A, 0x790B, 0x790C, 0x790D,\n    0x790F, 0x7910, 0x7911, 0x7912, 0x7914, 0x7915, 0x7916, 0x7917,\n    0x7918, 0x791A, 0x791B, 0x791C, 0x791D, 0x791F, 0x7920, 0x7921,\n    0x7922, 0x7923, 0x7925, 0x7927, 0x7928, 0x7929, 0x792D, 0x792E,\n    0x792F, 0x7930, 0x7932, 0x7933, 0x7935, 0x7936, 0x7937, 0x7938,\n    0x7939, 0x793D, 0x793F, 0x7942, 0x7943, 0x7944, 0x7945, 0x7947,\n    0x794A, 0x794B, 0x794C, 0x794D, 0x794E, 0x794F, 0x7950, 0x7951,\n    0x7952, 0x7954, 0x7955, 0x7958, 0x7959, 0x7961, 0x7963, 0x7964,\n    0x7966, 0x7969, 0x796A, 0x796B, 0x796C, 0x796E, 0x7970, 0x7971,\n    0x7972, 0x7973, 0x7974, 0x7975, 0x7976, 0x7979, 0x797B, 0x797C,\n    0x797D, 0x797E, 0x797F, 0x7982, 0x7983, 0x7986, 0x7987, 0x7988,\n    0x7989, 0x798B, 0x798C, 0x7990, 0x7991, 0x7992, 0x7993, 0x7994,\n    0x7995, 0x7996, 0x7997, 0x7998, 0x7999, 0x799B, 0x799C, 0x799D,\n    0x799E, 0x799F, 0x79A0, 0x79A1, 0x79A2, 0x79A3, 0x79A4, 0x79A5,\n    0x79A8, 0x79A9, 0x79AB, 0x79AC, 0x79AD, 0x79AF, 0x79B2, 0x79B4,\n    0x79B5, 0x79B6, 0x79B7, 0x79B8, 0x79BC, 0x79BF, 0x79C2, 0x79C4,\n    0x79C5, 0x79C7, 0x79C8, 0x79CA, 0x79CC, 0x79CE, 0x79CF, 0x79D0,\n    0x79D3, 0x79D4, 0x79D6, 0x79D7, 0x79D9, 0x79DA, 0x79DB, 0x79DC,\n    0x79DD, 0x79DE, 0x79E0, 0x79E1, 0x79E2, 0x79E5, 0x79E8, 0x79EA,\n    0x79EC, 0x79EE, 0x79F1, 0x79F2, 0x79F3, 0x79F4, 0x79F5, 0x79F6,\n    0x79F7, 0x79F9, 0x79FA, 0x79FC, 0x79FE, 0x79FF, 0x7A01, 0x7A04,\n    0x7A05, 0x7A07, 0x7A08, 0x7A09, 0x7A0A, 0x7A0C, 0x7A0F, 0x7A10,\n    0x7A11, 0x7A12, 0x7A13, 0x7A15, 0x7A16, 0x7A18, 0x7A19, 0x7A1B,\n    0x7A1C, 0x7A1D, 0x7A1F, 0x7A21, 0x7A22, 0x7A24, 0x7A25, 0x7A26,\n    0x7A27, 0x7A28, 0x7A29, 0x7A2A, 0x7A2B, 0x7A2C, 0x7A2D, 0x7A2F,\n    0x7A30, 0x7A32, 0x7A34, 0x7A35, 0x7A36, 0x7A38, 0x7A3A, 0x7A3E,\n    0x7A41, 0x7A42, 0x7A43, 0x7A44, 0x7A45, 0x7A47, 0x7A48, 0x7A49,\n    0x7A4A, 0x7A4B, 0x7A4F, 0x7A50, 0x7A52, 0x7A53, 0x7A54, 0x7A55,\n    0x7A56, 0x7A58, 0x7A59, 0x7A5A, 0x7A5B, 0x7A5C, 0x7A5D, 0x7A5E,\n    0x7A5F, 0x7A60, 0x7A63, 0x7A64, 0x7A65, 0x7A66, 0x7A67, 0x7A68,\n    0x7A6A, 0x7A6C, 0x7A6D, 0x7A6E, 0x7A6F, 0x7A71, 0x7A72, 0x7A73,\n    0x7A75, 0x7A7B, 0x7A7C, 0x7A7D, 0x7A7E, 0x7A82, 0x7A85, 0x7A87,\n    0x7A89, 0x7A8A, 0x7A8B, 0x7A8C, 0x7A8E, 0x7A8F, 0x7A90, 0x7A93,\n    0x7A94, 0x7A99, 0x7A9A, 0x7A9B, 0x7A9E, 0x7AA1, 0x7AA2, 0x7AA3,\n    0x7AA4, 0x7AA7, 0x7AAB, 0x7AAF, 0x7AB0, 0x7AB1, 0x7AB2, 0x7AB4,\n    0x7AB5, 0x7AB7, 0x7AB8, 0x7AB9, 0x7ABB, 0x7ABC, 0x7ABD, 0x7ABE,\n    0x7AC0, 0x7AC1, 0x7AC2, 0x7AC3, 0x7AC6, 0x7AC9, 0x7ACC, 0x7ACD,\n    0x7ACE, 0x7ACF, 0x7AD0, 0x7AD1, 0x7AD2, 0x7AD3, 0x7AD4, 0x7AD5,\n    0x7AD7, 0x7AD8, 0x7ADA, 0x7ADB, 0x7ADC, 0x7ADD, 0x7AE1, 0x7AE2,\n    0x7AE4, 0x7AE7, 0x7AE8, 0x7AE9, 0x7AEB, 0x7AEC, 0x7AEE, 0x7AF0,\n    0x7AF1, 0x7AF2, 0x7AF3, 0x7AF4, 0x7AF5, 0x7AF7, 0x7AF8, 0x7AFB,\n    0x7AFC, 0x7AFE, 0x7B00, 0x7B01, 0x7B02, 0x7B05, 0x7B07, 0x7B09,\n    0x7B0C, 0x7B0D, 0x7B0E, 0x7B10, 0x7B12, 0x7B13, 0x7B16, 0x7B17,\n    0x7B18, 0x7B1A, 0x7B1C, 0x7B1D, 0x7B1F, 0x7B21, 0x7B22, 0x7B23,\n    0x7B27, 0x7B29, 0x7B2D, 0x7B2F, 0x7B30, 0x7B32, 0x7B34, 0x7B35,\n    0x7B36, 0x7B37, 0x7B39, 0x7B3B, 0x7B3D, 0x7B3F, 0x7B40, 0x7B41,\n    0x7B42, 0x7B43, 0x7B44, 0x7B48, 0x7B4A, 0x7B4D, 0x7B4E, 0x7B53,\n    0x7B55, 0x7B57, 0x7B59, 0x7B5C, 0x7B5E, 0x7B5F, 0x7B61, 0x7B63,\n    0x7B64, 0x7B65, 0x7B66, 0x7B68, 0x7B69, 0x7B6A, 0x7B6B, 0x7B6C,\n    0x7B6D, 0x7B6F, 0x7B70, 0x7B73, 0x7B74, 0x7B76, 0x7B78, 0x7B7A,\n    0x7B7C, 0x7B7D, 0x7B7F, 0x7B81, 0x7B82, 0x7B83, 0x7B84, 0x7B86,\n    0x7B87, 0x7B88, 0x7B89, 0x7B8A, 0x7B8C, 0x7B8E, 0x7B8F, 0x7B91,\n    0x7B92, 0x7B93, 0x7B96, 0x7B98, 0x7B99, 0x7B9A, 0x7B9B, 0x7B9E,\n    0x7B9F, 0x7BA0, 0x7BA3, 0x7BA4, 0x7BA5, 0x7BAE, 0x7BAF, 0x7BB0,\n    0x7BB2, 0x7BB3, 0x7BB5, 0x7BB6, 0x7BB7, 0x7BB9, 0x7BBA, 0x7BBB,\n    0x7BBC, 0x7BBD, 0x7BBE, 0x7BBF, 0x7BC2, 0x7BC3, 0x7BC5, 0x7BC8,\n    0x7BCA, 0x7BCD, 0x7BCE, 0x7BCF, 0x7BD0, 0x7BD2, 0x7BD4, 0x7BD5,\n    0x7BD6, 0x7BD7, 0x7BD8, 0x7BDB, 0x7BDC, 0x7BDE, 0x7BDF, 0x7BE0,\n    0x7BE2, 0x7BE3, 0x7BE7, 0x7BE8, 0x7BEB, 0x7BEC, 0x7BED, 0x7BEF,\n    0x7BF0, 0x7BF2, 0x7BF4, 0x7BF5, 0x7BF6, 0x7BF8, 0x7BF9, 0x7BFA,\n    0x7BFB, 0x7BFD, 0x7BFF, 0x7C01, 0x7C02, 0x7C03, 0x7C04, 0x7C05,\n    0x7C06, 0x7C08, 0x7C09, 0x7C0A, 0x7C0E, 0x7C10, 0x7C11, 0x7C12,\n    0x7C13, 0x7C14, 0x7C15, 0x7C17, 0x7C18, 0x7C19, 0x7C1A, 0x7C1B,\n    0x7C1C, 0x7C1D, 0x7C20, 0x7C22, 0x7C24, 0x7C25, 0x7C28, 0x7C29,\n    0x7C2C, 0x7C2D, 0x7C2E, 0x7C2F, 0x7C30, 0x7C31, 0x7C32, 0x7C33,\n    0x7C34, 0x7C35, 0x7C36, 0x7C37, 0x7C39, 0x7C3A, 0x7C3B, 0x7C3C,\n    0x7C42, 0x7C44, 0x7C45, 0x7C46, 0x7C47, 0x7C48, 0x7C49, 0x7C4A,\n    0x7C4B, 0x7C4E, 0x7C4F, 0x7C50, 0x7C51, 0x7C52, 0x7C53, 0x7C54,\n    0x7C55, 0x7C56, 0x7C57, 0x7C58, 0x7C59, 0x7C5A, 0x7C5B, 0x7C5D,\n    0x7C5E, 0x7C61, 0x7C62, 0x7C63, 0x7C65, 0x7C66, 0x7C67, 0x7C68,\n    0x7C6B, 0x7C6D, 0x7C6F, 0x7C70, 0x7C71, 0x7C75, 0x7C76, 0x7C77,\n    0x7C78, 0x7C79, 0x7C7A, 0x7C7E, 0x7C7F, 0x7C80, 0x7C81, 0x7C82,\n    0x7C83, 0x7C84, 0x7C85, 0x7C86, 0x7C87, 0x7C88, 0x7C8A, 0x7C8B,\n    0x7C8C, 0x7C8D, 0x7C8E, 0x7C8F, 0x7C90, 0x7C93, 0x7C94, 0x7C96,\n    0x7C99, 0x7C9A, 0x7C9B, 0x7CA0, 0x7CA1, 0x7CA3, 0x7CA6, 0x7CA7,\n    0x7CA8, 0x7CA9, 0x7CAB, 0x7CAC, 0x7CAD, 0x7CAF, 0x7CB0, 0x7CB4,\n    0x7CB5, 0x7CB6, 0x7CB7, 0x7CB8, 0x7CBA, 0x7CBB, 0x7CBF, 0x7CC0,\n    0x7CC2, 0x7CC3, 0x7CC4, 0x7CC6, 0x7CC9, 0x7CCB, 0x7CCE, 0x7CCF,\n    0x7CD0, 0x7CD1, 0x7CD2, 0x7CD3, 0x7CD4, 0x7CD8, 0x7CDA, 0x7CDB,\n    0x7CE1, 0x7CE2, 0x7CE3, 0x7CE4, 0x7CE5, 0x7CE6, 0x7CE9, 0x7CEA,\n    0x7CEB, 0x7CEC, 0x7CED, 0x7CEE, 0x7CF1, 0x7CF3, 0x7CF5, 0x7CF7,\n    0x7CFA, 0x7CFC, 0x7CFD, 0x7CFF, 0x7D01, 0x7D03, 0x7D0C, 0x7D0E,\n    0x7D0F, 0x7D11, 0x7D12, 0x7D16, 0x7D18, 0x7D1D, 0x7D1E, 0x7D1F,\n    0x7D23, 0x7D24, 0x7D25, 0x7D26, 0x7D28, 0x7D29, 0x7D2A, 0x7D2C,\n    0x7D2D, 0x7D2E, 0x7D34, 0x7D35, 0x7D36, 0x7D37, 0x7D38, 0x7D3B,\n    0x7D3D, 0x7D3E, 0x7D41, 0x7D43, 0x7D45, 0x7D47, 0x7D48, 0x7D49,\n    0x7D4A, 0x7D4B, 0x7D4C, 0x7D4D, 0x7D4F, 0x7D51, 0x7D52, 0x7D53,\n    0x7D54, 0x7D55, 0x7D56, 0x7D57, 0x7D58, 0x7D59, 0x7D5A, 0x7D5B,\n    0x7D5C, 0x7D5F, 0x7D60, 0x7D63, 0x7D64, 0x7D65, 0x7D67, 0x7D69,\n    0x7D6A, 0x7D6B, 0x7D6C, 0x7D6D, 0x7D6F, 0x7D70, 0x7D74, 0x7D75,\n    0x7D78, 0x7D7A, 0x7D7B, 0x7D7C, 0x7D7D, 0x7D7E, 0x7D7F, 0x7D80,\n    0x7D82, 0x7D84, 0x7D85, 0x7D87, 0x7D8A, 0x7D8B, 0x7D8C, 0x7D8D,\n    0x7D8E, 0x7D90, 0x7D91, 0x7D92, 0x7D94, 0x7D95, 0x7D96, 0x7D97,\n    0x7D98, 0x7D99, 0x7D9A, 0x7D9B, 0x7D9D, 0x7D9F, 0x7DA0, 0x7DA1,\n    0x7DA4, 0x7DA5, 0x7DA7, 0x7DA8, 0x7DA9, 0x7DAA, 0x7DAF, 0x7DB5,\n    0x7DB6, 0x7DB7, 0x7DBC, 0x7DC0, 0x7DC1, 0x7DC2, 0x7DC3, 0x7DC5,\n    0x7DC6, 0x7DC8, 0x7DC9, 0x7DCC, 0x7DCD, 0x7DCE, 0x7DCF, 0x7DD0,\n    0x7DD3, 0x7DD5, 0x7DD6, 0x7DDA, 0x7DDB, 0x7DDC, 0x7DDF, 0x7DE2,\n    0x7DE4, 0x7DE5, 0x7DE7, 0x7DEA, 0x7DEB, 0x7DED, 0x7DEE, 0x7DF0,\n    0x7DF3, 0x7DF5, 0x7DF7, 0x7DF8, 0x7DFA, 0x7DFC, 0x7DFD, 0x7DFE,\n    0x7DFF, 0x7E00, 0x7E01, 0x7E02, 0x7E03, 0x7E04, 0x7E05, 0x7E06,\n    0x7E07, 0x7E0C, 0x7E0D, 0x7E0E, 0x7E0F, 0x7E12, 0x7E13, 0x7E14,\n    0x7E15, 0x7E16, 0x7E17, 0x7E18, 0x7E19, 0x7E1A, 0x7E1C, 0x7E20,\n    0x7E21, 0x7E22, 0x7E24, 0x7E25, 0x7E26, 0x7E28, 0x7E29, 0x7E2A,\n    0x7E2C, 0x7E2F, 0x7E30, 0x7E33, 0x7E38, 0x7E3A, 0x7E3C, 0x7E3F,\n    0x7E40, 0x7E42, 0x7E43, 0x7E44, 0x7E48, 0x7E49, 0x7E4A, 0x7E4B,\n    0x7E4C, 0x7E4D, 0x7E4E, 0x7E4F, 0x7E50, 0x7E51, 0x7E53, 0x7E56,\n    0x7E57, 0x7E58, 0x7E59, 0x7E5B, 0x7E5C, 0x7E5D, 0x7E5F, 0x7E60,\n    0x7E61, 0x7E63, 0x7E64, 0x7E65, 0x7E66, 0x7E67, 0x7E68, 0x7E6C,\n    0x7E71, 0x7E72, 0x7E74, 0x7E75, 0x7E76, 0x7E77, 0x7E78, 0x7E7A,\n    0x7E7B, 0x7E7F, 0x7E80, 0x7E81, 0x7E83, 0x7E84, 0x7E85, 0x7E86,\n    0x7E87, 0x7E89, 0x7E8B, 0x7E8E, 0x7E90, 0x7E91, 0x7E92, 0x7E95,\n    0x7E97, 0x7E99, 0x7E9A, 0x7E9D, 0x7E9E, 0x7EAE, 0x7EB4, 0x7EBB,\n    0x7EBC, 0x7ED6, 0x7EE4, 0x7EEC, 0x7EF9, 0x7F0A, 0x7F10, 0x7F1E,\n    0x7F37, 0x7F39, 0x7F3B, 0x7F3C, 0x7F3D, 0x7F3E, 0x7F3F, 0x7F40,\n    0x7F41, 0x7F43, 0x7F46, 0x7F47, 0x7F48, 0x7F49, 0x7F4A, 0x7F4B,\n    0x7F4D, 0x7F4F, 0x7F52, 0x7F53, 0x7F56, 0x7F59, 0x7F5B, 0x7F5C,\n    0x7F5D, 0x7F5E, 0x7F60, 0x7F63, 0x7F64, 0x7F65, 0x7F66, 0x7F67,\n    0x7F6B, 0x7F6C, 0x7F6D, 0x7F6F, 0x7F73, 0x7F75, 0x7F76, 0x7F78,\n    0x7F7A, 0x7F7B, 0x7F7C, 0x7F7D, 0x7F7F, 0x7F80, 0x7F82, 0x7F83,\n    0x7F84, 0x7F87, 0x7F89, 0x7F8B, 0x7F8D, 0x7F8F, 0x7F90, 0x7F91,\n    0x7F92, 0x7F93, 0x7F95, 0x7F96, 0x7F97, 0x7F98, 0x7F99, 0x7F9B,\n    0x7F9C, 0x7FA0, 0x7FA2, 0x7FA3, 0x7FA6, 0x7FA8, 0x7FAA, 0x7FAB,\n    0x7FAC, 0x7FAD, 0x7FAE, 0x7FB1, 0x7FB3, 0x7FB4, 0x7FB5, 0x7FB6,\n    0x7FB7, 0x7FBA, 0x7FBB, 0x7FBE, 0x7FC0, 0x7FC2, 0x7FC3, 0x7FC4,\n    0x7FC6, 0x7FC7, 0x7FC8, 0x7FC9, 0x7FCB, 0x7FCD, 0x7FCF, 0x7FD0,\n    0x7FD1, 0x7FD3, 0x7FD6, 0x7FD7, 0x7FD9, 0x7FDA, 0x7FDB, 0x7FDC,\n    0x7FDD, 0x7FDE, 0x7FE2, 0x7FE3, 0x7FE4, 0x7FE7, 0x7FE8, 0x7FEA,\n    0x7FEB, 0x7FEC, 0x7FED, 0x7FEF, 0x7FF2, 0x7FF4, 0x7FF5, 0x7FF6,\n    0x7FF7, 0x7FF8, 0x7FFA, 0x7FFD, 0x7FFE, 0x7FFF, 0x8002, 0x8007,\n    0x8008, 0x8009, 0x800A, 0x800E, 0x800F, 0x8011, 0x8013, 0x801A,\n    0x801B, 0x801D, 0x801E, 0x801F, 0x8021, 0x8023, 0x8024, 0x802B,\n    0x802D, 0x802F, 0x8030, 0x8032, 0x8034, 0x8039, 0x803A, 0x803C,\n    0x803E, 0x8040, 0x8041, 0x8044, 0x8045, 0x8047, 0x8048, 0x8049,\n    0x804E, 0x804F, 0x8050, 0x8051, 0x8053, 0x8055, 0x8057, 0x8059,\n    0x805B, 0x805C, 0x805D, 0x805F, 0x8060, 0x8061, 0x8062, 0x8063,\n    0x8064, 0x8065, 0x8066, 0x8067, 0x8068, 0x806B, 0x806C, 0x806D,\n    0x806E, 0x8074, 0x8078, 0x807A, 0x807B, 0x807C, 0x8081, 0x8082,\n    0x8088, 0x808A, 0x808D, 0x808E, 0x808F, 0x8090, 0x8091, 0x8092,\n    0x8094, 0x8095, 0x8097, 0x8099, 0x809E, 0x80A3, 0x80A6, 0x80A7,\n    0x80A8, 0x80AC, 0x80B0, 0x80B3, 0x80B5, 0x80B6, 0x80B8, 0x80B9,\n    0x80BB, 0x80C5, 0x80C7, 0x80C8, 0x80C9, 0x80CA, 0x80CB, 0x80CF,\n    0x80D0, 0x80D1, 0x80D2, 0x80D3, 0x80D4, 0x80D5, 0x80D8, 0x80DF,\n    0x80E0, 0x80E2, 0x80E3, 0x80E6, 0x80EE, 0x80F5, 0x80F7, 0x80F9,\n    0x80FB, 0x80FE, 0x80FF, 0x8100, 0x8101, 0x8103, 0x8104, 0x8107,\n    0x8108, 0x810B, 0x810C, 0x8115, 0x8117, 0x8119, 0x811C, 0x811D,\n    0x811F, 0x8120, 0x8121, 0x8122, 0x8123, 0x8124, 0x8125, 0x8126,\n    0x8127, 0x8128, 0x8129, 0x812A, 0x812B, 0x812D, 0x812E, 0x8130,\n    0x8133, 0x8134, 0x8135, 0x8137, 0x813A, 0x813B, 0x813C, 0x813D,\n    0x813F, 0x8140, 0x8141, 0x8142, 0x8143, 0x8144, 0x8145, 0x8147,\n    0x8149, 0x814D, 0x814F, 0x8152, 0x8157, 0x8158, 0x815B, 0x815C,\n    0x815D, 0x815E, 0x815F, 0x8162, 0x8163, 0x8164, 0x8168, 0x816A,\n    0x816C, 0x816F, 0x8172, 0x8173, 0x8175, 0x8176, 0x8177, 0x8181,\n    0x8183, 0x8184, 0x8185, 0x8186, 0x8187, 0x8189, 0x818B, 0x818C,\n    0x818D, 0x818E, 0x8190, 0x8192, 0x8193, 0x8194, 0x8195, 0x8196,\n    0x8197, 0x8199, 0x819E, 0x819F, 0x81A1, 0x81A2, 0x81A4, 0x81A5,\n    0x81A7, 0x81AB, 0x81AC, 0x81AD, 0x81AE, 0x81AF, 0x81B0, 0x81B1,\n    0x81B2, 0x81B4, 0x81B5, 0x81B6, 0x81B7, 0x81B8, 0x81B9, 0x81BC,\n    0x81C4, 0x81C5, 0x81C7, 0x81C8, 0x81CB, 0x81CE, 0x81D0, 0x81D1,\n    0x81D2, 0x81D3, 0x81D4, 0x81D5, 0x81D6, 0x81D7, 0x81D9, 0x81DB,\n    0x81DC, 0x81DD, 0x81DE, 0x81E1, 0x81E2, 0x81E4, 0x81E5, 0x81E6,\n    0x81E9, 0x81EB, 0x81EE, 0x81EF, 0x81F0, 0x81F1, 0x81F2, 0x81F5,\n    0x81F6, 0x81F7, 0x81F8, 0x81F9, 0x81FD, 0x81FF, 0x8203, 0x820B,\n    0x820E, 0x820F, 0x8211, 0x8213, 0x8215, 0x8216, 0x8217, 0x8218,\n    0x8219, 0x821A, 0x821D, 0x8220, 0x8224, 0x8225, 0x8226, 0x8227,\n    0x8229, 0x822E, 0x8232, 0x823A, 0x823C, 0x823D, 0x823F, 0x8240,\n    0x8241, 0x8242, 0x8243, 0x8245, 0x8246, 0x8248, 0x824A, 0x824C,\n    0x824D, 0x824E, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255,\n    0x8256, 0x8257, 0x825B, 0x825C, 0x825D, 0x825E, 0x8260, 0x8261,\n    0x8262, 0x8263, 0x8265, 0x8267, 0x8269, 0x826A, 0x826C, 0x826D,\n    0x8275, 0x8276, 0x8278, 0x827B, 0x827C, 0x8280, 0x8281, 0x8283,\n    0x8285, 0x8286, 0x8287, 0x8289, 0x828C, 0x8290, 0x8293, 0x8294,\n    0x8295, 0x8296, 0x829A, 0x829B, 0x829E, 0x82A0, 0x82A2, 0x82A3,\n    0x82A7, 0x82B2, 0x82B5, 0x82B6, 0x82BA, 0x82BC, 0x82BF, 0x82C0,\n    0x82C2, 0x82C3, 0x82C5, 0x82C6, 0x82C9, 0x82D0, 0x82D6, 0x82D9,\n    0x82DA, 0x82DD, 0x82E2, 0x82E8, 0x82E9, 0x82EA, 0x82EC, 0x82ED,\n    0x82EE, 0x82F0, 0x82F2, 0x82F3, 0x82F5, 0x82F6, 0x82F8, 0x82FA,\n    0x82FC, 0x82FD, 0x82FE, 0x82FF, 0x8300, 0x830A, 0x830B, 0x830D,\n    0x8310, 0x8312, 0x8313, 0x8316, 0x8318, 0x8319, 0x831D, 0x831E,\n    0x831F, 0x8320, 0x8321, 0x8322, 0x8323, 0x8324, 0x8325, 0x8326,\n    0x8329, 0x832A, 0x832E, 0x8330, 0x8332, 0x8337, 0x833B, 0x833D,\n    0x833E, 0x833F, 0x8341, 0x8342, 0x8344, 0x8345, 0x8348, 0x834A,\n    0x834B, 0x834C, 0x834D, 0x834E, 0x8353, 0x8355, 0x8356, 0x8357,\n    0x8358, 0x8359, 0x835D, 0x8362, 0x8370, 0x8371, 0x8372, 0x8373,\n    0x8374, 0x8375, 0x8376, 0x8379, 0x837A, 0x837E, 0x837F, 0x8380,\n    0x8381, 0x8382, 0x8383, 0x8384, 0x8387, 0x8388, 0x838B, 0x838C,\n    0x838D, 0x838F, 0x8390, 0x8391, 0x8394, 0x8395, 0x8397, 0x8399,\n    0x839A, 0x839D, 0x839F, 0x83A1, 0x83A3, 0x83A4, 0x83A5, 0x83A6,\n    0x83AC, 0x83AD, 0x83AE, 0x83AF, 0x83B5, 0x83BB, 0x83BE, 0x83BF,\n    0x83C2, 0x83C3, 0x83C4, 0x83C6, 0x83C8, 0x83C9, 0x83CB, 0x83CD,\n    0x83CE, 0x83D0, 0x83D1, 0x83D2, 0x83D3, 0x83D5, 0x83D7, 0x83D9,\n    0x83DA, 0x83DB, 0x83DE, 0x83E2, 0x83E3, 0x83E4, 0x83E6, 0x83E7,\n    0x83E8, 0x83EB, 0x83EC, 0x83ED, 0x83EE, 0x83F3, 0x83F4, 0x83F5,\n    0x83F6, 0x83F7, 0x83FA, 0x83FB, 0x83FC, 0x83FE, 0x83FF, 0x8400,\n    0x8402, 0x8405, 0x8408, 0x8409, 0x8410, 0x8412, 0x8413, 0x8414,\n    0x8415, 0x8416, 0x8417, 0x8419, 0x841A, 0x841B, 0x841E, 0x841F,\n    0x8420, 0x8421, 0x8422, 0x8423, 0x8429, 0x842A, 0x842B, 0x842D,\n    0x842E, 0x842F, 0x8430, 0x8432, 0x8433, 0x8434, 0x8436, 0x8437,\n    0x8439, 0x843A, 0x843B, 0x843E, 0x843F, 0x8440, 0x8441, 0x8442,\n    0x8443, 0x8444, 0x8445, 0x8447, 0x8448, 0x844A, 0x844B, 0x844C,\n    0x844D, 0x844E, 0x844F, 0x8450, 0x8453, 0x8454, 0x8455, 0x8456,\n    0x8458, 0x845D, 0x845E, 0x845F, 0x8460, 0x8462, 0x8465, 0x8467,\n    0x8468, 0x846A, 0x846E, 0x8470, 0x8472, 0x8474, 0x8479, 0x847B,\n    0x847C, 0x847D, 0x847E, 0x847F, 0x8480, 0x8481, 0x8483, 0x8484,\n    0x8485, 0x8486, 0x848A, 0x848D, 0x848F, 0x8490, 0x8491, 0x8492,\n    0x8495, 0x8496, 0x8498, 0x849A, 0x849B, 0x849D, 0x849E, 0x849F,\n    0x84A0, 0x84A2, 0x84A3, 0x84A4, 0x84A5, 0x84A6, 0x84A7, 0x84A8,\n    0x84A9, 0x84AA, 0x84AB, 0x84AC, 0x84AD, 0x84AE, 0x84B0, 0x84B1,\n    0x84B3, 0x84B5, 0x84B6, 0x84B7, 0x84BB, 0x84BE, 0x84C2, 0x84C3,\n    0x84C5, 0x84C6, 0x84C7, 0x84C8, 0x84CC, 0x84CE, 0x84CF, 0x84D2,\n    0x84D4, 0x84D5, 0x84D7, 0x84D8, 0x84D9, 0x84DA, 0x84DB, 0x84DC,\n    0x84DE, 0x84E1, 0x84E2, 0x84E4, 0x84E7, 0x84E8, 0x84E9, 0x84EA,\n    0x84EB, 0x84ED, 0x84F1, 0x84F2, 0x84F3, 0x84F4, 0x84F5, 0x84F6,\n    0x84F7, 0x84F8, 0x84F9, 0x84FA, 0x84FB, 0x84FE, 0x8500, 0x8501,\n    0x8502, 0x8503, 0x8504, 0x8505, 0x8506, 0x8507, 0x8508, 0x8509,\n    0x850A, 0x850B, 0x850D, 0x850E, 0x850F, 0x8510, 0x8512, 0x8515,\n    0x8516, 0x8518, 0x8519, 0x851B, 0x851C, 0x851D, 0x8520, 0x8522,\n    0x8524, 0x8525, 0x8527, 0x8528, 0x8529, 0x852A, 0x852E, 0x852F,\n    0x8530, 0x8531, 0x8532, 0x8533, 0x8534, 0x8535, 0x8536, 0x853E,\n    0x853F, 0x8540, 0x8542, 0x8544, 0x8545, 0x8547, 0x854B, 0x854C,\n    0x854D, 0x854F, 0x8550, 0x8551, 0x8554, 0x8557, 0x855A, 0x855B,\n    0x855C, 0x855D, 0x855F, 0x8560, 0x8561, 0x8563, 0x8565, 0x8566,\n    0x8567, 0x856B, 0x856C, 0x856E, 0x856F, 0x8570, 0x8571, 0x8573,\n    0x8575, 0x8576, 0x8578, 0x857C, 0x857D, 0x857F, 0x8580, 0x8581,\n    0x8582, 0x8583, 0x8586, 0x8589, 0x858B, 0x858D, 0x858E, 0x8590,\n    0x8592, 0x8593, 0x8595, 0x8596, 0x8597, 0x8598, 0x8599, 0x859A,\n    0x859D, 0x859E, 0x85A0, 0x85A1, 0x85A2, 0x85A3, 0x85A5, 0x85A7,\n    0x85AB, 0x85AC, 0x85AD, 0x85B1, 0x85B2, 0x85B3, 0x85B4, 0x85B5,\n    0x85B6, 0x85B8, 0x85BB, 0x85BC, 0x85BD, 0x85BE, 0x85BF, 0x85C0,\n    0x85C2, 0x85C3, 0x85C4, 0x85C5, 0x85C6, 0x85C7, 0x85C8, 0x85CA,\n    0x85CB, 0x85CC, 0x85D1, 0x85D2, 0x85D4, 0x85D6, 0x85D7, 0x85D8,\n    0x85D9, 0x85DA, 0x85DB, 0x85DE, 0x85DF, 0x85E0, 0x85E1, 0x85E2,\n    0x85E3, 0x85E6, 0x85E7, 0x85E8, 0x85EB, 0x85EC, 0x85ED, 0x85EE,\n    0x85EF, 0x85F0, 0x85F1, 0x85F2, 0x85F3, 0x85F5, 0x85F7, 0x85F8,\n    0x85FC, 0x85FD, 0x85FE, 0x8600, 0x8601, 0x8602, 0x8603, 0x8608,\n    0x8609, 0x860A, 0x860C, 0x860D, 0x860E, 0x860F, 0x8610, 0x8612,\n    0x8613, 0x8614, 0x8615, 0x8617, 0x8618, 0x8619, 0x861B, 0x861C,\n    0x861D, 0x861F, 0x8620, 0x8621, 0x8623, 0x8624, 0x8625, 0x8626,\n    0x8628, 0x862A, 0x862B, 0x862C, 0x862E, 0x862F, 0x8630, 0x8631,\n    0x8632, 0x8633, 0x8634, 0x8635, 0x8636, 0x8637, 0x8639, 0x863B,\n    0x863D, 0x863E, 0x8640, 0x8641, 0x8642, 0x8643, 0x8644, 0x8645,\n    0x8646, 0x8647, 0x8648, 0x8649, 0x864A, 0x864B, 0x864C, 0x8652,\n    0x8653, 0x8656, 0x8657, 0x8658, 0x8659, 0x865B, 0x865D, 0x8660,\n    0x8661, 0x8663, 0x8664, 0x8665, 0x8666, 0x8668, 0x8669, 0x866A,\n    0x866D, 0x866F, 0x8670, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676,\n    0x8677, 0x8678, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688,\n    0x8689, 0x868E, 0x868F, 0x8690, 0x8691, 0x8692, 0x8694, 0x8696,\n    0x8697, 0x8698, 0x8699, 0x869A, 0x869B, 0x869E, 0x869F, 0x86A0,\n    0x86A1, 0x86A2, 0x86A5, 0x86A6, 0x86AB, 0x86AD, 0x86AE, 0x86B2,\n    0x86B3, 0x86B7, 0x86B8, 0x86B9, 0x86BB, 0x86BC, 0x86BD, 0x86BE,\n    0x86BF, 0x86C1, 0x86C2, 0x86C3, 0x86C5, 0x86C8, 0x86CC, 0x86CD,\n    0x86D2, 0x86D3, 0x86D5, 0x86D6, 0x86D7, 0x86DA, 0x86DC, 0x86DD,\n    0x86E0, 0x86E1, 0x86E2, 0x86E3, 0x86E5, 0x86E6, 0x86E7, 0x86E8,\n    0x86EA, 0x86EB, 0x86EC, 0x86EF, 0x86F5, 0x86F6, 0x86F7, 0x86FB,\n    0x86FC, 0x86FD, 0x86FF, 0x8701, 0x8704, 0x8705, 0x870B, 0x870C,\n    0x870E, 0x870F, 0x8710, 0x8711, 0x8714, 0x8716, 0x8719, 0x871B,\n    0x871D, 0x871F, 0x8720, 0x8724, 0x8726, 0x8727, 0x8728, 0x872A,\n    0x872B, 0x872C, 0x872D, 0x872F, 0x8730, 0x8732, 0x8733, 0x8735,\n    0x8736, 0x8738, 0x8739, 0x873A, 0x873C, 0x873D, 0x8740, 0x8741,\n    0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x874A, 0x874B, 0x874D,\n    0x874F, 0x8750, 0x8751, 0x8752, 0x8754, 0x8756, 0x8758, 0x875A,\n    0x875B, 0x875C, 0x875D, 0x875E, 0x875F, 0x8761, 0x8762, 0x8767,\n    0x8768, 0x8769, 0x876A, 0x876B, 0x876C, 0x876D, 0x876F, 0x8771,\n    0x8772, 0x8773, 0x8775, 0x8777, 0x8779, 0x877A, 0x877F, 0x8780,\n    0x8781, 0x8786, 0x8787, 0x8789, 0x878A, 0x878C, 0x878E, 0x878F,\n    0x8790, 0x8791, 0x8792, 0x8794, 0x8795, 0x8796, 0x8798, 0x8799,\n    0x879A, 0x879B, 0x879C, 0x879D, 0x87A0, 0x87A1, 0x87A3, 0x87A4,\n    0x87A5, 0x87A6, 0x87A7, 0x87A9, 0x87AA, 0x87AE, 0x87B0, 0x87B1,\n    0x87B2, 0x87B4, 0x87B6, 0x87B7, 0x87B8, 0x87B9, 0x87BC, 0x87BE,\n    0x87BF, 0x87C1, 0x87C2, 0x87C3, 0x87C5, 0x87C7, 0x87C9, 0x87CC,\n    0x87CD, 0x87CF, 0x87D0, 0x87D4, 0x87D5, 0x87D6, 0x87D7, 0x87D8,\n    0x87D9, 0x87DA, 0x87DC, 0x87DD, 0x87DE, 0x87DF, 0x87E1, 0x87E2,\n    0x87E4, 0x87E6, 0x87E7, 0x87E8, 0x87E9, 0x87EB, 0x87ED, 0x87F0,\n    0x87F1, 0x87F3, 0x87F4, 0x87F5, 0x87F7, 0x87F8, 0x87FA, 0x87FC,\n    0x87FD, 0x87FF, 0x8800, 0x8801, 0x8802, 0x8804, 0x8807, 0x8808,\n    0x8809, 0x880B, 0x880C, 0x880D, 0x880E, 0x880F, 0x8812, 0x8814,\n    0x8817, 0x8818, 0x8819, 0x881A, 0x881C, 0x881D, 0x881E, 0x8820,\n    0x8824, 0x8825, 0x8826, 0x8827, 0x8828, 0x8829, 0x882A, 0x882B,\n    0x882C, 0x882D, 0x882E, 0x882F, 0x8830, 0x8833, 0x8834, 0x8835,\n    0x8837, 0x8838, 0x883A, 0x883D, 0x883E, 0x883F, 0x8841, 0x8842,\n    0x8843, 0x8847, 0x8848, 0x8849, 0x884B, 0x884E, 0x884F, 0x8850,\n    0x8851, 0x8852, 0x8855, 0x8856, 0x8858, 0x885A, 0x885C, 0x885E,\n    0x885F, 0x8860, 0x8866, 0x8867, 0x886A, 0x886D, 0x886F, 0x8871,\n    0x8873, 0x8874, 0x8875, 0x8876, 0x8878, 0x887A, 0x887B, 0x887C,\n    0x8880, 0x8883, 0x8886, 0x8887, 0x8889, 0x888A, 0x888C, 0x888E,\n    0x888F, 0x8890, 0x8891, 0x8893, 0x8894, 0x8895, 0x8897, 0x8898,\n    0x8899, 0x889A, 0x889B, 0x889D, 0x889E, 0x889F, 0x88A0, 0x88A1,\n    0x88A3, 0x88A5, 0x88A6, 0x88A7, 0x88A8, 0x88A9, 0x88AA, 0x88AC,\n    0x88AE, 0x88AF, 0x88B0, 0x88B2, 0x88B3, 0x88B4, 0x88B5, 0x88B6,\n    0x88B8, 0x88B9, 0x88BA, 0x88BB, 0x88BD, 0x88BE, 0x88BF, 0x88C0,\n    0x88C3, 0x88C4, 0x88C7, 0x88C8, 0x88CB, 0x88CC, 0x88CD, 0x88D0,\n    0x88D1, 0x88D3, 0x88D6, 0x88D7, 0x88DA, 0x88DB, 0x88DE, 0x88E0,\n    0x88E1, 0x88E6, 0x88E7, 0x88E9, 0x88EA, 0x88EB, 0x88EC, 0x88ED,\n    0x88EE, 0x88EF, 0x88F2, 0x88F5, 0x88F6, 0x88F7, 0x88FA, 0x88FB,\n    0x88FF, 0x8900, 0x8901, 0x8903, 0x8904, 0x8905, 0x8906, 0x8908,\n    0x8909, 0x890B, 0x890C, 0x890D, 0x890E, 0x890F, 0x8911, 0x8914,\n    0x8915, 0x8916, 0x8917, 0x8918, 0x891C, 0x891D, 0x891E, 0x891F,\n    0x8920, 0x8922, 0x8923, 0x8924, 0x8926, 0x8927, 0x8928, 0x8929,\n    0x892C, 0x892D, 0x892E, 0x892F, 0x8931, 0x8935, 0x8937, 0x8939,\n    0x893A, 0x893C, 0x893D, 0x893E, 0x893F, 0x8940, 0x8942, 0x8943,\n    0x8945, 0x8946, 0x8948, 0x8949, 0x894A, 0x894B, 0x894C, 0x894D,\n    0x894E, 0x894F, 0x8950, 0x8951, 0x8952, 0x8953, 0x8954, 0x8955,\n    0x8957, 0x8958, 0x8959, 0x895A, 0x895B, 0x895C, 0x8961, 0x8962,\n    0x8963, 0x8965, 0x8967, 0x8968, 0x8969, 0x896B, 0x896D, 0x896E,\n    0x8970, 0x8971, 0x8973, 0x8974, 0x8975, 0x8976, 0x8977, 0x8978,\n    0x8979, 0x897A, 0x897C, 0x897D, 0x897E, 0x8980, 0x8982, 0x8984,\n    0x8985, 0x8987, 0x8988, 0x8989, 0x898A, 0x898C, 0x898D, 0x898E,\n    0x8990, 0x8991, 0x8992, 0x8994, 0x8995, 0x8997, 0x8999, 0x899A,\n    0x899B, 0x899C, 0x899D, 0x899E, 0x899F, 0x89A0, 0x89A2, 0x89A3,\n    0x89A4, 0x89A5, 0x89A7, 0x89A8, 0x89A9, 0x89AB, 0x89AD, 0x89AE,\n    0x89B0, 0x89B1, 0x89B3, 0x89B4, 0x89B5, 0x89B6, 0x89B8, 0x89B9,\n    0x89BB, 0x89BC, 0x89BE, 0x89C3, 0x89CD, 0x89D3, 0x89D4, 0x89D5,\n    0x89D7, 0x89D8, 0x89D9, 0x89DB, 0x89DD, 0x89DF, 0x89E0, 0x89E1,\n    0x89E2, 0x89E4, 0x89E7, 0x89E8, 0x89E9, 0x89EA, 0x89EC, 0x89ED,\n    0x89EE, 0x89F0, 0x89F1, 0x89F2, 0x89F5, 0x89F7, 0x89F9, 0x89FA,\n    0x89FB, 0x89FC, 0x89FD, 0x89FE, 0x89FF, 0x8A04, 0x8A05, 0x8A06,\n    0x8A09, 0x8A0B, 0x8A0D, 0x8A0F, 0x8A11, 0x8A12, 0x8A14, 0x8A17,\n    0x8A19, 0x8A1A, 0x8A1C, 0x8A1E, 0x8A20, 0x8A21, 0x8A22, 0x8A24,\n    0x8A26, 0x8A27, 0x8A28, 0x8A29, 0x8A2B, 0x8A2C, 0x8A2E, 0x8A2F,\n    0x8A30, 0x8A32, 0x8A33, 0x8A35, 0x8A37, 0x8A38, 0x8A39, 0x8A3B,\n    0x8A3C, 0x8A3D, 0x8A3F, 0x8A40, 0x8A42, 0x8A43, 0x8A44, 0x8A45,\n    0x8A47, 0x8A49, 0x8A4A, 0x8A4B, 0x8A4C, 0x8A4D, 0x8A4F, 0x8A51,\n    0x8A53, 0x8A56, 0x8A57, 0x8A59, 0x8A5A, 0x8A5C, 0x8A5D, 0x8A5F,\n    0x8A60, 0x8A64, 0x8A65, 0x8A67, 0x8A68, 0x8A6A, 0x8A6F, 0x8A74,\n    0x8A76, 0x8A77, 0x8A78, 0x8A7A, 0x8A7B, 0x8A7D, 0x8A7E, 0x8A80,\n    0x8A81, 0x8A82, 0x8A83, 0x8A88, 0x8A8B, 0x8A8C, 0x8A8E, 0x8A8F,\n    0x8A90, 0x8A94, 0x8A96, 0x8A97, 0x8A99, 0x8A9B, 0x8A9C, 0x8A9D,\n    0x8A9F, 0x8AA2, 0x8AA7, 0x8AA9, 0x8AAA, 0x8AAB, 0x8AAD, 0x8AAE,\n    0x8AAF, 0x8AB1, 0x8AB3, 0x8AB4, 0x8AB5, 0x8AB7, 0x8AB8, 0x8ABA,\n    0x8ABB, 0x8ABD, 0x8ABE, 0x8AC0, 0x8AC1, 0x8AC3, 0x8AC5, 0x8AC6,\n    0x8AC8, 0x8ACA, 0x8ACC, 0x8ACE, 0x8AD0, 0x8AD3, 0x8AD4, 0x8AD5,\n    0x8AD8, 0x8AD9, 0x8ADA, 0x8ADD, 0x8ADF, 0x8AE0, 0x8AE1, 0x8AE3,\n    0x8AE5, 0x8AE8, 0x8AE9, 0x8AEA, 0x8AEC, 0x8AEF, 0x8AF0, 0x8AF2,\n    0x8AF4, 0x8AF5, 0x8AF9, 0x8AFB, 0x8AFD, 0x8AFF, 0x8B03, 0x8B06,\n    0x8B08, 0x8B09, 0x8B0B, 0x8B0C, 0x8B0D, 0x8B0F, 0x8B11, 0x8B12,\n    0x8B13, 0x8B15, 0x8B18, 0x8B1C, 0x8B1E, 0x8B1F, 0x8B20, 0x8B22,\n    0x8B23, 0x8B24, 0x8B25, 0x8B27, 0x8B29, 0x8B2A, 0x8B2E, 0x8B2F,\n    0x8B30, 0x8B31, 0x8B32, 0x8B34, 0x8B35, 0x8B36, 0x8B37, 0x8B38,\n    0x8B3A, 0x8B3B, 0x8B3C, 0x8B3D, 0x8B3F, 0x8B40, 0x8B41, 0x8B42,\n    0x8B43, 0x8B44, 0x8B45, 0x8B46, 0x8B47, 0x8B48, 0x8B4A, 0x8B4B,\n    0x8B4C, 0x8B4D, 0x8B50, 0x8B51, 0x8B52, 0x8B53, 0x8B54, 0x8B55,\n    0x8B57, 0x8B5B, 0x8B5D, 0x8B5E, 0x8B5F, 0x8B60, 0x8B61, 0x8B62,\n    0x8B63, 0x8B64, 0x8B65, 0x8B67, 0x8B68, 0x8B69, 0x8B6A, 0x8B6D,\n    0x8B6E, 0x8B71, 0x8B72, 0x8B73, 0x8B75, 0x8B76, 0x8B78, 0x8B79,\n    0x8B7A, 0x8B7B, 0x8B7C, 0x8B7E, 0x8B7F, 0x8B81, 0x8B82, 0x8B83,\n    0x8B84, 0x8B85, 0x8B86, 0x8B87, 0x8B88, 0x8B89, 0x8B8B, 0x8B8C,\n    0x8B8D, 0x8B8F, 0x8B90, 0x8B91, 0x8B94, 0x8B97, 0x8B98, 0x8B99,\n    0x8B9A, 0x8B9B, 0x8B9D, 0x8B9F, 0x8BAC, 0x8BB1, 0x8BBB, 0x8BC7,\n    0x8BD0, 0x8BEA, 0x8C09, 0x8C1E, 0x8C38, 0x8C39, 0x8C3A, 0x8C3B,\n    0x8C3C, 0x8C3D, 0x8C3E, 0x8C3F, 0x8C40, 0x8C42, 0x8C43, 0x8C44,\n    0x8C45, 0x8C4A, 0x8C4B, 0x8C4D, 0x8C4E, 0x8C4F, 0x8C51, 0x8C52,\n    0x8C53, 0x8C54, 0x8C56, 0x8C57, 0x8C58, 0x8C59, 0x8C5B, 0x8C5C,\n    0x8C5D, 0x8C5E, 0x8C5F, 0x8C60, 0x8C63, 0x8C64, 0x8C65, 0x8C66,\n    0x8C67, 0x8C68, 0x8C69, 0x8C6C, 0x8C6D, 0x8C6E, 0x8C6F, 0x8C70,\n    0x8C71, 0x8C72, 0x8C74, 0x8C75, 0x8C76, 0x8C77, 0x8C7B, 0x8C7C,\n    0x8C7D, 0x8C7E, 0x8C7F, 0x8C80, 0x8C81, 0x8C83, 0x8C84, 0x8C86,\n    0x8C87, 0x8C88, 0x8C8B, 0x8C8D, 0x8C8E, 0x8C8F, 0x8C90, 0x8C91,\n    0x8C92, 0x8C93, 0x8C95, 0x8C96, 0x8C97, 0x8C99, 0x8C9A, 0x8C9B,\n    0x8C9C, 0x8C9F, 0x8CA3, 0x8CA4, 0x8CA5, 0x8CA6, 0x8CAD, 0x8CAE,\n    0x8CB1, 0x8CB5, 0x8CB9, 0x8CBE, 0x8CC6, 0x8CC9, 0x8CCB, 0x8CCC,\n    0x8CCD, 0x8CCE, 0x8CCF, 0x8CD0, 0x8CD4, 0x8CD6, 0x8CD7, 0x8CD8,\n    0x8CD9, 0x8CDB, 0x8CDD, 0x8CDF, 0x8CE5, 0x8CE8, 0x8CE9, 0x8CEE,\n    0x8CEF, 0x8CF0, 0x8CF1, 0x8CF2, 0x8CF3, 0x8CF5, 0x8CF6, 0x8CF7,\n    0x8CF8, 0x8CF9, 0x8CFF, 0x8D00, 0x8D01, 0x8D02, 0x8D03, 0x8D06,\n    0x8D07, 0x8D09, 0x8D0C, 0x8D0E, 0x8D11, 0x8D12, 0x8D13, 0x8D14,\n    0x8D15, 0x8D17, 0x8D18, 0x8D19, 0x8D1A, 0x8D20, 0x8D51, 0x8D52,\n    0x8D57, 0x8D5F, 0x8D65, 0x8D68, 0x8D69, 0x8D6A, 0x8D6C, 0x8D6E,\n    0x8D6F, 0x8D71, 0x8D72, 0x8D78, 0x8D79, 0x8D7A, 0x8D7B, 0x8D7C,\n    0x8D7D, 0x8D7E, 0x8D7F, 0x8D80, 0x8D82, 0x8D83, 0x8D86, 0x8D87,\n    0x8D88, 0x8D89, 0x8D8C, 0x8D8D, 0x8D8E, 0x8D8F, 0x8D90, 0x8D92,\n    0x8D93, 0x8D96, 0x8D97, 0x8D98, 0x8D9A, 0x8D9B, 0x8D9C, 0x8D9D,\n    0x8D9E, 0x8DA0, 0x8DA1, 0x8DA2, 0x8DA4, 0x8DA5, 0x8DA6, 0x8DA7,\n    0x8DA9, 0x8DAA, 0x8DAB, 0x8DAC, 0x8DAD, 0x8DAE, 0x8DAF, 0x8DB0,\n    0x8DB6, 0x8DB7, 0x8DB9, 0x8DBB, 0x8DBD, 0x8DC0, 0x8DC1, 0x8DC2,\n    0x8DC5, 0x8DC7, 0x8DC8, 0x8DC9, 0x8DCA, 0x8DCD, 0x8DD0, 0x8DD2,\n    0x8DD3, 0x8DD4, 0x8DD5, 0x8DD8, 0x8DD9, 0x8DDC, 0x8DE0, 0x8DE1,\n    0x8DE2, 0x8DE5, 0x8DE6, 0x8DE7, 0x8DE9, 0x8DED, 0x8DEE, 0x8DF0,\n    0x8DF1, 0x8DF2, 0x8DF4, 0x8DF6, 0x8DFC, 0x8DFE, 0x8DFF, 0x8E00,\n    0x8E01, 0x8E02, 0x8E03, 0x8E04, 0x8E06, 0x8E07, 0x8E08, 0x8E0B,\n    0x8E0D, 0x8E0E, 0x8E11, 0x8E12, 0x8E13, 0x8E15, 0x8E16, 0x8E17,\n    0x8E18, 0x8E19, 0x8E1A, 0x8E1B, 0x8E1C, 0x8E20, 0x8E21, 0x8E24,\n    0x8E25, 0x8E26, 0x8E27, 0x8E28, 0x8E2B, 0x8E2D, 0x8E30, 0x8E32,\n    0x8E33, 0x8E36, 0x8E37, 0x8E38, 0x8E3B, 0x8E3C, 0x8E3E, 0x8E3F,\n    0x8E43, 0x8E45, 0x8E46, 0x8E4D, 0x8E4E, 0x8E4F, 0x8E50, 0x8E53,\n    0x8E54, 0x8E56, 0x8E57, 0x8E58, 0x8E5A, 0x8E5B, 0x8E5C, 0x8E5D,\n    0x8E5E, 0x8E5F, 0x8E60, 0x8E61, 0x8E62, 0x8E64, 0x8E65, 0x8E67,\n    0x8E68, 0x8E6A, 0x8E6B, 0x8E6E, 0x8E71, 0x8E73, 0x8E75, 0x8E77,\n    0x8E78, 0x8E79, 0x8E7B, 0x8E7D, 0x8E7E, 0x8E80, 0x8E82, 0x8E83,\n    0x8E84, 0x8E86, 0x8E88, 0x8E8C, 0x8E8E, 0x8E95, 0x8E96, 0x8E97,\n    0x8E98, 0x8E99, 0x8E9B, 0x8E9D, 0x8E9F, 0x8EA0, 0x8EA2, 0x8EA3,\n    0x8EA4, 0x8EA7, 0x8EA8, 0x8EA9, 0x8EAD, 0x8EAE, 0x8EB0, 0x8EB1,\n    0x8EB3, 0x8EB4, 0x8EB5, 0x8EB6, 0x8EB7, 0x8EB8, 0x8EB9, 0x8EBB,\n    0x8EBC, 0x8EBD, 0x8EBE, 0x8EBF, 0x8EC1, 0x8EC2, 0x8EC3, 0x8EC4,\n    0x8EC5, 0x8EC6, 0x8EC7, 0x8EC8, 0x8EC9, 0x8ECF, 0x8ED0, 0x8ED1,\n    0x8ED3, 0x8ED5, 0x8ED6, 0x8ED7, 0x8ED8, 0x8ED9, 0x8EDA, 0x8EDC,\n    0x8EDD, 0x8EDE, 0x8EE0, 0x8EE1, 0x8EE2, 0x8EE3, 0x8EE5, 0x8EE6,\n    0x8EE7, 0x8EE8, 0x8EE9, 0x8EEA, 0x8EEC, 0x8EED, 0x8EEE, 0x8EEF,\n    0x8EF0, 0x8EF1, 0x8EF3, 0x8EF4, 0x8EF5, 0x8EF6, 0x8EF7, 0x8EFD,\n    0x8EFF, 0x8F00, 0x8F01, 0x8F02, 0x8F04, 0x8F06, 0x8F08, 0x8F0B,\n    0x8F0C, 0x8F0D, 0x8F0E, 0x8F0F, 0x8F10, 0x8F11, 0x8F13, 0x8F16,\n    0x8F17, 0x8F18, 0x8F19, 0x8F1A, 0x8F20, 0x8F21, 0x8F22, 0x8F23,\n    0x8F24, 0x8F27, 0x8F28, 0x8F2B, 0x8F2C, 0x8F2D, 0x8F2E, 0x8F30,\n    0x8F31, 0x8F32, 0x8F34, 0x8F35, 0x8F36, 0x8F37, 0x8F39, 0x8F3A,\n    0x8F3C, 0x8F3D, 0x8F40, 0x8F41, 0x8F43, 0x8F47, 0x8F48, 0x8F4A,\n    0x8F4B, 0x8F4C, 0x8F4F, 0x8F50, 0x8F51, 0x8F52, 0x8F53, 0x8F55,\n    0x8F56, 0x8F57, 0x8F58, 0x8F59, 0x8F5A, 0x8F5B, 0x8F5C, 0x8F5D,\n    0x8F5E, 0x8F60, 0x8F63, 0x8F65, 0x8F6A, 0x8F80, 0x8F8C, 0x8F92,\n    0x8F9D, 0x8FA0, 0x8FA1, 0x8FA2, 0x8FA4, 0x8FA5, 0x8FA7, 0x8FAA,\n    0x8FAC, 0x8FB3, 0x8FB4, 0x8FB5, 0x8FB7, 0x8FB8, 0x8FBA, 0x8FBB,\n    0x8FBC, 0x8FBF, 0x8FC0, 0x8FC3, 0x8FC6, 0x8FC9, 0x8FCA, 0x8FCB,\n    0x8FCC, 0x8FCD, 0x8FCF, 0x8FD2, 0x8FD6, 0x8FD7, 0x8FDA, 0x8FE0,\n    0x8FE1, 0x8FE3, 0x8FE7, 0x8FEC, 0x8FEF, 0x8FF1, 0x8FF2, 0x8FF5,\n    0x8FF6, 0x8FFA, 0x8FFB, 0x8FFC, 0x8FFE, 0x8FFF, 0x9007, 0x9008,\n    0x900C, 0x900E, 0x9013, 0x9018, 0x901C, 0x9024, 0x9025, 0x9027,\n    0x9028, 0x9029, 0x902A, 0x902B, 0x902C, 0x9030, 0x9031, 0x9033,\n    0x9034, 0x9037, 0x9039, 0x903A, 0x903D, 0x903F, 0x9040, 0x9043,\n    0x9045, 0x9046, 0x9048, 0x9049, 0x904A, 0x904C, 0x9056, 0x9059,\n    0x905A, 0x905D, 0x905F, 0x9061, 0x9064, 0x9066, 0x9067, 0x906A,\n    0x906B, 0x906C, 0x906F, 0x9070, 0x9071, 0x9073, 0x9076, 0x9079,\n    0x907B, 0x907E, 0x9085, 0x9086, 0x9089, 0x908C, 0x908D, 0x908E,\n    0x9092, 0x9094, 0x9096, 0x9098, 0x909A, 0x909C, 0x909E, 0x909F,\n    0x90A0, 0x90A4, 0x90A5, 0x90A7, 0x90A8, 0x90A9, 0x90AB, 0x90AD,\n    0x90B2, 0x90B7, 0x90BC, 0x90BD, 0x90BF, 0x90C0, 0x90C2, 0x90C3,\n    0x90C6, 0x90C8, 0x90C9, 0x90CB, 0x90CC, 0x90CD, 0x90D2, 0x90D4,\n    0x90D5, 0x90D6, 0x90D8, 0x90D9, 0x90DA, 0x90DE, 0x90E0, 0x90E3,\n    0x90E4, 0x90E5, 0x90E9, 0x90EA, 0x90EC, 0x90EE, 0x90F0, 0x90F1,\n    0x90F2, 0x90F3, 0x90F6, 0x90F7, 0x90F9, 0x90FA, 0x90FB, 0x90FC,\n    0x90FF, 0x9100, 0x9101, 0x9103, 0x9105, 0x9107, 0x9108, 0x910A,\n    0x910B, 0x910C, 0x910D, 0x910E, 0x910F, 0x9110, 0x9111, 0x9113,\n    0x9115, 0x9117, 0x9118, 0x911A, 0x911B, 0x911C, 0x911D, 0x911F,\n    0x9120, 0x9121, 0x9124, 0x9125, 0x9126, 0x9128, 0x9129, 0x912A,\n    0x912B, 0x912C, 0x912E, 0x9133, 0x9135, 0x9137, 0x9138, 0x913B,\n    0x913C, 0x913D, 0x913E, 0x913F, 0x9140, 0x9141, 0x9142, 0x9144,\n    0x9145, 0x9147, 0x9151, 0x9153, 0x9154, 0x9155, 0x9156, 0x9158,\n    0x9159, 0x915B, 0x915C, 0x915F, 0x9160, 0x9166, 0x9167, 0x9168,\n    0x916B, 0x916D, 0x9173, 0x917A, 0x917B, 0x917C, 0x9180, 0x9181,\n    0x9182, 0x9183, 0x9184, 0x9186, 0x9188, 0x918A, 0x918E, 0x918F,\n    0x9193, 0x9194, 0x9195, 0x9197, 0x9198, 0x9199, 0x919D, 0x919E,\n    0x919F, 0x91A0, 0x91A1, 0x91A4, 0x91A5, 0x91A6, 0x91A7, 0x91A8,\n    0x91A9, 0x91B0, 0x91B1, 0x91B2, 0x91B3, 0x91B6, 0x91B7, 0x91B8,\n    0x91B9, 0x91BB, 0x91BC, 0x91BD, 0x91BE, 0x91BF, 0x91C2, 0x91C4,\n    0x91C6, 0x91C8, 0x91D0, 0x91D6, 0x91DA, 0x91DB, 0x91DE, 0x91DF,\n    0x91E0, 0x91E1, 0x91E2, 0x91E5, 0x91E6, 0x91E8, 0x91EA, 0x91EB,\n    0x91EC, 0x91ED, 0x91EE, 0x91EF, 0x91F0, 0x91F1, 0x91F2, 0x91F3,\n    0x91F4, 0x91F6, 0x91F8, 0x91FB, 0x91FC, 0x91FD, 0x91FE, 0x91FF,\n    0x9202, 0x9203, 0x9205, 0x9206, 0x9207, 0x920A, 0x920B, 0x920C,\n    0x920F, 0x9212, 0x9213, 0x9216, 0x9217, 0x9218, 0x9219, 0x921A,\n    0x921B, 0x921C, 0x921D, 0x921F, 0x9220, 0x9221, 0x9222, 0x9224,\n    0x9228, 0x9229, 0x922A, 0x922B, 0x922C, 0x922D, 0x922F, 0x9231,\n    0x9232, 0x9235, 0x9236, 0x923B, 0x923C, 0x9241, 0x9242, 0x9243,\n    0x9244, 0x9246, 0x9247, 0x924A, 0x924B, 0x924C, 0x924E, 0x924F,\n    0x9250, 0x9252, 0x9253, 0x9254, 0x9256, 0x9258, 0x9259, 0x925C,\n    0x925D, 0x925F, 0x9260, 0x9261, 0x9263, 0x9264, 0x9265, 0x9267,\n    0x9268, 0x9269, 0x926A, 0x926B, 0x926E, 0x926F, 0x9270, 0x9271,\n    0x9272, 0x9273, 0x9275, 0x9276, 0x9277, 0x9279, 0x927C, 0x927D,\n    0x927E, 0x9281, 0x9282, 0x9284, 0x9286, 0x9287, 0x9288, 0x9289,\n    0x928A, 0x928B, 0x928C, 0x928D, 0x928F, 0x9290, 0x9292, 0x9294,\n    0x9295, 0x9297, 0x9299, 0x929B, 0x929D, 0x929E, 0x929F, 0x92A1,\n    0x92A2, 0x92A4, 0x92A7, 0x92AD, 0x92AF, 0x92B0, 0x92B2, 0x92B3,\n    0x92B4, 0x92B5, 0x92B6, 0x92B8, 0x92BA, 0x92BD, 0x92BE, 0x92BF,\n    0x92C0, 0x92C2, 0x92C4, 0x92C6, 0x92C9, 0x92CA, 0x92CB, 0x92CD,\n    0x92CE, 0x92D0, 0x92D1, 0x92D3, 0x92D4, 0x92D5, 0x92D6, 0x92D7,\n    0x92D8, 0x92D9, 0x92DA, 0x92DB, 0x92DC, 0x92DE, 0x92E0, 0x92E1,\n    0x92E2, 0x92E7, 0x92E9, 0x92EB, 0x92EC, 0x92F2, 0x92F3, 0x92F4,\n    0x92F5, 0x92F7, 0x92F9, 0x92FA, 0x92FB, 0x92FD, 0x92FE, 0x92FF,\n    0x9300, 0x9302, 0x9303, 0x9304, 0x9305, 0x9309, 0x930A, 0x930B,\n    0x930C, 0x930D, 0x930E, 0x930F, 0x9311, 0x9313, 0x9314, 0x9316,\n    0x9317, 0x931C, 0x931D, 0x931E, 0x9321, 0x9323, 0x9324, 0x9325,\n    0x9327, 0x9329, 0x932A, 0x932C, 0x932D, 0x9330, 0x9331, 0x9334,\n    0x9335, 0x9337, 0x9339, 0x933A, 0x933B, 0x933C, 0x933D, 0x933F,\n    0x9342, 0x9344, 0x9345, 0x9348, 0x9349, 0x934A, 0x934C, 0x934E,\n    0x934F, 0x9350, 0x9351, 0x9352, 0x9353, 0x9355, 0x9356, 0x9357,\n    0x9359, 0x935A, 0x935C, 0x935D, 0x935E, 0x935F, 0x9360, 0x9361,\n    0x9362, 0x9363, 0x9366, 0x9367, 0x9368, 0x936B, 0x936D, 0x936E,\n    0x936F, 0x9371, 0x9372, 0x9373, 0x9374, 0x9377, 0x9378, 0x9379,\n    0x937B, 0x937C, 0x937D, 0x937F, 0x9380, 0x9381, 0x9383, 0x9385,\n    0x9386, 0x9388, 0x9389, 0x938B, 0x938C, 0x938D, 0x938E, 0x9390,\n    0x9391, 0x9392, 0x9393, 0x9394, 0x9395, 0x9397, 0x9399, 0x939A,\n    0x939B, 0x939C, 0x939D, 0x939E, 0x939F, 0x93A0, 0x93A1, 0x93A4,\n    0x93A5, 0x93A8, 0x93AB, 0x93AD, 0x93AF, 0x93B1, 0x93B2, 0x93B4,\n    0x93B6, 0x93B7, 0x93B9, 0x93BA, 0x93BB, 0x93BC, 0x93BD, 0x93BE,\n    0x93C0, 0x93C1, 0x93C2, 0x93C4, 0x93C5, 0x93C6, 0x93C9, 0x93CB,\n    0x93CE, 0x93CF, 0x93D0, 0x93D2, 0x93D3, 0x93D4, 0x93D5, 0x93D9,\n    0x93DA, 0x93DB, 0x93E0, 0x93E3, 0x93E5, 0x93E6, 0x93E7, 0x93E9,\n    0x93EA, 0x93EB, 0x93EC, 0x93ED, 0x93EE, 0x93EF, 0x93F0, 0x93F1,\n    0x93F2, 0x93F3, 0x93F4, 0x93F6, 0x93F8, 0x93FA, 0x93FB, 0x93FC,\n    0x93FD, 0x93FE, 0x93FF, 0x9400, 0x9401, 0x9402, 0x9404, 0x9405,\n    0x9406, 0x9407, 0x9408, 0x9409, 0x940A, 0x940C, 0x940D, 0x940E,\n    0x940F, 0x9411, 0x9415, 0x9416, 0x9417, 0x941A, 0x941B, 0x941C,\n    0x941E, 0x941F, 0x9421, 0x9422, 0x9423, 0x9424, 0x9425, 0x9429,\n    0x942A, 0x942B, 0x942C, 0x942D, 0x942F, 0x9430, 0x9431, 0x9434,\n    0x9436, 0x9437, 0x9439, 0x943B, 0x943C, 0x943D, 0x9440, 0x9441,\n    0x9442, 0x9443, 0x9445, 0x9446, 0x9447, 0x9448, 0x9449, 0x944B,\n    0x944D, 0x944E, 0x944F, 0x9450, 0x9451, 0x9453, 0x9455, 0x9456,\n    0x9457, 0x9458, 0x9459, 0x945A, 0x945B, 0x945C, 0x945D, 0x945E,\n    0x945F, 0x9461, 0x9462, 0x9464, 0x9466, 0x9467, 0x9468, 0x9469,\n    0x946A, 0x946C, 0x946E, 0x946F, 0x9471, 0x9473, 0x9474, 0x9475,\n    0x9476, 0x9478, 0x947A, 0x947B, 0x9480, 0x9481, 0x9482, 0x9483,\n    0x9484, 0x9491, 0x9496, 0x9498, 0x94C7, 0x94CF, 0x94D3, 0x94D4,\n    0x94DA, 0x94E6, 0x94FB, 0x951C, 0x9520, 0x9527, 0x9533, 0x953D,\n    0x9543, 0x9548, 0x954B, 0x9555, 0x955A, 0x9560, 0x956E, 0x9574,\n    0x9575, 0x9578, 0x9579, 0x957A, 0x957B, 0x957C, 0x957D, 0x957E,\n    0x9581, 0x9584, 0x9585, 0x9587, 0x9588, 0x958A, 0x958D, 0x9590,\n    0x9592, 0x9595, 0x9596, 0x9597, 0x9599, 0x959A, 0x959B, 0x959C,\n    0x959D, 0x959E, 0x959F, 0x95A0, 0x95A2, 0x95A6, 0x95A7, 0x95AA,\n    0x95AE, 0x95AF, 0x95B0, 0x95B1, 0x95B3, 0x95B4, 0x95B5, 0x95B7,\n    0x95B8, 0x95BA, 0x95C0, 0x95C1, 0x95C2, 0x95C4, 0x95C5, 0x95C7,\n    0x95C9, 0x95CD, 0x95CE, 0x95CF, 0x95D1, 0x95D2, 0x95D3, 0x95D7,\n    0x95D8, 0x95D9, 0x95DA, 0x95DB, 0x95DD, 0x95DF, 0x95E0, 0x95E3,\n    0x95E4, 0x95E6, 0x95E7, 0x95EC, 0x95FF, 0x9607, 0x9613, 0x9618,\n    0x961B, 0x961E, 0x9620, 0x9623, 0x9624, 0x9625, 0x9626, 0x9627,\n    0x9628, 0x9629, 0x962B, 0x962C, 0x962D, 0x962F, 0x9630, 0x9637,\n    0x9638, 0x9639, 0x963A, 0x963E, 0x9641, 0x9643, 0x964A, 0x964E,\n    0x964F, 0x9651, 0x9652, 0x9653, 0x9656, 0x9657, 0x9659, 0x965A,\n    0x965C, 0x965E, 0x9660, 0x9665, 0x9666, 0x966B, 0x966D, 0x966E,\n    0x966F, 0x9671, 0x9679, 0x967A, 0x967B, 0x967C, 0x967E, 0x967F,\n    0x9680, 0x9681, 0x9682, 0x9683, 0x9684, 0x9687, 0x9689, 0x968C,\n    0x9691, 0x9692, 0x9693, 0x9696, 0x969A, 0x969D, 0x969E, 0x969F,\n    0x96A0, 0x96A1, 0x96A2, 0x96A3, 0x96A4, 0x96A5, 0x96A6, 0x96A9,\n    0x96AB, 0x96AC, 0x96AD, 0x96AE, 0x96AF, 0x96B2, 0x96B5, 0x96B7,\n    0x96BA, 0x96BF, 0x96C2, 0x96C3, 0x96C8, 0x96CA, 0x96CB, 0x96D0,\n    0x96D1, 0x96D3, 0x96D4, 0x96D7, 0x96D8, 0x96DA, 0x96DD, 0x96DE,\n    0x96DF, 0x96E1, 0x96E4, 0x96E5, 0x96E6, 0x96E7, 0x96EB, 0x96EC,\n    0x96ED, 0x96EE, 0x96F0, 0x96F1, 0x96F4, 0x96F5, 0x96F8, 0x96FA,\n    0x96FC, 0x96FD, 0x96FF, 0x9702, 0x9703, 0x9705, 0x970A, 0x970B,\n    0x970C, 0x9710, 0x9711, 0x9712, 0x9714, 0x9715, 0x9717, 0x9718,\n    0x9719, 0x971A, 0x971B, 0x971D, 0x971F, 0x9720, 0x9721, 0x9722,\n    0x9723, 0x9724, 0x9725, 0x9726, 0x9728, 0x9729, 0x972B, 0x972C,\n    0x972E, 0x972F, 0x9731, 0x9733, 0x9734, 0x9735, 0x9736, 0x9737,\n    0x973A, 0x973B, 0x973C, 0x973F, 0x9740, 0x9741, 0x9743, 0x9745,\n    0x9746, 0x9747, 0x9749, 0x974A, 0x974B, 0x974C, 0x974D, 0x974E,\n    0x974F, 0x9750, 0x9751, 0x9754, 0x9755, 0x9757, 0x9758, 0x975C,\n    0x975D, 0x975F, 0x9763, 0x9764, 0x9766, 0x9767, 0x976A, 0x976B,\n    0x976C, 0x976D, 0x976E, 0x976F, 0x9770, 0x9771, 0x9772, 0x9775,\n    0x9777, 0x9778, 0x9779, 0x977A, 0x977B, 0x977D, 0x977E, 0x977F,\n    0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9786, 0x9787, 0x9788,\n    0x9789, 0x978A, 0x978C, 0x978E, 0x9790, 0x9793, 0x9795, 0x9796,\n    0x9797, 0x9799, 0x979A, 0x979B, 0x979C, 0x979D, 0x979E, 0x979F,\n    0x97A1, 0x97A2, 0x97A4, 0x97A5, 0x97A7, 0x97A8, 0x97A9, 0x97AA,\n    0x97AC, 0x97AE, 0x97B0, 0x97B1, 0x97B3, 0x97B5, 0x97B6, 0x97B7,\n    0x97B8, 0x97B9, 0x97BA, 0x97BB, 0x97BC, 0x97BE, 0x97BF, 0x97C0,\n    0x97C1, 0x97C2, 0x97C4, 0x97C5, 0x97C7, 0x97C8, 0x97CA, 0x97CD,\n    0x97CE, 0x97CF, 0x97D0, 0x97D1, 0x97D2, 0x97D4, 0x97D5, 0x97D6,\n    0x97D7, 0x97D8, 0x97DA, 0x97DB, 0x97DD, 0x97DF, 0x97E0, 0x97E1,\n    0x97E2, 0x97E3, 0x97E4, 0x97E5, 0x97E8, 0x97EE, 0x97EF, 0x97F0,\n    0x97F1, 0x97F2, 0x97F4, 0x97F7, 0x97F8, 0x97F9, 0x97FA, 0x97FB,\n    0x97FC, 0x97FD, 0x97FE, 0x9800, 0x9804, 0x9809, 0x980B, 0x980D,\n    0x9814, 0x9815, 0x9816, 0x9819, 0x981A, 0x981B, 0x981D, 0x981E,\n    0x981F, 0x9820, 0x9822, 0x9823, 0x9825, 0x9827, 0x9828, 0x9829,\n    0x982A, 0x982B, 0x982C, 0x982E, 0x982F, 0x9831, 0x9832, 0x9833,\n    0x9834, 0x9835, 0x9836, 0x9839, 0x983A, 0x983C, 0x983E, 0x983F,\n    0x9840, 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9847, 0x9848,\n    0x9849, 0x984A, 0x984B, 0x984F, 0x9850, 0x9851, 0x9852, 0x9855,\n    0x9856, 0x9857, 0x985A, 0x985C, 0x985D, 0x985F, 0x9860, 0x9861,\n    0x9863, 0x9864, 0x9866, 0x9868, 0x9869, 0x986A, 0x986D, 0x986E,\n    0x9872, 0x988B, 0x988E, 0x9892, 0x9895, 0x9899, 0x98A3, 0x98A9,\n    0x98AA, 0x98AB, 0x98AC, 0x98AD, 0x98B0, 0x98B2, 0x98B4, 0x98B5,\n    0x98B7, 0x98B8, 0x98B9, 0x98BA, 0x98BB, 0x98BD, 0x98BE, 0x98BF,\n    0x98C0, 0x98C1, 0x98C2, 0x98C3, 0x98C5, 0x98C7, 0x98C9, 0x98CA,\n    0x98CB, 0x98CC, 0x98CD, 0x98CF, 0x98D0, 0x98D4, 0x98D6, 0x98D7,\n    0x98DC, 0x98DD, 0x98E1, 0x98E3, 0x98E4, 0x98E5, 0x98E6, 0x98EC,\n    0x98EE, 0x98F0, 0x98F1, 0x98F3, 0x98F5, 0x98F6, 0x98F7, 0x98F8,\n    0x98F9, 0x98FA, 0x98FB, 0x98FF, 0x9900, 0x9901, 0x9902, 0x9904,\n    0x9906, 0x9907, 0x9908, 0x990B, 0x990E, 0x990F, 0x9914, 0x9915,\n    0x9916, 0x9917, 0x9919, 0x991A, 0x991C, 0x991D, 0x991F, 0x9920,\n    0x9922, 0x9923, 0x9924, 0x9925, 0x9926, 0x9927, 0x9929, 0x992A,\n    0x992B, 0x992C, 0x992D, 0x992F, 0x9930, 0x9931, 0x9932, 0x9934,\n    0x9935, 0x9936, 0x9938, 0x9939, 0x993A, 0x993B, 0x993D, 0x9940,\n    0x9941, 0x9942, 0x9944, 0x9946, 0x9947, 0x994D, 0x994E, 0x994F,\n    0x9950, 0x9953, 0x9956, 0x9958, 0x9959, 0x995A, 0x995B, 0x995D,\n    0x995F, 0x9960, 0x9961, 0x9964, 0x9966, 0x9973, 0x9978, 0x9979,\n    0x997B, 0x997E, 0x9982, 0x9983, 0x9989, 0x998C, 0x998E, 0x999A,\n    0x999B, 0x999C, 0x999D, 0x999E, 0x999F, 0x99A0, 0x99A1, 0x99A2,\n    0x99A3, 0x99A4, 0x99A6, 0x99A7, 0x99A9, 0x99AA, 0x99AB, 0x99AF,\n    0x99B0, 0x99B2, 0x99B5, 0x99B6, 0x99B7, 0x99B8, 0x99B9, 0x99BA,\n    0x99BB, 0x99BC, 0x99BD, 0x99BE, 0x99BF, 0x99C0, 0x99C2, 0x99C3,\n    0x99C4, 0x99C5, 0x99C6, 0x99C7, 0x99C8, 0x99C9, 0x99CA, 0x99CB,\n    0x99CC, 0x99CD, 0x99CE, 0x99CF, 0x99D3, 0x99D6, 0x99D7, 0x99DA,\n    0x99DC, 0x99DE, 0x99E0, 0x99E3, 0x99E4, 0x99E5, 0x99E6, 0x99E7,\n    0x99E8, 0x99E9, 0x99EA, 0x99EB, 0x99EC, 0x99EE, 0x99EF, 0x99F0,\n    0x99F2, 0x99F3, 0x99F4, 0x99F5, 0x99F6, 0x99F7, 0x99F8, 0x99F9,\n    0x99FA, 0x99FB, 0x99FC, 0x99FD, 0x99FE, 0x9A00, 0x9A02, 0x9A03,\n    0x9A04, 0x9A06, 0x9A07, 0x9A08, 0x9A09, 0x9A0A, 0x9A0B, 0x9A0C,\n    0x9A10, 0x9A11, 0x9A12, 0x9A13, 0x9A14, 0x9A15, 0x9A17, 0x9A18,\n    0x9A1A, 0x9A1B, 0x9A1C, 0x9A1D, 0x9A1E, 0x9A1F, 0x9A20, 0x9A21,\n    0x9A22, 0x9A23, 0x9A24, 0x9A25, 0x9A26, 0x9A27, 0x9A28, 0x9A29,\n    0x9A2A, 0x9A2C, 0x9A2F, 0x9A31, 0x9A32, 0x9A33, 0x9A34, 0x9A35,\n    0x9A39, 0x9A3A, 0x9A3B, 0x9A3C, 0x9A3D, 0x9A3F, 0x9A46, 0x9A47,\n    0x9A48, 0x9A49, 0x9A4B, 0x9A4C, 0x9A4E, 0x9A50, 0x9A51, 0x9A52,\n    0x9A53, 0x9A54, 0x9A56, 0x9A58, 0x9A59, 0x9A5C, 0x9A5D, 0x9A5E,\n    0x9A60, 0x9A61, 0x9A63, 0x9A66, 0x9A67, 0x9A68, 0x9A69, 0x9A6B,\n    0x9A72, 0x9A83, 0x9A89, 0x9A8D, 0x9A8E, 0x9A94, 0x9A95, 0x9A99,\n    0x9AA6, 0x9AA9, 0x9AAA, 0x9AAB, 0x9AAC, 0x9AAD, 0x9AAE, 0x9AB2,\n    0x9AB3, 0x9AB4, 0x9AB5, 0x9AB9, 0x9ABB, 0x9ABD, 0x9ABE, 0x9ABF,\n    0x9AC3, 0x9AC4, 0x9AC6, 0x9AC7, 0x9AC8, 0x9AC9, 0x9ACA, 0x9ACD,\n    0x9ACE, 0x9AD0, 0x9AD7, 0x9AD9, 0x9ADA, 0x9ADB, 0x9ADC, 0x9ADD,\n    0x9ADE, 0x9AE0, 0x9AE2, 0x9AE3, 0x9AE4, 0x9AE5, 0x9AE7, 0x9AE8,\n    0x9AE9, 0x9AEA, 0x9AEC, 0x9AF0, 0x9AF1, 0x9AF2, 0x9AF3, 0x9AF4,\n    0x9AF5, 0x9AF6, 0x9AF7, 0x9AF8, 0x9AFA, 0x9AFC, 0x9AFD, 0x9AFE,\n    0x9AFF, 0x9B00, 0x9B01, 0x9B02, 0x9B04, 0x9B05, 0x9B07, 0x9B09,\n    0x9B0A, 0x9B0B, 0x9B0C, 0x9B0E, 0x9B10, 0x9B11, 0x9B12, 0x9B14,\n    0x9B15, 0x9B16, 0x9B17, 0x9B18, 0x9B19, 0x9B1B, 0x9B1C, 0x9B1D,\n    0x9B1E, 0x9B20, 0x9B21, 0x9B24, 0x9B26, 0x9B28, 0x9B2A, 0x9B2B,\n    0x9B2C, 0x9B2D, 0x9B30, 0x9B33, 0x9B34, 0x9B35, 0x9B36, 0x9B37,\n    0x9B38, 0x9B39, 0x9B3A, 0x9B3D, 0x9B3E, 0x9B3F, 0x9B40, 0x9B46,\n    0x9B4A, 0x9B4B, 0x9B4C, 0x9B50, 0x9B52, 0x9B53, 0x9B55, 0x9B56,\n    0x9B57, 0x9B59, 0x9B5B, 0x9B5C, 0x9B5D, 0x9B5E, 0x9B5F, 0x9B60,\n    0x9B61, 0x9B62, 0x9B63, 0x9B64, 0x9B65, 0x9B66, 0x9B67, 0x9B68,\n    0x9B69, 0x9B6A, 0x9B6B, 0x9B6C, 0x9B6D, 0x9B6E, 0x9B70, 0x9B71,\n    0x9B72, 0x9B73, 0x9B75, 0x9B76, 0x9B78, 0x9B79, 0x9B7A, 0x9B7B,\n    0x9B7C, 0x9B7D, 0x9B7E, 0x9B7F, 0x9B80, 0x9B82, 0x9B84, 0x9B85,\n    0x9B86, 0x9B87, 0x9B88, 0x9B89, 0x9B8A, 0x9B8B, 0x9B8C, 0x9B8D,\n    0x9B8F, 0x9B93, 0x9B94, 0x9B95, 0x9B96, 0x9B97, 0x9B98, 0x9B99,\n    0x9B9B, 0x9B9C, 0x9B9F, 0x9BA0, 0x9BA1, 0x9BA2, 0x9BA3, 0x9BA4,\n    0x9BA5, 0x9BA6, 0x9BA7, 0x9BA8, 0x9BA9, 0x9BAC, 0x9BAF, 0x9BB0,\n    0x9BB1, 0x9BB2, 0x9BB3, 0x9BB4, 0x9BB5, 0x9BB6, 0x9BB7, 0x9BB8,\n    0x9BB9, 0x9BBA, 0x9BBB, 0x9BBC, 0x9BBD, 0x9BBE, 0x9BBF, 0x9BC2,\n    0x9BC3, 0x9BC4, 0x9BC5, 0x9BC6, 0x9BC8, 0x9BCB, 0x9BCC, 0x9BCD,\n    0x9BCE, 0x9BCF, 0x9BD0, 0x9BD1, 0x9BD2, 0x9BD3, 0x9BD5, 0x9BD7,\n    0x9BD8, 0x9BD9, 0x9BDA, 0x9BDC, 0x9BDE, 0x9BDF, 0x9BE0, 0x9BE3,\n    0x9BE5, 0x9BE6, 0x9BE9, 0x9BEC, 0x9BED, 0x9BEE, 0x9BEF, 0x9BF1,\n    0x9BF2, 0x9BF3, 0x9BF5, 0x9BF6, 0x9BF7, 0x9BF8, 0x9BF9, 0x9BFA,\n    0x9BFB, 0x9BFC, 0x9BFE, 0x9C00, 0x9C01, 0x9C02, 0x9C03, 0x9C04,\n    0x9C05, 0x9C06, 0x9C07, 0x9C0A, 0x9C0B, 0x9C0C, 0x9C0E, 0x9C0F,\n    0x9C11, 0x9C14, 0x9C15, 0x9C16, 0x9C17, 0x9C18, 0x9C19, 0x9C1A,\n    0x9C1B, 0x9C1C, 0x9C1D, 0x9C1E, 0x9C1F, 0x9C21, 0x9C22, 0x9C24,\n    0x9C26, 0x9C27, 0x9C2A, 0x9C2B, 0x9C2C, 0x9C2E, 0x9C2F, 0x9C30,\n    0x9C34, 0x9C36, 0x9C38, 0x9C3A, 0x9C3C, 0x9C3D, 0x9C3F, 0x9C40,\n    0x9C41, 0x9C42, 0x9C43, 0x9C44, 0x9C46, 0x9C47, 0x9C4A, 0x9C4B,\n    0x9C4C, 0x9C4D, 0x9C4E, 0x9C4F, 0x9C50, 0x9C51, 0x9C53, 0x9C55,\n    0x9C59, 0x9C5A, 0x9C5B, 0x9C5C, 0x9C5E, 0x9C60, 0x9C61, 0x9C62,\n    0x9C63, 0x9C64, 0x9C65, 0x9C66, 0x9C68, 0x9C69, 0x9C6A, 0x9C6B,\n    0x9C6C, 0x9C6E, 0x9C6F, 0x9C70, 0x9C71, 0x9C72, 0x9C73, 0x9C74,\n    0x9C75, 0x9C76, 0x9C77, 0x9C79, 0x9C7B, 0x9C7D, 0x9C7E, 0x9C80,\n    0x9C83, 0x9C84, 0x9C89, 0x9C8A, 0x9C8C, 0x9C8F, 0x9C93, 0x9C96,\n    0x9C97, 0x9C98, 0x9C99, 0x9C9D, 0x9CAA, 0x9CAC, 0x9CAF, 0x9CB9,\n    0x9CBE, 0x9CBF, 0x9CC0, 0x9CC1, 0x9CC2, 0x9CC8, 0x9CC9, 0x9CD1,\n    0x9CD2, 0x9CDA, 0x9CDB, 0x9CE0, 0x9CE1, 0x9CE3, 0x9CE4, 0x9CE6,\n    0x9CE7, 0x9CE8, 0x9CEA, 0x9CEB, 0x9CED, 0x9CEE, 0x9CEF, 0x9CF0,\n    0x9CF1, 0x9CF2, 0x9CF5, 0x9CF7, 0x9CF8, 0x9CF9, 0x9CFA, 0x9CFB,\n    0x9CFC, 0x9CFD, 0x9CFE, 0x9CFF, 0x9D00, 0x9D01, 0x9D02, 0x9D03,\n    0x9D04, 0x9D05, 0x9D08, 0x9D0A, 0x9D0B, 0x9D0C, 0x9D0D, 0x9D0E,\n    0x9D0F, 0x9D10, 0x9D11, 0x9D12, 0x9D13, 0x9D14, 0x9D16, 0x9D17,\n    0x9D18, 0x9D19, 0x9D1A, 0x9D1C, 0x9D1E, 0x9D20, 0x9D21, 0x9D22,\n    0x9D24, 0x9D25, 0x9D27, 0x9D29, 0x9D2A, 0x9D2B, 0x9D2C, 0x9D2D,\n    0x9D2E, 0x9D31, 0x9D32, 0x9D33, 0x9D34, 0x9D35, 0x9D36, 0x9D37,\n    0x9D38, 0x9D39, 0x9D3A, 0x9D3C, 0x9D3D, 0x9D3E, 0x9D40, 0x9D41,\n    0x9D43, 0x9D44, 0x9D45, 0x9D46, 0x9D47, 0x9D48, 0x9D49, 0x9D4A,\n    0x9D4B, 0x9D4C, 0x9D4D, 0x9D4E, 0x9D4F, 0x9D50, 0x9D54, 0x9D55,\n    0x9D56, 0x9D57, 0x9D58, 0x9D59, 0x9D5A, 0x9D5B, 0x9D5E, 0x9D5F,\n    0x9D62, 0x9D63, 0x9D64, 0x9D65, 0x9D66, 0x9D67, 0x9D68, 0x9D69,\n    0x9D6B, 0x9D6D, 0x9D6E, 0x9D70, 0x9D71, 0x9D73, 0x9D74, 0x9D75,\n    0x9D76, 0x9D77, 0x9D78, 0x9D79, 0x9D7A, 0x9D7B, 0x9D7C, 0x9D7D,\n    0x9D7E, 0x9D7F, 0x9D80, 0x9D81, 0x9D82, 0x9D83, 0x9D84, 0x9D85,\n    0x9D86, 0x9D88, 0x9D8A, 0x9D8B, 0x9D8C, 0x9D8D, 0x9D8E, 0x9D8F,\n    0x9D90, 0x9D91, 0x9D92, 0x9D94, 0x9D95, 0x9D96, 0x9D97, 0x9D99,\n    0x9D9B, 0x9D9C, 0x9D9D, 0x9D9E, 0x9D9F, 0x9DA0, 0x9DA1, 0x9DA2,\n    0x9DA3, 0x9DA4, 0x9DA6, 0x9DA7, 0x9DA8, 0x9DAA, 0x9DAB, 0x9DAC,\n    0x9DAD, 0x9DAE, 0x9DB0, 0x9DB1, 0x9DB2, 0x9DB3, 0x9DB5, 0x9DB6,\n    0x9DB7, 0x9DB8, 0x9DB9, 0x9DBA, 0x9DBD, 0x9DBE, 0x9DBF, 0x9DC1,\n    0x9DC3, 0x9DC5, 0x9DC6, 0x9DC7, 0x9DC8, 0x9DC9, 0x9DCA, 0x9DCB,\n    0x9DCC, 0x9DCD, 0x9DCE, 0x9DCF, 0x9DD0, 0x9DD1, 0x9DD2, 0x9DD4,\n    0x9DD5, 0x9DD6, 0x9DD8, 0x9DDB, 0x9DDC, 0x9DDD, 0x9DDE, 0x9DDF,\n    0x9DE0, 0x9DE1, 0x9DE2, 0x9DE3, 0x9DE4, 0x9DE7, 0x9DE8, 0x9DE9,\n    0x9DEA, 0x9DEB, 0x9DEC, 0x9DED, 0x9DEE, 0x9DF0, 0x9DF1, 0x9DF4,\n    0x9DF5, 0x9DF6, 0x9DF7, 0x9DFB, 0x9DFC, 0x9DFD, 0x9DFE, 0x9DFF,\n    0x9E00, 0x9E01, 0x9E02, 0x9E03, 0x9E04, 0x9E05, 0x9E06, 0x9E07,\n    0x9E08, 0x9E09, 0x9E0A, 0x9E0B, 0x9E0D, 0x9E0E, 0x9E0F, 0x9E10,\n    0x9E11, 0x9E12, 0x9E13, 0x9E14, 0x9E16, 0x9E17, 0x9E18, 0x9E19,\n    0x9E1C, 0x9E24, 0x9E27, 0x9E2E, 0x9E30, 0x9E34, 0x9E3B, 0x9E3C,\n    0x9E40, 0x9E4D, 0x9E50, 0x9E52, 0x9E53, 0x9E54, 0x9E56, 0x9E59,\n    0x9E5D, 0x9E5F, 0x9E60, 0x9E61, 0x9E62, 0x9E65, 0x9E6E, 0x9E6F,\n    0x9E72, 0x9E74, 0x9E76, 0x9E77, 0x9E78, 0x9E7B, 0x9E80, 0x9E81,\n    0x9E83, 0x9E84, 0x9E85, 0x9E86, 0x9E89, 0x9E8A, 0x9E8C, 0x9E8D,\n    0x9E8E, 0x9E8F, 0x9E90, 0x9E91, 0x9E94, 0x9E95, 0x9E96, 0x9E98,\n    0x9E99, 0x9E9A, 0x9E9B, 0x9E9C, 0x9E9E, 0x9EA0, 0x9EA1, 0x9EA2,\n    0x9EA3, 0x9EA4, 0x9EA7, 0x9EA8, 0x9EAA, 0x9EAB, 0x9EAC, 0x9EAD,\n    0x9EAE, 0x9EB0, 0x9EB1, 0x9EB2, 0x9EB3, 0x9EB6, 0x9EB7, 0x9EB9,\n    0x9EBA, 0x9EBC, 0x9EBF, 0x9EC0, 0x9EC1, 0x9EC2, 0x9EC3, 0x9EC5,\n    0x9EC6, 0x9EC7, 0x9EC8, 0x9ECA, 0x9ECB, 0x9ED0, 0x9ED2, 0x9ED3,\n    0x9ED5, 0x9ED6, 0x9ED7, 0x9ED9, 0x9EDA, 0x9EE1, 0x9EE3, 0x9EE4,\n    0x9EE6, 0x9EEB, 0x9EEC, 0x9EED, 0x9EEE, 0x9EF0, 0x9EF1, 0x9EF3,\n    0x9EF5, 0x9EF6, 0x9EF8, 0x9EFA, 0x9F00, 0x9F01, 0x9F02, 0x9F03,\n    0x9F04, 0x9F05, 0x9F06, 0x9F07, 0x9F08, 0x9F0A, 0x9F0C, 0x9F0F,\n    0x9F11, 0x9F12, 0x9F14, 0x9F16, 0x9F18, 0x9F1A, 0x9F1B, 0x9F1C,\n    0x9F1D, 0x9F1E, 0x9F1F, 0x9F21, 0x9F23, 0x9F24, 0x9F25, 0x9F26,\n    0x9F27, 0x9F28, 0x9F29, 0x9F2A, 0x9F2B, 0x9F2D, 0x9F2E, 0x9F30,\n    0x9F31, 0x9F32, 0x9F33, 0x9F34, 0x9F35, 0x9F36, 0x9F38, 0x9F3A,\n    0x9F3C, 0x9F3F, 0x9F40, 0x9F41, 0x9F42, 0x9F43, 0x9F45, 0x9F46,\n    0x9F47, 0x9F48, 0x9F49, 0x9F4C, 0x9F4D, 0x9F4E, 0x9F53, 0x9F55,\n    0x9F56, 0x9F57, 0x9F58, 0x9F5A, 0x9F5B, 0x9F5D, 0x9F5E, 0x9F62,\n    0x9F64, 0x9F65, 0x9F67, 0x9F68, 0x9F69, 0x9F6B, 0x9F6D, 0x9F6E,\n    0x9F6F, 0x9F70, 0x9F71, 0x9F73, 0x9F74, 0x9F75, 0x9F76, 0x9F78,\n    0x9F79, 0x9F7A, 0x9F7B, 0x9F7C, 0x9F7D, 0x9F7E, 0x9F81, 0x9F82,\n    0x9F8E, 0x9F8F, 0x9F91, 0x9F92, 0x9F93, 0x9F96, 0x9F97, 0x9F98,\n    0x9F9D, 0x9F9E, 0x9FA1, 0x9FA2, 0x9FA3, 0x9FA4, 0x9FA5, 0xF92C,\n    0xFA0D, 0xFA0E, 0xFA0F, 0xFA11, 0xFA13, 0xFA14, 0xFA18, 0xFA1F,\n    0xFA20, 0xFA21, 0xFA23, 0xFA24, 0xFA27, 0xFA28, 0xFA29, 0x2E81,\n    0x0000, 0x0000, 0x0000, 0x2E84, 0x3473, 0x3447, 0x2E88, 0x2E8B,\n    0x9FB4, 0x359E, 0x361A, 0x360E, 0x2E8C, 0x2E97, 0x396E, 0x3918,\n    0x9FB5, 0x39CF, 0x39DF, 0x3A73, 0x39D0, 0x9FB6, 0x9FB7, 0x3B4E,\n    0x3C6E, 0x3CE0, 0x2EA7, 0x0000, 0x9FB8, 0x2EAA, 0x4056, 0x415F,\n    0x2EAE, 0x4337, 0x2EB3, 0x2EB6, 0x2EB7, 0x0000, 0x43B1, 0x43AC,\n    0x2EBB, 0x43DD, 0x44D6, 0x4661, 0x464C, 0x9FB9, 0x4723, 0x4729,\n    0x477C, 0x478D, 0x2ECA, 0x4947, 0x497A, 0x497D, 0x4982, 0x4983,\n    0x4985, 0x4986, 0x499F, 0x499B, 0x49B7, 0x49B6, 0x9FBA, 0x0000,\n    0x4CA3, 0x4C9F, 0x4CA0, 0x4CA1, 0x4C77, 0x4CA2, 0x4D13, 0x4D14,\n    0x4D15, 0x4D16, 0x4D17, 0x4D18, 0x4D19, 0x4DAE, 0x9FBB, 0x0020,\n    0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028,\n    0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030,\n    0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038,\n    0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040,\n    0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048,\n    0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050,\n    0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058,\n    0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060,\n    0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068,\n    0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070,\n    0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078,\n    0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x00FC, 0x00A9,\n    0x2122, 0x2026, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026,\n    0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E,\n    0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036,\n    0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E,\n    0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046,\n    0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E,\n    0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,\n    0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E,\n    0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066,\n    0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E,\n    0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076,\n    0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E,\n    0x0101, 0x00E1, 0x01CE, 0x00E0, 0x0113, 0x00E9, 0x011B, 0x00E8,\n    0x012B, 0x00ED, 0x01D0, 0x00EC, 0x014D, 0x00F3, 0x01D2, 0x00F2,\n    0x016B, 0x00FA, 0x01D4, 0x00F9, 0x01D6, 0x01D8, 0x01DA, 0x01DC,\n    0x00FC, 0x00EA, 0x0251, 0x1E3F, 0x0144, 0x0148, 0x01F9, 0x0261,\n    0x0020, 0x20AC, 0x00A5, 0x20AC, 0x0024, 0x303F, 0x20AC, 0x3041,\n    0x3047, 0x3043, 0x304B, 0x304B, 0x3051, 0x3051, 0x3053, 0x3053,\n    0x3049, 0x3064, 0x3045, 0x308E, 0x3083, 0x3087, 0x3085, 0x3094,\n    0x30A1, 0x30A7, 0x30A3, 0x30F5, 0x30F6, 0x30B3, 0x30B3, 0x30A9,\n    0x30C3, 0x30A5, 0x30EE, 0x30E3, 0x30E7, 0x30E5, 0x30F7, 0x30F9,\n    0x30F8, 0x30FA, 0x30FC, 0x3033, 0x3034, 0x3035, 0x3038, 0x3039,\n    0x303A, 0x312A, 0x312B, 0x312C, 0x31A0, 0x31A1, 0x31A2, 0x31A3,\n    0x31A4, 0x31A5, 0x31A6, 0x31A7, 0x31A8, 0x31A9, 0x31AA, 0x31AB,\n    0x31AC, 0x31AD, 0x31AE, 0x31AF, 0x31B0, 0x31B1, 0x31B2, 0x31B3,\n    0x31B4, 0x31B5, 0x31B6, 0x31B7, 0x2E80, 0x2E82, 0x2E83, 0x2E85,\n    0x2E86, 0x2E87, 0x2E89, 0x2E8A, 0x2E8D, 0x2E8E, 0x2E8F, 0x2E90,\n    0x2E91, 0x2E92, 0x2E93, 0x2E94, 0x2E95, 0x2E96, 0x2E98, 0x2E99,\n    0x2E9B, 0x2E9C, 0x2E9D, 0x2E9E, 0x2E9F, 0x2EA0, 0x2EA1, 0x2EA2,\n    0x2EA3, 0x2EA4, 0x2EA5, 0x2EA6, 0x2EA8, 0x2EA9, 0x2EAB, 0x2EAC,\n    0x2EAD, 0x2EAF, 0x2EB0, 0x2EB1, 0x2EB2, 0x2EB4, 0x2EB5, 0x2EB8,\n    0x2EB9, 0x2EBA, 0x2EBC, 0x2EBD, 0x2EBE, 0x2EBF, 0x2EC0, 0x2EC1,\n    0x2EC2, 0x2EC3, 0x2EC4, 0x2EC5, 0x2EC6, 0x2EC7, 0x2EC8, 0x2EC9,\n    0x2ECB, 0x2ECC, 0x2ECD, 0x2ECE, 0x2ECF, 0x2ED0, 0x2ED1, 0x2ED2,\n    0x2ED3, 0x2ED4, 0x2ED5, 0x2ED6, 0x2ED7, 0x2ED8, 0x2ED9, 0x2EDA,\n    0x2EDB, 0x2EDC, 0x2EDD, 0x2EDE, 0x2EDF, 0x2EE0, 0x2EE1, 0x2EE2,\n    0x2EE3, 0x2EE4, 0x2EE5, 0x2EE6, 0x2EE7, 0x2EE8, 0x2EE9, 0x2EEA,\n    0x2EEB, 0x2EEC, 0x2EED, 0x2EEE, 0x2EEF, 0x2EF0, 0x2EF1, 0x2EF2,\n    0x2EF3, 0x3400, 0x3401, 0x3402, 0x3403, 0x3404, 0x3405, 0x3406,\n    0x3407, 0x3408, 0x3409, 0x340A, 0x340B, 0x340C, 0x340D, 0x340E,\n    0x340F, 0x3410, 0x3411, 0x3412, 0x3413, 0x3414, 0x3415, 0x3416,\n    0x3417, 0x3418, 0x3419, 0x341A, 0x341B, 0x341C, 0x341D, 0x341E,\n    0x341F, 0x3420, 0x3421, 0x3422, 0x3423, 0x3424, 0x3425, 0x3426,\n    0x3427, 0x3428, 0x3429, 0x342A, 0x342B, 0x342C, 0x342D, 0x342E,\n    0x342F, 0x3430, 0x3431, 0x3432, 0x3433, 0x3434, 0x3435, 0x3436,\n    0x3437, 0x3438, 0x3439, 0x343A, 0x343B, 0x343C, 0x343D, 0x343E,\n    0x343F, 0x3440, 0x3441, 0x3442, 0x3443, 0x3444, 0x3445, 0x3446,\n    0x3448, 0x3449, 0x344A, 0x344B, 0x344C, 0x344D, 0x344E, 0x344F,\n    0x3450, 0x3451, 0x3452, 0x3453, 0x3454, 0x3455, 0x3456, 0x3457,\n    0x3458, 0x3459, 0x345A, 0x345B, 0x345C, 0x345D, 0x345E, 0x345F,\n    0x3460, 0x3461, 0x3462, 0x3463, 0x3464, 0x3465, 0x3466, 0x3467,\n    0x3468, 0x3469, 0x346A, 0x346B, 0x346C, 0x346D, 0x346E, 0x346F,\n    0x3470, 0x3471, 0x3472, 0x3474, 0x3475, 0x3476, 0x3477, 0x3478,\n    0x3479, 0x347A, 0x347B, 0x347C, 0x347D, 0x347E, 0x347F, 0x3480,\n    0x3481, 0x3482, 0x3483, 0x3484, 0x3485, 0x3486, 0x3487, 0x3488,\n    0x3489, 0x348A, 0x348B, 0x348C, 0x348D, 0x348E, 0x348F, 0x3490,\n    0x3491, 0x3492, 0x3493, 0x3494, 0x3495, 0x3496, 0x3497, 0x3498,\n    0x3499, 0x349A, 0x349B, 0x349C, 0x349D, 0x349E, 0x349F, 0x34A0,\n    0x34A1, 0x34A2, 0x34A3, 0x34A4, 0x34A5, 0x34A6, 0x34A7, 0x34A8,\n    0x34A9, 0x34AA, 0x34AB, 0x34AC, 0x34AD, 0x34AE, 0x34AF, 0x34B0,\n    0x34B1, 0x34B2, 0x34B3, 0x34B4, 0x34B5, 0x34B6, 0x34B7, 0x34B8,\n    0x34B9, 0x34BA, 0x34BB, 0x34BC, 0x34BD, 0x34BE, 0x34BF, 0x34C0,\n    0x34C1, 0x34C2, 0x34C3, 0x34C4, 0x34C5, 0x34C6, 0x34C7, 0x34C8,\n    0x34C9, 0x34CA, 0x34CB, 0x34CC, 0x34CD, 0x34CE, 0x34CF, 0x34D0,\n    0x34D1, 0x34D2, 0x34D3, 0x34D4, 0x34D5, 0x34D6, 0x34D7, 0x34D8,\n    0x34D9, 0x34DA, 0x34DB, 0x34DC, 0x34DD, 0x34DE, 0x34DF, 0x34E0,\n    0x34E1, 0x34E2, 0x34E3, 0x34E4, 0x34E5, 0x34E6, 0x34E7, 0x34E8,\n    0x34E9, 0x34EA, 0x34EB, 0x34EC, 0x34ED, 0x34EE, 0x34EF, 0x34F0,\n    0x34F1, 0x34F2, 0x34F3, 0x34F4, 0x34F5, 0x34F6, 0x34F7, 0x34F8,\n    0x34F9, 0x34FA, 0x34FB, 0x34FC, 0x34FD, 0x34FE, 0x34FF, 0x3500,\n    0x3501, 0x3502, 0x3503, 0x3504, 0x3505, 0x3506, 0x3507, 0x3508,\n    0x3509, 0x350A, 0x350B, 0x350C, 0x350D, 0x350E, 0x350F, 0x3510,\n    0x3511, 0x3512, 0x3513, 0x3514, 0x3515, 0x3516, 0x3517, 0x3518,\n    0x3519, 0x351A, 0x351B, 0x351C, 0x351D, 0x351E, 0x351F, 0x3520,\n    0x3521, 0x3522, 0x3523, 0x3524, 0x3525, 0x3526, 0x3527, 0x3528,\n    0x3529, 0x352A, 0x352B, 0x352C, 0x352D, 0x352E, 0x352F, 0x3530,\n    0x3531, 0x3532, 0x3533, 0x3534, 0x3535, 0x3536, 0x3537, 0x3538,\n    0x3539, 0x353A, 0x353B, 0x353C, 0x353D, 0x353E, 0x353F, 0x3540,\n    0x3541, 0x3542, 0x3543, 0x3544, 0x3545, 0x3546, 0x3547, 0x3548,\n    0x3549, 0x354A, 0x354B, 0x354C, 0x354D, 0x354E, 0x354F, 0x3550,\n    0x3551, 0x3552, 0x3553, 0x3554, 0x3555, 0x3556, 0x3557, 0x3558,\n    0x3559, 0x355A, 0x355B, 0x355C, 0x355D, 0x355E, 0x355F, 0x3560,\n    0x3561, 0x3562, 0x3563, 0x3564, 0x3565, 0x3566, 0x3567, 0x3568,\n    0x3569, 0x356A, 0x356B, 0x356C, 0x356D, 0x356E, 0x356F, 0x3570,\n    0x3571, 0x3572, 0x3573, 0x3574, 0x3575, 0x3576, 0x3577, 0x3578,\n    0x3579, 0x357A, 0x357B, 0x357C, 0x357D, 0x357E, 0x357F, 0x3580,\n    0x3581, 0x3582, 0x3583, 0x3584, 0x3585, 0x3586, 0x3587, 0x3588,\n    0x3589, 0x358A, 0x358B, 0x358C, 0x358D, 0x358E, 0x358F, 0x3590,\n    0x3591, 0x3592, 0x3593, 0x3594, 0x3595, 0x3596, 0x3597, 0x3598,\n    0x3599, 0x359A, 0x359B, 0x359C, 0x359D, 0x359F, 0x35A0, 0x35A1,\n    0x35A2, 0x35A3, 0x35A4, 0x35A5, 0x35A6, 0x35A7, 0x35A8, 0x35A9,\n    0x35AA, 0x35AB, 0x35AC, 0x35AD, 0x35AE, 0x35AF, 0x35B0, 0x35B1,\n    0x35B2, 0x35B3, 0x35B4, 0x35B5, 0x35B6, 0x35B7, 0x35B8, 0x35B9,\n    0x35BA, 0x35BB, 0x35BC, 0x35BD, 0x35BE, 0x35BF, 0x35C0, 0x35C1,\n    0x35C2, 0x35C3, 0x35C4, 0x35C5, 0x35C6, 0x35C7, 0x35C8, 0x35C9,\n    0x35CA, 0x35CB, 0x35CC, 0x35CD, 0x35CE, 0x35CF, 0x35D0, 0x35D1,\n    0x35D2, 0x35D3, 0x35D4, 0x35D5, 0x35D6, 0x35D7, 0x35D8, 0x35D9,\n    0x35DA, 0x35DB, 0x35DC, 0x35DD, 0x35DE, 0x35DF, 0x35E0, 0x35E1,\n    0x35E2, 0x35E3, 0x35E4, 0x35E5, 0x35E6, 0x35E7, 0x35E8, 0x35E9,\n    0x35EA, 0x35EB, 0x35EC, 0x35ED, 0x35EE, 0x35EF, 0x35F0, 0x35F1,\n    0x35F2, 0x35F3, 0x35F4, 0x35F5, 0x35F6, 0x35F7, 0x35F8, 0x35F9,\n    0x35FA, 0x35FB, 0x35FC, 0x35FD, 0x35FE, 0x35FF, 0x3600, 0x3601,\n    0x3602, 0x3603, 0x3604, 0x3605, 0x3606, 0x3607, 0x3608, 0x3609,\n    0x360A, 0x360B, 0x360C, 0x360D, 0x360F, 0x3610, 0x3611, 0x3612,\n    0x3613, 0x3614, 0x3615, 0x3616, 0x3617, 0x3618, 0x3619, 0x361B,\n    0x361C, 0x361D, 0x361E, 0x361F, 0x3620, 0x3621, 0x3622, 0x3623,\n    0x3624, 0x3625, 0x3626, 0x3627, 0x3628, 0x3629, 0x362A, 0x362B,\n    0x362C, 0x362D, 0x362E, 0x362F, 0x3630, 0x3631, 0x3632, 0x3633,\n    0x3634, 0x3635, 0x3636, 0x3637, 0x3638, 0x3639, 0x363A, 0x363B,\n    0x363C, 0x363D, 0x363E, 0x363F, 0x3640, 0x3641, 0x3642, 0x3643,\n    0x3644, 0x3645, 0x3646, 0x3647, 0x3648, 0x3649, 0x364A, 0x364B,\n    0x364C, 0x364D, 0x364E, 0x364F, 0x3650, 0x3651, 0x3652, 0x3653,\n    0x3654, 0x3655, 0x3656, 0x3657, 0x3658, 0x3659, 0x365A, 0x365B,\n    0x365C, 0x365D, 0x365E, 0x365F, 0x3660, 0x3661, 0x3662, 0x3663,\n    0x3664, 0x3665, 0x3666, 0x3667, 0x3668, 0x3669, 0x366A, 0x366B,\n    0x366C, 0x366D, 0x366E, 0x366F, 0x3670, 0x3671, 0x3672, 0x3673,\n    0x3674, 0x3675, 0x3676, 0x3677, 0x3678, 0x3679, 0x367A, 0x367B,\n    0x367C, 0x367D, 0x367E, 0x367F, 0x3680, 0x3681, 0x3682, 0x3683,\n    0x3684, 0x3685, 0x3686, 0x3687, 0x3688, 0x3689, 0x368A, 0x368B,\n    0x368C, 0x368D, 0x368E, 0x368F, 0x3690, 0x3691, 0x3692, 0x3693,\n    0x3694, 0x3695, 0x3696, 0x3697, 0x3698, 0x3699, 0x369A, 0x369B,\n    0x369C, 0x369D, 0x369E, 0x369F, 0x36A0, 0x36A1, 0x36A2, 0x36A3,\n    0x36A4, 0x36A5, 0x36A6, 0x36A7, 0x36A8, 0x36A9, 0x36AA, 0x36AB,\n    0x36AC, 0x36AD, 0x36AE, 0x36AF, 0x36B0, 0x36B1, 0x36B2, 0x36B3,\n    0x36B4, 0x36B5, 0x36B6, 0x36B7, 0x36B8, 0x36B9, 0x36BA, 0x36BB,\n    0x36BC, 0x36BD, 0x36BE, 0x36BF, 0x36C0, 0x36C1, 0x36C2, 0x36C3,\n    0x36C4, 0x36C5, 0x36C6, 0x36C7, 0x36C8, 0x36C9, 0x36CA, 0x36CB,\n    0x36CC, 0x36CD, 0x36CE, 0x36CF, 0x36D0, 0x36D1, 0x36D2, 0x36D3,\n    0x36D4, 0x36D5, 0x36D6, 0x36D7, 0x36D8, 0x36D9, 0x36DA, 0x36DB,\n    0x36DC, 0x36DD, 0x36DE, 0x36DF, 0x36E0, 0x36E1, 0x36E2, 0x36E3,\n    0x36E4, 0x36E5, 0x36E6, 0x36E7, 0x36E8, 0x36E9, 0x36EA, 0x36EB,\n    0x36EC, 0x36ED, 0x36EE, 0x36EF, 0x36F0, 0x36F1, 0x36F2, 0x36F3,\n    0x36F4, 0x36F5, 0x36F6, 0x36F7, 0x36F8, 0x36F9, 0x36FA, 0x36FB,\n    0x36FC, 0x36FD, 0x36FE, 0x36FF, 0x3700, 0x3701, 0x3702, 0x3703,\n    0x3704, 0x3705, 0x3706, 0x3707, 0x3708, 0x3709, 0x370A, 0x370B,\n    0x370C, 0x370D, 0x370E, 0x370F, 0x3710, 0x3711, 0x3712, 0x3713,\n    0x3714, 0x3715, 0x3716, 0x3717, 0x3718, 0x3719, 0x371A, 0x371B,\n    0x371C, 0x371D, 0x371E, 0x371F, 0x3720, 0x3721, 0x3722, 0x3723,\n    0x3724, 0x3725, 0x3726, 0x3727, 0x3728, 0x3729, 0x372A, 0x372B,\n    0x372C, 0x372D, 0x372E, 0x372F, 0x3730, 0x3731, 0x3732, 0x3733,\n    0x3734, 0x3735, 0x3736, 0x3737, 0x3738, 0x3739, 0x373A, 0x373B,\n    0x373C, 0x373D, 0x373E, 0x373F, 0x3740, 0x3741, 0x3742, 0x3743,\n    0x3744, 0x3745, 0x3746, 0x3747, 0x3748, 0x3749, 0x374A, 0x374B,\n    0x374C, 0x374D, 0x374E, 0x374F, 0x3750, 0x3751, 0x3752, 0x3753,\n    0x3754, 0x3755, 0x3756, 0x3757, 0x3758, 0x3759, 0x375A, 0x375B,\n    0x375C, 0x375D, 0x375E, 0x375F, 0x3760, 0x3761, 0x3762, 0x3763,\n    0x3764, 0x3765, 0x3766, 0x3767, 0x3768, 0x3769, 0x376A, 0x376B,\n    0x376C, 0x376D, 0x376E, 0x376F, 0x3770, 0x3771, 0x3772, 0x3773,\n    0x3774, 0x3775, 0x3776, 0x3777, 0x3778, 0x3779, 0x377A, 0x377B,\n    0x377C, 0x377D, 0x377E, 0x377F, 0x3780, 0x3781, 0x3782, 0x3783,\n    0x3784, 0x3785, 0x3786, 0x3787, 0x3788, 0x3789, 0x378A, 0x378B,\n    0x378C, 0x378D, 0x378E, 0x378F, 0x3790, 0x3791, 0x3792, 0x3793,\n    0x3794, 0x3795, 0x3796, 0x3797, 0x3798, 0x3799, 0x379A, 0x379B,\n    0x379C, 0x379D, 0x379E, 0x379F, 0x37A0, 0x37A1, 0x37A2, 0x37A3,\n    0x37A4, 0x37A5, 0x37A6, 0x37A7, 0x37A8, 0x37A9, 0x37AA, 0x37AB,\n    0x37AC, 0x37AD, 0x37AE, 0x37AF, 0x37B0, 0x37B1, 0x37B2, 0x37B3,\n    0x37B4, 0x37B5, 0x37B6, 0x37B7, 0x37B8, 0x37B9, 0x37BA, 0x37BB,\n    0x37BC, 0x37BD, 0x37BE, 0x37BF, 0x37C0, 0x37C1, 0x37C2, 0x37C3,\n    0x37C4, 0x37C5, 0x37C6, 0x37C7, 0x37C8, 0x37C9, 0x37CA, 0x37CB,\n    0x37CC, 0x37CD, 0x37CE, 0x37CF, 0x37D0, 0x37D1, 0x37D2, 0x37D3,\n    0x37D4, 0x37D5, 0x37D6, 0x37D7, 0x37D8, 0x37D9, 0x37DA, 0x37DB,\n    0x37DC, 0x37DD, 0x37DE, 0x37DF, 0x37E0, 0x37E1, 0x37E2, 0x37E3,\n    0x37E4, 0x37E5, 0x37E6, 0x37E7, 0x37E8, 0x37E9, 0x37EA, 0x37EB,\n    0x37EC, 0x37ED, 0x37EE, 0x37EF, 0x37F0, 0x37F1, 0x37F2, 0x37F3,\n    0x37F4, 0x37F5, 0x37F6, 0x37F7, 0x37F8, 0x37F9, 0x37FA, 0x37FB,\n    0x37FC, 0x37FD, 0x37FE, 0x37FF, 0x3800, 0x3801, 0x3802, 0x3803,\n    0x3804, 0x3805, 0x3806, 0x3807, 0x3808, 0x3809, 0x380A, 0x380B,\n    0x380C, 0x380D, 0x380E, 0x380F, 0x3810, 0x3811, 0x3812, 0x3813,\n    0x3814, 0x3815, 0x3816, 0x3817, 0x3818, 0x3819, 0x381A, 0x381B,\n    0x381C, 0x381D, 0x381E, 0x381F, 0x3820, 0x3821, 0x3822, 0x3823,\n    0x3824, 0x3825, 0x3826, 0x3827, 0x3828, 0x3829, 0x382A, 0x382B,\n    0x382C, 0x382D, 0x382E, 0x382F, 0x3830, 0x3831, 0x3832, 0x3833,\n    0x3834, 0x3835, 0x3836, 0x3837, 0x3838, 0x3839, 0x383A, 0x383B,\n    0x383C, 0x383D, 0x383E, 0x383F, 0x3840, 0x3841, 0x3842, 0x3843,\n    0x3844, 0x3845, 0x3846, 0x3847, 0x3848, 0x3849, 0x384A, 0x384B,\n    0x384C, 0x384D, 0x384E, 0x384F, 0x3850, 0x3851, 0x3852, 0x3853,\n    0x3854, 0x3855, 0x3856, 0x3857, 0x3858, 0x3859, 0x385A, 0x385B,\n    0x385C, 0x385D, 0x385E, 0x385F, 0x3860, 0x3861, 0x3862, 0x3863,\n    0x3864, 0x3865, 0x3866, 0x3867, 0x3868, 0x3869, 0x386A, 0x386B,\n    0x386C, 0x386D, 0x386E, 0x386F, 0x3870, 0x3871, 0x3872, 0x3873,\n    0x3874, 0x3875, 0x3876, 0x3877, 0x3878, 0x3879, 0x387A, 0x387B,\n    0x387C, 0x387D, 0x387E, 0x387F, 0x3880, 0x3881, 0x3882, 0x3883,\n    0x3884, 0x3885, 0x3886, 0x3887, 0x3888, 0x3889, 0x388A, 0x388B,\n    0x388C, 0x388D, 0x388E, 0x388F, 0x3890, 0x3891, 0x3892, 0x3893,\n    0x3894, 0x3895, 0x3896, 0x3897, 0x3898, 0x3899, 0x389A, 0x389B,\n    0x389C, 0x389D, 0x389E, 0x389F, 0x38A0, 0x38A1, 0x38A2, 0x38A3,\n    0x38A4, 0x38A5, 0x38A6, 0x38A7, 0x38A8, 0x38A9, 0x38AA, 0x38AB,\n    0x38AC, 0x38AD, 0x38AE, 0x38AF, 0x38B0, 0x38B1, 0x38B2, 0x38B3,\n    0x38B4, 0x38B5, 0x38B6, 0x38B7, 0x38B8, 0x38B9, 0x38BA, 0x38BB,\n    0x38BC, 0x38BD, 0x38BE, 0x38BF, 0x38C0, 0x38C1, 0x38C2, 0x38C3,\n    0x38C4, 0x38C5, 0x38C6, 0x38C7, 0x38C8, 0x38C9, 0x38CA, 0x38CB,\n    0x38CC, 0x38CD, 0x38CE, 0x38CF, 0x38D0, 0x38D1, 0x38D2, 0x38D3,\n    0x38D4, 0x38D5, 0x38D6, 0x38D7, 0x38D8, 0x38D9, 0x38DA, 0x38DB,\n    0x38DC, 0x38DD, 0x38DE, 0x38DF, 0x38E0, 0x38E1, 0x38E2, 0x38E3,\n    0x38E4, 0x38E5, 0x38E6, 0x38E7, 0x38E8, 0x38E9, 0x38EA, 0x38EB,\n    0x38EC, 0x38ED, 0x38EE, 0x38EF, 0x38F0, 0x38F1, 0x38F2, 0x38F3,\n    0x38F4, 0x38F5, 0x38F6, 0x38F7, 0x38F8, 0x38F9, 0x38FA, 0x38FB,\n    0x38FC, 0x38FD, 0x38FE, 0x38FF, 0x3900, 0x3901, 0x3902, 0x3903,\n    0x3904, 0x3905, 0x3906, 0x3907, 0x3908, 0x3909, 0x390A, 0x390B,\n    0x390C, 0x390D, 0x390E, 0x390F, 0x3910, 0x3911, 0x3912, 0x3913,\n    0x3914, 0x3915, 0x3916, 0x3917, 0x3919, 0x391A, 0x391B, 0x391C,\n    0x391D, 0x391E, 0x391F, 0x3920, 0x3921, 0x3922, 0x3923, 0x3924,\n    0x3925, 0x3926, 0x3927, 0x3928, 0x3929, 0x392A, 0x392B, 0x392C,\n    0x392D, 0x392E, 0x392F, 0x3930, 0x3931, 0x3932, 0x3933, 0x3934,\n    0x3935, 0x3936, 0x3937, 0x3938, 0x3939, 0x393A, 0x393B, 0x393C,\n    0x393D, 0x393E, 0x393F, 0x3940, 0x3941, 0x3942, 0x3943, 0x3944,\n    0x3945, 0x3946, 0x3947, 0x3948, 0x3949, 0x394A, 0x394B, 0x394C,\n    0x394D, 0x394E, 0x394F, 0x3950, 0x3951, 0x3952, 0x3953, 0x3954,\n    0x3955, 0x3956, 0x3957, 0x3958, 0x3959, 0x395A, 0x395B, 0x395C,\n    0x395D, 0x395E, 0x395F, 0x3960, 0x3961, 0x3962, 0x3963, 0x3964,\n    0x3965, 0x3966, 0x3967, 0x3968, 0x3969, 0x396A, 0x396B, 0x396C,\n    0x396D, 0x396F, 0x3970, 0x3971, 0x3972, 0x3973, 0x3974, 0x3975,\n    0x3976, 0x3977, 0x3978, 0x3979, 0x397A, 0x397B, 0x397C, 0x397D,\n    0x397E, 0x397F, 0x3980, 0x3981, 0x3982, 0x3983, 0x3984, 0x3985,\n    0x3986, 0x3987, 0x3988, 0x3989, 0x398A, 0x398B, 0x398C, 0x398D,\n    0x398E, 0x398F, 0x3990, 0x3991, 0x3992, 0x3993, 0x3994, 0x3995,\n    0x3996, 0x3997, 0x3998, 0x3999, 0x399A, 0x399B, 0x399C, 0x399D,\n    0x399E, 0x399F, 0x39A0, 0x39A1, 0x39A2, 0x39A3, 0x39A4, 0x39A5,\n    0x39A6, 0x39A7, 0x39A8, 0x39A9, 0x39AA, 0x39AB, 0x39AC, 0x39AD,\n    0x39AE, 0x39AF, 0x39B0, 0x39B1, 0x39B2, 0x39B3, 0x39B4, 0x39B5,\n    0x39B6, 0x39B7, 0x39B8, 0x39B9, 0x39BA, 0x39BB, 0x39BC, 0x39BD,\n    0x39BE, 0x39BF, 0x39C0, 0x39C1, 0x39C2, 0x39C3, 0x39C4, 0x39C5,\n    0x39C6, 0x39C7, 0x39C8, 0x39C9, 0x39CA, 0x39CB, 0x39CC, 0x39CD,\n    0x39CE, 0x39D1, 0x39D2, 0x39D3, 0x39D4, 0x39D5, 0x39D6, 0x39D7,\n    0x39D8, 0x39D9, 0x39DA, 0x39DB, 0x39DC, 0x39DD, 0x39DE, 0x39E0,\n    0x39E1, 0x39E2, 0x39E3, 0x39E4, 0x39E5, 0x39E6, 0x39E7, 0x39E8,\n    0x39E9, 0x39EA, 0x39EB, 0x39EC, 0x39ED, 0x39EE, 0x39EF, 0x39F0,\n    0x39F1, 0x39F2, 0x39F3, 0x39F4, 0x39F5, 0x39F6, 0x39F7, 0x39F8,\n    0x39F9, 0x39FA, 0x39FB, 0x39FC, 0x39FD, 0x39FE, 0x39FF, 0x3A00,\n    0x3A01, 0x3A02, 0x3A03, 0x3A04, 0x3A05, 0x3A06, 0x3A07, 0x3A08,\n    0x3A09, 0x3A0A, 0x3A0B, 0x3A0C, 0x3A0D, 0x3A0E, 0x3A0F, 0x3A10,\n    0x3A11, 0x3A12, 0x3A13, 0x3A14, 0x3A15, 0x3A16, 0x3A17, 0x3A18,\n    0x3A19, 0x3A1A, 0x3A1B, 0x3A1C, 0x3A1D, 0x3A1E, 0x3A1F, 0x3A20,\n    0x3A21, 0x3A22, 0x3A23, 0x3A24, 0x3A25, 0x3A26, 0x3A27, 0x3A28,\n    0x3A29, 0x3A2A, 0x3A2B, 0x3A2C, 0x3A2D, 0x3A2E, 0x3A2F, 0x3A30,\n    0x3A31, 0x3A32, 0x3A33, 0x3A34, 0x3A35, 0x3A36, 0x3A37, 0x3A38,\n    0x3A39, 0x3A3A, 0x3A3B, 0x3A3C, 0x3A3D, 0x3A3E, 0x3A3F, 0x3A40,\n    0x3A41, 0x3A42, 0x3A43, 0x3A44, 0x3A45, 0x3A46, 0x3A47, 0x3A48,\n    0x3A49, 0x3A4A, 0x3A4B, 0x3A4C, 0x3A4D, 0x3A4E, 0x3A4F, 0x3A50,\n    0x3A51, 0x3A52, 0x3A53, 0x3A54, 0x3A55, 0x3A56, 0x3A57, 0x3A58,\n    0x3A59, 0x3A5A, 0x3A5B, 0x3A5C, 0x3A5D, 0x3A5E, 0x3A5F, 0x3A60,\n    0x3A61, 0x3A62, 0x3A63, 0x3A64, 0x3A65, 0x3A66, 0x3A67, 0x3A68,\n    0x3A69, 0x3A6A, 0x3A6B, 0x3A6C, 0x3A6D, 0x3A6E, 0x3A6F, 0x3A70,\n    0x3A71, 0x3A72, 0x3A74, 0x3A75, 0x3A76, 0x3A77, 0x3A78, 0x3A79,\n    0x3A7A, 0x3A7B, 0x3A7C, 0x3A7D, 0x3A7E, 0x3A7F, 0x3A80, 0x3A81,\n    0x3A82, 0x3A83, 0x3A84, 0x3A85, 0x3A86, 0x3A87, 0x3A88, 0x3A89,\n    0x3A8A, 0x3A8B, 0x3A8C, 0x3A8D, 0x3A8E, 0x3A8F, 0x3A90, 0x3A91,\n    0x3A92, 0x3A93, 0x3A94, 0x3A95, 0x3A96, 0x3A97, 0x3A98, 0x3A99,\n    0x3A9A, 0x3A9B, 0x3A9C, 0x3A9D, 0x3A9E, 0x3A9F, 0x3AA0, 0x3AA1,\n    0x3AA2, 0x3AA3, 0x3AA4, 0x3AA5, 0x3AA6, 0x3AA7, 0x3AA8, 0x3AA9,\n    0x3AAA, 0x3AAB, 0x3AAC, 0x3AAD, 0x3AAE, 0x3AAF, 0x3AB0, 0x3AB1,\n    0x3AB2, 0x3AB3, 0x3AB4, 0x3AB5, 0x3AB6, 0x3AB7, 0x3AB8, 0x3AB9,\n    0x3ABA, 0x3ABB, 0x3ABC, 0x3ABD, 0x3ABE, 0x3ABF, 0x3AC0, 0x3AC1,\n    0x3AC2, 0x3AC3, 0x3AC4, 0x3AC5, 0x3AC6, 0x3AC7, 0x3AC8, 0x3AC9,\n    0x3ACA, 0x3ACB, 0x3ACC, 0x3ACD, 0x3ACE, 0x3ACF, 0x3AD0, 0x3AD1,\n    0x3AD2, 0x3AD3, 0x3AD4, 0x3AD5, 0x3AD6, 0x3AD7, 0x3AD8, 0x3AD9,\n    0x3ADA, 0x3ADB, 0x3ADC, 0x3ADD, 0x3ADE, 0x3ADF, 0x3AE0, 0x3AE1,\n    0x3AE2, 0x3AE3, 0x3AE4, 0x3AE5, 0x3AE6, 0x3AE7, 0x3AE8, 0x3AE9,\n    0x3AEA, 0x3AEB, 0x3AEC, 0x3AED, 0x3AEE, 0x3AEF, 0x3AF0, 0x3AF1,\n    0x3AF2, 0x3AF3, 0x3AF4, 0x3AF5, 0x3AF6, 0x3AF7, 0x3AF8, 0x3AF9,\n    0x3AFA, 0x3AFB, 0x3AFC, 0x3AFD, 0x3AFE, 0x3AFF, 0x3B00, 0x3B01,\n    0x3B02, 0x3B03, 0x3B04, 0x3B05, 0x3B06, 0x3B07, 0x3B08, 0x3B09,\n    0x3B0A, 0x3B0B, 0x3B0C, 0x3B0D, 0x3B0E, 0x3B0F, 0x3B10, 0x3B11,\n    0x3B12, 0x3B13, 0x3B14, 0x3B15, 0x3B16, 0x3B17, 0x3B18, 0x3B19,\n    0x3B1A, 0x3B1B, 0x3B1C, 0x3B1D, 0x3B1E, 0x3B1F, 0x3B20, 0x3B21,\n    0x3B22, 0x3B23, 0x3B24, 0x3B25, 0x3B26, 0x3B27, 0x3B28, 0x3B29,\n    0x3B2A, 0x3B2B, 0x3B2C, 0x3B2D, 0x3B2E, 0x3B2F, 0x3B30, 0x3B31,\n    0x3B32, 0x3B33, 0x3B34, 0x3B35, 0x3B36, 0x3B37, 0x3B38, 0x3B39,\n    0x3B3A, 0x3B3B, 0x3B3C, 0x3B3D, 0x3B3E, 0x3B3F, 0x3B40, 0x3B41,\n    0x3B42, 0x3B43, 0x3B44, 0x3B45, 0x3B46, 0x3B47, 0x3B48, 0x3B49,\n    0x3B4A, 0x3B4B, 0x3B4C, 0x3B4D, 0x3B4F, 0x3B50, 0x3B51, 0x3B52,\n    0x3B53, 0x3B54, 0x3B55, 0x3B56, 0x3B57, 0x3B58, 0x3B59, 0x3B5A,\n    0x3B5B, 0x3B5C, 0x3B5D, 0x3B5E, 0x3B5F, 0x3B60, 0x3B61, 0x3B62,\n    0x3B63, 0x3B64, 0x3B65, 0x3B66, 0x3B67, 0x3B68, 0x3B69, 0x3B6A,\n    0x3B6B, 0x3B6C, 0x3B6D, 0x3B6E, 0x3B6F, 0x3B70, 0x3B71, 0x3B72,\n    0x3B73, 0x3B74, 0x3B75, 0x3B76, 0x3B77, 0x3B78, 0x3B79, 0x3B7A,\n    0x3B7B, 0x3B7C, 0x3B7D, 0x3B7E, 0x3B7F, 0x3B80, 0x3B81, 0x3B82,\n    0x3B83, 0x3B84, 0x3B85, 0x3B86, 0x3B87, 0x3B88, 0x3B89, 0x3B8A,\n    0x3B8B, 0x3B8C, 0x3B8D, 0x3B8E, 0x3B8F, 0x3B90, 0x3B91, 0x3B92,\n    0x3B93, 0x3B94, 0x3B95, 0x3B96, 0x3B97, 0x3B98, 0x3B99, 0x3B9A,\n    0x3B9B, 0x3B9C, 0x3B9D, 0x3B9E, 0x3B9F, 0x3BA0, 0x3BA1, 0x3BA2,\n    0x3BA3, 0x3BA4, 0x3BA5, 0x3BA6, 0x3BA7, 0x3BA8, 0x3BA9, 0x3BAA,\n    0x3BAB, 0x3BAC, 0x3BAD, 0x3BAE, 0x3BAF, 0x3BB0, 0x3BB1, 0x3BB2,\n    0x3BB3, 0x3BB4, 0x3BB5, 0x3BB6, 0x3BB7, 0x3BB8, 0x3BB9, 0x3BBA,\n    0x3BBB, 0x3BBC, 0x3BBD, 0x3BBE, 0x3BBF, 0x3BC0, 0x3BC1, 0x3BC2,\n    0x3BC3, 0x3BC4, 0x3BC5, 0x3BC6, 0x3BC7, 0x3BC8, 0x3BC9, 0x3BCA,\n    0x3BCB, 0x3BCC, 0x3BCD, 0x3BCE, 0x3BCF, 0x3BD0, 0x3BD1, 0x3BD2,\n    0x3BD3, 0x3BD4, 0x3BD5, 0x3BD6, 0x3BD7, 0x3BD8, 0x3BD9, 0x3BDA,\n    0x3BDB, 0x3BDC, 0x3BDD, 0x3BDE, 0x3BDF, 0x3BE0, 0x3BE1, 0x3BE2,\n    0x3BE3, 0x3BE4, 0x3BE5, 0x3BE6, 0x3BE7, 0x3BE8, 0x3BE9, 0x3BEA,\n    0x3BEB, 0x3BEC, 0x3BED, 0x3BEE, 0x3BEF, 0x3BF0, 0x3BF1, 0x3BF2,\n    0x3BF3, 0x3BF4, 0x3BF5, 0x3BF6, 0x3BF7, 0x3BF8, 0x3BF9, 0x3BFA,\n    0x3BFB, 0x3BFC, 0x3BFD, 0x3BFE, 0x3BFF, 0x3C00, 0x3C01, 0x3C02,\n    0x3C03, 0x3C04, 0x3C05, 0x3C06, 0x3C07, 0x3C08, 0x3C09, 0x3C0A,\n    0x3C0B, 0x3C0C, 0x3C0D, 0x3C0E, 0x3C0F, 0x3C10, 0x3C11, 0x3C12,\n    0x3C13, 0x3C14, 0x3C15, 0x3C16, 0x3C17, 0x3C18, 0x3C19, 0x3C1A,\n    0x3C1B, 0x3C1C, 0x3C1D, 0x3C1E, 0x3C1F, 0x3C20, 0x3C21, 0x3C22,\n    0x3C23, 0x3C24, 0x3C25, 0x3C26, 0x3C27, 0x3C28, 0x3C29, 0x3C2A,\n    0x3C2B, 0x3C2C, 0x3C2D, 0x3C2E, 0x3C2F, 0x3C30, 0x3C31, 0x3C32,\n    0x3C33, 0x3C34, 0x3C35, 0x3C36, 0x3C37, 0x3C38, 0x3C39, 0x3C3A,\n    0x3C3B, 0x3C3C, 0x3C3D, 0x3C3E, 0x3C3F, 0x3C40, 0x3C41, 0x3C42,\n    0x3C43, 0x3C44, 0x3C45, 0x3C46, 0x3C47, 0x3C48, 0x3C49, 0x3C4A,\n    0x3C4B, 0x3C4C, 0x3C4D, 0x3C4E, 0x3C4F, 0x3C50, 0x3C51, 0x3C52,\n    0x3C53, 0x3C54, 0x3C55, 0x3C56, 0x3C57, 0x3C58, 0x3C59, 0x3C5A,\n    0x3C5B, 0x3C5C, 0x3C5D, 0x3C5E, 0x3C5F, 0x3C60, 0x3C61, 0x3C62,\n    0x3C63, 0x3C64, 0x3C65, 0x3C66, 0x3C67, 0x3C68, 0x3C69, 0x3C6A,\n    0x3C6B, 0x3C6C, 0x3C6D, 0x3C6F, 0x3C70, 0x3C71, 0x3C72, 0x3C73,\n    0x3C74, 0x3C75, 0x3C76, 0x3C77, 0x3C78, 0x3C79, 0x3C7A, 0x3C7B,\n    0x3C7C, 0x3C7D, 0x3C7E, 0x3C7F, 0x3C80, 0x3C81, 0x3C82, 0x3C83,\n    0x3C84, 0x3C85, 0x3C86, 0x3C87, 0x3C88, 0x3C89, 0x3C8A, 0x3C8B,\n    0x3C8C, 0x3C8D, 0x3C8E, 0x3C8F, 0x3C90, 0x3C91, 0x3C92, 0x3C93,\n    0x3C94, 0x3C95, 0x3C96, 0x3C97, 0x3C98, 0x3C99, 0x3C9A, 0x3C9B,\n    0x3C9C, 0x3C9D, 0x3C9E, 0x3C9F, 0x3CA0, 0x3CA1, 0x3CA2, 0x3CA3,\n    0x3CA4, 0x3CA5, 0x3CA6, 0x3CA7, 0x3CA8, 0x3CA9, 0x3CAA, 0x3CAB,\n    0x3CAC, 0x3CAD, 0x3CAE, 0x3CAF, 0x3CB0, 0x3CB1, 0x3CB2, 0x3CB3,\n    0x3CB4, 0x3CB5, 0x3CB6, 0x3CB7, 0x3CB8, 0x3CB9, 0x3CBA, 0x3CBB,\n    0x3CBC, 0x3CBD, 0x3CBE, 0x3CBF, 0x3CC0, 0x3CC1, 0x3CC2, 0x3CC3,\n    0x3CC4, 0x3CC5, 0x3CC6, 0x3CC7, 0x3CC8, 0x3CC9, 0x3CCA, 0x3CCB,\n    0x3CCC, 0x3CCD, 0x3CCE, 0x3CCF, 0x3CD0, 0x3CD1, 0x3CD2, 0x3CD3,\n    0x3CD4, 0x3CD5, 0x3CD6, 0x3CD7, 0x3CD8, 0x3CD9, 0x3CDA, 0x3CDB,\n    0x3CDC, 0x3CDD, 0x3CDE, 0x3CDF, 0x3CE1, 0x3CE2, 0x3CE3, 0x3CE4,\n    0x3CE5, 0x3CE6, 0x3CE7, 0x3CE8, 0x3CE9, 0x3CEA, 0x3CEB, 0x3CEC,\n    0x3CED, 0x3CEE, 0x3CEF, 0x3CF0, 0x3CF1, 0x3CF2, 0x3CF3, 0x3CF4,\n    0x3CF5, 0x3CF6, 0x3CF7, 0x3CF8, 0x3CF9, 0x3CFA, 0x3CFB, 0x3CFC,\n    0x3CFD, 0x3CFE, 0x3CFF, 0x3D00, 0x3D01, 0x3D02, 0x3D03, 0x3D04,\n    0x3D05, 0x3D06, 0x3D07, 0x3D08, 0x3D09, 0x3D0A, 0x3D0B, 0x3D0C,\n    0x3D0D, 0x3D0E, 0x3D0F, 0x3D10, 0x3D11, 0x3D12, 0x3D13, 0x3D14,\n    0x3D15, 0x3D16, 0x3D17, 0x3D18, 0x3D19, 0x3D1A, 0x3D1B, 0x3D1C,\n    0x3D1D, 0x3D1E, 0x3D1F, 0x3D20, 0x3D21, 0x3D22, 0x3D23, 0x3D24,\n    0x3D25, 0x3D26, 0x3D27, 0x3D28, 0x3D29, 0x3D2A, 0x3D2B, 0x3D2C,\n    0x3D2D, 0x3D2E, 0x3D2F, 0x3D30, 0x3D31, 0x3D32, 0x3D33, 0x3D34,\n    0x3D35, 0x3D36, 0x3D37, 0x3D38, 0x3D39, 0x3D3A, 0x3D3B, 0x3D3C,\n    0x3D3D, 0x3D3E, 0x3D3F, 0x3D40, 0x3D41, 0x3D42, 0x3D43, 0x3D44,\n    0x3D45, 0x3D46, 0x3D47, 0x3D48, 0x3D49, 0x3D4A, 0x3D4B, 0x3D4C,\n    0x3D4D, 0x3D4E, 0x3D4F, 0x3D50, 0x3D51, 0x3D52, 0x3D53, 0x3D54,\n    0x3D55, 0x3D56, 0x3D57, 0x3D58, 0x3D59, 0x3D5A, 0x3D5B, 0x3D5C,\n    0x3D5D, 0x3D5E, 0x3D5F, 0x3D60, 0x3D61, 0x3D62, 0x3D63, 0x3D64,\n    0x3D65, 0x3D66, 0x3D67, 0x3D68, 0x3D69, 0x3D6A, 0x3D6B, 0x3D6C,\n    0x3D6D, 0x3D6E, 0x3D6F, 0x3D70, 0x3D71, 0x3D72, 0x3D73, 0x3D74,\n    0x3D75, 0x3D76, 0x3D77, 0x3D78, 0x3D79, 0x3D7A, 0x3D7B, 0x3D7C,\n    0x3D7D, 0x3D7E, 0x3D7F, 0x3D80, 0x3D81, 0x3D82, 0x3D83, 0x3D84,\n    0x3D85, 0x3D86, 0x3D87, 0x3D88, 0x3D89, 0x3D8A, 0x3D8B, 0x3D8C,\n    0x3D8D, 0x3D8E, 0x3D8F, 0x3D90, 0x3D91, 0x3D92, 0x3D93, 0x3D94,\n    0x3D95, 0x3D96, 0x3D97, 0x3D98, 0x3D99, 0x3D9A, 0x3D9B, 0x3D9C,\n    0x3D9D, 0x3D9E, 0x3D9F, 0x3DA0, 0x3DA1, 0x3DA2, 0x3DA3, 0x3DA4,\n    0x3DA5, 0x3DA6, 0x3DA7, 0x3DA8, 0x3DA9, 0x3DAA, 0x3DAB, 0x3DAC,\n    0x3DAD, 0x3DAE, 0x3DAF, 0x3DB0, 0x3DB1, 0x3DB2, 0x3DB3, 0x3DB4,\n    0x3DB5, 0x3DB6, 0x3DB7, 0x3DB8, 0x3DB9, 0x3DBA, 0x3DBB, 0x3DBC,\n    0x3DBD, 0x3DBE, 0x3DBF, 0x3DC0, 0x3DC1, 0x3DC2, 0x3DC3, 0x3DC4,\n    0x3DC5, 0x3DC6, 0x3DC7, 0x3DC8, 0x3DC9, 0x3DCA, 0x3DCB, 0x3DCC,\n    0x3DCD, 0x3DCE, 0x3DCF, 0x3DD0, 0x3DD1, 0x3DD2, 0x3DD3, 0x3DD4,\n    0x3DD5, 0x3DD6, 0x3DD7, 0x3DD8, 0x3DD9, 0x3DDA, 0x3DDB, 0x3DDC,\n    0x3DDD, 0x3DDE, 0x3DDF, 0x3DE0, 0x3DE1, 0x3DE2, 0x3DE3, 0x3DE4,\n    0x3DE5, 0x3DE6, 0x3DE7, 0x3DE8, 0x3DE9, 0x3DEA, 0x3DEB, 0x3DEC,\n    0x3DED, 0x3DEE, 0x3DEF, 0x3DF0, 0x3DF1, 0x3DF2, 0x3DF3, 0x3DF4,\n    0x3DF5, 0x3DF6, 0x3DF7, 0x3DF8, 0x3DF9, 0x3DFA, 0x3DFB, 0x3DFC,\n    0x3DFD, 0x3DFE, 0x3DFF, 0x3E00, 0x3E01, 0x3E02, 0x3E03, 0x3E04,\n    0x3E05, 0x3E06, 0x3E07, 0x3E08, 0x3E09, 0x3E0A, 0x3E0B, 0x3E0C,\n    0x3E0D, 0x3E0E, 0x3E0F, 0x3E10, 0x3E11, 0x3E12, 0x3E13, 0x3E14,\n    0x3E15, 0x3E16, 0x3E17, 0x3E18, 0x3E19, 0x3E1A, 0x3E1B, 0x3E1C,\n    0x3E1D, 0x3E1E, 0x3E1F, 0x3E20, 0x3E21, 0x3E22, 0x3E23, 0x3E24,\n    0x3E25, 0x3E26, 0x3E27, 0x3E28, 0x3E29, 0x3E2A, 0x3E2B, 0x3E2C,\n    0x3E2D, 0x3E2E, 0x3E2F, 0x3E30, 0x3E31, 0x3E32, 0x3E33, 0x3E34,\n    0x3E35, 0x3E36, 0x3E37, 0x3E38, 0x3E39, 0x3E3A, 0x3E3B, 0x3E3C,\n    0x3E3D, 0x3E3E, 0x3E3F, 0x3E40, 0x3E41, 0x3E42, 0x3E43, 0x3E44,\n    0x3E45, 0x3E46, 0x3E47, 0x3E48, 0x3E49, 0x3E4A, 0x3E4B, 0x3E4C,\n    0x3E4D, 0x3E4E, 0x3E4F, 0x3E50, 0x3E51, 0x3E52, 0x3E53, 0x3E54,\n    0x3E55, 0x3E56, 0x3E57, 0x3E58, 0x3E59, 0x3E5A, 0x3E5B, 0x3E5C,\n    0x3E5D, 0x3E5E, 0x3E5F, 0x3E60, 0x3E61, 0x3E62, 0x3E63, 0x3E64,\n    0x3E65, 0x3E66, 0x3E67, 0x3E68, 0x3E69, 0x3E6A, 0x3E6B, 0x3E6C,\n    0x3E6D, 0x3E6E, 0x3E6F, 0x3E70, 0x3E71, 0x3E72, 0x3E73, 0x3E74,\n    0x3E75, 0x3E76, 0x3E77, 0x3E78, 0x3E79, 0x3E7A, 0x3E7B, 0x3E7C,\n    0x3E7D, 0x3E7E, 0x3E7F, 0x3E80, 0x3E81, 0x3E82, 0x3E83, 0x3E84,\n    0x3E85, 0x3E86, 0x3E87, 0x3E88, 0x3E89, 0x3E8A, 0x3E8B, 0x3E8C,\n    0x3E8D, 0x3E8E, 0x3E8F, 0x3E90, 0x3E91, 0x3E92, 0x3E93, 0x3E94,\n    0x3E95, 0x3E96, 0x3E97, 0x3E98, 0x3E99, 0x3E9A, 0x3E9B, 0x3E9C,\n    0x3E9D, 0x3E9E, 0x3E9F, 0x3EA0, 0x3EA1, 0x3EA2, 0x3EA3, 0x3EA4,\n    0x3EA5, 0x3EA6, 0x3EA7, 0x3EA8, 0x3EA9, 0x3EAA, 0x3EAB, 0x3EAC,\n    0x3EAD, 0x3EAE, 0x3EAF, 0x3EB0, 0x3EB1, 0x3EB2, 0x3EB3, 0x3EB4,\n    0x3EB5, 0x3EB6, 0x3EB7, 0x3EB8, 0x3EB9, 0x3EBA, 0x3EBB, 0x3EBC,\n    0x3EBD, 0x3EBE, 0x3EBF, 0x3EC0, 0x3EC1, 0x3EC2, 0x3EC3, 0x3EC4,\n    0x3EC5, 0x3EC6, 0x3EC7, 0x3EC8, 0x3EC9, 0x3ECA, 0x3ECB, 0x3ECC,\n    0x3ECD, 0x3ECE, 0x3ECF, 0x3ED0, 0x3ED1, 0x3ED2, 0x3ED3, 0x3ED4,\n    0x3ED5, 0x3ED6, 0x3ED7, 0x3ED8, 0x3ED9, 0x3EDA, 0x3EDB, 0x3EDC,\n    0x3EDD, 0x3EDE, 0x3EDF, 0x3EE0, 0x3EE1, 0x3EE2, 0x3EE3, 0x3EE4,\n    0x3EE5, 0x3EE6, 0x3EE7, 0x3EE8, 0x3EE9, 0x3EEA, 0x3EEB, 0x3EEC,\n    0x3EED, 0x3EEE, 0x3EEF, 0x3EF0, 0x3EF1, 0x3EF2, 0x3EF3, 0x3EF4,\n    0x3EF5, 0x3EF6, 0x3EF7, 0x3EF8, 0x3EF9, 0x3EFA, 0x3EFB, 0x3EFC,\n    0x3EFD, 0x3EFE, 0x3EFF, 0x3F00, 0x3F01, 0x3F02, 0x3F03, 0x3F04,\n    0x3F05, 0x3F06, 0x3F07, 0x3F08, 0x3F09, 0x3F0A, 0x3F0B, 0x3F0C,\n    0x3F0D, 0x3F0E, 0x3F0F, 0x3F10, 0x3F11, 0x3F12, 0x3F13, 0x3F14,\n    0x3F15, 0x3F16, 0x3F17, 0x3F18, 0x3F19, 0x3F1A, 0x3F1B, 0x3F1C,\n    0x3F1D, 0x3F1E, 0x3F1F, 0x3F20, 0x3F21, 0x3F22, 0x3F23, 0x3F24,\n    0x3F25, 0x3F26, 0x3F27, 0x3F28, 0x3F29, 0x3F2A, 0x3F2B, 0x3F2C,\n    0x3F2D, 0x3F2E, 0x3F2F, 0x3F30, 0x3F31, 0x3F32, 0x3F33, 0x3F34,\n    0x3F35, 0x3F36, 0x3F37, 0x3F38, 0x3F39, 0x3F3A, 0x3F3B, 0x3F3C,\n    0x3F3D, 0x3F3E, 0x3F3F, 0x3F40, 0x3F41, 0x3F42, 0x3F43, 0x3F44,\n    0x3F45, 0x3F46, 0x3F47, 0x3F48, 0x3F49, 0x3F4A, 0x3F4B, 0x3F4C,\n    0x3F4D, 0x3F4E, 0x3F4F, 0x3F50, 0x3F51, 0x3F52, 0x3F53, 0x3F54,\n    0x3F55, 0x3F56, 0x3F57, 0x3F58, 0x3F59, 0x3F5A, 0x3F5B, 0x3F5C,\n    0x3F5D, 0x3F5E, 0x3F5F, 0x3F60, 0x3F61, 0x3F62, 0x3F63, 0x3F64,\n    0x3F65, 0x3F66, 0x3F67, 0x3F68, 0x3F69, 0x3F6A, 0x3F6B, 0x3F6C,\n    0x3F6D, 0x3F6E, 0x3F6F, 0x3F70, 0x3F71, 0x3F72, 0x3F73, 0x3F74,\n    0x3F75, 0x3F76, 0x3F77, 0x3F78, 0x3F79, 0x3F7A, 0x3F7B, 0x3F7C,\n    0x3F7D, 0x3F7E, 0x3F7F, 0x3F80, 0x3F81, 0x3F82, 0x3F83, 0x3F84,\n    0x3F85, 0x3F86, 0x3F87, 0x3F88, 0x3F89, 0x3F8A, 0x3F8B, 0x3F8C,\n    0x3F8D, 0x3F8E, 0x3F8F, 0x3F90, 0x3F91, 0x3F92, 0x3F93, 0x3F94,\n    0x3F95, 0x3F96, 0x3F97, 0x3F98, 0x3F99, 0x3F9A, 0x3F9B, 0x3F9C,\n    0x3F9D, 0x3F9E, 0x3F9F, 0x3FA0, 0x3FA1, 0x3FA2, 0x3FA3, 0x3FA4,\n    0x3FA5, 0x3FA6, 0x3FA7, 0x3FA8, 0x3FA9, 0x3FAA, 0x3FAB, 0x3FAC,\n    0x3FAD, 0x3FAE, 0x3FAF, 0x3FB0, 0x3FB1, 0x3FB2, 0x3FB3, 0x3FB4,\n    0x3FB5, 0x3FB6, 0x3FB7, 0x3FB8, 0x3FB9, 0x3FBA, 0x3FBB, 0x3FBC,\n    0x3FBD, 0x3FBE, 0x3FBF, 0x3FC0, 0x3FC1, 0x3FC2, 0x3FC3, 0x3FC4,\n    0x3FC5, 0x3FC6, 0x3FC7, 0x3FC8, 0x3FC9, 0x3FCA, 0x3FCB, 0x3FCC,\n    0x3FCD, 0x3FCE, 0x3FCF, 0x3FD0, 0x3FD1, 0x3FD2, 0x3FD3, 0x3FD4,\n    0x3FD5, 0x3FD6, 0x3FD7, 0x3FD8, 0x3FD9, 0x3FDA, 0x3FDB, 0x3FDC,\n    0x3FDD, 0x3FDE, 0x3FDF, 0x3FE0, 0x3FE1, 0x3FE2, 0x3FE3, 0x3FE4,\n    0x3FE5, 0x3FE6, 0x3FE7, 0x3FE8, 0x3FE9, 0x3FEA, 0x3FEB, 0x3FEC,\n    0x3FED, 0x3FEE, 0x3FEF, 0x3FF0, 0x3FF1, 0x3FF2, 0x3FF3, 0x3FF4,\n    0x3FF5, 0x3FF6, 0x3FF7, 0x3FF8, 0x3FF9, 0x3FFA, 0x3FFB, 0x3FFC,\n    0x3FFD, 0x3FFE, 0x3FFF, 0x4000, 0x4001, 0x4002, 0x4003, 0x4004,\n    0x4005, 0x4006, 0x4007, 0x4008, 0x4009, 0x400A, 0x400B, 0x400C,\n    0x400D, 0x400E, 0x400F, 0x4010, 0x4011, 0x4012, 0x4013, 0x4014,\n    0x4015, 0x4016, 0x4017, 0x4018, 0x4019, 0x401A, 0x401B, 0x401C,\n    0x401D, 0x401E, 0x401F, 0x4020, 0x4021, 0x4022, 0x4023, 0x4024,\n    0x4025, 0x4026, 0x4027, 0x4028, 0x4029, 0x402A, 0x402B, 0x402C,\n    0x402D, 0x402E, 0x402F, 0x4030, 0x4031, 0x4032, 0x4033, 0x4034,\n    0x4035, 0x4036, 0x4037, 0x4038, 0x4039, 0x403A, 0x403B, 0x403C,\n    0x403D, 0x403E, 0x403F, 0x4040, 0x4041, 0x4042, 0x4043, 0x4044,\n    0x4045, 0x4046, 0x4047, 0x4048, 0x4049, 0x404A, 0x404B, 0x404C,\n    0x404D, 0x404E, 0x404F, 0x4050, 0x4051, 0x4052, 0x4053, 0x4054,\n    0x4055, 0x4057, 0x4058, 0x4059, 0x405A, 0x405B, 0x405C, 0x405D,\n    0x405E, 0x405F, 0x4060, 0x4061, 0x4062, 0x4063, 0x4064, 0x4065,\n    0x4066, 0x4067, 0x4068, 0x4069, 0x406A, 0x406B, 0x406C, 0x406D,\n    0x406E, 0x406F, 0x4070, 0x4071, 0x4072, 0x4073, 0x4074, 0x4075,\n    0x4076, 0x4077, 0x4078, 0x4079, 0x407A, 0x407B, 0x407C, 0x407D,\n    0x407E, 0x407F, 0x4080, 0x4081, 0x4082, 0x4083, 0x4084, 0x4085,\n    0x4086, 0x4087, 0x4088, 0x4089, 0x408A, 0x408B, 0x408C, 0x408D,\n    0x408E, 0x408F, 0x4090, 0x4091, 0x4092, 0x4093, 0x4094, 0x4095,\n    0x4096, 0x4097, 0x4098, 0x4099, 0x409A, 0x409B, 0x409C, 0x409D,\n    0x409E, 0x409F, 0x40A0, 0x40A1, 0x40A2, 0x40A3, 0x40A4, 0x40A5,\n    0x40A6, 0x40A7, 0x40A8, 0x40A9, 0x40AA, 0x40AB, 0x40AC, 0x40AD,\n    0x40AE, 0x40AF, 0x40B0, 0x40B1, 0x40B2, 0x40B3, 0x40B4, 0x40B5,\n    0x40B6, 0x40B7, 0x40B8, 0x40B9, 0x40BA, 0x40BB, 0x40BC, 0x40BD,\n    0x40BE, 0x40BF, 0x40C0, 0x40C1, 0x40C2, 0x40C3, 0x40C4, 0x40C5,\n    0x40C6, 0x40C7, 0x40C8, 0x40C9, 0x40CA, 0x40CB, 0x40CC, 0x40CD,\n    0x40CE, 0x40CF, 0x40D0, 0x40D1, 0x40D2, 0x40D3, 0x40D4, 0x40D5,\n    0x40D6, 0x40D7, 0x40D8, 0x40D9, 0x40DA, 0x40DB, 0x40DC, 0x40DD,\n    0x40DE, 0x40DF, 0x40E0, 0x40E1, 0x40E2, 0x40E3, 0x40E4, 0x40E5,\n    0x40E6, 0x40E7, 0x40E8, 0x40E9, 0x40EA, 0x40EB, 0x40EC, 0x40ED,\n    0x40EE, 0x40EF, 0x40F0, 0x40F1, 0x40F2, 0x40F3, 0x40F4, 0x40F5,\n    0x40F6, 0x40F7, 0x40F8, 0x40F9, 0x40FA, 0x40FB, 0x40FC, 0x40FD,\n    0x40FE, 0x40FF, 0x4100, 0x4101, 0x4102, 0x4103, 0x4104, 0x4105,\n    0x4106, 0x4107, 0x4108, 0x4109, 0x410A, 0x410B, 0x410C, 0x410D,\n    0x410E, 0x410F, 0x4110, 0x4111, 0x4112, 0x4113, 0x4114, 0x4115,\n    0x4116, 0x4117, 0x4118, 0x4119, 0x411A, 0x411B, 0x411C, 0x411D,\n    0x411E, 0x411F, 0x4120, 0x4121, 0x4122, 0x4123, 0x4124, 0x4125,\n    0x4126, 0x4127, 0x4128, 0x4129, 0x412A, 0x412B, 0x412C, 0x412D,\n    0x412E, 0x412F, 0x4130, 0x4131, 0x4132, 0x4133, 0x4134, 0x4135,\n    0x4136, 0x4137, 0x4138, 0x4139, 0x413A, 0x413B, 0x413C, 0x413D,\n    0x413E, 0x413F, 0x4140, 0x4141, 0x4142, 0x4143, 0x4144, 0x4145,\n    0x4146, 0x4147, 0x4148, 0x4149, 0x414A, 0x414B, 0x414C, 0x414D,\n    0x414E, 0x414F, 0x4150, 0x4151, 0x4152, 0x4153, 0x4154, 0x4155,\n    0x4156, 0x4157, 0x4158, 0x4159, 0x415A, 0x415B, 0x415C, 0x415D,\n    0x415E, 0x4160, 0x4161, 0x4162, 0x4163, 0x4164, 0x4165, 0x4166,\n    0x4167, 0x4168, 0x4169, 0x416A, 0x416B, 0x416C, 0x416D, 0x416E,\n    0x416F, 0x4170, 0x4171, 0x4172, 0x4173, 0x4174, 0x4175, 0x4176,\n    0x4177, 0x4178, 0x4179, 0x417A, 0x417B, 0x417C, 0x417D, 0x417E,\n    0x417F, 0x4180, 0x4181, 0x4182, 0x4183, 0x4184, 0x4185, 0x4186,\n    0x4187, 0x4188, 0x4189, 0x418A, 0x418B, 0x418C, 0x418D, 0x418E,\n    0x418F, 0x4190, 0x4191, 0x4192, 0x4193, 0x4194, 0x4195, 0x4196,\n    0x4197, 0x4198, 0x4199, 0x419A, 0x419B, 0x419C, 0x419D, 0x419E,\n    0x419F, 0x41A0, 0x41A1, 0x41A2, 0x41A3, 0x41A4, 0x41A5, 0x41A6,\n    0x41A7, 0x41A8, 0x41A9, 0x41AA, 0x41AB, 0x41AC, 0x41AD, 0x41AE,\n    0x41AF, 0x41B0, 0x41B1, 0x41B2, 0x41B3, 0x41B4, 0x41B5, 0x41B6,\n    0x41B7, 0x41B8, 0x41B9, 0x41BA, 0x41BB, 0x41BC, 0x41BD, 0x41BE,\n    0x41BF, 0x41C0, 0x41C1, 0x41C2, 0x41C3, 0x41C4, 0x41C5, 0x41C6,\n    0x41C7, 0x41C8, 0x41C9, 0x41CA, 0x41CB, 0x41CC, 0x41CD, 0x41CE,\n    0x41CF, 0x41D0, 0x41D1, 0x41D2, 0x41D3, 0x41D4, 0x41D5, 0x41D6,\n    0x41D7, 0x41D8, 0x41D9, 0x41DA, 0x41DB, 0x41DC, 0x41DD, 0x41DE,\n    0x41DF, 0x41E0, 0x41E1, 0x41E2, 0x41E3, 0x41E4, 0x41E5, 0x41E6,\n    0x41E7, 0x41E8, 0x41E9, 0x41EA, 0x41EB, 0x41EC, 0x41ED, 0x41EE,\n    0x41EF, 0x41F0, 0x41F1, 0x41F2, 0x41F3, 0x41F4, 0x41F5, 0x41F6,\n    0x41F7, 0x41F8, 0x41F9, 0x41FA, 0x41FB, 0x41FC, 0x41FD, 0x41FE,\n    0x41FF, 0x4200, 0x4201, 0x4202, 0x4203, 0x4204, 0x4205, 0x4206,\n    0x4207, 0x4208, 0x4209, 0x420A, 0x420B, 0x420C, 0x420D, 0x420E,\n    0x420F, 0x4210, 0x4211, 0x4212, 0x4213, 0x4214, 0x4215, 0x4216,\n    0x4217, 0x4218, 0x4219, 0x421A, 0x421B, 0x421C, 0x421D, 0x421E,\n    0x421F, 0x4220, 0x4221, 0x4222, 0x4223, 0x4224, 0x4225, 0x4226,\n    0x4227, 0x4228, 0x4229, 0x422A, 0x422B, 0x422C, 0x422D, 0x422E,\n    0x422F, 0x4230, 0x4231, 0x4232, 0x4233, 0x4234, 0x4235, 0x4236,\n    0x4237, 0x4238, 0x4239, 0x423A, 0x423B, 0x423C, 0x423D, 0x423E,\n    0x423F, 0x4240, 0x4241, 0x4242, 0x4243, 0x4244, 0x4245, 0x4246,\n    0x4247, 0x4248, 0x4249, 0x424A, 0x424B, 0x424C, 0x424D, 0x424E,\n    0x424F, 0x4250, 0x4251, 0x4252, 0x4253, 0x4254, 0x4255, 0x4256,\n    0x4257, 0x4258, 0x4259, 0x425A, 0x425B, 0x425C, 0x425D, 0x425E,\n    0x425F, 0x4260, 0x4261, 0x4262, 0x4263, 0x4264, 0x4265, 0x4266,\n    0x4267, 0x4268, 0x4269, 0x426A, 0x426B, 0x426C, 0x426D, 0x426E,\n    0x426F, 0x4270, 0x4271, 0x4272, 0x4273, 0x4274, 0x4275, 0x4276,\n    0x4277, 0x4278, 0x4279, 0x427A, 0x427B, 0x427C, 0x427D, 0x427E,\n    0x427F, 0x4280, 0x4281, 0x4282, 0x4283, 0x4284, 0x4285, 0x4286,\n    0x4287, 0x4288, 0x4289, 0x428A, 0x428B, 0x428C, 0x428D, 0x428E,\n    0x428F, 0x4290, 0x4291, 0x4292, 0x4293, 0x4294, 0x4295, 0x4296,\n    0x4297, 0x4298, 0x4299, 0x429A, 0x429B, 0x429C, 0x429D, 0x429E,\n    0x429F, 0x42A0, 0x42A1, 0x42A2, 0x42A3, 0x42A4, 0x42A5, 0x42A6,\n    0x42A7, 0x42A8, 0x42A9, 0x42AA, 0x42AB, 0x42AC, 0x42AD, 0x42AE,\n    0x42AF, 0x42B0, 0x42B1, 0x42B2, 0x42B3, 0x42B4, 0x42B5, 0x42B6,\n    0x42B7, 0x42B8, 0x42B9, 0x42BA, 0x42BB, 0x42BC, 0x42BD, 0x42BE,\n    0x42BF, 0x42C0, 0x42C1, 0x42C2, 0x42C3, 0x42C4, 0x42C5, 0x42C6,\n    0x42C7, 0x42C8, 0x42C9, 0x42CA, 0x42CB, 0x42CC, 0x42CD, 0x42CE,\n    0x42CF, 0x42D0, 0x42D1, 0x42D2, 0x42D3, 0x42D4, 0x42D5, 0x42D6,\n    0x42D7, 0x42D8, 0x42D9, 0x42DA, 0x42DB, 0x42DC, 0x42DD, 0x42DE,\n    0x42DF, 0x42E0, 0x42E1, 0x42E2, 0x42E3, 0x42E4, 0x42E5, 0x42E6,\n    0x42E7, 0x42E8, 0x42E9, 0x42EA, 0x42EB, 0x42EC, 0x42ED, 0x42EE,\n    0x42EF, 0x42F0, 0x42F1, 0x42F2, 0x42F3, 0x42F4, 0x42F5, 0x42F6,\n    0x42F7, 0x42F8, 0x42F9, 0x42FA, 0x42FB, 0x42FC, 0x42FD, 0x42FE,\n    0x42FF, 0x4300, 0x4301, 0x4302, 0x4303, 0x4304, 0x4305, 0x4306,\n    0x4307, 0x4308, 0x4309, 0x430A, 0x430B, 0x430C, 0x430D, 0x430E,\n    0x430F, 0x4310, 0x4311, 0x4312, 0x4313, 0x4314, 0x4315, 0x4316,\n    0x4317, 0x4318, 0x4319, 0x431A, 0x431B, 0x431C, 0x431D, 0x431E,\n    0x431F, 0x4320, 0x4321, 0x4322, 0x4323, 0x4324, 0x4325, 0x4326,\n    0x4327, 0x4328, 0x4329, 0x432A, 0x432B, 0x432C, 0x432D, 0x432E,\n    0x432F, 0x4330, 0x4331, 0x4332, 0x4333, 0x4334, 0x4335, 0x4336,\n    0x4338, 0x4339, 0x433A, 0x433B, 0x433C, 0x433D, 0x433E, 0x433F,\n    0x4340, 0x4341, 0x4342, 0x4343, 0x4344, 0x4345, 0x4346, 0x4347,\n    0x4348, 0x4349, 0x434A, 0x434B, 0x434C, 0x434D, 0x434E, 0x434F,\n    0x4350, 0x4351, 0x4352, 0x4353, 0x4354, 0x4355, 0x4356, 0x4357,\n    0x4358, 0x4359, 0x435A, 0x435B, 0x435C, 0x435D, 0x435E, 0x435F,\n    0x4360, 0x4361, 0x4362, 0x4363, 0x4364, 0x4365, 0x4366, 0x4367,\n    0x4368, 0x4369, 0x436A, 0x436B, 0x436C, 0x436D, 0x436E, 0x436F,\n    0x4370, 0x4371, 0x4372, 0x4373, 0x4374, 0x4375, 0x4376, 0x4377,\n    0x4378, 0x4379, 0x437A, 0x437B, 0x437C, 0x437D, 0x437E, 0x437F,\n    0x4380, 0x4381, 0x4382, 0x4383, 0x4384, 0x4385, 0x4386, 0x4387,\n    0x4388, 0x4389, 0x438A, 0x438B, 0x438C, 0x438D, 0x438E, 0x438F,\n    0x4390, 0x4391, 0x4392, 0x4393, 0x4394, 0x4395, 0x4396, 0x4397,\n    0x4398, 0x4399, 0x439A, 0x439B, 0x439C, 0x439D, 0x439E, 0x439F,\n    0x43A0, 0x43A1, 0x43A2, 0x43A3, 0x43A4, 0x43A5, 0x43A6, 0x43A7,\n    0x43A8, 0x43A9, 0x43AA, 0x43AB, 0x43AD, 0x43AE, 0x43AF, 0x43B0,\n    0x43B2, 0x43B3, 0x43B4, 0x43B5, 0x43B6, 0x43B7, 0x43B8, 0x43B9,\n    0x43BA, 0x43BB, 0x43BC, 0x43BD, 0x43BE, 0x43BF, 0x43C0, 0x43C1,\n    0x43C2, 0x43C3, 0x43C4, 0x43C5, 0x43C6, 0x43C7, 0x43C8, 0x43C9,\n    0x43CA, 0x43CB, 0x43CC, 0x43CD, 0x43CE, 0x43CF, 0x43D0, 0x43D1,\n    0x43D2, 0x43D3, 0x43D4, 0x43D5, 0x43D6, 0x43D7, 0x43D8, 0x43D9,\n    0x43DA, 0x43DB, 0x43DC, 0x43DE, 0x43DF, 0x43E0, 0x43E1, 0x43E2,\n    0x43E3, 0x43E4, 0x43E5, 0x43E6, 0x43E7, 0x43E8, 0x43E9, 0x43EA,\n    0x43EB, 0x43EC, 0x43ED, 0x43EE, 0x43EF, 0x43F0, 0x43F1, 0x43F2,\n    0x43F3, 0x43F4, 0x43F5, 0x43F6, 0x43F7, 0x43F8, 0x43F9, 0x43FA,\n    0x43FB, 0x43FC, 0x43FD, 0x43FE, 0x43FF, 0x4400, 0x4401, 0x4402,\n    0x4403, 0x4404, 0x4405, 0x4406, 0x4407, 0x4408, 0x4409, 0x440A,\n    0x440B, 0x440C, 0x440D, 0x440E, 0x440F, 0x4410, 0x4411, 0x4412,\n    0x4413, 0x4414, 0x4415, 0x4416, 0x4417, 0x4418, 0x4419, 0x441A,\n    0x441B, 0x441C, 0x441D, 0x441E, 0x441F, 0x4420, 0x4421, 0x4422,\n    0x4423, 0x4424, 0x4425, 0x4426, 0x4427, 0x4428, 0x4429, 0x442A,\n    0x442B, 0x442C, 0x442D, 0x442E, 0x442F, 0x4430, 0x4431, 0x4432,\n    0x4433, 0x4434, 0x4435, 0x4436, 0x4437, 0x4438, 0x4439, 0x443A,\n    0x443B, 0x443C, 0x443D, 0x443E, 0x443F, 0x4440, 0x4441, 0x4442,\n    0x4443, 0x4444, 0x4445, 0x4446, 0x4447, 0x4448, 0x4449, 0x444A,\n    0x444B, 0x444C, 0x444D, 0x444E, 0x444F, 0x4450, 0x4451, 0x4452,\n    0x4453, 0x4454, 0x4455, 0x4456, 0x4457, 0x4458, 0x4459, 0x445A,\n    0x445B, 0x445C, 0x445D, 0x445E, 0x445F, 0x4460, 0x4461, 0x4462,\n    0x4463, 0x4464, 0x4465, 0x4466, 0x4467, 0x4468, 0x4469, 0x446A,\n    0x446B, 0x446C, 0x446D, 0x446E, 0x446F, 0x4470, 0x4471, 0x4472,\n    0x4473, 0x4474, 0x4475, 0x4476, 0x4477, 0x4478, 0x4479, 0x447A,\n    0x447B, 0x447C, 0x447D, 0x447E, 0x447F, 0x4480, 0x4481, 0x4482,\n    0x4483, 0x4484, 0x4485, 0x4486, 0x4487, 0x4488, 0x4489, 0x448A,\n    0x448B, 0x448C, 0x448D, 0x448E, 0x448F, 0x4490, 0x4491, 0x4492,\n    0x4493, 0x4494, 0x4495, 0x4496, 0x4497, 0x4498, 0x4499, 0x449A,\n    0x449B, 0x449C, 0x449D, 0x449E, 0x449F, 0x44A0, 0x44A1, 0x44A2,\n    0x44A3, 0x44A4, 0x44A5, 0x44A6, 0x44A7, 0x44A8, 0x44A9, 0x44AA,\n    0x44AB, 0x44AC, 0x44AD, 0x44AE, 0x44AF, 0x44B0, 0x44B1, 0x44B2,\n    0x44B3, 0x44B4, 0x44B5, 0x44B6, 0x44B7, 0x44B8, 0x44B9, 0x44BA,\n    0x44BB, 0x44BC, 0x44BD, 0x44BE, 0x44BF, 0x44C0, 0x44C1, 0x44C2,\n    0x44C3, 0x44C4, 0x44C5, 0x44C6, 0x44C7, 0x44C8, 0x44C9, 0x44CA,\n    0x44CB, 0x44CC, 0x44CD, 0x44CE, 0x44CF, 0x44D0, 0x44D1, 0x44D2,\n    0x44D3, 0x44D4, 0x44D5, 0x44D7, 0x44D8, 0x44D9, 0x44DA, 0x44DB,\n    0x44DC, 0x44DD, 0x44DE, 0x44DF, 0x44E0, 0x44E1, 0x44E2, 0x44E3,\n    0x44E4, 0x44E5, 0x44E6, 0x44E7, 0x44E8, 0x44E9, 0x44EA, 0x44EB,\n    0x44EC, 0x44ED, 0x44EE, 0x44EF, 0x44F0, 0x44F1, 0x44F2, 0x44F3,\n    0x44F4, 0x44F5, 0x44F6, 0x44F7, 0x44F8, 0x44F9, 0x44FA, 0x44FB,\n    0x44FC, 0x44FD, 0x44FE, 0x44FF, 0x4500, 0x4501, 0x4502, 0x4503,\n    0x4504, 0x4505, 0x4506, 0x4507, 0x4508, 0x4509, 0x450A, 0x450B,\n    0x450C, 0x450D, 0x450E, 0x450F, 0x4510, 0x4511, 0x4512, 0x4513,\n    0x4514, 0x4515, 0x4516, 0x4517, 0x4518, 0x4519, 0x451A, 0x451B,\n    0x451C, 0x451D, 0x451E, 0x451F, 0x4520, 0x4521, 0x4522, 0x4523,\n    0x4524, 0x4525, 0x4526, 0x4527, 0x4528, 0x4529, 0x452A, 0x452B,\n    0x452C, 0x452D, 0x452E, 0x452F, 0x4530, 0x4531, 0x4532, 0x4533,\n    0x4534, 0x4535, 0x4536, 0x4537, 0x4538, 0x4539, 0x453A, 0x453B,\n    0x453C, 0x453D, 0x453E, 0x453F, 0x4540, 0x4541, 0x4542, 0x4543,\n    0x4544, 0x4545, 0x4546, 0x4547, 0x4548, 0x4549, 0x454A, 0x454B,\n    0x454C, 0x454D, 0x454E, 0x454F, 0x4550, 0x4551, 0x4552, 0x4553,\n    0x4554, 0x4555, 0x4556, 0x4557, 0x4558, 0x4559, 0x455A, 0x455B,\n    0x455C, 0x455D, 0x455E, 0x455F, 0x4560, 0x4561, 0x4562, 0x4563,\n    0x4564, 0x4565, 0x4566, 0x4567, 0x4568, 0x4569, 0x456A, 0x456B,\n    0x456C, 0x456D, 0x456E, 0x456F, 0x4570, 0x4571, 0x4572, 0x4573,\n    0x4574, 0x4575, 0x4576, 0x4577, 0x4578, 0x4579, 0x457A, 0x457B,\n    0x457C, 0x457D, 0x457E, 0x457F, 0x4580, 0x4581, 0x4582, 0x4583,\n    0x4584, 0x4585, 0x4586, 0x4587, 0x4588, 0x4589, 0x458A, 0x458B,\n    0x458C, 0x458D, 0x458E, 0x458F, 0x4590, 0x4591, 0x4592, 0x4593,\n    0x4594, 0x4595, 0x4596, 0x4597, 0x4598, 0x4599, 0x459A, 0x459B,\n    0x459C, 0x459D, 0x459E, 0x459F, 0x45A0, 0x45A1, 0x45A2, 0x45A3,\n    0x45A4, 0x45A5, 0x45A6, 0x45A7, 0x45A8, 0x45A9, 0x45AA, 0x45AB,\n    0x45AC, 0x45AD, 0x45AE, 0x45AF, 0x45B0, 0x45B1, 0x45B2, 0x45B3,\n    0x45B4, 0x45B5, 0x45B6, 0x45B7, 0x45B8, 0x45B9, 0x45BA, 0x45BB,\n    0x45BC, 0x45BD, 0x45BE, 0x45BF, 0x45C0, 0x45C1, 0x45C2, 0x45C3,\n    0x45C4, 0x45C5, 0x45C6, 0x45C7, 0x45C8, 0x45C9, 0x45CA, 0x45CB,\n    0x45CC, 0x45CD, 0x45CE, 0x45CF, 0x45D0, 0x45D1, 0x45D2, 0x45D3,\n    0x45D4, 0x45D5, 0x45D6, 0x45D7, 0x45D8, 0x45D9, 0x45DA, 0x45DB,\n    0x45DC, 0x45DD, 0x45DE, 0x45DF, 0x45E0, 0x45E1, 0x45E2, 0x45E3,\n    0x45E4, 0x45E5, 0x45E6, 0x45E7, 0x45E8, 0x45E9, 0x45EA, 0x45EB,\n    0x45EC, 0x45ED, 0x45EE, 0x45EF, 0x45F0, 0x45F1, 0x45F2, 0x45F3,\n    0x45F4, 0x45F5, 0x45F6, 0x45F7, 0x45F8, 0x45F9, 0x45FA, 0x45FB,\n    0x45FC, 0x45FD, 0x45FE, 0x45FF, 0x4600, 0x4601, 0x4602, 0x4603,\n    0x4604, 0x4605, 0x4606, 0x4607, 0x4608, 0x4609, 0x460A, 0x460B,\n    0x460C, 0x460D, 0x460E, 0x460F, 0x4610, 0x4611, 0x4612, 0x4613,\n    0x4614, 0x4615, 0x4616, 0x4617, 0x4618, 0x4619, 0x461A, 0x461B,\n    0x461C, 0x461D, 0x461E, 0x461F, 0x4620, 0x4621, 0x4622, 0x4623,\n    0x4624, 0x4625, 0x4626, 0x4627, 0x4628, 0x4629, 0x462A, 0x462B,\n    0x462C, 0x462D, 0x462E, 0x462F, 0x4630, 0x4631, 0x4632, 0x4633,\n    0x4634, 0x4635, 0x4636, 0x4637, 0x4638, 0x4639, 0x463A, 0x463B,\n    0x463C, 0x463D, 0x463E, 0x463F, 0x4640, 0x4641, 0x4642, 0x4643,\n    0x4644, 0x4645, 0x4646, 0x4647, 0x4648, 0x4649, 0x464A, 0x464B,\n    0x464D, 0x464E, 0x464F, 0x4650, 0x4651, 0x4652, 0x4653, 0x4654,\n    0x4655, 0x4656, 0x4657, 0x4658, 0x4659, 0x465A, 0x465B, 0x465C,\n    0x465D, 0x465E, 0x465F, 0x4660, 0x4662, 0x4663, 0x4664, 0x4665,\n    0x4666, 0x4667, 0x4668, 0x4669, 0x466A, 0x466B, 0x466C, 0x466D,\n    0x466E, 0x466F, 0x4670, 0x4671, 0x4672, 0x4673, 0x4674, 0x4675,\n    0x4676, 0x4677, 0x4678, 0x4679, 0x467A, 0x467B, 0x467C, 0x467D,\n    0x467E, 0x467F, 0x4680, 0x4681, 0x4682, 0x4683, 0x4684, 0x4685,\n    0x4686, 0x4687, 0x4688, 0x4689, 0x468A, 0x468B, 0x468C, 0x468D,\n    0x468E, 0x468F, 0x4690, 0x4691, 0x4692, 0x4693, 0x4694, 0x4695,\n    0x4696, 0x4697, 0x4698, 0x4699, 0x469A, 0x469B, 0x469C, 0x469D,\n    0x469E, 0x469F, 0x46A0, 0x46A1, 0x46A2, 0x46A3, 0x46A4, 0x46A5,\n    0x46A6, 0x46A7, 0x46A8, 0x46A9, 0x46AA, 0x46AB, 0x46AC, 0x46AD,\n    0x46AE, 0x46AF, 0x46B0, 0x46B1, 0x46B2, 0x46B3, 0x46B4, 0x46B5,\n    0x46B6, 0x46B7, 0x46B8, 0x46B9, 0x46BA, 0x46BB, 0x46BC, 0x46BD,\n    0x46BE, 0x46BF, 0x46C0, 0x46C1, 0x46C2, 0x46C3, 0x46C4, 0x46C5,\n    0x46C6, 0x46C7, 0x46C8, 0x46C9, 0x46CA, 0x46CB, 0x46CC, 0x46CD,\n    0x46CE, 0x46CF, 0x46D0, 0x46D1, 0x46D2, 0x46D3, 0x46D4, 0x46D5,\n    0x46D6, 0x46D7, 0x46D8, 0x46D9, 0x46DA, 0x46DB, 0x46DC, 0x46DD,\n    0x46DE, 0x46DF, 0x46E0, 0x46E1, 0x46E2, 0x46E3, 0x46E4, 0x46E5,\n    0x46E6, 0x46E7, 0x46E8, 0x46E9, 0x46EA, 0x46EB, 0x46EC, 0x46ED,\n    0x46EE, 0x46EF, 0x46F0, 0x46F1, 0x46F2, 0x46F3, 0x46F4, 0x46F5,\n    0x46F6, 0x46F7, 0x46F8, 0x46F9, 0x46FA, 0x46FB, 0x46FC, 0x46FD,\n    0x46FE, 0x46FF, 0x4700, 0x4701, 0x4702, 0x4703, 0x4704, 0x4705,\n    0x4706, 0x4707, 0x4708, 0x4709, 0x470A, 0x470B, 0x470C, 0x470D,\n    0x470E, 0x470F, 0x4710, 0x4711, 0x4712, 0x4713, 0x4714, 0x4715,\n    0x4716, 0x4717, 0x4718, 0x4719, 0x471A, 0x471B, 0x471C, 0x471D,\n    0x471E, 0x471F, 0x4720, 0x4721, 0x4722, 0x4724, 0x4725, 0x4726,\n    0x4727, 0x4728, 0x472A, 0x472B, 0x472C, 0x472D, 0x472E, 0x472F,\n    0x4730, 0x4731, 0x4732, 0x4733, 0x4734, 0x4735, 0x4736, 0x4737,\n    0x4738, 0x4739, 0x473A, 0x473B, 0x473C, 0x473D, 0x473E, 0x473F,\n    0x4740, 0x4741, 0x4742, 0x4743, 0x4744, 0x4745, 0x4746, 0x4747,\n    0x4748, 0x4749, 0x474A, 0x474B, 0x474C, 0x474D, 0x474E, 0x474F,\n    0x4750, 0x4751, 0x4752, 0x4753, 0x4754, 0x4755, 0x4756, 0x4757,\n    0x4758, 0x4759, 0x475A, 0x475B, 0x475C, 0x475D, 0x475E, 0x475F,\n    0x4760, 0x4761, 0x4762, 0x4763, 0x4764, 0x4765, 0x4766, 0x4767,\n    0x4768, 0x4769, 0x476A, 0x476B, 0x476C, 0x476D, 0x476E, 0x476F,\n    0x4770, 0x4771, 0x4772, 0x4773, 0x4774, 0x4775, 0x4776, 0x4777,\n    0x4778, 0x4779, 0x477A, 0x477B, 0x477D, 0x477E, 0x477F, 0x4780,\n    0x4781, 0x4782, 0x4783, 0x4784, 0x4785, 0x4786, 0x4787, 0x4788,\n    0x4789, 0x478A, 0x478B, 0x478C, 0x478E, 0x478F, 0x4790, 0x4791,\n    0x4792, 0x4793, 0x4794, 0x4795, 0x4796, 0x4797, 0x4798, 0x4799,\n    0x479A, 0x479B, 0x479C, 0x479D, 0x479E, 0x479F, 0x47A0, 0x47A1,\n    0x47A2, 0x47A3, 0x47A4, 0x47A5, 0x47A6, 0x47A7, 0x47A8, 0x47A9,\n    0x47AA, 0x47AB, 0x47AC, 0x47AD, 0x47AE, 0x47AF, 0x47B0, 0x47B1,\n    0x47B2, 0x47B3, 0x47B4, 0x47B5, 0x47B6, 0x47B7, 0x47B8, 0x47B9,\n    0x47BA, 0x47BB, 0x47BC, 0x47BD, 0x47BE, 0x47BF, 0x47C0, 0x47C1,\n    0x47C2, 0x47C3, 0x47C4, 0x47C5, 0x47C6, 0x47C7, 0x47C8, 0x47C9,\n    0x47CA, 0x47CB, 0x47CC, 0x47CD, 0x47CE, 0x47CF, 0x47D0, 0x47D1,\n    0x47D2, 0x47D3, 0x47D4, 0x47D5, 0x47D6, 0x47D7, 0x47D8, 0x47D9,\n    0x47DA, 0x47DB, 0x47DC, 0x47DD, 0x47DE, 0x47DF, 0x47E0, 0x47E1,\n    0x47E2, 0x47E3, 0x47E4, 0x47E5, 0x47E6, 0x47E7, 0x47E8, 0x47E9,\n    0x47EA, 0x47EB, 0x47EC, 0x47ED, 0x47EE, 0x47EF, 0x47F0, 0x47F1,\n    0x47F2, 0x47F3, 0x47F4, 0x47F5, 0x47F6, 0x47F7, 0x47F8, 0x47F9,\n    0x47FA, 0x47FB, 0x47FC, 0x47FD, 0x47FE, 0x47FF, 0x4800, 0x4801,\n    0x4802, 0x4803, 0x4804, 0x4805, 0x4806, 0x4807, 0x4808, 0x4809,\n    0x480A, 0x480B, 0x480C, 0x480D, 0x480E, 0x480F, 0x4810, 0x4811,\n    0x4812, 0x4813, 0x4814, 0x4815, 0x4816, 0x4817, 0x4818, 0x4819,\n    0x481A, 0x481B, 0x481C, 0x481D, 0x481E, 0x481F, 0x4820, 0x4821,\n    0x4822, 0x4823, 0x4824, 0x4825, 0x4826, 0x4827, 0x4828, 0x4829,\n    0x482A, 0x482B, 0x482C, 0x482D, 0x482E, 0x482F, 0x4830, 0x4831,\n    0x4832, 0x4833, 0x4834, 0x4835, 0x4836, 0x4837, 0x4838, 0x4839,\n    0x483A, 0x483B, 0x483C, 0x483D, 0x483E, 0x483F, 0x4840, 0x4841,\n    0x4842, 0x4843, 0x4844, 0x4845, 0x4846, 0x4847, 0x4848, 0x4849,\n    0x484A, 0x484B, 0x484C, 0x484D, 0x484E, 0x484F, 0x4850, 0x4851,\n    0x4852, 0x4853, 0x4854, 0x4855, 0x4856, 0x4857, 0x4858, 0x4859,\n    0x485A, 0x485B, 0x485C, 0x485D, 0x485E, 0x485F, 0x4860, 0x4861,\n    0x4862, 0x4863, 0x4864, 0x4865, 0x4866, 0x4867, 0x4868, 0x4869,\n    0x486A, 0x486B, 0x486C, 0x486D, 0x486E, 0x486F, 0x4870, 0x4871,\n    0x4872, 0x4873, 0x4874, 0x4875, 0x4876, 0x4877, 0x4878, 0x4879,\n    0x487A, 0x487B, 0x487C, 0x487D, 0x487E, 0x487F, 0x4880, 0x4881,\n    0x4882, 0x4883, 0x4884, 0x4885, 0x4886, 0x4887, 0x4888, 0x4889,\n    0x488A, 0x488B, 0x488C, 0x488D, 0x488E, 0x488F, 0x4890, 0x4891,\n    0x4892, 0x4893, 0x4894, 0x4895, 0x4896, 0x4897, 0x4898, 0x4899,\n    0x489A, 0x489B, 0x489C, 0x489D, 0x489E, 0x489F, 0x48A0, 0x48A1,\n    0x48A2, 0x48A3, 0x48A4, 0x48A5, 0x48A6, 0x48A7, 0x48A8, 0x48A9,\n    0x48AA, 0x48AB, 0x48AC, 0x48AD, 0x48AE, 0x48AF, 0x48B0, 0x48B1,\n    0x48B2, 0x48B3, 0x48B4, 0x48B5, 0x48B6, 0x48B7, 0x48B8, 0x48B9,\n    0x48BA, 0x48BB, 0x48BC, 0x48BD, 0x48BE, 0x48BF, 0x48C0, 0x48C1,\n    0x48C2, 0x48C3, 0x48C4, 0x48C5, 0x48C6, 0x48C7, 0x48C8, 0x48C9,\n    0x48CA, 0x48CB, 0x48CC, 0x48CD, 0x48CE, 0x48CF, 0x48D0, 0x48D1,\n    0x48D2, 0x48D3, 0x48D4, 0x48D5, 0x48D6, 0x48D7, 0x48D8, 0x48D9,\n    0x48DA, 0x48DB, 0x48DC, 0x48DD, 0x48DE, 0x48DF, 0x48E0, 0x48E1,\n    0x48E2, 0x48E3, 0x48E4, 0x48E5, 0x48E6, 0x48E7, 0x48E8, 0x48E9,\n    0x48EA, 0x48EB, 0x48EC, 0x48ED, 0x48EE, 0x48EF, 0x48F0, 0x48F1,\n    0x48F2, 0x48F3, 0x48F4, 0x48F5, 0x48F6, 0x48F7, 0x48F8, 0x48F9,\n    0x48FA, 0x48FB, 0x48FC, 0x48FD, 0x48FE, 0x48FF, 0x4900, 0x4901,\n    0x4902, 0x4903, 0x4904, 0x4905, 0x4906, 0x4907, 0x4908, 0x4909,\n    0x490A, 0x490B, 0x490C, 0x490D, 0x490E, 0x490F, 0x4910, 0x4911,\n    0x4912, 0x4913, 0x4914, 0x4915, 0x4916, 0x4917, 0x4918, 0x4919,\n    0x491A, 0x491B, 0x491C, 0x491D, 0x491E, 0x491F, 0x4920, 0x4921,\n    0x4922, 0x4923, 0x4924, 0x4925, 0x4926, 0x4927, 0x4928, 0x4929,\n    0x492A, 0x492B, 0x492C, 0x492D, 0x492E, 0x492F, 0x4930, 0x4931,\n    0x4932, 0x4933, 0x4934, 0x4935, 0x4936, 0x4937, 0x4938, 0x4939,\n    0x493A, 0x493B, 0x493C, 0x493D, 0x493E, 0x493F, 0x4940, 0x4941,\n    0x4942, 0x4943, 0x4944, 0x4945, 0x4946, 0x4948, 0x4949, 0x494A,\n    0x494B, 0x494C, 0x494D, 0x494E, 0x494F, 0x4950, 0x4951, 0x4952,\n    0x4953, 0x4954, 0x4955, 0x4956, 0x4957, 0x4958, 0x4959, 0x495A,\n    0x495B, 0x495C, 0x495D, 0x495E, 0x495F, 0x4960, 0x4961, 0x4962,\n    0x4963, 0x4964, 0x4965, 0x4966, 0x4967, 0x4968, 0x4969, 0x496A,\n    0x496B, 0x496C, 0x496D, 0x496E, 0x496F, 0x4970, 0x4971, 0x4972,\n    0x4973, 0x4974, 0x4975, 0x4976, 0x4977, 0x4978, 0x4979, 0x497B,\n    0x497C, 0x497E, 0x497F, 0x4980, 0x4981, 0x4984, 0x4987, 0x4988,\n    0x4989, 0x498A, 0x498B, 0x498C, 0x498D, 0x498E, 0x498F, 0x4990,\n    0x4991, 0x4992, 0x4993, 0x4994, 0x4995, 0x4996, 0x4997, 0x4998,\n    0x4999, 0x499A, 0x499C, 0x499D, 0x499E, 0x49A0, 0x49A1, 0x49A2,\n    0x49A3, 0x49A4, 0x49A5, 0x49A6, 0x49A7, 0x49A8, 0x49A9, 0x49AA,\n    0x49AB, 0x49AC, 0x49AD, 0x49AE, 0x49AF, 0x49B0, 0x49B1, 0x49B2,\n    0x49B3, 0x49B4, 0x49B5, 0x49B8, 0x49B9, 0x49BA, 0x49BB, 0x49BC,\n    0x49BD, 0x49BE, 0x49BF, 0x49C0, 0x49C1, 0x49C2, 0x49C3, 0x49C4,\n    0x49C5, 0x49C6, 0x49C7, 0x49C8, 0x49C9, 0x49CA, 0x49CB, 0x49CC,\n    0x49CD, 0x49CE, 0x49CF, 0x49D0, 0x49D1, 0x49D2, 0x49D3, 0x49D4,\n    0x49D5, 0x49D6, 0x49D7, 0x49D8, 0x49D9, 0x49DA, 0x49DB, 0x49DC,\n    0x49DD, 0x49DE, 0x49DF, 0x49E0, 0x49E1, 0x49E2, 0x49E3, 0x49E4,\n    0x49E5, 0x49E6, 0x49E7, 0x49E8, 0x49E9, 0x49EA, 0x49EB, 0x49EC,\n    0x49ED, 0x49EE, 0x49EF, 0x49F0, 0x49F1, 0x49F2, 0x49F3, 0x49F4,\n    0x49F5, 0x49F6, 0x49F7, 0x49F8, 0x49F9, 0x49FA, 0x49FB, 0x49FC,\n    0x49FD, 0x49FE, 0x49FF, 0x4A00, 0x4A01, 0x4A02, 0x4A03, 0x4A04,\n    0x4A05, 0x4A06, 0x4A07, 0x4A08, 0x4A09, 0x4A0A, 0x4A0B, 0x4A0C,\n    0x4A0D, 0x4A0E, 0x4A0F, 0x4A10, 0x4A11, 0x4A12, 0x4A13, 0x4A14,\n    0x4A15, 0x4A16, 0x4A17, 0x4A18, 0x4A19, 0x4A1A, 0x4A1B, 0x4A1C,\n    0x4A1D, 0x4A1E, 0x4A1F, 0x4A20, 0x4A21, 0x4A22, 0x4A23, 0x4A24,\n    0x4A25, 0x4A26, 0x4A27, 0x4A28, 0x4A29, 0x4A2A, 0x4A2B, 0x4A2C,\n    0x4A2D, 0x4A2E, 0x4A2F, 0x4A30, 0x4A31, 0x4A32, 0x4A33, 0x4A34,\n    0x4A35, 0x4A36, 0x4A37, 0x4A38, 0x4A39, 0x4A3A, 0x4A3B, 0x4A3C,\n    0x4A3D, 0x4A3E, 0x4A3F, 0x4A40, 0x4A41, 0x4A42, 0x4A43, 0x4A44,\n    0x4A45, 0x4A46, 0x4A47, 0x4A48, 0x4A49, 0x4A4A, 0x4A4B, 0x4A4C,\n    0x4A4D, 0x4A4E, 0x4A4F, 0x4A50, 0x4A51, 0x4A52, 0x4A53, 0x4A54,\n    0x4A55, 0x4A56, 0x4A57, 0x4A58, 0x4A59, 0x4A5A, 0x4A5B, 0x4A5C,\n    0x4A5D, 0x4A5E, 0x4A5F, 0x4A60, 0x4A61, 0x4A62, 0x4A63, 0x4A64,\n    0x4A65, 0x4A66, 0x4A67, 0x4A68, 0x4A69, 0x4A6A, 0x4A6B, 0x4A6C,\n    0x4A6D, 0x4A6E, 0x4A6F, 0x4A70, 0x4A71, 0x4A72, 0x4A73, 0x4A74,\n    0x4A75, 0x4A76, 0x4A77, 0x4A78, 0x4A79, 0x4A7A, 0x4A7B, 0x4A7C,\n    0x4A7D, 0x4A7E, 0x4A7F, 0x4A80, 0x4A81, 0x4A82, 0x4A83, 0x4A84,\n    0x4A85, 0x4A86, 0x4A87, 0x4A88, 0x4A89, 0x4A8A, 0x4A8B, 0x4A8C,\n    0x4A8D, 0x4A8E, 0x4A8F, 0x4A90, 0x4A91, 0x4A92, 0x4A93, 0x4A94,\n    0x4A95, 0x4A96, 0x4A97, 0x4A98, 0x4A99, 0x4A9A, 0x4A9B, 0x4A9C,\n    0x4A9D, 0x4A9E, 0x4A9F, 0x4AA0, 0x4AA1, 0x4AA2, 0x4AA3, 0x4AA4,\n    0x4AA5, 0x4AA6, 0x4AA7, 0x4AA8, 0x4AA9, 0x4AAA, 0x4AAB, 0x4AAC,\n    0x4AAD, 0x4AAE, 0x4AAF, 0x4AB0, 0x4AB1, 0x4AB2, 0x4AB3, 0x4AB4,\n    0x4AB5, 0x4AB6, 0x4AB7, 0x4AB8, 0x4AB9, 0x4ABA, 0x4ABB, 0x4ABC,\n    0x4ABD, 0x4ABE, 0x4ABF, 0x4AC0, 0x4AC1, 0x4AC2, 0x4AC3, 0x4AC4,\n    0x4AC5, 0x4AC6, 0x4AC7, 0x4AC8, 0x4AC9, 0x4ACA, 0x4ACB, 0x4ACC,\n    0x4ACD, 0x4ACE, 0x4ACF, 0x4AD0, 0x4AD1, 0x4AD2, 0x4AD3, 0x4AD4,\n    0x4AD5, 0x4AD6, 0x4AD7, 0x4AD8, 0x4AD9, 0x4ADA, 0x4ADB, 0x4ADC,\n    0x4ADD, 0x4ADE, 0x4ADF, 0x4AE0, 0x4AE1, 0x4AE2, 0x4AE3, 0x4AE4,\n    0x4AE5, 0x4AE6, 0x4AE7, 0x4AE8, 0x4AE9, 0x4AEA, 0x4AEB, 0x4AEC,\n    0x4AED, 0x4AEE, 0x4AEF, 0x4AF0, 0x4AF1, 0x4AF2, 0x4AF3, 0x4AF4,\n    0x4AF5, 0x4AF6, 0x4AF7, 0x4AF8, 0x4AF9, 0x4AFA, 0x4AFB, 0x4AFC,\n    0x4AFD, 0x4AFE, 0x4AFF, 0x4B00, 0x4B01, 0x4B02, 0x4B03, 0x4B04,\n    0x4B05, 0x4B06, 0x4B07, 0x4B08, 0x4B09, 0x4B0A, 0x4B0B, 0x4B0C,\n    0x4B0D, 0x4B0E, 0x4B0F, 0x4B10, 0x4B11, 0x4B12, 0x4B13, 0x4B14,\n    0x4B15, 0x4B16, 0x4B17, 0x4B18, 0x4B19, 0x4B1A, 0x4B1B, 0x4B1C,\n    0x4B1D, 0x4B1E, 0x4B1F, 0x4B20, 0x4B21, 0x4B22, 0x4B23, 0x4B24,\n    0x4B25, 0x4B26, 0x4B27, 0x4B28, 0x4B29, 0x4B2A, 0x4B2B, 0x4B2C,\n    0x4B2D, 0x4B2E, 0x4B2F, 0x4B30, 0x4B31, 0x4B32, 0x4B33, 0x4B34,\n    0x4B35, 0x4B36, 0x4B37, 0x4B38, 0x4B39, 0x4B3A, 0x4B3B, 0x4B3C,\n    0x4B3D, 0x4B3E, 0x4B3F, 0x4B40, 0x4B41, 0x4B42, 0x4B43, 0x4B44,\n    0x4B45, 0x4B46, 0x4B47, 0x4B48, 0x4B49, 0x4B4A, 0x4B4B, 0x4B4C,\n    0x4B4D, 0x4B4E, 0x4B4F, 0x4B50, 0x4B51, 0x4B52, 0x4B53, 0x4B54,\n    0x4B55, 0x4B56, 0x4B57, 0x4B58, 0x4B59, 0x4B5A, 0x4B5B, 0x4B5C,\n    0x4B5D, 0x4B5E, 0x4B5F, 0x4B60, 0x4B61, 0x4B62, 0x4B63, 0x4B64,\n    0x4B65, 0x4B66, 0x4B67, 0x4B68, 0x4B69, 0x4B6A, 0x4B6B, 0x4B6C,\n    0x4B6D, 0x4B6E, 0x4B6F, 0x4B70, 0x4B71, 0x4B72, 0x4B73, 0x4B74,\n    0x4B75, 0x4B76, 0x4B77, 0x4B78, 0x4B79, 0x4B7A, 0x4B7B, 0x4B7C,\n    0x4B7D, 0x4B7E, 0x4B7F, 0x4B80, 0x4B81, 0x4B82, 0x4B83, 0x4B84,\n    0x4B85, 0x4B86, 0x4B87, 0x4B88, 0x4B89, 0x4B8A, 0x4B8B, 0x4B8C,\n    0x4B8D, 0x4B8E, 0x4B8F, 0x4B90, 0x4B91, 0x4B92, 0x4B93, 0x4B94,\n    0x4B95, 0x4B96, 0x4B97, 0x4B98, 0x4B99, 0x4B9A, 0x4B9B, 0x4B9C,\n    0x4B9D, 0x4B9E, 0x4B9F, 0x4BA0, 0x4BA1, 0x4BA2, 0x4BA3, 0x4BA4,\n    0x4BA5, 0x4BA6, 0x4BA7, 0x4BA8, 0x4BA9, 0x4BAA, 0x4BAB, 0x4BAC,\n    0x4BAD, 0x4BAE, 0x4BAF, 0x4BB0, 0x4BB1, 0x4BB2, 0x4BB3, 0x4BB4,\n    0x4BB5, 0x4BB6, 0x4BB7, 0x4BB8, 0x4BB9, 0x4BBA, 0x4BBB, 0x4BBC,\n    0x4BBD, 0x4BBE, 0x4BBF, 0x4BC0, 0x4BC1, 0x4BC2, 0x4BC3, 0x4BC4,\n    0x4BC5, 0x4BC6, 0x4BC7, 0x4BC8, 0x4BC9, 0x4BCA, 0x4BCB, 0x4BCC,\n    0x4BCD, 0x4BCE, 0x4BCF, 0x4BD0, 0x4BD1, 0x4BD2, 0x4BD3, 0x4BD4,\n    0x4BD5, 0x4BD6, 0x4BD7, 0x4BD8, 0x4BD9, 0x4BDA, 0x4BDB, 0x4BDC,\n    0x4BDD, 0x4BDE, 0x4BDF, 0x4BE0, 0x4BE1, 0x4BE2, 0x4BE3, 0x4BE4,\n    0x4BE5, 0x4BE6, 0x4BE7, 0x4BE8, 0x4BE9, 0x4BEA, 0x4BEB, 0x4BEC,\n    0x4BED, 0x4BEE, 0x4BEF, 0x4BF0, 0x4BF1, 0x4BF2, 0x4BF3, 0x4BF4,\n    0x4BF5, 0x4BF6, 0x4BF7, 0x4BF8, 0x4BF9, 0x4BFA, 0x4BFB, 0x4BFC,\n    0x4BFD, 0x4BFE, 0x4BFF, 0x4C00, 0x4C01, 0x4C02, 0x4C03, 0x4C04,\n    0x4C05, 0x4C06, 0x4C07, 0x4C08, 0x4C09, 0x4C0A, 0x4C0B, 0x4C0C,\n    0x4C0D, 0x4C0E, 0x4C0F, 0x4C10, 0x4C11, 0x4C12, 0x4C13, 0x4C14,\n    0x4C15, 0x4C16, 0x4C17, 0x4C18, 0x4C19, 0x4C1A, 0x4C1B, 0x4C1C,\n    0x4C1D, 0x4C1E, 0x4C1F, 0x4C20, 0x4C21, 0x4C22, 0x4C23, 0x4C24,\n    0x4C25, 0x4C26, 0x4C27, 0x4C28, 0x4C29, 0x4C2A, 0x4C2B, 0x4C2C,\n    0x4C2D, 0x4C2E, 0x4C2F, 0x4C30, 0x4C31, 0x4C32, 0x4C33, 0x4C34,\n    0x4C35, 0x4C36, 0x4C37, 0x4C38, 0x4C39, 0x4C3A, 0x4C3B, 0x4C3C,\n    0x4C3D, 0x4C3E, 0x4C3F, 0x4C40, 0x4C41, 0x4C42, 0x4C43, 0x4C44,\n    0x4C45, 0x4C46, 0x4C47, 0x4C48, 0x4C49, 0x4C4A, 0x4C4B, 0x4C4C,\n    0x4C4D, 0x4C4E, 0x4C4F, 0x4C50, 0x4C51, 0x4C52, 0x4C53, 0x4C54,\n    0x4C55, 0x4C56, 0x4C57, 0x4C58, 0x4C59, 0x4C5A, 0x4C5B, 0x4C5C,\n    0x4C5D, 0x4C5E, 0x4C5F, 0x4C60, 0x4C61, 0x4C62, 0x4C63, 0x4C64,\n    0x4C65, 0x4C66, 0x4C67, 0x4C68, 0x4C69, 0x4C6A, 0x4C6B, 0x4C6C,\n    0x4C6D, 0x4C6E, 0x4C6F, 0x4C70, 0x4C71, 0x4C72, 0x4C73, 0x4C74,\n    0x4C75, 0x4C76, 0x4C78, 0x4C79, 0x4C7A, 0x4C7B, 0x4C7C, 0x4C7D,\n    0x4C7E, 0x4C7F, 0x4C80, 0x4C81, 0x4C82, 0x4C83, 0x4C84, 0x4C85,\n    0x4C86, 0x4C87, 0x4C88, 0x4C89, 0x4C8A, 0x4C8B, 0x4C8C, 0x4C8D,\n    0x4C8E, 0x4C8F, 0x4C90, 0x4C91, 0x4C92, 0x4C93, 0x4C94, 0x4C95,\n    0x4C96, 0x4C97, 0x4C98, 0x4C99, 0x4C9A, 0x4C9B, 0x4C9C, 0x4C9D,\n    0x4C9E, 0x4CA4, 0x4CA5, 0x4CA6, 0x4CA7, 0x4CA8, 0x4CA9, 0x4CAA,\n    0x4CAB, 0x4CAC, 0x4CAD, 0x4CAE, 0x4CAF, 0x4CB0, 0x4CB1, 0x4CB2,\n    0x4CB3, 0x4CB4, 0x4CB5, 0x4CB6, 0x4CB7, 0x4CB8, 0x4CB9, 0x4CBA,\n    0x4CBB, 0x4CBC, 0x4CBD, 0x4CBE, 0x4CBF, 0x4CC0, 0x4CC1, 0x4CC2,\n    0x4CC3, 0x4CC4, 0x4CC5, 0x4CC6, 0x4CC7, 0x4CC8, 0x4CC9, 0x4CCA,\n    0x4CCB, 0x4CCC, 0x4CCD, 0x4CCE, 0x4CCF, 0x4CD0, 0x4CD1, 0x4CD2,\n    0x4CD3, 0x4CD4, 0x4CD5, 0x4CD6, 0x4CD7, 0x4CD8, 0x4CD9, 0x4CDA,\n    0x4CDB, 0x4CDC, 0x4CDD, 0x4CDE, 0x4CDF, 0x4CE0, 0x4CE1, 0x4CE2,\n    0x4CE3, 0x4CE4, 0x4CE5, 0x4CE6, 0x4CE7, 0x4CE8, 0x4CE9, 0x4CEA,\n    0x4CEB, 0x4CEC, 0x4CED, 0x4CEE, 0x4CEF, 0x4CF0, 0x4CF1, 0x4CF2,\n    0x4CF3, 0x4CF4, 0x4CF5, 0x4CF6, 0x4CF7, 0x4CF8, 0x4CF9, 0x4CFA,\n    0x4CFB, 0x4CFC, 0x4CFD, 0x4CFE, 0x4CFF, 0x4D00, 0x4D01, 0x4D02,\n    0x4D03, 0x4D04, 0x4D05, 0x4D06, 0x4D07, 0x4D08, 0x4D09, 0x4D0A,\n    0x4D0B, 0x4D0C, 0x4D0D, 0x4D0E, 0x4D0F, 0x4D10, 0x4D11, 0x4D12,\n    0x4D1A, 0x4D1B, 0x4D1C, 0x4D1D, 0x4D1E, 0x4D1F, 0x4D20, 0x4D21,\n    0x4D22, 0x4D23, 0x4D24, 0x4D25, 0x4D26, 0x4D27, 0x4D28, 0x4D29,\n    0x4D2A, 0x4D2B, 0x4D2C, 0x4D2D, 0x4D2E, 0x4D2F, 0x4D30, 0x4D31,\n    0x4D32, 0x4D33, 0x4D34, 0x4D35, 0x4D36, 0x4D37, 0x4D38, 0x4D39,\n    0x4D3A, 0x4D3B, 0x4D3C, 0x4D3D, 0x4D3E, 0x4D3F, 0x4D40, 0x4D41,\n    0x4D42, 0x4D43, 0x4D44, 0x4D45, 0x4D46, 0x4D47, 0x4D48, 0x4D49,\n    0x4D4A, 0x4D4B, 0x4D4C, 0x4D4D, 0x4D4E, 0x4D4F, 0x4D50, 0x4D51,\n    0x4D52, 0x4D53, 0x4D54, 0x4D55, 0x4D56, 0x4D57, 0x4D58, 0x4D59,\n    0x4D5A, 0x4D5B, 0x4D5C, 0x4D5D, 0x4D5E, 0x4D5F, 0x4D60, 0x4D61,\n    0x4D62, 0x4D63, 0x4D64, 0x4D65, 0x4D66, 0x4D67, 0x4D68, 0x4D69,\n    0x4D6A, 0x4D6B, 0x4D6C, 0x4D6D, 0x4D6E, 0x4D6F, 0x4D70, 0x4D71,\n    0x4D72, 0x4D73, 0x4D74, 0x4D75, 0x4D76, 0x4D77, 0x4D78, 0x4D79,\n    0x4D7A, 0x4D7B, 0x4D7C, 0x4D7D, 0x4D7E, 0x4D7F, 0x4D80, 0x4D81,\n    0x4D82, 0x4D83, 0x4D84, 0x4D85, 0x4D86, 0x4D87, 0x4D88, 0x4D89,\n    0x4D8A, 0x4D8B, 0x4D8C, 0x4D8D, 0x4D8E, 0x4D8F, 0x4D90, 0x4D91,\n    0x4D92, 0x4D93, 0x4D94, 0x4D95, 0x4D96, 0x4D97, 0x4D98, 0x4D99,\n    0x4D9A, 0x4D9B, 0x4D9C, 0x4D9D, 0x4D9E, 0x4D9F, 0x4DA0, 0x4DA1,\n    0x4DA2, 0x4DA3, 0x4DA4, 0x4DA5, 0x4DA6, 0x4DA7, 0x4DA8, 0x4DA9,\n    0x4DAA, 0x4DAB, 0x4DAC, 0x4DAD, 0x4DAF, 0x4DB0, 0x4DB1, 0x4DB2,\n    0x4DB3, 0x4DB4, 0x4DB5, 0x20AC, 0x00A5, 0x20AC, 0x0024, 0x303F,\n    0xA000, 0xA001, 0xA002, 0xA003, 0xA004, 0xA005, 0xA006, 0xA007,\n    0xA008, 0xA009, 0xA00A, 0xA00B, 0xA00C, 0xA00D, 0xA00E, 0xA00F,\n    0xA010, 0xA011, 0xA012, 0xA013, 0xA014, 0xA015, 0xA016, 0xA017,\n    0xA018, 0xA019, 0xA01A, 0xA01B, 0xA01C, 0xA01D, 0xA01E, 0xA01F,\n    0xA020, 0xA021, 0xA022, 0xA023, 0xA024, 0xA025, 0xA026, 0xA027,\n    0xA028, 0xA029, 0xA02A, 0xA02B, 0xA02C, 0xA02D, 0xA02E, 0xA02F,\n    0xA030, 0xA031, 0xA032, 0xA033, 0xA034, 0xA035, 0xA036, 0xA037,\n    0xA038, 0xA039, 0xA03A, 0xA03B, 0xA03C, 0xA03D, 0xA03E, 0xA03F,\n    0xA040, 0xA041, 0xA042, 0xA043, 0xA044, 0xA045, 0xA046, 0xA047,\n    0xA048, 0xA049, 0xA04A, 0xA04B, 0xA04C, 0xA04D, 0xA04E, 0xA04F,\n    0xA050, 0xA051, 0xA052, 0xA053, 0xA054, 0xA055, 0xA056, 0xA057,\n    0xA058, 0xA059, 0xA05A, 0xA05B, 0xA05C, 0xA05D, 0xA05E, 0xA05F,\n    0xA060, 0xA061, 0xA062, 0xA063, 0xA064, 0xA065, 0xA066, 0xA067,\n    0xA068, 0xA069, 0xA06A, 0xA06B, 0xA06C, 0xA06D, 0xA06E, 0xA06F,\n    0xA070, 0xA071, 0xA072, 0xA073, 0xA074, 0xA075, 0xA076, 0xA077,\n    0xA078, 0xA079, 0xA07A, 0xA07B, 0xA07C, 0xA07D, 0xA07E, 0xA07F,\n    0xA080, 0xA081, 0xA082, 0xA083, 0xA084, 0xA085, 0xA086, 0xA087,\n    0xA088, 0xA089, 0xA08A, 0xA08B, 0xA08C, 0xA08D, 0xA08E, 0xA08F,\n    0xA090, 0xA091, 0xA092, 0xA093, 0xA094, 0xA095, 0xA096, 0xA097,\n    0xA098, 0xA099, 0xA09A, 0xA09B, 0xA09C, 0xA09D, 0xA09E, 0xA09F,\n    0xA0A0, 0xA0A1, 0xA0A2, 0xA0A3, 0xA0A4, 0xA0A5, 0xA0A6, 0xA0A7,\n    0xA0A8, 0xA0A9, 0xA0AA, 0xA0AB, 0xA0AC, 0xA0AD, 0xA0AE, 0xA0AF,\n    0xA0B0, 0xA0B1, 0xA0B2, 0xA0B3, 0xA0B4, 0xA0B5, 0xA0B6, 0xA0B7,\n    0xA0B8, 0xA0B9, 0xA0BA, 0xA0BB, 0xA0BC, 0xA0BD, 0xA0BE, 0xA0BF,\n    0xA0C0, 0xA0C1, 0xA0C2, 0xA0C3, 0xA0C4, 0xA0C5, 0xA0C6, 0xA0C7,\n    0xA0C8, 0xA0C9, 0xA0CA, 0xA0CB, 0xA0CC, 0xA0CD, 0xA0CE, 0xA0CF,\n    0xA0D0, 0xA0D1, 0xA0D2, 0xA0D3, 0xA0D4, 0xA0D5, 0xA0D6, 0xA0D7,\n    0xA0D8, 0xA0D9, 0xA0DA, 0xA0DB, 0xA0DC, 0xA0DD, 0xA0DE, 0xA0DF,\n    0xA0E0, 0xA0E1, 0xA0E2, 0xA0E3, 0xA0E4, 0xA0E5, 0xA0E6, 0xA0E7,\n    0xA0E8, 0xA0E9, 0xA0EA, 0xA0EB, 0xA0EC, 0xA0ED, 0xA0EE, 0xA0EF,\n    0xA0F0, 0xA0F1, 0xA0F2, 0xA0F3, 0xA0F4, 0xA0F5, 0xA0F6, 0xA0F7,\n    0xA0F8, 0xA0F9, 0xA0FA, 0xA0FB, 0xA0FC, 0xA0FD, 0xA0FE, 0xA0FF,\n    0xA100, 0xA101, 0xA102, 0xA103, 0xA104, 0xA105, 0xA106, 0xA107,\n    0xA108, 0xA109, 0xA10A, 0xA10B, 0xA10C, 0xA10D, 0xA10E, 0xA10F,\n    0xA110, 0xA111, 0xA112, 0xA113, 0xA114, 0xA115, 0xA116, 0xA117,\n    0xA118, 0xA119, 0xA11A, 0xA11B, 0xA11C, 0xA11D, 0xA11E, 0xA11F,\n    0xA120, 0xA121, 0xA122, 0xA123, 0xA124, 0xA125, 0xA126, 0xA127,\n    0xA128, 0xA129, 0xA12A, 0xA12B, 0xA12C, 0xA12D, 0xA12E, 0xA12F,\n    0xA130, 0xA131, 0xA132, 0xA133, 0xA134, 0xA135, 0xA136, 0xA137,\n    0xA138, 0xA139, 0xA13A, 0xA13B, 0xA13C, 0xA13D, 0xA13E, 0xA13F,\n    0xA140, 0xA141, 0xA142, 0xA143, 0xA144, 0xA145, 0xA146, 0xA147,\n    0xA148, 0xA149, 0xA14A, 0xA14B, 0xA14C, 0xA14D, 0xA14E, 0xA14F,\n    0xA150, 0xA151, 0xA152, 0xA153, 0xA154, 0xA155, 0xA156, 0xA157,\n    0xA158, 0xA159, 0xA15A, 0xA15B, 0xA15C, 0xA15D, 0xA15E, 0xA15F,\n    0xA160, 0xA161, 0xA162, 0xA163, 0xA164, 0xA165, 0xA166, 0xA167,\n    0xA168, 0xA169, 0xA16A, 0xA16B, 0xA16C, 0xA16D, 0xA16E, 0xA16F,\n    0xA170, 0xA171, 0xA172, 0xA173, 0xA174, 0xA175, 0xA176, 0xA177,\n    0xA178, 0xA179, 0xA17A, 0xA17B, 0xA17C, 0xA17D, 0xA17E, 0xA17F,\n    0xA180, 0xA181, 0xA182, 0xA183, 0xA184, 0xA185, 0xA186, 0xA187,\n    0xA188, 0xA189, 0xA18A, 0xA18B, 0xA18C, 0xA18D, 0xA18E, 0xA18F,\n    0xA190, 0xA191, 0xA192, 0xA193, 0xA194, 0xA195, 0xA196, 0xA197,\n    0xA198, 0xA199, 0xA19A, 0xA19B, 0xA19C, 0xA19D, 0xA19E, 0xA19F,\n    0xA1A0, 0xA1A1, 0xA1A2, 0xA1A3, 0xA1A4, 0xA1A5, 0xA1A6, 0xA1A7,\n    0xA1A8, 0xA1A9, 0xA1AA, 0xA1AB, 0xA1AC, 0xA1AD, 0xA1AE, 0xA1AF,\n    0xA1B0, 0xA1B1, 0xA1B2, 0xA1B3, 0xA1B4, 0xA1B5, 0xA1B6, 0xA1B7,\n    0xA1B8, 0xA1B9, 0xA1BA, 0xA1BB, 0xA1BC, 0xA1BD, 0xA1BE, 0xA1BF,\n    0xA1C0, 0xA1C1, 0xA1C2, 0xA1C3, 0xA1C4, 0xA1C5, 0xA1C6, 0xA1C7,\n    0xA1C8, 0xA1C9, 0xA1CA, 0xA1CB, 0xA1CC, 0xA1CD, 0xA1CE, 0xA1CF,\n    0xA1D0, 0xA1D1, 0xA1D2, 0xA1D3, 0xA1D4, 0xA1D5, 0xA1D6, 0xA1D7,\n    0xA1D8, 0xA1D9, 0xA1DA, 0xA1DB, 0xA1DC, 0xA1DD, 0xA1DE, 0xA1DF,\n    0xA1E0, 0xA1E1, 0xA1E2, 0xA1E3, 0xA1E4, 0xA1E5, 0xA1E6, 0xA1E7,\n    0xA1E8, 0xA1E9, 0xA1EA, 0xA1EB, 0xA1EC, 0xA1ED, 0xA1EE, 0xA1EF,\n    0xA1F0, 0xA1F1, 0xA1F2, 0xA1F3, 0xA1F4, 0xA1F5, 0xA1F6, 0xA1F7,\n    0xA1F8, 0xA1F9, 0xA1FA, 0xA1FB, 0xA1FC, 0xA1FD, 0xA1FE, 0xA1FF,\n    0xA200, 0xA201, 0xA202, 0xA203, 0xA204, 0xA205, 0xA206, 0xA207,\n    0xA208, 0xA209, 0xA20A, 0xA20B, 0xA20C, 0xA20D, 0xA20E, 0xA20F,\n    0xA210, 0xA211, 0xA212, 0xA213, 0xA214, 0xA215, 0xA216, 0xA217,\n    0xA218, 0xA219, 0xA21A, 0xA21B, 0xA21C, 0xA21D, 0xA21E, 0xA21F,\n    0xA220, 0xA221, 0xA222, 0xA223, 0xA224, 0xA225, 0xA226, 0xA227,\n    0xA228, 0xA229, 0xA22A, 0xA22B, 0xA22C, 0xA22D, 0xA22E, 0xA22F,\n    0xA230, 0xA231, 0xA232, 0xA233, 0xA234, 0xA235, 0xA236, 0xA237,\n    0xA238, 0xA239, 0xA23A, 0xA23B, 0xA23C, 0xA23D, 0xA23E, 0xA23F,\n    0xA240, 0xA241, 0xA242, 0xA243, 0xA244, 0xA245, 0xA246, 0xA247,\n    0xA248, 0xA249, 0xA24A, 0xA24B, 0xA24C, 0xA24D, 0xA24E, 0xA24F,\n    0xA250, 0xA251, 0xA252, 0xA253, 0xA254, 0xA255, 0xA256, 0xA257,\n    0xA258, 0xA259, 0xA25A, 0xA25B, 0xA25C, 0xA25D, 0xA25E, 0xA25F,\n    0xA260, 0xA261, 0xA262, 0xA263, 0xA264, 0xA265, 0xA266, 0xA267,\n    0xA268, 0xA269, 0xA26A, 0xA26B, 0xA26C, 0xA26D, 0xA26E, 0xA26F,\n    0xA270, 0xA271, 0xA272, 0xA273, 0xA274, 0xA275, 0xA276, 0xA277,\n    0xA278, 0xA279, 0xA27A, 0xA27B, 0xA27C, 0xA27D, 0xA27E, 0xA27F,\n    0xA280, 0xA281, 0xA282, 0xA283, 0xA284, 0xA285, 0xA286, 0xA287,\n    0xA288, 0xA289, 0xA28A, 0xA28B, 0xA28C, 0xA28D, 0xA28E, 0xA28F,\n    0xA290, 0xA291, 0xA292, 0xA293, 0xA294, 0xA295, 0xA296, 0xA297,\n    0xA298, 0xA299, 0xA29A, 0xA29B, 0xA29C, 0xA29D, 0xA29E, 0xA29F,\n    0xA2A0, 0xA2A1, 0xA2A2, 0xA2A3, 0xA2A4, 0xA2A5, 0xA2A6, 0xA2A7,\n    0xA2A8, 0xA2A9, 0xA2AA, 0xA2AB, 0xA2AC, 0xA2AD, 0xA2AE, 0xA2AF,\n    0xA2B0, 0xA2B1, 0xA2B2, 0xA2B3, 0xA2B4, 0xA2B5, 0xA2B6, 0xA2B7,\n    0xA2B8, 0xA2B9, 0xA2BA, 0xA2BB, 0xA2BC, 0xA2BD, 0xA2BE, 0xA2BF,\n    0xA2C0, 0xA2C1, 0xA2C2, 0xA2C3, 0xA2C4, 0xA2C5, 0xA2C6, 0xA2C7,\n    0xA2C8, 0xA2C9, 0xA2CA, 0xA2CB, 0xA2CC, 0xA2CD, 0xA2CE, 0xA2CF,\n    0xA2D0, 0xA2D1, 0xA2D2, 0xA2D3, 0xA2D4, 0xA2D5, 0xA2D6, 0xA2D7,\n    0xA2D8, 0xA2D9, 0xA2DA, 0xA2DB, 0xA2DC, 0xA2DD, 0xA2DE, 0xA2DF,\n    0xA2E0, 0xA2E1, 0xA2E2, 0xA2E3, 0xA2E4, 0xA2E5, 0xA2E6, 0xA2E7,\n    0xA2E8, 0xA2E9, 0xA2EA, 0xA2EB, 0xA2EC, 0xA2ED, 0xA2EE, 0xA2EF,\n    0xA2F0, 0xA2F1, 0xA2F2, 0xA2F3, 0xA2F4, 0xA2F5, 0xA2F6, 0xA2F7,\n    0xA2F8, 0xA2F9, 0xA2FA, 0xA2FB, 0xA2FC, 0xA2FD, 0xA2FE, 0xA2FF,\n    0xA300, 0xA301, 0xA302, 0xA303, 0xA304, 0xA305, 0xA306, 0xA307,\n    0xA308, 0xA309, 0xA30A, 0xA30B, 0xA30C, 0xA30D, 0xA30E, 0xA30F,\n    0xA310, 0xA311, 0xA312, 0xA313, 0xA314, 0xA315, 0xA316, 0xA317,\n    0xA318, 0xA319, 0xA31A, 0xA31B, 0xA31C, 0xA31D, 0xA31E, 0xA31F,\n    0xA320, 0xA321, 0xA322, 0xA323, 0xA324, 0xA325, 0xA326, 0xA327,\n    0xA328, 0xA329, 0xA32A, 0xA32B, 0xA32C, 0xA32D, 0xA32E, 0xA32F,\n    0xA330, 0xA331, 0xA332, 0xA333, 0xA334, 0xA335, 0xA336, 0xA337,\n    0xA338, 0xA339, 0xA33A, 0xA33B, 0xA33C, 0xA33D, 0xA33E, 0xA33F,\n    0xA340, 0xA341, 0xA342, 0xA343, 0xA344, 0xA345, 0xA346, 0xA347,\n    0xA348, 0xA349, 0xA34A, 0xA34B, 0xA34C, 0xA34D, 0xA34E, 0xA34F,\n    0xA350, 0xA351, 0xA352, 0xA353, 0xA354, 0xA355, 0xA356, 0xA357,\n    0xA358, 0xA359, 0xA35A, 0xA35B, 0xA35C, 0xA35D, 0xA35E, 0xA35F,\n    0xA360, 0xA361, 0xA362, 0xA363, 0xA364, 0xA365, 0xA366, 0xA367,\n    0xA368, 0xA369, 0xA36A, 0xA36B, 0xA36C, 0xA36D, 0xA36E, 0xA36F,\n    0xA370, 0xA371, 0xA372, 0xA373, 0xA374, 0xA375, 0xA376, 0xA377,\n    0xA378, 0xA379, 0xA37A, 0xA37B, 0xA37C, 0xA37D, 0xA37E, 0xA37F,\n    0xA380, 0xA381, 0xA382, 0xA383, 0xA384, 0xA385, 0xA386, 0xA387,\n    0xA388, 0xA389, 0xA38A, 0xA38B, 0xA38C, 0xA38D, 0xA38E, 0xA38F,\n    0xA390, 0xA391, 0xA392, 0xA393, 0xA394, 0xA395, 0xA396, 0xA397,\n    0xA398, 0xA399, 0xA39A, 0xA39B, 0xA39C, 0xA39D, 0xA39E, 0xA39F,\n    0xA3A0, 0xA3A1, 0xA3A2, 0xA3A3, 0xA3A4, 0xA3A5, 0xA3A6, 0xA3A7,\n    0xA3A8, 0xA3A9, 0xA3AA, 0xA3AB, 0xA3AC, 0xA3AD, 0xA3AE, 0xA3AF,\n    0xA3B0, 0xA3B1, 0xA3B2, 0xA3B3, 0xA3B4, 0xA3B5, 0xA3B6, 0xA3B7,\n    0xA3B8, 0xA3B9, 0xA3BA, 0xA3BB, 0xA3BC, 0xA3BD, 0xA3BE, 0xA3BF,\n    0xA3C0, 0xA3C1, 0xA3C2, 0xA3C3, 0xA3C4, 0xA3C5, 0xA3C6, 0xA3C7,\n    0xA3C8, 0xA3C9, 0xA3CA, 0xA3CB, 0xA3CC, 0xA3CD, 0xA3CE, 0xA3CF,\n    0xA3D0, 0xA3D1, 0xA3D2, 0xA3D3, 0xA3D4, 0xA3D5, 0xA3D6, 0xA3D7,\n    0xA3D8, 0xA3D9, 0xA3DA, 0xA3DB, 0xA3DC, 0xA3DD, 0xA3DE, 0xA3DF,\n    0xA3E0, 0xA3E1, 0xA3E2, 0xA3E3, 0xA3E4, 0xA3E5, 0xA3E6, 0xA3E7,\n    0xA3E8, 0xA3E9, 0xA3EA, 0xA3EB, 0xA3EC, 0xA3ED, 0xA3EE, 0xA3EF,\n    0xA3F0, 0xA3F1, 0xA3F2, 0xA3F3, 0xA3F4, 0xA3F5, 0xA3F6, 0xA3F7,\n    0xA3F8, 0xA3F9, 0xA3FA, 0xA3FB, 0xA3FC, 0xA3FD, 0xA3FE, 0xA3FF,\n    0xA400, 0xA401, 0xA402, 0xA403, 0xA404, 0xA405, 0xA406, 0xA407,\n    0xA408, 0xA409, 0xA40A, 0xA40B, 0xA40C, 0xA40D, 0xA40E, 0xA40F,\n    0xA410, 0xA411, 0xA412, 0xA413, 0xA414, 0xA415, 0xA416, 0xA417,\n    0xA418, 0xA419, 0xA41A, 0xA41B, 0xA41C, 0xA41D, 0xA41E, 0xA41F,\n    0xA420, 0xA421, 0xA422, 0xA423, 0xA424, 0xA425, 0xA426, 0xA427,\n    0xA428, 0xA429, 0xA42A, 0xA42B, 0xA42C, 0xA42D, 0xA42E, 0xA42F,\n    0xA430, 0xA431, 0xA432, 0xA433, 0xA434, 0xA435, 0xA436, 0xA437,\n    0xA438, 0xA439, 0xA43A, 0xA43B, 0xA43C, 0xA43D, 0xA43E, 0xA43F,\n    0xA440, 0xA441, 0xA442, 0xA443, 0xA444, 0xA445, 0xA446, 0xA447,\n    0xA448, 0xA449, 0xA44A, 0xA44B, 0xA44C, 0xA44D, 0xA44E, 0xA44F,\n    0xA450, 0xA451, 0xA452, 0xA453, 0xA454, 0xA455, 0xA456, 0xA457,\n    0xA458, 0xA459, 0xA45A, 0xA45B, 0xA45C, 0xA45D, 0xA45E, 0xA45F,\n    0xA460, 0xA461, 0xA462, 0xA463, 0xA464, 0xA465, 0xA466, 0xA467,\n    0xA468, 0xA469, 0xA46A, 0xA46B, 0xA46C, 0xA46D, 0xA46E, 0xA46F,\n    0xA470, 0xA471, 0xA472, 0xA473, 0xA474, 0xA475, 0xA476, 0xA477,\n    0xA478, 0xA479, 0xA47A, 0xA47B, 0xA47C, 0xA47D, 0xA47E, 0xA47F,\n    0xA480, 0xA481, 0xA482, 0xA483, 0xA484, 0xA485, 0xA486, 0xA487,\n    0xA488, 0xA489, 0xA48A, 0xA48B, 0xA48C, 0xA490, 0xA491, 0xA492,\n    0xA493, 0xA494, 0xA495, 0xA496, 0xA497, 0xA498, 0xA499, 0xA49A,\n    0xA49B, 0xA49C, 0xA49D, 0xA49E, 0xA49F, 0xA4A0, 0xA4A1, 0xA4A2,\n    0xA4A3, 0xA4A4, 0xA4A5, 0xA4A6, 0xA4A7, 0xA4A8, 0xA4A9, 0xA4AA,\n    0xA4AB, 0xA4AC, 0xA4AD, 0xA4AE, 0xA4AF, 0xA4B0, 0xA4B1, 0xA4B2,\n    0xA4B3, 0xA4B4, 0xA4B5, 0xA4B6, 0xA4B7, 0xA4B8, 0xA4B9, 0xA4BA,\n    0xA4BB, 0xA4BC, 0xA4BD, 0xA4BE, 0xA4BF, 0xA4C0, 0xA4C1, 0xA4C2,\n    0xA4C3, 0xA4C4, 0xA4C5, 0xA4C6,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-H_0.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_GB_EUC_H_0[90 * 3] = {\n    0x0020, 0x0020, 0x1E24, 0x0021, 0x007E, 0x032E, 0xA1A1, 0xA1FE, 0x0060,\n    0xA2B1, 0xA2E2, 0x00BE, 0xA2E5, 0xA2EE, 0x00F0, 0xA2F1, 0xA2FC, 0x00FA,\n    0xA3A1, 0xA3FE, 0x0106, 0xA4A1, 0xA4F3, 0x0164, 0xA5A1, 0xA5F6, 0x01B7,\n    0xA6A1, 0xA6B8, 0x020D, 0xA6C1, 0xA6F5, 0x0225, 0xA7A1, 0xA7C1, 0x025A,\n    0xA7D1, 0xA7F1, 0x027B, 0xA8A1, 0xA8C0, 0x029C, 0xA8C5, 0xA8EA, 0x02BC,\n    0xA9A4, 0xA9EF, 0x02E2, 0xAAA1, 0xAAFE, 0x032E, 0xABA1, 0xABC0, 0x038C,\n    0xB0A1, 0xB0FE, 0x03AC, 0xB1A1, 0xB1FE, 0x040A, 0xB2A1, 0xB2FE, 0x0468,\n    0xB3A1, 0xB3FE, 0x04C6, 0xB4A1, 0xB4FE, 0x0524, 0xB5A1, 0xB5FE, 0x0582,\n    0xB6A1, 0xB6FE, 0x05E0, 0xB7A1, 0xB7FE, 0x063E, 0xB8A1, 0xB8FE, 0x069C,\n    0xB9A1, 0xB9FE, 0x06FA, 0xBAA1, 0xBAFE, 0x0758, 0xBBA1, 0xBBFE, 0x07B6,\n    0xBCA1, 0xBCFE, 0x0814, 0xBDA1, 0xBDFE, 0x0872, 0xBEA1, 0xBEFE, 0x08D0,\n    0xBFA1, 0xBFFE, 0x092E, 0xC0A1, 0xC0FE, 0x098C, 0xC1A1, 0xC1FE, 0x09EA,\n    0xC2A1, 0xC2FE, 0x0A48, 0xC3A1, 0xC3FE, 0x0AA6, 0xC4A1, 0xC4FE, 0x0B04,\n    0xC5A1, 0xC5FE, 0x0B62, 0xC6A1, 0xC6FE, 0x0BC0, 0xC7A1, 0xC7FE, 0x0C1E,\n    0xC8A1, 0xC8FE, 0x0C7C, 0xC9A1, 0xC9FE, 0x0CDA, 0xCAA1, 0xCAFE, 0x0D38,\n    0xCBA1, 0xCBFE, 0x0D96, 0xCCA1, 0xCCFE, 0x0DF4, 0xCDA1, 0xCDFE, 0x0E52,\n    0xCEA1, 0xCEFE, 0x0EB0, 0xCFA1, 0xCFFE, 0x0F0E, 0xD0A1, 0xD0FE, 0x0F6C,\n    0xD1A1, 0xD1FE, 0x0FCA, 0xD2A1, 0xD2FE, 0x1028, 0xD3A1, 0xD3FE, 0x1086,\n    0xD4A1, 0xD4FE, 0x10E4, 0xD5A1, 0xD5FE, 0x1142, 0xD6A1, 0xD6FE, 0x11A0,\n    0xD7A1, 0xD7F9, 0x11FE, 0xD8A1, 0xD8FE, 0x1257, 0xD9A1, 0xD9FE, 0x12B5,\n    0xDAA1, 0xDAFE, 0x1313, 0xDBA1, 0xDBFE, 0x1371, 0xDCA1, 0xDCFE, 0x13CF,\n    0xDDA1, 0xDDFE, 0x142D, 0xDEA1, 0xDEFE, 0x148B, 0xDFA1, 0xDFFE, 0x14E9,\n    0xE0A1, 0xE0FE, 0x1547, 0xE1A1, 0xE1FE, 0x15A5, 0xE2A1, 0xE2FE, 0x1603,\n    0xE3A1, 0xE3FE, 0x1661, 0xE4A1, 0xE4FE, 0x16BF, 0xE5A1, 0xE5FE, 0x171D,\n    0xE6A1, 0xE6FE, 0x177B, 0xE7A1, 0xE7FE, 0x17D9, 0xE8A1, 0xE8FE, 0x1837,\n    0xE9A1, 0xE9FE, 0x1895, 0xEAA1, 0xEAFE, 0x18F3, 0xEBA1, 0xEBFE, 0x1951,\n    0xECA1, 0xECFE, 0x19AF, 0xEDA1, 0xEDFE, 0x1A0D, 0xEEA1, 0xEEFE, 0x1A6B,\n    0xEFA1, 0xEFFE, 0x1AC9, 0xF0A1, 0xF0FE, 0x1B27, 0xF1A1, 0xF1FE, 0x1B85,\n    0xF2A1, 0xF2FE, 0x1BE3, 0xF3A1, 0xF3FE, 0x1C41, 0xF4A1, 0xF4FE, 0x1C9F,\n    0xF5A1, 0xF5FE, 0x1CFD, 0xF6A1, 0xF6FE, 0x1D5B, 0xF7A1, 0xF7FE, 0x1DB9,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-V_0.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_GB_EUC_V_0[20 * 3] = {\n    0xA1A2, 0xA1A2, 0x023F, 0xA1A3, 0xA1A3, 0x023E, 0xA1AA, 0xA1AA, 0x0256,\n    0xA1AB, 0xA1AC, 0x1E18, 0xA1AD, 0xA1AD, 0x0257, 0xA1B2, 0xA1BF, 0x0246,\n    0xA1FE, 0xA1FE, 0x1E1A, 0xA3A1, 0xA3A1, 0x0242, 0xA3A8, 0xA3A9, 0x0244,\n    0xA3AC, 0xA3AC, 0x023D, 0xA3AE, 0xA3AE, 0x1E1B, 0xA3BA, 0xA3BB, 0x0240,\n    0xA3BD, 0xA3BD, 0x1E1C, 0xA3BF, 0xA3BF, 0x0243, 0xA3DB, 0xA3DB, 0x1E1D,\n    0xA3DD, 0xA3DD, 0x1E1E, 0xA3DF, 0xA3DF, 0x0258, 0xA3FB, 0xA3FB, 0x0254,\n    0xA3FD, 0xA3FD, 0x0255, 0xA3FE, 0xA3FE, 0x1E1F,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-H_2.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_GBK_EUC_H_2[4071 * 3] = {\n    0x0020, 0x0020, 0x1E24, 0x0021, 0x007E, 0x032E, 0x8140, 0x8178, 0x2758,\n    0x8179, 0x8179, 0x2059, 0x817A, 0x817E, 0x2791, 0x8180, 0x8185, 0x2796,\n    0x8186, 0x8186, 0x21F1, 0x8187, 0x81EC, 0x279C, 0x81ED, 0x81ED, 0x1FF2,\n    0x81EE, 0x81F5, 0x2802, 0x81F6, 0x81F6, 0x205D, 0x81F7, 0x81FE, 0x280A,\n    0x8240, 0x8252, 0x2812, 0x8253, 0x8253, 0x269C, 0x8254, 0x8261, 0x2825,\n    0x8262, 0x8262, 0x21B5, 0x8263, 0x8273, 0x2833, 0x8274, 0x8274, 0x22CC,\n    0x8275, 0x8279, 0x2844, 0x827A, 0x827A, 0x2016, 0x827B, 0x827C, 0x2849,\n    0x827D, 0x827D, 0x1E62, 0x827E, 0x827E, 0x284B, 0x8280, 0x8280, 0x1F20,\n    0x8281, 0x8282, 0x284C, 0x8283, 0x8283, 0x207F, 0x8284, 0x828F, 0x284E,\n    0x8290, 0x8290, 0x205C, 0x8291, 0x82A4, 0x285A, 0x82A5, 0x82A5, 0x2194,\n    0x82A6, 0x82C7, 0x286E, 0x82C8, 0x82C8, 0x1E65, 0x82C9, 0x82C9, 0x2281,\n    0x82CA, 0x82E0, 0x2890, 0x82E1, 0x82E1, 0x22CD, 0x82E2, 0x82E2, 0x28A7,\n    0x82E3, 0x82E3, 0x210A, 0x82E4, 0x82E4, 0x1E3E, 0x82E5, 0x82EC, 0x28A8,\n    0x82ED, 0x82ED, 0x267F, 0x82EE, 0x82F1, 0x28B0, 0x82F2, 0x82F2, 0x222E,\n    0x82F3, 0x82F6, 0x28B4, 0x82F7, 0x82F7, 0x1E96, 0x82F8, 0x82F8, 0x22CB,\n    0x82F9, 0x82F9, 0x226C, 0x82FA, 0x82FA, 0x28B8, 0x82FB, 0x82FB, 0x2117,\n    0x82FC, 0x82FE, 0x28B9, 0x8340, 0x8340, 0x28BC, 0x8341, 0x8341, 0x20E8,\n    0x8342, 0x8344, 0x28BD, 0x8345, 0x8345, 0x22D4, 0x8346, 0x8347, 0x28C0,\n    0x8348, 0x8348, 0x1FB9, 0x8349, 0x834B, 0x28C2, 0x834C, 0x834C, 0x22D8,\n    0x834D, 0x8352, 0x28C5, 0x8353, 0x8353, 0x20DF, 0x8354, 0x8356, 0x28CB,\n    0x8357, 0x8357, 0x20C2, 0x8358, 0x835D, 0x28CE, 0x835E, 0x835E, 0x2195,\n    0x835F, 0x8364, 0x28D4, 0x8365, 0x8365, 0x1FAC, 0x8366, 0x8366, 0x22D3,\n    0x8367, 0x8371, 0x28DA, 0x8372, 0x8372, 0x1F81, 0x8373, 0x8377, 0x28E5,\n    0x8378, 0x8378, 0x2210, 0x8379, 0x8379, 0x28EA, 0x837A, 0x837A, 0x22CF,\n    0x837B, 0x837B, 0x28EB, 0x837C, 0x837C, 0x2213, 0x837D, 0x837D, 0x28EC,\n    0x837E, 0x837E, 0x1FE4, 0x8380, 0x8380, 0x1F90, 0x8381, 0x8385, 0x28ED,\n    0x8386, 0x8386, 0x22D6, 0x8387, 0x8388, 0x28F2, 0x8389, 0x8389, 0x22D0,\n    0x838A, 0x838A, 0x22CE, 0x838B, 0x838C, 0x28F4, 0x838D, 0x838D, 0x2681,\n    0x838E, 0x8393, 0x28F6, 0x8394, 0x8394, 0x1E76, 0x8395, 0x839D, 0x28FC,\n    0x839E, 0x839E, 0x2231, 0x839F, 0x83A5, 0x2905, 0x83A6, 0x83A6, 0x1E93,\n    0x83A7, 0x83AA, 0x290C, 0x83AB, 0x83AB, 0x22D2, 0x83AC, 0x83AD, 0x2910,\n    0x83AE, 0x83AE, 0x22D7, 0x83AF, 0x83AF, 0x22D5, 0x83B0, 0x83B0, 0x22D1,\n    0x83B1, 0x83B9, 0x2912, 0x83BA, 0x83BA, 0x1EE5, 0x83BB, 0x83C8, 0x291B,\n    0x83C9, 0x83C9, 0x2025, 0x83CA, 0x83F5, 0x2929, 0x83F6, 0x83F6, 0x1ECF,\n    0x83F7, 0x83FE, 0x2955, 0x8440, 0x844F, 0x295D, 0x8450, 0x8450, 0x1FD9,\n    0x8451, 0x8470, 0x296D, 0x8471, 0x8471, 0x22C8, 0x8472, 0x8473, 0x298D,\n    0x8474, 0x8474, 0x2263, 0x8475, 0x8476, 0x298F, 0x8477, 0x8477, 0x2683,\n    0x8478, 0x847E, 0x2991, 0x8480, 0x8481, 0x2998, 0x8482, 0x8482, 0x1F17,\n    0x8483, 0x848D, 0x299A, 0x848E, 0x848E, 0x1F2B, 0x848F, 0x8491, 0x29A5,\n    0x8492, 0x8492, 0x22CA, 0x8493, 0x8493, 0x1E99, 0x8494, 0x849C, 0x29A8,\n    0x849D, 0x849D, 0x1F4F, 0x849E, 0x84A0, 0x29B1, 0x84A1, 0x84A1, 0x1FCF,\n    0x84A2, 0x84A2, 0x2036, 0x84A3, 0x84A3, 0x1F3A, 0x84A4, 0x84A4, 0x29B4,\n    0x84A5, 0x84A5, 0x22C9, 0x84A6, 0x84A6, 0x1F99, 0x84A7, 0x84A8, 0x29B5,\n    0x84A9, 0x84A9, 0x1F75, 0x84AA, 0x84C4, 0x29B7, 0x84C5, 0x84C5, 0x1FBE,\n    0x84C6, 0x84D2, 0x29D2, 0x84D3, 0x84D3, 0x1ECD, 0x84D4, 0x84D4, 0x29DF,\n    0x84D5, 0x84D5, 0x21A9, 0x84D6, 0x84D6, 0x29E0, 0x84D7, 0x84D7, 0x21E6,\n    0x84D8, 0x84D8, 0x29E1, 0x84D9, 0x84D9, 0x2127, 0x84DA, 0x84DA, 0x2003,\n    0x84DB, 0x84DC, 0x29E2, 0x84DD, 0x84DD, 0x2132, 0x84DE, 0x84E9, 0x29E4,\n    0x84EA, 0x84EA, 0x2323, 0x84EB, 0x84ED, 0x29F0, 0x84EE, 0x84EE, 0x2011,\n    0x84EF, 0x84F0, 0x29F3, 0x84F1, 0x84F1, 0x20F5, 0x84F2, 0x84FE, 0x29F5,\n    0x8540, 0x8550, 0x2A02, 0x8551, 0x8551, 0x22C5, 0x8552, 0x8552, 0x1F5E,\n    0x8553, 0x8553, 0x2A13, 0x8554, 0x8554, 0x22C6, 0x8555, 0x855D, 0x2A14,\n    0x855E, 0x855E, 0x20EF, 0x855F, 0x8565, 0x2A1D, 0x8566, 0x8566, 0x21D0,\n    0x8567, 0x857E, 0x2A24, 0x8580, 0x8586, 0x2A3C, 0x8587, 0x8587, 0x22C1,\n    0x8588, 0x858A, 0x2A43, 0x858B, 0x858B, 0x1E64, 0x858C, 0x8591, 0x2A46,\n    0x8592, 0x8592, 0x21F9, 0x8593, 0x8595, 0x2A4C, 0x8596, 0x8596, 0x2010,\n    0x8597, 0x8597, 0x2A4F, 0x8598, 0x8598, 0x22C2, 0x8599, 0x85A1, 0x2A50,\n    0x85A2, 0x85A2, 0x1E5A, 0x85A3, 0x85B1, 0x2A59, 0x85B2, 0x85B2, 0x1EA2,\n    0x85B3, 0x85FE, 0x2A68, 0x8640, 0x8649, 0x2AB4, 0x864A, 0x864A, 0x236D,\n    0x864B, 0x8653, 0x2ABE, 0x8654, 0x8654, 0x2247, 0x8655, 0x8667, 0x2AC7,\n    0x8668, 0x8668, 0x236C, 0x8669, 0x867E, 0x2ADA, 0x8680, 0x8695, 0x2AF0,\n    0x8696, 0x8696, 0x219C, 0x8697, 0x8698, 0x2B06, 0x8699, 0x8699, 0x20C9,\n    0x869A, 0x86A0, 0x2B08, 0x86A1, 0x86A1, 0x21F0, 0x86A2, 0x86C9, 0x2B0F,\n    0x86CA, 0x86CA, 0x210B, 0x86CB, 0x86CB, 0x2B37, 0x86CC, 0x86CC, 0x20DE,\n    0x86CD, 0x86CD, 0x2B38, 0x86CE, 0x86CE, 0x1EAA, 0x86CF, 0x86D0, 0x2B39,\n    0x86D1, 0x86D1, 0x222C, 0x86D2, 0x86DB, 0x2B3B, 0x86DC, 0x86DC, 0x20D8,\n    0x86DD, 0x86DD, 0x22C0, 0x86DE, 0x86E0, 0x2B45, 0x86E1, 0x86E1, 0x206F,\n    0x86E2, 0x86E7, 0x2B48, 0x86E8, 0x86E8, 0x21A1, 0x86E9, 0x86ED, 0x2B4E,\n    0x86EE, 0x86EE, 0x2379, 0x86EF, 0x86F3, 0x2B53, 0x86F4, 0x86F4, 0x2372,\n    0x86F5, 0x86FE, 0x2B58, 0x8740, 0x8740, 0x216A, 0x8741, 0x8743, 0x2B62,\n    0x8744, 0x8744, 0x237C, 0x8745, 0x8748, 0x2B65, 0x8749, 0x8749, 0x20B0,\n    0x874A, 0x874A, 0x2B69, 0x874B, 0x874B, 0x237A, 0x874C, 0x874C, 0x1E74,\n    0x874D, 0x874E, 0x2B6A, 0x874F, 0x874F, 0x2377, 0x8750, 0x8756, 0x2B6C,\n    0x8757, 0x8757, 0x1F4C, 0x8758, 0x8759, 0x2B73, 0x875A, 0x875A, 0x2378,\n    0x875B, 0x875B, 0x21CF, 0x875C, 0x875C, 0x2368, 0x875D, 0x875D, 0x2B75,\n    0x875E, 0x875E, 0x2371, 0x875F, 0x875F, 0x2B76, 0x8760, 0x8760, 0x2369,\n    0x8761, 0x8765, 0x2B77, 0x8766, 0x8766, 0x2674, 0x8767, 0x8779, 0x2B7C,\n    0x877A, 0x877A, 0x236F, 0x877B, 0x877C, 0x2B8F, 0x877D, 0x877D, 0x2370,\n    0x877E, 0x877E, 0x2B91, 0x8780, 0x8780, 0x2B92, 0x8781, 0x8781, 0x2376,\n    0x8782, 0x8782, 0x2373, 0x8783, 0x8785, 0x2B93, 0x8786, 0x8786, 0x237F,\n    0x8787, 0x8787, 0x2B96, 0x8788, 0x8788, 0x2374, 0x8789, 0x8789, 0x2B97,\n    0x878A, 0x878A, 0x20B5, 0x878B, 0x878C, 0x2B98, 0x878D, 0x878D, 0x1EDB,\n    0x878E, 0x878E, 0x2672, 0x878F, 0x8792, 0x2B9A, 0x8793, 0x8793, 0x236E,\n    0x8794, 0x8797, 0x2B9E, 0x8798, 0x8798, 0x21B7, 0x8799, 0x879C, 0x2BA2,\n    0x879D, 0x879D, 0x2375, 0x879E, 0x87A2, 0x2BA6, 0x87A3, 0x87A3, 0x2382,\n    0x87A4, 0x87A6, 0x2BAB, 0x87A7, 0x87A7, 0x209E, 0x87A8, 0x87B2, 0x2BAE,\n    0x87B3, 0x87B3, 0x236B, 0x87B4, 0x87B4, 0x2BB9, 0x87B5, 0x87B5, 0x2039,\n    0x87B6, 0x87BA, 0x2BBA, 0x87BB, 0x87BB, 0x269F, 0x87BC, 0x87BE, 0x2BBF,\n    0x87BF, 0x87BF, 0x237D, 0x87C0, 0x87C0, 0x21F5, 0x87C1, 0x87C1, 0x2BC2,\n    0x87C2, 0x87C2, 0x2381, 0x87C3, 0x87C9, 0x2BC3, 0x87CA, 0x87CA, 0x237B,\n    0x87CB, 0x87CB, 0x237E, 0x87CC, 0x87CC, 0x21CC, 0x87CD, 0x87CE, 0x2BCA,\n    0x87CF, 0x87CF, 0x22DB, 0x87D0, 0x87D1, 0x2BCC, 0x87D2, 0x87D2, 0x236A,\n    0x87D3, 0x87D3, 0x2689, 0x87D4, 0x87D4, 0x2BCE, 0x87D5, 0x87D5, 0x2697,\n    0x87D6, 0x87D9, 0x2BCF, 0x87DA, 0x87DA, 0x22A1, 0x87DB, 0x87F6, 0x2BD3,\n    0x87F7, 0x87F7, 0x2383, 0x87F8, 0x87F8, 0x1F3D, 0x87F9, 0x87F9, 0x2BEF,\n    0x87FA, 0x87FA, 0x218F, 0x87FB, 0x87FE, 0x2BF0, 0x8840, 0x8840, 0x2246,\n    0x8841, 0x8841, 0x2248, 0x8842, 0x8843, 0x2BF4, 0x8844, 0x8844, 0x217E,\n    0x8845, 0x8845, 0x2BF6, 0x8846, 0x8846, 0x2180, 0x8847, 0x887E, 0x2BF7,\n    0x8880, 0x88B9, 0x2C2F, 0x88BA, 0x88BA, 0x232A, 0x88BB, 0x88CB, 0x2C69,\n    0x88CC, 0x88CC, 0x228B, 0x88CD, 0x88D3, 0x2C7A, 0x88D4, 0x88D4, 0x1F85,\n    0x88D5, 0x88D6, 0x2C81, 0x88D7, 0x88D7, 0x2325, 0x88D8, 0x88DE, 0x2C83,\n    0x88DF, 0x88DF, 0x232C, 0x88E0, 0x88E4, 0x2C8A, 0x88E5, 0x88E5, 0x232E,\n    0x88E6, 0x88F1, 0x2C8F, 0x88F2, 0x88F2, 0x2205, 0x88F3, 0x88F3, 0x1E38,\n    0x88F4, 0x88F5, 0x2C9B, 0x88F6, 0x88F6, 0x1E73, 0x88F7, 0x88FE, 0x2C9D,\n    0x8940, 0x894A, 0x2CA5, 0x894B, 0x894B, 0x1FE3, 0x894C, 0x894C, 0x2339,\n    0x894D, 0x894D, 0x2CB0, 0x894E, 0x894E, 0x232B, 0x894F, 0x894F, 0x2CB1,\n    0x8950, 0x8950, 0x232D, 0x8951, 0x8953, 0x2CB2, 0x8954, 0x8954, 0x217F,\n    0x8955, 0x895C, 0x2CB5, 0x895D, 0x895D, 0x21A7, 0x895E, 0x895E, 0x2CBD,\n    0x895F, 0x895F, 0x232F, 0x8960, 0x896C, 0x2CBE, 0x896D, 0x896D, 0x1E7D,\n    0x896E, 0x8970, 0x2CCB, 0x8971, 0x8971, 0x20D6, 0x8972, 0x897B, 0x2CCE,\n    0x897C, 0x897C, 0x1EC2, 0x897D, 0x897E, 0x2CD8, 0x8980, 0x898A, 0x2CDA,\n    0x898B, 0x898B, 0x22B2, 0x898C, 0x8998, 0x2CE5, 0x8999, 0x8999, 0x1EDF,\n    0x899A, 0x899D, 0x2CF2, 0x899E, 0x899E, 0x1EF9, 0x899F, 0x89A5, 0x2CF6,\n    0x89A6, 0x89A6, 0x20D9, 0x89A7, 0x89A7, 0x2CFD, 0x89A8, 0x89A8, 0x1FDD,\n    0x89A9, 0x89AE, 0x2CFE, 0x89AF, 0x89AF, 0x2167, 0x89B0, 0x89B9, 0x2D04,\n    0x89BA, 0x89BA, 0x21ED, 0x89BB, 0x89BD, 0x2D0E, 0x89BE, 0x89BE, 0x2007,\n    0x89BF, 0x89BF, 0x2326, 0x89C0, 0x89C0, 0x2329, 0x89C1, 0x89C3, 0x2D11,\n    0x89C4, 0x89C4, 0x1F52, 0x89C5, 0x89C5, 0x203B, 0x89C6, 0x89C6, 0x2328,\n    0x89C7, 0x89C7, 0x2D14, 0x89C8, 0x89C8, 0x2327, 0x89C9, 0x89CD, 0x2D15,\n    0x89CE, 0x89CE, 0x1E2B, 0x89CF, 0x89D0, 0x2D1A, 0x89D1, 0x89D1, 0x22AE,\n    0x89D2, 0x89D7, 0x2D1C, 0x89D8, 0x89D8, 0x1F49, 0x89D9, 0x89DA, 0x2D22,\n    0x89DB, 0x89DB, 0x2138, 0x89DC, 0x89F3, 0x2D24, 0x89F4, 0x89F4, 0x2081,\n    0x89F5, 0x89FE, 0x2D3C, 0x8A40, 0x8A40, 0x2D46, 0x8A41, 0x8A41, 0x1F7C,\n    0x8A42, 0x8A58, 0x2D47, 0x8A59, 0x8A59, 0x235B, 0x8A5A, 0x8A5A, 0x1EDE,\n    0x8A5B, 0x8A5B, 0x2D5E, 0x8A5C, 0x8A5C, 0x1FA2, 0x8A5D, 0x8A5D, 0x2D5F,\n    0x8A5E, 0x8A5E, 0x1EFA, 0x8A5F, 0x8A78, 0x2D60, 0x8A79, 0x8A79, 0x22AD,\n    0x8A7A, 0x8A7E, 0x2D7A, 0x8A80, 0x8AE3, 0x2D7F, 0x8AE4, 0x8AE4, 0x203F,\n    0x8AE5, 0x8AFE, 0x2DE3, 0x8B40, 0x8B43, 0x2DFD, 0x8B44, 0x8B44, 0x1F0E,\n    0x8B45, 0x8B48, 0x2E01, 0x8B49, 0x8B49, 0x23F9, 0x8B4A, 0x8B79, 0x2E05,\n    0x8B7A, 0x8B7A, 0x23FC, 0x8B7B, 0x8B7E, 0x2E35, 0x8B80, 0x8B8B, 0x2E39,\n    0x8B8C, 0x8B8C, 0x2069, 0x8B8D, 0x8B9D, 0x2E45, 0x8B9E, 0x8B9E, 0x23F7,\n    0x8B9F, 0x8BB2, 0x2E56, 0x8BB3, 0x8BB3, 0x23F6, 0x8BB4, 0x8BB8, 0x2E6A,\n    0x8BB9, 0x8BB9, 0x23FD, 0x8BBA, 0x8BBD, 0x2E6F, 0x8BBE, 0x8BBE, 0x23F8,\n    0x8BBF, 0x8BC5, 0x2E73, 0x8BC6, 0x8BC6, 0x23FA, 0x8BC7, 0x8BC7, 0x2E7A,\n    0x8BC8, 0x8BC8, 0x23FE, 0x8BC9, 0x8BC9, 0x1FA8, 0x8BCA, 0x8BD3, 0x2E7B,\n    0x8BD4, 0x8BD4, 0x2401, 0x8BD5, 0x8BDB, 0x2E85, 0x8BDC, 0x8BDC, 0x23FF,\n    0x8BDD, 0x8BE4, 0x2E8C, 0x8BE5, 0x8BE5, 0x2400, 0x8BE6, 0x8BEA, 0x2E94,\n    0x8BEB, 0x8BEB, 0x2221, 0x8BEC, 0x8BEF, 0x2E99, 0x8BF0, 0x8BF0, 0x2122,\n    0x8BF1, 0x8BFE, 0x2E9D, 0x8C40, 0x8C43, 0x2EAB, 0x8C44, 0x8C44, 0x23FB,\n    0x8C45, 0x8C4E, 0x2EAF, 0x8C4F, 0x8C4F, 0x215A, 0x8C50, 0x8C56, 0x2EB9,\n    0x8C57, 0x8C57, 0x21E5, 0x8C58, 0x8C5B, 0x2EC0, 0x8C5C, 0x8C5C, 0x2057,\n    0x8C5D, 0x8C7E, 0x2EC4, 0x8C80, 0x8C8A, 0x2EE6, 0x8C8B, 0x8C8B, 0x20E5,\n    0x8C8C, 0x8C8C, 0x2EF1, 0x8C8D, 0x8C8D, 0x212F, 0x8C8E, 0x8C8E, 0x20A3,\n    0x8C8F, 0x8C8F, 0x2121, 0x8C90, 0x8C90, 0x2EF2, 0x8C91, 0x8C91, 0x21D4,\n    0x8C92, 0x8C92, 0x1FE5, 0x8C93, 0x8C98, 0x2EF3, 0x8C99, 0x8C99, 0x1E8A,\n    0x8C9A, 0x8C9A, 0x1E37, 0x8C9B, 0x8CA1, 0x2EF9, 0x8CA2, 0x8CA2, 0x1F9E,\n    0x8CA3, 0x8CA3, 0x22A6, 0x8CA4, 0x8CA4, 0x21E8, 0x8CA5, 0x8CA5, 0x2F00,\n    0x8CA6, 0x8CA6, 0x1EDA, 0x8CA7, 0x8CA7, 0x1EB9, 0x8CA8, 0x8CBF, 0x2F01,\n    0x8CC0, 0x8CC0, 0x235C, 0x8CC1, 0x8CD1, 0x2F19, 0x8CD2, 0x8CD2, 0x2050,\n    0x8CD3, 0x8CD3, 0x1E67, 0x8CD4, 0x8CD4, 0x2F2A, 0x8CD5, 0x8CD5, 0x23F4,\n    0x8CD6, 0x8CD8, 0x2F2B, 0x8CD9, 0x8CD9, 0x213E, 0x8CDA, 0x8CF8, 0x2F2E,\n    0x8CF9, 0x8CF9, 0x1F16, 0x8CFA, 0x8CFE, 0x2F4D, 0x8D40, 0x8D72, 0x2F52,\n    0x8D73, 0x8D73, 0x2389, 0x8D74, 0x8D74, 0x2F85, 0x8D75, 0x8D75, 0x1EB7,\n    0x8D76, 0x8D7A, 0x2F86, 0x8D7B, 0x8D7B, 0x21B4, 0x8D7C, 0x8D7E, 0x2F8B,\n    0x8D80, 0x8D87, 0x2F8E, 0x8D88, 0x8D88, 0x238F, 0x8D89, 0x8D8E, 0x2F96,\n    0x8D8F, 0x8D8F, 0x1F1A, 0x8D90, 0x8D9D, 0x2F9C, 0x8D9E, 0x8D9E, 0x238B,\n    0x8D9F, 0x8DB8, 0x2FAA, 0x8DB9, 0x8DB9, 0x238A, 0x8DBA, 0x8DE1, 0x2FC4,\n    0x8DE2, 0x8DE2, 0x2391, 0x8DE3, 0x8DE3, 0x2FEC, 0x8DE4, 0x8DE4, 0x2271,\n    0x8DE5, 0x8DE6, 0x2FED, 0x8DE7, 0x8DE7, 0x2388, 0x8DE8, 0x8DF6, 0x2FEF,\n    0x8DF7, 0x8DF7, 0x238E, 0x8DF8, 0x8DFD, 0x2FFE, 0x8DFE, 0x8DFE, 0x238D,\n    0x8E40, 0x8E45, 0x3004, 0x8E46, 0x8E46, 0x238C, 0x8E47, 0x8E55, 0x300A,\n    0x8E56, 0x8E56, 0x2390, 0x8E57, 0x8E57, 0x3019, 0x8E58, 0x8E58, 0x2033,\n    0x8E59, 0x8E59, 0x301A, 0x8E5A, 0x8E5A, 0x223C, 0x8E5B, 0x8E67, 0x301B,\n    0x8E68, 0x8E68, 0x1FE9, 0x8E69, 0x8E6D, 0x3028, 0x8E6E, 0x8E6E, 0x2055,\n    0x8E6F, 0x8E6F, 0x302D, 0x8E70, 0x8E70, 0x2392, 0x8E71, 0x8E7E, 0x302E,\n    0x8E80, 0x8E80, 0x2324, 0x8E81, 0x8E9A, 0x303C, 0x8E9B, 0x8E9B, 0x2143,\n    0x8E9C, 0x8E9E, 0x3056, 0x8E9F, 0x8E9F, 0x2129, 0x8EA0, 0x8EA3, 0x3059,\n    0x8EA4, 0x8EA4, 0x2277, 0x8EA5, 0x8EA6, 0x305D, 0x8EA7, 0x8EA7, 0x1EA7,\n    0x8EA8, 0x8EAB, 0x305F, 0x8EAC, 0x8EAC, 0x2285, 0x8EAD, 0x8EAD, 0x3063,\n    0x8EAE, 0x8EAE, 0x2384, 0x8EAF, 0x8EBC, 0x3064, 0x8EBD, 0x8EBD, 0x2387,\n    0x8EBE, 0x8EBE, 0x2386, 0x8EBF, 0x8EC2, 0x3072, 0x8EC3, 0x8EC3, 0x2290,\n    0x8EC4, 0x8EC4, 0x3076, 0x8EC5, 0x8EC5, 0x1E44, 0x8EC6, 0x8ECC, 0x3077,\n    0x8ECD, 0x8ECD, 0x1E32, 0x8ECE, 0x8ECE, 0x2385, 0x8ECF, 0x8ED5, 0x307E,\n    0x8ED6, 0x8ED6, 0x1F13, 0x8ED7, 0x8ED7, 0x1F73, 0x8ED8, 0x8EEB, 0x3085,\n    0x8EEC, 0x8EEC, 0x1FE0, 0x8EED, 0x8EFE, 0x3099, 0x8F40, 0x8F51, 0x30AB,\n    0x8F52, 0x8F52, 0x2087, 0x8F53, 0x8F53, 0x1E78, 0x8F54, 0x8F54, 0x23AE,\n    0x8F55, 0x8F55, 0x1EF6, 0x8F56, 0x8F56, 0x1F31, 0x8F57, 0x8F5C, 0x30BD,\n    0x8F5D, 0x8F5D, 0x2045, 0x8F5E, 0x8F63, 0x30C3, 0x8F64, 0x8F64, 0x2178,\n    0x8F65, 0x8F7E, 0x30C9, 0x8F80, 0x8F85, 0x30E3, 0x8F86, 0x8F86, 0x23F5,\n    0x8F87, 0x8F87, 0x30E9, 0x8F88, 0x8F88, 0x2275, 0x8F89, 0x8F94, 0x30EA,\n    0x8F95, 0x8F95, 0x266E, 0x8F96, 0x8F96, 0x30F6, 0x8F97, 0x8F97, 0x1EB0,\n    0x8F98, 0x8F9A, 0x30F7, 0x8F9B, 0x8F9B, 0x2083, 0x8F9C, 0x8F9C, 0x30FA,\n    0x8F9D, 0x8F9D, 0x2188, 0x8F9E, 0x8FA0, 0x30FB, 0x8FA1, 0x8FA1, 0x267C,\n    0x8FA2, 0x8FBC, 0x30FE, 0x8FBD, 0x8FBD, 0x1FC5, 0x8FBE, 0x8FC3, 0x3119,\n    0x8FC4, 0x8FC4, 0x1EA1, 0x8FC5, 0x8FC5, 0x311F, 0x8FC6, 0x8FC6, 0x2393,\n    0x8FC7, 0x8FCC, 0x3120, 0x8FCD, 0x8FCD, 0x1F0B, 0x8FCE, 0x8FD7, 0x3126,\n    0x8FD8, 0x8FD8, 0x1E7C, 0x8FD9, 0x8FFE, 0x3130, 0x9040, 0x907E, 0x3156,\n    0x9080, 0x909C, 0x3195, 0x909D, 0x909D, 0x23B4, 0x909E, 0x909E, 0x207E,\n    0x909F, 0x90B9, 0x31B2, 0x90BA, 0x90BA, 0x1EE3, 0x90BB, 0x90BF, 0x31CD,\n    0x90C0, 0x90C0, 0x2095, 0x90C1, 0x90C1, 0x23BB, 0x90C2, 0x90C4, 0x31D2,\n    0x90C5, 0x90C5, 0x23B9, 0x90C6, 0x90DA, 0x31D5, 0x90DB, 0x90DB, 0x1E28,\n    0x90DC, 0x90DC, 0x23BD, 0x90DD, 0x90EC, 0x31EA, 0x90ED, 0x90ED, 0x23B5,\n    0x90EE, 0x90EF, 0x31FA, 0x90F0, 0x90F0, 0x23BA, 0x90F1, 0x90F6, 0x31FC,\n    0x90F7, 0x90F7, 0x23B3, 0x90F8, 0x90FE, 0x3202, 0x9140, 0x9141, 0x3209,\n    0x9142, 0x9142, 0x2162, 0x9143, 0x914A, 0x320B, 0x914B, 0x914B, 0x1E5E,\n    0x914C, 0x914C, 0x3213, 0x914D, 0x914D, 0x1E5D, 0x914E, 0x9150, 0x3214,\n    0x9151, 0x9151, 0x23B7, 0x9152, 0x9153, 0x3217, 0x9154, 0x9154, 0x1F2F,\n    0x9155, 0x9155, 0x24DF, 0x9156, 0x9158, 0x3219, 0x9159, 0x9159, 0x23B2,\n    0x915A, 0x915A, 0x214E, 0x915B, 0x915C, 0x321C, 0x915D, 0x915D, 0x2052,\n    0x915E, 0x9160, 0x321E, 0x9161, 0x9161, 0x23BC, 0x9162, 0x9162, 0x3221,\n    0x9163, 0x9163, 0x20EB, 0x9164, 0x916D, 0x3222, 0x916E, 0x916E, 0x2232,\n    0x916F, 0x9175, 0x322C, 0x9176, 0x9176, 0x1E3F, 0x9177, 0x9179, 0x3233,\n    0x917A, 0x917A, 0x201B, 0x917B, 0x917B, 0x20BC, 0x917C, 0x917C, 0x23BE,\n    0x917D, 0x917E, 0x3236, 0x9180, 0x9183, 0x3238, 0x9184, 0x9184, 0x1EAE,\n    0x9185, 0x918C, 0x323C, 0x918D, 0x918D, 0x1EFB, 0x918E, 0x9190, 0x3244,\n    0x9191, 0x9191, 0x2089, 0x9192, 0x9192, 0x3247, 0x9193, 0x9193, 0x23B1,\n    0x9194, 0x9196, 0x3248, 0x9197, 0x9197, 0x21C4, 0x9198, 0x919A, 0x324B,\n    0x919B, 0x919B, 0x2214, 0x919C, 0x91A8, 0x324E, 0x91A9, 0x91A9, 0x1FDE,\n    0x91AA, 0x91AA, 0x2223, 0x91AB, 0x91AB, 0x23B6, 0x91AC, 0x91B9, 0x325B,\n    0x91BA, 0x91BA, 0x268C, 0x91BB, 0x91BB, 0x24DE, 0x91BC, 0x91BE, 0x3269,\n    0x91BF, 0x91BF, 0x24E0, 0x91C0, 0x91C2, 0x326C, 0x91C3, 0x91C3, 0x23B8,\n    0x91C4, 0x91CC, 0x326F, 0x91CD, 0x91CD, 0x1E81, 0x91CE, 0x91CF, 0x3278,\n    0x91D0, 0x91D0, 0x1FFE, 0x91D1, 0x91D1, 0x1F51, 0x91D2, 0x91D2, 0x21E1,\n    0x91D3, 0x91D3, 0x327A, 0x91D4, 0x91D4, 0x23B0, 0x91D5, 0x91D5, 0x327B,\n    0x91D6, 0x91D6, 0x1FCE, 0x91D7, 0x91D7, 0x327C, 0x91D8, 0x91D8, 0x211E,\n    0x91D9, 0x91D9, 0x2021, 0x91DA, 0x91DE, 0x327D, 0x91DF, 0x91DF, 0x24E1,\n    0x91E0, 0x91E1, 0x3282, 0x91E2, 0x91E2, 0x24A3, 0x91E3, 0x91E9, 0x3284,\n    0x91EA, 0x91EA, 0x24A4, 0x91EB, 0x91EF, 0x328B, 0x91F0, 0x91F0, 0x2273,\n    0x91F1, 0x91F1, 0x3290, 0x91F2, 0x91F2, 0x21B0, 0x91F3, 0x91FE, 0x3291,\n    0x9240, 0x927E, 0x329D, 0x9280, 0x92B5, 0x32DC, 0x92B6, 0x92B6, 0x21D1,\n    0x92B7, 0x92CD, 0x3312, 0x92CE, 0x92CE, 0x211C, 0x92CF, 0x92CF, 0x3329,\n    0x92D0, 0x92D0, 0x235D, 0x92D1, 0x92D3, 0x332A, 0x92D4, 0x92D4, 0x2682,\n    0x92D5, 0x92DE, 0x332D, 0x92DF, 0x92DF, 0x210D, 0x92E0, 0x92E0, 0x205A,\n    0x92E1, 0x92FD, 0x3337, 0x92FE, 0x92FE, 0x1F8D, 0x9340, 0x934F, 0x3354,\n    0x9350, 0x9350, 0x21FF, 0x9351, 0x935C, 0x3364, 0x935D, 0x935D, 0x1F58,\n    0x935E, 0x936F, 0x3370, 0x9370, 0x9370, 0x215B, 0x9371, 0x9375, 0x3382,\n    0x9376, 0x9376, 0x1EB6, 0x9377, 0x937E, 0x3387, 0x9380, 0x938B, 0x338F,\n    0x938C, 0x938C, 0x20DB, 0x938D, 0x939C, 0x339B, 0x939D, 0x939D, 0x2360,\n    0x939E, 0x93A4, 0x33AB, 0x93A5, 0x93A5, 0x2361, 0x93A6, 0x93A6, 0x33B2,\n    0x93A7, 0x93A7, 0x2040, 0x93A8, 0x93B3, 0x33B3, 0x93B4, 0x93B4, 0x228E,\n    0x93B5, 0x93B7, 0x33BF, 0x93B8, 0x93B8, 0x1FDF, 0x93B9, 0x93BA, 0x33C2,\n    0x93BB, 0x93BB, 0x235E, 0x93BC, 0x93BC, 0x33C4, 0x93BD, 0x93BD, 0x1E6A,\n    0x93BE, 0x93C5, 0x33C5, 0x93C6, 0x93C6, 0x2002, 0x93C7, 0x93CE, 0x33CD,\n    0x93CF, 0x93CF, 0x2093, 0x93D0, 0x93D6, 0x33D5, 0x93D7, 0x93D7, 0x235F,\n    0x93D8, 0x93DA, 0x33DC, 0x93DB, 0x93DB, 0x1EAC, 0x93DC, 0x93DC, 0x1E54,\n    0x93DD, 0x93E0, 0x33DF, 0x93E1, 0x93E1, 0x1F08, 0x93E2, 0x93E3, 0x33E3,\n    0x93E4, 0x93E4, 0x20C0, 0x93E5, 0x93E5, 0x2362, 0x93E6, 0x93E8, 0x33E5,\n    0x93E9, 0x93E9, 0x2160, 0x93EA, 0x93EA, 0x33E8, 0x93EB, 0x93EB, 0x219D,\n    0x93EC, 0x93EC, 0x1F8E, 0x93ED, 0x93ED, 0x222D, 0x93EE, 0x93EE, 0x33E9,\n    0x93EF, 0x93EF, 0x2047, 0x93F0, 0x93F0, 0x33EA, 0x93F1, 0x93F1, 0x2262,\n    0x93F2, 0x93F3, 0x33EB, 0x93F4, 0x93F4, 0x1F67, 0x93F5, 0x93F5, 0x1EB2,\n    0x93F6, 0x93F9, 0x33ED, 0x93FA, 0x93FA, 0x1EA9, 0x93FB, 0x93FD, 0x33F1,\n    0x93FE, 0x93FE, 0x1FCC, 0x9440, 0x9443, 0x33F4, 0x9444, 0x9444, 0x1F72,\n    0x9445, 0x944C, 0x33F8, 0x944D, 0x944D, 0x2098, 0x944E, 0x944F, 0x3400,\n    0x9450, 0x9450, 0x1E52, 0x9451, 0x9451, 0x20A4, 0x9452, 0x9452, 0x1F1C,\n    0x9453, 0x9453, 0x228F, 0x9454, 0x9454, 0x3402, 0x9455, 0x9455, 0x1FED,\n    0x9456, 0x9457, 0x3403, 0x9458, 0x9458, 0x2365, 0x9459, 0x945A, 0x3405,\n    0x945B, 0x945B, 0x1E2D, 0x945C, 0x945C, 0x2152, 0x945D, 0x945D, 0x2366,\n    0x945E, 0x945E, 0x3407, 0x945F, 0x945F, 0x20FA, 0x9460, 0x9463, 0x3408,\n    0x9464, 0x9464, 0x2363, 0x9465, 0x9465, 0x340C, 0x9466, 0x9466, 0x209A,\n    0x9467, 0x946D, 0x340D, 0x946E, 0x946E, 0x203C, 0x946F, 0x9471, 0x3414,\n    0x9472, 0x9472, 0x1FF6, 0x9473, 0x9473, 0x3417, 0x9474, 0x9474, 0x2364,\n    0x9475, 0x9475, 0x3418, 0x9476, 0x9476, 0x1E69, 0x9477, 0x9477, 0x3419,\n    0x9478, 0x9478, 0x2367, 0x9479, 0x9479, 0x341A, 0x947A, 0x947A, 0x211D,\n    0x947B, 0x947E, 0x341B, 0x9480, 0x9480, 0x2259, 0x9481, 0x9481, 0x2056,\n    0x9482, 0x9482, 0x2163, 0x9483, 0x9486, 0x341F, 0x9487, 0x9487, 0x1FA9,\n    0x9488, 0x9488, 0x1FFC, 0x9489, 0x94A0, 0x3423, 0x94A1, 0x94A1, 0x1E2E,\n    0x94A2, 0x94B2, 0x343B, 0x94B3, 0x94B3, 0x1EBC, 0x94B4, 0x94B4, 0x344C,\n    0x94B5, 0x94B5, 0x2142, 0x94B6, 0x94BE, 0x344D, 0x94BF, 0x94BF, 0x201E,\n    0x94C0, 0x94C0, 0x1E43, 0x94C1, 0x94CB, 0x3456, 0x94CC, 0x94CC, 0x24D4,\n    0x94CD, 0x94D7, 0x3461, 0x94D8, 0x94D8, 0x226F, 0x94D9, 0x94DF, 0x346C,\n    0x94E0, 0x94E0, 0x1ED7, 0x94E1, 0x94FE, 0x3473, 0x9540, 0x9571, 0x3491,\n    0x9572, 0x9572, 0x212D, 0x9573, 0x957E, 0x34C3, 0x9580, 0x9582, 0x34CF,\n    0x9583, 0x9583, 0x229B, 0x9584, 0x959D, 0x34D2, 0x959E, 0x959E, 0x2256,\n    0x959F, 0x959F, 0x24A8, 0x95A0, 0x95B2, 0x34EC, 0x95B3, 0x95B3, 0x1E79,\n    0x95B4, 0x95B9, 0x34FF, 0x95BA, 0x95BA, 0x225A, 0x95BB, 0x95CE, 0x3505,\n    0x95CF, 0x95CF, 0x24A7, 0x95D0, 0x95D0, 0x3519, 0x95D1, 0x95D1, 0x2686,\n    0x95D2, 0x95D2, 0x24A6, 0x95D3, 0x95D3, 0x351A, 0x95D4, 0x95D4, 0x21CE,\n    0x95D5, 0x95E0, 0x351B, 0x95E1, 0x95E1, 0x24A9, 0x95E2, 0x95E6, 0x3527,\n    0x95E7, 0x95E7, 0x1FE7, 0x95E8, 0x95F0, 0x352C, 0x95F1, 0x95F1, 0x2112,\n    0x95F2, 0x95F7, 0x3535, 0x95F8, 0x95F8, 0x213C, 0x95F9, 0x95FD, 0x353B,\n    0x95FE, 0x95FE, 0x1F5C, 0x9640, 0x9655, 0x3540, 0x9656, 0x9656, 0x24C4,\n    0x9657, 0x967B, 0x3556, 0x967C, 0x967C, 0x1ECC, 0x967D, 0x967E, 0x357B,\n    0x9680, 0x96FE, 0x357D, 0x9740, 0x9766, 0x35FC, 0x9767, 0x9767, 0x246A,\n    0x9768, 0x976B, 0x3623, 0x976C, 0x976C, 0x2175, 0x976D, 0x976D, 0x3627,\n    0x976E, 0x976E, 0x246D, 0x976F, 0x977E, 0x3628, 0x9780, 0x9795, 0x3638,\n    0x9796, 0x9796, 0x246B, 0x9797, 0x9797, 0x225F, 0x9798, 0x979C, 0x364E,\n    0x979D, 0x979D, 0x1ECE, 0x979E, 0x97A2, 0x3653, 0x97A3, 0x97A3, 0x2272,\n    0x97A4, 0x97BE, 0x3658, 0x97BF, 0x97BF, 0x2473, 0x97C0, 0x97ED, 0x3673,\n    0x97EE, 0x97EE, 0x21FE, 0x97EF, 0x97F6, 0x36A1, 0x97F7, 0x97F7, 0x1EFE,\n    0x97F8, 0x97FE, 0x36A9, 0x9840, 0x9844, 0x36B0, 0x9845, 0x9845, 0x2475,\n    0x9846, 0x9848, 0x36B5, 0x9849, 0x9849, 0x220A, 0x984A, 0x984E, 0x36B8,\n    0x984F, 0x984F, 0x1F6F, 0x9850, 0x9870, 0x36BD, 0x9871, 0x9871, 0x2468,\n    0x9872, 0x9872, 0x36DE, 0x9873, 0x9873, 0x2100, 0x9874, 0x987E, 0x36DF,\n    0x9880, 0x9880, 0x36EA, 0x9881, 0x9881, 0x2476, 0x9882, 0x988A, 0x36EB,\n    0x988B, 0x988B, 0x1F27, 0x988C, 0x988C, 0x20D7, 0x988D, 0x989F, 0x36F4,\n    0x98A0, 0x98A0, 0x247C, 0x98A1, 0x98A9, 0x3707, 0x98AA, 0x98AA, 0x1FA1,\n    0x98AB, 0x98B5, 0x3710, 0x98B6, 0x98B6, 0x22AA, 0x98B7, 0x98B7, 0x2005,\n    0x98B8, 0x98B9, 0x371B, 0x98BA, 0x98BA, 0x246C, 0x98BB, 0x98C6, 0x371D,\n    0x98C7, 0x98C7, 0x203E, 0x98C8, 0x98CA, 0x3729, 0x98CB, 0x98CB, 0x1E4C,\n    0x98CC, 0x98CF, 0x372C, 0x98D0, 0x98D0, 0x213A, 0x98D1, 0x98D2, 0x3730,\n    0x98D3, 0x98D3, 0x2204, 0x98D4, 0x98E2, 0x3732, 0x98E3, 0x98E3, 0x20C3,\n    0x98E4, 0x98E4, 0x2140, 0x98E5, 0x98E5, 0x2477, 0x98E6, 0x98EE, 0x3741,\n    0x98EF, 0x98EF, 0x2474, 0x98F0, 0x98F1, 0x374A, 0x98F2, 0x98F2, 0x20DD,\n    0x98F3, 0x98FE, 0x374C, 0x9940, 0x9942, 0x3758, 0x9943, 0x9943, 0x1F68,\n    0x9944, 0x9944, 0x375B, 0x9945, 0x9945, 0x2185, 0x9946, 0x9965, 0x375C,\n    0x9966, 0x9966, 0x2472, 0x9967, 0x996D, 0x377C, 0x996E, 0x996E, 0x1EB5,\n    0x996F, 0x9974, 0x3783, 0x9975, 0x9975, 0x2478, 0x9976, 0x9979, 0x3789,\n    0x997A, 0x997A, 0x1F8B, 0x997B, 0x997B, 0x2484, 0x997C, 0x997E, 0x378D,\n    0x9980, 0x9984, 0x3790, 0x9985, 0x9985, 0x2699, 0x9986, 0x9988, 0x3795,\n    0x9989, 0x9989, 0x2482, 0x998A, 0x998D, 0x3798, 0x998E, 0x998E, 0x20A1,\n    0x998F, 0x9990, 0x379C, 0x9991, 0x9991, 0x1F92, 0x9992, 0x9998, 0x379E,\n    0x9999, 0x9999, 0x1F38, 0x999A, 0x99A8, 0x37A5, 0x99A9, 0x99A9, 0x2485,\n    0x99AA, 0x99AF, 0x37B4, 0x99B0, 0x99B0, 0x2480, 0x99B1, 0x99B1, 0x246E,\n    0x99B2, 0x99B2, 0x37BA, 0x99B3, 0x99B3, 0x247B, 0x99B4, 0x99B4, 0x2486,\n    0x99B5, 0x99B5, 0x2471, 0x99B6, 0x99BC, 0x37BB, 0x99BD, 0x99BD, 0x2483,\n    0x99BE, 0x99BE, 0x2470, 0x99BF, 0x99BF, 0x37C2, 0x99C0, 0x99C0, 0x2469,\n    0x99C1, 0x99C1, 0x37C3, 0x99C2, 0x99C2, 0x247F, 0x99C3, 0x99C8, 0x37C4,\n    0x99C9, 0x99C9, 0x246F, 0x99CA, 0x99CD, 0x37CA, 0x99CE, 0x99CE, 0x2481,\n    0x99CF, 0x99D0, 0x37CE, 0x99D1, 0x99D1, 0x2220, 0x99D2, 0x99D9, 0x37D0,\n    0x99DA, 0x99DA, 0x1FF5, 0x99DB, 0x99DF, 0x37D8, 0x99E0, 0x99E0, 0x20F4,\n    0x99E1, 0x99E4, 0x37DD, 0x99E5, 0x99E5, 0x247D, 0x99E6, 0x99E7, 0x37E1,\n    0x99E8, 0x99E8, 0x2479, 0x99E9, 0x99EB, 0x37E3, 0x99EC, 0x99EC, 0x247E,\n    0x99ED, 0x99F3, 0x37E6, 0x99F4, 0x99F4, 0x247A, 0x99F5, 0x99FE, 0x37ED,\n    0x9A40, 0x9A49, 0x37F7, 0x9A4A, 0x9A4A, 0x20E3, 0x9A4B, 0x9A56, 0x3801,\n    0x9A57, 0x9A57, 0x20AD, 0x9A58, 0x9A64, 0x380D, 0x9A65, 0x9A65, 0x24CB,\n    0x9A66, 0x9A66, 0x381A, 0x9A67, 0x9A67, 0x1F53, 0x9A68, 0x9A70, 0x381B,\n    0x9A71, 0x9A71, 0x2159, 0x9A72, 0x9A75, 0x3824, 0x9A76, 0x9A76, 0x2013,\n    0x9A77, 0x9A77, 0x1F33, 0x9A78, 0x9A7E, 0x3828, 0x9A80, 0x9A87, 0x382F,\n    0x9A88, 0x9A88, 0x1E5C, 0x9A89, 0x9A8B, 0x3837, 0x9A8C, 0x9A8C, 0x2488,\n    0x9A8D, 0x9A90, 0x383A, 0x9A91, 0x9A91, 0x2487, 0x9A92, 0x9A96, 0x383E,\n    0x9A97, 0x9A97, 0x248A, 0x9A98, 0x9A99, 0x3843, 0x9A9A, 0x9A9A, 0x2489,\n    0x9A9B, 0x9A9B, 0x248B, 0x9A9C, 0x9A9D, 0x3845, 0x9A9E, 0x9A9E, 0x1F83,\n    0x9A9F, 0x9AA1, 0x3847, 0x9AA2, 0x9AA2, 0x210F, 0x9AA3, 0x9AA3, 0x1FDB,\n    0x9AA4, 0x9AA9, 0x384A, 0x9AAA, 0x9AAA, 0x20AF, 0x9AAB, 0x9ACF, 0x3850,\n    0x9AD0, 0x9AD0, 0x24C0, 0x9AD1, 0x9AD5, 0x3875, 0x9AD6, 0x9AD6, 0x226D,\n    0x9AD7, 0x9AD9, 0x387A, 0x9ADA, 0x9ADA, 0x24C1, 0x9ADB, 0x9AE1, 0x387D,\n    0x9AE2, 0x9AE2, 0x20CA, 0x9AE3, 0x9AE3, 0x3884, 0x9AE4, 0x9AE4, 0x20E7,\n    0x9AE5, 0x9AE5, 0x24C2, 0x9AE6, 0x9AFE, 0x3885, 0x9B40, 0x9B7E, 0x389E,\n    0x9B80, 0x9BD0, 0x38DD, 0x9BD1, 0x9BD1, 0x23DC, 0x9BD2, 0x9BDB, 0x392E,\n    0x9BDC, 0x9BDC, 0x23DB, 0x9BDD, 0x9BFE, 0x3938, 0x9C40, 0x9C52, 0x395A,\n    0x9C53, 0x9C53, 0x205E, 0x9C54, 0x9C58, 0x396D, 0x9C59, 0x9C59, 0x2244,\n    0x9C5A, 0x9C5A, 0x23E2, 0x9C5B, 0x9C5B, 0x3972, 0x9C5C, 0x9C5C, 0x20D4,\n    0x9C5D, 0x9C74, 0x3973, 0x9C75, 0x9C75, 0x219F, 0x9C76, 0x9C78, 0x398B,\n    0x9C79, 0x9C79, 0x1E66, 0x9C7A, 0x9C7E, 0x398E, 0x9C80, 0x9C85, 0x3993,\n    0x9C86, 0x9C86, 0x1F63, 0x9C87, 0x9C9C, 0x3999, 0x9C9D, 0x9C9D, 0x23DD,\n    0x9C9E, 0x9CAA, 0x39AF, 0x9CAB, 0x9CAB, 0x216B, 0x9CAC, 0x9CC9, 0x39BC,\n    0x9CCA, 0x9CCA, 0x22B5, 0x9CCB, 0x9CCE, 0x39DA, 0x9CCF, 0x9CCF, 0x1F26,\n    0x9CD0, 0x9CE5, 0x39DE, 0x9CE6, 0x9CE6, 0x1E63, 0x9CE7, 0x9CE7, 0x2088,\n    0x9CE8, 0x9CEB, 0x39F4, 0x9CEC, 0x9CEC, 0x1EBD, 0x9CED, 0x9CED, 0x39F8,\n    0x9CEE, 0x9CEE, 0x2341, 0x9CEF, 0x9CFA, 0x39F9, 0x9CFB, 0x9CFB, 0x1F4B,\n    0x9CFC, 0x9CFD, 0x3A05, 0x9CFE, 0x9CFE, 0x2292, 0x9D40, 0x9D41, 0x3A07,\n    0x9D42, 0x9D42, 0x2124, 0x9D43, 0x9D45, 0x3A09, 0x9D46, 0x9D46, 0x2048,\n    0x9D47, 0x9D47, 0x23E0, 0x9D48, 0x9D4C, 0x3A0C, 0x9D4D, 0x9D4D, 0x2077,\n    0x9D4E, 0x9D4E, 0x3A11, 0x9D4F, 0x9D4F, 0x223A, 0x9D50, 0x9D60, 0x3A12,\n    0x9D61, 0x9D61, 0x20B1, 0x9D62, 0x9D67, 0x3A23, 0x9D68, 0x9D68, 0x1F41,\n    0x9D69, 0x9D69, 0x201C, 0x9D6A, 0x9D6D, 0x3A29, 0x9D6E, 0x9D6E, 0x22B8,\n    0x9D6F, 0x9D70, 0x3A2D, 0x9D71, 0x9D71, 0x2276, 0x9D72, 0x9D74, 0x3A2F,\n    0x9D75, 0x9D75, 0x1F9B, 0x9D76, 0x9D7A, 0x3A32, 0x9D7B, 0x9D7B, 0x1F9F,\n    0x9D7C, 0x9D7C, 0x3A37, 0x9D7D, 0x9D7D, 0x25CA, 0x9D7E, 0x9D7E, 0x3A38,\n    0x9D80, 0x9D89, 0x3A39, 0x9D8A, 0x9D8A, 0x20BE, 0x9D8B, 0x9D8C, 0x3A43,\n    0x9D8D, 0x9D8D, 0x1FB4, 0x9D8E, 0x9D90, 0x3A45, 0x9D91, 0x9D91, 0x23D7,\n    0x9D92, 0x9D98, 0x3A48, 0x9D99, 0x9D99, 0x2105, 0x9D9A, 0x9DA0, 0x3A4F,\n    0x9DA1, 0x9DA1, 0x23E1, 0x9DA2, 0x9DA2, 0x1FEC, 0x9DA3, 0x9DA6, 0x3A56,\n    0x9DA7, 0x9DA7, 0x23EA, 0x9DA8, 0x9DAB, 0x3A5A, 0x9DAC, 0x9DAC, 0x23E3,\n    0x9DAD, 0x9DAD, 0x210E, 0x9DAE, 0x9DB1, 0x3A5E, 0x9DB2, 0x9DB2, 0x1FA6,\n    0x9DB3, 0x9DB3, 0x2004, 0x9DB4, 0x9DBD, 0x3A62, 0x9DBE, 0x9DBE, 0x1F9D,\n    0x9DBF, 0x9DC5, 0x3A6C, 0x9DC6, 0x9DC6, 0x23E5, 0x9DC7, 0x9DC8, 0x3A73,\n    0x9DC9, 0x9DC9, 0x2264, 0x9DCA, 0x9DCC, 0x3A75, 0x9DCD, 0x9DCD, 0x24E2,\n    0x9DCE, 0x9DD1, 0x3A78, 0x9DD2, 0x9DD2, 0x23DE, 0x9DD3, 0x9DD4, 0x3A7C,\n    0x9DD5, 0x9DD5, 0x1EC4, 0x9DD6, 0x9DE0, 0x3A7E, 0x9DE1, 0x9DE1, 0x22B6,\n    0x9DE2, 0x9DE2, 0x20A9, 0x9DE3, 0x9DF0, 0x3A89, 0x9DF1, 0x9DF1, 0x212B,\n    0x9DF2, 0x9DF3, 0x3A97, 0x9DF4, 0x9DF4, 0x20A5, 0x9DF5, 0x9DF6, 0x3A99,\n    0x9DF7, 0x9DF7, 0x268B, 0x9DF8, 0x9DF9, 0x3A9B, 0x9DFA, 0x9DFA, 0x1F76,\n    0x9DFB, 0x9DFC, 0x3A9D, 0x9DFD, 0x9DFD, 0x216D, 0x9DFE, 0x9DFE, 0x3A9F,\n    0x9E40, 0x9E44, 0x3AA0, 0x9E45, 0x9E45, 0x2001, 0x9E46, 0x9E47, 0x3AA5,\n    0x9E48, 0x9E48, 0x2191, 0x9E49, 0x9E49, 0x1E50, 0x9E4A, 0x9E51, 0x3AA7,\n    0x9E52, 0x9E52, 0x1F9C, 0x9E53, 0x9E53, 0x3AAF, 0x9E54, 0x9E54, 0x23DA,\n    0x9E55, 0x9E55, 0x3AB0, 0x9E56, 0x9E56, 0x2053, 0x9E57, 0x9E5C, 0x3AB1,\n    0x9E5D, 0x9E5D, 0x23E9, 0x9E5E, 0x9E5E, 0x23E4, 0x9E5F, 0x9E60, 0x3AB7,\n    0x9E61, 0x9E61, 0x21D5, 0x9E62, 0x9E62, 0x3AB9, 0x9E63, 0x9E63, 0x23E6,\n    0x9E64, 0x9E66, 0x3ABA, 0x9E67, 0x9E67, 0x23DF, 0x9E68, 0x9E6B, 0x3ABD,\n    0x9E6C, 0x9E6C, 0x1E4F, 0x9E6D, 0x9E6E, 0x3AC1, 0x9E6F, 0x9E6F, 0x23D9,\n    0x9E70, 0x9E71, 0x3AC3, 0x9E72, 0x9E72, 0x2014, 0x9E73, 0x9E73, 0x3AC5,\n    0x9E74, 0x9E74, 0x23EC, 0x9E75, 0x9E75, 0x23EB, 0x9E76, 0x9E7A, 0x3AC6,\n    0x9E7B, 0x9E7B, 0x23D8, 0x9E7C, 0x9E7C, 0x23EE, 0x9E7D, 0x9E7E, 0x3ACB,\n    0x9E80, 0x9E84, 0x3ACD, 0x9E85, 0x9E85, 0x268E, 0x9E86, 0x9E86, 0x3AD2,\n    0x9E87, 0x9E87, 0x23ED, 0x9E88, 0x9E90, 0x3AD3, 0x9E91, 0x9E91, 0x1FFA,\n    0x9E92, 0x9E95, 0x3ADC, 0x9E96, 0x9E96, 0x23D6, 0x9E97, 0x9E97, 0x23E8,\n    0x9E98, 0x9EA1, 0x3AE0, 0x9EA2, 0x9EA2, 0x2106, 0x9EA3, 0x9EA5, 0x3AEA,\n    0x9EA6, 0x9EA6, 0x200B, 0x9EA7, 0x9EA8, 0x3AED, 0x9EA9, 0x9EA9, 0x2166,\n    0x9EAA, 0x9EAD, 0x3AEF, 0x9EAE, 0x9EAE, 0x23EF, 0x9EAF, 0x9EB2, 0x3AF3,\n    0x9EB3, 0x9EB3, 0x2189, 0x9EB4, 0x9EB4, 0x2058, 0x9EB5, 0x9EB6, 0x3AF7,\n    0x9EB7, 0x9EB7, 0x23E7, 0x9EB8, 0x9EF4, 0x3AF9, 0x9EF5, 0x9EF5, 0x21A3,\n    0x9EF6, 0x9EFE, 0x3B36, 0x9F40, 0x9F4D, 0x3B3F, 0x9F4E, 0x9F4E, 0x217A,\n    0x9F4F, 0x9F6E, 0x3B4D, 0x9F6F, 0x9F6F, 0x21A5, 0x9F70, 0x9F7E, 0x3B6D,\n    0x9F80, 0x9F91, 0x3B7C, 0x9F92, 0x9F92, 0x2022, 0x9F93, 0x9F97, 0x3B8E,\n    0x9F98, 0x9F98, 0x24D6, 0x9F99, 0x9FA5, 0x3B93, 0x9FA6, 0x9FA6, 0x233A,\n    0x9FA7, 0x9FA8, 0x3BA0, 0x9FA9, 0x9FA9, 0x1EEE, 0x9FAA, 0x9FAB, 0x3BA2,\n    0x9FAC, 0x9FAC, 0x24D5, 0x9FAD, 0x9FC8, 0x3BA4, 0x9FC9, 0x9FC9, 0x2228,\n    0x9FCA, 0x9FCC, 0x3BC0, 0x9FCD, 0x9FCD, 0x24D7, 0x9FCE, 0x9FE0, 0x3BC3,\n    0x9FE1, 0x9FE1, 0x20FC, 0x9FE2, 0x9FEA, 0x3BD6, 0x9FEB, 0x9FEB, 0x1E87,\n    0x9FEC, 0x9FED, 0x3BDF, 0x9FEE, 0x9FEE, 0x24D8, 0x9FEF, 0x9FF3, 0x3BE1,\n    0x9FF4, 0x9FF4, 0x1EBA, 0x9FF5, 0x9FFC, 0x3BE6, 0x9FFD, 0x9FFD, 0x2119,\n    0x9FFE, 0x9FFE, 0x3BEE, 0xA040, 0xA042, 0x3BEF, 0xA043, 0xA043, 0x216C,\n    0xA044, 0xA045, 0x3BF2, 0xA046, 0xA046, 0x24D9, 0xA047, 0xA048, 0x3BF4,\n    0xA049, 0xA049, 0x2227, 0xA04A, 0xA04D, 0x3BF6, 0xA04E, 0xA04E, 0x1E5F,\n    0xA04F, 0xA053, 0x3BFA, 0xA054, 0xA054, 0x229F, 0xA055, 0xA059, 0x3BFF,\n    0xA05A, 0xA05A, 0x1F5D, 0xA05B, 0xA060, 0x3C04, 0xA061, 0xA061, 0x1FBC,\n    0xA062, 0xA062, 0x3C0A, 0xA063, 0xA063, 0x24DA, 0xA064, 0xA070, 0x3C0B,\n    0xA071, 0xA071, 0x2149, 0xA072, 0xA073, 0x3C18, 0xA074, 0xA074, 0x2046,\n    0xA075, 0xA07E, 0x3C1A, 0xA080, 0xA080, 0x2000, 0xA081, 0xA090, 0x3C24,\n    0xA091, 0xA091, 0x2190, 0xA092, 0xA093, 0x3C34, 0xA094, 0xA094, 0x2208,\n    0xA095, 0xA095, 0x3C36, 0xA096, 0xA096, 0x1EE6, 0xA097, 0xA0A8, 0x3C37,\n    0xA0A9, 0xA0A9, 0x24C3, 0xA0AA, 0xA0BE, 0x3C49, 0xA0BF, 0xA0BF, 0x20CC,\n    0xA0C0, 0xA0CD, 0x3C5E, 0xA0CE, 0xA0CE, 0x2340, 0xA0CF, 0xA0D8, 0x3C6C,\n    0xA0D9, 0xA0D9, 0x1ED1, 0xA0DA, 0xA0DD, 0x3C76, 0xA0DE, 0xA0DE, 0x21AC,\n    0xA0DF, 0xA0ED, 0x3C7A, 0xA0EE, 0xA0EE, 0x22AF, 0xA0EF, 0xA0FE, 0x3C89,\n    0xA1A1, 0xA1FE, 0x0060, 0xA2A1, 0xA2AA, 0x26A9, 0xA2B1, 0xA2E2, 0x00BE,\n    0xA2E5, 0xA2EE, 0x00F0, 0xA2F1, 0xA2FC, 0x00FA, 0xA3A1, 0xA3FE, 0x0106,\n    0xA4A1, 0xA4F3, 0x0164, 0xA5A1, 0xA5F6, 0x01B7, 0xA6A1, 0xA6B8, 0x020D,\n    0xA6C1, 0xA6F5, 0x0225, 0xA7A1, 0xA7C1, 0x025A, 0xA7D1, 0xA7F1, 0x027B,\n    0xA840, 0xA87E, 0x26B3, 0xA880, 0xA895, 0x26F2, 0xA8A1, 0xA8C0, 0x029C,\n    0xA8C5, 0xA8EA, 0x02BC, 0xA940, 0xA957, 0x2708, 0xA959, 0xA95A, 0x2720,\n    0xA95C, 0xA95C, 0x2722, 0xA960, 0xA97E, 0x2723, 0xA980, 0xA995, 0x2742,\n    0xA996, 0xA996, 0x1E17, 0xA9A4, 0xA9EF, 0x02E2, 0xAA40, 0xAA4C, 0x3C99,\n    0xAA4D, 0xAA4D, 0x21B6, 0xAA4E, 0xAA4E, 0x1E3D, 0xAA4F, 0xAA70, 0x3CA6,\n    0xAA71, 0xAA71, 0x2235, 0xAA72, 0xAA72, 0x3CC8, 0xAA73, 0xAA73, 0x2397,\n    0xAA74, 0xAA76, 0x3CC9, 0xAA77, 0xAA77, 0x2395, 0xAA78, 0xAA79, 0x3CCC,\n    0xAA7A, 0xAA7A, 0x223F, 0xAA7B, 0xAA7B, 0x212A, 0xAA7C, 0xAA7E, 0x3CCE,\n    0xAA80, 0xAA99, 0x3CD1, 0xAA9A, 0xAA9A, 0x1ED2, 0xAA9B, 0xAA9B, 0x3CEB,\n    0xAA9C, 0xAA9C, 0x2396, 0xAA9D, 0xAA9D, 0x2398, 0xAA9E, 0xAA9E, 0x3CEC,\n    0xAA9F, 0xAA9F, 0x20A2, 0xAAA0, 0xAAA0, 0x3CED, 0xAAA1, 0xAAFE, 0x032E,\n    0xAB40, 0xAB40, 0x1F64, 0xAB41, 0xAB42, 0x3CEE, 0xAB43, 0xAB43, 0x202B,\n    0xAB44, 0xAB44, 0x3CF0, 0xAB45, 0xAB45, 0x2394, 0xAB46, 0xAB46, 0x2139,\n    0xAB47, 0xAB47, 0x3CF1, 0xAB48, 0xAB48, 0x215F, 0xAB49, 0xAB49, 0x21C1,\n    0xAB4A, 0xAB4A, 0x239A, 0xAB4B, 0xAB4C, 0x3CF2, 0xAB4D, 0xAB4D, 0x2399,\n    0xAB4E, 0xAB7E, 0x3CF4, 0xAB80, 0xABA0, 0x3D25, 0xABA1, 0xABC0, 0x038C,\n    0xAC40, 0xAC45, 0x3D46, 0xAC46, 0xAC46, 0x21C0, 0xAC47, 0xAC70, 0x3D4C,\n    0xAC71, 0xAC71, 0x2460, 0xAC72, 0xAC7B, 0x3D76, 0xAC7C, 0xAC7C, 0x245C,\n    0xAC7D, 0xAC7E, 0x3D80, 0xAC80, 0xAC8C, 0x3D82, 0xAC8D, 0xAC8D, 0x215D,\n    0xAC8E, 0xAC92, 0x3D8F, 0xAC93, 0xAC93, 0x2225, 0xAC94, 0xAC94, 0x206A,\n    0xAC95, 0xACA0, 0x3D94, 0xAD40, 0xAD48, 0x3DA0, 0xAD49, 0xAD49, 0x2461,\n    0xAD4A, 0xAD5D, 0x3DA9, 0xAD5E, 0xAD5E, 0x245B, 0xAD5F, 0xAD60, 0x3DBD,\n    0xAD61, 0xAD61, 0x2462, 0xAD62, 0xAD67, 0x3DBF, 0xAD68, 0xAD68, 0x1F54,\n    0xAD69, 0xAD73, 0x3DC5, 0xAD74, 0xAD74, 0x245F, 0xAD75, 0xAD7E, 0x3DD0,\n    0xAD80, 0xAD81, 0x3DDA, 0xAD82, 0xAD82, 0x20EC, 0xAD83, 0xAD86, 0x3DDC,\n    0xAD87, 0xAD87, 0x245D, 0xAD88, 0xAD8A, 0x3DE0, 0xAD8B, 0xAD8B, 0x2463,\n    0xAD8C, 0xAD90, 0x3DE3, 0xAD91, 0xAD91, 0x2464, 0xAD92, 0xADA0, 0x3DE8,\n    0xAE40, 0xAE53, 0x3DF7, 0xAE54, 0xAE54, 0x24A5, 0xAE55, 0xAE61, 0x3E0B,\n    0xAE62, 0xAE62, 0x1E70, 0xAE63, 0xAE7E, 0x3E18, 0xAE80, 0xAE80, 0x208F,\n    0xAE81, 0xAE84, 0x3E34, 0xAE85, 0xAE85, 0x1E42, 0xAE86, 0xAE8A, 0x3E38,\n    0xAE8B, 0xAE8B, 0x1F4E, 0xAE8C, 0xAE93, 0x3E3D, 0xAE94, 0xAE94, 0x1EB1,\n    0xAE95, 0xAE9F, 0x3E45, 0xAEA0, 0xAEA0, 0x1E8B, 0xAF40, 0xAF63, 0x3E50,\n    0xAF64, 0xAF64, 0x1FC6, 0xAF65, 0xAF7A, 0x3E74, 0xAF7B, 0xAF7B, 0x25AE,\n    0xAF7C, 0xAF7E, 0x3E8A, 0xAF80, 0xAF81, 0x3E8D, 0xAF82, 0xAF82, 0x1F01,\n    0xAF83, 0xAF83, 0x2200, 0xAF84, 0xAF8D, 0x3E8F, 0xAF8E, 0xAF8E, 0x25B2,\n    0xAF8F, 0xAF8F, 0x1E97, 0xAF90, 0xAF90, 0x3E99, 0xAF91, 0xAF91, 0x20AB,\n    0xAF92, 0xAF9B, 0x3E9A, 0xAF9C, 0xAF9C, 0x25B3, 0xAF9D, 0xAF9E, 0x3EA4,\n    0xAF9F, 0xAF9F, 0x2028, 0xAFA0, 0xAFA0, 0x3EA6, 0xB040, 0xB040, 0x3EA7,\n    0xB041, 0xB042, 0x25AF, 0xB043, 0xB043, 0x3EA8, 0xB044, 0xB044, 0x25B1,\n    0xB045, 0xB04E, 0x3EA9, 0xB04F, 0xB04F, 0x25AC, 0xB050, 0xB053, 0x3EB3,\n    0xB054, 0xB054, 0x1E4E, 0xB055, 0xB056, 0x3EB7, 0xB057, 0xB057, 0x2202,\n    0xB058, 0xB058, 0x25AB, 0xB059, 0xB059, 0x2286, 0xB05A, 0xB05A, 0x3EB9,\n    0xB05B, 0xB05B, 0x25AD, 0xB05C, 0xB05C, 0x3EBA, 0xB05D, 0xB05D, 0x25B6,\n    0xB05E, 0xB05E, 0x3EBB, 0xB05F, 0xB05F, 0x21E3, 0xB060, 0xB061, 0x25B4,\n    0xB062, 0xB062, 0x222F, 0xB063, 0xB063, 0x2165, 0xB064, 0xB064, 0x25B7,\n    0xB065, 0xB06B, 0x3EBC, 0xB06C, 0xB06C, 0x1EE9, 0xB06D, 0xB07C, 0x3EC3,\n    0xB07D, 0xB07D, 0x1E25, 0xB07E, 0xB07E, 0x3ED3, 0xB080, 0xB096, 0x3ED4,\n    0xB097, 0xB097, 0x25C0, 0xB098, 0xB098, 0x3EEB, 0xB099, 0xB099, 0x229A,\n    0xB09A, 0xB0A0, 0x3EEC, 0xB0A1, 0xB0FE, 0x03AC, 0xB140, 0xB14A, 0x3EF3,\n    0xB14B, 0xB14B, 0x226E, 0xB14C, 0xB14C, 0x3EFE, 0xB14D, 0xB14D, 0x1FBD,\n    0xB14E, 0xB14E, 0x3EFF, 0xB14F, 0xB14F, 0x1F84, 0xB150, 0xB150, 0x20B2,\n    0xB151, 0xB151, 0x3F00, 0xB152, 0xB152, 0x2043, 0xB153, 0xB17E, 0x3F01,\n    0xB180, 0xB196, 0x3F2D, 0xB197, 0xB197, 0x2684, 0xB198, 0xB1A0, 0x3F44,\n    0xB1A1, 0xB1FE, 0x040A, 0xB240, 0xB240, 0x3F4D, 0xB241, 0xB241, 0x24EF,\n    0xB242, 0xB266, 0x3F4E, 0xB267, 0xB267, 0x24EE, 0xB268, 0xB26C, 0x3F73,\n    0xB26D, 0xB26D, 0x2074, 0xB26E, 0xB273, 0x3F78, 0xB274, 0xB274, 0x2687,\n    0xB275, 0xB27E, 0x3F7E, 0xB280, 0xB280, 0x24F0, 0xB281, 0xB288, 0x3F88,\n    0xB289, 0xB289, 0x268D, 0xB28A, 0xB299, 0x3F90, 0xB29A, 0xB29A, 0x22A0,\n    0xB29B, 0xB2A0, 0x3FA0, 0xB2A1, 0xB2FE, 0x0468, 0xB340, 0xB342, 0x3FA6,\n    0xB343, 0xB343, 0x1FAB, 0xB344, 0xB36F, 0x3FA9, 0xB370, 0xB370, 0x26A8,\n    0xB371, 0xB37E, 0x3FD5, 0xB380, 0xB387, 0x3FE3, 0xB388, 0xB388, 0x24E9,\n    0xB389, 0xB38B, 0x3FEB, 0xB38C, 0xB38C, 0x24E5, 0xB38D, 0xB38D, 0x3FEE,\n    0xB38E, 0xB38E, 0x21FA, 0xB38F, 0xB3A0, 0x3FEF, 0xB3A1, 0xB3FE, 0x04C6,\n    0xB440, 0xB453, 0x4001, 0xB454, 0xB454, 0x2148, 0xB455, 0xB457, 0x4015,\n    0xB458, 0xB458, 0x24E4, 0xB459, 0xB45D, 0x4018, 0xB45E, 0xB45E, 0x24E6,\n    0xB45F, 0xB45F, 0x20F7, 0xB460, 0xB460, 0x401D, 0xB461, 0xB461, 0x206B,\n    0xB462, 0xB474, 0x401E, 0xB475, 0xB475, 0x22A7, 0xB476, 0xB47D, 0x4031,\n    0xB47E, 0xB47E, 0x24EC, 0xB480, 0xB482, 0x4039, 0xB483, 0xB483, 0x24EB,\n    0xB484, 0xB488, 0x403C, 0xB489, 0xB489, 0x24E3, 0xB48A, 0xB492, 0x4041,\n    0xB493, 0xB493, 0x24EA, 0xB494, 0xB4A0, 0x404A, 0xB4A1, 0xB4FE, 0x0524,\n    0xB540, 0xB540, 0x4057, 0xB541, 0xB541, 0x1E92, 0xB542, 0xB54A, 0x4058,\n    0xB54B, 0xB54B, 0x1E27, 0xB54C, 0xB555, 0x4061, 0xB556, 0xB556, 0x1FE6,\n    0xB557, 0xB559, 0x406B, 0xB55A, 0xB55A, 0x24E7, 0xB55B, 0xB55B, 0x2012,\n    0xB55C, 0xB55C, 0x1EEC, 0xB55D, 0xB560, 0x406E, 0xB561, 0xB561, 0x24E8,\n    0xB562, 0xB57E, 0x4072, 0xB580, 0xB59B, 0x408F, 0xB59C, 0xB59C, 0x1F66,\n    0xB59D, 0xB59D, 0x24DC, 0xB59E, 0xB5A0, 0x40AB, 0xB5A1, 0xB5FE, 0x0582,\n    0xB640, 0xB651, 0x40AE, 0xB652, 0xB652, 0x26A2, 0xB653, 0xB654, 0x40C0,\n    0xB655, 0xB655, 0x24DD, 0xB656, 0xB658, 0x40C2, 0xB659, 0xB659, 0x200E,\n    0xB65A, 0xB65A, 0x40C5, 0xB65B, 0xB65B, 0x24DB, 0xB65C, 0xB65C, 0x1EB8,\n    0xB65D, 0xB67E, 0x40C6, 0xB680, 0xB6A0, 0x40E8, 0xB6A1, 0xB6FE, 0x05E0,\n    0xB740, 0xB74D, 0x4109, 0xB74E, 0xB74E, 0x2295, 0xB74F, 0xB750, 0x4117,\n    0xB751, 0xB751, 0x1E80, 0xB752, 0xB758, 0x4119, 0xB759, 0xB759, 0x2677,\n    0xB75A, 0xB763, 0x4120, 0xB764, 0xB764, 0x2624, 0xB765, 0xB765, 0x1F69,\n    0xB766, 0xB766, 0x222B, 0xB767, 0xB776, 0x412A, 0xB777, 0xB777, 0x257F,\n    0xB778, 0xB778, 0x1F5B, 0xB779, 0xB77E, 0x413A, 0xB780, 0xB780, 0x219B,\n    0xB781, 0xB781, 0x4140, 0xB782, 0xB782, 0x267D, 0xB783, 0xB7A0, 0x4141,\n    0xB7A1, 0xB7FE, 0x063E, 0xB840, 0xB842, 0x415F, 0xB843, 0xB843, 0x21A0,\n    0xB844, 0xB844, 0x2186, 0xB845, 0xB845, 0x4162, 0xB846, 0xB846, 0x20ED,\n    0xB847, 0xB84C, 0x4163, 0xB84D, 0xB84D, 0x25B9, 0xB84E, 0xB850, 0x4169,\n    0xB851, 0xB851, 0x1FEA, 0xB852, 0xB859, 0x416C, 0xB85A, 0xB85A, 0x1EA4,\n    0xB85B, 0xB85B, 0x20E1, 0xB85C, 0xB85C, 0x4174, 0xB85D, 0xB85D, 0x25B8,\n    0xB85E, 0xB85E, 0x2260, 0xB85F, 0xB85F, 0x4175, 0xB860, 0xB860, 0x20E2,\n    0xB861, 0xB876, 0x4176, 0xB877, 0xB877, 0x2141, 0xB878, 0xB87E, 0x418C,\n    0xB880, 0xB881, 0x4193, 0xB882, 0xB882, 0x1FC7, 0xB883, 0xB8A0, 0x4195,\n    0xB8A1, 0xB8FE, 0x069C, 0xB940, 0xB94F, 0x41B3, 0xB950, 0xB950, 0x1E41,\n    0xB951, 0xB960, 0x41C3, 0xB961, 0xB961, 0x25E4, 0xB962, 0xB97A, 0x41D3,\n    0xB97B, 0xB97B, 0x1F86, 0xB97C, 0xB97E, 0x41EC, 0xB980, 0xB99C, 0x41EF,\n    0xB99D, 0xB99D, 0x1FB3, 0xB99E, 0xB99F, 0x420C, 0xB9A0, 0xB9A0, 0x1EEF,\n    0xB9A1, 0xB9FE, 0x06FA, 0xBA40, 0xBA41, 0x420E, 0xBA42, 0xBA42, 0x22A4,\n    0xBA43, 0xBA43, 0x4210, 0xBA44, 0xBA44, 0x25E8, 0xBA45, 0xBA55, 0x4211,\n    0xBA56, 0xBA56, 0x25E3, 0xBA57, 0xBA58, 0x4222, 0xBA59, 0xBA59, 0x2111,\n    0xBA5A, 0xBA5F, 0x4224, 0xBA60, 0xBA60, 0x25E6, 0xBA61, 0xBA69, 0x422A,\n    0xBA6A, 0xBA6A, 0x25E7, 0xBA6B, 0xBA73, 0x4233, 0xBA74, 0xBA74, 0x2041,\n    0xBA75, 0xBA7E, 0x423C, 0xBA80, 0xBA83, 0x4246, 0xBA84, 0xBA84, 0x25EA,\n    0xBA85, 0xBA85, 0x424A, 0xBA86, 0xBA86, 0x1F8F, 0xBA87, 0xBA87, 0x424B,\n    0xBA88, 0xBA88, 0x25EC, 0xBA89, 0xBA8C, 0x424C, 0xBA8D, 0xBA8D, 0x25EB,\n    0xBA8E, 0xBA9D, 0x4250, 0xBA9E, 0xBA9E, 0x20D0, 0xBA9F, 0xBA9F, 0x201D,\n    0xBAA0, 0xBAA0, 0x4260, 0xBAA1, 0xBAFE, 0x0758, 0xBB40, 0xBB40, 0x1FF7,\n    0xBB41, 0xBB48, 0x4261, 0xBB49, 0xBB49, 0x1E8D, 0xBB4A, 0xBB57, 0x4269,\n    0xBB58, 0xBB58, 0x25E9, 0xBB59, 0xBB5A, 0x4277, 0xBB5B, 0xBB5B, 0x25EE,\n    0xBB5C, 0xBB5C, 0x203A, 0xBB5D, 0xBB5F, 0x4279, 0xBB60, 0xBB60, 0x2693,\n    0xBB61, 0xBB64, 0x427C, 0xBB65, 0xBB65, 0x25E5, 0xBB66, 0xBB66, 0x25ED,\n    0xBB67, 0xBB67, 0x4280, 0xBB68, 0xBB68, 0x2009, 0xBB69, 0xBB69, 0x4281,\n    0xBB6A, 0xBB6A, 0x2065, 0xBB6B, 0xBB6D, 0x4282, 0xBB6E, 0xBB6E, 0x26A3,\n    0xBB6F, 0xBB7E, 0x4285, 0xBB80, 0xBBA0, 0x4295, 0xBBA1, 0xBBFE, 0x07B6,\n    0xBC40, 0xBC51, 0x42B6, 0xBC52, 0xBC52, 0x25F5, 0xBC53, 0xBC53, 0x1EFC,\n    0xBC54, 0xBC59, 0x42C8, 0xBC5A, 0xBC5A, 0x2024, 0xBC5B, 0xBC60, 0x42CE,\n    0xBC61, 0xBC61, 0x269B, 0xBC62, 0xBC62, 0x42D4, 0xBC63, 0xBC63, 0x25F3,\n    0xBC64, 0xBC64, 0x42D5, 0xBC65, 0xBC65, 0x22D9, 0xBC66, 0xBC66, 0x42D6,\n    0xBC67, 0xBC67, 0x25F4, 0xBC68, 0xBC68, 0x42D7, 0xBC69, 0xBC69, 0x241B,\n    0xBC6A, 0xBC6C, 0x42D8, 0xBC6D, 0xBC6D, 0x1FC8, 0xBC6E, 0xBC6E, 0x42DB,\n    0xBC6F, 0xBC6F, 0x1F7B, 0xBC70, 0xBC70, 0x42DC, 0xBC71, 0xBC71, 0x241D,\n    0xBC72, 0xBC72, 0x42DD, 0xBC73, 0xBC73, 0x224C, 0xBC74, 0xBC74, 0x1F48,\n    0xBC75, 0xBC75, 0x241C, 0xBC76, 0xBC77, 0x241E, 0xBC78, 0xBC78, 0x20FF,\n    0xBC79, 0xBC79, 0x219A, 0xBC7A, 0xBC7A, 0x42DE, 0xBC7B, 0xBC7B, 0x2091,\n    0xBC7C, 0xBC7D, 0x42DF, 0xBC7E, 0xBC7E, 0x20A7, 0xBC80, 0xBC81, 0x42E1,\n    0xBC82, 0xBC82, 0x2423, 0xBC83, 0xBC83, 0x1E9B, 0xBC84, 0xBC84, 0x2422,\n    0xBC85, 0xBC85, 0x42E3, 0xBC86, 0xBC86, 0x2110, 0xBC87, 0xBC87, 0x42E4,\n    0xBC88, 0xBC88, 0x228D, 0xBC89, 0xBC89, 0x1F71, 0xBC8A, 0xBC8A, 0x1EF8,\n    0xBC8B, 0xBC8B, 0x2421, 0xBC8C, 0xBC8E, 0x42E5, 0xBC8F, 0xBC8F, 0x1EF3,\n    0xBC90, 0xBC99, 0x42E8, 0xBC9A, 0xBC9A, 0x21B1, 0xBC9B, 0xBC9B, 0x2426,\n    0xBC9C, 0xBC9C, 0x2425, 0xBC9D, 0xBC9D, 0x2120, 0xBC9E, 0xBCA0, 0x42F2,\n    0xBCA1, 0xBCFE, 0x0814, 0xBD40, 0xBD41, 0x42F5, 0xBD42, 0xBD42, 0x211A,\n    0xBD43, 0xBD43, 0x2424, 0xBD44, 0xBD44, 0x42F7, 0xBD45, 0xBD45, 0x2428,\n    0xBD46, 0xBD47, 0x42F8, 0xBD48, 0xBD48, 0x242A, 0xBD49, 0xBD49, 0x2429,\n    0xBD4A, 0xBD4A, 0x42FA, 0xBD4B, 0xBD4B, 0x2294, 0xBD4C, 0xBD4C, 0x42FB,\n    0xBD4D, 0xBD4D, 0x22BE, 0xBD4E, 0xBD4E, 0x42FC, 0xBD4F, 0xBD4F, 0x1E31,\n    0xBD50, 0xBD56, 0x42FD, 0xBD57, 0xBD57, 0x242C, 0xBD58, 0xBD58, 0x4304,\n    0xBD59, 0xBD59, 0x1FB5, 0xBD5A, 0xBD65, 0x4305, 0xBD66, 0xBD66, 0x242B,\n    0xBD67, 0xBD67, 0x1FAF, 0xBD68, 0xBD69, 0x4311, 0xBD6A, 0xBD6A, 0x2068,\n    0xBD6B, 0xBD6B, 0x21E4, 0xBD6C, 0xBD6E, 0x4313, 0xBD6F, 0xBD6F, 0x1F21,\n    0xBD70, 0xBD70, 0x4316, 0xBD71, 0xBD71, 0x2101, 0xBD72, 0xBD78, 0x4317,\n    0xBD79, 0xBD79, 0x217C, 0xBD7A, 0xBD7A, 0x214A, 0xBD7B, 0xBD7B, 0x242D,\n    0xBD7C, 0xBD7D, 0x431E, 0xBD7E, 0xBD7E, 0x1FD4, 0xBD80, 0xBD80, 0x4320,\n    0xBD81, 0xBD81, 0x1FD1, 0xBD82, 0xBD88, 0x4321, 0xBD89, 0xBD89, 0x1E33,\n    0xBD8A, 0xBD8A, 0x4328, 0xBD8B, 0xBD8B, 0x242F, 0xBD8C, 0xBD8D, 0x4329,\n    0xBD8E, 0xBD8E, 0x242E, 0xBD8F, 0xBD8F, 0x432B, 0xBD90, 0xBD90, 0x2430,\n    0xBD91, 0xBD91, 0x21DB, 0xBD92, 0xBD96, 0x432C, 0xBD97, 0xBD97, 0x2158,\n    0xBD98, 0xBD9A, 0x4331, 0xBD9B, 0xBD9B, 0x1FC2, 0xBD9C, 0xBDA0, 0x4334,\n    0xBDA1, 0xBDFE, 0x0872, 0xBE40, 0xBE42, 0x4339, 0xBE43, 0xBE43, 0x22B9,\n    0xBE44, 0xBE44, 0x433C, 0xBE45, 0xBE45, 0x2436, 0xBE46, 0xBE48, 0x433D,\n    0xBE49, 0xBE49, 0x1E8E, 0xBE4A, 0xBE4A, 0x2439, 0xBE4B, 0xBE50, 0x4340,\n    0xBE51, 0xBE51, 0x21C5, 0xBE52, 0xBE52, 0x2437, 0xBE53, 0xBE53, 0x2192,\n    0xBE54, 0xBE54, 0x4346, 0xBE55, 0xBE55, 0x243A, 0xBE56, 0xBE56, 0x1F19,\n    0xBE57, 0xBE57, 0x218C, 0xBE58, 0xBE58, 0x1E40, 0xBE59, 0xBE59, 0x22B3,\n    0xBE5A, 0xBE5C, 0x4347, 0xBE5D, 0xBE5D, 0x205F, 0xBE5E, 0xBE5E, 0x2438,\n    0xBE5F, 0xBE5F, 0x2432, 0xBE60, 0xBE60, 0x2274, 0xBE61, 0xBE61, 0x434A,\n    0xBE62, 0xBE62, 0x1E9C, 0xBE63, 0xBE63, 0x2431, 0xBE64, 0xBE64, 0x2085,\n    0xBE65, 0xBE68, 0x434B, 0xBE69, 0xBE69, 0x2435, 0xBE6A, 0xBE6B, 0x434F,\n    0xBE6C, 0xBE6C, 0x243B, 0xBE6D, 0xBE6E, 0x4351, 0xBE6F, 0xBE6F, 0x1FB7,\n    0xBE70, 0xBE70, 0x2433, 0xBE71, 0xBE75, 0x4353, 0xBE76, 0xBE76, 0x2054,\n    0xBE77, 0xBE77, 0x21DE, 0xBE78, 0xBE78, 0x4358, 0xBE79, 0xBE79, 0x2434,\n    0xBE7A, 0xBE7B, 0x4359, 0xBE7C, 0xBE7C, 0x243D, 0xBE7D, 0xBE7D, 0x1F89,\n    0xBE7E, 0xBE7E, 0x243C, 0xBE80, 0xBE82, 0x435B, 0xBE83, 0xBE83, 0x1F6E,\n    0xBE84, 0xBE84, 0x1ED8, 0xBE85, 0xBE85, 0x435E, 0xBE86, 0xBE86, 0x1EBF,\n    0xBE87, 0xBE87, 0x2445, 0xBE88, 0xBE88, 0x435F, 0xBE89, 0xBE89, 0x2249,\n    0xBE8A, 0xBE8B, 0x4360, 0xBE8C, 0xBE8C, 0x2441, 0xBE8D, 0xBE8D, 0x4362,\n    0xBE8E, 0xBE8E, 0x1E47, 0xBE8F, 0xBE8F, 0x1F56, 0xBE90, 0xBE91, 0x4363,\n    0xBE92, 0xBE92, 0x2086, 0xBE93, 0xBE94, 0x4365, 0xBE95, 0xBE95, 0x2196,\n    0xBE96, 0xBE96, 0x4367, 0xBE97, 0xBE97, 0x2443, 0xBE98, 0xBE98, 0x243F,\n    0xBE99, 0xBE99, 0x4368, 0xBE9A, 0xBE9A, 0x2023, 0xBE9B, 0xBE9B, 0x4369,\n    0xBE9C, 0xBE9C, 0x2442, 0xBE9D, 0xBE9E, 0x436A, 0xBE9F, 0xBE9F, 0x243E,\n    0xBEA0, 0xBEA0, 0x436C, 0xBEA1, 0xBEFE, 0x08D0, 0xBF40, 0xBF40, 0x26A6,\n    0xBF41, 0xBF4C, 0x436D, 0xBF4D, 0xBF4D, 0x234E, 0xBF4E, 0xBF4E, 0x2446,\n    0xBF4F, 0xBF4F, 0x244B, 0xBF50, 0xBF50, 0x2444, 0xBF51, 0xBF54, 0x4379,\n    0xBF55, 0xBF55, 0x2427, 0xBF56, 0xBF56, 0x244C, 0xBF57, 0xBF5F, 0x437D,\n    0xBF60, 0xBF60, 0x1F0F, 0xBF61, 0xBF61, 0x4386, 0xBF62, 0xBF62, 0x2447,\n    0xBF63, 0xBF63, 0x2449, 0xBF64, 0xBF64, 0x2448, 0xBF65, 0xBF67, 0x4387,\n    0xBF68, 0xBF68, 0x21C2, 0xBF69, 0xBF6B, 0x438A, 0xBF6C, 0xBF6C, 0x216E,\n    0xBF6D, 0xBF6F, 0x438D, 0xBF70, 0xBF70, 0x1F03, 0xBF71, 0xBF71, 0x4390,\n    0xBF72, 0xBF72, 0x244A, 0xBF73, 0xBF73, 0x215C, 0xBF74, 0xBF75, 0x4391,\n    0xBF76, 0xBF76, 0x22BB, 0xBF77, 0xBF77, 0x2450, 0xBF78, 0xBF78, 0x4393,\n    0xBF79, 0xBF79, 0x2694, 0xBF7A, 0xBF7A, 0x244F, 0xBF7B, 0xBF7B, 0x25F6,\n    0xBF7C, 0xBF7C, 0x2051, 0xBF7D, 0xBF7D, 0x4394, 0xBF7E, 0xBF7E, 0x244E,\n    0xBF80, 0xBF81, 0x4395, 0xBF82, 0xBF82, 0x22BA, 0xBF83, 0xBF83, 0x1F6D,\n    0xBF84, 0xBF88, 0x4397, 0xBF89, 0xBF89, 0x2452, 0xBF8A, 0xBF8A, 0x2451,\n    0xBF8B, 0xBF94, 0x439C, 0xBF95, 0xBF95, 0x2455, 0xBF96, 0xBF96, 0x43A6,\n    0xBF97, 0xBF97, 0x2289, 0xBF98, 0xBF98, 0x2116, 0xBF99, 0xBF9C, 0x43A7,\n    0xBF9D, 0xBF9D, 0x2454, 0xBF9E, 0xBFA0, 0x43AB, 0xBFA1, 0xBFFE, 0x092E,\n    0xC040, 0xC040, 0x20FB, 0xC041, 0xC043, 0x43AE, 0xC044, 0xC044, 0x2440,\n    0xC045, 0xC04A, 0x43B1, 0xC04B, 0xC04B, 0x2126, 0xC04C, 0xC04C, 0x1F61,\n    0xC04D, 0xC04D, 0x269D, 0xC04E, 0xC04E, 0x43B7, 0xC04F, 0xC04F, 0x1F8A,\n    0xC050, 0xC050, 0x2456, 0xC051, 0xC051, 0x2459, 0xC052, 0xC052, 0x2458,\n    0xC053, 0xC054, 0x43B8, 0xC055, 0xC055, 0x1FAE, 0xC056, 0xC05A, 0x43BA,\n    0xC05B, 0xC05B, 0x221A, 0xC05C, 0xC05D, 0x43BF, 0xC05E, 0xC05E, 0x1F7A,\n    0xC05F, 0xC05F, 0x244D, 0xC060, 0xC060, 0x2457, 0xC061, 0xC068, 0x43C1,\n    0xC069, 0xC069, 0x2453, 0xC06A, 0xC06A, 0x43C9, 0xC06B, 0xC06B, 0x2420,\n    0xC06C, 0xC06C, 0x43CA, 0xC06D, 0xC06D, 0x21DF, 0xC06E, 0xC06E, 0x2685,\n    0xC06F, 0xC06F, 0x43CB, 0xC070, 0xC070, 0x1E6E, 0xC071, 0xC073, 0x43CC,\n    0xC074, 0xC074, 0x2224, 0xC075, 0xC075, 0x2670, 0xC076, 0xC076, 0x43CF,\n    0xC077, 0xC077, 0x21BA, 0xC078, 0xC078, 0x43D0, 0xC079, 0xC079, 0x245A,\n    0xC07A, 0xC07B, 0x43D1, 0xC07C, 0xC07C, 0x1FFF, 0xC07D, 0xC07E, 0x43D3,\n    0xC080, 0xC09A, 0x43D5, 0xC09B, 0xC09B, 0x25E2, 0xC09C, 0xC09C, 0x43F0,\n    0xC09D, 0xC09D, 0x269A, 0xC09E, 0xC0A0, 0x43F1, 0xC0A1, 0xC0FE, 0x098C,\n    0xC140, 0xC14F, 0x43F4, 0xC150, 0xC150, 0x1EEA, 0xC151, 0xC153, 0x4404,\n    0xC154, 0xC154, 0x1E2C, 0xC155, 0xC15E, 0x4407, 0xC15F, 0xC15F, 0x2062,\n    0xC160, 0xC160, 0x24F1, 0xC161, 0xC161, 0x4411, 0xC162, 0xC162, 0x24F2,\n    0xC163, 0xC174, 0x4412, 0xC175, 0xC175, 0x25F2, 0xC176, 0xC177, 0x4424,\n    0xC178, 0xC178, 0x2215, 0xC179, 0xC17E, 0x4426, 0xC180, 0xC194, 0x442C,\n    0xC195, 0xC195, 0x21AE, 0xC196, 0xC1A0, 0x4441, 0xC1A1, 0xC1FE, 0x09EA,\n    0xC240, 0xC24D, 0x444C, 0xC24E, 0xC24E, 0x20E0, 0xC24F, 0xC264, 0x445A,\n    0xC265, 0xC265, 0x25C2, 0xC266, 0xC266, 0x4470, 0xC267, 0xC267, 0x25C1,\n    0xC268, 0xC27C, 0x4471, 0xC27D, 0xC27D, 0x2128, 0xC27E, 0xC27E, 0x4486,\n    0xC280, 0xC283, 0x4487, 0xC284, 0xC284, 0x2199, 0xC285, 0xC292, 0x448B,\n    0xC293, 0xC293, 0x2017, 0xC294, 0xC294, 0x1EA0, 0xC295, 0xC295, 0x2125,\n    0xC296, 0xC296, 0x214D, 0xC297, 0xC297, 0x4499, 0xC298, 0xC298, 0x25C4,\n    0xC299, 0xC299, 0x209D, 0xC29A, 0xC29A, 0x228A, 0xC29B, 0xC29B, 0x449A,\n    0xC29C, 0xC29C, 0x25C3, 0xC29D, 0xC29F, 0x449B, 0xC2A0, 0xC2A0, 0x2179,\n    0xC2A1, 0xC2FE, 0x0A48, 0xC340, 0xC340, 0x2038, 0xC341, 0xC342, 0x449E,\n    0xC343, 0xC343, 0x2155, 0xC344, 0xC37A, 0x44A0, 0xC37B, 0xC37B, 0x21D2,\n    0xC37C, 0xC37E, 0x44D7, 0xC380, 0xC383, 0x44DA, 0xC384, 0xC384, 0x24C7,\n    0xC385, 0xC39A, 0x44DE, 0xC39B, 0xC39B, 0x2279, 0xC39C, 0xC3A0, 0x44F4,\n    0xC3A1, 0xC3FE, 0x0AA6, 0xC440, 0xC448, 0x44F9, 0xC449, 0xC449, 0x2123,\n    0xC44A, 0xC44B, 0x4502, 0xC44C, 0xC44C, 0x24C5, 0xC44D, 0xC453, 0x4504,\n    0xC454, 0xC454, 0x24C9, 0xC455, 0xC457, 0x450B, 0xC458, 0xC458, 0x2094,\n    0xC459, 0xC45A, 0x450E, 0xC45B, 0xC45B, 0x2296, 0xC45C, 0xC462, 0x4510,\n    0xC463, 0xC463, 0x1E77, 0xC464, 0xC476, 0x4517, 0xC477, 0xC477, 0x1F06,\n    0xC478, 0xC479, 0x452A, 0xC47A, 0xC47A, 0x1FA5, 0xC47B, 0xC47E, 0x452C,\n    0xC480, 0xC480, 0x4530, 0xC481, 0xC481, 0x2099, 0xC482, 0xC490, 0x4531,\n    0xC491, 0xC491, 0x1EAD, 0xC492, 0xC492, 0x24C8, 0xC493, 0xC493, 0x20A8,\n    0xC494, 0xC497, 0x4540, 0xC498, 0xC498, 0x201F, 0xC499, 0xC499, 0x4544,\n    0xC49A, 0xC49A, 0x20C5, 0xC49B, 0xC49B, 0x4545, 0xC49C, 0xC49C, 0x24CA,\n    0xC49D, 0xC4A0, 0x4546, 0xC4A1, 0xC4FE, 0x0B04, 0xC540, 0xC543, 0x454A,\n    0xC544, 0xC544, 0x1FF0, 0xC545, 0xC545, 0x454E, 0xC546, 0xC546, 0x24C6,\n    0xC547, 0xC54A, 0x454F, 0xC54B, 0xC54B, 0x225D, 0xC54C, 0xC54C, 0x22DE,\n    0xC54D, 0xC551, 0x4553, 0xC552, 0xC552, 0x202C, 0xC553, 0xC55E, 0x4558,\n    0xC55F, 0xC55F, 0x2161, 0xC560, 0xC562, 0x4564, 0xC563, 0xC563, 0x223B,\n    0xC564, 0xC564, 0x21D9, 0xC565, 0xC565, 0x1FCB, 0xC566, 0xC566, 0x1FC9,\n    0xC567, 0xC57E, 0x4567, 0xC580, 0xC592, 0x457F, 0xC593, 0xC593, 0x1E61,\n    0xC594, 0xC59B, 0x4592, 0xC59C, 0xC59C, 0x25EF, 0xC59D, 0xC59D, 0x459A,\n    0xC59E, 0xC59E, 0x1F98, 0xC59F, 0xC5A0, 0x459B, 0xC5A1, 0xC5FE, 0x0B62,\n    0xC640, 0xC640, 0x459D, 0xC641, 0xC641, 0x25F0, 0xC642, 0xC643, 0x459E,\n    0xC644, 0xC644, 0x1F88, 0xC645, 0xC646, 0x45A0, 0xC647, 0xC647, 0x21F8,\n    0xC648, 0xC662, 0x45A2, 0xC663, 0xC663, 0x2322, 0xC664, 0xC671, 0x45BD,\n    0xC672, 0xC672, 0x2336, 0xC673, 0xC67E, 0x45CB, 0xC680, 0xC6A0, 0x45D7,\n    0xC6A1, 0xC6FE, 0x0BC0, 0xC740, 0xC765, 0x45F8, 0xC766, 0xC766, 0x22AB,\n    0xC767, 0xC76E, 0x461E, 0xC76F, 0xC76F, 0x1FBF, 0xC770, 0xC775, 0x4626,\n    0xC776, 0xC776, 0x1F7D, 0xC777, 0xC77A, 0x462C, 0xC77B, 0xC77B, 0x2333,\n    0xC77C, 0xC77E, 0x4630, 0xC780, 0xC7A0, 0x4633, 0xC7A1, 0xC7FE, 0x0C1E,\n    0xC840, 0xC840, 0x4654, 0xC841, 0xC841, 0x1F4D, 0xC842, 0xC84E, 0x4655,\n    0xC84F, 0xC84F, 0x2334, 0xC850, 0xC851, 0x4662, 0xC852, 0xC852, 0x1FF1,\n    0xC853, 0xC865, 0x4664, 0xC866, 0xC866, 0x218B, 0xC867, 0xC86D, 0x4677,\n    0xC86E, 0xC86E, 0x2349, 0xC86F, 0xC87D, 0x467E, 0xC87E, 0xC87E, 0x220B,\n    0xC880, 0xC886, 0x468D, 0xC887, 0xC887, 0x2346, 0xC888, 0xC891, 0x4694,\n    0xC892, 0xC892, 0x2347, 0xC893, 0xC893, 0x469E, 0xC894, 0xC894, 0x2193,\n    0xC895, 0xC898, 0x469F, 0xC899, 0xC899, 0x26A1, 0xC89A, 0xC89C, 0x46A3,\n    0xC89D, 0xC89D, 0x1F62, 0xC89E, 0xC8A0, 0x46A6, 0xC8A1, 0xC8FE, 0x0C7C,\n    0xC940, 0xC94E, 0x46A9, 0xC94F, 0xC94F, 0x234D, 0xC950, 0xC950, 0x2348,\n    0xC951, 0xC96D, 0x46B8, 0xC96E, 0xC96E, 0x1E60, 0xC96F, 0xC96F, 0x46D5,\n    0xC970, 0xC970, 0x2345, 0xC971, 0xC976, 0x46D6, 0xC977, 0xC977, 0x1F12,\n    0xC978, 0xC97E, 0x46DC, 0xC980, 0xC98E, 0x46E3, 0xC98F, 0xC98F, 0x2018,\n    0xC990, 0xC990, 0x2335, 0xC991, 0xC99B, 0x46F2, 0xC99C, 0xC99C, 0x233C,\n    0xC99D, 0xC9A0, 0x46FD, 0xC9A1, 0xC9FE, 0x0CDA, 0xCA40, 0xCA4D, 0x4701,\n    0xCA4E, 0xCA4E, 0x266F, 0xCA4F, 0xCA55, 0x470F, 0xCA56, 0xCA56, 0x2351,\n    0xCA57, 0xCA58, 0x4716, 0xCA59, 0xCA59, 0x1FA0, 0xCA5A, 0xCA5B, 0x4718,\n    0xCA5C, 0xCA5C, 0x2338, 0xCA5D, 0xCA60, 0x471A, 0xCA61, 0xCA61, 0x221B,\n    0xCA62, 0xCA6D, 0x471E, 0xCA6E, 0xCA6E, 0x2342, 0xCA6F, 0xCA71, 0x472A,\n    0xCA72, 0xCA72, 0x234F, 0xCA73, 0xCA76, 0x472D, 0xCA77, 0xCA77, 0x233D,\n    0xCA78, 0xCA7A, 0x4731, 0xCA7B, 0xCA7B, 0x2344, 0xCA7C, 0xCA7C, 0x2331,\n    0xCA7D, 0xCA7D, 0x4734, 0xCA7E, 0xCA7E, 0x234B, 0xCA80, 0xCA80, 0x4735,\n    0xCA81, 0xCA81, 0x233B, 0xCA82, 0xCA88, 0x4736, 0xCA89, 0xCA89, 0x2350,\n    0xCA8A, 0xCA8D, 0x473D, 0xCA8E, 0xCA8E, 0x1EB4, 0xCA8F, 0xCA8F, 0x21A6,\n    0xCA90, 0xCA91, 0x4741, 0xCA92, 0xCA92, 0x21CB, 0xCA93, 0xCA99, 0x4743,\n    0xCA9A, 0xCA9A, 0x2355, 0xCA9B, 0xCAA0, 0x474A, 0xCAA1, 0xCAFE, 0x0D38,\n    0xCB40, 0xCB42, 0x4750, 0xCB43, 0xCB43, 0x233E, 0xCB44, 0xCB44, 0x4753,\n    0xCB45, 0xCB45, 0x1F74, 0xCB46, 0xCB46, 0x4754, 0xCB47, 0xCB47, 0x2330,\n    0xCB48, 0xCB4A, 0x4755, 0xCB4B, 0xCB4B, 0x2680, 0xCB4C, 0xCB4D, 0x4758,\n    0xCB4E, 0xCB4E, 0x20DA, 0xCB4F, 0xCB56, 0x475A, 0xCB57, 0xCB57, 0x234A,\n    0xCB58, 0xCB5C, 0x4762, 0xCB5D, 0xCB5D, 0x1F91, 0xCB5E, 0xCB5E, 0x4767,\n    0xCB5F, 0xCB5F, 0x2107, 0xCB60, 0xCB69, 0x4768, 0xCB6A, 0xCB6A, 0x233F,\n    0xCB6B, 0xCB7A, 0x4772, 0xCB7B, 0xCB7B, 0x1FF4, 0xCB7C, 0xCB7C, 0x2343,\n    0xCB7D, 0xCB7E, 0x4782, 0xCB80, 0xCB86, 0x4784, 0xCB87, 0xCB87, 0x2212,\n    0xCB88, 0xCB8D, 0x478B, 0xCB8E, 0xCB8E, 0x2207, 0xCB8F, 0xCB91, 0x4791,\n    0xCB92, 0xCB92, 0x2359, 0xCB93, 0xCB9B, 0x4794, 0xCB9C, 0xCB9C, 0x2254,\n    0xCB9D, 0xCB9D, 0x479D, 0xCB9E, 0xCB9E, 0x2332, 0xCB9F, 0xCBA0, 0x479E,\n    0xCBA1, 0xCBFE, 0x0D96, 0xCC40, 0xCC40, 0x1E26, 0xCC41, 0xCC41, 0x2357,\n    0xCC42, 0xCC48, 0x47A0, 0xCC49, 0xCC49, 0x2358, 0xCC4A, 0xCC4A, 0x2042,\n    0xCC4B, 0xCC4B, 0x2153, 0xCC4C, 0xCC4E, 0x47A7, 0xCC4F, 0xCC4F, 0x20BB,\n    0xCC50, 0xCC5B, 0x47AA, 0xCC5C, 0xCC5C, 0x235A, 0xCC5D, 0xCC5F, 0x47B6,\n    0xCC60, 0xCC60, 0x2356, 0xCC61, 0xCC63, 0x47B9, 0xCC64, 0xCC64, 0x2337,\n    0xCC65, 0xCC6C, 0x47BC, 0xCC6D, 0xCC6D, 0x1FF9, 0xCC6E, 0xCC78, 0x47C4,\n    0xCC79, 0xCC79, 0x2353, 0xCC7A, 0xCC7C, 0x47CF, 0xCC7D, 0xCC7D, 0x2061,\n    0xCC7E, 0xCC7E, 0x47D2, 0xCC80, 0xCC8D, 0x47D3, 0xCC8E, 0xCC8E, 0x1E95,\n    0xCC8F, 0xCC93, 0x47E1, 0xCC94, 0xCC94, 0x2049, 0xCC95, 0xCC95, 0x47E6,\n    0xCC96, 0xCC96, 0x1F42, 0xCC97, 0xCC9C, 0x47E7, 0xCC9D, 0xCC9D, 0x1FE8,\n    0xCC9E, 0xCCA0, 0x47ED, 0xCCA1, 0xCCFE, 0x0DF4, 0xCD40, 0xCD7E, 0x47F0,\n    0xCD80, 0xCD8F, 0x482F, 0xCD90, 0xCD90, 0x25DA, 0xCD91, 0xCD97, 0x483F,\n    0xCD98, 0xCD98, 0x25D7, 0xCD99, 0xCDA0, 0x4846, 0xCDA1, 0xCDFE, 0x0E52,\n    0xCE40, 0xCE66, 0x484E, 0xCE67, 0xCE67, 0x212E, 0xCE68, 0xCE71, 0x4875,\n    0xCE72, 0xCE72, 0x21B2, 0xCE73, 0xCE7E, 0x487F, 0xCE80, 0xCE80, 0x488B,\n    0xCE81, 0xCE81, 0x219E, 0xCE82, 0xCE86, 0x488C, 0xCE87, 0xCE87, 0x25DC,\n    0xCE88, 0xCE9A, 0x4891, 0xCE9B, 0xCE9B, 0x206C, 0xCE9C, 0xCE9D, 0x48A4,\n    0xCE9E, 0xCE9E, 0x2226, 0xCE9F, 0xCEA0, 0x48A6, 0xCEA1, 0xCEFE, 0x0EB0,\n    0xCF40, 0xCF4D, 0x48A8, 0xCF4E, 0xCF4E, 0x25E0, 0xCF4F, 0xCF54, 0x48B6,\n    0xCF55, 0xCF55, 0x227B, 0xCF56, 0xCF57, 0x48BC, 0xCF58, 0xCF58, 0x25DE,\n    0xCF59, 0xCF5B, 0x48BE, 0xCF5C, 0xCF5C, 0x25E1, 0xCF5D, 0xCF6B, 0x48C1,\n    0xCF6C, 0xCF6C, 0x25D5, 0xCF6D, 0xCF72, 0x48D0, 0xCF73, 0xCF73, 0x1E6B,\n    0xCF74, 0xCF74, 0x48D6, 0xCF75, 0xCF75, 0x25DB, 0xCF76, 0xCF77, 0x48D7,\n    0xCF78, 0xCF78, 0x1E89, 0xCF79, 0xCF7B, 0x48D9, 0xCF7C, 0xCF7C, 0x25D9,\n    0xCF7D, 0xCF7E, 0x48DC, 0xCF80, 0xCF80, 0x48DE, 0xCF81, 0xCF81, 0x2211,\n    0xCF82, 0xCF88, 0x48DF, 0xCF89, 0xCF89, 0x2229, 0xCF8A, 0xCF8A, 0x25D6,\n    0xCF8B, 0xCF92, 0x48E6, 0xCF93, 0xCF93, 0x25DD, 0xCF94, 0xCF94, 0x25DF,\n    0xCF95, 0xCF9D, 0x48EE, 0xCF9E, 0xCF9E, 0x1FEF, 0xCF9F, 0xCF9F, 0x48F7,\n    0xCFA0, 0xCFA0, 0x25D8, 0xCFA1, 0xCFFE, 0x0F0E, 0xD040, 0xD04C, 0x48F8,\n    0xD04D, 0xD04D, 0x1F29, 0xD04E, 0xD050, 0x4905, 0xD051, 0xD051, 0x1E5B,\n    0xD052, 0xD054, 0x4908, 0xD055, 0xD055, 0x2076, 0xD056, 0xD05B, 0x490B,\n    0xD05C, 0xD05C, 0x2297, 0xD05D, 0xD05F, 0x4911, 0xD060, 0xD060, 0x2690,\n    0xD061, 0xD066, 0x4914, 0xD067, 0xD067, 0x213F, 0xD068, 0xD06B, 0x491A,\n    0xD06C, 0xD06C, 0x2198, 0xD06D, 0xD06D, 0x491E, 0xD06E, 0xD06E, 0x1E88,\n    0xD06F, 0xD07C, 0x491F, 0xD07D, 0xD07D, 0x228C, 0xD07E, 0xD07E, 0x492D,\n    0xD080, 0xD0A0, 0x492E, 0xD0A1, 0xD0FE, 0x0F6C, 0xD140, 0xD154, 0x494F,\n    0xD155, 0xD155, 0x25F1, 0xD156, 0xD158, 0x4964, 0xD159, 0xD159, 0x200C,\n    0xD15A, 0xD160, 0x4967, 0xD161, 0xD161, 0x1E58, 0xD162, 0xD162, 0x22AC,\n    0xD163, 0xD174, 0x496E, 0xD175, 0xD175, 0x26A7, 0xD176, 0xD17C, 0x4980,\n    0xD17D, 0xD17D, 0x2676, 0xD17E, 0xD17E, 0x4987, 0xD180, 0xD19C, 0x4988,\n    0xD19D, 0xD19D, 0x1FE1, 0xD19E, 0xD19E, 0x25BB, 0xD19F, 0xD1A0, 0x49A5,\n    0xD1A1, 0xD1FE, 0x0FCA, 0xD240, 0xD240, 0x25BE, 0xD241, 0xD242, 0x49A7,\n    0xD243, 0xD243, 0x22DD, 0xD244, 0xD24C, 0x49A9, 0xD24D, 0xD24D, 0x25BD,\n    0xD24E, 0xD25B, 0x49B2, 0xD25C, 0xD25C, 0x1E2A, 0xD25D, 0xD262, 0x49C0,\n    0xD263, 0xD263, 0x25BC, 0xD264, 0xD264, 0x25BA, 0xD265, 0xD267, 0x49C6,\n    0xD268, 0xD268, 0x25BF, 0xD269, 0xD26C, 0x49C9, 0xD26D, 0xD26D, 0x2187,\n    0xD26E, 0xD26E, 0x49CD, 0xD26F, 0xD26F, 0x266B, 0xD270, 0xD271, 0x49CE,\n    0xD272, 0xD272, 0x1E7F, 0xD273, 0xD274, 0x49D0, 0xD275, 0xD275, 0x21AD,\n    0xD276, 0xD27E, 0x49D2, 0xD280, 0xD289, 0x49DB, 0xD28A, 0xD28A, 0x1F96,\n    0xD28B, 0xD28D, 0x49E5, 0xD28E, 0xD28E, 0x1F32, 0xD28F, 0xD291, 0x49E8,\n    0xD292, 0xD292, 0x2084, 0xD293, 0xD294, 0x49EB, 0xD295, 0xD295, 0x2136,\n    0xD296, 0xD296, 0x49ED, 0xD297, 0xD297, 0x24B8, 0xD298, 0xD29F, 0x49EE,\n    0xD2A0, 0xD2A0, 0x24BA, 0xD2A1, 0xD2FE, 0x1028, 0xD340, 0xD343, 0x49F6,\n    0xD344, 0xD344, 0x24BC, 0xD345, 0xD347, 0x49FA, 0xD348, 0xD348, 0x20E4,\n    0xD349, 0xD349, 0x49FD, 0xD34A, 0xD34A, 0x24B9, 0xD34B, 0xD34C, 0x49FE,\n    0xD34D, 0xD34D, 0x24BD, 0xD34E, 0xD34F, 0x4A00, 0xD350, 0xD350, 0x24BE,\n    0xD351, 0xD354, 0x4A02, 0xD355, 0xD355, 0x24BF, 0xD356, 0xD357, 0x4A06,\n    0xD358, 0xD358, 0x1FD2, 0xD359, 0xD35A, 0x4A08, 0xD35B, 0xD35B, 0x1FFD,\n    0xD35C, 0xD35C, 0x4A0A, 0xD35D, 0xD35D, 0x24BB, 0xD35E, 0xD35E, 0x1F2D,\n    0xD35F, 0xD377, 0x4A0B, 0xD378, 0xD378, 0x2609, 0xD379, 0xD379, 0x4A24,\n    0xD37A, 0xD37A, 0x260A, 0xD37B, 0xD37B, 0x4A25, 0xD37C, 0xD37C, 0x1E94,\n    0xD37D, 0xD37E, 0x4A26, 0xD380, 0xD384, 0x4A28, 0xD385, 0xD385, 0x22DF,\n    0xD386, 0xD386, 0x1ECB, 0xD387, 0xD387, 0x1F0D, 0xD388, 0xD38A, 0x4A2D,\n    0xD38B, 0xD38B, 0x1F77, 0xD38C, 0xD38C, 0x4A30, 0xD38D, 0xD38D, 0x21EB,\n    0xD38E, 0xD38E, 0x4A31, 0xD38F, 0xD38F, 0x22E1, 0xD390, 0xD390, 0x4A32,\n    0xD391, 0xD391, 0x216F, 0xD392, 0xD392, 0x4A33, 0xD393, 0xD393, 0x22E0,\n    0xD394, 0xD395, 0x4A34, 0xD396, 0xD396, 0x21EA, 0xD397, 0xD397, 0x4A36,\n    0xD398, 0xD398, 0x22E2, 0xD399, 0xD399, 0x20CB, 0xD39A, 0xD39A, 0x4A37,\n    0xD39B, 0xD39B, 0x1F78, 0xD39C, 0xD39D, 0x4A38, 0xD39E, 0xD39E, 0x1EE2,\n    0xD39F, 0xD39F, 0x4A3A, 0xD3A0, 0xD3A0, 0x21F2, 0xD3A1, 0xD3FE, 0x1086,\n    0xD440, 0xD440, 0x4A3B, 0xD441, 0xD441, 0x2150, 0xD442, 0xD444, 0x4A3C,\n    0xD445, 0xD445, 0x1FD3, 0xD446, 0xD446, 0x4A3F, 0xD447, 0xD447, 0x22E5,\n    0xD448, 0xD44B, 0x4A40, 0xD44C, 0xD44C, 0x1EF2, 0xD44D, 0xD44E, 0x4A44,\n    0xD44F, 0xD44F, 0x211F, 0xD450, 0xD452, 0x4A46, 0xD453, 0xD453, 0x21DD,\n    0xD454, 0xD455, 0x4A49, 0xD456, 0xD456, 0x2154, 0xD457, 0xD457, 0x4A4B,\n    0xD458, 0xD458, 0x22E7, 0xD459, 0xD45B, 0x4A4C, 0xD45C, 0xD45C, 0x2282,\n    0xD45D, 0xD461, 0x4A4F, 0xD462, 0xD462, 0x22E6, 0xD463, 0xD466, 0x4A54,\n    0xD467, 0xD467, 0x22E8, 0xD468, 0xD46D, 0x4A58, 0xD46E, 0xD46E, 0x22E4,\n    0xD46F, 0xD46F, 0x4A5E, 0xD470, 0xD470, 0x226A, 0xD471, 0xD471, 0x4A5F,\n    0xD472, 0xD472, 0x22EB, 0xD473, 0xD473, 0x4A60, 0xD474, 0xD474, 0x22E9,\n    0xD475, 0xD475, 0x20BD, 0xD476, 0xD477, 0x4A61, 0xD478, 0xD478, 0x22EA,\n    0xD479, 0xD47A, 0x4A63, 0xD47B, 0xD47B, 0x22BD, 0xD47C, 0xD47D, 0x4A65,\n    0xD47E, 0xD47E, 0x1E9E, 0xD480, 0xD481, 0x4A67, 0xD482, 0xD482, 0x22F6,\n    0xD483, 0xD483, 0x21E7, 0xD484, 0xD484, 0x2216, 0xD485, 0xD486, 0x4A69,\n    0xD487, 0xD487, 0x2137, 0xD488, 0xD489, 0x4A6B, 0xD48A, 0xD48A, 0x212C,\n    0xD48B, 0xD48B, 0x4A6D, 0xD48C, 0xD48C, 0x1E68, 0xD48D, 0xD48D, 0x22F2,\n    0xD48E, 0xD48E, 0x1F37, 0xD48F, 0xD48F, 0x22F3, 0xD490, 0xD490, 0x4A6E,\n    0xD491, 0xD491, 0x22EF, 0xD492, 0xD492, 0x1F50, 0xD493, 0xD493, 0x1F10,\n    0xD494, 0xD494, 0x21C8, 0xD495, 0xD495, 0x4A6F, 0xD496, 0xD496, 0x22F1,\n    0xD497, 0xD49B, 0x4A70, 0xD49C, 0xD49C, 0x22F0, 0xD49D, 0xD49E, 0x4A75,\n    0xD49F, 0xD49F, 0x22EE, 0xD4A0, 0xD4A0, 0x4A77, 0xD4A1, 0xD4FE, 0x10E4,\n    0xD540, 0xD542, 0x4A78, 0xD543, 0xD543, 0x22ED, 0xD544, 0xD544, 0x229E,\n    0xD545, 0xD545, 0x22EC, 0xD546, 0xD546, 0x1FE2, 0xD547, 0xD549, 0x4A7B,\n    0xD54A, 0xD54A, 0x20FE, 0xD54B, 0xD54D, 0x4A7E, 0xD54E, 0xD54F, 0x22F9,\n    0xD550, 0xD550, 0x4A81, 0xD551, 0xD551, 0x1EAF, 0xD552, 0xD553, 0x4A82,\n    0xD554, 0xD554, 0x2236, 0xD555, 0xD555, 0x4A84, 0xD556, 0xD556, 0x22F7,\n    0xD557, 0xD559, 0x4A85, 0xD55A, 0xD55A, 0x223D, 0xD55B, 0xD55B, 0x4A88,\n    0xD55C, 0xD55C, 0x1E82, 0xD55D, 0xD55D, 0x1FB6, 0xD55E, 0xD55E, 0x4A89,\n    0xD55F, 0xD55F, 0x21A4, 0xD560, 0xD560, 0x21AA, 0xD561, 0xD561, 0x22F8,\n    0xD562, 0xD562, 0x2151, 0xD563, 0xD563, 0x4A8A, 0xD564, 0xD564, 0x1F60,\n    0xD565, 0xD567, 0x4A8B, 0xD568, 0xD568, 0x2147, 0xD569, 0xD56B, 0x4A8E,\n    0xD56C, 0xD56C, 0x2145, 0xD56D, 0xD56D, 0x4A91, 0xD56E, 0xD56E, 0x1FDC,\n    0xD56F, 0xD571, 0x4A92, 0xD572, 0xD572, 0x2301, 0xD573, 0xD574, 0x4A95,\n    0xD575, 0xD575, 0x1EF5, 0xD576, 0xD577, 0x4A97, 0xD578, 0xD578, 0x2218,\n    0xD579, 0xD57A, 0x4A99, 0xD57B, 0xD57B, 0x1EC6, 0xD57C, 0xD57D, 0x4A9B,\n    0xD57E, 0xD57E, 0x2300, 0xD580, 0xD580, 0x4A9D, 0xD581, 0xD581, 0x22B4,\n    0xD582, 0xD583, 0x4A9E, 0xD584, 0xD584, 0x2169, 0xD585, 0xD585, 0x4AA0,\n    0xD586, 0xD586, 0x22FD, 0xD587, 0xD587, 0x4AA1, 0xD588, 0xD588, 0x20EA,\n    0xD589, 0xD589, 0x4AA2, 0xD58A, 0xD58A, 0x22F4, 0xD58B, 0xD58B, 0x4AA3,\n    0xD58C, 0xD58C, 0x22FB, 0xD58D, 0xD58D, 0x4AA4, 0xD58E, 0xD58E, 0x22FC,\n    0xD58F, 0xD58F, 0x2027, 0xD590, 0xD592, 0x4AA5, 0xD593, 0xD593, 0x2060,\n    0xD594, 0xD594, 0x22FF, 0xD595, 0xD597, 0x4AA8, 0xD598, 0xD598, 0x22FE,\n    0xD599, 0xD599, 0x1EC7, 0xD59A, 0xD59A, 0x4AAB, 0xD59B, 0xD59B, 0x230C,\n    0xD59C, 0xD59E, 0x4AAC, 0xD59F, 0xD59F, 0x22F5, 0xD5A0, 0xD5A0, 0x4AAF,\n    0xD5A1, 0xD5FE, 0x1142, 0xD640, 0xD640, 0x2306, 0xD641, 0xD641, 0x4AB0,\n    0xD642, 0xD642, 0x230A, 0xD643, 0xD643, 0x21D3, 0xD644, 0xD646, 0x4AB1,\n    0xD647, 0xD647, 0x2303, 0xD648, 0xD648, 0x4AB4, 0xD649, 0xD649, 0x2307,\n    0xD64A, 0xD64A, 0x230B, 0xD64B, 0xD64C, 0x4AB5, 0xD64D, 0xD64D, 0x1F5F,\n    0xD64E, 0xD64E, 0x4AB7, 0xD64F, 0xD64F, 0x2309, 0xD650, 0xD651, 0x4AB8,\n    0xD652, 0xD652, 0x2302, 0xD653, 0xD653, 0x1F04, 0xD654, 0xD654, 0x229D,\n    0xD655, 0xD655, 0x4ABA, 0xD656, 0xD656, 0x21FB, 0xD657, 0xD657, 0x4ABB,\n    0xD658, 0xD658, 0x2308, 0xD659, 0xD659, 0x4ABC, 0xD65A, 0xD65A, 0x20AC,\n    0xD65B, 0xD65B, 0x4ABD, 0xD65C, 0xD65C, 0x208E, 0xD65D, 0xD65D, 0x2305,\n    0xD65E, 0xD65E, 0x2197, 0xD65F, 0xD65F, 0x4ABE, 0xD660, 0xD660, 0x2171,\n    0xD661, 0xD661, 0x2298, 0xD662, 0xD664, 0x4ABF, 0xD665, 0xD665, 0x1F57,\n    0xD666, 0xD668, 0x4AC2, 0xD669, 0xD669, 0x2082, 0xD66A, 0xD66A, 0x4AC5,\n    0xD66B, 0xD66B, 0x2311, 0xD66C, 0xD66E, 0x4AC6, 0xD66F, 0xD66F, 0x2304,\n    0xD670, 0xD670, 0x4AC9, 0xD671, 0xD671, 0x230F, 0xD672, 0xD672, 0x1E35,\n    0xD673, 0xD673, 0x4ACA, 0xD674, 0xD674, 0x20D1, 0xD675, 0xD675, 0x2310,\n    0xD676, 0xD676, 0x1FA3, 0xD677, 0xD677, 0x4ACB, 0xD678, 0xD678, 0x21D6,\n    0xD679, 0xD67B, 0x4ACC, 0xD67C, 0xD67C, 0x2206, 0xD67D, 0xD67E, 0x4ACF,\n    0xD680, 0xD682, 0x4AD1, 0xD683, 0xD683, 0x230D, 0xD684, 0xD685, 0x4AD4,\n    0xD686, 0xD686, 0x2312, 0xD687, 0xD687, 0x208D, 0xD688, 0xD688, 0x2313,\n    0xD689, 0xD68D, 0x4AD6, 0xD68E, 0xD68E, 0x22E3, 0xD68F, 0xD693, 0x4ADB,\n    0xD694, 0xD694, 0x1FBA, 0xD695, 0xD698, 0x4AE0, 0xD699, 0xD699, 0x2078,\n    0xD69A, 0xD6A0, 0x4AE4, 0xD6A1, 0xD6FE, 0x11A0, 0xD740, 0xD742, 0x4AEB,\n    0xD743, 0xD743, 0x2288, 0xD744, 0xD747, 0x4AEE, 0xD748, 0xD748, 0x2316,\n    0xD749, 0xD749, 0x1F6B, 0xD74A, 0xD74F, 0x4AF2, 0xD750, 0xD750, 0x2314,\n    0xD751, 0xD751, 0x4AF8, 0xD752, 0xD752, 0x2130, 0xD753, 0xD753, 0x2315,\n    0xD754, 0xD754, 0x2168, 0xD755, 0xD755, 0x4AF9, 0xD756, 0xD756, 0x20C4,\n    0xD757, 0xD763, 0x4AFA, 0xD764, 0xD764, 0x2318, 0xD765, 0xD766, 0x4B07,\n    0xD767, 0xD767, 0x2219, 0xD768, 0xD768, 0x2217, 0xD769, 0xD76B, 0x4B09,\n    0xD76C, 0xD76C, 0x20D5, 0xD76D, 0xD76E, 0x4B0C, 0xD76F, 0xD76F, 0x1F4A,\n    0xD770, 0xD774, 0x4B0E, 0xD775, 0xD775, 0x2240, 0xD776, 0xD777, 0x4B13,\n    0xD778, 0xD778, 0x1ED3, 0xD779, 0xD77E, 0x4B15, 0xD780, 0xD782, 0x4B1B,\n    0xD783, 0xD783, 0x1E49, 0xD784, 0xD786, 0x4B1E, 0xD787, 0xD787, 0x261B,\n    0xD788, 0xD78A, 0x4B21, 0xD78B, 0xD78B, 0x1E6D, 0xD78C, 0xD78C, 0x20F8,\n    0xD78D, 0xD78D, 0x4B24, 0xD78E, 0xD78E, 0x1FFB, 0xD78F, 0xD78F, 0x2319,\n    0xD790, 0xD794, 0x4B25, 0xD795, 0xD795, 0x230E, 0xD796, 0xD796, 0x4B2A,\n    0xD797, 0xD797, 0x2317, 0xD798, 0xD7A0, 0x4B2B, 0xD7A1, 0xD7F9, 0x11FE,\n    0xD840, 0xD84C, 0x4B34, 0xD84D, 0xD84D, 0x20C8, 0xD84E, 0xD852, 0x4B41,\n    0xD853, 0xD853, 0x1EFD, 0xD854, 0xD87E, 0x4B46, 0xD880, 0xD88F, 0x4B71,\n    0xD890, 0xD890, 0x1E3B, 0xD891, 0xD891, 0x227F, 0xD892, 0xD892, 0x4B81,\n    0xD893, 0xD893, 0x1F0C, 0xD894, 0xD894, 0x1E59, 0xD895, 0xD895, 0x1F24,\n    0xD896, 0xD899, 0x4B82, 0xD89A, 0xD89A, 0x20BA, 0xD89B, 0xD89B, 0x1F65,\n    0xD89C, 0xD89C, 0x1EF0, 0xD89D, 0xD89D, 0x2164, 0xD89E, 0xD89E, 0x1F30,\n    0xD89F, 0xD89F, 0x2261, 0xD8A0, 0xD8A0, 0x4B86, 0xD8A1, 0xD8FE, 0x1257,\n    0xD940, 0xD940, 0x4B87, 0xD941, 0xD941, 0x22A2, 0xD942, 0xD942, 0x24AB,\n    0xD943, 0xD943, 0x4B88, 0xD944, 0xD944, 0x24AF, 0xD945, 0xD945, 0x1EE8,\n    0xD946, 0xD946, 0x1F39, 0xD947, 0xD947, 0x4B89, 0xD948, 0xD948, 0x1E48,\n    0xD949, 0xD949, 0x2070, 0xD94A, 0xD94A, 0x1EA8, 0xD94B, 0xD94B, 0x4B8A,\n    0xD94C, 0xD94C, 0x24AC, 0xD94D, 0xD94D, 0x1EF7, 0xD94E, 0xD94E, 0x2176,\n    0xD94F, 0xD94F, 0x24AD, 0xD950, 0xD950, 0x4B8B, 0xD951, 0xD951, 0x207B,\n    0xD952, 0xD952, 0x1F45, 0xD953, 0xD953, 0x24AA, 0xD954, 0xD954, 0x204B,\n    0xD955, 0xD955, 0x202F, 0xD956, 0xD956, 0x1F5A, 0xD957, 0xD957, 0x24B0,\n    0xD958, 0xD958, 0x4B8C, 0xD959, 0xD959, 0x22B7, 0xD95A, 0xD95A, 0x1F7F,\n    0xD95B, 0xD95B, 0x4B8D, 0xD95C, 0xD95C, 0x2265, 0xD95D, 0xD962, 0x4B8E,\n    0xD963, 0xD963, 0x24B2, 0xD964, 0xD964, 0x211B, 0xD965, 0xD965, 0x1E51,\n    0xD966, 0xD966, 0x4B94, 0xD967, 0xD967, 0x24B4, 0xD968, 0xD96B, 0x4B95,\n    0xD96C, 0xD96C, 0x24B3, 0xD96D, 0xD96D, 0x4B99, 0xD96E, 0xD96E, 0x1E9F,\n    0xD96F, 0xD96F, 0x4B9A, 0xD970, 0xD970, 0x2118, 0xD971, 0xD971, 0x4B9B,\n    0xD972, 0xD972, 0x20B4, 0xD973, 0xD973, 0x23AF, 0xD974, 0xD974, 0x21BB,\n    0xD975, 0xD975, 0x2072, 0xD976, 0xD976, 0x1F95, 0xD977, 0xD977, 0x4B9C,\n    0xD978, 0xD978, 0x1F0A, 0xD979, 0xD979, 0x24B6, 0xD97A, 0xD97B, 0x4B9D,\n    0xD97C, 0xD97C, 0x2291, 0xD97D, 0xD97D, 0x24B5, 0xD97E, 0xD97E, 0x2278,\n    0xD980, 0xD980, 0x1ED4, 0xD981, 0xD986, 0x4B9F, 0xD987, 0xD987, 0x1FF3,\n    0xD988, 0xD98C, 0x4BA5, 0xD98D, 0xD98D, 0x22A9, 0xD98E, 0xD98E, 0x24B7,\n    0xD98F, 0xD98F, 0x1F28, 0xD990, 0xD990, 0x2109, 0xD991, 0xD991, 0x22C7,\n    0xD992, 0xD996, 0x4BAA, 0xD997, 0xD997, 0x24AE, 0xD998, 0xD998, 0x22B1,\n    0xD999, 0xD99A, 0x4BAF, 0xD99B, 0xD99B, 0x2266, 0xD99C, 0xD99C, 0x4BB1,\n    0xD99D, 0xD99D, 0x225B, 0xD99E, 0xD99E, 0x22C4, 0xD99F, 0xD99F, 0x4BB2,\n    0xD9A0, 0xD9A0, 0x2115, 0xD9A1, 0xD9FE, 0x12B5, 0xDA40, 0xDA40, 0x4BB3,\n    0xDA41, 0xDA41, 0x222A, 0xDA42, 0xDA42, 0x24B1, 0xDA43, 0xDA47, 0x4BB4,\n    0xDA48, 0xDA48, 0x213D, 0xDA49, 0xDA4C, 0x4BB9, 0xDA4D, 0xDA4D, 0x1F15,\n    0xDA4E, 0xDA4E, 0x225C, 0xDA4F, 0xDA72, 0x4BBD, 0xDA73, 0xDA73, 0x1F14,\n    0xDA74, 0xDA76, 0x4BE1, 0xDA77, 0xDA77, 0x227A, 0xDA78, 0xDA7E, 0x4BE4,\n    0xDA80, 0xDA84, 0x4BEB, 0xDA85, 0xDA85, 0x20EE, 0xDA86, 0xDA8D, 0x4BF0,\n    0xDA8E, 0xDA8E, 0x25F8, 0xDA8F, 0xDAA0, 0x4BF8, 0xDAA1, 0xDAFE, 0x1313,\n    0xDB40, 0xDB5F, 0x4C0A, 0xDB60, 0xDB60, 0x1F94, 0xDB61, 0xDB77, 0x4C2A,\n    0xDB78, 0xDB78, 0x2230, 0xDB79, 0xDB7E, 0x4C41, 0xDB80, 0xDB83, 0x4C47,\n    0xDB84, 0xDB84, 0x25FD, 0xDB85, 0xDB8A, 0x4C4B, 0xDB8B, 0xDB8B, 0x2600,\n    0xDB8C, 0xDB97, 0x4C51, 0xDB98, 0xDB98, 0x2606, 0xDB99, 0xDBA0, 0x4C5D,\n    0xDBA1, 0xDBFE, 0x1371, 0xDC40, 0xDC44, 0x4C65, 0xDC45, 0xDC45, 0x25FF,\n    0xDC46, 0xDC4E, 0x4C6A, 0xDC4F, 0xDC4F, 0x25FC, 0xDC50, 0xDC50, 0x1E8C,\n    0xDC51, 0xDC51, 0x2602, 0xDC52, 0xDC52, 0x4C73, 0xDC53, 0xDC53, 0x224D,\n    0xDC54, 0xDC54, 0x4C74, 0xDC55, 0xDC55, 0x2604, 0xDC56, 0xDC56, 0x25FE,\n    0xDC57, 0xDC57, 0x2603, 0xDC58, 0xDC5C, 0x4C75, 0xDC5D, 0xDC5D, 0x2601,\n    0xDC5E, 0xDC61, 0x4C7A, 0xDC62, 0xDC62, 0x2605, 0xDC63, 0xDC65, 0x4C7E,\n    0xDC66, 0xDC66, 0x1EA3, 0xDC67, 0xDC67, 0x2608, 0xDC68, 0xDC6A, 0x4C81,\n    0xDC6B, 0xDC6B, 0x2607, 0xDC6C, 0xDC7B, 0x4C84, 0xDC7C, 0xDC7C, 0x20F0,\n    0xDC7D, 0xDC7E, 0x4C94, 0xDC80, 0xDC86, 0x4C96, 0xDC87, 0xDC87, 0x1E7B,\n    0xDC88, 0xDC88, 0x2267, 0xDC89, 0xDC89, 0x1F36, 0xDC8A, 0xDC8A, 0x1FD6,\n    0xDC8B, 0xDC8D, 0x4C9D, 0xDC8E, 0xDC8E, 0x21E0, 0xDC8F, 0xDC8F, 0x4CA0,\n    0xDC90, 0xDC90, 0x248C, 0xDC91, 0xDC96, 0x4CA1, 0xDC97, 0xDC97, 0x248D,\n    0xDC98, 0xDC9A, 0x4CA7, 0xDC9B, 0xDC9B, 0x2102, 0xDC9C, 0xDC9F, 0x4CAA,\n    0xDCA0, 0xDCA0, 0x2494, 0xDCA1, 0xDCFE, 0x13CF, 0xDD40, 0xDD45, 0x4CAE,\n    0xDD46, 0xDD46, 0x2493, 0xDD47, 0xDD4C, 0x4CB4, 0xDD4D, 0xDD4D, 0x248E,\n    0xDD4E, 0xDD52, 0x4CBA, 0xDD53, 0xDD53, 0x2299, 0xDD54, 0xDD54, 0x2491,\n    0xDD55, 0xDD55, 0x2496, 0xDD56, 0xDD56, 0x248F, 0xDD57, 0xDD57, 0x2492,\n    0xDD58, 0xDD58, 0x4CBF, 0xDD59, 0xDD59, 0x2497, 0xDD5A, 0xDD5D, 0x4CC0,\n    0xDD5E, 0xDD5E, 0x1FB1, 0xDD5F, 0xDD5F, 0x4CC4, 0xDD60, 0xDD60, 0x249A,\n    0xDD61, 0xDD61, 0x4CC5, 0xDD62, 0xDD62, 0x2499, 0xDD63, 0xDD63, 0x4CC6,\n    0xDD64, 0xDD64, 0x2258, 0xDD65, 0xDD65, 0x2498, 0xDD66, 0xDD6C, 0x4CC7,\n    0xDD6D, 0xDD6D, 0x249B, 0xDD6E, 0xDD6E, 0x4CCE, 0xDD6F, 0xDD6F, 0x1F09,\n    0xDD70, 0xDD70, 0x20E6, 0xDD71, 0xDD75, 0x4CCF, 0xDD76, 0xDD76, 0x2026,\n    0xDD77, 0xDD77, 0x249F, 0xDD78, 0xDD78, 0x1F59, 0xDD79, 0xDD7A, 0x249D,\n    0xDD7B, 0xDD7E, 0x4CD4, 0xDD80, 0xDD80, 0x4CD8, 0xDD81, 0xDD81, 0x1F3B,\n    0xDD82, 0xDD82, 0x249C, 0xDD83, 0xDD84, 0x4CD9, 0xDD85, 0xDD85, 0x1E3A,\n    0xDD86, 0xDD86, 0x205B, 0xDD87, 0xDD8A, 0x4CDB, 0xDD8B, 0xDD8B, 0x1F70,\n    0xDD8C, 0xDD8E, 0x4CDF, 0xDD8F, 0xDD8F, 0x24A0, 0xDD90, 0xDD93, 0x4CE2,\n    0xDD94, 0xDD94, 0x213B, 0xDD95, 0xDD96, 0x4CE6, 0xDD97, 0xDD97, 0x1F07,\n    0xDD98, 0xDD99, 0x4CE8, 0xDD9A, 0xDD9A, 0x2270, 0xDD9B, 0xDD9B, 0x2237,\n    0xDD9C, 0xDD9D, 0x4CEA, 0xDD9E, 0xDD9E, 0x24D2, 0xDD9F, 0xDD9F, 0x4CEC,\n    0xDDA0, 0xDDA0, 0x21B3, 0xDDA1, 0xDDFE, 0x142D, 0xDE40, 0xDE40, 0x2245,\n    0xDE41, 0xDE41, 0x24A1, 0xDE42, 0xDE43, 0x4CED, 0xDE44, 0xDE44, 0x22A8,\n    0xDE45, 0xDE47, 0x4CEF, 0xDE48, 0xDE48, 0x227C, 0xDE49, 0xDE49, 0x1FB0,\n    0xDE4A, 0xDE4E, 0x4CF2, 0xDE4F, 0xDE4F, 0x24A2, 0xDE50, 0xDE59, 0x4CF7,\n    0xDE5A, 0xDE5A, 0x1F46, 0xDE5B, 0xDE5B, 0x4D01, 0xDE5C, 0xDE5C, 0x2380,\n    0xDE5D, 0xDE5D, 0x2495, 0xDE5E, 0xDE5E, 0x4D02, 0xDE5F, 0xDE5F, 0x2490,\n    0xDE60, 0xDE6A, 0x4D03, 0xDE6B, 0xDE6B, 0x1E30, 0xDE6C, 0xDE6E, 0x4D0E,\n    0xDE6F, 0xDE6F, 0x1E9D, 0xDE70, 0xDE70, 0x1E4B, 0xDE71, 0xDE71, 0x1E4A,\n    0xDE72, 0xDE72, 0x20AA, 0xDE73, 0xDE7E, 0x4D11, 0xDE80, 0xDE91, 0x4D1D,\n    0xDE92, 0xDE92, 0x267B, 0xDE93, 0xDE9E, 0x4D2F, 0xDE9F, 0xDE9F, 0x23F2,\n    0xDEA0, 0xDEA0, 0x4D3B, 0xDEA1, 0xDEFE, 0x148B, 0xDF40, 0xDF40, 0x227E,\n    0xDF41, 0xDF41, 0x4D3C, 0xDF42, 0xDF42, 0x2019, 0xDF43, 0xDF4C, 0x4D3D,\n    0xDF4D, 0xDF4D, 0x1FBB, 0xDF4E, 0xDF5B, 0x4D47, 0xDF5C, 0xDF5C, 0x2253,\n    0xDF5D, 0xDF5D, 0x4D55, 0xDF5E, 0xDF5E, 0x1F3E, 0xDF5F, 0xDF5F, 0x1EA6,\n    0xDF60, 0xDF60, 0x218E, 0xDF61, 0xDF63, 0x4D56, 0xDF64, 0xDF64, 0x21EC,\n    0xDF65, 0xDF65, 0x4D59, 0xDF66, 0xDF66, 0x1EBE, 0xDF67, 0xDF67, 0x4D5A,\n    0xDF68, 0xDF68, 0x224A, 0xDF69, 0xDF6C, 0x4D5B, 0xDF6D, 0xDF6D, 0x2133,\n    0xDF6E, 0xDF73, 0x4D5F, 0xDF74, 0xDF74, 0x1E84, 0xDF75, 0xDF76, 0x4D65,\n    0xDF77, 0xDF77, 0x20CF, 0xDF78, 0xDF78, 0x21E2, 0xDF79, 0xDF79, 0x4D67,\n    0xDF7A, 0xDF7A, 0x220F, 0xDF7B, 0xDF7B, 0x4D68, 0xDF7C, 0xDF7C, 0x2029,\n    0xDF7D, 0xDF7D, 0x4D69, 0xDF7E, 0xDF7E, 0x2073, 0xDF80, 0xDF80, 0x1F55,\n    0xDF81, 0xDF82, 0x4D6A, 0xDF83, 0xDF83, 0x23F1, 0xDF84, 0xDF84, 0x4D6C,\n    0xDF85, 0xDF85, 0x1E46, 0xDF86, 0xDF88, 0x4D6D, 0xDF89, 0xDF89, 0x2063,\n    0xDF8A, 0xDF8A, 0x23F3, 0xDF8B, 0xDFA0, 0x4D70, 0xDFA1, 0xDFFE, 0x14E9,\n    0xE040, 0xE04F, 0x4D86, 0xE050, 0xE050, 0x231E, 0xE051, 0xE05C, 0x4D96,\n    0xE05D, 0xE05D, 0x2233, 0xE05E, 0xE068, 0x4DA2, 0xE069, 0xE069, 0x2320,\n    0xE06A, 0xE06B, 0x4DAD, 0xE06C, 0xE06C, 0x21C7, 0xE06D, 0xE074, 0x4DAF,\n    0xE075, 0xE075, 0x22BC, 0xE076, 0xE076, 0x4DB7, 0xE077, 0xE077, 0x231C,\n    0xE078, 0xE078, 0x4DB8, 0xE079, 0xE079, 0x2251, 0xE07A, 0xE07E, 0x4DB9,\n    0xE080, 0xE086, 0x4DBE, 0xE087, 0xE087, 0x1EBB, 0xE088, 0xE08C, 0x4DC5,\n    0xE08D, 0xE08D, 0x2287, 0xE08E, 0xE08E, 0x4DCA, 0xE08F, 0xE08F, 0x202D,\n    0xE090, 0xE090, 0x1EAB, 0xE091, 0xE091, 0x4DCB, 0xE092, 0xE092, 0x231D,\n    0xE093, 0xE093, 0x4DCC, 0xE094, 0xE094, 0x231F, 0xE095, 0xE096, 0x4DCD,\n    0xE097, 0xE097, 0x231B, 0xE098, 0xE0A0, 0x4DCF, 0xE0A1, 0xE0FE, 0x1547,\n    0xE140, 0xE141, 0x4DD8, 0xE142, 0xE142, 0x2321, 0xE143, 0xE163, 0x4DDA,\n    0xE164, 0xE164, 0x2255, 0xE165, 0xE167, 0x4DFB, 0xE168, 0xE168, 0x1E8F,\n    0xE169, 0xE173, 0x4DFE, 0xE174, 0xE174, 0x220C, 0xE175, 0xE175, 0x1FA4,\n    0xE176, 0xE17E, 0x4E09, 0xE180, 0xE183, 0x4E12, 0xE184, 0xE184, 0x209B,\n    0xE185, 0xE185, 0x21D8, 0xE186, 0xE186, 0x4E16, 0xE187, 0xE187, 0x25FA,\n    0xE188, 0xE188, 0x4E17, 0xE189, 0xE189, 0x25F9, 0xE18A, 0xE18B, 0x4E18,\n    0xE18C, 0xE18C, 0x2134, 0xE18D, 0xE18D, 0x4E1A, 0xE18E, 0xE190, 0x24F3,\n    0xE191, 0xE191, 0x24F8, 0xE192, 0xE192, 0x4E1B, 0xE193, 0xE193, 0x24F7,\n    0xE194, 0xE194, 0x1EC8, 0xE195, 0xE195, 0x24F6, 0xE196, 0xE197, 0x4E1C,\n    0xE198, 0xE198, 0x2280, 0xE199, 0xE19D, 0x4E1E, 0xE19E, 0xE19E, 0x1EC5,\n    0xE19F, 0xE19F, 0x24FB, 0xE1A0, 0xE1A0, 0x4E23, 0xE1A1, 0xE1FE, 0x15A5,\n    0xE240, 0xE240, 0x4E24, 0xE241, 0xE241, 0x24FA, 0xE242, 0xE242, 0x4E25,\n    0xE243, 0xE243, 0x1EED, 0xE244, 0xE24E, 0x4E26, 0xE24F, 0xE24F, 0x24FD,\n    0xE250, 0xE250, 0x4E31, 0xE251, 0xE251, 0x24F9, 0xE252, 0xE252, 0x4E32,\n    0xE253, 0xE253, 0x24FE, 0xE254, 0xE254, 0x20CD, 0xE255, 0xE259, 0x4E33,\n    0xE25A, 0xE25A, 0x2508, 0xE25B, 0xE25B, 0x2504, 0xE25C, 0xE25D, 0x4E38,\n    0xE25E, 0xE25E, 0x2506, 0xE25F, 0xE261, 0x4E3A, 0xE262, 0xE262, 0x24FF,\n    0xE263, 0xE263, 0x2090, 0xE264, 0xE266, 0x4E3D, 0xE267, 0xE267, 0x1EDD,\n    0xE268, 0xE268, 0x1F25, 0xE269, 0xE269, 0x4E40, 0xE26A, 0xE26A, 0x2503,\n    0xE26B, 0xE26B, 0x2502, 0xE26C, 0xE26D, 0x4E41, 0xE26E, 0xE26E, 0x1E7A,\n    0xE26F, 0xE26F, 0x20A6, 0xE270, 0xE277, 0x4E43, 0xE278, 0xE278, 0x1FD5,\n    0xE279, 0xE27C, 0x4E4B, 0xE27D, 0xE27D, 0x1F11, 0xE27E, 0xE27E, 0x4E4F,\n    0xE280, 0xE280, 0x2507, 0xE281, 0xE281, 0x2500, 0xE282, 0xE282, 0x2505,\n    0xE283, 0xE288, 0x4E50, 0xE289, 0xE289, 0x2519, 0xE28A, 0xE28A, 0x4E56,\n    0xE28B, 0xE28B, 0x2515, 0xE28C, 0xE28D, 0x4E57, 0xE28E, 0xE28E, 0x250C,\n    0xE28F, 0xE28F, 0x2031, 0xE290, 0xE291, 0x4E59, 0xE292, 0xE292, 0x250B,\n    0xE293, 0xE293, 0x250F, 0xE294, 0xE294, 0x251A, 0xE295, 0xE295, 0x2509,\n    0xE296, 0xE297, 0x4E5B, 0xE298, 0xE298, 0x250E, 0xE299, 0xE299, 0x2234,\n    0xE29A, 0xE29A, 0x2513, 0xE29B, 0xE29B, 0x1F80, 0xE29C, 0xE29F, 0x4E5D,\n    0xE2A0, 0xE2A0, 0x2501, 0xE2A1, 0xE2FE, 0x1603, 0xE340, 0xE341, 0x4E61,\n    0xE342, 0xE342, 0x2517, 0xE343, 0xE343, 0x2516, 0xE344, 0xE346, 0x4E63,\n    0xE347, 0xE347, 0x2518, 0xE348, 0xE34A, 0x4E66, 0xE34B, 0xE34B, 0x1E56,\n    0xE34C, 0xE34E, 0x4E69, 0xE34F, 0xE34F, 0x250D, 0xE350, 0xE350, 0x4E6C,\n    0xE351, 0xE351, 0x20D3, 0xE352, 0xE353, 0x4E6D, 0xE354, 0xE354, 0x207A,\n    0xE355, 0xE355, 0x20CE, 0xE356, 0xE357, 0x4E6F, 0xE358, 0xE358, 0x2510,\n    0xE359, 0xE35B, 0x4E71, 0xE35C, 0xE35C, 0x1E55, 0xE35D, 0xE35F, 0x4E74,\n    0xE360, 0xE360, 0x250A, 0xE361, 0xE365, 0x4E77, 0xE366, 0xE367, 0x2511,\n    0xE368, 0xE370, 0x4E7C, 0xE371, 0xE371, 0x1FAA, 0xE372, 0xE372, 0x4E85,\n    0xE373, 0xE373, 0x251E, 0xE374, 0xE374, 0x1F1F, 0xE375, 0xE377, 0x4E86,\n    0xE378, 0xE378, 0x252D, 0xE379, 0xE379, 0x221D, 0xE37A, 0xE37B, 0x4E89,\n    0xE37C, 0xE37C, 0x2532, 0xE37D, 0xE37D, 0x4E8B, 0xE37E, 0xE37E, 0x217B,\n    0xE380, 0xE389, 0x4E8C, 0xE38A, 0xE38A, 0x21AF, 0xE38B, 0xE38B, 0x4E96,\n    0xE38C, 0xE38C, 0x252C, 0xE38D, 0xE38E, 0x4E97, 0xE38F, 0xE38F, 0x2528,\n    0xE390, 0xE390, 0x4E99, 0xE391, 0xE391, 0x208C, 0xE392, 0xE392, 0x4E9A,\n    0xE393, 0xE393, 0x252F, 0xE394, 0xE394, 0x4E9B, 0xE395, 0xE395, 0x21BC,\n    0xE396, 0xE398, 0x4E9C, 0xE399, 0xE399, 0x251D, 0xE39A, 0xE39B, 0x4E9F,\n    0xE39C, 0xE39C, 0x2535, 0xE39D, 0xE39D, 0x4EA1, 0xE39E, 0xE39E, 0x220D,\n    0xE39F, 0xE39F, 0x2526, 0xE3A0, 0xE3A0, 0x4EA2, 0xE3A1, 0xE3FE, 0x1661,\n    0xE440, 0xE440, 0x2534, 0xE441, 0xE441, 0x252A, 0xE442, 0xE442, 0x251F,\n    0xE443, 0xE443, 0x2531, 0xE444, 0xE444, 0x251C, 0xE445, 0xE447, 0x4EA3,\n    0xE448, 0xE448, 0x2525, 0xE449, 0xE44D, 0x4EA6, 0xE44E, 0xE44E, 0x21CD,\n    0xE44F, 0xE44F, 0x4EAB, 0xE450, 0xE450, 0x21DA, 0xE451, 0xE451, 0x4EAC,\n    0xE452, 0xE452, 0x2172, 0xE453, 0xE453, 0x253E, 0xE454, 0xE457, 0x4EAD,\n    0xE458, 0xE458, 0x204F, 0xE459, 0xE459, 0x4EB1, 0xE45A, 0xE45A, 0x2543,\n    0xE45B, 0xE45B, 0x4EB2, 0xE45C, 0xE45C, 0x21D7, 0xE45D, 0xE45D, 0x4EB3,\n    0xE45E, 0xE45E, 0x1E3C, 0xE45F, 0xE461, 0x4EB4, 0xE462, 0xE462, 0x2529,\n    0xE463, 0xE464, 0x4EB7, 0xE465, 0xE465, 0x2521, 0xE466, 0xE467, 0x4EB9,\n    0xE468, 0xE468, 0x1EFF, 0xE469, 0xE472, 0x4EBB, 0xE473, 0xE473, 0x253F,\n    0xE474, 0xE474, 0x4EC5, 0xE475, 0xE475, 0x2544, 0xE476, 0xE478, 0x4EC6,\n    0xE479, 0xE479, 0x2523, 0xE47A, 0xE47A, 0x1E90, 0xE47B, 0xE47B, 0x253A,\n    0xE47C, 0xE47C, 0x2545, 0xE47D, 0xE47D, 0x4EC9, 0xE47E, 0xE47E, 0x253D,\n    0xE480, 0xE480, 0x4ECA, 0xE481, 0xE481, 0x20C1, 0xE482, 0xE483, 0x4ECB,\n    0xE484, 0xE484, 0x2103, 0xE485, 0xE485, 0x2520, 0xE486, 0xE486, 0x253C,\n    0xE487, 0xE487, 0x253B, 0xE488, 0xE488, 0x2538, 0xE489, 0xE48C, 0x4ECD,\n    0xE48D, 0xE48D, 0x2540, 0xE48E, 0xE48E, 0x4ED1, 0xE48F, 0xE48F, 0x1FCD,\n    0xE490, 0xE492, 0x4ED2, 0xE493, 0xE493, 0x1F18, 0xE494, 0xE497, 0x4ED5,\n    0xE498, 0xE498, 0x254B, 0xE499, 0xE49C, 0x4ED9, 0xE49D, 0xE49D, 0x2547,\n    0xE49E, 0xE49F, 0x254F, 0xE4A0, 0xE4A0, 0x4EDD, 0xE4A1, 0xE4FE, 0x16BF,\n    0xE540, 0xE545, 0x4EDE, 0xE546, 0xE546, 0x22B0, 0xE547, 0xE547, 0x4EE4,\n    0xE548, 0xE548, 0x2546, 0xE549, 0xE54A, 0x4EE5, 0xE54B, 0xE54B, 0x254C,\n    0xE54C, 0xE54D, 0x4EE7, 0xE54E, 0xE54E, 0x1E9A, 0xE54F, 0xE54F, 0x2552,\n    0xE550, 0xE550, 0x2530, 0xE551, 0xE551, 0x2549, 0xE552, 0xE554, 0x4EE9,\n    0xE555, 0xE555, 0x2551, 0xE556, 0xE556, 0x1ECA, 0xE557, 0xE557, 0x4EEC,\n    0xE558, 0xE558, 0x20D2, 0xE559, 0xE55B, 0x4EED, 0xE55C, 0xE55C, 0x1FB8,\n    0xE55D, 0xE55D, 0x4EF0, 0xE55E, 0xE55E, 0x2079, 0xE55F, 0xE560, 0x4EF1,\n    0xE561, 0xE561, 0x21AB, 0xE562, 0xE563, 0x4EF3, 0xE564, 0xE564, 0x254D,\n    0xE565, 0xE565, 0x1EA5, 0xE566, 0xE567, 0x4EF5, 0xE568, 0xE568, 0x204C,\n    0xE569, 0xE569, 0x2080, 0xE56A, 0xE56B, 0x4EF7, 0xE56C, 0xE56C, 0x266D,\n    0xE56D, 0xE56D, 0x4EF9, 0xE56E, 0xE56E, 0x2537, 0xE56F, 0xE574, 0x4EFA,\n    0xE575, 0xE575, 0x254A, 0xE576, 0xE576, 0x21B8, 0xE577, 0xE577, 0x4F00,\n    0xE578, 0xE578, 0x254E, 0xE579, 0xE57A, 0x4F01, 0xE57B, 0xE57B, 0x24FC,\n    0xE57C, 0xE57C, 0x2554, 0xE57D, 0xE57E, 0x4F03, 0xE580, 0xE580, 0x4F05,\n    0xE581, 0xE581, 0x1F3C, 0xE582, 0xE582, 0x4F06, 0xE583, 0xE583, 0x1ED5,\n    0xE584, 0xE589, 0x4F07, 0xE58A, 0xE58A, 0x2556, 0xE58B, 0xE58D, 0x4F0D,\n    0xE58E, 0xE58E, 0x2268, 0xE58F, 0xE590, 0x4F10, 0xE591, 0xE591, 0x1ED6,\n    0xE592, 0xE599, 0x4F12, 0xE59A, 0xE59A, 0x2557, 0xE59B, 0xE59B, 0x2553,\n    0xE59C, 0xE59E, 0x4F1A, 0xE59F, 0xE59F, 0x2548, 0xE5A0, 0xE5A0, 0x4F1D,\n    0xE5A1, 0xE5FE, 0x171D, 0xE640, 0xE640, 0x20DC, 0xE641, 0xE643, 0x4F1E,\n    0xE644, 0xE644, 0x2559, 0xE645, 0xE648, 0x4F21, 0xE649, 0xE649, 0x1F97,\n    0xE64A, 0xE64A, 0x2555, 0xE64B, 0xE64D, 0x4F25, 0xE64E, 0xE64E, 0x227D,\n    0xE64F, 0xE651, 0x4F28, 0xE652, 0xE652, 0x257E, 0xE653, 0xE655, 0x4F2B,\n    0xE656, 0xE656, 0x207C, 0xE657, 0xE657, 0x4F2E, 0xE658, 0xE658, 0x255A,\n    0xE659, 0xE65A, 0x4F2F, 0xE65B, 0xE65B, 0x255E, 0xE65C, 0xE65D, 0x4F31,\n    0xE65E, 0xE65E, 0x1E34, 0xE65F, 0xE668, 0x4F33, 0xE669, 0xE669, 0x215E,\n    0xE66A, 0xE66A, 0x4F3D, 0xE66B, 0xE66B, 0x2560, 0xE66C, 0xE674, 0x4F3E,\n    0xE675, 0xE675, 0x21A2, 0xE676, 0xE676, 0x2354, 0xE677, 0xE678, 0x4F47,\n    0xE679, 0xE679, 0x2563, 0xE67A, 0xE67A, 0x2527, 0xE67B, 0xE67B, 0x4F49,\n    0xE67C, 0xE67C, 0x252E, 0xE67D, 0xE67D, 0x2558, 0xE67E, 0xE67E, 0x4F4A,\n    0xE680, 0xE680, 0x1F1B, 0xE681, 0xE681, 0x4F4B, 0xE682, 0xE682, 0x2283,\n    0xE683, 0xE683, 0x4F4C, 0xE684, 0xE684, 0x2564, 0xE685, 0xE686, 0x4F4D,\n    0xE687, 0xE687, 0x20A0, 0xE688, 0xE688, 0x4F4F, 0xE689, 0xE689, 0x2565,\n    0xE68A, 0xE68B, 0x4F50, 0xE68C, 0xE68C, 0x2561, 0xE68D, 0xE692, 0x4F52,\n    0xE693, 0xE693, 0x2562, 0xE694, 0xE696, 0x4F58, 0xE697, 0xE697, 0x256C,\n    0xE698, 0xE69A, 0x4F5B, 0xE69B, 0xE69B, 0x256D, 0xE69C, 0xE69C, 0x2020,\n    0xE69D, 0xE69E, 0x4F5E, 0xE69F, 0xE69F, 0x255F, 0xE6A0, 0xE6A0, 0x256A,\n    0xE6A1, 0xE6FE, 0x177B, 0xE740, 0xE742, 0x4F60, 0xE743, 0xE743, 0x256E,\n    0xE744, 0xE747, 0x4F63, 0xE748, 0xE748, 0x2539, 0xE749, 0xE749, 0x255C,\n    0xE74A, 0xE74C, 0x4F67, 0xE74D, 0xE74E, 0x2568, 0xE74F, 0xE74F, 0x256B,\n    0xE750, 0xE750, 0x1E6F, 0xE751, 0xE751, 0x4F6A, 0xE752, 0xE752, 0x1FC4,\n    0xE753, 0xE753, 0x2567, 0xE754, 0xE754, 0x4F6B, 0xE755, 0xE755, 0x255B,\n    0xE756, 0xE758, 0x4F6C, 0xE759, 0xE759, 0x261D, 0xE75A, 0xE765, 0x4F6F,\n    0xE766, 0xE766, 0x252B, 0xE767, 0xE767, 0x4F7B, 0xE768, 0xE768, 0x2571,\n    0xE769, 0xE769, 0x4F7C, 0xE76A, 0xE76A, 0x2577, 0xE76B, 0xE773, 0x4F7D,\n    0xE774, 0xE774, 0x2522, 0xE775, 0xE77B, 0x4F86, 0xE77C, 0xE77C, 0x2533,\n    0xE77D, 0xE77E, 0x4F8D, 0xE780, 0xE781, 0x4F8F, 0xE782, 0xE782, 0x202A,\n    0xE783, 0xE783, 0x4F91, 0xE784, 0xE784, 0x2536, 0xE785, 0xE785, 0x2573,\n    0xE786, 0xE786, 0x256F, 0xE787, 0xE789, 0x4F92, 0xE78A, 0xE78A, 0x2293,\n    0xE78B, 0xE78B, 0x2578, 0xE78C, 0xE78E, 0x4F95, 0xE78F, 0xE78F, 0x2570,\n    0xE790, 0xE791, 0x4F98, 0xE792, 0xE792, 0x2575, 0xE793, 0xE797, 0x4F9A,\n    0xE798, 0xE799, 0x2541, 0xE79A, 0xE79A, 0x255D, 0xE79B, 0xE79F, 0x4F9F,\n    0xE7A0, 0xE7A0, 0x201A, 0xE7A1, 0xE7FE, 0x17D9, 0xE840, 0xE842, 0x4FA4,\n    0xE843, 0xE843, 0x257A, 0xE844, 0xE844, 0x2006, 0xE845, 0xE845, 0x4FA7,\n    0xE846, 0xE846, 0x2177, 0xE847, 0xE848, 0x4FA8, 0xE849, 0xE849, 0x251B,\n    0xE84A, 0xE84A, 0x4FAA, 0xE84B, 0xE84B, 0x2524, 0xE84C, 0xE84E, 0x4FAB,\n    0xE84F, 0xE84F, 0x257B, 0xE850, 0xE853, 0x4FAE, 0xE854, 0xE854, 0x22A3,\n    0xE855, 0xE859, 0x4FB2, 0xE85A, 0xE85A, 0x2579, 0xE85B, 0xE85B, 0x4FB7,\n    0xE85C, 0xE85C, 0x2566, 0xE85D, 0xE861, 0x4FB8, 0xE862, 0xE862, 0x1F93,\n    0xE863, 0xE863, 0x4FBD, 0xE864, 0xE864, 0x257C, 0xE865, 0xE86F, 0x4FBE,\n    0xE870, 0xE870, 0x2514, 0xE871, 0xE872, 0x4FC9, 0xE873, 0xE873, 0x257D,\n    0xE874, 0xE874, 0x4FCB, 0xE875, 0xE875, 0x2572, 0xE876, 0xE87B, 0x4FCC,\n    0xE87C, 0xE87C, 0x2574, 0xE87D, 0xE87E, 0x4FD2, 0xE880, 0xE880, 0x224E,\n    0xE881, 0xE881, 0x4FD4, 0xE882, 0xE882, 0x21C6, 0xE883, 0xE886, 0x4FD5,\n    0xE887, 0xE887, 0x209F, 0xE888, 0xE888, 0x4FD9, 0xE889, 0xE889, 0x2576,\n    0xE88A, 0xE88B, 0x4FDA, 0xE88C, 0xE88C, 0x2064, 0xE88D, 0xE88D, 0x22BF,\n    0xE88E, 0xE88E, 0x261C, 0xE88F, 0xE88F, 0x225E, 0xE890, 0xE8A0, 0x4FDC,\n    0xE8A1, 0xE8FE, 0x1837, 0xE940, 0xE94B, 0x4FED, 0xE94C, 0xE94C, 0x1E75,\n    0xE94D, 0xE953, 0x4FF9, 0xE954, 0xE954, 0x207D, 0xE955, 0xE955, 0x5000,\n    0xE956, 0xE956, 0x23BF, 0xE957, 0xE957, 0x2113, 0xE958, 0xE959, 0x5001,\n    0xE95A, 0xE95A, 0x23C0, 0xE95B, 0xE95C, 0x5003, 0xE95D, 0xE95D, 0x1E45,\n    0xE95E, 0xE95E, 0x5005, 0xE95F, 0xE95F, 0x1FD8, 0xE960, 0xE960, 0x23C4,\n    0xE961, 0xE961, 0x5006, 0xE962, 0xE962, 0x23C2, 0xE963, 0xE963, 0x2104,\n    0xE964, 0xE964, 0x5007, 0xE965, 0xE965, 0x21BD, 0xE966, 0xE966, 0x5008,\n    0xE967, 0xE967, 0x1F87, 0xE968, 0xE968, 0x23C3, 0xE969, 0xE96B, 0x5009,\n    0xE96C, 0xE96C, 0x2269, 0xE96D, 0xE974, 0x500C, 0xE975, 0xE975, 0x1F43,\n    0xE976, 0xE976, 0x5014, 0xE977, 0xE977, 0x1F1E, 0xE978, 0xE978, 0x2679,\n    0xE979, 0xE979, 0x1EEB, 0xE97A, 0xE97B, 0x5015, 0xE97C, 0xE97C, 0x1F35,\n    0xE97D, 0xE97D, 0x208A, 0xE97E, 0xE97E, 0x5017, 0xE980, 0xE980, 0x23C7,\n    0xE981, 0xE981, 0x23C9, 0xE982, 0xE982, 0x23C6, 0xE983, 0xE986, 0x5018,\n    0xE987, 0xE987, 0x224F, 0xE988, 0xE98A, 0x501C, 0xE98B, 0xE98B, 0x23CB,\n    0xE98C, 0xE98D, 0x501F, 0xE98E, 0xE98E, 0x21F3, 0xE98F, 0xE98F, 0x5021,\n    0xE990, 0xE990, 0x21F7, 0xE991, 0xE991, 0x23CF, 0xE992, 0xE992, 0x23CE,\n    0xE993, 0xE993, 0x23CA, 0xE994, 0xE994, 0x23CD, 0xE995, 0xE997, 0x5022,\n    0xE998, 0xE998, 0x23D0, 0xE999, 0xE99A, 0x5025, 0xE99B, 0xE99B, 0x266C,\n    0xE99C, 0xE99C, 0x5027, 0xE99D, 0xE99D, 0x23C1, 0xE99E, 0xE99E, 0x5028,\n    0xE99F, 0xE99F, 0x1FEE, 0xE9A0, 0xE9A0, 0x23D1, 0xE9A1, 0xE9FE, 0x1895,\n    0xEA40, 0xEA40, 0x1FF8, 0xEA41, 0xEA43, 0x5029, 0xEA44, 0xEA44, 0x23D3,\n    0xEA45, 0xEA47, 0x502C, 0xEA48, 0xEA48, 0x23D2, 0xEA49, 0xEA49, 0x23D4,\n    0xEA4A, 0xEA4A, 0x1E98, 0xEA4B, 0xEA4F, 0x502F, 0xEA50, 0xEA50, 0x1F2C,\n    0xEA51, 0xEA51, 0x5034, 0xEA52, 0xEA52, 0x23D5, 0xEA53, 0xEA54, 0x5035,\n    0xEA55, 0xEA55, 0x1E71, 0xEA56, 0xEA56, 0x2691, 0xEA57, 0xEA58, 0x5037,\n    0xEA59, 0xEA59, 0x23C5, 0xEA5A, 0xEA7E, 0x5039, 0xEA80, 0xEA80, 0x231A,\n    0xEA81, 0xEA83, 0x505E, 0xEA84, 0xEA84, 0x2114, 0xEA85, 0xEA86, 0x5061,\n    0xEA87, 0xEA87, 0x2284, 0xEA88, 0xEA8D, 0x5063, 0xEA8E, 0xEA8E, 0x221C,\n    0xEA8F, 0xEA8F, 0x5069, 0xEA90, 0xEA90, 0x1E7E, 0xEA91, 0xEA91, 0x204D,\n    0xEA92, 0xEA95, 0x506A, 0xEA96, 0xEA96, 0x2201, 0xEA97, 0xEA9F, 0x506E,\n    0xEAA0, 0xEAA0, 0x1ED9, 0xEAA1, 0xEAFE, 0x18F3, 0xEB40, 0xEB40, 0x5077,\n    0xEB41, 0xEB41, 0x1FB2, 0xEB42, 0xEB44, 0x5078, 0xEB45, 0xEB45, 0x2252,\n    0xEB46, 0xEB47, 0x507B, 0xEB48, 0xEB48, 0x1F79, 0xEB49, 0xEB52, 0x507D,\n    0xEB53, 0xEB53, 0x2157, 0xEB54, 0xEB54, 0x5087, 0xEB55, 0xEB55, 0x21BF,\n    0xEB56, 0xEB5A, 0x5088, 0xEB5B, 0xEB5B, 0x221F, 0xEB5C, 0xEB5C, 0x508D,\n    0xEB5D, 0xEB5D, 0x203D, 0xEB5E, 0xEB5F, 0x508E, 0xEB60, 0xEB60, 0x2015,\n    0xEB61, 0xEB61, 0x5090, 0xEB62, 0xEB62, 0x26A5, 0xEB63, 0xEB6C, 0x5091,\n    0xEB6D, 0xEB6D, 0x2156, 0xEB6E, 0xEB6F, 0x509B, 0xEB70, 0xEB70, 0x2144,\n    0xEB71, 0xEB71, 0x509D, 0xEB72, 0xEB72, 0x1E91, 0xEB73, 0xEB73, 0x2257,\n    0xEB74, 0xEB77, 0x509E, 0xEB78, 0xEB78, 0x200A, 0xEB79, 0xEB79, 0x2092,\n    0xEB7A, 0xEB7E, 0x50A2, 0xEB80, 0xEB84, 0x50A7, 0xEB85, 0xEB85, 0x2250,\n    0xEB86, 0xEB89, 0x50AC, 0xEB8A, 0xEB8A, 0x1EC3, 0xEB8B, 0xEBA0, 0x50B0,\n    0xEBA1, 0xEBFE, 0x1951, 0xEC40, 0xEC45, 0x50C6, 0xEC46, 0xEC46, 0x21A8,\n    0xEC47, 0xEC55, 0x50CC, 0xEC56, 0xEC56, 0x260D, 0xEC57, 0xEC59, 0x50DB,\n    0xEC5A, 0xEC5A, 0x260C, 0xEC5B, 0xEC5B, 0x50DE, 0xEC5C, 0xEC5C, 0x260E,\n    0xEC5D, 0xEC5F, 0x50DF, 0xEC60, 0xEC60, 0x2032, 0xEC61, 0xEC6D, 0x50E2,\n    0xEC6E, 0xEC6E, 0x260B, 0xEC6F, 0xEC75, 0x50EF, 0xEC76, 0xEC76, 0x22C3,\n    0xEC77, 0xEC7E, 0x50F6, 0xEC80, 0xEC95, 0x50FE, 0xEC96, 0xEC96, 0x1F23,\n    0xEC97, 0xECA0, 0x5114, 0xECA1, 0xECFE, 0x19AF, 0xED40, 0xED45, 0x511E,\n    0xED46, 0xED46, 0x2695, 0xED47, 0xED57, 0x5124, 0xED58, 0xED58, 0x265E,\n    0xED59, 0xED5D, 0x5135, 0xED5E, 0xED5E, 0x265D, 0xED5F, 0xED60, 0x513A,\n    0xED61, 0xED61, 0x2692, 0xED62, 0xED63, 0x513C, 0xED64, 0xED64, 0x265F,\n    0xED65, 0xED65, 0x513E, 0xED66, 0xED66, 0x218D, 0xED67, 0xED67, 0x20FD,\n    0xED68, 0xED6D, 0x513F, 0xED6E, 0xED6E, 0x1F40, 0xED6F, 0xED73, 0x5145,\n    0xED74, 0xED74, 0x2465, 0xED75, 0xED76, 0x514A, 0xED77, 0xED77, 0x2467,\n    0xED78, 0xED78, 0x514C, 0xED79, 0xED79, 0x2466, 0xED7A, 0xED7E, 0x514D,\n    0xED80, 0xED90, 0x5152, 0xED91, 0xED91, 0x21C9, 0xED92, 0xED92, 0x5163,\n    0xED93, 0xED93, 0x2209, 0xED94, 0xED94, 0x1EC9, 0xED95, 0xED95, 0x20E9,\n    0xED96, 0xED96, 0x5164, 0xED97, 0xED97, 0x21CA, 0xED98, 0xED98, 0x2146,\n    0xED99, 0xED99, 0x25C5, 0xED9A, 0xED9A, 0x21DC, 0xED9B, 0xED9B, 0x5165,\n    0xED9C, 0xED9C, 0x245E, 0xED9D, 0xED9D, 0x5166, 0xED9E, 0xED9E, 0x214F,\n    0xED9F, 0xED9F, 0x5167, 0xEDA0, 0xEDA0, 0x25C6, 0xEDA1, 0xEDFE, 0x1A0D,\n    0xEE40, 0xEE40, 0x25C7, 0xEE41, 0xEE41, 0x2241, 0xEE42, 0xEE42, 0x218A,\n    0xEE43, 0xEE43, 0x1E2F, 0xEE44, 0xEE44, 0x1EDC, 0xEE45, 0xEE47, 0x5168,\n    0xEE48, 0xEE48, 0x20BF, 0xEE49, 0xEE49, 0x2034, 0xEE4A, 0xEE4C, 0x516B,\n    0xEE4D, 0xEE4D, 0x25C9, 0xEE4E, 0xEE51, 0x516E, 0xEE52, 0xEE52, 0x25C8,\n    0xEE53, 0xEE54, 0x5172, 0xEE55, 0xEE55, 0x220E, 0xEE56, 0xEE56, 0x5174,\n    0xEE57, 0xEE57, 0x25CB, 0xEE58, 0xEE5D, 0x5175, 0xEE5E, 0xEE5E, 0x217D,\n    0xEE5F, 0xEE60, 0x517B, 0xEE61, 0xEE61, 0x1F7E, 0xEE62, 0xEE67, 0x517D,\n    0xEE68, 0xEE68, 0x25CC, 0xEE69, 0xEE69, 0x1FC3, 0xEE6A, 0xEE6B, 0x5183,\n    0xEE6C, 0xEE6C, 0x20B9, 0xEE6D, 0xEE6D, 0x5185, 0xEE6E, 0xEE6E, 0x2181,\n    0xEE6F, 0xEE76, 0x5186, 0xEE77, 0xEE77, 0x1FDA, 0xEE78, 0xEE7C, 0x518E,\n    0xEE7D, 0xEE7D, 0x2173, 0xEE7E, 0xEE7E, 0x1EE1, 0xEE80, 0xEE80, 0x25CD,\n    0xEE81, 0xEE84, 0x5193, 0xEE85, 0xEE85, 0x25CE, 0xEE86, 0xEE86, 0x21F6,\n    0xEE87, 0xEE89, 0x5197, 0xEE8A, 0xEE8A, 0x224B, 0xEE8B, 0xEE8B, 0x25D1,\n    0xEE8C, 0xEE8C, 0x519A, 0xEE8D, 0xEE8D, 0x1EC0, 0xEE8E, 0xEE8F, 0x519B,\n    0xEE90, 0xEE90, 0x2008, 0xEE91, 0xEE93, 0x519D, 0xEE94, 0xEE94, 0x25D0,\n    0xEE95, 0xEE96, 0x51A0, 0xEE97, 0xEE97, 0x25D2, 0xEE98, 0xEE98, 0x51A2,\n    0xEE99, 0xEE99, 0x1F2A, 0xEE9A, 0xEE9C, 0x51A3, 0xEE9D, 0xEE9D, 0x1E72,\n    0xEE9E, 0xEE9E, 0x25D3, 0xEE9F, 0xEEA0, 0x51A6, 0xEEA1, 0xEEFE, 0x1A6B,\n    0xEF40, 0xEF40, 0x21BE, 0xEF41, 0xEF41, 0x25D4, 0xEF42, 0xEF42, 0x2044,\n    0xEF43, 0xEF43, 0x51A8, 0xEF44, 0xEF44, 0x25CF, 0xEF45, 0xEF45, 0x20F3,\n    0xEF46, 0xEF4B, 0x51A9, 0xEF4C, 0xEF4C, 0x1F00, 0xEF4D, 0xEF51, 0x51AF,\n    0xEF52, 0xEF53, 0x24CC, 0xEF54, 0xEF54, 0x51B4, 0xEF55, 0xEF55, 0x2698,\n    0xEF56, 0xEF56, 0x51B5, 0xEF57, 0xEF57, 0x2678, 0xEF58, 0xEF59, 0x51B6,\n    0xEF5A, 0xEF5A, 0x24CE, 0xEF5B, 0xEF5F, 0x51B8, 0xEF60, 0xEF60, 0x24CF,\n    0xEF61, 0xEF67, 0x51BD, 0xEF68, 0xEF68, 0x20B8, 0xEF69, 0xEF69, 0x51C4,\n    0xEF6A, 0xEF6A, 0x24D0, 0xEF6B, 0xEF6B, 0x51C5, 0xEF6C, 0xEF6C, 0x24D1,\n    0xEF6D, 0xEF76, 0x51C6, 0xEF77, 0xEF77, 0x1EF4, 0xEF78, 0xEF79, 0x51D0,\n    0xEF7A, 0xEF7A, 0x239B, 0xEF7B, 0xEF7B, 0x51D2, 0xEF7C, 0xEF7C, 0x267E,\n    0xEF7D, 0xEF7E, 0x51D3, 0xEF80, 0xEF81, 0x51D5, 0xEF82, 0xEF82, 0x239D,\n    0xEF83, 0xEF84, 0x239F, 0xEF85, 0xEF85, 0x51D7, 0xEF86, 0xEF86, 0x23A1,\n    0xEF87, 0xEF87, 0x51D8, 0xEF88, 0xEF88, 0x1EF1, 0xEF89, 0xEF8A, 0x51D9,\n    0xEF8B, 0xEF8B, 0x221E, 0xEF8C, 0xEF8C, 0x51DB, 0xEF8D, 0xEF8D, 0x23A2,\n    0xEF8E, 0xEF94, 0x51DC, 0xEF95, 0xEF95, 0x214B, 0xEF96, 0xEF96, 0x1E36,\n    0xEF97, 0xEF97, 0x2135, 0xEF98, 0xEF9B, 0x51E3, 0xEF9C, 0xEF9C, 0x1FAD,\n    0xEF9D, 0xEF9D, 0x51E7, 0xEF9E, 0xEF9E, 0x1E53, 0xEF9F, 0xEFA0, 0x51E8,\n    0xEFA1, 0xEFFE, 0x1AC9, 0xF040, 0xF040, 0x51EA, 0xF041, 0xF041, 0x23A3,\n    0xF042, 0xF042, 0x2203, 0xF043, 0xF043, 0x51EB, 0xF044, 0xF044, 0x1EE7,\n    0xF045, 0xF046, 0x51EC, 0xF047, 0xF047, 0x23A4, 0xF048, 0xF048, 0x2097,\n    0xF049, 0xF049, 0x1EE4, 0xF04A, 0xF04D, 0x51EE, 0xF04E, 0xF04E, 0x2238,\n    0xF04F, 0xF050, 0x51F2, 0xF051, 0xF051, 0x23A5, 0xF052, 0xF053, 0x51F4,\n    0xF054, 0xF054, 0x1F9A, 0xF055, 0xF056, 0x51F6, 0xF057, 0xF057, 0x21C3,\n    0xF058, 0xF05D, 0x51F8, 0xF05E, 0xF05E, 0x1F2E, 0xF05F, 0xF067, 0x51FE,\n    0xF068, 0xF068, 0x239C, 0xF069, 0xF06B, 0x5207, 0xF06C, 0xF06C, 0x23A6,\n    0xF06D, 0xF070, 0x520A, 0xF071, 0xF071, 0x239E, 0xF072, 0xF072, 0x520E,\n    0xF073, 0xF073, 0x2035, 0xF074, 0xF074, 0x23A7, 0xF075, 0xF077, 0x520F,\n    0xF078, 0xF078, 0x23A8, 0xF079, 0xF079, 0x5212, 0xF07A, 0xF07A, 0x2075,\n    0xF07B, 0xF07C, 0x5213, 0xF07D, 0xF07E, 0x23A9, 0xF080, 0xF080, 0x23AB,\n    0xF081, 0xF081, 0x1FEB, 0xF082, 0xF082, 0x23AC, 0xF083, 0xF086, 0x5215,\n    0xF087, 0xF087, 0x1F6A, 0xF088, 0xF088, 0x20F9, 0xF089, 0xF08A, 0x5219,\n    0xF08B, 0xF08B, 0x2666, 0xF08C, 0xF08F, 0x521B, 0xF090, 0xF090, 0x2667,\n    0xF091, 0xF091, 0x521F, 0xF092, 0xF092, 0x1E6C, 0xF093, 0xF095, 0x5220,\n    0xF096, 0xF096, 0x23AD, 0xF097, 0xF0A0, 0x5223, 0xF0A1, 0xF0FE, 0x1B27,\n    0xF140, 0xF151, 0x522D, 0xF152, 0xF152, 0x206D, 0xF153, 0xF153, 0x2242,\n    0xF154, 0xF154, 0x1F02, 0xF155, 0xF156, 0x523F, 0xF157, 0xF157, 0x2183,\n    0xF158, 0xF158, 0x5241, 0xF159, 0xF159, 0x1E85, 0xF15A, 0xF15A, 0x21E9,\n    0xF15B, 0xF166, 0x5242, 0xF167, 0xF167, 0x1E57, 0xF168, 0xF175, 0x524E,\n    0xF176, 0xF176, 0x22A5, 0xF177, 0xF177, 0x2407, 0xF178, 0xF178, 0x1FCA,\n    0xF179, 0xF179, 0x525C, 0xF17A, 0xF17A, 0x2402, 0xF17B, 0xF17B, 0x1F82,\n    0xF17C, 0xF17D, 0x525D, 0xF17E, 0xF17E, 0x2408, 0xF180, 0xF180, 0x2404,\n    0xF181, 0xF181, 0x525F, 0xF182, 0xF182, 0x2131, 0xF183, 0xF183, 0x5260,\n    0xF184, 0xF184, 0x2184, 0xF185, 0xF185, 0x5261, 0xF186, 0xF186, 0x2403,\n    0xF187, 0xF187, 0x5262, 0xF188, 0xF188, 0x206E, 0xF189, 0xF189, 0x240B,\n    0xF18A, 0xF193, 0x5263, 0xF194, 0xF194, 0x1F3F, 0xF195, 0xF197, 0x526D,\n    0xF198, 0xF198, 0x2067, 0xF199, 0xF1A0, 0x5270, 0xF1A1, 0xF1FE, 0x1B85,\n    0xF240, 0xF244, 0x5278, 0xF245, 0xF245, 0x1FD7, 0xF246, 0xF246, 0x527D,\n    0xF247, 0xF247, 0x1E83, 0xF248, 0xF24A, 0x527E, 0xF24B, 0xF24B, 0x240F,\n    0xF24C, 0xF252, 0x5281, 0xF253, 0xF253, 0x240E, 0xF254, 0xF254, 0x20C7,\n    0xF255, 0xF255, 0x240D, 0xF256, 0xF25B, 0x5288, 0xF25C, 0xF25C, 0x2412,\n    0xF25D, 0xF25E, 0x528E, 0xF25F, 0xF25F, 0x20B7, 0xF260, 0xF270, 0x5290,\n    0xF271, 0xF271, 0x23F0, 0xF272, 0xF272, 0x52A1, 0xF273, 0xF273, 0x2411,\n    0xF274, 0xF274, 0x2414, 0xF275, 0xF275, 0x52A2, 0xF276, 0xF276, 0x2170,\n    0xF277, 0xF27B, 0x52A3, 0xF27C, 0xF27C, 0x2405, 0xF27D, 0xF27D, 0x210C,\n    0xF27E, 0xF27E, 0x2415, 0xF280, 0xF284, 0x52A8, 0xF285, 0xF285, 0x2066,\n    0xF286, 0xF286, 0x52AD, 0xF287, 0xF287, 0x2352, 0xF288, 0xF288, 0x2413,\n    0xF289, 0xF289, 0x2410, 0xF28A, 0xF28B, 0x2416, 0xF28C, 0xF28C, 0x20F1,\n    0xF28D, 0xF290, 0x52AE, 0xF291, 0xF291, 0x240A, 0xF292, 0xF293, 0x52B2,\n    0xF294, 0xF294, 0x2409, 0xF295, 0xF295, 0x52B4, 0xF296, 0xF296, 0x2418,\n    0xF297, 0xF29B, 0x52B5, 0xF29C, 0xF29C, 0x1FA7, 0xF29D, 0xF29D, 0x52BA,\n    0xF29E, 0xF29E, 0x21FC, 0xF29F, 0xF2A0, 0x52BB, 0xF2A1, 0xF2FE, 0x1BE3,\n    0xF340, 0xF340, 0x1FC1, 0xF341, 0xF341, 0x2406, 0xF342, 0xF344, 0x52BD,\n    0xF345, 0xF345, 0x229C, 0xF346, 0xF347, 0x52C0, 0xF348, 0xF348, 0x204E,\n    0xF349, 0xF349, 0x52C2, 0xF34A, 0xF34A, 0x241A, 0xF34B, 0xF34B, 0x2419,\n    0xF34C, 0xF34F, 0x52C3, 0xF350, 0xF350, 0x240C, 0xF351, 0xF360, 0x52C7,\n    0xF361, 0xF361, 0x1E29, 0xF362, 0xF373, 0x52D7, 0xF374, 0xF374, 0x2661,\n    0xF375, 0xF375, 0x52E9, 0xF376, 0xF376, 0x26A4, 0xF377, 0xF377, 0x2174,\n    0xF378, 0xF378, 0x2663, 0xF379, 0xF379, 0x2662, 0xF37A, 0xF37E, 0x52EA,\n    0xF380, 0xF38B, 0x52EF, 0xF38C, 0xF38C, 0x2675, 0xF38D, 0xF39F, 0x52FB,\n    0xF3A0, 0xF3A0, 0x214C, 0xF3A1, 0xF3FE, 0x1C41, 0xF440, 0xF444, 0x530E,\n    0xF445, 0xF445, 0x267A, 0xF446, 0xF44F, 0x5313, 0xF450, 0xF450, 0x26A0,\n    0xF451, 0xF456, 0x531D, 0xF457, 0xF457, 0x2668, 0xF458, 0xF458, 0x5323,\n    0xF459, 0xF459, 0x1ED0, 0xF45A, 0xF45A, 0x5324, 0xF45B, 0xF45B, 0x2096,\n    0xF45C, 0xF45C, 0x5325, 0xF45D, 0xF45D, 0x23CC, 0xF45E, 0xF461, 0x5326,\n    0xF462, 0xF462, 0x23C8, 0xF463, 0xF463, 0x532A, 0xF464, 0xF464, 0x223E,\n    0xF465, 0xF474, 0x532B, 0xF475, 0xF475, 0x2665, 0xF476, 0xF47B, 0x533B,\n    0xF47C, 0xF47C, 0x2664, 0xF47D, 0xF47D, 0x5341, 0xF47E, 0xF47E, 0x2239,\n    0xF480, 0xF493, 0x5342, 0xF494, 0xF494, 0x204A, 0xF495, 0xF498, 0x5356,\n    0xF499, 0xF499, 0x261F, 0xF49A, 0xF49B, 0x535A, 0xF49C, 0xF49C, 0x261E,\n    0xF49D, 0xF4A0, 0x535C, 0xF4A1, 0xF4FE, 0x1C9F, 0xF540, 0xF544, 0x5360,\n    0xF545, 0xF545, 0x2620, 0xF546, 0xF546, 0x5365, 0xF547, 0xF547, 0x2621,\n    0xF548, 0xF551, 0x5366, 0xF552, 0xF552, 0x2622, 0xF553, 0xF553, 0x5370,\n    0xF554, 0xF554, 0x2627, 0xF555, 0xF555, 0x1E39, 0xF556, 0xF556, 0x2625,\n    0xF557, 0xF55D, 0x5371, 0xF55E, 0xF55E, 0x2629, 0xF55F, 0xF560, 0x5378,\n    0xF561, 0xF561, 0x262E, 0xF562, 0xF562, 0x262B, 0xF563, 0xF56D, 0x537A,\n    0xF56E, 0xF56E, 0x262A, 0xF56F, 0xF56F, 0x262D, 0xF570, 0xF570, 0x5385,\n    0xF571, 0xF571, 0x2628, 0xF572, 0xF572, 0x21B9, 0xF573, 0xF57E, 0x5386,\n    0xF580, 0xF584, 0x5392, 0xF585, 0xF585, 0x2636, 0xF586, 0xF586, 0x2630,\n    0xF587, 0xF58B, 0x5397, 0xF58C, 0xF58C, 0x2638, 0xF58D, 0xF58D, 0x539C,\n    0xF58E, 0xF58E, 0x200D, 0xF58F, 0xF58F, 0x2637, 0xF590, 0xF598, 0x539D,\n    0xF599, 0xF599, 0x2645, 0xF59A, 0xF59A, 0x53A6, 0xF59B, 0xF59B, 0x263A,\n    0xF59C, 0xF59F, 0x53A7, 0xF5A0, 0xF5A0, 0x2643, 0xF5A1, 0xF5FE, 0x1CFD,\n    0xF640, 0xF640, 0x53AB, 0xF641, 0xF641, 0x2640, 0xF642, 0xF644, 0x53AC,\n    0xF645, 0xF645, 0x263D, 0xF646, 0xF646, 0x2641, 0xF647, 0xF647, 0x53AF,\n    0xF648, 0xF648, 0x263E, 0xF649, 0xF64A, 0x53B0, 0xF64B, 0xF64B, 0x263F,\n    0xF64C, 0xF64C, 0x1FC0, 0xF64D, 0xF64D, 0x53B2, 0xF64E, 0xF64F, 0x263B,\n    0xF650, 0xF653, 0x53B3, 0xF654, 0xF654, 0x2642, 0xF655, 0xF657, 0x53B7,\n    0xF658, 0xF658, 0x2644, 0xF659, 0xF660, 0x53BA, 0xF661, 0xF661, 0x2639,\n    0xF662, 0xF662, 0x53C2, 0xF663, 0xF663, 0x264C, 0xF664, 0xF66B, 0x53C3,\n    0xF66C, 0xF66C, 0x2647, 0xF66D, 0xF66D, 0x264B, 0xF66E, 0xF670, 0x53CB,\n    0xF671, 0xF671, 0x2649, 0xF672, 0xF673, 0x53CE, 0xF674, 0xF674, 0x2648,\n    0xF675, 0xF675, 0x53D0, 0xF676, 0xF676, 0x264A, 0xF677, 0xF677, 0x2108,\n    0xF678, 0xF67E, 0x53D1, 0xF680, 0xF684, 0x53D8, 0xF685, 0xF685, 0x264D,\n    0xF686, 0xF687, 0x53DD, 0xF688, 0xF688, 0x2634, 0xF689, 0xF689, 0x53DF,\n    0xF68A, 0xF68A, 0x2651, 0xF68B, 0xF68C, 0x53E0, 0xF68D, 0xF68D, 0x2650,\n    0xF68E, 0xF68E, 0x2652, 0xF68F, 0xF691, 0x53E2, 0xF692, 0xF692, 0x264F,\n    0xF693, 0xF695, 0x53E5, 0xF696, 0xF696, 0x2632, 0xF697, 0xF697, 0x264E,\n    0xF698, 0xF698, 0x2653, 0xF699, 0xF699, 0x53E8, 0xF69A, 0xF69A, 0x2657,\n    0xF69B, 0xF69B, 0x53E9, 0xF69C, 0xF69C, 0x2635, 0xF69D, 0xF69D, 0x53EA,\n    0xF69E, 0xF69E, 0x2633, 0xF69F, 0xF69F, 0x53EB, 0xF6A0, 0xF6A0, 0x2656,\n    0xF6A1, 0xF6FE, 0x1D5B, 0xF740, 0xF741, 0x53EC, 0xF742, 0xF742, 0x2654,\n    0xF743, 0xF748, 0x53EE, 0xF749, 0xF749, 0x2658, 0xF74A, 0xF74B, 0x53F4,\n    0xF74C, 0xF74C, 0x2655, 0xF74D, 0xF74D, 0x1E4D, 0xF74E, 0xF755, 0x53F6,\n    0xF756, 0xF756, 0x265B, 0xF757, 0xF757, 0x53FE, 0xF758, 0xF758, 0x265A,\n    0xF759, 0xF759, 0x53FF, 0xF75A, 0xF75A, 0x2659, 0xF75B, 0xF75B, 0x202E,\n    0xF75C, 0xF75C, 0x262F, 0xF75D, 0xF760, 0x5400, 0xF761, 0xF761, 0x2646,\n    0xF762, 0xF762, 0x5404, 0xF763, 0xF763, 0x2626, 0xF764, 0xF76A, 0x5405,\n    0xF76B, 0xF76B, 0x265C, 0xF76C, 0xF770, 0x540C, 0xF771, 0xF771, 0x262C,\n    0xF772, 0xF77B, 0x5411, 0xF77C, 0xF77C, 0x2623, 0xF77D, 0xF77D, 0x541B,\n    0xF77E, 0xF77E, 0x2631, 0xF780, 0xF7A0, 0x541C, 0xF7A1, 0xF7FE, 0x1DB9,\n    0xF840, 0xF841, 0x543D, 0xF842, 0xF842, 0x209C, 0xF843, 0xF845, 0x543F,\n    0xF846, 0xF846, 0x2580, 0xF847, 0xF848, 0x5442, 0xF849, 0xF849, 0x22DC,\n    0xF84A, 0xF84F, 0x5444, 0xF850, 0xF850, 0x1F05, 0xF851, 0xF851, 0x208B,\n    0xF852, 0xF852, 0x544A, 0xF853, 0xF853, 0x2581, 0xF854, 0xF862, 0x544B,\n    0xF863, 0xF863, 0x2583, 0xF864, 0xF864, 0x2582, 0xF865, 0xF865, 0x545A,\n    0xF866, 0xF866, 0x21EE, 0xF867, 0xF871, 0x545B, 0xF872, 0xF872, 0x2182,\n    0xF873, 0xF877, 0x5466, 0xF878, 0xF878, 0x2243, 0xF879, 0xF879, 0x546B,\n    0xF87A, 0xF87A, 0x2587, 0xF87B, 0xF87B, 0x546C, 0xF87C, 0xF87C, 0x2588,\n    0xF87D, 0xF87E, 0x546D, 0xF880, 0xF880, 0x546F, 0xF881, 0xF881, 0x2584,\n    0xF882, 0xF883, 0x5470, 0xF884, 0xF884, 0x21FD, 0xF885, 0xF885, 0x5472,\n    0xF886, 0xF886, 0x21EF, 0xF887, 0xF88C, 0x5473, 0xF88D, 0xF88D, 0x258A,\n    0xF88E, 0xF88E, 0x258C, 0xF88F, 0xF898, 0x5479, 0xF899, 0xF899, 0x1F47,\n    0xF89A, 0xF89C, 0x5483, 0xF89D, 0xF89D, 0x1F1D, 0xF89E, 0xF89F, 0x5486,\n    0xF8A0, 0xF8A0, 0x258D, 0xF940, 0xF94D, 0x5488, 0xF94E, 0xF94E, 0x1FD0,\n    0xF94F, 0xF94F, 0x2592, 0xF950, 0xF950, 0x258F, 0xF951, 0xF958, 0x5496,\n    0xF959, 0xF959, 0x2594, 0xF95A, 0xF95A, 0x1EE0, 0xF95B, 0xF95C, 0x549E,\n    0xF95D, 0xF95D, 0x2591, 0xF95E, 0xF95E, 0x2595, 0xF95F, 0xF966, 0x54A0,\n    0xF967, 0xF967, 0x2597, 0xF968, 0xF968, 0x54A8, 0xF969, 0xF969, 0x20B6,\n    0xF96A, 0xF96B, 0x54A9, 0xF96C, 0xF96C, 0x2598, 0xF96D, 0xF96E, 0x54AB,\n    0xF96F, 0xF96F, 0x20F6, 0xF970, 0xF97E, 0x54AD, 0xF980, 0xF984, 0x54BC,\n    0xF985, 0xF985, 0x2585, 0xF986, 0xF986, 0x54C1, 0xF987, 0xF987, 0x2599,\n    0xF988, 0xF990, 0x54C2, 0xF991, 0xF991, 0x2596, 0xF992, 0xF995, 0x54CB,\n    0xF996, 0xF996, 0x259A, 0xF997, 0xF997, 0x54CF, 0xF998, 0xF998, 0x259B,\n    0xF999, 0xF9A0, 0x54D0, 0xFA40, 0xFA41, 0x54D8, 0xFA42, 0xFA42, 0x259D,\n    0xFA43, 0xFA45, 0x54DA, 0xFA46, 0xFA46, 0x259E, 0xFA47, 0xFA4B, 0x54DD,\n    0xFA4C, 0xFA4C, 0x234C, 0xFA4D, 0xFA50, 0x54E2, 0xFA51, 0xFA51, 0x1F44,\n    0xFA52, 0xFA57, 0x54E6, 0xFA58, 0xFA58, 0x2660, 0xFA59, 0xFA59, 0x25A0,\n    0xFA5A, 0xFA5C, 0x54EC, 0xFA5D, 0xFA5D, 0x259C, 0xFA5E, 0xFA5E, 0x54EF,\n    0xFA5F, 0xFA5F, 0x259F, 0xFA60, 0xFA60, 0x54F0, 0xFA61, 0xFA61, 0x1F6C,\n    0xFA62, 0xFA6F, 0x54F1, 0xFA70, 0xFA70, 0x25A2, 0xFA71, 0xFA73, 0x54FF,\n    0xFA74, 0xFA74, 0x20AE, 0xFA75, 0xFA75, 0x5502, 0xFA76, 0xFA76, 0x258B,\n    0xFA77, 0xFA77, 0x25A3, 0xFA78, 0xFA7E, 0x5503, 0xFA80, 0xFA82, 0x550A,\n    0xFA83, 0xFA83, 0x2589, 0xFA84, 0xFA84, 0x25A5, 0xFA85, 0xFA8C, 0x550D,\n    0xFA8D, 0xFA8D, 0x25A4, 0xFA8E, 0xFA8F, 0x5515, 0xFA90, 0xFA90, 0x25A6,\n    0xFA91, 0xFA91, 0x2593, 0xFA92, 0xFA95, 0x5517, 0xFA96, 0xFA96, 0x25A7,\n    0xFA97, 0xFA97, 0x2222, 0xFA98, 0xFA98, 0x25A9, 0xFA99, 0xFAA0, 0x551B,\n    0xFB40, 0xFB48, 0x5523, 0xFB49, 0xFB49, 0x25A8, 0xFB4A, 0xFB51, 0x552C,\n    0xFB52, 0xFB52, 0x2586, 0xFB53, 0xFB56, 0x5534, 0xFB57, 0xFB57, 0x25A1,\n    0xFB58, 0xFB58, 0x25AA, 0xFB59, 0xFB59, 0x5538, 0xFB5A, 0xFB5A, 0x2590,\n    0xFB5B, 0xFB5B, 0x258E, 0xFB5C, 0xFB74, 0x5539, 0xFB75, 0xFB75, 0x2688,\n    0xFB76, 0xFB78, 0x5552, 0xFB79, 0xFB79, 0x269E, 0xFB7A, 0xFB7A, 0x25FB,\n    0xFB7B, 0xFB7B, 0x5555, 0xFB7C, 0xFB7C, 0x1F8C, 0xFB7D, 0xFB7D, 0x21F4,\n    0xFB7E, 0xFB7E, 0x5556, 0xFB80, 0xFB8F, 0x5557, 0xFB90, 0xFB90, 0x200F,\n    0xFB91, 0xFB9B, 0x5567, 0xFB9C, 0xFB9C, 0x2071, 0xFB9D, 0xFB9E, 0x5572,\n    0xFB9F, 0xFB9F, 0x25F7, 0xFBA0, 0xFBA0, 0x5574, 0xFC40, 0xFC43, 0x5575,\n    0xFC44, 0xFC44, 0x2696, 0xFC45, 0xFC48, 0x5579, 0xFC49, 0xFC49, 0x268F,\n    0xFC4A, 0xFC59, 0x557D, 0xFC5A, 0xFC5A, 0x22DA, 0xFC5B, 0xFC62, 0x558D,\n    0xFC63, 0xFC63, 0x1EC1, 0xFC64, 0xFC67, 0x5595, 0xFC68, 0xFC68, 0x1EB3,\n    0xFC69, 0xFC6E, 0x5599, 0xFC6F, 0xFC6F, 0x266A, 0xFC70, 0xFC70, 0x559F,\n    0xFC71, 0xFC71, 0x268A, 0xFC72, 0xFC73, 0x55A0, 0xFC74, 0xFC74, 0x2669,\n    0xFC75, 0xFC76, 0x55A2, 0xFC77, 0xFC78, 0x2618, 0xFC79, 0xFC7E, 0x55A4,\n    0xFC80, 0xFC82, 0x55AA, 0xFC83, 0xFC83, 0x261A, 0xFC84, 0xFC89, 0x55AD,\n    0xFC8A, 0xFC8A, 0x2673, 0xFC8B, 0xFCA0, 0x55B3, 0xFD40, 0xFD51, 0x55C9,\n    0xFD52, 0xFD52, 0x20C6, 0xFD53, 0xFD53, 0x226B, 0xFD54, 0xFD56, 0x55DB,\n    0xFD57, 0xFD57, 0x24D3, 0xFD58, 0xFD58, 0x1E86, 0xFD59, 0xFD59, 0x55DE,\n    0xFD5A, 0xFD5A, 0x260F, 0xFD5B, 0xFD5E, 0x55DF, 0xFD5F, 0xFD5F, 0x2611,\n    0xFD60, 0xFD61, 0x55E3, 0xFD62, 0xFD62, 0x2613, 0xFD63, 0xFD64, 0x55E5,\n    0xFD65, 0xFD65, 0x2610, 0xFD66, 0xFD66, 0x2612, 0xFD67, 0xFD67, 0x2030,\n    0xFD68, 0xFD68, 0x55E7, 0xFD69, 0xFD69, 0x2671, 0xFD6A, 0xFD6B, 0x55E8,\n    0xFD6C, 0xFD6C, 0x2614, 0xFD6D, 0xFD6F, 0x55EA, 0xFD70, 0xFD70, 0x2616,\n    0xFD71, 0xFD71, 0x55ED, 0xFD72, 0xFD72, 0x2615, 0xFD73, 0xFD77, 0x55EE,\n    0xFD78, 0xFD78, 0x20F2, 0xFD79, 0xFD7C, 0x55F3, 0xFD7D, 0xFD7D, 0x2617,\n    0xFD7E, 0xFD7E, 0x55F7, 0xFD80, 0xFD87, 0x55F8, 0xFD88, 0xFD88, 0x2037,\n    0xFD89, 0xFD8A, 0x5600, 0xFD8B, 0xFD8B, 0x20B3, 0xFD8C, 0xFD8E, 0x5602,\n    0xFD8F, 0xFD8F, 0x1F22, 0xFD90, 0xFD90, 0x24ED, 0xFD91, 0xFD93, 0x5605,\n    0xFD94, 0xFD94, 0x1F34, 0xFD95, 0xFD9C, 0x5608, 0xFD9D, 0xFD9D, 0x0A02,\n    0xFD9E, 0xFD9E, 0x40D3, 0xFD9F, 0xFD9F, 0x200C, 0xFDA0, 0xFDA0, 0x5083,\n    0xFE40, 0xFE40, 0x1259, 0xFE41, 0xFE7E, 0x5610, 0xFE80, 0xFEA0, 0x564E,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-V_2.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_GBK_EUC_V_2[20 * 3] = {\n    0xA1A2, 0xA1A2, 0x023F, 0xA1A3, 0xA1A3, 0x023E, 0xA1AA, 0xA1AA, 0x0256,\n    0xA1AB, 0xA1AC, 0x1E18, 0xA1AD, 0xA1AD, 0x0257, 0xA1B2, 0xA1BF, 0x0246,\n    0xA1FE, 0xA1FE, 0x1E1A, 0xA3A1, 0xA3A1, 0x0242, 0xA3A8, 0xA3A9, 0x0244,\n    0xA3AC, 0xA3AC, 0x023D, 0xA3AE, 0xA3AE, 0x1E1B, 0xA3BA, 0xA3BB, 0x0240,\n    0xA3BD, 0xA3BD, 0x1E1C, 0xA3BF, 0xA3BF, 0x0243, 0xA3DB, 0xA3DB, 0x1E1D,\n    0xA3DD, 0xA3DD, 0x1E1E, 0xA3DF, 0xA3DF, 0x0258, 0xA3FB, 0xA3FB, 0x0254,\n    0xA3FD, 0xA3FD, 0x0255, 0xA3FE, 0xA3FE, 0x1E1F,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/GB1/GBK2K-H_5.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_GBK2K_H_5[4071 * 3] = {\n    0x0020, 0x007E, 0x0001, 0x8140, 0x8178, 0x2758, 0x8179, 0x8179, 0x2059,\n    0x817A, 0x817E, 0x2791, 0x8180, 0x8185, 0x2796, 0x8186, 0x8186, 0x21F1,\n    0x8187, 0x81EC, 0x279C, 0x81ED, 0x81ED, 0x1FF2, 0x81EE, 0x81F5, 0x2802,\n    0x81F6, 0x81F6, 0x205D, 0x81F7, 0x81FE, 0x280A, 0x8240, 0x8252, 0x2812,\n    0x8253, 0x8253, 0x269C, 0x8254, 0x8261, 0x2825, 0x8262, 0x8262, 0x21B5,\n    0x8263, 0x8273, 0x2833, 0x8274, 0x8274, 0x22CC, 0x8275, 0x8279, 0x2844,\n    0x827A, 0x827A, 0x2016, 0x827B, 0x827C, 0x2849, 0x827D, 0x827D, 0x1E62,\n    0x827E, 0x827E, 0x284B, 0x8280, 0x8280, 0x1F20, 0x8281, 0x8282, 0x284C,\n    0x8283, 0x8283, 0x207F, 0x8284, 0x828F, 0x284E, 0x8290, 0x8290, 0x205C,\n    0x8291, 0x82A4, 0x285A, 0x82A5, 0x82A5, 0x2194, 0x82A6, 0x82C7, 0x286E,\n    0x82C8, 0x82C8, 0x1E65, 0x82C9, 0x82C9, 0x2281, 0x82CA, 0x82E0, 0x2890,\n    0x82E1, 0x82E1, 0x22CD, 0x82E2, 0x82E2, 0x28A7, 0x82E3, 0x82E3, 0x210A,\n    0x82E4, 0x82E4, 0x1E3E, 0x82E5, 0x82EC, 0x28A8, 0x82ED, 0x82ED, 0x267F,\n    0x82EE, 0x82F1, 0x28B0, 0x82F2, 0x82F2, 0x222E, 0x82F3, 0x82F6, 0x28B4,\n    0x82F7, 0x82F7, 0x1E96, 0x82F8, 0x82F8, 0x22CB, 0x82F9, 0x82F9, 0x226C,\n    0x82FA, 0x82FA, 0x28B8, 0x82FB, 0x82FB, 0x2117, 0x82FC, 0x82FE, 0x28B9,\n    0x8340, 0x8340, 0x28BC, 0x8341, 0x8341, 0x20E8, 0x8342, 0x8344, 0x28BD,\n    0x8345, 0x8345, 0x22D4, 0x8346, 0x8347, 0x28C0, 0x8348, 0x8348, 0x1FB9,\n    0x8349, 0x834B, 0x28C2, 0x834C, 0x834C, 0x22D8, 0x834D, 0x8352, 0x28C5,\n    0x8353, 0x8353, 0x20DF, 0x8354, 0x8356, 0x28CB, 0x8357, 0x8357, 0x20C2,\n    0x8358, 0x835D, 0x28CE, 0x835E, 0x835E, 0x2195, 0x835F, 0x8364, 0x28D4,\n    0x8365, 0x8365, 0x1FAC, 0x8366, 0x8366, 0x22D3, 0x8367, 0x8371, 0x28DA,\n    0x8372, 0x8372, 0x1F81, 0x8373, 0x8377, 0x28E5, 0x8378, 0x8378, 0x2210,\n    0x8379, 0x8379, 0x28EA, 0x837A, 0x837A, 0x22CF, 0x837B, 0x837B, 0x28EB,\n    0x837C, 0x837C, 0x2213, 0x837D, 0x837D, 0x28EC, 0x837E, 0x837E, 0x1FE4,\n    0x8380, 0x8380, 0x1F90, 0x8381, 0x8385, 0x28ED, 0x8386, 0x8386, 0x22D6,\n    0x8387, 0x8388, 0x28F2, 0x8389, 0x8389, 0x22D0, 0x838A, 0x838A, 0x22CE,\n    0x838B, 0x838C, 0x28F4, 0x838D, 0x838D, 0x2681, 0x838E, 0x8393, 0x28F6,\n    0x8394, 0x8394, 0x1E76, 0x8395, 0x839D, 0x28FC, 0x839E, 0x839E, 0x2231,\n    0x839F, 0x83A5, 0x2905, 0x83A6, 0x83A6, 0x1E93, 0x83A7, 0x83AA, 0x290C,\n    0x83AB, 0x83AB, 0x22D2, 0x83AC, 0x83AD, 0x2910, 0x83AE, 0x83AE, 0x22D7,\n    0x83AF, 0x83AF, 0x22D5, 0x83B0, 0x83B0, 0x22D1, 0x83B1, 0x83B9, 0x2912,\n    0x83BA, 0x83BA, 0x1EE5, 0x83BB, 0x83C8, 0x291B, 0x83C9, 0x83C9, 0x2025,\n    0x83CA, 0x83F5, 0x2929, 0x83F6, 0x83F6, 0x1ECF, 0x83F7, 0x83FE, 0x2955,\n    0x8440, 0x844F, 0x295D, 0x8450, 0x8450, 0x1FD9, 0x8451, 0x8470, 0x296D,\n    0x8471, 0x8471, 0x22C8, 0x8472, 0x8473, 0x298D, 0x8474, 0x8474, 0x2263,\n    0x8475, 0x8476, 0x298F, 0x8477, 0x8477, 0x2683, 0x8478, 0x847E, 0x2991,\n    0x8480, 0x8481, 0x2998, 0x8482, 0x8482, 0x1F17, 0x8483, 0x848D, 0x299A,\n    0x848E, 0x848E, 0x1F2B, 0x848F, 0x8491, 0x29A5, 0x8492, 0x8492, 0x22CA,\n    0x8493, 0x8493, 0x1E99, 0x8494, 0x849C, 0x29A8, 0x849D, 0x849D, 0x1F4F,\n    0x849E, 0x84A0, 0x29B1, 0x84A1, 0x84A1, 0x1FCF, 0x84A2, 0x84A2, 0x2036,\n    0x84A3, 0x84A3, 0x1F3A, 0x84A4, 0x84A4, 0x29B4, 0x84A5, 0x84A5, 0x22C9,\n    0x84A6, 0x84A6, 0x1F99, 0x84A7, 0x84A8, 0x29B5, 0x84A9, 0x84A9, 0x1F75,\n    0x84AA, 0x84C4, 0x29B7, 0x84C5, 0x84C5, 0x1FBE, 0x84C6, 0x84D2, 0x29D2,\n    0x84D3, 0x84D3, 0x1ECD, 0x84D4, 0x84D4, 0x29DF, 0x84D5, 0x84D5, 0x21A9,\n    0x84D6, 0x84D6, 0x29E0, 0x84D7, 0x84D7, 0x21E6, 0x84D8, 0x84D8, 0x29E1,\n    0x84D9, 0x84D9, 0x2127, 0x84DA, 0x84DA, 0x2003, 0x84DB, 0x84DC, 0x29E2,\n    0x84DD, 0x84DD, 0x2132, 0x84DE, 0x84E9, 0x29E4, 0x84EA, 0x84EA, 0x2323,\n    0x84EB, 0x84ED, 0x29F0, 0x84EE, 0x84EE, 0x2011, 0x84EF, 0x84F0, 0x29F3,\n    0x84F1, 0x84F1, 0x20F5, 0x84F2, 0x84FE, 0x29F5, 0x8540, 0x8550, 0x2A02,\n    0x8551, 0x8551, 0x22C5, 0x8552, 0x8552, 0x1F5E, 0x8553, 0x8553, 0x2A13,\n    0x8554, 0x8554, 0x22C6, 0x8555, 0x855D, 0x2A14, 0x855E, 0x855E, 0x20EF,\n    0x855F, 0x8565, 0x2A1D, 0x8566, 0x8566, 0x21D0, 0x8567, 0x857E, 0x2A24,\n    0x8580, 0x8586, 0x2A3C, 0x8587, 0x8587, 0x22C1, 0x8588, 0x858A, 0x2A43,\n    0x858B, 0x858B, 0x1E64, 0x858C, 0x8591, 0x2A46, 0x8592, 0x8592, 0x21F9,\n    0x8593, 0x8595, 0x2A4C, 0x8596, 0x8596, 0x2010, 0x8597, 0x8597, 0x2A4F,\n    0x8598, 0x8598, 0x22C2, 0x8599, 0x85A1, 0x2A50, 0x85A2, 0x85A2, 0x1E5A,\n    0x85A3, 0x85B1, 0x2A59, 0x85B2, 0x85B2, 0x1EA2, 0x85B3, 0x85FE, 0x2A68,\n    0x8640, 0x8649, 0x2AB4, 0x864A, 0x864A, 0x236D, 0x864B, 0x8653, 0x2ABE,\n    0x8654, 0x8654, 0x2247, 0x8655, 0x8667, 0x2AC7, 0x8668, 0x8668, 0x236C,\n    0x8669, 0x867E, 0x2ADA, 0x8680, 0x8695, 0x2AF0, 0x8696, 0x8696, 0x219C,\n    0x8697, 0x8698, 0x2B06, 0x8699, 0x8699, 0x20C9, 0x869A, 0x86A0, 0x2B08,\n    0x86A1, 0x86A1, 0x21F0, 0x86A2, 0x86C9, 0x2B0F, 0x86CA, 0x86CA, 0x210B,\n    0x86CB, 0x86CB, 0x2B37, 0x86CC, 0x86CC, 0x20DE, 0x86CD, 0x86CD, 0x2B38,\n    0x86CE, 0x86CE, 0x1EAA, 0x86CF, 0x86D0, 0x2B39, 0x86D1, 0x86D1, 0x222C,\n    0x86D2, 0x86DB, 0x2B3B, 0x86DC, 0x86DC, 0x20D8, 0x86DD, 0x86DD, 0x22C0,\n    0x86DE, 0x86E0, 0x2B45, 0x86E1, 0x86E1, 0x206F, 0x86E2, 0x86E7, 0x2B48,\n    0x86E8, 0x86E8, 0x21A1, 0x86E9, 0x86ED, 0x2B4E, 0x86EE, 0x86EE, 0x2379,\n    0x86EF, 0x86F3, 0x2B53, 0x86F4, 0x86F4, 0x2372, 0x86F5, 0x86FE, 0x2B58,\n    0x8740, 0x8740, 0x216A, 0x8741, 0x8743, 0x2B62, 0x8744, 0x8744, 0x237C,\n    0x8745, 0x8748, 0x2B65, 0x8749, 0x8749, 0x20B0, 0x874A, 0x874A, 0x2B69,\n    0x874B, 0x874B, 0x237A, 0x874C, 0x874C, 0x1E74, 0x874D, 0x874E, 0x2B6A,\n    0x874F, 0x874F, 0x2377, 0x8750, 0x8756, 0x2B6C, 0x8757, 0x8757, 0x1F4C,\n    0x8758, 0x8759, 0x2B73, 0x875A, 0x875A, 0x2378, 0x875B, 0x875B, 0x21CF,\n    0x875C, 0x875C, 0x2368, 0x875D, 0x875D, 0x2B75, 0x875E, 0x875E, 0x2371,\n    0x875F, 0x875F, 0x2B76, 0x8760, 0x8760, 0x2369, 0x8761, 0x8765, 0x2B77,\n    0x8766, 0x8766, 0x2674, 0x8767, 0x8779, 0x2B7C, 0x877A, 0x877A, 0x236F,\n    0x877B, 0x877C, 0x2B8F, 0x877D, 0x877D, 0x2370, 0x877E, 0x877E, 0x2B91,\n    0x8780, 0x8780, 0x2B92, 0x8781, 0x8781, 0x2376, 0x8782, 0x8782, 0x2373,\n    0x8783, 0x8785, 0x2B93, 0x8786, 0x8786, 0x237F, 0x8787, 0x8787, 0x2B96,\n    0x8788, 0x8788, 0x2374, 0x8789, 0x8789, 0x2B97, 0x878A, 0x878A, 0x20B5,\n    0x878B, 0x878C, 0x2B98, 0x878D, 0x878D, 0x1EDB, 0x878E, 0x878E, 0x2672,\n    0x878F, 0x8792, 0x2B9A, 0x8793, 0x8793, 0x236E, 0x8794, 0x8797, 0x2B9E,\n    0x8798, 0x8798, 0x21B7, 0x8799, 0x879C, 0x2BA2, 0x879D, 0x879D, 0x2375,\n    0x879E, 0x87A2, 0x2BA6, 0x87A3, 0x87A3, 0x2382, 0x87A4, 0x87A6, 0x2BAB,\n    0x87A7, 0x87A7, 0x209E, 0x87A8, 0x87B2, 0x2BAE, 0x87B3, 0x87B3, 0x236B,\n    0x87B4, 0x87B4, 0x2BB9, 0x87B5, 0x87B5, 0x2039, 0x87B6, 0x87BA, 0x2BBA,\n    0x87BB, 0x87BB, 0x269F, 0x87BC, 0x87BE, 0x2BBF, 0x87BF, 0x87BF, 0x237D,\n    0x87C0, 0x87C0, 0x21F5, 0x87C1, 0x87C1, 0x2BC2, 0x87C2, 0x87C2, 0x2381,\n    0x87C3, 0x87C9, 0x2BC3, 0x87CA, 0x87CA, 0x237B, 0x87CB, 0x87CB, 0x237E,\n    0x87CC, 0x87CC, 0x21CC, 0x87CD, 0x87CE, 0x2BCA, 0x87CF, 0x87CF, 0x22DB,\n    0x87D0, 0x87D1, 0x2BCC, 0x87D2, 0x87D2, 0x236A, 0x87D3, 0x87D3, 0x2689,\n    0x87D4, 0x87D4, 0x2BCE, 0x87D5, 0x87D5, 0x2697, 0x87D6, 0x87D9, 0x2BCF,\n    0x87DA, 0x87DA, 0x22A1, 0x87DB, 0x87F6, 0x2BD3, 0x87F7, 0x87F7, 0x2383,\n    0x87F8, 0x87F8, 0x1F3D, 0x87F9, 0x87F9, 0x2BEF, 0x87FA, 0x87FA, 0x218F,\n    0x87FB, 0x87FE, 0x2BF0, 0x8840, 0x8840, 0x2246, 0x8841, 0x8841, 0x2248,\n    0x8842, 0x8843, 0x2BF4, 0x8844, 0x8844, 0x217E, 0x8845, 0x8845, 0x2BF6,\n    0x8846, 0x8846, 0x2180, 0x8847, 0x887E, 0x2BF7, 0x8880, 0x88B9, 0x2C2F,\n    0x88BA, 0x88BA, 0x232A, 0x88BB, 0x88CB, 0x2C69, 0x88CC, 0x88CC, 0x228B,\n    0x88CD, 0x88D3, 0x2C7A, 0x88D4, 0x88D4, 0x1F85, 0x88D5, 0x88D6, 0x2C81,\n    0x88D7, 0x88D7, 0x2325, 0x88D8, 0x88DE, 0x2C83, 0x88DF, 0x88DF, 0x232C,\n    0x88E0, 0x88E4, 0x2C8A, 0x88E5, 0x88E5, 0x232E, 0x88E6, 0x88F1, 0x2C8F,\n    0x88F2, 0x88F2, 0x2205, 0x88F3, 0x88F3, 0x1E38, 0x88F4, 0x88F5, 0x2C9B,\n    0x88F6, 0x88F6, 0x1E73, 0x88F7, 0x88FE, 0x2C9D, 0x8940, 0x894A, 0x2CA5,\n    0x894B, 0x894B, 0x1FE3, 0x894C, 0x894C, 0x2339, 0x894D, 0x894D, 0x2CB0,\n    0x894E, 0x894E, 0x232B, 0x894F, 0x894F, 0x2CB1, 0x8950, 0x8950, 0x232D,\n    0x8951, 0x8953, 0x2CB2, 0x8954, 0x8954, 0x217F, 0x8955, 0x895C, 0x2CB5,\n    0x895D, 0x895D, 0x21A7, 0x895E, 0x895E, 0x2CBD, 0x895F, 0x895F, 0x232F,\n    0x8960, 0x896C, 0x2CBE, 0x896D, 0x896D, 0x1E7D, 0x896E, 0x8970, 0x2CCB,\n    0x8971, 0x8971, 0x20D6, 0x8972, 0x897B, 0x2CCE, 0x897C, 0x897C, 0x1EC2,\n    0x897D, 0x897E, 0x2CD8, 0x8980, 0x898A, 0x2CDA, 0x898B, 0x898B, 0x22B2,\n    0x898C, 0x8998, 0x2CE5, 0x8999, 0x8999, 0x1EDF, 0x899A, 0x899D, 0x2CF2,\n    0x899E, 0x899E, 0x1EF9, 0x899F, 0x89A5, 0x2CF6, 0x89A6, 0x89A6, 0x20D9,\n    0x89A7, 0x89A7, 0x2CFD, 0x89A8, 0x89A8, 0x1FDD, 0x89A9, 0x89AE, 0x2CFE,\n    0x89AF, 0x89AF, 0x2167, 0x89B0, 0x89B9, 0x2D04, 0x89BA, 0x89BA, 0x21ED,\n    0x89BB, 0x89BD, 0x2D0E, 0x89BE, 0x89BE, 0x2007, 0x89BF, 0x89BF, 0x2326,\n    0x89C0, 0x89C0, 0x2329, 0x89C1, 0x89C3, 0x2D11, 0x89C4, 0x89C4, 0x1F52,\n    0x89C5, 0x89C5, 0x203B, 0x89C6, 0x89C6, 0x2328, 0x89C7, 0x89C7, 0x2D14,\n    0x89C8, 0x89C8, 0x2327, 0x89C9, 0x89CD, 0x2D15, 0x89CE, 0x89CE, 0x1E2B,\n    0x89CF, 0x89D0, 0x2D1A, 0x89D1, 0x89D1, 0x22AE, 0x89D2, 0x89D7, 0x2D1C,\n    0x89D8, 0x89D8, 0x1F49, 0x89D9, 0x89DA, 0x2D22, 0x89DB, 0x89DB, 0x2138,\n    0x89DC, 0x89F3, 0x2D24, 0x89F4, 0x89F4, 0x2081, 0x89F5, 0x89FE, 0x2D3C,\n    0x8A40, 0x8A40, 0x2D46, 0x8A41, 0x8A41, 0x1F7C, 0x8A42, 0x8A58, 0x2D47,\n    0x8A59, 0x8A59, 0x235B, 0x8A5A, 0x8A5A, 0x1EDE, 0x8A5B, 0x8A5B, 0x2D5E,\n    0x8A5C, 0x8A5C, 0x1FA2, 0x8A5D, 0x8A5D, 0x2D5F, 0x8A5E, 0x8A5E, 0x1EFA,\n    0x8A5F, 0x8A78, 0x2D60, 0x8A79, 0x8A79, 0x22AD, 0x8A7A, 0x8A7E, 0x2D7A,\n    0x8A80, 0x8AE3, 0x2D7F, 0x8AE4, 0x8AE4, 0x203F, 0x8AE5, 0x8AFE, 0x2DE3,\n    0x8B40, 0x8B43, 0x2DFD, 0x8B44, 0x8B44, 0x1F0E, 0x8B45, 0x8B48, 0x2E01,\n    0x8B49, 0x8B49, 0x23F9, 0x8B4A, 0x8B79, 0x2E05, 0x8B7A, 0x8B7A, 0x23FC,\n    0x8B7B, 0x8B7E, 0x2E35, 0x8B80, 0x8B8B, 0x2E39, 0x8B8C, 0x8B8C, 0x2069,\n    0x8B8D, 0x8B9D, 0x2E45, 0x8B9E, 0x8B9E, 0x23F7, 0x8B9F, 0x8BB2, 0x2E56,\n    0x8BB3, 0x8BB3, 0x23F6, 0x8BB4, 0x8BB8, 0x2E6A, 0x8BB9, 0x8BB9, 0x23FD,\n    0x8BBA, 0x8BBD, 0x2E6F, 0x8BBE, 0x8BBE, 0x23F8, 0x8BBF, 0x8BC5, 0x2E73,\n    0x8BC6, 0x8BC6, 0x23FA, 0x8BC7, 0x8BC7, 0x2E7A, 0x8BC8, 0x8BC8, 0x23FE,\n    0x8BC9, 0x8BC9, 0x1FA8, 0x8BCA, 0x8BD3, 0x2E7B, 0x8BD4, 0x8BD4, 0x2401,\n    0x8BD5, 0x8BDB, 0x2E85, 0x8BDC, 0x8BDC, 0x23FF, 0x8BDD, 0x8BE4, 0x2E8C,\n    0x8BE5, 0x8BE5, 0x2400, 0x8BE6, 0x8BEA, 0x2E94, 0x8BEB, 0x8BEB, 0x2221,\n    0x8BEC, 0x8BEF, 0x2E99, 0x8BF0, 0x8BF0, 0x2122, 0x8BF1, 0x8BFE, 0x2E9D,\n    0x8C40, 0x8C43, 0x2EAB, 0x8C44, 0x8C44, 0x23FB, 0x8C45, 0x8C4E, 0x2EAF,\n    0x8C4F, 0x8C4F, 0x215A, 0x8C50, 0x8C56, 0x2EB9, 0x8C57, 0x8C57, 0x21E5,\n    0x8C58, 0x8C5B, 0x2EC0, 0x8C5C, 0x8C5C, 0x2057, 0x8C5D, 0x8C7E, 0x2EC4,\n    0x8C80, 0x8C8A, 0x2EE6, 0x8C8B, 0x8C8B, 0x20E5, 0x8C8C, 0x8C8C, 0x2EF1,\n    0x8C8D, 0x8C8D, 0x212F, 0x8C8E, 0x8C8E, 0x20A3, 0x8C8F, 0x8C8F, 0x2121,\n    0x8C90, 0x8C90, 0x2EF2, 0x8C91, 0x8C91, 0x21D4, 0x8C92, 0x8C92, 0x1FE5,\n    0x8C93, 0x8C98, 0x2EF3, 0x8C99, 0x8C99, 0x1E8A, 0x8C9A, 0x8C9A, 0x1E37,\n    0x8C9B, 0x8CA1, 0x2EF9, 0x8CA2, 0x8CA2, 0x1F9E, 0x8CA3, 0x8CA3, 0x22A6,\n    0x8CA4, 0x8CA4, 0x21E8, 0x8CA5, 0x8CA5, 0x2F00, 0x8CA6, 0x8CA6, 0x1EDA,\n    0x8CA7, 0x8CA7, 0x1EB9, 0x8CA8, 0x8CBF, 0x2F01, 0x8CC0, 0x8CC0, 0x235C,\n    0x8CC1, 0x8CD1, 0x2F19, 0x8CD2, 0x8CD2, 0x2050, 0x8CD3, 0x8CD3, 0x1E67,\n    0x8CD4, 0x8CD4, 0x2F2A, 0x8CD5, 0x8CD5, 0x23F4, 0x8CD6, 0x8CD8, 0x2F2B,\n    0x8CD9, 0x8CD9, 0x213E, 0x8CDA, 0x8CF8, 0x2F2E, 0x8CF9, 0x8CF9, 0x1F16,\n    0x8CFA, 0x8CFE, 0x2F4D, 0x8D40, 0x8D72, 0x2F52, 0x8D73, 0x8D73, 0x2389,\n    0x8D74, 0x8D74, 0x2F85, 0x8D75, 0x8D75, 0x1EB7, 0x8D76, 0x8D7A, 0x2F86,\n    0x8D7B, 0x8D7B, 0x21B4, 0x8D7C, 0x8D7E, 0x2F8B, 0x8D80, 0x8D87, 0x2F8E,\n    0x8D88, 0x8D88, 0x238F, 0x8D89, 0x8D8E, 0x2F96, 0x8D8F, 0x8D8F, 0x1F1A,\n    0x8D90, 0x8D9D, 0x2F9C, 0x8D9E, 0x8D9E, 0x238B, 0x8D9F, 0x8DB8, 0x2FAA,\n    0x8DB9, 0x8DB9, 0x238A, 0x8DBA, 0x8DE1, 0x2FC4, 0x8DE2, 0x8DE2, 0x2391,\n    0x8DE3, 0x8DE3, 0x2FEC, 0x8DE4, 0x8DE4, 0x2271, 0x8DE5, 0x8DE6, 0x2FED,\n    0x8DE7, 0x8DE7, 0x2388, 0x8DE8, 0x8DF6, 0x2FEF, 0x8DF7, 0x8DF7, 0x238E,\n    0x8DF8, 0x8DFD, 0x2FFE, 0x8DFE, 0x8DFE, 0x238D, 0x8E40, 0x8E45, 0x3004,\n    0x8E46, 0x8E46, 0x238C, 0x8E47, 0x8E55, 0x300A, 0x8E56, 0x8E56, 0x2390,\n    0x8E57, 0x8E57, 0x3019, 0x8E58, 0x8E58, 0x2033, 0x8E59, 0x8E59, 0x301A,\n    0x8E5A, 0x8E5A, 0x223C, 0x8E5B, 0x8E67, 0x301B, 0x8E68, 0x8E68, 0x1FE9,\n    0x8E69, 0x8E6D, 0x3028, 0x8E6E, 0x8E6E, 0x2055, 0x8E6F, 0x8E6F, 0x302D,\n    0x8E70, 0x8E70, 0x2392, 0x8E71, 0x8E7E, 0x302E, 0x8E80, 0x8E80, 0x2324,\n    0x8E81, 0x8E9A, 0x303C, 0x8E9B, 0x8E9B, 0x2143, 0x8E9C, 0x8E9E, 0x3056,\n    0x8E9F, 0x8E9F, 0x2129, 0x8EA0, 0x8EA3, 0x3059, 0x8EA4, 0x8EA4, 0x2277,\n    0x8EA5, 0x8EA6, 0x305D, 0x8EA7, 0x8EA7, 0x1EA7, 0x8EA8, 0x8EAB, 0x305F,\n    0x8EAC, 0x8EAC, 0x2285, 0x8EAD, 0x8EAD, 0x3063, 0x8EAE, 0x8EAE, 0x2384,\n    0x8EAF, 0x8EBC, 0x3064, 0x8EBD, 0x8EBD, 0x2387, 0x8EBE, 0x8EBE, 0x2386,\n    0x8EBF, 0x8EC2, 0x3072, 0x8EC3, 0x8EC3, 0x2290, 0x8EC4, 0x8EC4, 0x3076,\n    0x8EC5, 0x8EC5, 0x1E44, 0x8EC6, 0x8ECC, 0x3077, 0x8ECD, 0x8ECD, 0x1E32,\n    0x8ECE, 0x8ECE, 0x2385, 0x8ECF, 0x8ED5, 0x307E, 0x8ED6, 0x8ED6, 0x1F13,\n    0x8ED7, 0x8ED7, 0x1F73, 0x8ED8, 0x8EEB, 0x3085, 0x8EEC, 0x8EEC, 0x1FE0,\n    0x8EED, 0x8EFE, 0x3099, 0x8F40, 0x8F51, 0x30AB, 0x8F52, 0x8F52, 0x2087,\n    0x8F53, 0x8F53, 0x1E78, 0x8F54, 0x8F54, 0x23AE, 0x8F55, 0x8F55, 0x1EF6,\n    0x8F56, 0x8F56, 0x1F31, 0x8F57, 0x8F5C, 0x30BD, 0x8F5D, 0x8F5D, 0x2045,\n    0x8F5E, 0x8F63, 0x30C3, 0x8F64, 0x8F64, 0x2178, 0x8F65, 0x8F7E, 0x30C9,\n    0x8F80, 0x8F85, 0x30E3, 0x8F86, 0x8F86, 0x23F5, 0x8F87, 0x8F87, 0x30E9,\n    0x8F88, 0x8F88, 0x2275, 0x8F89, 0x8F94, 0x30EA, 0x8F95, 0x8F95, 0x266E,\n    0x8F96, 0x8F96, 0x30F6, 0x8F97, 0x8F97, 0x1EB0, 0x8F98, 0x8F9A, 0x30F7,\n    0x8F9B, 0x8F9B, 0x2083, 0x8F9C, 0x8F9C, 0x30FA, 0x8F9D, 0x8F9D, 0x2188,\n    0x8F9E, 0x8FA0, 0x30FB, 0x8FA1, 0x8FA1, 0x267C, 0x8FA2, 0x8FBC, 0x30FE,\n    0x8FBD, 0x8FBD, 0x1FC5, 0x8FBE, 0x8FC3, 0x3119, 0x8FC4, 0x8FC4, 0x1EA1,\n    0x8FC5, 0x8FC5, 0x311F, 0x8FC6, 0x8FC6, 0x2393, 0x8FC7, 0x8FCC, 0x3120,\n    0x8FCD, 0x8FCD, 0x1F0B, 0x8FCE, 0x8FD7, 0x3126, 0x8FD8, 0x8FD8, 0x1E7C,\n    0x8FD9, 0x8FFE, 0x3130, 0x9040, 0x907E, 0x3156, 0x9080, 0x909C, 0x3195,\n    0x909D, 0x909D, 0x23B4, 0x909E, 0x909E, 0x207E, 0x909F, 0x90B9, 0x31B2,\n    0x90BA, 0x90BA, 0x1EE3, 0x90BB, 0x90BF, 0x31CD, 0x90C0, 0x90C0, 0x2095,\n    0x90C1, 0x90C1, 0x23BB, 0x90C2, 0x90C4, 0x31D2, 0x90C5, 0x90C5, 0x23B9,\n    0x90C6, 0x90DA, 0x31D5, 0x90DB, 0x90DB, 0x1E28, 0x90DC, 0x90DC, 0x23BD,\n    0x90DD, 0x90EC, 0x31EA, 0x90ED, 0x90ED, 0x23B5, 0x90EE, 0x90EF, 0x31FA,\n    0x90F0, 0x90F0, 0x23BA, 0x90F1, 0x90F6, 0x31FC, 0x90F7, 0x90F7, 0x23B3,\n    0x90F8, 0x90FE, 0x3202, 0x9140, 0x9141, 0x3209, 0x9142, 0x9142, 0x2162,\n    0x9143, 0x914A, 0x320B, 0x914B, 0x914B, 0x1E5E, 0x914C, 0x914C, 0x3213,\n    0x914D, 0x914D, 0x1E5D, 0x914E, 0x9150, 0x3214, 0x9151, 0x9151, 0x23B7,\n    0x9152, 0x9153, 0x3217, 0x9154, 0x9154, 0x1F2F, 0x9155, 0x9155, 0x24DF,\n    0x9156, 0x9158, 0x3219, 0x9159, 0x9159, 0x23B2, 0x915A, 0x915A, 0x214E,\n    0x915B, 0x915C, 0x321C, 0x915D, 0x915D, 0x2052, 0x915E, 0x9160, 0x321E,\n    0x9161, 0x9161, 0x23BC, 0x9162, 0x9162, 0x3221, 0x9163, 0x9163, 0x20EB,\n    0x9164, 0x916D, 0x3222, 0x916E, 0x916E, 0x2232, 0x916F, 0x9175, 0x322C,\n    0x9176, 0x9176, 0x1E3F, 0x9177, 0x9179, 0x3233, 0x917A, 0x917A, 0x201B,\n    0x917B, 0x917B, 0x20BC, 0x917C, 0x917C, 0x23BE, 0x917D, 0x917E, 0x3236,\n    0x9180, 0x9183, 0x3238, 0x9184, 0x9184, 0x1EAE, 0x9185, 0x918C, 0x323C,\n    0x918D, 0x918D, 0x1EFB, 0x918E, 0x9190, 0x3244, 0x9191, 0x9191, 0x2089,\n    0x9192, 0x9192, 0x3247, 0x9193, 0x9193, 0x23B1, 0x9194, 0x9196, 0x3248,\n    0x9197, 0x9197, 0x21C4, 0x9198, 0x919A, 0x324B, 0x919B, 0x919B, 0x2214,\n    0x919C, 0x91A8, 0x324E, 0x91A9, 0x91A9, 0x1FDE, 0x91AA, 0x91AA, 0x2223,\n    0x91AB, 0x91AB, 0x23B6, 0x91AC, 0x91B9, 0x325B, 0x91BA, 0x91BA, 0x268C,\n    0x91BB, 0x91BB, 0x24DE, 0x91BC, 0x91BE, 0x3269, 0x91BF, 0x91BF, 0x24E0,\n    0x91C0, 0x91C2, 0x326C, 0x91C3, 0x91C3, 0x23B8, 0x91C4, 0x91CC, 0x326F,\n    0x91CD, 0x91CD, 0x1E81, 0x91CE, 0x91CF, 0x3278, 0x91D0, 0x91D0, 0x1FFE,\n    0x91D1, 0x91D1, 0x1F51, 0x91D2, 0x91D2, 0x21E1, 0x91D3, 0x91D3, 0x327A,\n    0x91D4, 0x91D4, 0x23B0, 0x91D5, 0x91D5, 0x327B, 0x91D6, 0x91D6, 0x1FCE,\n    0x91D7, 0x91D7, 0x327C, 0x91D8, 0x91D8, 0x211E, 0x91D9, 0x91D9, 0x2021,\n    0x91DA, 0x91DE, 0x327D, 0x91DF, 0x91DF, 0x24E1, 0x91E0, 0x91E1, 0x3282,\n    0x91E2, 0x91E2, 0x24A3, 0x91E3, 0x91E9, 0x3284, 0x91EA, 0x91EA, 0x24A4,\n    0x91EB, 0x91EF, 0x328B, 0x91F0, 0x91F0, 0x2273, 0x91F1, 0x91F1, 0x3290,\n    0x91F2, 0x91F2, 0x21B0, 0x91F3, 0x91FE, 0x3291, 0x9240, 0x927E, 0x329D,\n    0x9280, 0x92B5, 0x32DC, 0x92B6, 0x92B6, 0x21D1, 0x92B7, 0x92CD, 0x3312,\n    0x92CE, 0x92CE, 0x211C, 0x92CF, 0x92CF, 0x3329, 0x92D0, 0x92D0, 0x235D,\n    0x92D1, 0x92D3, 0x332A, 0x92D4, 0x92D4, 0x2682, 0x92D5, 0x92DE, 0x332D,\n    0x92DF, 0x92DF, 0x210D, 0x92E0, 0x92E0, 0x205A, 0x92E1, 0x92FD, 0x3337,\n    0x92FE, 0x92FE, 0x1F8D, 0x9340, 0x934F, 0x3354, 0x9350, 0x9350, 0x21FF,\n    0x9351, 0x935C, 0x3364, 0x935D, 0x935D, 0x1F58, 0x935E, 0x936F, 0x3370,\n    0x9370, 0x9370, 0x215B, 0x9371, 0x9375, 0x3382, 0x9376, 0x9376, 0x1EB6,\n    0x9377, 0x937E, 0x3387, 0x9380, 0x938B, 0x338F, 0x938C, 0x938C, 0x20DB,\n    0x938D, 0x939C, 0x339B, 0x939D, 0x939D, 0x2360, 0x939E, 0x93A4, 0x33AB,\n    0x93A5, 0x93A5, 0x2361, 0x93A6, 0x93A6, 0x33B2, 0x93A7, 0x93A7, 0x2040,\n    0x93A8, 0x93B3, 0x33B3, 0x93B4, 0x93B4, 0x228E, 0x93B5, 0x93B7, 0x33BF,\n    0x93B8, 0x93B8, 0x1FDF, 0x93B9, 0x93BA, 0x33C2, 0x93BB, 0x93BB, 0x235E,\n    0x93BC, 0x93BC, 0x33C4, 0x93BD, 0x93BD, 0x1E6A, 0x93BE, 0x93C5, 0x33C5,\n    0x93C6, 0x93C6, 0x2002, 0x93C7, 0x93CE, 0x33CD, 0x93CF, 0x93CF, 0x2093,\n    0x93D0, 0x93D6, 0x33D5, 0x93D7, 0x93D7, 0x235F, 0x93D8, 0x93DA, 0x33DC,\n    0x93DB, 0x93DB, 0x1EAC, 0x93DC, 0x93DC, 0x1E54, 0x93DD, 0x93E0, 0x33DF,\n    0x93E1, 0x93E1, 0x1F08, 0x93E2, 0x93E3, 0x33E3, 0x93E4, 0x93E4, 0x20C0,\n    0x93E5, 0x93E5, 0x2362, 0x93E6, 0x93E8, 0x33E5, 0x93E9, 0x93E9, 0x2160,\n    0x93EA, 0x93EA, 0x33E8, 0x93EB, 0x93EB, 0x219D, 0x93EC, 0x93EC, 0x1F8E,\n    0x93ED, 0x93ED, 0x222D, 0x93EE, 0x93EE, 0x33E9, 0x93EF, 0x93EF, 0x2047,\n    0x93F0, 0x93F0, 0x33EA, 0x93F1, 0x93F1, 0x2262, 0x93F2, 0x93F3, 0x33EB,\n    0x93F4, 0x93F4, 0x1F67, 0x93F5, 0x93F5, 0x1EB2, 0x93F6, 0x93F9, 0x33ED,\n    0x93FA, 0x93FA, 0x1EA9, 0x93FB, 0x93FD, 0x33F1, 0x93FE, 0x93FE, 0x1FCC,\n    0x9440, 0x9443, 0x33F4, 0x9444, 0x9444, 0x1F72, 0x9445, 0x944C, 0x33F8,\n    0x944D, 0x944D, 0x2098, 0x944E, 0x944F, 0x3400, 0x9450, 0x9450, 0x1E52,\n    0x9451, 0x9451, 0x20A4, 0x9452, 0x9452, 0x1F1C, 0x9453, 0x9453, 0x228F,\n    0x9454, 0x9454, 0x3402, 0x9455, 0x9455, 0x1FED, 0x9456, 0x9457, 0x3403,\n    0x9458, 0x9458, 0x2365, 0x9459, 0x945A, 0x3405, 0x945B, 0x945B, 0x1E2D,\n    0x945C, 0x945C, 0x2152, 0x945D, 0x945D, 0x2366, 0x945E, 0x945E, 0x3407,\n    0x945F, 0x945F, 0x20FA, 0x9460, 0x9463, 0x3408, 0x9464, 0x9464, 0x2363,\n    0x9465, 0x9465, 0x340C, 0x9466, 0x9466, 0x209A, 0x9467, 0x946D, 0x340D,\n    0x946E, 0x946E, 0x203C, 0x946F, 0x9471, 0x3414, 0x9472, 0x9472, 0x1FF6,\n    0x9473, 0x9473, 0x3417, 0x9474, 0x9474, 0x2364, 0x9475, 0x9475, 0x3418,\n    0x9476, 0x9476, 0x1E69, 0x9477, 0x9477, 0x3419, 0x9478, 0x9478, 0x2367,\n    0x9479, 0x9479, 0x341A, 0x947A, 0x947A, 0x211D, 0x947B, 0x947E, 0x341B,\n    0x9480, 0x9480, 0x2259, 0x9481, 0x9481, 0x2056, 0x9482, 0x9482, 0x2163,\n    0x9483, 0x9486, 0x341F, 0x9487, 0x9487, 0x1FA9, 0x9488, 0x9488, 0x1FFC,\n    0x9489, 0x94A0, 0x3423, 0x94A1, 0x94A1, 0x1E2E, 0x94A2, 0x94B2, 0x343B,\n    0x94B3, 0x94B3, 0x1EBC, 0x94B4, 0x94B4, 0x344C, 0x94B5, 0x94B5, 0x2142,\n    0x94B6, 0x94BE, 0x344D, 0x94BF, 0x94BF, 0x201E, 0x94C0, 0x94C0, 0x1E43,\n    0x94C1, 0x94CB, 0x3456, 0x94CC, 0x94CC, 0x24D4, 0x94CD, 0x94D7, 0x3461,\n    0x94D8, 0x94D8, 0x226F, 0x94D9, 0x94DF, 0x346C, 0x94E0, 0x94E0, 0x1ED7,\n    0x94E1, 0x94FE, 0x3473, 0x9540, 0x9571, 0x3491, 0x9572, 0x9572, 0x212D,\n    0x9573, 0x957E, 0x34C3, 0x9580, 0x9582, 0x34CF, 0x9583, 0x9583, 0x229B,\n    0x9584, 0x959D, 0x34D2, 0x959E, 0x959E, 0x2256, 0x959F, 0x959F, 0x24A8,\n    0x95A0, 0x95B2, 0x34EC, 0x95B3, 0x95B3, 0x1E79, 0x95B4, 0x95B9, 0x34FF,\n    0x95BA, 0x95BA, 0x225A, 0x95BB, 0x95CE, 0x3505, 0x95CF, 0x95CF, 0x24A7,\n    0x95D0, 0x95D0, 0x3519, 0x95D1, 0x95D1, 0x2686, 0x95D2, 0x95D2, 0x24A6,\n    0x95D3, 0x95D3, 0x351A, 0x95D4, 0x95D4, 0x21CE, 0x95D5, 0x95E0, 0x351B,\n    0x95E1, 0x95E1, 0x24A9, 0x95E2, 0x95E6, 0x3527, 0x95E7, 0x95E7, 0x1FE7,\n    0x95E8, 0x95F0, 0x352C, 0x95F1, 0x95F1, 0x2112, 0x95F2, 0x95F7, 0x3535,\n    0x95F8, 0x95F8, 0x213C, 0x95F9, 0x95FD, 0x353B, 0x95FE, 0x95FE, 0x1F5C,\n    0x9640, 0x9655, 0x3540, 0x9656, 0x9656, 0x24C4, 0x9657, 0x967B, 0x3556,\n    0x967C, 0x967C, 0x1ECC, 0x967D, 0x967E, 0x357B, 0x9680, 0x96FE, 0x357D,\n    0x9740, 0x9766, 0x35FC, 0x9767, 0x9767, 0x246A, 0x9768, 0x976B, 0x3623,\n    0x976C, 0x976C, 0x2175, 0x976D, 0x976D, 0x3627, 0x976E, 0x976E, 0x246D,\n    0x976F, 0x977E, 0x3628, 0x9780, 0x9795, 0x3638, 0x9796, 0x9796, 0x246B,\n    0x9797, 0x9797, 0x225F, 0x9798, 0x979C, 0x364E, 0x979D, 0x979D, 0x1ECE,\n    0x979E, 0x97A2, 0x3653, 0x97A3, 0x97A3, 0x2272, 0x97A4, 0x97BE, 0x3658,\n    0x97BF, 0x97BF, 0x2473, 0x97C0, 0x97ED, 0x3673, 0x97EE, 0x97EE, 0x21FE,\n    0x97EF, 0x97F6, 0x36A1, 0x97F7, 0x97F7, 0x1EFE, 0x97F8, 0x97FE, 0x36A9,\n    0x9840, 0x9844, 0x36B0, 0x9845, 0x9845, 0x2475, 0x9846, 0x9848, 0x36B5,\n    0x9849, 0x9849, 0x220A, 0x984A, 0x984E, 0x36B8, 0x984F, 0x984F, 0x1F6F,\n    0x9850, 0x9870, 0x36BD, 0x9871, 0x9871, 0x2468, 0x9872, 0x9872, 0x36DE,\n    0x9873, 0x9873, 0x2100, 0x9874, 0x987E, 0x36DF, 0x9880, 0x9880, 0x36EA,\n    0x9881, 0x9881, 0x2476, 0x9882, 0x988A, 0x36EB, 0x988B, 0x988B, 0x1F27,\n    0x988C, 0x988C, 0x20D7, 0x988D, 0x989F, 0x36F4, 0x98A0, 0x98A0, 0x247C,\n    0x98A1, 0x98A9, 0x3707, 0x98AA, 0x98AA, 0x1FA1, 0x98AB, 0x98B5, 0x3710,\n    0x98B6, 0x98B6, 0x22AA, 0x98B7, 0x98B7, 0x2005, 0x98B8, 0x98B9, 0x371B,\n    0x98BA, 0x98BA, 0x246C, 0x98BB, 0x98C6, 0x371D, 0x98C7, 0x98C7, 0x203E,\n    0x98C8, 0x98CA, 0x3729, 0x98CB, 0x98CB, 0x1E4C, 0x98CC, 0x98CF, 0x372C,\n    0x98D0, 0x98D0, 0x213A, 0x98D1, 0x98D2, 0x3730, 0x98D3, 0x98D3, 0x2204,\n    0x98D4, 0x98E2, 0x3732, 0x98E3, 0x98E3, 0x20C3, 0x98E4, 0x98E4, 0x2140,\n    0x98E5, 0x98E5, 0x2477, 0x98E6, 0x98EE, 0x3741, 0x98EF, 0x98EF, 0x2474,\n    0x98F0, 0x98F1, 0x374A, 0x98F2, 0x98F2, 0x20DD, 0x98F3, 0x98FE, 0x374C,\n    0x9940, 0x9942, 0x3758, 0x9943, 0x9943, 0x1F68, 0x9944, 0x9944, 0x375B,\n    0x9945, 0x9945, 0x2185, 0x9946, 0x9965, 0x375C, 0x9966, 0x9966, 0x2472,\n    0x9967, 0x996D, 0x377C, 0x996E, 0x996E, 0x1EB5, 0x996F, 0x9974, 0x3783,\n    0x9975, 0x9975, 0x2478, 0x9976, 0x9979, 0x3789, 0x997A, 0x997A, 0x1F8B,\n    0x997B, 0x997B, 0x2484, 0x997C, 0x997E, 0x378D, 0x9980, 0x9984, 0x3790,\n    0x9985, 0x9985, 0x2699, 0x9986, 0x9988, 0x3795, 0x9989, 0x9989, 0x2482,\n    0x998A, 0x998D, 0x3798, 0x998E, 0x998E, 0x20A1, 0x998F, 0x9990, 0x379C,\n    0x9991, 0x9991, 0x1F92, 0x9992, 0x9998, 0x379E, 0x9999, 0x9999, 0x1F38,\n    0x999A, 0x99A8, 0x37A5, 0x99A9, 0x99A9, 0x2485, 0x99AA, 0x99AF, 0x37B4,\n    0x99B0, 0x99B0, 0x2480, 0x99B1, 0x99B1, 0x246E, 0x99B2, 0x99B2, 0x37BA,\n    0x99B3, 0x99B3, 0x247B, 0x99B4, 0x99B4, 0x2486, 0x99B5, 0x99B5, 0x2471,\n    0x99B6, 0x99BC, 0x37BB, 0x99BD, 0x99BD, 0x2483, 0x99BE, 0x99BE, 0x2470,\n    0x99BF, 0x99BF, 0x37C2, 0x99C0, 0x99C0, 0x2469, 0x99C1, 0x99C1, 0x37C3,\n    0x99C2, 0x99C2, 0x247F, 0x99C3, 0x99C8, 0x37C4, 0x99C9, 0x99C9, 0x246F,\n    0x99CA, 0x99CD, 0x37CA, 0x99CE, 0x99CE, 0x2481, 0x99CF, 0x99D0, 0x37CE,\n    0x99D1, 0x99D1, 0x2220, 0x99D2, 0x99D9, 0x37D0, 0x99DA, 0x99DA, 0x1FF5,\n    0x99DB, 0x99DF, 0x37D8, 0x99E0, 0x99E0, 0x20F4, 0x99E1, 0x99E4, 0x37DD,\n    0x99E5, 0x99E5, 0x247D, 0x99E6, 0x99E7, 0x37E1, 0x99E8, 0x99E8, 0x2479,\n    0x99E9, 0x99EB, 0x37E3, 0x99EC, 0x99EC, 0x247E, 0x99ED, 0x99F3, 0x37E6,\n    0x99F4, 0x99F4, 0x247A, 0x99F5, 0x99FE, 0x37ED, 0x9A40, 0x9A49, 0x37F7,\n    0x9A4A, 0x9A4A, 0x20E3, 0x9A4B, 0x9A56, 0x3801, 0x9A57, 0x9A57, 0x20AD,\n    0x9A58, 0x9A64, 0x380D, 0x9A65, 0x9A65, 0x24CB, 0x9A66, 0x9A66, 0x381A,\n    0x9A67, 0x9A67, 0x1F53, 0x9A68, 0x9A70, 0x381B, 0x9A71, 0x9A71, 0x2159,\n    0x9A72, 0x9A75, 0x3824, 0x9A76, 0x9A76, 0x2013, 0x9A77, 0x9A77, 0x1F33,\n    0x9A78, 0x9A7E, 0x3828, 0x9A80, 0x9A87, 0x382F, 0x9A88, 0x9A88, 0x1E5C,\n    0x9A89, 0x9A8B, 0x3837, 0x9A8C, 0x9A8C, 0x2488, 0x9A8D, 0x9A90, 0x383A,\n    0x9A91, 0x9A91, 0x2487, 0x9A92, 0x9A96, 0x383E, 0x9A97, 0x9A97, 0x248A,\n    0x9A98, 0x9A99, 0x3843, 0x9A9A, 0x9A9A, 0x2489, 0x9A9B, 0x9A9B, 0x248B,\n    0x9A9C, 0x9A9D, 0x3845, 0x9A9E, 0x9A9E, 0x1F83, 0x9A9F, 0x9AA1, 0x3847,\n    0x9AA2, 0x9AA2, 0x210F, 0x9AA3, 0x9AA3, 0x1FDB, 0x9AA4, 0x9AA9, 0x384A,\n    0x9AAA, 0x9AAA, 0x20AF, 0x9AAB, 0x9ACF, 0x3850, 0x9AD0, 0x9AD0, 0x24C0,\n    0x9AD1, 0x9AD5, 0x3875, 0x9AD6, 0x9AD6, 0x226D, 0x9AD7, 0x9AD9, 0x387A,\n    0x9ADA, 0x9ADA, 0x24C1, 0x9ADB, 0x9AE1, 0x387D, 0x9AE2, 0x9AE2, 0x20CA,\n    0x9AE3, 0x9AE3, 0x3884, 0x9AE4, 0x9AE4, 0x20E7, 0x9AE5, 0x9AE5, 0x24C2,\n    0x9AE6, 0x9AFE, 0x3885, 0x9B40, 0x9B7E, 0x389E, 0x9B80, 0x9BD0, 0x38DD,\n    0x9BD1, 0x9BD1, 0x23DC, 0x9BD2, 0x9BDB, 0x392E, 0x9BDC, 0x9BDC, 0x23DB,\n    0x9BDD, 0x9BFE, 0x3938, 0x9C40, 0x9C52, 0x395A, 0x9C53, 0x9C53, 0x205E,\n    0x9C54, 0x9C58, 0x396D, 0x9C59, 0x9C59, 0x2244, 0x9C5A, 0x9C5A, 0x23E2,\n    0x9C5B, 0x9C5B, 0x3972, 0x9C5C, 0x9C5C, 0x20D4, 0x9C5D, 0x9C74, 0x3973,\n    0x9C75, 0x9C75, 0x219F, 0x9C76, 0x9C78, 0x398B, 0x9C79, 0x9C79, 0x1E66,\n    0x9C7A, 0x9C7E, 0x398E, 0x9C80, 0x9C85, 0x3993, 0x9C86, 0x9C86, 0x1F63,\n    0x9C87, 0x9C9C, 0x3999, 0x9C9D, 0x9C9D, 0x23DD, 0x9C9E, 0x9CAA, 0x39AF,\n    0x9CAB, 0x9CAB, 0x216B, 0x9CAC, 0x9CC9, 0x39BC, 0x9CCA, 0x9CCA, 0x22B5,\n    0x9CCB, 0x9CCE, 0x39DA, 0x9CCF, 0x9CCF, 0x1F26, 0x9CD0, 0x9CE5, 0x39DE,\n    0x9CE6, 0x9CE6, 0x1E63, 0x9CE7, 0x9CE7, 0x2088, 0x9CE8, 0x9CEB, 0x39F4,\n    0x9CEC, 0x9CEC, 0x1EBD, 0x9CED, 0x9CED, 0x39F8, 0x9CEE, 0x9CEE, 0x2341,\n    0x9CEF, 0x9CFA, 0x39F9, 0x9CFB, 0x9CFB, 0x1F4B, 0x9CFC, 0x9CFD, 0x3A05,\n    0x9CFE, 0x9CFE, 0x2292, 0x9D40, 0x9D41, 0x3A07, 0x9D42, 0x9D42, 0x2124,\n    0x9D43, 0x9D45, 0x3A09, 0x9D46, 0x9D46, 0x2048, 0x9D47, 0x9D47, 0x23E0,\n    0x9D48, 0x9D4C, 0x3A0C, 0x9D4D, 0x9D4D, 0x2077, 0x9D4E, 0x9D4E, 0x3A11,\n    0x9D4F, 0x9D4F, 0x223A, 0x9D50, 0x9D60, 0x3A12, 0x9D61, 0x9D61, 0x20B1,\n    0x9D62, 0x9D67, 0x3A23, 0x9D68, 0x9D68, 0x1F41, 0x9D69, 0x9D69, 0x201C,\n    0x9D6A, 0x9D6D, 0x3A29, 0x9D6E, 0x9D6E, 0x22B8, 0x9D6F, 0x9D70, 0x3A2D,\n    0x9D71, 0x9D71, 0x2276, 0x9D72, 0x9D74, 0x3A2F, 0x9D75, 0x9D75, 0x1F9B,\n    0x9D76, 0x9D7A, 0x3A32, 0x9D7B, 0x9D7B, 0x1F9F, 0x9D7C, 0x9D7C, 0x3A37,\n    0x9D7D, 0x9D7D, 0x25CA, 0x9D7E, 0x9D7E, 0x3A38, 0x9D80, 0x9D89, 0x3A39,\n    0x9D8A, 0x9D8A, 0x20BE, 0x9D8B, 0x9D8C, 0x3A43, 0x9D8D, 0x9D8D, 0x1FB4,\n    0x9D8E, 0x9D90, 0x3A45, 0x9D91, 0x9D91, 0x23D7, 0x9D92, 0x9D98, 0x3A48,\n    0x9D99, 0x9D99, 0x2105, 0x9D9A, 0x9DA0, 0x3A4F, 0x9DA1, 0x9DA1, 0x23E1,\n    0x9DA2, 0x9DA2, 0x1FEC, 0x9DA3, 0x9DA6, 0x3A56, 0x9DA7, 0x9DA7, 0x23EA,\n    0x9DA8, 0x9DAB, 0x3A5A, 0x9DAC, 0x9DAC, 0x23E3, 0x9DAD, 0x9DAD, 0x210E,\n    0x9DAE, 0x9DB1, 0x3A5E, 0x9DB2, 0x9DB2, 0x1FA6, 0x9DB3, 0x9DB3, 0x2004,\n    0x9DB4, 0x9DBD, 0x3A62, 0x9DBE, 0x9DBE, 0x1F9D, 0x9DBF, 0x9DC5, 0x3A6C,\n    0x9DC6, 0x9DC6, 0x23E5, 0x9DC7, 0x9DC8, 0x3A73, 0x9DC9, 0x9DC9, 0x2264,\n    0x9DCA, 0x9DCC, 0x3A75, 0x9DCD, 0x9DCD, 0x24E2, 0x9DCE, 0x9DD1, 0x3A78,\n    0x9DD2, 0x9DD2, 0x23DE, 0x9DD3, 0x9DD4, 0x3A7C, 0x9DD5, 0x9DD5, 0x1EC4,\n    0x9DD6, 0x9DE0, 0x3A7E, 0x9DE1, 0x9DE1, 0x22B6, 0x9DE2, 0x9DE2, 0x20A9,\n    0x9DE3, 0x9DF0, 0x3A89, 0x9DF1, 0x9DF1, 0x212B, 0x9DF2, 0x9DF3, 0x3A97,\n    0x9DF4, 0x9DF4, 0x20A5, 0x9DF5, 0x9DF6, 0x3A99, 0x9DF7, 0x9DF7, 0x268B,\n    0x9DF8, 0x9DF9, 0x3A9B, 0x9DFA, 0x9DFA, 0x1F76, 0x9DFB, 0x9DFC, 0x3A9D,\n    0x9DFD, 0x9DFD, 0x216D, 0x9DFE, 0x9DFE, 0x3A9F, 0x9E40, 0x9E44, 0x3AA0,\n    0x9E45, 0x9E45, 0x2001, 0x9E46, 0x9E47, 0x3AA5, 0x9E48, 0x9E48, 0x2191,\n    0x9E49, 0x9E49, 0x1E50, 0x9E4A, 0x9E51, 0x3AA7, 0x9E52, 0x9E52, 0x1F9C,\n    0x9E53, 0x9E53, 0x3AAF, 0x9E54, 0x9E54, 0x23DA, 0x9E55, 0x9E55, 0x3AB0,\n    0x9E56, 0x9E56, 0x2053, 0x9E57, 0x9E5C, 0x3AB1, 0x9E5D, 0x9E5D, 0x23E9,\n    0x9E5E, 0x9E5E, 0x23E4, 0x9E5F, 0x9E60, 0x3AB7, 0x9E61, 0x9E61, 0x21D5,\n    0x9E62, 0x9E62, 0x3AB9, 0x9E63, 0x9E63, 0x23E6, 0x9E64, 0x9E66, 0x3ABA,\n    0x9E67, 0x9E67, 0x23DF, 0x9E68, 0x9E6B, 0x3ABD, 0x9E6C, 0x9E6C, 0x1E4F,\n    0x9E6D, 0x9E6E, 0x3AC1, 0x9E6F, 0x9E6F, 0x23D9, 0x9E70, 0x9E71, 0x3AC3,\n    0x9E72, 0x9E72, 0x2014, 0x9E73, 0x9E73, 0x3AC5, 0x9E74, 0x9E74, 0x23EC,\n    0x9E75, 0x9E75, 0x23EB, 0x9E76, 0x9E7A, 0x3AC6, 0x9E7B, 0x9E7B, 0x23D8,\n    0x9E7C, 0x9E7C, 0x23EE, 0x9E7D, 0x9E7E, 0x3ACB, 0x9E80, 0x9E84, 0x3ACD,\n    0x9E85, 0x9E85, 0x268E, 0x9E86, 0x9E86, 0x3AD2, 0x9E87, 0x9E87, 0x23ED,\n    0x9E88, 0x9E90, 0x3AD3, 0x9E91, 0x9E91, 0x1FFA, 0x9E92, 0x9E95, 0x3ADC,\n    0x9E96, 0x9E96, 0x23D6, 0x9E97, 0x9E97, 0x23E8, 0x9E98, 0x9EA1, 0x3AE0,\n    0x9EA2, 0x9EA2, 0x2106, 0x9EA3, 0x9EA5, 0x3AEA, 0x9EA6, 0x9EA6, 0x200B,\n    0x9EA7, 0x9EA8, 0x3AED, 0x9EA9, 0x9EA9, 0x2166, 0x9EAA, 0x9EAD, 0x3AEF,\n    0x9EAE, 0x9EAE, 0x23EF, 0x9EAF, 0x9EB2, 0x3AF3, 0x9EB3, 0x9EB3, 0x2189,\n    0x9EB4, 0x9EB4, 0x2058, 0x9EB5, 0x9EB6, 0x3AF7, 0x9EB7, 0x9EB7, 0x23E7,\n    0x9EB8, 0x9EF4, 0x3AF9, 0x9EF5, 0x9EF5, 0x21A3, 0x9EF6, 0x9EFE, 0x3B36,\n    0x9F40, 0x9F4D, 0x3B3F, 0x9F4E, 0x9F4E, 0x217A, 0x9F4F, 0x9F6E, 0x3B4D,\n    0x9F6F, 0x9F6F, 0x21A5, 0x9F70, 0x9F7E, 0x3B6D, 0x9F80, 0x9F91, 0x3B7C,\n    0x9F92, 0x9F92, 0x2022, 0x9F93, 0x9F97, 0x3B8E, 0x9F98, 0x9F98, 0x24D6,\n    0x9F99, 0x9FA5, 0x3B93, 0x9FA6, 0x9FA6, 0x233A, 0x9FA7, 0x9FA8, 0x3BA0,\n    0x9FA9, 0x9FA9, 0x1EEE, 0x9FAA, 0x9FAB, 0x3BA2, 0x9FAC, 0x9FAC, 0x24D5,\n    0x9FAD, 0x9FC8, 0x3BA4, 0x9FC9, 0x9FC9, 0x2228, 0x9FCA, 0x9FCC, 0x3BC0,\n    0x9FCD, 0x9FCD, 0x24D7, 0x9FCE, 0x9FE0, 0x3BC3, 0x9FE1, 0x9FE1, 0x20FC,\n    0x9FE2, 0x9FEA, 0x3BD6, 0x9FEB, 0x9FEB, 0x1E87, 0x9FEC, 0x9FED, 0x3BDF,\n    0x9FEE, 0x9FEE, 0x24D8, 0x9FEF, 0x9FF3, 0x3BE1, 0x9FF4, 0x9FF4, 0x1EBA,\n    0x9FF5, 0x9FFC, 0x3BE6, 0x9FFD, 0x9FFD, 0x2119, 0x9FFE, 0x9FFE, 0x3BEE,\n    0xA040, 0xA042, 0x3BEF, 0xA043, 0xA043, 0x216C, 0xA044, 0xA045, 0x3BF2,\n    0xA046, 0xA046, 0x24D9, 0xA047, 0xA048, 0x3BF4, 0xA049, 0xA049, 0x2227,\n    0xA04A, 0xA04D, 0x3BF6, 0xA04E, 0xA04E, 0x1E5F, 0xA04F, 0xA053, 0x3BFA,\n    0xA054, 0xA054, 0x229F, 0xA055, 0xA059, 0x3BFF, 0xA05A, 0xA05A, 0x1F5D,\n    0xA05B, 0xA060, 0x3C04, 0xA061, 0xA061, 0x1FBC, 0xA062, 0xA062, 0x3C0A,\n    0xA063, 0xA063, 0x24DA, 0xA064, 0xA070, 0x3C0B, 0xA071, 0xA071, 0x2149,\n    0xA072, 0xA073, 0x3C18, 0xA074, 0xA074, 0x2046, 0xA075, 0xA07E, 0x3C1A,\n    0xA080, 0xA080, 0x2000, 0xA081, 0xA090, 0x3C24, 0xA091, 0xA091, 0x2190,\n    0xA092, 0xA093, 0x3C34, 0xA094, 0xA094, 0x2208, 0xA095, 0xA095, 0x3C36,\n    0xA096, 0xA096, 0x1EE6, 0xA097, 0xA0A8, 0x3C37, 0xA0A9, 0xA0A9, 0x24C3,\n    0xA0AA, 0xA0BE, 0x3C49, 0xA0BF, 0xA0BF, 0x20CC, 0xA0C0, 0xA0CD, 0x3C5E,\n    0xA0CE, 0xA0CE, 0x2340, 0xA0CF, 0xA0D8, 0x3C6C, 0xA0D9, 0xA0D9, 0x1ED1,\n    0xA0DA, 0xA0DD, 0x3C76, 0xA0DE, 0xA0DE, 0x21AC, 0xA0DF, 0xA0ED, 0x3C7A,\n    0xA0EE, 0xA0EE, 0x22AF, 0xA0EF, 0xA0FE, 0x3C89, 0xA1A1, 0xA1FE, 0x0060,\n    0xA2A1, 0xA2AA, 0x26A9, 0xA2B1, 0xA2E2, 0x00BE, 0xA2E3, 0xA2E3, 0x5751,\n    0xA2E5, 0xA2EE, 0x00F0, 0xA2F1, 0xA2FC, 0x00FA, 0xA3A1, 0xA3FE, 0x0106,\n    0xA4A1, 0xA4F3, 0x0164, 0xA5A1, 0xA5F6, 0x01B7, 0xA6A1, 0xA6B8, 0x020D,\n    0xA6C1, 0xA6F5, 0x0225, 0xA7A1, 0xA7C1, 0x025A, 0xA7D1, 0xA7F1, 0x027B,\n    0xA840, 0xA87E, 0x26B3, 0xA880, 0xA895, 0x26F2, 0xA8A1, 0xA8C0, 0x029C,\n    0xA8C5, 0xA8EA, 0x02BC, 0xA940, 0xA957, 0x2708, 0xA959, 0xA95A, 0x2720,\n    0xA95C, 0xA95C, 0x2722, 0xA960, 0xA97E, 0x2723, 0xA980, 0xA995, 0x2742,\n    0xA996, 0xA996, 0x1E17, 0xA9A4, 0xA9EF, 0x02E2, 0xAA40, 0xAA4C, 0x3C99,\n    0xAA4D, 0xAA4D, 0x21B6, 0xAA4E, 0xAA4E, 0x1E3D, 0xAA4F, 0xAA70, 0x3CA6,\n    0xAA71, 0xAA71, 0x2235, 0xAA72, 0xAA72, 0x3CC8, 0xAA73, 0xAA73, 0x2397,\n    0xAA74, 0xAA76, 0x3CC9, 0xAA77, 0xAA77, 0x2395, 0xAA78, 0xAA79, 0x3CCC,\n    0xAA7A, 0xAA7A, 0x223F, 0xAA7B, 0xAA7B, 0x212A, 0xAA7C, 0xAA7E, 0x3CCE,\n    0xAA80, 0xAA99, 0x3CD1, 0xAA9A, 0xAA9A, 0x1ED2, 0xAA9B, 0xAA9B, 0x3CEB,\n    0xAA9C, 0xAA9C, 0x2396, 0xAA9D, 0xAA9D, 0x2398, 0xAA9E, 0xAA9E, 0x3CEC,\n    0xAA9F, 0xAA9F, 0x20A2, 0xAAA0, 0xAAA0, 0x3CED, 0xAAA1, 0xAAFE, 0x032E,\n    0xAB40, 0xAB40, 0x1F64, 0xAB41, 0xAB42, 0x3CEE, 0xAB43, 0xAB43, 0x202B,\n    0xAB44, 0xAB44, 0x3CF0, 0xAB45, 0xAB45, 0x2394, 0xAB46, 0xAB46, 0x2139,\n    0xAB47, 0xAB47, 0x3CF1, 0xAB48, 0xAB48, 0x215F, 0xAB49, 0xAB49, 0x21C1,\n    0xAB4A, 0xAB4A, 0x239A, 0xAB4B, 0xAB4C, 0x3CF2, 0xAB4D, 0xAB4D, 0x2399,\n    0xAB4E, 0xAB7E, 0x3CF4, 0xAB80, 0xABA0, 0x3D25, 0xABA1, 0xABC0, 0x038C,\n    0xAC40, 0xAC45, 0x3D46, 0xAC46, 0xAC46, 0x21C0, 0xAC47, 0xAC70, 0x3D4C,\n    0xAC71, 0xAC71, 0x2460, 0xAC72, 0xAC7B, 0x3D76, 0xAC7C, 0xAC7C, 0x245C,\n    0xAC7D, 0xAC7E, 0x3D80, 0xAC80, 0xAC8C, 0x3D82, 0xAC8D, 0xAC8D, 0x215D,\n    0xAC8E, 0xAC92, 0x3D8F, 0xAC93, 0xAC93, 0x2225, 0xAC94, 0xAC94, 0x206A,\n    0xAC95, 0xACA0, 0x3D94, 0xAD40, 0xAD48, 0x3DA0, 0xAD49, 0xAD49, 0x2461,\n    0xAD4A, 0xAD5D, 0x3DA9, 0xAD5E, 0xAD5E, 0x245B, 0xAD5F, 0xAD60, 0x3DBD,\n    0xAD61, 0xAD61, 0x2462, 0xAD62, 0xAD67, 0x3DBF, 0xAD68, 0xAD68, 0x1F54,\n    0xAD69, 0xAD73, 0x3DC5, 0xAD74, 0xAD74, 0x245F, 0xAD75, 0xAD7E, 0x3DD0,\n    0xAD80, 0xAD81, 0x3DDA, 0xAD82, 0xAD82, 0x20EC, 0xAD83, 0xAD86, 0x3DDC,\n    0xAD87, 0xAD87, 0x245D, 0xAD88, 0xAD8A, 0x3DE0, 0xAD8B, 0xAD8B, 0x2463,\n    0xAD8C, 0xAD90, 0x3DE3, 0xAD91, 0xAD91, 0x2464, 0xAD92, 0xADA0, 0x3DE8,\n    0xAE40, 0xAE53, 0x3DF7, 0xAE54, 0xAE54, 0x24A5, 0xAE55, 0xAE61, 0x3E0B,\n    0xAE62, 0xAE62, 0x1E70, 0xAE63, 0xAE7E, 0x3E18, 0xAE80, 0xAE80, 0x208F,\n    0xAE81, 0xAE84, 0x3E34, 0xAE85, 0xAE85, 0x1E42, 0xAE86, 0xAE8A, 0x3E38,\n    0xAE8B, 0xAE8B, 0x1F4E, 0xAE8C, 0xAE93, 0x3E3D, 0xAE94, 0xAE94, 0x1EB1,\n    0xAE95, 0xAE9F, 0x3E45, 0xAEA0, 0xAEA0, 0x1E8B, 0xAF40, 0xAF63, 0x3E50,\n    0xAF64, 0xAF64, 0x1FC6, 0xAF65, 0xAF7A, 0x3E74, 0xAF7B, 0xAF7B, 0x25AE,\n    0xAF7C, 0xAF7E, 0x3E8A, 0xAF80, 0xAF81, 0x3E8D, 0xAF82, 0xAF82, 0x1F01,\n    0xAF83, 0xAF83, 0x2200, 0xAF84, 0xAF8D, 0x3E8F, 0xAF8E, 0xAF8E, 0x25B2,\n    0xAF8F, 0xAF8F, 0x1E97, 0xAF90, 0xAF90, 0x3E99, 0xAF91, 0xAF91, 0x20AB,\n    0xAF92, 0xAF9B, 0x3E9A, 0xAF9C, 0xAF9C, 0x25B3, 0xAF9D, 0xAF9E, 0x3EA4,\n    0xAF9F, 0xAF9F, 0x2028, 0xAFA0, 0xAFA0, 0x3EA6, 0xB040, 0xB040, 0x3EA7,\n    0xB041, 0xB042, 0x25AF, 0xB043, 0xB043, 0x3EA8, 0xB044, 0xB044, 0x25B1,\n    0xB045, 0xB04E, 0x3EA9, 0xB04F, 0xB04F, 0x25AC, 0xB050, 0xB053, 0x3EB3,\n    0xB054, 0xB054, 0x1E4E, 0xB055, 0xB056, 0x3EB7, 0xB057, 0xB057, 0x2202,\n    0xB058, 0xB058, 0x25AB, 0xB059, 0xB059, 0x2286, 0xB05A, 0xB05A, 0x3EB9,\n    0xB05B, 0xB05B, 0x25AD, 0xB05C, 0xB05C, 0x3EBA, 0xB05D, 0xB05D, 0x25B6,\n    0xB05E, 0xB05E, 0x3EBB, 0xB05F, 0xB05F, 0x21E3, 0xB060, 0xB061, 0x25B4,\n    0xB062, 0xB062, 0x222F, 0xB063, 0xB063, 0x2165, 0xB064, 0xB064, 0x25B7,\n    0xB065, 0xB06B, 0x3EBC, 0xB06C, 0xB06C, 0x1EE9, 0xB06D, 0xB07C, 0x3EC3,\n    0xB07D, 0xB07D, 0x1E25, 0xB07E, 0xB07E, 0x3ED3, 0xB080, 0xB096, 0x3ED4,\n    0xB097, 0xB097, 0x25C0, 0xB098, 0xB098, 0x3EEB, 0xB099, 0xB099, 0x229A,\n    0xB09A, 0xB0A0, 0x3EEC, 0xB0A1, 0xB0FE, 0x03AC, 0xB140, 0xB14A, 0x3EF3,\n    0xB14B, 0xB14B, 0x226E, 0xB14C, 0xB14C, 0x3EFE, 0xB14D, 0xB14D, 0x1FBD,\n    0xB14E, 0xB14E, 0x3EFF, 0xB14F, 0xB14F, 0x1F84, 0xB150, 0xB150, 0x20B2,\n    0xB151, 0xB151, 0x3F00, 0xB152, 0xB152, 0x2043, 0xB153, 0xB17E, 0x3F01,\n    0xB180, 0xB196, 0x3F2D, 0xB197, 0xB197, 0x2684, 0xB198, 0xB1A0, 0x3F44,\n    0xB1A1, 0xB1FE, 0x040A, 0xB240, 0xB240, 0x3F4D, 0xB241, 0xB241, 0x24EF,\n    0xB242, 0xB266, 0x3F4E, 0xB267, 0xB267, 0x24EE, 0xB268, 0xB26C, 0x3F73,\n    0xB26D, 0xB26D, 0x2074, 0xB26E, 0xB273, 0x3F78, 0xB274, 0xB274, 0x2687,\n    0xB275, 0xB27E, 0x3F7E, 0xB280, 0xB280, 0x24F0, 0xB281, 0xB288, 0x3F88,\n    0xB289, 0xB289, 0x268D, 0xB28A, 0xB299, 0x3F90, 0xB29A, 0xB29A, 0x22A0,\n    0xB29B, 0xB2A0, 0x3FA0, 0xB2A1, 0xB2FE, 0x0468, 0xB340, 0xB342, 0x3FA6,\n    0xB343, 0xB343, 0x1FAB, 0xB344, 0xB36F, 0x3FA9, 0xB370, 0xB370, 0x26A8,\n    0xB371, 0xB37E, 0x3FD5, 0xB380, 0xB387, 0x3FE3, 0xB388, 0xB388, 0x24E9,\n    0xB389, 0xB38B, 0x3FEB, 0xB38C, 0xB38C, 0x24E5, 0xB38D, 0xB38D, 0x3FEE,\n    0xB38E, 0xB38E, 0x21FA, 0xB38F, 0xB3A0, 0x3FEF, 0xB3A1, 0xB3FE, 0x04C6,\n    0xB440, 0xB453, 0x4001, 0xB454, 0xB454, 0x2148, 0xB455, 0xB457, 0x4015,\n    0xB458, 0xB458, 0x24E4, 0xB459, 0xB45D, 0x4018, 0xB45E, 0xB45E, 0x24E6,\n    0xB45F, 0xB45F, 0x20F7, 0xB460, 0xB460, 0x401D, 0xB461, 0xB461, 0x206B,\n    0xB462, 0xB474, 0x401E, 0xB475, 0xB475, 0x22A7, 0xB476, 0xB47D, 0x4031,\n    0xB47E, 0xB47E, 0x24EC, 0xB480, 0xB482, 0x4039, 0xB483, 0xB483, 0x24EB,\n    0xB484, 0xB488, 0x403C, 0xB489, 0xB489, 0x24E3, 0xB48A, 0xB492, 0x4041,\n    0xB493, 0xB493, 0x24EA, 0xB494, 0xB4A0, 0x404A, 0xB4A1, 0xB4FE, 0x0524,\n    0xB540, 0xB540, 0x4057, 0xB541, 0xB541, 0x1E92, 0xB542, 0xB54A, 0x4058,\n    0xB54B, 0xB54B, 0x1E27, 0xB54C, 0xB555, 0x4061, 0xB556, 0xB556, 0x1FE6,\n    0xB557, 0xB559, 0x406B, 0xB55A, 0xB55A, 0x24E7, 0xB55B, 0xB55B, 0x2012,\n    0xB55C, 0xB55C, 0x1EEC, 0xB55D, 0xB560, 0x406E, 0xB561, 0xB561, 0x24E8,\n    0xB562, 0xB57E, 0x4072, 0xB580, 0xB59B, 0x408F, 0xB59C, 0xB59C, 0x1F66,\n    0xB59D, 0xB59D, 0x24DC, 0xB59E, 0xB5A0, 0x40AB, 0xB5A1, 0xB5FE, 0x0582,\n    0xB640, 0xB651, 0x40AE, 0xB652, 0xB652, 0x26A2, 0xB653, 0xB654, 0x40C0,\n    0xB655, 0xB655, 0x24DD, 0xB656, 0xB658, 0x40C2, 0xB659, 0xB659, 0x200E,\n    0xB65A, 0xB65A, 0x40C5, 0xB65B, 0xB65B, 0x24DB, 0xB65C, 0xB65C, 0x1EB8,\n    0xB65D, 0xB67E, 0x40C6, 0xB680, 0xB6A0, 0x40E8, 0xB6A1, 0xB6FE, 0x05E0,\n    0xB740, 0xB74D, 0x4109, 0xB74E, 0xB74E, 0x2295, 0xB74F, 0xB750, 0x4117,\n    0xB751, 0xB751, 0x1E80, 0xB752, 0xB758, 0x4119, 0xB759, 0xB759, 0x2677,\n    0xB75A, 0xB763, 0x4120, 0xB764, 0xB764, 0x2624, 0xB765, 0xB765, 0x1F69,\n    0xB766, 0xB766, 0x222B, 0xB767, 0xB776, 0x412A, 0xB777, 0xB777, 0x257F,\n    0xB778, 0xB778, 0x1F5B, 0xB779, 0xB77E, 0x413A, 0xB780, 0xB780, 0x219B,\n    0xB781, 0xB781, 0x4140, 0xB782, 0xB782, 0x267D, 0xB783, 0xB7A0, 0x4141,\n    0xB7A1, 0xB7FE, 0x063E, 0xB840, 0xB842, 0x415F, 0xB843, 0xB843, 0x21A0,\n    0xB844, 0xB844, 0x2186, 0xB845, 0xB845, 0x4162, 0xB846, 0xB846, 0x20ED,\n    0xB847, 0xB84C, 0x4163, 0xB84D, 0xB84D, 0x25B9, 0xB84E, 0xB850, 0x4169,\n    0xB851, 0xB851, 0x1FEA, 0xB852, 0xB859, 0x416C, 0xB85A, 0xB85A, 0x1EA4,\n    0xB85B, 0xB85B, 0x20E1, 0xB85C, 0xB85C, 0x4174, 0xB85D, 0xB85D, 0x25B8,\n    0xB85E, 0xB85E, 0x2260, 0xB85F, 0xB85F, 0x4175, 0xB860, 0xB860, 0x20E2,\n    0xB861, 0xB876, 0x4176, 0xB877, 0xB877, 0x2141, 0xB878, 0xB87E, 0x418C,\n    0xB880, 0xB881, 0x4193, 0xB882, 0xB882, 0x1FC7, 0xB883, 0xB8A0, 0x4195,\n    0xB8A1, 0xB8FE, 0x069C, 0xB940, 0xB94F, 0x41B3, 0xB950, 0xB950, 0x1E41,\n    0xB951, 0xB960, 0x41C3, 0xB961, 0xB961, 0x25E4, 0xB962, 0xB97A, 0x41D3,\n    0xB97B, 0xB97B, 0x1F86, 0xB97C, 0xB97E, 0x41EC, 0xB980, 0xB99C, 0x41EF,\n    0xB99D, 0xB99D, 0x1FB3, 0xB99E, 0xB99F, 0x420C, 0xB9A0, 0xB9A0, 0x1EEF,\n    0xB9A1, 0xB9FE, 0x06FA, 0xBA40, 0xBA41, 0x420E, 0xBA42, 0xBA42, 0x22A4,\n    0xBA43, 0xBA43, 0x4210, 0xBA44, 0xBA44, 0x25E8, 0xBA45, 0xBA55, 0x4211,\n    0xBA56, 0xBA56, 0x25E3, 0xBA57, 0xBA58, 0x4222, 0xBA59, 0xBA59, 0x2111,\n    0xBA5A, 0xBA5F, 0x4224, 0xBA60, 0xBA60, 0x25E6, 0xBA61, 0xBA69, 0x422A,\n    0xBA6A, 0xBA6A, 0x25E7, 0xBA6B, 0xBA73, 0x4233, 0xBA74, 0xBA74, 0x2041,\n    0xBA75, 0xBA7E, 0x423C, 0xBA80, 0xBA83, 0x4246, 0xBA84, 0xBA84, 0x25EA,\n    0xBA85, 0xBA85, 0x424A, 0xBA86, 0xBA86, 0x1F8F, 0xBA87, 0xBA87, 0x424B,\n    0xBA88, 0xBA88, 0x25EC, 0xBA89, 0xBA8C, 0x424C, 0xBA8D, 0xBA8D, 0x25EB,\n    0xBA8E, 0xBA9D, 0x4250, 0xBA9E, 0xBA9E, 0x20D0, 0xBA9F, 0xBA9F, 0x201D,\n    0xBAA0, 0xBAA0, 0x4260, 0xBAA1, 0xBAFE, 0x0758, 0xBB40, 0xBB40, 0x1FF7,\n    0xBB41, 0xBB48, 0x4261, 0xBB49, 0xBB49, 0x1E8D, 0xBB4A, 0xBB57, 0x4269,\n    0xBB58, 0xBB58, 0x25E9, 0xBB59, 0xBB5A, 0x4277, 0xBB5B, 0xBB5B, 0x25EE,\n    0xBB5C, 0xBB5C, 0x203A, 0xBB5D, 0xBB5F, 0x4279, 0xBB60, 0xBB60, 0x2693,\n    0xBB61, 0xBB64, 0x427C, 0xBB65, 0xBB65, 0x25E5, 0xBB66, 0xBB66, 0x25ED,\n    0xBB67, 0xBB67, 0x4280, 0xBB68, 0xBB68, 0x2009, 0xBB69, 0xBB69, 0x4281,\n    0xBB6A, 0xBB6A, 0x2065, 0xBB6B, 0xBB6D, 0x4282, 0xBB6E, 0xBB6E, 0x26A3,\n    0xBB6F, 0xBB7E, 0x4285, 0xBB80, 0xBBA0, 0x4295, 0xBBA1, 0xBBFE, 0x07B6,\n    0xBC40, 0xBC51, 0x42B6, 0xBC52, 0xBC52, 0x25F5, 0xBC53, 0xBC53, 0x1EFC,\n    0xBC54, 0xBC59, 0x42C8, 0xBC5A, 0xBC5A, 0x2024, 0xBC5B, 0xBC60, 0x42CE,\n    0xBC61, 0xBC61, 0x269B, 0xBC62, 0xBC62, 0x42D4, 0xBC63, 0xBC63, 0x25F3,\n    0xBC64, 0xBC64, 0x42D5, 0xBC65, 0xBC65, 0x22D9, 0xBC66, 0xBC66, 0x42D6,\n    0xBC67, 0xBC67, 0x25F4, 0xBC68, 0xBC68, 0x42D7, 0xBC69, 0xBC69, 0x241B,\n    0xBC6A, 0xBC6C, 0x42D8, 0xBC6D, 0xBC6D, 0x1FC8, 0xBC6E, 0xBC6E, 0x42DB,\n    0xBC6F, 0xBC6F, 0x1F7B, 0xBC70, 0xBC70, 0x42DC, 0xBC71, 0xBC71, 0x241D,\n    0xBC72, 0xBC72, 0x42DD, 0xBC73, 0xBC73, 0x224C, 0xBC74, 0xBC74, 0x1F48,\n    0xBC75, 0xBC75, 0x241C, 0xBC76, 0xBC77, 0x241E, 0xBC78, 0xBC78, 0x20FF,\n    0xBC79, 0xBC79, 0x219A, 0xBC7A, 0xBC7A, 0x42DE, 0xBC7B, 0xBC7B, 0x2091,\n    0xBC7C, 0xBC7D, 0x42DF, 0xBC7E, 0xBC7E, 0x20A7, 0xBC80, 0xBC81, 0x42E1,\n    0xBC82, 0xBC82, 0x2423, 0xBC83, 0xBC83, 0x1E9B, 0xBC84, 0xBC84, 0x2422,\n    0xBC85, 0xBC85, 0x42E3, 0xBC86, 0xBC86, 0x2110, 0xBC87, 0xBC87, 0x42E4,\n    0xBC88, 0xBC88, 0x228D, 0xBC89, 0xBC89, 0x1F71, 0xBC8A, 0xBC8A, 0x1EF8,\n    0xBC8B, 0xBC8B, 0x2421, 0xBC8C, 0xBC8E, 0x42E5, 0xBC8F, 0xBC8F, 0x1EF3,\n    0xBC90, 0xBC99, 0x42E8, 0xBC9A, 0xBC9A, 0x21B1, 0xBC9B, 0xBC9B, 0x2426,\n    0xBC9C, 0xBC9C, 0x2425, 0xBC9D, 0xBC9D, 0x2120, 0xBC9E, 0xBCA0, 0x42F2,\n    0xBCA1, 0xBCFE, 0x0814, 0xBD40, 0xBD41, 0x42F5, 0xBD42, 0xBD42, 0x211A,\n    0xBD43, 0xBD43, 0x2424, 0xBD44, 0xBD44, 0x42F7, 0xBD45, 0xBD45, 0x2428,\n    0xBD46, 0xBD47, 0x42F8, 0xBD48, 0xBD48, 0x242A, 0xBD49, 0xBD49, 0x2429,\n    0xBD4A, 0xBD4A, 0x42FA, 0xBD4B, 0xBD4B, 0x2294, 0xBD4C, 0xBD4C, 0x42FB,\n    0xBD4D, 0xBD4D, 0x22BE, 0xBD4E, 0xBD4E, 0x42FC, 0xBD4F, 0xBD4F, 0x1E31,\n    0xBD50, 0xBD56, 0x42FD, 0xBD57, 0xBD57, 0x242C, 0xBD58, 0xBD58, 0x4304,\n    0xBD59, 0xBD59, 0x1FB5, 0xBD5A, 0xBD65, 0x4305, 0xBD66, 0xBD66, 0x242B,\n    0xBD67, 0xBD67, 0x1FAF, 0xBD68, 0xBD69, 0x4311, 0xBD6A, 0xBD6A, 0x2068,\n    0xBD6B, 0xBD6B, 0x21E4, 0xBD6C, 0xBD6E, 0x4313, 0xBD6F, 0xBD6F, 0x1F21,\n    0xBD70, 0xBD70, 0x4316, 0xBD71, 0xBD71, 0x2101, 0xBD72, 0xBD78, 0x4317,\n    0xBD79, 0xBD79, 0x217C, 0xBD7A, 0xBD7A, 0x214A, 0xBD7B, 0xBD7B, 0x242D,\n    0xBD7C, 0xBD7D, 0x431E, 0xBD7E, 0xBD7E, 0x1FD4, 0xBD80, 0xBD80, 0x4320,\n    0xBD81, 0xBD81, 0x1FD1, 0xBD82, 0xBD88, 0x4321, 0xBD89, 0xBD89, 0x1E33,\n    0xBD8A, 0xBD8A, 0x4328, 0xBD8B, 0xBD8B, 0x242F, 0xBD8C, 0xBD8D, 0x4329,\n    0xBD8E, 0xBD8E, 0x242E, 0xBD8F, 0xBD8F, 0x432B, 0xBD90, 0xBD90, 0x2430,\n    0xBD91, 0xBD91, 0x21DB, 0xBD92, 0xBD96, 0x432C, 0xBD97, 0xBD97, 0x2158,\n    0xBD98, 0xBD9A, 0x4331, 0xBD9B, 0xBD9B, 0x1FC2, 0xBD9C, 0xBDA0, 0x4334,\n    0xBDA1, 0xBDFE, 0x0872, 0xBE40, 0xBE42, 0x4339, 0xBE43, 0xBE43, 0x22B9,\n    0xBE44, 0xBE44, 0x433C, 0xBE45, 0xBE45, 0x2436, 0xBE46, 0xBE48, 0x433D,\n    0xBE49, 0xBE49, 0x1E8E, 0xBE4A, 0xBE4A, 0x2439, 0xBE4B, 0xBE50, 0x4340,\n    0xBE51, 0xBE51, 0x21C5, 0xBE52, 0xBE52, 0x2437, 0xBE53, 0xBE53, 0x2192,\n    0xBE54, 0xBE54, 0x4346, 0xBE55, 0xBE55, 0x243A, 0xBE56, 0xBE56, 0x1F19,\n    0xBE57, 0xBE57, 0x218C, 0xBE58, 0xBE58, 0x1E40, 0xBE59, 0xBE59, 0x22B3,\n    0xBE5A, 0xBE5C, 0x4347, 0xBE5D, 0xBE5D, 0x205F, 0xBE5E, 0xBE5E, 0x2438,\n    0xBE5F, 0xBE5F, 0x2432, 0xBE60, 0xBE60, 0x2274, 0xBE61, 0xBE61, 0x434A,\n    0xBE62, 0xBE62, 0x1E9C, 0xBE63, 0xBE63, 0x2431, 0xBE64, 0xBE64, 0x2085,\n    0xBE65, 0xBE68, 0x434B, 0xBE69, 0xBE69, 0x2435, 0xBE6A, 0xBE6B, 0x434F,\n    0xBE6C, 0xBE6C, 0x243B, 0xBE6D, 0xBE6E, 0x4351, 0xBE6F, 0xBE6F, 0x1FB7,\n    0xBE70, 0xBE70, 0x2433, 0xBE71, 0xBE75, 0x4353, 0xBE76, 0xBE76, 0x2054,\n    0xBE77, 0xBE77, 0x21DE, 0xBE78, 0xBE78, 0x4358, 0xBE79, 0xBE79, 0x2434,\n    0xBE7A, 0xBE7B, 0x4359, 0xBE7C, 0xBE7C, 0x243D, 0xBE7D, 0xBE7D, 0x1F89,\n    0xBE7E, 0xBE7E, 0x243C, 0xBE80, 0xBE82, 0x435B, 0xBE83, 0xBE83, 0x1F6E,\n    0xBE84, 0xBE84, 0x1ED8, 0xBE85, 0xBE85, 0x435E, 0xBE86, 0xBE86, 0x1EBF,\n    0xBE87, 0xBE87, 0x2445, 0xBE88, 0xBE88, 0x435F, 0xBE89, 0xBE89, 0x2249,\n    0xBE8A, 0xBE8B, 0x4360, 0xBE8C, 0xBE8C, 0x2441, 0xBE8D, 0xBE8D, 0x4362,\n    0xBE8E, 0xBE8E, 0x1E47, 0xBE8F, 0xBE8F, 0x1F56, 0xBE90, 0xBE91, 0x4363,\n    0xBE92, 0xBE92, 0x2086, 0xBE93, 0xBE94, 0x4365, 0xBE95, 0xBE95, 0x2196,\n    0xBE96, 0xBE96, 0x4367, 0xBE97, 0xBE97, 0x2443, 0xBE98, 0xBE98, 0x243F,\n    0xBE99, 0xBE99, 0x4368, 0xBE9A, 0xBE9A, 0x2023, 0xBE9B, 0xBE9B, 0x4369,\n    0xBE9C, 0xBE9C, 0x2442, 0xBE9D, 0xBE9E, 0x436A, 0xBE9F, 0xBE9F, 0x243E,\n    0xBEA0, 0xBEA0, 0x436C, 0xBEA1, 0xBEFE, 0x08D0, 0xBF40, 0xBF40, 0x26A6,\n    0xBF41, 0xBF4C, 0x436D, 0xBF4D, 0xBF4D, 0x234E, 0xBF4E, 0xBF4E, 0x2446,\n    0xBF4F, 0xBF4F, 0x244B, 0xBF50, 0xBF50, 0x2444, 0xBF51, 0xBF54, 0x4379,\n    0xBF55, 0xBF55, 0x2427, 0xBF56, 0xBF56, 0x244C, 0xBF57, 0xBF5F, 0x437D,\n    0xBF60, 0xBF60, 0x1F0F, 0xBF61, 0xBF61, 0x4386, 0xBF62, 0xBF62, 0x2447,\n    0xBF63, 0xBF63, 0x2449, 0xBF64, 0xBF64, 0x2448, 0xBF65, 0xBF67, 0x4387,\n    0xBF68, 0xBF68, 0x21C2, 0xBF69, 0xBF6B, 0x438A, 0xBF6C, 0xBF6C, 0x216E,\n    0xBF6D, 0xBF6F, 0x438D, 0xBF70, 0xBF70, 0x1F03, 0xBF71, 0xBF71, 0x4390,\n    0xBF72, 0xBF72, 0x244A, 0xBF73, 0xBF73, 0x215C, 0xBF74, 0xBF75, 0x4391,\n    0xBF76, 0xBF76, 0x22BB, 0xBF77, 0xBF77, 0x2450, 0xBF78, 0xBF78, 0x4393,\n    0xBF79, 0xBF79, 0x2694, 0xBF7A, 0xBF7A, 0x244F, 0xBF7B, 0xBF7B, 0x25F6,\n    0xBF7C, 0xBF7C, 0x2051, 0xBF7D, 0xBF7D, 0x4394, 0xBF7E, 0xBF7E, 0x244E,\n    0xBF80, 0xBF81, 0x4395, 0xBF82, 0xBF82, 0x22BA, 0xBF83, 0xBF83, 0x1F6D,\n    0xBF84, 0xBF88, 0x4397, 0xBF89, 0xBF89, 0x2452, 0xBF8A, 0xBF8A, 0x2451,\n    0xBF8B, 0xBF94, 0x439C, 0xBF95, 0xBF95, 0x2455, 0xBF96, 0xBF96, 0x43A6,\n    0xBF97, 0xBF97, 0x2289, 0xBF98, 0xBF98, 0x2116, 0xBF99, 0xBF9C, 0x43A7,\n    0xBF9D, 0xBF9D, 0x2454, 0xBF9E, 0xBFA0, 0x43AB, 0xBFA1, 0xBFFE, 0x092E,\n    0xC040, 0xC040, 0x20FB, 0xC041, 0xC043, 0x43AE, 0xC044, 0xC044, 0x2440,\n    0xC045, 0xC04A, 0x43B1, 0xC04B, 0xC04B, 0x2126, 0xC04C, 0xC04C, 0x1F61,\n    0xC04D, 0xC04D, 0x269D, 0xC04E, 0xC04E, 0x43B7, 0xC04F, 0xC04F, 0x1F8A,\n    0xC050, 0xC050, 0x2456, 0xC051, 0xC051, 0x2459, 0xC052, 0xC052, 0x2458,\n    0xC053, 0xC054, 0x43B8, 0xC055, 0xC055, 0x1FAE, 0xC056, 0xC05A, 0x43BA,\n    0xC05B, 0xC05B, 0x221A, 0xC05C, 0xC05D, 0x43BF, 0xC05E, 0xC05E, 0x1F7A,\n    0xC05F, 0xC05F, 0x244D, 0xC060, 0xC060, 0x2457, 0xC061, 0xC068, 0x43C1,\n    0xC069, 0xC069, 0x2453, 0xC06A, 0xC06A, 0x43C9, 0xC06B, 0xC06B, 0x2420,\n    0xC06C, 0xC06C, 0x43CA, 0xC06D, 0xC06D, 0x21DF, 0xC06E, 0xC06E, 0x2685,\n    0xC06F, 0xC06F, 0x43CB, 0xC070, 0xC070, 0x1E6E, 0xC071, 0xC073, 0x43CC,\n    0xC074, 0xC074, 0x2224, 0xC075, 0xC075, 0x2670, 0xC076, 0xC076, 0x43CF,\n    0xC077, 0xC077, 0x21BA, 0xC078, 0xC078, 0x43D0, 0xC079, 0xC079, 0x245A,\n    0xC07A, 0xC07B, 0x43D1, 0xC07C, 0xC07C, 0x1FFF, 0xC07D, 0xC07E, 0x43D3,\n    0xC080, 0xC09A, 0x43D5, 0xC09B, 0xC09B, 0x25E2, 0xC09C, 0xC09C, 0x43F0,\n    0xC09D, 0xC09D, 0x269A, 0xC09E, 0xC0A0, 0x43F1, 0xC0A1, 0xC0FE, 0x098C,\n    0xC140, 0xC14F, 0x43F4, 0xC150, 0xC150, 0x1EEA, 0xC151, 0xC153, 0x4404,\n    0xC154, 0xC154, 0x1E2C, 0xC155, 0xC15E, 0x4407, 0xC15F, 0xC15F, 0x2062,\n    0xC160, 0xC160, 0x24F1, 0xC161, 0xC161, 0x4411, 0xC162, 0xC162, 0x24F2,\n    0xC163, 0xC174, 0x4412, 0xC175, 0xC175, 0x25F2, 0xC176, 0xC177, 0x4424,\n    0xC178, 0xC178, 0x2215, 0xC179, 0xC17E, 0x4426, 0xC180, 0xC194, 0x442C,\n    0xC195, 0xC195, 0x21AE, 0xC196, 0xC1A0, 0x4441, 0xC1A1, 0xC1FE, 0x09EA,\n    0xC240, 0xC24D, 0x444C, 0xC24E, 0xC24E, 0x20E0, 0xC24F, 0xC264, 0x445A,\n    0xC265, 0xC265, 0x25C2, 0xC266, 0xC266, 0x4470, 0xC267, 0xC267, 0x25C1,\n    0xC268, 0xC27C, 0x4471, 0xC27D, 0xC27D, 0x2128, 0xC27E, 0xC27E, 0x4486,\n    0xC280, 0xC283, 0x4487, 0xC284, 0xC284, 0x2199, 0xC285, 0xC292, 0x448B,\n    0xC293, 0xC293, 0x2017, 0xC294, 0xC294, 0x1EA0, 0xC295, 0xC295, 0x2125,\n    0xC296, 0xC296, 0x214D, 0xC297, 0xC297, 0x4499, 0xC298, 0xC298, 0x25C4,\n    0xC299, 0xC299, 0x209D, 0xC29A, 0xC29A, 0x228A, 0xC29B, 0xC29B, 0x449A,\n    0xC29C, 0xC29C, 0x25C3, 0xC29D, 0xC29F, 0x449B, 0xC2A0, 0xC2A0, 0x2179,\n    0xC2A1, 0xC2FE, 0x0A48, 0xC340, 0xC340, 0x2038, 0xC341, 0xC342, 0x449E,\n    0xC343, 0xC343, 0x2155, 0xC344, 0xC37A, 0x44A0, 0xC37B, 0xC37B, 0x21D2,\n    0xC37C, 0xC37E, 0x44D7, 0xC380, 0xC383, 0x44DA, 0xC384, 0xC384, 0x24C7,\n    0xC385, 0xC39A, 0x44DE, 0xC39B, 0xC39B, 0x2279, 0xC39C, 0xC3A0, 0x44F4,\n    0xC3A1, 0xC3FE, 0x0AA6, 0xC440, 0xC448, 0x44F9, 0xC449, 0xC449, 0x2123,\n    0xC44A, 0xC44B, 0x4502, 0xC44C, 0xC44C, 0x24C5, 0xC44D, 0xC453, 0x4504,\n    0xC454, 0xC454, 0x24C9, 0xC455, 0xC457, 0x450B, 0xC458, 0xC458, 0x2094,\n    0xC459, 0xC45A, 0x450E, 0xC45B, 0xC45B, 0x2296, 0xC45C, 0xC462, 0x4510,\n    0xC463, 0xC463, 0x1E77, 0xC464, 0xC476, 0x4517, 0xC477, 0xC477, 0x1F06,\n    0xC478, 0xC479, 0x452A, 0xC47A, 0xC47A, 0x1FA5, 0xC47B, 0xC47E, 0x452C,\n    0xC480, 0xC480, 0x4530, 0xC481, 0xC481, 0x2099, 0xC482, 0xC490, 0x4531,\n    0xC491, 0xC491, 0x1EAD, 0xC492, 0xC492, 0x24C8, 0xC493, 0xC493, 0x20A8,\n    0xC494, 0xC497, 0x4540, 0xC498, 0xC498, 0x201F, 0xC499, 0xC499, 0x4544,\n    0xC49A, 0xC49A, 0x20C5, 0xC49B, 0xC49B, 0x4545, 0xC49C, 0xC49C, 0x24CA,\n    0xC49D, 0xC4A0, 0x4546, 0xC4A1, 0xC4FE, 0x0B04, 0xC540, 0xC543, 0x454A,\n    0xC544, 0xC544, 0x1FF0, 0xC545, 0xC545, 0x454E, 0xC546, 0xC546, 0x24C6,\n    0xC547, 0xC54A, 0x454F, 0xC54B, 0xC54B, 0x225D, 0xC54C, 0xC54C, 0x22DE,\n    0xC54D, 0xC551, 0x4553, 0xC552, 0xC552, 0x202C, 0xC553, 0xC55E, 0x4558,\n    0xC55F, 0xC55F, 0x2161, 0xC560, 0xC562, 0x4564, 0xC563, 0xC563, 0x223B,\n    0xC564, 0xC564, 0x21D9, 0xC565, 0xC565, 0x1FCB, 0xC566, 0xC566, 0x1FC9,\n    0xC567, 0xC57E, 0x4567, 0xC580, 0xC592, 0x457F, 0xC593, 0xC593, 0x1E61,\n    0xC594, 0xC59B, 0x4592, 0xC59C, 0xC59C, 0x25EF, 0xC59D, 0xC59D, 0x459A,\n    0xC59E, 0xC59E, 0x1F98, 0xC59F, 0xC5A0, 0x459B, 0xC5A1, 0xC5FE, 0x0B62,\n    0xC640, 0xC640, 0x459D, 0xC641, 0xC641, 0x25F0, 0xC642, 0xC643, 0x459E,\n    0xC644, 0xC644, 0x1F88, 0xC645, 0xC646, 0x45A0, 0xC647, 0xC647, 0x21F8,\n    0xC648, 0xC662, 0x45A2, 0xC663, 0xC663, 0x2322, 0xC664, 0xC671, 0x45BD,\n    0xC672, 0xC672, 0x2336, 0xC673, 0xC67E, 0x45CB, 0xC680, 0xC6A0, 0x45D7,\n    0xC6A1, 0xC6FE, 0x0BC0, 0xC740, 0xC765, 0x45F8, 0xC766, 0xC766, 0x22AB,\n    0xC767, 0xC76E, 0x461E, 0xC76F, 0xC76F, 0x1FBF, 0xC770, 0xC775, 0x4626,\n    0xC776, 0xC776, 0x1F7D, 0xC777, 0xC77A, 0x462C, 0xC77B, 0xC77B, 0x2333,\n    0xC77C, 0xC77E, 0x4630, 0xC780, 0xC7A0, 0x4633, 0xC7A1, 0xC7FE, 0x0C1E,\n    0xC840, 0xC840, 0x4654, 0xC841, 0xC841, 0x1F4D, 0xC842, 0xC84E, 0x4655,\n    0xC84F, 0xC84F, 0x2334, 0xC850, 0xC851, 0x4662, 0xC852, 0xC852, 0x1FF1,\n    0xC853, 0xC865, 0x4664, 0xC866, 0xC866, 0x218B, 0xC867, 0xC86D, 0x4677,\n    0xC86E, 0xC86E, 0x2349, 0xC86F, 0xC87D, 0x467E, 0xC87E, 0xC87E, 0x220B,\n    0xC880, 0xC886, 0x468D, 0xC887, 0xC887, 0x2346, 0xC888, 0xC891, 0x4694,\n    0xC892, 0xC892, 0x2347, 0xC893, 0xC893, 0x469E, 0xC894, 0xC894, 0x2193,\n    0xC895, 0xC898, 0x469F, 0xC899, 0xC899, 0x26A1, 0xC89A, 0xC89C, 0x46A3,\n    0xC89D, 0xC89D, 0x1F62, 0xC89E, 0xC8A0, 0x46A6, 0xC8A1, 0xC8FE, 0x0C7C,\n    0xC940, 0xC94E, 0x46A9, 0xC94F, 0xC94F, 0x234D, 0xC950, 0xC950, 0x2348,\n    0xC951, 0xC96D, 0x46B8, 0xC96E, 0xC96E, 0x1E60, 0xC96F, 0xC96F, 0x46D5,\n    0xC970, 0xC970, 0x2345, 0xC971, 0xC976, 0x46D6, 0xC977, 0xC977, 0x1F12,\n    0xC978, 0xC97E, 0x46DC, 0xC980, 0xC98E, 0x46E3, 0xC98F, 0xC98F, 0x2018,\n    0xC990, 0xC990, 0x2335, 0xC991, 0xC99B, 0x46F2, 0xC99C, 0xC99C, 0x233C,\n    0xC99D, 0xC9A0, 0x46FD, 0xC9A1, 0xC9FE, 0x0CDA, 0xCA40, 0xCA4D, 0x4701,\n    0xCA4E, 0xCA4E, 0x266F, 0xCA4F, 0xCA55, 0x470F, 0xCA56, 0xCA56, 0x2351,\n    0xCA57, 0xCA58, 0x4716, 0xCA59, 0xCA59, 0x1FA0, 0xCA5A, 0xCA5B, 0x4718,\n    0xCA5C, 0xCA5C, 0x2338, 0xCA5D, 0xCA60, 0x471A, 0xCA61, 0xCA61, 0x221B,\n    0xCA62, 0xCA6D, 0x471E, 0xCA6E, 0xCA6E, 0x2342, 0xCA6F, 0xCA71, 0x472A,\n    0xCA72, 0xCA72, 0x234F, 0xCA73, 0xCA76, 0x472D, 0xCA77, 0xCA77, 0x233D,\n    0xCA78, 0xCA7A, 0x4731, 0xCA7B, 0xCA7B, 0x2344, 0xCA7C, 0xCA7C, 0x2331,\n    0xCA7D, 0xCA7D, 0x4734, 0xCA7E, 0xCA7E, 0x234B, 0xCA80, 0xCA80, 0x4735,\n    0xCA81, 0xCA81, 0x233B, 0xCA82, 0xCA88, 0x4736, 0xCA89, 0xCA89, 0x2350,\n    0xCA8A, 0xCA8D, 0x473D, 0xCA8E, 0xCA8E, 0x1EB4, 0xCA8F, 0xCA8F, 0x21A6,\n    0xCA90, 0xCA91, 0x4741, 0xCA92, 0xCA92, 0x21CB, 0xCA93, 0xCA99, 0x4743,\n    0xCA9A, 0xCA9A, 0x2355, 0xCA9B, 0xCAA0, 0x474A, 0xCAA1, 0xCAFE, 0x0D38,\n    0xCB40, 0xCB42, 0x4750, 0xCB43, 0xCB43, 0x233E, 0xCB44, 0xCB44, 0x4753,\n    0xCB45, 0xCB45, 0x1F74, 0xCB46, 0xCB46, 0x4754, 0xCB47, 0xCB47, 0x2330,\n    0xCB48, 0xCB4A, 0x4755, 0xCB4B, 0xCB4B, 0x2680, 0xCB4C, 0xCB4D, 0x4758,\n    0xCB4E, 0xCB4E, 0x20DA, 0xCB4F, 0xCB56, 0x475A, 0xCB57, 0xCB57, 0x234A,\n    0xCB58, 0xCB5C, 0x4762, 0xCB5D, 0xCB5D, 0x1F91, 0xCB5E, 0xCB5E, 0x4767,\n    0xCB5F, 0xCB5F, 0x2107, 0xCB60, 0xCB69, 0x4768, 0xCB6A, 0xCB6A, 0x233F,\n    0xCB6B, 0xCB7A, 0x4772, 0xCB7B, 0xCB7B, 0x1FF4, 0xCB7C, 0xCB7C, 0x2343,\n    0xCB7D, 0xCB7E, 0x4782, 0xCB80, 0xCB86, 0x4784, 0xCB87, 0xCB87, 0x2212,\n    0xCB88, 0xCB8D, 0x478B, 0xCB8E, 0xCB8E, 0x2207, 0xCB8F, 0xCB91, 0x4791,\n    0xCB92, 0xCB92, 0x2359, 0xCB93, 0xCB9B, 0x4794, 0xCB9C, 0xCB9C, 0x2254,\n    0xCB9D, 0xCB9D, 0x479D, 0xCB9E, 0xCB9E, 0x2332, 0xCB9F, 0xCBA0, 0x479E,\n    0xCBA1, 0xCBFE, 0x0D96, 0xCC40, 0xCC40, 0x1E26, 0xCC41, 0xCC41, 0x2357,\n    0xCC42, 0xCC48, 0x47A0, 0xCC49, 0xCC49, 0x2358, 0xCC4A, 0xCC4A, 0x2042,\n    0xCC4B, 0xCC4B, 0x2153, 0xCC4C, 0xCC4E, 0x47A7, 0xCC4F, 0xCC4F, 0x20BB,\n    0xCC50, 0xCC5B, 0x47AA, 0xCC5C, 0xCC5C, 0x235A, 0xCC5D, 0xCC5F, 0x47B6,\n    0xCC60, 0xCC60, 0x2356, 0xCC61, 0xCC63, 0x47B9, 0xCC64, 0xCC64, 0x2337,\n    0xCC65, 0xCC6C, 0x47BC, 0xCC6D, 0xCC6D, 0x1FF9, 0xCC6E, 0xCC78, 0x47C4,\n    0xCC79, 0xCC79, 0x2353, 0xCC7A, 0xCC7C, 0x47CF, 0xCC7D, 0xCC7D, 0x2061,\n    0xCC7E, 0xCC7E, 0x47D2, 0xCC80, 0xCC8D, 0x47D3, 0xCC8E, 0xCC8E, 0x1E95,\n    0xCC8F, 0xCC93, 0x47E1, 0xCC94, 0xCC94, 0x2049, 0xCC95, 0xCC95, 0x47E6,\n    0xCC96, 0xCC96, 0x1F42, 0xCC97, 0xCC9C, 0x47E7, 0xCC9D, 0xCC9D, 0x1FE8,\n    0xCC9E, 0xCCA0, 0x47ED, 0xCCA1, 0xCCFE, 0x0DF4, 0xCD40, 0xCD7E, 0x47F0,\n    0xCD80, 0xCD8F, 0x482F, 0xCD90, 0xCD90, 0x25DA, 0xCD91, 0xCD97, 0x483F,\n    0xCD98, 0xCD98, 0x25D7, 0xCD99, 0xCDA0, 0x4846, 0xCDA1, 0xCDFE, 0x0E52,\n    0xCE40, 0xCE66, 0x484E, 0xCE67, 0xCE67, 0x212E, 0xCE68, 0xCE71, 0x4875,\n    0xCE72, 0xCE72, 0x21B2, 0xCE73, 0xCE7E, 0x487F, 0xCE80, 0xCE80, 0x488B,\n    0xCE81, 0xCE81, 0x219E, 0xCE82, 0xCE86, 0x488C, 0xCE87, 0xCE87, 0x25DC,\n    0xCE88, 0xCE9A, 0x4891, 0xCE9B, 0xCE9B, 0x206C, 0xCE9C, 0xCE9D, 0x48A4,\n    0xCE9E, 0xCE9E, 0x2226, 0xCE9F, 0xCEA0, 0x48A6, 0xCEA1, 0xCEFE, 0x0EB0,\n    0xCF40, 0xCF4D, 0x48A8, 0xCF4E, 0xCF4E, 0x25E0, 0xCF4F, 0xCF54, 0x48B6,\n    0xCF55, 0xCF55, 0x227B, 0xCF56, 0xCF57, 0x48BC, 0xCF58, 0xCF58, 0x25DE,\n    0xCF59, 0xCF5B, 0x48BE, 0xCF5C, 0xCF5C, 0x25E1, 0xCF5D, 0xCF6B, 0x48C1,\n    0xCF6C, 0xCF6C, 0x25D5, 0xCF6D, 0xCF72, 0x48D0, 0xCF73, 0xCF73, 0x1E6B,\n    0xCF74, 0xCF74, 0x48D6, 0xCF75, 0xCF75, 0x25DB, 0xCF76, 0xCF77, 0x48D7,\n    0xCF78, 0xCF78, 0x1E89, 0xCF79, 0xCF7B, 0x48D9, 0xCF7C, 0xCF7C, 0x25D9,\n    0xCF7D, 0xCF7E, 0x48DC, 0xCF80, 0xCF80, 0x48DE, 0xCF81, 0xCF81, 0x2211,\n    0xCF82, 0xCF88, 0x48DF, 0xCF89, 0xCF89, 0x2229, 0xCF8A, 0xCF8A, 0x25D6,\n    0xCF8B, 0xCF92, 0x48E6, 0xCF93, 0xCF93, 0x25DD, 0xCF94, 0xCF94, 0x25DF,\n    0xCF95, 0xCF9D, 0x48EE, 0xCF9E, 0xCF9E, 0x1FEF, 0xCF9F, 0xCF9F, 0x48F7,\n    0xCFA0, 0xCFA0, 0x25D8, 0xCFA1, 0xCFFE, 0x0F0E, 0xD040, 0xD04C, 0x48F8,\n    0xD04D, 0xD04D, 0x1F29, 0xD04E, 0xD050, 0x4905, 0xD051, 0xD051, 0x1E5B,\n    0xD052, 0xD054, 0x4908, 0xD055, 0xD055, 0x2076, 0xD056, 0xD05B, 0x490B,\n    0xD05C, 0xD05C, 0x2297, 0xD05D, 0xD05F, 0x4911, 0xD060, 0xD060, 0x2690,\n    0xD061, 0xD066, 0x4914, 0xD067, 0xD067, 0x213F, 0xD068, 0xD06B, 0x491A,\n    0xD06C, 0xD06C, 0x2198, 0xD06D, 0xD06D, 0x491E, 0xD06E, 0xD06E, 0x1E88,\n    0xD06F, 0xD07C, 0x491F, 0xD07D, 0xD07D, 0x228C, 0xD07E, 0xD07E, 0x492D,\n    0xD080, 0xD0A0, 0x492E, 0xD0A1, 0xD0FE, 0x0F6C, 0xD140, 0xD154, 0x494F,\n    0xD155, 0xD155, 0x25F1, 0xD156, 0xD158, 0x4964, 0xD159, 0xD159, 0x200C,\n    0xD15A, 0xD160, 0x4967, 0xD161, 0xD161, 0x1E58, 0xD162, 0xD162, 0x22AC,\n    0xD163, 0xD174, 0x496E, 0xD175, 0xD175, 0x26A7, 0xD176, 0xD17C, 0x4980,\n    0xD17D, 0xD17D, 0x2676, 0xD17E, 0xD17E, 0x4987, 0xD180, 0xD19C, 0x4988,\n    0xD19D, 0xD19D, 0x1FE1, 0xD19E, 0xD19E, 0x25BB, 0xD19F, 0xD1A0, 0x49A5,\n    0xD1A1, 0xD1FE, 0x0FCA, 0xD240, 0xD240, 0x25BE, 0xD241, 0xD242, 0x49A7,\n    0xD243, 0xD243, 0x22DD, 0xD244, 0xD24C, 0x49A9, 0xD24D, 0xD24D, 0x25BD,\n    0xD24E, 0xD25B, 0x49B2, 0xD25C, 0xD25C, 0x1E2A, 0xD25D, 0xD262, 0x49C0,\n    0xD263, 0xD263, 0x25BC, 0xD264, 0xD264, 0x25BA, 0xD265, 0xD267, 0x49C6,\n    0xD268, 0xD268, 0x25BF, 0xD269, 0xD26C, 0x49C9, 0xD26D, 0xD26D, 0x2187,\n    0xD26E, 0xD26E, 0x49CD, 0xD26F, 0xD26F, 0x266B, 0xD270, 0xD271, 0x49CE,\n    0xD272, 0xD272, 0x1E7F, 0xD273, 0xD274, 0x49D0, 0xD275, 0xD275, 0x21AD,\n    0xD276, 0xD27E, 0x49D2, 0xD280, 0xD289, 0x49DB, 0xD28A, 0xD28A, 0x1F96,\n    0xD28B, 0xD28D, 0x49E5, 0xD28E, 0xD28E, 0x1F32, 0xD28F, 0xD291, 0x49E8,\n    0xD292, 0xD292, 0x2084, 0xD293, 0xD294, 0x49EB, 0xD295, 0xD295, 0x2136,\n    0xD296, 0xD296, 0x49ED, 0xD297, 0xD297, 0x24B8, 0xD298, 0xD29F, 0x49EE,\n    0xD2A0, 0xD2A0, 0x24BA, 0xD2A1, 0xD2FE, 0x1028, 0xD340, 0xD343, 0x49F6,\n    0xD344, 0xD344, 0x24BC, 0xD345, 0xD347, 0x49FA, 0xD348, 0xD348, 0x20E4,\n    0xD349, 0xD349, 0x49FD, 0xD34A, 0xD34A, 0x24B9, 0xD34B, 0xD34C, 0x49FE,\n    0xD34D, 0xD34D, 0x24BD, 0xD34E, 0xD34F, 0x4A00, 0xD350, 0xD350, 0x24BE,\n    0xD351, 0xD354, 0x4A02, 0xD355, 0xD355, 0x24BF, 0xD356, 0xD357, 0x4A06,\n    0xD358, 0xD358, 0x1FD2, 0xD359, 0xD35A, 0x4A08, 0xD35B, 0xD35B, 0x1FFD,\n    0xD35C, 0xD35C, 0x4A0A, 0xD35D, 0xD35D, 0x24BB, 0xD35E, 0xD35E, 0x1F2D,\n    0xD35F, 0xD377, 0x4A0B, 0xD378, 0xD378, 0x2609, 0xD379, 0xD379, 0x4A24,\n    0xD37A, 0xD37A, 0x260A, 0xD37B, 0xD37B, 0x4A25, 0xD37C, 0xD37C, 0x1E94,\n    0xD37D, 0xD37E, 0x4A26, 0xD380, 0xD384, 0x4A28, 0xD385, 0xD385, 0x22DF,\n    0xD386, 0xD386, 0x1ECB, 0xD387, 0xD387, 0x1F0D, 0xD388, 0xD38A, 0x4A2D,\n    0xD38B, 0xD38B, 0x1F77, 0xD38C, 0xD38C, 0x4A30, 0xD38D, 0xD38D, 0x21EB,\n    0xD38E, 0xD38E, 0x4A31, 0xD38F, 0xD38F, 0x22E1, 0xD390, 0xD390, 0x4A32,\n    0xD391, 0xD391, 0x216F, 0xD392, 0xD392, 0x4A33, 0xD393, 0xD393, 0x22E0,\n    0xD394, 0xD395, 0x4A34, 0xD396, 0xD396, 0x21EA, 0xD397, 0xD397, 0x4A36,\n    0xD398, 0xD398, 0x22E2, 0xD399, 0xD399, 0x20CB, 0xD39A, 0xD39A, 0x4A37,\n    0xD39B, 0xD39B, 0x1F78, 0xD39C, 0xD39D, 0x4A38, 0xD39E, 0xD39E, 0x1EE2,\n    0xD39F, 0xD39F, 0x4A3A, 0xD3A0, 0xD3A0, 0x21F2, 0xD3A1, 0xD3FE, 0x1086,\n    0xD440, 0xD440, 0x4A3B, 0xD441, 0xD441, 0x2150, 0xD442, 0xD444, 0x4A3C,\n    0xD445, 0xD445, 0x1FD3, 0xD446, 0xD446, 0x4A3F, 0xD447, 0xD447, 0x22E5,\n    0xD448, 0xD44B, 0x4A40, 0xD44C, 0xD44C, 0x1EF2, 0xD44D, 0xD44E, 0x4A44,\n    0xD44F, 0xD44F, 0x211F, 0xD450, 0xD452, 0x4A46, 0xD453, 0xD453, 0x21DD,\n    0xD454, 0xD455, 0x4A49, 0xD456, 0xD456, 0x2154, 0xD457, 0xD457, 0x4A4B,\n    0xD458, 0xD458, 0x22E7, 0xD459, 0xD45B, 0x4A4C, 0xD45C, 0xD45C, 0x2282,\n    0xD45D, 0xD461, 0x4A4F, 0xD462, 0xD462, 0x22E6, 0xD463, 0xD466, 0x4A54,\n    0xD467, 0xD467, 0x22E8, 0xD468, 0xD46D, 0x4A58, 0xD46E, 0xD46E, 0x22E4,\n    0xD46F, 0xD46F, 0x4A5E, 0xD470, 0xD470, 0x226A, 0xD471, 0xD471, 0x4A5F,\n    0xD472, 0xD472, 0x22EB, 0xD473, 0xD473, 0x4A60, 0xD474, 0xD474, 0x22E9,\n    0xD475, 0xD475, 0x20BD, 0xD476, 0xD477, 0x4A61, 0xD478, 0xD478, 0x22EA,\n    0xD479, 0xD47A, 0x4A63, 0xD47B, 0xD47B, 0x22BD, 0xD47C, 0xD47D, 0x4A65,\n    0xD47E, 0xD47E, 0x1E9E, 0xD480, 0xD481, 0x4A67, 0xD482, 0xD482, 0x22F6,\n    0xD483, 0xD483, 0x21E7, 0xD484, 0xD484, 0x2216, 0xD485, 0xD486, 0x4A69,\n    0xD487, 0xD487, 0x2137, 0xD488, 0xD489, 0x4A6B, 0xD48A, 0xD48A, 0x212C,\n    0xD48B, 0xD48B, 0x4A6D, 0xD48C, 0xD48C, 0x1E68, 0xD48D, 0xD48D, 0x22F2,\n    0xD48E, 0xD48E, 0x1F37, 0xD48F, 0xD48F, 0x22F3, 0xD490, 0xD490, 0x4A6E,\n    0xD491, 0xD491, 0x22EF, 0xD492, 0xD492, 0x1F50, 0xD493, 0xD493, 0x1F10,\n    0xD494, 0xD494, 0x21C8, 0xD495, 0xD495, 0x4A6F, 0xD496, 0xD496, 0x22F1,\n    0xD497, 0xD49B, 0x4A70, 0xD49C, 0xD49C, 0x22F0, 0xD49D, 0xD49E, 0x4A75,\n    0xD49F, 0xD49F, 0x22EE, 0xD4A0, 0xD4A0, 0x4A77, 0xD4A1, 0xD4FE, 0x10E4,\n    0xD540, 0xD542, 0x4A78, 0xD543, 0xD543, 0x22ED, 0xD544, 0xD544, 0x229E,\n    0xD545, 0xD545, 0x22EC, 0xD546, 0xD546, 0x1FE2, 0xD547, 0xD549, 0x4A7B,\n    0xD54A, 0xD54A, 0x20FE, 0xD54B, 0xD54D, 0x4A7E, 0xD54E, 0xD54F, 0x22F9,\n    0xD550, 0xD550, 0x4A81, 0xD551, 0xD551, 0x1EAF, 0xD552, 0xD553, 0x4A82,\n    0xD554, 0xD554, 0x2236, 0xD555, 0xD555, 0x4A84, 0xD556, 0xD556, 0x22F7,\n    0xD557, 0xD559, 0x4A85, 0xD55A, 0xD55A, 0x223D, 0xD55B, 0xD55B, 0x4A88,\n    0xD55C, 0xD55C, 0x1E82, 0xD55D, 0xD55D, 0x1FB6, 0xD55E, 0xD55E, 0x4A89,\n    0xD55F, 0xD55F, 0x21A4, 0xD560, 0xD560, 0x21AA, 0xD561, 0xD561, 0x22F8,\n    0xD562, 0xD562, 0x2151, 0xD563, 0xD563, 0x4A8A, 0xD564, 0xD564, 0x1F60,\n    0xD565, 0xD567, 0x4A8B, 0xD568, 0xD568, 0x2147, 0xD569, 0xD56B, 0x4A8E,\n    0xD56C, 0xD56C, 0x2145, 0xD56D, 0xD56D, 0x4A91, 0xD56E, 0xD56E, 0x1FDC,\n    0xD56F, 0xD571, 0x4A92, 0xD572, 0xD572, 0x2301, 0xD573, 0xD574, 0x4A95,\n    0xD575, 0xD575, 0x1EF5, 0xD576, 0xD577, 0x4A97, 0xD578, 0xD578, 0x2218,\n    0xD579, 0xD57A, 0x4A99, 0xD57B, 0xD57B, 0x1EC6, 0xD57C, 0xD57D, 0x4A9B,\n    0xD57E, 0xD57E, 0x2300, 0xD580, 0xD580, 0x4A9D, 0xD581, 0xD581, 0x22B4,\n    0xD582, 0xD583, 0x4A9E, 0xD584, 0xD584, 0x2169, 0xD585, 0xD585, 0x4AA0,\n    0xD586, 0xD586, 0x22FD, 0xD587, 0xD587, 0x4AA1, 0xD588, 0xD588, 0x20EA,\n    0xD589, 0xD589, 0x4AA2, 0xD58A, 0xD58A, 0x22F4, 0xD58B, 0xD58B, 0x4AA3,\n    0xD58C, 0xD58C, 0x22FB, 0xD58D, 0xD58D, 0x4AA4, 0xD58E, 0xD58E, 0x22FC,\n    0xD58F, 0xD58F, 0x2027, 0xD590, 0xD592, 0x4AA5, 0xD593, 0xD593, 0x2060,\n    0xD594, 0xD594, 0x22FF, 0xD595, 0xD597, 0x4AA8, 0xD598, 0xD598, 0x22FE,\n    0xD599, 0xD599, 0x1EC7, 0xD59A, 0xD59A, 0x4AAB, 0xD59B, 0xD59B, 0x230C,\n    0xD59C, 0xD59E, 0x4AAC, 0xD59F, 0xD59F, 0x22F5, 0xD5A0, 0xD5A0, 0x4AAF,\n    0xD5A1, 0xD5FE, 0x1142, 0xD640, 0xD640, 0x2306, 0xD641, 0xD641, 0x4AB0,\n    0xD642, 0xD642, 0x230A, 0xD643, 0xD643, 0x21D3, 0xD644, 0xD646, 0x4AB1,\n    0xD647, 0xD647, 0x2303, 0xD648, 0xD648, 0x4AB4, 0xD649, 0xD649, 0x2307,\n    0xD64A, 0xD64A, 0x230B, 0xD64B, 0xD64C, 0x4AB5, 0xD64D, 0xD64D, 0x1F5F,\n    0xD64E, 0xD64E, 0x4AB7, 0xD64F, 0xD64F, 0x2309, 0xD650, 0xD651, 0x4AB8,\n    0xD652, 0xD652, 0x2302, 0xD653, 0xD653, 0x1F04, 0xD654, 0xD654, 0x229D,\n    0xD655, 0xD655, 0x4ABA, 0xD656, 0xD656, 0x21FB, 0xD657, 0xD657, 0x4ABB,\n    0xD658, 0xD658, 0x2308, 0xD659, 0xD659, 0x4ABC, 0xD65A, 0xD65A, 0x20AC,\n    0xD65B, 0xD65B, 0x4ABD, 0xD65C, 0xD65C, 0x208E, 0xD65D, 0xD65D, 0x2305,\n    0xD65E, 0xD65E, 0x2197, 0xD65F, 0xD65F, 0x4ABE, 0xD660, 0xD660, 0x2171,\n    0xD661, 0xD661, 0x2298, 0xD662, 0xD664, 0x4ABF, 0xD665, 0xD665, 0x1F57,\n    0xD666, 0xD668, 0x4AC2, 0xD669, 0xD669, 0x2082, 0xD66A, 0xD66A, 0x4AC5,\n    0xD66B, 0xD66B, 0x2311, 0xD66C, 0xD66E, 0x4AC6, 0xD66F, 0xD66F, 0x2304,\n    0xD670, 0xD670, 0x4AC9, 0xD671, 0xD671, 0x230F, 0xD672, 0xD672, 0x1E35,\n    0xD673, 0xD673, 0x4ACA, 0xD674, 0xD674, 0x20D1, 0xD675, 0xD675, 0x2310,\n    0xD676, 0xD676, 0x1FA3, 0xD677, 0xD677, 0x4ACB, 0xD678, 0xD678, 0x21D6,\n    0xD679, 0xD67B, 0x4ACC, 0xD67C, 0xD67C, 0x2206, 0xD67D, 0xD67E, 0x4ACF,\n    0xD680, 0xD682, 0x4AD1, 0xD683, 0xD683, 0x230D, 0xD684, 0xD685, 0x4AD4,\n    0xD686, 0xD686, 0x2312, 0xD687, 0xD687, 0x208D, 0xD688, 0xD688, 0x2313,\n    0xD689, 0xD68D, 0x4AD6, 0xD68E, 0xD68E, 0x22E3, 0xD68F, 0xD693, 0x4ADB,\n    0xD694, 0xD694, 0x1FBA, 0xD695, 0xD698, 0x4AE0, 0xD699, 0xD699, 0x2078,\n    0xD69A, 0xD6A0, 0x4AE4, 0xD6A1, 0xD6FE, 0x11A0, 0xD740, 0xD742, 0x4AEB,\n    0xD743, 0xD743, 0x2288, 0xD744, 0xD747, 0x4AEE, 0xD748, 0xD748, 0x2316,\n    0xD749, 0xD749, 0x1F6B, 0xD74A, 0xD74F, 0x4AF2, 0xD750, 0xD750, 0x2314,\n    0xD751, 0xD751, 0x4AF8, 0xD752, 0xD752, 0x2130, 0xD753, 0xD753, 0x2315,\n    0xD754, 0xD754, 0x2168, 0xD755, 0xD755, 0x4AF9, 0xD756, 0xD756, 0x20C4,\n    0xD757, 0xD763, 0x4AFA, 0xD764, 0xD764, 0x2318, 0xD765, 0xD766, 0x4B07,\n    0xD767, 0xD767, 0x2219, 0xD768, 0xD768, 0x2217, 0xD769, 0xD76B, 0x4B09,\n    0xD76C, 0xD76C, 0x20D5, 0xD76D, 0xD76E, 0x4B0C, 0xD76F, 0xD76F, 0x1F4A,\n    0xD770, 0xD774, 0x4B0E, 0xD775, 0xD775, 0x2240, 0xD776, 0xD777, 0x4B13,\n    0xD778, 0xD778, 0x1ED3, 0xD779, 0xD77E, 0x4B15, 0xD780, 0xD782, 0x4B1B,\n    0xD783, 0xD783, 0x1E49, 0xD784, 0xD786, 0x4B1E, 0xD787, 0xD787, 0x261B,\n    0xD788, 0xD78A, 0x4B21, 0xD78B, 0xD78B, 0x1E6D, 0xD78C, 0xD78C, 0x20F8,\n    0xD78D, 0xD78D, 0x4B24, 0xD78E, 0xD78E, 0x1FFB, 0xD78F, 0xD78F, 0x2319,\n    0xD790, 0xD794, 0x4B25, 0xD795, 0xD795, 0x230E, 0xD796, 0xD796, 0x4B2A,\n    0xD797, 0xD797, 0x2317, 0xD798, 0xD7A0, 0x4B2B, 0xD7A1, 0xD7F9, 0x11FE,\n    0xD840, 0xD84C, 0x4B34, 0xD84D, 0xD84D, 0x20C8, 0xD84E, 0xD852, 0x4B41,\n    0xD853, 0xD853, 0x1EFD, 0xD854, 0xD87E, 0x4B46, 0xD880, 0xD88F, 0x4B71,\n    0xD890, 0xD890, 0x1E3B, 0xD891, 0xD891, 0x227F, 0xD892, 0xD892, 0x4B81,\n    0xD893, 0xD893, 0x1F0C, 0xD894, 0xD894, 0x1E59, 0xD895, 0xD895, 0x1F24,\n    0xD896, 0xD899, 0x4B82, 0xD89A, 0xD89A, 0x20BA, 0xD89B, 0xD89B, 0x1F65,\n    0xD89C, 0xD89C, 0x1EF0, 0xD89D, 0xD89D, 0x2164, 0xD89E, 0xD89E, 0x1F30,\n    0xD89F, 0xD89F, 0x2261, 0xD8A0, 0xD8A0, 0x4B86, 0xD8A1, 0xD8FE, 0x1257,\n    0xD940, 0xD940, 0x4B87, 0xD941, 0xD941, 0x22A2, 0xD942, 0xD942, 0x24AB,\n    0xD943, 0xD943, 0x4B88, 0xD944, 0xD944, 0x24AF, 0xD945, 0xD945, 0x1EE8,\n    0xD946, 0xD946, 0x1F39, 0xD947, 0xD947, 0x4B89, 0xD948, 0xD948, 0x1E48,\n    0xD949, 0xD949, 0x2070, 0xD94A, 0xD94A, 0x1EA8, 0xD94B, 0xD94B, 0x4B8A,\n    0xD94C, 0xD94C, 0x24AC, 0xD94D, 0xD94D, 0x1EF7, 0xD94E, 0xD94E, 0x2176,\n    0xD94F, 0xD94F, 0x24AD, 0xD950, 0xD950, 0x4B8B, 0xD951, 0xD951, 0x207B,\n    0xD952, 0xD952, 0x1F45, 0xD953, 0xD953, 0x24AA, 0xD954, 0xD954, 0x204B,\n    0xD955, 0xD955, 0x202F, 0xD956, 0xD956, 0x1F5A, 0xD957, 0xD957, 0x24B0,\n    0xD958, 0xD958, 0x4B8C, 0xD959, 0xD959, 0x22B7, 0xD95A, 0xD95A, 0x1F7F,\n    0xD95B, 0xD95B, 0x4B8D, 0xD95C, 0xD95C, 0x2265, 0xD95D, 0xD962, 0x4B8E,\n    0xD963, 0xD963, 0x24B2, 0xD964, 0xD964, 0x211B, 0xD965, 0xD965, 0x1E51,\n    0xD966, 0xD966, 0x4B94, 0xD967, 0xD967, 0x24B4, 0xD968, 0xD96B, 0x4B95,\n    0xD96C, 0xD96C, 0x24B3, 0xD96D, 0xD96D, 0x4B99, 0xD96E, 0xD96E, 0x1E9F,\n    0xD96F, 0xD96F, 0x4B9A, 0xD970, 0xD970, 0x2118, 0xD971, 0xD971, 0x4B9B,\n    0xD972, 0xD972, 0x20B4, 0xD973, 0xD973, 0x23AF, 0xD974, 0xD974, 0x21BB,\n    0xD975, 0xD975, 0x2072, 0xD976, 0xD976, 0x1F95, 0xD977, 0xD977, 0x4B9C,\n    0xD978, 0xD978, 0x1F0A, 0xD979, 0xD979, 0x24B6, 0xD97A, 0xD97B, 0x4B9D,\n    0xD97C, 0xD97C, 0x2291, 0xD97D, 0xD97D, 0x24B5, 0xD97E, 0xD97E, 0x2278,\n    0xD980, 0xD980, 0x1ED4, 0xD981, 0xD986, 0x4B9F, 0xD987, 0xD987, 0x1FF3,\n    0xD988, 0xD98C, 0x4BA5, 0xD98D, 0xD98D, 0x22A9, 0xD98E, 0xD98E, 0x24B7,\n    0xD98F, 0xD98F, 0x1F28, 0xD990, 0xD990, 0x2109, 0xD991, 0xD991, 0x22C7,\n    0xD992, 0xD996, 0x4BAA, 0xD997, 0xD997, 0x24AE, 0xD998, 0xD998, 0x22B1,\n    0xD999, 0xD99A, 0x4BAF, 0xD99B, 0xD99B, 0x2266, 0xD99C, 0xD99C, 0x4BB1,\n    0xD99D, 0xD99D, 0x225B, 0xD99E, 0xD99E, 0x22C4, 0xD99F, 0xD99F, 0x4BB2,\n    0xD9A0, 0xD9A0, 0x2115, 0xD9A1, 0xD9FE, 0x12B5, 0xDA40, 0xDA40, 0x4BB3,\n    0xDA41, 0xDA41, 0x222A, 0xDA42, 0xDA42, 0x24B1, 0xDA43, 0xDA47, 0x4BB4,\n    0xDA48, 0xDA48, 0x213D, 0xDA49, 0xDA4C, 0x4BB9, 0xDA4D, 0xDA4D, 0x1F15,\n    0xDA4E, 0xDA4E, 0x225C, 0xDA4F, 0xDA72, 0x4BBD, 0xDA73, 0xDA73, 0x1F14,\n    0xDA74, 0xDA76, 0x4BE1, 0xDA77, 0xDA77, 0x227A, 0xDA78, 0xDA7E, 0x4BE4,\n    0xDA80, 0xDA84, 0x4BEB, 0xDA85, 0xDA85, 0x20EE, 0xDA86, 0xDA8D, 0x4BF0,\n    0xDA8E, 0xDA8E, 0x25F8, 0xDA8F, 0xDAA0, 0x4BF8, 0xDAA1, 0xDAFE, 0x1313,\n    0xDB40, 0xDB5F, 0x4C0A, 0xDB60, 0xDB60, 0x1F94, 0xDB61, 0xDB77, 0x4C2A,\n    0xDB78, 0xDB78, 0x2230, 0xDB79, 0xDB7E, 0x4C41, 0xDB80, 0xDB83, 0x4C47,\n    0xDB84, 0xDB84, 0x25FD, 0xDB85, 0xDB8A, 0x4C4B, 0xDB8B, 0xDB8B, 0x2600,\n    0xDB8C, 0xDB97, 0x4C51, 0xDB98, 0xDB98, 0x2606, 0xDB99, 0xDBA0, 0x4C5D,\n    0xDBA1, 0xDBFE, 0x1371, 0xDC40, 0xDC44, 0x4C65, 0xDC45, 0xDC45, 0x25FF,\n    0xDC46, 0xDC4E, 0x4C6A, 0xDC4F, 0xDC4F, 0x25FC, 0xDC50, 0xDC50, 0x1E8C,\n    0xDC51, 0xDC51, 0x2602, 0xDC52, 0xDC52, 0x4C73, 0xDC53, 0xDC53, 0x224D,\n    0xDC54, 0xDC54, 0x4C74, 0xDC55, 0xDC55, 0x2604, 0xDC56, 0xDC56, 0x25FE,\n    0xDC57, 0xDC57, 0x2603, 0xDC58, 0xDC5C, 0x4C75, 0xDC5D, 0xDC5D, 0x2601,\n    0xDC5E, 0xDC61, 0x4C7A, 0xDC62, 0xDC62, 0x2605, 0xDC63, 0xDC65, 0x4C7E,\n    0xDC66, 0xDC66, 0x1EA3, 0xDC67, 0xDC67, 0x2608, 0xDC68, 0xDC6A, 0x4C81,\n    0xDC6B, 0xDC6B, 0x2607, 0xDC6C, 0xDC7B, 0x4C84, 0xDC7C, 0xDC7C, 0x20F0,\n    0xDC7D, 0xDC7E, 0x4C94, 0xDC80, 0xDC86, 0x4C96, 0xDC87, 0xDC87, 0x1E7B,\n    0xDC88, 0xDC88, 0x2267, 0xDC89, 0xDC89, 0x1F36, 0xDC8A, 0xDC8A, 0x1FD6,\n    0xDC8B, 0xDC8D, 0x4C9D, 0xDC8E, 0xDC8E, 0x21E0, 0xDC8F, 0xDC8F, 0x4CA0,\n    0xDC90, 0xDC90, 0x248C, 0xDC91, 0xDC96, 0x4CA1, 0xDC97, 0xDC97, 0x248D,\n    0xDC98, 0xDC9A, 0x4CA7, 0xDC9B, 0xDC9B, 0x2102, 0xDC9C, 0xDC9F, 0x4CAA,\n    0xDCA0, 0xDCA0, 0x2494, 0xDCA1, 0xDCFE, 0x13CF, 0xDD40, 0xDD45, 0x4CAE,\n    0xDD46, 0xDD46, 0x2493, 0xDD47, 0xDD4C, 0x4CB4, 0xDD4D, 0xDD4D, 0x248E,\n    0xDD4E, 0xDD52, 0x4CBA, 0xDD53, 0xDD53, 0x2299, 0xDD54, 0xDD54, 0x2491,\n    0xDD55, 0xDD55, 0x2496, 0xDD56, 0xDD56, 0x248F, 0xDD57, 0xDD57, 0x2492,\n    0xDD58, 0xDD58, 0x4CBF, 0xDD59, 0xDD59, 0x2497, 0xDD5A, 0xDD5D, 0x4CC0,\n    0xDD5E, 0xDD5E, 0x1FB1, 0xDD5F, 0xDD5F, 0x4CC4, 0xDD60, 0xDD60, 0x249A,\n    0xDD61, 0xDD61, 0x4CC5, 0xDD62, 0xDD62, 0x2499, 0xDD63, 0xDD63, 0x4CC6,\n    0xDD64, 0xDD64, 0x2258, 0xDD65, 0xDD65, 0x2498, 0xDD66, 0xDD6C, 0x4CC7,\n    0xDD6D, 0xDD6D, 0x249B, 0xDD6E, 0xDD6E, 0x4CCE, 0xDD6F, 0xDD6F, 0x1F09,\n    0xDD70, 0xDD70, 0x20E6, 0xDD71, 0xDD75, 0x4CCF, 0xDD76, 0xDD76, 0x2026,\n    0xDD77, 0xDD77, 0x249F, 0xDD78, 0xDD78, 0x1F59, 0xDD79, 0xDD7A, 0x249D,\n    0xDD7B, 0xDD7E, 0x4CD4, 0xDD80, 0xDD80, 0x4CD8, 0xDD81, 0xDD81, 0x1F3B,\n    0xDD82, 0xDD82, 0x249C, 0xDD83, 0xDD84, 0x4CD9, 0xDD85, 0xDD85, 0x1E3A,\n    0xDD86, 0xDD86, 0x205B, 0xDD87, 0xDD8A, 0x4CDB, 0xDD8B, 0xDD8B, 0x1F70,\n    0xDD8C, 0xDD8E, 0x4CDF, 0xDD8F, 0xDD8F, 0x24A0, 0xDD90, 0xDD93, 0x4CE2,\n    0xDD94, 0xDD94, 0x213B, 0xDD95, 0xDD96, 0x4CE6, 0xDD97, 0xDD97, 0x1F07,\n    0xDD98, 0xDD99, 0x4CE8, 0xDD9A, 0xDD9A, 0x2270, 0xDD9B, 0xDD9B, 0x2237,\n    0xDD9C, 0xDD9D, 0x4CEA, 0xDD9E, 0xDD9E, 0x24D2, 0xDD9F, 0xDD9F, 0x4CEC,\n    0xDDA0, 0xDDA0, 0x21B3, 0xDDA1, 0xDDFE, 0x142D, 0xDE40, 0xDE40, 0x2245,\n    0xDE41, 0xDE41, 0x24A1, 0xDE42, 0xDE43, 0x4CED, 0xDE44, 0xDE44, 0x22A8,\n    0xDE45, 0xDE47, 0x4CEF, 0xDE48, 0xDE48, 0x227C, 0xDE49, 0xDE49, 0x1FB0,\n    0xDE4A, 0xDE4E, 0x4CF2, 0xDE4F, 0xDE4F, 0x24A2, 0xDE50, 0xDE59, 0x4CF7,\n    0xDE5A, 0xDE5A, 0x1F46, 0xDE5B, 0xDE5B, 0x4D01, 0xDE5C, 0xDE5C, 0x2380,\n    0xDE5D, 0xDE5D, 0x2495, 0xDE5E, 0xDE5E, 0x4D02, 0xDE5F, 0xDE5F, 0x2490,\n    0xDE60, 0xDE6A, 0x4D03, 0xDE6B, 0xDE6B, 0x1E30, 0xDE6C, 0xDE6E, 0x4D0E,\n    0xDE6F, 0xDE6F, 0x1E9D, 0xDE70, 0xDE70, 0x1E4B, 0xDE71, 0xDE71, 0x1E4A,\n    0xDE72, 0xDE72, 0x20AA, 0xDE73, 0xDE7E, 0x4D11, 0xDE80, 0xDE91, 0x4D1D,\n    0xDE92, 0xDE92, 0x267B, 0xDE93, 0xDE9E, 0x4D2F, 0xDE9F, 0xDE9F, 0x23F2,\n    0xDEA0, 0xDEA0, 0x4D3B, 0xDEA1, 0xDEFE, 0x148B, 0xDF40, 0xDF40, 0x227E,\n    0xDF41, 0xDF41, 0x4D3C, 0xDF42, 0xDF42, 0x2019, 0xDF43, 0xDF4C, 0x4D3D,\n    0xDF4D, 0xDF4D, 0x1FBB, 0xDF4E, 0xDF5B, 0x4D47, 0xDF5C, 0xDF5C, 0x2253,\n    0xDF5D, 0xDF5D, 0x4D55, 0xDF5E, 0xDF5E, 0x1F3E, 0xDF5F, 0xDF5F, 0x1EA6,\n    0xDF60, 0xDF60, 0x218E, 0xDF61, 0xDF63, 0x4D56, 0xDF64, 0xDF64, 0x21EC,\n    0xDF65, 0xDF65, 0x4D59, 0xDF66, 0xDF66, 0x1EBE, 0xDF67, 0xDF67, 0x4D5A,\n    0xDF68, 0xDF68, 0x224A, 0xDF69, 0xDF6C, 0x4D5B, 0xDF6D, 0xDF6D, 0x2133,\n    0xDF6E, 0xDF73, 0x4D5F, 0xDF74, 0xDF74, 0x1E84, 0xDF75, 0xDF76, 0x4D65,\n    0xDF77, 0xDF77, 0x20CF, 0xDF78, 0xDF78, 0x21E2, 0xDF79, 0xDF79, 0x4D67,\n    0xDF7A, 0xDF7A, 0x220F, 0xDF7B, 0xDF7B, 0x4D68, 0xDF7C, 0xDF7C, 0x2029,\n    0xDF7D, 0xDF7D, 0x4D69, 0xDF7E, 0xDF7E, 0x2073, 0xDF80, 0xDF80, 0x1F55,\n    0xDF81, 0xDF82, 0x4D6A, 0xDF83, 0xDF83, 0x23F1, 0xDF84, 0xDF84, 0x4D6C,\n    0xDF85, 0xDF85, 0x1E46, 0xDF86, 0xDF88, 0x4D6D, 0xDF89, 0xDF89, 0x2063,\n    0xDF8A, 0xDF8A, 0x23F3, 0xDF8B, 0xDFA0, 0x4D70, 0xDFA1, 0xDFFE, 0x14E9,\n    0xE040, 0xE04F, 0x4D86, 0xE050, 0xE050, 0x231E, 0xE051, 0xE05C, 0x4D96,\n    0xE05D, 0xE05D, 0x2233, 0xE05E, 0xE068, 0x4DA2, 0xE069, 0xE069, 0x2320,\n    0xE06A, 0xE06B, 0x4DAD, 0xE06C, 0xE06C, 0x21C7, 0xE06D, 0xE074, 0x4DAF,\n    0xE075, 0xE075, 0x22BC, 0xE076, 0xE076, 0x4DB7, 0xE077, 0xE077, 0x231C,\n    0xE078, 0xE078, 0x4DB8, 0xE079, 0xE079, 0x2251, 0xE07A, 0xE07E, 0x4DB9,\n    0xE080, 0xE086, 0x4DBE, 0xE087, 0xE087, 0x1EBB, 0xE088, 0xE08C, 0x4DC5,\n    0xE08D, 0xE08D, 0x2287, 0xE08E, 0xE08E, 0x4DCA, 0xE08F, 0xE08F, 0x202D,\n    0xE090, 0xE090, 0x1EAB, 0xE091, 0xE091, 0x4DCB, 0xE092, 0xE092, 0x231D,\n    0xE093, 0xE093, 0x4DCC, 0xE094, 0xE094, 0x231F, 0xE095, 0xE096, 0x4DCD,\n    0xE097, 0xE097, 0x231B, 0xE098, 0xE0A0, 0x4DCF, 0xE0A1, 0xE0FE, 0x1547,\n    0xE140, 0xE141, 0x4DD8, 0xE142, 0xE142, 0x2321, 0xE143, 0xE163, 0x4DDA,\n    0xE164, 0xE164, 0x2255, 0xE165, 0xE167, 0x4DFB, 0xE168, 0xE168, 0x1E8F,\n    0xE169, 0xE173, 0x4DFE, 0xE174, 0xE174, 0x220C, 0xE175, 0xE175, 0x1FA4,\n    0xE176, 0xE17E, 0x4E09, 0xE180, 0xE183, 0x4E12, 0xE184, 0xE184, 0x209B,\n    0xE185, 0xE185, 0x21D8, 0xE186, 0xE186, 0x4E16, 0xE187, 0xE187, 0x25FA,\n    0xE188, 0xE188, 0x4E17, 0xE189, 0xE189, 0x25F9, 0xE18A, 0xE18B, 0x4E18,\n    0xE18C, 0xE18C, 0x2134, 0xE18D, 0xE18D, 0x4E1A, 0xE18E, 0xE190, 0x24F3,\n    0xE191, 0xE191, 0x24F8, 0xE192, 0xE192, 0x4E1B, 0xE193, 0xE193, 0x24F7,\n    0xE194, 0xE194, 0x1EC8, 0xE195, 0xE195, 0x24F6, 0xE196, 0xE197, 0x4E1C,\n    0xE198, 0xE198, 0x2280, 0xE199, 0xE19D, 0x4E1E, 0xE19E, 0xE19E, 0x1EC5,\n    0xE19F, 0xE19F, 0x24FB, 0xE1A0, 0xE1A0, 0x4E23, 0xE1A1, 0xE1FE, 0x15A5,\n    0xE240, 0xE240, 0x4E24, 0xE241, 0xE241, 0x24FA, 0xE242, 0xE242, 0x4E25,\n    0xE243, 0xE243, 0x1EED, 0xE244, 0xE24E, 0x4E26, 0xE24F, 0xE24F, 0x24FD,\n    0xE250, 0xE250, 0x4E31, 0xE251, 0xE251, 0x24F9, 0xE252, 0xE252, 0x4E32,\n    0xE253, 0xE253, 0x24FE, 0xE254, 0xE254, 0x20CD, 0xE255, 0xE259, 0x4E33,\n    0xE25A, 0xE25A, 0x2508, 0xE25B, 0xE25B, 0x2504, 0xE25C, 0xE25D, 0x4E38,\n    0xE25E, 0xE25E, 0x2506, 0xE25F, 0xE261, 0x4E3A, 0xE262, 0xE262, 0x24FF,\n    0xE263, 0xE263, 0x2090, 0xE264, 0xE266, 0x4E3D, 0xE267, 0xE267, 0x1EDD,\n    0xE268, 0xE268, 0x1F25, 0xE269, 0xE269, 0x4E40, 0xE26A, 0xE26A, 0x2503,\n    0xE26B, 0xE26B, 0x2502, 0xE26C, 0xE26D, 0x4E41, 0xE26E, 0xE26E, 0x1E7A,\n    0xE26F, 0xE26F, 0x20A6, 0xE270, 0xE277, 0x4E43, 0xE278, 0xE278, 0x1FD5,\n    0xE279, 0xE27C, 0x4E4B, 0xE27D, 0xE27D, 0x1F11, 0xE27E, 0xE27E, 0x4E4F,\n    0xE280, 0xE280, 0x2507, 0xE281, 0xE281, 0x2500, 0xE282, 0xE282, 0x2505,\n    0xE283, 0xE288, 0x4E50, 0xE289, 0xE289, 0x2519, 0xE28A, 0xE28A, 0x4E56,\n    0xE28B, 0xE28B, 0x2515, 0xE28C, 0xE28D, 0x4E57, 0xE28E, 0xE28E, 0x250C,\n    0xE28F, 0xE28F, 0x2031, 0xE290, 0xE291, 0x4E59, 0xE292, 0xE292, 0x250B,\n    0xE293, 0xE293, 0x250F, 0xE294, 0xE294, 0x251A, 0xE295, 0xE295, 0x2509,\n    0xE296, 0xE297, 0x4E5B, 0xE298, 0xE298, 0x250E, 0xE299, 0xE299, 0x2234,\n    0xE29A, 0xE29A, 0x2513, 0xE29B, 0xE29B, 0x1F80, 0xE29C, 0xE29F, 0x4E5D,\n    0xE2A0, 0xE2A0, 0x2501, 0xE2A1, 0xE2FE, 0x1603, 0xE340, 0xE341, 0x4E61,\n    0xE342, 0xE342, 0x2517, 0xE343, 0xE343, 0x2516, 0xE344, 0xE346, 0x4E63,\n    0xE347, 0xE347, 0x2518, 0xE348, 0xE34A, 0x4E66, 0xE34B, 0xE34B, 0x1E56,\n    0xE34C, 0xE34E, 0x4E69, 0xE34F, 0xE34F, 0x250D, 0xE350, 0xE350, 0x4E6C,\n    0xE351, 0xE351, 0x20D3, 0xE352, 0xE353, 0x4E6D, 0xE354, 0xE354, 0x207A,\n    0xE355, 0xE355, 0x20CE, 0xE356, 0xE357, 0x4E6F, 0xE358, 0xE358, 0x2510,\n    0xE359, 0xE35B, 0x4E71, 0xE35C, 0xE35C, 0x1E55, 0xE35D, 0xE35F, 0x4E74,\n    0xE360, 0xE360, 0x250A, 0xE361, 0xE365, 0x4E77, 0xE366, 0xE367, 0x2511,\n    0xE368, 0xE370, 0x4E7C, 0xE371, 0xE371, 0x1FAA, 0xE372, 0xE372, 0x4E85,\n    0xE373, 0xE373, 0x251E, 0xE374, 0xE374, 0x1F1F, 0xE375, 0xE377, 0x4E86,\n    0xE378, 0xE378, 0x252D, 0xE379, 0xE379, 0x221D, 0xE37A, 0xE37B, 0x4E89,\n    0xE37C, 0xE37C, 0x2532, 0xE37D, 0xE37D, 0x4E8B, 0xE37E, 0xE37E, 0x217B,\n    0xE380, 0xE389, 0x4E8C, 0xE38A, 0xE38A, 0x21AF, 0xE38B, 0xE38B, 0x4E96,\n    0xE38C, 0xE38C, 0x252C, 0xE38D, 0xE38E, 0x4E97, 0xE38F, 0xE38F, 0x2528,\n    0xE390, 0xE390, 0x4E99, 0xE391, 0xE391, 0x208C, 0xE392, 0xE392, 0x4E9A,\n    0xE393, 0xE393, 0x252F, 0xE394, 0xE394, 0x4E9B, 0xE395, 0xE395, 0x21BC,\n    0xE396, 0xE398, 0x4E9C, 0xE399, 0xE399, 0x251D, 0xE39A, 0xE39B, 0x4E9F,\n    0xE39C, 0xE39C, 0x2535, 0xE39D, 0xE39D, 0x4EA1, 0xE39E, 0xE39E, 0x220D,\n    0xE39F, 0xE39F, 0x2526, 0xE3A0, 0xE3A0, 0x4EA2, 0xE3A1, 0xE3FE, 0x1661,\n    0xE440, 0xE440, 0x2534, 0xE441, 0xE441, 0x252A, 0xE442, 0xE442, 0x251F,\n    0xE443, 0xE443, 0x2531, 0xE444, 0xE444, 0x251C, 0xE445, 0xE447, 0x4EA3,\n    0xE448, 0xE448, 0x2525, 0xE449, 0xE44D, 0x4EA6, 0xE44E, 0xE44E, 0x21CD,\n    0xE44F, 0xE44F, 0x4EAB, 0xE450, 0xE450, 0x21DA, 0xE451, 0xE451, 0x4EAC,\n    0xE452, 0xE452, 0x2172, 0xE453, 0xE453, 0x253E, 0xE454, 0xE457, 0x4EAD,\n    0xE458, 0xE458, 0x204F, 0xE459, 0xE459, 0x4EB1, 0xE45A, 0xE45A, 0x2543,\n    0xE45B, 0xE45B, 0x4EB2, 0xE45C, 0xE45C, 0x21D7, 0xE45D, 0xE45D, 0x4EB3,\n    0xE45E, 0xE45E, 0x1E3C, 0xE45F, 0xE461, 0x4EB4, 0xE462, 0xE462, 0x2529,\n    0xE463, 0xE464, 0x4EB7, 0xE465, 0xE465, 0x2521, 0xE466, 0xE467, 0x4EB9,\n    0xE468, 0xE468, 0x1EFF, 0xE469, 0xE472, 0x4EBB, 0xE473, 0xE473, 0x253F,\n    0xE474, 0xE474, 0x4EC5, 0xE475, 0xE475, 0x2544, 0xE476, 0xE478, 0x4EC6,\n    0xE479, 0xE479, 0x2523, 0xE47A, 0xE47A, 0x1E90, 0xE47B, 0xE47B, 0x253A,\n    0xE47C, 0xE47C, 0x2545, 0xE47D, 0xE47D, 0x4EC9, 0xE47E, 0xE47E, 0x253D,\n    0xE480, 0xE480, 0x4ECA, 0xE481, 0xE481, 0x20C1, 0xE482, 0xE483, 0x4ECB,\n    0xE484, 0xE484, 0x2103, 0xE485, 0xE485, 0x2520, 0xE486, 0xE486, 0x253C,\n    0xE487, 0xE487, 0x253B, 0xE488, 0xE488, 0x2538, 0xE489, 0xE48C, 0x4ECD,\n    0xE48D, 0xE48D, 0x2540, 0xE48E, 0xE48E, 0x4ED1, 0xE48F, 0xE48F, 0x1FCD,\n    0xE490, 0xE492, 0x4ED2, 0xE493, 0xE493, 0x1F18, 0xE494, 0xE497, 0x4ED5,\n    0xE498, 0xE498, 0x254B, 0xE499, 0xE49C, 0x4ED9, 0xE49D, 0xE49D, 0x2547,\n    0xE49E, 0xE49F, 0x254F, 0xE4A0, 0xE4A0, 0x4EDD, 0xE4A1, 0xE4FE, 0x16BF,\n    0xE540, 0xE545, 0x4EDE, 0xE546, 0xE546, 0x22B0, 0xE547, 0xE547, 0x4EE4,\n    0xE548, 0xE548, 0x2546, 0xE549, 0xE54A, 0x4EE5, 0xE54B, 0xE54B, 0x254C,\n    0xE54C, 0xE54D, 0x4EE7, 0xE54E, 0xE54E, 0x1E9A, 0xE54F, 0xE54F, 0x2552,\n    0xE550, 0xE550, 0x2530, 0xE551, 0xE551, 0x2549, 0xE552, 0xE554, 0x4EE9,\n    0xE555, 0xE555, 0x2551, 0xE556, 0xE556, 0x1ECA, 0xE557, 0xE557, 0x4EEC,\n    0xE558, 0xE558, 0x20D2, 0xE559, 0xE55B, 0x4EED, 0xE55C, 0xE55C, 0x1FB8,\n    0xE55D, 0xE55D, 0x4EF0, 0xE55E, 0xE55E, 0x2079, 0xE55F, 0xE560, 0x4EF1,\n    0xE561, 0xE561, 0x21AB, 0xE562, 0xE563, 0x4EF3, 0xE564, 0xE564, 0x254D,\n    0xE565, 0xE565, 0x1EA5, 0xE566, 0xE567, 0x4EF5, 0xE568, 0xE568, 0x204C,\n    0xE569, 0xE569, 0x2080, 0xE56A, 0xE56B, 0x4EF7, 0xE56C, 0xE56C, 0x266D,\n    0xE56D, 0xE56D, 0x4EF9, 0xE56E, 0xE56E, 0x2537, 0xE56F, 0xE574, 0x4EFA,\n    0xE575, 0xE575, 0x254A, 0xE576, 0xE576, 0x21B8, 0xE577, 0xE577, 0x4F00,\n    0xE578, 0xE578, 0x254E, 0xE579, 0xE57A, 0x4F01, 0xE57B, 0xE57B, 0x24FC,\n    0xE57C, 0xE57C, 0x2554, 0xE57D, 0xE57E, 0x4F03, 0xE580, 0xE580, 0x4F05,\n    0xE581, 0xE581, 0x1F3C, 0xE582, 0xE582, 0x4F06, 0xE583, 0xE583, 0x1ED5,\n    0xE584, 0xE589, 0x4F07, 0xE58A, 0xE58A, 0x2556, 0xE58B, 0xE58D, 0x4F0D,\n    0xE58E, 0xE58E, 0x2268, 0xE58F, 0xE590, 0x4F10, 0xE591, 0xE591, 0x1ED6,\n    0xE592, 0xE599, 0x4F12, 0xE59A, 0xE59A, 0x2557, 0xE59B, 0xE59B, 0x2553,\n    0xE59C, 0xE59E, 0x4F1A, 0xE59F, 0xE59F, 0x2548, 0xE5A0, 0xE5A0, 0x4F1D,\n    0xE5A1, 0xE5FE, 0x171D, 0xE640, 0xE640, 0x20DC, 0xE641, 0xE643, 0x4F1E,\n    0xE644, 0xE644, 0x2559, 0xE645, 0xE648, 0x4F21, 0xE649, 0xE649, 0x1F97,\n    0xE64A, 0xE64A, 0x2555, 0xE64B, 0xE64D, 0x4F25, 0xE64E, 0xE64E, 0x227D,\n    0xE64F, 0xE651, 0x4F28, 0xE652, 0xE652, 0x257E, 0xE653, 0xE655, 0x4F2B,\n    0xE656, 0xE656, 0x207C, 0xE657, 0xE657, 0x4F2E, 0xE658, 0xE658, 0x255A,\n    0xE659, 0xE65A, 0x4F2F, 0xE65B, 0xE65B, 0x255E, 0xE65C, 0xE65D, 0x4F31,\n    0xE65E, 0xE65E, 0x1E34, 0xE65F, 0xE668, 0x4F33, 0xE669, 0xE669, 0x215E,\n    0xE66A, 0xE66A, 0x4F3D, 0xE66B, 0xE66B, 0x2560, 0xE66C, 0xE674, 0x4F3E,\n    0xE675, 0xE675, 0x21A2, 0xE676, 0xE676, 0x2354, 0xE677, 0xE678, 0x4F47,\n    0xE679, 0xE679, 0x2563, 0xE67A, 0xE67A, 0x2527, 0xE67B, 0xE67B, 0x4F49,\n    0xE67C, 0xE67C, 0x252E, 0xE67D, 0xE67D, 0x2558, 0xE67E, 0xE67E, 0x4F4A,\n    0xE680, 0xE680, 0x1F1B, 0xE681, 0xE681, 0x4F4B, 0xE682, 0xE682, 0x2283,\n    0xE683, 0xE683, 0x4F4C, 0xE684, 0xE684, 0x2564, 0xE685, 0xE686, 0x4F4D,\n    0xE687, 0xE687, 0x20A0, 0xE688, 0xE688, 0x4F4F, 0xE689, 0xE689, 0x2565,\n    0xE68A, 0xE68B, 0x4F50, 0xE68C, 0xE68C, 0x2561, 0xE68D, 0xE692, 0x4F52,\n    0xE693, 0xE693, 0x2562, 0xE694, 0xE696, 0x4F58, 0xE697, 0xE697, 0x256C,\n    0xE698, 0xE69A, 0x4F5B, 0xE69B, 0xE69B, 0x256D, 0xE69C, 0xE69C, 0x2020,\n    0xE69D, 0xE69E, 0x4F5E, 0xE69F, 0xE69F, 0x255F, 0xE6A0, 0xE6A0, 0x256A,\n    0xE6A1, 0xE6FE, 0x177B, 0xE740, 0xE742, 0x4F60, 0xE743, 0xE743, 0x256E,\n    0xE744, 0xE747, 0x4F63, 0xE748, 0xE748, 0x2539, 0xE749, 0xE749, 0x255C,\n    0xE74A, 0xE74C, 0x4F67, 0xE74D, 0xE74E, 0x2568, 0xE74F, 0xE74F, 0x256B,\n    0xE750, 0xE750, 0x1E6F, 0xE751, 0xE751, 0x4F6A, 0xE752, 0xE752, 0x1FC4,\n    0xE753, 0xE753, 0x2567, 0xE754, 0xE754, 0x4F6B, 0xE755, 0xE755, 0x255B,\n    0xE756, 0xE758, 0x4F6C, 0xE759, 0xE759, 0x261D, 0xE75A, 0xE765, 0x4F6F,\n    0xE766, 0xE766, 0x252B, 0xE767, 0xE767, 0x4F7B, 0xE768, 0xE768, 0x2571,\n    0xE769, 0xE769, 0x4F7C, 0xE76A, 0xE76A, 0x2577, 0xE76B, 0xE773, 0x4F7D,\n    0xE774, 0xE774, 0x2522, 0xE775, 0xE77B, 0x4F86, 0xE77C, 0xE77C, 0x2533,\n    0xE77D, 0xE77E, 0x4F8D, 0xE780, 0xE781, 0x4F8F, 0xE782, 0xE782, 0x202A,\n    0xE783, 0xE783, 0x4F91, 0xE784, 0xE784, 0x2536, 0xE785, 0xE785, 0x2573,\n    0xE786, 0xE786, 0x256F, 0xE787, 0xE789, 0x4F92, 0xE78A, 0xE78A, 0x2293,\n    0xE78B, 0xE78B, 0x2578, 0xE78C, 0xE78E, 0x4F95, 0xE78F, 0xE78F, 0x2570,\n    0xE790, 0xE791, 0x4F98, 0xE792, 0xE792, 0x2575, 0xE793, 0xE797, 0x4F9A,\n    0xE798, 0xE799, 0x2541, 0xE79A, 0xE79A, 0x255D, 0xE79B, 0xE79F, 0x4F9F,\n    0xE7A0, 0xE7A0, 0x201A, 0xE7A1, 0xE7FE, 0x17D9, 0xE840, 0xE842, 0x4FA4,\n    0xE843, 0xE843, 0x257A, 0xE844, 0xE844, 0x2006, 0xE845, 0xE845, 0x4FA7,\n    0xE846, 0xE846, 0x2177, 0xE847, 0xE848, 0x4FA8, 0xE849, 0xE849, 0x251B,\n    0xE84A, 0xE84A, 0x4FAA, 0xE84B, 0xE84B, 0x2524, 0xE84C, 0xE84E, 0x4FAB,\n    0xE84F, 0xE84F, 0x257B, 0xE850, 0xE853, 0x4FAE, 0xE854, 0xE854, 0x22A3,\n    0xE855, 0xE859, 0x4FB2, 0xE85A, 0xE85A, 0x2579, 0xE85B, 0xE85B, 0x4FB7,\n    0xE85C, 0xE85C, 0x2566, 0xE85D, 0xE861, 0x4FB8, 0xE862, 0xE862, 0x1F93,\n    0xE863, 0xE863, 0x4FBD, 0xE864, 0xE864, 0x257C, 0xE865, 0xE86F, 0x4FBE,\n    0xE870, 0xE870, 0x2514, 0xE871, 0xE872, 0x4FC9, 0xE873, 0xE873, 0x257D,\n    0xE874, 0xE874, 0x4FCB, 0xE875, 0xE875, 0x2572, 0xE876, 0xE87B, 0x4FCC,\n    0xE87C, 0xE87C, 0x2574, 0xE87D, 0xE87E, 0x4FD2, 0xE880, 0xE880, 0x224E,\n    0xE881, 0xE881, 0x4FD4, 0xE882, 0xE882, 0x21C6, 0xE883, 0xE886, 0x4FD5,\n    0xE887, 0xE887, 0x209F, 0xE888, 0xE888, 0x4FD9, 0xE889, 0xE889, 0x2576,\n    0xE88A, 0xE88B, 0x4FDA, 0xE88C, 0xE88C, 0x2064, 0xE88D, 0xE88D, 0x22BF,\n    0xE88E, 0xE88E, 0x261C, 0xE88F, 0xE88F, 0x225E, 0xE890, 0xE8A0, 0x4FDC,\n    0xE8A1, 0xE8FE, 0x1837, 0xE940, 0xE94B, 0x4FED, 0xE94C, 0xE94C, 0x1E75,\n    0xE94D, 0xE953, 0x4FF9, 0xE954, 0xE954, 0x207D, 0xE955, 0xE955, 0x5000,\n    0xE956, 0xE956, 0x23BF, 0xE957, 0xE957, 0x2113, 0xE958, 0xE959, 0x5001,\n    0xE95A, 0xE95A, 0x23C0, 0xE95B, 0xE95C, 0x5003, 0xE95D, 0xE95D, 0x1E45,\n    0xE95E, 0xE95E, 0x5005, 0xE95F, 0xE95F, 0x1FD8, 0xE960, 0xE960, 0x23C4,\n    0xE961, 0xE961, 0x5006, 0xE962, 0xE962, 0x23C2, 0xE963, 0xE963, 0x2104,\n    0xE964, 0xE964, 0x5007, 0xE965, 0xE965, 0x21BD, 0xE966, 0xE966, 0x5008,\n    0xE967, 0xE967, 0x1F87, 0xE968, 0xE968, 0x23C3, 0xE969, 0xE96B, 0x5009,\n    0xE96C, 0xE96C, 0x2269, 0xE96D, 0xE974, 0x500C, 0xE975, 0xE975, 0x1F43,\n    0xE976, 0xE976, 0x5014, 0xE977, 0xE977, 0x1F1E, 0xE978, 0xE978, 0x2679,\n    0xE979, 0xE979, 0x1EEB, 0xE97A, 0xE97B, 0x5015, 0xE97C, 0xE97C, 0x1F35,\n    0xE97D, 0xE97D, 0x208A, 0xE97E, 0xE97E, 0x5017, 0xE980, 0xE980, 0x23C7,\n    0xE981, 0xE981, 0x23C9, 0xE982, 0xE982, 0x23C6, 0xE983, 0xE986, 0x5018,\n    0xE987, 0xE987, 0x224F, 0xE988, 0xE98A, 0x501C, 0xE98B, 0xE98B, 0x23CB,\n    0xE98C, 0xE98D, 0x501F, 0xE98E, 0xE98E, 0x21F3, 0xE98F, 0xE98F, 0x5021,\n    0xE990, 0xE990, 0x21F7, 0xE991, 0xE991, 0x23CF, 0xE992, 0xE992, 0x23CE,\n    0xE993, 0xE993, 0x23CA, 0xE994, 0xE994, 0x23CD, 0xE995, 0xE997, 0x5022,\n    0xE998, 0xE998, 0x23D0, 0xE999, 0xE99A, 0x5025, 0xE99B, 0xE99B, 0x266C,\n    0xE99C, 0xE99C, 0x5027, 0xE99D, 0xE99D, 0x23C1, 0xE99E, 0xE99E, 0x5028,\n    0xE99F, 0xE99F, 0x1FEE, 0xE9A0, 0xE9A0, 0x23D1, 0xE9A1, 0xE9FE, 0x1895,\n    0xEA40, 0xEA40, 0x1FF8, 0xEA41, 0xEA43, 0x5029, 0xEA44, 0xEA44, 0x23D3,\n    0xEA45, 0xEA47, 0x502C, 0xEA48, 0xEA48, 0x23D2, 0xEA49, 0xEA49, 0x23D4,\n    0xEA4A, 0xEA4A, 0x1E98, 0xEA4B, 0xEA4F, 0x502F, 0xEA50, 0xEA50, 0x1F2C,\n    0xEA51, 0xEA51, 0x5034, 0xEA52, 0xEA52, 0x23D5, 0xEA53, 0xEA54, 0x5035,\n    0xEA55, 0xEA55, 0x1E71, 0xEA56, 0xEA56, 0x2691, 0xEA57, 0xEA58, 0x5037,\n    0xEA59, 0xEA59, 0x23C5, 0xEA5A, 0xEA7E, 0x5039, 0xEA80, 0xEA80, 0x231A,\n    0xEA81, 0xEA83, 0x505E, 0xEA84, 0xEA84, 0x2114, 0xEA85, 0xEA86, 0x5061,\n    0xEA87, 0xEA87, 0x2284, 0xEA88, 0xEA8D, 0x5063, 0xEA8E, 0xEA8E, 0x221C,\n    0xEA8F, 0xEA8F, 0x5069, 0xEA90, 0xEA90, 0x1E7E, 0xEA91, 0xEA91, 0x204D,\n    0xEA92, 0xEA95, 0x506A, 0xEA96, 0xEA96, 0x2201, 0xEA97, 0xEA9F, 0x506E,\n    0xEAA0, 0xEAA0, 0x1ED9, 0xEAA1, 0xEAFE, 0x18F3, 0xEB40, 0xEB40, 0x5077,\n    0xEB41, 0xEB41, 0x1FB2, 0xEB42, 0xEB44, 0x5078, 0xEB45, 0xEB45, 0x2252,\n    0xEB46, 0xEB47, 0x507B, 0xEB48, 0xEB48, 0x1F79, 0xEB49, 0xEB52, 0x507D,\n    0xEB53, 0xEB53, 0x2157, 0xEB54, 0xEB54, 0x5087, 0xEB55, 0xEB55, 0x21BF,\n    0xEB56, 0xEB5A, 0x5088, 0xEB5B, 0xEB5B, 0x221F, 0xEB5C, 0xEB5C, 0x508D,\n    0xEB5D, 0xEB5D, 0x203D, 0xEB5E, 0xEB5F, 0x508E, 0xEB60, 0xEB60, 0x2015,\n    0xEB61, 0xEB61, 0x5090, 0xEB62, 0xEB62, 0x26A5, 0xEB63, 0xEB6C, 0x5091,\n    0xEB6D, 0xEB6D, 0x2156, 0xEB6E, 0xEB6F, 0x509B, 0xEB70, 0xEB70, 0x2144,\n    0xEB71, 0xEB71, 0x509D, 0xEB72, 0xEB72, 0x1E91, 0xEB73, 0xEB73, 0x2257,\n    0xEB74, 0xEB77, 0x509E, 0xEB78, 0xEB78, 0x200A, 0xEB79, 0xEB79, 0x2092,\n    0xEB7A, 0xEB7E, 0x50A2, 0xEB80, 0xEB84, 0x50A7, 0xEB85, 0xEB85, 0x2250,\n    0xEB86, 0xEB89, 0x50AC, 0xEB8A, 0xEB8A, 0x1EC3, 0xEB8B, 0xEBA0, 0x50B0,\n    0xEBA1, 0xEBFE, 0x1951, 0xEC40, 0xEC45, 0x50C6, 0xEC46, 0xEC46, 0x21A8,\n    0xEC47, 0xEC55, 0x50CC, 0xEC56, 0xEC56, 0x260D, 0xEC57, 0xEC59, 0x50DB,\n    0xEC5A, 0xEC5A, 0x260C, 0xEC5B, 0xEC5B, 0x50DE, 0xEC5C, 0xEC5C, 0x260E,\n    0xEC5D, 0xEC5F, 0x50DF, 0xEC60, 0xEC60, 0x2032, 0xEC61, 0xEC6D, 0x50E2,\n    0xEC6E, 0xEC6E, 0x260B, 0xEC6F, 0xEC75, 0x50EF, 0xEC76, 0xEC76, 0x22C3,\n    0xEC77, 0xEC7E, 0x50F6, 0xEC80, 0xEC95, 0x50FE, 0xEC96, 0xEC96, 0x1F23,\n    0xEC97, 0xECA0, 0x5114, 0xECA1, 0xECFE, 0x19AF, 0xED40, 0xED45, 0x511E,\n    0xED46, 0xED46, 0x2695, 0xED47, 0xED57, 0x5124, 0xED58, 0xED58, 0x265E,\n    0xED59, 0xED5D, 0x5135, 0xED5E, 0xED5E, 0x265D, 0xED5F, 0xED60, 0x513A,\n    0xED61, 0xED61, 0x2692, 0xED62, 0xED63, 0x513C, 0xED64, 0xED64, 0x265F,\n    0xED65, 0xED65, 0x513E, 0xED66, 0xED66, 0x218D, 0xED67, 0xED67, 0x20FD,\n    0xED68, 0xED6D, 0x513F, 0xED6E, 0xED6E, 0x1F40, 0xED6F, 0xED73, 0x5145,\n    0xED74, 0xED74, 0x2465, 0xED75, 0xED76, 0x514A, 0xED77, 0xED77, 0x2467,\n    0xED78, 0xED78, 0x514C, 0xED79, 0xED79, 0x2466, 0xED7A, 0xED7E, 0x514D,\n    0xED80, 0xED90, 0x5152, 0xED91, 0xED91, 0x21C9, 0xED92, 0xED92, 0x5163,\n    0xED93, 0xED93, 0x2209, 0xED94, 0xED94, 0x1EC9, 0xED95, 0xED95, 0x20E9,\n    0xED96, 0xED96, 0x5164, 0xED97, 0xED97, 0x21CA, 0xED98, 0xED98, 0x2146,\n    0xED99, 0xED99, 0x25C5, 0xED9A, 0xED9A, 0x21DC, 0xED9B, 0xED9B, 0x5165,\n    0xED9C, 0xED9C, 0x245E, 0xED9D, 0xED9D, 0x5166, 0xED9E, 0xED9E, 0x214F,\n    0xED9F, 0xED9F, 0x5167, 0xEDA0, 0xEDA0, 0x25C6, 0xEDA1, 0xEDFE, 0x1A0D,\n    0xEE40, 0xEE40, 0x25C7, 0xEE41, 0xEE41, 0x2241, 0xEE42, 0xEE42, 0x218A,\n    0xEE43, 0xEE43, 0x1E2F, 0xEE44, 0xEE44, 0x1EDC, 0xEE45, 0xEE47, 0x5168,\n    0xEE48, 0xEE48, 0x20BF, 0xEE49, 0xEE49, 0x2034, 0xEE4A, 0xEE4C, 0x516B,\n    0xEE4D, 0xEE4D, 0x25C9, 0xEE4E, 0xEE51, 0x516E, 0xEE52, 0xEE52, 0x25C8,\n    0xEE53, 0xEE54, 0x5172, 0xEE55, 0xEE55, 0x220E, 0xEE56, 0xEE56, 0x5174,\n    0xEE57, 0xEE57, 0x25CB, 0xEE58, 0xEE5D, 0x5175, 0xEE5E, 0xEE5E, 0x217D,\n    0xEE5F, 0xEE60, 0x517B, 0xEE61, 0xEE61, 0x1F7E, 0xEE62, 0xEE67, 0x517D,\n    0xEE68, 0xEE68, 0x25CC, 0xEE69, 0xEE69, 0x1FC3, 0xEE6A, 0xEE6B, 0x5183,\n    0xEE6C, 0xEE6C, 0x20B9, 0xEE6D, 0xEE6D, 0x5185, 0xEE6E, 0xEE6E, 0x2181,\n    0xEE6F, 0xEE76, 0x5186, 0xEE77, 0xEE77, 0x1FDA, 0xEE78, 0xEE7C, 0x518E,\n    0xEE7D, 0xEE7D, 0x2173, 0xEE7E, 0xEE7E, 0x1EE1, 0xEE80, 0xEE80, 0x25CD,\n    0xEE81, 0xEE84, 0x5193, 0xEE85, 0xEE85, 0x25CE, 0xEE86, 0xEE86, 0x21F6,\n    0xEE87, 0xEE89, 0x5197, 0xEE8A, 0xEE8A, 0x224B, 0xEE8B, 0xEE8B, 0x25D1,\n    0xEE8C, 0xEE8C, 0x519A, 0xEE8D, 0xEE8D, 0x1EC0, 0xEE8E, 0xEE8F, 0x519B,\n    0xEE90, 0xEE90, 0x2008, 0xEE91, 0xEE93, 0x519D, 0xEE94, 0xEE94, 0x25D0,\n    0xEE95, 0xEE96, 0x51A0, 0xEE97, 0xEE97, 0x25D2, 0xEE98, 0xEE98, 0x51A2,\n    0xEE99, 0xEE99, 0x1F2A, 0xEE9A, 0xEE9C, 0x51A3, 0xEE9D, 0xEE9D, 0x1E72,\n    0xEE9E, 0xEE9E, 0x25D3, 0xEE9F, 0xEEA0, 0x51A6, 0xEEA1, 0xEEFE, 0x1A6B,\n    0xEF40, 0xEF40, 0x21BE, 0xEF41, 0xEF41, 0x25D4, 0xEF42, 0xEF42, 0x2044,\n    0xEF43, 0xEF43, 0x51A8, 0xEF44, 0xEF44, 0x25CF, 0xEF45, 0xEF45, 0x20F3,\n    0xEF46, 0xEF4B, 0x51A9, 0xEF4C, 0xEF4C, 0x1F00, 0xEF4D, 0xEF51, 0x51AF,\n    0xEF52, 0xEF53, 0x24CC, 0xEF54, 0xEF54, 0x51B4, 0xEF55, 0xEF55, 0x2698,\n    0xEF56, 0xEF56, 0x51B5, 0xEF57, 0xEF57, 0x2678, 0xEF58, 0xEF59, 0x51B6,\n    0xEF5A, 0xEF5A, 0x24CE, 0xEF5B, 0xEF5F, 0x51B8, 0xEF60, 0xEF60, 0x24CF,\n    0xEF61, 0xEF67, 0x51BD, 0xEF68, 0xEF68, 0x20B8, 0xEF69, 0xEF69, 0x51C4,\n    0xEF6A, 0xEF6A, 0x24D0, 0xEF6B, 0xEF6B, 0x51C5, 0xEF6C, 0xEF6C, 0x24D1,\n    0xEF6D, 0xEF76, 0x51C6, 0xEF77, 0xEF77, 0x1EF4, 0xEF78, 0xEF79, 0x51D0,\n    0xEF7A, 0xEF7A, 0x239B, 0xEF7B, 0xEF7B, 0x51D2, 0xEF7C, 0xEF7C, 0x267E,\n    0xEF7D, 0xEF7E, 0x51D3, 0xEF80, 0xEF81, 0x51D5, 0xEF82, 0xEF82, 0x239D,\n    0xEF83, 0xEF84, 0x239F, 0xEF85, 0xEF85, 0x51D7, 0xEF86, 0xEF86, 0x23A1,\n    0xEF87, 0xEF87, 0x51D8, 0xEF88, 0xEF88, 0x1EF1, 0xEF89, 0xEF8A, 0x51D9,\n    0xEF8B, 0xEF8B, 0x221E, 0xEF8C, 0xEF8C, 0x51DB, 0xEF8D, 0xEF8D, 0x23A2,\n    0xEF8E, 0xEF94, 0x51DC, 0xEF95, 0xEF95, 0x214B, 0xEF96, 0xEF96, 0x1E36,\n    0xEF97, 0xEF97, 0x2135, 0xEF98, 0xEF9B, 0x51E3, 0xEF9C, 0xEF9C, 0x1FAD,\n    0xEF9D, 0xEF9D, 0x51E7, 0xEF9E, 0xEF9E, 0x1E53, 0xEF9F, 0xEFA0, 0x51E8,\n    0xEFA1, 0xEFFE, 0x1AC9, 0xF040, 0xF040, 0x51EA, 0xF041, 0xF041, 0x23A3,\n    0xF042, 0xF042, 0x2203, 0xF043, 0xF043, 0x51EB, 0xF044, 0xF044, 0x1EE7,\n    0xF045, 0xF046, 0x51EC, 0xF047, 0xF047, 0x23A4, 0xF048, 0xF048, 0x2097,\n    0xF049, 0xF049, 0x1EE4, 0xF04A, 0xF04D, 0x51EE, 0xF04E, 0xF04E, 0x2238,\n    0xF04F, 0xF050, 0x51F2, 0xF051, 0xF051, 0x23A5, 0xF052, 0xF053, 0x51F4,\n    0xF054, 0xF054, 0x1F9A, 0xF055, 0xF056, 0x51F6, 0xF057, 0xF057, 0x21C3,\n    0xF058, 0xF05D, 0x51F8, 0xF05E, 0xF05E, 0x1F2E, 0xF05F, 0xF067, 0x51FE,\n    0xF068, 0xF068, 0x239C, 0xF069, 0xF06B, 0x5207, 0xF06C, 0xF06C, 0x23A6,\n    0xF06D, 0xF070, 0x520A, 0xF071, 0xF071, 0x239E, 0xF072, 0xF072, 0x520E,\n    0xF073, 0xF073, 0x2035, 0xF074, 0xF074, 0x23A7, 0xF075, 0xF077, 0x520F,\n    0xF078, 0xF078, 0x23A8, 0xF079, 0xF079, 0x5212, 0xF07A, 0xF07A, 0x2075,\n    0xF07B, 0xF07C, 0x5213, 0xF07D, 0xF07E, 0x23A9, 0xF080, 0xF080, 0x23AB,\n    0xF081, 0xF081, 0x1FEB, 0xF082, 0xF082, 0x23AC, 0xF083, 0xF086, 0x5215,\n    0xF087, 0xF087, 0x1F6A, 0xF088, 0xF088, 0x20F9, 0xF089, 0xF08A, 0x5219,\n    0xF08B, 0xF08B, 0x2666, 0xF08C, 0xF08F, 0x521B, 0xF090, 0xF090, 0x2667,\n    0xF091, 0xF091, 0x521F, 0xF092, 0xF092, 0x1E6C, 0xF093, 0xF095, 0x5220,\n    0xF096, 0xF096, 0x23AD, 0xF097, 0xF0A0, 0x5223, 0xF0A1, 0xF0FE, 0x1B27,\n    0xF140, 0xF151, 0x522D, 0xF152, 0xF152, 0x206D, 0xF153, 0xF153, 0x2242,\n    0xF154, 0xF154, 0x1F02, 0xF155, 0xF156, 0x523F, 0xF157, 0xF157, 0x2183,\n    0xF158, 0xF158, 0x5241, 0xF159, 0xF159, 0x1E85, 0xF15A, 0xF15A, 0x21E9,\n    0xF15B, 0xF166, 0x5242, 0xF167, 0xF167, 0x1E57, 0xF168, 0xF175, 0x524E,\n    0xF176, 0xF176, 0x22A5, 0xF177, 0xF177, 0x2407, 0xF178, 0xF178, 0x1FCA,\n    0xF179, 0xF179, 0x525C, 0xF17A, 0xF17A, 0x2402, 0xF17B, 0xF17B, 0x1F82,\n    0xF17C, 0xF17D, 0x525D, 0xF17E, 0xF17E, 0x2408, 0xF180, 0xF180, 0x2404,\n    0xF181, 0xF181, 0x525F, 0xF182, 0xF182, 0x2131, 0xF183, 0xF183, 0x5260,\n    0xF184, 0xF184, 0x2184, 0xF185, 0xF185, 0x5261, 0xF186, 0xF186, 0x2403,\n    0xF187, 0xF187, 0x5262, 0xF188, 0xF188, 0x206E, 0xF189, 0xF189, 0x240B,\n    0xF18A, 0xF193, 0x5263, 0xF194, 0xF194, 0x1F3F, 0xF195, 0xF197, 0x526D,\n    0xF198, 0xF198, 0x2067, 0xF199, 0xF1A0, 0x5270, 0xF1A1, 0xF1FE, 0x1B85,\n    0xF240, 0xF244, 0x5278, 0xF245, 0xF245, 0x1FD7, 0xF246, 0xF246, 0x527D,\n    0xF247, 0xF247, 0x1E83, 0xF248, 0xF24A, 0x527E, 0xF24B, 0xF24B, 0x240F,\n    0xF24C, 0xF252, 0x5281, 0xF253, 0xF253, 0x240E, 0xF254, 0xF254, 0x20C7,\n    0xF255, 0xF255, 0x240D, 0xF256, 0xF25B, 0x5288, 0xF25C, 0xF25C, 0x2412,\n    0xF25D, 0xF25E, 0x528E, 0xF25F, 0xF25F, 0x20B7, 0xF260, 0xF270, 0x5290,\n    0xF271, 0xF271, 0x23F0, 0xF272, 0xF272, 0x52A1, 0xF273, 0xF273, 0x2411,\n    0xF274, 0xF274, 0x2414, 0xF275, 0xF275, 0x52A2, 0xF276, 0xF276, 0x2170,\n    0xF277, 0xF27B, 0x52A3, 0xF27C, 0xF27C, 0x2405, 0xF27D, 0xF27D, 0x210C,\n    0xF27E, 0xF27E, 0x2415, 0xF280, 0xF284, 0x52A8, 0xF285, 0xF285, 0x2066,\n    0xF286, 0xF286, 0x52AD, 0xF287, 0xF287, 0x2352, 0xF288, 0xF288, 0x2413,\n    0xF289, 0xF289, 0x2410, 0xF28A, 0xF28B, 0x2416, 0xF28C, 0xF28C, 0x20F1,\n    0xF28D, 0xF290, 0x52AE, 0xF291, 0xF291, 0x240A, 0xF292, 0xF293, 0x52B2,\n    0xF294, 0xF294, 0x2409, 0xF295, 0xF295, 0x52B4, 0xF296, 0xF296, 0x2418,\n    0xF297, 0xF29B, 0x52B5, 0xF29C, 0xF29C, 0x1FA7, 0xF29D, 0xF29D, 0x52BA,\n    0xF29E, 0xF29E, 0x21FC, 0xF29F, 0xF2A0, 0x52BB, 0xF2A1, 0xF2FE, 0x1BE3,\n    0xF340, 0xF340, 0x1FC1, 0xF341, 0xF341, 0x2406, 0xF342, 0xF344, 0x52BD,\n    0xF345, 0xF345, 0x229C, 0xF346, 0xF347, 0x52C0, 0xF348, 0xF348, 0x204E,\n    0xF349, 0xF349, 0x52C2, 0xF34A, 0xF34A, 0x241A, 0xF34B, 0xF34B, 0x2419,\n    0xF34C, 0xF34F, 0x52C3, 0xF350, 0xF350, 0x240C, 0xF351, 0xF360, 0x52C7,\n    0xF361, 0xF361, 0x1E29, 0xF362, 0xF373, 0x52D7, 0xF374, 0xF374, 0x2661,\n    0xF375, 0xF375, 0x52E9, 0xF376, 0xF376, 0x26A4, 0xF377, 0xF377, 0x2174,\n    0xF378, 0xF378, 0x2663, 0xF379, 0xF379, 0x2662, 0xF37A, 0xF37E, 0x52EA,\n    0xF380, 0xF38B, 0x52EF, 0xF38C, 0xF38C, 0x2675, 0xF38D, 0xF39F, 0x52FB,\n    0xF3A0, 0xF3A0, 0x214C, 0xF3A1, 0xF3FE, 0x1C41, 0xF440, 0xF444, 0x530E,\n    0xF445, 0xF445, 0x267A, 0xF446, 0xF44F, 0x5313, 0xF450, 0xF450, 0x26A0,\n    0xF451, 0xF456, 0x531D, 0xF457, 0xF457, 0x2668, 0xF458, 0xF458, 0x5323,\n    0xF459, 0xF459, 0x1ED0, 0xF45A, 0xF45A, 0x5324, 0xF45B, 0xF45B, 0x2096,\n    0xF45C, 0xF45C, 0x5325, 0xF45D, 0xF45D, 0x23CC, 0xF45E, 0xF461, 0x5326,\n    0xF462, 0xF462, 0x23C8, 0xF463, 0xF463, 0x532A, 0xF464, 0xF464, 0x223E,\n    0xF465, 0xF474, 0x532B, 0xF475, 0xF475, 0x2665, 0xF476, 0xF47B, 0x533B,\n    0xF47C, 0xF47C, 0x2664, 0xF47D, 0xF47D, 0x5341, 0xF47E, 0xF47E, 0x2239,\n    0xF480, 0xF493, 0x5342, 0xF494, 0xF494, 0x204A, 0xF495, 0xF498, 0x5356,\n    0xF499, 0xF499, 0x261F, 0xF49A, 0xF49B, 0x535A, 0xF49C, 0xF49C, 0x261E,\n    0xF49D, 0xF4A0, 0x535C, 0xF4A1, 0xF4FE, 0x1C9F, 0xF540, 0xF544, 0x5360,\n    0xF545, 0xF545, 0x2620, 0xF546, 0xF546, 0x5365, 0xF547, 0xF547, 0x2621,\n    0xF548, 0xF551, 0x5366, 0xF552, 0xF552, 0x2622, 0xF553, 0xF553, 0x5370,\n    0xF554, 0xF554, 0x2627, 0xF555, 0xF555, 0x1E39, 0xF556, 0xF556, 0x2625,\n    0xF557, 0xF55D, 0x5371, 0xF55E, 0xF55E, 0x2629, 0xF55F, 0xF560, 0x5378,\n    0xF561, 0xF561, 0x262E, 0xF562, 0xF562, 0x262B, 0xF563, 0xF56D, 0x537A,\n    0xF56E, 0xF56E, 0x262A, 0xF56F, 0xF56F, 0x262D, 0xF570, 0xF570, 0x5385,\n    0xF571, 0xF571, 0x2628, 0xF572, 0xF572, 0x21B9, 0xF573, 0xF57E, 0x5386,\n    0xF580, 0xF584, 0x5392, 0xF585, 0xF585, 0x2636, 0xF586, 0xF586, 0x2630,\n    0xF587, 0xF58B, 0x5397, 0xF58C, 0xF58C, 0x2638, 0xF58D, 0xF58D, 0x539C,\n    0xF58E, 0xF58E, 0x200D, 0xF58F, 0xF58F, 0x2637, 0xF590, 0xF598, 0x539D,\n    0xF599, 0xF599, 0x2645, 0xF59A, 0xF59A, 0x53A6, 0xF59B, 0xF59B, 0x263A,\n    0xF59C, 0xF59F, 0x53A7, 0xF5A0, 0xF5A0, 0x2643, 0xF5A1, 0xF5FE, 0x1CFD,\n    0xF640, 0xF640, 0x53AB, 0xF641, 0xF641, 0x2640, 0xF642, 0xF644, 0x53AC,\n    0xF645, 0xF645, 0x263D, 0xF646, 0xF646, 0x2641, 0xF647, 0xF647, 0x53AF,\n    0xF648, 0xF648, 0x263E, 0xF649, 0xF64A, 0x53B0, 0xF64B, 0xF64B, 0x263F,\n    0xF64C, 0xF64C, 0x1FC0, 0xF64D, 0xF64D, 0x53B2, 0xF64E, 0xF64F, 0x263B,\n    0xF650, 0xF653, 0x53B3, 0xF654, 0xF654, 0x2642, 0xF655, 0xF657, 0x53B7,\n    0xF658, 0xF658, 0x2644, 0xF659, 0xF660, 0x53BA, 0xF661, 0xF661, 0x2639,\n    0xF662, 0xF662, 0x53C2, 0xF663, 0xF663, 0x264C, 0xF664, 0xF66B, 0x53C3,\n    0xF66C, 0xF66C, 0x2647, 0xF66D, 0xF66D, 0x264B, 0xF66E, 0xF670, 0x53CB,\n    0xF671, 0xF671, 0x2649, 0xF672, 0xF673, 0x53CE, 0xF674, 0xF674, 0x2648,\n    0xF675, 0xF675, 0x53D0, 0xF676, 0xF676, 0x264A, 0xF677, 0xF677, 0x2108,\n    0xF678, 0xF67E, 0x53D1, 0xF680, 0xF684, 0x53D8, 0xF685, 0xF685, 0x264D,\n    0xF686, 0xF687, 0x53DD, 0xF688, 0xF688, 0x2634, 0xF689, 0xF689, 0x53DF,\n    0xF68A, 0xF68A, 0x2651, 0xF68B, 0xF68C, 0x53E0, 0xF68D, 0xF68D, 0x2650,\n    0xF68E, 0xF68E, 0x2652, 0xF68F, 0xF691, 0x53E2, 0xF692, 0xF692, 0x264F,\n    0xF693, 0xF695, 0x53E5, 0xF696, 0xF696, 0x2632, 0xF697, 0xF697, 0x264E,\n    0xF698, 0xF698, 0x2653, 0xF699, 0xF699, 0x53E8, 0xF69A, 0xF69A, 0x2657,\n    0xF69B, 0xF69B, 0x53E9, 0xF69C, 0xF69C, 0x2635, 0xF69D, 0xF69D, 0x53EA,\n    0xF69E, 0xF69E, 0x2633, 0xF69F, 0xF69F, 0x53EB, 0xF6A0, 0xF6A0, 0x2656,\n    0xF6A1, 0xF6FE, 0x1D5B, 0xF740, 0xF741, 0x53EC, 0xF742, 0xF742, 0x2654,\n    0xF743, 0xF748, 0x53EE, 0xF749, 0xF749, 0x2658, 0xF74A, 0xF74B, 0x53F4,\n    0xF74C, 0xF74C, 0x2655, 0xF74D, 0xF74D, 0x1E4D, 0xF74E, 0xF755, 0x53F6,\n    0xF756, 0xF756, 0x265B, 0xF757, 0xF757, 0x53FE, 0xF758, 0xF758, 0x265A,\n    0xF759, 0xF759, 0x53FF, 0xF75A, 0xF75A, 0x2659, 0xF75B, 0xF75B, 0x202E,\n    0xF75C, 0xF75C, 0x262F, 0xF75D, 0xF760, 0x5400, 0xF761, 0xF761, 0x2646,\n    0xF762, 0xF762, 0x5404, 0xF763, 0xF763, 0x2626, 0xF764, 0xF76A, 0x5405,\n    0xF76B, 0xF76B, 0x265C, 0xF76C, 0xF770, 0x540C, 0xF771, 0xF771, 0x262C,\n    0xF772, 0xF77B, 0x5411, 0xF77C, 0xF77C, 0x2623, 0xF77D, 0xF77D, 0x541B,\n    0xF77E, 0xF77E, 0x2631, 0xF780, 0xF7A0, 0x541C, 0xF7A1, 0xF7FE, 0x1DB9,\n    0xF840, 0xF841, 0x543D, 0xF842, 0xF842, 0x209C, 0xF843, 0xF845, 0x543F,\n    0xF846, 0xF846, 0x2580, 0xF847, 0xF848, 0x5442, 0xF849, 0xF849, 0x22DC,\n    0xF84A, 0xF84F, 0x5444, 0xF850, 0xF850, 0x1F05, 0xF851, 0xF851, 0x208B,\n    0xF852, 0xF852, 0x544A, 0xF853, 0xF853, 0x2581, 0xF854, 0xF862, 0x544B,\n    0xF863, 0xF863, 0x2583, 0xF864, 0xF864, 0x2582, 0xF865, 0xF865, 0x545A,\n    0xF866, 0xF866, 0x21EE, 0xF867, 0xF871, 0x545B, 0xF872, 0xF872, 0x2182,\n    0xF873, 0xF877, 0x5466, 0xF878, 0xF878, 0x2243, 0xF879, 0xF879, 0x546B,\n    0xF87A, 0xF87A, 0x2587, 0xF87B, 0xF87B, 0x546C, 0xF87C, 0xF87C, 0x2588,\n    0xF87D, 0xF87E, 0x546D, 0xF880, 0xF880, 0x546F, 0xF881, 0xF881, 0x2584,\n    0xF882, 0xF883, 0x5470, 0xF884, 0xF884, 0x21FD, 0xF885, 0xF885, 0x5472,\n    0xF886, 0xF886, 0x21EF, 0xF887, 0xF88C, 0x5473, 0xF88D, 0xF88D, 0x258A,\n    0xF88E, 0xF88E, 0x258C, 0xF88F, 0xF898, 0x5479, 0xF899, 0xF899, 0x1F47,\n    0xF89A, 0xF89C, 0x5483, 0xF89D, 0xF89D, 0x1F1D, 0xF89E, 0xF89F, 0x5486,\n    0xF8A0, 0xF8A0, 0x258D, 0xF940, 0xF94D, 0x5488, 0xF94E, 0xF94E, 0x1FD0,\n    0xF94F, 0xF94F, 0x2592, 0xF950, 0xF950, 0x258F, 0xF951, 0xF958, 0x5496,\n    0xF959, 0xF959, 0x2594, 0xF95A, 0xF95A, 0x1EE0, 0xF95B, 0xF95C, 0x549E,\n    0xF95D, 0xF95D, 0x2591, 0xF95E, 0xF95E, 0x2595, 0xF95F, 0xF966, 0x54A0,\n    0xF967, 0xF967, 0x2597, 0xF968, 0xF968, 0x54A8, 0xF969, 0xF969, 0x20B6,\n    0xF96A, 0xF96B, 0x54A9, 0xF96C, 0xF96C, 0x2598, 0xF96D, 0xF96E, 0x54AB,\n    0xF96F, 0xF96F, 0x20F6, 0xF970, 0xF97E, 0x54AD, 0xF980, 0xF984, 0x54BC,\n    0xF985, 0xF985, 0x2585, 0xF986, 0xF986, 0x54C1, 0xF987, 0xF987, 0x2599,\n    0xF988, 0xF990, 0x54C2, 0xF991, 0xF991, 0x2596, 0xF992, 0xF995, 0x54CB,\n    0xF996, 0xF996, 0x259A, 0xF997, 0xF997, 0x54CF, 0xF998, 0xF998, 0x259B,\n    0xF999, 0xF9A0, 0x54D0, 0xFA40, 0xFA41, 0x54D8, 0xFA42, 0xFA42, 0x259D,\n    0xFA43, 0xFA45, 0x54DA, 0xFA46, 0xFA46, 0x259E, 0xFA47, 0xFA4B, 0x54DD,\n    0xFA4C, 0xFA4C, 0x234C, 0xFA4D, 0xFA50, 0x54E2, 0xFA51, 0xFA51, 0x1F44,\n    0xFA52, 0xFA57, 0x54E6, 0xFA58, 0xFA58, 0x2660, 0xFA59, 0xFA59, 0x25A0,\n    0xFA5A, 0xFA5C, 0x54EC, 0xFA5D, 0xFA5D, 0x259C, 0xFA5E, 0xFA5E, 0x54EF,\n    0xFA5F, 0xFA5F, 0x259F, 0xFA60, 0xFA60, 0x54F0, 0xFA61, 0xFA61, 0x1F6C,\n    0xFA62, 0xFA6F, 0x54F1, 0xFA70, 0xFA70, 0x25A2, 0xFA71, 0xFA73, 0x54FF,\n    0xFA74, 0xFA74, 0x20AE, 0xFA75, 0xFA75, 0x5502, 0xFA76, 0xFA76, 0x258B,\n    0xFA77, 0xFA77, 0x25A3, 0xFA78, 0xFA7E, 0x5503, 0xFA80, 0xFA82, 0x550A,\n    0xFA83, 0xFA83, 0x2589, 0xFA84, 0xFA84, 0x25A5, 0xFA85, 0xFA8C, 0x550D,\n    0xFA8D, 0xFA8D, 0x25A4, 0xFA8E, 0xFA8F, 0x5515, 0xFA90, 0xFA90, 0x25A6,\n    0xFA91, 0xFA91, 0x2593, 0xFA92, 0xFA95, 0x5517, 0xFA96, 0xFA96, 0x25A7,\n    0xFA97, 0xFA97, 0x2222, 0xFA98, 0xFA98, 0x25A9, 0xFA99, 0xFAA0, 0x551B,\n    0xFB40, 0xFB48, 0x5523, 0xFB49, 0xFB49, 0x25A8, 0xFB4A, 0xFB51, 0x552C,\n    0xFB52, 0xFB52, 0x2586, 0xFB53, 0xFB56, 0x5534, 0xFB57, 0xFB57, 0x25A1,\n    0xFB58, 0xFB58, 0x25AA, 0xFB59, 0xFB59, 0x5538, 0xFB5A, 0xFB5A, 0x2590,\n    0xFB5B, 0xFB5B, 0x258E, 0xFB5C, 0xFB74, 0x5539, 0xFB75, 0xFB75, 0x2688,\n    0xFB76, 0xFB78, 0x5552, 0xFB79, 0xFB79, 0x269E, 0xFB7A, 0xFB7A, 0x25FB,\n    0xFB7B, 0xFB7B, 0x5555, 0xFB7C, 0xFB7C, 0x1F8C, 0xFB7D, 0xFB7D, 0x21F4,\n    0xFB7E, 0xFB7E, 0x5556, 0xFB80, 0xFB8F, 0x5557, 0xFB90, 0xFB90, 0x200F,\n    0xFB91, 0xFB9B, 0x5567, 0xFB9C, 0xFB9C, 0x2071, 0xFB9D, 0xFB9E, 0x5572,\n    0xFB9F, 0xFB9F, 0x25F7, 0xFBA0, 0xFBA0, 0x5574, 0xFC40, 0xFC43, 0x5575,\n    0xFC44, 0xFC44, 0x2696, 0xFC45, 0xFC48, 0x5579, 0xFC49, 0xFC49, 0x268F,\n    0xFC4A, 0xFC59, 0x557D, 0xFC5A, 0xFC5A, 0x22DA, 0xFC5B, 0xFC62, 0x558D,\n    0xFC63, 0xFC63, 0x1EC1, 0xFC64, 0xFC67, 0x5595, 0xFC68, 0xFC68, 0x1EB3,\n    0xFC69, 0xFC6E, 0x5599, 0xFC6F, 0xFC6F, 0x266A, 0xFC70, 0xFC70, 0x559F,\n    0xFC71, 0xFC71, 0x268A, 0xFC72, 0xFC73, 0x55A0, 0xFC74, 0xFC74, 0x2669,\n    0xFC75, 0xFC76, 0x55A2, 0xFC77, 0xFC78, 0x2618, 0xFC79, 0xFC7E, 0x55A4,\n    0xFC80, 0xFC82, 0x55AA, 0xFC83, 0xFC83, 0x261A, 0xFC84, 0xFC89, 0x55AD,\n    0xFC8A, 0xFC8A, 0x2673, 0xFC8B, 0xFCA0, 0x55B3, 0xFD40, 0xFD51, 0x55C9,\n    0xFD52, 0xFD52, 0x20C6, 0xFD53, 0xFD53, 0x226B, 0xFD54, 0xFD56, 0x55DB,\n    0xFD57, 0xFD57, 0x24D3, 0xFD58, 0xFD58, 0x1E86, 0xFD59, 0xFD59, 0x55DE,\n    0xFD5A, 0xFD5A, 0x260F, 0xFD5B, 0xFD5E, 0x55DF, 0xFD5F, 0xFD5F, 0x2611,\n    0xFD60, 0xFD61, 0x55E3, 0xFD62, 0xFD62, 0x2613, 0xFD63, 0xFD64, 0x55E5,\n    0xFD65, 0xFD65, 0x2610, 0xFD66, 0xFD66, 0x2612, 0xFD67, 0xFD67, 0x2030,\n    0xFD68, 0xFD68, 0x55E7, 0xFD69, 0xFD69, 0x2671, 0xFD6A, 0xFD6B, 0x55E8,\n    0xFD6C, 0xFD6C, 0x2614, 0xFD6D, 0xFD6F, 0x55EA, 0xFD70, 0xFD70, 0x2616,\n    0xFD71, 0xFD71, 0x55ED, 0xFD72, 0xFD72, 0x2615, 0xFD73, 0xFD77, 0x55EE,\n    0xFD78, 0xFD78, 0x20F2, 0xFD79, 0xFD7C, 0x55F3, 0xFD7D, 0xFD7D, 0x2617,\n    0xFD7E, 0xFD7E, 0x55F7, 0xFD80, 0xFD87, 0x55F8, 0xFD88, 0xFD88, 0x2037,\n    0xFD89, 0xFD8A, 0x5600, 0xFD8B, 0xFD8B, 0x20B3, 0xFD8C, 0xFD8E, 0x5602,\n    0xFD8F, 0xFD8F, 0x1F22, 0xFD90, 0xFD90, 0x24ED, 0xFD91, 0xFD93, 0x5605,\n    0xFD94, 0xFD94, 0x1F34, 0xFD95, 0xFD9C, 0x5608, 0xFD9D, 0xFD9D, 0x0A02,\n    0xFD9E, 0xFD9E, 0x40D3, 0xFD9F, 0xFD9F, 0x200C, 0xFDA0, 0xFDA0, 0x5083,\n    0xFE40, 0xFE40, 0x1259, 0xFE41, 0xFE7E, 0x5610, 0xFE80, 0xFEA0, 0x564E,\n};\nextern const unsigned short g_FXCMAP_GBK2K_H_5_DWord[1017 * 4] = {\n    0x8130, 0x8436, 0x8436, 0x5752, 0x8138, 0xFD38, 0xFD39, 0x579C, 0x8138, 0xFE30, 0xFE39, 0x579E,\n    0x8139, 0x8130, 0x8137, 0x57A8, 0x8139, 0x8139, 0x8139, 0x57B0, 0x8139, 0x8230, 0x8239, 0x57B1,\n    0x8139, 0x8330, 0x8339, 0x57BB, 0x8139, 0x8430, 0x8439, 0x57C5, 0x8139, 0x8530, 0x8539, 0x57CF,\n    0x8139, 0x8630, 0x8639, 0x57D9, 0x8139, 0x8730, 0x8739, 0x57E3, 0x8139, 0x8830, 0x8839, 0x57ED,\n    0x8139, 0x8930, 0x8939, 0x57F7, 0x8139, 0x8B32, 0x8B32, 0x1042, 0x8139, 0x8B33, 0x8B33, 0x1263,\n    0x8139, 0x8B34, 0x8B34, 0x1272, 0x8139, 0x8B35, 0x8B35, 0x1265, 0x8139, 0x8B36, 0x8B36, 0x1059,\n    0x8139, 0x8B37, 0x8B37, 0x2793, 0x8139, 0x8B38, 0x8B38, 0x063D, 0x8139, 0x8B39, 0x8B39, 0x1303,\n    0x8139, 0x8C30, 0x8C30, 0x0CA6, 0x8139, 0x8C31, 0x8C31, 0x0638, 0x8139, 0x8C32, 0x8C32, 0x0CC6,\n    0x8139, 0x8C33, 0x8C33, 0x03D6, 0x8139, 0x8C34, 0x8C34, 0x129D, 0x8139, 0x8C35, 0x8C35, 0x1314,\n    0x8139, 0x8C36, 0x8C36, 0x130F, 0x8139, 0x8C37, 0x8C37, 0x082B, 0x8139, 0x8C38, 0x8C38, 0x1399,\n    0x8139, 0x8C39, 0x8C39, 0x0597, 0x8139, 0x8D30, 0x8D30, 0x09EF, 0x8139, 0x8D31, 0x8D31, 0x12FC,\n    0x8139, 0x8D32, 0x8D32, 0x1266, 0x8139, 0x8D33, 0x8D33, 0x1284, 0x8139, 0x8D34, 0x8D34, 0x2A1A,\n    0x8139, 0x8D35, 0x8D35, 0x0D45, 0x8139, 0x8D36, 0x8D36, 0x047E, 0x8139, 0x8D37, 0x8D37, 0x1352,\n    0x8139, 0x8D38, 0x8D38, 0x04CC, 0x8139, 0x8D39, 0x8D39, 0x139C, 0x8139, 0x8E30, 0x8E30, 0x10BB,\n    0x8139, 0x8E31, 0x8E31, 0x0967, 0x8139, 0x8E32, 0x8E32, 0x1593, 0x8139, 0x8E33, 0x8E33, 0x0E72,\n    0x8139, 0x8E34, 0x8E34, 0x0D56, 0x8139, 0x8E35, 0x8E35, 0x161C, 0x8139, 0x8E36, 0x8E36, 0x2D2D,\n    0x8139, 0x8E37, 0x8E37, 0x0F13, 0x8139, 0x8E38, 0x8E38, 0x0576, 0x8139, 0x8E39, 0x8E39, 0x0B6F,\n    0x8139, 0x8F30, 0x8F30, 0x1230, 0x8139, 0x8F31, 0x8F31, 0x172E, 0x8139, 0x8F32, 0x8F32, 0x056A,\n    0x8139, 0x8F33, 0x8F33, 0x0F6C, 0x8139, 0x8F34, 0x8F34, 0x14B6, 0x8139, 0x8F35, 0x8F35, 0x0D43,\n    0x8139, 0x8F36, 0x8F36, 0x1774, 0x8139, 0x8F37, 0x8F37, 0x0CF6, 0x8139, 0x8F38, 0x8F38, 0x1815,\n    0x8139, 0x8F39, 0x8F39, 0x06FD, 0x8139, 0x9030, 0x9030, 0x082D, 0x8139, 0x9031, 0x9031, 0x08BE,\n    0x8139, 0x9032, 0x9032, 0x06C4, 0x8139, 0x9033, 0x9033, 0x1813, 0x8139, 0x9034, 0x9034, 0x073C,\n    0x8139, 0x9035, 0x9035, 0x1398, 0x8139, 0x9036, 0x9036, 0x14AD, 0x8139, 0x9037, 0x9037, 0x14F6,\n    0x8139, 0x9038, 0x9038, 0x0706, 0x8139, 0x9039, 0x9039, 0x1762, 0x8139, 0x9130, 0x9130, 0x15EE,\n    0x8139, 0x9131, 0x9131, 0x15E0, 0x8139, 0x9132, 0x9132, 0x0F8F, 0x8139, 0x9133, 0x9133, 0x06E5,\n    0x8139, 0x9134, 0x9134, 0x3292, 0x8139, 0x9135, 0x9135, 0x0D6D, 0x8139, 0x9136, 0x9136, 0x11A6,\n    0x8139, 0x9137, 0x9137, 0x1909, 0x8139, 0x9138, 0x9138, 0x0ED3, 0x8139, 0x9139, 0x9139, 0x05F6,\n    0x8139, 0x9230, 0x9230, 0x08C0, 0x8139, 0x9231, 0x9231, 0x065A, 0x8139, 0x9232, 0x9232, 0x0EED,\n    0x8139, 0x9233, 0x9233, 0x0CB0, 0x8139, 0x9234, 0x9234, 0x10FE, 0x8139, 0x9235, 0x9235, 0x1105,\n    0x8139, 0x9236, 0x9236, 0x0B21, 0x8139, 0x9237, 0x9237, 0x0C34, 0x8139, 0x9238, 0x9238, 0x11B8,\n    0x8139, 0x9239, 0x9239, 0x0578, 0x8139, 0x9330, 0x9330, 0x19BD, 0x8139, 0x9331, 0x9331, 0x0EF2,\n    0x8139, 0x9332, 0x9332, 0x0431, 0x8139, 0x9333, 0x9333, 0x0AB0, 0x8139, 0x9334, 0x9334, 0x0D66,\n    0x8139, 0x9335, 0x9335, 0x0C17, 0x8139, 0x9336, 0x9336, 0x0DA3, 0x8139, 0x9337, 0x9337, 0x0805,\n    0x8139, 0x9338, 0x9338, 0x1203, 0x8139, 0x9339, 0x9339, 0x06B3, 0x8139, 0x9430, 0x9430, 0x1269,\n    0x8139, 0x9431, 0x9431, 0x169D, 0x8139, 0x9432, 0x9432, 0x0BCB, 0x8139, 0x9433, 0x9433, 0x0FE9,\n    0x8139, 0x9434, 0x9434, 0x0B64, 0x8139, 0x9435, 0x9435, 0x0C89, 0x8139, 0x9436, 0x9436, 0x0FC9,\n    0x8139, 0x9437, 0x9437, 0x10D6, 0x8139, 0x9438, 0x9438, 0x0728, 0x8139, 0x9439, 0x9439, 0x0E90,\n    0x8139, 0x9530, 0x9530, 0x06C5, 0x8139, 0x9531, 0x9531, 0x0D33, 0x8139, 0x9532, 0x9532, 0x10A8,\n    0x8139, 0x9533, 0x9533, 0x0E42, 0x8139, 0x9534, 0x9534, 0x1BC6, 0x8139, 0x9535, 0x9535, 0x1B60,\n    0x8139, 0x9536, 0x9536, 0x3EBF, 0x8139, 0x9537, 0x9537, 0x03E2, 0x8139, 0x9538, 0x9538, 0x0BC3,\n    0x8139, 0x9539, 0x9539, 0x0AF8, 0x8139, 0x9630, 0x9630, 0x0B22, 0x8139, 0x9631, 0x9631, 0x0AB1,\n    0x8139, 0x9632, 0x9632, 0x0D4F, 0x8139, 0x9633, 0x9633, 0x0D46, 0x8139, 0x9634, 0x9634, 0x0D55,\n    0x8139, 0x9635, 0x9635, 0x40CB, 0x8139, 0x9636, 0x9636, 0x0783, 0x8139, 0x9637, 0x9637, 0x0FD1,\n    0x8139, 0x9638, 0x9638, 0x09EB, 0x8139, 0x9639, 0x9639, 0x11F0, 0x8139, 0x9730, 0x9730, 0x0ADC,\n    0x8139, 0x9731, 0x9731, 0x1CE7, 0x8139, 0x9732, 0x9732, 0x1C5E, 0x8139, 0x9733, 0x9733, 0x0EA9,\n    0x8139, 0x9734, 0x9734, 0x101B, 0x8139, 0x9735, 0x9735, 0x10D5, 0x8139, 0x9736, 0x9736, 0x09BA,\n    0x8139, 0x9737, 0x9737, 0x0637, 0x8139, 0x9738, 0x9738, 0x1BCB, 0x8139, 0x9739, 0x9739, 0x0639,\n    0x8139, 0x9830, 0x9830, 0x1A1E, 0x8139, 0x9831, 0x9831, 0x0CBD, 0x8139, 0x9832, 0x9832, 0x04E1,\n    0x8139, 0x9833, 0x9833, 0x1231, 0x8139, 0x9834, 0x9834, 0x11C0, 0x8139, 0x9835, 0x9835, 0x08F9,\n    0x8139, 0x9836, 0x9836, 0x0D19, 0x8139, 0x9837, 0x9837, 0x1618, 0x8139, 0x9838, 0x9838, 0x11DA,\n    0x8139, 0x9839, 0x9839, 0x1CDC, 0x8139, 0x9930, 0x9930, 0x0CE4, 0x8139, 0x9931, 0x9931, 0x45A2,\n    0x8139, 0x9932, 0x9932, 0x1BF0, 0x8139, 0x9933, 0x9933, 0x050B, 0x8139, 0x9934, 0x9934, 0x0FD3,\n    0x8139, 0x9935, 0x9935, 0x0F9B, 0x8139, 0x9936, 0x9936, 0x1049, 0x8139, 0x9937, 0x9937, 0x49DC,\n    0x8139, 0x9938, 0x9938, 0x1F96, 0x8139, 0x9939, 0x9939, 0x0898, 0x8139, 0x9A30, 0x9A30, 0x0FFD,\n    0x8139, 0x9A31, 0x9A31, 0x0721, 0x8139, 0x9A32, 0x9A32, 0x05F8, 0x8139, 0x9A33, 0x9A33, 0x1D15,\n    0x8139, 0x9A34, 0x9A34, 0x1D50, 0x8139, 0x9A35, 0x9A35, 0x1E3B, 0x8139, 0x9A36, 0x9A36, 0x0505,\n    0x8139, 0x9A37, 0x9A37, 0x123C, 0x8139, 0x9A38, 0x9A38, 0x1240, 0x8139, 0x9A39, 0x9A39, 0x0D26,\n    0x8139, 0x9B30, 0x9B30, 0x1E7B, 0x8139, 0x9B31, 0x9B31, 0x0F8C, 0x8139, 0x9B32, 0x9B32, 0x04E2,\n    0x8139, 0x9B33, 0x9B33, 0x4D13, 0x8139, 0x9B34, 0x9B34, 0x105F, 0x8139, 0x9B35, 0x9B35, 0x10B4,\n    0x8139, 0x9B36, 0x9B36, 0x4E18, 0x8139, 0x9B37, 0x9B37, 0x09DA, 0x8139, 0x9B38, 0x9B38, 0x08C1,\n    0x8139, 0x9B39, 0x9B39, 0x1E75, 0x8139, 0x9C30, 0x9C30, 0x207D, 0x8139, 0x9C31, 0x9C31, 0x06B2,\n    0x8139, 0x9C32, 0x9C32, 0x09EE, 0x8139, 0x9C33, 0x9C33, 0x1D79, 0x8139, 0x9C34, 0x9C34, 0x10CF,\n    0x8139, 0x9C35, 0x9C35, 0x50EA, 0x8139, 0x9C36, 0x9C36, 0x0664, 0x8139, 0x9C37, 0x9C37, 0x0AEB,\n    0x8139, 0x9C38, 0x9C38, 0x06EA, 0x8139, 0x9C39, 0x9C39, 0x218D, 0x8139, 0x9D30, 0x9D30, 0x08F1,\n    0x8139, 0x9D31, 0x9D31, 0x107B, 0x8139, 0x9D32, 0x9D32, 0x2209, 0x8139, 0x9D33, 0x9D33, 0x1F00,\n    0x8139, 0x9D34, 0x9D34, 0x1EF4, 0x8139, 0x9D35, 0x9D35, 0x0D4A, 0x8139, 0x9D36, 0x9D36, 0x0D6E,\n    0x8139, 0x9D37, 0x9D37, 0x0F50, 0x8139, 0x9D38, 0x9D38, 0x206D, 0x8139, 0x9D39, 0x9D39, 0x0720,\n    0x8139, 0x9E30, 0x9E30, 0x06DA, 0x8139, 0x9E31, 0x9E31, 0x1DEC, 0x8139, 0x9E32, 0x9E32, 0x1ED0,\n    0x8139, 0x9E33, 0x9E33, 0x139B, 0x8139, 0x9E34, 0x9E34, 0x1260, 0x8139, 0x9E35, 0x9E35, 0x0746,\n    0x8139, 0x9E36, 0x9E36, 0x2239, 0x8139, 0x9E37, 0x9E37, 0x209C, 0x8139, 0x9E38, 0x9E38, 0x2688,\n    0x8139, 0x9E39, 0x9E39, 0x0A60, 0x8139, 0x9F30, 0x9F30, 0x2071, 0x8139, 0x9F31, 0x9F31, 0x0A90,\n    0x8139, 0x9F32, 0x9F32, 0x5586, 0x8139, 0x9F33, 0x9F33, 0x0D89, 0x8139, 0x9F34, 0x9F34, 0x0791,\n    0x8139, 0x9F35, 0x9F35, 0x1A55, 0x8139, 0x9F36, 0x9F36, 0x2618, 0x8139, 0x9F37, 0x9F37, 0x05E5,\n    0x8139, 0x9F38, 0x9F38, 0x071D, 0x8139, 0x9F39, 0x9F39, 0x0D8A, 0x8139, 0xA030, 0xA030, 0x0430,\n    0x8139, 0xA031, 0xA031, 0x20C6, 0x8139, 0xA032, 0xA032, 0x1E86, 0x8139, 0xA033, 0xA033, 0x2037,\n    0x8139, 0xA034, 0xA034, 0x1F34, 0x8139, 0xA035, 0xA035, 0x12F3, 0x8139, 0xA533, 0xA535, 0x577B,\n    0x8139, 0xA538, 0xA539, 0x577E, 0x8139, 0xA630, 0xA630, 0x5780, 0x8139, 0xA634, 0xA634, 0x5755,\n    0x8139, 0xA636, 0xA636, 0x5767, 0x8139, 0xA735, 0xA735, 0x5776, 0x8139, 0xA736, 0xA736, 0x5778,\n    0x8139, 0xA737, 0xA737, 0x5777, 0x8139, 0xA738, 0xA738, 0x5779, 0x8139, 0xA836, 0xA838, 0x5781,\n    0x8139, 0xB434, 0xB439, 0x5784, 0x8139, 0xB530, 0xB539, 0x578A, 0x8139, 0xB630, 0xB637, 0x5794,\n    0x8139, 0xEE39, 0xEE39, 0x5801, 0x8139, 0xEF30, 0xEF39, 0x5802, 0x8139, 0xF030, 0xF039, 0x580C,\n    0x8139, 0xF130, 0xF139, 0x5816, 0x8139, 0xF230, 0xF239, 0x5820, 0x8139, 0xF330, 0xF339, 0x582A,\n    0x8139, 0xF430, 0xF439, 0x5834, 0x8139, 0xF530, 0xF539, 0x583E, 0x8139, 0xF630, 0xF639, 0x5848,\n    0x8139, 0xF730, 0xF739, 0x5852, 0x8139, 0xF830, 0xF839, 0x585C, 0x8139, 0xF930, 0xF939, 0x5866,\n    0x8139, 0xFA30, 0xFA39, 0x5870, 0x8139, 0xFB30, 0xFB39, 0x587A, 0x8139, 0xFC30, 0xFC39, 0x5884,\n    0x8139, 0xFD30, 0xFD39, 0x588E, 0x8139, 0xFE30, 0xFE39, 0x5898, 0x8230, 0x8130, 0x8139, 0x58A2,\n    0x8230, 0x8230, 0x8239, 0x58AC, 0x8230, 0x8330, 0x8339, 0x58B6, 0x8230, 0x8430, 0x8439, 0x58C0,\n    0x8230, 0x8530, 0x8539, 0x58CA, 0x8230, 0x8630, 0x8639, 0x58D4, 0x8230, 0x8730, 0x8739, 0x58DE,\n    0x8230, 0x8830, 0x8839, 0x58E8, 0x8230, 0x8930, 0x8939, 0x58F2, 0x8230, 0x8A30, 0x8A39, 0x58FC,\n    0x8230, 0x8B30, 0x8B39, 0x5906, 0x8230, 0x8C30, 0x8C39, 0x5910, 0x8230, 0x8D30, 0x8D39, 0x591A,\n    0x8230, 0x8E30, 0x8E39, 0x5924, 0x8230, 0x8F30, 0x8F39, 0x592E, 0x8230, 0x9030, 0x9039, 0x5938,\n    0x8230, 0x9130, 0x9139, 0x5942, 0x8230, 0x9230, 0x9239, 0x594C, 0x8230, 0x9330, 0x9339, 0x5956,\n    0x8230, 0x9430, 0x9439, 0x5960, 0x8230, 0x9530, 0x9539, 0x596A, 0x8230, 0x9630, 0x9639, 0x5974,\n    0x8230, 0x9730, 0x9739, 0x597E, 0x8230, 0x9830, 0x9839, 0x5988, 0x8230, 0x9930, 0x9939, 0x5992,\n    0x8230, 0x9A30, 0x9A39, 0x599C, 0x8230, 0x9B30, 0x9B39, 0x59A6, 0x8230, 0x9C30, 0x9C39, 0x59B0,\n    0x8230, 0x9D30, 0x9D39, 0x59BA, 0x8230, 0x9E30, 0x9E39, 0x59C4, 0x8230, 0x9F30, 0x9F39, 0x59CE,\n    0x8230, 0xA030, 0xA039, 0x59D8, 0x8230, 0xA130, 0xA139, 0x59E2, 0x8230, 0xA230, 0xA239, 0x59EC,\n    0x8230, 0xA330, 0xA339, 0x59F6, 0x8230, 0xA430, 0xA439, 0x5A00, 0x8230, 0xA530, 0xA539, 0x5A0A,\n    0x8230, 0xA630, 0xA639, 0x5A14, 0x8230, 0xA730, 0xA739, 0x5A1E, 0x8230, 0xA830, 0xA839, 0x5A28,\n    0x8230, 0xA930, 0xA939, 0x5A32, 0x8230, 0xAA30, 0xAA39, 0x5A3C, 0x8230, 0xAB30, 0xAB39, 0x5A46,\n    0x8230, 0xAC30, 0xAC39, 0x5A50, 0x8230, 0xAD30, 0xAD39, 0x5A5A, 0x8230, 0xAE30, 0xAE39, 0x5A64,\n    0x8230, 0xAF30, 0xAF39, 0x5A6E, 0x8230, 0xB030, 0xB039, 0x5A78, 0x8230, 0xB130, 0xB139, 0x5A82,\n    0x8230, 0xB230, 0xB239, 0x5A8C, 0x8230, 0xB330, 0xB339, 0x5A96, 0x8230, 0xB430, 0xB439, 0x5AA0,\n    0x8230, 0xB530, 0xB539, 0x5AAA, 0x8230, 0xB630, 0xB639, 0x5AB4, 0x8230, 0xB730, 0xB739, 0x5ABE,\n    0x8230, 0xB830, 0xB839, 0x5AC8, 0x8230, 0xB930, 0xB939, 0x5AD2, 0x8230, 0xBA30, 0xBA39, 0x5ADC,\n    0x8230, 0xBB30, 0xBB39, 0x5AE6, 0x8230, 0xBC30, 0xBC39, 0x5AF0, 0x8230, 0xBD30, 0xBD39, 0x5AFA,\n    0x8230, 0xBE30, 0xBE39, 0x5B04, 0x8230, 0xBF30, 0xBF39, 0x5B0E, 0x8230, 0xC030, 0xC039, 0x5B18,\n    0x8230, 0xC130, 0xC139, 0x5B22, 0x8230, 0xC230, 0xC239, 0x5B2C, 0x8230, 0xC330, 0xC339, 0x5B36,\n    0x8230, 0xC430, 0xC439, 0x5B40, 0x8230, 0xC530, 0xC539, 0x5B4A, 0x8230, 0xC630, 0xC639, 0x5B54,\n    0x8230, 0xC730, 0xC739, 0x5B5E, 0x8230, 0xC830, 0xC839, 0x5B68, 0x8230, 0xC930, 0xC939, 0x5B72,\n    0x8230, 0xCA30, 0xCA39, 0x5B7C, 0x8230, 0xCB30, 0xCB39, 0x5B86, 0x8230, 0xCC30, 0xCC39, 0x5B90,\n    0x8230, 0xCD30, 0xCD39, 0x5B9A, 0x8230, 0xCE30, 0xCE39, 0x5BA4, 0x8230, 0xCF30, 0xCF39, 0x5BAE,\n    0x8230, 0xD030, 0xD039, 0x5BB8, 0x8230, 0xD130, 0xD139, 0x5BC2, 0x8230, 0xD230, 0xD239, 0x5BCC,\n    0x8230, 0xD330, 0xD339, 0x5BD6, 0x8230, 0xD430, 0xD439, 0x5BE0, 0x8230, 0xD530, 0xD539, 0x5BEA,\n    0x8230, 0xD630, 0xD639, 0x5BF4, 0x8230, 0xD730, 0xD739, 0x5BFE, 0x8230, 0xD830, 0xD839, 0x5C08,\n    0x8230, 0xD930, 0xD939, 0x5C12, 0x8230, 0xDA30, 0xDA39, 0x5C1C, 0x8230, 0xDB30, 0xDB39, 0x5C26,\n    0x8230, 0xDC30, 0xDC39, 0x5C30, 0x8230, 0xDD30, 0xDD39, 0x5C3A, 0x8230, 0xDE30, 0xDE39, 0x5C44,\n    0x8230, 0xDF30, 0xDF39, 0x5C4E, 0x8230, 0xE030, 0xE039, 0x5C58, 0x8230, 0xE130, 0xE139, 0x5C62,\n    0x8230, 0xE230, 0xE239, 0x5C6C, 0x8230, 0xE330, 0xE339, 0x5C76, 0x8230, 0xE430, 0xE439, 0x5C80,\n    0x8230, 0xE530, 0xE539, 0x5C8A, 0x8230, 0xE630, 0xE639, 0x5C94, 0x8230, 0xE730, 0xE739, 0x5C9E,\n    0x8230, 0xE830, 0xE839, 0x5CA8, 0x8230, 0xE930, 0xE939, 0x5CB2, 0x8230, 0xEA30, 0xEA39, 0x5CBC,\n    0x8230, 0xEB30, 0xEB39, 0x5CC6, 0x8230, 0xEC30, 0xEC39, 0x5CD0, 0x8230, 0xED30, 0xED39, 0x5CDA,\n    0x8230, 0xEE30, 0xEE39, 0x5CE4, 0x8230, 0xEF30, 0xEF39, 0x5CEE, 0x8230, 0xF030, 0xF039, 0x5CF8,\n    0x8230, 0xF130, 0xF139, 0x5D02, 0x8230, 0xF230, 0xF239, 0x5D0C, 0x8230, 0xF330, 0xF339, 0x5D16,\n    0x8230, 0xF430, 0xF439, 0x5D20, 0x8230, 0xF530, 0xF539, 0x5D2A, 0x8230, 0xF630, 0xF639, 0x5D34,\n    0x8230, 0xF730, 0xF739, 0x5D3E, 0x8230, 0xF830, 0xF839, 0x5D48, 0x8230, 0xF930, 0xF939, 0x5D52,\n    0x8230, 0xFA30, 0xFA39, 0x5D5C, 0x8230, 0xFB30, 0xFB39, 0x5D66, 0x8230, 0xFC30, 0xFC39, 0x5D70,\n    0x8230, 0xFD30, 0xFD39, 0x5D7A, 0x8230, 0xFE30, 0xFE39, 0x5D84, 0x8231, 0x8130, 0x8139, 0x5D8E,\n    0x8231, 0x8230, 0x8239, 0x5D98, 0x8231, 0x8330, 0x8339, 0x5DA2, 0x8231, 0x8430, 0x8439, 0x5DAC,\n    0x8231, 0x8530, 0x8539, 0x5DB6, 0x8231, 0x8630, 0x8639, 0x5DC0, 0x8231, 0x8730, 0x8739, 0x5DCA,\n    0x8231, 0x8830, 0x8839, 0x5DD4, 0x8231, 0x8930, 0x8939, 0x5DDE, 0x8231, 0x8A30, 0x8A39, 0x5DE8,\n    0x8231, 0x8B30, 0x8B39, 0x5DF2, 0x8231, 0x8C30, 0x8C39, 0x5DFC, 0x8231, 0x8D30, 0x8D39, 0x5E06,\n    0x8231, 0x8E30, 0x8E39, 0x5E10, 0x8231, 0x8F30, 0x8F39, 0x5E1A, 0x8231, 0x9030, 0x9039, 0x5E24,\n    0x8231, 0x9130, 0x9139, 0x5E2E, 0x8231, 0x9230, 0x9239, 0x5E38, 0x8231, 0x9330, 0x9339, 0x5E42,\n    0x8231, 0x9430, 0x9439, 0x5E4C, 0x8231, 0x9530, 0x9539, 0x5E56, 0x8231, 0x9630, 0x9639, 0x5E60,\n    0x8231, 0x9730, 0x9739, 0x5E6A, 0x8231, 0x9830, 0x9839, 0x5E74, 0x8231, 0x9930, 0x9939, 0x5E7E,\n    0x8231, 0x9A30, 0x9A39, 0x5E88, 0x8231, 0x9B30, 0x9B39, 0x5E92, 0x8231, 0x9C30, 0x9C39, 0x5E9C,\n    0x8231, 0x9D30, 0x9D39, 0x5EA6, 0x8231, 0x9E30, 0x9E39, 0x5EB0, 0x8231, 0x9F30, 0x9F39, 0x5EBA,\n    0x8231, 0xA030, 0xA039, 0x5EC4, 0x8231, 0xA130, 0xA139, 0x5ECE, 0x8231, 0xA230, 0xA239, 0x5ED8,\n    0x8231, 0xA330, 0xA339, 0x5EE2, 0x8231, 0xA430, 0xA439, 0x5EEC, 0x8231, 0xA530, 0xA539, 0x5EF6,\n    0x8231, 0xA630, 0xA639, 0x5F00, 0x8231, 0xA730, 0xA739, 0x5F0A, 0x8231, 0xA830, 0xA839, 0x5F14,\n    0x8231, 0xA930, 0xA939, 0x5F1E, 0x8231, 0xAA30, 0xAA39, 0x5F28, 0x8231, 0xAB30, 0xAB39, 0x5F32,\n    0x8231, 0xAC30, 0xAC39, 0x5F3C, 0x8231, 0xAD30, 0xAD39, 0x5F46, 0x8231, 0xAE30, 0xAE39, 0x5F50,\n    0x8231, 0xAF30, 0xAF39, 0x5F5A, 0x8231, 0xB030, 0xB039, 0x5F64, 0x8231, 0xB130, 0xB139, 0x5F6E,\n    0x8231, 0xB230, 0xB239, 0x5F78, 0x8231, 0xB330, 0xB339, 0x5F82, 0x8231, 0xB430, 0xB439, 0x5F8C,\n    0x8231, 0xB530, 0xB539, 0x5F96, 0x8231, 0xB630, 0xB639, 0x5FA0, 0x8231, 0xB730, 0xB739, 0x5FAA,\n    0x8231, 0xB830, 0xB839, 0x5FB4, 0x8231, 0xB930, 0xB939, 0x5FBE, 0x8231, 0xBA30, 0xBA39, 0x5FC8,\n    0x8231, 0xBB30, 0xBB39, 0x5FD2, 0x8231, 0xBC30, 0xBC39, 0x5FDC, 0x8231, 0xBD30, 0xBD39, 0x5FE6,\n    0x8231, 0xBE30, 0xBE39, 0x5FF0, 0x8231, 0xBF30, 0xBF39, 0x5FFA, 0x8231, 0xC030, 0xC039, 0x6004,\n    0x8231, 0xC130, 0xC139, 0x600E, 0x8231, 0xC230, 0xC239, 0x6018, 0x8231, 0xC330, 0xC339, 0x6022,\n    0x8231, 0xC430, 0xC439, 0x602C, 0x8231, 0xC530, 0xC539, 0x6036, 0x8231, 0xC630, 0xC639, 0x6040,\n    0x8231, 0xC730, 0xC739, 0x604A, 0x8231, 0xC830, 0xC839, 0x6054, 0x8231, 0xC930, 0xC939, 0x605E,\n    0x8231, 0xCA30, 0xCA39, 0x6068, 0x8231, 0xCB30, 0xCB39, 0x6072, 0x8231, 0xCC30, 0xCC39, 0x607C,\n    0x8231, 0xCD30, 0xCD39, 0x6086, 0x8231, 0xCE30, 0xCE39, 0x6090, 0x8231, 0xCF30, 0xCF39, 0x609A,\n    0x8231, 0xD030, 0xD039, 0x60A4, 0x8231, 0xD130, 0xD139, 0x60AE, 0x8231, 0xD230, 0xD239, 0x60B8,\n    0x8231, 0xD330, 0xD339, 0x60C2, 0x8231, 0xD430, 0xD439, 0x60CC, 0x8231, 0xD530, 0xD539, 0x60D6,\n    0x8231, 0xD630, 0xD639, 0x60E0, 0x8231, 0xD730, 0xD739, 0x60EA, 0x8231, 0xD830, 0xD839, 0x60F4,\n    0x8231, 0xD930, 0xD939, 0x60FE, 0x8231, 0xDA30, 0xDA39, 0x6108, 0x8231, 0xDB30, 0xDB39, 0x6112,\n    0x8231, 0xDC30, 0xDC39, 0x611C, 0x8231, 0xDD30, 0xDD39, 0x6126, 0x8231, 0xDE30, 0xDE39, 0x6130,\n    0x8231, 0xDF30, 0xDF39, 0x613A, 0x8231, 0xE030, 0xE039, 0x6144, 0x8231, 0xE130, 0xE139, 0x614E,\n    0x8231, 0xE230, 0xE239, 0x6158, 0x8231, 0xE330, 0xE339, 0x6162, 0x8231, 0xE430, 0xE439, 0x616C,\n    0x8231, 0xE530, 0xE539, 0x6176, 0x8231, 0xE630, 0xE639, 0x6180, 0x8231, 0xE730, 0xE739, 0x618A,\n    0x8231, 0xE830, 0xE839, 0x6194, 0x8231, 0xE930, 0xE939, 0x619E, 0x8231, 0xEA30, 0xEA39, 0x61A8,\n    0x8231, 0xEB30, 0xEB39, 0x61B2, 0x8231, 0xEC30, 0xEC39, 0x61BC, 0x8231, 0xED30, 0xED39, 0x61C6,\n    0x8231, 0xEE30, 0xEE39, 0x61D0, 0x8231, 0xEF30, 0xEF39, 0x61DA, 0x8231, 0xF030, 0xF039, 0x61E4,\n    0x8231, 0xF130, 0xF139, 0x61EE, 0x8231, 0xF230, 0xF239, 0x61F8, 0x8231, 0xF330, 0xF339, 0x6202,\n    0x8231, 0xF430, 0xF439, 0x620C, 0x8231, 0xF530, 0xF539, 0x6216, 0x8231, 0xF630, 0xF639, 0x6220,\n    0x8231, 0xF730, 0xF739, 0x622A, 0x8231, 0xF830, 0xF839, 0x6234, 0x8231, 0xF930, 0xF939, 0x623E,\n    0x8231, 0xFA30, 0xFA39, 0x6248, 0x8231, 0xFB30, 0xFB39, 0x6252, 0x8231, 0xFC30, 0xFC39, 0x625C,\n    0x8231, 0xFD30, 0xFD39, 0x6266, 0x8231, 0xFE30, 0xFE39, 0x6270, 0x8232, 0x8130, 0x8139, 0x627A,\n    0x8232, 0x8230, 0x8239, 0x6284, 0x8232, 0x8330, 0x8339, 0x628E, 0x8232, 0x8430, 0x8439, 0x6298,\n    0x8232, 0x8530, 0x8539, 0x62A2, 0x8232, 0x8630, 0x8639, 0x62AC, 0x8232, 0x8730, 0x8739, 0x62B6,\n    0x8232, 0x8830, 0x8839, 0x62C0, 0x8232, 0x8930, 0x8939, 0x62CA, 0x8232, 0x8A30, 0x8A39, 0x62D4,\n    0x8232, 0x8B30, 0x8B39, 0x62DE, 0x8232, 0x8C30, 0x8C39, 0x62E8, 0x8232, 0x8D30, 0x8D39, 0x62F2,\n    0x8232, 0x8E30, 0x8E39, 0x62FC, 0x8232, 0x8F30, 0x8F39, 0x6306, 0x8232, 0x9030, 0x9039, 0x6310,\n    0x8232, 0x9130, 0x9139, 0x631A, 0x8232, 0x9230, 0x9239, 0x6324, 0x8232, 0x9330, 0x9339, 0x632E,\n    0x8232, 0x9430, 0x9439, 0x6338, 0x8232, 0x9530, 0x9539, 0x6342, 0x8232, 0x9630, 0x9639, 0x634C,\n    0x8232, 0x9730, 0x9739, 0x6356, 0x8232, 0x9830, 0x9839, 0x6360, 0x8232, 0x9930, 0x9939, 0x636A,\n    0x8232, 0x9A30, 0x9A39, 0x6374, 0x8232, 0x9B30, 0x9B39, 0x637E, 0x8232, 0x9C30, 0x9C39, 0x6388,\n    0x8232, 0x9D30, 0x9D39, 0x6392, 0x8232, 0x9E30, 0x9E39, 0x639C, 0x8232, 0x9F30, 0x9F39, 0x63A6,\n    0x8232, 0xA030, 0xA039, 0x63B0, 0x8232, 0xA130, 0xA139, 0x63BA, 0x8232, 0xA230, 0xA239, 0x63C4,\n    0x8232, 0xA330, 0xA339, 0x63CE, 0x8232, 0xA430, 0xA439, 0x63D8, 0x8232, 0xA530, 0xA539, 0x63E2,\n    0x8232, 0xA630, 0xA639, 0x63EC, 0x8232, 0xA730, 0xA739, 0x63F6, 0x8232, 0xA830, 0xA839, 0x6400,\n    0x8232, 0xA930, 0xA939, 0x640A, 0x8232, 0xAA30, 0xAA39, 0x6414, 0x8232, 0xAB30, 0xAB39, 0x641E,\n    0x8232, 0xAC30, 0xAC39, 0x6428, 0x8232, 0xAD30, 0xAD39, 0x6432, 0x8232, 0xAE30, 0xAE39, 0x643C,\n    0x8232, 0xAF30, 0xAF39, 0x6446, 0x8232, 0xB030, 0xB039, 0x6450, 0x8232, 0xB130, 0xB139, 0x645A,\n    0x8232, 0xB230, 0xB239, 0x6464, 0x8232, 0xB330, 0xB339, 0x646E, 0x8232, 0xB430, 0xB439, 0x6478,\n    0x8232, 0xB530, 0xB539, 0x6482, 0x8232, 0xB630, 0xB639, 0x648C, 0x8232, 0xB730, 0xB739, 0x6496,\n    0x8232, 0xB830, 0xB839, 0x64A0, 0x8232, 0xB930, 0xB939, 0x64AA, 0x8232, 0xBA30, 0xBA39, 0x64B4,\n    0x8232, 0xBB30, 0xBB39, 0x64BE, 0x8232, 0xBC30, 0xBC39, 0x64C8, 0x8232, 0xBD30, 0xBD39, 0x64D2,\n    0x8232, 0xBE30, 0xBE39, 0x64DC, 0x8232, 0xBF30, 0xBF39, 0x64E6, 0x8232, 0xC030, 0xC039, 0x64F0,\n    0x8232, 0xC130, 0xC139, 0x64FA, 0x8232, 0xC230, 0xC239, 0x6504, 0x8232, 0xC330, 0xC339, 0x650E,\n    0x8232, 0xC430, 0xC439, 0x6518, 0x8232, 0xC530, 0xC539, 0x6522, 0x8232, 0xC630, 0xC639, 0x652C,\n    0x8232, 0xC730, 0xC739, 0x6536, 0x8232, 0xC830, 0xC839, 0x6540, 0x8232, 0xC930, 0xC939, 0x654A,\n    0x8232, 0xCA30, 0xCA39, 0x6554, 0x8232, 0xCB30, 0xCB39, 0x655E, 0x8232, 0xCC30, 0xCC39, 0x6568,\n    0x8232, 0xCD30, 0xCD39, 0x6572, 0x8232, 0xCE30, 0xCE39, 0x657C, 0x8232, 0xCF30, 0xCF39, 0x6586,\n    0x8232, 0xD030, 0xD039, 0x6590, 0x8232, 0xD130, 0xD139, 0x659A, 0x8232, 0xD230, 0xD239, 0x65A4,\n    0x8232, 0xD330, 0xD339, 0x65AE, 0x8232, 0xD430, 0xD439, 0x65B8, 0x8232, 0xD530, 0xD539, 0x65C2,\n    0x8232, 0xD630, 0xD639, 0x65CC, 0x8232, 0xD730, 0xD739, 0x65D6, 0x8232, 0xD830, 0xD839, 0x65E0,\n    0x8232, 0xD930, 0xD939, 0x65EA, 0x8232, 0xDA30, 0xDA39, 0x65F4, 0x8232, 0xDB30, 0xDB39, 0x65FE,\n    0x8232, 0xDC30, 0xDC39, 0x6608, 0x8232, 0xDD30, 0xDD39, 0x6612, 0x8232, 0xDE30, 0xDE39, 0x661C,\n    0x8232, 0xDF30, 0xDF39, 0x6626, 0x8232, 0xE030, 0xE039, 0x6630, 0x8232, 0xE130, 0xE139, 0x663A,\n    0x8232, 0xE230, 0xE239, 0x6644, 0x8232, 0xE330, 0xE339, 0x664E, 0x8232, 0xE430, 0xE439, 0x6658,\n    0x8232, 0xE530, 0xE539, 0x6662, 0x8232, 0xE630, 0xE639, 0x666C, 0x8232, 0xE730, 0xE739, 0x6676,\n    0x8232, 0xE830, 0xE839, 0x6680, 0x8232, 0xE930, 0xE939, 0x668A, 0x8232, 0xEA30, 0xEA39, 0x6694,\n    0x8232, 0xEB30, 0xEB39, 0x669E, 0x8232, 0xEC30, 0xEC39, 0x66A8, 0x8232, 0xED30, 0xED39, 0x66B2,\n    0x8232, 0xEE30, 0xEE39, 0x66BC, 0x8232, 0xEF30, 0xEF39, 0x66C6, 0x8232, 0xF030, 0xF039, 0x66D0,\n    0x8232, 0xF130, 0xF139, 0x66DA, 0x8232, 0xF230, 0xF239, 0x66E4, 0x8232, 0xF330, 0xF339, 0x66EE,\n    0x8232, 0xF430, 0xF439, 0x66F8, 0x8232, 0xF530, 0xF539, 0x6702, 0x8232, 0xF630, 0xF639, 0x670C,\n    0x8232, 0xF730, 0xF739, 0x6716, 0x8232, 0xF830, 0xF839, 0x6720, 0x8232, 0xF930, 0xF939, 0x672A,\n    0x8232, 0xFA30, 0xFA39, 0x6734, 0x8232, 0xFB30, 0xFB39, 0x673E, 0x8232, 0xFC30, 0xFC39, 0x6748,\n    0x8232, 0xFD30, 0xFD39, 0x6752, 0x8232, 0xFE30, 0xFE39, 0x675C, 0x8233, 0x8130, 0x8139, 0x6766,\n    0x8233, 0x8230, 0x8239, 0x6770, 0x8233, 0x8330, 0x8339, 0x677A, 0x8233, 0x8430, 0x8439, 0x6784,\n    0x8233, 0x8530, 0x8539, 0x678E, 0x8233, 0x8630, 0x8639, 0x6798, 0x8233, 0x8730, 0x8739, 0x67A2,\n    0x8233, 0x8830, 0x8839, 0x67AC, 0x8233, 0x8930, 0x8939, 0x67B6, 0x8233, 0x8A30, 0x8A39, 0x67C0,\n    0x8233, 0x8B30, 0x8B39, 0x67CA, 0x8233, 0x8C30, 0x8C39, 0x67D4, 0x8233, 0x8D30, 0x8D39, 0x67DE,\n    0x8233, 0x8E30, 0x8E39, 0x67E8, 0x8233, 0x8F30, 0x8F39, 0x67F2, 0x8233, 0x9030, 0x9039, 0x67FC,\n    0x8233, 0x9130, 0x9139, 0x6806, 0x8233, 0x9230, 0x9239, 0x6810, 0x8233, 0x9330, 0x9339, 0x681A,\n    0x8233, 0x9430, 0x9439, 0x6824, 0x8233, 0x9530, 0x9539, 0x682E, 0x8233, 0x9630, 0x9639, 0x6838,\n    0x8233, 0x9730, 0x9739, 0x6842, 0x8233, 0x9830, 0x9839, 0x684C, 0x8233, 0x9930, 0x9939, 0x6856,\n    0x8233, 0x9A30, 0x9A39, 0x6860, 0x8233, 0x9B30, 0x9B39, 0x686A, 0x8233, 0x9C30, 0x9C39, 0x6874,\n    0x8233, 0x9D30, 0x9D39, 0x687E, 0x8233, 0x9E30, 0x9E39, 0x6888, 0x8233, 0x9F30, 0x9F39, 0x6892,\n    0x8233, 0xA030, 0xA039, 0x689C, 0x8233, 0xA130, 0xA139, 0x68A6, 0x8233, 0xA230, 0xA239, 0x68B0,\n    0x8233, 0xA330, 0xA339, 0x68BA, 0x8233, 0xA430, 0xA439, 0x68C4, 0x8233, 0xA530, 0xA539, 0x68CE,\n    0x8233, 0xA630, 0xA639, 0x68D8, 0x8233, 0xA730, 0xA739, 0x68E2, 0x8233, 0xA830, 0xA839, 0x68EC,\n    0x8233, 0xA930, 0xA939, 0x68F6, 0x8233, 0xAA30, 0xAA39, 0x6900, 0x8233, 0xAB30, 0xAB39, 0x690A,\n    0x8233, 0xAC30, 0xAC39, 0x6914, 0x8233, 0xAD30, 0xAD39, 0x691E, 0x8233, 0xAE30, 0xAE39, 0x6928,\n    0x8233, 0xAF30, 0xAF39, 0x6932, 0x8233, 0xB030, 0xB039, 0x693C, 0x8233, 0xB130, 0xB139, 0x6946,\n    0x8233, 0xB230, 0xB239, 0x6950, 0x8233, 0xB330, 0xB339, 0x695A, 0x8233, 0xB430, 0xB439, 0x6964,\n    0x8233, 0xB530, 0xB539, 0x696E, 0x8233, 0xB630, 0xB639, 0x6978, 0x8233, 0xB730, 0xB739, 0x6982,\n    0x8233, 0xB830, 0xB839, 0x698C, 0x8233, 0xB930, 0xB939, 0x6996, 0x8233, 0xBA30, 0xBA39, 0x69A0,\n    0x8233, 0xBB30, 0xBB39, 0x69AA, 0x8233, 0xBC30, 0xBC39, 0x69B4, 0x8233, 0xBD30, 0xBD39, 0x69BE,\n    0x8233, 0xBE30, 0xBE39, 0x69C8, 0x8233, 0xBF30, 0xBF39, 0x69D2, 0x8233, 0xC030, 0xC039, 0x69DC,\n    0x8233, 0xC130, 0xC139, 0x69E6, 0x8233, 0xC230, 0xC239, 0x69F0, 0x8233, 0xC330, 0xC339, 0x69FA,\n    0x8233, 0xC430, 0xC439, 0x6A04, 0x8233, 0xC530, 0xC539, 0x6A0E, 0x8233, 0xC630, 0xC639, 0x6A18,\n    0x8233, 0xC730, 0xC739, 0x6A22, 0x8233, 0xC830, 0xC839, 0x6A2C, 0x8233, 0xC930, 0xC939, 0x6A36,\n    0x8233, 0xCA30, 0xCA39, 0x6A40, 0x8233, 0xCB30, 0xCB39, 0x6A4A, 0x8233, 0xCC30, 0xCC39, 0x6A54,\n    0x8233, 0xCD30, 0xCD39, 0x6A5E, 0x8233, 0xCE30, 0xCE39, 0x6A68, 0x8233, 0xCF30, 0xCF39, 0x6A72,\n    0x8233, 0xD030, 0xD039, 0x6A7C, 0x8233, 0xD130, 0xD139, 0x6A86, 0x8233, 0xD230, 0xD239, 0x6A90,\n    0x8233, 0xD330, 0xD339, 0x6A9A, 0x8233, 0xD430, 0xD439, 0x6AA4, 0x8233, 0xD530, 0xD539, 0x6AAE,\n    0x8233, 0xD630, 0xD639, 0x6AB8, 0x8233, 0xD730, 0xD739, 0x6AC2, 0x8233, 0xD830, 0xD839, 0x6ACC,\n    0x8233, 0xD930, 0xD939, 0x6AD6, 0x8233, 0xDA30, 0xDA39, 0x6AE0, 0x8233, 0xDB30, 0xDB39, 0x6AEA,\n    0x8233, 0xDC30, 0xDC39, 0x6AF4, 0x8233, 0xDD30, 0xDD39, 0x6AFE, 0x8233, 0xDE30, 0xDE39, 0x6B08,\n    0x8233, 0xDF30, 0xDF39, 0x6B12, 0x8233, 0xE030, 0xE039, 0x6B1C, 0x8233, 0xE130, 0xE139, 0x6B26,\n    0x8233, 0xE230, 0xE239, 0x6B30, 0x8233, 0xE330, 0xE339, 0x6B3A, 0x8233, 0xE430, 0xE439, 0x6B44,\n    0x8233, 0xE530, 0xE539, 0x6B4E, 0x8233, 0xE630, 0xE639, 0x6B58, 0x8233, 0xE730, 0xE739, 0x6B62,\n    0x8233, 0xE830, 0xE839, 0x6B6C, 0x8233, 0xE930, 0xE939, 0x6B76, 0x8233, 0xEA30, 0xEA39, 0x6B80,\n    0x8233, 0xEB30, 0xEB39, 0x6B8A, 0x8233, 0xEC30, 0xEC39, 0x6B94, 0x8233, 0xED30, 0xED39, 0x6B9E,\n    0x8233, 0xEE30, 0xEE39, 0x6BA8, 0x8233, 0xEF30, 0xEF39, 0x6BB2, 0x8233, 0xF030, 0xF039, 0x6BBC,\n    0x8233, 0xF130, 0xF139, 0x6BC6, 0x8233, 0xF230, 0xF239, 0x6BD0, 0x8233, 0xF330, 0xF339, 0x6BDA,\n    0x8233, 0xF430, 0xF439, 0x6BE4, 0x8233, 0xF530, 0xF539, 0x6BEE, 0x8233, 0xF630, 0xF639, 0x6BF8,\n    0x8233, 0xF730, 0xF739, 0x6C02, 0x8233, 0xF830, 0xF839, 0x6C0C, 0x8233, 0xF930, 0xF939, 0x6C16,\n    0x8233, 0xFA30, 0xFA39, 0x6C20, 0x8233, 0xFB30, 0xFB39, 0x6C2A, 0x8233, 0xFC30, 0xFC39, 0x6C34,\n    0x8233, 0xFD30, 0xFD39, 0x6C3E, 0x8233, 0xFE30, 0xFE39, 0x6C48, 0x8234, 0x8130, 0x8139, 0x6C52,\n    0x8234, 0x8230, 0x8239, 0x6C5C, 0x8234, 0x8330, 0x8339, 0x6C66, 0x8234, 0x8430, 0x8439, 0x6C70,\n    0x8234, 0x8530, 0x8539, 0x6C7A, 0x8234, 0x8630, 0x8639, 0x6C84, 0x8234, 0x8730, 0x8739, 0x6C8E,\n    0x8234, 0x8830, 0x8839, 0x6C98, 0x8234, 0x8930, 0x8939, 0x6CA2, 0x8234, 0x8A30, 0x8A39, 0x6CAC,\n    0x8234, 0x8B30, 0x8B39, 0x6CB6, 0x8234, 0x8C30, 0x8C39, 0x6CC0, 0x8234, 0x8D30, 0x8D39, 0x6CCA,\n    0x8234, 0x8E30, 0x8E39, 0x6CD4, 0x8234, 0x8F30, 0x8F39, 0x6CDE, 0x8234, 0x9030, 0x9039, 0x6CE8,\n    0x8234, 0x9130, 0x9139, 0x6CF2, 0x8234, 0x9230, 0x9239, 0x6CFC, 0x8234, 0x9330, 0x9339, 0x6D06,\n    0x8234, 0x9430, 0x9439, 0x6D10, 0x8234, 0x9530, 0x9539, 0x6D1A, 0x8234, 0x9630, 0x9639, 0x6D24,\n    0x8234, 0x9730, 0x9739, 0x6D2E, 0x8234, 0x9830, 0x9839, 0x6D38, 0x8234, 0x9930, 0x9939, 0x6D42,\n    0x8234, 0x9A30, 0x9A39, 0x6D4C, 0x8234, 0x9B30, 0x9B39, 0x6D56, 0x8234, 0x9C30, 0x9C39, 0x6D60,\n    0x8234, 0x9D30, 0x9D39, 0x6D6A, 0x8234, 0x9E30, 0x9E39, 0x6D74, 0x8234, 0x9F30, 0x9F39, 0x6D7E,\n    0x8234, 0xA030, 0xA039, 0x6D88, 0x8234, 0xA130, 0xA139, 0x6D92, 0x8234, 0xA230, 0xA239, 0x6D9C,\n    0x8234, 0xA330, 0xA339, 0x6DA6, 0x8234, 0xA430, 0xA439, 0x6DB0, 0x8234, 0xA530, 0xA539, 0x6DBA,\n    0x8234, 0xA630, 0xA639, 0x6DC4, 0x8234, 0xA730, 0xA739, 0x6DCE, 0x8234, 0xA830, 0xA839, 0x6DD8,\n    0x8234, 0xA930, 0xA939, 0x6DE2, 0x8234, 0xAA30, 0xAA39, 0x6DEC, 0x8234, 0xAB30, 0xAB39, 0x6DF6,\n    0x8234, 0xAC30, 0xAC39, 0x6E00, 0x8234, 0xAD30, 0xAD39, 0x6E0A, 0x8234, 0xAE30, 0xAE39, 0x6E14,\n    0x8234, 0xAF30, 0xAF39, 0x6E1E, 0x8234, 0xB030, 0xB039, 0x6E28, 0x8234, 0xB130, 0xB139, 0x6E32,\n    0x8234, 0xB230, 0xB239, 0x6E3C, 0x8234, 0xB330, 0xB339, 0x6E46, 0x8234, 0xB430, 0xB439, 0x6E50,\n    0x8234, 0xB530, 0xB539, 0x6E5A, 0x8234, 0xB630, 0xB639, 0x6E64, 0x8234, 0xB730, 0xB739, 0x6E6E,\n    0x8234, 0xB830, 0xB839, 0x6E78, 0x8234, 0xB930, 0xB939, 0x6E82, 0x8234, 0xBA30, 0xBA39, 0x6E8C,\n    0x8234, 0xBB30, 0xBB39, 0x6E96, 0x8234, 0xBC30, 0xBC39, 0x6EA0, 0x8234, 0xBD30, 0xBD39, 0x6EAA,\n    0x8234, 0xBE30, 0xBE39, 0x6EB4, 0x8234, 0xBF30, 0xBF39, 0x6EBE, 0x8234, 0xC030, 0xC039, 0x6EC8,\n    0x8234, 0xC130, 0xC139, 0x6ED2, 0x8234, 0xC230, 0xC239, 0x6EDC, 0x8234, 0xC330, 0xC339, 0x6EE6,\n    0x8234, 0xC430, 0xC439, 0x6EF0, 0x8234, 0xC530, 0xC539, 0x6EFA, 0x8234, 0xC630, 0xC639, 0x6F04,\n    0x8234, 0xC730, 0xC739, 0x6F0E, 0x8234, 0xC830, 0xC839, 0x6F18, 0x8234, 0xC930, 0xC939, 0x6F22,\n    0x8234, 0xCA30, 0xCA39, 0x6F2C, 0x8234, 0xCB30, 0xCB39, 0x6F36, 0x8234, 0xCC30, 0xCC39, 0x6F40,\n    0x8234, 0xCD30, 0xCD39, 0x6F4A, 0x8234, 0xCE30, 0xCE39, 0x6F54, 0x8234, 0xCF30, 0xCF39, 0x6F5E,\n    0x8234, 0xD030, 0xD039, 0x6F68, 0x8234, 0xD130, 0xD139, 0x6F72, 0x8234, 0xD230, 0xD239, 0x6F7C,\n    0x8234, 0xD330, 0xD339, 0x6F86, 0x8234, 0xD430, 0xD439, 0x6F90, 0x8234, 0xD530, 0xD539, 0x6F9A,\n    0x8234, 0xD630, 0xD639, 0x6FA4, 0x8234, 0xD730, 0xD739, 0x6FAE, 0x8234, 0xD830, 0xD839, 0x6FB8,\n    0x8234, 0xD930, 0xD939, 0x6FC2, 0x8234, 0xDA30, 0xDA39, 0x6FCC, 0x8234, 0xDB30, 0xDB39, 0x6FD6,\n    0x8234, 0xDC30, 0xDC39, 0x6FE0, 0x8234, 0xDD30, 0xDD39, 0x6FEA, 0x8234, 0xDE30, 0xDE39, 0x6FF4,\n    0x8234, 0xDF30, 0xDF39, 0x6FFE, 0x8234, 0xE030, 0xE039, 0x7008, 0x8234, 0xE130, 0xE139, 0x7012,\n    0x8234, 0xE230, 0xE239, 0x701C, 0x8234, 0xE330, 0xE339, 0x7026, 0x8234, 0xE430, 0xE439, 0x7030,\n    0x8234, 0xE530, 0xE539, 0x703A, 0x8234, 0xE630, 0xE639, 0x7044, 0x8234, 0xE730, 0xE739, 0x704E,\n    0x8234, 0xE830, 0xE839, 0x7058, 0x8234, 0xE930, 0xE939, 0x7062, 0x8234, 0xEA30, 0xEA39, 0x706C,\n    0x8234, 0xEB30, 0xEB39, 0x7076, 0x8234, 0xEC30, 0xEC39, 0x7080, 0x8234, 0xED30, 0xED39, 0x708A,\n    0x8234, 0xEE30, 0xEE39, 0x7094, 0x8234, 0xEF30, 0xEF39, 0x709E, 0x8234, 0xF030, 0xF039, 0x70A8,\n    0x8234, 0xF130, 0xF139, 0x70B2, 0x8234, 0xF230, 0xF239, 0x70BC, 0x8234, 0xF330, 0xF339, 0x70C6,\n    0x8234, 0xF430, 0xF439, 0x70D0, 0x8234, 0xF530, 0xF539, 0x70DA, 0x8234, 0xF630, 0xF639, 0x70E4,\n    0x8234, 0xF730, 0xF739, 0x70EE, 0x8234, 0xF830, 0xF839, 0x70F8, 0x8234, 0xF930, 0xF939, 0x7102,\n    0x8234, 0xFA30, 0xFA39, 0x710C, 0x8234, 0xFB30, 0xFB39, 0x7116, 0x8234, 0xFC30, 0xFC39, 0x7120,\n    0x8234, 0xFD30, 0xFD39, 0x712A, 0x8234, 0xFE30, 0xFE39, 0x7134, 0x8235, 0x8130, 0x8139, 0x713E,\n    0x8235, 0x8230, 0x8239, 0x7148, 0x8235, 0x8330, 0x8339, 0x7152, 0x8235, 0x8430, 0x8439, 0x715C,\n    0x8235, 0x8530, 0x8539, 0x7166, 0x8235, 0x8630, 0x8639, 0x7170, 0x8235, 0x8730, 0x8738, 0x717A,\n    0x8235, 0x9833, 0x9839, 0x7188, 0x8235, 0x9930, 0x9939, 0x718F, 0x8235, 0x9A30, 0x9A39, 0x7199,\n    0x8235, 0x9B30, 0x9B39, 0x71A3, 0x8235, 0x9C30, 0x9C39, 0x71AD, 0x8235, 0x9D30, 0x9D39, 0x71B7,\n    0x8235, 0x9E30, 0x9E39, 0x71C1, 0x8235, 0x9F30, 0x9F39, 0x71CB, 0x8235, 0xA030, 0xA039, 0x71D5,\n    0x8235, 0xA130, 0xA139, 0x71DF, 0x8235, 0xA230, 0xA239, 0x71E9, 0x8235, 0xA330, 0xA339, 0x71F3,\n    0x8235, 0xA430, 0xA439, 0x71FD, 0x8235, 0xA530, 0xA539, 0x7207, 0x8235, 0xA630, 0xA639, 0x7211,\n    0x8235, 0xA730, 0xA739, 0x721B, 0x8235, 0xA830, 0xA839, 0x7225, 0x8235, 0xA930, 0xA939, 0x722F,\n    0x8235, 0xAA30, 0xAA39, 0x7239, 0x8235, 0xAB30, 0xAB39, 0x7243, 0x8235, 0xAC30, 0xAC39, 0x724D,\n    0x8235, 0xAD30, 0xAD39, 0x7257, 0x8235, 0xAE30, 0xAE39, 0x7261, 0x8235, 0xAF30, 0xAF39, 0x726B,\n    0x8235, 0xB030, 0xB039, 0x7275, 0x8235, 0xB130, 0xB139, 0x727F, 0x8235, 0xB230, 0xB239, 0x7289,\n    0x8235, 0xB330, 0xB339, 0x7293, 0x8235, 0xB430, 0xB439, 0x729D, 0x8235, 0xB530, 0xB539, 0x72A7,\n    0x8235, 0xB630, 0xB639, 0x72B1, 0x8235, 0xB730, 0xB739, 0x72BB, 0x8235, 0xB830, 0xB839, 0x72C5,\n    0x8235, 0xB930, 0xB939, 0x72CF, 0x8235, 0xBA30, 0xBA39, 0x72D9, 0x8235, 0xBB30, 0xBB39, 0x72E3,\n    0x8235, 0xBC30, 0xBC39, 0x72ED, 0x8235, 0xBD30, 0xBD39, 0x72F7, 0x8235, 0xBE30, 0xBE39, 0x7301,\n    0x8235, 0xBF30, 0xBF39, 0x730B, 0x8235, 0xC030, 0xC039, 0x7315, 0x8235, 0xC130, 0xC139, 0x731F,\n    0x8235, 0xC230, 0xC239, 0x7329, 0x8235, 0xC330, 0xC339, 0x7333, 0x8235, 0xC430, 0xC439, 0x733D,\n    0x8235, 0xC530, 0xC539, 0x7347, 0x8235, 0xC630, 0xC639, 0x7351, 0x8235, 0xC730, 0xC739, 0x735B,\n    0x8235, 0xC830, 0xC839, 0x7365, 0x8235, 0xC930, 0xC939, 0x736F, 0x8235, 0xCA30, 0xCA39, 0x7379,\n    0x8235, 0xCB30, 0xCB39, 0x7383, 0x8235, 0xCC30, 0xCC39, 0x738D, 0x8235, 0xCD30, 0xCD39, 0x7397,\n    0x8235, 0xCE30, 0xCE39, 0x73A1, 0x8235, 0xCF30, 0xCF39, 0x73AB, 0x8235, 0xD030, 0xD039, 0x73B5,\n    0x8235, 0xD130, 0xD139, 0x73BF, 0x8235, 0xD230, 0xD239, 0x73C9, 0x8235, 0xD330, 0xD339, 0x73D3,\n    0x8235, 0xD430, 0xD439, 0x73DD, 0x8235, 0xD530, 0xD539, 0x73E7, 0x8235, 0xD630, 0xD639, 0x73F1,\n    0x8235, 0xD730, 0xD739, 0x73FB, 0x8235, 0xD830, 0xD839, 0x7405, 0x8235, 0xD930, 0xD939, 0x740F,\n    0x8235, 0xDA30, 0xDA39, 0x7419, 0x8235, 0xDB30, 0xDB39, 0x7423, 0x8235, 0xDC30, 0xDC39, 0x742D,\n    0x8235, 0xDD30, 0xDD39, 0x7437, 0x8235, 0xDE30, 0xDE39, 0x7441, 0x8235, 0xDF30, 0xDF39, 0x744B,\n    0x8235, 0xE030, 0xE039, 0x7455, 0x8235, 0xE130, 0xE139, 0x745F, 0x8235, 0xE230, 0xE239, 0x7469,\n    0x8235, 0xE330, 0xE339, 0x7473, 0x8235, 0xE430, 0xE439, 0x747D, 0x8235, 0xE530, 0xE539, 0x7487,\n    0x8235, 0xE630, 0xE639, 0x7491, 0x8235, 0xE730, 0xE739, 0x749B, 0x8235, 0xE830, 0xE839, 0x74A5,\n    0x8235, 0xE930, 0xE939, 0x74AF, 0x8235, 0xEA30, 0xEA39, 0x74B9, 0x8235, 0xEB30, 0xEB39, 0x74C3,\n    0x8235, 0xEC30, 0xEC39, 0x74CD, 0x8235, 0xED30, 0xED39, 0x74D7, 0x8235, 0xEE30, 0xEE39, 0x74E1,\n    0x8235, 0xEF30, 0xEF39, 0x74EB, 0x8235, 0xF030, 0xF039, 0x74F5, 0x8235, 0xF130, 0xF139, 0x74FF,\n    0x8235, 0xF230, 0xF239, 0x7509, 0x8235, 0xF330, 0xF339, 0x7513, 0x8235, 0xF430, 0xF439, 0x751D,\n    0x8235, 0xF530, 0xF539, 0x7527, 0x8235, 0xF630, 0xF639, 0x7531, 0x8235, 0xF730, 0xF739, 0x753B,\n    0x8235, 0xF830, 0xF839, 0x7545, 0x8235, 0xF930, 0xF939, 0x754F, 0x8235, 0xFA30, 0xFA39, 0x7559,\n    0x8235, 0xFB30, 0xFB39, 0x7563, 0x8235, 0xFC30, 0xFC39, 0x756D, 0x8235, 0xFD30, 0xFD39, 0x7577,\n    0x8235, 0xFE30, 0xFE39, 0x7581, 0x8236, 0x8130, 0x8139, 0x758B, 0x8236, 0x8230, 0x8239, 0x7595,\n    0x8236, 0x8330, 0x8339, 0x759F, 0x8236, 0x8430, 0x8439, 0x75A9, 0x8236, 0x8530, 0x8539, 0x75B3,\n    0x8236, 0x8630, 0x8639, 0x75BD, 0x8236, 0x8730, 0x8739, 0x75C7, 0x8236, 0x8830, 0x8839, 0x75D1,\n    0x8236, 0x8930, 0x8939, 0x75DB, 0x8236, 0x8A30, 0x8A39, 0x75E5, 0x8236, 0x8B30, 0x8B39, 0x75EF,\n    0x8236, 0x8C30, 0x8C39, 0x75F9, 0x8236, 0x8D30, 0x8D39, 0x7603, 0x8236, 0x8E30, 0x8E37, 0x760D,\n    0x8236, 0x8F31, 0x8F39, 0x7615, 0x8236, 0x9030, 0x9039, 0x761E, 0x8236, 0x9130, 0x9139, 0x7628,\n    0x8236, 0x9230, 0x9239, 0x7632, 0x8236, 0x9330, 0x9339, 0x763C, 0x8236, 0x9430, 0x9435, 0x7646,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/GB1/GBK2K-V_5.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_GBK2K_V_5[41 * 3] = {\n    0xA1A2, 0xA1A2, 0x023F, 0xA1A3, 0xA1A3, 0x023E, 0xA1AA, 0xA1AA, 0x0256,\n    0xA1AB, 0xA1AC, 0x1E18, 0xA1AD, 0xA1AD, 0x0257, 0xA1B2, 0xA1BF, 0x0246,\n    0xA1FE, 0xA1FE, 0x1E1A, 0xA3A1, 0xA3A1, 0x0242, 0xA3A8, 0xA3A9, 0x0244,\n    0xA3AC, 0xA3AC, 0x023D, 0xA3AE, 0xA3AE, 0x1E1B, 0xA3BA, 0xA3BB, 0x0240,\n    0xA3BD, 0xA3BD, 0x1E1C, 0xA3BF, 0xA3BF, 0x0243, 0xA3DB, 0xA3DB, 0x1E1D,\n    0xA3DD, 0xA3DD, 0x1E1E, 0xA3DF, 0xA3DF, 0x0258, 0xA3FB, 0xA3FB, 0x0254,\n    0xA3FD, 0xA3FD, 0x0255, 0xA3FE, 0xA3FE, 0x1E1F, 0xA4A1, 0xA4A1, 0x5757,\n    0xA4A3, 0xA4A3, 0x5759, 0xA4A5, 0xA4A5, 0x5762, 0xA4A7, 0xA4A7, 0x5758,\n    0xA4A9, 0xA4A9, 0x5760, 0xA4C3, 0xA4C3, 0x5761, 0xA4E3, 0xA4E3, 0x5764,\n    0xA4E5, 0xA4E5, 0x5766, 0xA4E7, 0xA4E7, 0x5765, 0xA4EE, 0xA4EE, 0x5763,\n    0xA5A1, 0xA5A1, 0x5768, 0xA5A3, 0xA5A3, 0x576A, 0xA5A5, 0xA5A5, 0x5771,\n    0xA5A7, 0xA5A7, 0x5769, 0xA5A9, 0xA5A9, 0x576F, 0xA5C3, 0xA5C3, 0x5770,\n    0xA5E3, 0xA5E3, 0x5773, 0xA5E5, 0xA5E5, 0x5775, 0xA5E7, 0xA5E7, 0x5774,\n    0xA5EE, 0xA5EE, 0x5772, 0xA960, 0xA960, 0x577A,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-H_2.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_GBKp_EUC_H_2[4070 * 3] = {\n    0x0020, 0x007E, 0x0001, 0x8140, 0x8178, 0x2758, 0x8179, 0x8179, 0x2059,\n    0x817A, 0x817E, 0x2791, 0x8180, 0x8185, 0x2796, 0x8186, 0x8186, 0x21F1,\n    0x8187, 0x81EC, 0x279C, 0x81ED, 0x81ED, 0x1FF2, 0x81EE, 0x81F5, 0x2802,\n    0x81F6, 0x81F6, 0x205D, 0x81F7, 0x81FE, 0x280A, 0x8240, 0x8252, 0x2812,\n    0x8253, 0x8253, 0x269C, 0x8254, 0x8261, 0x2825, 0x8262, 0x8262, 0x21B5,\n    0x8263, 0x8273, 0x2833, 0x8274, 0x8274, 0x22CC, 0x8275, 0x8279, 0x2844,\n    0x827A, 0x827A, 0x2016, 0x827B, 0x827C, 0x2849, 0x827D, 0x827D, 0x1E62,\n    0x827E, 0x827E, 0x284B, 0x8280, 0x8280, 0x1F20, 0x8281, 0x8282, 0x284C,\n    0x8283, 0x8283, 0x207F, 0x8284, 0x828F, 0x284E, 0x8290, 0x8290, 0x205C,\n    0x8291, 0x82A4, 0x285A, 0x82A5, 0x82A5, 0x2194, 0x82A6, 0x82C7, 0x286E,\n    0x82C8, 0x82C8, 0x1E65, 0x82C9, 0x82C9, 0x2281, 0x82CA, 0x82E0, 0x2890,\n    0x82E1, 0x82E1, 0x22CD, 0x82E2, 0x82E2, 0x28A7, 0x82E3, 0x82E3, 0x210A,\n    0x82E4, 0x82E4, 0x1E3E, 0x82E5, 0x82EC, 0x28A8, 0x82ED, 0x82ED, 0x267F,\n    0x82EE, 0x82F1, 0x28B0, 0x82F2, 0x82F2, 0x222E, 0x82F3, 0x82F6, 0x28B4,\n    0x82F7, 0x82F7, 0x1E96, 0x82F8, 0x82F8, 0x22CB, 0x82F9, 0x82F9, 0x226C,\n    0x82FA, 0x82FA, 0x28B8, 0x82FB, 0x82FB, 0x2117, 0x82FC, 0x82FE, 0x28B9,\n    0x8340, 0x8340, 0x28BC, 0x8341, 0x8341, 0x20E8, 0x8342, 0x8344, 0x28BD,\n    0x8345, 0x8345, 0x22D4, 0x8346, 0x8347, 0x28C0, 0x8348, 0x8348, 0x1FB9,\n    0x8349, 0x834B, 0x28C2, 0x834C, 0x834C, 0x22D8, 0x834D, 0x8352, 0x28C5,\n    0x8353, 0x8353, 0x20DF, 0x8354, 0x8356, 0x28CB, 0x8357, 0x8357, 0x20C2,\n    0x8358, 0x835D, 0x28CE, 0x835E, 0x835E, 0x2195, 0x835F, 0x8364, 0x28D4,\n    0x8365, 0x8365, 0x1FAC, 0x8366, 0x8366, 0x22D3, 0x8367, 0x8371, 0x28DA,\n    0x8372, 0x8372, 0x1F81, 0x8373, 0x8377, 0x28E5, 0x8378, 0x8378, 0x2210,\n    0x8379, 0x8379, 0x28EA, 0x837A, 0x837A, 0x22CF, 0x837B, 0x837B, 0x28EB,\n    0x837C, 0x837C, 0x2213, 0x837D, 0x837D, 0x28EC, 0x837E, 0x837E, 0x1FE4,\n    0x8380, 0x8380, 0x1F90, 0x8381, 0x8385, 0x28ED, 0x8386, 0x8386, 0x22D6,\n    0x8387, 0x8388, 0x28F2, 0x8389, 0x8389, 0x22D0, 0x838A, 0x838A, 0x22CE,\n    0x838B, 0x838C, 0x28F4, 0x838D, 0x838D, 0x2681, 0x838E, 0x8393, 0x28F6,\n    0x8394, 0x8394, 0x1E76, 0x8395, 0x839D, 0x28FC, 0x839E, 0x839E, 0x2231,\n    0x839F, 0x83A5, 0x2905, 0x83A6, 0x83A6, 0x1E93, 0x83A7, 0x83AA, 0x290C,\n    0x83AB, 0x83AB, 0x22D2, 0x83AC, 0x83AD, 0x2910, 0x83AE, 0x83AE, 0x22D7,\n    0x83AF, 0x83AF, 0x22D5, 0x83B0, 0x83B0, 0x22D1, 0x83B1, 0x83B9, 0x2912,\n    0x83BA, 0x83BA, 0x1EE5, 0x83BB, 0x83C8, 0x291B, 0x83C9, 0x83C9, 0x2025,\n    0x83CA, 0x83F5, 0x2929, 0x83F6, 0x83F6, 0x1ECF, 0x83F7, 0x83FE, 0x2955,\n    0x8440, 0x844F, 0x295D, 0x8450, 0x8450, 0x1FD9, 0x8451, 0x8470, 0x296D,\n    0x8471, 0x8471, 0x22C8, 0x8472, 0x8473, 0x298D, 0x8474, 0x8474, 0x2263,\n    0x8475, 0x8476, 0x298F, 0x8477, 0x8477, 0x2683, 0x8478, 0x847E, 0x2991,\n    0x8480, 0x8481, 0x2998, 0x8482, 0x8482, 0x1F17, 0x8483, 0x848D, 0x299A,\n    0x848E, 0x848E, 0x1F2B, 0x848F, 0x8491, 0x29A5, 0x8492, 0x8492, 0x22CA,\n    0x8493, 0x8493, 0x1E99, 0x8494, 0x849C, 0x29A8, 0x849D, 0x849D, 0x1F4F,\n    0x849E, 0x84A0, 0x29B1, 0x84A1, 0x84A1, 0x1FCF, 0x84A2, 0x84A2, 0x2036,\n    0x84A3, 0x84A3, 0x1F3A, 0x84A4, 0x84A4, 0x29B4, 0x84A5, 0x84A5, 0x22C9,\n    0x84A6, 0x84A6, 0x1F99, 0x84A7, 0x84A8, 0x29B5, 0x84A9, 0x84A9, 0x1F75,\n    0x84AA, 0x84C4, 0x29B7, 0x84C5, 0x84C5, 0x1FBE, 0x84C6, 0x84D2, 0x29D2,\n    0x84D3, 0x84D3, 0x1ECD, 0x84D4, 0x84D4, 0x29DF, 0x84D5, 0x84D5, 0x21A9,\n    0x84D6, 0x84D6, 0x29E0, 0x84D7, 0x84D7, 0x21E6, 0x84D8, 0x84D8, 0x29E1,\n    0x84D9, 0x84D9, 0x2127, 0x84DA, 0x84DA, 0x2003, 0x84DB, 0x84DC, 0x29E2,\n    0x84DD, 0x84DD, 0x2132, 0x84DE, 0x84E9, 0x29E4, 0x84EA, 0x84EA, 0x2323,\n    0x84EB, 0x84ED, 0x29F0, 0x84EE, 0x84EE, 0x2011, 0x84EF, 0x84F0, 0x29F3,\n    0x84F1, 0x84F1, 0x20F5, 0x84F2, 0x84FE, 0x29F5, 0x8540, 0x8550, 0x2A02,\n    0x8551, 0x8551, 0x22C5, 0x8552, 0x8552, 0x1F5E, 0x8553, 0x8553, 0x2A13,\n    0x8554, 0x8554, 0x22C6, 0x8555, 0x855D, 0x2A14, 0x855E, 0x855E, 0x20EF,\n    0x855F, 0x8565, 0x2A1D, 0x8566, 0x8566, 0x21D0, 0x8567, 0x857E, 0x2A24,\n    0x8580, 0x8586, 0x2A3C, 0x8587, 0x8587, 0x22C1, 0x8588, 0x858A, 0x2A43,\n    0x858B, 0x858B, 0x1E64, 0x858C, 0x8591, 0x2A46, 0x8592, 0x8592, 0x21F9,\n    0x8593, 0x8595, 0x2A4C, 0x8596, 0x8596, 0x2010, 0x8597, 0x8597, 0x2A4F,\n    0x8598, 0x8598, 0x22C2, 0x8599, 0x85A1, 0x2A50, 0x85A2, 0x85A2, 0x1E5A,\n    0x85A3, 0x85B1, 0x2A59, 0x85B2, 0x85B2, 0x1EA2, 0x85B3, 0x85FE, 0x2A68,\n    0x8640, 0x8649, 0x2AB4, 0x864A, 0x864A, 0x236D, 0x864B, 0x8653, 0x2ABE,\n    0x8654, 0x8654, 0x2247, 0x8655, 0x8667, 0x2AC7, 0x8668, 0x8668, 0x236C,\n    0x8669, 0x867E, 0x2ADA, 0x8680, 0x8695, 0x2AF0, 0x8696, 0x8696, 0x219C,\n    0x8697, 0x8698, 0x2B06, 0x8699, 0x8699, 0x20C9, 0x869A, 0x86A0, 0x2B08,\n    0x86A1, 0x86A1, 0x21F0, 0x86A2, 0x86C9, 0x2B0F, 0x86CA, 0x86CA, 0x210B,\n    0x86CB, 0x86CB, 0x2B37, 0x86CC, 0x86CC, 0x20DE, 0x86CD, 0x86CD, 0x2B38,\n    0x86CE, 0x86CE, 0x1EAA, 0x86CF, 0x86D0, 0x2B39, 0x86D1, 0x86D1, 0x222C,\n    0x86D2, 0x86DB, 0x2B3B, 0x86DC, 0x86DC, 0x20D8, 0x86DD, 0x86DD, 0x22C0,\n    0x86DE, 0x86E0, 0x2B45, 0x86E1, 0x86E1, 0x206F, 0x86E2, 0x86E7, 0x2B48,\n    0x86E8, 0x86E8, 0x21A1, 0x86E9, 0x86ED, 0x2B4E, 0x86EE, 0x86EE, 0x2379,\n    0x86EF, 0x86F3, 0x2B53, 0x86F4, 0x86F4, 0x2372, 0x86F5, 0x86FE, 0x2B58,\n    0x8740, 0x8740, 0x216A, 0x8741, 0x8743, 0x2B62, 0x8744, 0x8744, 0x237C,\n    0x8745, 0x8748, 0x2B65, 0x8749, 0x8749, 0x20B0, 0x874A, 0x874A, 0x2B69,\n    0x874B, 0x874B, 0x237A, 0x874C, 0x874C, 0x1E74, 0x874D, 0x874E, 0x2B6A,\n    0x874F, 0x874F, 0x2377, 0x8750, 0x8756, 0x2B6C, 0x8757, 0x8757, 0x1F4C,\n    0x8758, 0x8759, 0x2B73, 0x875A, 0x875A, 0x2378, 0x875B, 0x875B, 0x21CF,\n    0x875C, 0x875C, 0x2368, 0x875D, 0x875D, 0x2B75, 0x875E, 0x875E, 0x2371,\n    0x875F, 0x875F, 0x2B76, 0x8760, 0x8760, 0x2369, 0x8761, 0x8765, 0x2B77,\n    0x8766, 0x8766, 0x2674, 0x8767, 0x8779, 0x2B7C, 0x877A, 0x877A, 0x236F,\n    0x877B, 0x877C, 0x2B8F, 0x877D, 0x877D, 0x2370, 0x877E, 0x877E, 0x2B91,\n    0x8780, 0x8780, 0x2B92, 0x8781, 0x8781, 0x2376, 0x8782, 0x8782, 0x2373,\n    0x8783, 0x8785, 0x2B93, 0x8786, 0x8786, 0x237F, 0x8787, 0x8787, 0x2B96,\n    0x8788, 0x8788, 0x2374, 0x8789, 0x8789, 0x2B97, 0x878A, 0x878A, 0x20B5,\n    0x878B, 0x878C, 0x2B98, 0x878D, 0x878D, 0x1EDB, 0x878E, 0x878E, 0x2672,\n    0x878F, 0x8792, 0x2B9A, 0x8793, 0x8793, 0x236E, 0x8794, 0x8797, 0x2B9E,\n    0x8798, 0x8798, 0x21B7, 0x8799, 0x879C, 0x2BA2, 0x879D, 0x879D, 0x2375,\n    0x879E, 0x87A2, 0x2BA6, 0x87A3, 0x87A3, 0x2382, 0x87A4, 0x87A6, 0x2BAB,\n    0x87A7, 0x87A7, 0x209E, 0x87A8, 0x87B2, 0x2BAE, 0x87B3, 0x87B3, 0x236B,\n    0x87B4, 0x87B4, 0x2BB9, 0x87B5, 0x87B5, 0x2039, 0x87B6, 0x87BA, 0x2BBA,\n    0x87BB, 0x87BB, 0x269F, 0x87BC, 0x87BE, 0x2BBF, 0x87BF, 0x87BF, 0x237D,\n    0x87C0, 0x87C0, 0x21F5, 0x87C1, 0x87C1, 0x2BC2, 0x87C2, 0x87C2, 0x2381,\n    0x87C3, 0x87C9, 0x2BC3, 0x87CA, 0x87CA, 0x237B, 0x87CB, 0x87CB, 0x237E,\n    0x87CC, 0x87CC, 0x21CC, 0x87CD, 0x87CE, 0x2BCA, 0x87CF, 0x87CF, 0x22DB,\n    0x87D0, 0x87D1, 0x2BCC, 0x87D2, 0x87D2, 0x236A, 0x87D3, 0x87D3, 0x2689,\n    0x87D4, 0x87D4, 0x2BCE, 0x87D5, 0x87D5, 0x2697, 0x87D6, 0x87D9, 0x2BCF,\n    0x87DA, 0x87DA, 0x22A1, 0x87DB, 0x87F6, 0x2BD3, 0x87F7, 0x87F7, 0x2383,\n    0x87F8, 0x87F8, 0x1F3D, 0x87F9, 0x87F9, 0x2BEF, 0x87FA, 0x87FA, 0x218F,\n    0x87FB, 0x87FE, 0x2BF0, 0x8840, 0x8840, 0x2246, 0x8841, 0x8841, 0x2248,\n    0x8842, 0x8843, 0x2BF4, 0x8844, 0x8844, 0x217E, 0x8845, 0x8845, 0x2BF6,\n    0x8846, 0x8846, 0x2180, 0x8847, 0x887E, 0x2BF7, 0x8880, 0x88B9, 0x2C2F,\n    0x88BA, 0x88BA, 0x232A, 0x88BB, 0x88CB, 0x2C69, 0x88CC, 0x88CC, 0x228B,\n    0x88CD, 0x88D3, 0x2C7A, 0x88D4, 0x88D4, 0x1F85, 0x88D5, 0x88D6, 0x2C81,\n    0x88D7, 0x88D7, 0x2325, 0x88D8, 0x88DE, 0x2C83, 0x88DF, 0x88DF, 0x232C,\n    0x88E0, 0x88E4, 0x2C8A, 0x88E5, 0x88E5, 0x232E, 0x88E6, 0x88F1, 0x2C8F,\n    0x88F2, 0x88F2, 0x2205, 0x88F3, 0x88F3, 0x1E38, 0x88F4, 0x88F5, 0x2C9B,\n    0x88F6, 0x88F6, 0x1E73, 0x88F7, 0x88FE, 0x2C9D, 0x8940, 0x894A, 0x2CA5,\n    0x894B, 0x894B, 0x1FE3, 0x894C, 0x894C, 0x2339, 0x894D, 0x894D, 0x2CB0,\n    0x894E, 0x894E, 0x232B, 0x894F, 0x894F, 0x2CB1, 0x8950, 0x8950, 0x232D,\n    0x8951, 0x8953, 0x2CB2, 0x8954, 0x8954, 0x217F, 0x8955, 0x895C, 0x2CB5,\n    0x895D, 0x895D, 0x21A7, 0x895E, 0x895E, 0x2CBD, 0x895F, 0x895F, 0x232F,\n    0x8960, 0x896C, 0x2CBE, 0x896D, 0x896D, 0x1E7D, 0x896E, 0x8970, 0x2CCB,\n    0x8971, 0x8971, 0x20D6, 0x8972, 0x897B, 0x2CCE, 0x897C, 0x897C, 0x1EC2,\n    0x897D, 0x897E, 0x2CD8, 0x8980, 0x898A, 0x2CDA, 0x898B, 0x898B, 0x22B2,\n    0x898C, 0x8998, 0x2CE5, 0x8999, 0x8999, 0x1EDF, 0x899A, 0x899D, 0x2CF2,\n    0x899E, 0x899E, 0x1EF9, 0x899F, 0x89A5, 0x2CF6, 0x89A6, 0x89A6, 0x20D9,\n    0x89A7, 0x89A7, 0x2CFD, 0x89A8, 0x89A8, 0x1FDD, 0x89A9, 0x89AE, 0x2CFE,\n    0x89AF, 0x89AF, 0x2167, 0x89B0, 0x89B9, 0x2D04, 0x89BA, 0x89BA, 0x21ED,\n    0x89BB, 0x89BD, 0x2D0E, 0x89BE, 0x89BE, 0x2007, 0x89BF, 0x89BF, 0x2326,\n    0x89C0, 0x89C0, 0x2329, 0x89C1, 0x89C3, 0x2D11, 0x89C4, 0x89C4, 0x1F52,\n    0x89C5, 0x89C5, 0x203B, 0x89C6, 0x89C6, 0x2328, 0x89C7, 0x89C7, 0x2D14,\n    0x89C8, 0x89C8, 0x2327, 0x89C9, 0x89CD, 0x2D15, 0x89CE, 0x89CE, 0x1E2B,\n    0x89CF, 0x89D0, 0x2D1A, 0x89D1, 0x89D1, 0x22AE, 0x89D2, 0x89D7, 0x2D1C,\n    0x89D8, 0x89D8, 0x1F49, 0x89D9, 0x89DA, 0x2D22, 0x89DB, 0x89DB, 0x2138,\n    0x89DC, 0x89F3, 0x2D24, 0x89F4, 0x89F4, 0x2081, 0x89F5, 0x89FE, 0x2D3C,\n    0x8A40, 0x8A40, 0x2D46, 0x8A41, 0x8A41, 0x1F7C, 0x8A42, 0x8A58, 0x2D47,\n    0x8A59, 0x8A59, 0x235B, 0x8A5A, 0x8A5A, 0x1EDE, 0x8A5B, 0x8A5B, 0x2D5E,\n    0x8A5C, 0x8A5C, 0x1FA2, 0x8A5D, 0x8A5D, 0x2D5F, 0x8A5E, 0x8A5E, 0x1EFA,\n    0x8A5F, 0x8A78, 0x2D60, 0x8A79, 0x8A79, 0x22AD, 0x8A7A, 0x8A7E, 0x2D7A,\n    0x8A80, 0x8AE3, 0x2D7F, 0x8AE4, 0x8AE4, 0x203F, 0x8AE5, 0x8AFE, 0x2DE3,\n    0x8B40, 0x8B43, 0x2DFD, 0x8B44, 0x8B44, 0x1F0E, 0x8B45, 0x8B48, 0x2E01,\n    0x8B49, 0x8B49, 0x23F9, 0x8B4A, 0x8B79, 0x2E05, 0x8B7A, 0x8B7A, 0x23FC,\n    0x8B7B, 0x8B7E, 0x2E35, 0x8B80, 0x8B8B, 0x2E39, 0x8B8C, 0x8B8C, 0x2069,\n    0x8B8D, 0x8B9D, 0x2E45, 0x8B9E, 0x8B9E, 0x23F7, 0x8B9F, 0x8BB2, 0x2E56,\n    0x8BB3, 0x8BB3, 0x23F6, 0x8BB4, 0x8BB8, 0x2E6A, 0x8BB9, 0x8BB9, 0x23FD,\n    0x8BBA, 0x8BBD, 0x2E6F, 0x8BBE, 0x8BBE, 0x23F8, 0x8BBF, 0x8BC5, 0x2E73,\n    0x8BC6, 0x8BC6, 0x23FA, 0x8BC7, 0x8BC7, 0x2E7A, 0x8BC8, 0x8BC8, 0x23FE,\n    0x8BC9, 0x8BC9, 0x1FA8, 0x8BCA, 0x8BD3, 0x2E7B, 0x8BD4, 0x8BD4, 0x2401,\n    0x8BD5, 0x8BDB, 0x2E85, 0x8BDC, 0x8BDC, 0x23FF, 0x8BDD, 0x8BE4, 0x2E8C,\n    0x8BE5, 0x8BE5, 0x2400, 0x8BE6, 0x8BEA, 0x2E94, 0x8BEB, 0x8BEB, 0x2221,\n    0x8BEC, 0x8BEF, 0x2E99, 0x8BF0, 0x8BF0, 0x2122, 0x8BF1, 0x8BFE, 0x2E9D,\n    0x8C40, 0x8C43, 0x2EAB, 0x8C44, 0x8C44, 0x23FB, 0x8C45, 0x8C4E, 0x2EAF,\n    0x8C4F, 0x8C4F, 0x215A, 0x8C50, 0x8C56, 0x2EB9, 0x8C57, 0x8C57, 0x21E5,\n    0x8C58, 0x8C5B, 0x2EC0, 0x8C5C, 0x8C5C, 0x2057, 0x8C5D, 0x8C7E, 0x2EC4,\n    0x8C80, 0x8C8A, 0x2EE6, 0x8C8B, 0x8C8B, 0x20E5, 0x8C8C, 0x8C8C, 0x2EF1,\n    0x8C8D, 0x8C8D, 0x212F, 0x8C8E, 0x8C8E, 0x20A3, 0x8C8F, 0x8C8F, 0x2121,\n    0x8C90, 0x8C90, 0x2EF2, 0x8C91, 0x8C91, 0x21D4, 0x8C92, 0x8C92, 0x1FE5,\n    0x8C93, 0x8C98, 0x2EF3, 0x8C99, 0x8C99, 0x1E8A, 0x8C9A, 0x8C9A, 0x1E37,\n    0x8C9B, 0x8CA1, 0x2EF9, 0x8CA2, 0x8CA2, 0x1F9E, 0x8CA3, 0x8CA3, 0x22A6,\n    0x8CA4, 0x8CA4, 0x21E8, 0x8CA5, 0x8CA5, 0x2F00, 0x8CA6, 0x8CA6, 0x1EDA,\n    0x8CA7, 0x8CA7, 0x1EB9, 0x8CA8, 0x8CBF, 0x2F01, 0x8CC0, 0x8CC0, 0x235C,\n    0x8CC1, 0x8CD1, 0x2F19, 0x8CD2, 0x8CD2, 0x2050, 0x8CD3, 0x8CD3, 0x1E67,\n    0x8CD4, 0x8CD4, 0x2F2A, 0x8CD5, 0x8CD5, 0x23F4, 0x8CD6, 0x8CD8, 0x2F2B,\n    0x8CD9, 0x8CD9, 0x213E, 0x8CDA, 0x8CF8, 0x2F2E, 0x8CF9, 0x8CF9, 0x1F16,\n    0x8CFA, 0x8CFE, 0x2F4D, 0x8D40, 0x8D72, 0x2F52, 0x8D73, 0x8D73, 0x2389,\n    0x8D74, 0x8D74, 0x2F85, 0x8D75, 0x8D75, 0x1EB7, 0x8D76, 0x8D7A, 0x2F86,\n    0x8D7B, 0x8D7B, 0x21B4, 0x8D7C, 0x8D7E, 0x2F8B, 0x8D80, 0x8D87, 0x2F8E,\n    0x8D88, 0x8D88, 0x238F, 0x8D89, 0x8D8E, 0x2F96, 0x8D8F, 0x8D8F, 0x1F1A,\n    0x8D90, 0x8D9D, 0x2F9C, 0x8D9E, 0x8D9E, 0x238B, 0x8D9F, 0x8DB8, 0x2FAA,\n    0x8DB9, 0x8DB9, 0x238A, 0x8DBA, 0x8DE1, 0x2FC4, 0x8DE2, 0x8DE2, 0x2391,\n    0x8DE3, 0x8DE3, 0x2FEC, 0x8DE4, 0x8DE4, 0x2271, 0x8DE5, 0x8DE6, 0x2FED,\n    0x8DE7, 0x8DE7, 0x2388, 0x8DE8, 0x8DF6, 0x2FEF, 0x8DF7, 0x8DF7, 0x238E,\n    0x8DF8, 0x8DFD, 0x2FFE, 0x8DFE, 0x8DFE, 0x238D, 0x8E40, 0x8E45, 0x3004,\n    0x8E46, 0x8E46, 0x238C, 0x8E47, 0x8E55, 0x300A, 0x8E56, 0x8E56, 0x2390,\n    0x8E57, 0x8E57, 0x3019, 0x8E58, 0x8E58, 0x2033, 0x8E59, 0x8E59, 0x301A,\n    0x8E5A, 0x8E5A, 0x223C, 0x8E5B, 0x8E67, 0x301B, 0x8E68, 0x8E68, 0x1FE9,\n    0x8E69, 0x8E6D, 0x3028, 0x8E6E, 0x8E6E, 0x2055, 0x8E6F, 0x8E6F, 0x302D,\n    0x8E70, 0x8E70, 0x2392, 0x8E71, 0x8E7E, 0x302E, 0x8E80, 0x8E80, 0x2324,\n    0x8E81, 0x8E9A, 0x303C, 0x8E9B, 0x8E9B, 0x2143, 0x8E9C, 0x8E9E, 0x3056,\n    0x8E9F, 0x8E9F, 0x2129, 0x8EA0, 0x8EA3, 0x3059, 0x8EA4, 0x8EA4, 0x2277,\n    0x8EA5, 0x8EA6, 0x305D, 0x8EA7, 0x8EA7, 0x1EA7, 0x8EA8, 0x8EAB, 0x305F,\n    0x8EAC, 0x8EAC, 0x2285, 0x8EAD, 0x8EAD, 0x3063, 0x8EAE, 0x8EAE, 0x2384,\n    0x8EAF, 0x8EBC, 0x3064, 0x8EBD, 0x8EBD, 0x2387, 0x8EBE, 0x8EBE, 0x2386,\n    0x8EBF, 0x8EC2, 0x3072, 0x8EC3, 0x8EC3, 0x2290, 0x8EC4, 0x8EC4, 0x3076,\n    0x8EC5, 0x8EC5, 0x1E44, 0x8EC6, 0x8ECC, 0x3077, 0x8ECD, 0x8ECD, 0x1E32,\n    0x8ECE, 0x8ECE, 0x2385, 0x8ECF, 0x8ED5, 0x307E, 0x8ED6, 0x8ED6, 0x1F13,\n    0x8ED7, 0x8ED7, 0x1F73, 0x8ED8, 0x8EEB, 0x3085, 0x8EEC, 0x8EEC, 0x1FE0,\n    0x8EED, 0x8EFE, 0x3099, 0x8F40, 0x8F51, 0x30AB, 0x8F52, 0x8F52, 0x2087,\n    0x8F53, 0x8F53, 0x1E78, 0x8F54, 0x8F54, 0x23AE, 0x8F55, 0x8F55, 0x1EF6,\n    0x8F56, 0x8F56, 0x1F31, 0x8F57, 0x8F5C, 0x30BD, 0x8F5D, 0x8F5D, 0x2045,\n    0x8F5E, 0x8F63, 0x30C3, 0x8F64, 0x8F64, 0x2178, 0x8F65, 0x8F7E, 0x30C9,\n    0x8F80, 0x8F85, 0x30E3, 0x8F86, 0x8F86, 0x23F5, 0x8F87, 0x8F87, 0x30E9,\n    0x8F88, 0x8F88, 0x2275, 0x8F89, 0x8F94, 0x30EA, 0x8F95, 0x8F95, 0x266E,\n    0x8F96, 0x8F96, 0x30F6, 0x8F97, 0x8F97, 0x1EB0, 0x8F98, 0x8F9A, 0x30F7,\n    0x8F9B, 0x8F9B, 0x2083, 0x8F9C, 0x8F9C, 0x30FA, 0x8F9D, 0x8F9D, 0x2188,\n    0x8F9E, 0x8FA0, 0x30FB, 0x8FA1, 0x8FA1, 0x267C, 0x8FA2, 0x8FBC, 0x30FE,\n    0x8FBD, 0x8FBD, 0x1FC5, 0x8FBE, 0x8FC3, 0x3119, 0x8FC4, 0x8FC4, 0x1EA1,\n    0x8FC5, 0x8FC5, 0x311F, 0x8FC6, 0x8FC6, 0x2393, 0x8FC7, 0x8FCC, 0x3120,\n    0x8FCD, 0x8FCD, 0x1F0B, 0x8FCE, 0x8FD7, 0x3126, 0x8FD8, 0x8FD8, 0x1E7C,\n    0x8FD9, 0x8FFE, 0x3130, 0x9040, 0x907E, 0x3156, 0x9080, 0x909C, 0x3195,\n    0x909D, 0x909D, 0x23B4, 0x909E, 0x909E, 0x207E, 0x909F, 0x90B9, 0x31B2,\n    0x90BA, 0x90BA, 0x1EE3, 0x90BB, 0x90BF, 0x31CD, 0x90C0, 0x90C0, 0x2095,\n    0x90C1, 0x90C1, 0x23BB, 0x90C2, 0x90C4, 0x31D2, 0x90C5, 0x90C5, 0x23B9,\n    0x90C6, 0x90DA, 0x31D5, 0x90DB, 0x90DB, 0x1E28, 0x90DC, 0x90DC, 0x23BD,\n    0x90DD, 0x90EC, 0x31EA, 0x90ED, 0x90ED, 0x23B5, 0x90EE, 0x90EF, 0x31FA,\n    0x90F0, 0x90F0, 0x23BA, 0x90F1, 0x90F6, 0x31FC, 0x90F7, 0x90F7, 0x23B3,\n    0x90F8, 0x90FE, 0x3202, 0x9140, 0x9141, 0x3209, 0x9142, 0x9142, 0x2162,\n    0x9143, 0x914A, 0x320B, 0x914B, 0x914B, 0x1E5E, 0x914C, 0x914C, 0x3213,\n    0x914D, 0x914D, 0x1E5D, 0x914E, 0x9150, 0x3214, 0x9151, 0x9151, 0x23B7,\n    0x9152, 0x9153, 0x3217, 0x9154, 0x9154, 0x1F2F, 0x9155, 0x9155, 0x24DF,\n    0x9156, 0x9158, 0x3219, 0x9159, 0x9159, 0x23B2, 0x915A, 0x915A, 0x214E,\n    0x915B, 0x915C, 0x321C, 0x915D, 0x915D, 0x2052, 0x915E, 0x9160, 0x321E,\n    0x9161, 0x9161, 0x23BC, 0x9162, 0x9162, 0x3221, 0x9163, 0x9163, 0x20EB,\n    0x9164, 0x916D, 0x3222, 0x916E, 0x916E, 0x2232, 0x916F, 0x9175, 0x322C,\n    0x9176, 0x9176, 0x1E3F, 0x9177, 0x9179, 0x3233, 0x917A, 0x917A, 0x201B,\n    0x917B, 0x917B, 0x20BC, 0x917C, 0x917C, 0x23BE, 0x917D, 0x917E, 0x3236,\n    0x9180, 0x9183, 0x3238, 0x9184, 0x9184, 0x1EAE, 0x9185, 0x918C, 0x323C,\n    0x918D, 0x918D, 0x1EFB, 0x918E, 0x9190, 0x3244, 0x9191, 0x9191, 0x2089,\n    0x9192, 0x9192, 0x3247, 0x9193, 0x9193, 0x23B1, 0x9194, 0x9196, 0x3248,\n    0x9197, 0x9197, 0x21C4, 0x9198, 0x919A, 0x324B, 0x919B, 0x919B, 0x2214,\n    0x919C, 0x91A8, 0x324E, 0x91A9, 0x91A9, 0x1FDE, 0x91AA, 0x91AA, 0x2223,\n    0x91AB, 0x91AB, 0x23B6, 0x91AC, 0x91B9, 0x325B, 0x91BA, 0x91BA, 0x268C,\n    0x91BB, 0x91BB, 0x24DE, 0x91BC, 0x91BE, 0x3269, 0x91BF, 0x91BF, 0x24E0,\n    0x91C0, 0x91C2, 0x326C, 0x91C3, 0x91C3, 0x23B8, 0x91C4, 0x91CC, 0x326F,\n    0x91CD, 0x91CD, 0x1E81, 0x91CE, 0x91CF, 0x3278, 0x91D0, 0x91D0, 0x1FFE,\n    0x91D1, 0x91D1, 0x1F51, 0x91D2, 0x91D2, 0x21E1, 0x91D3, 0x91D3, 0x327A,\n    0x91D4, 0x91D4, 0x23B0, 0x91D5, 0x91D5, 0x327B, 0x91D6, 0x91D6, 0x1FCE,\n    0x91D7, 0x91D7, 0x327C, 0x91D8, 0x91D8, 0x211E, 0x91D9, 0x91D9, 0x2021,\n    0x91DA, 0x91DE, 0x327D, 0x91DF, 0x91DF, 0x24E1, 0x91E0, 0x91E1, 0x3282,\n    0x91E2, 0x91E2, 0x24A3, 0x91E3, 0x91E9, 0x3284, 0x91EA, 0x91EA, 0x24A4,\n    0x91EB, 0x91EF, 0x328B, 0x91F0, 0x91F0, 0x2273, 0x91F1, 0x91F1, 0x3290,\n    0x91F2, 0x91F2, 0x21B0, 0x91F3, 0x91FE, 0x3291, 0x9240, 0x927E, 0x329D,\n    0x9280, 0x92B5, 0x32DC, 0x92B6, 0x92B6, 0x21D1, 0x92B7, 0x92CD, 0x3312,\n    0x92CE, 0x92CE, 0x211C, 0x92CF, 0x92CF, 0x3329, 0x92D0, 0x92D0, 0x235D,\n    0x92D1, 0x92D3, 0x332A, 0x92D4, 0x92D4, 0x2682, 0x92D5, 0x92DE, 0x332D,\n    0x92DF, 0x92DF, 0x210D, 0x92E0, 0x92E0, 0x205A, 0x92E1, 0x92FD, 0x3337,\n    0x92FE, 0x92FE, 0x1F8D, 0x9340, 0x934F, 0x3354, 0x9350, 0x9350, 0x21FF,\n    0x9351, 0x935C, 0x3364, 0x935D, 0x935D, 0x1F58, 0x935E, 0x936F, 0x3370,\n    0x9370, 0x9370, 0x215B, 0x9371, 0x9375, 0x3382, 0x9376, 0x9376, 0x1EB6,\n    0x9377, 0x937E, 0x3387, 0x9380, 0x938B, 0x338F, 0x938C, 0x938C, 0x20DB,\n    0x938D, 0x939C, 0x339B, 0x939D, 0x939D, 0x2360, 0x939E, 0x93A4, 0x33AB,\n    0x93A5, 0x93A5, 0x2361, 0x93A6, 0x93A6, 0x33B2, 0x93A7, 0x93A7, 0x2040,\n    0x93A8, 0x93B3, 0x33B3, 0x93B4, 0x93B4, 0x228E, 0x93B5, 0x93B7, 0x33BF,\n    0x93B8, 0x93B8, 0x1FDF, 0x93B9, 0x93BA, 0x33C2, 0x93BB, 0x93BB, 0x235E,\n    0x93BC, 0x93BC, 0x33C4, 0x93BD, 0x93BD, 0x1E6A, 0x93BE, 0x93C5, 0x33C5,\n    0x93C6, 0x93C6, 0x2002, 0x93C7, 0x93CE, 0x33CD, 0x93CF, 0x93CF, 0x2093,\n    0x93D0, 0x93D6, 0x33D5, 0x93D7, 0x93D7, 0x235F, 0x93D8, 0x93DA, 0x33DC,\n    0x93DB, 0x93DB, 0x1EAC, 0x93DC, 0x93DC, 0x1E54, 0x93DD, 0x93E0, 0x33DF,\n    0x93E1, 0x93E1, 0x1F08, 0x93E2, 0x93E3, 0x33E3, 0x93E4, 0x93E4, 0x20C0,\n    0x93E5, 0x93E5, 0x2362, 0x93E6, 0x93E8, 0x33E5, 0x93E9, 0x93E9, 0x2160,\n    0x93EA, 0x93EA, 0x33E8, 0x93EB, 0x93EB, 0x219D, 0x93EC, 0x93EC, 0x1F8E,\n    0x93ED, 0x93ED, 0x222D, 0x93EE, 0x93EE, 0x33E9, 0x93EF, 0x93EF, 0x2047,\n    0x93F0, 0x93F0, 0x33EA, 0x93F1, 0x93F1, 0x2262, 0x93F2, 0x93F3, 0x33EB,\n    0x93F4, 0x93F4, 0x1F67, 0x93F5, 0x93F5, 0x1EB2, 0x93F6, 0x93F9, 0x33ED,\n    0x93FA, 0x93FA, 0x1EA9, 0x93FB, 0x93FD, 0x33F1, 0x93FE, 0x93FE, 0x1FCC,\n    0x9440, 0x9443, 0x33F4, 0x9444, 0x9444, 0x1F72, 0x9445, 0x944C, 0x33F8,\n    0x944D, 0x944D, 0x2098, 0x944E, 0x944F, 0x3400, 0x9450, 0x9450, 0x1E52,\n    0x9451, 0x9451, 0x20A4, 0x9452, 0x9452, 0x1F1C, 0x9453, 0x9453, 0x228F,\n    0x9454, 0x9454, 0x3402, 0x9455, 0x9455, 0x1FED, 0x9456, 0x9457, 0x3403,\n    0x9458, 0x9458, 0x2365, 0x9459, 0x945A, 0x3405, 0x945B, 0x945B, 0x1E2D,\n    0x945C, 0x945C, 0x2152, 0x945D, 0x945D, 0x2366, 0x945E, 0x945E, 0x3407,\n    0x945F, 0x945F, 0x20FA, 0x9460, 0x9463, 0x3408, 0x9464, 0x9464, 0x2363,\n    0x9465, 0x9465, 0x340C, 0x9466, 0x9466, 0x209A, 0x9467, 0x946D, 0x340D,\n    0x946E, 0x946E, 0x203C, 0x946F, 0x9471, 0x3414, 0x9472, 0x9472, 0x1FF6,\n    0x9473, 0x9473, 0x3417, 0x9474, 0x9474, 0x2364, 0x9475, 0x9475, 0x3418,\n    0x9476, 0x9476, 0x1E69, 0x9477, 0x9477, 0x3419, 0x9478, 0x9478, 0x2367,\n    0x9479, 0x9479, 0x341A, 0x947A, 0x947A, 0x211D, 0x947B, 0x947E, 0x341B,\n    0x9480, 0x9480, 0x2259, 0x9481, 0x9481, 0x2056, 0x9482, 0x9482, 0x2163,\n    0x9483, 0x9486, 0x341F, 0x9487, 0x9487, 0x1FA9, 0x9488, 0x9488, 0x1FFC,\n    0x9489, 0x94A0, 0x3423, 0x94A1, 0x94A1, 0x1E2E, 0x94A2, 0x94B2, 0x343B,\n    0x94B3, 0x94B3, 0x1EBC, 0x94B4, 0x94B4, 0x344C, 0x94B5, 0x94B5, 0x2142,\n    0x94B6, 0x94BE, 0x344D, 0x94BF, 0x94BF, 0x201E, 0x94C0, 0x94C0, 0x1E43,\n    0x94C1, 0x94CB, 0x3456, 0x94CC, 0x94CC, 0x24D4, 0x94CD, 0x94D7, 0x3461,\n    0x94D8, 0x94D8, 0x226F, 0x94D9, 0x94DF, 0x346C, 0x94E0, 0x94E0, 0x1ED7,\n    0x94E1, 0x94FE, 0x3473, 0x9540, 0x9571, 0x3491, 0x9572, 0x9572, 0x212D,\n    0x9573, 0x957E, 0x34C3, 0x9580, 0x9582, 0x34CF, 0x9583, 0x9583, 0x229B,\n    0x9584, 0x959D, 0x34D2, 0x959E, 0x959E, 0x2256, 0x959F, 0x959F, 0x24A8,\n    0x95A0, 0x95B2, 0x34EC, 0x95B3, 0x95B3, 0x1E79, 0x95B4, 0x95B9, 0x34FF,\n    0x95BA, 0x95BA, 0x225A, 0x95BB, 0x95CE, 0x3505, 0x95CF, 0x95CF, 0x24A7,\n    0x95D0, 0x95D0, 0x3519, 0x95D1, 0x95D1, 0x2686, 0x95D2, 0x95D2, 0x24A6,\n    0x95D3, 0x95D3, 0x351A, 0x95D4, 0x95D4, 0x21CE, 0x95D5, 0x95E0, 0x351B,\n    0x95E1, 0x95E1, 0x24A9, 0x95E2, 0x95E6, 0x3527, 0x95E7, 0x95E7, 0x1FE7,\n    0x95E8, 0x95F0, 0x352C, 0x95F1, 0x95F1, 0x2112, 0x95F2, 0x95F7, 0x3535,\n    0x95F8, 0x95F8, 0x213C, 0x95F9, 0x95FD, 0x353B, 0x95FE, 0x95FE, 0x1F5C,\n    0x9640, 0x9655, 0x3540, 0x9656, 0x9656, 0x24C4, 0x9657, 0x967B, 0x3556,\n    0x967C, 0x967C, 0x1ECC, 0x967D, 0x967E, 0x357B, 0x9680, 0x96FE, 0x357D,\n    0x9740, 0x9766, 0x35FC, 0x9767, 0x9767, 0x246A, 0x9768, 0x976B, 0x3623,\n    0x976C, 0x976C, 0x2175, 0x976D, 0x976D, 0x3627, 0x976E, 0x976E, 0x246D,\n    0x976F, 0x977E, 0x3628, 0x9780, 0x9795, 0x3638, 0x9796, 0x9796, 0x246B,\n    0x9797, 0x9797, 0x225F, 0x9798, 0x979C, 0x364E, 0x979D, 0x979D, 0x1ECE,\n    0x979E, 0x97A2, 0x3653, 0x97A3, 0x97A3, 0x2272, 0x97A4, 0x97BE, 0x3658,\n    0x97BF, 0x97BF, 0x2473, 0x97C0, 0x97ED, 0x3673, 0x97EE, 0x97EE, 0x21FE,\n    0x97EF, 0x97F6, 0x36A1, 0x97F7, 0x97F7, 0x1EFE, 0x97F8, 0x97FE, 0x36A9,\n    0x9840, 0x9844, 0x36B0, 0x9845, 0x9845, 0x2475, 0x9846, 0x9848, 0x36B5,\n    0x9849, 0x9849, 0x220A, 0x984A, 0x984E, 0x36B8, 0x984F, 0x984F, 0x1F6F,\n    0x9850, 0x9870, 0x36BD, 0x9871, 0x9871, 0x2468, 0x9872, 0x9872, 0x36DE,\n    0x9873, 0x9873, 0x2100, 0x9874, 0x987E, 0x36DF, 0x9880, 0x9880, 0x36EA,\n    0x9881, 0x9881, 0x2476, 0x9882, 0x988A, 0x36EB, 0x988B, 0x988B, 0x1F27,\n    0x988C, 0x988C, 0x20D7, 0x988D, 0x989F, 0x36F4, 0x98A0, 0x98A0, 0x247C,\n    0x98A1, 0x98A9, 0x3707, 0x98AA, 0x98AA, 0x1FA1, 0x98AB, 0x98B5, 0x3710,\n    0x98B6, 0x98B6, 0x22AA, 0x98B7, 0x98B7, 0x2005, 0x98B8, 0x98B9, 0x371B,\n    0x98BA, 0x98BA, 0x246C, 0x98BB, 0x98C6, 0x371D, 0x98C7, 0x98C7, 0x203E,\n    0x98C8, 0x98CA, 0x3729, 0x98CB, 0x98CB, 0x1E4C, 0x98CC, 0x98CF, 0x372C,\n    0x98D0, 0x98D0, 0x213A, 0x98D1, 0x98D2, 0x3730, 0x98D3, 0x98D3, 0x2204,\n    0x98D4, 0x98E2, 0x3732, 0x98E3, 0x98E3, 0x20C3, 0x98E4, 0x98E4, 0x2140,\n    0x98E5, 0x98E5, 0x2477, 0x98E6, 0x98EE, 0x3741, 0x98EF, 0x98EF, 0x2474,\n    0x98F0, 0x98F1, 0x374A, 0x98F2, 0x98F2, 0x20DD, 0x98F3, 0x98FE, 0x374C,\n    0x9940, 0x9942, 0x3758, 0x9943, 0x9943, 0x1F68, 0x9944, 0x9944, 0x375B,\n    0x9945, 0x9945, 0x2185, 0x9946, 0x9965, 0x375C, 0x9966, 0x9966, 0x2472,\n    0x9967, 0x996D, 0x377C, 0x996E, 0x996E, 0x1EB5, 0x996F, 0x9974, 0x3783,\n    0x9975, 0x9975, 0x2478, 0x9976, 0x9979, 0x3789, 0x997A, 0x997A, 0x1F8B,\n    0x997B, 0x997B, 0x2484, 0x997C, 0x997E, 0x378D, 0x9980, 0x9984, 0x3790,\n    0x9985, 0x9985, 0x2699, 0x9986, 0x9988, 0x3795, 0x9989, 0x9989, 0x2482,\n    0x998A, 0x998D, 0x3798, 0x998E, 0x998E, 0x20A1, 0x998F, 0x9990, 0x379C,\n    0x9991, 0x9991, 0x1F92, 0x9992, 0x9998, 0x379E, 0x9999, 0x9999, 0x1F38,\n    0x999A, 0x99A8, 0x37A5, 0x99A9, 0x99A9, 0x2485, 0x99AA, 0x99AF, 0x37B4,\n    0x99B0, 0x99B0, 0x2480, 0x99B1, 0x99B1, 0x246E, 0x99B2, 0x99B2, 0x37BA,\n    0x99B3, 0x99B3, 0x247B, 0x99B4, 0x99B4, 0x2486, 0x99B5, 0x99B5, 0x2471,\n    0x99B6, 0x99BC, 0x37BB, 0x99BD, 0x99BD, 0x2483, 0x99BE, 0x99BE, 0x2470,\n    0x99BF, 0x99BF, 0x37C2, 0x99C0, 0x99C0, 0x2469, 0x99C1, 0x99C1, 0x37C3,\n    0x99C2, 0x99C2, 0x247F, 0x99C3, 0x99C8, 0x37C4, 0x99C9, 0x99C9, 0x246F,\n    0x99CA, 0x99CD, 0x37CA, 0x99CE, 0x99CE, 0x2481, 0x99CF, 0x99D0, 0x37CE,\n    0x99D1, 0x99D1, 0x2220, 0x99D2, 0x99D9, 0x37D0, 0x99DA, 0x99DA, 0x1FF5,\n    0x99DB, 0x99DF, 0x37D8, 0x99E0, 0x99E0, 0x20F4, 0x99E1, 0x99E4, 0x37DD,\n    0x99E5, 0x99E5, 0x247D, 0x99E6, 0x99E7, 0x37E1, 0x99E8, 0x99E8, 0x2479,\n    0x99E9, 0x99EB, 0x37E3, 0x99EC, 0x99EC, 0x247E, 0x99ED, 0x99F3, 0x37E6,\n    0x99F4, 0x99F4, 0x247A, 0x99F5, 0x99FE, 0x37ED, 0x9A40, 0x9A49, 0x37F7,\n    0x9A4A, 0x9A4A, 0x20E3, 0x9A4B, 0x9A56, 0x3801, 0x9A57, 0x9A57, 0x20AD,\n    0x9A58, 0x9A64, 0x380D, 0x9A65, 0x9A65, 0x24CB, 0x9A66, 0x9A66, 0x381A,\n    0x9A67, 0x9A67, 0x1F53, 0x9A68, 0x9A70, 0x381B, 0x9A71, 0x9A71, 0x2159,\n    0x9A72, 0x9A75, 0x3824, 0x9A76, 0x9A76, 0x2013, 0x9A77, 0x9A77, 0x1F33,\n    0x9A78, 0x9A7E, 0x3828, 0x9A80, 0x9A87, 0x382F, 0x9A88, 0x9A88, 0x1E5C,\n    0x9A89, 0x9A8B, 0x3837, 0x9A8C, 0x9A8C, 0x2488, 0x9A8D, 0x9A90, 0x383A,\n    0x9A91, 0x9A91, 0x2487, 0x9A92, 0x9A96, 0x383E, 0x9A97, 0x9A97, 0x248A,\n    0x9A98, 0x9A99, 0x3843, 0x9A9A, 0x9A9A, 0x2489, 0x9A9B, 0x9A9B, 0x248B,\n    0x9A9C, 0x9A9D, 0x3845, 0x9A9E, 0x9A9E, 0x1F83, 0x9A9F, 0x9AA1, 0x3847,\n    0x9AA2, 0x9AA2, 0x210F, 0x9AA3, 0x9AA3, 0x1FDB, 0x9AA4, 0x9AA9, 0x384A,\n    0x9AAA, 0x9AAA, 0x20AF, 0x9AAB, 0x9ACF, 0x3850, 0x9AD0, 0x9AD0, 0x24C0,\n    0x9AD1, 0x9AD5, 0x3875, 0x9AD6, 0x9AD6, 0x226D, 0x9AD7, 0x9AD9, 0x387A,\n    0x9ADA, 0x9ADA, 0x24C1, 0x9ADB, 0x9AE1, 0x387D, 0x9AE2, 0x9AE2, 0x20CA,\n    0x9AE3, 0x9AE3, 0x3884, 0x9AE4, 0x9AE4, 0x20E7, 0x9AE5, 0x9AE5, 0x24C2,\n    0x9AE6, 0x9AFE, 0x3885, 0x9B40, 0x9B7E, 0x389E, 0x9B80, 0x9BD0, 0x38DD,\n    0x9BD1, 0x9BD1, 0x23DC, 0x9BD2, 0x9BDB, 0x392E, 0x9BDC, 0x9BDC, 0x23DB,\n    0x9BDD, 0x9BFE, 0x3938, 0x9C40, 0x9C52, 0x395A, 0x9C53, 0x9C53, 0x205E,\n    0x9C54, 0x9C58, 0x396D, 0x9C59, 0x9C59, 0x2244, 0x9C5A, 0x9C5A, 0x23E2,\n    0x9C5B, 0x9C5B, 0x3972, 0x9C5C, 0x9C5C, 0x20D4, 0x9C5D, 0x9C74, 0x3973,\n    0x9C75, 0x9C75, 0x219F, 0x9C76, 0x9C78, 0x398B, 0x9C79, 0x9C79, 0x1E66,\n    0x9C7A, 0x9C7E, 0x398E, 0x9C80, 0x9C85, 0x3993, 0x9C86, 0x9C86, 0x1F63,\n    0x9C87, 0x9C9C, 0x3999, 0x9C9D, 0x9C9D, 0x23DD, 0x9C9E, 0x9CAA, 0x39AF,\n    0x9CAB, 0x9CAB, 0x216B, 0x9CAC, 0x9CC9, 0x39BC, 0x9CCA, 0x9CCA, 0x22B5,\n    0x9CCB, 0x9CCE, 0x39DA, 0x9CCF, 0x9CCF, 0x1F26, 0x9CD0, 0x9CE5, 0x39DE,\n    0x9CE6, 0x9CE6, 0x1E63, 0x9CE7, 0x9CE7, 0x2088, 0x9CE8, 0x9CEB, 0x39F4,\n    0x9CEC, 0x9CEC, 0x1EBD, 0x9CED, 0x9CED, 0x39F8, 0x9CEE, 0x9CEE, 0x2341,\n    0x9CEF, 0x9CFA, 0x39F9, 0x9CFB, 0x9CFB, 0x1F4B, 0x9CFC, 0x9CFD, 0x3A05,\n    0x9CFE, 0x9CFE, 0x2292, 0x9D40, 0x9D41, 0x3A07, 0x9D42, 0x9D42, 0x2124,\n    0x9D43, 0x9D45, 0x3A09, 0x9D46, 0x9D46, 0x2048, 0x9D47, 0x9D47, 0x23E0,\n    0x9D48, 0x9D4C, 0x3A0C, 0x9D4D, 0x9D4D, 0x2077, 0x9D4E, 0x9D4E, 0x3A11,\n    0x9D4F, 0x9D4F, 0x223A, 0x9D50, 0x9D60, 0x3A12, 0x9D61, 0x9D61, 0x20B1,\n    0x9D62, 0x9D67, 0x3A23, 0x9D68, 0x9D68, 0x1F41, 0x9D69, 0x9D69, 0x201C,\n    0x9D6A, 0x9D6D, 0x3A29, 0x9D6E, 0x9D6E, 0x22B8, 0x9D6F, 0x9D70, 0x3A2D,\n    0x9D71, 0x9D71, 0x2276, 0x9D72, 0x9D74, 0x3A2F, 0x9D75, 0x9D75, 0x1F9B,\n    0x9D76, 0x9D7A, 0x3A32, 0x9D7B, 0x9D7B, 0x1F9F, 0x9D7C, 0x9D7C, 0x3A37,\n    0x9D7D, 0x9D7D, 0x25CA, 0x9D7E, 0x9D7E, 0x3A38, 0x9D80, 0x9D89, 0x3A39,\n    0x9D8A, 0x9D8A, 0x20BE, 0x9D8B, 0x9D8C, 0x3A43, 0x9D8D, 0x9D8D, 0x1FB4,\n    0x9D8E, 0x9D90, 0x3A45, 0x9D91, 0x9D91, 0x23D7, 0x9D92, 0x9D98, 0x3A48,\n    0x9D99, 0x9D99, 0x2105, 0x9D9A, 0x9DA0, 0x3A4F, 0x9DA1, 0x9DA1, 0x23E1,\n    0x9DA2, 0x9DA2, 0x1FEC, 0x9DA3, 0x9DA6, 0x3A56, 0x9DA7, 0x9DA7, 0x23EA,\n    0x9DA8, 0x9DAB, 0x3A5A, 0x9DAC, 0x9DAC, 0x23E3, 0x9DAD, 0x9DAD, 0x210E,\n    0x9DAE, 0x9DB1, 0x3A5E, 0x9DB2, 0x9DB2, 0x1FA6, 0x9DB3, 0x9DB3, 0x2004,\n    0x9DB4, 0x9DBD, 0x3A62, 0x9DBE, 0x9DBE, 0x1F9D, 0x9DBF, 0x9DC5, 0x3A6C,\n    0x9DC6, 0x9DC6, 0x23E5, 0x9DC7, 0x9DC8, 0x3A73, 0x9DC9, 0x9DC9, 0x2264,\n    0x9DCA, 0x9DCC, 0x3A75, 0x9DCD, 0x9DCD, 0x24E2, 0x9DCE, 0x9DD1, 0x3A78,\n    0x9DD2, 0x9DD2, 0x23DE, 0x9DD3, 0x9DD4, 0x3A7C, 0x9DD5, 0x9DD5, 0x1EC4,\n    0x9DD6, 0x9DE0, 0x3A7E, 0x9DE1, 0x9DE1, 0x22B6, 0x9DE2, 0x9DE2, 0x20A9,\n    0x9DE3, 0x9DF0, 0x3A89, 0x9DF1, 0x9DF1, 0x212B, 0x9DF2, 0x9DF3, 0x3A97,\n    0x9DF4, 0x9DF4, 0x20A5, 0x9DF5, 0x9DF6, 0x3A99, 0x9DF7, 0x9DF7, 0x268B,\n    0x9DF8, 0x9DF9, 0x3A9B, 0x9DFA, 0x9DFA, 0x1F76, 0x9DFB, 0x9DFC, 0x3A9D,\n    0x9DFD, 0x9DFD, 0x216D, 0x9DFE, 0x9DFE, 0x3A9F, 0x9E40, 0x9E44, 0x3AA0,\n    0x9E45, 0x9E45, 0x2001, 0x9E46, 0x9E47, 0x3AA5, 0x9E48, 0x9E48, 0x2191,\n    0x9E49, 0x9E49, 0x1E50, 0x9E4A, 0x9E51, 0x3AA7, 0x9E52, 0x9E52, 0x1F9C,\n    0x9E53, 0x9E53, 0x3AAF, 0x9E54, 0x9E54, 0x23DA, 0x9E55, 0x9E55, 0x3AB0,\n    0x9E56, 0x9E56, 0x2053, 0x9E57, 0x9E5C, 0x3AB1, 0x9E5D, 0x9E5D, 0x23E9,\n    0x9E5E, 0x9E5E, 0x23E4, 0x9E5F, 0x9E60, 0x3AB7, 0x9E61, 0x9E61, 0x21D5,\n    0x9E62, 0x9E62, 0x3AB9, 0x9E63, 0x9E63, 0x23E6, 0x9E64, 0x9E66, 0x3ABA,\n    0x9E67, 0x9E67, 0x23DF, 0x9E68, 0x9E6B, 0x3ABD, 0x9E6C, 0x9E6C, 0x1E4F,\n    0x9E6D, 0x9E6E, 0x3AC1, 0x9E6F, 0x9E6F, 0x23D9, 0x9E70, 0x9E71, 0x3AC3,\n    0x9E72, 0x9E72, 0x2014, 0x9E73, 0x9E73, 0x3AC5, 0x9E74, 0x9E74, 0x23EC,\n    0x9E75, 0x9E75, 0x23EB, 0x9E76, 0x9E7A, 0x3AC6, 0x9E7B, 0x9E7B, 0x23D8,\n    0x9E7C, 0x9E7C, 0x23EE, 0x9E7D, 0x9E7E, 0x3ACB, 0x9E80, 0x9E84, 0x3ACD,\n    0x9E85, 0x9E85, 0x268E, 0x9E86, 0x9E86, 0x3AD2, 0x9E87, 0x9E87, 0x23ED,\n    0x9E88, 0x9E90, 0x3AD3, 0x9E91, 0x9E91, 0x1FFA, 0x9E92, 0x9E95, 0x3ADC,\n    0x9E96, 0x9E96, 0x23D6, 0x9E97, 0x9E97, 0x23E8, 0x9E98, 0x9EA1, 0x3AE0,\n    0x9EA2, 0x9EA2, 0x2106, 0x9EA3, 0x9EA5, 0x3AEA, 0x9EA6, 0x9EA6, 0x200B,\n    0x9EA7, 0x9EA8, 0x3AED, 0x9EA9, 0x9EA9, 0x2166, 0x9EAA, 0x9EAD, 0x3AEF,\n    0x9EAE, 0x9EAE, 0x23EF, 0x9EAF, 0x9EB2, 0x3AF3, 0x9EB3, 0x9EB3, 0x2189,\n    0x9EB4, 0x9EB4, 0x2058, 0x9EB5, 0x9EB6, 0x3AF7, 0x9EB7, 0x9EB7, 0x23E7,\n    0x9EB8, 0x9EF4, 0x3AF9, 0x9EF5, 0x9EF5, 0x21A3, 0x9EF6, 0x9EFE, 0x3B36,\n    0x9F40, 0x9F4D, 0x3B3F, 0x9F4E, 0x9F4E, 0x217A, 0x9F4F, 0x9F6E, 0x3B4D,\n    0x9F6F, 0x9F6F, 0x21A5, 0x9F70, 0x9F7E, 0x3B6D, 0x9F80, 0x9F91, 0x3B7C,\n    0x9F92, 0x9F92, 0x2022, 0x9F93, 0x9F97, 0x3B8E, 0x9F98, 0x9F98, 0x24D6,\n    0x9F99, 0x9FA5, 0x3B93, 0x9FA6, 0x9FA6, 0x233A, 0x9FA7, 0x9FA8, 0x3BA0,\n    0x9FA9, 0x9FA9, 0x1EEE, 0x9FAA, 0x9FAB, 0x3BA2, 0x9FAC, 0x9FAC, 0x24D5,\n    0x9FAD, 0x9FC8, 0x3BA4, 0x9FC9, 0x9FC9, 0x2228, 0x9FCA, 0x9FCC, 0x3BC0,\n    0x9FCD, 0x9FCD, 0x24D7, 0x9FCE, 0x9FE0, 0x3BC3, 0x9FE1, 0x9FE1, 0x20FC,\n    0x9FE2, 0x9FEA, 0x3BD6, 0x9FEB, 0x9FEB, 0x1E87, 0x9FEC, 0x9FED, 0x3BDF,\n    0x9FEE, 0x9FEE, 0x24D8, 0x9FEF, 0x9FF3, 0x3BE1, 0x9FF4, 0x9FF4, 0x1EBA,\n    0x9FF5, 0x9FFC, 0x3BE6, 0x9FFD, 0x9FFD, 0x2119, 0x9FFE, 0x9FFE, 0x3BEE,\n    0xA040, 0xA042, 0x3BEF, 0xA043, 0xA043, 0x216C, 0xA044, 0xA045, 0x3BF2,\n    0xA046, 0xA046, 0x24D9, 0xA047, 0xA048, 0x3BF4, 0xA049, 0xA049, 0x2227,\n    0xA04A, 0xA04D, 0x3BF6, 0xA04E, 0xA04E, 0x1E5F, 0xA04F, 0xA053, 0x3BFA,\n    0xA054, 0xA054, 0x229F, 0xA055, 0xA059, 0x3BFF, 0xA05A, 0xA05A, 0x1F5D,\n    0xA05B, 0xA060, 0x3C04, 0xA061, 0xA061, 0x1FBC, 0xA062, 0xA062, 0x3C0A,\n    0xA063, 0xA063, 0x24DA, 0xA064, 0xA070, 0x3C0B, 0xA071, 0xA071, 0x2149,\n    0xA072, 0xA073, 0x3C18, 0xA074, 0xA074, 0x2046, 0xA075, 0xA07E, 0x3C1A,\n    0xA080, 0xA080, 0x2000, 0xA081, 0xA090, 0x3C24, 0xA091, 0xA091, 0x2190,\n    0xA092, 0xA093, 0x3C34, 0xA094, 0xA094, 0x2208, 0xA095, 0xA095, 0x3C36,\n    0xA096, 0xA096, 0x1EE6, 0xA097, 0xA0A8, 0x3C37, 0xA0A9, 0xA0A9, 0x24C3,\n    0xA0AA, 0xA0BE, 0x3C49, 0xA0BF, 0xA0BF, 0x20CC, 0xA0C0, 0xA0CD, 0x3C5E,\n    0xA0CE, 0xA0CE, 0x2340, 0xA0CF, 0xA0D8, 0x3C6C, 0xA0D9, 0xA0D9, 0x1ED1,\n    0xA0DA, 0xA0DD, 0x3C76, 0xA0DE, 0xA0DE, 0x21AC, 0xA0DF, 0xA0ED, 0x3C7A,\n    0xA0EE, 0xA0EE, 0x22AF, 0xA0EF, 0xA0FE, 0x3C89, 0xA1A1, 0xA1FE, 0x0060,\n    0xA2A1, 0xA2AA, 0x26A9, 0xA2B1, 0xA2E2, 0x00BE, 0xA2E5, 0xA2EE, 0x00F0,\n    0xA2F1, 0xA2FC, 0x00FA, 0xA3A1, 0xA3FE, 0x0106, 0xA4A1, 0xA4F3, 0x0164,\n    0xA5A1, 0xA5F6, 0x01B7, 0xA6A1, 0xA6B8, 0x020D, 0xA6C1, 0xA6F5, 0x0225,\n    0xA7A1, 0xA7C1, 0x025A, 0xA7D1, 0xA7F1, 0x027B, 0xA840, 0xA87E, 0x26B3,\n    0xA880, 0xA895, 0x26F2, 0xA8A1, 0xA8C0, 0x029C, 0xA8C5, 0xA8EA, 0x02BC,\n    0xA940, 0xA957, 0x2708, 0xA959, 0xA95A, 0x2720, 0xA95C, 0xA95C, 0x2722,\n    0xA960, 0xA97E, 0x2723, 0xA980, 0xA995, 0x2742, 0xA996, 0xA996, 0x1E17,\n    0xA9A4, 0xA9EF, 0x02E2, 0xAA40, 0xAA4C, 0x3C99, 0xAA4D, 0xAA4D, 0x21B6,\n    0xAA4E, 0xAA4E, 0x1E3D, 0xAA4F, 0xAA70, 0x3CA6, 0xAA71, 0xAA71, 0x2235,\n    0xAA72, 0xAA72, 0x3CC8, 0xAA73, 0xAA73, 0x2397, 0xAA74, 0xAA76, 0x3CC9,\n    0xAA77, 0xAA77, 0x2395, 0xAA78, 0xAA79, 0x3CCC, 0xAA7A, 0xAA7A, 0x223F,\n    0xAA7B, 0xAA7B, 0x212A, 0xAA7C, 0xAA7E, 0x3CCE, 0xAA80, 0xAA99, 0x3CD1,\n    0xAA9A, 0xAA9A, 0x1ED2, 0xAA9B, 0xAA9B, 0x3CEB, 0xAA9C, 0xAA9C, 0x2396,\n    0xAA9D, 0xAA9D, 0x2398, 0xAA9E, 0xAA9E, 0x3CEC, 0xAA9F, 0xAA9F, 0x20A2,\n    0xAAA0, 0xAAA0, 0x3CED, 0xAAA1, 0xAAFE, 0x032E, 0xAB40, 0xAB40, 0x1F64,\n    0xAB41, 0xAB42, 0x3CEE, 0xAB43, 0xAB43, 0x202B, 0xAB44, 0xAB44, 0x3CF0,\n    0xAB45, 0xAB45, 0x2394, 0xAB46, 0xAB46, 0x2139, 0xAB47, 0xAB47, 0x3CF1,\n    0xAB48, 0xAB48, 0x215F, 0xAB49, 0xAB49, 0x21C1, 0xAB4A, 0xAB4A, 0x239A,\n    0xAB4B, 0xAB4C, 0x3CF2, 0xAB4D, 0xAB4D, 0x2399, 0xAB4E, 0xAB7E, 0x3CF4,\n    0xAB80, 0xABA0, 0x3D25, 0xABA1, 0xABC0, 0x038C, 0xAC40, 0xAC45, 0x3D46,\n    0xAC46, 0xAC46, 0x21C0, 0xAC47, 0xAC70, 0x3D4C, 0xAC71, 0xAC71, 0x2460,\n    0xAC72, 0xAC7B, 0x3D76, 0xAC7C, 0xAC7C, 0x245C, 0xAC7D, 0xAC7E, 0x3D80,\n    0xAC80, 0xAC8C, 0x3D82, 0xAC8D, 0xAC8D, 0x215D, 0xAC8E, 0xAC92, 0x3D8F,\n    0xAC93, 0xAC93, 0x2225, 0xAC94, 0xAC94, 0x206A, 0xAC95, 0xACA0, 0x3D94,\n    0xAD40, 0xAD48, 0x3DA0, 0xAD49, 0xAD49, 0x2461, 0xAD4A, 0xAD5D, 0x3DA9,\n    0xAD5E, 0xAD5E, 0x245B, 0xAD5F, 0xAD60, 0x3DBD, 0xAD61, 0xAD61, 0x2462,\n    0xAD62, 0xAD67, 0x3DBF, 0xAD68, 0xAD68, 0x1F54, 0xAD69, 0xAD73, 0x3DC5,\n    0xAD74, 0xAD74, 0x245F, 0xAD75, 0xAD7E, 0x3DD0, 0xAD80, 0xAD81, 0x3DDA,\n    0xAD82, 0xAD82, 0x20EC, 0xAD83, 0xAD86, 0x3DDC, 0xAD87, 0xAD87, 0x245D,\n    0xAD88, 0xAD8A, 0x3DE0, 0xAD8B, 0xAD8B, 0x2463, 0xAD8C, 0xAD90, 0x3DE3,\n    0xAD91, 0xAD91, 0x2464, 0xAD92, 0xADA0, 0x3DE8, 0xAE40, 0xAE53, 0x3DF7,\n    0xAE54, 0xAE54, 0x24A5, 0xAE55, 0xAE61, 0x3E0B, 0xAE62, 0xAE62, 0x1E70,\n    0xAE63, 0xAE7E, 0x3E18, 0xAE80, 0xAE80, 0x208F, 0xAE81, 0xAE84, 0x3E34,\n    0xAE85, 0xAE85, 0x1E42, 0xAE86, 0xAE8A, 0x3E38, 0xAE8B, 0xAE8B, 0x1F4E,\n    0xAE8C, 0xAE93, 0x3E3D, 0xAE94, 0xAE94, 0x1EB1, 0xAE95, 0xAE9F, 0x3E45,\n    0xAEA0, 0xAEA0, 0x1E8B, 0xAF40, 0xAF63, 0x3E50, 0xAF64, 0xAF64, 0x1FC6,\n    0xAF65, 0xAF7A, 0x3E74, 0xAF7B, 0xAF7B, 0x25AE, 0xAF7C, 0xAF7E, 0x3E8A,\n    0xAF80, 0xAF81, 0x3E8D, 0xAF82, 0xAF82, 0x1F01, 0xAF83, 0xAF83, 0x2200,\n    0xAF84, 0xAF8D, 0x3E8F, 0xAF8E, 0xAF8E, 0x25B2, 0xAF8F, 0xAF8F, 0x1E97,\n    0xAF90, 0xAF90, 0x3E99, 0xAF91, 0xAF91, 0x20AB, 0xAF92, 0xAF9B, 0x3E9A,\n    0xAF9C, 0xAF9C, 0x25B3, 0xAF9D, 0xAF9E, 0x3EA4, 0xAF9F, 0xAF9F, 0x2028,\n    0xAFA0, 0xAFA0, 0x3EA6, 0xB040, 0xB040, 0x3EA7, 0xB041, 0xB042, 0x25AF,\n    0xB043, 0xB043, 0x3EA8, 0xB044, 0xB044, 0x25B1, 0xB045, 0xB04E, 0x3EA9,\n    0xB04F, 0xB04F, 0x25AC, 0xB050, 0xB053, 0x3EB3, 0xB054, 0xB054, 0x1E4E,\n    0xB055, 0xB056, 0x3EB7, 0xB057, 0xB057, 0x2202, 0xB058, 0xB058, 0x25AB,\n    0xB059, 0xB059, 0x2286, 0xB05A, 0xB05A, 0x3EB9, 0xB05B, 0xB05B, 0x25AD,\n    0xB05C, 0xB05C, 0x3EBA, 0xB05D, 0xB05D, 0x25B6, 0xB05E, 0xB05E, 0x3EBB,\n    0xB05F, 0xB05F, 0x21E3, 0xB060, 0xB061, 0x25B4, 0xB062, 0xB062, 0x222F,\n    0xB063, 0xB063, 0x2165, 0xB064, 0xB064, 0x25B7, 0xB065, 0xB06B, 0x3EBC,\n    0xB06C, 0xB06C, 0x1EE9, 0xB06D, 0xB07C, 0x3EC3, 0xB07D, 0xB07D, 0x1E25,\n    0xB07E, 0xB07E, 0x3ED3, 0xB080, 0xB096, 0x3ED4, 0xB097, 0xB097, 0x25C0,\n    0xB098, 0xB098, 0x3EEB, 0xB099, 0xB099, 0x229A, 0xB09A, 0xB0A0, 0x3EEC,\n    0xB0A1, 0xB0FE, 0x03AC, 0xB140, 0xB14A, 0x3EF3, 0xB14B, 0xB14B, 0x226E,\n    0xB14C, 0xB14C, 0x3EFE, 0xB14D, 0xB14D, 0x1FBD, 0xB14E, 0xB14E, 0x3EFF,\n    0xB14F, 0xB14F, 0x1F84, 0xB150, 0xB150, 0x20B2, 0xB151, 0xB151, 0x3F00,\n    0xB152, 0xB152, 0x2043, 0xB153, 0xB17E, 0x3F01, 0xB180, 0xB196, 0x3F2D,\n    0xB197, 0xB197, 0x2684, 0xB198, 0xB1A0, 0x3F44, 0xB1A1, 0xB1FE, 0x040A,\n    0xB240, 0xB240, 0x3F4D, 0xB241, 0xB241, 0x24EF, 0xB242, 0xB266, 0x3F4E,\n    0xB267, 0xB267, 0x24EE, 0xB268, 0xB26C, 0x3F73, 0xB26D, 0xB26D, 0x2074,\n    0xB26E, 0xB273, 0x3F78, 0xB274, 0xB274, 0x2687, 0xB275, 0xB27E, 0x3F7E,\n    0xB280, 0xB280, 0x24F0, 0xB281, 0xB288, 0x3F88, 0xB289, 0xB289, 0x268D,\n    0xB28A, 0xB299, 0x3F90, 0xB29A, 0xB29A, 0x22A0, 0xB29B, 0xB2A0, 0x3FA0,\n    0xB2A1, 0xB2FE, 0x0468, 0xB340, 0xB342, 0x3FA6, 0xB343, 0xB343, 0x1FAB,\n    0xB344, 0xB36F, 0x3FA9, 0xB370, 0xB370, 0x26A8, 0xB371, 0xB37E, 0x3FD5,\n    0xB380, 0xB387, 0x3FE3, 0xB388, 0xB388, 0x24E9, 0xB389, 0xB38B, 0x3FEB,\n    0xB38C, 0xB38C, 0x24E5, 0xB38D, 0xB38D, 0x3FEE, 0xB38E, 0xB38E, 0x21FA,\n    0xB38F, 0xB3A0, 0x3FEF, 0xB3A1, 0xB3FE, 0x04C6, 0xB440, 0xB453, 0x4001,\n    0xB454, 0xB454, 0x2148, 0xB455, 0xB457, 0x4015, 0xB458, 0xB458, 0x24E4,\n    0xB459, 0xB45D, 0x4018, 0xB45E, 0xB45E, 0x24E6, 0xB45F, 0xB45F, 0x20F7,\n    0xB460, 0xB460, 0x401D, 0xB461, 0xB461, 0x206B, 0xB462, 0xB474, 0x401E,\n    0xB475, 0xB475, 0x22A7, 0xB476, 0xB47D, 0x4031, 0xB47E, 0xB47E, 0x24EC,\n    0xB480, 0xB482, 0x4039, 0xB483, 0xB483, 0x24EB, 0xB484, 0xB488, 0x403C,\n    0xB489, 0xB489, 0x24E3, 0xB48A, 0xB492, 0x4041, 0xB493, 0xB493, 0x24EA,\n    0xB494, 0xB4A0, 0x404A, 0xB4A1, 0xB4FE, 0x0524, 0xB540, 0xB540, 0x4057,\n    0xB541, 0xB541, 0x1E92, 0xB542, 0xB54A, 0x4058, 0xB54B, 0xB54B, 0x1E27,\n    0xB54C, 0xB555, 0x4061, 0xB556, 0xB556, 0x1FE6, 0xB557, 0xB559, 0x406B,\n    0xB55A, 0xB55A, 0x24E7, 0xB55B, 0xB55B, 0x2012, 0xB55C, 0xB55C, 0x1EEC,\n    0xB55D, 0xB560, 0x406E, 0xB561, 0xB561, 0x24E8, 0xB562, 0xB57E, 0x4072,\n    0xB580, 0xB59B, 0x408F, 0xB59C, 0xB59C, 0x1F66, 0xB59D, 0xB59D, 0x24DC,\n    0xB59E, 0xB5A0, 0x40AB, 0xB5A1, 0xB5FE, 0x0582, 0xB640, 0xB651, 0x40AE,\n    0xB652, 0xB652, 0x26A2, 0xB653, 0xB654, 0x40C0, 0xB655, 0xB655, 0x24DD,\n    0xB656, 0xB658, 0x40C2, 0xB659, 0xB659, 0x200E, 0xB65A, 0xB65A, 0x40C5,\n    0xB65B, 0xB65B, 0x24DB, 0xB65C, 0xB65C, 0x1EB8, 0xB65D, 0xB67E, 0x40C6,\n    0xB680, 0xB6A0, 0x40E8, 0xB6A1, 0xB6FE, 0x05E0, 0xB740, 0xB74D, 0x4109,\n    0xB74E, 0xB74E, 0x2295, 0xB74F, 0xB750, 0x4117, 0xB751, 0xB751, 0x1E80,\n    0xB752, 0xB758, 0x4119, 0xB759, 0xB759, 0x2677, 0xB75A, 0xB763, 0x4120,\n    0xB764, 0xB764, 0x2624, 0xB765, 0xB765, 0x1F69, 0xB766, 0xB766, 0x222B,\n    0xB767, 0xB776, 0x412A, 0xB777, 0xB777, 0x257F, 0xB778, 0xB778, 0x1F5B,\n    0xB779, 0xB77E, 0x413A, 0xB780, 0xB780, 0x219B, 0xB781, 0xB781, 0x4140,\n    0xB782, 0xB782, 0x267D, 0xB783, 0xB7A0, 0x4141, 0xB7A1, 0xB7FE, 0x063E,\n    0xB840, 0xB842, 0x415F, 0xB843, 0xB843, 0x21A0, 0xB844, 0xB844, 0x2186,\n    0xB845, 0xB845, 0x4162, 0xB846, 0xB846, 0x20ED, 0xB847, 0xB84C, 0x4163,\n    0xB84D, 0xB84D, 0x25B9, 0xB84E, 0xB850, 0x4169, 0xB851, 0xB851, 0x1FEA,\n    0xB852, 0xB859, 0x416C, 0xB85A, 0xB85A, 0x1EA4, 0xB85B, 0xB85B, 0x20E1,\n    0xB85C, 0xB85C, 0x4174, 0xB85D, 0xB85D, 0x25B8, 0xB85E, 0xB85E, 0x2260,\n    0xB85F, 0xB85F, 0x4175, 0xB860, 0xB860, 0x20E2, 0xB861, 0xB876, 0x4176,\n    0xB877, 0xB877, 0x2141, 0xB878, 0xB87E, 0x418C, 0xB880, 0xB881, 0x4193,\n    0xB882, 0xB882, 0x1FC7, 0xB883, 0xB8A0, 0x4195, 0xB8A1, 0xB8FE, 0x069C,\n    0xB940, 0xB94F, 0x41B3, 0xB950, 0xB950, 0x1E41, 0xB951, 0xB960, 0x41C3,\n    0xB961, 0xB961, 0x25E4, 0xB962, 0xB97A, 0x41D3, 0xB97B, 0xB97B, 0x1F86,\n    0xB97C, 0xB97E, 0x41EC, 0xB980, 0xB99C, 0x41EF, 0xB99D, 0xB99D, 0x1FB3,\n    0xB99E, 0xB99F, 0x420C, 0xB9A0, 0xB9A0, 0x1EEF, 0xB9A1, 0xB9FE, 0x06FA,\n    0xBA40, 0xBA41, 0x420E, 0xBA42, 0xBA42, 0x22A4, 0xBA43, 0xBA43, 0x4210,\n    0xBA44, 0xBA44, 0x25E8, 0xBA45, 0xBA55, 0x4211, 0xBA56, 0xBA56, 0x25E3,\n    0xBA57, 0xBA58, 0x4222, 0xBA59, 0xBA59, 0x2111, 0xBA5A, 0xBA5F, 0x4224,\n    0xBA60, 0xBA60, 0x25E6, 0xBA61, 0xBA69, 0x422A, 0xBA6A, 0xBA6A, 0x25E7,\n    0xBA6B, 0xBA73, 0x4233, 0xBA74, 0xBA74, 0x2041, 0xBA75, 0xBA7E, 0x423C,\n    0xBA80, 0xBA83, 0x4246, 0xBA84, 0xBA84, 0x25EA, 0xBA85, 0xBA85, 0x424A,\n    0xBA86, 0xBA86, 0x1F8F, 0xBA87, 0xBA87, 0x424B, 0xBA88, 0xBA88, 0x25EC,\n    0xBA89, 0xBA8C, 0x424C, 0xBA8D, 0xBA8D, 0x25EB, 0xBA8E, 0xBA9D, 0x4250,\n    0xBA9E, 0xBA9E, 0x20D0, 0xBA9F, 0xBA9F, 0x201D, 0xBAA0, 0xBAA0, 0x4260,\n    0xBAA1, 0xBAFE, 0x0758, 0xBB40, 0xBB40, 0x1FF7, 0xBB41, 0xBB48, 0x4261,\n    0xBB49, 0xBB49, 0x1E8D, 0xBB4A, 0xBB57, 0x4269, 0xBB58, 0xBB58, 0x25E9,\n    0xBB59, 0xBB5A, 0x4277, 0xBB5B, 0xBB5B, 0x25EE, 0xBB5C, 0xBB5C, 0x203A,\n    0xBB5D, 0xBB5F, 0x4279, 0xBB60, 0xBB60, 0x2693, 0xBB61, 0xBB64, 0x427C,\n    0xBB65, 0xBB65, 0x25E5, 0xBB66, 0xBB66, 0x25ED, 0xBB67, 0xBB67, 0x4280,\n    0xBB68, 0xBB68, 0x2009, 0xBB69, 0xBB69, 0x4281, 0xBB6A, 0xBB6A, 0x2065,\n    0xBB6B, 0xBB6D, 0x4282, 0xBB6E, 0xBB6E, 0x26A3, 0xBB6F, 0xBB7E, 0x4285,\n    0xBB80, 0xBBA0, 0x4295, 0xBBA1, 0xBBFE, 0x07B6, 0xBC40, 0xBC51, 0x42B6,\n    0xBC52, 0xBC52, 0x25F5, 0xBC53, 0xBC53, 0x1EFC, 0xBC54, 0xBC59, 0x42C8,\n    0xBC5A, 0xBC5A, 0x2024, 0xBC5B, 0xBC60, 0x42CE, 0xBC61, 0xBC61, 0x269B,\n    0xBC62, 0xBC62, 0x42D4, 0xBC63, 0xBC63, 0x25F3, 0xBC64, 0xBC64, 0x42D5,\n    0xBC65, 0xBC65, 0x22D9, 0xBC66, 0xBC66, 0x42D6, 0xBC67, 0xBC67, 0x25F4,\n    0xBC68, 0xBC68, 0x42D7, 0xBC69, 0xBC69, 0x241B, 0xBC6A, 0xBC6C, 0x42D8,\n    0xBC6D, 0xBC6D, 0x1FC8, 0xBC6E, 0xBC6E, 0x42DB, 0xBC6F, 0xBC6F, 0x1F7B,\n    0xBC70, 0xBC70, 0x42DC, 0xBC71, 0xBC71, 0x241D, 0xBC72, 0xBC72, 0x42DD,\n    0xBC73, 0xBC73, 0x224C, 0xBC74, 0xBC74, 0x1F48, 0xBC75, 0xBC75, 0x241C,\n    0xBC76, 0xBC77, 0x241E, 0xBC78, 0xBC78, 0x20FF, 0xBC79, 0xBC79, 0x219A,\n    0xBC7A, 0xBC7A, 0x42DE, 0xBC7B, 0xBC7B, 0x2091, 0xBC7C, 0xBC7D, 0x42DF,\n    0xBC7E, 0xBC7E, 0x20A7, 0xBC80, 0xBC81, 0x42E1, 0xBC82, 0xBC82, 0x2423,\n    0xBC83, 0xBC83, 0x1E9B, 0xBC84, 0xBC84, 0x2422, 0xBC85, 0xBC85, 0x42E3,\n    0xBC86, 0xBC86, 0x2110, 0xBC87, 0xBC87, 0x42E4, 0xBC88, 0xBC88, 0x228D,\n    0xBC89, 0xBC89, 0x1F71, 0xBC8A, 0xBC8A, 0x1EF8, 0xBC8B, 0xBC8B, 0x2421,\n    0xBC8C, 0xBC8E, 0x42E5, 0xBC8F, 0xBC8F, 0x1EF3, 0xBC90, 0xBC99, 0x42E8,\n    0xBC9A, 0xBC9A, 0x21B1, 0xBC9B, 0xBC9B, 0x2426, 0xBC9C, 0xBC9C, 0x2425,\n    0xBC9D, 0xBC9D, 0x2120, 0xBC9E, 0xBCA0, 0x42F2, 0xBCA1, 0xBCFE, 0x0814,\n    0xBD40, 0xBD41, 0x42F5, 0xBD42, 0xBD42, 0x211A, 0xBD43, 0xBD43, 0x2424,\n    0xBD44, 0xBD44, 0x42F7, 0xBD45, 0xBD45, 0x2428, 0xBD46, 0xBD47, 0x42F8,\n    0xBD48, 0xBD48, 0x242A, 0xBD49, 0xBD49, 0x2429, 0xBD4A, 0xBD4A, 0x42FA,\n    0xBD4B, 0xBD4B, 0x2294, 0xBD4C, 0xBD4C, 0x42FB, 0xBD4D, 0xBD4D, 0x22BE,\n    0xBD4E, 0xBD4E, 0x42FC, 0xBD4F, 0xBD4F, 0x1E31, 0xBD50, 0xBD56, 0x42FD,\n    0xBD57, 0xBD57, 0x242C, 0xBD58, 0xBD58, 0x4304, 0xBD59, 0xBD59, 0x1FB5,\n    0xBD5A, 0xBD65, 0x4305, 0xBD66, 0xBD66, 0x242B, 0xBD67, 0xBD67, 0x1FAF,\n    0xBD68, 0xBD69, 0x4311, 0xBD6A, 0xBD6A, 0x2068, 0xBD6B, 0xBD6B, 0x21E4,\n    0xBD6C, 0xBD6E, 0x4313, 0xBD6F, 0xBD6F, 0x1F21, 0xBD70, 0xBD70, 0x4316,\n    0xBD71, 0xBD71, 0x2101, 0xBD72, 0xBD78, 0x4317, 0xBD79, 0xBD79, 0x217C,\n    0xBD7A, 0xBD7A, 0x214A, 0xBD7B, 0xBD7B, 0x242D, 0xBD7C, 0xBD7D, 0x431E,\n    0xBD7E, 0xBD7E, 0x1FD4, 0xBD80, 0xBD80, 0x4320, 0xBD81, 0xBD81, 0x1FD1,\n    0xBD82, 0xBD88, 0x4321, 0xBD89, 0xBD89, 0x1E33, 0xBD8A, 0xBD8A, 0x4328,\n    0xBD8B, 0xBD8B, 0x242F, 0xBD8C, 0xBD8D, 0x4329, 0xBD8E, 0xBD8E, 0x242E,\n    0xBD8F, 0xBD8F, 0x432B, 0xBD90, 0xBD90, 0x2430, 0xBD91, 0xBD91, 0x21DB,\n    0xBD92, 0xBD96, 0x432C, 0xBD97, 0xBD97, 0x2158, 0xBD98, 0xBD9A, 0x4331,\n    0xBD9B, 0xBD9B, 0x1FC2, 0xBD9C, 0xBDA0, 0x4334, 0xBDA1, 0xBDFE, 0x0872,\n    0xBE40, 0xBE42, 0x4339, 0xBE43, 0xBE43, 0x22B9, 0xBE44, 0xBE44, 0x433C,\n    0xBE45, 0xBE45, 0x2436, 0xBE46, 0xBE48, 0x433D, 0xBE49, 0xBE49, 0x1E8E,\n    0xBE4A, 0xBE4A, 0x2439, 0xBE4B, 0xBE50, 0x4340, 0xBE51, 0xBE51, 0x21C5,\n    0xBE52, 0xBE52, 0x2437, 0xBE53, 0xBE53, 0x2192, 0xBE54, 0xBE54, 0x4346,\n    0xBE55, 0xBE55, 0x243A, 0xBE56, 0xBE56, 0x1F19, 0xBE57, 0xBE57, 0x218C,\n    0xBE58, 0xBE58, 0x1E40, 0xBE59, 0xBE59, 0x22B3, 0xBE5A, 0xBE5C, 0x4347,\n    0xBE5D, 0xBE5D, 0x205F, 0xBE5E, 0xBE5E, 0x2438, 0xBE5F, 0xBE5F, 0x2432,\n    0xBE60, 0xBE60, 0x2274, 0xBE61, 0xBE61, 0x434A, 0xBE62, 0xBE62, 0x1E9C,\n    0xBE63, 0xBE63, 0x2431, 0xBE64, 0xBE64, 0x2085, 0xBE65, 0xBE68, 0x434B,\n    0xBE69, 0xBE69, 0x2435, 0xBE6A, 0xBE6B, 0x434F, 0xBE6C, 0xBE6C, 0x243B,\n    0xBE6D, 0xBE6E, 0x4351, 0xBE6F, 0xBE6F, 0x1FB7, 0xBE70, 0xBE70, 0x2433,\n    0xBE71, 0xBE75, 0x4353, 0xBE76, 0xBE76, 0x2054, 0xBE77, 0xBE77, 0x21DE,\n    0xBE78, 0xBE78, 0x4358, 0xBE79, 0xBE79, 0x2434, 0xBE7A, 0xBE7B, 0x4359,\n    0xBE7C, 0xBE7C, 0x243D, 0xBE7D, 0xBE7D, 0x1F89, 0xBE7E, 0xBE7E, 0x243C,\n    0xBE80, 0xBE82, 0x435B, 0xBE83, 0xBE83, 0x1F6E, 0xBE84, 0xBE84, 0x1ED8,\n    0xBE85, 0xBE85, 0x435E, 0xBE86, 0xBE86, 0x1EBF, 0xBE87, 0xBE87, 0x2445,\n    0xBE88, 0xBE88, 0x435F, 0xBE89, 0xBE89, 0x2249, 0xBE8A, 0xBE8B, 0x4360,\n    0xBE8C, 0xBE8C, 0x2441, 0xBE8D, 0xBE8D, 0x4362, 0xBE8E, 0xBE8E, 0x1E47,\n    0xBE8F, 0xBE8F, 0x1F56, 0xBE90, 0xBE91, 0x4363, 0xBE92, 0xBE92, 0x2086,\n    0xBE93, 0xBE94, 0x4365, 0xBE95, 0xBE95, 0x2196, 0xBE96, 0xBE96, 0x4367,\n    0xBE97, 0xBE97, 0x2443, 0xBE98, 0xBE98, 0x243F, 0xBE99, 0xBE99, 0x4368,\n    0xBE9A, 0xBE9A, 0x2023, 0xBE9B, 0xBE9B, 0x4369, 0xBE9C, 0xBE9C, 0x2442,\n    0xBE9D, 0xBE9E, 0x436A, 0xBE9F, 0xBE9F, 0x243E, 0xBEA0, 0xBEA0, 0x436C,\n    0xBEA1, 0xBEFE, 0x08D0, 0xBF40, 0xBF40, 0x26A6, 0xBF41, 0xBF4C, 0x436D,\n    0xBF4D, 0xBF4D, 0x234E, 0xBF4E, 0xBF4E, 0x2446, 0xBF4F, 0xBF4F, 0x244B,\n    0xBF50, 0xBF50, 0x2444, 0xBF51, 0xBF54, 0x4379, 0xBF55, 0xBF55, 0x2427,\n    0xBF56, 0xBF56, 0x244C, 0xBF57, 0xBF5F, 0x437D, 0xBF60, 0xBF60, 0x1F0F,\n    0xBF61, 0xBF61, 0x4386, 0xBF62, 0xBF62, 0x2447, 0xBF63, 0xBF63, 0x2449,\n    0xBF64, 0xBF64, 0x2448, 0xBF65, 0xBF67, 0x4387, 0xBF68, 0xBF68, 0x21C2,\n    0xBF69, 0xBF6B, 0x438A, 0xBF6C, 0xBF6C, 0x216E, 0xBF6D, 0xBF6F, 0x438D,\n    0xBF70, 0xBF70, 0x1F03, 0xBF71, 0xBF71, 0x4390, 0xBF72, 0xBF72, 0x244A,\n    0xBF73, 0xBF73, 0x215C, 0xBF74, 0xBF75, 0x4391, 0xBF76, 0xBF76, 0x22BB,\n    0xBF77, 0xBF77, 0x2450, 0xBF78, 0xBF78, 0x4393, 0xBF79, 0xBF79, 0x2694,\n    0xBF7A, 0xBF7A, 0x244F, 0xBF7B, 0xBF7B, 0x25F6, 0xBF7C, 0xBF7C, 0x2051,\n    0xBF7D, 0xBF7D, 0x4394, 0xBF7E, 0xBF7E, 0x244E, 0xBF80, 0xBF81, 0x4395,\n    0xBF82, 0xBF82, 0x22BA, 0xBF83, 0xBF83, 0x1F6D, 0xBF84, 0xBF88, 0x4397,\n    0xBF89, 0xBF89, 0x2452, 0xBF8A, 0xBF8A, 0x2451, 0xBF8B, 0xBF94, 0x439C,\n    0xBF95, 0xBF95, 0x2455, 0xBF96, 0xBF96, 0x43A6, 0xBF97, 0xBF97, 0x2289,\n    0xBF98, 0xBF98, 0x2116, 0xBF99, 0xBF9C, 0x43A7, 0xBF9D, 0xBF9D, 0x2454,\n    0xBF9E, 0xBFA0, 0x43AB, 0xBFA1, 0xBFFE, 0x092E, 0xC040, 0xC040, 0x20FB,\n    0xC041, 0xC043, 0x43AE, 0xC044, 0xC044, 0x2440, 0xC045, 0xC04A, 0x43B1,\n    0xC04B, 0xC04B, 0x2126, 0xC04C, 0xC04C, 0x1F61, 0xC04D, 0xC04D, 0x269D,\n    0xC04E, 0xC04E, 0x43B7, 0xC04F, 0xC04F, 0x1F8A, 0xC050, 0xC050, 0x2456,\n    0xC051, 0xC051, 0x2459, 0xC052, 0xC052, 0x2458, 0xC053, 0xC054, 0x43B8,\n    0xC055, 0xC055, 0x1FAE, 0xC056, 0xC05A, 0x43BA, 0xC05B, 0xC05B, 0x221A,\n    0xC05C, 0xC05D, 0x43BF, 0xC05E, 0xC05E, 0x1F7A, 0xC05F, 0xC05F, 0x244D,\n    0xC060, 0xC060, 0x2457, 0xC061, 0xC068, 0x43C1, 0xC069, 0xC069, 0x2453,\n    0xC06A, 0xC06A, 0x43C9, 0xC06B, 0xC06B, 0x2420, 0xC06C, 0xC06C, 0x43CA,\n    0xC06D, 0xC06D, 0x21DF, 0xC06E, 0xC06E, 0x2685, 0xC06F, 0xC06F, 0x43CB,\n    0xC070, 0xC070, 0x1E6E, 0xC071, 0xC073, 0x43CC, 0xC074, 0xC074, 0x2224,\n    0xC075, 0xC075, 0x2670, 0xC076, 0xC076, 0x43CF, 0xC077, 0xC077, 0x21BA,\n    0xC078, 0xC078, 0x43D0, 0xC079, 0xC079, 0x245A, 0xC07A, 0xC07B, 0x43D1,\n    0xC07C, 0xC07C, 0x1FFF, 0xC07D, 0xC07E, 0x43D3, 0xC080, 0xC09A, 0x43D5,\n    0xC09B, 0xC09B, 0x25E2, 0xC09C, 0xC09C, 0x43F0, 0xC09D, 0xC09D, 0x269A,\n    0xC09E, 0xC0A0, 0x43F1, 0xC0A1, 0xC0FE, 0x098C, 0xC140, 0xC14F, 0x43F4,\n    0xC150, 0xC150, 0x1EEA, 0xC151, 0xC153, 0x4404, 0xC154, 0xC154, 0x1E2C,\n    0xC155, 0xC15E, 0x4407, 0xC15F, 0xC15F, 0x2062, 0xC160, 0xC160, 0x24F1,\n    0xC161, 0xC161, 0x4411, 0xC162, 0xC162, 0x24F2, 0xC163, 0xC174, 0x4412,\n    0xC175, 0xC175, 0x25F2, 0xC176, 0xC177, 0x4424, 0xC178, 0xC178, 0x2215,\n    0xC179, 0xC17E, 0x4426, 0xC180, 0xC194, 0x442C, 0xC195, 0xC195, 0x21AE,\n    0xC196, 0xC1A0, 0x4441, 0xC1A1, 0xC1FE, 0x09EA, 0xC240, 0xC24D, 0x444C,\n    0xC24E, 0xC24E, 0x20E0, 0xC24F, 0xC264, 0x445A, 0xC265, 0xC265, 0x25C2,\n    0xC266, 0xC266, 0x4470, 0xC267, 0xC267, 0x25C1, 0xC268, 0xC27C, 0x4471,\n    0xC27D, 0xC27D, 0x2128, 0xC27E, 0xC27E, 0x4486, 0xC280, 0xC283, 0x4487,\n    0xC284, 0xC284, 0x2199, 0xC285, 0xC292, 0x448B, 0xC293, 0xC293, 0x2017,\n    0xC294, 0xC294, 0x1EA0, 0xC295, 0xC295, 0x2125, 0xC296, 0xC296, 0x214D,\n    0xC297, 0xC297, 0x4499, 0xC298, 0xC298, 0x25C4, 0xC299, 0xC299, 0x209D,\n    0xC29A, 0xC29A, 0x228A, 0xC29B, 0xC29B, 0x449A, 0xC29C, 0xC29C, 0x25C3,\n    0xC29D, 0xC29F, 0x449B, 0xC2A0, 0xC2A0, 0x2179, 0xC2A1, 0xC2FE, 0x0A48,\n    0xC340, 0xC340, 0x2038, 0xC341, 0xC342, 0x449E, 0xC343, 0xC343, 0x2155,\n    0xC344, 0xC37A, 0x44A0, 0xC37B, 0xC37B, 0x21D2, 0xC37C, 0xC37E, 0x44D7,\n    0xC380, 0xC383, 0x44DA, 0xC384, 0xC384, 0x24C7, 0xC385, 0xC39A, 0x44DE,\n    0xC39B, 0xC39B, 0x2279, 0xC39C, 0xC3A0, 0x44F4, 0xC3A1, 0xC3FE, 0x0AA6,\n    0xC440, 0xC448, 0x44F9, 0xC449, 0xC449, 0x2123, 0xC44A, 0xC44B, 0x4502,\n    0xC44C, 0xC44C, 0x24C5, 0xC44D, 0xC453, 0x4504, 0xC454, 0xC454, 0x24C9,\n    0xC455, 0xC457, 0x450B, 0xC458, 0xC458, 0x2094, 0xC459, 0xC45A, 0x450E,\n    0xC45B, 0xC45B, 0x2296, 0xC45C, 0xC462, 0x4510, 0xC463, 0xC463, 0x1E77,\n    0xC464, 0xC476, 0x4517, 0xC477, 0xC477, 0x1F06, 0xC478, 0xC479, 0x452A,\n    0xC47A, 0xC47A, 0x1FA5, 0xC47B, 0xC47E, 0x452C, 0xC480, 0xC480, 0x4530,\n    0xC481, 0xC481, 0x2099, 0xC482, 0xC490, 0x4531, 0xC491, 0xC491, 0x1EAD,\n    0xC492, 0xC492, 0x24C8, 0xC493, 0xC493, 0x20A8, 0xC494, 0xC497, 0x4540,\n    0xC498, 0xC498, 0x201F, 0xC499, 0xC499, 0x4544, 0xC49A, 0xC49A, 0x20C5,\n    0xC49B, 0xC49B, 0x4545, 0xC49C, 0xC49C, 0x24CA, 0xC49D, 0xC4A0, 0x4546,\n    0xC4A1, 0xC4FE, 0x0B04, 0xC540, 0xC543, 0x454A, 0xC544, 0xC544, 0x1FF0,\n    0xC545, 0xC545, 0x454E, 0xC546, 0xC546, 0x24C6, 0xC547, 0xC54A, 0x454F,\n    0xC54B, 0xC54B, 0x225D, 0xC54C, 0xC54C, 0x22DE, 0xC54D, 0xC551, 0x4553,\n    0xC552, 0xC552, 0x202C, 0xC553, 0xC55E, 0x4558, 0xC55F, 0xC55F, 0x2161,\n    0xC560, 0xC562, 0x4564, 0xC563, 0xC563, 0x223B, 0xC564, 0xC564, 0x21D9,\n    0xC565, 0xC565, 0x1FCB, 0xC566, 0xC566, 0x1FC9, 0xC567, 0xC57E, 0x4567,\n    0xC580, 0xC592, 0x457F, 0xC593, 0xC593, 0x1E61, 0xC594, 0xC59B, 0x4592,\n    0xC59C, 0xC59C, 0x25EF, 0xC59D, 0xC59D, 0x459A, 0xC59E, 0xC59E, 0x1F98,\n    0xC59F, 0xC5A0, 0x459B, 0xC5A1, 0xC5FE, 0x0B62, 0xC640, 0xC640, 0x459D,\n    0xC641, 0xC641, 0x25F0, 0xC642, 0xC643, 0x459E, 0xC644, 0xC644, 0x1F88,\n    0xC645, 0xC646, 0x45A0, 0xC647, 0xC647, 0x21F8, 0xC648, 0xC662, 0x45A2,\n    0xC663, 0xC663, 0x2322, 0xC664, 0xC671, 0x45BD, 0xC672, 0xC672, 0x2336,\n    0xC673, 0xC67E, 0x45CB, 0xC680, 0xC6A0, 0x45D7, 0xC6A1, 0xC6FE, 0x0BC0,\n    0xC740, 0xC765, 0x45F8, 0xC766, 0xC766, 0x22AB, 0xC767, 0xC76E, 0x461E,\n    0xC76F, 0xC76F, 0x1FBF, 0xC770, 0xC775, 0x4626, 0xC776, 0xC776, 0x1F7D,\n    0xC777, 0xC77A, 0x462C, 0xC77B, 0xC77B, 0x2333, 0xC77C, 0xC77E, 0x4630,\n    0xC780, 0xC7A0, 0x4633, 0xC7A1, 0xC7FE, 0x0C1E, 0xC840, 0xC840, 0x4654,\n    0xC841, 0xC841, 0x1F4D, 0xC842, 0xC84E, 0x4655, 0xC84F, 0xC84F, 0x2334,\n    0xC850, 0xC851, 0x4662, 0xC852, 0xC852, 0x1FF1, 0xC853, 0xC865, 0x4664,\n    0xC866, 0xC866, 0x218B, 0xC867, 0xC86D, 0x4677, 0xC86E, 0xC86E, 0x2349,\n    0xC86F, 0xC87D, 0x467E, 0xC87E, 0xC87E, 0x220B, 0xC880, 0xC886, 0x468D,\n    0xC887, 0xC887, 0x2346, 0xC888, 0xC891, 0x4694, 0xC892, 0xC892, 0x2347,\n    0xC893, 0xC893, 0x469E, 0xC894, 0xC894, 0x2193, 0xC895, 0xC898, 0x469F,\n    0xC899, 0xC899, 0x26A1, 0xC89A, 0xC89C, 0x46A3, 0xC89D, 0xC89D, 0x1F62,\n    0xC89E, 0xC8A0, 0x46A6, 0xC8A1, 0xC8FE, 0x0C7C, 0xC940, 0xC94E, 0x46A9,\n    0xC94F, 0xC94F, 0x234D, 0xC950, 0xC950, 0x2348, 0xC951, 0xC96D, 0x46B8,\n    0xC96E, 0xC96E, 0x1E60, 0xC96F, 0xC96F, 0x46D5, 0xC970, 0xC970, 0x2345,\n    0xC971, 0xC976, 0x46D6, 0xC977, 0xC977, 0x1F12, 0xC978, 0xC97E, 0x46DC,\n    0xC980, 0xC98E, 0x46E3, 0xC98F, 0xC98F, 0x2018, 0xC990, 0xC990, 0x2335,\n    0xC991, 0xC99B, 0x46F2, 0xC99C, 0xC99C, 0x233C, 0xC99D, 0xC9A0, 0x46FD,\n    0xC9A1, 0xC9FE, 0x0CDA, 0xCA40, 0xCA4D, 0x4701, 0xCA4E, 0xCA4E, 0x266F,\n    0xCA4F, 0xCA55, 0x470F, 0xCA56, 0xCA56, 0x2351, 0xCA57, 0xCA58, 0x4716,\n    0xCA59, 0xCA59, 0x1FA0, 0xCA5A, 0xCA5B, 0x4718, 0xCA5C, 0xCA5C, 0x2338,\n    0xCA5D, 0xCA60, 0x471A, 0xCA61, 0xCA61, 0x221B, 0xCA62, 0xCA6D, 0x471E,\n    0xCA6E, 0xCA6E, 0x2342, 0xCA6F, 0xCA71, 0x472A, 0xCA72, 0xCA72, 0x234F,\n    0xCA73, 0xCA76, 0x472D, 0xCA77, 0xCA77, 0x233D, 0xCA78, 0xCA7A, 0x4731,\n    0xCA7B, 0xCA7B, 0x2344, 0xCA7C, 0xCA7C, 0x2331, 0xCA7D, 0xCA7D, 0x4734,\n    0xCA7E, 0xCA7E, 0x234B, 0xCA80, 0xCA80, 0x4735, 0xCA81, 0xCA81, 0x233B,\n    0xCA82, 0xCA88, 0x4736, 0xCA89, 0xCA89, 0x2350, 0xCA8A, 0xCA8D, 0x473D,\n    0xCA8E, 0xCA8E, 0x1EB4, 0xCA8F, 0xCA8F, 0x21A6, 0xCA90, 0xCA91, 0x4741,\n    0xCA92, 0xCA92, 0x21CB, 0xCA93, 0xCA99, 0x4743, 0xCA9A, 0xCA9A, 0x2355,\n    0xCA9B, 0xCAA0, 0x474A, 0xCAA1, 0xCAFE, 0x0D38, 0xCB40, 0xCB42, 0x4750,\n    0xCB43, 0xCB43, 0x233E, 0xCB44, 0xCB44, 0x4753, 0xCB45, 0xCB45, 0x1F74,\n    0xCB46, 0xCB46, 0x4754, 0xCB47, 0xCB47, 0x2330, 0xCB48, 0xCB4A, 0x4755,\n    0xCB4B, 0xCB4B, 0x2680, 0xCB4C, 0xCB4D, 0x4758, 0xCB4E, 0xCB4E, 0x20DA,\n    0xCB4F, 0xCB56, 0x475A, 0xCB57, 0xCB57, 0x234A, 0xCB58, 0xCB5C, 0x4762,\n    0xCB5D, 0xCB5D, 0x1F91, 0xCB5E, 0xCB5E, 0x4767, 0xCB5F, 0xCB5F, 0x2107,\n    0xCB60, 0xCB69, 0x4768, 0xCB6A, 0xCB6A, 0x233F, 0xCB6B, 0xCB7A, 0x4772,\n    0xCB7B, 0xCB7B, 0x1FF4, 0xCB7C, 0xCB7C, 0x2343, 0xCB7D, 0xCB7E, 0x4782,\n    0xCB80, 0xCB86, 0x4784, 0xCB87, 0xCB87, 0x2212, 0xCB88, 0xCB8D, 0x478B,\n    0xCB8E, 0xCB8E, 0x2207, 0xCB8F, 0xCB91, 0x4791, 0xCB92, 0xCB92, 0x2359,\n    0xCB93, 0xCB9B, 0x4794, 0xCB9C, 0xCB9C, 0x2254, 0xCB9D, 0xCB9D, 0x479D,\n    0xCB9E, 0xCB9E, 0x2332, 0xCB9F, 0xCBA0, 0x479E, 0xCBA1, 0xCBFE, 0x0D96,\n    0xCC40, 0xCC40, 0x1E26, 0xCC41, 0xCC41, 0x2357, 0xCC42, 0xCC48, 0x47A0,\n    0xCC49, 0xCC49, 0x2358, 0xCC4A, 0xCC4A, 0x2042, 0xCC4B, 0xCC4B, 0x2153,\n    0xCC4C, 0xCC4E, 0x47A7, 0xCC4F, 0xCC4F, 0x20BB, 0xCC50, 0xCC5B, 0x47AA,\n    0xCC5C, 0xCC5C, 0x235A, 0xCC5D, 0xCC5F, 0x47B6, 0xCC60, 0xCC60, 0x2356,\n    0xCC61, 0xCC63, 0x47B9, 0xCC64, 0xCC64, 0x2337, 0xCC65, 0xCC6C, 0x47BC,\n    0xCC6D, 0xCC6D, 0x1FF9, 0xCC6E, 0xCC78, 0x47C4, 0xCC79, 0xCC79, 0x2353,\n    0xCC7A, 0xCC7C, 0x47CF, 0xCC7D, 0xCC7D, 0x2061, 0xCC7E, 0xCC7E, 0x47D2,\n    0xCC80, 0xCC8D, 0x47D3, 0xCC8E, 0xCC8E, 0x1E95, 0xCC8F, 0xCC93, 0x47E1,\n    0xCC94, 0xCC94, 0x2049, 0xCC95, 0xCC95, 0x47E6, 0xCC96, 0xCC96, 0x1F42,\n    0xCC97, 0xCC9C, 0x47E7, 0xCC9D, 0xCC9D, 0x1FE8, 0xCC9E, 0xCCA0, 0x47ED,\n    0xCCA1, 0xCCFE, 0x0DF4, 0xCD40, 0xCD7E, 0x47F0, 0xCD80, 0xCD8F, 0x482F,\n    0xCD90, 0xCD90, 0x25DA, 0xCD91, 0xCD97, 0x483F, 0xCD98, 0xCD98, 0x25D7,\n    0xCD99, 0xCDA0, 0x4846, 0xCDA1, 0xCDFE, 0x0E52, 0xCE40, 0xCE66, 0x484E,\n    0xCE67, 0xCE67, 0x212E, 0xCE68, 0xCE71, 0x4875, 0xCE72, 0xCE72, 0x21B2,\n    0xCE73, 0xCE7E, 0x487F, 0xCE80, 0xCE80, 0x488B, 0xCE81, 0xCE81, 0x219E,\n    0xCE82, 0xCE86, 0x488C, 0xCE87, 0xCE87, 0x25DC, 0xCE88, 0xCE9A, 0x4891,\n    0xCE9B, 0xCE9B, 0x206C, 0xCE9C, 0xCE9D, 0x48A4, 0xCE9E, 0xCE9E, 0x2226,\n    0xCE9F, 0xCEA0, 0x48A6, 0xCEA1, 0xCEFE, 0x0EB0, 0xCF40, 0xCF4D, 0x48A8,\n    0xCF4E, 0xCF4E, 0x25E0, 0xCF4F, 0xCF54, 0x48B6, 0xCF55, 0xCF55, 0x227B,\n    0xCF56, 0xCF57, 0x48BC, 0xCF58, 0xCF58, 0x25DE, 0xCF59, 0xCF5B, 0x48BE,\n    0xCF5C, 0xCF5C, 0x25E1, 0xCF5D, 0xCF6B, 0x48C1, 0xCF6C, 0xCF6C, 0x25D5,\n    0xCF6D, 0xCF72, 0x48D0, 0xCF73, 0xCF73, 0x1E6B, 0xCF74, 0xCF74, 0x48D6,\n    0xCF75, 0xCF75, 0x25DB, 0xCF76, 0xCF77, 0x48D7, 0xCF78, 0xCF78, 0x1E89,\n    0xCF79, 0xCF7B, 0x48D9, 0xCF7C, 0xCF7C, 0x25D9, 0xCF7D, 0xCF7E, 0x48DC,\n    0xCF80, 0xCF80, 0x48DE, 0xCF81, 0xCF81, 0x2211, 0xCF82, 0xCF88, 0x48DF,\n    0xCF89, 0xCF89, 0x2229, 0xCF8A, 0xCF8A, 0x25D6, 0xCF8B, 0xCF92, 0x48E6,\n    0xCF93, 0xCF93, 0x25DD, 0xCF94, 0xCF94, 0x25DF, 0xCF95, 0xCF9D, 0x48EE,\n    0xCF9E, 0xCF9E, 0x1FEF, 0xCF9F, 0xCF9F, 0x48F7, 0xCFA0, 0xCFA0, 0x25D8,\n    0xCFA1, 0xCFFE, 0x0F0E, 0xD040, 0xD04C, 0x48F8, 0xD04D, 0xD04D, 0x1F29,\n    0xD04E, 0xD050, 0x4905, 0xD051, 0xD051, 0x1E5B, 0xD052, 0xD054, 0x4908,\n    0xD055, 0xD055, 0x2076, 0xD056, 0xD05B, 0x490B, 0xD05C, 0xD05C, 0x2297,\n    0xD05D, 0xD05F, 0x4911, 0xD060, 0xD060, 0x2690, 0xD061, 0xD066, 0x4914,\n    0xD067, 0xD067, 0x213F, 0xD068, 0xD06B, 0x491A, 0xD06C, 0xD06C, 0x2198,\n    0xD06D, 0xD06D, 0x491E, 0xD06E, 0xD06E, 0x1E88, 0xD06F, 0xD07C, 0x491F,\n    0xD07D, 0xD07D, 0x228C, 0xD07E, 0xD07E, 0x492D, 0xD080, 0xD0A0, 0x492E,\n    0xD0A1, 0xD0FE, 0x0F6C, 0xD140, 0xD154, 0x494F, 0xD155, 0xD155, 0x25F1,\n    0xD156, 0xD158, 0x4964, 0xD159, 0xD159, 0x200C, 0xD15A, 0xD160, 0x4967,\n    0xD161, 0xD161, 0x1E58, 0xD162, 0xD162, 0x22AC, 0xD163, 0xD174, 0x496E,\n    0xD175, 0xD175, 0x26A7, 0xD176, 0xD17C, 0x4980, 0xD17D, 0xD17D, 0x2676,\n    0xD17E, 0xD17E, 0x4987, 0xD180, 0xD19C, 0x4988, 0xD19D, 0xD19D, 0x1FE1,\n    0xD19E, 0xD19E, 0x25BB, 0xD19F, 0xD1A0, 0x49A5, 0xD1A1, 0xD1FE, 0x0FCA,\n    0xD240, 0xD240, 0x25BE, 0xD241, 0xD242, 0x49A7, 0xD243, 0xD243, 0x22DD,\n    0xD244, 0xD24C, 0x49A9, 0xD24D, 0xD24D, 0x25BD, 0xD24E, 0xD25B, 0x49B2,\n    0xD25C, 0xD25C, 0x1E2A, 0xD25D, 0xD262, 0x49C0, 0xD263, 0xD263, 0x25BC,\n    0xD264, 0xD264, 0x25BA, 0xD265, 0xD267, 0x49C6, 0xD268, 0xD268, 0x25BF,\n    0xD269, 0xD26C, 0x49C9, 0xD26D, 0xD26D, 0x2187, 0xD26E, 0xD26E, 0x49CD,\n    0xD26F, 0xD26F, 0x266B, 0xD270, 0xD271, 0x49CE, 0xD272, 0xD272, 0x1E7F,\n    0xD273, 0xD274, 0x49D0, 0xD275, 0xD275, 0x21AD, 0xD276, 0xD27E, 0x49D2,\n    0xD280, 0xD289, 0x49DB, 0xD28A, 0xD28A, 0x1F96, 0xD28B, 0xD28D, 0x49E5,\n    0xD28E, 0xD28E, 0x1F32, 0xD28F, 0xD291, 0x49E8, 0xD292, 0xD292, 0x2084,\n    0xD293, 0xD294, 0x49EB, 0xD295, 0xD295, 0x2136, 0xD296, 0xD296, 0x49ED,\n    0xD297, 0xD297, 0x24B8, 0xD298, 0xD29F, 0x49EE, 0xD2A0, 0xD2A0, 0x24BA,\n    0xD2A1, 0xD2FE, 0x1028, 0xD340, 0xD343, 0x49F6, 0xD344, 0xD344, 0x24BC,\n    0xD345, 0xD347, 0x49FA, 0xD348, 0xD348, 0x20E4, 0xD349, 0xD349, 0x49FD,\n    0xD34A, 0xD34A, 0x24B9, 0xD34B, 0xD34C, 0x49FE, 0xD34D, 0xD34D, 0x24BD,\n    0xD34E, 0xD34F, 0x4A00, 0xD350, 0xD350, 0x24BE, 0xD351, 0xD354, 0x4A02,\n    0xD355, 0xD355, 0x24BF, 0xD356, 0xD357, 0x4A06, 0xD358, 0xD358, 0x1FD2,\n    0xD359, 0xD35A, 0x4A08, 0xD35B, 0xD35B, 0x1FFD, 0xD35C, 0xD35C, 0x4A0A,\n    0xD35D, 0xD35D, 0x24BB, 0xD35E, 0xD35E, 0x1F2D, 0xD35F, 0xD377, 0x4A0B,\n    0xD378, 0xD378, 0x2609, 0xD379, 0xD379, 0x4A24, 0xD37A, 0xD37A, 0x260A,\n    0xD37B, 0xD37B, 0x4A25, 0xD37C, 0xD37C, 0x1E94, 0xD37D, 0xD37E, 0x4A26,\n    0xD380, 0xD384, 0x4A28, 0xD385, 0xD385, 0x22DF, 0xD386, 0xD386, 0x1ECB,\n    0xD387, 0xD387, 0x1F0D, 0xD388, 0xD38A, 0x4A2D, 0xD38B, 0xD38B, 0x1F77,\n    0xD38C, 0xD38C, 0x4A30, 0xD38D, 0xD38D, 0x21EB, 0xD38E, 0xD38E, 0x4A31,\n    0xD38F, 0xD38F, 0x22E1, 0xD390, 0xD390, 0x4A32, 0xD391, 0xD391, 0x216F,\n    0xD392, 0xD392, 0x4A33, 0xD393, 0xD393, 0x22E0, 0xD394, 0xD395, 0x4A34,\n    0xD396, 0xD396, 0x21EA, 0xD397, 0xD397, 0x4A36, 0xD398, 0xD398, 0x22E2,\n    0xD399, 0xD399, 0x20CB, 0xD39A, 0xD39A, 0x4A37, 0xD39B, 0xD39B, 0x1F78,\n    0xD39C, 0xD39D, 0x4A38, 0xD39E, 0xD39E, 0x1EE2, 0xD39F, 0xD39F, 0x4A3A,\n    0xD3A0, 0xD3A0, 0x21F2, 0xD3A1, 0xD3FE, 0x1086, 0xD440, 0xD440, 0x4A3B,\n    0xD441, 0xD441, 0x2150, 0xD442, 0xD444, 0x4A3C, 0xD445, 0xD445, 0x1FD3,\n    0xD446, 0xD446, 0x4A3F, 0xD447, 0xD447, 0x22E5, 0xD448, 0xD44B, 0x4A40,\n    0xD44C, 0xD44C, 0x1EF2, 0xD44D, 0xD44E, 0x4A44, 0xD44F, 0xD44F, 0x211F,\n    0xD450, 0xD452, 0x4A46, 0xD453, 0xD453, 0x21DD, 0xD454, 0xD455, 0x4A49,\n    0xD456, 0xD456, 0x2154, 0xD457, 0xD457, 0x4A4B, 0xD458, 0xD458, 0x22E7,\n    0xD459, 0xD45B, 0x4A4C, 0xD45C, 0xD45C, 0x2282, 0xD45D, 0xD461, 0x4A4F,\n    0xD462, 0xD462, 0x22E6, 0xD463, 0xD466, 0x4A54, 0xD467, 0xD467, 0x22E8,\n    0xD468, 0xD46D, 0x4A58, 0xD46E, 0xD46E, 0x22E4, 0xD46F, 0xD46F, 0x4A5E,\n    0xD470, 0xD470, 0x226A, 0xD471, 0xD471, 0x4A5F, 0xD472, 0xD472, 0x22EB,\n    0xD473, 0xD473, 0x4A60, 0xD474, 0xD474, 0x22E9, 0xD475, 0xD475, 0x20BD,\n    0xD476, 0xD477, 0x4A61, 0xD478, 0xD478, 0x22EA, 0xD479, 0xD47A, 0x4A63,\n    0xD47B, 0xD47B, 0x22BD, 0xD47C, 0xD47D, 0x4A65, 0xD47E, 0xD47E, 0x1E9E,\n    0xD480, 0xD481, 0x4A67, 0xD482, 0xD482, 0x22F6, 0xD483, 0xD483, 0x21E7,\n    0xD484, 0xD484, 0x2216, 0xD485, 0xD486, 0x4A69, 0xD487, 0xD487, 0x2137,\n    0xD488, 0xD489, 0x4A6B, 0xD48A, 0xD48A, 0x212C, 0xD48B, 0xD48B, 0x4A6D,\n    0xD48C, 0xD48C, 0x1E68, 0xD48D, 0xD48D, 0x22F2, 0xD48E, 0xD48E, 0x1F37,\n    0xD48F, 0xD48F, 0x22F3, 0xD490, 0xD490, 0x4A6E, 0xD491, 0xD491, 0x22EF,\n    0xD492, 0xD492, 0x1F50, 0xD493, 0xD493, 0x1F10, 0xD494, 0xD494, 0x21C8,\n    0xD495, 0xD495, 0x4A6F, 0xD496, 0xD496, 0x22F1, 0xD497, 0xD49B, 0x4A70,\n    0xD49C, 0xD49C, 0x22F0, 0xD49D, 0xD49E, 0x4A75, 0xD49F, 0xD49F, 0x22EE,\n    0xD4A0, 0xD4A0, 0x4A77, 0xD4A1, 0xD4FE, 0x10E4, 0xD540, 0xD542, 0x4A78,\n    0xD543, 0xD543, 0x22ED, 0xD544, 0xD544, 0x229E, 0xD545, 0xD545, 0x22EC,\n    0xD546, 0xD546, 0x1FE2, 0xD547, 0xD549, 0x4A7B, 0xD54A, 0xD54A, 0x20FE,\n    0xD54B, 0xD54D, 0x4A7E, 0xD54E, 0xD54F, 0x22F9, 0xD550, 0xD550, 0x4A81,\n    0xD551, 0xD551, 0x1EAF, 0xD552, 0xD553, 0x4A82, 0xD554, 0xD554, 0x2236,\n    0xD555, 0xD555, 0x4A84, 0xD556, 0xD556, 0x22F7, 0xD557, 0xD559, 0x4A85,\n    0xD55A, 0xD55A, 0x223D, 0xD55B, 0xD55B, 0x4A88, 0xD55C, 0xD55C, 0x1E82,\n    0xD55D, 0xD55D, 0x1FB6, 0xD55E, 0xD55E, 0x4A89, 0xD55F, 0xD55F, 0x21A4,\n    0xD560, 0xD560, 0x21AA, 0xD561, 0xD561, 0x22F8, 0xD562, 0xD562, 0x2151,\n    0xD563, 0xD563, 0x4A8A, 0xD564, 0xD564, 0x1F60, 0xD565, 0xD567, 0x4A8B,\n    0xD568, 0xD568, 0x2147, 0xD569, 0xD56B, 0x4A8E, 0xD56C, 0xD56C, 0x2145,\n    0xD56D, 0xD56D, 0x4A91, 0xD56E, 0xD56E, 0x1FDC, 0xD56F, 0xD571, 0x4A92,\n    0xD572, 0xD572, 0x2301, 0xD573, 0xD574, 0x4A95, 0xD575, 0xD575, 0x1EF5,\n    0xD576, 0xD577, 0x4A97, 0xD578, 0xD578, 0x2218, 0xD579, 0xD57A, 0x4A99,\n    0xD57B, 0xD57B, 0x1EC6, 0xD57C, 0xD57D, 0x4A9B, 0xD57E, 0xD57E, 0x2300,\n    0xD580, 0xD580, 0x4A9D, 0xD581, 0xD581, 0x22B4, 0xD582, 0xD583, 0x4A9E,\n    0xD584, 0xD584, 0x2169, 0xD585, 0xD585, 0x4AA0, 0xD586, 0xD586, 0x22FD,\n    0xD587, 0xD587, 0x4AA1, 0xD588, 0xD588, 0x20EA, 0xD589, 0xD589, 0x4AA2,\n    0xD58A, 0xD58A, 0x22F4, 0xD58B, 0xD58B, 0x4AA3, 0xD58C, 0xD58C, 0x22FB,\n    0xD58D, 0xD58D, 0x4AA4, 0xD58E, 0xD58E, 0x22FC, 0xD58F, 0xD58F, 0x2027,\n    0xD590, 0xD592, 0x4AA5, 0xD593, 0xD593, 0x2060, 0xD594, 0xD594, 0x22FF,\n    0xD595, 0xD597, 0x4AA8, 0xD598, 0xD598, 0x22FE, 0xD599, 0xD599, 0x1EC7,\n    0xD59A, 0xD59A, 0x4AAB, 0xD59B, 0xD59B, 0x230C, 0xD59C, 0xD59E, 0x4AAC,\n    0xD59F, 0xD59F, 0x22F5, 0xD5A0, 0xD5A0, 0x4AAF, 0xD5A1, 0xD5FE, 0x1142,\n    0xD640, 0xD640, 0x2306, 0xD641, 0xD641, 0x4AB0, 0xD642, 0xD642, 0x230A,\n    0xD643, 0xD643, 0x21D3, 0xD644, 0xD646, 0x4AB1, 0xD647, 0xD647, 0x2303,\n    0xD648, 0xD648, 0x4AB4, 0xD649, 0xD649, 0x2307, 0xD64A, 0xD64A, 0x230B,\n    0xD64B, 0xD64C, 0x4AB5, 0xD64D, 0xD64D, 0x1F5F, 0xD64E, 0xD64E, 0x4AB7,\n    0xD64F, 0xD64F, 0x2309, 0xD650, 0xD651, 0x4AB8, 0xD652, 0xD652, 0x2302,\n    0xD653, 0xD653, 0x1F04, 0xD654, 0xD654, 0x229D, 0xD655, 0xD655, 0x4ABA,\n    0xD656, 0xD656, 0x21FB, 0xD657, 0xD657, 0x4ABB, 0xD658, 0xD658, 0x2308,\n    0xD659, 0xD659, 0x4ABC, 0xD65A, 0xD65A, 0x20AC, 0xD65B, 0xD65B, 0x4ABD,\n    0xD65C, 0xD65C, 0x208E, 0xD65D, 0xD65D, 0x2305, 0xD65E, 0xD65E, 0x2197,\n    0xD65F, 0xD65F, 0x4ABE, 0xD660, 0xD660, 0x2171, 0xD661, 0xD661, 0x2298,\n    0xD662, 0xD664, 0x4ABF, 0xD665, 0xD665, 0x1F57, 0xD666, 0xD668, 0x4AC2,\n    0xD669, 0xD669, 0x2082, 0xD66A, 0xD66A, 0x4AC5, 0xD66B, 0xD66B, 0x2311,\n    0xD66C, 0xD66E, 0x4AC6, 0xD66F, 0xD66F, 0x2304, 0xD670, 0xD670, 0x4AC9,\n    0xD671, 0xD671, 0x230F, 0xD672, 0xD672, 0x1E35, 0xD673, 0xD673, 0x4ACA,\n    0xD674, 0xD674, 0x20D1, 0xD675, 0xD675, 0x2310, 0xD676, 0xD676, 0x1FA3,\n    0xD677, 0xD677, 0x4ACB, 0xD678, 0xD678, 0x21D6, 0xD679, 0xD67B, 0x4ACC,\n    0xD67C, 0xD67C, 0x2206, 0xD67D, 0xD67E, 0x4ACF, 0xD680, 0xD682, 0x4AD1,\n    0xD683, 0xD683, 0x230D, 0xD684, 0xD685, 0x4AD4, 0xD686, 0xD686, 0x2312,\n    0xD687, 0xD687, 0x208D, 0xD688, 0xD688, 0x2313, 0xD689, 0xD68D, 0x4AD6,\n    0xD68E, 0xD68E, 0x22E3, 0xD68F, 0xD693, 0x4ADB, 0xD694, 0xD694, 0x1FBA,\n    0xD695, 0xD698, 0x4AE0, 0xD699, 0xD699, 0x2078, 0xD69A, 0xD6A0, 0x4AE4,\n    0xD6A1, 0xD6FE, 0x11A0, 0xD740, 0xD742, 0x4AEB, 0xD743, 0xD743, 0x2288,\n    0xD744, 0xD747, 0x4AEE, 0xD748, 0xD748, 0x2316, 0xD749, 0xD749, 0x1F6B,\n    0xD74A, 0xD74F, 0x4AF2, 0xD750, 0xD750, 0x2314, 0xD751, 0xD751, 0x4AF8,\n    0xD752, 0xD752, 0x2130, 0xD753, 0xD753, 0x2315, 0xD754, 0xD754, 0x2168,\n    0xD755, 0xD755, 0x4AF9, 0xD756, 0xD756, 0x20C4, 0xD757, 0xD763, 0x4AFA,\n    0xD764, 0xD764, 0x2318, 0xD765, 0xD766, 0x4B07, 0xD767, 0xD767, 0x2219,\n    0xD768, 0xD768, 0x2217, 0xD769, 0xD76B, 0x4B09, 0xD76C, 0xD76C, 0x20D5,\n    0xD76D, 0xD76E, 0x4B0C, 0xD76F, 0xD76F, 0x1F4A, 0xD770, 0xD774, 0x4B0E,\n    0xD775, 0xD775, 0x2240, 0xD776, 0xD777, 0x4B13, 0xD778, 0xD778, 0x1ED3,\n    0xD779, 0xD77E, 0x4B15, 0xD780, 0xD782, 0x4B1B, 0xD783, 0xD783, 0x1E49,\n    0xD784, 0xD786, 0x4B1E, 0xD787, 0xD787, 0x261B, 0xD788, 0xD78A, 0x4B21,\n    0xD78B, 0xD78B, 0x1E6D, 0xD78C, 0xD78C, 0x20F8, 0xD78D, 0xD78D, 0x4B24,\n    0xD78E, 0xD78E, 0x1FFB, 0xD78F, 0xD78F, 0x2319, 0xD790, 0xD794, 0x4B25,\n    0xD795, 0xD795, 0x230E, 0xD796, 0xD796, 0x4B2A, 0xD797, 0xD797, 0x2317,\n    0xD798, 0xD7A0, 0x4B2B, 0xD7A1, 0xD7F9, 0x11FE, 0xD840, 0xD84C, 0x4B34,\n    0xD84D, 0xD84D, 0x20C8, 0xD84E, 0xD852, 0x4B41, 0xD853, 0xD853, 0x1EFD,\n    0xD854, 0xD87E, 0x4B46, 0xD880, 0xD88F, 0x4B71, 0xD890, 0xD890, 0x1E3B,\n    0xD891, 0xD891, 0x227F, 0xD892, 0xD892, 0x4B81, 0xD893, 0xD893, 0x1F0C,\n    0xD894, 0xD894, 0x1E59, 0xD895, 0xD895, 0x1F24, 0xD896, 0xD899, 0x4B82,\n    0xD89A, 0xD89A, 0x20BA, 0xD89B, 0xD89B, 0x1F65, 0xD89C, 0xD89C, 0x1EF0,\n    0xD89D, 0xD89D, 0x2164, 0xD89E, 0xD89E, 0x1F30, 0xD89F, 0xD89F, 0x2261,\n    0xD8A0, 0xD8A0, 0x4B86, 0xD8A1, 0xD8FE, 0x1257, 0xD940, 0xD940, 0x4B87,\n    0xD941, 0xD941, 0x22A2, 0xD942, 0xD942, 0x24AB, 0xD943, 0xD943, 0x4B88,\n    0xD944, 0xD944, 0x24AF, 0xD945, 0xD945, 0x1EE8, 0xD946, 0xD946, 0x1F39,\n    0xD947, 0xD947, 0x4B89, 0xD948, 0xD948, 0x1E48, 0xD949, 0xD949, 0x2070,\n    0xD94A, 0xD94A, 0x1EA8, 0xD94B, 0xD94B, 0x4B8A, 0xD94C, 0xD94C, 0x24AC,\n    0xD94D, 0xD94D, 0x1EF7, 0xD94E, 0xD94E, 0x2176, 0xD94F, 0xD94F, 0x24AD,\n    0xD950, 0xD950, 0x4B8B, 0xD951, 0xD951, 0x207B, 0xD952, 0xD952, 0x1F45,\n    0xD953, 0xD953, 0x24AA, 0xD954, 0xD954, 0x204B, 0xD955, 0xD955, 0x202F,\n    0xD956, 0xD956, 0x1F5A, 0xD957, 0xD957, 0x24B0, 0xD958, 0xD958, 0x4B8C,\n    0xD959, 0xD959, 0x22B7, 0xD95A, 0xD95A, 0x1F7F, 0xD95B, 0xD95B, 0x4B8D,\n    0xD95C, 0xD95C, 0x2265, 0xD95D, 0xD962, 0x4B8E, 0xD963, 0xD963, 0x24B2,\n    0xD964, 0xD964, 0x211B, 0xD965, 0xD965, 0x1E51, 0xD966, 0xD966, 0x4B94,\n    0xD967, 0xD967, 0x24B4, 0xD968, 0xD96B, 0x4B95, 0xD96C, 0xD96C, 0x24B3,\n    0xD96D, 0xD96D, 0x4B99, 0xD96E, 0xD96E, 0x1E9F, 0xD96F, 0xD96F, 0x4B9A,\n    0xD970, 0xD970, 0x2118, 0xD971, 0xD971, 0x4B9B, 0xD972, 0xD972, 0x20B4,\n    0xD973, 0xD973, 0x23AF, 0xD974, 0xD974, 0x21BB, 0xD975, 0xD975, 0x2072,\n    0xD976, 0xD976, 0x1F95, 0xD977, 0xD977, 0x4B9C, 0xD978, 0xD978, 0x1F0A,\n    0xD979, 0xD979, 0x24B6, 0xD97A, 0xD97B, 0x4B9D, 0xD97C, 0xD97C, 0x2291,\n    0xD97D, 0xD97D, 0x24B5, 0xD97E, 0xD97E, 0x2278, 0xD980, 0xD980, 0x1ED4,\n    0xD981, 0xD986, 0x4B9F, 0xD987, 0xD987, 0x1FF3, 0xD988, 0xD98C, 0x4BA5,\n    0xD98D, 0xD98D, 0x22A9, 0xD98E, 0xD98E, 0x24B7, 0xD98F, 0xD98F, 0x1F28,\n    0xD990, 0xD990, 0x2109, 0xD991, 0xD991, 0x22C7, 0xD992, 0xD996, 0x4BAA,\n    0xD997, 0xD997, 0x24AE, 0xD998, 0xD998, 0x22B1, 0xD999, 0xD99A, 0x4BAF,\n    0xD99B, 0xD99B, 0x2266, 0xD99C, 0xD99C, 0x4BB1, 0xD99D, 0xD99D, 0x225B,\n    0xD99E, 0xD99E, 0x22C4, 0xD99F, 0xD99F, 0x4BB2, 0xD9A0, 0xD9A0, 0x2115,\n    0xD9A1, 0xD9FE, 0x12B5, 0xDA40, 0xDA40, 0x4BB3, 0xDA41, 0xDA41, 0x222A,\n    0xDA42, 0xDA42, 0x24B1, 0xDA43, 0xDA47, 0x4BB4, 0xDA48, 0xDA48, 0x213D,\n    0xDA49, 0xDA4C, 0x4BB9, 0xDA4D, 0xDA4D, 0x1F15, 0xDA4E, 0xDA4E, 0x225C,\n    0xDA4F, 0xDA72, 0x4BBD, 0xDA73, 0xDA73, 0x1F14, 0xDA74, 0xDA76, 0x4BE1,\n    0xDA77, 0xDA77, 0x227A, 0xDA78, 0xDA7E, 0x4BE4, 0xDA80, 0xDA84, 0x4BEB,\n    0xDA85, 0xDA85, 0x20EE, 0xDA86, 0xDA8D, 0x4BF0, 0xDA8E, 0xDA8E, 0x25F8,\n    0xDA8F, 0xDAA0, 0x4BF8, 0xDAA1, 0xDAFE, 0x1313, 0xDB40, 0xDB5F, 0x4C0A,\n    0xDB60, 0xDB60, 0x1F94, 0xDB61, 0xDB77, 0x4C2A, 0xDB78, 0xDB78, 0x2230,\n    0xDB79, 0xDB7E, 0x4C41, 0xDB80, 0xDB83, 0x4C47, 0xDB84, 0xDB84, 0x25FD,\n    0xDB85, 0xDB8A, 0x4C4B, 0xDB8B, 0xDB8B, 0x2600, 0xDB8C, 0xDB97, 0x4C51,\n    0xDB98, 0xDB98, 0x2606, 0xDB99, 0xDBA0, 0x4C5D, 0xDBA1, 0xDBFE, 0x1371,\n    0xDC40, 0xDC44, 0x4C65, 0xDC45, 0xDC45, 0x25FF, 0xDC46, 0xDC4E, 0x4C6A,\n    0xDC4F, 0xDC4F, 0x25FC, 0xDC50, 0xDC50, 0x1E8C, 0xDC51, 0xDC51, 0x2602,\n    0xDC52, 0xDC52, 0x4C73, 0xDC53, 0xDC53, 0x224D, 0xDC54, 0xDC54, 0x4C74,\n    0xDC55, 0xDC55, 0x2604, 0xDC56, 0xDC56, 0x25FE, 0xDC57, 0xDC57, 0x2603,\n    0xDC58, 0xDC5C, 0x4C75, 0xDC5D, 0xDC5D, 0x2601, 0xDC5E, 0xDC61, 0x4C7A,\n    0xDC62, 0xDC62, 0x2605, 0xDC63, 0xDC65, 0x4C7E, 0xDC66, 0xDC66, 0x1EA3,\n    0xDC67, 0xDC67, 0x2608, 0xDC68, 0xDC6A, 0x4C81, 0xDC6B, 0xDC6B, 0x2607,\n    0xDC6C, 0xDC7B, 0x4C84, 0xDC7C, 0xDC7C, 0x20F0, 0xDC7D, 0xDC7E, 0x4C94,\n    0xDC80, 0xDC86, 0x4C96, 0xDC87, 0xDC87, 0x1E7B, 0xDC88, 0xDC88, 0x2267,\n    0xDC89, 0xDC89, 0x1F36, 0xDC8A, 0xDC8A, 0x1FD6, 0xDC8B, 0xDC8D, 0x4C9D,\n    0xDC8E, 0xDC8E, 0x21E0, 0xDC8F, 0xDC8F, 0x4CA0, 0xDC90, 0xDC90, 0x248C,\n    0xDC91, 0xDC96, 0x4CA1, 0xDC97, 0xDC97, 0x248D, 0xDC98, 0xDC9A, 0x4CA7,\n    0xDC9B, 0xDC9B, 0x2102, 0xDC9C, 0xDC9F, 0x4CAA, 0xDCA0, 0xDCA0, 0x2494,\n    0xDCA1, 0xDCFE, 0x13CF, 0xDD40, 0xDD45, 0x4CAE, 0xDD46, 0xDD46, 0x2493,\n    0xDD47, 0xDD4C, 0x4CB4, 0xDD4D, 0xDD4D, 0x248E, 0xDD4E, 0xDD52, 0x4CBA,\n    0xDD53, 0xDD53, 0x2299, 0xDD54, 0xDD54, 0x2491, 0xDD55, 0xDD55, 0x2496,\n    0xDD56, 0xDD56, 0x248F, 0xDD57, 0xDD57, 0x2492, 0xDD58, 0xDD58, 0x4CBF,\n    0xDD59, 0xDD59, 0x2497, 0xDD5A, 0xDD5D, 0x4CC0, 0xDD5E, 0xDD5E, 0x1FB1,\n    0xDD5F, 0xDD5F, 0x4CC4, 0xDD60, 0xDD60, 0x249A, 0xDD61, 0xDD61, 0x4CC5,\n    0xDD62, 0xDD62, 0x2499, 0xDD63, 0xDD63, 0x4CC6, 0xDD64, 0xDD64, 0x2258,\n    0xDD65, 0xDD65, 0x2498, 0xDD66, 0xDD6C, 0x4CC7, 0xDD6D, 0xDD6D, 0x249B,\n    0xDD6E, 0xDD6E, 0x4CCE, 0xDD6F, 0xDD6F, 0x1F09, 0xDD70, 0xDD70, 0x20E6,\n    0xDD71, 0xDD75, 0x4CCF, 0xDD76, 0xDD76, 0x2026, 0xDD77, 0xDD77, 0x249F,\n    0xDD78, 0xDD78, 0x1F59, 0xDD79, 0xDD7A, 0x249D, 0xDD7B, 0xDD7E, 0x4CD4,\n    0xDD80, 0xDD80, 0x4CD8, 0xDD81, 0xDD81, 0x1F3B, 0xDD82, 0xDD82, 0x249C,\n    0xDD83, 0xDD84, 0x4CD9, 0xDD85, 0xDD85, 0x1E3A, 0xDD86, 0xDD86, 0x205B,\n    0xDD87, 0xDD8A, 0x4CDB, 0xDD8B, 0xDD8B, 0x1F70, 0xDD8C, 0xDD8E, 0x4CDF,\n    0xDD8F, 0xDD8F, 0x24A0, 0xDD90, 0xDD93, 0x4CE2, 0xDD94, 0xDD94, 0x213B,\n    0xDD95, 0xDD96, 0x4CE6, 0xDD97, 0xDD97, 0x1F07, 0xDD98, 0xDD99, 0x4CE8,\n    0xDD9A, 0xDD9A, 0x2270, 0xDD9B, 0xDD9B, 0x2237, 0xDD9C, 0xDD9D, 0x4CEA,\n    0xDD9E, 0xDD9E, 0x24D2, 0xDD9F, 0xDD9F, 0x4CEC, 0xDDA0, 0xDDA0, 0x21B3,\n    0xDDA1, 0xDDFE, 0x142D, 0xDE40, 0xDE40, 0x2245, 0xDE41, 0xDE41, 0x24A1,\n    0xDE42, 0xDE43, 0x4CED, 0xDE44, 0xDE44, 0x22A8, 0xDE45, 0xDE47, 0x4CEF,\n    0xDE48, 0xDE48, 0x227C, 0xDE49, 0xDE49, 0x1FB0, 0xDE4A, 0xDE4E, 0x4CF2,\n    0xDE4F, 0xDE4F, 0x24A2, 0xDE50, 0xDE59, 0x4CF7, 0xDE5A, 0xDE5A, 0x1F46,\n    0xDE5B, 0xDE5B, 0x4D01, 0xDE5C, 0xDE5C, 0x2380, 0xDE5D, 0xDE5D, 0x2495,\n    0xDE5E, 0xDE5E, 0x4D02, 0xDE5F, 0xDE5F, 0x2490, 0xDE60, 0xDE6A, 0x4D03,\n    0xDE6B, 0xDE6B, 0x1E30, 0xDE6C, 0xDE6E, 0x4D0E, 0xDE6F, 0xDE6F, 0x1E9D,\n    0xDE70, 0xDE70, 0x1E4B, 0xDE71, 0xDE71, 0x1E4A, 0xDE72, 0xDE72, 0x20AA,\n    0xDE73, 0xDE7E, 0x4D11, 0xDE80, 0xDE91, 0x4D1D, 0xDE92, 0xDE92, 0x267B,\n    0xDE93, 0xDE9E, 0x4D2F, 0xDE9F, 0xDE9F, 0x23F2, 0xDEA0, 0xDEA0, 0x4D3B,\n    0xDEA1, 0xDEFE, 0x148B, 0xDF40, 0xDF40, 0x227E, 0xDF41, 0xDF41, 0x4D3C,\n    0xDF42, 0xDF42, 0x2019, 0xDF43, 0xDF4C, 0x4D3D, 0xDF4D, 0xDF4D, 0x1FBB,\n    0xDF4E, 0xDF5B, 0x4D47, 0xDF5C, 0xDF5C, 0x2253, 0xDF5D, 0xDF5D, 0x4D55,\n    0xDF5E, 0xDF5E, 0x1F3E, 0xDF5F, 0xDF5F, 0x1EA6, 0xDF60, 0xDF60, 0x218E,\n    0xDF61, 0xDF63, 0x4D56, 0xDF64, 0xDF64, 0x21EC, 0xDF65, 0xDF65, 0x4D59,\n    0xDF66, 0xDF66, 0x1EBE, 0xDF67, 0xDF67, 0x4D5A, 0xDF68, 0xDF68, 0x224A,\n    0xDF69, 0xDF6C, 0x4D5B, 0xDF6D, 0xDF6D, 0x2133, 0xDF6E, 0xDF73, 0x4D5F,\n    0xDF74, 0xDF74, 0x1E84, 0xDF75, 0xDF76, 0x4D65, 0xDF77, 0xDF77, 0x20CF,\n    0xDF78, 0xDF78, 0x21E2, 0xDF79, 0xDF79, 0x4D67, 0xDF7A, 0xDF7A, 0x220F,\n    0xDF7B, 0xDF7B, 0x4D68, 0xDF7C, 0xDF7C, 0x2029, 0xDF7D, 0xDF7D, 0x4D69,\n    0xDF7E, 0xDF7E, 0x2073, 0xDF80, 0xDF80, 0x1F55, 0xDF81, 0xDF82, 0x4D6A,\n    0xDF83, 0xDF83, 0x23F1, 0xDF84, 0xDF84, 0x4D6C, 0xDF85, 0xDF85, 0x1E46,\n    0xDF86, 0xDF88, 0x4D6D, 0xDF89, 0xDF89, 0x2063, 0xDF8A, 0xDF8A, 0x23F3,\n    0xDF8B, 0xDFA0, 0x4D70, 0xDFA1, 0xDFFE, 0x14E9, 0xE040, 0xE04F, 0x4D86,\n    0xE050, 0xE050, 0x231E, 0xE051, 0xE05C, 0x4D96, 0xE05D, 0xE05D, 0x2233,\n    0xE05E, 0xE068, 0x4DA2, 0xE069, 0xE069, 0x2320, 0xE06A, 0xE06B, 0x4DAD,\n    0xE06C, 0xE06C, 0x21C7, 0xE06D, 0xE074, 0x4DAF, 0xE075, 0xE075, 0x22BC,\n    0xE076, 0xE076, 0x4DB7, 0xE077, 0xE077, 0x231C, 0xE078, 0xE078, 0x4DB8,\n    0xE079, 0xE079, 0x2251, 0xE07A, 0xE07E, 0x4DB9, 0xE080, 0xE086, 0x4DBE,\n    0xE087, 0xE087, 0x1EBB, 0xE088, 0xE08C, 0x4DC5, 0xE08D, 0xE08D, 0x2287,\n    0xE08E, 0xE08E, 0x4DCA, 0xE08F, 0xE08F, 0x202D, 0xE090, 0xE090, 0x1EAB,\n    0xE091, 0xE091, 0x4DCB, 0xE092, 0xE092, 0x231D, 0xE093, 0xE093, 0x4DCC,\n    0xE094, 0xE094, 0x231F, 0xE095, 0xE096, 0x4DCD, 0xE097, 0xE097, 0x231B,\n    0xE098, 0xE0A0, 0x4DCF, 0xE0A1, 0xE0FE, 0x1547, 0xE140, 0xE141, 0x4DD8,\n    0xE142, 0xE142, 0x2321, 0xE143, 0xE163, 0x4DDA, 0xE164, 0xE164, 0x2255,\n    0xE165, 0xE167, 0x4DFB, 0xE168, 0xE168, 0x1E8F, 0xE169, 0xE173, 0x4DFE,\n    0xE174, 0xE174, 0x220C, 0xE175, 0xE175, 0x1FA4, 0xE176, 0xE17E, 0x4E09,\n    0xE180, 0xE183, 0x4E12, 0xE184, 0xE184, 0x209B, 0xE185, 0xE185, 0x21D8,\n    0xE186, 0xE186, 0x4E16, 0xE187, 0xE187, 0x25FA, 0xE188, 0xE188, 0x4E17,\n    0xE189, 0xE189, 0x25F9, 0xE18A, 0xE18B, 0x4E18, 0xE18C, 0xE18C, 0x2134,\n    0xE18D, 0xE18D, 0x4E1A, 0xE18E, 0xE190, 0x24F3, 0xE191, 0xE191, 0x24F8,\n    0xE192, 0xE192, 0x4E1B, 0xE193, 0xE193, 0x24F7, 0xE194, 0xE194, 0x1EC8,\n    0xE195, 0xE195, 0x24F6, 0xE196, 0xE197, 0x4E1C, 0xE198, 0xE198, 0x2280,\n    0xE199, 0xE19D, 0x4E1E, 0xE19E, 0xE19E, 0x1EC5, 0xE19F, 0xE19F, 0x24FB,\n    0xE1A0, 0xE1A0, 0x4E23, 0xE1A1, 0xE1FE, 0x15A5, 0xE240, 0xE240, 0x4E24,\n    0xE241, 0xE241, 0x24FA, 0xE242, 0xE242, 0x4E25, 0xE243, 0xE243, 0x1EED,\n    0xE244, 0xE24E, 0x4E26, 0xE24F, 0xE24F, 0x24FD, 0xE250, 0xE250, 0x4E31,\n    0xE251, 0xE251, 0x24F9, 0xE252, 0xE252, 0x4E32, 0xE253, 0xE253, 0x24FE,\n    0xE254, 0xE254, 0x20CD, 0xE255, 0xE259, 0x4E33, 0xE25A, 0xE25A, 0x2508,\n    0xE25B, 0xE25B, 0x2504, 0xE25C, 0xE25D, 0x4E38, 0xE25E, 0xE25E, 0x2506,\n    0xE25F, 0xE261, 0x4E3A, 0xE262, 0xE262, 0x24FF, 0xE263, 0xE263, 0x2090,\n    0xE264, 0xE266, 0x4E3D, 0xE267, 0xE267, 0x1EDD, 0xE268, 0xE268, 0x1F25,\n    0xE269, 0xE269, 0x4E40, 0xE26A, 0xE26A, 0x2503, 0xE26B, 0xE26B, 0x2502,\n    0xE26C, 0xE26D, 0x4E41, 0xE26E, 0xE26E, 0x1E7A, 0xE26F, 0xE26F, 0x20A6,\n    0xE270, 0xE277, 0x4E43, 0xE278, 0xE278, 0x1FD5, 0xE279, 0xE27C, 0x4E4B,\n    0xE27D, 0xE27D, 0x1F11, 0xE27E, 0xE27E, 0x4E4F, 0xE280, 0xE280, 0x2507,\n    0xE281, 0xE281, 0x2500, 0xE282, 0xE282, 0x2505, 0xE283, 0xE288, 0x4E50,\n    0xE289, 0xE289, 0x2519, 0xE28A, 0xE28A, 0x4E56, 0xE28B, 0xE28B, 0x2515,\n    0xE28C, 0xE28D, 0x4E57, 0xE28E, 0xE28E, 0x250C, 0xE28F, 0xE28F, 0x2031,\n    0xE290, 0xE291, 0x4E59, 0xE292, 0xE292, 0x250B, 0xE293, 0xE293, 0x250F,\n    0xE294, 0xE294, 0x251A, 0xE295, 0xE295, 0x2509, 0xE296, 0xE297, 0x4E5B,\n    0xE298, 0xE298, 0x250E, 0xE299, 0xE299, 0x2234, 0xE29A, 0xE29A, 0x2513,\n    0xE29B, 0xE29B, 0x1F80, 0xE29C, 0xE29F, 0x4E5D, 0xE2A0, 0xE2A0, 0x2501,\n    0xE2A1, 0xE2FE, 0x1603, 0xE340, 0xE341, 0x4E61, 0xE342, 0xE342, 0x2517,\n    0xE343, 0xE343, 0x2516, 0xE344, 0xE346, 0x4E63, 0xE347, 0xE347, 0x2518,\n    0xE348, 0xE34A, 0x4E66, 0xE34B, 0xE34B, 0x1E56, 0xE34C, 0xE34E, 0x4E69,\n    0xE34F, 0xE34F, 0x250D, 0xE350, 0xE350, 0x4E6C, 0xE351, 0xE351, 0x20D3,\n    0xE352, 0xE353, 0x4E6D, 0xE354, 0xE354, 0x207A, 0xE355, 0xE355, 0x20CE,\n    0xE356, 0xE357, 0x4E6F, 0xE358, 0xE358, 0x2510, 0xE359, 0xE35B, 0x4E71,\n    0xE35C, 0xE35C, 0x1E55, 0xE35D, 0xE35F, 0x4E74, 0xE360, 0xE360, 0x250A,\n    0xE361, 0xE365, 0x4E77, 0xE366, 0xE367, 0x2511, 0xE368, 0xE370, 0x4E7C,\n    0xE371, 0xE371, 0x1FAA, 0xE372, 0xE372, 0x4E85, 0xE373, 0xE373, 0x251E,\n    0xE374, 0xE374, 0x1F1F, 0xE375, 0xE377, 0x4E86, 0xE378, 0xE378, 0x252D,\n    0xE379, 0xE379, 0x221D, 0xE37A, 0xE37B, 0x4E89, 0xE37C, 0xE37C, 0x2532,\n    0xE37D, 0xE37D, 0x4E8B, 0xE37E, 0xE37E, 0x217B, 0xE380, 0xE389, 0x4E8C,\n    0xE38A, 0xE38A, 0x21AF, 0xE38B, 0xE38B, 0x4E96, 0xE38C, 0xE38C, 0x252C,\n    0xE38D, 0xE38E, 0x4E97, 0xE38F, 0xE38F, 0x2528, 0xE390, 0xE390, 0x4E99,\n    0xE391, 0xE391, 0x208C, 0xE392, 0xE392, 0x4E9A, 0xE393, 0xE393, 0x252F,\n    0xE394, 0xE394, 0x4E9B, 0xE395, 0xE395, 0x21BC, 0xE396, 0xE398, 0x4E9C,\n    0xE399, 0xE399, 0x251D, 0xE39A, 0xE39B, 0x4E9F, 0xE39C, 0xE39C, 0x2535,\n    0xE39D, 0xE39D, 0x4EA1, 0xE39E, 0xE39E, 0x220D, 0xE39F, 0xE39F, 0x2526,\n    0xE3A0, 0xE3A0, 0x4EA2, 0xE3A1, 0xE3FE, 0x1661, 0xE440, 0xE440, 0x2534,\n    0xE441, 0xE441, 0x252A, 0xE442, 0xE442, 0x251F, 0xE443, 0xE443, 0x2531,\n    0xE444, 0xE444, 0x251C, 0xE445, 0xE447, 0x4EA3, 0xE448, 0xE448, 0x2525,\n    0xE449, 0xE44D, 0x4EA6, 0xE44E, 0xE44E, 0x21CD, 0xE44F, 0xE44F, 0x4EAB,\n    0xE450, 0xE450, 0x21DA, 0xE451, 0xE451, 0x4EAC, 0xE452, 0xE452, 0x2172,\n    0xE453, 0xE453, 0x253E, 0xE454, 0xE457, 0x4EAD, 0xE458, 0xE458, 0x204F,\n    0xE459, 0xE459, 0x4EB1, 0xE45A, 0xE45A, 0x2543, 0xE45B, 0xE45B, 0x4EB2,\n    0xE45C, 0xE45C, 0x21D7, 0xE45D, 0xE45D, 0x4EB3, 0xE45E, 0xE45E, 0x1E3C,\n    0xE45F, 0xE461, 0x4EB4, 0xE462, 0xE462, 0x2529, 0xE463, 0xE464, 0x4EB7,\n    0xE465, 0xE465, 0x2521, 0xE466, 0xE467, 0x4EB9, 0xE468, 0xE468, 0x1EFF,\n    0xE469, 0xE472, 0x4EBB, 0xE473, 0xE473, 0x253F, 0xE474, 0xE474, 0x4EC5,\n    0xE475, 0xE475, 0x2544, 0xE476, 0xE478, 0x4EC6, 0xE479, 0xE479, 0x2523,\n    0xE47A, 0xE47A, 0x1E90, 0xE47B, 0xE47B, 0x253A, 0xE47C, 0xE47C, 0x2545,\n    0xE47D, 0xE47D, 0x4EC9, 0xE47E, 0xE47E, 0x253D, 0xE480, 0xE480, 0x4ECA,\n    0xE481, 0xE481, 0x20C1, 0xE482, 0xE483, 0x4ECB, 0xE484, 0xE484, 0x2103,\n    0xE485, 0xE485, 0x2520, 0xE486, 0xE486, 0x253C, 0xE487, 0xE487, 0x253B,\n    0xE488, 0xE488, 0x2538, 0xE489, 0xE48C, 0x4ECD, 0xE48D, 0xE48D, 0x2540,\n    0xE48E, 0xE48E, 0x4ED1, 0xE48F, 0xE48F, 0x1FCD, 0xE490, 0xE492, 0x4ED2,\n    0xE493, 0xE493, 0x1F18, 0xE494, 0xE497, 0x4ED5, 0xE498, 0xE498, 0x254B,\n    0xE499, 0xE49C, 0x4ED9, 0xE49D, 0xE49D, 0x2547, 0xE49E, 0xE49F, 0x254F,\n    0xE4A0, 0xE4A0, 0x4EDD, 0xE4A1, 0xE4FE, 0x16BF, 0xE540, 0xE545, 0x4EDE,\n    0xE546, 0xE546, 0x22B0, 0xE547, 0xE547, 0x4EE4, 0xE548, 0xE548, 0x2546,\n    0xE549, 0xE54A, 0x4EE5, 0xE54B, 0xE54B, 0x254C, 0xE54C, 0xE54D, 0x4EE7,\n    0xE54E, 0xE54E, 0x1E9A, 0xE54F, 0xE54F, 0x2552, 0xE550, 0xE550, 0x2530,\n    0xE551, 0xE551, 0x2549, 0xE552, 0xE554, 0x4EE9, 0xE555, 0xE555, 0x2551,\n    0xE556, 0xE556, 0x1ECA, 0xE557, 0xE557, 0x4EEC, 0xE558, 0xE558, 0x20D2,\n    0xE559, 0xE55B, 0x4EED, 0xE55C, 0xE55C, 0x1FB8, 0xE55D, 0xE55D, 0x4EF0,\n    0xE55E, 0xE55E, 0x2079, 0xE55F, 0xE560, 0x4EF1, 0xE561, 0xE561, 0x21AB,\n    0xE562, 0xE563, 0x4EF3, 0xE564, 0xE564, 0x254D, 0xE565, 0xE565, 0x1EA5,\n    0xE566, 0xE567, 0x4EF5, 0xE568, 0xE568, 0x204C, 0xE569, 0xE569, 0x2080,\n    0xE56A, 0xE56B, 0x4EF7, 0xE56C, 0xE56C, 0x266D, 0xE56D, 0xE56D, 0x4EF9,\n    0xE56E, 0xE56E, 0x2537, 0xE56F, 0xE574, 0x4EFA, 0xE575, 0xE575, 0x254A,\n    0xE576, 0xE576, 0x21B8, 0xE577, 0xE577, 0x4F00, 0xE578, 0xE578, 0x254E,\n    0xE579, 0xE57A, 0x4F01, 0xE57B, 0xE57B, 0x24FC, 0xE57C, 0xE57C, 0x2554,\n    0xE57D, 0xE57E, 0x4F03, 0xE580, 0xE580, 0x4F05, 0xE581, 0xE581, 0x1F3C,\n    0xE582, 0xE582, 0x4F06, 0xE583, 0xE583, 0x1ED5, 0xE584, 0xE589, 0x4F07,\n    0xE58A, 0xE58A, 0x2556, 0xE58B, 0xE58D, 0x4F0D, 0xE58E, 0xE58E, 0x2268,\n    0xE58F, 0xE590, 0x4F10, 0xE591, 0xE591, 0x1ED6, 0xE592, 0xE599, 0x4F12,\n    0xE59A, 0xE59A, 0x2557, 0xE59B, 0xE59B, 0x2553, 0xE59C, 0xE59E, 0x4F1A,\n    0xE59F, 0xE59F, 0x2548, 0xE5A0, 0xE5A0, 0x4F1D, 0xE5A1, 0xE5FE, 0x171D,\n    0xE640, 0xE640, 0x20DC, 0xE641, 0xE643, 0x4F1E, 0xE644, 0xE644, 0x2559,\n    0xE645, 0xE648, 0x4F21, 0xE649, 0xE649, 0x1F97, 0xE64A, 0xE64A, 0x2555,\n    0xE64B, 0xE64D, 0x4F25, 0xE64E, 0xE64E, 0x227D, 0xE64F, 0xE651, 0x4F28,\n    0xE652, 0xE652, 0x257E, 0xE653, 0xE655, 0x4F2B, 0xE656, 0xE656, 0x207C,\n    0xE657, 0xE657, 0x4F2E, 0xE658, 0xE658, 0x255A, 0xE659, 0xE65A, 0x4F2F,\n    0xE65B, 0xE65B, 0x255E, 0xE65C, 0xE65D, 0x4F31, 0xE65E, 0xE65E, 0x1E34,\n    0xE65F, 0xE668, 0x4F33, 0xE669, 0xE669, 0x215E, 0xE66A, 0xE66A, 0x4F3D,\n    0xE66B, 0xE66B, 0x2560, 0xE66C, 0xE674, 0x4F3E, 0xE675, 0xE675, 0x21A2,\n    0xE676, 0xE676, 0x2354, 0xE677, 0xE678, 0x4F47, 0xE679, 0xE679, 0x2563,\n    0xE67A, 0xE67A, 0x2527, 0xE67B, 0xE67B, 0x4F49, 0xE67C, 0xE67C, 0x252E,\n    0xE67D, 0xE67D, 0x2558, 0xE67E, 0xE67E, 0x4F4A, 0xE680, 0xE680, 0x1F1B,\n    0xE681, 0xE681, 0x4F4B, 0xE682, 0xE682, 0x2283, 0xE683, 0xE683, 0x4F4C,\n    0xE684, 0xE684, 0x2564, 0xE685, 0xE686, 0x4F4D, 0xE687, 0xE687, 0x20A0,\n    0xE688, 0xE688, 0x4F4F, 0xE689, 0xE689, 0x2565, 0xE68A, 0xE68B, 0x4F50,\n    0xE68C, 0xE68C, 0x2561, 0xE68D, 0xE692, 0x4F52, 0xE693, 0xE693, 0x2562,\n    0xE694, 0xE696, 0x4F58, 0xE697, 0xE697, 0x256C, 0xE698, 0xE69A, 0x4F5B,\n    0xE69B, 0xE69B, 0x256D, 0xE69C, 0xE69C, 0x2020, 0xE69D, 0xE69E, 0x4F5E,\n    0xE69F, 0xE69F, 0x255F, 0xE6A0, 0xE6A0, 0x256A, 0xE6A1, 0xE6FE, 0x177B,\n    0xE740, 0xE742, 0x4F60, 0xE743, 0xE743, 0x256E, 0xE744, 0xE747, 0x4F63,\n    0xE748, 0xE748, 0x2539, 0xE749, 0xE749, 0x255C, 0xE74A, 0xE74C, 0x4F67,\n    0xE74D, 0xE74E, 0x2568, 0xE74F, 0xE74F, 0x256B, 0xE750, 0xE750, 0x1E6F,\n    0xE751, 0xE751, 0x4F6A, 0xE752, 0xE752, 0x1FC4, 0xE753, 0xE753, 0x2567,\n    0xE754, 0xE754, 0x4F6B, 0xE755, 0xE755, 0x255B, 0xE756, 0xE758, 0x4F6C,\n    0xE759, 0xE759, 0x261D, 0xE75A, 0xE765, 0x4F6F, 0xE766, 0xE766, 0x252B,\n    0xE767, 0xE767, 0x4F7B, 0xE768, 0xE768, 0x2571, 0xE769, 0xE769, 0x4F7C,\n    0xE76A, 0xE76A, 0x2577, 0xE76B, 0xE773, 0x4F7D, 0xE774, 0xE774, 0x2522,\n    0xE775, 0xE77B, 0x4F86, 0xE77C, 0xE77C, 0x2533, 0xE77D, 0xE77E, 0x4F8D,\n    0xE780, 0xE781, 0x4F8F, 0xE782, 0xE782, 0x202A, 0xE783, 0xE783, 0x4F91,\n    0xE784, 0xE784, 0x2536, 0xE785, 0xE785, 0x2573, 0xE786, 0xE786, 0x256F,\n    0xE787, 0xE789, 0x4F92, 0xE78A, 0xE78A, 0x2293, 0xE78B, 0xE78B, 0x2578,\n    0xE78C, 0xE78E, 0x4F95, 0xE78F, 0xE78F, 0x2570, 0xE790, 0xE791, 0x4F98,\n    0xE792, 0xE792, 0x2575, 0xE793, 0xE797, 0x4F9A, 0xE798, 0xE799, 0x2541,\n    0xE79A, 0xE79A, 0x255D, 0xE79B, 0xE79F, 0x4F9F, 0xE7A0, 0xE7A0, 0x201A,\n    0xE7A1, 0xE7FE, 0x17D9, 0xE840, 0xE842, 0x4FA4, 0xE843, 0xE843, 0x257A,\n    0xE844, 0xE844, 0x2006, 0xE845, 0xE845, 0x4FA7, 0xE846, 0xE846, 0x2177,\n    0xE847, 0xE848, 0x4FA8, 0xE849, 0xE849, 0x251B, 0xE84A, 0xE84A, 0x4FAA,\n    0xE84B, 0xE84B, 0x2524, 0xE84C, 0xE84E, 0x4FAB, 0xE84F, 0xE84F, 0x257B,\n    0xE850, 0xE853, 0x4FAE, 0xE854, 0xE854, 0x22A3, 0xE855, 0xE859, 0x4FB2,\n    0xE85A, 0xE85A, 0x2579, 0xE85B, 0xE85B, 0x4FB7, 0xE85C, 0xE85C, 0x2566,\n    0xE85D, 0xE861, 0x4FB8, 0xE862, 0xE862, 0x1F93, 0xE863, 0xE863, 0x4FBD,\n    0xE864, 0xE864, 0x257C, 0xE865, 0xE86F, 0x4FBE, 0xE870, 0xE870, 0x2514,\n    0xE871, 0xE872, 0x4FC9, 0xE873, 0xE873, 0x257D, 0xE874, 0xE874, 0x4FCB,\n    0xE875, 0xE875, 0x2572, 0xE876, 0xE87B, 0x4FCC, 0xE87C, 0xE87C, 0x2574,\n    0xE87D, 0xE87E, 0x4FD2, 0xE880, 0xE880, 0x224E, 0xE881, 0xE881, 0x4FD4,\n    0xE882, 0xE882, 0x21C6, 0xE883, 0xE886, 0x4FD5, 0xE887, 0xE887, 0x209F,\n    0xE888, 0xE888, 0x4FD9, 0xE889, 0xE889, 0x2576, 0xE88A, 0xE88B, 0x4FDA,\n    0xE88C, 0xE88C, 0x2064, 0xE88D, 0xE88D, 0x22BF, 0xE88E, 0xE88E, 0x261C,\n    0xE88F, 0xE88F, 0x225E, 0xE890, 0xE8A0, 0x4FDC, 0xE8A1, 0xE8FE, 0x1837,\n    0xE940, 0xE94B, 0x4FED, 0xE94C, 0xE94C, 0x1E75, 0xE94D, 0xE953, 0x4FF9,\n    0xE954, 0xE954, 0x207D, 0xE955, 0xE955, 0x5000, 0xE956, 0xE956, 0x23BF,\n    0xE957, 0xE957, 0x2113, 0xE958, 0xE959, 0x5001, 0xE95A, 0xE95A, 0x23C0,\n    0xE95B, 0xE95C, 0x5003, 0xE95D, 0xE95D, 0x1E45, 0xE95E, 0xE95E, 0x5005,\n    0xE95F, 0xE95F, 0x1FD8, 0xE960, 0xE960, 0x23C4, 0xE961, 0xE961, 0x5006,\n    0xE962, 0xE962, 0x23C2, 0xE963, 0xE963, 0x2104, 0xE964, 0xE964, 0x5007,\n    0xE965, 0xE965, 0x21BD, 0xE966, 0xE966, 0x5008, 0xE967, 0xE967, 0x1F87,\n    0xE968, 0xE968, 0x23C3, 0xE969, 0xE96B, 0x5009, 0xE96C, 0xE96C, 0x2269,\n    0xE96D, 0xE974, 0x500C, 0xE975, 0xE975, 0x1F43, 0xE976, 0xE976, 0x5014,\n    0xE977, 0xE977, 0x1F1E, 0xE978, 0xE978, 0x2679, 0xE979, 0xE979, 0x1EEB,\n    0xE97A, 0xE97B, 0x5015, 0xE97C, 0xE97C, 0x1F35, 0xE97D, 0xE97D, 0x208A,\n    0xE97E, 0xE97E, 0x5017, 0xE980, 0xE980, 0x23C7, 0xE981, 0xE981, 0x23C9,\n    0xE982, 0xE982, 0x23C6, 0xE983, 0xE986, 0x5018, 0xE987, 0xE987, 0x224F,\n    0xE988, 0xE98A, 0x501C, 0xE98B, 0xE98B, 0x23CB, 0xE98C, 0xE98D, 0x501F,\n    0xE98E, 0xE98E, 0x21F3, 0xE98F, 0xE98F, 0x5021, 0xE990, 0xE990, 0x21F7,\n    0xE991, 0xE991, 0x23CF, 0xE992, 0xE992, 0x23CE, 0xE993, 0xE993, 0x23CA,\n    0xE994, 0xE994, 0x23CD, 0xE995, 0xE997, 0x5022, 0xE998, 0xE998, 0x23D0,\n    0xE999, 0xE99A, 0x5025, 0xE99B, 0xE99B, 0x266C, 0xE99C, 0xE99C, 0x5027,\n    0xE99D, 0xE99D, 0x23C1, 0xE99E, 0xE99E, 0x5028, 0xE99F, 0xE99F, 0x1FEE,\n    0xE9A0, 0xE9A0, 0x23D1, 0xE9A1, 0xE9FE, 0x1895, 0xEA40, 0xEA40, 0x1FF8,\n    0xEA41, 0xEA43, 0x5029, 0xEA44, 0xEA44, 0x23D3, 0xEA45, 0xEA47, 0x502C,\n    0xEA48, 0xEA48, 0x23D2, 0xEA49, 0xEA49, 0x23D4, 0xEA4A, 0xEA4A, 0x1E98,\n    0xEA4B, 0xEA4F, 0x502F, 0xEA50, 0xEA50, 0x1F2C, 0xEA51, 0xEA51, 0x5034,\n    0xEA52, 0xEA52, 0x23D5, 0xEA53, 0xEA54, 0x5035, 0xEA55, 0xEA55, 0x1E71,\n    0xEA56, 0xEA56, 0x2691, 0xEA57, 0xEA58, 0x5037, 0xEA59, 0xEA59, 0x23C5,\n    0xEA5A, 0xEA7E, 0x5039, 0xEA80, 0xEA80, 0x231A, 0xEA81, 0xEA83, 0x505E,\n    0xEA84, 0xEA84, 0x2114, 0xEA85, 0xEA86, 0x5061, 0xEA87, 0xEA87, 0x2284,\n    0xEA88, 0xEA8D, 0x5063, 0xEA8E, 0xEA8E, 0x221C, 0xEA8F, 0xEA8F, 0x5069,\n    0xEA90, 0xEA90, 0x1E7E, 0xEA91, 0xEA91, 0x204D, 0xEA92, 0xEA95, 0x506A,\n    0xEA96, 0xEA96, 0x2201, 0xEA97, 0xEA9F, 0x506E, 0xEAA0, 0xEAA0, 0x1ED9,\n    0xEAA1, 0xEAFE, 0x18F3, 0xEB40, 0xEB40, 0x5077, 0xEB41, 0xEB41, 0x1FB2,\n    0xEB42, 0xEB44, 0x5078, 0xEB45, 0xEB45, 0x2252, 0xEB46, 0xEB47, 0x507B,\n    0xEB48, 0xEB48, 0x1F79, 0xEB49, 0xEB52, 0x507D, 0xEB53, 0xEB53, 0x2157,\n    0xEB54, 0xEB54, 0x5087, 0xEB55, 0xEB55, 0x21BF, 0xEB56, 0xEB5A, 0x5088,\n    0xEB5B, 0xEB5B, 0x221F, 0xEB5C, 0xEB5C, 0x508D, 0xEB5D, 0xEB5D, 0x203D,\n    0xEB5E, 0xEB5F, 0x508E, 0xEB60, 0xEB60, 0x2015, 0xEB61, 0xEB61, 0x5090,\n    0xEB62, 0xEB62, 0x26A5, 0xEB63, 0xEB6C, 0x5091, 0xEB6D, 0xEB6D, 0x2156,\n    0xEB6E, 0xEB6F, 0x509B, 0xEB70, 0xEB70, 0x2144, 0xEB71, 0xEB71, 0x509D,\n    0xEB72, 0xEB72, 0x1E91, 0xEB73, 0xEB73, 0x2257, 0xEB74, 0xEB77, 0x509E,\n    0xEB78, 0xEB78, 0x200A, 0xEB79, 0xEB79, 0x2092, 0xEB7A, 0xEB7E, 0x50A2,\n    0xEB80, 0xEB84, 0x50A7, 0xEB85, 0xEB85, 0x2250, 0xEB86, 0xEB89, 0x50AC,\n    0xEB8A, 0xEB8A, 0x1EC3, 0xEB8B, 0xEBA0, 0x50B0, 0xEBA1, 0xEBFE, 0x1951,\n    0xEC40, 0xEC45, 0x50C6, 0xEC46, 0xEC46, 0x21A8, 0xEC47, 0xEC55, 0x50CC,\n    0xEC56, 0xEC56, 0x260D, 0xEC57, 0xEC59, 0x50DB, 0xEC5A, 0xEC5A, 0x260C,\n    0xEC5B, 0xEC5B, 0x50DE, 0xEC5C, 0xEC5C, 0x260E, 0xEC5D, 0xEC5F, 0x50DF,\n    0xEC60, 0xEC60, 0x2032, 0xEC61, 0xEC6D, 0x50E2, 0xEC6E, 0xEC6E, 0x260B,\n    0xEC6F, 0xEC75, 0x50EF, 0xEC76, 0xEC76, 0x22C3, 0xEC77, 0xEC7E, 0x50F6,\n    0xEC80, 0xEC95, 0x50FE, 0xEC96, 0xEC96, 0x1F23, 0xEC97, 0xECA0, 0x5114,\n    0xECA1, 0xECFE, 0x19AF, 0xED40, 0xED45, 0x511E, 0xED46, 0xED46, 0x2695,\n    0xED47, 0xED57, 0x5124, 0xED58, 0xED58, 0x265E, 0xED59, 0xED5D, 0x5135,\n    0xED5E, 0xED5E, 0x265D, 0xED5F, 0xED60, 0x513A, 0xED61, 0xED61, 0x2692,\n    0xED62, 0xED63, 0x513C, 0xED64, 0xED64, 0x265F, 0xED65, 0xED65, 0x513E,\n    0xED66, 0xED66, 0x218D, 0xED67, 0xED67, 0x20FD, 0xED68, 0xED6D, 0x513F,\n    0xED6E, 0xED6E, 0x1F40, 0xED6F, 0xED73, 0x5145, 0xED74, 0xED74, 0x2465,\n    0xED75, 0xED76, 0x514A, 0xED77, 0xED77, 0x2467, 0xED78, 0xED78, 0x514C,\n    0xED79, 0xED79, 0x2466, 0xED7A, 0xED7E, 0x514D, 0xED80, 0xED90, 0x5152,\n    0xED91, 0xED91, 0x21C9, 0xED92, 0xED92, 0x5163, 0xED93, 0xED93, 0x2209,\n    0xED94, 0xED94, 0x1EC9, 0xED95, 0xED95, 0x20E9, 0xED96, 0xED96, 0x5164,\n    0xED97, 0xED97, 0x21CA, 0xED98, 0xED98, 0x2146, 0xED99, 0xED99, 0x25C5,\n    0xED9A, 0xED9A, 0x21DC, 0xED9B, 0xED9B, 0x5165, 0xED9C, 0xED9C, 0x245E,\n    0xED9D, 0xED9D, 0x5166, 0xED9E, 0xED9E, 0x214F, 0xED9F, 0xED9F, 0x5167,\n    0xEDA0, 0xEDA0, 0x25C6, 0xEDA1, 0xEDFE, 0x1A0D, 0xEE40, 0xEE40, 0x25C7,\n    0xEE41, 0xEE41, 0x2241, 0xEE42, 0xEE42, 0x218A, 0xEE43, 0xEE43, 0x1E2F,\n    0xEE44, 0xEE44, 0x1EDC, 0xEE45, 0xEE47, 0x5168, 0xEE48, 0xEE48, 0x20BF,\n    0xEE49, 0xEE49, 0x2034, 0xEE4A, 0xEE4C, 0x516B, 0xEE4D, 0xEE4D, 0x25C9,\n    0xEE4E, 0xEE51, 0x516E, 0xEE52, 0xEE52, 0x25C8, 0xEE53, 0xEE54, 0x5172,\n    0xEE55, 0xEE55, 0x220E, 0xEE56, 0xEE56, 0x5174, 0xEE57, 0xEE57, 0x25CB,\n    0xEE58, 0xEE5D, 0x5175, 0xEE5E, 0xEE5E, 0x217D, 0xEE5F, 0xEE60, 0x517B,\n    0xEE61, 0xEE61, 0x1F7E, 0xEE62, 0xEE67, 0x517D, 0xEE68, 0xEE68, 0x25CC,\n    0xEE69, 0xEE69, 0x1FC3, 0xEE6A, 0xEE6B, 0x5183, 0xEE6C, 0xEE6C, 0x20B9,\n    0xEE6D, 0xEE6D, 0x5185, 0xEE6E, 0xEE6E, 0x2181, 0xEE6F, 0xEE76, 0x5186,\n    0xEE77, 0xEE77, 0x1FDA, 0xEE78, 0xEE7C, 0x518E, 0xEE7D, 0xEE7D, 0x2173,\n    0xEE7E, 0xEE7E, 0x1EE1, 0xEE80, 0xEE80, 0x25CD, 0xEE81, 0xEE84, 0x5193,\n    0xEE85, 0xEE85, 0x25CE, 0xEE86, 0xEE86, 0x21F6, 0xEE87, 0xEE89, 0x5197,\n    0xEE8A, 0xEE8A, 0x224B, 0xEE8B, 0xEE8B, 0x25D1, 0xEE8C, 0xEE8C, 0x519A,\n    0xEE8D, 0xEE8D, 0x1EC0, 0xEE8E, 0xEE8F, 0x519B, 0xEE90, 0xEE90, 0x2008,\n    0xEE91, 0xEE93, 0x519D, 0xEE94, 0xEE94, 0x25D0, 0xEE95, 0xEE96, 0x51A0,\n    0xEE97, 0xEE97, 0x25D2, 0xEE98, 0xEE98, 0x51A2, 0xEE99, 0xEE99, 0x1F2A,\n    0xEE9A, 0xEE9C, 0x51A3, 0xEE9D, 0xEE9D, 0x1E72, 0xEE9E, 0xEE9E, 0x25D3,\n    0xEE9F, 0xEEA0, 0x51A6, 0xEEA1, 0xEEFE, 0x1A6B, 0xEF40, 0xEF40, 0x21BE,\n    0xEF41, 0xEF41, 0x25D4, 0xEF42, 0xEF42, 0x2044, 0xEF43, 0xEF43, 0x51A8,\n    0xEF44, 0xEF44, 0x25CF, 0xEF45, 0xEF45, 0x20F3, 0xEF46, 0xEF4B, 0x51A9,\n    0xEF4C, 0xEF4C, 0x1F00, 0xEF4D, 0xEF51, 0x51AF, 0xEF52, 0xEF53, 0x24CC,\n    0xEF54, 0xEF54, 0x51B4, 0xEF55, 0xEF55, 0x2698, 0xEF56, 0xEF56, 0x51B5,\n    0xEF57, 0xEF57, 0x2678, 0xEF58, 0xEF59, 0x51B6, 0xEF5A, 0xEF5A, 0x24CE,\n    0xEF5B, 0xEF5F, 0x51B8, 0xEF60, 0xEF60, 0x24CF, 0xEF61, 0xEF67, 0x51BD,\n    0xEF68, 0xEF68, 0x20B8, 0xEF69, 0xEF69, 0x51C4, 0xEF6A, 0xEF6A, 0x24D0,\n    0xEF6B, 0xEF6B, 0x51C5, 0xEF6C, 0xEF6C, 0x24D1, 0xEF6D, 0xEF76, 0x51C6,\n    0xEF77, 0xEF77, 0x1EF4, 0xEF78, 0xEF79, 0x51D0, 0xEF7A, 0xEF7A, 0x239B,\n    0xEF7B, 0xEF7B, 0x51D2, 0xEF7C, 0xEF7C, 0x267E, 0xEF7D, 0xEF7E, 0x51D3,\n    0xEF80, 0xEF81, 0x51D5, 0xEF82, 0xEF82, 0x239D, 0xEF83, 0xEF84, 0x239F,\n    0xEF85, 0xEF85, 0x51D7, 0xEF86, 0xEF86, 0x23A1, 0xEF87, 0xEF87, 0x51D8,\n    0xEF88, 0xEF88, 0x1EF1, 0xEF89, 0xEF8A, 0x51D9, 0xEF8B, 0xEF8B, 0x221E,\n    0xEF8C, 0xEF8C, 0x51DB, 0xEF8D, 0xEF8D, 0x23A2, 0xEF8E, 0xEF94, 0x51DC,\n    0xEF95, 0xEF95, 0x214B, 0xEF96, 0xEF96, 0x1E36, 0xEF97, 0xEF97, 0x2135,\n    0xEF98, 0xEF9B, 0x51E3, 0xEF9C, 0xEF9C, 0x1FAD, 0xEF9D, 0xEF9D, 0x51E7,\n    0xEF9E, 0xEF9E, 0x1E53, 0xEF9F, 0xEFA0, 0x51E8, 0xEFA1, 0xEFFE, 0x1AC9,\n    0xF040, 0xF040, 0x51EA, 0xF041, 0xF041, 0x23A3, 0xF042, 0xF042, 0x2203,\n    0xF043, 0xF043, 0x51EB, 0xF044, 0xF044, 0x1EE7, 0xF045, 0xF046, 0x51EC,\n    0xF047, 0xF047, 0x23A4, 0xF048, 0xF048, 0x2097, 0xF049, 0xF049, 0x1EE4,\n    0xF04A, 0xF04D, 0x51EE, 0xF04E, 0xF04E, 0x2238, 0xF04F, 0xF050, 0x51F2,\n    0xF051, 0xF051, 0x23A5, 0xF052, 0xF053, 0x51F4, 0xF054, 0xF054, 0x1F9A,\n    0xF055, 0xF056, 0x51F6, 0xF057, 0xF057, 0x21C3, 0xF058, 0xF05D, 0x51F8,\n    0xF05E, 0xF05E, 0x1F2E, 0xF05F, 0xF067, 0x51FE, 0xF068, 0xF068, 0x239C,\n    0xF069, 0xF06B, 0x5207, 0xF06C, 0xF06C, 0x23A6, 0xF06D, 0xF070, 0x520A,\n    0xF071, 0xF071, 0x239E, 0xF072, 0xF072, 0x520E, 0xF073, 0xF073, 0x2035,\n    0xF074, 0xF074, 0x23A7, 0xF075, 0xF077, 0x520F, 0xF078, 0xF078, 0x23A8,\n    0xF079, 0xF079, 0x5212, 0xF07A, 0xF07A, 0x2075, 0xF07B, 0xF07C, 0x5213,\n    0xF07D, 0xF07E, 0x23A9, 0xF080, 0xF080, 0x23AB, 0xF081, 0xF081, 0x1FEB,\n    0xF082, 0xF082, 0x23AC, 0xF083, 0xF086, 0x5215, 0xF087, 0xF087, 0x1F6A,\n    0xF088, 0xF088, 0x20F9, 0xF089, 0xF08A, 0x5219, 0xF08B, 0xF08B, 0x2666,\n    0xF08C, 0xF08F, 0x521B, 0xF090, 0xF090, 0x2667, 0xF091, 0xF091, 0x521F,\n    0xF092, 0xF092, 0x1E6C, 0xF093, 0xF095, 0x5220, 0xF096, 0xF096, 0x23AD,\n    0xF097, 0xF0A0, 0x5223, 0xF0A1, 0xF0FE, 0x1B27, 0xF140, 0xF151, 0x522D,\n    0xF152, 0xF152, 0x206D, 0xF153, 0xF153, 0x2242, 0xF154, 0xF154, 0x1F02,\n    0xF155, 0xF156, 0x523F, 0xF157, 0xF157, 0x2183, 0xF158, 0xF158, 0x5241,\n    0xF159, 0xF159, 0x1E85, 0xF15A, 0xF15A, 0x21E9, 0xF15B, 0xF166, 0x5242,\n    0xF167, 0xF167, 0x1E57, 0xF168, 0xF175, 0x524E, 0xF176, 0xF176, 0x22A5,\n    0xF177, 0xF177, 0x2407, 0xF178, 0xF178, 0x1FCA, 0xF179, 0xF179, 0x525C,\n    0xF17A, 0xF17A, 0x2402, 0xF17B, 0xF17B, 0x1F82, 0xF17C, 0xF17D, 0x525D,\n    0xF17E, 0xF17E, 0x2408, 0xF180, 0xF180, 0x2404, 0xF181, 0xF181, 0x525F,\n    0xF182, 0xF182, 0x2131, 0xF183, 0xF183, 0x5260, 0xF184, 0xF184, 0x2184,\n    0xF185, 0xF185, 0x5261, 0xF186, 0xF186, 0x2403, 0xF187, 0xF187, 0x5262,\n    0xF188, 0xF188, 0x206E, 0xF189, 0xF189, 0x240B, 0xF18A, 0xF193, 0x5263,\n    0xF194, 0xF194, 0x1F3F, 0xF195, 0xF197, 0x526D, 0xF198, 0xF198, 0x2067,\n    0xF199, 0xF1A0, 0x5270, 0xF1A1, 0xF1FE, 0x1B85, 0xF240, 0xF244, 0x5278,\n    0xF245, 0xF245, 0x1FD7, 0xF246, 0xF246, 0x527D, 0xF247, 0xF247, 0x1E83,\n    0xF248, 0xF24A, 0x527E, 0xF24B, 0xF24B, 0x240F, 0xF24C, 0xF252, 0x5281,\n    0xF253, 0xF253, 0x240E, 0xF254, 0xF254, 0x20C7, 0xF255, 0xF255, 0x240D,\n    0xF256, 0xF25B, 0x5288, 0xF25C, 0xF25C, 0x2412, 0xF25D, 0xF25E, 0x528E,\n    0xF25F, 0xF25F, 0x20B7, 0xF260, 0xF270, 0x5290, 0xF271, 0xF271, 0x23F0,\n    0xF272, 0xF272, 0x52A1, 0xF273, 0xF273, 0x2411, 0xF274, 0xF274, 0x2414,\n    0xF275, 0xF275, 0x52A2, 0xF276, 0xF276, 0x2170, 0xF277, 0xF27B, 0x52A3,\n    0xF27C, 0xF27C, 0x2405, 0xF27D, 0xF27D, 0x210C, 0xF27E, 0xF27E, 0x2415,\n    0xF280, 0xF284, 0x52A8, 0xF285, 0xF285, 0x2066, 0xF286, 0xF286, 0x52AD,\n    0xF287, 0xF287, 0x2352, 0xF288, 0xF288, 0x2413, 0xF289, 0xF289, 0x2410,\n    0xF28A, 0xF28B, 0x2416, 0xF28C, 0xF28C, 0x20F1, 0xF28D, 0xF290, 0x52AE,\n    0xF291, 0xF291, 0x240A, 0xF292, 0xF293, 0x52B2, 0xF294, 0xF294, 0x2409,\n    0xF295, 0xF295, 0x52B4, 0xF296, 0xF296, 0x2418, 0xF297, 0xF29B, 0x52B5,\n    0xF29C, 0xF29C, 0x1FA7, 0xF29D, 0xF29D, 0x52BA, 0xF29E, 0xF29E, 0x21FC,\n    0xF29F, 0xF2A0, 0x52BB, 0xF2A1, 0xF2FE, 0x1BE3, 0xF340, 0xF340, 0x1FC1,\n    0xF341, 0xF341, 0x2406, 0xF342, 0xF344, 0x52BD, 0xF345, 0xF345, 0x229C,\n    0xF346, 0xF347, 0x52C0, 0xF348, 0xF348, 0x204E, 0xF349, 0xF349, 0x52C2,\n    0xF34A, 0xF34A, 0x241A, 0xF34B, 0xF34B, 0x2419, 0xF34C, 0xF34F, 0x52C3,\n    0xF350, 0xF350, 0x240C, 0xF351, 0xF360, 0x52C7, 0xF361, 0xF361, 0x1E29,\n    0xF362, 0xF373, 0x52D7, 0xF374, 0xF374, 0x2661, 0xF375, 0xF375, 0x52E9,\n    0xF376, 0xF376, 0x26A4, 0xF377, 0xF377, 0x2174, 0xF378, 0xF378, 0x2663,\n    0xF379, 0xF379, 0x2662, 0xF37A, 0xF37E, 0x52EA, 0xF380, 0xF38B, 0x52EF,\n    0xF38C, 0xF38C, 0x2675, 0xF38D, 0xF39F, 0x52FB, 0xF3A0, 0xF3A0, 0x214C,\n    0xF3A1, 0xF3FE, 0x1C41, 0xF440, 0xF444, 0x530E, 0xF445, 0xF445, 0x267A,\n    0xF446, 0xF44F, 0x5313, 0xF450, 0xF450, 0x26A0, 0xF451, 0xF456, 0x531D,\n    0xF457, 0xF457, 0x2668, 0xF458, 0xF458, 0x5323, 0xF459, 0xF459, 0x1ED0,\n    0xF45A, 0xF45A, 0x5324, 0xF45B, 0xF45B, 0x2096, 0xF45C, 0xF45C, 0x5325,\n    0xF45D, 0xF45D, 0x23CC, 0xF45E, 0xF461, 0x5326, 0xF462, 0xF462, 0x23C8,\n    0xF463, 0xF463, 0x532A, 0xF464, 0xF464, 0x223E, 0xF465, 0xF474, 0x532B,\n    0xF475, 0xF475, 0x2665, 0xF476, 0xF47B, 0x533B, 0xF47C, 0xF47C, 0x2664,\n    0xF47D, 0xF47D, 0x5341, 0xF47E, 0xF47E, 0x2239, 0xF480, 0xF493, 0x5342,\n    0xF494, 0xF494, 0x204A, 0xF495, 0xF498, 0x5356, 0xF499, 0xF499, 0x261F,\n    0xF49A, 0xF49B, 0x535A, 0xF49C, 0xF49C, 0x261E, 0xF49D, 0xF4A0, 0x535C,\n    0xF4A1, 0xF4FE, 0x1C9F, 0xF540, 0xF544, 0x5360, 0xF545, 0xF545, 0x2620,\n    0xF546, 0xF546, 0x5365, 0xF547, 0xF547, 0x2621, 0xF548, 0xF551, 0x5366,\n    0xF552, 0xF552, 0x2622, 0xF553, 0xF553, 0x5370, 0xF554, 0xF554, 0x2627,\n    0xF555, 0xF555, 0x1E39, 0xF556, 0xF556, 0x2625, 0xF557, 0xF55D, 0x5371,\n    0xF55E, 0xF55E, 0x2629, 0xF55F, 0xF560, 0x5378, 0xF561, 0xF561, 0x262E,\n    0xF562, 0xF562, 0x262B, 0xF563, 0xF56D, 0x537A, 0xF56E, 0xF56E, 0x262A,\n    0xF56F, 0xF56F, 0x262D, 0xF570, 0xF570, 0x5385, 0xF571, 0xF571, 0x2628,\n    0xF572, 0xF572, 0x21B9, 0xF573, 0xF57E, 0x5386, 0xF580, 0xF584, 0x5392,\n    0xF585, 0xF585, 0x2636, 0xF586, 0xF586, 0x2630, 0xF587, 0xF58B, 0x5397,\n    0xF58C, 0xF58C, 0x2638, 0xF58D, 0xF58D, 0x539C, 0xF58E, 0xF58E, 0x200D,\n    0xF58F, 0xF58F, 0x2637, 0xF590, 0xF598, 0x539D, 0xF599, 0xF599, 0x2645,\n    0xF59A, 0xF59A, 0x53A6, 0xF59B, 0xF59B, 0x263A, 0xF59C, 0xF59F, 0x53A7,\n    0xF5A0, 0xF5A0, 0x2643, 0xF5A1, 0xF5FE, 0x1CFD, 0xF640, 0xF640, 0x53AB,\n    0xF641, 0xF641, 0x2640, 0xF642, 0xF644, 0x53AC, 0xF645, 0xF645, 0x263D,\n    0xF646, 0xF646, 0x2641, 0xF647, 0xF647, 0x53AF, 0xF648, 0xF648, 0x263E,\n    0xF649, 0xF64A, 0x53B0, 0xF64B, 0xF64B, 0x263F, 0xF64C, 0xF64C, 0x1FC0,\n    0xF64D, 0xF64D, 0x53B2, 0xF64E, 0xF64F, 0x263B, 0xF650, 0xF653, 0x53B3,\n    0xF654, 0xF654, 0x2642, 0xF655, 0xF657, 0x53B7, 0xF658, 0xF658, 0x2644,\n    0xF659, 0xF660, 0x53BA, 0xF661, 0xF661, 0x2639, 0xF662, 0xF662, 0x53C2,\n    0xF663, 0xF663, 0x264C, 0xF664, 0xF66B, 0x53C3, 0xF66C, 0xF66C, 0x2647,\n    0xF66D, 0xF66D, 0x264B, 0xF66E, 0xF670, 0x53CB, 0xF671, 0xF671, 0x2649,\n    0xF672, 0xF673, 0x53CE, 0xF674, 0xF674, 0x2648, 0xF675, 0xF675, 0x53D0,\n    0xF676, 0xF676, 0x264A, 0xF677, 0xF677, 0x2108, 0xF678, 0xF67E, 0x53D1,\n    0xF680, 0xF684, 0x53D8, 0xF685, 0xF685, 0x264D, 0xF686, 0xF687, 0x53DD,\n    0xF688, 0xF688, 0x2634, 0xF689, 0xF689, 0x53DF, 0xF68A, 0xF68A, 0x2651,\n    0xF68B, 0xF68C, 0x53E0, 0xF68D, 0xF68D, 0x2650, 0xF68E, 0xF68E, 0x2652,\n    0xF68F, 0xF691, 0x53E2, 0xF692, 0xF692, 0x264F, 0xF693, 0xF695, 0x53E5,\n    0xF696, 0xF696, 0x2632, 0xF697, 0xF697, 0x264E, 0xF698, 0xF698, 0x2653,\n    0xF699, 0xF699, 0x53E8, 0xF69A, 0xF69A, 0x2657, 0xF69B, 0xF69B, 0x53E9,\n    0xF69C, 0xF69C, 0x2635, 0xF69D, 0xF69D, 0x53EA, 0xF69E, 0xF69E, 0x2633,\n    0xF69F, 0xF69F, 0x53EB, 0xF6A0, 0xF6A0, 0x2656, 0xF6A1, 0xF6FE, 0x1D5B,\n    0xF740, 0xF741, 0x53EC, 0xF742, 0xF742, 0x2654, 0xF743, 0xF748, 0x53EE,\n    0xF749, 0xF749, 0x2658, 0xF74A, 0xF74B, 0x53F4, 0xF74C, 0xF74C, 0x2655,\n    0xF74D, 0xF74D, 0x1E4D, 0xF74E, 0xF755, 0x53F6, 0xF756, 0xF756, 0x265B,\n    0xF757, 0xF757, 0x53FE, 0xF758, 0xF758, 0x265A, 0xF759, 0xF759, 0x53FF,\n    0xF75A, 0xF75A, 0x2659, 0xF75B, 0xF75B, 0x202E, 0xF75C, 0xF75C, 0x262F,\n    0xF75D, 0xF760, 0x5400, 0xF761, 0xF761, 0x2646, 0xF762, 0xF762, 0x5404,\n    0xF763, 0xF763, 0x2626, 0xF764, 0xF76A, 0x5405, 0xF76B, 0xF76B, 0x265C,\n    0xF76C, 0xF770, 0x540C, 0xF771, 0xF771, 0x262C, 0xF772, 0xF77B, 0x5411,\n    0xF77C, 0xF77C, 0x2623, 0xF77D, 0xF77D, 0x541B, 0xF77E, 0xF77E, 0x2631,\n    0xF780, 0xF7A0, 0x541C, 0xF7A1, 0xF7FE, 0x1DB9, 0xF840, 0xF841, 0x543D,\n    0xF842, 0xF842, 0x209C, 0xF843, 0xF845, 0x543F, 0xF846, 0xF846, 0x2580,\n    0xF847, 0xF848, 0x5442, 0xF849, 0xF849, 0x22DC, 0xF84A, 0xF84F, 0x5444,\n    0xF850, 0xF850, 0x1F05, 0xF851, 0xF851, 0x208B, 0xF852, 0xF852, 0x544A,\n    0xF853, 0xF853, 0x2581, 0xF854, 0xF862, 0x544B, 0xF863, 0xF863, 0x2583,\n    0xF864, 0xF864, 0x2582, 0xF865, 0xF865, 0x545A, 0xF866, 0xF866, 0x21EE,\n    0xF867, 0xF871, 0x545B, 0xF872, 0xF872, 0x2182, 0xF873, 0xF877, 0x5466,\n    0xF878, 0xF878, 0x2243, 0xF879, 0xF879, 0x546B, 0xF87A, 0xF87A, 0x2587,\n    0xF87B, 0xF87B, 0x546C, 0xF87C, 0xF87C, 0x2588, 0xF87D, 0xF87E, 0x546D,\n    0xF880, 0xF880, 0x546F, 0xF881, 0xF881, 0x2584, 0xF882, 0xF883, 0x5470,\n    0xF884, 0xF884, 0x21FD, 0xF885, 0xF885, 0x5472, 0xF886, 0xF886, 0x21EF,\n    0xF887, 0xF88C, 0x5473, 0xF88D, 0xF88D, 0x258A, 0xF88E, 0xF88E, 0x258C,\n    0xF88F, 0xF898, 0x5479, 0xF899, 0xF899, 0x1F47, 0xF89A, 0xF89C, 0x5483,\n    0xF89D, 0xF89D, 0x1F1D, 0xF89E, 0xF89F, 0x5486, 0xF8A0, 0xF8A0, 0x258D,\n    0xF940, 0xF94D, 0x5488, 0xF94E, 0xF94E, 0x1FD0, 0xF94F, 0xF94F, 0x2592,\n    0xF950, 0xF950, 0x258F, 0xF951, 0xF958, 0x5496, 0xF959, 0xF959, 0x2594,\n    0xF95A, 0xF95A, 0x1EE0, 0xF95B, 0xF95C, 0x549E, 0xF95D, 0xF95D, 0x2591,\n    0xF95E, 0xF95E, 0x2595, 0xF95F, 0xF966, 0x54A0, 0xF967, 0xF967, 0x2597,\n    0xF968, 0xF968, 0x54A8, 0xF969, 0xF969, 0x20B6, 0xF96A, 0xF96B, 0x54A9,\n    0xF96C, 0xF96C, 0x2598, 0xF96D, 0xF96E, 0x54AB, 0xF96F, 0xF96F, 0x20F6,\n    0xF970, 0xF97E, 0x54AD, 0xF980, 0xF984, 0x54BC, 0xF985, 0xF985, 0x2585,\n    0xF986, 0xF986, 0x54C1, 0xF987, 0xF987, 0x2599, 0xF988, 0xF990, 0x54C2,\n    0xF991, 0xF991, 0x2596, 0xF992, 0xF995, 0x54CB, 0xF996, 0xF996, 0x259A,\n    0xF997, 0xF997, 0x54CF, 0xF998, 0xF998, 0x259B, 0xF999, 0xF9A0, 0x54D0,\n    0xFA40, 0xFA41, 0x54D8, 0xFA42, 0xFA42, 0x259D, 0xFA43, 0xFA45, 0x54DA,\n    0xFA46, 0xFA46, 0x259E, 0xFA47, 0xFA4B, 0x54DD, 0xFA4C, 0xFA4C, 0x234C,\n    0xFA4D, 0xFA50, 0x54E2, 0xFA51, 0xFA51, 0x1F44, 0xFA52, 0xFA57, 0x54E6,\n    0xFA58, 0xFA58, 0x2660, 0xFA59, 0xFA59, 0x25A0, 0xFA5A, 0xFA5C, 0x54EC,\n    0xFA5D, 0xFA5D, 0x259C, 0xFA5E, 0xFA5E, 0x54EF, 0xFA5F, 0xFA5F, 0x259F,\n    0xFA60, 0xFA60, 0x54F0, 0xFA61, 0xFA61, 0x1F6C, 0xFA62, 0xFA6F, 0x54F1,\n    0xFA70, 0xFA70, 0x25A2, 0xFA71, 0xFA73, 0x54FF, 0xFA74, 0xFA74, 0x20AE,\n    0xFA75, 0xFA75, 0x5502, 0xFA76, 0xFA76, 0x258B, 0xFA77, 0xFA77, 0x25A3,\n    0xFA78, 0xFA7E, 0x5503, 0xFA80, 0xFA82, 0x550A, 0xFA83, 0xFA83, 0x2589,\n    0xFA84, 0xFA84, 0x25A5, 0xFA85, 0xFA8C, 0x550D, 0xFA8D, 0xFA8D, 0x25A4,\n    0xFA8E, 0xFA8F, 0x5515, 0xFA90, 0xFA90, 0x25A6, 0xFA91, 0xFA91, 0x2593,\n    0xFA92, 0xFA95, 0x5517, 0xFA96, 0xFA96, 0x25A7, 0xFA97, 0xFA97, 0x2222,\n    0xFA98, 0xFA98, 0x25A9, 0xFA99, 0xFAA0, 0x551B, 0xFB40, 0xFB48, 0x5523,\n    0xFB49, 0xFB49, 0x25A8, 0xFB4A, 0xFB51, 0x552C, 0xFB52, 0xFB52, 0x2586,\n    0xFB53, 0xFB56, 0x5534, 0xFB57, 0xFB57, 0x25A1, 0xFB58, 0xFB58, 0x25AA,\n    0xFB59, 0xFB59, 0x5538, 0xFB5A, 0xFB5A, 0x2590, 0xFB5B, 0xFB5B, 0x258E,\n    0xFB5C, 0xFB74, 0x5539, 0xFB75, 0xFB75, 0x2688, 0xFB76, 0xFB78, 0x5552,\n    0xFB79, 0xFB79, 0x269E, 0xFB7A, 0xFB7A, 0x25FB, 0xFB7B, 0xFB7B, 0x5555,\n    0xFB7C, 0xFB7C, 0x1F8C, 0xFB7D, 0xFB7D, 0x21F4, 0xFB7E, 0xFB7E, 0x5556,\n    0xFB80, 0xFB8F, 0x5557, 0xFB90, 0xFB90, 0x200F, 0xFB91, 0xFB9B, 0x5567,\n    0xFB9C, 0xFB9C, 0x2071, 0xFB9D, 0xFB9E, 0x5572, 0xFB9F, 0xFB9F, 0x25F7,\n    0xFBA0, 0xFBA0, 0x5574, 0xFC40, 0xFC43, 0x5575, 0xFC44, 0xFC44, 0x2696,\n    0xFC45, 0xFC48, 0x5579, 0xFC49, 0xFC49, 0x268F, 0xFC4A, 0xFC59, 0x557D,\n    0xFC5A, 0xFC5A, 0x22DA, 0xFC5B, 0xFC62, 0x558D, 0xFC63, 0xFC63, 0x1EC1,\n    0xFC64, 0xFC67, 0x5595, 0xFC68, 0xFC68, 0x1EB3, 0xFC69, 0xFC6E, 0x5599,\n    0xFC6F, 0xFC6F, 0x266A, 0xFC70, 0xFC70, 0x559F, 0xFC71, 0xFC71, 0x268A,\n    0xFC72, 0xFC73, 0x55A0, 0xFC74, 0xFC74, 0x2669, 0xFC75, 0xFC76, 0x55A2,\n    0xFC77, 0xFC78, 0x2618, 0xFC79, 0xFC7E, 0x55A4, 0xFC80, 0xFC82, 0x55AA,\n    0xFC83, 0xFC83, 0x261A, 0xFC84, 0xFC89, 0x55AD, 0xFC8A, 0xFC8A, 0x2673,\n    0xFC8B, 0xFCA0, 0x55B3, 0xFD40, 0xFD51, 0x55C9, 0xFD52, 0xFD52, 0x20C6,\n    0xFD53, 0xFD53, 0x226B, 0xFD54, 0xFD56, 0x55DB, 0xFD57, 0xFD57, 0x24D3,\n    0xFD58, 0xFD58, 0x1E86, 0xFD59, 0xFD59, 0x55DE, 0xFD5A, 0xFD5A, 0x260F,\n    0xFD5B, 0xFD5E, 0x55DF, 0xFD5F, 0xFD5F, 0x2611, 0xFD60, 0xFD61, 0x55E3,\n    0xFD62, 0xFD62, 0x2613, 0xFD63, 0xFD64, 0x55E5, 0xFD65, 0xFD65, 0x2610,\n    0xFD66, 0xFD66, 0x2612, 0xFD67, 0xFD67, 0x2030, 0xFD68, 0xFD68, 0x55E7,\n    0xFD69, 0xFD69, 0x2671, 0xFD6A, 0xFD6B, 0x55E8, 0xFD6C, 0xFD6C, 0x2614,\n    0xFD6D, 0xFD6F, 0x55EA, 0xFD70, 0xFD70, 0x2616, 0xFD71, 0xFD71, 0x55ED,\n    0xFD72, 0xFD72, 0x2615, 0xFD73, 0xFD77, 0x55EE, 0xFD78, 0xFD78, 0x20F2,\n    0xFD79, 0xFD7C, 0x55F3, 0xFD7D, 0xFD7D, 0x2617, 0xFD7E, 0xFD7E, 0x55F7,\n    0xFD80, 0xFD87, 0x55F8, 0xFD88, 0xFD88, 0x2037, 0xFD89, 0xFD8A, 0x5600,\n    0xFD8B, 0xFD8B, 0x20B3, 0xFD8C, 0xFD8E, 0x5602, 0xFD8F, 0xFD8F, 0x1F22,\n    0xFD90, 0xFD90, 0x24ED, 0xFD91, 0xFD93, 0x5605, 0xFD94, 0xFD94, 0x1F34,\n    0xFD95, 0xFD9C, 0x5608, 0xFD9D, 0xFD9D, 0x0A02, 0xFD9E, 0xFD9E, 0x40D3,\n    0xFD9F, 0xFD9F, 0x200C, 0xFDA0, 0xFDA0, 0x5083, 0xFE40, 0xFE40, 0x1259,\n    0xFE41, 0xFE7E, 0x5610, 0xFE80, 0xFEA0, 0x564E,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-V_2.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_GBKp_EUC_V_2[20 * 3] = {\n    0xA1A2, 0xA1A2, 0x023F, 0xA1A3, 0xA1A3, 0x023E, 0xA1AA, 0xA1AA, 0x0256,\n    0xA1AB, 0xA1AC, 0x1E18, 0xA1AD, 0xA1AD, 0x0257, 0xA1B2, 0xA1BF, 0x0246,\n    0xA1FE, 0xA1FE, 0x1E1A, 0xA3A1, 0xA3A1, 0x0242, 0xA3A8, 0xA3A9, 0x0244,\n    0xA3AC, 0xA3AC, 0x023D, 0xA3AE, 0xA3AE, 0x1E1B, 0xA3BA, 0xA3BB, 0x0240,\n    0xA3BD, 0xA3BD, 0x1E1C, 0xA3BF, 0xA3BF, 0x0243, 0xA3DB, 0xA3DB, 0x1E1D,\n    0xA3DD, 0xA3DD, 0x1E1E, 0xA3DF, 0xA3DF, 0x0258, 0xA3FB, 0xA3FB, 0x0254,\n    0xA3FD, 0xA3FD, 0x0255, 0xA3FE, 0xA3FE, 0x1E1F,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-H_0.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_GBpc_EUC_H_0[91 * 3] = {\n    0x0020, 0x007E, 0x0001, 0x0080, 0x0080, 0x1E20, 0x00FD, 0x00FF, 0x1E21,\n    0xA1A1, 0xA1FE, 0x0060, 0xA2B1, 0xA2E2, 0x00BE, 0xA2E5, 0xA2EE, 0x00F0,\n    0xA2F1, 0xA2FC, 0x00FA, 0xA3A1, 0xA3FE, 0x0106, 0xA4A1, 0xA4F3, 0x0164,\n    0xA5A1, 0xA5F6, 0x01B7, 0xA6A1, 0xA6B8, 0x020D, 0xA6C1, 0xA6F5, 0x0225,\n    0xA7A1, 0xA7C1, 0x025A, 0xA7D1, 0xA7F1, 0x027B, 0xA8A1, 0xA8C0, 0x029C,\n    0xA8C5, 0xA8EA, 0x02BC, 0xA9A4, 0xA9EF, 0x02E2, 0xAAA1, 0xAAFE, 0x032E,\n    0xABA1, 0xABC0, 0x038C, 0xB0A1, 0xB0FE, 0x03AC, 0xB1A1, 0xB1FE, 0x040A,\n    0xB2A1, 0xB2FE, 0x0468, 0xB3A1, 0xB3FE, 0x04C6, 0xB4A1, 0xB4FE, 0x0524,\n    0xB5A1, 0xB5FE, 0x0582, 0xB6A1, 0xB6FE, 0x05E0, 0xB7A1, 0xB7FE, 0x063E,\n    0xB8A1, 0xB8FE, 0x069C, 0xB9A1, 0xB9FE, 0x06FA, 0xBAA1, 0xBAFE, 0x0758,\n    0xBBA1, 0xBBFE, 0x07B6, 0xBCA1, 0xBCFE, 0x0814, 0xBDA1, 0xBDFE, 0x0872,\n    0xBEA1, 0xBEFE, 0x08D0, 0xBFA1, 0xBFFE, 0x092E, 0xC0A1, 0xC0FE, 0x098C,\n    0xC1A1, 0xC1FE, 0x09EA, 0xC2A1, 0xC2FE, 0x0A48, 0xC3A1, 0xC3FE, 0x0AA6,\n    0xC4A1, 0xC4FE, 0x0B04, 0xC5A1, 0xC5FE, 0x0B62, 0xC6A1, 0xC6FE, 0x0BC0,\n    0xC7A1, 0xC7FE, 0x0C1E, 0xC8A1, 0xC8FE, 0x0C7C, 0xC9A1, 0xC9FE, 0x0CDA,\n    0xCAA1, 0xCAFE, 0x0D38, 0xCBA1, 0xCBFE, 0x0D96, 0xCCA1, 0xCCFE, 0x0DF4,\n    0xCDA1, 0xCDFE, 0x0E52, 0xCEA1, 0xCEFE, 0x0EB0, 0xCFA1, 0xCFFE, 0x0F0E,\n    0xD0A1, 0xD0FE, 0x0F6C, 0xD1A1, 0xD1FE, 0x0FCA, 0xD2A1, 0xD2FE, 0x1028,\n    0xD3A1, 0xD3FE, 0x1086, 0xD4A1, 0xD4FE, 0x10E4, 0xD5A1, 0xD5FE, 0x1142,\n    0xD6A1, 0xD6FE, 0x11A0, 0xD7A1, 0xD7F9, 0x11FE, 0xD8A1, 0xD8FE, 0x1257,\n    0xD9A1, 0xD9FE, 0x12B5, 0xDAA1, 0xDAFE, 0x1313, 0xDBA1, 0xDBFE, 0x1371,\n    0xDCA1, 0xDCFE, 0x13CF, 0xDDA1, 0xDDFE, 0x142D, 0xDEA1, 0xDEFE, 0x148B,\n    0xDFA1, 0xDFFE, 0x14E9, 0xE0A1, 0xE0FE, 0x1547, 0xE1A1, 0xE1FE, 0x15A5,\n    0xE2A1, 0xE2FE, 0x1603, 0xE3A1, 0xE3FE, 0x1661, 0xE4A1, 0xE4FE, 0x16BF,\n    0xE5A1, 0xE5FE, 0x171D, 0xE6A1, 0xE6FE, 0x177B, 0xE7A1, 0xE7FE, 0x17D9,\n    0xE8A1, 0xE8FE, 0x1837, 0xE9A1, 0xE9FE, 0x1895, 0xEAA1, 0xEAFE, 0x18F3,\n    0xEBA1, 0xEBFE, 0x1951, 0xECA1, 0xECFE, 0x19AF, 0xEDA1, 0xEDFE, 0x1A0D,\n    0xEEA1, 0xEEFE, 0x1A6B, 0xEFA1, 0xEFFE, 0x1AC9, 0xF0A1, 0xF0FE, 0x1B27,\n    0xF1A1, 0xF1FE, 0x1B85, 0xF2A1, 0xF2FE, 0x1BE3, 0xF3A1, 0xF3FE, 0x1C41,\n    0xF4A1, 0xF4FE, 0x1C9F, 0xF5A1, 0xF5FE, 0x1CFD, 0xF6A1, 0xF6FE, 0x1D5B,\n    0xF7A1, 0xF7FE, 0x1DB9,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-V_0.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_GBpc_EUC_V_0[20 * 3] = {\n    0xA1A2, 0xA1A2, 0x023F, 0xA1A3, 0xA1A3, 0x023E, 0xA1AA, 0xA1AA, 0x0256,\n    0xA1AB, 0xA1AC, 0x1E18, 0xA1AD, 0xA1AD, 0x0257, 0xA1B2, 0xA1BF, 0x0246,\n    0xA1FE, 0xA1FE, 0x1E1A, 0xA3A1, 0xA3A1, 0x0242, 0xA3A8, 0xA3A9, 0x0244,\n    0xA3AC, 0xA3AC, 0x023D, 0xA3AE, 0xA3AE, 0x1E1B, 0xA3BA, 0xA3BB, 0x0240,\n    0xA3BD, 0xA3BD, 0x1E1C, 0xA3BF, 0xA3BF, 0x0243, 0xA3DB, 0xA3DB, 0x1E1D,\n    0xA3DD, 0xA3DD, 0x1E1E, 0xA3DF, 0xA3DF, 0x0258, 0xA3FB, 0xA3FB, 0x0254,\n    0xA3FD, 0xA3FD, 0x0255, 0xA3FE, 0xA3FE, 0x1E1F,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-H_4.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_UniGB_UCS2_H_4[13825 * 3] = {\n    0x0020, 0x007E, 0x0001, 0x00A4, 0x00A4, 0x00A7, 0x00A5, 0x00A5, 0x5752,\n    0x00A7, 0x00A7, 0x00AB, 0x00A8, 0x00A8, 0x0066, 0x00B0, 0x00B0, 0x00A2,\n    0x00B1, 0x00B1, 0x007F, 0x00D7, 0x00D7, 0x0080, 0x00E0, 0x00E0, 0x029F,\n    0x00E1, 0x00E1, 0x029D, 0x00E8, 0x00E8, 0x02A3, 0x00E9, 0x00E9, 0x02A1,\n    0x00EA, 0x00EA, 0x02B5, 0x00EC, 0x00EC, 0x02A7, 0x00ED, 0x00ED, 0x02A5,\n    0x00F2, 0x00F2, 0x02AB, 0x00F3, 0x00F3, 0x02A9, 0x00F7, 0x00F7, 0x0081,\n    0x00F9, 0x00F9, 0x02AF, 0x00FA, 0x00FA, 0x02AD, 0x00FC, 0x00FC, 0x02B4,\n    0x0101, 0x0101, 0x029C, 0x0113, 0x0113, 0x02A0, 0x011B, 0x011B, 0x02A2,\n    0x012B, 0x012B, 0x02A4, 0x014D, 0x014D, 0x02A8, 0x016B, 0x016B, 0x02AC,\n    0x01CE, 0x01CE, 0x029E, 0x01D0, 0x01D0, 0x02A6, 0x01D2, 0x01D2, 0x02AA,\n    0x01D4, 0x01D4, 0x02AE, 0x01D6, 0x01D6, 0x02B0, 0x01D8, 0x01D8, 0x02B1,\n    0x01DA, 0x01DA, 0x02B2, 0x01DC, 0x01DC, 0x02B3, 0x01F9, 0x01F9, 0x02BA,\n    0x02C7, 0x02C7, 0x0065, 0x02C9, 0x02C9, 0x0064, 0x02CA, 0x02CB, 0x26B3,\n    0x02D9, 0x02D9, 0x26B5, 0x0391, 0x03A1, 0x020D, 0x03A3, 0x03A9, 0x021E,\n    0x03B1, 0x03C1, 0x0225, 0x03C3, 0x03C9, 0x0236, 0x0401, 0x0401, 0x0260,\n    0x0410, 0x0415, 0x025A, 0x0416, 0x0435, 0x0261, 0x0436, 0x044F, 0x0282,\n    0x0451, 0x0451, 0x0281, 0x1E3F, 0x1E3F, 0x02B7, 0x2010, 0x2010, 0x2722,\n    0x2013, 0x2013, 0x26B6, 0x2014, 0x2014, 0x0069, 0x2015, 0x2015, 0x26B7,\n    0x2016, 0x2016, 0x006B, 0x2018, 0x2019, 0x006D, 0x201C, 0x201D, 0x006F,\n    0x2025, 0x2025, 0x26B8, 0x2026, 0x2026, 0x006C, 0x2030, 0x2030, 0x00AA,\n    0x2032, 0x2033, 0x00A3, 0x2035, 0x2035, 0x26B9, 0x203B, 0x203B, 0x00B8,\n    0x20AC, 0x20AC, 0x5751, 0x2103, 0x2103, 0x00A5, 0x2105, 0x2105, 0x26BA,\n    0x2109, 0x2109, 0x26BB, 0x2116, 0x2116, 0x00AC, 0x2121, 0x2121, 0x2720,\n    0x2160, 0x216B, 0x00FA, 0x2170, 0x2179, 0x26A9, 0x2190, 0x2191, 0x00BA,\n    0x2192, 0x2192, 0x00B9, 0x2193, 0x2193, 0x00BC, 0x2196, 0x2199, 0x26BC,\n    0x2208, 0x2208, 0x0089, 0x220F, 0x220F, 0x0086, 0x2211, 0x2211, 0x0085,\n    0x2215, 0x2215, 0x26C0, 0x221A, 0x221A, 0x008B, 0x221D, 0x221D, 0x0097,\n    0x221E, 0x221E, 0x009D, 0x221F, 0x221F, 0x26C1, 0x2220, 0x2220, 0x008E,\n    0x2223, 0x2223, 0x26C2, 0x2225, 0x2225, 0x008D, 0x2227, 0x2228, 0x0083,\n    0x2229, 0x2229, 0x0088, 0x222A, 0x222A, 0x0087, 0x222B, 0x222B, 0x0091,\n    0x222E, 0x222E, 0x0092, 0x2234, 0x2234, 0x009F, 0x2235, 0x2235, 0x009E,\n    0x2236, 0x2236, 0x0082, 0x2237, 0x2237, 0x008A, 0x223D, 0x223D, 0x0096,\n    0x2248, 0x2248, 0x0095, 0x224C, 0x224C, 0x0094, 0x2252, 0x2252, 0x26C3,\n    0x2260, 0x2260, 0x0098, 0x2261, 0x2261, 0x0093, 0x2264, 0x2265, 0x009B,\n    0x2266, 0x2267, 0x26C4, 0x226E, 0x226F, 0x0099, 0x2295, 0x2295, 0x2704,\n    0x2299, 0x2299, 0x0090, 0x22A5, 0x22A5, 0x008C, 0x22BF, 0x22BF, 0x26C6,\n    0x22EF, 0x22EF, 0x006C, 0x2312, 0x2312, 0x008F, 0x2460, 0x2469, 0x00E6,\n    0x2474, 0x2487, 0x00D2, 0x2488, 0x249B, 0x00BE, 0x2500, 0x254B, 0x02E2,\n    0x2550, 0x2573, 0x26C7, 0x2581, 0x258F, 0x26EB, 0x2593, 0x2595, 0x26FA,\n    0x25A0, 0x25A0, 0x00B5, 0x25A1, 0x25A1, 0x00B4, 0x25B2, 0x25B2, 0x00B7,\n    0x25B3, 0x25B3, 0x00B6, 0x25BC, 0x25BD, 0x26FD, 0x25C6, 0x25C6, 0x00B3,\n    0x25C7, 0x25C7, 0x00B2, 0x25CB, 0x25CB, 0x00AF, 0x25CE, 0x25CE, 0x00B1,\n    0x25CF, 0x25CF, 0x00B0, 0x25E2, 0x25E5, 0x26FF, 0x2605, 0x2605, 0x00AE,\n    0x2606, 0x2606, 0x00AD, 0x2609, 0x2609, 0x2703, 0x2640, 0x2640, 0x00A1,\n    0x2642, 0x2642, 0x00A0, 0x2E80, 0x2E80, 0x579C, 0x2E81, 0x2E81, 0x561F,\n    0x2E82, 0x2E83, 0x579D, 0x2E84, 0x2E84, 0x5623, 0x2E85, 0x2E87, 0x579F,\n    0x2E88, 0x2E88, 0x5626, 0x2E89, 0x2E8A, 0x57A2, 0x2E8B, 0x2E8B, 0x5627,\n    0x2E8C, 0x2E8C, 0x562C, 0x2E8D, 0x2E96, 0x57A4, 0x2E97, 0x2E97, 0x562D,\n    0x2E98, 0x2E99, 0x57AE, 0x2E9B, 0x2EA6, 0x57B0, 0x2EA7, 0x2EA7, 0x563A,\n    0x2EA8, 0x2EA9, 0x57BC, 0x2EAA, 0x2EAA, 0x563D, 0x2EAB, 0x2EAD, 0x57BE,\n    0x2EAE, 0x2EAE, 0x5640, 0x2EAF, 0x2EB2, 0x57C1, 0x2EB3, 0x2EB3, 0x5642,\n    0x2EB4, 0x2EB5, 0x57C5, 0x2EB6, 0x2EB7, 0x5643, 0x2EB8, 0x2EBA, 0x57C7,\n    0x2EBB, 0x2EBB, 0x5648, 0x2EBC, 0x2EC9, 0x57CA, 0x2ECA, 0x2ECA, 0x5652,\n    0x2ECB, 0x2EF3, 0x57D8, 0x2F00, 0x2F00, 0x1042, 0x2F01, 0x2F01, 0x1263,\n    0x2F02, 0x2F02, 0x1272, 0x2F03, 0x2F03, 0x1265, 0x2F04, 0x2F04, 0x1059,\n    0x2F05, 0x2F05, 0x2793, 0x2F06, 0x2F06, 0x063D, 0x2F07, 0x2F07, 0x1303,\n    0x2F08, 0x2F08, 0x0CA6, 0x2F09, 0x2F09, 0x0638, 0x2F0A, 0x2F0A, 0x0CC6,\n    0x2F0B, 0x2F0B, 0x03D6, 0x2F0C, 0x2F0C, 0x129D, 0x2F0D, 0x2F0D, 0x1314,\n    0x2F0E, 0x2F0E, 0x130F, 0x2F0F, 0x2F0F, 0x082B, 0x2F10, 0x2F10, 0x1399,\n    0x2F11, 0x2F11, 0x0597, 0x2F12, 0x2F12, 0x09EF, 0x2F13, 0x2F13, 0x12FC,\n    0x2F14, 0x2F14, 0x1266, 0x2F15, 0x2F15, 0x1284, 0x2F16, 0x2F16, 0x2A1A,\n    0x2F17, 0x2F17, 0x0D45, 0x2F18, 0x2F18, 0x047E, 0x2F19, 0x2F19, 0x1352,\n    0x2F1A, 0x2F1A, 0x04CC, 0x2F1B, 0x2F1B, 0x139C, 0x2F1C, 0x2F1C, 0x10BB,\n    0x2F1D, 0x2F1D, 0x0967, 0x2F1E, 0x2F1E, 0x1593, 0x2F1F, 0x2F1F, 0x0E72,\n    0x2F20, 0x2F20, 0x0D56, 0x2F21, 0x2F21, 0x161C, 0x2F22, 0x2F22, 0x2D2D,\n    0x2F23, 0x2F23, 0x0F13, 0x2F24, 0x2F24, 0x0576, 0x2F25, 0x2F25, 0x0B6F,\n    0x2F26, 0x2F26, 0x1230, 0x2F27, 0x2F27, 0x172E, 0x2F28, 0x2F28, 0x056A,\n    0x2F29, 0x2F29, 0x0F6C, 0x2F2A, 0x2F2A, 0x14B6, 0x2F2B, 0x2F2B, 0x0D43,\n    0x2F2C, 0x2F2C, 0x1774, 0x2F2D, 0x2F2D, 0x0CF6, 0x2F2E, 0x2F2E, 0x1815,\n    0x2F2F, 0x2F2F, 0x06FD, 0x2F30, 0x2F30, 0x082D, 0x2F31, 0x2F31, 0x08BE,\n    0x2F32, 0x2F32, 0x06C4, 0x2F33, 0x2F33, 0x1813, 0x2F34, 0x2F34, 0x073C,\n    0x2F35, 0x2F35, 0x1398, 0x2F36, 0x2F36, 0x14AD, 0x2F37, 0x2F37, 0x14F6,\n    0x2F38, 0x2F38, 0x0706, 0x2F39, 0x2F39, 0x1762, 0x2F3A, 0x2F3A, 0x15EE,\n    0x2F3B, 0x2F3B, 0x15E0, 0x2F3C, 0x2F3C, 0x0F8F, 0x2F3D, 0x2F3D, 0x06E5,\n    0x2F3E, 0x2F3E, 0x3292, 0x2F3F, 0x2F3F, 0x0D6D, 0x2F40, 0x2F40, 0x11A6,\n    0x2F41, 0x2F41, 0x1909, 0x2F42, 0x2F42, 0x0ED3, 0x2F43, 0x2F43, 0x05F6,\n    0x2F44, 0x2F44, 0x08C0, 0x2F45, 0x2F45, 0x065A, 0x2F46, 0x2F46, 0x0EED,\n    0x2F47, 0x2F47, 0x0CB0, 0x2F48, 0x2F48, 0x10FE, 0x2F49, 0x2F49, 0x1105,\n    0x2F4A, 0x2F4A, 0x0B21, 0x2F4B, 0x2F4B, 0x0C34, 0x2F4C, 0x2F4C, 0x11B8,\n    0x2F4D, 0x2F4D, 0x0578, 0x2F4E, 0x2F4E, 0x19BD, 0x2F4F, 0x2F4F, 0x0EF2,\n    0x2F50, 0x2F50, 0x0431, 0x2F51, 0x2F51, 0x0AB0, 0x2F52, 0x2F52, 0x0D66,\n    0x2F53, 0x2F53, 0x0C17, 0x2F54, 0x2F54, 0x0DA3, 0x2F55, 0x2F55, 0x0805,\n    0x2F56, 0x2F56, 0x1203, 0x2F57, 0x2F57, 0x06B3, 0x2F58, 0x2F58, 0x1269,\n    0x2F59, 0x2F59, 0x169D, 0x2F5A, 0x2F5A, 0x0BCB, 0x2F5B, 0x2F5B, 0x0FE9,\n    0x2F5C, 0x2F5C, 0x0B64, 0x2F5D, 0x2F5D, 0x0C89, 0x2F5E, 0x2F5E, 0x0FC9,\n    0x2F5F, 0x2F5F, 0x10D6, 0x2F60, 0x2F60, 0x0728, 0x2F61, 0x2F61, 0x0E90,\n    0x2F62, 0x2F62, 0x06C5, 0x2F63, 0x2F63, 0x0D33, 0x2F64, 0x2F64, 0x10A8,\n    0x2F65, 0x2F65, 0x0E42, 0x2F66, 0x2F66, 0x1BC6, 0x2F67, 0x2F67, 0x1B60,\n    0x2F68, 0x2F68, 0x3EBF, 0x2F69, 0x2F69, 0x03E2, 0x2F6A, 0x2F6A, 0x0BC3,\n    0x2F6B, 0x2F6B, 0x0AF8, 0x2F6C, 0x2F6C, 0x0B22, 0x2F6D, 0x2F6D, 0x0AB1,\n    0x2F6E, 0x2F6E, 0x0D4F, 0x2F6F, 0x2F6F, 0x0D46, 0x2F70, 0x2F70, 0x0D55,\n    0x2F71, 0x2F71, 0x40CB, 0x2F72, 0x2F72, 0x0783, 0x2F73, 0x2F73, 0x0FD1,\n    0x2F74, 0x2F74, 0x09EB, 0x2F75, 0x2F75, 0x11F0, 0x2F76, 0x2F76, 0x0ADC,\n    0x2F77, 0x2F77, 0x1CE7, 0x2F78, 0x2F78, 0x1C5E, 0x2F79, 0x2F79, 0x0EA9,\n    0x2F7A, 0x2F7A, 0x101B, 0x2F7B, 0x2F7B, 0x10D5, 0x2F7C, 0x2F7C, 0x09BA,\n    0x2F7D, 0x2F7D, 0x0637, 0x2F7E, 0x2F7E, 0x1BCB, 0x2F7F, 0x2F7F, 0x0639,\n    0x2F80, 0x2F80, 0x1A1E, 0x2F81, 0x2F81, 0x0CBD, 0x2F82, 0x2F82, 0x04E1,\n    0x2F83, 0x2F83, 0x1231, 0x2F84, 0x2F84, 0x11C0, 0x2F85, 0x2F85, 0x08F9,\n    0x2F86, 0x2F86, 0x0D19, 0x2F87, 0x2F87, 0x1618, 0x2F88, 0x2F88, 0x11DA,\n    0x2F89, 0x2F89, 0x1CDC, 0x2F8A, 0x2F8A, 0x0CE4, 0x2F8B, 0x2F8B, 0x45A2,\n    0x2F8C, 0x2F8C, 0x1BF0, 0x2F8D, 0x2F8D, 0x050B, 0x2F8E, 0x2F8E, 0x0FD3,\n    0x2F8F, 0x2F8F, 0x0F9B, 0x2F90, 0x2F90, 0x1049, 0x2F91, 0x2F91, 0x49DC,\n    0x2F92, 0x2F92, 0x1F96, 0x2F93, 0x2F93, 0x0898, 0x2F94, 0x2F94, 0x0FFD,\n    0x2F95, 0x2F95, 0x0721, 0x2F96, 0x2F96, 0x05F8, 0x2F97, 0x2F97, 0x1D15,\n    0x2F98, 0x2F98, 0x1D50, 0x2F99, 0x2F99, 0x1E3B, 0x2F9A, 0x2F9A, 0x0505,\n    0x2F9B, 0x2F9B, 0x123C, 0x2F9C, 0x2F9C, 0x1240, 0x2F9D, 0x2F9D, 0x0D26,\n    0x2F9E, 0x2F9E, 0x1E7B, 0x2F9F, 0x2F9F, 0x0F8C, 0x2FA0, 0x2FA0, 0x04E2,\n    0x2FA1, 0x2FA1, 0x4D13, 0x2FA2, 0x2FA2, 0x105F, 0x2FA3, 0x2FA3, 0x10B4,\n    0x2FA4, 0x2FA4, 0x4E18, 0x2FA5, 0x2FA5, 0x09DA, 0x2FA6, 0x2FA6, 0x08C1,\n    0x2FA7, 0x2FA7, 0x1E75, 0x2FA8, 0x2FA8, 0x207D, 0x2FA9, 0x2FA9, 0x06B2,\n    0x2FAA, 0x2FAA, 0x09EE, 0x2FAB, 0x2FAB, 0x1D79, 0x2FAC, 0x2FAC, 0x10CF,\n    0x2FAD, 0x2FAD, 0x50EA, 0x2FAE, 0x2FAE, 0x0664, 0x2FAF, 0x2FAF, 0x0AEB,\n    0x2FB0, 0x2FB0, 0x06EA, 0x2FB1, 0x2FB1, 0x218D, 0x2FB2, 0x2FB2, 0x08F1,\n    0x2FB3, 0x2FB3, 0x107B, 0x2FB4, 0x2FB4, 0x2209, 0x2FB5, 0x2FB5, 0x1F00,\n    0x2FB6, 0x2FB6, 0x1EF4, 0x2FB7, 0x2FB7, 0x0D4A, 0x2FB8, 0x2FB8, 0x0D6E,\n    0x2FB9, 0x2FB9, 0x0F50, 0x2FBA, 0x2FBA, 0x206D, 0x2FBB, 0x2FBB, 0x0720,\n    0x2FBC, 0x2FBC, 0x06DA, 0x2FBD, 0x2FBD, 0x1DEC, 0x2FBE, 0x2FBE, 0x1ED0,\n    0x2FBF, 0x2FBF, 0x139B, 0x2FC0, 0x2FC0, 0x1260, 0x2FC1, 0x2FC1, 0x0746,\n    0x2FC2, 0x2FC2, 0x2239, 0x2FC3, 0x2FC3, 0x209C, 0x2FC4, 0x2FC4, 0x2688,\n    0x2FC5, 0x2FC5, 0x0A60, 0x2FC6, 0x2FC6, 0x2071, 0x2FC7, 0x2FC7, 0x0A90,\n    0x2FC8, 0x2FC8, 0x5586, 0x2FC9, 0x2FC9, 0x0D89, 0x2FCA, 0x2FCA, 0x0791,\n    0x2FCB, 0x2FCB, 0x1A55, 0x2FCC, 0x2FCC, 0x2618, 0x2FCD, 0x2FCD, 0x05E5,\n    0x2FCE, 0x2FCE, 0x071D, 0x2FCF, 0x2FCF, 0x0D8A, 0x2FD0, 0x2FD0, 0x0430,\n    0x2FD1, 0x2FD1, 0x20C6, 0x2FD2, 0x2FD2, 0x1E86, 0x2FD3, 0x2FD3, 0x2037,\n    0x2FD4, 0x2FD4, 0x1F34, 0x2FD5, 0x2FD5, 0x12F3, 0x2FF0, 0x2FFB, 0x274C,\n    0x3000, 0x3002, 0x0060, 0x3003, 0x3003, 0x0067, 0x3005, 0x3005, 0x0068,\n    0x3006, 0x3006, 0x2728, 0x3007, 0x3007, 0x1E17, 0x3008, 0x300F, 0x0073,\n    0x3010, 0x3011, 0x007D, 0x3012, 0x3012, 0x2705, 0x3013, 0x3013, 0x00BD,\n    0x3014, 0x3015, 0x0071, 0x3016, 0x3017, 0x007B, 0x301D, 0x301E, 0x2706,\n    0x3021, 0x3029, 0x2708, 0x3033, 0x3035, 0x577B, 0x3038, 0x303A, 0x577E,\n    0x303E, 0x303E, 0x274B, 0x303F, 0x303F, 0x5755, 0x3041, 0x3093, 0x0164,\n    0x3094, 0x3094, 0x5767, 0x309B, 0x309C, 0x2724, 0x309D, 0x309E, 0x2729,\n    0x30A1, 0x30F6, 0x01B7, 0x30F7, 0x30FA, 0x5776, 0x30FB, 0x30FB, 0x0063,\n    0x30FC, 0x30FC, 0x2723, 0x30FD, 0x30FE, 0x2726, 0x3105, 0x3129, 0x02BC,\n    0x312A, 0x312C, 0x5781, 0x31A0, 0x31B7, 0x5784, 0x3220, 0x3229, 0x00F0,\n    0x3231, 0x3231, 0x2721, 0x32A3, 0x32A3, 0x2711, 0x338E, 0x338F, 0x2712,\n    0x339C, 0x339E, 0x2714, 0x33A1, 0x33A1, 0x2717, 0x33C4, 0x33C4, 0x2718,\n    0x33CE, 0x33CE, 0x2719, 0x33D1, 0x33D2, 0x271A, 0x33D5, 0x33D5, 0x271C,\n    0x3400, 0x3446, 0x5801, 0x3447, 0x3447, 0x5625, 0x3448, 0x3472, 0x5848,\n    0x3473, 0x3473, 0x5624, 0x3474, 0x34FF, 0x5873, 0x3500, 0x359D, 0x58FF,\n    0x359E, 0x359E, 0x5629, 0x359F, 0x35FF, 0x599D, 0x3600, 0x360D, 0x59FE,\n    0x360E, 0x360E, 0x562B, 0x360F, 0x3619, 0x5A0C, 0x361A, 0x361A, 0x562A,\n    0x361B, 0x36FF, 0x5A17, 0x3700, 0x37FF, 0x5AFC, 0x3800, 0x38FF, 0x5BFC,\n    0x3900, 0x3917, 0x5CFC, 0x3918, 0x3918, 0x562F, 0x3919, 0x396D, 0x5D14,\n    0x396E, 0x396E, 0x562E, 0x396F, 0x39CE, 0x5D69, 0x39CF, 0x39CF, 0x5631,\n    0x39D0, 0x39D0, 0x5634, 0x39D1, 0x39DE, 0x5DC9, 0x39DF, 0x39DF, 0x5632,\n    0x39E0, 0x39FF, 0x5DD7, 0x3A00, 0x3A72, 0x5DF7, 0x3A73, 0x3A73, 0x5633,\n    0x3A74, 0x3AFF, 0x5E6A, 0x3B00, 0x3B4D, 0x5EF6, 0x3B4E, 0x3B4E, 0x5637,\n    0x3B4F, 0x3BFF, 0x5F44, 0x3C00, 0x3C6D, 0x5FF5, 0x3C6E, 0x3C6E, 0x5638,\n    0x3C6F, 0x3CDF, 0x6063, 0x3CE0, 0x3CE0, 0x5639, 0x3CE1, 0x3CFF, 0x60D4,\n    0x3D00, 0x3DFF, 0x60F3, 0x3E00, 0x3EFF, 0x61F3, 0x3F00, 0x3FFF, 0x62F3,\n    0x4000, 0x4055, 0x63F3, 0x4056, 0x4056, 0x563E, 0x4057, 0x40FF, 0x6449,\n    0x4100, 0x415E, 0x64F2, 0x415F, 0x415F, 0x563F, 0x4160, 0x41FF, 0x6551,\n    0x4200, 0x42FF, 0x65F1, 0x4300, 0x4336, 0x66F1, 0x4337, 0x4337, 0x5641,\n    0x4338, 0x43AB, 0x6728, 0x43AC, 0x43AC, 0x5647, 0x43AD, 0x43B0, 0x679C,\n    0x43B1, 0x43B1, 0x5646, 0x43B2, 0x43DC, 0x67A0, 0x43DD, 0x43DD, 0x5649,\n    0x43DE, 0x43FF, 0x67CB, 0x4400, 0x44D5, 0x67ED, 0x44D6, 0x44D6, 0x564A,\n    0x44D7, 0x44FF, 0x68C3, 0x4500, 0x45FF, 0x68EC, 0x4600, 0x464B, 0x69EC,\n    0x464C, 0x464C, 0x564C, 0x464D, 0x4660, 0x6A38, 0x4661, 0x4661, 0x564B,\n    0x4662, 0x46FF, 0x6A4C, 0x4700, 0x4722, 0x6AEA, 0x4723, 0x4723, 0x564E,\n    0x4724, 0x4728, 0x6B0D, 0x4729, 0x4729, 0x564F, 0x472A, 0x477B, 0x6B12,\n    0x477C, 0x477C, 0x5650, 0x477D, 0x478C, 0x6B64, 0x478D, 0x478D, 0x5651,\n    0x478E, 0x47FF, 0x6B74, 0x4800, 0x48FF, 0x6BE6, 0x4900, 0x4946, 0x6CE6,\n    0x4947, 0x4947, 0x5653, 0x4948, 0x4979, 0x6D2D, 0x497A, 0x497A, 0x5654,\n    0x497B, 0x497C, 0x6D5F, 0x497D, 0x497D, 0x5655, 0x497E, 0x4981, 0x6D61,\n    0x4982, 0x4983, 0x5656, 0x4984, 0x4984, 0x6D65, 0x4985, 0x4986, 0x5658,\n    0x4987, 0x499A, 0x6D66, 0x499B, 0x499B, 0x565B, 0x499C, 0x499E, 0x6D7A,\n    0x499F, 0x499F, 0x565A, 0x49A0, 0x49B5, 0x6D7D, 0x49B6, 0x49B6, 0x565D,\n    0x49B7, 0x49B7, 0x565C, 0x49B8, 0x49FF, 0x6D93, 0x4A00, 0x4AFF, 0x6DDB,\n    0x4B00, 0x4BFF, 0x6EDB, 0x4C00, 0x4C76, 0x6FDB, 0x4C77, 0x4C77, 0x5664,\n    0x4C78, 0x4C9E, 0x7052, 0x4C9F, 0x4CA1, 0x5661, 0x4CA2, 0x4CA2, 0x5665,\n    0x4CA3, 0x4CA3, 0x5660, 0x4CA4, 0x4CFF, 0x7079, 0x4D00, 0x4D12, 0x70D5,\n    0x4D13, 0x4D19, 0x5666, 0x4D1A, 0x4DAD, 0x70E8, 0x4DAE, 0x4DAE, 0x566D,\n    0x4DAF, 0x4DB5, 0x717C, 0x4E00, 0x4E00, 0x1042, 0x4E01, 0x4E01, 0x05E0,\n    0x4E02, 0x4E02, 0x2758, 0x4E03, 0x4E03, 0x0BFE, 0x4E04, 0x4E06, 0x2759,\n    0x4E07, 0x4E07, 0x0EA3, 0x4E08, 0x4E08, 0x116A, 0x4E09, 0x4E09, 0x0CD8,\n    0x4E0A, 0x4E0A, 0x0D08, 0x4E0B, 0x4E0B, 0x0F2F, 0x4E0C, 0x4E0C, 0x1258,\n    0x4E0D, 0x4E0D, 0x0482, 0x4E0E, 0x4E0E, 0x10D0, 0x4E0F, 0x4E0F, 0x275C,\n    0x4E10, 0x4E10, 0x125A, 0x4E11, 0x4E11, 0x0518, 0x4E12, 0x4E12, 0x275D,\n    0x4E13, 0x4E13, 0x1205, 0x4E14, 0x4E14, 0x0C4F, 0x4E15, 0x4E15, 0x125D,\n    0x4E16, 0x4E16, 0x0D57, 0x4E17, 0x4E17, 0x275E, 0x4E18, 0x4E18, 0x0C6D,\n    0x4E19, 0x4E19, 0x0464, 0x4E1A, 0x4E1A, 0x103C, 0x4E1B, 0x4E1B, 0x0557,\n    0x4E1C, 0x4E1C, 0x05EA, 0x4E1D, 0x4E1D, 0x0DB4, 0x4E1E, 0x4E1E, 0x125F,\n    0x4E1F, 0x4E21, 0x275F, 0x4E22, 0x4E22, 0x05E9, 0x4E23, 0x4E23, 0x2762,\n    0x4E24, 0x4E24, 0x0A06, 0x4E25, 0x4E25, 0x0FF8, 0x4E26, 0x4E26, 0x2763,\n    0x4E27, 0x4E27, 0x0CDE, 0x4E28, 0x4E28, 0x1263, 0x4E29, 0x4E29, 0x2764,\n    0x4E2A, 0x4E2A, 0x06F1, 0x4E2B, 0x4E2B, 0x0FE7, 0x4E2C, 0x4E2C, 0x169C,\n    0x4E2D, 0x4E2D, 0x11CF, 0x4E2E, 0x4E2F, 0x2765, 0x4E30, 0x4E30, 0x067E,\n    0x4E31, 0x4E31, 0x2767, 0x4E32, 0x4E32, 0x0531, 0x4E33, 0x4E33, 0x2768,\n    0x4E34, 0x4E34, 0x0A22, 0x4E35, 0x4E35, 0x2769, 0x4E36, 0x4E36, 0x1272,\n    0x4E37, 0x4E37, 0x276A, 0x4E38, 0x4E38, 0x0E99, 0x4E39, 0x4E39, 0x0585,\n    0x4E3A, 0x4E3A, 0x0EB9, 0x4E3B, 0x4E3B, 0x11F6, 0x4E3C, 0x4E3C, 0x276B,\n    0x4E3D, 0x4E3D, 0x09E1, 0x4E3E, 0x4E3E, 0x0908, 0x4E3F, 0x4E3F, 0x1265,\n    0x4E40, 0x4E42, 0x276C, 0x4E43, 0x4E43, 0x0B2E, 0x4E44, 0x4E44, 0x276F,\n    0x4E45, 0x4E45, 0x08F2, 0x4E46, 0x4E46, 0x2770, 0x4E47, 0x4E47, 0x1267,\n    0x4E48, 0x4E48, 0x0AB9, 0x4E49, 0x4E49, 0x106C, 0x4E4A, 0x4E4A, 0x2771,\n    0x4E4B, 0x4E4B, 0x11AD, 0x4E4C, 0x4E4C, 0x0EE9, 0x4E4D, 0x4E4D, 0x1148,\n    0x4E4E, 0x4E4E, 0x07AC, 0x4E4F, 0x4E4F, 0x0643, 0x4E50, 0x4E50, 0x09C1,\n    0x4E51, 0x4E51, 0x2772, 0x4E52, 0x4E52, 0x0BD8, 0x4E53, 0x4E53, 0x0B93,\n    0x4E54, 0x4E54, 0x0C44, 0x4E55, 0x4E55, 0x2773, 0x4E56, 0x4E56, 0x072D,\n    0x4E57, 0x4E57, 0x2774, 0x4E58, 0x4E58, 0x04F0, 0x4E59, 0x4E59, 0x1059,\n    0x4E5A, 0x4E5B, 0x2775, 0x4E5C, 0x4E5C, 0x1275, 0x4E5D, 0x4E5D, 0x08F4,\n    0x4E5E, 0x4E5E, 0x0C11, 0x4E5F, 0x4E5F, 0x1039, 0x4E60, 0x4E60, 0x0F1D,\n    0x4E61, 0x4E61, 0x0F54, 0x4E62, 0x4E65, 0x2777, 0x4E66, 0x4E66, 0x0D80,\n    0x4E67, 0x4E68, 0x277B, 0x4E69, 0x4E69, 0x1276, 0x4E6A, 0x4E6F, 0x277D,\n    0x4E70, 0x4E70, 0x0A99, 0x4E71, 0x4E71, 0x0A79, 0x4E72, 0x4E72, 0x2783,\n    0x4E73, 0x4E73, 0x0CC4, 0x4E74, 0x4E7D, 0x2784, 0x4E7E, 0x4E7E, 0x0C29,\n    0x4E7F, 0x4E81, 0x278E, 0x4E82, 0x4E82, 0x2059, 0x4E83, 0x4E85, 0x2791,\n    0x4E86, 0x4E86, 0x0A14, 0x4E87, 0x4E87, 0x2794, 0x4E88, 0x4E88, 0x10CD,\n    0x4E89, 0x4E89, 0x119A, 0x4E8A, 0x4E8A, 0x2795, 0x4E8B, 0x4E8B, 0x0D59,\n    0x4E8C, 0x4E8C, 0x063D, 0x4E8D, 0x4E8D, 0x1257, 0x4E8E, 0x4E8E, 0x10BF,\n    0x4E8F, 0x4E8F, 0x0984, 0x4E90, 0x4E90, 0x2796, 0x4E91, 0x4E91, 0x1109,\n    0x4E92, 0x4E92, 0x07BA, 0x4E93, 0x4E93, 0x1277, 0x4E94, 0x4E94, 0x0EF4,\n    0x4E95, 0x4E95, 0x08DD, 0x4E96, 0x4E97, 0x2797, 0x4E98, 0x4E98, 0x125E,\n    0x4E99, 0x4E99, 0x2799, 0x4E9A, 0x4E9A, 0x0FF0, 0x4E9B, 0x4E9B, 0x0F74,\n    0x4E9C, 0x4E9D, 0x279A, 0x4E9E, 0x4E9E, 0x21F1, 0x4E9F, 0x4E9F, 0x1273,\n    0x4EA0, 0x4EA0, 0x1303, 0x4EA1, 0x4EA1, 0x0EA7, 0x4EA2, 0x4EA2, 0x0947,\n    0x4EA3, 0x4EA3, 0x279C, 0x4EA4, 0x4EA4, 0x088C, 0x4EA5, 0x4EA5, 0x075C,\n    0x4EA6, 0x4EA6, 0x1067, 0x4EA7, 0x4EA7, 0x04C1, 0x4EA8, 0x4EA8, 0x0797,\n    0x4EA9, 0x4EA9, 0x0B19, 0x4EAA, 0x4EAA, 0x279D, 0x4EAB, 0x4EAB, 0x0F5A,\n    0x4EAC, 0x4EAC, 0x08D8, 0x4EAD, 0x4EAD, 0x0E55, 0x4EAE, 0x4EAE, 0x0A0A,\n    0x4EAF, 0x4EB1, 0x279E, 0x4EB2, 0x4EB2, 0x0C54, 0x4EB3, 0x4EB3, 0x1305,\n    0x4EB4, 0x4EB4, 0x27A1, 0x4EB5, 0x4EB5, 0x1308, 0x4EB6, 0x4EB9, 0x27A2,\n    0x4EBA, 0x4EBA, 0x0CA6, 0x4EBB, 0x4EBB, 0x129F, 0x4EBC, 0x4EBE, 0x27A6,\n    0x4EBF, 0x4EBF, 0x1061, 0x4EC0, 0x4EC0, 0x0D49, 0x4EC1, 0x4EC1, 0x0CA5,\n    0x4EC2, 0x4EC2, 0x12A2, 0x4EC3, 0x4EC3, 0x12A0, 0x4EC4, 0x4EC4, 0x127C,\n    0x4EC5, 0x4EC5, 0x08C7, 0x4EC6, 0x4EC6, 0x0BEC, 0x4EC7, 0x4EC7, 0x0515,\n    0x4EC8, 0x4EC8, 0x27A9, 0x4EC9, 0x4EC9, 0x12A1, 0x4ECA, 0x4ECA, 0x08C2,\n    0x4ECB, 0x4ECB, 0x08BA, 0x4ECC, 0x4ECC, 0x27AA, 0x4ECD, 0x4ECD, 0x0CAF,\n    0x4ECE, 0x4ECE, 0x0556, 0x4ECF, 0x4ED0, 0x27AB, 0x4ED1, 0x4ED1, 0x0A7F,\n    0x4ED2, 0x4ED2, 0x27AD, 0x4ED3, 0x4ED3, 0x049D, 0x4ED4, 0x4ED4, 0x122D,\n    0x4ED5, 0x4ED5, 0x0D62, 0x4ED6, 0x4ED6, 0x0DF0, 0x4ED7, 0x4ED7, 0x116D,\n    0x4ED8, 0x4ED8, 0x06B1, 0x4ED9, 0x4ED9, 0x0F36, 0x4EDA, 0x4EDC, 0x27AE,\n    0x4EDD, 0x4EDD, 0x12EE, 0x4EDE, 0x4EDE, 0x12A6, 0x4EDF, 0x4EDF, 0x0C27,\n    0x4EE0, 0x4EE0, 0x27B1, 0x4EE1, 0x4EE1, 0x12A4, 0x4EE2, 0x4EE2, 0x27B2,\n    0x4EE3, 0x4EE3, 0x057D, 0x4EE4, 0x4EE4, 0x0A37, 0x4EE5, 0x4EE5, 0x105B,\n    0x4EE6, 0x4EE7, 0x27B3, 0x4EE8, 0x4EE8, 0x12A3, 0x4EE9, 0x4EE9, 0x27B5,\n    0x4EEA, 0x4EEA, 0x104E, 0x4EEB, 0x4EEB, 0x12A5, 0x4EEC, 0x4EEC, 0x0ACC,\n    0x4EED, 0x4EEF, 0x27B6, 0x4EF0, 0x4EF0, 0x101F, 0x4EF1, 0x4EF1, 0x27B9,\n    0x4EF2, 0x4EF2, 0x11D8, 0x4EF3, 0x4EF3, 0x12A8, 0x4EF4, 0x4EF4, 0x27BA,\n    0x4EF5, 0x4EF5, 0x12AB, 0x4EF6, 0x4EF6, 0x0871, 0x4EF7, 0x4EF7, 0x084E,\n    0x4EF8, 0x4EFA, 0x27BB, 0x4EFB, 0x4EFB, 0x0CA9, 0x4EFC, 0x4EFC, 0x27BE,\n    0x4EFD, 0x4EFD, 0x067A, 0x4EFE, 0x4EFE, 0x27BF, 0x4EFF, 0x4EFF, 0x065F,\n    0x4F00, 0x4F00, 0x27C0, 0x4F01, 0x4F01, 0x0C12, 0x4F02, 0x4F08, 0x27C1,\n    0x4F09, 0x4F09, 0x12AE, 0x4F0A, 0x4F0A, 0x1048, 0x4F0B, 0x4F0C, 0x27C8,\n    0x4F0D, 0x4F0D, 0x0EF8, 0x4F0E, 0x4F0E, 0x0832, 0x4F0F, 0x4F0F, 0x0699,\n    0x4F10, 0x4F10, 0x0642, 0x4F11, 0x4F11, 0x0FA8, 0x4F12, 0x4F16, 0x27CA,\n    0x4F17, 0x4F17, 0x11D9, 0x4F18, 0x4F18, 0x10AA, 0x4F19, 0x4F19, 0x0804,\n    0x4F1A, 0x4F1A, 0x07F6, 0x4F1B, 0x4F1B, 0x12A7, 0x4F1C, 0x4F1D, 0x27CF,\n    0x4F1E, 0x4F1E, 0x0CDA, 0x4F1F, 0x4F1F, 0x0EBF, 0x4F20, 0x4F20, 0x052E,\n    0x4F21, 0x4F21, 0x27D1, 0x4F22, 0x4F22, 0x12A9, 0x4F23, 0x4F23, 0x27D2,\n    0x4F24, 0x4F24, 0x0D04, 0x4F25, 0x4F25, 0x12AC, 0x4F26, 0x4F26, 0x0A7E,\n    0x4F27, 0x4F27, 0x12AD, 0x4F28, 0x4F29, 0x27D3, 0x4F2A, 0x4F2A, 0x0EC0,\n    0x4F2B, 0x4F2B, 0x12AF, 0x4F2C, 0x4F2E, 0x27D5, 0x4F2F, 0x4F2F, 0x0475,\n    0x4F30, 0x4F30, 0x0719, 0x4F31, 0x4F31, 0x27D8, 0x4F32, 0x4F32, 0x12B7,\n    0x4F33, 0x4F33, 0x27D9, 0x4F34, 0x4F34, 0x03F4, 0x4F35, 0x4F35, 0x27DA,\n    0x4F36, 0x4F36, 0x0A2F, 0x4F37, 0x4F37, 0x27DB, 0x4F38, 0x4F38, 0x0D25,\n    0x4F39, 0x4F39, 0x27DC, 0x4F3A, 0x4F3A, 0x0DBA, 0x4F3B, 0x4F3B, 0x27DD,\n    0x4F3C, 0x4F3C, 0x0DBB, 0x4F3D, 0x4F3D, 0x12B8, 0x4F3E, 0x4F42, 0x27DE,\n    0x4F43, 0x4F43, 0x05C9, 0x4F44, 0x4F45, 0x27E3, 0x4F46, 0x4F46, 0x058C,\n    0x4F47, 0x4F4C, 0x27E5, 0x4F4D, 0x4F4D, 0x0ECA, 0x4F4E, 0x4F4E, 0x05AE,\n    0x4F4F, 0x4F4F, 0x11FE, 0x4F50, 0x4F50, 0x1251, 0x4F51, 0x4F51, 0x10B8,\n    0x4F52, 0x4F52, 0x27EB, 0x4F53, 0x4F53, 0x0E38, 0x4F54, 0x4F54, 0x27EC,\n    0x4F55, 0x4F55, 0x0785, 0x4F56, 0x4F56, 0x27ED, 0x4F57, 0x4F57, 0x12B6,\n    0x4F58, 0x4F58, 0x12F0, 0x4F59, 0x4F59, 0x10C5, 0x4F5A, 0x4F5A, 0x12B3,\n    0x4F5B, 0x4F5B, 0x068D, 0x4F5C, 0x4F5C, 0x1254, 0x4F5D, 0x4F5D, 0x12B4,\n    0x4F5E, 0x4F5E, 0x12B0, 0x4F5F, 0x4F5F, 0x12B5, 0x4F60, 0x4F60, 0x0B46,\n    0x4F61, 0x4F62, 0x27EE, 0x4F63, 0x4F63, 0x109B, 0x4F64, 0x4F64, 0x12AA,\n    0x4F65, 0x4F65, 0x12F1, 0x4F66, 0x4F66, 0x27F0, 0x4F67, 0x4F67, 0x12B1,\n    0x4F68, 0x4F68, 0x27F1, 0x4F69, 0x4F69, 0x0BA6, 0x4F6A, 0x4F6B, 0x27F2,\n    0x4F6C, 0x4F6C, 0x09BB, 0x4F6D, 0x4F6E, 0x27F4, 0x4F6F, 0x4F6F, 0x1019,\n    0x4F70, 0x4F70, 0x03E6, 0x4F71, 0x4F72, 0x27F6, 0x4F73, 0x4F73, 0x0844,\n    0x4F74, 0x4F74, 0x12BA, 0x4F75, 0x4F75, 0x27F8, 0x4F76, 0x4F76, 0x12B9,\n    0x4F77, 0x4F7A, 0x27F9, 0x4F7B, 0x4F7B, 0x12C0, 0x4F7C, 0x4F7C, 0x12C2,\n    0x4F7D, 0x4F7D, 0x27FD, 0x4F7E, 0x4F7E, 0x12BF, 0x4F7F, 0x4F7F, 0x0D50,\n    0x4F80, 0x4F82, 0x27FE, 0x4F83, 0x4F83, 0x12BD, 0x4F84, 0x4F84, 0x11B5,\n    0x4F85, 0x4F85, 0x2801, 0x4F86, 0x4F86, 0x1FF2, 0x4F87, 0x4F87, 0x2802,\n    0x4F88, 0x4F88, 0x0503, 0x4F89, 0x4F89, 0x12BC, 0x4F8A, 0x4F8A, 0x2803,\n    0x4F8B, 0x4F8B, 0x09E8, 0x4F8C, 0x4F8C, 0x2804, 0x4F8D, 0x4F8D, 0x0D63,\n    0x4F8E, 0x4F8E, 0x2805, 0x4F8F, 0x4F8F, 0x12BE, 0x4F90, 0x4F90, 0x2806,\n    0x4F91, 0x4F91, 0x12BB, 0x4F92, 0x4F93, 0x2807, 0x4F94, 0x4F94, 0x12C4,\n    0x4F95, 0x4F95, 0x2809, 0x4F96, 0x4F96, 0x205D, 0x4F97, 0x4F97, 0x05F0,\n    0x4F98, 0x4F9A, 0x280A, 0x4F9B, 0x4F9B, 0x0702, 0x4F9C, 0x4F9C, 0x280D,\n    0x4F9D, 0x4F9D, 0x1047, 0x4F9E, 0x4F9F, 0x280E, 0x4FA0, 0x4FA0, 0x0F2D,\n    0x4FA1, 0x4FA2, 0x2810, 0x4FA3, 0x4FA3, 0x0A69, 0x4FA4, 0x4FA4, 0x2812,\n    0x4FA5, 0x4FA5, 0x0895, 0x4FA6, 0x4FA6, 0x118D, 0x4FA7, 0x4FA7, 0x04A7,\n    0x4FA8, 0x4FA8, 0x0C45, 0x4FA9, 0x4FA9, 0x0978, 0x4FAA, 0x4FAA, 0x12C1,\n    0x4FAB, 0x4FAB, 0x2813, 0x4FAC, 0x4FAC, 0x12C3, 0x4FAD, 0x4FAD, 0x2814,\n    0x4FAE, 0x4FAE, 0x0EF9, 0x4FAF, 0x4FAF, 0x07A5, 0x4FB0, 0x4FB4, 0x2815,\n    0x4FB5, 0x4FB5, 0x0C53, 0x4FB6, 0x4FBE, 0x281A, 0x4FBF, 0x4FBF, 0x044C,\n    0x4FC0, 0x4FC1, 0x2823, 0x4FC2, 0x4FC2, 0x269C, 0x4FC3, 0x4FC3, 0x055C,\n    0x4FC4, 0x4FC4, 0x062C, 0x4FC5, 0x4FC5, 0x12C8, 0x4FC6, 0x4FC9, 0x2825,\n    0x4FCA, 0x4FCA, 0x092E, 0x4FCB, 0x4FCD, 0x2829, 0x4FCE, 0x4FCE, 0x12F2,\n    0x4FCF, 0x4FCF, 0x0C4B, 0x4FD0, 0x4FD0, 0x09E9, 0x4FD1, 0x4FD1, 0x12CC,\n    0x4FD2, 0x4FD6, 0x282C, 0x4FD7, 0x4FD7, 0x0DCC, 0x4FD8, 0x4FD8, 0x069A,\n    0x4FD9, 0x4FD9, 0x2831, 0x4FDA, 0x4FDA, 0x12C9, 0x4FDB, 0x4FDB, 0x2832,\n    0x4FDC, 0x4FDC, 0x12CB, 0x4FDD, 0x4FDD, 0x040C, 0x4FDE, 0x4FDE, 0x10C6,\n    0x4FDF, 0x4FDF, 0x12CD, 0x4FE0, 0x4FE0, 0x21B5, 0x4FE1, 0x4FE1, 0x0F90,\n    0x4FE2, 0x4FE2, 0x2833, 0x4FE3, 0x4FE3, 0x12CA, 0x4FE4, 0x4FE5, 0x2834,\n    0x4FE6, 0x4FE6, 0x12C5, 0x4FE7, 0x4FE7, 0x2836, 0x4FE8, 0x4FE8, 0x12C6,\n    0x4FE9, 0x4FE9, 0x09F2, 0x4FEA, 0x4FEA, 0x12C7, 0x4FEB, 0x4FEC, 0x2837,\n    0x4FED, 0x4FED, 0x0866, 0x4FEE, 0x4FEE, 0x0FA9, 0x4FEF, 0x4FEF, 0x06A4,\n    0x4FF0, 0x4FF0, 0x2839, 0x4FF1, 0x4FF1, 0x0912, 0x4FF2, 0x4FF2, 0x283A,\n    0x4FF3, 0x4FF3, 0x12D1, 0x4FF4, 0x4FF7, 0x283B, 0x4FF8, 0x4FF8, 0x12CE,\n    0x4FF9, 0x4FF9, 0x283F, 0x4FFA, 0x4FFA, 0x03BE, 0x4FFB, 0x4FFD, 0x2840,\n    0x4FFE, 0x4FFE, 0x12D6, 0x4FFF, 0x4FFF, 0x2843, 0x5000, 0x5000, 0x22CC,\n    0x5001, 0x5005, 0x2844, 0x5006, 0x5006, 0x2016, 0x5007, 0x5008, 0x2849,\n    0x5009, 0x5009, 0x1E62, 0x500A, 0x500A, 0x284B, 0x500B, 0x500B, 0x1F20,\n    0x500C, 0x500C, 0x12D8, 0x500D, 0x500D, 0x041F, 0x500E, 0x500E, 0x284C,\n    0x500F, 0x500F, 0x12D3, 0x5010, 0x5010, 0x284D, 0x5011, 0x5011, 0x207F,\n    0x5012, 0x5012, 0x059A, 0x5013, 0x5013, 0x284E, 0x5014, 0x5014, 0x0922,\n    0x5015, 0x5017, 0x284F, 0x5018, 0x5018, 0x0E1B, 0x5019, 0x5019, 0x07A9,\n    0x501A, 0x501A, 0x1057, 0x501B, 0x501B, 0x2852, 0x501C, 0x501C, 0x12D7,\n    0x501D, 0x501E, 0x2853, 0x501F, 0x501F, 0x08B9, 0x5020, 0x5020, 0x2855,\n    0x5021, 0x5021, 0x04D0, 0x5022, 0x5024, 0x2856, 0x5025, 0x5025, 0x12D9,\n    0x5026, 0x5026, 0x091A, 0x5027, 0x5027, 0x2859, 0x5028, 0x5028, 0x12DA,\n    0x5029, 0x5029, 0x12CF, 0x502A, 0x502A, 0x0B42, 0x502B, 0x502B, 0x205C,\n    0x502C, 0x502C, 0x12D2, 0x502D, 0x502D, 0x12D5, 0x502E, 0x502E, 0x12D4,\n    0x502F, 0x5039, 0x285A, 0x503A, 0x503A, 0x114F, 0x503B, 0x503B, 0x2865,\n    0x503C, 0x503C, 0x11B4, 0x503D, 0x503D, 0x2866, 0x503E, 0x503E, 0x0C60,\n    0x503F, 0x5042, 0x2867, 0x5043, 0x5043, 0x12DC, 0x5044, 0x5046, 0x286B,\n    0x5047, 0x5047, 0x084C, 0x5048, 0x5048, 0x12DE, 0x5049, 0x5049, 0x2194,\n    0x504A, 0x504B, 0x286E, 0x504C, 0x504C, 0x12D0, 0x504D, 0x504D, 0x2870,\n    0x504E, 0x504E, 0x12DF, 0x504F, 0x504F, 0x0BCA, 0x5050, 0x5054, 0x2871,\n    0x5055, 0x5055, 0x12DD, 0x5056, 0x5059, 0x2876, 0x505A, 0x505A, 0x1253,\n    0x505B, 0x505B, 0x287A, 0x505C, 0x505C, 0x0E54, 0x505D, 0x5064, 0x287B,\n    0x5065, 0x5065, 0x0872, 0x5066, 0x506B, 0x2883, 0x506C, 0x506C, 0x12E0,\n    0x506D, 0x5073, 0x2889, 0x5074, 0x5074, 0x1E65, 0x5075, 0x5075, 0x2281,\n    0x5076, 0x5076, 0x0B7D, 0x5077, 0x5077, 0x0E66, 0x5078, 0x507A, 0x2890,\n    0x507B, 0x507B, 0x12E1, 0x507C, 0x507D, 0x2893, 0x507E, 0x507E, 0x12DB,\n    0x507F, 0x507F, 0x04CA, 0x5080, 0x5080, 0x098B, 0x5081, 0x5084, 0x2895,\n    0x5085, 0x5085, 0x06B0, 0x5086, 0x5087, 0x2899, 0x5088, 0x5088, 0x09E7,\n    0x5089, 0x508C, 0x289B, 0x508D, 0x508D, 0x0403, 0x508E, 0x5095, 0x289F,\n    0x5096, 0x5096, 0x22CD, 0x5097, 0x5097, 0x28A7, 0x5098, 0x5098, 0x210A,\n    0x5099, 0x5099, 0x1E3E, 0x509A, 0x50A1, 0x28A8, 0x50A2, 0x50A2, 0x267F,\n    0x50A3, 0x50A3, 0x0579, 0x50A4, 0x50A4, 0x28B0, 0x50A5, 0x50A5, 0x12E2,\n    0x50A6, 0x50A6, 0x28B1, 0x50A7, 0x50A7, 0x12E3, 0x50A8, 0x50A8, 0x0525,\n    0x50A9, 0x50A9, 0x12E4, 0x50AA, 0x50AB, 0x28B2, 0x50AC, 0x50AC, 0x0562,\n    0x50AD, 0x50AD, 0x222E, 0x50AE, 0x50B1, 0x28B4, 0x50B2, 0x50B2, 0x03CC,\n    0x50B3, 0x50B3, 0x1E96, 0x50B4, 0x50B4, 0x22CB, 0x50B5, 0x50B5, 0x226C,\n    0x50B6, 0x50B6, 0x28B8, 0x50B7, 0x50B7, 0x2117, 0x50B8, 0x50B9, 0x28B9,\n    0x50BA, 0x50BA, 0x12E5, 0x50BB, 0x50BB, 0x0CEE, 0x50BC, 0x50BD, 0x28BB,\n    0x50BE, 0x50BE, 0x20E8, 0x50BF, 0x50C1, 0x28BD, 0x50C2, 0x50C2, 0x22D4,\n    0x50C3, 0x50C4, 0x28C0, 0x50C5, 0x50C5, 0x1FB9, 0x50C6, 0x50C8, 0x28C2,\n    0x50C9, 0x50C9, 0x22D8, 0x50CA, 0x50CE, 0x28C5, 0x50CF, 0x50CF, 0x0F5E,\n    0x50D0, 0x50D0, 0x28CA, 0x50D1, 0x50D1, 0x20DF, 0x50D2, 0x50D4, 0x28CB,\n    0x50D5, 0x50D5, 0x20C2, 0x50D6, 0x50D6, 0x12E6, 0x50D7, 0x50D9, 0x28CE,\n    0x50DA, 0x50DA, 0x0A0E, 0x50DB, 0x50DD, 0x28D1, 0x50DE, 0x50DE, 0x2195,\n    0x50DF, 0x50E4, 0x28D4, 0x50E5, 0x50E5, 0x1FAC, 0x50E6, 0x50E6, 0x12EA,\n    0x50E7, 0x50E7, 0x0CE7, 0x50E8, 0x50E8, 0x22D3, 0x50E9, 0x50EB, 0x28DA,\n    0x50EC, 0x50EC, 0x12E9, 0x50ED, 0x50ED, 0x12E8, 0x50EE, 0x50EE, 0x12EB,\n    0x50EF, 0x50F2, 0x28DD, 0x50F3, 0x50F3, 0x0DD0, 0x50F4, 0x50F4, 0x28E1,\n    0x50F5, 0x50F5, 0x087A, 0x50F6, 0x50F8, 0x28E2, 0x50F9, 0x50F9, 0x1F81,\n    0x50FA, 0x50FA, 0x28E5, 0x50FB, 0x50FB, 0x0BC6, 0x50FC, 0x50FF, 0x28E6,\n    0x5100, 0x5100, 0x2210, 0x5101, 0x5101, 0x28EA, 0x5102, 0x5102, 0x22CF,\n    0x5103, 0x5103, 0x28EB, 0x5104, 0x5104, 0x2213, 0x5105, 0x5105, 0x28EC,\n    0x5106, 0x5106, 0x12E7, 0x5107, 0x5107, 0x12EC, 0x5108, 0x5108, 0x1FE4,\n    0x5109, 0x5109, 0x1F90, 0x510A, 0x510A, 0x28ED, 0x510B, 0x510B, 0x12ED,\n    0x510C, 0x510F, 0x28EE, 0x5110, 0x5110, 0x22D6, 0x5111, 0x5111, 0x28F2,\n    0x5112, 0x5112, 0x0CC0, 0x5113, 0x5113, 0x28F3, 0x5114, 0x5114, 0x22D0,\n    0x5115, 0x5115, 0x22CE, 0x5116, 0x5117, 0x28F4, 0x5118, 0x5118, 0x2681,\n    0x5119, 0x511E, 0x28F6, 0x511F, 0x511F, 0x1E76, 0x5120, 0x5120, 0x28FC,\n    0x5121, 0x5121, 0x09C7, 0x5122, 0x5129, 0x28FD, 0x512A, 0x512A, 0x2231,\n    0x512B, 0x5131, 0x2905, 0x5132, 0x5132, 0x1E93, 0x5133, 0x5136, 0x290C,\n    0x5137, 0x5137, 0x22D2, 0x5138, 0x5139, 0x2910, 0x513A, 0x513A, 0x22D7,\n    0x513B, 0x513B, 0x22D5, 0x513C, 0x513C, 0x22D1, 0x513D, 0x513E, 0x2912,\n    0x513F, 0x513F, 0x0638, 0x5140, 0x5140, 0x1259, 0x5141, 0x5141, 0x110D,\n    0x5142, 0x5142, 0x2914, 0x5143, 0x5143, 0x10ED, 0x5144, 0x5144, 0x0FA1,\n    0x5145, 0x5145, 0x0509, 0x5146, 0x5146, 0x1178, 0x5147, 0x5147, 0x2915,\n    0x5148, 0x5148, 0x0F35, 0x5149, 0x5149, 0x073B, 0x514A, 0x514A, 0x2916,\n    0x514B, 0x514B, 0x0958, 0x514C, 0x514C, 0x2917, 0x514D, 0x514D, 0x0AE7,\n    0x514E, 0x5150, 0x2918, 0x5151, 0x5151, 0x0611, 0x5152, 0x5152, 0x1EE5,\n    0x5153, 0x5153, 0x291B, 0x5154, 0x5154, 0x0E74, 0x5155, 0x5155, 0x1302,\n    0x5156, 0x5156, 0x1304, 0x5157, 0x5159, 0x291C, 0x515A, 0x515A, 0x0594,\n    0x515B, 0x515B, 0x291F, 0x515C, 0x515C, 0x05F4, 0x515D, 0x5161, 0x2920,\n    0x5162, 0x5162, 0x08D3, 0x5163, 0x5164, 0x2925, 0x5165, 0x5165, 0x0CC6,\n    0x5166, 0x5167, 0x2927, 0x5168, 0x5168, 0x0C86, 0x5169, 0x5169, 0x2025,\n    0x516A, 0x516A, 0x2929, 0x516B, 0x516B, 0x03D6, 0x516C, 0x516C, 0x0704,\n    0x516D, 0x516D, 0x0A42, 0x516E, 0x516E, 0x12F6, 0x516F, 0x516F, 0x292A,\n    0x5170, 0x5170, 0x09A7, 0x5171, 0x5171, 0x070B, 0x5172, 0x5172, 0x292B,\n    0x5173, 0x5173, 0x0731, 0x5174, 0x5174, 0x0F96, 0x5175, 0x5175, 0x0461,\n    0x5176, 0x5176, 0x0C03, 0x5177, 0x5177, 0x090E, 0x5178, 0x5178, 0x05C5,\n    0x5179, 0x5179, 0x1225, 0x517A, 0x517A, 0x292C, 0x517B, 0x517B, 0x1021,\n    0x517C, 0x517C, 0x0859, 0x517D, 0x517D, 0x0D75, 0x517E, 0x517F, 0x292D,\n    0x5180, 0x5180, 0x0830, 0x5181, 0x5181, 0x12FA, 0x5182, 0x5182, 0x129D,\n    0x5183, 0x5184, 0x292F, 0x5185, 0x5185, 0x0B3D, 0x5186, 0x5187, 0x2931,\n    0x5188, 0x5188, 0x06CF, 0x5189, 0x5189, 0x0C98, 0x518A, 0x518B, 0x2933,\n    0x518C, 0x518C, 0x04A8, 0x518D, 0x518D, 0x111C, 0x518E, 0x5191, 0x2935,\n    0x5192, 0x5192, 0x0AB5, 0x5193, 0x5194, 0x2939, 0x5195, 0x5195, 0x0AE6,\n    0x5196, 0x5196, 0x1314, 0x5197, 0x5197, 0x0CBA, 0x5198, 0x5198, 0x293B,\n    0x5199, 0x5199, 0x0F7F, 0x519A, 0x519A, 0x293C, 0x519B, 0x519B, 0x092B,\n    0x519C, 0x519C, 0x0B6A, 0x519D, 0x519F, 0x293D, 0x51A0, 0x51A0, 0x0733,\n    0x51A1, 0x51A1, 0x2940, 0x51A2, 0x51A2, 0x1315, 0x51A3, 0x51A3, 0x2941,\n    0x51A4, 0x51A4, 0x10EC, 0x51A5, 0x51A5, 0x1316, 0x51A6, 0x51AA, 0x2942,\n    0x51AB, 0x51AB, 0x130F, 0x51AC, 0x51AC, 0x05EB, 0x51AD, 0x51AE, 0x2947,\n    0x51AF, 0x51AF, 0x0688, 0x51B0, 0x51B0, 0x0462, 0x51B1, 0x51B1, 0x1310,\n    0x51B2, 0x51B2, 0x050A, 0x51B3, 0x51B3, 0x0925, 0x51B4, 0x51B4, 0x2949,\n    0x51B5, 0x51B5, 0x0983, 0x51B6, 0x51B6, 0x1038, 0x51B7, 0x51B7, 0x09CF,\n    0x51B8, 0x51BA, 0x294A, 0x51BB, 0x51BB, 0x05F2, 0x51BC, 0x51BC, 0x1312,\n    0x51BD, 0x51BD, 0x1311, 0x51BE, 0x51BF, 0x294D, 0x51C0, 0x51C0, 0x08EA,\n    0x51C1, 0x51C3, 0x294F, 0x51C4, 0x51C4, 0x0BFF, 0x51C5, 0x51C5, 0x2952,\n    0x51C6, 0x51C6, 0x1219, 0x51C7, 0x51C7, 0x1313, 0x51C8, 0x51C8, 0x2953,\n    0x51C9, 0x51C9, 0x0A02, 0x51CA, 0x51CA, 0x2954, 0x51CB, 0x51CB, 0x05D3,\n    0x51CC, 0x51CC, 0x0A31, 0x51CD, 0x51CD, 0x1ECF, 0x51CE, 0x51CE, 0x2955,\n    0x51CF, 0x51CF, 0x0868, 0x51D0, 0x51D0, 0x2956, 0x51D1, 0x51D1, 0x0558,\n    0x51D2, 0x51DA, 0x2957, 0x51DB, 0x51DB, 0x0A26, 0x51DC, 0x51DC, 0x2960,\n    0x51DD, 0x51DD, 0x0B60, 0x51DE, 0x51DF, 0x2961, 0x51E0, 0x51E0, 0x082B,\n    0x51E1, 0x51E1, 0x064F, 0x51E2, 0x51E3, 0x2963, 0x51E4, 0x51E4, 0x068C,\n    0x51E5, 0x51EA, 0x2965, 0x51EB, 0x51EB, 0x1300, 0x51EC, 0x51EC, 0x296B,\n    0x51ED, 0x51ED, 0x0BDD, 0x51EE, 0x51EE, 0x296C, 0x51EF, 0x51EF, 0x093A,\n    0x51F0, 0x51F0, 0x07E0, 0x51F1, 0x51F1, 0x1FD9, 0x51F2, 0x51F2, 0x296D,\n    0x51F3, 0x51F3, 0x05AB, 0x51F4, 0x51F4, 0x296E, 0x51F5, 0x51F5, 0x1399,\n    0x51F6, 0x51F6, 0x0FA2, 0x51F7, 0x51F7, 0x296F, 0x51F8, 0x51F8, 0x0E6A,\n    0x51F9, 0x51F9, 0x03C7, 0x51FA, 0x51FA, 0x051B, 0x51FB, 0x51FB, 0x080C,\n    0x51FC, 0x51FC, 0x139A, 0x51FD, 0x51FD, 0x0766, 0x51FE, 0x51FE, 0x2970,\n    0x51FF, 0x51FF, 0x1127, 0x5200, 0x5200, 0x0597, 0x5201, 0x5201, 0x05D4,\n    0x5202, 0x5202, 0x128C, 0x5203, 0x5203, 0x0CAB, 0x5204, 0x5205, 0x2971,\n    0x5206, 0x5206, 0x0673, 0x5207, 0x5207, 0x0C4D, 0x5208, 0x5208, 0x128D,\n    0x5209, 0x5209, 0x2973, 0x520A, 0x520A, 0x093C, 0x520B, 0x520C, 0x2974,\n    0x520D, 0x520D, 0x138B, 0x520E, 0x520E, 0x128E, 0x520F, 0x5210, 0x2976,\n    0x5211, 0x5211, 0x0F97, 0x5212, 0x5212, 0x07C3, 0x5213, 0x5215, 0x2978,\n    0x5216, 0x5216, 0x196E, 0x5217, 0x5217, 0x0A19, 0x5218, 0x5218, 0x0A3E,\n    0x5219, 0x5219, 0x1135, 0x521A, 0x521A, 0x06D0, 0x521B, 0x521B, 0x0537,\n    0x521C, 0x521C, 0x297B, 0x521D, 0x521D, 0x051A, 0x521E, 0x521F, 0x297C,\n    0x5220, 0x5220, 0x0CF7, 0x5221, 0x5223, 0x297E, 0x5224, 0x5224, 0x0B91,\n    0x5225, 0x5227, 0x2981, 0x5228, 0x5228, 0x0B9A, 0x5229, 0x5229, 0x09E6,\n    0x522A, 0x522A, 0x2984, 0x522B, 0x522B, 0x0459, 0x522C, 0x522C, 0x2985,\n    0x522D, 0x522D, 0x128F, 0x522E, 0x522E, 0x0727, 0x522F, 0x522F, 0x2986,\n    0x5230, 0x5230, 0x059E, 0x5231, 0x5232, 0x2987, 0x5233, 0x5233, 0x1290,\n    0x5234, 0x5235, 0x2989, 0x5236, 0x5236, 0x11C5, 0x5237, 0x5237, 0x0D97,\n    0x5238, 0x5238, 0x0C8A, 0x5239, 0x5239, 0x0CEB, 0x523A, 0x523A, 0x054F,\n    0x523B, 0x523B, 0x0959, 0x523C, 0x523C, 0x298B, 0x523D, 0x523D, 0x074D,\n    0x523E, 0x523E, 0x298C, 0x523F, 0x5240, 0x1291, 0x5241, 0x5241, 0x0626,\n    0x5242, 0x5242, 0x0834, 0x5243, 0x5243, 0x0E3D, 0x5244, 0x5244, 0x22C8,\n    0x5245, 0x5246, 0x298D, 0x5247, 0x5247, 0x2263, 0x5248, 0x5249, 0x298F,\n    0x524A, 0x524A, 0x0F64, 0x524B, 0x524B, 0x2683, 0x524C, 0x524C, 0x1293,\n    0x524D, 0x524D, 0x0C2D, 0x524E, 0x524F, 0x2991, 0x5250, 0x5250, 0x0729,\n    0x5251, 0x5251, 0x0874, 0x5252, 0x5253, 0x2993, 0x5254, 0x5254, 0x0E31,\n    0x5255, 0x5255, 0x2995, 0x5256, 0x5256, 0x0BE9, 0x5257, 0x525A, 0x2996,\n    0x525B, 0x525B, 0x1F17, 0x525C, 0x525C, 0x1296, 0x525D, 0x525D, 0x299A,\n    0x525E, 0x525E, 0x1294, 0x525F, 0x5260, 0x299B, 0x5261, 0x5261, 0x1295,\n    0x5262, 0x5264, 0x299D, 0x5265, 0x5265, 0x0409, 0x5266, 0x5266, 0x29A0,\n    0x5267, 0x5267, 0x0916, 0x5268, 0x5268, 0x29A1, 0x5269, 0x5269, 0x0D3A,\n    0x526A, 0x526A, 0x0867, 0x526B, 0x526D, 0x29A2, 0x526E, 0x526E, 0x1F2B,\n    0x526F, 0x526F, 0x06AC, 0x5270, 0x5271, 0x29A5, 0x5272, 0x5272, 0x06E9,\n    0x5273, 0x5273, 0x29A7, 0x5274, 0x5274, 0x22CA, 0x5275, 0x5275, 0x1E99,\n    0x5276, 0x527C, 0x29A8, 0x527D, 0x527D, 0x1298, 0x527E, 0x527E, 0x29AF,\n    0x527F, 0x527F, 0x089C, 0x5280, 0x5280, 0x29B0, 0x5281, 0x5281, 0x129A,\n    0x5282, 0x5282, 0x1299, 0x5283, 0x5283, 0x1F4F, 0x5284, 0x5286, 0x29B1,\n    0x5287, 0x5287, 0x1FCF, 0x5288, 0x5288, 0x0BBD, 0x5289, 0x5289, 0x2036,\n    0x528A, 0x528A, 0x1F3A, 0x528B, 0x528B, 0x29B4, 0x528C, 0x528C, 0x22C9,\n    0x528D, 0x528D, 0x1F99, 0x528E, 0x528F, 0x29B5, 0x5290, 0x5290, 0x129B,\n    0x5291, 0x5291, 0x1F75, 0x5292, 0x5292, 0x29B7, 0x5293, 0x5293, 0x129C,\n    0x5294, 0x529A, 0x29B8, 0x529B, 0x529B, 0x09EF, 0x529C, 0x529C, 0x29BF,\n    0x529D, 0x529D, 0x0C8B, 0x529E, 0x529E, 0x03F7, 0x529F, 0x529F, 0x06FF,\n    0x52A0, 0x52A0, 0x0846, 0x52A1, 0x52A1, 0x0F00, 0x52A2, 0x52A2, 0x138D,\n    0x52A3, 0x52A3, 0x0A1C, 0x52A4, 0x52A7, 0x29C0, 0x52A8, 0x52A8, 0x05EE,\n    0x52A9, 0x52A9, 0x11F9, 0x52AA, 0x52AA, 0x0B6D, 0x52AB, 0x52AB, 0x08AA,\n    0x52AC, 0x52AD, 0x138E, 0x52AE, 0x52B0, 0x29C4, 0x52B1, 0x52B1, 0x09E3,\n    0x52B2, 0x52B2, 0x08D1, 0x52B3, 0x52B3, 0x09B8, 0x52B4, 0x52BD, 0x29C7,\n    0x52BE, 0x52BE, 0x1390, 0x52BF, 0x52BF, 0x0D5D, 0x52C0, 0x52C0, 0x29D1,\n    0x52C1, 0x52C1, 0x1FBE, 0x52C2, 0x52C2, 0x29D2, 0x52C3, 0x52C3, 0x0471,\n    0x52C4, 0x52C6, 0x29D3, 0x52C7, 0x52C7, 0x10A7, 0x52C8, 0x52C8, 0x29D6,\n    0x52C9, 0x52C9, 0x0AE8, 0x52CA, 0x52CA, 0x29D7, 0x52CB, 0x52CB, 0x0FD4,\n    0x52CC, 0x52CF, 0x29D8, 0x52D0, 0x52D0, 0x1392, 0x52D1, 0x52D1, 0x29DC,\n    0x52D2, 0x52D2, 0x09C0, 0x52D3, 0x52D4, 0x29DD, 0x52D5, 0x52D5, 0x1ECD,\n    0x52D6, 0x52D6, 0x1393, 0x52D7, 0x52D7, 0x29DF, 0x52D8, 0x52D8, 0x093E,\n    0x52D9, 0x52D9, 0x21A9, 0x52DA, 0x52DA, 0x29E0, 0x52DB, 0x52DB, 0x21E6,\n    0x52DC, 0x52DC, 0x29E1, 0x52DD, 0x52DD, 0x2127, 0x52DE, 0x52DE, 0x2003,\n    0x52DF, 0x52DF, 0x0B1F, 0x52E0, 0x52E1, 0x29E2, 0x52E2, 0x52E2, 0x2132,\n    0x52E3, 0x52E3, 0x29E4, 0x52E4, 0x52E4, 0x0C57, 0x52E5, 0x52EF, 0x29E5,\n    0x52F0, 0x52F0, 0x1394, 0x52F1, 0x52F1, 0x2323, 0x52F2, 0x52F4, 0x29F0,\n    0x52F5, 0x52F5, 0x2011, 0x52F6, 0x52F7, 0x29F3, 0x52F8, 0x52F8, 0x20F5,\n    0x52F9, 0x52F9, 0x12FC, 0x52FA, 0x52FA, 0x0D10, 0x52FB, 0x52FD, 0x29F5,\n    0x52FE, 0x52FE, 0x070D, 0x52FF, 0x52FF, 0x0EFF, 0x5300, 0x5300, 0x110B,\n    0x5301, 0x5304, 0x29F8, 0x5305, 0x5305, 0x0407, 0x5306, 0x5306, 0x0555,\n    0x5307, 0x5307, 0x29FC, 0x5308, 0x5308, 0x0FA4, 0x5309, 0x530C, 0x29FD,\n    0x530D, 0x530D, 0x12FD, 0x530E, 0x530E, 0x2A01, 0x530F, 0x530F, 0x14B5,\n    0x5310, 0x5310, 0x12FF, 0x5311, 0x5314, 0x2A02, 0x5315, 0x5315, 0x1266,\n    0x5316, 0x5316, 0x07C4, 0x5317, 0x5317, 0x041A, 0x5318, 0x5318, 0x2A06,\n    0x5319, 0x5319, 0x04FC, 0x531A, 0x531A, 0x1284, 0x531B, 0x531C, 0x2A07,\n    0x531D, 0x531D, 0x1114, 0x531E, 0x531F, 0x2A09, 0x5320, 0x5320, 0x0884,\n    0x5321, 0x5321, 0x097C, 0x5322, 0x5322, 0x2A0B, 0x5323, 0x5323, 0x0F28,\n    0x5324, 0x5325, 0x2A0C, 0x5326, 0x5326, 0x1286, 0x5327, 0x5329, 0x2A0E,\n    0x532A, 0x532A, 0x0668, 0x532B, 0x532C, 0x2A11, 0x532D, 0x532D, 0x22C5,\n    0x532E, 0x532E, 0x1287, 0x532F, 0x532F, 0x1F5E, 0x5330, 0x5330, 0x2A13,\n    0x5331, 0x5331, 0x22C6, 0x5332, 0x5338, 0x2A14, 0x5339, 0x5339, 0x0BC4,\n    0x533A, 0x533A, 0x0C75, 0x533B, 0x533B, 0x1044, 0x533C, 0x533D, 0x2A1B,\n    0x533E, 0x533E, 0x1288, 0x533F, 0x533F, 0x0B47, 0x5340, 0x5340, 0x20EF,\n    0x5341, 0x5341, 0x0D45, 0x5342, 0x5342, 0x2A1D, 0x5343, 0x5343, 0x0C24,\n    0x5344, 0x5344, 0x2A1E, 0x5345, 0x5345, 0x125C, 0x5346, 0x5346, 0x2A1F,\n    0x5347, 0x5347, 0x0D36, 0x5348, 0x5348, 0x0EF6, 0x5349, 0x5349, 0x07F1,\n    0x534A, 0x534A, 0x03F6, 0x534B, 0x534D, 0x2A20, 0x534E, 0x534E, 0x07BF,\n    0x534F, 0x534F, 0x0F78, 0x5350, 0x5350, 0x2A23, 0x5351, 0x5351, 0x0419,\n    0x5352, 0x5352, 0x1241, 0x5353, 0x5353, 0x121C, 0x5354, 0x5354, 0x21D0,\n    0x5355, 0x5355, 0x0586, 0x5356, 0x5356, 0x0A9B, 0x5357, 0x5357, 0x0B32,\n    0x5358, 0x5359, 0x2A24, 0x535A, 0x535A, 0x0470, 0x535B, 0x535B, 0x2A26,\n    0x535C, 0x535C, 0x047E, 0x535D, 0x535D, 0x2A27, 0x535E, 0x535E, 0x044E,\n    0x535F, 0x535F, 0x14FA, 0x5360, 0x5360, 0x115D, 0x5361, 0x5361, 0x0935,\n    0x5362, 0x5362, 0x0A53, 0x5363, 0x5363, 0x128B, 0x5364, 0x5364, 0x0A58,\n    0x5365, 0x5365, 0x2A28, 0x5366, 0x5366, 0x128A, 0x5367, 0x5367, 0x0EE3,\n    0x5368, 0x5368, 0x2A29, 0x5369, 0x5369, 0x1352, 0x536A, 0x536A, 0x2A2A,\n    0x536B, 0x536B, 0x0ECF, 0x536C, 0x536D, 0x2A2B, 0x536E, 0x536E, 0x126A,\n    0x536F, 0x536F, 0x0AB3, 0x5370, 0x5370, 0x1086, 0x5371, 0x5371, 0x0EB2,\n    0x5372, 0x5372, 0x2A2D, 0x5373, 0x5373, 0x0827, 0x5374, 0x5374, 0x0C8F,\n    0x5375, 0x5375, 0x0A78, 0x5376, 0x5376, 0x2A2E, 0x5377, 0x5377, 0x091C,\n    0x5378, 0x5378, 0x0F81, 0x5379, 0x5379, 0x2A2F, 0x537A, 0x537A, 0x1353,\n    0x537B, 0x537E, 0x2A30, 0x537F, 0x537F, 0x0C61, 0x5380, 0x5381, 0x2A34,\n    0x5382, 0x5382, 0x04CC, 0x5383, 0x5383, 0x2A36, 0x5384, 0x5384, 0x0631,\n    0x5385, 0x5385, 0x0E4F, 0x5386, 0x5386, 0x09E5, 0x5387, 0x5388, 0x2A37,\n    0x5389, 0x5389, 0x09E2, 0x538A, 0x538A, 0x2A39, 0x538B, 0x538B, 0x0FE2,\n    0x538C, 0x538C, 0x100A, 0x538D, 0x538D, 0x127D, 0x538E, 0x5394, 0x2A3A,\n    0x5395, 0x5395, 0x04A5, 0x5396, 0x5397, 0x2A41, 0x5398, 0x5398, 0x09D0,\n    0x5399, 0x5399, 0x22C1, 0x539A, 0x539A, 0x07A8, 0x539B, 0x539C, 0x2A43,\n    0x539D, 0x539D, 0x127E, 0x539E, 0x539E, 0x2A45, 0x539F, 0x539F, 0x10F0,\n    0x53A0, 0x53A0, 0x1E64, 0x53A1, 0x53A1, 0x2A46, 0x53A2, 0x53A2, 0x0F4E,\n    0x53A3, 0x53A3, 0x127F, 0x53A4, 0x53A4, 0x2A47, 0x53A5, 0x53A5, 0x1280,\n    0x53A6, 0x53A6, 0x0F30, 0x53A7, 0x53A7, 0x2A48, 0x53A8, 0x53A8, 0x051D,\n    0x53A9, 0x53A9, 0x08F6, 0x53AA, 0x53AC, 0x2A49, 0x53AD, 0x53AD, 0x21F9,\n    0x53AE, 0x53AE, 0x1281, 0x53AF, 0x53B1, 0x2A4C, 0x53B2, 0x53B2, 0x2010,\n    0x53B3, 0x53B3, 0x2A4F, 0x53B4, 0x53B4, 0x22C2, 0x53B5, 0x53B5, 0x2A50,\n    0x53B6, 0x53B6, 0x139C, 0x53B7, 0x53BA, 0x2A51, 0x53BB, 0x53BB, 0x0C80,\n    0x53BC, 0x53BE, 0x2A55, 0x53BF, 0x53BF, 0x0F45, 0x53C0, 0x53C0, 0x2A58,\n    0x53C1, 0x53C1, 0x0CD9, 0x53C2, 0x53C2, 0x0495, 0x53C3, 0x53C3, 0x1E5A,\n    0x53C4, 0x53C7, 0x2A59, 0x53C8, 0x53C8, 0x10BB, 0x53C9, 0x53C9, 0x04AD,\n    0x53CA, 0x53CA, 0x0823, 0x53CB, 0x53CB, 0x10B6, 0x53CC, 0x53CC, 0x0DA0,\n    0x53CD, 0x53CD, 0x0651, 0x53CE, 0x53D0, 0x2A5D, 0x53D1, 0x53D1, 0x063F,\n    0x53D2, 0x53D3, 0x2A60, 0x53D4, 0x53D4, 0x0D7C, 0x53D5, 0x53D5, 0x2A62,\n    0x53D6, 0x53D6, 0x0C7C, 0x53D7, 0x53D7, 0x0D73, 0x53D8, 0x53D8, 0x044D,\n    0x53D9, 0x53D9, 0x0FBB, 0x53DA, 0x53DA, 0x2A63, 0x53DB, 0x53DB, 0x0B92,\n    0x53DC, 0x53DE, 0x2A64, 0x53DF, 0x53DF, 0x1395, 0x53E0, 0x53E0, 0x05DF,\n    0x53E1, 0x53E1, 0x2A67, 0x53E2, 0x53E2, 0x1EA2, 0x53E3, 0x53E3, 0x0967,\n    0x53E4, 0x53E4, 0x071E, 0x53E5, 0x53E5, 0x0913, 0x53E6, 0x53E6, 0x0A36,\n    0x53E7, 0x53E7, 0x2A68, 0x53E8, 0x53E8, 0x14FE, 0x53E9, 0x53E9, 0x14FD,\n    0x53EA, 0x53EA, 0x11BA, 0x53EB, 0x53EB, 0x08A1, 0x53EC, 0x53EC, 0x117A,\n    0x53ED, 0x53ED, 0x03D3, 0x53EE, 0x53EE, 0x05E2, 0x53EF, 0x53EF, 0x0956,\n    0x53F0, 0x53F0, 0x0DFB, 0x53F1, 0x53F1, 0x14FB, 0x53F2, 0x53F2, 0x0D4E,\n    0x53F3, 0x53F3, 0x10B7, 0x53F4, 0x53F4, 0x2A69, 0x53F5, 0x53F5, 0x1285,\n    0x53F6, 0x53F6, 0x103D, 0x53F7, 0x53F7, 0x077C, 0x53F8, 0x53F8, 0x0DB3,\n    0x53F9, 0x53F9, 0x0E11, 0x53FA, 0x53FA, 0x2A6A, 0x53FB, 0x53FB, 0x14FF,\n    0x53FC, 0x53FC, 0x05D1, 0x53FD, 0x53FD, 0x14FC, 0x53FE, 0x53FF, 0x2A6B,\n    0x5400, 0x5400, 0x2A6D, 0x5401, 0x5401, 0x10DA, 0x5402, 0x5402, 0x2A6E,\n    0x5403, 0x5403, 0x04F9, 0x5404, 0x5404, 0x06F2, 0x5405, 0x5405, 0x2A6F,\n    0x5406, 0x5406, 0x1502, 0x5407, 0x5407, 0x2A70, 0x5408, 0x5408, 0x0786,\n    0x5409, 0x5409, 0x081D, 0x540A, 0x540A, 0x05D6, 0x540B, 0x540B, 0x2A71,\n    0x540C, 0x540C, 0x0E5D, 0x540D, 0x540D, 0x0B00, 0x540E, 0x540E, 0x07AA,\n    0x540F, 0x540F, 0x09DF, 0x5410, 0x5410, 0x0E73, 0x5411, 0x5411, 0x0F5F,\n    0x5412, 0x5412, 0x1500, 0x5413, 0x5413, 0x0F32, 0x5414, 0x5414, 0x2A72,\n    0x5415, 0x5415, 0x0A67, 0x5416, 0x5416, 0x1501, 0x5417, 0x5417, 0x0A97,\n    0x5418, 0x541A, 0x2A73, 0x541B, 0x541B, 0x092C, 0x541C, 0x541C, 0x2A76,\n    0x541D, 0x541D, 0x0A28, 0x541E, 0x541E, 0x0E7D, 0x541F, 0x541F, 0x107E,\n    0x5420, 0x5420, 0x066A, 0x5421, 0x5421, 0x1509, 0x5422, 0x5422, 0x2A77,\n    0x5423, 0x5423, 0x150C, 0x5424, 0x5425, 0x2A78, 0x5426, 0x5426, 0x068E,\n    0x5427, 0x5427, 0x03D4, 0x5428, 0x5428, 0x0615, 0x5429, 0x5429, 0x0671,\n    0x542A, 0x542A, 0x2A7A, 0x542B, 0x542B, 0x0763, 0x542C, 0x542C, 0x0E50,\n    0x542D, 0x542D, 0x0961, 0x542E, 0x542E, 0x0DA6, 0x542F, 0x542F, 0x0C13,\n    0x5430, 0x5430, 0x2A7B, 0x5431, 0x5431, 0x11A7, 0x5432, 0x5432, 0x150D,\n    0x5433, 0x5433, 0x2A7C, 0x5434, 0x5434, 0x0EF1, 0x5435, 0x5435, 0x04D8,\n    0x5436, 0x5437, 0x2A7D, 0x5438, 0x5438, 0x0F0B, 0x5439, 0x5439, 0x0538,\n    0x543A, 0x543A, 0x2A7F, 0x543B, 0x543B, 0x0ED6, 0x543C, 0x543C, 0x07A7,\n    0x543D, 0x543D, 0x2A80, 0x543E, 0x543E, 0x0EF0, 0x543F, 0x543F, 0x2A81,\n    0x5440, 0x5440, 0x0FE6, 0x5441, 0x5442, 0x2A82, 0x5443, 0x5443, 0x1508,\n    0x5444, 0x5445, 0x2A84, 0x5446, 0x5446, 0x0577, 0x5447, 0x5447, 0x2A86,\n    0x5448, 0x5448, 0x04EF, 0x5449, 0x5449, 0x2A87, 0x544A, 0x544A, 0x06E1,\n    0x544B, 0x544B, 0x1503, 0x544C, 0x544F, 0x2A88, 0x5450, 0x5450, 0x0B28,\n    0x5451, 0x5451, 0x2A8C, 0x5452, 0x5454, 0x1504, 0x5455, 0x5455, 0x0B7C,\n    0x5456, 0x5456, 0x1507, 0x5457, 0x5457, 0x150A, 0x5458, 0x5458, 0x10F4,\n    0x5459, 0x5459, 0x150B, 0x545A, 0x545A, 0x2A8D, 0x545B, 0x545B, 0x0C37,\n    0x545C, 0x545C, 0x0EE7, 0x545D, 0x5461, 0x2A8E, 0x5462, 0x5462, 0x0B3B,\n    0x5463, 0x5463, 0x2A93, 0x5464, 0x5464, 0x1512, 0x5465, 0x5465, 0x2A94,\n    0x5466, 0x5466, 0x1517, 0x5467, 0x5467, 0x2A95, 0x5468, 0x5468, 0x11DB,\n    0x5469, 0x5470, 0x2A96, 0x5471, 0x5471, 0x1511, 0x5472, 0x5472, 0x1522,\n    0x5473, 0x5473, 0x0EC5, 0x5474, 0x5474, 0x2A9E, 0x5475, 0x5475, 0x077E,\n    0x5476, 0x5476, 0x1516, 0x5477, 0x5477, 0x1510, 0x5478, 0x5478, 0x0B9F,\n    0x5479, 0x547A, 0x2A9F, 0x547B, 0x547B, 0x0D24, 0x547C, 0x547C, 0x07AB,\n    0x547D, 0x547D, 0x0B01, 0x547E, 0x547F, 0x2AA1, 0x5480, 0x5480, 0x0906,\n    0x5481, 0x5481, 0x2AA3, 0x5482, 0x5482, 0x150E, 0x5483, 0x5483, 0x2AA4,\n    0x5484, 0x5484, 0x1515, 0x5485, 0x5485, 0x2AA5, 0x5486, 0x5486, 0x0B99,\n    0x5487, 0x548A, 0x2AA6, 0x548B, 0x548B, 0x1147, 0x548C, 0x548C, 0x0784,\n    0x548D, 0x548D, 0x2AAA, 0x548E, 0x548E, 0x08FB, 0x548F, 0x548F, 0x10A2,\n    0x5490, 0x5490, 0x06BB, 0x5491, 0x5491, 0x2AAB, 0x5492, 0x5492, 0x11E3,\n    0x5493, 0x5493, 0x2AAC, 0x5494, 0x5494, 0x150F, 0x5495, 0x5495, 0x0717,\n    0x5496, 0x5496, 0x0934, 0x5497, 0x5498, 0x2AAD, 0x5499, 0x5499, 0x0A45,\n    0x549A, 0x549B, 0x1513, 0x549C, 0x549C, 0x2AAF, 0x549D, 0x549D, 0x1518,\n    0x549E, 0x54A2, 0x2AB0, 0x54A3, 0x54A3, 0x1523, 0x54A4, 0x54A4, 0x152D,\n    0x54A5, 0x54A5, 0x2AB5, 0x54A6, 0x54A6, 0x151F, 0x54A7, 0x54A7, 0x151E,\n    0x54A8, 0x54A8, 0x1226, 0x54A9, 0x54AA, 0x152B, 0x54AB, 0x54AB, 0x1767,\n    0x54AC, 0x54AC, 0x102E, 0x54AD, 0x54AD, 0x151A, 0x54AE, 0x54AE, 0x2AB6,\n    0x54AF, 0x54AF, 0x0936, 0x54B0, 0x54B0, 0x2AB7, 0x54B1, 0x54B1, 0x111E,\n    0x54B2, 0x54B2, 0x2AB8, 0x54B3, 0x54B3, 0x0955, 0x54B4, 0x54B4, 0x151C,\n    0x54B5, 0x54B7, 0x2AB9, 0x54B8, 0x54B8, 0x0F39, 0x54B9, 0x54BA, 0x2ABC,\n    0x54BB, 0x54BB, 0x1525, 0x54BC, 0x54BC, 0x236D, 0x54BD, 0x54BD, 0x0FF3,\n    0x54BE, 0x54BE, 0x2ABE, 0x54BF, 0x54BF, 0x1526, 0x54C0, 0x54C0, 0x03B2,\n    0x54C1, 0x54C1, 0x0BD6, 0x54C2, 0x54C2, 0x151B, 0x54C3, 0x54C3, 0x2ABF,\n    0x54C4, 0x54C4, 0x079C, 0x54C5, 0x54C5, 0x2AC0, 0x54C6, 0x54C6, 0x061E,\n    0x54C7, 0x54C7, 0x0E8C, 0x54C8, 0x54C8, 0x0757, 0x54C9, 0x54C9, 0x1118,\n    0x54CA, 0x54CB, 0x2AC1, 0x54CC, 0x54CC, 0x1527, 0x54CD, 0x54CD, 0x0F59,\n    0x54CE, 0x54CE, 0x03B0, 0x54CF, 0x54CF, 0x152F, 0x54D0, 0x54D0, 0x1519,\n    0x54D1, 0x54D1, 0x0FEF, 0x54D2, 0x54D2, 0x151D, 0x54D3, 0x54D4, 0x1520,\n    0x54D5, 0x54D5, 0x1524, 0x54D6, 0x54D6, 0x2AC3, 0x54D7, 0x54D7, 0x07BE,\n    0x54D8, 0x54D8, 0x2AC4, 0x54D9, 0x54DA, 0x1528, 0x54DB, 0x54DB, 0x2AC5,\n    0x54DC, 0x54DC, 0x152A, 0x54DD, 0x54DD, 0x152E, 0x54DE, 0x54DE, 0x1530,\n    0x54DF, 0x54DF, 0x1099, 0x54E0, 0x54E0, 0x2AC6, 0x54E1, 0x54E1, 0x2247,\n    0x54E2, 0x54E4, 0x2AC7, 0x54E5, 0x54E5, 0x06E2, 0x54E6, 0x54E6, 0x0B77,\n    0x54E7, 0x54E7, 0x1532, 0x54E8, 0x54E8, 0x0D13, 0x54E9, 0x54E9, 0x09F1,\n    0x54EA, 0x54EA, 0x0B27, 0x54EB, 0x54EC, 0x2ACA, 0x54ED, 0x54ED, 0x096B,\n    0x54EE, 0x54EE, 0x0F65, 0x54EF, 0x54F1, 0x2ACC, 0x54F2, 0x54F2, 0x117D,\n    0x54F3, 0x54F3, 0x1536, 0x54F4, 0x54F9, 0x2ACF, 0x54FA, 0x54FA, 0x047F,\n    0x54FB, 0x54FB, 0x2AD5, 0x54FC, 0x54FC, 0x0796, 0x54FD, 0x54FD, 0x1534,\n    0x54FE, 0x54FE, 0x2AD6, 0x54FF, 0x54FF, 0x1391, 0x5500, 0x5500, 0x2AD7,\n    0x5501, 0x5501, 0x100D, 0x5502, 0x5503, 0x2AD8, 0x5504, 0x5504, 0x236C,\n    0x5505, 0x5505, 0x2ADA, 0x5506, 0x5506, 0x0DE9, 0x5507, 0x5507, 0x0540,\n    0x5508, 0x5508, 0x2ADB, 0x5509, 0x5509, 0x03B1, 0x550A, 0x550E, 0x2ADC,\n    0x550F, 0x550F, 0x1539, 0x5510, 0x5510, 0x0E19, 0x5511, 0x5511, 0x153A,\n    0x5512, 0x5513, 0x2AE1, 0x5514, 0x5514, 0x1535, 0x5515, 0x551A, 0x2AE3,\n    0x551B, 0x551B, 0x1531, 0x551C, 0x551F, 0x2AE9, 0x5520, 0x5520, 0x1533,\n    0x5521, 0x5521, 0x2AED, 0x5522, 0x5523, 0x1537, 0x5524, 0x5524, 0x07D2,\n    0x5525, 0x5526, 0x2AEE, 0x5527, 0x5527, 0x153B, 0x5528, 0x5529, 0x2AF0,\n    0x552A, 0x552A, 0x153C, 0x552B, 0x552B, 0x2AF2, 0x552C, 0x552C, 0x07B8,\n    0x552D, 0x552D, 0x2AF3, 0x552E, 0x552E, 0x0D72, 0x552F, 0x552F, 0x0EB7,\n    0x5530, 0x5530, 0x154D, 0x5531, 0x5531, 0x04CF, 0x5532, 0x5532, 0x2AF4,\n    0x5533, 0x5533, 0x154C, 0x5534, 0x5536, 0x2AF5, 0x5537, 0x5537, 0x1547,\n    0x5538, 0x553B, 0x2AF8, 0x553C, 0x553C, 0x1546, 0x553D, 0x553D, 0x2AFC,\n    0x553E, 0x553E, 0x0E8A, 0x553F, 0x553F, 0x1544, 0x5540, 0x5540, 0x2AFD,\n    0x5541, 0x5541, 0x1542, 0x5542, 0x5542, 0x2AFE, 0x5543, 0x5543, 0x095D,\n    0x5544, 0x5544, 0x1221, 0x5545, 0x5545, 0x2AFF, 0x5546, 0x5546, 0x0D05,\n    0x5547, 0x5548, 0x2B00, 0x5549, 0x5549, 0x1540, 0x554A, 0x554A, 0x03AC,\n    0x554B, 0x554E, 0x2B02, 0x554F, 0x554F, 0x219C, 0x5550, 0x5550, 0x1545,\n    0x5551, 0x5552, 0x2B06, 0x5553, 0x5553, 0x20C9, 0x5554, 0x5554, 0x2B08,\n    0x5555, 0x5555, 0x1543, 0x5556, 0x5556, 0x1548, 0x5557, 0x555B, 0x2B09,\n    0x555C, 0x555C, 0x154E, 0x555D, 0x555D, 0x2B0E, 0x555E, 0x555E, 0x21F0,\n    0x555F, 0x5560, 0x2B0F, 0x5561, 0x5561, 0x0665, 0x5562, 0x5563, 0x2B11,\n    0x5564, 0x5564, 0x0BC0, 0x5565, 0x5565, 0x0CEF, 0x5566, 0x5566, 0x099D,\n    0x5567, 0x5567, 0x153D, 0x5568, 0x5569, 0x2B13, 0x556A, 0x556A, 0x0B7F,\n    0x556B, 0x556B, 0x2B15, 0x556C, 0x556C, 0x127A, 0x556D, 0x556D, 0x1541,\n    0x556E, 0x556E, 0x0B59, 0x556F, 0x5574, 0x2B16, 0x5575, 0x5577, 0x1549,\n    0x5578, 0x5578, 0x0F70, 0x5579, 0x557A, 0x2B1C, 0x557B, 0x557B, 0x155A,\n    0x557C, 0x557C, 0x0E37, 0x557D, 0x557D, 0x2B1E, 0x557E, 0x557E, 0x1557,\n    0x557F, 0x557F, 0x2B1F, 0x5580, 0x5580, 0x0933, 0x5581, 0x5581, 0x1555,\n    0x5582, 0x5582, 0x0EC8, 0x5583, 0x5583, 0x1551, 0x5584, 0x5584, 0x0CFF,\n    0x5585, 0x5586, 0x2B20, 0x5587, 0x5587, 0x0999, 0x5588, 0x5588, 0x1554,\n    0x5589, 0x5589, 0x07A4, 0x558A, 0x558A, 0x0767, 0x558B, 0x558B, 0x154F,\n    0x558C, 0x558E, 0x2B22, 0x558F, 0x558F, 0x153E, 0x5590, 0x5590, 0x2B25,\n    0x5591, 0x5591, 0x1559, 0x5592, 0x5593, 0x2B26, 0x5594, 0x5594, 0x155E,\n    0x5595, 0x5597, 0x2B28, 0x5598, 0x5598, 0x0530, 0x5599, 0x5599, 0x155F,\n    0x559A, 0x559B, 0x2B2B, 0x559C, 0x559C, 0x0F1F, 0x559D, 0x559D, 0x077F,\n    0x559E, 0x559E, 0x2B2D, 0x559F, 0x559F, 0x1556, 0x55A0, 0x55A6, 0x2B2E,\n    0x55A7, 0x55A7, 0x0FC5, 0x55A8, 0x55A9, 0x2B35, 0x55AA, 0x55AA, 0x210B,\n    0x55AB, 0x55AB, 0x2B37, 0x55AC, 0x55AC, 0x20DE, 0x55AD, 0x55AD, 0x2B38,\n    0x55AE, 0x55AE, 0x1EAA, 0x55AF, 0x55B0, 0x2B39, 0x55B1, 0x55B1, 0x1552,\n    0x55B2, 0x55B2, 0x222C, 0x55B3, 0x55B3, 0x113E, 0x55B4, 0x55B4, 0x2B3B,\n    0x55B5, 0x55B5, 0x153F, 0x55B6, 0x55B6, 0x2B3C, 0x55B7, 0x55B7, 0x0BA8,\n    0x55B8, 0x55B8, 0x2B3D, 0x55B9, 0x55B9, 0x1553, 0x55BA, 0x55BA, 0x2B3E,\n    0x55BB, 0x55BB, 0x10DC, 0x55BC, 0x55BC, 0x2B3F, 0x55BD, 0x55BE, 0x155C,\n    0x55BF, 0x55C3, 0x2B40, 0x55C4, 0x55C4, 0x156A, 0x55C5, 0x55C5, 0x0FAC,\n    0x55C6, 0x55C6, 0x20D8, 0x55C7, 0x55C7, 0x22C0, 0x55C8, 0x55C8, 0x2B45,\n    0x55C9, 0x55C9, 0x1562, 0x55CA, 0x55CB, 0x2B46, 0x55CC, 0x55CD, 0x156F,\n    0x55CE, 0x55CE, 0x206F, 0x55CF, 0x55D0, 0x2B48, 0x55D1, 0x55D1, 0x1564,\n    0x55D2, 0x55D2, 0x1550, 0x55D3, 0x55D3, 0x0CDD, 0x55D4, 0x55D4, 0x1567,\n    0x55D5, 0x55D5, 0x2B4A, 0x55D6, 0x55D6, 0x1558, 0x55D7, 0x55D9, 0x2B4B,\n    0x55DA, 0x55DA, 0x21A1, 0x55DB, 0x55DB, 0x2B4E, 0x55DC, 0x55DC, 0x0D5F,\n    0x55DD, 0x55DD, 0x1569, 0x55DE, 0x55DE, 0x2B4F, 0x55DF, 0x55DF, 0x155B,\n    0x55E0, 0x55E0, 0x2B50, 0x55E1, 0x55E1, 0x0EDA, 0x55E2, 0x55E2, 0x2B51,\n    0x55E3, 0x55E3, 0x0DB8, 0x55E4, 0x55E4, 0x1573, 0x55E5, 0x55E5, 0x156C,\n    0x55E6, 0x55E6, 0x1568, 0x55E7, 0x55E7, 0x2B52, 0x55E8, 0x55E8, 0x1571,\n    0x55E9, 0x55E9, 0x2379, 0x55EA, 0x55EA, 0x1560, 0x55EB, 0x55EC, 0x1565,\n    0x55ED, 0x55EE, 0x2B53, 0x55EF, 0x55EF, 0x156B, 0x55F0, 0x55F1, 0x2B55,\n    0x55F2, 0x55F3, 0x156D, 0x55F4, 0x55F4, 0x2B57, 0x55F5, 0x55F5, 0x1572,\n    0x55F6, 0x55F6, 0x2372, 0x55F7, 0x55F7, 0x1561, 0x55F8, 0x55FC, 0x2B58,\n    0x55FD, 0x55FD, 0x0DC9, 0x55FE, 0x55FE, 0x157B, 0x55FF, 0x55FF, 0x2B5D,\n    0x5600, 0x5600, 0x157C, 0x5601, 0x5601, 0x1578, 0x5602, 0x5605, 0x2B5E,\n    0x5606, 0x5606, 0x216A, 0x5607, 0x5607, 0x2B62, 0x5608, 0x5608, 0x1576,\n    0x5609, 0x5609, 0x0841, 0x560A, 0x560B, 0x2B63, 0x560C, 0x560C, 0x1577,\n    0x560D, 0x560D, 0x237C, 0x560E, 0x560E, 0x06BD, 0x560F, 0x560F, 0x127B,\n    0x5610, 0x5613, 0x2B65, 0x5614, 0x5614, 0x20B0, 0x5615, 0x5615, 0x2B69,\n    0x5616, 0x5616, 0x237A, 0x5617, 0x5617, 0x1E74, 0x5618, 0x5618, 0x0FB5,\n    0x5619, 0x561A, 0x2B6A, 0x561B, 0x561B, 0x0A96, 0x561C, 0x561C, 0x2377,\n    0x561D, 0x561D, 0x2B6C, 0x561E, 0x561E, 0x1575, 0x561F, 0x561F, 0x1563,\n    0x5620, 0x5622, 0x2B6D, 0x5623, 0x5623, 0x157A, 0x5624, 0x5624, 0x1579,\n    0x5625, 0x5626, 0x2B70, 0x5627, 0x5627, 0x157D, 0x5628, 0x5628, 0x2B72,\n    0x5629, 0x5629, 0x1F4C, 0x562A, 0x562B, 0x2B73, 0x562C, 0x562C, 0x1582,\n    0x562D, 0x562D, 0x157E, 0x562E, 0x562E, 0x2378, 0x562F, 0x562F, 0x21CF,\n    0x5630, 0x5630, 0x2368, 0x5631, 0x5631, 0x11F5, 0x5632, 0x5632, 0x04D5,\n    0x5633, 0x5633, 0x2B75, 0x5634, 0x5634, 0x1249, 0x5635, 0x5635, 0x2371,\n    0x5636, 0x5636, 0x0DB0, 0x5637, 0x5637, 0x2B76, 0x5638, 0x5638, 0x2369,\n    0x5639, 0x5639, 0x1580, 0x563A, 0x563A, 0x2B77, 0x563B, 0x563B, 0x0F0A,\n    0x563C, 0x563E, 0x2B78, 0x563F, 0x563F, 0x0790, 0x5640, 0x5640, 0x2B7B,\n    0x5641, 0x5641, 0x2674, 0x5642, 0x564B, 0x2B7C, 0x564C, 0x564C, 0x1587,\n    0x564D, 0x564D, 0x1583, 0x564E, 0x564E, 0x1034, 0x564F, 0x5653, 0x2B86,\n    0x5654, 0x5654, 0x1588, 0x5655, 0x5656, 0x2B8B, 0x5657, 0x5657, 0x1581,\n    0x5658, 0x5658, 0x157F, 0x5659, 0x5659, 0x1585, 0x565A, 0x565B, 0x2B8D,\n    0x565C, 0x565C, 0x1586, 0x565D, 0x565D, 0x236F, 0x565E, 0x565F, 0x2B8F,\n    0x5660, 0x5660, 0x2370, 0x5661, 0x5661, 0x2B91, 0x5662, 0x5662, 0x1584,\n    0x5663, 0x5663, 0x2B92, 0x5664, 0x5664, 0x158A, 0x5665, 0x5665, 0x2376,\n    0x5666, 0x5666, 0x2373, 0x5667, 0x5667, 0x2B93, 0x5668, 0x5668, 0x0C16,\n    0x5669, 0x5669, 0x1262, 0x566A, 0x566A, 0x112E, 0x566B, 0x566B, 0x158C,\n    0x566C, 0x566C, 0x0D60, 0x566D, 0x566E, 0x2B94, 0x566F, 0x566F, 0x237F,\n    0x5670, 0x5670, 0x2B96, 0x5671, 0x5671, 0x158B, 0x5672, 0x5672, 0x2374,\n    0x5673, 0x5673, 0x2B97, 0x5674, 0x5674, 0x20B5, 0x5675, 0x5675, 0x2B98,\n    0x5676, 0x5676, 0x06BC, 0x5677, 0x5677, 0x2B99, 0x5678, 0x5678, 0x1EDB,\n    0x5679, 0x5679, 0x2672, 0x567A, 0x567A, 0x2B9A, 0x567B, 0x567C, 0x158D,\n    0x567D, 0x567F, 0x2B9B, 0x5680, 0x5680, 0x236E, 0x5681, 0x5684, 0x2B9E,\n    0x5685, 0x5685, 0x158F, 0x5686, 0x5686, 0x1589, 0x5687, 0x5687, 0x21B7,\n    0x5688, 0x568B, 0x2BA2, 0x568C, 0x568C, 0x2375, 0x568D, 0x568D, 0x2BA6,\n    0x568E, 0x568E, 0x0776, 0x568F, 0x568F, 0x0E3A, 0x5690, 0x5692, 0x2BA7,\n    0x5693, 0x5693, 0x1590, 0x5694, 0x5694, 0x2BAA, 0x5695, 0x5695, 0x2382,\n    0x5696, 0x5698, 0x2BAB, 0x5699, 0x5699, 0x209E, 0x569A, 0x56A2, 0x2BAE,\n    0x56A3, 0x56A3, 0x0F66, 0x56A4, 0x56A5, 0x2BB7, 0x56A6, 0x56A6, 0x236B,\n    0x56A7, 0x56A7, 0x2BB9, 0x56A8, 0x56A8, 0x2039, 0x56A9, 0x56AD, 0x2BBA,\n    0x56AE, 0x56AE, 0x269F, 0x56AF, 0x56AF, 0x1591, 0x56B0, 0x56B2, 0x2BBF,\n    0x56B3, 0x56B3, 0x237D, 0x56B4, 0x56B4, 0x21F5, 0x56B5, 0x56B5, 0x2BC2,\n    0x56B6, 0x56B6, 0x2381, 0x56B7, 0x56B7, 0x0C9D, 0x56B8, 0x56BB, 0x2BC3,\n    0x56BC, 0x56BC, 0x0891, 0x56BD, 0x56BF, 0x2BC7, 0x56C0, 0x56C0, 0x237B,\n    0x56C1, 0x56C1, 0x237E, 0x56C2, 0x56C2, 0x21CC, 0x56C3, 0x56C4, 0x2BCA,\n    0x56C5, 0x56C5, 0x22DB, 0x56C6, 0x56C7, 0x2BCC, 0x56C8, 0x56C8, 0x236A,\n    0x56C9, 0x56C9, 0x2689, 0x56CA, 0x56CA, 0x0B35, 0x56CB, 0x56CB, 0x2BCE,\n    0x56CC, 0x56CC, 0x2697, 0x56CD, 0x56D0, 0x2BCF, 0x56D1, 0x56D1, 0x22A1,\n    0x56D2, 0x56D3, 0x2BD3, 0x56D4, 0x56D4, 0x1592, 0x56D5, 0x56D6, 0x2BD5,\n    0x56D7, 0x56D7, 0x1593, 0x56D8, 0x56D9, 0x2BD7, 0x56DA, 0x56DA, 0x0C71,\n    0x56DB, 0x56DB, 0x0DB9, 0x56DC, 0x56DC, 0x2BD9, 0x56DD, 0x56DD, 0x1594,\n    0x56DE, 0x56DE, 0x07ED, 0x56DF, 0x56DF, 0x126C, 0x56E0, 0x56E0, 0x1079,\n    0x56E1, 0x56E1, 0x1595, 0x56E2, 0x56E2, 0x0E76, 0x56E3, 0x56E3, 0x2BDA,\n    0x56E4, 0x56E4, 0x0619, 0x56E5, 0x56EA, 0x2BDB, 0x56EB, 0x56EB, 0x1597,\n    0x56EC, 0x56EC, 0x2BE1, 0x56ED, 0x56ED, 0x10F3, 0x56EE, 0x56EF, 0x2BE2,\n    0x56F0, 0x56F0, 0x0992, 0x56F1, 0x56F1, 0x0554, 0x56F2, 0x56F3, 0x2BE4,\n    0x56F4, 0x56F4, 0x0EB6, 0x56F5, 0x56F5, 0x1596, 0x56F6, 0x56F8, 0x2BE6,\n    0x56F9, 0x56F9, 0x1598, 0x56FA, 0x56FA, 0x0725, 0x56FB, 0x56FC, 0x2BE9,\n    0x56FD, 0x56FD, 0x0753, 0x56FE, 0x56FE, 0x0E6D, 0x56FF, 0x56FF, 0x1599,\n    0x5700, 0x5702, 0x2BEB, 0x5703, 0x5703, 0x0BF3, 0x5704, 0x5704, 0x159A,\n    0x5705, 0x5705, 0x2BEE, 0x5706, 0x5706, 0x10F5, 0x5707, 0x5707, 0x2383,\n    0x5708, 0x5708, 0x0C81, 0x5709, 0x5709, 0x159C, 0x570A, 0x570A, 0x159B,\n    0x570B, 0x570B, 0x1F3D, 0x570C, 0x570C, 0x2BEF, 0x570D, 0x570D, 0x218F,\n    0x570E, 0x5711, 0x2BF0, 0x5712, 0x5712, 0x2246, 0x5713, 0x5713, 0x2248,\n    0x5714, 0x5715, 0x2BF4, 0x5716, 0x5716, 0x217E, 0x5717, 0x5717, 0x2BF6,\n    0x5718, 0x5718, 0x2180, 0x5719, 0x571B, 0x2BF7, 0x571C, 0x571C, 0x159D,\n    0x571D, 0x571E, 0x2BFA, 0x571F, 0x571F, 0x0E72, 0x5720, 0x5722, 0x2BFC,\n    0x5723, 0x5723, 0x0D3C, 0x5724, 0x5727, 0x2BFF, 0x5728, 0x5728, 0x111D,\n    0x5729, 0x5729, 0x13A7, 0x572A, 0x572A, 0x13A9, 0x572B, 0x572B, 0x2C03,\n    0x572C, 0x572C, 0x13A8, 0x572D, 0x572D, 0x0740, 0x572E, 0x572F, 0x13AC,\n    0x5730, 0x5730, 0x05B9, 0x5731, 0x5732, 0x2C04, 0x5733, 0x5733, 0x13AA,\n    0x5734, 0x5738, 0x2C06, 0x5739, 0x5739, 0x13AB, 0x573A, 0x573A, 0x04C6,\n    0x573B, 0x573B, 0x13AF, 0x573C, 0x573D, 0x2C0B, 0x573E, 0x573E, 0x080D,\n    0x573F, 0x573F, 0x2C0D, 0x5740, 0x5740, 0x11B6, 0x5741, 0x5741, 0x2C0E,\n    0x5742, 0x5742, 0x13B0, 0x5743, 0x5746, 0x2C0F, 0x5747, 0x5747, 0x0928,\n    0x5748, 0x5749, 0x2C13, 0x574A, 0x574A, 0x0658, 0x574B, 0x574B, 0x2C15,\n    0x574C, 0x574C, 0x13A0, 0x574D, 0x574D, 0x0E01, 0x574E, 0x574E, 0x093F,\n    0x574F, 0x574F, 0x07CA, 0x5750, 0x5750, 0x1255, 0x5751, 0x5751, 0x0960,\n    0x5752, 0x5756, 0x2C16, 0x5757, 0x5757, 0x0976, 0x5758, 0x5759, 0x2C1B,\n    0x575A, 0x575A, 0x0854, 0x575B, 0x575B, 0x0E06, 0x575C, 0x575C, 0x13AE,\n    0x575D, 0x575D, 0x03DE, 0x575E, 0x575E, 0x0EFA, 0x575F, 0x575F, 0x0675,\n    0x5760, 0x5760, 0x1216, 0x5761, 0x5761, 0x0BE1, 0x5762, 0x5763, 0x2C1D,\n    0x5764, 0x5764, 0x098F, 0x5765, 0x5765, 0x2C1F, 0x5766, 0x5766, 0x0E0C,\n    0x5767, 0x5767, 0x2C20, 0x5768, 0x5768, 0x13B7, 0x5769, 0x5769, 0x13B1,\n    0x576A, 0x576A, 0x0BD9, 0x576B, 0x576B, 0x13B3, 0x576C, 0x576C, 0x2C21,\n    0x576D, 0x576D, 0x13B8, 0x576E, 0x576E, 0x2C22, 0x576F, 0x576F, 0x0BB8,\n    0x5770, 0x5772, 0x2C23, 0x5773, 0x5773, 0x13BA, 0x5774, 0x5775, 0x2C26,\n    0x5776, 0x5776, 0x13B9, 0x5777, 0x5777, 0x094D, 0x5778, 0x577A, 0x2C28,\n    0x577B, 0x577B, 0x13B6, 0x577C, 0x577C, 0x13B5, 0x577D, 0x5781, 0x2C2B,\n    0x5782, 0x5782, 0x053C, 0x5783, 0x5783, 0x0997, 0x5784, 0x5784, 0x0A49,\n    0x5785, 0x5785, 0x13B2, 0x5786, 0x5786, 0x13B4, 0x5787, 0x578A, 0x2C30,\n    0x578B, 0x578B, 0x0F98, 0x578C, 0x578C, 0x13BD, 0x578D, 0x5791, 0x2C34,\n    0x5792, 0x5792, 0x09C8, 0x5793, 0x5793, 0x13C2, 0x5794, 0x579A, 0x2C39,\n    0x579B, 0x579B, 0x0621, 0x579C, 0x579F, 0x2C40, 0x57A0, 0x57A0, 0x13C3,\n    0x57A1, 0x57A1, 0x13A2, 0x57A2, 0x57A2, 0x0711, 0x57A3, 0x57A3, 0x10EE,\n    0x57A4, 0x57A4, 0x13BC, 0x57A5, 0x57A5, 0x2C44, 0x57A6, 0x57A6, 0x095E,\n    0x57A7, 0x57A7, 0x13C0, 0x57A8, 0x57A8, 0x2C45, 0x57A9, 0x57A9, 0x13A1,\n    0x57AA, 0x57AA, 0x2C46, 0x57AB, 0x57AB, 0x05C7, 0x57AC, 0x57AC, 0x2C47,\n    0x57AD, 0x57AD, 0x13BB, 0x57AE, 0x57AE, 0x0972, 0x57AF, 0x57B1, 0x2C48,\n    0x57B2, 0x57B2, 0x13BE, 0x57B3, 0x57B3, 0x2C4B, 0x57B4, 0x57B4, 0x13C1,\n    0x57B5, 0x57B7, 0x2C4C, 0x57B8, 0x57B8, 0x13C9, 0x57B9, 0x57C1, 0x2C4F,\n    0x57C2, 0x57C2, 0x06FA, 0x57C3, 0x57C3, 0x03AE, 0x57C4, 0x57CA, 0x2C58,\n    0x57CB, 0x57CB, 0x0A98, 0x57CC, 0x57CD, 0x2C5F, 0x57CE, 0x57CE, 0x04EC,\n    0x57CF, 0x57CF, 0x13BF, 0x57D0, 0x57D1, 0x2C61, 0x57D2, 0x57D2, 0x13C8,\n    0x57D3, 0x57D3, 0x2C63, 0x57D4, 0x57D4, 0x0BF1, 0x57D5, 0x57D5, 0x13C4,\n    0x57D6, 0x57D7, 0x2C64, 0x57D8, 0x57D8, 0x13C5, 0x57D9, 0x57D9, 0x13C7,\n    0x57DA, 0x57DA, 0x13C6, 0x57DB, 0x57DC, 0x2C66, 0x57DD, 0x57DD, 0x13CE,\n    0x57DE, 0x57DE, 0x2C68, 0x57DF, 0x57DF, 0x10D7, 0x57E0, 0x57E0, 0x0481,\n    0x57E1, 0x57E1, 0x232A, 0x57E2, 0x57E3, 0x2C69, 0x57E4, 0x57E4, 0x13CD,\n    0x57E5, 0x57EC, 0x2C6B, 0x57ED, 0x57ED, 0x13D2, 0x57EE, 0x57EE, 0x2C73,\n    0x57EF, 0x57EF, 0x13CB, 0x57F0, 0x57F3, 0x2C74, 0x57F4, 0x57F4, 0x13CA,\n    0x57F5, 0x57F6, 0x2C78, 0x57F7, 0x57F7, 0x228B, 0x57F8, 0x57F8, 0x13CC,\n    0x57F9, 0x57F9, 0x0BA1, 0x57FA, 0x57FA, 0x080E, 0x57FB, 0x57FC, 0x2C7A,\n    0x57FD, 0x57FD, 0x13D1, 0x57FE, 0x57FF, 0x2C7C, 0x5800, 0x5800, 0x13D3,\n    0x5801, 0x5801, 0x2C7E, 0x5802, 0x5802, 0x0E16, 0x5803, 0x5804, 0x2C7F,\n    0x5805, 0x5805, 0x1F85, 0x5806, 0x5806, 0x0610, 0x5807, 0x5807, 0x144C,\n    0x5808, 0x5809, 0x2C81, 0x580A, 0x580A, 0x2325, 0x580B, 0x580B, 0x13CF,\n    0x580C, 0x580C, 0x2C83, 0x580D, 0x580D, 0x13D0, 0x580E, 0x5810, 0x2C84,\n    0x5811, 0x5811, 0x0C32, 0x5812, 0x5814, 0x2C87, 0x5815, 0x5815, 0x0628,\n    0x5816, 0x5816, 0x232C, 0x5817, 0x5818, 0x2C8A, 0x5819, 0x5819, 0x13D5,\n    0x581A, 0x581C, 0x2C8C, 0x581D, 0x581D, 0x232E, 0x581E, 0x581E, 0x13D4,\n    0x581F, 0x581F, 0x2C8F, 0x5820, 0x5820, 0x13D7, 0x5821, 0x5821, 0x040D,\n    0x5822, 0x5823, 0x2C90, 0x5824, 0x5824, 0x05AD, 0x5825, 0x5829, 0x2C92,\n    0x582A, 0x582A, 0x093D, 0x582B, 0x582E, 0x2C97, 0x582F, 0x582F, 0x2205,\n    0x5830, 0x5830, 0x1008, 0x5831, 0x5831, 0x1E38, 0x5832, 0x5833, 0x2C9B,\n    0x5834, 0x5834, 0x1E73, 0x5835, 0x5835, 0x0601, 0x5836, 0x5843, 0x2C9D,\n    0x5844, 0x5844, 0x13D6, 0x5845, 0x5849, 0x2CAB, 0x584A, 0x584A, 0x1FE3,\n    0x584B, 0x584B, 0x2339, 0x584C, 0x584C, 0x0DEF, 0x584D, 0x584D, 0x19A3,\n    0x584E, 0x584E, 0x2CB0, 0x584F, 0x584F, 0x232B, 0x5850, 0x5850, 0x2CB1,\n    0x5851, 0x5851, 0x0DD1, 0x5852, 0x5852, 0x232D, 0x5853, 0x5853, 0x2CB2,\n    0x5854, 0x5854, 0x0DF3, 0x5855, 0x5856, 0x2CB3, 0x5857, 0x5857, 0x217F,\n    0x5858, 0x5858, 0x0E14, 0x5859, 0x585D, 0x2CB5, 0x585E, 0x585E, 0x0CD6,\n    0x585F, 0x5861, 0x2CBA, 0x5862, 0x5862, 0x21A7, 0x5863, 0x5863, 0x2CBD,\n    0x5864, 0x5864, 0x232F, 0x5865, 0x5865, 0x13D8, 0x5866, 0x586A, 0x2CBE,\n    0x586B, 0x586B, 0x0E41, 0x586C, 0x586C, 0x13D9, 0x586D, 0x5874, 0x2CC3,\n    0x5875, 0x5875, 0x1E7D, 0x5876, 0x5878, 0x2CCB, 0x5879, 0x5879, 0x20D6,\n    0x587A, 0x587D, 0x2CCE, 0x587E, 0x587E, 0x13A3, 0x587F, 0x587F, 0x2CD2,\n    0x5880, 0x5880, 0x13DD, 0x5881, 0x5881, 0x13DA, 0x5882, 0x5882, 0x2CD3,\n    0x5883, 0x5883, 0x08E2, 0x5884, 0x5884, 0x2CD4, 0x5885, 0x5885, 0x0D92,\n    0x5886, 0x5888, 0x2CD5, 0x5889, 0x5889, 0x13DB, 0x588A, 0x588A, 0x1EC2,\n    0x588B, 0x5891, 0x2CD8, 0x5892, 0x5892, 0x0D03, 0x5893, 0x5893, 0x0B1C,\n    0x5894, 0x5898, 0x2CDF, 0x5899, 0x5899, 0x0C3A, 0x589A, 0x589A, 0x13DC,\n    0x589B, 0x589B, 0x2CE4, 0x589C, 0x589C, 0x22B2, 0x589D, 0x589D, 0x2CE5,\n    0x589E, 0x589E, 0x1139, 0x589F, 0x589F, 0x0FB1, 0x58A0, 0x58A7, 0x2CE6,\n    0x58A8, 0x58A8, 0x0B0E, 0x58A9, 0x58A9, 0x0614, 0x58AA, 0x58AD, 0x2CEE,\n    0x58AE, 0x58AE, 0x1EDF, 0x58AF, 0x58B2, 0x2CF2, 0x58B3, 0x58B3, 0x1EF9,\n    0x58B4, 0x58BA, 0x2CF6, 0x58BB, 0x58BB, 0x20D9, 0x58BC, 0x58BC, 0x13A4,\n    0x58BD, 0x58BD, 0x2CFD, 0x58BE, 0x58BE, 0x1FDD, 0x58BF, 0x58C0, 0x2CFE,\n    0x58C1, 0x58C1, 0x0443, 0x58C2, 0x58C4, 0x2D00, 0x58C5, 0x58C5, 0x13A5,\n    0x58C6, 0x58C6, 0x2D03, 0x58C7, 0x58C7, 0x2167, 0x58C8, 0x58D0, 0x2D04,\n    0x58D1, 0x58D1, 0x13A6, 0x58D2, 0x58D2, 0x2D0D, 0x58D3, 0x58D3, 0x21ED,\n    0x58D4, 0x58D4, 0x2D0E, 0x58D5, 0x58D5, 0x0775, 0x58D6, 0x58D7, 0x2D0F,\n    0x58D8, 0x58D8, 0x2007, 0x58D9, 0x58D9, 0x2326, 0x58DA, 0x58DA, 0x2329,\n    0x58DB, 0x58DD, 0x2D11, 0x58DE, 0x58DE, 0x1F52, 0x58DF, 0x58DF, 0x203B,\n    0x58E0, 0x58E0, 0x2328, 0x58E1, 0x58E1, 0x2D14, 0x58E2, 0x58E2, 0x2327,\n    0x58E3, 0x58E3, 0x2D15, 0x58E4, 0x58E4, 0x0C9B, 0x58E5, 0x58E8, 0x2D16,\n    0x58E9, 0x58E9, 0x1E2B, 0x58EA, 0x58EA, 0x2D1A, 0x58EB, 0x58EB, 0x0D56,\n    0x58EC, 0x58EC, 0x0CA4, 0x58ED, 0x58ED, 0x2D1B, 0x58EE, 0x58EE, 0x1210,\n    0x58EF, 0x58EF, 0x22AE, 0x58F0, 0x58F0, 0x0D32, 0x58F1, 0x58F2, 0x2D1C,\n    0x58F3, 0x58F3, 0x0954, 0x58F4, 0x58F5, 0x2D1E, 0x58F6, 0x58F6, 0x07AF,\n    0x58F7, 0x58F8, 0x2D20, 0x58F9, 0x58F9, 0x1043, 0x58FA, 0x58FA, 0x1F49,\n    0x58FB, 0x58FC, 0x2D22, 0x58FD, 0x58FD, 0x2138, 0x58FE, 0x58FF, 0x2D24,\n    0x5900, 0x5901, 0x2D26, 0x5902, 0x5902, 0x161C, 0x5903, 0x5903, 0x2D28,\n    0x5904, 0x5904, 0x0529, 0x5905, 0x5906, 0x2D29, 0x5907, 0x5907, 0x0421,\n    0x5908, 0x590C, 0x2D2B, 0x590D, 0x590D, 0x06AF, 0x590E, 0x590E, 0x2D30,\n    0x590F, 0x590F, 0x0F31, 0x5910, 0x5913, 0x2D31, 0x5914, 0x5914, 0x12FB,\n    0x5915, 0x5915, 0x0F13, 0x5916, 0x5916, 0x0E93, 0x5917, 0x5918, 0x2D35,\n    0x5919, 0x5919, 0x1301, 0x591A, 0x591A, 0x061F, 0x591B, 0x591B, 0x2D37,\n    0x591C, 0x591C, 0x1040, 0x591D, 0x591E, 0x2D38, 0x591F, 0x591F, 0x0714,\n    0x5920, 0x5921, 0x2D3A, 0x5922, 0x5922, 0x2081, 0x5923, 0x5923, 0x2D3C,\n    0x5924, 0x5924, 0x161B, 0x5925, 0x5925, 0x1619, 0x5926, 0x5926, 0x2D3D,\n    0x5927, 0x5927, 0x0576, 0x5928, 0x5928, 0x2D3E, 0x5929, 0x5929, 0x0E3F,\n    0x592A, 0x592A, 0x0DFE, 0x592B, 0x592B, 0x068F, 0x592C, 0x592C, 0x2D3F,\n    0x592D, 0x592D, 0x1268, 0x592E, 0x592E, 0x1014, 0x592F, 0x592F, 0x0772,\n    0x5930, 0x5930, 0x2D40, 0x5931, 0x5931, 0x0D3E, 0x5932, 0x5933, 0x2D41,\n    0x5934, 0x5934, 0x0E68, 0x5935, 0x5936, 0x2D43, 0x5937, 0x5937, 0x104B,\n    0x5938, 0x5938, 0x0971, 0x5939, 0x5939, 0x0843, 0x593A, 0x593A, 0x0620,\n    0x593B, 0x593B, 0x2D45, 0x593C, 0x593C, 0x14AF, 0x593D, 0x593D, 0x2D46,\n    0x593E, 0x593E, 0x1F7C, 0x593F, 0x5940, 0x2D47, 0x5941, 0x5941, 0x14B0,\n    0x5942, 0x5942, 0x138C, 0x5943, 0x5943, 0x2D49, 0x5944, 0x5944, 0x1002,\n    0x5945, 0x5946, 0x2D4A, 0x5947, 0x5947, 0x0C05, 0x5948, 0x5948, 0x0B31,\n    0x5949, 0x5949, 0x068B, 0x594A, 0x594A, 0x2D4C, 0x594B, 0x594B, 0x0679,\n    0x594C, 0x594D, 0x2D4D, 0x594E, 0x594E, 0x0989, 0x594F, 0x594F, 0x123D,\n    0x5950, 0x5950, 0x2D4F, 0x5951, 0x5951, 0x0C14, 0x5952, 0x5953, 0x2D50,\n    0x5954, 0x5954, 0x0425, 0x5955, 0x5955, 0x14B2, 0x5956, 0x5956, 0x0882,\n    0x5957, 0x5957, 0x0E2A, 0x5958, 0x5958, 0x14B4, 0x5959, 0x5959, 0x2D52,\n    0x595A, 0x595A, 0x14B3, 0x595B, 0x595F, 0x2D53, 0x5960, 0x5960, 0x05CD,\n    0x5961, 0x5961, 0x2D58, 0x5962, 0x5962, 0x0D16, 0x5963, 0x5964, 0x2D59,\n    0x5965, 0x5965, 0x03CD, 0x5966, 0x5968, 0x2D5B, 0x5969, 0x5969, 0x235B,\n    0x596A, 0x596A, 0x1EDE, 0x596B, 0x596B, 0x2D5E, 0x596C, 0x596C, 0x1FA2,\n    0x596D, 0x596D, 0x2D5F, 0x596E, 0x596E, 0x1EFA, 0x596F, 0x5972, 0x2D60,\n    0x5973, 0x5973, 0x0B6F, 0x5974, 0x5974, 0x0B6C, 0x5975, 0x5975, 0x2D64,\n    0x5976, 0x5976, 0x0B2F, 0x5977, 0x5977, 0x2D65, 0x5978, 0x5978, 0x085C,\n    0x5979, 0x5979, 0x0DF2, 0x597A, 0x597C, 0x2D66, 0x597D, 0x597D, 0x077A,\n    0x597E, 0x5980, 0x2D69, 0x5981, 0x5981, 0x1775, 0x5982, 0x5982, 0x0CC2,\n    0x5983, 0x5983, 0x1776, 0x5984, 0x5984, 0x0EAE, 0x5985, 0x5985, 0x2D6C,\n    0x5986, 0x5986, 0x120E, 0x5987, 0x5987, 0x06B9, 0x5988, 0x5988, 0x0A8F,\n    0x5989, 0x5989, 0x2D6D, 0x598A, 0x598A, 0x0CAC, 0x598B, 0x598C, 0x2D6E,\n    0x598D, 0x598D, 0x1777, 0x598E, 0x5991, 0x2D70, 0x5992, 0x5992, 0x0609,\n    0x5993, 0x5993, 0x083E, 0x5994, 0x5995, 0x2D74, 0x5996, 0x5996, 0x1026,\n    0x5997, 0x5997, 0x177B, 0x5998, 0x5998, 0x2D76, 0x5999, 0x5999, 0x0AF3,\n    0x599A, 0x599C, 0x2D77, 0x599D, 0x599D, 0x22AD, 0x599E, 0x599E, 0x177E,\n    0x599F, 0x59A2, 0x2D7A, 0x59A3, 0x59A3, 0x177A, 0x59A4, 0x59A4, 0x177F,\n    0x59A5, 0x59A5, 0x0E88, 0x59A6, 0x59A7, 0x2D7E, 0x59A8, 0x59A8, 0x065E,\n    0x59A9, 0x59AA, 0x1778, 0x59AB, 0x59AB, 0x177D, 0x59AC, 0x59AD, 0x2D80,\n    0x59AE, 0x59AE, 0x0B40, 0x59AF, 0x59AF, 0x1782, 0x59B0, 0x59B1, 0x2D82,\n    0x59B2, 0x59B2, 0x1781, 0x59B3, 0x59B8, 0x2D84, 0x59B9, 0x59B9, 0x0AC8,\n    0x59BA, 0x59BA, 0x2D8A, 0x59BB, 0x59BB, 0x0BFD, 0x59BC, 0x59BD, 0x2D8B,\n    0x59BE, 0x59BE, 0x1784, 0x59BF, 0x59C5, 0x2D8D, 0x59C6, 0x59C6, 0x0B1A,\n    0x59C7, 0x59C9, 0x2D94, 0x59CA, 0x59CA, 0x177C, 0x59CB, 0x59CB, 0x0D53,\n    0x59CC, 0x59CF, 0x2D97, 0x59D0, 0x59D0, 0x08B4, 0x59D1, 0x59D1, 0x071C,\n    0x59D2, 0x59D2, 0x1780, 0x59D3, 0x59D3, 0x0FA0, 0x59D4, 0x59D4, 0x0EBE,\n    0x59D5, 0x59D6, 0x2D9B, 0x59D7, 0x59D7, 0x1783, 0x59D8, 0x59D8, 0x178A,\n    0x59D9, 0x59D9, 0x2D9D, 0x59DA, 0x59DA, 0x102D, 0x59DB, 0x59DB, 0x2D9E,\n    0x59DC, 0x59DC, 0x087B, 0x59DD, 0x59DD, 0x1787, 0x59DE, 0x59E2, 0x2D9F,\n    0x59E3, 0x59E3, 0x1789, 0x59E4, 0x59E4, 0x2DA4, 0x59E5, 0x59E5, 0x09BC,\n    0x59E6, 0x59E7, 0x2DA5, 0x59E8, 0x59E8, 0x1053, 0x59E9, 0x59EB, 0x2DA7,\n    0x59EC, 0x59EC, 0x081A, 0x59ED, 0x59F8, 0x2DAA, 0x59F9, 0x59F9, 0x178B,\n    0x59FA, 0x59FA, 0x2DB6, 0x59FB, 0x59FB, 0x107D, 0x59FC, 0x59FE, 0x2DB7,\n    0x59FF, 0x59FF, 0x1228, 0x5A00, 0x5A00, 0x2DBA, 0x5A01, 0x5A01, 0x0EAF,\n    0x5A02, 0x5A02, 0x2DBB, 0x5A03, 0x5A03, 0x0E8F, 0x5A04, 0x5A04, 0x0A4D,\n    0x5A05, 0x5A06, 0x1785, 0x5A07, 0x5A07, 0x0890, 0x5A08, 0x5A08, 0x1788,\n    0x5A09, 0x5A09, 0x178D, 0x5A0A, 0x5A0B, 0x2DBC, 0x5A0C, 0x5A0C, 0x178C,\n    0x5A0D, 0x5A10, 0x2DBE, 0x5A11, 0x5A11, 0x1790, 0x5A12, 0x5A12, 0x2DC2,\n    0x5A13, 0x5A13, 0x1792, 0x5A14, 0x5A17, 0x2DC3, 0x5A18, 0x5A18, 0x0B52,\n    0x5A19, 0x5A1B, 0x2DC7, 0x5A1C, 0x5A1C, 0x0B2B, 0x5A1D, 0x5A1E, 0x2DCA,\n    0x5A1F, 0x5A1F, 0x0919, 0x5A20, 0x5A20, 0x0D28, 0x5A21, 0x5A22, 0x2DCC,\n    0x5A23, 0x5A23, 0x1791, 0x5A24, 0x5A24, 0x2DCE, 0x5A25, 0x5A25, 0x062F,\n    0x5A26, 0x5A28, 0x2DCF, 0x5A29, 0x5A29, 0x0AE9, 0x5A2A, 0x5A30, 0x2DD2,\n    0x5A31, 0x5A31, 0x10CE, 0x5A32, 0x5A32, 0x178E, 0x5A33, 0x5A33, 0x2DD9,\n    0x5A34, 0x5A34, 0x178F, 0x5A35, 0x5A35, 0x2DDA, 0x5A36, 0x5A36, 0x0C7D,\n    0x5A37, 0x5A3B, 0x2DDB, 0x5A3C, 0x5A3C, 0x1797, 0x5A3D, 0x5A3F, 0x2DE0,\n    0x5A40, 0x5A40, 0x1793, 0x5A41, 0x5A41, 0x203F, 0x5A42, 0x5A45, 0x2DE3,\n    0x5A46, 0x5A46, 0x0BE4, 0x5A47, 0x5A48, 0x2DE7, 0x5A49, 0x5A49, 0x0EA2,\n    0x5A4A, 0x5A4A, 0x1795, 0x5A4B, 0x5A54, 0x2DE9, 0x5A55, 0x5A55, 0x1796,\n    0x5A56, 0x5A59, 0x2DF3, 0x5A5A, 0x5A5A, 0x07FE, 0x5A5B, 0x5A61, 0x2DF7,\n    0x5A62, 0x5A62, 0x1798, 0x5A63, 0x5A65, 0x2DFE, 0x5A66, 0x5A66, 0x1F0E,\n    0x5A67, 0x5A67, 0x1794, 0x5A68, 0x5A69, 0x2E01, 0x5A6A, 0x5A6A, 0x09A2,\n    0x5A6B, 0x5A6C, 0x2E03, 0x5A6D, 0x5A6D, 0x23F9, 0x5A6E, 0x5A73, 0x2E05,\n    0x5A74, 0x5A74, 0x1089, 0x5A75, 0x5A75, 0x1799, 0x5A76, 0x5A76, 0x0D2D,\n    0x5A77, 0x5A77, 0x179D, 0x5A78, 0x5A79, 0x2E0B, 0x5A7A, 0x5A7A, 0x179E,\n    0x5A7B, 0x5A7E, 0x2E0D, 0x5A7F, 0x5A7F, 0x0FC1, 0x5A80, 0x5A91, 0x2E11,\n    0x5A92, 0x5A92, 0x0AC2, 0x5A93, 0x5A99, 0x2E23, 0x5A9A, 0x5A9A, 0x0AC9,\n    0x5A9B, 0x5A9B, 0x179C, 0x5A9C, 0x5AA6, 0x2E2A, 0x5AA7, 0x5AA7, 0x23FC,\n    0x5AA8, 0x5AA9, 0x2E35, 0x5AAA, 0x5AAA, 0x179B, 0x5AAB, 0x5AB1, 0x2E37,\n    0x5AB2, 0x5AB2, 0x17A1, 0x5AB3, 0x5AB3, 0x0F1E, 0x5AB4, 0x5AB4, 0x2E3E,\n    0x5AB5, 0x5AB5, 0x19A4, 0x5AB6, 0x5AB7, 0x2E3F, 0x5AB8, 0x5AB8, 0x17A4,\n    0x5AB9, 0x5ABC, 0x2E41, 0x5ABD, 0x5ABD, 0x2069, 0x5ABE, 0x5ABE, 0x179F,\n    0x5ABF, 0x5AC0, 0x2E45, 0x5AC1, 0x5AC1, 0x0851, 0x5AC2, 0x5AC2, 0x0CE2,\n    0x5AC3, 0x5AC8, 0x2E47, 0x5AC9, 0x5AC9, 0x0828, 0x5ACA, 0x5ACB, 0x2E4D,\n    0x5ACC, 0x5ACC, 0x0F40, 0x5ACD, 0x5AD1, 0x2E4F, 0x5AD2, 0x5AD2, 0x17A2,\n    0x5AD3, 0x5AD3, 0x2E54, 0x5AD4, 0x5AD4, 0x17A3, 0x5AD5, 0x5AD5, 0x2E55,\n    0x5AD6, 0x5AD6, 0x17A8, 0x5AD7, 0x5AD7, 0x23F7, 0x5AD8, 0x5AD8, 0x17AA,\n    0x5AD9, 0x5ADB, 0x2E56, 0x5ADC, 0x5ADC, 0x17AB, 0x5ADD, 0x5ADF, 0x2E59,\n    0x5AE0, 0x5AE0, 0x17A5, 0x5AE1, 0x5AE1, 0x05B6, 0x5AE2, 0x5AE2, 0x2E5C,\n    0x5AE3, 0x5AE3, 0x17A6, 0x5AE4, 0x5AE5, 0x2E5D, 0x5AE6, 0x5AE6, 0x17A9,\n    0x5AE7, 0x5AE8, 0x2E5F, 0x5AE9, 0x5AE9, 0x0B3E, 0x5AEA, 0x5AEA, 0x2E61,\n    0x5AEB, 0x5AEB, 0x17A0, 0x5AEC, 0x5AF0, 0x2E62, 0x5AF1, 0x5AF1, 0x17A7,\n    0x5AF2, 0x5AF4, 0x2E67, 0x5AF5, 0x5AF5, 0x23F6, 0x5AF6, 0x5AFA, 0x2E6A,\n    0x5AFB, 0x5AFB, 0x23FD, 0x5AFC, 0x5AFF, 0x2E6F, 0x5B00, 0x5B00, 0x23F8,\n    0x5B01, 0x5B07, 0x2E73, 0x5B08, 0x5B08, 0x23FA, 0x5B09, 0x5B09, 0x17AC,\n    0x5B0A, 0x5B0A, 0x2E7A, 0x5B0B, 0x5B0B, 0x23FE, 0x5B0C, 0x5B0C, 0x1FA8,\n    0x5B0D, 0x5B15, 0x2E7B, 0x5B16, 0x5B16, 0x17AE, 0x5B17, 0x5B17, 0x17AD,\n    0x5B18, 0x5B18, 0x2E84, 0x5B19, 0x5B19, 0x2401, 0x5B1A, 0x5B20, 0x2E85,\n    0x5B21, 0x5B21, 0x23FF, 0x5B22, 0x5B29, 0x2E8C, 0x5B2A, 0x5B2A, 0x2400,\n    0x5B2B, 0x5B2F, 0x2E94, 0x5B30, 0x5B30, 0x2221, 0x5B31, 0x5B31, 0x2E99,\n    0x5B32, 0x5B32, 0x17AF, 0x5B33, 0x5B33, 0x2E9A, 0x5B34, 0x5B34, 0x130C,\n    0x5B35, 0x5B36, 0x2E9B, 0x5B37, 0x5B37, 0x17B0, 0x5B38, 0x5B38, 0x2122,\n    0x5B39, 0x5B3F, 0x2E9D, 0x5B40, 0x5B40, 0x17B1, 0x5B41, 0x5B4B, 0x2EA4,\n    0x5B4C, 0x5B4C, 0x23FB, 0x5B4D, 0x5B4F, 0x2EAF, 0x5B50, 0x5B50, 0x1230,\n    0x5B51, 0x5B51, 0x17B7, 0x5B52, 0x5B52, 0x2EB2, 0x5B53, 0x5B53, 0x17B8,\n    0x5B54, 0x5B54, 0x0964, 0x5B55, 0x5B55, 0x1113, 0x5B56, 0x5B56, 0x2EB3,\n    0x5B57, 0x5B57, 0x1233, 0x5B58, 0x5B58, 0x0569, 0x5B59, 0x5B59, 0x0DE4,\n    0x5B5A, 0x5B5A, 0x17B4, 0x5B5B, 0x5B5B, 0x1279, 0x5B5C, 0x5B5C, 0x122B,\n    0x5B5D, 0x5B5D, 0x0F6D, 0x5B5E, 0x5B5E, 0x2EB4, 0x5B5F, 0x5B5F, 0x0AD4,\n    0x5B60, 0x5B61, 0x2EB5, 0x5B62, 0x5B62, 0x17B9, 0x5B63, 0x5B63, 0x0831,\n    0x5B64, 0x5B64, 0x071B, 0x5B65, 0x5B65, 0x17B5, 0x5B66, 0x5B66, 0x0FD0,\n    0x5B67, 0x5B68, 0x2EB7, 0x5B69, 0x5B69, 0x0759, 0x5B6A, 0x5B6A, 0x0A76,\n    0x5B6B, 0x5B6B, 0x215A, 0x5B6C, 0x5B6C, 0x1261, 0x5B6D, 0x5B6F, 0x2EB9,\n    0x5B70, 0x5B70, 0x0D82, 0x5B71, 0x5B71, 0x176A, 0x5B72, 0x5B72, 0x2EBC,\n    0x5B73, 0x5B73, 0x17B6, 0x5B74, 0x5B74, 0x2EBD, 0x5B75, 0x5B75, 0x0692,\n    0x5B76, 0x5B77, 0x2EBE, 0x5B78, 0x5B78, 0x21E5, 0x5B79, 0x5B79, 0x2EC0,\n    0x5B7A, 0x5B7A, 0x0CC1, 0x5B7B, 0x5B7C, 0x2EC1, 0x5B7D, 0x5B7D, 0x0B58,\n    0x5B7E, 0x5B7E, 0x2EC3, 0x5B7F, 0x5B7F, 0x2057, 0x5B80, 0x5B80, 0x172E,\n    0x5B81, 0x5B81, 0x0B61, 0x5B82, 0x5B82, 0x2EC4, 0x5B83, 0x5B83, 0x0DF1,\n    0x5B84, 0x5B84, 0x172F, 0x5B85, 0x5B85, 0x114D, 0x5B86, 0x5B86, 0x2EC5,\n    0x5B87, 0x5B87, 0x10D3, 0x5B88, 0x5B88, 0x0D6F, 0x5B89, 0x5B89, 0x03BD,\n    0x5B8A, 0x5B8A, 0x2EC6, 0x5B8B, 0x5B8B, 0x0DC3, 0x5B8C, 0x5B8C, 0x0E9B,\n    0x5B8D, 0x5B8E, 0x2EC7, 0x5B8F, 0x5B8F, 0x07A1, 0x5B90, 0x5B92, 0x2EC9,\n    0x5B93, 0x5B93, 0x1731, 0x5B94, 0x5B94, 0x2ECC, 0x5B95, 0x5B95, 0x1730,\n    0x5B96, 0x5B96, 0x2ECD, 0x5B97, 0x5B97, 0x1237, 0x5B98, 0x5B98, 0x0732,\n    0x5B99, 0x5B99, 0x11E5, 0x5B9A, 0x5B9A, 0x05E7, 0x5B9B, 0x5B9B, 0x0EA1,\n    0x5B9C, 0x5B9C, 0x1052, 0x5B9D, 0x5B9D, 0x040F, 0x5B9E, 0x5B9E, 0x0D4C,\n    0x5B9F, 0x5B9F, 0x2ECE, 0x5BA0, 0x5BA0, 0x050D, 0x5BA1, 0x5BA1, 0x0D2C,\n    0x5BA2, 0x5BA2, 0x095A, 0x5BA3, 0x5BA3, 0x0FC6, 0x5BA4, 0x5BA4, 0x0D69,\n    0x5BA5, 0x5BA5, 0x1732, 0x5BA6, 0x5BA6, 0x07D7, 0x5BA7, 0x5BA9, 0x2ECF,\n    0x5BAA, 0x5BAA, 0x0F49, 0x5BAB, 0x5BAB, 0x0705, 0x5BAC, 0x5BAF, 0x2ED2,\n    0x5BB0, 0x5BB0, 0x111A, 0x5BB1, 0x5BB2, 0x2ED6, 0x5BB3, 0x5BB3, 0x075D,\n    0x5BB4, 0x5BB4, 0x1010, 0x5BB5, 0x5BB5, 0x0F69, 0x5BB6, 0x5BB6, 0x0845,\n    0x5BB7, 0x5BB7, 0x2ED8, 0x5BB8, 0x5BB8, 0x1733, 0x5BB9, 0x5BB9, 0x0CB8,\n    0x5BBA, 0x5BBC, 0x2ED9, 0x5BBD, 0x5BBD, 0x097A, 0x5BBE, 0x5BBE, 0x045F,\n    0x5BBF, 0x5BBF, 0x0DD3, 0x5BC0, 0x5BC1, 0x2EDC, 0x5BC2, 0x5BC2, 0x0838,\n    0x5BC3, 0x5BC3, 0x2EDE, 0x5BC4, 0x5BC4, 0x0837, 0x5BC5, 0x5BC5, 0x1081,\n    0x5BC6, 0x5BC6, 0x0AE1, 0x5BC7, 0x5BC7, 0x0969, 0x5BC8, 0x5BCB, 0x2EDF,\n    0x5BCC, 0x5BCC, 0x06B6, 0x5BCD, 0x5BCF, 0x2EE3, 0x5BD0, 0x5BD0, 0x0AC7,\n    0x5BD1, 0x5BD1, 0x2EE6, 0x5BD2, 0x5BD2, 0x0765, 0x5BD3, 0x5BD3, 0x10E5,\n    0x5BD4, 0x5BDC, 0x2EE7, 0x5BDD, 0x5BDD, 0x0C5B, 0x5BDE, 0x5BDE, 0x0B12,\n    0x5BDF, 0x5BDF, 0x04B3, 0x5BE0, 0x5BE0, 0x2EF0, 0x5BE1, 0x5BE1, 0x072A,\n    0x5BE2, 0x5BE2, 0x20E5, 0x5BE3, 0x5BE3, 0x2EF1, 0x5BE4, 0x5BE4, 0x1737,\n    0x5BE5, 0x5BE5, 0x0A11, 0x5BE6, 0x5BE6, 0x212F, 0x5BE7, 0x5BE7, 0x20A3,\n    0x5BE8, 0x5BE8, 0x1150, 0x5BE9, 0x5BE9, 0x2121, 0x5BEA, 0x5BEA, 0x2EF2,\n    0x5BEB, 0x5BEB, 0x21D4, 0x5BEC, 0x5BEC, 0x1FE5, 0x5BED, 0x5BED, 0x2EF3,\n    0x5BEE, 0x5BEE, 0x1738, 0x5BEF, 0x5BEF, 0x2EF4, 0x5BF0, 0x5BF0, 0x173A,\n    0x5BF1, 0x5BF4, 0x2EF5, 0x5BF5, 0x5BF5, 0x1E8A, 0x5BF6, 0x5BF6, 0x1E37,\n    0x5BF7, 0x5BF7, 0x2EF9, 0x5BF8, 0x5BF8, 0x056A, 0x5BF9, 0x5BF9, 0x0613,\n    0x5BFA, 0x5BFA, 0x0DB7, 0x5BFB, 0x5BFB, 0x0FD9, 0x5BFC, 0x5BFC, 0x059D,\n    0x5BFD, 0x5BFE, 0x2EFA, 0x5BFF, 0x5BFF, 0x0D70, 0x5C00, 0x5C00, 0x2EFC,\n    0x5C01, 0x5C01, 0x067F, 0x5C02, 0x5C03, 0x2EFD, 0x5C04, 0x5C04, 0x0D1D,\n    0x5C05, 0x5C05, 0x2EFF, 0x5C06, 0x5C06, 0x087C, 0x5C07, 0x5C07, 0x1F9E,\n    0x5C08, 0x5C08, 0x22A6, 0x5C09, 0x5C09, 0x0ECD, 0x5C0A, 0x5C0A, 0x124D,\n    0x5C0B, 0x5C0B, 0x21E8, 0x5C0C, 0x5C0C, 0x2F00, 0x5C0D, 0x5C0D, 0x1EDA,\n    0x5C0E, 0x5C0E, 0x1EB9, 0x5C0F, 0x5C0F, 0x0F6C, 0x5C10, 0x5C10, 0x2F01,\n    0x5C11, 0x5C11, 0x0D12, 0x5C12, 0x5C13, 0x2F02, 0x5C14, 0x5C14, 0x063A,\n    0x5C15, 0x5C15, 0x17B2, 0x5C16, 0x5C16, 0x0855, 0x5C17, 0x5C17, 0x2F04,\n    0x5C18, 0x5C18, 0x04E3, 0x5C19, 0x5C19, 0x2F05, 0x5C1A, 0x5C1A, 0x0D09,\n    0x5C1B, 0x5C1B, 0x2F06, 0x5C1C, 0x5C1C, 0x17B3, 0x5C1D, 0x5C1D, 0x04C7,\n    0x5C1E, 0x5C21, 0x2F07, 0x5C22, 0x5C22, 0x14B6, 0x5C23, 0x5C23, 0x2F0B,\n    0x5C24, 0x5C24, 0x10AD, 0x5C25, 0x5C25, 0x14B7, 0x5C26, 0x5C26, 0x2F0C,\n    0x5C27, 0x5C27, 0x1029, 0x5C28, 0x5C2B, 0x2F0D, 0x5C2C, 0x5C2C, 0x14B8,\n    0x5C2D, 0x5C30, 0x2F11, 0x5C31, 0x5C31, 0x08FC, 0x5C32, 0x5C33, 0x2F15,\n    0x5C34, 0x5C34, 0x14B9, 0x5C35, 0x5C36, 0x2F17, 0x5C37, 0x5C37, 0x235C,\n    0x5C38, 0x5C38, 0x0D43, 0x5C39, 0x5C39, 0x1083, 0x5C3A, 0x5C3A, 0x0504,\n    0x5C3B, 0x5C3B, 0x1766, 0x5C3C, 0x5C3C, 0x0B44, 0x5C3D, 0x5C3D, 0x08D0,\n    0x5C3E, 0x5C3E, 0x0EC1, 0x5C3F, 0x5C3F, 0x0B55, 0x5C40, 0x5C40, 0x0905,\n    0x5C41, 0x5C41, 0x0BC7, 0x5C42, 0x5C42, 0x04AA, 0x5C43, 0x5C44, 0x2F19,\n    0x5C45, 0x5C45, 0x0902, 0x5C46, 0x5C47, 0x2F1B, 0x5C48, 0x5C48, 0x0C79,\n    0x5C49, 0x5C49, 0x0E3E, 0x5C4A, 0x5C4A, 0x08BD, 0x5C4B, 0x5C4B, 0x0EEC,\n    0x5C4C, 0x5C4D, 0x2F1D, 0x5C4E, 0x5C4E, 0x0D51, 0x5C4F, 0x5C4F, 0x0BE0,\n    0x5C50, 0x5C50, 0x1768, 0x5C51, 0x5C51, 0x0F87, 0x5C52, 0x5C54, 0x2F1F,\n    0x5C55, 0x5C55, 0x115A, 0x5C56, 0x5C58, 0x2F22, 0x5C59, 0x5C59, 0x1769,\n    0x5C5A, 0x5C5D, 0x2F25, 0x5C5E, 0x5C5E, 0x0D8B, 0x5C5F, 0x5C5F, 0x2F29,\n    0x5C60, 0x5C60, 0x0E71, 0x5C61, 0x5C61, 0x0A6C, 0x5C62, 0x5C62, 0x2050,\n    0x5C63, 0x5C63, 0x176B, 0x5C64, 0x5C64, 0x1E67, 0x5C65, 0x5C65, 0x0A6B,\n    0x5C66, 0x5C66, 0x176C, 0x5C67, 0x5C67, 0x2F2A, 0x5C68, 0x5C68, 0x23F4,\n    0x5C69, 0x5C6B, 0x2F2B, 0x5C6C, 0x5C6C, 0x213E, 0x5C6D, 0x5C6D, 0x2F2E,\n    0x5C6E, 0x5C6E, 0x1774, 0x5C6F, 0x5C6F, 0x0E7E, 0x5C70, 0x5C70, 0x2F2F,\n    0x5C71, 0x5C71, 0x0CF6, 0x5C72, 0x5C78, 0x2F30, 0x5C79, 0x5C79, 0x1060,\n    0x5C7A, 0x5C7A, 0x15AC, 0x5C7B, 0x5C7E, 0x2F37, 0x5C7F, 0x5C7F, 0x10D1,\n    0x5C80, 0x5C80, 0x2F3B, 0x5C81, 0x5C81, 0x0DDF, 0x5C82, 0x5C82, 0x0C10,\n    0x5C83, 0x5C87, 0x2F3C, 0x5C88, 0x5C88, 0x15B0, 0x5C89, 0x5C8B, 0x2F41,\n    0x5C8C, 0x5C8C, 0x15AB, 0x5C8D, 0x5C8D, 0x15AD, 0x5C8E, 0x5C8F, 0x2F44,\n    0x5C90, 0x5C90, 0x15AE, 0x5C91, 0x5C91, 0x15B3, 0x5C92, 0x5C93, 0x2F46,\n    0x5C94, 0x5C94, 0x04B4, 0x5C95, 0x5C95, 0x2F48, 0x5C96, 0x5C96, 0x15AF,\n    0x5C97, 0x5C97, 0x06D5, 0x5C98, 0x5C99, 0x15B1, 0x5C9A, 0x5C9A, 0x15B4,\n    0x5C9B, 0x5C9B, 0x059B, 0x5C9C, 0x5C9C, 0x15B5, 0x5C9D, 0x5CA0, 0x2F49,\n    0x5CA1, 0x5CA1, 0x1F16, 0x5CA2, 0x5CA2, 0x15B7, 0x5CA3, 0x5CA3, 0x15BC,\n    0x5CA4, 0x5CA8, 0x2F4D, 0x5CA9, 0x5CA9, 0x0FFB, 0x5CAA, 0x5CAA, 0x2F52,\n    0x5CAB, 0x5CAB, 0x15BA, 0x5CAC, 0x5CAC, 0x15B9, 0x5CAD, 0x5CAD, 0x0A34,\n    0x5CAE, 0x5CB0, 0x2F53, 0x5CB1, 0x5CB1, 0x15BB, 0x5CB2, 0x5CB2, 0x2F56,\n    0x5CB3, 0x5CB3, 0x1103, 0x5CB4, 0x5CB4, 0x2F57, 0x5CB5, 0x5CB5, 0x15B6,\n    0x5CB6, 0x5CB6, 0x2F58, 0x5CB7, 0x5CB7, 0x15BE, 0x5CB8, 0x5CB8, 0x03C1,\n    0x5CB9, 0x5CBC, 0x2F59, 0x5CBD, 0x5CBD, 0x15B8, 0x5CBE, 0x5CBE, 0x2F5D,\n    0x5CBF, 0x5CBF, 0x0986, 0x5CC0, 0x5CC0, 0x2F5E, 0x5CC1, 0x5CC1, 0x15BD,\n    0x5CC2, 0x5CC3, 0x2F5F, 0x5CC4, 0x5CC4, 0x15BF, 0x5CC5, 0x5CCA, 0x2F61,\n    0x5CCB, 0x5CCB, 0x15C2, 0x5CCC, 0x5CD1, 0x2F67, 0x5CD2, 0x5CD2, 0x15C0,\n    0x5CD3, 0x5CD8, 0x2F6D, 0x5CD9, 0x5CD9, 0x11C4, 0x5CDA, 0x5CE0, 0x2F73,\n    0x5CE1, 0x5CE1, 0x0F2C, 0x5CE2, 0x5CE3, 0x2F7A, 0x5CE4, 0x5CE4, 0x15C1,\n    0x5CE5, 0x5CE5, 0x15C3, 0x5CE6, 0x5CE6, 0x0A74, 0x5CE7, 0x5CE7, 0x2F7C,\n    0x5CE8, 0x5CE8, 0x062A, 0x5CE9, 0x5CE9, 0x2F7D, 0x5CEA, 0x5CEA, 0x10DD,\n    0x5CEB, 0x5CEC, 0x2F7E, 0x5CED, 0x5CED, 0x0C4A, 0x5CEE, 0x5CEF, 0x2F80,\n    0x5CF0, 0x5CF0, 0x0682, 0x5CF1, 0x5CF3, 0x2F82, 0x5CF4, 0x5CF4, 0x2389,\n    0x5CF5, 0x5CF5, 0x2F85, 0x5CF6, 0x5CF6, 0x1EB7, 0x5CF7, 0x5CFA, 0x2F86,\n    0x5CFB, 0x5CFB, 0x092D, 0x5CFC, 0x5CFC, 0x2F8A, 0x5CFD, 0x5CFD, 0x21B4,\n    0x5CFE, 0x5CFF, 0x2F8B, 0x5D00, 0x5D01, 0x2F8D, 0x5D02, 0x5D03, 0x15C4,\n    0x5D04, 0x5D05, 0x2F8F, 0x5D06, 0x5D06, 0x15CB, 0x5D07, 0x5D07, 0x050C,\n    0x5D08, 0x5D0C, 0x2F91, 0x5D0D, 0x5D0D, 0x238F, 0x5D0E, 0x5D0E, 0x0C08,\n    0x5D0F, 0x5D13, 0x2F96, 0x5D14, 0x5D14, 0x0561, 0x5D15, 0x5D15, 0x2F9B,\n    0x5D16, 0x5D16, 0x0FEB, 0x5D17, 0x5D17, 0x1F1A, 0x5D18, 0x5D1A, 0x2F9C,\n    0x5D1B, 0x5D1B, 0x15CC, 0x5D1C, 0x5D1D, 0x2F9F, 0x5D1E, 0x5D1E, 0x15CA,\n    0x5D1F, 0x5D23, 0x2FA1, 0x5D24, 0x5D24, 0x15C9, 0x5D25, 0x5D25, 0x2FA6,\n    0x5D26, 0x5D26, 0x15C7, 0x5D27, 0x5D27, 0x15C6, 0x5D28, 0x5D28, 0x2FA7,\n    0x5D29, 0x5D29, 0x0429, 0x5D2A, 0x5D2B, 0x2FA8, 0x5D2C, 0x5D2C, 0x238B,\n    0x5D2D, 0x5D2D, 0x1159, 0x5D2E, 0x5D2E, 0x15C8, 0x5D2F, 0x5D33, 0x2FAA,\n    0x5D34, 0x5D34, 0x15CF, 0x5D35, 0x5D3C, 0x2FAF, 0x5D3D, 0x5D3D, 0x15D0,\n    0x5D3E, 0x5D3E, 0x15CE, 0x5D3F, 0x5D46, 0x2FB7, 0x5D47, 0x5D47, 0x1B22,\n    0x5D48, 0x5D49, 0x2FBF, 0x5D4A, 0x5D4A, 0x15D7, 0x5D4B, 0x5D4B, 0x15D6,\n    0x5D4C, 0x5D4C, 0x0C33, 0x5D4D, 0x5D4F, 0x2FC1, 0x5D50, 0x5D50, 0x238A,\n    0x5D51, 0x5D57, 0x2FC4, 0x5D58, 0x5D58, 0x15CD, 0x5D59, 0x5D5A, 0x2FCB,\n    0x5D5B, 0x5D5B, 0x15D2, 0x5D5C, 0x5D5C, 0x2FCD, 0x5D5D, 0x5D5D, 0x15D4,\n    0x5D5E, 0x5D68, 0x2FCE, 0x5D69, 0x5D69, 0x15D8, 0x5D6A, 0x5D6A, 0x2FD9,\n    0x5D6B, 0x5D6B, 0x15D5, 0x5D6C, 0x5D6C, 0x15D1, 0x5D6D, 0x5D6E, 0x2FDA,\n    0x5D6F, 0x5D6F, 0x15D3, 0x5D70, 0x5D73, 0x2FDC, 0x5D74, 0x5D74, 0x15D9,\n    0x5D75, 0x5D80, 0x2FE0, 0x5D81, 0x5D81, 0x2391, 0x5D82, 0x5D82, 0x15DA,\n    0x5D83, 0x5D83, 0x2FEC, 0x5D84, 0x5D84, 0x2271, 0x5D85, 0x5D86, 0x2FED,\n    0x5D87, 0x5D87, 0x2388, 0x5D88, 0x5D96, 0x2FEF, 0x5D97, 0x5D97, 0x238E,\n    0x5D98, 0x5D98, 0x2FFE, 0x5D99, 0x5D99, 0x15DB, 0x5D9A, 0x5D9C, 0x2FFF,\n    0x5D9D, 0x5D9D, 0x15DC, 0x5D9E, 0x5D9F, 0x3002, 0x5DA0, 0x5DA0, 0x238D,\n    0x5DA1, 0x5DA6, 0x3004, 0x5DA7, 0x5DA7, 0x238C, 0x5DA8, 0x5DB6, 0x300A,\n    0x5DB7, 0x5DB7, 0x15DE, 0x5DB8, 0x5DB8, 0x2390, 0x5DB9, 0x5DB9, 0x3019,\n    0x5DBA, 0x5DBA, 0x2033, 0x5DBB, 0x5DBB, 0x301A, 0x5DBC, 0x5DBC, 0x223C,\n    0x5DBD, 0x5DC4, 0x301B, 0x5DC5, 0x5DC5, 0x15DF, 0x5DC6, 0x5DCA, 0x3023,\n    0x5DCB, 0x5DCB, 0x1FE9, 0x5DCC, 0x5DCC, 0x3028, 0x5DCD, 0x5DCD, 0x0EB0,\n    0x5DCE, 0x5DD1, 0x3029, 0x5DD2, 0x5DD2, 0x2055, 0x5DD3, 0x5DD3, 0x302D,\n    0x5DD4, 0x5DD4, 0x2392, 0x5DD5, 0x5DDA, 0x302E, 0x5DDB, 0x5DDB, 0x1815,\n    0x5DDC, 0x5DDC, 0x3034, 0x5DDD, 0x5DDD, 0x052B, 0x5DDE, 0x5DDE, 0x11DC,\n    0x5DDF, 0x5DE0, 0x3035, 0x5DE1, 0x5DE1, 0x0FDB, 0x5DE2, 0x5DE2, 0x04D7,\n    0x5DE3, 0x5DE4, 0x3037, 0x5DE5, 0x5DE5, 0x06FD, 0x5DE6, 0x5DE6, 0x1250,\n    0x5DE7, 0x5DE7, 0x0C46, 0x5DE8, 0x5DE8, 0x090D, 0x5DE9, 0x5DE9, 0x0707,\n    0x5DEA, 0x5DEA, 0x3039, 0x5DEB, 0x5DEB, 0x0EE6, 0x5DEC, 0x5DED, 0x303A,\n    0x5DEE, 0x5DEE, 0x04B5, 0x5DEF, 0x5DEF, 0x139F, 0x5DF0, 0x5DF0, 0x2324,\n    0x5DF1, 0x5DF1, 0x082D, 0x5DF2, 0x5DF2, 0x1058, 0x5DF3, 0x5DF3, 0x0DBD,\n    0x5DF4, 0x5DF4, 0x03D8, 0x5DF5, 0x5DF6, 0x303C, 0x5DF7, 0x5DF7, 0x0F5C,\n    0x5DF8, 0x5DFC, 0x303E, 0x5DFD, 0x5DFD, 0x12F7, 0x5DFE, 0x5DFE, 0x08BE,\n    0x5DFF, 0x5DFF, 0x3043, 0x5E00, 0x5E00, 0x3044, 0x5E01, 0x5E01, 0x043B,\n    0x5E02, 0x5E02, 0x0D67, 0x5E03, 0x5E03, 0x0483, 0x5E04, 0x5E04, 0x3045,\n    0x5E05, 0x5E05, 0x0D9C, 0x5E06, 0x5E06, 0x0648, 0x5E07, 0x5E07, 0x3046,\n    0x5E08, 0x5E08, 0x0D3D, 0x5E09, 0x5E0B, 0x3047, 0x5E0C, 0x5E0C, 0x0F10,\n    0x5E0D, 0x5E0E, 0x304A, 0x5E0F, 0x5E0F, 0x159E, 0x5E10, 0x5E10, 0x116B,\n    0x5E11, 0x5E11, 0x15A1, 0x5E12, 0x5E13, 0x304C, 0x5E14, 0x5E14, 0x15A0,\n    0x5E15, 0x5E15, 0x0B82, 0x5E16, 0x5E16, 0x0E4E, 0x5E17, 0x5E17, 0x304E,\n    0x5E18, 0x5E18, 0x09FA, 0x5E19, 0x5E19, 0x159F, 0x5E1A, 0x5E1A, 0x11E2,\n    0x5E1B, 0x5E1B, 0x0476, 0x5E1C, 0x5E1C, 0x11C3, 0x5E1D, 0x5E1D, 0x05BC,\n    0x5E1E, 0x5E24, 0x304F, 0x5E25, 0x5E25, 0x2143, 0x5E26, 0x5E26, 0x057B,\n    0x5E27, 0x5E27, 0x11A0, 0x5E28, 0x5E2A, 0x3056, 0x5E2B, 0x5E2B, 0x2129,\n    0x5E2C, 0x5E2C, 0x3059, 0x5E2D, 0x5E2D, 0x0F1C, 0x5E2E, 0x5E2E, 0x03FA,\n    0x5E2F, 0x5E30, 0x305A, 0x5E31, 0x5E31, 0x15A2, 0x5E32, 0x5E32, 0x305C,\n    0x5E33, 0x5E33, 0x2277, 0x5E34, 0x5E35, 0x305D, 0x5E36, 0x5E36, 0x1EA7,\n    0x5E37, 0x5E37, 0x15A5, 0x5E38, 0x5E38, 0x04C8, 0x5E39, 0x5E3A, 0x305F,\n    0x5E3B, 0x5E3C, 0x15A3, 0x5E3D, 0x5E3D, 0x0AB6, 0x5E3E, 0x5E3F, 0x3061,\n    0x5E40, 0x5E40, 0x2285, 0x5E41, 0x5E41, 0x3063, 0x5E42, 0x5E42, 0x0AE2,\n    0x5E43, 0x5E43, 0x2384, 0x5E44, 0x5E44, 0x15A6, 0x5E45, 0x5E45, 0x0696,\n    0x5E46, 0x5E4B, 0x3064, 0x5E4C, 0x5E4C, 0x07E4, 0x5E4D, 0x5E53, 0x306A,\n    0x5E54, 0x5E54, 0x15A7, 0x5E55, 0x5E55, 0x0B1E, 0x5E56, 0x5E56, 0x3071,\n    0x5E57, 0x5E57, 0x2387, 0x5E58, 0x5E58, 0x2386, 0x5E59, 0x5E5A, 0x3072,\n    0x5E5B, 0x5E5B, 0x15A8, 0x5E5C, 0x5E5D, 0x3074, 0x5E5E, 0x5E5E, 0x15A9,\n    0x5E5F, 0x5E5F, 0x2290, 0x5E60, 0x5E60, 0x3076, 0x5E61, 0x5E61, 0x15AA,\n    0x5E62, 0x5E62, 0x0534, 0x5E63, 0x5E63, 0x1E44, 0x5E64, 0x5E6A, 0x3077,\n    0x5E6B, 0x5E6B, 0x1E32, 0x5E6C, 0x5E6C, 0x2385, 0x5E6D, 0x5E71, 0x307E,\n    0x5E72, 0x5E72, 0x06C4, 0x5E73, 0x5E73, 0x0BDC, 0x5E74, 0x5E74, 0x0B4D,\n    0x5E75, 0x5E75, 0x3083, 0x5E76, 0x5E76, 0x0469, 0x5E77, 0x5E77, 0x3084,\n    0x5E78, 0x5E78, 0x0F9D, 0x5E79, 0x5E79, 0x1F13, 0x5E7A, 0x5E7A, 0x1813,\n    0x5E7B, 0x5E7B, 0x07D8, 0x5E7C, 0x5E7C, 0x10BC, 0x5E7D, 0x5E7D, 0x10A9,\n    0x5E7E, 0x5E7E, 0x1F73, 0x5E7F, 0x5E7F, 0x073C, 0x5E80, 0x5E80, 0x1631,\n    0x5E81, 0x5E83, 0x3085, 0x5E84, 0x5E84, 0x120C, 0x5E85, 0x5E85, 0x3088,\n    0x5E86, 0x5E86, 0x0C69, 0x5E87, 0x5E87, 0x043C, 0x5E88, 0x5E89, 0x3089,\n    0x5E8A, 0x5E8A, 0x0535, 0x5E8B, 0x5E8B, 0x1633, 0x5E8C, 0x5E8E, 0x308B,\n    0x5E8F, 0x5E8F, 0x0FBD, 0x5E90, 0x5E90, 0x0A55, 0x5E91, 0x5E91, 0x1632,\n    0x5E92, 0x5E92, 0x308E, 0x5E93, 0x5E93, 0x096F, 0x5E94, 0x5E94, 0x108B,\n    0x5E95, 0x5E95, 0x05B8, 0x5E96, 0x5E96, 0x1634, 0x5E97, 0x5E97, 0x05CB,\n    0x5E98, 0x5E98, 0x308F, 0x5E99, 0x5E99, 0x0AF2, 0x5E9A, 0x5E9A, 0x06F8,\n    0x5E9B, 0x5E9B, 0x3090, 0x5E9C, 0x5E9C, 0x06A9, 0x5E9D, 0x5E9D, 0x3091,\n    0x5E9E, 0x5E9E, 0x0B94, 0x5E9F, 0x5E9F, 0x066C, 0x5EA0, 0x5EA0, 0x1636,\n    0x5EA1, 0x5EA4, 0x3092, 0x5EA5, 0x5EA5, 0x1635, 0x5EA6, 0x5EA6, 0x0607,\n    0x5EA7, 0x5EA7, 0x1256, 0x5EA8, 0x5EAA, 0x3096, 0x5EAB, 0x5EAB, 0x1FE0,\n    0x5EAC, 0x5EAC, 0x3099, 0x5EAD, 0x5EAD, 0x0E56, 0x5EAE, 0x5EB2, 0x309A,\n    0x5EB3, 0x5EB3, 0x163A, 0x5EB4, 0x5EB4, 0x309F, 0x5EB5, 0x5EB5, 0x1638,\n    0x5EB6, 0x5EB6, 0x0D93, 0x5EB7, 0x5EB7, 0x0942, 0x5EB8, 0x5EB8, 0x109E,\n    0x5EB9, 0x5EB9, 0x1637, 0x5EBA, 0x5EBD, 0x30A0, 0x5EBE, 0x5EBE, 0x1639,\n    0x5EBF, 0x5EC8, 0x30A4, 0x5EC9, 0x5EC9, 0x09F7, 0x5ECA, 0x5ECA, 0x09B3,\n    0x5ECB, 0x5ED0, 0x30AE, 0x5ED1, 0x5ED1, 0x163D, 0x5ED2, 0x5ED2, 0x163C,\n    0x5ED3, 0x5ED3, 0x0995, 0x5ED4, 0x5ED5, 0x30B4, 0x5ED6, 0x5ED6, 0x0A17,\n    0x5ED7, 0x5EDA, 0x30B6, 0x5EDB, 0x5EDB, 0x163E, 0x5EDC, 0x5EDE, 0x30BA,\n    0x5EDF, 0x5EDF, 0x2087, 0x5EE0, 0x5EE0, 0x1E78, 0x5EE1, 0x5EE1, 0x23AE,\n    0x5EE2, 0x5EE2, 0x1EF6, 0x5EE3, 0x5EE3, 0x1F31, 0x5EE4, 0x5EE7, 0x30BD,\n    0x5EE8, 0x5EE8, 0x163F, 0x5EE9, 0x5EE9, 0x30C1, 0x5EEA, 0x5EEA, 0x1640,\n    0x5EEB, 0x5EEB, 0x30C2, 0x5EEC, 0x5EEC, 0x2045, 0x5EED, 0x5EF2, 0x30C3,\n    0x5EF3, 0x5EF3, 0x2178, 0x5EF4, 0x5EF4, 0x1398, 0x5EF5, 0x5EF5, 0x30C9,\n    0x5EF6, 0x5EF6, 0x0FFC, 0x5EF7, 0x5EF7, 0x0E53, 0x5EF8, 0x5EF9, 0x30CA,\n    0x5EFA, 0x5EFA, 0x0879, 0x5EFB, 0x5EFD, 0x30CC, 0x5EFE, 0x5EFE, 0x14AD,\n    0x5EFF, 0x5EFF, 0x125B, 0x5F00, 0x5F00, 0x0937, 0x5F01, 0x5F01, 0x139D,\n    0x5F02, 0x5F02, 0x1073, 0x5F03, 0x5F03, 0x0C19, 0x5F04, 0x5F04, 0x0B6B,\n    0x5F05, 0x5F07, 0x30CF, 0x5F08, 0x5F08, 0x14AE, 0x5F09, 0x5F09, 0x30D2,\n    0x5F0A, 0x5F0A, 0x0440, 0x5F0B, 0x5F0B, 0x14F6, 0x5F0C, 0x5F0E, 0x30D3,\n    0x5F0F, 0x5F0F, 0x0D54, 0x5F10, 0x5F10, 0x30D6, 0x5F11, 0x5F11, 0x14F9,\n    0x5F12, 0x5F12, 0x30D7, 0x5F13, 0x5F13, 0x0706, 0x5F14, 0x5F14, 0x30D8,\n    0x5F15, 0x5F15, 0x1084, 0x5F16, 0x5F16, 0x30D9, 0x5F17, 0x5F17, 0x06A0,\n    0x5F18, 0x5F18, 0x07A2, 0x5F19, 0x5F1A, 0x30DA, 0x5F1B, 0x5F1B, 0x04FF,\n    0x5F1C, 0x5F1E, 0x30DC, 0x5F1F, 0x5F1F, 0x05BD, 0x5F20, 0x5F20, 0x1166,\n    0x5F21, 0x5F24, 0x30DF, 0x5F25, 0x5F25, 0x0ADB, 0x5F26, 0x5F26, 0x0F3F,\n    0x5F27, 0x5F27, 0x07B6, 0x5F28, 0x5F28, 0x30E3, 0x5F29, 0x5F29, 0x176F,\n    0x5F2A, 0x5F2A, 0x176E, 0x5F2B, 0x5F2C, 0x30E4, 0x5F2D, 0x5F2D, 0x1770,\n    0x5F2E, 0x5F2E, 0x30E6, 0x5F2F, 0x5F2F, 0x0E95, 0x5F30, 0x5F30, 0x30E7,\n    0x5F31, 0x5F31, 0x0CD0, 0x5F32, 0x5F32, 0x30E8, 0x5F33, 0x5F33, 0x23F5,\n    0x5F34, 0x5F34, 0x30E9, 0x5F35, 0x5F35, 0x2275, 0x5F36, 0x5F38, 0x30EA,\n    0x5F39, 0x5F39, 0x0590, 0x5F3A, 0x5F3A, 0x0C3C, 0x5F3B, 0x5F3B, 0x30ED,\n    0x5F3C, 0x5F3C, 0x1772, 0x5F3D, 0x5F3F, 0x30EE, 0x5F40, 0x5F40, 0x19BE,\n    0x5F41, 0x5F45, 0x30F1, 0x5F46, 0x5F46, 0x266E, 0x5F47, 0x5F47, 0x30F6,\n    0x5F48, 0x5F48, 0x1EB0, 0x5F49, 0x5F4B, 0x30F7, 0x5F4C, 0x5F4C, 0x2083,\n    0x5F4D, 0x5F4D, 0x30FA, 0x5F4E, 0x5F4E, 0x2188, 0x5F4F, 0x5F4F, 0x30FB,\n    0x5F50, 0x5F50, 0x1762, 0x5F51, 0x5F51, 0x30FC, 0x5F52, 0x5F52, 0x0742,\n    0x5F53, 0x5F53, 0x0592, 0x5F54, 0x5F54, 0x30FD, 0x5F55, 0x5F55, 0x0A63,\n    0x5F56, 0x5F56, 0x1764, 0x5F57, 0x5F57, 0x1763, 0x5F58, 0x5F58, 0x1765,\n    0x5F59, 0x5F59, 0x267C, 0x5F5A, 0x5F5C, 0x30FE, 0x5F5D, 0x5F5D, 0x1054,\n    0x5F5E, 0x5F60, 0x3101, 0x5F61, 0x5F61, 0x15EE, 0x5F62, 0x5F62, 0x0F99,\n    0x5F63, 0x5F63, 0x3104, 0x5F64, 0x5F64, 0x0E5F, 0x5F65, 0x5F65, 0x3105,\n    0x5F66, 0x5F66, 0x100E, 0x5F67, 0x5F68, 0x3106, 0x5F69, 0x5F69, 0x0491,\n    0x5F6A, 0x5F6A, 0x0454, 0x5F6B, 0x5F6B, 0x3108, 0x5F6C, 0x5F6C, 0x045B,\n    0x5F6D, 0x5F6D, 0x0BAE, 0x5F6E, 0x5F6F, 0x3109, 0x5F70, 0x5F70, 0x1164,\n    0x5F71, 0x5F71, 0x1095, 0x5F72, 0x5F72, 0x310B, 0x5F73, 0x5F73, 0x15E0,\n    0x5F74, 0x5F76, 0x310C, 0x5F77, 0x5F77, 0x15E1, 0x5F78, 0x5F78, 0x310F,\n    0x5F79, 0x5F79, 0x1062, 0x5F7A, 0x5F7A, 0x3110, 0x5F7B, 0x5F7B, 0x04DE,\n    0x5F7C, 0x5F7C, 0x0434, 0x5F7D, 0x5F7F, 0x3111, 0x5F80, 0x5F80, 0x0EAA,\n    0x5F81, 0x5F81, 0x1198, 0x5F82, 0x5F82, 0x15E2, 0x5F83, 0x5F83, 0x3114,\n    0x5F84, 0x5F84, 0x08E5, 0x5F85, 0x5F85, 0x0580, 0x5F86, 0x5F86, 0x3115,\n    0x5F87, 0x5F87, 0x15E3, 0x5F88, 0x5F88, 0x0793, 0x5F89, 0x5F89, 0x15E4,\n    0x5F8A, 0x5F8A, 0x07C7, 0x5F8B, 0x5F8B, 0x0A70, 0x5F8C, 0x5F8C, 0x15E5,\n    0x5F8D, 0x5F8F, 0x3116, 0x5F90, 0x5F90, 0x0FB7, 0x5F91, 0x5F91, 0x1FC5,\n    0x5F92, 0x5F92, 0x0E6E, 0x5F93, 0x5F94, 0x3119, 0x5F95, 0x5F95, 0x15E6,\n    0x5F96, 0x5F96, 0x311B, 0x5F97, 0x5F97, 0x05A4, 0x5F98, 0x5F98, 0x0B88,\n    0x5F99, 0x5F99, 0x15E7, 0x5F9A, 0x5F9B, 0x311C, 0x5F9C, 0x5F9C, 0x15E8,\n    0x5F9D, 0x5F9D, 0x311E, 0x5F9E, 0x5F9E, 0x1EA1, 0x5F9F, 0x5F9F, 0x311F,\n    0x5FA0, 0x5FA0, 0x2393, 0x5FA1, 0x5FA1, 0x10DE, 0x5FA2, 0x5FA7, 0x3120,\n    0x5FA8, 0x5FA8, 0x15E9, 0x5FA9, 0x5FA9, 0x1F0B, 0x5FAA, 0x5FAA, 0x0FD6,\n    0x5FAB, 0x5FAC, 0x3126, 0x5FAD, 0x5FAD, 0x15EA, 0x5FAE, 0x5FAE, 0x0EB1,\n    0x5FAF, 0x5FB4, 0x3128, 0x5FB5, 0x5FB5, 0x15EB, 0x5FB6, 0x5FB6, 0x312E,\n    0x5FB7, 0x5FB7, 0x05A3, 0x5FB8, 0x5FB8, 0x312F, 0x5FB9, 0x5FB9, 0x1E7C,\n    0x5FBA, 0x5FBB, 0x3130, 0x5FBC, 0x5FBC, 0x15EC, 0x5FBD, 0x5FBD, 0x07EA,\n    0x5FBE, 0x5FC2, 0x3132, 0x5FC3, 0x5FC3, 0x0F8F, 0x5FC4, 0x5FC4, 0x1642,\n    0x5FC5, 0x5FC5, 0x0441, 0x5FC6, 0x5FC6, 0x106B, 0x5FC7, 0x5FC8, 0x3137,\n    0x5FC9, 0x5FC9, 0x1643, 0x5FCA, 0x5FCB, 0x3139, 0x5FCC, 0x5FCC, 0x083C,\n    0x5FCD, 0x5FCD, 0x0CA7, 0x5FCE, 0x5FCE, 0x313B, 0x5FCF, 0x5FCF, 0x1645,\n    0x5FD0, 0x5FD0, 0x1A0C, 0x5FD1, 0x5FD1, 0x1A0B, 0x5FD2, 0x5FD2, 0x14F7,\n    0x5FD3, 0x5FD5, 0x313C, 0x5FD6, 0x5FD6, 0x1644, 0x5FD7, 0x5FD7, 0x11BD,\n    0x5FD8, 0x5FD8, 0x0EAD, 0x5FD9, 0x5FD9, 0x0AAB, 0x5FDA, 0x5FDC, 0x313F,\n    0x5FDD, 0x5FDD, 0x1683, 0x5FDE, 0x5FDF, 0x3142, 0x5FE0, 0x5FE0, 0x11D1,\n    0x5FE1, 0x5FE1, 0x1649, 0x5FE2, 0x5FE3, 0x3144, 0x5FE4, 0x5FE4, 0x164A,\n    0x5FE5, 0x5FE6, 0x3146, 0x5FE7, 0x5FE7, 0x10AC, 0x5FE8, 0x5FE9, 0x3148,\n    0x5FEA, 0x5FEA, 0x164E, 0x5FEB, 0x5FEB, 0x0979, 0x5FEC, 0x5FEC, 0x314A,\n    0x5FED, 0x5FED, 0x164F, 0x5FEE, 0x5FEE, 0x1647, 0x5FEF, 0x5FF0, 0x314B,\n    0x5FF1, 0x5FF1, 0x04E5, 0x5FF2, 0x5FF4, 0x314D, 0x5FF5, 0x5FF5, 0x0B51,\n    0x5FF6, 0x5FF7, 0x3150, 0x5FF8, 0x5FF8, 0x1650, 0x5FF9, 0x5FFA, 0x3152,\n    0x5FFB, 0x5FFB, 0x0F8E, 0x5FFC, 0x5FFC, 0x3154, 0x5FFD, 0x5FFD, 0x07AD,\n    0x5FFE, 0x5FFE, 0x164B, 0x5FFF, 0x5FFF, 0x067B, 0x6000, 0x6000, 0x07C8,\n    0x6001, 0x6001, 0x0DFF, 0x6002, 0x6002, 0x0DC0, 0x6003, 0x6003, 0x1646,\n    0x6004, 0x6004, 0x1648, 0x6005, 0x6006, 0x164C, 0x6007, 0x6009, 0x3155,\n    0x600A, 0x600A, 0x1659, 0x600B, 0x600C, 0x3158, 0x600D, 0x600D, 0x1656,\n    0x600E, 0x600E, 0x1138, 0x600F, 0x600F, 0x1655, 0x6010, 0x6011, 0x315A,\n    0x6012, 0x6012, 0x0B6E, 0x6013, 0x6013, 0x315C, 0x6014, 0x6014, 0x119B,\n    0x6015, 0x6015, 0x0B83, 0x6016, 0x6016, 0x0487, 0x6017, 0x6018, 0x315D,\n    0x6019, 0x6019, 0x1651, 0x601A, 0x601A, 0x315F, 0x601B, 0x601B, 0x1654,\n    0x601C, 0x601C, 0x09F8, 0x601D, 0x601D, 0x0DB1, 0x601E, 0x601F, 0x3160,\n    0x6020, 0x6020, 0x0582, 0x6021, 0x6021, 0x165B, 0x6022, 0x6024, 0x3162,\n    0x6025, 0x6025, 0x0824, 0x6026, 0x6026, 0x1653, 0x6027, 0x6027, 0x0F9F,\n    0x6028, 0x6028, 0x10FC, 0x6029, 0x6029, 0x1657, 0x602A, 0x602A, 0x072F,\n    0x602B, 0x602B, 0x1658, 0x602C, 0x602E, 0x3165, 0x602F, 0x602F, 0x0C50,\n    0x6030, 0x6034, 0x3168, 0x6035, 0x6035, 0x1652, 0x6036, 0x603A, 0x316D,\n    0x603B, 0x603B, 0x1239, 0x603C, 0x603C, 0x1A0D, 0x603D, 0x603E, 0x3172,\n    0x603F, 0x603F, 0x165A, 0x6040, 0x6040, 0x3174, 0x6041, 0x6041, 0x1A11,\n    0x6042, 0x6042, 0x1660, 0x6043, 0x6043, 0x0D68, 0x6044, 0x604A, 0x3175,\n    0x604B, 0x604B, 0x09FE, 0x604C, 0x604C, 0x317C, 0x604D, 0x604D, 0x07E5,\n    0x604E, 0x604F, 0x317D, 0x6050, 0x6050, 0x0963, 0x6051, 0x6051, 0x317F,\n    0x6052, 0x6052, 0x079A, 0x6053, 0x6054, 0x3180, 0x6055, 0x6055, 0x0D96,\n    0x6056, 0x6058, 0x3182, 0x6059, 0x6059, 0x1A12, 0x605A, 0x605A, 0x1A0F,\n    0x605B, 0x605C, 0x3185, 0x605D, 0x605D, 0x1A0E, 0x605E, 0x6061, 0x3187,\n    0x6062, 0x6062, 0x07EB, 0x6063, 0x6063, 0x1A13, 0x6064, 0x6064, 0x0FBF,\n    0x6065, 0x6066, 0x318B, 0x6067, 0x6067, 0x1A10, 0x6068, 0x6068, 0x0795,\n    0x6069, 0x6069, 0x0636, 0x606A, 0x606A, 0x1661, 0x606B, 0x606B, 0x05F1,\n    0x606C, 0x606C, 0x0E44, 0x606D, 0x606D, 0x0700, 0x606E, 0x606E, 0x318D,\n    0x606F, 0x606F, 0x0F0F, 0x6070, 0x6070, 0x0C1E, 0x6071, 0x6072, 0x318E,\n    0x6073, 0x6073, 0x095F, 0x6074, 0x6075, 0x3190, 0x6076, 0x6076, 0x0630,\n    0x6077, 0x6077, 0x3192, 0x6078, 0x6079, 0x165C, 0x607A, 0x607A, 0x165F,\n    0x607B, 0x607B, 0x165E, 0x607C, 0x607C, 0x0B38, 0x607D, 0x607D, 0x1662,\n    0x607E, 0x607E, 0x3193, 0x607F, 0x607F, 0x10A6, 0x6080, 0x6082, 0x3194,\n    0x6083, 0x6083, 0x1667, 0x6084, 0x6084, 0x0C41, 0x6085, 0x6088, 0x3197,\n    0x6089, 0x6089, 0x0F11, 0x608A, 0x608B, 0x319B, 0x608C, 0x608C, 0x1669,\n    0x608D, 0x608D, 0x076E, 0x608E, 0x6091, 0x319D, 0x6092, 0x6092, 0x1668,\n    0x6093, 0x6093, 0x31A1, 0x6094, 0x6094, 0x07EF, 0x6095, 0x6095, 0x31A2,\n    0x6096, 0x6096, 0x1663, 0x6097, 0x6099, 0x31A3, 0x609A, 0x609A, 0x1664,\n    0x609B, 0x609B, 0x166A, 0x609C, 0x609C, 0x31A6, 0x609D, 0x609D, 0x1666,\n    0x609E, 0x609E, 0x31A7, 0x609F, 0x609F, 0x0F01, 0x60A0, 0x60A0, 0x10AB,\n    0x60A1, 0x60A2, 0x31A8, 0x60A3, 0x60A3, 0x07D1, 0x60A4, 0x60A5, 0x31AA,\n    0x60A6, 0x60A6, 0x1106, 0x60A7, 0x60A7, 0x31AC, 0x60A8, 0x60A8, 0x0B5D,\n    0x60A9, 0x60AA, 0x31AD, 0x60AB, 0x60AB, 0x1A14, 0x60AC, 0x60AC, 0x0FC7,\n    0x60AD, 0x60AD, 0x1665, 0x60AE, 0x60AE, 0x31AF, 0x60AF, 0x60AF, 0x0AFA,\n    0x60B0, 0x60B0, 0x31B0, 0x60B1, 0x60B1, 0x166D, 0x60B2, 0x60B2, 0x0418,\n    0x60B3, 0x60B3, 0x31B1, 0x60B4, 0x60B4, 0x1672, 0x60B5, 0x60B5, 0x23B4,\n    0x60B6, 0x60B6, 0x207E, 0x60B7, 0x60B7, 0x31B2, 0x60B8, 0x60B8, 0x0835,\n    0x60B9, 0x60BA, 0x31B3, 0x60BB, 0x60BB, 0x166C, 0x60BC, 0x60BC, 0x05A0,\n    0x60BD, 0x60C4, 0x31B5, 0x60C5, 0x60C5, 0x0C66, 0x60C6, 0x60C6, 0x1670,\n    0x60C7, 0x60C9, 0x31BD, 0x60CA, 0x60CA, 0x08D9, 0x60CB, 0x60CB, 0x0EA0,\n    0x60CC, 0x60D0, 0x31C0, 0x60D1, 0x60D1, 0x0808, 0x60D2, 0x60D4, 0x31C5,\n    0x60D5, 0x60D5, 0x0E3B, 0x60D6, 0x60D7, 0x31C8, 0x60D8, 0x60D8, 0x166F,\n    0x60D9, 0x60D9, 0x31CA, 0x60DA, 0x60DA, 0x1671, 0x60DB, 0x60DB, 0x31CB,\n    0x60DC, 0x60DC, 0x0F14, 0x60DD, 0x60DD, 0x166E, 0x60DE, 0x60DE, 0x31CC,\n    0x60DF, 0x60DF, 0x0EB8, 0x60E0, 0x60E0, 0x07F2, 0x60E1, 0x60E1, 0x1EE3,\n    0x60E2, 0x60E5, 0x31CD, 0x60E6, 0x60E6, 0x05CC, 0x60E7, 0x60E7, 0x0914,\n    0x60E8, 0x60E8, 0x0499, 0x60E9, 0x60E9, 0x04F2, 0x60EA, 0x60EA, 0x31D1,\n    0x60EB, 0x60EB, 0x0422, 0x60EC, 0x60EC, 0x166B, 0x60ED, 0x60ED, 0x0498,\n    0x60EE, 0x60EE, 0x058D, 0x60EF, 0x60EF, 0x0738, 0x60F0, 0x60F0, 0x0627,\n    0x60F1, 0x60F1, 0x2095, 0x60F2, 0x60F2, 0x23BB, 0x60F3, 0x60F3, 0x0F58,\n    0x60F4, 0x60F4, 0x1677, 0x60F5, 0x60F5, 0x31D2, 0x60F6, 0x60F6, 0x07E1,\n    0x60F7, 0x60F8, 0x31D3, 0x60F9, 0x60F9, 0x0CA2, 0x60FA, 0x60FA, 0x0F95,\n    0x60FB, 0x60FB, 0x23B9, 0x60FC, 0x60FF, 0x31D5, 0x6100, 0x6100, 0x1678,\n    0x6101, 0x6101, 0x0513, 0x6102, 0x6105, 0x31D9, 0x6106, 0x6106, 0x1A15,\n    0x6107, 0x6107, 0x31DD, 0x6108, 0x6108, 0x10DF, 0x6109, 0x6109, 0x10C9,\n    0x610A, 0x610C, 0x31DE, 0x610D, 0x610D, 0x1A16, 0x610E, 0x610E, 0x1679,\n    0x610F, 0x610F, 0x1069, 0x6110, 0x6114, 0x31E1, 0x6115, 0x6115, 0x1675,\n    0x6116, 0x6119, 0x31E6, 0x611A, 0x611A, 0x10C3, 0x611B, 0x611B, 0x1E28,\n    0x611C, 0x611C, 0x23BD, 0x611D, 0x611E, 0x31EA, 0x611F, 0x611F, 0x06CB,\n    0x6120, 0x6120, 0x1673, 0x6121, 0x6122, 0x31EC, 0x6123, 0x6123, 0x1676,\n    0x6124, 0x6124, 0x067C, 0x6125, 0x6125, 0x31EE, 0x6126, 0x6126, 0x1674,\n    0x6127, 0x6127, 0x098D, 0x6128, 0x612A, 0x31EF, 0x612B, 0x612B, 0x167A,\n    0x612C, 0x6133, 0x31F2, 0x6134, 0x6134, 0x23B5, 0x6135, 0x6136, 0x31FA,\n    0x6137, 0x6137, 0x23BA, 0x6138, 0x613D, 0x31FC, 0x613E, 0x613E, 0x23B3,\n    0x613F, 0x613F, 0x10FB, 0x6140, 0x6147, 0x3202, 0x6148, 0x6148, 0x054B,\n    0x6149, 0x6149, 0x320A, 0x614A, 0x614A, 0x167B, 0x614B, 0x614B, 0x2162,\n    0x614C, 0x614C, 0x07DA, 0x614D, 0x614D, 0x320B, 0x614E, 0x614E, 0x0D30,\n    0x614F, 0x6150, 0x320C, 0x6151, 0x6151, 0x0D1E, 0x6152, 0x6154, 0x320E,\n    0x6155, 0x6155, 0x0B20, 0x6156, 0x6157, 0x3211, 0x6158, 0x6158, 0x1E5E,\n    0x6159, 0x6159, 0x3213, 0x615A, 0x615A, 0x1E5D, 0x615B, 0x615C, 0x3214,\n    0x615D, 0x615D, 0x1A17, 0x615E, 0x615E, 0x3216, 0x615F, 0x615F, 0x23B7,\n    0x6160, 0x6161, 0x3217, 0x6162, 0x6162, 0x0AA4, 0x6163, 0x6163, 0x1F2F,\n    0x6164, 0x6164, 0x24DF, 0x6165, 0x6166, 0x3219, 0x6167, 0x6167, 0x07F0,\n    0x6168, 0x6168, 0x093B, 0x6169, 0x6169, 0x321B, 0x616A, 0x616A, 0x23B2,\n    0x616B, 0x616B, 0x214E, 0x616C, 0x616D, 0x321C, 0x616E, 0x616E, 0x2052,\n    0x616F, 0x616F, 0x321E, 0x6170, 0x6170, 0x0ECE, 0x6171, 0x6172, 0x321F,\n    0x6173, 0x6173, 0x23BC, 0x6174, 0x6174, 0x3221, 0x6175, 0x6175, 0x167C,\n    0x6176, 0x6176, 0x20EB, 0x6177, 0x6177, 0x0943, 0x6178, 0x6181, 0x3222,\n    0x6182, 0x6182, 0x2232, 0x6183, 0x6189, 0x322C, 0x618A, 0x618A, 0x1E3F,\n    0x618B, 0x618B, 0x0458, 0x618C, 0x618D, 0x3233, 0x618E, 0x618E, 0x113A,\n    0x618F, 0x618F, 0x3235, 0x6190, 0x6190, 0x201B, 0x6191, 0x6191, 0x20BC,\n    0x6192, 0x6192, 0x23BE, 0x6193, 0x6193, 0x3236, 0x6194, 0x6194, 0x167E,\n    0x6195, 0x6199, 0x3237, 0x619A, 0x619A, 0x1EAE, 0x619B, 0x619C, 0x323C,\n    0x619D, 0x619D, 0x1A19, 0x619E, 0x61A3, 0x323E, 0x61A4, 0x61A4, 0x1EFB,\n    0x61A5, 0x61A6, 0x3244, 0x61A7, 0x61A7, 0x167F, 0x61A8, 0x61A8, 0x0760,\n    0x61A9, 0x61A9, 0x1A18, 0x61AA, 0x61AA, 0x3246, 0x61AB, 0x61AB, 0x2089,\n    0x61AC, 0x61AC, 0x167D, 0x61AD, 0x61AD, 0x3247, 0x61AE, 0x61AE, 0x23B1,\n    0x61AF, 0x61B1, 0x3248, 0x61B2, 0x61B2, 0x21C4, 0x61B3, 0x61B5, 0x324B,\n    0x61B6, 0x61B6, 0x2214, 0x61B7, 0x61B7, 0x1680, 0x61B8, 0x61BD, 0x324E,\n    0x61BE, 0x61BE, 0x076D, 0x61BF, 0x61C1, 0x3254, 0x61C2, 0x61C2, 0x05ED,\n    0x61C3, 0x61C6, 0x3257, 0x61C7, 0x61C7, 0x1FDE, 0x61C8, 0x61C8, 0x0F83,\n    0x61C9, 0x61C9, 0x2223, 0x61CA, 0x61CA, 0x03CE, 0x61CB, 0x61CB, 0x1A1A,\n    0x61CC, 0x61CC, 0x23B6, 0x61CD, 0x61D0, 0x325B, 0x61D1, 0x61D1, 0x1A1B,\n    0x61D2, 0x61D2, 0x09AC, 0x61D3, 0x61D3, 0x325F, 0x61D4, 0x61D4, 0x1681,\n    0x61D5, 0x61DD, 0x3260, 0x61DE, 0x61DE, 0x268C, 0x61DF, 0x61DF, 0x24DE,\n    0x61E0, 0x61E2, 0x3269, 0x61E3, 0x61E3, 0x24E0, 0x61E4, 0x61E5, 0x326C,\n    0x61E6, 0x61E6, 0x0B74, 0x61E7, 0x61E7, 0x326E, 0x61E8, 0x61E8, 0x23B8,\n    0x61E9, 0x61F1, 0x326F, 0x61F2, 0x61F2, 0x1E81, 0x61F3, 0x61F4, 0x3278,\n    0x61F5, 0x61F5, 0x1682, 0x61F6, 0x61F6, 0x1FFE, 0x61F7, 0x61F7, 0x1F51,\n    0x61F8, 0x61F8, 0x21E1, 0x61F9, 0x61F9, 0x327A, 0x61FA, 0x61FA, 0x23B0,\n    0x61FB, 0x61FB, 0x327B, 0x61FC, 0x61FC, 0x1FCE, 0x61FD, 0x61FD, 0x327C,\n    0x61FE, 0x61FE, 0x211E, 0x61FF, 0x61FF, 0x13E0, 0x6200, 0x6200, 0x2021,\n    0x6201, 0x6205, 0x327D, 0x6206, 0x6206, 0x1A1C, 0x6207, 0x6207, 0x24E1,\n    0x6208, 0x6208, 0x06E5, 0x6209, 0x6209, 0x3282, 0x620A, 0x620A, 0x0EFB,\n    0x620B, 0x620B, 0x18F9, 0x620C, 0x620C, 0x0FB2, 0x620D, 0x620D, 0x0D90,\n    0x620E, 0x620E, 0x0CB1, 0x620F, 0x620F, 0x0F24, 0x6210, 0x6210, 0x04EE,\n    0x6211, 0x6211, 0x0EE1, 0x6212, 0x6212, 0x08B5, 0x6213, 0x6213, 0x3283,\n    0x6214, 0x6214, 0x24A3, 0x6215, 0x6215, 0x169E, 0x6216, 0x6216, 0x0807,\n    0x6217, 0x6217, 0x18FA, 0x6218, 0x6218, 0x115E, 0x6219, 0x6219, 0x3284,\n    0x621A, 0x621A, 0x0BFC, 0x621B, 0x621B, 0x18FB, 0x621C, 0x621E, 0x3285,\n    0x621F, 0x621F, 0x18FC, 0x6220, 0x6220, 0x3288, 0x6221, 0x6221, 0x18FE,\n    0x6222, 0x6222, 0x18FD, 0x6223, 0x6223, 0x3289, 0x6224, 0x6224, 0x1900,\n    0x6225, 0x6225, 0x18FF, 0x6226, 0x6226, 0x328A, 0x6227, 0x6227, 0x24A4,\n    0x6228, 0x6229, 0x328B, 0x622A, 0x622A, 0x08A9, 0x622B, 0x622B, 0x328D,\n    0x622C, 0x622C, 0x1901, 0x622D, 0x622D, 0x328E, 0x622E, 0x622E, 0x0A65,\n    0x622F, 0x622F, 0x328F, 0x6230, 0x6230, 0x2273, 0x6231, 0x6231, 0x3290,\n    0x6232, 0x6232, 0x21B0, 0x6233, 0x6233, 0x0544, 0x6234, 0x6234, 0x057A,\n    0x6235, 0x6236, 0x3291, 0x6237, 0x6237, 0x07BC, 0x6238, 0x623C, 0x3293,\n    0x623D, 0x623D, 0x19F4, 0x623E, 0x623E, 0x19F3, 0x623F, 0x623F, 0x065C,\n    0x6240, 0x6240, 0x0DEE, 0x6241, 0x6241, 0x044B, 0x6242, 0x6242, 0x3298,\n    0x6243, 0x6243, 0x19F5, 0x6244, 0x6246, 0x3299, 0x6247, 0x6247, 0x0D01,\n    0x6248, 0x6249, 0x19F6, 0x624A, 0x624A, 0x329C, 0x624B, 0x624B, 0x0D6D,\n    0x624C, 0x624C, 0x14BA, 0x624D, 0x624D, 0x048C, 0x624E, 0x624E, 0x113D,\n    0x624F, 0x6250, 0x329D, 0x6251, 0x6251, 0x0BEA, 0x6252, 0x6252, 0x03D2,\n    0x6253, 0x6253, 0x0575, 0x6254, 0x6254, 0x0CAE, 0x6255, 0x6257, 0x329F,\n    0x6258, 0x6258, 0x0E81, 0x6259, 0x625A, 0x32A2, 0x625B, 0x625B, 0x0945,\n    0x625C, 0x6262, 0x32A4, 0x6263, 0x6263, 0x0968, 0x6264, 0x6265, 0x32AB,\n    0x6266, 0x6266, 0x0C21, 0x6267, 0x6267, 0x11B3, 0x6268, 0x6268, 0x32AD,\n    0x6269, 0x6269, 0x0994, 0x626A, 0x626A, 0x14BB, 0x626B, 0x626B, 0x0CE1,\n    0x626C, 0x626C, 0x1018, 0x626D, 0x626D, 0x0B65, 0x626E, 0x626E, 0x03F2,\n    0x626F, 0x626F, 0x04DB, 0x6270, 0x6270, 0x0CA0, 0x6271, 0x6272, 0x32AE,\n    0x6273, 0x6273, 0x03ED, 0x6274, 0x6275, 0x32B0, 0x6276, 0x6276, 0x0693,\n    0x6277, 0x6278, 0x32B2, 0x6279, 0x6279, 0x0BBB, 0x627A, 0x627B, 0x32B4,\n    0x627C, 0x627C, 0x0632, 0x627D, 0x627D, 0x32B6, 0x627E, 0x627E, 0x1173,\n    0x627F, 0x627F, 0x04F5, 0x6280, 0x6280, 0x082F, 0x6281, 0x6283, 0x32B7,\n    0x6284, 0x6284, 0x04D2, 0x6285, 0x6288, 0x32BA, 0x6289, 0x6289, 0x0920,\n    0x628A, 0x628A, 0x03DC, 0x628B, 0x6290, 0x32BE, 0x6291, 0x6291, 0x105D,\n    0x6292, 0x6292, 0x0D7A, 0x6293, 0x6293, 0x1202, 0x6294, 0x6294, 0x32C4,\n    0x6295, 0x6295, 0x0E67, 0x6296, 0x6296, 0x05F5, 0x6297, 0x6297, 0x0946,\n    0x6298, 0x6298, 0x117C, 0x6299, 0x6299, 0x32C5, 0x629A, 0x629A, 0x06A2,\n    0x629B, 0x629B, 0x0B98, 0x629C, 0x629E, 0x32C6, 0x629F, 0x629F, 0x14BC,\n    0x62A0, 0x62A0, 0x0966, 0x62A1, 0x62A1, 0x0A7C, 0x62A2, 0x62A2, 0x0C3D,\n    0x62A3, 0x62A3, 0x32C9, 0x62A4, 0x62A4, 0x07B9, 0x62A5, 0x62A5, 0x0411,\n    0x62A6, 0x62A7, 0x32CA, 0x62A8, 0x62A8, 0x0BAB, 0x62A9, 0x62AA, 0x32CC,\n    0x62AB, 0x62AB, 0x0BBC, 0x62AC, 0x62AC, 0x0DFA, 0x62AD, 0x62B0, 0x32CE,\n    0x62B1, 0x62B1, 0x0410, 0x62B2, 0x62B4, 0x32D2, 0x62B5, 0x62B5, 0x05B7,\n    0x62B6, 0x62B8, 0x32D5, 0x62B9, 0x62B9, 0x0B0B, 0x62BA, 0x62BA, 0x32D8,\n    0x62BB, 0x62BB, 0x14BD, 0x62BC, 0x62BC, 0x0FE3, 0x62BD, 0x62BD, 0x050E,\n    0x62BE, 0x62BE, 0x32D9, 0x62BF, 0x62BF, 0x0AF7, 0x62C0, 0x62C1, 0x32DA,\n    0x62C2, 0x62C2, 0x0694, 0x62C3, 0x62C3, 0x32DC, 0x62C4, 0x62C4, 0x11F3,\n    0x62C5, 0x62C5, 0x0584, 0x62C6, 0x62C6, 0x04B7, 0x62C7, 0x62C7, 0x0B17,\n    0x62C8, 0x62C8, 0x0B4C, 0x62C9, 0x62C9, 0x0998, 0x62CA, 0x62CA, 0x14BE,\n    0x62CB, 0x62CB, 0x32DD, 0x62CC, 0x62CC, 0x03F3, 0x62CD, 0x62CD, 0x0B85,\n    0x62CE, 0x62CE, 0x0A29, 0x62CF, 0x62CF, 0x32DE, 0x62D0, 0x62D0, 0x072E,\n    0x62D1, 0x62D1, 0x32DF, 0x62D2, 0x62D2, 0x090B, 0x62D3, 0x62D3, 0x0E89,\n    0x62D4, 0x62D4, 0x03D9, 0x62D5, 0x62D5, 0x32E0, 0x62D6, 0x62D6, 0x0E80,\n    0x62D7, 0x62D7, 0x14C0, 0x62D8, 0x62D8, 0x08FF, 0x62D9, 0x62D9, 0x121B,\n    0x62DA, 0x62DA, 0x14BF, 0x62DB, 0x62DB, 0x1171, 0x62DC, 0x62DC, 0x03E8,\n    0x62DD, 0x62DE, 0x32E1, 0x62DF, 0x62DF, 0x0B45, 0x62E0, 0x62E1, 0x32E3,\n    0x62E2, 0x62E2, 0x0A4A, 0x62E3, 0x62E3, 0x0863, 0x62E4, 0x62E4, 0x32E5,\n    0x62E5, 0x62E5, 0x109A, 0x62E6, 0x62E6, 0x09A4, 0x62E7, 0x62E7, 0x0B62,\n    0x62E8, 0x62E8, 0x046D, 0x62E9, 0x62E9, 0x1134, 0x62EA, 0x62EB, 0x32E6,\n    0x62EC, 0x62EC, 0x0993, 0x62ED, 0x62ED, 0x0D5A, 0x62EE, 0x62EE, 0x14C1,\n    0x62EF, 0x62EF, 0x119D, 0x62F0, 0x62F0, 0x32E8, 0x62F1, 0x62F1, 0x0709,\n    0x62F2, 0x62F2, 0x32E9, 0x62F3, 0x62F3, 0x0C88, 0x62F4, 0x62F4, 0x0D9E,\n    0x62F5, 0x62F5, 0x32EA, 0x62F6, 0x62F6, 0x14C3, 0x62F7, 0x62F7, 0x094A,\n    0x62F8, 0x62FB, 0x32EB, 0x62FC, 0x62FC, 0x0BD3, 0x62FD, 0x62FD, 0x1204,\n    0x62FE, 0x62FE, 0x0D47, 0x62FF, 0x62FF, 0x0B26, 0x6300, 0x6300, 0x32EF,\n    0x6301, 0x6301, 0x04FB, 0x6302, 0x6302, 0x072B, 0x6303, 0x6306, 0x32F0,\n    0x6307, 0x6307, 0x11B7, 0x6308, 0x6308, 0x194E, 0x6309, 0x6309, 0x03BF,\n    0x630A, 0x630D, 0x32F4, 0x630E, 0x630E, 0x0973, 0x630F, 0x6310, 0x32F8,\n    0x6311, 0x6311, 0x0E47, 0x6312, 0x6315, 0x32FA, 0x6316, 0x6316, 0x0E8B,\n    0x6317, 0x6319, 0x32FE, 0x631A, 0x631A, 0x11BE, 0x631B, 0x631B, 0x0A75,\n    0x631C, 0x631C, 0x3301, 0x631D, 0x631D, 0x0EDD, 0x631E, 0x631E, 0x0DF5,\n    0x631F, 0x631F, 0x0F79, 0x6320, 0x6320, 0x0B36, 0x6321, 0x6321, 0x0593,\n    0x6322, 0x6322, 0x14C2, 0x6323, 0x6323, 0x1196, 0x6324, 0x6324, 0x082A,\n    0x6325, 0x6325, 0x07E8, 0x6326, 0x6327, 0x3302, 0x6328, 0x6328, 0x03AF,\n    0x6329, 0x6329, 0x3304, 0x632A, 0x632A, 0x0B73, 0x632B, 0x632B, 0x056F,\n    0x632C, 0x632E, 0x3305, 0x632F, 0x632F, 0x1192, 0x6330, 0x6331, 0x3308,\n    0x6332, 0x6332, 0x194F, 0x6333, 0x6338, 0x330A, 0x6339, 0x6339, 0x14C4,\n    0x633A, 0x633A, 0x0E57, 0x633B, 0x633C, 0x3310, 0x633D, 0x633D, 0x0E9D,\n    0x633E, 0x633E, 0x21D1, 0x633F, 0x6341, 0x3312, 0x6342, 0x6342, 0x0EF5,\n    0x6343, 0x6343, 0x14C6, 0x6344, 0x6344, 0x3315, 0x6345, 0x6345, 0x0E62,\n    0x6346, 0x6346, 0x0991, 0x6347, 0x6348, 0x3316, 0x6349, 0x6349, 0x121A,\n    0x634A, 0x634A, 0x3318, 0x634B, 0x634B, 0x14C5, 0x634C, 0x634C, 0x03D1,\n    0x634D, 0x634D, 0x076B, 0x634E, 0x634E, 0x0D0C, 0x634F, 0x634F, 0x0B56,\n    0x6350, 0x6350, 0x0917, 0x6351, 0x6354, 0x3319, 0x6355, 0x6355, 0x047D,\n    0x6356, 0x635D, 0x331D, 0x635E, 0x635E, 0x09B7, 0x635F, 0x635F, 0x0DE5,\n    0x6360, 0x6360, 0x3325, 0x6361, 0x6361, 0x0864, 0x6362, 0x6362, 0x07D0,\n    0x6363, 0x6363, 0x0598, 0x6364, 0x6366, 0x3326, 0x6367, 0x6367, 0x0BB6,\n    0x6368, 0x6368, 0x211C, 0x6369, 0x6369, 0x14D0, 0x636A, 0x636A, 0x3329,\n    0x636B, 0x636B, 0x235D, 0x636C, 0x636C, 0x332A, 0x636D, 0x636D, 0x14CD,\n    0x636E, 0x636E, 0x090C, 0x636F, 0x6370, 0x332B, 0x6371, 0x6371, 0x14C9,\n    0x6372, 0x6372, 0x2682, 0x6373, 0x6375, 0x332D, 0x6376, 0x6376, 0x053A,\n    0x6377, 0x6377, 0x08AE, 0x6378, 0x6379, 0x3330, 0x637A, 0x637A, 0x14CA,\n    0x637B, 0x637B, 0x0B50, 0x637C, 0x637F, 0x3332, 0x6380, 0x6380, 0x0F33,\n    0x6381, 0x6381, 0x3336, 0x6382, 0x6382, 0x05C1, 0x6383, 0x6383, 0x210D,\n    0x6384, 0x6384, 0x205A, 0x6385, 0x6386, 0x3337, 0x6387, 0x6387, 0x061D,\n    0x6388, 0x6388, 0x0D71, 0x6389, 0x6389, 0x05D5, 0x638A, 0x638A, 0x14CF,\n    0x638B, 0x638B, 0x3339, 0x638C, 0x638C, 0x1167, 0x638D, 0x638D, 0x333A,\n    0x638E, 0x638E, 0x14CB, 0x638F, 0x638F, 0x0E20, 0x6390, 0x6390, 0x0C1D,\n    0x6391, 0x6391, 0x333B, 0x6392, 0x6392, 0x0B86, 0x6393, 0x6395, 0x333C,\n    0x6396, 0x6396, 0x103B, 0x6397, 0x6397, 0x333F, 0x6398, 0x6398, 0x0921,\n    0x6399, 0x639F, 0x3340, 0x63A0, 0x63A0, 0x0A7A, 0x63A1, 0x63A1, 0x3347,\n    0x63A2, 0x63A2, 0x0E10, 0x63A3, 0x63A3, 0x04DD, 0x63A4, 0x63A4, 0x3348,\n    0x63A5, 0x63A5, 0x08A4, 0x63A6, 0x63A6, 0x3349, 0x63A7, 0x63A7, 0x0965,\n    0x63A8, 0x63A8, 0x0E77, 0x63A9, 0x63A9, 0x1003, 0x63AA, 0x63AA, 0x056E,\n    0x63AB, 0x63AB, 0x334A, 0x63AC, 0x63AC, 0x14CE, 0x63AD, 0x63AD, 0x14C7,\n    0x63AE, 0x63AE, 0x14D1, 0x63AF, 0x63AF, 0x334B, 0x63B0, 0x63B0, 0x1950,\n    0x63B1, 0x63B2, 0x334C, 0x63B3, 0x63B3, 0x0A57, 0x63B4, 0x63B4, 0x14CC,\n    0x63B5, 0x63B6, 0x334E, 0x63B7, 0x63B7, 0x11BF, 0x63B8, 0x63B8, 0x0588,\n    0x63B9, 0x63B9, 0x3350, 0x63BA, 0x63BA, 0x04BB, 0x63BB, 0x63BB, 0x3351,\n    0x63BC, 0x63BC, 0x14D2, 0x63BD, 0x63BD, 0x3352, 0x63BE, 0x63BE, 0x14DC,\n    0x63BF, 0x63BF, 0x3353, 0x63C0, 0x63C0, 0x1F8D, 0x63C1, 0x63C3, 0x3354,\n    0x63C4, 0x63C4, 0x14D7, 0x63C5, 0x63C5, 0x3357, 0x63C6, 0x63C6, 0x14DB,\n    0x63C7, 0x63C8, 0x3358, 0x63C9, 0x63C9, 0x0CBB, 0x63CA, 0x63CC, 0x335A,\n    0x63CD, 0x63CD, 0x123E, 0x63CE, 0x63CE, 0x14D9, 0x63CF, 0x63CF, 0x0AED,\n    0x63D0, 0x63D0, 0x0E34, 0x63D1, 0x63D1, 0x335D, 0x63D2, 0x63D2, 0x04AC,\n    0x63D3, 0x63D5, 0x335E, 0x63D6, 0x63D6, 0x1045, 0x63D7, 0x63D9, 0x3361,\n    0x63DA, 0x63DA, 0x21FF, 0x63DB, 0x63DD, 0x3364, 0x63DE, 0x63DE, 0x14D8,\n    0x63DF, 0x63DF, 0x3367, 0x63E0, 0x63E0, 0x14D5, 0x63E1, 0x63E1, 0x0EE4,\n    0x63E2, 0x63E2, 0x3368, 0x63E3, 0x63E3, 0x052A, 0x63E4, 0x63E8, 0x3369,\n    0x63E9, 0x63E9, 0x0938, 0x63EA, 0x63EA, 0x08ED, 0x63EB, 0x63EC, 0x336E,\n    0x63ED, 0x63ED, 0x08A3, 0x63EE, 0x63EE, 0x1F58, 0x63EF, 0x63F1, 0x3370,\n    0x63F2, 0x63F2, 0x14D3, 0x63F3, 0x63F3, 0x3373, 0x63F4, 0x63F4, 0x10F1,\n    0x63F5, 0x63F5, 0x3374, 0x63F6, 0x63F6, 0x14C8, 0x63F7, 0x63F7, 0x3375,\n    0x63F8, 0x63F8, 0x14D4, 0x63F9, 0x63FC, 0x3376, 0x63FD, 0x63FD, 0x09AA,\n    0x63FE, 0x63FE, 0x337A, 0x63FF, 0x63FF, 0x14D6, 0x6400, 0x6400, 0x04BA,\n    0x6401, 0x6401, 0x06E4, 0x6402, 0x6402, 0x0A4E, 0x6403, 0x6404, 0x337B,\n    0x6405, 0x6405, 0x0892, 0x6406, 0x640A, 0x337D, 0x640B, 0x640B, 0x14DF,\n    0x640C, 0x640C, 0x14E2, 0x640D, 0x640D, 0x215B, 0x640E, 0x640E, 0x3382,\n    0x640F, 0x640F, 0x0472, 0x6410, 0x6410, 0x0527, 0x6411, 0x6412, 0x3383,\n    0x6413, 0x6413, 0x056D, 0x6414, 0x6414, 0x0CDF, 0x6415, 0x6416, 0x3385,\n    0x6417, 0x6417, 0x1EB6, 0x6418, 0x641A, 0x3387, 0x641B, 0x641B, 0x14E0,\n    0x641C, 0x641C, 0x0DC6, 0x641D, 0x641D, 0x338A, 0x641E, 0x641E, 0x06DE,\n    0x641F, 0x641F, 0x338B, 0x6420, 0x6420, 0x14E1, 0x6421, 0x6421, 0x14E4,\n    0x6422, 0x6425, 0x338C, 0x6426, 0x6426, 0x14E3, 0x6427, 0x6429, 0x3390,\n    0x642A, 0x642A, 0x0E15, 0x642B, 0x642B, 0x3393, 0x642C, 0x642C, 0x03EC,\n    0x642D, 0x642D, 0x0571, 0x642E, 0x6433, 0x3394, 0x6434, 0x6434, 0x1736,\n    0x6435, 0x6435, 0x339A, 0x6436, 0x6436, 0x20DB, 0x6437, 0x6439, 0x339B,\n    0x643A, 0x643A, 0x0F7A, 0x643B, 0x643C, 0x339E, 0x643D, 0x643D, 0x04B2,\n    0x643E, 0x643E, 0x33A0, 0x643F, 0x643F, 0x1951, 0x6440, 0x6440, 0x33A1,\n    0x6441, 0x6441, 0x14DE, 0x6442, 0x6443, 0x33A2, 0x6444, 0x6444, 0x0D1C,\n    0x6445, 0x6445, 0x14DD, 0x6446, 0x6446, 0x03E5, 0x6447, 0x6447, 0x1028,\n    0x6448, 0x6448, 0x0460, 0x6449, 0x6449, 0x33A4, 0x644A, 0x644A, 0x0E02,\n    0x644B, 0x6450, 0x33A5, 0x6451, 0x6451, 0x2360, 0x6452, 0x6452, 0x14DA,\n    0x6453, 0x6453, 0x33AB, 0x6454, 0x6454, 0x0D99, 0x6455, 0x6457, 0x33AC,\n    0x6458, 0x6458, 0x114B, 0x6459, 0x645B, 0x33AF, 0x645C, 0x645C, 0x2361,\n    0x645D, 0x645D, 0x33B2, 0x645E, 0x645E, 0x14E5, 0x645F, 0x645F, 0x2040,\n    0x6460, 0x6466, 0x33B3, 0x6467, 0x6467, 0x0560, 0x6468, 0x6468, 0x33BA,\n    0x6469, 0x6469, 0x0B09, 0x646A, 0x646C, 0x33BB, 0x646D, 0x646D, 0x14E7,\n    0x646E, 0x646E, 0x33BE, 0x646F, 0x646F, 0x228E, 0x6470, 0x6472, 0x33BF,\n    0x6473, 0x6473, 0x1FDF, 0x6474, 0x6475, 0x33C2, 0x6476, 0x6476, 0x235E,\n    0x6477, 0x6477, 0x33C4, 0x6478, 0x6479, 0x0B03, 0x647A, 0x647A, 0x14E9,\n    0x647B, 0x647B, 0x1E6A, 0x647C, 0x6481, 0x33C5, 0x6482, 0x6482, 0x0A15,\n    0x6483, 0x6483, 0x33CB, 0x6484, 0x6484, 0x14E6, 0x6485, 0x6485, 0x091E,\n    0x6486, 0x6486, 0x33CC, 0x6487, 0x6487, 0x0BD1, 0x6488, 0x6488, 0x2002,\n    0x6489, 0x6490, 0x33CD, 0x6491, 0x6491, 0x04EA, 0x6492, 0x6492, 0x0CD1,\n    0x6493, 0x6493, 0x2093, 0x6494, 0x6494, 0x33D5, 0x6495, 0x6495, 0x0DAF,\n    0x6496, 0x6496, 0x14E8, 0x6497, 0x6498, 0x33D6, 0x6499, 0x6499, 0x14EC,\n    0x649A, 0x649D, 0x33D8, 0x649E, 0x649E, 0x120F, 0x649F, 0x649F, 0x235F,\n    0x64A0, 0x64A2, 0x33DC, 0x64A3, 0x64A3, 0x1EAC, 0x64A4, 0x64A4, 0x04DC,\n    0x64A5, 0x64A5, 0x1E54, 0x64A6, 0x64A8, 0x33DF, 0x64A9, 0x64A9, 0x0A0C,\n    0x64AA, 0x64AA, 0x33E2, 0x64AB, 0x64AB, 0x1F08, 0x64AC, 0x64AC, 0x0C48,\n    0x64AD, 0x64AD, 0x046C, 0x64AE, 0x64AE, 0x056C, 0x64AF, 0x64AF, 0x33E3,\n    0x64B0, 0x64B0, 0x1208, 0x64B1, 0x64B1, 0x33E4, 0x64B2, 0x64B2, 0x20C0,\n    0x64B3, 0x64B3, 0x2362, 0x64B4, 0x64B4, 0x33E5, 0x64B5, 0x64B5, 0x0B4F,\n    0x64B6, 0x64B6, 0x33E6, 0x64B7, 0x64B8, 0x14EA, 0x64B9, 0x64B9, 0x33E7,\n    0x64BA, 0x64BA, 0x14ED, 0x64BB, 0x64BB, 0x2160, 0x64BC, 0x64BC, 0x076A,\n    0x64BD, 0x64BD, 0x33E8, 0x64BE, 0x64BE, 0x219D, 0x64BF, 0x64BF, 0x1F8E,\n    0x64C0, 0x64C0, 0x14EE, 0x64C1, 0x64C1, 0x222D, 0x64C2, 0x64C2, 0x09C9,\n    0x64C3, 0x64C3, 0x33E9, 0x64C4, 0x64C4, 0x2047, 0x64C5, 0x64C5, 0x0CFC,\n    0x64C6, 0x64C6, 0x33EA, 0x64C7, 0x64C7, 0x2262, 0x64C8, 0x64C9, 0x33EB,\n    0x64CA, 0x64CA, 0x1F67, 0x64CB, 0x64CB, 0x1EB2, 0x64CC, 0x64CC, 0x33ED,\n    0x64CD, 0x64CD, 0x04A0, 0x64CE, 0x64CE, 0x0C63, 0x64CF, 0x64CF, 0x33EE,\n    0x64D0, 0x64D0, 0x14EF, 0x64D1, 0x64D1, 0x33EF, 0x64D2, 0x64D2, 0x0C59,\n    0x64D3, 0x64D3, 0x33F0, 0x64D4, 0x64D4, 0x1EA9, 0x64D5, 0x64D6, 0x33F1,\n    0x64D7, 0x64D7, 0x14F0, 0x64D8, 0x64D8, 0x1952, 0x64D9, 0x64D9, 0x33F3,\n    0x64DA, 0x64DA, 0x1FCC, 0x64DB, 0x64DD, 0x33F4, 0x64DE, 0x64DE, 0x0DC8,\n    0x64DF, 0x64DF, 0x33F7, 0x64E0, 0x64E0, 0x1F72, 0x64E1, 0x64E1, 0x33F8,\n    0x64E2, 0x64E2, 0x14F2, 0x64E3, 0x64E3, 0x33F9, 0x64E4, 0x64E4, 0x14F1,\n    0x64E5, 0x64E5, 0x33FA, 0x64E6, 0x64E6, 0x0488, 0x64E7, 0x64EB, 0x33FB,\n    0x64EC, 0x64EC, 0x2098, 0x64ED, 0x64EE, 0x3400, 0x64EF, 0x64EF, 0x1E52,\n    0x64F0, 0x64F0, 0x20A4, 0x64F1, 0x64F1, 0x1F1C, 0x64F2, 0x64F2, 0x228F,\n    0x64F3, 0x64F3, 0x3402, 0x64F4, 0x64F4, 0x1FED, 0x64F5, 0x64F6, 0x3403,\n    0x64F7, 0x64F7, 0x2365, 0x64F8, 0x64F9, 0x3405, 0x64FA, 0x64FA, 0x1E2D,\n    0x64FB, 0x64FB, 0x2152, 0x64FC, 0x64FC, 0x2366, 0x64FD, 0x64FD, 0x3407,\n    0x64FE, 0x64FE, 0x20FA, 0x64FF, 0x64FF, 0x3408, 0x6500, 0x6500, 0x0B8B,\n    0x6501, 0x6503, 0x3409, 0x6504, 0x6504, 0x2363, 0x6505, 0x6505, 0x340C,\n    0x6506, 0x6506, 0x209A, 0x6507, 0x6508, 0x340D, 0x6509, 0x6509, 0x14F3,\n    0x650A, 0x650E, 0x340F, 0x650F, 0x650F, 0x203C, 0x6510, 0x6511, 0x3414,\n    0x6512, 0x6512, 0x111F, 0x6513, 0x6513, 0x3416, 0x6514, 0x6514, 0x1FF6,\n    0x6515, 0x6515, 0x3417, 0x6516, 0x6516, 0x2364, 0x6517, 0x6517, 0x3418,\n    0x6518, 0x6518, 0x0C9C, 0x6519, 0x6519, 0x1E69, 0x651A, 0x651A, 0x3419,\n    0x651B, 0x651B, 0x2367, 0x651C, 0x651C, 0x341A, 0x651D, 0x651D, 0x211D,\n    0x651E, 0x6521, 0x341B, 0x6522, 0x6522, 0x2259, 0x6523, 0x6523, 0x2056,\n    0x6524, 0x6524, 0x2163, 0x6525, 0x6525, 0x14F4, 0x6526, 0x6529, 0x341F,\n    0x652A, 0x652A, 0x1FA9, 0x652B, 0x652B, 0x091F, 0x652C, 0x652C, 0x1FFC,\n    0x652D, 0x652D, 0x3423, 0x652E, 0x652E, 0x14F5, 0x652F, 0x652F, 0x11A6,\n    0x6530, 0x6533, 0x3424, 0x6534, 0x6534, 0x1909, 0x6535, 0x6535, 0x1966,\n    0x6536, 0x6536, 0x0D6C, 0x6537, 0x6537, 0x3428, 0x6538, 0x6538, 0x12B2,\n    0x6539, 0x6539, 0x06BF, 0x653A, 0x653A, 0x3429, 0x653B, 0x653B, 0x06FE,\n    0x653C, 0x653D, 0x342A, 0x653E, 0x653E, 0x0662, 0x653F, 0x653F, 0x119F,\n    0x6540, 0x6544, 0x342C, 0x6545, 0x6545, 0x0723, 0x6546, 0x6547, 0x3431,\n    0x6548, 0x6548, 0x0F72, 0x6549, 0x6549, 0x1CCB, 0x654A, 0x654B, 0x3433,\n    0x654C, 0x654C, 0x05B1, 0x654D, 0x654E, 0x3435, 0x654F, 0x654F, 0x0AF9,\n    0x6550, 0x6550, 0x3437, 0x6551, 0x6551, 0x08F7, 0x6552, 0x6554, 0x3438,\n    0x6555, 0x6555, 0x1967, 0x6556, 0x6556, 0x03C8, 0x6557, 0x6557, 0x1E2E,\n    0x6558, 0x6558, 0x343B, 0x6559, 0x6559, 0x089D, 0x655A, 0x655A, 0x343C,\n    0x655B, 0x655B, 0x09FB, 0x655C, 0x655C, 0x343D, 0x655D, 0x655D, 0x043F,\n    0x655E, 0x655E, 0x04CD, 0x655F, 0x6561, 0x343E, 0x6562, 0x6562, 0x06CD,\n    0x6563, 0x6563, 0x0CDB, 0x6564, 0x6565, 0x3441, 0x6566, 0x6566, 0x0617,\n    0x6567, 0x656A, 0x3443, 0x656B, 0x656B, 0x1968, 0x656C, 0x656C, 0x08E3,\n    0x656D, 0x656F, 0x3447, 0x6570, 0x6570, 0x0D94, 0x6571, 0x6571, 0x344A,\n    0x6572, 0x6572, 0x0C40, 0x6573, 0x6573, 0x344B, 0x6574, 0x6574, 0x119C,\n    0x6575, 0x6575, 0x1EBC, 0x6576, 0x6576, 0x344C, 0x6577, 0x6577, 0x0690,\n    0x6578, 0x6578, 0x2142, 0x6579, 0x6581, 0x344D, 0x6582, 0x6582, 0x201E,\n    0x6583, 0x6583, 0x1E43, 0x6584, 0x6586, 0x3456, 0x6587, 0x6587, 0x0ED3,\n    0x6588, 0x658A, 0x3459, 0x658B, 0x658B, 0x114C, 0x658C, 0x658C, 0x045C,\n    0x658D, 0x658F, 0x345C, 0x6590, 0x6590, 0x19C1, 0x6591, 0x6591, 0x03EA,\n    0x6592, 0x6592, 0x345F, 0x6593, 0x6593, 0x19C3, 0x6594, 0x6594, 0x3460,\n    0x6595, 0x6595, 0x24D4, 0x6596, 0x6596, 0x3461, 0x6597, 0x6597, 0x05F6,\n    0x6598, 0x6598, 0x3462, 0x6599, 0x6599, 0x0A18, 0x659A, 0x659A, 0x3463,\n    0x659B, 0x659B, 0x1D56, 0x659C, 0x659C, 0x0F7C, 0x659D, 0x659E, 0x3464,\n    0x659F, 0x659F, 0x1186, 0x65A0, 0x65A0, 0x3466, 0x65A1, 0x65A1, 0x0EE2,\n    0x65A2, 0x65A3, 0x3467, 0x65A4, 0x65A4, 0x08C0, 0x65A5, 0x65A5, 0x0507,\n    0x65A6, 0x65A6, 0x3469, 0x65A7, 0x65A7, 0x06A6, 0x65A8, 0x65A8, 0x346A,\n    0x65A9, 0x65A9, 0x1157, 0x65AA, 0x65AA, 0x346B, 0x65AB, 0x65AB, 0x1A29,\n    0x65AC, 0x65AC, 0x226F, 0x65AD, 0x65AD, 0x060E, 0x65AE, 0x65AE, 0x346C,\n    0x65AF, 0x65AF, 0x0DAE, 0x65B0, 0x65B0, 0x0F8D, 0x65B1, 0x65B6, 0x346D,\n    0x65B7, 0x65B7, 0x1ED7, 0x65B8, 0x65B8, 0x3473, 0x65B9, 0x65B9, 0x065A,\n    0x65BA, 0x65BB, 0x3474, 0x65BC, 0x65BC, 0x19C4, 0x65BD, 0x65BD, 0x0D40,\n    0x65BE, 0x65C0, 0x3476, 0x65C1, 0x65C1, 0x0B95, 0x65C2, 0x65C2, 0x3479,\n    0x65C3, 0x65C3, 0x19C7, 0x65C4, 0x65C4, 0x19C6, 0x65C5, 0x65C5, 0x0A6A,\n    0x65C6, 0x65C6, 0x19C5, 0x65C7, 0x65CA, 0x347A, 0x65CB, 0x65CB, 0x0FC8,\n    0x65CC, 0x65CC, 0x19C8, 0x65CD, 0x65CD, 0x347E, 0x65CE, 0x65CE, 0x19C9,\n    0x65CF, 0x65CF, 0x1242, 0x65D0, 0x65D1, 0x347F, 0x65D2, 0x65D2, 0x19CA,\n    0x65D3, 0x65D5, 0x3481, 0x65D6, 0x65D6, 0x19CB, 0x65D7, 0x65D7, 0x0C0B,\n    0x65D8, 0x65DF, 0x3484, 0x65E0, 0x65E0, 0x0EED, 0x65E1, 0x65E1, 0x348C,\n    0x65E2, 0x65E2, 0x083B, 0x65E3, 0x65E4, 0x348D, 0x65E5, 0x65E5, 0x0CB0,\n    0x65E6, 0x65E6, 0x058A, 0x65E7, 0x65E7, 0x08F8, 0x65E8, 0x65E8, 0x11BB,\n    0x65E9, 0x65E9, 0x112A, 0x65EA, 0x65EB, 0x348F, 0x65EC, 0x65EC, 0x0FD7,\n    0x65ED, 0x65ED, 0x0FBC, 0x65EE, 0x65F0, 0x190A, 0x65F1, 0x65F1, 0x076C,\n    0x65F2, 0x65F5, 0x3491, 0x65F6, 0x65F6, 0x0D48, 0x65F7, 0x65F7, 0x0982,\n    0x65F8, 0x65F9, 0x3495, 0x65FA, 0x65FA, 0x0EAB, 0x65FB, 0x65FF, 0x3497,\n    0x6600, 0x6600, 0x1912, 0x6601, 0x6601, 0x349C, 0x6602, 0x6602, 0x03C5,\n    0x6603, 0x6603, 0x1910, 0x6604, 0x6605, 0x349D, 0x6606, 0x6606, 0x0990,\n    0x6607, 0x6609, 0x349F, 0x660A, 0x660A, 0x190D, 0x660B, 0x660B, 0x34A2,\n    0x660C, 0x660C, 0x04C4, 0x660D, 0x660D, 0x34A3, 0x660E, 0x660E, 0x0AFC,\n    0x660F, 0x660F, 0x07FD, 0x6610, 0x6612, 0x34A4, 0x6613, 0x6613, 0x105E,\n    0x6614, 0x6614, 0x0F03, 0x6615, 0x6615, 0x1911, 0x6616, 0x6618, 0x34A7,\n    0x6619, 0x6619, 0x190E, 0x661A, 0x661C, 0x34AA, 0x661D, 0x661D, 0x1915,\n    0x661E, 0x661E, 0x34AD, 0x661F, 0x661F, 0x0F92, 0x6620, 0x6620, 0x1098,\n    0x6621, 0x6624, 0x34AE, 0x6625, 0x6625, 0x053D, 0x6626, 0x6626, 0x34B2,\n    0x6627, 0x6627, 0x0AC6, 0x6628, 0x6628, 0x124F, 0x6629, 0x662C, 0x34B3,\n    0x662D, 0x662D, 0x1172, 0x662E, 0x662E, 0x34B7, 0x662F, 0x662F, 0x0D5E,\n    0x6630, 0x6630, 0x34B8, 0x6631, 0x6631, 0x1917, 0x6632, 0x6633, 0x34B9,\n    0x6634, 0x6634, 0x1916, 0x6635, 0x6635, 0x1919, 0x6636, 0x6636, 0x1918,\n    0x6637, 0x663B, 0x34BB, 0x663C, 0x663C, 0x11E6, 0x663D, 0x663D, 0x34C0,\n    0x663E, 0x663E, 0x0F41, 0x663F, 0x6640, 0x34C1, 0x6641, 0x6641, 0x191D,\n    0x6642, 0x6642, 0x212D, 0x6643, 0x6643, 0x07E3, 0x6644, 0x664A, 0x34C3,\n    0x664B, 0x664B, 0x08CB, 0x664C, 0x664C, 0x0D07, 0x664D, 0x664E, 0x34CA,\n    0x664F, 0x664F, 0x191E, 0x6650, 0x6651, 0x34CC, 0x6652, 0x6652, 0x0CF2,\n    0x6653, 0x6653, 0x0F6B, 0x6654, 0x6654, 0x191C, 0x6655, 0x6655, 0x1111,\n    0x6656, 0x6656, 0x191F, 0x6657, 0x6657, 0x1921, 0x6658, 0x6659, 0x34CE,\n    0x665A, 0x665A, 0x0E9E, 0x665B, 0x665C, 0x34D0, 0x665D, 0x665D, 0x229B,\n    0x665E, 0x665E, 0x34D2, 0x665F, 0x665F, 0x191B, 0x6660, 0x6660, 0x34D3,\n    0x6661, 0x6661, 0x1920, 0x6662, 0x6663, 0x34D4, 0x6664, 0x6664, 0x0EFD,\n    0x6665, 0x6665, 0x34D6, 0x6666, 0x6666, 0x07F3, 0x6667, 0x6667, 0x34D7,\n    0x6668, 0x6668, 0x04E4, 0x6669, 0x666D, 0x34D8, 0x666E, 0x666E, 0x0BF4,\n    0x666F, 0x666F, 0x08DF, 0x6670, 0x6670, 0x0F09, 0x6671, 0x6673, 0x34DD,\n    0x6674, 0x6674, 0x0C64, 0x6675, 0x6675, 0x34E0, 0x6676, 0x6676, 0x08D6,\n    0x6677, 0x6677, 0x1922, 0x6678, 0x6679, 0x34E1, 0x667A, 0x667A, 0x11C6,\n    0x667B, 0x667D, 0x34E3, 0x667E, 0x667E, 0x0A09, 0x667F, 0x6681, 0x34E6,\n    0x6682, 0x6682, 0x1120, 0x6683, 0x6683, 0x34E9, 0x6684, 0x6684, 0x1923,\n    0x6685, 0x6686, 0x34EA, 0x6687, 0x6687, 0x0F2B, 0x6688, 0x6688, 0x2256,\n    0x6689, 0x6689, 0x24A8, 0x668A, 0x668B, 0x34EC, 0x668C, 0x668C, 0x1924,\n    0x668D, 0x6690, 0x34EE, 0x6691, 0x6691, 0x0D85, 0x6692, 0x6695, 0x34F2,\n    0x6696, 0x6696, 0x0B70, 0x6697, 0x6697, 0x03C0, 0x6698, 0x669C, 0x34F6,\n    0x669D, 0x669D, 0x1926, 0x669E, 0x66A1, 0x34FB, 0x66A2, 0x66A2, 0x1E79,\n    0x66A3, 0x66A6, 0x34FF, 0x66A7, 0x66A7, 0x1925, 0x66A8, 0x66A8, 0x1CDD,\n    0x66A9, 0x66AA, 0x3503, 0x66AB, 0x66AB, 0x225A, 0x66AC, 0x66AD, 0x3505,\n    0x66AE, 0x66AE, 0x0B1D, 0x66AF, 0x66B3, 0x3507, 0x66B4, 0x66B4, 0x0412,\n    0x66B5, 0x66B8, 0x350C, 0x66B9, 0x66B9, 0x175B, 0x66BA, 0x66BD, 0x3510,\n    0x66BE, 0x66BE, 0x1927, 0x66BF, 0x66C3, 0x3514, 0x66C4, 0x66C4, 0x24A7,\n    0x66C5, 0x66C5, 0x3519, 0x66C6, 0x66C6, 0x2686, 0x66C7, 0x66C7, 0x24A6,\n    0x66C8, 0x66C8, 0x351A, 0x66C9, 0x66C9, 0x21CE, 0x66CA, 0x66D5, 0x351B,\n    0x66D6, 0x66D6, 0x24A9, 0x66D7, 0x66D8, 0x3527, 0x66D9, 0x66D9, 0x0D86,\n    0x66DA, 0x66DA, 0x3529, 0x66DB, 0x66DC, 0x1928, 0x66DD, 0x66DD, 0x0BF7,\n    0x66DE, 0x66DF, 0x352A, 0x66E0, 0x66E0, 0x1FE7, 0x66E1, 0x66E5, 0x352C,\n    0x66E6, 0x66E6, 0x192A, 0x66E7, 0x66E8, 0x3531, 0x66E9, 0x66E9, 0x192B,\n    0x66EA, 0x66EB, 0x3533, 0x66EC, 0x66EC, 0x2112, 0x66ED, 0x66EF, 0x3535,\n    0x66F0, 0x66F0, 0x10FE, 0x66F1, 0x66F1, 0x3538, 0x66F2, 0x66F2, 0x0C77,\n    0x66F3, 0x66F3, 0x103E, 0x66F4, 0x66F4, 0x06F7, 0x66F5, 0x66F6, 0x3539,\n    0x66F7, 0x66F7, 0x1914, 0x66F8, 0x66F8, 0x213C, 0x66F9, 0x66F9, 0x04A3,\n    0x66FA, 0x66FB, 0x353B, 0x66FC, 0x66FC, 0x0AA3, 0x66FD, 0x66FD, 0x353D,\n    0x66FE, 0x66FE, 0x113B, 0x66FF, 0x66FF, 0x0E39, 0x6700, 0x6700, 0x124B,\n    0x6701, 0x6702, 0x353E, 0x6703, 0x6703, 0x1F5C, 0x6704, 0x6707, 0x3540,\n    0x6708, 0x6708, 0x1105, 0x6709, 0x6709, 0x10B5, 0x670A, 0x670A, 0x1973,\n    0x670B, 0x670B, 0x0BB4, 0x670C, 0x670C, 0x3544, 0x670D, 0x670D, 0x069B,\n    0x670E, 0x670F, 0x3545, 0x6710, 0x6710, 0x1984, 0x6711, 0x6713, 0x3547,\n    0x6714, 0x6714, 0x0DAC, 0x6715, 0x6715, 0x198E, 0x6716, 0x6716, 0x354A,\n    0x6717, 0x6717, 0x09B5, 0x6718, 0x671A, 0x354B, 0x671B, 0x671B, 0x0EAC,\n    0x671C, 0x671C, 0x354E, 0x671D, 0x671D, 0x04D4, 0x671E, 0x671E, 0x354F,\n    0x671F, 0x671F, 0x0BF9, 0x6720, 0x6725, 0x3550, 0x6726, 0x6726, 0x19AC,\n    0x6727, 0x6727, 0x24C4, 0x6728, 0x6728, 0x0B21, 0x6729, 0x6729, 0x3556,\n    0x672A, 0x672A, 0x0EC3, 0x672B, 0x672B, 0x0B0C, 0x672C, 0x672C, 0x0427,\n    0x672D, 0x672D, 0x1140, 0x672E, 0x672E, 0x3557, 0x672F, 0x672F, 0x0D8C,\n    0x6730, 0x6730, 0x3558, 0x6731, 0x6731, 0x11EB, 0x6732, 0x6733, 0x3559,\n    0x6734, 0x6734, 0x0BF2, 0x6735, 0x6735, 0x0623, 0x6736, 0x6739, 0x355B,\n    0x673A, 0x673A, 0x080F, 0x673B, 0x673C, 0x355F, 0x673D, 0x673D, 0x0FAB,\n    0x673E, 0x673F, 0x3561, 0x6740, 0x6740, 0x0CEA, 0x6741, 0x6741, 0x3563,\n    0x6742, 0x6742, 0x1116, 0x6743, 0x6743, 0x0C83, 0x6744, 0x6745, 0x3564,\n    0x6746, 0x6746, 0x06C6, 0x6747, 0x6747, 0x3566, 0x6748, 0x6748, 0x1854,\n    0x6749, 0x6749, 0x0CF5, 0x674A, 0x674B, 0x3567, 0x674C, 0x674C, 0x1851,\n    0x674D, 0x674D, 0x3569, 0x674E, 0x674E, 0x09D9, 0x674F, 0x674F, 0x0F9E,\n    0x6750, 0x6750, 0x048B, 0x6751, 0x6751, 0x0568, 0x6752, 0x6752, 0x356A,\n    0x6753, 0x6753, 0x1852, 0x6754, 0x6755, 0x356B, 0x6756, 0x6756, 0x1169,\n    0x6757, 0x675B, 0x356D, 0x675C, 0x675C, 0x0604, 0x675D, 0x675D, 0x3572,\n    0x675E, 0x675E, 0x1853, 0x675F, 0x675F, 0x0D8F, 0x6760, 0x6760, 0x06D7,\n    0x6761, 0x6761, 0x0E48, 0x6762, 0x6764, 0x3573, 0x6765, 0x6765, 0x099F,\n    0x6766, 0x6767, 0x3576, 0x6768, 0x6768, 0x1017, 0x6769, 0x6769, 0x1855,\n    0x676A, 0x676A, 0x1858, 0x676B, 0x676C, 0x3578, 0x676D, 0x676D, 0x0773,\n    0x676E, 0x676E, 0x357A, 0x676F, 0x676F, 0x0416, 0x6770, 0x6770, 0x08AD,\n    0x6771, 0x6771, 0x1ECC, 0x6772, 0x6772, 0x190F, 0x6773, 0x6773, 0x1859,\n    0x6774, 0x6774, 0x357B, 0x6775, 0x6775, 0x185C, 0x6776, 0x6776, 0x357C,\n    0x6777, 0x6777, 0x1861, 0x6778, 0x677B, 0x357D, 0x677C, 0x677C, 0x1862,\n    0x677D, 0x677D, 0x3581, 0x677E, 0x677E, 0x0DBE, 0x677F, 0x677F, 0x03F0,\n    0x6780, 0x6780, 0x3582, 0x6781, 0x6781, 0x081E, 0x6782, 0x6783, 0x3583,\n    0x6784, 0x6784, 0x0712, 0x6785, 0x6786, 0x3585, 0x6787, 0x6787, 0x1857,\n    0x6788, 0x6788, 0x3587, 0x6789, 0x6789, 0x0EA8, 0x678A, 0x678A, 0x3588,\n    0x678B, 0x678B, 0x1860, 0x678C, 0x678F, 0x3589, 0x6790, 0x6790, 0x0F05,\n    0x6791, 0x6794, 0x358D, 0x6795, 0x6795, 0x118E, 0x6796, 0x6796, 0x3591,\n    0x6797, 0x6797, 0x0A1F, 0x6798, 0x6798, 0x185A, 0x6799, 0x6799, 0x3592,\n    0x679A, 0x679A, 0x0ABB, 0x679B, 0x679B, 0x3593, 0x679C, 0x679C, 0x0754,\n    0x679D, 0x679D, 0x11A5, 0x679E, 0x679E, 0x185E, 0x679F, 0x67A1, 0x3594,\n    0x67A2, 0x67A2, 0x0D77, 0x67A3, 0x67A3, 0x1129, 0x67A4, 0x67A4, 0x3597,\n    0x67A5, 0x67A5, 0x1856, 0x67A6, 0x67A6, 0x3598, 0x67A7, 0x67A7, 0x185B,\n    0x67A8, 0x67A8, 0x185D, 0x67A9, 0x67A9, 0x3599, 0x67AA, 0x67AA, 0x0C36,\n    0x67AB, 0x67AB, 0x0680, 0x67AC, 0x67AC, 0x359A, 0x67AD, 0x67AD, 0x185F,\n    0x67AE, 0x67AE, 0x359B, 0x67AF, 0x67AF, 0x096A, 0x67B0, 0x67B0, 0x1868,\n    0x67B1, 0x67B2, 0x359C, 0x67B3, 0x67B3, 0x186D, 0x67B4, 0x67B4, 0x359E,\n    0x67B5, 0x67B5, 0x186B, 0x67B6, 0x67B6, 0x084F, 0x67B7, 0x67B7, 0x0842,\n    0x67B8, 0x67B8, 0x1871, 0x67B9, 0x67C0, 0x359F, 0x67C1, 0x67C1, 0x1874,\n    0x67C2, 0x67C2, 0x35A7, 0x67C3, 0x67C3, 0x1870, 0x67C4, 0x67C4, 0x0463,\n    0x67C5, 0x67CE, 0x35A8, 0x67CF, 0x67CF, 0x03E3, 0x67D0, 0x67D0, 0x0B16,\n    0x67D1, 0x67D1, 0x06C7, 0x67D2, 0x67D2, 0x0C01, 0x67D3, 0x67D3, 0x0C99,\n    0x67D4, 0x67D4, 0x0CBC, 0x67D5, 0x67D7, 0x35B2, 0x67D8, 0x67D8, 0x1865,\n    0x67D9, 0x67D9, 0x186A, 0x67DA, 0x67DA, 0x186C, 0x67DB, 0x67DB, 0x35B5,\n    0x67DC, 0x67DC, 0x074A, 0x67DD, 0x67DD, 0x186E, 0x67DE, 0x67DE, 0x1252,\n    0x67DF, 0x67DF, 0x35B6, 0x67E0, 0x67E0, 0x0B5E, 0x67E1, 0x67E1, 0x35B7,\n    0x67E2, 0x67E2, 0x1872, 0x67E3, 0x67E4, 0x35B8, 0x67E5, 0x67E5, 0x04B0,\n    0x67E6, 0x67E8, 0x35BA, 0x67E9, 0x67E9, 0x1867, 0x67EA, 0x67EB, 0x35BD,\n    0x67EC, 0x67EC, 0x0860, 0x67ED, 0x67EE, 0x35BF, 0x67EF, 0x67EF, 0x094F,\n    0x67F0, 0x67F0, 0x1863, 0x67F1, 0x67F1, 0x11F8, 0x67F2, 0x67F2, 0x35C1,\n    0x67F3, 0x67F3, 0x0A41, 0x67F4, 0x67F4, 0x04B8, 0x67F5, 0x67FC, 0x35C2,\n    0x67FD, 0x67FD, 0x1875, 0x67FE, 0x67FE, 0x35CA, 0x67FF, 0x67FF, 0x0D58,\n    0x6800, 0x6800, 0x186F, 0x6801, 0x6804, 0x35CB, 0x6805, 0x6805, 0x1145,\n    0x6806, 0x6806, 0x35CF, 0x6807, 0x6807, 0x0453, 0x6808, 0x6808, 0x115C,\n    0x6809, 0x6809, 0x1864, 0x680A, 0x680A, 0x1866, 0x680B, 0x680B, 0x05EF,\n    0x680C, 0x680C, 0x1869, 0x680D, 0x680D, 0x35D0, 0x680E, 0x680E, 0x1873,\n    0x680F, 0x680F, 0x09A3, 0x6810, 0x6810, 0x35D1, 0x6811, 0x6811, 0x0D8E,\n    0x6812, 0x6812, 0x35D2, 0x6813, 0x6813, 0x0D9D, 0x6814, 0x6815, 0x35D3,\n    0x6816, 0x6816, 0x0BFB, 0x6817, 0x6817, 0x09E0, 0x6818, 0x681C, 0x35D5,\n    0x681D, 0x681D, 0x187F, 0x681E, 0x6820, 0x35DA, 0x6821, 0x6821, 0x0F6E,\n    0x6822, 0x6828, 0x35DD, 0x6829, 0x6829, 0x1888, 0x682A, 0x682A, 0x11E9,\n    0x682B, 0x6831, 0x35E4, 0x6832, 0x6833, 0x1876, 0x6834, 0x6836, 0x35EB,\n    0x6837, 0x6837, 0x1022, 0x6838, 0x6838, 0x0782, 0x6839, 0x6839, 0x06F4,\n    0x683A, 0x683B, 0x35EE, 0x683C, 0x683C, 0x06EC, 0x683D, 0x683D, 0x1117,\n    0x683E, 0x683E, 0x1885, 0x683F, 0x683F, 0x35F0, 0x6840, 0x6840, 0x1884,\n    0x6841, 0x6841, 0x1882, 0x6842, 0x6842, 0x0749, 0x6843, 0x6843, 0x0E25,\n    0x6844, 0x6844, 0x187C, 0x6845, 0x6845, 0x0EB5, 0x6846, 0x6846, 0x097F,\n    0x6847, 0x6847, 0x35F1, 0x6848, 0x6848, 0x03C3, 0x6849, 0x6849, 0x1887,\n    0x684A, 0x684A, 0x1886, 0x684B, 0x684B, 0x35F2, 0x684C, 0x684C, 0x121D,\n    0x684D, 0x684D, 0x35F3, 0x684E, 0x684E, 0x187A, 0x684F, 0x684F, 0x35F4,\n    0x6850, 0x6850, 0x0E5A, 0x6851, 0x6851, 0x0CDC, 0x6852, 0x6852, 0x35F5,\n    0x6853, 0x6853, 0x07CD, 0x6854, 0x6854, 0x08AC, 0x6855, 0x6855, 0x1880,\n    0x6856, 0x685F, 0x35F6, 0x6860, 0x6861, 0x1878, 0x6862, 0x6862, 0x187B,\n    0x6863, 0x6863, 0x0596, 0x6864, 0x6864, 0x187D, 0x6865, 0x6865, 0x0C42,\n    0x6866, 0x6866, 0x1881, 0x6867, 0x6867, 0x1883, 0x6868, 0x6868, 0x0881,\n    0x6869, 0x6869, 0x120B, 0x686A, 0x686A, 0x3600, 0x686B, 0x686B, 0x188E,\n    0x686C, 0x6873, 0x3601, 0x6874, 0x6874, 0x188B, 0x6875, 0x6875, 0x3609,\n    0x6876, 0x6876, 0x0E61, 0x6877, 0x6877, 0x188C, 0x6878, 0x6880, 0x360A,\n    0x6881, 0x6881, 0x0A03, 0x6882, 0x6882, 0x3613, 0x6883, 0x6883, 0x187E,\n    0x6884, 0x6884, 0x3614, 0x6885, 0x6885, 0x0ABC, 0x6886, 0x6886, 0x03FB,\n    0x6887, 0x688E, 0x3615, 0x688F, 0x688F, 0x188A, 0x6890, 0x6892, 0x361D,\n    0x6893, 0x6893, 0x188D, 0x6894, 0x6896, 0x3620, 0x6897, 0x6897, 0x06FC,\n    0x6898, 0x6898, 0x246A, 0x6899, 0x689C, 0x3623, 0x689D, 0x689D, 0x2175,\n    0x689E, 0x689E, 0x3627, 0x689F, 0x689F, 0x246D, 0x68A0, 0x68A1, 0x3628,\n    0x68A2, 0x68A2, 0x0D0B, 0x68A3, 0x68A5, 0x362A, 0x68A6, 0x68A6, 0x0AD3,\n    0x68A7, 0x68A7, 0x0EEF, 0x68A8, 0x68A8, 0x09D1, 0x68A9, 0x68AC, 0x362D,\n    0x68AD, 0x68AD, 0x0DE8, 0x68AE, 0x68AE, 0x3631, 0x68AF, 0x68AF, 0x0E30,\n    0x68B0, 0x68B0, 0x0F80, 0x68B1, 0x68B2, 0x3632, 0x68B3, 0x68B3, 0x0D78,\n    0x68B4, 0x68B4, 0x3634, 0x68B5, 0x68B5, 0x1889, 0x68B6, 0x68BF, 0x3635,\n    0x68C0, 0x68C0, 0x085F, 0x68C1, 0x68C1, 0x363F, 0x68C2, 0x68C2, 0x188F,\n    0x68C3, 0x68C8, 0x3640, 0x68C9, 0x68C9, 0x0AE3, 0x68CA, 0x68CA, 0x3646,\n    0x68CB, 0x68CB, 0x0C04, 0x68CC, 0x68CC, 0x3647, 0x68CD, 0x68CD, 0x0750,\n    0x68CE, 0x68D1, 0x3648, 0x68D2, 0x68D2, 0x03FF, 0x68D3, 0x68D4, 0x364C,\n    0x68D5, 0x68D5, 0x1235, 0x68D6, 0x68D6, 0x246B, 0x68D7, 0x68D7, 0x225F,\n    0x68D8, 0x68D8, 0x081F, 0x68D9, 0x68D9, 0x364E, 0x68DA, 0x68DA, 0x0BB0,\n    0x68DB, 0x68DE, 0x364F, 0x68DF, 0x68DF, 0x1ECE, 0x68E0, 0x68E0, 0x0E17,\n    0x68E1, 0x68E2, 0x3653, 0x68E3, 0x68E3, 0x189A, 0x68E4, 0x68E6, 0x3655,\n    0x68E7, 0x68E7, 0x2272, 0x68E8, 0x68ED, 0x3658, 0x68EE, 0x68EE, 0x0CE6,\n    0x68EF, 0x68EF, 0x365E, 0x68F0, 0x68F0, 0x1896, 0x68F1, 0x68F1, 0x09CD,\n    0x68F2, 0x68F4, 0x365F, 0x68F5, 0x68F5, 0x0950, 0x68F6, 0x68F8, 0x3662,\n    0x68F9, 0x68F9, 0x1894, 0x68FA, 0x68FA, 0x0730, 0x68FB, 0x68FB, 0x3665,\n    0x68FC, 0x68FC, 0x1891, 0x68FD, 0x68FF, 0x3666, 0x6900, 0x6900, 0x3669,\n    0x6901, 0x6901, 0x1898, 0x6902, 0x6904, 0x366A, 0x6905, 0x6905, 0x1055,\n    0x6906, 0x690A, 0x366D, 0x690B, 0x690B, 0x1897, 0x690C, 0x690C, 0x3672,\n    0x690D, 0x690D, 0x11B1, 0x690E, 0x690E, 0x1212, 0x690F, 0x690F, 0x2473,\n    0x6910, 0x6910, 0x189B, 0x6911, 0x6911, 0x3673, 0x6912, 0x6912, 0x0888,\n    0x6913, 0x691E, 0x3674, 0x691F, 0x6920, 0x1892, 0x6921, 0x6923, 0x3680,\n    0x6924, 0x6924, 0x1895, 0x6925, 0x692C, 0x3683, 0x692D, 0x692D, 0x0E87,\n    0x692E, 0x692F, 0x368B, 0x6930, 0x6930, 0x1033, 0x6931, 0x6933, 0x368D,\n    0x6934, 0x6934, 0x18A6, 0x6935, 0x6938, 0x3690, 0x6939, 0x6939, 0x189D,\n    0x693A, 0x693C, 0x3694, 0x693D, 0x693D, 0x052D, 0x693E, 0x693E, 0x3697,\n    0x693F, 0x693F, 0x053E, 0x6940, 0x6941, 0x3698, 0x6942, 0x6942, 0x189F,\n    0x6943, 0x6949, 0x369A, 0x694A, 0x694A, 0x21FE, 0x694B, 0x6952, 0x36A1,\n    0x6953, 0x6953, 0x1EFE, 0x6954, 0x6954, 0x0F73, 0x6955, 0x6956, 0x36A9,\n    0x6957, 0x6957, 0x1899, 0x6958, 0x6959, 0x36AB, 0x695A, 0x695A, 0x0523,\n    0x695B, 0x695C, 0x36AD, 0x695D, 0x695D, 0x18A0, 0x695E, 0x695E, 0x09CE,\n    0x695F, 0x695F, 0x36AF, 0x6960, 0x6960, 0x189E, 0x6961, 0x6962, 0x36B0,\n    0x6963, 0x6963, 0x18AD, 0x6964, 0x6965, 0x36B2, 0x6966, 0x6966, 0x18AC,\n    0x6967, 0x6967, 0x36B4, 0x6968, 0x6968, 0x2475, 0x6969, 0x696A, 0x36B5,\n    0x696B, 0x696B, 0x18A2, 0x696C, 0x696C, 0x36B7, 0x696D, 0x696D, 0x220A,\n    0x696E, 0x696E, 0x1890, 0x696F, 0x6970, 0x36B8, 0x6971, 0x6971, 0x189C,\n    0x6972, 0x6974, 0x36BA, 0x6975, 0x6975, 0x1F6F, 0x6976, 0x6976, 0x36BD,\n    0x6977, 0x6977, 0x0939, 0x6978, 0x6978, 0x18A5, 0x6979, 0x6979, 0x18AE,\n    0x697A, 0x697B, 0x36BE, 0x697C, 0x697C, 0x0A4C, 0x697D, 0x697F, 0x36C0,\n    0x6980, 0x6980, 0x18A3, 0x6981, 0x6981, 0x36C3, 0x6982, 0x6982, 0x06C0,\n    0x6983, 0x6983, 0x36C4, 0x6984, 0x6984, 0x18A1, 0x6985, 0x6985, 0x36C5,\n    0x6986, 0x6986, 0x10C1, 0x6987, 0x6988, 0x18A8, 0x6989, 0x6989, 0x18AB,\n    0x698A, 0x698C, 0x36C6, 0x698D, 0x698D, 0x18BB, 0x698E, 0x6993, 0x36C9,\n    0x6994, 0x6994, 0x09B1, 0x6995, 0x6995, 0x18B9, 0x6996, 0x6997, 0x36CF,\n    0x6998, 0x6998, 0x18A4, 0x6999, 0x699A, 0x36D1, 0x699B, 0x699B, 0x18AF,\n    0x699C, 0x699C, 0x03FC, 0x699D, 0x69A6, 0x36D3, 0x69A7, 0x69A7, 0x18B0,\n    0x69A8, 0x69A8, 0x1146, 0x69A9, 0x69A9, 0x36DD, 0x69AA, 0x69AA, 0x2468,\n    0x69AB, 0x69AB, 0x18B2, 0x69AC, 0x69AC, 0x36DE, 0x69AD, 0x69AD, 0x18B3,\n    0x69AE, 0x69AE, 0x2100, 0x69AF, 0x69B0, 0x36DF, 0x69B1, 0x69B1, 0x18B5,\n    0x69B2, 0x69B3, 0x36E1, 0x69B4, 0x69B4, 0x0A3A, 0x69B5, 0x69B6, 0x36E3,\n    0x69B7, 0x69B7, 0x0C91, 0x69B8, 0x69BA, 0x36E5, 0x69BB, 0x69BB, 0x18B1,\n    0x69BC, 0x69BE, 0x36E8, 0x69BF, 0x69BF, 0x2476, 0x69C0, 0x69C0, 0x36EB,\n    0x69C1, 0x69C1, 0x18B6, 0x69C2, 0x69C9, 0x36EC, 0x69CA, 0x69CA, 0x18B7,\n    0x69CB, 0x69CB, 0x1F27, 0x69CC, 0x69CC, 0x18A7, 0x69CD, 0x69CD, 0x20D7,\n    0x69CE, 0x69CE, 0x18AA, 0x69CF, 0x69CF, 0x36F4, 0x69D0, 0x69D0, 0x07C6,\n    0x69D1, 0x69D3, 0x36F5, 0x69D4, 0x69D4, 0x18B4, 0x69D5, 0x69DA, 0x36F8,\n    0x69DB, 0x69DB, 0x086A, 0x69DC, 0x69DE, 0x36FE, 0x69DF, 0x69DF, 0x18B8,\n    0x69E0, 0x69E0, 0x18BA, 0x69E1, 0x69E6, 0x3701, 0x69E7, 0x69E7, 0x247C,\n    0x69E8, 0x69EC, 0x3707, 0x69ED, 0x69ED, 0x18BE, 0x69EE, 0x69F1, 0x370C,\n    0x69F2, 0x69F2, 0x18C2, 0x69F3, 0x69F3, 0x1FA1, 0x69F4, 0x69FC, 0x3710,\n    0x69FD, 0x69FD, 0x04A2, 0x69FE, 0x69FE, 0x3719, 0x69FF, 0x69FF, 0x18BC,\n    0x6A00, 0x6A00, 0x371A, 0x6A01, 0x6A01, 0x22AA, 0x6A02, 0x6A02, 0x2005,\n    0x6A03, 0x6A04, 0x371B, 0x6A05, 0x6A05, 0x246C, 0x6A06, 0x6A09, 0x371D,\n    0x6A0A, 0x6A0A, 0x064B, 0x6A0B, 0x6A12, 0x3721, 0x6A13, 0x6A13, 0x203E,\n    0x6A14, 0x6A16, 0x3729, 0x6A17, 0x6A18, 0x18BF, 0x6A19, 0x6A19, 0x1E4C,\n    0x6A1A, 0x6A1D, 0x372C, 0x6A1E, 0x6A1E, 0x213A, 0x6A1F, 0x6A1F, 0x1162,\n    0x6A20, 0x6A20, 0x3730, 0x6A21, 0x6A21, 0x0B06, 0x6A22, 0x6A22, 0x3731,\n    0x6A23, 0x6A23, 0x2204, 0x6A24, 0x6A27, 0x3732, 0x6A28, 0x6A28, 0x18CC,\n    0x6A29, 0x6A29, 0x3736, 0x6A2A, 0x6A2A, 0x0798, 0x6A2B, 0x6A2E, 0x3737,\n    0x6A2F, 0x6A2F, 0x18BD, 0x6A30, 0x6A30, 0x373B, 0x6A31, 0x6A31, 0x1088,\n    0x6A32, 0x6A34, 0x373C, 0x6A35, 0x6A35, 0x18C8, 0x6A36, 0x6A37, 0x373F,\n    0x6A38, 0x6A38, 0x20C3, 0x6A39, 0x6A39, 0x2140, 0x6A3A, 0x6A3A, 0x2477,\n    0x6A3B, 0x6A3C, 0x3741, 0x6A3D, 0x6A3D, 0x18CB, 0x6A3E, 0x6A3E, 0x18C4,\n    0x6A3F, 0x6A43, 0x3743, 0x6A44, 0x6A44, 0x18C3, 0x6A45, 0x6A46, 0x3748,\n    0x6A47, 0x6A47, 0x0C3E, 0x6A48, 0x6A48, 0x2474, 0x6A49, 0x6A4A, 0x374A,\n    0x6A4B, 0x6A4B, 0x20DD, 0x6A4C, 0x6A4F, 0x374C, 0x6A50, 0x6A50, 0x18C6,\n    0x6A51, 0x6A57, 0x3750, 0x6A58, 0x6A58, 0x18CD, 0x6A59, 0x6A59, 0x04ED,\n    0x6A5A, 0x6A5A, 0x3757, 0x6A5B, 0x6A5B, 0x18C7, 0x6A5C, 0x6A5E, 0x3758,\n    0x6A5F, 0x6A5F, 0x1F68, 0x6A60, 0x6A60, 0x375B, 0x6A61, 0x6A61, 0x0F5D,\n    0x6A62, 0x6A62, 0x2185, 0x6A63, 0x6A64, 0x375C, 0x6A65, 0x6A65, 0x18C1,\n    0x6A66, 0x6A70, 0x375E, 0x6A71, 0x6A71, 0x051C, 0x6A72, 0x6A78, 0x3769,\n    0x6A79, 0x6A79, 0x18CA, 0x6A7A, 0x6A7B, 0x3770, 0x6A7C, 0x6A7C, 0x18CE,\n    0x6A7D, 0x6A7F, 0x3772, 0x6A80, 0x6A80, 0x0E07, 0x6A81, 0x6A83, 0x3775,\n    0x6A84, 0x6A84, 0x0F1A, 0x6A85, 0x6A88, 0x3778, 0x6A89, 0x6A89, 0x2472,\n    0x6A8A, 0x6A8D, 0x377C, 0x6A8E, 0x6A8E, 0x18C9, 0x6A8F, 0x6A8F, 0x3780,\n    0x6A90, 0x6A90, 0x18D0, 0x6A91, 0x6A91, 0x18CF, 0x6A92, 0x6A93, 0x3781,\n    0x6A94, 0x6A94, 0x1EB5, 0x6A95, 0x6A96, 0x3783, 0x6A97, 0x6A97, 0x18D2,\n    0x6A98, 0x6A9B, 0x3785, 0x6A9C, 0x6A9C, 0x2478, 0x6A9D, 0x6A9F, 0x3789,\n    0x6AA0, 0x6AA0, 0x18C5, 0x6AA1, 0x6AA1, 0x378C, 0x6AA2, 0x6AA2, 0x1F8B,\n    0x6AA3, 0x6AA3, 0x2484, 0x6AA4, 0x6AA8, 0x378D, 0x6AA9, 0x6AA9, 0x18D1,\n    0x6AAA, 0x6AAA, 0x3792, 0x6AAB, 0x6AAB, 0x18D3, 0x6AAC, 0x6AAC, 0x0ACF,\n    0x6AAD, 0x6AAE, 0x3793, 0x6AAF, 0x6AAF, 0x2699, 0x6AB0, 0x6AB2, 0x3795,\n    0x6AB3, 0x6AB3, 0x2482, 0x6AB4, 0x6AB7, 0x3798, 0x6AB8, 0x6AB8, 0x20A1,\n    0x6AB9, 0x6ABA, 0x379C, 0x6ABB, 0x6ABB, 0x1F92, 0x6ABC, 0x6AC2, 0x379E,\n    0x6AC3, 0x6AC3, 0x1F38, 0x6AC4, 0x6AD2, 0x37A5, 0x6AD3, 0x6AD3, 0x2485,\n    0x6AD4, 0x6AD9, 0x37B4, 0x6ADA, 0x6ADA, 0x2480, 0x6ADB, 0x6ADB, 0x246E,\n    0x6ADC, 0x6ADC, 0x37BA, 0x6ADD, 0x6ADD, 0x247B, 0x6ADE, 0x6ADE, 0x2486,\n    0x6ADF, 0x6ADF, 0x2471, 0x6AE0, 0x6AE6, 0x37BB, 0x6AE7, 0x6AE7, 0x2483,\n    0x6AE8, 0x6AE8, 0x2470, 0x6AE9, 0x6AE9, 0x37C2, 0x6AEA, 0x6AEA, 0x2469,\n    0x6AEB, 0x6AEB, 0x37C3, 0x6AEC, 0x6AEC, 0x247F, 0x6AED, 0x6AF2, 0x37C4,\n    0x6AF3, 0x6AF3, 0x246F, 0x6AF4, 0x6AF7, 0x37CA, 0x6AF8, 0x6AF8, 0x2481,\n    0x6AF9, 0x6AFA, 0x37CE, 0x6AFB, 0x6AFB, 0x2220, 0x6AFC, 0x6AFF, 0x37D0,\n    0x6B00, 0x6B03, 0x37D4, 0x6B04, 0x6B04, 0x1FF5, 0x6B05, 0x6B09, 0x37D8,\n    0x6B0A, 0x6B0A, 0x20F4, 0x6B0B, 0x6B0E, 0x37DD, 0x6B0F, 0x6B0F, 0x247D,\n    0x6B10, 0x6B11, 0x37E1, 0x6B12, 0x6B12, 0x2479, 0x6B13, 0x6B15, 0x37E3,\n    0x6B16, 0x6B16, 0x247E, 0x6B17, 0x6B1D, 0x37E6, 0x6B1E, 0x6B1E, 0x247A,\n    0x6B1F, 0x6B1F, 0x37ED, 0x6B20, 0x6B20, 0x0C34, 0x6B21, 0x6B21, 0x0551,\n    0x6B22, 0x6B22, 0x07CB, 0x6B23, 0x6B23, 0x0F8B, 0x6B24, 0x6B24, 0x19B1,\n    0x6B25, 0x6B26, 0x37EE, 0x6B27, 0x6B27, 0x0B78, 0x6B28, 0x6B31, 0x37F0,\n    0x6B32, 0x6B32, 0x10E0, 0x6B33, 0x6B36, 0x37FA, 0x6B37, 0x6B37, 0x19B2,\n    0x6B38, 0x6B38, 0x37FE, 0x6B39, 0x6B39, 0x19B3, 0x6B3A, 0x6B3A, 0x0BFA,\n    0x6B3B, 0x6B3C, 0x37FF, 0x6B3D, 0x6B3D, 0x20E3, 0x6B3E, 0x6B3E, 0x097B,\n    0x6B3F, 0x6B42, 0x3801, 0x6B43, 0x6B43, 0x19B4, 0x6B44, 0x6B45, 0x3805,\n    0x6B46, 0x6B46, 0x19B5, 0x6B47, 0x6B47, 0x0F75, 0x6B48, 0x6B48, 0x3807,\n    0x6B49, 0x6B49, 0x0C35, 0x6B4A, 0x6B4B, 0x3808, 0x6B4C, 0x6B4C, 0x06E3,\n    0x6B4D, 0x6B4F, 0x380A, 0x6B50, 0x6B50, 0x20AD, 0x6B51, 0x6B58, 0x380D,\n    0x6B59, 0x6B59, 0x19B6, 0x6B5A, 0x6B5E, 0x3815, 0x6B5F, 0x6B5F, 0x24CB,\n    0x6B60, 0x6B60, 0x381A, 0x6B61, 0x6B61, 0x1F53, 0x6B62, 0x6B62, 0x11B8,\n    0x6B63, 0x6B63, 0x119E, 0x6B64, 0x6B64, 0x054E, 0x6B65, 0x6B65, 0x0484,\n    0x6B66, 0x6B66, 0x0EF3, 0x6B67, 0x6B67, 0x0C06, 0x6B68, 0x6B69, 0x381B,\n    0x6B6A, 0x6B6A, 0x0E92, 0x6B6B, 0x6B71, 0x381D, 0x6B72, 0x6B72, 0x2159,\n    0x6B73, 0x6B76, 0x3824, 0x6B77, 0x6B77, 0x2013, 0x6B78, 0x6B78, 0x1F33,\n    0x6B79, 0x6B79, 0x0578, 0x6B7A, 0x6B7A, 0x3828, 0x6B7B, 0x6B7B, 0x0DB5,\n    0x6B7C, 0x6B7C, 0x0852, 0x6B7D, 0x6B80, 0x3829, 0x6B81, 0x6B82, 0x18D6,\n    0x6B83, 0x6B83, 0x1013, 0x6B84, 0x6B84, 0x18D9, 0x6B85, 0x6B85, 0x382D,\n    0x6B86, 0x6B86, 0x057C, 0x6B87, 0x6B87, 0x18D8, 0x6B88, 0x6B88, 0x382E,\n    0x6B89, 0x6B89, 0x0FDC, 0x6B8A, 0x6B8A, 0x0D79, 0x6B8B, 0x6B8B, 0x0497,\n    0x6B8C, 0x6B8C, 0x382F, 0x6B8D, 0x6B8D, 0x18DC, 0x6B8E, 0x6B91, 0x3830,\n    0x6B92, 0x6B93, 0x18DA, 0x6B94, 0x6B95, 0x3834, 0x6B96, 0x6B96, 0x11B2,\n    0x6B97, 0x6B97, 0x3836, 0x6B98, 0x6B98, 0x1E5C, 0x6B99, 0x6B99, 0x3837,\n    0x6B9A, 0x6B9B, 0x18DD, 0x6B9C, 0x6B9D, 0x3838, 0x6B9E, 0x6B9E, 0x2488,\n    0x6B9F, 0x6BA0, 0x383A, 0x6BA1, 0x6BA1, 0x18DF, 0x6BA2, 0x6BA3, 0x383C,\n    0x6BA4, 0x6BA4, 0x2487, 0x6BA5, 0x6BA9, 0x383E, 0x6BAA, 0x6BAA, 0x18E0,\n    0x6BAB, 0x6BAB, 0x248A, 0x6BAC, 0x6BAD, 0x3843, 0x6BAE, 0x6BAE, 0x2489,\n    0x6BAF, 0x6BAF, 0x248B, 0x6BB0, 0x6BB1, 0x3845, 0x6BB2, 0x6BB2, 0x1F83,\n    0x6BB3, 0x6BB3, 0x19BD, 0x6BB4, 0x6BB4, 0x0B7A, 0x6BB5, 0x6BB5, 0x060D,\n    0x6BB6, 0x6BB6, 0x3847, 0x6BB7, 0x6BB7, 0x107A, 0x6BB8, 0x6BB9, 0x3848,\n    0x6BBA, 0x6BBA, 0x210F, 0x6BBB, 0x6BBB, 0x1FDB, 0x6BBC, 0x6BBE, 0x384A,\n    0x6BBF, 0x6BBF, 0x05CF, 0x6BC0, 0x6BC0, 0x384D, 0x6BC1, 0x6BC1, 0x07EE,\n    0x6BC2, 0x6BC2, 0x19BF, 0x6BC3, 0x6BC4, 0x384E, 0x6BC5, 0x6BC5, 0x106A,\n    0x6BC6, 0x6BC6, 0x20AF, 0x6BC7, 0x6BCA, 0x3850, 0x6BCB, 0x6BCB, 0x0EF2,\n    0x6BCC, 0x6BCC, 0x3854, 0x6BCD, 0x6BCD, 0x0B1B, 0x6BCE, 0x6BCE, 0x3855,\n    0x6BCF, 0x6BCF, 0x0AC4, 0x6BD0, 0x6BD1, 0x3856, 0x6BD2, 0x6BD2, 0x05FD,\n    0x6BD3, 0x6BD3, 0x126F, 0x6BD4, 0x6BD4, 0x0431, 0x6BD5, 0x6BD5, 0x0438,\n    0x6BD6, 0x6BD6, 0x043A, 0x6BD7, 0x6BD7, 0x0BBF, 0x6BD8, 0x6BD8, 0x3858,\n    0x6BD9, 0x6BD9, 0x0439, 0x6BDA, 0x6BDA, 0x3859, 0x6BDB, 0x6BDB, 0x0AB0,\n    0x6BDC, 0x6BE0, 0x385A, 0x6BE1, 0x6BE1, 0x1152, 0x6BE2, 0x6BE9, 0x385F,\n    0x6BEA, 0x6BEA, 0x1954, 0x6BEB, 0x6BEB, 0x0778, 0x6BEC, 0x6BEE, 0x3867,\n    0x6BEF, 0x6BEF, 0x0E0D, 0x6BF0, 0x6BF2, 0x386A, 0x6BF3, 0x6BF3, 0x1955,\n    0x6BF4, 0x6BF4, 0x386D, 0x6BF5, 0x6BF5, 0x1957, 0x6BF6, 0x6BF8, 0x386E,\n    0x6BF9, 0x6BF9, 0x1958, 0x6BFA, 0x6BFC, 0x3871, 0x6BFD, 0x6BFD, 0x1956,\n    0x6BFE, 0x6BFE, 0x3874, 0x6BFF, 0x6BFF, 0x24C0, 0x6C00, 0x6C04, 0x3875,\n    0x6C05, 0x6C05, 0x1959, 0x6C06, 0x6C06, 0x195B, 0x6C07, 0x6C07, 0x195A,\n    0x6C08, 0x6C08, 0x226D, 0x6C09, 0x6C0B, 0x387A, 0x6C0C, 0x6C0C, 0x24C1,\n    0x6C0D, 0x6C0D, 0x195C, 0x6C0E, 0x6C0E, 0x387D, 0x6C0F, 0x6C0F, 0x0D66,\n    0x6C10, 0x6C10, 0x126B, 0x6C11, 0x6C11, 0x0AF6, 0x6C12, 0x6C12, 0x387E,\n    0x6C13, 0x6C13, 0x0AAA, 0x6C14, 0x6C14, 0x0C17, 0x6C15, 0x6C15, 0x195D,\n    0x6C16, 0x6C16, 0x0B2D, 0x6C17, 0x6C17, 0x387F, 0x6C18, 0x6C1A, 0x195E,\n    0x6C1B, 0x6C1B, 0x0672, 0x6C1C, 0x6C1E, 0x3880, 0x6C1F, 0x6C1F, 0x0697,\n    0x6C20, 0x6C20, 0x3883, 0x6C21, 0x6C21, 0x1961, 0x6C22, 0x6C22, 0x0C5F,\n    0x6C23, 0x6C23, 0x20CA, 0x6C24, 0x6C24, 0x1963, 0x6C25, 0x6C25, 0x3884,\n    0x6C26, 0x6C26, 0x075B, 0x6C27, 0x6C27, 0x101E, 0x6C28, 0x6C28, 0x03BC,\n    0x6C29, 0x6C29, 0x1962, 0x6C2A, 0x6C2A, 0x1964, 0x6C2B, 0x6C2B, 0x20E7,\n    0x6C2C, 0x6C2C, 0x24C2, 0x6C2D, 0x6C2D, 0x3885, 0x6C2E, 0x6C2E, 0x058B,\n    0x6C2F, 0x6C2F, 0x0A6F, 0x6C30, 0x6C30, 0x0C65, 0x6C31, 0x6C31, 0x3886,\n    0x6C32, 0x6C32, 0x1965, 0x6C33, 0x6C33, 0x3887, 0x6C34, 0x6C34, 0x0DA3,\n    0x6C35, 0x6C35, 0x169F, 0x6C36, 0x6C37, 0x3888, 0x6C38, 0x6C38, 0x10A5,\n    0x6C39, 0x6C3C, 0x388A, 0x6C3D, 0x6C3D, 0x12EF, 0x6C3E, 0x6C3F, 0x388E,\n    0x6C40, 0x6C40, 0x0E52, 0x6C41, 0x6C41, 0x11AC, 0x6C42, 0x6C42, 0x0C70,\n    0x6C43, 0x6C45, 0x3890, 0x6C46, 0x6C46, 0x12F4, 0x6C47, 0x6C47, 0x07F8,\n    0x6C48, 0x6C48, 0x3893, 0x6C49, 0x6C49, 0x0771, 0x6C4A, 0x6C4A, 0x16A2,\n    0x6C4B, 0x6C4F, 0x3894, 0x6C50, 0x6C50, 0x0F18, 0x6C51, 0x6C53, 0x3899,\n    0x6C54, 0x6C54, 0x16A0, 0x6C55, 0x6C55, 0x0D00, 0x6C56, 0x6C56, 0x389C,\n    0x6C57, 0x6C57, 0x0770, 0x6C58, 0x6C5A, 0x389D, 0x6C5B, 0x6C5B, 0x0FDD,\n    0x6C5C, 0x6C5C, 0x16A1, 0x6C5D, 0x6C5D, 0x0CC5, 0x6C5E, 0x6C5E, 0x0708,\n    0x6C5F, 0x6C5F, 0x087E, 0x6C60, 0x6C60, 0x04FD, 0x6C61, 0x6C61, 0x0EEA,\n    0x6C62, 0x6C63, 0x38A0, 0x6C64, 0x6C64, 0x0E13, 0x6C65, 0x6C67, 0x38A2,\n    0x6C68, 0x6C69, 0x16A8, 0x6C6A, 0x6C6A, 0x0EA5, 0x6C6B, 0x6C6F, 0x38A5,\n    0x6C70, 0x6C70, 0x0E00, 0x6C71, 0x6C71, 0x38AA, 0x6C72, 0x6C72, 0x0826,\n    0x6C73, 0x6C73, 0x38AB, 0x6C74, 0x6C74, 0x16AA, 0x6C75, 0x6C75, 0x38AC,\n    0x6C76, 0x6C76, 0x16AB, 0x6C77, 0x6C78, 0x38AD, 0x6C79, 0x6C79, 0x0FA5,\n    0x6C7A, 0x6C7C, 0x38AF, 0x6C7D, 0x6C7D, 0x0C1A, 0x6C7E, 0x6C7E, 0x0677,\n    0x6C7F, 0x6C80, 0x38B2, 0x6C81, 0x6C81, 0x0C5C, 0x6C82, 0x6C82, 0x1051,\n    0x6C83, 0x6C83, 0x0EE5, 0x6C84, 0x6C84, 0x38B4, 0x6C85, 0x6C85, 0x16A4,\n    0x6C86, 0x6C86, 0x16AC, 0x6C87, 0x6C87, 0x38B5, 0x6C88, 0x6C88, 0x0D2B,\n    0x6C89, 0x6C89, 0x04E6, 0x6C8A, 0x6C8B, 0x38B6, 0x6C8C, 0x6C8C, 0x16A7,\n    0x6C8D, 0x6C8E, 0x38B8, 0x6C8F, 0x6C8F, 0x0C02, 0x6C90, 0x6C90, 0x16A5,\n    0x6C91, 0x6C92, 0x38BA, 0x6C93, 0x6C93, 0x1A1F, 0x6C94, 0x6C94, 0x16A6,\n    0x6C95, 0x6C98, 0x38BC, 0x6C99, 0x6C99, 0x0CEC, 0x6C9A, 0x6C9A, 0x38C0,\n    0x6C9B, 0x6C9B, 0x0BA7, 0x6C9C, 0x6C9E, 0x38C1, 0x6C9F, 0x6C9F, 0x070E,\n    0x6CA0, 0x6CA0, 0x38C4, 0x6CA1, 0x6CA1, 0x0AC0, 0x6CA2, 0x6CA2, 0x38C5,\n    0x6CA3, 0x6CA3, 0x16A3, 0x6CA4, 0x6CA4, 0x0B7E, 0x6CA5, 0x6CA5, 0x09ED,\n    0x6CA6, 0x6CA6, 0x0A80, 0x6CA7, 0x6CA7, 0x049E, 0x6CA8, 0x6CA8, 0x38C6,\n    0x6CA9, 0x6CA9, 0x16AD, 0x6CAA, 0x6CAA, 0x07BB, 0x6CAB, 0x6CAB, 0x0B10,\n    0x6CAC, 0x6CAC, 0x38C7, 0x6CAD, 0x6CAD, 0x16B0, 0x6CAE, 0x6CAE, 0x0909,\n    0x6CAF, 0x6CB0, 0x38C8, 0x6CB1, 0x6CB1, 0x16BB, 0x6CB2, 0x6CB2, 0x16B5,\n    0x6CB3, 0x6CB3, 0x078A, 0x6CB4, 0x6CB7, 0x38CA, 0x6CB8, 0x6CB8, 0x066D,\n    0x6CB9, 0x6CB9, 0x10B2, 0x6CBA, 0x6CBA, 0x38CE, 0x6CBB, 0x6CBB, 0x11CD,\n    0x6CBC, 0x6CBC, 0x1174, 0x6CBD, 0x6CBD, 0x071A, 0x6CBE, 0x6CBE, 0x1155,\n    0x6CBF, 0x6CBF, 0x1001, 0x6CC0, 0x6CC3, 0x38CF, 0x6CC4, 0x6CC4, 0x0F84,\n    0x6CC5, 0x6CC5, 0x0C73, 0x6CC6, 0x6CC8, 0x38D3, 0x6CC9, 0x6CC9, 0x0C85,\n    0x6CCA, 0x6CCA, 0x047B, 0x6CCB, 0x6CCB, 0x38D6, 0x6CCC, 0x6CCC, 0x0ADF,\n    0x6CCD, 0x6CCF, 0x38D7, 0x6CD0, 0x6CD0, 0x16AE, 0x6CD1, 0x6CD2, 0x38DA,\n    0x6CD3, 0x6CD3, 0x16BC, 0x6CD4, 0x6CD4, 0x16AF, 0x6CD5, 0x6CD5, 0x0645,\n    0x6CD6, 0x6CD6, 0x16B7, 0x6CD7, 0x6CD7, 0x16B4, 0x6CD8, 0x6CDA, 0x38DC,\n    0x6CDB, 0x6CDB, 0x0657, 0x6CDC, 0x6CDD, 0x38DF, 0x6CDE, 0x6CDE, 0x0B63,\n    0x6CDF, 0x6CDF, 0x38E1, 0x6CE0, 0x6CE0, 0x16B6, 0x6CE1, 0x6CE1, 0x0B9E,\n    0x6CE2, 0x6CE2, 0x046F, 0x6CE3, 0x6CE3, 0x0C1B, 0x6CE4, 0x6CE4, 0x38E2,\n    0x6CE5, 0x6CE5, 0x0B43, 0x6CE6, 0x6CE7, 0x38E3, 0x6CE8, 0x6CE8, 0x11FF,\n    0x6CE9, 0x6CE9, 0x38E5, 0x6CEA, 0x6CEA, 0x09CC, 0x6CEB, 0x6CEB, 0x16B9,\n    0x6CEC, 0x6CED, 0x38E6, 0x6CEE, 0x6CEE, 0x16BA, 0x6CEF, 0x6CEF, 0x16BD,\n    0x6CF0, 0x6CF0, 0x0DFC, 0x6CF1, 0x6CF1, 0x16B3, 0x6CF2, 0x6CF2, 0x38E8,\n    0x6CF3, 0x6CF3, 0x10A3, 0x6CF4, 0x6CF4, 0x38E9, 0x6CF5, 0x6CF5, 0x042C,\n    0x6CF6, 0x6CF6, 0x1A20, 0x6CF7, 0x6CF8, 0x16B1, 0x6CF9, 0x6CF9, 0x38EA,\n    0x6CFA, 0x6CFA, 0x16B8, 0x6CFB, 0x6CFB, 0x0F85, 0x6CFC, 0x6CFC, 0x0BE2,\n    0x6CFD, 0x6CFD, 0x1136, 0x6CFE, 0x6CFE, 0x16BE, 0x6CFF, 0x6CFF, 0x38EB,\n    0x6D00, 0x6D00, 0x38EC, 0x6D01, 0x6D01, 0x08B1, 0x6D02, 0x6D03, 0x38ED,\n    0x6D04, 0x6D04, 0x16C5, 0x6D05, 0x6D06, 0x38EF, 0x6D07, 0x6D07, 0x16C4,\n    0x6D08, 0x6D0A, 0x38F1, 0x6D0B, 0x6D0B, 0x101C, 0x6D0C, 0x6D0C, 0x16C1,\n    0x6D0D, 0x6D0D, 0x38F4, 0x6D0E, 0x6D0E, 0x16C7, 0x6D0F, 0x6D11, 0x38F5,\n    0x6D12, 0x6D12, 0x0CD2, 0x6D13, 0x6D16, 0x38F8, 0x6D17, 0x6D17, 0x0F21,\n    0x6D18, 0x6D18, 0x38FC, 0x6D19, 0x6D19, 0x16C6, 0x6D1A, 0x6D1A, 0x16CC,\n    0x6D1B, 0x6D1B, 0x0A8C, 0x6D1C, 0x6D1D, 0x38FD, 0x6D1E, 0x6D1E, 0x05F3,\n    0x6D1F, 0x6D24, 0x38FF, 0x6D25, 0x6D25, 0x08C3, 0x6D26, 0x6D26, 0x3905,\n    0x6D27, 0x6D27, 0x16C0, 0x6D28, 0x6D29, 0x3906, 0x6D2A, 0x6D2A, 0x07A0,\n    0x6D2B, 0x6D2B, 0x16C8, 0x6D2C, 0x6D2D, 0x3908, 0x6D2E, 0x6D2E, 0x16CA,\n    0x6D2F, 0x6D30, 0x390A, 0x6D31, 0x6D31, 0x063C, 0x6D32, 0x6D32, 0x11DD,\n    0x6D33, 0x6D33, 0x16D0, 0x6D34, 0x6D34, 0x390C, 0x6D35, 0x6D35, 0x16CB,\n    0x6D36, 0x6D38, 0x390D, 0x6D39, 0x6D39, 0x16BF, 0x6D3A, 0x6D3A, 0x3910,\n    0x6D3B, 0x6D3B, 0x0803, 0x6D3C, 0x6D3C, 0x0E8E, 0x6D3D, 0x6D3D, 0x0C1F,\n    0x6D3E, 0x6D3E, 0x0B8A, 0x6D3F, 0x6D40, 0x3911, 0x6D41, 0x6D41, 0x0A40,\n    0x6D42, 0x6D42, 0x3913, 0x6D43, 0x6D43, 0x16C2, 0x6D44, 0x6D44, 0x3914,\n    0x6D45, 0x6D45, 0x0C30, 0x6D46, 0x6D46, 0x087D, 0x6D47, 0x6D47, 0x088E,\n    0x6D48, 0x6D48, 0x16C3, 0x6D49, 0x6D49, 0x3915, 0x6D4A, 0x6D4A, 0x1224,\n    0x6D4B, 0x6D4B, 0x04A9, 0x6D4C, 0x6D4C, 0x3916, 0x6D4D, 0x6D4D, 0x16C9,\n    0x6D4E, 0x6D4E, 0x0836, 0x6D4F, 0x6D4F, 0x16CD, 0x6D50, 0x6D50, 0x3917,\n    0x6D51, 0x6D51, 0x0800, 0x6D52, 0x6D52, 0x16CE, 0x6D53, 0x6D53, 0x0B69,\n    0x6D54, 0x6D54, 0x16CF, 0x6D55, 0x6D58, 0x3918, 0x6D59, 0x6D59, 0x1184,\n    0x6D5A, 0x6D5A, 0x0930, 0x6D5B, 0x6D5B, 0x391C, 0x6D5C, 0x6D5C, 0x16D8,\n    0x6D5D, 0x6D5D, 0x391D, 0x6D5E, 0x6D5E, 0x16D5, 0x6D5F, 0x6D5F, 0x391E,\n    0x6D60, 0x6D60, 0x16D9, 0x6D61, 0x6D62, 0x391F, 0x6D63, 0x6D63, 0x16DB,\n    0x6D64, 0x6D65, 0x3921, 0x6D66, 0x6D66, 0x0BF5, 0x6D67, 0x6D68, 0x3923,\n    0x6D69, 0x6D69, 0x077D, 0x6D6A, 0x6D6A, 0x09B6, 0x6D6B, 0x6D6D, 0x3925,\n    0x6D6E, 0x6D6E, 0x069C, 0x6D6F, 0x6D6F, 0x16D2, 0x6D70, 0x6D73, 0x3928,\n    0x6D74, 0x6D74, 0x10E4, 0x6D75, 0x6D76, 0x392C, 0x6D77, 0x6D77, 0x075A,\n    0x6D78, 0x6D78, 0x08CF, 0x6D79, 0x6D79, 0x23DC, 0x6D7A, 0x6D7B, 0x392E,\n    0x6D7C, 0x6D7C, 0x16DA, 0x6D7D, 0x6D81, 0x3930, 0x6D82, 0x6D82, 0x0E70,\n    0x6D83, 0x6D84, 0x3935, 0x6D85, 0x6D85, 0x0B5C, 0x6D86, 0x6D86, 0x3937,\n    0x6D87, 0x6D87, 0x23DB, 0x6D88, 0x6D88, 0x0F68, 0x6D89, 0x6D89, 0x0D1F,\n    0x6D8A, 0x6D8B, 0x3938, 0x6D8C, 0x6D8C, 0x10A4, 0x6D8D, 0x6D8D, 0x393A,\n    0x6D8E, 0x6D8E, 0x0F3E, 0x6D8F, 0x6D90, 0x393B, 0x6D91, 0x6D91, 0x16D1,\n    0x6D92, 0x6D92, 0x393D, 0x6D93, 0x6D94, 0x16D6, 0x6D95, 0x6D95, 0x0E3C,\n    0x6D96, 0x6D9A, 0x393E, 0x6D9B, 0x6D9B, 0x0E21, 0x6D9C, 0x6D9C, 0x3943,\n    0x6D9D, 0x6D9D, 0x09BF, 0x6D9E, 0x6D9E, 0x16D3, 0x6D9F, 0x6D9F, 0x09F9,\n    0x6DA0, 0x6DA0, 0x16D4, 0x6DA1, 0x6DA1, 0x0EDF, 0x6DA2, 0x6DA2, 0x3944,\n    0x6DA3, 0x6DA3, 0x07D6, 0x6DA4, 0x6DA4, 0x05B4, 0x6DA5, 0x6DA5, 0x3945,\n    0x6DA6, 0x6DA6, 0x0CCE, 0x6DA7, 0x6DA7, 0x0878, 0x6DA8, 0x6DA8, 0x1168,\n    0x6DA9, 0x6DA9, 0x0CE5, 0x6DAA, 0x6DAA, 0x069D, 0x6DAB, 0x6DAB, 0x16E8,\n    0x6DAC, 0x6DAD, 0x3946, 0x6DAE, 0x6DAE, 0x16EA, 0x6DAF, 0x6DAF, 0x0FED,\n    0x6DB0, 0x6DB1, 0x3948, 0x6DB2, 0x6DB2, 0x1041, 0x6DB3, 0x6DB4, 0x394A,\n    0x6DB5, 0x6DB5, 0x0764, 0x6DB6, 0x6DB7, 0x394C, 0x6DB8, 0x6DB8, 0x078B,\n    0x6DB9, 0x6DBE, 0x394E, 0x6DBF, 0x6DBF, 0x16E1, 0x6DC0, 0x6DC0, 0x05CE,\n    0x6DC1, 0x6DC3, 0x3954, 0x6DC4, 0x6DC4, 0x122A, 0x6DC5, 0x6DC5, 0x16DE,\n    0x6DC6, 0x6DC6, 0x0F6A, 0x6DC7, 0x6DC7, 0x16DD, 0x6DC8, 0x6DCA, 0x3957,\n    0x6DCB, 0x6DCB, 0x0A25, 0x6DCC, 0x6DCC, 0x0E1D, 0x6DCD, 0x6DD0, 0x395A,\n    0x6DD1, 0x6DD1, 0x0D7E, 0x6DD2, 0x6DD5, 0x395E, 0x6DD6, 0x6DD6, 0x0B3A,\n    0x6DD7, 0x6DD7, 0x3962, 0x6DD8, 0x6DD8, 0x0E27, 0x6DD9, 0x6DD9, 0x16E6,\n    0x6DDA, 0x6DDC, 0x3963, 0x6DDD, 0x6DDD, 0x16E5, 0x6DDE, 0x6DDE, 0x16DF,\n    0x6DDF, 0x6DDF, 0x3966, 0x6DE0, 0x6DE0, 0x16E2, 0x6DE1, 0x6DE1, 0x058E,\n    0x6DE2, 0x6DE3, 0x3967, 0x6DE4, 0x6DE4, 0x10BE, 0x6DE5, 0x6DE5, 0x3969,\n    0x6DE6, 0x6DE6, 0x16E4, 0x6DE7, 0x6DE9, 0x396A, 0x6DEA, 0x6DEA, 0x205E,\n    0x6DEB, 0x6DEB, 0x1080, 0x6DEC, 0x6DEC, 0x0566, 0x6DED, 0x6DED, 0x396D,\n    0x6DEE, 0x6DEE, 0x07C9, 0x6DEF, 0x6DF0, 0x396E, 0x6DF1, 0x6DF1, 0x0D27,\n    0x6DF2, 0x6DF2, 0x3970, 0x6DF3, 0x6DF3, 0x0541, 0x6DF4, 0x6DF4, 0x3971,\n    0x6DF5, 0x6DF5, 0x2244, 0x6DF6, 0x6DF6, 0x23E2, 0x6DF7, 0x6DF7, 0x0801,\n    0x6DF8, 0x6DF8, 0x3972, 0x6DF9, 0x6DF9, 0x0FF6, 0x6DFA, 0x6DFA, 0x20D4,\n    0x6DFB, 0x6DFB, 0x0E40, 0x6DFC, 0x6DFC, 0x1A21, 0x6DFD, 0x6DFF, 0x3973,\n    0x6E00, 0x6E04, 0x3976, 0x6E05, 0x6E05, 0x0C62, 0x6E06, 0x6E09, 0x397B,\n    0x6E0A, 0x6E0A, 0x10EB, 0x6E0B, 0x6E0B, 0x397F, 0x6E0C, 0x6E0C, 0x16E9,\n    0x6E0D, 0x6E0D, 0x1232, 0x6E0E, 0x6E0E, 0x16E0, 0x6E0F, 0x6E0F, 0x3980,\n    0x6E10, 0x6E10, 0x0876, 0x6E11, 0x6E11, 0x16E3, 0x6E12, 0x6E13, 0x3981,\n    0x6E14, 0x6E14, 0x10CB, 0x6E15, 0x6E15, 0x3983, 0x6E16, 0x6E16, 0x16E7,\n    0x6E17, 0x6E17, 0x0D31, 0x6E18, 0x6E19, 0x3984, 0x6E1A, 0x6E1A, 0x16DC,\n    0x6E1B, 0x6E1C, 0x3986, 0x6E1D, 0x6E1D, 0x10CA, 0x6E1E, 0x6E1F, 0x3988,\n    0x6E20, 0x6E20, 0x0C7B, 0x6E21, 0x6E21, 0x0608, 0x6E22, 0x6E22, 0x398A,\n    0x6E23, 0x6E23, 0x113F, 0x6E24, 0x6E24, 0x047A, 0x6E25, 0x6E25, 0x16F5,\n    0x6E26, 0x6E26, 0x219F, 0x6E27, 0x6E28, 0x398B, 0x6E29, 0x6E29, 0x0ED1,\n    0x6E2A, 0x6E2A, 0x398D, 0x6E2B, 0x6E2B, 0x16EB, 0x6E2C, 0x6E2C, 0x1E66,\n    0x6E2D, 0x6E2D, 0x0ECB, 0x6E2E, 0x6E2E, 0x398E, 0x6E2F, 0x6E2F, 0x06D6,\n    0x6E30, 0x6E31, 0x398F, 0x6E32, 0x6E32, 0x16F4, 0x6E33, 0x6E33, 0x3991,\n    0x6E34, 0x6E34, 0x0957, 0x6E35, 0x6E37, 0x3992, 0x6E38, 0x6E38, 0x10B3,\n    0x6E39, 0x6E39, 0x3995, 0x6E3A, 0x6E3A, 0x0AF1, 0x6E3B, 0x6E3D, 0x3996,\n    0x6E3E, 0x6E3E, 0x1F63, 0x6E3F, 0x6E42, 0x3999, 0x6E43, 0x6E43, 0x0B89,\n    0x6E44, 0x6E44, 0x16F6, 0x6E45, 0x6E4C, 0x399D, 0x6E4D, 0x6E4D, 0x0E75,\n    0x6E4E, 0x6E4E, 0x16ED, 0x6E4F, 0x6E52, 0x39A5, 0x6E53, 0x6E54, 0x16F2,\n    0x6E55, 0x6E55, 0x39A9, 0x6E56, 0x6E56, 0x07B5, 0x6E57, 0x6E57, 0x39AA,\n    0x6E58, 0x6E58, 0x0F53, 0x6E59, 0x6E5A, 0x39AB, 0x6E5B, 0x6E5B, 0x1160,\n    0x6E5C, 0x6E5D, 0x39AD, 0x6E5E, 0x6E5E, 0x23DD, 0x6E5F, 0x6E5F, 0x16F0,\n    0x6E60, 0x6E6A, 0x39AF, 0x6E6B, 0x6E6B, 0x16EE, 0x6E6C, 0x6E6D, 0x39BA,\n    0x6E6E, 0x6E6E, 0x16EC, 0x6E6F, 0x6E6F, 0x216B, 0x6E70, 0x6E7D, 0x39BC,\n    0x6E7E, 0x6E7E, 0x0E96, 0x6E7F, 0x6E7F, 0x0D41, 0x6E80, 0x6E82, 0x39CA,\n    0x6E83, 0x6E83, 0x098E, 0x6E84, 0x6E84, 0x39CD, 0x6E85, 0x6E85, 0x0877,\n    0x6E86, 0x6E86, 0x16F1, 0x6E87, 0x6E88, 0x39CE, 0x6E89, 0x6E89, 0x06C3,\n    0x6E8A, 0x6E8E, 0x39D0, 0x6E8F, 0x6E8F, 0x1705, 0x6E90, 0x6E90, 0x10F7,\n    0x6E91, 0x6E95, 0x39D5, 0x6E96, 0x6E96, 0x22B5, 0x6E97, 0x6E97, 0x39DA,\n    0x6E98, 0x6E98, 0x16F9, 0x6E99, 0x6E9B, 0x39DB, 0x6E9C, 0x6E9C, 0x0A38,\n    0x6E9D, 0x6E9D, 0x1F26, 0x6E9E, 0x6E9E, 0x39DE, 0x6E9F, 0x6E9F, 0x1707,\n    0x6EA0, 0x6EA1, 0x39DF, 0x6EA2, 0x6EA2, 0x106E, 0x6EA3, 0x6EA4, 0x39E1,\n    0x6EA5, 0x6EA5, 0x16FD, 0x6EA6, 0x6EA6, 0x39E3, 0x6EA7, 0x6EA7, 0x16FE,\n    0x6EA8, 0x6EA9, 0x39E4, 0x6EAA, 0x6EAA, 0x0F17, 0x6EAB, 0x6EAE, 0x39E6,\n    0x6EAF, 0x6EAF, 0x0DD2, 0x6EB0, 0x6EB0, 0x39EA, 0x6EB1, 0x6EB1, 0x16F8,\n    0x6EB2, 0x6EB2, 0x16EF, 0x6EB3, 0x6EB3, 0x39EB, 0x6EB4, 0x6EB4, 0x1703,\n    0x6EB5, 0x6EB5, 0x39EC, 0x6EB6, 0x6EB6, 0x0CB7, 0x6EB7, 0x6EB7, 0x1701,\n    0x6EB8, 0x6EB9, 0x39ED, 0x6EBA, 0x6EBA, 0x0B4A, 0x6EBB, 0x6EBB, 0x1700,\n    0x6EBC, 0x6EBC, 0x39EF, 0x6EBD, 0x6EBD, 0x16FF, 0x6EBE, 0x6EC0, 0x39F0,\n    0x6EC1, 0x6EC1, 0x0521, 0x6EC2, 0x6EC2, 0x1706, 0x6EC3, 0x6EC3, 0x39F3,\n    0x6EC4, 0x6EC4, 0x1E63, 0x6EC5, 0x6EC5, 0x2088, 0x6EC6, 0x6EC6, 0x39F4,\n    0x6EC7, 0x6EC7, 0x05C2, 0x6EC8, 0x6ECA, 0x39F5, 0x6ECB, 0x6ECB, 0x1229,\n    0x6ECC, 0x6ECC, 0x1EBD, 0x6ECD, 0x6ECD, 0x39F8, 0x6ECE, 0x6ECE, 0x2341,\n    0x6ECF, 0x6ECF, 0x1704, 0x6ED0, 0x6ED0, 0x39F9, 0x6ED1, 0x6ED1, 0x07C1,\n    0x6ED2, 0x6ED2, 0x39FA, 0x6ED3, 0x6ED3, 0x122F, 0x6ED4, 0x6ED4, 0x0E22,\n    0x6ED5, 0x6ED5, 0x19A8, 0x6ED6, 0x6ED6, 0x39FB, 0x6ED7, 0x6ED7, 0x1702,\n    0x6ED8, 0x6ED9, 0x39FC, 0x6EDA, 0x6EDA, 0x074F, 0x6EDB, 0x6EDD, 0x39FE,\n    0x6EDE, 0x6EDE, 0x11CC, 0x6EDF, 0x6EDF, 0x16F7, 0x6EE0, 0x6EE0, 0x16FA,\n    0x6EE1, 0x6EE1, 0x0AA1, 0x6EE2, 0x6EE2, 0x16FC, 0x6EE3, 0x6EE3, 0x3A01,\n    0x6EE4, 0x6EE4, 0x0A72, 0x6EE5, 0x6EE5, 0x09AF, 0x6EE6, 0x6EE6, 0x0A77,\n    0x6EE7, 0x6EE7, 0x3A02, 0x6EE8, 0x6EE8, 0x045E, 0x6EE9, 0x6EE9, 0x0E05,\n    0x6EEA, 0x6EEB, 0x3A03, 0x6EEC, 0x6EEC, 0x1F4B, 0x6EED, 0x6EEE, 0x3A05,\n    0x6EEF, 0x6EEF, 0x2292, 0x6EF0, 0x6EF1, 0x3A07, 0x6EF2, 0x6EF2, 0x2124,\n    0x6EF3, 0x6EF3, 0x3A09, 0x6EF4, 0x6EF4, 0x05AF, 0x6EF5, 0x6EF6, 0x3A0A,\n    0x6EF7, 0x6EF7, 0x2048, 0x6EF8, 0x6EF8, 0x23E0, 0x6EF9, 0x6EF9, 0x170D,\n    0x6EFA, 0x6EFE, 0x3A0C, 0x6EFF, 0x6EFF, 0x2077, 0x6F00, 0x6F00, 0x3A11,\n    0x6F01, 0x6F01, 0x223A, 0x6F02, 0x6F02, 0x0BCE, 0x6F03, 0x6F05, 0x3A12,\n    0x6F06, 0x6F06, 0x0C00, 0x6F07, 0x6F08, 0x3A15, 0x6F09, 0x6F09, 0x1713,\n    0x6F0A, 0x6F0E, 0x3A17, 0x6F0F, 0x6F0F, 0x0A50, 0x6F10, 0x6F12, 0x3A1C,\n    0x6F13, 0x6F13, 0x09D7, 0x6F14, 0x6F14, 0x1006, 0x6F15, 0x6F15, 0x170C,\n    0x6F16, 0x6F19, 0x3A1F, 0x6F1A, 0x6F1A, 0x20B1, 0x6F1B, 0x6F1F, 0x3A23,\n    0x6F20, 0x6F20, 0x0B11, 0x6F21, 0x6F21, 0x3A28, 0x6F22, 0x6F22, 0x1F41,\n    0x6F23, 0x6F23, 0x201C, 0x6F24, 0x6F24, 0x170B, 0x6F25, 0x6F28, 0x3A29,\n    0x6F29, 0x6F29, 0x1714, 0x6F2A, 0x6F2A, 0x1712, 0x6F2B, 0x6F2B, 0x0AA5,\n    0x6F2C, 0x6F2C, 0x22B8, 0x6F2D, 0x6F2D, 0x16FB, 0x6F2E, 0x6F2E, 0x3A2D,\n    0x6F2F, 0x6F2F, 0x170E, 0x6F30, 0x6F30, 0x3A2E, 0x6F31, 0x6F31, 0x0D95,\n    0x6F32, 0x6F32, 0x2276, 0x6F33, 0x6F33, 0x1165, 0x6F34, 0x6F35, 0x3A2F,\n    0x6F36, 0x6F36, 0x170F, 0x6F37, 0x6F37, 0x3A31, 0x6F38, 0x6F38, 0x1F9B,\n    0x6F39, 0x6F3D, 0x3A32, 0x6F3E, 0x6F3E, 0x1023, 0x6F3F, 0x6F3F, 0x1F9F,\n    0x6F40, 0x6F40, 0x3A37, 0x6F41, 0x6F41, 0x25CA, 0x6F42, 0x6F45, 0x3A38,\n    0x6F46, 0x6F47, 0x1709, 0x6F48, 0x6F4A, 0x3A3C, 0x6F4B, 0x6F4B, 0x1710,\n    0x6F4C, 0x6F4C, 0x3A3F, 0x6F4D, 0x6F4D, 0x0EBA, 0x6F4E, 0x6F50, 0x3A40,\n    0x6F51, 0x6F51, 0x20BE, 0x6F52, 0x6F53, 0x3A43, 0x6F54, 0x6F54, 0x1FB4,\n    0x6F55, 0x6F57, 0x3A45, 0x6F58, 0x6F58, 0x0B8C, 0x6F59, 0x6F59, 0x23D7,\n    0x6F5A, 0x6F5B, 0x3A48, 0x6F5C, 0x6F5C, 0x0C2E, 0x6F5D, 0x6F5D, 0x3A4A,\n    0x6F5E, 0x6F5E, 0x0A61, 0x6F5F, 0x6F61, 0x3A4B, 0x6F62, 0x6F62, 0x1708,\n    0x6F63, 0x6F63, 0x3A4E, 0x6F64, 0x6F64, 0x2105, 0x6F65, 0x6F65, 0x3A4F,\n    0x6F66, 0x6F66, 0x0A13, 0x6F67, 0x6F6C, 0x3A50, 0x6F6D, 0x6F6D, 0x0E09,\n    0x6F6E, 0x6F6E, 0x04D6, 0x6F6F, 0x6F6F, 0x23E1, 0x6F70, 0x6F70, 0x1FEC,\n    0x6F71, 0x6F71, 0x3A56, 0x6F72, 0x6F72, 0x1719, 0x6F73, 0x6F73, 0x3A57,\n    0x6F74, 0x6F74, 0x1711, 0x6F75, 0x6F76, 0x3A58, 0x6F77, 0x6F77, 0x23EA,\n    0x6F78, 0x6F78, 0x1718, 0x6F79, 0x6F79, 0x3A5A, 0x6F7A, 0x6F7A, 0x171B,\n    0x6F7B, 0x6F7B, 0x3A5B, 0x6F7C, 0x6F7C, 0x171A, 0x6F7D, 0x6F7E, 0x3A5C,\n    0x6F7F, 0x6F7F, 0x23E3, 0x6F80, 0x6F80, 0x210E, 0x6F81, 0x6F83, 0x3A5E,\n    0x6F84, 0x6F84, 0x04F3, 0x6F85, 0x6F85, 0x3A61, 0x6F86, 0x6F86, 0x1FA6,\n    0x6F87, 0x6F87, 0x2004, 0x6F88, 0x6F88, 0x04DF, 0x6F89, 0x6F89, 0x1715,\n    0x6F8A, 0x6F8B, 0x3A62, 0x6F8C, 0x6F8C, 0x1717, 0x6F8D, 0x6F8D, 0x1716,\n    0x6F8E, 0x6F8E, 0x0BAD, 0x6F8F, 0x6F96, 0x3A64, 0x6F97, 0x6F97, 0x1F9D,\n    0x6F98, 0x6F9B, 0x3A6C, 0x6F9C, 0x6F9C, 0x09A8, 0x6F9D, 0x6F9F, 0x3A70,\n    0x6FA0, 0x6FA0, 0x23E5, 0x6FA1, 0x6FA1, 0x112B, 0x6FA2, 0x6FA3, 0x3A73,\n    0x6FA4, 0x6FA4, 0x2264, 0x6FA5, 0x6FA6, 0x3A75, 0x6FA7, 0x6FA7, 0x171E,\n    0x6FA8, 0x6FA8, 0x3A77, 0x6FA9, 0x6FA9, 0x24E2, 0x6FAA, 0x6FAD, 0x3A78,\n    0x6FAE, 0x6FAE, 0x23DE, 0x6FAF, 0x6FB0, 0x3A7C, 0x6FB1, 0x6FB1, 0x1EC4,\n    0x6FB2, 0x6FB2, 0x3A7E, 0x6FB3, 0x6FB3, 0x03CF, 0x6FB4, 0x6FB5, 0x3A7F,\n    0x6FB6, 0x6FB6, 0x1720, 0x6FB7, 0x6FB8, 0x3A81, 0x6FB9, 0x6FB9, 0x171F,\n    0x6FBA, 0x6FBF, 0x3A83, 0x6FC0, 0x6FC0, 0x0817, 0x6FC1, 0x6FC1, 0x22B6,\n    0x6FC2, 0x6FC2, 0x1721, 0x6FC3, 0x6FC3, 0x20A9, 0x6FC4, 0x6FC8, 0x3A89,\n    0x6FC9, 0x6FC9, 0x171D, 0x6FCA, 0x6FD0, 0x3A8E, 0x6FD1, 0x6FD1, 0x171C,\n    0x6FD2, 0x6FD2, 0x045D, 0x6FD3, 0x6FD4, 0x3A95, 0x6FD5, 0x6FD5, 0x212B,\n    0x6FD6, 0x6FD7, 0x3A97, 0x6FD8, 0x6FD8, 0x20A5, 0x6FD9, 0x6FDA, 0x3A99,\n    0x6FDB, 0x6FDB, 0x268B, 0x6FDC, 0x6FDD, 0x3A9B, 0x6FDE, 0x6FDE, 0x1724,\n    0x6FDF, 0x6FDF, 0x1F76, 0x6FE0, 0x6FE0, 0x1725, 0x6FE1, 0x6FE1, 0x1722,\n    0x6FE2, 0x6FE3, 0x3A9D, 0x6FE4, 0x6FE4, 0x216D, 0x6FE5, 0x6FEA, 0x3A9F,\n    0x6FEB, 0x6FEB, 0x2001, 0x6FEC, 0x6FED, 0x3AA5, 0x6FEE, 0x6FEE, 0x1723,\n    0x6FEF, 0x6FEF, 0x1726, 0x6FF0, 0x6FF0, 0x2191, 0x6FF1, 0x6FF1, 0x1E50,\n    0x6FF2, 0x6FF9, 0x3AA7, 0x6FFA, 0x6FFA, 0x1F9C, 0x6FFB, 0x6FFB, 0x3AAF,\n    0x6FFC, 0x6FFC, 0x23DA, 0x6FFD, 0x6FFD, 0x3AB0, 0x6FFE, 0x6FFE, 0x2053,\n    0x6FFF, 0x6FFF, 0x3AB1, 0x7000, 0x7004, 0x3AB2, 0x7005, 0x7005, 0x23E9,\n    0x7006, 0x7006, 0x23E4, 0x7007, 0x7008, 0x3AB7, 0x7009, 0x7009, 0x21D5,\n    0x700A, 0x700A, 0x3AB9, 0x700B, 0x700B, 0x23E6, 0x700C, 0x700E, 0x3ABA,\n    0x700F, 0x700F, 0x23DF, 0x7010, 0x7010, 0x3ABD, 0x7011, 0x7011, 0x0BF8,\n    0x7012, 0x7014, 0x3ABE, 0x7015, 0x7015, 0x1E4F, 0x7016, 0x7017, 0x3AC1,\n    0x7018, 0x7018, 0x23D9, 0x7019, 0x7019, 0x3AC3, 0x701A, 0x701A, 0x1727,\n    0x701B, 0x701B, 0x1729, 0x701C, 0x701C, 0x3AC4, 0x701D, 0x701D, 0x2014,\n    0x701E, 0x701E, 0x3AC5, 0x701F, 0x701F, 0x23EC, 0x7020, 0x7020, 0x23EB,\n    0x7021, 0x7022, 0x3AC6, 0x7023, 0x7023, 0x1728, 0x7024, 0x7026, 0x3AC8,\n    0x7027, 0x7027, 0x23D8, 0x7028, 0x7028, 0x23EE, 0x7029, 0x702F, 0x3ACB,\n    0x7030, 0x7030, 0x268E, 0x7031, 0x7031, 0x3AD2, 0x7032, 0x7032, 0x23ED,\n    0x7033, 0x7034, 0x3AD3, 0x7035, 0x7035, 0x172B, 0x7036, 0x7038, 0x3AD5,\n    0x7039, 0x7039, 0x172A, 0x703A, 0x703D, 0x3AD8, 0x703E, 0x703E, 0x1FFA,\n    0x703F, 0x7042, 0x3ADC, 0x7043, 0x7043, 0x23D6, 0x7044, 0x7044, 0x23E8,\n    0x7045, 0x704B, 0x3AE0, 0x704C, 0x704C, 0x0739, 0x704D, 0x704E, 0x3AE7,\n    0x704F, 0x704F, 0x172C, 0x7050, 0x7050, 0x3AE9, 0x7051, 0x7051, 0x2106,\n    0x7052, 0x7054, 0x3AEA, 0x7055, 0x7055, 0x200B, 0x7056, 0x7057, 0x3AED,\n    0x7058, 0x7058, 0x2166, 0x7059, 0x705C, 0x3AEF, 0x705D, 0x705D, 0x23EF,\n    0x705E, 0x705E, 0x172D, 0x705F, 0x7062, 0x3AF3, 0x7063, 0x7063, 0x2189,\n    0x7064, 0x7064, 0x2058, 0x7065, 0x7066, 0x3AF7, 0x7067, 0x7067, 0x23E7,\n    0x7068, 0x706A, 0x3AF9, 0x706B, 0x706B, 0x0805, 0x706C, 0x706C, 0x19EF,\n    0x706D, 0x706D, 0x0AF5, 0x706E, 0x706E, 0x3AFC, 0x706F, 0x706F, 0x05A7,\n    0x7070, 0x7070, 0x07E7, 0x7071, 0x7074, 0x3AFD, 0x7075, 0x7075, 0x0A32,\n    0x7076, 0x7076, 0x1131, 0x7077, 0x7077, 0x3B01, 0x7078, 0x7078, 0x08F3,\n    0x7079, 0x707B, 0x3B02, 0x707C, 0x707C, 0x1223, 0x707D, 0x707D, 0x3B05,\n    0x707E, 0x707E, 0x1119, 0x707F, 0x707F, 0x049A, 0x7080, 0x7080, 0x19CC,\n    0x7081, 0x7084, 0x3B06, 0x7085, 0x7085, 0x1913, 0x7086, 0x7088, 0x3B0A,\n    0x7089, 0x7089, 0x0A56, 0x708A, 0x708A, 0x0539, 0x708B, 0x708D, 0x3B0D,\n    0x708E, 0x708E, 0x1000, 0x708F, 0x7091, 0x3B10, 0x7092, 0x7092, 0x04D9,\n    0x7093, 0x7093, 0x3B13, 0x7094, 0x7094, 0x0C8D, 0x7095, 0x7095, 0x0948,\n    0x7096, 0x7096, 0x19CE, 0x7097, 0x7098, 0x3B14, 0x7099, 0x7099, 0x11CA,\n    0x709A, 0x709B, 0x3B16, 0x709C, 0x709C, 0x19CD, 0x709D, 0x709D, 0x19CF,\n    0x709E, 0x70AA, 0x3B18, 0x70AB, 0x70AB, 0x19D3, 0x70AC, 0x70AC, 0x0915,\n    0x70AD, 0x70AD, 0x0E12, 0x70AE, 0x70AE, 0x0B9B, 0x70AF, 0x70AF, 0x08EB,\n    0x70B0, 0x70B0, 0x3B25, 0x70B1, 0x70B1, 0x19D4, 0x70B2, 0x70B2, 0x3B26,\n    0x70B3, 0x70B3, 0x0467, 0x70B4, 0x70B6, 0x3B27, 0x70B7, 0x70B7, 0x19D2,\n    0x70B8, 0x70B8, 0x1149, 0x70B9, 0x70B9, 0x05C4, 0x70BA, 0x70BA, 0x3B2A,\n    0x70BB, 0x70BB, 0x19D0, 0x70BC, 0x70BC, 0x09FF, 0x70BD, 0x70BD, 0x0508,\n    0x70BE, 0x70BF, 0x3B2B, 0x70C0, 0x70C0, 0x19D1, 0x70C1, 0x70C1, 0x0DAD,\n    0x70C2, 0x70C2, 0x09AE, 0x70C3, 0x70C3, 0x0E51, 0x70C4, 0x70C7, 0x3B2D,\n    0x70C8, 0x70C8, 0x0A1B, 0x70C9, 0x70C9, 0x3B31, 0x70CA, 0x70CA, 0x19D6,\n    0x70CB, 0x70CE, 0x3B32, 0x70CF, 0x70CF, 0x21A3, 0x70D0, 0x70D7, 0x3B36,\n    0x70D8, 0x70D8, 0x079D, 0x70D9, 0x70D9, 0x09BE, 0x70DA, 0x70DA, 0x3B3E,\n    0x70DB, 0x70DB, 0x11F1, 0x70DC, 0x70DE, 0x3B3F, 0x70DF, 0x70DF, 0x0FF5,\n    0x70E0, 0x70E3, 0x3B42, 0x70E4, 0x70E4, 0x094B, 0x70E5, 0x70E5, 0x3B46,\n    0x70E6, 0x70E6, 0x0650, 0x70E7, 0x70E7, 0x0D0E, 0x70E8, 0x70E8, 0x19D5,\n    0x70E9, 0x70E9, 0x07F7, 0x70EA, 0x70EA, 0x3B47, 0x70EB, 0x70EB, 0x0E1F,\n    0x70EC, 0x70EC, 0x08CE, 0x70ED, 0x70ED, 0x0CA3, 0x70EE, 0x70EE, 0x3B48,\n    0x70EF, 0x70EF, 0x0F16, 0x70F0, 0x70F3, 0x3B49, 0x70F4, 0x70F4, 0x217A,\n    0x70F5, 0x70F6, 0x3B4D, 0x70F7, 0x70F7, 0x0E9A, 0x70F8, 0x70F8, 0x3B4F,\n    0x70F9, 0x70F9, 0x0BAC, 0x70FA, 0x70FC, 0x3B50, 0x70FD, 0x70FD, 0x0686,\n    0x70FE, 0x70FF, 0x3B53, 0x7100, 0x7108, 0x3B55, 0x7109, 0x7109, 0x0FF2,\n    0x710A, 0x710A, 0x076F, 0x710B, 0x710F, 0x3B5E, 0x7110, 0x7110, 0x19D7,\n    0x7111, 0x7112, 0x3B63, 0x7113, 0x7113, 0x19D8, 0x7114, 0x7114, 0x3B65,\n    0x7115, 0x7115, 0x07D5, 0x7116, 0x7116, 0x19D9, 0x7117, 0x7117, 0x3B66,\n    0x7118, 0x7118, 0x19F0, 0x7119, 0x7119, 0x0423, 0x711A, 0x711A, 0x0676,\n    0x711B, 0x7120, 0x3B67, 0x7121, 0x7121, 0x21A5, 0x7122, 0x7125, 0x3B6D,\n    0x7126, 0x7126, 0x088A, 0x7127, 0x712E, 0x3B71, 0x712F, 0x712F, 0x19DA,\n    0x7130, 0x7130, 0x100F, 0x7131, 0x7131, 0x19DB, 0x7132, 0x7135, 0x3B79,\n    0x7136, 0x7136, 0x0C96, 0x7137, 0x7144, 0x3B7D, 0x7145, 0x7145, 0x19DF,\n    0x7146, 0x7148, 0x3B8B, 0x7149, 0x7149, 0x2022, 0x714A, 0x714A, 0x19E1,\n    0x714B, 0x714B, 0x3B8E, 0x714C, 0x714C, 0x07E2, 0x714D, 0x714D, 0x3B8F,\n    0x714E, 0x714E, 0x0858, 0x714F, 0x7151, 0x3B90, 0x7152, 0x7152, 0x24D6,\n    0x7153, 0x715B, 0x3B93, 0x715C, 0x715C, 0x19DD, 0x715D, 0x715D, 0x3B9C,\n    0x715E, 0x715E, 0x0CF0, 0x715F, 0x7161, 0x3B9D, 0x7162, 0x7162, 0x233A,\n    0x7163, 0x7163, 0x3BA0, 0x7164, 0x7164, 0x0ABF, 0x7165, 0x7165, 0x3BA1,\n    0x7166, 0x7166, 0x19F1, 0x7167, 0x7167, 0x1176, 0x7168, 0x7168, 0x19DE,\n    0x7169, 0x7169, 0x1EEE, 0x716A, 0x716B, 0x3BA2, 0x716C, 0x716C, 0x24D5,\n    0x716D, 0x716D, 0x3BA4, 0x716E, 0x716E, 0x11F2, 0x716F, 0x7171, 0x3BA5,\n    0x7172, 0x7172, 0x19E0, 0x7173, 0x7173, 0x19DC, 0x7174, 0x7177, 0x3BA8,\n    0x7178, 0x7178, 0x19E2, 0x7179, 0x7179, 0x3BAC, 0x717A, 0x717A, 0x19E3,\n    0x717B, 0x717C, 0x3BAD, 0x717D, 0x717D, 0x0CF8, 0x717E, 0x7183, 0x3BAF,\n    0x7184, 0x7184, 0x0F15, 0x7185, 0x7189, 0x3BB5, 0x718A, 0x718A, 0x0FA7,\n    0x718B, 0x718E, 0x3BBA, 0x718F, 0x718F, 0x0FD5, 0x7190, 0x7191, 0x3BBE,\n    0x7192, 0x7192, 0x2228, 0x7193, 0x7193, 0x3BC0, 0x7194, 0x7194, 0x0CB6,\n    0x7195, 0x7196, 0x3BC1, 0x7197, 0x7197, 0x24D7, 0x7198, 0x7198, 0x19E4,\n    0x7199, 0x7199, 0x0F04, 0x719A, 0x719E, 0x3BC3, 0x719F, 0x719F, 0x0D83,\n    0x71A0, 0x71A0, 0x19E8, 0x71A1, 0x71A7, 0x3BC8, 0x71A8, 0x71A8, 0x19E7,\n    0x71A9, 0x71AB, 0x3BCF, 0x71AC, 0x71AC, 0x03C9, 0x71AD, 0x71B0, 0x3BD2,\n    0x71B1, 0x71B1, 0x20FC, 0x71B2, 0x71B2, 0x3BD6, 0x71B3, 0x71B3, 0x19E5,\n    0x71B4, 0x71B4, 0x3BD7, 0x71B5, 0x71B5, 0x19E6, 0x71B6, 0x71B8, 0x3BD8,\n    0x71B9, 0x71B9, 0x19F2, 0x71BA, 0x71BD, 0x3BDB, 0x71BE, 0x71BE, 0x1E87,\n    0x71BF, 0x71C0, 0x3BDF, 0x71C1, 0x71C1, 0x24D8, 0x71C2, 0x71C2, 0x3BE1,\n    0x71C3, 0x71C3, 0x0C97, 0x71C4, 0x71C7, 0x3BE2, 0x71C8, 0x71C8, 0x1EBA,\n    0x71C9, 0x71CD, 0x3BE6, 0x71CE, 0x71CE, 0x0A10, 0x71CF, 0x71D1, 0x3BEB,\n    0x71D2, 0x71D2, 0x2119, 0x71D3, 0x71D3, 0x3BEE, 0x71D4, 0x71D4, 0x19EA,\n    0x71D5, 0x71D5, 0x1009, 0x71D6, 0x71D8, 0x3BEF, 0x71D9, 0x71D9, 0x216C,\n    0x71DA, 0x71DB, 0x3BF2, 0x71DC, 0x71DC, 0x24D9, 0x71DD, 0x71DE, 0x3BF4,\n    0x71DF, 0x71DF, 0x2227, 0x71E0, 0x71E0, 0x19E9, 0x71E1, 0x71E4, 0x3BF6,\n    0x71E5, 0x71E5, 0x1132, 0x71E6, 0x71E6, 0x1E5F, 0x71E7, 0x71E7, 0x19EB,\n    0x71E8, 0x71EC, 0x3BFA, 0x71ED, 0x71ED, 0x229F, 0x71EE, 0x71EE, 0x1396,\n    0x71EF, 0x71F3, 0x3BFF, 0x71F4, 0x71F4, 0x1F5D, 0x71F5, 0x71F8, 0x3C04,\n    0x71F9, 0x71F9, 0x19EC, 0x71FA, 0x71FB, 0x3C08, 0x71FC, 0x71FC, 0x1FBC,\n    0x71FD, 0x71FD, 0x3C0A, 0x71FE, 0x71FE, 0x24DA, 0x71FF, 0x71FF, 0x3C0B,\n    0x7200, 0x7205, 0x3C0C, 0x7206, 0x7206, 0x0415, 0x7207, 0x720C, 0x3C12,\n    0x720D, 0x720D, 0x2149, 0x720E, 0x720F, 0x3C18, 0x7210, 0x7210, 0x2046,\n    0x7211, 0x721A, 0x3C1A, 0x721B, 0x721B, 0x2000, 0x721C, 0x721C, 0x3C24,\n    0x721D, 0x721D, 0x19ED, 0x721E, 0x7227, 0x3C25, 0x7228, 0x7228, 0x19EE,\n    0x7229, 0x7229, 0x3C2F, 0x722A, 0x722A, 0x1203, 0x722B, 0x722B, 0x3C30,\n    0x722C, 0x722C, 0x0B81, 0x722D, 0x722F, 0x3C31, 0x7230, 0x7230, 0x196C,\n    0x7231, 0x7231, 0x03B9, 0x7232, 0x7232, 0x2190, 0x7233, 0x7234, 0x3C34,\n    0x7235, 0x7235, 0x0923, 0x7236, 0x7236, 0x06B3, 0x7237, 0x7237, 0x1036,\n    0x7238, 0x7238, 0x03E1, 0x7239, 0x7239, 0x05DA, 0x723A, 0x723A, 0x2208,\n    0x723B, 0x723B, 0x1269, 0x723C, 0x723C, 0x3C36, 0x723D, 0x723D, 0x0DA1,\n    0x723E, 0x723E, 0x1EE6, 0x723F, 0x723F, 0x169D, 0x7240, 0x7246, 0x3C37,\n    0x7247, 0x7247, 0x0BCB, 0x7248, 0x7248, 0x03F1, 0x7249, 0x724B, 0x3C3E,\n    0x724C, 0x724C, 0x0B87, 0x724D, 0x724D, 0x1969, 0x724E, 0x7251, 0x3C41,\n    0x7252, 0x7252, 0x196A, 0x7253, 0x7255, 0x3C45, 0x7256, 0x7256, 0x196B,\n    0x7257, 0x7257, 0x3C48, 0x7258, 0x7258, 0x24C3, 0x7259, 0x7259, 0x0FE9,\n    0x725A, 0x725A, 0x3C49, 0x725B, 0x725B, 0x0B64, 0x725C, 0x725C, 0x3C4A,\n    0x725D, 0x725D, 0x1944, 0x725E, 0x725E, 0x3C4B, 0x725F, 0x725F, 0x0B15,\n    0x7260, 0x7260, 0x3C4C, 0x7261, 0x7261, 0x0B18, 0x7262, 0x7262, 0x09B9,\n    0x7263, 0x7265, 0x3C4D, 0x7266, 0x7266, 0x1945, 0x7267, 0x7267, 0x0B24,\n    0x7268, 0x7268, 0x3C50, 0x7269, 0x7269, 0x0EFE, 0x726A, 0x726D, 0x3C51,\n    0x726E, 0x726E, 0x1942, 0x726F, 0x726F, 0x1946, 0x7270, 0x7271, 0x3C55,\n    0x7272, 0x7272, 0x0D35, 0x7273, 0x7274, 0x3C57, 0x7275, 0x7275, 0x0C20,\n    0x7276, 0x7278, 0x3C59, 0x7279, 0x7279, 0x0E2B, 0x727A, 0x727A, 0x0F0D,\n    0x727B, 0x727C, 0x3C5C, 0x727D, 0x727D, 0x20CC, 0x727E, 0x727F, 0x1947,\n    0x7280, 0x7280, 0x0F19, 0x7281, 0x7281, 0x09D2, 0x7282, 0x7283, 0x3C5E,\n    0x7284, 0x7284, 0x1949, 0x7285, 0x7289, 0x3C60, 0x728A, 0x728A, 0x05FE,\n    0x728B, 0x728B, 0x194A, 0x728C, 0x728C, 0x3C65, 0x728D, 0x728D, 0x194B,\n    0x728E, 0x728E, 0x3C66, 0x728F, 0x728F, 0x194C, 0x7290, 0x7291, 0x3C67,\n    0x7292, 0x7292, 0x194D, 0x7293, 0x7295, 0x3C69, 0x7296, 0x7296, 0x2340,\n    0x7297, 0x729E, 0x3C6C, 0x729F, 0x729F, 0x1943, 0x72A0, 0x72A1, 0x3C74,\n    0x72A2, 0x72A2, 0x1ED1, 0x72A3, 0x72A6, 0x3C76, 0x72A7, 0x72A7, 0x21AC,\n    0x72A8, 0x72AB, 0x3C7A, 0x72AC, 0x72AC, 0x0C89, 0x72AD, 0x72AD, 0x15EF,\n    0x72AE, 0x72AE, 0x3C7E, 0x72AF, 0x72AF, 0x0655, 0x72B0, 0x72B0, 0x15F0,\n    0x72B1, 0x72B3, 0x3C7F, 0x72B4, 0x72B4, 0x15F1, 0x72B5, 0x72B5, 0x3C82,\n    0x72B6, 0x72B6, 0x1211, 0x72B7, 0x72B8, 0x15F2, 0x72B9, 0x72B9, 0x10B1,\n    0x72BA, 0x72BF, 0x3C83, 0x72C0, 0x72C0, 0x22AF, 0x72C1, 0x72C1, 0x15F5,\n    0x72C2, 0x72C2, 0x097E, 0x72C3, 0x72C3, 0x15F4, 0x72C4, 0x72C4, 0x05B3,\n    0x72C5, 0x72C7, 0x3C89, 0x72C8, 0x72C8, 0x0420, 0x72C9, 0x72CC, 0x3C8C,\n    0x72CD, 0x72CD, 0x15F7, 0x72CE, 0x72CE, 0x15F6, 0x72CF, 0x72CF, 0x3C90,\n    0x72D0, 0x72D0, 0x07B3, 0x72D1, 0x72D1, 0x3C91, 0x72D2, 0x72D2, 0x15F8,\n    0x72D3, 0x72D6, 0x3C92, 0x72D7, 0x72D7, 0x0710, 0x72D8, 0x72D8, 0x3C96,\n    0x72D9, 0x72D9, 0x0900, 0x72DA, 0x72DD, 0x3C97, 0x72DE, 0x72DE, 0x0B5F,\n    0x72DF, 0x72DF, 0x3C9B, 0x72E0, 0x72E0, 0x0794, 0x72E1, 0x72E1, 0x0897,\n    0x72E2, 0x72E7, 0x3C9C, 0x72E8, 0x72E8, 0x15F9, 0x72E9, 0x72E9, 0x15FB,\n    0x72EA, 0x72EB, 0x3CA2, 0x72EC, 0x72EC, 0x05FF, 0x72ED, 0x72ED, 0x0F2E,\n    0x72EE, 0x72EE, 0x0D3F, 0x72EF, 0x72EF, 0x15FA, 0x72F0, 0x72F0, 0x1199,\n    0x72F1, 0x72F1, 0x10E1, 0x72F2, 0x72F2, 0x15FC, 0x72F3, 0x72F3, 0x1600,\n    0x72F4, 0x72F4, 0x15FD, 0x72F5, 0x72F6, 0x3CA4, 0x72F7, 0x72F7, 0x15FE,\n    0x72F8, 0x72F8, 0x09D5, 0x72F9, 0x72F9, 0x21B6, 0x72FA, 0x72FB, 0x1602,\n    0x72FC, 0x72FC, 0x09B2, 0x72FD, 0x72FD, 0x1E3D, 0x72FE, 0x72FF, 0x3CA6,\n    0x7300, 0x7300, 0x3CA8, 0x7301, 0x7301, 0x15FF, 0x7302, 0x7302, 0x3CA9,\n    0x7303, 0x7303, 0x1601, 0x7304, 0x7309, 0x3CAA, 0x730A, 0x730A, 0x1607,\n    0x730B, 0x730D, 0x3CB0, 0x730E, 0x730E, 0x0A1D, 0x730F, 0x7312, 0x3CB3,\n    0x7313, 0x7313, 0x1605, 0x7314, 0x7314, 0x3CB7, 0x7315, 0x7315, 0x160A,\n    0x7316, 0x7316, 0x04C5, 0x7317, 0x7317, 0x1604, 0x7318, 0x731A, 0x3CB8,\n    0x731B, 0x731B, 0x0AD2, 0x731C, 0x731C, 0x0489, 0x731D, 0x731D, 0x1609,\n    0x731E, 0x731E, 0x1608, 0x731F, 0x7320, 0x3CBB, 0x7321, 0x7321, 0x1606,\n    0x7322, 0x7322, 0x160B, 0x7323, 0x7324, 0x3CBD, 0x7325, 0x7325, 0x160D,\n    0x7326, 0x7328, 0x3CBF, 0x7329, 0x7329, 0x0F94, 0x732A, 0x732A, 0x11EC,\n    0x732B, 0x732B, 0x0AAD, 0x732C, 0x732C, 0x160E, 0x732D, 0x732D, 0x3CC2,\n    0x732E, 0x732E, 0x0F44, 0x732F, 0x7330, 0x3CC3, 0x7331, 0x7331, 0x1610,\n    0x7332, 0x7333, 0x3CC5, 0x7334, 0x7334, 0x07A6, 0x7335, 0x7335, 0x3CC7,\n    0x7336, 0x7336, 0x2235, 0x7337, 0x7337, 0x18D4, 0x7338, 0x7338, 0x160F,\n    0x7339, 0x7339, 0x160C, 0x733A, 0x733A, 0x3CC8, 0x733B, 0x733B, 0x2397,\n    0x733C, 0x733D, 0x3CC9, 0x733E, 0x733E, 0x07C0, 0x733F, 0x733F, 0x10F6,\n    0x7340, 0x7340, 0x3CCB, 0x7341, 0x7341, 0x2395, 0x7342, 0x7343, 0x3CCC,\n    0x7344, 0x7344, 0x223F, 0x7345, 0x7345, 0x212A, 0x7346, 0x734C, 0x3CCE,\n    0x734D, 0x734D, 0x1612, 0x734E, 0x734F, 0x3CD5, 0x7350, 0x7350, 0x1611,\n    0x7351, 0x7351, 0x3CD7, 0x7352, 0x7352, 0x18D5, 0x7353, 0x7356, 0x3CD8,\n    0x7357, 0x7357, 0x1613, 0x7358, 0x735F, 0x3CDC, 0x7360, 0x7360, 0x1614,\n    0x7361, 0x7367, 0x3CE4, 0x7368, 0x7368, 0x1ED2, 0x7369, 0x7369, 0x3CEB,\n    0x736A, 0x736A, 0x2396, 0x736B, 0x736B, 0x2398, 0x736C, 0x736C, 0x1615,\n    0x736D, 0x736D, 0x0DF4, 0x736E, 0x736E, 0x3CEC, 0x736F, 0x736F, 0x1616,\n    0x7370, 0x7370, 0x20A2, 0x7371, 0x7371, 0x3CED, 0x7372, 0x7372, 0x1F64,\n    0x7373, 0x7374, 0x3CEE, 0x7375, 0x7375, 0x202B, 0x7376, 0x7376, 0x3CF0,\n    0x7377, 0x7377, 0x2394, 0x7378, 0x7378, 0x2139, 0x7379, 0x7379, 0x3CF1,\n    0x737A, 0x737A, 0x215F, 0x737B, 0x737B, 0x21C1, 0x737C, 0x737C, 0x239A,\n    0x737D, 0x737D, 0x3CF2, 0x737E, 0x737E, 0x1617, 0x737F, 0x737F, 0x3CF3,\n    0x7380, 0x7380, 0x2399, 0x7381, 0x7383, 0x3CF4, 0x7384, 0x7384, 0x0FC9,\n    0x7385, 0x7386, 0x3CF7, 0x7387, 0x7387, 0x0A71, 0x7388, 0x7388, 0x3CF9,\n    0x7389, 0x7389, 0x10D6, 0x738A, 0x738A, 0x3CFA, 0x738B, 0x738B, 0x0EA6,\n    0x738C, 0x738D, 0x3CFB, 0x738E, 0x738E, 0x1818, 0x738F, 0x7390, 0x3CFD,\n    0x7391, 0x7391, 0x1819, 0x7392, 0x7395, 0x3CFF, 0x7396, 0x7396, 0x08F0,\n    0x7397, 0x739A, 0x3D03, 0x739B, 0x739B, 0x0A91, 0x739C, 0x739E, 0x3D07,\n    0x739F, 0x739F, 0x181C, 0x73A0, 0x73A1, 0x3D0A, 0x73A2, 0x73A2, 0x181B,\n    0x73A3, 0x73A8, 0x3D0C, 0x73A9, 0x73A9, 0x0E97, 0x73AA, 0x73AA, 0x3D12,\n    0x73AB, 0x73AB, 0x0ABA, 0x73AC, 0x73AD, 0x3D13, 0x73AE, 0x73AE, 0x181A,\n    0x73AF, 0x73AF, 0x07CC, 0x73B0, 0x73B0, 0x0F43, 0x73B1, 0x73B1, 0x3D15,\n    0x73B2, 0x73B2, 0x0A2A, 0x73B3, 0x73B3, 0x1821, 0x73B4, 0x73B6, 0x3D16,\n    0x73B7, 0x73B7, 0x1820, 0x73B8, 0x73B9, 0x3D19, 0x73BA, 0x73BA, 0x182C,\n    0x73BB, 0x73BB, 0x046A, 0x73BC, 0x73BF, 0x3D1B, 0x73C0, 0x73C0, 0x1822,\n    0x73C1, 0x73C1, 0x3D1F, 0x73C2, 0x73C2, 0x181E, 0x73C3, 0x73C7, 0x3D20,\n    0x73C8, 0x73C8, 0x1824, 0x73C9, 0x73C9, 0x1823, 0x73CA, 0x73CA, 0x0CF3,\n    0x73CB, 0x73CC, 0x3D25, 0x73CD, 0x73CD, 0x1185, 0x73CE, 0x73CE, 0x3D27,\n    0x73CF, 0x73CF, 0x181D, 0x73D0, 0x73D0, 0x0646, 0x73D1, 0x73D1, 0x181F,\n    0x73D2, 0x73D8, 0x3D28, 0x73D9, 0x73D9, 0x1826, 0x73DA, 0x73DD, 0x3D2F,\n    0x73DE, 0x73DE, 0x182B, 0x73DF, 0x73DF, 0x3D33, 0x73E0, 0x73E0, 0x11E8,\n    0x73E1, 0x73E4, 0x3D34, 0x73E5, 0x73E5, 0x1825, 0x73E6, 0x73E6, 0x3D38,\n    0x73E7, 0x73E7, 0x182A, 0x73E8, 0x73E8, 0x3D39, 0x73E9, 0x73E9, 0x1829,\n    0x73EA, 0x73EC, 0x3D3A, 0x73ED, 0x73ED, 0x03EB, 0x73EE, 0x73F1, 0x3D3D,\n    0x73F2, 0x73F2, 0x182D, 0x73F3, 0x73FD, 0x3D41, 0x73FE, 0x73FE, 0x21C0,\n    0x73FF, 0x73FF, 0x3D4C, 0x7400, 0x7402, 0x3D4D, 0x7403, 0x7403, 0x0C6F,\n    0x7404, 0x7404, 0x3D50, 0x7405, 0x7405, 0x09B0, 0x7406, 0x7406, 0x09D8,\n    0x7407, 0x7408, 0x3D51, 0x7409, 0x7409, 0x0A39, 0x740A, 0x740A, 0x1828,\n    0x740B, 0x740E, 0x3D53, 0x740F, 0x740F, 0x182E, 0x7410, 0x7410, 0x0DEB,\n    0x7411, 0x7419, 0x3D57, 0x741A, 0x741A, 0x1838, 0x741B, 0x741B, 0x1837,\n    0x741C, 0x7421, 0x3D60, 0x7422, 0x7422, 0x121E, 0x7423, 0x7424, 0x3D66,\n    0x7425, 0x7425, 0x1832, 0x7426, 0x7426, 0x1831, 0x7427, 0x7427, 0x3D68,\n    0x7428, 0x7428, 0x1833, 0x7429, 0x7429, 0x3D69, 0x742A, 0x742A, 0x182F,\n    0x742B, 0x742B, 0x3D6A, 0x742C, 0x742C, 0x1836, 0x742D, 0x742D, 0x3D6B,\n    0x742E, 0x742E, 0x1835, 0x742F, 0x742F, 0x3D6C, 0x7430, 0x7430, 0x1834,\n    0x7431, 0x7432, 0x3D6D, 0x7433, 0x7433, 0x0A1E, 0x7434, 0x7434, 0x0C56,\n    0x7435, 0x7435, 0x0BBE, 0x7436, 0x7436, 0x0B84, 0x7437, 0x743B, 0x3D6F,\n    0x743C, 0x743C, 0x0C6A, 0x743D, 0x743E, 0x3D74, 0x743F, 0x743F, 0x2460,\n    0x7440, 0x7440, 0x3D76, 0x7441, 0x7441, 0x1839, 0x7442, 0x744A, 0x3D77,\n    0x744B, 0x744B, 0x245C, 0x744C, 0x7454, 0x3D80, 0x7455, 0x7455, 0x183C,\n    0x7456, 0x7456, 0x3D89, 0x7457, 0x7457, 0x183B, 0x7458, 0x7458, 0x3D8A,\n    0x7459, 0x7459, 0x183D, 0x745A, 0x745A, 0x07AE, 0x745B, 0x745B, 0x1830,\n    0x745C, 0x745C, 0x183A, 0x745D, 0x745D, 0x3D8B, 0x745E, 0x745E, 0x0CCB,\n    0x745F, 0x745F, 0x0CE3, 0x7460, 0x7462, 0x3D8C, 0x7463, 0x7463, 0x215D,\n    0x7464, 0x7468, 0x3D8F, 0x7469, 0x7469, 0x2225, 0x746A, 0x746A, 0x206A,\n    0x746B, 0x746C, 0x3D94, 0x746D, 0x746D, 0x183F, 0x746E, 0x746F, 0x3D96,\n    0x7470, 0x7470, 0x073E, 0x7471, 0x7475, 0x3D98, 0x7476, 0x7476, 0x1027,\n    0x7477, 0x7477, 0x183E, 0x7478, 0x747D, 0x3D9D, 0x747E, 0x747E, 0x1840,\n    0x747F, 0x747F, 0x3DA3, 0x7480, 0x7481, 0x1843, 0x7482, 0x7482, 0x3DA4,\n    0x7483, 0x7483, 0x09F0, 0x7484, 0x7486, 0x3DA5, 0x7487, 0x7487, 0x1845,\n    0x7488, 0x7488, 0x3DA8, 0x7489, 0x7489, 0x2461, 0x748A, 0x748A, 0x3DA9,\n    0x748B, 0x748B, 0x1846, 0x748C, 0x748D, 0x3DAA, 0x748E, 0x748E, 0x1842,\n    0x748F, 0x748F, 0x3DAC, 0x7490, 0x7490, 0x184A, 0x7491, 0x749B, 0x3DAD,\n    0x749C, 0x749C, 0x1841, 0x749D, 0x749D, 0x3DB8, 0x749E, 0x749E, 0x1847,\n    0x749F, 0x74A2, 0x3DB9, 0x74A3, 0x74A3, 0x245B, 0x74A4, 0x74A5, 0x3DBD,\n    0x74A6, 0x74A6, 0x2462, 0x74A7, 0x74A7, 0x184B, 0x74A8, 0x74A9, 0x1848,\n    0x74AA, 0x74AF, 0x3DBF, 0x74B0, 0x74B0, 0x1F54, 0x74B1, 0x74B9, 0x3DC5,\n    0x74BA, 0x74BA, 0x184D, 0x74BB, 0x74BC, 0x3DCE, 0x74BD, 0x74BD, 0x245F,\n    0x74BE, 0x74C9, 0x3DD0, 0x74CA, 0x74CA, 0x20EC, 0x74CB, 0x74CE, 0x3DDC,\n    0x74CF, 0x74CF, 0x245D, 0x74D0, 0x74D1, 0x3DE0, 0x74D2, 0x74D2, 0x184C,\n    0x74D3, 0x74D3, 0x3DE2, 0x74D4, 0x74D4, 0x2463, 0x74D5, 0x74D9, 0x3DE3,\n    0x74DA, 0x74DA, 0x2464, 0x74DB, 0x74DB, 0x3DE8, 0x74DC, 0x74DC, 0x0728,\n    0x74DD, 0x74DD, 0x3DE9, 0x74DE, 0x74DE, 0x1B32, 0x74DF, 0x74DF, 0x3DEA,\n    0x74E0, 0x74E0, 0x1B33, 0x74E1, 0x74E1, 0x3DEB, 0x74E2, 0x74E2, 0x0BCF,\n    0x74E3, 0x74E3, 0x03F5, 0x74E4, 0x74E4, 0x0C9A, 0x74E5, 0x74E5, 0x3DEC,\n    0x74E6, 0x74E6, 0x0E90, 0x74E7, 0x74ED, 0x3DED, 0x74EE, 0x74EE, 0x0EDC,\n    0x74EF, 0x74EF, 0x1903, 0x74F0, 0x74F3, 0x3DF4, 0x74F4, 0x74F4, 0x1904,\n    0x74F5, 0x74F5, 0x3DF8, 0x74F6, 0x74F6, 0x0BDE, 0x74F7, 0x74F7, 0x054C,\n    0x74F8, 0x74FE, 0x3DF9, 0x74FF, 0x74FF, 0x1905, 0x7500, 0x7503, 0x3E00,\n    0x7504, 0x7504, 0x1188, 0x7505, 0x750B, 0x3E04, 0x750C, 0x750C, 0x24A5,\n    0x750D, 0x750D, 0x1485, 0x750E, 0x750E, 0x3E0B, 0x750F, 0x750F, 0x1906,\n    0x7510, 0x7510, 0x3E0C, 0x7511, 0x7511, 0x1907, 0x7512, 0x7512, 0x3E0D,\n    0x7513, 0x7513, 0x1908, 0x7514, 0x7517, 0x3E0E, 0x7518, 0x7518, 0x06C5,\n    0x7519, 0x7519, 0x14F8, 0x751A, 0x751A, 0x0D2E, 0x751B, 0x751B, 0x3E12,\n    0x751C, 0x751C, 0x0E43, 0x751D, 0x751E, 0x3E13, 0x751F, 0x751F, 0x0D33,\n    0x7520, 0x7522, 0x3E15, 0x7523, 0x7523, 0x1E70, 0x7524, 0x7524, 0x3E18,\n    0x7525, 0x7525, 0x0D34, 0x7526, 0x7527, 0x3E19, 0x7528, 0x7528, 0x10A8,\n    0x7529, 0x7529, 0x0D9B, 0x752A, 0x752A, 0x3E1B, 0x752B, 0x752B, 0x06A1,\n    0x752C, 0x752C, 0x1B34, 0x752D, 0x752D, 0x042B, 0x752E, 0x752E, 0x3E1C,\n    0x752F, 0x752F, 0x1734, 0x7530, 0x7530, 0x0E42, 0x7531, 0x7531, 0x10AE,\n    0x7532, 0x7532, 0x084A, 0x7533, 0x7533, 0x0D23, 0x7534, 0x7534, 0x3E1D,\n    0x7535, 0x7535, 0x05C8, 0x7536, 0x7536, 0x3E1E, 0x7537, 0x7537, 0x0B33,\n    0x7538, 0x7538, 0x05CA, 0x7539, 0x7539, 0x3E1F, 0x753A, 0x753A, 0x1A78,\n    0x753B, 0x753B, 0x07C2, 0x753C, 0x753D, 0x3E20, 0x753E, 0x753E, 0x1816,\n    0x753F, 0x753F, 0x3E22, 0x7540, 0x7540, 0x1A79, 0x7541, 0x7544, 0x3E23,\n    0x7545, 0x7545, 0x04CE, 0x7546, 0x7547, 0x3E27, 0x7548, 0x7548, 0x1A7C,\n    0x7549, 0x754A, 0x3E29, 0x754B, 0x754B, 0x1A7B, 0x754C, 0x754C, 0x08B8,\n    0x754D, 0x754D, 0x3E2B, 0x754E, 0x754E, 0x1A7A, 0x754F, 0x754F, 0x0EC6,\n    0x7550, 0x7553, 0x3E2C, 0x7554, 0x7554, 0x0B90, 0x7555, 0x7558, 0x3E30,\n    0x7559, 0x7559, 0x0A3D, 0x755A, 0x755A, 0x139E, 0x755B, 0x755B, 0x1A7D,\n    0x755C, 0x755C, 0x0FBE, 0x755D, 0x755D, 0x208F, 0x755E, 0x7561, 0x3E34,\n    0x7562, 0x7562, 0x1E42, 0x7563, 0x7564, 0x3E38, 0x7565, 0x7565, 0x0A7B,\n    0x7566, 0x7566, 0x0C07, 0x7567, 0x7569, 0x3E3A, 0x756A, 0x756A, 0x0649,\n    0x756B, 0x756B, 0x1F4E, 0x756C, 0x7571, 0x3E3D, 0x7572, 0x7572, 0x1A7E,\n    0x7573, 0x7573, 0x3E43, 0x7574, 0x7574, 0x0510, 0x7575, 0x7575, 0x3E44,\n    0x7576, 0x7576, 0x1EB1, 0x7577, 0x7577, 0x3E45, 0x7578, 0x7578, 0x0810,\n    0x7579, 0x7579, 0x1A7F, 0x757A, 0x757E, 0x3E46, 0x757F, 0x757F, 0x1814,\n    0x7580, 0x7582, 0x3E4B, 0x7583, 0x7583, 0x1A80, 0x7584, 0x7585, 0x3E4E,\n    0x7586, 0x7586, 0x087F, 0x7587, 0x7587, 0x1E8B, 0x7588, 0x758A, 0x3E50,\n    0x758B, 0x758B, 0x1BC6, 0x758C, 0x758E, 0x3E53, 0x758F, 0x758F, 0x0D7F,\n    0x7590, 0x7590, 0x3E56, 0x7591, 0x7591, 0x1050, 0x7592, 0x7592, 0x1B60,\n    0x7593, 0x7593, 0x3E57, 0x7594, 0x7594, 0x1B61, 0x7595, 0x7595, 0x3E58,\n    0x7596, 0x7596, 0x1B62, 0x7597, 0x7597, 0x0A0F, 0x7598, 0x7598, 0x3E59,\n    0x7599, 0x7599, 0x06E8, 0x759A, 0x759A, 0x08FD, 0x759B, 0x759C, 0x3E5A,\n    0x759D, 0x759D, 0x1B64, 0x759E, 0x759E, 0x3E5C, 0x759F, 0x759F, 0x0B72,\n    0x75A0, 0x75A0, 0x1B63, 0x75A1, 0x75A1, 0x101A, 0x75A2, 0x75A2, 0x3E5D,\n    0x75A3, 0x75A3, 0x1B66, 0x75A4, 0x75A4, 0x03D7, 0x75A5, 0x75A5, 0x08BB,\n    0x75A6, 0x75AA, 0x3E5E, 0x75AB, 0x75AB, 0x1066, 0x75AC, 0x75AC, 0x1B65,\n    0x75AD, 0x75AD, 0x3E63, 0x75AE, 0x75AE, 0x0532, 0x75AF, 0x75AF, 0x0685,\n    0x75B0, 0x75B0, 0x1B6C, 0x75B1, 0x75B1, 0x1B6B, 0x75B2, 0x75B2, 0x0BC2,\n    0x75B3, 0x75B4, 0x1B67, 0x75B5, 0x75B5, 0x0546, 0x75B6, 0x75B7, 0x3E64,\n    0x75B8, 0x75B8, 0x1B69, 0x75B9, 0x75B9, 0x118F, 0x75BA, 0x75BB, 0x3E66,\n    0x75BC, 0x75BC, 0x0E2E, 0x75BD, 0x75BD, 0x0901, 0x75BE, 0x75BE, 0x0825,\n    0x75BF, 0x75C1, 0x3E68, 0x75C2, 0x75C2, 0x1B6E, 0x75C3, 0x75C3, 0x1B6D,\n    0x75C4, 0x75C4, 0x1B6A, 0x75C5, 0x75C5, 0x0468, 0x75C6, 0x75C6, 0x3E6B,\n    0x75C7, 0x75C7, 0x11A1, 0x75C8, 0x75C8, 0x109D, 0x75C9, 0x75C9, 0x08E6,\n    0x75CA, 0x75CA, 0x0C87, 0x75CB, 0x75CC, 0x3E6C, 0x75CD, 0x75CD, 0x1B70,\n    0x75CE, 0x75D1, 0x3E6E, 0x75D2, 0x75D2, 0x1020, 0x75D3, 0x75D3, 0x3E72,\n    0x75D4, 0x75D4, 0x11CB, 0x75D5, 0x75D5, 0x0792, 0x75D6, 0x75D6, 0x1B6F,\n    0x75D7, 0x75D7, 0x3E73, 0x75D8, 0x75D8, 0x05FA, 0x75D9, 0x75D9, 0x1FC6,\n    0x75DA, 0x75DA, 0x3E74, 0x75DB, 0x75DB, 0x0E65, 0x75DC, 0x75DD, 0x3E75,\n    0x75DE, 0x75DE, 0x0BC5, 0x75DF, 0x75E1, 0x3E77, 0x75E2, 0x75E2, 0x09EA,\n    0x75E3, 0x75E3, 0x1B71, 0x75E4, 0x75E4, 0x1B74, 0x75E5, 0x75E5, 0x3E7A,\n    0x75E6, 0x75E6, 0x1B73, 0x75E7, 0x75E7, 0x1B76, 0x75E8, 0x75E8, 0x1B72,\n    0x75E9, 0x75E9, 0x3E7B, 0x75EA, 0x75EA, 0x07D3, 0x75EB, 0x75EB, 0x1B75,\n    0x75EC, 0x75EF, 0x3E7C, 0x75F0, 0x75F0, 0x0E08, 0x75F1, 0x75F1, 0x1B78,\n    0x75F2, 0x75F3, 0x3E80, 0x75F4, 0x75F4, 0x04FA, 0x75F5, 0x75F8, 0x3E82,\n    0x75F9, 0x75F9, 0x043D, 0x75FA, 0x75FB, 0x3E86, 0x75FC, 0x75FC, 0x1B79,\n    0x75FD, 0x75FE, 0x3E88, 0x75FF, 0x75FF, 0x1B7A, 0x7600, 0x7600, 0x1B7C,\n    0x7601, 0x7601, 0x0564, 0x7602, 0x7602, 0x25AE, 0x7603, 0x7603, 0x1B77,\n    0x7604, 0x7604, 0x3E8A, 0x7605, 0x7605, 0x1B7D, 0x7606, 0x7609, 0x3E8B,\n    0x760A, 0x760A, 0x1B80, 0x760B, 0x760B, 0x1F01, 0x760C, 0x760C, 0x1B7E,\n    0x760D, 0x760D, 0x2200, 0x760E, 0x760F, 0x3E8F, 0x7610, 0x7610, 0x1B7B,\n    0x7611, 0x7614, 0x3E91, 0x7615, 0x7615, 0x1B83, 0x7616, 0x7616, 0x3E95,\n    0x7617, 0x7617, 0x1B7F, 0x7618, 0x7618, 0x1B82, 0x7619, 0x7619, 0x1B84,\n    0x761A, 0x761A, 0x3E96, 0x761B, 0x761B, 0x1B85, 0x761C, 0x761D, 0x3E97,\n    0x761E, 0x761E, 0x25B2, 0x761F, 0x761F, 0x0ED0, 0x7620, 0x7620, 0x1B88,\n    0x7621, 0x7621, 0x1E97, 0x7622, 0x7622, 0x1B87, 0x7623, 0x7623, 0x3E99,\n    0x7624, 0x7624, 0x0A3F, 0x7625, 0x7625, 0x1B81, 0x7626, 0x7626, 0x0D74,\n    0x7627, 0x7627, 0x20AB, 0x7628, 0x7628, 0x3E9A, 0x7629, 0x7629, 0x0574,\n    0x762A, 0x762A, 0x045A, 0x762B, 0x762B, 0x0E04, 0x762C, 0x762C, 0x3E9B,\n    0x762D, 0x762D, 0x1B8A, 0x762E, 0x762F, 0x3E9C, 0x7630, 0x7630, 0x1B8B,\n    0x7631, 0x7632, 0x3E9E, 0x7633, 0x7633, 0x1B90, 0x7634, 0x7634, 0x116F,\n    0x7635, 0x7635, 0x1B8D, 0x7636, 0x7637, 0x3EA0, 0x7638, 0x7638, 0x0C8E,\n    0x7639, 0x763A, 0x3EA2, 0x763B, 0x763B, 0x25B3, 0x763C, 0x763C, 0x1B86,\n    0x763D, 0x763D, 0x3EA4, 0x763E, 0x763E, 0x1B8F, 0x763F, 0x763F, 0x1B8C,\n    0x7640, 0x7640, 0x1B89, 0x7641, 0x7641, 0x3EA5, 0x7642, 0x7642, 0x2028,\n    0x7643, 0x7643, 0x1B8E, 0x7644, 0x7645, 0x3EA6, 0x7646, 0x7647, 0x25AF,\n    0x7648, 0x7648, 0x3EA8, 0x7649, 0x7649, 0x25B1, 0x764A, 0x764B, 0x3EA9,\n    0x764C, 0x764C, 0x03B4, 0x764D, 0x764D, 0x1B91, 0x764E, 0x7653, 0x3EAB,\n    0x7654, 0x7654, 0x1B93, 0x7655, 0x7655, 0x3EB1, 0x7656, 0x7656, 0x1B95,\n    0x7657, 0x7657, 0x3EB2, 0x7658, 0x7658, 0x25AC, 0x7659, 0x765B, 0x3EB3,\n    0x765C, 0x765C, 0x1B94, 0x765D, 0x765D, 0x3EB6, 0x765E, 0x765E, 0x1B92,\n    0x765F, 0x765F, 0x1E4E, 0x7660, 0x7661, 0x3EB7, 0x7662, 0x7662, 0x2202,\n    0x7663, 0x7663, 0x0FCB, 0x7664, 0x7664, 0x25AB, 0x7665, 0x7665, 0x2286,\n    0x7666, 0x7666, 0x3EB9, 0x7667, 0x7667, 0x25AD, 0x7668, 0x7668, 0x3EBA,\n    0x7669, 0x7669, 0x25B6, 0x766A, 0x766A, 0x3EBB, 0x766B, 0x766B, 0x1B96,\n    0x766C, 0x766C, 0x21E3, 0x766D, 0x766E, 0x25B4, 0x766F, 0x766F, 0x1B97,\n    0x7670, 0x7670, 0x222F, 0x7671, 0x7671, 0x2165, 0x7672, 0x7672, 0x25B7,\n    0x7673, 0x7677, 0x3EBC, 0x7678, 0x7678, 0x0748, 0x7679, 0x767A, 0x3EC1,\n    0x767B, 0x767B, 0x05A8, 0x767C, 0x767C, 0x1EE9, 0x767D, 0x767D, 0x03E2,\n    0x767E, 0x767E, 0x03E4, 0x767F, 0x7681, 0x3EC3, 0x7682, 0x7682, 0x1130,\n    0x7683, 0x7683, 0x3EC6, 0x7684, 0x7684, 0x05A5, 0x7685, 0x7685, 0x3EC7,\n    0x7686, 0x7686, 0x08A5, 0x7687, 0x7687, 0x07DF, 0x7688, 0x7688, 0x1B2D,\n    0x7689, 0x768A, 0x3EC8, 0x768B, 0x768B, 0x06D9, 0x768C, 0x768D, 0x3ECA,\n    0x768E, 0x768E, 0x1B2E, 0x768F, 0x7690, 0x3ECC, 0x7691, 0x7691, 0x03B3,\n    0x7692, 0x7692, 0x3ECE, 0x7693, 0x7693, 0x1B2F, 0x7694, 0x7695, 0x3ECF,\n    0x7696, 0x7696, 0x0E9F, 0x7697, 0x7698, 0x3ED1, 0x7699, 0x7699, 0x1B30,\n    0x769A, 0x769A, 0x1E25, 0x769B, 0x76A3, 0x3ED3, 0x76A4, 0x76A4, 0x1B31,\n    0x76A5, 0x76AD, 0x3EDC, 0x76AE, 0x76AE, 0x0BC3, 0x76AF, 0x76B0, 0x3EE5,\n    0x76B1, 0x76B1, 0x11E4, 0x76B2, 0x76B2, 0x1BC8, 0x76B3, 0x76B3, 0x3EE7,\n    0x76B4, 0x76B4, 0x1BC9, 0x76B5, 0x76B7, 0x3EE8, 0x76B8, 0x76B8, 0x25C0,\n    0x76B9, 0x76B9, 0x3EEB, 0x76BA, 0x76BA, 0x229A, 0x76BB, 0x76BE, 0x3EEC,\n    0x76BF, 0x76BF, 0x0AF8, 0x76C0, 0x76C1, 0x3EF0, 0x76C2, 0x76C2, 0x10C0,\n    0x76C3, 0x76C4, 0x3EF2, 0x76C5, 0x76C5, 0x11D0, 0x76C6, 0x76C6, 0x0BA9,\n    0x76C7, 0x76C7, 0x3EF4, 0x76C8, 0x76C8, 0x1094, 0x76C9, 0x76C9, 0x3EF5,\n    0x76CA, 0x76CA, 0x106D, 0x76CB, 0x76CC, 0x3EF6, 0x76CD, 0x76CD, 0x1A8B,\n    0x76CE, 0x76CE, 0x03C6, 0x76CF, 0x76CF, 0x1156, 0x76D0, 0x76D0, 0x0FF7,\n    0x76D1, 0x76D1, 0x0853, 0x76D2, 0x76D2, 0x0787, 0x76D3, 0x76D3, 0x3EF8,\n    0x76D4, 0x76D4, 0x0985, 0x76D5, 0x76D5, 0x3EF9, 0x76D6, 0x76D6, 0x06C2,\n    0x76D7, 0x76D7, 0x05A2, 0x76D8, 0x76D8, 0x0B8D, 0x76D9, 0x76DA, 0x3EFA,\n    0x76DB, 0x76DB, 0x0D39, 0x76DC, 0x76DD, 0x3EFC, 0x76DE, 0x76DE, 0x226E,\n    0x76DF, 0x76DF, 0x0AD0, 0x76E0, 0x76E0, 0x3EFE, 0x76E1, 0x76E1, 0x1FBD,\n    0x76E2, 0x76E2, 0x3EFF, 0x76E3, 0x76E3, 0x1F84, 0x76E4, 0x76E4, 0x20B2,\n    0x76E5, 0x76E5, 0x1A8C, 0x76E6, 0x76E6, 0x3F00, 0x76E7, 0x76E7, 0x2043,\n    0x76E8, 0x76ED, 0x3F01, 0x76EE, 0x76EE, 0x0B22, 0x76EF, 0x76EF, 0x05E1,\n    0x76F0, 0x76F0, 0x3F07, 0x76F1, 0x76F1, 0x1A58, 0x76F2, 0x76F2, 0x0AA9,\n    0x76F3, 0x76F3, 0x3F08, 0x76F4, 0x76F4, 0x11B0, 0x76F5, 0x76F7, 0x3F09,\n    0x76F8, 0x76F8, 0x0F4D, 0x76F9, 0x76F9, 0x1A5B, 0x76FA, 0x76FB, 0x3F0C,\n    0x76FC, 0x76FC, 0x0B8F, 0x76FD, 0x76FD, 0x3F0E, 0x76FE, 0x76FE, 0x061B,\n    0x76FF, 0x76FF, 0x3F0F, 0x7700, 0x7700, 0x3F10, 0x7701, 0x7701, 0x0D38,\n    0x7702, 0x7703, 0x3F11, 0x7704, 0x7704, 0x1A59, 0x7705, 0x7706, 0x3F13,\n    0x7707, 0x7708, 0x1A5C, 0x7709, 0x7709, 0x0AC1, 0x770A, 0x770A, 0x3F15,\n    0x770B, 0x770B, 0x0941, 0x770C, 0x770C, 0x3F16, 0x770D, 0x770D, 0x1A5A,\n    0x770E, 0x7718, 0x3F17, 0x7719, 0x7719, 0x1A60, 0x771A, 0x771A, 0x1A5E,\n    0x771B, 0x771E, 0x3F22, 0x771F, 0x771F, 0x1187, 0x7720, 0x7720, 0x0AE4,\n    0x7721, 0x7721, 0x3F26, 0x7722, 0x7722, 0x1A5F, 0x7723, 0x7725, 0x3F27,\n    0x7726, 0x7726, 0x1A62, 0x7727, 0x7727, 0x3F2A, 0x7728, 0x7728, 0x1144,\n    0x7729, 0x7729, 0x0FCC, 0x772A, 0x772C, 0x3F2B, 0x772D, 0x772D, 0x1A61,\n    0x772E, 0x772E, 0x3F2E, 0x772F, 0x772F, 0x0AD5, 0x7730, 0x7734, 0x3F2F,\n    0x7735, 0x7735, 0x1A63, 0x7736, 0x7736, 0x0981, 0x7737, 0x7737, 0x091B,\n    0x7738, 0x7738, 0x1A64, 0x7739, 0x7739, 0x3F34, 0x773A, 0x773A, 0x0E4A,\n    0x773B, 0x773B, 0x3F35, 0x773C, 0x773C, 0x1004, 0x773D, 0x773F, 0x3F36,\n    0x7740, 0x7740, 0x1222, 0x7741, 0x7741, 0x1197, 0x7742, 0x7742, 0x3F39,\n    0x7743, 0x7743, 0x1A68, 0x7744, 0x7746, 0x3F3A, 0x7747, 0x7747, 0x1A67,\n    0x7748, 0x774E, 0x3F3D, 0x774F, 0x774F, 0x2684, 0x7750, 0x7751, 0x1A65,\n    0x7752, 0x7759, 0x3F44, 0x775A, 0x775A, 0x1A69, 0x775B, 0x775B, 0x08D5,\n    0x775C, 0x775D, 0x3F4C, 0x775E, 0x775E, 0x24EF, 0x775F, 0x7760, 0x3F4E,\n    0x7761, 0x7761, 0x0DA4, 0x7762, 0x7762, 0x1A6B, 0x7763, 0x7763, 0x05FC,\n    0x7764, 0x7764, 0x3F50, 0x7765, 0x7765, 0x1A6C, 0x7766, 0x7766, 0x0B23,\n    0x7767, 0x7767, 0x3F51, 0x7768, 0x7768, 0x1A6A, 0x7769, 0x776A, 0x3F52,\n    0x776B, 0x776B, 0x08AF, 0x776C, 0x776C, 0x048E, 0x776D, 0x7778, 0x3F54,\n    0x7779, 0x7779, 0x0602, 0x777A, 0x777C, 0x3F60, 0x777D, 0x777D, 0x1A6F,\n    0x777E, 0x777E, 0x1270, 0x777F, 0x777F, 0x1A6D, 0x7780, 0x7780, 0x1A70,\n    0x7781, 0x7783, 0x3F63, 0x7784, 0x7784, 0x0AEE, 0x7785, 0x7785, 0x0517,\n    0x7786, 0x778B, 0x3F66, 0x778C, 0x778C, 0x1A71, 0x778D, 0x778D, 0x1A6E,\n    0x778E, 0x778E, 0x0F26, 0x778F, 0x7790, 0x3F6C, 0x7791, 0x7791, 0x1A72,\n    0x7792, 0x7792, 0x0A9E, 0x7793, 0x7797, 0x3F6E, 0x7798, 0x7798, 0x24EE,\n    0x7799, 0x779D, 0x3F73, 0x779E, 0x779E, 0x2074, 0x779F, 0x77A0, 0x1A73,\n    0x77A1, 0x77A1, 0x3F78, 0x77A2, 0x77A2, 0x1495, 0x77A3, 0x77A4, 0x3F79,\n    0x77A5, 0x77A5, 0x0BD2, 0x77A6, 0x77A6, 0x3F7B, 0x77A7, 0x77A7, 0x0C43,\n    0x77A8, 0x77A8, 0x3F7C, 0x77A9, 0x77A9, 0x11F4, 0x77AA, 0x77AA, 0x05AA,\n    0x77AB, 0x77AB, 0x3F7D, 0x77AC, 0x77AC, 0x0DA7, 0x77AD, 0x77AD, 0x2687,\n    0x77AE, 0x77AF, 0x3F7E, 0x77B0, 0x77B0, 0x1A75, 0x77B1, 0x77B2, 0x3F80,\n    0x77B3, 0x77B3, 0x0E5C, 0x77B4, 0x77B4, 0x3F82, 0x77B5, 0x77B5, 0x1A76,\n    0x77B6, 0x77BA, 0x3F83, 0x77BB, 0x77BB, 0x1151, 0x77BC, 0x77BC, 0x24F0,\n    0x77BD, 0x77BD, 0x1A77, 0x77BE, 0x77BE, 0x3F88, 0x77BF, 0x77BF, 0x1D7E,\n    0x77C0, 0x77C6, 0x3F89, 0x77C7, 0x77C7, 0x268D, 0x77C8, 0x77CC, 0x3F90,\n    0x77CD, 0x77CD, 0x1397, 0x77CE, 0x77D6, 0x3F95, 0x77D7, 0x77D7, 0x0526,\n    0x77D8, 0x77D9, 0x3F9E, 0x77DA, 0x77DA, 0x22A0, 0x77DB, 0x77DB, 0x0AB1,\n    0x77DC, 0x77DC, 0x1BCA, 0x77DD, 0x77E1, 0x3FA0, 0x77E2, 0x77E2, 0x0D4F,\n    0x77E3, 0x77E3, 0x105A, 0x77E4, 0x77E4, 0x3FA5, 0x77E5, 0x77E5, 0x11A9,\n    0x77E6, 0x77E6, 0x3FA6, 0x77E7, 0x77E7, 0x1B1A, 0x77E8, 0x77E8, 0x3FA7,\n    0x77E9, 0x77E9, 0x0907, 0x77EA, 0x77EA, 0x3FA8, 0x77EB, 0x77EB, 0x0894,\n    0x77EC, 0x77EC, 0x1B1B, 0x77ED, 0x77ED, 0x060B, 0x77EE, 0x77EE, 0x03B6,\n    0x77EF, 0x77EF, 0x1FAB, 0x77F0, 0x77F2, 0x3FA9, 0x77F3, 0x77F3, 0x0D46,\n    0x77F4, 0x77F5, 0x3FAC, 0x77F6, 0x77F6, 0x1A22, 0x77F7, 0x77F7, 0x3FAE,\n    0x77F8, 0x77F8, 0x1A23, 0x77F9, 0x77FC, 0x3FAF, 0x77FD, 0x77FD, 0x0F08,\n    0x77FE, 0x77FE, 0x064C, 0x77FF, 0x77FF, 0x0980, 0x7800, 0x7800, 0x1A24,\n    0x7801, 0x7801, 0x0A92, 0x7802, 0x7802, 0x0CE9, 0x7803, 0x7808, 0x3FB3,\n    0x7809, 0x7809, 0x1A25, 0x780A, 0x780B, 0x3FB9, 0x780C, 0x780C, 0x0C15,\n    0x780D, 0x780D, 0x0940, 0x780E, 0x7810, 0x3FBB, 0x7811, 0x7811, 0x1A28,\n    0x7812, 0x7812, 0x0BB9, 0x7813, 0x7813, 0x3FBE, 0x7814, 0x7814, 0x0FF9,\n    0x7815, 0x7815, 0x3FBF, 0x7816, 0x7816, 0x1206, 0x7817, 0x7818, 0x1A26,\n    0x7819, 0x7819, 0x3FC0, 0x781A, 0x781A, 0x100B, 0x781B, 0x781B, 0x3FC1,\n    0x781C, 0x781D, 0x1A2B, 0x781E, 0x781E, 0x3FC2, 0x781F, 0x781F, 0x1A30,\n    0x7820, 0x7822, 0x3FC3, 0x7823, 0x7823, 0x1A34, 0x7824, 0x7824, 0x3FC6,\n    0x7825, 0x7825, 0x1A32, 0x7826, 0x7826, 0x1A3A, 0x7827, 0x7827, 0x1189,\n    0x7828, 0x7828, 0x3FC7, 0x7829, 0x7829, 0x1A35, 0x782A, 0x782B, 0x3FC8,\n    0x782C, 0x782C, 0x1A33, 0x782D, 0x782D, 0x1A2A, 0x782E, 0x782F, 0x3FCA,\n    0x7830, 0x7830, 0x0BAA, 0x7831, 0x7833, 0x3FCC, 0x7834, 0x7834, 0x0BE5,\n    0x7835, 0x7836, 0x3FCF, 0x7837, 0x7837, 0x0D22, 0x7838, 0x7838, 0x1115,\n    0x7839, 0x783B, 0x1A2D, 0x783C, 0x783C, 0x1A31, 0x783D, 0x783D, 0x3FD1,\n    0x783E, 0x783E, 0x09E4, 0x783F, 0x783F, 0x3FD2, 0x7840, 0x7840, 0x0524,\n    0x7841, 0x7842, 0x3FD3, 0x7843, 0x7843, 0x26A8, 0x7844, 0x7844, 0x3FD5,\n    0x7845, 0x7845, 0x0741, 0x7846, 0x7846, 0x3FD6, 0x7847, 0x7847, 0x1A3C,\n    0x7848, 0x784B, 0x3FD7, 0x784C, 0x784C, 0x1A3D, 0x784D, 0x784D, 0x3FDB,\n    0x784E, 0x784E, 0x1A36, 0x784F, 0x784F, 0x3FDC, 0x7850, 0x7850, 0x1A3B,\n    0x7851, 0x7851, 0x3FDD, 0x7852, 0x7852, 0x0F07, 0x7853, 0x7854, 0x3FDE,\n    0x7855, 0x7855, 0x0DAB, 0x7856, 0x7857, 0x1A38, 0x7858, 0x785C, 0x3FE0,\n    0x785D, 0x785D, 0x0F62, 0x785E, 0x7863, 0x3FE5, 0x7864, 0x7864, 0x24E9,\n    0x7865, 0x7867, 0x3FEB, 0x7868, 0x7868, 0x24E5, 0x7869, 0x7869, 0x3FEE,\n    0x786A, 0x786A, 0x1A3E, 0x786B, 0x786B, 0x0A3B, 0x786C, 0x786C, 0x1097,\n    0x786D, 0x786D, 0x1A37, 0x786E, 0x786E, 0x0C92, 0x786F, 0x786F, 0x21FA,\n    0x7870, 0x7876, 0x3FEF, 0x7877, 0x7877, 0x0862, 0x7878, 0x787B, 0x3FF6,\n    0x787C, 0x787C, 0x0BB1, 0x787D, 0x7886, 0x3FFA, 0x7887, 0x7887, 0x1A42,\n    0x7888, 0x7888, 0x4004, 0x7889, 0x7889, 0x05D0, 0x788A, 0x788B, 0x4005,\n    0x788C, 0x788C, 0x0A5C, 0x788D, 0x788D, 0x03B8, 0x788E, 0x788E, 0x0DDE,\n    0x788F, 0x7890, 0x4007, 0x7891, 0x7891, 0x0417, 0x7892, 0x7892, 0x4009,\n    0x7893, 0x7893, 0x1A40, 0x7894, 0x7896, 0x400A, 0x7897, 0x7897, 0x0E9C,\n    0x7898, 0x7898, 0x05C3, 0x7899, 0x7899, 0x400D, 0x789A, 0x789A, 0x1A41,\n    0x789B, 0x789B, 0x1A3F, 0x789C, 0x789C, 0x1A43, 0x789D, 0x789E, 0x400E,\n    0x789F, 0x789F, 0x05DB, 0x78A0, 0x78A0, 0x4010, 0x78A1, 0x78A1, 0x1A44,\n    0x78A2, 0x78A2, 0x4011, 0x78A3, 0x78A3, 0x1A45, 0x78A4, 0x78A4, 0x4012,\n    0x78A5, 0x78A5, 0x1A48, 0x78A6, 0x78A6, 0x4013, 0x78A7, 0x78A7, 0x0435,\n    0x78A8, 0x78A8, 0x4014, 0x78A9, 0x78A9, 0x2148, 0x78AA, 0x78AC, 0x4015,\n    0x78AD, 0x78AD, 0x24E4, 0x78AE, 0x78AF, 0x4018, 0x78B0, 0x78B0, 0x0BB7,\n    0x78B1, 0x78B1, 0x0861, 0x78B2, 0x78B2, 0x1A46, 0x78B3, 0x78B3, 0x0E0F,\n    0x78B4, 0x78B4, 0x04B1, 0x78B5, 0x78B7, 0x401A, 0x78B8, 0x78B8, 0x24E6,\n    0x78B9, 0x78B9, 0x1A47, 0x78BA, 0x78BA, 0x20F7, 0x78BB, 0x78BB, 0x401D,\n    0x78BC, 0x78BC, 0x206B, 0x78BD, 0x78BD, 0x401E, 0x78BE, 0x78BE, 0x0B4E,\n    0x78BF, 0x78C0, 0x401F, 0x78C1, 0x78C1, 0x0548, 0x78C2, 0x78C4, 0x4021,\n    0x78C5, 0x78C5, 0x0400, 0x78C6, 0x78C8, 0x4024, 0x78C9, 0x78C9, 0x1A4B,\n    0x78CA, 0x78CA, 0x09C5, 0x78CB, 0x78CB, 0x056B, 0x78CC, 0x78CF, 0x4027,\n    0x78D0, 0x78D0, 0x0B8E, 0x78D1, 0x78D3, 0x402B, 0x78D4, 0x78D4, 0x1A49,\n    0x78D5, 0x78D5, 0x0951, 0x78D6, 0x78D8, 0x402E, 0x78D9, 0x78D9, 0x1A4A,\n    0x78DA, 0x78DA, 0x22A7, 0x78DB, 0x78E2, 0x4031, 0x78E3, 0x78E3, 0x24EC,\n    0x78E4, 0x78E6, 0x4039, 0x78E7, 0x78E7, 0x24EB, 0x78E8, 0x78E8, 0x0B08,\n    0x78E9, 0x78EB, 0x403C, 0x78EC, 0x78EC, 0x1A4C, 0x78ED, 0x78EE, 0x403F,\n    0x78EF, 0x78EF, 0x24E3, 0x78F0, 0x78F1, 0x4041, 0x78F2, 0x78F2, 0x1A4D,\n    0x78F3, 0x78F3, 0x4043, 0x78F4, 0x78F4, 0x1A4F, 0x78F5, 0x78F6, 0x4044,\n    0x78F7, 0x78F7, 0x0A20, 0x78F8, 0x78F9, 0x4046, 0x78FA, 0x78FA, 0x07DC,\n    0x78FB, 0x78FC, 0x4048, 0x78FD, 0x78FD, 0x24EA, 0x78FE, 0x78FF, 0x404A,\n    0x7900, 0x7900, 0x404C, 0x7901, 0x7901, 0x0889, 0x7902, 0x7904, 0x404D,\n    0x7905, 0x7905, 0x1A4E, 0x7906, 0x790D, 0x4050, 0x790E, 0x790E, 0x1E92,\n    0x790F, 0x7912, 0x4058, 0x7913, 0x7913, 0x1A50, 0x7914, 0x7918, 0x405C,\n    0x7919, 0x7919, 0x1E27, 0x791A, 0x791D, 0x4061, 0x791E, 0x791E, 0x1A52,\n    0x791F, 0x7923, 0x4065, 0x7924, 0x7924, 0x1A51, 0x7925, 0x7925, 0x406A,\n    0x7926, 0x7926, 0x1FE6, 0x7927, 0x7929, 0x406B, 0x792A, 0x792A, 0x24E7,\n    0x792B, 0x792B, 0x2012, 0x792C, 0x792C, 0x1EEC, 0x792D, 0x7930, 0x406E,\n    0x7931, 0x7931, 0x24E8, 0x7932, 0x7933, 0x4072, 0x7934, 0x7934, 0x1A53,\n    0x7935, 0x7939, 0x4074, 0x793A, 0x793A, 0x0D55, 0x793B, 0x793B, 0x19F8,\n    0x793C, 0x793C, 0x09DC, 0x793D, 0x793D, 0x4079, 0x793E, 0x793E, 0x0D20,\n    0x793F, 0x793F, 0x407A, 0x7940, 0x7940, 0x19F9, 0x7941, 0x7941, 0x0C0D,\n    0x7942, 0x7945, 0x407B, 0x7946, 0x7946, 0x19FA, 0x7947, 0x7947, 0x407F,\n    0x7948, 0x7948, 0x0C0C, 0x7949, 0x7949, 0x19FB, 0x794A, 0x7952, 0x4080,\n    0x7953, 0x7953, 0x19FE, 0x7954, 0x7955, 0x4089, 0x7956, 0x7956, 0x1243,\n    0x7957, 0x7957, 0x1A01, 0x7958, 0x7959, 0x408B, 0x795A, 0x795A, 0x19FF,\n    0x795B, 0x795C, 0x19FC, 0x795D, 0x795D, 0x1200, 0x795E, 0x795E, 0x0D2A,\n    0x795F, 0x795F, 0x0DE3, 0x7960, 0x7960, 0x1A02, 0x7961, 0x7961, 0x408D,\n    0x7962, 0x7962, 0x1A00, 0x7963, 0x7964, 0x408E, 0x7965, 0x7965, 0x0F56,\n    0x7966, 0x7966, 0x4090, 0x7967, 0x7967, 0x1A04, 0x7968, 0x7968, 0x0BD0,\n    0x7969, 0x796C, 0x4091, 0x796D, 0x796D, 0x0833, 0x796E, 0x796E, 0x4095,\n    0x796F, 0x796F, 0x1A03, 0x7970, 0x7976, 0x4096, 0x7977, 0x7977, 0x059C,\n    0x7978, 0x7978, 0x080B, 0x7979, 0x7979, 0x409D, 0x797A, 0x797A, 0x1A05,\n    0x797B, 0x797F, 0x409E, 0x7980, 0x7980, 0x130B, 0x7981, 0x7981, 0x08CC,\n    0x7982, 0x7983, 0x40A3, 0x7984, 0x7984, 0x0A62, 0x7985, 0x7985, 0x1A06,\n    0x7986, 0x7989, 0x40A5, 0x798A, 0x798A, 0x1A07, 0x798B, 0x798C, 0x40A9,\n    0x798D, 0x798D, 0x1F66, 0x798E, 0x798E, 0x24DC, 0x798F, 0x798F, 0x069E,\n    0x7990, 0x7999, 0x40AB, 0x799A, 0x799A, 0x1A08, 0x799B, 0x79A5, 0x40B5,\n    0x79A6, 0x79A6, 0x26A2, 0x79A7, 0x79A7, 0x1A09, 0x79A8, 0x79A9, 0x40C0,\n    0x79AA, 0x79AA, 0x24DD, 0x79AB, 0x79AD, 0x40C2, 0x79AE, 0x79AE, 0x200E,\n    0x79AF, 0x79AF, 0x40C5, 0x79B0, 0x79B0, 0x24DB, 0x79B1, 0x79B1, 0x1EB8,\n    0x79B2, 0x79B2, 0x40C6, 0x79B3, 0x79B3, 0x1A0A, 0x79B4, 0x79B8, 0x40C7,\n    0x79B9, 0x79B9, 0x10D2, 0x79BA, 0x79BA, 0x1264, 0x79BB, 0x79BB, 0x09D6,\n    0x79BC, 0x79BC, 0x40CC, 0x79BD, 0x79BD, 0x0C5A, 0x79BE, 0x79BE, 0x0783,\n    0x79BF, 0x79BF, 0x40CD, 0x79C0, 0x79C0, 0x0FAE, 0x79C1, 0x79C1, 0x0DB2,\n    0x79C2, 0x79C2, 0x40CE, 0x79C3, 0x79C3, 0x0E6B, 0x79C4, 0x79C5, 0x40CF,\n    0x79C6, 0x79C6, 0x06CC, 0x79C7, 0x79C8, 0x40D1, 0x79C9, 0x79C9, 0x0465,\n    0x79CA, 0x79CA, 0x40D3, 0x79CB, 0x79CB, 0x0C6C, 0x79CC, 0x79CC, 0x40D4,\n    0x79CD, 0x79CD, 0x11D5, 0x79CE, 0x79D0, 0x40D5, 0x79D1, 0x79D1, 0x0953,\n    0x79D2, 0x79D2, 0x0AF0, 0x79D3, 0x79D4, 0x40D8, 0x79D5, 0x79D5, 0x1B1D,\n    0x79D6, 0x79D7, 0x40DA, 0x79D8, 0x79D8, 0x0ADD, 0x79D9, 0x79DE, 0x40DC,\n    0x79DF, 0x79DF, 0x123F, 0x79E0, 0x79E2, 0x40E2, 0x79E3, 0x79E3, 0x1B1F,\n    0x79E4, 0x79E4, 0x04F8, 0x79E5, 0x79E5, 0x40E5, 0x79E6, 0x79E6, 0x0C55,\n    0x79E7, 0x79E7, 0x1016, 0x79E8, 0x79E8, 0x40E6, 0x79E9, 0x79E9, 0x11C7,\n    0x79EA, 0x79EA, 0x40E7, 0x79EB, 0x79EB, 0x1B20, 0x79EC, 0x79EC, 0x40E8,\n    0x79ED, 0x79ED, 0x1B1E, 0x79EE, 0x79EE, 0x40E9, 0x79EF, 0x79EF, 0x0812,\n    0x79F0, 0x79F0, 0x04EB, 0x79F1, 0x79F7, 0x40EA, 0x79F8, 0x79F8, 0x08A6,\n    0x79F9, 0x79FA, 0x40F1, 0x79FB, 0x79FB, 0x104D, 0x79FC, 0x79FC, 0x40F3,\n    0x79FD, 0x79FD, 0x07F5, 0x79FE, 0x79FF, 0x40F4, 0x7A00, 0x7A00, 0x0F0E,\n    0x7A01, 0x7A01, 0x40F6, 0x7A02, 0x7A02, 0x1B24, 0x7A03, 0x7A03, 0x1B23,\n    0x7A04, 0x7A05, 0x40F7, 0x7A06, 0x7A06, 0x1B21, 0x7A07, 0x7A0A, 0x40F9,\n    0x7A0B, 0x7A0B, 0x04F1, 0x7A0C, 0x7A0C, 0x40FD, 0x7A0D, 0x7A0D, 0x0D0D,\n    0x7A0E, 0x7A0E, 0x0DA5, 0x7A0F, 0x7A13, 0x40FE, 0x7A14, 0x7A14, 0x1B26,\n    0x7A15, 0x7A16, 0x4103, 0x7A17, 0x7A17, 0x03E9, 0x7A18, 0x7A19, 0x4105,\n    0x7A1A, 0x7A1A, 0x11C8, 0x7A1B, 0x7A1D, 0x4107, 0x7A1E, 0x7A1E, 0x1B25,\n    0x7A1F, 0x7A1F, 0x410A, 0x7A20, 0x7A20, 0x0512, 0x7A21, 0x7A22, 0x410B,\n    0x7A23, 0x7A23, 0x1D8F, 0x7A24, 0x7A2D, 0x410D, 0x7A2E, 0x7A2E, 0x2295,\n    0x7A2F, 0x7A30, 0x4117, 0x7A31, 0x7A31, 0x1E80, 0x7A32, 0x7A32, 0x4119,\n    0x7A33, 0x7A33, 0x0ED7, 0x7A34, 0x7A36, 0x411A, 0x7A37, 0x7A37, 0x1B28,\n    0x7A38, 0x7A38, 0x411D, 0x7A39, 0x7A39, 0x1B27, 0x7A3A, 0x7A3A, 0x411E,\n    0x7A3B, 0x7A3B, 0x059F, 0x7A3C, 0x7A3C, 0x084D, 0x7A3D, 0x7A3D, 0x0811,\n    0x7A3E, 0x7A3E, 0x411F, 0x7A3F, 0x7A3F, 0x06E0, 0x7A40, 0x7A40, 0x2677,\n    0x7A41, 0x7A45, 0x4120, 0x7A46, 0x7A46, 0x0B25, 0x7A47, 0x7A4B, 0x4125,\n    0x7A4C, 0x7A4C, 0x2624, 0x7A4D, 0x7A4D, 0x1F69, 0x7A4E, 0x7A4E, 0x222B,\n    0x7A4F, 0x7A50, 0x412A, 0x7A51, 0x7A51, 0x1B29, 0x7A52, 0x7A56, 0x412C,\n    0x7A57, 0x7A57, 0x0DE0, 0x7A58, 0x7A60, 0x4131, 0x7A61, 0x7A61, 0x257F,\n    0x7A62, 0x7A62, 0x1F5B, 0x7A63, 0x7A68, 0x413A, 0x7A69, 0x7A69, 0x219B,\n    0x7A6A, 0x7A6A, 0x4140, 0x7A6B, 0x7A6B, 0x267D, 0x7A6C, 0x7A6F, 0x4141,\n    0x7A70, 0x7A70, 0x1B2C, 0x7A71, 0x7A73, 0x4145, 0x7A74, 0x7A74, 0x0FD1,\n    0x7A75, 0x7A75, 0x4148, 0x7A76, 0x7A76, 0x08EE, 0x7A77, 0x7A77, 0x0C6B,\n    0x7A78, 0x7A79, 0x1B9A, 0x7A7A, 0x7A7A, 0x0962, 0x7A7B, 0x7A7E, 0x4149,\n    0x7A7F, 0x7A7F, 0x052C, 0x7A80, 0x7A80, 0x1B9C, 0x7A81, 0x7A81, 0x0E6C,\n    0x7A82, 0x7A82, 0x414D, 0x7A83, 0x7A83, 0x0C51, 0x7A84, 0x7A84, 0x114E,\n    0x7A85, 0x7A85, 0x414E, 0x7A86, 0x7A86, 0x1B9D, 0x7A87, 0x7A87, 0x414F,\n    0x7A88, 0x7A88, 0x1B9E, 0x7A89, 0x7A8C, 0x4150, 0x7A8D, 0x7A8D, 0x0C4C,\n    0x7A8E, 0x7A90, 0x4154, 0x7A91, 0x7A91, 0x102B, 0x7A92, 0x7A92, 0x11CE,\n    0x7A93, 0x7A94, 0x4157, 0x7A95, 0x7A95, 0x1B9F, 0x7A96, 0x7A96, 0x08A2,\n    0x7A97, 0x7A97, 0x0533, 0x7A98, 0x7A98, 0x08EC, 0x7A99, 0x7A9B, 0x4159,\n    0x7A9C, 0x7A9C, 0x055F, 0x7A9D, 0x7A9D, 0x0EE0, 0x7A9E, 0x7A9E, 0x415C,\n    0x7A9F, 0x7A9F, 0x096C, 0x7AA0, 0x7AA0, 0x1BA1, 0x7AA1, 0x7AA4, 0x415D,\n    0x7AA5, 0x7AA5, 0x0987, 0x7AA6, 0x7AA6, 0x1BA0, 0x7AA7, 0x7AA7, 0x4161,\n    0x7AA8, 0x7AA8, 0x1BA3, 0x7AA9, 0x7AA9, 0x21A0, 0x7AAA, 0x7AAA, 0x2186,\n    0x7AAB, 0x7AAB, 0x4162, 0x7AAC, 0x7AAC, 0x1BA2, 0x7AAD, 0x7AAD, 0x1BA4,\n    0x7AAE, 0x7AAE, 0x20ED, 0x7AAF, 0x7AB2, 0x4163, 0x7AB3, 0x7AB3, 0x1BA5,\n    0x7AB4, 0x7AB5, 0x4167, 0x7AB6, 0x7AB6, 0x25B9, 0x7AB7, 0x7AB9, 0x4169,\n    0x7ABA, 0x7ABA, 0x1FEA, 0x7ABB, 0x7ABE, 0x416C, 0x7ABF, 0x7ABF, 0x0A47,\n    0x7AC0, 0x7AC3, 0x4170, 0x7AC4, 0x7AC4, 0x1EA4, 0x7AC5, 0x7AC5, 0x20E1,\n    0x7AC6, 0x7AC6, 0x4174, 0x7AC7, 0x7AC7, 0x25B8, 0x7AC8, 0x7AC8, 0x2260,\n    0x7AC9, 0x7AC9, 0x4175, 0x7ACA, 0x7ACA, 0x20E2, 0x7ACB, 0x7ACB, 0x09EB,\n    0x7ACC, 0x7AD5, 0x4176, 0x7AD6, 0x7AD6, 0x0D91, 0x7AD7, 0x7AD8, 0x4180,\n    0x7AD9, 0x7AD9, 0x115F, 0x7ADA, 0x7ADD, 0x4182, 0x7ADE, 0x7ADE, 0x08E9,\n    0x7ADF, 0x7ADF, 0x08E8, 0x7AE0, 0x7AE0, 0x1163, 0x7AE1, 0x7AE2, 0x4186,\n    0x7AE3, 0x7AE3, 0x092F, 0x7AE4, 0x7AE4, 0x4188, 0x7AE5, 0x7AE5, 0x0E60,\n    0x7AE6, 0x7AE6, 0x1B99, 0x7AE7, 0x7AE9, 0x4189, 0x7AEA, 0x7AEA, 0x2141,\n    0x7AEB, 0x7AEC, 0x418C, 0x7AED, 0x7AED, 0x08B0, 0x7AEE, 0x7AEE, 0x418E,\n    0x7AEF, 0x7AEF, 0x060A, 0x7AF0, 0x7AF5, 0x418F, 0x7AF6, 0x7AF6, 0x1FC7,\n    0x7AF7, 0x7AF8, 0x4195, 0x7AF9, 0x7AF9, 0x11F0, 0x7AFA, 0x7AFA, 0x1C63,\n    0x7AFB, 0x7AFC, 0x4197, 0x7AFD, 0x7AFD, 0x1C64, 0x7AFE, 0x7AFE, 0x4199,\n    0x7AFF, 0x7AFF, 0x06C8, 0x7B00, 0x7B02, 0x419A, 0x7B03, 0x7B04, 0x1C66,\n    0x7B05, 0x7B05, 0x419D, 0x7B06, 0x7B06, 0x03D5, 0x7B07, 0x7B07, 0x419E,\n    0x7B08, 0x7B08, 0x1C65, 0x7B09, 0x7B09, 0x419F, 0x7B0A, 0x7B0A, 0x1C69,\n    0x7B0B, 0x7B0B, 0x0DE6, 0x7B0C, 0x7B0E, 0x41A0, 0x7B0F, 0x7B0F, 0x1C6B,\n    0x7B10, 0x7B10, 0x41A3, 0x7B11, 0x7B11, 0x0F71, 0x7B12, 0x7B13, 0x41A4,\n    0x7B14, 0x7B14, 0x0433, 0x7B15, 0x7B15, 0x1C68, 0x7B16, 0x7B18, 0x41A6,\n    0x7B19, 0x7B19, 0x1C6F, 0x7B1A, 0x7B1A, 0x41A9, 0x7B1B, 0x7B1B, 0x05B2,\n    0x7B1C, 0x7B1D, 0x41AA, 0x7B1E, 0x7B1E, 0x1C77, 0x7B1F, 0x7B1F, 0x41AC,\n    0x7B20, 0x7B20, 0x1C72, 0x7B21, 0x7B23, 0x41AD, 0x7B24, 0x7B24, 0x1C74,\n    0x7B25, 0x7B25, 0x1C73, 0x7B26, 0x7B26, 0x0698, 0x7B27, 0x7B27, 0x41B0,\n    0x7B28, 0x7B28, 0x0428, 0x7B29, 0x7B29, 0x41B1, 0x7B2A, 0x7B2A, 0x1C6E,\n    0x7B2B, 0x7B2B, 0x1C6A, 0x7B2C, 0x7B2C, 0x05BB, 0x7B2D, 0x7B2D, 0x41B2,\n    0x7B2E, 0x7B2E, 0x1C70, 0x7B2F, 0x7B30, 0x41B3, 0x7B31, 0x7B31, 0x1C71,\n    0x7B32, 0x7B32, 0x41B5, 0x7B33, 0x7B33, 0x1C75, 0x7B34, 0x7B37, 0x41B6,\n    0x7B38, 0x7B38, 0x1C6D, 0x7B39, 0x7B39, 0x41BA, 0x7B3A, 0x7B3A, 0x0856,\n    0x7B3B, 0x7B3B, 0x41BB, 0x7B3C, 0x7B3C, 0x0A46, 0x7B3D, 0x7B3D, 0x41BC,\n    0x7B3E, 0x7B3E, 0x1C76, 0x7B3F, 0x7B44, 0x41BD, 0x7B45, 0x7B45, 0x1C7A,\n    0x7B46, 0x7B46, 0x1E41, 0x7B47, 0x7B47, 0x1C6C, 0x7B48, 0x7B48, 0x41C3,\n    0x7B49, 0x7B49, 0x05A9, 0x7B4A, 0x7B4A, 0x41C4, 0x7B4B, 0x7B4B, 0x08BF,\n    0x7B4C, 0x7B4C, 0x1C7C, 0x7B4D, 0x7B4E, 0x41C5, 0x7B4F, 0x7B4F, 0x0641,\n    0x7B50, 0x7B50, 0x097D, 0x7B51, 0x7B51, 0x11FD, 0x7B52, 0x7B52, 0x0E63,\n    0x7B53, 0x7B53, 0x41C7, 0x7B54, 0x7B54, 0x0573, 0x7B55, 0x7B55, 0x41C8,\n    0x7B56, 0x7B56, 0x04A6, 0x7B57, 0x7B57, 0x41C9, 0x7B58, 0x7B58, 0x1C78,\n    0x7B59, 0x7B59, 0x41CA, 0x7B5A, 0x7B5A, 0x1C79, 0x7B5B, 0x7B5B, 0x0CF1,\n    0x7B5C, 0x7B5C, 0x41CB, 0x7B5D, 0x7B5D, 0x1C7D, 0x7B5E, 0x7B5F, 0x41CC,\n    0x7B60, 0x7B60, 0x1C7E, 0x7B61, 0x7B61, 0x41CE, 0x7B62, 0x7B62, 0x1C81,\n    0x7B63, 0x7B66, 0x41CF, 0x7B67, 0x7B67, 0x25E4, 0x7B68, 0x7B6D, 0x41D3,\n    0x7B6E, 0x7B6E, 0x1C7F, 0x7B6F, 0x7B70, 0x41D9, 0x7B71, 0x7B71, 0x1C83,\n    0x7B72, 0x7B72, 0x1C82, 0x7B73, 0x7B74, 0x41DB, 0x7B75, 0x7B75, 0x1C7B,\n    0x7B76, 0x7B76, 0x41DD, 0x7B77, 0x7B77, 0x0977, 0x7B78, 0x7B78, 0x41DE,\n    0x7B79, 0x7B79, 0x0514, 0x7B7A, 0x7B7A, 0x41DF, 0x7B7B, 0x7B7B, 0x1C80,\n    0x7B7C, 0x7B7D, 0x41E0, 0x7B7E, 0x7B7E, 0x0C26, 0x7B7F, 0x7B7F, 0x41E2,\n    0x7B80, 0x7B80, 0x0865, 0x7B81, 0x7B84, 0x41E3, 0x7B85, 0x7B85, 0x1C8B,\n    0x7B86, 0x7B8A, 0x41E7, 0x7B8B, 0x7B8B, 0x1F86, 0x7B8C, 0x7B8C, 0x41EC,\n    0x7B8D, 0x7B8D, 0x0718, 0x7B8E, 0x7B8F, 0x41ED, 0x7B90, 0x7B90, 0x1C84,\n    0x7B91, 0x7B93, 0x41EF, 0x7B94, 0x7B94, 0x0474, 0x7B95, 0x7B95, 0x0813,\n    0x7B96, 0x7B96, 0x41F2, 0x7B97, 0x7B97, 0x0DD8, 0x7B98, 0x7B9B, 0x41F3,\n    0x7B9C, 0x7B9C, 0x1C8D, 0x7B9D, 0x7B9D, 0x1C89, 0x7B9E, 0x7BA0, 0x41F7,\n    0x7BA1, 0x7BA1, 0x0735, 0x7BA2, 0x7BA2, 0x1C8E, 0x7BA3, 0x7BA5, 0x41FA,\n    0x7BA6, 0x7BA7, 0x1C85, 0x7BA8, 0x7BA8, 0x1C8A, 0x7BA9, 0x7BA9, 0x0A88,\n    0x7BAA, 0x7BAA, 0x1C8C, 0x7BAB, 0x7BAB, 0x1C8F, 0x7BAC, 0x7BAC, 0x1C88,\n    0x7BAD, 0x7BAD, 0x0870, 0x7BAE, 0x7BB0, 0x41FD, 0x7BB1, 0x7BB1, 0x0F51,\n    0x7BB2, 0x7BB3, 0x4200, 0x7BB4, 0x7BB4, 0x1C90, 0x7BB5, 0x7BB7, 0x4202,\n    0x7BB8, 0x7BB8, 0x1C87, 0x7BB9, 0x7BBF, 0x4205, 0x7BC0, 0x7BC0, 0x1FB3,\n    0x7BC1, 0x7BC1, 0x1C92, 0x7BC2, 0x7BC3, 0x420C, 0x7BC4, 0x7BC4, 0x1EEF,\n    0x7BC5, 0x7BC5, 0x420E, 0x7BC6, 0x7BC6, 0x120A, 0x7BC7, 0x7BC7, 0x0BC9,\n    0x7BC8, 0x7BC8, 0x420F, 0x7BC9, 0x7BC9, 0x22A4, 0x7BCA, 0x7BCA, 0x4210,\n    0x7BCB, 0x7BCB, 0x25E8, 0x7BCC, 0x7BCC, 0x1C93, 0x7BCD, 0x7BD0, 0x4211,\n    0x7BD1, 0x7BD1, 0x1C91, 0x7BD2, 0x7BD2, 0x4215, 0x7BD3, 0x7BD3, 0x0A4F,\n    0x7BD4, 0x7BD8, 0x4216, 0x7BD9, 0x7BD9, 0x06D8, 0x7BDA, 0x7BDA, 0x1C95,\n    0x7BDB, 0x7BDC, 0x421B, 0x7BDD, 0x7BDD, 0x1C94, 0x7BDE, 0x7BE0, 0x421D,\n    0x7BE1, 0x7BE1, 0x055E, 0x7BE2, 0x7BE3, 0x4220, 0x7BE4, 0x7BE4, 0x25E3,\n    0x7BE5, 0x7BE6, 0x1C96, 0x7BE7, 0x7BE8, 0x4222, 0x7BE9, 0x7BE9, 0x2111,\n    0x7BEA, 0x7BEA, 0x1C98, 0x7BEB, 0x7BED, 0x4224, 0x7BEE, 0x7BEE, 0x09A5,\n    0x7BEF, 0x7BF0, 0x4227, 0x7BF1, 0x7BF1, 0x09D4, 0x7BF2, 0x7BF2, 0x4229,\n    0x7BF3, 0x7BF3, 0x25E6, 0x7BF4, 0x7BF6, 0x422A, 0x7BF7, 0x7BF7, 0x0BB2,\n    0x7BF8, 0x7BFB, 0x422D, 0x7BFC, 0x7BFC, 0x1C9B, 0x7BFD, 0x7BFD, 0x4231,\n    0x7BFE, 0x7BFE, 0x1C9A, 0x7BFF, 0x7BFF, 0x4232, 0x7C00, 0x7C00, 0x25E7,\n    0x7C01, 0x7C06, 0x4233, 0x7C07, 0x7C07, 0x055B, 0x7C08, 0x7C0A, 0x4239,\n    0x7C0B, 0x7C0B, 0x1C9E, 0x7C0C, 0x7C0C, 0x1C99, 0x7C0D, 0x7C0D, 0x2041,\n    0x7C0E, 0x7C0E, 0x423C, 0x7C0F, 0x7C0F, 0x1C9C, 0x7C10, 0x7C15, 0x423D,\n    0x7C16, 0x7C16, 0x1C9D, 0x7C17, 0x7C1D, 0x4243, 0x7C1E, 0x7C1E, 0x25EA,\n    0x7C1F, 0x7C1F, 0x1C9F, 0x7C20, 0x7C20, 0x424A, 0x7C21, 0x7C21, 0x1F8F,\n    0x7C22, 0x7C22, 0x424B, 0x7C23, 0x7C23, 0x25EC, 0x7C24, 0x7C25, 0x424C,\n    0x7C26, 0x7C26, 0x1CA1, 0x7C27, 0x7C27, 0x07DE, 0x7C28, 0x7C29, 0x424E,\n    0x7C2A, 0x7C2A, 0x1CA0, 0x7C2B, 0x7C2B, 0x25EB, 0x7C2C, 0x7C37, 0x4250,\n    0x7C38, 0x7C38, 0x1CA2, 0x7C39, 0x7C3C, 0x425C, 0x7C3D, 0x7C3D, 0x20D0,\n    0x7C3E, 0x7C3E, 0x201D, 0x7C3F, 0x7C3F, 0x0485, 0x7C40, 0x7C40, 0x1CA4,\n    0x7C41, 0x7C41, 0x1CA3, 0x7C42, 0x7C42, 0x4260, 0x7C43, 0x7C43, 0x1FF7,\n    0x7C44, 0x7C4B, 0x4261, 0x7C4C, 0x7C4C, 0x1E8D, 0x7C4D, 0x7C4D, 0x0821,\n    0x7C4E, 0x7C5B, 0x4269, 0x7C5C, 0x7C5C, 0x25E9, 0x7C5D, 0x7C5E, 0x4277,\n    0x7C5F, 0x7C5F, 0x25EE, 0x7C60, 0x7C60, 0x203A, 0x7C61, 0x7C63, 0x4279,\n    0x7C64, 0x7C64, 0x2693, 0x7C65, 0x7C68, 0x427C, 0x7C69, 0x7C69, 0x25E5,\n    0x7C6A, 0x7C6A, 0x25ED, 0x7C6B, 0x7C6B, 0x4280, 0x7C6C, 0x7C6C, 0x2009,\n    0x7C6D, 0x7C6D, 0x4281, 0x7C6E, 0x7C6E, 0x2065, 0x7C6F, 0x7C71, 0x4282,\n    0x7C72, 0x7C72, 0x26A3, 0x7C73, 0x7C73, 0x0ADC, 0x7C74, 0x7C74, 0x12F5,\n    0x7C75, 0x7C7A, 0x4285, 0x7C7B, 0x7C7B, 0x09CB, 0x7C7C, 0x7C7C, 0x1CCA,\n    0x7C7D, 0x7C7D, 0x122E, 0x7C7E, 0x7C88, 0x428B, 0x7C89, 0x7C89, 0x0678,\n    0x7C8A, 0x7C90, 0x4296, 0x7C91, 0x7C91, 0x1CCC, 0x7C92, 0x7C92, 0x09EC,\n    0x7C93, 0x7C94, 0x429D, 0x7C95, 0x7C95, 0x0BE8, 0x7C96, 0x7C96, 0x429F,\n    0x7C97, 0x7C97, 0x0559, 0x7C98, 0x7C98, 0x1154, 0x7C99, 0x7C9B, 0x42A0,\n    0x7C9C, 0x7C9C, 0x1CCE, 0x7C9D, 0x7C9D, 0x1CCD, 0x7C9E, 0x7C9E, 0x1CCF,\n    0x7C9F, 0x7C9F, 0x0DCF, 0x7CA0, 0x7CA1, 0x42A3, 0x7CA2, 0x7CA2, 0x1CD0,\n    0x7CA3, 0x7CA3, 0x42A5, 0x7CA4, 0x7CA4, 0x1104, 0x7CA5, 0x7CA5, 0x11DF,\n    0x7CA6, 0x7CA9, 0x42A6, 0x7CAA, 0x7CAA, 0x067D, 0x7CAB, 0x7CAD, 0x42AA,\n    0x7CAE, 0x7CAE, 0x0A01, 0x7CAF, 0x7CB0, 0x42AD, 0x7CB1, 0x7CB1, 0x0A04,\n    0x7CB2, 0x7CB2, 0x1CD1, 0x7CB3, 0x7CB3, 0x08DB, 0x7CB4, 0x7CB8, 0x42AF,\n    0x7CB9, 0x7CB9, 0x0565, 0x7CBA, 0x7CBB, 0x42B4, 0x7CBC, 0x7CBD, 0x1CD2,\n    0x7CBE, 0x7CBE, 0x08DA, 0x7CBF, 0x7CC0, 0x42B6, 0x7CC1, 0x7CC1, 0x1CD4,\n    0x7CC2, 0x7CC4, 0x42B8, 0x7CC5, 0x7CC5, 0x1CD9, 0x7CC6, 0x7CC6, 0x42BB,\n    0x7CC7, 0x7CC7, 0x1CD5, 0x7CC8, 0x7CC8, 0x1CD8, 0x7CC9, 0x7CC9, 0x42BC,\n    0x7CCA, 0x7CCA, 0x07B4, 0x7CCB, 0x7CCB, 0x42BD, 0x7CCC, 0x7CCD, 0x1CD6,\n    0x7CCE, 0x7CD4, 0x42BE, 0x7CD5, 0x7CD5, 0x06DD, 0x7CD6, 0x7CD6, 0x0E1A,\n    0x7CD7, 0x7CD7, 0x1CDA, 0x7CD8, 0x7CD8, 0x42C5, 0x7CD9, 0x7CD9, 0x04A1,\n    0x7CDA, 0x7CDB, 0x42C6, 0x7CDC, 0x7CDC, 0x0AD8, 0x7CDD, 0x7CDD, 0x25F5,\n    0x7CDE, 0x7CDE, 0x1EFC, 0x7CDF, 0x7CDF, 0x1126, 0x7CE0, 0x7CE0, 0x0944,\n    0x7CE1, 0x7CE6, 0x42C8, 0x7CE7, 0x7CE7, 0x2024, 0x7CE8, 0x7CE8, 0x1CDB,\n    0x7CE9, 0x7CEE, 0x42CE, 0x7CEF, 0x7CEF, 0x0B75, 0x7CF0, 0x7CF0, 0x269B,\n    0x7CF1, 0x7CF1, 0x42D4, 0x7CF2, 0x7CF2, 0x25F3, 0x7CF3, 0x7CF3, 0x42D5,\n    0x7CF4, 0x7CF4, 0x22D9, 0x7CF5, 0x7CF5, 0x42D6, 0x7CF6, 0x7CF6, 0x25F4,\n    0x7CF7, 0x7CF7, 0x42D7, 0x7CF8, 0x7CF8, 0x1CE7, 0x7CF9, 0x7CF9, 0x241B,\n    0x7CFA, 0x7CFA, 0x42D8, 0x7CFB, 0x7CFB, 0x0F22, 0x7CFC, 0x7CFD, 0x42D9,\n    0x7CFE, 0x7CFE, 0x1FC8, 0x7CFF, 0x7CFF, 0x42DB, 0x7D00, 0x7D00, 0x1F7B,\n    0x7D01, 0x7D01, 0x42DC, 0x7D02, 0x7D02, 0x241D, 0x7D03, 0x7D03, 0x42DD,\n    0x7D04, 0x7D04, 0x224C, 0x7D05, 0x7D05, 0x1F48, 0x7D06, 0x7D06, 0x241C,\n    0x7D07, 0x7D08, 0x241E, 0x7D09, 0x7D09, 0x20FF, 0x7D0A, 0x7D0A, 0x0ED8,\n    0x7D0B, 0x7D0B, 0x219A, 0x7D0C, 0x7D0C, 0x42DE, 0x7D0D, 0x7D0D, 0x2091,\n    0x7D0E, 0x7D0F, 0x42DF, 0x7D10, 0x7D10, 0x20A7, 0x7D11, 0x7D12, 0x42E1,\n    0x7D13, 0x7D13, 0x2423, 0x7D14, 0x7D14, 0x1E9B, 0x7D15, 0x7D15, 0x2422,\n    0x7D16, 0x7D16, 0x42E3, 0x7D17, 0x7D17, 0x2110, 0x7D18, 0x7D18, 0x42E4,\n    0x7D19, 0x7D19, 0x228D, 0x7D1A, 0x7D1A, 0x1F71, 0x7D1B, 0x7D1B, 0x1EF8,\n    0x7D1C, 0x7D1C, 0x2421, 0x7D1D, 0x7D1F, 0x42E5, 0x7D20, 0x7D20, 0x0DCD,\n    0x7D21, 0x7D21, 0x1EF3, 0x7D22, 0x7D22, 0x0DEC, 0x7D23, 0x7D26, 0x42E8,\n    0x7D27, 0x7D27, 0x08C5, 0x7D28, 0x7D2A, 0x42EC, 0x7D2B, 0x7D2B, 0x122C,\n    0x7D2C, 0x7D2E, 0x42EF, 0x7D2F, 0x7D2F, 0x09C6, 0x7D30, 0x7D30, 0x21B1,\n    0x7D31, 0x7D31, 0x2426, 0x7D32, 0x7D32, 0x2425, 0x7D33, 0x7D33, 0x2120,\n    0x7D34, 0x7D38, 0x42F2, 0x7D39, 0x7D39, 0x211A, 0x7D3A, 0x7D3A, 0x2424,\n    0x7D3B, 0x7D3B, 0x42F7, 0x7D3C, 0x7D3C, 0x2428, 0x7D3D, 0x7D3E, 0x42F8,\n    0x7D3F, 0x7D3F, 0x242A, 0x7D40, 0x7D40, 0x2429, 0x7D41, 0x7D41, 0x42FA,\n    0x7D42, 0x7D42, 0x2294, 0x7D43, 0x7D43, 0x42FB, 0x7D44, 0x7D44, 0x22BE,\n    0x7D45, 0x7D45, 0x42FC, 0x7D46, 0x7D46, 0x1E31, 0x7D47, 0x7D4D, 0x42FD,\n    0x7D4E, 0x7D4E, 0x242C, 0x7D4F, 0x7D4F, 0x4304, 0x7D50, 0x7D50, 0x1FB5,\n    0x7D51, 0x7D5C, 0x4305, 0x7D5D, 0x7D5D, 0x242B, 0x7D5E, 0x7D5E, 0x1FAF,\n    0x7D5F, 0x7D60, 0x4311, 0x7D61, 0x7D61, 0x2068, 0x7D62, 0x7D62, 0x21E4,\n    0x7D63, 0x7D65, 0x4313, 0x7D66, 0x7D66, 0x1F21, 0x7D67, 0x7D67, 0x4316,\n    0x7D68, 0x7D68, 0x2101, 0x7D69, 0x7D6D, 0x4317, 0x7D6E, 0x7D6E, 0x0FC0,\n    0x7D6F, 0x7D70, 0x431C, 0x7D71, 0x7D71, 0x217C, 0x7D72, 0x7D72, 0x214A,\n    0x7D73, 0x7D73, 0x242D, 0x7D74, 0x7D75, 0x431E, 0x7D76, 0x7D76, 0x1FD4,\n    0x7D77, 0x7D77, 0x1CE8, 0x7D78, 0x7D78, 0x4320, 0x7D79, 0x7D79, 0x1FD1,\n    0x7D7A, 0x7D80, 0x4321, 0x7D81, 0x7D81, 0x1E33, 0x7D82, 0x7D82, 0x4328,\n    0x7D83, 0x7D83, 0x242F, 0x7D84, 0x7D85, 0x4329, 0x7D86, 0x7D86, 0x242E,\n    0x7D87, 0x7D87, 0x432B, 0x7D88, 0x7D88, 0x2430, 0x7D89, 0x7D89, 0x21DB,\n    0x7D8A, 0x7D8E, 0x432C, 0x7D8F, 0x7D8F, 0x2158, 0x7D90, 0x7D92, 0x4331,\n    0x7D93, 0x7D93, 0x1FC2, 0x7D94, 0x7D9B, 0x4334, 0x7D9C, 0x7D9C, 0x22B9,\n    0x7D9D, 0x7D9D, 0x433C, 0x7D9E, 0x7D9E, 0x2436, 0x7D9F, 0x7DA1, 0x433D,\n    0x7DA2, 0x7DA2, 0x1E8E, 0x7DA3, 0x7DA3, 0x2439, 0x7DA4, 0x7DA5, 0x4340,\n    0x7DA6, 0x7DA6, 0x1CE9, 0x7DA7, 0x7DAA, 0x4342, 0x7DAB, 0x7DAB, 0x21C5,\n    0x7DAC, 0x7DAC, 0x2437, 0x7DAD, 0x7DAD, 0x2192, 0x7DAE, 0x7DAE, 0x1CEA,\n    0x7DAF, 0x7DAF, 0x4346, 0x7DB0, 0x7DB0, 0x243A, 0x7DB1, 0x7DB1, 0x1F19,\n    0x7DB2, 0x7DB2, 0x218C, 0x7DB3, 0x7DB3, 0x1E40, 0x7DB4, 0x7DB4, 0x22B3,\n    0x7DB5, 0x7DB7, 0x4347, 0x7DB8, 0x7DB8, 0x205F, 0x7DB9, 0x7DB9, 0x2438,\n    0x7DBA, 0x7DBA, 0x2432, 0x7DBB, 0x7DBB, 0x2274, 0x7DBC, 0x7DBC, 0x434A,\n    0x7DBD, 0x7DBD, 0x1E9C, 0x7DBE, 0x7DBE, 0x2431, 0x7DBF, 0x7DBF, 0x2085,\n    0x7DC0, 0x7DC3, 0x434B, 0x7DC4, 0x7DC4, 0x2435, 0x7DC5, 0x7DC6, 0x434F,\n    0x7DC7, 0x7DC7, 0x243B, 0x7DC8, 0x7DC9, 0x4351, 0x7DCA, 0x7DCA, 0x1FB7,\n    0x7DCB, 0x7DCB, 0x2433, 0x7DCC, 0x7DD0, 0x4353, 0x7DD1, 0x7DD1, 0x2054,\n    0x7DD2, 0x7DD2, 0x21DE, 0x7DD3, 0x7DD3, 0x4358, 0x7DD4, 0x7DD4, 0x2434,\n    0x7DD5, 0x7DD6, 0x4359, 0x7DD7, 0x7DD7, 0x243D, 0x7DD8, 0x7DD8, 0x1F89,\n    0x7DD9, 0x7DD9, 0x243C, 0x7DDA, 0x7DDC, 0x435B, 0x7DDD, 0x7DDD, 0x1F6E,\n    0x7DDE, 0x7DDE, 0x1ED8, 0x7DDF, 0x7DDF, 0x435E, 0x7DE0, 0x7DE0, 0x1EBF,\n    0x7DE1, 0x7DE1, 0x2445, 0x7DE2, 0x7DE2, 0x435F, 0x7DE3, 0x7DE3, 0x2249,\n    0x7DE4, 0x7DE5, 0x4360, 0x7DE6, 0x7DE6, 0x2441, 0x7DE7, 0x7DE7, 0x4362,\n    0x7DE8, 0x7DE8, 0x1E47, 0x7DE9, 0x7DE9, 0x1F56, 0x7DEA, 0x7DEB, 0x4363,\n    0x7DEC, 0x7DEC, 0x2086, 0x7DED, 0x7DEE, 0x4365, 0x7DEF, 0x7DEF, 0x2196,\n    0x7DF0, 0x7DF0, 0x4367, 0x7DF1, 0x7DF1, 0x2443, 0x7DF2, 0x7DF2, 0x243F,\n    0x7DF3, 0x7DF3, 0x4368, 0x7DF4, 0x7DF4, 0x2023, 0x7DF5, 0x7DF5, 0x4369,\n    0x7DF6, 0x7DF6, 0x2442, 0x7DF7, 0x7DF8, 0x436A, 0x7DF9, 0x7DF9, 0x243E,\n    0x7DFA, 0x7DFA, 0x436C, 0x7DFB, 0x7DFB, 0x26A6, 0x7DFC, 0x7DFF, 0x436D,\n    0x7E00, 0x7E07, 0x4371, 0x7E08, 0x7E08, 0x234E, 0x7E09, 0x7E09, 0x2446,\n    0x7E0A, 0x7E0A, 0x244B, 0x7E0B, 0x7E0B, 0x2444, 0x7E0C, 0x7E0F, 0x4379,\n    0x7E10, 0x7E10, 0x2427, 0x7E11, 0x7E11, 0x244C, 0x7E12, 0x7E1A, 0x437D,\n    0x7E1B, 0x7E1B, 0x1F0F, 0x7E1C, 0x7E1C, 0x4386, 0x7E1D, 0x7E1D, 0x2447,\n    0x7E1E, 0x7E1E, 0x2449, 0x7E1F, 0x7E1F, 0x2448, 0x7E20, 0x7E22, 0x4387,\n    0x7E23, 0x7E23, 0x21C2, 0x7E24, 0x7E26, 0x438A, 0x7E27, 0x7E27, 0x216E,\n    0x7E28, 0x7E2A, 0x438D, 0x7E2B, 0x7E2B, 0x1F03, 0x7E2C, 0x7E2C, 0x4390,\n    0x7E2D, 0x7E2D, 0x244A, 0x7E2E, 0x7E2E, 0x215C, 0x7E2F, 0x7E30, 0x4391,\n    0x7E31, 0x7E31, 0x22BB, 0x7E32, 0x7E32, 0x2450, 0x7E33, 0x7E33, 0x4393,\n    0x7E34, 0x7E34, 0x2694, 0x7E35, 0x7E35, 0x244F, 0x7E36, 0x7E36, 0x25F6,\n    0x7E37, 0x7E37, 0x2051, 0x7E38, 0x7E38, 0x4394, 0x7E39, 0x7E39, 0x244E,\n    0x7E3A, 0x7E3A, 0x4395, 0x7E3B, 0x7E3B, 0x1DFB, 0x7E3C, 0x7E3C, 0x4396,\n    0x7E3D, 0x7E3D, 0x22BA, 0x7E3E, 0x7E3E, 0x1F6D, 0x7E3F, 0x7E40, 0x4397,\n    0x7E41, 0x7E41, 0x064E, 0x7E42, 0x7E44, 0x4399, 0x7E45, 0x7E45, 0x2452,\n    0x7E46, 0x7E46, 0x2451, 0x7E47, 0x7E47, 0x1CEB, 0x7E48, 0x7E51, 0x439C,\n    0x7E52, 0x7E52, 0x2455, 0x7E53, 0x7E53, 0x43A6, 0x7E54, 0x7E54, 0x2289,\n    0x7E55, 0x7E55, 0x2116, 0x7E56, 0x7E59, 0x43A7, 0x7E5A, 0x7E5A, 0x2454,\n    0x7E5B, 0x7E5D, 0x43AB, 0x7E5E, 0x7E5E, 0x20FB, 0x7E5F, 0x7E61, 0x43AE,\n    0x7E62, 0x7E62, 0x2440, 0x7E63, 0x7E68, 0x43B1, 0x7E69, 0x7E69, 0x2126,\n    0x7E6A, 0x7E6A, 0x1F61, 0x7E6B, 0x7E6B, 0x269D, 0x7E6C, 0x7E6C, 0x43B7,\n    0x7E6D, 0x7E6D, 0x1F8A, 0x7E6E, 0x7E6E, 0x2456, 0x7E6F, 0x7E6F, 0x2459,\n    0x7E70, 0x7E70, 0x2458, 0x7E71, 0x7E72, 0x43B8, 0x7E73, 0x7E73, 0x1FAE,\n    0x7E74, 0x7E78, 0x43BA, 0x7E79, 0x7E79, 0x221A, 0x7E7A, 0x7E7B, 0x43BF,\n    0x7E7C, 0x7E7C, 0x1F7A, 0x7E7D, 0x7E7D, 0x244D, 0x7E7E, 0x7E7E, 0x2457,\n    0x7E7F, 0x7E81, 0x43C1, 0x7E82, 0x7E82, 0x1248, 0x7E83, 0x7E87, 0x43C4,\n    0x7E88, 0x7E88, 0x2453, 0x7E89, 0x7E89, 0x43C9, 0x7E8A, 0x7E8A, 0x2420,\n    0x7E8B, 0x7E8B, 0x43CA, 0x7E8C, 0x7E8C, 0x21DF, 0x7E8D, 0x7E8D, 0x2685,\n    0x7E8E, 0x7E8E, 0x43CB, 0x7E8F, 0x7E8F, 0x1E6E, 0x7E90, 0x7E92, 0x43CC,\n    0x7E93, 0x7E93, 0x2224, 0x7E94, 0x7E94, 0x2670, 0x7E95, 0x7E95, 0x43CF,\n    0x7E96, 0x7E96, 0x21BA, 0x7E97, 0x7E97, 0x43D0, 0x7E98, 0x7E98, 0x245A,\n    0x7E99, 0x7E9A, 0x43D1, 0x7E9B, 0x7E9B, 0x1CEC, 0x7E9C, 0x7E9C, 0x1FFF,\n    0x7E9D, 0x7E9E, 0x43D3, 0x7E9F, 0x7E9F, 0x17D3, 0x7EA0, 0x7EA0, 0x08EF,\n    0x7EA1, 0x7EA1, 0x17D4, 0x7EA2, 0x7EA2, 0x07A3, 0x7EA3, 0x7EA3, 0x17D5,\n    0x7EA4, 0x7EA4, 0x0F38, 0x7EA5, 0x7EA5, 0x17D6, 0x7EA6, 0x7EA6, 0x10FF,\n    0x7EA7, 0x7EA7, 0x0829, 0x7EA8, 0x7EA9, 0x17D7, 0x7EAA, 0x7EAA, 0x0840,\n    0x7EAB, 0x7EAB, 0x0CAD, 0x7EAC, 0x7EAC, 0x0EC2, 0x7EAD, 0x7EAD, 0x17D9,\n    0x7EAE, 0x7EAE, 0x43D5, 0x7EAF, 0x7EAF, 0x0542, 0x7EB0, 0x7EB0, 0x17DA,\n    0x7EB1, 0x7EB1, 0x0CED, 0x7EB2, 0x7EB2, 0x06D4, 0x7EB3, 0x7EB3, 0x0B2C,\n    0x7EB4, 0x7EB4, 0x43D6, 0x7EB5, 0x7EB5, 0x123A, 0x7EB6, 0x7EB6, 0x0A81,\n    0x7EB7, 0x7EB7, 0x0674, 0x7EB8, 0x7EB8, 0x11BC, 0x7EB9, 0x7EB9, 0x0ED5,\n    0x7EBA, 0x7EBA, 0x0661, 0x7EBB, 0x7EBC, 0x43D7, 0x7EBD, 0x7EBD, 0x0B67,\n    0x7EBE, 0x7EBE, 0x17DB, 0x7EBF, 0x7EBF, 0x0F4C, 0x7EC0, 0x7EC2, 0x17DC,\n    0x7EC3, 0x7EC3, 0x0A00, 0x7EC4, 0x7EC4, 0x1246, 0x7EC5, 0x7EC5, 0x0D29,\n    0x7EC6, 0x7EC6, 0x0F25, 0x7EC7, 0x7EC7, 0x11AE, 0x7EC8, 0x7EC8, 0x11D4,\n    0x7EC9, 0x7EC9, 0x17DF, 0x7ECA, 0x7ECA, 0x03F8, 0x7ECB, 0x7ECC, 0x17E0,\n    0x7ECD, 0x7ECD, 0x0D15, 0x7ECE, 0x7ECE, 0x1076, 0x7ECF, 0x7ECF, 0x08DC,\n    0x7ED0, 0x7ED0, 0x17E2, 0x7ED1, 0x7ED1, 0x03FE, 0x7ED2, 0x7ED2, 0x0CB9,\n    0x7ED3, 0x7ED3, 0x08B2, 0x7ED4, 0x7ED4, 0x17E3, 0x7ED5, 0x7ED5, 0x0CA1,\n    0x7ED6, 0x7ED6, 0x43D9, 0x7ED7, 0x7ED7, 0x17E4, 0x7ED8, 0x7ED8, 0x07FB,\n    0x7ED9, 0x7ED9, 0x06F3, 0x7EDA, 0x7EDA, 0x0FCD, 0x7EDB, 0x7EDB, 0x17E5,\n    0x7EDC, 0x7EDC, 0x0A8E, 0x7EDD, 0x7EDD, 0x0927, 0x7EDE, 0x7EDE, 0x089B,\n    0x7EDF, 0x7EDF, 0x0E64, 0x7EE0, 0x7EE1, 0x17E6, 0x7EE2, 0x7EE2, 0x091D,\n    0x7EE3, 0x7EE3, 0x0FB0, 0x7EE4, 0x7EE4, 0x43DA, 0x7EE5, 0x7EE5, 0x0DDC,\n    0x7EE6, 0x7EE6, 0x0E23, 0x7EE7, 0x7EE7, 0x083F, 0x7EE8, 0x7EE8, 0x17E8,\n    0x7EE9, 0x7EE9, 0x081B, 0x7EEA, 0x7EEA, 0x0FC2, 0x7EEB, 0x7EEB, 0x17E9,\n    0x7EEC, 0x7EEC, 0x43DB, 0x7EED, 0x7EED, 0x0FC3, 0x7EEE, 0x7EEF, 0x17EA,\n    0x7EF0, 0x7EF0, 0x0545, 0x7EF1, 0x7EF2, 0x17EC, 0x7EF3, 0x7EF3, 0x0D37,\n    0x7EF4, 0x7EF4, 0x0EBB, 0x7EF5, 0x7EF5, 0x0AE5, 0x7EF6, 0x7EF6, 0x17EF,\n    0x7EF7, 0x7EF7, 0x042A, 0x7EF8, 0x7EF8, 0x0516, 0x7EF9, 0x7EF9, 0x43DC,\n    0x7EFA, 0x7EFB, 0x17F0, 0x7EFC, 0x7EFC, 0x1238, 0x7EFD, 0x7EFD, 0x1161,\n    0x7EFE, 0x7EFE, 0x17F2, 0x7EFF, 0x7EFF, 0x0A73, 0x7F00, 0x7F00, 0x1217,\n    0x7F01, 0x7F03, 0x17F3, 0x7F04, 0x7F04, 0x085D, 0x7F05, 0x7F05, 0x0AEA,\n    0x7F06, 0x7F06, 0x09AD, 0x7F07, 0x7F08, 0x17F6, 0x7F09, 0x7F09, 0x081C,\n    0x7F0A, 0x7F0A, 0x43DD, 0x7F0B, 0x7F0C, 0x17F8, 0x7F0D, 0x7F0D, 0x17EE,\n    0x7F0E, 0x7F0E, 0x060F, 0x7F0F, 0x7F0F, 0x17FA, 0x7F10, 0x7F10, 0x43DE,\n    0x7F11, 0x7F12, 0x17FB, 0x7F13, 0x7F13, 0x07CF, 0x7F14, 0x7F14, 0x05BF,\n    0x7F15, 0x7F15, 0x0A6D, 0x7F16, 0x7F16, 0x0449, 0x7F17, 0x7F17, 0x17FD,\n    0x7F18, 0x7F18, 0x10F8, 0x7F19, 0x7F19, 0x17FE, 0x7F1A, 0x7F1A, 0x06BA,\n    0x7F1B, 0x7F1B, 0x1800, 0x7F1C, 0x7F1C, 0x17FF, 0x7F1D, 0x7F1D, 0x0689,\n    0x7F1E, 0x7F1E, 0x43DF, 0x7F1F, 0x7F1F, 0x1801, 0x7F20, 0x7F20, 0x04BF,\n    0x7F21, 0x7F27, 0x1802, 0x7F28, 0x7F28, 0x108C, 0x7F29, 0x7F29, 0x0DEA,\n    0x7F2A, 0x7F2D, 0x1809, 0x7F2E, 0x7F2E, 0x0D02, 0x7F2F, 0x7F33, 0x180D,\n    0x7F34, 0x7F34, 0x089A, 0x7F35, 0x7F35, 0x1812, 0x7F36, 0x7F36, 0x1C5E,\n    0x7F37, 0x7F37, 0x43E0, 0x7F38, 0x7F38, 0x06D2, 0x7F39, 0x7F39, 0x43E1,\n    0x7F3A, 0x7F3A, 0x0C8C, 0x7F3B, 0x7F41, 0x43E2, 0x7F42, 0x7F42, 0x1C5F,\n    0x7F43, 0x7F43, 0x43E9, 0x7F44, 0x7F45, 0x1C60, 0x7F46, 0x7F4B, 0x43EA,\n    0x7F4C, 0x7F4C, 0x25E2, 0x7F4D, 0x7F4D, 0x43F0, 0x7F4E, 0x7F4E, 0x269A,\n    0x7F4F, 0x7F4F, 0x43F1, 0x7F50, 0x7F50, 0x0737, 0x7F51, 0x7F51, 0x0EA9,\n    0x7F52, 0x7F53, 0x43F2, 0x7F54, 0x7F54, 0x129E, 0x7F55, 0x7F55, 0x0768,\n    0x7F56, 0x7F56, 0x43F4, 0x7F57, 0x7F57, 0x0A85, 0x7F58, 0x7F58, 0x1A81,\n    0x7F59, 0x7F59, 0x43F5, 0x7F5A, 0x7F5A, 0x0640, 0x7F5B, 0x7F5E, 0x43F6,\n    0x7F5F, 0x7F5F, 0x1A83, 0x7F60, 0x7F60, 0x43FA, 0x7F61, 0x7F61, 0x1A82,\n    0x7F62, 0x7F62, 0x03E0, 0x7F63, 0x7F67, 0x43FB, 0x7F68, 0x7F68, 0x1A85,\n    0x7F69, 0x7F69, 0x1177, 0x7F6A, 0x7F6A, 0x124C, 0x7F6B, 0x7F6D, 0x4400,\n    0x7F6E, 0x7F6E, 0x11C2, 0x7F6F, 0x7F6F, 0x4403, 0x7F70, 0x7F70, 0x1EEA,\n    0x7F71, 0x7F71, 0x1A87, 0x7F72, 0x7F72, 0x0D87, 0x7F73, 0x7F73, 0x4404,\n    0x7F74, 0x7F74, 0x1A86, 0x7F75, 0x7F76, 0x4405, 0x7F77, 0x7F77, 0x1E2C,\n    0x7F78, 0x7F78, 0x4407, 0x7F79, 0x7F79, 0x1A88, 0x7F7A, 0x7F7D, 0x4408,\n    0x7F7E, 0x7F7E, 0x1A8A, 0x7F7F, 0x7F80, 0x440C, 0x7F81, 0x7F81, 0x1A89,\n    0x7F82, 0x7F84, 0x440E, 0x7F85, 0x7F85, 0x2062, 0x7F86, 0x7F86, 0x24F1,\n    0x7F87, 0x7F87, 0x4411, 0x7F88, 0x7F88, 0x24F2, 0x7F89, 0x7F89, 0x4412,\n    0x7F8A, 0x7F8A, 0x101B, 0x7F8B, 0x7F8B, 0x4413, 0x7F8C, 0x7F8C, 0x0C39,\n    0x7F8D, 0x7F8D, 0x4414, 0x7F8E, 0x7F8E, 0x0AC5, 0x7F8F, 0x7F93, 0x4415,\n    0x7F94, 0x7F94, 0x06DC, 0x7F95, 0x7F99, 0x441A, 0x7F9A, 0x7F9A, 0x0A30,\n    0x7F9B, 0x7F9C, 0x441F, 0x7F9D, 0x7F9D, 0x1CC4, 0x7F9E, 0x7F9E, 0x0FAA,\n    0x7F9F, 0x7F9F, 0x1CC5, 0x7FA0, 0x7FA0, 0x4421, 0x7FA1, 0x7FA1, 0x0F48,\n    0x7FA2, 0x7FA3, 0x4422, 0x7FA4, 0x7FA4, 0x0C95, 0x7FA5, 0x7FA5, 0x25F2,\n    0x7FA6, 0x7FA6, 0x4424, 0x7FA7, 0x7FA7, 0x1CC6, 0x7FA8, 0x7FA8, 0x4425,\n    0x7FA9, 0x7FA9, 0x2215, 0x7FAA, 0x7FAE, 0x4426, 0x7FAF, 0x7FB0, 0x1CC7,\n    0x7FB1, 0x7FB1, 0x442B, 0x7FB2, 0x7FB2, 0x1CC9, 0x7FB3, 0x7FB7, 0x442C,\n    0x7FB8, 0x7FB8, 0x130E, 0x7FB9, 0x7FB9, 0x06F9, 0x7FBA, 0x7FBB, 0x4431,\n    0x7FBC, 0x7FBC, 0x176D, 0x7FBD, 0x7FBD, 0x10D5, 0x7FBE, 0x7FBE, 0x4433,\n    0x7FBF, 0x7FBF, 0x1CDE, 0x7FC0, 0x7FC0, 0x4434, 0x7FC1, 0x7FC1, 0x0EDB,\n    0x7FC2, 0x7FC4, 0x4435, 0x7FC5, 0x7FC5, 0x0506, 0x7FC6, 0x7FC9, 0x4438,\n    0x7FCA, 0x7FCA, 0x1B98, 0x7FCB, 0x7FCB, 0x443C, 0x7FCC, 0x7FCC, 0x1075,\n    0x7FCD, 0x7FCD, 0x443D, 0x7FCE, 0x7FCE, 0x1CDF, 0x7FCF, 0x7FD1, 0x443E,\n    0x7FD2, 0x7FD2, 0x21AE, 0x7FD3, 0x7FD3, 0x4441, 0x7FD4, 0x7FD4, 0x0F55,\n    0x7FD5, 0x7FD5, 0x1CE0, 0x7FD6, 0x7FD7, 0x4442, 0x7FD8, 0x7FD8, 0x0C49,\n    0x7FD9, 0x7FDE, 0x4444, 0x7FDF, 0x7FDF, 0x05B5, 0x7FE0, 0x7FE0, 0x0567,\n    0x7FE1, 0x7FE1, 0x1CE2, 0x7FE2, 0x7FE4, 0x444A, 0x7FE5, 0x7FE5, 0x1CE1,\n    0x7FE6, 0x7FE6, 0x1CE3, 0x7FE7, 0x7FE8, 0x444D, 0x7FE9, 0x7FE9, 0x1CE4,\n    0x7FEA, 0x7FED, 0x444F, 0x7FEE, 0x7FEE, 0x1CE5, 0x7FEF, 0x7FEF, 0x4453,\n    0x7FF0, 0x7FF0, 0x0769, 0x7FF1, 0x7FF1, 0x03CA, 0x7FF2, 0x7FF2, 0x4454,\n    0x7FF3, 0x7FF3, 0x1CE6, 0x7FF4, 0x7FF8, 0x4455, 0x7FF9, 0x7FF9, 0x20E0,\n    0x7FFA, 0x7FFA, 0x445A, 0x7FFB, 0x7FFB, 0x064A, 0x7FFC, 0x7FFC, 0x1074,\n    0x7FFD, 0x7FFF, 0x445B, 0x8000, 0x8000, 0x1032, 0x8001, 0x8001, 0x09BA,\n    0x8002, 0x8002, 0x445E, 0x8003, 0x8003, 0x0949, 0x8004, 0x8004, 0x1953,\n    0x8005, 0x8005, 0x1180, 0x8006, 0x8006, 0x191A, 0x8007, 0x800A, 0x445F,\n    0x800B, 0x800B, 0x1BD7, 0x800C, 0x800C, 0x0637, 0x800D, 0x800D, 0x0D98,\n    0x800E, 0x800F, 0x4463, 0x8010, 0x8010, 0x0B30, 0x8011, 0x8011, 0x4465,\n    0x8012, 0x8012, 0x1BCB, 0x8013, 0x8013, 0x4466, 0x8014, 0x8014, 0x1BCC,\n    0x8015, 0x8015, 0x06F6, 0x8016, 0x8016, 0x1BCD, 0x8017, 0x8017, 0x077B,\n    0x8018, 0x8018, 0x1108, 0x8019, 0x8019, 0x03DD, 0x801A, 0x801B, 0x4467,\n    0x801C, 0x801C, 0x1BCE, 0x801D, 0x801F, 0x4469, 0x8020, 0x8020, 0x1BCF,\n    0x8021, 0x8021, 0x446C, 0x8022, 0x8022, 0x1BD0, 0x8023, 0x8024, 0x446D,\n    0x8025, 0x8027, 0x1BD1, 0x8028, 0x8028, 0x1BD5, 0x8029, 0x8029, 0x1BD4,\n    0x802A, 0x802A, 0x0B96, 0x802B, 0x802B, 0x446F, 0x802C, 0x802C, 0x25C2,\n    0x802D, 0x802D, 0x4470, 0x802E, 0x802E, 0x25C1, 0x802F, 0x8030, 0x4471,\n    0x8031, 0x8031, 0x1BD6, 0x8032, 0x8032, 0x4473, 0x8033, 0x8033, 0x0639,\n    0x8034, 0x8034, 0x4474, 0x8035, 0x8035, 0x1BD8, 0x8036, 0x8036, 0x1035,\n    0x8037, 0x8037, 0x14B1, 0x8038, 0x8038, 0x0DBF, 0x8039, 0x803A, 0x4475,\n    0x803B, 0x803B, 0x0501, 0x803C, 0x803C, 0x4477, 0x803D, 0x803D, 0x0583,\n    0x803E, 0x803E, 0x4478, 0x803F, 0x803F, 0x06FB, 0x8040, 0x8041, 0x4479,\n    0x8042, 0x8042, 0x0B57, 0x8043, 0x8043, 0x1BD9, 0x8044, 0x8045, 0x447B,\n    0x8046, 0x8046, 0x1BDA, 0x8047, 0x8049, 0x447D, 0x804A, 0x804A, 0x0A0D,\n    0x804B, 0x804B, 0x0A44, 0x804C, 0x804C, 0x11AF, 0x804D, 0x804D, 0x1BDB,\n    0x804E, 0x8051, 0x4480, 0x8052, 0x8052, 0x1BDC, 0x8053, 0x8053, 0x4484,\n    0x8054, 0x8054, 0x09F3, 0x8055, 0x8055, 0x4485, 0x8056, 0x8056, 0x2128,\n    0x8057, 0x8057, 0x4486, 0x8058, 0x8058, 0x0BD7, 0x8059, 0x8059, 0x4487,\n    0x805A, 0x805A, 0x090A, 0x805B, 0x805D, 0x4488, 0x805E, 0x805E, 0x2199,\n    0x805F, 0x8068, 0x448B, 0x8069, 0x8069, 0x1BDD, 0x806A, 0x806A, 0x0552,\n    0x806B, 0x806E, 0x4495, 0x806F, 0x806F, 0x2017, 0x8070, 0x8070, 0x1EA0,\n    0x8071, 0x8071, 0x1BDE, 0x8072, 0x8072, 0x2125, 0x8073, 0x8073, 0x214D,\n    0x8074, 0x8074, 0x4499, 0x8075, 0x8075, 0x25C4, 0x8076, 0x8076, 0x209D,\n    0x8077, 0x8077, 0x228A, 0x8078, 0x8078, 0x449A, 0x8079, 0x8079, 0x25C3,\n    0x807A, 0x807C, 0x449B, 0x807D, 0x807D, 0x2179, 0x807E, 0x807E, 0x2038,\n    0x807F, 0x807F, 0x1A1E, 0x8080, 0x8080, 0x1A1D, 0x8081, 0x8082, 0x449E,\n    0x8083, 0x8083, 0x0DD5, 0x8084, 0x8084, 0x1065, 0x8085, 0x8085, 0x2155,\n    0x8086, 0x8086, 0x0DB6, 0x8087, 0x8087, 0x1179, 0x8088, 0x8088, 0x44A0,\n    0x8089, 0x8089, 0x0CBD, 0x808A, 0x808A, 0x44A1, 0x808B, 0x808B, 0x09CA,\n    0x808C, 0x808C, 0x0814, 0x808D, 0x8092, 0x44A2, 0x8093, 0x8093, 0x1971,\n    0x8094, 0x8095, 0x44A8, 0x8096, 0x8096, 0x0F6F, 0x8097, 0x8097, 0x44AA,\n    0x8098, 0x8098, 0x11E1, 0x8099, 0x8099, 0x44AB, 0x809A, 0x809A, 0x0606,\n    0x809B, 0x809B, 0x06D3, 0x809C, 0x809C, 0x1970, 0x809D, 0x809D, 0x06C9,\n    0x809E, 0x809E, 0x44AC, 0x809F, 0x809F, 0x196F, 0x80A0, 0x80A0, 0x04CB,\n    0x80A1, 0x80A1, 0x0722, 0x80A2, 0x80A2, 0x11AA, 0x80A3, 0x80A3, 0x44AD,\n    0x80A4, 0x80A4, 0x0691, 0x80A5, 0x80A5, 0x0667, 0x80A6, 0x80A8, 0x44AE,\n    0x80A9, 0x80A9, 0x085A, 0x80AA, 0x80AA, 0x065B, 0x80AB, 0x80AB, 0x1976,\n    0x80AC, 0x80AC, 0x44B1, 0x80AD, 0x80AD, 0x1977, 0x80AE, 0x80AE, 0x03C4,\n    0x80AF, 0x80AF, 0x095C, 0x80B0, 0x80B0, 0x44B2, 0x80B1, 0x80B1, 0x1975,\n    0x80B2, 0x80B2, 0x10E2, 0x80B3, 0x80B3, 0x44B3, 0x80B4, 0x80B4, 0x1978,\n    0x80B5, 0x80B6, 0x44B4, 0x80B7, 0x80B7, 0x1979, 0x80B8, 0x80B9, 0x44B6,\n    0x80BA, 0x80BA, 0x066B, 0x80BB, 0x80BB, 0x44B8, 0x80BC, 0x80BC, 0x1972,\n    0x80BD, 0x80BD, 0x1974, 0x80BE, 0x80BE, 0x0D2F, 0x80BF, 0x80BF, 0x11D6,\n    0x80C0, 0x80C0, 0x116E, 0x80C1, 0x80C1, 0x0F7D, 0x80C2, 0x80C2, 0x197F,\n    0x80C3, 0x80C3, 0x0EC7, 0x80C4, 0x80C4, 0x1980, 0x80C5, 0x80C5, 0x44B9,\n    0x80C6, 0x80C6, 0x0589, 0x80C7, 0x80CB, 0x44BA, 0x80CC, 0x80CC, 0x041C,\n    0x80CD, 0x80CD, 0x1982, 0x80CE, 0x80CE, 0x0DF8, 0x80CF, 0x80D5, 0x44BF,\n    0x80D6, 0x80D6, 0x0B97, 0x80D7, 0x80D7, 0x1983, 0x80D8, 0x80D8, 0x44C6,\n    0x80D9, 0x80D9, 0x1981, 0x80DA, 0x80DA, 0x0BA0, 0x80DB, 0x80DB, 0x197E,\n    0x80DC, 0x80DC, 0x0D3B, 0x80DD, 0x80DD, 0x1985, 0x80DE, 0x80DE, 0x0406,\n    0x80DF, 0x80E0, 0x44C7, 0x80E1, 0x80E1, 0x07B1, 0x80E2, 0x80E3, 0x44C9,\n    0x80E4, 0x80E4, 0x126D, 0x80E5, 0x80E5, 0x1BC7, 0x80E6, 0x80E6, 0x44CB,\n    0x80E7, 0x80EA, 0x197A, 0x80EB, 0x80EB, 0x1986, 0x80EC, 0x80EC, 0x179A,\n    0x80ED, 0x80ED, 0x1989, 0x80EE, 0x80EE, 0x44CC, 0x80EF, 0x80EF, 0x0975,\n    0x80F0, 0x80F0, 0x104F, 0x80F1, 0x80F1, 0x1987, 0x80F2, 0x80F2, 0x198C,\n    0x80F3, 0x80F3, 0x06E7, 0x80F4, 0x80F4, 0x1988, 0x80F5, 0x80F5, 0x44CD,\n    0x80F6, 0x80F6, 0x088B, 0x80F7, 0x80F7, 0x44CE, 0x80F8, 0x80F8, 0x0FA3,\n    0x80F9, 0x80F9, 0x44CF, 0x80FA, 0x80FA, 0x03C2, 0x80FB, 0x80FB, 0x44D0,\n    0x80FC, 0x80FC, 0x198D, 0x80FD, 0x80FD, 0x0B3F, 0x80FE, 0x80FF, 0x44D1,\n    0x8100, 0x8101, 0x44D3, 0x8102, 0x8102, 0x11AB, 0x8103, 0x8104, 0x44D5,\n    0x8105, 0x8105, 0x21D2, 0x8106, 0x8106, 0x0563, 0x8107, 0x8108, 0x44D7,\n    0x8109, 0x8109, 0x0A9D, 0x810A, 0x810A, 0x082C, 0x810B, 0x810C, 0x44D9,\n    0x810D, 0x810E, 0x198A, 0x810F, 0x810F, 0x1123, 0x8110, 0x8110, 0x0C09,\n    0x8111, 0x8111, 0x0B37, 0x8112, 0x8112, 0x198F, 0x8113, 0x8113, 0x0B68,\n    0x8114, 0x8114, 0x1309, 0x8115, 0x8115, 0x44DB, 0x8116, 0x8116, 0x0478,\n    0x8117, 0x8117, 0x44DC, 0x8118, 0x8118, 0x1994, 0x8119, 0x8119, 0x44DD,\n    0x811A, 0x811A, 0x0896, 0x811B, 0x811B, 0x24C7, 0x811C, 0x811D, 0x44DE,\n    0x811E, 0x811E, 0x1992, 0x811F, 0x812B, 0x44E0, 0x812C, 0x812C, 0x1993,\n    0x812D, 0x812E, 0x44ED, 0x812F, 0x812F, 0x06A7, 0x8130, 0x8130, 0x44EF,\n    0x8131, 0x8131, 0x0E82, 0x8132, 0x8132, 0x1995, 0x8133, 0x8135, 0x44F0,\n    0x8136, 0x8136, 0x1991, 0x8137, 0x8137, 0x44F3, 0x8138, 0x8138, 0x09FC,\n    0x8139, 0x8139, 0x2279, 0x813A, 0x813D, 0x44F4, 0x813E, 0x813E, 0x0BC1,\n    0x813F, 0x8145, 0x44F8, 0x8146, 0x8146, 0x0E46, 0x8147, 0x8147, 0x44FF,\n    0x8148, 0x8148, 0x1996, 0x8149, 0x8149, 0x4500, 0x814A, 0x814A, 0x099B,\n    0x814B, 0x814B, 0x103F, 0x814C, 0x814C, 0x1997, 0x814D, 0x814D, 0x4501,\n    0x814E, 0x814E, 0x2123, 0x814F, 0x814F, 0x4502, 0x8150, 0x8150, 0x06AA,\n    0x8151, 0x8151, 0x06A8, 0x8152, 0x8152, 0x4503, 0x8153, 0x8153, 0x1998,\n    0x8154, 0x8154, 0x0C38, 0x8155, 0x8155, 0x0EA4, 0x8156, 0x8156, 0x24C5,\n    0x8157, 0x8158, 0x4504, 0x8159, 0x815A, 0x199A, 0x815B, 0x815F, 0x4506,\n    0x8160, 0x8160, 0x199D, 0x8161, 0x8161, 0x24C9, 0x8162, 0x8164, 0x450B,\n    0x8165, 0x8165, 0x0F93, 0x8166, 0x8166, 0x2094, 0x8167, 0x8167, 0x19A2,\n    0x8168, 0x8168, 0x450E, 0x8169, 0x8169, 0x199E, 0x816A, 0x816A, 0x450F,\n    0x816B, 0x816B, 0x2296, 0x816C, 0x816C, 0x4510, 0x816D, 0x816D, 0x19A1,\n    0x816E, 0x816E, 0x0CD4, 0x816F, 0x816F, 0x4511, 0x8170, 0x8170, 0x1025,\n    0x8171, 0x8171, 0x199C, 0x8172, 0x8173, 0x4512, 0x8174, 0x8174, 0x1999,\n    0x8175, 0x8177, 0x4514, 0x8178, 0x8178, 0x1E77, 0x8179, 0x8179, 0x06B4,\n    0x817A, 0x817A, 0x0F46, 0x817B, 0x817B, 0x0B48, 0x817C, 0x817D, 0x199F,\n    0x817E, 0x817E, 0x0E2D, 0x817F, 0x817F, 0x0E79, 0x8180, 0x8180, 0x03FD,\n    0x8181, 0x8181, 0x4517, 0x8182, 0x8182, 0x19A6, 0x8183, 0x8187, 0x4518,\n    0x8188, 0x8188, 0x19A5, 0x8189, 0x8189, 0x451D, 0x818A, 0x818A, 0x0479,\n    0x818B, 0x818E, 0x451E, 0x818F, 0x818F, 0x06DB, 0x8190, 0x8190, 0x4522,\n    0x8191, 0x8191, 0x19A7, 0x8192, 0x8197, 0x4523, 0x8198, 0x8198, 0x0455,\n    0x8199, 0x8199, 0x4529, 0x819A, 0x819A, 0x1F06, 0x819B, 0x819B, 0x0E18,\n    0x819C, 0x819C, 0x0B07, 0x819D, 0x819D, 0x0F12, 0x819E, 0x819F, 0x452A,\n    0x81A0, 0x81A0, 0x1FA5, 0x81A1, 0x81A2, 0x452C, 0x81A3, 0x81A3, 0x19A9,\n    0x81A4, 0x81A5, 0x452E, 0x81A6, 0x81A6, 0x19B0, 0x81A7, 0x81A7, 0x4530,\n    0x81A8, 0x81A8, 0x0BB3, 0x81A9, 0x81A9, 0x2099, 0x81AA, 0x81AA, 0x19AA,\n    0x81AB, 0x81B2, 0x4531, 0x81B3, 0x81B3, 0x0CFE, 0x81B4, 0x81B9, 0x4539,\n    0x81BA, 0x81BA, 0x1641, 0x81BB, 0x81BB, 0x19AE, 0x81BC, 0x81BC, 0x453F,\n    0x81BD, 0x81BD, 0x1EAD, 0x81BE, 0x81BE, 0x24C8, 0x81BF, 0x81BF, 0x20A8,\n    0x81C0, 0x81C0, 0x0E7F, 0x81C1, 0x81C1, 0x19AF, 0x81C2, 0x81C2, 0x0444,\n    0x81C3, 0x81C3, 0x109C, 0x81C4, 0x81C5, 0x4540, 0x81C6, 0x81C6, 0x1063,\n    0x81C7, 0x81C8, 0x4542, 0x81C9, 0x81C9, 0x201F, 0x81CA, 0x81CA, 0x19AD,\n    0x81CB, 0x81CB, 0x4544, 0x81CC, 0x81CC, 0x19AB, 0x81CD, 0x81CD, 0x20C5,\n    0x81CE, 0x81CE, 0x4545, 0x81CF, 0x81CF, 0x24CA, 0x81D0, 0x81D7, 0x4546,\n    0x81D8, 0x81D8, 0x1FF0, 0x81D9, 0x81D9, 0x454E, 0x81DA, 0x81DA, 0x24C6,\n    0x81DB, 0x81DE, 0x454F, 0x81DF, 0x81DF, 0x225D, 0x81E0, 0x81E0, 0x22DE,\n    0x81E1, 0x81E2, 0x4553, 0x81E3, 0x81E3, 0x04E1, 0x81E4, 0x81E6, 0x4555,\n    0x81E7, 0x81E7, 0x1902, 0x81E8, 0x81E8, 0x202C, 0x81E9, 0x81E9, 0x4558,\n    0x81EA, 0x81EA, 0x1231, 0x81EB, 0x81EB, 0x4559, 0x81EC, 0x81EC, 0x1CA9,\n    0x81ED, 0x81ED, 0x0519, 0x81EE, 0x81F2, 0x455A, 0x81F3, 0x81F4, 0x11C0,\n    0x81F5, 0x81F9, 0x455F, 0x81FA, 0x81FA, 0x2161, 0x81FB, 0x81FB, 0x118A,\n    0x81FC, 0x81FC, 0x08F9, 0x81FD, 0x81FD, 0x4564, 0x81FE, 0x81FE, 0x1CA5,\n    0x81FF, 0x81FF, 0x4565, 0x8200, 0x8200, 0x102F, 0x8201, 0x8202, 0x1CA6,\n    0x8203, 0x8203, 0x4566, 0x8204, 0x8204, 0x1CA8, 0x8205, 0x8205, 0x08FA,\n    0x8206, 0x8206, 0x10C4, 0x8207, 0x8207, 0x223B, 0x8208, 0x8208, 0x21D9,\n    0x8209, 0x8209, 0x1FCB, 0x820A, 0x820A, 0x1FC9, 0x820B, 0x820B, 0x4567,\n    0x820C, 0x820D, 0x0D19, 0x820E, 0x820F, 0x4568, 0x8210, 0x8210, 0x1C62,\n    0x8211, 0x8211, 0x456A, 0x8212, 0x8212, 0x0D7D, 0x8213, 0x8213, 0x456B,\n    0x8214, 0x8214, 0x0E45, 0x8215, 0x821A, 0x456C, 0x821B, 0x821B, 0x1618,\n    0x821C, 0x821C, 0x0DA9, 0x821D, 0x821D, 0x4572, 0x821E, 0x821E, 0x0EF7,\n    0x821F, 0x821F, 0x11DA, 0x8220, 0x8220, 0x4573, 0x8221, 0x8223, 0x1CAB,\n    0x8224, 0x8227, 0x4574, 0x8228, 0x8228, 0x1CB0, 0x8229, 0x8229, 0x4578,\n    0x822A, 0x822A, 0x0774, 0x822B, 0x822B, 0x1CB1, 0x822C, 0x822C, 0x03EE,\n    0x822D, 0x822D, 0x1CAE, 0x822E, 0x822E, 0x4579, 0x822F, 0x822F, 0x1CAF,\n    0x8230, 0x8230, 0x0873, 0x8231, 0x8231, 0x049C, 0x8232, 0x8232, 0x457A,\n    0x8233, 0x8234, 0x1CB4, 0x8235, 0x8235, 0x0625, 0x8236, 0x8236, 0x0477,\n    0x8237, 0x8237, 0x0F3C, 0x8238, 0x8238, 0x1CB2, 0x8239, 0x8239, 0x052F,\n    0x823A, 0x823A, 0x457B, 0x823B, 0x823B, 0x1CB3, 0x823C, 0x823D, 0x457C,\n    0x823E, 0x823E, 0x1CB6, 0x823F, 0x8243, 0x457E, 0x8244, 0x8244, 0x1CB7,\n    0x8245, 0x8246, 0x4583, 0x8247, 0x8247, 0x0E58, 0x8248, 0x8248, 0x4585,\n    0x8249, 0x8249, 0x1CB8, 0x824A, 0x824A, 0x4586, 0x824B, 0x824B, 0x1CB9,\n    0x824C, 0x824E, 0x4587, 0x824F, 0x824F, 0x1CBA, 0x8250, 0x8257, 0x458A,\n    0x8258, 0x8258, 0x0DC7, 0x8259, 0x8259, 0x1E61, 0x825A, 0x825A, 0x1CBB,\n    0x825B, 0x825E, 0x4592, 0x825F, 0x825F, 0x1CBC, 0x8260, 0x8263, 0x4596,\n    0x8264, 0x8264, 0x25EF, 0x8265, 0x8265, 0x459A, 0x8266, 0x8266, 0x1F98,\n    0x8267, 0x8267, 0x459B, 0x8268, 0x8268, 0x1CBD, 0x8269, 0x826A, 0x459C,\n    0x826B, 0x826B, 0x25F0, 0x826C, 0x826D, 0x459E, 0x826E, 0x826E, 0x1CDC,\n    0x826F, 0x826F, 0x0A05, 0x8270, 0x8270, 0x085B, 0x8271, 0x8271, 0x1F88,\n    0x8272, 0x8272, 0x0CE4, 0x8273, 0x8273, 0x1007, 0x8274, 0x8274, 0x1771,\n    0x8275, 0x8276, 0x45A0, 0x8277, 0x8277, 0x21F8, 0x8278, 0x8278, 0x45A2,\n    0x8279, 0x8279, 0x13E1, 0x827A, 0x827A, 0x105C, 0x827B, 0x827C, 0x45A3,\n    0x827D, 0x827D, 0x13E2, 0x827E, 0x827E, 0x03B7, 0x827F, 0x827F, 0x13E3,\n    0x8280, 0x8281, 0x45A5, 0x8282, 0x8282, 0x08AB, 0x8283, 0x8283, 0x45A7,\n    0x8284, 0x8284, 0x13E7, 0x8285, 0x8287, 0x45A8, 0x8288, 0x8288, 0x1278,\n    0x8289, 0x8289, 0x45AB, 0x828A, 0x828A, 0x13E5, 0x828B, 0x828B, 0x10D8,\n    0x828C, 0x828C, 0x45AC, 0x828D, 0x828D, 0x0D0F, 0x828E, 0x828E, 0x13E8,\n    0x828F, 0x828F, 0x13E4, 0x8290, 0x8290, 0x45AD, 0x8291, 0x8291, 0x13E9,\n    0x8292, 0x8292, 0x0AA7, 0x8293, 0x8296, 0x45AE, 0x8297, 0x8297, 0x13EA,\n    0x8298, 0x8298, 0x13F3, 0x8299, 0x8299, 0x13EB, 0x829A, 0x829B, 0x45B2,\n    0x829C, 0x829C, 0x0EEE, 0x829D, 0x829D, 0x11A4, 0x829E, 0x829E, 0x45B4,\n    0x829F, 0x829F, 0x13FD, 0x82A0, 0x82A0, 0x45B5, 0x82A1, 0x82A1, 0x13FB,\n    0x82A2, 0x82A3, 0x45B6, 0x82A4, 0x82A4, 0x1400, 0x82A5, 0x82A5, 0x08B7,\n    0x82A6, 0x82A6, 0x0A52, 0x82A7, 0x82A7, 0x45B8, 0x82A8, 0x82A8, 0x13E6,\n    0x82A9, 0x82A9, 0x13F9, 0x82AA, 0x82AA, 0x13FC, 0x82AB, 0x82AB, 0x13EC,\n    0x82AC, 0x82AC, 0x066F, 0x82AD, 0x82AD, 0x03D0, 0x82AE, 0x82AE, 0x13F5,\n    0x82AF, 0x82AF, 0x0F89, 0x82B0, 0x82B0, 0x13EF, 0x82B1, 0x82B1, 0x07BD,\n    0x82B2, 0x82B2, 0x45B9, 0x82B3, 0x82B3, 0x0659, 0x82B4, 0x82B4, 0x13FA,\n    0x82B5, 0x82B6, 0x45BA, 0x82B7, 0x82B7, 0x13F4, 0x82B8, 0x82B8, 0x13ED,\n    0x82B9, 0x82B9, 0x0C58, 0x82BA, 0x82BA, 0x45BC, 0x82BB, 0x82BB, 0x2322,\n    0x82BC, 0x82BC, 0x45BD, 0x82BD, 0x82BD, 0x0FE8, 0x82BE, 0x82BE, 0x13EE,\n    0x82BF, 0x82C0, 0x45BE, 0x82C1, 0x82C1, 0x13F8, 0x82C2, 0x82C3, 0x45C0,\n    0x82C4, 0x82C4, 0x13FE, 0x82C5, 0x82C6, 0x45C2, 0x82C7, 0x82C7, 0x0EBC,\n    0x82C8, 0x82C8, 0x13F0, 0x82C9, 0x82C9, 0x45C4, 0x82CA, 0x82CA, 0x13F1,\n    0x82CB, 0x82CC, 0x13F6, 0x82CD, 0x82CD, 0x049B, 0x82CE, 0x82CE, 0x13FF,\n    0x82CF, 0x82CF, 0x0DCA, 0x82D0, 0x82D0, 0x45C5, 0x82D1, 0x82D1, 0x10FA,\n    0x82D2, 0x82D2, 0x1409, 0x82D3, 0x82D3, 0x140D, 0x82D4, 0x82D4, 0x0DF9,\n    0x82D5, 0x82D5, 0x1414, 0x82D6, 0x82D6, 0x45C6, 0x82D7, 0x82D7, 0x0AEC,\n    0x82D8, 0x82D8, 0x140A, 0x82D9, 0x82DA, 0x45C7, 0x82DB, 0x82DB, 0x094E,\n    0x82DC, 0x82DC, 0x1407, 0x82DD, 0x82DD, 0x45C9, 0x82DE, 0x82DE, 0x0405,\n    0x82DF, 0x82DF, 0x070F, 0x82E0, 0x82E0, 0x1413, 0x82E1, 0x82E1, 0x1401,\n    0x82E2, 0x82E2, 0x45CA, 0x82E3, 0x82E3, 0x13F2, 0x82E4, 0x82E4, 0x1404,\n    0x82E5, 0x82E5, 0x0CCF, 0x82E6, 0x82E6, 0x096D, 0x82E7, 0x82E7, 0x2336,\n    0x82E8, 0x82EA, 0x45CB, 0x82EB, 0x82EB, 0x0CF4, 0x82EC, 0x82EE, 0x45CE,\n    0x82EF, 0x82EF, 0x0426, 0x82F0, 0x82F0, 0x45D1, 0x82F1, 0x82F1, 0x1087,\n    0x82F2, 0x82F3, 0x45D2, 0x82F4, 0x82F4, 0x1408, 0x82F5, 0x82F6, 0x45D4,\n    0x82F7, 0x82F7, 0x1403, 0x82F8, 0x82F8, 0x45D6, 0x82F9, 0x82F9, 0x0BDA,\n    0x82FA, 0x82FA, 0x45D7, 0x82FB, 0x82FB, 0x140C, 0x82FC, 0x82FF, 0x45D8,\n    0x8300, 0x8300, 0x45DC, 0x8301, 0x8301, 0x121F, 0x8302, 0x8302, 0x0AB4,\n    0x8303, 0x8303, 0x0653, 0x8304, 0x8304, 0x0C4E, 0x8305, 0x8305, 0x0AAE,\n    0x8306, 0x8306, 0x1410, 0x8307, 0x8307, 0x1406, 0x8308, 0x8308, 0x1419,\n    0x8309, 0x8309, 0x1402, 0x830A, 0x830B, 0x45DD, 0x830C, 0x830C, 0x140B,\n    0x830D, 0x830D, 0x45DF, 0x830E, 0x830E, 0x08D4, 0x830F, 0x830F, 0x1405,\n    0x8310, 0x8310, 0x45E0, 0x8311, 0x8311, 0x140E, 0x8312, 0x8313, 0x45E1,\n    0x8314, 0x8315, 0x1411, 0x8316, 0x8316, 0x45E3, 0x8317, 0x8317, 0x1426,\n    0x8318, 0x8319, 0x45E4, 0x831A, 0x831A, 0x140F, 0x831B, 0x831B, 0x142E,\n    0x831C, 0x831C, 0x1415, 0x831D, 0x8326, 0x45E6, 0x8327, 0x8327, 0x085E,\n    0x8328, 0x8328, 0x0547, 0x8329, 0x832A, 0x45F0, 0x832B, 0x832B, 0x0AA8,\n    0x832C, 0x832C, 0x04AE, 0x832D, 0x832D, 0x1428, 0x832E, 0x832E, 0x45F2,\n    0x832F, 0x832F, 0x1420, 0x8330, 0x8330, 0x45F3, 0x8331, 0x8331, 0x141D,\n    0x8332, 0x8332, 0x45F4, 0x8333, 0x8333, 0x142A, 0x8334, 0x8334, 0x141C,\n    0x8335, 0x8335, 0x1077, 0x8336, 0x8336, 0x04AF, 0x8337, 0x8337, 0x45F5,\n    0x8338, 0x8338, 0x0CB2, 0x8339, 0x8339, 0x0CBE, 0x833A, 0x833A, 0x1429,\n    0x833B, 0x833B, 0x45F6, 0x833C, 0x833C, 0x141B, 0x833D, 0x833F, 0x45F7,\n    0x8340, 0x8340, 0x1425, 0x8341, 0x8342, 0x45FA, 0x8343, 0x8343, 0x1423,\n    0x8344, 0x8345, 0x45FC, 0x8346, 0x8346, 0x08D2, 0x8347, 0x8347, 0x1422,\n    0x8348, 0x8348, 0x45FE, 0x8349, 0x8349, 0x04A4, 0x834A, 0x834E, 0x45FF,\n    0x834F, 0x834F, 0x1421, 0x8350, 0x8350, 0x0869, 0x8351, 0x8351, 0x1416,\n    0x8352, 0x8352, 0x07D9, 0x8353, 0x8353, 0x4604, 0x8354, 0x8354, 0x09DE,\n    0x8355, 0x8359, 0x4605, 0x835A, 0x835A, 0x0847, 0x835B, 0x835C, 0x1417,\n    0x835D, 0x835D, 0x460A, 0x835E, 0x835E, 0x141F, 0x835F, 0x835F, 0x1424,\n    0x8360, 0x8360, 0x1427, 0x8361, 0x8361, 0x0595, 0x8362, 0x8362, 0x460B,\n    0x8363, 0x8363, 0x0CB4, 0x8364, 0x8364, 0x07FC, 0x8365, 0x8365, 0x142C,\n    0x8366, 0x8366, 0x142B, 0x8367, 0x8367, 0x1090, 0x8368, 0x8368, 0x142D,\n    0x8369, 0x8369, 0x142F, 0x836A, 0x836A, 0x1431, 0x836B, 0x836B, 0x1078,\n    0x836C, 0x836C, 0x1430, 0x836D, 0x836E, 0x1432, 0x836F, 0x836F, 0x1030,\n    0x8370, 0x8376, 0x460C, 0x8377, 0x8377, 0x0780, 0x8378, 0x8378, 0x1435,\n    0x8379, 0x837A, 0x4613, 0x837B, 0x837B, 0x1442, 0x837C, 0x837C, 0x143D,\n    0x837D, 0x837D, 0x1440, 0x837E, 0x8384, 0x4615, 0x8385, 0x8385, 0x143C,\n    0x8386, 0x8386, 0x0BED, 0x8387, 0x8388, 0x461C, 0x8389, 0x8389, 0x09DD,\n    0x838A, 0x838A, 0x22AB, 0x838B, 0x838D, 0x461E, 0x838E, 0x838E, 0x0CE8,\n    0x838F, 0x8391, 0x4621, 0x8392, 0x8392, 0x141A, 0x8393, 0x8393, 0x143A,\n    0x8394, 0x8395, 0x4624, 0x8396, 0x8396, 0x1FBF, 0x8397, 0x8397, 0x4626,\n    0x8398, 0x8398, 0x1443, 0x8399, 0x839A, 0x4627, 0x839B, 0x839B, 0x141E,\n    0x839C, 0x839C, 0x143B, 0x839D, 0x839D, 0x4629, 0x839E, 0x839E, 0x1444,\n    0x839F, 0x839F, 0x462A, 0x83A0, 0x83A0, 0x1438, 0x83A1, 0x83A1, 0x462B,\n    0x83A2, 0x83A2, 0x1F7D, 0x83A3, 0x83A6, 0x462C, 0x83A7, 0x83A7, 0x2333,\n    0x83A8, 0x83A8, 0x1445, 0x83A9, 0x83A9, 0x143F, 0x83AA, 0x83AA, 0x1439,\n    0x83AB, 0x83AB, 0x0B0D, 0x83AC, 0x83AF, 0x4630, 0x83B0, 0x83B0, 0x1434,\n    0x83B1, 0x83B1, 0x099E, 0x83B2, 0x83B2, 0x09F4, 0x83B3, 0x83B4, 0x1436,\n    0x83B5, 0x83B5, 0x4634, 0x83B6, 0x83B6, 0x143E, 0x83B7, 0x83B7, 0x0806,\n    0x83B8, 0x83B8, 0x1441, 0x83B9, 0x83B9, 0x108D, 0x83BA, 0x83BA, 0x1446,\n    0x83BB, 0x83BB, 0x4635, 0x83BC, 0x83BC, 0x1447, 0x83BD, 0x83BD, 0x0AAC,\n    0x83BE, 0x83BF, 0x4636, 0x83C0, 0x83C0, 0x145E, 0x83C1, 0x83C1, 0x1448,\n    0x83C2, 0x83C4, 0x4638, 0x83C5, 0x83C5, 0x145D, 0x83C6, 0x83C6, 0x463B,\n    0x83C7, 0x83C7, 0x0716, 0x83C8, 0x83C9, 0x463C, 0x83CA, 0x83CA, 0x0904,\n    0x83CB, 0x83CB, 0x463E, 0x83CC, 0x83CC, 0x0929, 0x83CD, 0x83CE, 0x463F,\n    0x83CF, 0x83CF, 0x0781, 0x83D0, 0x83D3, 0x4641, 0x83D4, 0x83D4, 0x1456,\n    0x83D5, 0x83D5, 0x4645, 0x83D6, 0x83D6, 0x1451, 0x83D7, 0x83D7, 0x4646,\n    0x83D8, 0x83D8, 0x144B, 0x83D9, 0x83DB, 0x4647, 0x83DC, 0x83DC, 0x0492,\n    0x83DD, 0x83DD, 0x144F, 0x83DE, 0x83DE, 0x464A, 0x83DF, 0x83DF, 0x1457,\n    0x83E0, 0x83E0, 0x046B, 0x83E1, 0x83E1, 0x1461, 0x83E2, 0x83E4, 0x464B,\n    0x83E5, 0x83E5, 0x144A, 0x83E6, 0x83E8, 0x464E, 0x83E9, 0x83E9, 0x0BEF,\n    0x83EA, 0x83EA, 0x145C, 0x83EB, 0x83EE, 0x4651, 0x83EF, 0x83EF, 0x1F4D,\n    0x83F0, 0x83F0, 0x1460, 0x83F1, 0x83F1, 0x0A2B, 0x83F2, 0x83F2, 0x0663,\n    0x83F3, 0x83F7, 0x4655, 0x83F8, 0x83F9, 0x145A, 0x83FA, 0x83FC, 0x465A,\n    0x83FD, 0x83FD, 0x1450, 0x83FE, 0x83FF, 0x465D, 0x8400, 0x8400, 0x465F,\n    0x8401, 0x8401, 0x1449, 0x8402, 0x8402, 0x4660, 0x8403, 0x8403, 0x1459,\n    0x8404, 0x8404, 0x0E24, 0x8405, 0x8405, 0x4661, 0x8406, 0x8406, 0x1455,\n    0x8407, 0x8407, 0x2334, 0x8408, 0x8409, 0x4662, 0x840A, 0x840A, 0x1FF1,\n    0x840B, 0x840B, 0x144E, 0x840C, 0x840C, 0x0ACD, 0x840D, 0x840D, 0x0BDB,\n    0x840E, 0x840E, 0x0EBD, 0x840F, 0x840F, 0x1458, 0x8410, 0x8410, 0x4664,\n    0x8411, 0x8411, 0x1454, 0x8412, 0x8417, 0x4665, 0x8418, 0x8418, 0x144D,\n    0x8419, 0x841B, 0x466B, 0x841C, 0x841C, 0x1452, 0x841D, 0x841D, 0x0A83,\n    0x841E, 0x8423, 0x466E, 0x8424, 0x8425, 0x108E, 0x8426, 0x8426, 0x145F,\n    0x8427, 0x8427, 0x0F61, 0x8428, 0x8428, 0x0CD3, 0x8429, 0x842B, 0x4674,\n    0x842C, 0x842C, 0x218B, 0x842D, 0x8430, 0x4677, 0x8431, 0x8431, 0x1472,\n    0x8432, 0x8434, 0x467B, 0x8435, 0x8435, 0x2349, 0x8436, 0x8437, 0x467E,\n    0x8438, 0x8438, 0x1453, 0x8439, 0x843B, 0x4680, 0x843C, 0x843C, 0x146C,\n    0x843D, 0x843D, 0x0A8B, 0x843E, 0x8445, 0x4683, 0x8446, 0x8446, 0x146D,\n    0x8447, 0x8448, 0x468B, 0x8449, 0x8449, 0x220B, 0x844A, 0x8450, 0x468D,\n    0x8451, 0x8451, 0x1463, 0x8452, 0x8452, 0x2346, 0x8453, 0x8456, 0x4694,\n    0x8457, 0x8457, 0x11F7, 0x8458, 0x8458, 0x4698, 0x8459, 0x8459, 0x1465,\n    0x845A, 0x845A, 0x1464, 0x845B, 0x845B, 0x06EB, 0x845C, 0x845C, 0x1462,\n    0x845D, 0x8460, 0x4699, 0x8461, 0x8461, 0x0BEE, 0x8462, 0x8462, 0x469D,\n    0x8463, 0x8463, 0x05EC, 0x8464, 0x8464, 0x2347, 0x8465, 0x8465, 0x469E,\n    0x8466, 0x8466, 0x2193, 0x8467, 0x8468, 0x469F, 0x8469, 0x8469, 0x146E,\n    0x846A, 0x846A, 0x46A1, 0x846B, 0x846B, 0x07B0, 0x846C, 0x846C, 0x1124,\n    0x846D, 0x846D, 0x1473, 0x846E, 0x846E, 0x46A2, 0x846F, 0x846F, 0x26A1,\n    0x8470, 0x8470, 0x46A3, 0x8471, 0x8471, 0x0553, 0x8472, 0x8472, 0x46A4,\n    0x8473, 0x8473, 0x1466, 0x8474, 0x8474, 0x46A5, 0x8475, 0x8475, 0x0988,\n    0x8476, 0x8476, 0x146F, 0x8477, 0x8477, 0x1F62, 0x8478, 0x8478, 0x146B,\n    0x8479, 0x8479, 0x46A6, 0x847A, 0x847A, 0x1469, 0x847B, 0x8481, 0x46A7,\n    0x8482, 0x8482, 0x05BA, 0x8483, 0x8486, 0x46AE, 0x8487, 0x8488, 0x1467,\n    0x8489, 0x8489, 0x146A, 0x848A, 0x848A, 0x46B2, 0x848B, 0x848B, 0x0880,\n    0x848C, 0x848C, 0x1470, 0x848D, 0x848D, 0x46B3, 0x848E, 0x848E, 0x1471,\n    0x848F, 0x8492, 0x46B4, 0x8493, 0x8493, 0x234D, 0x8494, 0x8494, 0x2348,\n    0x8495, 0x8496, 0x46B8, 0x8497, 0x8497, 0x1481, 0x8498, 0x8498, 0x46BA,\n    0x8499, 0x8499, 0x0ACE, 0x849A, 0x849B, 0x46BB, 0x849C, 0x849C, 0x0DD7,\n    0x849D, 0x84A0, 0x46BD, 0x84A1, 0x84A1, 0x147E, 0x84A2, 0x84AE, 0x46C1,\n    0x84AF, 0x84AF, 0x1297, 0x84B0, 0x84B1, 0x46CE, 0x84B2, 0x84B2, 0x0BF0,\n    0x84B3, 0x84B3, 0x46D0, 0x84B4, 0x84B4, 0x1480, 0x84B5, 0x84B7, 0x46D1,\n    0x84B8, 0x84B8, 0x1195, 0x84B9, 0x84B9, 0x147F, 0x84BA, 0x84BA, 0x147C,\n    0x84BB, 0x84BB, 0x46D4, 0x84BC, 0x84BC, 0x1E60, 0x84BD, 0x84BD, 0x1478,\n    0x84BE, 0x84BE, 0x46D5, 0x84BF, 0x84BF, 0x147B, 0x84C0, 0x84C0, 0x2345,\n    0x84C1, 0x84C1, 0x1474, 0x84C2, 0x84C3, 0x46D6, 0x84C4, 0x84C4, 0x0FB9,\n    0x84C5, 0x84C8, 0x46D8, 0x84C9, 0x84C9, 0x0CB3, 0x84CA, 0x84CA, 0x147A,\n    0x84CB, 0x84CB, 0x1F12, 0x84CC, 0x84CC, 0x46DC, 0x84CD, 0x84CD, 0x1475,\n    0x84CE, 0x84CF, 0x46DD, 0x84D0, 0x84D0, 0x1476, 0x84D1, 0x84D1, 0x0DE7,\n    0x84D2, 0x84D2, 0x46DF, 0x84D3, 0x84D3, 0x1479, 0x84D4, 0x84D5, 0x46E0,\n    0x84D6, 0x84D6, 0x0436, 0x84D7, 0x84DC, 0x46E2, 0x84DD, 0x84DD, 0x09A1,\n    0x84DE, 0x84DE, 0x46E8, 0x84DF, 0x84DF, 0x082E, 0x84E0, 0x84E0, 0x147D,\n    0x84E1, 0x84E2, 0x46E9, 0x84E3, 0x84E3, 0x1483, 0x84E4, 0x84E4, 0x46EB,\n    0x84E5, 0x84E5, 0x1482, 0x84E6, 0x84E6, 0x1477, 0x84E7, 0x84EB, 0x46EC,\n    0x84EC, 0x84EC, 0x0BAF, 0x84ED, 0x84ED, 0x46F1, 0x84EE, 0x84EE, 0x2018,\n    0x84EF, 0x84EF, 0x2335, 0x84F0, 0x84F0, 0x1487, 0x84F1, 0x84FB, 0x46F2,\n    0x84FC, 0x84FC, 0x148E, 0x84FD, 0x84FD, 0x233C, 0x84FE, 0x84FE, 0x46FD,\n    0x84FF, 0x84FF, 0x148D, 0x8500, 0x850B, 0x46FE, 0x850C, 0x850C, 0x1484,\n    0x850D, 0x8510, 0x470A, 0x8511, 0x8511, 0x0AF4, 0x8512, 0x8512, 0x470E,\n    0x8513, 0x8513, 0x0AA2, 0x8514, 0x8514, 0x266F, 0x8515, 0x8516, 0x470F,\n    0x8517, 0x8517, 0x1182, 0x8518, 0x8519, 0x4711, 0x851A, 0x851A, 0x0EC4,\n    0x851B, 0x851D, 0x4713, 0x851E, 0x851E, 0x2351, 0x851F, 0x851F, 0x1489,\n    0x8520, 0x8520, 0x4716, 0x8521, 0x8521, 0x0493, 0x8522, 0x8522, 0x4717,\n    0x8523, 0x8523, 0x1FA0, 0x8524, 0x8525, 0x4718, 0x8526, 0x8526, 0x2338,\n    0x8527, 0x852A, 0x471A, 0x852B, 0x852B, 0x0B4B, 0x852C, 0x852C, 0x0D76,\n    0x852D, 0x852D, 0x221B, 0x852E, 0x8536, 0x471E, 0x8537, 0x8537, 0x0C3B,\n    0x8538, 0x8538, 0x1486, 0x8539, 0x8539, 0x1488, 0x853A, 0x853A, 0x148A,\n    0x853B, 0x853B, 0x148C, 0x853C, 0x853C, 0x03B5, 0x853D, 0x853D, 0x0437,\n    0x853E, 0x8540, 0x4727, 0x8541, 0x8541, 0x2342, 0x8542, 0x8542, 0x472A,\n    0x8543, 0x8543, 0x1496, 0x8544, 0x8545, 0x472B, 0x8546, 0x8546, 0x234F,\n    0x8547, 0x8547, 0x472D, 0x8548, 0x8548, 0x1490, 0x8549, 0x8549, 0x0887,\n    0x854A, 0x854A, 0x0CCA, 0x854B, 0x854D, 0x472E, 0x854E, 0x854E, 0x233D,\n    0x854F, 0x8551, 0x4731, 0x8552, 0x8552, 0x2344, 0x8553, 0x8553, 0x2331,\n    0x8554, 0x8554, 0x4734, 0x8555, 0x8555, 0x234B, 0x8556, 0x8556, 0x148B,\n    0x8557, 0x8557, 0x4735, 0x8558, 0x8558, 0x233B, 0x8559, 0x8559, 0x148F,\n    0x855A, 0x855D, 0x4736, 0x855E, 0x855E, 0x1493, 0x855F, 0x8561, 0x473A,\n    0x8562, 0x8562, 0x2350, 0x8563, 0x8563, 0x473D, 0x8564, 0x8564, 0x1492,\n    0x8565, 0x8567, 0x473E, 0x8568, 0x8568, 0x1491, 0x8569, 0x8569, 0x1EB4,\n    0x856A, 0x856A, 0x21A6, 0x856B, 0x856C, 0x4741, 0x856D, 0x856D, 0x21CB,\n    0x856E, 0x8571, 0x4743, 0x8572, 0x8572, 0x1497, 0x8573, 0x8573, 0x4747,\n    0x8574, 0x8574, 0x110F, 0x8575, 0x8576, 0x4748, 0x8577, 0x8577, 0x2355,\n    0x8578, 0x8578, 0x474A, 0x8579, 0x8579, 0x149D, 0x857A, 0x857A, 0x1494,\n    0x857B, 0x857B, 0x1498, 0x857C, 0x857D, 0x474B, 0x857E, 0x857E, 0x09C4,\n    0x857F, 0x8583, 0x474D, 0x8584, 0x8584, 0x040A, 0x8585, 0x8585, 0x14A0,\n    0x8586, 0x8586, 0x4752, 0x8587, 0x8587, 0x149B, 0x8588, 0x8588, 0x233E,\n    0x8589, 0x8589, 0x4753, 0x858A, 0x858A, 0x1F74, 0x858B, 0x858B, 0x4754,\n    0x858C, 0x858C, 0x2330, 0x858D, 0x858E, 0x4755, 0x858F, 0x858F, 0x149C,\n    0x8590, 0x8590, 0x4757, 0x8591, 0x8591, 0x2680, 0x8592, 0x8593, 0x4758,\n    0x8594, 0x8594, 0x20DA, 0x8595, 0x859A, 0x475A, 0x859B, 0x859B, 0x0FCF,\n    0x859C, 0x859C, 0x149F, 0x859D, 0x859E, 0x4760, 0x859F, 0x859F, 0x234A,\n    0x85A0, 0x85A3, 0x4762, 0x85A4, 0x85A4, 0x1499, 0x85A5, 0x85A5, 0x4766,\n    0x85A6, 0x85A6, 0x1F91, 0x85A7, 0x85A7, 0x4767, 0x85A8, 0x85A8, 0x149A,\n    0x85A9, 0x85A9, 0x2107, 0x85AA, 0x85AA, 0x0F88, 0x85AB, 0x85AD, 0x4768,\n    0x85AE, 0x85AE, 0x149E, 0x85AF, 0x85AF, 0x0D84, 0x85B0, 0x85B0, 0x14A3,\n    0x85B1, 0x85B6, 0x476B, 0x85B7, 0x85B7, 0x14A2, 0x85B8, 0x85B8, 0x4771,\n    0x85B9, 0x85B9, 0x14A1, 0x85BA, 0x85BA, 0x233F, 0x85BB, 0x85C0, 0x4772,\n    0x85C1, 0x85C1, 0x14A5, 0x85C2, 0x85C8, 0x4778, 0x85C9, 0x85C9, 0x08B6,\n    0x85CA, 0x85CC, 0x477F, 0x85CD, 0x85CD, 0x1FF4, 0x85CE, 0x85CE, 0x2343,\n    0x85CF, 0x85CF, 0x049F, 0x85D0, 0x85D0, 0x0AEF, 0x85D1, 0x85D2, 0x4782,\n    0x85D3, 0x85D3, 0x14A4, 0x85D4, 0x85D4, 0x4784, 0x85D5, 0x85D5, 0x0B7B,\n    0x85D6, 0x85DB, 0x4785, 0x85DC, 0x85DC, 0x14A6, 0x85DD, 0x85DD, 0x2212,\n    0x85DE, 0x85E3, 0x478B, 0x85E4, 0x85E4, 0x0E2C, 0x85E5, 0x85E5, 0x2207,\n    0x85E6, 0x85E8, 0x4791, 0x85E9, 0x85E9, 0x0647, 0x85EA, 0x85EA, 0x2359,\n    0x85EB, 0x85F3, 0x4794, 0x85F4, 0x85F4, 0x2254, 0x85F5, 0x85F5, 0x479D,\n    0x85F6, 0x85F6, 0x2332, 0x85F7, 0x85F8, 0x479E, 0x85F9, 0x85F9, 0x1E26,\n    0x85FA, 0x85FA, 0x2357, 0x85FB, 0x85FB, 0x1128, 0x85FC, 0x85FE, 0x47A0,\n    0x85FF, 0x85FF, 0x14A7, 0x8600, 0x8603, 0x47A3, 0x8604, 0x8604, 0x2358,\n    0x8605, 0x8605, 0x14A9, 0x8606, 0x8606, 0x2042, 0x8607, 0x8607, 0x2153,\n    0x8608, 0x860A, 0x47A7, 0x860B, 0x860B, 0x20BB, 0x860C, 0x8610, 0x47AA,\n    0x8611, 0x8611, 0x0B05, 0x8612, 0x8615, 0x47AF, 0x8616, 0x8616, 0x14AB,\n    0x8617, 0x8619, 0x47B3, 0x861A, 0x861A, 0x235A, 0x861B, 0x861D, 0x47B6,\n    0x861E, 0x861E, 0x2356, 0x861F, 0x8621, 0x47B9, 0x8622, 0x8622, 0x2337,\n    0x8623, 0x8626, 0x47BC, 0x8627, 0x8627, 0x14A8, 0x8628, 0x8628, 0x47C0,\n    0x8629, 0x8629, 0x14AA, 0x862A, 0x862C, 0x47C1, 0x862D, 0x862D, 0x1FF9,\n    0x862E, 0x8637, 0x47C4, 0x8638, 0x8638, 0x115B, 0x8639, 0x8639, 0x47CE,\n    0x863A, 0x863A, 0x2353, 0x863B, 0x863B, 0x47CF, 0x863C, 0x863C, 0x14AC,\n    0x863D, 0x863E, 0x47D0, 0x863F, 0x863F, 0x2061, 0x8640, 0x864C, 0x47D2,\n    0x864D, 0x864D, 0x1BF0, 0x864E, 0x864E, 0x07B7, 0x864F, 0x864F, 0x0A59,\n    0x8650, 0x8650, 0x0B71, 0x8651, 0x8651, 0x0A6E, 0x8652, 0x8653, 0x47DF,\n    0x8654, 0x8654, 0x1BF1, 0x8655, 0x8655, 0x1E95, 0x8656, 0x8659, 0x47E1,\n    0x865A, 0x865A, 0x0FB4, 0x865B, 0x865B, 0x47E5, 0x865C, 0x865C, 0x2049,\n    0x865D, 0x865D, 0x47E6, 0x865E, 0x865E, 0x10C2, 0x865F, 0x865F, 0x1F42,\n    0x8660, 0x8661, 0x47E7, 0x8662, 0x8662, 0x196D, 0x8663, 0x8666, 0x47E9,\n    0x8667, 0x8667, 0x1FE8, 0x8668, 0x866A, 0x47ED, 0x866B, 0x866B, 0x050B,\n    0x866C, 0x866C, 0x1BF2, 0x866D, 0x866D, 0x47F0, 0x866E, 0x866E, 0x1BF3,\n    0x866F, 0x8670, 0x47F1, 0x8671, 0x8671, 0x0D44, 0x8672, 0x8678, 0x47F3,\n    0x8679, 0x8679, 0x079E, 0x867A, 0x867A, 0x1BF5, 0x867B, 0x867B, 0x1BF7,\n    0x867C, 0x867C, 0x1BF6, 0x867D, 0x867D, 0x0DD9, 0x867E, 0x867E, 0x0F27,\n    0x867F, 0x867F, 0x1BF4, 0x8680, 0x8680, 0x0D4B, 0x8681, 0x8681, 0x1056,\n    0x8682, 0x8682, 0x0A93, 0x8683, 0x8689, 0x47FA, 0x868A, 0x868A, 0x0ED2,\n    0x868B, 0x868B, 0x1BFA, 0x868C, 0x868C, 0x0401, 0x868D, 0x868D, 0x1BF9,\n    0x868E, 0x8692, 0x4801, 0x8693, 0x8693, 0x1C00, 0x8694, 0x8694, 0x4806,\n    0x8695, 0x8695, 0x0496, 0x8696, 0x869B, 0x4807, 0x869C, 0x869C, 0x0FEA,\n    0x869D, 0x869D, 0x1BFC, 0x869E, 0x86A2, 0x480D, 0x86A3, 0x86A3, 0x1BFE,\n    0x86A4, 0x86A4, 0x112C, 0x86A5, 0x86A6, 0x4812, 0x86A7, 0x86A7, 0x1BFD,\n    0x86A8, 0x86A8, 0x1BF8, 0x86A9, 0x86A9, 0x1C01, 0x86AA, 0x86AA, 0x1BFF,\n    0x86AB, 0x86AB, 0x4814, 0x86AC, 0x86AC, 0x1BFB, 0x86AD, 0x86AE, 0x4815,\n    0x86AF, 0x86AF, 0x1C09, 0x86B0, 0x86B0, 0x1C06, 0x86B1, 0x86B1, 0x1C08,\n    0x86B2, 0x86B3, 0x4817, 0x86B4, 0x86B4, 0x1C0C, 0x86B5, 0x86B5, 0x1C04,\n    0x86B6, 0x86B6, 0x1C02, 0x86B7, 0x86B9, 0x4819, 0x86BA, 0x86BA, 0x1C07,\n    0x86BB, 0x86BF, 0x481C, 0x86C0, 0x86C0, 0x11FA, 0x86C1, 0x86C3, 0x4821,\n    0x86C4, 0x86C4, 0x1C03, 0x86C5, 0x86C5, 0x4824, 0x86C6, 0x86C6, 0x0C76,\n    0x86C7, 0x86C7, 0x0D18, 0x86C8, 0x86C8, 0x4825, 0x86C9, 0x86C9, 0x1C0A,\n    0x86CA, 0x86CA, 0x071F, 0x86CB, 0x86CB, 0x0591, 0x86CC, 0x86CD, 0x4826,\n    0x86CE, 0x86CE, 0x1C05, 0x86CF, 0x86CF, 0x1C0B, 0x86D0, 0x86D0, 0x1C12,\n    0x86D1, 0x86D1, 0x1C18, 0x86D2, 0x86D3, 0x4828, 0x86D4, 0x86D4, 0x07EC,\n    0x86D5, 0x86D7, 0x482A, 0x86D8, 0x86D8, 0x1C17, 0x86D9, 0x86D9, 0x0E8D,\n    0x86DA, 0x86DA, 0x482D, 0x86DB, 0x86DB, 0x11EA, 0x86DC, 0x86DD, 0x482E,\n    0x86DE, 0x86DE, 0x1C14, 0x86DF, 0x86DF, 0x1C16, 0x86E0, 0x86E3, 0x4830,\n    0x86E4, 0x86E4, 0x06ED, 0x86E5, 0x86E8, 0x4834, 0x86E9, 0x86E9, 0x1C0D,\n    0x86EA, 0x86EC, 0x4838, 0x86ED, 0x86ED, 0x1C10, 0x86EE, 0x86EE, 0x0AA0,\n    0x86EF, 0x86EF, 0x483B, 0x86F0, 0x86F0, 0x117E, 0x86F1, 0x86F2, 0x1C0E,\n    0x86F3, 0x86F3, 0x1C11, 0x86F4, 0x86F4, 0x1C15, 0x86F5, 0x86F7, 0x483C,\n    0x86F8, 0x86F8, 0x1C1B, 0x86F9, 0x86F9, 0x10A1, 0x86FA, 0x86FA, 0x25DA,\n    0x86FB, 0x86FD, 0x483F, 0x86FE, 0x86FE, 0x0629, 0x86FF, 0x86FF, 0x4842,\n    0x8700, 0x8700, 0x0D88, 0x8701, 0x8701, 0x4843, 0x8702, 0x8702, 0x0681,\n    0x8703, 0x8703, 0x1C19, 0x8704, 0x8705, 0x4844, 0x8706, 0x8706, 0x25D7,\n    0x8707, 0x8707, 0x1C1A, 0x8708, 0x8708, 0x1C1C, 0x8709, 0x8709, 0x1C1F,\n    0x870A, 0x870A, 0x1C1D, 0x870B, 0x870C, 0x4846, 0x870D, 0x870D, 0x1C1E,\n    0x870E, 0x8711, 0x4848, 0x8712, 0x8712, 0x0FFA, 0x8713, 0x8713, 0x1C13,\n    0x8714, 0x8714, 0x484C, 0x8715, 0x8715, 0x0E7A, 0x8716, 0x8716, 0x484D,\n    0x8717, 0x8717, 0x0EDE, 0x8718, 0x8718, 0x11A8, 0x8719, 0x8719, 0x484E,\n    0x871A, 0x871A, 0x1C25, 0x871B, 0x871B, 0x484F, 0x871C, 0x871C, 0x0AE0,\n    0x871D, 0x871D, 0x4850, 0x871E, 0x871E, 0x1C22, 0x871F, 0x8720, 0x4851,\n    0x8721, 0x8721, 0x099A, 0x8722, 0x8722, 0x1C2E, 0x8723, 0x8723, 0x1C20,\n    0x8724, 0x8724, 0x4853, 0x8725, 0x8725, 0x1C23, 0x8726, 0x8728, 0x4854,\n    0x8729, 0x8729, 0x1C2A, 0x872A, 0x872D, 0x4857, 0x872E, 0x872E, 0x1C24,\n    0x872F, 0x8730, 0x485B, 0x8731, 0x8731, 0x1C29, 0x8732, 0x8733, 0x485D,\n    0x8734, 0x8734, 0x1C28, 0x8735, 0x8736, 0x485F, 0x8737, 0x8737, 0x1C2B,\n    0x8738, 0x873A, 0x4861, 0x873B, 0x873B, 0x1C21, 0x873C, 0x873D, 0x4864,\n    0x873E, 0x873E, 0x1C26, 0x873F, 0x873F, 0x1C2C, 0x8740, 0x8746, 0x4866,\n    0x8747, 0x8747, 0x1091, 0x8748, 0x8748, 0x1C27, 0x8749, 0x8749, 0x04BC,\n    0x874A, 0x874B, 0x486D, 0x874C, 0x874C, 0x1C34, 0x874D, 0x874D, 0x486F,\n    0x874E, 0x874E, 0x0F76, 0x874F, 0x8752, 0x4870, 0x8753, 0x8753, 0x1C37,\n    0x8754, 0x8754, 0x4874, 0x8755, 0x8755, 0x212E, 0x8756, 0x8756, 0x4875,\n    0x8757, 0x8757, 0x07DD, 0x8758, 0x8758, 0x4876, 0x8759, 0x8759, 0x1C3B,\n    0x875A, 0x875F, 0x4877, 0x8760, 0x8760, 0x1C32, 0x8761, 0x8762, 0x487D,\n    0x8763, 0x8763, 0x1C38, 0x8764, 0x8764, 0x1C3A, 0x8765, 0x8765, 0x1C3C,\n    0x8766, 0x8766, 0x21B2, 0x8767, 0x876D, 0x487F, 0x876E, 0x876E, 0x1C35,\n    0x876F, 0x876F, 0x4886, 0x8770, 0x8770, 0x1C33, 0x8771, 0x8773, 0x4887,\n    0x8774, 0x8774, 0x07B2, 0x8775, 0x8775, 0x488A, 0x8776, 0x8776, 0x05DC,\n    0x8777, 0x8777, 0x488B, 0x8778, 0x8778, 0x219E, 0x8779, 0x877A, 0x488C,\n    0x877B, 0x877B, 0x1C31, 0x877C, 0x877C, 0x1C39, 0x877D, 0x877E, 0x1C2F,\n    0x877F, 0x8781, 0x488E, 0x8782, 0x8782, 0x1C2D, 0x8783, 0x8783, 0x1C46,\n    0x8784, 0x8784, 0x25DC, 0x8785, 0x8785, 0x1C43, 0x8786, 0x8787, 0x4891,\n    0x8788, 0x8788, 0x1C42, 0x8789, 0x878A, 0x4893, 0x878B, 0x878B, 0x1C36,\n    0x878C, 0x878C, 0x4895, 0x878D, 0x878D, 0x0CB5, 0x878E, 0x8792, 0x4896,\n    0x8793, 0x8793, 0x1C3D, 0x8794, 0x8796, 0x489B, 0x8797, 0x8797, 0x1C45,\n    0x8798, 0x879D, 0x489E, 0x879E, 0x879E, 0x206C, 0x879F, 0x879F, 0x0AFD,\n    0x87A0, 0x87A1, 0x48A4, 0x87A2, 0x87A2, 0x2226, 0x87A3, 0x87A7, 0x48A6,\n    0x87A8, 0x87A8, 0x1C3F, 0x87A9, 0x87AA, 0x48AB, 0x87AB, 0x87AB, 0x1C47,\n    0x87AC, 0x87AC, 0x1C49, 0x87AD, 0x87AD, 0x1C44, 0x87AE, 0x87AE, 0x48AD,\n    0x87AF, 0x87AF, 0x1C3E, 0x87B0, 0x87B2, 0x48AE, 0x87B3, 0x87B3, 0x1C4B,\n    0x87B4, 0x87B4, 0x48B1, 0x87B5, 0x87B5, 0x1C4A, 0x87B6, 0x87B9, 0x48B2,\n    0x87BA, 0x87BA, 0x0A84, 0x87BB, 0x87BB, 0x25E0, 0x87BC, 0x87BC, 0x48B6,\n    0x87BD, 0x87BD, 0x1C4E, 0x87BE, 0x87BF, 0x48B7, 0x87C0, 0x87C0, 0x1C50,\n    0x87C1, 0x87C3, 0x48B9, 0x87C4, 0x87C4, 0x227B, 0x87C5, 0x87C5, 0x48BC,\n    0x87C6, 0x87C6, 0x1C41, 0x87C7, 0x87C7, 0x48BD, 0x87C8, 0x87C8, 0x25DE,\n    0x87C9, 0x87C9, 0x48BE, 0x87CA, 0x87CA, 0x1C51, 0x87CB, 0x87CB, 0x1C4C,\n    0x87CC, 0x87CD, 0x48BF, 0x87CE, 0x87CE, 0x25E1, 0x87CF, 0x87D0, 0x48C1,\n    0x87D1, 0x87D1, 0x1C4F, 0x87D2, 0x87D2, 0x1C40, 0x87D3, 0x87D3, 0x1C4D,\n    0x87D4, 0x87DA, 0x48C3, 0x87DB, 0x87DB, 0x1C52, 0x87DC, 0x87DF, 0x48CA,\n    0x87E0, 0x87E0, 0x1C54, 0x87E1, 0x87E2, 0x48CE, 0x87E3, 0x87E3, 0x25D5,\n    0x87E4, 0x87E4, 0x48D0, 0x87E5, 0x87E5, 0x1C48, 0x87E6, 0x87E9, 0x48D1,\n    0x87EA, 0x87EA, 0x1C53, 0x87EB, 0x87EB, 0x48D5, 0x87EC, 0x87EC, 0x1E6B,\n    0x87ED, 0x87ED, 0x48D6, 0x87EE, 0x87EE, 0x1C55, 0x87EF, 0x87EF, 0x25DB,\n    0x87F0, 0x87F1, 0x48D7, 0x87F2, 0x87F2, 0x1E89, 0x87F3, 0x87F5, 0x48D9,\n    0x87F6, 0x87F6, 0x25D9, 0x87F7, 0x87F8, 0x48DC, 0x87F9, 0x87F9, 0x0F82,\n    0x87FA, 0x87FA, 0x48DE, 0x87FB, 0x87FB, 0x2211, 0x87FC, 0x87FD, 0x48DF,\n    0x87FE, 0x87FE, 0x1C58, 0x87FF, 0x87FF, 0x48E1, 0x8800, 0x8802, 0x48E2,\n    0x8803, 0x8803, 0x130D, 0x8804, 0x8804, 0x48E5, 0x8805, 0x8805, 0x2229,\n    0x8806, 0x8806, 0x25D6, 0x8807, 0x8809, 0x48E6, 0x880A, 0x880A, 0x1C59,\n    0x880B, 0x880F, 0x48E9, 0x8810, 0x8810, 0x25DD, 0x8811, 0x8811, 0x25DF,\n    0x8812, 0x8812, 0x48EE, 0x8813, 0x8813, 0x1C57, 0x8814, 0x8814, 0x48EF,\n    0x8815, 0x8815, 0x0CBF, 0x8816, 0x8816, 0x1C56, 0x8817, 0x881A, 0x48F0,\n    0x881B, 0x881B, 0x1C5A, 0x881C, 0x881E, 0x48F4, 0x881F, 0x881F, 0x1FEF,\n    0x8820, 0x8820, 0x48F7, 0x8821, 0x8821, 0x1C5B, 0x8822, 0x8822, 0x0543,\n    0x8823, 0x8823, 0x25D8, 0x8824, 0x8830, 0x48F8, 0x8831, 0x8831, 0x1F29,\n    0x8832, 0x8832, 0x1A8D, 0x8833, 0x8835, 0x4905, 0x8836, 0x8836, 0x1E5B,\n    0x8837, 0x8838, 0x4908, 0x8839, 0x8839, 0x1C5C, 0x883A, 0x883A, 0x490A,\n    0x883B, 0x883B, 0x2076, 0x883C, 0x883C, 0x1C5D, 0x883D, 0x883F, 0x490B,\n    0x8840, 0x8840, 0x0FD3, 0x8841, 0x8843, 0x490E, 0x8844, 0x8844, 0x1CAA,\n    0x8845, 0x8845, 0x0F91, 0x8846, 0x8846, 0x2297, 0x8847, 0x8849, 0x4911,\n    0x884A, 0x884A, 0x2690, 0x884B, 0x884B, 0x4914, 0x884C, 0x884C, 0x0F9B,\n    0x884D, 0x884D, 0x1005, 0x884E, 0x8852, 0x4915, 0x8853, 0x8853, 0x213F,\n    0x8854, 0x8854, 0x0F3B, 0x8855, 0x8856, 0x491A, 0x8857, 0x8857, 0x08A7,\n    0x8858, 0x8858, 0x491C, 0x8859, 0x8859, 0x0FEC, 0x885A, 0x885A, 0x491D,\n    0x885B, 0x885B, 0x2198, 0x885C, 0x885C, 0x491E, 0x885D, 0x885D, 0x1E88,\n    0x885E, 0x8860, 0x491F, 0x8861, 0x8861, 0x0799, 0x8862, 0x8862, 0x15ED,\n    0x8863, 0x8863, 0x1049, 0x8864, 0x8864, 0x1BA6, 0x8865, 0x8865, 0x0480,\n    0x8866, 0x8867, 0x4922, 0x8868, 0x8868, 0x0456, 0x8869, 0x8869, 0x1BA7,\n    0x886A, 0x886A, 0x4924, 0x886B, 0x886B, 0x0CF9, 0x886C, 0x886C, 0x04E9,\n    0x886D, 0x886D, 0x4925, 0x886E, 0x886E, 0x1306, 0x886F, 0x886F, 0x4926,\n    0x8870, 0x8870, 0x0D9A, 0x8871, 0x8871, 0x4927, 0x8872, 0x8872, 0x1BA8,\n    0x8873, 0x8876, 0x4928, 0x8877, 0x8877, 0x11D3, 0x8878, 0x8878, 0x492C,\n    0x8879, 0x8879, 0x228C, 0x887A, 0x887C, 0x492D, 0x887D, 0x887D, 0x1BA9,\n    0x887E, 0x887E, 0x1CBE, 0x887F, 0x887F, 0x1BAA, 0x8880, 0x8880, 0x4930,\n    0x8881, 0x8881, 0x10EF, 0x8882, 0x8882, 0x1BAB, 0x8883, 0x8883, 0x4931,\n    0x8884, 0x8884, 0x03CB, 0x8885, 0x8885, 0x1CBF, 0x8886, 0x8887, 0x4932,\n    0x8888, 0x8888, 0x1CC0, 0x8889, 0x888A, 0x4934, 0x888B, 0x888B, 0x057F,\n    0x888C, 0x888C, 0x4936, 0x888D, 0x888D, 0x0B9C, 0x888E, 0x8891, 0x4937,\n    0x8892, 0x8892, 0x0E0E, 0x8893, 0x8895, 0x493B, 0x8896, 0x8896, 0x0FAF,\n    0x8897, 0x889B, 0x493E, 0x889C, 0x889C, 0x0E91, 0x889D, 0x88A1, 0x4943,\n    0x88A2, 0x88A2, 0x1BAC, 0x88A3, 0x88A3, 0x4948, 0x88A4, 0x88A4, 0x1307,\n    0x88A5, 0x88AA, 0x4949, 0x88AB, 0x88AB, 0x0424, 0x88AC, 0x88AC, 0x494F,\n    0x88AD, 0x88AD, 0x0F1B, 0x88AE, 0x88B0, 0x4950, 0x88B1, 0x88B1, 0x069F,\n    0x88B2, 0x88B6, 0x4953, 0x88B7, 0x88B7, 0x1BAE, 0x88B8, 0x88BB, 0x4958,\n    0x88BC, 0x88BC, 0x1BAF, 0x88BD, 0x88C0, 0x495C, 0x88C1, 0x88C1, 0x048A,\n    0x88C2, 0x88C2, 0x0A1A, 0x88C3, 0x88C4, 0x4960, 0x88C5, 0x88C5, 0x120D,\n    0x88C6, 0x88C6, 0x1BAD, 0x88C7, 0x88C8, 0x4962, 0x88C9, 0x88C9, 0x1BB0,\n    0x88CA, 0x88CA, 0x25F1, 0x88CB, 0x88CD, 0x4964, 0x88CE, 0x88CE, 0x1BB2,\n    0x88CF, 0x88CF, 0x200C, 0x88D0, 0x88D1, 0x4967, 0x88D2, 0x88D2, 0x130A,\n    0x88D3, 0x88D3, 0x4969, 0x88D4, 0x88D4, 0x1068, 0x88D5, 0x88D5, 0x10E6,\n    0x88D6, 0x88D7, 0x496A, 0x88D8, 0x88D8, 0x1CC1, 0x88D9, 0x88D9, 0x0C94,\n    0x88DA, 0x88DB, 0x496C, 0x88DC, 0x88DC, 0x1E58, 0x88DD, 0x88DD, 0x22AC,\n    0x88DE, 0x88DE, 0x496E, 0x88DF, 0x88DF, 0x1CC2, 0x88E0, 0x88E1, 0x496F,\n    0x88E2, 0x88E2, 0x1BB1, 0x88E3, 0x88E3, 0x1BB3, 0x88E4, 0x88E4, 0x0970,\n    0x88E5, 0x88E5, 0x1BB4, 0x88E6, 0x88E7, 0x4971, 0x88E8, 0x88E8, 0x1BB8,\n    0x88E9, 0x88EF, 0x4973, 0x88F0, 0x88F0, 0x1BBA, 0x88F1, 0x88F1, 0x1BB5,\n    0x88F2, 0x88F2, 0x497A, 0x88F3, 0x88F3, 0x0D0A, 0x88F4, 0x88F4, 0x0BA2,\n    0x88F5, 0x88F7, 0x497B, 0x88F8, 0x88F8, 0x0A8A, 0x88F9, 0x88F9, 0x0755,\n    0x88FA, 0x88FB, 0x497E, 0x88FC, 0x88FC, 0x1BB7, 0x88FD, 0x88FD, 0x26A7,\n    0x88FE, 0x88FE, 0x1BB9, 0x88FF, 0x88FF, 0x4980, 0x8900, 0x8901, 0x4981,\n    0x8902, 0x8902, 0x072C, 0x8903, 0x8906, 0x4983, 0x8907, 0x8907, 0x2676,\n    0x8908, 0x8909, 0x4987, 0x890A, 0x890A, 0x1BBF, 0x890B, 0x890F, 0x4989,\n    0x8910, 0x8910, 0x078D, 0x8911, 0x8911, 0x498E, 0x8912, 0x8912, 0x0408,\n    0x8913, 0x8913, 0x1BBD, 0x8914, 0x8918, 0x498F, 0x8919, 0x8919, 0x1BBC,\n    0x891A, 0x891A, 0x1BB6, 0x891B, 0x891B, 0x1BBE, 0x891C, 0x8920, 0x4994,\n    0x8921, 0x8921, 0x1BBB, 0x8922, 0x8924, 0x4999, 0x8925, 0x8925, 0x0CC7,\n    0x8926, 0x8929, 0x499C, 0x892A, 0x892A, 0x0E7B, 0x892B, 0x892B, 0x1BC1,\n    0x892C, 0x892F, 0x49A0, 0x8930, 0x8930, 0x1739, 0x8931, 0x8931, 0x49A4,\n    0x8932, 0x8932, 0x1FE1, 0x8933, 0x8933, 0x25BB, 0x8934, 0x8934, 0x1BC0,\n    0x8935, 0x8935, 0x49A5, 0x8936, 0x8936, 0x1BC2, 0x8937, 0x8937, 0x49A6,\n    0x8938, 0x8938, 0x25BE, 0x8939, 0x893A, 0x49A7, 0x893B, 0x893B, 0x22DD,\n    0x893C, 0x8940, 0x49A9, 0x8941, 0x8941, 0x1BC3, 0x8942, 0x8943, 0x49AE,\n    0x8944, 0x8944, 0x0F52, 0x8945, 0x8946, 0x49B0, 0x8947, 0x8947, 0x25BD,\n    0x8948, 0x8955, 0x49B2, 0x8956, 0x8956, 0x1E2A, 0x8957, 0x895C, 0x49C0,\n    0x895D, 0x895D, 0x25BC, 0x895E, 0x895E, 0x1CC3, 0x895F, 0x895F, 0x08C4,\n    0x8960, 0x8960, 0x25BA, 0x8961, 0x8963, 0x49C6, 0x8964, 0x8964, 0x25BF,\n    0x8965, 0x8965, 0x49C9, 0x8966, 0x8966, 0x1BC4, 0x8967, 0x8969, 0x49CA,\n    0x896A, 0x896A, 0x2187, 0x896B, 0x896B, 0x49CD, 0x896C, 0x896C, 0x266B,\n    0x896D, 0x896E, 0x49CE, 0x896F, 0x896F, 0x1E7F, 0x8970, 0x8971, 0x49D0,\n    0x8972, 0x8972, 0x21AD, 0x8973, 0x897A, 0x49D2, 0x897B, 0x897B, 0x1BC5,\n    0x897C, 0x897E, 0x49DA, 0x897F, 0x897F, 0x0F06, 0x8980, 0x8980, 0x49DD,\n    0x8981, 0x8981, 0x1031, 0x8982, 0x8982, 0x49DE, 0x8983, 0x8983, 0x1BDF,\n    0x8984, 0x8985, 0x49DF, 0x8986, 0x8986, 0x06AD, 0x8987, 0x898A, 0x49E1,\n    0x898B, 0x898B, 0x1F96, 0x898C, 0x898E, 0x49E5, 0x898F, 0x898F, 0x1F32,\n    0x8990, 0x8992, 0x49E8, 0x8993, 0x8993, 0x2084, 0x8994, 0x8995, 0x49EB,\n    0x8996, 0x8996, 0x2136, 0x8997, 0x8997, 0x49ED, 0x8998, 0x8998, 0x24B8,\n    0x8999, 0x89A0, 0x49EE, 0x89A1, 0x89A1, 0x24BA, 0x89A2, 0x89A5, 0x49F6,\n    0x89A6, 0x89A6, 0x24BC, 0x89A7, 0x89A9, 0x49FA, 0x89AA, 0x89AA, 0x20E4,\n    0x89AB, 0x89AB, 0x49FD, 0x89AC, 0x89AC, 0x24B9, 0x89AD, 0x89AE, 0x49FE,\n    0x89AF, 0x89AF, 0x24BD, 0x89B0, 0x89B1, 0x4A00, 0x89B2, 0x89B2, 0x24BE,\n    0x89B3, 0x89B6, 0x4A02, 0x89B7, 0x89B7, 0x24BF, 0x89B8, 0x89B9, 0x4A06,\n    0x89BA, 0x89BA, 0x1FD2, 0x89BB, 0x89BC, 0x4A08, 0x89BD, 0x89BD, 0x1FFD,\n    0x89BE, 0x89BE, 0x4A0A, 0x89BF, 0x89BF, 0x24BB, 0x89C0, 0x89C0, 0x1F2D,\n    0x89C1, 0x89C1, 0x086E, 0x89C2, 0x89C2, 0x0734, 0x89C3, 0x89C3, 0x4A0B,\n    0x89C4, 0x89C4, 0x073F, 0x89C5, 0x89C5, 0x0ADE, 0x89C6, 0x89C6, 0x0D6A,\n    0x89C7, 0x89C7, 0x193A, 0x89C8, 0x89C8, 0x09AB, 0x89C9, 0x89C9, 0x0924,\n    0x89CA, 0x89CC, 0x193B, 0x89CD, 0x89CD, 0x4A0C, 0x89CE, 0x89D1, 0x193E,\n    0x89D2, 0x89D2, 0x0898, 0x89D3, 0x89D5, 0x4A0D, 0x89D6, 0x89D6, 0x1D57,\n    0x89D7, 0x89D9, 0x4A10, 0x89DA, 0x89DA, 0x1D59, 0x89DB, 0x89DB, 0x4A13,\n    0x89DC, 0x89DC, 0x1D5A, 0x89DD, 0x89DD, 0x4A14, 0x89DE, 0x89DE, 0x1D58,\n    0x89DF, 0x89E2, 0x4A15, 0x89E3, 0x89E3, 0x08B3, 0x89E4, 0x89E4, 0x4A19,\n    0x89E5, 0x89E5, 0x1D5B, 0x89E6, 0x89E6, 0x0528, 0x89E7, 0x89EA, 0x4A1A,\n    0x89EB, 0x89EB, 0x1D5C, 0x89EC, 0x89EE, 0x4A1E, 0x89EF, 0x89EF, 0x1D5D,\n    0x89F0, 0x89F2, 0x4A21, 0x89F3, 0x89F3, 0x19C0, 0x89F4, 0x89F4, 0x2609,\n    0x89F5, 0x89F5, 0x4A24, 0x89F6, 0x89F6, 0x260A, 0x89F7, 0x89F7, 0x4A25,\n    0x89F8, 0x89F8, 0x1E94, 0x89F9, 0x89FF, 0x4A26, 0x8A00, 0x8A00, 0x0FFD,\n    0x8A01, 0x8A01, 0x22DF, 0x8A02, 0x8A02, 0x1ECB, 0x8A03, 0x8A03, 0x1F0D,\n    0x8A04, 0x8A06, 0x4A2D, 0x8A07, 0x8A07, 0x12FE, 0x8A08, 0x8A08, 0x1F77,\n    0x8A09, 0x8A09, 0x4A30, 0x8A0A, 0x8A0A, 0x21EB, 0x8A0B, 0x8A0B, 0x4A31,\n    0x8A0C, 0x8A0C, 0x22E1, 0x8A0D, 0x8A0D, 0x4A32, 0x8A0E, 0x8A0E, 0x216F,\n    0x8A0F, 0x8A0F, 0x4A33, 0x8A10, 0x8A10, 0x22E0, 0x8A11, 0x8A12, 0x4A34,\n    0x8A13, 0x8A13, 0x21EA, 0x8A14, 0x8A14, 0x4A36, 0x8A15, 0x8A15, 0x22E2,\n    0x8A16, 0x8A16, 0x20CB, 0x8A17, 0x8A17, 0x4A37, 0x8A18, 0x8A18, 0x1F78,\n    0x8A19, 0x8A1A, 0x4A38, 0x8A1B, 0x8A1B, 0x1EE2, 0x8A1C, 0x8A1C, 0x4A3A,\n    0x8A1D, 0x8A1D, 0x21F2, 0x8A1E, 0x8A1E, 0x4A3B, 0x8A1F, 0x8A1F, 0x2150,\n    0x8A20, 0x8A22, 0x4A3C, 0x8A23, 0x8A23, 0x1FD3, 0x8A24, 0x8A24, 0x4A3F,\n    0x8A25, 0x8A25, 0x22E5, 0x8A26, 0x8A29, 0x4A40, 0x8A2A, 0x8A2A, 0x1EF2,\n    0x8A2B, 0x8A2C, 0x4A44, 0x8A2D, 0x8A2D, 0x211F, 0x8A2E, 0x8A30, 0x4A46,\n    0x8A31, 0x8A31, 0x21DD, 0x8A32, 0x8A33, 0x4A49, 0x8A34, 0x8A34, 0x2154,\n    0x8A35, 0x8A35, 0x4A4B, 0x8A36, 0x8A36, 0x22E7, 0x8A37, 0x8A39, 0x4A4C,\n    0x8A3A, 0x8A3A, 0x2282, 0x8A3B, 0x8A3D, 0x4A4F, 0x8A3E, 0x8A3E, 0x1D5E,\n    0x8A3F, 0x8A40, 0x4A52, 0x8A41, 0x8A41, 0x22E6, 0x8A42, 0x8A45, 0x4A54,\n    0x8A46, 0x8A46, 0x22E8, 0x8A47, 0x8A47, 0x4A58, 0x8A48, 0x8A48, 0x1A84,\n    0x8A49, 0x8A4D, 0x4A59, 0x8A4E, 0x8A4E, 0x22E4, 0x8A4F, 0x8A4F, 0x4A5E,\n    0x8A50, 0x8A50, 0x226A, 0x8A51, 0x8A51, 0x4A5F, 0x8A52, 0x8A52, 0x22EB,\n    0x8A53, 0x8A53, 0x4A60, 0x8A54, 0x8A54, 0x22E9, 0x8A55, 0x8A55, 0x20BD,\n    0x8A56, 0x8A57, 0x4A61, 0x8A58, 0x8A58, 0x22EA, 0x8A59, 0x8A5A, 0x4A63,\n    0x8A5B, 0x8A5B, 0x22BD, 0x8A5C, 0x8A5D, 0x4A65, 0x8A5E, 0x8A5E, 0x1E9E,\n    0x8A5F, 0x8A60, 0x4A67, 0x8A61, 0x8A61, 0x22F6, 0x8A62, 0x8A62, 0x21E7,\n    0x8A63, 0x8A63, 0x2216, 0x8A64, 0x8A65, 0x4A69, 0x8A66, 0x8A66, 0x2137,\n    0x8A67, 0x8A68, 0x4A6B, 0x8A69, 0x8A69, 0x212C, 0x8A6A, 0x8A6A, 0x4A6D,\n    0x8A6B, 0x8A6B, 0x1E68, 0x8A6C, 0x8A6C, 0x22F2, 0x8A6D, 0x8A6D, 0x1F37,\n    0x8A6E, 0x8A6E, 0x22F3, 0x8A6F, 0x8A6F, 0x4A6E, 0x8A70, 0x8A70, 0x22EF,\n    0x8A71, 0x8A71, 0x1F50, 0x8A72, 0x8A72, 0x1F10, 0x8A73, 0x8A73, 0x21C8,\n    0x8A74, 0x8A74, 0x4A6F, 0x8A75, 0x8A75, 0x22F1, 0x8A76, 0x8A78, 0x4A70,\n    0x8A79, 0x8A79, 0x1153, 0x8A7A, 0x8A7B, 0x4A73, 0x8A7C, 0x8A7C, 0x22F0,\n    0x8A7D, 0x8A7E, 0x4A75, 0x8A7F, 0x8A7F, 0x22EE, 0x8A80, 0x8A83, 0x4A77,\n    0x8A84, 0x8A84, 0x22ED, 0x8A85, 0x8A85, 0x229E, 0x8A86, 0x8A86, 0x22EC,\n    0x8A87, 0x8A87, 0x1FE2, 0x8A88, 0x8A88, 0x4A7B, 0x8A89, 0x8A89, 0x10E3,\n    0x8A8A, 0x8A8A, 0x0E2F, 0x8A8B, 0x8A8C, 0x4A7C, 0x8A8D, 0x8A8D, 0x20FE,\n    0x8A8E, 0x8A90, 0x4A7E, 0x8A91, 0x8A92, 0x22F9, 0x8A93, 0x8A93, 0x0D5B,\n    0x8A94, 0x8A94, 0x4A81, 0x8A95, 0x8A95, 0x1EAF, 0x8A96, 0x8A97, 0x4A82,\n    0x8A98, 0x8A98, 0x2236, 0x8A99, 0x8A99, 0x4A84, 0x8A9A, 0x8A9A, 0x22F7,\n    0x8A9B, 0x8A9D, 0x4A85, 0x8A9E, 0x8A9E, 0x223D, 0x8A9F, 0x8A9F, 0x4A88,\n    0x8AA0, 0x8AA0, 0x1E82, 0x8AA1, 0x8AA1, 0x1FB6, 0x8AA2, 0x8AA2, 0x4A89,\n    0x8AA3, 0x8AA3, 0x21A4, 0x8AA4, 0x8AA4, 0x21AA, 0x8AA5, 0x8AA5, 0x22F8,\n    0x8AA6, 0x8AA6, 0x2151, 0x8AA7, 0x8AA7, 0x4A8A, 0x8AA8, 0x8AA8, 0x1F60,\n    0x8AA9, 0x8AAB, 0x4A8B, 0x8AAC, 0x8AAC, 0x2147, 0x8AAD, 0x8AAF, 0x4A8E,\n    0x8AB0, 0x8AB0, 0x2145, 0x8AB1, 0x8AB1, 0x4A91, 0x8AB2, 0x8AB2, 0x1FDC,\n    0x8AB3, 0x8AB5, 0x4A92, 0x8AB6, 0x8AB6, 0x2301, 0x8AB7, 0x8AB8, 0x4A95,\n    0x8AB9, 0x8AB9, 0x1EF5, 0x8ABA, 0x8ABB, 0x4A97, 0x8ABC, 0x8ABC, 0x2218,\n    0x8ABD, 0x8ABE, 0x4A99, 0x8ABF, 0x8ABF, 0x1EC6, 0x8AC0, 0x8AC1, 0x4A9B,\n    0x8AC2, 0x8AC2, 0x2300, 0x8AC3, 0x8AC3, 0x4A9D, 0x8AC4, 0x8AC4, 0x22B4,\n    0x8AC5, 0x8AC6, 0x4A9E, 0x8AC7, 0x8AC7, 0x2169, 0x8AC8, 0x8AC8, 0x4AA0,\n    0x8AC9, 0x8AC9, 0x22FD, 0x8ACA, 0x8ACA, 0x4AA1, 0x8ACB, 0x8ACB, 0x20EA,\n    0x8ACC, 0x8ACC, 0x4AA2, 0x8ACD, 0x8ACD, 0x22F4, 0x8ACE, 0x8ACE, 0x4AA3,\n    0x8ACF, 0x8ACF, 0x22FB, 0x8AD0, 0x8AD0, 0x4AA4, 0x8AD1, 0x8AD1, 0x22FC,\n    0x8AD2, 0x8AD2, 0x2027, 0x8AD3, 0x8AD5, 0x4AA5, 0x8AD6, 0x8AD6, 0x2060,\n    0x8AD7, 0x8AD7, 0x22FF, 0x8AD8, 0x8ADA, 0x4AA8, 0x8ADB, 0x8ADB, 0x22FE,\n    0x8ADC, 0x8ADC, 0x1EC7, 0x8ADD, 0x8ADD, 0x4AAB, 0x8ADE, 0x8ADE, 0x230C,\n    0x8ADF, 0x8AE1, 0x4AAC, 0x8AE2, 0x8AE2, 0x22F5, 0x8AE3, 0x8AE3, 0x4AAF,\n    0x8AE4, 0x8AE4, 0x2306, 0x8AE5, 0x8AE5, 0x4AB0, 0x8AE6, 0x8AE6, 0x230A,\n    0x8AE7, 0x8AE7, 0x21D3, 0x8AE8, 0x8AEA, 0x4AB1, 0x8AEB, 0x8AEB, 0x2303,\n    0x8AEC, 0x8AEC, 0x4AB4, 0x8AED, 0x8AED, 0x2307, 0x8AEE, 0x8AEE, 0x230B,\n    0x8AEF, 0x8AF0, 0x4AB5, 0x8AF1, 0x8AF1, 0x1F5F, 0x8AF2, 0x8AF2, 0x4AB7,\n    0x8AF3, 0x8AF3, 0x2309, 0x8AF4, 0x8AF5, 0x4AB8, 0x8AF6, 0x8AF6, 0x2302,\n    0x8AF7, 0x8AF7, 0x1F04, 0x8AF8, 0x8AF8, 0x229D, 0x8AF9, 0x8AF9, 0x4ABA,\n    0x8AFA, 0x8AFA, 0x21FB, 0x8AFB, 0x8AFB, 0x4ABB, 0x8AFC, 0x8AFC, 0x2308,\n    0x8AFD, 0x8AFD, 0x4ABC, 0x8AFE, 0x8AFE, 0x20AC, 0x8AFF, 0x8AFF, 0x4ABD,\n    0x8B00, 0x8B00, 0x208E, 0x8B01, 0x8B01, 0x2305, 0x8B02, 0x8B02, 0x2197,\n    0x8B03, 0x8B03, 0x4ABE, 0x8B04, 0x8B04, 0x2171, 0x8B05, 0x8B05, 0x2298,\n    0x8B06, 0x8B06, 0x4ABF, 0x8B07, 0x8B07, 0x173C, 0x8B08, 0x8B09, 0x4AC0,\n    0x8B0A, 0x8B0A, 0x1F57, 0x8B0B, 0x8B0D, 0x4AC2, 0x8B0E, 0x8B0E, 0x2082,\n    0x8B0F, 0x8B0F, 0x4AC5, 0x8B10, 0x8B10, 0x2311, 0x8B11, 0x8B13, 0x4AC6,\n    0x8B14, 0x8B14, 0x2304, 0x8B15, 0x8B15, 0x4AC9, 0x8B16, 0x8B16, 0x230F,\n    0x8B17, 0x8B17, 0x1E35, 0x8B18, 0x8B18, 0x4ACA, 0x8B19, 0x8B19, 0x20D1,\n    0x8B1A, 0x8B1A, 0x2310, 0x8B1B, 0x8B1B, 0x1FA3, 0x8B1C, 0x8B1C, 0x4ACB,\n    0x8B1D, 0x8B1D, 0x21D6, 0x8B1E, 0x8B20, 0x4ACC, 0x8B21, 0x8B21, 0x2206,\n    0x8B22, 0x8B25, 0x4ACF, 0x8B26, 0x8B26, 0x1D5F, 0x8B27, 0x8B27, 0x4AD3,\n    0x8B28, 0x8B28, 0x230D, 0x8B29, 0x8B2A, 0x4AD4, 0x8B2B, 0x8B2B, 0x2312,\n    0x8B2C, 0x8B2C, 0x208D, 0x8B2D, 0x8B2D, 0x2313, 0x8B2E, 0x8B32, 0x4AD6,\n    0x8B33, 0x8B33, 0x22E3, 0x8B34, 0x8B38, 0x4ADB, 0x8B39, 0x8B39, 0x1FBA,\n    0x8B3A, 0x8B3D, 0x4AE0, 0x8B3E, 0x8B3E, 0x2078, 0x8B3F, 0x8B48, 0x4AE4,\n    0x8B49, 0x8B49, 0x2288, 0x8B4A, 0x8B4D, 0x4AEE, 0x8B4E, 0x8B4E, 0x2316,\n    0x8B4F, 0x8B4F, 0x1F6B, 0x8B50, 0x8B55, 0x4AF2, 0x8B56, 0x8B56, 0x2314,\n    0x8B57, 0x8B57, 0x4AF8, 0x8B58, 0x8B58, 0x2130, 0x8B59, 0x8B59, 0x2315,\n    0x8B5A, 0x8B5A, 0x2168, 0x8B5B, 0x8B5B, 0x4AF9, 0x8B5C, 0x8B5C, 0x20C4,\n    0x8B5D, 0x8B65, 0x4AFA, 0x8B66, 0x8B66, 0x08DE, 0x8B67, 0x8B6A, 0x4B03,\n    0x8B6B, 0x8B6B, 0x2318, 0x8B6C, 0x8B6C, 0x0BC8, 0x8B6D, 0x8B6E, 0x4B07,\n    0x8B6F, 0x8B6F, 0x2219, 0x8B70, 0x8B70, 0x2217, 0x8B71, 0x8B73, 0x4B09,\n    0x8B74, 0x8B74, 0x20D5, 0x8B75, 0x8B76, 0x4B0C, 0x8B77, 0x8B77, 0x1F4A,\n    0x8B78, 0x8B7C, 0x4B0E, 0x8B7D, 0x8B7D, 0x2240, 0x8B7E, 0x8B7F, 0x4B13,\n    0x8B80, 0x8B80, 0x1ED3, 0x8B81, 0x8B89, 0x4B15, 0x8B8A, 0x8B8A, 0x1E49,\n    0x8B8B, 0x8B8D, 0x4B1E, 0x8B8E, 0x8B8E, 0x261B, 0x8B8F, 0x8B91, 0x4B21,\n    0x8B92, 0x8B92, 0x1E6D, 0x8B93, 0x8B93, 0x20F8, 0x8B94, 0x8B94, 0x4B24,\n    0x8B95, 0x8B95, 0x1FFB, 0x8B96, 0x8B96, 0x2319, 0x8B97, 0x8B9B, 0x4B25,\n    0x8B9C, 0x8B9C, 0x230E, 0x8B9D, 0x8B9D, 0x4B2A, 0x8B9E, 0x8B9E, 0x2317,\n    0x8B9F, 0x8B9F, 0x4B2B, 0x8BA0, 0x8BA0, 0x1317, 0x8BA1, 0x8BA1, 0x0839,\n    0x8BA2, 0x8BA2, 0x05E8, 0x8BA3, 0x8BA3, 0x06B7, 0x8BA4, 0x8BA4, 0x0CAA,\n    0x8BA5, 0x8BA5, 0x0818, 0x8BA6, 0x8BA7, 0x1318, 0x8BA8, 0x8BA8, 0x0E29,\n    0x8BA9, 0x8BA9, 0x0C9E, 0x8BAA, 0x8BAA, 0x131A, 0x8BAB, 0x8BAB, 0x0C1C,\n    0x8BAC, 0x8BAC, 0x4B2C, 0x8BAD, 0x8BAD, 0x0FDE, 0x8BAE, 0x8BAE, 0x1070,\n    0x8BAF, 0x8BAF, 0x0FDF, 0x8BB0, 0x8BB0, 0x083A, 0x8BB1, 0x8BB1, 0x4B2D,\n    0x8BB2, 0x8BB2, 0x0883, 0x8BB3, 0x8BB3, 0x07F9, 0x8BB4, 0x8BB5, 0x131B,\n    0x8BB6, 0x8BB6, 0x0FF1, 0x8BB7, 0x8BB7, 0x131D, 0x8BB8, 0x8BB8, 0x0FB8,\n    0x8BB9, 0x8BB9, 0x062E, 0x8BBA, 0x8BBA, 0x0A82, 0x8BBB, 0x8BBB, 0x4B2E,\n    0x8BBC, 0x8BBC, 0x0DC4, 0x8BBD, 0x8BBD, 0x068A, 0x8BBE, 0x8BBE, 0x0D21,\n    0x8BBF, 0x8BBF, 0x0660, 0x8BC0, 0x8BC0, 0x0926, 0x8BC1, 0x8BC1, 0x11A3,\n    0x8BC2, 0x8BC3, 0x131E, 0x8BC4, 0x8BC4, 0x0BDF, 0x8BC5, 0x8BC5, 0x1244,\n    0x8BC6, 0x8BC6, 0x0D4D, 0x8BC7, 0x8BC7, 0x4B2F, 0x8BC8, 0x8BC8, 0x114A,\n    0x8BC9, 0x8BC9, 0x0DD4, 0x8BCA, 0x8BCA, 0x1190, 0x8BCB, 0x8BCB, 0x1320,\n    0x8BCC, 0x8BCC, 0x11DE, 0x8BCD, 0x8BCD, 0x054D, 0x8BCE, 0x8BCE, 0x1322,\n    0x8BCF, 0x8BCF, 0x1321, 0x8BD0, 0x8BD0, 0x4B30, 0x8BD1, 0x8BD1, 0x1072,\n    0x8BD2, 0x8BD4, 0x1323, 0x8BD5, 0x8BD5, 0x0D6B, 0x8BD6, 0x8BD6, 0x1326,\n    0x8BD7, 0x8BD7, 0x0D42, 0x8BD8, 0x8BD9, 0x1327, 0x8BDA, 0x8BDA, 0x04F4,\n    0x8BDB, 0x8BDB, 0x11EE, 0x8BDC, 0x8BDC, 0x1329, 0x8BDD, 0x8BDD, 0x07C5,\n    0x8BDE, 0x8BDE, 0x058F, 0x8BDF, 0x8BE0, 0x132A, 0x8BE1, 0x8BE1, 0x0747,\n    0x8BE2, 0x8BE2, 0x0FD8, 0x8BE3, 0x8BE3, 0x106F, 0x8BE4, 0x8BE4, 0x132C,\n    0x8BE5, 0x8BE5, 0x06BE, 0x8BE6, 0x8BE6, 0x0F57, 0x8BE7, 0x8BE7, 0x04B6,\n    0x8BE8, 0x8BE9, 0x132D, 0x8BEA, 0x8BEA, 0x4B31, 0x8BEB, 0x8BEB, 0x08BC,\n    0x8BEC, 0x8BEC, 0x0EEB, 0x8BED, 0x8BED, 0x10D4, 0x8BEE, 0x8BEE, 0x132F,\n    0x8BEF, 0x8BEF, 0x0F02, 0x8BF0, 0x8BF0, 0x1330, 0x8BF1, 0x8BF1, 0x10BA,\n    0x8BF2, 0x8BF2, 0x07FA, 0x8BF3, 0x8BF3, 0x1331, 0x8BF4, 0x8BF4, 0x0DAA,\n    0x8BF5, 0x8BF5, 0x0DC5, 0x8BF6, 0x8BF6, 0x1332, 0x8BF7, 0x8BF7, 0x0C68,\n    0x8BF8, 0x8BF8, 0x11ED, 0x8BF9, 0x8BF9, 0x1333, 0x8BFA, 0x8BFA, 0x0B76,\n    0x8BFB, 0x8BFB, 0x0600, 0x8BFC, 0x8BFC, 0x1334, 0x8BFD, 0x8BFD, 0x0669,\n    0x8BFE, 0x8BFE, 0x095B, 0x8BFF, 0x8BFF, 0x1335, 0x8C00, 0x8C00, 0x1336,\n    0x8C01, 0x8C01, 0x0DA2, 0x8C02, 0x8C02, 0x1337, 0x8C03, 0x8C03, 0x05D8,\n    0x8C04, 0x8C04, 0x1338, 0x8C05, 0x8C05, 0x0A0B, 0x8C06, 0x8C06, 0x1218,\n    0x8C07, 0x8C07, 0x1339, 0x8C08, 0x8C08, 0x0E0B, 0x8C09, 0x8C09, 0x4B32,\n    0x8C0A, 0x8C0A, 0x1071, 0x8C0B, 0x8C0B, 0x0B14, 0x8C0C, 0x8C0C, 0x133A,\n    0x8C0D, 0x8C0D, 0x05DE, 0x8C0E, 0x8C0E, 0x07E6, 0x8C0F, 0x8C0F, 0x133B,\n    0x8C10, 0x8C10, 0x0F7E, 0x8C11, 0x8C12, 0x133C, 0x8C13, 0x8C13, 0x0ECC,\n    0x8C14, 0x8C16, 0x133E, 0x8C17, 0x8C17, 0x04BE, 0x8C18, 0x8C18, 0x1343,\n    0x8C19, 0x8C19, 0x1341, 0x8C1A, 0x8C1A, 0x1011, 0x8C1B, 0x8C1B, 0x1342,\n    0x8C1C, 0x8C1C, 0x0ADA, 0x8C1D, 0x8C1D, 0x1344, 0x8C1E, 0x8C1E, 0x4B33,\n    0x8C1F, 0x8C21, 0x1345, 0x8C22, 0x8C22, 0x0F86, 0x8C23, 0x8C23, 0x102C,\n    0x8C24, 0x8C24, 0x0404, 0x8C25, 0x8C25, 0x1348, 0x8C26, 0x8C26, 0x0C28,\n    0x8C27, 0x8C27, 0x1349, 0x8C28, 0x8C28, 0x08C8, 0x8C29, 0x8C29, 0x0AA6,\n    0x8C2A, 0x8C2B, 0x134A, 0x8C2C, 0x8C2C, 0x0B02, 0x8C2D, 0x8C2D, 0x0E0A,\n    0x8C2E, 0x8C2F, 0x134C, 0x8C30, 0x8C30, 0x09A9, 0x8C31, 0x8C31, 0x0BF6,\n    0x8C32, 0x8C33, 0x134E, 0x8C34, 0x8C34, 0x0C31, 0x8C35, 0x8C36, 0x1350,\n    0x8C37, 0x8C37, 0x0721, 0x8C38, 0x8C40, 0x4B34, 0x8C41, 0x8C41, 0x0802,\n    0x8C42, 0x8C45, 0x4B3D, 0x8C46, 0x8C46, 0x05F8, 0x8C47, 0x8C47, 0x1CF6,\n    0x8C48, 0x8C48, 0x20C8, 0x8C49, 0x8C49, 0x1CF7, 0x8C4A, 0x8C4B, 0x4B41,\n    0x8C4C, 0x8C4C, 0x0E94, 0x8C4D, 0x8C4F, 0x4B43, 0x8C50, 0x8C50, 0x1EFD,\n    0x8C51, 0x8C54, 0x4B46, 0x8C55, 0x8C55, 0x1D15, 0x8C56, 0x8C59, 0x4B4A,\n    0x8C5A, 0x8C5A, 0x1990, 0x8C5B, 0x8C60, 0x4B4E, 0x8C61, 0x8C61, 0x0F60,\n    0x8C62, 0x8C62, 0x07D4, 0x8C63, 0x8C69, 0x4B54, 0x8C6A, 0x8C6A, 0x0777,\n    0x8C6B, 0x8C6B, 0x10E8, 0x8C6C, 0x8C72, 0x4B5B, 0x8C73, 0x8C73, 0x15DD,\n    0x8C74, 0x8C77, 0x4B62, 0x8C78, 0x8C78, 0x1D50, 0x8C79, 0x8C79, 0x0413,\n    0x8C7A, 0x8C7A, 0x04B9, 0x8C7B, 0x8C81, 0x4B66, 0x8C82, 0x8C82, 0x1D51,\n    0x8C83, 0x8C84, 0x4B6D, 0x8C85, 0x8C85, 0x1D53, 0x8C86, 0x8C88, 0x4B6F,\n    0x8C89, 0x8C89, 0x0788, 0x8C8A, 0x8C8A, 0x1D52, 0x8C8B, 0x8C8B, 0x4B72,\n    0x8C8C, 0x8C8C, 0x0AB7, 0x8C8D, 0x8C93, 0x4B73, 0x8C94, 0x8C94, 0x1D55,\n    0x8C95, 0x8C97, 0x4B7A, 0x8C98, 0x8C98, 0x1D54, 0x8C99, 0x8C9C, 0x4B7D,\n    0x8C9D, 0x8C9D, 0x1E3B, 0x8C9E, 0x8C9E, 0x227F, 0x8C9F, 0x8C9F, 0x4B81,\n    0x8CA0, 0x8CA0, 0x1F0C, 0x8CA1, 0x8CA1, 0x1E59, 0x8CA2, 0x8CA2, 0x1F24,\n    0x8CA3, 0x8CA6, 0x4B82, 0x8CA7, 0x8CA7, 0x20BA, 0x8CA8, 0x8CA8, 0x1F65,\n    0x8CA9, 0x8CA9, 0x1EF0, 0x8CAA, 0x8CAA, 0x2164, 0x8CAB, 0x8CAB, 0x1F30,\n    0x8CAC, 0x8CAC, 0x2261, 0x8CAD, 0x8CAE, 0x4B86, 0x8CAF, 0x8CAF, 0x22A2,\n    0x8CB0, 0x8CB0, 0x24AB, 0x8CB1, 0x8CB1, 0x4B88, 0x8CB2, 0x8CB2, 0x24AF,\n    0x8CB3, 0x8CB3, 0x1EE8, 0x8CB4, 0x8CB4, 0x1F39, 0x8CB5, 0x8CB5, 0x4B89,\n    0x8CB6, 0x8CB6, 0x1E48, 0x8CB7, 0x8CB7, 0x2070, 0x8CB8, 0x8CB8, 0x1EA8,\n    0x8CB9, 0x8CB9, 0x4B8A, 0x8CBA, 0x8CBA, 0x24AC, 0x8CBB, 0x8CBB, 0x1EF7,\n    0x8CBC, 0x8CBC, 0x2176, 0x8CBD, 0x8CBD, 0x24AD, 0x8CBE, 0x8CBE, 0x4B8B,\n    0x8CBF, 0x8CBF, 0x207B, 0x8CC0, 0x8CC0, 0x1F45, 0x8CC1, 0x8CC1, 0x24AA,\n    0x8CC2, 0x8CC2, 0x204B, 0x8CC3, 0x8CC3, 0x202F, 0x8CC4, 0x8CC4, 0x1F5A,\n    0x8CC5, 0x8CC5, 0x24B0, 0x8CC6, 0x8CC6, 0x4B8C, 0x8CC7, 0x8CC7, 0x22B7,\n    0x8CC8, 0x8CC8, 0x1F7F, 0x8CC9, 0x8CC9, 0x4B8D, 0x8CCA, 0x8CCA, 0x2265,\n    0x8CCB, 0x8CD0, 0x4B8E, 0x8CD1, 0x8CD1, 0x24B2, 0x8CD2, 0x8CD2, 0x211B,\n    0x8CD3, 0x8CD3, 0x1E51, 0x8CD4, 0x8CD4, 0x4B94, 0x8CD5, 0x8CD5, 0x24B4,\n    0x8CD6, 0x8CD9, 0x4B95, 0x8CDA, 0x8CDA, 0x24B3, 0x8CDB, 0x8CDB, 0x4B99,\n    0x8CDC, 0x8CDC, 0x1E9F, 0x8CDD, 0x8CDD, 0x4B9A, 0x8CDE, 0x8CDE, 0x2118,\n    0x8CDF, 0x8CDF, 0x4B9B, 0x8CE0, 0x8CE0, 0x20B4, 0x8CE1, 0x8CE1, 0x23AF,\n    0x8CE2, 0x8CE2, 0x21BB, 0x8CE3, 0x8CE3, 0x2072, 0x8CE4, 0x8CE4, 0x1F95,\n    0x8CE5, 0x8CE5, 0x4B9C, 0x8CE6, 0x8CE6, 0x1F0A, 0x8CE7, 0x8CE7, 0x24B6,\n    0x8CE8, 0x8CE9, 0x4B9D, 0x8CEA, 0x8CEA, 0x2291, 0x8CEB, 0x8CEB, 0x24B5,\n    0x8CEC, 0x8CEC, 0x2278, 0x8CED, 0x8CED, 0x1ED4, 0x8CEE, 0x8CF3, 0x4B9F,\n    0x8CF4, 0x8CF4, 0x1FF3, 0x8CF5, 0x8CF9, 0x4BA5, 0x8CFA, 0x8CFA, 0x22A9,\n    0x8CFB, 0x8CFB, 0x24B7, 0x8CFC, 0x8CFC, 0x1F28, 0x8CFD, 0x8CFD, 0x2109,\n    0x8CFE, 0x8CFE, 0x22C7, 0x8CFF, 0x8CFF, 0x4BAA, 0x8D00, 0x8D03, 0x4BAB,\n    0x8D04, 0x8D04, 0x24AE, 0x8D05, 0x8D05, 0x22B1, 0x8D06, 0x8D07, 0x4BAF,\n    0x8D08, 0x8D08, 0x2266, 0x8D09, 0x8D09, 0x4BB1, 0x8D0A, 0x8D0A, 0x225B,\n    0x8D0B, 0x8D0B, 0x22C4, 0x8D0C, 0x8D0C, 0x4BB2, 0x8D0D, 0x8D0D, 0x2115,\n    0x8D0E, 0x8D0E, 0x4BB3, 0x8D0F, 0x8D0F, 0x222A, 0x8D10, 0x8D10, 0x24B1,\n    0x8D11, 0x8D15, 0x4BB4, 0x8D16, 0x8D16, 0x213D, 0x8D17, 0x8D1A, 0x4BB9,\n    0x8D1B, 0x8D1B, 0x1F15, 0x8D1C, 0x8D1C, 0x225C, 0x8D1D, 0x8D1D, 0x041D,\n    0x8D1E, 0x8D1E, 0x118B, 0x8D1F, 0x8D1F, 0x06B5, 0x8D20, 0x8D20, 0x4BBD,\n    0x8D21, 0x8D21, 0x070A, 0x8D22, 0x8D22, 0x048D, 0x8D23, 0x8D23, 0x1133,\n    0x8D24, 0x8D24, 0x0F3A, 0x8D25, 0x8D25, 0x03E7, 0x8D26, 0x8D26, 0x116C,\n    0x8D27, 0x8D27, 0x080A, 0x8D28, 0x8D28, 0x11C9, 0x8D29, 0x8D29, 0x0654,\n    0x8D2A, 0x8D2A, 0x0E03, 0x8D2B, 0x8D2B, 0x0BD5, 0x8D2C, 0x8D2C, 0x044A,\n    0x8D2D, 0x8D2D, 0x0713, 0x8D2E, 0x8D2E, 0x11FB, 0x8D2F, 0x8D2F, 0x073A,\n    0x8D30, 0x8D30, 0x063E, 0x8D31, 0x8D31, 0x086D, 0x8D32, 0x8D33, 0x192C,\n    0x8D34, 0x8D34, 0x0E4C, 0x8D35, 0x8D35, 0x074C, 0x8D36, 0x8D36, 0x192E,\n    0x8D37, 0x8D37, 0x057E, 0x8D38, 0x8D38, 0x0AB8, 0x8D39, 0x8D39, 0x066E,\n    0x8D3A, 0x8D3A, 0x078F, 0x8D3B, 0x8D3B, 0x192F, 0x8D3C, 0x8D3C, 0x1137,\n    0x8D3D, 0x8D3D, 0x1930, 0x8D3E, 0x8D3E, 0x0849, 0x8D3F, 0x8D3F, 0x07F4,\n    0x8D40, 0x8D40, 0x1931, 0x8D41, 0x8D41, 0x0A27, 0x8D42, 0x8D42, 0x0A5F,\n    0x8D43, 0x8D43, 0x1122, 0x8D44, 0x8D44, 0x1227, 0x8D45, 0x8D46, 0x1932,\n    0x8D47, 0x8D47, 0x1936, 0x8D48, 0x8D49, 0x1934, 0x8D4A, 0x8D4A, 0x0D17,\n    0x8D4B, 0x8D4B, 0x06AE, 0x8D4C, 0x8D4C, 0x0603, 0x8D4D, 0x8D4D, 0x1937,\n    0x8D4E, 0x8D4E, 0x0D81, 0x8D4F, 0x8D4F, 0x0D06, 0x8D50, 0x8D50, 0x0550,\n    0x8D51, 0x8D52, 0x4BBE, 0x8D53, 0x8D53, 0x163B, 0x8D54, 0x8D54, 0x0BA3,\n    0x8D55, 0x8D55, 0x1938, 0x8D56, 0x8D56, 0x09A0, 0x8D57, 0x8D57, 0x4BC0,\n    0x8D58, 0x8D58, 0x1215, 0x8D59, 0x8D59, 0x1939, 0x8D5A, 0x8D5A, 0x1209,\n    0x8D5B, 0x8D5B, 0x0CD7, 0x8D5C, 0x8D5C, 0x1289, 0x8D5D, 0x8D5D, 0x1283,\n    0x8D5E, 0x8D5E, 0x1121, 0x8D5F, 0x8D5F, 0x4BC1, 0x8D60, 0x8D60, 0x113C,\n    0x8D61, 0x8D61, 0x0CFD, 0x8D62, 0x8D62, 0x1093, 0x8D63, 0x8D63, 0x06CE,\n    0x8D64, 0x8D64, 0x0505, 0x8D65, 0x8D65, 0x4BC2, 0x8D66, 0x8D66, 0x0D1B,\n    0x8D67, 0x8D67, 0x1CF4, 0x8D68, 0x8D6A, 0x4BC3, 0x8D6B, 0x8D6B, 0x078C,\n    0x8D6C, 0x8D6C, 0x4BC6, 0x8D6D, 0x8D6D, 0x1CF5, 0x8D6E, 0x8D6F, 0x4BC7,\n    0x8D70, 0x8D70, 0x123C, 0x8D71, 0x8D72, 0x4BC9, 0x8D73, 0x8D73, 0x1CEF,\n    0x8D74, 0x8D74, 0x06AB, 0x8D75, 0x8D75, 0x1175, 0x8D76, 0x8D76, 0x06CA,\n    0x8D77, 0x8D77, 0x0C0F, 0x8D78, 0x8D80, 0x4BCB, 0x8D81, 0x8D81, 0x04E8,\n    0x8D82, 0x8D83, 0x4BD4, 0x8D84, 0x8D84, 0x1CF0, 0x8D85, 0x8D85, 0x04D1,\n    0x8D86, 0x8D89, 0x4BD6, 0x8D8A, 0x8D8A, 0x1100, 0x8D8B, 0x8D8B, 0x0C74,\n    0x8D8C, 0x8D90, 0x4BDA, 0x8D91, 0x8D91, 0x1CF2, 0x8D92, 0x8D93, 0x4BDF,\n    0x8D94, 0x8D94, 0x1CF1, 0x8D95, 0x8D95, 0x1F14, 0x8D96, 0x8D98, 0x4BE1,\n    0x8D99, 0x8D99, 0x227A, 0x8D9A, 0x8D9E, 0x4BE4, 0x8D9F, 0x8D9F, 0x0E1E,\n    0x8DA0, 0x8DA2, 0x4BE9, 0x8DA3, 0x8DA3, 0x0C7F, 0x8DA4, 0x8DA7, 0x4BEC,\n    0x8DA8, 0x8DA8, 0x20EE, 0x8DA9, 0x8DB0, 0x4BF0, 0x8DB1, 0x8DB1, 0x1CF3,\n    0x8DB2, 0x8DB2, 0x25F8, 0x8DB3, 0x8DB3, 0x1240, 0x8DB4, 0x8DB4, 0x0B80,\n    0x8DB5, 0x8DB5, 0x1D1C, 0x8DB6, 0x8DB7, 0x4BF8, 0x8DB8, 0x8DB8, 0x1D17,\n    0x8DB9, 0x8DB9, 0x4BFA, 0x8DBA, 0x8DBA, 0x1D1F, 0x8DBB, 0x8DBB, 0x4BFB,\n    0x8DBC, 0x8DBC, 0x1D1E, 0x8DBD, 0x8DBD, 0x4BFC, 0x8DBE, 0x8DBE, 0x11B9,\n    0x8DBF, 0x8DBF, 0x1D1D, 0x8DC0, 0x8DC2, 0x4BFD, 0x8DC3, 0x8DC3, 0x1101,\n    0x8DC4, 0x8DC4, 0x1D20, 0x8DC5, 0x8DC5, 0x4C00, 0x8DC6, 0x8DC6, 0x1D28,\n    0x8DC7, 0x8DCA, 0x4C01, 0x8DCB, 0x8DCB, 0x03DA, 0x8DCC, 0x8DCC, 0x05D9,\n    0x8DCD, 0x8DCD, 0x4C05, 0x8DCE, 0x8DCF, 0x1D25, 0x8DD0, 0x8DD0, 0x4C06,\n    0x8DD1, 0x8DD1, 0x0B9D, 0x8DD2, 0x8DD5, 0x4C07, 0x8DD6, 0x8DD7, 0x1D21,\n    0x8DD8, 0x8DD9, 0x4C0B, 0x8DDA, 0x8DDA, 0x1D23, 0x8DDB, 0x8DDB, 0x1D27,\n    0x8DDC, 0x8DDC, 0x4C0D, 0x8DDD, 0x8DDD, 0x090F, 0x8DDE, 0x8DDE, 0x1D24,\n    0x8DDF, 0x8DDF, 0x06F5, 0x8DE0, 0x8DE2, 0x4C0E, 0x8DE3, 0x8DE3, 0x1D2C,\n    0x8DE4, 0x8DE4, 0x1D2F, 0x8DE5, 0x8DE7, 0x4C11, 0x8DE8, 0x8DE8, 0x0974,\n    0x8DE9, 0x8DE9, 0x4C14, 0x8DEA, 0x8DEA, 0x074B, 0x8DEB, 0x8DEB, 0x1D18,\n    0x8DEC, 0x8DEC, 0x1D29, 0x8DED, 0x8DEE, 0x4C15, 0x8DEF, 0x8DEF, 0x0A5E,\n    0x8DF0, 0x8DF2, 0x4C17, 0x8DF3, 0x8DF3, 0x0E4B, 0x8DF4, 0x8DF4, 0x4C1A,\n    0x8DF5, 0x8DF5, 0x086C, 0x8DF6, 0x8DF6, 0x4C1B, 0x8DF7, 0x8DF8, 0x1D2A,\n    0x8DF9, 0x8DF9, 0x1D2D, 0x8DFA, 0x8DFA, 0x0624, 0x8DFB, 0x8DFB, 0x1D2E,\n    0x8DFC, 0x8DFC, 0x4C1C, 0x8DFD, 0x8DFD, 0x1D31, 0x8DFE, 0x8DFF, 0x4C1D,\n    0x8E00, 0x8E04, 0x4C1F, 0x8E05, 0x8E05, 0x1D19, 0x8E06, 0x8E08, 0x4C24,\n    0x8E09, 0x8E09, 0x1D30, 0x8E0A, 0x8E0A, 0x10A0, 0x8E0B, 0x8E0B, 0x4C27,\n    0x8E0C, 0x8E0C, 0x0511, 0x8E0D, 0x8E0E, 0x4C28, 0x8E0F, 0x8E0F, 0x0DF7,\n    0x8E10, 0x8E10, 0x1F94, 0x8E11, 0x8E13, 0x4C2A, 0x8E14, 0x8E14, 0x1D32,\n    0x8E15, 0x8E1C, 0x4C2D, 0x8E1D, 0x8E1D, 0x1D33, 0x8E1E, 0x8E1E, 0x0910,\n    0x8E1F, 0x8E1F, 0x1D34, 0x8E20, 0x8E21, 0x4C35, 0x8E22, 0x8E22, 0x0E32,\n    0x8E23, 0x8E23, 0x1D37, 0x8E24, 0x8E28, 0x4C37, 0x8E29, 0x8E29, 0x048F,\n    0x8E2A, 0x8E2A, 0x1236, 0x8E2B, 0x8E2B, 0x4C3C, 0x8E2C, 0x8E2C, 0x1D35,\n    0x8E2D, 0x8E2D, 0x4C3D, 0x8E2E, 0x8E2E, 0x1D36, 0x8E2F, 0x8E2F, 0x1D38,\n    0x8E30, 0x8E30, 0x4C3E, 0x8E31, 0x8E31, 0x1D3E, 0x8E32, 0x8E33, 0x4C3F,\n    0x8E34, 0x8E34, 0x2230, 0x8E35, 0x8E35, 0x1D3C, 0x8E36, 0x8E38, 0x4C41,\n    0x8E39, 0x8E39, 0x1D3B, 0x8E3A, 0x8E3A, 0x1D39, 0x8E3B, 0x8E3C, 0x4C44,\n    0x8E3D, 0x8E3D, 0x1D3D, 0x8E3E, 0x8E3F, 0x4C46, 0x8E40, 0x8E40, 0x1D3A,\n    0x8E41, 0x8E42, 0x1D40, 0x8E43, 0x8E43, 0x4C48, 0x8E44, 0x8E44, 0x0E36,\n    0x8E45, 0x8E46, 0x4C49, 0x8E47, 0x8E47, 0x173B, 0x8E48, 0x8E48, 0x0599,\n    0x8E49, 0x8E49, 0x1D3F, 0x8E4A, 0x8E4A, 0x1D44, 0x8E4B, 0x8E4B, 0x0DF6,\n    0x8E4C, 0x8E4C, 0x25FD, 0x8E4D, 0x8E50, 0x4C4B, 0x8E51, 0x8E52, 0x1D42,\n    0x8E53, 0x8E54, 0x4C4F, 0x8E55, 0x8E55, 0x2600, 0x8E56, 0x8E58, 0x4C51,\n    0x8E59, 0x8E59, 0x1D1A, 0x8E5A, 0x8E62, 0x4C54, 0x8E63, 0x8E63, 0x2606,\n    0x8E64, 0x8E65, 0x4C5D, 0x8E66, 0x8E66, 0x042D, 0x8E67, 0x8E68, 0x4C5F,\n    0x8E69, 0x8E69, 0x1D1B, 0x8E6A, 0x8E6B, 0x4C61, 0x8E6C, 0x8E6C, 0x05A6,\n    0x8E6D, 0x8E6D, 0x04AB, 0x8E6E, 0x8E6E, 0x4C63, 0x8E6F, 0x8E6F, 0x1D48,\n    0x8E70, 0x8E70, 0x1D45, 0x8E71, 0x8E71, 0x4C64, 0x8E72, 0x8E72, 0x0616,\n    0x8E73, 0x8E73, 0x4C65, 0x8E74, 0x8E74, 0x1D49, 0x8E75, 0x8E75, 0x4C66,\n    0x8E76, 0x8E76, 0x1D46, 0x8E77, 0x8E79, 0x4C67, 0x8E7A, 0x8E7A, 0x25FF,\n    0x8E7B, 0x8E7B, 0x4C6A, 0x8E7C, 0x8E7C, 0x1D47, 0x8E7D, 0x8E7E, 0x4C6B,\n    0x8E7F, 0x8E7F, 0x055D, 0x8E80, 0x8E80, 0x4C6D, 0x8E81, 0x8E81, 0x112D,\n    0x8E82, 0x8E84, 0x4C6E, 0x8E85, 0x8E85, 0x1D4A, 0x8E86, 0x8E86, 0x4C71,\n    0x8E87, 0x8E87, 0x051E, 0x8E88, 0x8E88, 0x4C72, 0x8E89, 0x8E89, 0x25FC,\n    0x8E8A, 0x8E8A, 0x1E8C, 0x8E8B, 0x8E8B, 0x2602, 0x8E8C, 0x8E8C, 0x4C73,\n    0x8E8D, 0x8E8D, 0x224D, 0x8E8E, 0x8E8E, 0x4C74, 0x8E8F, 0x8E8F, 0x1D4B,\n    0x8E90, 0x8E90, 0x1D4D, 0x8E91, 0x8E91, 0x2604, 0x8E92, 0x8E92, 0x25FE,\n    0x8E93, 0x8E93, 0x2603, 0x8E94, 0x8E94, 0x1D4C, 0x8E95, 0x8E99, 0x4C75,\n    0x8E9A, 0x8E9A, 0x2601, 0x8E9B, 0x8E9B, 0x4C7A, 0x8E9C, 0x8E9C, 0x1D4E,\n    0x8E9D, 0x8E9D, 0x4C7B, 0x8E9E, 0x8E9E, 0x1D4F, 0x8E9F, 0x8EA0, 0x4C7C,\n    0x8EA1, 0x8EA1, 0x2605, 0x8EA2, 0x8EA4, 0x4C7E, 0x8EA5, 0x8EA5, 0x1EA3,\n    0x8EA6, 0x8EA6, 0x2608, 0x8EA7, 0x8EA9, 0x4C81, 0x8EAA, 0x8EAA, 0x2607,\n    0x8EAB, 0x8EAB, 0x0D26, 0x8EAC, 0x8EAC, 0x0703, 0x8EAD, 0x8EAE, 0x4C84,\n    0x8EAF, 0x8EAF, 0x0C78, 0x8EB0, 0x8EB1, 0x4C86, 0x8EB2, 0x8EB2, 0x0622,\n    0x8EB3, 0x8EB9, 0x4C88, 0x8EBA, 0x8EBA, 0x0E1C, 0x8EBB, 0x8EBF, 0x4C8F,\n    0x8EC0, 0x8EC0, 0x20F0, 0x8EC1, 0x8EC9, 0x4C94, 0x8ECA, 0x8ECA, 0x1E7B,\n    0x8ECB, 0x8ECB, 0x2267, 0x8ECC, 0x8ECC, 0x1F36, 0x8ECD, 0x8ECD, 0x1FD6,\n    0x8ECE, 0x8ECE, 0x18F8, 0x8ECF, 0x8ED1, 0x4C9D, 0x8ED2, 0x8ED2, 0x21E0,\n    0x8ED3, 0x8ED3, 0x4CA0, 0x8ED4, 0x8ED4, 0x248C, 0x8ED5, 0x8EDA, 0x4CA1,\n    0x8EDB, 0x8EDB, 0x248D, 0x8EDC, 0x8EDE, 0x4CA7, 0x8EDF, 0x8EDF, 0x2102,\n    0x8EE0, 0x8EE3, 0x4CAA, 0x8EE4, 0x8EE4, 0x2494, 0x8EE5, 0x8EEA, 0x4CAE,\n    0x8EEB, 0x8EEB, 0x2493, 0x8EEC, 0x8EF1, 0x4CB4, 0x8EF2, 0x8EF2, 0x248E,\n    0x8EF3, 0x8EF7, 0x4CBA, 0x8EF8, 0x8EF8, 0x2299, 0x8EF9, 0x8EF9, 0x2491,\n    0x8EFA, 0x8EFA, 0x2496, 0x8EFB, 0x8EFB, 0x248F, 0x8EFC, 0x8EFC, 0x2492,\n    0x8EFD, 0x8EFD, 0x4CBF, 0x8EFE, 0x8EFE, 0x2497, 0x8EFF, 0x8EFF, 0x4CC0,\n    0x8F00, 0x8F02, 0x4CC1, 0x8F03, 0x8F03, 0x1FB1, 0x8F04, 0x8F04, 0x4CC4,\n    0x8F05, 0x8F05, 0x249A, 0x8F06, 0x8F06, 0x4CC5, 0x8F07, 0x8F07, 0x2499,\n    0x8F08, 0x8F08, 0x4CC6, 0x8F09, 0x8F09, 0x2258, 0x8F0A, 0x8F0A, 0x2498,\n    0x8F0B, 0x8F11, 0x4CC7, 0x8F12, 0x8F12, 0x249B, 0x8F13, 0x8F13, 0x4CCE,\n    0x8F14, 0x8F14, 0x1F09, 0x8F15, 0x8F15, 0x20E6, 0x8F16, 0x8F1A, 0x4CCF,\n    0x8F1B, 0x8F1B, 0x2026, 0x8F1C, 0x8F1C, 0x249F, 0x8F1D, 0x8F1D, 0x1F59,\n    0x8F1E, 0x8F1F, 0x249D, 0x8F20, 0x8F24, 0x4CD4, 0x8F25, 0x8F25, 0x1F3B,\n    0x8F26, 0x8F26, 0x249C, 0x8F27, 0x8F28, 0x4CD9, 0x8F29, 0x8F29, 0x1E3A,\n    0x8F2A, 0x8F2A, 0x205B, 0x8F2B, 0x8F2E, 0x4CDB, 0x8F2F, 0x8F2F, 0x1F70,\n    0x8F30, 0x8F32, 0x4CDF, 0x8F33, 0x8F33, 0x24A0, 0x8F34, 0x8F37, 0x4CE2,\n    0x8F38, 0x8F38, 0x213B, 0x8F39, 0x8F3A, 0x4CE6, 0x8F3B, 0x8F3B, 0x1F07,\n    0x8F3C, 0x8F3D, 0x4CE8, 0x8F3E, 0x8F3E, 0x2270, 0x8F3F, 0x8F3F, 0x2237,\n    0x8F40, 0x8F41, 0x4CEA, 0x8F42, 0x8F42, 0x24D2, 0x8F43, 0x8F43, 0x4CEC,\n    0x8F44, 0x8F44, 0x21B3, 0x8F45, 0x8F45, 0x2245, 0x8F46, 0x8F46, 0x24A1,\n    0x8F47, 0x8F48, 0x4CED, 0x8F49, 0x8F49, 0x22A8, 0x8F4A, 0x8F4C, 0x4CEF,\n    0x8F4D, 0x8F4D, 0x227C, 0x8F4E, 0x8F4E, 0x1FB0, 0x8F4F, 0x8F53, 0x4CF2,\n    0x8F54, 0x8F54, 0x24A2, 0x8F55, 0x8F5E, 0x4CF7, 0x8F5F, 0x8F5F, 0x1F46,\n    0x8F60, 0x8F60, 0x4D01, 0x8F61, 0x8F61, 0x2380, 0x8F62, 0x8F62, 0x2495,\n    0x8F63, 0x8F63, 0x4D02, 0x8F64, 0x8F64, 0x2490, 0x8F65, 0x8F65, 0x4D03,\n    0x8F66, 0x8F66, 0x04DA, 0x8F67, 0x8F67, 0x1141, 0x8F68, 0x8F68, 0x0745,\n    0x8F69, 0x8F69, 0x0FC4, 0x8F6A, 0x8F6A, 0x4D04, 0x8F6B, 0x8F6B, 0x18E1,\n    0x8F6C, 0x8F6C, 0x1207, 0x8F6D, 0x8F6D, 0x18E2, 0x8F6E, 0x8F6E, 0x0A7D,\n    0x8F6F, 0x8F6F, 0x0CC8, 0x8F70, 0x8F70, 0x079B, 0x8F71, 0x8F73, 0x18E3,\n    0x8F74, 0x8F74, 0x11E0, 0x8F75, 0x8F76, 0x18E6, 0x8F77, 0x8F77, 0x18E9,\n    0x8F78, 0x8F78, 0x18E8, 0x8F79, 0x8F7A, 0x18EA, 0x8F7B, 0x8F7B, 0x0C5E,\n    0x8F7C, 0x8F7C, 0x18EC, 0x8F7D, 0x8F7D, 0x111B, 0x8F7E, 0x8F7E, 0x18ED,\n    0x8F7F, 0x8F7F, 0x089F, 0x8F80, 0x8F80, 0x4D05, 0x8F81, 0x8F82, 0x18EE,\n    0x8F83, 0x8F83, 0x08A0, 0x8F84, 0x8F84, 0x18F0, 0x8F85, 0x8F85, 0x06A3,\n    0x8F86, 0x8F86, 0x0A07, 0x8F87, 0x8F87, 0x18F1, 0x8F88, 0x8F88, 0x041B,\n    0x8F89, 0x8F89, 0x07E9, 0x8F8A, 0x8F8A, 0x074E, 0x8F8B, 0x8F8B, 0x18F2,\n    0x8F8C, 0x8F8C, 0x4D06, 0x8F8D, 0x8F8F, 0x18F3, 0x8F90, 0x8F90, 0x0695,\n    0x8F91, 0x8F91, 0x0820, 0x8F92, 0x8F92, 0x4D07, 0x8F93, 0x8F93, 0x0D7B,\n    0x8F94, 0x8F94, 0x1574, 0x8F95, 0x8F95, 0x10F2, 0x8F96, 0x8F96, 0x0F2A,\n    0x8F97, 0x8F97, 0x1158, 0x8F98, 0x8F98, 0x18F6, 0x8F99, 0x8F99, 0x117F,\n    0x8F9A, 0x8F9A, 0x18F7, 0x8F9B, 0x8F9B, 0x0F8C, 0x8F9C, 0x8F9C, 0x0715,\n    0x8F9D, 0x8F9D, 0x4D08, 0x8F9E, 0x8F9E, 0x054A, 0x8F9F, 0x8F9F, 0x0442,\n    0x8FA0, 0x8FA2, 0x4D09, 0x8FA3, 0x8FA3, 0x099C, 0x8FA4, 0x8FA5, 0x4D0C,\n    0x8FA6, 0x8FA6, 0x1E30, 0x8FA7, 0x8FA7, 0x4D0E, 0x8FA8, 0x8FA9, 0x044F,\n    0x8FAA, 0x8FAA, 0x4D0F, 0x8FAB, 0x8FAB, 0x0451, 0x8FAC, 0x8FAC, 0x4D10,\n    0x8FAD, 0x8FAD, 0x1E9D, 0x8FAE, 0x8FAE, 0x1E4B, 0x8FAF, 0x8FAF, 0x1E4A,\n    0x8FB0, 0x8FB0, 0x04E2, 0x8FB1, 0x8FB1, 0x0CC3, 0x8FB2, 0x8FB2, 0x20AA,\n    0x8FB3, 0x8FB5, 0x4D11, 0x8FB6, 0x8FB6, 0x173D, 0x8FB7, 0x8FB8, 0x4D14,\n    0x8FB9, 0x8FB9, 0x0448, 0x8FBA, 0x8FBC, 0x4D16, 0x8FBD, 0x8FBD, 0x0A12,\n    0x8FBE, 0x8FBE, 0x0572, 0x8FBF, 0x8FC0, 0x4D19, 0x8FC1, 0x8FC1, 0x0C25,\n    0x8FC2, 0x8FC2, 0x10BD, 0x8FC3, 0x8FC3, 0x4D1B, 0x8FC4, 0x8FC4, 0x0C18,\n    0x8FC5, 0x8FC5, 0x0FE1, 0x8FC6, 0x8FC6, 0x4D1C, 0x8FC7, 0x8FC7, 0x0756,\n    0x8FC8, 0x8FC8, 0x0A9C, 0x8FC9, 0x8FCD, 0x4D1D, 0x8FCE, 0x8FCE, 0x1092,\n    0x8FCF, 0x8FCF, 0x4D22, 0x8FD0, 0x8FD0, 0x110E, 0x8FD1, 0x8FD1, 0x08CD,\n    0x8FD2, 0x8FD2, 0x4D23, 0x8FD3, 0x8FD3, 0x173E, 0x8FD4, 0x8FD4, 0x0652,\n    0x8FD5, 0x8FD5, 0x173F, 0x8FD6, 0x8FD7, 0x4D24, 0x8FD8, 0x8FD8, 0x07CE,\n    0x8FD9, 0x8FD9, 0x1183, 0x8FDA, 0x8FDA, 0x4D26, 0x8FDB, 0x8FDB, 0x08C9,\n    0x8FDC, 0x8FDC, 0x10F9, 0x8FDD, 0x8FDD, 0x0EB4, 0x8FDE, 0x8FDE, 0x09F5,\n    0x8FDF, 0x8FDF, 0x04FE, 0x8FE0, 0x8FE1, 0x4D27, 0x8FE2, 0x8FE2, 0x0E49,\n    0x8FE3, 0x8FE3, 0x4D29, 0x8FE4, 0x8FE4, 0x1742, 0x8FE5, 0x8FE5, 0x1740,\n    0x8FE6, 0x8FE6, 0x1744, 0x8FE7, 0x8FE7, 0x4D2A, 0x8FE8, 0x8FE8, 0x1746,\n    0x8FE9, 0x8FE9, 0x1743, 0x8FEA, 0x8FEA, 0x05B0, 0x8FEB, 0x8FEB, 0x0BE7,\n    0x8FEC, 0x8FEC, 0x4D2B, 0x8FED, 0x8FED, 0x05DD, 0x8FEE, 0x8FEE, 0x1741,\n    0x8FEF, 0x8FEF, 0x4D2C, 0x8FF0, 0x8FF0, 0x0D8D, 0x8FF1, 0x8FF2, 0x4D2D,\n    0x8FF3, 0x8FF3, 0x1745, 0x8FF4, 0x8FF4, 0x267B, 0x8FF5, 0x8FF6, 0x4D2F,\n    0x8FF7, 0x8FF7, 0x0AD9, 0x8FF8, 0x8FF8, 0x042E, 0x8FF9, 0x8FF9, 0x0816,\n    0x8FFA, 0x8FFC, 0x4D31, 0x8FFD, 0x8FFD, 0x1214, 0x8FFE, 0x8FFF, 0x4D34,\n    0x9000, 0x9000, 0x0E7C, 0x9001, 0x9001, 0x0DC2, 0x9002, 0x9002, 0x0D61,\n    0x9003, 0x9003, 0x0E26, 0x9004, 0x9004, 0x1748, 0x9005, 0x9005, 0x1747,\n    0x9006, 0x9006, 0x0B49, 0x9007, 0x9008, 0x4D36, 0x9009, 0x9009, 0x0FCA,\n    0x900A, 0x900A, 0x0FE0, 0x900B, 0x900B, 0x1749, 0x900C, 0x900C, 0x4D38,\n    0x900D, 0x900D, 0x174C, 0x900E, 0x900E, 0x4D39, 0x900F, 0x900F, 0x0E69,\n    0x9010, 0x9010, 0x11EF, 0x9011, 0x9011, 0x174B, 0x9012, 0x9012, 0x05BE,\n    0x9013, 0x9013, 0x4D3A, 0x9014, 0x9014, 0x0E6F, 0x9015, 0x9015, 0x23F2,\n    0x9016, 0x9016, 0x174D, 0x9017, 0x9017, 0x05F9, 0x9018, 0x9018, 0x4D3B,\n    0x9019, 0x9019, 0x227E, 0x901A, 0x901A, 0x0E59, 0x901B, 0x901B, 0x073D,\n    0x901C, 0x901C, 0x4D3C, 0x901D, 0x901D, 0x0D5C, 0x901E, 0x901E, 0x04F6,\n    0x901F, 0x901F, 0x0DCE, 0x9020, 0x9020, 0x112F, 0x9021, 0x9021, 0x174E,\n    0x9022, 0x9022, 0x0687, 0x9023, 0x9023, 0x2019, 0x9024, 0x9025, 0x4D3D,\n    0x9026, 0x9026, 0x174A, 0x9027, 0x902C, 0x4D3F, 0x902D, 0x902D, 0x1751,\n    0x902E, 0x902E, 0x0581, 0x902F, 0x902F, 0x1752, 0x9030, 0x9031, 0x4D45,\n    0x9032, 0x9032, 0x1FBB, 0x9033, 0x9034, 0x4D47, 0x9035, 0x9036, 0x174F,\n    0x9037, 0x9037, 0x4D49, 0x9038, 0x9038, 0x1064, 0x9039, 0x903A, 0x4D4A,\n    0x903B, 0x903B, 0x0A86, 0x903C, 0x903C, 0x042F, 0x903D, 0x903D, 0x4D4C,\n    0x903E, 0x903E, 0x10C7, 0x903F, 0x9040, 0x4D4D, 0x9041, 0x9041, 0x061C,\n    0x9042, 0x9042, 0x0DE1, 0x9043, 0x9043, 0x4D4F, 0x9044, 0x9044, 0x1753,\n    0x9045, 0x9046, 0x4D50, 0x9047, 0x9047, 0x10DB, 0x9048, 0x904A, 0x4D52,\n    0x904B, 0x904B, 0x2253, 0x904C, 0x904C, 0x4D55, 0x904D, 0x904D, 0x0452,\n    0x904E, 0x904E, 0x1F3E, 0x904F, 0x904F, 0x0633, 0x9050, 0x9050, 0x1756,\n    0x9051, 0x9052, 0x1754, 0x9053, 0x9053, 0x05A1, 0x9054, 0x9054, 0x1EA6,\n    0x9055, 0x9055, 0x218E, 0x9056, 0x9056, 0x4D56, 0x9057, 0x9057, 0x104C,\n    0x9058, 0x9058, 0x1758, 0x9059, 0x905A, 0x4D57, 0x905B, 0x905B, 0x175A,\n    0x905C, 0x905C, 0x21EC, 0x905D, 0x905D, 0x4D59, 0x905E, 0x905E, 0x1EBE,\n    0x905F, 0x905F, 0x4D5A, 0x9060, 0x9060, 0x224A, 0x9061, 0x9061, 0x4D5B,\n    0x9062, 0x9062, 0x1759, 0x9063, 0x9063, 0x0C2F, 0x9064, 0x9064, 0x4D5C,\n    0x9065, 0x9065, 0x102A, 0x9066, 0x9067, 0x4D5D, 0x9068, 0x9068, 0x1757,\n    0x9069, 0x9069, 0x2133, 0x906A, 0x906C, 0x4D5F, 0x906D, 0x906D, 0x1125,\n    0x906E, 0x906E, 0x117B, 0x906F, 0x9071, 0x4D62, 0x9072, 0x9072, 0x1E84,\n    0x9073, 0x9073, 0x4D65, 0x9074, 0x9074, 0x175C, 0x9075, 0x9075, 0x124E,\n    0x9076, 0x9076, 0x4D66, 0x9077, 0x9077, 0x20CF, 0x9078, 0x9078, 0x21E2,\n    0x9079, 0x9079, 0x4D67, 0x907A, 0x907A, 0x220F, 0x907B, 0x907B, 0x4D68,\n    0x907C, 0x907C, 0x2029, 0x907D, 0x907D, 0x175D, 0x907E, 0x907E, 0x4D69,\n    0x907F, 0x907F, 0x0445, 0x9080, 0x9080, 0x1024, 0x9081, 0x9081, 0x2073,\n    0x9082, 0x9082, 0x175E, 0x9083, 0x9083, 0x1760, 0x9084, 0x9084, 0x1F55,\n    0x9085, 0x9086, 0x4D6A, 0x9087, 0x9087, 0x23F1, 0x9088, 0x9088, 0x175F,\n    0x9089, 0x9089, 0x4D6C, 0x908A, 0x908A, 0x1E46, 0x908B, 0x908B, 0x1761,\n    0x908C, 0x908E, 0x4D6D, 0x908F, 0x908F, 0x2063, 0x9090, 0x9090, 0x23F3,\n    0x9091, 0x9091, 0x105F, 0x9092, 0x9092, 0x4D70, 0x9093, 0x9093, 0x05AC,\n    0x9094, 0x9094, 0x4D71, 0x9095, 0x9095, 0x1817, 0x9096, 0x9096, 0x4D72,\n    0x9097, 0x9097, 0x1367, 0x9098, 0x9098, 0x4D73, 0x9099, 0x9099, 0x136A,\n    0x909A, 0x909A, 0x4D74, 0x909B, 0x909B, 0x1368, 0x909C, 0x909C, 0x4D75,\n    0x909D, 0x909D, 0x1369, 0x909E, 0x90A0, 0x4D76, 0x90A1, 0x90A1, 0x136C,\n    0x90A2, 0x90A2, 0x0F9A, 0x90A3, 0x90A3, 0x0B2A, 0x90A4, 0x90A5, 0x4D79,\n    0x90A6, 0x90A6, 0x03F9, 0x90A7, 0x90A9, 0x4D7B, 0x90AA, 0x90AA, 0x0F7B,\n    0x90AB, 0x90AB, 0x4D7E, 0x90AC, 0x90AC, 0x136B, 0x90AD, 0x90AD, 0x4D7F,\n    0x90AE, 0x90AE, 0x10AF, 0x90AF, 0x90AF, 0x0761, 0x90B0, 0x90B0, 0x1372,\n    0x90B1, 0x90B1, 0x0C6E, 0x90B2, 0x90B2, 0x4D80, 0x90B3, 0x90B3, 0x136E,\n    0x90B4, 0x90B4, 0x136D, 0x90B5, 0x90B5, 0x0D14, 0x90B6, 0x90B6, 0x136F,\n    0x90B7, 0x90B7, 0x4D81, 0x90B8, 0x90B8, 0x1371, 0x90B9, 0x90B9, 0x123B,\n    0x90BA, 0x90BA, 0x1370, 0x90BB, 0x90BB, 0x0A23, 0x90BC, 0x90BD, 0x4D82,\n    0x90BE, 0x90BE, 0x1375, 0x90BF, 0x90C0, 0x4D84, 0x90C1, 0x90C1, 0x10D9,\n    0x90C2, 0x90C3, 0x4D86, 0x90C4, 0x90C4, 0x1377, 0x90C5, 0x90C5, 0x1374,\n    0x90C6, 0x90C6, 0x4D88, 0x90C7, 0x90C7, 0x1378, 0x90C8, 0x90C9, 0x4D89,\n    0x90CA, 0x90CA, 0x088D, 0x90CB, 0x90CD, 0x4D8B, 0x90CE, 0x90CE, 0x09B4,\n    0x90CF, 0x90CF, 0x1373, 0x90D0, 0x90D0, 0x1376, 0x90D1, 0x90D1, 0x11A2,\n    0x90D2, 0x90D2, 0x4D8E, 0x90D3, 0x90D3, 0x1379, 0x90D4, 0x90D6, 0x4D8F,\n    0x90D7, 0x90D7, 0x137D, 0x90D8, 0x90DA, 0x4D92, 0x90DB, 0x90DB, 0x137E,\n    0x90DC, 0x90DC, 0x137C, 0x90DD, 0x90DD, 0x0779, 0x90DE, 0x90DE, 0x4D95,\n    0x90DF, 0x90DF, 0x231E, 0x90E0, 0x90E0, 0x4D96, 0x90E1, 0x90E1, 0x0931,\n    0x90E2, 0x90E2, 0x137B, 0x90E3, 0x90E5, 0x4D97, 0x90E6, 0x90E6, 0x137A,\n    0x90E7, 0x90E7, 0x110A, 0x90E8, 0x90E8, 0x0486, 0x90E9, 0x90EA, 0x4D9A,\n    0x90EB, 0x90EB, 0x137F, 0x90EC, 0x90EC, 0x4D9C, 0x90ED, 0x90ED, 0x0752,\n    0x90EE, 0x90EE, 0x4D9D, 0x90EF, 0x90EF, 0x1380, 0x90F0, 0x90F3, 0x4D9E,\n    0x90F4, 0x90F4, 0x04E0, 0x90F5, 0x90F5, 0x2233, 0x90F6, 0x90F7, 0x4DA2,\n    0x90F8, 0x90F8, 0x0587, 0x90F9, 0x90FC, 0x4DA4, 0x90FD, 0x90FD, 0x05FB,\n    0x90FE, 0x90FE, 0x1381, 0x90FF, 0x90FF, 0x4DA8, 0x9100, 0x9101, 0x4DA9,\n    0x9102, 0x9102, 0x0634, 0x9103, 0x9103, 0x4DAB, 0x9104, 0x9104, 0x1382,\n    0x9105, 0x9105, 0x4DAC, 0x9106, 0x9106, 0x2320, 0x9107, 0x9108, 0x4DAD,\n    0x9109, 0x9109, 0x21C7, 0x910A, 0x9111, 0x4DAF, 0x9112, 0x9112, 0x22BC,\n    0x9113, 0x9113, 0x4DB7, 0x9114, 0x9114, 0x231C, 0x9115, 0x9115, 0x4DB8,\n    0x9116, 0x9116, 0x2251, 0x9117, 0x9118, 0x4DB9, 0x9119, 0x9119, 0x0432,\n    0x911A, 0x911D, 0x4DBB, 0x911E, 0x911E, 0x1384, 0x911F, 0x9121, 0x4DBF,\n    0x9122, 0x9122, 0x1383, 0x9123, 0x9123, 0x1385, 0x9124, 0x9126, 0x4DC2,\n    0x9127, 0x9127, 0x1EBB, 0x9128, 0x912C, 0x4DC5, 0x912D, 0x912D, 0x2287,\n    0x912E, 0x912E, 0x4DCA, 0x912F, 0x912F, 0x1387, 0x9130, 0x9130, 0x202D,\n    0x9131, 0x9131, 0x1386, 0x9132, 0x9132, 0x1EAB, 0x9133, 0x9133, 0x4DCB,\n    0x9134, 0x9134, 0x231D, 0x9135, 0x9135, 0x4DCC, 0x9136, 0x9136, 0x231F,\n    0x9137, 0x9138, 0x4DCD, 0x9139, 0x9139, 0x1388, 0x913A, 0x913A, 0x231B,\n    0x913B, 0x9142, 0x4DCF, 0x9143, 0x9143, 0x1389, 0x9144, 0x9145, 0x4DD7,\n    0x9146, 0x9146, 0x138A, 0x9147, 0x9147, 0x4DD9, 0x9148, 0x9148, 0x2321,\n    0x9149, 0x9149, 0x10B4, 0x914A, 0x914A, 0x1CF8, 0x914B, 0x914B, 0x0C72,\n    0x914C, 0x914C, 0x1220, 0x914D, 0x914D, 0x0BA5, 0x914E, 0x914F, 0x1CFA,\n    0x9150, 0x9150, 0x1CF9, 0x9151, 0x9151, 0x4DDA, 0x9152, 0x9152, 0x08F5,\n    0x9153, 0x9156, 0x4DDB, 0x9157, 0x9157, 0x0FBA, 0x9158, 0x9159, 0x4DDF,\n    0x915A, 0x915A, 0x0670, 0x915B, 0x915C, 0x4DE1, 0x915D, 0x915D, 0x1110,\n    0x915E, 0x915E, 0x0DFD, 0x915F, 0x9160, 0x4DE3, 0x9161, 0x9161, 0x1CFE,\n    0x9162, 0x9162, 0x1CFD, 0x9163, 0x9163, 0x075F, 0x9164, 0x9164, 0x1CFC,\n    0x9165, 0x9165, 0x0DCB, 0x9166, 0x9168, 0x4DE5, 0x9169, 0x9169, 0x1D00,\n    0x916A, 0x916A, 0x09BD, 0x916B, 0x916B, 0x4DE8, 0x916C, 0x916C, 0x050F,\n    0x916D, 0x916D, 0x4DE9, 0x916E, 0x916E, 0x0E5B, 0x916F, 0x916F, 0x1D01,\n    0x9170, 0x9170, 0x1CFF, 0x9171, 0x9171, 0x0885, 0x9172, 0x9172, 0x1D04,\n    0x9173, 0x9173, 0x4DEA, 0x9174, 0x9174, 0x1D05, 0x9175, 0x9175, 0x089E,\n    0x9176, 0x9176, 0x0ABD, 0x9177, 0x9177, 0x096E, 0x9178, 0x9178, 0x0DD6,\n    0x9179, 0x9179, 0x1D06, 0x917A, 0x917C, 0x4DEB, 0x917D, 0x917E, 0x1D02,\n    0x917F, 0x917F, 0x0B53, 0x9180, 0x9184, 0x4DEE, 0x9185, 0x9185, 0x1D08,\n    0x9186, 0x9186, 0x4DF3, 0x9187, 0x9187, 0x053F, 0x9188, 0x9188, 0x4DF4,\n    0x9189, 0x9189, 0x124A, 0x918A, 0x918A, 0x4DF5, 0x918B, 0x918B, 0x055A,\n    0x918C, 0x918C, 0x1D07, 0x918D, 0x918D, 0x1D0A, 0x918E, 0x918F, 0x4DF6,\n    0x9190, 0x9190, 0x1D09, 0x9191, 0x9191, 0x1D0B, 0x9192, 0x9192, 0x0F9C,\n    0x9193, 0x9195, 0x4DF8, 0x9196, 0x9196, 0x2255, 0x9197, 0x9199, 0x4DFB,\n    0x919A, 0x919A, 0x0AD6, 0x919B, 0x919B, 0x0C84, 0x919C, 0x919C, 0x1E8F,\n    0x919D, 0x91A1, 0x4DFE, 0x91A2, 0x91A3, 0x1D0C, 0x91A4, 0x91A9, 0x4E03,\n    0x91AA, 0x91AA, 0x1D0E, 0x91AB, 0x91AB, 0x220C, 0x91AC, 0x91AC, 0x1FA4,\n    0x91AD, 0x91AF, 0x1D0F, 0x91B0, 0x91B3, 0x4E09, 0x91B4, 0x91B4, 0x1D13,\n    0x91B5, 0x91B5, 0x1D12, 0x91B6, 0x91B9, 0x4E0D, 0x91BA, 0x91BA, 0x1D14,\n    0x91BB, 0x91BF, 0x4E11, 0x91C0, 0x91C0, 0x209B, 0x91C1, 0x91C1, 0x21D8,\n    0x91C2, 0x91C2, 0x4E16, 0x91C3, 0x91C3, 0x25FA, 0x91C4, 0x91C4, 0x4E17,\n    0x91C5, 0x91C5, 0x25F9, 0x91C6, 0x91C6, 0x4E18, 0x91C7, 0x91C7, 0x0490,\n    0x91C8, 0x91C8, 0x4E19, 0x91C9, 0x91C9, 0x10B9, 0x91CA, 0x91CA, 0x0D64,\n    0x91CB, 0x91CB, 0x2134, 0x91CC, 0x91CC, 0x09DA, 0x91CD, 0x91CD, 0x11D7,\n    0x91CE, 0x91CE, 0x1037, 0x91CF, 0x91CF, 0x0A08, 0x91D0, 0x91D0, 0x4E1A,\n    0x91D1, 0x91D1, 0x08C1, 0x91D2, 0x91D4, 0x24F3, 0x91D5, 0x91D5, 0x24F8,\n    0x91D6, 0x91D6, 0x4E1B, 0x91D7, 0x91D7, 0x24F7, 0x91D8, 0x91D8, 0x1EC8,\n    0x91D9, 0x91D9, 0x24F6, 0x91DA, 0x91DB, 0x4E1C, 0x91DC, 0x91DC, 0x06A5,\n    0x91DD, 0x91DD, 0x2280, 0x91DE, 0x91E2, 0x4E1E, 0x91E3, 0x91E3, 0x1EC5,\n    0x91E4, 0x91E4, 0x24FB, 0x91E5, 0x91E6, 0x4E23, 0x91E7, 0x91E7, 0x24FA,\n    0x91E8, 0x91E8, 0x4E25, 0x91E9, 0x91E9, 0x1EED, 0x91EA, 0x91F4, 0x4E26,\n    0x91F5, 0x91F5, 0x24FD, 0x91F6, 0x91F6, 0x4E31, 0x91F7, 0x91F7, 0x24F9,\n    0x91F8, 0x91F8, 0x4E32, 0x91F9, 0x91F9, 0x24FE, 0x91FA, 0x91FA, 0x20CD,\n    0x91FB, 0x91FF, 0x4E33, 0x9200, 0x9200, 0x2508, 0x9201, 0x9201, 0x2504,\n    0x9202, 0x9203, 0x4E38, 0x9204, 0x9204, 0x2506, 0x9205, 0x9207, 0x4E3A,\n    0x9208, 0x9208, 0x24FF, 0x9209, 0x9209, 0x2090, 0x920A, 0x920C, 0x4E3D,\n    0x920D, 0x920D, 0x1EDD, 0x920E, 0x920E, 0x1F25, 0x920F, 0x920F, 0x4E40,\n    0x9210, 0x9210, 0x2503, 0x9211, 0x9211, 0x2502, 0x9212, 0x9213, 0x4E41,\n    0x9214, 0x9214, 0x1E7A, 0x9215, 0x9215, 0x20A6, 0x9216, 0x921D, 0x4E43,\n    0x921E, 0x921E, 0x1FD5, 0x921F, 0x9222, 0x4E4B, 0x9223, 0x9223, 0x1F11,\n    0x9224, 0x9224, 0x4E4F, 0x9225, 0x9225, 0x2507, 0x9226, 0x9226, 0x2500,\n    0x9227, 0x9227, 0x2505, 0x9228, 0x922D, 0x4E50, 0x922E, 0x922E, 0x2519,\n    0x922F, 0x922F, 0x4E56, 0x9230, 0x9230, 0x2515, 0x9231, 0x9232, 0x4E57,\n    0x9233, 0x9233, 0x250C, 0x9234, 0x9234, 0x2031, 0x9235, 0x9236, 0x4E59,\n    0x9237, 0x9237, 0x250B, 0x9238, 0x9238, 0x250F, 0x9239, 0x9239, 0x251A,\n    0x923A, 0x923A, 0x2509, 0x923B, 0x923C, 0x4E5B, 0x923D, 0x923D, 0x250E,\n    0x923E, 0x923E, 0x2234, 0x923F, 0x923F, 0x2513, 0x9240, 0x9240, 0x1F80,\n    0x9241, 0x9244, 0x4E5D, 0x9245, 0x9245, 0x2501, 0x9246, 0x9247, 0x4E61,\n    0x9248, 0x9248, 0x2517, 0x9249, 0x9249, 0x2516, 0x924A, 0x924C, 0x4E63,\n    0x924D, 0x924D, 0x2518, 0x924E, 0x9250, 0x4E66, 0x9251, 0x9251, 0x1E56,\n    0x9252, 0x9254, 0x4E69, 0x9255, 0x9255, 0x250D, 0x9256, 0x9256, 0x4E6C,\n    0x9257, 0x9257, 0x20D3, 0x9258, 0x9259, 0x4E6D, 0x925A, 0x925A, 0x207A,\n    0x925B, 0x925B, 0x20CE, 0x925C, 0x925D, 0x4E6F, 0x925E, 0x925E, 0x2510,\n    0x925F, 0x9261, 0x4E71, 0x9262, 0x9262, 0x1E55, 0x9263, 0x9265, 0x4E74,\n    0x9266, 0x9266, 0x250A, 0x9267, 0x926B, 0x4E77, 0x926C, 0x926D, 0x2511,\n    0x926E, 0x9273, 0x4E7C, 0x9274, 0x9274, 0x086B, 0x9275, 0x9277, 0x4E82,\n    0x9278, 0x9278, 0x1FAA, 0x9279, 0x9279, 0x4E85, 0x927A, 0x927A, 0x251E,\n    0x927B, 0x927B, 0x1F1F, 0x927C, 0x927E, 0x4E86, 0x927F, 0x927F, 0x252D,\n    0x9280, 0x9280, 0x221D, 0x9281, 0x9282, 0x4E89, 0x9283, 0x9283, 0x2532,\n    0x9284, 0x9284, 0x4E8B, 0x9285, 0x9285, 0x217B, 0x9286, 0x928D, 0x4E8C,\n    0x928E, 0x928E, 0x1D80, 0x928F, 0x9290, 0x4E94, 0x9291, 0x9291, 0x21AF,\n    0x9292, 0x9292, 0x4E96, 0x9293, 0x9293, 0x252C, 0x9294, 0x9295, 0x4E97,\n    0x9296, 0x9296, 0x2528, 0x9297, 0x9297, 0x4E99, 0x9298, 0x9298, 0x208C,\n    0x9299, 0x9299, 0x4E9A, 0x929A, 0x929A, 0x252F, 0x929B, 0x929B, 0x4E9B,\n    0x929C, 0x929C, 0x21BC, 0x929D, 0x929F, 0x4E9C, 0x92A0, 0x92A0, 0x251D,\n    0x92A1, 0x92A2, 0x4E9F, 0x92A3, 0x92A3, 0x2535, 0x92A4, 0x92A4, 0x4EA1,\n    0x92A5, 0x92A5, 0x220D, 0x92A6, 0x92A6, 0x2526, 0x92A7, 0x92A7, 0x4EA2,\n    0x92A8, 0x92A8, 0x2534, 0x92A9, 0x92A9, 0x252A, 0x92AA, 0x92AA, 0x251F,\n    0x92AB, 0x92AB, 0x2531, 0x92AC, 0x92AC, 0x251C, 0x92AD, 0x92AD, 0x4EA3,\n    0x92AE, 0x92AE, 0x1D81, 0x92AF, 0x92B0, 0x4EA4, 0x92B1, 0x92B1, 0x2525,\n    0x92B2, 0x92B6, 0x4EA6, 0x92B7, 0x92B7, 0x21CD, 0x92B8, 0x92B8, 0x4EAB,\n    0x92B9, 0x92B9, 0x21DA, 0x92BA, 0x92BA, 0x4EAC, 0x92BB, 0x92BB, 0x2172,\n    0x92BC, 0x92BC, 0x253E, 0x92BD, 0x92C0, 0x4EAD, 0x92C1, 0x92C1, 0x204F,\n    0x92C2, 0x92C2, 0x4EB1, 0x92C3, 0x92C3, 0x2543, 0x92C4, 0x92C4, 0x4EB2,\n    0x92C5, 0x92C5, 0x21D7, 0x92C6, 0x92C6, 0x4EB3, 0x92C7, 0x92C7, 0x1E3C,\n    0x92C8, 0x92C8, 0x1D82, 0x92C9, 0x92CB, 0x4EB4, 0x92CC, 0x92CC, 0x2529,\n    0x92CD, 0x92CE, 0x4EB7, 0x92CF, 0x92CF, 0x2521, 0x92D0, 0x92D1, 0x4EB9,\n    0x92D2, 0x92D2, 0x1EFF, 0x92D3, 0x92DC, 0x4EBB, 0x92DD, 0x92DD, 0x253F,\n    0x92DE, 0x92DE, 0x4EC5, 0x92DF, 0x92DF, 0x2544, 0x92E0, 0x92E2, 0x4EC6,\n    0x92E3, 0x92E3, 0x2523, 0x92E4, 0x92E4, 0x1E90, 0x92E5, 0x92E5, 0x253A,\n    0x92E6, 0x92E6, 0x2545, 0x92E7, 0x92E7, 0x4EC9, 0x92E8, 0x92E8, 0x253D,\n    0x92E9, 0x92E9, 0x4ECA, 0x92EA, 0x92EA, 0x20C1, 0x92EB, 0x92EC, 0x4ECB,\n    0x92ED, 0x92ED, 0x2103, 0x92EE, 0x92EE, 0x2520, 0x92EF, 0x92EF, 0x253C,\n    0x92F0, 0x92F0, 0x253B, 0x92F1, 0x92F1, 0x2538, 0x92F2, 0x92F5, 0x4ECD,\n    0x92F6, 0x92F6, 0x2540, 0x92F7, 0x92F7, 0x4ED1, 0x92F8, 0x92F8, 0x1FCD,\n    0x92F9, 0x92FB, 0x4ED2, 0x92FC, 0x92FC, 0x1F18, 0x92FD, 0x92FF, 0x4ED5,\n    0x9300, 0x9300, 0x4ED8, 0x9301, 0x9301, 0x254B, 0x9302, 0x9305, 0x4ED9,\n    0x9306, 0x9306, 0x2547, 0x9307, 0x9308, 0x254F, 0x9309, 0x930F, 0x4EDD,\n    0x9310, 0x9310, 0x22B0, 0x9311, 0x9311, 0x4EE4, 0x9312, 0x9312, 0x2546,\n    0x9313, 0x9314, 0x4EE5, 0x9315, 0x9315, 0x254C, 0x9316, 0x9317, 0x4EE7,\n    0x9318, 0x9318, 0x1E9A, 0x9319, 0x9319, 0x2552, 0x931A, 0x931A, 0x2530,\n    0x931B, 0x931B, 0x2549, 0x931C, 0x931E, 0x4EE9, 0x931F, 0x931F, 0x2551,\n    0x9320, 0x9320, 0x1ECA, 0x9321, 0x9321, 0x4EEC, 0x9322, 0x9322, 0x20D2,\n    0x9323, 0x9325, 0x4EED, 0x9326, 0x9326, 0x1FB8, 0x9327, 0x9327, 0x4EF0,\n    0x9328, 0x9328, 0x2079, 0x9329, 0x932A, 0x4EF1, 0x932B, 0x932B, 0x21AB,\n    0x932C, 0x932D, 0x4EF3, 0x932E, 0x932E, 0x254D, 0x932F, 0x932F, 0x1EA5,\n    0x9330, 0x9331, 0x4EF5, 0x9332, 0x9332, 0x204C, 0x9333, 0x9333, 0x2080,\n    0x9334, 0x9335, 0x4EF7, 0x9336, 0x9336, 0x266D, 0x9337, 0x9337, 0x4EF9,\n    0x9338, 0x9338, 0x2537, 0x9339, 0x933D, 0x4EFA, 0x933E, 0x933E, 0x1D83,\n    0x933F, 0x933F, 0x4EFF, 0x9340, 0x9340, 0x254A, 0x9341, 0x9341, 0x21B8,\n    0x9342, 0x9342, 0x4F00, 0x9343, 0x9343, 0x254E, 0x9344, 0x9345, 0x4F01,\n    0x9346, 0x9346, 0x24FC, 0x9347, 0x9347, 0x2554, 0x9348, 0x934A, 0x4F03,\n    0x934B, 0x934B, 0x1F3C, 0x934C, 0x934C, 0x4F06, 0x934D, 0x934D, 0x1ED5,\n    0x934E, 0x9353, 0x4F07, 0x9354, 0x9354, 0x2556, 0x9355, 0x9357, 0x4F0D,\n    0x9358, 0x9358, 0x2268, 0x9359, 0x935A, 0x4F10, 0x935B, 0x935B, 0x1ED6,\n    0x935C, 0x9363, 0x4F12, 0x9364, 0x9364, 0x2557, 0x9365, 0x9365, 0x2553,\n    0x9366, 0x9368, 0x4F1A, 0x9369, 0x9369, 0x2548, 0x936A, 0x936A, 0x1D84,\n    0x936B, 0x936B, 0x4F1D, 0x936C, 0x936C, 0x20DC, 0x936D, 0x936F, 0x4F1E,\n    0x9370, 0x9370, 0x2559, 0x9371, 0x9374, 0x4F21, 0x9375, 0x9375, 0x1F97,\n    0x9376, 0x9376, 0x2555, 0x9377, 0x9379, 0x4F25, 0x937A, 0x937A, 0x227D,\n    0x937B, 0x937D, 0x4F28, 0x937E, 0x937E, 0x257E, 0x937F, 0x9381, 0x4F2B,\n    0x9382, 0x9382, 0x207C, 0x9383, 0x9383, 0x4F2E, 0x9384, 0x9384, 0x255A,\n    0x9385, 0x9386, 0x4F2F, 0x9387, 0x9387, 0x255E, 0x9388, 0x9389, 0x4F31,\n    0x938A, 0x938A, 0x1E34, 0x938B, 0x938E, 0x4F33, 0x938F, 0x938F, 0x1D86,\n    0x9390, 0x9395, 0x4F37, 0x9396, 0x9396, 0x215E, 0x9397, 0x9397, 0x4F3D,\n    0x9398, 0x9398, 0x2560, 0x9399, 0x93A1, 0x4F3E, 0x93A2, 0x93A2, 0x21A2,\n    0x93A3, 0x93A3, 0x2354, 0x93A4, 0x93A5, 0x4F47, 0x93A6, 0x93A6, 0x2563,\n    0x93A7, 0x93A7, 0x2527, 0x93A8, 0x93A8, 0x4F49, 0x93A9, 0x93A9, 0x252E,\n    0x93AA, 0x93AA, 0x2558, 0x93AB, 0x93AB, 0x4F4A, 0x93AC, 0x93AC, 0x1F1B,\n    0x93AD, 0x93AD, 0x4F4B, 0x93AE, 0x93AE, 0x2283, 0x93AF, 0x93AF, 0x4F4C,\n    0x93B0, 0x93B0, 0x2564, 0x93B1, 0x93B2, 0x4F4D, 0x93B3, 0x93B3, 0x20A0,\n    0x93B4, 0x93B4, 0x4F4F, 0x93B5, 0x93B5, 0x2565, 0x93B6, 0x93B7, 0x4F50,\n    0x93B8, 0x93B8, 0x2561, 0x93B9, 0x93BE, 0x4F52, 0x93BF, 0x93BF, 0x2562,\n    0x93C0, 0x93C2, 0x4F58, 0x93C3, 0x93C3, 0x256C, 0x93C4, 0x93C6, 0x4F5B,\n    0x93C7, 0x93C7, 0x256D, 0x93C8, 0x93C8, 0x2020, 0x93C9, 0x93C9, 0x4F5E,\n    0x93CA, 0x93CA, 0x1D85, 0x93CB, 0x93CB, 0x4F5F, 0x93CC, 0x93CC, 0x255F,\n    0x93CD, 0x93CD, 0x256A, 0x93CE, 0x93D0, 0x4F60, 0x93D1, 0x93D1, 0x256E,\n    0x93D2, 0x93D5, 0x4F63, 0x93D6, 0x93D6, 0x1E01, 0x93D7, 0x93D7, 0x2539,\n    0x93D8, 0x93D8, 0x255C, 0x93D9, 0x93DB, 0x4F67, 0x93DC, 0x93DD, 0x2568,\n    0x93DE, 0x93DE, 0x256B, 0x93DF, 0x93DF, 0x1E6F, 0x93E0, 0x93E0, 0x4F6A,\n    0x93E1, 0x93E1, 0x1FC4, 0x93E2, 0x93E2, 0x2567, 0x93E3, 0x93E3, 0x4F6B,\n    0x93E4, 0x93E4, 0x255B, 0x93E5, 0x93E7, 0x4F6C, 0x93E8, 0x93E8, 0x261D,\n    0x93E9, 0x93F4, 0x4F6F, 0x93F5, 0x93F5, 0x252B, 0x93F6, 0x93F6, 0x4F7B,\n    0x93F7, 0x93F7, 0x2571, 0x93F8, 0x93F8, 0x4F7C, 0x93F9, 0x93F9, 0x2577,\n    0x93FA, 0x93FF, 0x4F7D, 0x9400, 0x9402, 0x4F83, 0x9403, 0x9403, 0x2522,\n    0x9404, 0x940A, 0x4F86, 0x940B, 0x940B, 0x2533, 0x940C, 0x940F, 0x4F8D,\n    0x9410, 0x9410, 0x202A, 0x9411, 0x9411, 0x4F91, 0x9412, 0x9412, 0x2536,\n    0x9413, 0x9413, 0x2573, 0x9414, 0x9414, 0x256F, 0x9415, 0x9417, 0x4F92,\n    0x9418, 0x9418, 0x2293, 0x9419, 0x9419, 0x2578, 0x941A, 0x941C, 0x4F95,\n    0x941D, 0x941D, 0x2570, 0x941E, 0x941F, 0x4F98, 0x9420, 0x9420, 0x2575,\n    0x9421, 0x9425, 0x4F9A, 0x9426, 0x9427, 0x2541, 0x9428, 0x9428, 0x255D,\n    0x9429, 0x942D, 0x4F9F, 0x942E, 0x942E, 0x201A, 0x942F, 0x9431, 0x4FA4,\n    0x9432, 0x9432, 0x257A, 0x9433, 0x9433, 0x2006, 0x9434, 0x9434, 0x4FA7,\n    0x9435, 0x9435, 0x2177, 0x9436, 0x9437, 0x4FA8, 0x9438, 0x9438, 0x251B,\n    0x9439, 0x9439, 0x4FAA, 0x943A, 0x943A, 0x2524, 0x943B, 0x943D, 0x4FAB,\n    0x943E, 0x943E, 0x1D87, 0x943F, 0x943F, 0x257B, 0x9440, 0x9443, 0x4FAE,\n    0x9444, 0x9444, 0x22A3, 0x9445, 0x9449, 0x4FB2, 0x944A, 0x944A, 0x2579,\n    0x944B, 0x944B, 0x4FB7, 0x944C, 0x944C, 0x2566, 0x944D, 0x9451, 0x4FB8,\n    0x9452, 0x9452, 0x1F93, 0x9453, 0x9453, 0x4FBD, 0x9454, 0x9454, 0x257C,\n    0x9455, 0x945F, 0x4FBE, 0x9460, 0x9460, 0x2514, 0x9461, 0x9462, 0x4FC9,\n    0x9463, 0x9463, 0x257D, 0x9464, 0x9464, 0x4FCB, 0x9465, 0x9465, 0x2572,\n    0x9466, 0x946A, 0x4FCC, 0x946B, 0x946B, 0x1D88, 0x946C, 0x946C, 0x4FD1,\n    0x946D, 0x946D, 0x2574, 0x946E, 0x946F, 0x4FD2, 0x9470, 0x9470, 0x224E,\n    0x9471, 0x9471, 0x4FD4, 0x9472, 0x9472, 0x21C6, 0x9473, 0x9476, 0x4FD5,\n    0x9477, 0x9477, 0x209F, 0x9478, 0x9478, 0x4FD9, 0x9479, 0x9479, 0x2576,\n    0x947A, 0x947B, 0x4FDA, 0x947C, 0x947C, 0x2064, 0x947D, 0x947D, 0x22BF,\n    0x947E, 0x947E, 0x261C, 0x947F, 0x947F, 0x225E, 0x9480, 0x9484, 0x4FDC,\n    0x9485, 0x9487, 0x1A8E, 0x9488, 0x9488, 0x118C, 0x9489, 0x9489, 0x05E3,\n    0x948A, 0x948A, 0x1A92, 0x948B, 0x948B, 0x1A91, 0x948C, 0x948D, 0x1A93,\n    0x948E, 0x948E, 0x0C22, 0x948F, 0x9490, 0x1A95, 0x9491, 0x9491, 0x4FE1,\n    0x9492, 0x9492, 0x064D, 0x9493, 0x9493, 0x05D7, 0x9494, 0x9494, 0x1A97,\n    0x9495, 0x9495, 0x1A99, 0x9496, 0x9496, 0x4FE2, 0x9497, 0x9497, 0x1A98,\n    0x9498, 0x9498, 0x4FE3, 0x9499, 0x9499, 0x06C1, 0x949A, 0x949C, 0x1A9A,\n    0x949D, 0x949D, 0x061A, 0x949E, 0x949E, 0x04D3, 0x949F, 0x949F, 0x11D2,\n    0x94A0, 0x94A0, 0x0B29, 0x94A1, 0x94A1, 0x041E, 0x94A2, 0x94A2, 0x06D1,\n    0x94A3, 0x94A4, 0x1A9D, 0x94A5, 0x94A5, 0x1102, 0x94A6, 0x94A6, 0x0C52,\n    0x94A7, 0x94A7, 0x092A, 0x94A8, 0x94A8, 0x0EE8, 0x94A9, 0x94A9, 0x070C,\n    0x94AA, 0x94AA, 0x1AA0, 0x94AB, 0x94AB, 0x1A9F, 0x94AC, 0x94AC, 0x1AA2,\n    0x94AD, 0x94AD, 0x1AA1, 0x94AE, 0x94AE, 0x0B66, 0x94AF, 0x94B0, 0x1AA3,\n    0x94B1, 0x94B1, 0x0C2B, 0x94B2, 0x94B2, 0x1AA5, 0x94B3, 0x94B3, 0x0C2C,\n    0x94B4, 0x94B4, 0x1AA6, 0x94B5, 0x94B5, 0x046E, 0x94B6, 0x94BA, 0x1AA7,\n    0x94BB, 0x94BB, 0x1247, 0x94BC, 0x94BD, 0x1AAC, 0x94BE, 0x94BE, 0x084B,\n    0x94BF, 0x94BF, 0x1AAE, 0x94C0, 0x94C0, 0x10B0, 0x94C1, 0x94C1, 0x0E4D,\n    0x94C2, 0x94C2, 0x0473, 0x94C3, 0x94C3, 0x0A2E, 0x94C4, 0x94C4, 0x1AAF,\n    0x94C5, 0x94C5, 0x0C23, 0x94C6, 0x94C6, 0x0AB2, 0x94C7, 0x94C7, 0x4FE4,\n    0x94C8, 0x94CE, 0x1AB0, 0x94CF, 0x94CF, 0x4FE5, 0x94D0, 0x94D2, 0x1AB7,\n    0x94D3, 0x94D4, 0x4FE6, 0x94D5, 0x94D7, 0x1ABA, 0x94D8, 0x94D8, 0x1ABE,\n    0x94D9, 0x94D9, 0x1ABD, 0x94DA, 0x94DA, 0x4FE8, 0x94DB, 0x94DB, 0x1ABF,\n    0x94DC, 0x94DC, 0x0E5E, 0x94DD, 0x94DD, 0x0A68, 0x94DE, 0x94E0, 0x1AC0,\n    0x94E1, 0x94E1, 0x1142, 0x94E2, 0x94E2, 0x1AC3, 0x94E3, 0x94E3, 0x0F20,\n    0x94E4, 0x94E5, 0x1AC4, 0x94E6, 0x94E6, 0x4FE9, 0x94E7, 0x94E8, 0x1AC6,\n    0x94E9, 0x94E9, 0x1AC9, 0x94EA, 0x94EA, 0x1AC8, 0x94EB, 0x94EB, 0x1ACA,\n    0x94EC, 0x94EC, 0x06F0, 0x94ED, 0x94ED, 0x0AFF, 0x94EE, 0x94EF, 0x1ACB,\n    0x94F0, 0x94F0, 0x0893, 0x94F1, 0x94F1, 0x1046, 0x94F2, 0x94F2, 0x04C0,\n    0x94F3, 0x94F5, 0x1ACD, 0x94F6, 0x94F6, 0x107F, 0x94F7, 0x94F7, 0x1AD0,\n    0x94F8, 0x94F8, 0x11FC, 0x94F9, 0x94F9, 0x1AD1, 0x94FA, 0x94FA, 0x0BEB,\n    0x94FB, 0x94FB, 0x4FEA, 0x94FC, 0x94FD, 0x1AD2, 0x94FE, 0x94FE, 0x09FD,\n    0x94FF, 0x94FF, 0x1AD4, 0x9500, 0x9500, 0x0F67, 0x9501, 0x9501, 0x0DED,\n    0x9502, 0x9502, 0x1AD6, 0x9503, 0x9503, 0x1AD5, 0x9504, 0x9504, 0x051F,\n    0x9505, 0x9505, 0x0751, 0x9506, 0x9507, 0x1AD7, 0x9508, 0x9508, 0x0FAD,\n    0x9509, 0x950A, 0x1AD9, 0x950B, 0x950B, 0x0683, 0x950C, 0x950C, 0x0F8A,\n    0x950D, 0x950F, 0x1ADB, 0x9510, 0x9510, 0x0CCC, 0x9511, 0x9511, 0x0E33,\n    0x9512, 0x9516, 0x1ADE, 0x9517, 0x9517, 0x1181, 0x9518, 0x9518, 0x1AE3,\n    0x9519, 0x9519, 0x0570, 0x951A, 0x951A, 0x0AAF, 0x951B, 0x951B, 0x1AE4,\n    0x951C, 0x951C, 0x4FEB, 0x951D, 0x951F, 0x1AE5, 0x9520, 0x9520, 0x4FEC,\n    0x9521, 0x9521, 0x0F0C, 0x9522, 0x9522, 0x1AE8, 0x9523, 0x9523, 0x0A87,\n    0x9524, 0x9524, 0x053B, 0x9525, 0x9525, 0x1213, 0x9526, 0x9526, 0x08C6,\n    0x9527, 0x9527, 0x4FED, 0x9528, 0x9528, 0x0F34, 0x9529, 0x9529, 0x1AEB,\n    0x952A, 0x952B, 0x1AE9, 0x952C, 0x952C, 0x1AEC, 0x952D, 0x952D, 0x05E6,\n    0x952E, 0x952E, 0x086F, 0x952F, 0x952F, 0x0911, 0x9530, 0x9530, 0x0AD1,\n    0x9531, 0x9532, 0x1AED, 0x9533, 0x9533, 0x4FEE, 0x9534, 0x9534, 0x1AEF,\n    0x9535, 0x9535, 0x1AF7, 0x9536, 0x9538, 0x1AF0, 0x9539, 0x9539, 0x0C3F,\n    0x953A, 0x953A, 0x1B19, 0x953B, 0x953B, 0x060C, 0x953C, 0x953C, 0x1AF3,\n    0x953D, 0x953D, 0x4FEF, 0x953E, 0x953F, 0x1AF4, 0x9540, 0x9540, 0x0605,\n    0x9541, 0x9541, 0x0AC3, 0x9542, 0x9542, 0x1AF6, 0x9543, 0x9543, 0x4FF0,\n    0x9544, 0x9546, 0x1AF8, 0x9547, 0x9547, 0x1193, 0x9548, 0x9548, 0x4FF1,\n    0x9549, 0x9549, 0x1AFB, 0x954A, 0x954A, 0x0B5A, 0x954B, 0x954B, 0x4FF2,\n    0x954C, 0x954C, 0x1AFC, 0x954D, 0x954D, 0x0B5B, 0x954E, 0x954F, 0x1AFD,\n    0x9550, 0x9550, 0x06DF, 0x9551, 0x9551, 0x0402, 0x9552, 0x9554, 0x1AFF,\n    0x9555, 0x9555, 0x4FF3, 0x9556, 0x9559, 0x1B02, 0x955A, 0x955A, 0x4FF4,\n    0x955B, 0x955B, 0x1B06, 0x955C, 0x955C, 0x08E4, 0x955D, 0x955D, 0x1B09,\n    0x955E, 0x955F, 0x1B07, 0x9560, 0x9560, 0x4FF5, 0x9561, 0x9562, 0x1B0A,\n    0x9563, 0x9563, 0x0A16, 0x9564, 0x956C, 0x1B0C, 0x956D, 0x956D, 0x09C3,\n    0x956E, 0x956E, 0x4FF6, 0x956F, 0x956F, 0x1B15, 0x9570, 0x9570, 0x09F6,\n    0x9571, 0x9573, 0x1B16, 0x9574, 0x9575, 0x4FF7, 0x9576, 0x9576, 0x0F4F,\n    0x9577, 0x9577, 0x1E75, 0x9578, 0x957E, 0x4FF9, 0x957F, 0x957F, 0x04C9,\n    0x9580, 0x9580, 0x207D, 0x9581, 0x9581, 0x5000, 0x9582, 0x9582, 0x23BF,\n    0x9583, 0x9583, 0x2113, 0x9584, 0x9585, 0x5001, 0x9586, 0x9586, 0x23C0,\n    0x9587, 0x9588, 0x5003, 0x9589, 0x9589, 0x1E45, 0x958A, 0x958A, 0x5005,\n    0x958B, 0x958B, 0x1FD8, 0x958C, 0x958C, 0x23C4, 0x958D, 0x958D, 0x5006,\n    0x958E, 0x958E, 0x23C2, 0x958F, 0x958F, 0x2104, 0x9590, 0x9590, 0x5007,\n    0x9591, 0x9591, 0x21BD, 0x9592, 0x9592, 0x5008, 0x9593, 0x9593, 0x1F87,\n    0x9594, 0x9594, 0x23C3, 0x9595, 0x9597, 0x5009, 0x9598, 0x9598, 0x2269,\n    0x9599, 0x95A0, 0x500C, 0x95A1, 0x95A1, 0x1F43, 0x95A2, 0x95A2, 0x5014,\n    0x95A3, 0x95A3, 0x1F1E, 0x95A4, 0x95A4, 0x2679, 0x95A5, 0x95A5, 0x1EEB,\n    0x95A6, 0x95A7, 0x5015, 0x95A8, 0x95A8, 0x1F35, 0x95A9, 0x95A9, 0x208A,\n    0x95AA, 0x95AA, 0x5017, 0x95AB, 0x95AB, 0x23C7, 0x95AC, 0x95AC, 0x23C9,\n    0x95AD, 0x95AD, 0x23C6, 0x95AE, 0x95B1, 0x5018, 0x95B2, 0x95B2, 0x224F,\n    0x95B3, 0x95B5, 0x501C, 0x95B6, 0x95B6, 0x23CB, 0x95B7, 0x95B8, 0x501F,\n    0x95B9, 0x95B9, 0x21F3, 0x95BA, 0x95BA, 0x5021, 0x95BB, 0x95BB, 0x21F7,\n    0x95BC, 0x95BC, 0x23CF, 0x95BD, 0x95BD, 0x23CE, 0x95BE, 0x95BE, 0x23CA,\n    0x95BF, 0x95BF, 0x23CD, 0x95C0, 0x95C2, 0x5022, 0x95C3, 0x95C3, 0x23D0,\n    0x95C4, 0x95C5, 0x5025, 0x95C6, 0x95C6, 0x266C, 0x95C7, 0x95C7, 0x5027,\n    0x95C8, 0x95C8, 0x23C1, 0x95C9, 0x95C9, 0x5028, 0x95CA, 0x95CA, 0x1FEE,\n    0x95CB, 0x95CB, 0x23D1, 0x95CC, 0x95CC, 0x1FF8, 0x95CD, 0x95CF, 0x5029,\n    0x95D0, 0x95D0, 0x23D3, 0x95D1, 0x95D3, 0x502C, 0x95D4, 0x95D4, 0x23D2,\n    0x95D5, 0x95D5, 0x23D4, 0x95D6, 0x95D6, 0x1E98, 0x95D7, 0x95DB, 0x502F,\n    0x95DC, 0x95DC, 0x1F2C, 0x95DD, 0x95DD, 0x5034, 0x95DE, 0x95DE, 0x23D5,\n    0x95DF, 0x95E0, 0x5035, 0x95E1, 0x95E1, 0x1E71, 0x95E2, 0x95E2, 0x2691,\n    0x95E3, 0x95E4, 0x5037, 0x95E5, 0x95E5, 0x23C5, 0x95E6, 0x95E7, 0x5039,\n    0x95E8, 0x95E8, 0x0ACA, 0x95E9, 0x95E9, 0x1685, 0x95EA, 0x95EA, 0x0CFA,\n    0x95EB, 0x95EB, 0x1686, 0x95EC, 0x95EC, 0x503B, 0x95ED, 0x95ED, 0x043E,\n    0x95EE, 0x95EE, 0x0ED9, 0x95EF, 0x95EF, 0x0536, 0x95F0, 0x95F0, 0x0CCD,\n    0x95F1, 0x95F1, 0x1687, 0x95F2, 0x95F2, 0x0F3D, 0x95F3, 0x95F3, 0x1688,\n    0x95F4, 0x95F4, 0x0857, 0x95F5, 0x95F6, 0x1689, 0x95F7, 0x95F7, 0x0ACB,\n    0x95F8, 0x95F8, 0x1143, 0x95F9, 0x95F9, 0x0B39, 0x95FA, 0x95FA, 0x0744,\n    0x95FB, 0x95FB, 0x0ED4, 0x95FC, 0x95FC, 0x168B, 0x95FD, 0x95FD, 0x0AFB,\n    0x95FE, 0x95FE, 0x168C, 0x95FF, 0x95FF, 0x503C, 0x9600, 0x9600, 0x0644,\n    0x9601, 0x9601, 0x06EE, 0x9602, 0x9602, 0x0789, 0x9603, 0x9604, 0x168D,\n    0x9605, 0x9605, 0x1107, 0x9606, 0x9606, 0x168F, 0x9607, 0x9607, 0x503D,\n    0x9608, 0x9608, 0x1690, 0x9609, 0x9609, 0x0FF4, 0x960A, 0x960D, 0x1691,\n    0x960E, 0x960E, 0x0FFF, 0x960F, 0x960F, 0x1695, 0x9610, 0x9610, 0x04C2,\n    0x9611, 0x9611, 0x09A6, 0x9612, 0x9612, 0x1696, 0x9613, 0x9613, 0x503E,\n    0x9614, 0x9614, 0x0996, 0x9615, 0x9617, 0x1697, 0x9618, 0x9618, 0x503F,\n    0x9619, 0x961A, 0x169A, 0x961B, 0x961B, 0x5040, 0x961C, 0x961C, 0x06B2,\n    0x961D, 0x961D, 0x1354, 0x961E, 0x961E, 0x5041, 0x961F, 0x961F, 0x0612,\n    0x9620, 0x9620, 0x5042, 0x9621, 0x9621, 0x1356, 0x9622, 0x9622, 0x1355,\n    0x9623, 0x9629, 0x5043, 0x962A, 0x962A, 0x1358, 0x962B, 0x962D, 0x504A,\n    0x962E, 0x962E, 0x0CC9, 0x962F, 0x9630, 0x504D, 0x9631, 0x9631, 0x1357,\n    0x9632, 0x9632, 0x065D, 0x9633, 0x9633, 0x101D, 0x9634, 0x9634, 0x107C,\n    0x9635, 0x9635, 0x1194, 0x9636, 0x9636, 0x08A8, 0x9637, 0x963A, 0x504F,\n    0x963B, 0x963B, 0x1245, 0x963C, 0x963C, 0x135A, 0x963D, 0x963D, 0x1359,\n    0x963E, 0x963E, 0x5053, 0x963F, 0x963F, 0x03AD, 0x9640, 0x9640, 0x0E84,\n    0x9641, 0x9641, 0x5054, 0x9642, 0x9642, 0x135B, 0x9643, 0x9643, 0x5055,\n    0x9644, 0x9644, 0x06B8, 0x9645, 0x9645, 0x083D, 0x9646, 0x9646, 0x0A64,\n    0x9647, 0x9647, 0x0A4B, 0x9648, 0x9648, 0x04E7, 0x9649, 0x9649, 0x135C,\n    0x964A, 0x964A, 0x5056, 0x964B, 0x964B, 0x0A51, 0x964C, 0x964C, 0x0B13,\n    0x964D, 0x964D, 0x0886, 0x964E, 0x964F, 0x5057, 0x9650, 0x9650, 0x0F4B,\n    0x9651, 0x9653, 0x5059, 0x9654, 0x9654, 0x135D, 0x9655, 0x9655, 0x0CFB,\n    0x9656, 0x9657, 0x505C, 0x9658, 0x9658, 0x231A, 0x9659, 0x965A, 0x505E,\n    0x965B, 0x965B, 0x0446, 0x965C, 0x965C, 0x5060, 0x965D, 0x965D, 0x2114,\n    0x965E, 0x965E, 0x5061, 0x965F, 0x965F, 0x135E, 0x9660, 0x9660, 0x5062,\n    0x9661, 0x9661, 0x05F7, 0x9662, 0x9662, 0x10FD, 0x9663, 0x9663, 0x2284,\n    0x9664, 0x9664, 0x0522, 0x9665, 0x9666, 0x5063, 0x9667, 0x9667, 0x135F,\n    0x9668, 0x9668, 0x110C, 0x9669, 0x9669, 0x0F42, 0x966A, 0x966A, 0x0BA4,\n    0x966B, 0x966B, 0x5065, 0x966C, 0x966C, 0x1360, 0x966D, 0x966F, 0x5066,\n    0x9670, 0x9670, 0x221C, 0x9671, 0x9671, 0x5069, 0x9672, 0x9672, 0x1361,\n    0x9673, 0x9673, 0x1E7E, 0x9674, 0x9674, 0x1362, 0x9675, 0x9675, 0x0A33,\n    0x9676, 0x9676, 0x0E28, 0x9677, 0x9677, 0x0F4A, 0x9678, 0x9678, 0x204D,\n    0x9679, 0x967C, 0x506A, 0x967D, 0x967D, 0x2201, 0x967E, 0x9684, 0x506E,\n    0x9685, 0x9685, 0x10CC, 0x9686, 0x9686, 0x0A48, 0x9687, 0x9687, 0x5075,\n    0x9688, 0x9688, 0x1363, 0x9689, 0x9689, 0x5076, 0x968A, 0x968A, 0x1ED9,\n    0x968B, 0x968B, 0x0DDA, 0x968C, 0x968C, 0x5077, 0x968D, 0x968D, 0x1364,\n    0x968E, 0x968E, 0x1FB2, 0x968F, 0x968F, 0x0DDB, 0x9690, 0x9690, 0x1085,\n    0x9691, 0x9693, 0x5078, 0x9694, 0x9694, 0x06EF, 0x9695, 0x9695, 0x2252,\n    0x9696, 0x9696, 0x507B, 0x9697, 0x9697, 0x1365, 0x9698, 0x9698, 0x03BA,\n    0x9699, 0x9699, 0x0F23, 0x969A, 0x969A, 0x507C, 0x969B, 0x969B, 0x1F79,\n    0x969C, 0x969C, 0x1170, 0x969D, 0x96A6, 0x507D, 0x96A7, 0x96A7, 0x0DE2,\n    0x96A8, 0x96A8, 0x2157, 0x96A9, 0x96A9, 0x5087, 0x96AA, 0x96AA, 0x21BF,\n    0x96AB, 0x96AF, 0x5088, 0x96B0, 0x96B0, 0x1366, 0x96B1, 0x96B1, 0x221F,\n    0x96B2, 0x96B2, 0x508D, 0x96B3, 0x96B3, 0x1684, 0x96B4, 0x96B4, 0x203D,\n    0x96B5, 0x96B5, 0x508E, 0x96B6, 0x96B6, 0x09EE, 0x96B7, 0x96B7, 0x508F,\n    0x96B8, 0x96B8, 0x2015, 0x96B9, 0x96B9, 0x1D79, 0x96BA, 0x96BA, 0x5090,\n    0x96BB, 0x96BB, 0x26A5, 0x96BC, 0x96BD, 0x1D7A, 0x96BE, 0x96BE, 0x0B34,\n    0x96BF, 0x96BF, 0x5091, 0x96C0, 0x96C0, 0x0C93, 0x96C1, 0x96C1, 0x100C,\n    0x96C2, 0x96C3, 0x5092, 0x96C4, 0x96C4, 0x0FA6, 0x96C5, 0x96C5, 0x0FEE,\n    0x96C6, 0x96C6, 0x0822, 0x96C7, 0x96C7, 0x0726, 0x96C8, 0x96C8, 0x5094,\n    0x96C9, 0x96C9, 0x1B1C, 0x96CA, 0x96CB, 0x5095, 0x96CC, 0x96CC, 0x0549,\n    0x96CD, 0x96CD, 0x109F, 0x96CE, 0x96CE, 0x1D7C, 0x96CF, 0x96CF, 0x0520,\n    0x96D0, 0x96D1, 0x5097, 0x96D2, 0x96D2, 0x1D7D, 0x96D3, 0x96D4, 0x5099,\n    0x96D5, 0x96D5, 0x05D2, 0x96D6, 0x96D6, 0x2156, 0x96D7, 0x96D8, 0x509B,\n    0x96D9, 0x96D9, 0x2144, 0x96DA, 0x96DA, 0x509D, 0x96DB, 0x96DB, 0x1E91,\n    0x96DC, 0x96DC, 0x2257, 0x96DD, 0x96DF, 0x509E, 0x96E0, 0x96E0, 0x1D7F,\n    0x96E1, 0x96E1, 0x50A1, 0x96E2, 0x96E2, 0x200A, 0x96E3, 0x96E3, 0x2092,\n    0x96E4, 0x96E7, 0x50A2, 0x96E8, 0x96E8, 0x10CF, 0x96E9, 0x96E9, 0x1D61,\n    0x96EA, 0x96EA, 0x0FD2, 0x96EB, 0x96EE, 0x50A6, 0x96EF, 0x96EF, 0x1D63,\n    0x96F0, 0x96F1, 0x50AA, 0x96F2, 0x96F2, 0x2250, 0x96F3, 0x96F3, 0x1D62,\n    0x96F4, 0x96F5, 0x50AC, 0x96F6, 0x96F6, 0x0A2C, 0x96F7, 0x96F7, 0x09C2,\n    0x96F8, 0x96F8, 0x50AE, 0x96F9, 0x96F9, 0x040B, 0x96FA, 0x96FA, 0x50AF,\n    0x96FB, 0x96FB, 0x1EC3, 0x96FC, 0x96FD, 0x50B0, 0x96FE, 0x96FE, 0x0EFC,\n    0x96FF, 0x96FF, 0x50B2, 0x9700, 0x9700, 0x0FB3, 0x9701, 0x9701, 0x1D65,\n    0x9702, 0x9703, 0x50B3, 0x9704, 0x9704, 0x0F63, 0x9705, 0x9705, 0x50B5,\n    0x9706, 0x9706, 0x1D64, 0x9707, 0x9707, 0x1191, 0x9708, 0x9708, 0x1D66,\n    0x9709, 0x9709, 0x0ABE, 0x970A, 0x970C, 0x50B6, 0x970D, 0x970D, 0x0809,\n    0x970E, 0x970E, 0x1D68, 0x970F, 0x970F, 0x1D67, 0x9710, 0x9712, 0x50B9,\n    0x9713, 0x9713, 0x0B41, 0x9714, 0x9715, 0x50BC, 0x9716, 0x9716, 0x0A21,\n    0x9717, 0x971B, 0x50BE, 0x971C, 0x971C, 0x0D9F, 0x971D, 0x971D, 0x50C3,\n    0x971E, 0x971E, 0x0F29, 0x971F, 0x9726, 0x50C4, 0x9727, 0x9727, 0x21A8,\n    0x9728, 0x9729, 0x50CC, 0x972A, 0x972A, 0x1D69, 0x972B, 0x972C, 0x50CE,\n    0x972D, 0x972D, 0x1D6A, 0x972E, 0x972F, 0x50D0, 0x9730, 0x9730, 0x1D6B,\n    0x9731, 0x9731, 0x50D2, 0x9732, 0x9732, 0x0A5D, 0x9733, 0x9737, 0x50D3,\n    0x9738, 0x9738, 0x03DF, 0x9739, 0x9739, 0x0BBA, 0x973A, 0x973C, 0x50D8,\n    0x973D, 0x973D, 0x260D, 0x973E, 0x973E, 0x1D6C, 0x973F, 0x9741, 0x50DB,\n    0x9742, 0x9742, 0x260C, 0x9743, 0x9743, 0x50DE, 0x9744, 0x9744, 0x260E,\n    0x9745, 0x9747, 0x50DF, 0x9748, 0x9748, 0x2032, 0x9749, 0x9751, 0x50E2,\n    0x9752, 0x9752, 0x0C5D, 0x9753, 0x9753, 0x1D60, 0x9754, 0x9755, 0x50EB,\n    0x9756, 0x9756, 0x08E7, 0x9757, 0x9758, 0x50ED, 0x9759, 0x9759, 0x08E1,\n    0x975A, 0x975A, 0x260B, 0x975B, 0x975B, 0x05C6, 0x975C, 0x975D, 0x50EF,\n    0x975E, 0x975E, 0x0664, 0x975F, 0x975F, 0x50F1, 0x9760, 0x9760, 0x094C,\n    0x9761, 0x9761, 0x0AD7, 0x9762, 0x9762, 0x0AEB, 0x9763, 0x9764, 0x50F2,\n    0x9765, 0x9765, 0x1282, 0x9766, 0x9767, 0x50F4, 0x9768, 0x9768, 0x22C3,\n    0x9769, 0x9769, 0x06EA, 0x976A, 0x9772, 0x50F6, 0x9773, 0x9773, 0x08CA,\n    0x9774, 0x9774, 0x0FCE, 0x9775, 0x9775, 0x50FF, 0x9776, 0x9776, 0x03DB,\n    0x9777, 0x977B, 0x5100, 0x977C, 0x977C, 0x1DC8, 0x977D, 0x9784, 0x5105,\n    0x9785, 0x9785, 0x1DC9, 0x9786, 0x978A, 0x510D, 0x978B, 0x978B, 0x0F77,\n    0x978C, 0x978C, 0x5112, 0x978D, 0x978D, 0x03BB, 0x978E, 0x978E, 0x5113,\n    0x978F, 0x978F, 0x1F23, 0x9790, 0x9790, 0x5114, 0x9791, 0x9792, 0x1DCA,\n    0x9793, 0x9793, 0x5115, 0x9794, 0x9794, 0x1DCC, 0x9795, 0x9797, 0x5116,\n    0x9798, 0x9798, 0x0C47, 0x9799, 0x979F, 0x5119, 0x97A0, 0x97A0, 0x08FE,\n    0x97A1, 0x97A2, 0x5120, 0x97A3, 0x97A3, 0x1DCF, 0x97A4, 0x97A5, 0x5122,\n    0x97A6, 0x97A6, 0x2695, 0x97A7, 0x97AA, 0x5124, 0x97AB, 0x97AB, 0x1DCE,\n    0x97AC, 0x97AC, 0x5128, 0x97AD, 0x97AD, 0x0447, 0x97AE, 0x97AE, 0x5129,\n    0x97AF, 0x97AF, 0x1DCD, 0x97B0, 0x97B1, 0x512A, 0x97B2, 0x97B2, 0x1DD0,\n    0x97B3, 0x97B3, 0x512C, 0x97B4, 0x97B4, 0x1DD1, 0x97B5, 0x97BC, 0x512D,\n    0x97BD, 0x97BD, 0x265E, 0x97BE, 0x97C2, 0x5135, 0x97C3, 0x97C3, 0x265D,\n    0x97C4, 0x97C5, 0x513A, 0x97C6, 0x97C6, 0x2692, 0x97C7, 0x97C8, 0x513C,\n    0x97C9, 0x97C9, 0x265F, 0x97CA, 0x97CA, 0x513E, 0x97CB, 0x97CB, 0x218D,\n    0x97CC, 0x97CC, 0x20FD, 0x97CD, 0x97D2, 0x513F, 0x97D3, 0x97D3, 0x1F40,\n    0x97D4, 0x97D8, 0x5145, 0x97D9, 0x97D9, 0x2465, 0x97DA, 0x97DB, 0x514A,\n    0x97DC, 0x97DC, 0x2467, 0x97DD, 0x97DD, 0x514C, 0x97DE, 0x97DE, 0x2466,\n    0x97DF, 0x97E5, 0x514D, 0x97E6, 0x97E6, 0x0EB3, 0x97E7, 0x97E7, 0x0CA8,\n    0x97E8, 0x97E8, 0x5154, 0x97E9, 0x97E9, 0x0762, 0x97EA, 0x97EC, 0x184E,\n    0x97ED, 0x97ED, 0x08F1, 0x97EE, 0x97F2, 0x5155, 0x97F3, 0x97F3, 0x107B,\n    0x97F4, 0x97F4, 0x515A, 0x97F5, 0x97F5, 0x1112, 0x97F6, 0x97F6, 0x0D11,\n    0x97F7, 0x97FE, 0x515B, 0x97FF, 0x97FF, 0x21C9, 0x9800, 0x9800, 0x5163,\n    0x9801, 0x9801, 0x2209, 0x9802, 0x9802, 0x1EC9, 0x9803, 0x9803, 0x20E9,\n    0x9804, 0x9804, 0x5164, 0x9805, 0x9805, 0x21CA, 0x9806, 0x9806, 0x2146,\n    0x9807, 0x9807, 0x25C5, 0x9808, 0x9808, 0x21DC, 0x9809, 0x9809, 0x5165,\n    0x980A, 0x980A, 0x245E, 0x980B, 0x980B, 0x5166, 0x980C, 0x980C, 0x214F,\n    0x980D, 0x980D, 0x5167, 0x980E, 0x980F, 0x25C6, 0x9810, 0x9810, 0x2241,\n    0x9811, 0x9811, 0x218A, 0x9812, 0x9812, 0x1E2F, 0x9813, 0x9813, 0x1EDC,\n    0x9814, 0x9816, 0x5168, 0x9817, 0x9817, 0x20BF, 0x9818, 0x9818, 0x2034,\n    0x9819, 0x981B, 0x516B, 0x981C, 0x981C, 0x25C9, 0x981D, 0x9820, 0x516E,\n    0x9821, 0x9821, 0x25C8, 0x9822, 0x9823, 0x5172, 0x9824, 0x9824, 0x220E,\n    0x9825, 0x9825, 0x5174, 0x9826, 0x9826, 0x25CB, 0x9827, 0x982C, 0x5175,\n    0x982D, 0x982D, 0x217D, 0x982E, 0x982F, 0x517B, 0x9830, 0x9830, 0x1F7E,\n    0x9831, 0x9836, 0x517D, 0x9837, 0x9837, 0x25CC, 0x9838, 0x9838, 0x1FC3,\n    0x9839, 0x983A, 0x5183, 0x983B, 0x983B, 0x20B9, 0x983C, 0x983C, 0x5185,\n    0x983D, 0x983D, 0x2181, 0x983E, 0x9845, 0x5186, 0x9846, 0x9846, 0x1FDA,\n    0x9847, 0x984B, 0x518E, 0x984C, 0x984C, 0x2173, 0x984D, 0x984D, 0x1EE1,\n    0x984E, 0x984E, 0x25CD, 0x984F, 0x9852, 0x5193, 0x9853, 0x9853, 0x25CE,\n    0x9854, 0x9854, 0x21F6, 0x9855, 0x9857, 0x5197, 0x9858, 0x9858, 0x224B,\n    0x9859, 0x9859, 0x25D1, 0x985A, 0x985A, 0x519A, 0x985B, 0x985B, 0x1EC0,\n    0x985C, 0x985D, 0x519B, 0x985E, 0x985E, 0x2008, 0x985F, 0x9861, 0x519D,\n    0x9862, 0x9862, 0x25D0, 0x9863, 0x9864, 0x51A0, 0x9865, 0x9865, 0x25D2,\n    0x9866, 0x9866, 0x51A2, 0x9867, 0x9867, 0x1F2A, 0x9868, 0x986A, 0x51A3,\n    0x986B, 0x986B, 0x1E72, 0x986C, 0x986C, 0x25D3, 0x986D, 0x986E, 0x51A6,\n    0x986F, 0x986F, 0x21BE, 0x9870, 0x9870, 0x25D4, 0x9871, 0x9871, 0x2044,\n    0x9872, 0x9872, 0x51A8, 0x9873, 0x9873, 0x25CF, 0x9874, 0x9874, 0x20F3,\n    0x9875, 0x9875, 0x103A, 0x9876, 0x9876, 0x05E4, 0x9877, 0x9877, 0x0C67,\n    0x9878, 0x9878, 0x1BE0, 0x9879, 0x9879, 0x0F5B, 0x987A, 0x987A, 0x0DA8,\n    0x987B, 0x987B, 0x0FB6, 0x987C, 0x987C, 0x1827, 0x987D, 0x987D, 0x0E98,\n    0x987E, 0x987E, 0x0724, 0x987F, 0x987F, 0x0618, 0x9880, 0x9880, 0x1BE1,\n    0x9881, 0x9881, 0x03EF, 0x9882, 0x9882, 0x0DC1, 0x9883, 0x9883, 0x1BE2,\n    0x9884, 0x9884, 0x10E7, 0x9885, 0x9885, 0x0A54, 0x9886, 0x9886, 0x0A35,\n    0x9887, 0x9887, 0x0BE3, 0x9888, 0x9888, 0x08E0, 0x9889, 0x9889, 0x1BE3,\n    0x988A, 0x988A, 0x0848, 0x988B, 0x988B, 0x51A9, 0x988C, 0x988D, 0x1BE4,\n    0x988E, 0x988E, 0x51AA, 0x988F, 0x988F, 0x1BE6, 0x9890, 0x9890, 0x104A,\n    0x9891, 0x9891, 0x0BD4, 0x9892, 0x9892, 0x51AB, 0x9893, 0x9893, 0x0E78,\n    0x9894, 0x9894, 0x1BE7, 0x9895, 0x9895, 0x51AC, 0x9896, 0x9896, 0x1096,\n    0x9897, 0x9897, 0x0952, 0x9898, 0x9898, 0x0E35, 0x9899, 0x9899, 0x51AD,\n    0x989A, 0x989B, 0x1BE8, 0x989C, 0x989C, 0x0FFE, 0x989D, 0x989D, 0x062D,\n    0x989E, 0x989F, 0x1BEA, 0x98A0, 0x98A0, 0x05C0, 0x98A1, 0x98A2, 0x1BEC,\n    0x98A3, 0x98A3, 0x51AE, 0x98A4, 0x98A4, 0x04C3, 0x98A5, 0x98A6, 0x1BEE,\n    0x98A7, 0x98A7, 0x0C82, 0x98A8, 0x98A8, 0x1F00, 0x98A9, 0x98AD, 0x51AF,\n    0x98AE, 0x98AF, 0x24CC, 0x98B0, 0x98B0, 0x51B4, 0x98B1, 0x98B1, 0x2698,\n    0x98B2, 0x98B2, 0x51B5, 0x98B3, 0x98B3, 0x2678, 0x98B4, 0x98B5, 0x51B6,\n    0x98B6, 0x98B6, 0x24CE, 0x98B7, 0x98BB, 0x51B8, 0x98BC, 0x98BC, 0x24CF,\n    0x98BD, 0x98C3, 0x51BD, 0x98C4, 0x98C4, 0x20B8, 0x98C5, 0x98C5, 0x51C4,\n    0x98C6, 0x98C6, 0x24D0, 0x98C7, 0x98C7, 0x51C5, 0x98C8, 0x98C8, 0x24D1,\n    0x98C9, 0x98CD, 0x51C6, 0x98CE, 0x98CE, 0x0684, 0x98CF, 0x98D0, 0x51CB,\n    0x98D1, 0x98D3, 0x19B7, 0x98D4, 0x98D4, 0x51CD, 0x98D5, 0x98D5, 0x19BA,\n    0x98D6, 0x98D7, 0x51CE, 0x98D8, 0x98D8, 0x0BCD, 0x98D9, 0x98DA, 0x19BB,\n    0x98DB, 0x98DB, 0x1EF4, 0x98DC, 0x98DD, 0x51D0, 0x98DE, 0x98DE, 0x0666,\n    0x98DF, 0x98DF, 0x0D4A, 0x98E0, 0x98E0, 0x239B, 0x98E1, 0x98E1, 0x51D2,\n    0x98E2, 0x98E2, 0x267E, 0x98E3, 0x98E6, 0x51D3, 0x98E7, 0x98E7, 0x161A,\n    0x98E8, 0x98E8, 0x1DE7, 0x98E9, 0x98E9, 0x239D, 0x98EA, 0x98EB, 0x239F,\n    0x98EC, 0x98EC, 0x51D7, 0x98ED, 0x98ED, 0x23A1, 0x98EE, 0x98EE, 0x51D8,\n    0x98EF, 0x98EF, 0x1EF1, 0x98F0, 0x98F1, 0x51D9, 0x98F2, 0x98F2, 0x221E,\n    0x98F3, 0x98F3, 0x51DB, 0x98F4, 0x98F4, 0x23A2, 0x98F5, 0x98FB, 0x51DC,\n    0x98FC, 0x98FC, 0x214B, 0x98FD, 0x98FD, 0x1E36, 0x98FE, 0x98FE, 0x2135,\n    0x98FF, 0x98FF, 0x51E3, 0x9900, 0x9902, 0x51E4, 0x9903, 0x9903, 0x1FAD,\n    0x9904, 0x9904, 0x51E7, 0x9905, 0x9905, 0x1E53, 0x9906, 0x9908, 0x51E8,\n    0x9909, 0x9909, 0x23A3, 0x990A, 0x990A, 0x2203, 0x990B, 0x990B, 0x51EB,\n    0x990C, 0x990C, 0x1EE7, 0x990D, 0x990D, 0x1DE8, 0x990E, 0x990F, 0x51EC,\n    0x9910, 0x9910, 0x0494, 0x9911, 0x9911, 0x23A4, 0x9912, 0x9912, 0x2097,\n    0x9913, 0x9913, 0x1EE4, 0x9914, 0x9917, 0x51EE, 0x9918, 0x9918, 0x2238,\n    0x9919, 0x991A, 0x51F2, 0x991B, 0x991B, 0x23A5, 0x991C, 0x991D, 0x51F4,\n    0x991E, 0x991E, 0x1F9A, 0x991F, 0x9920, 0x51F6, 0x9921, 0x9921, 0x21C3,\n    0x9922, 0x9927, 0x51F8, 0x9928, 0x9928, 0x1F2E, 0x9929, 0x992D, 0x51FE,\n    0x992E, 0x992E, 0x1DE9, 0x992F, 0x9932, 0x5203, 0x9933, 0x9933, 0x239C,\n    0x9934, 0x9936, 0x5207, 0x9937, 0x9937, 0x23A6, 0x9938, 0x993B, 0x520A,\n    0x993C, 0x993C, 0x239E, 0x993D, 0x993D, 0x520E, 0x993E, 0x993E, 0x2035,\n    0x993F, 0x993F, 0x23A7, 0x9940, 0x9942, 0x520F, 0x9943, 0x9943, 0x23A8,\n    0x9944, 0x9944, 0x5212, 0x9945, 0x9945, 0x2075, 0x9946, 0x9947, 0x5213,\n    0x9948, 0x994A, 0x23A9, 0x994B, 0x994B, 0x1FEB, 0x994C, 0x994C, 0x23AC,\n    0x994D, 0x9950, 0x5215, 0x9951, 0x9951, 0x1F6A, 0x9952, 0x9952, 0x20F9,\n    0x9953, 0x9953, 0x5219, 0x9954, 0x9954, 0x1DEB, 0x9955, 0x9955, 0x1DEA,\n    0x9956, 0x9956, 0x521A, 0x9957, 0x9957, 0x2666, 0x9958, 0x995B, 0x521B,\n    0x995C, 0x995C, 0x2667, 0x995D, 0x995D, 0x521F, 0x995E, 0x995E, 0x1E6C,\n    0x995F, 0x9961, 0x5220, 0x9962, 0x9962, 0x23AD, 0x9963, 0x9963, 0x161D,\n    0x9964, 0x9964, 0x5223, 0x9965, 0x9965, 0x0815, 0x9966, 0x9966, 0x5224,\n    0x9967, 0x996C, 0x161E, 0x996D, 0x996D, 0x0656, 0x996E, 0x996E, 0x1082,\n    0x996F, 0x996F, 0x0875, 0x9970, 0x9970, 0x0D65, 0x9971, 0x9971, 0x040E,\n    0x9972, 0x9972, 0x0DBC, 0x9973, 0x9973, 0x5225, 0x9974, 0x9974, 0x1624,\n    0x9975, 0x9975, 0x063B, 0x9976, 0x9976, 0x0C9F, 0x9977, 0x9977, 0x1625,\n    0x9978, 0x9979, 0x5226, 0x997A, 0x997A, 0x0899, 0x997B, 0x997B, 0x5228,\n    0x997C, 0x997C, 0x0466, 0x997D, 0x997D, 0x1626, 0x997E, 0x997E, 0x5229,\n    0x997F, 0x997F, 0x0635, 0x9980, 0x9980, 0x1627, 0x9981, 0x9981, 0x0B3C,\n    0x9982, 0x9983, 0x522A, 0x9984, 0x9984, 0x1628, 0x9985, 0x9985, 0x0F47,\n    0x9986, 0x9986, 0x0736, 0x9987, 0x9987, 0x1629, 0x9988, 0x9988, 0x098C,\n    0x9989, 0x9989, 0x522C, 0x998A, 0x998A, 0x162A, 0x998B, 0x998B, 0x04BD,\n    0x998C, 0x998C, 0x522D, 0x998D, 0x998D, 0x162B, 0x998E, 0x998E, 0x522E,\n    0x998F, 0x998F, 0x0A3C, 0x9990, 0x9991, 0x162C, 0x9992, 0x9992, 0x0A9F,\n    0x9993, 0x9995, 0x162E, 0x9996, 0x9996, 0x0D6E, 0x9997, 0x9997, 0x126E,\n    0x9998, 0x9998, 0x12F9, 0x9999, 0x9999, 0x0F50, 0x999A, 0x99A4, 0x522F,\n    0x99A5, 0x99A5, 0x1B2B, 0x99A6, 0x99A7, 0x523A, 0x99A8, 0x99A8, 0x13DE,\n    0x99A9, 0x99AB, 0x523C, 0x99AC, 0x99AC, 0x206D, 0x99AD, 0x99AD, 0x2242,\n    0x99AE, 0x99AE, 0x1F02, 0x99AF, 0x99B0, 0x523F, 0x99B1, 0x99B1, 0x2183,\n    0x99B2, 0x99B2, 0x5241, 0x99B3, 0x99B3, 0x1E85, 0x99B4, 0x99B4, 0x21E9,\n    0x99B5, 0x99C0, 0x5242, 0x99C1, 0x99C1, 0x1E57, 0x99C2, 0x99CF, 0x524E,\n    0x99D0, 0x99D0, 0x22A5, 0x99D1, 0x99D1, 0x2407, 0x99D2, 0x99D2, 0x1FCA,\n    0x99D3, 0x99D3, 0x525C, 0x99D4, 0x99D4, 0x2402, 0x99D5, 0x99D5, 0x1F82,\n    0x99D6, 0x99D7, 0x525D, 0x99D8, 0x99D8, 0x2408, 0x99D9, 0x99D9, 0x2404,\n    0x99DA, 0x99DA, 0x525F, 0x99DB, 0x99DB, 0x2131, 0x99DC, 0x99DC, 0x5260,\n    0x99DD, 0x99DD, 0x2184, 0x99DE, 0x99DE, 0x5261, 0x99DF, 0x99DF, 0x2403,\n    0x99E0, 0x99E0, 0x5262, 0x99E1, 0x99E1, 0x206E, 0x99E2, 0x99E2, 0x240B,\n    0x99E3, 0x99EC, 0x5263, 0x99ED, 0x99ED, 0x1F3F, 0x99EE, 0x99F0, 0x526D,\n    0x99F1, 0x99F1, 0x2067, 0x99F2, 0x99FE, 0x5270, 0x99FF, 0x99FF, 0x1FD7,\n    0x9A00, 0x9A00, 0x527D, 0x9A01, 0x9A01, 0x1E83, 0x9A02, 0x9A04, 0x527E,\n    0x9A05, 0x9A05, 0x240F, 0x9A06, 0x9A0C, 0x5281, 0x9A0D, 0x9A0D, 0x240E,\n    0x9A0E, 0x9A0E, 0x20C7, 0x9A0F, 0x9A0F, 0x240D, 0x9A10, 0x9A15, 0x5288,\n    0x9A16, 0x9A16, 0x2412, 0x9A17, 0x9A18, 0x528E, 0x9A19, 0x9A19, 0x20B7,\n    0x9A1A, 0x9A2A, 0x5290, 0x9A2B, 0x9A2B, 0x23F0, 0x9A2C, 0x9A2C, 0x52A1,\n    0x9A2D, 0x9A2D, 0x2411, 0x9A2E, 0x9A2E, 0x2414, 0x9A2F, 0x9A2F, 0x52A2,\n    0x9A30, 0x9A30, 0x2170, 0x9A31, 0x9A35, 0x52A3, 0x9A36, 0x9A36, 0x2405,\n    0x9A37, 0x9A37, 0x210C, 0x9A38, 0x9A38, 0x2415, 0x9A39, 0x9A3D, 0x52A8,\n    0x9A3E, 0x9A3E, 0x2066, 0x9A3F, 0x9A3F, 0x52AD, 0x9A40, 0x9A40, 0x2352,\n    0x9A41, 0x9A41, 0x2413, 0x9A42, 0x9A42, 0x2410, 0x9A43, 0x9A44, 0x2416,\n    0x9A45, 0x9A45, 0x20F1, 0x9A46, 0x9A49, 0x52AE, 0x9A4A, 0x9A4A, 0x240A,\n    0x9A4B, 0x9A4C, 0x52B2, 0x9A4D, 0x9A4D, 0x2409, 0x9A4E, 0x9A4E, 0x52B4,\n    0x9A4F, 0x9A4F, 0x2418, 0x9A50, 0x9A54, 0x52B5, 0x9A55, 0x9A55, 0x1FA7,\n    0x9A56, 0x9A56, 0x52BA, 0x9A57, 0x9A57, 0x21FC, 0x9A58, 0x9A59, 0x52BB,\n    0x9A5A, 0x9A5A, 0x1FC1, 0x9A5B, 0x9A5B, 0x2406, 0x9A5C, 0x9A5E, 0x52BD,\n    0x9A5F, 0x9A5F, 0x229C, 0x9A60, 0x9A61, 0x52C0, 0x9A62, 0x9A62, 0x204E,\n    0x9A63, 0x9A63, 0x52C2, 0x9A64, 0x9A64, 0x241A, 0x9A65, 0x9A65, 0x2419,\n    0x9A66, 0x9A69, 0x52C3, 0x9A6A, 0x9A6A, 0x240C, 0x9A6B, 0x9A6B, 0x52C7,\n    0x9A6C, 0x9A6C, 0x0A94, 0x9A6D, 0x9A6D, 0x10E9, 0x9A6E, 0x9A6E, 0x0E85,\n    0x9A6F, 0x9A6F, 0x0FDA, 0x9A70, 0x9A70, 0x0500, 0x9A71, 0x9A71, 0x0C7A,\n    0x9A72, 0x9A72, 0x52C8, 0x9A73, 0x9A73, 0x047C, 0x9A74, 0x9A74, 0x0A66,\n    0x9A75, 0x9A75, 0x17BA, 0x9A76, 0x9A76, 0x0D52, 0x9A77, 0x9A78, 0x17BB,\n    0x9A79, 0x9A79, 0x0903, 0x9A7A, 0x9A7A, 0x17BD, 0x9A7B, 0x9A7B, 0x1201,\n    0x9A7C, 0x9A7C, 0x0E86, 0x9A7D, 0x9A7D, 0x17BF, 0x9A7E, 0x9A7E, 0x0850,\n    0x9A7F, 0x9A7F, 0x17BE, 0x9A80, 0x9A81, 0x17C0, 0x9A82, 0x9A82, 0x0A95,\n    0x9A83, 0x9A83, 0x52C9, 0x9A84, 0x9A84, 0x088F, 0x9A85, 0x9A85, 0x17C2,\n    0x9A86, 0x9A86, 0x0A8D, 0x9A87, 0x9A87, 0x075E, 0x9A88, 0x9A88, 0x17C3,\n    0x9A89, 0x9A89, 0x52CA, 0x9A8A, 0x9A8A, 0x17C4, 0x9A8B, 0x9A8B, 0x04F7,\n    0x9A8C, 0x9A8C, 0x1012, 0x9A8D, 0x9A8E, 0x52CB, 0x9A8F, 0x9A8F, 0x0932,\n    0x9A90, 0x9A90, 0x17C5, 0x9A91, 0x9A91, 0x0C0E, 0x9A92, 0x9A93, 0x17C6,\n    0x9A94, 0x9A95, 0x52CD, 0x9A96, 0x9A96, 0x17C8, 0x9A97, 0x9A97, 0x0BCC,\n    0x9A98, 0x9A98, 0x17C9, 0x9A99, 0x9A99, 0x52CF, 0x9A9A, 0x9A9A, 0x0CE0,\n    0x9A9B, 0x9A9D, 0x17CA, 0x9A9E, 0x9A9E, 0x1735, 0x9A9F, 0x9AA0, 0x17CD,\n    0x9AA1, 0x9AA1, 0x0A89, 0x9AA2, 0x9AA3, 0x17CF, 0x9AA4, 0x9AA4, 0x11E7,\n    0x9AA5, 0x9AA5, 0x17D1, 0x9AA6, 0x9AA6, 0x52D0, 0x9AA7, 0x9AA7, 0x17D2,\n    0x9AA8, 0x9AA8, 0x0720, 0x9AA9, 0x9AAE, 0x52D1, 0x9AAF, 0x9AAF, 0x1E29,\n    0x9AB0, 0x9AB0, 0x1DD3, 0x9AB1, 0x9AB1, 0x1DD2, 0x9AB2, 0x9AB5, 0x52D7,\n    0x9AB6, 0x9AB6, 0x1DD6, 0x9AB7, 0x9AB7, 0x1DD4, 0x9AB8, 0x9AB8, 0x0758,\n    0x9AB9, 0x9AB9, 0x52DB, 0x9ABA, 0x9ABA, 0x1DD7, 0x9ABB, 0x9ABB, 0x52DC,\n    0x9ABC, 0x9ABC, 0x1DD8, 0x9ABD, 0x9ABF, 0x52DD, 0x9AC0, 0x9AC0, 0x1DDA,\n    0x9AC1, 0x9AC1, 0x1DD9, 0x9AC2, 0x9AC2, 0x1DDC, 0x9AC3, 0x9AC4, 0x52E0,\n    0x9AC5, 0x9AC5, 0x1DDB, 0x9AC6, 0x9ACA, 0x52E2, 0x9ACB, 0x9ACC, 0x1DDD,\n    0x9ACD, 0x9ACE, 0x52E7, 0x9ACF, 0x9ACF, 0x2661, 0x9AD0, 0x9AD0, 0x52E9,\n    0x9AD1, 0x9AD1, 0x1DDF, 0x9AD2, 0x9AD2, 0x26A4, 0x9AD3, 0x9AD3, 0x0DDD,\n    0x9AD4, 0x9AD4, 0x2174, 0x9AD5, 0x9AD5, 0x2663, 0x9AD6, 0x9AD6, 0x2662,\n    0x9AD7, 0x9AD7, 0x52EA, 0x9AD8, 0x9AD8, 0x06DA, 0x9AD9, 0x9ADE, 0x52EB,\n    0x9ADF, 0x9ADF, 0x1DEC, 0x9AE0, 0x9AE0, 0x52F1, 0x9AE1, 0x9AE1, 0x1DED,\n    0x9AE2, 0x9AE5, 0x52F2, 0x9AE6, 0x9AE6, 0x1DEE, 0x9AE7, 0x9AEA, 0x52F6,\n    0x9AEB, 0x9AEB, 0x1DF0, 0x9AEC, 0x9AEC, 0x52FA, 0x9AED, 0x9AED, 0x1DF2,\n    0x9AEE, 0x9AEE, 0x2675, 0x9AEF, 0x9AEF, 0x1DEF, 0x9AF0, 0x9AF8, 0x52FB,\n    0x9AF9, 0x9AF9, 0x1DF3, 0x9AFA, 0x9AFA, 0x5304, 0x9AFB, 0x9AFB, 0x1DF1,\n    0x9AFC, 0x9AFF, 0x5305, 0x9B00, 0x9B02, 0x5309, 0x9B03, 0x9B03, 0x1234,\n    0x9B04, 0x9B05, 0x530C, 0x9B06, 0x9B06, 0x214C, 0x9B07, 0x9B07, 0x530E,\n    0x9B08, 0x9B08, 0x1DF4, 0x9B09, 0x9B0C, 0x530F, 0x9B0D, 0x9B0D, 0x267A,\n    0x9B0E, 0x9B0E, 0x5313, 0x9B0F, 0x9B0F, 0x1DF5, 0x9B10, 0x9B12, 0x5314,\n    0x9B13, 0x9B13, 0x1DF6, 0x9B14, 0x9B19, 0x5317, 0x9B1A, 0x9B1A, 0x26A0,\n    0x9B1B, 0x9B1E, 0x531D, 0x9B1F, 0x9B1F, 0x1DF7, 0x9B20, 0x9B21, 0x5321,\n    0x9B22, 0x9B22, 0x2668, 0x9B23, 0x9B23, 0x1DF8, 0x9B24, 0x9B24, 0x5323,\n    0x9B25, 0x9B25, 0x1ED0, 0x9B26, 0x9B26, 0x5324, 0x9B27, 0x9B27, 0x2096,\n    0x9B28, 0x9B28, 0x5325, 0x9B29, 0x9B29, 0x23CC, 0x9B2A, 0x9B2D, 0x5326,\n    0x9B2E, 0x9B2E, 0x23C8, 0x9B2F, 0x9B2F, 0x139B, 0x9B30, 0x9B30, 0x532A,\n    0x9B31, 0x9B31, 0x223E, 0x9B32, 0x9B32, 0x1260, 0x9B33, 0x9B3A, 0x532B,\n    0x9B3B, 0x9B3B, 0x1773, 0x9B3C, 0x9B3C, 0x0746, 0x9B3D, 0x9B40, 0x5333,\n    0x9B41, 0x9B41, 0x098A, 0x9B42, 0x9B42, 0x07FF, 0x9B43, 0x9B43, 0x1DE1,\n    0x9B44, 0x9B44, 0x0BE6, 0x9B45, 0x9B45, 0x1DE0, 0x9B46, 0x9B46, 0x5337,\n    0x9B47, 0x9B47, 0x1DE2, 0x9B48, 0x9B48, 0x1DE4, 0x9B49, 0x9B49, 0x1DE3,\n    0x9B4A, 0x9B4C, 0x5338, 0x9B4D, 0x9B4D, 0x1DE5, 0x9B4E, 0x9B4E, 0x2665,\n    0x9B4F, 0x9B4F, 0x0EC9, 0x9B50, 0x9B50, 0x533B, 0x9B51, 0x9B51, 0x1DE6,\n    0x9B52, 0x9B53, 0x533C, 0x9B54, 0x9B54, 0x0B0A, 0x9B55, 0x9B57, 0x533E,\n    0x9B58, 0x9B58, 0x2664, 0x9B59, 0x9B59, 0x5341, 0x9B5A, 0x9B5A, 0x2239,\n    0x9B5B, 0x9B6E, 0x5342, 0x9B6F, 0x9B6F, 0x204A, 0x9B70, 0x9B73, 0x5356,\n    0x9B74, 0x9B74, 0x261F, 0x9B75, 0x9B76, 0x535A, 0x9B77, 0x9B77, 0x261E,\n    0x9B78, 0x9B80, 0x535C, 0x9B81, 0x9B81, 0x2620, 0x9B82, 0x9B82, 0x5365,\n    0x9B83, 0x9B83, 0x2621, 0x9B84, 0x9B8D, 0x5366, 0x9B8E, 0x9B8E, 0x2622,\n    0x9B8F, 0x9B8F, 0x5370, 0x9B90, 0x9B90, 0x2627, 0x9B91, 0x9B91, 0x1E39,\n    0x9B92, 0x9B92, 0x2625, 0x9B93, 0x9B99, 0x5371, 0x9B9A, 0x9B9A, 0x2629,\n    0x9B9B, 0x9B9C, 0x5378, 0x9B9D, 0x9B9D, 0x262E, 0x9B9E, 0x9B9E, 0x262B,\n    0x9B9F, 0x9BA9, 0x537A, 0x9BAA, 0x9BAA, 0x262A, 0x9BAB, 0x9BAB, 0x262D,\n    0x9BAC, 0x9BAC, 0x5385, 0x9BAD, 0x9BAD, 0x2628, 0x9BAE, 0x9BAE, 0x21B9,\n    0x9BAF, 0x9BBF, 0x5386, 0x9BC0, 0x9BC0, 0x2636, 0x9BC1, 0x9BC1, 0x2630,\n    0x9BC2, 0x9BC6, 0x5397, 0x9BC7, 0x9BC7, 0x2638, 0x9BC8, 0x9BC8, 0x539C,\n    0x9BC9, 0x9BC9, 0x200D, 0x9BCA, 0x9BCA, 0x2637, 0x9BCB, 0x9BD3, 0x539D,\n    0x9BD4, 0x9BD4, 0x2645, 0x9BD5, 0x9BD5, 0x53A6, 0x9BD6, 0x9BD6, 0x263A,\n    0x9BD7, 0x9BDA, 0x53A7, 0x9BDB, 0x9BDB, 0x2643, 0x9BDC, 0x9BDC, 0x53AB,\n    0x9BDD, 0x9BDD, 0x2640, 0x9BDE, 0x9BE0, 0x53AC, 0x9BE1, 0x9BE1, 0x263D,\n    0x9BE2, 0x9BE2, 0x2641, 0x9BE3, 0x9BE3, 0x53AF, 0x9BE4, 0x9BE4, 0x263E,\n    0x9BE5, 0x9BE6, 0x53B0, 0x9BE7, 0x9BE7, 0x263F, 0x9BE8, 0x9BE8, 0x1FC0,\n    0x9BE9, 0x9BE9, 0x53B2, 0x9BEA, 0x9BEB, 0x263B, 0x9BEC, 0x9BEF, 0x53B3,\n    0x9BF0, 0x9BF0, 0x2642, 0x9BF1, 0x9BF3, 0x53B7, 0x9BF4, 0x9BF4, 0x2644,\n    0x9BF5, 0x9BFC, 0x53BA, 0x9BFD, 0x9BFD, 0x2639, 0x9BFE, 0x9BFE, 0x53C2,\n    0x9BFF, 0x9BFF, 0x264C, 0x9C00, 0x9C07, 0x53C3, 0x9C08, 0x9C08, 0x2647,\n    0x9C09, 0x9C09, 0x264B, 0x9C0A, 0x9C0C, 0x53CB, 0x9C0D, 0x9C0D, 0x2649,\n    0x9C0E, 0x9C0F, 0x53CE, 0x9C10, 0x9C10, 0x2648, 0x9C11, 0x9C11, 0x53D0,\n    0x9C12, 0x9C12, 0x264A, 0x9C13, 0x9C13, 0x2108, 0x9C14, 0x9C1F, 0x53D1,\n    0x9C20, 0x9C20, 0x264D, 0x9C21, 0x9C22, 0x53DD, 0x9C23, 0x9C23, 0x2634,\n    0x9C24, 0x9C24, 0x53DF, 0x9C25, 0x9C25, 0x2651, 0x9C26, 0x9C27, 0x53E0,\n    0x9C28, 0x9C28, 0x2650, 0x9C29, 0x9C29, 0x2652, 0x9C2A, 0x9C2C, 0x53E2,\n    0x9C2D, 0x9C2D, 0x264F, 0x9C2E, 0x9C30, 0x53E5, 0x9C31, 0x9C31, 0x2632,\n    0x9C32, 0x9C32, 0x264E, 0x9C33, 0x9C33, 0x2653, 0x9C34, 0x9C34, 0x53E8,\n    0x9C35, 0x9C35, 0x2657, 0x9C36, 0x9C36, 0x53E9, 0x9C37, 0x9C37, 0x2635,\n    0x9C38, 0x9C38, 0x53EA, 0x9C39, 0x9C39, 0x2633, 0x9C3A, 0x9C3A, 0x53EB,\n    0x9C3B, 0x9C3B, 0x2656, 0x9C3C, 0x9C3D, 0x53EC, 0x9C3E, 0x9C3E, 0x2654,\n    0x9C3F, 0x9C44, 0x53EE, 0x9C45, 0x9C45, 0x2658, 0x9C46, 0x9C47, 0x53F4,\n    0x9C48, 0x9C48, 0x2655, 0x9C49, 0x9C49, 0x1E4D, 0x9C4A, 0x9C51, 0x53F6,\n    0x9C52, 0x9C52, 0x265B, 0x9C53, 0x9C53, 0x53FE, 0x9C54, 0x9C54, 0x265A,\n    0x9C55, 0x9C55, 0x53FF, 0x9C56, 0x9C56, 0x2659, 0x9C57, 0x9C57, 0x202E,\n    0x9C58, 0x9C58, 0x262F, 0x9C59, 0x9C5C, 0x5400, 0x9C5D, 0x9C5D, 0x2646,\n    0x9C5E, 0x9C5E, 0x5404, 0x9C5F, 0x9C5F, 0x2626, 0x9C60, 0x9C66, 0x5405,\n    0x9C67, 0x9C67, 0x265C, 0x9C68, 0x9C6C, 0x540C, 0x9C6D, 0x9C6D, 0x262C,\n    0x9C6E, 0x9C77, 0x5411, 0x9C78, 0x9C78, 0x2623, 0x9C79, 0x9C79, 0x541B,\n    0x9C7A, 0x9C7A, 0x2631, 0x9C7B, 0x9C7B, 0x541C, 0x9C7C, 0x9C7C, 0x10C8,\n    0x9C7D, 0x9C7E, 0x541D, 0x9C7F, 0x9C7F, 0x1D89, 0x9C80, 0x9C80, 0x541F,\n    0x9C81, 0x9C81, 0x0A5A, 0x9C82, 0x9C82, 0x1D8A, 0x9C83, 0x9C84, 0x5420,\n    0x9C85, 0x9C88, 0x1D8B, 0x9C89, 0x9C8A, 0x5422, 0x9C8B, 0x9C8B, 0x1D90,\n    0x9C8C, 0x9C8C, 0x5424, 0x9C8D, 0x9C8D, 0x0414, 0x9C8E, 0x9C8E, 0x1D91,\n    0x9C8F, 0x9C8F, 0x5425, 0x9C90, 0x9C92, 0x1D92, 0x9C93, 0x9C93, 0x5426,\n    0x9C94, 0x9C95, 0x1D95, 0x9C96, 0x9C99, 0x5427, 0x9C9A, 0x9C9B, 0x1D97,\n    0x9C9C, 0x9C9C, 0x0F37, 0x9C9D, 0x9C9D, 0x542B, 0x9C9E, 0x9CA3, 0x1D99,\n    0x9CA4, 0x9CA4, 0x09DB, 0x9CA5, 0x9CA9, 0x1D9F, 0x9CAA, 0x9CAA, 0x542C,\n    0x9CAB, 0x9CAB, 0x1DA4, 0x9CAC, 0x9CAC, 0x542D, 0x9CAD, 0x9CAE, 0x1DA5,\n    0x9CAF, 0x9CAF, 0x542E, 0x9CB0, 0x9CB7, 0x1DA7, 0x9CB8, 0x9CB8, 0x08D7,\n    0x9CB9, 0x9CB9, 0x542F, 0x9CBA, 0x9CBD, 0x1DAF, 0x9CBE, 0x9CC2, 0x5430,\n    0x9CC3, 0x9CC3, 0x0CD5, 0x9CC4, 0x9CC7, 0x1DB3, 0x9CC8, 0x9CC9, 0x5435,\n    0x9CCA, 0x9CD0, 0x1DB7, 0x9CD1, 0x9CD2, 0x5437, 0x9CD3, 0x9CD5, 0x1DBE,\n    0x9CD6, 0x9CD6, 0x0457, 0x9CD7, 0x9CD9, 0x1DC1, 0x9CDA, 0x9CDB, 0x5439,\n    0x9CDC, 0x9CDD, 0x1DC4, 0x9CDE, 0x9CDE, 0x0A24, 0x9CDF, 0x9CDF, 0x1DC6,\n    0x9CE0, 0x9CE1, 0x543B, 0x9CE2, 0x9CE2, 0x1DC7, 0x9CE3, 0x9CE4, 0x543D,\n    0x9CE5, 0x9CE5, 0x209C, 0x9CE6, 0x9CE8, 0x543F, 0x9CE9, 0x9CE9, 0x2580,\n    0x9CEA, 0x9CEB, 0x5442, 0x9CEC, 0x9CEC, 0x22DC, 0x9CED, 0x9CF2, 0x5444,\n    0x9CF3, 0x9CF3, 0x1F05, 0x9CF4, 0x9CF4, 0x208B, 0x9CF5, 0x9CF5, 0x544A,\n    0x9CF6, 0x9CF6, 0x2581, 0x9CF7, 0x9CFF, 0x544B, 0x9D00, 0x9D05, 0x5454,\n    0x9D06, 0x9D06, 0x2583, 0x9D07, 0x9D07, 0x2582, 0x9D08, 0x9D08, 0x545A,\n    0x9D09, 0x9D09, 0x21EE, 0x9D0A, 0x9D14, 0x545B, 0x9D15, 0x9D15, 0x2182,\n    0x9D16, 0x9D1A, 0x5466, 0x9D1B, 0x9D1B, 0x2243, 0x9D1C, 0x9D1C, 0x546B,\n    0x9D1D, 0x9D1D, 0x2587, 0x9D1E, 0x9D1E, 0x546C, 0x9D1F, 0x9D1F, 0x2588,\n    0x9D20, 0x9D22, 0x546D, 0x9D23, 0x9D23, 0x2584, 0x9D24, 0x9D25, 0x5470,\n    0x9D26, 0x9D26, 0x21FD, 0x9D27, 0x9D27, 0x5472, 0x9D28, 0x9D28, 0x21EF,\n    0x9D29, 0x9D2E, 0x5473, 0x9D2F, 0x9D2F, 0x258A, 0x9D30, 0x9D30, 0x258C,\n    0x9D31, 0x9D3A, 0x5479, 0x9D3B, 0x9D3B, 0x1F47, 0x9D3C, 0x9D3E, 0x5483,\n    0x9D3F, 0x9D3F, 0x1F1D, 0x9D40, 0x9D41, 0x5486, 0x9D42, 0x9D42, 0x258D,\n    0x9D43, 0x9D50, 0x5488, 0x9D51, 0x9D51, 0x1FD0, 0x9D52, 0x9D52, 0x2592,\n    0x9D53, 0x9D53, 0x258F, 0x9D54, 0x9D5B, 0x5496, 0x9D5C, 0x9D5C, 0x2594,\n    0x9D5D, 0x9D5D, 0x1EE0, 0x9D5E, 0x9D5F, 0x549E, 0x9D60, 0x9D60, 0x2591,\n    0x9D61, 0x9D61, 0x2595, 0x9D62, 0x9D69, 0x54A0, 0x9D6A, 0x9D6A, 0x2597,\n    0x9D6B, 0x9D6B, 0x54A8, 0x9D6C, 0x9D6C, 0x20B6, 0x9D6D, 0x9D6E, 0x54A9,\n    0x9D6F, 0x9D6F, 0x2598, 0x9D70, 0x9D71, 0x54AB, 0x9D72, 0x9D72, 0x20F6,\n    0x9D73, 0x9D86, 0x54AD, 0x9D87, 0x9D87, 0x2585, 0x9D88, 0x9D88, 0x54C1,\n    0x9D89, 0x9D89, 0x2599, 0x9D8A, 0x9D92, 0x54C2, 0x9D93, 0x9D93, 0x2596,\n    0x9D94, 0x9D97, 0x54CB, 0x9D98, 0x9D98, 0x259A, 0x9D99, 0x9D99, 0x54CF,\n    0x9D9A, 0x9D9A, 0x259B, 0x9D9B, 0x9DA4, 0x54D0, 0x9DA5, 0x9DA5, 0x259D,\n    0x9DA6, 0x9DA8, 0x54DA, 0x9DA9, 0x9DA9, 0x259E, 0x9DAA, 0x9DAE, 0x54DD,\n    0x9DAF, 0x9DAF, 0x234C, 0x9DB0, 0x9DB3, 0x54E2, 0x9DB4, 0x9DB4, 0x1F44,\n    0x9DB5, 0x9DBA, 0x54E6, 0x9DBB, 0x9DBB, 0x2660, 0x9DBC, 0x9DBC, 0x25A0,\n    0x9DBD, 0x9DBF, 0x54EC, 0x9DC0, 0x9DC0, 0x259C, 0x9DC1, 0x9DC1, 0x54EF,\n    0x9DC2, 0x9DC2, 0x259F, 0x9DC3, 0x9DC3, 0x54F0, 0x9DC4, 0x9DC4, 0x1F6C,\n    0x9DC5, 0x9DD2, 0x54F1, 0x9DD3, 0x9DD3, 0x25A2, 0x9DD4, 0x9DD6, 0x54FF,\n    0x9DD7, 0x9DD7, 0x20AE, 0x9DD8, 0x9DD8, 0x5502, 0x9DD9, 0x9DD9, 0x258B,\n    0x9DDA, 0x9DDA, 0x25A3, 0x9DDB, 0x9DE4, 0x5503, 0x9DE5, 0x9DE5, 0x2589,\n    0x9DE6, 0x9DE6, 0x25A5, 0x9DE7, 0x9DEE, 0x550D, 0x9DEF, 0x9DEF, 0x25A4,\n    0x9DF0, 0x9DF1, 0x5515, 0x9DF2, 0x9DF2, 0x25A6, 0x9DF3, 0x9DF3, 0x2593,\n    0x9DF4, 0x9DF7, 0x5517, 0x9DF8, 0x9DF8, 0x25A7, 0x9DF9, 0x9DF9, 0x2222,\n    0x9DFA, 0x9DFA, 0x25A9, 0x9DFB, 0x9DFF, 0x551B, 0x9E00, 0x9E0B, 0x5520,\n    0x9E0C, 0x9E0C, 0x25A8, 0x9E0D, 0x9E14, 0x552C, 0x9E15, 0x9E15, 0x2586,\n    0x9E16, 0x9E19, 0x5534, 0x9E1A, 0x9E1A, 0x25A1, 0x9E1B, 0x9E1B, 0x25AA,\n    0x9E1C, 0x9E1C, 0x5538, 0x9E1D, 0x9E1D, 0x2590, 0x9E1E, 0x9E1E, 0x258E,\n    0x9E1F, 0x9E1F, 0x0B54, 0x9E20, 0x9E20, 0x1B35, 0x9E21, 0x9E21, 0x0819,\n    0x9E22, 0x9E22, 0x1B36, 0x9E23, 0x9E23, 0x0AFE, 0x9E24, 0x9E24, 0x5539,\n    0x9E25, 0x9E25, 0x0B79, 0x9E26, 0x9E26, 0x0FE4, 0x9E27, 0x9E27, 0x553A,\n    0x9E28, 0x9E2C, 0x1B37, 0x9E2D, 0x9E2D, 0x0FE5, 0x9E2E, 0x9E2E, 0x553B,\n    0x9E2F, 0x9E2F, 0x1015, 0x9E30, 0x9E30, 0x553C, 0x9E31, 0x9E31, 0x1B3D,\n    0x9E32, 0x9E32, 0x1B3C, 0x9E33, 0x9E33, 0x10EA, 0x9E34, 0x9E34, 0x553D,\n    0x9E35, 0x9E35, 0x0E83, 0x9E36, 0x9E36, 0x1B3E, 0x9E37, 0x9E37, 0x1B40,\n    0x9E38, 0x9E38, 0x1B3F, 0x9E39, 0x9E3A, 0x1B41, 0x9E3B, 0x9E3C, 0x553E,\n    0x9E3D, 0x9E3D, 0x06E6, 0x9E3E, 0x9E3E, 0x1B43, 0x9E3F, 0x9E3F, 0x079F,\n    0x9E40, 0x9E40, 0x5540, 0x9E41, 0x9E42, 0x1B44, 0x9E43, 0x9E43, 0x0918,\n    0x9E44, 0x9E44, 0x1B46, 0x9E45, 0x9E45, 0x062B, 0x9E46, 0x9E49, 0x1B47,\n    0x9E4A, 0x9E4A, 0x0C90, 0x9E4B, 0x9E4C, 0x1B4B, 0x9E4D, 0x9E4D, 0x5541,\n    0x9E4E, 0x9E4E, 0x1B4D, 0x9E4F, 0x9E4F, 0x0BB5, 0x9E50, 0x9E50, 0x5542,\n    0x9E51, 0x9E51, 0x1B4E, 0x9E52, 0x9E54, 0x5543, 0x9E55, 0x9E55, 0x1B4F,\n    0x9E56, 0x9E56, 0x5546, 0x9E57, 0x9E57, 0x1B50, 0x9E58, 0x9E58, 0x1DD5,\n    0x9E59, 0x9E59, 0x5547, 0x9E5A, 0x9E5C, 0x1B51, 0x9E5D, 0x9E5D, 0x5548,\n    0x9E5E, 0x9E5E, 0x1B54, 0x9E5F, 0x9E62, 0x5549, 0x9E63, 0x9E63, 0x1B55,\n    0x9E64, 0x9E64, 0x078E, 0x9E65, 0x9E65, 0x554D, 0x9E66, 0x9E6C, 0x1B56,\n    0x9E6D, 0x9E6D, 0x1B5E, 0x9E6E, 0x9E6F, 0x554E, 0x9E70, 0x9E70, 0x108A,\n    0x9E71, 0x9E71, 0x1B5D, 0x9E72, 0x9E72, 0x5550, 0x9E73, 0x9E73, 0x1B5F,\n    0x9E74, 0x9E74, 0x5551, 0x9E75, 0x9E75, 0x2688, 0x9E76, 0x9E78, 0x5552,\n    0x9E79, 0x9E79, 0x269E, 0x9E7A, 0x9E7A, 0x25FB, 0x9E7B, 0x9E7B, 0x5555,\n    0x9E7C, 0x9E7C, 0x1F8C, 0x9E7D, 0x9E7D, 0x21F4, 0x9E7E, 0x9E7E, 0x1D16,\n    0x9E7F, 0x9E7F, 0x0A60, 0x9E80, 0x9E81, 0x5556, 0x9E82, 0x9E82, 0x1DFC,\n    0x9E83, 0x9E86, 0x5558, 0x9E87, 0x9E88, 0x1DFD, 0x9E89, 0x9E8A, 0x555C,\n    0x9E8B, 0x9E8B, 0x1DFF, 0x9E8C, 0x9E91, 0x555E, 0x9E92, 0x9E92, 0x1E00,\n    0x9E93, 0x9E93, 0x0A5B, 0x9E94, 0x9E96, 0x5564, 0x9E97, 0x9E97, 0x200F,\n    0x9E98, 0x9E9C, 0x5567, 0x9E9D, 0x9E9D, 0x1E02, 0x9E9E, 0x9E9E, 0x556C,\n    0x9E9F, 0x9E9F, 0x1E03, 0x9EA0, 0x9EA4, 0x556D, 0x9EA5, 0x9EA5, 0x2071,\n    0x9EA6, 0x9EA6, 0x0A9A, 0x9EA7, 0x9EA8, 0x5572, 0x9EA9, 0x9EA9, 0x25F7,\n    0x9EAA, 0x9EAE, 0x5574, 0x9EAF, 0x9EAF, 0x2696, 0x9EB0, 0x9EB3, 0x5579,\n    0x9EB4, 0x9EB4, 0x1CEE, 0x9EB5, 0x9EB5, 0x268F, 0x9EB6, 0x9EB7, 0x557D,\n    0x9EB8, 0x9EB8, 0x1CED, 0x9EB9, 0x9EBA, 0x557F, 0x9EBB, 0x9EBB, 0x0A90,\n    0x9EBC, 0x9EBC, 0x5581, 0x9EBD, 0x9EBE, 0x1DF9, 0x9EBF, 0x9EC3, 0x5582,\n    0x9EC4, 0x9EC4, 0x07DB, 0x9EC5, 0x9EC8, 0x5587, 0x9EC9, 0x9EC9, 0x12F8,\n    0x9ECA, 0x9ECB, 0x558B, 0x9ECC, 0x9ECC, 0x22DA, 0x9ECD, 0x9ECD, 0x0D89,\n    0x9ECE, 0x9ECE, 0x09D3, 0x9ECF, 0x9ECF, 0x1B2A, 0x9ED0, 0x9ED0, 0x558D,\n    0x9ED1, 0x9ED1, 0x0791, 0x9ED2, 0x9ED3, 0x558E, 0x9ED4, 0x9ED4, 0x0C2A,\n    0x9ED5, 0x9ED7, 0x5590, 0x9ED8, 0x9ED8, 0x0B0F, 0x9ED9, 0x9EDA, 0x5593,\n    0x9EDB, 0x9EDD, 0x1E04, 0x9EDE, 0x9EDE, 0x1EC1, 0x9EDF, 0x9EDF, 0x1E08,\n    0x9EE0, 0x9EE0, 0x1E07, 0x9EE1, 0x9EE1, 0x5595, 0x9EE2, 0x9EE2, 0x1E09,\n    0x9EE3, 0x9EE4, 0x5596, 0x9EE5, 0x9EE5, 0x1E0C, 0x9EE6, 0x9EE6, 0x5598,\n    0x9EE7, 0x9EE7, 0x1E0B, 0x9EE8, 0x9EE8, 0x1EB3, 0x9EE9, 0x9EE9, 0x1E0A,\n    0x9EEA, 0x9EEA, 0x1E0D, 0x9EEB, 0x9EEE, 0x5599, 0x9EEF, 0x9EEF, 0x1E0E,\n    0x9EF0, 0x9EF1, 0x559D, 0x9EF2, 0x9EF2, 0x266A, 0x9EF3, 0x9EF3, 0x559F,\n    0x9EF4, 0x9EF4, 0x268A, 0x9EF5, 0x9EF6, 0x55A0, 0x9EF7, 0x9EF7, 0x2669,\n    0x9EF8, 0x9EF8, 0x55A2, 0x9EF9, 0x9EF9, 0x1A55, 0x9EFA, 0x9EFA, 0x55A3,\n    0x9EFB, 0x9EFC, 0x1A56, 0x9EFD, 0x9EFD, 0x2618, 0x9EFE, 0x9EFE, 0x1D76,\n    0x9EFF, 0x9EFF, 0x2619, 0x9F00, 0x9F08, 0x55A4, 0x9F09, 0x9F09, 0x261A,\n    0x9F0A, 0x9F0A, 0x55AD, 0x9F0B, 0x9F0B, 0x1D77, 0x9F0C, 0x9F0C, 0x55AE,\n    0x9F0D, 0x9F0D, 0x1D78, 0x9F0E, 0x9F0E, 0x05E5, 0x9F0F, 0x9F0F, 0x55AF,\n    0x9F10, 0x9F10, 0x1274, 0x9F11, 0x9F12, 0x55B0, 0x9F13, 0x9F13, 0x071D,\n    0x9F14, 0x9F14, 0x55B2, 0x9F15, 0x9F15, 0x2673, 0x9F16, 0x9F16, 0x55B3,\n    0x9F17, 0x9F17, 0x1271, 0x9F18, 0x9F18, 0x55B4, 0x9F19, 0x9F19, 0x13DF,\n    0x9F1A, 0x9F1F, 0x55B5, 0x9F20, 0x9F20, 0x0D8A, 0x9F21, 0x9F21, 0x55BB,\n    0x9F22, 0x9F22, 0x1E0F, 0x9F23, 0x9F2B, 0x55BC, 0x9F2C, 0x9F2C, 0x1E10,\n    0x9F2D, 0x9F2E, 0x55C5, 0x9F2F, 0x9F2F, 0x1E11, 0x9F30, 0x9F36, 0x55C7,\n    0x9F37, 0x9F37, 0x1E13, 0x9F38, 0x9F38, 0x55CE, 0x9F39, 0x9F39, 0x1E12,\n    0x9F3A, 0x9F3A, 0x55CF, 0x9F3B, 0x9F3B, 0x0430, 0x9F3C, 0x9F3C, 0x55D0,\n    0x9F3D, 0x9F3E, 0x1E14, 0x9F3F, 0x9F43, 0x55D1, 0x9F44, 0x9F44, 0x1E16,\n    0x9F45, 0x9F49, 0x55D6, 0x9F4A, 0x9F4A, 0x20C6, 0x9F4B, 0x9F4B, 0x226B,\n    0x9F4C, 0x9F4E, 0x55DB, 0x9F4F, 0x9F4F, 0x24D3, 0x9F50, 0x9F50, 0x0C0A,\n    0x9F51, 0x9F51, 0x19C2, 0x9F52, 0x9F52, 0x1E86, 0x9F53, 0x9F53, 0x55DE,\n    0x9F54, 0x9F54, 0x260F, 0x9F55, 0x9F58, 0x55DF, 0x9F59, 0x9F59, 0x2611,\n    0x9F5A, 0x9F5B, 0x55E3, 0x9F5C, 0x9F5C, 0x2613, 0x9F5D, 0x9F5E, 0x55E5,\n    0x9F5F, 0x9F5F, 0x2610, 0x9F60, 0x9F60, 0x2612, 0x9F61, 0x9F61, 0x2030,\n    0x9F62, 0x9F62, 0x55E7, 0x9F63, 0x9F63, 0x2671, 0x9F64, 0x9F65, 0x55E8,\n    0x9F66, 0x9F66, 0x2614, 0x9F67, 0x9F69, 0x55EA, 0x9F6A, 0x9F6A, 0x2616,\n    0x9F6B, 0x9F6B, 0x55ED, 0x9F6C, 0x9F6C, 0x2615, 0x9F6D, 0x9F71, 0x55EE,\n    0x9F72, 0x9F72, 0x20F2, 0x9F73, 0x9F76, 0x55F3, 0x9F77, 0x9F77, 0x2617,\n    0x9F78, 0x9F7E, 0x55F7, 0x9F7F, 0x9F7F, 0x0502, 0x9F80, 0x9F80, 0x1D6D,\n    0x9F81, 0x9F82, 0x55FE, 0x9F83, 0x9F83, 0x1D6E, 0x9F84, 0x9F84, 0x0A2D,\n    0x9F85, 0x9F8A, 0x1D6F, 0x9F8B, 0x9F8B, 0x0C7E, 0x9F8C, 0x9F8C, 0x1D75,\n    0x9F8D, 0x9F8D, 0x2037, 0x9F8E, 0x9F8F, 0x5600, 0x9F90, 0x9F90, 0x20B3,\n    0x9F91, 0x9F93, 0x5602, 0x9F94, 0x9F94, 0x1F22, 0x9F95, 0x9F95, 0x24ED,\n    0x9F96, 0x9F98, 0x5605, 0x9F99, 0x9F99, 0x0A43, 0x9F9A, 0x9F9A, 0x0701,\n    0x9F9B, 0x9F9B, 0x1A54, 0x9F9C, 0x9F9C, 0x1F34, 0x9F9D, 0x9F9E, 0x5608,\n    0x9F9F, 0x9F9F, 0x0743, 0x9FA0, 0x9FA0, 0x12F3, 0x9FA1, 0x9FA5, 0x560A,\n    0xE816, 0xE818, 0x5620, 0xE81E, 0xE81E, 0x5628, 0xE826, 0xE826, 0x5630,\n    0xE82B, 0xE82C, 0x5635, 0xE831, 0xE832, 0x563B, 0xE83B, 0xE83B, 0x5645,\n    0xE843, 0xE843, 0x564D, 0xE854, 0xE855, 0x565E, 0xE864, 0xE864, 0x566E,\n    0xF92C, 0xF92C, 0x560F, 0xFA0D, 0xFA0F, 0x5610, 0xFA11, 0xFA11, 0x5613,\n    0xFA13, 0xFA14, 0x5614, 0xFA18, 0xFA18, 0x5616, 0xFA1F, 0xFA21, 0x5617,\n    0xFA23, 0xFA24, 0x561A, 0xFA27, 0xFA29, 0x561C, 0xFE30, 0xFE30, 0x271D,\n    0xFE49, 0xFE52, 0x272B, 0xFE54, 0xFE57, 0x2735, 0xFE59, 0xFE66, 0x2739,\n    0xFE68, 0xFE6B, 0x2747, 0xFF01, 0xFF03, 0x0106, 0xFF04, 0xFF04, 0x00A6,\n    0xFF05, 0xFF5D, 0x010A, 0xFF5E, 0xFF5E, 0x006A, 0xFFE0, 0xFFE1, 0x00A8,\n    0xFFE2, 0xFFE2, 0x271E, 0xFFE3, 0xFFE3, 0x0163, 0xFFE4, 0xFFE4, 0x271F,\n    0xFFE5, 0xFFE5, 0x0109,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-V_4.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_UniGB_UCS2_V_4[24 * 3] = {\n    0x2014, 0x2014, 0x0256, 0x2026, 0x2026, 0x0257, 0x2225, 0x2225, 0x1E1C,\n    0x3001, 0x3001, 0x023F, 0x3002, 0x3002, 0x023E, 0x3008, 0x300F, 0x0248,\n    0x3010, 0x3011, 0x0252, 0x3013, 0x3013, 0x1E1A, 0x3014, 0x3015, 0x0246,\n    0x3016, 0x3017, 0x0250, 0xFF01, 0xFF01, 0x0242, 0xFF08, 0xFF09, 0x0244,\n    0xFF0C, 0xFF0C, 0x023D, 0xFF0E, 0xFF0E, 0x1E1B, 0xFF1A, 0xFF1B, 0x0240,\n    0xFF1D, 0xFF1D, 0x1E1C, 0xFF1F, 0xFF1F, 0x0243, 0xFF3B, 0xFF3B, 0x1E1D,\n    0xFF3D, 0xFF3D, 0x1E1E, 0xFF3F, 0xFF3F, 0x0258, 0xFF5B, 0xFF5B, 0x0254,\n    0xFF5D, 0xFF5D, 0x0255, 0xFF5E, 0xFF5E, 0x1E18, 0xFFE3, 0xFFE3, 0x1E1F,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/GB1/cmaps_gb1.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../../include/fpdfapi/fpdf_resource.h\"\n#include \"../../../../include/fpdfapi/fpdf_module.h\"\n#include \"../../fpdf_font/font_int.h\"\n#include \"../cmap_int.h\"\nextern const FX_WORD g_FXCMAP_GB_EUC_H_0[];\nextern const FX_WORD g_FXCMAP_GB_EUC_V_0[];\nextern const FX_WORD g_FXCMAP_GBpc_EUC_H_0[];\nextern const FX_WORD g_FXCMAP_GBpc_EUC_V_0[];\nextern const FX_WORD g_FXCMAP_GBK_EUC_H_2[];\nextern const FX_WORD g_FXCMAP_GBK_EUC_V_2[];\nextern const FX_WORD g_FXCMAP_GBKp_EUC_H_2[];\nextern const FX_WORD g_FXCMAP_GBKp_EUC_V_2[];\nextern const FX_WORD g_FXCMAP_GBK2K_H_5[];\nextern const FX_WORD g_FXCMAP_GBK2K_H_5_DWord[];\nextern const FX_WORD g_FXCMAP_GBK2K_V_5[];\nextern const FX_WORD g_FXCMAP_UniGB_UCS2_H_4[];\nextern const FX_WORD g_FXCMAP_UniGB_UCS2_V_4[];\nextern const FX_WORD g_FXCMAP_GB1CID2Unicode_5[];\nstatic const FXCMAP_CMap g_FXCMAP_GB1_cmaps[] = {\n    { \"GB-EUC-H\", FXCMAP_CMap::Range, g_FXCMAP_GB_EUC_H_0, 90, FXCMAP_CMap::None, NULL, 0, 0 },\n    { \"GB-EUC-V\", FXCMAP_CMap::Range, g_FXCMAP_GB_EUC_V_0, 20, FXCMAP_CMap::None, NULL, 0, -1 },\n    { \"GBpc-EUC-H\", FXCMAP_CMap::Range, g_FXCMAP_GBpc_EUC_H_0, 91, FXCMAP_CMap::None, NULL, 0, 0 },\n    { \"GBpc-EUC-V\", FXCMAP_CMap::Range, g_FXCMAP_GBpc_EUC_V_0, 20, FXCMAP_CMap::None, NULL, 0, -1 },\n    { \"GBK-EUC-H\", FXCMAP_CMap::Range, g_FXCMAP_GBK_EUC_H_2, 4071, FXCMAP_CMap::None, NULL, 0, 0 },\n    { \"GBK-EUC-V\", FXCMAP_CMap::Range, g_FXCMAP_GBK_EUC_V_2, 20, FXCMAP_CMap::None, NULL, 0, -1 },\n    { \"GBKp-EUC-H\", FXCMAP_CMap::Range, g_FXCMAP_GBKp_EUC_H_2, 4070, FXCMAP_CMap::None, NULL, 0, -2 },\n    { \"GBKp-EUC-V\", FXCMAP_CMap::Range, g_FXCMAP_GBKp_EUC_V_2, 20, FXCMAP_CMap::None, NULL, 0, -1 },\n    { \"GBK2K-H\", FXCMAP_CMap::Range, g_FXCMAP_GBK2K_H_5, 4071, FXCMAP_CMap::Single, g_FXCMAP_GBK2K_H_5_DWord, 1017, -4 },\n    { \"GBK2K-V\", FXCMAP_CMap::Range, g_FXCMAP_GBK2K_V_5, 41, FXCMAP_CMap::None, NULL, 0, -1 },\n    { \"UniGB-UCS2-H\", FXCMAP_CMap::Range, g_FXCMAP_UniGB_UCS2_H_4, 13825, FXCMAP_CMap::None, NULL, 0, 0 },\n    { \"UniGB-UCS2-V\", FXCMAP_CMap::Range, g_FXCMAP_UniGB_UCS2_V_4, 24, FXCMAP_CMap::None, NULL, 0, -1 },\n    { \"UniGB-UTF16-H\", FXCMAP_CMap::Range, g_FXCMAP_UniGB_UCS2_H_4, 13825, FXCMAP_CMap::None, NULL, 0, 0 },\n    { \"UniGB-UTF16-V\", FXCMAP_CMap::Range, g_FXCMAP_UniGB_UCS2_V_4, 24, FXCMAP_CMap::None, NULL, 0, -1 },\n};\nvoid CPDF_ModuleMgr::LoadEmbeddedGB1CMaps()\n{\n    CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();\n    pFontGlobals->m_EmbeddedCharsets[CIDSET_GB1].m_pMapList = g_FXCMAP_GB1_cmaps;\n    pFontGlobals->m_EmbeddedCharsets[CIDSET_GB1].m_Count = sizeof g_FXCMAP_GB1_cmaps / sizeof (FXCMAP_CMap);\n    pFontGlobals->m_EmbeddedToUnicodes[CIDSET_GB1].m_pMap = g_FXCMAP_GB1CID2Unicode_5;\n    pFontGlobals->m_EmbeddedToUnicodes[CIDSET_GB1].m_Count = 30284;\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Japan1/83pv-RKSJ-H_1.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_83pv_RKSJ_H_1[222 * 3] = {\n    0x0020, 0x007E, 0x0001, 0x0080, 0x0080, 0x0061, 0x00A0, 0x00DF, 0x0146,\n    0x00FD, 0x00FD, 0x0098, 0x00FE, 0x00FE, 0x00E4, 0x00FF, 0x00FF, 0x007C,\n    0x8140, 0x817E, 0x0279, 0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5,\n    0x81C8, 0x81CE, 0x02ED, 0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303,\n    0x81FC, 0x81FC, 0x030B, 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316,\n    0x8281, 0x829A, 0x0330, 0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D,\n    0x8380, 0x8396, 0x03DC, 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B,\n    0x8440, 0x8460, 0x0423, 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453,\n    0x849F, 0x849F, 0x1D37, 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43,\n    0x84A2, 0x84A2, 0x1D47, 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B,\n    0x84A5, 0x84A5, 0x1D53, 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B,\n    0x84A8, 0x84A8, 0x1D6B, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38,\n    0x84AB, 0x84AB, 0x1D3A, 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A,\n    0x84AE, 0x84AE, 0x1D52, 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A,\n    0x84B1, 0x84B1, 0x1D6A, 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72,\n    0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66,\n    0x84B7, 0x84B7, 0x1D5F, 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76,\n    0x84BA, 0x84BA, 0x1D54, 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C,\n    0x84BD, 0x84BD, 0x1D6F, 0x84BE, 0x84BE, 0x1D79, 0x8540, 0x857E, 0x00E8,\n    0x8580, 0x8580, 0x0186, 0x8581, 0x859E, 0x0128, 0x859F, 0x85DD, 0x0147,\n    0x85DE, 0x85FC, 0x0187, 0x8640, 0x867E, 0x01A6, 0x8680, 0x8691, 0x01E5,\n    0x8692, 0x8692, 0x0127, 0x8693, 0x869E, 0x01F7, 0x86A2, 0x86ED, 0x1D37,\n    0x8740, 0x875D, 0x1D83, 0x875F, 0x8775, 0x1DA1, 0x8780, 0x878F, 0x1DB8,\n    0x8790, 0x8790, 0x02FA, 0x8791, 0x8791, 0x02F9, 0x8792, 0x8792, 0x0301,\n    0x8793, 0x8799, 0x1DC8, 0x879A, 0x879A, 0x0300, 0x879B, 0x879C, 0x1DCF,\n    0x889F, 0x88FC, 0x0465, 0x8940, 0x897E, 0x04C3, 0x8980, 0x89FC, 0x0502,\n    0x8A40, 0x8A7E, 0x057F, 0x8A80, 0x8AFC, 0x05BE, 0x8B40, 0x8B7E, 0x063B,\n    0x8B80, 0x8BFC, 0x067A, 0x8C40, 0x8C7E, 0x06F7, 0x8C80, 0x8CFC, 0x0736,\n    0x8D40, 0x8D7E, 0x07B3, 0x8D80, 0x8DFC, 0x07F2, 0x8E40, 0x8E7E, 0x086F,\n    0x8E80, 0x8EFC, 0x08AE, 0x8F40, 0x8F7E, 0x092B, 0x8F80, 0x8FFC, 0x096A,\n    0x9040, 0x907E, 0x09E7, 0x9080, 0x90FC, 0x0A26, 0x9140, 0x917E, 0x0AA3,\n    0x9180, 0x91FC, 0x0AE2, 0x9240, 0x927E, 0x0B5F, 0x9280, 0x92FC, 0x0B9E,\n    0x9340, 0x937E, 0x0C1B, 0x9380, 0x93FC, 0x0C5A, 0x9440, 0x947E, 0x0CD7,\n    0x9480, 0x94FC, 0x0D16, 0x9540, 0x957E, 0x0D93, 0x9580, 0x95FC, 0x0DD2,\n    0x9640, 0x967E, 0x0E4F, 0x9680, 0x96FC, 0x0E8E, 0x9740, 0x977E, 0x0F0B,\n    0x9780, 0x97FC, 0x0F4A, 0x9840, 0x9872, 0x0FC7, 0x989F, 0x98FC, 0x0FFA,\n    0x9940, 0x997E, 0x1058, 0x9980, 0x99FC, 0x1097, 0x9A40, 0x9A7E, 0x1114,\n    0x9A80, 0x9AFC, 0x1153, 0x9B40, 0x9B7E, 0x11D0, 0x9B80, 0x9BFC, 0x120F,\n    0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CFC, 0x12CB, 0x9D40, 0x9D7E, 0x1348,\n    0x9D80, 0x9DFC, 0x1387, 0x9E40, 0x9E7E, 0x1404, 0x9E80, 0x9EFC, 0x1443,\n    0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9FFC, 0x14FF, 0xE040, 0xE07E, 0x157C,\n    0xE080, 0xE0FC, 0x15BB, 0xE140, 0xE17E, 0x1638, 0xE180, 0xE1FC, 0x1677,\n    0xE240, 0xE27E, 0x16F4, 0xE280, 0xE2FC, 0x1733, 0xE340, 0xE37E, 0x17B0,\n    0xE380, 0xE3FC, 0x17EF, 0xE440, 0xE47E, 0x186C, 0xE480, 0xE4FC, 0x18AB,\n    0xE540, 0xE57E, 0x1928, 0xE580, 0xE5FC, 0x1967, 0xE640, 0xE67E, 0x19E4,\n    0xE680, 0xE6FC, 0x1A23, 0xE740, 0xE77E, 0x1AA0, 0xE780, 0xE7FC, 0x1ADF,\n    0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE8FC, 0x1B9B, 0xE940, 0xE97E, 0x1C18,\n    0xE980, 0xE9FC, 0x1C57, 0xEA40, 0xEA7E, 0x1CD4, 0xEA80, 0xEAA2, 0x1D13,\n    0xEAA3, 0xEAA4, 0x205C, 0xEB40, 0xEB40, 0x0279, 0xEB41, 0xEB42, 0x1ECF,\n    0xEB43, 0xEB4F, 0x027C, 0xEB50, 0xEB51, 0x1ED1, 0xEB52, 0xEB5A, 0x028B,\n    0xEB5B, 0xEB5D, 0x1ED3, 0xEB5E, 0xEB5F, 0x0297, 0xEB60, 0xEB64, 0x1ED6,\n    0xEB65, 0xEB68, 0x029E, 0xEB69, 0xEB7A, 0x1EDB, 0xEB7B, 0xEB7E, 0x02B4,\n    0xEB80, 0xEB80, 0x02B8, 0xEB81, 0xEB81, 0x1EED, 0xEB82, 0xEBAC, 0x02BA,\n    0xEBB8, 0xEBBF, 0x02E5, 0xEBC8, 0xEBCE, 0x02ED, 0xEBDA, 0xEBE8, 0x02F4,\n    0xEBF0, 0xEBF7, 0x0303, 0xEBFC, 0xEBFC, 0x030B, 0xEC4F, 0xEC58, 0x030C,\n    0xEC60, 0xEC79, 0x0316, 0xEC81, 0xEC9A, 0x0330, 0xEC9F, 0xEC9F, 0x1EEE,\n    0xECA0, 0xECA0, 0x034B, 0xECA1, 0xECA1, 0x1EEF, 0xECA2, 0xECA2, 0x034D,\n    0xECA3, 0xECA3, 0x1EF0, 0xECA4, 0xECA4, 0x034F, 0xECA5, 0xECA5, 0x1EF1,\n    0xECA6, 0xECA6, 0x0351, 0xECA7, 0xECA7, 0x1EF2, 0xECA8, 0xECC0, 0x0353,\n    0xECC1, 0xECC1, 0x1EF3, 0xECC2, 0xECE0, 0x036D, 0xECE1, 0xECE1, 0x1EF4,\n    0xECE2, 0xECE2, 0x038D, 0xECE3, 0xECE3, 0x1EF5, 0xECE4, 0xECE4, 0x038F,\n    0xECE5, 0xECE5, 0x1EF6, 0xECE6, 0xECEB, 0x0391, 0xECEC, 0xECEC, 0x1EF7,\n    0xECED, 0xECF1, 0x0398, 0xED40, 0xED40, 0x1EF8, 0xED41, 0xED41, 0x039E,\n    0xED42, 0xED42, 0x1EF9, 0xED43, 0xED43, 0x03A0, 0xED44, 0xED44, 0x1EFA,\n    0xED45, 0xED45, 0x03A2, 0xED46, 0xED46, 0x1EFB, 0xED47, 0xED47, 0x03A4,\n    0xED48, 0xED48, 0x1EFC, 0xED49, 0xED61, 0x03A6, 0xED62, 0xED62, 0x1EFD,\n    0xED63, 0xED7E, 0x03C0, 0xED80, 0xED82, 0x03DC, 0xED83, 0xED83, 0x1EFE,\n    0xED84, 0xED84, 0x03E0, 0xED85, 0xED85, 0x1EFF, 0xED86, 0xED86, 0x03E2,\n    0xED87, 0xED87, 0x1F00, 0xED88, 0xED8D, 0x03E4, 0xED8E, 0xED8E, 0x1F01,\n    0xED8F, 0xED94, 0x03EB, 0xED95, 0xED96, 0x1F02, 0xED9F, 0xEDB6, 0x03F3,\n    0xEDBF, 0xEDD6, 0x040B, 0xEE40, 0xEE5D, 0x1D83, 0xEE5F, 0xEE6E, 0x1F04,\n    0xEE6F, 0xEE75, 0x1DB1, 0xEE80, 0xEE81, 0x1F14, 0xEE82, 0xEE8F, 0x1DBA,\n    0xEE90, 0xEE90, 0x02FA, 0xEE91, 0xEE91, 0x02F9, 0xEE92, 0xEE92, 0x0301,\n    0xEE93, 0xEE99, 0x1DC8, 0xEE9A, 0xEE9A, 0x0300, 0xEE9B, 0xEE9C, 0x1DCF,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-H_2.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_90ms_RKSJ_H_2[171 * 3] = {\n    0x0020, 0x007D, 0x00E7, 0x007E, 0x007E, 0x0277, 0x00A0, 0x00DF, 0x0146,\n    0x8140, 0x817E, 0x0279, 0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5,\n    0x81C8, 0x81CE, 0x02ED, 0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303,\n    0x81FC, 0x81FC, 0x030B, 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316,\n    0x8281, 0x829A, 0x0330, 0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D,\n    0x8380, 0x8396, 0x03DC, 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B,\n    0x8440, 0x8460, 0x0423, 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453,\n    0x849F, 0x849F, 0x1D37, 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43,\n    0x84A2, 0x84A2, 0x1D47, 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B,\n    0x84A5, 0x84A5, 0x1D53, 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B,\n    0x84A8, 0x84A8, 0x1D6B, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38,\n    0x84AB, 0x84AB, 0x1D3A, 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A,\n    0x84AE, 0x84AE, 0x1D52, 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A,\n    0x84B1, 0x84B1, 0x1D6A, 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72,\n    0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66,\n    0x84B7, 0x84B7, 0x1D5F, 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76,\n    0x84BA, 0x84BA, 0x1D54, 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C,\n    0x84BD, 0x84BD, 0x1D6F, 0x84BE, 0x84BE, 0x1D79, 0x8740, 0x875D, 0x1D83,\n    0x875F, 0x8760, 0x1DA1, 0x8761, 0x8761, 0x1F66, 0x8762, 0x8762, 0x1DA4,\n    0x8763, 0x8763, 0x1F68, 0x8764, 0x8764, 0x1DA6, 0x8765, 0x8765, 0x1F6A,\n    0x8766, 0x8767, 0x1DA8, 0x8768, 0x8768, 0x1F6C, 0x8769, 0x876A, 0x1DAB,\n    0x876B, 0x876B, 0x1F6B, 0x876C, 0x876D, 0x1DAE, 0x876E, 0x876E, 0x1F6F,\n    0x876F, 0x8775, 0x1DB1, 0x877E, 0x877E, 0x2083, 0x8780, 0x8783, 0x1DB8,\n    0x8784, 0x8784, 0x1F77, 0x8785, 0x878F, 0x1DBD, 0x8790, 0x8790, 0x02FA,\n    0x8791, 0x8791, 0x02F9, 0x8792, 0x8792, 0x0301, 0x8793, 0x8799, 0x1DC8,\n    0x879A, 0x879A, 0x0300, 0x879B, 0x879C, 0x1DCF, 0x889F, 0x88FC, 0x0465,\n    0x8940, 0x897E, 0x04C3, 0x8980, 0x89FC, 0x0502, 0x8A40, 0x8A7E, 0x057F,\n    0x8A80, 0x8AFC, 0x05BE, 0x8B40, 0x8B7E, 0x063B, 0x8B80, 0x8BFC, 0x067A,\n    0x8C40, 0x8C7E, 0x06F7, 0x8C80, 0x8CFC, 0x0736, 0x8D40, 0x8D7E, 0x07B3,\n    0x8D80, 0x8DFC, 0x07F2, 0x8E40, 0x8E7E, 0x086F, 0x8E80, 0x8EFC, 0x08AE,\n    0x8F40, 0x8F7E, 0x092B, 0x8F80, 0x8FFC, 0x096A, 0x9040, 0x907E, 0x09E7,\n    0x9080, 0x90FC, 0x0A26, 0x9140, 0x917E, 0x0AA3, 0x9180, 0x91FC, 0x0AE2,\n    0x9240, 0x927E, 0x0B5F, 0x9280, 0x92FC, 0x0B9E, 0x9340, 0x937E, 0x0C1B,\n    0x9380, 0x93FC, 0x0C5A, 0x9440, 0x947E, 0x0CD7, 0x9480, 0x94FC, 0x0D16,\n    0x9540, 0x957E, 0x0D93, 0x9580, 0x95FC, 0x0DD2, 0x9640, 0x967E, 0x0E4F,\n    0x9680, 0x96FC, 0x0E8E, 0x9740, 0x977E, 0x0F0B, 0x9780, 0x97FC, 0x0F4A,\n    0x9840, 0x9872, 0x0FC7, 0x989F, 0x98FC, 0x0FFA, 0x9940, 0x997E, 0x1058,\n    0x9980, 0x99FC, 0x1097, 0x9A40, 0x9A7E, 0x1114, 0x9A80, 0x9AFC, 0x1153,\n    0x9B40, 0x9B7E, 0x11D0, 0x9B80, 0x9BFC, 0x120F, 0x9C40, 0x9C7E, 0x128C,\n    0x9C80, 0x9CFC, 0x12CB, 0x9D40, 0x9D7E, 0x1348, 0x9D80, 0x9DFC, 0x1387,\n    0x9E40, 0x9E7E, 0x1404, 0x9E80, 0x9EFC, 0x1443, 0x9F40, 0x9F7E, 0x14C0,\n    0x9F80, 0x9FFC, 0x14FF, 0xE040, 0xE07E, 0x157C, 0xE080, 0xE0FC, 0x15BB,\n    0xE140, 0xE17E, 0x1638, 0xE180, 0xE1FC, 0x1677, 0xE240, 0xE27E, 0x16F4,\n    0xE280, 0xE2FC, 0x1733, 0xE340, 0xE37E, 0x17B0, 0xE380, 0xE3FC, 0x17EF,\n    0xE440, 0xE47E, 0x186C, 0xE480, 0xE4FC, 0x18AB, 0xE540, 0xE57E, 0x1928,\n    0xE580, 0xE5FC, 0x1967, 0xE640, 0xE67E, 0x19E4, 0xE680, 0xE6FC, 0x1A23,\n    0xE740, 0xE77E, 0x1AA0, 0xE780, 0xE7FC, 0x1ADF, 0xE840, 0xE87E, 0x1B5C,\n    0xE880, 0xE8FC, 0x1B9B, 0xE940, 0xE97E, 0x1C18, 0xE980, 0xE9FC, 0x1C57,\n    0xEA40, 0xEA7E, 0x1CD4, 0xEA80, 0xEAA2, 0x1D13, 0xEAA3, 0xEAA4, 0x205C,\n    0xED40, 0xED7E, 0x20A7, 0xED80, 0xEDB3, 0x20E6, 0xEDB4, 0xEDB4, 0x07C9,\n    0xEDB5, 0xEDFC, 0x211A, 0xEE40, 0xEE7E, 0x2162, 0xEE80, 0xEEEC, 0x21A1,\n    0xEEEF, 0xEEF8, 0x1F9C, 0xEEF9, 0xEEF9, 0x02EF, 0xEEFA, 0xEEFC, 0x1F45,\n    0xFA40, 0xFA49, 0x1F9C, 0xFA4A, 0xFA53, 0x1D97, 0xFA54, 0xFA54, 0x02EF,\n    0xFA55, 0xFA57, 0x1F45, 0xFA58, 0xFA58, 0x1DC2, 0xFA59, 0xFA59, 0x1DBA,\n    0xFA5A, 0xFA5A, 0x1F77, 0xFA5B, 0xFA5B, 0x0300, 0xFA5C, 0xFA7E, 0x20A7,\n    0xFA80, 0xFACF, 0x20CA, 0xFAD0, 0xFAD0, 0x07C9, 0xFAD1, 0xFAFC, 0x211A,\n    0xFB40, 0xFB7E, 0x2146, 0xFB80, 0xFBFC, 0x2185, 0xFC40, 0xFC4B, 0x2202,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-V_2.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_90ms_RKSJ_V_2[78 * 3] = {\n    0x8141, 0x8142, 0x1ECF, 0x8143, 0x8143, 0x204C, 0x8144, 0x8144, 0x2052,\n    0x8150, 0x8151, 0x1ED1, 0x815B, 0x815D, 0x1ED3, 0x8160, 0x8164, 0x1ED6,\n    0x8169, 0x817A, 0x1EDB, 0x8181, 0x8181, 0x1EED, 0x81A8, 0x81A8, 0x02E3,\n    0x81A9, 0x81A9, 0x02E2, 0x81AA, 0x81AB, 0x02E0, 0x81AC, 0x81AC, 0x204E,\n    0x829F, 0x829F, 0x1EEE, 0x82A1, 0x82A1, 0x1EEF, 0x82A3, 0x82A3, 0x1EF0,\n    0x82A5, 0x82A5, 0x1EF1, 0x82A7, 0x82A7, 0x1EF2, 0x82C1, 0x82C1, 0x1EF3,\n    0x82E1, 0x82E1, 0x1EF4, 0x82E3, 0x82E3, 0x1EF5, 0x82E5, 0x82E5, 0x1EF6,\n    0x82EC, 0x82EC, 0x1EF7, 0x8340, 0x8340, 0x1EF8, 0x8342, 0x8342, 0x1EF9,\n    0x8344, 0x8344, 0x1EFA, 0x8346, 0x8346, 0x1EFB, 0x8348, 0x8348, 0x1EFC,\n    0x8362, 0x8362, 0x1EFD, 0x8383, 0x8383, 0x1EFE, 0x8385, 0x8385, 0x1EFF,\n    0x8387, 0x8387, 0x1F00, 0x838E, 0x838E, 0x1F01, 0x8395, 0x8396, 0x1F02,\n    0x849F, 0x849F, 0x1D39, 0x84A0, 0x84A0, 0x1D37, 0x84A1, 0x84A1, 0x1D47,\n    0x84A2, 0x84A2, 0x1D4F, 0x84A3, 0x84A3, 0x1D4B, 0x84A4, 0x84A4, 0x1D43,\n    0x84A5, 0x84A5, 0x1D63, 0x84A6, 0x84A6, 0x1D5B, 0x84A7, 0x84A7, 0x1D6B,\n    0x84A8, 0x84A8, 0x1D53, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D3A,\n    0x84AB, 0x84AB, 0x1D38, 0x84AC, 0x84AC, 0x1D4A, 0x84AD, 0x84AD, 0x1D52,\n    0x84AE, 0x84AE, 0x1D4E, 0x84AF, 0x84AF, 0x1D46, 0x84B0, 0x84B0, 0x1D6A,\n    0x84B1, 0x84B1, 0x1D62, 0x84B2, 0x84B2, 0x1D72, 0x84B3, 0x84B3, 0x1D5A,\n    0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D66, 0x84B6, 0x84B6, 0x1D5F,\n    0x84B7, 0x84B7, 0x1D6E, 0x84B8, 0x84B8, 0x1D57, 0x84B9, 0x84B9, 0x1D79,\n    0x84BA, 0x84BA, 0x1D67, 0x84BB, 0x84BB, 0x1D5C, 0x84BC, 0x84BC, 0x1D6F,\n    0x84BD, 0x84BD, 0x1D54, 0x84BE, 0x84BE, 0x1D76, 0x875F, 0x8760, 0x1F04,\n    0x8761, 0x8761, 0x2089, 0x8762, 0x8762, 0x1F07, 0x8763, 0x8763, 0x2093,\n    0x8764, 0x8764, 0x1F09, 0x8765, 0x8765, 0x2092, 0x8766, 0x8767, 0x1F0B,\n    0x8768, 0x8768, 0x2098, 0x8769, 0x876A, 0x1F0E, 0x876B, 0x876B, 0x209C,\n    0x876C, 0x876D, 0x1F11, 0x876E, 0x876E, 0x209D, 0x8780, 0x8781, 0x1F14,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-H_2.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_90msp_RKSJ_H_2[170 * 3] = {\n    0x0020, 0x007E, 0x0001, 0x00A0, 0x00DF, 0x0146, 0x8140, 0x817E, 0x0279,\n    0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5, 0x81C8, 0x81CE, 0x02ED,\n    0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303, 0x81FC, 0x81FC, 0x030B,\n    0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316, 0x8281, 0x829A, 0x0330,\n    0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D, 0x8380, 0x8396, 0x03DC,\n    0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B, 0x8440, 0x8460, 0x0423,\n    0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453, 0x849F, 0x849F, 0x1D37,\n    0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43, 0x84A2, 0x84A2, 0x1D47,\n    0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B, 0x84A5, 0x84A5, 0x1D53,\n    0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B, 0x84A8, 0x84A8, 0x1D6B,\n    0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38, 0x84AB, 0x84AB, 0x1D3A,\n    0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A, 0x84AE, 0x84AE, 0x1D52,\n    0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A, 0x84B1, 0x84B1, 0x1D6A,\n    0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72, 0x84B4, 0x84B4, 0x1D82,\n    0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66, 0x84B7, 0x84B7, 0x1D5F,\n    0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76, 0x84BA, 0x84BA, 0x1D54,\n    0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C, 0x84BD, 0x84BD, 0x1D6F,\n    0x84BE, 0x84BE, 0x1D79, 0x8740, 0x875D, 0x1D83, 0x875F, 0x8760, 0x1DA1,\n    0x8761, 0x8761, 0x1F66, 0x8762, 0x8762, 0x1DA4, 0x8763, 0x8763, 0x1F68,\n    0x8764, 0x8764, 0x1DA6, 0x8765, 0x8765, 0x1F6A, 0x8766, 0x8767, 0x1DA8,\n    0x8768, 0x8768, 0x1F6C, 0x8769, 0x876A, 0x1DAB, 0x876B, 0x876B, 0x1F6B,\n    0x876C, 0x876D, 0x1DAE, 0x876E, 0x876E, 0x1F6F, 0x876F, 0x8775, 0x1DB1,\n    0x877E, 0x877E, 0x2083, 0x8780, 0x8783, 0x1DB8, 0x8784, 0x8784, 0x1F77,\n    0x8785, 0x878F, 0x1DBD, 0x8790, 0x8790, 0x02FA, 0x8791, 0x8791, 0x02F9,\n    0x8792, 0x8792, 0x0301, 0x8793, 0x8799, 0x1DC8, 0x879A, 0x879A, 0x0300,\n    0x879B, 0x879C, 0x1DCF, 0x889F, 0x88FC, 0x0465, 0x8940, 0x897E, 0x04C3,\n    0x8980, 0x89FC, 0x0502, 0x8A40, 0x8A7E, 0x057F, 0x8A80, 0x8AFC, 0x05BE,\n    0x8B40, 0x8B7E, 0x063B, 0x8B80, 0x8BFC, 0x067A, 0x8C40, 0x8C7E, 0x06F7,\n    0x8C80, 0x8CFC, 0x0736, 0x8D40, 0x8D7E, 0x07B3, 0x8D80, 0x8DFC, 0x07F2,\n    0x8E40, 0x8E7E, 0x086F, 0x8E80, 0x8EFC, 0x08AE, 0x8F40, 0x8F7E, 0x092B,\n    0x8F80, 0x8FFC, 0x096A, 0x9040, 0x907E, 0x09E7, 0x9080, 0x90FC, 0x0A26,\n    0x9140, 0x917E, 0x0AA3, 0x9180, 0x91FC, 0x0AE2, 0x9240, 0x927E, 0x0B5F,\n    0x9280, 0x92FC, 0x0B9E, 0x9340, 0x937E, 0x0C1B, 0x9380, 0x93FC, 0x0C5A,\n    0x9440, 0x947E, 0x0CD7, 0x9480, 0x94FC, 0x0D16, 0x9540, 0x957E, 0x0D93,\n    0x9580, 0x95FC, 0x0DD2, 0x9640, 0x967E, 0x0E4F, 0x9680, 0x96FC, 0x0E8E,\n    0x9740, 0x977E, 0x0F0B, 0x9780, 0x97FC, 0x0F4A, 0x9840, 0x9872, 0x0FC7,\n    0x989F, 0x98FC, 0x0FFA, 0x9940, 0x997E, 0x1058, 0x9980, 0x99FC, 0x1097,\n    0x9A40, 0x9A7E, 0x1114, 0x9A80, 0x9AFC, 0x1153, 0x9B40, 0x9B7E, 0x11D0,\n    0x9B80, 0x9BFC, 0x120F, 0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CFC, 0x12CB,\n    0x9D40, 0x9D7E, 0x1348, 0x9D80, 0x9DFC, 0x1387, 0x9E40, 0x9E7E, 0x1404,\n    0x9E80, 0x9EFC, 0x1443, 0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9FFC, 0x14FF,\n    0xE040, 0xE07E, 0x157C, 0xE080, 0xE0FC, 0x15BB, 0xE140, 0xE17E, 0x1638,\n    0xE180, 0xE1FC, 0x1677, 0xE240, 0xE27E, 0x16F4, 0xE280, 0xE2FC, 0x1733,\n    0xE340, 0xE37E, 0x17B0, 0xE380, 0xE3FC, 0x17EF, 0xE440, 0xE47E, 0x186C,\n    0xE480, 0xE4FC, 0x18AB, 0xE540, 0xE57E, 0x1928, 0xE580, 0xE5FC, 0x1967,\n    0xE640, 0xE67E, 0x19E4, 0xE680, 0xE6FC, 0x1A23, 0xE740, 0xE77E, 0x1AA0,\n    0xE780, 0xE7FC, 0x1ADF, 0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE8FC, 0x1B9B,\n    0xE940, 0xE97E, 0x1C18, 0xE980, 0xE9FC, 0x1C57, 0xEA40, 0xEA7E, 0x1CD4,\n    0xEA80, 0xEAA2, 0x1D13, 0xEAA3, 0xEAA4, 0x205C, 0xED40, 0xED7E, 0x20A7,\n    0xED80, 0xEDB3, 0x20E6, 0xEDB4, 0xEDB4, 0x07C9, 0xEDB5, 0xEDFC, 0x211A,\n    0xEE40, 0xEE7E, 0x2162, 0xEE80, 0xEEEC, 0x21A1, 0xEEEF, 0xEEF8, 0x1F9C,\n    0xEEF9, 0xEEF9, 0x02EF, 0xEEFA, 0xEEFC, 0x1F45, 0xFA40, 0xFA49, 0x1F9C,\n    0xFA4A, 0xFA53, 0x1D97, 0xFA54, 0xFA54, 0x02EF, 0xFA55, 0xFA57, 0x1F45,\n    0xFA58, 0xFA58, 0x1DC2, 0xFA59, 0xFA59, 0x1DBA, 0xFA5A, 0xFA5A, 0x1F77,\n    0xFA5B, 0xFA5B, 0x0300, 0xFA5C, 0xFA7E, 0x20A7, 0xFA80, 0xFACF, 0x20CA,\n    0xFAD0, 0xFAD0, 0x07C9, 0xFAD1, 0xFAFC, 0x211A, 0xFB40, 0xFB7E, 0x2146,\n    0xFB80, 0xFBFC, 0x2185, 0xFC40, 0xFC4B, 0x2202,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-V_2.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_90msp_RKSJ_V_2[78 * 3] = {\n    0x8141, 0x8142, 0x1ECF, 0x8143, 0x8143, 0x204C, 0x8144, 0x8144, 0x2052,\n    0x8150, 0x8151, 0x1ED1, 0x815B, 0x815D, 0x1ED3, 0x8160, 0x8164, 0x1ED6,\n    0x8169, 0x817A, 0x1EDB, 0x8181, 0x8181, 0x1EED, 0x81A8, 0x81A8, 0x02E3,\n    0x81A9, 0x81A9, 0x02E2, 0x81AA, 0x81AB, 0x02E0, 0x81AC, 0x81AC, 0x204E,\n    0x829F, 0x829F, 0x1EEE, 0x82A1, 0x82A1, 0x1EEF, 0x82A3, 0x82A3, 0x1EF0,\n    0x82A5, 0x82A5, 0x1EF1, 0x82A7, 0x82A7, 0x1EF2, 0x82C1, 0x82C1, 0x1EF3,\n    0x82E1, 0x82E1, 0x1EF4, 0x82E3, 0x82E3, 0x1EF5, 0x82E5, 0x82E5, 0x1EF6,\n    0x82EC, 0x82EC, 0x1EF7, 0x8340, 0x8340, 0x1EF8, 0x8342, 0x8342, 0x1EF9,\n    0x8344, 0x8344, 0x1EFA, 0x8346, 0x8346, 0x1EFB, 0x8348, 0x8348, 0x1EFC,\n    0x8362, 0x8362, 0x1EFD, 0x8383, 0x8383, 0x1EFE, 0x8385, 0x8385, 0x1EFF,\n    0x8387, 0x8387, 0x1F00, 0x838E, 0x838E, 0x1F01, 0x8395, 0x8396, 0x1F02,\n    0x849F, 0x849F, 0x1D39, 0x84A0, 0x84A0, 0x1D37, 0x84A1, 0x84A1, 0x1D47,\n    0x84A2, 0x84A2, 0x1D4F, 0x84A3, 0x84A3, 0x1D4B, 0x84A4, 0x84A4, 0x1D43,\n    0x84A5, 0x84A5, 0x1D63, 0x84A6, 0x84A6, 0x1D5B, 0x84A7, 0x84A7, 0x1D6B,\n    0x84A8, 0x84A8, 0x1D53, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D3A,\n    0x84AB, 0x84AB, 0x1D38, 0x84AC, 0x84AC, 0x1D4A, 0x84AD, 0x84AD, 0x1D52,\n    0x84AE, 0x84AE, 0x1D4E, 0x84AF, 0x84AF, 0x1D46, 0x84B0, 0x84B0, 0x1D6A,\n    0x84B1, 0x84B1, 0x1D62, 0x84B2, 0x84B2, 0x1D72, 0x84B3, 0x84B3, 0x1D5A,\n    0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D66, 0x84B6, 0x84B6, 0x1D5F,\n    0x84B7, 0x84B7, 0x1D6E, 0x84B8, 0x84B8, 0x1D57, 0x84B9, 0x84B9, 0x1D79,\n    0x84BA, 0x84BA, 0x1D67, 0x84BB, 0x84BB, 0x1D5C, 0x84BC, 0x84BC, 0x1D6F,\n    0x84BD, 0x84BD, 0x1D54, 0x84BE, 0x84BE, 0x1D76, 0x875F, 0x8760, 0x1F04,\n    0x8761, 0x8761, 0x2089, 0x8762, 0x8762, 0x1F07, 0x8763, 0x8763, 0x2093,\n    0x8764, 0x8764, 0x1F09, 0x8765, 0x8765, 0x2092, 0x8766, 0x8767, 0x1F0B,\n    0x8768, 0x8768, 0x2098, 0x8769, 0x876A, 0x1F0E, 0x876B, 0x876B, 0x209C,\n    0x876C, 0x876D, 0x1F11, 0x876E, 0x876E, 0x209D, 0x8780, 0x8781, 0x1F14,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Japan1/90pv-RKSJ-H_1.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_90pv_RKSJ_H_1[263 * 3] = {\n    0x0020, 0x007E, 0x0001, 0x0080, 0x0080, 0x0061, 0x00A0, 0x00DF, 0x0146,\n    0x00FD, 0x00FD, 0x0098, 0x00FE, 0x00FE, 0x00E4, 0x00FF, 0x00FF, 0x007C,\n    0x8140, 0x817E, 0x0279, 0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5,\n    0x81C8, 0x81CE, 0x02ED, 0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303,\n    0x81FC, 0x81FC, 0x030B, 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316,\n    0x8281, 0x829A, 0x0330, 0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D,\n    0x8380, 0x8396, 0x03DC, 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B,\n    0x8440, 0x8460, 0x0423, 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453,\n    0x849F, 0x849F, 0x1D37, 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43,\n    0x84A2, 0x84A2, 0x1D47, 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B,\n    0x84A5, 0x84A5, 0x1D53, 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B,\n    0x84A8, 0x84A8, 0x1D6B, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38,\n    0x84AB, 0x84AB, 0x1D3A, 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A,\n    0x84AE, 0x84AE, 0x1D52, 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A,\n    0x84B1, 0x84B1, 0x1D6A, 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72,\n    0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66,\n    0x84B7, 0x84B7, 0x1D5F, 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76,\n    0x84BA, 0x84BA, 0x1D54, 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C,\n    0x84BD, 0x84BD, 0x1D6F, 0x84BE, 0x84BE, 0x1D79, 0x8540, 0x8553, 0x1D83,\n    0x855E, 0x8571, 0x1F87, 0x857C, 0x857E, 0x205E, 0x8580, 0x8585, 0x2061,\n    0x8591, 0x859A, 0x1F7D, 0x859F, 0x85A8, 0x1D97, 0x85A9, 0x85AA, 0x2021,\n    0x85AB, 0x85AD, 0x2067, 0x85B3, 0x85BC, 0x1F9C, 0x85BD, 0x85C1, 0x206A,\n    0x85DB, 0x85F4, 0x1FB0, 0x8640, 0x8640, 0x1DB1, 0x8641, 0x8641, 0x1FFA,\n    0x8642, 0x8642, 0x1DB2, 0x8643, 0x8643, 0x1F54, 0x8644, 0x8644, 0x1F56,\n    0x8645, 0x8645, 0x206F, 0x8646, 0x8646, 0x1DB7, 0x8647, 0x8647, 0x1F57,\n    0x8648, 0x8648, 0x1DB3, 0x8649, 0x8649, 0x1F55, 0x864A, 0x864A, 0x1DB4,\n    0x864B, 0x864B, 0x2070, 0x864C, 0x864D, 0x1DB5, 0x864E, 0x864E, 0x1F65,\n    0x864F, 0x8655, 0x1F58, 0x8656, 0x8656, 0x2071, 0x8657, 0x8657, 0x1F64,\n    0x8658, 0x8659, 0x1F62, 0x865A, 0x865C, 0x1F5F, 0x865D, 0x865D, 0x2072,\n    0x869B, 0x869D, 0x1DBA, 0x869E, 0x869E, 0x2073, 0x869F, 0x869F, 0x1F52,\n    0x86A0, 0x86A1, 0x1F50, 0x86A2, 0x86A2, 0x1F53, 0x86A3, 0x86A3, 0x2013,\n    0x86A4, 0x86A4, 0x2015, 0x86A5, 0x86A5, 0x2014, 0x86A6, 0x86A6, 0x2016,\n    0x86B3, 0x86B3, 0x1F7A, 0x86B4, 0x86B4, 0x1F78, 0x86B5, 0x86B5, 0x2074,\n    0x86C7, 0x86CA, 0x201B, 0x86CB, 0x86CE, 0x2075, 0x86CF, 0x86CF, 0x1F4E,\n    0x86D0, 0x86D0, 0x1F4D, 0x86D1, 0x86D1, 0x1F4C, 0x86D2, 0x86D2, 0x1F4B,\n    0x86D3, 0x86D6, 0x200E, 0x8740, 0x8746, 0x2005, 0x8747, 0x8747, 0x1FD6,\n    0x8748, 0x8748, 0x200C, 0x8749, 0x8749, 0x1FD1, 0x874A, 0x874A, 0x1FCA,\n    0x874B, 0x874B, 0x1DC4, 0x874C, 0x874C, 0x1FD7, 0x874D, 0x874D, 0x1DC2,\n    0x874E, 0x874E, 0x1FD2, 0x874F, 0x874F, 0x1FCD, 0x8750, 0x8750, 0x1DC3,\n    0x8751, 0x8751, 0x1FD5, 0x8752, 0x8752, 0x1FD3, 0x8753, 0x8753, 0x1FCF,\n    0x8754, 0x8754, 0x1FD4, 0x8755, 0x8755, 0x1FD0, 0x8756, 0x8757, 0x1FCB,\n    0x8758, 0x8758, 0x1FCE, 0x8791, 0x8792, 0x207D, 0x8793, 0x8797, 0x1DBD,\n    0x8798, 0x8798, 0x1FDA, 0x8799, 0x8799, 0x1FE5, 0x879A, 0x879A, 0x207F,\n    0x879B, 0x879B, 0x1FDE, 0x879C, 0x879C, 0x1FFF, 0x879D, 0x879D, 0x2080,\n    0x879E, 0x879E, 0x201F, 0x879F, 0x879F, 0x1DA1, 0x87A0, 0x87A0, 0x1F66,\n    0x87A1, 0x87A1, 0x1DA4, 0x87A2, 0x87A2, 0x1DA2, 0x87A3, 0x87A3, 0x1F67,\n    0x87A4, 0x87A4, 0x1FF7, 0x87A5, 0x87A6, 0x2087, 0x87A7, 0x87A7, 0x1F6A,\n    0x87A8, 0x87A8, 0x1DA8, 0x87A9, 0x87AA, 0x1F68, 0x87AB, 0x87AB, 0x1DA6,\n    0x87AC, 0x87AC, 0x1DA9, 0x87AD, 0x87AD, 0x1DAF, 0x87AE, 0x87AE, 0x1F6E,\n    0x87AF, 0x87AF, 0x1F6C, 0x87B0, 0x87B0, 0x1DAB, 0x87B1, 0x87B1, 0x1F6D,\n    0x87B2, 0x87B2, 0x1F6B, 0x87B3, 0x87B3, 0x1DAC, 0x87B4, 0x87B4, 0x1F6F,\n    0x87B5, 0x87B5, 0x1DAE, 0x87BD, 0x87BD, 0x1F70, 0x87BE, 0x87BF, 0x1F73,\n    0x87C0, 0x87C1, 0x1F71, 0x87E5, 0x87E7, 0x1DC5, 0x87E8, 0x87E8, 0x2083,\n    0x87FA, 0x87FA, 0x1F76, 0x87FB, 0x87FC, 0x2081, 0x8840, 0x8840, 0x1DC8,\n    0x8841, 0x8842, 0x1DCD, 0x8854, 0x8855, 0x1DB8, 0x8868, 0x8868, 0x1F16,\n    0x886A, 0x886D, 0x2079, 0x889F, 0x88FC, 0x0465, 0x8940, 0x897E, 0x04C3,\n    0x8980, 0x89FC, 0x0502, 0x8A40, 0x8A7E, 0x057F, 0x8A80, 0x8AFC, 0x05BE,\n    0x8B40, 0x8B7E, 0x063B, 0x8B80, 0x8BFC, 0x067A, 0x8C40, 0x8C7E, 0x06F7,\n    0x8C80, 0x8CFC, 0x0736, 0x8D40, 0x8D7E, 0x07B3, 0x8D80, 0x8DFC, 0x07F2,\n    0x8E40, 0x8E7E, 0x086F, 0x8E80, 0x8EFC, 0x08AE, 0x8F40, 0x8F7E, 0x092B,\n    0x8F80, 0x8FFC, 0x096A, 0x9040, 0x907E, 0x09E7, 0x9080, 0x90FC, 0x0A26,\n    0x9140, 0x917E, 0x0AA3, 0x9180, 0x91FC, 0x0AE2, 0x9240, 0x927E, 0x0B5F,\n    0x9280, 0x92FC, 0x0B9E, 0x9340, 0x937E, 0x0C1B, 0x9380, 0x93FC, 0x0C5A,\n    0x9440, 0x947E, 0x0CD7, 0x9480, 0x94FC, 0x0D16, 0x9540, 0x957E, 0x0D93,\n    0x9580, 0x95FC, 0x0DD2, 0x9640, 0x967E, 0x0E4F, 0x9680, 0x96FC, 0x0E8E,\n    0x9740, 0x977E, 0x0F0B, 0x9780, 0x97FC, 0x0F4A, 0x9840, 0x9872, 0x0FC7,\n    0x989F, 0x98FC, 0x0FFA, 0x9940, 0x997E, 0x1058, 0x9980, 0x99FC, 0x1097,\n    0x9A40, 0x9A7E, 0x1114, 0x9A80, 0x9AFC, 0x1153, 0x9B40, 0x9B7E, 0x11D0,\n    0x9B80, 0x9BFC, 0x120F, 0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CFC, 0x12CB,\n    0x9D40, 0x9D7E, 0x1348, 0x9D80, 0x9DFC, 0x1387, 0x9E40, 0x9E7E, 0x1404,\n    0x9E80, 0x9EFC, 0x1443, 0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9FFC, 0x14FF,\n    0xE040, 0xE07E, 0x157C, 0xE080, 0xE0FC, 0x15BB, 0xE140, 0xE17E, 0x1638,\n    0xE180, 0xE1FC, 0x1677, 0xE240, 0xE27E, 0x16F4, 0xE280, 0xE2FC, 0x1733,\n    0xE340, 0xE37E, 0x17B0, 0xE380, 0xE3FC, 0x17EF, 0xE440, 0xE47E, 0x186C,\n    0xE480, 0xE4FC, 0x18AB, 0xE540, 0xE57E, 0x1928, 0xE580, 0xE5FC, 0x1967,\n    0xE640, 0xE67E, 0x19E4, 0xE680, 0xE6FC, 0x1A23, 0xE740, 0xE77E, 0x1AA0,\n    0xE780, 0xE7FC, 0x1ADF, 0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE8FC, 0x1B9B,\n    0xE940, 0xE97E, 0x1C18, 0xE980, 0xE9FC, 0x1C57, 0xEA40, 0xEA7E, 0x1CD4,\n    0xEA80, 0xEAA2, 0x1D13, 0xEAA3, 0xEAA4, 0x205C, 0xEB41, 0xEB42, 0x1ECF,\n    0xEB50, 0xEB51, 0x1ED1, 0xEB5B, 0xEB5D, 0x1ED3, 0xEB60, 0xEB64, 0x1ED6,\n    0xEB69, 0xEB7A, 0x1EDB, 0xEB81, 0xEB81, 0x1EED, 0xEC9F, 0xEC9F, 0x1EEE,\n    0xECA1, 0xECA1, 0x1EEF, 0xECA3, 0xECA3, 0x1EF0, 0xECA5, 0xECA5, 0x1EF1,\n    0xECA7, 0xECA7, 0x1EF2, 0xECC1, 0xECC1, 0x1EF3, 0xECE1, 0xECE1, 0x1EF4,\n    0xECE3, 0xECE3, 0x1EF5, 0xECE5, 0xECE5, 0x1EF6, 0xECEC, 0xECEC, 0x1EF7,\n    0xED40, 0xED40, 0x1EF8, 0xED42, 0xED42, 0x1EF9, 0xED44, 0xED44, 0x1EFA,\n    0xED46, 0xED46, 0x1EFB, 0xED48, 0xED48, 0x1EFC, 0xED62, 0xED62, 0x1EFD,\n    0xED83, 0xED83, 0x1EFE, 0xED85, 0xED85, 0x1EFF, 0xED87, 0xED87, 0x1F00,\n    0xED8E, 0xED8E, 0x1F01, 0xED95, 0xED96, 0x1F02,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-H_1.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_Add_RKSJ_H_1[635 * 3] = {\n    0x0020, 0x007E, 0x00E7, 0x00A0, 0x00DF, 0x0146, 0x8140, 0x817E, 0x0279,\n    0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5, 0x81C8, 0x81CE, 0x02ED,\n    0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303, 0x81FC, 0x81FC, 0x030B,\n    0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316, 0x8281, 0x829A, 0x0330,\n    0x829F, 0x82F1, 0x034A, 0x82F2, 0x82F4, 0x1F16, 0x8340, 0x837E, 0x039D,\n    0x8380, 0x8396, 0x03DC, 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B,\n    0x8440, 0x8460, 0x0423, 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453,\n    0x849F, 0x849F, 0x1D37, 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43,\n    0x84A2, 0x84A2, 0x1D47, 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B,\n    0x84A5, 0x84A5, 0x1D53, 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B,\n    0x84A8, 0x84A8, 0x1D6B, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38,\n    0x84AB, 0x84AB, 0x1D3A, 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A,\n    0x84AE, 0x84AE, 0x1D52, 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A,\n    0x84B1, 0x84B1, 0x1D6A, 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72,\n    0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66,\n    0x84B7, 0x84B7, 0x1D5F, 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76,\n    0x84BA, 0x84BA, 0x1D54, 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C,\n    0x84BD, 0x84BD, 0x1D6F, 0x84BE, 0x84BE, 0x1D79, 0x889F, 0x889F, 0x0465,\n    0x88A0, 0x88A0, 0x1DD1, 0x88A1, 0x88AF, 0x0467, 0x88B0, 0x88B0, 0x1F19,\n    0x88B1, 0x88B8, 0x0477, 0x88B9, 0x88B9, 0x1DD2, 0x88BA, 0x88EB, 0x0480,\n    0x88EC, 0x88EC, 0x1DD3, 0x88ED, 0x88EE, 0x04B3, 0x88EF, 0x88EF, 0x1F1A,\n    0x88F0, 0x88F0, 0x04B6, 0x88F1, 0x88F1, 0x1DD4, 0x88F2, 0x88F9, 0x04B8,\n    0x88FA, 0x88FA, 0x1DD5, 0x88FB, 0x88FC, 0x04C1, 0x8940, 0x8948, 0x04C3,\n    0x8949, 0x8949, 0x1DD6, 0x894A, 0x8951, 0x04CD, 0x8952, 0x8952, 0x1F1B,\n    0x8953, 0x8953, 0x04D6, 0x8954, 0x8954, 0x1DD7, 0x8955, 0x8957, 0x04D8,\n    0x8958, 0x8958, 0x1F1C, 0x8959, 0x895B, 0x04DC, 0x895C, 0x895C, 0x1DDA,\n    0x895D, 0x8960, 0x04E0, 0x8961, 0x8961, 0x1DDB, 0x8962, 0x897E, 0x04E5,\n    0x8980, 0x898A, 0x0502, 0x898B, 0x898B, 0x1DDC, 0x898C, 0x89A5, 0x050E,\n    0x89A6, 0x89A6, 0x1DDD, 0x89A7, 0x89A7, 0x0529, 0x89A8, 0x89A8, 0x1DDE,\n    0x89A9, 0x89DD, 0x052B, 0x89DE, 0x89DE, 0x1DDF, 0x89DF, 0x89E4, 0x0561,\n    0x89E5, 0x89E5, 0x1F1D, 0x89E6, 0x89F7, 0x0568, 0x89F8, 0x89F8, 0x1DE0,\n    0x89F9, 0x89FC, 0x057B, 0x8A40, 0x8A40, 0x057F, 0x8A41, 0x8A41, 0x1DE2,\n    0x8A42, 0x8A7E, 0x0581, 0x8A80, 0x8A8A, 0x05BE, 0x8A8B, 0x8A8B, 0x1DE4,\n    0x8A8C, 0x8A92, 0x05CA, 0x8A93, 0x8A93, 0x1DE5, 0x8A94, 0x8A99, 0x05D2,\n    0x8A9A, 0x8A9A, 0x1DE6, 0x8A9B, 0x8ABF, 0x05D9, 0x8AC0, 0x8AC0, 0x1DE7,\n    0x8AC1, 0x8ACA, 0x05FF, 0x8ACB, 0x8ACB, 0x1DE8, 0x8ACC, 0x8AE2, 0x060A,\n    0x8AE3, 0x8AE3, 0x1DE9, 0x8AE4, 0x8AFC, 0x0622, 0x8B40, 0x8B49, 0x063B,\n    0x8B4A, 0x8B4A, 0x1DEA, 0x8B4B, 0x8B5E, 0x0646, 0x8B5F, 0x8B5F, 0x1DEB,\n    0x8B60, 0x8B7E, 0x065B, 0x8B80, 0x8B81, 0x067A, 0x8B82, 0x8B82, 0x1F1E,\n    0x8B83, 0x8B87, 0x067D, 0x8B88, 0x8B88, 0x1F1F, 0x8B89, 0x8B9F, 0x0683,\n    0x8BA0, 0x8BA0, 0x1DEC, 0x8BA1, 0x8BA7, 0x069B, 0x8BA8, 0x8BA8, 0x1DED,\n    0x8BA9, 0x8BBF, 0x06A3, 0x8BC0, 0x8BC0, 0x1F20, 0x8BC1, 0x8BCC, 0x06BB,\n    0x8BCD, 0x8BCD, 0x1DEE, 0x8BCE, 0x8BEA, 0x06C8, 0x8BEB, 0x8BEB, 0x1DEF,\n    0x8BEC, 0x8BF1, 0x06E6, 0x8BF2, 0x8BF2, 0x1DF0, 0x8BF3, 0x8BF8, 0x06ED,\n    0x8BF9, 0x8BF9, 0x1DF1, 0x8BFA, 0x8BFA, 0x06F4, 0x8BFB, 0x8BFB, 0x1DF2,\n    0x8BFC, 0x8BFC, 0x06F6, 0x8C40, 0x8C55, 0x06F7, 0x8C56, 0x8C56, 0x1DF4,\n    0x8C57, 0x8C70, 0x070E, 0x8C71, 0x8C71, 0x1DF7, 0x8C72, 0x8C7E, 0x0729,\n    0x8C80, 0x8C90, 0x0736, 0x8C91, 0x8C91, 0x1DFA, 0x8C92, 0x8C9C, 0x0748,\n    0x8C9D, 0x8C9D, 0x1F21, 0x8C9E, 0x8C9E, 0x1DFC, 0x8C9F, 0x8CB1, 0x0755,\n    0x8CB2, 0x8CB2, 0x1DFD, 0x8CB3, 0x8CBE, 0x0769, 0x8CBF, 0x8CBF, 0x1DFE,\n    0x8CC0, 0x8CFC, 0x0776, 0x8D40, 0x8D49, 0x07B3, 0x8D4A, 0x8D4A, 0x1DFF,\n    0x8D4B, 0x8D7E, 0x07BE, 0x8D80, 0x8D8C, 0x07F2, 0x8D8D, 0x8D8D, 0x1E02,\n    0x8D8E, 0x8D93, 0x0800, 0x8D94, 0x8D94, 0x1E03, 0x8D95, 0x8D98, 0x0807,\n    0x8D99, 0x8D99, 0x1E04, 0x8D9A, 0x8DD0, 0x080C, 0x8DD1, 0x8DD1, 0x1E05,\n    0x8DD2, 0x8DE4, 0x0844, 0x8DE5, 0x8DE5, 0x1E06, 0x8DE6, 0x8DF1, 0x0858,\n    0x8DF2, 0x8DF2, 0x1E07, 0x8DF3, 0x8DFC, 0x0865, 0x8E40, 0x8E45, 0x086F,\n    0x8E46, 0x8E46, 0x1E08, 0x8E47, 0x8E48, 0x0876, 0x8E49, 0x8E49, 0x1E09,\n    0x8E4A, 0x8E4A, 0x0879, 0x8E4B, 0x8E4B, 0x1E0A, 0x8E4C, 0x8E57, 0x087B,\n    0x8E58, 0x8E58, 0x1E0B, 0x8E59, 0x8E5F, 0x0888, 0x8E60, 0x8E60, 0x1F22,\n    0x8E61, 0x8E7E, 0x0890, 0x8E80, 0x8EC5, 0x08AE, 0x8EC6, 0x8EC6, 0x1E0D,\n    0x8EC7, 0x8EDA, 0x08F5, 0x8EDB, 0x8EDC, 0x1E0F, 0x8EDD, 0x8EFC, 0x090B,\n    0x8F40, 0x8F49, 0x092B, 0x8F4A, 0x8F4A, 0x1E11, 0x8F4B, 0x8F54, 0x0936,\n    0x8F55, 0x8F55, 0x1E12, 0x8F56, 0x8F7E, 0x0941, 0x8F80, 0x8F8B, 0x096A,\n    0x8F8C, 0x8F8C, 0x1E13, 0x8F8D, 0x8F91, 0x0977, 0x8F92, 0x8F93, 0x1E15,\n    0x8F94, 0x8FA2, 0x097E, 0x8FA3, 0x8FA3, 0x1E17, 0x8FA4, 0x8FB0, 0x098E,\n    0x8FB1, 0x8FB1, 0x1E18, 0x8FB2, 0x8FD2, 0x099C, 0x8FD3, 0x8FD3, 0x1E1A,\n    0x8FD4, 0x8FDC, 0x09BE, 0x8FDD, 0x8FDD, 0x1E1B, 0x8FDE, 0x8FE1, 0x09C8,\n    0x8FE2, 0x8FE2, 0x1E1C, 0x8FE3, 0x8FFC, 0x09CD, 0x9040, 0x9048, 0x09E7,\n    0x9049, 0x9049, 0x1E1D, 0x904A, 0x9077, 0x09F1, 0x9078, 0x9078, 0x1F23,\n    0x9079, 0x907E, 0x0A20, 0x9080, 0x9080, 0x1E1F, 0x9081, 0x909F, 0x0A27,\n    0x90A0, 0x90A0, 0x1E21, 0x90A1, 0x90E3, 0x0A47, 0x90E4, 0x90E4, 0x1E23,\n    0x90E5, 0x90EE, 0x0A8B, 0x90EF, 0x90EF, 0x1E24, 0x90F0, 0x90F6, 0x0A96,\n    0x90F7, 0x90F7, 0x1E26, 0x90F8, 0x90F8, 0x1F24, 0x90F9, 0x90F9, 0x0A9F,\n    0x90FA, 0x90FB, 0x1F25, 0x90FC, 0x90FC, 0x0AA2, 0x9140, 0x9145, 0x0AA3,\n    0x9146, 0x9146, 0x1E28, 0x9147, 0x9157, 0x0AAA, 0x9158, 0x9158, 0x1E29,\n    0x9159, 0x916A, 0x0ABC, 0x916B, 0x916B, 0x1E2A, 0x916C, 0x916D, 0x0ACF,\n    0x916E, 0x916E, 0x1E2B, 0x916F, 0x917D, 0x0AD2, 0x917E, 0x917E, 0x1E2C,\n    0x9180, 0x9188, 0x0AE2, 0x9189, 0x9189, 0x1E2D, 0x918A, 0x91B4, 0x0AEC,\n    0x91B5, 0x91B5, 0x1F27, 0x91B6, 0x91BA, 0x0B18, 0x91BB, 0x91BB, 0x1E2E,\n    0x91BC, 0x91CA, 0x0B1E, 0x91CB, 0x91CB, 0x1E2F, 0x91CC, 0x91D9, 0x0B2E,\n    0x91DA, 0x91DA, 0x1E30, 0x91DB, 0x91E0, 0x0B3D, 0x91E1, 0x91E1, 0x1E31,\n    0x91E2, 0x91EC, 0x0B44, 0x91ED, 0x91ED, 0x1E32, 0x91EE, 0x91FA, 0x0B50,\n    0x91FB, 0x91FB, 0x1E35, 0x91FC, 0x91FC, 0x0B5E, 0x9240, 0x9245, 0x0B5F,\n    0x9246, 0x9246, 0x1E36, 0x9247, 0x9247, 0x0B66, 0x9248, 0x9248, 0x1E37,\n    0x9249, 0x924B, 0x0B68, 0x924C, 0x924D, 0x1E39, 0x924E, 0x925B, 0x0B6D,\n    0x925C, 0x925C, 0x1E3B, 0x925D, 0x927E, 0x0B7C, 0x9280, 0x928F, 0x0B9E,\n    0x9290, 0x9290, 0x1E3C, 0x9291, 0x9294, 0x0BAF, 0x9295, 0x9295, 0x1E3D,\n    0x9296, 0x929B, 0x0BB4, 0x929C, 0x929C, 0x1E3E, 0x929D, 0x92BA, 0x0BBB,\n    0x92BB, 0x92BB, 0x1E3F, 0x92BC, 0x92C5, 0x0BDA, 0x92C6, 0x92C6, 0x1E40,\n    0x92C7, 0x92C7, 0x0BE5, 0x92C8, 0x92C8, 0x1E41, 0x92C9, 0x92CC, 0x0BE7,\n    0x92CD, 0x92CD, 0x1E43, 0x92CE, 0x92FC, 0x0BEC, 0x9340, 0x9340, 0x0C1B,\n    0x9341, 0x9341, 0x1E44, 0x9342, 0x9345, 0x0C1D, 0x9346, 0x9346, 0x1E45,\n    0x9347, 0x934C, 0x0C22, 0x934D, 0x934D, 0x1E46, 0x934E, 0x9354, 0x0C29,\n    0x9355, 0x9355, 0x1E47, 0x9356, 0x935D, 0x0C31, 0x935E, 0x935E, 0x1E48,\n    0x935F, 0x9366, 0x0C3A, 0x9367, 0x9367, 0x1E49, 0x9368, 0x9369, 0x0C43,\n    0x936A, 0x936A, 0x1E4A, 0x936B, 0x936F, 0x0C46, 0x9370, 0x9370, 0x1F28,\n    0x9371, 0x9371, 0x1E4C, 0x9372, 0x937E, 0x0C4D, 0x9380, 0x9383, 0x0C5A,\n    0x9384, 0x9384, 0x1E4D, 0x9385, 0x9397, 0x0C5F, 0x9398, 0x9398, 0x1E4E,\n    0x9399, 0x93BF, 0x0C73, 0x93C0, 0x93C0, 0x1E50, 0x93C1, 0x93D1, 0x0C9B,\n    0x93D2, 0x93D2, 0x1E51, 0x93D3, 0x93D8, 0x0CAD, 0x93D9, 0x93D9, 0x1E53,\n    0x93DA, 0x93E3, 0x0CB4, 0x93E4, 0x93E5, 0x1E56, 0x93E6, 0x93E7, 0x0CC0,\n    0x93E8, 0x93E8, 0x1E58, 0x93E9, 0x93F3, 0x0CC3, 0x93F4, 0x93F4, 0x1EC0,\n    0x93F5, 0x93FC, 0x0CCF, 0x9440, 0x9447, 0x0CD7, 0x9448, 0x9448, 0x1E59,\n    0x9449, 0x9449, 0x1F29, 0x944A, 0x9457, 0x0CE1, 0x9458, 0x9458, 0x1E5A,\n    0x9459, 0x9475, 0x0CF0, 0x9476, 0x9476, 0x1E5B, 0x9477, 0x947E, 0x0D0E,\n    0x9480, 0x9486, 0x0D16, 0x9487, 0x9487, 0x1E5C, 0x9488, 0x9488, 0x0D1E,\n    0x9489, 0x9489, 0x1E5D, 0x948A, 0x948C, 0x0D20, 0x948D, 0x948D, 0x1E5E,\n    0x948E, 0x94A1, 0x0D24, 0x94A2, 0x94A2, 0x1E5F, 0x94A3, 0x94AB, 0x0D39,\n    0x94AC, 0x94AC, 0x1E60, 0x94AD, 0x94AD, 0x0D43, 0x94AE, 0x94AE, 0x1E61,\n    0x94AF, 0x94BD, 0x0D45, 0x94BE, 0x94BE, 0x1F2A, 0x94BF, 0x94D1, 0x0D55,\n    0x94D2, 0x94D2, 0x1E62, 0x94D3, 0x94F2, 0x0D69, 0x94F3, 0x94F3, 0x1E64,\n    0x94F4, 0x94FC, 0x0D8A, 0x9540, 0x9540, 0x0D93, 0x9541, 0x9542, 0x1E65,\n    0x9543, 0x954D, 0x0D96, 0x954E, 0x954E, 0x1E67, 0x954F, 0x9550, 0x0DA2,\n    0x9551, 0x9551, 0x1E68, 0x9552, 0x9553, 0x0DA5, 0x9554, 0x9554, 0x1E69,\n    0x9555, 0x955E, 0x0DA8, 0x955F, 0x955F, 0x1E6A, 0x9560, 0x956C, 0x0DB3,\n    0x956D, 0x956D, 0x1E6B, 0x956E, 0x957E, 0x0DC1, 0x9580, 0x95C0, 0x0DD2,\n    0x95C1, 0x95C1, 0x1E6D, 0x95C2, 0x95CA, 0x0E14, 0x95CB, 0x95CB, 0x1E6E,\n    0x95CC, 0x95D0, 0x0E1E, 0x95D1, 0x95D1, 0x1F2B, 0x95D2, 0x95D7, 0x0E24,\n    0x95D8, 0x95D8, 0x1E6F, 0x95D9, 0x95F6, 0x0E2B, 0x95F7, 0x95F7, 0x1E70,\n    0x95F8, 0x95FC, 0x0E4A, 0x9640, 0x9647, 0x0E4F, 0x9648, 0x9648, 0x1E72,\n    0x9649, 0x9669, 0x0E58, 0x966A, 0x966A, 0x1E73, 0x966B, 0x967E, 0x0E7A,\n    0x9680, 0x968F, 0x0E8E, 0x9690, 0x9690, 0x1E74, 0x9691, 0x9697, 0x0E9F,\n    0x9698, 0x9698, 0x1F2C, 0x9699, 0x96CA, 0x0EA7, 0x96CB, 0x96CB, 0x1E75,\n    0x96CC, 0x96D6, 0x0EDA, 0x96D7, 0x96D7, 0x1E76, 0x96D8, 0x96DC, 0x0EE6,\n    0x96DD, 0x96DD, 0x1E77, 0x96DE, 0x96DF, 0x0EEC, 0x96E0, 0x96E0, 0x1E78,\n    0x96E1, 0x96F7, 0x0EEF, 0x96F8, 0x96F8, 0x1E79, 0x96F9, 0x96F9, 0x0F07,\n    0x96FA, 0x96FA, 0x1E7A, 0x96FB, 0x96FC, 0x0F09, 0x9740, 0x9750, 0x0F0B,\n    0x9751, 0x9751, 0x1E7C, 0x9752, 0x976E, 0x0F1D, 0x976F, 0x976F, 0x1E7D,\n    0x9770, 0x9772, 0x0F3B, 0x9773, 0x9773, 0x1E7E, 0x9774, 0x977E, 0x0F3F,\n    0x9780, 0x9788, 0x0F4A, 0x9789, 0x9789, 0x1E7F, 0x978A, 0x97F7, 0x0F54,\n    0x97F8, 0x97F9, 0x1E81, 0x97FA, 0x97FA, 0x1F2D, 0x97FB, 0x97FC, 0x0FC5,\n    0x9840, 0x9840, 0x1E83, 0x9841, 0x984F, 0x0FC8, 0x9850, 0x9850, 0x1E84,\n    0x9851, 0x9857, 0x0FD8, 0x9858, 0x9858, 0x1E85, 0x9859, 0x9872, 0x0FE0,\n    0x989F, 0x98FC, 0x0FFA, 0x9940, 0x9940, 0x1058, 0x9941, 0x9941, 0x1F2E,\n    0x9942, 0x995B, 0x105A, 0x995C, 0x995C, 0x1E86, 0x995D, 0x996B, 0x1075,\n    0x996C, 0x996C, 0x1E89, 0x996D, 0x997E, 0x1085, 0x9980, 0x99B5, 0x1097,\n    0x99B6, 0x99B6, 0x1F2F, 0x99B7, 0x99FC, 0x10CE, 0x9A40, 0x9A4E, 0x1114,\n    0x9A4F, 0x9A4F, 0x1E8A, 0x9A50, 0x9A58, 0x1124, 0x9A59, 0x9A59, 0x1E8B,\n    0x9A5A, 0x9A66, 0x112E, 0x9A67, 0x9A67, 0x1F30, 0x9A68, 0x9A7C, 0x113C,\n    0x9A7D, 0x9A7D, 0x1E8D, 0x9A7E, 0x9A7E, 0x1152, 0x9A80, 0x9A8A, 0x1153,\n    0x9A8B, 0x9A8B, 0x1E8E, 0x9A8C, 0x9A8C, 0x1F31, 0x9A8D, 0x9AC1, 0x1160,\n    0x9AC2, 0x9AC2, 0x1E8F, 0x9AC3, 0x9AC3, 0x1F32, 0x9AC4, 0x9AE9, 0x1197,\n    0x9AEA, 0x9AEA, 0x1F33, 0x9AEB, 0x9AFC, 0x11BE, 0x9B40, 0x9B5B, 0x11D0,\n    0x9B5C, 0x9B5C, 0x1E90, 0x9B5D, 0x9B7E, 0x11ED, 0x9B80, 0x9B82, 0x120F,\n    0x9B83, 0x9B83, 0x1E91, 0x9B84, 0x9B97, 0x1213, 0x9B98, 0x9B98, 0x1F34,\n    0x9B99, 0x9B9F, 0x1228, 0x9BA0, 0x9BA0, 0x1E92, 0x9BA1, 0x9BFA, 0x1230,\n    0x9BFB, 0x9BFC, 0x1F35, 0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CA1, 0x12CB,\n    0x9CA2, 0x9CA2, 0x1E94, 0x9CA3, 0x9CFC, 0x12EE, 0x9D40, 0x9D46, 0x1348,\n    0x9D47, 0x9D47, 0x1F37, 0x9D48, 0x9D7E, 0x1350, 0x9D80, 0x9D80, 0x1E95,\n    0x9D81, 0x9D8B, 0x1388, 0x9D8C, 0x9D8C, 0x1E96, 0x9D8D, 0x9DB6, 0x1394,\n    0x9DB7, 0x9DB7, 0x1E97, 0x9DB8, 0x9DF7, 0x13BF, 0x9DF8, 0x9DF8, 0x1F38,\n    0x9DF9, 0x9DFC, 0x1400, 0x9E40, 0x9E63, 0x1404, 0x9E64, 0x9E64, 0x1E99,\n    0x9E65, 0x9E7E, 0x1429, 0x9E80, 0x9E8A, 0x1443, 0x9E8B, 0x9E8B, 0x1E9B,\n    0x9E8C, 0x9EFC, 0x144F, 0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9F80, 0x14FF,\n    0x9F81, 0x9F81, 0x1F39, 0x9F82, 0x9FCD, 0x1501, 0x9FCE, 0x9FCE, 0x1E9D,\n    0x9FCF, 0x9FD3, 0x154E, 0x9FD4, 0x9FD4, 0x1F3A, 0x9FD5, 0x9FF3, 0x1554,\n    0x9FF4, 0x9FF4, 0x1F3B, 0x9FF5, 0x9FFC, 0x1574, 0xE040, 0xE07E, 0x157C,\n    0xE080, 0xE092, 0x15BB, 0xE093, 0xE093, 0x1E9E, 0xE094, 0xE0A3, 0x15CF,\n    0xE0A4, 0xE0A4, 0x1E9F, 0xE0A5, 0xE0DC, 0x15E0, 0xE0DD, 0xE0DD, 0x1EA0,\n    0xE0DE, 0xE0FC, 0x1619, 0xE140, 0xE149, 0x1638, 0xE14A, 0xE14A, 0x1EA1,\n    0xE14B, 0xE17E, 0x1643, 0xE180, 0xE1EC, 0x1677, 0xE1ED, 0xE1ED, 0x1EA5,\n    0xE1EE, 0xE1FC, 0x16E5, 0xE240, 0xE268, 0x16F4, 0xE269, 0xE269, 0x1EA6,\n    0xE26A, 0xE272, 0x171E, 0xE273, 0xE273, 0x1EA7, 0xE274, 0xE277, 0x1728,\n    0xE278, 0xE278, 0x1F3C, 0xE279, 0xE27E, 0x172D, 0xE280, 0xE2B6, 0x1733,\n    0xE2B7, 0xE2B7, 0x1EA8, 0xE2B8, 0xE2BD, 0x176B, 0xE2BE, 0xE2BE, 0x1F3D,\n    0xE2BF, 0xE2E1, 0x1772, 0xE2E2, 0xE2E2, 0x1EA9, 0xE2E3, 0xE2EB, 0x1796,\n    0xE2EC, 0xE2EC, 0x1EAA, 0xE2ED, 0xE2FC, 0x17A0, 0xE340, 0xE357, 0x17B0,\n    0xE358, 0xE358, 0x1EAB, 0xE359, 0xE359, 0x17C9, 0xE35A, 0xE35A, 0x1EAC,\n    0xE35B, 0xE364, 0x17CB, 0xE365, 0xE365, 0x1EAD, 0xE366, 0xE37E, 0x17D6,\n    0xE380, 0xE3C6, 0x17EF, 0xE3C7, 0xE3C7, 0x1F3E, 0xE3C8, 0xE3FC, 0x1837,\n    0xE440, 0xE47E, 0x186C, 0xE480, 0xE483, 0x18AB, 0xE484, 0xE484, 0x1EAF,\n    0xE485, 0xE488, 0x18B0, 0xE489, 0xE489, 0x1EB0, 0xE48A, 0xE491, 0x18B5,\n    0xE492, 0xE492, 0x1EB1, 0xE493, 0xE4B8, 0x18BE, 0xE4B9, 0xE4B9, 0x1EB3,\n    0xE4BA, 0xE4CA, 0x18E5, 0xE4CB, 0xE4CB, 0x1F3F, 0xE4CC, 0xE4FC, 0x18F7,\n    0xE540, 0xE57E, 0x1928, 0xE580, 0xE59D, 0x1967, 0xE59E, 0xE59E, 0x1F40,\n    0xE59F, 0xE5B9, 0x1986, 0xE5BA, 0xE5BB, 0x1F41, 0xE5BC, 0xE5EC, 0x19A3,\n    0xE5ED, 0xE5ED, 0x1EB8, 0xE5EE, 0xE5FC, 0x19D5, 0xE640, 0xE650, 0x19E4,\n    0xE651, 0xE651, 0x1EB9, 0xE652, 0xE67E, 0x19F6, 0xE680, 0xE685, 0x1A23,\n    0xE686, 0xE686, 0x1EBA, 0xE687, 0xE6E6, 0x1A2A, 0xE6E7, 0xE6E7, 0x1EBC,\n    0xE6E8, 0xE6FC, 0x1A8B, 0xE740, 0xE76C, 0x1AA0, 0xE76D, 0xE76D, 0x1EBE,\n    0xE76E, 0xE77E, 0x1ACE, 0xE780, 0xE7A6, 0x1ADF, 0xE7A7, 0xE7A7, 0x1EC1,\n    0xE7A8, 0xE7BA, 0x1B07, 0xE7BB, 0xE7BB, 0x1EC2, 0xE7BC, 0xE7FC, 0x1B1B,\n    0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE8CE, 0x1B9B, 0xE8CF, 0xE8CF, 0x1EC7,\n    0xE8D0, 0xE8FC, 0x1BEB, 0xE940, 0xE977, 0x1C18, 0xE978, 0xE978, 0x1F43,\n    0xE979, 0xE97E, 0x1C51, 0xE980, 0xE9AA, 0x1C57, 0xE9AB, 0xE9AB, 0x1ECA,\n    0xE9AC, 0xE9B9, 0x1C83, 0xE9BA, 0xE9BA, 0x1ECB, 0xE9BB, 0xE9CB, 0x1C92,\n    0xE9CC, 0xE9CC, 0x1ECC, 0xE9CD, 0xE9FC, 0x1CA4, 0xEA40, 0xEA6F, 0x1CD4,\n    0xEA70, 0xEA70, 0x1ECD, 0xEA71, 0xEA71, 0x1F44, 0xEA72, 0xEA7E, 0x1D06,\n    0xEA80, 0xEA9C, 0x1D13, 0xEA9D, 0xEA9D, 0x1ECE, 0xEA9E, 0xEAA2, 0x1D31,\n    0xEAA3, 0xEAA4, 0x205C, 0xEC40, 0xEC42, 0x1F45, 0xEC46, 0xEC46, 0x1F48,\n    0xEC47, 0xEC47, 0x0300, 0xEC48, 0xEC48, 0x02FA, 0xEC49, 0xEC49, 0x02F9,\n    0xEC4D, 0xEC57, 0x1F49, 0xEC5B, 0xEC5D, 0x1DB1, 0xEC5E, 0xEC5E, 0x1F54,\n    0xEC5F, 0xEC5F, 0x1DB7, 0xEC60, 0xEC62, 0x1F55, 0xEC63, 0xEC65, 0x1DB4,\n    0xEC66, 0xEC6F, 0x1F58, 0xEC70, 0xEC70, 0x0303, 0xEC71, 0xEC71, 0x1F62,\n    0xEC72, 0xEC72, 0x0304, 0xEC73, 0xEC74, 0x1F63, 0xEC76, 0xEC76, 0x1F65,\n    0xEC78, 0xEC78, 0x1DA4, 0xEC79, 0xEC79, 0x1DA1, 0xEC7A, 0xEC7A, 0x1F66,\n    0xEC7B, 0xEC7B, 0x1DA2, 0xEC7C, 0xEC7E, 0x1F67, 0xEC80, 0xEC80, 0x1DA6,\n    0xEC81, 0xEC81, 0x1F6A, 0xEC82, 0xEC82, 0x1DA8, 0xEC83, 0xEC83, 0x1DAC,\n    0xEC84, 0xEC84, 0x1F6B, 0xEC85, 0xEC85, 0x1DAE, 0xEC86, 0xEC86, 0x1DAB,\n    0xEC87, 0xEC88, 0x1F6C, 0xEC89, 0xEC89, 0x1DAF, 0xEC8A, 0xEC90, 0x1F6E,\n    0xEC94, 0xEC99, 0x1F75, 0xEC9A, 0xEC9A, 0x1DBA, 0xEC9B, 0xEC9B, 0x1F7B,\n    0xEC9E, 0xEC9E, 0x1F7C, 0xECA7, 0xECB0, 0x1F7D, 0xECB2, 0xECC5, 0x1F87,\n    0xECC7, 0xECDA, 0x1D83, 0xECDB, 0xECDB, 0x1F9B, 0xECDC, 0xECE5, 0x1D97,\n    0xECE9, 0xECFC, 0x1F9C, 0xED40, 0xED59, 0x1FB0, 0xED64, 0xED64, 0x1F16,\n    0xED68, 0xED69, 0x1FCA, 0xED6A, 0xED6A, 0x1DC4, 0xED6B, 0xED6D, 0x1FCC,\n    0xED6E, 0xED6E, 0x1DC3, 0xED6F, 0xED73, 0x1FCF, 0xED74, 0xED74, 0x1DC2,\n    0xED75, 0xED78, 0x1FD4, 0xED7C, 0xED7E, 0x1FD8, 0xED80, 0xED8A, 0x1FDB,\n    0xED8F, 0xED9E, 0x1FE6, 0xEF40, 0xEF41, 0x1ECF, 0xEF42, 0xEF42, 0x204C,\n    0xEF43, 0xEF43, 0x2052, 0xEF44, 0xEF4D, 0x1ED1, 0xEF4E, 0xEF4E, 0x205A,\n    0xEF4F, 0xEF4F, 0x2053, 0xEF50, 0xEF50, 0x2058, 0xEF51, 0xEF51, 0x2055,\n    0xEF52, 0xEF63, 0x1EDB, 0xEF64, 0xEF79, 0x1EEE, 0xEF7A, 0xEF7B, 0x2048,\n    0xEF8D, 0xEF90, 0x02E0, 0xEF91, 0xEF94, 0x1FF6,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-V_1.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_Add_RKSJ_V_1[57 * 3] = {\n    0x8141, 0x8142, 0x1ECF, 0x8143, 0x8143, 0x204C, 0x8144, 0x8144, 0x2052,\n    0x8150, 0x8151, 0x1ED1, 0x815B, 0x815D, 0x1ED3, 0x8160, 0x8164, 0x1ED6,\n    0x8165, 0x8165, 0x205A, 0x8166, 0x8166, 0x2053, 0x8167, 0x8167, 0x2058,\n    0x8168, 0x8168, 0x2055, 0x8169, 0x817A, 0x1EDB, 0x829F, 0x829F, 0x1EEE,\n    0x82A1, 0x82A1, 0x1EEF, 0x82A3, 0x82A3, 0x1EF0, 0x82A5, 0x82A5, 0x1EF1,\n    0x82A7, 0x82A7, 0x1EF2, 0x82C1, 0x82C1, 0x1EF3, 0x82E1, 0x82E1, 0x1EF4,\n    0x82E3, 0x82E3, 0x1EF5, 0x82E5, 0x82E5, 0x1EF6, 0x82EC, 0x82EC, 0x1EF7,\n    0x82F3, 0x82F4, 0x2048, 0x8340, 0x8340, 0x1EF8, 0x8342, 0x8342, 0x1EF9,\n    0x8344, 0x8344, 0x1EFA, 0x8346, 0x8346, 0x1EFB, 0x8348, 0x8348, 0x1EFC,\n    0x8362, 0x8362, 0x1EFD, 0x8383, 0x8383, 0x1EFE, 0x8385, 0x8385, 0x1EFF,\n    0x8387, 0x8387, 0x1F00, 0x838E, 0x838E, 0x1F01, 0x8395, 0x8396, 0x1F02,\n    0xEC78, 0xEC78, 0x1F07, 0xEC79, 0xEC79, 0x1F04, 0xEC7A, 0xEC7A, 0x2089,\n    0xEC7B, 0xEC7B, 0x1F05, 0xEC7C, 0xEC7C, 0x208A, 0xEC7D, 0xEC7E, 0x2093,\n    0xEC80, 0xEC80, 0x1F09, 0xEC81, 0xEC81, 0x2092, 0xEC82, 0xEC82, 0x1F0B,\n    0xEC83, 0xEC83, 0x1F0F, 0xEC84, 0xEC84, 0x209C, 0xEC85, 0xEC85, 0x1F11,\n    0xEC86, 0xEC86, 0x1F0E, 0xEC87, 0xEC87, 0x2098, 0xEC88, 0xEC88, 0x209B,\n    0xEC89, 0xEC89, 0x1F12, 0xEC8A, 0xEC8A, 0x2097, 0xEC8B, 0xEC8C, 0x209D,\n    0xEC8D, 0xEC8D, 0x20A6, 0xEC8E, 0xEC8E, 0x20A5, 0xEC8F, 0xEC8F, 0x20A1,\n    0xEC90, 0xEC90, 0x20A4, 0xEC95, 0xEC95, 0x2084, 0xEF92, 0xEF92, 0x208D,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Japan1/Adobe-Japan1-UCS2_4.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_Japan1CID2Unicode_4[15444] = {\n    0xFFFD, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026,\n    0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E,\n    0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036,\n    0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E,\n    0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046,\n    0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E,\n    0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,\n    0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E,\n    0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066,\n    0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E,\n    0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076,\n    0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x00A6, 0x007D, 0x0303,\n    0x02BC, 0x005C, 0x02BB, 0x007C, 0x007E, 0x00A1, 0x00A2, 0x00A3,\n    0x2044, 0x0192, 0x00A7, 0x00A4, 0x201C, 0x00AB, 0x2039, 0x203A,\n    0xFB01, 0xFB02, 0x2012, 0x2020, 0x2021, 0x00B7, 0x00B6, 0x2022,\n    0x201A, 0x201E, 0x201D, 0x00BB, 0x2026, 0x2030, 0x00BF, 0x0301,\n    0x0302, 0x00AF, 0x0306, 0x0307, 0x0308, 0x030A, 0x00B8, 0x030B,\n    0x0328, 0x030C, 0x0336, 0x00C6, 0x00AA, 0x0141, 0x00D8, 0x0152,\n    0x00BA, 0x00E6, 0x0131, 0x0142, 0x00F8, 0x0153, 0x00DF, 0x002D,\n    0x00A9, 0x00AC, 0x00AE, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B5,\n    0x00B9, 0x00BC, 0x00BD, 0x00BE, 0x00C0, 0x00C1, 0x00C2, 0x00C3,\n    0x00C4, 0x00C5, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC,\n    0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4,\n    0x00D5, 0x00D6, 0x00D7, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD,\n    0x00DE, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E7,\n    0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,\n    0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,\n    0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, 0x0160,\n    0x0178, 0x017D, 0x0305, 0x0161, 0x2122, 0x017E, 0x0030, 0x0020,\n    0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028,\n    0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030,\n    0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038,\n    0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040,\n    0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048,\n    0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050,\n    0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058,\n    0x0059, 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E, 0x005F, 0x0060,\n    0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068,\n    0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070,\n    0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078,\n    0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x203E, 0xFF60, 0xFF61,\n    0xFF62, 0xFF63, 0xFF64, 0xFF65, 0xFF66, 0xFF67, 0xFF68, 0xFF69,\n    0xFF6A, 0xFF6B, 0xFF6C, 0xFF6D, 0xFF6E, 0xFF6F, 0xFF70, 0xFF71,\n    0xFF72, 0xFF73, 0xFF74, 0xFF75, 0xFF76, 0xFF77, 0xFF78, 0xFF79,\n    0xFF7A, 0xFF7B, 0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, 0xFF80, 0xFF81,\n    0xFF82, 0xFF83, 0xFF84, 0xFF85, 0xFF86, 0xFF87, 0xFF88, 0xFF89,\n    0xFF8A, 0xFF8B, 0xFF8C, 0xFF8D, 0xFF8E, 0xFF8F, 0xFF90, 0xFF91,\n    0xFF92, 0xFF93, 0xFF94, 0xFF95, 0xFF96, 0xFF97, 0xFF98, 0xFF99,\n    0xFF9A, 0xFF9B, 0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F, 0xFF40, 0x30F0,\n    0x30F1, 0x30EE, 0x30AB, 0x30B1, 0x30F4, 0x30AC, 0x30AE, 0x30B0,\n    0x30B2, 0x30B4, 0x30B6, 0x30B8, 0x30BA, 0x30BC, 0x30BE, 0x30C0,\n    0x30C2, 0x30C5, 0x30C7, 0x30C9, 0x30D0, 0x30D1, 0x30D3, 0x30D4,\n    0x30D6, 0x30D7, 0x30D9, 0x30DA, 0x30DC, 0x30DD, 0xFF60, 0x301D,\n    0x301E, 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, 0x2505, 0x2506,\n    0x2507, 0x2508, 0x2509, 0x250A, 0x250B, 0x250C, 0x250D, 0x250E,\n    0x250F, 0x2510, 0x2511, 0x2512, 0x2513, 0x2514, 0x2515, 0x2516,\n    0x2517, 0x2518, 0x2519, 0x251A, 0x251B, 0x251C, 0x251D, 0x251E,\n    0x251F, 0x2520, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526,\n    0x2527, 0x2528, 0x2529, 0x252A, 0x252B, 0x252C, 0x252D, 0x252E,\n    0x252F, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536,\n    0x2537, 0x2538, 0x2539, 0x253A, 0x253B, 0x253C, 0x253D, 0x253E,\n    0x253F, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546,\n    0x2547, 0x2548, 0x2549, 0x254A, 0x254B, 0x2032, 0x00A8, 0x2036,\n    0x005B, 0x005D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300E, 0x300F,\n    0x3010, 0x3011, 0x2012, 0xFF60, 0x3092, 0x3041, 0x3043, 0x3045,\n    0x3047, 0x3049, 0x3083, 0x3085, 0x3087, 0x3063, 0x3042, 0x3044,\n    0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053,\n    0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064,\n    0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,\n    0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081,\n    0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C,\n    0x308D, 0x308F, 0x3093, 0x3090, 0x3091, 0x308E, 0x304C, 0x304E,\n    0x3050, 0x3052, 0x3054, 0x3056, 0x3068, 0x305A, 0x305C, 0x305E,\n    0x3060, 0x3062, 0x3065, 0x3067, 0x3069, 0x3070, 0x3071, 0x3073,\n    0x3074, 0x3076, 0x3077, 0x3079, 0x307A, 0x307C, 0x307D, 0x00C4,\n    0x00F9, 0x00E9, 0x00ED, 0x00DF, 0x00E7, 0x00C7, 0x00D1, 0x00F1,\n    0x00A2, 0x00A3, 0x00F3, 0x00FA, 0x00A1, 0x00BF, 0x00BD, 0x00D6,\n    0x00DC, 0x00E4, 0x00EB, 0x00EF, 0x00F6, 0x00DC, 0x00E2, 0x00EA,\n    0x00EE, 0x00F4, 0x00FC, 0x00E0, 0x00E9, 0x25B2, 0x00E1, 0x007E,\n    0x0030, 0x3000, 0x3001, 0x3002, 0xFF0C, 0xFF0E, 0x30FB, 0xFF1A,\n    0xFF1B, 0xFF1F, 0xFF01, 0x309B, 0x309C, 0x00B4, 0xFF40, 0x00A8,\n    0xFF3E, 0x203E, 0xFF3F, 0x30FD, 0x30FE, 0x309D, 0x309E, 0x3003,\n    0x4EDD, 0x3005, 0x3006, 0x3007, 0x30FC, 0x2015, 0x2010, 0xFF0F,\n    0xFF3C, 0xFF5E, 0x2016, 0xFF5C, 0x2026, 0x2025, 0x2018, 0x2019,\n    0x201C, 0x201D, 0xFF08, 0xFF09, 0x3014, 0x3015, 0xFF3B, 0xFF3D,\n    0xFF5B, 0xFF5D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D,\n    0x300E, 0x300F, 0x3010, 0x3011, 0xFF0B, 0xFF0D, 0x00B1, 0x00D7,\n    0x00F7, 0xFF1D, 0x2260, 0xFF1C, 0xFF1E, 0x2266, 0x2267, 0x221E,\n    0x2234, 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFFE5,\n    0xFF04, 0x00A2, 0x00A3, 0xFF05, 0xFF03, 0xFF06, 0xFF0A, 0xFF20,\n    0x00A7, 0x2606, 0x2605, 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6,\n    0x25A1, 0x25A0, 0x25B3, 0x25B2, 0x25BD, 0x25BC, 0x203B, 0x3012,\n    0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0x2208, 0x220B, 0x2286,\n    0x2287, 0x2282, 0x2283, 0x222A, 0x2229, 0x2227, 0x2228, 0x00AC,\n    0x21D2, 0x21D4, 0x2200, 0x2203, 0x2220, 0x22A5, 0x2312, 0x2202,\n    0x2207, 0x2261, 0x2252, 0x226A, 0x226B, 0x221A, 0x223D, 0x221D,\n    0x2235, 0x222B, 0x222C, 0x212B, 0x2030, 0x266F, 0x266D, 0x266A,\n    0x2020, 0x2021, 0x00B6, 0x25EF, 0xFF10, 0xFF11, 0xFF12, 0xFF13,\n    0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0xFF21, 0xFF22,\n    0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A,\n    0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32,\n    0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A,\n    0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48,\n    0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50,\n    0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58,\n    0xFF59, 0xFF5A, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046,\n    0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E,\n    0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056,\n    0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E,\n    0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066,\n    0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E,\n    0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076,\n    0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E,\n    0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086,\n    0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E,\n    0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A1, 0x30A2, 0x30A3,\n    0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30AB,\n    0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30B2, 0x30B3,\n    0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA, 0x30BB,\n    0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, 0x30C3,\n    0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB,\n    0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2, 0x30D3,\n    0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA, 0x30DB,\n    0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E3,\n    0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB,\n    0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3,\n    0x30F4, 0x30F5, 0x30F6, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395,\n    0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D,\n    0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6,\n    0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5,\n    0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD,\n    0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6,\n    0x03C7, 0x03C8, 0x03C9, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414,\n    0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B,\n    0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423,\n    0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B,\n    0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433,\n    0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A,\n    0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442,\n    0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A,\n    0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0x4E9C, 0x5516, 0x5A03,\n    0x963F, 0x54C0, 0x611B, 0x6328, 0x59F6, 0x9022, 0x8475, 0x831C,\n    0x7A50, 0x60AA, 0x63E1, 0x6E25, 0x65ED, 0x8466, 0x82A6, 0x9BF5,\n    0x6893, 0x5727, 0x65A1, 0x6271, 0x5B9B, 0x59D0, 0x867B, 0x98F4,\n    0x7D62, 0x7DBE, 0x9B8E, 0x6216, 0x7C9F, 0x88B7, 0x5B89, 0x5EB5,\n    0x6309, 0x6697, 0x6848, 0x95C7, 0x978D, 0x674F, 0x4EE5, 0x4F0A,\n    0x4F4D, 0x4F9D, 0x5049, 0x56F2, 0x5937, 0x59D4, 0x5A01, 0x5C09,\n    0x60DF, 0x610F, 0x6170, 0x6613, 0x6905, 0x70BA, 0x754F, 0x7570,\n    0x79FB, 0x7DAD, 0x7DEF, 0x80C3, 0x840E, 0x8863, 0x8B02, 0x9055,\n    0x907A, 0x533B, 0x4E95, 0x4EA5, 0x57DF, 0x80B2, 0x90C1, 0x78EF,\n    0x4E00, 0x58F1, 0x6EA2, 0x9038, 0x7A32, 0x8328, 0x828B, 0x9C2F,\n    0x5141, 0x5370, 0x54BD, 0x54E1, 0x56E0, 0x59FB, 0x5F15, 0x98F2,\n    0x6DEB, 0x80E4, 0x852D, 0x9662, 0x9670, 0x96A0, 0x97FB, 0x540B,\n    0x53F3, 0x5B87, 0x70CF, 0x7FBD, 0x8FC2, 0x96E8, 0x536F, 0x9D5C,\n    0x7ABA, 0x4E11, 0x7893, 0x81FC, 0x6E26, 0x5618, 0x5504, 0x6B1D,\n    0x851A, 0x9C3B, 0x59E5, 0x53A9, 0x6D66, 0x74DC, 0x958F, 0x5642,\n    0x4E91, 0x904B, 0x96F2, 0x834F, 0x990C, 0x53E1, 0x55B6, 0x5B30,\n    0x5F71, 0x6620, 0x66F3, 0x6804, 0x6C38, 0x6CF3, 0x6D29, 0x745B,\n    0x76C8, 0x7A4E, 0x9834, 0x82F1, 0x885B, 0x8A60, 0x92ED, 0x6DB2,\n    0x75AB, 0x76CA, 0x99C5, 0x60A6, 0x8B01, 0x8D8A, 0x95B2, 0x698E,\n    0x53AD, 0x5186, 0x5712, 0x5830, 0x5944, 0x5BB4, 0x5EF6, 0x6028,\n    0x63A9, 0x63F4, 0x6CBF, 0x6F14, 0x708E, 0x7114, 0x7159, 0x71D5,\n    0x733F, 0x7E01, 0x8276, 0x82D1, 0x8597, 0x9060, 0x925B, 0x9D1B,\n    0x5869, 0x65BC, 0x6C5A, 0x7525, 0x51F9, 0x592E, 0x5965, 0x5F80,\n    0x5FDC, 0x62BC, 0x65FA, 0x6A2A, 0x6B27, 0x6BB4, 0x738B, 0x7FC1,\n    0x8956, 0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104,\n    0x5C4B, 0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378,\n    0x6069, 0x6E29, 0x7A4F, 0x97F3, 0x4E0B, 0x5316, 0x4EEE, 0x4F55,\n    0x4F3D, 0x4FA1, 0x4F73, 0x52A0, 0x53EF, 0x5609, 0x590F, 0x5AC1,\n    0x5BB6, 0x5BE1, 0x79D1, 0x6687, 0x679C, 0x67B6, 0x6B4C, 0x6CB3,\n    0x706B, 0x73C2, 0x798D, 0x79BE, 0x7A3C, 0x7B87, 0x82B1, 0x82DB,\n    0x8304, 0x8377, 0x83EF, 0x83D3, 0x8766, 0x8AB2, 0x5629, 0x8CA8,\n    0x8FE6, 0x904E, 0x971E, 0x868A, 0x4FC4, 0x5CE8, 0x6211, 0x7259,\n    0x753B, 0x81E5, 0x82BD, 0x86FE, 0x8CC0, 0x96C5, 0x9913, 0x99D5,\n    0x4ECB, 0x4F1A, 0x89E3, 0x56DE, 0x584A, 0x58CA, 0x5EFB, 0x5FEB,\n    0x602A, 0x6094, 0x6062, 0x61D0, 0x6212, 0x62D0, 0x6539, 0x9B41,\n    0x6666, 0x68B0, 0x6D77, 0x7070, 0x754C, 0x7686, 0x7D75, 0x82A5,\n    0x87F9, 0x958B, 0x968E, 0x8C9D, 0x51F1, 0x52BE, 0x5916, 0x54B3,\n    0x5BB3, 0x5D16, 0x6168, 0x6982, 0x6DAF, 0x788D, 0x84CB, 0x8857,\n    0x8A72, 0x93A7, 0x9AB8, 0x6D6C, 0x99A8, 0x86D9, 0x57A3, 0x67FF,\n    0x86CE, 0x920E, 0x5283, 0x5687, 0x5404, 0x5ED3, 0x62E1, 0x64B9,\n    0x683C, 0x6838, 0x6BBB, 0x7372, 0x78BA, 0x7A6B, 0x899A, 0x89D2,\n    0x8D6B, 0x8F03, 0x90ED, 0x95A3, 0x9694, 0x9769, 0x5B66, 0x5CB3,\n    0x697D, 0x984D, 0x984E, 0x639B, 0x7B20, 0x6A2B, 0x6A7F, 0x68B6,\n    0x9C0D, 0x6F5F, 0x5272, 0x559D, 0x6070, 0x62EC, 0x6D3B, 0x6E07,\n    0x6ED1, 0x845B, 0x8910, 0x8F44, 0x4E14, 0x9C39, 0x53F6, 0x691B,\n    0x6A3A, 0x9784, 0x682A, 0x515C, 0x7AC3, 0x84B2, 0x91DC, 0x938C,\n    0x565B, 0x9D28, 0x6822, 0x8305, 0x8431, 0x7CA5, 0x5208, 0x82C5,\n    0x74E6, 0x4E7E, 0x4F83, 0x51A0, 0x5BD2, 0x520A, 0x52D8, 0x52E7,\n    0x5DFB, 0x559A, 0x582A, 0x59E6, 0x5B8C, 0x5B98, 0x5BDB, 0x5E72,\n    0x5E79, 0x60A3, 0x611F, 0x6163, 0x61BE, 0x63DB, 0x6562, 0x67D1,\n    0x6853, 0x68FA, 0x6B3E, 0x6B53, 0x6C57, 0x6F22, 0x6F97, 0x6F45,\n    0x74B0, 0x7518, 0x76E3, 0x770B, 0x7AFF, 0x7BA1, 0x7C21, 0x7DE9,\n    0x7F36, 0x7FF0, 0x809D, 0x8266, 0x839E, 0x89B3, 0x8ACC, 0x8CAB,\n    0x9084, 0x9451, 0x9593, 0x9591, 0x95A2, 0x9665, 0x97D3, 0x9928,\n    0x8218, 0x4E38, 0x542B, 0x5CB8, 0x5DCC, 0x73A9, 0x764C, 0x773C,\n    0x5CA9, 0x7FEB, 0x8D0B, 0x96C1, 0x9811, 0x9854, 0x9858, 0x4F01,\n    0x4F0E, 0x5371, 0x559C, 0x5668, 0x57FA, 0x5947, 0x5B09, 0x5BC4,\n    0x5C90, 0x5E0C, 0x5E7E, 0x5FCC, 0x63EE, 0x673A, 0x65D7, 0x65E2,\n    0x671F, 0x68CB, 0x68C4, 0x6A5F, 0x5E30, 0x6BC5, 0x6C17, 0x6C7D,\n    0x757F, 0x7948, 0x5B63, 0x7A00, 0x7D00, 0x5FBD, 0x898F, 0x8A18,\n    0x8CB4, 0x8D77, 0x8ECC, 0x8F1D, 0x98E2, 0x9A0E, 0x9B3C, 0x4E80,\n    0x507D, 0x5100, 0x5993, 0x5B9C, 0x622F, 0x6280, 0x64EC, 0x6B3A,\n    0x72A0, 0x7591, 0x7947, 0x7FA9, 0x87FB, 0x8ABC, 0x8B70, 0x63AC,\n    0x83CA, 0x97A0, 0x5409, 0x5403, 0x55AB, 0x6854, 0x6A58, 0x8A70,\n    0x7827, 0x6775, 0x9ECD, 0x5374, 0x5BA2, 0x811A, 0x8650, 0x9006,\n    0x4E18, 0x4E45, 0x4EC7, 0x4F11, 0x53CA, 0x5438, 0x5BAE, 0x5F13,\n    0x6025, 0x6551, 0x673D, 0x6C42, 0x6C72, 0x6CE3, 0x7078, 0x7403,\n    0x7A76, 0x7AAE, 0x7B08, 0x7D1A, 0x7CFE, 0x7D66, 0x65E7, 0x725B,\n    0x53BB, 0x5C45, 0x5DE8, 0x62D2, 0x62E0, 0x6319, 0x6E20, 0x865A,\n    0x8A31, 0x8DDD, 0x92F8, 0x6F01, 0x79A6, 0x9B5A, 0x4EA8, 0x4EAB,\n    0x4EAC, 0x4F9B, 0x4FA0, 0x50D1, 0x5147, 0x7AF6, 0x5171, 0x51F6,\n    0x5354, 0x5321, 0x537F, 0x53EB, 0x55AC, 0x5883, 0x5CE1, 0x5F37,\n    0x5F4A, 0x602F, 0x6050, 0x606D, 0x631F, 0x6559, 0x6A4B, 0x6CC1,\n    0x72C2, 0x72ED, 0x77EF, 0x80F8, 0x8105, 0x8208, 0x854E, 0x90F7,\n    0x93E1, 0x97FF, 0x9957, 0x9A5A, 0x4EF0, 0x51DD, 0x5C2D, 0x6681,\n    0x696D, 0x5C40, 0x66F2, 0x6975, 0x7389, 0x6850, 0x7C81, 0x50C5,\n    0x52E4, 0x5747, 0x5DFE, 0x9326, 0x65A4, 0x6B23, 0x6B3D, 0x7434,\n    0x7981, 0x79BD, 0x7B4B, 0x7DCA, 0x82B9, 0x83CC, 0x887F, 0x895F,\n    0x8B39, 0x8FD1, 0x91D1, 0x541F, 0x9280, 0x4E5D, 0x5036, 0x53E5,\n    0x533A, 0x72D7, 0x7396, 0x77E9, 0x82E6, 0x8EAF, 0x99C6, 0x99C8,\n    0x99D2, 0x5177, 0x611A, 0x865E, 0x55B0, 0x7A7A, 0x5076, 0x5BD3,\n    0x9047, 0x9685, 0x4E32, 0x6ADB, 0x91E7, 0x5C51, 0x5C48, 0x6398,\n    0x7A9F, 0x6C93, 0x9774, 0x8F61, 0x7AAA, 0x718A, 0x9688, 0x7C82,\n    0x6817, 0x7E70, 0x6851, 0x936C, 0x52F2, 0x541B, 0x85AB, 0x8A13,\n    0x7FA4, 0x8ECD, 0x90E1, 0x5366, 0x8888, 0x7941, 0x4FC2, 0x50BE,\n    0x5211, 0x5144, 0x5553, 0x572D, 0x73EA, 0x578B, 0x5951, 0x5F62,\n    0x5F84, 0x6075, 0x6176, 0x6167, 0x61A9, 0x63B2, 0x643A, 0x656C,\n    0x666F, 0x6842, 0x6E13, 0x7566, 0x7A3D, 0x7CFB, 0x7D4C, 0x7D99,\n    0x7E4B, 0x7F6B, 0x830E, 0x834A, 0x86CD, 0x8A08, 0x8A63, 0x8B66,\n    0x8EFD, 0x981A, 0x9D8F, 0x82B8, 0x8FCE, 0x9BE8, 0x5287, 0x621F,\n    0x6483, 0x6FC0, 0x9699, 0x6841, 0x5091, 0x6B20, 0x6C7A, 0x6F54,\n    0x7A74, 0x7D50, 0x8840, 0x8A23, 0x6708, 0x4EF6, 0x5039, 0x5026,\n    0x5065, 0x517C, 0x5238, 0x5263, 0x55A7, 0x570F, 0x5805, 0x5ACC,\n    0x5EFA, 0x61B2, 0x61F8, 0x62F3, 0x6372, 0x691C, 0x6A29, 0x727D,\n    0x72AC, 0x732E, 0x7814, 0x786F, 0x7D79, 0x770C, 0x80A9, 0x898B,\n    0x8B19, 0x8CE2, 0x8ED2, 0x9063, 0x9375, 0x967A, 0x9855, 0x9A13,\n    0x9E78, 0x5143, 0x539F, 0x53B3, 0x5E7B, 0x5F26, 0x6E1B, 0x6E90,\n    0x7384, 0x73FE, 0x7D43, 0x8237, 0x8A00, 0x8AFA, 0x9650, 0x4E4E,\n    0x500B, 0x53E4, 0x547C, 0x56FA, 0x59D1, 0x5B64, 0x5DF1, 0x5EAB,\n    0x5F27, 0x6238, 0x6545, 0x67AF, 0x6E56, 0x72D0, 0x7CCA, 0x88B4,\n    0x80A1, 0x80E1, 0x83F0, 0x864E, 0x8A87, 0x8DE8, 0x9237, 0x96C7,\n    0x9867, 0x9F13, 0x4E94, 0x4E92, 0x4F0D, 0x5348, 0x5449, 0x543E,\n    0x5A2F, 0x5F8C, 0x5FA1, 0x609F, 0x68A7, 0x6A8E, 0x745A, 0x7881,\n    0x8A9E, 0x8AA4, 0x8B77, 0x9190, 0x4E5E, 0x9BC9, 0x4EA4, 0x4F7C,\n    0x4FAF, 0x5019, 0x5016, 0x5149, 0x516C, 0x529F, 0x52B9, 0x52FE,\n    0x539A, 0x53E3, 0x5411, 0x540E, 0x5589, 0x5751, 0x57A2, 0x597D,\n    0x5B54, 0x5B5D, 0x5B8F, 0x5DE5, 0x5DE7, 0x5DF7, 0x5E78, 0x5E83,\n    0x5E9A, 0x5EB7, 0x5F18, 0x6052, 0x614C, 0x6297, 0x62D8, 0x63A7,\n    0x653B, 0x6602, 0x6643, 0x66F4, 0x676D, 0x6821, 0x6897, 0x69CB,\n    0x6C5F, 0x6D2A, 0x6D69, 0x6E2F, 0x6E9D, 0x7532, 0x7687, 0x786C,\n    0x7A3F, 0x7CE0, 0x7D05, 0x7D18, 0x7D5E, 0x7DB1, 0x8015, 0x8003,\n    0x80AF, 0x80B1, 0x8154, 0x818F, 0x822A, 0x8352, 0x884C, 0x8861,\n    0x8B1B, 0x8CA2, 0x8CFC, 0x90CA, 0x9175, 0x9271, 0x783F, 0x92FC,\n    0x95A4, 0x964D, 0x9805, 0x9999, 0x9AD8, 0x9D3B, 0x525B, 0x52AB,\n    0x53F7, 0x5408, 0x58D5, 0x62F7, 0x6FE0, 0x8C6A, 0x8F5F, 0x9EB9,\n    0x514B, 0x523B, 0x544A, 0x56FD, 0x7A40, 0x9177, 0x9D60, 0x9ED2,\n    0x7344, 0x6F09, 0x8170, 0x7511, 0x5FFD, 0x60DA, 0x9AA8, 0x72DB,\n    0x8FBC, 0x6B64, 0x9803, 0x4ECA, 0x56F0, 0x5764, 0x58BE, 0x5A5A,\n    0x6068, 0x61C7, 0x660F, 0x6606, 0x6839, 0x68B1, 0x6DF7, 0x75D5,\n    0x7D3A, 0x826E, 0x9B42, 0x4E9B, 0x4F50, 0x53C9, 0x5506, 0x5D6F,\n    0x5DE6, 0x5DEE, 0x67FB, 0x6C99, 0x7473, 0x7802, 0x8A50, 0x9396,\n    0x88DF, 0x5750, 0x5EA7, 0x632B, 0x50B5, 0x50AC, 0x518D, 0x6700,\n    0x54C9, 0x585E, 0x59BB, 0x5BB0, 0x5F69, 0x624D, 0x63A1, 0x683D,\n    0x6B73, 0x6E08, 0x707D, 0x91C7, 0x7280, 0x7815, 0x7826, 0x796D,\n    0x658E, 0x7D30, 0x83DC, 0x88C1, 0x8F09, 0x969B, 0x5264, 0x5728,\n    0x6750, 0x7F6A, 0x8CA1, 0x51B4, 0x5742, 0x962A, 0x583A, 0x698A,\n    0x80B4, 0x54B2, 0x5D0E, 0x57FC, 0x7895, 0x9DFA, 0x4F5C, 0x524A,\n    0x548B, 0x643E, 0x6628, 0x6714, 0x67F5, 0x7A84, 0x7B56, 0x7D22,\n    0x932F, 0x685C, 0x9BAD, 0x7B39, 0x5319, 0x518A, 0x5237, 0x5BDF,\n    0x62F6, 0x64AE, 0x64E6, 0x672D, 0x6BBA, 0x85A9, 0x96D1, 0x7690,\n    0x9BD6, 0x634C, 0x9306, 0x9BAB, 0x76BF, 0x6652, 0x4E09, 0x5098,\n    0x53C2, 0x5C71, 0x60E8, 0x6492, 0x6563, 0x685F, 0x71E6, 0x73CA,\n    0x7523, 0x7B97, 0x7E82, 0x8695, 0x8B83, 0x8CDB, 0x9178, 0x9910,\n    0x65AC, 0x66AB, 0x6B8B, 0x4ED5, 0x4ED4, 0x4F3A, 0x4F7F, 0x523A,\n    0x53F8, 0x53F2, 0x55E3, 0x56DB, 0x58EB, 0x59CB, 0x59C9, 0x59FF,\n    0x5B50, 0x5C4D, 0x5E02, 0x5E2B, 0x5FD7, 0x601D, 0x6307, 0x652F,\n    0x5B5C, 0x65AF, 0x65BD, 0x65E8, 0x679D, 0x6B62, 0x6B7B, 0x6C0F,\n    0x7345, 0x7949, 0x79C1, 0x7CF8, 0x7D19, 0x7D2B, 0x80A2, 0x8102,\n    0x81F3, 0x8996, 0x8A5E, 0x8A69, 0x8A66, 0x8A8C, 0x8AEE, 0x8CC7,\n    0x8CDC, 0x96CC, 0x98FC, 0x6B6F, 0x4E8B, 0x4F3C, 0x4F8D, 0x5150,\n    0x5B57, 0x5BFA, 0x6148, 0x6301, 0x6642, 0x6B21, 0x6ECB, 0x6CBB,\n    0x723E, 0x74BD, 0x75D4, 0x78C1, 0x793A, 0x800C, 0x8033, 0x81EA,\n    0x8494, 0x8F9E, 0x6C50, 0x9E7F, 0x5F0F, 0x8B58, 0x9D2B, 0x7AFA,\n    0x8EF8, 0x5B8D, 0x96EB, 0x4E03, 0x53F1, 0x57F7, 0x5931, 0x5AC9,\n    0x5BA4, 0x6089, 0x6E7F, 0x6F06, 0x75BE, 0x8CEA, 0x5B9F, 0x8500,\n    0x7BE0, 0x5072, 0x67F4, 0x829D, 0x5C61, 0x854A, 0x7E1E, 0x820E,\n    0x5199, 0x5C04, 0x6368, 0x8D66, 0x659C, 0x716E, 0x793E, 0x7D17,\n    0x8005, 0x8B1D, 0x8ECA, 0x906E, 0x86C7, 0x90AA, 0x501F, 0x52FA,\n    0x5C3A, 0x6753, 0x707C, 0x7235, 0x914C, 0x91C8, 0x932B, 0x82E5,\n    0x5BC2, 0x5F31, 0x60F9, 0x4E3B, 0x53D6, 0x5B88, 0x624B, 0x6731,\n    0x6B8A, 0x72E9, 0x73E0, 0x7A2E, 0x816B, 0x8DA3, 0x9152, 0x9996,\n    0x5112, 0x53D7, 0x546A, 0x5BFF, 0x6388, 0x6A39, 0x7DAC, 0x9700,\n    0x56DA, 0x53CE, 0x5468, 0x5B97, 0x5C31, 0x5DDE, 0x4FEE, 0x6101,\n    0x62FE, 0x6D32, 0x79C0, 0x79CB, 0x7D42, 0x7E4D, 0x7FD2, 0x81ED,\n    0x821F, 0x8490, 0x8846, 0x8972, 0x8B90, 0x8E74, 0x8F2F, 0x9031,\n    0x914B, 0x916C, 0x96C6, 0x919C, 0x4EC0, 0x4F4F, 0x5145, 0x5341,\n    0x5F93, 0x620E, 0x67D4, 0x6C41, 0x6E0B, 0x7363, 0x7E26, 0x91CD,\n    0x9283, 0x53D4, 0x5919, 0x5BBF, 0x6DD1, 0x795D, 0x7E2E, 0x7C9B,\n    0x587E, 0x719F, 0x51FA, 0x8853, 0x8FF0, 0x4FCA, 0x5CFB, 0x6625,\n    0x77AC, 0x7AE3, 0x821C, 0x99FF, 0x51C6, 0x5FAA, 0x65EC, 0x696F,\n    0x6B89, 0x6DF3, 0x6E96, 0x6F64, 0x76FE, 0x7D14, 0x5DE1, 0x9075,\n    0x9187, 0x9806, 0x51E6, 0x521D, 0x6240, 0x6691, 0x66D9, 0x6E1A,\n    0x5EB6, 0x7DD2, 0x7F72, 0x66F8, 0x85AF, 0x85F7, 0x8AF8, 0x52A9,\n    0x53D9, 0x5973, 0x5E8F, 0x5F90, 0x6055, 0x92E4, 0x9664, 0x50B7,\n    0x511F, 0x52DD, 0x5320, 0x5347, 0x53EC, 0x54E8, 0x5546, 0x5531,\n    0x5617, 0x5968, 0x59BE, 0x5A3C, 0x5BB5, 0x5C06, 0x5C0F, 0x5C11,\n    0x5C1A, 0x5E84, 0x5E8A, 0x5EE0, 0x5F70, 0x627F, 0x6284, 0x62DB,\n    0x638C, 0x6377, 0x6607, 0x660C, 0x662D, 0x6676, 0x677E, 0x68A2,\n    0x6A1F, 0x6A35, 0x6CBC, 0x6D88, 0x6E09, 0x6E58, 0x713C, 0x7126,\n    0x7167, 0x75C7, 0x7701, 0x785D, 0x7901, 0x7965, 0x79F0, 0x7AE0,\n    0x7B11, 0x7CA7, 0x7D39, 0x8096, 0x83D6, 0x848B, 0x8549, 0x885D,\n    0x88F3, 0x8A1F, 0x8A3C, 0x8A54, 0x8A73, 0x8C61, 0x8CDE, 0x91A4,\n    0x9266, 0x937E, 0x9418, 0x969C, 0x9798, 0x4E0A, 0x4E08, 0x4E1E,\n    0x4E57, 0x5197, 0x5270, 0x57CE, 0x5834, 0x58CC, 0x5B22, 0x5E38,\n    0x60C5, 0x64FE, 0x6761, 0x6756, 0x6D44, 0x72B6, 0x7573, 0x7A63,\n    0x84B8, 0x8B72, 0x91B8, 0x9320, 0x5631, 0x57F4, 0x98FE, 0x62ED,\n    0x690D, 0x6B96, 0x71ED, 0x7E54, 0x8077, 0x8272, 0x89E6, 0x98DF,\n    0x8755, 0x8FB1, 0x5C3B, 0x4F38, 0x4FE1, 0x4FB5, 0x5507, 0x5A20,\n    0x5BDD, 0x5BE9, 0x5FC3, 0x614E, 0x632F, 0x65B0, 0x664B, 0x68EE,\n    0x699B, 0x6D78, 0x6DF1, 0x7533, 0x75B9, 0x771F, 0x795E, 0x79E6,\n    0x7D33, 0x81E3, 0x82AF, 0x85AA, 0x89AA, 0x8A3A, 0x8EAB, 0x8F9B,\n    0x9032, 0x91DD, 0x9707, 0x4EBA, 0x4EC1, 0x5203, 0x5875, 0x58EC,\n    0x5C0B, 0x751A, 0x5C3D, 0x814E, 0x8A0A, 0x8FC5, 0x9663, 0x976D,\n    0x7B25, 0x8ACF, 0x9808, 0x9162, 0x56F3, 0x53A8, 0x9017, 0x5439,\n    0x5782, 0x5E25, 0x63A8, 0x6C34, 0x708A, 0x7761, 0x7C8B, 0x7FE0,\n    0x8870, 0x9042, 0x9154, 0x9310, 0x9318, 0x968F, 0x745E, 0x9AC4,\n    0x5D07, 0x5D69, 0x6570, 0x67A2, 0x8DA8, 0x96DB, 0x636E, 0x6749,\n    0x6919, 0x83C5, 0x9817, 0x96C0, 0x88FE, 0x6F84, 0x647A, 0x5BF8,\n    0x4E16, 0x702C, 0x755D, 0x662F, 0x51C4, 0x5236, 0x52E2, 0x59D3,\n    0x5F81, 0x6027, 0x6210, 0x653F, 0x6574, 0x661F, 0x6674, 0x68F2,\n    0x6816, 0x6B63, 0x6E05, 0x7272, 0x751F, 0x76DB, 0x7CBE, 0x8056,\n    0x58F0, 0x88FD, 0x897F, 0x8AA0, 0x8A93, 0x8ACB, 0x901D, 0x9192,\n    0x9752, 0x9759, 0x6589, 0x7A0E, 0x8106, 0x96BB, 0x5E2D, 0x60DC,\n    0x621A, 0x65A5, 0x6614, 0x6790, 0x77F3, 0x7A4D, 0x7C4D, 0x7E3E,\n    0x810A, 0x8CAC, 0x8D64, 0x8DE1, 0x8E5F, 0x78A9, 0x5207, 0x62D9,\n    0x63A5, 0x6442, 0x6298, 0x8A2D, 0x7A83, 0x7BC0, 0x8AAC, 0x96EA,\n    0x7D76, 0x820C, 0x8749, 0x4ED9, 0x5148, 0x5343, 0x5360, 0x5BA3,\n    0x5C02, 0x5C16, 0x5DDD, 0x6226, 0x6247, 0x64B0, 0x6813, 0x6834,\n    0x6CC9, 0x6D45, 0x6D17, 0x67D3, 0x6F5C, 0x714E, 0x717D, 0x65CB,\n    0x7A7F, 0x7BAD, 0x7DDA, 0x7E4A, 0x7FA8, 0x817A, 0x821B, 0x8239,\n    0x85A6, 0x8A6E, 0x8CCE, 0x8DF5, 0x9078, 0x9077, 0x92AD, 0x9291,\n    0x9583, 0x9BAE, 0x524D, 0x5584, 0x6F38, 0x7136, 0x5168, 0x7985,\n    0x7E55, 0x81B3, 0x7CCE, 0x564C, 0x5851, 0x5CA8, 0x63AA, 0x66FE,\n    0x66FD, 0x695A, 0x72D9, 0x758F, 0x758E, 0x790E, 0x7956, 0x79DF,\n    0x7C97, 0x7D20, 0x7D44, 0x8607, 0x8A34, 0x963B, 0x9061, 0x9F20,\n    0x50E7, 0x5275, 0x53CC, 0x53E2, 0x5009, 0x55AA, 0x58EE, 0x594F,\n    0x723D, 0x5B8B, 0x5C64, 0x531D, 0x60E3, 0x60F3, 0x635C, 0x6383,\n    0x633F, 0x63BB, 0x64CD, 0x65E9, 0x66F9, 0x5DE3, 0x69CD, 0x69FD,\n    0x6F15, 0x71E5, 0x4E89, 0x75E9, 0x76F8, 0x7A93, 0x7CDF, 0x7DCF,\n    0x7D9C, 0x8061, 0x8349, 0x8358, 0x846C, 0x84BC, 0x85FB, 0x88C5,\n    0x8D70, 0x9001, 0x906D, 0x9397, 0x971C, 0x9A12, 0x50CF, 0x5897,\n    0x618E, 0x81D3, 0x8535, 0x8D08, 0x9020, 0x4FC3, 0x5074, 0x5247,\n    0x5373, 0x606F, 0x6349, 0x675F, 0x6E2C, 0x8DB3, 0x901F, 0x4FD7,\n    0x5C5E, 0x8CCA, 0x65CF, 0x7D9A, 0x5352, 0x8896, 0x5176, 0x63C3,\n    0x5B58, 0x5B6B, 0x5C0A, 0x640D, 0x6751, 0x905C, 0x4ED6, 0x591A,\n    0x592A, 0x6C70, 0x8A51, 0x553E, 0x5815, 0x59A5, 0x60F0, 0x6253,\n    0x67C1, 0x8235, 0x6955, 0x9640, 0x99C4, 0x9A28, 0x4F53, 0x5806,\n    0x5BFE, 0x8010, 0x5CB1, 0x5E2F, 0x5F85, 0x6020, 0x614B, 0x6234,\n    0x66FF, 0x6CF0, 0x6EDE, 0x80CE, 0x817F, 0x82D4, 0x888B, 0x8CB8,\n    0x9000, 0x902E, 0x968A, 0x9EDB, 0x9BDB, 0x4EE3, 0x53F0, 0x5927,\n    0x7B2C, 0x918D, 0x984C, 0x9DF9, 0x6EDD, 0x7027, 0x5353, 0x5544,\n    0x5B85, 0x6258, 0x629E, 0x62D3, 0x6CA2, 0x6FEF, 0x7422, 0x8A17,\n    0x9438, 0x6FC1, 0x8AFE, 0x8338, 0x51E7, 0x86F8, 0x53EA, 0x53E9,\n    0x4F46, 0x9054, 0x8FB0, 0x596A, 0x8131, 0x5DFD, 0x7AEA, 0x8FBF,\n    0x68DA, 0x8C37, 0x72F8, 0x9C48, 0x6A3D, 0x8AB0, 0x4E39, 0x5358,\n    0x5606, 0x5766, 0x62C5, 0x63A2, 0x65E6, 0x6B4E, 0x6DE1, 0x6E5B,\n    0x70AD, 0x77ED, 0x7AEF, 0x7BAA, 0x7DBB, 0x803D, 0x80C6, 0x86CB,\n    0x8A95, 0x935B, 0x56E3, 0x58C7, 0x5F3E, 0x65AD, 0x6696, 0x6A80,\n    0x6BB5, 0x7537, 0x8AC7, 0x5024, 0x77E5, 0x5730, 0x5F1B, 0x6065,\n    0x667A, 0x6C60, 0x75F4, 0x7A1A, 0x7F6E, 0x81F4, 0x8718, 0x9045,\n    0x99B3, 0x7BC9, 0x755C, 0x7AF9, 0x7B51, 0x84C4, 0x9010, 0x79E9,\n    0x7A92, 0x8336, 0x5AE1, 0x7740, 0x4E2D, 0x4EF2, 0x5B99, 0x5FE0,\n    0x62BD, 0x663C, 0x67F1, 0x6CE8, 0x866B, 0x8877, 0x8A3B, 0x914E,\n    0x92F3, 0x99D0, 0x6A17, 0x7026, 0x732A, 0x82E7, 0x8457, 0x8CAF,\n    0x4E01, 0x5146, 0x51CB, 0x558B, 0x5BF5, 0x5E16, 0x5E33, 0x5E81,\n    0x5F14, 0x5F35, 0x5F6B, 0x5FB4, 0x61F2, 0x6311, 0x66A2, 0x671D,\n    0x6F6E, 0x7252, 0x753A, 0x773A, 0x8074, 0x8139, 0x8178, 0x8776,\n    0x8ABF, 0x8ADC, 0x8D85, 0x8DF3, 0x929A, 0x9577, 0x9802, 0x9CE5,\n    0x52C5, 0x6357, 0x76F4, 0x6715, 0x6C88, 0x73CD, 0x8CC3, 0x93AE,\n    0x9673, 0x6D25, 0x589C, 0x690E, 0x69CC, 0x8FFD, 0x939A, 0x75DB,\n    0x901A, 0x585A, 0x6802, 0x63B4, 0x69FB, 0x4F43, 0x6F2C, 0x67D8,\n    0x8FBB, 0x8526, 0x7DB4, 0x9354, 0x693F, 0x6F70, 0x576A, 0x58F7,\n    0x5B2C, 0x7D2C, 0x722A, 0x540A, 0x91E3, 0x9DB4, 0x4EAD, 0x4F4E,\n    0x505C, 0x5075, 0x5243, 0x8C9E, 0x5448, 0x5824, 0x5B9A, 0x5E1D,\n    0x5E95, 0x5EAD, 0x5EF7, 0x5F1F, 0x608C, 0x62B5, 0x633A, 0x63D0,\n    0x68AF, 0x6C40, 0x7887, 0x798E, 0x7A0B, 0x7DE0, 0x8247, 0x8A02,\n    0x8AE6, 0x8E44, 0x9013, 0x90B8, 0x912D, 0x91D8, 0x9F0E, 0x6CE5,\n    0x6458, 0x64E2, 0x6575, 0x6EF4, 0x7684, 0x7B1B, 0x9069, 0x93D1,\n    0x6EBA, 0x54F2, 0x5FB9, 0x64A4, 0x8F4D, 0x8FED, 0x9244, 0x5178,\n    0x586B, 0x5929, 0x5C55, 0x5E97, 0x6DFB, 0x7E8F, 0x751C, 0x8CBC,\n    0x8EE2, 0x985B, 0x70B9, 0x4F1D, 0x6BBF, 0x6FB1, 0x7530, 0x96FB,\n    0x514E, 0x5410, 0x5835, 0x5857, 0x59AC, 0x5C60, 0x5F92, 0x6597,\n    0x675C, 0x6E21, 0x767B, 0x83DF, 0x8CED, 0x9014, 0x90FD, 0x934D,\n    0x7825, 0x783A, 0x52AA, 0x5EA6, 0x571F, 0x5974, 0x6012, 0x5012,\n    0x515A, 0x51AC, 0x51CD, 0x5200, 0x5510, 0x5854, 0x5858, 0x5957,\n    0x5B95, 0x5CF6, 0x5D8B, 0x60BC, 0x6295, 0x642D, 0x6771, 0x6843,\n    0x68BC, 0x68DF, 0x76D7, 0x6DD8, 0x6E6F, 0x6D9B, 0x706F, 0x71C8,\n    0x5F53, 0x75D8, 0x7977, 0x7B49, 0x7B54, 0x7B52, 0x7CD6, 0x7D71,\n    0x5230, 0x8463, 0x8569, 0x85E4, 0x8A0E, 0x8B04, 0x8C46, 0x8E0F,\n    0x9003, 0x900F, 0x9419, 0x9676, 0x982D, 0x9A30, 0x95D8, 0x50CD,\n    0x52D5, 0x540C, 0x5802, 0x5C0E, 0x61A7, 0x649E, 0x6D1E, 0x77B3,\n    0x7AE5, 0x80F4, 0x8404, 0x9053, 0x9285, 0x5CE0, 0x9D07, 0x533F,\n    0x5F97, 0x5FB3, 0x6D9C, 0x7279, 0x7763, 0x79BF, 0x7BE4, 0x6BD2,\n    0x72EC, 0x8AAD, 0x6803, 0x6A61, 0x51F8, 0x7A81, 0x6934, 0x5C4A,\n    0x9CF6, 0x82EB, 0x5BC5, 0x9149, 0x701E, 0x5678, 0x5C6F, 0x60C7,\n    0x6566, 0x6C8C, 0x8C5A, 0x9041, 0x9813, 0x5451, 0x66C7, 0x920D,\n    0x5948, 0x90A3, 0x5185, 0x4E4D, 0x51EA, 0x8599, 0x8B0E, 0x7058,\n    0x637A, 0x934B, 0x6962, 0x99B4, 0x7E04, 0x7577, 0x5357, 0x6960,\n    0x8EDF, 0x96E3, 0x6C5D, 0x4E8C, 0x5C3C, 0x5F10, 0x8FE9, 0x5302,\n    0x8CD1, 0x8089, 0x8679, 0x5EFF, 0x65E5, 0x4E73, 0x5165, 0x5982,\n    0x5C3F, 0x97EE, 0x4EFB, 0x598A, 0x5FCD, 0x8A8D, 0x6FE1, 0x79B0,\n    0x7962, 0x5BE7, 0x8471, 0x732B, 0x71B1, 0x5E74, 0x5FF5, 0x637B,\n    0x649A, 0x71C3, 0x7C98, 0x4E43, 0x5EFC, 0x4E4B, 0x57DC, 0x56A2,\n    0x60A9, 0x6FC3, 0x7D0D, 0x80FD, 0x8133, 0x81BF, 0x8FB2, 0x8997,\n    0x86A4, 0x5DF4, 0x628A, 0x64AD, 0x8987, 0x6777, 0x6CE2, 0x6D3E,\n    0x7436, 0x7834, 0x5A46, 0x7F75, 0x82AD, 0x99AC, 0x4FF3, 0x5EC3,\n    0x62DD, 0x6392, 0x6557, 0x676F, 0x76C3, 0x724C, 0x80CC, 0x80BA,\n    0x8F29, 0x914D, 0x500D, 0x57F9, 0x5A92, 0x6885, 0x6973, 0x7164,\n    0x72FD, 0x8CB7, 0x58F2, 0x8CE0, 0x966A, 0x9019, 0x877F, 0x79E4,\n    0x77E7, 0x8429, 0x4F2F, 0x5265, 0x535A, 0x62CD, 0x67CF, 0x6CCA,\n    0x767D, 0x7B94, 0x7C95, 0x8236, 0x8584, 0x8FEB, 0x66DD, 0x6F20,\n    0x7206, 0x7E1B, 0x83AB, 0x99C1, 0x9EA6, 0x51FD, 0x7BB1, 0x7872,\n    0x7BB8, 0x8087, 0x7B48, 0x6AE8, 0x5E61, 0x808C, 0x7551, 0x7560,\n    0x516B, 0x9262, 0x6E8C, 0x767A, 0x9197, 0x9AEA, 0x4F10, 0x7F70,\n    0x629C, 0x7B4F, 0x95A5, 0x9CE9, 0x567A, 0x5859, 0x86E4, 0x96BC,\n    0x4F34, 0x5224, 0x534A, 0x53CD, 0x53DB, 0x5E06, 0x642C, 0x6591,\n    0x677F, 0x6C3E, 0x6C4E, 0x7248, 0x72AF, 0x73ED, 0x7554, 0x7E41,\n    0x822C, 0x85E9, 0x8CA9, 0x7BC4, 0x91C6, 0x7169, 0x9812, 0x98EF,\n    0x633D, 0x6669, 0x756A, 0x76E4, 0x78D0, 0x8543, 0x86EE, 0x532A,\n    0x5351, 0x5426, 0x5983, 0x5E87, 0x5F7C, 0x60B2, 0x6249, 0x6279,\n    0x62AB, 0x6590, 0x6BD4, 0x6CCC, 0x75B2, 0x76AE, 0x7891, 0x79D8,\n    0x7DCB, 0x7F77, 0x80A5, 0x88AB, 0x8AB9, 0x8CBB, 0x907F, 0x975E,\n    0x98DB, 0x6A0B, 0x7C38, 0x5099, 0x5C3E, 0x5FAE, 0x6787, 0x6BD8,\n    0x7435, 0x7709, 0x7F8E, 0x9F3B, 0x67CA, 0x7A17, 0x5339, 0x758B,\n    0x9AED, 0x5F66, 0x819D, 0x83F1, 0x8098, 0x5F3C, 0x5FC5, 0x7562,\n    0x7B46, 0x903C, 0x6867, 0x59EB, 0x5A9B, 0x7D10, 0x767E, 0x8B2C,\n    0x4FF5, 0x5F6A, 0x6A19, 0x6C37, 0x6F02, 0x74E2, 0x7968, 0x8868,\n    0x8A55, 0x8C79, 0x5EDF, 0x63CF, 0x75C5, 0x79D2, 0x82D7, 0x9328,\n    0x92F2, 0x849C, 0x86ED, 0x9C2D, 0x54C1, 0x5F6C, 0x658C, 0x6D5C,\n    0x7015, 0x8CA7, 0x8CD3, 0x983B, 0x654F, 0x74F6, 0x4E0D, 0x4ED8,\n    0x57E0, 0x592B, 0x5A66, 0x5BCC, 0x51A8, 0x5E03, 0x5E9C, 0x6016,\n    0x6276, 0x6577, 0x65A7, 0x666E, 0x6D6E, 0x7236, 0x7B26, 0x8150,\n    0x819A, 0x8299, 0x8B5C, 0x8CA0, 0x8CE6, 0x8D74, 0x961C, 0x9644,\n    0x4FAE, 0x64AB, 0x6B66, 0x821E, 0x8461, 0x856A, 0x90E8, 0x5C01,\n    0x6953, 0x98A8, 0x847A, 0x8557, 0x4F0F, 0x526F, 0x5FA9, 0x5E45,\n    0x670D, 0x798F, 0x8179, 0x8907, 0x8986, 0x6DF5, 0x5F17, 0x6255,\n    0x6CB8, 0x4ECF, 0x7269, 0x9B92, 0x5206, 0x543B, 0x5674, 0x58B3,\n    0x61A4, 0x626E, 0x711A, 0x596E, 0x7C89, 0x7CDE, 0x7D1B, 0x96F0,\n    0x6587, 0x805E, 0x4E19, 0x4F75, 0x5175, 0x5840, 0x5E63, 0x5E73,\n    0x5F0A, 0x67C4, 0x4E26, 0x853D, 0x9589, 0x965B, 0x7C73, 0x9801,\n    0x50FB, 0x58C1, 0x7656, 0x78A7, 0x5225, 0x77A5, 0x8511, 0x7B86,\n    0x504F, 0x5909, 0x7247, 0x7BC7, 0x7DE8, 0x8FBA, 0x8FD4, 0x904D,\n    0x4FBF, 0x52C9, 0x5A29, 0x5F01, 0x97AD, 0x4FDD, 0x8217, 0x92EA,\n    0x5703, 0x6355, 0x6B69, 0x752B, 0x88DC, 0x8F14, 0x7A42, 0x52DF,\n    0x5893, 0x6155, 0x620A, 0x66AE, 0x6BCD, 0x7C3F, 0x83E9, 0x5023,\n    0x4FF8, 0x5305, 0x5446, 0x5831, 0x5949, 0x5B9D, 0x5CF0, 0x5CEF,\n    0x5D29, 0x5E96, 0x62B1, 0x6367, 0x653E, 0x65B9, 0x670B, 0x6CD5,\n    0x6CE1, 0x70F9, 0x7832, 0x7E2B, 0x80DE, 0x82B3, 0x840C, 0x84EC,\n    0x8702, 0x8912, 0x8A2A, 0x8C4A, 0x90A6, 0x92D2, 0x98FD, 0x9CF3,\n    0x9D6C, 0x4E4F, 0x4EA1, 0x508D, 0x5256, 0x574A, 0x59A8, 0x5E3D,\n    0x5FD8, 0x5FD9, 0x623F, 0x66B4, 0x671B, 0x67D0, 0x68D2, 0x5192,\n    0x7D21, 0x80AA, 0x81A8, 0x8B00, 0x8C8C, 0x8CBF, 0x927E, 0x9632,\n    0x5420, 0x982C, 0x5317, 0x50D5, 0x535C, 0x58A8, 0x64B2, 0x6734,\n    0x7267, 0x7766, 0x7A46, 0x91E6, 0x52C3, 0x6CA1, 0x6B86, 0x5800,\n    0x5E4C, 0x5954, 0x672C, 0x7FFB, 0x51E1, 0x76C6, 0x6469, 0x78E8,\n    0x9B54, 0x9EBB, 0x57CB, 0x59B9, 0x6627, 0x679A, 0x6BCE, 0x54E9,\n    0x69D9, 0x5E55, 0x819C, 0x6795, 0x9BAA, 0x67FE, 0x9C52, 0x685D,\n    0x4EA6, 0x4FE3, 0x53C8, 0x62B9, 0x672B, 0x6CAB, 0x8FC4, 0x4FAD,\n    0x7E6D, 0x9EBF, 0x4E07, 0x6162, 0x6E80, 0x6F2B, 0x8513, 0x5473,\n    0x672A, 0x9B45, 0x5DF3, 0x7B95, 0x5CAC, 0x5BC6, 0x871C, 0x6E4A,\n    0x84D1, 0x7A14, 0x8108, 0x5999, 0x7C8D, 0x6C11, 0x7720, 0x52D9,\n    0x5922, 0x7121, 0x725F, 0x77DB, 0x9727, 0x9D61, 0x690B, 0x5A7F,\n    0x5A18, 0x51A5, 0x540D, 0x547D, 0x660E, 0x76DF, 0x8FF7, 0x9298,\n    0x9CF4, 0x59EA, 0x725D, 0x6EC5, 0x514D, 0x68C9, 0x7DBF, 0x7DEC,\n    0x9762, 0x9EBA, 0x6478, 0x6A21, 0x8302, 0x5984, 0x5B5F, 0x6BDB,\n    0x731B, 0x76F2, 0x7DB2, 0x8017, 0x8499, 0x5132, 0x6728, 0x9ED9,\n    0x76EE, 0x6762, 0x52FF, 0x9905, 0x5C24, 0x623B, 0x7C7E, 0x8CB0,\n    0x554F, 0x60B6, 0x7D0B, 0x9580, 0x5301, 0x4E5F, 0x51B6, 0x591C,\n    0x723A, 0x8036, 0x91CE, 0x5F25, 0x77E2, 0x5384, 0x5F79, 0x7D04,\n    0x85AC, 0x8A33, 0x8E8D, 0x9756, 0x67F3, 0x85AE, 0x9453, 0x6109,\n    0x6108, 0x6CB9, 0x7652, 0x8AED, 0x8F38, 0x552F, 0x4F51, 0x512A,\n    0x52C7, 0x53CB, 0x5BA5, 0x5E7D, 0x60A0, 0x6182, 0x63D6, 0x6709,\n    0x67DA, 0x6E67, 0x6D8C, 0x7336, 0x7337, 0x7531, 0x7950, 0x88D5,\n    0x8A98, 0x904A, 0x9091, 0x90F5, 0x96C4, 0x878D, 0x5915, 0x4E88,\n    0x4F59, 0x4E0E, 0x8A89, 0x8F3F, 0x9810, 0x50AD, 0x5E7C, 0x5996,\n    0x5BB9, 0x5EB8, 0x63DA, 0x63FA, 0x64C1, 0x66DC, 0x694A, 0x69D8,\n    0x6D0B, 0x6EB6, 0x7194, 0x7528, 0x7AAF, 0x7F8A, 0x8000, 0x8449,\n    0x84C9, 0x8981, 0x8B21, 0x8E0A, 0x9065, 0x967D, 0x990A, 0x617E,\n    0x6291, 0x6B32, 0x6C83, 0x6D74, 0x7FCC, 0x7FFC, 0x6DC0, 0x7F85,\n    0x87BA, 0x88F8, 0x6765, 0x83B1, 0x983C, 0x96F7, 0x6D1B, 0x7D61,\n    0x843D, 0x916A, 0x4E71, 0x5375, 0x5D50, 0x6B04, 0x6FEB, 0x85CD,\n    0x862D, 0x89A7, 0x5229, 0x540F, 0x5C65, 0x674E, 0x68A8, 0x7406,\n    0x7483, 0x75E2, 0x88CF, 0x88E1, 0x91CC, 0x96E2, 0x9678, 0x5F8B,\n    0x7387, 0x7ACB, 0x844E, 0x63A0, 0x7565, 0x5289, 0x6D41, 0x6E9C,\n    0x7409, 0x7559, 0x786B, 0x7C92, 0x9686, 0x7ADC, 0x9F8D, 0x4FB6,\n    0x616E, 0x65C5, 0x865C, 0x4E86, 0x4EAE, 0x50DA, 0x4E21, 0x51CC,\n    0x5BEE, 0x6599, 0x6881, 0x6DBC, 0x731F, 0x7642, 0x77AD, 0x7A1C,\n    0x7CE7, 0x826F, 0x8AD2, 0x907C, 0x91CF, 0x9675, 0x9818, 0x529B,\n    0x7DD1, 0x502B, 0x5398, 0x6797, 0x6DCB, 0x71D0, 0x7433, 0x81E8,\n    0x8F2A, 0x96A3, 0x9C57, 0x9E9F, 0x7460, 0x5841, 0x6D99, 0x7D2F,\n    0x985E, 0x4EE4, 0x4F36, 0x4F8B, 0x51B7, 0x52B1, 0x5DBA, 0x601C,\n    0x73B2, 0x793C, 0x82D3, 0x9234, 0x96B7, 0x96F6, 0x970A, 0x9E97,\n    0x9F62, 0x66A6, 0x6B74, 0x5217, 0x52A3, 0x70C8, 0x88C2, 0x5EC9,\n    0x604B, 0x6190, 0x6F23, 0x7149, 0x7C3E, 0x7DF4, 0x806F, 0x84EE,\n    0x9023, 0x932C, 0x5442, 0x9B6F, 0x6AD3, 0x7089, 0x8CC2, 0x8DEF,\n    0x9732, 0x52B4, 0x5A41, 0x5ECA, 0x5F04, 0x6717, 0x697C, 0x6994,\n    0x6D6A, 0x6F0F, 0x7262, 0x72FC, 0x7BED, 0x8001, 0x807E, 0x874B,\n    0x90CE, 0x516D, 0x9E93, 0x7984, 0x808B, 0x9332, 0x8AD6, 0x502D,\n    0x548C, 0x8A71, 0x6B6A, 0x8CC4, 0x8107, 0x60D1, 0x67A0, 0x9DF2,\n    0x4E99, 0x4E98, 0x9C10, 0x8A6B, 0x85C1, 0x8568, 0x6900, 0x6E7E,\n    0x7897, 0x8155, 0x5F0C, 0x4E10, 0x4E15, 0x4E2A, 0x4E31, 0x4E36,\n    0x4E3C, 0x4E3F, 0x4E42, 0x4E56, 0x4E58, 0x4E82, 0x4E85, 0x8C6B,\n    0x4E8A, 0x8212, 0x5F0D, 0x4E8E, 0x4E9E, 0x4E9F, 0x4EA0, 0x4EA2,\n    0x4EB0, 0x4EB3, 0x4EB6, 0x4ECE, 0x4ECD, 0x4EC4, 0x4EC6, 0x4EC2,\n    0x4ED7, 0x4EDE, 0x4EED, 0x4EDF, 0x4EF7, 0x4F09, 0x4F5A, 0x4F30,\n    0x4F5B, 0x4F5D, 0x4F57, 0x4F47, 0x4F76, 0x4F88, 0x4F8F, 0x4F98,\n    0x4F7B, 0x4F69, 0x4F70, 0x4F91, 0x4F6F, 0x4F86, 0x4F96, 0x5118,\n    0x4FD4, 0x4FDF, 0x4FCE, 0x4FD8, 0x4FDB, 0x4FD1, 0x4FDA, 0x4FD0,\n    0x4FE4, 0x4FE5, 0x501A, 0x5028, 0x5014, 0x502A, 0x5025, 0x5005,\n    0x4F1C, 0x4FF6, 0x5021, 0x5029, 0x502C, 0x4FFE, 0x4FEF, 0x5011,\n    0x5006, 0x5043, 0x5047, 0x6703, 0x5055, 0x5050, 0x5048, 0x505A,\n    0x5056, 0x506C, 0x5078, 0x5080, 0x509A, 0x5085, 0x50B4, 0x50B2,\n    0x50C9, 0x50CA, 0x50B3, 0x50C2, 0x50D6, 0x50DE, 0x50E5, 0x50ED,\n    0x50E3, 0x50EE, 0x50F9, 0x50F5, 0x5109, 0x5101, 0x5102, 0x5116,\n    0x5115, 0x5114, 0x511A, 0x5121, 0x513A, 0x5137, 0x513C, 0x513B,\n    0x513F, 0x5140, 0x5152, 0x514C, 0x5154, 0x5162, 0x7AF8, 0x5169,\n    0x516A, 0x516E, 0x5180, 0x5182, 0x56D8, 0x518C, 0x5189, 0x518F,\n    0x5191, 0x5193, 0x5195, 0x5196, 0x51A4, 0x51A6, 0x51A2, 0x51A9,\n    0x51AA, 0x51AB, 0x51B3, 0x51B1, 0x51B2, 0x51B0, 0x51B5, 0x51BD,\n    0x51C5, 0x51C9, 0x51DB, 0x51E0, 0x8655, 0x51E9, 0x51ED, 0x51F0,\n    0x51F5, 0x51FE, 0x5204, 0x520B, 0x5214, 0x520E, 0x5227, 0x522A,\n    0x522E, 0x5233, 0x5239, 0x524F, 0x5244, 0x524B, 0x524C, 0x525E,\n    0x5254, 0x526A, 0x5274, 0x5269, 0x5273, 0x527F, 0x527D, 0x528D,\n    0x5294, 0x5292, 0x5271, 0x5288, 0x5291, 0x8FA8, 0x8FA7, 0x52AC,\n    0x52AD, 0x52BC, 0x52B5, 0x52C1, 0x52CD, 0x52D7, 0x52DE, 0x52E3,\n    0x52E6, 0x98ED, 0x52E0, 0x52F3, 0x52F5, 0x52F8, 0x52F9, 0x5306,\n    0x5308, 0x7538, 0x530D, 0x5310, 0x530F, 0x5315, 0x531A, 0x5323,\n    0x532F, 0x5331, 0x5333, 0x5338, 0x5340, 0x5346, 0x5345, 0x4E17,\n    0x5349, 0x534D, 0x51D6, 0x535E, 0x5369, 0x536E, 0x5918, 0x537B,\n    0x5377, 0x5382, 0x5396, 0x53A0, 0x53A6, 0x53A5, 0x53AE, 0x53B0,\n    0x53B6, 0x53C3, 0x7C12, 0x96D9, 0x53DF, 0x66FC, 0x71EE, 0x53EE,\n    0x53E8, 0x53ED, 0x53FA, 0x5401, 0x543D, 0x5440, 0x542C, 0x542D,\n    0x543C, 0x542E, 0x5436, 0x5429, 0x541D, 0x544E, 0x548F, 0x5475,\n    0x548E, 0x545F, 0x5471, 0x5477, 0x5470, 0x5492, 0x547B, 0x5480,\n    0x5476, 0x5484, 0x5490, 0x5486, 0x54C7, 0x54A2, 0x54B8, 0x54A5,\n    0x54AC, 0x54C4, 0x54C8, 0x54A8, 0x54AB, 0x54C2, 0x54A4, 0x54BE,\n    0x54BC, 0x54D8, 0x54E5, 0x54E6, 0x550F, 0x5514, 0x54FD, 0x54EE,\n    0x54ED, 0x54FA, 0x54E2, 0x5539, 0x5540, 0x5563, 0x554C, 0x552E,\n    0x555C, 0x5545, 0x5556, 0x5557, 0x5538, 0x5533, 0x555D, 0x5599,\n    0x5580, 0x54AF, 0x558A, 0x559F, 0x557B, 0x557E, 0x5598, 0x559E,\n    0x55AE, 0x557C, 0x5583, 0x55A9, 0x5587, 0x55A8, 0x55DA, 0x55C5,\n    0x55DF, 0x55C4, 0x55DC, 0x55E4, 0x55D4, 0x5614, 0x55F7, 0x5616,\n    0x55FE, 0x55FD, 0x561B, 0x55F9, 0x564E, 0x5650, 0x71DF, 0x5634,\n    0x5636, 0x5632, 0x5638, 0x566B, 0x5664, 0x562F, 0x566C, 0x566A,\n    0x5686, 0x5680, 0x568A, 0x56A0, 0x5694, 0x568F, 0x56A5, 0x56AE,\n    0x56B6, 0x56B4, 0x56C2, 0x56BC, 0x56C1, 0x56C3, 0x56C0, 0x56C8,\n    0x56CE, 0x56D1, 0x56D3, 0x56D7, 0x56EE, 0x56F9, 0x5700, 0x56FF,\n    0x5704, 0x5709, 0x5708, 0x570B, 0x570D, 0x5713, 0x5718, 0x5716,\n    0x55C7, 0x571C, 0x5726, 0x5737, 0x5738, 0x574E, 0x573B, 0x5740,\n    0x574F, 0x5769, 0x57C0, 0x5788, 0x5761, 0x577F, 0x5789, 0x5793,\n    0x57A0, 0x57B3, 0x57A4, 0x57AA, 0x57B0, 0x57C3, 0x57C6, 0x57D4,\n    0x57D2, 0x57D3, 0x580A, 0x57D6, 0x57E3, 0x580B, 0x5819, 0x581D,\n    0x5872, 0x5821, 0x5862, 0x584B, 0x5870, 0x6BC0, 0x5852, 0x583D,\n    0x5879, 0x5885, 0x58B9, 0x589F, 0x58AB, 0x58BA, 0x58DE, 0x58BB,\n    0x58B8, 0x58AE, 0x58C5, 0x58D3, 0x58D1, 0x58D7, 0x58D9, 0x58D8,\n    0x58E5, 0x58DC, 0x58E4, 0x58DF, 0x58EF, 0x58FA, 0x58F9, 0x58FB,\n    0x58FC, 0x58FD, 0x5902, 0x590A, 0x5910, 0x591B, 0x68A6, 0x5925,\n    0x592C, 0x592D, 0x5932, 0x5938, 0x593E, 0x7AD2, 0x5955, 0x5950,\n    0x594E, 0x595A, 0x5958, 0x5962, 0x5960, 0x5967, 0x596C, 0x5969,\n    0x5978, 0x5981, 0x599D, 0x4F5E, 0x4FAB, 0x59A3, 0x59B2, 0x59C6,\n    0x59E8, 0x59DC, 0x598D, 0x59D9, 0x59DA, 0x5A25, 0x5A1F, 0x5A11,\n    0x5A1C, 0x5A09, 0x5A1A, 0x5A40, 0x5A6C, 0x5A49, 0x5A35, 0x5A36,\n    0x5A62, 0x5A6A, 0x5A9A, 0x5ABC, 0x5ABE, 0x5ACB, 0x5AC2, 0x5ABD,\n    0x5AE3, 0x5AD7, 0x5AE6, 0x5AE9, 0x5AD6, 0x5AFA, 0x5AFB, 0x5B0C,\n    0x5B0B, 0x5B16, 0x5B32, 0x5AD0, 0x5B2A, 0x5B36, 0x5B3E, 0x5B43,\n    0x5B45, 0x5B40, 0x5B51, 0x5B55, 0x5B5A, 0x5B5B, 0x5B65, 0x5B69,\n    0x5B70, 0x5B73, 0x5B75, 0x5B78, 0x6588, 0x5B7A, 0x5B80, 0x5B83,\n    0x5BA6, 0x5BB8, 0x5BC3, 0x5BC7, 0x5BC9, 0x5BD4, 0x5BD0, 0x5BE4,\n    0x5BE6, 0x5BE2, 0x5BDE, 0x5BE5, 0x5BEB, 0x5BF0, 0x5BF6, 0x5BF3,\n    0x5C05, 0x5C07, 0x5C08, 0x5C0D, 0x5C13, 0x5C20, 0x5C22, 0x5C28,\n    0x5C38, 0x5C39, 0x5C41, 0x5C46, 0x5C4E, 0x5C53, 0x5C50, 0x5C4F,\n    0x5B71, 0x5C6C, 0x5C6E, 0x4E62, 0x5C76, 0x5C79, 0x5C8C, 0x5C91,\n    0x5C94, 0x599B, 0x5CAB, 0x5CBB, 0x5CB6, 0x5CBC, 0x5CB7, 0x5CC5,\n    0x5CBE, 0x5CC7, 0x5CD9, 0x5CE9, 0x5CFD, 0x5CFA, 0x5CED, 0x5D8C,\n    0x5CEA, 0x5D0B, 0x5D15, 0x5D17, 0x5D5C, 0x5D1F, 0x5D1B, 0x5D11,\n    0x5D14, 0x5D22, 0x5D1A, 0x5D19, 0x5D18, 0x5D4C, 0x5D52, 0x5D4E,\n    0x5D4B, 0x5D6C, 0x5D73, 0x5D76, 0x5D87, 0x5D84, 0x5D82, 0x5DA2,\n    0x5D9D, 0x5DAC, 0x5DAE, 0x5DBD, 0x5D90, 0x5DB7, 0x5DBC, 0x5DC9,\n    0x5DCD, 0x5DD3, 0x5DD2, 0x5DD6, 0x5DDB, 0x5DEB, 0x5DF2, 0x5DF5,\n    0x5E0B, 0x5E1A, 0x5E19, 0x5E11, 0x5E1B, 0x5E36, 0x5E37, 0x5E44,\n    0x5E43, 0x5E40, 0x5E4E, 0x5E57, 0x5E54, 0x5E5F, 0x5E62, 0x5E64,\n    0x5E47, 0x5E75, 0x5E76, 0x5E7A, 0x9EBC, 0x5E7F, 0x5EA0, 0x5EC1,\n    0x5EC2, 0x5EC8, 0x5ED0, 0x5ECF, 0x5ED6, 0x5EE3, 0x5EDD, 0x5EDA,\n    0x5EDB, 0x5EE2, 0x5EE1, 0x5EE8, 0x5EE9, 0x5EEC, 0x5EF1, 0x5EF3,\n    0x5EF0, 0x5EF4, 0x5EF8, 0x5EFE, 0x5F03, 0x5F09, 0x5F5D, 0x5F5C,\n    0x5F0B, 0x5F11, 0x5F16, 0x5F29, 0x5F2D, 0x5F38, 0x5F41, 0x5F48,\n    0x5F4C, 0x5F4E, 0x5F2F, 0x5F51, 0x5F56, 0x5F57, 0x5F59, 0x5F61,\n    0x5F6D, 0x5F73, 0x5F77, 0x5F83, 0x5F82, 0x5F7F, 0x5F8A, 0x5F88,\n    0x5F91, 0x5F87, 0x5F9E, 0x5F99, 0x5F98, 0x5FA0, 0x5FA8, 0x5FAD,\n    0x5FBC, 0x5FD6, 0x5FFB, 0x5FE4, 0x5FF8, 0x5FF1, 0x5FDD, 0x60B3,\n    0x5FFF, 0x6021, 0x6060, 0x6019, 0x6010, 0x6029, 0x600E, 0x6031,\n    0x601B, 0x6015, 0x602B, 0x6026, 0x600F, 0x603A, 0x605A, 0x6041,\n    0x606A, 0x6077, 0x605F, 0x604A, 0x6046, 0x604D, 0x6063, 0x6043,\n    0x6064, 0x6042, 0x606C, 0x606B, 0x6059, 0x6081, 0x608D, 0x60E7,\n    0x6083, 0x609A, 0x6084, 0x609B, 0x6096, 0x6097, 0x6092, 0x60A7,\n    0x608B, 0x60E1, 0x60B8, 0x60E0, 0x60D3, 0x60B4, 0x5FF0, 0x60BD,\n    0x60C6, 0x60B5, 0x60D8, 0x614D, 0x6115, 0x6106, 0x60F6, 0x60F7,\n    0x6100, 0x60F4, 0x60FA, 0x6103, 0x6121, 0x60FB, 0x60F1, 0x610D,\n    0x610E, 0x6147, 0x613E, 0x6128, 0x6127, 0x614A, 0x613F, 0x613C,\n    0x612C, 0x6134, 0x613D, 0x6142, 0x6144, 0x6173, 0x6177, 0x6158,\n    0x6159, 0x615A, 0x616B, 0x6174, 0x616F, 0x6165, 0x6171, 0x615F,\n    0x615D, 0x6153, 0x6175, 0x6199, 0x6196, 0x6187, 0x61AC, 0x6194,\n    0x619A, 0x618A, 0x6191, 0x61AB, 0x61AE, 0x61CC, 0x61CA, 0x61C9,\n    0x61F7, 0x61C8, 0x61C3, 0x61C6, 0x61BA, 0x61CB, 0x7F79, 0x61CD,\n    0x61E6, 0x61E3, 0x61F6, 0x61FA, 0x61F4, 0x61FF, 0x61FD, 0x61FC,\n    0x61FE, 0x6200, 0x6208, 0x6209, 0x620D, 0x620C, 0x6214, 0x621B,\n    0x621E, 0x6221, 0x622A, 0x622E, 0x6230, 0x6232, 0x6233, 0x6241,\n    0x624E, 0x625E, 0x6263, 0x625B, 0x6260, 0x6268, 0x627C, 0x6282,\n    0x6289, 0x627E, 0x6292, 0x6293, 0x6296, 0x62D4, 0x6283, 0x6294,\n    0x62D7, 0x62D1, 0x62BB, 0x62CF, 0x62FF, 0x62C6, 0x64D4, 0x62C8,\n    0x62DC, 0x62CC, 0x62CA, 0x62C2, 0x62C7, 0x629B, 0x62C9, 0x630C,\n    0x62EE, 0x62F1, 0x6327, 0x6302, 0x6308, 0x62EF, 0x62F5, 0x6350,\n    0x633E, 0x634D, 0x641C, 0x634F, 0x6396, 0x638E, 0x6380, 0x63AB,\n    0x6376, 0x63A3, 0x638F, 0x6389, 0x639F, 0x63B5, 0x636B, 0x6369,\n    0x63BE, 0x63E9, 0x63C0, 0x63C6, 0x63E3, 0x63C9, 0x63D2, 0x63F6,\n    0x63C4, 0x6416, 0x6434, 0x6406, 0x6413, 0x6426, 0x6436, 0x651D,\n    0x6417, 0x6428, 0x640F, 0x6467, 0x646F, 0x6476, 0x644E, 0x652A,\n    0x6495, 0x6493, 0x64A5, 0x64A9, 0x6488, 0x64BC, 0x64DA, 0x64D2,\n    0x64C5, 0x64C7, 0x64BB, 0x64D8, 0x64C2, 0x64F1, 0x64E7, 0x8209,\n    0x64E0, 0x64E1, 0x62AC, 0x64E3, 0x64EF, 0x652C, 0x64F6, 0x64F4,\n    0x64F2, 0x64FA, 0x6500, 0x64FD, 0x6518, 0x651C, 0x6505, 0x6524,\n    0x6523, 0x652B, 0x6534, 0x6535, 0x6537, 0x6536, 0x6538, 0x754B,\n    0x6548, 0x6556, 0x6555, 0x654D, 0x6558, 0x655E, 0x655D, 0x6572,\n    0x6578, 0x6582, 0x6583, 0x8B8A, 0x659B, 0x659F, 0x65AB, 0x65B7,\n    0x65C3, 0x65C6, 0x65C1, 0x65C4, 0x65CC, 0x65D2, 0x65DB, 0x65D9,\n    0x65E0, 0x65E1, 0x65F1, 0x6772, 0x660A, 0x6603, 0x65FB, 0x6773,\n    0x6635, 0x6636, 0x6634, 0x661C, 0x664F, 0x6644, 0x6649, 0x6641,\n    0x665E, 0x665D, 0x6664, 0x6667, 0x6668, 0x665F, 0x6662, 0x6670,\n    0x6683, 0x6688, 0x668E, 0x6689, 0x6684, 0x6698, 0x669D, 0x66C1,\n    0x66B9, 0x66C9, 0x66BE, 0x66BC, 0x66C4, 0x66B8, 0x66D6, 0x66DA,\n    0x66E0, 0x663F, 0x66E6, 0x66E9, 0x66F0, 0x66F5, 0x66F7, 0x670F,\n    0x6716, 0x671E, 0x6726, 0x6727, 0x9738, 0x672E, 0x673F, 0x6736,\n    0x6741, 0x6738, 0x6737, 0x6746, 0x675E, 0x6760, 0x6759, 0x6763,\n    0x6764, 0x6789, 0x6770, 0x67A9, 0x677C, 0x676A, 0x678C, 0x678B,\n    0x67A6, 0x67A1, 0x6785, 0x67B7, 0x67EF, 0x67B4, 0x67EC, 0x67B3,\n    0x67E9, 0x67B8, 0x67E4, 0x67DE, 0x67DD, 0x67E2, 0x67EE, 0x67B9,\n    0x67CE, 0x67C6, 0x67E7, 0x6A9C, 0x681E, 0x6846, 0x6829, 0x6840,\n    0x684D, 0x6832, 0x684E, 0x68B3, 0x682B, 0x6859, 0x6863, 0x6877,\n    0x687F, 0x689F, 0x688F, 0x68AD, 0x6894, 0x689D, 0x689B, 0x6883,\n    0x6AAE, 0x68B9, 0x6874, 0x68B5, 0x68A0, 0x68BA, 0x690F, 0x688D,\n    0x687E, 0x6901, 0x68CA, 0x6908, 0x68D8, 0x6922, 0x6926, 0x68E1,\n    0x690C, 0x68CD, 0x68D4, 0x68E7, 0x68D5, 0x6936, 0x6912, 0x6904,\n    0x68D7, 0x68E3, 0x6925, 0x68F9, 0x68E0, 0x68EF, 0x6928, 0x692A,\n    0x691A, 0x6923, 0x6921, 0x68C6, 0x6979, 0x6977, 0x695C, 0x6978,\n    0x696B, 0x6954, 0x697E, 0x696E, 0x6939, 0x6974, 0x693D, 0x6959,\n    0x6930, 0x6961, 0x695E, 0x695D, 0x6981, 0x696A, 0x69B2, 0x69AE,\n    0x69D0, 0x69BF, 0x69C1, 0x69D3, 0x69BE, 0x69CE, 0x5BE8, 0x69CA,\n    0x69DD, 0x69BB, 0x69C3, 0x69A7, 0x6A2E, 0x6991, 0x69A0, 0x699C,\n    0x6995, 0x69B4, 0x69DE, 0x69E8, 0x6A02, 0x6A1B, 0x69FF, 0x6B0A,\n    0x69F9, 0x69F2, 0x69E7, 0x6A05, 0x69B1, 0x6A1E, 0x69ED, 0x6A14,\n    0x69EB, 0x6A0A, 0x6A12, 0x6AC1, 0x6A23, 0x6A13, 0x6A44, 0x6A0C,\n    0x6A72, 0x6A36, 0x6A78, 0x6A47, 0x6A62, 0x6A59, 0x6A66, 0x6A48,\n    0x6A38, 0x6A22, 0x6A90, 0x6A8D, 0x6AA0, 0x6A84, 0x6AA2, 0x6AA3,\n    0x6A97, 0x8617, 0x6ABB, 0x6AC3, 0x6AC2, 0x6AB8, 0x6AB3, 0x6AAC,\n    0x6ADE, 0x6AD1, 0x6ADF, 0x6AAA, 0x6ADA, 0x6AEA, 0x6AFB, 0x6B05,\n    0x8616, 0x6AFA, 0x6B12, 0x6B16, 0x9B31, 0x6B1F, 0x6B38, 0x6B37,\n    0x76DC, 0x6B39, 0x98EE, 0x6B47, 0x6B43, 0x6B49, 0x6B50, 0x6B59,\n    0x6B54, 0x6B5B, 0x6B5F, 0x6B61, 0x6B78, 0x6B79, 0x6B7F, 0x6B80,\n    0x6B84, 0x6B83, 0x6B8D, 0x6B98, 0x6B95, 0x6B9E, 0x6BA4, 0x6BAA,\n    0x6BAB, 0x6BAF, 0x6BB2, 0x6BB1, 0x6BB3, 0x6BB7, 0x6BBC, 0x6BC6,\n    0x6BCB, 0x6BD3, 0x6BDF, 0x6BEC, 0x6BEB, 0x6BF3, 0x6BEF, 0x9EBE,\n    0x6C08, 0x6C13, 0x6C14, 0x6C1B, 0x6C24, 0x6C23, 0x6C5E, 0x6C55,\n    0x6C62, 0x6C6A, 0x6C82, 0x6C8D, 0x6C9A, 0x6C81, 0x6C9B, 0x6C7E,\n    0x6C68, 0x6C73, 0x6C92, 0x6C90, 0x6CC4, 0x6CF1, 0x6CD3, 0x6CBD,\n    0x6CD7, 0x6CC5, 0x6CDD, 0x6CAE, 0x6CB1, 0x6CBE, 0x6CBA, 0x6CDB,\n    0x6CEF, 0x6CD9, 0x6CEA, 0x6D1F, 0x884D, 0x6D36, 0x6D2B, 0x6D3D,\n    0x6D38, 0x6D19, 0x6D35, 0x6D33, 0x6D12, 0x6D0C, 0x6D63, 0x6D93,\n    0x6D64, 0x6D5A, 0x6D79, 0x6D59, 0x6D8E, 0x6D95, 0x6FE4, 0x6D85,\n    0x6DF9, 0x6E15, 0x6E0A, 0x6DB5, 0x6DC7, 0x6DE6, 0x6DB8, 0x6DC6,\n    0x6DEC, 0x6DDE, 0x6DCC, 0x6DE8, 0x6DD2, 0x6DC5, 0x6DFA, 0x6DD9,\n    0x6DE4, 0x6DD5, 0x6DEA, 0x6DEE, 0x6E2D, 0x6E6E, 0x6E2E, 0x6E19,\n    0x6E72, 0x6E5F, 0x6E3E, 0x6E23, 0x6E6B, 0x6E2B, 0x6E76, 0x6E4D,\n    0x6E1F, 0x6E43, 0x6E3A, 0x6E4E, 0x6E24, 0x6EFF, 0x6E1D, 0x6E38,\n    0x6E82, 0x6EAA, 0x6E98, 0x6EC9, 0x6EB7, 0x6ED3, 0x6EBD, 0x6EAF,\n    0x6EC4, 0x6EB2, 0x6ED4, 0x6ED5, 0x6E8F, 0x6EA5, 0x6EC2, 0x6E9F,\n    0x6F41, 0x6F11, 0x704C, 0x6EEC, 0x6EF8, 0x6EFE, 0x6F3F, 0x6EF2,\n    0x6F31, 0x6EEF, 0x6F32, 0x6ECC, 0x6F3E, 0x6F13, 0x6EF7, 0x6F86,\n    0x6F7A, 0x6F78, 0x6F81, 0x6F80, 0x6F6F, 0x6F5B, 0x6FF3, 0x6F6D,\n    0x6F82, 0x6F7C, 0x6F58, 0x6F8E, 0x6F91, 0x6FC2, 0x6F66, 0x6FB3,\n    0x6FA3, 0x6FA1, 0x6FA4, 0x6FB9, 0x6FC6, 0x6FAA, 0x6FDF, 0x6FD5,\n    0x6FEC, 0x6FD4, 0x6FD8, 0x6FF1, 0x6FEE, 0x6FDB, 0x7009, 0x700B,\n    0x6FFA, 0x7011, 0x7001, 0x700F, 0x6FFE, 0x701B, 0x701A, 0x6F74,\n    0x701D, 0x7018, 0x701F, 0x7030, 0x703E, 0x7032, 0x7051, 0x7063,\n    0x7099, 0x7092, 0x70AF, 0x70F1, 0x70AC, 0x70B8, 0x70B3, 0x70AE,\n    0x70DF, 0x70CB, 0x70DD, 0x70D9, 0x7109, 0x70FD, 0x711C, 0x7119,\n    0x7165, 0x7155, 0x7188, 0x7166, 0x7162, 0x714C, 0x7156, 0x716C,\n    0x718F, 0x71FB, 0x7184, 0x7195, 0x71A8, 0x71AC, 0x71D7, 0x71B9,\n    0x71BE, 0x71D2, 0x71C9, 0x71D4, 0x71CE, 0x71E0, 0x71EC, 0x71E7,\n    0x71F5, 0x71FC, 0x71F9, 0x71FF, 0x720D, 0x7210, 0x721B, 0x7228,\n    0x722D, 0x722C, 0x7230, 0x7232, 0x723B, 0x723C, 0x723F, 0x7240,\n    0x7246, 0x724B, 0x7258, 0x7274, 0x727E, 0x7282, 0x7281, 0x7287,\n    0x7292, 0x7296, 0x72A2, 0x72A7, 0x72B9, 0x72B2, 0x72C3, 0x72C6,\n    0x72C4, 0x72CE, 0x72D2, 0x72E2, 0x72E0, 0x72E1, 0x72F9, 0x72F7,\n    0x500F, 0x7317, 0x730A, 0x731C, 0x7316, 0x731D, 0x7334, 0x732F,\n    0x7329, 0x7325, 0x733E, 0x734E, 0x734F, 0x9ED8, 0x7357, 0x736A,\n    0x7368, 0x7370, 0x7378, 0x7375, 0x737B, 0x737A, 0x73C8, 0x73B3,\n    0x73CE, 0x73BB, 0x73C0, 0x73E5, 0x73EE, 0x73DE, 0x74A2, 0x7405,\n    0x746F, 0x7425, 0x73F8, 0x7432, 0x743A, 0x7455, 0x743F, 0x745F,\n    0x7459, 0x7441, 0x745C, 0x7469, 0x7470, 0x7463, 0x746A, 0x7476,\n    0x747E, 0x748B, 0x749E, 0x74A7, 0x74CA, 0x74CF, 0x74D4, 0x73F1,\n    0x74E0, 0x74E3, 0x74E7, 0x74E9, 0x74EE, 0x74F2, 0x74F0, 0x74F1,\n    0x74F8, 0x74F7, 0x7504, 0x7503, 0x7505, 0x750C, 0x750E, 0x750D,\n    0x7515, 0x7513, 0x751E, 0x7526, 0x752C, 0x753C, 0x7544, 0x754D,\n    0x754A, 0x7549, 0x755B, 0x7546, 0x755A, 0x7569, 0x7564, 0x7567,\n    0x756B, 0x756D, 0x7578, 0x7576, 0x7586, 0x7587, 0x7574, 0x758A,\n    0x7589, 0x7582, 0x7594, 0x759A, 0x759D, 0x75A5, 0x75A3, 0x75C2,\n    0x75B3, 0x75C3, 0x75B5, 0x75BD, 0x75B8, 0x75BC, 0x75B1, 0x75CD,\n    0x75CA, 0x75D2, 0x75D9, 0x75E3, 0x75DE, 0x75FE, 0x75FF, 0x75FC,\n    0x7601, 0x75F0, 0x75FA, 0x75F2, 0x75F3, 0x760B, 0x760D, 0x7609,\n    0x761F, 0x7627, 0x7620, 0x7621, 0x7622, 0x7624, 0x7634, 0x7630,\n    0x763B, 0x7647, 0x7648, 0x7646, 0x765C, 0x7658, 0x7661, 0x7662,\n    0x7668, 0x7669, 0x766A, 0x7667, 0x766C, 0x7670, 0x7672, 0x7676,\n    0x7678, 0x767C, 0x7680, 0x7683, 0x7688, 0x768B, 0x768E, 0x7696,\n    0x7693, 0x7699, 0x769A, 0x76B0, 0x76B4, 0x76B8, 0x76B9, 0x76BA,\n    0x76C2, 0x76CD, 0x76D6, 0x76D2, 0x76DE, 0x76E1, 0x76E5, 0x76E7,\n    0x76EA, 0x862F, 0x76FB, 0x7708, 0x7707, 0x7704, 0x7729, 0x7724,\n    0x771E, 0x7725, 0x7726, 0x771B, 0x7737, 0x7738, 0x7747, 0x775A,\n    0x7768, 0x776B, 0x775B, 0x7765, 0x777F, 0x777E, 0x7779, 0x778E,\n    0x778B, 0x7791, 0x77A0, 0x779E, 0x77B0, 0x77B6, 0x77B9, 0x77BF,\n    0x77BC, 0x77BD, 0x77BB, 0x77C7, 0x77CD, 0x77D7, 0x77DA, 0x77DC,\n    0x77E3, 0x77EE, 0x77FC, 0x780C, 0x7812, 0x7926, 0x7820, 0x792A,\n    0x7845, 0x788E, 0x7874, 0x7886, 0x787C, 0x789A, 0x788C, 0x78A3,\n    0x78B5, 0x78AA, 0x78AF, 0x78D1, 0x78C6, 0x78CB, 0x78D4, 0x78BE,\n    0x78BC, 0x78C5, 0x78CA, 0x78EC, 0x78E7, 0x78DA, 0x78FD, 0x78F4,\n    0x7907, 0x7912, 0x7911, 0x7919, 0x792C, 0x792B, 0x7940, 0x7960,\n    0x7957, 0x795F, 0x795A, 0x7955, 0x7953, 0x797A, 0x797F, 0x798A,\n    0x799D, 0x79A7, 0x9F4B, 0x79AA, 0x79AE, 0x79B3, 0x79B9, 0x79BA,\n    0x79C9, 0x79D5, 0x79E7, 0x79EC, 0x79E1, 0x79E3, 0x7A08, 0x7A0D,\n    0x7A18, 0x7A19, 0x7A20, 0x7A1F, 0x7980, 0x7A31, 0x7A3B, 0x7A3E,\n    0x7A37, 0x7A43, 0x7A57, 0x7A49, 0x7A61, 0x7A62, 0x7A69, 0x9F9D,\n    0x7A70, 0x7A79, 0x7A7D, 0x7A88, 0x7A97, 0x7A95, 0x7A98, 0x7A96,\n    0x7AA9, 0x7AC8, 0x7AB0, 0x7AB6, 0x7AC5, 0x7AC4, 0x7ABF, 0x9083,\n    0x7AC7, 0x7ACA, 0x7ACD, 0x7ACF, 0x7AD5, 0x7AD3, 0x7AD9, 0x7ADA,\n    0x7ADD, 0x7AE1, 0x7AE2, 0x7AE6, 0x7AED, 0x7AF0, 0x7B02, 0x7B0F,\n    0x7B0A, 0x7B06, 0x7B33, 0x7B18, 0x7B19, 0x7B1E, 0x7B35, 0x7B28,\n    0x7B36, 0x7B50, 0x7B7A, 0x7B04, 0x7B4D, 0x7B0B, 0x7B4C, 0x7B45,\n    0x7B75, 0x7B65, 0x7B74, 0x7B67, 0x7B70, 0x7B71, 0x7B6C, 0x7B6E,\n    0x7B9D, 0x7B98, 0x7B9F, 0x7B8D, 0x7B9C, 0x7B9A, 0x7B8B, 0x7B92,\n    0x7B8F, 0x7B5D, 0x7B99, 0x7BCB, 0x7BC1, 0x7BCC, 0x7BCF, 0x7BB4,\n    0x7BC6, 0x7BDD, 0x7BE9, 0x7C11, 0x7C14, 0x7BE6, 0x7BE5, 0x7C60,\n    0x7C00, 0x7C07, 0x7C13, 0x7BF3, 0x7BF7, 0x7C17, 0x7C0D, 0x7BF6,\n    0x7C23, 0x7C27, 0x7C2A, 0x7C1F, 0x7C37, 0x7C2B, 0x7C3D, 0x7C4C,\n    0x7C43, 0x7C54, 0x7C4F, 0x7C40, 0x7C50, 0x7C58, 0x7C5F, 0x7C64,\n    0x7C56, 0x7C65, 0x7C6C, 0x7C75, 0x7C83, 0x7C90, 0x7CA4, 0x7CAD,\n    0x7CA2, 0x7CAB, 0x7CA1, 0x7CA8, 0x7CB3, 0x7CB2, 0x7CB1, 0x7CAE,\n    0x7CB9, 0x7CBD, 0x7CC0, 0x7CC5, 0x7CC2, 0x7CD8, 0x7CD2, 0x7CDC,\n    0x7CE2, 0x9B3B, 0x7CEF, 0x7CF2, 0x7CF4, 0x7CF6, 0x7CFA, 0x7D06,\n    0x7D02, 0x7D1C, 0x7D15, 0x7D0A, 0x7D45, 0x7D4B, 0x7D2E, 0x7D32,\n    0x7D3F, 0x7D35, 0x7D46, 0x7D73, 0x7D56, 0x7D4E, 0x7D72, 0x7D68,\n    0x7D6E, 0x7D4F, 0x7D63, 0x7D93, 0x7D89, 0x7D5B, 0x7D8F, 0x7D7D,\n    0x7D9B, 0x7DBA, 0x7DAE, 0x7DA3, 0x7DB5, 0x7DC7, 0x7DBD, 0x7DAB,\n    0x7E3D, 0x7DA2, 0x7DAF, 0x7DDC, 0x7DB8, 0x7D9F, 0x7DB0, 0x7DD8,\n    0x7DDD, 0x7DE4, 0x7DDE, 0x7DFB, 0x7DF2, 0x7DE1, 0x7E05, 0x7E0A,\n    0x7E23, 0x7E21, 0x7E12, 0x7E31, 0x7E1F, 0x7E09, 0x7E0B, 0x7E22,\n    0x7E46, 0x7E66, 0x7E3B, 0x7E35, 0x7E39, 0x7E43, 0x7E37, 0x7E32,\n    0x7E3A, 0x7E67, 0x7E5D, 0x7E56, 0x7E5E, 0x7E59, 0x7E5A, 0x7E79,\n    0x7E6A, 0x7E69, 0x7E7C, 0x7E7B, 0x7E83, 0x7DD5, 0x7E7D, 0x8FAE,\n    0x7E7F, 0x7E88, 0x7E89, 0x7E8C, 0x7E92, 0x7E90, 0x7E93, 0x7E94,\n    0x7E96, 0x7E8E, 0x7E9B, 0x7E9C, 0x7F38, 0x7F3A, 0x7F45, 0x7F4C,\n    0x7F4D, 0x7F4E, 0x7F50, 0x7F51, 0x7F55, 0x7F54, 0x7F58, 0x7F5F,\n    0x7F60, 0x7F68, 0x7F69, 0x7F67, 0x7F78, 0x7F82, 0x7F86, 0x7F83,\n    0x7F88, 0x7F87, 0x7F8C, 0x7F94, 0x7F9E, 0x7F9D, 0x7F9A, 0x7FA3,\n    0x7FAF, 0x7FB2, 0x7FB9, 0x7FAE, 0x7FB6, 0x7FB8, 0x8B71, 0x7FC5,\n    0x7FC6, 0x7FCA, 0x7FD5, 0x7FD4, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FF3,\n    0x7FF9, 0x98DC, 0x8006, 0x8004, 0x800B, 0x8012, 0x8018, 0x8019,\n    0x801C, 0x8021, 0x8028, 0x803F, 0x803B, 0x804A, 0x8046, 0x8052,\n    0x8058, 0x805A, 0x805F, 0x8062, 0x8068, 0x8073, 0x8072, 0x8070,\n    0x8076, 0x8079, 0x807D, 0x807F, 0x8084, 0x8086, 0x8085, 0x809B,\n    0x8093, 0x809A, 0x80AD, 0x5190, 0x80AC, 0x80DB, 0x80E5, 0x80D9,\n    0x80DD, 0x80C4, 0x80DA, 0x80D6, 0x8109, 0x80EF, 0x80F1, 0x811B,\n    0x8129, 0x8123, 0x812F, 0x814B, 0x968B, 0x8146, 0x813E, 0x8153,\n    0x8151, 0x80FC, 0x8171, 0x816E, 0x8165, 0x8166, 0x8174, 0x8183,\n    0x8188, 0x818A, 0x8180, 0x8182, 0x81A0, 0x8195, 0x81A4, 0x81A3,\n    0x815F, 0x8193, 0x81A9, 0x81B0, 0x81B5, 0x81BE, 0x81B8, 0x81BD,\n    0x81C0, 0x81C2, 0x81BA, 0x81C9, 0x81CD, 0x81D1, 0x81D9, 0x81D8,\n    0x81C8, 0x81DA, 0x81DF, 0x81E0, 0x81E7, 0x81FA, 0x81FB, 0x81FE,\n    0x8201, 0x8202, 0x8205, 0x8207, 0x820A, 0x820D, 0x8210, 0x8216,\n    0x8229, 0x822B, 0x8238, 0x8233, 0x8240, 0x8259, 0x8258, 0x825D,\n    0x825A, 0x825F, 0x8264, 0x8262, 0x8268, 0x826A, 0x826B, 0x822E,\n    0x8271, 0x8277, 0x8278, 0x827E, 0x828D, 0x8292, 0x82AB, 0x829F,\n    0x82BB, 0x82AC, 0x82E1, 0x82E3, 0x82DF, 0x82D2, 0x82F4, 0x82F3,\n    0x82FA, 0x8393, 0x8303, 0x82FB, 0x82F9, 0x82DE, 0x8306, 0x82DC,\n    0x8309, 0x82D9, 0x8335, 0x8334, 0x8316, 0x8332, 0x8331, 0x8340,\n    0x8339, 0x8350, 0x8345, 0x832F, 0x832B, 0x8317, 0x8318, 0x8385,\n    0x839A, 0x83AA, 0x839F, 0x83A2, 0x8396, 0x8323, 0x838E, 0x8387,\n    0x838A, 0x837C, 0x83B5, 0x8373, 0x8375, 0x83A0, 0x8389, 0x83A8,\n    0x83F4, 0x8413, 0x83EB, 0x83CE, 0x83FD, 0x8403, 0x83D8, 0x840B,\n    0x83C1, 0x83F7, 0x8407, 0x83E0, 0x83F2, 0x840D, 0x8422, 0x8420,\n    0x83BD, 0x8438, 0x8506, 0x83FB, 0x846D, 0x842A, 0x843C, 0x855A,\n    0x8484, 0x8477, 0x846B, 0x84AD, 0x846E, 0x8482, 0x8469, 0x8446,\n    0x842C, 0x846F, 0x8479, 0x8435, 0x84CA, 0x8462, 0x84B9, 0x84BF,\n    0x849F, 0x84D9, 0x84CD, 0x84BB, 0x84DA, 0x84D0, 0x84C1, 0x84C6,\n    0x84D6, 0x84A1, 0x8521, 0x84FF, 0x84F4, 0x8517, 0x8518, 0x852C,\n    0x851F, 0x8515, 0x8514, 0x84FC, 0x8540, 0x8563, 0x8558, 0x8548,\n    0x8541, 0x8602, 0x854B, 0x8555, 0x8580, 0x85A4, 0x8588, 0x8591,\n    0x858A, 0x85A8, 0x856D, 0x8594, 0x859B, 0x85EA, 0x8587, 0x859C,\n    0x8577, 0x857E, 0x8590, 0x85C9, 0x85BA, 0x85CF, 0x85B9, 0x85D0,\n    0x85D5, 0x85DD, 0x85E5, 0x85DC, 0x85F9, 0x860A, 0x8613, 0x860B,\n    0x85FE, 0x85FA, 0x8606, 0x8622, 0x861A, 0x8630, 0x863F, 0x864D,\n    0x4E55, 0x8654, 0x865F, 0x8667, 0x8671, 0x8693, 0x86A3, 0x86A9,\n    0x86AA, 0x868B, 0x868C, 0x86B6, 0x86AF, 0x86C4, 0x86C6, 0x86B0,\n    0x86C9, 0x8823, 0x86AB, 0x86D4, 0x86DE, 0x86E9, 0x86EC, 0x86DF,\n    0x86DB, 0x86EF, 0x8712, 0x8706, 0x8708, 0x8700, 0x8703, 0x86FB,\n    0x8711, 0x8709, 0x870D, 0x86F9, 0x870A, 0x8734, 0x873F, 0x8737,\n    0x873B, 0x8725, 0x8729, 0x871A, 0x8760, 0x875F, 0x8778, 0x874C,\n    0x874E, 0x8774, 0x8757, 0x8768, 0x876E, 0x8759, 0x8753, 0x8763,\n    0x876A, 0x8805, 0x87A2, 0x879F, 0x8782, 0x87AF, 0x87CB, 0x87BD,\n    0x87C0, 0x87D0, 0x96D6, 0x87AB, 0x87C4, 0x87B3, 0x87C7, 0x87C6,\n    0x87BB, 0x87EF, 0x87F2, 0x87E0, 0x880F, 0x880D, 0x87FE, 0x87F6,\n    0x87F7, 0x880E, 0x87D2, 0x8811, 0x8816, 0x8815, 0x8822, 0x8821,\n    0x8831, 0x8836, 0x8839, 0x8827, 0x883B, 0x8844, 0x8842, 0x8852,\n    0x8859, 0x885E, 0x8862, 0x886B, 0x8881, 0x887E, 0x889E, 0x8875,\n    0x887D, 0x88B5, 0x8872, 0x8882, 0x8897, 0x8892, 0x88AE, 0x8899,\n    0x88A2, 0x888D, 0x88A4, 0x88B0, 0x88BF, 0x88B1, 0x88C3, 0x88C4,\n    0x88D4, 0x88D8, 0x88D9, 0x88DD, 0x88F9, 0x8902, 0x88FC, 0x88F4,\n    0x88E8, 0x88F2, 0x8904, 0x890C, 0x890A, 0x8913, 0x8943, 0x891E,\n    0x8925, 0x892A, 0x892B, 0x8941, 0x8944, 0x893B, 0x8936, 0x8938,\n    0x894C, 0x891D, 0x8960, 0x895E, 0x8966, 0x8964, 0x896D, 0x896A,\n    0x896F, 0x8974, 0x8977, 0x897E, 0x8983, 0x8988, 0x898A, 0x8993,\n    0x8998, 0x89A1, 0x89A9, 0x89A6, 0x89AC, 0x89AF, 0x89B2, 0x89BA,\n    0x89BD, 0x89BF, 0x89C0, 0x89DA, 0x89DC, 0x89DD, 0x89E7, 0x89F4,\n    0x89F8, 0x8A03, 0x8A16, 0x8A10, 0x8A0C, 0x8A1B, 0x8A1D, 0x8A25,\n    0x8A36, 0x8A41, 0x8A5B, 0x8A52, 0x8A46, 0x8A48, 0x8A7C, 0x8A6D,\n    0x8A6C, 0x8A62, 0x8A85, 0x8A82, 0x8A84, 0x8AA8, 0x8AA1, 0x8A91,\n    0x8AA5, 0x8AA6, 0x8A9A, 0x8AA3, 0x8AC4, 0x8ACD, 0x8AC2, 0x8ADA,\n    0x8AEB, 0x8AF3, 0x8AE7, 0x8AE4, 0x8AF1, 0x8B14, 0x8AE0, 0x8AE2,\n    0x8AF7, 0x8ADE, 0x8ADB, 0x8B0C, 0x8B07, 0x8B1A, 0x8AE1, 0x8B16,\n    0x8B10, 0x8B17, 0x8B20, 0x8B33, 0x97AB, 0x8B26, 0x8B2B, 0x8B3E,\n    0x8B28, 0x8B41, 0x8B4C, 0x8B4F, 0x8B4E, 0x8B49, 0x8B56, 0x8B5B,\n    0x8B5A, 0x8B6B, 0x8B5F, 0x8B6C, 0x8B6F, 0x8B74, 0x8B7D, 0x8B80,\n    0x8B8C, 0x8B8E, 0x8B92, 0x8B93, 0x8B96, 0x8B99, 0x8B9A, 0x8C3A,\n    0x8C41, 0x8C3F, 0x8C48, 0x8C4C, 0x8C4E, 0x8C50, 0x8C55, 0x8C62,\n    0x8C6C, 0x8C78, 0x8C7A, 0x8C82, 0x8C89, 0x8C85, 0x8C8A, 0x8C8D,\n    0x8C8E, 0x8C94, 0x8C7C, 0x8C98, 0x621D, 0x8CAD, 0x8CAA, 0x8CBD,\n    0x8CB2, 0x8CB3, 0x8CAE, 0x8CB6, 0x8CC8, 0x8CC1, 0x8CE4, 0x8CE3,\n    0x8CDA, 0x8CFD, 0x8CFA, 0x8CFB, 0x8D04, 0x8D05, 0x8D0A, 0x8D07,\n    0x8D0F, 0x8D0D, 0x8D10, 0x9F4E, 0x8D13, 0x8CCD, 0x8D14, 0x8D16,\n    0x8D67, 0x8D6D, 0x8D71, 0x8D73, 0x8D81, 0x8D99, 0x8DC2, 0x8DBE,\n    0x8DBA, 0x8DCF, 0x8DDA, 0x8DD6, 0x8DCC, 0x8DDB, 0x8DCB, 0x8DEA,\n    0x8DEB, 0x8DDF, 0x8DE3, 0x8DFC, 0x8E08, 0x8E09, 0x8DFF, 0x8E1D,\n    0x8E1E, 0x8E10, 0x8E1F, 0x8E42, 0x8E35, 0x8E30, 0x8E34, 0x8E4A,\n    0x8E47, 0x8E49, 0x8E4C, 0x8E50, 0x8E48, 0x8E59, 0x8E64, 0x8E60,\n    0x8E2A, 0x8E63, 0x8E55, 0x8E76, 0x8E72, 0x8E7C, 0x8E81, 0x8E87,\n    0x8E85, 0x8E84, 0x8E8B, 0x8E8A, 0x8E93, 0x8E91, 0x8E94, 0x8E99,\n    0x8EAA, 0x8EA1, 0x8EAC, 0x8EB0, 0x8EC6, 0x8EB1, 0x8EBE, 0x8EC5,\n    0x8EC8, 0x8ECB, 0x8EDB, 0x8EE3, 0x8EFC, 0x8EFB, 0x8EEB, 0x8EFE,\n    0x8F0A, 0x8F05, 0x8F15, 0x8F12, 0x8F19, 0x8F13, 0x8F1C, 0x8F1F,\n    0x8F1B, 0x8F0C, 0x8F26, 0x8F33, 0x8F3B, 0x8F39, 0x8F45, 0x8F42,\n    0x8F3E, 0x8F4C, 0x8F49, 0x8F46, 0x8F4E, 0x8F57, 0x8F5C, 0x8F62,\n    0x8F63, 0x8F64, 0x8F9C, 0x8F9F, 0x8FA3, 0x8FAD, 0x8FAF, 0x8FB7,\n    0x8FDA, 0x8FE5, 0x8FE2, 0x8FEA, 0x8FEF, 0x9087, 0x8FF4, 0x9005,\n    0x8FF9, 0x8FFA, 0x9011, 0x9015, 0x9021, 0x900D, 0x901E, 0x9016,\n    0x900B, 0x9027, 0x9036, 0x9035, 0x9039, 0x8FF8, 0x904F, 0x9050,\n    0x9051, 0x9052, 0x900E, 0x9049, 0x903E, 0x9056, 0x9058, 0x905E,\n    0x9068, 0x906F, 0x9076, 0x96A8, 0x9072, 0x9082, 0x907D, 0x9081,\n    0x9080, 0x908A, 0x9089, 0x908F, 0x90A8, 0x90AF, 0x90B1, 0x90B5,\n    0x90E2, 0x90E4, 0x6248, 0x90DB, 0x9102, 0x9112, 0x9119, 0x9132,\n    0x9130, 0x914A, 0x9156, 0x9158, 0x9163, 0x9165, 0x9169, 0x9173,\n    0x9172, 0x918B, 0x9189, 0x9182, 0x91A2, 0x91AB, 0x91AF, 0x91AA,\n    0x91B5, 0x91B4, 0x91BA, 0x91C0, 0x91C1, 0x91C9, 0x91CB, 0x91D0,\n    0x91D6, 0x91DF, 0x91E1, 0x91DB, 0x91FC, 0x91F5, 0x91F6, 0x921E,\n    0x91FF, 0x9214, 0x922C, 0x9215, 0x9211, 0x925E, 0x9257, 0x9245,\n    0x9249, 0x9264, 0x9248, 0x9295, 0x923F, 0x924B, 0x9250, 0x929C,\n    0x9296, 0x9293, 0x929B, 0x925A, 0x92CF, 0x92B9, 0x92B7, 0x92E9,\n    0x930F, 0x92FA, 0x9344, 0x932E, 0x9319, 0x9322, 0x931A, 0x9323,\n    0x933A, 0x9335, 0x933B, 0x935C, 0x9360, 0x937C, 0x936E, 0x9356,\n    0x93B0, 0x93AC, 0x93AD, 0x9394, 0x93B9, 0x93D6, 0x93D7, 0x93E8,\n    0x93E5, 0x93D8, 0x93C3, 0x93DD, 0x93D0, 0x93C8, 0x93E4, 0x941A,\n    0x9414, 0x9413, 0x9403, 0x9407, 0x9410, 0x9436, 0x942B, 0x9435,\n    0x9421, 0x943A, 0x9441, 0x9452, 0x9444, 0x945B, 0x9460, 0x9462,\n    0x945E, 0x946A, 0x9229, 0x9470, 0x9475, 0x9477, 0x947D, 0x945A,\n    0x947C, 0x947E, 0x9481, 0x947F, 0x9582, 0x9587, 0x958A, 0x9594,\n    0x9596, 0x9598, 0x9599, 0x95A0, 0x95A8, 0x95A7, 0x95AD, 0x95BC,\n    0x95BB, 0x95B9, 0x95BE, 0x95CA, 0x6FF6, 0x95C3, 0x95CD, 0x95CC,\n    0x95D5, 0x95D4, 0x95D6, 0x95DC, 0x95E1, 0x95E5, 0x95E2, 0x9621,\n    0x9628, 0x962E, 0x962F, 0x9642, 0x964C, 0x964F, 0x964B, 0x9677,\n    0x965C, 0x965E, 0x965D, 0x965F, 0x9666, 0x9672, 0x966C, 0x968D,\n    0x9698, 0x9695, 0x9697, 0x96AA, 0x96A7, 0x96B1, 0x96B2, 0x96B0,\n    0x96B4, 0x96B6, 0x96B8, 0x96B9, 0x96CE, 0x96CB, 0x96C9, 0x96CD,\n    0x894D, 0x96DC, 0x970D, 0x96D5, 0x96F9, 0x9704, 0x9706, 0x9708,\n    0x9713, 0x970E, 0x9711, 0x970F, 0x9716, 0x9719, 0x9724, 0x972A,\n    0x9730, 0x9739, 0x973D, 0x973E, 0x9744, 0x9746, 0x9748, 0x9742,\n    0x9749, 0x975C, 0x9760, 0x9764, 0x9766, 0x9768, 0x52D2, 0x976B,\n    0x9771, 0x9779, 0x9785, 0x977C, 0x9781, 0x977A, 0x9786, 0x978B,\n    0x978F, 0x9790, 0x979C, 0x97A8, 0x97A6, 0x97A3, 0x97B3, 0x97B4,\n    0x97C3, 0x97C6, 0x97C8, 0x97CB, 0x97DC, 0x97ED, 0x9F4F, 0x97F2,\n    0x7ADF, 0x97F6, 0x97F5, 0x980F, 0x980C, 0x9838, 0x9824, 0x9821,\n    0x9837, 0x983D, 0x9846, 0x984F, 0x984B, 0x986B, 0x986F, 0x9870,\n    0x9871, 0x9874, 0x9873, 0x98AA, 0x98AF, 0x98B1, 0x98B6, 0x98C4,\n    0x98C3, 0x98C6, 0x98E9, 0x98EB, 0x9903, 0x9909, 0x9912, 0x9914,\n    0x9918, 0x9921, 0x991D, 0x991E, 0x9924, 0x9920, 0x992C, 0x992E,\n    0x993D, 0x993E, 0x9942, 0x9949, 0x9945, 0x9950, 0x994B, 0x9951,\n    0x9952, 0x994C, 0x9955, 0x9997, 0x9998, 0x99A5, 0x99AD, 0x99AE,\n    0x99BC, 0x99DF, 0x99DB, 0x99DD, 0x99D8, 0x99D1, 0x99ED, 0x99EE,\n    0x99F1, 0x99F2, 0x99FB, 0x99F8, 0x9A01, 0x9A0F, 0x9A05, 0x99E2,\n    0x9A19, 0x9A2B, 0x9A37, 0x9A45, 0x9A42, 0x9A40, 0x9A43, 0x9A3E,\n    0x9A55, 0x9A4D, 0x9A5B, 0x9A57, 0x9A5F, 0x9A62, 0x9A65, 0x9A64,\n    0x9A69, 0x9A6B, 0x9A6A, 0x9AAD, 0x9AB0, 0x9ABC, 0x9AC0, 0x9ACF,\n    0x9AD1, 0x9AD3, 0x9AD4, 0x9ADE, 0x9ADF, 0x9AE2, 0x9AE3, 0x9AE6,\n    0x9AEF, 0x9AEB, 0x9AEE, 0x9AF4, 0x9AF1, 0x9AF7, 0x9AFB, 0x9B06,\n    0x9B18, 0x9B1A, 0x9B1F, 0x9B22, 0x9B23, 0x9B25, 0x9B27, 0x9B28,\n    0x9B29, 0x9B2A, 0x9B2E, 0x9B2F, 0x9B32, 0x9B44, 0x9B43, 0x9B4F,\n    0x9B4D, 0x9B4E, 0x9B51, 0x9B58, 0x9B74, 0x9B93, 0x9B83, 0x9B91,\n    0x9B96, 0x9B97, 0x9B9F, 0x9BA0, 0x9BA8, 0x9BB4, 0x9BC0, 0x9BCA,\n    0x9BB9, 0x9BC6, 0x9BCF, 0x9BD1, 0x9BD2, 0x9BE3, 0x9BE2, 0x9BE4,\n    0x9BD4, 0x9BE1, 0x9C3A, 0x9BF2, 0x9BF1, 0x9BF0, 0x9C15, 0x9C14,\n    0x9C09, 0x9C13, 0x9C0C, 0x9C06, 0x9C08, 0x9C12, 0x9C0A, 0x9C04,\n    0x9C2E, 0x9C1B, 0x9C25, 0x9C24, 0x9C21, 0x9C30, 0x9C47, 0x9C32,\n    0x9C46, 0x9C3E, 0x9C5A, 0x9C60, 0x9C67, 0x9C76, 0x9C78, 0x9CE7,\n    0x9CEC, 0x9CF0, 0x9D09, 0x9D08, 0x9CEB, 0x9D03, 0x9D06, 0x9D2A,\n    0x9D26, 0x9DAF, 0x9D23, 0x9D1F, 0x9D44, 0x9D15, 0x9D12, 0x9D41,\n    0x9D3F, 0x9D3E, 0x9D46, 0x9D48, 0x9D5D, 0x9D5E, 0x9D64, 0x9D51,\n    0x9D50, 0x9D59, 0x9D72, 0x9D89, 0x9D87, 0x9DAB, 0x9D6F, 0x9D7A,\n    0x9D9A, 0x9DA4, 0x9DA9, 0x9DB2, 0x9DC4, 0x9DC1, 0x9DBB, 0x9DB8,\n    0x9DBA, 0x9DC6, 0x9DCF, 0x9DC2, 0x9DD9, 0x9DD3, 0x9DF8, 0x9DE6,\n    0x9DED, 0x9DEF, 0x9DFD, 0x9E1A, 0x9E1B, 0x9E1E, 0x9E75, 0x9E79,\n    0x9E7D, 0x9E81, 0x9E88, 0x9E8B, 0x9E8C, 0x9E92, 0x9E95, 0x9E91,\n    0x9E9D, 0x9EA5, 0x9EA9, 0x9EB8, 0x9EAA, 0x9EAD, 0x9761, 0x9ECC,\n    0x9ECE, 0x9ECF, 0x9ED0, 0x9ED4, 0x9EDC, 0x9EDE, 0x9EDD, 0x9EE0,\n    0x9EE5, 0x9EE8, 0x9EEF, 0x9EF4, 0x9EF6, 0x9EF7, 0x9EF9, 0x9EFB,\n    0x9EFC, 0x9EFD, 0x9F07, 0x9F08, 0x76B7, 0x9F15, 0x9F21, 0x9F2C,\n    0x9F3E, 0x9F4A, 0x9F52, 0x9F54, 0x9F63, 0x9F5F, 0x9F60, 0x9F61,\n    0x9F66, 0x9F67, 0x9F6C, 0x9F6A, 0x9F77, 0x9F72, 0x9F76, 0x9F95,\n    0x9F9C, 0x9FA0, 0x582F, 0x69C7, 0x9059, 0x7464, 0x2642, 0x2500,\n    0x2501, 0x2502, 0x2503, 0x2504, 0x2505, 0x2506, 0x2507, 0x2508,\n    0x2509, 0x250A, 0x250B, 0x250C, 0x250D, 0x250E, 0x250F, 0x2510,\n    0x2511, 0x2512, 0x2513, 0x2514, 0x2515, 0x2516, 0x2517, 0x2518,\n    0x2519, 0x251A, 0x251B, 0x251C, 0x251D, 0x251E, 0x251F, 0x2520,\n    0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528,\n    0x2529, 0x252A, 0x252B, 0x252C, 0x252D, 0x252E, 0x252F, 0x2530,\n    0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538,\n    0x2539, 0x253A, 0x253B, 0x253C, 0x253D, 0x253E, 0x253F, 0x2540,\n    0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548,\n    0x2549, 0x254A, 0x254B, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464,\n    0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246A, 0x246B, 0x246C,\n    0x246D, 0x246E, 0x246F, 0x2470, 0x2471, 0x2472, 0x2473, 0x2160,\n    0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168,\n    0x2169, 0x3349, 0x3314, 0x3322, 0x334D, 0x3318, 0x3327, 0x3303,\n    0x3336, 0x3351, 0x3357, 0x330D, 0x3326, 0x3323, 0x332B, 0x334A,\n    0x333B, 0x339C, 0x339D, 0x339E, 0x338E, 0x338F, 0x33C4, 0x33A1,\n    0x301D, 0x301F, 0x2116, 0x33CD, 0x2121, 0x32A4, 0x32A5, 0x32A6,\n    0x32A7, 0x32A8, 0x3231, 0x3232, 0x3239, 0x337E, 0x337D, 0x337C,\n    0x222E, 0x2211, 0x221A, 0x22A5, 0x2220, 0x221F, 0x22BF, 0x2229,\n    0x222A, 0x555E, 0x98F4, 0x6EA2, 0x9C2F, 0x6DEB, 0x8FC2, 0x6B1D,\n    0x53A9, 0x958F, 0x5642, 0x990C, 0x7130, 0x8956, 0x9DD7, 0x8FE6,\n    0x6062, 0x62D0, 0x6666, 0x559D, 0x845B, 0x9784, 0x5699, 0x6F97,\n    0x7FF0, 0x7FEB, 0x5FBD, 0x7947, 0x4FE0, 0x537F, 0x50C5, 0x8EC0,\n    0x55B0, 0x6ADB, 0x5C51, 0x9774, 0x7941, 0x6167, 0x7A3D, 0x7E6B,\n    0x834A, 0x9699, 0x5026, 0x5ACC, 0x6372, 0x9E7C, 0x8AFA, 0x5DF7,\n    0x663B, 0x6E9D, 0x9EB4, 0x9D60, 0x7511, 0x91C7, 0x698A, 0x6805,\n    0x85A9, 0x9BD6, 0x9306, 0x73CA, 0x53F1, 0x5C62, 0x906E, 0x6753,\n    0x707C, 0x7E61, 0x914B, 0x66D9, 0x6E1A, 0x85AF, 0x85F7, 0x54E8,\n    0x5EE0, 0x68A2, 0x8523, 0x91AC, 0x9798, 0x8755, 0x9771, 0x9017,\n    0x7FE0, 0x647A, 0x901D, 0x87EC, 0x64B0, 0x6813, 0x714E, 0x717D,\n    0x8A6E, 0x564C, 0x9061, 0x5275, 0x6414, 0x7626, 0x905C, 0x9A52,\n    0x817F, 0x9EDB, 0x5544, 0x6FEF, 0x7422, 0x86F8, 0x5DFD, 0x8FBF,\n    0x68DA, 0x9C48, 0x6A3D, 0x7C1E, 0x8A3B, 0x7026, 0x51CB, 0x6357,\n    0x69CC, 0x939A, 0x585A, 0x6451, 0x912D, 0x64E2, 0x6EBA, 0x5861,\n    0x985A, 0x5835, 0x5C60, 0x83DF, 0x8CED, 0x5858, 0x79B1, 0x9D07,\n    0x7006, 0x701E, 0x5678, 0x9041, 0x9813, 0x90A3, 0x8B0E, 0x7058,\n    0x6962, 0x79B0, 0x56CA, 0x724C, 0x9019, 0x79E4, 0x525D, 0x7BB8,\n    0x6F51, 0x91B1, 0x633D, 0x6249, 0x6A0B, 0x67CA, 0x7A17, 0x903C,\n    0x5A9B, 0x8B2C, 0x5EDF, 0x7015, 0x983B, 0x853D, 0x77A5, 0x5A29,\n    0x5E96, 0x6CE1, 0x84EC, 0x9830, 0x9C52, 0x9EB5, 0x5132, 0x9905,\n    0x7C7E, 0x9453, 0x6108, 0x7652, 0x7337, 0x7194, 0x8000, 0x840A,\n    0x907C, 0x6F23, 0x7149, 0x84EE, 0x6994, 0x881F, 0x5154, 0x5189,\n    0x5195, 0x51A4, 0x5539, 0x5533, 0x55E4, 0x5632, 0x56A5, 0x580B,\n    0x5ABE, 0x5BC3, 0x5C5B, 0x5E64, 0x6097, 0x6369, 0x6406, 0x6522,\n    0x6583, 0x67A6, 0x67B4, 0x689B, 0x688E, 0x6E6E, 0x71D7, 0x7228,\n    0x73CE, 0x7504, 0x750D, 0x7515, 0x7693, 0x787C, 0x7A31, 0x9F9D,\n    0x7B99, 0x7C90, 0x7CAE, 0x7D9B, 0x7DAE, 0x7D9F, 0x7FD4, 0x822E,\n    0x828D, 0x82D2, 0x8323, 0x8375, 0x8517, 0x853E, 0x8782, 0x87D2,\n    0x890A, 0x89AF, 0x8ADE, 0x8B41, 0x8DDA, 0x8E09, 0x8F13, 0x8FEA,\n    0x8FE9, 0x9058, 0x6248, 0x91C1, 0x95BB, 0x7762, 0x9724, 0x9760,\n    0x976D, 0x9824, 0x9B2E, 0x9B97, 0x9BF2, 0x9EAA, 0x9F9C, 0x3001,\n    0x3002, 0x203E, 0xFF3F, 0x30FC, 0x2015, 0x2010, 0x301C, 0x2016,\n    0xFF5C, 0x2026, 0x2025, 0xFF08, 0xFF09, 0x3014, 0x3015, 0xFF3B,\n    0xFF3D, 0xFF5B, 0xFF5D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C,\n    0x300D, 0x300E, 0x300F, 0x3010, 0x3011, 0xFF1D, 0x3041, 0x3043,\n    0x3045, 0x3047, 0x3049, 0x3063, 0x3083, 0x3085, 0x3087, 0x308E,\n    0x30A1, 0x30A3, 0x30A5, 0x30A7, 0x30A9, 0x30C3, 0x30E3, 0x30E5,\n    0x30E7, 0x30EE, 0x30F5, 0x30F6, 0x3349, 0x3314, 0x3322, 0x334D,\n    0x3318, 0x3327, 0x3303, 0x3336, 0x3351, 0x3357, 0x330D, 0x3326,\n    0x3323, 0x332B, 0x334A, 0x333B, 0x301D, 0x301E, 0x3094, 0x304B,\n    0x3051, 0x82A6, 0x8328, 0x5653, 0x53A9, 0x7259, 0x6C72, 0x7B08,\n    0x9957, 0x62F3, 0x9910, 0x976D, 0x717D, 0x7A7F, 0x7BAD, 0x63C3,\n    0x83DF, 0x7962, 0x53DB, 0x7BC7, 0x8FC4, 0x7C3E, 0x50CA, 0x5315,\n    0x55A9, 0x56AE, 0x5819, 0x591B, 0x5C28, 0x5ED0, 0x5ECF, 0x6241,\n    0x66C1, 0x6C08, 0x6E23, 0x6EEC, 0x7A97, 0x7BDD, 0x7FE9, 0x8422,\n    0x8759, 0x880E, 0x87D2, 0x9A19, 0x9EAD, 0xFFE4, 0xFF07, 0xFF02,\n    0x11A8, 0x25C1, 0x25B7, 0x21E9, 0x21E7, 0x21E6, 0x21E8, 0x25A2,\n    0x2667, 0x2661, 0x2664, 0x2662, 0x33A0, 0x33A2, 0x33A4, 0x33A5,\n    0x3397, 0x2113, 0x3398, 0x33B3, 0x33B2, 0x33B1, 0x33B0, 0x3385,\n    0x3386, 0x3387, 0x33CB, 0x3390, 0x33D4, 0x3396, 0x3322, 0x3316,\n    0x3318, 0x3315, 0x3303, 0x3323, 0x3357, 0x3342, 0x3339, 0x333B,\n    0x3300, 0x3331, 0x3347, 0x331E, 0x332A, 0x33CD, 0x337F, 0x2121,\n    0x260E, 0x3036, 0x3020, 0x00A9, 0x00AE, 0x0000, 0x2488, 0x2489,\n    0x248A, 0x248B, 0x248C, 0x248D, 0x248E, 0x248F, 0x2490, 0x2474,\n    0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, 0x247C,\n    0x247D, 0x247E, 0x247F, 0x2480, 0x2481, 0x2482, 0x2483, 0x2484,\n    0x2485, 0x2486, 0x2487, 0x3251, 0x2170, 0x2171, 0x2172, 0x2173,\n    0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x3252, 0x3253,\n    0x3254, 0x3255, 0x3256, 0x3257, 0x3258, 0x3259, 0x325A, 0x325B,\n    0x249C, 0x249D, 0x249E, 0x249F, 0x24A0, 0x24A1, 0x24A2, 0x24A3,\n    0x24A4, 0x24A5, 0x24A6, 0x24A7, 0x24A8, 0x24A9, 0x24AA, 0x24AB,\n    0x24AC, 0x24AD, 0x24AE, 0x24AF, 0x24B0, 0x24B1, 0x24B2, 0x24B3,\n    0x24B4, 0x24B5, 0x3243, 0x323D, 0x323F, 0x3234, 0x3238, 0x3233,\n    0x323C, 0x3242, 0x323E, 0x3236, 0x3235, 0x323B, 0x3240, 0x323A,\n    0x32B0, 0x32AD, 0x32A9, 0x32AF, 0x3294, 0x32AA, 0x3298, 0x32AB,\n    0x3292, 0x3291, 0x3293, 0x32AC, 0x32AE, 0x3296, 0x23A9, 0x23A8,\n    0x23A7, 0xFE38, 0x23AD, 0x23AC, 0x23AB, 0xFE38, 0x23AB, 0x23AC,\n    0x23AD, 0xFE38, 0x23A7, 0x23A8, 0x23A9, 0xFE38, 0x33CC, 0x3305,\n    0x00BD, 0x00BC, 0x339F, 0x33A3, 0x33A6, 0xFFFD, 0xFFFD, 0x329E,\n    0x3388, 0x3389, 0x33C8, 0x222D, 0x5370, 0x3230, 0x322A, 0x322B,\n    0x322C, 0x322D, 0x322E, 0x322F, 0x3237, 0x3241, 0x27A1, 0x21E6,\n    0x21E7, 0x21E9, 0x25C9, 0x2660, 0x2665, 0x2663, 0x2666, 0x2600,\n    0x2601, 0x2602, 0x2603, 0x261E, 0x261C, 0x261D, 0x261F, 0x3299,\n    0x24EA, 0x216A, 0x216B, 0xFF10, 0xFF10, 0x3000, 0x2581, 0x2582,\n    0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0x2588, 0x258F, 0x258E,\n    0x258D, 0x258C, 0x258B, 0x258A, 0x2589, 0x2594, 0x2595, 0x256D,\n    0x256E, 0x2570, 0x256F, 0x2550, 0x255E, 0x256A, 0x2561, 0x25E2,\n    0x25E3, 0x25E5, 0x25E4, 0x25CF, 0x0ED0, 0x2571, 0x2572, 0x2573,\n    0x304B, 0x3051, 0x9022, 0x8FBB, 0xFF0C, 0x00B0, 0x3013, 0x309C,\n    0x309B, 0x02CF, 0xFF0E, 0x2018, 0x2019, 0x201C, 0x201D, 0x201C,\n    0x201E, 0x2018, 0x201A, 0x02BA, 0x51DC, 0x7199, 0x2776, 0x2777,\n    0x2778, 0x2779, 0x277A, 0x277B, 0x277C, 0x277D, 0x277E, 0x0000,\n    0x0000, 0x0000, 0x217A, 0x217B, 0x0000, 0x0000, 0x0000, 0x217F,\n    0x210A, 0x2109, 0x0000, 0x0000, 0x3004, 0x21C6, 0x21C4, 0x21C5,\n    0x0000, 0x30F7, 0x30F8, 0x30F9, 0x30FA, 0x5927, 0x5C0F, 0x329D,\n    0x63A7, 0x0000, 0x0000, 0x337B, 0x337F, 0x0000, 0x0000, 0x3333,\n    0x334E, 0x3322, 0x3316, 0x3305, 0x3305, 0x3305, 0x3333, 0x334E,\n    0x334E, 0x334E, 0x3303, 0x3318, 0x3315, 0x3339, 0x3339, 0x3339,\n    0x3357, 0x3342, 0x3342, 0x3342, 0x3323, 0x333B, 0x3300, 0x331E,\n    0x331E, 0x331E, 0x332A, 0x332A, 0x332A, 0x3347, 0x3331, 0x7E8A,\n    0x891C, 0x9348, 0x9288, 0x84DC, 0x4FC9, 0x70BB, 0x6631, 0x68C8,\n    0x92F9, 0x66FB, 0x5F45, 0x4E28, 0x4EE1, 0x4EFC, 0x4F00, 0x4F03,\n    0x4F39, 0x4F56, 0x4F92, 0x4F8A, 0x4F9A, 0x4F94, 0x4FCD, 0x5040,\n    0x5022, 0x4FFF, 0x501E, 0x5046, 0x5070, 0x5042, 0x5094, 0x50F4,\n    0x50D8, 0x514A, 0x5164, 0x519D, 0x51BE, 0x51EC, 0x5215, 0x529C,\n    0x52A6, 0x52C0, 0x52DB, 0x5300, 0x5307, 0x5324, 0x5372, 0x5393,\n    0x53B2, 0x53DD, 0xFA0E, 0x549C, 0x548A, 0x54A9, 0x54FF, 0x5586,\n    0x5759, 0x5765, 0x57AC, 0x57C8, 0x57C7, 0xFA0F, 0xFA10, 0x589E,\n    0x58B2, 0x590B, 0x5953, 0x595B, 0x595D, 0x5963, 0x59A4, 0x59BA,\n    0x5B56, 0x5BC0, 0x752F, 0x5BD8, 0x5BEC, 0x5C1E, 0x5CA6, 0x5CBA,\n    0x5CF5, 0x5D27, 0x5D53, 0xFA11, 0x5D42, 0x5D6D, 0x5DB8, 0x5DB9,\n    0x5DD0, 0x5F21, 0x5F34, 0x5F67, 0x5FB7, 0x5FDE, 0x605D, 0x6085,\n    0x608A, 0x60DE, 0x60D5, 0x6120, 0x60F2, 0x6111, 0x6137, 0x6130,\n    0x6198, 0x6213, 0x62A6, 0x63F5, 0x6460, 0x649D, 0x64CE, 0x654E,\n    0x6600, 0x6615, 0x6609, 0x662E, 0x661E, 0x6624, 0x6665, 0x6657,\n    0x6659, 0xFA12, 0x6673, 0x6699, 0x66A0, 0x66B2, 0x66BF, 0x66FA,\n    0x670E, 0xF929, 0x6766, 0x67BB, 0x6852, 0x67C0, 0x6801, 0x6844,\n    0x68CF, 0xFA13, 0x6968, 0xFA14, 0x6998, 0x69E2, 0x6A30, 0x6A6B,\n    0x6A46, 0x6A73, 0x6A7E, 0x6AE2, 0x6AE4, 0x6BD6, 0x6C3F, 0x6C5C,\n    0x6C86, 0x6C6F, 0x6CDA, 0x6D04, 0x6D87, 0x6D6F, 0x6D96, 0x6DAC,\n    0x6DCF, 0x6DF8, 0x6DF2, 0x6DFC, 0x6E39, 0x6E5C, 0x6E27, 0x6E3C,\n    0x6EBF, 0x6F88, 0x6FB5, 0x6FF5, 0x7005, 0x7007, 0x7028, 0x7085,\n    0x70AB, 0x710F, 0x7104, 0x715C, 0x7146, 0x7147, 0xFA15, 0x71C1,\n    0x71FE, 0x72B1, 0x72BE, 0x7324, 0xFA16, 0x7377, 0x73BD, 0x73C9,\n    0x73D6, 0x73E3, 0x73D2, 0x7407, 0x73F5, 0x7426, 0x742A, 0x7429,\n    0x742E, 0x7462, 0x7489, 0x749F, 0x7501, 0x756F, 0x7682, 0x769C,\n    0x769E, 0x769B, 0x76A6, 0xFA17, 0x7746, 0x52AF, 0x7821, 0x784E,\n    0x7864, 0x787A, 0x7930, 0xFA18, 0xFA19, 0xFA1A, 0x7994, 0xFA1B,\n    0x799B, 0x7AD1, 0x7AE7, 0xFA1C, 0x7AEB, 0x7B9E, 0xFA1D, 0x7D48,\n    0x7D5C, 0x7DB7, 0x7DA0, 0x7DD6, 0x7E52, 0x7F47, 0x7FA1, 0xFA1E,\n    0x8301, 0x8362, 0x837F, 0x83C7, 0x83F6, 0x8448, 0x84B4, 0x8553,\n    0x8559, 0x856B, 0xFA1F, 0x85B0, 0xFA20, 0xFA21, 0x8807, 0x88F5,\n    0x8A12, 0x8A37, 0x8A79, 0x8AA7, 0x8ABE, 0x8ADF, 0xFA22, 0x8AF6,\n    0x8B53, 0x8B7F, 0x8CF0, 0x8CF4, 0x8D12, 0x8D76, 0xFA23, 0x8ECF,\n    0xFA24, 0xFA25, 0x9067, 0x90DE, 0xFA26, 0x9115, 0x9127, 0x91DA,\n    0x91D7, 0x91DE, 0x91ED, 0x91EE, 0x91E4, 0x91E5, 0x9206, 0x9210,\n    0x920A, 0x923A, 0x9240, 0x923C, 0x924E, 0x9259, 0x9251, 0x9239,\n    0x9267, 0x92A7, 0x9277, 0x9278, 0x92E7, 0x92D7, 0x92D9, 0x92D0,\n    0xFA27, 0x92D5, 0x92E0, 0x92D3, 0x9325, 0x9321, 0x92FB, 0xFA28,\n    0x931E, 0x92FF, 0x931D, 0x9302, 0x9370, 0x9357, 0x93A4, 0x93C6,\n    0x93DE, 0x93F8, 0x9431, 0x9445, 0x9448, 0x9592, 0xF9DC, 0xFA29,\n    0x969D, 0x96AF, 0x9733, 0x973B, 0x9743, 0x974D, 0x974F, 0x9751,\n    0x9755, 0x9857, 0x9865, 0xFA2A, 0xFA2B, 0x9927, 0xFA2C, 0x999E,\n    0x9A4E, 0x9AD9, 0x9ADC, 0x9B75, 0x9B72, 0x9B8F, 0x9BB1, 0x9BBB,\n    0x9C00, 0x9D70, 0x9D6B, 0xFA2D, 0x9E19, 0x9ED1, 0x00AC, 0x005C,\n    0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,\n    0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,\n    0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,\n    0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,\n    0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,\n    0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,\n    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,\n    0x0058, 0x0059, 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E, 0x005F,\n    0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,\n    0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,\n    0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,\n    0x0078, 0x0079, 0x007A, 0x007B, 0x00A6, 0x007D, 0x0303, 0x02BC,\n    0x005C, 0x02BB, 0x007C, 0x007E, 0x00A1, 0x00A2, 0x00A3, 0x2044,\n    0x0192, 0x00A7, 0x00A4, 0x201C, 0x00AB, 0x2039, 0x203A, 0xFB01,\n    0xFB02, 0x2012, 0x2020, 0x2021, 0x00B7, 0x00B6, 0x2022, 0x201A,\n    0x201E, 0x201D, 0x00BB, 0x2026, 0x2030, 0x00BF, 0x0301, 0x0302,\n    0x00AF, 0x0306, 0x0307, 0x0308, 0x030A, 0x00B8, 0x030B, 0x0328,\n    0x030C, 0x0336, 0x00C6, 0x00AA, 0x0141, 0x00D8, 0x0152, 0x00BA,\n    0x00E6, 0x0131, 0x0142, 0x00F8, 0x0153, 0x00DF, 0x002D, 0x00A9,\n    0x00AC, 0x00AE, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B5, 0x00B9,\n    0x00BC, 0x00BD, 0x00BE, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4,\n    0x00C5, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD,\n    0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5,\n    0x00D6, 0x00D7, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE,\n    0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E7, 0x00E8,\n    0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0,\n    0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F9,\n    0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, 0x0160, 0x0178,\n    0x017D, 0x0305, 0x0161, 0x2122, 0x017E, 0x0030, 0x2002, 0x0021,\n    0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029,\n    0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031,\n    0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,\n    0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041,\n    0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049,\n    0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,\n    0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,\n    0x005A, 0x005B, 0x00A5, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061,\n    0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069,\n    0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071,\n    0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079,\n    0x007A, 0x007B, 0x007C, 0x007D, 0x203E, 0xFF40, 0x2032, 0x00A8,\n    0x2036, 0x00C4, 0x00F9, 0x00E9, 0x00ED, 0x00DF, 0x00E7, 0x00C7,\n    0x00D1, 0x00F1, 0x00A2, 0x00A3, 0x00F3, 0x00FA, 0x00A1, 0x00BF,\n    0x00BD, 0x00D6, 0x00DC, 0x00E4, 0x00EB, 0x00EF, 0x00F6, 0x00DC,\n    0x00E2, 0x00EA, 0x00EE, 0x00F4, 0x00FC, 0x00E0, 0x00E9, 0x00E1,\n    0x007E, 0x0030, 0x00AC, 0x005C, 0xFF60, 0xFF61, 0xFF62, 0xFF63,\n    0xFF64, 0xFF65, 0xFF66, 0xFF67, 0xFF68, 0xFF69, 0xFF6A, 0xFF6B,\n    0xFF6C, 0xFF6D, 0xFF6E, 0xFF6F, 0xFF70, 0xFF71, 0xFF72, 0xFF73,\n    0xFF74, 0xFF75, 0xFF76, 0xFF77, 0xFF78, 0xFF79, 0xFF7A, 0xFF7B,\n    0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, 0xFF80, 0xFF81, 0xFF82, 0xFF83,\n    0xFF84, 0xFF85, 0xFF86, 0xFF87, 0xFF88, 0xFF89, 0xFF8A, 0xFF8B,\n    0xFF8C, 0xFF8D, 0xFF8E, 0xFF8F, 0xFF90, 0xFF91, 0xFF92, 0xFF93,\n    0xFF94, 0xFF95, 0xFF96, 0xFF97, 0xFF98, 0xFF99, 0xFF9A, 0xFF9B,\n    0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F, 0x30F0, 0x30F1, 0x30EE, 0x30AB,\n    0x30B1, 0x30F4, 0x30AC, 0x30AE, 0x30B0, 0x30B2, 0x30B4, 0x30B6,\n    0x30B8, 0x30BA, 0x30BC, 0x30BE, 0x30C0, 0x30C2, 0x30C5, 0x30C7,\n    0x30C9, 0x30D0, 0x30D1, 0x30D3, 0x30D4, 0x30D6, 0x30D7, 0x30D9,\n    0x30DA, 0x30DC, 0x30DD, 0xFF60, 0x3092, 0x3041, 0x3043, 0x3045,\n    0x3047, 0x3049, 0x3083, 0x3085, 0x3087, 0x3063, 0x3042, 0x3044,\n    0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053,\n    0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064,\n    0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,\n    0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081,\n    0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C,\n    0x308D, 0x308F, 0x3093, 0x3090, 0x3091, 0x308E, 0x304C, 0x304E,\n    0x3050, 0x3052, 0x3054, 0x3056, 0x3068, 0x305A, 0x305C, 0x305E,\n    0x3060, 0x3062, 0x3065, 0x3067, 0x3069, 0x3070, 0x3071, 0x3073,\n    0x3074, 0x3076, 0x3077, 0x3079, 0x307A, 0x307C, 0x307D, 0x301D,\n    0x301E, 0x005B, 0x005D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300E,\n    0x300F, 0x3010, 0x3011, 0x2012, 0xFF60, 0x2500, 0x2501, 0x2502,\n    0x2503, 0x2504, 0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250A,\n    0x250B, 0x250C, 0x250D, 0x250E, 0x250F, 0x2510, 0x2511, 0x2512,\n    0x2513, 0x2514, 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251A,\n    0x251B, 0x251C, 0x251D, 0x251E, 0x251F, 0x2520, 0x2521, 0x2522,\n    0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252A,\n    0x252B, 0x252C, 0x252D, 0x252E, 0x252F, 0x2530, 0x2531, 0x2532,\n    0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253A,\n    0x253B, 0x253C, 0x253D, 0x253E, 0x253F, 0x2540, 0x2541, 0x2542,\n    0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254A,\n    0x254B, 0x25B2, 0x20AC, 0x2126, 0x2032, 0x2033, 0xFB00, 0xFB03,\n    0xFB04, 0x0101, 0x012B, 0x016B, 0x0113, 0x014D, 0x0100, 0x012A,\n    0x016A, 0x0112, 0x014C, 0x215B, 0x215C, 0x215D, 0x215E, 0x2153,\n    0x2154, 0x2070, 0x2074, 0x2075, 0x2076, 0x2077, 0x2078, 0x2079,\n    0x2080, 0x2081, 0x2082, 0x2083, 0x2084, 0x2085, 0x2086, 0x2087,\n    0x2088, 0x2089, 0x01CD, 0x011A, 0x0000, 0x1EBC, 0x01CF, 0x0000,\n    0x0128, 0x01D1, 0x0000, 0x01D3, 0x016E, 0x0168, 0x01CE, 0x011B,\n    0x0000, 0x1EBD, 0x01D0, 0x0000, 0x0129, 0x01D2, 0x0000, 0x01D4,\n    0x016F, 0x0169, 0x0251, 0x0251, 0x0251, 0x01FD, 0x00E6, 0x0254,\n    0x0254, 0x0254, 0x0259, 0x0259, 0x0259, 0x025A, 0x025A, 0x025A,\n    0x025B, 0x025B, 0x025B, 0x006A, 0x014B, 0x0275, 0x028C, 0x028C,\n    0x028C, 0x0292, 0x0283, 0x02D0, 0x0020, 0x0021, 0x0022, 0x0023,\n    0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B,\n    0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033,\n    0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B,\n    0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, 0x0043,\n    0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B,\n    0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053,\n    0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B,\n    0x00A5, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063,\n    0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B,\n    0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073,\n    0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B,\n    0x00A6, 0x007D, 0x0303, 0x02BC, 0x005C, 0x02BB, 0x007C, 0x007E,\n    0x00A1, 0x00A2, 0x00A3, 0x2044, 0x0192, 0x00A7, 0x00A4, 0x201C,\n    0x00AB, 0x2039, 0x203A, 0xFB01, 0xFB02, 0x2012, 0x2020, 0x2021,\n    0x00B7, 0x00B6, 0x2022, 0x201A, 0x201E, 0x201D, 0x00BB, 0x2026,\n    0x2030, 0x00BF, 0x0301, 0x0302, 0x00AF, 0x0306, 0x0307, 0x0308,\n    0x030A, 0x00B8, 0x030B, 0x0328, 0x030C, 0x0336, 0x00C6, 0x00AA,\n    0x0141, 0x00D8, 0x0152, 0x00BA, 0x00E6, 0x0131, 0x0142, 0x00F8,\n    0x0153, 0x00DF, 0x002D, 0x00A9, 0x00AC, 0x00AE, 0x00B0, 0x00B1,\n    0x00B2, 0x00B3, 0x00B5, 0x00B9, 0x00BC, 0x00BD, 0x00BE, 0x00C0,\n    0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C7, 0x00C8, 0x00C9,\n    0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1,\n    0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D9, 0x00DA,\n    0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00E0, 0x00E1, 0x00E2, 0x00E3,\n    0x00E4, 0x00E5, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC,\n    0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4,\n    0x00F5, 0x00F6, 0x00F7, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD,\n    0x00FE, 0x00FF, 0x0160, 0x0178, 0x017D, 0x0305, 0x0161, 0x2122,\n    0x017E, 0x0030, 0x20AC, 0x2126, 0x2032, 0x2033, 0xFB00, 0xFB03,\n    0xFB04, 0x0101, 0x012B, 0x016B, 0x0113, 0x014D, 0x0100, 0x012A,\n    0x016A, 0x0112, 0x014C, 0x215B, 0x215C, 0x215D, 0x215E, 0x2153,\n    0x2154, 0x2070, 0x2074, 0x2075, 0x2076, 0x2077, 0x2078, 0x2079,\n    0x2080, 0x2081, 0x2082, 0x2083, 0x2084, 0x2085, 0x2086, 0x2087,\n    0x2088, 0x2089, 0x01CD, 0x011A, 0x0000, 0x1EBC, 0x01CF, 0x0000,\n    0x0128, 0x01D1, 0x0000, 0x01D3, 0x016E, 0x0168, 0x01CE, 0x011B,\n    0x0000, 0x1EBD, 0x01D0, 0x0000, 0x0129, 0x01D2, 0x0000, 0x01D4,\n    0x016F, 0x0169, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035,\n    0x0036, 0x0037, 0x0038, 0x0039, 0x0336, 0x002D, 0x003D, 0x002C,\n    0x0028, 0x0029, 0x002E, 0x002F, 0x003A, 0x003B, 0x0030, 0x0031,\n    0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,\n    0x0336, 0x002D, 0x003D, 0x002C, 0x0028, 0x0029, 0x002E, 0x002F,\n    0x003A, 0x003B, 0x00B7, 0x20AC, 0x0000, 0x2153, 0x2154, 0x00BE,\n    0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215A, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x215B, 0x215C, 0x215D, 0x215E,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,\n    0x0038, 0x0039, 0x0030, 0x2163, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2170, 0x2171,\n    0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179,\n    0x217A, 0x217B, 0x0000, 0x0000, 0x0000, 0x2160, 0x2161, 0x2162,\n    0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A,\n    0x216B, 0x0000, 0x0000, 0x0000, 0x0041, 0x0042, 0x0043, 0x0044,\n    0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C,\n    0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054,\n    0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x3042, 0x3044,\n    0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053,\n    0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064,\n    0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,\n    0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081,\n    0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C,\n    0x308D, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A2, 0x30A4,\n    0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3,\n    0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4,\n    0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF,\n    0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF, 0x30E0, 0x30E1,\n    0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC,\n    0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x3220, 0x3221,\n    0x3222, 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x55B6, 0x5408, 0x6CEB, 0x554F, 0x7B54, 0x4F8B,\n    0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,\n    0x0038, 0x0039, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035,\n    0x0036, 0x0037, 0x0038, 0x0039, 0x3063, 0x624D, 0x3007, 0x4E00,\n    0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D,\n    0x5341, 0x3007, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D,\n    0x4E03, 0x516B, 0x4E5D, 0x5341, 0x3007, 0x4E00, 0x4E8C, 0x4E09,\n    0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D, 0x3064, 0x624D,\n    0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B,\n    0x4E5D, 0x5341, 0x3007, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94,\n    0x516D, 0x4E03, 0x516B, 0x4E5D, 0x5341, 0x30B3, 0x3063, 0x30C3,\n    0x30A9, 0x0000, 0x0000, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464,\n    0x2465, 0x2466, 0x2467, 0x2468, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x24D0, 0x24D1, 0x24D2, 0x24D3, 0x24D4, 0x24D5, 0x24D6,\n    0x24D7, 0x24D8, 0x24D9, 0x24DA, 0x24DB, 0x24DC, 0x24DD, 0x24DE,\n    0x24DF, 0x24E0, 0x24E1, 0x24E2, 0x24E3, 0x24E4, 0x24E5, 0x24E6,\n    0x24E7, 0x24E8, 0x24E9, 0x24B6, 0x24B7, 0x24B8, 0x24B9, 0x24BA,\n    0x24BB, 0x24BC, 0x24BD, 0x24BE, 0x24BF, 0x24C0, 0x24C1, 0x24C2,\n    0x24C3, 0x24C4, 0x24C5, 0x24C6, 0x24C7, 0x24C8, 0x24C9, 0x24CA,\n    0x24CB, 0x24CC, 0x24CD, 0x24CE, 0x24CF, 0x3042, 0x3044, 0x3046,\n    0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053, 0x3055,\n    0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064, 0x3066,\n    0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3072,\n    0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082,\n    0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D,\n    0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x32D0, 0x32D1, 0x32D2,\n    0x32D3, 0x32D4, 0x32D5, 0x32D6, 0x32D7, 0x32D8, 0x32D9, 0x32DA,\n    0x32DB, 0x32DC, 0x32DD, 0x32DE, 0x32DF, 0x32E0, 0x32E1, 0x32E2,\n    0x32E3, 0x32E4, 0x32E5, 0x32E6, 0x32E7, 0x32E8, 0x32E9, 0x32EA,\n    0x32EB, 0x32EC, 0x32ED, 0x32EE, 0x32EF, 0x32F0, 0x32F1, 0x32F2,\n    0x32F3, 0x32F4, 0x32F5, 0x32F6, 0x32F7, 0x32F8, 0x32F9, 0x32FA,\n    0x32FB, 0x32FC, 0x32FD, 0x32FE, 0x30F3, 0x3280, 0x3281, 0x3282,\n    0x3283, 0x3284, 0x3285, 0x3286, 0x3287, 0x3288, 0x3289, 0x3290,\n    0x328A, 0x328B, 0x328C, 0x328D, 0x328E, 0x328F, 0x8ABF, 0x329F,\n    0x526F, 0x6E1B, 0x6A19, 0x6B20, 0x57FA, 0x7981, 0x32A0, 0x32A1,\n    0x329B, 0x329A, 0x32A3, 0x32A2, 0x3297, 0x51FA, 0x329C, 0x3295,\n    0x6E08, 0x5897, 0x554F, 0x7B54, 0x4F8B, 0x96FB, 0x25CC, 0x0030,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0061, 0x0062, 0x0063,\n    0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B,\n    0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073,\n    0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x0041,\n    0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049,\n    0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,\n    0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,\n    0x005A, 0x3042, 0x3044, 0x3046, 0x3048, 0x304A, 0x304B, 0x304D,\n    0x304F, 0x3051, 0x3053, 0x3055, 0x3057, 0x3059, 0x305B, 0x305D,\n    0x305F, 0x3061, 0x3064, 0x3066, 0x3068, 0x306A, 0x306B, 0x306C,\n    0x306D, 0x306E, 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E,\n    0x307F, 0x3080, 0x3081, 0x3082, 0x3084, 0x3086, 0x3088, 0x3089,\n    0x308A, 0x308B, 0x308C, 0x308D, 0x308F, 0x3090, 0x3091, 0x3092,\n    0x3093, 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD,\n    0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD,\n    0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC,\n    0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE,\n    0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9,\n    0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2,\n    0x30F3, 0x65E5, 0x6708, 0x706B, 0x6C34, 0x6728, 0x91D1, 0x571F,\n    0x554F, 0x7B54, 0x4F8B, 0x25CF, 0x0030, 0x0000, 0x0031, 0x0000,\n    0x0032, 0x0000, 0x0033, 0x0000, 0x0034, 0x0000, 0x0035, 0x0000,\n    0x0036, 0x0000, 0x0037, 0x0000, 0x0038, 0x0000, 0x0039, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065,\n    0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D,\n    0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075,\n    0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x0041, 0x0042, 0x0043,\n    0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B,\n    0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053,\n    0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x3042,\n    0x3044, 0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051,\n    0x3053, 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061,\n    0x3064, 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E,\n    0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080,\n    0x3081, 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B,\n    0x308C, 0x308D, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A2,\n    0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1,\n    0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1,\n    0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE,\n    0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF, 0x30E0,\n    0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB,\n    0x30EC, 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x65E5,\n    0x6708, 0x706B, 0x6C34, 0x6728, 0x91D1, 0x571F, 0x8CA0, 0x52DD,\n    0x554F, 0x7B54, 0x4F8B, 0x25A1, 0x25A1, 0x0030, 0x0000, 0x0031,\n    0x0000, 0x0032, 0x0000, 0x0033, 0x0000, 0x0034, 0x0000, 0x0035,\n    0x0000, 0x0036, 0x0000, 0x0037, 0x0000, 0x0038, 0x0000, 0x0039,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0061, 0x0062, 0x0063, 0x0064,\n    0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C,\n    0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074,\n    0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x0041, 0x0042,\n    0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A,\n    0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052,\n    0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A,\n    0x3042, 0x3044, 0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F,\n    0x3051, 0x3053, 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F,\n    0x3061, 0x3064, 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D,\n    0x306E, 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F,\n    0x3080, 0x3081, 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A,\n    0x308B, 0x308C, 0x308D, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093,\n    0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF,\n    0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF,\n    0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD,\n    0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF,\n    0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA,\n    0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3,\n    0x65E5, 0x6708, 0x706B, 0x6C34, 0x6728, 0x91D1, 0x571F, 0x554F,\n    0x7B54, 0x4F8B, 0x25A0, 0x0030, 0x0000, 0x0031, 0x0000, 0x0032,\n    0x0000, 0x0033, 0x0000, 0x0034, 0x0000, 0x0035, 0x0000, 0x0036,\n    0x0000, 0x0037, 0x0000, 0x0038, 0x0000, 0x0039, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066,\n    0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E,\n    0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076,\n    0x0077, 0x0078, 0x0079, 0x007A, 0x0041, 0x0042, 0x0043, 0x0044,\n    0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C,\n    0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054,\n    0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x3042, 0x3044,\n    0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053,\n    0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064,\n    0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,\n    0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081,\n    0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C,\n    0x308D, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A2, 0x30A4,\n    0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3,\n    0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4,\n    0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF,\n    0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF, 0x30E0, 0x30E1,\n    0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC,\n    0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x65E5, 0x6708,\n    0x706B, 0x6C34, 0x6728, 0x91D1, 0x571F, 0x554F, 0x7B54, 0x4F8B,\n    0x0030, 0x0000, 0x0031, 0x0000, 0x0032, 0x0000, 0x0033, 0x0000,\n    0x0034, 0x0000, 0x0035, 0x0000, 0x0036, 0x0000, 0x0037, 0x0000,\n    0x0038, 0x0000, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0061,\n    0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069,\n    0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071,\n    0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079,\n    0x007A, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,\n    0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,\n    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,\n    0x0058, 0x0059, 0x005A, 0x3042, 0x3044, 0x3046, 0x3048, 0x304A,\n    0x304B, 0x304D, 0x304F, 0x3051, 0x3053, 0x3055, 0x3057, 0x3059,\n    0x305B, 0x305D, 0x305F, 0x3061, 0x3064, 0x3066, 0x3068, 0x306A,\n    0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3072, 0x3075, 0x3078,\n    0x307B, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3084, 0x3086,\n    0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308F, 0x3090,\n    0x3091, 0x3092, 0x3093, 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA,\n    0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9,\n    0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA,\n    0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8,\n    0x30DB, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6,\n    0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F0,\n    0x30F1, 0x30F2, 0x30F3, 0x65E5, 0x6708, 0x706B, 0x6C34, 0x6728,\n    0x91D1, 0x571F, 0x554F, 0x7B54, 0x4F8B, 0x25A0, 0x33C2, 0x33CD,\n    0x2116, 0x0000, 0x33D8, 0x33DA, 0x2121, 0x2122, 0x0000, 0x2100,\n    0x33C2, 0x0000, 0x33C4, 0x2105, 0x3397, 0x3371, 0x3398, 0x2113,\n    0x338D, 0x339B, 0x3396, 0x0000, 0x0000, 0x33D7, 0x33D8, 0x0000,\n    0x0000, 0x0000, 0x3301, 0x3302, 0x3304, 0x3306, 0x0000, 0x3308,\n    0x0000, 0x3307, 0x330A, 0x0000, 0x3309, 0x0000, 0x330B, 0x0000,\n    0x330C, 0x330E, 0x330F, 0x3310, 0x3311, 0x3312, 0x3313, 0x0000,\n    0x3317, 0x0000, 0x3319, 0x0000, 0x331A, 0x331B, 0x331C, 0x331D,\n    0x331F, 0x3320, 0x3321, 0x3324, 0x0000, 0x3325, 0x0000, 0x0000,\n    0x3328, 0x3329, 0x0000, 0x332D, 0x0000, 0x0000, 0x332E, 0x332F,\n    0x3330, 0x3332, 0x0000, 0x0000, 0x3334, 0x3335, 0x333C, 0x0000,\n    0x0000, 0x0000, 0x3337, 0x0000, 0x3338, 0x333A, 0x333D, 0x3341,\n    0x333E, 0x333F, 0x3340, 0x3343, 0x3344, 0x3345, 0x3346, 0x3348,\n    0x334B, 0x334C, 0x334F, 0x3350, 0x0000, 0x0000, 0x3352, 0x3354,\n    0x0000, 0x0000, 0x3353, 0x3355, 0x3356, 0x0000, 0x3301, 0x3302,\n    0x3304, 0x3306, 0x0000, 0x3308, 0x0000, 0x3307, 0x330A, 0x0000,\n    0x3309, 0x0000, 0x330B, 0x0000, 0x330C, 0x330E, 0x330F, 0x3310,\n    0x3311, 0x3312, 0x3313, 0x0000, 0x3317, 0x0000, 0x3319, 0x0000,\n    0x331A, 0x331B, 0x331C, 0x331D, 0x331F, 0x3320, 0x3321, 0x3324,\n    0x0000, 0x3325, 0x0000, 0x0000, 0x3328, 0x3329, 0x0000, 0x332D,\n    0x0000, 0x0000, 0x332E, 0x332F, 0x3330, 0x3332, 0x0000, 0x0000,\n    0x3334, 0x3335, 0x333C, 0x0000, 0x0000, 0x0000, 0x3337, 0x0000,\n    0x3338, 0x333A, 0x333D, 0x3341, 0x333E, 0x333F, 0x3340, 0x3343,\n    0x3344, 0x3345, 0x3346, 0x3348, 0x334B, 0x334C, 0x334F, 0x3350,\n    0x0000, 0x0000, 0x3352, 0x3354, 0x0000, 0x0000, 0x3353, 0x3355,\n    0x3356, 0x337E, 0x337D, 0x337C, 0x337B, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x002D,\n    0x003D, 0x2103, 0x2640, 0x2642, 0x3013, 0x3012, 0x300C, 0x300D,\n    0x300E, 0x300F, 0x301A, 0x301B, 0x3018, 0x3019, 0xFF08, 0xFF09,\n    0x301D, 0x301E, 0x2018, 0x2019, 0x201C, 0x201D, 0x0027, 0x0022,\n    0x0000, 0x2135, 0x03D0, 0x220A, 0x210F, 0x00B5, 0x03C6, 0x03DB,\n    0x03D1, 0xFFFD, 0x2668, 0x2669, 0x266C, 0xFF1A, 0x00A9, 0x00A9,\n    0x00AE, 0x00AE, 0x303B, 0x303B, 0x3033, 0x3034, 0x3035, 0x203C,\n    0x2049, 0x0021, 0x203C, 0x2049, 0x244A, 0x0000, 0x2213, 0x2260,\n    0x2243, 0x2272, 0x2273, 0x300C, 0x300D, 0x300E, 0x300F, 0x301A,\n    0x301B, 0x3018, 0x3019, 0xFF5F, 0xFF60, 0x300C, 0x300D, 0x300E,\n    0x300F, 0x301A, 0x301B, 0x3018, 0x3019, 0xFF5F, 0xFF60, 0x239B,\n    0x239D, 0x239E, 0x23A0, 0x239D, 0x239B, 0x23A0, 0x239E, 0x23A1,\n    0x23A3, 0x23A4, 0x23A6, 0x23A3, 0x23A1, 0x23A6, 0x23A4, 0x23A1,\n    0x23A3, 0x23A4, 0x23A6, 0x23A3, 0x23A1, 0x23A6, 0x23A4, 0xFF5C,\n    0x2015, 0x301D, 0x301E, 0x2018, 0x2019, 0x2018, 0x2019, 0x2702,\n    0x2702, 0x2702, 0x2702, 0x303D, 0x3012, 0x309F, 0x534D, 0x2207,\n    0x2205, 0x22A0, 0x2296, 0x2298, 0x2295, 0x2297, 0x229E, 0x2295,\n    0x0021, 0x25B3, 0x25C0, 0x25B6, 0x21E6, 0x21E8, 0x21E7, 0x21E9,\n    0x21D0, 0x2194, 0x2198, 0x2199, 0x2196, 0x2197, 0x21CC, 0x21C6,\n    0x21C4, 0x21C5, 0x2190, 0x2192, 0x2191, 0x2193, 0x2194, 0x2195,\n    0x2504, 0x2506, 0x3030, 0x2307, 0x3030, 0x2307, 0x3030, 0x2307,\n    0x3030, 0x2307, 0x3030, 0x2307, 0x2740, 0x273F, 0x25A1, 0x25A0,\n    0x25A1, 0x25A1, 0x25A1, 0x25A1, 0x25A1, 0x25AB, 0x25A0, 0x25AA,\n    0x271A, 0x271A, 0x25C7, 0x25C6, 0x25C7, 0x25C7, 0x25C7, 0x25C7,\n    0x25C7, 0x25C6, 0x25C6, 0x25CE, 0x25C9, 0x25CB, 0x25E6, 0x25CF,\n    0x2022, 0x2756, 0x2756, 0x2756, 0x2756, 0x3008, 0x3009, 0x3008,\n    0x3009, 0x300A, 0x300B, 0x300A, 0x300B, 0x3053, 0x3053, 0x30B3,\n    0x30B3, 0x309D, 0x309E, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045,\n    0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304B, 0x304C,\n    0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3051, 0x3052, 0x3053,\n    0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A,\n    0x305B, 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062,\n    0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A,\n    0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072,\n    0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A,\n    0x307B, 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082,\n    0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A,\n    0x308B, 0x308C, 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092,\n    0x3093, 0x3094, 0x30FD, 0x30FE, 0x30FC, 0x30A1, 0x30A2, 0x30A3,\n    0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30F5,\n    0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30F6, 0x30B1,\n    0x30B2, 0x30B3, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8,\n    0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0,\n    0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8,\n    0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0,\n    0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8,\n    0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0,\n    0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8,\n    0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0,\n    0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F7, 0x30F8, 0x30F9, 0x30FA,\n    0x309D, 0x309E, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046,\n    0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304B, 0x304C, 0x304D,\n    0x304E, 0x304F, 0x3050, 0x3051, 0x3051, 0x3052, 0x3053, 0x3053,\n    0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B,\n    0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063,\n    0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B,\n    0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073,\n    0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B,\n    0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083,\n    0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B,\n    0x308C, 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093,\n    0x3094, 0x30FD, 0x30FE, 0x30FC, 0x30A1, 0x30A2, 0x30A3, 0x30A4,\n    0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30F5, 0x30AB,\n    0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30F6, 0x30B1, 0x30B2,\n    0x30B3, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9,\n    0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1,\n    0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9,\n    0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1,\n    0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9,\n    0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1,\n    0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9,\n    0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1,\n    0x30F2, 0x30F3, 0x30F4, 0x30F7, 0x30F8, 0x30F9, 0x30FA, 0x3001,\n    0x3002, 0x30FB, 0xFF0A, 0x203B, 0x25CB, 0x25CE, 0x25C9, 0x25B3,\n    0x25B2, 0x30FD, 0x30FE, 0x309D, 0x309E, 0xFF08, 0xFF09, 0x3014,\n    0x3015, 0xFF08, 0xFF09, 0x3014, 0x3015, 0x0030, 0x0031, 0x0032,\n    0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x3041,\n    0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049,\n    0x304A, 0x304B, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, 0x3050,\n    0x3051, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057,\n    0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F,\n    0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067,\n    0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,\n    0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077,\n    0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F,\n    0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087,\n    0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F,\n    0x3090, 0x3091, 0x3092, 0x3093, 0x3094, 0x3041, 0x3043, 0x3045,\n    0x3047, 0x3049, 0x304B, 0x3051, 0x3063, 0x3083, 0x3085, 0x3087,\n    0x308E, 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7,\n    0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30F5, 0x30AC, 0x30AD, 0x30AE,\n    0x30AF, 0x30B0, 0x30B1, 0x30F6, 0x30B2, 0x30B3, 0x30B4, 0x30B5,\n    0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD,\n    0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5,\n    0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD,\n    0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5,\n    0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD,\n    0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5,\n    0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED,\n    0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30A1,\n    0x30A3, 0x30A5, 0x30A7, 0x30A9, 0x30F5, 0x30F6, 0x30C3, 0x30E3,\n    0x30E5, 0x30E7, 0x30EE, 0x30FC, 0x30FC, 0x6CE8, 0x20AC, 0x2126,\n    0x2032, 0x2033, 0xFB00, 0xFB03, 0xFB04, 0x0101, 0x012B, 0x016B,\n    0x0113, 0x014D, 0x0100, 0x012A, 0x016A, 0x0112, 0x014C, 0x215B,\n    0x215C, 0x215D, 0x215E, 0x2153, 0x2154, 0x2070, 0x2074, 0x2075,\n    0x2076, 0x2077, 0x2078, 0x2079, 0x2080, 0x2081, 0x2082, 0x2083,\n    0x2084, 0x2085, 0x2086, 0x2087, 0x2088, 0x2089, 0x01CD, 0x011A,\n    0x0000, 0x1EBC, 0x01CF, 0x0000, 0x0128, 0x01D1, 0x0000, 0x01D3,\n    0x016E, 0x0168, 0x01CE, 0x011B, 0x0000, 0x1EBD, 0x01D0, 0x0000,\n    0x0129, 0x01D2, 0x0000, 0x01D4, 0x016F, 0x0169, 0x0251, 0x0251,\n    0x0251, 0x01FD, 0x00E6, 0x0254, 0x0254, 0x0254, 0x0259, 0x0259,\n    0x0259, 0x025A, 0x025A, 0x025A, 0x025B, 0x025B, 0x025B, 0x006A,\n    0x014B, 0x0275, 0x028C, 0x028C, 0x028C, 0x0292, 0x0283, 0x02D0,\n    0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,\n    0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,\n    0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,\n    0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,\n    0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,\n    0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,\n    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,\n    0x0058, 0x0059, 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E, 0x005F,\n    0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,\n    0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,\n    0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,\n    0x0078, 0x0079, 0x007A, 0x007B, 0x00A6, 0x007D, 0x0303, 0x02BC,\n    0x005C, 0x02BB, 0x007C, 0x007E, 0x00A1, 0x00A2, 0x00A3, 0x2044,\n    0x0192, 0x00A7, 0x00A4, 0x201C, 0x00AB, 0x2039, 0x203A, 0xFB01,\n    0xFB02, 0x2012, 0x2020, 0x2021, 0x00B7, 0x00B6, 0x2022, 0x201A,\n    0x201E, 0x201D, 0x00BB, 0x2026, 0x2030, 0x00BF, 0x0301, 0x0302,\n    0x00AF, 0x0306, 0x0307, 0x0308, 0x030A, 0x00B8, 0x030B, 0x0328,\n    0x030C, 0x0336, 0x00C6, 0x00AA, 0x0141, 0x00D8, 0x0152, 0x00BA,\n    0x00E6, 0x0131, 0x0142, 0x00F8, 0x0153, 0x00DF, 0x002D, 0x00A9,\n    0x00AC, 0x00AE, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B5, 0x00B9,\n    0x00BC, 0x00BD, 0x00BE, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4,\n    0x00C5, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD,\n    0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5,\n    0x00D6, 0x00D7, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE,\n    0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E7, 0x00E8,\n    0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0,\n    0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F9,\n    0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, 0x0160, 0x0178,\n    0x017D, 0x0305, 0x0161, 0x2122, 0x017E, 0x0030, 0x20AC, 0x2126,\n    0x2032, 0x2033, 0xFB00, 0xFB03, 0xFB04, 0x0101, 0x012B, 0x016B,\n    0x0113, 0x014D, 0x0100, 0x012A, 0x016A, 0x0112, 0x014C, 0x215B,\n    0x215C, 0x215D, 0x215E, 0x2153, 0x2154, 0x2070, 0x2074, 0x2075,\n    0x2076, 0x2077, 0x2078, 0x2079, 0x2080, 0x2081, 0x2082, 0x2083,\n    0x2084, 0x2085, 0x2086, 0x2087, 0x2088, 0x2089, 0x01CD, 0x011A,\n    0x0000, 0x1EBC, 0x01CF, 0x0000, 0x0128, 0x01D1, 0x0000, 0x01D3,\n    0x016E, 0x0168, 0x01CE, 0x011B, 0x0000, 0x1EBD, 0x01D0, 0x0000,\n    0x0129, 0x01D2, 0x0000, 0x01D4, 0x016F, 0x0169, 0x0030, 0x0031,\n    0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,\n    0x0336, 0x002D, 0x003D, 0x002C, 0x0028, 0x0029, 0x002E, 0x002F,\n    0x003A, 0x003B, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035,\n    0x0036, 0x0037, 0x0038, 0x0039, 0x0336, 0x002D, 0x003D, 0x002C,\n    0x0028, 0x0029, 0x002E, 0x002F, 0x003A, 0x003B, 0x00B7, 0x002D,\n    0x003D, 0x2103, 0x2640, 0x2642, 0x3013, 0x3012, 0x300C, 0x300D,\n    0x300E, 0x300F, 0x301A, 0x301B, 0x3018, 0x3019, 0xFF08, 0xFF09,\n    0x301D, 0x301E, 0x2018, 0x2019, 0x201C, 0x201D, 0x0027, 0x0022,\n    0x9038, 0x8B01, 0x7DE3, 0x9EC3, 0x6EAB, 0x798D, 0x6094, 0x6D77,\n    0x6168, 0x6982, 0x6E34, 0x8910, 0x6F22, 0x5668, 0x65E2, 0x7948,\n    0x865B, 0x97FF, 0x52E4, 0x8B39, 0x63ED, 0x64CA, 0x784F, 0x7A40,\n    0x6BBA, 0x7949, 0x8996, 0x716E, 0x793E, 0x8005, 0x81ED, 0x795D,\n    0x6691, 0x7F72, 0x6D89, 0x72C0, 0x613C, 0x771E, 0x7BC0, 0x7956,\n    0x50E7, 0x5C64, 0x5DE2, 0x618E, 0x8D08, 0x537D, 0x5606, 0x8457,\n    0x5FB5, 0x61F2, 0x93AD, 0x798E, 0x9B2D, 0x7A81, 0x96E3, 0x6885,\n    0x7E41, 0x6669, 0x5351, 0x7891, 0x8CD3, 0x654F, 0x4FAE, 0x5002,\n    0x5840, 0x52C9, 0x6B65, 0x58A8, 0x6BCF, 0x514D, 0x623E, 0x7950,\n    0x6B04, 0x9686, 0x865C, 0x6DDA, 0x985E, 0x66C6, 0x6B77, 0x7DF4,\n    0x934A, 0x5ECA, 0x9304, 0x6982, 0x51B4, 0x634C, 0x86DB, 0x9089,\n    0x9022, 0x5049, 0x7DEF, 0x9055, 0x53A9, 0x990C, 0x885B, 0x5EF6,\n    0x6CBF, 0x925B, 0x7FC1, 0x82BD, 0x96C5, 0x5BB3, 0x6168, 0x6982,\n    0x6BBB, 0x6562, 0x8CAB, 0x5DCC, 0x9811, 0x5E30, 0x8ECC, 0x7AAE,\n    0x5747, 0x5091, 0x7A74, 0x5065, 0x5EFA, 0x9237, 0x6A8E, 0x4EA4,\n    0x516C, 0x66F4, 0x6821, 0x786C, 0x7D5E, 0x8003, 0x8CFC, 0x964D,\n    0x62F7, 0x7F6A, 0x4F7F, 0x53F2, 0x59C9, 0x8B1D, 0x90AA, 0x53CE,\n    0x8F2F, 0x67D4, 0x77AC, 0x821C, 0x696F, 0x677E, 0x8A1F, 0x4E08,\n    0x57F4, 0x690D, 0x8077, 0x89AA, 0x9042, 0x636E, 0x6442, 0x8239,\n    0x7DCF, 0x8061, 0x50CF, 0x8A95, 0x6065, 0x5146, 0x773A, 0x8074,\n    0x8DF3, 0x5EAD, 0x5EF7, 0x8247, 0x6843, 0x9003, 0x6D3E, 0x6392,\n    0x8F29, 0x73ED, 0x9812, 0x60B2, 0x6249, 0x6590, 0x7DCB, 0x8AB9,\n    0x8CA7, 0x7236, 0x847A, 0x5206, 0x5674, 0x61A4, 0x7C89, 0x7D1B,\n    0x96F0, 0x853D, 0x4FBF, 0x6367, 0x76C6, 0x685D, 0x8108, 0x8036,\n    0x7FFC, 0x540F, 0x96A3, 0x9E9F, 0x9E97, 0x806F, 0x807E, 0x6E7E,\n    0x5085, 0x5193, 0x51DB, 0x5315, 0x5340, 0x96D9, 0x55A9, 0x56C1,\n    0x570D, 0x58AB, 0x59DA, 0x5A36, 0x5ABE, 0x5D4E, 0x5D87, 0x5DC9,\n    0x5DD3, 0x5F2D, 0x5F98, 0x60D8, 0x613D, 0x61FE, 0x6268, 0x62CF,\n    0x651D, 0x640F, 0x64F2, 0x655D, 0x665F, 0x67A9, 0x67E7, 0x696B,\n    0x6930, 0x69A7, 0x6A44, 0x6A90, 0x6C08, 0x6C13, 0x6E23, 0x6F11,\n    0x6EFE, 0x6F3E, 0x71FF, 0x73E5, 0x7432, 0x745F, 0x74E0, 0x750C,\n    0x7672, 0x792A, 0x78D4, 0x79BA, 0x7A19, 0x7A95, 0x7CF2, 0x7D73,\n    0x7DDD, 0x7E35, 0x7FAE, 0x7FE1, 0x805A, 0x805F, 0x8073, 0x8070,\n    0x8076, 0x8153, 0x818A, 0x81B5, 0x81CD, 0x83F2, 0x8555, 0x85D5,\n    0x871A, 0x8836, 0x889E, 0x88D8, 0x88F4, 0x892B, 0x893B, 0x896A,\n    0x896F, 0x8A1D, 0x8D05, 0x8D0F, 0x9F4E, 0x8E91, 0x8EA1, 0x9052,\n    0x900E, 0x9130, 0x9156, 0x9158, 0x9165, 0x9173, 0x9172, 0x91A2,\n    0x91AF, 0x91AA, 0x91B4, 0x91BA, 0x9477, 0x9698, 0x973D, 0x9760,\n    0x9771, 0x980C, 0x9873, 0x98C3, 0x9A45, 0x9B4D, 0x9B58, 0x9BC6,\n    0x9BE1, 0x9BF1, 0x9D48, 0x9DCF, 0x9F08, 0x6271, 0x6697, 0x610F,\n    0x8863, 0x9055, 0x907A, 0x78EF, 0x54E1, 0x2ED7, 0x2EBD, 0x53A9,\n    0x74DC, 0x904B, 0x990C, 0x885E, 0x92B3, 0x95B1, 0x5EF6, 0x63F4,\n    0x6CBF, 0x7159, 0x9060, 0x925B, 0x65BC, 0x5F80, 0x7FC1, 0x5378,\n    0x97F3, 0x5316, 0x82B1, 0x83D3, 0x8CA8, 0x904E, 0x82BD, 0x96C5,\n    0x9913, 0x5EFB, 0x7070, 0x5BB3, 0x6168, 0x6168, 0x6168, 0x69EA,\n    0x6982, 0x676E, 0x89D2, 0x9694, 0x5272, 0x8F44, 0x938C, 0x82C5,\n    0x5BD2, 0x74B0, 0x7DE9, 0x7F36, 0x9084, 0x9592, 0x97D3, 0x8218,\n    0x5371, 0x559C, 0x3402, 0x3402, 0x5E7E, 0x65E3, 0x671F, 0x6A5F,\n    0x8D77, 0x98E2, 0x5409, 0x55AB, 0x8650, 0x9006, 0x53CA, 0x5438,\n    0x6025, 0x7D1A, 0x5DE8, 0x62D2, 0x8DDD, 0x9B5A, 0x9B5A, 0x537F,\n    0x5F3A, 0x6050, 0x69C1, 0x6A4B, 0x6A4B, 0x9115, 0x97FF, 0x9957,\n    0x6681, 0x2EA9, 0x8FD1, 0x5036, 0x77E9, 0x5177, 0x865E, 0x7A7A,\n    0x9047, 0x6ADB, 0x5553, 0x5951, 0x6075, 0x6167, 0x8FCE, 0x5091,\n    0x6F54, 0x7A74, 0x2EBC, 0x2EBC, 0x517C, 0x5238, 0x61B2, 0x6743,\n    0x80A9, 0x8B19, 0x9063, 0x539F, 0x8A01, 0x6236, 0x96C7, 0x9867,\n    0x5433, 0x5A1B, 0x8AA4, 0x5DE5, 0x614C, 0x6285, 0x63A7, 0x69CB,\n    0x6D69, 0x6E2F, 0x8015, 0x8154, 0x8352, 0x8B1B, 0x8CFC, 0x543F,\n    0x9177, 0x8170, 0x7511, 0x8FBC, 0x4ECA, 0x9396, 0x5EA7, 0x5F69,\n    0x63A1, 0x6B72, 0x83DC, 0x51B4, 0x54B2, 0x524A, 0x7522, 0x9910,\n    0x59FF, 0x59FF, 0x5DFF, 0x8AEE, 0x8AEE, 0x8CC7, 0x8CC7, 0x6B21,\n    0x6B21, 0x6ECB, 0x73BA, 0x53F1, 0x6368, 0x659C, 0x90AA, 0x52FA,\n    0x7235, 0x7235, 0x914C, 0x5F31, 0x4E3B, 0x53D7, 0x6388, 0x5468,\n    0x7D42, 0x7FD2, 0x8846, 0x9031, 0x4F4F, 0x8853, 0x8FF0, 0x5DE1,\n    0x9075, 0x9075, 0x6240, 0x66F8, 0x5973, 0x52DD, 0x5546, 0x5BB5,\n    0x5C06, 0x2E8C, 0x2E8D, 0x5C19, 0x6D88, 0x785D, 0x8096, 0x4E08,\n    0x5B82, 0x57CE, 0x60C5, 0x57F4, 0x98FE, 0x690D, 0x6B96, 0x98DF,\n    0x98E0, 0x2EDE, 0x378D, 0x4FB5, 0x2E97, 0x6D78, 0x771F, 0x9032,\n    0x4EBB, 0x4EBA, 0x5203, 0x5C0B, 0x8A0A, 0x8A0A, 0x8FC5, 0x8870,\n    0x9042, 0x351F, 0x52E2, 0x6210, 0x76DB, 0x8056, 0x8980, 0x8AA0,\n    0x8ACB, 0x975C, 0x975C, 0x7A05, 0x8106, 0x96BB, 0x7C4D, 0x7BC0,\n    0x8AAA, 0x96EA, 0x7D76, 0x6247, 0x6F98, 0x7FA1, 0x8239, 0x9078,\n    0x9077, 0x524D, 0x5168, 0x6383, 0x63F7, 0x7626, 0x8D70, 0x9001,\n    0x906D, 0x9020, 0x2ECA, 0x901F, 0x8CCA, 0x5C0A, 0x5C0A, 0x59A5,\n    0x6CF0, 0x9000, 0x902E, 0x968A, 0x9BDB, 0x5927, 0x3427, 0x7027,\n    0x9054, 0x812B, 0x4E39, 0x6B4E, 0x70AD, 0x8A95, 0x6696, 0x5024,\n    0x7F6E, 0x7BC9, 0x2EAE, 0x7B51, 0x9010, 0x67F1, 0x6CE8, 0x99D0,\n    0x5F6B, 0x5FB5, 0x61F2, 0x671D, 0x6F6E, 0x8ABF, 0x76F4, 0x6715,\n    0x6715, 0x589C, 0x8FFD, 0x901A, 0x576A, 0x91E3, 0x5448, 0x5E1D,\n    0x7A0B, 0x7684, 0x9069, 0x8FED, 0x6DFB, 0x514E, 0x9014, 0x783A,\n    0x5721, 0x571F, 0x51AC, 0x5510, 0x7CD6, 0x85E4, 0x8B04, 0x9003,\n    0x900F, 0x9A30, 0x5C0E, 0x9053, 0x5451, 0x3B88, 0x5167, 0x8089,\n    0x4E73, 0x5FCD, 0x8A8D, 0x5BE7, 0x7D0D, 0x8987, 0x6D3E, 0x80BA,\n    0x535A, 0x8584, 0x8FEB, 0x7E1B, 0x8087, 0x4E37, 0x6F51, 0x91B1,\n    0x4F34, 0x5224, 0x534A, 0x5E06, 0x7554, 0x6669, 0x8543, 0x907F,\n    0x5FAE, 0x9F3B, 0x5339, 0x2EAA, 0x5F65, 0x59EC, 0x59EB, 0x8A55,\n    0x5E99, 0x75C5, 0x5A66, 0x6577, 0x6D6E, 0x8CA0, 0x8CA0, 0x670D,\n    0x8986, 0x4E19, 0x5E63, 0x5E73, 0x5F0A, 0x8511, 0x504F, 0x7DE8,\n    0x8FD4, 0x904D, 0x7C3F, 0x5305, 0x5D29, 0x62B1, 0x670B, 0x7832,\n    0x7E2B, 0x80DE, 0x840C, 0x90A6, 0x90A6, 0x98FD, 0x9D6C, 0x4EA1,\n    0x5E3D, 0x5FD8, 0x5FD9, 0x623F, 0x671B, 0x671B, 0x5192, 0x6469,\n    0x7FFB, 0x51E1, 0x78E8, 0x9B54, 0x2FC7, 0x69D9, 0x685D, 0x4FE3,\n    0x53C8, 0x7E6D, 0x9EBF, 0x8108, 0x660E, 0x76DF, 0x8FF7, 0x5984,\n    0x52D0, 0x76F2, 0x8017, 0x623E, 0x7D0B, 0x9580, 0x7D04, 0x8E8D,\n    0x687A, 0x687A, 0x6801, 0x6109, 0x8AED, 0x8F38, 0x52C7, 0x6709,\n    0x7336, 0x7336, 0x7337, 0x88D5, 0x904A, 0x66DC, 0x2EB7, 0x8981,\n    0x990A, 0x7FCC, 0x7FFC, 0x8EB6, 0x862D, 0x7387, 0x9F8D, 0x9F8D,\n    0x65C5, 0x6881, 0x71D0, 0x96A3, 0x9C57, 0x9E9F, 0x7C7B, 0x5EC9,\n    0x6190, 0x9023, 0x6717, 0x8002, 0x8107, 0x50CA, 0x511A, 0x5154,\n    0x5195, 0x2E87, 0x528D, 0x52D7, 0x52F9, 0x5349, 0x353E, 0x53DF,\n    0x66FC, 0x5533, 0x55E4, 0x5455, 0x56C0, 0x5939, 0x5A1C, 0x5AC2,\n    0x5B73, 0x5BC3, 0x5C14, 0x37E2, 0x5CE6, 0x5E54, 0x4E48, 0x5EE3,\n    0x6097, 0x62D4, 0x62CC, 0x641C, 0x63C6, 0x6428, 0x8209, 0x631B,\n    0x665F, 0x665F, 0x6663, 0x66F5, 0x675E, 0x689D, 0x688D, 0x69F6,\n    0x6961, 0x5BE8, 0x5BE8, 0x69BB, 0x6BCC, 0x6F11, 0x6E17, 0x6F98,\n    0x6CAA, 0x6CAA, 0x701B, 0x7162, 0x723B, 0x4E2C, 0x731C, 0x74CA,\n    0x74EF, 0x7575, 0x75EC, 0x764E, 0x3FB1, 0x776A, 0x77A9, 0x7940,\n    0x7953, 0x7953, 0x9F4B, 0x79AE, 0x9083, 0x7B53, 0x7C11, 0x7C14,\n    0x4264, 0x7C50, 0x7C58, 0x7D46, 0x7D63, 0x7E22, 0x7E22, 0x7E48,\n    0x7E35, 0x7E43, 0x7E8C, 0x7F50, 0x7F51, 0x7F51, 0x7F51, 0x7FC5,\n    0x7FC6, 0x7FE9, 0x8141, 0x4453, 0x8258, 0x8279, 0x2EBF, 0x2EC0,\n    0x82E3, 0x5179, 0x83A2, 0x8420, 0x83BD, 0x84F4, 0x856D, 0x8587,\n    0x85F4, 0x4E55, 0x8737, 0x873B, 0x8805, 0x87BD, 0x867D, 0x8836,\n    0x8944, 0x88C6, 0x89BD, 0x8ADB, 0x8B3E, 0x8B5A, 0x8D73, 0x8D99,\n    0x8DCB, 0x8E34, 0x8E4A, 0x8FEF, 0x9087, 0x8FFA, 0x901E, 0x9035,\n    0x9050, 0x8FC8, 0x9081, 0x908A, 0x908A, 0x908A, 0x908A, 0x908A,\n    0x908A, 0x9089, 0x9089, 0x9089, 0x9089, 0x9089, 0x9089, 0x9089,\n    0x9089, 0x9089, 0x9089, 0x9089, 0x9089, 0x92CF, 0x93DD, 0x95BC,\n    0x9621, 0x96B2, 0x975C, 0x9839, 0x98EB, 0x9903, 0x9909, 0x9945,\n    0x9945, 0x994B, 0x9A08, 0x9A5F, 0x9A65, 0x9AEF, 0x9B18, 0x9BDF,\n    0x9D09, 0x9D08, 0x9EA5, 0x9ECC, 0x9F08, 0x9F4A, 0x9F63, 0x9F67,\n    0x9F6C, 0x7199, 0x7199, 0x891C, 0x68C8, 0x66FB, 0x5F45, 0x5300,\n    0x5389, 0x5953, 0xFA11, 0x6852, 0x6A73, 0x6D87, 0xFA15, 0x8A12,\n    0x4E04, 0x4E05, 0x4E1F, 0x4E2B, 0x4E2F, 0x4E30, 0x4E40, 0x4E41,\n    0x4E44, 0x4E5A, 0x4E7F, 0x4E8D, 0x4E96, 0x4EB9, 0x4ED0, 0x4EE0,\n    0x4EFD, 0x4EFF, 0x4F0B, 0x4F15, 0x4F60, 0x4F3B, 0x4F49, 0x4F54,\n    0x4F7A, 0x4F7D, 0x4F7E, 0x4F97, 0x4FBE, 0x4FCF, 0x4FFD, 0x5000,\n    0x5001, 0x5010, 0x501B, 0x5027, 0x502E, 0x5057, 0x5066, 0x506A,\n    0x503B, 0x508F, 0x5096, 0x509C, 0x50CC, 0x50E6, 0x50E9, 0x50EF,\n    0x5108, 0x510B, 0x5110, 0x511B, 0x511E, 0x515F, 0x51A1, 0x51BC,\n    0x51DE, 0x51EE, 0x51F4, 0x5201, 0x5202, 0x5213, 0x5249, 0x5261,\n    0x5266, 0x5293, 0x52C8, 0x52F0, 0x530A, 0x530B, 0x533E, 0x534C,\n    0x534B, 0x5361, 0x536C, 0x53AB, 0x53DA, 0x53E6, 0x53F5, 0x5427,\n    0x544D, 0x5466, 0x546B, 0x5474, 0x548D, 0x5496, 0x54A1, 0x54AD,\n    0x54B9, 0x54BF, 0x54C6, 0x54CD, 0x550E, 0x552B, 0x5535, 0x554A,\n    0x5560, 0x5561, 0x5588, 0x558E, 0x5608, 0x560E, 0x560F, 0x5637,\n    0x563F, 0x5649, 0x564B, 0x564F, 0x5666, 0x5669, 0x566F, 0x5671,\n    0x5672, 0x5695, 0x569A, 0x56AC, 0x56AD, 0x56B1, 0x56C9, 0x56DD,\n    0x56E4, 0x570A, 0x5715, 0x5723, 0x572F, 0x5733, 0x5734, 0x574C,\n    0x5770, 0x578C, 0x579C, 0x57B8, 0x57E6, 0x57ED, 0x57F5, 0x57F6,\n    0x57FF, 0x5809, 0x5820, 0x5832, 0x587C, 0x5880, 0x58A9, 0x58CE,\n    0x58D0, 0x58D4, 0x58DA, 0x58E9, 0x590C, 0x5924, 0x592F, 0x5961,\n    0x596D, 0x59CA, 0x59D2, 0x59DD, 0x59E3, 0x59E4, 0x5A04, 0x5A0C,\n    0x5A23, 0x5A47, 0x5A55, 0x5A63, 0x5A6D, 0x5A7E, 0x5A9E, 0x5AA7,\n    0x5AAC, 0x5AB3, 0x5AE0, 0x5B00, 0x5B19, 0x5B25, 0x5B2D, 0x5B41,\n    0x5B7C, 0x5B7E, 0x5B7F, 0x5B8A, 0x5C23, 0x5C2B, 0x5C30, 0x5C63,\n    0x5C69, 0x5C7C, 0x5CCB, 0x5CD2, 0x5CF4, 0x5D24, 0x5D26, 0x5D43,\n    0x5D46, 0x5D4A, 0x5D92, 0x5D94, 0x5D99, 0x5DA0, 0x5DD8, 0x5DE0,\n    0x5DF8, 0x5E00, 0x5E12, 0x5E14, 0x5E15, 0x5E18, 0x5E2E, 0x5E58,\n    0x5E6B, 0x5E6C, 0x5EA8, 0x5EAA, 0x5EBE, 0x5EBF, 0x5ECB, 0x5ED2,\n    0x5F07, 0x5F0E, 0x5F1C, 0x5F1D, 0x5F22, 0x5F28, 0x5F36, 0x5F3B,\n    0x5F40, 0x5F50, 0x5F58, 0x5F64, 0x5F89, 0x5F9C, 0x5FA7, 0x5FA4,\n    0x5FAF, 0x5FB8, 0x5FC4, 0x5FC9, 0x5FE1, 0x5FE9, 0x5FED, 0x5FFC,\n    0x6017, 0x601A, 0x6033, 0x6061, 0x607F, 0x609E, 0x60A4, 0x60B0,\n    0x60CB, 0x60DB, 0x60F8, 0x6112, 0x6113, 0x6114, 0x611C, 0x617C,\n    0x618D, 0x619F, 0x61A8, 0x61C2, 0x61DF, 0x6215, 0x6229, 0x6243,\n    0x6246, 0x624C, 0x6251, 0x6256, 0x62C4, 0x62FC, 0x630A, 0x630D,\n    0x6318, 0x6339, 0x6342, 0x6343, 0x6365, 0x6374, 0x637D, 0x6384,\n    0x6387, 0x6390, 0x639E, 0x63D1, 0x63DC, 0x6409, 0x6410, 0x6422,\n    0x6454, 0x645B, 0x646D, 0x647B, 0x64BE, 0x64BF, 0x64E5, 0x64F7,\n    0x64FB, 0x6504, 0x6516, 0x6519, 0x6547, 0x6567, 0x6581, 0x6585,\n    0x65C2, 0x65F0, 0x65F2, 0x662C, 0x664C, 0x665B, 0x665C, 0x6661,\n    0x666B, 0x6677, 0x66A4, 0x66C8, 0x66EC, 0x6705, 0x6713, 0x6733,\n    0x6748, 0x674C, 0x6776, 0x677B, 0x67B0, 0x67B2, 0x67F9, 0x67D7,\n    0x67D9, 0x67F0, 0x682C, 0x6830, 0x6831, 0x685B, 0x6872, 0x6875,\n    0x687A, 0x6884, 0x68A5, 0x68B2, 0x68D0, 0x68D6, 0x68E8, 0x68ED,\n    0x68F0, 0x68F1, 0x68FC, 0x6911, 0x6913, 0x6935, 0x693B, 0x6957,\n    0x6963, 0x6972, 0x697F, 0x6980, 0x69A6, 0x69AD, 0x69B7, 0x69D6,\n    0x69D7, 0x6A01, 0x6A0F, 0x6A15, 0x6A28, 0x6A34, 0x6A3E, 0x6A45,\n    0x6A50, 0x6A51, 0x6A56, 0x6A5B, 0x6A83, 0x6A89, 0x6A91, 0x6A9D,\n    0x6A9E, 0x6A9F, 0x6ADC, 0x6AE7, 0x6AEC, 0x6B1E, 0x6B24, 0x6B35,\n    0x6B46, 0x6B56, 0x6B60, 0x6B82, 0x6BBE, 0x6BE1, 0x6BF1, 0x6C10,\n    0x6C33, 0x6C35, 0x6C3A, 0x6C59, 0x6C76, 0x6C7B, 0x6C85, 0x6C95,\n    0x6C9C, 0x6CD0, 0x6CD4, 0x6CD6, 0x6CE0, 0x6CEB, 0x6CEC, 0x6CEE,\n    0x6D0A, 0x6D0E, 0x6D11, 0x6D2E, 0x6D57, 0x6D5E, 0x6D65, 0x6D82,\n    0x6DBF, 0x6DC4, 0x6DCA, 0x6DD6, 0x6DE9, 0x6E22, 0x6E51, 0x6EC7,\n    0x6ECA, 0x6ECE, 0x6EFD, 0x6F1A, 0x6F2A, 0x6F2F, 0x6F33, 0x6F5A,\n    0x6F5E, 0x6F62, 0x6F7D, 0x6F8B, 0x6F8D, 0x6F92, 0x6F94, 0x6F9A,\n    0x6FA7, 0x6FA8, 0x6FB6, 0x6FDA, 0x6FDE, 0x6FF9, 0x7039, 0x703C,\n    0x704A, 0x7054, 0x705D, 0x705E, 0x7064, 0x706C, 0x707E, 0x7081,\n    0x7095, 0x70B7, 0x70D3, 0x70D4, 0x70D8, 0x70DC, 0x7107, 0x7120,\n    0x7131, 0x714A, 0x7152, 0x7160, 0x7179, 0x7192, 0x71B3, 0x71CB,\n    0x71D3, 0x71D6, 0x7200, 0x721D, 0x722B, 0x7238, 0x7241, 0x7253,\n    0x7255, 0x7256, 0x725C, 0x728D, 0x72AD, 0x72B4, 0x72C7, 0x72FB,\n    0x7304, 0x7305, 0x7328, 0x7331, 0x7343, 0x736C, 0x737C, 0x7383,\n    0x7385, 0x7386, 0x7395, 0x739E, 0x739F, 0x73A0, 0x73A6, 0x73AB,\n    0x73B5, 0x73B7, 0x73BC, 0x73CF, 0x73D9, 0x73E9, 0x73F4, 0x73FD,\n    0x7404, 0x740A, 0x741A, 0x741B, 0x7424, 0x7428, 0x742C, 0x742F,\n    0x7430, 0x7431, 0x7439, 0x7444, 0x7447, 0x744B, 0x744D, 0x7451,\n    0x7457, 0x7466, 0x746B, 0x7471, 0x7480, 0x7485, 0x7486, 0x7487,\n    0x7490, 0x7498, 0x749C, 0x74A0, 0x74A3, 0x74A8, 0x74AB, 0x74B5,\n    0x74BF, 0x74C8, 0x74DA, 0x74DE, 0x754E, 0x7579, 0x7581, 0x7590,\n    0x7592, 0x7593, 0x75B4, 0x75E4, 0x75F9, 0x7600, 0x760A, 0x7615,\n    0x7616, 0x7619, 0x761E, 0x762D, 0x7635, 0x7643, 0x764B, 0x7665,\n    0x766D, 0x766F, 0x7671, 0x7674, 0x76A4, 0x76A5, 0x76C5, 0x76CC,\n    0x76EC, 0x76FC, 0x7734, 0x7736, 0x775C, 0x775F, 0x7760, 0x7772,\n    0x777D, 0x7795, 0x77AA, 0x77E6, 0x77F0, 0x77F4, 0x7806, 0x7822,\n    0x782D, 0x782E, 0x7830, 0x7835, 0x7868, 0x789E, 0x78C8, 0x78CC,\n    0x78CE, 0x78E4, 0x78E0, 0x78E1, 0x78F2, 0x78F7, 0x78FB, 0x7931,\n    0x7934, 0x793B, 0x793D, 0x7945, 0x795B, 0x795C, 0x798B, 0x7996,\n    0x7998, 0x79B8, 0x79BB, 0x79CA, 0x79DA, 0x7A03, 0x7A09, 0x7A11,\n    0x7A1E, 0x7A2D, 0x7A39, 0x7A45, 0x7A4C, 0x7A5D, 0x7A60, 0x7A6D,\n    0x7A78, 0x7AA0, 0x7AA3, 0x7AB3, 0x7ABB, 0x7ABC, 0x7AC6, 0x7B07,\n    0x7B14, 0x7B27, 0x7B31, 0x7B47, 0x7B4E, 0x7B60, 0x7B69, 0x7B6D,\n    0x7B72, 0x7B91, 0x7BAF, 0x7BD7, 0x7BD9, 0x7C0B, 0x7C0F, 0x7C20,\n    0x7C26, 0x7C31, 0x7C36, 0x7C51, 0x7C59, 0x7C67, 0x7C6E, 0x7C70,\n    0x7CBC, 0x7CBF, 0x7CC8, 0x7CC9, 0x7CD7, 0x7CD9, 0x7CDD, 0x7CEB,\n    0x7D07, 0x7D08, 0x7D09, 0x7D13, 0x7D1D, 0x7D23, 0x7D41, 0x7D53,\n    0x7D59, 0x7D5D, 0x7D7A, 0x7D86, 0x7D8B, 0x7D8C, 0x7DCC, 0x7DEB,\n    0x7DF1, 0x7DF9, 0x7E08, 0x7E11, 0x7E15, 0x7E20, 0x7E47, 0x7E62,\n    0x7E6E, 0x7E73, 0x7E8D, 0x7E91, 0x7E98, 0x7F44, 0x7F4F, 0x7F52,\n    0x7F53, 0x7F61, 0x7F91, 0x7FBF, 0x7FCE, 0x7FDF, 0x7FE5, 0x7FEC,\n    0x7FEE, 0x7FEF, 0x7FFA, 0x800E, 0x8011, 0x8014, 0x8024, 0x8026,\n    0x803A, 0x803C, 0x8060, 0x8071, 0x8075, 0x809E, 0x80A6, 0x80AB,\n    0x80D7, 0x80D8, 0x8116, 0x8118, 0x813A, 0x814A, 0x814C, 0x8181,\n    0x8184, 0x81B4, 0x81CF, 0x81F9, 0x8203, 0x8221, 0x8232, 0x8234,\n    0x8246, 0x824B, 0x824F, 0x828E, 0x82AE, 0x82B7, 0x82BE, 0x82C6,\n    0x82FE, 0x8343, 0x8351, 0x8355, 0x8386, 0x838D, 0x8392, 0x8398,\n    0x83A9, 0x83BF, 0x83C0, 0x83EA, 0x840F, 0x8411, 0x844A, 0x8476,\n    0x84A8, 0x84AF, 0x84C0, 0x84C2, 0x84F0, 0x84FD, 0x850C, 0x8534,\n    0x855E, 0x858F, 0x85B7, 0x85CE, 0x85AD, 0x8612, 0x8629, 0x8652,\n    0x8663, 0x866C, 0x866F, 0x867A, 0x868D, 0x8691, 0x8698, 0x86A7,\n    0x86A8, 0x86FA, 0x86FD, 0x870B, 0x8713, 0x8719, 0x871E, 0x8728,\n    0x873E, 0x8771, 0x8788, 0x8799, 0x87AC, 0x87AD, 0x87B5, 0x87D6,\n    0x87EB, 0x87ED, 0x8801, 0x8803, 0x8806, 0x880B, 0x8814, 0x881C,\n    0x8856, 0x885F, 0x8864, 0x8898, 0x88AA, 0x88BD, 0x88BE, 0x88CA,\n    0x88D2, 0x88DB, 0x88F0, 0x88F1, 0x8906, 0x8918, 0x8919, 0x891A,\n    0x8927, 0x8930, 0x893E, 0x897B, 0x89D4, 0x89D6, 0x89E5, 0x89F1,\n    0x8A07, 0x8A0F, 0x8A15, 0x8A22, 0x8A4E, 0x8A7F, 0x8AF4, 0x8B1F,\n    0x8B37, 0x8B43, 0x8B44, 0x8B54, 0x8B9C, 0x8B9E, 0x8C47, 0x8C54,\n    0x8C73, 0x8CA4, 0x8CD9, 0x8CE1, 0x8CF8, 0x8CFE, 0x8D1B, 0x8D69,\n    0x8D6C, 0x8D84, 0x8D8D, 0x8D95, 0x8DA6, 0x8DC6, 0x8DCE, 0x8DE4,\n    0x8DEC, 0x8E20, 0x8E4B, 0x8E6C, 0x8E70, 0x8E7A, 0x8E92, 0x8EAE,\n    0x8EB3, 0x8ED1, 0x8ED4, 0x8EF9, 0x8F17, 0x8F36, 0x8FA6, 0x8FB5,\n    0x8FB6, 0x8FC6, 0x8FE0, 0x8FE4, 0x8FF6, 0x9002, 0x902C, 0x9044,\n    0x9088, 0x9095, 0x9099, 0x909B, 0x90A2, 0x90B4, 0x90D7, 0x90DD,\n    0x90F4, 0x9117, 0x911C, 0x9131, 0x913A, 0x913D, 0x9148, 0x915B,\n    0x9161, 0x9164, 0x918E, 0x919E, 0x91A8, 0x91AD, 0x91AE, 0x91B2,\n    0x91BC, 0x91F0, 0x91F7, 0x91FB, 0x9207, 0x9228, 0x9233, 0x9238,\n    0x9243, 0x9247, 0x924F, 0x9260, 0x92C2, 0x92CB, 0x92CC, 0x92DF,\n    0x930D, 0x9315, 0x931F, 0x9327, 0x9347, 0x9352, 0x9365, 0x936A,\n    0x936D, 0x939B, 0x93BA, 0x93A9, 0x93C1, 0x93CA, 0x93E2, 0x93FA,\n    0x93FD, 0x940F, 0x9434, 0x943F, 0x9455, 0x946B, 0x9472, 0x9578,\n    0x95A6, 0x95A9, 0x95AB, 0x95B4, 0x95BD, 0x95DA, 0x961D, 0x9641,\n    0x9658, 0x9684, 0x96A4, 0x96A9, 0x96D2, 0x5DB2, 0x96DE, 0x96E9,\n    0x96F1, 0x9702, 0x9709, 0x975A, 0x9763, 0x976E, 0x9773, 0x979A,\n    0x97A2, 0x97B5, 0x97B6, 0x97D9, 0x97DE, 0x97F4, 0x980A, 0x980E,\n    0x981E, 0x9823, 0x982B, 0x983E, 0x9852, 0x9853, 0x9859, 0x986C,\n    0x98B8, 0x98BA, 0x98BF, 0x98C8, 0x98E5, 0x9932, 0x9933, 0x9940,\n    0x994D, 0x995C, 0x995F, 0x99B1, 0x99B9, 0x99BA, 0x99C9, 0x9A02,\n    0x9A16, 0x9A24, 0x9A27, 0x9A2D, 0x9A2E, 0x9A36, 0x9A38, 0x9A4A,\n    0x9A56, 0x9AB5, 0x9AB6, 0x9AF9, 0x9B03, 0x9B20, 0x9B33, 0x9B34,\n    0x9B73, 0x9B79, 0x9BA7, 0x9BC1, 0x9BC7, 0x9BD7, 0x9BE7, 0x9BEB,\n    0x9BF7, 0x9BFA, 0x9BFD, 0x9C0B, 0x9C27, 0x9C2A, 0x9C36, 0x9C41,\n    0x9C53, 0x9C63, 0x9C6A, 0x9C77, 0x9D02, 0x9D42, 0x9D47, 0x9D63,\n    0x9D69, 0x9D7C, 0x9D7E, 0x9D8D, 0x9DB1, 0x9DC3, 0x9DC7, 0x9DD6,\n    0x9DDF, 0x9DEB, 0x9DF4, 0x9E15, 0x9E1D, 0x9EA4, 0x9EA8, 0x9EAC,\n    0x9EE7, 0x9EEE, 0x9F10, 0x9F12, 0x9F17, 0x9F19, 0x9F2F, 0x9F37,\n    0x9F39, 0x9F41, 0x9F45, 0x9F57, 0x9F68, 0x9F71, 0x9F75, 0x9F90,\n    0x9F94, 0x9FA2, 0x4E30, 0x3405, 0x4F60, 0x5620, 0x5ECB, 0x2E95,\n    0x60A4, 0x69D7, 0x6B24, 0x6FF9, 0x6EE6, 0x71B3, 0x2EA4, 0x7AC6,\n    0x7F61, 0x8071, 0x809E, 0x2ECC, 0x91F0, 0x5DB2, 0x97DE, 0x4FD3,\n    0x50D9, 0x50F0, 0x51C3, 0x5676, 0x6A54, 0x6D01, 0x6DD0, 0x6E42,\n    0x6ED9, 0x73E4, 0x7421, 0x756C, 0x7851, 0x87F5, 0xFFFD, 0x73A8,\n    0x3AF3, 0x34DB, 0x440C, 0x3E8A, 0xFFFD, 0xFFFD, 0x4BE8, 0xFFFD,\n    0x3EDA, 0x3B22, 0xFFFD, 0x457A, 0x4093, 0xFFFD, 0x4665, 0x4103,\n    0x4293, 0x46AE, 0x3488, 0xFFFD,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-H_1.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_EUC_H_1[120 * 3] = {\n    0x0020, 0x007E, 0x00E7, 0x8EA0, 0x8EDF, 0x0146, 0xA1A1, 0xA1FE, 0x0279,\n    0xA2A1, 0xA2AE, 0x02D7, 0xA2BA, 0xA2C1, 0x02E5, 0xA2CA, 0xA2D0, 0x02ED,\n    0xA2DC, 0xA2EA, 0x02F4, 0xA2F2, 0xA2F9, 0x0303, 0xA2FE, 0xA2FE, 0x030B,\n    0xA3B0, 0xA3B9, 0x030C, 0xA3C1, 0xA3DA, 0x0316, 0xA3E1, 0xA3FA, 0x0330,\n    0xA4A1, 0xA4F3, 0x034A, 0xA5A1, 0xA5F6, 0x039D, 0xA6A1, 0xA6B8, 0x03F3,\n    0xA6C1, 0xA6D8, 0x040B, 0xA7A1, 0xA7C1, 0x0423, 0xA7D1, 0xA7F1, 0x0444,\n    0xA8A1, 0xA8A1, 0x1D37, 0xA8A2, 0xA8A2, 0x1D39, 0xA8A3, 0xA8A3, 0x1D43,\n    0xA8A4, 0xA8A4, 0x1D47, 0xA8A5, 0xA8A5, 0x1D4F, 0xA8A6, 0xA8A6, 0x1D4B,\n    0xA8A7, 0xA8A7, 0x1D53, 0xA8A8, 0xA8A8, 0x1D63, 0xA8A9, 0xA8A9, 0x1D5B,\n    0xA8AA, 0xA8AA, 0x1D6B, 0xA8AB, 0xA8AB, 0x1D73, 0xA8AC, 0xA8AC, 0x1D38,\n    0xA8AD, 0xA8AD, 0x1D3A, 0xA8AE, 0xA8AE, 0x1D46, 0xA8AF, 0xA8AF, 0x1D4A,\n    0xA8B0, 0xA8B0, 0x1D52, 0xA8B1, 0xA8B1, 0x1D4E, 0xA8B2, 0xA8B2, 0x1D5A,\n    0xA8B3, 0xA8B3, 0x1D6A, 0xA8B4, 0xA8B4, 0x1D62, 0xA8B5, 0xA8B5, 0x1D72,\n    0xA8B6, 0xA8B6, 0x1D82, 0xA8B7, 0xA8B7, 0x1D57, 0xA8B8, 0xA8B8, 0x1D66,\n    0xA8B9, 0xA8B9, 0x1D5F, 0xA8BA, 0xA8BA, 0x1D6E, 0xA8BB, 0xA8BB, 0x1D76,\n    0xA8BC, 0xA8BC, 0x1D54, 0xA8BD, 0xA8BD, 0x1D67, 0xA8BE, 0xA8BE, 0x1D5C,\n    0xA8BF, 0xA8BF, 0x1D6F, 0xA8C0, 0xA8C0, 0x1D79, 0xB0A1, 0xB0FE, 0x0465,\n    0xB1A1, 0xB1FE, 0x04C3, 0xB2A1, 0xB2FE, 0x0521, 0xB3A1, 0xB3FE, 0x057F,\n    0xB4A1, 0xB4FE, 0x05DD, 0xB5A1, 0xB5FE, 0x063B, 0xB6A1, 0xB6FE, 0x0699,\n    0xB7A1, 0xB7FE, 0x06F7, 0xB8A1, 0xB8FE, 0x0755, 0xB9A1, 0xB9FE, 0x07B3,\n    0xBAA1, 0xBAFE, 0x0811, 0xBBA1, 0xBBFE, 0x086F, 0xBCA1, 0xBCFE, 0x08CD,\n    0xBDA1, 0xBDFE, 0x092B, 0xBEA1, 0xBEFE, 0x0989, 0xBFA1, 0xBFFE, 0x09E7,\n    0xC0A1, 0xC0FE, 0x0A45, 0xC1A1, 0xC1FE, 0x0AA3, 0xC2A1, 0xC2FE, 0x0B01,\n    0xC3A1, 0xC3FE, 0x0B5F, 0xC4A1, 0xC4FE, 0x0BBD, 0xC5A1, 0xC5FE, 0x0C1B,\n    0xC6A1, 0xC6FE, 0x0C79, 0xC7A1, 0xC7FE, 0x0CD7, 0xC8A1, 0xC8FE, 0x0D35,\n    0xC9A1, 0xC9FE, 0x0D93, 0xCAA1, 0xCAFE, 0x0DF1, 0xCBA1, 0xCBFE, 0x0E4F,\n    0xCCA1, 0xCCFE, 0x0EAD, 0xCDA1, 0xCDFE, 0x0F0B, 0xCEA1, 0xCEFE, 0x0F69,\n    0xCFA1, 0xCFD3, 0x0FC7, 0xD0A1, 0xD0FE, 0x0FFA, 0xD1A1, 0xD1FE, 0x1058,\n    0xD2A1, 0xD2FE, 0x10B6, 0xD3A1, 0xD3FE, 0x1114, 0xD4A1, 0xD4FE, 0x1172,\n    0xD5A1, 0xD5FE, 0x11D0, 0xD6A1, 0xD6FE, 0x122E, 0xD7A1, 0xD7FE, 0x128C,\n    0xD8A1, 0xD8FE, 0x12EA, 0xD9A1, 0xD9FE, 0x1348, 0xDAA1, 0xDAFE, 0x13A6,\n    0xDBA1, 0xDBFE, 0x1404, 0xDCA1, 0xDCFE, 0x1462, 0xDDA1, 0xDDFE, 0x14C0,\n    0xDEA1, 0xDEFE, 0x151E, 0xDFA1, 0xDFFE, 0x157C, 0xE0A1, 0xE0FE, 0x15DA,\n    0xE1A1, 0xE1FE, 0x1638, 0xE2A1, 0xE2FE, 0x1696, 0xE3A1, 0xE3FE, 0x16F4,\n    0xE4A1, 0xE4FE, 0x1752, 0xE5A1, 0xE5FE, 0x17B0, 0xE6A1, 0xE6FE, 0x180E,\n    0xE7A1, 0xE7FE, 0x186C, 0xE8A1, 0xE8FE, 0x18CA, 0xE9A1, 0xE9FE, 0x1928,\n    0xEAA1, 0xEAFE, 0x1986, 0xEBA1, 0xEBFE, 0x19E4, 0xECA1, 0xECFE, 0x1A42,\n    0xEDA1, 0xEDFE, 0x1AA0, 0xEEA1, 0xEEFE, 0x1AFE, 0xEFA1, 0xEFFE, 0x1B5C,\n    0xF0A1, 0xF0FE, 0x1BBA, 0xF1A1, 0xF1FE, 0x1C18, 0xF2A1, 0xF2FE, 0x1C76,\n    0xF3A1, 0xF3FE, 0x1CD4, 0xF4A1, 0xF4A4, 0x1D32, 0xF4A5, 0xF4A6, 0x205C,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-V_1.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_EUC_V_1[27 * 3] = {\n    0xA1A2, 0xA1A3, 0x1ECF, 0xA1B1, 0xA1B2, 0x1ED1, 0xA1BC, 0xA1BE, 0x1ED3,\n    0xA1C1, 0xA1C5, 0x1ED6, 0xA1CA, 0xA1DB, 0x1EDB, 0xA1E1, 0xA1E1, 0x1EED,\n    0xA4A1, 0xA4A1, 0x1EEE, 0xA4A3, 0xA4A3, 0x1EEF, 0xA4A5, 0xA4A5, 0x1EF0,\n    0xA4A7, 0xA4A7, 0x1EF1, 0xA4A9, 0xA4A9, 0x1EF2, 0xA4C3, 0xA4C3, 0x1EF3,\n    0xA4E3, 0xA4E3, 0x1EF4, 0xA4E5, 0xA4E5, 0x1EF5, 0xA4E7, 0xA4E7, 0x1EF6,\n    0xA4EE, 0xA4EE, 0x1EF7, 0xA5A1, 0xA5A1, 0x1EF8, 0xA5A3, 0xA5A3, 0x1EF9,\n    0xA5A5, 0xA5A5, 0x1EFA, 0xA5A7, 0xA5A7, 0x1EFB, 0xA5A9, 0xA5A9, 0x1EFC,\n    0xA5C3, 0xA5C3, 0x1EFD, 0xA5E3, 0xA5E3, 0x1EFE, 0xA5E5, 0xA5E5, 0x1EFF,\n    0xA5E7, 0xA5E7, 0x1F00, 0xA5EE, 0xA5EE, 0x1F01, 0xA5F5, 0xA5F6, 0x1F02,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Japan1/Ext-RKSJ-H_2.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_Ext_RKSJ_H_2[665 * 3] = {\n    0x0020, 0x007E, 0x00E7, 0x00A0, 0x00DF, 0x0146, 0x8140, 0x817E, 0x0279,\n    0x8180, 0x8188, 0x02B8, 0x8189, 0x8189, 0x1D36, 0x818A, 0x81AC, 0x02C2,\n    0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316, 0x8281, 0x829A, 0x0330,\n    0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D, 0x8380, 0x8396, 0x03DC,\n    0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B, 0x8440, 0x8460, 0x0423,\n    0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453, 0x8540, 0x857E, 0x00E8,\n    0x8580, 0x8580, 0x0186, 0x8581, 0x859E, 0x0128, 0x859F, 0x85DD, 0x0147,\n    0x85DE, 0x85FC, 0x0187, 0x8640, 0x867E, 0x01A6, 0x8680, 0x8691, 0x01E5,\n    0x8692, 0x8692, 0x0127, 0x8693, 0x869E, 0x01F7, 0x86A2, 0x86ED, 0x1D37,\n    0x8740, 0x875D, 0x1D83, 0x875F, 0x8775, 0x1DA1, 0x877E, 0x877E, 0x2083,\n    0x8780, 0x878F, 0x1DB8, 0x8790, 0x8790, 0x02FA, 0x8791, 0x8791, 0x02F9,\n    0x8792, 0x8792, 0x0301, 0x8793, 0x8799, 0x1DC8, 0x879A, 0x879A, 0x0300,\n    0x879B, 0x879C, 0x1DCF, 0x889F, 0x889F, 0x0465, 0x88A0, 0x88A0, 0x1DD1,\n    0x88A1, 0x88B0, 0x0467, 0x88B1, 0x88B1, 0x1CA2, 0x88B2, 0x88B8, 0x0478,\n    0x88B9, 0x88B9, 0x1DD2, 0x88BA, 0x88EB, 0x0480, 0x88EC, 0x88EC, 0x1DD3,\n    0x88ED, 0x88F0, 0x04B3, 0x88F1, 0x88F1, 0x1DD4, 0x88F2, 0x88F9, 0x04B8,\n    0x88FA, 0x88FA, 0x1DD5, 0x88FB, 0x88FC, 0x04C1, 0x8940, 0x8948, 0x04C3,\n    0x8949, 0x8949, 0x1DD6, 0x894A, 0x8953, 0x04CD, 0x8954, 0x8954, 0x1DD7,\n    0x8955, 0x8957, 0x04D8, 0x8958, 0x8958, 0x1DD8, 0x8959, 0x895A, 0x04DC,\n    0x895B, 0x895C, 0x1DD9, 0x895D, 0x8960, 0x04E0, 0x8961, 0x8961, 0x1DDB,\n    0x8962, 0x897E, 0x04E5, 0x8980, 0x898A, 0x0502, 0x898B, 0x898B, 0x1DDC,\n    0x898C, 0x89A5, 0x050E, 0x89A6, 0x89A6, 0x1DDD, 0x89A7, 0x89A7, 0x1CC9,\n    0x89A8, 0x89A8, 0x1DDE, 0x89A9, 0x89DD, 0x052B, 0x89DE, 0x89DE, 0x1DDF,\n    0x89DF, 0x89F7, 0x0561, 0x89F8, 0x89F8, 0x1DE0, 0x89F9, 0x89FA, 0x057B,\n    0x89FB, 0x89FB, 0x1DE1, 0x89FC, 0x89FC, 0x057E, 0x8A40, 0x8A40, 0x057F,\n    0x8A41, 0x8A41, 0x1DE2, 0x8A42, 0x8A60, 0x0581, 0x8A61, 0x8A61, 0x1961,\n    0x8A62, 0x8A67, 0x05A1, 0x8A68, 0x8A68, 0x139F, 0x8A69, 0x8A7E, 0x05A8,\n    0x8A80, 0x8A84, 0x05BE, 0x8A85, 0x8A85, 0x1DE3, 0x8A86, 0x8A8A, 0x05C4,\n    0x8A8B, 0x8A8B, 0x1DE4, 0x8A8C, 0x8A92, 0x05CA, 0x8A93, 0x8A93, 0x1DE5,\n    0x8A94, 0x8A95, 0x05D2, 0x8A96, 0x8A96, 0x1731, 0x8A97, 0x8A99, 0x05D5,\n    0x8A9A, 0x8A9A, 0x1DE6, 0x8A9B, 0x8ABF, 0x05D9, 0x8AC0, 0x8AC0, 0x1DE7,\n    0x8AC1, 0x8AC1, 0x1572, 0x8AC2, 0x8ACA, 0x0600, 0x8ACB, 0x8ACB, 0x1DE8,\n    0x8ACC, 0x8ACF, 0x060A, 0x8AD0, 0x8AD0, 0x1A20, 0x8AD1, 0x8AE2, 0x060F,\n    0x8AE3, 0x8AE3, 0x1DE9, 0x8AE4, 0x8AFC, 0x0622, 0x8B40, 0x8B49, 0x063B,\n    0x8B4A, 0x8B4A, 0x1DEA, 0x8B4B, 0x8B5E, 0x0646, 0x8B5F, 0x8B5F, 0x1DEB,\n    0x8B60, 0x8B7E, 0x065B, 0x8B80, 0x8B9F, 0x067A, 0x8BA0, 0x8BA0, 0x1DEC,\n    0x8BA1, 0x8BA7, 0x069B, 0x8BA8, 0x8BA8, 0x1DED, 0x8BA9, 0x8BC3, 0x06A3,\n    0x8BC4, 0x8BC4, 0x1D32, 0x8BC5, 0x8BCC, 0x06BF, 0x8BCD, 0x8BCD, 0x1DEE,\n    0x8BCE, 0x8BEA, 0x06C8, 0x8BEB, 0x8BEB, 0x1DEF, 0x8BEC, 0x8BF1, 0x06E6,\n    0x8BF2, 0x8BF2, 0x1DF0, 0x8BF3, 0x8BF8, 0x06ED, 0x8BF9, 0x8BF9, 0x1DF1,\n    0x8BFA, 0x8BFA, 0x06F4, 0x8BFB, 0x8BFB, 0x1DF2, 0x8BFC, 0x8BFC, 0x06F6,\n    0x8C40, 0x8C42, 0x06F7, 0x8C43, 0x8C43, 0x1DF3, 0x8C44, 0x8C55, 0x06FB,\n    0x8C56, 0x8C56, 0x1DF4, 0x8C57, 0x8C63, 0x070E, 0x8C64, 0x8C64, 0x1DF5,\n    0x8C65, 0x8C6C, 0x071C, 0x8C6D, 0x8C6D, 0x1DF6, 0x8C6E, 0x8C70, 0x0725,\n    0x8C71, 0x8C71, 0x1DF7, 0x8C72, 0x8C73, 0x0729, 0x8C74, 0x8C74, 0x1DF8,\n    0x8C75, 0x8C79, 0x072C, 0x8C7A, 0x8C7A, 0x1C0D, 0x8C7B, 0x8C7E, 0x0732,\n    0x8C80, 0x8C83, 0x0736, 0x8C84, 0x8C84, 0x1DF9, 0x8C85, 0x8C90, 0x073B,\n    0x8C91, 0x8C91, 0x1DFA, 0x8C92, 0x8C98, 0x0748, 0x8C99, 0x8C99, 0x1DFB,\n    0x8C9A, 0x8C9D, 0x0750, 0x8C9E, 0x8C9E, 0x1DFC, 0x8C9F, 0x8CB1, 0x0755,\n    0x8CB2, 0x8CB2, 0x1DFD, 0x8CB3, 0x8CBE, 0x0769, 0x8CBF, 0x8CBF, 0x1DFE,\n    0x8CC0, 0x8CFC, 0x0776, 0x8D40, 0x8D49, 0x07B3, 0x8D4A, 0x8D4A, 0x1DFF,\n    0x8D4B, 0x8D55, 0x07BE, 0x8D56, 0x8D56, 0x1E00, 0x8D57, 0x8D60, 0x07CA,\n    0x8D61, 0x8D61, 0x1E01, 0x8D62, 0x8D7A, 0x07D5, 0x8D7B, 0x8D7B, 0x16DD,\n    0x8D7C, 0x8D7E, 0x07EF, 0x8D80, 0x8D8C, 0x07F2, 0x8D8D, 0x8D8D, 0x1E02,\n    0x8D8E, 0x8D93, 0x0800, 0x8D94, 0x8D94, 0x1E03, 0x8D95, 0x8D98, 0x0807,\n    0x8D99, 0x8D99, 0x1E04, 0x8D9A, 0x8DD0, 0x080C, 0x8DD1, 0x8DD1, 0x1E05,\n    0x8DD2, 0x8DE4, 0x0844, 0x8DE5, 0x8DE5, 0x1E06, 0x8DE6, 0x8DF1, 0x0858,\n    0x8DF2, 0x8DF2, 0x1E07, 0x8DF3, 0x8DFC, 0x0865, 0x8E40, 0x8E45, 0x086F,\n    0x8E46, 0x8E46, 0x1E08, 0x8E47, 0x8E48, 0x0876, 0x8E49, 0x8E49, 0x1E09,\n    0x8E4A, 0x8E4A, 0x0879, 0x8E4B, 0x8E4B, 0x1E0A, 0x8E4C, 0x8E57, 0x087B,\n    0x8E58, 0x8E58, 0x1E0B, 0x8E59, 0x8E7E, 0x0888, 0x8E80, 0x8EB5, 0x08AE,\n    0x8EB6, 0x8EB6, 0x1E0C, 0x8EB7, 0x8EC5, 0x08E5, 0x8EC6, 0x8EC6, 0x1E0D,\n    0x8EC7, 0x8EC7, 0x1929, 0x8EC8, 0x8ED4, 0x08F6, 0x8ED5, 0x8ED5, 0x1E0E,\n    0x8ED6, 0x8EDA, 0x0904, 0x8EDB, 0x8EDC, 0x1E0F, 0x8EDD, 0x8EFC, 0x090B,\n    0x8F40, 0x8F49, 0x092B, 0x8F4A, 0x8F4A, 0x1E11, 0x8F4B, 0x8F54, 0x0936,\n    0x8F55, 0x8F55, 0x1E12, 0x8F56, 0x8F7E, 0x0941, 0x8F80, 0x8F8B, 0x096A,\n    0x8F8C, 0x8F8D, 0x1E13, 0x8F8E, 0x8F91, 0x0978, 0x8F92, 0x8F93, 0x1E15,\n    0x8F94, 0x8FA2, 0x097E, 0x8FA3, 0x8FA3, 0x1E17, 0x8FA4, 0x8FB0, 0x098E,\n    0x8FB1, 0x8FB1, 0x1E18, 0x8FB2, 0x8FBC, 0x099C, 0x8FBD, 0x8FBD, 0x1E19,\n    0x8FBE, 0x8FD2, 0x09A8, 0x8FD3, 0x8FD3, 0x1E1A, 0x8FD4, 0x8FDC, 0x09BE,\n    0x8FDD, 0x8FDD, 0x1E1B, 0x8FDE, 0x8FE1, 0x09C8, 0x8FE2, 0x8FE2, 0x1E1C,\n    0x8FE3, 0x8FFC, 0x09CD, 0x9040, 0x9048, 0x09E7, 0x9049, 0x9049, 0x1E1D,\n    0x904A, 0x9077, 0x09F1, 0x9078, 0x9078, 0x1E1E, 0x9079, 0x907E, 0x0A20,\n    0x9080, 0x9080, 0x1E1F, 0x9081, 0x9088, 0x0A27, 0x9089, 0x9089, 0x1E20,\n    0x908A, 0x909F, 0x0A30, 0x90A0, 0x90A0, 0x1E21, 0x90A1, 0x90BF, 0x0A47,\n    0x90C0, 0x90C0, 0x1E22, 0x90C1, 0x90E3, 0x0A67, 0x90E4, 0x90E4, 0x1E23,\n    0x90E5, 0x90EE, 0x0A8B, 0x90EF, 0x90F0, 0x1E24, 0x90F1, 0x90F6, 0x0A97,\n    0x90F7, 0x90F8, 0x1E26, 0x90F9, 0x90FC, 0x0A9F, 0x9140, 0x9145, 0x0AA3,\n    0x9146, 0x9146, 0x1E28, 0x9147, 0x9147, 0x1A6E, 0x9148, 0x9157, 0x0AAB,\n    0x9158, 0x9158, 0x1E29, 0x9159, 0x916A, 0x0ABC, 0x916B, 0x916B, 0x1E2A,\n    0x916C, 0x916D, 0x0ACF, 0x916E, 0x916E, 0x1E2B, 0x916F, 0x917D, 0x0AD2,\n    0x917E, 0x917E, 0x1E2C, 0x9180, 0x9188, 0x0AE2, 0x9189, 0x9189, 0x1E2D,\n    0x918A, 0x91BA, 0x0AEC, 0x91BB, 0x91BB, 0x1E2E, 0x91BC, 0x91CA, 0x0B1E,\n    0x91CB, 0x91CB, 0x1E2F, 0x91CC, 0x91D9, 0x0B2E, 0x91DA, 0x91DA, 0x1E30,\n    0x91DB, 0x91E0, 0x0B3D, 0x91E1, 0x91E1, 0x1E31, 0x91E2, 0x91EC, 0x0B44,\n    0x91ED, 0x91ED, 0x1E32, 0x91EE, 0x91F2, 0x0B50, 0x91F3, 0x91F4, 0x1E33,\n    0x91F5, 0x91FA, 0x0B57, 0x91FB, 0x91FB, 0x1E35, 0x91FC, 0x91FC, 0x0B5E,\n    0x9240, 0x9245, 0x0B5F, 0x9246, 0x9246, 0x1E36, 0x9247, 0x9247, 0x0B66,\n    0x9248, 0x9249, 0x1E37, 0x924A, 0x924B, 0x0B69, 0x924C, 0x924D, 0x1E39,\n    0x924E, 0x925B, 0x0B6D, 0x925C, 0x925C, 0x1E3B, 0x925D, 0x927E, 0x0B7C,\n    0x9280, 0x928F, 0x0B9E, 0x9290, 0x9290, 0x1E3C, 0x9291, 0x9294, 0x0BAF,\n    0x9295, 0x9295, 0x1E3D, 0x9296, 0x929B, 0x0BB4, 0x929C, 0x929C, 0x1E3E,\n    0x929D, 0x92BA, 0x0BBB, 0x92BB, 0x92BB, 0x1E3F, 0x92BC, 0x92C5, 0x0BDA,\n    0x92C6, 0x92C6, 0x1E40, 0x92C7, 0x92C7, 0x0BE5, 0x92C8, 0x92C8, 0x1E41,\n    0x92C9, 0x92CA, 0x0BE7, 0x92CB, 0x92CB, 0x1E42, 0x92CC, 0x92CC, 0x0BEA,\n    0x92CD, 0x92CD, 0x1E43, 0x92CE, 0x92D8, 0x0BEC, 0x92D9, 0x92D9, 0x11B5,\n    0x92DA, 0x92FC, 0x0BF8, 0x9340, 0x9340, 0x0C1B, 0x9341, 0x9341, 0x1E44,\n    0x9342, 0x9345, 0x0C1D, 0x9346, 0x9346, 0x1E45, 0x9347, 0x934C, 0x0C22,\n    0x934D, 0x934D, 0x1E46, 0x934E, 0x9354, 0x0C29, 0x9355, 0x9355, 0x1E47,\n    0x9356, 0x935D, 0x0C31, 0x935E, 0x935E, 0x1E48, 0x935F, 0x9366, 0x0C3A,\n    0x9367, 0x9367, 0x1E49, 0x9368, 0x9369, 0x0C43, 0x936A, 0x936A, 0x1E4A,\n    0x936B, 0x936F, 0x0C46, 0x9370, 0x9371, 0x1E4B, 0x9372, 0x9375, 0x0C4D,\n    0x9376, 0x9376, 0x16DF, 0x9377, 0x937E, 0x0C52, 0x9380, 0x9383, 0x0C5A,\n    0x9384, 0x9384, 0x1E4D, 0x9385, 0x938D, 0x0C5F, 0x938E, 0x938E, 0x1450,\n    0x938F, 0x9392, 0x0C69, 0x9393, 0x9393, 0x1536, 0x9394, 0x9397, 0x0C6E,\n    0x9398, 0x9398, 0x1E4E, 0x9399, 0x93BB, 0x0C73, 0x93BC, 0x93BC, 0x1E4F,\n    0x93BD, 0x93BF, 0x0C97, 0x93C0, 0x93C0, 0x1E50, 0x93C1, 0x93D1, 0x0C9B,\n    0x93D2, 0x93D3, 0x1E51, 0x93D4, 0x93D8, 0x0CAE, 0x93D9, 0x93DA, 0x1E53,\n    0x93DB, 0x93DE, 0x0CB5, 0x93DF, 0x93DF, 0x1E55, 0x93E0, 0x93E3, 0x0CBA,\n    0x93E4, 0x93E5, 0x1E56, 0x93E6, 0x93E7, 0x0CC0, 0x93E8, 0x93E8, 0x1E58,\n    0x93E9, 0x93F3, 0x0CC3, 0x93F4, 0x93F4, 0x1AED, 0x93F5, 0x93FC, 0x0CCF,\n    0x9440, 0x9447, 0x0CD7, 0x9448, 0x9448, 0x1E59, 0x9449, 0x9457, 0x0CE0,\n    0x9458, 0x9458, 0x1E5A, 0x9459, 0x9475, 0x0CF0, 0x9476, 0x9476, 0x1E5B,\n    0x9477, 0x947E, 0x0D0E, 0x9480, 0x9486, 0x0D16, 0x9487, 0x9487, 0x1E5C,\n    0x9488, 0x9488, 0x1989, 0x9489, 0x9489, 0x1E5D, 0x948A, 0x948C, 0x0D20,\n    0x948D, 0x948D, 0x1E5E, 0x948E, 0x94A1, 0x0D24, 0x94A2, 0x94A2, 0x1E5F,\n    0x94A3, 0x94AB, 0x0D39, 0x94AC, 0x94AC, 0x1E60, 0x94AD, 0x94AD, 0x0D43,\n    0x94AE, 0x94AE, 0x1E61, 0x94AF, 0x94D1, 0x0D45, 0x94D2, 0x94D2, 0x1E62,\n    0x94D3, 0x94DF, 0x0D69, 0x94E0, 0x94E0, 0x1E63, 0x94E1, 0x94F2, 0x0D77,\n    0x94F3, 0x94F3, 0x1E64, 0x94F4, 0x94FC, 0x0D8A, 0x9540, 0x9540, 0x0D93,\n    0x9541, 0x9542, 0x1E65, 0x9543, 0x954D, 0x0D96, 0x954E, 0x954E, 0x1E67,\n    0x954F, 0x954F, 0x143B, 0x9550, 0x9550, 0x0DA3, 0x9551, 0x9551, 0x1E68,\n    0x9552, 0x9553, 0x0DA5, 0x9554, 0x9554, 0x1E69, 0x9555, 0x955E, 0x0DA8,\n    0x955F, 0x955F, 0x1E6A, 0x9560, 0x956C, 0x0DB3, 0x956D, 0x956D, 0x1E6B,\n    0x956E, 0x956F, 0x0DC1, 0x9570, 0x9570, 0x1E6C, 0x9571, 0x957E, 0x0DC4,\n    0x9580, 0x95C0, 0x0DD2, 0x95C1, 0x95C1, 0x1E6D, 0x95C2, 0x95CA, 0x0E14,\n    0x95CB, 0x95CB, 0x1E6E, 0x95CC, 0x95D7, 0x0E1E, 0x95D8, 0x95D8, 0x1E6F,\n    0x95D9, 0x95F6, 0x0E2B, 0x95F7, 0x95F7, 0x1E70, 0x95F8, 0x95FC, 0x0E4A,\n    0x9640, 0x9640, 0x0E4F, 0x9641, 0x9641, 0x1E71, 0x9642, 0x9647, 0x0E51,\n    0x9648, 0x9648, 0x1E72, 0x9649, 0x9669, 0x0E58, 0x966A, 0x966A, 0x1E73,\n    0x966B, 0x967E, 0x0E7A, 0x9680, 0x9689, 0x0E8E, 0x968A, 0x968A, 0x1D33,\n    0x968B, 0x968F, 0x0E99, 0x9690, 0x9690, 0x1E74, 0x9691, 0x9698, 0x0E9F,\n    0x9699, 0x9699, 0x102F, 0x969A, 0x96CA, 0x0EA8, 0x96CB, 0x96CB, 0x1E75,\n    0x96CC, 0x96D6, 0x0EDA, 0x96D7, 0x96D7, 0x1E76, 0x96D8, 0x96DC, 0x0EE6,\n    0x96DD, 0x96DD, 0x1E77, 0x96DE, 0x96DF, 0x0EEC, 0x96E0, 0x96E0, 0x1E78,\n    0x96E1, 0x96F6, 0x0EEF, 0x96F7, 0x96F7, 0x1935, 0x96F8, 0x96F8, 0x1E79,\n    0x96F9, 0x96F9, 0x0F07, 0x96FA, 0x96FA, 0x1E7A, 0x96FB, 0x96FB, 0x0F09,\n    0x96FC, 0x96FC, 0x1E7B, 0x9740, 0x9750, 0x0F0B, 0x9751, 0x9751, 0x1E7C,\n    0x9752, 0x976E, 0x0F1D, 0x976F, 0x976F, 0x1E7D, 0x9770, 0x9772, 0x0F3B,\n    0x9773, 0x9773, 0x1E7E, 0x9774, 0x9778, 0x0F3F, 0x9779, 0x9779, 0x1D34,\n    0x977A, 0x977E, 0x0F45, 0x9780, 0x9788, 0x0F4A, 0x9789, 0x9789, 0x1E7F,\n    0x978A, 0x97C8, 0x0F54, 0x97C9, 0x97C9, 0x1E80, 0x97CA, 0x97F7, 0x0F94,\n    0x97F8, 0x97F9, 0x1E81, 0x97FA, 0x97FC, 0x0FC4, 0x9840, 0x9840, 0x1E83,\n    0x9841, 0x984F, 0x0FC8, 0x9850, 0x9850, 0x1E84, 0x9851, 0x9854, 0x0FD8,\n    0x9855, 0x9855, 0x1777, 0x9856, 0x9857, 0x0FDD, 0x9858, 0x9858, 0x1E85,\n    0x9859, 0x9872, 0x0FE0, 0x989F, 0x98D3, 0x0FFA, 0x98D4, 0x98D4, 0x0EA7,\n    0x98D5, 0x98FC, 0x1030, 0x9940, 0x995B, 0x1058, 0x995C, 0x995C, 0x1E86,\n    0x995D, 0x9965, 0x1075, 0x9966, 0x9966, 0x1E87, 0x9967, 0x9969, 0x107F,\n    0x996A, 0x996A, 0x1E88, 0x996B, 0x996B, 0x1083, 0x996C, 0x996C, 0x1E89,\n    0x996D, 0x997E, 0x1085, 0x9980, 0x99FC, 0x1097, 0x9A40, 0x9A4E, 0x1114,\n    0x9A4F, 0x9A4F, 0x1E8A, 0x9A50, 0x9A58, 0x1124, 0x9A59, 0x9A59, 0x1E8B,\n    0x9A5A, 0x9A6E, 0x112E, 0x9A6F, 0x9A6F, 0x1E8C, 0x9A70, 0x9A7C, 0x1144,\n    0x9A7D, 0x9A7D, 0x1E8D, 0x9A7E, 0x9A7E, 0x1152, 0x9A80, 0x9A8A, 0x1153,\n    0x9A8B, 0x9A8B, 0x1E8E, 0x9A8C, 0x9AC1, 0x115F, 0x9AC2, 0x9AC2, 0x1E8F,\n    0x9AC3, 0x9AE1, 0x1196, 0x9AE2, 0x9AE2, 0x0BF7, 0x9AE3, 0x9AFC, 0x11B6,\n    0x9B40, 0x9B5B, 0x11D0, 0x9B5C, 0x9B5C, 0x1E90, 0x9B5D, 0x9B7E, 0x11ED,\n    0x9B80, 0x9B82, 0x120F, 0x9B83, 0x9B83, 0x1E91, 0x9B84, 0x9B9F, 0x1213,\n    0x9BA0, 0x9BA0, 0x1E92, 0x9BA1, 0x9BEF, 0x1230, 0x9BF0, 0x9BF0, 0x1E93,\n    0x9BF1, 0x9BFC, 0x1280, 0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CA1, 0x12CB,\n    0x9CA2, 0x9CA2, 0x1E94, 0x9CA3, 0x9CFC, 0x12EE, 0x9D40, 0x9D7E, 0x1348,\n    0x9D80, 0x9D80, 0x1E95, 0x9D81, 0x9D8B, 0x1388, 0x9D8C, 0x9D8C, 0x1E96,\n    0x9D8D, 0x9D97, 0x1394, 0x9D98, 0x9D98, 0x05A7, 0x9D99, 0x9DB6, 0x13A0,\n    0x9DB7, 0x9DB7, 0x1E97, 0x9DB8, 0x9DCA, 0x13BF, 0x9DCB, 0x9DCB, 0x1E98,\n    0x9DCC, 0x9DFC, 0x13D3, 0x9E40, 0x9E63, 0x1404, 0x9E64, 0x9E64, 0x1E99,\n    0x9E65, 0x9E68, 0x1429, 0x9E69, 0x9E69, 0x1E9A, 0x9E6A, 0x9E76, 0x142E,\n    0x9E77, 0x9E77, 0x0DA2, 0x9E78, 0x9E7E, 0x143C, 0x9E80, 0x9E8A, 0x1443,\n    0x9E8B, 0x9E8B, 0x1E9B, 0x9E8C, 0x9E8C, 0x144F, 0x9E8D, 0x9E8D, 0x0C68,\n    0x9E8E, 0x9E93, 0x1451, 0x9E94, 0x9E94, 0x1E9C, 0x9E95, 0x9EFC, 0x1458,\n    0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9FB6, 0x14FF, 0x9FB7, 0x9FB7, 0x0C6D,\n    0x9FB8, 0x9FCD, 0x1537, 0x9FCE, 0x9FCE, 0x1E9D, 0x9FCF, 0x9FF2, 0x154E,\n    0x9FF3, 0x9FF3, 0x05FF, 0x9FF4, 0x9FFC, 0x1573, 0xE040, 0xE07E, 0x157C,\n    0xE080, 0xE092, 0x15BB, 0xE093, 0xE093, 0x1E9E, 0xE094, 0xE0A3, 0x15CF,\n    0xE0A4, 0xE0A4, 0x1E9F, 0xE0A5, 0xE0DC, 0x15E0, 0xE0DD, 0xE0DD, 0x1EA0,\n    0xE0DE, 0xE0F3, 0x1619, 0xE0F4, 0xE0F4, 0x1D35, 0xE0F5, 0xE0FC, 0x1630,\n    0xE140, 0xE149, 0x1638, 0xE14A, 0xE14A, 0x1EA1, 0xE14B, 0xE14E, 0x1643,\n    0xE14F, 0xE150, 0x1EA2, 0xE151, 0xE17E, 0x1649, 0xE180, 0xE1A8, 0x1677,\n    0xE1A9, 0xE1A9, 0x1EA4, 0xE1AA, 0xE1E5, 0x16A1, 0xE1E6, 0xE1E6, 0x07EE,\n    0xE1E7, 0xE1E7, 0x16DE, 0xE1E8, 0xE1E8, 0x0C51, 0xE1E9, 0xE1EC, 0x16E0,\n    0xE1ED, 0xE1ED, 0x1EA5, 0xE1EE, 0xE1FC, 0x16E5, 0xE240, 0xE268, 0x16F4,\n    0xE269, 0xE269, 0x1EA6, 0xE26A, 0xE272, 0x171E, 0xE273, 0xE273, 0x1EA7,\n    0xE274, 0xE27C, 0x1728, 0xE27D, 0xE27D, 0x05D4, 0xE27E, 0xE27E, 0x1732,\n    0xE280, 0xE2B6, 0x1733, 0xE2B7, 0xE2B7, 0x1EA8, 0xE2B8, 0xE2C3, 0x176B,\n    0xE2C4, 0xE2C4, 0x0FDC, 0xE2C5, 0xE2E1, 0x1778, 0xE2E2, 0xE2E2, 0x1EA9,\n    0xE2E3, 0xE2EB, 0x1796, 0xE2EC, 0xE2EC, 0x1EAA, 0xE2ED, 0xE2FC, 0x17A0,\n    0xE340, 0xE357, 0x17B0, 0xE358, 0xE358, 0x1EAB, 0xE359, 0xE359, 0x17C9,\n    0xE35A, 0xE35A, 0x1EAC, 0xE35B, 0xE364, 0x17CB, 0xE365, 0xE365, 0x1EAD,\n    0xE366, 0xE37E, 0x17D6, 0xE380, 0xE3C3, 0x17EF, 0xE3C4, 0xE3C4, 0x1EAE,\n    0xE3C5, 0xE3FC, 0x1834, 0xE440, 0xE47E, 0x186C, 0xE480, 0xE483, 0x18AB,\n    0xE484, 0xE484, 0x1EAF, 0xE485, 0xE488, 0x18B0, 0xE489, 0xE489, 0x1EB0,\n    0xE48A, 0xE491, 0x18B5, 0xE492, 0xE492, 0x1EB1, 0xE493, 0xE4B1, 0x18BE,\n    0xE4B2, 0xE4B2, 0x1EB2, 0xE4B3, 0xE4B8, 0x18DE, 0xE4B9, 0xE4B9, 0x1EB3,\n    0xE4BA, 0xE4F1, 0x18E5, 0xE4F2, 0xE4F2, 0x1EB4, 0xE4F3, 0xE4FC, 0x191E,\n    0xE540, 0xE540, 0x1928, 0xE541, 0xE541, 0x08F5, 0xE542, 0xE54C, 0x192A,\n    0xE54D, 0xE54D, 0x0F05, 0xE54E, 0xE55A, 0x1936, 0xE55B, 0xE55B, 0x1EB5,\n    0xE55C, 0xE578, 0x1944, 0xE579, 0xE579, 0x05A0, 0xE57A, 0xE57E, 0x1962,\n    0xE580, 0xE5A1, 0x1967, 0xE5A2, 0xE5A2, 0x0D1E, 0xE5A3, 0xE5A4, 0x198A,\n    0xE5A5, 0xE5A5, 0x1EB6, 0xE5A6, 0xE5BA, 0x198D, 0xE5BB, 0xE5BB, 0x1EB7,\n    0xE5BC, 0xE5EC, 0x19A3, 0xE5ED, 0xE5ED, 0x1EB8, 0xE5EE, 0xE5FC, 0x19D5,\n    0xE640, 0xE650, 0x19E4, 0xE651, 0xE651, 0x1EB9, 0xE652, 0xE67B, 0x19F6,\n    0xE67C, 0xE67C, 0x060E, 0xE67D, 0xE67E, 0x1A21, 0xE680, 0xE685, 0x1A23,\n    0xE686, 0xE686, 0x1EBA, 0xE687, 0xE695, 0x1A2A, 0xE696, 0xE696, 0x1EBB,\n    0xE697, 0xE6CA, 0x1A3A, 0xE6CB, 0xE6CB, 0x0AAA, 0xE6CC, 0xE6E6, 0x1A6F,\n    0xE6E7, 0xE6E7, 0x1EBC, 0xE6E8, 0xE6F1, 0x1A8B, 0xE6F2, 0xE6F2, 0x1EBD,\n    0xE6F3, 0xE6FC, 0x1A96, 0xE740, 0xE76C, 0x1AA0, 0xE76D, 0xE76D, 0x1EBE,\n    0xE76E, 0xE77E, 0x1ACE, 0xE780, 0xE78B, 0x1ADF, 0xE78C, 0xE78C, 0x1EBF,\n    0xE78D, 0xE78D, 0x1AEC, 0xE78E, 0xE78E, 0x1EC0, 0xE78F, 0xE7A6, 0x1AEE,\n    0xE7A7, 0xE7A7, 0x1EC1, 0xE7A8, 0xE7BA, 0x1B07, 0xE7BB, 0xE7BB, 0x1EC2,\n    0xE7BC, 0xE7D4, 0x1B1B, 0xE7D5, 0xE7D5, 0x1EC3, 0xE7D6, 0xE7FC, 0x1B35,\n    0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE884, 0x1B9B, 0xE885, 0xE885, 0x1EC4,\n    0xE886, 0xE8B0, 0x1BA1, 0xE8B1, 0xE8B1, 0x1EC5, 0xE8B2, 0xE8C2, 0x1BCD,\n    0xE8C3, 0xE8C3, 0x1EC6, 0xE8C4, 0xE8CE, 0x1BDF, 0xE8CF, 0xE8CF, 0x1EC7,\n    0xE8D0, 0xE8D4, 0x1BEB, 0xE8D5, 0xE8D5, 0x1EC8, 0xE8D6, 0xE8F1, 0x1BF1,\n    0xE8F2, 0xE8F2, 0x0731, 0xE8F3, 0xE8F3, 0x1EC9, 0xE8F4, 0xE8FC, 0x1C0F,\n    0xE940, 0xE97E, 0x1C18, 0xE980, 0xE9AA, 0x1C57, 0xE9AB, 0xE9AB, 0x1ECA,\n    0xE9AC, 0xE9B9, 0x1C83, 0xE9BA, 0xE9BA, 0x1ECB, 0xE9BB, 0xE9CA, 0x1C92,\n    0xE9CB, 0xE9CB, 0x0477, 0xE9CC, 0xE9CC, 0x1ECC, 0xE9CD, 0xE9F1, 0x1CA4,\n    0xE9F2, 0xE9F2, 0x0529, 0xE9F3, 0xE9FC, 0x1CCA, 0xEA40, 0xEA6F, 0x1CD4,\n    0xEA70, 0xEA70, 0x1ECD, 0xEA71, 0xEA7E, 0x1D05, 0xEA80, 0xEA9C, 0x1D13,\n    0xEA9D, 0xEA9D, 0x1ECE, 0xEA9E, 0xEA9E, 0x1D31, 0xED40, 0xED7E, 0x20A7,\n    0xED80, 0xEDB3, 0x20E6, 0xEDB4, 0xEDB4, 0x07C9, 0xEDB5, 0xEDFC, 0x211A,\n    0xEE40, 0xEE7E, 0x2162, 0xEE80, 0xEEEC, 0x21A1, 0xEEEF, 0xEEF8, 0x1F9C,\n    0xEEF9, 0xEEF9, 0x02EF, 0xEEFA, 0xEEFC, 0x1F45,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Japan1/Ext-RKSJ-V_2.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_Ext_RKSJ_V_2[39 * 3] = {\n    0x8141, 0x8142, 0x1ECF, 0x8143, 0x8143, 0x204C, 0x8144, 0x8144, 0x2052,\n    0x814A, 0x814A, 0x2050, 0x814B, 0x814B, 0x204F, 0x815B, 0x815D, 0x1ED3,\n    0x8160, 0x8164, 0x1ED6, 0x8165, 0x8165, 0x2059, 0x8166, 0x8166, 0x2054,\n    0x8167, 0x8167, 0x2057, 0x8168, 0x8168, 0x2056, 0x8169, 0x817A, 0x1EDB,\n    0x818B, 0x818B, 0x204D, 0x818C, 0x818C, 0x2051, 0x818D, 0x818D, 0x205B,\n    0x81AC, 0x81AC, 0x204E, 0x829F, 0x829F, 0x1EEE, 0x82A1, 0x82A1, 0x1EEF,\n    0x82A3, 0x82A3, 0x1EF0, 0x82A5, 0x82A5, 0x1EF1, 0x82A7, 0x82A7, 0x1EF2,\n    0x82C1, 0x82C1, 0x1EF3, 0x82E1, 0x82E1, 0x1EF4, 0x82E3, 0x82E3, 0x1EF5,\n    0x82E5, 0x82E5, 0x1EF6, 0x82EC, 0x82EC, 0x1EF7, 0x8340, 0x8340, 0x1EF8,\n    0x8342, 0x8342, 0x1EF9, 0x8344, 0x8344, 0x1EFA, 0x8346, 0x8346, 0x1EFB,\n    0x8348, 0x8348, 0x1EFC, 0x8362, 0x8362, 0x1EFD, 0x8383, 0x8383, 0x1EFE,\n    0x8385, 0x8385, 0x1EFF, 0x8387, 0x8387, 0x1F00, 0x838E, 0x838E, 0x1F01,\n    0x8395, 0x8396, 0x1F02, 0x875F, 0x876E, 0x1F04, 0x8780, 0x8781, 0x1F14,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Japan1/H_1.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_H_1[118 * 3] = {\n    0x2121, 0x217E, 0x0279, 0x2221, 0x222E, 0x02D7, 0x223A, 0x2241, 0x02E5,\n    0x224A, 0x2250, 0x02ED, 0x225C, 0x226A, 0x02F4, 0x2272, 0x2279, 0x0303,\n    0x227E, 0x227E, 0x030B, 0x2330, 0x2339, 0x030C, 0x2341, 0x235A, 0x0316,\n    0x2361, 0x237A, 0x0330, 0x2421, 0x2473, 0x034A, 0x2521, 0x2576, 0x039D,\n    0x2621, 0x2638, 0x03F3, 0x2641, 0x2658, 0x040B, 0x2721, 0x2741, 0x0423,\n    0x2751, 0x2771, 0x0444, 0x2821, 0x2821, 0x1D37, 0x2822, 0x2822, 0x1D39,\n    0x2823, 0x2823, 0x1D43, 0x2824, 0x2824, 0x1D47, 0x2825, 0x2825, 0x1D4F,\n    0x2826, 0x2826, 0x1D4B, 0x2827, 0x2827, 0x1D53, 0x2828, 0x2828, 0x1D63,\n    0x2829, 0x2829, 0x1D5B, 0x282A, 0x282A, 0x1D6B, 0x282B, 0x282B, 0x1D73,\n    0x282C, 0x282C, 0x1D38, 0x282D, 0x282D, 0x1D3A, 0x282E, 0x282E, 0x1D46,\n    0x282F, 0x282F, 0x1D4A, 0x2830, 0x2830, 0x1D52, 0x2831, 0x2831, 0x1D4E,\n    0x2832, 0x2832, 0x1D5A, 0x2833, 0x2833, 0x1D6A, 0x2834, 0x2834, 0x1D62,\n    0x2835, 0x2835, 0x1D72, 0x2836, 0x2836, 0x1D82, 0x2837, 0x2837, 0x1D57,\n    0x2838, 0x2838, 0x1D66, 0x2839, 0x2839, 0x1D5F, 0x283A, 0x283A, 0x1D6E,\n    0x283B, 0x283B, 0x1D76, 0x283C, 0x283C, 0x1D54, 0x283D, 0x283D, 0x1D67,\n    0x283E, 0x283E, 0x1D5C, 0x283F, 0x283F, 0x1D6F, 0x2840, 0x2840, 0x1D79,\n    0x3021, 0x307E, 0x0465, 0x3121, 0x317E, 0x04C3, 0x3221, 0x327E, 0x0521,\n    0x3321, 0x337E, 0x057F, 0x3421, 0x347E, 0x05DD, 0x3521, 0x357E, 0x063B,\n    0x3621, 0x367E, 0x0699, 0x3721, 0x377E, 0x06F7, 0x3821, 0x387E, 0x0755,\n    0x3921, 0x397E, 0x07B3, 0x3A21, 0x3A7E, 0x0811, 0x3B21, 0x3B7E, 0x086F,\n    0x3C21, 0x3C7E, 0x08CD, 0x3D21, 0x3D7E, 0x092B, 0x3E21, 0x3E7E, 0x0989,\n    0x3F21, 0x3F7E, 0x09E7, 0x4021, 0x407E, 0x0A45, 0x4121, 0x417E, 0x0AA3,\n    0x4221, 0x427E, 0x0B01, 0x4321, 0x437E, 0x0B5F, 0x4421, 0x447E, 0x0BBD,\n    0x4521, 0x457E, 0x0C1B, 0x4621, 0x467E, 0x0C79, 0x4721, 0x477E, 0x0CD7,\n    0x4821, 0x487E, 0x0D35, 0x4921, 0x497E, 0x0D93, 0x4A21, 0x4A7E, 0x0DF1,\n    0x4B21, 0x4B7E, 0x0E4F, 0x4C21, 0x4C7E, 0x0EAD, 0x4D21, 0x4D7E, 0x0F0B,\n    0x4E21, 0x4E7E, 0x0F69, 0x4F21, 0x4F53, 0x0FC7, 0x5021, 0x507E, 0x0FFA,\n    0x5121, 0x517E, 0x1058, 0x5221, 0x527E, 0x10B6, 0x5321, 0x537E, 0x1114,\n    0x5421, 0x547E, 0x1172, 0x5521, 0x557E, 0x11D0, 0x5621, 0x567E, 0x122E,\n    0x5721, 0x577E, 0x128C, 0x5821, 0x587E, 0x12EA, 0x5921, 0x597E, 0x1348,\n    0x5A21, 0x5A7E, 0x13A6, 0x5B21, 0x5B7E, 0x1404, 0x5C21, 0x5C7E, 0x1462,\n    0x5D21, 0x5D7E, 0x14C0, 0x5E21, 0x5E7E, 0x151E, 0x5F21, 0x5F7E, 0x157C,\n    0x6021, 0x607E, 0x15DA, 0x6121, 0x617E, 0x1638, 0x6221, 0x627E, 0x1696,\n    0x6321, 0x637E, 0x16F4, 0x6421, 0x647E, 0x1752, 0x6521, 0x657E, 0x17B0,\n    0x6621, 0x667E, 0x180E, 0x6721, 0x677E, 0x186C, 0x6821, 0x687E, 0x18CA,\n    0x6921, 0x697E, 0x1928, 0x6A21, 0x6A7E, 0x1986, 0x6B21, 0x6B7E, 0x19E4,\n    0x6C21, 0x6C7E, 0x1A42, 0x6D21, 0x6D7E, 0x1AA0, 0x6E21, 0x6E7E, 0x1AFE,\n    0x6F21, 0x6F7E, 0x1B5C, 0x7021, 0x707E, 0x1BBA, 0x7121, 0x717E, 0x1C18,\n    0x7221, 0x727E, 0x1C76, 0x7321, 0x737E, 0x1CD4, 0x7421, 0x7424, 0x1D32,\n    0x7425, 0x7426, 0x205C,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-H_4.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_UniJIS_UCS2_HW_H_4[4 * 3] = {\n    0x0020, 0x005B, 0x00E7, 0x005C, 0x005C, 0x220F, 0x005D, 0x007E, 0x0124,\n    0x00A5, 0x00A5, 0x0123,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-V_4.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_UniJIS_UCS2_HW_V_4[199 * 3] = {\n    0x0020, 0x005B, 0x00E7, 0x005C, 0x005C, 0x220F, 0x005D, 0x007E, 0x0124,\n    0x00A5, 0x00A5, 0x0123, 0x00B0, 0x00B0, 0x204D, 0x2010, 0x2010, 0x1ED5,\n    0x2015, 0x2015, 0x1ED4, 0x2016, 0x2016, 0x1ED7, 0x2018, 0x2019, 0x2059,\n    0x201C, 0x201D, 0x2057, 0x2025, 0x2025, 0x1EDA, 0x2026, 0x2026, 0x1ED9,\n    0x2032, 0x2032, 0x2051, 0x2033, 0x2033, 0x205B, 0x2190, 0x2190, 0x02E2,\n    0x2191, 0x2191, 0x02E0, 0x2192, 0x2192, 0x02E3, 0x2193, 0x2193, 0x02E1,\n    0x2195, 0x2195, 0x2FB6, 0x21C4, 0x21C4, 0x2077, 0x21C5, 0x21C5, 0x2076,\n    0x21C6, 0x21C6, 0x2078, 0x21E6, 0x21E6, 0x1F4C, 0x21E7, 0x21E7, 0x1F4E,\n    0x21E8, 0x21E8, 0x1F4B, 0x21E9, 0x21E9, 0x1F4D, 0x2225, 0x2225, 0x1ED7,\n    0x223C, 0x223C, 0x1ED6, 0x22EF, 0x22EF, 0x1ED9, 0x2500, 0x2501, 0x1D39,\n    0x2502, 0x2503, 0x1D37, 0x2504, 0x2505, 0x1D3D, 0x2506, 0x2507, 0x1D3B,\n    0x2508, 0x2509, 0x1D41, 0x250A, 0x250B, 0x1D3F, 0x250C, 0x250C, 0x1D47,\n    0x250D, 0x250D, 0x1D49, 0x250E, 0x250E, 0x1D48, 0x250F, 0x250F, 0x1D4A,\n    0x2510, 0x2510, 0x1D4F, 0x2511, 0x2511, 0x1D51, 0x2512, 0x2512, 0x1D50,\n    0x2513, 0x2513, 0x1D52, 0x2514, 0x2514, 0x1D43, 0x2515, 0x2515, 0x1D45,\n    0x2516, 0x2516, 0x1D44, 0x2517, 0x2517, 0x1D46, 0x2518, 0x2518, 0x1D4B,\n    0x2519, 0x2519, 0x1D4D, 0x251A, 0x251A, 0x1D4C, 0x251B, 0x251B, 0x1D4E,\n    0x251C, 0x251C, 0x1D63, 0x251D, 0x251D, 0x1D67, 0x251E, 0x251E, 0x1D65,\n    0x251F, 0x251F, 0x1D64, 0x2520, 0x2520, 0x1D66, 0x2521, 0x2521, 0x1D69,\n    0x2522, 0x2522, 0x1D68, 0x2523, 0x2524, 0x1D6A, 0x2525, 0x2525, 0x1D6F,\n    0x2526, 0x2526, 0x1D6D, 0x2527, 0x2527, 0x1D6C, 0x2528, 0x2528, 0x1D6E,\n    0x2529, 0x2529, 0x1D71, 0x252A, 0x252A, 0x1D70, 0x252B, 0x252B, 0x1D72,\n    0x252C, 0x252C, 0x1D5B, 0x252D, 0x252F, 0x1D5D, 0x2530, 0x2530, 0x1D5C,\n    0x2531, 0x2533, 0x1D60, 0x2534, 0x2534, 0x1D53, 0x2535, 0x2537, 0x1D55,\n    0x2538, 0x2538, 0x1D54, 0x2539, 0x253B, 0x1D58, 0x253D, 0x253F, 0x1D77,\n    0x2540, 0x2540, 0x1D75, 0x2541, 0x2541, 0x1D74, 0x2542, 0x2542, 0x1D76,\n    0x2543, 0x2543, 0x1D7B, 0x2544, 0x2544, 0x1D7D, 0x2545, 0x2545, 0x1D7A,\n    0x2546, 0x2546, 0x1D7C, 0x2547, 0x2547, 0x1D81, 0x2548, 0x2548, 0x1D80,\n    0x2549, 0x254A, 0x1D7E, 0x261C, 0x261C, 0x201D, 0x261D, 0x261D, 0x201B,\n    0x261E, 0x261E, 0x201E, 0x261F, 0x261F, 0x201C, 0x2702, 0x2702, 0x2F92,\n    0x27A1, 0x27A1, 0x2011, 0x3001, 0x3002, 0x1ECF, 0x3008, 0x3011, 0x1EE3,\n    0x3013, 0x3013, 0x204E, 0x3014, 0x3015, 0x1EDD, 0x301C, 0x301C, 0x1ED6,\n    0x301D, 0x301D, 0x1F14, 0x301F, 0x301F, 0x1F15, 0x3041, 0x3041, 0x1EEE,\n    0x3043, 0x3043, 0x1EEF, 0x3045, 0x3045, 0x1EF0, 0x3047, 0x3047, 0x1EF1,\n    0x3049, 0x3049, 0x1EF2, 0x3063, 0x3063, 0x1EF3, 0x3083, 0x3083, 0x1EF4,\n    0x3085, 0x3085, 0x1EF5, 0x3087, 0x3087, 0x1EF6, 0x308E, 0x308E, 0x1EF7,\n    0x309B, 0x309B, 0x2050, 0x309C, 0x309C, 0x204F, 0x30A1, 0x30A1, 0x1EF8,\n    0x30A3, 0x30A3, 0x1EF9, 0x30A5, 0x30A5, 0x1EFA, 0x30A7, 0x30A7, 0x1EFB,\n    0x30A9, 0x30A9, 0x1EFC, 0x30C3, 0x30C3, 0x1EFD, 0x30E3, 0x30E3, 0x1EFE,\n    0x30E5, 0x30E5, 0x1EFF, 0x30E7, 0x30E7, 0x1F00, 0x30EE, 0x30EE, 0x1F01,\n    0x30F5, 0x30F6, 0x1F02, 0x30FC, 0x30FC, 0x1ED3, 0x3300, 0x3300, 0x209E,\n    0x3301, 0x3302, 0x2EB6, 0x3303, 0x3303, 0x2092, 0x3304, 0x3304, 0x2EB8,\n    0x3305, 0x3305, 0x208D, 0x3306, 0x3306, 0x2EB9, 0x3307, 0x3307, 0x2EBD,\n    0x3308, 0x3308, 0x2EBB, 0x3309, 0x3309, 0x2EC0, 0x330A, 0x330A, 0x2EBE,\n    0x330B, 0x330B, 0x2EC2, 0x330C, 0x330C, 0x2EC4, 0x330D, 0x330D, 0x1F0E,\n    0x330E, 0x3313, 0x2EC5, 0x3314, 0x3314, 0x1F05, 0x3315, 0x3315, 0x2094,\n    0x3316, 0x3316, 0x208A, 0x3317, 0x3317, 0x2ECC, 0x3318, 0x3318, 0x2093,\n    0x3319, 0x3319, 0x2ECE, 0x331A, 0x331D, 0x2ED0, 0x331E, 0x331E, 0x20A1,\n    0x331F, 0x3321, 0x2ED4, 0x3322, 0x3322, 0x2089, 0x3323, 0x3323, 0x209C,\n    0x3324, 0x3324, 0x2ED7, 0x3325, 0x3325, 0x2ED9, 0x3326, 0x3326, 0x1F0F,\n    0x3327, 0x3327, 0x1F09, 0x3328, 0x3329, 0x2EDC, 0x332A, 0x332A, 0x20A4,\n    0x332B, 0x332B, 0x1F11, 0x332D, 0x332D, 0x2EDF, 0x332E, 0x3330, 0x2EE2,\n    0x3331, 0x3331, 0x20A6, 0x3332, 0x3332, 0x2EE5, 0x3333, 0x3333, 0x208E,\n    0x3334, 0x3335, 0x2EE8, 0x3336, 0x3336, 0x1F0B, 0x3337, 0x3337, 0x2EEE,\n    0x3338, 0x3338, 0x2EF0, 0x3339, 0x3339, 0x2097, 0x333A, 0x333A, 0x2EF1,\n    0x333B, 0x333B, 0x209D, 0x333C, 0x333C, 0x2EEA, 0x333D, 0x333D, 0x2EF2,\n    0x333E, 0x3340, 0x2EF4, 0x3341, 0x3341, 0x2EF3, 0x3342, 0x3342, 0x209B,\n    0x3343, 0x3346, 0x2EF7, 0x3347, 0x3347, 0x20A5, 0x3348, 0x3348, 0x2EFB,\n    0x3349, 0x3349, 0x1F04, 0x334A, 0x334A, 0x1F12, 0x334B, 0x334C, 0x2EFC,\n    0x334D, 0x334D, 0x1F07, 0x334E, 0x334E, 0x2091, 0x334F, 0x3350, 0x2EFE,\n    0x3351, 0x3351, 0x1F0C, 0x3352, 0x3352, 0x2F02, 0x3353, 0x3353, 0x2F06,\n    0x3354, 0x3354, 0x2F03, 0x3355, 0x3356, 0x2F07, 0x3357, 0x3357, 0x2098,\n    0x337F, 0x337F, 0x2084, 0xFF08, 0xFF09, 0x1EDB, 0xFF0C, 0xFF0C, 0x204C,\n    0xFF0E, 0xFF0E, 0x2052, 0xFF1D, 0xFF1D, 0x1EED, 0xFF3B, 0xFF3B, 0x1EDF,\n    0xFF3D, 0xFF3D, 0x1EE0, 0xFF3F, 0xFF3F, 0x1ED2, 0xFF5B, 0xFF5B, 0x1EE1,\n    0xFF5C, 0xFF5C, 0x1ED8, 0xFF5D, 0xFF5D, 0x1EE2, 0xFF5E, 0xFF5E, 0x1ED6,\n    0xFFE3, 0xFFE3, 0x1ED1,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-H_4.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_UniJIS_UCS2_H_4[9772 * 2] = {\n    0x0020, 0x0001, 0x0021, 0x0002, 0x0022, 0x0003, 0x0023, 0x0004,\n    0x0024, 0x0005, 0x0025, 0x0006, 0x0026, 0x0007, 0x0027, 0x0008,\n    0x0028, 0x0009, 0x0029, 0x000A, 0x002A, 0x000B, 0x002B, 0x000C,\n    0x002C, 0x000D, 0x002D, 0x000E, 0x002E, 0x000F, 0x002F, 0x0010,\n    0x0030, 0x0011, 0x0031, 0x0012, 0x0032, 0x0013, 0x0033, 0x0014,\n    0x0034, 0x0015, 0x0035, 0x0016, 0x0036, 0x0017, 0x0037, 0x0018,\n    0x0038, 0x0019, 0x0039, 0x001A, 0x003A, 0x001B, 0x003B, 0x001C,\n    0x003C, 0x001D, 0x003D, 0x001E, 0x003E, 0x001F, 0x003F, 0x0020,\n    0x0040, 0x0021, 0x0041, 0x0022, 0x0042, 0x0023, 0x0043, 0x0024,\n    0x0044, 0x0025, 0x0045, 0x0026, 0x0046, 0x0027, 0x0047, 0x0028,\n    0x0048, 0x0029, 0x0049, 0x002A, 0x004A, 0x002B, 0x004B, 0x002C,\n    0x004C, 0x002D, 0x004D, 0x002E, 0x004E, 0x002F, 0x004F, 0x0030,\n    0x0050, 0x0031, 0x0051, 0x0032, 0x0052, 0x0033, 0x0053, 0x0034,\n    0x0054, 0x0035, 0x0055, 0x0036, 0x0056, 0x0037, 0x0057, 0x0038,\n    0x0058, 0x0039, 0x0059, 0x003A, 0x005A, 0x003B, 0x005B, 0x003C,\n    0x005C, 0x0061, 0x005D, 0x003E, 0x005E, 0x003F, 0x005F, 0x0040,\n    0x0060, 0x0041, 0x0061, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044,\n    0x0064, 0x0045, 0x0065, 0x0046, 0x0066, 0x0047, 0x0067, 0x0048,\n    0x0068, 0x0049, 0x0069, 0x004A, 0x006A, 0x004B, 0x006B, 0x004C,\n    0x006C, 0x004D, 0x006D, 0x004E, 0x006E, 0x004F, 0x006F, 0x0050,\n    0x0070, 0x0051, 0x0071, 0x0052, 0x0072, 0x0053, 0x0073, 0x0054,\n    0x0074, 0x0055, 0x0075, 0x0056, 0x0076, 0x0057, 0x0077, 0x0058,\n    0x0078, 0x0059, 0x0079, 0x005A, 0x007A, 0x005B, 0x007B, 0x005C,\n    0x007C, 0x005D, 0x007D, 0x005E, 0x007E, 0x005F, 0x00A1, 0x0065,\n    0x00A2, 0x0066, 0x00A3, 0x0067, 0x00A4, 0x006B, 0x00A5, 0x003D,\n    0x00A6, 0x0063, 0x00A7, 0x02D0, 0x00A8, 0x0287, 0x00A9, 0x0098,\n    0x00AA, 0x008C, 0x00AB, 0x006D, 0x00AC, 0x0099, 0x00AD, 0x0097,\n    0x00AE, 0x009A, 0x00AF, 0x0081, 0x00B0, 0x02C3, 0x00B1, 0x02B6,\n    0x00B2, 0x009D, 0x00B3, 0x009E, 0x00B4, 0x0285, 0x00B5, 0x009F,\n    0x00B6, 0x030A, 0x00B7, 0x0075, 0x00B8, 0x0086, 0x00B9, 0x00A0,\n    0x00BA, 0x0090, 0x00BB, 0x007B, 0x00BC, 0x00A1, 0x00BD, 0x00A2,\n    0x00BE, 0x00A3, 0x00BF, 0x007E, 0x00C0, 0x00A4, 0x00C1, 0x00A5,\n    0x00C2, 0x00A6, 0x00C3, 0x00A7, 0x00C4, 0x00A8, 0x00C5, 0x00A9,\n    0x00C6, 0x008B, 0x00C7, 0x00AA, 0x00C8, 0x00AB, 0x00C9, 0x00AC,\n    0x00CA, 0x00AD, 0x00CB, 0x00AE, 0x00CC, 0x00AF, 0x00CD, 0x00B0,\n    0x00CE, 0x00B1, 0x00CF, 0x00B2, 0x00D0, 0x00B3, 0x00D1, 0x00B4,\n    0x00D2, 0x00B5, 0x00D3, 0x00B6, 0x00D4, 0x00B7, 0x00D5, 0x00B8,\n    0x00D6, 0x00B9, 0x00D7, 0x02B7, 0x00D8, 0x008E, 0x00D9, 0x00BB,\n    0x00DA, 0x00BC, 0x00DB, 0x00BD, 0x00DC, 0x00BE, 0x00DD, 0x00BF,\n    0x00DE, 0x00C0, 0x00DF, 0x0096, 0x00E0, 0x00C1, 0x00E1, 0x00C2,\n    0x00E2, 0x00C3, 0x00E3, 0x00C4, 0x00E4, 0x00C5, 0x00E5, 0x00C6,\n    0x00E6, 0x0091, 0x00E7, 0x00C7, 0x00E8, 0x00C8, 0x00E9, 0x00C9,\n    0x00EA, 0x00CA, 0x00EB, 0x00CB, 0x00EC, 0x00CC, 0x00ED, 0x00CD,\n    0x00EE, 0x00CE, 0x00EF, 0x00CF, 0x00F0, 0x00D0, 0x00F1, 0x00D1,\n    0x00F2, 0x00D2, 0x00F3, 0x00D3, 0x00F4, 0x00D4, 0x00F5, 0x00D5,\n    0x00F6, 0x00D6, 0x00F7, 0x02B8, 0x00F8, 0x0094, 0x00F9, 0x00D8,\n    0x00FA, 0x00D9, 0x00FB, 0x00DA, 0x00FC, 0x00DB, 0x00FD, 0x00DC,\n    0x00FE, 0x00DD, 0x00FF, 0x00DE, 0x0100, 0x2496, 0x0101, 0x2491,\n    0x0112, 0x2499, 0x0113, 0x2494, 0x011A, 0x24B3, 0x011B, 0x24BF,\n    0x0127, 0x2F3C, 0x0128, 0x24B8, 0x0129, 0x24C4, 0x012A, 0x2497,\n    0x012B, 0x2492, 0x0131, 0x0092, 0x0141, 0x008D, 0x0142, 0x0093,\n    0x014B, 0x24DC, 0x014C, 0x249A, 0x014D, 0x2495, 0x0152, 0x008F,\n    0x0153, 0x0095, 0x0160, 0x00DF, 0x0161, 0x00E3, 0x0168, 0x24BD,\n    0x0169, 0x24C9, 0x016A, 0x2498, 0x016B, 0x2493, 0x016E, 0x24BC,\n    0x016F, 0x24C8, 0x0178, 0x00E0, 0x017D, 0x00E1, 0x017E, 0x00E5,\n    0x01C0, 0x0063, 0x01CD, 0x24B2, 0x01CE, 0x24BE, 0x01CF, 0x24B6,\n    0x01D0, 0x24C2, 0x01D1, 0x24B9, 0x01D2, 0x24C5, 0x01D3, 0x24BB,\n    0x01D4, 0x24C7, 0x01FD, 0x24CD, 0x0251, 0x24CA, 0x0254, 0x24CF,\n    0x0259, 0x24D2, 0x025A, 0x24D5, 0x025B, 0x24D8, 0x0275, 0x24DD,\n    0x0283, 0x24E2, 0x028C, 0x24DE, 0x0292, 0x24E1, 0x02D0, 0x24E3,\n    0x0300, 0x0041, 0x0301, 0x007F, 0x0302, 0x0080, 0x0303, 0x005F,\n    0x0304, 0x0081, 0x0305, 0x00E2, 0x0306, 0x0082, 0x0307, 0x0083,\n    0x0308, 0x0084, 0x030A, 0x0085, 0x030B, 0x0087, 0x030C, 0x0089,\n    0x0327, 0x0086, 0x0328, 0x0088, 0x0332, 0x0040, 0x0336, 0x008A,\n    0x0361, 0x02F6, 0x0391, 0x03F3, 0x0392, 0x03F4, 0x0393, 0x03F5,\n    0x0394, 0x03F6, 0x0395, 0x03F7, 0x0396, 0x03F8, 0x0397, 0x03F9,\n    0x0398, 0x03FA, 0x0399, 0x03FB, 0x039A, 0x03FC, 0x039B, 0x03FD,\n    0x039C, 0x03FE, 0x039D, 0x03FF, 0x039E, 0x0400, 0x039F, 0x0401,\n    0x03A0, 0x0402, 0x03A1, 0x0403, 0x03A3, 0x0404, 0x03A4, 0x0405,\n    0x03A5, 0x0406, 0x03A6, 0x0407, 0x03A7, 0x0408, 0x03A8, 0x0409,\n    0x03A9, 0x040A, 0x03B1, 0x040B, 0x03B2, 0x040C, 0x03B3, 0x040D,\n    0x03B4, 0x040E, 0x03B5, 0x040F, 0x03B6, 0x0410, 0x03B7, 0x0411,\n    0x03B8, 0x0412, 0x03B9, 0x0413, 0x03BA, 0x0414, 0x03BB, 0x0415,\n    0x03BC, 0x0416, 0x03BD, 0x0417, 0x03BE, 0x0418, 0x03BF, 0x0419,\n    0x03C0, 0x041A, 0x03C1, 0x041B, 0x03C3, 0x041C, 0x03C4, 0x041D,\n    0x03C5, 0x041E, 0x03C6, 0x041F, 0x03C7, 0x0420, 0x03C8, 0x0421,\n    0x03C9, 0x0422, 0x03D0, 0x2F3A, 0x03D1, 0x2F40, 0x03DB, 0x2F3F,\n    0x0401, 0x0429, 0x0410, 0x0423, 0x0411, 0x0424, 0x0412, 0x0425,\n    0x0413, 0x0426, 0x0414, 0x0427, 0x0415, 0x0428, 0x0416, 0x042A,\n    0x0417, 0x042B, 0x0418, 0x042C, 0x0419, 0x042D, 0x041A, 0x042E,\n    0x041B, 0x042F, 0x041C, 0x0430, 0x041D, 0x0431, 0x041E, 0x0432,\n    0x041F, 0x0433, 0x0420, 0x0434, 0x0421, 0x0435, 0x0422, 0x0436,\n    0x0423, 0x0437, 0x0424, 0x0438, 0x0425, 0x0439, 0x0426, 0x043A,\n    0x0427, 0x043B, 0x0428, 0x043C, 0x0429, 0x043D, 0x042A, 0x043E,\n    0x042B, 0x043F, 0x042C, 0x0440, 0x042D, 0x0441, 0x042E, 0x0442,\n    0x042F, 0x0443, 0x0430, 0x0444, 0x0431, 0x0445, 0x0432, 0x0446,\n    0x0433, 0x0447, 0x0434, 0x0448, 0x0435, 0x0449, 0x0436, 0x044B,\n    0x0437, 0x044C, 0x0438, 0x044D, 0x0439, 0x044E, 0x043A, 0x044F,\n    0x043B, 0x0450, 0x043C, 0x0451, 0x043D, 0x0452, 0x043E, 0x0453,\n    0x043F, 0x0454, 0x0440, 0x0455, 0x0441, 0x0456, 0x0442, 0x0457,\n    0x0443, 0x0458, 0x0444, 0x0459, 0x0445, 0x045A, 0x0446, 0x045B,\n    0x0447, 0x045C, 0x0448, 0x045D, 0x0449, 0x045E, 0x044A, 0x045F,\n    0x044B, 0x0460, 0x044C, 0x0461, 0x044D, 0x0462, 0x044E, 0x0463,\n    0x044F, 0x0464, 0x0451, 0x044A, 0x045B, 0x2F3C, 0x1EBC, 0x24B5,\n    0x1EBD, 0x24C1, 0x2002, 0x00E7, 0x2003, 0x0279, 0x2010, 0x0296,\n    0x2011, 0x000E, 0x2012, 0x0072, 0x2013, 0x0072, 0x2014, 0x008A,\n    0x2015, 0x0295, 0x2016, 0x029A, 0x2018, 0x029E, 0x2019, 0x029F,\n    0x201A, 0x0078, 0x201C, 0x02A0, 0x201D, 0x02A1, 0x201E, 0x0079,\n    0x2020, 0x0308, 0x2021, 0x0309, 0x2022, 0x0077, 0x2025, 0x029D,\n    0x2026, 0x029C, 0x2030, 0x0304, 0x2032, 0x02C4, 0x2033, 0x02C5,\n    0x2039, 0x006E, 0x203A, 0x006F, 0x203B, 0x02DE, 0x203C, 0x2F4F,\n    0x203E, 0x0145, 0x2044, 0x0068, 0x2049, 0x2F50, 0x2070, 0x24A1,\n    0x2074, 0x24A2, 0x2075, 0x24A3, 0x2076, 0x24A4, 0x2077, 0x24A5,\n    0x2078, 0x24A6, 0x2079, 0x24A7, 0x2080, 0x24A8, 0x2081, 0x24A9,\n    0x2082, 0x24AA, 0x2083, 0x24AB, 0x2084, 0x24AC, 0x2085, 0x24AD,\n    0x2086, 0x24AE, 0x2087, 0x24AF, 0x2088, 0x24B0, 0x2089, 0x24B1,\n    0x20AC, 0x248A, 0x20DD, 0x030B, 0x2100, 0x2E4F, 0x2103, 0x02C6,\n    0x2105, 0x2E53, 0x2109, 0x2071, 0x210A, 0x2070, 0x210F, 0x2F3C,\n    0x2113, 0x1F59, 0x2116, 0x1DBA, 0x2121, 0x1F77, 0x2122, 0x00E4,\n    0x2126, 0x248B, 0x212B, 0x0303, 0x2135, 0x2F39, 0x2153, 0x249F,\n    0x2154, 0x24A0, 0x215B, 0x249B, 0x215C, 0x249C, 0x215D, 0x249D,\n    0x215E, 0x249E, 0x2160, 0x1D97, 0x2161, 0x1D98, 0x2162, 0x1D99,\n    0x2163, 0x1D9A, 0x2164, 0x1D9B, 0x2165, 0x1D9C, 0x2166, 0x1D9D,\n    0x2167, 0x1D9E, 0x2168, 0x1D9F, 0x2169, 0x1DA0, 0x216A, 0x2021,\n    0x216B, 0x2022, 0x2170, 0x1F9C, 0x2171, 0x1F9D, 0x2172, 0x1F9E,\n    0x2173, 0x1F9F, 0x2174, 0x1FA0, 0x2175, 0x1FA1, 0x2176, 0x1FA2,\n    0x2177, 0x1FA3, 0x2178, 0x1FA4, 0x2179, 0x1FA5, 0x217A, 0x206A,\n    0x217B, 0x206B, 0x217F, 0x206F, 0x2190, 0x02E1, 0x2191, 0x02E2,\n    0x2192, 0x02E0, 0x2193, 0x02E3, 0x2194, 0x2FA9, 0x2195, 0x2FB7,\n    0x2196, 0x2FAC, 0x2197, 0x2FAD, 0x2198, 0x2FAA, 0x2199, 0x2FAB,\n    0x21C4, 0x2076, 0x21C5, 0x2077, 0x21C6, 0x2075, 0x21CC, 0x2FAE,\n    0x21D0, 0x2FA8, 0x21D2, 0x02F0, 0x21D4, 0x02F1, 0x21E6, 0x1F4D,\n    0x21E7, 0x1F4C, 0x21E8, 0x1F4E, 0x21E9, 0x1F4B, 0x2200, 0x02F2,\n    0x2202, 0x02F7, 0x2203, 0x02F3, 0x2205, 0x2F98, 0x2207, 0x02F8,\n    0x2208, 0x02E5, 0x220A, 0x2F3B, 0x220B, 0x02E6, 0x2211, 0x1DC9,\n    0x2212, 0x02B5, 0x2213, 0x2F56, 0x221A, 0x02FD, 0x221D, 0x02FF,\n    0x221E, 0x02BF, 0x221F, 0x1DCD, 0x2220, 0x02F4, 0x2225, 0x029A,\n    0x2227, 0x02ED, 0x2228, 0x02EE, 0x2229, 0x02EC, 0x222A, 0x02EB,\n    0x222B, 0x0301, 0x222C, 0x0302, 0x222D, 0x2003, 0x222E, 0x1DC8,\n    0x2234, 0x02C0, 0x2235, 0x0300, 0x223C, 0x0299, 0x223D, 0x02FE,\n    0x2243, 0x2F58, 0x2252, 0x02FA, 0x2260, 0x02BA, 0x2261, 0x02F9,\n    0x2266, 0x02BD, 0x2267, 0x02BE, 0x226A, 0x02FB, 0x226B, 0x02FC,\n    0x2272, 0x2F59, 0x2273, 0x2F5A, 0x2282, 0x02E9, 0x2283, 0x02EA,\n    0x2286, 0x02E7, 0x2287, 0x02E8, 0x2295, 0x2F9C, 0x2296, 0x2F9A,\n    0x2297, 0x2F9D, 0x2298, 0x2F9B, 0x229D, 0x2F9A, 0x229E, 0x2F9E,\n    0x22A0, 0x2F99, 0x22A5, 0x02F5, 0x22BF, 0x1DCE, 0x22EE, 0x1ED9,\n    0x22EF, 0x029C, 0x2300, 0x2F98, 0x2307, 0x2FBB, 0x2312, 0x02F6,\n    0x244A, 0x2F54, 0x2460, 0x1D83, 0x2461, 0x1D84, 0x2462, 0x1D85,\n    0x2463, 0x1D86, 0x2464, 0x1D87, 0x2465, 0x1D88, 0x2466, 0x1D89,\n    0x2467, 0x1D8A, 0x2468, 0x1D8B, 0x2469, 0x1D8C, 0x246A, 0x1D8D,\n    0x246B, 0x1D8E, 0x246C, 0x1D8F, 0x246D, 0x1D90, 0x246E, 0x1D91,\n    0x246F, 0x1D92, 0x2470, 0x1D93, 0x2471, 0x1D94, 0x2472, 0x1D95,\n    0x2473, 0x1D96, 0x2474, 0x1F87, 0x2475, 0x1F88, 0x2476, 0x1F89,\n    0x2477, 0x1F8A, 0x2478, 0x1F8B, 0x2479, 0x1F8C, 0x247A, 0x1F8D,\n    0x247B, 0x1F8E, 0x247C, 0x1F8F, 0x247D, 0x1F90, 0x247E, 0x1F91,\n    0x247F, 0x1F92, 0x2480, 0x1F93, 0x2481, 0x1F94, 0x2482, 0x1F95,\n    0x2483, 0x1F96, 0x2484, 0x1F97, 0x2485, 0x1F98, 0x2486, 0x1F99,\n    0x2487, 0x1F9A, 0x2488, 0x1F7E, 0x2489, 0x1F7F, 0x248A, 0x1F80,\n    0x248B, 0x1F81, 0x248C, 0x1F82, 0x248D, 0x1F83, 0x248E, 0x1F84,\n    0x248F, 0x1F85, 0x2490, 0x1F86, 0x249C, 0x1FB0, 0x249D, 0x1FB1,\n    0x249E, 0x1FB2, 0x249F, 0x1FB3, 0x24A0, 0x1FB4, 0x24A1, 0x1FB5,\n    0x24A2, 0x1FB6, 0x24A3, 0x1FB7, 0x24A4, 0x1FB8, 0x24A5, 0x1FB9,\n    0x24A6, 0x1FBA, 0x24A7, 0x1FBB, 0x24A8, 0x1FBC, 0x24A9, 0x1FBD,\n    0x24AA, 0x1FBE, 0x24AB, 0x1FBF, 0x24AC, 0x1FC0, 0x24AD, 0x1FC1,\n    0x24AE, 0x1FC2, 0x24AF, 0x1FC3, 0x24B0, 0x1FC4, 0x24B1, 0x1FC5,\n    0x24B2, 0x1FC6, 0x24B3, 0x1FC7, 0x24B4, 0x1FC8, 0x24B5, 0x1FC9,\n    0x24B6, 0x2863, 0x24B7, 0x2864, 0x24B8, 0x2865, 0x24B9, 0x2866,\n    0x24BA, 0x2867, 0x24BB, 0x2868, 0x24BC, 0x2869, 0x24BD, 0x286A,\n    0x24BE, 0x286B, 0x24BF, 0x286C, 0x24C0, 0x286D, 0x24C1, 0x286E,\n    0x24C2, 0x286F, 0x24C3, 0x2870, 0x24C4, 0x2871, 0x24C5, 0x2872,\n    0x24C6, 0x2873, 0x24C7, 0x2874, 0x24C8, 0x2875, 0x24C9, 0x2876,\n    0x24CA, 0x2877, 0x24CB, 0x2878, 0x24CC, 0x2879, 0x24CD, 0x287A,\n    0x24CE, 0x287B, 0x24CF, 0x287C, 0x24D0, 0x2849, 0x24D1, 0x284A,\n    0x24D2, 0x284B, 0x24D3, 0x284C, 0x24D4, 0x284D, 0x24D5, 0x284E,\n    0x24D6, 0x284F, 0x24D7, 0x2850, 0x24D8, 0x2851, 0x24D9, 0x2852,\n    0x24DA, 0x2853, 0x24DB, 0x2854, 0x24DC, 0x2855, 0x24DD, 0x2856,\n    0x24DE, 0x2857, 0x24DF, 0x2858, 0x24E0, 0x2859, 0x24E1, 0x285A,\n    0x24E2, 0x285B, 0x24E3, 0x285C, 0x24E4, 0x285D, 0x24E5, 0x285E,\n    0x24E6, 0x285F, 0x24E7, 0x2860, 0x24E8, 0x2861, 0x24E9, 0x2862,\n    0x24EA, 0x2020, 0x2500, 0x1D37, 0x2501, 0x1D38, 0x2502, 0x1D39,\n    0x2503, 0x1D3A, 0x2504, 0x1D3B, 0x2505, 0x1D3C, 0x2506, 0x1D3D,\n    0x2507, 0x1D3E, 0x2508, 0x1D3F, 0x2509, 0x1D40, 0x250A, 0x1D41,\n    0x250B, 0x1D42, 0x250C, 0x1D43, 0x250D, 0x1D44, 0x250E, 0x1D45,\n    0x250F, 0x1D46, 0x2510, 0x1D47, 0x2511, 0x1D48, 0x2512, 0x1D49,\n    0x2513, 0x1D4A, 0x2514, 0x1D4B, 0x2515, 0x1D4C, 0x2516, 0x1D4D,\n    0x2517, 0x1D4E, 0x2518, 0x1D4F, 0x2519, 0x1D50, 0x251A, 0x1D51,\n    0x251B, 0x1D52, 0x251C, 0x1D53, 0x251D, 0x1D54, 0x251E, 0x1D55,\n    0x251F, 0x1D56, 0x2520, 0x1D57, 0x2521, 0x1D58, 0x2522, 0x1D59,\n    0x2523, 0x1D5A, 0x2524, 0x1D5B, 0x2525, 0x1D5C, 0x2526, 0x1D5D,\n    0x2527, 0x1D5E, 0x2528, 0x1D5F, 0x2529, 0x1D60, 0x252A, 0x1D61,\n    0x252B, 0x1D62, 0x252C, 0x1D63, 0x252D, 0x1D64, 0x252E, 0x1D65,\n    0x252F, 0x1D66, 0x2530, 0x1D67, 0x2531, 0x1D68, 0x2532, 0x1D69,\n    0x2533, 0x1D6A, 0x2534, 0x1D6B, 0x2535, 0x1D6C, 0x2536, 0x1D6D,\n    0x2537, 0x1D6E, 0x2538, 0x1D6F, 0x2539, 0x1D70, 0x253A, 0x1D71,\n    0x253B, 0x1D72, 0x253C, 0x1D73, 0x253D, 0x1D74, 0x253E, 0x1D75,\n    0x253F, 0x1D76, 0x2540, 0x1D77, 0x2541, 0x1D78, 0x2542, 0x1D79,\n    0x2543, 0x1D7A, 0x2544, 0x1D7B, 0x2545, 0x1D7C, 0x2546, 0x1D7D,\n    0x2547, 0x1D7E, 0x2548, 0x1D7F, 0x2549, 0x1D80, 0x254A, 0x1D81,\n    0x254B, 0x1D82, 0x2550, 0x203B, 0x255E, 0x203C, 0x2561, 0x203E,\n    0x256A, 0x203D, 0x256D, 0x2037, 0x256E, 0x2038, 0x256F, 0x203A,\n    0x2570, 0x2039, 0x2571, 0x2045, 0x2572, 0x2046, 0x2573, 0x2047,\n    0x2581, 0x2026, 0x2582, 0x2027, 0x2583, 0x2028, 0x2584, 0x2029,\n    0x2585, 0x202A, 0x2586, 0x202B, 0x2587, 0x202C, 0x2588, 0x202D,\n    0x2589, 0x2034, 0x258A, 0x2033, 0x258B, 0x2032, 0x258C, 0x2031,\n    0x258D, 0x2030, 0x258E, 0x202F, 0x258F, 0x202E, 0x2594, 0x2035,\n    0x2595, 0x2036, 0x25A0, 0x02D9, 0x25A1, 0x02D8, 0x25A2, 0x1F4F,\n    0x25AA, 0x2FCF, 0x25AB, 0x2FCD, 0x25B2, 0x02DB, 0x25B3, 0x02DA,\n    0x25B6, 0x2FA3, 0x25B7, 0x1F4A, 0x25BC, 0x02DD, 0x25BD, 0x02DC,\n    0x25C0, 0x2FA2, 0x25C1, 0x1F49, 0x25C6, 0x02D7, 0x25C7, 0x02D6,\n    0x25C9, 0x2012, 0x25CB, 0x02D3, 0x25CC, 0x2906, 0x25CE, 0x02D5,\n    0x25CF, 0x02D4, 0x25E2, 0x203F, 0x25E3, 0x2040, 0x25E4, 0x2042,\n    0x25E5, 0x2041, 0x25E6, 0x2FDE, 0x25EF, 0x030B, 0x2600, 0x2017,\n    0x2601, 0x2018, 0x2602, 0x2019, 0x2603, 0x201A, 0x2605, 0x02D2,\n    0x2606, 0x02D1, 0x260E, 0x1F78, 0x2612, 0x2F99, 0x261C, 0x201C,\n    0x261D, 0x201D, 0x261E, 0x201B, 0x261F, 0x201E, 0x2640, 0x02C2,\n    0x2642, 0x02C1, 0x2660, 0x2013, 0x2661, 0x1F51, 0x2662, 0x1F53,\n    0x2663, 0x2015, 0x2664, 0x1F52, 0x2665, 0x2014, 0x2666, 0x2016,\n    0x2667, 0x1F50, 0x2668, 0x2F42, 0x2669, 0x2F43, 0x266A, 0x0307,\n    0x266C, 0x2F44, 0x266D, 0x0306, 0x266F, 0x0305, 0x2702, 0x2F90,\n    0x271A, 0x2FD1, 0x2756, 0x2FE3, 0x2776, 0x205E, 0x2777, 0x205F,\n    0x2778, 0x2060, 0x2779, 0x2061, 0x277A, 0x2062, 0x277B, 0x2063,\n    0x277C, 0x2064, 0x277D, 0x2065, 0x277E, 0x2066, 0x27A1, 0x200E,\n    0x2E83, 0x37E1, 0x2E85, 0x3620, 0x2E87, 0x3719, 0x2E89, 0x3814,\n    0x2E8B, 0x371E, 0x2E8C, 0x3609, 0x2E8D, 0x360A, 0x2E8E, 0x1071,\n    0x2E8F, 0x388C, 0x2E90, 0x1226, 0x2E92, 0x0EB2, 0x2E93, 0x1283,\n    0x2E94, 0x12AB, 0x2E95, 0x3C1F, 0x2E96, 0x38C2, 0x2E97, 0x361C,\n    0x2E98, 0x38E1, 0x2E99, 0x13C3, 0x2E9B, 0x13E1, 0x2E9F, 0x0E3C,\n    0x2EA0, 0x0EBD, 0x2EA1, 0x3961, 0x2EA2, 0x3962, 0x2EA3, 0x399D,\n    0x2EA4, 0x3C26, 0x2EA6, 0x374D, 0x2EA8, 0x39BC, 0x2EA9, 0x35A1,\n    0x2EAA, 0x36AB, 0x2EAB, 0x3A97, 0x2EAC, 0x08D4, 0x2EAD, 0x3A39,\n    0x2EAE, 0x3662, 0x2EB1, 0x3A98, 0x2EB2, 0x3A97, 0x2EB3, 0x376D,\n    0x2EB7, 0x36FE, 0x2EB9, 0x3713, 0x2EBC, 0x35B3, 0x2EBD, 0x354E,\n    0x2EBE, 0x3775, 0x2EBF, 0x3776, 0x2EC0, 0x3777, 0x2EC1, 0x078B,\n    0x2EC2, 0x3B0A, 0x2EC3, 0x362E, 0x2EC4, 0x0A62, 0x2EC6, 0x3572,\n    0x2ECA, 0x364A, 0x2ECC, 0x3C2B, 0x2ECD, 0x3B50, 0x2ECF, 0x3B9E,\n    0x2ED1, 0x0BD5, 0x2ED2, 0x3B97, 0x2ED6, 0x3B9E, 0x2ED7, 0x354D,\n    0x2ED8, 0x0A68, 0x2EDD, 0x3617, 0x2EDE, 0x3619, 0x2EDF, 0x3618,\n    0x2EE4, 0x064E, 0x2EE8, 0x0D34, 0x2EE9, 0x052B, 0x2EEB, 0x0A6A,\n    0x2EED, 0x08C3, 0x2EEF, 0x0F7D, 0x2EF2, 0x064F, 0x2F00, 0x04B0,\n    0x2F01, 0x20B3, 0x2F02, 0x0FFF, 0x2F03, 0x1001, 0x2F04, 0x0535,\n    0x2F05, 0x1006, 0x2F06, 0x0CCB, 0x2F07, 0x100E, 0x2F08, 0x0A13,\n    0x2F09, 0x1070, 0x2F0A, 0x0CD6, 0x2F0B, 0x0D40, 0x2F0C, 0x107B,\n    0x2F0D, 0x1083, 0x2F0E, 0x1089, 0x2F0F, 0x1093, 0x2F10, 0x1098,\n    0x2F11, 0x0C5B, 0x2F12, 0x0F97, 0x2F13, 0x10C6, 0x2F14, 0x10CD,\n    0x2F15, 0x10CE, 0x2F16, 0x10D3, 0x2F17, 0x0947, 0x2F18, 0x0E7C,\n    0x2F19, 0x10DC, 0x2F1A, 0x10E1, 0x2F1B, 0x10E8, 0x2F1C, 0x0EA2,\n    0x2F1D, 0x07B1, 0x2F1E, 0x116B, 0x2F1F, 0x0C54, 0x2F20, 0x089C,\n    0x2F21, 0x11BA, 0x2F22, 0x11BB, 0x2F23, 0x0F26, 0x2F24, 0x0B47,\n    0x2F25, 0x0981, 0x2F26, 0x08A0, 0x2F27, 0x120E, 0x2F28, 0x0A47,\n    0x2F29, 0x0996, 0x2F2A, 0x1226, 0x2F2B, 0x1228, 0x2F2C, 0x1232,\n    0x2F2D, 0x0881, 0x2F2E, 0x126C, 0x2F2F, 0x07BB, 0x2F30, 0x077E,\n    0x2F31, 0x06CA, 0x2F32, 0x05EF, 0x2F33, 0x1283, 0x2F34, 0x1285,\n    0x2F35, 0x1299, 0x2F36, 0x129B, 0x2F37, 0x12A0, 0x2F38, 0x0677,\n    0x2F39, 0x38B9, 0x2F3A, 0x12AF, 0x2F3B, 0x12B1, 0x2F3C, 0x09FA,\n    0x2F3D, 0x1342, 0x2F3E, 0x0781, 0x2F3F, 0x0916, 0x2F40, 0x08A7,\n    0x2F41, 0x13C2, 0x2F42, 0x0E08, 0x2F43, 0x0C47, 0x2F44, 0x06CC,\n    0x2F45, 0x0E4D, 0x2F46, 0x13E0, 0x2F47, 0x0CD4, 0x2F48, 0x140C,\n    0x2F49, 0x0744, 0x2F4A, 0x0EE6, 0x2F4B, 0x073D, 0x2F4C, 0x08AD,\n    0x2F4D, 0x14E5, 0x2F4E, 0x14F4, 0x2F4F, 0x14F8, 0x2F50, 0x0D7A,\n    0x2F51, 0x0EDF, 0x2F52, 0x08AF, 0x2F53, 0x1502, 0x2F54, 0x0A2B,\n    0x2F55, 0x0550, 0x2F56, 0x0BFA, 0x2F57, 0x0DD5, 0x2F58, 0x15E4,\n    0x2F59, 0x15E6, 0x2F5A, 0x0E22, 0x2F5B, 0x0567, 0x2F5C, 0x0687,\n    0x2F5D, 0x0758, 0x2F5E, 0x0770, 0x2F5F, 0x06C4, 0x2F60, 0x04DD,\n    0x2F61, 0x05E0, 0x2F62, 0x0601, 0x2F63, 0x0A5C, 0x2F64, 0x0F3B,\n    0x2F65, 0x0C3E, 0x2F66, 0x0D97, 0x2F67, 0x3A00, 0x2F68, 0x1697,\n    0x2F69, 0x0D28, 0x2F6A, 0x0D7D, 0x2F6B, 0x087C, 0x2F6C, 0x0EE8,\n    0x2F6D, 0x0EC3, 0x2F6E, 0x0EFC, 0x2F6F, 0x0A74, 0x2F70, 0x08D4,\n    0x2F71, 0x3A41, 0x2F72, 0x0553, 0x2F73, 0x0740, 0x2F74, 0x0F71,\n    0x2F75, 0x0B9B, 0x2F76, 0x0E16, 0x2F77, 0x08B3, 0x2F78, 0x0608,\n    0x2F79, 0x1813, 0x2F7A, 0x0F3D, 0x2F7B, 0x04CB, 0x2F7C, 0x0FDD,\n    0x2F7D, 0x08D5, 0x2F7E, 0x183D, 0x2F7F, 0x08D6, 0x2F80, 0x1853,\n    0x2F81, 0x0CD1, 0x2F82, 0x0A09, 0x2F83, 0x08D7, 0x2F84, 0x08B8,\n    0x2F85, 0x04D3, 0x2F86, 0x0A89, 0x2F87, 0x0AA6, 0x2F88, 0x0938,\n    0x2F89, 0x0821, 0x2F8A, 0x09ED, 0x2F8B, 0x18B2, 0x2F8C, 0x194F,\n    0x2F8D, 0x0BAC, 0x2F8E, 0x0742, 0x2F8F, 0x07E6, 0x2F90, 0x04A5,\n    0x2F91, 0x19EB, 0x2F92, 0x075F, 0x2F93, 0x05AF, 0x2F94, 0x0774,\n    0x2F95, 0x0B69, 0x2F96, 0x0C7E, 0x2F97, 0x1A56, 0x2F98, 0x1A59,\n    0x2F99, 0x058B, 0x2F9A, 0x0A7A, 0x2F9B, 0x0AF8, 0x2F9C, 0x0B0D,\n    0x2F9D, 0x0A0E, 0x2F9E, 0x0902, 0x2F9F, 0x0A0F, 0x2FA0, 0x0B62,\n    0x2FA1, 0x3B4F, 0x2FA2, 0x0F22, 0x2FA3, 0x0CAB, 0x2FA4, 0x0D64,\n    0x2FA5, 0x0F6C, 0x2FA6, 0x06DA, 0x2FA7, 0x0BD5, 0x2FA8, 0x0EF3,\n    0x2FA9, 0x0DDE, 0x2FAA, 0x1BC9, 0x2FAB, 0x1BCB, 0x2FAC, 0x04CD,\n    0x2FAD, 0x21F7, 0x2FAE, 0x0D87, 0x2FAF, 0x0ED8, 0x2FB0, 0x05B5,\n    0x2FB1, 0x1C03, 0x2FB2, 0x1C05, 0x2FB3, 0x053B, 0x2FB4, 0x0E17,\n    0x2FB5, 0x0DE9, 0x2FB6, 0x0D88, 0x2FB7, 0x09EF, 0x2FB8, 0x091F,\n    0x2FB9, 0x07F3, 0x2FBA, 0x0D05, 0x2FBB, 0x080E, 0x2FBC, 0x07F4,\n    0x2FBD, 0x1C6C, 0x2FBE, 0x1C7D, 0x2FBF, 0x1C83, 0x2FC0, 0x1C84,\n    0x2FC1, 0x064E, 0x2FC2, 0x0695, 0x2FC3, 0x0BD7, 0x2FC4, 0x1CF6,\n    0x2FC5, 0x08DB, 0x2FC6, 0x1D01, 0x2FC7, 0x0E91, 0x2FC8, 0x340B,\n    0x2FC9, 0x066A, 0x2FCA, 0x0807, 0x2FCB, 0x1D16, 0x2FCC, 0x1D19,\n    0x2FCD, 0x0C1E, 0x2FCE, 0x0791, 0x2FCF, 0x0ACF, 0x2FD0, 0x0D93,\n    0x2FD1, 0x1D21, 0x2FD2, 0x1D22, 0x2FD3, 0x0F7E, 0x2FD4, 0x1D30,\n    0x2FD5, 0x1D31, 0x3000, 0x0279, 0x3001, 0x027A, 0x3002, 0x027B,\n    0x3003, 0x028F, 0x3004, 0x2074, 0x3005, 0x0291, 0x3006, 0x0292,\n    0x3007, 0x0293, 0x3008, 0x02AA, 0x3009, 0x02AB, 0x300A, 0x02AC,\n    0x300B, 0x02AD, 0x300C, 0x02AE, 0x300D, 0x02AF, 0x300E, 0x02B0,\n    0x300F, 0x02B1, 0x3010, 0x02B2, 0x3011, 0x02B3, 0x3012, 0x02DF,\n    0x3013, 0x02E4, 0x3014, 0x02A4, 0x3015, 0x02A5, 0x301C, 0x0299,\n    0x301D, 0x1DB8, 0x301F, 0x1DB9, 0x3020, 0x1F7A, 0x3030, 0x2FBA,\n    0x3033, 0x2F4C, 0x3034, 0x2F4D, 0x3035, 0x2F4E, 0x3036, 0x1F79,\n    0x3041, 0x034A, 0x3042, 0x034B, 0x3043, 0x034C, 0x3044, 0x034D,\n    0x3045, 0x034E, 0x3046, 0x034F, 0x3047, 0x0350, 0x3048, 0x0351,\n    0x3049, 0x0352, 0x304A, 0x0353, 0x304B, 0x0354, 0x304C, 0x0355,\n    0x304D, 0x0356, 0x304E, 0x0357, 0x304F, 0x0358, 0x3050, 0x0359,\n    0x3051, 0x035A, 0x3052, 0x035B, 0x3053, 0x035C, 0x3054, 0x035D,\n    0x3055, 0x035E, 0x3056, 0x035F, 0x3057, 0x0360, 0x3058, 0x0361,\n    0x3059, 0x0362, 0x305A, 0x0363, 0x305B, 0x0364, 0x305C, 0x0365,\n    0x305D, 0x0366, 0x305E, 0x0367, 0x305F, 0x0368, 0x3060, 0x0369,\n    0x3061, 0x036A, 0x3062, 0x036B, 0x3063, 0x036C, 0x3064, 0x036D,\n    0x3065, 0x036E, 0x3066, 0x036F, 0x3067, 0x0370, 0x3068, 0x0371,\n    0x3069, 0x0372, 0x306A, 0x0373, 0x306B, 0x0374, 0x306C, 0x0375,\n    0x306D, 0x0376, 0x306E, 0x0377, 0x306F, 0x0378, 0x3070, 0x0379,\n    0x3071, 0x037A, 0x3072, 0x037B, 0x3073, 0x037C, 0x3074, 0x037D,\n    0x3075, 0x037E, 0x3076, 0x037F, 0x3077, 0x0380, 0x3078, 0x0381,\n    0x3079, 0x0382, 0x307A, 0x0383, 0x307B, 0x0384, 0x307C, 0x0385,\n    0x307D, 0x0386, 0x307E, 0x0387, 0x307F, 0x0388, 0x3080, 0x0389,\n    0x3081, 0x038A, 0x3082, 0x038B, 0x3083, 0x038C, 0x3084, 0x038D,\n    0x3085, 0x038E, 0x3086, 0x038F, 0x3087, 0x0390, 0x3088, 0x0391,\n    0x3089, 0x0392, 0x308A, 0x0393, 0x308B, 0x0394, 0x308C, 0x0395,\n    0x308D, 0x0396, 0x308E, 0x0397, 0x308F, 0x0398, 0x3090, 0x0399,\n    0x3091, 0x039A, 0x3092, 0x039B, 0x3093, 0x039C, 0x3094, 0x1F16,\n    0x309B, 0x0283, 0x309C, 0x0284, 0x309D, 0x028D, 0x309E, 0x028E,\n    0x30A1, 0x039D, 0x30A2, 0x039E, 0x30A3, 0x039F, 0x30A4, 0x03A0,\n    0x30A5, 0x03A1, 0x30A6, 0x03A2, 0x30A7, 0x03A3, 0x30A8, 0x03A4,\n    0x30A9, 0x03A5, 0x30AA, 0x03A6, 0x30AB, 0x03A7, 0x30AC, 0x03A8,\n    0x30AD, 0x03A9, 0x30AE, 0x03AA, 0x30AF, 0x03AB, 0x30B0, 0x03AC,\n    0x30B1, 0x03AD, 0x30B2, 0x03AE, 0x30B3, 0x03AF, 0x30B4, 0x03B0,\n    0x30B5, 0x03B1, 0x30B6, 0x03B2, 0x30B7, 0x03B3, 0x30B8, 0x03B4,\n    0x30B9, 0x03B5, 0x30BA, 0x03B6, 0x30BB, 0x03B7, 0x30BC, 0x03B8,\n    0x30BD, 0x03B9, 0x30BE, 0x03BA, 0x30BF, 0x03BB, 0x30C0, 0x03BC,\n    0x30C1, 0x03BD, 0x30C2, 0x03BE, 0x30C3, 0x03BF, 0x30C4, 0x03C0,\n    0x30C5, 0x03C1, 0x30C6, 0x03C2, 0x30C7, 0x03C3, 0x30C8, 0x03C4,\n    0x30C9, 0x03C5, 0x30CA, 0x03C6, 0x30CB, 0x03C7, 0x30CC, 0x03C8,\n    0x30CD, 0x03C9, 0x30CE, 0x03CA, 0x30CF, 0x03CB, 0x30D0, 0x03CC,\n    0x30D1, 0x03CD, 0x30D2, 0x03CE, 0x30D3, 0x03CF, 0x30D4, 0x03D0,\n    0x30D5, 0x03D1, 0x30D6, 0x03D2, 0x30D7, 0x03D3, 0x30D8, 0x03D4,\n    0x30D9, 0x03D5, 0x30DA, 0x03D6, 0x30DB, 0x03D7, 0x30DC, 0x03D8,\n    0x30DD, 0x03D9, 0x30DE, 0x03DA, 0x30DF, 0x03DB, 0x30E0, 0x03DC,\n    0x30E1, 0x03DD, 0x30E2, 0x03DE, 0x30E3, 0x03DF, 0x30E4, 0x03E0,\n    0x30E5, 0x03E1, 0x30E6, 0x03E2, 0x30E7, 0x03E3, 0x30E8, 0x03E4,\n    0x30E9, 0x03E5, 0x30EA, 0x03E6, 0x30EB, 0x03E7, 0x30EC, 0x03E8,\n    0x30ED, 0x03E9, 0x30EE, 0x03EA, 0x30EF, 0x03EB, 0x30F0, 0x03EC,\n    0x30F1, 0x03ED, 0x30F2, 0x03EE, 0x30F3, 0x03EF, 0x30F4, 0x03F0,\n    0x30F5, 0x03F1, 0x30F6, 0x03F2, 0x30F7, 0x2079, 0x30F8, 0x207A,\n    0x30F9, 0x207B, 0x30FA, 0x207C, 0x30FB, 0x027E, 0x30FC, 0x0294,\n    0x30FD, 0x028B, 0x30FE, 0x028C, 0x3220, 0x278E, 0x3221, 0x278F,\n    0x3222, 0x2790, 0x3223, 0x2791, 0x3224, 0x2792, 0x3225, 0x2793,\n    0x3226, 0x2794, 0x3227, 0x2795, 0x3228, 0x2796, 0x3229, 0x2797,\n    0x322A, 0x2006, 0x322B, 0x2007, 0x322C, 0x2008, 0x322D, 0x2009,\n    0x322E, 0x200A, 0x322F, 0x200B, 0x3230, 0x2005, 0x3231, 0x1DC2,\n    0x3232, 0x1DC3, 0x3233, 0x1FCF, 0x3234, 0x1FCD, 0x3235, 0x1FD4,\n    0x3236, 0x1FD3, 0x3237, 0x200C, 0x3238, 0x1FCE, 0x3239, 0x1DC4,\n    0x323A, 0x1FD7, 0x323B, 0x1FD5, 0x323C, 0x1FD0, 0x323D, 0x1FCB,\n    0x323E, 0x1FD2, 0x323F, 0x1FCC, 0x3240, 0x1FD6, 0x3241, 0x200D,\n    0x3242, 0x1FD1, 0x3243, 0x1FCA, 0x3280, 0x28DD, 0x3281, 0x28DE,\n    0x3282, 0x28DF, 0x3283, 0x28E0, 0x3284, 0x28E1, 0x3285, 0x28E2,\n    0x3286, 0x28E3, 0x3287, 0x28E4, 0x3288, 0x28E5, 0x3289, 0x28E6,\n    0x328A, 0x28E8, 0x328B, 0x28E9, 0x328C, 0x28EA, 0x328D, 0x28EB,\n    0x328E, 0x28EC, 0x328F, 0x28ED, 0x3290, 0x28E7, 0x3291, 0x1FE1,\n    0x3292, 0x1FE0, 0x3293, 0x1FE2, 0x3294, 0x1FDC, 0x3295, 0x28FF,\n    0x3296, 0x1FE5, 0x3297, 0x28FC, 0x3298, 0x1FDE, 0x3299, 0x201F,\n    0x329A, 0x28F9, 0x329B, 0x28F8, 0x329C, 0x28FE, 0x329D, 0x207F,\n    0x329E, 0x1FFF, 0x329F, 0x28EF, 0x32A0, 0x28F6, 0x32A1, 0x28F7,\n    0x32A2, 0x28FB, 0x32A3, 0x28FA, 0x32A4, 0x1DBD, 0x32A5, 0x1DBE,\n    0x32A6, 0x1DBF, 0x32A7, 0x1DC0, 0x32A8, 0x1DC1, 0x32A9, 0x1FDA,\n    0x32AA, 0x1FDD, 0x32AB, 0x1FDF, 0x32AC, 0x1FE3, 0x32AD, 0x1FD9,\n    0x32AE, 0x1FE4, 0x32AF, 0x1FDB, 0x32B0, 0x1FD8, 0x32D0, 0x28AD,\n    0x32D1, 0x28AE, 0x32D2, 0x28AF, 0x32D3, 0x28B0, 0x32D4, 0x28B1,\n    0x32D5, 0x28B2, 0x32D6, 0x28B3, 0x32D7, 0x28B4, 0x32D8, 0x28B5,\n    0x32D9, 0x28B6, 0x32DA, 0x28B7, 0x32DB, 0x28B8, 0x32DC, 0x28B9,\n    0x32DD, 0x28BA, 0x32DE, 0x28BB, 0x32DF, 0x28BC, 0x32E0, 0x28BD,\n    0x32E1, 0x28BE, 0x32E2, 0x28BF, 0x32E3, 0x28C0, 0x32E4, 0x28C1,\n    0x32E5, 0x28C2, 0x32E6, 0x28C3, 0x32E7, 0x28C4, 0x32E8, 0x28C5,\n    0x32E9, 0x28C6, 0x32EA, 0x28C7, 0x32EB, 0x28C8, 0x32EC, 0x28C9,\n    0x32ED, 0x28CA, 0x32EE, 0x28CB, 0x32EF, 0x28CC, 0x32F0, 0x28CD,\n    0x32F1, 0x28CE, 0x32F2, 0x28CF, 0x32F3, 0x28D0, 0x32F4, 0x28D1,\n    0x32F5, 0x28D2, 0x32F6, 0x28D3, 0x32F7, 0x28D4, 0x32F8, 0x28D5,\n    0x32F9, 0x28D6, 0x32FA, 0x28D7, 0x32FB, 0x28D8, 0x32FC, 0x28D9,\n    0x32FD, 0x28DA, 0x32FE, 0x28DB, 0x3300, 0x1F70, 0x3301, 0x2E62,\n    0x3302, 0x2E63, 0x3303, 0x1F6A, 0x3304, 0x2E64, 0x3305, 0x1FF7,\n    0x3306, 0x2E65, 0x3307, 0x2E69, 0x3308, 0x2E67, 0x3309, 0x2E6C,\n    0x330A, 0x2E6A, 0x330B, 0x2E6E, 0x330C, 0x2E70, 0x330D, 0x1DAB,\n    0x330E, 0x2E71, 0x330F, 0x2E72, 0x3310, 0x2E73, 0x3311, 0x2E74,\n    0x3312, 0x2E75, 0x3313, 0x2E76, 0x3314, 0x1DA2, 0x3315, 0x1F69,\n    0x3316, 0x1F67, 0x3317, 0x2E78, 0x3318, 0x1F68, 0x3319, 0x2E7A,\n    0x331A, 0x2E7C, 0x331B, 0x2E7D, 0x331C, 0x2E7E, 0x331D, 0x2E7F,\n    0x331E, 0x1F73, 0x331F, 0x2E80, 0x3320, 0x2E81, 0x3321, 0x2E82,\n    0x3322, 0x1F66, 0x3323, 0x1F6B, 0x3324, 0x2E83, 0x3325, 0x2E85,\n    0x3326, 0x1DAC, 0x3327, 0x1DA6, 0x3328, 0x2E88, 0x3329, 0x2E89,\n    0x332A, 0x1F74, 0x332B, 0x1DAE, 0x332D, 0x2E8B, 0x332E, 0x2E8E,\n    0x332F, 0x2E8F, 0x3330, 0x2E90, 0x3331, 0x1F71, 0x3332, 0x2E91,\n    0x3333, 0x2087, 0x3334, 0x2E94, 0x3335, 0x2E95, 0x3336, 0x1DA8,\n    0x3337, 0x2E9A, 0x3338, 0x2E9C, 0x3339, 0x1F6E, 0x333A, 0x2E9D,\n    0x333B, 0x1F6F, 0x333C, 0x2E96, 0x333D, 0x2E9E, 0x333E, 0x2EA0,\n    0x333F, 0x2EA1, 0x3340, 0x2EA2, 0x3341, 0x2E9F, 0x3342, 0x1F6D,\n    0x3343, 0x2EA3, 0x3344, 0x2EA4, 0x3345, 0x2EA5, 0x3346, 0x2EA6,\n    0x3347, 0x1F72, 0x3348, 0x2EA7, 0x3349, 0x1DA1, 0x334A, 0x1DAF,\n    0x334B, 0x2EA8, 0x334C, 0x2EA9, 0x334D, 0x1DA4, 0x334E, 0x2088,\n    0x334F, 0x2EAA, 0x3350, 0x2EAB, 0x3351, 0x1DA9, 0x3352, 0x2EAE,\n    0x3353, 0x2EB2, 0x3354, 0x2EAF, 0x3355, 0x2EB3, 0x3356, 0x2EB4,\n    0x3357, 0x1F6C, 0x3371, 0x2E55, 0x337B, 0x2083, 0x337C, 0x1DC7,\n    0x337D, 0x1DC6, 0x337E, 0x1DC5, 0x337F, 0x1F76, 0x3385, 0x1F5F,\n    0x3386, 0x1F60, 0x3387, 0x1F61, 0x3388, 0x2000, 0x3389, 0x2001,\n    0x338D, 0x2E58, 0x338E, 0x1DB4, 0x338F, 0x1DB5, 0x3390, 0x1F63,\n    0x3396, 0x1F65, 0x3397, 0x1F58, 0x3398, 0x1F5A, 0x339B, 0x2E59,\n    0x339C, 0x1DB1, 0x339D, 0x1DB2, 0x339E, 0x1DB3, 0x339F, 0x1FFA,\n    0x33A0, 0x1F54, 0x33A1, 0x1DB7, 0x33A2, 0x1F55, 0x33A3, 0x1FFB,\n    0x33A4, 0x1F56, 0x33A5, 0x1F57, 0x33A6, 0x1FFC, 0x33B0, 0x1F5E,\n    0x33B1, 0x1F5D, 0x33B2, 0x1F5C, 0x33B3, 0x1F5B, 0x33C2, 0x2E50,\n    0x33C4, 0x1DB6, 0x33C8, 0x2002, 0x33CB, 0x1F62, 0x33CC, 0x1FF6,\n    0x33CD, 0x1DBB, 0x33D4, 0x1F64, 0x33D7, 0x2E5D, 0x33D8, 0x2E5E,\n    0x33DA, 0x2E4B, 0x3402, 0x3582, 0x3405, 0x3C1B, 0x3427, 0x3656,\n    0x3488, 0x3C52, 0x34DB, 0x3C41, 0x351F, 0x3629, 0x353E, 0x371E,\n    0x378D, 0x361A, 0x37E2, 0x372B, 0x3AF3, 0x3C40, 0x3B22, 0x3C49,\n    0x3B88, 0x368D, 0x3E8A, 0x3C43, 0x3EDA, 0x3C48, 0x3FB1, 0x3754,\n    0x4093, 0x3C4C, 0x4103, 0x3C4F, 0x4264, 0x3760, 0x4293, 0x3C50,\n    0x440C, 0x3C42, 0x4453, 0x3773, 0x457A, 0x3C4B, 0x4665, 0x3C4E,\n    0x46AE, 0x3C51, 0x4BE8, 0x3C46, 0x4E00, 0x04B0, 0x4E01, 0x0BB8,\n    0x4E03, 0x08E3, 0x4E04, 0x37D8, 0x4E05, 0x37D9, 0x4E07, 0x0EAA,\n    0x4E08, 0x09CE, 0x4E09, 0x087E, 0x4E0A, 0x09CD, 0x4E0B, 0x053C,\n    0x4E0D, 0x0DC6, 0x4E0E, 0x0F29, 0x4E10, 0x0FFB, 0x4E11, 0x04D1,\n    0x4E14, 0x05CC, 0x4E15, 0x0FFC, 0x4E16, 0x0A48, 0x4E17, 0x10D7,\n    0x4E18, 0x0670, 0x4E19, 0x0E0A, 0x4E1E, 0x09CF, 0x4E1F, 0x37DA,\n    0x4E21, 0x0F86, 0x4E26, 0x0E12, 0x4E28, 0x20B3, 0x4E2A, 0x0FFD,\n    0x4E2B, 0x37DB, 0x4E2C, 0x374D, 0x4E2D, 0x0BA4, 0x4E2F, 0x37DC,\n    0x4E30, 0x37DD, 0x4E31, 0x0FFE, 0x4E32, 0x06F2, 0x4E36, 0x0FFF,\n    0x4E37, 0x369D, 0x4E38, 0x0619, 0x4E39, 0x0B6E, 0x4E3B, 0x0913,\n    0x4E3C, 0x1000, 0x4E3F, 0x1001, 0x4E40, 0x37DE, 0x4E41, 0x37DF,\n    0x4E42, 0x1002, 0x4E43, 0x0CEB, 0x4E44, 0x37E0, 0x4E45, 0x0671,\n    0x4E48, 0x372E, 0x4E4B, 0x0CED, 0x4E4D, 0x0CBB, 0x4E4E, 0x0777,\n    0x4E4F, 0x0E61, 0x4E55, 0x1950, 0x4E56, 0x1003, 0x4E57, 0x09D0,\n    0x4E58, 0x1004, 0x4E59, 0x0535, 0x4E5A, 0x37E1, 0x4E5D, 0x06DD,\n    0x4E5E, 0x07A4, 0x4E5F, 0x0EF5, 0x4E62, 0x1233, 0x4E71, 0x0F5A,\n    0x4E73, 0x0CD5, 0x4E7E, 0x05E1, 0x4E7F, 0x37E2, 0x4E80, 0x064F,\n    0x4E82, 0x1005, 0x4E85, 0x1006, 0x4E86, 0x0F83, 0x4E88, 0x0F27,\n    0x4E89, 0x0AEA, 0x4E8A, 0x1008, 0x4E8B, 0x08C4, 0x4E8C, 0x0CCB,\n    0x4E8D, 0x37E3, 0x4E8E, 0x100B, 0x4E91, 0x04E0, 0x4E92, 0x0793,\n    0x4E94, 0x0792, 0x4E95, 0x04AA, 0x4E96, 0x37E4, 0x4E98, 0x0FF1,\n    0x4E99, 0x0FF0, 0x4E9B, 0x0823, 0x4E9C, 0x0465, 0x4E9E, 0x100C,\n    0x4E9F, 0x100D, 0x4EA0, 0x100E, 0x4EA1, 0x0E62, 0x4EA2, 0x100F,\n    0x4EA4, 0x07A6, 0x4EA5, 0x04AB, 0x4EA6, 0x0EA0, 0x4EA8, 0x0696,\n    0x4EAB, 0x0697, 0x4EAC, 0x0698, 0x4EAD, 0x0BFE, 0x4EAE, 0x0F84,\n    0x4EB0, 0x1010, 0x4EB3, 0x1011, 0x4EB6, 0x1012, 0x4EB9, 0x37E5,\n    0x4EBA, 0x0A13, 0x4EBB, 0x3620, 0x4EC0, 0x0944, 0x4EC1, 0x0A14,\n    0x4EC2, 0x1017, 0x4EC4, 0x1015, 0x4EC6, 0x1016, 0x4EC7, 0x0672,\n    0x4ECA, 0x0813, 0x4ECB, 0x0570, 0x4ECD, 0x1014, 0x4ECE, 0x1013,\n    0x4ECF, 0x0DF9, 0x4ED0, 0x37E6, 0x4ED4, 0x0894, 0x4ED5, 0x0893,\n    0x4ED6, 0x0B1E, 0x4ED7, 0x1018, 0x4ED8, 0x0DC7, 0x4ED9, 0x0A8B,\n    0x4EDD, 0x0290, 0x4EDE, 0x1019, 0x4EDF, 0x101B, 0x4EE0, 0x37E7,\n    0x4EE1, 0x20B4, 0x4EE3, 0x0B45, 0x4EE4, 0x0FA9, 0x4EE5, 0x048E,\n    0x4EED, 0x101A, 0x4EEE, 0x053E, 0x4EF0, 0x06BC, 0x4EF2, 0x0BA5,\n    0x4EF6, 0x0745, 0x4EF7, 0x101C, 0x4EFB, 0x0CDA, 0x4EFC, 0x20B5,\n    0x4EFD, 0x37E8, 0x4EFF, 0x37E9, 0x4F00, 0x20B6, 0x4F01, 0x0627,\n    0x4F03, 0x20B7, 0x4F09, 0x101D, 0x4F0A, 0x048F, 0x4F0B, 0x37EA,\n    0x4F0D, 0x0794, 0x4F0E, 0x0628, 0x4F0F, 0x0DEC, 0x4F10, 0x0D46,\n    0x4F11, 0x0673, 0x4F15, 0x37EB, 0x4F1A, 0x0571, 0x4F1C, 0x1040,\n    0x4F1D, 0x0C3B, 0x4F2F, 0x0D22, 0x4F30, 0x101F, 0x4F34, 0x0D50,\n    0x4F36, 0x0FAA, 0x4F38, 0x09F3, 0x4F39, 0x20B8, 0x4F3A, 0x0895,\n    0x4F3B, 0x37ED, 0x4F3C, 0x08C5, 0x4F3D, 0x0540, 0x4F43, 0x0BED,\n    0x4F46, 0x0B60, 0x4F47, 0x1023, 0x4F49, 0x37EE, 0x4F4D, 0x0490,\n    0x4F4E, 0x0BFF, 0x4F4F, 0x0945, 0x4F50, 0x0824, 0x4F51, 0x0F0E,\n    0x4F53, 0x0B2E, 0x4F54, 0x37EF, 0x4F55, 0x053F, 0x4F56, 0x20B9,\n    0x4F57, 0x1022, 0x4F59, 0x0F28, 0x4F5A, 0x101E, 0x4F5B, 0x1020,\n    0x4F5C, 0x085E, 0x4F5D, 0x1021, 0x4F5E, 0x11D3, 0x4F60, 0x37EC,\n    0x4F69, 0x1029, 0x4F6F, 0x102C, 0x4F70, 0x102A, 0x4F73, 0x0542,\n    0x4F75, 0x0E0B, 0x4F76, 0x1024, 0x4F7A, 0x37F0, 0x4F7B, 0x1028,\n    0x4F7C, 0x07A7, 0x4F7D, 0x37F1, 0x4F7E, 0x37F2, 0x4F7F, 0x0896,\n    0x4F83, 0x05E2, 0x4F86, 0x102D, 0x4F88, 0x1025, 0x4F8A, 0x20BB,\n    0x4F8B, 0x0FAB, 0x4F8D, 0x08C6, 0x4F8F, 0x1026, 0x4F91, 0x102B,\n    0x4F92, 0x20BA, 0x4F94, 0x20BD, 0x4F96, 0x102E, 0x4F97, 0x37F3,\n    0x4F98, 0x1027, 0x4F9A, 0x20BC, 0x4F9B, 0x0699, 0x4F9D, 0x0491,\n    0x4FA0, 0x069A, 0x4FA1, 0x0541, 0x4FAB, 0x11D4, 0x4FAD, 0x0EA7,\n    0x4FAE, 0x0DE0, 0x4FAF, 0x07A8, 0x4FB5, 0x09F5, 0x4FB6, 0x0F7F,\n    0x4FBE, 0x37F4, 0x4FBF, 0x0E28, 0x4FC2, 0x070E, 0x4FC3, 0x0B05,\n    0x4FC4, 0x0564, 0x4FC9, 0x20AC, 0x4FCA, 0x095D, 0x4FCD, 0x20BE,\n    0x4FCE, 0x1032, 0x4FCF, 0x37F5, 0x4FD0, 0x1037, 0x4FD1, 0x1035,\n    0x4FD3, 0x3C2F, 0x4FD4, 0x1030, 0x4FD7, 0x0B0F, 0x4FD8, 0x1033,\n    0x4FDA, 0x1036, 0x4FDB, 0x1034, 0x4FDD, 0x0E2D, 0x4FDF, 0x1031,\n    0x4FE0, 0x1DEC, 0x4FE1, 0x09F4, 0x4FE3, 0x0EA1, 0x4FE4, 0x1038,\n    0x4FE5, 0x1039, 0x4FEE, 0x092E, 0x4FEF, 0x1046, 0x4FF3, 0x0D06,\n    0x4FF5, 0x0DA8, 0x4FF6, 0x1041, 0x4FF8, 0x0E40, 0x4FFA, 0x0536,\n    0x4FFD, 0x37F6, 0x4FFE, 0x1045, 0x4FFF, 0x20C1, 0x5000, 0x37F7,\n    0x5001, 0x37F8, 0x5002, 0x3447, 0x5005, 0x103F, 0x5006, 0x1048,\n    0x5009, 0x0AD4, 0x500B, 0x0778, 0x500D, 0x0D12, 0x500F, 0x1600,\n    0x5010, 0x37F9, 0x5011, 0x1047, 0x5012, 0x0C57, 0x5014, 0x103C,\n    0x5016, 0x07AA, 0x5019, 0x07A9, 0x501A, 0x103A, 0x501B, 0x37FA,\n    0x501E, 0x20C2, 0x501F, 0x0906, 0x5021, 0x1042, 0x5022, 0x20C0,\n    0x5023, 0x0E3F, 0x5024, 0x0B8B, 0x5025, 0x103E, 0x5026, 0x0747,\n    0x5027, 0x37FB, 0x5028, 0x103B, 0x5029, 0x1043, 0x502A, 0x103D,\n    0x502B, 0x0F99, 0x502C, 0x1044, 0x502D, 0x0FE7, 0x502E, 0x37FC,\n    0x5036, 0x06DE, 0x5039, 0x0746, 0x503B, 0x3800, 0x5040, 0x20BF,\n    0x5042, 0x20C5, 0x5043, 0x1049, 0x5046, 0x20C3, 0x5047, 0x104A,\n    0x5048, 0x104E, 0x5049, 0x0492, 0x504F, 0x0E20, 0x5050, 0x104D,\n    0x5055, 0x104C, 0x5056, 0x1050, 0x5057, 0x37FD, 0x505A, 0x104F,\n    0x505C, 0x0C00, 0x5065, 0x0748, 0x5066, 0x37FE, 0x506A, 0x37FF,\n    0x506C, 0x1051, 0x5070, 0x20C4, 0x5072, 0x08F1, 0x5074, 0x0B06,\n    0x5075, 0x0C01, 0x5076, 0x06EE, 0x5078, 0x1052, 0x507D, 0x0650,\n    0x5080, 0x1053, 0x5085, 0x1055, 0x508D, 0x0E63, 0x508F, 0x3801,\n    0x5091, 0x073C, 0x5094, 0x20C6, 0x5096, 0x3802, 0x5098, 0x087F,\n    0x5099, 0x0D8B, 0x509A, 0x1054, 0x509C, 0x3803, 0x50AC, 0x0835,\n    0x50AD, 0x0F2D, 0x50B2, 0x1057, 0x50B3, 0x105A, 0x50B4, 0x1056,\n    0x50B5, 0x0834, 0x50B7, 0x0987, 0x50BE, 0x070F, 0x50C2, 0x105B,\n    0x50C5, 0x06C7, 0x50C9, 0x1058, 0x50CA, 0x1059, 0x50CC, 0x3804,\n    0x50CD, 0x0C87, 0x50CF, 0x0AFE, 0x50D1, 0x069B, 0x50D5, 0x0E7B,\n    0x50D6, 0x105C, 0x50D8, 0x20C8, 0x50D9, 0x3C30, 0x50DA, 0x0F85,\n    0x50DE, 0x105D, 0x50E3, 0x1060, 0x50E5, 0x105E, 0x50E6, 0x3805,\n    0x50E7, 0x0AD0, 0x50E9, 0x3806, 0x50ED, 0x105F, 0x50EE, 0x1061,\n    0x50EF, 0x3807, 0x50F0, 0x3C31, 0x50F4, 0x20C7, 0x50F5, 0x1063,\n    0x50F9, 0x1062, 0x50FB, 0x0E18, 0x5100, 0x0651, 0x5101, 0x1065,\n    0x5102, 0x1066, 0x5104, 0x052F, 0x5108, 0x3808, 0x5109, 0x1064,\n    0x510B, 0x3809, 0x5110, 0x380A, 0x5112, 0x0920, 0x5114, 0x1069,\n    0x5115, 0x1068, 0x5116, 0x1067, 0x5118, 0x102F, 0x511A, 0x106A,\n    0x511B, 0x380B, 0x511E, 0x380C, 0x511F, 0x0988, 0x5121, 0x106B,\n    0x512A, 0x0F0F, 0x5132, 0x0EE5, 0x5137, 0x106D, 0x513A, 0x106C,\n    0x513B, 0x106F, 0x513C, 0x106E, 0x513F, 0x1070, 0x5140, 0x1071,\n    0x5141, 0x04B8, 0x5143, 0x0769, 0x5144, 0x0711, 0x5145, 0x0946,\n    0x5146, 0x0BB9, 0x5147, 0x069C, 0x5148, 0x0A8C, 0x5149, 0x07AB,\n    0x514A, 0x20C9, 0x514B, 0x0800, 0x514C, 0x1073, 0x514D, 0x0ED4,\n    0x514E, 0x0C40, 0x5150, 0x08C7, 0x5152, 0x1072, 0x5154, 0x1074,\n    0x515A, 0x0C58, 0x515C, 0x05D3, 0x515F, 0x380D, 0x5162, 0x1075,\n    0x5164, 0x20CA, 0x5165, 0x0CD6, 0x5167, 0x368E, 0x5168, 0x0AB6,\n    0x5169, 0x1077, 0x516A, 0x1078, 0x516B, 0x0D40, 0x516C, 0x07AC,\n    0x516D, 0x0FE1, 0x516E, 0x1079, 0x5171, 0x069E, 0x5175, 0x0E0C,\n    0x5176, 0x0B16, 0x5177, 0x06E9, 0x5178, 0x0C2F, 0x5179, 0x3779,\n    0x517C, 0x0749, 0x5180, 0x107A, 0x5182, 0x107B, 0x5185, 0x0CBA,\n    0x5186, 0x0501, 0x5189, 0x107E, 0x518A, 0x086D, 0x518C, 0x107D,\n    0x518D, 0x0836, 0x518F, 0x107F, 0x5190, 0x185B, 0x5191, 0x1080,\n    0x5192, 0x0E6F, 0x5193, 0x1081, 0x5195, 0x1082, 0x5196, 0x1083,\n    0x5197, 0x09D1, 0x5199, 0x08F8, 0x519D, 0x20CB, 0x51A0, 0x05E3,\n    0x51A1, 0x380E, 0x51A2, 0x1086, 0x51A4, 0x1084, 0x51A5, 0x0EC9,\n    0x51A6, 0x1085, 0x51A8, 0x0DCC, 0x51A9, 0x1087, 0x51AA, 0x1088,\n    0x51AB, 0x1089, 0x51AC, 0x0C59, 0x51B0, 0x108D, 0x51B1, 0x108B,\n    0x51B2, 0x108C, 0x51B3, 0x108A, 0x51B4, 0x0853, 0x51B5, 0x108E,\n    0x51B6, 0x0EF6, 0x51B7, 0x0FAC, 0x51BC, 0x380F, 0x51BD, 0x108F,\n    0x51BE, 0x20CC, 0x51C3, 0x3C32, 0x51C4, 0x0A4C, 0x51C5, 0x1090,\n    0x51C6, 0x0964, 0x51C9, 0x1091, 0x51CB, 0x0BBA, 0x51CC, 0x0F87,\n    0x51CD, 0x0C5A, 0x51D6, 0x10DA, 0x51DB, 0x1092, 0x51DC, 0x205C,\n    0x51DD, 0x06BD, 0x51DE, 0x3810, 0x51E0, 0x1093, 0x51E1, 0x0E8C,\n    0x51E6, 0x0972, 0x51E7, 0x0B5C, 0x51E9, 0x1095, 0x51EA, 0x0CBC,\n    0x51EC, 0x20CD, 0x51ED, 0x1096, 0x51EE, 0x3811, 0x51F0, 0x1097,\n    0x51F1, 0x058C, 0x51F4, 0x3812, 0x51F5, 0x1098, 0x51F6, 0x069F,\n    0x51F8, 0x0CA4, 0x51F9, 0x051C, 0x51FA, 0x095A, 0x51FD, 0x0D35,\n    0x51FE, 0x1099, 0x5200, 0x0C5B, 0x5201, 0x3813, 0x5202, 0x3814,\n    0x5203, 0x0A15, 0x5204, 0x109A, 0x5206, 0x0DFC, 0x5207, 0x0A7E,\n    0x5208, 0x05DE, 0x520A, 0x05E5, 0x520B, 0x109B, 0x520E, 0x109D,\n    0x5211, 0x0710, 0x5213, 0x3815, 0x5214, 0x109C, 0x5215, 0x20CE,\n    0x5217, 0x0FBB, 0x521D, 0x0973, 0x5224, 0x0D51, 0x5225, 0x0E1C,\n    0x5227, 0x109E, 0x5229, 0x0F62, 0x522A, 0x109F, 0x522E, 0x10A0,\n    0x5230, 0x0C78, 0x5233, 0x10A1, 0x5236, 0x0A4D, 0x5237, 0x086E,\n    0x5238, 0x074A, 0x5239, 0x10A2, 0x523A, 0x0897, 0x523B, 0x0801,\n    0x5243, 0x0C02, 0x5244, 0x10A4, 0x5247, 0x0B07, 0x5249, 0x3816,\n    0x524A, 0x085F, 0x524B, 0x10A5, 0x524C, 0x10A6, 0x524D, 0x0AB2,\n    0x524F, 0x10A3, 0x5254, 0x10A8, 0x5256, 0x0E64, 0x525B, 0x07F6,\n    0x525D, 0x1E5E, 0x525E, 0x10A7, 0x5261, 0x3817, 0x5263, 0x074B,\n    0x5264, 0x084E, 0x5265, 0x0D23, 0x5266, 0x3818, 0x5269, 0x10AB,\n    0x526A, 0x10A9, 0x526F, 0x0DED, 0x5270, 0x09D2, 0x5271, 0x10B2,\n    0x5272, 0x05C2, 0x5273, 0x10AC, 0x5274, 0x10AA, 0x5275, 0x0AD1,\n    0x527D, 0x10AE, 0x527F, 0x10AD, 0x5283, 0x05A2, 0x5287, 0x0736,\n    0x5288, 0x10B3, 0x5289, 0x0F75, 0x528D, 0x10AF, 0x5291, 0x10B4,\n    0x5292, 0x10B1, 0x5293, 0x3819, 0x5294, 0x10B0, 0x529B, 0x0F97,\n    0x529C, 0x20CF, 0x529F, 0x07AD, 0x52A0, 0x0543, 0x52A3, 0x0FBC,\n    0x52A6, 0x20D0, 0x52A9, 0x097F, 0x52AA, 0x0C52, 0x52AB, 0x07F7,\n    0x52AC, 0x10B7, 0x52AD, 0x10B8, 0x52AF, 0x217D, 0x52B1, 0x0FAD,\n    0x52B4, 0x0FD1, 0x52B5, 0x10BA, 0x52B9, 0x07AE, 0x52BC, 0x10B9,\n    0x52BE, 0x058D, 0x52C0, 0x20D1, 0x52C1, 0x10BB, 0x52C3, 0x0E84,\n    0x52C5, 0x0BD8, 0x52C7, 0x0F10, 0x52C8, 0x381A, 0x52C9, 0x0E29,\n    0x52CD, 0x10BC, 0x52D0, 0x36E8, 0x52D2, 0x1BEE, 0x52D5, 0x0C88,\n    0x52D7, 0x10BD, 0x52D8, 0x05E6, 0x52D9, 0x0EBF, 0x52DB, 0x20D2,\n    0x52DD, 0x0989, 0x52DE, 0x10BE, 0x52DF, 0x0E37, 0x52E0, 0x10C2,\n    0x52E2, 0x0A4E, 0x52E3, 0x10BF, 0x52E4, 0x06C8, 0x52E6, 0x10C0,\n    0x52E7, 0x05E7, 0x52F0, 0x381B, 0x52F2, 0x0704, 0x52F3, 0x10C3,\n    0x52F5, 0x10C4, 0x52F8, 0x10C5, 0x52F9, 0x10C6, 0x52FA, 0x0907,\n    0x52FE, 0x07AF, 0x52FF, 0x0EEA, 0x5300, 0x20D3, 0x5301, 0x0EF4,\n    0x5302, 0x0CCF, 0x5305, 0x0E41, 0x5306, 0x10C7, 0x5307, 0x20D4,\n    0x5308, 0x10C8, 0x530A, 0x381C, 0x530B, 0x381D, 0x530D, 0x10CA,\n    0x530F, 0x10CC, 0x5310, 0x10CB, 0x5315, 0x10CD, 0x5316, 0x053D,\n    0x5317, 0x0E7A, 0x5319, 0x086C, 0x531A, 0x10CE, 0x531D, 0x0ADB,\n    0x5320, 0x098A, 0x5321, 0x06A1, 0x5323, 0x10CF, 0x5324, 0x20D5,\n    0x532A, 0x0D6F, 0x532F, 0x10D0, 0x5331, 0x10D1, 0x5333, 0x10D2,\n    0x5338, 0x10D3, 0x5339, 0x0D96, 0x533A, 0x06E0, 0x533B, 0x04A9,\n    0x533E, 0x381E, 0x533F, 0x0C97, 0x5340, 0x10D4, 0x5341, 0x0947,\n    0x5343, 0x0A8D, 0x5345, 0x10D6, 0x5346, 0x10D5, 0x5347, 0x098B,\n    0x5348, 0x0795, 0x5349, 0x10D8, 0x534A, 0x0D52, 0x534B, 0x3820,\n    0x534C, 0x381F, 0x534D, 0x10D9, 0x5351, 0x0D70, 0x5352, 0x0B14,\n    0x5353, 0x0B4E, 0x5354, 0x06A0, 0x5357, 0x0CC6, 0x5358, 0x0B6F,\n    0x535A, 0x0D24, 0x535C, 0x0E7C, 0x535E, 0x10DB, 0x5360, 0x0A8E,\n    0x5361, 0x3821, 0x5366, 0x070B, 0x5369, 0x10DC, 0x536C, 0x3822,\n    0x536E, 0x10DD, 0x536F, 0x04CE, 0x5370, 0x04B9, 0x5371, 0x0629,\n    0x5372, 0x20D6, 0x5373, 0x0B08, 0x5374, 0x066B, 0x5375, 0x0F5B,\n    0x5377, 0x10E0, 0x5378, 0x0537, 0x537B, 0x10DF, 0x537D, 0x3435,\n    0x537F, 0x06A2, 0x5382, 0x10E1, 0x5384, 0x0EFD, 0x5389, 0x37D0,\n    0x5393, 0x20D7, 0x5396, 0x10E2, 0x5398, 0x0F9A, 0x539A, 0x07B0,\n    0x539F, 0x076A, 0x53A0, 0x10E3, 0x53A5, 0x10E5, 0x53A6, 0x10E4,\n    0x53A8, 0x0A25, 0x53A9, 0x04DB, 0x53AB, 0x3823, 0x53AD, 0x0500,\n    0x53AE, 0x10E6, 0x53B0, 0x10E7, 0x53B2, 0x20D8, 0x53B3, 0x076B,\n    0x53B6, 0x10E8, 0x53BB, 0x0688, 0x53C2, 0x0880, 0x53C3, 0x10E9,\n    0x53C8, 0x0EA2, 0x53C9, 0x0825, 0x53CA, 0x0674, 0x53CB, 0x0F11,\n    0x53CC, 0x0AD2, 0x53CD, 0x0D53, 0x53CE, 0x0929, 0x53D4, 0x0951,\n    0x53D6, 0x0914, 0x53D7, 0x0921, 0x53D9, 0x0980, 0x53DA, 0x3824,\n    0x53DB, 0x0D54, 0x53DD, 0x20D9, 0x53DF, 0x10EC, 0x53E1, 0x04E5,\n    0x53E2, 0x0AD3, 0x53E3, 0x07B1, 0x53E4, 0x0779, 0x53E5, 0x06DF,\n    0x53E6, 0x3825, 0x53E8, 0x10F0, 0x53E9, 0x0B5F, 0x53EA, 0x0B5E,\n    0x53EB, 0x06A3, 0x53EC, 0x098C, 0x53ED, 0x10F1, 0x53EE, 0x10EF,\n    0x53EF, 0x0544, 0x53F0, 0x0B46, 0x53F1, 0x08E4, 0x53F2, 0x0899,\n    0x53F3, 0x04C8, 0x53F5, 0x3826, 0x53F6, 0x05CE, 0x53F7, 0x07F8,\n    0x53F8, 0x0898, 0x53FA, 0x10F2, 0x5401, 0x10F3, 0x5403, 0x0663,\n    0x5404, 0x05A4, 0x5408, 0x07F9, 0x5409, 0x0662, 0x540A, 0x0BFB,\n    0x540B, 0x04C7, 0x540C, 0x0C89, 0x540D, 0x0ECA, 0x540E, 0x07B3,\n    0x540F, 0x0F63, 0x5410, 0x0C41, 0x5411, 0x07B2, 0x541B, 0x0705,\n    0x541D, 0x10FC, 0x541F, 0x06DB, 0x5420, 0x0E78, 0x5426, 0x0D71,\n    0x5427, 0x3827, 0x5429, 0x10FB, 0x542B, 0x061A, 0x542C, 0x10F6,\n    0x542D, 0x10F7, 0x542E, 0x10F9, 0x5433, 0x35C0, 0x5436, 0x10FA,\n    0x5438, 0x0675, 0x5439, 0x0A27, 0x543B, 0x0DFD, 0x543C, 0x10F8,\n    0x543D, 0x10F4, 0x543E, 0x0797, 0x543F, 0x35CF, 0x5440, 0x10F5,\n    0x5442, 0x0FCA, 0x5446, 0x0E42, 0x5448, 0x0C04, 0x5449, 0x0796,\n    0x544A, 0x0802, 0x544D, 0x3828, 0x544E, 0x10FD, 0x5451, 0x0CB5,\n    0x5455, 0x3723, 0x545F, 0x1101, 0x5466, 0x3829, 0x5468, 0x092A,\n    0x546A, 0x0922, 0x546B, 0x382A, 0x5470, 0x1104, 0x5471, 0x1102,\n    0x5473, 0x0EAF, 0x5474, 0x382B, 0x5475, 0x10FF, 0x5476, 0x1108,\n    0x5477, 0x1103, 0x547B, 0x1106, 0x547C, 0x077A, 0x547D, 0x0ECB,\n    0x5480, 0x1107, 0x5484, 0x1109, 0x5486, 0x110B, 0x548A, 0x20DC,\n    0x548B, 0x0860, 0x548C, 0x0FE8, 0x548D, 0x382C, 0x548E, 0x1100,\n    0x548F, 0x10FE, 0x5490, 0x110A, 0x5492, 0x1105, 0x5496, 0x382D,\n    0x549C, 0x20DB, 0x54A1, 0x382E, 0x54A2, 0x110D, 0x54A4, 0x1116,\n    0x54A5, 0x110F, 0x54A8, 0x1113, 0x54A9, 0x20DD, 0x54AB, 0x1114,\n    0x54AC, 0x1110, 0x54AD, 0x382F, 0x54AF, 0x1131, 0x54B2, 0x0859,\n    0x54B3, 0x058F, 0x54B8, 0x110E, 0x54B9, 0x3830, 0x54BC, 0x1118,\n    0x54BD, 0x04BA, 0x54BE, 0x1117, 0x54BF, 0x3831, 0x54C0, 0x0469,\n    0x54C1, 0x0DBC, 0x54C2, 0x1115, 0x54C4, 0x1111, 0x54C6, 0x3832,\n    0x54C7, 0x110C, 0x54C8, 0x1112, 0x54C9, 0x0838, 0x54CD, 0x3833,\n    0x54D8, 0x1119, 0x54E1, 0x04BB, 0x54E2, 0x1122, 0x54E5, 0x111A,\n    0x54E6, 0x111B, 0x54E8, 0x098D, 0x54E9, 0x0E97, 0x54ED, 0x1120,\n    0x54EE, 0x111F, 0x54F2, 0x0C29, 0x54FA, 0x1121, 0x54FD, 0x111E,\n    0x54FF, 0x20DE, 0x5504, 0x04D6, 0x5506, 0x0826, 0x5507, 0x09F6,\n    0x550E, 0x3834, 0x550F, 0x111C, 0x5510, 0x0C5C, 0x5514, 0x111D,\n    0x5516, 0x0466, 0x552B, 0x3835, 0x552E, 0x1127, 0x552F, 0x0F0D,\n    0x5531, 0x098F, 0x5533, 0x112D, 0x5535, 0x3836, 0x5538, 0x112C,\n    0x5539, 0x1123, 0x553E, 0x0B23, 0x5540, 0x1124, 0x5544, 0x0B4F,\n    0x5545, 0x1129, 0x5546, 0x098E, 0x554A, 0x3837, 0x554C, 0x1126,\n    0x554F, 0x0EF0, 0x5553, 0x0712, 0x5556, 0x112A, 0x5557, 0x112B,\n    0x555C, 0x1128, 0x555D, 0x112E, 0x555E, 0x1DD1, 0x5560, 0x3838,\n    0x5561, 0x3839, 0x5563, 0x1125, 0x557B, 0x1134, 0x557C, 0x1139,\n    0x557E, 0x1135, 0x5580, 0x1130, 0x5583, 0x113A, 0x5584, 0x0AB3,\n    0x5586, 0x20DF, 0x5587, 0x113C, 0x5588, 0x383A, 0x5589, 0x07B4,\n    0x558A, 0x1132, 0x558B, 0x0BBB, 0x558E, 0x383B, 0x5598, 0x1136,\n    0x5599, 0x112F, 0x559A, 0x05E9, 0x559C, 0x062A, 0x559D, 0x05C3,\n    0x559E, 0x1137, 0x559F, 0x1133, 0x55A7, 0x074C, 0x55A8, 0x113D,\n    0x55A9, 0x113B, 0x55AA, 0x0AD5, 0x55AB, 0x0664, 0x55AC, 0x06A4,\n    0x55AE, 0x1138, 0x55B0, 0x06EC, 0x55B6, 0x04E6, 0x55C4, 0x1141,\n    0x55C5, 0x113F, 0x55C7, 0x1178, 0x55D4, 0x1144, 0x55DA, 0x113E,\n    0x55DC, 0x1142, 0x55DF, 0x1140, 0x55E3, 0x089A, 0x55E4, 0x1143,\n    0x55F7, 0x1146, 0x55F9, 0x114B, 0x55FD, 0x1149, 0x55FE, 0x1148,\n    0x5606, 0x0B70, 0x5608, 0x383C, 0x5609, 0x0545, 0x560E, 0x383D,\n    0x560F, 0x383E, 0x5614, 0x1145, 0x5616, 0x1147, 0x5617, 0x0990,\n    0x5618, 0x04D5, 0x561B, 0x114A, 0x5620, 0x3C1D, 0x5629, 0x055E,\n    0x562F, 0x1155, 0x5631, 0x09E4, 0x5632, 0x1151, 0x5634, 0x114F,\n    0x5636, 0x1150, 0x5637, 0x383F, 0x5638, 0x1152, 0x563F, 0x3840,\n    0x5642, 0x04DF, 0x5649, 0x3841, 0x564B, 0x3842, 0x564C, 0x0ABB,\n    0x564E, 0x114C, 0x564F, 0x3843, 0x5650, 0x114D, 0x5653, 0x1F1B,\n    0x565B, 0x05D8, 0x5664, 0x1154, 0x5666, 0x3844, 0x5668, 0x062B,\n    0x5669, 0x3845, 0x566A, 0x1157, 0x566B, 0x1153, 0x566C, 0x1156,\n    0x566F, 0x3846, 0x5671, 0x3847, 0x5672, 0x3848, 0x5674, 0x0DFE,\n    0x5676, 0x3C33, 0x5678, 0x0CAD, 0x567A, 0x0D4C, 0x5680, 0x1159,\n    0x5686, 0x1158, 0x5687, 0x05A3, 0x568A, 0x115A, 0x568F, 0x115D,\n    0x5694, 0x115C, 0x5695, 0x3849, 0x5699, 0x1DE6, 0x569A, 0x384A,\n    0x56A0, 0x115B, 0x56A2, 0x0CEF, 0x56A5, 0x115E, 0x56AC, 0x384B,\n    0x56AD, 0x384C, 0x56AE, 0x115F, 0x56B1, 0x384D, 0x56B4, 0x1161,\n    0x56B6, 0x1160, 0x56BC, 0x1163, 0x56C0, 0x1166, 0x56C1, 0x1164,\n    0x56C2, 0x1162, 0x56C3, 0x1165, 0x56C8, 0x1167, 0x56C9, 0x384E,\n    0x56CA, 0x1E5A, 0x56CE, 0x1168, 0x56D1, 0x1169, 0x56D3, 0x116A,\n    0x56D7, 0x116B, 0x56D8, 0x107C, 0x56DA, 0x0928, 0x56DB, 0x089B,\n    0x56DD, 0x384F, 0x56DE, 0x0573, 0x56E0, 0x04BC, 0x56E3, 0x0B82,\n    0x56E4, 0x3850, 0x56EE, 0x116C, 0x56F0, 0x0814, 0x56F2, 0x0493,\n    0x56F3, 0x0A24, 0x56F9, 0x116D, 0x56FA, 0x077B, 0x56FD, 0x0803,\n    0x56FF, 0x116F, 0x5700, 0x116E, 0x5703, 0x0E30, 0x5704, 0x1170,\n    0x5708, 0x1172, 0x5709, 0x1171, 0x570A, 0x3851, 0x570B, 0x1173,\n    0x570D, 0x1174, 0x570F, 0x074D, 0x5712, 0x0502, 0x5713, 0x1175,\n    0x5715, 0x3852, 0x5716, 0x1177, 0x5718, 0x1176, 0x571C, 0x1179,\n    0x571F, 0x0C54, 0x5721, 0x3680, 0x5723, 0x3853, 0x5726, 0x117A,\n    0x5727, 0x0479, 0x5728, 0x084F, 0x572D, 0x0713, 0x572F, 0x3854,\n    0x5730, 0x0B8D, 0x5733, 0x3855, 0x5734, 0x3856, 0x5737, 0x117B,\n    0x5738, 0x117C, 0x573B, 0x117E, 0x5740, 0x117F, 0x5742, 0x0854,\n    0x5747, 0x06C9, 0x574A, 0x0E65, 0x574C, 0x3857, 0x574E, 0x117D,\n    0x574F, 0x1180, 0x5750, 0x0831, 0x5751, 0x07B5, 0x5759, 0x20E0,\n    0x5761, 0x1184, 0x5764, 0x0815, 0x5765, 0x20E1, 0x5766, 0x0B71,\n    0x5769, 0x1181, 0x576A, 0x0BF6, 0x5770, 0x3858, 0x577F, 0x1185,\n    0x5782, 0x0A28, 0x5788, 0x1183, 0x5789, 0x1186, 0x578B, 0x0715,\n    0x578C, 0x3859, 0x5793, 0x1187, 0x579C, 0x385A, 0x57A0, 0x1188,\n    0x57A2, 0x07B6, 0x57A3, 0x059E, 0x57A4, 0x118A, 0x57AA, 0x118B,\n    0x57AC, 0x20E2, 0x57B0, 0x118C, 0x57B3, 0x1189, 0x57B8, 0x385B,\n    0x57C0, 0x1182, 0x57C3, 0x118D, 0x57C6, 0x118E, 0x57C7, 0x20E4,\n    0x57C8, 0x20E3, 0x57CB, 0x0E92, 0x57CE, 0x09D3, 0x57D2, 0x1190,\n    0x57D3, 0x1191, 0x57D4, 0x118F, 0x57D6, 0x1193, 0x57DC, 0x0CEE,\n    0x57DF, 0x04AC, 0x57E0, 0x0DC8, 0x57E3, 0x1194, 0x57E6, 0x385C,\n    0x57ED, 0x385D, 0x57F4, 0x09E5, 0x57F5, 0x385E, 0x57F6, 0x385F,\n    0x57F7, 0x08E5, 0x57F9, 0x0D13, 0x57FA, 0x062C, 0x57FC, 0x085B,\n    0x57FF, 0x3860, 0x5800, 0x0E87, 0x5802, 0x0C8A, 0x5805, 0x074E,\n    0x5806, 0x0B2F, 0x5809, 0x3861, 0x580A, 0x1192, 0x580B, 0x1195,\n    0x5815, 0x0B24, 0x5819, 0x1196, 0x581D, 0x1197, 0x5820, 0x3862,\n    0x5821, 0x1199, 0x5824, 0x0C05, 0x582A, 0x05EA, 0x582F, 0x1D32,\n    0x5830, 0x0503, 0x5831, 0x0E43, 0x5832, 0x3863, 0x5834, 0x09D4,\n    0x5835, 0x0C42, 0x583A, 0x0856, 0x583D, 0x119F, 0x5840, 0x0E0D,\n    0x5841, 0x0FA5, 0x584A, 0x0574, 0x584B, 0x119B, 0x5851, 0x0ABC,\n    0x5852, 0x119E, 0x5854, 0x0C5D, 0x5857, 0x0C43, 0x5858, 0x0C5E,\n    0x5859, 0x0D4D, 0x585A, 0x0BE9, 0x585E, 0x0839, 0x5861, 0x1E47,\n    0x5862, 0x119A, 0x5869, 0x0518, 0x586B, 0x0C30, 0x5870, 0x119C,\n    0x5872, 0x1198, 0x5875, 0x0A16, 0x5879, 0x11A0, 0x587C, 0x3864,\n    0x587E, 0x0958, 0x5880, 0x3865, 0x5883, 0x06A5, 0x5885, 0x11A1,\n    0x5893, 0x0E38, 0x5897, 0x0AFF, 0x589C, 0x0BE2, 0x589E, 0x20E7,\n    0x589F, 0x11A3, 0x58A8, 0x0E7D, 0x58A9, 0x3866, 0x58AB, 0x11A4,\n    0x58AE, 0x11A9, 0x58B2, 0x20E8, 0x58B3, 0x0DFF, 0x58B8, 0x11A8,\n    0x58B9, 0x11A2, 0x58BA, 0x11A5, 0x58BB, 0x11A7, 0x58BE, 0x0816,\n    0x58C1, 0x0E19, 0x58C5, 0x11AA, 0x58C7, 0x0B83, 0x58CA, 0x0575,\n    0x58CC, 0x09D5, 0x58CE, 0x3867, 0x58D0, 0x3868, 0x58D1, 0x11AC,\n    0x58D3, 0x11AB, 0x58D4, 0x3869, 0x58D5, 0x07FA, 0x58D7, 0x11AD,\n    0x58D8, 0x11AF, 0x58D9, 0x11AE, 0x58DA, 0x386A, 0x58DC, 0x11B1,\n    0x58DE, 0x11A6, 0x58DF, 0x11B3, 0x58E4, 0x11B2, 0x58E5, 0x11B0,\n    0x58E9, 0x386B, 0x58EB, 0x089C, 0x58EC, 0x0A17, 0x58EE, 0x0AD6,\n    0x58EF, 0x11B4, 0x58F0, 0x0A60, 0x58F1, 0x04B1, 0x58F2, 0x0D1A,\n    0x58F7, 0x0BF7, 0x58F9, 0x11B6, 0x58FA, 0x11B5, 0x58FB, 0x11B7,\n    0x58FC, 0x11B8, 0x58FD, 0x11B9, 0x5902, 0x11BA, 0x5909, 0x0E21,\n    0x590A, 0x11BB, 0x590B, 0x20E9, 0x590C, 0x386C, 0x590F, 0x0546,\n    0x5910, 0x11BC, 0x5915, 0x0F26, 0x5916, 0x058E, 0x5918, 0x10DE,\n    0x5919, 0x0952, 0x591A, 0x0B1F, 0x591B, 0x11BD, 0x591C, 0x0EF7,\n    0x5922, 0x0EC0, 0x5924, 0x386D, 0x5925, 0x11BF, 0x5927, 0x0B47,\n    0x5929, 0x0C31, 0x592A, 0x0B20, 0x592B, 0x0DC9, 0x592C, 0x11C0,\n    0x592D, 0x11C1, 0x592E, 0x051D, 0x592F, 0x386E, 0x5931, 0x08E6,\n    0x5932, 0x11C2, 0x5937, 0x0494, 0x5938, 0x11C3, 0x5939, 0x3725,\n    0x593E, 0x11C4, 0x5944, 0x0504, 0x5947, 0x062D, 0x5948, 0x0CB8,\n    0x5949, 0x0E44, 0x594E, 0x11C8, 0x594F, 0x0AD7, 0x5950, 0x11C7,\n    0x5951, 0x0716, 0x5953, 0x20EA, 0x5954, 0x0E89, 0x5955, 0x11C6,\n    0x5957, 0x0C5F, 0x5958, 0x11CA, 0x595A, 0x11C9, 0x595B, 0x20EB,\n    0x595D, 0x20EC, 0x5960, 0x11CC, 0x5961, 0x386F, 0x5962, 0x11CB,\n    0x5963, 0x20ED, 0x5965, 0x051E, 0x5967, 0x11CD, 0x5968, 0x0991,\n    0x5969, 0x11CF, 0x596A, 0x0B63, 0x596C, 0x11CE, 0x596D, 0x3870,\n    0x596E, 0x0E03, 0x5973, 0x0981, 0x5974, 0x0C55, 0x5978, 0x11D0,\n    0x597D, 0x07B7, 0x5981, 0x11D1, 0x5982, 0x0CD7, 0x5983, 0x0D72,\n    0x5984, 0x0EDD, 0x598A, 0x0CDB, 0x598D, 0x11DA, 0x5993, 0x0652,\n    0x5996, 0x0F2F, 0x5999, 0x0EBB, 0x599B, 0x1239, 0x599D, 0x11D2,\n    0x59A3, 0x11D5, 0x59A4, 0x20EE, 0x59A5, 0x0B25, 0x59A8, 0x0E66,\n    0x59AC, 0x0C44, 0x59B2, 0x11D6, 0x59B9, 0x0E93, 0x59BA, 0x20EF,\n    0x59BB, 0x083A, 0x59BE, 0x0992, 0x59C6, 0x11D7, 0x59C9, 0x089E,\n    0x59CA, 0x3871, 0x59CB, 0x089D, 0x59D0, 0x047D, 0x59D1, 0x077C,\n    0x59D2, 0x3872, 0x59D3, 0x0A4F, 0x59D4, 0x0495, 0x59D9, 0x11DB,\n    0x59DA, 0x11DC, 0x59DC, 0x11D9, 0x59DD, 0x3873, 0x59E3, 0x3874,\n    0x59E4, 0x3875, 0x59E5, 0x04DA, 0x59E6, 0x05EB, 0x59E8, 0x11D8,\n    0x59EA, 0x0ED1, 0x59EB, 0x0DA3, 0x59EC, 0x36AD, 0x59F6, 0x046C,\n    0x59FB, 0x04BD, 0x59FF, 0x089F, 0x5A01, 0x0496, 0x5A03, 0x0467,\n    0x5A04, 0x3876, 0x5A09, 0x11E1, 0x5A0C, 0x3877, 0x5A11, 0x11DF,\n    0x5A18, 0x0EC8, 0x5A1A, 0x11E2, 0x5A1B, 0x35C1, 0x5A1C, 0x11E0,\n    0x5A1F, 0x11DE, 0x5A20, 0x09F7, 0x5A23, 0x3878, 0x5A25, 0x11DD,\n    0x5A29, 0x0E2A, 0x5A2F, 0x0798, 0x5A35, 0x11E6, 0x5A36, 0x11E7,\n    0x5A3C, 0x0993, 0x5A40, 0x11E3, 0x5A41, 0x0FD2, 0x5A46, 0x0D02,\n    0x5A47, 0x3879, 0x5A49, 0x11E5, 0x5A55, 0x387A, 0x5A5A, 0x0817,\n    0x5A62, 0x11E8, 0x5A63, 0x387B, 0x5A66, 0x0DCA, 0x5A6A, 0x11E9,\n    0x5A6C, 0x11E4, 0x5A6D, 0x387C, 0x5A7E, 0x387D, 0x5A7F, 0x0EC7,\n    0x5A92, 0x0D14, 0x5A9A, 0x11EA, 0x5A9B, 0x0DA4, 0x5A9E, 0x387E,\n    0x5AA7, 0x387F, 0x5AAC, 0x3880, 0x5AB3, 0x3881, 0x5ABC, 0x11EB,\n    0x5ABD, 0x11EF, 0x5ABE, 0x11EC, 0x5AC1, 0x0547, 0x5AC2, 0x11EE,\n    0x5AC9, 0x08E7, 0x5ACB, 0x11ED, 0x5ACC, 0x074F, 0x5AD0, 0x11FB,\n    0x5AD6, 0x11F4, 0x5AD7, 0x11F1, 0x5AE0, 0x3882, 0x5AE1, 0x0BA2,\n    0x5AE3, 0x11F0, 0x5AE6, 0x11F2, 0x5AE9, 0x11F3, 0x5AFA, 0x11F5,\n    0x5AFB, 0x11F6, 0x5B00, 0x3883, 0x5B09, 0x062E, 0x5B0B, 0x11F8,\n    0x5B0C, 0x11F7, 0x5B16, 0x11F9, 0x5B19, 0x3884, 0x5B22, 0x09D6,\n    0x5B25, 0x3885, 0x5B2A, 0x11FC, 0x5B2C, 0x0BF8, 0x5B2D, 0x3886,\n    0x5B30, 0x04E7, 0x5B32, 0x11FA, 0x5B36, 0x11FD, 0x5B3E, 0x11FE,\n    0x5B40, 0x1201, 0x5B41, 0x3887, 0x5B43, 0x11FF, 0x5B45, 0x1200,\n    0x5B50, 0x08A0, 0x5B51, 0x1202, 0x5B54, 0x07B8, 0x5B55, 0x1203,\n    0x5B56, 0x20F0, 0x5B57, 0x08C8, 0x5B58, 0x0B18, 0x5B5A, 0x1204,\n    0x5B5B, 0x1205, 0x5B5C, 0x08A8, 0x5B5D, 0x07B9, 0x5B5F, 0x0EDE,\n    0x5B63, 0x0642, 0x5B64, 0x077D, 0x5B65, 0x1206, 0x5B66, 0x05B6,\n    0x5B69, 0x1207, 0x5B6B, 0x0B19, 0x5B70, 0x1208, 0x5B71, 0x1230,\n    0x5B73, 0x1209, 0x5B75, 0x120A, 0x5B78, 0x120B, 0x5B7A, 0x120D,\n    0x5B7C, 0x3888, 0x5B7E, 0x3889, 0x5B7F, 0x388A, 0x5B80, 0x120E,\n    0x5B82, 0x3610, 0x5B83, 0x120F, 0x5B85, 0x0B50, 0x5B87, 0x04C9,\n    0x5B88, 0x0915, 0x5B89, 0x0486, 0x5B8A, 0x388B, 0x5B8B, 0x0AD9,\n    0x5B8C, 0x05EC, 0x5B8D, 0x08E1, 0x5B8F, 0x07BA, 0x5B95, 0x0C60,\n    0x5B97, 0x092B, 0x5B98, 0x05ED, 0x5B99, 0x0BA6, 0x5B9A, 0x0C06,\n    0x5B9B, 0x047C, 0x5B9C, 0x0653, 0x5B9D, 0x0E45, 0x5B9F, 0x08EE,\n    0x5BA2, 0x066C, 0x5BA3, 0x0A8F, 0x5BA4, 0x08E8, 0x5BA5, 0x0F12,\n    0x5BA6, 0x1210, 0x5BAE, 0x0676, 0x5BB0, 0x083B, 0x5BB3, 0x0590,\n    0x5BB4, 0x0505, 0x5BB5, 0x0994, 0x5BB6, 0x0548, 0x5BB8, 0x1211,\n    0x5BB9, 0x0F30, 0x5BBF, 0x0953, 0x5BC0, 0x20F1, 0x5BC2, 0x0910,\n    0x5BC3, 0x1212, 0x5BC4, 0x062F, 0x5BC5, 0x0CAA, 0x5BC6, 0x0EB5,\n    0x5BC7, 0x1213, 0x5BC9, 0x1214, 0x5BCC, 0x0DCB, 0x5BD0, 0x1216,\n    0x5BD2, 0x05E4, 0x5BD3, 0x06EF, 0x5BD4, 0x1215, 0x5BD8, 0x20F3,\n    0x5BDB, 0x05EE, 0x5BDD, 0x09F8, 0x5BDE, 0x121A, 0x5BDF, 0x086F,\n    0x5BE1, 0x0549, 0x5BE2, 0x1219, 0x5BE4, 0x1217, 0x5BE5, 0x121B,\n    0x5BE6, 0x1218, 0x5BE7, 0x0CE1, 0x5BE8, 0x148E, 0x5BE9, 0x09F9,\n    0x5BEB, 0x121C, 0x5BEC, 0x20F4, 0x5BEE, 0x0F88, 0x5BF0, 0x121D,\n    0x5BF3, 0x121F, 0x5BF5, 0x0BBC, 0x5BF6, 0x121E, 0x5BF8, 0x0A47,\n    0x5BFA, 0x08C9, 0x5BFE, 0x0B30, 0x5BFF, 0x0923, 0x5C01, 0x0DE7,\n    0x5C02, 0x0A90, 0x5C04, 0x08F9, 0x5C05, 0x1220, 0x5C06, 0x0995,\n    0x5C07, 0x1221, 0x5C08, 0x1222, 0x5C09, 0x0497, 0x5C0A, 0x0B1A,\n    0x5C0B, 0x0A18, 0x5C0D, 0x1223, 0x5C0E, 0x0C8B, 0x5C0F, 0x0996,\n    0x5C11, 0x0997, 0x5C13, 0x1224, 0x5C14, 0x372A, 0x5C16, 0x0A91,\n    0x5C19, 0x360B, 0x5C1A, 0x0998, 0x5C1E, 0x20F5, 0x5C20, 0x1225,\n    0x5C22, 0x1226, 0x5C23, 0x388C, 0x5C24, 0x0EEC, 0x5C28, 0x1227,\n    0x5C2B, 0x388D, 0x5C2D, 0x06BE, 0x5C30, 0x388E, 0x5C31, 0x092C,\n    0x5C38, 0x1228, 0x5C39, 0x1229, 0x5C3A, 0x0908, 0x5C3B, 0x09F2,\n    0x5C3C, 0x0CCC, 0x5C3D, 0x0A1A, 0x5C3E, 0x0D8C, 0x5C3F, 0x0CD8,\n    0x5C40, 0x06C1, 0x5C41, 0x122A, 0x5C45, 0x0689, 0x5C46, 0x122B,\n    0x5C48, 0x06F6, 0x5C4A, 0x0CA7, 0x5C4B, 0x0530, 0x5C4D, 0x08A1,\n    0x5C4E, 0x122C, 0x5C4F, 0x122F, 0x5C50, 0x122E, 0x5C51, 0x06F5,\n    0x5C53, 0x122D, 0x5C55, 0x0C32, 0x5C5B, 0x1E92, 0x5C5E, 0x0B10,\n    0x5C60, 0x0C45, 0x5C61, 0x08F4, 0x5C62, 0x1E0D, 0x5C63, 0x388F,\n    0x5C64, 0x0ADA, 0x5C65, 0x0F64, 0x5C69, 0x3890, 0x5C6C, 0x1231,\n    0x5C6E, 0x1232, 0x5C6F, 0x0CAE, 0x5C71, 0x0881, 0x5C76, 0x1234,\n    0x5C79, 0x1235, 0x5C7C, 0x3891, 0x5C8C, 0x1236, 0x5C90, 0x0630,\n    0x5C91, 0x1237, 0x5C94, 0x1238, 0x5CA1, 0x052C, 0x5CA6, 0x20F6,\n    0x5CA8, 0x0ABD, 0x5CA9, 0x0620, 0x5CAB, 0x123A, 0x5CAC, 0x0EB4,\n    0x5CB1, 0x0B32, 0x5CB3, 0x05B7, 0x5CB6, 0x123C, 0x5CB7, 0x123E,\n    0x5CB8, 0x061B, 0x5CBA, 0x20F7, 0x5CBB, 0x123B, 0x5CBC, 0x123D,\n    0x5CBE, 0x1240, 0x5CC5, 0x123F, 0x5CC7, 0x1241, 0x5CCB, 0x3892,\n    0x5CD2, 0x3893, 0x5CD9, 0x1242, 0x5CE0, 0x0C95, 0x5CE1, 0x06A6,\n    0x5CE6, 0x372C, 0x5CE8, 0x0565, 0x5CE9, 0x1243, 0x5CEA, 0x1248,\n    0x5CED, 0x1246, 0x5CEF, 0x0E47, 0x5CF0, 0x0E46, 0x5CF4, 0x3894,\n    0x5CF5, 0x20F8, 0x5CF6, 0x0C61, 0x5CFA, 0x1245, 0x5CFB, 0x095E,\n    0x5CFD, 0x1244, 0x5D07, 0x0A38, 0x5D0B, 0x1249, 0x5D0E, 0x085A,\n    0x5D11, 0x124F, 0x5D14, 0x1250, 0x5D15, 0x124A, 0x5D16, 0x0591,\n    0x5D17, 0x124B, 0x5D18, 0x1254, 0x5D19, 0x1253, 0x5D1A, 0x1252,\n    0x5D1B, 0x124E, 0x5D1F, 0x124D, 0x5D22, 0x1251, 0x5D24, 0x3895,\n    0x5D26, 0x3896, 0x5D27, 0x20F9, 0x5D29, 0x0E48, 0x5D42, 0x20FC,\n    0x5D43, 0x3897, 0x5D46, 0x3898, 0x5D4A, 0x3899, 0x5D4B, 0x1258,\n    0x5D4C, 0x1255, 0x5D4E, 0x1257, 0x5D50, 0x0F5C, 0x5D52, 0x1256,\n    0x5D53, 0x20FA, 0x5D5C, 0x124C, 0x5D69, 0x0A39, 0x5D6C, 0x1259,\n    0x5D6D, 0x20FD, 0x5D6F, 0x0827, 0x5D73, 0x125A, 0x5D76, 0x125B,\n    0x5D82, 0x125E, 0x5D84, 0x125D, 0x5D87, 0x125C, 0x5D8B, 0x0C62,\n    0x5D8C, 0x1247, 0x5D90, 0x1264, 0x5D92, 0x389A, 0x5D94, 0x389B,\n    0x5D99, 0x389C, 0x5D9D, 0x1260, 0x5DA0, 0x389D, 0x5DA2, 0x125F,\n    0x5DAC, 0x1261, 0x5DAE, 0x1262, 0x5DB2, 0x3BA5, 0x5DB7, 0x1265,\n    0x5DB8, 0x20FE, 0x5DB9, 0x20FF, 0x5DBA, 0x0FAE, 0x5DBC, 0x1266,\n    0x5DBD, 0x1263, 0x5DC9, 0x1267, 0x5DCC, 0x061C, 0x5DCD, 0x1268,\n    0x5DD0, 0x2100, 0x5DD2, 0x126A, 0x5DD3, 0x1269, 0x5DD6, 0x126B,\n    0x5DD8, 0x389E, 0x5DDB, 0x126C, 0x5DDD, 0x0A92, 0x5DDE, 0x092D,\n    0x5DE0, 0x389F, 0x5DE1, 0x096E, 0x5DE2, 0x3432, 0x5DE3, 0x0AE5,\n    0x5DE5, 0x07BB, 0x5DE6, 0x0828, 0x5DE7, 0x07BC, 0x5DE8, 0x068A,\n    0x5DEB, 0x126D, 0x5DEE, 0x0829, 0x5DF1, 0x077E, 0x5DF2, 0x126E,\n    0x5DF3, 0x0EB2, 0x5DF4, 0x0CF9, 0x5DF5, 0x126F, 0x5DF7, 0x07BD,\n    0x5DF8, 0x38A0, 0x5DFB, 0x05E8, 0x5DFD, 0x0B65, 0x5DFE, 0x06CA,\n    0x5DFF, 0x35E2, 0x5E00, 0x38A1, 0x5E02, 0x08A2, 0x5E03, 0x0DCD,\n    0x5E06, 0x0D55, 0x5E0B, 0x1270, 0x5E0C, 0x0631, 0x5E11, 0x1273,\n    0x5E12, 0x38A2, 0x5E14, 0x38A3, 0x5E15, 0x38A4, 0x5E16, 0x0BBD,\n    0x5E18, 0x38A5, 0x5E19, 0x1272, 0x5E1A, 0x1271, 0x5E1B, 0x1274,\n    0x5E1D, 0x0C07, 0x5E25, 0x0A29, 0x5E2B, 0x08A3, 0x5E2D, 0x0A6E,\n    0x5E2E, 0x38A6, 0x5E2F, 0x0B33, 0x5E30, 0x063C, 0x5E33, 0x0BBE,\n    0x5E36, 0x1275, 0x5E37, 0x1276, 0x5E38, 0x09D7, 0x5E3D, 0x0E67,\n    0x5E40, 0x1279, 0x5E43, 0x1278, 0x5E44, 0x1277, 0x5E45, 0x0DEF,\n    0x5E47, 0x1280, 0x5E4C, 0x0E88, 0x5E4E, 0x127A, 0x5E54, 0x127C,\n    0x5E55, 0x0E99, 0x5E57, 0x127B, 0x5E58, 0x38A7, 0x5E5F, 0x127D,\n    0x5E61, 0x0D3C, 0x5E62, 0x127E, 0x5E63, 0x0E0E, 0x5E64, 0x127F,\n    0x5E6B, 0x38A8, 0x5E6C, 0x38A9, 0x5E72, 0x05EF, 0x5E73, 0x0E0F,\n    0x5E74, 0x0CE5, 0x5E75, 0x1281, 0x5E76, 0x1282, 0x5E78, 0x07BE,\n    0x5E79, 0x05F0, 0x5E7A, 0x1283, 0x5E7B, 0x076C, 0x5E7C, 0x0F2E,\n    0x5E7D, 0x0F13, 0x5E7E, 0x0632, 0x5E7F, 0x1285, 0x5E81, 0x0BBF,\n    0x5E83, 0x07BF, 0x5E84, 0x0999, 0x5E87, 0x0D73, 0x5E8A, 0x099A,\n    0x5E8F, 0x0982, 0x5E95, 0x0C08, 0x5E96, 0x0E49, 0x5E97, 0x0C33,\n    0x5E99, 0x36B0, 0x5E9A, 0x07C0, 0x5E9C, 0x0DCE, 0x5EA0, 0x1286,\n    0x5EA6, 0x0C53, 0x5EA7, 0x0832, 0x5EA8, 0x38AA, 0x5EAA, 0x38AB,\n    0x5EAB, 0x077F, 0x5EAD, 0x0C09, 0x5EB5, 0x0487, 0x5EB6, 0x0978,\n    0x5EB7, 0x07C1, 0x5EB8, 0x0F31, 0x5EBE, 0x38AC, 0x5EBF, 0x38AD,\n    0x5EC1, 0x1287, 0x5EC2, 0x1288, 0x5EC3, 0x0D07, 0x5EC8, 0x1289,\n    0x5EC9, 0x0FBF, 0x5ECA, 0x0FD3, 0x5ECB, 0x38AE, 0x5ECF, 0x128B,\n    0x5ED0, 0x128A, 0x5ED2, 0x38AF, 0x5ED3, 0x05A5, 0x5ED6, 0x128C,\n    0x5EDA, 0x128F, 0x5EDB, 0x1290, 0x5EDD, 0x128E, 0x5EDF, 0x0DB2,\n    0x5EE0, 0x099B, 0x5EE1, 0x1292, 0x5EE2, 0x1291, 0x5EE3, 0x128D,\n    0x5EE8, 0x1293, 0x5EE9, 0x1294, 0x5EEC, 0x1295, 0x5EF0, 0x1298,\n    0x5EF1, 0x1296, 0x5EF3, 0x1297, 0x5EF4, 0x1299, 0x5EF6, 0x0506,\n    0x5EF7, 0x0C0A, 0x5EF8, 0x129A, 0x5EFA, 0x0750, 0x5EFB, 0x0576,\n    0x5EFC, 0x0CEC, 0x5EFE, 0x129B, 0x5EFF, 0x0CD3, 0x5F01, 0x0E2B,\n    0x5F03, 0x129C, 0x5F04, 0x0FD4, 0x5F07, 0x38B0, 0x5F09, 0x129D,\n    0x5F0A, 0x0E10, 0x5F0B, 0x12A0, 0x5F0C, 0x0FFA, 0x5F0D, 0x100A,\n    0x5F0E, 0x38B1, 0x5F0F, 0x08DC, 0x5F10, 0x0CCD, 0x5F11, 0x12A1,\n    0x5F13, 0x0677, 0x5F14, 0x0BC0, 0x5F15, 0x04BE, 0x5F16, 0x12A2,\n    0x5F17, 0x0DF6, 0x5F18, 0x07C2, 0x5F1B, 0x0B8E, 0x5F1C, 0x38B2,\n    0x5F1D, 0x38B3, 0x5F1F, 0x0C0B, 0x5F21, 0x2101, 0x5F22, 0x38B4,\n    0x5F25, 0x0EFB, 0x5F26, 0x076D, 0x5F27, 0x0780, 0x5F28, 0x38B5,\n    0x5F29, 0x12A3, 0x5F2D, 0x12A4, 0x5F2F, 0x12AA, 0x5F31, 0x0911,\n    0x5F34, 0x2102, 0x5F35, 0x0BC1, 0x5F36, 0x38B6, 0x5F37, 0x06A7,\n    0x5F38, 0x12A5, 0x5F3A, 0x3598, 0x5F3B, 0x38B7, 0x5F3C, 0x0D9D,\n    0x5F3E, 0x0B84, 0x5F40, 0x38B8, 0x5F41, 0x12A6, 0x5F45, 0x20B2,\n    0x5F48, 0x12A7, 0x5F4A, 0x06A8, 0x5F4C, 0x12A8, 0x5F4E, 0x12A9,\n    0x5F50, 0x38B9, 0x5F51, 0x12AB, 0x5F53, 0x0C70, 0x5F56, 0x12AC,\n    0x5F57, 0x12AD, 0x5F58, 0x38BA, 0x5F59, 0x12AE, 0x5F5C, 0x129F,\n    0x5F5D, 0x129E, 0x5F61, 0x12AF, 0x5F62, 0x0717, 0x5F64, 0x38BB,\n    0x5F65, 0x36AC, 0x5F66, 0x0D99, 0x5F67, 0x2103, 0x5F69, 0x083C,\n    0x5F6A, 0x0DA9, 0x5F6B, 0x0BC2, 0x5F6C, 0x0DBD, 0x5F6D, 0x12B0,\n    0x5F70, 0x099C, 0x5F71, 0x04E8, 0x5F73, 0x12B1, 0x5F77, 0x12B2,\n    0x5F79, 0x0EFE, 0x5F7C, 0x0D74, 0x5F7F, 0x12B5, 0x5F80, 0x051F,\n    0x5F81, 0x0A50, 0x5F82, 0x12B4, 0x5F83, 0x12B3, 0x5F84, 0x0718,\n    0x5F85, 0x0B34, 0x5F87, 0x12B9, 0x5F88, 0x12B7, 0x5F89, 0x38BC,\n    0x5F8A, 0x12B6, 0x5F8B, 0x0F6F, 0x5F8C, 0x0799, 0x5F90, 0x0983,\n    0x5F91, 0x12B8, 0x5F92, 0x0C46, 0x5F93, 0x0948, 0x5F97, 0x0C98,\n    0x5F98, 0x12BC, 0x5F99, 0x12BB, 0x5F9C, 0x38BD, 0x5F9E, 0x12BA,\n    0x5FA0, 0x12BD, 0x5FA1, 0x079A, 0x5FA4, 0x38BF, 0x5FA7, 0x38BE,\n    0x5FA8, 0x12BE, 0x5FA9, 0x0DEE, 0x5FAA, 0x0965, 0x5FAD, 0x12BF,\n    0x5FAE, 0x0D8D, 0x5FAF, 0x38C0, 0x5FB3, 0x0C99, 0x5FB4, 0x0BC3,\n    0x5FB5, 0x3438, 0x5FB7, 0x2104, 0x5FB8, 0x38C1, 0x5FB9, 0x0C2A,\n    0x5FBC, 0x12C0, 0x5FBD, 0x0645, 0x5FC3, 0x09FA, 0x5FC4, 0x38C2,\n    0x5FC5, 0x0D9E, 0x5FC9, 0x38C3, 0x5FCC, 0x0633, 0x5FCD, 0x0CDC,\n    0x5FD6, 0x12C1, 0x5FD7, 0x08A4, 0x5FD8, 0x0E68, 0x5FD9, 0x0E69,\n    0x5FDC, 0x0520, 0x5FDD, 0x12C6, 0x5FDE, 0x2105, 0x5FE0, 0x0BA7,\n    0x5FE1, 0x38C4, 0x5FE4, 0x12C3, 0x5FE9, 0x38C5, 0x5FEB, 0x0577,\n    0x5FED, 0x38C6, 0x5FF0, 0x12F6, 0x5FF1, 0x12C5, 0x5FF5, 0x0CE6,\n    0x5FF8, 0x12C4, 0x5FFB, 0x12C2, 0x5FFC, 0x38C7, 0x5FFD, 0x080C,\n    0x5FFF, 0x12C8, 0x600E, 0x12CE, 0x600F, 0x12D4, 0x6010, 0x12CC,\n    0x6012, 0x0C56, 0x6015, 0x12D1, 0x6016, 0x0DCF, 0x6017, 0x38C8,\n    0x6019, 0x12CB, 0x601A, 0x38C9, 0x601B, 0x12D0, 0x601C, 0x0FAF,\n    0x601D, 0x08A5, 0x6020, 0x0B35, 0x6021, 0x12C9, 0x6025, 0x0678,\n    0x6026, 0x12D3, 0x6027, 0x0A51, 0x6028, 0x0507, 0x6029, 0x12CD,\n    0x602A, 0x0578, 0x602B, 0x12D2, 0x602F, 0x06A9, 0x6031, 0x12CF,\n    0x6033, 0x38CA, 0x603A, 0x12D5, 0x6041, 0x12D7, 0x6042, 0x12E1,\n    0x6043, 0x12DF, 0x6046, 0x12DC, 0x604A, 0x12DB, 0x604B, 0x0FC0,\n    0x604D, 0x12DD, 0x6050, 0x06AA, 0x6052, 0x07C3, 0x6055, 0x0984,\n    0x6059, 0x12E4, 0x605A, 0x12D6, 0x605D, 0x2106, 0x605F, 0x12DA,\n    0x6060, 0x12CA, 0x6061, 0x38CB, 0x6062, 0x057A, 0x6063, 0x12DE,\n    0x6064, 0x12E0, 0x6065, 0x0B8F, 0x6068, 0x0818, 0x6069, 0x0538,\n    0x606A, 0x12D8, 0x606B, 0x12E3, 0x606C, 0x12E2, 0x606D, 0x06AB,\n    0x606F, 0x0B09, 0x6070, 0x05C4, 0x6075, 0x0719, 0x6077, 0x12D9,\n    0x607F, 0x38CC, 0x6081, 0x12E5, 0x6083, 0x12E8, 0x6084, 0x12EA,\n    0x6085, 0x2107, 0x6089, 0x08E9, 0x608A, 0x2108, 0x608B, 0x12F0,\n    0x608C, 0x0C0C, 0x608D, 0x12E6, 0x6092, 0x12EE, 0x6094, 0x0579,\n    0x6096, 0x12EC, 0x6097, 0x12ED, 0x609A, 0x12E9, 0x609B, 0x12EB,\n    0x609E, 0x38CD, 0x609F, 0x079B, 0x60A0, 0x0F14, 0x60A3, 0x05F1,\n    0x60A4, 0x38CE, 0x60A6, 0x04FB, 0x60A7, 0x12EF, 0x60A9, 0x0CF0,\n    0x60AA, 0x0471, 0x60B0, 0x38CF, 0x60B2, 0x0D75, 0x60B3, 0x12C7,\n    0x60B4, 0x12F5, 0x60B5, 0x12F9, 0x60B6, 0x0EF1, 0x60B8, 0x12F2,\n    0x60BC, 0x0C63, 0x60BD, 0x12F7, 0x60C5, 0x09D8, 0x60C6, 0x12F8,\n    0x60C7, 0x0CAF, 0x60CB, 0x38D0, 0x60D1, 0x0FED, 0x60D3, 0x12F4,\n    0x60D5, 0x210A, 0x60D8, 0x12FA, 0x60DA, 0x080D, 0x60DB, 0x38D1,\n    0x60DC, 0x0A6F, 0x60DE, 0x2109, 0x60DF, 0x0498, 0x60E0, 0x12F3,\n    0x60E1, 0x12F1, 0x60E3, 0x0ADC, 0x60E7, 0x12E7, 0x60E8, 0x0882,\n    0x60F0, 0x0B26, 0x60F1, 0x1306, 0x60F2, 0x210C, 0x60F3, 0x0ADD,\n    0x60F4, 0x1301, 0x60F6, 0x12FE, 0x60F7, 0x12FF, 0x60F8, 0x38D2,\n    0x60F9, 0x0912, 0x60FA, 0x1302, 0x60FB, 0x1305, 0x6100, 0x1300,\n    0x6101, 0x092F, 0x6103, 0x1303, 0x6106, 0x12FD, 0x6108, 0x0F08,\n    0x6109, 0x0F07, 0x610D, 0x1307, 0x610E, 0x1308, 0x610F, 0x0499,\n    0x6111, 0x210D, 0x6112, 0x38D3, 0x6113, 0x38D4, 0x6114, 0x38D5,\n    0x6115, 0x12FC, 0x611A, 0x06EA, 0x611B, 0x046A, 0x611C, 0x38D6,\n    0x611F, 0x05F2, 0x6120, 0x210B, 0x6121, 0x1304, 0x6127, 0x130C,\n    0x6128, 0x130B, 0x612C, 0x1310, 0x6130, 0x210F, 0x6134, 0x1311,\n    0x6137, 0x210E, 0x613C, 0x130F, 0x613D, 0x1312, 0x613E, 0x130A,\n    0x613F, 0x130E, 0x6142, 0x1313, 0x6144, 0x1314, 0x6147, 0x1309,\n    0x6148, 0x08CA, 0x614A, 0x130D, 0x614B, 0x0B36, 0x614C, 0x07C4,\n    0x614D, 0x12FB, 0x614E, 0x09FB, 0x6153, 0x1321, 0x6155, 0x0E39,\n    0x6158, 0x1317, 0x6159, 0x1318, 0x615A, 0x1319, 0x615D, 0x1320,\n    0x615F, 0x131F, 0x6162, 0x0EAB, 0x6163, 0x05F3, 0x6165, 0x131D,\n    0x6167, 0x071B, 0x6168, 0x0592, 0x616B, 0x131A, 0x616E, 0x0F80,\n    0x616F, 0x131C, 0x6170, 0x049A, 0x6171, 0x131E, 0x6173, 0x1315,\n    0x6174, 0x131B, 0x6175, 0x1322, 0x6176, 0x071A, 0x6177, 0x1316,\n    0x617C, 0x38D7, 0x617E, 0x0F47, 0x6182, 0x0F15, 0x6187, 0x1325,\n    0x618A, 0x1329, 0x618D, 0x38D8, 0x618E, 0x0B00, 0x6190, 0x0FC1,\n    0x6191, 0x132A, 0x6194, 0x1327, 0x6196, 0x1324, 0x6198, 0x2110,\n    0x6199, 0x1323, 0x619A, 0x1328, 0x619F, 0x38D9, 0x61A4, 0x0E00,\n    0x61A7, 0x0C8C, 0x61A8, 0x38DA, 0x61A9, 0x071C, 0x61AB, 0x132B,\n    0x61AC, 0x1326, 0x61AE, 0x132C, 0x61B2, 0x0751, 0x61B6, 0x0531,\n    0x61BA, 0x1334, 0x61BE, 0x05F4, 0x61C2, 0x38DB, 0x61C3, 0x1332,\n    0x61C6, 0x1333, 0x61C7, 0x0819, 0x61C8, 0x1331, 0x61C9, 0x132F,\n    0x61CA, 0x132E, 0x61CB, 0x1335, 0x61CC, 0x132D, 0x61CD, 0x1337,\n    0x61D0, 0x057B, 0x61DF, 0x38DC, 0x61E3, 0x1339, 0x61E6, 0x1338,\n    0x61F2, 0x0BC4, 0x61F4, 0x133C, 0x61F6, 0x133A, 0x61F7, 0x1330,\n    0x61F8, 0x0752, 0x61FA, 0x133B, 0x61FC, 0x133F, 0x61FD, 0x133E,\n    0x61FE, 0x1340, 0x61FF, 0x133D, 0x6200, 0x1341, 0x6208, 0x1342,\n    0x6209, 0x1343, 0x620A, 0x0E3A, 0x620C, 0x1345, 0x620D, 0x1344,\n    0x620E, 0x0949, 0x6210, 0x0A52, 0x6211, 0x0566, 0x6212, 0x057C,\n    0x6213, 0x2111, 0x6214, 0x1346, 0x6215, 0x38DD, 0x6216, 0x0483,\n    0x621A, 0x0A70, 0x621B, 0x1347, 0x621D, 0x1A64, 0x621E, 0x1348,\n    0x621F, 0x0737, 0x6221, 0x1349, 0x6226, 0x0A93, 0x6229, 0x38DE,\n    0x622A, 0x134A, 0x622E, 0x134B, 0x622F, 0x0654, 0x6230, 0x134C,\n    0x6232, 0x134D, 0x6233, 0x134E, 0x6234, 0x0B37, 0x6236, 0x35BD,\n    0x6238, 0x0781, 0x623B, 0x0EED, 0x623E, 0x344E, 0x623F, 0x0E6A,\n    0x6240, 0x0974, 0x6241, 0x134F, 0x6243, 0x38DF, 0x6246, 0x38E0,\n    0x6247, 0x0A94, 0x6248, 0x1B1A, 0x6249, 0x0D76, 0x624B, 0x0916,\n    0x624C, 0x38E1, 0x624D, 0x083D, 0x624E, 0x1350, 0x6251, 0x38E2,\n    0x6253, 0x0B27, 0x6255, 0x0DF7, 0x6256, 0x38E3, 0x6258, 0x0B51,\n    0x625B, 0x1353, 0x625E, 0x1351, 0x6260, 0x1354, 0x6263, 0x1352,\n    0x6268, 0x1355, 0x626E, 0x0E01, 0x6271, 0x047B, 0x6276, 0x0DD0,\n    0x6279, 0x0D77, 0x627C, 0x1356, 0x627E, 0x1359, 0x627F, 0x099D,\n    0x6280, 0x0655, 0x6282, 0x1357, 0x6283, 0x135E, 0x6284, 0x099E,\n    0x6285, 0x35C5, 0x6289, 0x1358, 0x628A, 0x0CFA, 0x6291, 0x0F48,\n    0x6292, 0x135A, 0x6293, 0x135B, 0x6294, 0x135F, 0x6295, 0x0C64,\n    0x6296, 0x135C, 0x6297, 0x07C5, 0x6298, 0x0A82, 0x629B, 0x136D,\n    0x629C, 0x0D48, 0x629E, 0x0B52, 0x62A6, 0x2112, 0x62AB, 0x0D78,\n    0x62AC, 0x13B2, 0x62B1, 0x0E4A, 0x62B5, 0x0C0D, 0x62B9, 0x0EA3,\n    0x62BB, 0x1362, 0x62BC, 0x0521, 0x62BD, 0x0BA8, 0x62C2, 0x136B,\n    0x62C4, 0x38E4, 0x62C5, 0x0B72, 0x62C6, 0x1365, 0x62C7, 0x136C,\n    0x62C8, 0x1367, 0x62C9, 0x136E, 0x62CA, 0x136A, 0x62CC, 0x1369,\n    0x62CD, 0x0D25, 0x62CF, 0x1363, 0x62D0, 0x057D, 0x62D1, 0x1361,\n    0x62D2, 0x068B, 0x62D3, 0x0B53, 0x62D4, 0x135D, 0x62D7, 0x1360,\n    0x62D8, 0x07C6, 0x62D9, 0x0A7F, 0x62DB, 0x099F, 0x62DC, 0x1368,\n    0x62DD, 0x0D08, 0x62E0, 0x068C, 0x62E1, 0x05A6, 0x62EC, 0x05C5,\n    0x62ED, 0x09E7, 0x62EE, 0x1370, 0x62EF, 0x1375, 0x62F1, 0x1371,\n    0x62F3, 0x0753, 0x62F5, 0x1376, 0x62F6, 0x0870, 0x62F7, 0x07FB,\n    0x62FC, 0x38E5, 0x62FE, 0x0930, 0x62FF, 0x1364, 0x6301, 0x08CB,\n    0x6302, 0x1373, 0x6307, 0x08A6, 0x6308, 0x1374, 0x6309, 0x0488,\n    0x630A, 0x38E6, 0x630C, 0x136F, 0x630D, 0x38E7, 0x6311, 0x0BC5,\n    0x6318, 0x38E8, 0x6319, 0x068D, 0x631B, 0x3737, 0x631F, 0x06AC,\n    0x6327, 0x1372, 0x6328, 0x046B, 0x632B, 0x0833, 0x632F, 0x09FC,\n    0x6339, 0x38E9, 0x633A, 0x0C0E, 0x633D, 0x0D68, 0x633E, 0x1378,\n    0x633F, 0x0AE0, 0x6342, 0x38EA, 0x6343, 0x38EB, 0x6349, 0x0B0A,\n    0x634C, 0x0879, 0x634D, 0x1379, 0x634F, 0x137B, 0x6350, 0x1377,\n    0x6355, 0x0E31, 0x6357, 0x0BD9, 0x635C, 0x0ADE, 0x6365, 0x38EC,\n    0x6367, 0x0E4B, 0x6368, 0x08FA, 0x6369, 0x1387, 0x636B, 0x1386,\n    0x636E, 0x0A3E, 0x6372, 0x0754, 0x6374, 0x38ED, 0x6376, 0x1380,\n    0x6377, 0x09A1, 0x637A, 0x0CC0, 0x637B, 0x0CE7, 0x637D, 0x38EE,\n    0x6380, 0x137E, 0x6383, 0x0ADF, 0x6384, 0x38EF, 0x6387, 0x38F0,\n    0x6388, 0x0924, 0x6389, 0x1383, 0x638C, 0x09A0, 0x638E, 0x137D,\n    0x638F, 0x1382, 0x6390, 0x38F1, 0x6392, 0x0D09, 0x6396, 0x137C,\n    0x6398, 0x06F7, 0x639B, 0x05BB, 0x639E, 0x38F2, 0x639F, 0x1384,\n    0x63A0, 0x0F73, 0x63A1, 0x083E, 0x63A2, 0x0B73, 0x63A3, 0x1381,\n    0x63A5, 0x0A80, 0x63A7, 0x07C7, 0x63A8, 0x0A2A, 0x63A9, 0x0508,\n    0x63AA, 0x0ABE, 0x63AB, 0x137F, 0x63AC, 0x065F, 0x63B2, 0x071D,\n    0x63B4, 0x0BEB, 0x63B5, 0x1385, 0x63BB, 0x0AE1, 0x63BE, 0x1388,\n    0x63C0, 0x138A, 0x63C3, 0x0B17, 0x63C4, 0x1390, 0x63C6, 0x138B,\n    0x63C9, 0x138D, 0x63CF, 0x0DB3, 0x63D0, 0x0C0F, 0x63D1, 0x38F3,\n    0x63D2, 0x138E, 0x63D6, 0x0F16, 0x63DA, 0x0F32, 0x63DB, 0x05F5,\n    0x63DC, 0x38F4, 0x63E1, 0x0472, 0x63E3, 0x138C, 0x63E9, 0x1389,\n    0x63ED, 0x341C, 0x63EE, 0x0634, 0x63F4, 0x0509, 0x63F5, 0x2113,\n    0x63F6, 0x138F, 0x63F7, 0x3644, 0x63FA, 0x0F33, 0x6406, 0x1393,\n    0x6409, 0x38F5, 0x640D, 0x0B1B, 0x640F, 0x139A, 0x6410, 0x38F6,\n    0x6413, 0x1394, 0x6414, 0x1E2C, 0x6416, 0x1391, 0x6417, 0x1398,\n    0x641C, 0x137A, 0x6422, 0x38F7, 0x6426, 0x1395, 0x6428, 0x1399,\n    0x642C, 0x0D56, 0x642D, 0x0C65, 0x6434, 0x1392, 0x6436, 0x1396,\n    0x643A, 0x071E, 0x643E, 0x0861, 0x6442, 0x0A81, 0x644E, 0x139E,\n    0x6451, 0x1E43, 0x6454, 0x38F8, 0x6458, 0x0C20, 0x645B, 0x38F9,\n    0x6460, 0x2114, 0x6467, 0x139B, 0x6469, 0x0E8E, 0x646D, 0x38FA,\n    0x646F, 0x139C, 0x6476, 0x139D, 0x6478, 0x0EDA, 0x647A, 0x0A46,\n    0x647B, 0x38FB, 0x6483, 0x0738, 0x6488, 0x13A4, 0x6492, 0x0883,\n    0x6493, 0x13A1, 0x6495, 0x13A0, 0x649A, 0x0CE8, 0x649D, 0x2115,\n    0x649E, 0x0C8D, 0x64A4, 0x0C2B, 0x64A5, 0x13A2, 0x64A9, 0x13A3,\n    0x64AB, 0x0DE1, 0x64AD, 0x0CFB, 0x64AE, 0x0871, 0x64B0, 0x0A95,\n    0x64B2, 0x0E7E, 0x64B9, 0x05A7, 0x64BB, 0x13AA, 0x64BC, 0x13A5,\n    0x64BE, 0x38FC, 0x64BF, 0x38FD, 0x64C1, 0x0F34, 0x64C2, 0x13AC,\n    0x64C5, 0x13A8, 0x64C7, 0x13A9, 0x64CA, 0x341D, 0x64CD, 0x0AE2,\n    0x64CE, 0x2116, 0x64D2, 0x13A7, 0x64D4, 0x1366, 0x64D8, 0x13AB,\n    0x64DA, 0x13A6, 0x64E0, 0x13B0, 0x64E1, 0x13B1, 0x64E2, 0x0C21,\n    0x64E3, 0x13B3, 0x64E5, 0x38FE, 0x64E6, 0x0872, 0x64E7, 0x13AE,\n    0x64EC, 0x0656, 0x64EF, 0x13B4, 0x64F1, 0x13AD, 0x64F2, 0x13B8,\n    0x64F4, 0x13B7, 0x64F6, 0x13B6, 0x64F7, 0x38FF, 0x64FA, 0x13B9,\n    0x64FB, 0x3900, 0x64FD, 0x13BB, 0x64FE, 0x09D9, 0x6500, 0x13BA,\n    0x6504, 0x3901, 0x6505, 0x13BE, 0x6516, 0x3902, 0x6518, 0x13BC,\n    0x6519, 0x3903, 0x651C, 0x13BD, 0x651D, 0x1397, 0x6522, 0x1E97,\n    0x6523, 0x13C0, 0x6524, 0x13BF, 0x652A, 0x139F, 0x652B, 0x13C1,\n    0x652C, 0x13B5, 0x652F, 0x08A7, 0x6534, 0x13C2, 0x6535, 0x13C3,\n    0x6536, 0x13C5, 0x6537, 0x13C4, 0x6538, 0x13C6, 0x6539, 0x057E,\n    0x653B, 0x07C8, 0x653E, 0x0E4C, 0x653F, 0x0A53, 0x6545, 0x0782,\n    0x6547, 0x3904, 0x6548, 0x13C8, 0x654D, 0x13CB, 0x654E, 0x2117,\n    0x654F, 0x0DC4, 0x6551, 0x0679, 0x6555, 0x13CA, 0x6556, 0x13C9,\n    0x6557, 0x0D0A, 0x6558, 0x13CC, 0x6559, 0x06AD, 0x655D, 0x13CE,\n    0x655E, 0x13CD, 0x6562, 0x05F6, 0x6563, 0x0884, 0x6566, 0x0CB0,\n    0x6567, 0x3905, 0x656C, 0x071F, 0x6570, 0x0A3A, 0x6572, 0x13CF,\n    0x6574, 0x0A54, 0x6575, 0x0C22, 0x6577, 0x0DD1, 0x6578, 0x13D0,\n    0x6581, 0x3906, 0x6582, 0x13D1, 0x6583, 0x13D2, 0x6585, 0x3907,\n    0x6587, 0x0E08, 0x6588, 0x120C, 0x6589, 0x0A6A, 0x658C, 0x0DBE,\n    0x658E, 0x0848, 0x6590, 0x0D79, 0x6591, 0x0D57, 0x6597, 0x0C47,\n    0x6599, 0x0F89, 0x659B, 0x13D4, 0x659C, 0x08FC, 0x659F, 0x13D5,\n    0x65A1, 0x047A, 0x65A4, 0x06CC, 0x65A5, 0x0A71, 0x65A7, 0x0DD2,\n    0x65AB, 0x13D6, 0x65AC, 0x0890, 0x65AD, 0x0B85, 0x65AF, 0x08A9,\n    0x65B0, 0x09FD, 0x65B7, 0x13D7, 0x65B9, 0x0E4D, 0x65BC, 0x0519,\n    0x65BD, 0x08AA, 0x65C1, 0x13DA, 0x65C2, 0x3908, 0x65C3, 0x13D8,\n    0x65C4, 0x13DB, 0x65C5, 0x0F81, 0x65C6, 0x13D9, 0x65CB, 0x0A9F,\n    0x65CC, 0x13DC, 0x65CF, 0x0B12, 0x65D2, 0x13DD, 0x65D7, 0x0636,\n    0x65D9, 0x13DF, 0x65DB, 0x13DE, 0x65E0, 0x13E0, 0x65E1, 0x13E1,\n    0x65E2, 0x0637, 0x65E3, 0x3585, 0x65E5, 0x0CD4, 0x65E6, 0x0B74,\n    0x65E7, 0x0686, 0x65E8, 0x08AB, 0x65E9, 0x0AE3, 0x65EC, 0x0966,\n    0x65ED, 0x0474, 0x65F0, 0x3909, 0x65F1, 0x13E2, 0x65F2, 0x390A,\n    0x65FA, 0x0522, 0x65FB, 0x13E6, 0x6600, 0x2118, 0x6602, 0x07C9,\n    0x6603, 0x13E5, 0x6606, 0x081B, 0x6607, 0x09A2, 0x6609, 0x211A,\n    0x660A, 0x13E4, 0x660C, 0x09A3, 0x660E, 0x0ECC, 0x660F, 0x081A,\n    0x6613, 0x049B, 0x6614, 0x0A72, 0x6615, 0x2119, 0x661C, 0x13EB,\n    0x661E, 0x211C, 0x661F, 0x0A55, 0x6620, 0x04E9, 0x6624, 0x211D,\n    0x6625, 0x095F, 0x6627, 0x0E94, 0x6628, 0x0862, 0x662C, 0x390B,\n    0x662D, 0x09A4, 0x662E, 0x211B, 0x662F, 0x0A4B, 0x6631, 0x20AE,\n    0x6634, 0x13EA, 0x6635, 0x13E8, 0x6636, 0x13E9, 0x663B, 0x1E00,\n    0x663C, 0x0BA9, 0x663F, 0x1409, 0x6641, 0x13EF, 0x6642, 0x08CC,\n    0x6643, 0x07CA, 0x6644, 0x13ED, 0x6649, 0x13EE, 0x664B, 0x09FE,\n    0x664C, 0x390C, 0x664F, 0x13EC, 0x6652, 0x087D, 0x6657, 0x211F,\n    0x6659, 0x2120, 0x665B, 0x390D, 0x665C, 0x390E, 0x665D, 0x13F1,\n    0x665E, 0x13F0, 0x665F, 0x13F5, 0x6661, 0x390F, 0x6662, 0x13F6,\n    0x6663, 0x373A, 0x6664, 0x13F2, 0x6665, 0x211E, 0x6666, 0x0580,\n    0x6667, 0x13F3, 0x6668, 0x13F4, 0x6669, 0x0D69, 0x666B, 0x3910,\n    0x666E, 0x0DD3, 0x666F, 0x0720, 0x6670, 0x13F7, 0x6673, 0x2122,\n    0x6674, 0x0A56, 0x6676, 0x09A5, 0x6677, 0x3911, 0x667A, 0x0B90,\n    0x6681, 0x06BF, 0x6683, 0x13F8, 0x6684, 0x13FC, 0x6687, 0x054B,\n    0x6688, 0x13F9, 0x6689, 0x13FB, 0x668E, 0x13FA, 0x6691, 0x0975,\n    0x6696, 0x0B86, 0x6697, 0x0489, 0x6698, 0x13FD, 0x6699, 0x2123,\n    0x669D, 0x13FE, 0x66A0, 0x2124, 0x66A2, 0x0BC6, 0x66A4, 0x3912,\n    0x66A6, 0x0FB9, 0x66AB, 0x0891, 0x66AE, 0x0E3B, 0x66B2, 0x2125,\n    0x66B4, 0x0E6B, 0x66B8, 0x1405, 0x66B9, 0x1400, 0x66BC, 0x1403,\n    0x66BE, 0x1402, 0x66BF, 0x2126, 0x66C1, 0x13FF, 0x66C4, 0x1404,\n    0x66C6, 0x3455, 0x66C7, 0x0CB6, 0x66C8, 0x3913, 0x66C9, 0x1401,\n    0x66D6, 0x1406, 0x66D9, 0x0976, 0x66DA, 0x1407, 0x66DC, 0x0F35,\n    0x66DD, 0x0D2E, 0x66E0, 0x1408, 0x66E6, 0x140A, 0x66E9, 0x140B,\n    0x66EC, 0x3914, 0x66F0, 0x140C, 0x66F2, 0x06C2, 0x66F3, 0x04EA,\n    0x66F4, 0x07CB, 0x66F5, 0x140D, 0x66F7, 0x140E, 0x66F8, 0x097B,\n    0x66F9, 0x0AE4, 0x66FA, 0x2127, 0x66FB, 0x20B1, 0x66FC, 0x10ED,\n    0x66FD, 0x0AC0, 0x66FE, 0x0ABF, 0x66FF, 0x0B38, 0x6700, 0x0837,\n    0x6703, 0x104B, 0x6705, 0x3915, 0x6708, 0x0744, 0x6709, 0x0F17,\n    0x670B, 0x0E4E, 0x670D, 0x0DF0, 0x670E, 0x2128, 0x670F, 0x140F,\n    0x6713, 0x3916, 0x6714, 0x0863, 0x6715, 0x0BDB, 0x6716, 0x1410,\n    0x6717, 0x0FD5, 0x671B, 0x0E6C, 0x671D, 0x0BC7, 0x671E, 0x1411,\n    0x671F, 0x0638, 0x6726, 0x1412, 0x6727, 0x1413, 0x6728, 0x0EE6,\n    0x672A, 0x0EB0, 0x672B, 0x0EA4, 0x672C, 0x0E8A, 0x672D, 0x0873,\n    0x672E, 0x1415, 0x6731, 0x0917, 0x6733, 0x3917, 0x6734, 0x0E7F,\n    0x6736, 0x1417, 0x6737, 0x141A, 0x6738, 0x1419, 0x673A, 0x0635,\n    0x673D, 0x067A, 0x673F, 0x1416, 0x6741, 0x1418, 0x6743, 0x35B7,\n    0x6746, 0x141B, 0x6748, 0x3918, 0x6749, 0x0A3F, 0x674C, 0x3919,\n    0x674E, 0x0F65, 0x674F, 0x048D, 0x6750, 0x0850, 0x6751, 0x0B1C,\n    0x6753, 0x0909, 0x6756, 0x09DB, 0x6759, 0x141E, 0x675C, 0x0C48,\n    0x675E, 0x141C, 0x675F, 0x0B0B, 0x6760, 0x141D, 0x6761, 0x09DA,\n    0x6762, 0x0EE9, 0x6763, 0x141F, 0x6764, 0x1420, 0x6765, 0x0F52,\n    0x6766, 0x212A, 0x676A, 0x1425, 0x676D, 0x07CC, 0x676E, 0x3571,\n    0x676F, 0x0D0B, 0x6770, 0x1422, 0x6771, 0x0C66, 0x6772, 0x13E3,\n    0x6773, 0x13E7, 0x6775, 0x0669, 0x6776, 0x391A, 0x6777, 0x0CFD,\n    0x677B, 0x391B, 0x677C, 0x1424, 0x677E, 0x09A6, 0x677F, 0x0D58,\n    0x6785, 0x142A, 0x6787, 0x0D8E, 0x6789, 0x1421, 0x678B, 0x1427,\n    0x678C, 0x1426, 0x6790, 0x0A73, 0x6795, 0x0E9B, 0x6797, 0x0F9B,\n    0x679A, 0x0E95, 0x679C, 0x054C, 0x679D, 0x08AC, 0x67A0, 0x0FEE,\n    0x67A1, 0x1429, 0x67A2, 0x0A3B, 0x67A6, 0x1428, 0x67A9, 0x1423,\n    0x67AF, 0x0783, 0x67B0, 0x391C, 0x67B2, 0x391D, 0x67B3, 0x142F,\n    0x67B4, 0x142D, 0x67B6, 0x054D, 0x67B7, 0x142B, 0x67B8, 0x1431,\n    0x67B9, 0x1437, 0x67BB, 0x212B, 0x67C0, 0x212D, 0x67C1, 0x0B28,\n    0x67C4, 0x0E11, 0x67C6, 0x1439, 0x67CA, 0x0D94, 0x67CE, 0x1438,\n    0x67CF, 0x0D26, 0x67D0, 0x0E6D, 0x67D1, 0x05F7, 0x67D3, 0x0A9B,\n    0x67D4, 0x094A, 0x67D7, 0x391F, 0x67D8, 0x0BEF, 0x67D9, 0x3920,\n    0x67DA, 0x0F18, 0x67DD, 0x1434, 0x67DE, 0x1433, 0x67E2, 0x1435,\n    0x67E4, 0x1432, 0x67E7, 0x143A, 0x67E9, 0x1430, 0x67EC, 0x142E,\n    0x67EE, 0x1436, 0x67EF, 0x142C, 0x67F0, 0x3921, 0x67F1, 0x0BAA,\n    0x67F3, 0x0F04, 0x67F4, 0x08F2, 0x67F5, 0x0864, 0x67F9, 0x391E,\n    0x67FB, 0x082A, 0x67FE, 0x0E9D, 0x67FF, 0x059F, 0x6801, 0x212E,\n    0x6802, 0x0BEA, 0x6803, 0x0CA2, 0x6804, 0x04EB, 0x6805, 0x1E07,\n    0x6813, 0x0A96, 0x6816, 0x0A58, 0x6817, 0x0700, 0x681E, 0x143C,\n    0x6821, 0x07CD, 0x6822, 0x05DA, 0x6829, 0x143E, 0x682A, 0x05D2,\n    0x682B, 0x1444, 0x682C, 0x3922, 0x6830, 0x3923, 0x6831, 0x3924,\n    0x6832, 0x1441, 0x6834, 0x0A97, 0x6838, 0x05A9, 0x6839, 0x081C,\n    0x683C, 0x05A8, 0x683D, 0x083F, 0x6840, 0x143F, 0x6841, 0x073B,\n    0x6842, 0x0721, 0x6843, 0x0C67, 0x6844, 0x212F, 0x6846, 0x143D,\n    0x6848, 0x048A, 0x684D, 0x1440, 0x684E, 0x1442, 0x6850, 0x06C5,\n    0x6851, 0x0702, 0x6852, 0x212C, 0x6853, 0x05F8, 0x6854, 0x0665,\n    0x6859, 0x1445, 0x685B, 0x3925, 0x685C, 0x0869, 0x685D, 0x0E9F,\n    0x685F, 0x0885, 0x6863, 0x1446, 0x6867, 0x0DA2, 0x6872, 0x3926,\n    0x6874, 0x1452, 0x6875, 0x3927, 0x6876, 0x0533, 0x6877, 0x1447,\n    0x687A, 0x3928, 0x687E, 0x1458, 0x687F, 0x1448, 0x6881, 0x0F8A,\n    0x6883, 0x144F, 0x6884, 0x3929, 0x6885, 0x0D15, 0x688D, 0x1457,\n    0x688E, 0x1E9C, 0x688F, 0x144A, 0x6893, 0x0478, 0x6894, 0x144C,\n    0x6897, 0x07CE, 0x689B, 0x144E, 0x689D, 0x144D, 0x689F, 0x1449,\n    0x68A0, 0x1454, 0x68A2, 0x09A7, 0x68A5, 0x392A, 0x68A6, 0x11BE,\n    0x68A7, 0x079C, 0x68A8, 0x0F66, 0x68AD, 0x144B, 0x68AF, 0x0C10,\n    0x68B0, 0x0581, 0x68B1, 0x081D, 0x68B2, 0x392B, 0x68B3, 0x1443,\n    0x68B5, 0x1453, 0x68B6, 0x05BF, 0x68B9, 0x1451, 0x68BA, 0x1455,\n    0x68BC, 0x0C68, 0x68C4, 0x063A, 0x68C6, 0x1473, 0x68C8, 0x20AF,\n    0x68C9, 0x0ED5, 0x68CA, 0x145A, 0x68CB, 0x0639, 0x68CD, 0x1461,\n    0x68CF, 0x2130, 0x68D0, 0x392C, 0x68D2, 0x0E6E, 0x68D4, 0x1462,\n    0x68D5, 0x1464, 0x68D6, 0x392D, 0x68D7, 0x1468, 0x68D8, 0x145C,\n    0x68DA, 0x0B68, 0x68DF, 0x0C69, 0x68E0, 0x146C, 0x68E1, 0x145F,\n    0x68E3, 0x1469, 0x68E7, 0x1463, 0x68E8, 0x392E, 0x68ED, 0x392F,\n    0x68EE, 0x09FF, 0x68EF, 0x146D, 0x68F0, 0x3930, 0x68F1, 0x3931,\n    0x68F2, 0x0A57, 0x68F9, 0x146B, 0x68FA, 0x05F9, 0x68FC, 0x3932,\n    0x6900, 0x0FF6, 0x6901, 0x1459, 0x6904, 0x1467, 0x6905, 0x049C,\n    0x6908, 0x145B, 0x690B, 0x0EC6, 0x690C, 0x1460, 0x690D, 0x09E8,\n    0x690E, 0x0BE3, 0x690F, 0x1456, 0x6911, 0x3933, 0x6912, 0x1466,\n    0x6913, 0x3934, 0x6919, 0x0A40, 0x691A, 0x1470, 0x691B, 0x05CF,\n    0x691C, 0x0755, 0x6921, 0x1472, 0x6922, 0x145D, 0x6923, 0x1471,\n    0x6925, 0x146A, 0x6926, 0x145E, 0x6928, 0x146E, 0x692A, 0x146F,\n    0x6930, 0x1480, 0x6934, 0x0CA6, 0x6935, 0x3935, 0x6936, 0x1465,\n    0x6939, 0x147C, 0x693B, 0x3936, 0x693D, 0x147E, 0x693F, 0x0BF4,\n    0x694A, 0x0F36, 0x6953, 0x0DE8, 0x6954, 0x1479, 0x6955, 0x0B2A,\n    0x6957, 0x3937, 0x6959, 0x147F, 0x695A, 0x0AC1, 0x695C, 0x1476,\n    0x695D, 0x1483, 0x695E, 0x1482, 0x6960, 0x0CC7, 0x6961, 0x1481,\n    0x6962, 0x0CC2, 0x6963, 0x3938, 0x6968, 0x2132, 0x696A, 0x1485,\n    0x696B, 0x1478, 0x696D, 0x06C0, 0x696E, 0x147B, 0x696F, 0x0967,\n    0x6972, 0x3939, 0x6973, 0x0D16, 0x6974, 0x147D, 0x6975, 0x06C3,\n    0x6977, 0x1475, 0x6978, 0x1477, 0x6979, 0x1474, 0x697C, 0x0FD6,\n    0x697D, 0x05B8, 0x697E, 0x147A, 0x697F, 0x393A, 0x6980, 0x393B,\n    0x6981, 0x1484, 0x6982, 0x0593, 0x698A, 0x0857, 0x698E, 0x04FF,\n    0x6991, 0x1495, 0x6994, 0x0FD7, 0x6995, 0x1498, 0x6998, 0x2134,\n    0x699B, 0x0A00, 0x699C, 0x1497, 0x69A0, 0x1496, 0x69A6, 0x393C,\n    0x69A7, 0x1493, 0x69AD, 0x393D, 0x69AE, 0x1487, 0x69B1, 0x14A4,\n    0x69B2, 0x1486, 0x69B4, 0x1499, 0x69B7, 0x393E, 0x69BB, 0x1491,\n    0x69BE, 0x148C, 0x69BF, 0x1489, 0x69C1, 0x148A, 0x69C3, 0x1492,\n    0x69C7, 0x1D33, 0x69CA, 0x148F, 0x69CB, 0x07CF, 0x69CC, 0x0BE4,\n    0x69CD, 0x0AE6, 0x69CE, 0x148D, 0x69D0, 0x1488, 0x69D3, 0x148B,\n    0x69D6, 0x393F, 0x69D7, 0x3940, 0x69D8, 0x0F37, 0x69D9, 0x0E98,\n    0x69DD, 0x1490, 0x69DE, 0x149A, 0x69E2, 0x2135, 0x69E7, 0x14A2,\n    0x69E8, 0x149B, 0x69EA, 0x356F, 0x69EB, 0x14A8, 0x69ED, 0x14A6,\n    0x69F2, 0x14A1, 0x69F6, 0x373F, 0x69F9, 0x14A0, 0x69FB, 0x0BEC,\n    0x69FD, 0x0AE7, 0x69FF, 0x149E, 0x6A01, 0x3941, 0x6A02, 0x149C,\n    0x6A05, 0x14A3, 0x6A0A, 0x14A9, 0x6A0B, 0x0D89, 0x6A0C, 0x14AF,\n    0x6A0F, 0x3942, 0x6A12, 0x14AA, 0x6A13, 0x14AD, 0x6A14, 0x14A7,\n    0x6A15, 0x3943, 0x6A17, 0x0BB2, 0x6A19, 0x0DAA, 0x6A1B, 0x149D,\n    0x6A1E, 0x14A5, 0x6A1F, 0x09A8, 0x6A21, 0x0EDB, 0x6A22, 0x14B9,\n    0x6A23, 0x14AC, 0x6A28, 0x3944, 0x6A29, 0x0756, 0x6A2A, 0x0523,\n    0x6A2B, 0x05BD, 0x6A2E, 0x1494, 0x6A30, 0x2136, 0x6A34, 0x3945,\n    0x6A35, 0x09A9, 0x6A36, 0x14B1, 0x6A38, 0x14B8, 0x6A39, 0x0925,\n    0x6A3A, 0x05D0, 0x6A3D, 0x0B6C, 0x6A3E, 0x3946, 0x6A44, 0x14AE,\n    0x6A45, 0x3947, 0x6A46, 0x2138, 0x6A47, 0x14B3, 0x6A48, 0x14B7,\n    0x6A4B, 0x06AE, 0x6A50, 0x3948, 0x6A51, 0x3949, 0x6A54, 0x3C34,\n    0x6A56, 0x394A, 0x6A58, 0x0666, 0x6A59, 0x14B5, 0x6A5B, 0x394B,\n    0x6A5F, 0x063B, 0x6A61, 0x0CA3, 0x6A62, 0x14B4, 0x6A66, 0x14B6,\n    0x6A6B, 0x2137, 0x6A72, 0x14B0, 0x6A73, 0x2139, 0x6A78, 0x14B2,\n    0x6A7E, 0x213A, 0x6A7F, 0x05BE, 0x6A80, 0x0B87, 0x6A83, 0x394C,\n    0x6A84, 0x14BD, 0x6A89, 0x394D, 0x6A8D, 0x14BB, 0x6A8E, 0x079D,\n    0x6A90, 0x14BA, 0x6A91, 0x394E, 0x6A97, 0x14C0, 0x6A9C, 0x143B,\n    0x6A9D, 0x394F, 0x6A9E, 0x3950, 0x6A9F, 0x3951, 0x6AA0, 0x14BC,\n    0x6AA2, 0x14BE, 0x6AA3, 0x14BF, 0x6AAA, 0x14CB, 0x6AAC, 0x14C7,\n    0x6AAE, 0x1450, 0x6AB3, 0x14C6, 0x6AB8, 0x14C5, 0x6ABB, 0x14C2,\n    0x6AC1, 0x14AB, 0x6AC2, 0x14C4, 0x6AC3, 0x14C3, 0x6AD1, 0x14C9,\n    0x6AD3, 0x0FCC, 0x6ADA, 0x14CC, 0x6ADB, 0x06F3, 0x6ADC, 0x3952,\n    0x6ADE, 0x14C8, 0x6ADF, 0x14CA, 0x6AE2, 0x213B, 0x6AE4, 0x213C,\n    0x6AE7, 0x3953, 0x6AE8, 0x0D3B, 0x6AEA, 0x14CD, 0x6AEC, 0x3954,\n    0x6AFA, 0x14D1, 0x6AFB, 0x14CE, 0x6B04, 0x0F5D, 0x6B05, 0x14CF,\n    0x6B0A, 0x149F, 0x6B12, 0x14D2, 0x6B16, 0x14D3, 0x6B1D, 0x04D7,\n    0x6B1E, 0x3955, 0x6B1F, 0x14D5, 0x6B20, 0x073D, 0x6B21, 0x08CD,\n    0x6B23, 0x06CD, 0x6B24, 0x3956, 0x6B27, 0x0524, 0x6B32, 0x0F49,\n    0x6B35, 0x3957, 0x6B37, 0x14D7, 0x6B38, 0x14D6, 0x6B39, 0x14D9,\n    0x6B3A, 0x0657, 0x6B3D, 0x06CE, 0x6B3E, 0x05FA, 0x6B43, 0x14DC,\n    0x6B46, 0x3958, 0x6B47, 0x14DB, 0x6B49, 0x14DD, 0x6B4C, 0x054E,\n    0x6B4E, 0x0B75, 0x6B50, 0x14DE, 0x6B53, 0x05FB, 0x6B54, 0x14E0,\n    0x6B56, 0x3959, 0x6B59, 0x14DF, 0x6B5B, 0x14E1, 0x6B5F, 0x14E2,\n    0x6B60, 0x395A, 0x6B61, 0x14E3, 0x6B62, 0x08AD, 0x6B63, 0x0A59,\n    0x6B64, 0x0811, 0x6B65, 0x344A, 0x6B66, 0x0DE2, 0x6B69, 0x0E32,\n    0x6B6A, 0x0FEA, 0x6B6F, 0x08C3, 0x6B72, 0x35D9, 0x6B73, 0x0840,\n    0x6B74, 0x0FBA, 0x6B77, 0x3456, 0x6B78, 0x14E4, 0x6B79, 0x14E5,\n    0x6B7B, 0x08AE, 0x6B7F, 0x14E6, 0x6B80, 0x14E7, 0x6B82, 0x395B,\n    0x6B83, 0x14E9, 0x6B84, 0x14E8, 0x6B86, 0x0E86, 0x6B89, 0x0968,\n    0x6B8A, 0x0918, 0x6B8B, 0x0892, 0x6B8D, 0x14EA, 0x6B95, 0x14EC,\n    0x6B96, 0x09E9, 0x6B98, 0x14EB, 0x6B9E, 0x14ED, 0x6BA4, 0x14EE,\n    0x6BAA, 0x14EF, 0x6BAB, 0x14F0, 0x6BAF, 0x14F1, 0x6BB1, 0x14F3,\n    0x6BB2, 0x14F2, 0x6BB3, 0x14F4, 0x6BB4, 0x0525, 0x6BB5, 0x0B88,\n    0x6BB7, 0x14F5, 0x6BBA, 0x0874, 0x6BBB, 0x05AA, 0x6BBC, 0x14F6,\n    0x6BBE, 0x395C, 0x6BBF, 0x0C3C, 0x6BC0, 0x119D, 0x6BC5, 0x063D,\n    0x6BC6, 0x14F7, 0x6BCB, 0x14F8, 0x6BCC, 0x3744, 0x6BCD, 0x0E3C,\n    0x6BCE, 0x0E96, 0x6BCF, 0x344C, 0x6BD2, 0x0C9F, 0x6BD3, 0x14F9,\n    0x6BD4, 0x0D7A, 0x6BD6, 0x213D, 0x6BD8, 0x0D8F, 0x6BDB, 0x0EDF,\n    0x6BDF, 0x14FA, 0x6BE1, 0x395D, 0x6BEB, 0x14FC, 0x6BEC, 0x14FB,\n    0x6BEF, 0x14FE, 0x6BF1, 0x395E, 0x6BF3, 0x14FD, 0x6C08, 0x1500,\n    0x6C0F, 0x08AF, 0x6C10, 0x395F, 0x6C11, 0x0EBD, 0x6C13, 0x1501,\n    0x6C14, 0x1502, 0x6C17, 0x063E, 0x6C1B, 0x1503, 0x6C23, 0x1505,\n    0x6C24, 0x1504, 0x6C33, 0x3960, 0x6C34, 0x0A2B, 0x6C35, 0x3961,\n    0x6C37, 0x0DAB, 0x6C38, 0x04EC, 0x6C3A, 0x3962, 0x6C3E, 0x0D59,\n    0x6C3F, 0x213E, 0x6C40, 0x0C11, 0x6C41, 0x094B, 0x6C42, 0x067B,\n    0x6C4E, 0x0D5A, 0x6C50, 0x08DA, 0x6C55, 0x1507, 0x6C57, 0x05FC,\n    0x6C59, 0x3963, 0x6C5A, 0x051A, 0x6C5C, 0x213F, 0x6C5D, 0x0CCA,\n    0x6C5E, 0x1506, 0x6C5F, 0x07D0, 0x6C60, 0x0B91, 0x6C62, 0x1508,\n    0x6C68, 0x1510, 0x6C6A, 0x1509, 0x6C6F, 0x2141, 0x6C70, 0x0B21,\n    0x6C72, 0x067C, 0x6C73, 0x1511, 0x6C76, 0x3964, 0x6C7A, 0x073E,\n    0x6C7B, 0x3965, 0x6C7D, 0x063F, 0x6C7E, 0x150F, 0x6C81, 0x150D,\n    0x6C82, 0x150A, 0x6C83, 0x0F4A, 0x6C85, 0x3966, 0x6C86, 0x2140,\n    0x6C88, 0x0BDC, 0x6C8C, 0x0CB1, 0x6C8D, 0x150B, 0x6C90, 0x1513,\n    0x6C92, 0x1512, 0x6C93, 0x06F9, 0x6C95, 0x3967, 0x6C96, 0x052D,\n    0x6C99, 0x082B, 0x6C9A, 0x150C, 0x6C9B, 0x150E, 0x6C9C, 0x3968,\n    0x6CA1, 0x0E85, 0x6CA2, 0x0B54, 0x6CAA, 0x3749, 0x6CAB, 0x0EA5,\n    0x6CAE, 0x151B, 0x6CB1, 0x151C, 0x6CB3, 0x054F, 0x6CB8, 0x0DF8,\n    0x6CB9, 0x0F09, 0x6CBA, 0x151E, 0x6CBB, 0x08CF, 0x6CBC, 0x09AA,\n    0x6CBD, 0x1517, 0x6CBE, 0x151D, 0x6CBF, 0x050A, 0x6CC1, 0x06AF,\n    0x6CC4, 0x1514, 0x6CC5, 0x1519, 0x6CC9, 0x0A98, 0x6CCA, 0x0D27,\n    0x6CCC, 0x0D7B, 0x6CD0, 0x3969, 0x6CD3, 0x1516, 0x6CD4, 0x396A,\n    0x6CD5, 0x0E4F, 0x6CD6, 0x396B, 0x6CD7, 0x1518, 0x6CD9, 0x1521,\n    0x6CDA, 0x2142, 0x6CDB, 0x151F, 0x6CDD, 0x151A, 0x6CE0, 0x396C,\n    0x6CE1, 0x0E50, 0x6CE2, 0x0CFE, 0x6CE3, 0x067D, 0x6CE5, 0x0C1F,\n    0x6CE8, 0x0BAB, 0x6CEA, 0x1522, 0x6CEB, 0x396D, 0x6CEC, 0x396E,\n    0x6CEE, 0x396F, 0x6CEF, 0x1520, 0x6CF0, 0x0B39, 0x6CF1, 0x1515,\n    0x6CF3, 0x04ED, 0x6D01, 0x3C35, 0x6D04, 0x2143, 0x6D0A, 0x3970,\n    0x6D0B, 0x0F38, 0x6D0C, 0x152D, 0x6D0E, 0x3971, 0x6D11, 0x3972,\n    0x6D12, 0x152C, 0x6D17, 0x0A9A, 0x6D19, 0x1529, 0x6D1B, 0x0F56,\n    0x6D1E, 0x0C8E, 0x6D1F, 0x1523, 0x6D25, 0x0BE1, 0x6D29, 0x04EE,\n    0x6D2A, 0x07D1, 0x6D2B, 0x1526, 0x6D2E, 0x3973, 0x6D32, 0x0931,\n    0x6D33, 0x152B, 0x6D35, 0x152A, 0x6D36, 0x1525, 0x6D38, 0x1528,\n    0x6D3B, 0x05C6, 0x6D3D, 0x1527, 0x6D3E, 0x0CFF, 0x6D41, 0x0F76,\n    0x6D44, 0x09DC, 0x6D45, 0x0A99, 0x6D57, 0x3974, 0x6D59, 0x1533,\n    0x6D5A, 0x1531, 0x6D5C, 0x0DBF, 0x6D5E, 0x3975, 0x6D63, 0x152E,\n    0x6D64, 0x1530, 0x6D65, 0x3976, 0x6D66, 0x04DC, 0x6D69, 0x07D2,\n    0x6D6A, 0x0FD8, 0x6D6C, 0x059B, 0x6D6E, 0x0DD4, 0x6D6F, 0x2145,\n    0x6D74, 0x0F4B, 0x6D77, 0x0582, 0x6D78, 0x0A01, 0x6D79, 0x1532,\n    0x6D82, 0x3977, 0x6D85, 0x1537, 0x6D87, 0x2144, 0x6D88, 0x09AB,\n    0x6D89, 0x342A, 0x6D8C, 0x0F1A, 0x6D8E, 0x1534, 0x6D93, 0x152F,\n    0x6D95, 0x1535, 0x6D96, 0x2146, 0x6D99, 0x0FA6, 0x6D9B, 0x0C6D,\n    0x6D9C, 0x0C9A, 0x6DAC, 0x2147, 0x6DAF, 0x0594, 0x6DB2, 0x04F7,\n    0x6DB5, 0x153B, 0x6DB8, 0x153E, 0x6DBC, 0x0F8B, 0x6DBF, 0x3978,\n    0x6DC0, 0x0F4E, 0x6DC4, 0x3979, 0x6DC5, 0x1545, 0x6DC6, 0x153F,\n    0x6DC7, 0x153C, 0x6DCA, 0x397A, 0x6DCB, 0x0F9C, 0x6DCC, 0x1542,\n    0x6DCF, 0x2148, 0x6DD0, 0x3C36, 0x6DD1, 0x0954, 0x6DD2, 0x1544,\n    0x6DD5, 0x1549, 0x6DD6, 0x397B, 0x6DD8, 0x0C6B, 0x6DD9, 0x1547,\n    0x6DDA, 0x3453, 0x6DDE, 0x1541, 0x6DE1, 0x0B76, 0x6DE4, 0x1548,\n    0x6DE6, 0x153D, 0x6DE8, 0x1543, 0x6DE9, 0x397C, 0x6DEA, 0x154A,\n    0x6DEB, 0x04C0, 0x6DEC, 0x1540, 0x6DEE, 0x154B, 0x6DF1, 0x0A02,\n    0x6DF2, 0x214A, 0x6DF3, 0x0969, 0x6DF5, 0x0DF5, 0x6DF7, 0x081E,\n    0x6DF8, 0x2149, 0x6DF9, 0x1538, 0x6DFA, 0x1546, 0x6DFB, 0x0C34,\n    0x6DFC, 0x214B, 0x6E05, 0x0A5A, 0x6E07, 0x05C7, 0x6E08, 0x0841,\n    0x6E09, 0x09AC, 0x6E0A, 0x153A, 0x6E0B, 0x094C, 0x6E13, 0x0722,\n    0x6E15, 0x1539, 0x6E17, 0x3746, 0x6E19, 0x154F, 0x6E1A, 0x0977,\n    0x6E1B, 0x076E, 0x6E1D, 0x155E, 0x6E1F, 0x1558, 0x6E20, 0x068E,\n    0x6E21, 0x0C49, 0x6E22, 0x397D, 0x6E23, 0x1553, 0x6E24, 0x155C,\n    0x6E25, 0x0473, 0x6E26, 0x04D4, 0x6E27, 0x214E, 0x6E29, 0x0539,\n    0x6E2B, 0x1555, 0x6E2C, 0x0B0C, 0x6E2D, 0x154C, 0x6E2E, 0x154E,\n    0x6E2F, 0x07D3, 0x6E34, 0x3412, 0x6E38, 0x155F, 0x6E39, 0x214C,\n    0x6E3A, 0x155A, 0x6E3C, 0x214F, 0x6E3E, 0x1552, 0x6E42, 0x3C37,\n    0x6E43, 0x1559, 0x6E4A, 0x0EB7, 0x6E4D, 0x1557, 0x6E4E, 0x155B,\n    0x6E51, 0x397E, 0x6E56, 0x0784, 0x6E58, 0x09AD, 0x6E5B, 0x0B77,\n    0x6E5C, 0x214D, 0x6E5F, 0x1551, 0x6E67, 0x0F19, 0x6E6B, 0x1554,\n    0x6E6E, 0x154D, 0x6E6F, 0x0C6C, 0x6E72, 0x1550, 0x6E76, 0x1556,\n    0x6E7E, 0x0FF7, 0x6E7F, 0x08EA, 0x6E80, 0x0EAC, 0x6E82, 0x1560,\n    0x6E8C, 0x0D42, 0x6E8F, 0x156C, 0x6E90, 0x076F, 0x6E96, 0x096A,\n    0x6E98, 0x1562, 0x6E9C, 0x0F77, 0x6E9D, 0x07D4, 0x6E9F, 0x156F,\n    0x6EA2, 0x04B2, 0x6EA5, 0x156D, 0x6EAA, 0x1561, 0x6EAB, 0x340C,\n    0x6EAF, 0x1567, 0x6EB2, 0x1569, 0x6EB6, 0x0F39, 0x6EB7, 0x1564,\n    0x6EBA, 0x0C28, 0x6EBD, 0x1566, 0x6EBF, 0x2150, 0x6EC2, 0x156E,\n    0x6EC4, 0x1568, 0x6EC5, 0x0ED3, 0x6EC7, 0x397F, 0x6EC9, 0x1563,\n    0x6ECA, 0x3980, 0x6ECB, 0x08CE, 0x6ECC, 0x157B, 0x6ECE, 0x3981,\n    0x6ED1, 0x05C8, 0x6ED3, 0x1565, 0x6ED4, 0x156A, 0x6ED5, 0x156B,\n    0x6ED9, 0x3C38, 0x6EDD, 0x0B4C, 0x6EDE, 0x0B3A, 0x6EE6, 0x3C24,\n    0x6EEC, 0x1573, 0x6EEF, 0x1579, 0x6EF2, 0x1577, 0x6EF4, 0x0C23,\n    0x6EF7, 0x157E, 0x6EF8, 0x1574, 0x6EFD, 0x3982, 0x6EFE, 0x1575,\n    0x6EFF, 0x155D, 0x6F01, 0x0693, 0x6F02, 0x0DAC, 0x6F06, 0x08EB,\n    0x6F09, 0x0809, 0x6F0F, 0x0FD9, 0x6F11, 0x1571, 0x6F13, 0x157D,\n    0x6F14, 0x050B, 0x6F15, 0x0AE8, 0x6F1A, 0x3983, 0x6F20, 0x0D2F,\n    0x6F22, 0x05FD, 0x6F23, 0x0FC2, 0x6F2A, 0x3984, 0x6F2B, 0x0EAD,\n    0x6F2C, 0x0BEE, 0x6F2F, 0x3985, 0x6F31, 0x1578, 0x6F32, 0x157A,\n    0x6F33, 0x3986, 0x6F38, 0x0AB4, 0x6F3E, 0x157C, 0x6F3F, 0x1576,\n    0x6F41, 0x1570, 0x6F45, 0x05FF, 0x6F51, 0x1E60, 0x6F54, 0x073F,\n    0x6F58, 0x158A, 0x6F5A, 0x3987, 0x6F5B, 0x1585, 0x6F5C, 0x0A9C,\n    0x6F5E, 0x3988, 0x6F5F, 0x05C1, 0x6F62, 0x3989, 0x6F64, 0x096B,\n    0x6F66, 0x158E, 0x6F6D, 0x1587, 0x6F6E, 0x0BC8, 0x6F6F, 0x1584,\n    0x6F70, 0x0BF5, 0x6F74, 0x15A7, 0x6F78, 0x1581, 0x6F7A, 0x1580,\n    0x6F7C, 0x1589, 0x6F7D, 0x398A, 0x6F80, 0x1583, 0x6F81, 0x1582,\n    0x6F82, 0x1588, 0x6F84, 0x0A45, 0x6F86, 0x157F, 0x6F88, 0x2151,\n    0x6F8B, 0x398B, 0x6F8D, 0x398C, 0x6F8E, 0x158B, 0x6F91, 0x158C,\n    0x6F92, 0x398D, 0x6F94, 0x398E, 0x6F97, 0x05FE, 0x6F98, 0x363C,\n    0x6F9A, 0x398F, 0x6FA1, 0x1591, 0x6FA3, 0x1590, 0x6FA4, 0x1592,\n    0x6FA7, 0x3990, 0x6FA8, 0x3991, 0x6FAA, 0x1595, 0x6FB1, 0x0C3D,\n    0x6FB3, 0x158F, 0x6FB5, 0x2152, 0x6FB6, 0x3992, 0x6FB9, 0x1593,\n    0x6FC0, 0x0739, 0x6FC1, 0x0B59, 0x6FC2, 0x158D, 0x6FC3, 0x0CF1,\n    0x6FC6, 0x1594, 0x6FD4, 0x1599, 0x6FD5, 0x1597, 0x6FD8, 0x159A,\n    0x6FDA, 0x3993, 0x6FDB, 0x159D, 0x6FDE, 0x3994, 0x6FDF, 0x1596,\n    0x6FE0, 0x07FC, 0x6FE1, 0x0CDE, 0x6FE4, 0x1536, 0x6FEB, 0x0F5E,\n    0x6FEC, 0x1598, 0x6FEE, 0x159C, 0x6FEF, 0x0B55, 0x6FF1, 0x159B,\n    0x6FF3, 0x1586, 0x6FF5, 0x2153, 0x6FF6, 0x1BA4, 0x6FF9, 0x3995,\n    0x6FFA, 0x15A0, 0x6FFE, 0x15A4, 0x7001, 0x15A2, 0x7005, 0x2154,\n    0x7006, 0x1E50, 0x7007, 0x2155, 0x7009, 0x159E, 0x700B, 0x159F,\n    0x700F, 0x15A3, 0x7011, 0x15A1, 0x7015, 0x0DC0, 0x7018, 0x15A9,\n    0x701A, 0x15A6, 0x701B, 0x15A5, 0x701D, 0x15A8, 0x701E, 0x0CAC,\n    0x701F, 0x15AA, 0x7026, 0x0BB3, 0x7027, 0x0B4D, 0x7028, 0x2156,\n    0x702C, 0x0A49, 0x7030, 0x15AB, 0x7032, 0x15AD, 0x7039, 0x3996,\n    0x703C, 0x3997, 0x703E, 0x15AC, 0x704A, 0x3998, 0x704C, 0x1572,\n    0x7051, 0x15AE, 0x7054, 0x3999, 0x7058, 0x0CBF, 0x705D, 0x399A,\n    0x705E, 0x399B, 0x7063, 0x15AF, 0x7064, 0x399C, 0x706B, 0x0550,\n    0x706C, 0x399D, 0x706F, 0x0C6E, 0x7070, 0x0583, 0x7078, 0x067E,\n    0x707C, 0x090A, 0x707D, 0x0842, 0x707E, 0x399E, 0x7081, 0x399F,\n    0x7085, 0x2157, 0x7089, 0x0FCD, 0x708A, 0x0A2C, 0x708E, 0x050C,\n    0x7092, 0x15B1, 0x7095, 0x39A0, 0x7099, 0x15B0, 0x70AB, 0x2158,\n    0x70AC, 0x15B4, 0x70AD, 0x0B78, 0x70AE, 0x15B7, 0x70AF, 0x15B2,\n    0x70B3, 0x15B6, 0x70B7, 0x39A1, 0x70B8, 0x15B5, 0x70B9, 0x0C3A,\n    0x70BA, 0x049D, 0x70BB, 0x20AD, 0x70C8, 0x0FBD, 0x70CB, 0x15B9,\n    0x70CF, 0x04CA, 0x70D3, 0x39A2, 0x70D4, 0x39A3, 0x70D8, 0x39A4,\n    0x70D9, 0x15BB, 0x70DC, 0x39A5, 0x70DD, 0x15BA, 0x70DF, 0x15B8,\n    0x70F1, 0x15B3, 0x70F9, 0x0E51, 0x70FD, 0x15BD, 0x7104, 0x215A,\n    0x7107, 0x39A6, 0x7109, 0x15BC, 0x710F, 0x2159, 0x7114, 0x050D,\n    0x7119, 0x15BF, 0x711A, 0x0E02, 0x711C, 0x15BE, 0x7120, 0x39A7,\n    0x7121, 0x0EC1, 0x7126, 0x09AF, 0x7130, 0x1DDC, 0x7131, 0x39A8,\n    0x7136, 0x0AB5, 0x713C, 0x09AE, 0x7146, 0x215C, 0x7147, 0x215D,\n    0x7149, 0x0FC3, 0x714A, 0x39A9, 0x714C, 0x15C5, 0x714E, 0x0A9D,\n    0x7152, 0x39AA, 0x7155, 0x15C1, 0x7156, 0x15C6, 0x7159, 0x050E,\n    0x715C, 0x215B, 0x7160, 0x39AB, 0x7162, 0x15C4, 0x7164, 0x0D17,\n    0x7165, 0x15C0, 0x7166, 0x15C3, 0x7167, 0x09B0, 0x7169, 0x0D65,\n    0x716C, 0x15C7, 0x716E, 0x08FD, 0x7179, 0x39AC, 0x717D, 0x0A9E,\n    0x7184, 0x15CA, 0x7188, 0x15C2, 0x718A, 0x06FD, 0x718F, 0x15C8,\n    0x7192, 0x39AD, 0x7194, 0x0F3A, 0x7195, 0x15CB, 0x7199, 0x205D,\n    0x719F, 0x0959, 0x71A8, 0x15CC, 0x71AC, 0x15CD, 0x71B1, 0x0CE4,\n    0x71B3, 0x39AE, 0x71B9, 0x15CF, 0x71BE, 0x15D0, 0x71C1, 0x215F,\n    0x71C3, 0x0CE9, 0x71C8, 0x0C6F, 0x71C9, 0x15D2, 0x71CB, 0x39AF,\n    0x71CE, 0x15D4, 0x71D0, 0x0F9D, 0x71D2, 0x15D1, 0x71D3, 0x39B0,\n    0x71D4, 0x15D3, 0x71D5, 0x050F, 0x71D6, 0x39B1, 0x71D7, 0x15CE,\n    0x71DF, 0x114E, 0x71E0, 0x15D5, 0x71E5, 0x0AE9, 0x71E6, 0x0886,\n    0x71E7, 0x15D7, 0x71EC, 0x15D6, 0x71ED, 0x09EA, 0x71EE, 0x10EE,\n    0x71F5, 0x15D8, 0x71F9, 0x15DA, 0x71FB, 0x15C9, 0x71FC, 0x15D9,\n    0x71FE, 0x2160, 0x71FF, 0x15DB, 0x7200, 0x39B2, 0x7206, 0x0D30,\n    0x720D, 0x15DC, 0x7210, 0x15DD, 0x721B, 0x15DE, 0x721D, 0x39B3,\n    0x7228, 0x15DF, 0x722A, 0x0BFA, 0x722B, 0x39B4, 0x722C, 0x15E1,\n    0x722D, 0x15E0, 0x7230, 0x15E2, 0x7232, 0x15E3, 0x7235, 0x090B,\n    0x7236, 0x0DD5, 0x7238, 0x39B5, 0x723A, 0x0EF8, 0x723B, 0x15E4,\n    0x723C, 0x15E5, 0x723D, 0x0AD8, 0x723E, 0x08D0, 0x723F, 0x15E6,\n    0x7240, 0x15E7, 0x7241, 0x39B6, 0x7246, 0x15E8, 0x7247, 0x0E22,\n    0x7248, 0x0D5B, 0x724B, 0x15E9, 0x724C, 0x0D0D, 0x7252, 0x0BC9,\n    0x7253, 0x39B7, 0x7255, 0x39B8, 0x7256, 0x39B9, 0x7258, 0x15EA,\n    0x7259, 0x0567, 0x725B, 0x0687, 0x725C, 0x39BA, 0x725D, 0x0ED2,\n    0x725F, 0x0EC2, 0x7261, 0x0534, 0x7262, 0x0FDA, 0x7267, 0x0E80,\n    0x7269, 0x0DFA, 0x7272, 0x0A5B, 0x7274, 0x15EB, 0x7279, 0x0C9B,\n    0x727D, 0x0757, 0x727E, 0x15EC, 0x7280, 0x0844, 0x7281, 0x15EE,\n    0x7282, 0x15ED, 0x7287, 0x15EF, 0x728D, 0x39BB, 0x7292, 0x15F0,\n    0x7296, 0x15F1, 0x72A0, 0x0658, 0x72A2, 0x15F2, 0x72A7, 0x15F3,\n    0x72AC, 0x0758, 0x72AD, 0x39BC, 0x72AF, 0x0D5C, 0x72B1, 0x2161,\n    0x72B2, 0x15F5, 0x72B4, 0x39BD, 0x72B6, 0x09DD, 0x72B9, 0x15F4,\n    0x72BE, 0x2162, 0x72C0, 0x342B, 0x72C2, 0x06B0, 0x72C3, 0x15F6,\n    0x72C4, 0x15F8, 0x72C6, 0x15F7, 0x72C7, 0x39BE, 0x72CE, 0x15F9,\n    0x72D0, 0x0785, 0x72D2, 0x15FA, 0x72D7, 0x06E1, 0x72D9, 0x0AC2,\n    0x72DB, 0x080F, 0x72E0, 0x15FC, 0x72E1, 0x15FD, 0x72E2, 0x15FB,\n    0x72E9, 0x0919, 0x72EC, 0x0CA0, 0x72ED, 0x06B1, 0x72F7, 0x15FF,\n    0x72F8, 0x0B6A, 0x72F9, 0x15FE, 0x72FB, 0x39BF, 0x72FC, 0x0FDB,\n    0x72FD, 0x0D18, 0x7304, 0x39C0, 0x7305, 0x39C1, 0x730A, 0x1602,\n    0x7316, 0x1604, 0x7317, 0x1601, 0x731B, 0x0EE0, 0x731C, 0x1603,\n    0x731D, 0x1605, 0x731F, 0x0F8C, 0x7324, 0x2163, 0x7325, 0x1609,\n    0x7328, 0x39C2, 0x7329, 0x1608, 0x732A, 0x0BB4, 0x732B, 0x0CE3,\n    0x732E, 0x0759, 0x732F, 0x1607, 0x7331, 0x39C3, 0x7334, 0x1606,\n    0x7336, 0x0F1B, 0x7337, 0x0F1C, 0x733E, 0x160A, 0x733F, 0x0510,\n    0x7343, 0x39C4, 0x7344, 0x0808, 0x7345, 0x08B0, 0x734E, 0x160B,\n    0x734F, 0x160C, 0x7357, 0x160E, 0x7363, 0x094D, 0x7368, 0x1610,\n    0x736A, 0x160F, 0x736C, 0x39C5, 0x7370, 0x1611, 0x7372, 0x05AB,\n    0x7375, 0x1613, 0x7377, 0x2165, 0x7378, 0x1612, 0x737A, 0x1615,\n    0x737B, 0x1614, 0x737C, 0x39C6, 0x7383, 0x39C7, 0x7384, 0x0770,\n    0x7385, 0x39C8, 0x7386, 0x39C9, 0x7387, 0x0F70, 0x7389, 0x06C4,\n    0x738B, 0x0526, 0x7395, 0x39CA, 0x7396, 0x06E2, 0x739E, 0x39CB,\n    0x739F, 0x39CC, 0x73A0, 0x39CD, 0x73A6, 0x39CE, 0x73A8, 0x3C3F,\n    0x73A9, 0x061D, 0x73AB, 0x39CF, 0x73B2, 0x0FB0, 0x73B3, 0x1617,\n    0x73B5, 0x39D0, 0x73B7, 0x39D1, 0x73BA, 0x35EA, 0x73BB, 0x1619,\n    0x73BC, 0x39D2, 0x73BD, 0x2166, 0x73C0, 0x161A, 0x73C2, 0x0551,\n    0x73C8, 0x1616, 0x73C9, 0x2167, 0x73CA, 0x0887, 0x73CD, 0x0BDD,\n    0x73CE, 0x1618, 0x73CF, 0x39D3, 0x73D2, 0x216A, 0x73D6, 0x2168,\n    0x73D9, 0x39D4, 0x73DE, 0x161D, 0x73E0, 0x091A, 0x73E3, 0x2169,\n    0x73E4, 0x3C39, 0x73E5, 0x161B, 0x73E9, 0x39D5, 0x73EA, 0x0714,\n    0x73ED, 0x0D5D, 0x73EE, 0x161C, 0x73F1, 0x1637, 0x73F4, 0x39D6,\n    0x73F5, 0x216C, 0x73F8, 0x1622, 0x73FD, 0x39D7, 0x73FE, 0x0771,\n    0x7403, 0x067F, 0x7404, 0x39D8, 0x7405, 0x161F, 0x7406, 0x0F67,\n    0x7407, 0x216B, 0x7409, 0x0F78, 0x740A, 0x39D9, 0x741A, 0x39DA,\n    0x741B, 0x39DB, 0x7421, 0x3C3A, 0x7422, 0x0B56, 0x7424, 0x39DC,\n    0x7425, 0x1621, 0x7426, 0x216D, 0x7428, 0x39DD, 0x7429, 0x216F,\n    0x742A, 0x216E, 0x742C, 0x39DE, 0x742E, 0x2170, 0x742F, 0x39DF,\n    0x7430, 0x39E0, 0x7431, 0x39E1, 0x7432, 0x1623, 0x7433, 0x0F9E,\n    0x7434, 0x06CF, 0x7435, 0x0D90, 0x7436, 0x0D00, 0x7439, 0x39E2,\n    0x743A, 0x1624, 0x743F, 0x1626, 0x7441, 0x1629, 0x7444, 0x39E3,\n    0x7447, 0x39E4, 0x744B, 0x39E5, 0x744D, 0x39E6, 0x7451, 0x39E7,\n    0x7455, 0x1625, 0x7457, 0x39E8, 0x7459, 0x1628, 0x745A, 0x079E,\n    0x745B, 0x04EF, 0x745C, 0x162A, 0x745E, 0x0A36, 0x745F, 0x1627,\n    0x7460, 0x0FA4, 0x7462, 0x2171, 0x7463, 0x162D, 0x7464, 0x1D35,\n    0x7466, 0x39E9, 0x7469, 0x162B, 0x746A, 0x162E, 0x746B, 0x39EA,\n    0x746F, 0x1620, 0x7470, 0x162C, 0x7471, 0x39EB, 0x7473, 0x082C,\n    0x7476, 0x162F, 0x747E, 0x1630, 0x7480, 0x39EC, 0x7483, 0x0F68,\n    0x7485, 0x39ED, 0x7486, 0x39EE, 0x7487, 0x39EF, 0x7489, 0x2172,\n    0x748B, 0x1631, 0x7490, 0x39F0, 0x7498, 0x39F1, 0x749C, 0x39F2,\n    0x749E, 0x1632, 0x749F, 0x2173, 0x74A0, 0x39F3, 0x74A2, 0x161E,\n    0x74A3, 0x39F4, 0x74A7, 0x1633, 0x74A8, 0x39F5, 0x74AB, 0x39F6,\n    0x74B0, 0x0600, 0x74B5, 0x39F7, 0x74BD, 0x08D1, 0x74BF, 0x39F8,\n    0x74C8, 0x39F9, 0x74CA, 0x1634, 0x74CF, 0x1635, 0x74D4, 0x1636,\n    0x74DA, 0x39FA, 0x74DC, 0x04DD, 0x74DE, 0x39FB, 0x74E0, 0x1638,\n    0x74E2, 0x0DAD, 0x74E3, 0x1639, 0x74E6, 0x05E0, 0x74E7, 0x163A,\n    0x74E9, 0x163B, 0x74EE, 0x163C, 0x74EF, 0x3750, 0x74F0, 0x163E,\n    0x74F1, 0x163F, 0x74F2, 0x163D, 0x74F6, 0x0DC5, 0x74F7, 0x1641,\n    0x74F8, 0x1640, 0x7501, 0x2174, 0x7503, 0x1643, 0x7504, 0x1642,\n    0x7505, 0x1644, 0x750C, 0x1645, 0x750D, 0x1647, 0x750E, 0x1646,\n    0x7511, 0x080B, 0x7513, 0x1649, 0x7515, 0x1648, 0x7518, 0x0601,\n    0x751A, 0x0A19, 0x751C, 0x0C36, 0x751E, 0x164A, 0x751F, 0x0A5C,\n    0x7522, 0x35DE, 0x7523, 0x0888, 0x7525, 0x051B, 0x7526, 0x164B,\n    0x7528, 0x0F3B, 0x752B, 0x0E33, 0x752C, 0x164C, 0x752F, 0x20F2,\n    0x7530, 0x0C3E, 0x7531, 0x0F1D, 0x7532, 0x07D5, 0x7533, 0x0A03,\n    0x7537, 0x0B89, 0x7538, 0x10C9, 0x753A, 0x0BCA, 0x753B, 0x0568,\n    0x753C, 0x164D, 0x7544, 0x164E, 0x7546, 0x1653, 0x7549, 0x1651,\n    0x754A, 0x1650, 0x754B, 0x13C7, 0x754C, 0x0584, 0x754D, 0x164F,\n    0x754E, 0x39FC, 0x754F, 0x049E, 0x7551, 0x0D3E, 0x7554, 0x0D5E,\n    0x7559, 0x0F79, 0x755A, 0x1654, 0x755B, 0x1652, 0x755C, 0x0B9A,\n    0x755D, 0x0A4A, 0x7560, 0x0D3F, 0x7562, 0x0D9F, 0x7564, 0x1656,\n    0x7565, 0x0F74, 0x7566, 0x0723, 0x7567, 0x1657, 0x7569, 0x1655,\n    0x756A, 0x0D6A, 0x756B, 0x1658, 0x756C, 0x3C3B, 0x756D, 0x1659,\n    0x756F, 0x2175, 0x7570, 0x049F, 0x7573, 0x09DE, 0x7574, 0x165E,\n    0x7575, 0x3751, 0x7576, 0x165B, 0x7577, 0x0CC5, 0x7578, 0x165A,\n    0x7579, 0x39FD, 0x757F, 0x0640, 0x7581, 0x39FE, 0x7582, 0x1661,\n    0x7586, 0x165C, 0x7587, 0x165D, 0x7589, 0x1660, 0x758A, 0x165F,\n    0x758B, 0x0D97, 0x758E, 0x0AC4, 0x758F, 0x0AC3, 0x7590, 0x39FF,\n    0x7591, 0x0659, 0x7592, 0x3A00, 0x7593, 0x3A01, 0x7594, 0x1662,\n    0x759A, 0x1663, 0x759D, 0x1664, 0x75A3, 0x1666, 0x75A5, 0x1665,\n    0x75AB, 0x04F8, 0x75B1, 0x166E, 0x75B2, 0x0D7C, 0x75B3, 0x1668,\n    0x75B4, 0x3A02, 0x75B5, 0x166A, 0x75B8, 0x166C, 0x75B9, 0x0A04,\n    0x75BC, 0x166D, 0x75BD, 0x166B, 0x75BE, 0x08EC, 0x75C2, 0x1667,\n    0x75C3, 0x1669, 0x75C5, 0x0DB4, 0x75C7, 0x09B1, 0x75CA, 0x1670,\n    0x75CD, 0x166F, 0x75D2, 0x1671, 0x75D4, 0x08D2, 0x75D5, 0x081F,\n    0x75D8, 0x0C71, 0x75D9, 0x1672, 0x75DB, 0x0BE7, 0x75DE, 0x1674,\n    0x75E2, 0x0F69, 0x75E3, 0x1673, 0x75E4, 0x3A03, 0x75E9, 0x0AEB,\n    0x75EC, 0x3752, 0x75F0, 0x1679, 0x75F2, 0x167B, 0x75F3, 0x167C,\n    0x75F4, 0x0B92, 0x75F9, 0x3A04, 0x75FA, 0x167A, 0x75FC, 0x1677,\n    0x75FE, 0x1675, 0x75FF, 0x1676, 0x7600, 0x3A05, 0x7601, 0x1678,\n    0x7609, 0x167F, 0x760A, 0x3A06, 0x760B, 0x167D, 0x760D, 0x167E,\n    0x7615, 0x3A07, 0x7616, 0x3A08, 0x7619, 0x3A09, 0x761E, 0x3A0A,\n    0x761F, 0x1680, 0x7620, 0x1682, 0x7621, 0x1683, 0x7622, 0x1684,\n    0x7624, 0x1685, 0x7626, 0x1E2D, 0x7627, 0x1681, 0x762D, 0x3A0B,\n    0x7630, 0x1687, 0x7634, 0x1686, 0x7635, 0x3A0C, 0x763B, 0x1688,\n    0x7642, 0x0F8D, 0x7643, 0x3A0D, 0x7646, 0x168B, 0x7647, 0x1689,\n    0x7648, 0x168A, 0x764B, 0x3A0E, 0x764C, 0x061E, 0x764E, 0x3753,\n    0x7652, 0x0F0A, 0x7656, 0x0E1A, 0x7658, 0x168D, 0x765C, 0x168C,\n    0x7661, 0x168E, 0x7662, 0x168F, 0x7665, 0x3A0F, 0x7667, 0x1693,\n    0x7668, 0x1690, 0x7669, 0x1691, 0x766A, 0x1692, 0x766C, 0x1694,\n    0x766D, 0x3A10, 0x766F, 0x3A11, 0x7670, 0x1695, 0x7671, 0x3A12,\n    0x7672, 0x1696, 0x7674, 0x3A13, 0x7676, 0x1697, 0x7678, 0x1698,\n    0x767A, 0x0D43, 0x767B, 0x0C4A, 0x767C, 0x1699, 0x767D, 0x0D28,\n    0x767E, 0x0DA6, 0x7680, 0x169A, 0x7682, 0x2176, 0x7683, 0x169B,\n    0x7684, 0x0C24, 0x7686, 0x0585, 0x7687, 0x07D6, 0x7688, 0x169C,\n    0x768B, 0x169D, 0x768E, 0x169E, 0x7690, 0x0877, 0x7693, 0x16A0,\n    0x7696, 0x169F, 0x7699, 0x16A1, 0x769A, 0x16A2, 0x769B, 0x2179,\n    0x769C, 0x2177, 0x769E, 0x2178, 0x76A4, 0x3A14, 0x76A5, 0x3A15,\n    0x76A6, 0x217A, 0x76AE, 0x0D7D, 0x76B0, 0x16A3, 0x76B4, 0x16A4,\n    0x76B7, 0x1D1C, 0x76B8, 0x16A5, 0x76B9, 0x16A6, 0x76BA, 0x16A7,\n    0x76BF, 0x087C, 0x76C2, 0x16A8, 0x76C3, 0x0D0C, 0x76C5, 0x3A16,\n    0x76C6, 0x0E8D, 0x76C8, 0x04F0, 0x76CA, 0x04F9, 0x76CC, 0x3A17,\n    0x76CD, 0x16A9, 0x76D2, 0x16AB, 0x76D6, 0x16AA, 0x76D7, 0x0C6A,\n    0x76DB, 0x0A5D, 0x76DC, 0x14D8, 0x76DE, 0x16AC, 0x76DF, 0x0ECD,\n    0x76E1, 0x16AD, 0x76E3, 0x0602, 0x76E4, 0x0D6B, 0x76E5, 0x16AE,\n    0x76E7, 0x16AF, 0x76EA, 0x16B0, 0x76EC, 0x3A18, 0x76EE, 0x0EE8,\n    0x76F2, 0x0EE1, 0x76F4, 0x0BDA, 0x76F8, 0x0AEC, 0x76FB, 0x16B2,\n    0x76FC, 0x3A19, 0x76FE, 0x096C, 0x7701, 0x09B2, 0x7704, 0x16B5,\n    0x7707, 0x16B4, 0x7708, 0x16B3, 0x7709, 0x0D91, 0x770B, 0x0603,\n    0x770C, 0x075D, 0x771B, 0x16BB, 0x771E, 0x16B8, 0x771F, 0x0A05,\n    0x7720, 0x0EBE, 0x7724, 0x16B7, 0x7725, 0x16B9, 0x7726, 0x16BA,\n    0x7729, 0x16B6, 0x7734, 0x3A1A, 0x7736, 0x3A1B, 0x7737, 0x16BC,\n    0x7738, 0x16BD, 0x773A, 0x0BCB, 0x773C, 0x061F, 0x7740, 0x0BA3,\n    0x7746, 0x217C, 0x7747, 0x16BE, 0x775A, 0x16BF, 0x775B, 0x16C2,\n    0x775C, 0x3A1C, 0x775F, 0x3A1D, 0x7760, 0x3A1E, 0x7761, 0x0A2D,\n    0x7762, 0x1EC5, 0x7763, 0x0C9C, 0x7765, 0x16C3, 0x7766, 0x0E81,\n    0x7768, 0x16C0, 0x776A, 0x3755, 0x776B, 0x16C1, 0x7772, 0x3A1F,\n    0x7779, 0x16C6, 0x777D, 0x3A20, 0x777E, 0x16C5, 0x777F, 0x16C4,\n    0x778B, 0x16C8, 0x778E, 0x16C7, 0x7791, 0x16C9, 0x7795, 0x3A21,\n    0x779E, 0x16CB, 0x77A0, 0x16CA, 0x77A5, 0x0E1D, 0x77A9, 0x3756,\n    0x77AA, 0x3A22, 0x77AC, 0x0960, 0x77AD, 0x0F8E, 0x77B0, 0x16CC,\n    0x77B3, 0x0C8F, 0x77B6, 0x16CD, 0x77B9, 0x16CE, 0x77BB, 0x16D2,\n    0x77BC, 0x16D0, 0x77BD, 0x16D1, 0x77BF, 0x16CF, 0x77C7, 0x16D3,\n    0x77CD, 0x16D4, 0x77D7, 0x16D5, 0x77DA, 0x16D6, 0x77DB, 0x0EC3,\n    0x77DC, 0x16D7, 0x77E2, 0x0EFC, 0x77E3, 0x16D8, 0x77E5, 0x0B8C,\n    0x77E6, 0x3A23, 0x77E7, 0x0D20, 0x77E9, 0x06E3, 0x77ED, 0x0B79,\n    0x77EE, 0x16D9, 0x77EF, 0x06B2, 0x77F0, 0x3A24, 0x77F3, 0x0A74,\n    0x77F4, 0x3A25, 0x77FC, 0x16DA, 0x7802, 0x082D, 0x7806, 0x3A26,\n    0x780C, 0x16DB, 0x7812, 0x16DC, 0x7814, 0x075A, 0x7815, 0x0845,\n    0x7820, 0x16DE, 0x7821, 0x217E, 0x7822, 0x3A27, 0x7825, 0x0C50,\n    0x7826, 0x0846, 0x7827, 0x0668, 0x782D, 0x3A28, 0x782E, 0x3A29,\n    0x7830, 0x3A2A, 0x7832, 0x0E52, 0x7834, 0x0D01, 0x7835, 0x3A2B,\n    0x783A, 0x0C51, 0x783F, 0x07EE, 0x7845, 0x16E0, 0x784E, 0x217F,\n    0x784F, 0x341E, 0x7851, 0x3C3C, 0x785D, 0x09B3, 0x7864, 0x2180,\n    0x7868, 0x3A2C, 0x786B, 0x0F7A, 0x786C, 0x07D7, 0x786F, 0x075B,\n    0x7872, 0x0D37, 0x7874, 0x16E2, 0x787A, 0x2181, 0x787C, 0x16E4,\n    0x7881, 0x079F, 0x7886, 0x16E3, 0x7887, 0x0C12, 0x788C, 0x16E6,\n    0x788D, 0x0595, 0x788E, 0x16E1, 0x7891, 0x0D7E, 0x7893, 0x04D2,\n    0x7895, 0x085C, 0x7897, 0x0FF8, 0x789A, 0x16E5, 0x789E, 0x3A2D,\n    0x78A3, 0x16E7, 0x78A7, 0x0E1B, 0x78A9, 0x0A7D, 0x78AA, 0x16E9,\n    0x78AF, 0x16EA, 0x78B5, 0x16E8, 0x78BA, 0x05AC, 0x78BC, 0x16F0,\n    0x78BE, 0x16EF, 0x78C1, 0x08D3, 0x78C5, 0x16F1, 0x78C6, 0x16EC,\n    0x78C8, 0x3A2E, 0x78CA, 0x16F2, 0x78CB, 0x16ED, 0x78CC, 0x3A2F,\n    0x78CE, 0x3A30, 0x78D0, 0x0D6C, 0x78D1, 0x16EB, 0x78D4, 0x16EE,\n    0x78DA, 0x16F5, 0x78E0, 0x3A32, 0x78E1, 0x3A33, 0x78E4, 0x3A31,\n    0x78E7, 0x16F4, 0x78E8, 0x0E8F, 0x78EC, 0x16F3, 0x78EF, 0x04AF,\n    0x78F2, 0x3A34, 0x78F4, 0x16F7, 0x78F7, 0x3A35, 0x78FB, 0x3A36,\n    0x78FD, 0x16F6, 0x7901, 0x09B4, 0x7907, 0x16F8, 0x790E, 0x0AC5,\n    0x7911, 0x16FA, 0x7912, 0x16F9, 0x7919, 0x16FB, 0x7926, 0x16DD,\n    0x792A, 0x16DF, 0x792B, 0x16FD, 0x792C, 0x16FC, 0x7930, 0x2182,\n    0x7931, 0x3A37, 0x7934, 0x3A38, 0x793A, 0x08D4, 0x793B, 0x3A39,\n    0x793C, 0x0FB1, 0x793D, 0x3A3A, 0x793E, 0x08FE, 0x7940, 0x16FE,\n    0x7941, 0x070D, 0x7945, 0x3A3B, 0x7947, 0x065A, 0x7948, 0x0641,\n    0x7949, 0x08B1, 0x7950, 0x0F1E, 0x7953, 0x1704, 0x7955, 0x1703,\n    0x7956, 0x0AC6, 0x7957, 0x1700, 0x795A, 0x1702, 0x795B, 0x3A3C,\n    0x795C, 0x3A3D, 0x795D, 0x0955, 0x795E, 0x0A06, 0x795F, 0x1701,\n    0x7960, 0x16FF, 0x7962, 0x0CE0, 0x7965, 0x09B5, 0x7968, 0x0DAE,\n    0x796D, 0x0847, 0x7977, 0x0C72, 0x797A, 0x1705, 0x797F, 0x1706,\n    0x7980, 0x171C, 0x7981, 0x06D0, 0x7984, 0x0FE3, 0x7985, 0x0AB7,\n    0x798A, 0x1707, 0x798B, 0x3A3E, 0x798D, 0x0552, 0x798E, 0x0C13,\n    0x798F, 0x0DF1, 0x7994, 0x2186, 0x7996, 0x3A3F, 0x7998, 0x3A40,\n    0x799B, 0x2188, 0x799D, 0x1708, 0x79A6, 0x0694, 0x79A7, 0x1709,\n    0x79AA, 0x170B, 0x79AE, 0x170C, 0x79B0, 0x0CDF, 0x79B1, 0x1E4E,\n    0x79B3, 0x170D, 0x79B8, 0x3A41, 0x79B9, 0x170E, 0x79BA, 0x170F,\n    0x79BB, 0x3A42, 0x79BD, 0x06D1, 0x79BE, 0x0553, 0x79BF, 0x0C9D,\n    0x79C0, 0x0932, 0x79C1, 0x08B2, 0x79C9, 0x1710, 0x79CA, 0x3A43,\n    0x79CB, 0x0933, 0x79D1, 0x054A, 0x79D2, 0x0DB5, 0x79D5, 0x1711,\n    0x79D8, 0x0D7F, 0x79DA, 0x3A44, 0x79DF, 0x0AC7, 0x79E1, 0x1714,\n    0x79E3, 0x1715, 0x79E4, 0x0D1F, 0x79E6, 0x0A07, 0x79E7, 0x1712,\n    0x79E9, 0x0B9F, 0x79EC, 0x1713, 0x79F0, 0x09B6, 0x79FB, 0x04A0,\n    0x7A00, 0x0643, 0x7A03, 0x3A45, 0x7A05, 0x3633, 0x7A08, 0x1716,\n    0x7A09, 0x3A46, 0x7A0B, 0x0C14, 0x7A0D, 0x1717, 0x7A0E, 0x0A6B,\n    0x7A11, 0x3A47, 0x7A14, 0x0EB9, 0x7A17, 0x0D95, 0x7A18, 0x1718,\n    0x7A19, 0x1719, 0x7A1A, 0x0B93, 0x7A1C, 0x0F8F, 0x7A1E, 0x3A48,\n    0x7A1F, 0x171B, 0x7A20, 0x171A, 0x7A2D, 0x3A49, 0x7A2E, 0x091B,\n    0x7A31, 0x171D, 0x7A32, 0x04B4, 0x7A37, 0x1720, 0x7A39, 0x3A4A,\n    0x7A3B, 0x171E, 0x7A3C, 0x0554, 0x7A3D, 0x0724, 0x7A3E, 0x171F,\n    0x7A3F, 0x07D8, 0x7A40, 0x0804, 0x7A42, 0x0E36, 0x7A43, 0x1721,\n    0x7A45, 0x3A4B, 0x7A46, 0x0E82, 0x7A49, 0x1723, 0x7A4C, 0x3A4C,\n    0x7A4D, 0x0A75, 0x7A4E, 0x04F1, 0x7A4F, 0x053A, 0x7A50, 0x0470,\n    0x7A57, 0x1722, 0x7A5D, 0x3A4D, 0x7A60, 0x3A4E, 0x7A61, 0x1724,\n    0x7A62, 0x1725, 0x7A63, 0x09DF, 0x7A69, 0x1726, 0x7A6B, 0x05AD,\n    0x7A6D, 0x3A4F, 0x7A70, 0x1728, 0x7A74, 0x0740, 0x7A76, 0x0680,\n    0x7A78, 0x3A50, 0x7A79, 0x1729, 0x7A7A, 0x06ED, 0x7A7D, 0x172A,\n    0x7A7F, 0x0AA0, 0x7A81, 0x0CA5, 0x7A83, 0x0A84, 0x7A84, 0x0865,\n    0x7A88, 0x172B, 0x7A92, 0x0BA0, 0x7A93, 0x0AED, 0x7A95, 0x172D,\n    0x7A96, 0x172F, 0x7A97, 0x172C, 0x7A98, 0x172E, 0x7A9F, 0x06F8,\n    0x7AA0, 0x3A51, 0x7AA3, 0x3A52, 0x7AA9, 0x1730, 0x7AAA, 0x06FC,\n    0x7AAE, 0x0681, 0x7AAF, 0x0F3C, 0x7AB0, 0x1732, 0x7AB3, 0x3A53,\n    0x7AB6, 0x1733, 0x7ABA, 0x04D0, 0x7ABB, 0x3A54, 0x7ABC, 0x3A55,\n    0x7ABF, 0x1736, 0x7AC3, 0x05D4, 0x7AC4, 0x1735, 0x7AC5, 0x1734,\n    0x7AC6, 0x3A56, 0x7AC7, 0x1738, 0x7AC8, 0x1731, 0x7ACA, 0x1739,\n    0x7ACB, 0x0F71, 0x7ACD, 0x173A, 0x7ACF, 0x173B, 0x7AD1, 0x2189,\n    0x7AD2, 0x11C5, 0x7AD3, 0x173D, 0x7AD5, 0x173C, 0x7AD9, 0x173E,\n    0x7ADA, 0x173F, 0x7ADC, 0x0F7D, 0x7ADD, 0x1740, 0x7ADF, 0x1C08,\n    0x7AE0, 0x09B7, 0x7AE1, 0x1741, 0x7AE2, 0x1742, 0x7AE3, 0x0961,\n    0x7AE5, 0x0C90, 0x7AE6, 0x1743, 0x7AE7, 0x218A, 0x7AEA, 0x0B66,\n    0x7AEB, 0x218C, 0x7AED, 0x1744, 0x7AEF, 0x0B7A, 0x7AF0, 0x1745,\n    0x7AF6, 0x069D, 0x7AF8, 0x1076, 0x7AF9, 0x0B9B, 0x7AFA, 0x08DF,\n    0x7AFF, 0x0604, 0x7B02, 0x1746, 0x7B04, 0x1753, 0x7B06, 0x1749,\n    0x7B07, 0x3A57, 0x7B08, 0x0682, 0x7B0A, 0x1748, 0x7B0B, 0x1755,\n    0x7B0F, 0x1747, 0x7B11, 0x09B8, 0x7B14, 0x3A58, 0x7B18, 0x174B,\n    0x7B19, 0x174C, 0x7B1B, 0x0C25, 0x7B1E, 0x174D, 0x7B20, 0x05BC,\n    0x7B25, 0x0A20, 0x7B26, 0x0DD6, 0x7B27, 0x3A59, 0x7B28, 0x174F,\n    0x7B2C, 0x0B48, 0x7B31, 0x3A5A, 0x7B33, 0x174A, 0x7B35, 0x174E,\n    0x7B36, 0x1750, 0x7B39, 0x086B, 0x7B45, 0x1757, 0x7B46, 0x0DA0,\n    0x7B47, 0x3A5B, 0x7B48, 0x0D3A, 0x7B49, 0x0C73, 0x7B4B, 0x06D2,\n    0x7B4C, 0x1756, 0x7B4D, 0x1754, 0x7B4E, 0x3A5C, 0x7B4F, 0x0D49,\n    0x7B50, 0x1751, 0x7B51, 0x0B9C, 0x7B52, 0x0C75, 0x7B53, 0x375D,\n    0x7B54, 0x0C74, 0x7B56, 0x0866, 0x7B5D, 0x1769, 0x7B60, 0x3A5D,\n    0x7B65, 0x1759, 0x7B67, 0x175B, 0x7B69, 0x3A5E, 0x7B6C, 0x175E,\n    0x7B6D, 0x3A5F, 0x7B6E, 0x175F, 0x7B70, 0x175C, 0x7B71, 0x175D,\n    0x7B72, 0x3A60, 0x7B74, 0x175A, 0x7B75, 0x1758, 0x7B7A, 0x1752,\n    0x7B86, 0x0E1F, 0x7B87, 0x0555, 0x7B8B, 0x1766, 0x7B8D, 0x1763,\n    0x7B8F, 0x1768, 0x7B91, 0x3A61, 0x7B92, 0x1767, 0x7B94, 0x0D29,\n    0x7B95, 0x0EB3, 0x7B97, 0x0889, 0x7B98, 0x1761, 0x7B99, 0x176A,\n    0x7B9A, 0x1765, 0x7B9C, 0x1764, 0x7B9D, 0x1760, 0x7B9E, 0x218D,\n    0x7B9F, 0x1762, 0x7BA1, 0x0605, 0x7BAA, 0x0B7B, 0x7BAD, 0x0AA1,\n    0x7BAF, 0x3A62, 0x7BB1, 0x0D36, 0x7BB4, 0x176F, 0x7BB8, 0x0D38,\n    0x7BC0, 0x0A85, 0x7BC1, 0x176C, 0x7BC4, 0x0D63, 0x7BC6, 0x1770,\n    0x7BC7, 0x0E23, 0x7BC9, 0x0B99, 0x7BCB, 0x176B, 0x7BCC, 0x176D,\n    0x7BCF, 0x176E, 0x7BD7, 0x3A63, 0x7BD9, 0x3A64, 0x7BDD, 0x1771,\n    0x7BE0, 0x08F0, 0x7BE4, 0x0C9E, 0x7BE5, 0x1776, 0x7BE6, 0x1775,\n    0x7BE9, 0x1772, 0x7BED, 0x0FDC, 0x7BF3, 0x177B, 0x7BF6, 0x177F,\n    0x7BF7, 0x177C, 0x7C00, 0x1778, 0x7C07, 0x1779, 0x7C0B, 0x3A65,\n    0x7C0D, 0x177E, 0x7C0F, 0x3A66, 0x7C11, 0x1773, 0x7C12, 0x10EA,\n    0x7C13, 0x177A, 0x7C14, 0x1774, 0x7C17, 0x177D, 0x7C1E, 0x1E3B,\n    0x7C1F, 0x1783, 0x7C20, 0x3A67, 0x7C21, 0x0606, 0x7C23, 0x1780,\n    0x7C26, 0x3A68, 0x7C27, 0x1781, 0x7C2A, 0x1782, 0x7C2B, 0x1785,\n    0x7C31, 0x3A69, 0x7C36, 0x3A6A, 0x7C37, 0x1784, 0x7C38, 0x0D8A,\n    0x7C3D, 0x1786, 0x7C3E, 0x0FC4, 0x7C3F, 0x0E3D, 0x7C40, 0x178B,\n    0x7C43, 0x1788, 0x7C4C, 0x1787, 0x7C4D, 0x0A76, 0x7C4F, 0x178A,\n    0x7C50, 0x178C, 0x7C51, 0x3A6B, 0x7C54, 0x1789, 0x7C56, 0x1790,\n    0x7C58, 0x178D, 0x7C59, 0x3A6C, 0x7C5F, 0x178E, 0x7C60, 0x1777,\n    0x7C64, 0x178F, 0x7C65, 0x1791, 0x7C67, 0x3A6D, 0x7C6C, 0x1792,\n    0x7C6E, 0x3A6E, 0x7C70, 0x3A6F, 0x7C73, 0x0E16, 0x7C75, 0x1793,\n    0x7C7B, 0x370E, 0x7C7E, 0x0EEE, 0x7C81, 0x06C6, 0x7C82, 0x06FF,\n    0x7C83, 0x1794, 0x7C89, 0x0E04, 0x7C8B, 0x0A2E, 0x7C8D, 0x0EBC,\n    0x7C90, 0x1795, 0x7C92, 0x0F7B, 0x7C95, 0x0D2A, 0x7C97, 0x0AC8,\n    0x7C98, 0x0CEA, 0x7C9B, 0x0957, 0x7C9F, 0x0484, 0x7CA1, 0x179A,\n    0x7CA2, 0x1798, 0x7CA4, 0x1796, 0x7CA5, 0x05DD, 0x7CA7, 0x09B9,\n    0x7CA8, 0x179B, 0x7CAB, 0x1799, 0x7CAD, 0x1797, 0x7CAE, 0x179F,\n    0x7CB1, 0x179E, 0x7CB2, 0x179D, 0x7CB3, 0x179C, 0x7CB9, 0x17A0,\n    0x7CBC, 0x3A70, 0x7CBD, 0x17A1, 0x7CBE, 0x0A5E, 0x7CBF, 0x3A71,\n    0x7CC0, 0x17A2, 0x7CC2, 0x17A4, 0x7CC5, 0x17A3, 0x7CC8, 0x3A72,\n    0x7CC9, 0x3A73, 0x7CCA, 0x0786, 0x7CCE, 0x0ABA, 0x7CD2, 0x17A6,\n    0x7CD6, 0x0C76, 0x7CD7, 0x3A74, 0x7CD8, 0x17A5, 0x7CD9, 0x3A75,\n    0x7CDC, 0x17A7, 0x7CDD, 0x3A76, 0x7CDE, 0x0E05, 0x7CDF, 0x0AEE,\n    0x7CE0, 0x07D9, 0x7CE2, 0x17A8, 0x7CE7, 0x0F90, 0x7CEB, 0x3A77,\n    0x7CEF, 0x17AA, 0x7CF2, 0x17AB, 0x7CF4, 0x17AC, 0x7CF6, 0x17AD,\n    0x7CF8, 0x08B3, 0x7CFA, 0x17AE, 0x7CFB, 0x0725, 0x7CFE, 0x0684,\n    0x7D00, 0x0644, 0x7D02, 0x17B0, 0x7D04, 0x0EFF, 0x7D05, 0x07DA,\n    0x7D06, 0x17AF, 0x7D07, 0x3A78, 0x7D08, 0x3A79, 0x7D09, 0x3A7A,\n    0x7D0A, 0x17B3, 0x7D0B, 0x0EF2, 0x7D0D, 0x0CF2, 0x7D10, 0x0DA5,\n    0x7D13, 0x3A7B, 0x7D14, 0x096D, 0x7D15, 0x17B2, 0x7D17, 0x08FF,\n    0x7D18, 0x07DB, 0x7D19, 0x08B4, 0x7D1A, 0x0683, 0x7D1B, 0x0E06,\n    0x7D1C, 0x17B1, 0x7D1D, 0x3A7C, 0x7D20, 0x0AC9, 0x7D21, 0x0E70,\n    0x7D22, 0x0867, 0x7D23, 0x3A7D, 0x7D2B, 0x08B5, 0x7D2C, 0x0BF9,\n    0x7D2E, 0x17B6, 0x7D2F, 0x0FA7, 0x7D30, 0x0849, 0x7D32, 0x17B7,\n    0x7D33, 0x0A08, 0x7D35, 0x17B9, 0x7D39, 0x09BA, 0x7D3A, 0x0820,\n    0x7D3F, 0x17B8, 0x7D41, 0x3A7E, 0x7D42, 0x0934, 0x7D43, 0x0772,\n    0x7D44, 0x0ACA, 0x7D45, 0x17B4, 0x7D46, 0x17BA, 0x7D48, 0x218F,\n    0x7D4B, 0x17B5, 0x7D4C, 0x0726, 0x7D4E, 0x17BD, 0x7D4F, 0x17C1,\n    0x7D50, 0x0741, 0x7D53, 0x3A7F, 0x7D56, 0x17BC, 0x7D59, 0x3A80,\n    0x7D5B, 0x17C5, 0x7D5C, 0x2190, 0x7D5D, 0x3A81, 0x7D5E, 0x07DC,\n    0x7D61, 0x0F57, 0x7D62, 0x0480, 0x7D63, 0x17C2, 0x7D66, 0x0685,\n    0x7D68, 0x17BF, 0x7D6E, 0x17C0, 0x7D71, 0x0C77, 0x7D72, 0x17BE,\n    0x7D73, 0x17BB, 0x7D75, 0x0586, 0x7D76, 0x0A88, 0x7D79, 0x075C,\n    0x7D7A, 0x3A82, 0x7D7D, 0x17C7, 0x7D86, 0x3A83, 0x7D89, 0x17C4,\n    0x7D8B, 0x3A84, 0x7D8C, 0x3A85, 0x7D8F, 0x17C6, 0x7D93, 0x17C3,\n    0x7D99, 0x0727, 0x7D9A, 0x0B13, 0x7D9B, 0x17C8, 0x7D9C, 0x0AF0,\n    0x7D9F, 0x17D5, 0x7DA0, 0x2192, 0x7DA2, 0x17D1, 0x7DA3, 0x17CB,\n    0x7DAB, 0x17CF, 0x7DAC, 0x0926, 0x7DAD, 0x04A1, 0x7DAE, 0x17CA,\n    0x7DAF, 0x17D2, 0x7DB0, 0x17D6, 0x7DB1, 0x07DD, 0x7DB2, 0x0EE2,\n    0x7DB4, 0x0BF2, 0x7DB5, 0x17CC, 0x7DB7, 0x2191, 0x7DB8, 0x17D4,\n    0x7DBA, 0x17C9, 0x7DBB, 0x0B7C, 0x7DBD, 0x17CE, 0x7DBE, 0x0481,\n    0x7DBF, 0x0ED6, 0x7DC7, 0x17CD, 0x7DCA, 0x06D3, 0x7DCB, 0x0D80,\n    0x7DCC, 0x3A86, 0x7DCF, 0x0AEF, 0x7DD1, 0x0F98, 0x7DD2, 0x0979,\n    0x7DD5, 0x17FD, 0x7DD6, 0x2193, 0x7DD8, 0x17D7, 0x7DDA, 0x0AA2,\n    0x7DDC, 0x17D3, 0x7DDD, 0x17D8, 0x7DDE, 0x17DA, 0x7DE0, 0x0C15,\n    0x7DE1, 0x17DD, 0x7DE3, 0x340A, 0x7DE4, 0x17D9, 0x7DE8, 0x0E24,\n    0x7DE9, 0x0607, 0x7DEB, 0x3A87, 0x7DEC, 0x0ED7, 0x7DEF, 0x04A2,\n    0x7DF1, 0x3A88, 0x7DF2, 0x17DC, 0x7DF4, 0x0FC5, 0x7DF9, 0x3A89,\n    0x7DFB, 0x17DB, 0x7E01, 0x0511, 0x7E04, 0x0CC4, 0x7E05, 0x17DE,\n    0x7E08, 0x3A8A, 0x7E09, 0x17E5, 0x7E0A, 0x17DF, 0x7E0B, 0x17E6,\n    0x7E11, 0x3A8B, 0x7E12, 0x17E2, 0x7E15, 0x3A8C, 0x7E1B, 0x0D31,\n    0x7E1E, 0x08F6, 0x7E1F, 0x17E4, 0x7E20, 0x3A8D, 0x7E21, 0x17E1,\n    0x7E22, 0x17E7, 0x7E23, 0x17E0, 0x7E26, 0x094E, 0x7E2B, 0x0E53,\n    0x7E2E, 0x0956, 0x7E31, 0x17E3, 0x7E32, 0x17EF, 0x7E35, 0x17EB,\n    0x7E37, 0x17EE, 0x7E39, 0x17EC, 0x7E3A, 0x17F0, 0x7E3B, 0x17EA,\n    0x7E3D, 0x17D0, 0x7E3E, 0x0A77, 0x7E41, 0x0D5F, 0x7E43, 0x17ED,\n    0x7E46, 0x17E8, 0x7E47, 0x3A8E, 0x7E48, 0x3767, 0x7E4A, 0x0AA3,\n    0x7E4B, 0x0728, 0x7E4D, 0x0935, 0x7E52, 0x2194, 0x7E54, 0x09EB,\n    0x7E55, 0x0AB8, 0x7E56, 0x17F3, 0x7E59, 0x17F5, 0x7E5A, 0x17F6,\n    0x7E5D, 0x17F2, 0x7E5E, 0x17F4, 0x7E61, 0x1E11, 0x7E62, 0x3A8F,\n    0x7E66, 0x17E9, 0x7E67, 0x17F1, 0x7E69, 0x17F9, 0x7E6A, 0x17F8,\n    0x7E6B, 0x1DF7, 0x7E6D, 0x0EA8, 0x7E6E, 0x3A90, 0x7E70, 0x0701,\n    0x7E73, 0x3A91, 0x7E79, 0x17F7, 0x7E7B, 0x17FB, 0x7E7C, 0x17FA,\n    0x7E7D, 0x17FE, 0x7E7F, 0x1800, 0x7E82, 0x088A, 0x7E83, 0x17FC,\n    0x7E88, 0x1801, 0x7E89, 0x1802, 0x7E8A, 0x20A7, 0x7E8C, 0x1803,\n    0x7E8D, 0x3A92, 0x7E8E, 0x1809, 0x7E8F, 0x0C35, 0x7E90, 0x1805,\n    0x7E91, 0x3A93, 0x7E92, 0x1804, 0x7E93, 0x1806, 0x7E94, 0x1807,\n    0x7E96, 0x1808, 0x7E98, 0x3A94, 0x7E9B, 0x180A, 0x7E9C, 0x180B,\n    0x7F36, 0x0608, 0x7F38, 0x180C, 0x7F3A, 0x180D, 0x7F44, 0x3A95,\n    0x7F45, 0x180E, 0x7F47, 0x2195, 0x7F4C, 0x180F, 0x7F4D, 0x1810,\n    0x7F4E, 0x1811, 0x7F4F, 0x3A96, 0x7F50, 0x1812, 0x7F51, 0x1813,\n    0x7F52, 0x3A97, 0x7F53, 0x3A98, 0x7F54, 0x1815, 0x7F55, 0x1814,\n    0x7F58, 0x1816, 0x7F5F, 0x1817, 0x7F60, 0x1818, 0x7F61, 0x3A99,\n    0x7F67, 0x181B, 0x7F68, 0x1819, 0x7F69, 0x181A, 0x7F6A, 0x0851,\n    0x7F6B, 0x0729, 0x7F6E, 0x0B94, 0x7F70, 0x0D47, 0x7F72, 0x097A,\n    0x7F75, 0x0D03, 0x7F77, 0x0D81, 0x7F78, 0x181C, 0x7F79, 0x1336,\n    0x7F82, 0x181D, 0x7F83, 0x181F, 0x7F85, 0x0F4F, 0x7F86, 0x181E,\n    0x7F87, 0x1821, 0x7F88, 0x1820, 0x7F8A, 0x0F3D, 0x7F8C, 0x1822,\n    0x7F8E, 0x0D92, 0x7F91, 0x3A9A, 0x7F94, 0x1823, 0x7F9A, 0x1826,\n    0x7F9D, 0x1825, 0x7F9E, 0x1824, 0x7FA1, 0x2196, 0x7FA3, 0x1827,\n    0x7FA4, 0x0708, 0x7FA8, 0x0AA4, 0x7FA9, 0x065B, 0x7FAE, 0x182B,\n    0x7FAF, 0x1828, 0x7FB2, 0x1829, 0x7FB6, 0x182C, 0x7FB8, 0x182D,\n    0x7FB9, 0x182A, 0x7FBD, 0x04CB, 0x7FBF, 0x3A9B, 0x7FC1, 0x0527,\n    0x7FC5, 0x182F, 0x7FC6, 0x1830, 0x7FCA, 0x1831, 0x7FCC, 0x0F4C,\n    0x7FCE, 0x3A9C, 0x7FD2, 0x0936, 0x7FD4, 0x1833, 0x7FD5, 0x1832,\n    0x7FDF, 0x3A9D, 0x7FE0, 0x0A2F, 0x7FE1, 0x1834, 0x7FE5, 0x3A9E,\n    0x7FE6, 0x1835, 0x7FE9, 0x1836, 0x7FEB, 0x0621, 0x7FEC, 0x3A9F,\n    0x7FEE, 0x3AA0, 0x7FEF, 0x3AA1, 0x7FF0, 0x0609, 0x7FF3, 0x1837,\n    0x7FF9, 0x1838, 0x7FFA, 0x3AA2, 0x7FFB, 0x0E8B, 0x7FFC, 0x0F4D,\n    0x8000, 0x0F3E, 0x8001, 0x0FDD, 0x8002, 0x3713, 0x8003, 0x07DF,\n    0x8004, 0x183B, 0x8005, 0x0900, 0x8006, 0x183A, 0x800B, 0x183C,\n    0x800C, 0x08D5, 0x800E, 0x3AA3, 0x8010, 0x0B31, 0x8011, 0x3AA4,\n    0x8012, 0x183D, 0x8014, 0x3AA5, 0x8015, 0x07DE, 0x8017, 0x0EE3,\n    0x8018, 0x183E, 0x8019, 0x183F, 0x801C, 0x1840, 0x8021, 0x1841,\n    0x8024, 0x3AA6, 0x8026, 0x3AA7, 0x8028, 0x1842, 0x8033, 0x08D6,\n    0x8036, 0x0EF9, 0x803A, 0x3AA8, 0x803B, 0x1844, 0x803C, 0x3AA9,\n    0x803D, 0x0B7D, 0x803F, 0x1843, 0x8046, 0x1846, 0x804A, 0x1845,\n    0x8052, 0x1847, 0x8056, 0x0A5F, 0x8058, 0x1848, 0x805A, 0x1849,\n    0x805E, 0x0E09, 0x805F, 0x184A, 0x8060, 0x3AAA, 0x8061, 0x0AF1,\n    0x8062, 0x184B, 0x8068, 0x184C, 0x806F, 0x0FC6, 0x8070, 0x184F,\n    0x8071, 0x3AAB, 0x8072, 0x184E, 0x8073, 0x184D, 0x8074, 0x0BCC,\n    0x8075, 0x3AAC, 0x8076, 0x1850, 0x8077, 0x09EC, 0x8079, 0x1851,\n    0x807D, 0x1852, 0x807E, 0x0FDE, 0x807F, 0x1853, 0x8084, 0x1854,\n    0x8085, 0x1856, 0x8086, 0x1855, 0x8087, 0x0D39, 0x8089, 0x0CD1,\n    0x808B, 0x0FE4, 0x808C, 0x0D3D, 0x8093, 0x1858, 0x8096, 0x09BB,\n    0x8098, 0x0D9C, 0x809A, 0x1859, 0x809B, 0x1857, 0x809D, 0x060A,\n    0x809E, 0x3AAD, 0x80A1, 0x0788, 0x80A2, 0x08B6, 0x80A5, 0x0D82,\n    0x80A6, 0x3AAE, 0x80A9, 0x075E, 0x80AA, 0x0E71, 0x80AB, 0x3AAF,\n    0x80AC, 0x185C, 0x80AD, 0x185A, 0x80AF, 0x07E0, 0x80B1, 0x07E1,\n    0x80B2, 0x04AD, 0x80B4, 0x0858, 0x80BA, 0x0D0F, 0x80C3, 0x04A3,\n    0x80C4, 0x1861, 0x80C6, 0x0B7E, 0x80CC, 0x0D0E, 0x80CE, 0x0B3B,\n    0x80D6, 0x1863, 0x80D7, 0x3AB0, 0x80D8, 0x3AB1, 0x80D9, 0x185F,\n    0x80DA, 0x1862, 0x80DB, 0x185D, 0x80DD, 0x1860, 0x80DE, 0x0E54,\n    0x80E1, 0x0789, 0x80E4, 0x04C1, 0x80E5, 0x185E, 0x80EF, 0x1865,\n    0x80F1, 0x1866, 0x80F4, 0x0C91, 0x80F8, 0x06B3, 0x80FC, 0x1871,\n    0x80FD, 0x0CF3, 0x8102, 0x08B7, 0x8105, 0x06B4, 0x8106, 0x0A6C,\n    0x8107, 0x0FEC, 0x8108, 0x0EBA, 0x8109, 0x1864, 0x810A, 0x0A78,\n    0x8116, 0x3AB2, 0x8118, 0x3AB3, 0x811A, 0x066D, 0x811B, 0x1867,\n    0x8123, 0x1869, 0x8129, 0x1868, 0x812B, 0x3659, 0x812F, 0x186A,\n    0x8131, 0x0B64, 0x8133, 0x0CF4, 0x8139, 0x0BCD, 0x813A, 0x3AB4,\n    0x813E, 0x186E, 0x8141, 0x3772, 0x8146, 0x186D, 0x814A, 0x3AB5,\n    0x814B, 0x186B, 0x814C, 0x3AB6, 0x814E, 0x0A1B, 0x8150, 0x0DD7,\n    0x8151, 0x1870, 0x8153, 0x186F, 0x8154, 0x07E2, 0x8155, 0x0FF9,\n    0x815F, 0x1880, 0x8165, 0x1874, 0x8166, 0x1875, 0x816B, 0x091C,\n    0x816E, 0x1873, 0x8170, 0x080A, 0x8171, 0x1872, 0x8174, 0x1876,\n    0x8178, 0x0BCE, 0x8179, 0x0DF2, 0x817A, 0x0AA5, 0x817F, 0x0B3C,\n    0x8180, 0x187A, 0x8181, 0x3AB7, 0x8182, 0x187B, 0x8183, 0x1877,\n    0x8184, 0x3AB8, 0x8188, 0x1878, 0x818A, 0x1879, 0x818F, 0x07E3,\n    0x8193, 0x1881, 0x8195, 0x187D, 0x819A, 0x0DD8, 0x819C, 0x0E9A,\n    0x819D, 0x0D9A, 0x81A0, 0x187C, 0x81A3, 0x187F, 0x81A4, 0x187E,\n    0x81A8, 0x0E72, 0x81A9, 0x1882, 0x81B0, 0x1883, 0x81B3, 0x0AB9,\n    0x81B4, 0x3AB9, 0x81B5, 0x1884, 0x81B8, 0x1886, 0x81BA, 0x188A,\n    0x81BD, 0x1887, 0x81BE, 0x1885, 0x81BF, 0x0CF5, 0x81C0, 0x1888,\n    0x81C2, 0x1889, 0x81C6, 0x0532, 0x81C8, 0x1890, 0x81C9, 0x188B,\n    0x81CD, 0x188C, 0x81CF, 0x3ABA, 0x81D1, 0x188D, 0x81D3, 0x0B01,\n    0x81D8, 0x188F, 0x81D9, 0x188E, 0x81DA, 0x1891, 0x81DF, 0x1892,\n    0x81E0, 0x1893, 0x81E3, 0x0A09, 0x81E5, 0x0569, 0x81E7, 0x1894,\n    0x81E8, 0x0F9F, 0x81EA, 0x08D7, 0x81ED, 0x0937, 0x81F3, 0x08B8,\n    0x81F4, 0x0B95, 0x81F9, 0x3ABB, 0x81FA, 0x1895, 0x81FB, 0x1896,\n    0x81FC, 0x04D3, 0x81FE, 0x1897, 0x8201, 0x1898, 0x8202, 0x1899,\n    0x8203, 0x3ABC, 0x8205, 0x189A, 0x8207, 0x189B, 0x8208, 0x06B5,\n    0x8209, 0x13AF, 0x820A, 0x189C, 0x820C, 0x0A89, 0x820D, 0x189D,\n    0x820E, 0x08F7, 0x8210, 0x189E, 0x8212, 0x1009, 0x8216, 0x189F,\n    0x8217, 0x0E2E, 0x8218, 0x0618, 0x821B, 0x0AA6, 0x821C, 0x0962,\n    0x821E, 0x0DE3, 0x821F, 0x0938, 0x8221, 0x3ABD, 0x8229, 0x18A0,\n    0x822A, 0x07E4, 0x822B, 0x18A1, 0x822C, 0x0D60, 0x822E, 0x18AF,\n    0x8232, 0x3ABE, 0x8233, 0x18A3, 0x8234, 0x3ABF, 0x8235, 0x0B29,\n    0x8236, 0x0D2B, 0x8237, 0x0773, 0x8238, 0x18A2, 0x8239, 0x0AA7,\n    0x8240, 0x18A4, 0x8246, 0x3AC0, 0x8247, 0x0C16, 0x824B, 0x3AC1,\n    0x824F, 0x3AC2, 0x8258, 0x18A6, 0x8259, 0x18A5, 0x825A, 0x18A8,\n    0x825D, 0x18A7, 0x825F, 0x18A9, 0x8262, 0x18AB, 0x8264, 0x18AA,\n    0x8266, 0x060B, 0x8268, 0x18AC, 0x826A, 0x18AD, 0x826B, 0x18AE,\n    0x826E, 0x0821, 0x826F, 0x0F91, 0x8271, 0x18B0, 0x8272, 0x09ED,\n    0x8276, 0x0512, 0x8277, 0x18B1, 0x8278, 0x18B2, 0x8279, 0x3775,\n    0x827E, 0x18B3, 0x828B, 0x04B6, 0x828D, 0x18B4, 0x828E, 0x3AC3,\n    0x8292, 0x18B5, 0x8299, 0x0DD9, 0x829D, 0x08F3, 0x829F, 0x18B7,\n    0x82A5, 0x0587, 0x82A6, 0x0476, 0x82AB, 0x18B6, 0x82AC, 0x18B9,\n    0x82AD, 0x0D04, 0x82AE, 0x3AC4, 0x82AF, 0x0A0A, 0x82B1, 0x0556,\n    0x82B3, 0x0E55, 0x82B7, 0x3AC5, 0x82B8, 0x0733, 0x82B9, 0x06D4,\n    0x82BB, 0x18B8, 0x82BD, 0x056A, 0x82BE, 0x3AC6, 0x82C5, 0x05DF,\n    0x82C6, 0x3AC7, 0x82D1, 0x0513, 0x82D2, 0x18BD, 0x82D3, 0x0FB2,\n    0x82D4, 0x0B3D, 0x82D7, 0x0DB6, 0x82D9, 0x18C9, 0x82DB, 0x0557,\n    0x82DC, 0x18C7, 0x82DE, 0x18C5, 0x82DF, 0x18BC, 0x82E1, 0x18BA,\n    0x82E3, 0x18BB, 0x82E5, 0x090F, 0x82E6, 0x06E4, 0x82E7, 0x0BB5,\n    0x82EB, 0x0CA9, 0x82F1, 0x04F3, 0x82F3, 0x18BF, 0x82F4, 0x18BE,\n    0x82F9, 0x18C4, 0x82FA, 0x18C0, 0x82FB, 0x18C3, 0x82FE, 0x3AC8,\n    0x8301, 0x2198, 0x8302, 0x0EDC, 0x8303, 0x18C2, 0x8304, 0x0558,\n    0x8305, 0x05DB, 0x8306, 0x18C6, 0x8309, 0x18C8, 0x830E, 0x072A,\n    0x8316, 0x18CC, 0x8317, 0x18D5, 0x8318, 0x18D6, 0x831C, 0x046F,\n    0x8323, 0x18DD, 0x8328, 0x04B5, 0x832B, 0x18D4, 0x832F, 0x18D3,\n    0x8331, 0x18CE, 0x8332, 0x18CD, 0x8334, 0x18CB, 0x8335, 0x18CA,\n    0x8336, 0x0BA1, 0x8338, 0x0B5B, 0x8339, 0x18D0, 0x8340, 0x18CF,\n    0x8343, 0x3AC9, 0x8345, 0x18D2, 0x8349, 0x0AF2, 0x834A, 0x072B,\n    0x834F, 0x04E3, 0x8350, 0x18D1, 0x8351, 0x3ACA, 0x8352, 0x07E5,\n    0x8355, 0x3ACB, 0x8358, 0x0AF3, 0x8362, 0x2199, 0x8373, 0x18E3,\n    0x8375, 0x18E4, 0x8377, 0x0559, 0x837B, 0x052E, 0x837C, 0x18E1,\n    0x837F, 0x219A, 0x8385, 0x18D7, 0x8386, 0x3ACC, 0x8387, 0x18DF,\n    0x8389, 0x18E6, 0x838A, 0x18E0, 0x838D, 0x3ACD, 0x838E, 0x18DE,\n    0x8392, 0x3ACE, 0x8393, 0x18C1, 0x8396, 0x18DC, 0x8398, 0x3ACF,\n    0x839A, 0x18D8, 0x839E, 0x060C, 0x839F, 0x18DA, 0x83A0, 0x18E5,\n    0x83A2, 0x18DB, 0x83A8, 0x18E7, 0x83A9, 0x3AD0, 0x83AA, 0x18D9,\n    0x83AB, 0x0D32, 0x83B1, 0x0F53, 0x83B5, 0x18E2, 0x83BD, 0x18F8,\n    0x83BF, 0x3AD1, 0x83C0, 0x3AD2, 0x83C1, 0x18F0, 0x83C5, 0x0A41,\n    0x83C7, 0x219B, 0x83CA, 0x0660, 0x83CC, 0x06D5, 0x83CE, 0x18EB,\n    0x83D3, 0x055B, 0x83D6, 0x09BC, 0x83D8, 0x18EE, 0x83DC, 0x084A,\n    0x83DF, 0x0C4B, 0x83E0, 0x18F3, 0x83E9, 0x0E3E, 0x83EA, 0x3AD3,\n    0x83EB, 0x18EA, 0x83EF, 0x055A, 0x83F0, 0x078A, 0x83F1, 0x0D9B,\n    0x83F2, 0x18F4, 0x83F4, 0x18E8, 0x83F6, 0x219C, 0x83F7, 0x18F1,\n    0x83FB, 0x18FB, 0x83FD, 0x18EC, 0x8403, 0x18ED, 0x8404, 0x0C92,\n    0x8407, 0x18F2, 0x840A, 0x1E7F, 0x840B, 0x18EF, 0x840C, 0x0E56,\n    0x840D, 0x18F5, 0x840E, 0x04A4, 0x840F, 0x3AD4, 0x8411, 0x3AD5,\n    0x8413, 0x18E9, 0x8420, 0x18F7, 0x8422, 0x18F6, 0x8429, 0x0D21,\n    0x842A, 0x18FD, 0x842C, 0x1908, 0x8431, 0x05DC, 0x8435, 0x190B,\n    0x8438, 0x18F9, 0x843C, 0x18FE, 0x843D, 0x0F58, 0x8446, 0x1907,\n    0x8448, 0x219D, 0x8449, 0x0F3F, 0x844A, 0x3AD6, 0x844E, 0x0F72,\n    0x8457, 0x0BB6, 0x845B, 0x05C9, 0x8461, 0x0DE4, 0x8462, 0x190D,\n    0x8463, 0x0C79, 0x8466, 0x0475, 0x8469, 0x1906, 0x846B, 0x1902,\n    0x846C, 0x0AF4, 0x846D, 0x18FC, 0x846E, 0x1904, 0x846F, 0x1909,\n    0x8471, 0x0CE2, 0x8475, 0x046E, 0x8476, 0x3AD7, 0x8477, 0x1901,\n    0x8479, 0x190A, 0x847A, 0x0DEA, 0x8482, 0x1905, 0x8484, 0x1900,\n    0x848B, 0x09BD, 0x8490, 0x0939, 0x8494, 0x08D8, 0x8499, 0x0EE4,\n    0x849C, 0x0DB9, 0x849F, 0x1910, 0x84A1, 0x1919, 0x84A8, 0x3AD8,\n    0x84AD, 0x1903, 0x84AF, 0x3AD9, 0x84B2, 0x05D5, 0x84B4, 0x219E,\n    0x84B8, 0x09E0, 0x84B9, 0x190E, 0x84BB, 0x1913, 0x84BC, 0x0AF5,\n    0x84BF, 0x190F, 0x84C0, 0x3ADA, 0x84C1, 0x1916, 0x84C2, 0x3ADB,\n    0x84C4, 0x0B9D, 0x84C6, 0x1917, 0x84C9, 0x0F40, 0x84CA, 0x190C,\n    0x84CB, 0x0596, 0x84CD, 0x1912, 0x84D0, 0x1915, 0x84D1, 0x0EB8,\n    0x84D6, 0x1918, 0x84D9, 0x1911, 0x84DA, 0x1914, 0x84DC, 0x20AB,\n    0x84EC, 0x0E57, 0x84EE, 0x0FC7, 0x84F0, 0x3ADC, 0x84F4, 0x191C,\n    0x84FC, 0x1923, 0x84FD, 0x3ADD, 0x84FF, 0x191B, 0x8500, 0x08EF,\n    0x8506, 0x18FA, 0x850C, 0x3ADE, 0x8511, 0x0E1E, 0x8513, 0x0EAE,\n    0x8514, 0x1922, 0x8515, 0x1921, 0x8517, 0x191D, 0x8518, 0x191E,\n    0x851A, 0x04D8, 0x851F, 0x1920, 0x8521, 0x191A, 0x8523, 0x1E1A,\n    0x8526, 0x0BF1, 0x852C, 0x191F, 0x852D, 0x04C2, 0x8534, 0x3ADF,\n    0x8535, 0x0B02, 0x853D, 0x0E13, 0x853E, 0x1EB5, 0x8540, 0x1924,\n    0x8541, 0x1928, 0x8543, 0x0D6D, 0x8548, 0x1927, 0x8549, 0x09BE,\n    0x854A, 0x08F5, 0x854B, 0x192A, 0x854E, 0x06B6, 0x8553, 0x219F,\n    0x8555, 0x192B, 0x8557, 0x0DEB, 0x8558, 0x1926, 0x8559, 0x21A0,\n    0x855A, 0x18FF, 0x855E, 0x3AE0, 0x8563, 0x1925, 0x8568, 0x0FF5,\n    0x8569, 0x0C7A, 0x856A, 0x0DE5, 0x856B, 0x21A1, 0x856D, 0x1932,\n    0x8577, 0x1938, 0x857E, 0x1939, 0x8580, 0x192C, 0x8584, 0x0D2C,\n    0x8587, 0x1936, 0x8588, 0x192E, 0x858A, 0x1930, 0x858F, 0x3AE1,\n    0x8590, 0x193A, 0x8591, 0x192F, 0x8594, 0x1933, 0x8597, 0x0514,\n    0x8599, 0x0CBD, 0x859B, 0x1934, 0x859C, 0x1937, 0x85A4, 0x192D,\n    0x85A6, 0x0AA8, 0x85A8, 0x1931, 0x85A9, 0x0875, 0x85AA, 0x0A0B,\n    0x85AB, 0x0706, 0x85AC, 0x0F00, 0x85AD, 0x3AE4, 0x85AE, 0x0F05,\n    0x85AF, 0x097C, 0x85B0, 0x21A3, 0x85B7, 0x3AE2, 0x85B9, 0x193E,\n    0x85BA, 0x193C, 0x85C1, 0x0FF4, 0x85C9, 0x193B, 0x85CD, 0x0F5F,\n    0x85CE, 0x3AE3, 0x85CF, 0x193D, 0x85D0, 0x193F, 0x85D5, 0x1940,\n    0x85DC, 0x1943, 0x85DD, 0x1941, 0x85E4, 0x0C7B, 0x85E5, 0x1942,\n    0x85E9, 0x0D61, 0x85EA, 0x1935, 0x85F4, 0x3780, 0x85F7, 0x097D,\n    0x85F9, 0x1944, 0x85FA, 0x1949, 0x85FB, 0x0AF6, 0x85FE, 0x1948,\n    0x8602, 0x1929, 0x8606, 0x194A, 0x8607, 0x0ACB, 0x860A, 0x1945,\n    0x860B, 0x1947, 0x8612, 0x3AE5, 0x8613, 0x1946, 0x8616, 0x14D0,\n    0x8617, 0x14C1, 0x861A, 0x194C, 0x8622, 0x194B, 0x8629, 0x3AE6,\n    0x862D, 0x0F60, 0x862F, 0x16B1, 0x8630, 0x194D, 0x863F, 0x194E,\n    0x864D, 0x194F, 0x864E, 0x078B, 0x8650, 0x066E, 0x8652, 0x3AE7,\n    0x8654, 0x1951, 0x8655, 0x1094, 0x865A, 0x068F, 0x865B, 0x3418,\n    0x865C, 0x0F82, 0x865E, 0x06EB, 0x865F, 0x1952, 0x8663, 0x3AE8,\n    0x8667, 0x1953, 0x866B, 0x0BAC, 0x866C, 0x3AE9, 0x866F, 0x3AEA,\n    0x8671, 0x1954, 0x8679, 0x0CD2, 0x867A, 0x3AEB, 0x867B, 0x047E,\n    0x867D, 0x3786, 0x868A, 0x0563, 0x868B, 0x1959, 0x868C, 0x195A,\n    0x868D, 0x3AEC, 0x8691, 0x3AED, 0x8693, 0x1955, 0x8695, 0x088B,\n    0x8698, 0x3AEE, 0x86A3, 0x1956, 0x86A4, 0x0CF8, 0x86A7, 0x3AEF,\n    0x86A8, 0x3AF0, 0x86A9, 0x1957, 0x86AA, 0x1958, 0x86AB, 0x1962,\n    0x86AF, 0x195C, 0x86B0, 0x195F, 0x86B6, 0x195B, 0x86C4, 0x195D,\n    0x86C6, 0x195E, 0x86C7, 0x0904, 0x86C9, 0x1960, 0x86CB, 0x0B7F,\n    0x86CD, 0x072C, 0x86CE, 0x05A0, 0x86D4, 0x1963, 0x86D9, 0x059D,\n    0x86DB, 0x1968, 0x86DE, 0x1964, 0x86DF, 0x1967, 0x86E4, 0x0D4E,\n    0x86E9, 0x1965, 0x86EC, 0x1966, 0x86ED, 0x0DBA, 0x86EE, 0x0D6E,\n    0x86EF, 0x1969, 0x86F8, 0x0B5D, 0x86F9, 0x1973, 0x86FA, 0x3AF1,\n    0x86FB, 0x196F, 0x86FD, 0x3AF2, 0x86FE, 0x056B, 0x8700, 0x196D,\n    0x8702, 0x0E58, 0x8703, 0x196E, 0x8706, 0x196B, 0x8708, 0x196C,\n    0x8709, 0x1971, 0x870A, 0x1974, 0x870B, 0x3AF3, 0x870D, 0x1972,\n    0x8711, 0x1970, 0x8712, 0x196A, 0x8713, 0x3AF4, 0x8718, 0x0B96,\n    0x8719, 0x3AF5, 0x871A, 0x197B, 0x871C, 0x0EB6, 0x871E, 0x3AF6,\n    0x8725, 0x1979, 0x8728, 0x3AF7, 0x8729, 0x197A, 0x8734, 0x1975,\n    0x8737, 0x1977, 0x873B, 0x1978, 0x873E, 0x3AF8, 0x873F, 0x1976,\n    0x8749, 0x0A8A, 0x874B, 0x0FDF, 0x874C, 0x197F, 0x874E, 0x1980,\n    0x8753, 0x1986, 0x8755, 0x09F0, 0x8757, 0x1982, 0x8759, 0x1985,\n    0x875F, 0x197D, 0x8760, 0x197C, 0x8763, 0x1987, 0x8766, 0x055C,\n    0x8768, 0x1983, 0x876A, 0x1988, 0x876E, 0x1984, 0x8771, 0x3AF9,\n    0x8774, 0x1981, 0x8776, 0x0BCF, 0x8778, 0x197E, 0x877F, 0x0D1E,\n    0x8782, 0x198C, 0x8788, 0x3AFA, 0x878D, 0x0F25, 0x8799, 0x3AFB,\n    0x879F, 0x198B, 0x87A2, 0x198A, 0x87AB, 0x1993, 0x87AC, 0x3AFC,\n    0x87AD, 0x3AFD, 0x87AF, 0x198D, 0x87B3, 0x1995, 0x87B5, 0x3AFE,\n    0x87BA, 0x0F50, 0x87BB, 0x1998, 0x87BD, 0x198F, 0x87C0, 0x1990,\n    0x87C4, 0x1994, 0x87C6, 0x1997, 0x87C7, 0x1996, 0x87CB, 0x198E,\n    0x87D0, 0x1991, 0x87D2, 0x19A2, 0x87D6, 0x3AFF, 0x87E0, 0x199B,\n    0x87EB, 0x3B00, 0x87EC, 0x1E23, 0x87ED, 0x3B01, 0x87EF, 0x1999,\n    0x87F2, 0x199A, 0x87F5, 0x3C3D, 0x87F6, 0x199F, 0x87F7, 0x19A0,\n    0x87F9, 0x0588, 0x87FB, 0x065C, 0x87FE, 0x199E, 0x8801, 0x3B02,\n    0x8803, 0x3B03, 0x8805, 0x1989, 0x8806, 0x3B04, 0x8807, 0x21A6,\n    0x880B, 0x3B05, 0x880D, 0x199D, 0x880E, 0x19A1, 0x880F, 0x199C,\n    0x8811, 0x19A3, 0x8814, 0x3B06, 0x8815, 0x19A5, 0x8816, 0x19A4,\n    0x881C, 0x3B07, 0x881F, 0x1E85, 0x8821, 0x19A7, 0x8822, 0x19A6,\n    0x8823, 0x1961, 0x8827, 0x19AB, 0x8831, 0x19A8, 0x8836, 0x19A9,\n    0x8839, 0x19AA, 0x883B, 0x19AC, 0x8840, 0x0742, 0x8842, 0x19AE,\n    0x8844, 0x19AD, 0x8846, 0x093A, 0x884C, 0x07E6, 0x884D, 0x1524,\n    0x8852, 0x19AF, 0x8853, 0x095B, 0x8856, 0x3B08, 0x8857, 0x0597,\n    0x8859, 0x19B0, 0x885B, 0x04F4, 0x885D, 0x09BF, 0x885E, 0x19B1,\n    0x885F, 0x3B09, 0x8861, 0x07E7, 0x8862, 0x19B2, 0x8863, 0x04A5,\n    0x8864, 0x3B0A, 0x8868, 0x0DAF, 0x886B, 0x19B3, 0x8870, 0x0A30,\n    0x8872, 0x19BA, 0x8875, 0x19B7, 0x8877, 0x0BAD, 0x887D, 0x19B8,\n    0x887E, 0x19B5, 0x887F, 0x06D6, 0x8881, 0x19B4, 0x8882, 0x19BB,\n    0x8888, 0x070C, 0x888B, 0x0B3E, 0x888D, 0x19C1, 0x8892, 0x19BD,\n    0x8896, 0x0B15, 0x8897, 0x19BC, 0x8898, 0x3B0B, 0x8899, 0x19BF,\n    0x889E, 0x19B6, 0x88A2, 0x19C0, 0x88A4, 0x19C2, 0x88AA, 0x3B0C,\n    0x88AB, 0x0D83, 0x88AE, 0x19BE, 0x88B0, 0x19C3, 0x88B1, 0x19C5,\n    0x88B4, 0x0787, 0x88B5, 0x19B9, 0x88B7, 0x0485, 0x88BD, 0x3B0D,\n    0x88BE, 0x3B0E, 0x88BF, 0x19C4, 0x88C1, 0x084B, 0x88C2, 0x0FBE,\n    0x88C3, 0x19C6, 0x88C4, 0x19C7, 0x88C5, 0x0AF7, 0x88C6, 0x3789,\n    0x88CA, 0x3B0F, 0x88CF, 0x0F6A, 0x88D2, 0x3B10, 0x88D4, 0x19C8,\n    0x88D5, 0x0F1F, 0x88D8, 0x19C9, 0x88D9, 0x19CA, 0x88DB, 0x3B11,\n    0x88DC, 0x0E34, 0x88DD, 0x19CB, 0x88DF, 0x0830, 0x88E1, 0x0F6B,\n    0x88E8, 0x19D0, 0x88F0, 0x3B12, 0x88F1, 0x3B13, 0x88F2, 0x19D1,\n    0x88F3, 0x09C0, 0x88F4, 0x19CF, 0x88F5, 0x21A7, 0x88F8, 0x0F51,\n    0x88F9, 0x19CC, 0x88FC, 0x19CE, 0x88FD, 0x0A61, 0x88FE, 0x0A44,\n    0x8902, 0x19CD, 0x8904, 0x19D2, 0x8906, 0x3B14, 0x8907, 0x0DF3,\n    0x890A, 0x19D4, 0x890C, 0x19D3, 0x8910, 0x05CA, 0x8912, 0x0E59,\n    0x8913, 0x19D5, 0x8918, 0x3B15, 0x8919, 0x3B16, 0x891A, 0x3B17,\n    0x891C, 0x20A8, 0x891D, 0x19E1, 0x891E, 0x19D7, 0x8925, 0x19D8,\n    0x8927, 0x3B18, 0x892A, 0x19D9, 0x892B, 0x19DA, 0x8930, 0x3B19,\n    0x8936, 0x19DE, 0x8938, 0x19DF, 0x893B, 0x19DD, 0x893E, 0x3B1A,\n    0x8941, 0x19DB, 0x8943, 0x19D6, 0x8944, 0x19DC, 0x894C, 0x19E0,\n    0x894D, 0x1BD0, 0x8956, 0x0528, 0x895E, 0x19E3, 0x895F, 0x06D7,\n    0x8960, 0x19E2, 0x8964, 0x19E5, 0x8966, 0x19E4, 0x896A, 0x19E7,\n    0x896D, 0x19E6, 0x896F, 0x19E8, 0x8972, 0x093B, 0x8974, 0x19E9,\n    0x8977, 0x19EA, 0x897B, 0x3B1B, 0x897E, 0x19EB, 0x897F, 0x0A62,\n    0x8980, 0x362E, 0x8981, 0x0F41, 0x8983, 0x19EC, 0x8986, 0x0DF4,\n    0x8987, 0x0CFC, 0x8988, 0x19ED, 0x898A, 0x19EE, 0x898B, 0x075F,\n    0x898F, 0x0646, 0x8993, 0x19EF, 0x8996, 0x08B9, 0x8997, 0x0CF7,\n    0x8998, 0x19F0, 0x899A, 0x05AE, 0x89A1, 0x19F1, 0x89A6, 0x19F3,\n    0x89A7, 0x0F61, 0x89A9, 0x19F2, 0x89AA, 0x0A0C, 0x89AC, 0x19F4,\n    0x89AF, 0x19F5, 0x89B2, 0x19F6, 0x89B3, 0x060D, 0x89BA, 0x19F7,\n    0x89BD, 0x19F8, 0x89BF, 0x19F9, 0x89C0, 0x19FA, 0x89D2, 0x05AF,\n    0x89D4, 0x3B1C, 0x89D6, 0x3B1D, 0x89DA, 0x19FB, 0x89DC, 0x19FC,\n    0x89DD, 0x19FD, 0x89E3, 0x0572, 0x89E5, 0x3B1E, 0x89E6, 0x09EE,\n    0x89E7, 0x19FE, 0x89F1, 0x3B1F, 0x89F4, 0x19FF, 0x89F8, 0x1A00,\n    0x8A00, 0x0774, 0x8A01, 0x35BC, 0x8A02, 0x0C17, 0x8A03, 0x1A01,\n    0x8A07, 0x3B20, 0x8A08, 0x072D, 0x8A0A, 0x0A1C, 0x8A0C, 0x1A04,\n    0x8A0E, 0x0C7C, 0x8A0F, 0x3B21, 0x8A10, 0x1A03, 0x8A12, 0x21A8,\n    0x8A13, 0x0707, 0x8A15, 0x3B22, 0x8A16, 0x1A02, 0x8A17, 0x0B57,\n    0x8A18, 0x0647, 0x8A1B, 0x1A05, 0x8A1D, 0x1A06, 0x8A1F, 0x09C1,\n    0x8A22, 0x3B23, 0x8A23, 0x0743, 0x8A25, 0x1A07, 0x8A2A, 0x0E5A,\n    0x8A2D, 0x0A83, 0x8A31, 0x0690, 0x8A33, 0x0F01, 0x8A34, 0x0ACC,\n    0x8A36, 0x1A08, 0x8A37, 0x21A9, 0x8A3A, 0x0A0D, 0x8A3B, 0x0BAE,\n    0x8A3C, 0x09C2, 0x8A41, 0x1A09, 0x8A46, 0x1A0C, 0x8A48, 0x1A0D,\n    0x8A4E, 0x3B24, 0x8A50, 0x082E, 0x8A51, 0x0B22, 0x8A52, 0x1A0B,\n    0x8A54, 0x09C3, 0x8A55, 0x0DB0, 0x8A5B, 0x1A0A, 0x8A5E, 0x08BA,\n    0x8A60, 0x04F5, 0x8A62, 0x1A11, 0x8A63, 0x072E, 0x8A66, 0x08BC,\n    0x8A69, 0x08BB, 0x8A6B, 0x0FF3, 0x8A6C, 0x1A10, 0x8A6D, 0x1A0F,\n    0x8A6E, 0x0AA9, 0x8A70, 0x0667, 0x8A71, 0x0FE9, 0x8A72, 0x0598,\n    0x8A73, 0x09C4, 0x8A79, 0x21AA, 0x8A7C, 0x1A0E, 0x8A7F, 0x3B25,\n    0x8A82, 0x1A13, 0x8A84, 0x1A14, 0x8A85, 0x1A12, 0x8A87, 0x078C,\n    0x8A89, 0x0F2A, 0x8A8C, 0x08BD, 0x8A8D, 0x0CDD, 0x8A91, 0x1A17,\n    0x8A93, 0x0A64, 0x8A95, 0x0B80, 0x8A98, 0x0F20, 0x8A9A, 0x1A1A,\n    0x8A9E, 0x07A0, 0x8AA0, 0x0A63, 0x8AA1, 0x1A16, 0x8AA3, 0x1A1B,\n    0x8AA4, 0x07A1, 0x8AA5, 0x1A18, 0x8AA6, 0x1A19, 0x8AA7, 0x21AB,\n    0x8AA8, 0x1A15, 0x8AAA, 0x3638, 0x8AAC, 0x0A86, 0x8AAD, 0x0CA1,\n    0x8AB0, 0x0B6D, 0x8AB2, 0x055D, 0x8AB9, 0x0D84, 0x8ABC, 0x065D,\n    0x8ABE, 0x21AC, 0x8ABF, 0x0BD0, 0x8AC2, 0x1A1E, 0x8AC4, 0x1A1C,\n    0x8AC7, 0x0B8A, 0x8ACB, 0x0A65, 0x8ACC, 0x060E, 0x8ACD, 0x1A1D,\n    0x8ACF, 0x0A21, 0x8AD2, 0x0F92, 0x8AD6, 0x0FE6, 0x8ADA, 0x1A1F,\n    0x8ADB, 0x1A2A, 0x8ADC, 0x0BD1, 0x8ADE, 0x1A29, 0x8ADF, 0x21AD,\n    0x8AE0, 0x1A26, 0x8AE1, 0x1A2E, 0x8AE2, 0x1A27, 0x8AE4, 0x1A23,\n    0x8AE6, 0x0C18, 0x8AE7, 0x1A22, 0x8AEB, 0x1A20, 0x8AED, 0x0F0B,\n    0x8AEE, 0x08BE, 0x8AF1, 0x1A24, 0x8AF3, 0x1A21, 0x8AF4, 0x3B26,\n    0x8AF6, 0x21AF, 0x8AF7, 0x1A28, 0x8AF8, 0x097E, 0x8AFA, 0x0775,\n    0x8AFE, 0x0B5A, 0x8B00, 0x0E73, 0x8B01, 0x04FC, 0x8B02, 0x04A6,\n    0x8B04, 0x0C7D, 0x8B07, 0x1A2C, 0x8B0C, 0x1A2B, 0x8B0E, 0x0CBE,\n    0x8B10, 0x1A30, 0x8B14, 0x1A25, 0x8B16, 0x1A2F, 0x8B17, 0x1A31,\n    0x8B19, 0x0760, 0x8B1A, 0x1A2D, 0x8B1B, 0x07E8, 0x8B1D, 0x0901,\n    0x8B1F, 0x3B27, 0x8B20, 0x1A32, 0x8B21, 0x0F42, 0x8B26, 0x1A35,\n    0x8B28, 0x1A38, 0x8B2B, 0x1A36, 0x8B2C, 0x0DA7, 0x8B33, 0x1A33,\n    0x8B37, 0x3B28, 0x8B39, 0x06D8, 0x8B3E, 0x1A37, 0x8B41, 0x1A39,\n    0x8B43, 0x3B29, 0x8B44, 0x3B2A, 0x8B49, 0x1A3D, 0x8B4C, 0x1A3A,\n    0x8B4E, 0x1A3C, 0x8B4F, 0x1A3B, 0x8B53, 0x21B0, 0x8B54, 0x3B2B,\n    0x8B56, 0x1A3E, 0x8B58, 0x08DD, 0x8B5A, 0x1A40, 0x8B5B, 0x1A3F,\n    0x8B5C, 0x0DDA, 0x8B5F, 0x1A42, 0x8B66, 0x072F, 0x8B6B, 0x1A41,\n    0x8B6C, 0x1A43, 0x8B6F, 0x1A44, 0x8B70, 0x065E, 0x8B71, 0x182E,\n    0x8B72, 0x09E1, 0x8B74, 0x1A45, 0x8B77, 0x07A2, 0x8B7D, 0x1A46,\n    0x8B7F, 0x21B1, 0x8B80, 0x1A47, 0x8B83, 0x088C, 0x8B8A, 0x13D3,\n    0x8B8C, 0x1A48, 0x8B8E, 0x1A49, 0x8B90, 0x093C, 0x8B92, 0x1A4A,\n    0x8B93, 0x1A4B, 0x8B96, 0x1A4C, 0x8B99, 0x1A4D, 0x8B9A, 0x1A4E,\n    0x8B9C, 0x3B2C, 0x8B9E, 0x3B2D, 0x8C37, 0x0B69, 0x8C3A, 0x1A4F,\n    0x8C3F, 0x1A51, 0x8C41, 0x1A50, 0x8C46, 0x0C7E, 0x8C47, 0x3B2E,\n    0x8C48, 0x1A52, 0x8C4A, 0x0E5B, 0x8C4C, 0x1A53, 0x8C4E, 0x1A54,\n    0x8C50, 0x1A55, 0x8C54, 0x3B2F, 0x8C55, 0x1A56, 0x8C5A, 0x0CB2,\n    0x8C61, 0x09C5, 0x8C62, 0x1A57, 0x8C6A, 0x07FD, 0x8C6B, 0x1007,\n    0x8C6C, 0x1A58, 0x8C73, 0x3B30, 0x8C78, 0x1A59, 0x8C79, 0x0DB1,\n    0x8C7A, 0x1A5A, 0x8C7C, 0x1A62, 0x8C82, 0x1A5B, 0x8C85, 0x1A5D,\n    0x8C89, 0x1A5C, 0x8C8A, 0x1A5E, 0x8C8C, 0x0E74, 0x8C8D, 0x1A5F,\n    0x8C8E, 0x1A60, 0x8C94, 0x1A61, 0x8C98, 0x1A63, 0x8C9D, 0x058B,\n    0x8C9E, 0x0C03, 0x8CA0, 0x0DDB, 0x8CA1, 0x0852, 0x8CA2, 0x07E9,\n    0x8CA4, 0x3B31, 0x8CA7, 0x0DC1, 0x8CA8, 0x055F, 0x8CA9, 0x0D62,\n    0x8CAA, 0x1A66, 0x8CAB, 0x060F, 0x8CAC, 0x0A79, 0x8CAD, 0x1A65,\n    0x8CAE, 0x1A6A, 0x8CAF, 0x0BB7, 0x8CB0, 0x0EEF, 0x8CB2, 0x1A68,\n    0x8CB3, 0x1A69, 0x8CB4, 0x0648, 0x8CB6, 0x1A6B, 0x8CB7, 0x0D19,\n    0x8CB8, 0x0B3F, 0x8CBB, 0x0D85, 0x8CBC, 0x0C37, 0x8CBD, 0x1A67,\n    0x8CBF, 0x0E75, 0x8CC0, 0x056C, 0x8CC1, 0x1A6D, 0x8CC2, 0x0FCE,\n    0x8CC3, 0x0BDE, 0x8CC4, 0x0FEB, 0x8CC7, 0x08BF, 0x8CC8, 0x1A6C,\n    0x8CCA, 0x0B11, 0x8CCD, 0x1A7D, 0x8CCE, 0x0AAA, 0x8CD1, 0x0CD0,\n    0x8CD3, 0x0DC2, 0x8CD9, 0x3B32, 0x8CDA, 0x1A70, 0x8CDB, 0x088D,\n    0x8CDC, 0x08C0, 0x8CDE, 0x09C6, 0x8CE0, 0x0D1B, 0x8CE1, 0x3B33,\n    0x8CE2, 0x0761, 0x8CE3, 0x1A6F, 0x8CE4, 0x1A6E, 0x8CE6, 0x0DDC,\n    0x8CEA, 0x08ED, 0x8CED, 0x0C4C, 0x8CF0, 0x21B2, 0x8CF4, 0x21B3,\n    0x8CF8, 0x3B34, 0x8CFA, 0x1A72, 0x8CFB, 0x1A73, 0x8CFC, 0x07EA,\n    0x8CFD, 0x1A71, 0x8CFE, 0x3B35, 0x8D04, 0x1A74, 0x8D05, 0x1A75,\n    0x8D07, 0x1A77, 0x8D08, 0x0B03, 0x8D0A, 0x1A76, 0x8D0B, 0x0622,\n    0x8D0D, 0x1A79, 0x8D0F, 0x1A78, 0x8D10, 0x1A7A, 0x8D12, 0x21B4,\n    0x8D13, 0x1A7C, 0x8D14, 0x1A7E, 0x8D16, 0x1A7F, 0x8D1B, 0x3B36,\n    0x8D64, 0x0A7A, 0x8D66, 0x08FB, 0x8D67, 0x1A80, 0x8D69, 0x3B37,\n    0x8D6B, 0x05B0, 0x8D6C, 0x3B38, 0x8D6D, 0x1A81, 0x8D70, 0x0AF8,\n    0x8D71, 0x1A82, 0x8D73, 0x1A83, 0x8D74, 0x0DDD, 0x8D76, 0x21B5,\n    0x8D77, 0x0649, 0x8D81, 0x1A84, 0x8D84, 0x3B39, 0x8D85, 0x0BD2,\n    0x8D8A, 0x04FD, 0x8D8D, 0x3B3A, 0x8D95, 0x3B3B, 0x8D99, 0x1A85,\n    0x8DA3, 0x091D, 0x8DA6, 0x3B3C, 0x8DA8, 0x0A3C, 0x8DB3, 0x0B0D,\n    0x8DBA, 0x1A88, 0x8DBE, 0x1A87, 0x8DC2, 0x1A86, 0x8DC6, 0x3B3D,\n    0x8DCB, 0x1A8E, 0x8DCC, 0x1A8C, 0x8DCE, 0x3B3E, 0x8DCF, 0x1A89,\n    0x8DD6, 0x1A8B, 0x8DDA, 0x1A8A, 0x8DDB, 0x1A8D, 0x8DDD, 0x0691,\n    0x8DDF, 0x1A91, 0x8DE1, 0x0A7B, 0x8DE3, 0x1A92, 0x8DE4, 0x3B3F,\n    0x8DE8, 0x078D, 0x8DEA, 0x1A8F, 0x8DEB, 0x1A90, 0x8DEC, 0x3B40,\n    0x8DEF, 0x0FCF, 0x8DF3, 0x0BD3, 0x8DF5, 0x0AAB, 0x8DFC, 0x1A93,\n    0x8DFF, 0x1A96, 0x8E08, 0x1A94, 0x8E09, 0x1A95, 0x8E0A, 0x0F43,\n    0x8E0F, 0x0C7F, 0x8E10, 0x1A99, 0x8E1D, 0x1A97, 0x8E1E, 0x1A98,\n    0x8E1F, 0x1A9A, 0x8E20, 0x3B41, 0x8E2A, 0x1AA8, 0x8E30, 0x1A9D,\n    0x8E34, 0x1A9E, 0x8E35, 0x1A9C, 0x8E42, 0x1A9B, 0x8E44, 0x0C19,\n    0x8E47, 0x1AA0, 0x8E48, 0x1AA4, 0x8E49, 0x1AA1, 0x8E4A, 0x1A9F,\n    0x8E4B, 0x3B42, 0x8E4C, 0x1AA2, 0x8E50, 0x1AA3, 0x8E55, 0x1AAA,\n    0x8E59, 0x1AA5, 0x8E5F, 0x0A7C, 0x8E60, 0x1AA7, 0x8E63, 0x1AA9,\n    0x8E64, 0x1AA6, 0x8E6C, 0x3B43, 0x8E70, 0x3B44, 0x8E72, 0x1AAC,\n    0x8E74, 0x093D, 0x8E76, 0x1AAB, 0x8E7A, 0x3B45, 0x8E7C, 0x1AAD,\n    0x8E81, 0x1AAE, 0x8E84, 0x1AB1, 0x8E85, 0x1AB0, 0x8E87, 0x1AAF,\n    0x8E8A, 0x1AB3, 0x8E8B, 0x1AB2, 0x8E8D, 0x0F02, 0x8E91, 0x1AB5,\n    0x8E92, 0x3B46, 0x8E93, 0x1AB4, 0x8E94, 0x1AB6, 0x8E99, 0x1AB7,\n    0x8EA1, 0x1AB9, 0x8EAA, 0x1AB8, 0x8EAB, 0x0A0E, 0x8EAC, 0x1ABA,\n    0x8EAE, 0x3B47, 0x8EAF, 0x06E5, 0x8EB0, 0x1ABB, 0x8EB1, 0x1ABD,\n    0x8EB3, 0x3B48, 0x8EB6, 0x3703, 0x8EBE, 0x1ABE, 0x8EC0, 0x1DEF,\n    0x8EC5, 0x1ABF, 0x8EC6, 0x1ABC, 0x8EC8, 0x1AC0, 0x8ECA, 0x0902,\n    0x8ECB, 0x1AC1, 0x8ECC, 0x064A, 0x8ECD, 0x0709, 0x8ECF, 0x21B7,\n    0x8ED1, 0x3B49, 0x8ED2, 0x0762, 0x8ED4, 0x3B4A, 0x8EDB, 0x1AC2,\n    0x8EDF, 0x0CC8, 0x8EE2, 0x0C38, 0x8EE3, 0x1AC3, 0x8EEB, 0x1AC6,\n    0x8EF8, 0x08E0, 0x8EF9, 0x3B4B, 0x8EFB, 0x1AC5, 0x8EFC, 0x1AC4,\n    0x8EFD, 0x0730, 0x8EFE, 0x1AC7, 0x8F03, 0x05B1, 0x8F05, 0x1AC9,\n    0x8F09, 0x084C, 0x8F0A, 0x1AC8, 0x8F0C, 0x1AD1, 0x8F12, 0x1ACB,\n    0x8F13, 0x1ACD, 0x8F14, 0x0E35, 0x8F15, 0x1ACA, 0x8F17, 0x3B4C,\n    0x8F19, 0x1ACC, 0x8F1B, 0x1AD0, 0x8F1C, 0x1ACE, 0x8F1D, 0x064B,\n    0x8F1F, 0x1ACF, 0x8F26, 0x1AD2, 0x8F29, 0x0D10, 0x8F2A, 0x0FA0,\n    0x8F2F, 0x093E, 0x8F33, 0x1AD3, 0x8F36, 0x3B4D, 0x8F38, 0x0F0C,\n    0x8F39, 0x1AD5, 0x8F3B, 0x1AD4, 0x8F3E, 0x1AD8, 0x8F3F, 0x0F2B,\n    0x8F42, 0x1AD7, 0x8F44, 0x05CB, 0x8F45, 0x1AD6, 0x8F46, 0x1ADB,\n    0x8F49, 0x1ADA, 0x8F4C, 0x1AD9, 0x8F4D, 0x0C2C, 0x8F4E, 0x1ADC,\n    0x8F57, 0x1ADD, 0x8F5C, 0x1ADE, 0x8F5F, 0x07FE, 0x8F61, 0x06FB,\n    0x8F62, 0x1ADF, 0x8F63, 0x1AE0, 0x8F64, 0x1AE1, 0x8F9B, 0x0A0F,\n    0x8F9C, 0x1AE2, 0x8F9E, 0x08D9, 0x8F9F, 0x1AE3, 0x8FA3, 0x1AE4,\n    0x8FA6, 0x3B4E, 0x8FA7, 0x10B6, 0x8FA8, 0x10B5, 0x8FAD, 0x1AE5,\n    0x8FAE, 0x17FF, 0x8FAF, 0x1AE6, 0x8FB0, 0x0B62, 0x8FB1, 0x09F1,\n    0x8FB2, 0x0CF6, 0x8FB5, 0x3B4F, 0x8FB6, 0x3B50, 0x8FB7, 0x1AE7,\n    0x8FBA, 0x0E25, 0x8FBB, 0x0BF0, 0x8FBC, 0x0810, 0x8FBF, 0x0B67,\n    0x8FC2, 0x04CC, 0x8FC4, 0x0EA6, 0x8FC5, 0x0A1D, 0x8FC6, 0x3B51,\n    0x8FC8, 0x3799, 0x8FCE, 0x0734, 0x8FD1, 0x06D9, 0x8FD4, 0x0E26,\n    0x8FDA, 0x1AE8, 0x8FE0, 0x3B52, 0x8FE2, 0x1AEA, 0x8FE4, 0x3B53,\n    0x8FE5, 0x1AE9, 0x8FE6, 0x0560, 0x8FE9, 0x0CCE, 0x8FEA, 0x1AEB,\n    0x8FEB, 0x0D2D, 0x8FED, 0x0C2D, 0x8FEF, 0x1AEC, 0x8FF0, 0x095C,\n    0x8FF4, 0x1AEE, 0x8FF6, 0x3B54, 0x8FF7, 0x0ECE, 0x8FF8, 0x1AFD,\n    0x8FF9, 0x1AF0, 0x8FFA, 0x1AF1, 0x8FFD, 0x0BE5, 0x9000, 0x0B40,\n    0x9001, 0x0AF9, 0x9002, 0x3B55, 0x9003, 0x0C80, 0x9005, 0x1AEF,\n    0x9006, 0x066F, 0x900B, 0x1AF8, 0x900D, 0x1AF5, 0x900E, 0x1B02,\n    0x900F, 0x0C81, 0x9010, 0x0B9E, 0x9011, 0x1AF2, 0x9013, 0x0C1A,\n    0x9014, 0x0C4D, 0x9015, 0x1AF3, 0x9016, 0x1AF7, 0x9017, 0x0A26,\n    0x9019, 0x0D1D, 0x901A, 0x0BE8, 0x901D, 0x0A66, 0x901E, 0x1AF6,\n    0x901F, 0x0B0E, 0x9020, 0x0B04, 0x9021, 0x1AF4, 0x9022, 0x046D,\n    0x9023, 0x0FC8, 0x9027, 0x1AF9, 0x902C, 0x3B56, 0x902E, 0x0B41,\n    0x9031, 0x093F, 0x9032, 0x0A10, 0x9035, 0x1AFB, 0x9036, 0x1AFA,\n    0x9038, 0x04B3, 0x9039, 0x1AFC, 0x903C, 0x0DA1, 0x903E, 0x1B04,\n    0x9041, 0x0CB3, 0x9042, 0x0A31, 0x9044, 0x3B57, 0x9045, 0x0B97,\n    0x9047, 0x06F0, 0x9049, 0x1B03, 0x904A, 0x0F21, 0x904B, 0x04E1,\n    0x904D, 0x0E27, 0x904E, 0x0561, 0x904F, 0x1AFE, 0x9050, 0x1AFF,\n    0x9051, 0x1B00, 0x9052, 0x1B01, 0x9053, 0x0C93, 0x9054, 0x0B61,\n    0x9055, 0x04A7, 0x9056, 0x1B05, 0x9058, 0x1B06, 0x9059, 0x1D34,\n    0x905C, 0x0B1D, 0x905E, 0x1B07, 0x9060, 0x0515, 0x9061, 0x0ACE,\n    0x9063, 0x0763, 0x9065, 0x0F44, 0x9067, 0x21BA, 0x9068, 0x1B08,\n    0x9069, 0x0C26, 0x906D, 0x0AFA, 0x906E, 0x0903, 0x906F, 0x1B09,\n    0x9072, 0x1B0C, 0x9075, 0x096F, 0x9076, 0x1B0A, 0x9077, 0x0AAD,\n    0x9078, 0x0AAC, 0x907A, 0x04A8, 0x907C, 0x0F93, 0x907D, 0x1B0E,\n    0x907F, 0x0D86, 0x9080, 0x1B10, 0x9081, 0x1B0F, 0x9082, 0x1B0D,\n    0x9083, 0x1737, 0x9084, 0x0610, 0x9087, 0x1AED, 0x9088, 0x3B58,\n    0x9089, 0x1B12, 0x908A, 0x1B11, 0x908F, 0x1B13, 0x9091, 0x0F22,\n    0x9095, 0x3B59, 0x9099, 0x3B5A, 0x909B, 0x3B5B, 0x90A2, 0x3B5C,\n    0x90A3, 0x0CB9, 0x90A6, 0x0E5C, 0x90A8, 0x1B14, 0x90AA, 0x0905,\n    0x90AF, 0x1B15, 0x90B1, 0x1B16, 0x90B4, 0x3B5D, 0x90B5, 0x1B17,\n    0x90B8, 0x0C1B, 0x90C1, 0x04AE, 0x90CA, 0x07EB, 0x90CE, 0x0FE0,\n    0x90D7, 0x3B5E, 0x90DB, 0x1B1B, 0x90DD, 0x3B5F, 0x90DE, 0x21BB,\n    0x90E1, 0x070A, 0x90E2, 0x1B18, 0x90E4, 0x1B19, 0x90E8, 0x0DE6,\n    0x90ED, 0x05B2, 0x90F4, 0x3B60, 0x90F5, 0x0F23, 0x90F7, 0x06B7,\n    0x90FD, 0x0C4E, 0x9102, 0x1B1C, 0x9112, 0x1B1D, 0x9115, 0x21BD,\n    0x9117, 0x3B61, 0x9119, 0x1B1E, 0x911C, 0x3B62, 0x9127, 0x21BE,\n    0x912D, 0x0C1C, 0x9130, 0x1B20, 0x9131, 0x3B63, 0x9132, 0x1B1F,\n    0x913A, 0x3B64, 0x913D, 0x3B65, 0x9148, 0x3B66, 0x9149, 0x0CAB,\n    0x914A, 0x1B21, 0x914B, 0x0940, 0x914C, 0x090C, 0x914D, 0x0D11,\n    0x914E, 0x0BAF, 0x9152, 0x091E, 0x9154, 0x0A32, 0x9156, 0x1B22,\n    0x9158, 0x1B23, 0x915B, 0x3B67, 0x9161, 0x3B68, 0x9162, 0x0A23,\n    0x9163, 0x1B24, 0x9164, 0x3B69, 0x9165, 0x1B25, 0x9169, 0x1B26,\n    0x916A, 0x0F59, 0x916C, 0x0941, 0x9172, 0x1B28, 0x9173, 0x1B27,\n    0x9175, 0x07EC, 0x9177, 0x0805, 0x9178, 0x088E, 0x9182, 0x1B2B,\n    0x9187, 0x0970, 0x9189, 0x1B2A, 0x918B, 0x1B29, 0x918D, 0x0B49,\n    0x918E, 0x3B6A, 0x9190, 0x07A3, 0x9192, 0x0A67, 0x9197, 0x0D44,\n    0x919C, 0x0943, 0x919E, 0x3B6B, 0x91A2, 0x1B2C, 0x91A4, 0x09C7,\n    0x91A8, 0x3B6C, 0x91AA, 0x1B2F, 0x91AB, 0x1B2D, 0x91AC, 0x1E1B,\n    0x91AD, 0x3B6D, 0x91AE, 0x3B6E, 0x91AF, 0x1B2E, 0x91B1, 0x1E61,\n    0x91B2, 0x3B6F, 0x91B4, 0x1B31, 0x91B5, 0x1B30, 0x91B8, 0x09E2,\n    0x91BA, 0x1B32, 0x91BC, 0x3B70, 0x91C0, 0x1B33, 0x91C1, 0x1B34,\n    0x91C6, 0x0D64, 0x91C7, 0x0843, 0x91C8, 0x090D, 0x91C9, 0x1B35,\n    0x91CB, 0x1B36, 0x91CC, 0x0F6C, 0x91CD, 0x094F, 0x91CE, 0x0EFA,\n    0x91CF, 0x0F94, 0x91D0, 0x1B37, 0x91D1, 0x06DA, 0x91D6, 0x1B38,\n    0x91D7, 0x21C0, 0x91D8, 0x0C1D, 0x91DA, 0x21BF, 0x91DB, 0x1B3B,\n    0x91DC, 0x05D6, 0x91DD, 0x0A11, 0x91DE, 0x21C1, 0x91DF, 0x1B39,\n    0x91E1, 0x1B3A, 0x91E3, 0x0BFC, 0x91E4, 0x21C4, 0x91E5, 0x21C5,\n    0x91E6, 0x0E83, 0x91E7, 0x06F4, 0x91ED, 0x21C2, 0x91EE, 0x21C3,\n    0x91F0, 0x3B71, 0x91F5, 0x1B3D, 0x91F6, 0x1B3E, 0x91F7, 0x3B72,\n    0x91FB, 0x3B73, 0x91FC, 0x1B3C, 0x91FF, 0x1B40, 0x9206, 0x21C6,\n    0x9207, 0x3B74, 0x920A, 0x21C8, 0x920D, 0x0CB7, 0x920E, 0x05A1,\n    0x9210, 0x21C7, 0x9211, 0x1B44, 0x9214, 0x1B41, 0x9215, 0x1B43,\n    0x921E, 0x1B3F, 0x9228, 0x3B75, 0x9229, 0x1B8A, 0x922C, 0x1B42,\n    0x9233, 0x3B76, 0x9234, 0x0FB3, 0x9237, 0x078E, 0x9238, 0x3B77,\n    0x9239, 0x21CF, 0x923A, 0x21C9, 0x923C, 0x21CB, 0x923F, 0x1B4C,\n    0x9240, 0x21CA, 0x9243, 0x3B78, 0x9244, 0x0C2E, 0x9245, 0x1B47,\n    0x9247, 0x3B79, 0x9248, 0x1B4A, 0x9249, 0x1B48, 0x924B, 0x1B4D,\n    0x924E, 0x21CC, 0x924F, 0x3B7A, 0x9250, 0x1B4E, 0x9251, 0x21CE,\n    0x9257, 0x1B46, 0x9259, 0x21CD, 0x925A, 0x1B53, 0x925B, 0x0516,\n    0x925E, 0x1B45, 0x9260, 0x3B7B, 0x9262, 0x0D41, 0x9264, 0x1B49,\n    0x9266, 0x09C8, 0x9267, 0x21D0, 0x9271, 0x07ED, 0x9277, 0x21D2,\n    0x9278, 0x21D3, 0x927E, 0x0E76, 0x9280, 0x06DC, 0x9283, 0x0950,\n    0x9285, 0x0C94, 0x9288, 0x20AA, 0x9291, 0x0AAF, 0x9293, 0x1B51,\n    0x9295, 0x1B4B, 0x9296, 0x1B50, 0x9298, 0x0ECF, 0x929A, 0x0BD4,\n    0x929B, 0x1B52, 0x929C, 0x1B4F, 0x92A7, 0x21D1, 0x92AD, 0x0AAE,\n    0x92B3, 0x3554, 0x92B7, 0x1B56, 0x92B9, 0x1B55, 0x92C2, 0x3B7C,\n    0x92CB, 0x3B7D, 0x92CC, 0x3B7E, 0x92CF, 0x1B54, 0x92D0, 0x21D7,\n    0x92D2, 0x0E5D, 0x92D3, 0x21DB, 0x92D5, 0x21D9, 0x92D7, 0x21D5,\n    0x92D9, 0x21D6, 0x92DF, 0x3B7F, 0x92E0, 0x21DA, 0x92E4, 0x0985,\n    0x92E7, 0x21D4, 0x92E9, 0x1B57, 0x92EA, 0x0E2F, 0x92ED, 0x04F6,\n    0x92F2, 0x0DB8, 0x92F3, 0x0BB0, 0x92F8, 0x0692, 0x92F9, 0x20B0,\n    0x92FA, 0x1B59, 0x92FB, 0x21DE, 0x92FC, 0x07EF, 0x92FF, 0x21E1,\n    0x9302, 0x21E3, 0x9304, 0x345A, 0x9306, 0x087A, 0x930D, 0x3B80,\n    0x930F, 0x1B58, 0x9310, 0x0A33, 0x9315, 0x3B81, 0x9318, 0x0A34,\n    0x9319, 0x1B5C, 0x931A, 0x1B5E, 0x931D, 0x21E2, 0x931E, 0x21E0,\n    0x931F, 0x3B82, 0x9320, 0x09E3, 0x9321, 0x21DD, 0x9322, 0x1B5D,\n    0x9323, 0x1B5F, 0x9325, 0x21DC, 0x9326, 0x06CB, 0x9327, 0x3B83,\n    0x9328, 0x0DB7, 0x932B, 0x090E, 0x932C, 0x0FC9, 0x932E, 0x1B5B,\n    0x932F, 0x0868, 0x9332, 0x0FE5, 0x9335, 0x1B61, 0x933A, 0x1B60,\n    0x933B, 0x1B62, 0x9344, 0x1B5A, 0x9347, 0x3B84, 0x9348, 0x20A9,\n    0x934A, 0x3458, 0x934B, 0x0CC1, 0x934D, 0x0C4F, 0x9352, 0x3B85,\n    0x9354, 0x0BF3, 0x9356, 0x1B67, 0x9357, 0x21E5, 0x935B, 0x0B81,\n    0x935C, 0x1B63, 0x9360, 0x1B64, 0x9365, 0x3B86, 0x936A, 0x3B87,\n    0x936C, 0x0703, 0x936D, 0x3B88, 0x936E, 0x1B66, 0x9370, 0x21E4,\n    0x9375, 0x0764, 0x937C, 0x1B65, 0x937E, 0x09C9, 0x938C, 0x05D7,\n    0x9394, 0x1B6B, 0x9396, 0x082F, 0x9397, 0x0AFB, 0x939A, 0x0BE6,\n    0x939B, 0x3B89, 0x93A4, 0x21E6, 0x93A7, 0x0599, 0x93A9, 0x3B8B,\n    0x93AC, 0x1B69, 0x93AD, 0x1B6A, 0x93AE, 0x0BDF, 0x93B0, 0x1B68,\n    0x93B9, 0x1B6C, 0x93BA, 0x3B8A, 0x93C1, 0x3B8C, 0x93C3, 0x1B72,\n    0x93C6, 0x21E7, 0x93C8, 0x1B75, 0x93CA, 0x3B8D, 0x93D0, 0x1B74,\n    0x93D1, 0x0C27, 0x93D6, 0x1B6D, 0x93D7, 0x1B6E, 0x93D8, 0x1B71,\n    0x93DD, 0x1B73, 0x93DE, 0x21E8, 0x93E1, 0x06B8, 0x93E2, 0x3B8E,\n    0x93E4, 0x1B76, 0x93E5, 0x1B70, 0x93E8, 0x1B6F, 0x93F8, 0x21E9,\n    0x93FA, 0x3B8F, 0x93FD, 0x3B90, 0x9403, 0x1B7A, 0x9407, 0x1B7B,\n    0x940F, 0x3B91, 0x9410, 0x1B7C, 0x9413, 0x1B79, 0x9414, 0x1B78,\n    0x9418, 0x09CA, 0x9419, 0x0C82, 0x941A, 0x1B77, 0x9421, 0x1B80,\n    0x942B, 0x1B7E, 0x9431, 0x21EA, 0x9434, 0x3B92, 0x9435, 0x1B7F,\n    0x9436, 0x1B7D, 0x9438, 0x0B58, 0x943A, 0x1B81, 0x943F, 0x3B93,\n    0x9441, 0x1B82, 0x9444, 0x1B84, 0x9445, 0x21EB, 0x9448, 0x21EC,\n    0x9451, 0x0611, 0x9452, 0x1B83, 0x9453, 0x0F06, 0x9455, 0x3B94,\n    0x945A, 0x1B8F, 0x945B, 0x1B85, 0x945E, 0x1B88, 0x9460, 0x1B86,\n    0x9462, 0x1B87, 0x946A, 0x1B89, 0x946B, 0x3B95, 0x9470, 0x1B8B,\n    0x9472, 0x3B96, 0x9475, 0x1B8C, 0x9477, 0x1B8D, 0x947C, 0x1B90,\n    0x947D, 0x1B8E, 0x947E, 0x1B91, 0x947F, 0x1B93, 0x9481, 0x1B92,\n    0x9577, 0x0BD5, 0x9578, 0x3B97, 0x9580, 0x0EF3, 0x9582, 0x1B94,\n    0x9583, 0x0AB0, 0x9587, 0x1B95, 0x9589, 0x0E14, 0x958A, 0x1B96,\n    0x958B, 0x0589, 0x958F, 0x04DE, 0x9591, 0x0613, 0x9592, 0x21ED,\n    0x9593, 0x0612, 0x9594, 0x1B97, 0x9596, 0x1B98, 0x9598, 0x1B99,\n    0x9599, 0x1B9A, 0x95A0, 0x1B9B, 0x95A2, 0x0614, 0x95A3, 0x05B3,\n    0x95A4, 0x07F0, 0x95A5, 0x0D4A, 0x95A6, 0x3B98, 0x95A7, 0x1B9D,\n    0x95A8, 0x1B9C, 0x95A9, 0x3B99, 0x95AB, 0x3B9A, 0x95AD, 0x1B9E,\n    0x95B1, 0x3555, 0x95B2, 0x04FE, 0x95B4, 0x3B9B, 0x95B9, 0x1BA1,\n    0x95BB, 0x1BA0, 0x95BC, 0x1B9F, 0x95BD, 0x3B9C, 0x95BE, 0x1BA2,\n    0x95C3, 0x1BA5, 0x95C7, 0x048B, 0x95CA, 0x1BA3, 0x95CC, 0x1BA7,\n    0x95CD, 0x1BA6, 0x95D4, 0x1BA9, 0x95D5, 0x1BA8, 0x95D6, 0x1BAA,\n    0x95D8, 0x0C86, 0x95DA, 0x3B9D, 0x95DC, 0x1BAB, 0x95E1, 0x1BAC,\n    0x95E2, 0x1BAE, 0x95E5, 0x1BAD, 0x961C, 0x0DDE, 0x961D, 0x3B9E,\n    0x9621, 0x1BAF, 0x9628, 0x1BB0, 0x962A, 0x0855, 0x962E, 0x1BB1,\n    0x962F, 0x1BB2, 0x9632, 0x0E77, 0x963B, 0x0ACD, 0x963F, 0x0468,\n    0x9640, 0x0B2B, 0x9641, 0x3B9F, 0x9642, 0x1BB3, 0x9644, 0x0DDF,\n    0x964B, 0x1BB6, 0x964C, 0x1BB4, 0x964D, 0x07F1, 0x964F, 0x1BB5,\n    0x9650, 0x0776, 0x9658, 0x3BA0, 0x965B, 0x0E15, 0x965C, 0x1BB8,\n    0x965D, 0x1BBA, 0x965E, 0x1BB9, 0x965F, 0x1BBB, 0x9662, 0x04C3,\n    0x9663, 0x0A1E, 0x9664, 0x0986, 0x9665, 0x0615, 0x9666, 0x1BBC,\n    0x966A, 0x0D1C, 0x966C, 0x1BBE, 0x9670, 0x04C4, 0x9672, 0x1BBD,\n    0x9673, 0x0BE0, 0x9675, 0x0F95, 0x9676, 0x0C83, 0x9677, 0x1BB7,\n    0x9678, 0x0F6E, 0x967A, 0x0765, 0x967D, 0x0F45, 0x9684, 0x3BA1,\n    0x9685, 0x06F1, 0x9686, 0x0F7C, 0x9688, 0x06FE, 0x968A, 0x0B42,\n    0x968B, 0x186C, 0x968D, 0x1BBF, 0x968E, 0x058A, 0x968F, 0x0A35,\n    0x9694, 0x05B4, 0x9695, 0x1BC1, 0x9697, 0x1BC2, 0x9698, 0x1BC0,\n    0x9699, 0x073A, 0x969B, 0x084D, 0x969C, 0x09CB, 0x969D, 0x21F0,\n    0x96A0, 0x04C5, 0x96A3, 0x0FA1, 0x96A4, 0x3BA2, 0x96A7, 0x1BC4,\n    0x96A8, 0x1B0B, 0x96A9, 0x3BA3, 0x96AA, 0x1BC3, 0x96AF, 0x21F1,\n    0x96B0, 0x1BC7, 0x96B1, 0x1BC5, 0x96B2, 0x1BC6, 0x96B4, 0x1BC8,\n    0x96B6, 0x1BC9, 0x96B7, 0x0FB4, 0x96B8, 0x1BCA, 0x96B9, 0x1BCB,\n    0x96BB, 0x0A6D, 0x96BC, 0x0D4F, 0x96C0, 0x0A43, 0x96C1, 0x0623,\n    0x96C4, 0x0F24, 0x96C5, 0x056D, 0x96C6, 0x0942, 0x96C7, 0x078F,\n    0x96C9, 0x1BCE, 0x96CB, 0x1BCD, 0x96CC, 0x08C1, 0x96CD, 0x1BCF,\n    0x96CE, 0x1BCC, 0x96D1, 0x0876, 0x96D2, 0x3BA4, 0x96D5, 0x1BD3,\n    0x96D6, 0x1992, 0x96D9, 0x10EB, 0x96DB, 0x0A3D, 0x96DC, 0x1BD1,\n    0x96DE, 0x3BA6, 0x96E2, 0x0F6D, 0x96E3, 0x0CC9, 0x96E8, 0x04CD,\n    0x96E9, 0x3BA7, 0x96EA, 0x0A87, 0x96EB, 0x08E2, 0x96F0, 0x0E07,\n    0x96F1, 0x3BA8, 0x96F2, 0x04E2, 0x96F6, 0x0FB5, 0x96F7, 0x0F55,\n    0x96F9, 0x1BD4, 0x96FB, 0x0C3F, 0x9700, 0x0927, 0x9702, 0x3BA9,\n    0x9704, 0x1BD5, 0x9706, 0x1BD6, 0x9707, 0x0A12, 0x9708, 0x1BD7,\n    0x9709, 0x3BAA, 0x970A, 0x0FB6, 0x970D, 0x1BD2, 0x970E, 0x1BD9,\n    0x970F, 0x1BDB, 0x9711, 0x1BDA, 0x9713, 0x1BD8, 0x9716, 0x1BDC,\n    0x9719, 0x1BDD, 0x971C, 0x0AFC, 0x971E, 0x0562, 0x9724, 0x1BDE,\n    0x9727, 0x0EC4, 0x972A, 0x1BDF, 0x9730, 0x1BE0, 0x9732, 0x0FD0,\n    0x9733, 0x21F2, 0x9738, 0x1414, 0x9739, 0x1BE1, 0x973B, 0x21F3,\n    0x973D, 0x1BE2, 0x973E, 0x1BE3, 0x9742, 0x1BE7, 0x9743, 0x21F4,\n    0x9744, 0x1BE4, 0x9746, 0x1BE5, 0x9748, 0x1BE6, 0x9749, 0x1BE8,\n    0x974D, 0x21F5, 0x974F, 0x21F6, 0x9751, 0x21F7, 0x9752, 0x0A68,\n    0x9755, 0x21F8, 0x9756, 0x0F03, 0x9759, 0x0A69, 0x975A, 0x3BAB,\n    0x975C, 0x1BE9, 0x975E, 0x0D87, 0x9760, 0x1BEA, 0x9761, 0x1D06,\n    0x9762, 0x0ED8, 0x9763, 0x3BAC, 0x9764, 0x1BEB, 0x9766, 0x1BEC,\n    0x9768, 0x1BED, 0x9769, 0x05B5, 0x976B, 0x1BEF, 0x976D, 0x0A1F,\n    0x976E, 0x3BAD, 0x9771, 0x1BF0, 0x9773, 0x3BAE, 0x9774, 0x06FA,\n    0x9779, 0x1BF1, 0x977A, 0x1BF5, 0x977C, 0x1BF3, 0x9781, 0x1BF4,\n    0x9784, 0x05D1, 0x9785, 0x1BF2, 0x9786, 0x1BF6, 0x978B, 0x1BF7,\n    0x978D, 0x048C, 0x978F, 0x1BF8, 0x9790, 0x1BF9, 0x9798, 0x09CC,\n    0x979A, 0x3BAF, 0x979C, 0x1BFA, 0x97A0, 0x0661, 0x97A2, 0x3BB0,\n    0x97A3, 0x1BFD, 0x97A6, 0x1BFC, 0x97A8, 0x1BFB, 0x97AB, 0x1A34,\n    0x97AD, 0x0E2C, 0x97B3, 0x1BFE, 0x97B4, 0x1BFF, 0x97B5, 0x3BB1,\n    0x97B6, 0x3BB2, 0x97C3, 0x1C00, 0x97C6, 0x1C01, 0x97C8, 0x1C02,\n    0x97CB, 0x1C03, 0x97D3, 0x0616, 0x97D9, 0x3BB3, 0x97DC, 0x1C04,\n    0x97DE, 0x3BB4, 0x97ED, 0x1C05, 0x97EE, 0x0CD9, 0x97F2, 0x1C07,\n    0x97F3, 0x053B, 0x97F4, 0x3BB5, 0x97F5, 0x1C0A, 0x97F6, 0x1C09,\n    0x97FB, 0x04C6, 0x97FF, 0x06B9, 0x9801, 0x0E17, 0x9802, 0x0BD6,\n    0x9803, 0x0812, 0x9805, 0x07F2, 0x9806, 0x0971, 0x9808, 0x0A22,\n    0x980A, 0x3BB6, 0x980C, 0x1C0C, 0x980E, 0x3BB7, 0x980F, 0x1C0B,\n    0x9810, 0x0F2C, 0x9811, 0x0624, 0x9812, 0x0D66, 0x9813, 0x0CB4,\n    0x9817, 0x0A42, 0x9818, 0x0F96, 0x981A, 0x0731, 0x981E, 0x3BB8,\n    0x9821, 0x1C0F, 0x9823, 0x3BB9, 0x9824, 0x1C0E, 0x982B, 0x3BBA,\n    0x982C, 0x0E79, 0x982D, 0x0C84, 0x9830, 0x1E73, 0x9834, 0x04F2,\n    0x9837, 0x1C10, 0x9838, 0x1C0D, 0x9839, 0x37B3, 0x983B, 0x0DC3,\n    0x983C, 0x0F54, 0x983D, 0x1C11, 0x983E, 0x3BBB, 0x9846, 0x1C12,\n    0x984B, 0x1C14, 0x984C, 0x0B4A, 0x984D, 0x05B9, 0x984E, 0x05BA,\n    0x984F, 0x1C13, 0x9852, 0x3BBC, 0x9853, 0x3BBD, 0x9854, 0x0625,\n    0x9855, 0x0766, 0x9857, 0x21F9, 0x9858, 0x0626, 0x9859, 0x3BBE,\n    0x985A, 0x1E48, 0x985B, 0x0C39, 0x985E, 0x0FA8, 0x9865, 0x21FA,\n    0x9867, 0x0790, 0x986B, 0x1C15, 0x986C, 0x3BBF, 0x986F, 0x1C16,\n    0x9870, 0x1C17, 0x9871, 0x1C18, 0x9873, 0x1C1A, 0x9874, 0x1C19,\n    0x98A8, 0x0DE9, 0x98AA, 0x1C1B, 0x98AF, 0x1C1C, 0x98B1, 0x1C1D,\n    0x98B6, 0x1C1E, 0x98B8, 0x3BC0, 0x98BA, 0x3BC1, 0x98BF, 0x3BC2,\n    0x98C3, 0x1C20, 0x98C4, 0x1C1F, 0x98C6, 0x1C21, 0x98C8, 0x3BC3,\n    0x98DB, 0x0D88, 0x98DC, 0x1839, 0x98DF, 0x09EF, 0x98E0, 0x3618,\n    0x98E2, 0x064C, 0x98E5, 0x3BC4, 0x98E9, 0x1C22, 0x98EB, 0x1C23,\n    0x98ED, 0x10C1, 0x98EE, 0x14DA, 0x98EF, 0x0D67, 0x98F2, 0x04BF,\n    0x98F4, 0x047F, 0x98FC, 0x08C2, 0x98FD, 0x0E5E, 0x98FE, 0x09E6,\n    0x9903, 0x1C24, 0x9905, 0x0EEB, 0x9909, 0x1C25, 0x990A, 0x0F46,\n    0x990C, 0x04E4, 0x9910, 0x088F, 0x9912, 0x1C26, 0x9913, 0x056E,\n    0x9914, 0x1C27, 0x9918, 0x1C28, 0x991D, 0x1C2A, 0x991E, 0x1C2B,\n    0x9920, 0x1C2D, 0x9921, 0x1C29, 0x9924, 0x1C2C, 0x9927, 0x21FD,\n    0x9928, 0x0617, 0x992C, 0x1C2E, 0x992E, 0x1C2F, 0x9932, 0x3BC5,\n    0x9933, 0x3BC6, 0x993D, 0x1C30, 0x993E, 0x1C31, 0x9940, 0x3BC7,\n    0x9942, 0x1C32, 0x9945, 0x1C34, 0x9949, 0x1C33, 0x994B, 0x1C36,\n    0x994C, 0x1C39, 0x994D, 0x3BC8, 0x9950, 0x1C35, 0x9951, 0x1C37,\n    0x9952, 0x1C38, 0x9955, 0x1C3A, 0x9957, 0x06BA, 0x995C, 0x3BC9,\n    0x995F, 0x3BCA, 0x9996, 0x091F, 0x9997, 0x1C3B, 0x9998, 0x1C3C,\n    0x9999, 0x07F3, 0x999E, 0x21FF, 0x99A5, 0x1C3D, 0x99A8, 0x059C,\n    0x99AC, 0x0D05, 0x99AD, 0x1C3E, 0x99AE, 0x1C3F, 0x99B1, 0x3BCB,\n    0x99B3, 0x0B98, 0x99B4, 0x0CC3, 0x99B9, 0x3BCC, 0x99BA, 0x3BCD,\n    0x99BC, 0x1C40, 0x99C1, 0x0D33, 0x99C4, 0x0B2C, 0x99C5, 0x04FA,\n    0x99C6, 0x06E6, 0x99C8, 0x06E7, 0x99C9, 0x3BCE, 0x99D0, 0x0BB1,\n    0x99D1, 0x1C45, 0x99D2, 0x06E8, 0x99D5, 0x056F, 0x99D8, 0x1C44,\n    0x99DB, 0x1C42, 0x99DD, 0x1C43, 0x99DF, 0x1C41, 0x99E2, 0x1C4F,\n    0x99ED, 0x1C46, 0x99EE, 0x1C47, 0x99F1, 0x1C48, 0x99F2, 0x1C49,\n    0x99F8, 0x1C4B, 0x99FB, 0x1C4A, 0x99FF, 0x0963, 0x9A01, 0x1C4C,\n    0x9A02, 0x3BCF, 0x9A05, 0x1C4E, 0x9A08, 0x37BA, 0x9A0E, 0x064D,\n    0x9A0F, 0x1C4D, 0x9A12, 0x0AFD, 0x9A13, 0x0767, 0x9A16, 0x3BD0,\n    0x9A19, 0x1C50, 0x9A24, 0x3BD1, 0x9A27, 0x3BD2, 0x9A28, 0x0B2D,\n    0x9A2B, 0x1C51, 0x9A2D, 0x3BD3, 0x9A2E, 0x3BD4, 0x9A30, 0x0C85,\n    0x9A36, 0x3BD5, 0x9A37, 0x1C52, 0x9A38, 0x3BD6, 0x9A3E, 0x1C57,\n    0x9A40, 0x1C55, 0x9A42, 0x1C54, 0x9A43, 0x1C56, 0x9A45, 0x1C53,\n    0x9A4A, 0x3BD7, 0x9A4D, 0x1C59, 0x9A4E, 0x2200, 0x9A52, 0x1E2F,\n    0x9A55, 0x1C58, 0x9A56, 0x3BD8, 0x9A57, 0x1C5B, 0x9A5A, 0x06BB,\n    0x9A5B, 0x1C5A, 0x9A5F, 0x1C5C, 0x9A62, 0x1C5D, 0x9A64, 0x1C5F,\n    0x9A65, 0x1C5E, 0x9A69, 0x1C60, 0x9A6A, 0x1C62, 0x9A6B, 0x1C61,\n    0x9AA8, 0x080E, 0x9AAD, 0x1C63, 0x9AB0, 0x1C64, 0x9AB5, 0x3BD9,\n    0x9AB6, 0x3BDA, 0x9AB8, 0x059A, 0x9ABC, 0x1C65, 0x9AC0, 0x1C66,\n    0x9AC4, 0x0A37, 0x9ACF, 0x1C67, 0x9AD1, 0x1C68, 0x9AD3, 0x1C69,\n    0x9AD4, 0x1C6A, 0x9AD8, 0x07F4, 0x9AD9, 0x2201, 0x9ADC, 0x2202,\n    0x9ADE, 0x1C6B, 0x9ADF, 0x1C6C, 0x9AE2, 0x1C6D, 0x9AE3, 0x1C6E,\n    0x9AE6, 0x1C6F, 0x9AEA, 0x0D45, 0x9AEB, 0x1C71, 0x9AED, 0x0D98,\n    0x9AEE, 0x1C72, 0x9AEF, 0x1C70, 0x9AF1, 0x1C74, 0x9AF4, 0x1C73,\n    0x9AF7, 0x1C75, 0x9AF9, 0x3BDB, 0x9AFB, 0x1C76, 0x9B03, 0x3BDC,\n    0x9B06, 0x1C77, 0x9B18, 0x1C78, 0x9B1A, 0x1C79, 0x9B1F, 0x1C7A,\n    0x9B20, 0x3BDD, 0x9B22, 0x1C7B, 0x9B23, 0x1C7C, 0x9B25, 0x1C7D,\n    0x9B27, 0x1C7E, 0x9B28, 0x1C7F, 0x9B29, 0x1C80, 0x9B2A, 0x1C81,\n    0x9B2D, 0x343C, 0x9B2E, 0x1C82, 0x9B2F, 0x1C83, 0x9B31, 0x14D4,\n    0x9B32, 0x1C84, 0x9B33, 0x3BDE, 0x9B34, 0x3BDF, 0x9B3B, 0x17A9,\n    0x9B3C, 0x064E, 0x9B41, 0x057F, 0x9B42, 0x0822, 0x9B43, 0x1C86,\n    0x9B44, 0x1C85, 0x9B45, 0x0EB1, 0x9B4D, 0x1C88, 0x9B4E, 0x1C89,\n    0x9B4F, 0x1C87, 0x9B51, 0x1C8A, 0x9B54, 0x0E90, 0x9B58, 0x1C8B,\n    0x9B5A, 0x0695, 0x9B6F, 0x0FCB, 0x9B72, 0x2204, 0x9B73, 0x3BE0,\n    0x9B74, 0x1C8C, 0x9B75, 0x2203, 0x9B79, 0x3BE1, 0x9B83, 0x1C8E,\n    0x9B8E, 0x0482, 0x9B8F, 0x2205, 0x9B91, 0x1C8F, 0x9B92, 0x0DFB,\n    0x9B93, 0x1C8D, 0x9B96, 0x1C90, 0x9B97, 0x1C91, 0x9B9F, 0x1C92,\n    0x9BA0, 0x1C93, 0x9BA7, 0x3BE2, 0x9BA8, 0x1C94, 0x9BAA, 0x0E9C,\n    0x9BAB, 0x087B, 0x9BAD, 0x086A, 0x9BAE, 0x0AB1, 0x9BB1, 0x2206,\n    0x9BB4, 0x1C95, 0x9BB9, 0x1C98, 0x9BBB, 0x2207, 0x9BC0, 0x1C96,\n    0x9BC1, 0x3BE3, 0x9BC6, 0x1C99, 0x9BC7, 0x3BE4, 0x9BC9, 0x07A5,\n    0x9BCA, 0x1C97, 0x9BCF, 0x1C9A, 0x9BD1, 0x1C9B, 0x9BD2, 0x1C9C,\n    0x9BD4, 0x1CA0, 0x9BD6, 0x0878, 0x9BD7, 0x3BE5, 0x9BDB, 0x0B44,\n    0x9BDF, 0x37BF, 0x9BE1, 0x1CA1, 0x9BE2, 0x1C9E, 0x9BE3, 0x1C9D,\n    0x9BE4, 0x1C9F, 0x9BE7, 0x3BE6, 0x9BE8, 0x0735, 0x9BEB, 0x3BE7,\n    0x9BF0, 0x1CA5, 0x9BF1, 0x1CA4, 0x9BF2, 0x1CA3, 0x9BF5, 0x0477,\n    0x9BF7, 0x3BE8, 0x9BFA, 0x3BE9, 0x9BFD, 0x3BEA, 0x9C00, 0x2208,\n    0x9C04, 0x1CAF, 0x9C06, 0x1CAB, 0x9C08, 0x1CAC, 0x9C09, 0x1CA8,\n    0x9C0A, 0x1CAE, 0x9C0B, 0x3BEB, 0x9C0C, 0x1CAA, 0x9C0D, 0x05C0,\n    0x9C10, 0x0FF2, 0x9C12, 0x1CAD, 0x9C13, 0x1CA9, 0x9C14, 0x1CA7,\n    0x9C15, 0x1CA6, 0x9C1B, 0x1CB1, 0x9C21, 0x1CB4, 0x9C24, 0x1CB3,\n    0x9C25, 0x1CB2, 0x9C27, 0x3BEC, 0x9C2A, 0x3BED, 0x9C2D, 0x0DBB,\n    0x9C2E, 0x1CB0, 0x9C2F, 0x04B7, 0x9C30, 0x1CB5, 0x9C32, 0x1CB7,\n    0x9C36, 0x3BEE, 0x9C39, 0x05CD, 0x9C3A, 0x1CA2, 0x9C3B, 0x04D9,\n    0x9C3E, 0x1CB9, 0x9C41, 0x3BEF, 0x9C46, 0x1CB8, 0x9C47, 0x1CB6,\n    0x9C48, 0x0B6B, 0x9C52, 0x0E9E, 0x9C53, 0x3BF0, 0x9C57, 0x0FA2,\n    0x9C5A, 0x1CBA, 0x9C60, 0x1CBB, 0x9C63, 0x3BF1, 0x9C67, 0x1CBC,\n    0x9C6A, 0x3BF2, 0x9C76, 0x1CBD, 0x9C77, 0x3BF3, 0x9C78, 0x1CBE,\n    0x9CE5, 0x0BD7, 0x9CE7, 0x1CBF, 0x9CE9, 0x0D4B, 0x9CEB, 0x1CC4,\n    0x9CEC, 0x1CC0, 0x9CF0, 0x1CC1, 0x9CF3, 0x0E5F, 0x9CF4, 0x0ED0,\n    0x9CF6, 0x0CA8, 0x9D02, 0x3BF4, 0x9D03, 0x1CC5, 0x9D06, 0x1CC6,\n    0x9D07, 0x0C96, 0x9D08, 0x1CC3, 0x9D09, 0x1CC2, 0x9D0E, 0x052A,\n    0x9D12, 0x1CCE, 0x9D15, 0x1CCD, 0x9D1B, 0x0517, 0x9D1F, 0x1CCB,\n    0x9D23, 0x1CCA, 0x9D26, 0x1CC8, 0x9D28, 0x05D9, 0x9D2A, 0x1CC7,\n    0x9D2B, 0x08DE, 0x9D2C, 0x0529, 0x9D3B, 0x07F5, 0x9D3E, 0x1CD1,\n    0x9D3F, 0x1CD0, 0x9D41, 0x1CCF, 0x9D42, 0x3BF5, 0x9D44, 0x1CCC,\n    0x9D46, 0x1CD2, 0x9D47, 0x3BF6, 0x9D48, 0x1CD3, 0x9D50, 0x1CD8,\n    0x9D51, 0x1CD7, 0x9D59, 0x1CD9, 0x9D5C, 0x04CF, 0x9D5D, 0x1CD4,\n    0x9D5E, 0x1CD5, 0x9D60, 0x0806, 0x9D61, 0x0EC5, 0x9D63, 0x3BF7,\n    0x9D64, 0x1CD6, 0x9D69, 0x3BF8, 0x9D6B, 0x220A, 0x9D6C, 0x0E60,\n    0x9D6F, 0x1CDE, 0x9D70, 0x2209, 0x9D72, 0x1CDA, 0x9D7A, 0x1CDF,\n    0x9D7C, 0x3BF9, 0x9D7E, 0x3BFA, 0x9D87, 0x1CDC, 0x9D89, 0x1CDB,\n    0x9D8D, 0x3BFB, 0x9D8F, 0x0732, 0x9D9A, 0x1CE0, 0x9DA4, 0x1CE1,\n    0x9DA9, 0x1CE2, 0x9DAB, 0x1CDD, 0x9DAF, 0x1CC9, 0x9DB1, 0x3BFC,\n    0x9DB2, 0x1CE3, 0x9DB4, 0x0BFD, 0x9DB8, 0x1CE7, 0x9DBA, 0x1CE8,\n    0x9DBB, 0x1CE6, 0x9DC1, 0x1CE5, 0x9DC2, 0x1CEB, 0x9DC3, 0x3BFD,\n    0x9DC4, 0x1CE4, 0x9DC6, 0x1CE9, 0x9DC7, 0x3BFE, 0x9DCF, 0x1CEA,\n    0x9DD3, 0x1CED, 0x9DD6, 0x3BFF, 0x9DD7, 0x1DDE, 0x9DD9, 0x1CEC,\n    0x9DDF, 0x3C00, 0x9DE6, 0x1CEF, 0x9DEB, 0x3C01, 0x9DED, 0x1CF0,\n    0x9DEF, 0x1CF1, 0x9DF2, 0x0FEF, 0x9DF4, 0x3C02, 0x9DF8, 0x1CEE,\n    0x9DF9, 0x0B4B, 0x9DFA, 0x085D, 0x9DFD, 0x1CF2, 0x9E15, 0x3C03,\n    0x9E19, 0x220C, 0x9E1A, 0x1CF3, 0x9E1B, 0x1CF4, 0x9E1D, 0x3C04,\n    0x9E1E, 0x1CF5, 0x9E75, 0x1CF6, 0x9E78, 0x0768, 0x9E79, 0x1CF7,\n    0x9E7C, 0x1DFD, 0x9E7D, 0x1CF8, 0x9E7F, 0x08DB, 0x9E81, 0x1CF9,\n    0x9E88, 0x1CFA, 0x9E8B, 0x1CFB, 0x9E8C, 0x1CFC, 0x9E91, 0x1CFF,\n    0x9E92, 0x1CFD, 0x9E93, 0x0FE2, 0x9E95, 0x1CFE, 0x9E97, 0x0FB7,\n    0x9E9D, 0x1D00, 0x9E9F, 0x0FA3, 0x9EA4, 0x3C05, 0x9EA5, 0x1D01,\n    0x9EA6, 0x0D34, 0x9EA8, 0x3C06, 0x9EA9, 0x1D02, 0x9EAA, 0x1D04,\n    0x9EAC, 0x3C07, 0x9EAD, 0x1D05, 0x9EB4, 0x1E02, 0x9EB5, 0x1E75,\n    0x9EB8, 0x1D03, 0x9EB9, 0x07FF, 0x9EBA, 0x0ED9, 0x9EBB, 0x0E91,\n    0x9EBC, 0x1284, 0x9EBE, 0x14FF, 0x9EBF, 0x0EA9, 0x9EC3, 0x340B,\n    0x9EC4, 0x052B, 0x9ECC, 0x1D07, 0x9ECD, 0x066A, 0x9ECE, 0x1D08,\n    0x9ECF, 0x1D09, 0x9ED0, 0x1D0A, 0x9ED1, 0x220D, 0x9ED2, 0x0807,\n    0x9ED4, 0x1D0B, 0x9ED8, 0x160D, 0x9ED9, 0x0EE7, 0x9EDB, 0x0B43,\n    0x9EDC, 0x1D0C, 0x9EDD, 0x1D0E, 0x9EDE, 0x1D0D, 0x9EE0, 0x1D0F,\n    0x9EE5, 0x1D10, 0x9EE7, 0x3C08, 0x9EE8, 0x1D11, 0x9EEE, 0x3C09,\n    0x9EEF, 0x1D12, 0x9EF4, 0x1D13, 0x9EF6, 0x1D14, 0x9EF7, 0x1D15,\n    0x9EF9, 0x1D16, 0x9EFB, 0x1D17, 0x9EFC, 0x1D18, 0x9EFD, 0x1D19,\n    0x9F07, 0x1D1A, 0x9F08, 0x1D1B, 0x9F0E, 0x0C1E, 0x9F10, 0x3C0A,\n    0x9F12, 0x3C0B, 0x9F13, 0x0791, 0x9F15, 0x1D1D, 0x9F17, 0x3C0C,\n    0x9F19, 0x3C0D, 0x9F20, 0x0ACF, 0x9F21, 0x1D1E, 0x9F2C, 0x1D1F,\n    0x9F2F, 0x3C0E, 0x9F37, 0x3C0F, 0x9F39, 0x3C10, 0x9F3B, 0x0D93,\n    0x9F3E, 0x1D20, 0x9F41, 0x3C11, 0x9F45, 0x3C12, 0x9F4A, 0x1D21,\n    0x9F4B, 0x170A, 0x9F4E, 0x1A7B, 0x9F4F, 0x1C06, 0x9F52, 0x1D22,\n    0x9F54, 0x1D23, 0x9F57, 0x3C13, 0x9F5F, 0x1D25, 0x9F60, 0x1D26,\n    0x9F61, 0x1D27, 0x9F62, 0x0FB8, 0x9F63, 0x1D24, 0x9F66, 0x1D28,\n    0x9F67, 0x1D29, 0x9F68, 0x3C14, 0x9F6A, 0x1D2B, 0x9F6C, 0x1D2A,\n    0x9F71, 0x3C15, 0x9F72, 0x1D2D, 0x9F75, 0x3C16, 0x9F76, 0x1D2E,\n    0x9F77, 0x1D2C, 0x9F8D, 0x0F7E, 0x9F90, 0x3C17, 0x9F94, 0x3C18,\n    0x9F95, 0x1D2F, 0x9F9C, 0x1D30, 0x9F9D, 0x1727, 0x9FA0, 0x1D31,\n    0x9FA2, 0x3C19, 0xF929, 0x2129, 0xF9DC, 0x21EE, 0xFA0E, 0x20DA,\n    0xFA0F, 0x20E5, 0xFA10, 0x20E6, 0xFA11, 0x20FB, 0xFA12, 0x2121,\n    0xFA13, 0x2131, 0xFA14, 0x2133, 0xFA15, 0x215E, 0xFA16, 0x2164,\n    0xFA17, 0x217B, 0xFA18, 0x2183, 0xFA19, 0x2184, 0xFA1A, 0x2185,\n    0xFA1B, 0x2187, 0xFA1C, 0x218B, 0xFA1D, 0x218E, 0xFA1E, 0x2197,\n    0xFA1F, 0x21A2, 0xFA20, 0x21A4, 0xFA21, 0x21A5, 0xFA22, 0x21AE,\n    0xFA23, 0x21B6, 0xFA24, 0x21B8, 0xFA25, 0x21B9, 0xFA26, 0x21BC,\n    0xFA27, 0x21D8, 0xFA28, 0x21DF, 0xFA29, 0x21EF, 0xFA2A, 0x21FB,\n    0xFA2B, 0x21FC, 0xFA2C, 0x21FE, 0xFA2D, 0x220B, 0xFB00, 0x248E,\n    0xFB01, 0x0070, 0xFB02, 0x0071, 0xFB03, 0x248F, 0xFB04, 0x2490,\n    0xFE30, 0x1EDA, 0xFE31, 0x1ED4, 0xFE32, 0x1ED5, 0xFE33, 0x1ED2,\n    0xFE35, 0x1EDB, 0xFE36, 0x1EDC, 0xFE37, 0x1EE1, 0xFE38, 0x1EE2,\n    0xFE39, 0x1EDD, 0xFE3A, 0x1EDE, 0xFE3B, 0x1EEB, 0xFE3C, 0x1EEC,\n    0xFE3D, 0x1EE5, 0xFE3E, 0x1EE6, 0xFE3F, 0x1EE3, 0xFE40, 0x1EE4,\n    0xFE41, 0x1EE7, 0xFE42, 0x1EE8, 0xFE43, 0x1EE9, 0xFE44, 0x1EEA,\n    0xFF01, 0x0282, 0xFF02, 0x1F47, 0xFF03, 0x02CC, 0xFF04, 0x02C8,\n    0xFF05, 0x02CB, 0xFF06, 0x02CD, 0xFF07, 0x1F46, 0xFF08, 0x02A2,\n    0xFF09, 0x02A3, 0xFF0A, 0x02CE, 0xFF0B, 0x02B4, 0xFF0C, 0x027C,\n    0xFF0D, 0x02B5, 0xFF0E, 0x027D, 0xFF0F, 0x0297, 0xFF10, 0x030C,\n    0xFF11, 0x030D, 0xFF12, 0x030E, 0xFF13, 0x030F, 0xFF14, 0x0310,\n    0xFF15, 0x0311, 0xFF16, 0x0312, 0xFF17, 0x0313, 0xFF18, 0x0314,\n    0xFF19, 0x0315, 0xFF1A, 0x027F, 0xFF1B, 0x0280, 0xFF1C, 0x02BB,\n    0xFF1D, 0x02B9, 0xFF1E, 0x02BC, 0xFF1F, 0x0281, 0xFF20, 0x02CF,\n    0xFF21, 0x0316, 0xFF22, 0x0317, 0xFF23, 0x0318, 0xFF24, 0x0319,\n    0xFF25, 0x031A, 0xFF26, 0x031B, 0xFF27, 0x031C, 0xFF28, 0x031D,\n    0xFF29, 0x031E, 0xFF2A, 0x031F, 0xFF2B, 0x0320, 0xFF2C, 0x0321,\n    0xFF2D, 0x0322, 0xFF2E, 0x0323, 0xFF2F, 0x0324, 0xFF30, 0x0325,\n    0xFF31, 0x0326, 0xFF32, 0x0327, 0xFF33, 0x0328, 0xFF34, 0x0329,\n    0xFF35, 0x032A, 0xFF36, 0x032B, 0xFF37, 0x032C, 0xFF38, 0x032D,\n    0xFF39, 0x032E, 0xFF3A, 0x032F, 0xFF3B, 0x02A6, 0xFF3C, 0x0298,\n    0xFF3D, 0x02A7, 0xFF3E, 0x0288, 0xFF3F, 0x028A, 0xFF40, 0x0286,\n    0xFF41, 0x0330, 0xFF42, 0x0331, 0xFF43, 0x0332, 0xFF44, 0x0333,\n    0xFF45, 0x0334, 0xFF46, 0x0335, 0xFF47, 0x0336, 0xFF48, 0x0337,\n    0xFF49, 0x0338, 0xFF4A, 0x0339, 0xFF4B, 0x033A, 0xFF4C, 0x033B,\n    0xFF4D, 0x033C, 0xFF4E, 0x033D, 0xFF4F, 0x033E, 0xFF50, 0x033F,\n    0xFF51, 0x0340, 0xFF52, 0x0341, 0xFF53, 0x0342, 0xFF54, 0x0343,\n    0xFF55, 0x0344, 0xFF56, 0x0345, 0xFF57, 0x0346, 0xFF58, 0x0347,\n    0xFF59, 0x0348, 0xFF5A, 0x0349, 0xFF5B, 0x02A8, 0xFF5C, 0x029B,\n    0xFF5D, 0x02A9, 0xFF5E, 0x0299, 0xFF61, 0x0147, 0xFF62, 0x0148,\n    0xFF63, 0x0149, 0xFF64, 0x014A, 0xFF65, 0x014B, 0xFF66, 0x014C,\n    0xFF67, 0x014D, 0xFF68, 0x014E, 0xFF69, 0x014F, 0xFF6A, 0x0150,\n    0xFF6B, 0x0151, 0xFF6C, 0x0152, 0xFF6D, 0x0153, 0xFF6E, 0x0154,\n    0xFF6F, 0x0155, 0xFF70, 0x0156, 0xFF71, 0x0157, 0xFF72, 0x0158,\n    0xFF73, 0x0159, 0xFF74, 0x015A, 0xFF75, 0x015B, 0xFF76, 0x015C,\n    0xFF77, 0x015D, 0xFF78, 0x015E, 0xFF79, 0x015F, 0xFF7A, 0x0160,\n    0xFF7B, 0x0161, 0xFF7C, 0x0162, 0xFF7D, 0x0163, 0xFF7E, 0x0164,\n    0xFF7F, 0x0165, 0xFF80, 0x0166, 0xFF81, 0x0167, 0xFF82, 0x0168,\n    0xFF83, 0x0169, 0xFF84, 0x016A, 0xFF85, 0x016B, 0xFF86, 0x016C,\n    0xFF87, 0x016D, 0xFF88, 0x016E, 0xFF89, 0x016F, 0xFF8A, 0x0170,\n    0xFF8B, 0x0171, 0xFF8C, 0x0172, 0xFF8D, 0x0173, 0xFF8E, 0x0174,\n    0xFF8F, 0x0175, 0xFF90, 0x0176, 0xFF91, 0x0177, 0xFF92, 0x0178,\n    0xFF93, 0x0179, 0xFF94, 0x017A, 0xFF95, 0x017B, 0xFF96, 0x017C,\n    0xFF97, 0x017D, 0xFF98, 0x017E, 0xFF99, 0x017F, 0xFF9A, 0x0180,\n    0xFF9B, 0x0181, 0xFF9C, 0x0182, 0xFF9D, 0x0183, 0xFF9E, 0x0184,\n    0xFF9F, 0x0185, 0xFFE0, 0x02C9, 0xFFE1, 0x02CA, 0xFFE2, 0x02EF,\n    0xFFE3, 0x0289, 0xFFE4, 0x1F45, 0xFFE5, 0x02C7, 0xFFE8, 0x0143,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-V_4.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_UniJIS_UCS2_V_4[251 * 2] = {\n    0x00B0, 0x204D, 0x2010, 0x1ED5, 0x2015, 0x1ED4, 0x2016, 0x1ED7,\n    0x2018, 0x2059, 0x2019, 0x205A, 0x201C, 0x2057, 0x201D, 0x2058,\n    0x2025, 0x1EDA, 0x2026, 0x1ED9, 0x2032, 0x2051, 0x2033, 0x205B,\n    0x2190, 0x02E2, 0x2191, 0x02E0, 0x2192, 0x02E3, 0x2193, 0x02E1,\n    0x2195, 0x2FB6, 0x21C4, 0x2077, 0x21C5, 0x2076, 0x21C6, 0x2078,\n    0x21E6, 0x1F4C, 0x21E7, 0x1F4E, 0x21E8, 0x1F4B, 0x21E9, 0x1F4D,\n    0x2225, 0x1ED7, 0x223C, 0x1ED6, 0x22EF, 0x1ED9, 0x2500, 0x1D39,\n    0x2501, 0x1D3A, 0x2502, 0x1D37, 0x2503, 0x1D38, 0x2504, 0x1D3D,\n    0x2505, 0x1D3E, 0x2506, 0x1D3B, 0x2507, 0x1D3C, 0x2508, 0x1D41,\n    0x2509, 0x1D42, 0x250A, 0x1D3F, 0x250B, 0x1D40, 0x250C, 0x1D47,\n    0x250D, 0x1D49, 0x250E, 0x1D48, 0x250F, 0x1D4A, 0x2510, 0x1D4F,\n    0x2511, 0x1D51, 0x2512, 0x1D50, 0x2513, 0x1D52, 0x2514, 0x1D43,\n    0x2515, 0x1D45, 0x2516, 0x1D44, 0x2517, 0x1D46, 0x2518, 0x1D4B,\n    0x2519, 0x1D4D, 0x251A, 0x1D4C, 0x251B, 0x1D4E, 0x251C, 0x1D63,\n    0x251D, 0x1D67, 0x251E, 0x1D65, 0x251F, 0x1D64, 0x2520, 0x1D66,\n    0x2521, 0x1D69, 0x2522, 0x1D68, 0x2523, 0x1D6A, 0x2524, 0x1D6B,\n    0x2525, 0x1D6F, 0x2526, 0x1D6D, 0x2527, 0x1D6C, 0x2528, 0x1D6E,\n    0x2529, 0x1D71, 0x252A, 0x1D70, 0x252B, 0x1D72, 0x252C, 0x1D5B,\n    0x252D, 0x1D5D, 0x252E, 0x1D5E, 0x252F, 0x1D5F, 0x2530, 0x1D5C,\n    0x2531, 0x1D60, 0x2532, 0x1D61, 0x2533, 0x1D62, 0x2534, 0x1D53,\n    0x2535, 0x1D55, 0x2536, 0x1D56, 0x2537, 0x1D57, 0x2538, 0x1D54,\n    0x2539, 0x1D58, 0x253A, 0x1D59, 0x253B, 0x1D5A, 0x253D, 0x1D77,\n    0x253E, 0x1D78, 0x253F, 0x1D79, 0x2540, 0x1D75, 0x2541, 0x1D74,\n    0x2542, 0x1D76, 0x2543, 0x1D7B, 0x2544, 0x1D7D, 0x2545, 0x1D7A,\n    0x2546, 0x1D7C, 0x2547, 0x1D81, 0x2548, 0x1D80, 0x2549, 0x1D7E,\n    0x254A, 0x1D7F, 0x261C, 0x201D, 0x261D, 0x201B, 0x261E, 0x201E,\n    0x261F, 0x201C, 0x2702, 0x2F92, 0x27A1, 0x2011, 0x3001, 0x1ECF,\n    0x3002, 0x1ED0, 0x3008, 0x1EE3, 0x3009, 0x1EE4, 0x300A, 0x1EE5,\n    0x300B, 0x1EE6, 0x300C, 0x1EE7, 0x300D, 0x1EE8, 0x300E, 0x1EE9,\n    0x300F, 0x1EEA, 0x3010, 0x1EEB, 0x3011, 0x1EEC, 0x3013, 0x204E,\n    0x3014, 0x1EDD, 0x3015, 0x1EDE, 0x301C, 0x1ED6, 0x301D, 0x1F14,\n    0x301F, 0x1F15, 0x3041, 0x1EEE, 0x3043, 0x1EEF, 0x3045, 0x1EF0,\n    0x3047, 0x1EF1, 0x3049, 0x1EF2, 0x3063, 0x1EF3, 0x3083, 0x1EF4,\n    0x3085, 0x1EF5, 0x3087, 0x1EF6, 0x308E, 0x1EF7, 0x309B, 0x2050,\n    0x309C, 0x204F, 0x30A1, 0x1EF8, 0x30A3, 0x1EF9, 0x30A5, 0x1EFA,\n    0x30A7, 0x1EFB, 0x30A9, 0x1EFC, 0x30C3, 0x1EFD, 0x30E3, 0x1EFE,\n    0x30E5, 0x1EFF, 0x30E7, 0x1F00, 0x30EE, 0x1F01, 0x30F5, 0x1F02,\n    0x30F6, 0x1F03, 0x30FC, 0x1ED3, 0x3300, 0x209E, 0x3301, 0x2EB6,\n    0x3302, 0x2EB7, 0x3303, 0x2092, 0x3304, 0x2EB8, 0x3305, 0x208D,\n    0x3306, 0x2EB9, 0x3307, 0x2EBD, 0x3308, 0x2EBB, 0x3309, 0x2EC0,\n    0x330A, 0x2EBE, 0x330B, 0x2EC2, 0x330C, 0x2EC4, 0x330D, 0x1F0E,\n    0x330E, 0x2EC5, 0x330F, 0x2EC6, 0x3310, 0x2EC7, 0x3311, 0x2EC8,\n    0x3312, 0x2EC9, 0x3313, 0x2ECA, 0x3314, 0x1F05, 0x3315, 0x2094,\n    0x3316, 0x208A, 0x3317, 0x2ECC, 0x3318, 0x2093, 0x3319, 0x2ECE,\n    0x331A, 0x2ED0, 0x331B, 0x2ED1, 0x331C, 0x2ED2, 0x331D, 0x2ED3,\n    0x331E, 0x20A1, 0x331F, 0x2ED4, 0x3320, 0x2ED5, 0x3321, 0x2ED6,\n    0x3322, 0x2089, 0x3323, 0x209C, 0x3324, 0x2ED7, 0x3325, 0x2ED9,\n    0x3326, 0x1F0F, 0x3327, 0x1F09, 0x3328, 0x2EDC, 0x3329, 0x2EDD,\n    0x332A, 0x20A4, 0x332B, 0x1F11, 0x332D, 0x2EDF, 0x332E, 0x2EE2,\n    0x332F, 0x2EE3, 0x3330, 0x2EE4, 0x3331, 0x20A6, 0x3332, 0x2EE5,\n    0x3333, 0x208E, 0x3334, 0x2EE8, 0x3335, 0x2EE9, 0x3336, 0x1F0B,\n    0x3337, 0x2EEE, 0x3338, 0x2EF0, 0x3339, 0x2097, 0x333A, 0x2EF1,\n    0x333B, 0x209D, 0x333C, 0x2EEA, 0x333D, 0x2EF2, 0x333E, 0x2EF4,\n    0x333F, 0x2EF5, 0x3340, 0x2EF6, 0x3341, 0x2EF3, 0x3342, 0x209B,\n    0x3343, 0x2EF7, 0x3344, 0x2EF8, 0x3345, 0x2EF9, 0x3346, 0x2EFA,\n    0x3347, 0x20A5, 0x3348, 0x2EFB, 0x3349, 0x1F04, 0x334A, 0x1F12,\n    0x334B, 0x2EFC, 0x334C, 0x2EFD, 0x334D, 0x1F07, 0x334E, 0x2091,\n    0x334F, 0x2EFE, 0x3350, 0x2EFF, 0x3351, 0x1F0C, 0x3352, 0x2F02,\n    0x3353, 0x2F06, 0x3354, 0x2F03, 0x3355, 0x2F07, 0x3356, 0x2F08,\n    0x3357, 0x2098, 0x337F, 0x2084, 0xFF08, 0x1EDB, 0xFF09, 0x1EDC,\n    0xFF0C, 0x204C, 0xFF0E, 0x2052, 0xFF1D, 0x1EED, 0xFF3B, 0x1EDF,\n    0xFF3D, 0x1EE0, 0xFF3F, 0x1ED2, 0xFF5B, 0x1EE1, 0xFF5C, 0x1ED8,\n    0xFF5D, 0x1EE2, 0xFF5E, 0x1ED6, 0xFFE3, 0x1ED1,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-H_5.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_UniJIS_UTF16_H_5[13241 * 2] = {\n    0x0020, 0x0001, 0x0021, 0x0002, 0x0022, 0x0003, 0x0023, 0x0004,\n    0x0024, 0x0005, 0x0025, 0x0006, 0x0026, 0x0007, 0x0027, 0x0008,\n    0x0028, 0x0009, 0x0029, 0x000A, 0x002A, 0x000B, 0x002B, 0x000C,\n    0x002C, 0x000D, 0x002D, 0x000E, 0x002E, 0x000F, 0x002F, 0x0010,\n    0x0030, 0x0011, 0x0031, 0x0012, 0x0032, 0x0013, 0x0033, 0x0014,\n    0x0034, 0x0015, 0x0035, 0x0016, 0x0036, 0x0017, 0x0037, 0x0018,\n    0x0038, 0x0019, 0x0039, 0x001A, 0x003A, 0x001B, 0x003B, 0x001C,\n    0x003C, 0x001D, 0x003D, 0x001E, 0x003E, 0x001F, 0x003F, 0x0020,\n    0x0040, 0x0021, 0x0041, 0x0022, 0x0042, 0x0023, 0x0043, 0x0024,\n    0x0044, 0x0025, 0x0045, 0x0026, 0x0046, 0x0027, 0x0047, 0x0028,\n    0x0048, 0x0029, 0x0049, 0x002A, 0x004A, 0x002B, 0x004B, 0x002C,\n    0x004C, 0x002D, 0x004D, 0x002E, 0x004E, 0x002F, 0x004F, 0x0030,\n    0x0050, 0x0031, 0x0051, 0x0032, 0x0052, 0x0033, 0x0053, 0x0034,\n    0x0054, 0x0035, 0x0055, 0x0036, 0x0056, 0x0037, 0x0057, 0x0038,\n    0x0058, 0x0039, 0x0059, 0x003A, 0x005A, 0x003B, 0x005B, 0x003C,\n    0x005C, 0x0061, 0x005D, 0x003E, 0x005E, 0x003F, 0x005F, 0x0040,\n    0x0060, 0x0041, 0x0061, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044,\n    0x0064, 0x0045, 0x0065, 0x0046, 0x0066, 0x0047, 0x0067, 0x0048,\n    0x0068, 0x0049, 0x0069, 0x004A, 0x006A, 0x004B, 0x006B, 0x004C,\n    0x006C, 0x004D, 0x006D, 0x004E, 0x006E, 0x004F, 0x006F, 0x0050,\n    0x0070, 0x0051, 0x0071, 0x0052, 0x0072, 0x0053, 0x0073, 0x0054,\n    0x0074, 0x0055, 0x0075, 0x0056, 0x0076, 0x0057, 0x0077, 0x0058,\n    0x0078, 0x0059, 0x0079, 0x005A, 0x007A, 0x005B, 0x007B, 0x005C,\n    0x007C, 0x0063, 0x007D, 0x005E, 0x007E, 0x0064, 0x00A0, 0x0001,\n    0x00A1, 0x0065, 0x00A2, 0x0066, 0x00A3, 0x0067, 0x00A4, 0x006B,\n    0x00A5, 0x003D, 0x00A6, 0x005D, 0x00A7, 0x02D0, 0x00A8, 0x0287,\n    0x00A9, 0x0098, 0x00AA, 0x008C, 0x00AB, 0x006D, 0x00AC, 0x0099,\n    0x00AD, 0x0097, 0x00AE, 0x009A, 0x00AF, 0x0081, 0x00B0, 0x02C3,\n    0x00B1, 0x02B6, 0x00B2, 0x009D, 0x00B3, 0x009E, 0x00B4, 0x0285,\n    0x00B5, 0x009F, 0x00B6, 0x030A, 0x00B7, 0x0075, 0x00B8, 0x0086,\n    0x00B9, 0x00A0, 0x00BA, 0x0090, 0x00BB, 0x007B, 0x00BC, 0x00A1,\n    0x00BD, 0x00A2, 0x00BE, 0x00A3, 0x00BF, 0x007E, 0x00C0, 0x00A4,\n    0x00C1, 0x00A5, 0x00C2, 0x00A6, 0x00C3, 0x00A7, 0x00C4, 0x00A8,\n    0x00C5, 0x00A9, 0x00C6, 0x008B, 0x00C7, 0x00AA, 0x00C8, 0x00AB,\n    0x00C9, 0x00AC, 0x00CA, 0x00AD, 0x00CB, 0x00AE, 0x00CC, 0x00AF,\n    0x00CD, 0x00B0, 0x00CE, 0x00B1, 0x00CF, 0x00B2, 0x00D0, 0x00B3,\n    0x00D1, 0x00B4, 0x00D2, 0x00B5, 0x00D3, 0x00B6, 0x00D4, 0x00B7,\n    0x00D5, 0x00B8, 0x00D6, 0x00B9, 0x00D7, 0x02B7, 0x00D8, 0x008E,\n    0x00D9, 0x00BB, 0x00DA, 0x00BC, 0x00DB, 0x00BD, 0x00DC, 0x00BE,\n    0x00DD, 0x00BF, 0x00DE, 0x00C0, 0x00DF, 0x0096, 0x00E0, 0x00C1,\n    0x00E1, 0x00C2, 0x00E2, 0x00C3, 0x00E3, 0x00C4, 0x00E4, 0x00C5,\n    0x00E5, 0x00C6, 0x00E6, 0x0091, 0x00E7, 0x00C7, 0x00E8, 0x00C8,\n    0x00E9, 0x00C9, 0x00EA, 0x00CA, 0x00EB, 0x00CB, 0x00EC, 0x00CC,\n    0x00ED, 0x00CD, 0x00EE, 0x00CE, 0x00EF, 0x00CF, 0x00F0, 0x00D0,\n    0x00F1, 0x00D1, 0x00F2, 0x00D2, 0x00F3, 0x00D3, 0x00F4, 0x00D4,\n    0x00F5, 0x00D5, 0x00F6, 0x00D6, 0x00F7, 0x02B8, 0x00F8, 0x0094,\n    0x00F9, 0x00D8, 0x00FA, 0x00D9, 0x00FB, 0x00DA, 0x00FC, 0x00DB,\n    0x00FD, 0x00DC, 0x00FE, 0x00DD, 0x00FF, 0x00DE, 0x0100, 0x2496,\n    0x0101, 0x2491, 0x0102, 0x3D8C, 0x0103, 0x3D99, 0x0104, 0x3D79,\n    0x0105, 0x3D81, 0x0106, 0x3D8E, 0x0107, 0x3D9B, 0x0108, 0x3DA7,\n    0x0109, 0x3DAD, 0x010C, 0x3D8F, 0x010D, 0x3D9C, 0x010E, 0x3D91,\n    0x010F, 0x3D9E, 0x0111, 0x3D9F, 0x0112, 0x2499, 0x0113, 0x2494,\n    0x0118, 0x3D90, 0x0119, 0x3D9D, 0x011A, 0x24B3, 0x011B, 0x24BF,\n    0x011C, 0x3DA8, 0x011D, 0x3DAE, 0x0124, 0x3DA9, 0x0125, 0x3DAF,\n    0x0127, 0x3DC8, 0x0128, 0x24B8, 0x0129, 0x24C4, 0x012A, 0x2497,\n    0x012B, 0x2492, 0x0131, 0x0092, 0x0134, 0x3DAA, 0x0135, 0x3DB0,\n    0x0139, 0x3D8D, 0x013A, 0x3D9A, 0x013D, 0x3D7B, 0x013E, 0x3D83,\n    0x0141, 0x008D, 0x0142, 0x0093, 0x0143, 0x3D92, 0x0144, 0x3DA0,\n    0x0147, 0x3D93, 0x0148, 0x3DA1, 0x014B, 0x24DC, 0x014C, 0x249A,\n    0x014D, 0x2495, 0x0150, 0x3D94, 0x0151, 0x3DA2, 0x0152, 0x008F,\n    0x0153, 0x0095, 0x0154, 0x3D8B, 0x0155, 0x3D98, 0x0158, 0x3D95,\n    0x0159, 0x3DA3, 0x015A, 0x3D7C, 0x015B, 0x3D84, 0x015C, 0x3DAB,\n    0x015D, 0x3DB1, 0x015E, 0x3D7D, 0x015F, 0x3D86, 0x0160, 0x00DF,\n    0x0161, 0x00E3, 0x0162, 0x3D97, 0x0163, 0x3DA5, 0x0164, 0x3D7E,\n    0x0165, 0x3D87, 0x0168, 0x24BD, 0x0169, 0x24C9, 0x016A, 0x2498,\n    0x016B, 0x2493, 0x016C, 0x3DAC, 0x016D, 0x3DB2, 0x016E, 0x24BC,\n    0x016F, 0x24C8, 0x0170, 0x3D96, 0x0171, 0x3DA4, 0x0178, 0x00E0,\n    0x0179, 0x3D7F, 0x017A, 0x3D88, 0x017B, 0x3D80, 0x017C, 0x3D8A,\n    0x017D, 0x00E1, 0x017E, 0x00E5, 0x0192, 0x0069, 0x0193, 0x3DD2,\n    0x01C2, 0x3DCD, 0x01CD, 0x24B2, 0x01CE, 0x24BE, 0x01CF, 0x24B6,\n    0x01D0, 0x24C2, 0x01D1, 0x24B9, 0x01D2, 0x24C5, 0x01D3, 0x24BB,\n    0x01D4, 0x24C7, 0x01D6, 0x3D75, 0x01D8, 0x3D76, 0x01DA, 0x3D77,\n    0x01DC, 0x3D78, 0x01F8, 0x3D73, 0x01F9, 0x3D74, 0x01FD, 0x24CD,\n    0x0250, 0x3DD8, 0x0251, 0x24CA, 0x0252, 0x3DDC, 0x0253, 0x3DCE,\n    0x0254, 0x24CF, 0x0255, 0x3DE1, 0x0256, 0x3DBA, 0x0257, 0x3DCF,\n    0x0258, 0x3DD5, 0x0259, 0x24D2, 0x025A, 0x24D5, 0x025B, 0x24D8,\n    0x025C, 0x3DD6, 0x025E, 0x3DD7, 0x025F, 0x3DC1, 0x0260, 0x3DD1,\n    0x0261, 0x3DC5, 0x0262, 0x3E0B, 0x0263, 0x3E0C, 0x0264, 0x3DDB,\n    0x0265, 0x3DDE, 0x0266, 0x3DCB, 0x0267, 0x3DE4, 0x0268, 0x3DD3,\n    0x026A, 0x3E0D, 0x026C, 0x3DB6, 0x026D, 0x3DC0, 0x026E, 0x3DB7,\n    0x026F, 0x3DD9, 0x0270, 0x3DC6, 0x0271, 0x3DB3, 0x0272, 0x3DC2,\n    0x0273, 0x3DBB, 0x0274, 0x3E0E, 0x0275, 0x24DD, 0x0276, 0x3E0F,\n    0x0278, 0x3E10, 0x0279, 0x3DB8, 0x027A, 0x3DE3, 0x027B, 0x3DBF,\n    0x027D, 0x3DBC, 0x027E, 0x3DB5, 0x0280, 0x3E11, 0x0281, 0x3DC7,\n    0x0282, 0x3DBD, 0x0283, 0x24E2, 0x0284, 0x3DD0, 0x0288, 0x3DB9,\n    0x0289, 0x3DD4, 0x028A, 0x3DDA, 0x028B, 0x3DB4, 0x028C, 0x24DE,\n    0x028D, 0x3DDD, 0x028E, 0x3DC4, 0x028F, 0x3E12, 0x0290, 0x3DBE,\n    0x0291, 0x3DE2, 0x0292, 0x24E1, 0x0294, 0x3DCA, 0x0295, 0x3DC9,\n    0x0298, 0x3DCC, 0x0299, 0x3E13, 0x029C, 0x3E14, 0x029D, 0x3DC3,\n    0x029F, 0x3E15, 0x02A1, 0x3DE0, 0x02A2, 0x3DDF, 0x02B0, 0x3E16,\n    0x02B2, 0x3E17, 0x02B7, 0x3E18, 0x02BB, 0x0062, 0x02BC, 0x0060,\n    0x02C1, 0x3E19, 0x02C6, 0x0080, 0x02C7, 0x3D85, 0x02C8, 0x3DE6,\n    0x02CC, 0x3DE7, 0x02D0, 0x24E3, 0x02D1, 0x3DE8, 0x02D8, 0x3D7A,\n    0x02D9, 0x3DA6, 0x02DA, 0x0085, 0x02DB, 0x3D82, 0x02DC, 0x005F,\n    0x02DD, 0x3D89, 0x02DE, 0x3DFB, 0x02E0, 0x3E1A, 0x02E1, 0x3E1B,\n    0x02E5, 0x3DEB, 0x02E6, 0x3DEC, 0x02E7, 0x3DED, 0x02E8, 0x3DEE,\n    0x02E9, 0x3DEF, 0x0300, 0x0041, 0x0301, 0x007F, 0x0302, 0x0080,\n    0x0303, 0x005F, 0x0304, 0x0081, 0x0305, 0x00E2, 0x0306, 0x0082,\n    0x0307, 0x0083, 0x0308, 0x0084, 0x030A, 0x0085, 0x030B, 0x0087,\n    0x030C, 0x0089, 0x030F, 0x3DEA, 0x0318, 0x3E02, 0x0319, 0x3E03,\n    0x031A, 0x3E07, 0x031C, 0x3DF5, 0x031D, 0x3E00, 0x031E, 0x3E01,\n    0x031F, 0x3DF6, 0x0320, 0x3DF7, 0x0324, 0x3DFC, 0x0325, 0x3DF2,\n    0x0327, 0x0086, 0x0328, 0x0088, 0x0329, 0x3DF9, 0x032A, 0x3E04,\n    0x032C, 0x3DF3, 0x032F, 0x3DFA, 0x0330, 0x3DFD, 0x0332, 0x0040,\n    0x0334, 0x3DFF, 0x0336, 0x008A, 0x0339, 0x3DF4, 0x033A, 0x3E05,\n    0x033B, 0x3E06, 0x033C, 0x3DFE, 0x033D, 0x3DF8, 0x0361, 0x3DE5,\n    0x0391, 0x03F3, 0x0392, 0x03F4, 0x0393, 0x03F5, 0x0394, 0x03F6,\n    0x0395, 0x03F7, 0x0396, 0x03F8, 0x0397, 0x03F9, 0x0398, 0x03FA,\n    0x0399, 0x03FB, 0x039A, 0x03FC, 0x039B, 0x03FD, 0x039C, 0x03FE,\n    0x039D, 0x03FF, 0x039E, 0x0400, 0x039F, 0x0401, 0x03A0, 0x0402,\n    0x03A1, 0x0403, 0x03A3, 0x0404, 0x03A4, 0x0405, 0x03A5, 0x0406,\n    0x03A6, 0x0407, 0x03A7, 0x0408, 0x03A8, 0x0409, 0x03A9, 0x040A,\n    0x03B1, 0x040B, 0x03B2, 0x040C, 0x03B3, 0x040D, 0x03B4, 0x040E,\n    0x03B5, 0x040F, 0x03B6, 0x0410, 0x03B7, 0x0411, 0x03B8, 0x0412,\n    0x03B9, 0x0413, 0x03BA, 0x0414, 0x03BB, 0x0415, 0x03BC, 0x0416,\n    0x03BD, 0x0417, 0x03BE, 0x0418, 0x03BF, 0x0419, 0x03C0, 0x041A,\n    0x03C1, 0x041B, 0x03C2, 0x3F5E, 0x03C3, 0x041C, 0x03C4, 0x041D,\n    0x03C5, 0x041E, 0x03C6, 0x041F, 0x03C7, 0x0420, 0x03C8, 0x0421,\n    0x03C9, 0x0422, 0x03D0, 0x2F3A, 0x03D1, 0x2F40, 0x03D5, 0x2F3E,\n    0x03DB, 0x2F3F, 0x0401, 0x0429, 0x0410, 0x0423, 0x0411, 0x0424,\n    0x0412, 0x0425, 0x0413, 0x0426, 0x0414, 0x0427, 0x0415, 0x0428,\n    0x0416, 0x042A, 0x0417, 0x042B, 0x0418, 0x042C, 0x0419, 0x042D,\n    0x041A, 0x042E, 0x041B, 0x042F, 0x041C, 0x0430, 0x041D, 0x0431,\n    0x041E, 0x0432, 0x041F, 0x0433, 0x0420, 0x0434, 0x0421, 0x0435,\n    0x0422, 0x0436, 0x0423, 0x0437, 0x0424, 0x0438, 0x0425, 0x0439,\n    0x0426, 0x043A, 0x0427, 0x043B, 0x0428, 0x043C, 0x0429, 0x043D,\n    0x042A, 0x043E, 0x042B, 0x043F, 0x042C, 0x0440, 0x042D, 0x0441,\n    0x042E, 0x0442, 0x042F, 0x0443, 0x0430, 0x0444, 0x0431, 0x0445,\n    0x0432, 0x0446, 0x0433, 0x0447, 0x0434, 0x0448, 0x0435, 0x0449,\n    0x0436, 0x044B, 0x0437, 0x044C, 0x0438, 0x044D, 0x0439, 0x044E,\n    0x043A, 0x044F, 0x043B, 0x0450, 0x043C, 0x0451, 0x043D, 0x0452,\n    0x043E, 0x0453, 0x043F, 0x0454, 0x0440, 0x0455, 0x0441, 0x0456,\n    0x0442, 0x0457, 0x0443, 0x0458, 0x0444, 0x0459, 0x0445, 0x045A,\n    0x0446, 0x045B, 0x0447, 0x045C, 0x0448, 0x045D, 0x0449, 0x045E,\n    0x044A, 0x045F, 0x044B, 0x0460, 0x044C, 0x0461, 0x044D, 0x0462,\n    0x044E, 0x0463, 0x044F, 0x0464, 0x0451, 0x044A, 0x1E3E, 0x3D71,\n    0x1E3F, 0x3D72, 0x1EBC, 0x24B5, 0x1EBD, 0x24C1, 0x1F70, 0x24CC,\n    0x1F71, 0x24CB, 0x1F72, 0x24DA, 0x1F73, 0x24D9, 0x2002, 0x00E7,\n    0x2003, 0x0279, 0x2010, 0x0296, 0x2011, 0x000E, 0x2012, 0x0072,\n    0x2013, 0x0072, 0x2014, 0x008A, 0x2015, 0x0295, 0x2016, 0x029A,\n    0x2018, 0x0062, 0x2019, 0x0060, 0x201A, 0x0078, 0x201C, 0x006C,\n    0x201D, 0x007A, 0x201E, 0x0079, 0x2020, 0x0308, 0x2021, 0x0309,\n    0x2022, 0x0077, 0x2025, 0x029D, 0x2026, 0x029C, 0x2030, 0x0304,\n    0x2032, 0x02C4, 0x2033, 0x02C5, 0x2039, 0x006E, 0x203A, 0x006F,\n    0x203B, 0x02DE, 0x203C, 0x2F4F, 0x203E, 0x00E2, 0x203F, 0x3DE9,\n    0x2042, 0x3F9A, 0x2044, 0x0068, 0x2047, 0x3F96, 0x2048, 0x3F97,\n    0x2049, 0x2F50, 0x2051, 0x3F99, 0x2070, 0x24A1, 0x2074, 0x24A2,\n    0x2075, 0x24A3, 0x2076, 0x24A4, 0x2077, 0x24A5, 0x2078, 0x24A6,\n    0x2079, 0x24A7, 0x2080, 0x24A8, 0x2081, 0x24A9, 0x2082, 0x24AA,\n    0x2083, 0x24AB, 0x2084, 0x24AC, 0x2085, 0x24AD, 0x2086, 0x24AE,\n    0x2087, 0x24AF, 0x2088, 0x24B0, 0x2089, 0x24B1, 0x20AC, 0x248A,\n    0x20DD, 0x3FC8, 0x20DE, 0x2B1B, 0x2100, 0x2E4F, 0x2103, 0x02C6,\n    0x2105, 0x2E53, 0x2109, 0x2071, 0x210A, 0x2070, 0x210F, 0x2F3C,\n    0x2113, 0x1F59, 0x2116, 0x1DBA, 0x2121, 0x1F77, 0x2122, 0x00E4,\n    0x2126, 0x248B, 0x2127, 0x3C9B, 0x212B, 0x0303, 0x2135, 0x2F39,\n    0x213B, 0x2073, 0x2153, 0x249F, 0x2154, 0x24A0, 0x2155, 0x3D6F,\n    0x2156, 0x2639, 0x2157, 0x263A, 0x2158, 0x263B, 0x2159, 0x263C,\n    0x215A, 0x263D, 0x215B, 0x249B, 0x215C, 0x249C, 0x215D, 0x249D,\n    0x215E, 0x249E, 0x2160, 0x1D97, 0x2161, 0x1D98, 0x2162, 0x1D99,\n    0x2163, 0x1D9A, 0x2164, 0x1D9B, 0x2165, 0x1D9C, 0x2166, 0x1D9D,\n    0x2167, 0x1D9E, 0x2168, 0x1D9F, 0x2169, 0x1DA0, 0x216A, 0x2021,\n    0x216B, 0x2022, 0x2170, 0x1F9C, 0x2171, 0x1F9D, 0x2172, 0x1F9E,\n    0x2173, 0x1F9F, 0x2174, 0x1FA0, 0x2175, 0x1FA1, 0x2176, 0x1FA2,\n    0x2177, 0x1FA3, 0x2178, 0x1FA4, 0x2179, 0x1FA5, 0x217A, 0x206A,\n    0x217B, 0x206B, 0x217F, 0x206F, 0x2190, 0x02E1, 0x2191, 0x02E2,\n    0x2192, 0x02E0, 0x2193, 0x02E3, 0x2194, 0x2FA9, 0x2196, 0x2FAC,\n    0x2197, 0x2FAD, 0x2198, 0x2FAA, 0x2199, 0x2FAB, 0x21C4, 0x2076,\n    0x21C5, 0x2077, 0x21C6, 0x2075, 0x21CB, 0x2FAF, 0x21CC, 0x2FAE,\n    0x21D0, 0x2FA8, 0x21D2, 0x02F0, 0x21D4, 0x02F1, 0x21E6, 0x1F4D,\n    0x21E7, 0x1F4C, 0x21E8, 0x1F4E, 0x21E9, 0x1F4B, 0x2200, 0x02F2,\n    0x2202, 0x02F7, 0x2203, 0x02F3, 0x2205, 0x2F98, 0x2207, 0x02F8,\n    0x2208, 0x02E5, 0x2209, 0x3C74, 0x220A, 0x2F3B, 0x220B, 0x02E6,\n    0x2211, 0x1DC9, 0x2212, 0x02B5, 0x2213, 0x2F56, 0x2219, 0x0075,\n    0x221A, 0x02FD, 0x221D, 0x02FF, 0x221E, 0x02BF, 0x221F, 0x1DCD,\n    0x2220, 0x02F4, 0x2225, 0x3C81, 0x2226, 0x3C82, 0x2227, 0x02ED,\n    0x2228, 0x02EE, 0x2229, 0x02EC, 0x222A, 0x02EB, 0x222B, 0x0301,\n    0x222C, 0x0302, 0x222D, 0x2003, 0x222E, 0x1DC8, 0x2234, 0x02C0,\n    0x2235, 0x0300, 0x223C, 0x0064, 0x223D, 0x02FE, 0x2243, 0x2F58,\n    0x2245, 0x3C93, 0x2248, 0x3C94, 0x2252, 0x02FA, 0x2260, 0x02BA,\n    0x2261, 0x02F9, 0x2262, 0x3C91, 0x2266, 0x02BD, 0x2267, 0x02BE,\n    0x226A, 0x02FB, 0x226B, 0x02FC, 0x2272, 0x2F59, 0x2273, 0x2F5A,\n    0x2276, 0x3C95, 0x2277, 0x3C96, 0x2282, 0x02E9, 0x2283, 0x02EA,\n    0x2284, 0x3C70, 0x2285, 0x3C71, 0x2286, 0x02E7, 0x2287, 0x02E8,\n    0x228A, 0x3C72, 0x228B, 0x3C73, 0x2295, 0x2F9C, 0x2296, 0x2F9A,\n    0x2297, 0x2F9D, 0x2298, 0x2F9B, 0x229E, 0x3E22, 0x22A0, 0x2F99,\n    0x22A5, 0x02F5, 0x22BF, 0x1DCE, 0x22DA, 0x3D6D, 0x22DB, 0x3D6E,\n    0x2305, 0x3C76, 0x2306, 0x3C77, 0x2307, 0x2FBB, 0x2312, 0x02F6,\n    0x2318, 0x3D70, 0x239B, 0x2F6F, 0x239C, 0x2F87, 0x239D, 0x2F70,\n    0x239E, 0x2F71, 0x239F, 0x2F87, 0x23A0, 0x2F72, 0x23A1, 0x2F77,\n    0x23A2, 0x2F87, 0x23A3, 0x2F78, 0x23A4, 0x2F79, 0x23A5, 0x2F87,\n    0x23A6, 0x2F7A, 0x23A7, 0x1FF2, 0x23A8, 0x1FF3, 0x23A9, 0x1FF4,\n    0x23AA, 0x2F87, 0x23AB, 0x1FEE, 0x23AC, 0x1FEF, 0x23AD, 0x1FF0,\n    0x23B0, 0x3FB8, 0x23B1, 0x3FB9, 0x23BE, 0x3F7D, 0x23BF, 0x3F7E,\n    0x23C0, 0x3F7F, 0x23C1, 0x3F80, 0x23C2, 0x3F81, 0x23C3, 0x3F82,\n    0x23C4, 0x3F83, 0x23C5, 0x3F84, 0x23C6, 0x3F85, 0x23C7, 0x3F86,\n    0x23C8, 0x3F87, 0x23C9, 0x3F88, 0x23CA, 0x3F89, 0x23CB, 0x3F8A,\n    0x23CC, 0x3F8B, 0x23CE, 0x3F91, 0x2423, 0x3F90, 0x2460, 0x1D83,\n    0x2461, 0x1D84, 0x2462, 0x1D85, 0x2463, 0x1D86, 0x2464, 0x1D87,\n    0x2465, 0x1D88, 0x2466, 0x1D89, 0x2467, 0x1D8A, 0x2468, 0x1D8B,\n    0x2469, 0x1D8C, 0x246A, 0x1D8D, 0x246B, 0x1D8E, 0x246C, 0x1D8F,\n    0x246D, 0x1D90, 0x246E, 0x1D91, 0x246F, 0x1D92, 0x2470, 0x1D93,\n    0x2471, 0x1D94, 0x2472, 0x1D95, 0x2473, 0x1D96, 0x2474, 0x1F87,\n    0x2475, 0x1F88, 0x2476, 0x1F89, 0x2477, 0x1F8A, 0x2478, 0x1F8B,\n    0x2479, 0x1F8C, 0x247A, 0x1F8D, 0x247B, 0x1F8E, 0x247C, 0x1F8F,\n    0x247D, 0x1F90, 0x247E, 0x1F91, 0x247F, 0x1F92, 0x2480, 0x1F93,\n    0x2481, 0x1F94, 0x2482, 0x1F95, 0x2483, 0x1F96, 0x2484, 0x1F97,\n    0x2485, 0x1F98, 0x2486, 0x1F99, 0x2487, 0x1F9A, 0x2488, 0x1F7E,\n    0x2489, 0x1F7F, 0x248A, 0x1F80, 0x248B, 0x1F81, 0x248C, 0x1F82,\n    0x248D, 0x1F83, 0x248E, 0x1F84, 0x248F, 0x1F85, 0x2490, 0x1F86,\n    0x249C, 0x1FB0, 0x249D, 0x1FB1, 0x249E, 0x1FB2, 0x249F, 0x1FB3,\n    0x24A0, 0x1FB4, 0x24A1, 0x1FB5, 0x24A2, 0x1FB6, 0x24A3, 0x1FB7,\n    0x24A4, 0x1FB8, 0x24A5, 0x1FB9, 0x24A6, 0x1FBA, 0x24A7, 0x1FBB,\n    0x24A8, 0x1FBC, 0x24A9, 0x1FBD, 0x24AA, 0x1FBE, 0x24AB, 0x1FBF,\n    0x24AC, 0x1FC0, 0x24AD, 0x1FC1, 0x24AE, 0x1FC2, 0x24AF, 0x1FC3,\n    0x24B0, 0x1FC4, 0x24B1, 0x1FC5, 0x24B2, 0x1FC6, 0x24B3, 0x1FC7,\n    0x24B4, 0x1FC8, 0x24B5, 0x1FC9, 0x24B6, 0x2863, 0x24B7, 0x2864,\n    0x24B8, 0x2865, 0x24B9, 0x2866, 0x24BA, 0x2867, 0x24BB, 0x2868,\n    0x24BC, 0x2869, 0x24BD, 0x286A, 0x24BE, 0x286B, 0x24BF, 0x286C,\n    0x24C0, 0x286D, 0x24C1, 0x286E, 0x24C2, 0x286F, 0x24C3, 0x2870,\n    0x24C4, 0x2871, 0x24C5, 0x2872, 0x24C6, 0x2873, 0x24C7, 0x2874,\n    0x24C8, 0x2875, 0x24C9, 0x2876, 0x24CA, 0x2877, 0x24CB, 0x2878,\n    0x24CC, 0x2879, 0x24CD, 0x287A, 0x24CE, 0x287B, 0x24CF, 0x287C,\n    0x24D0, 0x2849, 0x24D1, 0x284A, 0x24D2, 0x284B, 0x24D3, 0x284C,\n    0x24D4, 0x284D, 0x24D5, 0x284E, 0x24D6, 0x284F, 0x24D7, 0x2850,\n    0x24D8, 0x2851, 0x24D9, 0x2852, 0x24DA, 0x2853, 0x24DB, 0x2854,\n    0x24DC, 0x2855, 0x24DD, 0x2856, 0x24DE, 0x2857, 0x24DF, 0x2858,\n    0x24E0, 0x2859, 0x24E1, 0x285A, 0x24E2, 0x285B, 0x24E3, 0x285C,\n    0x24E4, 0x285D, 0x24E5, 0x285E, 0x24E6, 0x285F, 0x24E7, 0x2860,\n    0x24E8, 0x2861, 0x24E9, 0x2862, 0x24EA, 0x2020, 0x24EB, 0x2913,\n    0x24EC, 0x2914, 0x24ED, 0x2915, 0x24EE, 0x2916, 0x24EF, 0x2917,\n    0x24F0, 0x2918, 0x24F1, 0x2919, 0x24F2, 0x291A, 0x24F3, 0x291B,\n    0x24F4, 0x291C, 0x24F5, 0x3F5F, 0x24F6, 0x3F60, 0x24F7, 0x3F61,\n    0x24F8, 0x3F62, 0x24F9, 0x3F63, 0x24FA, 0x3F64, 0x24FB, 0x3F65,\n    0x24FC, 0x3F66, 0x24FD, 0x3F67, 0x24FE, 0x3F68, 0x24FF, 0x2907,\n    0x2500, 0x1D37, 0x2501, 0x1D38, 0x2502, 0x1D39, 0x2503, 0x1D3A,\n    0x2504, 0x1D3B, 0x2505, 0x1D3C, 0x2506, 0x1D3D, 0x2507, 0x1D3E,\n    0x2508, 0x1D3F, 0x2509, 0x1D40, 0x250A, 0x1D41, 0x250B, 0x1D42,\n    0x250C, 0x1D43, 0x250D, 0x1D44, 0x250E, 0x1D45, 0x250F, 0x1D46,\n    0x2510, 0x1D47, 0x2511, 0x1D48, 0x2512, 0x1D49, 0x2513, 0x1D4A,\n    0x2514, 0x1D4B, 0x2515, 0x1D4C, 0x2516, 0x1D4D, 0x2517, 0x1D4E,\n    0x2518, 0x1D4F, 0x2519, 0x1D50, 0x251A, 0x1D51, 0x251B, 0x1D52,\n    0x251C, 0x1D53, 0x251D, 0x1D54, 0x251E, 0x1D55, 0x251F, 0x1D56,\n    0x2520, 0x1D57, 0x2521, 0x1D58, 0x2522, 0x1D59, 0x2523, 0x1D5A,\n    0x2524, 0x1D5B, 0x2525, 0x1D5C, 0x2526, 0x1D5D, 0x2527, 0x1D5E,\n    0x2528, 0x1D5F, 0x2529, 0x1D60, 0x252A, 0x1D61, 0x252B, 0x1D62,\n    0x252C, 0x1D63, 0x252D, 0x1D64, 0x252E, 0x1D65, 0x252F, 0x1D66,\n    0x2530, 0x1D67, 0x2531, 0x1D68, 0x2532, 0x1D69, 0x2533, 0x1D6A,\n    0x2534, 0x1D6B, 0x2535, 0x1D6C, 0x2536, 0x1D6D, 0x2537, 0x1D6E,\n    0x2538, 0x1D6F, 0x2539, 0x1D70, 0x253A, 0x1D71, 0x253B, 0x1D72,\n    0x253C, 0x1D73, 0x253D, 0x1D74, 0x253E, 0x1D75, 0x253F, 0x1D76,\n    0x2540, 0x1D77, 0x2541, 0x1D78, 0x2542, 0x1D79, 0x2543, 0x1D7A,\n    0x2544, 0x1D7B, 0x2545, 0x1D7C, 0x2546, 0x1D7D, 0x2547, 0x1D7E,\n    0x2548, 0x1D7F, 0x2549, 0x1D80, 0x254A, 0x1D81, 0x254B, 0x1D82,\n    0x2550, 0x203B, 0x255E, 0x203C, 0x2561, 0x203E, 0x256A, 0x203D,\n    0x256D, 0x2037, 0x256E, 0x2038, 0x256F, 0x203A, 0x2570, 0x2039,\n    0x2571, 0x2045, 0x2572, 0x2046, 0x2573, 0x2047, 0x2581, 0x2026,\n    0x2582, 0x2027, 0x2583, 0x2028, 0x2584, 0x2029, 0x2585, 0x202A,\n    0x2586, 0x202B, 0x2587, 0x202C, 0x2588, 0x202D, 0x2589, 0x2034,\n    0x258A, 0x2033, 0x258B, 0x2032, 0x258C, 0x2031, 0x258D, 0x2030,\n    0x258E, 0x202F, 0x258F, 0x202E, 0x2594, 0x2035, 0x2595, 0x2036,\n    0x25A0, 0x02D9, 0x25A1, 0x02D8, 0x25A2, 0x1F4F, 0x25AA, 0x2FCF,\n    0x25AB, 0x2FCD, 0x25B1, 0x3F6B, 0x25B2, 0x02DB, 0x25B3, 0x02DA,\n    0x25B6, 0x2FA3, 0x25B7, 0x1F4A, 0x25BC, 0x02DD, 0x25BD, 0x02DC,\n    0x25C0, 0x2FA2, 0x25C1, 0x1F49, 0x25C6, 0x02D7, 0x25C7, 0x02D6,\n    0x25C9, 0x2012, 0x25CB, 0x02D3, 0x25CC, 0x2906, 0x25CE, 0x02D5,\n    0x25CF, 0x02D4, 0x25D0, 0x3F92, 0x25D1, 0x3F93, 0x25D2, 0x3F94,\n    0x25D3, 0x3F95, 0x25E2, 0x203F, 0x25E3, 0x2040, 0x25E4, 0x2042,\n    0x25E5, 0x2041, 0x25E6, 0x2FDE, 0x25EF, 0x030B, 0x2600, 0x2017,\n    0x2601, 0x2018, 0x2602, 0x2019, 0x2603, 0x201A, 0x2605, 0x02D2,\n    0x2606, 0x02D1, 0x260E, 0x1F78, 0x2616, 0x3F69, 0x2617, 0x3F6A,\n    0x261C, 0x201C, 0x261D, 0x201D, 0x261E, 0x201B, 0x261F, 0x201E,\n    0x2640, 0x02C2, 0x2642, 0x02C1, 0x2660, 0x2013, 0x2661, 0x1F51,\n    0x2662, 0x1F53, 0x2663, 0x2015, 0x2664, 0x1F52, 0x2665, 0x2014,\n    0x2666, 0x2016, 0x2667, 0x1F50, 0x2668, 0x2F42, 0x2669, 0x2F43,\n    0x266A, 0x0307, 0x266B, 0x3F48, 0x266C, 0x2F44, 0x266D, 0x0306,\n    0x266E, 0x3F47, 0x266F, 0x0305, 0x2672, 0x3FBA, 0x2673, 0x3FBB,\n    0x2674, 0x3FBC, 0x2675, 0x3FBD, 0x2676, 0x3FBE, 0x2677, 0x3FBF,\n    0x2678, 0x3FC0, 0x2679, 0x3FC1, 0x267A, 0x3FC2, 0x267B, 0x3FC3,\n    0x267C, 0x3FC4, 0x267D, 0x3FC5, 0x26A0, 0x2FA0, 0x2702, 0x2F90,\n    0x2713, 0x3F8E, 0x271A, 0x2FD1, 0x273F, 0x2FC5, 0x2740, 0x2FC4,\n    0x2756, 0x2FE3, 0x2776, 0x205E, 0x2777, 0x205F, 0x2778, 0x2060,\n    0x2779, 0x2061, 0x277A, 0x2062, 0x277B, 0x2063, 0x277C, 0x2064,\n    0x277D, 0x2065, 0x277E, 0x2066, 0x277F, 0x2912, 0x27A1, 0x200E,\n    0x2934, 0x3F49, 0x2935, 0x3F4A, 0x29BF, 0x3F4B, 0x29FA, 0x3F4F,\n    0x29FB, 0x3F50, 0x2B05, 0x200F, 0x2B06, 0x2010, 0x2B07, 0x2011,\n    0x2E83, 0x37E1, 0x2E85, 0x3620, 0x2E87, 0x3719, 0x2E89, 0x3814,\n    0x2E8B, 0x371E, 0x2E8C, 0x3609, 0x2E8D, 0x360A, 0x2E8E, 0x1071,\n    0x2E8F, 0x388C, 0x2E90, 0x1226, 0x2E92, 0x0EB2, 0x2E93, 0x1283,\n    0x2E94, 0x12AB, 0x2E95, 0x3C1F, 0x2E96, 0x38C2, 0x2E97, 0x361C,\n    0x2E98, 0x38E1, 0x2E99, 0x13C3, 0x2E9B, 0x13E1, 0x2E9E, 0x45E5,\n    0x2E9F, 0x0E3C, 0x2EA0, 0x0EBD, 0x2EA1, 0x3961, 0x2EA2, 0x3962,\n    0x2EA3, 0x399D, 0x2EA4, 0x3C26, 0x2EA6, 0x374D, 0x2EA8, 0x39BC,\n    0x2EA9, 0x35A1, 0x2EAA, 0x36AB, 0x2EAB, 0x3A97, 0x2EAC, 0x4ABA,\n    0x2EAD, 0x3A39, 0x2EAE, 0x3662, 0x2EB1, 0x3A98, 0x2EB2, 0x3A97,\n    0x2EB3, 0x376D, 0x2EB7, 0x36FE, 0x2EB9, 0x3713, 0x2EBC, 0x35B3,\n    0x2EBD, 0x354E, 0x2EBE, 0x3775, 0x2EBF, 0x3776, 0x2EC0, 0x3777,\n    0x2EC1, 0x078B, 0x2EC2, 0x3B0A, 0x2EC3, 0x362E, 0x2EC4, 0x0A62,\n    0x2EC6, 0x3572, 0x2ECA, 0x364A, 0x2ECC, 0x3C2B, 0x2ECD, 0x3B50,\n    0x2ECF, 0x3B9E, 0x2ED1, 0x0BD5, 0x2ED2, 0x3B97, 0x2ED6, 0x3B9E,\n    0x2ED7, 0x354D, 0x2ED8, 0x0A68, 0x2EDD, 0x3617, 0x2EDE, 0x3619,\n    0x2EDF, 0x3618, 0x2EE4, 0x064E, 0x2EE8, 0x0D34, 0x2EE9, 0x052B,\n    0x2EEB, 0x0A6A, 0x2EED, 0x08C3, 0x2EEF, 0x0F7D, 0x2EF2, 0x064F,\n    0x2F00, 0x04B0, 0x2F01, 0x20B3, 0x2F02, 0x0FFF, 0x2F03, 0x1001,\n    0x2F04, 0x0535, 0x2F05, 0x1006, 0x2F06, 0x0CCB, 0x2F07, 0x100E,\n    0x2F08, 0x0A13, 0x2F09, 0x1070, 0x2F0A, 0x0CD6, 0x2F0B, 0x0D40,\n    0x2F0C, 0x107B, 0x2F0D, 0x1083, 0x2F0E, 0x1089, 0x2F0F, 0x1093,\n    0x2F10, 0x1098, 0x2F11, 0x0C5B, 0x2F12, 0x0F97, 0x2F13, 0x10C6,\n    0x2F14, 0x10CD, 0x2F15, 0x10CE, 0x2F16, 0x10D3, 0x2F17, 0x0947,\n    0x2F18, 0x0E7C, 0x2F19, 0x10DC, 0x2F1A, 0x10E1, 0x2F1B, 0x10E8,\n    0x2F1C, 0x0EA2, 0x2F1D, 0x07B1, 0x2F1E, 0x116B, 0x2F1F, 0x0C54,\n    0x2F20, 0x089C, 0x2F21, 0x11BA, 0x2F22, 0x11BB, 0x2F23, 0x0F26,\n    0x2F24, 0x0B47, 0x2F25, 0x0981, 0x2F26, 0x08A0, 0x2F27, 0x120E,\n    0x2F28, 0x0A47, 0x2F29, 0x0996, 0x2F2A, 0x1226, 0x2F2B, 0x1228,\n    0x2F2C, 0x1232, 0x2F2D, 0x0881, 0x2F2E, 0x126C, 0x2F2F, 0x07BB,\n    0x2F30, 0x077E, 0x2F31, 0x06CA, 0x2F32, 0x05EF, 0x2F33, 0x1283,\n    0x2F34, 0x1285, 0x2F35, 0x1299, 0x2F36, 0x129B, 0x2F37, 0x12A0,\n    0x2F38, 0x0677, 0x2F39, 0x38B9, 0x2F3A, 0x12AF, 0x2F3B, 0x12B1,\n    0x2F3C, 0x09FA, 0x2F3D, 0x1342, 0x2F3E, 0x0781, 0x2F3F, 0x0916,\n    0x2F40, 0x08A7, 0x2F41, 0x13C2, 0x2F42, 0x0E08, 0x2F43, 0x0C47,\n    0x2F44, 0x06CC, 0x2F45, 0x0E4D, 0x2F46, 0x13E0, 0x2F47, 0x0CD4,\n    0x2F48, 0x140C, 0x2F49, 0x0744, 0x2F4A, 0x0EE6, 0x2F4B, 0x073D,\n    0x2F4C, 0x08AD, 0x2F4D, 0x14E5, 0x2F4E, 0x14F4, 0x2F4F, 0x14F8,\n    0x2F50, 0x0D7A, 0x2F51, 0x0EDF, 0x2F52, 0x08AF, 0x2F53, 0x1502,\n    0x2F54, 0x0A2B, 0x2F55, 0x0550, 0x2F56, 0x0BFA, 0x2F57, 0x0DD5,\n    0x2F58, 0x15E4, 0x2F59, 0x15E6, 0x2F5A, 0x0E22, 0x2F5B, 0x0567,\n    0x2F5C, 0x0687, 0x2F5D, 0x0758, 0x2F5E, 0x0770, 0x2F5F, 0x06C4,\n    0x2F60, 0x04DD, 0x2F61, 0x05E0, 0x2F62, 0x0601, 0x2F63, 0x0A5C,\n    0x2F64, 0x0F3B, 0x2F65, 0x0C3E, 0x2F66, 0x0D97, 0x2F67, 0x3A00,\n    0x2F68, 0x1697, 0x2F69, 0x0D28, 0x2F6A, 0x0D7D, 0x2F6B, 0x087C,\n    0x2F6C, 0x0EE8, 0x2F6D, 0x0EC3, 0x2F6E, 0x0EFC, 0x2F6F, 0x0A74,\n    0x2F70, 0x08D4, 0x2F71, 0x3A41, 0x2F72, 0x0553, 0x2F73, 0x0740,\n    0x2F74, 0x0F71, 0x2F75, 0x0B9B, 0x2F76, 0x0E16, 0x2F77, 0x08B3,\n    0x2F78, 0x0608, 0x2F79, 0x1813, 0x2F7A, 0x0F3D, 0x2F7B, 0x04CB,\n    0x2F7C, 0x0FDD, 0x2F7D, 0x08D5, 0x2F7E, 0x183D, 0x2F7F, 0x08D6,\n    0x2F80, 0x1853, 0x2F81, 0x0CD1, 0x2F82, 0x0A09, 0x2F83, 0x08D7,\n    0x2F84, 0x08B8, 0x2F85, 0x04D3, 0x2F86, 0x0A89, 0x2F87, 0x0AA6,\n    0x2F88, 0x0938, 0x2F89, 0x0821, 0x2F8A, 0x09ED, 0x2F8B, 0x18B2,\n    0x2F8C, 0x194F, 0x2F8D, 0x0BAC, 0x2F8E, 0x0742, 0x2F8F, 0x07E6,\n    0x2F90, 0x04A5, 0x2F91, 0x19EB, 0x2F92, 0x075F, 0x2F93, 0x05AF,\n    0x2F94, 0x0774, 0x2F95, 0x0B69, 0x2F96, 0x0C7E, 0x2F97, 0x1A56,\n    0x2F98, 0x1A59, 0x2F99, 0x058B, 0x2F9A, 0x0A7A, 0x2F9B, 0x0AF8,\n    0x2F9C, 0x0B0D, 0x2F9D, 0x0A0E, 0x2F9E, 0x0902, 0x2F9F, 0x0A0F,\n    0x2FA0, 0x0B62, 0x2FA1, 0x3B4F, 0x2FA2, 0x0F22, 0x2FA3, 0x0CAB,\n    0x2FA4, 0x0D64, 0x2FA5, 0x0F6C, 0x2FA6, 0x06DA, 0x2FA7, 0x0BD5,\n    0x2FA8, 0x0EF3, 0x2FA9, 0x0DDE, 0x2FAA, 0x1BC9, 0x2FAB, 0x1BCB,\n    0x2FAC, 0x04CD, 0x2FAD, 0x21F7, 0x2FAE, 0x0D87, 0x2FAF, 0x0ED8,\n    0x2FB0, 0x05B5, 0x2FB1, 0x1C03, 0x2FB2, 0x1C05, 0x2FB3, 0x053B,\n    0x2FB4, 0x0E17, 0x2FB5, 0x0DE9, 0x2FB6, 0x0D88, 0x2FB7, 0x09EF,\n    0x2FB8, 0x091F, 0x2FB9, 0x07F3, 0x2FBA, 0x0D05, 0x2FBB, 0x080E,\n    0x2FBC, 0x07F4, 0x2FBD, 0x1C6C, 0x2FBE, 0x1C7D, 0x2FBF, 0x1C83,\n    0x2FC0, 0x1C84, 0x2FC1, 0x064E, 0x2FC2, 0x0695, 0x2FC3, 0x0BD7,\n    0x2FC4, 0x1CF6, 0x2FC5, 0x08DB, 0x2FC6, 0x1D01, 0x2FC7, 0x0E91,\n    0x2FC8, 0x340B, 0x2FC9, 0x066A, 0x2FCA, 0x0807, 0x2FCB, 0x1D16,\n    0x2FCC, 0x1D19, 0x2FCD, 0x0C1E, 0x2FCE, 0x0791, 0x2FCF, 0x0ACF,\n    0x2FD0, 0x0D93, 0x2FD1, 0x1D21, 0x2FD2, 0x1D22, 0x2FD3, 0x0F7E,\n    0x2FD4, 0x1D30, 0x2FD5, 0x1D31, 0x3000, 0x0279, 0x3001, 0x027A,\n    0x3002, 0x027B, 0x3003, 0x028F, 0x3004, 0x2074, 0x3005, 0x0291,\n    0x3006, 0x0292, 0x3007, 0x0293, 0x3008, 0x02AA, 0x3009, 0x02AB,\n    0x300A, 0x02AC, 0x300B, 0x02AD, 0x300C, 0x02AE, 0x300D, 0x02AF,\n    0x300E, 0x02B0, 0x300F, 0x02B1, 0x3010, 0x02B2, 0x3011, 0x02B3,\n    0x3012, 0x02DF, 0x3013, 0x02E4, 0x3014, 0x02A4, 0x3015, 0x02A5,\n    0x3016, 0x3F45, 0x3017, 0x3F46, 0x3018, 0x2F61, 0x3019, 0x2F62,\n    0x301C, 0x0299, 0x301D, 0x1DB8, 0x301F, 0x1DB9, 0x3020, 0x1F7A,\n    0x3030, 0x2FBA, 0x3033, 0x2F4C, 0x3034, 0x2F4D, 0x3035, 0x2F4E,\n    0x3036, 0x1F79, 0x303B, 0x2F4A, 0x303C, 0x3F42, 0x303D, 0x2F93,\n    0x3041, 0x034A, 0x3042, 0x034B, 0x3043, 0x034C, 0x3044, 0x034D,\n    0x3045, 0x034E, 0x3046, 0x034F, 0x3047, 0x0350, 0x3048, 0x0351,\n    0x3049, 0x0352, 0x304A, 0x0353, 0x304B, 0x0354, 0x304C, 0x0355,\n    0x304D, 0x0356, 0x304E, 0x0357, 0x304F, 0x0358, 0x3050, 0x0359,\n    0x3051, 0x035A, 0x3052, 0x035B, 0x3053, 0x035C, 0x3054, 0x035D,\n    0x3055, 0x035E, 0x3056, 0x035F, 0x3057, 0x0360, 0x3058, 0x0361,\n    0x3059, 0x0362, 0x305A, 0x0363, 0x305B, 0x0364, 0x305C, 0x0365,\n    0x305D, 0x0366, 0x305E, 0x0367, 0x305F, 0x0368, 0x3060, 0x0369,\n    0x3061, 0x036A, 0x3062, 0x036B, 0x3063, 0x036C, 0x3064, 0x036D,\n    0x3065, 0x036E, 0x3066, 0x036F, 0x3067, 0x0370, 0x3068, 0x0371,\n    0x3069, 0x0372, 0x306A, 0x0373, 0x306B, 0x0374, 0x306C, 0x0375,\n    0x306D, 0x0376, 0x306E, 0x0377, 0x306F, 0x0378, 0x3070, 0x0379,\n    0x3071, 0x037A, 0x3072, 0x037B, 0x3073, 0x037C, 0x3074, 0x037D,\n    0x3075, 0x037E, 0x3076, 0x037F, 0x3077, 0x0380, 0x3078, 0x0381,\n    0x3079, 0x0382, 0x307A, 0x0383, 0x307B, 0x0384, 0x307C, 0x0385,\n    0x307D, 0x0386, 0x307E, 0x0387, 0x307F, 0x0388, 0x3080, 0x0389,\n    0x3081, 0x038A, 0x3082, 0x038B, 0x3083, 0x038C, 0x3084, 0x038D,\n    0x3085, 0x038E, 0x3086, 0x038F, 0x3087, 0x0390, 0x3088, 0x0391,\n    0x3089, 0x0392, 0x308A, 0x0393, 0x308B, 0x0394, 0x308C, 0x0395,\n    0x308D, 0x0396, 0x308E, 0x0397, 0x308F, 0x0398, 0x3090, 0x0399,\n    0x3091, 0x039A, 0x3092, 0x039B, 0x3093, 0x039C, 0x3094, 0x1F16,\n    0x3095, 0x1F17, 0x3096, 0x1F18, 0x3099, 0x3FC6, 0x309A, 0x3FC7,\n    0x309B, 0x0283, 0x309C, 0x0284, 0x309D, 0x028D, 0x309E, 0x028E,\n    0x309F, 0x2F95, 0x30A0, 0x3F4D, 0x30A1, 0x039D, 0x30A2, 0x039E,\n    0x30A3, 0x039F, 0x30A4, 0x03A0, 0x30A5, 0x03A1, 0x30A6, 0x03A2,\n    0x30A7, 0x03A3, 0x30A8, 0x03A4, 0x30A9, 0x03A5, 0x30AA, 0x03A6,\n    0x30AB, 0x03A7, 0x30AC, 0x03A8, 0x30AD, 0x03A9, 0x30AE, 0x03AA,\n    0x30AF, 0x03AB, 0x30B0, 0x03AC, 0x30B1, 0x03AD, 0x30B2, 0x03AE,\n    0x30B3, 0x03AF, 0x30B4, 0x03B0, 0x30B5, 0x03B1, 0x30B6, 0x03B2,\n    0x30B7, 0x03B3, 0x30B8, 0x03B4, 0x30B9, 0x03B5, 0x30BA, 0x03B6,\n    0x30BB, 0x03B7, 0x30BC, 0x03B8, 0x30BD, 0x03B9, 0x30BE, 0x03BA,\n    0x30BF, 0x03BB, 0x30C0, 0x03BC, 0x30C1, 0x03BD, 0x30C2, 0x03BE,\n    0x30C3, 0x03BF, 0x30C4, 0x03C0, 0x30C5, 0x03C1, 0x30C6, 0x03C2,\n    0x30C7, 0x03C3, 0x30C8, 0x03C4, 0x30C9, 0x03C5, 0x30CA, 0x03C6,\n    0x30CB, 0x03C7, 0x30CC, 0x03C8, 0x30CD, 0x03C9, 0x30CE, 0x03CA,\n    0x30CF, 0x03CB, 0x30D0, 0x03CC, 0x30D1, 0x03CD, 0x30D2, 0x03CE,\n    0x30D3, 0x03CF, 0x30D4, 0x03D0, 0x30D5, 0x03D1, 0x30D6, 0x03D2,\n    0x30D7, 0x03D3, 0x30D8, 0x03D4, 0x30D9, 0x03D5, 0x30DA, 0x03D6,\n    0x30DB, 0x03D7, 0x30DC, 0x03D8, 0x30DD, 0x03D9, 0x30DE, 0x03DA,\n    0x30DF, 0x03DB, 0x30E0, 0x03DC, 0x30E1, 0x03DD, 0x30E2, 0x03DE,\n    0x30E3, 0x03DF, 0x30E4, 0x03E0, 0x30E5, 0x03E1, 0x30E6, 0x03E2,\n    0x30E7, 0x03E3, 0x30E8, 0x03E4, 0x30E9, 0x03E5, 0x30EA, 0x03E6,\n    0x30EB, 0x03E7, 0x30EC, 0x03E8, 0x30ED, 0x03E9, 0x30EE, 0x03EA,\n    0x30EF, 0x03EB, 0x30F0, 0x03EC, 0x30F1, 0x03ED, 0x30F2, 0x03EE,\n    0x30F3, 0x03EF, 0x30F4, 0x03F0, 0x30F5, 0x03F1, 0x30F6, 0x03F2,\n    0x30F7, 0x2079, 0x30F8, 0x207A, 0x30F9, 0x207B, 0x30FA, 0x207C,\n    0x30FB, 0x027E, 0x30FC, 0x0294, 0x30FD, 0x028B, 0x30FE, 0x028C,\n    0x30FF, 0x3F43, 0x3190, 0x3F9B, 0x3191, 0x3F9C, 0x3192, 0x3F9D,\n    0x3193, 0x3F9E, 0x3194, 0x3F9F, 0x3195, 0x3FA0, 0x3196, 0x3FA1,\n    0x3197, 0x3FA2, 0x3198, 0x3FA3, 0x3199, 0x3FA4, 0x319A, 0x3FA5,\n    0x319B, 0x3FA6, 0x319C, 0x3FA7, 0x319D, 0x3FA8, 0x319E, 0x3FA9,\n    0x319F, 0x3FAA, 0x31F0, 0x3F6C, 0x31F1, 0x3F6D, 0x31F2, 0x3F6E,\n    0x31F3, 0x3F6F, 0x31F4, 0x3F70, 0x31F5, 0x3F71, 0x31F6, 0x3F72,\n    0x31F7, 0x3F73, 0x31F8, 0x3F74, 0x31F9, 0x3F75, 0x31FA, 0x3F77,\n    0x31FB, 0x3F78, 0x31FC, 0x3F79, 0x31FD, 0x3F7A, 0x31FE, 0x3F7B,\n    0x31FF, 0x3F7C, 0x3220, 0x278E, 0x3221, 0x278F, 0x3222, 0x2790,\n    0x3223, 0x2791, 0x3224, 0x2792, 0x3225, 0x2793, 0x3226, 0x2794,\n    0x3227, 0x2795, 0x3228, 0x2796, 0x3229, 0x2797, 0x322A, 0x2006,\n    0x322B, 0x2007, 0x322C, 0x2008, 0x322D, 0x2009, 0x322E, 0x200A,\n    0x322F, 0x200B, 0x3230, 0x2005, 0x3231, 0x1DC2, 0x3232, 0x1DC3,\n    0x3233, 0x1FCF, 0x3234, 0x1FCD, 0x3235, 0x1FD4, 0x3236, 0x1FD3,\n    0x3237, 0x200C, 0x3238, 0x1FCE, 0x3239, 0x1DC4, 0x323A, 0x1FD7,\n    0x323B, 0x1FD5, 0x323C, 0x1FD0, 0x323D, 0x1FCB, 0x323E, 0x1FD2,\n    0x323F, 0x1FCC, 0x3240, 0x1FD6, 0x3241, 0x200D, 0x3242, 0x1FD1,\n    0x3243, 0x1FCA, 0x3251, 0x1F9B, 0x3252, 0x1FA6, 0x3253, 0x1FA7,\n    0x3254, 0x1FA8, 0x3255, 0x1FA9, 0x3256, 0x1FAA, 0x3257, 0x1FAB,\n    0x3258, 0x1FAC, 0x3259, 0x1FAD, 0x325A, 0x1FAE, 0x325B, 0x1FAF,\n    0x325C, 0x2804, 0x325D, 0x2805, 0x325E, 0x2806, 0x325F, 0x2807,\n    0x3280, 0x28DD, 0x3281, 0x28DE, 0x3282, 0x28DF, 0x3283, 0x28E0,\n    0x3284, 0x28E1, 0x3285, 0x28E2, 0x3286, 0x28E3, 0x3287, 0x28E4,\n    0x3288, 0x28E5, 0x3289, 0x28E6, 0x328A, 0x28E8, 0x328B, 0x28E9,\n    0x328C, 0x28EA, 0x328D, 0x28EB, 0x328E, 0x28EC, 0x328F, 0x28ED,\n    0x3290, 0x28E7, 0x3291, 0x1FE1, 0x3292, 0x1FE0, 0x3293, 0x1FE2,\n    0x3294, 0x1FDC, 0x3295, 0x28FF, 0x3296, 0x1FE5, 0x3297, 0x28FC,\n    0x3298, 0x1FDE, 0x3299, 0x201F, 0x329A, 0x28F9, 0x329B, 0x28F8,\n    0x329C, 0x28FE, 0x329D, 0x207F, 0x329E, 0x1FFF, 0x329F, 0x28EF,\n    0x32A0, 0x28F6, 0x32A1, 0x28F7, 0x32A2, 0x28FB, 0x32A3, 0x28FA,\n    0x32A4, 0x1DBD, 0x32A5, 0x1DBE, 0x32A6, 0x1DBF, 0x32A7, 0x1DC0,\n    0x32A8, 0x1DC1, 0x32A9, 0x1FDA, 0x32AA, 0x1FDD, 0x32AB, 0x1FDF,\n    0x32AC, 0x1FE3, 0x32AD, 0x1FD9, 0x32AE, 0x1FE4, 0x32AF, 0x1FDB,\n    0x32B0, 0x1FD8, 0x32B1, 0x2808, 0x32B2, 0x2809, 0x32B3, 0x280A,\n    0x32B4, 0x280B, 0x32B5, 0x280C, 0x32B6, 0x280D, 0x32B7, 0x280E,\n    0x32B8, 0x280F, 0x32B9, 0x2810, 0x32BA, 0x2811, 0x32BB, 0x2812,\n    0x32BC, 0x2813, 0x32BD, 0x2814, 0x32BE, 0x2815, 0x32BF, 0x2816,\n    0x32D0, 0x28AD, 0x32D1, 0x28AE, 0x32D2, 0x28AF, 0x32D3, 0x28B0,\n    0x32D4, 0x28B1, 0x32D5, 0x28B2, 0x32D6, 0x28B3, 0x32D7, 0x28B4,\n    0x32D8, 0x28B5, 0x32D9, 0x28B6, 0x32DA, 0x28B7, 0x32DB, 0x28B8,\n    0x32DC, 0x28B9, 0x32DD, 0x28BA, 0x32DE, 0x28BB, 0x32DF, 0x28BC,\n    0x32E0, 0x28BD, 0x32E1, 0x28BE, 0x32E2, 0x28BF, 0x32E3, 0x28C0,\n    0x32E4, 0x28C1, 0x32E5, 0x28C2, 0x32E6, 0x28C3, 0x32E7, 0x28C4,\n    0x32E8, 0x28C5, 0x32E9, 0x28C6, 0x32EA, 0x28C7, 0x32EB, 0x28C8,\n    0x32EC, 0x28C9, 0x32ED, 0x28CA, 0x32EE, 0x28CB, 0x32EF, 0x28CC,\n    0x32F0, 0x28CD, 0x32F1, 0x28CE, 0x32F2, 0x28CF, 0x32F3, 0x28D0,\n    0x32F4, 0x28D1, 0x32F5, 0x28D2, 0x32F6, 0x28D3, 0x32F7, 0x28D4,\n    0x32F8, 0x28D5, 0x32F9, 0x28D6, 0x32FA, 0x28D7, 0x32FB, 0x28D8,\n    0x32FC, 0x28D9, 0x32FD, 0x28DA, 0x32FE, 0x28DB, 0x3300, 0x1F70,\n    0x3301, 0x2E62, 0x3302, 0x2E63, 0x3303, 0x1F6A, 0x3304, 0x2E64,\n    0x3305, 0x1FF7, 0x3306, 0x2E65, 0x3307, 0x2E69, 0x3308, 0x2E67,\n    0x3309, 0x2E6C, 0x330A, 0x2E6A, 0x330B, 0x2E6E, 0x330C, 0x2E70,\n    0x330D, 0x1DAB, 0x330E, 0x2E71, 0x330F, 0x2E72, 0x3310, 0x2E73,\n    0x3311, 0x2E74, 0x3312, 0x2E75, 0x3313, 0x2E76, 0x3314, 0x1DA2,\n    0x3315, 0x1F69, 0x3316, 0x1F67, 0x3317, 0x2E78, 0x3318, 0x1F68,\n    0x3319, 0x2E7A, 0x331A, 0x2E7C, 0x331B, 0x2E7D, 0x331C, 0x2E7E,\n    0x331D, 0x2E7F, 0x331E, 0x1F73, 0x331F, 0x2E80, 0x3320, 0x2E81,\n    0x3321, 0x2E82, 0x3322, 0x1F66, 0x3323, 0x1F6B, 0x3324, 0x2E83,\n    0x3325, 0x2E85, 0x3326, 0x1DAC, 0x3327, 0x1DA6, 0x3328, 0x2E88,\n    0x3329, 0x2E89, 0x332A, 0x1F74, 0x332B, 0x1DAE, 0x332D, 0x2E8B,\n    0x332E, 0x2E8E, 0x332F, 0x2E8F, 0x3330, 0x2E90, 0x3331, 0x1F71,\n    0x3332, 0x2E91, 0x3333, 0x2087, 0x3334, 0x2E94, 0x3335, 0x2E95,\n    0x3336, 0x1DA8, 0x3337, 0x2E9A, 0x3338, 0x2E9C, 0x3339, 0x1F6E,\n    0x333A, 0x2E9D, 0x333B, 0x1F6F, 0x333C, 0x2E96, 0x333D, 0x2E9E,\n    0x333E, 0x2EA0, 0x333F, 0x2EA1, 0x3340, 0x2EA2, 0x3341, 0x2E9F,\n    0x3342, 0x1F6D, 0x3343, 0x2EA3, 0x3344, 0x2EA4, 0x3345, 0x2EA5,\n    0x3346, 0x2EA6, 0x3347, 0x1F72, 0x3348, 0x2EA7, 0x3349, 0x1DA1,\n    0x334A, 0x1DAF, 0x334B, 0x2EA8, 0x334C, 0x2EA9, 0x334D, 0x1DA4,\n    0x334E, 0x2088, 0x334F, 0x2EAA, 0x3350, 0x2EAB, 0x3351, 0x1DA9,\n    0x3352, 0x2EAE, 0x3353, 0x2EB2, 0x3354, 0x2EAF, 0x3355, 0x2EB3,\n    0x3356, 0x2EB4, 0x3357, 0x1F6C, 0x3371, 0x2E55, 0x337B, 0x2083,\n    0x337C, 0x1DC7, 0x337D, 0x1DC6, 0x337E, 0x1DC5, 0x337F, 0x1F76,\n    0x3385, 0x1F5F, 0x3386, 0x1F60, 0x3387, 0x1F61, 0x3388, 0x2000,\n    0x3389, 0x2001, 0x338D, 0x2E58, 0x338E, 0x1DB4, 0x338F, 0x1DB5,\n    0x3390, 0x1F63, 0x3396, 0x1F65, 0x3397, 0x1F58, 0x3398, 0x1F5A,\n    0x339B, 0x2E59, 0x339C, 0x1DB1, 0x339D, 0x1DB2, 0x339E, 0x1DB3,\n    0x339F, 0x1FFA, 0x33A0, 0x1F54, 0x33A1, 0x1DB7, 0x33A2, 0x1F55,\n    0x33A3, 0x1FFB, 0x33A4, 0x1F56, 0x33A5, 0x1F57, 0x33A6, 0x1FFC,\n    0x33B0, 0x1F5E, 0x33B1, 0x1F5D, 0x33B2, 0x1F5C, 0x33B3, 0x1F5B,\n    0x33C2, 0x2E50, 0x33C4, 0x1DB6, 0x33C8, 0x2002, 0x33CB, 0x1F62,\n    0x33CC, 0x1FF6, 0x33CD, 0x1DBB, 0x33D4, 0x1F64, 0x33D7, 0x2E5D,\n    0x33D8, 0x2E5E, 0x33DA, 0x2E4B, 0x3402, 0x3582, 0x3405, 0x3C1B,\n    0x3406, 0x435A, 0x3427, 0x3656, 0x342C, 0x435E, 0x342E, 0x3788,\n    0x3468, 0x36DF, 0x346A, 0x4375, 0x3488, 0x3C52, 0x3492, 0x438E,\n    0x34B5, 0x4199, 0x34BC, 0x4397, 0x34C1, 0x47D0, 0x34C7, 0x439B,\n    0x34DB, 0x3C41, 0x351F, 0x3629, 0x353E, 0x371E, 0x355D, 0x43BD,\n    0x355E, 0x43BE, 0x3563, 0x43C0, 0x356E, 0x43C4, 0x35A6, 0x43D9,\n    0x35A8, 0x43DB, 0x35C5, 0x43E1, 0x35DA, 0x43EA, 0x35DE, 0x4E63,\n    0x35F4, 0x43F3, 0x3605, 0x43FA, 0x3614, 0x4ABB, 0x364A, 0x4421,\n    0x3691, 0x4441, 0x3696, 0x4445, 0x3699, 0x4443, 0x36CF, 0x4456,\n    0x3761, 0x4478, 0x3762, 0x4479, 0x376B, 0x447D, 0x376C, 0x447C,\n    0x3775, 0x4480, 0x378D, 0x361A, 0x37C1, 0x448E, 0x37E2, 0x372B,\n    0x37E8, 0x44A2, 0x37F4, 0x44A5, 0x37FD, 0x44A8, 0x3800, 0x44AA,\n    0x382F, 0x44B4, 0x3836, 0x44B5, 0x3840, 0x44B6, 0x385C, 0x44BA,\n    0x3861, 0x44BC, 0x38A1, 0x4ECB, 0x38AD, 0x4ABC, 0x38FA, 0x361C,\n    0x3917, 0x44D9, 0x391A, 0x44DC, 0x396F, 0x44EB, 0x39A4, 0x4E9A,\n    0x39B8, 0x4E9B, 0x3A5C, 0x4E9F, 0x3A6E, 0x4531, 0x3A73, 0x4534,\n    0x3A85, 0x4EAE, 0x3AC4, 0x4EA7, 0x3ACB, 0x4EA8, 0x3AD6, 0x4543,\n    0x3AD7, 0x455E, 0x3AEA, 0x454D, 0x3AF3, 0x3C40, 0x3B0E, 0x4558,\n    0x3B1A, 0x455C, 0x3B1C, 0x455D, 0x3B22, 0x3C49, 0x3B6D, 0x458C,\n    0x3B77, 0x4585, 0x3B87, 0x45A2, 0x3B88, 0x368D, 0x3B8D, 0x45A4,\n    0x3BA4, 0x45AA, 0x3BB6, 0x420E, 0x3BC3, 0x420F, 0x3BCD, 0x45B8,\n    0x3BF0, 0x45C9, 0x3BF3, 0x4EB7, 0x3C0F, 0x4217, 0x3C26, 0x45DF,\n    0x3CC3, 0x45FC, 0x3CD2, 0x4601, 0x3D11, 0x4625, 0x3D1E, 0x4630,\n    0x3D31, 0x4EBE, 0x3D4E, 0x1DE7, 0x3D64, 0x464A, 0x3D9A, 0x4658,\n    0x3DC0, 0x466A, 0x3DCC, 0x4ABD, 0x3DD4, 0x466F, 0x3E05, 0x467B,\n    0x3E3F, 0x4248, 0x3E40, 0x4ECA, 0x3E60, 0x468B, 0x3E66, 0x468D,\n    0x3E68, 0x468E, 0x3E83, 0x4695, 0x3E8A, 0x3C43, 0x3E94, 0x469B,\n    0x3EDA, 0x3C48, 0x3F57, 0x46CB, 0x3F72, 0x4258, 0x3F75, 0x46D9,\n    0x3F77, 0x46DB, 0x3FAE, 0x46ED, 0x3FB1, 0x3754, 0x3FC9, 0x46F8,\n    0x3FD7, 0x46FD, 0x3FDC, 0x4ABE, 0x4039, 0x470F, 0x4058, 0x4716,\n    0x4093, 0x3C4C, 0x4103, 0x3C4F, 0x4105, 0x473B, 0x4148, 0x4747,\n    0x414F, 0x474A, 0x4163, 0x474E, 0x41B4, 0x475D, 0x41BF, 0x4760,\n    0x41E6, 0x476B, 0x41EE, 0x476F, 0x41F3, 0x476C, 0x4207, 0x4776,\n    0x420E, 0x4779, 0x4264, 0x3760, 0x4293, 0x3C50, 0x42C6, 0x479F,\n    0x42D6, 0x47AA, 0x42DD, 0x47AE, 0x4302, 0x47BC, 0x432B, 0x47C9,\n    0x4343, 0x47CB, 0x43EE, 0x47F7, 0x43F0, 0x47FA, 0x4408, 0x4800,\n    0x440C, 0x3C42, 0x4417, 0x4802, 0x441C, 0x4803, 0x4422, 0x4805,\n    0x4453, 0x3773, 0x445B, 0x42A4, 0x4476, 0x481C, 0x447A, 0x481D,\n    0x4491, 0x4823, 0x44B3, 0x483E, 0x44BE, 0x483C, 0x44D4, 0x483D,\n    0x4508, 0x485C, 0x450D, 0x4858, 0x4525, 0x377E, 0x4543, 0x486C,\n    0x457A, 0x3C4B, 0x459D, 0x42D4, 0x45B8, 0x48A0, 0x45BE, 0x4ABF,\n    0x45E5, 0x48BA, 0x45EA, 0x42D9, 0x460F, 0x48CA, 0x4610, 0x4AC0,\n    0x4641, 0x48D8, 0x4665, 0x3C4E, 0x46A1, 0x48E9, 0x46AE, 0x3C51,\n    0x46AF, 0x48ED, 0x470C, 0x4902, 0x471F, 0x4EFB, 0x4764, 0x4918,\n    0x47E6, 0x3790, 0x47FD, 0x4924, 0x4816, 0x492E, 0x481E, 0x4F01,\n    0x4844, 0x42F5, 0x484E, 0x493A, 0x48B5, 0x495B, 0x49B0, 0x431F,\n    0x49E7, 0x49D2, 0x49FA, 0x49D6, 0x4A04, 0x49DB, 0x4A29, 0x49DE,\n    0x4ABC, 0x49F6, 0x4B38, 0x35DF, 0x4B3B, 0x4A0E, 0x4B7E, 0x4AC1,\n    0x4BC2, 0x4A33, 0x4BCA, 0x4A35, 0x4BD2, 0x4A37, 0x4BE8, 0x3C46,\n    0x4C17, 0x4334, 0x4C20, 0x4A48, 0x4C38, 0x4AC2, 0x4CC4, 0x4A84,\n    0x4CD1, 0x4A87, 0x4CE1, 0x4AC3, 0x4D07, 0x4A9B, 0x4D77, 0x4AAB,\n    0x4E00, 0x04B0, 0x4E01, 0x0BB8, 0x4E02, 0x4352, 0x4E03, 0x08E3,\n    0x4E04, 0x37D8, 0x4E05, 0x37D9, 0x4E07, 0x0EAA, 0x4E08, 0x09CE,\n    0x4E09, 0x087E, 0x4E0A, 0x09CD, 0x4E0B, 0x053C, 0x4E0C, 0x4AC4,\n    0x4E0D, 0x0DC6, 0x4E0E, 0x0F29, 0x4E0F, 0x4353, 0x4E10, 0x0FFB,\n    0x4E11, 0x04D1, 0x4E12, 0x4354, 0x4E14, 0x05CC, 0x4E15, 0x0FFC,\n    0x4E16, 0x0A48, 0x4E17, 0x10D7, 0x4E18, 0x0670, 0x4E19, 0x0E0A,\n    0x4E1E, 0x09CF, 0x4E1F, 0x37DA, 0x4E21, 0x0F86, 0x4E23, 0x4AC5,\n    0x4E24, 0x4AC6, 0x4E26, 0x0E12, 0x4E28, 0x20B3, 0x4E29, 0x4355,\n    0x4E2A, 0x0FFD, 0x4E2B, 0x37DB, 0x4E2C, 0x374D, 0x4E2D, 0x0BA4,\n    0x4E2E, 0x4356, 0x4E2F, 0x37DC, 0x4E30, 0x37DD, 0x4E31, 0x0FFE,\n    0x4E32, 0x06F2, 0x4E36, 0x0FFF, 0x4E37, 0x369D, 0x4E38, 0x0619,\n    0x4E39, 0x0B6E, 0x4E3B, 0x0913, 0x4E3C, 0x1000, 0x4E3F, 0x1001,\n    0x4E40, 0x37DE, 0x4E41, 0x37DF, 0x4E42, 0x1002, 0x4E43, 0x0CEB,\n    0x4E44, 0x37E0, 0x4E45, 0x0671, 0x4E47, 0x4357, 0x4E48, 0x372E,\n    0x4E4B, 0x0CED, 0x4E4D, 0x0CBB, 0x4E4E, 0x0777, 0x4E4F, 0x0E61,\n    0x4E51, 0x4359, 0x4E55, 0x1950, 0x4E56, 0x1003, 0x4E57, 0x09D0,\n    0x4E58, 0x1004, 0x4E59, 0x0535, 0x4E5A, 0x37E1, 0x4E5D, 0x06DD,\n    0x4E5E, 0x07A4, 0x4E5F, 0x0EF5, 0x4E62, 0x1233, 0x4E69, 0x435C,\n    0x4E71, 0x0F5A, 0x4E73, 0x0CD5, 0x4E79, 0x4AC7, 0x4E7E, 0x05E1,\n    0x4E7F, 0x37E2, 0x4E80, 0x064F, 0x4E82, 0x1005, 0x4E85, 0x1006,\n    0x4E86, 0x0F83, 0x4E88, 0x0F27, 0x4E89, 0x0AEA, 0x4E8A, 0x1008,\n    0x4E8B, 0x08C4, 0x4E8C, 0x0CCB, 0x4E8D, 0x37E3, 0x4E8E, 0x100B,\n    0x4E91, 0x04E0, 0x4E92, 0x0793, 0x4E94, 0x0792, 0x4E95, 0x04AA,\n    0x4E96, 0x37E4, 0x4E98, 0x0FF1, 0x4E99, 0x0FF0, 0x4E9B, 0x0823,\n    0x4E9C, 0x0465, 0x4E9D, 0x435D, 0x4E9E, 0x100C, 0x4E9F, 0x100D,\n    0x4EA0, 0x100E, 0x4EA1, 0x0E62, 0x4EA2, 0x100F, 0x4EA4, 0x07A6,\n    0x4EA5, 0x04AB, 0x4EA6, 0x0EA0, 0x4EA8, 0x0696, 0x4EAB, 0x0697,\n    0x4EAC, 0x0698, 0x4EAD, 0x0BFE, 0x4EAE, 0x0F84, 0x4EB0, 0x1010,\n    0x4EB3, 0x1011, 0x4EB6, 0x1012, 0x4EB9, 0x37E5, 0x4EBA, 0x0A13,\n    0x4EBB, 0x3620, 0x4EBC, 0x435F, 0x4EC0, 0x0944, 0x4EC1, 0x0A14,\n    0x4EC2, 0x1017, 0x4EC3, 0x4360, 0x4EC4, 0x1015, 0x4EC6, 0x1016,\n    0x4EC7, 0x0672, 0x4EC8, 0x4361, 0x4ECA, 0x0813, 0x4ECB, 0x0570,\n    0x4ECD, 0x1014, 0x4ECE, 0x1013, 0x4ECF, 0x0DF9, 0x4ED0, 0x37E6,\n    0x4ED4, 0x0894, 0x4ED5, 0x0893, 0x4ED6, 0x0B1E, 0x4ED7, 0x1018,\n    0x4ED8, 0x0DC7, 0x4ED9, 0x0A8B, 0x4EDA, 0x4363, 0x4EDD, 0x0290,\n    0x4EDE, 0x1019, 0x4EDF, 0x101B, 0x4EE0, 0x37E7, 0x4EE1, 0x20B4,\n    0x4EE3, 0x0B45, 0x4EE4, 0x0FA9, 0x4EE5, 0x048E, 0x4EEB, 0x4362,\n    0x4EED, 0x101A, 0x4EEE, 0x053E, 0x4EF0, 0x06BC, 0x4EF1, 0x4364,\n    0x4EF2, 0x0BA5, 0x4EF3, 0x4AC8, 0x4EF5, 0x4365, 0x4EF6, 0x0745,\n    0x4EF7, 0x101C, 0x4EFB, 0x0CDA, 0x4EFC, 0x20B5, 0x4EFD, 0x37E8,\n    0x4EFF, 0x37E9, 0x4F00, 0x20B6, 0x4F01, 0x0627, 0x4F03, 0x20B7,\n    0x4F09, 0x101D, 0x4F0A, 0x048F, 0x4F0B, 0x37EA, 0x4F0C, 0x4AC9,\n    0x4F0D, 0x0794, 0x4F0E, 0x0628, 0x4F0F, 0x0DEC, 0x4F10, 0x0D46,\n    0x4F11, 0x0673, 0x4F15, 0x37EB, 0x4F16, 0x4366, 0x4F19, 0x4ACA,\n    0x4F1A, 0x0571, 0x4F1C, 0x1040, 0x4F1D, 0x0C3B, 0x4F2B, 0x4ACB,\n    0x4F2E, 0x4ACC, 0x4F2F, 0x0D22, 0x4F30, 0x101F, 0x4F31, 0x4ACD,\n    0x4F34, 0x0D50, 0x4F36, 0x0FAA, 0x4F37, 0x4368, 0x4F38, 0x09F3,\n    0x4F39, 0x20B8, 0x4F3A, 0x0895, 0x4F3B, 0x37ED, 0x4F3C, 0x08C5,\n    0x4F3D, 0x0540, 0x4F3E, 0x4369, 0x4F43, 0x0BED, 0x4F46, 0x0B60,\n    0x4F47, 0x1023, 0x4F48, 0x418B, 0x4F49, 0x37EE, 0x4F4D, 0x0490,\n    0x4F4E, 0x0BFF, 0x4F4F, 0x0945, 0x4F50, 0x0824, 0x4F51, 0x0F0E,\n    0x4F53, 0x0B2E, 0x4F54, 0x37EF, 0x4F55, 0x053F, 0x4F56, 0x20B9,\n    0x4F57, 0x1022, 0x4F58, 0x436A, 0x4F59, 0x0F28, 0x4F5A, 0x101E,\n    0x4F5B, 0x1020, 0x4F5C, 0x085E, 0x4F5D, 0x1021, 0x4F5E, 0x11D3,\n    0x4F5F, 0x418C, 0x4F60, 0x37EC, 0x4F64, 0x4367, 0x4F69, 0x1029,\n    0x4F6A, 0x418D, 0x4F6C, 0x418E, 0x4F6F, 0x102C, 0x4F70, 0x102A,\n    0x4F73, 0x0542, 0x4F75, 0x0E0B, 0x4F76, 0x1024, 0x4F77, 0x436C,\n    0x4F78, 0x436D, 0x4F7A, 0x37F0, 0x4F7B, 0x1028, 0x4F7C, 0x07A7,\n    0x4F7D, 0x37F1, 0x4F7E, 0x37F2, 0x4F7F, 0x0896, 0x4F82, 0x436E,\n    0x4F83, 0x05E2, 0x4F84, 0x4ACE, 0x4F85, 0x436F, 0x4F86, 0x102D,\n    0x4F88, 0x1025, 0x4F8A, 0x20BB, 0x4F8B, 0x0FAB, 0x4F8D, 0x08C6,\n    0x4F8F, 0x1026, 0x4F91, 0x102B, 0x4F92, 0x20BA, 0x4F94, 0x20BD,\n    0x4F96, 0x102E, 0x4F97, 0x37F3, 0x4F98, 0x1027, 0x4F9A, 0x20BC,\n    0x4F9B, 0x0699, 0x4F9D, 0x0491, 0x4F9E, 0x4ACF, 0x4FA0, 0x069A,\n    0x4FA1, 0x0541, 0x4FAB, 0x11D4, 0x4FAD, 0x0EA7, 0x4FAE, 0x0DE0,\n    0x4FAF, 0x07A8, 0x4FB2, 0x4371, 0x4FB5, 0x09F5, 0x4FB6, 0x0F7F,\n    0x4FB7, 0x4AD0, 0x4FBE, 0x37F4, 0x4FBF, 0x0E28, 0x4FC2, 0x070E,\n    0x4FC3, 0x0B05, 0x4FC4, 0x0564, 0x4FC5, 0x4372, 0x4FC9, 0x20AC,\n    0x4FCA, 0x095D, 0x4FCB, 0x4373, 0x4FCD, 0x20BE, 0x4FCE, 0x1032,\n    0x4FCF, 0x37F5, 0x4FD0, 0x1037, 0x4FD1, 0x1035, 0x4FD2, 0x4374,\n    0x4FD3, 0x3C2F, 0x4FD4, 0x1030, 0x4FD7, 0x0B0F, 0x4FD8, 0x1033,\n    0x4FDA, 0x1036, 0x4FDB, 0x1034, 0x4FDD, 0x0E2D, 0x4FDF, 0x1031,\n    0x4FE0, 0x1DEC, 0x4FE1, 0x09F4, 0x4FE3, 0x0EA1, 0x4FE4, 0x1038,\n    0x4FE5, 0x1039, 0x4FE6, 0x4370, 0x4FEE, 0x092E, 0x4FEF, 0x1046,\n    0x4FF1, 0x35A3, 0x4FF2, 0x4376, 0x4FF3, 0x0D06, 0x4FF5, 0x0DA8,\n    0x4FF6, 0x1041, 0x4FF8, 0x0E40, 0x4FFA, 0x0536, 0x4FFD, 0x37F6,\n    0x4FFE, 0x1045, 0x4FFF, 0x20C1, 0x5000, 0x37F7, 0x5001, 0x37F8,\n    0x5002, 0x4F4B, 0x5004, 0x4AD1, 0x5005, 0x103F, 0x5006, 0x1048,\n    0x5009, 0x0AD4, 0x500B, 0x0778, 0x500C, 0x4AD2, 0x500D, 0x0D12,\n    0x500E, 0x418F, 0x500F, 0x1600, 0x5010, 0x37F9, 0x5011, 0x1047,\n    0x5012, 0x0C57, 0x5013, 0x4377, 0x5014, 0x103C, 0x5016, 0x07AA,\n    0x5018, 0x4190, 0x5019, 0x07A9, 0x501A, 0x103A, 0x501B, 0x37FA,\n    0x501C, 0x4378, 0x501E, 0x20C2, 0x501F, 0x0906, 0x5021, 0x1042,\n    0x5022, 0x20C0, 0x5023, 0x0E3F, 0x5024, 0x0B8B, 0x5025, 0x103E,\n    0x5026, 0x0747, 0x5027, 0x37FB, 0x5028, 0x103B, 0x5029, 0x1043,\n    0x502A, 0x103D, 0x502B, 0x0F99, 0x502C, 0x1044, 0x502D, 0x0FE7,\n    0x502E, 0x37FC, 0x5036, 0x06DE, 0x5039, 0x0746, 0x503B, 0x3800,\n    0x5040, 0x20BF, 0x5041, 0x4191, 0x5042, 0x20C5, 0x5043, 0x1049,\n    0x5046, 0x20C3, 0x5047, 0x104A, 0x5048, 0x104E, 0x5049, 0x0492,\n    0x504C, 0x4AD3, 0x504E, 0x4379, 0x504F, 0x0E20, 0x5050, 0x104D,\n    0x5053, 0x437A, 0x5055, 0x104C, 0x5056, 0x1050, 0x5057, 0x37FD,\n    0x505A, 0x104F, 0x505C, 0x0C00, 0x505F, 0x4AD4, 0x5062, 0x4AD5,\n    0x5063, 0x437B, 0x5065, 0x0748, 0x5066, 0x37FE, 0x506A, 0x37FF,\n    0x506C, 0x1051, 0x5070, 0x20C4, 0x5072, 0x08F1, 0x5074, 0x0B06,\n    0x5075, 0x0C01, 0x5076, 0x06EE, 0x5077, 0x4AD6, 0x5078, 0x1052,\n    0x507D, 0x0650, 0x5080, 0x1053, 0x5085, 0x1055, 0x5088, 0x437D,\n    0x508D, 0x0E63, 0x508E, 0x4AD7, 0x508F, 0x3801, 0x5091, 0x073C,\n    0x5092, 0x437E, 0x5093, 0x437F, 0x5094, 0x20C6, 0x5095, 0x4380,\n    0x5096, 0x3802, 0x5098, 0x087F, 0x5099, 0x0D8B, 0x509A, 0x1054,\n    0x509C, 0x3803, 0x509E, 0x4AD8, 0x50A2, 0x4AD9, 0x50A3, 0x437C,\n    0x50AA, 0x4381, 0x50AC, 0x0835, 0x50AD, 0x0F2D, 0x50B1, 0x4383,\n    0x50B2, 0x1057, 0x50B3, 0x105A, 0x50B4, 0x1056, 0x50B5, 0x0834,\n    0x50B7, 0x0987, 0x50BA, 0x4384, 0x50BB, 0x4385, 0x50BE, 0x070F,\n    0x50C2, 0x105B, 0x50C3, 0x4ADA, 0x50C4, 0x4386, 0x50C5, 0x06C7,\n    0x50C7, 0x4387, 0x50C9, 0x1058, 0x50CA, 0x1059, 0x50CC, 0x3804,\n    0x50CD, 0x0C87, 0x50CE, 0x438A, 0x50CF, 0x0AFE, 0x50D0, 0x4193,\n    0x50D1, 0x069B, 0x50D4, 0x438C, 0x50D5, 0x0E7B, 0x50D6, 0x105C,\n    0x50D8, 0x20C8, 0x50D9, 0x3C30, 0x50DA, 0x0F85, 0x50DE, 0x105D,\n    0x50E1, 0x438D, 0x50E3, 0x1060, 0x50E5, 0x105E, 0x50E6, 0x3805,\n    0x50E7, 0x0AD0, 0x50E8, 0x4ADB, 0x50E9, 0x3806, 0x50ED, 0x105F,\n    0x50EE, 0x1061, 0x50EF, 0x3807, 0x50F0, 0x3C31, 0x50F1, 0x4ADC,\n    0x50F2, 0x4192, 0x50F3, 0x4388, 0x50F4, 0x20C7, 0x50F5, 0x1063,\n    0x50F9, 0x1062, 0x50FB, 0x0E18, 0x50FE, 0x4ADD, 0x5100, 0x0651,\n    0x5101, 0x1065, 0x5102, 0x1066, 0x5103, 0x4195, 0x5104, 0x052F,\n    0x5106, 0x4194, 0x5107, 0x4ADE, 0x5108, 0x3808, 0x5109, 0x1064,\n    0x510B, 0x3809, 0x510C, 0x4ADF, 0x510D, 0x4AE0, 0x510E, 0x4AE1,\n    0x5110, 0x380A, 0x5112, 0x0920, 0x5114, 0x1069, 0x5115, 0x1068,\n    0x5116, 0x1067, 0x5117, 0x4390, 0x5118, 0x102F, 0x511A, 0x106A,\n    0x511B, 0x380B, 0x511E, 0x380C, 0x511F, 0x0988, 0x5121, 0x106B,\n    0x512A, 0x0F0F, 0x5132, 0x0EE5, 0x5133, 0x4AE2, 0x5135, 0x4196,\n    0x5137, 0x106D, 0x5138, 0x4AE3, 0x513A, 0x106C, 0x513B, 0x106F,\n    0x513C, 0x106E, 0x513F, 0x1070, 0x5140, 0x1071, 0x5141, 0x04B8,\n    0x5143, 0x0769, 0x5144, 0x0711, 0x5145, 0x0946, 0x5146, 0x0BB9,\n    0x5147, 0x069C, 0x5148, 0x0A8C, 0x5149, 0x07AB, 0x514A, 0x20C9,\n    0x514B, 0x0800, 0x514C, 0x1073, 0x514D, 0x0ED4, 0x514E, 0x0C40,\n    0x5150, 0x08C7, 0x5152, 0x1072, 0x5154, 0x1074, 0x5155, 0x4197,\n    0x5157, 0x4198, 0x515A, 0x0C58, 0x515C, 0x05D3, 0x515F, 0x380D,\n    0x5160, 0x4392, 0x5162, 0x1075, 0x5164, 0x20CA, 0x5165, 0x0CD6,\n    0x5167, 0x368E, 0x5168, 0x0AB6, 0x5169, 0x1077, 0x516A, 0x1078,\n    0x516B, 0x0D40, 0x516C, 0x07AC, 0x516D, 0x0FE1, 0x516E, 0x1079,\n    0x5171, 0x069E, 0x5173, 0x4394, 0x5174, 0x4AE4, 0x5175, 0x0E0C,\n    0x5176, 0x0B16, 0x5177, 0x06E9, 0x5178, 0x0C2F, 0x5179, 0x3779,\n    0x517B, 0x47D9, 0x517C, 0x0749, 0x5180, 0x107A, 0x5182, 0x107B,\n    0x5183, 0x4395, 0x5184, 0x4AE5, 0x5185, 0x0CBA, 0x5186, 0x0501,\n    0x5189, 0x107E, 0x518A, 0x086D, 0x518B, 0x4396, 0x518C, 0x107D,\n    0x518D, 0x0836, 0x518F, 0x107F, 0x5190, 0x185B, 0x5191, 0x1080,\n    0x5192, 0x0E6F, 0x5193, 0x1081, 0x5195, 0x1082, 0x5196, 0x1083,\n    0x5197, 0x09D1, 0x5198, 0x4398, 0x5199, 0x08F8, 0x519D, 0x20CB,\n    0x51A0, 0x05E3, 0x51A1, 0x380E, 0x51A2, 0x1086, 0x51A3, 0x4399,\n    0x51A4, 0x1084, 0x51A5, 0x0EC9, 0x51A6, 0x1085, 0x51A8, 0x0DCC,\n    0x51A9, 0x1087, 0x51AA, 0x1088, 0x51AB, 0x1089, 0x51AC, 0x0C59,\n    0x51AD, 0x439A, 0x51B0, 0x108D, 0x51B1, 0x108B, 0x51B2, 0x108C,\n    0x51B3, 0x108A, 0x51B4, 0x0853, 0x51B5, 0x108E, 0x51B6, 0x0EF6,\n    0x51B7, 0x0FAC, 0x51B8, 0x4AE6, 0x51BA, 0x4AE7, 0x51BC, 0x380F,\n    0x51BD, 0x108F, 0x51BE, 0x20CC, 0x51C3, 0x3C32, 0x51C4, 0x0A4C,\n    0x51C5, 0x1090, 0x51C6, 0x0964, 0x51C8, 0x4AE8, 0x51C9, 0x1091,\n    0x51CA, 0x419A, 0x51CB, 0x0BBA, 0x51CC, 0x0F87, 0x51CD, 0x0C5A,\n    0x51CF, 0x4AE9, 0x51D1, 0x4AEA, 0x51D3, 0x4AEB, 0x51D4, 0x4AEC,\n    0x51D6, 0x10DA, 0x51D8, 0x4AED, 0x51DB, 0x1092, 0x51DC, 0x205C,\n    0x51DD, 0x06BD, 0x51DE, 0x4F4C, 0x51DF, 0x4AEE, 0x51E0, 0x1093,\n    0x51E1, 0x0E8C, 0x51E2, 0x419B, 0x51E6, 0x0972, 0x51E7, 0x0B5C,\n    0x51E9, 0x1095, 0x51EA, 0x0CBC, 0x51EC, 0x20CD, 0x51ED, 0x1096,\n    0x51EE, 0x3811, 0x51F0, 0x1097, 0x51F1, 0x058C, 0x51F3, 0x439D,\n    0x51F4, 0x3812, 0x51F5, 0x1098, 0x51F6, 0x069F, 0x51F8, 0x0CA4,\n    0x51F9, 0x051C, 0x51FA, 0x095A, 0x51FD, 0x0D35, 0x51FE, 0x1099,\n    0x5200, 0x0C5B, 0x5201, 0x3813, 0x5202, 0x3814, 0x5203, 0x0A15,\n    0x5204, 0x109A, 0x5205, 0x4AEF, 0x5206, 0x0DFC, 0x5207, 0x0A7E,\n    0x5208, 0x05DE, 0x520A, 0x05E5, 0x520B, 0x109B, 0x520E, 0x109D,\n    0x5211, 0x0710, 0x5212, 0x439E, 0x5213, 0x3815, 0x5214, 0x109C,\n    0x5215, 0x20CE, 0x5216, 0x439F, 0x5217, 0x0FBB, 0x521D, 0x0973,\n    0x5224, 0x0D51, 0x5225, 0x0E1C, 0x5226, 0x4AF0, 0x5227, 0x109E,\n    0x5228, 0x4AF1, 0x5229, 0x0F62, 0x522A, 0x109F, 0x522B, 0x4AF2,\n    0x522E, 0x10A0, 0x5230, 0x0C78, 0x5231, 0x4AF3, 0x5232, 0x4AF4,\n    0x5233, 0x10A1, 0x5235, 0x4AF5, 0x5236, 0x0A4D, 0x5237, 0x086E,\n    0x5238, 0x074A, 0x5239, 0x10A2, 0x523A, 0x0897, 0x523B, 0x0801,\n    0x523C, 0x4AF6, 0x5243, 0x0C02, 0x5244, 0x10A4, 0x5247, 0x0B07,\n    0x5249, 0x3816, 0x524A, 0x085F, 0x524B, 0x10A5, 0x524C, 0x10A6,\n    0x524D, 0x0AB2, 0x524F, 0x10A3, 0x5254, 0x10A8, 0x5255, 0x43A1,\n    0x5256, 0x0E64, 0x5257, 0x419C, 0x525A, 0x4AF7, 0x525B, 0x07F6,\n    0x525C, 0x43A2, 0x525D, 0x1E5E, 0x525E, 0x10A7, 0x5260, 0x4AF8,\n    0x5261, 0x3817, 0x5263, 0x074B, 0x5264, 0x084E, 0x5265, 0x0D23,\n    0x5266, 0x3818, 0x5269, 0x10AB, 0x526A, 0x10A9, 0x526C, 0x43A3,\n    0x526E, 0x4AF9, 0x526F, 0x0DED, 0x5270, 0x09D2, 0x5271, 0x10B2,\n    0x5272, 0x05C2, 0x5273, 0x10AC, 0x5274, 0x10AA, 0x5275, 0x0AD1,\n    0x5277, 0x43A4, 0x5278, 0x4AFA, 0x5279, 0x4AFB, 0x527D, 0x10AE,\n    0x527F, 0x10AD, 0x5282, 0x43A6, 0x5283, 0x05A2, 0x5284, 0x43A5,\n    0x5287, 0x0736, 0x5288, 0x10B3, 0x5289, 0x0F75, 0x528A, 0x4AFC,\n    0x528C, 0x4AFD, 0x528D, 0x10AF, 0x5291, 0x10B4, 0x5292, 0x10B1,\n    0x5293, 0x3819, 0x5294, 0x10B0, 0x5298, 0x43A8, 0x529B, 0x0F97,\n    0x529C, 0x20CF, 0x529F, 0x07AD, 0x52A0, 0x0543, 0x52A3, 0x0FBC,\n    0x52A4, 0x43AA, 0x52A6, 0x20D0, 0x52A9, 0x097F, 0x52AA, 0x0C52,\n    0x52AB, 0x07F7, 0x52AC, 0x10B7, 0x52AD, 0x10B8, 0x52AF, 0x217D,\n    0x52B1, 0x0FAD, 0x52B4, 0x0FD1, 0x52B5, 0x10BA, 0x52B9, 0x07AE,\n    0x52BA, 0x43AB, 0x52BB, 0x43AC, 0x52BC, 0x10B9, 0x52BE, 0x058D,\n    0x52C0, 0x20D1, 0x52C1, 0x10BB, 0x52C3, 0x0E84, 0x52C5, 0x0BD8,\n    0x52C7, 0x0F10, 0x52C8, 0x381A, 0x52C9, 0x0E29, 0x52CA, 0x43AD,\n    0x52CC, 0x419D, 0x52CD, 0x10BC, 0x52D0, 0x36E8, 0x52D1, 0x43AE,\n    0x52D2, 0x1BEE, 0x52D5, 0x0C88, 0x52D6, 0x419E, 0x52D7, 0x10BD,\n    0x52D8, 0x05E6, 0x52D9, 0x0EBF, 0x52DB, 0x20D2, 0x52DD, 0x0989,\n    0x52DE, 0x10BE, 0x52DF, 0x0E37, 0x52E0, 0x10C2, 0x52E1, 0x4AFE,\n    0x52E2, 0x0A4E, 0x52E3, 0x10BF, 0x52E4, 0x06C8, 0x52E6, 0x10C0,\n    0x52E7, 0x05E7, 0x52E9, 0x4AFF, 0x52F0, 0x381B, 0x52F1, 0x4B00,\n    0x52F2, 0x0704, 0x52F3, 0x10C3, 0x52F5, 0x10C4, 0x52F7, 0x43B0,\n    0x52F8, 0x10C5, 0x52F9, 0x10C6, 0x52FA, 0x0907, 0x52FB, 0x419F,\n    0x52FE, 0x07AF, 0x52FF, 0x0EEA, 0x5300, 0x20D3, 0x5301, 0x0EF4,\n    0x5302, 0x0CCF, 0x5303, 0x4B01, 0x5305, 0x0E41, 0x5306, 0x10C7,\n    0x5307, 0x4F4D, 0x5308, 0x10C8, 0x530A, 0x381C, 0x530B, 0x381D,\n    0x530D, 0x10CA, 0x530F, 0x10CC, 0x5310, 0x10CB, 0x5311, 0x4B02,\n    0x5315, 0x10CD, 0x5316, 0x053D, 0x5317, 0x0E7A, 0x5319, 0x086C,\n    0x531A, 0x10CE, 0x531C, 0x41A0, 0x531D, 0x0ADB, 0x531F, 0x4B03,\n    0x5320, 0x098A, 0x5321, 0x06A1, 0x5323, 0x10CF, 0x5324, 0x20D5,\n    0x532A, 0x0D6F, 0x532D, 0x4B04, 0x532F, 0x10D0, 0x5331, 0x10D1,\n    0x5332, 0x4B05, 0x5333, 0x10D2, 0x5335, 0x43B1, 0x5338, 0x10D3,\n    0x5339, 0x0D96, 0x533A, 0x06E0, 0x533B, 0x04A9, 0x533D, 0x4B06,\n    0x533E, 0x381E, 0x533F, 0x0C97, 0x5340, 0x10D4, 0x5341, 0x0947,\n    0x5342, 0x43B2, 0x5343, 0x0A8D, 0x5345, 0x10D6, 0x5346, 0x10D5,\n    0x5347, 0x098B, 0x5348, 0x0795, 0x5349, 0x10D8, 0x534A, 0x0D52,\n    0x534B, 0x3820, 0x534C, 0x381F, 0x534D, 0x10D9, 0x5351, 0x0D70,\n    0x5352, 0x0B14, 0x5353, 0x0B4E, 0x5354, 0x06A0, 0x5357, 0x0CC6,\n    0x5358, 0x0B6F, 0x535A, 0x0D24, 0x535C, 0x0E7C, 0x535E, 0x10DB,\n    0x5360, 0x0A8E, 0x5361, 0x3821, 0x5363, 0x41A1, 0x5365, 0x4B07,\n    0x5366, 0x070B, 0x5367, 0x43B5, 0x5369, 0x10DC, 0x536C, 0x3822,\n    0x536D, 0x4B08, 0x536E, 0x10DD, 0x536F, 0x04CE, 0x5370, 0x04B9,\n    0x5371, 0x0629, 0x5372, 0x20D6, 0x5373, 0x0B08, 0x5374, 0x066B,\n    0x5375, 0x0F5B, 0x5377, 0x10E0, 0x5378, 0x0537, 0x5379, 0x4B09,\n    0x537A, 0x43B6, 0x537B, 0x10DF, 0x537D, 0x3435, 0x537E, 0x4B0A,\n    0x537F, 0x06A2, 0x5382, 0x10E1, 0x5384, 0x0EFD, 0x5389, 0x37D0,\n    0x5393, 0x20D7, 0x5394, 0x4B0B, 0x5396, 0x10E2, 0x5398, 0x0F9A,\n    0x5399, 0x4B0C, 0x539A, 0x07B0, 0x539D, 0x41A2, 0x539F, 0x076A,\n    0x53A0, 0x10E3, 0x53A4, 0x43B7, 0x53A5, 0x10E5, 0x53A6, 0x10E4,\n    0x53A8, 0x0A25, 0x53A9, 0x04DB, 0x53AA, 0x4B0D, 0x53AB, 0x3823,\n    0x53AD, 0x0500, 0x53AE, 0x10E6, 0x53AF, 0x4B0E, 0x53B0, 0x10E7,\n    0x53B2, 0x20D8, 0x53B3, 0x076B, 0x53B4, 0x43B8, 0x53B6, 0x10E8,\n    0x53B7, 0x43BA, 0x53BA, 0x4B0F, 0x53BB, 0x0688, 0x53C0, 0x43BB,\n    0x53C1, 0x4B10, 0x53C2, 0x0880, 0x53C3, 0x10E9, 0x53C4, 0x4B11,\n    0x53C5, 0x4B12, 0x53C8, 0x0EA2, 0x53C9, 0x0825, 0x53CA, 0x0674,\n    0x53CB, 0x0F11, 0x53CC, 0x0AD2, 0x53CD, 0x0D53, 0x53CE, 0x0929,\n    0x53D4, 0x0951, 0x53D5, 0x43BF, 0x53D6, 0x0914, 0x53D7, 0x0921,\n    0x53D9, 0x0980, 0x53DA, 0x3824, 0x53DB, 0x0D54, 0x53DD, 0x20D9,\n    0x53DF, 0x10EC, 0x53E0, 0x4B13, 0x53E1, 0x04E5, 0x53E2, 0x0AD3,\n    0x53E3, 0x07B1, 0x53E4, 0x0779, 0x53E5, 0x06DF, 0x53E6, 0x3825,\n    0x53E8, 0x10F0, 0x53E9, 0x0B5F, 0x53EA, 0x0B5E, 0x53EB, 0x06A3,\n    0x53EC, 0x098C, 0x53ED, 0x10F1, 0x53EE, 0x10EF, 0x53EF, 0x0544,\n    0x53F0, 0x0B46, 0x53F1, 0x08E4, 0x53F2, 0x0899, 0x53F3, 0x04C8,\n    0x53F4, 0x43C1, 0x53F5, 0x3826, 0x53F6, 0x05CE, 0x53F7, 0x07F8,\n    0x53F8, 0x0898, 0x53FA, 0x10F2, 0x5401, 0x10F3, 0x5403, 0x0663,\n    0x5404, 0x05A4, 0x5408, 0x07F9, 0x5409, 0x0662, 0x540A, 0x0BFB,\n    0x540B, 0x04C7, 0x540C, 0x0C89, 0x540D, 0x0ECA, 0x540E, 0x07B3,\n    0x540F, 0x0F63, 0x5410, 0x0C41, 0x5411, 0x07B2, 0x5412, 0x41A3,\n    0x5413, 0x4B14, 0x541B, 0x0705, 0x541D, 0x10FC, 0x541E, 0x368C,\n    0x541F, 0x06DB, 0x5420, 0x0E78, 0x5424, 0x43C2, 0x5426, 0x0D71,\n    0x5427, 0x3827, 0x5428, 0x43C3, 0x5429, 0x10FB, 0x542A, 0x4B15,\n    0x542B, 0x061A, 0x542C, 0x10F6, 0x542D, 0x10F7, 0x542E, 0x10F9,\n    0x5431, 0x4B16, 0x5433, 0x35C0, 0x5434, 0x4B17, 0x5435, 0x4B18,\n    0x5436, 0x10FA, 0x5438, 0x0675, 0x5439, 0x0A27, 0x543B, 0x0DFD,\n    0x543C, 0x10F8, 0x543D, 0x10F4, 0x543E, 0x0797, 0x543F, 0x35CF,\n    0x5440, 0x10F5, 0x5442, 0x0FCA, 0x5443, 0x43C5, 0x5446, 0x0E42,\n    0x5448, 0x0C04, 0x5449, 0x0796, 0x544A, 0x0802, 0x544C, 0x4B19,\n    0x544D, 0x3828, 0x544E, 0x10FD, 0x5451, 0x0CB5, 0x5455, 0x3723,\n    0x545F, 0x1101, 0x5462, 0x43C6, 0x5466, 0x3829, 0x5468, 0x092A,\n    0x546A, 0x0922, 0x546B, 0x382A, 0x546C, 0x43C7, 0x5470, 0x1104,\n    0x5471, 0x1102, 0x5473, 0x0EAF, 0x5474, 0x382B, 0x5475, 0x10FF,\n    0x5476, 0x1108, 0x5477, 0x1103, 0x547B, 0x1106, 0x547C, 0x077A,\n    0x547D, 0x0ECB, 0x547F, 0x41A4, 0x5480, 0x1107, 0x5484, 0x1109,\n    0x5486, 0x110B, 0x5488, 0x41A5, 0x548A, 0x20DC, 0x548B, 0x0860,\n    0x548C, 0x0FE8, 0x548D, 0x382C, 0x548E, 0x1100, 0x548F, 0x10FE,\n    0x5490, 0x110A, 0x5492, 0x1105, 0x5495, 0x43C8, 0x5496, 0x382D,\n    0x549C, 0x20DB, 0x54A0, 0x43C9, 0x54A1, 0x382E, 0x54A2, 0x110D,\n    0x54A4, 0x1116, 0x54A5, 0x110F, 0x54A6, 0x43CA, 0x54A7, 0x4B1A,\n    0x54A8, 0x1113, 0x54A9, 0x20DD, 0x54AA, 0x4B1B, 0x54AB, 0x1114,\n    0x54AC, 0x1110, 0x54AD, 0x382F, 0x54AE, 0x43CB, 0x54AF, 0x1131,\n    0x54B1, 0x4B1C, 0x54B2, 0x0859, 0x54B3, 0x058F, 0x54B7, 0x43CC,\n    0x54B8, 0x110E, 0x54B9, 0x3830, 0x54BA, 0x43CD, 0x54BB, 0x4B1D,\n    0x54BC, 0x1118, 0x54BD, 0x04BA, 0x54BE, 0x1117, 0x54BF, 0x3831,\n    0x54C0, 0x0469, 0x54C1, 0x0DBC, 0x54C2, 0x1115, 0x54C3, 0x43CE,\n    0x54C4, 0x1111, 0x54C6, 0x3832, 0x54C7, 0x110C, 0x54C8, 0x1112,\n    0x54C9, 0x0838, 0x54CD, 0x3833, 0x54CE, 0x4B1E, 0x54D8, 0x1119,\n    0x54E1, 0x04BB, 0x54E2, 0x1122, 0x54E5, 0x111A, 0x54E6, 0x111B,\n    0x54E8, 0x098D, 0x54E9, 0x0E97, 0x54EA, 0x4B1F, 0x54EC, 0x43D0,\n    0x54ED, 0x1120, 0x54EE, 0x111F, 0x54EF, 0x43D1, 0x54F1, 0x43D2,\n    0x54F2, 0x0C29, 0x54F3, 0x43D3, 0x54FA, 0x1121, 0x54FC, 0x4B20,\n    0x54FD, 0x111E, 0x54FF, 0x20DE, 0x5500, 0x43D4, 0x5501, 0x43D5,\n    0x5504, 0x04D6, 0x5505, 0x4B21, 0x5506, 0x0826, 0x5507, 0x09F6,\n    0x5508, 0x4B22, 0x5509, 0x43D6, 0x550E, 0x3834, 0x550F, 0x111C,\n    0x5510, 0x0C5C, 0x5514, 0x111D, 0x5515, 0x4B23, 0x5516, 0x0466,\n    0x5527, 0x4B24, 0x552A, 0x4B25, 0x552B, 0x3835, 0x552E, 0x1127,\n    0x552F, 0x0F0D, 0x5531, 0x098F, 0x5533, 0x112D, 0x5535, 0x3836,\n    0x5536, 0x4B26, 0x5538, 0x112C, 0x5539, 0x1123, 0x553C, 0x43D7,\n    0x553E, 0x0B23, 0x5540, 0x1124, 0x5541, 0x43D8, 0x5544, 0x0B4F,\n    0x5545, 0x1129, 0x5546, 0x098E, 0x5547, 0x43DA, 0x554A, 0x3837,\n    0x554C, 0x1126, 0x554F, 0x0EF0, 0x5550, 0x41A6, 0x5551, 0x4B27,\n    0x5553, 0x0712, 0x5556, 0x112A, 0x5557, 0x112B, 0x555C, 0x1128,\n    0x555D, 0x112E, 0x555E, 0x1DD1, 0x5560, 0x3838, 0x5561, 0x4F54,\n    0x5563, 0x1125, 0x5564, 0x43DC, 0x5566, 0x4B28, 0x557B, 0x1134,\n    0x557C, 0x1139, 0x557D, 0x43DE, 0x557E, 0x1135, 0x5580, 0x1130,\n    0x5581, 0x41A7, 0x5582, 0x43DF, 0x5583, 0x113A, 0x5584, 0x0AB3,\n    0x5586, 0x20DF, 0x5587, 0x113C, 0x5588, 0x383A, 0x5589, 0x07B4,\n    0x558A, 0x1132, 0x558B, 0x0BBB, 0x558E, 0x383B, 0x558F, 0x4B29,\n    0x5591, 0x43E0, 0x5592, 0x4B2A, 0x5594, 0x4B2B, 0x5598, 0x1136,\n    0x5599, 0x112F, 0x559A, 0x05E9, 0x559C, 0x062A, 0x559D, 0x05C3,\n    0x559E, 0x1137, 0x559F, 0x1133, 0x55A4, 0x4B2C, 0x55A7, 0x074C,\n    0x55A8, 0x113D, 0x55A9, 0x113B, 0x55AA, 0x0AD5, 0x55AB, 0x0664,\n    0x55AC, 0x06A4, 0x55AD, 0x41A8, 0x55AE, 0x1138, 0x55B0, 0x06EC,\n    0x55B2, 0x4B2D, 0x55B6, 0x04E6, 0x55BF, 0x43E5, 0x55C3, 0x4B2E,\n    0x55C4, 0x1141, 0x55C5, 0x113F, 0x55C6, 0x4B2F, 0x55C7, 0x1178,\n    0x55C9, 0x43E6, 0x55CC, 0x43E7, 0x55CE, 0x41A9, 0x55D1, 0x43E8,\n    0x55D2, 0x43E2, 0x55D3, 0x4B30, 0x55D4, 0x1144, 0x55DA, 0x113E,\n    0x55DB, 0x4B31, 0x55DC, 0x1142, 0x55DD, 0x43E9, 0x55DF, 0x1140,\n    0x55E2, 0x43EB, 0x55E3, 0x089A, 0x55E4, 0x1143, 0x55E9, 0x43ED,\n    0x55EC, 0x4B32, 0x55EE, 0x4B33, 0x55F1, 0x4B34, 0x55F6, 0x4B35,\n    0x55F7, 0x1146, 0x55F8, 0x4B36, 0x55F9, 0x114B, 0x55FD, 0x1149,\n    0x55FE, 0x1148, 0x5605, 0x4B37, 0x5606, 0x0B70, 0x5607, 0x43F0,\n    0x5608, 0x383C, 0x5609, 0x0545, 0x560D, 0x4B38, 0x560E, 0x383D,\n    0x560F, 0x383E, 0x5610, 0x43F1, 0x5611, 0x4B39, 0x5612, 0x4B3A,\n    0x5614, 0x1145, 0x5616, 0x1147, 0x5617, 0x0990, 0x5618, 0x04D5,\n    0x561B, 0x114A, 0x5620, 0x3C1D, 0x5628, 0x43EE, 0x5629, 0x055E,\n    0x562C, 0x4B3B, 0x562F, 0x1155, 0x5630, 0x43F2, 0x5631, 0x09E4,\n    0x5632, 0x1151, 0x5634, 0x114F, 0x5635, 0x4B3C, 0x5636, 0x1150,\n    0x5637, 0x383F, 0x5638, 0x1152, 0x5639, 0x4B3D, 0x563B, 0x41AA,\n    0x563D, 0x43F4, 0x563F, 0x3840, 0x5640, 0x43F5, 0x5642, 0x04DF,\n    0x5647, 0x43F6, 0x5649, 0x3841, 0x564B, 0x3842, 0x564C, 0x0ABB,\n    0x564D, 0x4B3E, 0x564E, 0x114C, 0x564F, 0x3843, 0x5650, 0x114D,\n    0x5653, 0x1F1B, 0x5654, 0x4B3F, 0x565B, 0x05D8, 0x565E, 0x43F7,\n    0x5660, 0x43F8, 0x5664, 0x1154, 0x5666, 0x3844, 0x5668, 0x062B,\n    0x5669, 0x3845, 0x566A, 0x1157, 0x566B, 0x1153, 0x566C, 0x1156,\n    0x566D, 0x43F9, 0x566F, 0x3846, 0x5671, 0x3847, 0x5672, 0x3848,\n    0x5674, 0x0DFE, 0x5676, 0x3C33, 0x5678, 0x0CAD, 0x567A, 0x0D4C,\n    0x5680, 0x1159, 0x5685, 0x4B40, 0x5686, 0x1158, 0x5687, 0x05A3,\n    0x5688, 0x43FB, 0x568A, 0x115A, 0x568C, 0x43FC, 0x568F, 0x115D,\n    0x5694, 0x115C, 0x5695, 0x3849, 0x5699, 0x1DE6, 0x569A, 0x384A,\n    0x569D, 0x43FD, 0x569E, 0x41AB, 0x569F, 0x4B41, 0x56A0, 0x115B,\n    0x56A2, 0x0CEF, 0x56A5, 0x115E, 0x56A6, 0x4B42, 0x56A8, 0x43FE,\n    0x56A9, 0x41AC, 0x56AC, 0x384B, 0x56AD, 0x384C, 0x56AE, 0x115F,\n    0x56B1, 0x384D, 0x56B2, 0x43FF, 0x56B3, 0x41AD, 0x56B4, 0x1161,\n    0x56B6, 0x1160, 0x56B7, 0x4B43, 0x56BC, 0x1163, 0x56C0, 0x1166,\n    0x56C1, 0x1164, 0x56C2, 0x1162, 0x56C3, 0x1165, 0x56C5, 0x4400,\n    0x56C8, 0x1167, 0x56C9, 0x384E, 0x56CA, 0x1E5A, 0x56CC, 0x4B44,\n    0x56CD, 0x4401, 0x56CE, 0x1168, 0x56CF, 0x4B45, 0x56D1, 0x1169,\n    0x56D3, 0x116A, 0x56D7, 0x116B, 0x56D8, 0x107C, 0x56D9, 0x4B46,\n    0x56DA, 0x0928, 0x56DB, 0x089B, 0x56DD, 0x384F, 0x56DE, 0x0573,\n    0x56DF, 0x4402, 0x56E0, 0x04BC, 0x56E1, 0x4B47, 0x56E3, 0x0B82,\n    0x56E4, 0x3850, 0x56E8, 0x4403, 0x56EB, 0x4B48, 0x56ED, 0x4B49,\n    0x56EE, 0x116C, 0x56F0, 0x0814, 0x56F1, 0x4B4A, 0x56F2, 0x0493,\n    0x56F3, 0x0A24, 0x56F6, 0x4404, 0x56F7, 0x4405, 0x56F9, 0x116D,\n    0x56FA, 0x077B, 0x56FD, 0x0803, 0x56FF, 0x116F, 0x5700, 0x116E,\n    0x5703, 0x0E30, 0x5704, 0x1170, 0x5707, 0x4B4B, 0x5708, 0x1172,\n    0x5709, 0x1171, 0x570A, 0x3851, 0x570B, 0x1173, 0x570C, 0x4B4C,\n    0x570D, 0x1174, 0x570F, 0x074D, 0x5712, 0x0502, 0x5713, 0x1175,\n    0x5715, 0x3852, 0x5716, 0x1177, 0x5718, 0x1176, 0x571A, 0x4B4D,\n    0x571B, 0x4B4E, 0x571C, 0x1179, 0x571D, 0x4B4F, 0x571F, 0x0C54,\n    0x5721, 0x3680, 0x5723, 0x3853, 0x5726, 0x117A, 0x5727, 0x0479,\n    0x5728, 0x084F, 0x5729, 0x4408, 0x572C, 0x4B50, 0x572D, 0x0713,\n    0x572E, 0x4B51, 0x572F, 0x3854, 0x5730, 0x0B8D, 0x5733, 0x3855,\n    0x5734, 0x3856, 0x5737, 0x117B, 0x5738, 0x117C, 0x573B, 0x117E,\n    0x573D, 0x4B52, 0x573E, 0x4B53, 0x5740, 0x117F, 0x5742, 0x0854,\n    0x5745, 0x440A, 0x5746, 0x440B, 0x5747, 0x06C9, 0x574A, 0x0E65,\n    0x574C, 0x3857, 0x574D, 0x440C, 0x574E, 0x117D, 0x574F, 0x1180,\n    0x5750, 0x0831, 0x5751, 0x07B5, 0x5759, 0x20E0, 0x575F, 0x4B54,\n    0x5761, 0x1184, 0x5764, 0x0815, 0x5765, 0x20E1, 0x5766, 0x0B71,\n    0x5768, 0x440E, 0x5769, 0x1181, 0x576A, 0x0BF6, 0x576B, 0x4B55,\n    0x576D, 0x4B56, 0x576F, 0x440F, 0x5770, 0x3858, 0x5773, 0x4410,\n    0x5774, 0x4411, 0x5775, 0x4412, 0x5777, 0x41AE, 0x577A, 0x4B57,\n    0x577B, 0x4413, 0x577C, 0x41AF, 0x577F, 0x1185, 0x5782, 0x0A28,\n    0x5783, 0x4B58, 0x5788, 0x1183, 0x5789, 0x1186, 0x578B, 0x0715,\n    0x578C, 0x3859, 0x5793, 0x1187, 0x5797, 0x4B59, 0x579A, 0x4416,\n    0x579C, 0x385A, 0x579D, 0x4417, 0x579E, 0x4418, 0x57A0, 0x1188,\n    0x57A2, 0x07B6, 0x57A3, 0x059E, 0x57A4, 0x118A, 0x57A8, 0x4419,\n    0x57AA, 0x118B, 0x57AC, 0x20E2, 0x57AE, 0x4B5A, 0x57B0, 0x118C,\n    0x57B3, 0x1189, 0x57B8, 0x385B, 0x57C0, 0x1182, 0x57C3, 0x118D,\n    0x57C6, 0x118E, 0x57C7, 0x20E4, 0x57C8, 0x20E3, 0x57CB, 0x0E92,\n    0x57CC, 0x441C, 0x57CE, 0x09D3, 0x57CF, 0x41B1, 0x57D2, 0x1190,\n    0x57D3, 0x1191, 0x57D4, 0x118F, 0x57D5, 0x4B5B, 0x57D6, 0x1193,\n    0x57D7, 0x441A, 0x57DC, 0x0CEE, 0x57DE, 0x441F, 0x57DF, 0x04AC,\n    0x57E0, 0x0DC8, 0x57E3, 0x1194, 0x57E4, 0x41B2, 0x57E6, 0x385C,\n    0x57E7, 0x4B5C, 0x57ED, 0x385D, 0x57F0, 0x4420, 0x57F4, 0x09E5,\n    0x57F5, 0x385E, 0x57F6, 0x385F, 0x57F7, 0x08E5, 0x57F8, 0x4422,\n    0x57F9, 0x0D13, 0x57FA, 0x062C, 0x57FB, 0x4423, 0x57FC, 0x085B,\n    0x57FD, 0x4424, 0x57FF, 0x3860, 0x5800, 0x0E87, 0x5802, 0x0C8A,\n    0x5804, 0x4425, 0x5805, 0x074E, 0x5806, 0x0B2F, 0x5809, 0x3861,\n    0x580A, 0x1192, 0x580B, 0x1195, 0x580D, 0x4B5D, 0x5815, 0x0B24,\n    0x5819, 0x1196, 0x581D, 0x1197, 0x581E, 0x4426, 0x5820, 0x3862,\n    0x5821, 0x1199, 0x5824, 0x0C05, 0x5826, 0x4B5E, 0x5827, 0x4427,\n    0x582A, 0x05EA, 0x582F, 0x1D32, 0x5830, 0x0503, 0x5831, 0x0E43,\n    0x5832, 0x3863, 0x5834, 0x09D4, 0x5835, 0x0C42, 0x5839, 0x4428,\n    0x583A, 0x0856, 0x583D, 0x119F, 0x5840, 0x0E0D, 0x5841, 0x0FA5,\n    0x5849, 0x442A, 0x584A, 0x0574, 0x584B, 0x119B, 0x584C, 0x442B,\n    0x584D, 0x4B5F, 0x584F, 0x4B60, 0x5851, 0x0ABC, 0x5852, 0x119E,\n    0x5854, 0x0C5D, 0x5857, 0x0C43, 0x5858, 0x0C5E, 0x5859, 0x0D4D,\n    0x585A, 0x0BE9, 0x585E, 0x0839, 0x585F, 0x4B61, 0x5861, 0x1E47,\n    0x5862, 0x119A, 0x5864, 0x41B3, 0x5867, 0x442C, 0x5869, 0x0518,\n    0x586B, 0x0C30, 0x586D, 0x4B62, 0x5870, 0x119C, 0x5872, 0x1198,\n    0x5875, 0x0A16, 0x5879, 0x11A0, 0x587C, 0x3864, 0x587E, 0x0958,\n    0x587F, 0x4B63, 0x5880, 0x3865, 0x5881, 0x4B64, 0x5883, 0x06A5,\n    0x5885, 0x11A1, 0x5889, 0x41B4, 0x588A, 0x442D, 0x588B, 0x442E,\n    0x588D, 0x442F, 0x588F, 0x4430, 0x5890, 0x4431, 0x5893, 0x0E38,\n    0x5894, 0x4432, 0x5897, 0x0AFF, 0x5898, 0x4B65, 0x589C, 0x0BE2,\n    0x589D, 0x4433, 0x589E, 0x20E7, 0x589F, 0x11A3, 0x58A8, 0x0E7D,\n    0x58A9, 0x3866, 0x58AA, 0x4434, 0x58AB, 0x11A4, 0x58AE, 0x11A9,\n    0x58B1, 0x4435, 0x58B2, 0x20E8, 0x58B3, 0x0DFF, 0x58B8, 0x11A8,\n    0x58B9, 0x11A2, 0x58BA, 0x11A5, 0x58BB, 0x11A7, 0x58BC, 0x4B66,\n    0x58BE, 0x0816, 0x58C1, 0x0E19, 0x58C3, 0x4437, 0x58C5, 0x11AA,\n    0x58C7, 0x0B83, 0x58CA, 0x0575, 0x58CC, 0x09D5, 0x58CD, 0x4438,\n    0x58CE, 0x3867, 0x58D0, 0x3868, 0x58D1, 0x11AC, 0x58D2, 0x41B6,\n    0x58D3, 0x11AB, 0x58D4, 0x3869, 0x58D5, 0x07FA, 0x58D7, 0x11AD,\n    0x58D8, 0x11AF, 0x58D9, 0x11AE, 0x58DA, 0x386A, 0x58DC, 0x11B1,\n    0x58DE, 0x11A6, 0x58DF, 0x11B3, 0x58E0, 0x41B7, 0x58E2, 0x4439,\n    0x58E4, 0x11B2, 0x58E5, 0x11B0, 0x58E9, 0x386B, 0x58EB, 0x089C,\n    0x58EC, 0x0A17, 0x58EE, 0x0AD6, 0x58EF, 0x11B4, 0x58F0, 0x0A60,\n    0x58F1, 0x04B1, 0x58F2, 0x0D1A, 0x58F3, 0x443A, 0x58F4, 0x443B,\n    0x58F7, 0x0BF7, 0x58F9, 0x11B6, 0x58FA, 0x11B5, 0x58FB, 0x11B7,\n    0x58FC, 0x11B8, 0x58FD, 0x11B9, 0x5902, 0x11BA, 0x5905, 0x443C,\n    0x5906, 0x443D, 0x5909, 0x0E21, 0x590A, 0x11BB, 0x590B, 0x20E9,\n    0x590C, 0x386C, 0x590D, 0x443E, 0x590F, 0x0546, 0x5910, 0x11BC,\n    0x5914, 0x443F, 0x5915, 0x0F26, 0x5916, 0x058E, 0x5918, 0x10DE,\n    0x5919, 0x0952, 0x591A, 0x0B1F, 0x591B, 0x11BD, 0x591C, 0x0EF7,\n    0x591F, 0x4B67, 0x5922, 0x0EC0, 0x5923, 0x4B68, 0x5924, 0x386D,\n    0x5925, 0x11BF, 0x5927, 0x0B47, 0x5929, 0x0C31, 0x592A, 0x0B20,\n    0x592B, 0x0DC9, 0x592C, 0x11C0, 0x592D, 0x11C1, 0x592E, 0x051D,\n    0x592F, 0x386E, 0x5931, 0x08E6, 0x5932, 0x11C2, 0x5937, 0x0494,\n    0x5938, 0x11C3, 0x5939, 0x3725, 0x593D, 0x4442, 0x593E, 0x11C4,\n    0x5944, 0x0504, 0x5946, 0x4444, 0x5947, 0x062D, 0x5948, 0x0CB8,\n    0x5949, 0x0E44, 0x594E, 0x11C8, 0x594F, 0x0AD7, 0x5950, 0x11C7,\n    0x5951, 0x0716, 0x5953, 0x20EA, 0x5954, 0x0E89, 0x5955, 0x11C6,\n    0x5957, 0x0C5F, 0x5958, 0x11CA, 0x5959, 0x4B69, 0x595A, 0x11C9,\n    0x595B, 0x20EB, 0x595D, 0x20EC, 0x595F, 0x4447, 0x5960, 0x11CC,\n    0x5961, 0x386F, 0x5962, 0x11CB, 0x5963, 0x20ED, 0x5965, 0x051E,\n    0x5967, 0x11CD, 0x5968, 0x0991, 0x5969, 0x11CF, 0x596A, 0x0B63,\n    0x596C, 0x11CE, 0x596D, 0x3870, 0x596E, 0x0E03, 0x5973, 0x0981,\n    0x5974, 0x0C55, 0x5975, 0x4449, 0x5976, 0x444A, 0x5978, 0x11D0,\n    0x5979, 0x4B6A, 0x597C, 0x444B, 0x597D, 0x07B7, 0x5981, 0x11D1,\n    0x5982, 0x0CD7, 0x5983, 0x0D72, 0x5984, 0x0EDD, 0x598A, 0x0CDB,\n    0x598B, 0x41B9, 0x598D, 0x11DA, 0x5992, 0x41BA, 0x5993, 0x0652,\n    0x5996, 0x0F2F, 0x5997, 0x4B6B, 0x5999, 0x0EBB, 0x599B, 0x1239,\n    0x599D, 0x11D2, 0x599F, 0x444C, 0x59A3, 0x11D5, 0x59A4, 0x20EE,\n    0x59A5, 0x0B25, 0x59A8, 0x0E66, 0x59AC, 0x0C44, 0x59AE, 0x444D,\n    0x59AF, 0x4B6C, 0x59B2, 0x11D6, 0x59B3, 0x4B6D, 0x59B9, 0x0E93,\n    0x59BA, 0x20EF, 0x59BB, 0x083A, 0x59BC, 0x444E, 0x59BE, 0x0992,\n    0x59C3, 0x41BB, 0x59C6, 0x11D7, 0x59C8, 0x444F, 0x59C9, 0x089E,\n    0x59CA, 0x3871, 0x59CB, 0x089D, 0x59CD, 0x4450, 0x59D0, 0x047D,\n    0x59D1, 0x077C, 0x59D2, 0x3872, 0x59D3, 0x0A4F, 0x59D4, 0x0495,\n    0x59D9, 0x11DB, 0x59DA, 0x11DC, 0x59DC, 0x11D9, 0x59DD, 0x3873,\n    0x59DE, 0x4451, 0x59DF, 0x4B6E, 0x59E3, 0x3874, 0x59E4, 0x3875,\n    0x59E5, 0x04DA, 0x59E6, 0x05EB, 0x59E7, 0x4452, 0x59E8, 0x11D8,\n    0x59EA, 0x0ED1, 0x59EB, 0x0DA3, 0x59EC, 0x36AD, 0x59EE, 0x4453,\n    0x59F1, 0x4B6F, 0x59F6, 0x046C, 0x59F8, 0x4B70, 0x59FB, 0x04BD,\n    0x59FF, 0x089F, 0x5A01, 0x0496, 0x5A03, 0x0467, 0x5A04, 0x3876,\n    0x5A09, 0x11E1, 0x5A0C, 0x3877, 0x5A0D, 0x4457, 0x5A11, 0x11DF,\n    0x5A13, 0x41BC, 0x5A17, 0x4458, 0x5A18, 0x0EC8, 0x5A1A, 0x11E2,\n    0x5A1B, 0x35C1, 0x5A1C, 0x11E0, 0x5A1F, 0x11DE, 0x5A20, 0x09F7,\n    0x5A23, 0x3878, 0x5A25, 0x11DD, 0x5A27, 0x4459, 0x5A29, 0x0E2A,\n    0x5A2D, 0x445A, 0x5A2F, 0x0798, 0x5A35, 0x11E6, 0x5A36, 0x11E7,\n    0x5A3C, 0x0993, 0x5A40, 0x11E3, 0x5A41, 0x0FD2, 0x5A46, 0x0D02,\n    0x5A47, 0x3879, 0x5A49, 0x11E5, 0x5A55, 0x387A, 0x5A5A, 0x0817,\n    0x5A62, 0x11E8, 0x5A63, 0x387B, 0x5A65, 0x445B, 0x5A66, 0x0DCA,\n    0x5A67, 0x41BD, 0x5A6A, 0x11E9, 0x5A6C, 0x11E4, 0x5A6D, 0x387C,\n    0x5A77, 0x41BE, 0x5A7A, 0x445C, 0x5A7E, 0x387D, 0x5A7F, 0x0EC7,\n    0x5A84, 0x41BF, 0x5A8B, 0x445D, 0x5A92, 0x0D14, 0x5A9A, 0x11EA,\n    0x5A9B, 0x0DA4, 0x5A9C, 0x445E, 0x5A9E, 0x387E, 0x5A9F, 0x445F,\n    0x5AA0, 0x4460, 0x5AA2, 0x4461, 0x5AA7, 0x387F, 0x5AAC, 0x3880,\n    0x5AB1, 0x4462, 0x5AB2, 0x4B71, 0x5AB3, 0x3881, 0x5AB5, 0x4463,\n    0x5AB8, 0x4B72, 0x5ABA, 0x4464, 0x5ABC, 0x11EB, 0x5ABD, 0x11EF,\n    0x5ABE, 0x11EC, 0x5ABF, 0x4465, 0x5AC1, 0x0547, 0x5AC2, 0x11EE,\n    0x5AC4, 0x41C0, 0x5AC9, 0x08E7, 0x5ACB, 0x11ED, 0x5ACC, 0x074F,\n    0x5AD0, 0x11FB, 0x5AD6, 0x11F4, 0x5AD7, 0x11F1, 0x5ADA, 0x4466,\n    0x5ADC, 0x4467, 0x5AE0, 0x3882, 0x5AE1, 0x0BA2, 0x5AE3, 0x11F0,\n    0x5AE5, 0x4468, 0x5AE6, 0x11F2, 0x5AE9, 0x11F3, 0x5AEA, 0x4B73,\n    0x5AEE, 0x446A, 0x5AF0, 0x4469, 0x5AF5, 0x446B, 0x5AF6, 0x4B74,\n    0x5AFA, 0x11F5, 0x5AFB, 0x11F6, 0x5B00, 0x3883, 0x5B08, 0x446C,\n    0x5B09, 0x062E, 0x5B0B, 0x11F8, 0x5B0C, 0x11F7, 0x5B16, 0x11F9,\n    0x5B17, 0x446D, 0x5B19, 0x3884, 0x5B1B, 0x4B75, 0x5B1D, 0x4B76,\n    0x5B21, 0x4B77, 0x5B22, 0x09D6, 0x5B25, 0x3885, 0x5B2A, 0x11FC,\n    0x5B2C, 0x0BF8, 0x5B2D, 0x3886, 0x5B30, 0x04E7, 0x5B32, 0x11FA,\n    0x5B34, 0x446E, 0x5B36, 0x11FD, 0x5B38, 0x4B78, 0x5B3E, 0x11FE,\n    0x5B40, 0x1201, 0x5B41, 0x3887, 0x5B43, 0x11FF, 0x5B45, 0x1200,\n    0x5B4C, 0x446F, 0x5B50, 0x08A0, 0x5B51, 0x1202, 0x5B52, 0x4470,\n    0x5B54, 0x07B8, 0x5B55, 0x1203, 0x5B56, 0x20F0, 0x5B57, 0x08C8,\n    0x5B58, 0x0B18, 0x5B5A, 0x1204, 0x5B5B, 0x1205, 0x5B5C, 0x08A8,\n    0x5B5D, 0x07B9, 0x5B5F, 0x0EDE, 0x5B63, 0x0642, 0x5B64, 0x077D,\n    0x5B65, 0x1206, 0x5B66, 0x05B6, 0x5B68, 0x4471, 0x5B69, 0x1207,\n    0x5B6B, 0x0B19, 0x5B6F, 0x4472, 0x5B70, 0x1208, 0x5B71, 0x1230,\n    0x5B73, 0x1209, 0x5B75, 0x120A, 0x5B76, 0x3728, 0x5B78, 0x120B,\n    0x5B7A, 0x120D, 0x5B7C, 0x3888, 0x5B7D, 0x41C2, 0x5B7E, 0x3889,\n    0x5B7F, 0x388A, 0x5B80, 0x120E, 0x5B81, 0x4473, 0x5B82, 0x3610,\n    0x5B83, 0x120F, 0x5B84, 0x4474, 0x5B85, 0x0B50, 0x5B87, 0x04C9,\n    0x5B88, 0x0915, 0x5B89, 0x0486, 0x5B8A, 0x388B, 0x5B8B, 0x0AD9,\n    0x5B8C, 0x05EC, 0x5B8D, 0x08E1, 0x5B8F, 0x07BA, 0x5B93, 0x41C3,\n    0x5B95, 0x0C60, 0x5B96, 0x4476, 0x5B97, 0x092B, 0x5B98, 0x05ED,\n    0x5B99, 0x0BA6, 0x5B9A, 0x0C06, 0x5B9B, 0x047C, 0x5B9C, 0x0653,\n    0x5B9D, 0x0E45, 0x5B9F, 0x08EE, 0x5BA2, 0x066C, 0x5BA3, 0x0A8F,\n    0x5BA4, 0x08E8, 0x5BA5, 0x0F12, 0x5BA6, 0x1210, 0x5BAC, 0x4477,\n    0x5BAE, 0x0676, 0x5BB0, 0x083B, 0x5BB3, 0x0590, 0x5BB4, 0x0505,\n    0x5BB5, 0x0994, 0x5BB6, 0x0548, 0x5BB7, 0x4B79, 0x5BB8, 0x1211,\n    0x5BB9, 0x0F30, 0x5BBF, 0x0953, 0x5BC0, 0x20F1, 0x5BC2, 0x0910,\n    0x5BC3, 0x1212, 0x5BC4, 0x062F, 0x5BC5, 0x0CAA, 0x5BC6, 0x0EB5,\n    0x5BC7, 0x1213, 0x5BC9, 0x1214, 0x5BCC, 0x0DCB, 0x5BCE, 0x447A,\n    0x5BD0, 0x1216, 0x5BD2, 0x05E4, 0x5BD3, 0x06EF, 0x5BD4, 0x1215,\n    0x5BD6, 0x447B, 0x5BD7, 0x4B7A, 0x5BD8, 0x20F3, 0x5BDB, 0x05EE,\n    0x5BDD, 0x09F8, 0x5BDE, 0x121A, 0x5BDF, 0x086F, 0x5BE0, 0x4B7B,\n    0x5BE1, 0x0549, 0x5BE2, 0x1219, 0x5BE4, 0x1217, 0x5BE5, 0x121B,\n    0x5BE6, 0x1218, 0x5BE7, 0x0CE1, 0x5BE8, 0x148E, 0x5BE9, 0x09F9,\n    0x5BEB, 0x121C, 0x5BEC, 0x4F4E, 0x5BEE, 0x0F88, 0x5BF0, 0x121D,\n    0x5BF1, 0x447E, 0x5BF3, 0x121F, 0x5BF5, 0x0BBC, 0x5BF6, 0x121E,\n    0x5BF8, 0x0A47, 0x5BFA, 0x08C9, 0x5BFD, 0x447F, 0x5BFE, 0x0B30,\n    0x5BFF, 0x0923, 0x5C01, 0x0DE7, 0x5C02, 0x0A90, 0x5C03, 0x4481,\n    0x5C04, 0x08F9, 0x5C05, 0x1220, 0x5C06, 0x0995, 0x5C07, 0x1221,\n    0x5C08, 0x1222, 0x5C09, 0x0497, 0x5C0A, 0x0B1A, 0x5C0B, 0x0A18,\n    0x5C0D, 0x1223, 0x5C0E, 0x0C8B, 0x5C0F, 0x0996, 0x5C11, 0x0997,\n    0x5C12, 0x41C4, 0x5C13, 0x1224, 0x5C14, 0x372A, 0x5C16, 0x0A91,\n    0x5C19, 0x360B, 0x5C1A, 0x0998, 0x5C1E, 0x20F5, 0x5C1F, 0x4B7C,\n    0x5C20, 0x1225, 0x5C22, 0x1226, 0x5C23, 0x388C, 0x5C24, 0x0EEC,\n    0x5C28, 0x1227, 0x5C29, 0x4482, 0x5C2A, 0x4B7D, 0x5C2B, 0x388D,\n    0x5C2C, 0x4B7E, 0x5C2D, 0x06BE, 0x5C30, 0x388E, 0x5C31, 0x092C,\n    0x5C36, 0x4B7F, 0x5C38, 0x1228, 0x5C39, 0x1229, 0x5C3A, 0x0908,\n    0x5C3B, 0x09F2, 0x5C3C, 0x0CCC, 0x5C3D, 0x0A1A, 0x5C3E, 0x0D8C,\n    0x5C3F, 0x0CD8, 0x5C40, 0x06C1, 0x5C41, 0x122A, 0x5C45, 0x0689,\n    0x5C46, 0x122B, 0x5C48, 0x06F6, 0x5C4A, 0x0CA7, 0x5C4B, 0x0530,\n    0x5C4D, 0x08A1, 0x5C4E, 0x122C, 0x5C4F, 0x122F, 0x5C50, 0x122E,\n    0x5C51, 0x06F5, 0x5C53, 0x122D, 0x5C55, 0x0C32, 0x5C59, 0x4B80,\n    0x5C5B, 0x1E92, 0x5C5C, 0x4B81, 0x5C5E, 0x0B10, 0x5C5F, 0x4484,\n    0x5C60, 0x0C45, 0x5C61, 0x08F4, 0x5C62, 0x1E0D, 0x5C63, 0x388F,\n    0x5C64, 0x0ADA, 0x5C65, 0x0F64, 0x5C67, 0x4485, 0x5C68, 0x4486,\n    0x5C69, 0x3890, 0x5C6C, 0x1231, 0x5C6D, 0x4B82, 0x5C6E, 0x1232,\n    0x5C6F, 0x0CAE, 0x5C70, 0x4487, 0x5C71, 0x0881, 0x5C76, 0x1234,\n    0x5C79, 0x1235, 0x5C7A, 0x41C7, 0x5C7C, 0x3891, 0x5C88, 0x448C,\n    0x5C8A, 0x448D, 0x5C8C, 0x1236, 0x5C8F, 0x41C8, 0x5C90, 0x0630,\n    0x5C91, 0x1237, 0x5C94, 0x1238, 0x5C9F, 0x41C9, 0x5CA0, 0x4491,\n    0x5CA1, 0x052C, 0x5CA2, 0x4492, 0x5CA3, 0x41CA, 0x5CA6, 0x20F6,\n    0x5CA7, 0x4493, 0x5CA8, 0x0ABD, 0x5CA9, 0x0620, 0x5CAA, 0x41CB,\n    0x5CAB, 0x123A, 0x5CAC, 0x0EB4, 0x5CAD, 0x4495, 0x5CB1, 0x0B32,\n    0x5CB3, 0x05B7, 0x5CB5, 0x4496, 0x5CB6, 0x123C, 0x5CB7, 0x123E,\n    0x5CB8, 0x061B, 0x5CBA, 0x20F7, 0x5CBB, 0x123B, 0x5CBC, 0x123D,\n    0x5CBE, 0x1240, 0x5CC5, 0x123F, 0x5CC7, 0x1241, 0x5CC9, 0x4498,\n    0x5CCB, 0x3892, 0x5CD0, 0x41CC, 0x5CD2, 0x3893, 0x5CD9, 0x1242,\n    0x5CDD, 0x4B83, 0x5CE0, 0x0C95, 0x5CE1, 0x06A6, 0x5CE6, 0x372C,\n    0x5CE8, 0x0565, 0x5CE9, 0x1243, 0x5CEA, 0x1248, 0x5CED, 0x1246,\n    0x5CEF, 0x0E47, 0x5CF0, 0x0E46, 0x5CF4, 0x3894, 0x5CF5, 0x20F8,\n    0x5CF6, 0x0C61, 0x5CFA, 0x1245, 0x5CFB, 0x095E, 0x5CFD, 0x1244,\n    0x5D01, 0x4B84, 0x5D06, 0x449B, 0x5D07, 0x0A38, 0x5D0B, 0x1249,\n    0x5D0D, 0x41CE, 0x5D0E, 0x085A, 0x5D10, 0x449C, 0x5D11, 0x124F,\n    0x5D14, 0x1250, 0x5D15, 0x124A, 0x5D16, 0x0591, 0x5D17, 0x124B,\n    0x5D18, 0x1254, 0x5D19, 0x1253, 0x5D1A, 0x1252, 0x5D1B, 0x124E,\n    0x5D1D, 0x449E, 0x5D1F, 0x124D, 0x5D20, 0x449F, 0x5D22, 0x1251,\n    0x5D24, 0x3895, 0x5D26, 0x3896, 0x5D27, 0x20F9, 0x5D29, 0x0E48,\n    0x5D2B, 0x449D, 0x5D31, 0x44A0, 0x5D34, 0x4B85, 0x5D39, 0x44A1,\n    0x5D3D, 0x4B86, 0x5D42, 0x20FC, 0x5D43, 0x3897, 0x5D46, 0x3898,\n    0x5D47, 0x41CF, 0x5D4A, 0x3899, 0x5D4B, 0x1258, 0x5D4C, 0x1255,\n    0x5D4E, 0x1257, 0x5D50, 0x0F5C, 0x5D52, 0x1256, 0x5D53, 0x20FA,\n    0x5D59, 0x4B87, 0x5D5C, 0x124C, 0x5D61, 0x44A3, 0x5D69, 0x0A39,\n    0x5D6A, 0x44A4, 0x5D6C, 0x1259, 0x5D6D, 0x20FD, 0x5D6F, 0x0827,\n    0x5D70, 0x44A6, 0x5D73, 0x125A, 0x5D76, 0x125B, 0x5D7E, 0x4B88,\n    0x5D81, 0x41D0, 0x5D82, 0x125E, 0x5D83, 0x4B89, 0x5D84, 0x125D,\n    0x5D87, 0x125C, 0x5D88, 0x44A9, 0x5D8B, 0x0C62, 0x5D8C, 0x1247,\n    0x5D90, 0x1264, 0x5D92, 0x389A, 0x5D94, 0x389B, 0x5D97, 0x44AB,\n    0x5D99, 0x389C, 0x5D9D, 0x1260, 0x5DA0, 0x389D, 0x5DA2, 0x125F,\n    0x5DA4, 0x41D1, 0x5DA7, 0x41D2, 0x5DAC, 0x1261, 0x5DAE, 0x1262,\n    0x5DB0, 0x44AC, 0x5DB2, 0x3C2D, 0x5DB4, 0x44AD, 0x5DB7, 0x1265,\n    0x5DB8, 0x20FE, 0x5DB9, 0x20FF, 0x5DBA, 0x0FAE, 0x5DBC, 0x1266,\n    0x5DBD, 0x1263, 0x5DC7, 0x4B8A, 0x5DC9, 0x1267, 0x5DCB, 0x41D3,\n    0x5DCC, 0x061C, 0x5DCD, 0x1268, 0x5DD0, 0x2100, 0x5DD1, 0x44AF,\n    0x5DD2, 0x126A, 0x5DD3, 0x1269, 0x5DD6, 0x126B, 0x5DD7, 0x44B0,\n    0x5DD8, 0x389E, 0x5DDB, 0x126C, 0x5DDD, 0x0A92, 0x5DDE, 0x092D,\n    0x5DE0, 0x389F, 0x5DE1, 0x096E, 0x5DE2, 0x3432, 0x5DE3, 0x0AE5,\n    0x5DE4, 0x44B2, 0x5DE5, 0x07BB, 0x5DE6, 0x0828, 0x5DE7, 0x07BC,\n    0x5DE8, 0x068A, 0x5DE9, 0x44B3, 0x5DEB, 0x126D, 0x5DEE, 0x0829,\n    0x5DF1, 0x077E, 0x5DF2, 0x126E, 0x5DF3, 0x0EB2, 0x5DF4, 0x0CF9,\n    0x5DF5, 0x126F, 0x5DF7, 0x07BD, 0x5DF8, 0x38A0, 0x5DF9, 0x4B8B,\n    0x5DFB, 0x05E8, 0x5DFD, 0x0B65, 0x5DFE, 0x06CA, 0x5DFF, 0x35E2,\n    0x5E00, 0x38A1, 0x5E02, 0x08A2, 0x5E03, 0x0DCD, 0x5E06, 0x0D55,\n    0x5E0B, 0x1270, 0x5E0C, 0x0631, 0x5E11, 0x1273, 0x5E12, 0x38A2,\n    0x5E14, 0x38A3, 0x5E15, 0x38A4, 0x5E16, 0x0BBD, 0x5E18, 0x38A5,\n    0x5E19, 0x1272, 0x5E1A, 0x1271, 0x5E1B, 0x1274, 0x5E1D, 0x0C07,\n    0x5E1F, 0x44B7, 0x5E25, 0x0A29, 0x5E28, 0x4B8C, 0x5E2B, 0x08A3,\n    0x5E2D, 0x0A6E, 0x5E2E, 0x38A6, 0x5E2F, 0x0B33, 0x5E30, 0x063C,\n    0x5E32, 0x4B8D, 0x5E33, 0x0BBE, 0x5E35, 0x4B8E, 0x5E36, 0x1275,\n    0x5E37, 0x1276, 0x5E38, 0x09D7, 0x5E3D, 0x0E67, 0x5E3E, 0x44B8,\n    0x5E40, 0x1279, 0x5E43, 0x1278, 0x5E44, 0x1277, 0x5E45, 0x0DEF,\n    0x5E47, 0x1280, 0x5E49, 0x44B9, 0x5E4C, 0x0E88, 0x5E4E, 0x127A,\n    0x5E54, 0x127C, 0x5E55, 0x0E99, 0x5E56, 0x44BB, 0x5E57, 0x127B,\n    0x5E58, 0x38A7, 0x5E5B, 0x4B8F, 0x5E5E, 0x41D4, 0x5E5F, 0x127D,\n    0x5E61, 0x0D3C, 0x5E62, 0x127E, 0x5E63, 0x0E0E, 0x5E64, 0x127F,\n    0x5E68, 0x4B90, 0x5E6A, 0x4B91, 0x5E6B, 0x38A8, 0x5E6C, 0x38A9,\n    0x5E6D, 0x44BD, 0x5E6E, 0x44BE, 0x5E72, 0x05EF, 0x5E73, 0x0E0F,\n    0x5E74, 0x0CE5, 0x5E75, 0x1281, 0x5E76, 0x1282, 0x5E77, 0x4B92,\n    0x5E78, 0x07BE, 0x5E79, 0x05F0, 0x5E7A, 0x1283, 0x5E7B, 0x076C,\n    0x5E7C, 0x0F2E, 0x5E7D, 0x0F13, 0x5E7E, 0x0632, 0x5E7F, 0x1285,\n    0x5E80, 0x4B93, 0x5E81, 0x0BBF, 0x5E83, 0x07BF, 0x5E84, 0x0999,\n    0x5E87, 0x0D73, 0x5E8A, 0x099A, 0x5E8B, 0x4B94, 0x5E8F, 0x0982,\n    0x5E95, 0x0C08, 0x5E96, 0x0E49, 0x5E97, 0x0C33, 0x5E99, 0x36B0,\n    0x5E9A, 0x07C0, 0x5E9C, 0x0DCE, 0x5EA0, 0x1286, 0x5EA5, 0x44C0,\n    0x5EA6, 0x0C53, 0x5EA7, 0x0832, 0x5EA8, 0x38AA, 0x5EAA, 0x38AB,\n    0x5EAB, 0x077F, 0x5EAC, 0x44C1, 0x5EAD, 0x0C09, 0x5EB3, 0x4B95,\n    0x5EB5, 0x0487, 0x5EB6, 0x0978, 0x5EB7, 0x07C1, 0x5EB8, 0x0F31,\n    0x5EB9, 0x44C2, 0x5EBD, 0x4B96, 0x5EBE, 0x38AC, 0x5EBF, 0x38AD,\n    0x5EC1, 0x1287, 0x5EC2, 0x1288, 0x5EC3, 0x0D07, 0x5EC6, 0x44C3,\n    0x5EC8, 0x1289, 0x5EC9, 0x0FBF, 0x5ECA, 0x0FD3, 0x5ECB, 0x3C1E,\n    0x5ECF, 0x128B, 0x5ED0, 0x128A, 0x5ED1, 0x4B97, 0x5ED2, 0x38AF,\n    0x5ED3, 0x05A5, 0x5ED4, 0x4B98, 0x5ED5, 0x4B99, 0x5ED6, 0x128C,\n    0x5ED9, 0x44C4, 0x5EDA, 0x128F, 0x5EDB, 0x1290, 0x5EDD, 0x128E,\n    0x5EDF, 0x0DB2, 0x5EE0, 0x099B, 0x5EE1, 0x1292, 0x5EE2, 0x1291,\n    0x5EE3, 0x128D, 0x5EE8, 0x1293, 0x5EE9, 0x1294, 0x5EEC, 0x1295,\n    0x5EF0, 0x1298, 0x5EF1, 0x1296, 0x5EF3, 0x1297, 0x5EF4, 0x1299,\n    0x5EF6, 0x0506, 0x5EF7, 0x0C0A, 0x5EF8, 0x129A, 0x5EF9, 0x41D5,\n    0x5EFA, 0x0750, 0x5EFB, 0x0576, 0x5EFC, 0x0CEC, 0x5EFD, 0x44C6,\n    0x5EFE, 0x129B, 0x5EFF, 0x0CD3, 0x5F00, 0x41D6, 0x5F01, 0x0E2B,\n    0x5F02, 0x41D7, 0x5F03, 0x129C, 0x5F04, 0x0FD4, 0x5F07, 0x38B0,\n    0x5F08, 0x44C7, 0x5F09, 0x129D, 0x5F0A, 0x0E10, 0x5F0B, 0x12A0,\n    0x5F0C, 0x0FFA, 0x5F0D, 0x100A, 0x5F0E, 0x38B1, 0x5F0F, 0x08DC,\n    0x5F10, 0x0CCD, 0x5F11, 0x12A1, 0x5F13, 0x0677, 0x5F14, 0x0BC0,\n    0x5F15, 0x04BE, 0x5F16, 0x12A2, 0x5F17, 0x0DF6, 0x5F18, 0x07C2,\n    0x5F1B, 0x0B8E, 0x5F1C, 0x38B2, 0x5F1D, 0x38B3, 0x5F1E, 0x44C9,\n    0x5F1F, 0x0C0B, 0x5F21, 0x2101, 0x5F22, 0x38B4, 0x5F23, 0x41D8,\n    0x5F25, 0x0EFB, 0x5F26, 0x076D, 0x5F27, 0x0780, 0x5F28, 0x38B5,\n    0x5F29, 0x12A3, 0x5F2D, 0x12A4, 0x5F2F, 0x12AA, 0x5F31, 0x0911,\n    0x5F34, 0x2102, 0x5F35, 0x0BC1, 0x5F36, 0x38B6, 0x5F37, 0x06A7,\n    0x5F38, 0x12A5, 0x5F3A, 0x3598, 0x5F3B, 0x38B7, 0x5F3C, 0x0D9D,\n    0x5F3D, 0x41D9, 0x5F3E, 0x0B84, 0x5F40, 0x38B8, 0x5F41, 0x12A6,\n    0x5F45, 0x20B2, 0x5F47, 0x44CA, 0x5F48, 0x12A7, 0x5F4A, 0x06A8,\n    0x5F4C, 0x12A8, 0x5F4D, 0x4B9A, 0x5F4E, 0x12A9, 0x5F50, 0x38B9,\n    0x5F51, 0x12AB, 0x5F53, 0x0C70, 0x5F54, 0x41DA, 0x5F56, 0x12AC,\n    0x5F57, 0x12AD, 0x5F58, 0x38BA, 0x5F59, 0x12AE, 0x5F5C, 0x129F,\n    0x5F5D, 0x129E, 0x5F61, 0x12AF, 0x5F62, 0x0717, 0x5F63, 0x44CB,\n    0x5F64, 0x38BB, 0x5F65, 0x36AC, 0x5F66, 0x0D99, 0x5F67, 0x2103,\n    0x5F69, 0x083C, 0x5F6A, 0x0DA9, 0x5F6B, 0x0BC2, 0x5F6C, 0x0DBD,\n    0x5F6D, 0x12B0, 0x5F70, 0x099C, 0x5F71, 0x04E8, 0x5F72, 0x44CC,\n    0x5F73, 0x12B1, 0x5F77, 0x12B2, 0x5F79, 0x0EFE, 0x5F7C, 0x0D74,\n    0x5F7D, 0x41DB, 0x5F7E, 0x44CD, 0x5F7F, 0x12B5, 0x5F80, 0x051F,\n    0x5F81, 0x0A50, 0x5F82, 0x12B4, 0x5F83, 0x12B3, 0x5F84, 0x0718,\n    0x5F85, 0x0B34, 0x5F87, 0x12B9, 0x5F88, 0x12B7, 0x5F89, 0x38BC,\n    0x5F8A, 0x12B6, 0x5F8B, 0x0F6F, 0x5F8C, 0x0799, 0x5F8F, 0x44CE,\n    0x5F90, 0x0983, 0x5F91, 0x12B8, 0x5F92, 0x0C46, 0x5F93, 0x0948,\n    0x5F97, 0x0C98, 0x5F98, 0x12BC, 0x5F99, 0x12BB, 0x5F9C, 0x38BD,\n    0x5F9E, 0x12BA, 0x5FA0, 0x12BD, 0x5FA1, 0x079A, 0x5FA2, 0x44CF,\n    0x5FA4, 0x38BF, 0x5FA7, 0x38BE, 0x5FA8, 0x12BE, 0x5FA9, 0x0DEE,\n    0x5FAA, 0x0965, 0x5FAC, 0x4B9B, 0x5FAD, 0x12BF, 0x5FAE, 0x0D8D,\n    0x5FAF, 0x38C0, 0x5FB3, 0x0C99, 0x5FB4, 0x0BC3, 0x5FB5, 0x3438,\n    0x5FB7, 0x2104, 0x5FB8, 0x38C1, 0x5FB9, 0x0C2A, 0x5FBC, 0x12C0,\n    0x5FBD, 0x0645, 0x5FC3, 0x09FA, 0x5FC4, 0x38C2, 0x5FC5, 0x0D9E,\n    0x5FC7, 0x44D0, 0x5FC9, 0x38C3, 0x5FCB, 0x44D1, 0x5FCC, 0x0633,\n    0x5FCD, 0x0CDC, 0x5FD2, 0x44D2, 0x5FD3, 0x44D3, 0x5FD4, 0x44D4,\n    0x5FD6, 0x12C1, 0x5FD7, 0x08A4, 0x5FD8, 0x0E68, 0x5FD9, 0x0E69,\n    0x5FDC, 0x0520, 0x5FDD, 0x12C6, 0x5FDE, 0x2105, 0x5FE0, 0x0BA7,\n    0x5FE1, 0x38C4, 0x5FE2, 0x44D5, 0x5FE4, 0x12C3, 0x5FE9, 0x38C5,\n    0x5FEA, 0x4B9C, 0x5FEB, 0x0577, 0x5FED, 0x38C6, 0x5FEE, 0x44D6,\n    0x5FEF, 0x44D7, 0x5FF0, 0x12F6, 0x5FF1, 0x12C5, 0x5FF3, 0x44D8,\n    0x5FF5, 0x0CE6, 0x5FF8, 0x12C4, 0x5FFB, 0x12C2, 0x5FFC, 0x38C7,\n    0x5FFD, 0x080C, 0x5FFF, 0x12C8, 0x6007, 0x4B9D, 0x600D, 0x41DC,\n    0x600E, 0x12CE, 0x600F, 0x12D4, 0x6010, 0x12CC, 0x6012, 0x0C56,\n    0x6014, 0x41DD, 0x6015, 0x12D1, 0x6016, 0x0DCF, 0x6017, 0x38C8,\n    0x6018, 0x41DE, 0x6019, 0x12CB, 0x601A, 0x38C9, 0x601B, 0x12D0,\n    0x601C, 0x0FAF, 0x601D, 0x08A5, 0x6020, 0x0B35, 0x6021, 0x12C9,\n    0x6022, 0x44DA, 0x6024, 0x44DB, 0x6025, 0x0678, 0x6026, 0x12D3,\n    0x6027, 0x0A51, 0x6028, 0x0507, 0x6029, 0x12CD, 0x602A, 0x0578,\n    0x602B, 0x12D2, 0x602F, 0x06A9, 0x6031, 0x12CF, 0x6033, 0x38CA,\n    0x6035, 0x41DF, 0x603A, 0x12D5, 0x6041, 0x12D7, 0x6042, 0x12E1,\n    0x6043, 0x12DF, 0x6046, 0x12DC, 0x6047, 0x41E0, 0x6049, 0x4B9E,\n    0x604A, 0x12DB, 0x604B, 0x0FC0, 0x604C, 0x44DD, 0x604D, 0x12DD,\n    0x6050, 0x06AA, 0x6052, 0x07C3, 0x6054, 0x4B9F, 0x6055, 0x0984,\n    0x6059, 0x12E4, 0x605A, 0x12D6, 0x605D, 0x2106, 0x605F, 0x12DA,\n    0x6060, 0x12CA, 0x6061, 0x38CB, 0x6062, 0x057A, 0x6063, 0x12DE,\n    0x6064, 0x12E0, 0x6065, 0x0B8F, 0x6067, 0x4BA0, 0x6068, 0x0818,\n    0x6069, 0x0538, 0x606A, 0x12D8, 0x606B, 0x12E3, 0x606C, 0x12E2,\n    0x606D, 0x06AB, 0x606F, 0x0B09, 0x6070, 0x05C4, 0x6075, 0x0719,\n    0x6077, 0x12D9, 0x607F, 0x38CC, 0x6081, 0x12E5, 0x6083, 0x12E8,\n    0x6084, 0x12EA, 0x6085, 0x2107, 0x6089, 0x08E9, 0x608A, 0x2108,\n    0x608B, 0x12F0, 0x608C, 0x0C0C, 0x608D, 0x12E6, 0x6092, 0x12EE,\n    0x6094, 0x0579, 0x6095, 0x44DE, 0x6096, 0x12EC, 0x6097, 0x12ED,\n    0x609A, 0x12E9, 0x609B, 0x12EB, 0x609D, 0x41E1, 0x609E, 0x38CD,\n    0x609F, 0x079B, 0x60A0, 0x0F14, 0x60A3, 0x05F1, 0x60A4, 0x38CE,\n    0x60A6, 0x04FB, 0x60A7, 0x12EF, 0x60A8, 0x44DF, 0x60A9, 0x0CF0,\n    0x60AA, 0x0471, 0x60B0, 0x38CF, 0x60B1, 0x44E1, 0x60B2, 0x0D75,\n    0x60B3, 0x12C7, 0x60B4, 0x12F5, 0x60B5, 0x12F9, 0x60B6, 0x0EF1,\n    0x60B8, 0x12F2, 0x60BB, 0x4BA1, 0x60BC, 0x0C63, 0x60BD, 0x12F7,\n    0x60BE, 0x44E2, 0x60C4, 0x4BA2, 0x60C5, 0x09D8, 0x60C6, 0x12F8,\n    0x60C7, 0x0CAF, 0x60C8, 0x44E3, 0x60CB, 0x38D0, 0x60D1, 0x0FED,\n    0x60D3, 0x12F4, 0x60D4, 0x41E2, 0x60D5, 0x210A, 0x60D8, 0x12FA,\n    0x60D9, 0x44E4, 0x60DA, 0x080D, 0x60DB, 0x38D1, 0x60DC, 0x0A6F,\n    0x60DD, 0x41E3, 0x60DE, 0x2109, 0x60DF, 0x0498, 0x60E0, 0x12F3,\n    0x60E1, 0x12F1, 0x60E3, 0x0ADC, 0x60E7, 0x12E7, 0x60E8, 0x0882,\n    0x60EE, 0x44E5, 0x60F0, 0x0B26, 0x60F1, 0x1306, 0x60F2, 0x210C,\n    0x60F3, 0x0ADD, 0x60F4, 0x1301, 0x60F5, 0x44E6, 0x60F6, 0x12FE,\n    0x60F7, 0x12FF, 0x60F8, 0x38D2, 0x60F9, 0x0912, 0x60FA, 0x1302,\n    0x60FB, 0x1305, 0x60FD, 0x4BA3, 0x6100, 0x1300, 0x6101, 0x092F,\n    0x6103, 0x1303, 0x6106, 0x12FD, 0x6108, 0x0F08, 0x6109, 0x0F07,\n    0x610A, 0x4BA4, 0x610D, 0x1307, 0x610E, 0x1308, 0x610F, 0x0499,\n    0x6110, 0x44E7, 0x6111, 0x210D, 0x6112, 0x38D3, 0x6113, 0x38D4,\n    0x6114, 0x38D5, 0x6115, 0x12FC, 0x6116, 0x4BA5, 0x6119, 0x44E8,\n    0x611A, 0x06EA, 0x611B, 0x046A, 0x611C, 0x38D6, 0x611E, 0x44E9,\n    0x611F, 0x05F2, 0x6120, 0x210B, 0x6121, 0x1304, 0x6127, 0x130C,\n    0x6128, 0x130B, 0x612A, 0x4BA6, 0x612B, 0x41E4, 0x612C, 0x1310,\n    0x6130, 0x210F, 0x6134, 0x1311, 0x6136, 0x4BA7, 0x6137, 0x210E,\n    0x613A, 0x44EA, 0x613C, 0x130F, 0x613D, 0x1312, 0x613E, 0x130A,\n    0x613F, 0x130E, 0x6141, 0x44EC, 0x6142, 0x1313, 0x6144, 0x1314,\n    0x6146, 0x44ED, 0x6147, 0x1309, 0x6148, 0x08CA, 0x614A, 0x130D,\n    0x614B, 0x0B36, 0x614C, 0x07C4, 0x614D, 0x12FB, 0x614E, 0x09FB,\n    0x6153, 0x1321, 0x6155, 0x0E39, 0x6158, 0x1317, 0x6159, 0x1318,\n    0x615A, 0x1319, 0x615D, 0x1320, 0x615E, 0x4BA8, 0x615F, 0x131F,\n    0x6160, 0x44EE, 0x6162, 0x0EAB, 0x6163, 0x05F3, 0x6164, 0x4BA9,\n    0x6165, 0x131D, 0x6167, 0x071B, 0x6168, 0x0592, 0x616B, 0x131A,\n    0x616E, 0x0F80, 0x616F, 0x131C, 0x6170, 0x049A, 0x6171, 0x131E,\n    0x6173, 0x1315, 0x6174, 0x131B, 0x6175, 0x1322, 0x6176, 0x071A,\n    0x6177, 0x1316, 0x617B, 0x4BAA, 0x617C, 0x38D7, 0x617D, 0x4BAB,\n    0x617E, 0x0F47, 0x617F, 0x4BAC, 0x6182, 0x0F15, 0x6187, 0x1325,\n    0x618A, 0x1329, 0x618D, 0x38D8, 0x618E, 0x0B00, 0x6190, 0x0FC1,\n    0x6191, 0x132A, 0x6192, 0x44F0, 0x6193, 0x44F1, 0x6194, 0x1327,\n    0x6196, 0x1324, 0x6197, 0x44F2, 0x6198, 0x2110, 0x6199, 0x1323,\n    0x619A, 0x1328, 0x619D, 0x4BAD, 0x619F, 0x38D9, 0x61A4, 0x0E00,\n    0x61A5, 0x44F3, 0x61A7, 0x0C8C, 0x61A8, 0x38DA, 0x61A9, 0x071C,\n    0x61AB, 0x132B, 0x61AC, 0x1326, 0x61AD, 0x44F4, 0x61AE, 0x132C,\n    0x61B2, 0x0751, 0x61B6, 0x0531, 0x61B8, 0x4BAE, 0x61B9, 0x41E6,\n    0x61BA, 0x1334, 0x61BC, 0x41E5, 0x61BE, 0x05F4, 0x61C2, 0x38DB,\n    0x61C3, 0x1332, 0x61C6, 0x1333, 0x61C7, 0x0819, 0x61C8, 0x1331,\n    0x61C9, 0x132F, 0x61CA, 0x132E, 0x61CB, 0x1335, 0x61CC, 0x132D,\n    0x61CD, 0x1337, 0x61D0, 0x057B, 0x61D5, 0x44F6, 0x61DC, 0x4BAF,\n    0x61DD, 0x44F7, 0x61DF, 0x38DC, 0x61E2, 0x4BB0, 0x61E3, 0x1339,\n    0x61E5, 0x4BB1, 0x61E6, 0x1338, 0x61E8, 0x4BB2, 0x61F2, 0x0BC4,\n    0x61F4, 0x133C, 0x61F5, 0x44F8, 0x61F6, 0x133A, 0x61F7, 0x1330,\n    0x61F8, 0x0752, 0x61FA, 0x133B, 0x61FC, 0x133F, 0x61FD, 0x133E,\n    0x61FE, 0x1340, 0x61FF, 0x133D, 0x6200, 0x1341, 0x6204, 0x4BB3,\n    0x6207, 0x4BB4, 0x6208, 0x1342, 0x6209, 0x1343, 0x620A, 0x0E3A,\n    0x620C, 0x1345, 0x620D, 0x1344, 0x620E, 0x0949, 0x6210, 0x0A52,\n    0x6211, 0x0566, 0x6212, 0x057C, 0x6213, 0x2111, 0x6214, 0x1346,\n    0x6215, 0x38DD, 0x6216, 0x0483, 0x621A, 0x0A70, 0x621B, 0x1347,\n    0x621D, 0x1A64, 0x621E, 0x1348, 0x621F, 0x0737, 0x6221, 0x1349,\n    0x6222, 0x41E7, 0x6223, 0x44FA, 0x6226, 0x0A93, 0x6229, 0x38DE,\n    0x622A, 0x134A, 0x622E, 0x134B, 0x622F, 0x0654, 0x6230, 0x134C,\n    0x6231, 0x4BB5, 0x6232, 0x134D, 0x6233, 0x134E, 0x6234, 0x0B37,\n    0x6236, 0x35BD, 0x6238, 0x0781, 0x6239, 0x4BB6, 0x623B, 0x0EED,\n    0x623D, 0x4BB7, 0x623E, 0x344E, 0x623F, 0x0E6A, 0x6240, 0x0974,\n    0x6241, 0x134F, 0x6243, 0x38DF, 0x6246, 0x38E0, 0x6247, 0x0A94,\n    0x6248, 0x1B1A, 0x6249, 0x0D76, 0x624B, 0x0916, 0x624C, 0x38E1,\n    0x624D, 0x083D, 0x624E, 0x1350, 0x6251, 0x38E2, 0x6252, 0x44FB,\n    0x6253, 0x0B27, 0x6255, 0x0DF7, 0x6256, 0x38E3, 0x6258, 0x0B51,\n    0x625A, 0x41E8, 0x625B, 0x1353, 0x625E, 0x1351, 0x6260, 0x1354,\n    0x6261, 0x44FC, 0x6263, 0x1352, 0x6264, 0x44FD, 0x6268, 0x1355,\n    0x626D, 0x44FF, 0x626E, 0x0E01, 0x626F, 0x41E9, 0x6271, 0x047B,\n    0x6273, 0x4500, 0x6276, 0x0DD0, 0x6279, 0x0D77, 0x627A, 0x4BB8,\n    0x627B, 0x44FE, 0x627C, 0x1356, 0x627E, 0x1359, 0x627F, 0x099D,\n    0x6280, 0x0655, 0x6282, 0x1357, 0x6283, 0x135E, 0x6284, 0x099E,\n    0x6285, 0x35C5, 0x6289, 0x1358, 0x628A, 0x0CFA, 0x6290, 0x4BB9,\n    0x6291, 0x0F48, 0x6292, 0x135A, 0x6293, 0x135B, 0x6294, 0x135F,\n    0x6295, 0x0C64, 0x6296, 0x135C, 0x6297, 0x07C5, 0x6298, 0x0A82,\n    0x6299, 0x4501, 0x629B, 0x136D, 0x629C, 0x0D48, 0x629E, 0x0B52,\n    0x62A6, 0x2112, 0x62A8, 0x4BBA, 0x62AB, 0x0D78, 0x62AC, 0x13B2,\n    0x62B1, 0x0E4A, 0x62B5, 0x0C0D, 0x62B9, 0x0EA3, 0x62BB, 0x1362,\n    0x62BC, 0x0521, 0x62BD, 0x0BA8, 0x62C2, 0x136B, 0x62C4, 0x38E4,\n    0x62C5, 0x0B72, 0x62C6, 0x1365, 0x62C7, 0x136C, 0x62C8, 0x1367,\n    0x62C9, 0x136E, 0x62CA, 0x136A, 0x62CC, 0x1369, 0x62CD, 0x0D25,\n    0x62CF, 0x1363, 0x62D0, 0x057D, 0x62D1, 0x1361, 0x62D2, 0x068B,\n    0x62D3, 0x0B53, 0x62D4, 0x135D, 0x62D5, 0x4502, 0x62D6, 0x41EA,\n    0x62D7, 0x1360, 0x62D8, 0x07C6, 0x62D9, 0x0A7F, 0x62DA, 0x4BBB,\n    0x62DB, 0x099F, 0x62DC, 0x1368, 0x62DD, 0x0D08, 0x62E0, 0x068C,\n    0x62E1, 0x05A6, 0x62EC, 0x05C5, 0x62ED, 0x09E7, 0x62EE, 0x1370,\n    0x62EF, 0x1375, 0x62F1, 0x1371, 0x62F3, 0x0753, 0x62F4, 0x4BBC,\n    0x62F5, 0x1376, 0x62F6, 0x0870, 0x62F7, 0x07FB, 0x62FC, 0x38E5,\n    0x62FD, 0x4504, 0x62FE, 0x0930, 0x62FF, 0x1364, 0x6301, 0x08CB,\n    0x6302, 0x1373, 0x6303, 0x4505, 0x6307, 0x08A6, 0x6308, 0x1374,\n    0x6309, 0x0488, 0x630A, 0x38E6, 0x630C, 0x136F, 0x630D, 0x38E7,\n    0x6310, 0x4506, 0x6311, 0x0BC5, 0x6316, 0x4BBD, 0x6318, 0x38E8,\n    0x6319, 0x068D, 0x631B, 0x3737, 0x631F, 0x06AC, 0x6327, 0x1372,\n    0x6328, 0x046B, 0x632A, 0x4BBE, 0x632B, 0x0833, 0x632F, 0x09FC,\n    0x6332, 0x4509, 0x6335, 0x450A, 0x6336, 0x4BBF, 0x6339, 0x38E9,\n    0x633A, 0x0C0E, 0x633B, 0x450B, 0x633C, 0x450C, 0x633D, 0x0D68,\n    0x633E, 0x1378, 0x633F, 0x0AE0, 0x6341, 0x450D, 0x6342, 0x38EA,\n    0x6343, 0x38EB, 0x6344, 0x450E, 0x6346, 0x4BC0, 0x6349, 0x0B0A,\n    0x634B, 0x4BC1, 0x634C, 0x0879, 0x634D, 0x1379, 0x634E, 0x450F,\n    0x634F, 0x137B, 0x6350, 0x1377, 0x6353, 0x4BC2, 0x6355, 0x0E31,\n    0x6357, 0x0BD9, 0x6359, 0x4511, 0x635C, 0x0ADE, 0x6365, 0x38EC,\n    0x6367, 0x0E4B, 0x6368, 0x08FA, 0x6369, 0x1387, 0x636B, 0x1386,\n    0x636C, 0x4514, 0x636E, 0x0A3E, 0x6371, 0x4BC3, 0x6372, 0x0754,\n    0x6374, 0x38ED, 0x6375, 0x4BC4, 0x6376, 0x1380, 0x6377, 0x09A1,\n    0x637A, 0x0CC0, 0x637B, 0x0CE7, 0x637C, 0x41EB, 0x637D, 0x38EE,\n    0x637F, 0x4BC5, 0x6380, 0x137E, 0x6382, 0x4BC6, 0x6383, 0x0ADF,\n    0x6384, 0x38EF, 0x6387, 0x38F0, 0x6388, 0x0924, 0x6389, 0x1383,\n    0x638A, 0x4BC7, 0x638C, 0x09A0, 0x638E, 0x137D, 0x638F, 0x1382,\n    0x6390, 0x38F1, 0x6392, 0x0D09, 0x6394, 0x4517, 0x6396, 0x137C,\n    0x6398, 0x06F7, 0x6399, 0x4515, 0x639B, 0x05BB, 0x639E, 0x38F2,\n    0x639F, 0x1384, 0x63A0, 0x0F73, 0x63A1, 0x083E, 0x63A2, 0x0B73,\n    0x63A3, 0x1381, 0x63A5, 0x0A80, 0x63A7, 0x07C7, 0x63A8, 0x0A2A,\n    0x63A9, 0x0508, 0x63AA, 0x0ABE, 0x63AB, 0x137F, 0x63AC, 0x065F,\n    0x63AE, 0x4BC8, 0x63AF, 0x4BC9, 0x63B2, 0x071D, 0x63B4, 0x0BEB,\n    0x63B5, 0x1385, 0x63BB, 0x0AE1, 0x63BD, 0x4518, 0x63BE, 0x1388,\n    0x63C0, 0x138A, 0x63C3, 0x0B17, 0x63C4, 0x1390, 0x63C6, 0x138B,\n    0x63C9, 0x138D, 0x63CF, 0x0DB3, 0x63D0, 0x0C0F, 0x63D1, 0x38F3,\n    0x63D2, 0x138E, 0x63D4, 0x4519, 0x63D5, 0x451A, 0x63D6, 0x0F16,\n    0x63DA, 0x0F32, 0x63DB, 0x05F5, 0x63DC, 0x38F4, 0x63E0, 0x451B,\n    0x63E1, 0x0472, 0x63E3, 0x138C, 0x63E5, 0x41EC, 0x63E9, 0x1389,\n    0x63EA, 0x4BCA, 0x63EB, 0x451C, 0x63EC, 0x451D, 0x63ED, 0x341C,\n    0x63EE, 0x0634, 0x63F2, 0x451E, 0x63F4, 0x0509, 0x63F5, 0x2113,\n    0x63F6, 0x138F, 0x63F7, 0x3644, 0x63F8, 0x4BCB, 0x63F9, 0x4BCC,\n    0x63FA, 0x0F33, 0x6406, 0x1393, 0x6409, 0x38F5, 0x640D, 0x0B1B,\n    0x640F, 0x139A, 0x6410, 0x38F6, 0x6412, 0x4BCD, 0x6413, 0x1394,\n    0x6414, 0x1E2C, 0x6416, 0x1391, 0x6417, 0x1398, 0x6418, 0x4BCE,\n    0x641C, 0x137A, 0x641E, 0x451F, 0x6420, 0x4BCF, 0x6422, 0x38F7,\n    0x6424, 0x4BD0, 0x6425, 0x4520, 0x6426, 0x1395, 0x6428, 0x1399,\n    0x6429, 0x4521, 0x642A, 0x4BD1, 0x642C, 0x0D56, 0x642D, 0x0C65,\n    0x642F, 0x4522, 0x6434, 0x1392, 0x6435, 0x4BD2, 0x6436, 0x1396,\n    0x643A, 0x071E, 0x643D, 0x4BD3, 0x643E, 0x0861, 0x643F, 0x4BD4,\n    0x6442, 0x0A81, 0x644E, 0x139E, 0x6451, 0x1E43, 0x6452, 0x4BD5,\n    0x6454, 0x38F8, 0x6458, 0x0C20, 0x645A, 0x4523, 0x645B, 0x38F9,\n    0x645D, 0x4524, 0x645F, 0x4BD6, 0x6460, 0x2114, 0x6467, 0x139B,\n    0x6469, 0x0E8E, 0x646D, 0x38FA, 0x646F, 0x139C, 0x6473, 0x4525,\n    0x6474, 0x4BD7, 0x6476, 0x139D, 0x6478, 0x0EDA, 0x6479, 0x41ED,\n    0x647A, 0x0A46, 0x647B, 0x38FB, 0x647D, 0x4526, 0x6483, 0x0738,\n    0x6487, 0x4527, 0x6488, 0x13A4, 0x6490, 0x4BD8, 0x6491, 0x4528,\n    0x6492, 0x0883, 0x6493, 0x13A1, 0x6495, 0x13A0, 0x6498, 0x4BD9,\n    0x6499, 0x4BDA, 0x649A, 0x0CE8, 0x649D, 0x2115, 0x649E, 0x0C8D,\n    0x649F, 0x4529, 0x64A4, 0x0C2B, 0x64A5, 0x13A2, 0x64A9, 0x13A3,\n    0x64AB, 0x0DE1, 0x64AC, 0x4BDB, 0x64AD, 0x0CFB, 0x64AE, 0x0871,\n    0x64B0, 0x0A95, 0x64B2, 0x0E7E, 0x64B3, 0x4BDC, 0x64B9, 0x05A7,\n    0x64BB, 0x13AA, 0x64BC, 0x13A5, 0x64BE, 0x38FC, 0x64BF, 0x38FD,\n    0x64C1, 0x0F34, 0x64C2, 0x13AC, 0x64C4, 0x41EE, 0x64C5, 0x13A8,\n    0x64C7, 0x13A9, 0x64CA, 0x341D, 0x64CB, 0x452A, 0x64CC, 0x452B,\n    0x64CD, 0x0AE2, 0x64CE, 0x2116, 0x64D0, 0x41EF, 0x64D2, 0x13A7,\n    0x64D4, 0x1366, 0x64D5, 0x452C, 0x64D7, 0x452D, 0x64D8, 0x13AB,\n    0x64DA, 0x13A6, 0x64E0, 0x13B0, 0x64E1, 0x13B1, 0x64E2, 0x0C21,\n    0x64E3, 0x13B3, 0x64E4, 0x452F, 0x64E5, 0x38FE, 0x64E6, 0x0872,\n    0x64E7, 0x13AE, 0x64EC, 0x0656, 0x64ED, 0x4BDD, 0x64EF, 0x13B4,\n    0x64F0, 0x4BDE, 0x64F1, 0x13AD, 0x64F2, 0x13B8, 0x64F4, 0x13B7,\n    0x64F6, 0x13B6, 0x64F7, 0x38FF, 0x64FA, 0x13B9, 0x64FB, 0x3900,\n    0x64FD, 0x13BB, 0x64FE, 0x09D9, 0x64FF, 0x4530, 0x6500, 0x13BA,\n    0x6504, 0x3901, 0x6505, 0x13BE, 0x650F, 0x4532, 0x6514, 0x4533,\n    0x6516, 0x3902, 0x6518, 0x13BC, 0x6519, 0x3903, 0x651B, 0x4BDF,\n    0x651C, 0x13BD, 0x651D, 0x1397, 0x651E, 0x4535, 0x651F, 0x4BE0,\n    0x6522, 0x1E97, 0x6523, 0x13C0, 0x6524, 0x13BF, 0x6529, 0x41F0,\n    0x652A, 0x139F, 0x652B, 0x13C1, 0x652C, 0x13B5, 0x652E, 0x4BE1,\n    0x652F, 0x08A7, 0x6532, 0x4536, 0x6534, 0x13C2, 0x6535, 0x13C3,\n    0x6536, 0x13C5, 0x6537, 0x13C4, 0x6538, 0x13C6, 0x6539, 0x057E,\n    0x653B, 0x07C8, 0x653E, 0x0E4C, 0x653F, 0x0A53, 0x6544, 0x4537,\n    0x6545, 0x0782, 0x6547, 0x3904, 0x6548, 0x13C8, 0x6549, 0x4BE2,\n    0x654D, 0x13CB, 0x654E, 0x2117, 0x654F, 0x0DC4, 0x6551, 0x0679,\n    0x6554, 0x4538, 0x6555, 0x13CA, 0x6556, 0x13C9, 0x6557, 0x0D0A,\n    0x6558, 0x13CC, 0x6559, 0x06AD, 0x655D, 0x13CE, 0x655E, 0x13CD,\n    0x6560, 0x4BE3, 0x6562, 0x05F6, 0x6563, 0x0884, 0x6566, 0x0CB0,\n    0x6567, 0x3905, 0x656B, 0x4539, 0x656C, 0x071F, 0x6570, 0x0A3A,\n    0x6572, 0x13CF, 0x6574, 0x0A54, 0x6575, 0x0C22, 0x6577, 0x0DD1,\n    0x6578, 0x13D0, 0x657A, 0x453A, 0x6581, 0x3906, 0x6582, 0x13D1,\n    0x6583, 0x13D2, 0x6584, 0x453B, 0x6585, 0x3907, 0x6587, 0x0E08,\n    0x6588, 0x120C, 0x6589, 0x0A6A, 0x658A, 0x453C, 0x658C, 0x0DBE,\n    0x658E, 0x0848, 0x6590, 0x0D79, 0x6591, 0x0D57, 0x6592, 0x4BE4,\n    0x6595, 0x4BE5, 0x6597, 0x0C47, 0x6599, 0x0F89, 0x659B, 0x13D4,\n    0x659C, 0x08FC, 0x659D, 0x41F1, 0x659F, 0x13D5, 0x65A1, 0x047A,\n    0x65A4, 0x06CC, 0x65A5, 0x0A71, 0x65A7, 0x0DD2, 0x65AB, 0x13D6,\n    0x65AC, 0x0890, 0x65AD, 0x0B85, 0x65AF, 0x08A9, 0x65B0, 0x09FD,\n    0x65B2, 0x453D, 0x65B4, 0x4BE6, 0x65B5, 0x453E, 0x65B7, 0x13D7,\n    0x65B8, 0x453F, 0x65B9, 0x0E4D, 0x65BC, 0x0519, 0x65BD, 0x08AA,\n    0x65BE, 0x4BE7, 0x65BF, 0x4540, 0x65C1, 0x13DA, 0x65C2, 0x3908,\n    0x65C3, 0x13D8, 0x65C4, 0x13DB, 0x65C5, 0x0F81, 0x65C6, 0x13D9,\n    0x65C8, 0x4BE8, 0x65C9, 0x4541, 0x65CB, 0x0A9F, 0x65CC, 0x13DC,\n    0x65CE, 0x4BE9, 0x65CF, 0x0B12, 0x65D0, 0x4BEA, 0x65D2, 0x13DD,\n    0x65D4, 0x4542, 0x65D7, 0x0636, 0x65D9, 0x13DF, 0x65DB, 0x13DE,\n    0x65DF, 0x4BEB, 0x65E0, 0x13E0, 0x65E1, 0x13E1, 0x65E2, 0x0637,\n    0x65E3, 0x3585, 0x65E5, 0x0CD4, 0x65E6, 0x0B74, 0x65E7, 0x0686,\n    0x65E8, 0x08AB, 0x65E9, 0x0AE3, 0x65EC, 0x0966, 0x65ED, 0x0474,\n    0x65F0, 0x3909, 0x65F1, 0x13E2, 0x65F2, 0x390A, 0x65F9, 0x4544,\n    0x65FA, 0x0522, 0x65FB, 0x13E6, 0x65FC, 0x4545, 0x6600, 0x2118,\n    0x6602, 0x07C9, 0x6603, 0x13E5, 0x6604, 0x4546, 0x6606, 0x081B,\n    0x6607, 0x09A2, 0x6608, 0x4547, 0x6609, 0x211A, 0x660A, 0x13E4,\n    0x660C, 0x09A3, 0x660E, 0x0ECC, 0x660F, 0x081A, 0x6613, 0x049B,\n    0x6614, 0x0A72, 0x6615, 0x2119, 0x661C, 0x13EB, 0x661E, 0x4F50,\n    0x661F, 0x0A55, 0x6620, 0x04E9, 0x6621, 0x4548, 0x6622, 0x41F3,\n    0x6624, 0x211D, 0x6625, 0x095F, 0x6627, 0x0E94, 0x6628, 0x0862,\n    0x662A, 0x4549, 0x662B, 0x41F4, 0x662C, 0x390B, 0x662D, 0x09A4,\n    0x662E, 0x211B, 0x662F, 0x0A4B, 0x6630, 0x41F5, 0x6631, 0x20AE,\n    0x6633, 0x41F6, 0x6634, 0x13EA, 0x6635, 0x13E8, 0x6636, 0x13E9,\n    0x663A, 0x41F2, 0x663B, 0x1E00, 0x663C, 0x0BA9, 0x663F, 0x1409,\n    0x6641, 0x13EF, 0x6642, 0x08CC, 0x6643, 0x07CA, 0x6644, 0x13ED,\n    0x6645, 0x454A, 0x6648, 0x41F7, 0x6649, 0x13EE, 0x664B, 0x09FE,\n    0x664C, 0x390C, 0x664E, 0x454C, 0x664F, 0x13EC, 0x6651, 0x454B,\n    0x6652, 0x087D, 0x6657, 0x211F, 0x6659, 0x2120, 0x665A, 0x3441,\n    0x665B, 0x390D, 0x665C, 0x390E, 0x665D, 0x13F1, 0x665E, 0x13F0,\n    0x665F, 0x13F5, 0x6661, 0x390F, 0x6662, 0x13F6, 0x6663, 0x373A,\n    0x6664, 0x13F2, 0x6665, 0x211E, 0x6666, 0x0580, 0x6667, 0x13F3,\n    0x6668, 0x13F4, 0x6669, 0x0D69, 0x666A, 0x4551, 0x666B, 0x3910,\n    0x666C, 0x4552, 0x666D, 0x4553, 0x666E, 0x0DD3, 0x666F, 0x0720,\n    0x6670, 0x13F7, 0x6673, 0x2122, 0x6674, 0x0A56, 0x6676, 0x09A5,\n    0x6677, 0x41F9, 0x6678, 0x41FA, 0x667A, 0x0B90, 0x667B, 0x4554,\n    0x667E, 0x4BEC, 0x6680, 0x4555, 0x6681, 0x06BF, 0x6683, 0x13F8,\n    0x6684, 0x13FC, 0x6687, 0x054B, 0x6688, 0x13F9, 0x6689, 0x13FB,\n    0x668B, 0x4BED, 0x668C, 0x4BEE, 0x668D, 0x41FB, 0x668E, 0x13FA,\n    0x6690, 0x4556, 0x6691, 0x0975, 0x6692, 0x4557, 0x6696, 0x0B86,\n    0x6697, 0x0489, 0x6698, 0x13FD, 0x6699, 0x2123, 0x669D, 0x13FE,\n    0x66A0, 0x2124, 0x66A2, 0x0BC6, 0x66A4, 0x3912, 0x66A6, 0x0FB9,\n    0x66AB, 0x0891, 0x66AD, 0x4559, 0x66AE, 0x0E3B, 0x66B1, 0x455A,\n    0x66B2, 0x2125, 0x66B3, 0x4BEF, 0x66B4, 0x0E6B, 0x66B5, 0x455B,\n    0x66B8, 0x1405, 0x66B9, 0x1400, 0x66BB, 0x41FC, 0x66BC, 0x1403,\n    0x66BE, 0x1402, 0x66BF, 0x2126, 0x66C0, 0x4BF0, 0x66C1, 0x13FF,\n    0x66C4, 0x1404, 0x66C6, 0x3455, 0x66C7, 0x0CB6, 0x66C8, 0x3913,\n    0x66C9, 0x1401, 0x66CF, 0x4BF1, 0x66D6, 0x1406, 0x66D9, 0x0976,\n    0x66DA, 0x1407, 0x66DB, 0x41FD, 0x66DC, 0x0F35, 0x66DD, 0x0D2E,\n    0x66E0, 0x1408, 0x66E6, 0x140A, 0x66E8, 0x41FE, 0x66E9, 0x140B,\n    0x66EC, 0x3914, 0x66F0, 0x140C, 0x66F2, 0x06C2, 0x66F3, 0x04EA,\n    0x66F4, 0x07CB, 0x66F5, 0x140D, 0x66F7, 0x140E, 0x66F8, 0x097B,\n    0x66F9, 0x0AE4, 0x66FA, 0x2127, 0x66FB, 0x20B1, 0x66FC, 0x10ED,\n    0x66FD, 0x0AC0, 0x66FE, 0x0ABF, 0x66FF, 0x0B38, 0x6700, 0x0837,\n    0x6701, 0x455F, 0x6703, 0x104B, 0x6705, 0x3915, 0x6708, 0x0744,\n    0x6709, 0x0F17, 0x670B, 0x0E4E, 0x670D, 0x0DF0, 0x670E, 0x2128,\n    0x670F, 0x140F, 0x6712, 0x4560, 0x6713, 0x3916, 0x6714, 0x0863,\n    0x6715, 0x0BDB, 0x6716, 0x1410, 0x6717, 0x0FD5, 0x6719, 0x4562,\n    0x671B, 0x0E6C, 0x671D, 0x0BC7, 0x671E, 0x1411, 0x671F, 0x0638,\n    0x6725, 0x4BF2, 0x6726, 0x1412, 0x6727, 0x1413, 0x6728, 0x0EE6,\n    0x672A, 0x0EB0, 0x672B, 0x0EA4, 0x672C, 0x0E8A, 0x672D, 0x0873,\n    0x672E, 0x1415, 0x6731, 0x0917, 0x6733, 0x3917, 0x6734, 0x0E7F,\n    0x6735, 0x4BF3, 0x6736, 0x1417, 0x6737, 0x141A, 0x6738, 0x1419,\n    0x673A, 0x0635, 0x673D, 0x067A, 0x673F, 0x1416, 0x6741, 0x1418,\n    0x6743, 0x35B7, 0x6746, 0x141B, 0x6747, 0x41FF, 0x6748, 0x3918,\n    0x6749, 0x0A3F, 0x674C, 0x3919, 0x674D, 0x4565, 0x674E, 0x0F65,\n    0x674F, 0x048D, 0x6750, 0x0850, 0x6751, 0x0B1C, 0x6753, 0x0909,\n    0x6754, 0x4566, 0x6755, 0x4BF4, 0x6756, 0x09DB, 0x6759, 0x141E,\n    0x675C, 0x0C48, 0x675D, 0x4567, 0x675E, 0x141C, 0x675F, 0x0B0B,\n    0x6760, 0x141D, 0x6761, 0x09DA, 0x6762, 0x0EE9, 0x6763, 0x141F,\n    0x6764, 0x1420, 0x6765, 0x0F52, 0x6766, 0x212A, 0x676A, 0x1425,\n    0x676D, 0x07CC, 0x676E, 0x3571, 0x676F, 0x0D0B, 0x6770, 0x1422,\n    0x6771, 0x0C66, 0x6772, 0x13E3, 0x6773, 0x13E7, 0x6774, 0x456B,\n    0x6775, 0x0669, 0x6776, 0x391A, 0x6777, 0x0CFD, 0x677B, 0x391B,\n    0x677C, 0x1424, 0x677E, 0x09A6, 0x677F, 0x0D58, 0x6780, 0x4BF5,\n    0x6781, 0x4200, 0x6785, 0x142A, 0x6787, 0x0D8E, 0x6789, 0x1421,\n    0x678B, 0x1427, 0x678C, 0x1426, 0x678F, 0x4BF6, 0x6790, 0x0A73,\n    0x6791, 0x4BF7, 0x6792, 0x456D, 0x6793, 0x4201, 0x6795, 0x0E9B,\n    0x6797, 0x0F9B, 0x6798, 0x4202, 0x679A, 0x0E95, 0x679B, 0x4203,\n    0x679C, 0x054C, 0x679D, 0x08AC, 0x67A0, 0x0FEE, 0x67A1, 0x1429,\n    0x67A2, 0x0A3B, 0x67A4, 0x4BF8, 0x67A6, 0x1428, 0x67A9, 0x1423,\n    0x67AF, 0x0783, 0x67B0, 0x391C, 0x67B1, 0x4BF9, 0x67B2, 0x391D,\n    0x67B3, 0x142F, 0x67B4, 0x142D, 0x67B5, 0x4BFA, 0x67B6, 0x054D,\n    0x67B7, 0x142B, 0x67B8, 0x1431, 0x67B9, 0x1437, 0x67BB, 0x212B,\n    0x67BE, 0x4BFB, 0x67C0, 0x212D, 0x67C1, 0x0B28, 0x67C3, 0x4571,\n    0x67C4, 0x0E11, 0x67C6, 0x1439, 0x67C8, 0x4572, 0x67CA, 0x0D94,\n    0x67CE, 0x1438, 0x67CF, 0x0D26, 0x67D0, 0x0E6D, 0x67D1, 0x05F7,\n    0x67D2, 0x4573, 0x67D3, 0x0A9B, 0x67D4, 0x094A, 0x67D7, 0x391F,\n    0x67D8, 0x0BEF, 0x67D9, 0x3920, 0x67DA, 0x0F18, 0x67DB, 0x4574,\n    0x67DD, 0x1434, 0x67DE, 0x1433, 0x67E2, 0x1435, 0x67E4, 0x1432,\n    0x67E7, 0x143A, 0x67E9, 0x1430, 0x67EC, 0x142E, 0x67EE, 0x1436,\n    0x67EF, 0x142C, 0x67F0, 0x3921, 0x67F1, 0x0BAA, 0x67F3, 0x0F04,\n    0x67F4, 0x08F2, 0x67F5, 0x0864, 0x67F7, 0x4575, 0x67F9, 0x391E,\n    0x67FA, 0x1E9A, 0x67FB, 0x082A, 0x67FC, 0x4204, 0x67FE, 0x0E9D,\n    0x67FF, 0x059F, 0x6801, 0x36F2, 0x6802, 0x0BEA, 0x6803, 0x0CA2,\n    0x6804, 0x04EB, 0x6805, 0x1E07, 0x6810, 0x4570, 0x6813, 0x0A96,\n    0x6816, 0x0A58, 0x6817, 0x0700, 0x6818, 0x4579, 0x681D, 0x4205,\n    0x681E, 0x143C, 0x681F, 0x457A, 0x6821, 0x07CD, 0x6822, 0x05DA,\n    0x6828, 0x4BFC, 0x6829, 0x143E, 0x682A, 0x05D2, 0x682B, 0x1444,\n    0x682C, 0x3922, 0x682D, 0x457B, 0x6830, 0x3923, 0x6831, 0x3924,\n    0x6832, 0x1441, 0x6833, 0x457D, 0x6834, 0x0A97, 0x6838, 0x05A9,\n    0x6839, 0x081C, 0x683B, 0x457E, 0x683C, 0x05A8, 0x683D, 0x083F,\n    0x683E, 0x457F, 0x6840, 0x143F, 0x6841, 0x073B, 0x6842, 0x0721,\n    0x6843, 0x0C67, 0x6844, 0x212F, 0x6845, 0x4580, 0x6846, 0x143D,\n    0x6848, 0x048A, 0x6849, 0x4581, 0x684C, 0x4582, 0x684D, 0x1440,\n    0x684E, 0x1442, 0x6850, 0x06C5, 0x6851, 0x0702, 0x6852, 0x212C,\n    0x6853, 0x05F8, 0x6854, 0x0665, 0x6855, 0x4583, 0x6857, 0x4584,\n    0x6859, 0x1445, 0x685B, 0x3925, 0x685C, 0x0869, 0x685D, 0x0E9F,\n    0x685F, 0x0885, 0x6863, 0x1446, 0x6867, 0x0DA2, 0x686B, 0x4586,\n    0x686E, 0x4587, 0x6872, 0x3926, 0x6874, 0x1452, 0x6875, 0x3927,\n    0x6876, 0x0533, 0x6877, 0x1447, 0x687A, 0x3928, 0x687C, 0x4588,\n    0x687E, 0x1458, 0x687F, 0x1448, 0x6881, 0x0F8A, 0x6882, 0x4589,\n    0x6883, 0x144F, 0x6884, 0x3929, 0x6885, 0x0D15, 0x6886, 0x4BFD,\n    0x688D, 0x1457, 0x688E, 0x1E9C, 0x688F, 0x144A, 0x6890, 0x458A,\n    0x6893, 0x0478, 0x6894, 0x144C, 0x6896, 0x458B, 0x6897, 0x07CE,\n    0x6898, 0x458D, 0x6899, 0x458E, 0x689A, 0x458F, 0x689B, 0x144E,\n    0x689C, 0x4590, 0x689D, 0x144D, 0x689F, 0x1449, 0x68A0, 0x1454,\n    0x68A2, 0x09A7, 0x68A3, 0x4206, 0x68A5, 0x392A, 0x68A6, 0x11BE,\n    0x68A7, 0x079C, 0x68A8, 0x0F66, 0x68AA, 0x4591, 0x68AB, 0x4592,\n    0x68AD, 0x144B, 0x68AF, 0x0C10, 0x68B0, 0x0581, 0x68B1, 0x081D,\n    0x68B2, 0x392B, 0x68B3, 0x1443, 0x68B4, 0x4593, 0x68B5, 0x1453,\n    0x68B6, 0x05BF, 0x68B9, 0x1451, 0x68BA, 0x1455, 0x68BB, 0x4594,\n    0x68BC, 0x0C68, 0x68C3, 0x4598, 0x68C4, 0x063A, 0x68C5, 0x4599,\n    0x68C6, 0x1473, 0x68C8, 0x20AF, 0x68C9, 0x0ED5, 0x68CA, 0x145A,\n    0x68CB, 0x0639, 0x68CC, 0x459A, 0x68CD, 0x1461, 0x68CF, 0x2130,\n    0x68D0, 0x392C, 0x68D2, 0x0E6E, 0x68D4, 0x1462, 0x68D5, 0x1464,\n    0x68D6, 0x392D, 0x68D7, 0x1468, 0x68D8, 0x145C, 0x68D9, 0x459B,\n    0x68DA, 0x0B68, 0x68DF, 0x0C69, 0x68E0, 0x146C, 0x68E1, 0x145F,\n    0x68E3, 0x1469, 0x68E4, 0x459C, 0x68E5, 0x459D, 0x68E7, 0x1463,\n    0x68E8, 0x392E, 0x68EB, 0x4BFE, 0x68EC, 0x459E, 0x68ED, 0x392F,\n    0x68EE, 0x09FF, 0x68EF, 0x146D, 0x68F0, 0x3930, 0x68F1, 0x3931,\n    0x68F2, 0x0A57, 0x68F5, 0x4BFF, 0x68F7, 0x459F, 0x68F9, 0x146B,\n    0x68FA, 0x05F9, 0x68FB, 0x4595, 0x68FC, 0x3932, 0x6900, 0x0FF6,\n    0x6901, 0x1459, 0x6903, 0x45A0, 0x6904, 0x1467, 0x6905, 0x049C,\n    0x6907, 0x45A1, 0x6908, 0x145B, 0x690A, 0x4207, 0x690B, 0x0EC6,\n    0x690C, 0x1460, 0x690D, 0x09E8, 0x690E, 0x0BE3, 0x690F, 0x1456,\n    0x6911, 0x3933, 0x6912, 0x1466, 0x6913, 0x3934, 0x6917, 0x4C00,\n    0x6919, 0x0A40, 0x691A, 0x1470, 0x691B, 0x05CF, 0x691C, 0x0755,\n    0x6921, 0x1472, 0x6922, 0x145D, 0x6923, 0x1471, 0x6925, 0x146A,\n    0x6926, 0x145E, 0x6928, 0x146E, 0x692A, 0x146F, 0x6930, 0x1480,\n    0x6933, 0x4C01, 0x6934, 0x0CA6, 0x6935, 0x3935, 0x6936, 0x1465,\n    0x6938, 0x4C02, 0x6939, 0x147C, 0x693B, 0x3936, 0x693D, 0x147E,\n    0x693F, 0x0BF4, 0x6942, 0x420A, 0x6946, 0x45A5, 0x6949, 0x4208,\n    0x694A, 0x0F36, 0x6953, 0x0DE8, 0x6954, 0x1479, 0x6955, 0x0B2A,\n    0x6957, 0x3937, 0x6959, 0x147F, 0x695A, 0x0AC1, 0x695B, 0x4C03,\n    0x695C, 0x1476, 0x695D, 0x1483, 0x695E, 0x1482, 0x6960, 0x0CC7,\n    0x6961, 0x1481, 0x6962, 0x0CC2, 0x6963, 0x3938, 0x6964, 0x420B,\n    0x6965, 0x4C04, 0x6968, 0x2132, 0x6969, 0x45A6, 0x696A, 0x1485,\n    0x696B, 0x1478, 0x696C, 0x45A7, 0x696D, 0x06C0, 0x696E, 0x147B,\n    0x696F, 0x0967, 0x6972, 0x3939, 0x6973, 0x0D16, 0x6974, 0x147D,\n    0x6975, 0x06C3, 0x6977, 0x1475, 0x6978, 0x1477, 0x6979, 0x1474,\n    0x697A, 0x45A8, 0x697C, 0x0FD6, 0x697D, 0x05B8, 0x697E, 0x147A,\n    0x697F, 0x393A, 0x6980, 0x393B, 0x6981, 0x1484, 0x6982, 0x0593,\n    0x6986, 0x3740, 0x698A, 0x0857, 0x698E, 0x04FF, 0x6991, 0x1495,\n    0x6992, 0x45A9, 0x6994, 0x0FD7, 0x6995, 0x1498, 0x6996, 0x45AB,\n    0x6998, 0x2134, 0x699B, 0x0A00, 0x699C, 0x1497, 0x69A0, 0x1496,\n    0x69A5, 0x420C, 0x69A6, 0x393C, 0x69A7, 0x1493, 0x69A8, 0x4C05,\n    0x69AB, 0x4C06, 0x69AD, 0x393D, 0x69AE, 0x1487, 0x69AF, 0x4C07,\n    0x69B0, 0x45AC, 0x69B1, 0x14A4, 0x69B2, 0x1486, 0x69B4, 0x1499,\n    0x69B7, 0x393E, 0x69BA, 0x45AD, 0x69BB, 0x1491, 0x69BC, 0x45AE,\n    0x69BE, 0x148C, 0x69BF, 0x1489, 0x69C0, 0x45AF, 0x69C1, 0x148A,\n    0x69C3, 0x1492, 0x69C7, 0x1D33, 0x69CA, 0x148F, 0x69CB, 0x07CF,\n    0x69CC, 0x0BE4, 0x69CD, 0x0AE6, 0x69CE, 0x148D, 0x69CF, 0x420D,\n    0x69D0, 0x1488, 0x69D1, 0x45B0, 0x69D3, 0x148B, 0x69D6, 0x393F,\n    0x69D7, 0x3940, 0x69D8, 0x0F37, 0x69D9, 0x0E98, 0x69DD, 0x1490,\n    0x69DE, 0x149A, 0x69E2, 0x2135, 0x69E3, 0x45B4, 0x69E5, 0x4C08,\n    0x69E7, 0x14A2, 0x69E8, 0x149B, 0x69E9, 0x4210, 0x69EA, 0x3411,\n    0x69EB, 0x14A8, 0x69ED, 0x14A6, 0x69EE, 0x45B5, 0x69EF, 0x45B6,\n    0x69F1, 0x4C09, 0x69F2, 0x14A1, 0x69F3, 0x45B7, 0x69F4, 0x45B9,\n    0x69F5, 0x4211, 0x69F6, 0x373F, 0x69F9, 0x14A0, 0x69FB, 0x0BEC,\n    0x69FD, 0x0AE7, 0x69FE, 0x45BA, 0x69FF, 0x149E, 0x6A01, 0x3941,\n    0x6A02, 0x149C, 0x6A05, 0x14A3, 0x6A0A, 0x14A9, 0x6A0B, 0x0D89,\n    0x6A0C, 0x14AF, 0x6A0F, 0x3942, 0x6A11, 0x45BB, 0x6A12, 0x14AA,\n    0x6A13, 0x14AD, 0x6A14, 0x14A7, 0x6A15, 0x3943, 0x6A17, 0x0BB2,\n    0x6A19, 0x0DAA, 0x6A1A, 0x45BC, 0x6A1B, 0x149D, 0x6A1D, 0x45BD,\n    0x6A1E, 0x14A5, 0x6A1F, 0x09A8, 0x6A21, 0x0EDB, 0x6A22, 0x14B9,\n    0x6A23, 0x14AC, 0x6A28, 0x3944, 0x6A29, 0x0756, 0x6A2A, 0x0523,\n    0x6A2B, 0x05BD, 0x6A2E, 0x1494, 0x6A30, 0x2136, 0x6A32, 0x45BF,\n    0x6A33, 0x45C0, 0x6A34, 0x3945, 0x6A35, 0x09A9, 0x6A36, 0x14B1,\n    0x6A38, 0x14B8, 0x6A39, 0x0925, 0x6A3A, 0x05D0, 0x6A3B, 0x4213,\n    0x6A3D, 0x0B6C, 0x6A3E, 0x3946, 0x6A3F, 0x45C1, 0x6A44, 0x14AE,\n    0x6A45, 0x3947, 0x6A46, 0x2138, 0x6A47, 0x14B3, 0x6A48, 0x14B7,\n    0x6A49, 0x45C2, 0x6A4A, 0x4C0A, 0x6A4B, 0x06AE, 0x6A4E, 0x45C4,\n    0x6A50, 0x3948, 0x6A51, 0x3949, 0x6A52, 0x45C5, 0x6A54, 0x3C34,\n    0x6A55, 0x4C0B, 0x6A56, 0x394A, 0x6A58, 0x0666, 0x6A59, 0x14B5,\n    0x6A5B, 0x394B, 0x6A5F, 0x063B, 0x6A61, 0x0CA3, 0x6A62, 0x14B4,\n    0x6A64, 0x45C6, 0x6A66, 0x14B6, 0x6A67, 0x4C0C, 0x6A6B, 0x2137,\n    0x6A71, 0x4C0D, 0x6A72, 0x14B0, 0x6A73, 0x2139, 0x6A78, 0x14B2,\n    0x6A7A, 0x45C3, 0x6A7E, 0x213A, 0x6A7F, 0x05BE, 0x6A80, 0x0B87,\n    0x6A83, 0x394C, 0x6A84, 0x14BD, 0x6A89, 0x394D, 0x6A8B, 0x45C8,\n    0x6A8D, 0x14BB, 0x6A8E, 0x079D, 0x6A90, 0x14BA, 0x6A91, 0x394E,\n    0x6A94, 0x4215, 0x6A97, 0x14C0, 0x6A9C, 0x143B, 0x6A9D, 0x394F,\n    0x6A9E, 0x3950, 0x6A9F, 0x3951, 0x6AA0, 0x14BC, 0x6AA1, 0x45CA,\n    0x6AA2, 0x14BE, 0x6AA3, 0x14BF, 0x6AA5, 0x4216, 0x6AAA, 0x14CB,\n    0x6AAB, 0x45CC, 0x6AAC, 0x14C7, 0x6AAE, 0x1450, 0x6AAF, 0x4C0E,\n    0x6AB3, 0x14C6, 0x6AB8, 0x14C5, 0x6ABB, 0x14C2, 0x6ABD, 0x45CD,\n    0x6AC1, 0x14AB, 0x6AC2, 0x14C4, 0x6AC3, 0x14C3, 0x6AC6, 0x45CE,\n    0x6AC8, 0x4C0F, 0x6AC9, 0x4C10, 0x6AD0, 0x45D0, 0x6AD1, 0x14C9,\n    0x6AD3, 0x0FCC, 0x6AD4, 0x45CF, 0x6ADA, 0x14CC, 0x6ADB, 0x06F3,\n    0x6ADC, 0x3952, 0x6ADD, 0x45D1, 0x6ADE, 0x14C8, 0x6ADF, 0x14CA,\n    0x6AE2, 0x213B, 0x6AE4, 0x213C, 0x6AE7, 0x3953, 0x6AE8, 0x0D3B,\n    0x6AEA, 0x14CD, 0x6AEC, 0x3954, 0x6AF1, 0x45D4, 0x6AF2, 0x45D5,\n    0x6AF3, 0x45D6, 0x6AF8, 0x4EB8, 0x6AFA, 0x14D1, 0x6AFB, 0x14CE,\n    0x6AFD, 0x45D7, 0x6B03, 0x4C11, 0x6B04, 0x0F5D, 0x6B05, 0x14CF,\n    0x6B0A, 0x149F, 0x6B0B, 0x45D9, 0x6B0F, 0x45DA, 0x6B10, 0x45DB,\n    0x6B11, 0x45DC, 0x6B12, 0x14D2, 0x6B16, 0x14D3, 0x6B17, 0x45DE,\n    0x6B1B, 0x4218, 0x6B1D, 0x04D7, 0x6B1E, 0x3955, 0x6B1F, 0x14D5,\n    0x6B20, 0x073D, 0x6B21, 0x08CD, 0x6B23, 0x06CD, 0x6B24, 0x3956,\n    0x6B27, 0x0524, 0x6B2C, 0x4219, 0x6B2F, 0x45E0, 0x6B32, 0x0F49,\n    0x6B35, 0x3957, 0x6B37, 0x14D7, 0x6B38, 0x14D6, 0x6B39, 0x14D9,\n    0x6B3A, 0x0657, 0x6B3B, 0x4C12, 0x6B3D, 0x06CE, 0x6B3E, 0x05FA,\n    0x6B3F, 0x4C13, 0x6B43, 0x14DC, 0x6B46, 0x3958, 0x6B47, 0x14DB,\n    0x6B49, 0x14DD, 0x6B4A, 0x45E1, 0x6B4C, 0x054E, 0x6B4E, 0x0B75,\n    0x6B50, 0x14DE, 0x6B53, 0x05FB, 0x6B54, 0x14E0, 0x6B56, 0x3959,\n    0x6B58, 0x45E2, 0x6B59, 0x14DF, 0x6B5B, 0x14E1, 0x6B5F, 0x14E2,\n    0x6B60, 0x395A, 0x6B61, 0x14E3, 0x6B62, 0x08AD, 0x6B63, 0x0A59,\n    0x6B64, 0x0811, 0x6B65, 0x344A, 0x6B66, 0x0DE2, 0x6B67, 0x421A,\n    0x6B69, 0x0E32, 0x6B6A, 0x0FEA, 0x6B6C, 0x45E3, 0x6B6F, 0x08C3,\n    0x6B72, 0x35D9, 0x6B73, 0x0840, 0x6B74, 0x0FBA, 0x6B75, 0x45E4,\n    0x6B77, 0x3456, 0x6B78, 0x14E4, 0x6B79, 0x14E5, 0x6B7A, 0x45E5,\n    0x6B7B, 0x08AE, 0x6B7D, 0x4C14, 0x6B7E, 0x4C15, 0x6B7F, 0x14E6,\n    0x6B80, 0x14E7, 0x6B81, 0x45E6, 0x6B82, 0x395B, 0x6B83, 0x14E9,\n    0x6B84, 0x14E8, 0x6B86, 0x0E86, 0x6B89, 0x0968, 0x6B8A, 0x0918,\n    0x6B8B, 0x0892, 0x6B8D, 0x14EA, 0x6B95, 0x14EC, 0x6B96, 0x09E9,\n    0x6B98, 0x14EB, 0x6B9B, 0x45E7, 0x6B9E, 0x14ED, 0x6BA4, 0x14EE,\n    0x6BA9, 0x421B, 0x6BAA, 0x14EF, 0x6BAB, 0x14F0, 0x6BAD, 0x421C,\n    0x6BAE, 0x45E8, 0x6BAF, 0x14F1, 0x6BB0, 0x4C16, 0x6BB1, 0x14F3,\n    0x6BB2, 0x14F2, 0x6BB3, 0x14F4, 0x6BB4, 0x0525, 0x6BB5, 0x0B88,\n    0x6BB7, 0x14F5, 0x6BBA, 0x0874, 0x6BBB, 0x05AA, 0x6BBC, 0x14F6,\n    0x6BBD, 0x45EA, 0x6BBE, 0x395C, 0x6BBF, 0x0C3C, 0x6BC0, 0x119D,\n    0x6BC5, 0x063D, 0x6BC6, 0x14F7, 0x6BC7, 0x45EB, 0x6BC8, 0x45EC,\n    0x6BC9, 0x45ED, 0x6BCB, 0x14F8, 0x6BCC, 0x3744, 0x6BCD, 0x0E3C,\n    0x6BCE, 0x0E96, 0x6BCF, 0x344C, 0x6BD2, 0x0C9F, 0x6BD3, 0x14F9,\n    0x6BD4, 0x0D7A, 0x6BD6, 0x213D, 0x6BD7, 0x421D, 0x6BD8, 0x0D8F,\n    0x6BDA, 0x45EE, 0x6BDB, 0x0EDF, 0x6BDF, 0x14FA, 0x6BE1, 0x395D,\n    0x6BE6, 0x45EF, 0x6BE7, 0x45F0, 0x6BEB, 0x14FC, 0x6BEC, 0x14FB,\n    0x6BEE, 0x45F1, 0x6BEF, 0x14FE, 0x6BF1, 0x395E, 0x6BF3, 0x14FD,\n    0x6BF7, 0x4C17, 0x6BF9, 0x4C18, 0x6BFF, 0x421E, 0x6C02, 0x45F2,\n    0x6C04, 0x4C19, 0x6C05, 0x421F, 0x6C08, 0x1500, 0x6C09, 0x4C1A,\n    0x6C0A, 0x45F3, 0x6C0D, 0x4C1B, 0x6C0E, 0x45F4, 0x6C0F, 0x08AF,\n    0x6C10, 0x395F, 0x6C11, 0x0EBD, 0x6C13, 0x1501, 0x6C14, 0x1502,\n    0x6C17, 0x063E, 0x6C1B, 0x1503, 0x6C23, 0x1505, 0x6C24, 0x1504,\n    0x6C2C, 0x4C1C, 0x6C33, 0x3960, 0x6C34, 0x0A2B, 0x6C35, 0x3961,\n    0x6C36, 0x45F5, 0x6C37, 0x0DAB, 0x6C38, 0x04EC, 0x6C3A, 0x4F55,\n    0x6C3E, 0x0D59, 0x6C3F, 0x213E, 0x6C40, 0x0C11, 0x6C41, 0x094B,\n    0x6C42, 0x067B, 0x6C4A, 0x4C1D, 0x6C4D, 0x45F7, 0x6C4E, 0x0D5A,\n    0x6C50, 0x08DA, 0x6C52, 0x4C1E, 0x6C54, 0x4C1F, 0x6C55, 0x1507,\n    0x6C57, 0x05FC, 0x6C59, 0x3963, 0x6C5A, 0x051A, 0x6C5B, 0x45F8,\n    0x6C5C, 0x213F, 0x6C5D, 0x0CCA, 0x6C5E, 0x1506, 0x6C5F, 0x07D0,\n    0x6C60, 0x0B91, 0x6C62, 0x1508, 0x6C67, 0x460A, 0x6C68, 0x1510,\n    0x6C6A, 0x1509, 0x6C6D, 0x45F9, 0x6C6F, 0x2141, 0x6C70, 0x0B21,\n    0x6C72, 0x067C, 0x6C73, 0x1511, 0x6C74, 0x4220, 0x6C76, 0x3964,\n    0x6C79, 0x4C20, 0x6C7A, 0x073E, 0x6C7B, 0x3965, 0x6C7D, 0x063F,\n    0x6C7E, 0x150F, 0x6C81, 0x150D, 0x6C82, 0x150A, 0x6C83, 0x0F4A,\n    0x6C84, 0x45FA, 0x6C85, 0x3966, 0x6C86, 0x2140, 0x6C88, 0x0BDC,\n    0x6C89, 0x45FB, 0x6C8C, 0x0CB1, 0x6C8D, 0x150B, 0x6C90, 0x1513,\n    0x6C92, 0x1512, 0x6C93, 0x06F9, 0x6C94, 0x45FD, 0x6C95, 0x3967,\n    0x6C96, 0x052D, 0x6C97, 0x45FE, 0x6C98, 0x4221, 0x6C99, 0x082B,\n    0x6C9A, 0x150C, 0x6C9B, 0x150E, 0x6C9C, 0x3968, 0x6CA1, 0x0E85,\n    0x6CA2, 0x0B54, 0x6CAA, 0x3749, 0x6CAB, 0x0EA5, 0x6CAC, 0x4C21,\n    0x6CAD, 0x45FF, 0x6CAE, 0x151B, 0x6CB1, 0x151C, 0x6CB3, 0x054F,\n    0x6CB4, 0x4C22, 0x6CB8, 0x0DF8, 0x6CB9, 0x0F09, 0x6CBA, 0x151E,\n    0x6CBB, 0x08CF, 0x6CBC, 0x09AA, 0x6CBD, 0x1517, 0x6CBE, 0x151D,\n    0x6CBF, 0x050A, 0x6CC1, 0x06AF, 0x6CC2, 0x4600, 0x6CC4, 0x1514,\n    0x6CC5, 0x1519, 0x6CC6, 0x4223, 0x6CC9, 0x0A98, 0x6CCA, 0x0D27,\n    0x6CCC, 0x0D7B, 0x6CD0, 0x3969, 0x6CD2, 0x4C23, 0x6CD3, 0x1516,\n    0x6CD4, 0x396A, 0x6CD5, 0x0E4F, 0x6CD6, 0x396B, 0x6CD7, 0x1518,\n    0x6CD9, 0x1521, 0x6CDA, 0x2142, 0x6CDB, 0x151F, 0x6CDC, 0x4602,\n    0x6CDD, 0x151A, 0x6CE0, 0x396C, 0x6CE1, 0x0E50, 0x6CE2, 0x0CFE,\n    0x6CE3, 0x067D, 0x6CE5, 0x0C1F, 0x6CE8, 0x0BAB, 0x6CE9, 0x4603,\n    0x6CEA, 0x1522, 0x6CEB, 0x396D, 0x6CEC, 0x396E, 0x6CED, 0x4604,\n    0x6CEE, 0x396F, 0x6CEF, 0x1520, 0x6CF0, 0x0B39, 0x6CF1, 0x1515,\n    0x6CF3, 0x04ED, 0x6CFB, 0x4222, 0x6D00, 0x4606, 0x6D01, 0x3C35,\n    0x6D04, 0x2143, 0x6D0A, 0x3970, 0x6D0B, 0x0F38, 0x6D0C, 0x152D,\n    0x6D0E, 0x3971, 0x6D11, 0x3972, 0x6D12, 0x152C, 0x6D17, 0x0A9A,\n    0x6D19, 0x1529, 0x6D1B, 0x0F56, 0x6D1E, 0x0C8E, 0x6D1F, 0x1523,\n    0x6D24, 0x4607, 0x6D25, 0x0BE1, 0x6D26, 0x4608, 0x6D27, 0x4609,\n    0x6D29, 0x04EE, 0x6D2A, 0x07D1, 0x6D2B, 0x1526, 0x6D2E, 0x3973,\n    0x6D2F, 0x460B, 0x6D31, 0x4224, 0x6D32, 0x0931, 0x6D33, 0x152B,\n    0x6D34, 0x461E, 0x6D35, 0x152A, 0x6D36, 0x1525, 0x6D38, 0x1528,\n    0x6D39, 0x4225, 0x6D3B, 0x05C6, 0x6D3C, 0x460C, 0x6D3D, 0x1527,\n    0x6D3E, 0x0CFF, 0x6D3F, 0x4226, 0x6D41, 0x0F76, 0x6D44, 0x09DC,\n    0x6D45, 0x0A99, 0x6D57, 0x3974, 0x6D58, 0x4227, 0x6D59, 0x1533,\n    0x6D5A, 0x1531, 0x6D5B, 0x460D, 0x6D5C, 0x0DBF, 0x6D5E, 0x3975,\n    0x6D60, 0x460E, 0x6D61, 0x4C24, 0x6D63, 0x152E, 0x6D64, 0x1530,\n    0x6D65, 0x3976, 0x6D66, 0x04DC, 0x6D69, 0x07D2, 0x6D6A, 0x0FD8,\n    0x6D6C, 0x059B, 0x6D6E, 0x0DD4, 0x6D6F, 0x2145, 0x6D70, 0x460F,\n    0x6D74, 0x0F4B, 0x6D77, 0x0582, 0x6D78, 0x0A01, 0x6D79, 0x1532,\n    0x6D7C, 0x4C25, 0x6D80, 0x4610, 0x6D81, 0x4611, 0x6D82, 0x3977,\n    0x6D85, 0x1537, 0x6D87, 0x2144, 0x6D88, 0x09AB, 0x6D89, 0x342A,\n    0x6D8A, 0x4612, 0x6D8C, 0x0F1A, 0x6D8D, 0x4613, 0x6D8E, 0x1534,\n    0x6D91, 0x4614, 0x6D93, 0x152F, 0x6D94, 0x4228, 0x6D95, 0x1535,\n    0x6D96, 0x2146, 0x6D98, 0x4615, 0x6D99, 0x0FA6, 0x6D9B, 0x0C6D,\n    0x6D9C, 0x0C9A, 0x6DAA, 0x4229, 0x6DAB, 0x461A, 0x6DAC, 0x2147,\n    0x6DAE, 0x461B, 0x6DAF, 0x0594, 0x6DB2, 0x04F7, 0x6DB4, 0x461C,\n    0x6DB5, 0x153B, 0x6DB8, 0x153E, 0x6DB9, 0x4C26, 0x6DBC, 0x0F8B,\n    0x6DBF, 0x3978, 0x6DC0, 0x0F4E, 0x6DC2, 0x461D, 0x6DC4, 0x3979,\n    0x6DC5, 0x1545, 0x6DC6, 0x153F, 0x6DC7, 0x153C, 0x6DC8, 0x461F,\n    0x6DCA, 0x397A, 0x6DCB, 0x0F9C, 0x6DCC, 0x1542, 0x6DCE, 0x4620,\n    0x6DCF, 0x2148, 0x6DD0, 0x3C36, 0x6DD1, 0x0954, 0x6DD2, 0x1544,\n    0x6DD5, 0x1549, 0x6DD6, 0x397B, 0x6DD8, 0x0C6B, 0x6DD9, 0x1547,\n    0x6DDA, 0x3453, 0x6DDB, 0x422A, 0x6DDD, 0x422B, 0x6DDE, 0x1541,\n    0x6DDF, 0x4621, 0x6DE1, 0x0B76, 0x6DE4, 0x1548, 0x6DE6, 0x153D,\n    0x6DE8, 0x1543, 0x6DE9, 0x397C, 0x6DEA, 0x154A, 0x6DEB, 0x04C0,\n    0x6DEC, 0x1540, 0x6DEE, 0x154B, 0x6DF0, 0x4C27, 0x6DF1, 0x0A02,\n    0x6DF2, 0x214A, 0x6DF3, 0x0969, 0x6DF5, 0x0DF5, 0x6DF6, 0x4622,\n    0x6DF7, 0x081E, 0x6DF8, 0x2149, 0x6DF9, 0x1538, 0x6DFA, 0x1546,\n    0x6DFB, 0x0C34, 0x6DFC, 0x214B, 0x6E05, 0x0A5A, 0x6E07, 0x05C7,\n    0x6E08, 0x0841, 0x6E09, 0x09AC, 0x6E0A, 0x153A, 0x6E0B, 0x094C,\n    0x6E13, 0x0722, 0x6E15, 0x1539, 0x6E17, 0x3746, 0x6E19, 0x154F,\n    0x6E1A, 0x0977, 0x6E1B, 0x076E, 0x6E1D, 0x155E, 0x6E1E, 0x4624,\n    0x6E1F, 0x1558, 0x6E20, 0x068E, 0x6E21, 0x0C49, 0x6E22, 0x397D,\n    0x6E23, 0x1553, 0x6E24, 0x155C, 0x6E25, 0x0473, 0x6E26, 0x04D4,\n    0x6E27, 0x214E, 0x6E29, 0x0539, 0x6E2B, 0x1555, 0x6E2C, 0x0B0C,\n    0x6E2D, 0x154C, 0x6E2E, 0x154E, 0x6E2F, 0x07D3, 0x6E32, 0x4626,\n    0x6E34, 0x3412, 0x6E36, 0x4623, 0x6E38, 0x155F, 0x6E39, 0x214C,\n    0x6E3A, 0x155A, 0x6E3C, 0x214F, 0x6E3E, 0x1552, 0x6E42, 0x3C37,\n    0x6E43, 0x1559, 0x6E44, 0x422C, 0x6E45, 0x4C28, 0x6E48, 0x4627,\n    0x6E49, 0x4628, 0x6E4A, 0x0EB7, 0x6E4B, 0x4629, 0x6E4C, 0x462A,\n    0x6E4D, 0x1557, 0x6E4E, 0x155B, 0x6E4F, 0x462B, 0x6E51, 0x397E,\n    0x6E53, 0x462C, 0x6E54, 0x462D, 0x6E56, 0x0784, 0x6E57, 0x462E,\n    0x6E58, 0x09AD, 0x6E5B, 0x0B77, 0x6E5C, 0x214D, 0x6E5E, 0x422D,\n    0x6E5F, 0x1551, 0x6E63, 0x462F, 0x6E67, 0x0F19, 0x6E6B, 0x1554,\n    0x6E6E, 0x154D, 0x6E6F, 0x0C6C, 0x6E72, 0x1550, 0x6E73, 0x4C29,\n    0x6E76, 0x1556, 0x6E7B, 0x4C2A, 0x6E7D, 0x4C2B, 0x6E7E, 0x0FF7,\n    0x6E7F, 0x08EA, 0x6E80, 0x0EAC, 0x6E82, 0x1560, 0x6E89, 0x4C2C,\n    0x6E8C, 0x0D42, 0x6E8F, 0x156C, 0x6E90, 0x076F, 0x6E93, 0x4631,\n    0x6E96, 0x096A, 0x6E98, 0x1562, 0x6E9C, 0x0F77, 0x6E9D, 0x07D4,\n    0x6E9F, 0x156F, 0x6EA2, 0x04B2, 0x6EA5, 0x156D, 0x6EA7, 0x4632,\n    0x6EAA, 0x1561, 0x6EAB, 0x340C, 0x6EAF, 0x1567, 0x6EB1, 0x422E,\n    0x6EB2, 0x1569, 0x6EB4, 0x4633, 0x6EB6, 0x0F39, 0x6EB7, 0x1564,\n    0x6EBA, 0x0C28, 0x6EBC, 0x4C2D, 0x6EBD, 0x1566, 0x6EBF, 0x2150,\n    0x6EC1, 0x422F, 0x6EC2, 0x156E, 0x6EC3, 0x4634, 0x6EC4, 0x1568,\n    0x6EC5, 0x0ED3, 0x6EC7, 0x397F, 0x6EC9, 0x1563, 0x6ECA, 0x3980,\n    0x6ECB, 0x08CE, 0x6ECC, 0x157B, 0x6ECE, 0x3981, 0x6ED1, 0x05C8,\n    0x6ED3, 0x1565, 0x6ED4, 0x156A, 0x6ED5, 0x156B, 0x6ED9, 0x3C38,\n    0x6EDA, 0x4C2E, 0x6EDB, 0x4C2F, 0x6EDD, 0x0B4C, 0x6EDE, 0x0B3A,\n    0x6EE6, 0x3C24, 0x6EEB, 0x4636, 0x6EEC, 0x1573, 0x6EEF, 0x1579,\n    0x6EF2, 0x1577, 0x6EF4, 0x0C23, 0x6EF7, 0x157E, 0x6EF8, 0x1574,\n    0x6EF9, 0x4637, 0x6EFB, 0x4638, 0x6EFD, 0x3982, 0x6EFE, 0x1575,\n    0x6EFF, 0x155D, 0x6F01, 0x0693, 0x6F02, 0x0DAC, 0x6F06, 0x08EB,\n    0x6F09, 0x0809, 0x6F0A, 0x4639, 0x6F0C, 0x463A, 0x6F0F, 0x0FD9,\n    0x6F10, 0x4230, 0x6F11, 0x1571, 0x6F13, 0x157D, 0x6F14, 0x050B,\n    0x6F15, 0x0AE8, 0x6F18, 0x463B, 0x6F1A, 0x3983, 0x6F20, 0x0D2F,\n    0x6F22, 0x05FD, 0x6F23, 0x0FC2, 0x6F25, 0x463C, 0x6F26, 0x4C30,\n    0x6F29, 0x4C31, 0x6F2A, 0x3984, 0x6F2B, 0x0EAD, 0x6F2C, 0x0BEE,\n    0x6F2F, 0x3985, 0x6F30, 0x4C32, 0x6F31, 0x1578, 0x6F32, 0x157A,\n    0x6F33, 0x3986, 0x6F35, 0x4635, 0x6F36, 0x463D, 0x6F38, 0x0AB4,\n    0x6F3C, 0x463E, 0x6F3E, 0x157C, 0x6F3F, 0x1576, 0x6F41, 0x1570,\n    0x6F45, 0x05FF, 0x6F51, 0x1E60, 0x6F52, 0x4640, 0x6F54, 0x073F,\n    0x6F57, 0x4641, 0x6F58, 0x158A, 0x6F59, 0x4231, 0x6F5A, 0x3987,\n    0x6F5B, 0x1585, 0x6F5C, 0x0A9C, 0x6F5E, 0x3988, 0x6F5F, 0x05C1,\n    0x6F60, 0x4642, 0x6F61, 0x4232, 0x6F62, 0x3989, 0x6F64, 0x096B,\n    0x6F66, 0x158E, 0x6F68, 0x4643, 0x6F6D, 0x1587, 0x6F6E, 0x0BC8,\n    0x6F6F, 0x1584, 0x6F70, 0x0BF5, 0x6F74, 0x15A7, 0x6F78, 0x1581,\n    0x6F7A, 0x1580, 0x6F7C, 0x1589, 0x6F7D, 0x398A, 0x6F7E, 0x4233,\n    0x6F80, 0x1583, 0x6F81, 0x1582, 0x6F82, 0x1588, 0x6F84, 0x0A45,\n    0x6F86, 0x157F, 0x6F87, 0x4C33, 0x6F88, 0x2151, 0x6F8B, 0x398B,\n    0x6F8C, 0x4234, 0x6F8D, 0x398C, 0x6F8E, 0x158B, 0x6F90, 0x4644,\n    0x6F91, 0x158C, 0x6F92, 0x398D, 0x6F94, 0x398E, 0x6F96, 0x4645,\n    0x6F97, 0x05FE, 0x6F98, 0x363C, 0x6F9A, 0x398F, 0x6F9D, 0x4C34,\n    0x6F9F, 0x4647, 0x6FA0, 0x4235, 0x6FA1, 0x1591, 0x6FA3, 0x1590,\n    0x6FA4, 0x1592, 0x6FA5, 0x4648, 0x6FA7, 0x3990, 0x6FA8, 0x3991,\n    0x6FAA, 0x1595, 0x6FAE, 0x4C35, 0x6FAF, 0x4649, 0x6FB1, 0x0C3D,\n    0x6FB3, 0x158F, 0x6FB5, 0x2152, 0x6FB6, 0x3992, 0x6FB7, 0x4C36,\n    0x6FB9, 0x1593, 0x6FBC, 0x4236, 0x6FBE, 0x4646, 0x6FC0, 0x0739,\n    0x6FC1, 0x0B59, 0x6FC2, 0x158D, 0x6FC3, 0x0CF1, 0x6FC6, 0x1594,\n    0x6FC7, 0x4237, 0x6FC8, 0x464B, 0x6FC9, 0x464C, 0x6FCA, 0x4238,\n    0x6FD4, 0x1599, 0x6FD5, 0x1597, 0x6FD8, 0x159A, 0x6FDA, 0x3993,\n    0x6FDB, 0x159D, 0x6FDE, 0x3994, 0x6FDF, 0x1596, 0x6FE0, 0x07FC,\n    0x6FE1, 0x0CDE, 0x6FE4, 0x1536, 0x6FE9, 0x464D, 0x6FEB, 0x0F5E,\n    0x6FEC, 0x1598, 0x6FEE, 0x159C, 0x6FEF, 0x0B55, 0x6FF0, 0x4239,\n    0x6FF1, 0x159B, 0x6FF3, 0x1586, 0x6FF5, 0x2153, 0x6FF6, 0x1BA4,\n    0x6FF9, 0x3C23, 0x6FFA, 0x15A0, 0x6FFC, 0x464F, 0x6FFE, 0x15A4,\n    0x7000, 0x4650, 0x7001, 0x15A2, 0x7005, 0x2154, 0x7006, 0x1E50,\n    0x7007, 0x2155, 0x7009, 0x159E, 0x700A, 0x4651, 0x700B, 0x159F,\n    0x700D, 0x4C37, 0x700F, 0x15A3, 0x7011, 0x15A1, 0x7015, 0x0DC0,\n    0x7018, 0x15A9, 0x701A, 0x15A6, 0x701B, 0x15A5, 0x701D, 0x15A8,\n    0x701E, 0x0CAC, 0x701F, 0x15AA, 0x7020, 0x4C38, 0x7023, 0x4652,\n    0x7026, 0x0BB3, 0x7027, 0x0B4D, 0x7028, 0x2156, 0x702C, 0x0A49,\n    0x7030, 0x15AB, 0x7032, 0x15AD, 0x7039, 0x3996, 0x703A, 0x4654,\n    0x703C, 0x3997, 0x703E, 0x15AC, 0x7043, 0x4655, 0x7047, 0x4656,\n    0x7049, 0x4C39, 0x704A, 0x4F52, 0x704B, 0x4657, 0x704C, 0x1572,\n    0x704E, 0x423A, 0x7051, 0x15AE, 0x7054, 0x3999, 0x7058, 0x0CBF,\n    0x705D, 0x399A, 0x705E, 0x399B, 0x7063, 0x15AF, 0x7064, 0x399C,\n    0x7065, 0x4659, 0x7069, 0x465A, 0x706B, 0x0550, 0x706C, 0x399D,\n    0x706E, 0x465B, 0x706F, 0x0C6E, 0x7070, 0x0583, 0x7075, 0x423B,\n    0x7076, 0x465C, 0x7078, 0x067E, 0x707C, 0x090A, 0x707D, 0x0842,\n    0x707E, 0x399E, 0x7081, 0x399F, 0x7085, 0x2157, 0x7086, 0x465D,\n    0x7089, 0x0FCD, 0x708A, 0x0A2C, 0x708E, 0x050C, 0x7092, 0x15B1,\n    0x7095, 0x39A0, 0x7097, 0x465E, 0x7098, 0x4C3A, 0x7099, 0x15B0,\n    0x709F, 0x4660, 0x70A4, 0x423C, 0x70AB, 0x2158, 0x70AC, 0x15B4,\n    0x70AD, 0x0B78, 0x70AE, 0x15B7, 0x70AF, 0x15B2, 0x70B0, 0x4C3B,\n    0x70B1, 0x4661, 0x70B3, 0x15B6, 0x70B7, 0x39A1, 0x70B8, 0x15B5,\n    0x70B9, 0x0C3A, 0x70BA, 0x049D, 0x70BB, 0x20AD, 0x70C8, 0x0FBD,\n    0x70CA, 0x4664, 0x70CB, 0x15B9, 0x70CF, 0x04CA, 0x70D1, 0x4665,\n    0x70D3, 0x39A2, 0x70D4, 0x39A3, 0x70D5, 0x4C3C, 0x70D6, 0x4C3D,\n    0x70D8, 0x39A4, 0x70D9, 0x15BB, 0x70DC, 0x39A5, 0x70DD, 0x15BA,\n    0x70DF, 0x15B8, 0x70E4, 0x423D, 0x70EC, 0x4663, 0x70F1, 0x15B3,\n    0x70F9, 0x0E51, 0x70FD, 0x15BD, 0x7103, 0x4666, 0x7104, 0x215A,\n    0x7106, 0x4667, 0x7107, 0x39A6, 0x7108, 0x4668, 0x7109, 0x15BC,\n    0x710C, 0x4669, 0x710F, 0x2159, 0x7114, 0x050D, 0x7119, 0x15BF,\n    0x711A, 0x0E02, 0x711C, 0x15BE, 0x711E, 0x423F, 0x7120, 0x39A7,\n    0x7121, 0x0EC1, 0x7126, 0x09AF, 0x712B, 0x423E, 0x712E, 0x4240,\n    0x712F, 0x466B, 0x7130, 0x1DDC, 0x7131, 0x39A8, 0x7136, 0x0AB5,\n    0x713C, 0x09AE, 0x7145, 0x4C3E, 0x7146, 0x215C, 0x7147, 0x215D,\n    0x7149, 0x0FC3, 0x714A, 0x39A9, 0x714C, 0x15C5, 0x714E, 0x0A9D,\n    0x7150, 0x466C, 0x7151, 0x4241, 0x7152, 0x39AA, 0x7153, 0x466D,\n    0x7155, 0x15C1, 0x7156, 0x15C6, 0x7159, 0x050E, 0x715C, 0x215B,\n    0x715E, 0x466E, 0x7160, 0x39AB, 0x7162, 0x15C4, 0x7164, 0x0D17,\n    0x7165, 0x15C0, 0x7166, 0x15C3, 0x7167, 0x09B0, 0x7168, 0x4242,\n    0x7169, 0x0D65, 0x716C, 0x15C7, 0x716E, 0x08FD, 0x7179, 0x39AC,\n    0x717D, 0x0A9E, 0x7180, 0x4671, 0x7184, 0x15CA, 0x7185, 0x4243,\n    0x7187, 0x4244, 0x7188, 0x15C2, 0x718A, 0x06FD, 0x718F, 0x15C8,\n    0x7192, 0x39AD, 0x7194, 0x0F3A, 0x7195, 0x15CB, 0x7196, 0x4670,\n    0x7199, 0x205D, 0x719B, 0x4672, 0x719F, 0x0959, 0x71A0, 0x4673,\n    0x71A2, 0x4674, 0x71A8, 0x15CC, 0x71AC, 0x15CD, 0x71AE, 0x4675,\n    0x71AF, 0x4676, 0x71B1, 0x0CE4, 0x71B2, 0x4C3F, 0x71B3, 0x3C25,\n    0x71B9, 0x15CF, 0x71BA, 0x4245, 0x71BE, 0x15D0, 0x71C1, 0x215F,\n    0x71C3, 0x0CE9, 0x71C4, 0x4246, 0x71C8, 0x0C6F, 0x71C9, 0x15D2,\n    0x71CB, 0x39AF, 0x71CE, 0x15D4, 0x71D0, 0x0F9D, 0x71D2, 0x15D1,\n    0x71D3, 0x39B0, 0x71D4, 0x15D3, 0x71D5, 0x050F, 0x71D6, 0x39B1,\n    0x71D7, 0x15CE, 0x71D9, 0x4678, 0x71DC, 0x4679, 0x71DF, 0x114E,\n    0x71E0, 0x15D5, 0x71E5, 0x0AE9, 0x71E6, 0x0886, 0x71E7, 0x15D7,\n    0x71EC, 0x15D6, 0x71ED, 0x09EA, 0x71EE, 0x10EE, 0x71F4, 0x4C40,\n    0x71F5, 0x15D8, 0x71F9, 0x15DA, 0x71FB, 0x15C9, 0x71FC, 0x15D9,\n    0x71FE, 0x2160, 0x71FF, 0x15DB, 0x7200, 0x39B2, 0x7206, 0x0D30,\n    0x7207, 0x467A, 0x720D, 0x15DC, 0x7210, 0x15DD, 0x7215, 0x4247,\n    0x7217, 0x4C41, 0x721B, 0x15DE, 0x721D, 0x39B3, 0x721F, 0x4C42,\n    0x7228, 0x15DF, 0x722A, 0x0BFA, 0x722B, 0x39B4, 0x722C, 0x15E1,\n    0x722D, 0x15E0, 0x7230, 0x15E2, 0x7232, 0x15E3, 0x7234, 0x467C,\n    0x7235, 0x090B, 0x7236, 0x0DD5, 0x7238, 0x39B5, 0x7239, 0x467D,\n    0x723A, 0x0EF8, 0x723B, 0x15E4, 0x723C, 0x15E5, 0x723D, 0x0AD8,\n    0x723E, 0x08D0, 0x723F, 0x15E6, 0x7240, 0x15E7, 0x7241, 0x39B6,\n    0x7242, 0x467E, 0x7243, 0x4C43, 0x7246, 0x15E8, 0x7247, 0x0E22,\n    0x7248, 0x0D5B, 0x724B, 0x15E9, 0x724C, 0x0D0D, 0x724F, 0x4C44,\n    0x7250, 0x4C45, 0x7252, 0x0BC9, 0x7253, 0x39B7, 0x7255, 0x39B8,\n    0x7256, 0x39B9, 0x7257, 0x467F, 0x7258, 0x15EA, 0x7259, 0x0567,\n    0x725A, 0x4C46, 0x725B, 0x0687, 0x725C, 0x39BA, 0x725D, 0x0ED2,\n    0x725F, 0x0EC2, 0x7260, 0x4C47, 0x7261, 0x0534, 0x7262, 0x0FDA,\n    0x7263, 0x4680, 0x7267, 0x0E80, 0x7268, 0x4C48, 0x7269, 0x0DFA,\n    0x726E, 0x4682, 0x726F, 0x4683, 0x7272, 0x0A5B, 0x7274, 0x15EB,\n    0x7277, 0x4C49, 0x7278, 0x4684, 0x7279, 0x0C9B, 0x727D, 0x0757,\n    0x727E, 0x15EC, 0x727F, 0x4685, 0x7280, 0x0844, 0x7281, 0x15EE,\n    0x7282, 0x15ED, 0x7284, 0x4C4A, 0x7287, 0x15EF, 0x728D, 0x39BB,\n    0x728E, 0x4686, 0x7292, 0x15F0, 0x7296, 0x15F1, 0x729B, 0x4249,\n    0x72A0, 0x0658, 0x72A2, 0x15F2, 0x72A7, 0x15F3, 0x72AC, 0x0758,\n    0x72AD, 0x39BC, 0x72AE, 0x4688, 0x72AF, 0x0D5C, 0x72B0, 0x4689,\n    0x72B1, 0x2161, 0x72B2, 0x15F5, 0x72B4, 0x39BD, 0x72B6, 0x09DD,\n    0x72B9, 0x15F4, 0x72BE, 0x2162, 0x72C0, 0x342B, 0x72C1, 0x468A,\n    0x72C2, 0x06B0, 0x72C3, 0x15F6, 0x72C4, 0x15F8, 0x72C6, 0x15F7,\n    0x72C7, 0x39BE, 0x72C9, 0x4C4B, 0x72CC, 0x468C, 0x72CE, 0x15F9,\n    0x72D0, 0x0785, 0x72D2, 0x15FA, 0x72D7, 0x06E1, 0x72D9, 0x0AC2,\n    0x72DB, 0x080F, 0x72E0, 0x15FC, 0x72E1, 0x15FD, 0x72E2, 0x15FB,\n    0x72E5, 0x4C4C, 0x72E9, 0x0919, 0x72EC, 0x0CA0, 0x72ED, 0x06B1,\n    0x72F3, 0x468F, 0x72F4, 0x4C4D, 0x72F7, 0x15FF, 0x72F8, 0x0B6A,\n    0x72F9, 0x15FE, 0x72FA, 0x4690, 0x72FB, 0x39BF, 0x72FC, 0x0FDB,\n    0x72FD, 0x0D18, 0x7302, 0x4C4E, 0x7304, 0x39C0, 0x7305, 0x39C1,\n    0x7307, 0x4691, 0x730A, 0x1602, 0x730B, 0x4C4F, 0x7312, 0x4692,\n    0x7316, 0x1604, 0x7317, 0x1601, 0x7318, 0x4693, 0x7319, 0x4694,\n    0x731B, 0x0EE0, 0x731C, 0x1603, 0x731D, 0x1605, 0x731E, 0x4C50,\n    0x731F, 0x0F8C, 0x7322, 0x4C51, 0x7324, 0x2163, 0x7325, 0x1609,\n    0x7327, 0x424B, 0x7328, 0x39C2, 0x7329, 0x1608, 0x732A, 0x0BB4,\n    0x732B, 0x0CE3, 0x732C, 0x4697, 0x732E, 0x0759, 0x732F, 0x1607,\n    0x7331, 0x39C3, 0x7333, 0x4698, 0x7334, 0x1606, 0x7336, 0x0F1B,\n    0x7337, 0x0F1C, 0x7339, 0x4696, 0x733A, 0x4C52, 0x733B, 0x4C53,\n    0x733D, 0x4699, 0x733E, 0x160A, 0x733F, 0x0510, 0x7343, 0x39C4,\n    0x7344, 0x0808, 0x7345, 0x08B0, 0x734D, 0x4C54, 0x734E, 0x160B,\n    0x734F, 0x160C, 0x7350, 0x424C, 0x7352, 0x469A, 0x7357, 0x160E,\n    0x7358, 0x4C55, 0x7363, 0x094D, 0x7366, 0x424D, 0x7367, 0x4C56,\n    0x7368, 0x1610, 0x736A, 0x160F, 0x736B, 0x469C, 0x736C, 0x39C5,\n    0x736E, 0x469E, 0x736F, 0x469F, 0x7370, 0x1611, 0x7371, 0x46A0,\n    0x7372, 0x05AB, 0x7375, 0x1613, 0x7377, 0x2165, 0x7378, 0x1612,\n    0x737A, 0x1615, 0x737B, 0x1614, 0x737C, 0x39C6, 0x7381, 0x46A1,\n    0x7383, 0x39C7, 0x7384, 0x0770, 0x7385, 0x39C8, 0x7386, 0x39C9,\n    0x7387, 0x0F70, 0x7389, 0x06C4, 0x738A, 0x46A2, 0x738B, 0x0526,\n    0x7394, 0x46A3, 0x7395, 0x39CA, 0x7396, 0x06E2, 0x7398, 0x46A4,\n    0x739C, 0x46A5, 0x739E, 0x39CB, 0x739F, 0x39CC, 0x73A0, 0x39CD,\n    0x73A2, 0x424E, 0x73A5, 0x46A6, 0x73A6, 0x39CE, 0x73A8, 0x3C3F,\n    0x73A9, 0x061D, 0x73AB, 0x39CF, 0x73B2, 0x0FB0, 0x73B3, 0x1617,\n    0x73B5, 0x39D0, 0x73B7, 0x39D1, 0x73B9, 0x46A7, 0x73BA, 0x35EA,\n    0x73BB, 0x1619, 0x73BC, 0x39D2, 0x73BD, 0x2166, 0x73BF, 0x46A8,\n    0x73C0, 0x161A, 0x73C2, 0x0551, 0x73C5, 0x46A9, 0x73C8, 0x1616,\n    0x73C9, 0x2167, 0x73CA, 0x0887, 0x73CB, 0x46AA, 0x73CD, 0x0BDD,\n    0x73CE, 0x1618, 0x73CF, 0x39D3, 0x73D2, 0x216A, 0x73D6, 0x2168,\n    0x73D9, 0x39D4, 0x73DE, 0x161D, 0x73E0, 0x091A, 0x73E1, 0x46AB,\n    0x73E3, 0x2169, 0x73E4, 0x3C39, 0x73E5, 0x161B, 0x73E7, 0x46AC,\n    0x73E9, 0x39D5, 0x73EA, 0x0714, 0x73ED, 0x0D5D, 0x73EE, 0x161C,\n    0x73F1, 0x1637, 0x73F4, 0x39D6, 0x73F5, 0x216C, 0x73F8, 0x1622,\n    0x73F9, 0x46AD, 0x73FA, 0x46AF, 0x73FD, 0x39D7, 0x73FE, 0x0771,\n    0x7401, 0x46B0, 0x7403, 0x067F, 0x7404, 0x39D8, 0x7405, 0x161F,\n    0x7406, 0x0F67, 0x7407, 0x216B, 0x7409, 0x0F78, 0x740A, 0x39D9,\n    0x7413, 0x46AE, 0x741A, 0x39DA, 0x741B, 0x39DB, 0x7421, 0x3C3A,\n    0x7422, 0x0B56, 0x7424, 0x39DC, 0x7425, 0x1621, 0x7426, 0x216D,\n    0x7428, 0x39DD, 0x7429, 0x216F, 0x742A, 0x216E, 0x742B, 0x424F,\n    0x742C, 0x39DE, 0x742E, 0x2170, 0x742F, 0x39DF, 0x7430, 0x39E0,\n    0x7431, 0x39E1, 0x7432, 0x1623, 0x7433, 0x0F9E, 0x7434, 0x06CF,\n    0x7435, 0x0D90, 0x7436, 0x0D00, 0x7439, 0x39E2, 0x743A, 0x1624,\n    0x743F, 0x1626, 0x7440, 0x46B2, 0x7441, 0x1629, 0x7443, 0x46B3,\n    0x7444, 0x39E3, 0x7446, 0x4250, 0x7447, 0x39E4, 0x744B, 0x39E5,\n    0x744D, 0x39E6, 0x7451, 0x39E7, 0x7452, 0x46B4, 0x7453, 0x46B1,\n    0x7455, 0x1625, 0x7457, 0x39E8, 0x7459, 0x1628, 0x745A, 0x079E,\n    0x745B, 0x04EF, 0x745C, 0x162A, 0x745D, 0x46B5, 0x745E, 0x0A36,\n    0x745F, 0x1627, 0x7460, 0x0FA4, 0x7462, 0x4251, 0x7463, 0x162D,\n    0x7464, 0x1D35, 0x7466, 0x39E9, 0x7469, 0x162B, 0x746A, 0x162E,\n    0x746B, 0x39EA, 0x746D, 0x4252, 0x746F, 0x1620, 0x7470, 0x162C,\n    0x7471, 0x39EB, 0x7472, 0x4C57, 0x7473, 0x082C, 0x7476, 0x162F,\n    0x747E, 0x1630, 0x7480, 0x39EC, 0x7481, 0x46B6, 0x7483, 0x0F68,\n    0x7485, 0x39ED, 0x7486, 0x39EE, 0x7487, 0x39EF, 0x7488, 0x46B7,\n    0x7489, 0x2172, 0x748B, 0x1631, 0x7490, 0x39F0, 0x7492, 0x46B9,\n    0x7497, 0x46BA, 0x7498, 0x39F1, 0x7499, 0x46BB, 0x749C, 0x39F2,\n    0x749E, 0x1632, 0x749F, 0x2173, 0x74A0, 0x39F3, 0x74A1, 0x46BC,\n    0x74A2, 0x161E, 0x74A3, 0x39F4, 0x74A5, 0x46BD, 0x74A6, 0x4253,\n    0x74A7, 0x1633, 0x74A8, 0x39F5, 0x74A9, 0x4254, 0x74AA, 0x46BE,\n    0x74AB, 0x39F6, 0x74AF, 0x4C58, 0x74B0, 0x0600, 0x74B5, 0x39F7,\n    0x74B9, 0x46BF, 0x74BA, 0x46C1, 0x74BB, 0x46C0, 0x74BD, 0x08D1,\n    0x74BF, 0x39F8, 0x74C8, 0x39F9, 0x74C9, 0x4255, 0x74CA, 0x1634,\n    0x74CF, 0x1635, 0x74D4, 0x1636, 0x74D6, 0x46C2, 0x74D8, 0x46C3,\n    0x74DA, 0x39FA, 0x74DC, 0x04DD, 0x74DE, 0x39FB, 0x74DF, 0x4C59,\n    0x74E0, 0x1638, 0x74E2, 0x0DAD, 0x74E3, 0x1639, 0x74E4, 0x4C5A,\n    0x74E6, 0x05E0, 0x74E7, 0x163A, 0x74E9, 0x163B, 0x74EB, 0x46C4,\n    0x74EE, 0x163C, 0x74EF, 0x3750, 0x74F0, 0x163E, 0x74F1, 0x163F,\n    0x74F2, 0x163D, 0x74F4, 0x4C5B, 0x74F6, 0x0DC5, 0x74F7, 0x1641,\n    0x74F8, 0x1640, 0x74FA, 0x46C6, 0x74FB, 0x4C5C, 0x74FF, 0x4256,\n    0x7501, 0x2174, 0x7503, 0x1643, 0x7504, 0x1642, 0x7505, 0x1644,\n    0x750C, 0x1645, 0x750D, 0x1647, 0x750E, 0x1646, 0x7511, 0x080B,\n    0x7513, 0x1649, 0x7515, 0x1648, 0x7516, 0x4C5D, 0x7517, 0x4257,\n    0x7518, 0x0601, 0x751A, 0x0A19, 0x751C, 0x0C36, 0x751E, 0x164A,\n    0x751F, 0x0A5C, 0x7520, 0x46C8, 0x7521, 0x4C5E, 0x7522, 0x35DE,\n    0x7523, 0x0888, 0x7524, 0x46C9, 0x7525, 0x051B, 0x7526, 0x164B,\n    0x7528, 0x0F3B, 0x752A, 0x46CA, 0x752B, 0x0E33, 0x752C, 0x164C,\n    0x752F, 0x20F2, 0x7530, 0x0C3E, 0x7531, 0x0F1D, 0x7532, 0x07D5,\n    0x7533, 0x0A03, 0x7537, 0x0B89, 0x7538, 0x10C9, 0x753A, 0x0BCA,\n    0x753B, 0x0568, 0x753C, 0x164D, 0x753D, 0x46CD, 0x753E, 0x46CE,\n    0x753F, 0x4C5F, 0x7540, 0x46CF, 0x7544, 0x164E, 0x7546, 0x1653,\n    0x7548, 0x46D0, 0x7549, 0x1651, 0x754A, 0x1650, 0x754B, 0x13C7,\n    0x754C, 0x0584, 0x754D, 0x164F, 0x754E, 0x39FC, 0x754F, 0x049E,\n    0x7550, 0x46D1, 0x7551, 0x0D3E, 0x7552, 0x46D2, 0x7554, 0x0D5E,\n    0x7559, 0x0F79, 0x755A, 0x1654, 0x755B, 0x1652, 0x755C, 0x0B9A,\n    0x755D, 0x0A4A, 0x755E, 0x4C60, 0x7560, 0x0D3F, 0x7562, 0x0D9F,\n    0x7564, 0x1656, 0x7565, 0x0F74, 0x7566, 0x0723, 0x7567, 0x1657,\n    0x7569, 0x1655, 0x756A, 0x0D6A, 0x756B, 0x1658, 0x756C, 0x3C3B,\n    0x756D, 0x1659, 0x756F, 0x2175, 0x7570, 0x049F, 0x7571, 0x46D4,\n    0x7572, 0x46D3, 0x7573, 0x09DE, 0x7574, 0x165E, 0x7575, 0x3751,\n    0x7576, 0x165B, 0x7577, 0x0CC5, 0x7578, 0x165A, 0x7579, 0x39FD,\n    0x757A, 0x46D5, 0x757D, 0x46D6, 0x757E, 0x46D7, 0x757F, 0x0640,\n    0x7581, 0x39FE, 0x7582, 0x1661, 0x7586, 0x165C, 0x7587, 0x165D,\n    0x7589, 0x1660, 0x758A, 0x165F, 0x758B, 0x0D97, 0x758C, 0x46D8,\n    0x758E, 0x0AC4, 0x758F, 0x0AC3, 0x7590, 0x39FF, 0x7591, 0x0659,\n    0x7592, 0x3A00, 0x7593, 0x3A01, 0x7594, 0x1662, 0x7599, 0x4C61,\n    0x759A, 0x1663, 0x759D, 0x1664, 0x75A2, 0x46DA, 0x75A3, 0x1666,\n    0x75A4, 0x4C62, 0x75A5, 0x1665, 0x75AB, 0x04F8, 0x75B0, 0x46DC,\n    0x75B1, 0x166E, 0x75B2, 0x0D7C, 0x75B3, 0x1668, 0x75B4, 0x3A02,\n    0x75B5, 0x166A, 0x75B7, 0x46DD, 0x75B8, 0x166C, 0x75B9, 0x0A04,\n    0x75BC, 0x166D, 0x75BD, 0x166B, 0x75BE, 0x08EC, 0x75BF, 0x46DE,\n    0x75C0, 0x46DF, 0x75C1, 0x4C63, 0x75C2, 0x1667, 0x75C3, 0x1669,\n    0x75C4, 0x4C64, 0x75C5, 0x0DB4, 0x75C6, 0x46E0, 0x75C7, 0x09B1,\n    0x75CA, 0x1670, 0x75CC, 0x4C65, 0x75CD, 0x166F, 0x75CE, 0x4259,\n    0x75CF, 0x46E1, 0x75D2, 0x1671, 0x75D3, 0x46E2, 0x75D4, 0x08D2,\n    0x75D5, 0x081F, 0x75D7, 0x4C66, 0x75D8, 0x0C71, 0x75D9, 0x1672,\n    0x75DB, 0x0BE7, 0x75DC, 0x4C67, 0x75DD, 0x46E3, 0x75DE, 0x1674,\n    0x75DF, 0x46E4, 0x75E0, 0x46E5, 0x75E1, 0x4C68, 0x75E2, 0x0F69,\n    0x75E3, 0x1673, 0x75E4, 0x3A03, 0x75E7, 0x46E6, 0x75E9, 0x0AEB,\n    0x75EC, 0x3752, 0x75EE, 0x46E7, 0x75EF, 0x4C69, 0x75F0, 0x1679,\n    0x75F1, 0x46E8, 0x75F2, 0x167B, 0x75F3, 0x167C, 0x75F4, 0x0B92,\n    0x75F9, 0x3A04, 0x75FA, 0x167A, 0x75FC, 0x1677, 0x75FE, 0x1675,\n    0x75FF, 0x1676, 0x7600, 0x3A05, 0x7601, 0x1678, 0x7602, 0x425A,\n    0x7603, 0x46E9, 0x7604, 0x4C6A, 0x7607, 0x46EB, 0x7608, 0x425B,\n    0x7609, 0x167F, 0x760A, 0x3A06, 0x760B, 0x167D, 0x760C, 0x4C6B,\n    0x760D, 0x167E, 0x760F, 0x46EC, 0x7613, 0x46EF, 0x7615, 0x3A07,\n    0x7616, 0x3A08, 0x7618, 0x46EA, 0x7619, 0x3A09, 0x761B, 0x46F0,\n    0x761C, 0x46F1, 0x761D, 0x4C6C, 0x761E, 0x3A0A, 0x761F, 0x1680,\n    0x7620, 0x1682, 0x7621, 0x1683, 0x7622, 0x1684, 0x7624, 0x1685,\n    0x7625, 0x46F3, 0x7626, 0x3645, 0x7627, 0x1681, 0x7628, 0x46F4,\n    0x762D, 0x3A0B, 0x7630, 0x1687, 0x7632, 0x4C6D, 0x7633, 0x46F6,\n    0x7634, 0x1686, 0x7635, 0x3A0C, 0x7638, 0x4C6E, 0x763B, 0x1688,\n    0x763C, 0x46F5, 0x7641, 0x46F9, 0x7642, 0x0F8D, 0x7643, 0x3A0D,\n    0x7645, 0x4C6F, 0x7646, 0x168B, 0x7647, 0x1689, 0x7648, 0x168A,\n    0x7649, 0x46FB, 0x764A, 0x4C70, 0x764B, 0x3A0E, 0x764C, 0x061E,\n    0x764E, 0x3753, 0x7652, 0x0F0A, 0x7655, 0x46FC, 0x7656, 0x0E1A,\n    0x7658, 0x168D, 0x765C, 0x168C, 0x765F, 0x4C71, 0x7661, 0x168E,\n    0x7662, 0x168F, 0x7664, 0x425C, 0x7665, 0x3A0F, 0x7667, 0x1693,\n    0x7668, 0x1690, 0x7669, 0x1691, 0x766A, 0x1692, 0x766C, 0x1694,\n    0x766D, 0x3A10, 0x766E, 0x46FE, 0x766F, 0x3A11, 0x7670, 0x1695,\n    0x7671, 0x3A12, 0x7672, 0x1696, 0x7674, 0x3A13, 0x7676, 0x1697,\n    0x7678, 0x1698, 0x767A, 0x0D43, 0x767B, 0x0C4A, 0x767C, 0x1699,\n    0x767D, 0x0D28, 0x767E, 0x0DA6, 0x7680, 0x169A, 0x7681, 0x425D,\n    0x7682, 0x2176, 0x7683, 0x169B, 0x7684, 0x0C24, 0x7686, 0x0585,\n    0x7687, 0x07D6, 0x7688, 0x169C, 0x768B, 0x169D, 0x768E, 0x169E,\n    0x7690, 0x0877, 0x7693, 0x16A0, 0x7695, 0x46FF, 0x7696, 0x169F,\n    0x7699, 0x16A1, 0x769A, 0x16A2, 0x769B, 0x2179, 0x769C, 0x2177,\n    0x769D, 0x425E, 0x769E, 0x2178, 0x76A0, 0x4701, 0x76A1, 0x4700,\n    0x76A4, 0x3A14, 0x76A5, 0x3A15, 0x76A6, 0x217A, 0x76A7, 0x4702,\n    0x76A8, 0x4703, 0x76AA, 0x425F, 0x76AD, 0x4C72, 0x76AE, 0x0D7D,\n    0x76AF, 0x4704, 0x76B0, 0x16A3, 0x76B4, 0x16A4, 0x76B6, 0x4260,\n    0x76B7, 0x1D1C, 0x76B8, 0x16A5, 0x76B9, 0x16A6, 0x76BA, 0x16A7,\n    0x76BD, 0x4C73, 0x76BF, 0x087C, 0x76C2, 0x16A8, 0x76C3, 0x0D0C,\n    0x76C5, 0x3A16, 0x76C6, 0x0E8D, 0x76C8, 0x04F0, 0x76C9, 0x4706,\n    0x76CA, 0x04F9, 0x76CC, 0x3A17, 0x76CD, 0x16A9, 0x76CE, 0x4261,\n    0x76D2, 0x16AB, 0x76D4, 0x4262, 0x76D6, 0x16AA, 0x76D7, 0x0C6A,\n    0x76D9, 0x4C74, 0x76DB, 0x0A5D, 0x76DC, 0x14D8, 0x76DE, 0x16AC,\n    0x76DF, 0x0ECD, 0x76E1, 0x16AD, 0x76E3, 0x0602, 0x76E4, 0x0D6B,\n    0x76E5, 0x16AE, 0x76E6, 0x4263, 0x76E7, 0x16AF, 0x76E8, 0x4708,\n    0x76EA, 0x16B0, 0x76EB, 0x4C75, 0x76EC, 0x3A18, 0x76EE, 0x0EE8,\n    0x76F0, 0x4C76, 0x76F1, 0x4264, 0x76F2, 0x0EE1, 0x76F4, 0x0BDA,\n    0x76F8, 0x0AEC, 0x76F9, 0x4C77, 0x76FB, 0x16B2, 0x76FC, 0x3A19,\n    0x76FE, 0x096C, 0x7700, 0x4C78, 0x7701, 0x09B2, 0x7704, 0x16B5,\n    0x7707, 0x16B4, 0x7708, 0x16B3, 0x7709, 0x0D91, 0x770A, 0x4265,\n    0x770B, 0x0603, 0x770C, 0x075D, 0x770E, 0x4C79, 0x7717, 0x470A,\n    0x7719, 0x4266, 0x771A, 0x470B, 0x771B, 0x16BB, 0x771E, 0x16B8,\n    0x771F, 0x0A05, 0x7720, 0x0EBE, 0x7722, 0x4C7A, 0x7724, 0x16B7,\n    0x7725, 0x16B9, 0x7726, 0x16BA, 0x7728, 0x4C7B, 0x7729, 0x16B6,\n    0x772D, 0x470C, 0x772F, 0x4C7C, 0x7734, 0x3A1A, 0x7735, 0x470D,\n    0x7736, 0x3A1B, 0x7737, 0x16BC, 0x7738, 0x16BD, 0x7739, 0x4C7D,\n    0x773A, 0x0BCB, 0x773C, 0x061F, 0x773E, 0x4C7E, 0x7740, 0x0BA3,\n    0x7745, 0x4C7F, 0x7746, 0x217C, 0x7747, 0x16BE, 0x774A, 0x4C80,\n    0x774D, 0x4267, 0x774E, 0x4268, 0x774F, 0x4C81, 0x7758, 0x4712,\n    0x775A, 0x16BF, 0x775B, 0x16C2, 0x775C, 0x3A1C, 0x775E, 0x4C82,\n    0x775F, 0x3A1D, 0x7760, 0x3A1E, 0x7761, 0x0A2D, 0x7762, 0x1EC5,\n    0x7763, 0x0C9C, 0x7764, 0x4C83, 0x7765, 0x16C3, 0x7766, 0x0E81,\n    0x7767, 0x4C84, 0x7768, 0x16C0, 0x776A, 0x3755, 0x776B, 0x16C1,\n    0x776C, 0x4C85, 0x7772, 0x3A1F, 0x7779, 0x16C6, 0x777A, 0x4269,\n    0x777C, 0x4714, 0x777D, 0x3A20, 0x777E, 0x16C5, 0x777F, 0x16C4,\n    0x7780, 0x426A, 0x7784, 0x4C86, 0x778B, 0x16C8, 0x778C, 0x4C87,\n    0x778D, 0x4C88, 0x778E, 0x16C7, 0x7791, 0x16C9, 0x7794, 0x426B,\n    0x7795, 0x3A21, 0x7796, 0x4C89, 0x779A, 0x4717, 0x779E, 0x16CB,\n    0x779F, 0x4718, 0x77A0, 0x16CA, 0x77A2, 0x4719, 0x77A4, 0x471A,\n    0x77A5, 0x0E1D, 0x77A7, 0x4C8A, 0x77A9, 0x3756, 0x77AA, 0x3A22,\n    0x77AC, 0x0960, 0x77AD, 0x0F8E, 0x77AF, 0x4C8B, 0x77B0, 0x16CC,\n    0x77B3, 0x0C8F, 0x77B6, 0x16CD, 0x77B7, 0x4C8C, 0x77B9, 0x16CE,\n    0x77BB, 0x16D2, 0x77BC, 0x16D0, 0x77BD, 0x16D1, 0x77BE, 0x4C8D,\n    0x77BF, 0x16CF, 0x77C7, 0x16D3, 0x77C9, 0x4C8E, 0x77CD, 0x16D4,\n    0x77D1, 0x4C8F, 0x77D7, 0x16D5, 0x77D9, 0x4C90, 0x77DA, 0x16D6,\n    0x77DB, 0x0EC3, 0x77DC, 0x16D7, 0x77DE, 0x471B, 0x77DF, 0x471C,\n    0x77E0, 0x426C, 0x77E2, 0x0EFC, 0x77E3, 0x16D8, 0x77E4, 0x471D,\n    0x77E5, 0x0B8C, 0x77E6, 0x3A23, 0x77E7, 0x0D20, 0x77E9, 0x06E3,\n    0x77EA, 0x471E, 0x77EC, 0x471F, 0x77ED, 0x0B79, 0x77EE, 0x16D9,\n    0x77EF, 0x06B2, 0x77F0, 0x3A24, 0x77F1, 0x4C91, 0x77F3, 0x0A74,\n    0x77F4, 0x3A25, 0x77FB, 0x4720, 0x77FC, 0x16DA, 0x7802, 0x082D,\n    0x7805, 0x4722, 0x7806, 0x3A26, 0x7809, 0x4723, 0x780C, 0x16DB,\n    0x780D, 0x4724, 0x7812, 0x16DC, 0x7814, 0x075A, 0x7815, 0x0845,\n    0x7819, 0x4725, 0x7820, 0x16DE, 0x7821, 0x217E, 0x7822, 0x3A27,\n    0x7825, 0x0C50, 0x7826, 0x0846, 0x7827, 0x0668, 0x782C, 0x4726,\n    0x782D, 0x3A28, 0x782E, 0x3A29, 0x7830, 0x3A2A, 0x7832, 0x0E52,\n    0x7834, 0x0D01, 0x7835, 0x3A2B, 0x7837, 0x4C92, 0x783A, 0x0C51,\n    0x783F, 0x07EE, 0x7843, 0x426E, 0x7845, 0x16E0, 0x7847, 0x4727,\n    0x784E, 0x217F, 0x784F, 0x341E, 0x7851, 0x3C3C, 0x785C, 0x4C93,\n    0x785D, 0x09B3, 0x7864, 0x2180, 0x7868, 0x3A2C, 0x786A, 0x4728,\n    0x786B, 0x0F7A, 0x786C, 0x07D7, 0x786E, 0x426F, 0x786F, 0x075B,\n    0x7872, 0x0D37, 0x7874, 0x16E2, 0x787A, 0x2181, 0x787C, 0x16E4,\n    0x787E, 0x4C94, 0x7881, 0x079F, 0x7886, 0x16E3, 0x7887, 0x0C12,\n    0x788A, 0x472A, 0x788C, 0x16E6, 0x788D, 0x0595, 0x788E, 0x16E1,\n    0x7891, 0x0D7E, 0x7893, 0x04D2, 0x7894, 0x472B, 0x7895, 0x085C,\n    0x7897, 0x0FF8, 0x7898, 0x4C95, 0x789A, 0x16E5, 0x789D, 0x472D,\n    0x789E, 0x3A2D, 0x789F, 0x472E, 0x78A1, 0x4C96, 0x78A3, 0x16E7,\n    0x78A4, 0x472C, 0x78A7, 0x0E1B, 0x78A9, 0x0A7D, 0x78AA, 0x16E9,\n    0x78AD, 0x4272, 0x78AF, 0x16EA, 0x78B0, 0x4270, 0x78B1, 0x4C97,\n    0x78B3, 0x4C98, 0x78B5, 0x16E8, 0x78BA, 0x05AC, 0x78BB, 0x472F,\n    0x78BC, 0x16F0, 0x78BE, 0x16EF, 0x78C1, 0x08D3, 0x78C5, 0x16F1,\n    0x78C6, 0x16EC, 0x78C8, 0x3A2E, 0x78C9, 0x4C99, 0x78CA, 0x16F2,\n    0x78CB, 0x16ED, 0x78CC, 0x3A2F, 0x78CE, 0x3A30, 0x78D0, 0x0D6C,\n    0x78D1, 0x16EB, 0x78D3, 0x4C9A, 0x78D4, 0x16EE, 0x78D5, 0x4730,\n    0x78DA, 0x16F5, 0x78E0, 0x3A32, 0x78E1, 0x3A33, 0x78E4, 0x3A31,\n    0x78E6, 0x4731, 0x78E7, 0x16F4, 0x78E8, 0x0E8F, 0x78EC, 0x16F3,\n    0x78EF, 0x04AF, 0x78F2, 0x3A34, 0x78F4, 0x16F7, 0x78F7, 0x3A35,\n    0x78F9, 0x4732, 0x78FA, 0x4733, 0x78FB, 0x3A36, 0x78FD, 0x16F6,\n    0x78FE, 0x4734, 0x7900, 0x4273, 0x7901, 0x09B4, 0x7907, 0x16F8,\n    0x790C, 0x4C9B, 0x790E, 0x0AC5, 0x7910, 0x4736, 0x7911, 0x16FA,\n    0x7912, 0x16F9, 0x7919, 0x16FB, 0x791B, 0x4737, 0x791C, 0x4274,\n    0x791F, 0x4C9C, 0x7925, 0x4738, 0x7926, 0x16DD, 0x7927, 0x4C9D,\n    0x7928, 0x4C9E, 0x792A, 0x16DF, 0x792B, 0x16FD, 0x792C, 0x16FC,\n    0x792E, 0x4275, 0x7930, 0x2182, 0x7931, 0x3A37, 0x7934, 0x4276,\n    0x793A, 0x08D4, 0x793B, 0x3A39, 0x793C, 0x0FB1, 0x793D, 0x3A3A,\n    0x793E, 0x08FE, 0x793F, 0x4C9F, 0x7940, 0x16FE, 0x7941, 0x070D,\n    0x7942, 0x4CA0, 0x7945, 0x3A3B, 0x7946, 0x4277, 0x7947, 0x065A,\n    0x7948, 0x0641, 0x7949, 0x08B1, 0x794A, 0x4739, 0x7950, 0x0F1E,\n    0x7953, 0x1704, 0x7954, 0x4CA1, 0x7955, 0x1703, 0x7956, 0x0AC6,\n    0x7957, 0x1700, 0x7958, 0x473A, 0x795A, 0x1702, 0x795B, 0x3A3C,\n    0x795C, 0x3A3D, 0x795D, 0x0955, 0x795E, 0x0A06, 0x795F, 0x1701,\n    0x7960, 0x16FF, 0x7962, 0x0CE0, 0x7965, 0x09B5, 0x7967, 0x473C,\n    0x7968, 0x0DAE, 0x796B, 0x4CA2, 0x796D, 0x0847, 0x7972, 0x473D,\n    0x7977, 0x0C72, 0x7979, 0x4278, 0x797A, 0x1705, 0x797C, 0x4CA3,\n    0x797F, 0x1706, 0x7980, 0x171C, 0x7981, 0x06D0, 0x7984, 0x0FE3,\n    0x7985, 0x0AB7, 0x798A, 0x1707, 0x798B, 0x3A3E, 0x798D, 0x0552,\n    0x798E, 0x0C13, 0x798F, 0x0DF1, 0x7994, 0x2186, 0x7995, 0x473E,\n    0x7996, 0x3A3F, 0x7998, 0x3A40, 0x799B, 0x2188, 0x799D, 0x1708,\n    0x79A1, 0x473F, 0x79A6, 0x0694, 0x79A7, 0x1709, 0x79A9, 0x4740,\n    0x79AA, 0x170B, 0x79AB, 0x4CA4, 0x79AE, 0x170C, 0x79B0, 0x0CDF,\n    0x79B1, 0x1E4E, 0x79B3, 0x170D, 0x79B4, 0x4741, 0x79B8, 0x3A41,\n    0x79B9, 0x170E, 0x79BA, 0x170F, 0x79BB, 0x3A42, 0x79BD, 0x06D1,\n    0x79BE, 0x0553, 0x79BF, 0x0C9D, 0x79C0, 0x0932, 0x79C1, 0x08B2,\n    0x79C2, 0x4742, 0x79C4, 0x4CA5, 0x79C7, 0x4743, 0x79C8, 0x4279,\n    0x79C9, 0x1710, 0x79CA, 0x3A43, 0x79CB, 0x0933, 0x79CC, 0x4744,\n    0x79CD, 0x4745, 0x79D1, 0x054A, 0x79D2, 0x0DB5, 0x79D4, 0x427B,\n    0x79D5, 0x1711, 0x79D6, 0x4746, 0x79D8, 0x0D7F, 0x79DA, 0x3A44,\n    0x79DE, 0x427C, 0x79DF, 0x0AC7, 0x79E1, 0x1714, 0x79E3, 0x1715,\n    0x79E4, 0x0D1F, 0x79E6, 0x0A07, 0x79E7, 0x1712, 0x79E9, 0x0B9F,\n    0x79EA, 0x4CA6, 0x79EB, 0x427D, 0x79EC, 0x1713, 0x79ED, 0x427E,\n    0x79F0, 0x09B6, 0x79FB, 0x04A0, 0x7A00, 0x0643, 0x7A02, 0x4CA7,\n    0x7A03, 0x3A45, 0x7A05, 0x3633, 0x7A08, 0x1716, 0x7A09, 0x3A46,\n    0x7A0A, 0x474B, 0x7A0B, 0x0C14, 0x7A0C, 0x4CA8, 0x7A0D, 0x1717,\n    0x7A0E, 0x0A6B, 0x7A11, 0x3A47, 0x7A14, 0x0EB9, 0x7A15, 0x474C,\n    0x7A17, 0x0D95, 0x7A18, 0x1718, 0x7A19, 0x1719, 0x7A1A, 0x0B93,\n    0x7A1B, 0x474D, 0x7A1C, 0x0F8F, 0x7A1E, 0x3A48, 0x7A1F, 0x171B,\n    0x7A20, 0x171A, 0x7A2D, 0x3A49, 0x7A2E, 0x091B, 0x7A30, 0x4CA9,\n    0x7A31, 0x171D, 0x7A32, 0x04B4, 0x7A37, 0x1720, 0x7A38, 0x474F,\n    0x7A39, 0x3A4A, 0x7A3A, 0x4CAA, 0x7A3B, 0x171E, 0x7A3C, 0x0554,\n    0x7A3D, 0x0724, 0x7A3E, 0x171F, 0x7A3F, 0x07D8, 0x7A40, 0x0804,\n    0x7A42, 0x0E36, 0x7A43, 0x1721, 0x7A44, 0x4CAB, 0x7A45, 0x3A4B,\n    0x7A46, 0x0E82, 0x7A47, 0x4750, 0x7A49, 0x1723, 0x7A4C, 0x3A4C,\n    0x7A4D, 0x0A75, 0x7A4E, 0x04F1, 0x7A4F, 0x053A, 0x7A50, 0x0470,\n    0x7A56, 0x4751, 0x7A57, 0x1722, 0x7A59, 0x4752, 0x7A5C, 0x4753,\n    0x7A5D, 0x3A4D, 0x7A5F, 0x4754, 0x7A60, 0x4F56, 0x7A61, 0x1724,\n    0x7A62, 0x1725, 0x7A63, 0x09DF, 0x7A67, 0x4755, 0x7A69, 0x1726,\n    0x7A6A, 0x4756, 0x7A6B, 0x05AD, 0x7A6D, 0x3A4F, 0x7A70, 0x1728,\n    0x7A74, 0x0740, 0x7A75, 0x4757, 0x7A76, 0x0680, 0x7A78, 0x3A50,\n    0x7A79, 0x1729, 0x7A7A, 0x06ED, 0x7A7D, 0x172A, 0x7A7F, 0x0AA0,\n    0x7A80, 0x4CAC, 0x7A81, 0x0CA5, 0x7A82, 0x4758, 0x7A83, 0x0A84,\n    0x7A84, 0x0865, 0x7A85, 0x427F, 0x7A86, 0x4CAD, 0x7A88, 0x172B,\n    0x7A8A, 0x4759, 0x7A90, 0x475A, 0x7A92, 0x0BA0, 0x7A93, 0x0AED,\n    0x7A94, 0x4CAE, 0x7A95, 0x172D, 0x7A96, 0x172F, 0x7A97, 0x172C,\n    0x7A98, 0x172E, 0x7A9F, 0x06F8, 0x7AA0, 0x3A51, 0x7AA3, 0x3A52,\n    0x7AA9, 0x1730, 0x7AAA, 0x06FC, 0x7AAC, 0x475B, 0x7AAE, 0x0681,\n    0x7AAF, 0x0F3C, 0x7AB0, 0x1732, 0x7AB3, 0x3A53, 0x7AB5, 0x4CAF,\n    0x7AB6, 0x1733, 0x7AB9, 0x475E, 0x7ABA, 0x04D0, 0x7ABB, 0x3A54,\n    0x7ABC, 0x3A55, 0x7ABD, 0x4CB0, 0x7ABE, 0x475F, 0x7ABF, 0x1736,\n    0x7AC3, 0x05D4, 0x7AC4, 0x1735, 0x7AC5, 0x1734, 0x7AC6, 0x3A56,\n    0x7AC7, 0x1738, 0x7AC8, 0x1731, 0x7ACA, 0x1739, 0x7ACB, 0x0F71,\n    0x7ACC, 0x4761, 0x7ACD, 0x173A, 0x7ACE, 0x4281, 0x7ACF, 0x173B,\n    0x7AD1, 0x2189, 0x7AD2, 0x11C5, 0x7AD3, 0x173D, 0x7AD5, 0x173C,\n    0x7AD9, 0x173E, 0x7ADA, 0x173F, 0x7ADC, 0x0F7D, 0x7ADD, 0x1740,\n    0x7ADF, 0x1C08, 0x7AE0, 0x09B7, 0x7AE1, 0x1741, 0x7AE2, 0x1742,\n    0x7AE3, 0x0961, 0x7AE5, 0x0C90, 0x7AE6, 0x1743, 0x7AE7, 0x218A,\n    0x7AE8, 0x4762, 0x7AEA, 0x0B66, 0x7AEB, 0x218C, 0x7AED, 0x1744,\n    0x7AEF, 0x0B7A, 0x7AF0, 0x1745, 0x7AF4, 0x4763, 0x7AF6, 0x069D,\n    0x7AF8, 0x1076, 0x7AF9, 0x0B9B, 0x7AFA, 0x08DF, 0x7AFD, 0x4282,\n    0x7AFE, 0x4CB1, 0x7AFF, 0x0604, 0x7B02, 0x1746, 0x7B04, 0x1753,\n    0x7B06, 0x1749, 0x7B07, 0x3A57, 0x7B08, 0x0682, 0x7B0A, 0x1748,\n    0x7B0B, 0x1755, 0x7B0F, 0x1747, 0x7B11, 0x09B8, 0x7B12, 0x4283,\n    0x7B14, 0x3A58, 0x7B18, 0x174B, 0x7B19, 0x174C, 0x7B1B, 0x0C25,\n    0x7B1E, 0x174D, 0x7B20, 0x05BC, 0x7B25, 0x0A20, 0x7B26, 0x0DD6,\n    0x7B27, 0x3A59, 0x7B28, 0x174F, 0x7B2A, 0x4768, 0x7B2B, 0x4CB2,\n    0x7B2C, 0x0B48, 0x7B2D, 0x4284, 0x7B2E, 0x4769, 0x7B2F, 0x476A,\n    0x7B31, 0x3A5A, 0x7B33, 0x174A, 0x7B35, 0x174E, 0x7B36, 0x1750,\n    0x7B39, 0x086B, 0x7B3B, 0x4285, 0x7B3D, 0x4767, 0x7B41, 0x476E,\n    0x7B45, 0x1757, 0x7B46, 0x0DA0, 0x7B47, 0x3A5B, 0x7B48, 0x0D3A,\n    0x7B49, 0x0C73, 0x7B4B, 0x06D2, 0x7B4C, 0x1756, 0x7B4D, 0x1754,\n    0x7B4E, 0x3A5C, 0x7B4F, 0x0D49, 0x7B50, 0x1751, 0x7B51, 0x0B9C,\n    0x7B52, 0x0C75, 0x7B53, 0x375D, 0x7B54, 0x0C74, 0x7B55, 0x4770,\n    0x7B56, 0x0866, 0x7B5D, 0x1769, 0x7B60, 0x3A5D, 0x7B64, 0x4772,\n    0x7B65, 0x1759, 0x7B66, 0x4773, 0x7B67, 0x175B, 0x7B69, 0x3A5E,\n    0x7B6C, 0x175E, 0x7B6D, 0x3A5F, 0x7B6E, 0x175F, 0x7B6F, 0x4286,\n    0x7B70, 0x175C, 0x7B71, 0x175D, 0x7B72, 0x3A60, 0x7B73, 0x4774,\n    0x7B74, 0x175A, 0x7B75, 0x1758, 0x7B77, 0x4CB3, 0x7B79, 0x4771,\n    0x7B7A, 0x1752, 0x7B7F, 0x476D, 0x7B86, 0x0E1F, 0x7B87, 0x0555,\n    0x7B8B, 0x1766, 0x7B8D, 0x1763, 0x7B8F, 0x1768, 0x7B90, 0x4777,\n    0x7B91, 0x3A61, 0x7B92, 0x1767, 0x7B94, 0x0D29, 0x7B95, 0x0EB3,\n    0x7B97, 0x0889, 0x7B98, 0x1761, 0x7B99, 0x176A, 0x7B9A, 0x1765,\n    0x7B9B, 0x4778, 0x7B9C, 0x1764, 0x7B9D, 0x1760, 0x7B9E, 0x218D,\n    0x7B9F, 0x1762, 0x7BA0, 0x4CB4, 0x7BA1, 0x0605, 0x7BAA, 0x0B7B,\n    0x7BAC, 0x4CB5, 0x7BAD, 0x0AA1, 0x7BAF, 0x3A62, 0x7BB0, 0x4CB6,\n    0x7BB1, 0x0D36, 0x7BB4, 0x176F, 0x7BB5, 0x477A, 0x7BB8, 0x0D38,\n    0x7BBC, 0x477B, 0x7BC0, 0x0A85, 0x7BC1, 0x176C, 0x7BC4, 0x0D63,\n    0x7BC5, 0x477C, 0x7BC6, 0x1770, 0x7BC7, 0x0E23, 0x7BC9, 0x0B99,\n    0x7BCA, 0x477D, 0x7BCB, 0x176B, 0x7BCC, 0x176D, 0x7BCF, 0x176E,\n    0x7BD4, 0x4780, 0x7BD6, 0x4781, 0x7BD7, 0x3A63, 0x7BD9, 0x3A64,\n    0x7BDA, 0x4782, 0x7BDD, 0x1771, 0x7BE0, 0x08F0, 0x7BE4, 0x0C9E,\n    0x7BE5, 0x1776, 0x7BE6, 0x1775, 0x7BE8, 0x4CB7, 0x7BE9, 0x1772,\n    0x7BEA, 0x4783, 0x7BED, 0x0FDC, 0x7BF0, 0x4784, 0x7BF2, 0x4CB8,\n    0x7BF3, 0x177B, 0x7BF6, 0x177F, 0x7BF7, 0x177C, 0x7BF8, 0x4CB9,\n    0x7BFC, 0x4CBA, 0x7BFE, 0x4CBB, 0x7C00, 0x1778, 0x7C01, 0x4287,\n    0x7C03, 0x4785, 0x7C07, 0x1779, 0x7C09, 0x4CBC, 0x7C0B, 0x3A65,\n    0x7C0D, 0x177E, 0x7C0E, 0x4786, 0x7C0F, 0x3A66, 0x7C11, 0x1773,\n    0x7C12, 0x10EA, 0x7C13, 0x177A, 0x7C14, 0x1774, 0x7C17, 0x177D,\n    0x7C1E, 0x1E3B, 0x7C1F, 0x1783, 0x7C20, 0x3A67, 0x7C21, 0x0606,\n    0x7C23, 0x1780, 0x7C26, 0x3A68, 0x7C27, 0x1781, 0x7C28, 0x4CBD,\n    0x7C2A, 0x1782, 0x7C2B, 0x1785, 0x7C2F, 0x4CBE, 0x7C31, 0x3A69,\n    0x7C33, 0x4288, 0x7C36, 0x3A6A, 0x7C37, 0x1784, 0x7C38, 0x0D8A,\n    0x7C3D, 0x1786, 0x7C3E, 0x0FC4, 0x7C3F, 0x0E3D, 0x7C40, 0x178B,\n    0x7C42, 0x4CBF, 0x7C43, 0x1788, 0x7C45, 0x4787, 0x7C4A, 0x4788,\n    0x7C4C, 0x1787, 0x7C4D, 0x0A76, 0x7C4F, 0x178A, 0x7C50, 0x178C,\n    0x7C51, 0x3A6B, 0x7C52, 0x4CC0, 0x7C53, 0x4CC1, 0x7C54, 0x1789,\n    0x7C56, 0x1790, 0x7C57, 0x4789, 0x7C58, 0x178D, 0x7C59, 0x3A6C,\n    0x7C5B, 0x4CC2, 0x7C5C, 0x4CC3, 0x7C5D, 0x4CC4, 0x7C5E, 0x478A,\n    0x7C5F, 0x178E, 0x7C60, 0x1777, 0x7C61, 0x478B, 0x7C64, 0x178F,\n    0x7C65, 0x1791, 0x7C67, 0x3A6D, 0x7C69, 0x478C, 0x7C6C, 0x1792,\n    0x7C6D, 0x428A, 0x7C6E, 0x3A6E, 0x7C6F, 0x478D, 0x7C70, 0x3A6F,\n    0x7C72, 0x4CC5, 0x7C73, 0x0E16, 0x7C75, 0x1793, 0x7C79, 0x428B,\n    0x7C7B, 0x370E, 0x7C7D, 0x4CC6, 0x7C7E, 0x0EEE, 0x7C81, 0x06C6,\n    0x7C82, 0x06FF, 0x7C83, 0x1794, 0x7C87, 0x4CC7, 0x7C89, 0x0E04,\n    0x7C8B, 0x0A2E, 0x7C8D, 0x0EBC, 0x7C8F, 0x428C, 0x7C90, 0x1795,\n    0x7C92, 0x0F7B, 0x7C94, 0x428D, 0x7C95, 0x0D2A, 0x7C97, 0x0AC8,\n    0x7C98, 0x0CEA, 0x7C9B, 0x0957, 0x7C9E, 0x4CC8, 0x7C9F, 0x0484,\n    0x7CA0, 0x428E, 0x7CA1, 0x179A, 0x7CA2, 0x1798, 0x7CA4, 0x1796,\n    0x7CA5, 0x05DD, 0x7CA6, 0x4791, 0x7CA7, 0x09B9, 0x7CA8, 0x179B,\n    0x7CAB, 0x1799, 0x7CAD, 0x1797, 0x7CAE, 0x179F, 0x7CB1, 0x179E,\n    0x7CB2, 0x179D, 0x7CB3, 0x179C, 0x7CB6, 0x4793, 0x7CB7, 0x4794,\n    0x7CB9, 0x17A0, 0x7CBA, 0x4CC9, 0x7CBC, 0x3A70, 0x7CBD, 0x17A1,\n    0x7CBE, 0x0A5E, 0x7CBF, 0x3A71, 0x7CC0, 0x17A2, 0x7CC2, 0x17A4,\n    0x7CC4, 0x4796, 0x7CC5, 0x17A3, 0x7CC7, 0x4CCA, 0x7CC8, 0x3A72,\n    0x7CC9, 0x3A73, 0x7CCA, 0x0786, 0x7CCD, 0x4798, 0x7CCE, 0x0ABA,\n    0x7CD2, 0x17A6, 0x7CD3, 0x4CCB, 0x7CD5, 0x428F, 0x7CD6, 0x0C76,\n    0x7CD7, 0x3A74, 0x7CD8, 0x17A5, 0x7CD9, 0x3A75, 0x7CDA, 0x4CCC,\n    0x7CDC, 0x17A7, 0x7CDD, 0x3A76, 0x7CDE, 0x0E05, 0x7CDF, 0x0AEE,\n    0x7CE0, 0x07D9, 0x7CE2, 0x17A8, 0x7CE6, 0x479B, 0x7CE7, 0x0F90,\n    0x7CEB, 0x3A77, 0x7CEF, 0x17AA, 0x7CF2, 0x17AB, 0x7CF4, 0x17AC,\n    0x7CF5, 0x479D, 0x7CF6, 0x17AD, 0x7CF8, 0x08B3, 0x7CFA, 0x17AE,\n    0x7CFB, 0x0725, 0x7CFE, 0x0684, 0x7D00, 0x0644, 0x7D02, 0x17B0,\n    0x7D03, 0x479E, 0x7D04, 0x0EFF, 0x7D05, 0x07DA, 0x7D06, 0x17AF,\n    0x7D07, 0x3A78, 0x7D08, 0x3A79, 0x7D09, 0x3A7A, 0x7D0A, 0x17B3,\n    0x7D0B, 0x0EF2, 0x7D0D, 0x0CF2, 0x7D10, 0x0DA5, 0x7D12, 0x47A0,\n    0x7D13, 0x3A7B, 0x7D14, 0x096D, 0x7D15, 0x17B2, 0x7D17, 0x08FF,\n    0x7D18, 0x07DB, 0x7D19, 0x08B4, 0x7D1A, 0x0683, 0x7D1B, 0x0E06,\n    0x7D1C, 0x17B1, 0x7D1D, 0x3A7C, 0x7D1E, 0x47A1, 0x7D20, 0x0AC9,\n    0x7D21, 0x0E70, 0x7D22, 0x0867, 0x7D23, 0x3A7D, 0x7D2B, 0x08B5,\n    0x7D2C, 0x0BF9, 0x7D2E, 0x17B6, 0x7D2F, 0x0FA7, 0x7D30, 0x0849,\n    0x7D31, 0x4290, 0x7D32, 0x17B7, 0x7D33, 0x0A08, 0x7D35, 0x17B9,\n    0x7D39, 0x09BA, 0x7D3A, 0x0820, 0x7D3C, 0x4CCD, 0x7D3D, 0x47A4,\n    0x7D3E, 0x47A5, 0x7D3F, 0x17B8, 0x7D40, 0x47A6, 0x7D41, 0x3A7E,\n    0x7D42, 0x0934, 0x7D43, 0x0772, 0x7D44, 0x0ACA, 0x7D45, 0x17B4,\n    0x7D46, 0x17BA, 0x7D47, 0x47A7, 0x7D48, 0x218F, 0x7D4B, 0x17B5,\n    0x7D4C, 0x0726, 0x7D4D, 0x4CCE, 0x7D4E, 0x17BD, 0x7D4F, 0x17C1,\n    0x7D50, 0x0741, 0x7D53, 0x3A7F, 0x7D55, 0x363A, 0x7D56, 0x17BC,\n    0x7D59, 0x3A80, 0x7D5A, 0x47AB, 0x7D5B, 0x17C5, 0x7D5C, 0x4291,\n    0x7D5D, 0x3A81, 0x7D5E, 0x07DC, 0x7D61, 0x0F57, 0x7D62, 0x0480,\n    0x7D63, 0x17C2, 0x7D66, 0x0685, 0x7D68, 0x17BF, 0x7D6A, 0x47AC,\n    0x7D6E, 0x17C0, 0x7D70, 0x47AD, 0x7D71, 0x0C77, 0x7D72, 0x17BE,\n    0x7D73, 0x17BB, 0x7D75, 0x0586, 0x7D76, 0x0A88, 0x7D79, 0x075C,\n    0x7D7A, 0x3A82, 0x7D7D, 0x17C7, 0x7D7F, 0x47AF, 0x7D82, 0x4CCF,\n    0x7D83, 0x4292, 0x7D85, 0x4CD0, 0x7D86, 0x3A83, 0x7D88, 0x47B1,\n    0x7D89, 0x17C4, 0x7D8B, 0x3A84, 0x7D8C, 0x3A85, 0x7D8D, 0x4CD1,\n    0x7D8F, 0x17C6, 0x7D91, 0x4CD2, 0x7D93, 0x17C3, 0x7D97, 0x47B2,\n    0x7D99, 0x0727, 0x7D9A, 0x0B13, 0x7D9B, 0x17C8, 0x7D9C, 0x0AF0,\n    0x7D9D, 0x47B4, 0x7D9E, 0x4CD3, 0x7D9F, 0x17D5, 0x7DA0, 0x2192,\n    0x7DA2, 0x17D1, 0x7DA3, 0x17CB, 0x7DA6, 0x4293, 0x7DA7, 0x47B5,\n    0x7DAA, 0x47B6, 0x7DAB, 0x17CF, 0x7DAC, 0x0926, 0x7DAD, 0x04A1,\n    0x7DAE, 0x17CA, 0x7DAF, 0x17D2, 0x7DB0, 0x17D6, 0x7DB1, 0x07DD,\n    0x7DB2, 0x0EE2, 0x7DB3, 0x4CD4, 0x7DB4, 0x0BF2, 0x7DB5, 0x17CC,\n    0x7DB6, 0x47B7, 0x7DB7, 0x2191, 0x7DB8, 0x17D4, 0x7DB9, 0x4CD5,\n    0x7DBA, 0x17C9, 0x7DBB, 0x0B7C, 0x7DBD, 0x17CE, 0x7DBE, 0x0481,\n    0x7DBF, 0x0ED6, 0x7DC0, 0x47B8, 0x7DC2, 0x4294, 0x7DC7, 0x17CD,\n    0x7DCA, 0x06D3, 0x7DCB, 0x0D80, 0x7DCC, 0x3A86, 0x7DCF, 0x0AEF,\n    0x7DD0, 0x4CD6, 0x7DD1, 0x0F98, 0x7DD2, 0x0979, 0x7DD5, 0x17FD,\n    0x7DD6, 0x2193, 0x7DD7, 0x47B9, 0x7DD8, 0x17D7, 0x7DD9, 0x47BA,\n    0x7DDA, 0x0AA2, 0x7DDC, 0x17D3, 0x7DDD, 0x17D8, 0x7DDE, 0x17DA,\n    0x7DE0, 0x0C15, 0x7DE1, 0x17DD, 0x7DE3, 0x340A, 0x7DE4, 0x17D9,\n    0x7DE5, 0x4CD7, 0x7DE6, 0x47BB, 0x7DE8, 0x0E24, 0x7DE9, 0x0607,\n    0x7DEB, 0x3A87, 0x7DEC, 0x0ED7, 0x7DEF, 0x04A2, 0x7DF1, 0x3A88,\n    0x7DF2, 0x17DC, 0x7DF4, 0x0FC5, 0x7DF5, 0x4CD8, 0x7DF6, 0x4CD9,\n    0x7DF9, 0x3A89, 0x7DFB, 0x17DB, 0x7E01, 0x0511, 0x7E04, 0x0CC4,\n    0x7E05, 0x17DE, 0x7E08, 0x3A8A, 0x7E09, 0x17E5, 0x7E0A, 0x17DF,\n    0x7E0B, 0x17E6, 0x7E10, 0x47BF, 0x7E11, 0x3A8B, 0x7E12, 0x17E2,\n    0x7E15, 0x3A8C, 0x7E17, 0x47C0, 0x7E1B, 0x0D31, 0x7E1D, 0x47C1,\n    0x7E1E, 0x08F6, 0x7E1F, 0x17E4, 0x7E20, 0x3A8D, 0x7E21, 0x17E1,\n    0x7E22, 0x17E7, 0x7E23, 0x17E0, 0x7E26, 0x094E, 0x7E27, 0x47C2,\n    0x7E28, 0x4295, 0x7E2B, 0x0E53, 0x7E2C, 0x47C3, 0x7E2E, 0x0956,\n    0x7E2F, 0x4CDA, 0x7E31, 0x17E3, 0x7E32, 0x17EF, 0x7E35, 0x17EB,\n    0x7E36, 0x4CDB, 0x7E37, 0x17EE, 0x7E39, 0x17EC, 0x7E3A, 0x17F0,\n    0x7E3B, 0x17EA, 0x7E3D, 0x17D0, 0x7E3E, 0x0A77, 0x7E41, 0x0D5F,\n    0x7E43, 0x17ED, 0x7E44, 0x4CDC, 0x7E45, 0x47C4, 0x7E46, 0x17E8,\n    0x7E47, 0x3A8E, 0x7E48, 0x3767, 0x7E4A, 0x0AA3, 0x7E4B, 0x0728,\n    0x7E4D, 0x0935, 0x7E52, 0x2194, 0x7E54, 0x09EB, 0x7E55, 0x0AB8,\n    0x7E56, 0x17F3, 0x7E59, 0x17F5, 0x7E5A, 0x17F6, 0x7E5D, 0x17F2,\n    0x7E5E, 0x17F4, 0x7E61, 0x1E11, 0x7E62, 0x3A8F, 0x7E66, 0x17E9,\n    0x7E67, 0x17F1, 0x7E69, 0x17F9, 0x7E6A, 0x17F8, 0x7E6B, 0x1DF7,\n    0x7E6D, 0x0EA8, 0x7E6E, 0x3A90, 0x7E6F, 0x4CDD, 0x7E70, 0x0701,\n    0x7E73, 0x3A91, 0x7E75, 0x47C5, 0x7E78, 0x4CDE, 0x7E79, 0x17F7,\n    0x7E7B, 0x17FB, 0x7E7C, 0x17FA, 0x7E7D, 0x17FE, 0x7E7E, 0x47C6,\n    0x7E7F, 0x1800, 0x7E81, 0x4CDF, 0x7E82, 0x088A, 0x7E83, 0x17FC,\n    0x7E86, 0x47C7, 0x7E87, 0x47C8, 0x7E88, 0x1801, 0x7E89, 0x1802,\n    0x7E8A, 0x20A7, 0x7E8C, 0x1803, 0x7E8D, 0x3A92, 0x7E8E, 0x1809,\n    0x7E8F, 0x0C35, 0x7E90, 0x1805, 0x7E91, 0x3A93, 0x7E92, 0x1804,\n    0x7E93, 0x1806, 0x7E94, 0x1807, 0x7E96, 0x1808, 0x7E98, 0x3A94,\n    0x7E9A, 0x47CA, 0x7E9B, 0x180A, 0x7E9C, 0x180B, 0x7F36, 0x0608,\n    0x7F38, 0x180C, 0x7F3A, 0x180D, 0x7F3B, 0x47CD, 0x7F3C, 0x47CC,\n    0x7F3D, 0x4CE0, 0x7F3E, 0x47CE, 0x7F43, 0x47CF, 0x7F44, 0x3A95,\n    0x7F45, 0x180E, 0x7F47, 0x2195, 0x7F4C, 0x180F, 0x7F4D, 0x1810,\n    0x7F4E, 0x1811, 0x7F4F, 0x3A96, 0x7F50, 0x1812, 0x7F51, 0x1813,\n    0x7F52, 0x3A97, 0x7F53, 0x3A98, 0x7F54, 0x1815, 0x7F55, 0x1814,\n    0x7F58, 0x1816, 0x7F5B, 0x4CE1, 0x7F5D, 0x4CE2, 0x7F5F, 0x1817,\n    0x7F60, 0x1818, 0x7F61, 0x3A99, 0x7F63, 0x47D3, 0x7F64, 0x47D4,\n    0x7F65, 0x4CE3, 0x7F67, 0x181B, 0x7F68, 0x1819, 0x7F69, 0x181A,\n    0x7F6A, 0x0851, 0x7F6B, 0x0729, 0x7F6D, 0x47D5, 0x7F6E, 0x0B94,\n    0x7F70, 0x0D47, 0x7F71, 0x4CE4, 0x7F72, 0x097A, 0x7F75, 0x0D03,\n    0x7F77, 0x0D81, 0x7F78, 0x181C, 0x7F79, 0x1336, 0x7F7D, 0x47D6,\n    0x7F7E, 0x47D7, 0x7F7F, 0x4CE5, 0x7F80, 0x4CE6, 0x7F82, 0x181D,\n    0x7F83, 0x181F, 0x7F85, 0x0F4F, 0x7F86, 0x181E, 0x7F87, 0x1821,\n    0x7F88, 0x1820, 0x7F8A, 0x0F3D, 0x7F8B, 0x4CE7, 0x7F8C, 0x1822,\n    0x7F8E, 0x0D92, 0x7F90, 0x47D8, 0x7F91, 0x3A9A, 0x7F94, 0x1823,\n    0x7F96, 0x47DB, 0x7F97, 0x4296, 0x7F9A, 0x1826, 0x7F9C, 0x47DC,\n    0x7F9D, 0x1825, 0x7F9E, 0x1824, 0x7FA1, 0x2196, 0x7FA2, 0x4CE8,\n    0x7FA3, 0x1827, 0x7FA4, 0x0708, 0x7FA8, 0x0AA4, 0x7FA9, 0x065B,\n    0x7FAD, 0x47DD, 0x7FAE, 0x182B, 0x7FAF, 0x1828, 0x7FB2, 0x1829,\n    0x7FB6, 0x182C, 0x7FB8, 0x182D, 0x7FB9, 0x182A, 0x7FBD, 0x04CB,\n    0x7FBF, 0x3A9B, 0x7FC1, 0x0527, 0x7FC3, 0x47DF, 0x7FC5, 0x182F,\n    0x7FC6, 0x1830, 0x7FCA, 0x1831, 0x7FCC, 0x0F4C, 0x7FCE, 0x3A9C,\n    0x7FCF, 0x47E0, 0x7FD2, 0x0936, 0x7FD4, 0x1833, 0x7FD5, 0x1832,\n    0x7FDB, 0x4297, 0x7FDF, 0x3A9D, 0x7FE0, 0x0A2F, 0x7FE1, 0x1834,\n    0x7FE3, 0x47E1, 0x7FE5, 0x3A9E, 0x7FE6, 0x1835, 0x7FE9, 0x1836,\n    0x7FEB, 0x0621, 0x7FEC, 0x3A9F, 0x7FEE, 0x3AA0, 0x7FEF, 0x3AA1,\n    0x7FF0, 0x0609, 0x7FF2, 0x47E2, 0x7FF3, 0x1837, 0x7FF9, 0x1838,\n    0x7FFA, 0x3AA2, 0x7FFB, 0x0E8B, 0x7FFC, 0x0F4D, 0x7FFD, 0x4CE9,\n    0x7FFE, 0x4CEA, 0x7FFF, 0x4CEB, 0x8000, 0x0F3E, 0x8001, 0x0FDD,\n    0x8002, 0x3713, 0x8003, 0x07DF, 0x8004, 0x183B, 0x8005, 0x0900,\n    0x8006, 0x183A, 0x8007, 0x4CEC, 0x8008, 0x47E4, 0x800A, 0x47E3,\n    0x800B, 0x183C, 0x800C, 0x08D5, 0x800D, 0x4CED, 0x800E, 0x3AA3,\n    0x8010, 0x0B31, 0x8011, 0x3AA4, 0x8012, 0x183D, 0x8014, 0x3AA5,\n    0x8015, 0x07DE, 0x8016, 0x47E5, 0x8017, 0x0EE3, 0x8018, 0x183E,\n    0x8019, 0x183F, 0x801C, 0x1840, 0x801E, 0x4CEE, 0x8021, 0x1841,\n    0x8024, 0x3AA6, 0x8026, 0x3AA7, 0x8028, 0x1842, 0x802C, 0x47E6,\n    0x8030, 0x47E7, 0x8033, 0x08D6, 0x8035, 0x4298, 0x8036, 0x0EF9,\n    0x8037, 0x4299, 0x8039, 0x4CEF, 0x803A, 0x3AA8, 0x803B, 0x1844,\n    0x803C, 0x3AA9, 0x803D, 0x0B7D, 0x803F, 0x1843, 0x8043, 0x47E8,\n    0x8046, 0x1846, 0x804A, 0x1845, 0x8052, 0x1847, 0x8056, 0x0A5F,\n    0x8058, 0x1848, 0x805A, 0x1849, 0x805E, 0x0E09, 0x805F, 0x184A,\n    0x8060, 0x3AAA, 0x8061, 0x0AF1, 0x8062, 0x184B, 0x8066, 0x47E9,\n    0x8068, 0x184C, 0x806F, 0x0FC6, 0x8070, 0x184F, 0x8071, 0x3AAB,\n    0x8072, 0x184E, 0x8073, 0x184D, 0x8074, 0x0BCC, 0x8075, 0x3AAC,\n    0x8076, 0x1850, 0x8077, 0x09EC, 0x8079, 0x1851, 0x807B, 0x47EA,\n    0x807D, 0x1852, 0x807E, 0x0FDE, 0x807F, 0x1853, 0x8084, 0x1854,\n    0x8085, 0x1856, 0x8086, 0x1855, 0x8087, 0x0D39, 0x8088, 0x4CF0,\n    0x8089, 0x0CD1, 0x808B, 0x0FE4, 0x808C, 0x0D3D, 0x808E, 0x4CF1,\n    0x8093, 0x1858, 0x8096, 0x09BB, 0x8098, 0x0D9C, 0x8099, 0x47EB,\n    0x809A, 0x1859, 0x809B, 0x1857, 0x809C, 0x47EC, 0x809D, 0x060A,\n    0x809E, 0x3AAD, 0x80A1, 0x0788, 0x80A2, 0x08B6, 0x80A4, 0x47ED,\n    0x80A5, 0x0D82, 0x80A6, 0x3AAE, 0x80A7, 0x47EE, 0x80A9, 0x075E,\n    0x80AA, 0x0E71, 0x80AB, 0x3AAF, 0x80AC, 0x185C, 0x80AD, 0x185A,\n    0x80AF, 0x07E0, 0x80B1, 0x07E1, 0x80B2, 0x04AD, 0x80B4, 0x0858,\n    0x80B8, 0x47EF, 0x80BA, 0x0D0F, 0x80C3, 0x04A3, 0x80C4, 0x1861,\n    0x80C5, 0x47F1, 0x80C6, 0x0B7E, 0x80CA, 0x429A, 0x80CC, 0x0D0E,\n    0x80CE, 0x0B3B, 0x80CF, 0x4CF2, 0x80D4, 0x4CF3, 0x80D5, 0x47F2,\n    0x80D6, 0x1863, 0x80D7, 0x3AB0, 0x80D8, 0x3AB1, 0x80D9, 0x185F,\n    0x80DA, 0x1862, 0x80DB, 0x185D, 0x80DD, 0x1860, 0x80DE, 0x0E54,\n    0x80E0, 0x429B, 0x80E1, 0x0789, 0x80E4, 0x04C1, 0x80E5, 0x185E,\n    0x80E6, 0x47F3, 0x80ED, 0x4CF4, 0x80EF, 0x1865, 0x80F0, 0x4CF5,\n    0x80F1, 0x1866, 0x80F3, 0x429C, 0x80F4, 0x0C91, 0x80F5, 0x47F5,\n    0x80F7, 0x4CF6, 0x80F8, 0x06B3, 0x80FA, 0x4CF7, 0x80FB, 0x47F6,\n    0x80FC, 0x1871, 0x80FD, 0x0CF3, 0x80FE, 0x4CF8, 0x8102, 0x08B7,\n    0x8103, 0x4CF9, 0x8105, 0x06B4, 0x8106, 0x0A6C, 0x8107, 0x0FEC,\n    0x8108, 0x0EBA, 0x8109, 0x1864, 0x810A, 0x0A78, 0x810D, 0x47F4,\n    0x8116, 0x3AB2, 0x8117, 0x4CFA, 0x8118, 0x3AB3, 0x811A, 0x066D,\n    0x811B, 0x1867, 0x811E, 0x47F9, 0x8123, 0x1869, 0x8124, 0x47FB,\n    0x8127, 0x47FC, 0x8129, 0x1868, 0x812B, 0x3659, 0x812C, 0x47FD,\n    0x812F, 0x186A, 0x8130, 0x4CFB, 0x8131, 0x0B64, 0x8133, 0x0CF4,\n    0x8135, 0x47F8, 0x8139, 0x0BCD, 0x813A, 0x3AB4, 0x813D, 0x47FF,\n    0x813E, 0x186E, 0x8141, 0x3772, 0x8146, 0x186D, 0x814A, 0x3AB5,\n    0x814B, 0x186B, 0x814C, 0x3AB6, 0x814E, 0x0A1B, 0x8150, 0x0DD7,\n    0x8151, 0x1870, 0x8153, 0x186F, 0x8154, 0x07E2, 0x8155, 0x0FF9,\n    0x8157, 0x4CFC, 0x815F, 0x1880, 0x8160, 0x429D, 0x8165, 0x1874,\n    0x8166, 0x1875, 0x8167, 0x429E, 0x8168, 0x429F, 0x8169, 0x4801,\n    0x816B, 0x091C, 0x816D, 0x42A0, 0x816E, 0x1873, 0x816F, 0x4CFD,\n    0x8170, 0x080A, 0x8171, 0x1872, 0x8173, 0x4CFE, 0x8174, 0x1876,\n    0x8178, 0x0BCE, 0x8179, 0x0DF2, 0x817A, 0x0AA5, 0x817F, 0x0B3C,\n    0x8180, 0x187A, 0x8181, 0x3AB7, 0x8182, 0x187B, 0x8183, 0x1877,\n    0x8184, 0x3AB8, 0x8185, 0x4804, 0x8188, 0x1878, 0x818A, 0x1879,\n    0x818B, 0x4CFF, 0x818F, 0x07E3, 0x8190, 0x4D00, 0x8193, 0x1881,\n    0x8195, 0x187D, 0x8198, 0x4806, 0x819A, 0x0DD8, 0x819B, 0x4D01,\n    0x819C, 0x0E9A, 0x819D, 0x0D9A, 0x819E, 0x4D02, 0x81A0, 0x187C,\n    0x81A3, 0x187F, 0x81A4, 0x187E, 0x81A8, 0x0E72, 0x81A9, 0x1882,\n    0x81B0, 0x1883, 0x81B2, 0x4807, 0x81B3, 0x0AB9, 0x81B4, 0x3AB9,\n    0x81B5, 0x1884, 0x81B8, 0x1886, 0x81BA, 0x188A, 0x81BB, 0x42A1,\n    0x81BD, 0x1887, 0x81BE, 0x1885, 0x81BF, 0x0CF5, 0x81C0, 0x1888,\n    0x81C1, 0x4808, 0x81C2, 0x1889, 0x81C3, 0x4809, 0x81C6, 0x0532,\n    0x81C8, 0x1890, 0x81C9, 0x188B, 0x81CA, 0x42A2, 0x81CB, 0x4D03,\n    0x81CD, 0x188C, 0x81CF, 0x3ABA, 0x81D1, 0x188D, 0x81D3, 0x0B01,\n    0x81D5, 0x4D04, 0x81D6, 0x480A, 0x81D7, 0x42A3, 0x81D8, 0x188F,\n    0x81D9, 0x188E, 0x81DA, 0x1891, 0x81DB, 0x480B, 0x81DD, 0x4D05,\n    0x81DE, 0x4D06, 0x81DF, 0x1892, 0x81E0, 0x1893, 0x81E1, 0x4D07,\n    0x81E3, 0x0A09, 0x81E4, 0x480D, 0x81E5, 0x0569, 0x81E7, 0x1894,\n    0x81E8, 0x0F9F, 0x81EA, 0x08D7, 0x81EC, 0x480F, 0x81ED, 0x0937,\n    0x81EF, 0x4D08, 0x81F3, 0x08B8, 0x81F4, 0x0B95, 0x81F6, 0x4D09,\n    0x81F9, 0x3ABB, 0x81FA, 0x1895, 0x81FB, 0x1896, 0x81FC, 0x04D3,\n    0x81FD, 0x4810, 0x81FE, 0x1897, 0x81FF, 0x4811, 0x8200, 0x4D0A,\n    0x8201, 0x1898, 0x8202, 0x1899, 0x8203, 0x3ABC, 0x8204, 0x4813,\n    0x8205, 0x189A, 0x8207, 0x189B, 0x8208, 0x06B5, 0x8209, 0x13AF,\n    0x820A, 0x189C, 0x820B, 0x4D0B, 0x820C, 0x0A89, 0x820D, 0x189D,\n    0x820E, 0x08F7, 0x8210, 0x189E, 0x8212, 0x1009, 0x8213, 0x4D0C,\n    0x8214, 0x4D0D, 0x8216, 0x189F, 0x8217, 0x0E2E, 0x8218, 0x0618,\n    0x8219, 0x4815, 0x821A, 0x4D0E, 0x821B, 0x0AA6, 0x821C, 0x0962,\n    0x821E, 0x0DE3, 0x821F, 0x0938, 0x8221, 0x3ABD, 0x8222, 0x4816,\n    0x8229, 0x18A0, 0x822A, 0x07E4, 0x822B, 0x18A1, 0x822C, 0x0D60,\n    0x822E, 0x18AF, 0x8232, 0x3ABE, 0x8233, 0x18A3, 0x8234, 0x3ABF,\n    0x8235, 0x0B29, 0x8236, 0x0D2B, 0x8237, 0x0773, 0x8238, 0x18A2,\n    0x8239, 0x0AA7, 0x823A, 0x4D0F, 0x823C, 0x4818, 0x8240, 0x18A4,\n    0x8244, 0x4D10, 0x8245, 0x481A, 0x8246, 0x3AC0, 0x8247, 0x0C16,\n    0x8249, 0x4819, 0x824B, 0x3AC1, 0x824F, 0x3AC2, 0x8257, 0x481E,\n    0x8258, 0x18A6, 0x8259, 0x18A5, 0x825A, 0x18A8, 0x825C, 0x4820,\n    0x825D, 0x18A7, 0x825F, 0x18A9, 0x8260, 0x42A5, 0x8262, 0x18AB,\n    0x8263, 0x4821, 0x8264, 0x18AA, 0x8266, 0x060B, 0x8268, 0x18AC,\n    0x826A, 0x18AD, 0x826B, 0x18AE, 0x826D, 0x4D11, 0x826E, 0x0821,\n    0x826F, 0x0F91, 0x8271, 0x18B0, 0x8272, 0x09ED, 0x8274, 0x42A6,\n    0x8276, 0x0512, 0x8277, 0x18B1, 0x8278, 0x18B2, 0x8279, 0x3775,\n    0x827D, 0x4824, 0x827E, 0x18B3, 0x827F, 0x4825, 0x8283, 0x4826,\n    0x8284, 0x4D12, 0x8289, 0x4D13, 0x828A, 0x4827, 0x828B, 0x04B6,\n    0x828D, 0x18B4, 0x828E, 0x3AC3, 0x8291, 0x4D14, 0x8292, 0x18B5,\n    0x8293, 0x4828, 0x8299, 0x0DD9, 0x829D, 0x08F3, 0x829F, 0x18B7,\n    0x82A1, 0x42A8, 0x82A3, 0x42A9, 0x82A4, 0x42AA, 0x82A5, 0x0587,\n    0x82A6, 0x0476, 0x82A7, 0x4829, 0x82A8, 0x482A, 0x82A9, 0x42AB,\n    0x82AA, 0x4D15, 0x82AB, 0x18B6, 0x82AC, 0x18B9, 0x82AD, 0x0D04,\n    0x82AE, 0x3AC4, 0x82AF, 0x0A0A, 0x82B0, 0x4D16, 0x82B1, 0x0556,\n    0x82B2, 0x482B, 0x82B3, 0x0E55, 0x82B4, 0x482C, 0x82B7, 0x3AC5,\n    0x82B8, 0x0733, 0x82B9, 0x06D4, 0x82BA, 0x482D, 0x82BB, 0x18B8,\n    0x82BC, 0x482E, 0x82BD, 0x056A, 0x82BE, 0x3AC6, 0x82BF, 0x42AC,\n    0x82C5, 0x05DF, 0x82C6, 0x3AC7, 0x82D0, 0x4D17, 0x82D1, 0x0513,\n    0x82D2, 0x18BD, 0x82D3, 0x0FB2, 0x82D4, 0x0B3D, 0x82D5, 0x42AD,\n    0x82D7, 0x0DB6, 0x82D9, 0x18C9, 0x82DB, 0x0557, 0x82DC, 0x18C7,\n    0x82DE, 0x18C5, 0x82DF, 0x18BC, 0x82E1, 0x18BA, 0x82E2, 0x482F,\n    0x82E3, 0x18BB, 0x82E5, 0x090F, 0x82E6, 0x06E4, 0x82E7, 0x0BB5,\n    0x82E8, 0x4830, 0x82EA, 0x4D18, 0x82EB, 0x0CA9, 0x82EF, 0x4D19,\n    0x82F1, 0x04F3, 0x82F3, 0x18BF, 0x82F4, 0x18BE, 0x82F6, 0x4D1A,\n    0x82F7, 0x4831, 0x82F9, 0x18C4, 0x82FA, 0x18C0, 0x82FB, 0x18C3,\n    0x82FD, 0x42AE, 0x82FE, 0x3AC8, 0x8300, 0x42AF, 0x8301, 0x2198,\n    0x8302, 0x0EDC, 0x8303, 0x18C2, 0x8304, 0x0558, 0x8305, 0x05DB,\n    0x8306, 0x18C6, 0x8307, 0x4832, 0x8308, 0x4833, 0x8309, 0x18C8,\n    0x830C, 0x4834, 0x830E, 0x072A, 0x8316, 0x18CC, 0x8317, 0x18D5,\n    0x8318, 0x18D6, 0x831B, 0x4836, 0x831C, 0x046F, 0x831D, 0x4837,\n    0x8322, 0x42B0, 0x8323, 0x18DD, 0x8328, 0x04B5, 0x832B, 0x18D4,\n    0x832D, 0x42B1, 0x832F, 0x18D3, 0x8330, 0x4838, 0x8331, 0x18CE,\n    0x8332, 0x18CD, 0x8334, 0x18CB, 0x8335, 0x18CA, 0x8336, 0x0BA1,\n    0x8338, 0x0B5B, 0x8339, 0x18D0, 0x833A, 0x42B2, 0x833C, 0x4839,\n    0x8340, 0x18CF, 0x8343, 0x3AC9, 0x8344, 0x483A, 0x8345, 0x18D2,\n    0x8346, 0x1DF8, 0x8347, 0x42B3, 0x8349, 0x0AF2, 0x834A, 0x072B,\n    0x834F, 0x04E3, 0x8350, 0x18D1, 0x8351, 0x3ACA, 0x8352, 0x07E5,\n    0x8354, 0x4835, 0x8355, 0x3ACB, 0x8356, 0x4D1B, 0x8357, 0x483B,\n    0x8358, 0x0AF3, 0x835A, 0x377A, 0x8362, 0x2199, 0x8363, 0x456F,\n    0x8373, 0x18E3, 0x8375, 0x18E4, 0x8377, 0x0559, 0x8378, 0x4D1C,\n    0x837B, 0x052E, 0x837C, 0x18E1, 0x837D, 0x42B4, 0x837F, 0x219A,\n    0x8385, 0x18D7, 0x8386, 0x3ACC, 0x8387, 0x18DF, 0x8389, 0x18E6,\n    0x838A, 0x18E0, 0x838D, 0x3ACD, 0x838E, 0x18DE, 0x8392, 0x3ACE,\n    0x8393, 0x18C1, 0x8394, 0x483F, 0x8395, 0x4840, 0x8396, 0x18DC,\n    0x8398, 0x3ACF, 0x839A, 0x18D8, 0x839B, 0x4841, 0x839D, 0x4842,\n    0x839E, 0x060C, 0x839F, 0x18DA, 0x83A0, 0x18E5, 0x83A2, 0x18DB,\n    0x83A7, 0x42B5, 0x83A8, 0x18E7, 0x83A9, 0x3AD0, 0x83AA, 0x18D9,\n    0x83AB, 0x0D32, 0x83B1, 0x0F53, 0x83B5, 0x18E2, 0x83BD, 0x18F8,\n    0x83BF, 0x3AD1, 0x83C0, 0x3AD2, 0x83C1, 0x18F0, 0x83C5, 0x0A41,\n    0x83C7, 0x219B, 0x83C9, 0x4843, 0x83CA, 0x0660, 0x83CC, 0x06D5,\n    0x83CE, 0x18EB, 0x83CF, 0x42B6, 0x83D0, 0x4844, 0x83D1, 0x42B7,\n    0x83D3, 0x055B, 0x83D4, 0x4845, 0x83D6, 0x09BC, 0x83D8, 0x18EE,\n    0x83DC, 0x084A, 0x83DD, 0x4846, 0x83DF, 0x0C4B, 0x83E0, 0x18F3,\n    0x83E1, 0x42B8, 0x83E5, 0x4847, 0x83E9, 0x0E3E, 0x83EA, 0x3AD3,\n    0x83EB, 0x18EA, 0x83EF, 0x055A, 0x83F0, 0x078A, 0x83F1, 0x0D9B,\n    0x83F2, 0x18F4, 0x83F4, 0x18E8, 0x83F6, 0x219C, 0x83F7, 0x18F1,\n    0x83F8, 0x4D1D, 0x83F9, 0x4848, 0x83FB, 0x18FB, 0x83FC, 0x4D1E,\n    0x83FD, 0x18EC, 0x8401, 0x42B9, 0x8403, 0x18ED, 0x8404, 0x0C92,\n    0x8406, 0x42BA, 0x8407, 0x18F2, 0x840A, 0x1E7F, 0x840B, 0x18EF,\n    0x840C, 0x0E56, 0x840D, 0x18F5, 0x840E, 0x04A4, 0x840F, 0x3AD4,\n    0x8411, 0x3AD5, 0x8413, 0x18E9, 0x8415, 0x4849, 0x8417, 0x484B,\n    0x8420, 0x18F7, 0x8422, 0x18F6, 0x8429, 0x0D21, 0x842A, 0x18FD,\n    0x842C, 0x1908, 0x8431, 0x05DC, 0x8435, 0x190B, 0x8438, 0x18F9,\n    0x8439, 0x484C, 0x843C, 0x18FE, 0x843D, 0x0F58, 0x8446, 0x1907,\n    0x8448, 0x219D, 0x8449, 0x0F3F, 0x844A, 0x3AD6, 0x844E, 0x0F72,\n    0x844F, 0x484D, 0x8451, 0x484E, 0x8452, 0x484F, 0x8457, 0x0BB6,\n    0x8458, 0x4D1F, 0x8459, 0x4850, 0x845A, 0x4851, 0x845B, 0x05C9,\n    0x845C, 0x4852, 0x845F, 0x42BB, 0x8461, 0x0DE4, 0x8462, 0x190D,\n    0x8463, 0x0C79, 0x8465, 0x4854, 0x8466, 0x0475, 0x8469, 0x1906,\n    0x846B, 0x1902, 0x846C, 0x0AF4, 0x846D, 0x18FC, 0x846E, 0x1904,\n    0x846F, 0x1909, 0x8470, 0x42BC, 0x8471, 0x0CE2, 0x8473, 0x42BD,\n    0x8475, 0x046E, 0x8476, 0x3AD7, 0x8477, 0x1901, 0x8478, 0x4855,\n    0x8479, 0x190A, 0x847A, 0x0DEA, 0x847C, 0x4856, 0x8481, 0x4857,\n    0x8482, 0x1905, 0x8484, 0x1900, 0x8485, 0x42BE, 0x848B, 0x09BD,\n    0x8490, 0x0939, 0x8493, 0x4D20, 0x8494, 0x08D8, 0x8497, 0x4859,\n    0x8499, 0x0EE4, 0x849C, 0x0DB9, 0x849E, 0x42BF, 0x849F, 0x1910,\n    0x84A1, 0x1919, 0x84A6, 0x485A, 0x84A8, 0x3AD8, 0x84AD, 0x1903,\n    0x84AF, 0x3AD9, 0x84B1, 0x4D21, 0x84B2, 0x05D5, 0x84B4, 0x219E,\n    0x84B8, 0x09E0, 0x84B9, 0x190E, 0x84BA, 0x42C0, 0x84BB, 0x1913,\n    0x84BC, 0x0AF5, 0x84BD, 0x4D22, 0x84BE, 0x485B, 0x84BF, 0x190F,\n    0x84C0, 0x3ADA, 0x84C1, 0x1916, 0x84C2, 0x3ADB, 0x84C4, 0x0B9D,\n    0x84C6, 0x1917, 0x84C9, 0x0F40, 0x84CA, 0x190C, 0x84CB, 0x0596,\n    0x84CD, 0x1912, 0x84CE, 0x485D, 0x84CF, 0x485E, 0x84D0, 0x1915,\n    0x84D1, 0x0EB8, 0x84D3, 0x485F, 0x84D6, 0x1918, 0x84D9, 0x1911,\n    0x84DA, 0x1914, 0x84DC, 0x20AB, 0x84E7, 0x4861, 0x84EA, 0x4862,\n    0x84EC, 0x0E57, 0x84EE, 0x0FC7, 0x84EF, 0x4863, 0x84F0, 0x3ADC,\n    0x84F1, 0x4864, 0x84F4, 0x191C, 0x84FA, 0x4865, 0x84FB, 0x4D23,\n    0x84FC, 0x1923, 0x84FD, 0x3ADD, 0x84FF, 0x191B, 0x8500, 0x08EF,\n    0x8506, 0x18FA, 0x850C, 0x3ADE, 0x8511, 0x0E1E, 0x8513, 0x0EAE,\n    0x8514, 0x1922, 0x8515, 0x1921, 0x8517, 0x191D, 0x8518, 0x191E,\n    0x851A, 0x04D8, 0x851B, 0x4866, 0x851E, 0x42C3, 0x851F, 0x1920,\n    0x8521, 0x191A, 0x8523, 0x1E1A, 0x8524, 0x4867, 0x8525, 0x4868,\n    0x8526, 0x0BF1, 0x852B, 0x4869, 0x852C, 0x191F, 0x852D, 0x04C2,\n    0x852F, 0x42C4, 0x8532, 0x42C2, 0x8534, 0x3ADF, 0x8535, 0x0B02,\n    0x853D, 0x0E13, 0x853E, 0x1EB5, 0x8540, 0x1924, 0x8541, 0x1928,\n    0x8543, 0x0D6D, 0x8546, 0x4D24, 0x8548, 0x1927, 0x8549, 0x09BE,\n    0x854A, 0x08F5, 0x854B, 0x192A, 0x854E, 0x06B6, 0x854F, 0x486A,\n    0x8551, 0x486D, 0x8553, 0x219F, 0x8555, 0x192B, 0x8556, 0x4D25,\n    0x8557, 0x0DEB, 0x8558, 0x1926, 0x8559, 0x21A0, 0x855A, 0x18FF,\n    0x855D, 0x4D26, 0x855E, 0x3AE0, 0x8561, 0x486E, 0x8562, 0x486F,\n    0x8563, 0x1925, 0x8564, 0x42C5, 0x8568, 0x0FF5, 0x8569, 0x0C7A,\n    0x856A, 0x0DE5, 0x856B, 0x21A1, 0x856D, 0x1932, 0x856F, 0x486B,\n    0x8577, 0x1938, 0x857A, 0x42C6, 0x857B, 0x4871, 0x857D, 0x4872,\n    0x857E, 0x1939, 0x857F, 0x4873, 0x8580, 0x192C, 0x8581, 0x4874,\n    0x8584, 0x0D2C, 0x8585, 0x4D27, 0x8586, 0x4875, 0x8587, 0x1936,\n    0x8588, 0x192E, 0x858A, 0x1930, 0x858C, 0x42C7, 0x858F, 0x3AE1,\n    0x8590, 0x193A, 0x8591, 0x192F, 0x8593, 0x4876, 0x8594, 0x1933,\n    0x8597, 0x0514, 0x8598, 0x4D28, 0x8599, 0x0CBD, 0x859B, 0x1934,\n    0x859C, 0x1937, 0x859D, 0x4877, 0x859F, 0x4878, 0x85A2, 0x42C8,\n    0x85A4, 0x192D, 0x85A6, 0x0AA8, 0x85A8, 0x1931, 0x85A9, 0x0875,\n    0x85AA, 0x0A0B, 0x85AB, 0x0706, 0x85AC, 0x0F00, 0x85AD, 0x3AE4,\n    0x85AE, 0x0F05, 0x85AF, 0x097C, 0x85B0, 0x21A3, 0x85B7, 0x3AE2,\n    0x85B9, 0x193E, 0x85BA, 0x193C, 0x85BC, 0x487C, 0x85C1, 0x0FF4,\n    0x85C7, 0x487D, 0x85C9, 0x193B, 0x85CA, 0x487E, 0x85CB, 0x42C9,\n    0x85CD, 0x0F5F, 0x85CE, 0x3AE3, 0x85CF, 0x193D, 0x85D0, 0x193F,\n    0x85D5, 0x1940, 0x85D8, 0x487F, 0x85D9, 0x4880, 0x85DC, 0x1943,\n    0x85DD, 0x1941, 0x85DF, 0x4881, 0x85E1, 0x4882, 0x85E4, 0x0C7B,\n    0x85E5, 0x1942, 0x85E6, 0x4883, 0x85E9, 0x0D61, 0x85EA, 0x1935,\n    0x85ED, 0x42CA, 0x85F4, 0x3780, 0x85F6, 0x4884, 0x85F7, 0x097D,\n    0x85F9, 0x1944, 0x85FA, 0x1949, 0x85FB, 0x0AF6, 0x85FE, 0x1948,\n    0x85FF, 0x42CB, 0x8600, 0x4885, 0x8602, 0x1929, 0x8604, 0x42CC,\n    0x8605, 0x42CD, 0x8606, 0x194A, 0x8607, 0x0ACB, 0x860A, 0x1945,\n    0x860B, 0x1947, 0x8610, 0x42CE, 0x8611, 0x4886, 0x8612, 0x3AE5,\n    0x8613, 0x1946, 0x8616, 0x14D0, 0x8617, 0x14C1, 0x8618, 0x42D0,\n    0x861A, 0x194C, 0x861E, 0x4887, 0x8621, 0x4888, 0x8622, 0x194B,\n    0x8624, 0x4889, 0x8627, 0x488A, 0x8629, 0x3AE6, 0x862D, 0x0F60,\n    0x862F, 0x16B1, 0x8630, 0x194D, 0x8638, 0x42D1, 0x8639, 0x488C,\n    0x863C, 0x488D, 0x863F, 0x194E, 0x8640, 0x488F, 0x8641, 0x41B8,\n    0x8642, 0x4D29, 0x8646, 0x4D2A, 0x864D, 0x194F, 0x864E, 0x078B,\n    0x8650, 0x066E, 0x8652, 0x3AE7, 0x8653, 0x4890, 0x8654, 0x1951,\n    0x8655, 0x1094, 0x8656, 0x4891, 0x8657, 0x42D2, 0x865A, 0x068F,\n    0x865B, 0x3418, 0x865C, 0x0F82, 0x865E, 0x06EB, 0x865F, 0x1952,\n    0x8662, 0x42D3, 0x8663, 0x3AE8, 0x8667, 0x1953, 0x866B, 0x0BAC,\n    0x866C, 0x3AE9, 0x866F, 0x3AEA, 0x8671, 0x1954, 0x8675, 0x42D5,\n    0x8677, 0x4892, 0x8679, 0x0CD2, 0x867A, 0x3AEB, 0x867B, 0x047E,\n    0x867D, 0x3786, 0x8687, 0x4893, 0x8689, 0x4894, 0x868A, 0x0563,\n    0x868B, 0x1959, 0x868C, 0x195A, 0x868D, 0x3AEC, 0x8691, 0x3AED,\n    0x8693, 0x1955, 0x8695, 0x088B, 0x8698, 0x3AEE, 0x869C, 0x4895,\n    0x869D, 0x4896, 0x86A3, 0x1956, 0x86A4, 0x0CF8, 0x86A7, 0x3AEF,\n    0x86A8, 0x3AF0, 0x86A9, 0x1957, 0x86AA, 0x1958, 0x86AB, 0x1962,\n    0x86AF, 0x195C, 0x86B0, 0x195F, 0x86B1, 0x4897, 0x86B3, 0x4898,\n    0x86B6, 0x195B, 0x86B8, 0x42D6, 0x86C0, 0x4D2B, 0x86C1, 0x4899,\n    0x86C3, 0x489A, 0x86C4, 0x195D, 0x86C6, 0x195E, 0x86C7, 0x0904,\n    0x86C9, 0x1960, 0x86CB, 0x0B7F, 0x86CD, 0x072C, 0x86CE, 0x05A0,\n    0x86D1, 0x489B, 0x86D4, 0x1963, 0x86D5, 0x489C, 0x86D7, 0x489D,\n    0x86D9, 0x059D, 0x86DB, 0x1968, 0x86DE, 0x1964, 0x86DF, 0x1967,\n    0x86E3, 0x489E, 0x86E4, 0x0D4E, 0x86E6, 0x489F, 0x86E9, 0x1965,\n    0x86EC, 0x1966, 0x86ED, 0x0DBA, 0x86EE, 0x0D6E, 0x86EF, 0x1969,\n    0x86F8, 0x0B5D, 0x86F9, 0x1973, 0x86FA, 0x3AF1, 0x86FB, 0x196F,\n    0x86FC, 0x42D7, 0x86FD, 0x3AF2, 0x86FE, 0x056B, 0x8700, 0x196D,\n    0x8702, 0x0E58, 0x8703, 0x196E, 0x8705, 0x48A1, 0x8706, 0x196B,\n    0x8707, 0x48A2, 0x8708, 0x196C, 0x8709, 0x1971, 0x870A, 0x1974,\n    0x870B, 0x3AF3, 0x870D, 0x1972, 0x870E, 0x48A3, 0x8710, 0x48A4,\n    0x8711, 0x1970, 0x8712, 0x196A, 0x8713, 0x3AF4, 0x8714, 0x4D2C,\n    0x8718, 0x0B96, 0x8719, 0x3AF5, 0x871A, 0x197B, 0x871C, 0x0EB6,\n    0x871E, 0x3AF6, 0x871F, 0x48A5, 0x8721, 0x48A6, 0x8722, 0x4D2D,\n    0x8723, 0x48A7, 0x8725, 0x1979, 0x8728, 0x3AF7, 0x8729, 0x197A,\n    0x872E, 0x4D2E, 0x8731, 0x48A8, 0x8734, 0x1975, 0x8737, 0x1977,\n    0x8739, 0x4D2F, 0x873A, 0x48A9, 0x873B, 0x1978, 0x873E, 0x3AF8,\n    0x873F, 0x1976, 0x8740, 0x48AA, 0x8743, 0x48AB, 0x8749, 0x0A8A,\n    0x874B, 0x0FDF, 0x874C, 0x197F, 0x874E, 0x1980, 0x8751, 0x48AC,\n    0x8753, 0x1986, 0x8755, 0x09F0, 0x8757, 0x1982, 0x8758, 0x48AD,\n    0x8759, 0x1985, 0x875D, 0x4D30, 0x875F, 0x197D, 0x8760, 0x197C,\n    0x8763, 0x1987, 0x8764, 0x48AE, 0x8765, 0x48AF, 0x8766, 0x055C,\n    0x8768, 0x1983, 0x876A, 0x1988, 0x876E, 0x1984, 0x8771, 0x3AF9,\n    0x8772, 0x48B0, 0x8774, 0x1981, 0x8776, 0x0BCF, 0x8778, 0x197E,\n    0x877B, 0x4D31, 0x877C, 0x48B1, 0x877F, 0x0D1E, 0x8782, 0x198C,\n    0x8787, 0x42D8, 0x8788, 0x3AFA, 0x8789, 0x48B5, 0x878B, 0x48B6,\n    0x878C, 0x4D32, 0x878D, 0x0F25, 0x878E, 0x4D33, 0x8793, 0x48B7,\n    0x8797, 0x4D34, 0x8798, 0x4D35, 0x8799, 0x3AFB, 0x879E, 0x4D36,\n    0x879F, 0x198B, 0x87A0, 0x48B8, 0x87A2, 0x198A, 0x87A3, 0x4D37,\n    0x87A7, 0x48B4, 0x87AB, 0x1993, 0x87AC, 0x3AFC, 0x87AD, 0x3AFD,\n    0x87AE, 0x4D38, 0x87AF, 0x198D, 0x87B3, 0x1995, 0x87B5, 0x3AFE,\n    0x87BA, 0x0F50, 0x87BB, 0x1998, 0x87BD, 0x198F, 0x87BE, 0x48BB,\n    0x87BF, 0x4D39, 0x87C0, 0x1990, 0x87C1, 0x48BD, 0x87C4, 0x1994,\n    0x87C6, 0x1997, 0x87C7, 0x1996, 0x87C9, 0x4D3A, 0x87CB, 0x198E,\n    0x87CE, 0x48BE, 0x87D0, 0x1991, 0x87D2, 0x19A2, 0x87D6, 0x3AFF,\n    0x87DA, 0x4D3B, 0x87DF, 0x48BF, 0x87E0, 0x199B, 0x87E3, 0x48C1,\n    0x87E5, 0x48C2, 0x87E6, 0x48C3, 0x87EA, 0x48C4, 0x87EB, 0x3B00,\n    0x87EC, 0x1E23, 0x87ED, 0x3B01, 0x87EF, 0x1999, 0x87F2, 0x199A,\n    0x87F5, 0x3C3D, 0x87F6, 0x199F, 0x87F7, 0x19A0, 0x87F9, 0x0588,\n    0x87FB, 0x065C, 0x87FE, 0x199E, 0x8801, 0x3B02, 0x8803, 0x4F58,\n    0x8805, 0x1989, 0x8806, 0x3B04, 0x8807, 0x21A6, 0x880A, 0x42DA,\n    0x880B, 0x3B05, 0x880D, 0x199D, 0x880E, 0x19A1, 0x880F, 0x199C,\n    0x8810, 0x42DB, 0x8811, 0x19A3, 0x8813, 0x48C5, 0x8814, 0x3B06,\n    0x8815, 0x19A5, 0x8816, 0x19A4, 0x8818, 0x4D3C, 0x881B, 0x4D3D,\n    0x881C, 0x3B07, 0x881F, 0x1E85, 0x8821, 0x19A7, 0x8822, 0x19A6,\n    0x8823, 0x1961, 0x8827, 0x19AB, 0x8828, 0x48C6, 0x882D, 0x4D3E,\n    0x882E, 0x48C7, 0x8831, 0x19A8, 0x8832, 0x48C8, 0x8836, 0x19A9,\n    0x8839, 0x19AA, 0x883A, 0x4D3F, 0x883B, 0x19AC, 0x883C, 0x48C9,\n    0x8840, 0x0742, 0x8842, 0x19AE, 0x8844, 0x19AD, 0x8845, 0x4D40,\n    0x8846, 0x093A, 0x884A, 0x48CB, 0x884B, 0x4D41, 0x884C, 0x07E6,\n    0x884D, 0x1524, 0x884E, 0x4D42, 0x8852, 0x19AF, 0x8853, 0x095B,\n    0x8855, 0x4D43, 0x8856, 0x3B08, 0x8857, 0x0597, 0x8858, 0x48CC,\n    0x8859, 0x19B0, 0x885A, 0x4D44, 0x885B, 0x04F4, 0x885D, 0x09BF,\n    0x885E, 0x19B1, 0x885F, 0x3B09, 0x8861, 0x07E7, 0x8862, 0x19B2,\n    0x8863, 0x04A5, 0x8864, 0x3B0A, 0x8868, 0x0DAF, 0x8869, 0x48CF,\n    0x886B, 0x19B3, 0x886E, 0x4D45, 0x886F, 0x48D1, 0x8870, 0x0A30,\n    0x8872, 0x19BA, 0x8875, 0x19B7, 0x8877, 0x0BAD, 0x887D, 0x19B8,\n    0x887E, 0x19B5, 0x887F, 0x06D6, 0x8881, 0x19B4, 0x8882, 0x19BB,\n    0x8888, 0x070C, 0x888B, 0x0B3E, 0x888D, 0x19C1, 0x8892, 0x19BD,\n    0x8896, 0x0B15, 0x8897, 0x19BC, 0x8898, 0x3B0B, 0x8899, 0x19BF,\n    0x889A, 0x4D46, 0x889B, 0x4D47, 0x889C, 0x4D48, 0x889E, 0x19B6,\n    0x88A0, 0x48D2, 0x88A2, 0x19C0, 0x88A4, 0x19C2, 0x88AA, 0x3B0C,\n    0x88AB, 0x0D83, 0x88AE, 0x19BE, 0x88B0, 0x19C3, 0x88B1, 0x19C5,\n    0x88B4, 0x0787, 0x88B5, 0x19B9, 0x88B7, 0x0485, 0x88BC, 0x48D3,\n    0x88BD, 0x3B0D, 0x88BE, 0x3B0E, 0x88BF, 0x19C4, 0x88C0, 0x48D4,\n    0x88C1, 0x084B, 0x88C2, 0x0FBE, 0x88C3, 0x19C6, 0x88C4, 0x19C7,\n    0x88C5, 0x0AF7, 0x88C6, 0x3789, 0x88CA, 0x3B0F, 0x88CD, 0x4D49,\n    0x88CE, 0x42DC, 0x88CF, 0x0F6A, 0x88D1, 0x48D6, 0x88D2, 0x3B10,\n    0x88D3, 0x48D7, 0x88D4, 0x19C8, 0x88D5, 0x0F1F, 0x88D8, 0x19C9,\n    0x88D9, 0x19CA, 0x88DB, 0x3B11, 0x88DC, 0x0E34, 0x88DD, 0x19CB,\n    0x88DF, 0x0830, 0x88E0, 0x4D4A, 0x88E1, 0x0F6B, 0x88E8, 0x19D0,\n    0x88EF, 0x4D4B, 0x88F0, 0x3B12, 0x88F1, 0x3B13, 0x88F2, 0x19D1,\n    0x88F3, 0x09C0, 0x88F4, 0x19CF, 0x88F5, 0x21A7, 0x88F8, 0x0F51,\n    0x88F9, 0x19CC, 0x88FC, 0x19CE, 0x88FD, 0x0A61, 0x88FE, 0x0A44,\n    0x8901, 0x48D9, 0x8902, 0x19CD, 0x8904, 0x19D2, 0x8906, 0x3B14,\n    0x8907, 0x0DF3, 0x890A, 0x19D4, 0x890C, 0x19D3, 0x890E, 0x4D4C,\n    0x890F, 0x4D4D, 0x8910, 0x05CA, 0x8912, 0x0E59, 0x8913, 0x19D5,\n    0x8918, 0x3B15, 0x8919, 0x3B16, 0x891A, 0x3B17, 0x891C, 0x20A8,\n    0x891D, 0x19E1, 0x891E, 0x19D7, 0x8925, 0x19D8, 0x8926, 0x4D4E,\n    0x8927, 0x3B18, 0x892A, 0x19D9, 0x892B, 0x19DA, 0x8930, 0x3B19,\n    0x8932, 0x42DE, 0x8935, 0x4D4F, 0x8936, 0x19DE, 0x8937, 0x48DB,\n    0x8938, 0x19DF, 0x8939, 0x42DF, 0x893B, 0x19DD, 0x893E, 0x3B1A,\n    0x8940, 0x42E0, 0x8941, 0x19DB, 0x8942, 0x48DD, 0x8943, 0x19D6,\n    0x8944, 0x19DC, 0x8945, 0x48DE, 0x8949, 0x48DF, 0x894C, 0x19E0,\n    0x894D, 0x1BD0, 0x8956, 0x0528, 0x895A, 0x4D50, 0x895C, 0x4D51,\n    0x895E, 0x19E3, 0x895F, 0x06D7, 0x8960, 0x19E2, 0x8962, 0x48E1,\n    0x8964, 0x19E5, 0x8966, 0x19E4, 0x896A, 0x19E7, 0x896B, 0x4D52,\n    0x896D, 0x19E6, 0x896F, 0x19E8, 0x8970, 0x4D53, 0x8972, 0x093B,\n    0x8974, 0x19E9, 0x8977, 0x19EA, 0x897B, 0x3B1B, 0x897C, 0x4D54,\n    0x897E, 0x19EB, 0x897F, 0x0A62, 0x8980, 0x362E, 0x8981, 0x0F41,\n    0x8983, 0x19EC, 0x8986, 0x0DF4, 0x8987, 0x0CFC, 0x8988, 0x19ED,\n    0x8989, 0x48E2, 0x898A, 0x19EE, 0x898B, 0x075F, 0x898F, 0x0646,\n    0x8990, 0x48E3, 0x8993, 0x19EF, 0x8994, 0x42E1, 0x8996, 0x08B9,\n    0x8997, 0x0CF7, 0x8998, 0x19F0, 0x899A, 0x05AE, 0x899F, 0x48E4,\n    0x89A1, 0x19F1, 0x89A5, 0x4D55, 0x89A6, 0x19F3, 0x89A7, 0x0F61,\n    0x89A9, 0x19F2, 0x89AA, 0x0A0C, 0x89AC, 0x19F4, 0x89AF, 0x19F5,\n    0x89B0, 0x48E5, 0x89B2, 0x19F6, 0x89B3, 0x060D, 0x89B5, 0x4D56,\n    0x89B7, 0x48E6, 0x89BA, 0x19F7, 0x89BC, 0x4D57, 0x89BD, 0x19F8,\n    0x89BF, 0x19F9, 0x89C0, 0x19FA, 0x89D2, 0x05AF, 0x89D4, 0x3B1C,\n    0x89D5, 0x4D58, 0x89D6, 0x3B1D, 0x89D8, 0x48E7, 0x89DA, 0x19FB,\n    0x89DC, 0x19FC, 0x89DD, 0x19FD, 0x89E3, 0x0572, 0x89E5, 0x3B1E,\n    0x89E6, 0x09EE, 0x89E7, 0x19FE, 0x89EB, 0x48E8, 0x89F1, 0x3B1F,\n    0x89F3, 0x48EA, 0x89F4, 0x19FF, 0x89F6, 0x42E2, 0x89F8, 0x1A00,\n    0x89FD, 0x48EB, 0x89FF, 0x48EC, 0x8A00, 0x0774, 0x8A01, 0x35BC,\n    0x8A02, 0x0C17, 0x8A03, 0x1A01, 0x8A07, 0x3B20, 0x8A08, 0x072D,\n    0x8A0A, 0x0A1C, 0x8A0C, 0x1A04, 0x8A0E, 0x0C7C, 0x8A0F, 0x3B21,\n    0x8A10, 0x1A03, 0x8A11, 0x48EE, 0x8A12, 0x21A8, 0x8A13, 0x0707,\n    0x8A14, 0x48EF, 0x8A15, 0x3B22, 0x8A16, 0x1A02, 0x8A17, 0x0B57,\n    0x8A18, 0x0647, 0x8A1B, 0x1A05, 0x8A1D, 0x1A06, 0x8A1F, 0x09C1,\n    0x8A21, 0x48F1, 0x8A22, 0x3B23, 0x8A23, 0x0743, 0x8A25, 0x1A07,\n    0x8A2A, 0x0E5A, 0x8A2D, 0x0A83, 0x8A31, 0x0690, 0x8A33, 0x0F01,\n    0x8A34, 0x0ACC, 0x8A35, 0x48F2, 0x8A36, 0x1A08, 0x8A37, 0x21A9,\n    0x8A3A, 0x0A0D, 0x8A3B, 0x0BAE, 0x8A3C, 0x09C2, 0x8A3E, 0x48F3,\n    0x8A41, 0x1A09, 0x8A45, 0x48F4, 0x8A46, 0x1A0C, 0x8A47, 0x42E3,\n    0x8A48, 0x1A0D, 0x8A49, 0x4D59, 0x8A4D, 0x48F5, 0x8A4E, 0x3B24,\n    0x8A50, 0x082E, 0x8A51, 0x0B22, 0x8A52, 0x1A0B, 0x8A54, 0x09C3,\n    0x8A55, 0x0DB0, 0x8A57, 0x4D5A, 0x8A58, 0x48F6, 0x8A5B, 0x1A0A,\n    0x8A5D, 0x42E4, 0x8A5E, 0x08BA, 0x8A60, 0x04F5, 0x8A61, 0x42E5,\n    0x8A62, 0x1A11, 0x8A63, 0x072E, 0x8A66, 0x08BC, 0x8A67, 0x4D5B,\n    0x8A69, 0x08BB, 0x8A6B, 0x0FF3, 0x8A6C, 0x1A10, 0x8A6D, 0x1A0F,\n    0x8A6E, 0x0AA9, 0x8A70, 0x0667, 0x8A71, 0x0FE9, 0x8A72, 0x0598,\n    0x8A73, 0x09C4, 0x8A75, 0x42E6, 0x8A79, 0x21AA, 0x8A7C, 0x1A0E,\n    0x8A7E, 0x4D5C, 0x8A7F, 0x3B25, 0x8A82, 0x1A13, 0x8A84, 0x1A14,\n    0x8A85, 0x1A12, 0x8A86, 0x4D5D, 0x8A87, 0x078C, 0x8A89, 0x0F2A,\n    0x8A8C, 0x08BD, 0x8A8D, 0x0CDD, 0x8A90, 0x48F8, 0x8A91, 0x1A17,\n    0x8A93, 0x0A64, 0x8A95, 0x0B80, 0x8A96, 0x4D5E, 0x8A98, 0x0F20,\n    0x8A9A, 0x1A1A, 0x8A9E, 0x07A0, 0x8AA0, 0x0A63, 0x8AA1, 0x1A16,\n    0x8AA3, 0x1A1B, 0x8AA4, 0x07A1, 0x8AA5, 0x1A18, 0x8AA6, 0x1A19,\n    0x8AA7, 0x21AB, 0x8AA8, 0x1A15, 0x8AAA, 0x3638, 0x8AAC, 0x0A86,\n    0x8AAD, 0x0CA1, 0x8AAE, 0x48F7, 0x8AB0, 0x0B6D, 0x8AB2, 0x055D,\n    0x8AB6, 0x4D5F, 0x8AB7, 0x48F9, 0x8AB9, 0x0D84, 0x8ABC, 0x065D,\n    0x8ABE, 0x21AC, 0x8ABF, 0x0BD0, 0x8AC2, 0x1A1E, 0x8AC4, 0x1A1C,\n    0x8AC7, 0x0B8A, 0x8AC9, 0x4D60, 0x8ACB, 0x0A65, 0x8ACC, 0x060E,\n    0x8ACD, 0x1A1D, 0x8ACF, 0x0A21, 0x8AD0, 0x42E7, 0x8AD1, 0x4D61,\n    0x8AD2, 0x0F92, 0x8AD6, 0x0FE6, 0x8AD7, 0x48FA, 0x8ADA, 0x1A1F,\n    0x8ADB, 0x1A2A, 0x8ADC, 0x0BD1, 0x8ADD, 0x4D62, 0x8ADE, 0x1A29,\n    0x8ADF, 0x21AD, 0x8AE0, 0x1A26, 0x8AE1, 0x1A2E, 0x8AE2, 0x1A27,\n    0x8AE4, 0x1A23, 0x8AE6, 0x0C18, 0x8AE7, 0x1A22, 0x8AEB, 0x1A20,\n    0x8AEC, 0x4D63, 0x8AED, 0x0F0B, 0x8AEE, 0x08BE, 0x8AF1, 0x1A24,\n    0x8AF3, 0x1A21, 0x8AF4, 0x3B26, 0x8AF5, 0x4D64, 0x8AF6, 0x21AF,\n    0x8AF7, 0x1A28, 0x8AF8, 0x097E, 0x8AFA, 0x0775, 0x8AFC, 0x48FB,\n    0x8AFE, 0x0B5A, 0x8B00, 0x0E73, 0x8B01, 0x04FC, 0x8B02, 0x04A6,\n    0x8B04, 0x0C7D, 0x8B05, 0x48FE, 0x8B06, 0x4D65, 0x8B07, 0x1A2C,\n    0x8B0A, 0x48FD, 0x8B0C, 0x1A2B, 0x8B0D, 0x48FF, 0x8B0E, 0x0CBE,\n    0x8B0F, 0x4D66, 0x8B10, 0x1A30, 0x8B11, 0x4D67, 0x8B14, 0x1A25,\n    0x8B16, 0x1A2F, 0x8B17, 0x1A31, 0x8B19, 0x0760, 0x8B1A, 0x1A2D,\n    0x8B1B, 0x07E8, 0x8B1C, 0x4900, 0x8B1D, 0x0901, 0x8B1F, 0x3B27,\n    0x8B20, 0x1A32, 0x8B21, 0x0F42, 0x8B26, 0x1A35, 0x8B28, 0x1A38,\n    0x8B2B, 0x1A36, 0x8B2C, 0x0DA7, 0x8B2D, 0x4901, 0x8B33, 0x1A33,\n    0x8B37, 0x3B28, 0x8B39, 0x06D8, 0x8B3E, 0x1A37, 0x8B41, 0x1A39,\n    0x8B43, 0x3B29, 0x8B44, 0x3B2A, 0x8B45, 0x4D68, 0x8B46, 0x42E8,\n    0x8B49, 0x1A3D, 0x8B4C, 0x1A3A, 0x8B4E, 0x1A3C, 0x8B4F, 0x1A3B,\n    0x8B51, 0x4903, 0x8B52, 0x4D69, 0x8B53, 0x21B0, 0x8B54, 0x3B2B,\n    0x8B56, 0x1A3E, 0x8B58, 0x08DD, 0x8B59, 0x42E9, 0x8B5A, 0x1A40,\n    0x8B5B, 0x1A3F, 0x8B5C, 0x0DDA, 0x8B5E, 0x4904, 0x8B5F, 0x1A42,\n    0x8B66, 0x072F, 0x8B69, 0x42EA, 0x8B6B, 0x1A41, 0x8B6C, 0x1A43,\n    0x8B6D, 0x4D6A, 0x8B6F, 0x1A44, 0x8B70, 0x065E, 0x8B71, 0x182E,\n    0x8B72, 0x09E1, 0x8B74, 0x1A45, 0x8B76, 0x4905, 0x8B77, 0x07A2,\n    0x8B78, 0x4D6B, 0x8B7C, 0x4D6C, 0x8B7D, 0x1A46, 0x8B7E, 0x4D6D,\n    0x8B7F, 0x21B1, 0x8B80, 0x1A47, 0x8B81, 0x4906, 0x8B83, 0x088C,\n    0x8B85, 0x4D6E, 0x8B8A, 0x13D3, 0x8B8B, 0x4907, 0x8B8C, 0x1A48,\n    0x8B8E, 0x1A49, 0x8B90, 0x093C, 0x8B92, 0x1A4A, 0x8B93, 0x1A4B,\n    0x8B94, 0x4908, 0x8B95, 0x4909, 0x8B96, 0x1A4C, 0x8B99, 0x1A4D,\n    0x8B9A, 0x1A4E, 0x8B9C, 0x3B2C, 0x8B9D, 0x42EB, 0x8B9E, 0x3B2D,\n    0x8B9F, 0x4D6F, 0x8C37, 0x0B69, 0x8C39, 0x490A, 0x8C3A, 0x1A4F,\n    0x8C3D, 0x490C, 0x8C3F, 0x1A51, 0x8C41, 0x1A50, 0x8C45, 0x490F,\n    0x8C46, 0x0C7E, 0x8C47, 0x3B2E, 0x8C48, 0x1A52, 0x8C49, 0x42EC,\n    0x8C4A, 0x0E5B, 0x8C4B, 0x4D70, 0x8C4C, 0x1A53, 0x8C4E, 0x1A54,\n    0x8C4F, 0x4910, 0x8C50, 0x1A55, 0x8C53, 0x4D71, 0x8C54, 0x3B2F,\n    0x8C55, 0x1A56, 0x8C57, 0x4911, 0x8C5A, 0x0CB2, 0x8C61, 0x09C5,\n    0x8C62, 0x1A57, 0x8C68, 0x42ED, 0x8C69, 0x4912, 0x8C6A, 0x07FD,\n    0x8C6B, 0x1007, 0x8C6C, 0x1A58, 0x8C6D, 0x4913, 0x8C73, 0x3B30,\n    0x8C78, 0x1A59, 0x8C79, 0x0DB1, 0x8C7A, 0x1A5A, 0x8C7B, 0x4D72,\n    0x8C7C, 0x1A62, 0x8C82, 0x1A5B, 0x8C85, 0x1A5D, 0x8C89, 0x1A5C,\n    0x8C8A, 0x1A5E, 0x8C8C, 0x0E74, 0x8C8D, 0x1A5F, 0x8C8E, 0x1A60,\n    0x8C92, 0x4916, 0x8C93, 0x4915, 0x8C94, 0x1A61, 0x8C98, 0x1A63,\n    0x8C99, 0x4917, 0x8C9B, 0x4919, 0x8C9D, 0x058B, 0x8C9E, 0x0C03,\n    0x8C9F, 0x354C, 0x8CA0, 0x0DDB, 0x8CA1, 0x0852, 0x8CA2, 0x07E9,\n    0x8CA4, 0x3B31, 0x8CA7, 0x0DC1, 0x8CA8, 0x055F, 0x8CA9, 0x0D62,\n    0x8CAA, 0x1A66, 0x8CAB, 0x060F, 0x8CAC, 0x0A79, 0x8CAD, 0x1A65,\n    0x8CAE, 0x1A6A, 0x8CAF, 0x0BB7, 0x8CB0, 0x0EEF, 0x8CB2, 0x1A68,\n    0x8CB3, 0x1A69, 0x8CB4, 0x0648, 0x8CB6, 0x1A6B, 0x8CB7, 0x0D19,\n    0x8CB8, 0x0B3F, 0x8CBA, 0x4D73, 0x8CBB, 0x0D85, 0x8CBC, 0x0C37,\n    0x8CBD, 0x1A67, 0x8CBF, 0x0E75, 0x8CC0, 0x056C, 0x8CC1, 0x1A6D,\n    0x8CC2, 0x0FCE, 0x8CC3, 0x0BDE, 0x8CC4, 0x0FEB, 0x8CC5, 0x4D74,\n    0x8CC7, 0x08BF, 0x8CC8, 0x1A6C, 0x8CC9, 0x4D75, 0x8CCA, 0x0B11,\n    0x8CCD, 0x1A7D, 0x8CCE, 0x0AAA, 0x8CD1, 0x0CD0, 0x8CD2, 0x4D76,\n    0x8CD3, 0x0DC2, 0x8CD5, 0x491B, 0x8CD6, 0x491A, 0x8CD9, 0x3B32,\n    0x8CDA, 0x1A70, 0x8CDB, 0x088D, 0x8CDC, 0x08C0, 0x8CDE, 0x09C6,\n    0x8CE0, 0x0D1B, 0x8CE1, 0x3B33, 0x8CE2, 0x0761, 0x8CE3, 0x1A6F,\n    0x8CE4, 0x1A6E, 0x8CE6, 0x0DDC, 0x8CEA, 0x08ED, 0x8CEC, 0x4D77,\n    0x8CED, 0x0C4C, 0x8CF0, 0x21B2, 0x8CF1, 0x491D, 0x8CF4, 0x21B3,\n    0x8CF5, 0x4D78, 0x8CF7, 0x4D79, 0x8CF8, 0x3B34, 0x8CFA, 0x1A72,\n    0x8CFB, 0x1A73, 0x8CFC, 0x07EA, 0x8CFD, 0x1A71, 0x8CFE, 0x3B35,\n    0x8D01, 0x4D7A, 0x8D03, 0x4D7B, 0x8D04, 0x1A74, 0x8D05, 0x1A75,\n    0x8D07, 0x1A77, 0x8D08, 0x0B03, 0x8D09, 0x491F, 0x8D0A, 0x1A76,\n    0x8D0B, 0x0622, 0x8D0D, 0x1A79, 0x8D0E, 0x4920, 0x8D0F, 0x1A78,\n    0x8D10, 0x1A7A, 0x8D12, 0x21B4, 0x8D13, 0x1A7C, 0x8D14, 0x1A7E,\n    0x8D16, 0x1A7F, 0x8D17, 0x4D7C, 0x8D1B, 0x3B36, 0x8D1C, 0x4D7D,\n    0x8D64, 0x0A7A, 0x8D66, 0x08FB, 0x8D67, 0x1A80, 0x8D69, 0x3B37,\n    0x8D6B, 0x05B0, 0x8D6C, 0x3B38, 0x8D6D, 0x1A81, 0x8D6E, 0x4D7E,\n    0x8D70, 0x0AF8, 0x8D71, 0x1A82, 0x8D73, 0x1A83, 0x8D74, 0x0DDD,\n    0x8D76, 0x21B5, 0x8D77, 0x0649, 0x8D81, 0x1A84, 0x8D84, 0x3B39,\n    0x8D85, 0x0BD2, 0x8D8A, 0x04FD, 0x8D8D, 0x3B3A, 0x8D91, 0x4D7F,\n    0x8D95, 0x3B3B, 0x8D99, 0x1A85, 0x8D9F, 0x4D80, 0x8DA3, 0x091D,\n    0x8DA6, 0x3B3C, 0x8DA8, 0x0A3C, 0x8DAB, 0x4D81, 0x8DAF, 0x42EE,\n    0x8DB2, 0x4D82, 0x8DB3, 0x0B0D, 0x8DBA, 0x1A88, 0x8DBE, 0x1A87,\n    0x8DC2, 0x1A86, 0x8DC6, 0x3B3D, 0x8DC8, 0x4921, 0x8DCB, 0x1A8E,\n    0x8DCC, 0x1A8C, 0x8DCE, 0x3B3E, 0x8DCF, 0x1A89, 0x8DD1, 0x42EF,\n    0x8DD5, 0x4D83, 0x8DD6, 0x1A8B, 0x8DD7, 0x42F0, 0x8DD9, 0x4922,\n    0x8DDA, 0x1A8A, 0x8DDB, 0x1A8D, 0x8DDD, 0x0691, 0x8DDF, 0x1A91,\n    0x8DE1, 0x0A7B, 0x8DE3, 0x1A92, 0x8DE4, 0x3B3F, 0x8DE7, 0x4D84,\n    0x8DE8, 0x078D, 0x8DEA, 0x1A8F, 0x8DEB, 0x1A90, 0x8DEC, 0x3B40,\n    0x8DEF, 0x0FCF, 0x8DF1, 0x4D85, 0x8DF2, 0x4D86, 0x8DF3, 0x0BD3,\n    0x8DF4, 0x4D87, 0x8DF5, 0x0AAB, 0x8DFC, 0x1A93, 0x8DFD, 0x4925,\n    0x8DFF, 0x1A96, 0x8E01, 0x4D88, 0x8E06, 0x4926, 0x8E08, 0x1A94,\n    0x8E09, 0x1A95, 0x8E0A, 0x0F43, 0x8E0B, 0x4D89, 0x8E0C, 0x4923,\n    0x8E0F, 0x0C7F, 0x8E10, 0x1A99, 0x8E14, 0x4928, 0x8E16, 0x4929,\n    0x8E1D, 0x1A97, 0x8E1E, 0x1A98, 0x8E1F, 0x1A9A, 0x8E20, 0x3B41,\n    0x8E21, 0x492A, 0x8E22, 0x492B, 0x8E23, 0x42F1, 0x8E26, 0x4D8A,\n    0x8E27, 0x492C, 0x8E2A, 0x1AA8, 0x8E30, 0x1A9D, 0x8E31, 0x4D8B,\n    0x8E34, 0x1A9E, 0x8E35, 0x1A9C, 0x8E36, 0x492F, 0x8E39, 0x4930,\n    0x8E3D, 0x42F2, 0x8E40, 0x4D8C, 0x8E41, 0x4D8D, 0x8E42, 0x1A9B,\n    0x8E44, 0x0C19, 0x8E47, 0x1AA0, 0x8E48, 0x1AA4, 0x8E49, 0x1AA1,\n    0x8E4A, 0x1A9F, 0x8E4B, 0x3B42, 0x8E4C, 0x1AA2, 0x8E4D, 0x4D8E,\n    0x8E4F, 0x4D8F, 0x8E50, 0x1AA3, 0x8E54, 0x4931, 0x8E55, 0x1AAA,\n    0x8E59, 0x1AA5, 0x8E5C, 0x4D90, 0x8E5F, 0x0A7C, 0x8E60, 0x1AA7,\n    0x8E61, 0x4D91, 0x8E62, 0x4932, 0x8E63, 0x1AA9, 0x8E64, 0x1AA6,\n    0x8E69, 0x4D92, 0x8E6C, 0x3B43, 0x8E6D, 0x4933, 0x8E6F, 0x4934,\n    0x8E70, 0x3B44, 0x8E71, 0x4D93, 0x8E72, 0x1AAC, 0x8E74, 0x093D,\n    0x8E75, 0x4D94, 0x8E76, 0x1AAB, 0x8E77, 0x4D95, 0x8E7A, 0x3B45,\n    0x8E7B, 0x42F3, 0x8E7C, 0x1AAD, 0x8E81, 0x1AAE, 0x8E84, 0x1AB1,\n    0x8E85, 0x1AB0, 0x8E87, 0x1AAF, 0x8E89, 0x4D96, 0x8E8A, 0x1AB3,\n    0x8E8B, 0x1AB2, 0x8E8D, 0x0F02, 0x8E90, 0x4D97, 0x8E91, 0x1AB5,\n    0x8E92, 0x3B46, 0x8E93, 0x1AB4, 0x8E94, 0x1AB6, 0x8E95, 0x4D98,\n    0x8E98, 0x4935, 0x8E99, 0x1AB7, 0x8E9A, 0x4D99, 0x8E9E, 0x4936,\n    0x8EA1, 0x1AB9, 0x8EA7, 0x4D9A, 0x8EA9, 0x4D9B, 0x8EAA, 0x1AB8,\n    0x8EAB, 0x0A0E, 0x8EAC, 0x1ABA, 0x8EAD, 0x4D9C, 0x8EAE, 0x3B47,\n    0x8EAF, 0x06E5, 0x8EB0, 0x1ABB, 0x8EB1, 0x1ABD, 0x8EB3, 0x3B48,\n    0x8EB5, 0x4937, 0x8EB6, 0x3703, 0x8EBB, 0x4938, 0x8EBE, 0x1ABE,\n    0x8EC0, 0x1DEF, 0x8EC5, 0x1ABF, 0x8EC6, 0x1ABC, 0x8EC8, 0x1AC0,\n    0x8ECA, 0x0902, 0x8ECB, 0x1AC1, 0x8ECC, 0x064A, 0x8ECD, 0x0709,\n    0x8ECF, 0x21B7, 0x8ED1, 0x3B49, 0x8ED2, 0x0762, 0x8ED4, 0x3B4A,\n    0x8EDB, 0x1AC2, 0x8EDF, 0x0CC8, 0x8EE2, 0x0C38, 0x8EE3, 0x1AC3,\n    0x8EE8, 0x4D9D, 0x8EEB, 0x1AC6, 0x8EF0, 0x4D9E, 0x8EF8, 0x08E0,\n    0x8EF9, 0x3B4B, 0x8EFA, 0x42F6, 0x8EFB, 0x1AC5, 0x8EFC, 0x1AC4,\n    0x8EFD, 0x0730, 0x8EFE, 0x1AC7, 0x8F00, 0x493C, 0x8F03, 0x05B1,\n    0x8F05, 0x1AC9, 0x8F07, 0x4D9F, 0x8F08, 0x493D, 0x8F09, 0x084C,\n    0x8F0A, 0x1AC8, 0x8F0C, 0x1AD1, 0x8F12, 0x1ACB, 0x8F13, 0x1ACD,\n    0x8F14, 0x0E35, 0x8F15, 0x1ACA, 0x8F17, 0x3B4C, 0x8F18, 0x4DA0,\n    0x8F19, 0x1ACC, 0x8F1B, 0x1AD0, 0x8F1C, 0x1ACE, 0x8F1D, 0x064B,\n    0x8F1E, 0x42F7, 0x8F1F, 0x1ACF, 0x8F25, 0x4DA1, 0x8F26, 0x1AD2,\n    0x8F27, 0x4DA2, 0x8F29, 0x0D10, 0x8F2A, 0x0FA0, 0x8F2B, 0x493E,\n    0x8F2C, 0x4DA3, 0x8F2D, 0x42F8, 0x8F2F, 0x093E, 0x8F33, 0x1AD3,\n    0x8F35, 0x4DA4, 0x8F36, 0x3B4D, 0x8F38, 0x0F0C, 0x8F39, 0x1AD5,\n    0x8F3A, 0x4DA5, 0x8F3B, 0x1AD4, 0x8F3E, 0x1AD8, 0x8F3F, 0x0F2B,\n    0x8F40, 0x493F, 0x8F42, 0x1AD7, 0x8F43, 0x4DA6, 0x8F44, 0x05CB,\n    0x8F45, 0x1AD6, 0x8F46, 0x1ADB, 0x8F47, 0x4DA7, 0x8F49, 0x1ADA,\n    0x8F4A, 0x4940, 0x8F4C, 0x1AD9, 0x8F4D, 0x0C2C, 0x8F4E, 0x1ADC,\n    0x8F51, 0x4DA8, 0x8F54, 0x42F9, 0x8F55, 0x4DA9, 0x8F57, 0x1ADD,\n    0x8F58, 0x4941, 0x8F5C, 0x1ADE, 0x8F5F, 0x07FE, 0x8F61, 0x06FB,\n    0x8F62, 0x1ADF, 0x8F63, 0x1AE0, 0x8F64, 0x1AE1, 0x8F9B, 0x0A0F,\n    0x8F9C, 0x1AE2, 0x8F9E, 0x08D9, 0x8F9F, 0x1AE3, 0x8FA0, 0x4DAA,\n    0x8FA1, 0x4DAB, 0x8FA2, 0x4DAC, 0x8FA3, 0x1AE4, 0x8FA4, 0x4943,\n    0x8FA5, 0x4DAD, 0x8FA6, 0x3B4E, 0x8FA7, 0x10B6, 0x8FA8, 0x10B5,\n    0x8FAD, 0x1AE5, 0x8FAE, 0x17FF, 0x8FAF, 0x1AE6, 0x8FB0, 0x0B62,\n    0x8FB1, 0x09F1, 0x8FB2, 0x0CF6, 0x8FB4, 0x4944, 0x8FB5, 0x3B4F,\n    0x8FB6, 0x3B50, 0x8FB7, 0x1AE7, 0x8FBA, 0x0E25, 0x8FBB, 0x0BF0,\n    0x8FBC, 0x0810, 0x8FBF, 0x0B67, 0x8FC1, 0x4946, 0x8FC2, 0x04CC,\n    0x8FC4, 0x0EA6, 0x8FC5, 0x0A1D, 0x8FC6, 0x4947, 0x8FC8, 0x3799,\n    0x8FCA, 0x4949, 0x8FCD, 0x494A, 0x8FCE, 0x0734, 0x8FD1, 0x06D9,\n    0x8FD3, 0x494B, 0x8FD4, 0x0E26, 0x8FD5, 0x494C, 0x8FDA, 0x1AE8,\n    0x8FE0, 0x3B52, 0x8FE2, 0x1AEA, 0x8FE4, 0x3B53, 0x8FE5, 0x1AE9,\n    0x8FE6, 0x0560, 0x8FE8, 0x42FB, 0x8FE9, 0x0CCE, 0x8FEA, 0x1AEB,\n    0x8FEB, 0x0D2D, 0x8FED, 0x0C2D, 0x8FEE, 0x42FC, 0x8FEF, 0x1AEC,\n    0x8FF0, 0x095C, 0x8FF1, 0x494D, 0x8FF4, 0x1AEE, 0x8FF5, 0x494E,\n    0x8FF6, 0x3B54, 0x8FF7, 0x0ECE, 0x8FF8, 0x1AFD, 0x8FF9, 0x1AF0,\n    0x8FFA, 0x1AF1, 0x8FFB, 0x494F, 0x8FFD, 0x0BE5, 0x9000, 0x0B40,\n    0x9001, 0x0AF9, 0x9002, 0x3B55, 0x9003, 0x0C80, 0x9004, 0x4DAE,\n    0x9005, 0x1AEF, 0x9006, 0x066F, 0x9008, 0x42FD, 0x900B, 0x1AF8,\n    0x900C, 0x4950, 0x900D, 0x1AF5, 0x900E, 0x1B02, 0x900F, 0x0C81,\n    0x9010, 0x0B9E, 0x9011, 0x1AF2, 0x9013, 0x0C1A, 0x9014, 0x0C4D,\n    0x9015, 0x1AF3, 0x9016, 0x1AF7, 0x9017, 0x0A26, 0x9019, 0x0D1D,\n    0x901A, 0x0BE8, 0x901B, 0x4DAF, 0x901D, 0x0A66, 0x901E, 0x1AF6,\n    0x901F, 0x0B0E, 0x9020, 0x0B04, 0x9021, 0x1AF4, 0x9022, 0x046D,\n    0x9023, 0x0FC8, 0x9027, 0x1AF9, 0x902C, 0x3B56, 0x902D, 0x42FE,\n    0x902E, 0x0B41, 0x902F, 0x4DB0, 0x9031, 0x093F, 0x9032, 0x0A10,\n    0x9035, 0x1AFB, 0x9036, 0x1AFA, 0x9037, 0x4951, 0x9038, 0x04B3,\n    0x9039, 0x1AFC, 0x903C, 0x0DA1, 0x903E, 0x1B04, 0x9041, 0x0CB3,\n    0x9042, 0x0A31, 0x9043, 0x4953, 0x9044, 0x3B57, 0x9045, 0x0B97,\n    0x9047, 0x06F0, 0x9049, 0x1B03, 0x904A, 0x0F21, 0x904B, 0x04E1,\n    0x904C, 0x4DB1, 0x904D, 0x0E27, 0x904E, 0x0561, 0x904F, 0x1AFE,\n    0x9050, 0x1AFF, 0x9051, 0x1B00, 0x9052, 0x1B01, 0x9053, 0x0C93,\n    0x9054, 0x0B61, 0x9055, 0x04A7, 0x9056, 0x1B05, 0x9058, 0x1B06,\n    0x9059, 0x1D34, 0x905B, 0x4DB2, 0x905C, 0x0B1D, 0x905D, 0x4954,\n    0x905E, 0x1B07, 0x9060, 0x0515, 0x9061, 0x0ACE, 0x9063, 0x0763,\n    0x9065, 0x0F44, 0x9067, 0x21BA, 0x9068, 0x1B08, 0x9069, 0x0C26,\n    0x906D, 0x0AFA, 0x906E, 0x0903, 0x906F, 0x1B09, 0x9070, 0x4DB3,\n    0x9072, 0x1B0C, 0x9074, 0x4DB4, 0x9075, 0x096F, 0x9076, 0x1B0A,\n    0x9077, 0x0AAD, 0x9078, 0x0AAC, 0x9079, 0x4DB5, 0x907A, 0x04A8,\n    0x907C, 0x0F93, 0x907D, 0x1B0E, 0x907F, 0x0D86, 0x9080, 0x1B10,\n    0x9081, 0x1B0F, 0x9082, 0x1B0D, 0x9083, 0x1737, 0x9084, 0x0610,\n    0x9085, 0x4957, 0x9087, 0x1AED, 0x9088, 0x3B58, 0x9089, 0x1B12,\n    0x908A, 0x1B11, 0x908B, 0x4DB6, 0x908C, 0x4958, 0x908F, 0x1B13,\n    0x9090, 0x4959, 0x9091, 0x0F22, 0x9095, 0x3B59, 0x9097, 0x42FF,\n    0x9098, 0x4DB7, 0x9099, 0x3B5A, 0x909B, 0x3B5B, 0x90A0, 0x4DB8,\n    0x90A1, 0x495A, 0x90A2, 0x3B5C, 0x90A3, 0x0CB9, 0x90A6, 0x0E5C,\n    0x90A8, 0x1B14, 0x90AA, 0x0905, 0x90AF, 0x1B15, 0x90B0, 0x495C,\n    0x90B1, 0x1B16, 0x90B2, 0x4DB9, 0x90B3, 0x4300, 0x90B4, 0x3B5D,\n    0x90B5, 0x1B17, 0x90B6, 0x495D, 0x90B8, 0x0C1B, 0x90BD, 0x4DBA,\n    0x90BE, 0x4301, 0x90C1, 0x04AE, 0x90C3, 0x495E, 0x90C4, 0x4302,\n    0x90C5, 0x4303, 0x90C7, 0x4304, 0x90C8, 0x495F, 0x90C9, 0x4DBB,\n    0x90CA, 0x07EB, 0x90CE, 0x0FE0, 0x90D7, 0x3B5E, 0x90DB, 0x1B1B,\n    0x90DC, 0x4961, 0x90DD, 0x3B5F, 0x90DE, 0x21BB, 0x90DF, 0x4962,\n    0x90E1, 0x070A, 0x90E2, 0x1B18, 0x90E4, 0x1B19, 0x90E8, 0x0DE6,\n    0x90EB, 0x4967, 0x90ED, 0x05B2, 0x90EF, 0x4305, 0x90F0, 0x4DBC,\n    0x90F2, 0x4965, 0x90F4, 0x3B60, 0x90F5, 0x0F23, 0x90F6, 0x4964,\n    0x90F7, 0x06B7, 0x90FD, 0x0C4E, 0x90FE, 0x4968, 0x90FF, 0x4969,\n    0x9100, 0x4966, 0x9102, 0x1B1C, 0x9104, 0x496A, 0x9105, 0x4DBD,\n    0x9106, 0x496B, 0x9112, 0x1B1D, 0x9114, 0x4306, 0x9115, 0x21BD,\n    0x9116, 0x4307, 0x9117, 0x3B61, 0x9118, 0x496C, 0x9119, 0x1B1E,\n    0x911C, 0x3B62, 0x911E, 0x496D, 0x9122, 0x4308, 0x9123, 0x4309,\n    0x9125, 0x4DBE, 0x9127, 0x21BE, 0x912D, 0x0C1C, 0x912F, 0x430A,\n    0x9130, 0x1B20, 0x9131, 0x3B63, 0x9132, 0x1B1F, 0x9134, 0x430B,\n    0x9137, 0x496E, 0x9139, 0x496F, 0x913A, 0x3B64, 0x913D, 0x3B65,\n    0x9146, 0x4970, 0x9147, 0x4971, 0x9148, 0x3B66, 0x9149, 0x0CAB,\n    0x914A, 0x1B21, 0x914B, 0x0940, 0x914C, 0x090C, 0x914D, 0x0D11,\n    0x914E, 0x0BAF, 0x9152, 0x091E, 0x9154, 0x0A32, 0x9156, 0x1B22,\n    0x9157, 0x4972, 0x9158, 0x1B23, 0x9159, 0x4973, 0x915A, 0x4DBF,\n    0x915B, 0x3B67, 0x9161, 0x3B68, 0x9162, 0x0A23, 0x9163, 0x1B24,\n    0x9164, 0x3B69, 0x9165, 0x1B25, 0x9167, 0x4DC0, 0x9169, 0x1B26,\n    0x916A, 0x0F59, 0x916C, 0x0941, 0x9172, 0x1B28, 0x9173, 0x1B27,\n    0x9174, 0x4974, 0x9175, 0x07EC, 0x9177, 0x0805, 0x9178, 0x088E,\n    0x9179, 0x4975, 0x917A, 0x4DC1, 0x9182, 0x1B2B, 0x9183, 0x430C,\n    0x9185, 0x4976, 0x9187, 0x0970, 0x9189, 0x1B2A, 0x918A, 0x4DC2,\n    0x918B, 0x1B29, 0x918D, 0x0B49, 0x918E, 0x3B6A, 0x9190, 0x07A3,\n    0x9191, 0x4DC3, 0x9192, 0x0A67, 0x9195, 0x4DC4, 0x9197, 0x0D44,\n    0x919C, 0x0943, 0x919E, 0x3B6B, 0x91A2, 0x1B2C, 0x91A4, 0x09C7,\n    0x91A8, 0x3B6C, 0x91AA, 0x1B2F, 0x91AB, 0x1B2D, 0x91AC, 0x1E1B,\n    0x91AD, 0x3B6D, 0x91AE, 0x3B6E, 0x91AF, 0x1B2E, 0x91B0, 0x4DC5,\n    0x91B1, 0x1E61, 0x91B2, 0x3B6F, 0x91B3, 0x4977, 0x91B4, 0x1B31,\n    0x91B5, 0x1B30, 0x91B6, 0x4978, 0x91B8, 0x09E2, 0x91BA, 0x1B32,\n    0x91BB, 0x4DC6, 0x91BC, 0x3B70, 0x91BD, 0x4DC7, 0x91C0, 0x1B33,\n    0x91C1, 0x1B34, 0x91C2, 0x4DC8, 0x91C3, 0x4979, 0x91C4, 0x497A,\n    0x91C5, 0x4DC9, 0x91C6, 0x0D64, 0x91C7, 0x0843, 0x91C8, 0x090D,\n    0x91C9, 0x1B35, 0x91CB, 0x1B36, 0x91CC, 0x0F6C, 0x91CD, 0x094F,\n    0x91CE, 0x0EFA, 0x91CF, 0x0F94, 0x91D0, 0x1B37, 0x91D1, 0x06DA,\n    0x91D6, 0x1B38, 0x91D7, 0x21C0, 0x91D8, 0x0C1D, 0x91DA, 0x21BF,\n    0x91DB, 0x1B3B, 0x91DC, 0x05D6, 0x91DD, 0x0A11, 0x91DE, 0x21C1,\n    0x91DF, 0x1B39, 0x91E1, 0x1B3A, 0x91E3, 0x0BFC, 0x91E4, 0x21C4,\n    0x91E5, 0x21C5, 0x91E6, 0x0E83, 0x91E7, 0x06F4, 0x91EC, 0x497D,\n    0x91ED, 0x21C2, 0x91EE, 0x21C3, 0x91F0, 0x3B71, 0x91F1, 0x430D,\n    0x91F5, 0x1B3D, 0x91F6, 0x1B3E, 0x91F7, 0x3B72, 0x91FB, 0x3B73,\n    0x91FC, 0x1B3C, 0x91FF, 0x1B40, 0x9200, 0x4DCA, 0x9201, 0x497E,\n    0x9206, 0x21C6, 0x9207, 0x3B74, 0x9209, 0x4DCB, 0x920A, 0x21C8,\n    0x920D, 0x0CB7, 0x920E, 0x05A1, 0x9210, 0x21C7, 0x9211, 0x1B44,\n    0x9214, 0x1B41, 0x9215, 0x1B43, 0x9216, 0x497F, 0x9217, 0x4980,\n    0x921E, 0x1B3F, 0x9223, 0x4DCC, 0x9228, 0x3B75, 0x9229, 0x1B8A,\n    0x922C, 0x1B42, 0x9233, 0x3B76, 0x9234, 0x0FB3, 0x9237, 0x078E,\n    0x9238, 0x3B77, 0x9239, 0x21CF, 0x923A, 0x21C9, 0x923C, 0x21CB,\n    0x923F, 0x1B4C, 0x9240, 0x21CA, 0x9242, 0x4982, 0x9243, 0x3B78,\n    0x9244, 0x0C2E, 0x9245, 0x1B47, 0x9247, 0x3B79, 0x9248, 0x1B4A,\n    0x9249, 0x1B48, 0x924A, 0x4983, 0x924B, 0x1B4D, 0x924E, 0x21CC,\n    0x924F, 0x3B7A, 0x9250, 0x1B4E, 0x9251, 0x21CE, 0x9256, 0x4984,\n    0x9257, 0x1B46, 0x9259, 0x21CD, 0x925A, 0x1B53, 0x925B, 0x0516,\n    0x925E, 0x1B45, 0x9260, 0x3B7B, 0x9261, 0x4985, 0x9262, 0x0D41,\n    0x9264, 0x1B49, 0x9265, 0x4986, 0x9266, 0x09C8, 0x9267, 0x21D0,\n    0x9268, 0x4987, 0x9271, 0x07ED, 0x9276, 0x4DCD, 0x9277, 0x21D2,\n    0x9278, 0x21D3, 0x927C, 0x4989, 0x927D, 0x498A, 0x927E, 0x0E76,\n    0x927F, 0x498B, 0x9280, 0x06DC, 0x9283, 0x0950, 0x9285, 0x0C94,\n    0x9288, 0x20AA, 0x9289, 0x498C, 0x928D, 0x498D, 0x928E, 0x4DCE,\n    0x9291, 0x0AAF, 0x9293, 0x1B51, 0x9295, 0x1B4B, 0x9296, 0x1B50,\n    0x9297, 0x498E, 0x9298, 0x0ECF, 0x9299, 0x498F, 0x929A, 0x0BD4,\n    0x929B, 0x1B52, 0x929C, 0x1B4F, 0x929F, 0x4990, 0x92A7, 0x21D1,\n    0x92AB, 0x4991, 0x92AD, 0x0AAE, 0x92AF, 0x4DCF, 0x92B2, 0x4994,\n    0x92B3, 0x3554, 0x92B7, 0x1B56, 0x92B9, 0x1B55, 0x92BB, 0x4DD0,\n    0x92BC, 0x4DD1, 0x92BF, 0x4995, 0x92C0, 0x4996, 0x92C1, 0x4DD2,\n    0x92C2, 0x3B7C, 0x92C3, 0x4DD3, 0x92C5, 0x4DD4, 0x92C6, 0x4997,\n    0x92C8, 0x4DD5, 0x92CB, 0x3B7D, 0x92CC, 0x3B7E, 0x92CE, 0x4998,\n    0x92CF, 0x1B54, 0x92D0, 0x21D7, 0x92D2, 0x0E5D, 0x92D3, 0x21DB,\n    0x92D5, 0x21D9, 0x92D7, 0x21D5, 0x92D9, 0x21D6, 0x92DF, 0x3B7F,\n    0x92E0, 0x21DA, 0x92E4, 0x0985, 0x92E5, 0x4999, 0x92E7, 0x21D4,\n    0x92E9, 0x1B57, 0x92EA, 0x0E2F, 0x92ED, 0x04F6, 0x92F2, 0x0DB8,\n    0x92F3, 0x0BB0, 0x92F7, 0x499D, 0x92F8, 0x0692, 0x92F9, 0x20B0,\n    0x92FA, 0x1B59, 0x92FB, 0x21DE, 0x92FC, 0x07EF, 0x92FF, 0x21E1,\n    0x9302, 0x21E3, 0x9304, 0x345A, 0x9306, 0x087A, 0x930D, 0x3B80,\n    0x930F, 0x1B58, 0x9310, 0x0A33, 0x9311, 0x499A, 0x9314, 0x4DD6,\n    0x9315, 0x3B81, 0x9318, 0x0A34, 0x9319, 0x1B5C, 0x931A, 0x1B5E,\n    0x931D, 0x21E2, 0x931E, 0x21E0, 0x931F, 0x3B82, 0x9320, 0x09E3,\n    0x9321, 0x21DD, 0x9322, 0x1B5D, 0x9323, 0x1B5F, 0x9325, 0x21DC,\n    0x9326, 0x06CB, 0x9327, 0x3B83, 0x9328, 0x0DB7, 0x9329, 0x499E,\n    0x932B, 0x090E, 0x932C, 0x0FC9, 0x932E, 0x1B5B, 0x932F, 0x0868,\n    0x9332, 0x0FE5, 0x9333, 0x4DD7, 0x9335, 0x1B61, 0x9336, 0x4DD8,\n    0x933A, 0x1B60, 0x933B, 0x1B62, 0x9344, 0x1B5A, 0x9347, 0x3B84,\n    0x9348, 0x20A9, 0x9349, 0x430E, 0x934A, 0x3458, 0x934B, 0x0CC1,\n    0x934D, 0x0C4F, 0x9351, 0x49A1, 0x9352, 0x3B85, 0x9354, 0x0BF3,\n    0x9356, 0x1B67, 0x9357, 0x21E5, 0x9358, 0x4DD9, 0x935A, 0x49A2,\n    0x935B, 0x0B81, 0x935C, 0x1B63, 0x9360, 0x1B64, 0x9364, 0x430F,\n    0x9365, 0x4310, 0x936A, 0x3B87, 0x936B, 0x49A3, 0x936C, 0x0703,\n    0x936D, 0x3B88, 0x936E, 0x1B66, 0x9370, 0x21E4, 0x9371, 0x49A4,\n    0x9373, 0x49A5, 0x9375, 0x0764, 0x937C, 0x1B65, 0x937E, 0x09C9,\n    0x937F, 0x4DDA, 0x9382, 0x4DDB, 0x9388, 0x49A9, 0x938A, 0x4DDC,\n    0x938B, 0x49AA, 0x938C, 0x05D7, 0x938F, 0x49AB, 0x9394, 0x1B6B,\n    0x9396, 0x082F, 0x9397, 0x0AFB, 0x939A, 0x0BE6, 0x939B, 0x3B89,\n    0x939E, 0x49AC, 0x93A1, 0x49A6, 0x93A3, 0x4311, 0x93A4, 0x21E6,\n    0x93A7, 0x0599, 0x93A9, 0x3B8B, 0x93AC, 0x1B69, 0x93AD, 0x1B6A,\n    0x93AE, 0x0BDF, 0x93B0, 0x1B68, 0x93B9, 0x1B6C, 0x93BA, 0x3B8A,\n    0x93BB, 0x4DDD, 0x93C1, 0x3B8C, 0x93C3, 0x1B72, 0x93C6, 0x21E7,\n    0x93C7, 0x49B1, 0x93C8, 0x1B75, 0x93CA, 0x3B8D, 0x93CC, 0x4DDE,\n    0x93D0, 0x1B74, 0x93D1, 0x0C27, 0x93D6, 0x1B6D, 0x93D7, 0x1B6E,\n    0x93D8, 0x1B71, 0x93DC, 0x49B2, 0x93DD, 0x1B73, 0x93DE, 0x21E8,\n    0x93DF, 0x4312, 0x93E1, 0x06B8, 0x93E2, 0x3B8E, 0x93E4, 0x1B76,\n    0x93E5, 0x1B70, 0x93E6, 0x4DDF, 0x93E7, 0x49B3, 0x93E8, 0x1B6F,\n    0x93F1, 0x49B0, 0x93F5, 0x49AD, 0x93F8, 0x21E9, 0x93F9, 0x4DE0,\n    0x93FA, 0x3B8F, 0x93FB, 0x49B7, 0x93FD, 0x3B90, 0x9402, 0x4DE1,\n    0x9403, 0x1B7A, 0x9404, 0x4313, 0x9407, 0x1B7B, 0x9409, 0x49B4,\n    0x940D, 0x4DE2, 0x940E, 0x4DE3, 0x940F, 0x3B91, 0x9410, 0x1B7C,\n    0x9413, 0x1B79, 0x9414, 0x1B78, 0x9416, 0x49B5, 0x9417, 0x49B6,\n    0x9418, 0x09CA, 0x9419, 0x0C82, 0x941A, 0x1B77, 0x9421, 0x1B80,\n    0x942B, 0x1B7E, 0x942E, 0x4DE4, 0x9431, 0x21EA, 0x9432, 0x49B8,\n    0x9433, 0x4314, 0x9434, 0x3B92, 0x9435, 0x1B7F, 0x9436, 0x1B7D,\n    0x9438, 0x0B58, 0x943A, 0x1B81, 0x943B, 0x49B9, 0x943F, 0x3B93,\n    0x9441, 0x1B82, 0x9444, 0x1B84, 0x9445, 0x21EB, 0x9448, 0x21EC,\n    0x944A, 0x4315, 0x944C, 0x4DE5, 0x9451, 0x0611, 0x9452, 0x1B83,\n    0x9453, 0x0F06, 0x9455, 0x3B94, 0x945A, 0x1B8F, 0x945B, 0x1B85,\n    0x945E, 0x1B88, 0x9460, 0x1B86, 0x9462, 0x1B87, 0x9463, 0x4316,\n    0x946A, 0x1B89, 0x946B, 0x3B95, 0x946D, 0x49BC, 0x946F, 0x49BD,\n    0x9470, 0x1B8B, 0x9471, 0x4317, 0x9472, 0x3B96, 0x9475, 0x1B8C,\n    0x9477, 0x1B8D, 0x947C, 0x1B90, 0x947D, 0x1B8E, 0x947E, 0x1B91,\n    0x947F, 0x1B93, 0x9481, 0x1B92, 0x9577, 0x0BD5, 0x9578, 0x3B97,\n    0x9579, 0x49BE, 0x9580, 0x0EF3, 0x9582, 0x1B94, 0x9583, 0x0AB0,\n    0x9586, 0x49BF, 0x9587, 0x1B95, 0x9588, 0x4DE6, 0x9589, 0x0E14,\n    0x958A, 0x1B96, 0x958B, 0x0589, 0x958C, 0x49C0, 0x958D, 0x49C1,\n    0x958E, 0x4318, 0x958F, 0x04DE, 0x9591, 0x0613, 0x9592, 0x21ED,\n    0x9593, 0x0612, 0x9594, 0x1B97, 0x9596, 0x1B98, 0x9598, 0x1B99,\n    0x9599, 0x1B9A, 0x959F, 0x4319, 0x95A0, 0x1B9B, 0x95A1, 0x4DE7,\n    0x95A2, 0x0614, 0x95A3, 0x05B3, 0x95A4, 0x07F0, 0x95A5, 0x0D4A,\n    0x95A6, 0x3B98, 0x95A7, 0x1B9D, 0x95A8, 0x1B9C, 0x95A9, 0x3B99,\n    0x95AB, 0x4F59, 0x95AC, 0x431A, 0x95AD, 0x1B9E, 0x95B1, 0x3555,\n    0x95B2, 0x04FE, 0x95B4, 0x3B9B, 0x95B6, 0x431B, 0x95B9, 0x1BA1,\n    0x95BB, 0x1BA0, 0x95BC, 0x1B9F, 0x95BD, 0x3B9C, 0x95BE, 0x1BA2,\n    0x95BF, 0x4DE8, 0x95C3, 0x1BA5, 0x95C6, 0x4DE9, 0x95C7, 0x048B,\n    0x95C8, 0x49C4, 0x95C9, 0x4DEA, 0x95CA, 0x1BA3, 0x95CB, 0x431C,\n    0x95CC, 0x1BA7, 0x95CD, 0x1BA6, 0x95D0, 0x431D, 0x95D1, 0x4DEB,\n    0x95D2, 0x4DEC, 0x95D3, 0x431E, 0x95D4, 0x1BA9, 0x95D5, 0x1BA8,\n    0x95D6, 0x1BAA, 0x95D8, 0x0C86, 0x95DA, 0x3B9D, 0x95DC, 0x1BAB,\n    0x95DE, 0x4320, 0x95E0, 0x4DED, 0x95E1, 0x1BAC, 0x95E2, 0x1BAE,\n    0x95E4, 0x4DEE, 0x95E5, 0x1BAD, 0x95E6, 0x4DEF, 0x961C, 0x0DDE,\n    0x961D, 0x3B9E, 0x9621, 0x1BAF, 0x9624, 0x4DF0, 0x9628, 0x1BB0,\n    0x962A, 0x0855, 0x962C, 0x49C7, 0x962E, 0x1BB1, 0x962F, 0x1BB2,\n    0x9631, 0x4DF1, 0x9632, 0x0E77, 0x9633, 0x49C8, 0x9634, 0x49C9,\n    0x9638, 0x4DF2, 0x963B, 0x0ACD, 0x963C, 0x49CB, 0x963D, 0x4DF3,\n    0x963F, 0x0468, 0x9640, 0x0B2B, 0x9641, 0x3B9F, 0x9642, 0x1BB3,\n    0x9644, 0x0DDF, 0x964B, 0x1BB6, 0x964C, 0x1BB4, 0x964D, 0x07F1,\n    0x964F, 0x1BB5, 0x9650, 0x0776, 0x9654, 0x4DF4, 0x9658, 0x3BA0,\n    0x965B, 0x0E15, 0x965C, 0x1BB8, 0x965D, 0x1BBA, 0x965E, 0x1BB9,\n    0x965F, 0x1BBB, 0x9661, 0x49CC, 0x9662, 0x04C3, 0x9663, 0x0A1E,\n    0x9664, 0x0986, 0x9665, 0x0615, 0x9666, 0x1BBC, 0x966A, 0x0D1C,\n    0x966C, 0x1BBE, 0x9670, 0x04C4, 0x9672, 0x1BBD, 0x9673, 0x0BE0,\n    0x9674, 0x4DF5, 0x9675, 0x0F95, 0x9676, 0x0C83, 0x9677, 0x1BB7,\n    0x9678, 0x0F6E, 0x967A, 0x0765, 0x967B, 0x4DF6, 0x967D, 0x0F45,\n    0x967F, 0x4DF7, 0x9681, 0x4DF8, 0x9682, 0x49CE, 0x9683, 0x4DF9,\n    0x9684, 0x3BA1, 0x9685, 0x06F1, 0x9686, 0x0F7C, 0x9688, 0x06FE,\n    0x9689, 0x4DFA, 0x968A, 0x0B42, 0x968B, 0x186C, 0x968D, 0x1BBF,\n    0x968E, 0x058A, 0x968F, 0x0A35, 0x9694, 0x05B4, 0x9695, 0x1BC1,\n    0x9696, 0x4DFB, 0x9697, 0x1BC2, 0x9698, 0x1BC0, 0x9699, 0x073A,\n    0x969A, 0x49D0, 0x969B, 0x084D, 0x969C, 0x09CB, 0x969D, 0x21F0,\n    0x96A0, 0x04C5, 0x96A3, 0x0FA1, 0x96A4, 0x3BA2, 0x96A5, 0x4321,\n    0x96A7, 0x1BC4, 0x96A8, 0x1B0B, 0x96A9, 0x3BA3, 0x96AA, 0x1BC3,\n    0x96AE, 0x4DFC, 0x96AF, 0x21F1, 0x96B0, 0x1BC7, 0x96B1, 0x1BC5,\n    0x96B2, 0x1BC6, 0x96B3, 0x49D3, 0x96B4, 0x1BC8, 0x96B6, 0x1BC9,\n    0x96B7, 0x0FB4, 0x96B8, 0x1BCA, 0x96B9, 0x1BCB, 0x96BA, 0x49D4,\n    0x96BB, 0x0A6D, 0x96BC, 0x0D4F, 0x96BD, 0x49D5, 0x96C0, 0x0A43,\n    0x96C1, 0x0623, 0x96C4, 0x0F24, 0x96C5, 0x056D, 0x96C6, 0x0942,\n    0x96C7, 0x078F, 0x96C9, 0x1BCE, 0x96CB, 0x1BCD, 0x96CC, 0x08C1,\n    0x96CD, 0x1BCF, 0x96CE, 0x1BCC, 0x96D1, 0x0876, 0x96D2, 0x3BA4,\n    0x96D5, 0x1BD3, 0x96D6, 0x1992, 0x96D8, 0x49D8, 0x96D9, 0x10EB,\n    0x96DA, 0x49D9, 0x96DB, 0x0A3D, 0x96DC, 0x1BD1, 0x96DD, 0x49DA,\n    0x96DE, 0x3BA6, 0x96E2, 0x0F6D, 0x96E3, 0x0CC9, 0x96E8, 0x04CD,\n    0x96E9, 0x3BA7, 0x96EA, 0x0A87, 0x96EB, 0x08E2, 0x96EF, 0x4322,\n    0x96F0, 0x0E07, 0x96F1, 0x3BA8, 0x96F2, 0x04E2, 0x96F6, 0x0FB5,\n    0x96F7, 0x0F55, 0x96F9, 0x1BD4, 0x96FB, 0x0C3F, 0x9700, 0x0927,\n    0x9702, 0x3BA9, 0x9703, 0x4DFD, 0x9704, 0x1BD5, 0x9706, 0x1BD6,\n    0x9707, 0x0A12, 0x9708, 0x1BD7, 0x9709, 0x3BAA, 0x970A, 0x0FB6,\n    0x970D, 0x1BD2, 0x970E, 0x1BD9, 0x970F, 0x1BDB, 0x9711, 0x1BDA,\n    0x9713, 0x1BD8, 0x9714, 0x49DC, 0x9716, 0x1BDC, 0x9719, 0x1BDD,\n    0x971B, 0x4DFE, 0x971C, 0x0AFC, 0x971E, 0x0562, 0x9721, 0x4DFF,\n    0x9722, 0x4E00, 0x9723, 0x49DD, 0x9724, 0x1BDE, 0x9727, 0x0EC4,\n    0x9728, 0x4E01, 0x972A, 0x1BDF, 0x9730, 0x1BE0, 0x9731, 0x4E02,\n    0x9732, 0x0FD0, 0x9733, 0x21F2, 0x9736, 0x49DF, 0x9738, 0x1414,\n    0x9739, 0x1BE1, 0x973B, 0x21F3, 0x973D, 0x1BE2, 0x973E, 0x1BE3,\n    0x9741, 0x49E0, 0x9742, 0x1BE7, 0x9743, 0x21F4, 0x9744, 0x1BE4,\n    0x9746, 0x1BE5, 0x9747, 0x49E1, 0x9748, 0x1BE6, 0x9749, 0x1BE8,\n    0x974D, 0x21F5, 0x974E, 0x4323, 0x974F, 0x21F6, 0x9751, 0x21F7,\n    0x9752, 0x0A68, 0x9755, 0x4F5A, 0x9756, 0x0F03, 0x9757, 0x49E2,\n    0x9759, 0x0A69, 0x975A, 0x3BAB, 0x975B, 0x49E3, 0x975C, 0x1BE9,\n    0x975E, 0x0D87, 0x9760, 0x1BEA, 0x9761, 0x1D06, 0x9762, 0x0ED8,\n    0x9763, 0x3BAC, 0x9764, 0x1BEB, 0x9766, 0x1BEC, 0x9767, 0x4E03,\n    0x9768, 0x1BED, 0x9769, 0x05B5, 0x976A, 0x49E4, 0x976B, 0x1BEF,\n    0x976D, 0x0A1F, 0x976E, 0x3BAD, 0x9771, 0x1BF0, 0x9773, 0x3BAE,\n    0x9774, 0x06FA, 0x9776, 0x4E04, 0x9779, 0x1BF1, 0x977A, 0x1BF5,\n    0x977C, 0x1BF3, 0x977D, 0x4E05, 0x977F, 0x4E06, 0x9781, 0x1BF4,\n    0x9784, 0x05D1, 0x9785, 0x1BF2, 0x9786, 0x1BF6, 0x978B, 0x1BF7,\n    0x978D, 0x048C, 0x978F, 0x1BF8, 0x9790, 0x1BF9, 0x9795, 0x4324,\n    0x9796, 0x49E7, 0x9798, 0x09CC, 0x9799, 0x4E07, 0x979A, 0x3BAF,\n    0x979C, 0x1BFA, 0x979E, 0x49E8, 0x979F, 0x4E08, 0x97A0, 0x0661,\n    0x97A2, 0x3BB0, 0x97A3, 0x1BFD, 0x97A6, 0x1BFC, 0x97A8, 0x1BFB,\n    0x97AB, 0x1A34, 0x97AC, 0x4E09, 0x97AD, 0x0E2C, 0x97AE, 0x4325,\n    0x97B1, 0x49E9, 0x97B2, 0x49EA, 0x97B3, 0x1BFE, 0x97B4, 0x1BFF,\n    0x97B5, 0x3BB1, 0x97B6, 0x3BB2, 0x97B9, 0x4E0A, 0x97BA, 0x4326,\n    0x97BE, 0x49EB, 0x97C1, 0x4327, 0x97C3, 0x1C00, 0x97C6, 0x1C01,\n    0x97C8, 0x1C02, 0x97C9, 0x4328, 0x97CB, 0x1C03, 0x97CC, 0x49EC,\n    0x97CD, 0x4E0B, 0x97D1, 0x49ED, 0x97D3, 0x0616, 0x97D4, 0x49EE,\n    0x97D8, 0x49EF, 0x97D9, 0x3BB3, 0x97DB, 0x4329, 0x97DC, 0x1C04,\n    0x97DE, 0x3BB4, 0x97E0, 0x4E0C, 0x97E1, 0x49F0, 0x97ED, 0x1C05,\n    0x97EE, 0x0CD9, 0x97EF, 0x4E0D, 0x97F1, 0x49F1, 0x97F2, 0x1C07,\n    0x97F3, 0x053B, 0x97F4, 0x3BB5, 0x97F5, 0x1C0A, 0x97F6, 0x1C09,\n    0x97FB, 0x04C6, 0x97FF, 0x06B9, 0x9801, 0x0E17, 0x9802, 0x0BD6,\n    0x9803, 0x0812, 0x9804, 0x49F2, 0x9805, 0x07F2, 0x9806, 0x0971,\n    0x9807, 0x4E0E, 0x9808, 0x0A22, 0x980A, 0x3BB6, 0x980C, 0x1C0C,\n    0x980D, 0x49F3, 0x980E, 0x3BB7, 0x980F, 0x1C0B, 0x9810, 0x0F2C,\n    0x9811, 0x0624, 0x9812, 0x0D66, 0x9813, 0x0CB4, 0x9814, 0x49F4,\n    0x9816, 0x49F5, 0x9817, 0x0A42, 0x9818, 0x0F96, 0x981A, 0x0731,\n    0x981E, 0x3BB8, 0x9821, 0x1C0F, 0x9823, 0x3BB9, 0x9824, 0x1C0E,\n    0x9825, 0x49FA, 0x9826, 0x4E0F, 0x982B, 0x3BBA, 0x982C, 0x0E79,\n    0x982D, 0x0C84, 0x982E, 0x4E10, 0x9830, 0x1E73, 0x9832, 0x49F8,\n    0x9833, 0x49F9, 0x9834, 0x04F2, 0x9837, 0x1C10, 0x9838, 0x1C0D,\n    0x9839, 0x37B3, 0x983B, 0x0DC3, 0x983C, 0x0F54, 0x983D, 0x1C11,\n    0x983E, 0x3BBB, 0x9846, 0x1C12, 0x9847, 0x49FB, 0x984B, 0x1C14,\n    0x984C, 0x0B4A, 0x984D, 0x05B9, 0x984E, 0x05BA, 0x984F, 0x1C13,\n    0x9852, 0x3BBC, 0x9853, 0x3BBD, 0x9854, 0x0625, 0x9855, 0x0766,\n    0x9856, 0x432A, 0x9857, 0x21F9, 0x9858, 0x0626, 0x9859, 0x3BBE,\n    0x985A, 0x1E48, 0x985B, 0x0C39, 0x985E, 0x0FA8, 0x9862, 0x4E11,\n    0x9863, 0x4E12, 0x9865, 0x21FA, 0x9866, 0x49FC, 0x9867, 0x0790,\n    0x986B, 0x1C15, 0x986C, 0x3BBF, 0x986F, 0x1C16, 0x9870, 0x1C17,\n    0x9871, 0x1C18, 0x9873, 0x1C1A, 0x9874, 0x1C19, 0x98A8, 0x0DE9,\n    0x98AA, 0x1C1B, 0x98AB, 0x49FD, 0x98AD, 0x49FE, 0x98AF, 0x1C1C,\n    0x98B0, 0x49FF, 0x98B1, 0x1C1D, 0x98B4, 0x4E13, 0x98B6, 0x1C1E,\n    0x98B7, 0x4A01, 0x98B8, 0x3BC0, 0x98BA, 0x3BC1, 0x98BB, 0x4A02,\n    0x98BC, 0x4A03, 0x98BF, 0x3BC2, 0x98C2, 0x4A04, 0x98C3, 0x1C20,\n    0x98C4, 0x1C1F, 0x98C5, 0x4E14, 0x98C6, 0x1C21, 0x98C7, 0x4A05,\n    0x98C8, 0x3BC3, 0x98CB, 0x4A06, 0x98DB, 0x0D88, 0x98DC, 0x1839,\n    0x98DF, 0x09EF, 0x98E0, 0x3618, 0x98E1, 0x4A07, 0x98E2, 0x064C,\n    0x98E3, 0x4A08, 0x98E5, 0x3BC4, 0x98E7, 0x432B, 0x98E9, 0x1C22,\n    0x98EA, 0x4A09, 0x98EB, 0x1C23, 0x98ED, 0x10C1, 0x98EE, 0x14DA,\n    0x98EF, 0x0D67, 0x98F0, 0x4A0A, 0x98F1, 0x4A0B, 0x98F2, 0x04BF,\n    0x98F3, 0x4A0C, 0x98F4, 0x047F, 0x98FC, 0x08C2, 0x98FD, 0x0E5E,\n    0x98FE, 0x09E6, 0x9902, 0x4E15, 0x9903, 0x1C24, 0x9905, 0x0EEB,\n    0x9908, 0x4A0D, 0x9909, 0x1C25, 0x990A, 0x0F46, 0x990C, 0x04E4,\n    0x9910, 0x088F, 0x9911, 0x4E16, 0x9912, 0x1C26, 0x9913, 0x056E,\n    0x9914, 0x1C27, 0x9915, 0x4E17, 0x9916, 0x4A10, 0x9917, 0x4A11,\n    0x9918, 0x1C28, 0x991A, 0x4A13, 0x991B, 0x4A14, 0x991C, 0x4A15,\n    0x991D, 0x1C2A, 0x991E, 0x1C2B, 0x9920, 0x1C2D, 0x9921, 0x1C29,\n    0x9924, 0x1C2C, 0x9927, 0x21FD, 0x9928, 0x0617, 0x992C, 0x1C2E,\n    0x992E, 0x1C2F, 0x9931, 0x4A17, 0x9932, 0x3BC5, 0x9933, 0x3BC6,\n    0x9935, 0x4E18, 0x993A, 0x4A18, 0x993B, 0x4A19, 0x993C, 0x4A1A,\n    0x993D, 0x1C30, 0x993E, 0x1C31, 0x9940, 0x3BC7, 0x9941, 0x4A1B,\n    0x9942, 0x1C32, 0x9945, 0x1C34, 0x9946, 0x4A1C, 0x9948, 0x4E19,\n    0x9949, 0x1C33, 0x994B, 0x1C36, 0x994C, 0x1C39, 0x994D, 0x3BC8,\n    0x994E, 0x4A1D, 0x9950, 0x1C35, 0x9951, 0x1C37, 0x9952, 0x1C38,\n    0x9954, 0x4E1A, 0x9955, 0x1C3A, 0x9957, 0x06BA, 0x9958, 0x432C,\n    0x995C, 0x3BC9, 0x995E, 0x4E1B, 0x995F, 0x3BCA, 0x9960, 0x4A1E,\n    0x9996, 0x091F, 0x9997, 0x1C3B, 0x9998, 0x1C3C, 0x9999, 0x07F3,\n    0x999E, 0x21FF, 0x99A3, 0x4A1F, 0x99A5, 0x1C3D, 0x99A6, 0x4A20,\n    0x99A8, 0x059C, 0x99AC, 0x0D05, 0x99AD, 0x1C3E, 0x99AE, 0x1C3F,\n    0x99B1, 0x3BCB, 0x99B3, 0x0B98, 0x99B4, 0x0CC3, 0x99B9, 0x3BCC,\n    0x99BA, 0x3BCD, 0x99BC, 0x1C40, 0x99BD, 0x4A21, 0x99BF, 0x4A22,\n    0x99C1, 0x0D33, 0x99C3, 0x4A23, 0x99C4, 0x0B2C, 0x99C5, 0x04FA,\n    0x99C6, 0x06E6, 0x99C8, 0x06E7, 0x99C9, 0x3BCE, 0x99D0, 0x0BB1,\n    0x99D1, 0x1C45, 0x99D2, 0x06E8, 0x99D4, 0x4A24, 0x99D5, 0x056F,\n    0x99D8, 0x1C44, 0x99D9, 0x4A25, 0x99DB, 0x1C42, 0x99DD, 0x1C43,\n    0x99DE, 0x4A26, 0x99DF, 0x1C41, 0x99E1, 0x4E1C, 0x99E2, 0x1C4F,\n    0x99ED, 0x1C46, 0x99EE, 0x1C47, 0x99F0, 0x4A28, 0x99F1, 0x1C48,\n    0x99F2, 0x1C49, 0x99F8, 0x1C4B, 0x99F9, 0x4A29, 0x99FB, 0x1C4A,\n    0x99FC, 0x4A2A, 0x99FF, 0x0963, 0x9A01, 0x1C4C, 0x9A02, 0x3BCF,\n    0x9A03, 0x432D, 0x9A05, 0x1C4E, 0x9A08, 0x37BA, 0x9A0A, 0x4A2B,\n    0x9A0C, 0x4E1D, 0x9A0E, 0x064D, 0x9A0F, 0x1C4D, 0x9A10, 0x4E1E,\n    0x9A11, 0x4A2C, 0x9A12, 0x0AFD, 0x9A13, 0x0767, 0x9A16, 0x3BD0,\n    0x9A19, 0x1C50, 0x9A1A, 0x4A2D, 0x9A20, 0x4A2E, 0x9A23, 0x4E1F,\n    0x9A24, 0x3BD1, 0x9A27, 0x3BD2, 0x9A28, 0x0B2D, 0x9A2B, 0x1C51,\n    0x9A2D, 0x3BD3, 0x9A2E, 0x3BD4, 0x9A30, 0x0C85, 0x9A31, 0x4A2F,\n    0x9A36, 0x3BD5, 0x9A37, 0x1C52, 0x9A38, 0x3BD6, 0x9A3E, 0x1C57,\n    0x9A40, 0x1C55, 0x9A41, 0x4E20, 0x9A42, 0x1C54, 0x9A43, 0x1C56,\n    0x9A44, 0x4A30, 0x9A45, 0x1C53, 0x9A4A, 0x3BD7, 0x9A4C, 0x4A31,\n    0x9A4D, 0x1C59, 0x9A4E, 0x2200, 0x9A51, 0x4E21, 0x9A52, 0x1E2F,\n    0x9A55, 0x1C58, 0x9A56, 0x3BD8, 0x9A57, 0x1C5B, 0x9A58, 0x4A32,\n    0x9A5A, 0x06BB, 0x9A5B, 0x1C5A, 0x9A5F, 0x1C5C, 0x9A62, 0x1C5D,\n    0x9A64, 0x1C5F, 0x9A65, 0x1C5E, 0x9A69, 0x1C60, 0x9A6A, 0x1C62,\n    0x9A6B, 0x1C61, 0x9AA8, 0x080E, 0x9AAD, 0x1C63, 0x9AAF, 0x4A34,\n    0x9AB0, 0x1C64, 0x9AB5, 0x3BD9, 0x9AB6, 0x3BDA, 0x9AB7, 0x4A36,\n    0x9AB8, 0x059A, 0x9AB9, 0x4A38, 0x9ABC, 0x1C65, 0x9ABD, 0x4E22,\n    0x9ABE, 0x4E23, 0x9AC0, 0x1C66, 0x9AC1, 0x432E, 0x9AC3, 0x432F,\n    0x9AC4, 0x0A37, 0x9AC6, 0x4A3A, 0x9ACE, 0x4330, 0x9ACF, 0x1C67,\n    0x9AD0, 0x4A3B, 0x9AD1, 0x1C68, 0x9AD2, 0x4A3C, 0x9AD3, 0x1C69,\n    0x9AD4, 0x1C6A, 0x9AD5, 0x4A3D, 0x9AD6, 0x4331, 0x9AD8, 0x07F4,\n    0x9AD9, 0x2201, 0x9ADC, 0x2202, 0x9ADE, 0x1C6B, 0x9ADF, 0x1C6C,\n    0x9AE0, 0x4A3E, 0x9AE2, 0x1C6D, 0x9AE3, 0x1C6E, 0x9AE5, 0x4A3F,\n    0x9AE6, 0x1C6F, 0x9AE9, 0x4A40, 0x9AEA, 0x0D45, 0x9AEB, 0x1C71,\n    0x9AED, 0x0D98, 0x9AEE, 0x1C72, 0x9AEF, 0x1C70, 0x9AF1, 0x1C74,\n    0x9AF4, 0x1C73, 0x9AF7, 0x1C75, 0x9AF9, 0x3BDB, 0x9AFB, 0x1C76,\n    0x9B01, 0x4E24, 0x9B02, 0x4332, 0x9B03, 0x3BDC, 0x9B06, 0x1C77,\n    0x9B08, 0x4333, 0x9B09, 0x4E25, 0x9B0B, 0x4E26, 0x9B0C, 0x4A41,\n    0x9B0D, 0x4E27, 0x9B0E, 0x4E28, 0x9B10, 0x4A42, 0x9B12, 0x4A43,\n    0x9B16, 0x4A44, 0x9B18, 0x1C78, 0x9B19, 0x4E29, 0x9B1A, 0x1C79,\n    0x9B1C, 0x4A45, 0x9B1D, 0x4F49, 0x9B1F, 0x1C7A, 0x9B20, 0x3BDD,\n    0x9B22, 0x1C7B, 0x9B23, 0x1C7C, 0x9B25, 0x1C7D, 0x9B27, 0x1C7E,\n    0x9B28, 0x1C7F, 0x9B29, 0x1C80, 0x9B2A, 0x1C81, 0x9B2B, 0x4A46,\n    0x9B2C, 0x4F4A, 0x9B2D, 0x4335, 0x9B2E, 0x1C82, 0x9B2F, 0x1C83,\n    0x9B31, 0x14D4, 0x9B32, 0x1C84, 0x9B33, 0x3BDE, 0x9B34, 0x3BDF,\n    0x9B35, 0x4E2A, 0x9B3B, 0x17A9, 0x9B3C, 0x064E, 0x9B3D, 0x4A47,\n    0x9B41, 0x057F, 0x9B42, 0x0822, 0x9B43, 0x1C86, 0x9B44, 0x1C85,\n    0x9B45, 0x0EB1, 0x9B48, 0x4E2B, 0x9B4B, 0x4A49, 0x9B4D, 0x1C88,\n    0x9B4E, 0x1C89, 0x9B4F, 0x1C87, 0x9B51, 0x1C8A, 0x9B54, 0x0E90,\n    0x9B55, 0x4E2C, 0x9B58, 0x1C8B, 0x9B5A, 0x0695, 0x9B5E, 0x4336,\n    0x9B63, 0x4A4A, 0x9B65, 0x4A4B, 0x9B66, 0x4337, 0x9B68, 0x4E2D,\n    0x9B6B, 0x4A4C, 0x9B6C, 0x4A4D, 0x9B6F, 0x0FCB, 0x9B72, 0x2204,\n    0x9B73, 0x3BE0, 0x9B74, 0x1C8C, 0x9B75, 0x2203, 0x9B76, 0x4A4E,\n    0x9B77, 0x4A4F, 0x9B79, 0x3BE1, 0x9B80, 0x4E2E, 0x9B83, 0x1C8E,\n    0x9B84, 0x4338, 0x9B86, 0x4E2F, 0x9B8A, 0x4339, 0x9B8E, 0x0482,\n    0x9B8F, 0x2205, 0x9B90, 0x4E30, 0x9B91, 0x1C8F, 0x9B92, 0x0DFB,\n    0x9B93, 0x1C8D, 0x9B96, 0x1C90, 0x9B97, 0x1C91, 0x9B9D, 0x4E31,\n    0x9B9E, 0x433A, 0x9B9F, 0x1C92, 0x9BA0, 0x1C93, 0x9BA6, 0x4A50,\n    0x9BA7, 0x3BE2, 0x9BA8, 0x1C94, 0x9BAA, 0x0E9C, 0x9BAB, 0x087B,\n    0x9BAC, 0x4A51, 0x9BAD, 0x086A, 0x9BAE, 0x0AB1, 0x9BB0, 0x4E32,\n    0x9BB1, 0x2206, 0x9BB2, 0x4A53, 0x9BB4, 0x1C95, 0x9BB8, 0x4A54,\n    0x9BB9, 0x1C98, 0x9BBB, 0x2207, 0x9BBE, 0x4A55, 0x9BBF, 0x4E33,\n    0x9BC0, 0x1C96, 0x9BC1, 0x3BE3, 0x9BC6, 0x1C99, 0x9BC7, 0x3BE4,\n    0x9BC8, 0x4E34, 0x9BC9, 0x07A5, 0x9BCA, 0x1C97, 0x9BCE, 0x433B,\n    0x9BCF, 0x1C9A, 0x9BD1, 0x1C9B, 0x9BD2, 0x1C9C, 0x9BD4, 0x1CA0,\n    0x9BD6, 0x0878, 0x9BD7, 0x3BE5, 0x9BD8, 0x4A57, 0x9BDB, 0x0B44,\n    0x9BDD, 0x4A58, 0x9BDF, 0x37BF, 0x9BE1, 0x1CA1, 0x9BE2, 0x1C9E,\n    0x9BE3, 0x1C9D, 0x9BE4, 0x1C9F, 0x9BE5, 0x433C, 0x9BE7, 0x3BE6,\n    0x9BE8, 0x0735, 0x9BEA, 0x4A59, 0x9BEB, 0x3BE7, 0x9BEE, 0x4A5B,\n    0x9BEF, 0x4A5A, 0x9BF0, 0x1CA5, 0x9BF1, 0x1CA4, 0x9BF2, 0x1CA3,\n    0x9BF3, 0x4A56, 0x9BF5, 0x0477, 0x9BF7, 0x3BE8, 0x9BF8, 0x433D,\n    0x9BFA, 0x3BE9, 0x9BFD, 0x3BEA, 0x9BFF, 0x4E35, 0x9C00, 0x2208,\n    0x9C02, 0x4E36, 0x9C04, 0x1CAF, 0x9C06, 0x1CAB, 0x9C08, 0x1CAC,\n    0x9C09, 0x1CA8, 0x9C0A, 0x1CAE, 0x9C0B, 0x3BEB, 0x9C0C, 0x1CAA,\n    0x9C0D, 0x05C0, 0x9C10, 0x0FF2, 0x9C12, 0x1CAD, 0x9C13, 0x1CA9,\n    0x9C14, 0x1CA7, 0x9C15, 0x1CA6, 0x9C16, 0x4A5F, 0x9C18, 0x4A60,\n    0x9C19, 0x4A61, 0x9C1A, 0x4A62, 0x9C1B, 0x1CB1, 0x9C1C, 0x4E37,\n    0x9C1D, 0x4A63, 0x9C21, 0x1CB4, 0x9C22, 0x4A64, 0x9C23, 0x433E,\n    0x9C24, 0x1CB3, 0x9C25, 0x1CB2, 0x9C27, 0x3BEC, 0x9C29, 0x4A65,\n    0x9C2A, 0x3BED, 0x9C2D, 0x0DBB, 0x9C2E, 0x1CB0, 0x9C2F, 0x04B7,\n    0x9C30, 0x1CB5, 0x9C31, 0x4A67, 0x9C32, 0x1CB7, 0x9C35, 0x4E38,\n    0x9C36, 0x3BEE, 0x9C37, 0x4A68, 0x9C39, 0x05CD, 0x9C3A, 0x1CA2,\n    0x9C3B, 0x04D9, 0x9C3E, 0x1CB9, 0x9C41, 0x3BEF, 0x9C44, 0x4E39,\n    0x9C45, 0x4A69, 0x9C46, 0x1CB8, 0x9C47, 0x1CB6, 0x9C48, 0x0B6B,\n    0x9C49, 0x4A6C, 0x9C4A, 0x4A6D, 0x9C4F, 0x433F, 0x9C50, 0x4340,\n    0x9C52, 0x0E9E, 0x9C53, 0x3BF0, 0x9C54, 0x4A6F, 0x9C56, 0x4E3A,\n    0x9C57, 0x0FA2, 0x9C58, 0x4A70, 0x9C5A, 0x1CBA, 0x9C5B, 0x4A71,\n    0x9C5C, 0x4A6A, 0x9C5D, 0x4A72, 0x9C5F, 0x4A73, 0x9C60, 0x1CBB,\n    0x9C61, 0x4E3B, 0x9C63, 0x3BF1, 0x9C65, 0x4341, 0x9C67, 0x1CBC,\n    0x9C68, 0x4E3C, 0x9C69, 0x4A74, 0x9C6A, 0x4A75, 0x9C6B, 0x4A76,\n    0x9C6D, 0x4A77, 0x9C6E, 0x4A78, 0x9C70, 0x3BF2, 0x9C72, 0x4A79,\n    0x9C75, 0x4A7A, 0x9C76, 0x1CBD, 0x9C77, 0x3BF3, 0x9C78, 0x1CBE,\n    0x9C7A, 0x4A7B, 0x9CE5, 0x0BD7, 0x9CE6, 0x4A7C, 0x9CE7, 0x1CBF,\n    0x9CE9, 0x0D4B, 0x9CEB, 0x1CC4, 0x9CEC, 0x1CC0, 0x9CF0, 0x1CC1,\n    0x9CF2, 0x4A7D, 0x9CF3, 0x0E5F, 0x9CF4, 0x0ED0, 0x9CF6, 0x0CA8,\n    0x9D02, 0x3BF4, 0x9D03, 0x1CC5, 0x9D06, 0x1CC6, 0x9D07, 0x0C96,\n    0x9D08, 0x1CC3, 0x9D09, 0x1CC2, 0x9D0B, 0x4A7E, 0x9D0E, 0x052A,\n    0x9D11, 0x4A80, 0x9D12, 0x1CCE, 0x9D15, 0x1CCD, 0x9D17, 0x4A81,\n    0x9D18, 0x4A82, 0x9D1B, 0x0517, 0x9D1D, 0x4342, 0x9D1E, 0x4343,\n    0x9D1F, 0x1CCB, 0x9D23, 0x1CCA, 0x9D26, 0x1CC8, 0x9D28, 0x05D9,\n    0x9D2A, 0x1CC7, 0x9D2B, 0x08DE, 0x9D2C, 0x0529, 0x9D30, 0x4E3D,\n    0x9D32, 0x4A86, 0x9D3B, 0x07F5, 0x9D3D, 0x4E3E, 0x9D3E, 0x1CD1,\n    0x9D3F, 0x1CD0, 0x9D41, 0x1CCF, 0x9D42, 0x3BF5, 0x9D43, 0x4344,\n    0x9D44, 0x1CCC, 0x9D46, 0x1CD2, 0x9D47, 0x3BF6, 0x9D48, 0x1CD3,\n    0x9D4A, 0x4A88, 0x9D50, 0x1CD8, 0x9D51, 0x1CD7, 0x9D52, 0x4345,\n    0x9D59, 0x1CD9, 0x9D5C, 0x04CF, 0x9D5D, 0x1CD4, 0x9D5E, 0x1CD5,\n    0x9D5F, 0x4A89, 0x9D60, 0x0806, 0x9D61, 0x0EC5, 0x9D62, 0x4A8A,\n    0x9D63, 0x3BF7, 0x9D64, 0x1CD6, 0x9D69, 0x3BF8, 0x9D6A, 0x4E3F,\n    0x9D6B, 0x220A, 0x9D6C, 0x0E60, 0x9D6F, 0x1CDE, 0x9D70, 0x2209,\n    0x9D72, 0x1CDA, 0x9D73, 0x4A8D, 0x9D76, 0x4A8E, 0x9D77, 0x4A8F,\n    0x9D7A, 0x1CDF, 0x9D7B, 0x4E40, 0x9D7C, 0x3BF9, 0x9D7E, 0x3BFA,\n    0x9D84, 0x4A90, 0x9D87, 0x1CDC, 0x9D89, 0x1CDB, 0x9D8A, 0x4346,\n    0x9D8D, 0x3BFB, 0x9D8F, 0x0732, 0x9D96, 0x4347, 0x9D99, 0x4A91,\n    0x9D9A, 0x1CE0, 0x9DA1, 0x4A92, 0x9DA4, 0x1CE1, 0x9DA9, 0x1CE2,\n    0x9DAB, 0x1CDD, 0x9DAC, 0x4349, 0x9DAF, 0x1CC9, 0x9DB1, 0x3BFC,\n    0x9DB2, 0x1CE3, 0x9DB4, 0x0BFD, 0x9DB5, 0x4A94, 0x9DB8, 0x1CE7,\n    0x9DB9, 0x4A95, 0x9DBA, 0x1CE8, 0x9DBB, 0x1CE6, 0x9DBC, 0x434A,\n    0x9DBD, 0x4A96, 0x9DBF, 0x4A93, 0x9DC0, 0x4348, 0x9DC1, 0x1CE5,\n    0x9DC2, 0x1CEB, 0x9DC3, 0x3BFD, 0x9DC4, 0x1CE4, 0x9DC6, 0x1CE9,\n    0x9DC7, 0x3BFE, 0x9DC9, 0x4A97, 0x9DCF, 0x1CEA, 0x9DD3, 0x1CED,\n    0x9DD6, 0x3BFF, 0x9DD7, 0x1DDE, 0x9DD9, 0x1CEC, 0x9DDA, 0x4A98,\n    0x9DDF, 0x3C00, 0x9DE0, 0x4A99, 0x9DE3, 0x4A9A, 0x9DE5, 0x4E41,\n    0x9DE6, 0x1CEF, 0x9DE7, 0x434C, 0x9DE9, 0x4E42, 0x9DEB, 0x3C01,\n    0x9DED, 0x1CF0, 0x9DEF, 0x1CF1, 0x9DF2, 0x0FEF, 0x9DF3, 0x4E43,\n    0x9DF4, 0x3C02, 0x9DF8, 0x1CEE, 0x9DF9, 0x0B4B, 0x9DFA, 0x085D,\n    0x9DFD, 0x1CF2, 0x9E02, 0x4A9D, 0x9E07, 0x434D, 0x9E0A, 0x4A9C,\n    0x9E0D, 0x4A9E, 0x9E15, 0x3C03, 0x9E19, 0x220C, 0x9E1A, 0x1CF3,\n    0x9E1B, 0x1CF4, 0x9E1C, 0x4A9F, 0x9E1D, 0x3C04, 0x9E1E, 0x1CF5,\n    0x9E75, 0x1CF6, 0x9E78, 0x0768, 0x9E79, 0x1CF7, 0x9E7A, 0x4E44,\n    0x9E7B, 0x4AA0, 0x9E7C, 0x1DFD, 0x9E7D, 0x1CF8, 0x9E7F, 0x08DB,\n    0x9E80, 0x4AA2, 0x9E81, 0x1CF9, 0x9E82, 0x4E45, 0x9E83, 0x4E46,\n    0x9E84, 0x4E47, 0x9E85, 0x4AA3, 0x9E88, 0x1CFA, 0x9E8B, 0x1CFB,\n    0x9E8C, 0x1CFC, 0x9E91, 0x1CFF, 0x9E92, 0x1CFD, 0x9E93, 0x0FE2,\n    0x9E95, 0x1CFE, 0x9E97, 0x0FB7, 0x9E9B, 0x4AA4, 0x9E9D, 0x1D00,\n    0x9E9E, 0x434E, 0x9E9F, 0x0FA3, 0x9EA4, 0x3C05, 0x9EA5, 0x1D01,\n    0x9EA6, 0x0D34, 0x9EA8, 0x3C06, 0x9EA9, 0x1D02, 0x9EAA, 0x1D04,\n    0x9EAC, 0x3C07, 0x9EAD, 0x1D05, 0x9EAF, 0x434F, 0x9EB0, 0x4E48,\n    0x9EB4, 0x1E02, 0x9EB5, 0x1E75, 0x9EB8, 0x1D03, 0x9EB9, 0x07FF,\n    0x9EBA, 0x0ED9, 0x9EBB, 0x0E91, 0x9EBC, 0x1284, 0x9EBD, 0x4AA6,\n    0x9EBE, 0x14FF, 0x9EBF, 0x0EA9, 0x9EC3, 0x340B, 0x9EC4, 0x052B,\n    0x9ECC, 0x1D07, 0x9ECD, 0x066A, 0x9ECE, 0x1D08, 0x9ECF, 0x1D09,\n    0x9ED0, 0x1D0A, 0x9ED1, 0x220D, 0x9ED2, 0x0807, 0x9ED4, 0x1D0B,\n    0x9ED8, 0x160D, 0x9ED9, 0x0EE7, 0x9EDB, 0x0B43, 0x9EDC, 0x1D0C,\n    0x9EDD, 0x1D0E, 0x9EDE, 0x1D0D, 0x9EDF, 0x4AA8, 0x9EE0, 0x1D0F,\n    0x9EE4, 0x4E49, 0x9EE5, 0x1D10, 0x9EE7, 0x3C08, 0x9EE8, 0x1D11,\n    0x9EEE, 0x3C09, 0x9EEF, 0x1D12, 0x9EF0, 0x4E4A, 0x9EF2, 0x4E4B,\n    0x9EF4, 0x1D13, 0x9EF6, 0x1D14, 0x9EF7, 0x1D15, 0x9EF9, 0x1D16,\n    0x9EFB, 0x1D17, 0x9EFC, 0x1D18, 0x9EFD, 0x1D19, 0x9EFF, 0x4AA9,\n    0x9F02, 0x4AAA, 0x9F03, 0x4AAC, 0x9F07, 0x1D1A, 0x9F08, 0x1D1B,\n    0x9F09, 0x4E4C, 0x9F0E, 0x0C1E, 0x9F0F, 0x4E4D, 0x9F10, 0x3C0A,\n    0x9F12, 0x3C0B, 0x9F13, 0x0791, 0x9F14, 0x4E4E, 0x9F15, 0x1D1D,\n    0x9F17, 0x3C0C, 0x9F19, 0x3C0D, 0x9F1B, 0x4E4F, 0x9F20, 0x0ACF,\n    0x9F21, 0x1D1E, 0x9F22, 0x4E50, 0x9F26, 0x4E51, 0x9F2A, 0x4E52,\n    0x9F2B, 0x4E53, 0x9F2C, 0x1D1F, 0x9F2F, 0x3C0E, 0x9F34, 0x4E54,\n    0x9F37, 0x3C0F, 0x9F39, 0x3C10, 0x9F3A, 0x4AAD, 0x9F3B, 0x0D93,\n    0x9F3D, 0x4AAE, 0x9F3E, 0x1D20, 0x9F41, 0x3C11, 0x9F45, 0x3C12,\n    0x9F46, 0x4AAF, 0x9F4A, 0x1D21, 0x9F4B, 0x170A, 0x9F4E, 0x1A7B,\n    0x9F4F, 0x1C06, 0x9F52, 0x1D22, 0x9F53, 0x4AB0, 0x9F54, 0x1D23,\n    0x9F55, 0x4AB1, 0x9F57, 0x3C13, 0x9F58, 0x4AB2, 0x9F5A, 0x4E55,\n    0x9F5D, 0x4AB4, 0x9F5F, 0x1D25, 0x9F60, 0x1D26, 0x9F61, 0x1D27,\n    0x9F62, 0x0FB8, 0x9F63, 0x1D24, 0x9F66, 0x1D28, 0x9F67, 0x1D29,\n    0x9F68, 0x3C14, 0x9F69, 0x4AB6, 0x9F6A, 0x1D2B, 0x9F6C, 0x1D2A,\n    0x9F6D, 0x4AB7, 0x9F6F, 0x4E56, 0x9F70, 0x4AB8, 0x9F71, 0x3C15,\n    0x9F72, 0x1D2D, 0x9F75, 0x3C16, 0x9F76, 0x1D2E, 0x9F77, 0x1D2C,\n    0x9F8D, 0x0F7E, 0x9F90, 0x3C17, 0x9F94, 0x3C18, 0x9F95, 0x1D2F,\n    0x9F97, 0x4350, 0x9F9C, 0x1D30, 0x9F9D, 0x1727, 0x9F9E, 0x4E57,\n    0x9FA0, 0x1D31, 0x9FA2, 0x3C19, 0x9FA5, 0x4E58, 0xF860, 0x3C54,\n    0xF861, 0x3C55, 0xF862, 0x3C56, 0xF87A, 0x3C57, 0xF87F, 0x3C58,\n    0xF909, 0x35AB, 0xF91D, 0x3450, 0xF91F, 0x3704, 0xF928, 0x4F4F,\n    0xF929, 0x4F51, 0xF936, 0x3452, 0xF95F, 0x3693, 0xF970, 0x3420,\n    0xF983, 0x3708, 0xF992, 0x1E81, 0xF993, 0x1E82, 0xF999, 0x1E83,\n    0xF99A, 0x3711, 0xF9A2, 0x370F, 0xF9C3, 0x1E80, 0xF9D0, 0x3454,\n    0xF9DC, 0x3451, 0xF9EC, 0x1E46, 0xFA03, 0x3684, 0xFA0E, 0x20DA,\n    0xFA0F, 0x20E5, 0xFA10, 0x1E42, 0xFA11, 0x37D2, 0xFA12, 0x2121,\n    0xFA13, 0x2131, 0xFA14, 0x2133, 0xFA15, 0x4F53, 0xFA16, 0x2164,\n    0xFA17, 0x217B, 0xFA18, 0x2183, 0xFA19, 0x2184, 0xFA1A, 0x2185,\n    0xFA1B, 0x2187, 0xFA1C, 0x218B, 0xFA1D, 0x218E, 0xFA1E, 0x2197,\n    0xFA1F, 0x21A2, 0xFA20, 0x21A4, 0xFA21, 0x21A5, 0xFA22, 0x21AE,\n    0xFA23, 0x21B6, 0xFA24, 0x4948, 0xFA25, 0x21B9, 0xFA26, 0x21BC,\n    0xFA27, 0x21D8, 0xFA28, 0x21DF, 0xFA29, 0x21EF, 0xFA2A, 0x21FB,\n    0xFA2B, 0x21FC, 0xFA2C, 0x21FE, 0xFA2D, 0x220B, 0xFA30, 0x3446,\n    0xFA31, 0x3430, 0xFA32, 0x344D, 0xFA33, 0x3449, 0xFA34, 0x341A,\n    0xFA35, 0x3442, 0xFA36, 0x1DE3, 0xFA37, 0x3436, 0xFA38, 0x3415,\n    0xFA39, 0x3448, 0xFA3A, 0x344B, 0xFA3B, 0x3431, 0xFA3C, 0x41C5,\n    0xFA3D, 0x340E, 0xFA3E, 0x3410, 0xFA3F, 0x3433, 0xFA40, 0x3439,\n    0xFA41, 0x3445, 0xFA42, 0x3416, 0xFA43, 0x3428, 0xFA44, 0x343F,\n    0xFA45, 0x340F, 0xFA46, 0x1E14, 0xFA47, 0x3414, 0xFA48, 0x3423,\n    0xFA49, 0x3C26, 0xFA4A, 0x1E34, 0xFA4B, 0x3443, 0xFA4C, 0x3424,\n    0xFA4D, 0x3421, 0xFA4E, 0x3417, 0xFA4F, 0x344F, 0xFA50, 0x342F,\n    0xFA51, 0x3427, 0xFA52, 0x340D, 0xFA53, 0x343B, 0xFA54, 0x341F,\n    0xFA55, 0x343D, 0xFA56, 0x342E, 0xFA57, 0x3457, 0xFA58, 0x47BE,\n    0xFA59, 0x3440, 0xFA5A, 0x3429, 0xFA5B, 0x3425, 0xFA5C, 0x3426,\n    0xFA5D, 0x3777, 0xFA5E, 0x3776, 0xFA5F, 0x3437, 0xFA60, 0x3413,\n    0xFA61, 0x3422, 0xFA62, 0x3409, 0xFA63, 0x341B, 0xFA64, 0x3444,\n    0xFA65, 0x3434, 0xFA66, 0x3C2B, 0xFA67, 0x3408, 0xFA68, 0x343E,\n    0xFA69, 0x3419, 0xFA6A, 0x1E6C, 0xFB00, 0x248E, 0xFB01, 0x0070,\n    0xFB02, 0x0071, 0xFB03, 0x248F, 0xFB04, 0x2490, 0xFE30, 0x1EDA,\n    0xFE31, 0x1ED4, 0xFE32, 0x1ED5, 0xFE33, 0x1ED2, 0xFE35, 0x1EDB,\n    0xFE36, 0x1EDC, 0xFE37, 0x1EE1, 0xFE38, 0x1EE2, 0xFE39, 0x1EDD,\n    0xFE3A, 0x1EDE, 0xFE3B, 0x1EEB, 0xFE3C, 0x1EEC, 0xFE3D, 0x1EE5,\n    0xFE3E, 0x1EE6, 0xFE3F, 0x1EE3, 0xFE40, 0x1EE4, 0xFE41, 0x1EE7,\n    0xFE42, 0x1EE8, 0xFE43, 0x1EE9, 0xFE44, 0x1EEA, 0xFE45, 0x315F,\n    0xFE46, 0x3160, 0xFE47, 0x1EDF, 0xFE48, 0x1EE0, 0xFF01, 0x0282,\n    0xFF02, 0x1F47, 0xFF03, 0x02CC, 0xFF04, 0x02C8, 0xFF05, 0x02CB,\n    0xFF06, 0x02CD, 0xFF07, 0x1F46, 0xFF08, 0x02A2, 0xFF09, 0x02A3,\n    0xFF0A, 0x02CE, 0xFF0B, 0x02B4, 0xFF0C, 0x027C, 0xFF0D, 0x02B5,\n    0xFF0E, 0x027D, 0xFF0F, 0x0297, 0xFF10, 0x030C, 0xFF11, 0x030D,\n    0xFF12, 0x030E, 0xFF13, 0x030F, 0xFF14, 0x0310, 0xFF15, 0x0311,\n    0xFF16, 0x0312, 0xFF17, 0x0313, 0xFF18, 0x0314, 0xFF19, 0x0315,\n    0xFF1A, 0x027F, 0xFF1B, 0x0280, 0xFF1C, 0x02BB, 0xFF1D, 0x02B9,\n    0xFF1E, 0x02BC, 0xFF1F, 0x0281, 0xFF20, 0x02CF, 0xFF21, 0x0316,\n    0xFF22, 0x0317, 0xFF23, 0x0318, 0xFF24, 0x0319, 0xFF25, 0x031A,\n    0xFF26, 0x031B, 0xFF27, 0x031C, 0xFF28, 0x031D, 0xFF29, 0x031E,\n    0xFF2A, 0x031F, 0xFF2B, 0x0320, 0xFF2C, 0x0321, 0xFF2D, 0x0322,\n    0xFF2E, 0x0323, 0xFF2F, 0x0324, 0xFF30, 0x0325, 0xFF31, 0x0326,\n    0xFF32, 0x0327, 0xFF33, 0x0328, 0xFF34, 0x0329, 0xFF35, 0x032A,\n    0xFF36, 0x032B, 0xFF37, 0x032C, 0xFF38, 0x032D, 0xFF39, 0x032E,\n    0xFF3A, 0x032F, 0xFF3B, 0x02A6, 0xFF3C, 0x0298, 0xFF3D, 0x02A7,\n    0xFF3E, 0x0288, 0xFF3F, 0x028A, 0xFF40, 0x0286, 0xFF41, 0x0330,\n    0xFF42, 0x0331, 0xFF43, 0x0332, 0xFF44, 0x0333, 0xFF45, 0x0334,\n    0xFF46, 0x0335, 0xFF47, 0x0336, 0xFF48, 0x0337, 0xFF49, 0x0338,\n    0xFF4A, 0x0339, 0xFF4B, 0x033A, 0xFF4C, 0x033B, 0xFF4D, 0x033C,\n    0xFF4E, 0x033D, 0xFF4F, 0x033E, 0xFF50, 0x033F, 0xFF51, 0x0340,\n    0xFF52, 0x0341, 0xFF53, 0x0342, 0xFF54, 0x0343, 0xFF55, 0x0344,\n    0xFF56, 0x0345, 0xFF57, 0x0346, 0xFF58, 0x0347, 0xFF59, 0x0348,\n    0xFF5A, 0x0349, 0xFF5B, 0x02A8, 0xFF5C, 0x029B, 0xFF5D, 0x02A9,\n    0xFF5E, 0x0299, 0xFF5F, 0x2F63, 0xFF60, 0x2F64, 0xFF61, 0x0147,\n    0xFF62, 0x0148, 0xFF63, 0x0149, 0xFF64, 0x014A, 0xFF65, 0x014B,\n    0xFF66, 0x014C, 0xFF67, 0x014D, 0xFF68, 0x014E, 0xFF69, 0x014F,\n    0xFF6A, 0x0150, 0xFF6B, 0x0151, 0xFF6C, 0x0152, 0xFF6D, 0x0153,\n    0xFF6E, 0x0154, 0xFF6F, 0x0155, 0xFF70, 0x0156, 0xFF71, 0x0157,\n    0xFF72, 0x0158, 0xFF73, 0x0159, 0xFF74, 0x015A, 0xFF75, 0x015B,\n    0xFF76, 0x015C, 0xFF77, 0x015D, 0xFF78, 0x015E, 0xFF79, 0x015F,\n    0xFF7A, 0x0160, 0xFF7B, 0x0161, 0xFF7C, 0x0162, 0xFF7D, 0x0163,\n    0xFF7E, 0x0164, 0xFF7F, 0x0165, 0xFF80, 0x0166, 0xFF81, 0x0167,\n    0xFF82, 0x0168, 0xFF83, 0x0169, 0xFF84, 0x016A, 0xFF85, 0x016B,\n    0xFF86, 0x016C, 0xFF87, 0x016D, 0xFF88, 0x016E, 0xFF89, 0x016F,\n    0xFF8A, 0x0170, 0xFF8B, 0x0171, 0xFF8C, 0x0172, 0xFF8D, 0x0173,\n    0xFF8E, 0x0174, 0xFF8F, 0x0175, 0xFF90, 0x0176, 0xFF91, 0x0177,\n    0xFF92, 0x0178, 0xFF93, 0x0179, 0xFF94, 0x017A, 0xFF95, 0x017B,\n    0xFF96, 0x017C, 0xFF97, 0x017D, 0xFF98, 0x017E, 0xFF99, 0x017F,\n    0xFF9A, 0x0180, 0xFF9B, 0x0181, 0xFF9C, 0x0182, 0xFF9D, 0x0183,\n    0xFF9E, 0x0184, 0xFF9F, 0x0185, 0xFFE0, 0x02C9, 0xFFE1, 0x02CA,\n    0xFFE2, 0x02EF, 0xFFE3, 0x0289, 0xFFE4, 0x1F45, 0xFFE5, 0x02C7,\n    0xFFE8, 0x0143,\n};\nextern const unsigned short g_FXCMAP_UniJIS_UTF16_H_5_DWord[384 * 3] = {\n    0xD840, 0xDC0B, 0x360F, 0xD840, 0xDC89, 0x4351, 0xD840, 0xDC8A, 0x371C,\n    0xD840, 0xDCA2, 0x4358, 0xD840, 0xDCA4, 0x435B, 0xD840, 0xDCB0, 0x3781,\n    0xD840, 0xDCF5, 0x4E59, 0xD840, 0xDD58, 0x4E6B, 0xD840, 0xDDA2, 0x3621,\n    0xD840, 0xDE13, 0x436B, 0xD840, 0xDF2B, 0x4382, 0xD840, 0xDF71, 0x438B,\n    0xD840, 0xDF81, 0x4389, 0xD840, 0xDFF9, 0x438F, 0xD841, 0xDC4A, 0x4391,\n    0xD841, 0xDD09, 0x4393, 0xD841, 0xDDB1, 0x4E70, 0xD841, 0xDDD6, 0x439C,\n    0xD841, 0xDE11, 0x37D6, 0xD841, 0xDE28, 0x3719, 0xD841, 0xDEEC, 0x4E73,\n    0xD841, 0xDF4F, 0x43A0, 0xD842, 0xDC07, 0x43A7, 0xD842, 0xDC3A, 0x43A9,\n    0xD842, 0xDCB9, 0x43AF, 0xD842, 0xDD0E, 0x34D3, 0xD842, 0xDD7C, 0x43B3,\n    0xD842, 0xDD9D, 0x43B4, 0xD842, 0xDE64, 0x35BB, 0xD842, 0xDED3, 0x43B9,\n    0xD842, 0xDF1D, 0x43BC, 0xD842, 0xDF9F, 0x35EB, 0xD842, 0xDFB7, 0x358A,\n    0xD843, 0xDD45, 0x43CF, 0xD843, 0xDD58, 0x4E7A, 0xD843, 0xDDE1, 0x43DD,\n    0xD843, 0xDE64, 0x43EC, 0xD843, 0xDE6D, 0x43E4, 0xD843, 0xDE95, 0x43E3,\n    0xD843, 0xDF5F, 0x43EF, 0xD844, 0xDE01, 0x4406, 0xD844, 0xDE3D, 0x3681,\n    0xD844, 0xDE55, 0x4407, 0xD844, 0xDE74, 0x440D, 0xD844, 0xDE7B, 0x4409,\n    0xD844, 0xDED7, 0x4415, 0xD844, 0xDEE4, 0x4414, 0xD844, 0xDEFD, 0x441B,\n    0xD844, 0xDF1B, 0x41B0, 0xD844, 0xDF36, 0x441D, 0xD844, 0xDF44, 0x441E,\n    0xD844, 0xDFC4, 0x4429, 0xD845, 0xDC6D, 0x4436, 0xD845, 0xDC6E, 0x41B5,\n    0xD845, 0xDDD7, 0x4440, 0xD845, 0xDE47, 0x4448, 0xD845, 0xDEB4, 0x41C6,\n    0xD845, 0xDF06, 0x4454, 0xD845, 0xDF42, 0x4455, 0xD846, 0xDCBD, 0x41C1,\n    0xD846, 0xDDC3, 0x4475, 0xD846, 0xDE1A, 0x1E91, 0xD847, 0xDC56, 0x4483,\n    0xD847, 0xDD2D, 0x4488, 0xD847, 0xDD45, 0x4489, 0xD847, 0xDD62, 0x448B,\n    0xD847, 0xDD78, 0x448A, 0xD847, 0xDD92, 0x4494, 0xD847, 0xDD9C, 0x4490,\n    0xD847, 0xDDA1, 0x448F, 0xD847, 0xDDB7, 0x4497, 0xD847, 0xDDE0, 0x4499,\n    0xD847, 0xDE33, 0x449A, 0xD847, 0xDE34, 0x41CD, 0xD847, 0xDF1E, 0x44A7,\n    0xD847, 0xDF76, 0x44AE, 0xD847, 0xDFFA, 0x44B1, 0xD848, 0xDD7B, 0x44BF,\n    0xD848, 0xDE18, 0x4AA1, 0xD848, 0xDF1E, 0x44C5, 0xD848, 0xDFAD, 0x44C8,\n    0xD849, 0xDE09, 0x3C53, 0xD849, 0xDEF3, 0x44E0, 0xD84A, 0xDC5B, 0x44EF,\n    0xD84A, 0xDCAB, 0x44F5, 0xD84A, 0xDD8F, 0x44F9, 0xD84A, 0xDEB8, 0x4503,\n    0xD84A, 0xDF46, 0x4510, 0xD84A, 0xDF4F, 0x4507, 0xD84A, 0xDF50, 0x4508,\n    0xD84A, 0xDFA6, 0x4513, 0xD84B, 0xDC1D, 0x4512, 0xD84B, 0xDC24, 0x4516,\n    0xD84B, 0xDDE1, 0x452E, 0xD84B, 0xDE42, 0x4E9C, 0xD84B, 0xDFEB, 0x4EA2,\n    0xD84C, 0xDDB6, 0x4550, 0xD84C, 0xDDC3, 0x454E, 0xD84C, 0xDDC4, 0x41F8,\n    0xD84C, 0xDDF5, 0x454F, 0xD84C, 0xDF72, 0x4561, 0xD84C, 0xDFD0, 0x4568,\n    0xD84C, 0xDFD2, 0x4564, 0xD84C, 0xDFD3, 0x4563, 0xD84C, 0xDFD5, 0x456A,\n    0xD84C, 0xDFDA, 0x456C, 0xD84C, 0xDFDF, 0x456E, 0xD84C, 0xDFE4, 0x4569,\n    0xD84C, 0xDFFE, 0x3C3E, 0xD84D, 0xDC4A, 0x4576, 0xD84D, 0xDC4B, 0x4578,\n    0xD84D, 0xDC51, 0x4577, 0xD84D, 0xDC65, 0x457C, 0xD84D, 0xDCE4, 0x4596,\n    0xD84D, 0xDD5A, 0x4597, 0xD84D, 0xDD94, 0x45A3, 0xD84D, 0xDDC4, 0x4209,\n    0xD84D, 0xDE38, 0x45B3, 0xD84D, 0xDE39, 0x45B1, 0xD84D, 0xDE3A, 0x3C21,\n    0xD84D, 0xDE47, 0x45B2, 0xD84D, 0xDF0C, 0x45C7, 0xD84D, 0xDF1C, 0x45BE,\n    0xD84D, 0xDF3F, 0x4212, 0xD84D, 0xDF63, 0x4214, 0xD84D, 0xDF64, 0x45CB,\n    0xD84D, 0xDFE7, 0x45D3, 0xD84D, 0xDFFF, 0x45D2, 0xD84E, 0xDC24, 0x45D8,\n    0xD84E, 0xDC3D, 0x45DD, 0xD84E, 0xDE98, 0x45E9, 0xD84F, 0xDC7F, 0x45F6,\n    0xD84F, 0xDCBE, 0x37D5, 0xD84F, 0xDCFE, 0x3650, 0xD84F, 0xDD00, 0x4605,\n    0xD84F, 0xDD0E, 0x47DA, 0xD84F, 0xDD40, 0x4616, 0xD84F, 0xDDD3, 0x4619,\n    0xD84F, 0xDDF9, 0x4618, 0xD84F, 0xDDFA, 0x4617, 0xD84F, 0xDF7E, 0x463F,\n    0xD850, 0xDC4B, 0x4EC8, 0xD850, 0xDC96, 0x464E, 0xD850, 0xDD03, 0x4653,\n    0xD850, 0xDDC6, 0x465F, 0xD850, 0xDDFE, 0x4662, 0xD850, 0xDEEE, 0x37CA,\n    0xD850, 0xDFBC, 0x4677, 0xD850, 0xDFD0, 0x1E9E, 0xD851, 0xDE29, 0x4681,\n    0xD851, 0xDEA5, 0x4687, 0xD851, 0xDFF1, 0x424A, 0xD852, 0xDC96, 0x469D,\n    0xD852, 0xDE4D, 0x46B8, 0xD852, 0xDF56, 0x46C5, 0xD852, 0xDF6F, 0x46C7,\n    0xD853, 0xDC16, 0x46CC, 0xD853, 0xDD14, 0x36AB, 0xD853, 0xDE04, 0x4E5A,\n    0xD853, 0xDE0E, 0x46EE, 0xD853, 0xDE37, 0x46F2, 0xD853, 0xDE6A, 0x46F7,\n    0xD853, 0xDE8B, 0x46FA, 0xD853, 0xDFF2, 0x4E5B, 0xD854, 0xDC4A, 0x4705,\n    0xD854, 0xDC55, 0x4707, 0xD854, 0xDD22, 0x4709, 0xD854, 0xDDA9, 0x470E,\n    0xD854, 0xDDCD, 0x4711, 0xD854, 0xDDE5, 0x4710, 0xD854, 0xDE1E, 0x4713,\n    0xD854, 0xDE4C, 0x4715, 0xD855, 0xDC2E, 0x4721, 0xD855, 0xDC8E, 0x426D,\n    0xD855, 0xDCD9, 0x4729, 0xD855, 0xDD0E, 0x4271, 0xD855, 0xDDA7, 0x4735,\n    0xD855, 0xDE7F, 0x36FB, 0xD855, 0xDF71, 0x427A, 0xD855, 0xDFA9, 0x4748,\n    0xD855, 0xDFB4, 0x4749, 0xD856, 0xDC74, 0x1DF6, 0xD856, 0xDDC4, 0x4280,\n    0xD856, 0xDDCC, 0x4E90, 0xD856, 0xDDD4, 0x475C, 0xD856, 0xDEE3, 0x4765,\n    0xD856, 0xDEE4, 0x4764, 0xD856, 0xDEF1, 0x4766, 0xD856, 0xDFB2, 0x4775,\n    0xD857, 0xDC4B, 0x477E, 0xD857, 0xDC64, 0x477F, 0xD857, 0xDDA1, 0x4289,\n    0xD857, 0xDE2E, 0x478E, 0xD857, 0xDE56, 0x478F, 0xD857, 0xDE62, 0x4792,\n    0xD857, 0xDE65, 0x4790, 0xD857, 0xDEC2, 0x4797, 0xD857, 0xDED8, 0x4795,\n    0xD857, 0xDEE8, 0x4799, 0xD857, 0xDF23, 0x479A, 0xD857, 0xDF5C, 0x479C,\n    0xD857, 0xDFD4, 0x47A3, 0xD857, 0xDFE0, 0x47A2, 0xD857, 0xDFFB, 0x47A9,\n    0xD858, 0xDC0C, 0x47A8, 0xD858, 0xDC17, 0x47B0, 0xD858, 0xDC60, 0x47B3,\n    0xD858, 0xDCED, 0x47BD, 0xD858, 0xDE70, 0x47D1, 0xD858, 0xDE86, 0x47D2,\n    0xD858, 0xDF4C, 0x4F57, 0xD859, 0xDC02, 0x47DE, 0xD859, 0xDE7E, 0x47F0,\n    0xD859, 0xDEB0, 0x3714, 0xD859, 0xDF1D, 0x47FE, 0xD85A, 0xDCDD, 0x480C,\n    0xD85A, 0xDCEA, 0x480E, 0xD85A, 0xDD51, 0x354E, 0xD85A, 0xDD6F, 0x4812,\n    0xD85A, 0xDD99, 0x3736, 0xD85A, 0xDDDD, 0x4814, 0xD85A, 0xDE1E, 0x4817,\n    0xD85A, 0xDE58, 0x481B, 0xD85A, 0xDE8C, 0x481F, 0xD85A, 0xDEB7, 0x4822,\n    0xD85A, 0xDEFF, 0x42A7, 0xD85B, 0xDC29, 0x4446, 0xD85B, 0xDC73, 0x484A,\n    0xD85B, 0xDC9E, 0x4EEE, 0xD85B, 0xDCDD, 0x4853, 0xD85B, 0xDE40, 0x42C1,\n    0xD85B, 0xDE65, 0x4860, 0xD85B, 0xDF94, 0x4870, 0xD85B, 0xDFF6, 0x487A,\n    0xD85B, 0xDFF7, 0x487B, 0xD85B, 0xDFF8, 0x4879, 0xD85C, 0xDCF4, 0x42CF,\n    0xD85C, 0xDD0D, 0x488B, 0xD85C, 0xDD39, 0x488E, 0xD85C, 0xDFDA, 0x48B3,\n    0xD85C, 0xDFDB, 0x48B2, 0xD85C, 0xDFFE, 0x48B9, 0xD85D, 0xDC10, 0x48BC,\n    0xD85D, 0xDC49, 0x48C0, 0xD85D, 0xDE14, 0x48CE, 0xD85D, 0xDE15, 0x48CD,\n    0xD85D, 0xDE31, 0x48D0, 0xD85D, 0xDE84, 0x42DD, 0xD85D, 0xDE93, 0x48D5,\n    0xD85D, 0xDF0E, 0x48DA, 0xD85D, 0xDF23, 0x48DC, 0xD85D, 0xDF52, 0x48E0,\n    0xD85E, 0xDD85, 0x48F0, 0xD85E, 0xDDB4, 0x4EA5, 0xD85E, 0xDE84, 0x48FC,\n    0xD85E, 0xDFB3, 0x490B, 0xD85E, 0xDFBE, 0x490D, 0xD85E, 0xDFC7, 0x490E,\n    0xD85F, 0xDC3C, 0x4EFC, 0xD85F, 0xDCB8, 0x4914, 0xD85F, 0xDD73, 0x4E5C,\n    0xD85F, 0xDDA0, 0x491C, 0xD85F, 0xDE10, 0x491E, 0xD85F, 0xDFB7, 0x364A,\n    0xD860, 0xDC8A, 0x4927, 0xD860, 0xDCBB, 0x492D, 0xD860, 0xDE77, 0x42F4,\n    0xD860, 0xDE82, 0x4939, 0xD860, 0xDEF3, 0x493B, 0xD860, 0xDFCD, 0x42FA,\n    0xD861, 0xDC0C, 0x4942, 0xD861, 0xDC55, 0x4945, 0xD861, 0xDD6B, 0x4952,\n    0xD861, 0xDDC8, 0x4955, 0xD861, 0xDDC9, 0x4956, 0xD861, 0xDED7, 0x4960,\n    0xD861, 0xDEFA, 0x4963, 0xD862, 0xDD46, 0x497C, 0xD862, 0xDD49, 0x497B,\n    0xD862, 0xDD6B, 0x4981, 0xD862, 0xDD87, 0x37AD, 0xD862, 0xDD88, 0x4988,\n    0xD862, 0xDDBA, 0x4992, 0xD862, 0xDDBB, 0x4993, 0xD862, 0xDE1E, 0x499B,\n    0xD862, 0xDE29, 0x499C, 0xD862, 0xDE43, 0x49A0, 0xD862, 0xDE71, 0x499F,\n    0xD862, 0xDE99, 0x49A7, 0xD862, 0xDECD, 0x49A8, 0xD862, 0xDEDD, 0x49AF,\n    0xD862, 0xDEE4, 0x49AE, 0xD862, 0xDFC1, 0x49BA, 0xD862, 0xDFEF, 0x49BB,\n    0xD863, 0xDCDD, 0x1DD9, 0xD863, 0xDD10, 0x49C2, 0xD863, 0xDD71, 0x49C3,\n    0xD863, 0xDDFB, 0x49C5, 0xD863, 0xDE17, 0x37B0, 0xD863, 0xDE1F, 0x49C6,\n    0xD863, 0xDE36, 0x49CA, 0xD863, 0xDE89, 0x49CD, 0xD863, 0xDEEB, 0x49CF,\n    0xD863, 0xDEF6, 0x1DF9, 0xD863, 0xDF32, 0x49D1, 0xD863, 0xDFF8, 0x49D7,\n    0xD864, 0xDEA0, 0x49E5, 0xD864, 0xDEB1, 0x49E6, 0xD865, 0xDC90, 0x49F7,\n    0xD865, 0xDDCF, 0x4A00, 0xD865, 0xDE7F, 0x3619, 0xD865, 0xDEF0, 0x4A0F,\n    0xD865, 0xDF19, 0x4A12, 0xD865, 0xDF50, 0x4A16, 0xD866, 0xDCC6, 0x4A27,\n    0xD866, 0xDE72, 0x4A39, 0xD867, 0xDD4B, 0x3595, 0xD867, 0xDDDB, 0x4A52,\n    0xD867, 0xDE15, 0x4A5C, 0xD867, 0xDE3D, 0x4F5B, 0xD867, 0xDE49, 0x4A5E,\n    0xD867, 0xDE8A, 0x4A5D, 0xD867, 0xDEC4, 0x4A66, 0xD867, 0xDEDB, 0x4A6E,\n    0xD867, 0xDEE9, 0x4A6B, 0xD867, 0xDFCE, 0x4A7F, 0xD867, 0xDFD7, 0x4A7F,\n    0xD868, 0xDC1A, 0x4A85, 0xD868, 0xDC2F, 0x4A83, 0xD868, 0xDC82, 0x4A8C,\n    0xD868, 0xDCF9, 0x4A8B, 0xD868, 0xDD90, 0x434B, 0xD868, 0xDEB2, 0x4E68,\n    0xD868, 0xDF8C, 0x4AA5, 0xD869, 0xDC37, 0x4AA7, 0xD869, 0xDDF1, 0x4AB3,\n    0xD869, 0xDE02, 0x4AB5, 0xD869, 0xDE1A, 0x4F5C, 0xD869, 0xDEB2, 0x4AB9,\n    0xD87E, 0xDC04, 0x3C1C, 0xD87E, 0xDC0F, 0x1E86, 0xD87E, 0xDC15, 0x4E5D,\n    0xD87E, 0xDC18, 0x1E89, 0xD87E, 0xDC1A, 0x3682, 0xD87E, 0xDC22, 0x3574,\n    0xD87E, 0xDC28, 0x35EF, 0xD87E, 0xDC2C, 0x371D, 0xD87E, 0xDC33, 0x3597,\n    0xD87E, 0xDC3F, 0x35F7, 0xD87E, 0xDC46, 0x4E5E, 0xD87E, 0xDC52, 0x3611,\n    0xD87E, 0xDC62, 0x36AE, 0xD87E, 0xDC6D, 0x3729, 0xD87E, 0xDC73, 0x3608,\n    0xD87E, 0xDC77, 0x1E4A, 0xD87E, 0xDC84, 0x1E36, 0xD87E, 0xDC99, 0x4E5F,\n    0xD87E, 0xDC9A, 0x3668, 0xD87E, 0xDCA6, 0x4E60, 0xD87E, 0xDCAC, 0x35B6,\n    0xD87E, 0xDCB2, 0x362B, 0xD87E, 0xDCB6, 0x3731, 0xD87E, 0xDCD3, 0x1E88,\n    0xD87E, 0xDCDB, 0x373C, 0xD87E, 0xDCDC, 0x1E0F, 0xD87E, 0xDCE1, 0x37D3,\n    0xD87E, 0xDCE5, 0x4E61, 0xD87E, 0xDCEA, 0x356F, 0xD87E, 0xDCED, 0x1DF1,\n    0xD87E, 0xDCFC, 0x3558, 0xD87E, 0xDD03, 0x35C8, 0xD87E, 0xDD0B, 0x35E9,\n    0xD87E, 0xDD0F, 0x366C, 0xD87E, 0xDD1A, 0x365C, 0xD87E, 0xDD20, 0x1E9F,\n    0xD87E, 0xDD21, 0x35F1, 0xD87E, 0xDD45, 0x342D, 0xD87E, 0xDD47, 0x361E,\n    0xD87E, 0xDD6C, 0x3764, 0xD87E, 0xDD95, 0x3566, 0xD87E, 0xDDD0, 0x36F4,\n    0xD87E, 0xDDDE, 0x4E62, 0xD87E, 0xDDDF, 0x36F5, 0xD87E, 0xDDF4, 0x3BA5,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-V_5.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_UniJIS_UTF16_V_5[289 * 2] = {\n    0x00B0, 0x204D, 0x2010, 0x1ED5, 0x2015, 0x1ED4, 0x2016, 0x1ED7,\n    0x2025, 0x1EDA, 0x2026, 0x1ED9, 0x2032, 0x2051, 0x2033, 0x205B,\n    0x2190, 0x02E2, 0x2191, 0x02E0, 0x2192, 0x02E3, 0x2193, 0x02E1,\n    0x21C4, 0x2077, 0x21C5, 0x2076, 0x21C6, 0x2078, 0x21E6, 0x1F4C,\n    0x21E7, 0x1F4E, 0x21E8, 0x1F4B, 0x21E9, 0x1F4D, 0x239B, 0x2F74,\n    0x239C, 0x2F88, 0x239D, 0x2F73, 0x239E, 0x2F76, 0x239F, 0x2F88,\n    0x23A0, 0x2F75, 0x23A1, 0x2F7C, 0x23A2, 0x2F88, 0x23A3, 0x2F7B,\n    0x23A4, 0x2F7E, 0x23A5, 0x2F88, 0x23A6, 0x2F7D, 0x23A7, 0x1FE8,\n    0x23A8, 0x1FE7, 0x23A9, 0x1FE6, 0x23AA, 0x2F88, 0x23AB, 0x1FEC,\n    0x23AC, 0x1FEB, 0x23AD, 0x1FEA, 0x23B0, 0x3FDE, 0x23B1, 0x3FDF,\n    0x2500, 0x1D39, 0x2501, 0x1D3A, 0x2502, 0x1D37, 0x2503, 0x1D38,\n    0x2504, 0x1D3D, 0x2505, 0x1D3E, 0x2506, 0x1D3B, 0x2507, 0x1D3C,\n    0x2508, 0x1D41, 0x2509, 0x1D42, 0x250A, 0x1D3F, 0x250B, 0x1D40,\n    0x250C, 0x1D47, 0x250D, 0x1D49, 0x250E, 0x1D48, 0x250F, 0x1D4A,\n    0x2510, 0x1D4F, 0x2511, 0x1D51, 0x2512, 0x1D50, 0x2513, 0x1D52,\n    0x2514, 0x1D43, 0x2515, 0x1D45, 0x2516, 0x1D44, 0x2517, 0x1D46,\n    0x2518, 0x1D4B, 0x2519, 0x1D4D, 0x251A, 0x1D4C, 0x251B, 0x1D4E,\n    0x251C, 0x1D63, 0x251D, 0x1D67, 0x251E, 0x1D65, 0x251F, 0x1D64,\n    0x2520, 0x1D66, 0x2521, 0x1D69, 0x2522, 0x1D68, 0x2523, 0x1D6A,\n    0x2524, 0x1D6B, 0x2525, 0x1D6F, 0x2526, 0x1D6D, 0x2527, 0x1D6C,\n    0x2528, 0x1D6E, 0x2529, 0x1D71, 0x252A, 0x1D70, 0x252B, 0x1D72,\n    0x252C, 0x1D5B, 0x252D, 0x1D5D, 0x252E, 0x1D5E, 0x252F, 0x1D5F,\n    0x2530, 0x1D5C, 0x2531, 0x1D60, 0x2532, 0x1D61, 0x2533, 0x1D62,\n    0x2534, 0x1D53, 0x2535, 0x1D55, 0x2536, 0x1D56, 0x2537, 0x1D57,\n    0x2538, 0x1D54, 0x2539, 0x1D58, 0x253A, 0x1D59, 0x253B, 0x1D5A,\n    0x253D, 0x1D77, 0x253E, 0x1D78, 0x253F, 0x1D79, 0x2540, 0x1D75,\n    0x2541, 0x1D74, 0x2542, 0x1D76, 0x2543, 0x1D7B, 0x2544, 0x1D7D,\n    0x2545, 0x1D7A, 0x2546, 0x1D7C, 0x2547, 0x1D81, 0x2548, 0x1D80,\n    0x2549, 0x1D7E, 0x254A, 0x1D7F, 0x261C, 0x201D, 0x261D, 0x201B,\n    0x261E, 0x201E, 0x261F, 0x201C, 0x2702, 0x2F92, 0x27A1, 0x2011,\n    0x3001, 0x1ECF, 0x3002, 0x1ED0, 0x3008, 0x1EE3, 0x3009, 0x1EE4,\n    0x300A, 0x1EE5, 0x300B, 0x1EE6, 0x300C, 0x1EE7, 0x300D, 0x1EE8,\n    0x300E, 0x1EE9, 0x300F, 0x1EEA, 0x3010, 0x1EEB, 0x3011, 0x1EEC,\n    0x3014, 0x1EDD, 0x3015, 0x1EDE, 0x3016, 0x3FC9, 0x3017, 0x3FCA,\n    0x3018, 0x2F6B, 0x3019, 0x2F6C, 0x301C, 0x1ED6, 0x301D, 0x1F14,\n    0x301F, 0x1F15, 0x303B, 0x2F4B, 0x3041, 0x1EEE, 0x3043, 0x1EEF,\n    0x3045, 0x1EF0, 0x3047, 0x1EF1, 0x3049, 0x1EF2, 0x3063, 0x1EF3,\n    0x3083, 0x1EF4, 0x3085, 0x1EF5, 0x3087, 0x1EF6, 0x308E, 0x1EF7,\n    0x3095, 0x2048, 0x3096, 0x2049, 0x309B, 0x2050, 0x309C, 0x204F,\n    0x30A0, 0x3FCB, 0x30A1, 0x1EF8, 0x30A3, 0x1EF9, 0x30A5, 0x1EFA,\n    0x30A7, 0x1EFB, 0x30A9, 0x1EFC, 0x30C3, 0x1EFD, 0x30E3, 0x1EFE,\n    0x30E5, 0x1EFF, 0x30E7, 0x1F00, 0x30EE, 0x1F01, 0x30F5, 0x1F02,\n    0x30F6, 0x1F03, 0x30FC, 0x1ED3, 0x31F0, 0x3FCD, 0x31F1, 0x3FCE,\n    0x31F2, 0x3FCF, 0x31F3, 0x3FD0, 0x31F4, 0x3FD1, 0x31F5, 0x3FD2,\n    0x31F6, 0x3FD3, 0x31F7, 0x3FD4, 0x31F8, 0x3FD5, 0x31F9, 0x3FD6,\n    0x31FA, 0x3FD8, 0x31FB, 0x3FD9, 0x31FC, 0x3FDA, 0x31FD, 0x3FDB,\n    0x31FE, 0x3FDC, 0x31FF, 0x3FDD, 0x3300, 0x209E, 0x3301, 0x2EB6,\n    0x3302, 0x2EB7, 0x3303, 0x2092, 0x3304, 0x2EB8, 0x3305, 0x208D,\n    0x3306, 0x2EB9, 0x3307, 0x2EBD, 0x3308, 0x2EBB, 0x3309, 0x2EC0,\n    0x330A, 0x2EBE, 0x330B, 0x2EC2, 0x330C, 0x2EC4, 0x330D, 0x1F0E,\n    0x330E, 0x2EC5, 0x330F, 0x2EC6, 0x3310, 0x2EC7, 0x3311, 0x2EC8,\n    0x3312, 0x2EC9, 0x3313, 0x2ECA, 0x3314, 0x1F05, 0x3315, 0x2094,\n    0x3316, 0x208A, 0x3317, 0x2ECC, 0x3318, 0x2093, 0x3319, 0x2ECE,\n    0x331A, 0x2ED0, 0x331B, 0x2ED1, 0x331C, 0x2ED2, 0x331D, 0x2ED3,\n    0x331E, 0x20A1, 0x331F, 0x2ED4, 0x3320, 0x2ED5, 0x3321, 0x2ED6,\n    0x3322, 0x2089, 0x3323, 0x209C, 0x3324, 0x2ED7, 0x3325, 0x2ED9,\n    0x3326, 0x1F0F, 0x3327, 0x1F09, 0x3328, 0x2EDC, 0x3329, 0x2EDD,\n    0x332A, 0x20A4, 0x332B, 0x1F11, 0x332D, 0x2EDF, 0x332E, 0x2EE2,\n    0x332F, 0x2EE3, 0x3330, 0x2EE4, 0x3331, 0x20A6, 0x3332, 0x2EE5,\n    0x3333, 0x208E, 0x3334, 0x2EE8, 0x3335, 0x2EE9, 0x3336, 0x1F0B,\n    0x3337, 0x2EEE, 0x3338, 0x2EF0, 0x3339, 0x2097, 0x333A, 0x2EF1,\n    0x333B, 0x209D, 0x333C, 0x2EEA, 0x333D, 0x2EF2, 0x333E, 0x2EF4,\n    0x333F, 0x2EF5, 0x3340, 0x2EF6, 0x3341, 0x2EF3, 0x3342, 0x209B,\n    0x3343, 0x2EF7, 0x3344, 0x2EF8, 0x3345, 0x2EF9, 0x3346, 0x2EFA,\n    0x3347, 0x20A5, 0x3348, 0x2EFB, 0x3349, 0x1F04, 0x334A, 0x1F12,\n    0x334B, 0x2EFC, 0x334C, 0x2EFD, 0x334D, 0x1F07, 0x334E, 0x2091,\n    0x334F, 0x2EFE, 0x3350, 0x2EFF, 0x3351, 0x1F0C, 0x3352, 0x2F02,\n    0x3353, 0x2F06, 0x3354, 0x2F03, 0x3355, 0x2F07, 0x3356, 0x2F08,\n    0x3357, 0x2098, 0x337F, 0x2084, 0xFF08, 0x1EDB, 0xFF09, 0x1EDC,\n    0xFF0C, 0x204C, 0xFF0E, 0x2052, 0xFF1D, 0x1EED, 0xFF3B, 0x1EDF,\n    0xFF3D, 0x1EE0, 0xFF3F, 0x1ED2, 0xFF5B, 0x1EE1, 0xFF5C, 0x1ED8,\n    0xFF5D, 0x1EE2, 0xFF5E, 0x1ED6, 0xFF5F, 0x2F6D, 0xFF60, 0x2F6E,\n    0xFFE3, 0x1ED1,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Japan1/V_1.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_V_1[27 * 3] = {\n    0x2122, 0x2123, 0x1ECF, 0x2131, 0x2132, 0x1ED1, 0x213C, 0x213E, 0x1ED3,\n    0x2141, 0x2145, 0x1ED6, 0x214A, 0x215B, 0x1EDB, 0x2161, 0x2161, 0x1EED,\n    0x2421, 0x2421, 0x1EEE, 0x2423, 0x2423, 0x1EEF, 0x2425, 0x2425, 0x1EF0,\n    0x2427, 0x2427, 0x1EF1, 0x2429, 0x2429, 0x1EF2, 0x2443, 0x2443, 0x1EF3,\n    0x2463, 0x2463, 0x1EF4, 0x2465, 0x2465, 0x1EF5, 0x2467, 0x2467, 0x1EF6,\n    0x246E, 0x246E, 0x1EF7, 0x2521, 0x2521, 0x1EF8, 0x2523, 0x2523, 0x1EF9,\n    0x2525, 0x2525, 0x1EFA, 0x2527, 0x2527, 0x1EFB, 0x2529, 0x2529, 0x1EFC,\n    0x2543, 0x2543, 0x1EFD, 0x2563, 0x2563, 0x1EFE, 0x2565, 0x2565, 0x1EFF,\n    0x2567, 0x2567, 0x1F00, 0x256E, 0x256E, 0x1F01, 0x2575, 0x2576, 0x1F02,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Japan1/cmaps_japan1.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../../include/fpdfapi/fpdf_resource.h\"\n#include \"../../../../include/fpdfapi/fpdf_module.h\"\n#include \"../../fpdf_font/font_int.h\"\n#include \"../cmap_int.h\"\nextern const FX_WORD g_FXCMAP_83pv_RKSJ_H_1[];\nextern const FX_WORD g_FXCMAP_90ms_RKSJ_H_2[];\nextern const FX_WORD g_FXCMAP_90ms_RKSJ_V_2[];\nextern const FX_WORD g_FXCMAP_90msp_RKSJ_H_2[];\nextern const FX_WORD g_FXCMAP_90msp_RKSJ_V_2[];\nextern const FX_WORD g_FXCMAP_90pv_RKSJ_H_1[];\nextern const FX_WORD g_FXCMAP_Add_RKSJ_H_1[];\nextern const FX_WORD g_FXCMAP_Add_RKSJ_V_1[];\nextern const FX_WORD g_FXCMAP_EUC_H_1[];\nextern const FX_WORD g_FXCMAP_EUC_V_1[];\nextern const FX_WORD g_FXCMAP_Ext_RKSJ_H_2[];\nextern const FX_WORD g_FXCMAP_Ext_RKSJ_V_2[];\nextern const FX_WORD g_FXCMAP_H_1[];\nextern const FX_WORD g_FXCMAP_V_1[];\nextern const FX_WORD g_FXCMAP_UniJIS_UCS2_H_4[];\nextern const FX_WORD g_FXCMAP_UniJIS_UCS2_V_4[];\nextern const FX_WORD g_FXCMAP_UniJIS_UCS2_HW_H_4[];\nextern const FX_WORD g_FXCMAP_UniJIS_UCS2_HW_V_4[];\nextern const FX_WORD g_FXCMAP_UniJIS_UTF16_H_0[];\nextern const FX_WORD g_FXCMAP_UniJIS_UTF16_H_0_DWord[];\nextern const FX_WORD g_FXCMAP_UniJIS_UTF16_V_0[];\nextern const FX_WORD g_FXCMAP_Japan1CID2Unicode_4[];\nstatic const FXCMAP_CMap g_FXCMAP_Japan1_cmaps[] = {\n    { \"83pv-RKSJ-H\", FXCMAP_CMap::Range, g_FXCMAP_83pv_RKSJ_H_1, 222, FXCMAP_CMap::None, NULL, 0, 0 },\n    { \"90ms-RKSJ-H\", FXCMAP_CMap::Range, g_FXCMAP_90ms_RKSJ_H_2, 171, FXCMAP_CMap::None, NULL, 0, 0 },\n    { \"90ms-RKSJ-V\", FXCMAP_CMap::Range, g_FXCMAP_90ms_RKSJ_V_2, 78, FXCMAP_CMap::None, NULL, 0, -1 },\n    { \"90msp-RKSJ-H\", FXCMAP_CMap::Range, g_FXCMAP_90msp_RKSJ_H_2, 170, FXCMAP_CMap::None, NULL, 0, -2 },\n    { \"90msp-RKSJ-V\", FXCMAP_CMap::Range, g_FXCMAP_90msp_RKSJ_V_2, 78, FXCMAP_CMap::None, NULL, 0, -1 },\n    { \"90pv-RKSJ-H\", FXCMAP_CMap::Range, g_FXCMAP_90pv_RKSJ_H_1, 263, FXCMAP_CMap::None, NULL, 0, 0 },\n    { \"Add-RKSJ-H\", FXCMAP_CMap::Range, g_FXCMAP_Add_RKSJ_H_1, 635, FXCMAP_CMap::None, NULL, 0, 0 },\n    { \"Add-RKSJ-V\", FXCMAP_CMap::Range, g_FXCMAP_Add_RKSJ_V_1, 57, FXCMAP_CMap::None, NULL, 0, -1 },\n    { \"EUC-H\", FXCMAP_CMap::Range, g_FXCMAP_EUC_H_1, 120, FXCMAP_CMap::None, NULL, 0, 0 },\n    { \"EUC-V\", FXCMAP_CMap::Range, g_FXCMAP_EUC_V_1, 27, FXCMAP_CMap::None, NULL, 0, -1 },\n    { \"Ext-RKSJ-H\", FXCMAP_CMap::Range, g_FXCMAP_Ext_RKSJ_H_2, 665, FXCMAP_CMap::None, NULL, 0, -4 },\n    { \"Ext-RKSJ-V\", FXCMAP_CMap::Range, g_FXCMAP_Ext_RKSJ_V_2, 39, FXCMAP_CMap::None, NULL, 0, -1 },\n    { \"H\", FXCMAP_CMap::Range, g_FXCMAP_H_1, 118, FXCMAP_CMap::None, NULL, 0, 0 },\n    { \"V\", FXCMAP_CMap::Range, g_FXCMAP_V_1, 27, FXCMAP_CMap::None, NULL, 0, -1 },\n    { \"UniJIS-UCS2-H\", FXCMAP_CMap::Single, g_FXCMAP_UniJIS_UCS2_H_4, 9772, FXCMAP_CMap::None, NULL, 0, 0 },\n    { \"UniJIS-UCS2-V\", FXCMAP_CMap::Single, g_FXCMAP_UniJIS_UCS2_V_4, 251, FXCMAP_CMap::None, NULL, 0, -1 },\n    { \"UniJIS-UCS2-HW-H\", FXCMAP_CMap::Range, g_FXCMAP_UniJIS_UCS2_HW_H_4, 4, FXCMAP_CMap::None, NULL, 0, -2 },\n    { \"UniJIS-UCS2-HW-V\", FXCMAP_CMap::Range, g_FXCMAP_UniJIS_UCS2_HW_V_4, 199, FXCMAP_CMap::None, NULL, 0, -1 },\n    { \"UniJIS-UTF16-H\", FXCMAP_CMap::Single, g_FXCMAP_UniJIS_UCS2_H_4, 9772, FXCMAP_CMap::None, NULL, 0, 0 },\n    { \"UniJIS-UTF16-V\", FXCMAP_CMap::Single, g_FXCMAP_UniJIS_UCS2_V_4, 251, FXCMAP_CMap::None, NULL, 0, -1 },\n};\nvoid CPDF_ModuleMgr::LoadEmbeddedJapan1CMaps()\n{\n    CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();\n    pFontGlobals->m_EmbeddedCharsets[CIDSET_JAPAN1].m_pMapList = g_FXCMAP_Japan1_cmaps;\n    pFontGlobals->m_EmbeddedCharsets[CIDSET_JAPAN1].m_Count = sizeof g_FXCMAP_Japan1_cmaps / sizeof (FXCMAP_CMap);\n    pFontGlobals->m_EmbeddedToUnicodes[CIDSET_JAPAN1].m_pMap = g_FXCMAP_Japan1CID2Unicode_4;\n    pFontGlobals->m_EmbeddedToUnicodes[CIDSET_JAPAN1].m_Count = 15444;\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Korea1/Adobe-Korea1-UCS2_2.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_Korea1CID2Unicode_2[18352] = {\n    0xFFFD, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026,\n    0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E,\n    0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036,\n    0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E,\n    0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046,\n    0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E,\n    0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,\n    0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E,\n    0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066,\n    0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E,\n    0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076,\n    0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E,\n    0x20A9, 0x2010, 0x00A9, 0x2122, 0x22EF, 0x3000, 0x3001, 0x3002,\n    0x00B7, 0x2025, 0x2026, 0x00A8, 0x3003, 0x2013, 0x2014, 0x2016,\n    0xFF3C, 0x223C, 0x2018, 0x2019, 0x201C, 0x201D, 0x3014, 0x3015,\n    0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, 0x300F,\n    0x3010, 0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2260, 0x2264, 0x2265,\n    0x221E, 0x2234, 0x00B0, 0x2032, 0x2033, 0x2103, 0x212B, 0xFFE0,\n    0xFFE1, 0xFFE5, 0x2642, 0x2640, 0x2220, 0x22A5, 0x2312, 0x2202,\n    0x2207, 0x2261, 0x2252, 0x00A7, 0x203B, 0x2606, 0x2605, 0x25CB,\n    0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3, 0x25B2,\n    0x25BD, 0x25BC, 0x2192, 0x2190, 0x2191, 0x2193, 0x2194, 0x3013,\n    0x226A, 0x226B, 0x221A, 0x223D, 0x221D, 0x2235, 0x222B, 0x222C,\n    0x2208, 0x220B, 0x2286, 0x2287, 0x2282, 0x2283, 0x222A, 0x2229,\n    0x2227, 0x2228, 0xFFE2, 0x21D2, 0x21D4, 0x2200, 0x2203, 0x00B4,\n    0x02DC, 0x02C7, 0x02D8, 0x02DD, 0x02DA, 0x02D9, 0x00B8, 0x02DB,\n    0x00A1, 0x00BF, 0x2236, 0x222E, 0x2211, 0x220F, 0x00A4, 0x2109,\n    0x2030, 0x25C1, 0x25C0, 0x25B7, 0x25B6, 0x2664, 0x2660, 0x2661,\n    0x2665, 0x2667, 0x2663, 0x2299, 0x25C8, 0x25A3, 0x25D0, 0x25D1,\n    0x2592, 0x25A4, 0x25A5, 0x25A8, 0x25A7, 0x25A6, 0x25A9, 0x2668,\n    0x260F, 0x260E, 0x261C, 0x261E, 0x00B6, 0x2020, 0x2021, 0x2195,\n    0x2197, 0x2199, 0x2196, 0x2198, 0x266D, 0x2669, 0x266A, 0x266C,\n    0x327F, 0x321C, 0x2116, 0x33C7, 0x2122, 0x33C2, 0x33D8, 0x2121,\n    0xFF01, 0xFF02, 0xFF03, 0xFF04, 0xFF05, 0xFF06, 0xFF07, 0xFF08,\n    0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F, 0xFF10,\n    0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18,\n    0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, 0xFF20,\n    0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28,\n    0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30,\n    0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38,\n    0xFF39, 0xFF3A, 0xFF3B, 0xFFE6, 0xFF3D, 0xFF3E, 0xFF3F, 0xFF40,\n    0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48,\n    0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50,\n    0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58,\n    0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, 0xFF5D, 0xFFE3, 0x3131, 0x3132,\n    0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3138, 0x3139, 0x313A,\n    0x313B, 0x313C, 0x313D, 0x313E, 0x313F, 0x3140, 0x3141, 0x3142,\n    0x3143, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x314A,\n    0x314B, 0x314C, 0x314D, 0x314E, 0x314F, 0x3150, 0x3151, 0x3152,\n    0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x315A,\n    0x315B, 0x315C, 0x315D, 0x315E, 0x315F, 0x3160, 0x3161, 0x3162,\n    0x3163, 0x3165, 0x3166, 0x3167, 0x3168, 0x3169, 0x316A, 0x316B,\n    0x316C, 0x316D, 0x316E, 0x316F, 0x3170, 0x3171, 0x3172, 0x3173,\n    0x3174, 0x3175, 0x3176, 0x3177, 0x3178, 0x3179, 0x317A, 0x317B,\n    0x317C, 0x317D, 0x317E, 0x317F, 0x3180, 0x3181, 0x3182, 0x3183,\n    0x3184, 0x3185, 0x3186, 0x3187, 0x3188, 0x3189, 0x318A, 0x318B,\n    0x318C, 0x318D, 0x318E, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174,\n    0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x2160, 0x2161, 0x2162,\n    0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x0391,\n    0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399,\n    0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1,\n    0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1,\n    0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9,\n    0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1,\n    0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x2500,\n    0x2502, 0x250C, 0x2510, 0x2518, 0x2514, 0x251C, 0x252C, 0x2524,\n    0x2534, 0x253C, 0x2501, 0x2503, 0x250F, 0x2513, 0x251B, 0x2517,\n    0x2523, 0x2533, 0x252B, 0x253B, 0x254B, 0x2520, 0x252F, 0x2528,\n    0x2537, 0x253F, 0x251D, 0x2530, 0x2525, 0x2538, 0x2542, 0x2512,\n    0x2511, 0x251A, 0x2519, 0x2516, 0x2515, 0x250E, 0x250D, 0x251E,\n    0x251F, 0x2521, 0x2522, 0x2526, 0x2527, 0x2529, 0x252A, 0x252D,\n    0x252E, 0x2531, 0x2532, 0x2535, 0x2536, 0x2539, 0x253A, 0x253D,\n    0x253E, 0x2540, 0x2541, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547,\n    0x2548, 0x2549, 0x254A, 0x3395, 0x3396, 0x3397, 0x2113, 0x3398,\n    0x33C4, 0x33A3, 0x33A4, 0x33A5, 0x33A6, 0x3399, 0x339A, 0x339B,\n    0x339C, 0x339D, 0x339E, 0x339F, 0x33A0, 0x33A1, 0x33A2, 0x33CA,\n    0x338D, 0x338E, 0x338F, 0x33CF, 0x3388, 0x3389, 0x33C8, 0x33A7,\n    0x33A8, 0x33B0, 0x33B1, 0x33B2, 0x33B3, 0x33B4, 0x33B5, 0x33B6,\n    0x33B7, 0x33B8, 0x33B9, 0x3380, 0x3381, 0x3382, 0x3383, 0x3384,\n    0x33BA, 0x33BB, 0x33BC, 0x33BD, 0x33BE, 0x33BF, 0x3390, 0x3391,\n    0x3392, 0x3393, 0x3394, 0x2126, 0x33C0, 0x33C1, 0x338A, 0x338B,\n    0x338C, 0x33D6, 0x33C5, 0x33AD, 0x33AE, 0x33AF, 0x33DB, 0x33A9,\n    0x33AA, 0x33AB, 0x33AC, 0x33DD, 0x33D0, 0x33D3, 0x33C3, 0x33C9,\n    0x33DC, 0x33C6, 0x00C6, 0x00D0, 0x00AA, 0x0126, 0x0132, 0x013F,\n    0x0141, 0x00D8, 0x0152, 0x00BA, 0x00DE, 0x0166, 0x014A, 0x3260,\n    0x3261, 0x3262, 0x3263, 0x3264, 0x3265, 0x3266, 0x3267, 0x3268,\n    0x3269, 0x326A, 0x326B, 0x326C, 0x326D, 0x326E, 0x326F, 0x3270,\n    0x3271, 0x3272, 0x3273, 0x3274, 0x3275, 0x3276, 0x3277, 0x3278,\n    0x3279, 0x327A, 0x327B, 0x24D0, 0x24D1, 0x24D2, 0x24D3, 0x24D4,\n    0x24D5, 0x24D6, 0x24D7, 0x24D8, 0x24D9, 0x24DA, 0x24DB, 0x24DC,\n    0x24DD, 0x24DE, 0x24DF, 0x24E0, 0x24E1, 0x24E2, 0x24E3, 0x24E4,\n    0x24E5, 0x24E6, 0x24E7, 0x24E8, 0x24E9, 0x2460, 0x2461, 0x2462,\n    0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246A,\n    0x246B, 0x246C, 0x246D, 0x246E, 0x00BD, 0x2153, 0x2154, 0x00BC,\n    0x00BE, 0x215B, 0x215C, 0x215D, 0x215E, 0x00E6, 0x0111, 0x00F0,\n    0x0127, 0x0131, 0x0133, 0x0138, 0x0140, 0x0142, 0x00F8, 0x0153,\n    0x00DF, 0x00FE, 0x0167, 0x014B, 0x0149, 0x3200, 0x3201, 0x3202,\n    0x3203, 0x3204, 0x3205, 0x3206, 0x3207, 0x3208, 0x3209, 0x320A,\n    0x320B, 0x320C, 0x320D, 0x320E, 0x320F, 0x3210, 0x3211, 0x3212,\n    0x3213, 0x3214, 0x3215, 0x3216, 0x3217, 0x3218, 0x3219, 0x321A,\n    0x321B, 0x249C, 0x249D, 0x249E, 0x249F, 0x24A0, 0x24A1, 0x24A2,\n    0x24A3, 0x24A4, 0x24A5, 0x24A6, 0x24A7, 0x24A8, 0x24A9, 0x24AA,\n    0x24AB, 0x24AC, 0x24AD, 0x24AE, 0x24AF, 0x24B0, 0x24B1, 0x24B2,\n    0x24B3, 0x24B4, 0x24B5, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478,\n    0x2479, 0x247A, 0x247B, 0x247C, 0x247D, 0x247E, 0x247F, 0x2480,\n    0x2481, 0x2482, 0x00B9, 0x00B2, 0x00B3, 0x2074, 0x207F, 0x2081,\n    0x2082, 0x2083, 0x2084, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045,\n    0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D,\n    0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055,\n    0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D,\n    0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065,\n    0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D,\n    0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075,\n    0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D,\n    0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085,\n    0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D,\n    0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A1, 0x30A2,\n    0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA,\n    0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30B2,\n    0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA,\n    0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2,\n    0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA,\n    0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2,\n    0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA,\n    0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2,\n    0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA,\n    0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2,\n    0x30F3, 0x30F4, 0x30F5, 0x30F6, 0x0410, 0x0411, 0x0412, 0x0413,\n    0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A,\n    0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422,\n    0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A,\n    0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432,\n    0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439,\n    0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441,\n    0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449,\n    0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0xAC00, 0xAC01,\n    0xAC04, 0xAC07, 0xAC08, 0xAC09, 0xAC0A, 0xAC10, 0xAC11, 0xAC12,\n    0xAC13, 0xAC14, 0xAC15, 0xAC16, 0xAC17, 0xAC19, 0xAC1A, 0xAC1B,\n    0xAC1C, 0xAC1D, 0xAC20, 0xAC24, 0xAC2C, 0xAC2D, 0xAC2F, 0xAC30,\n    0xAC31, 0xAC38, 0xAC39, 0xAC3C, 0xAC40, 0xAC4B, 0xAC4D, 0xAC54,\n    0xAC58, 0xAC5C, 0xAC70, 0xAC71, 0xAC74, 0xAC77, 0xAC78, 0xAC7A,\n    0xAC80, 0xAC81, 0xAC83, 0xAC84, 0xAC85, 0xAC86, 0xAC89, 0xAC8A,\n    0xAC8B, 0xAC8C, 0xAC90, 0xAC94, 0xAC9C, 0xAC9D, 0xAC9F, 0xACA0,\n    0xACA1, 0xACA8, 0xACA9, 0xACAA, 0xACAC, 0xACAF, 0xACB0, 0xACB8,\n    0xACB9, 0xACBB, 0xACBC, 0xACBD, 0xACC1, 0xACC4, 0xACC8, 0xACCC,\n    0xACD5, 0xACD7, 0xACE0, 0xACE1, 0xACE4, 0xACE7, 0xACE8, 0xACEA,\n    0xACEC, 0xACEF, 0xACF0, 0xACF1, 0xACF3, 0xACF5, 0xACF6, 0xACFC,\n    0xACFD, 0xAD00, 0xAD04, 0xAD06, 0xAD0C, 0xAD0D, 0xAD0F, 0xAD11,\n    0xAD18, 0xAD1C, 0xAD20, 0xAD29, 0xAD2C, 0xAD2D, 0xAD34, 0xAD35,\n    0xAD38, 0xAD3C, 0xAD44, 0xAD45, 0xAD47, 0xAD49, 0xAD50, 0xAD54,\n    0xAD58, 0xAD61, 0xAD63, 0xAD6C, 0xAD6D, 0xAD70, 0xAD73, 0xAD74,\n    0xAD75, 0xAD76, 0xAD7B, 0xAD7C, 0xAD7D, 0xAD7F, 0xAD81, 0xAD82,\n    0xAD88, 0xAD89, 0xAD8C, 0xAD90, 0xAD9C, 0xAD9D, 0xADA4, 0xADB7,\n    0xADC0, 0xADC1, 0xADC4, 0xADC8, 0xADD0, 0xADD1, 0xADD3, 0xADDC,\n    0xADE0, 0xADE4, 0xADF8, 0xADF9, 0xADFC, 0xADFF, 0xAE00, 0xAE01,\n    0xAE08, 0xAE09, 0xAE0B, 0xAE0D, 0xAE14, 0xAE30, 0xAE31, 0xAE34,\n    0xAE37, 0xAE38, 0xAE3A, 0xAE40, 0xAE41, 0xAE43, 0xAE45, 0xAE46,\n    0xAE4A, 0xAE4C, 0xAE4D, 0xAE4E, 0xAE50, 0xAE54, 0xAE56, 0xAE5C,\n    0xAE5D, 0xAE5F, 0xAE60, 0xAE61, 0xAE65, 0xAE68, 0xAE69, 0xAE6C,\n    0xAE70, 0xAE78, 0xAE79, 0xAE7B, 0xAE7C, 0xAE7D, 0xAE84, 0xAE85,\n    0xAE8C, 0xAEBC, 0xAEBD, 0xAEBE, 0xAEC0, 0xAEC4, 0xAECC, 0xAECD,\n    0xAECF, 0xAED0, 0xAED1, 0xAED8, 0xAED9, 0xAEDC, 0xAEE8, 0xAEEB,\n    0xAEED, 0xAEF4, 0xAEF8, 0xAEFC, 0xAF07, 0xAF08, 0xAF0D, 0xAF10,\n    0xAF2C, 0xAF2D, 0xAF30, 0xAF32, 0xAF34, 0xAF3C, 0xAF3D, 0xAF3F,\n    0xAF41, 0xAF42, 0xAF43, 0xAF48, 0xAF49, 0xAF50, 0xAF5C, 0xAF5D,\n    0xAF64, 0xAF65, 0xAF79, 0xAF80, 0xAF84, 0xAF88, 0xAF90, 0xAF91,\n    0xAF95, 0xAF9C, 0xAFB8, 0xAFB9, 0xAFBC, 0xAFC0, 0xAFC7, 0xAFC8,\n    0xAFC9, 0xAFCB, 0xAFCD, 0xAFCE, 0xAFD4, 0xAFDC, 0xAFE8, 0xAFE9,\n    0xAFF0, 0xAFF1, 0xAFF4, 0xAFF8, 0xB000, 0xB001, 0xB004, 0xB00C,\n    0xB010, 0xB014, 0xB01C, 0xB01D, 0xB028, 0xB044, 0xB045, 0xB048,\n    0xB04A, 0xB04C, 0xB04E, 0xB053, 0xB054, 0xB055, 0xB057, 0xB059,\n    0xB05D, 0xB07C, 0xB07D, 0xB080, 0xB084, 0xB08C, 0xB08D, 0xB08F,\n    0xB091, 0xB098, 0xB099, 0xB09A, 0xB09C, 0xB09F, 0xB0A0, 0xB0A1,\n    0xB0A2, 0xB0A8, 0xB0A9, 0xB0AB, 0xB0AC, 0xB0AD, 0xB0AE, 0xB0AF,\n    0xB0B1, 0xB0B3, 0xB0B4, 0xB0B5, 0xB0B8, 0xB0BC, 0xB0C4, 0xB0C5,\n    0xB0C7, 0xB0C8, 0xB0C9, 0xB0D0, 0xB0D1, 0xB0D4, 0xB0D8, 0xB0E0,\n    0xB0E5, 0xB108, 0xB109, 0xB10B, 0xB10C, 0xB110, 0xB112, 0xB113,\n    0xB118, 0xB119, 0xB11B, 0xB11C, 0xB11D, 0xB123, 0xB124, 0xB125,\n    0xB128, 0xB12C, 0xB134, 0xB135, 0xB137, 0xB138, 0xB139, 0xB140,\n    0xB141, 0xB144, 0xB148, 0xB150, 0xB151, 0xB154, 0xB155, 0xB158,\n    0xB15C, 0xB160, 0xB178, 0xB179, 0xB17C, 0xB180, 0xB182, 0xB188,\n    0xB189, 0xB18B, 0xB18D, 0xB192, 0xB193, 0xB194, 0xB198, 0xB19C,\n    0xB1A8, 0xB1CC, 0xB1D0, 0xB1D4, 0xB1DC, 0xB1DD, 0xB1DF, 0xB1E8,\n    0xB1E9, 0xB1EC, 0xB1F0, 0xB1F9, 0xB1FB, 0xB1FD, 0xB204, 0xB205,\n    0xB208, 0xB20B, 0xB20C, 0xB214, 0xB215, 0xB217, 0xB219, 0xB220,\n    0xB234, 0xB23C, 0xB258, 0xB25C, 0xB260, 0xB268, 0xB269, 0xB274,\n    0xB275, 0xB27C, 0xB284, 0xB285, 0xB289, 0xB290, 0xB291, 0xB294,\n    0xB298, 0xB299, 0xB29A, 0xB2A0, 0xB2A1, 0xB2A3, 0xB2A5, 0xB2A6,\n    0xB2AA, 0xB2AC, 0xB2B0, 0xB2B4, 0xB2C8, 0xB2C9, 0xB2CC, 0xB2D0,\n    0xB2D2, 0xB2D8, 0xB2D9, 0xB2DB, 0xB2DD, 0xB2E2, 0xB2E4, 0xB2E5,\n    0xB2E6, 0xB2E8, 0xB2EB, 0xB2EC, 0xB2ED, 0xB2EE, 0xB2EF, 0xB2F3,\n    0xB2F4, 0xB2F5, 0xB2F7, 0xB2F8, 0xB2F9, 0xB2FA, 0xB2FB, 0xB2FF,\n    0xB300, 0xB301, 0xB304, 0xB308, 0xB310, 0xB311, 0xB313, 0xB314,\n    0xB315, 0xB31C, 0xB354, 0xB355, 0xB356, 0xB358, 0xB35B, 0xB35C,\n    0xB35E, 0xB35F, 0xB364, 0xB365, 0xB367, 0xB369, 0xB36B, 0xB36E,\n    0xB370, 0xB371, 0xB374, 0xB378, 0xB380, 0xB381, 0xB383, 0xB384,\n    0xB385, 0xB38C, 0xB390, 0xB394, 0xB3A0, 0xB3A1, 0xB3A8, 0xB3AC,\n    0xB3C4, 0xB3C5, 0xB3C8, 0xB3CB, 0xB3CC, 0xB3CE, 0xB3D0, 0xB3D4,\n    0xB3D5, 0xB3D7, 0xB3D9, 0xB3DB, 0xB3DD, 0xB3E0, 0xB3E4, 0xB3E8,\n    0xB3FC, 0xB410, 0xB418, 0xB41C, 0xB420, 0xB428, 0xB429, 0xB42B,\n    0xB434, 0xB450, 0xB451, 0xB454, 0xB458, 0xB460, 0xB461, 0xB463,\n    0xB465, 0xB46C, 0xB480, 0xB488, 0xB49D, 0xB4A4, 0xB4A8, 0xB4AC,\n    0xB4B5, 0xB4B7, 0xB4B9, 0xB4C0, 0xB4C4, 0xB4C8, 0xB4D0, 0xB4D5,\n    0xB4DC, 0xB4DD, 0xB4E0, 0xB4E3, 0xB4E4, 0xB4E6, 0xB4EC, 0xB4ED,\n    0xB4EF, 0xB4F1, 0xB4F8, 0xB514, 0xB515, 0xB518, 0xB51B, 0xB51C,\n    0xB524, 0xB525, 0xB527, 0xB528, 0xB529, 0xB52A, 0xB530, 0xB531,\n    0xB534, 0xB538, 0xB540, 0xB541, 0xB543, 0xB544, 0xB545, 0xB54B,\n    0xB54C, 0xB54D, 0xB550, 0xB554, 0xB55C, 0xB55D, 0xB55F, 0xB560,\n    0xB561, 0xB5A0, 0xB5A1, 0xB5A4, 0xB5A8, 0xB5AA, 0xB5AB, 0xB5B0,\n    0xB5B1, 0xB5B3, 0xB5B4, 0xB5B5, 0xB5BB, 0xB5BC, 0xB5BD, 0xB5C0,\n    0xB5C4, 0xB5CC, 0xB5CD, 0xB5CF, 0xB5D0, 0xB5D1, 0xB5D8, 0xB5EC,\n    0xB610, 0xB611, 0xB614, 0xB618, 0xB625, 0xB62C, 0xB634, 0xB648,\n    0xB664, 0xB668, 0xB69C, 0xB69D, 0xB6A0, 0xB6A4, 0xB6AB, 0xB6AC,\n    0xB6B1, 0xB6D4, 0xB6F0, 0xB6F4, 0xB6F8, 0xB700, 0xB701, 0xB705,\n    0xB728, 0xB729, 0xB72C, 0xB72F, 0xB730, 0xB738, 0xB739, 0xB73B,\n    0xB744, 0xB748, 0xB74C, 0xB754, 0xB755, 0xB760, 0xB764, 0xB768,\n    0xB770, 0xB771, 0xB773, 0xB775, 0xB77C, 0xB77D, 0xB780, 0xB784,\n    0xB78C, 0xB78D, 0xB78F, 0xB790, 0xB791, 0xB792, 0xB796, 0xB797,\n    0xB798, 0xB799, 0xB79C, 0xB7A0, 0xB7A8, 0xB7A9, 0xB7AB, 0xB7AC,\n    0xB7AD, 0xB7B4, 0xB7B5, 0xB7B8, 0xB7C7, 0xB7C9, 0xB7EC, 0xB7ED,\n    0xB7F0, 0xB7F4, 0xB7FC, 0xB7FD, 0xB7FF, 0xB800, 0xB801, 0xB807,\n    0xB808, 0xB809, 0xB80C, 0xB810, 0xB818, 0xB819, 0xB81B, 0xB81D,\n    0xB824, 0xB825, 0xB828, 0xB82C, 0xB834, 0xB835, 0xB837, 0xB838,\n    0xB839, 0xB840, 0xB844, 0xB851, 0xB853, 0xB85C, 0xB85D, 0xB860,\n    0xB864, 0xB86C, 0xB86D, 0xB86F, 0xB871, 0xB878, 0xB87C, 0xB88D,\n    0xB8A8, 0xB8B0, 0xB8B4, 0xB8B8, 0xB8C0, 0xB8C1, 0xB8C3, 0xB8C5,\n    0xB8CC, 0xB8D0, 0xB8D4, 0xB8DD, 0xB8DF, 0xB8E1, 0xB8E8, 0xB8E9,\n    0xB8EC, 0xB8F0, 0xB8F8, 0xB8F9, 0xB8FB, 0xB8FD, 0xB904, 0xB918,\n    0xB920, 0xB93C, 0xB93D, 0xB940, 0xB944, 0xB94C, 0xB94F, 0xB951,\n    0xB958, 0xB959, 0xB95C, 0xB960, 0xB968, 0xB969, 0xB96B, 0xB96D,\n    0xB974, 0xB975, 0xB978, 0xB97C, 0xB984, 0xB985, 0xB987, 0xB989,\n    0xB98A, 0xB98D, 0xB98E, 0xB9AC, 0xB9AD, 0xB9B0, 0xB9B4, 0xB9BC,\n    0xB9BD, 0xB9BF, 0xB9C1, 0xB9C8, 0xB9C9, 0xB9CC, 0xB9CE, 0xB9CF,\n    0xB9D0, 0xB9D1, 0xB9D2, 0xB9D8, 0xB9D9, 0xB9DB, 0xB9DD, 0xB9DE,\n    0xB9E1, 0xB9E3, 0xB9E4, 0xB9E5, 0xB9E8, 0xB9EC, 0xB9F4, 0xB9F5,\n    0xB9F7, 0xB9F8, 0xB9F9, 0xB9FA, 0xBA00, 0xBA01, 0xBA08, 0xBA15,\n    0xBA38, 0xBA39, 0xBA3C, 0xBA40, 0xBA42, 0xBA48, 0xBA49, 0xBA4B,\n    0xBA4D, 0xBA4E, 0xBA53, 0xBA54, 0xBA55, 0xBA58, 0xBA5C, 0xBA64,\n    0xBA65, 0xBA67, 0xBA68, 0xBA69, 0xBA70, 0xBA71, 0xBA74, 0xBA78,\n    0xBA83, 0xBA84, 0xBA85, 0xBA87, 0xBA8C, 0xBAA8, 0xBAA9, 0xBAAB,\n    0xBAAC, 0xBAB0, 0xBAB2, 0xBAB8, 0xBAB9, 0xBABB, 0xBABD, 0xBAC4,\n    0xBAC8, 0xBAD8, 0xBAD9, 0xBAFC, 0xBB00, 0xBB04, 0xBB0D, 0xBB0F,\n    0xBB11, 0xBB18, 0xBB1C, 0xBB20, 0xBB29, 0xBB2B, 0xBB34, 0xBB35,\n    0xBB36, 0xBB38, 0xBB3B, 0xBB3C, 0xBB3D, 0xBB3E, 0xBB44, 0xBB45,\n    0xBB47, 0xBB49, 0xBB4D, 0xBB4F, 0xBB50, 0xBB54, 0xBB58, 0xBB61,\n    0xBB63, 0xBB6C, 0xBB88, 0xBB8C, 0xBB90, 0xBBA4, 0xBBA8, 0xBBAC,\n    0xBBB4, 0xBBB7, 0xBBC0, 0xBBC4, 0xBBC8, 0xBBD0, 0xBBD3, 0xBBF8,\n    0xBBF9, 0xBBFC, 0xBBFF, 0xBC00, 0xBC02, 0xBC08, 0xBC09, 0xBC0B,\n    0xBC0C, 0xBC0D, 0xBC0F, 0xBC11, 0xBC14, 0xBC15, 0xBC16, 0xBC17,\n    0xBC18, 0xBC1B, 0xBC1C, 0xBC1D, 0xBC1E, 0xBC1F, 0xBC24, 0xBC25,\n    0xBC27, 0xBC29, 0xBC2D, 0xBC30, 0xBC31, 0xBC34, 0xBC38, 0xBC40,\n    0xBC41, 0xBC43, 0xBC44, 0xBC45, 0xBC49, 0xBC4C, 0xBC4D, 0xBC50,\n    0xBC5D, 0xBC84, 0xBC85, 0xBC88, 0xBC8B, 0xBC8C, 0xBC8E, 0xBC94,\n    0xBC95, 0xBC97, 0xBC99, 0xBC9A, 0xBCA0, 0xBCA1, 0xBCA4, 0xBCA7,\n    0xBCA8, 0xBCB0, 0xBCB1, 0xBCB3, 0xBCB4, 0xBCB5, 0xBCBC, 0xBCBD,\n    0xBCC0, 0xBCC4, 0xBCCD, 0xBCCF, 0xBCD0, 0xBCD1, 0xBCD5, 0xBCD8,\n    0xBCDC, 0xBCF4, 0xBCF5, 0xBCF6, 0xBCF8, 0xBCFC, 0xBD04, 0xBD05,\n    0xBD07, 0xBD09, 0xBD10, 0xBD14, 0xBD24, 0xBD2C, 0xBD40, 0xBD48,\n    0xBD49, 0xBD4C, 0xBD50, 0xBD58, 0xBD59, 0xBD64, 0xBD68, 0xBD80,\n    0xBD81, 0xBD84, 0xBD87, 0xBD88, 0xBD89, 0xBD8A, 0xBD90, 0xBD91,\n    0xBD93, 0xBD95, 0xBD99, 0xBD9A, 0xBD9C, 0xBDA4, 0xBDB0, 0xBDB8,\n    0xBDD4, 0xBDD5, 0xBDD8, 0xBDDC, 0xBDE9, 0xBDF0, 0xBDF4, 0xBDF8,\n    0xBE00, 0xBE03, 0xBE05, 0xBE0C, 0xBE0D, 0xBE10, 0xBE14, 0xBE1C,\n    0xBE1D, 0xBE1F, 0xBE44, 0xBE45, 0xBE48, 0xBE4C, 0xBE4E, 0xBE54,\n    0xBE55, 0xBE57, 0xBE59, 0xBE5A, 0xBE5B, 0xBE60, 0xBE61, 0xBE64,\n    0xBE68, 0xBE6A, 0xBE70, 0xBE71, 0xBE73, 0xBE74, 0xBE75, 0xBE7B,\n    0xBE7C, 0xBE7D, 0xBE80, 0xBE84, 0xBE8C, 0xBE8D, 0xBE8F, 0xBE90,\n    0xBE91, 0xBE98, 0xBE99, 0xBEA8, 0xBED0, 0xBED1, 0xBED4, 0xBED7,\n    0xBED8, 0xBEE0, 0xBEE3, 0xBEE4, 0xBEE5, 0xBEEC, 0xBF01, 0xBF08,\n    0xBF09, 0xBF18, 0xBF19, 0xBF1B, 0xBF1C, 0xBF1D, 0xBF40, 0xBF41,\n    0xBF44, 0xBF48, 0xBF50, 0xBF51, 0xBF55, 0xBF94, 0xBFB0, 0xBFC5,\n    0xBFCC, 0xBFCD, 0xBFD0, 0xBFD4, 0xBFDC, 0xBFDF, 0xBFE1, 0xC03C,\n    0xC051, 0xC058, 0xC05C, 0xC060, 0xC068, 0xC069, 0xC090, 0xC091,\n    0xC094, 0xC098, 0xC0A0, 0xC0A1, 0xC0A3, 0xC0A5, 0xC0AC, 0xC0AD,\n    0xC0AF, 0xC0B0, 0xC0B3, 0xC0B4, 0xC0B5, 0xC0B6, 0xC0BC, 0xC0BD,\n    0xC0BF, 0xC0C0, 0xC0C1, 0xC0C5, 0xC0C8, 0xC0C9, 0xC0CC, 0xC0D0,\n    0xC0D8, 0xC0D9, 0xC0DB, 0xC0DC, 0xC0DD, 0xC0E4, 0xC0E5, 0xC0E8,\n    0xC0EC, 0xC0F4, 0xC0F5, 0xC0F7, 0xC0F9, 0xC100, 0xC104, 0xC108,\n    0xC110, 0xC115, 0xC11C, 0xC11D, 0xC11E, 0xC11F, 0xC120, 0xC123,\n    0xC124, 0xC126, 0xC127, 0xC12C, 0xC12D, 0xC12F, 0xC130, 0xC131,\n    0xC136, 0xC138, 0xC139, 0xC13C, 0xC140, 0xC148, 0xC149, 0xC14B,\n    0xC14C, 0xC14D, 0xC154, 0xC155, 0xC158, 0xC15C, 0xC164, 0xC165,\n    0xC167, 0xC168, 0xC169, 0xC170, 0xC174, 0xC178, 0xC185, 0xC18C,\n    0xC18D, 0xC18E, 0xC190, 0xC194, 0xC196, 0xC19C, 0xC19D, 0xC19F,\n    0xC1A1, 0xC1A5, 0xC1A8, 0xC1A9, 0xC1AC, 0xC1B0, 0xC1BD, 0xC1C4,\n    0xC1C8, 0xC1CC, 0xC1D4, 0xC1D7, 0xC1D8, 0xC1E0, 0xC1E4, 0xC1E8,\n    0xC1F0, 0xC1F1, 0xC1F3, 0xC1FC, 0xC1FD, 0xC200, 0xC204, 0xC20C,\n    0xC20D, 0xC20F, 0xC211, 0xC218, 0xC219, 0xC21C, 0xC21F, 0xC220,\n    0xC228, 0xC229, 0xC22B, 0xC22D, 0xC22F, 0xC231, 0xC232, 0xC234,\n    0xC248, 0xC250, 0xC251, 0xC254, 0xC258, 0xC260, 0xC265, 0xC26C,\n    0xC26D, 0xC270, 0xC274, 0xC27C, 0xC27D, 0xC27F, 0xC281, 0xC288,\n    0xC289, 0xC290, 0xC298, 0xC29B, 0xC29D, 0xC2A4, 0xC2A5, 0xC2A8,\n    0xC2AC, 0xC2AD, 0xC2B4, 0xC2B5, 0xC2B7, 0xC2B9, 0xC2DC, 0xC2DD,\n    0xC2E0, 0xC2E3, 0xC2E4, 0xC2EB, 0xC2EC, 0xC2ED, 0xC2EF, 0xC2F1,\n    0xC2F6, 0xC2F8, 0xC2F9, 0xC2FB, 0xC2FC, 0xC300, 0xC308, 0xC309,\n    0xC30C, 0xC30D, 0xC313, 0xC314, 0xC315, 0xC318, 0xC31C, 0xC324,\n    0xC325, 0xC328, 0xC329, 0xC345, 0xC368, 0xC369, 0xC36C, 0xC370,\n    0xC372, 0xC378, 0xC379, 0xC37C, 0xC37D, 0xC384, 0xC388, 0xC38C,\n    0xC3C0, 0xC3D8, 0xC3D9, 0xC3DC, 0xC3DF, 0xC3E0, 0xC3E2, 0xC3E8,\n    0xC3E9, 0xC3ED, 0xC3F4, 0xC3F5, 0xC3F8, 0xC408, 0xC410, 0xC424,\n    0xC42C, 0xC430, 0xC434, 0xC43C, 0xC43D, 0xC448, 0xC464, 0xC465,\n    0xC468, 0xC46C, 0xC474, 0xC475, 0xC479, 0xC480, 0xC494, 0xC49C,\n    0xC4B8, 0xC4BC, 0xC4E9, 0xC4F0, 0xC4F1, 0xC4F4, 0xC4F8, 0xC4FA,\n    0xC4FF, 0xC500, 0xC501, 0xC50C, 0xC510, 0xC514, 0xC51C, 0xC528,\n    0xC529, 0xC52C, 0xC530, 0xC538, 0xC539, 0xC53B, 0xC53D, 0xC544,\n    0xC545, 0xC548, 0xC549, 0xC54A, 0xC54C, 0xC54D, 0xC54E, 0xC553,\n    0xC554, 0xC555, 0xC557, 0xC558, 0xC559, 0xC55D, 0xC55E, 0xC560,\n    0xC561, 0xC564, 0xC568, 0xC570, 0xC571, 0xC573, 0xC574, 0xC575,\n    0xC57C, 0xC57D, 0xC580, 0xC584, 0xC587, 0xC58C, 0xC58D, 0xC58F,\n    0xC591, 0xC595, 0xC597, 0xC598, 0xC59C, 0xC5A0, 0xC5A9, 0xC5B4,\n    0xC5B5, 0xC5B8, 0xC5B9, 0xC5BB, 0xC5BC, 0xC5BD, 0xC5BE, 0xC5C4,\n    0xC5C5, 0xC5C6, 0xC5C7, 0xC5C8, 0xC5C9, 0xC5CA, 0xC5CC, 0xC5CE,\n    0xC5D0, 0xC5D1, 0xC5D4, 0xC5D8, 0xC5E0, 0xC5E1, 0xC5E3, 0xC5E5,\n    0xC5EC, 0xC5ED, 0xC5EE, 0xC5F0, 0xC5F4, 0xC5F6, 0xC5F7, 0xC5FC,\n    0xC5FD, 0xC5FE, 0xC5FF, 0xC600, 0xC601, 0xC605, 0xC606, 0xC607,\n    0xC608, 0xC60C, 0xC610, 0xC618, 0xC619, 0xC61B, 0xC61C, 0xC624,\n    0xC625, 0xC628, 0xC62C, 0xC62D, 0xC62E, 0xC630, 0xC633, 0xC634,\n    0xC635, 0xC637, 0xC639, 0xC63B, 0xC640, 0xC641, 0xC644, 0xC648,\n    0xC650, 0xC651, 0xC653, 0xC654, 0xC655, 0xC65C, 0xC65D, 0xC660,\n    0xC66C, 0xC66F, 0xC671, 0xC678, 0xC679, 0xC67C, 0xC680, 0xC688,\n    0xC689, 0xC68B, 0xC68D, 0xC694, 0xC695, 0xC698, 0xC69C, 0xC6A4,\n    0xC6A5, 0xC6A7, 0xC6A9, 0xC6B0, 0xC6B1, 0xC6B4, 0xC6B8, 0xC6B9,\n    0xC6BA, 0xC6C0, 0xC6C1, 0xC6C3, 0xC6C5, 0xC6CC, 0xC6CD, 0xC6D0,\n    0xC6D4, 0xC6DC, 0xC6DD, 0xC6E0, 0xC6E1, 0xC6E8, 0xC6E9, 0xC6EC,\n    0xC6F0, 0xC6F8, 0xC6F9, 0xC6FD, 0xC704, 0xC705, 0xC708, 0xC70C,\n    0xC714, 0xC715, 0xC717, 0xC719, 0xC720, 0xC721, 0xC724, 0xC728,\n    0xC730, 0xC731, 0xC733, 0xC735, 0xC737, 0xC73C, 0xC73D, 0xC740,\n    0xC744, 0xC74A, 0xC74C, 0xC74D, 0xC74F, 0xC751, 0xC752, 0xC753,\n    0xC754, 0xC755, 0xC756, 0xC757, 0xC758, 0xC75C, 0xC760, 0xC768,\n    0xC76B, 0xC774, 0xC775, 0xC778, 0xC77C, 0xC77D, 0xC77E, 0xC783,\n    0xC784, 0xC785, 0xC787, 0xC788, 0xC789, 0xC78A, 0xC78E, 0xC790,\n    0xC791, 0xC794, 0xC796, 0xC797, 0xC798, 0xC79A, 0xC7A0, 0xC7A1,\n    0xC7A3, 0xC7A4, 0xC7A5, 0xC7A6, 0xC7AC, 0xC7AD, 0xC7B0, 0xC7B4,\n    0xC7BC, 0xC7BD, 0xC7BF, 0xC7C0, 0xC7C1, 0xC7C8, 0xC7C9, 0xC7CC,\n    0xC7CE, 0xC7D0, 0xC7D8, 0xC7DD, 0xC7E4, 0xC7E8, 0xC7EC, 0xC800,\n    0xC801, 0xC804, 0xC808, 0xC80A, 0xC810, 0xC811, 0xC813, 0xC815,\n    0xC816, 0xC81C, 0xC81D, 0xC820, 0xC824, 0xC82C, 0xC82D, 0xC82F,\n    0xC831, 0xC838, 0xC83C, 0xC840, 0xC848, 0xC849, 0xC84C, 0xC84D,\n    0xC854, 0xC870, 0xC871, 0xC874, 0xC878, 0xC87A, 0xC880, 0xC881,\n    0xC883, 0xC885, 0xC886, 0xC887, 0xC88B, 0xC88C, 0xC88D, 0xC894,\n    0xC89D, 0xC89F, 0xC8A1, 0xC8A8, 0xC8BC, 0xC8BD, 0xC8C4, 0xC8C8,\n    0xC8CC, 0xC8D4, 0xC8D5, 0xC8D7, 0xC8D9, 0xC8E0, 0xC8E1, 0xC8E4,\n    0xC8F5, 0xC8FC, 0xC8FD, 0xC900, 0xC904, 0xC905, 0xC906, 0xC90C,\n    0xC90D, 0xC90F, 0xC911, 0xC918, 0xC92C, 0xC934, 0xC950, 0xC951,\n    0xC954, 0xC958, 0xC960, 0xC961, 0xC963, 0xC96C, 0xC970, 0xC974,\n    0xC97C, 0xC988, 0xC989, 0xC98C, 0xC990, 0xC998, 0xC999, 0xC99B,\n    0xC99D, 0xC9C0, 0xC9C1, 0xC9C4, 0xC9C7, 0xC9C8, 0xC9CA, 0xC9D0,\n    0xC9D1, 0xC9D3, 0xC9D5, 0xC9D6, 0xC9D9, 0xC9DA, 0xC9DC, 0xC9DD,\n    0xC9E0, 0xC9E2, 0xC9E4, 0xC9E7, 0xC9EC, 0xC9ED, 0xC9EF, 0xC9F0,\n    0xC9F1, 0xC9F8, 0xC9F9, 0xC9FC, 0xCA00, 0xCA08, 0xCA09, 0xCA0B,\n    0xCA0C, 0xCA0D, 0xCA14, 0xCA18, 0xCA29, 0xCA4C, 0xCA4D, 0xCA50,\n    0xCA54, 0xCA5C, 0xCA5D, 0xCA5F, 0xCA60, 0xCA61, 0xCA68, 0xCA7D,\n    0xCA84, 0xCA98, 0xCABC, 0xCABD, 0xCAC0, 0xCAC4, 0xCACC, 0xCACD,\n    0xCACF, 0xCAD1, 0xCAD3, 0xCAD8, 0xCAD9, 0xCAE0, 0xCAEC, 0xCAF4,\n    0xCB08, 0xCB10, 0xCB14, 0xCB18, 0xCB20, 0xCB21, 0xCB41, 0xCB48,\n    0xCB49, 0xCB4C, 0xCB50, 0xCB58, 0xCB59, 0xCB5D, 0xCB64, 0xCB78,\n    0xCB79, 0xCB9C, 0xCBB8, 0xCBD4, 0xCBE4, 0xCBE7, 0xCBE9, 0xCC0C,\n    0xCC0D, 0xCC10, 0xCC14, 0xCC1C, 0xCC1D, 0xCC21, 0xCC22, 0xCC27,\n    0xCC28, 0xCC29, 0xCC2C, 0xCC2E, 0xCC30, 0xCC38, 0xCC39, 0xCC3B,\n    0xCC3C, 0xCC3D, 0xCC3E, 0xCC44, 0xCC45, 0xCC48, 0xCC4C, 0xCC54,\n    0xCC55, 0xCC57, 0xCC58, 0xCC59, 0xCC60, 0xCC64, 0xCC66, 0xCC68,\n    0xCC70, 0xCC75, 0xCC98, 0xCC99, 0xCC9C, 0xCCA0, 0xCCA8, 0xCCA9,\n    0xCCAB, 0xCCAC, 0xCCAD, 0xCCB4, 0xCCB5, 0xCCB8, 0xCCBC, 0xCCC4,\n    0xCCC5, 0xCCC7, 0xCCC9, 0xCCD0, 0xCCD4, 0xCCE4, 0xCCEC, 0xCCF0,\n    0xCD01, 0xCD08, 0xCD09, 0xCD0C, 0xCD10, 0xCD18, 0xCD19, 0xCD1B,\n    0xCD1D, 0xCD24, 0xCD28, 0xCD2C, 0xCD39, 0xCD5C, 0xCD60, 0xCD64,\n    0xCD6C, 0xCD6D, 0xCD6F, 0xCD71, 0xCD78, 0xCD88, 0xCD94, 0xCD95,\n    0xCD98, 0xCD9C, 0xCDA4, 0xCDA5, 0xCDA7, 0xCDA9, 0xCDB0, 0xCDC4,\n    0xCDCC, 0xCDD0, 0xCDE8, 0xCDEC, 0xCDF0, 0xCDF8, 0xCDF9, 0xCDFB,\n    0xCDFD, 0xCE04, 0xCE08, 0xCE0C, 0xCE14, 0xCE19, 0xCE20, 0xCE21,\n    0xCE24, 0xCE28, 0xCE30, 0xCE31, 0xCE33, 0xCE35, 0xCE58, 0xCE59,\n    0xCE5C, 0xCE5F, 0xCE60, 0xCE61, 0xCE68, 0xCE69, 0xCE6B, 0xCE6D,\n    0xCE74, 0xCE75, 0xCE78, 0xCE7C, 0xCE84, 0xCE85, 0xCE87, 0xCE89,\n    0xCE90, 0xCE91, 0xCE94, 0xCE98, 0xCEA0, 0xCEA1, 0xCEA3, 0xCEA4,\n    0xCEA5, 0xCEAC, 0xCEAD, 0xCEC1, 0xCEE4, 0xCEE5, 0xCEE8, 0xCEEB,\n    0xCEEC, 0xCEF4, 0xCEF5, 0xCEF7, 0xCEF8, 0xCEF9, 0xCF00, 0xCF01,\n    0xCF04, 0xCF08, 0xCF10, 0xCF11, 0xCF13, 0xCF15, 0xCF1C, 0xCF20,\n    0xCF24, 0xCF2C, 0xCF2D, 0xCF2F, 0xCF30, 0xCF31, 0xCF38, 0xCF54,\n    0xCF55, 0xCF58, 0xCF5C, 0xCF64, 0xCF65, 0xCF67, 0xCF69, 0xCF70,\n    0xCF71, 0xCF74, 0xCF78, 0xCF80, 0xCF85, 0xCF8C, 0xCFA1, 0xCFA8,\n    0xCFB0, 0xCFC4, 0xCFE0, 0xCFE1, 0xCFE4, 0xCFE8, 0xCFF0, 0xCFF1,\n    0xCFF3, 0xCFF5, 0xCFFC, 0xD000, 0xD004, 0xD011, 0xD018, 0xD02D,\n    0xD034, 0xD035, 0xD038, 0xD03C, 0xD044, 0xD045, 0xD047, 0xD049,\n    0xD050, 0xD054, 0xD058, 0xD060, 0xD06C, 0xD06D, 0xD070, 0xD074,\n    0xD07C, 0xD07D, 0xD081, 0xD0A4, 0xD0A5, 0xD0A8, 0xD0AC, 0xD0B4,\n    0xD0B5, 0xD0B7, 0xD0B9, 0xD0C0, 0xD0C1, 0xD0C4, 0xD0C8, 0xD0C9,\n    0xD0D0, 0xD0D1, 0xD0D3, 0xD0D4, 0xD0D5, 0xD0DC, 0xD0DD, 0xD0E0,\n    0xD0E4, 0xD0EC, 0xD0ED, 0xD0EF, 0xD0F0, 0xD0F1, 0xD0F8, 0xD10D,\n    0xD130, 0xD131, 0xD134, 0xD138, 0xD13A, 0xD140, 0xD141, 0xD143,\n    0xD144, 0xD145, 0xD14C, 0xD14D, 0xD150, 0xD154, 0xD15C, 0xD15D,\n    0xD15F, 0xD161, 0xD168, 0xD16C, 0xD17C, 0xD184, 0xD188, 0xD1A0,\n    0xD1A1, 0xD1A4, 0xD1A8, 0xD1B0, 0xD1B1, 0xD1B3, 0xD1B5, 0xD1BA,\n    0xD1BC, 0xD1C0, 0xD1D8, 0xD1F4, 0xD1F8, 0xD207, 0xD209, 0xD210,\n    0xD22C, 0xD22D, 0xD230, 0xD234, 0xD23C, 0xD23D, 0xD23F, 0xD241,\n    0xD248, 0xD25C, 0xD264, 0xD280, 0xD281, 0xD284, 0xD288, 0xD290,\n    0xD291, 0xD295, 0xD29C, 0xD2A0, 0xD2A4, 0xD2AC, 0xD2B1, 0xD2B8,\n    0xD2B9, 0xD2BC, 0xD2BF, 0xD2C0, 0xD2C2, 0xD2C8, 0xD2C9, 0xD2CB,\n    0xD2D4, 0xD2D8, 0xD2DC, 0xD2E4, 0xD2E5, 0xD2F0, 0xD2F1, 0xD2F4,\n    0xD2F8, 0xD300, 0xD301, 0xD303, 0xD305, 0xD30C, 0xD30D, 0xD30E,\n    0xD310, 0xD314, 0xD316, 0xD31C, 0xD31D, 0xD31F, 0xD320, 0xD321,\n    0xD325, 0xD328, 0xD329, 0xD32C, 0xD330, 0xD338, 0xD339, 0xD33B,\n    0xD33C, 0xD33D, 0xD344, 0xD345, 0xD37C, 0xD37D, 0xD380, 0xD384,\n    0xD38C, 0xD38D, 0xD38F, 0xD390, 0xD391, 0xD398, 0xD399, 0xD39C,\n    0xD3A0, 0xD3A8, 0xD3A9, 0xD3AB, 0xD3AD, 0xD3B4, 0xD3B8, 0xD3BC,\n    0xD3C4, 0xD3C5, 0xD3C8, 0xD3C9, 0xD3D0, 0xD3D8, 0xD3E1, 0xD3E3,\n    0xD3EC, 0xD3ED, 0xD3F0, 0xD3F4, 0xD3FC, 0xD3FD, 0xD3FF, 0xD401,\n    0xD408, 0xD41D, 0xD440, 0xD444, 0xD45C, 0xD460, 0xD464, 0xD46D,\n    0xD46F, 0xD478, 0xD479, 0xD47C, 0xD47F, 0xD480, 0xD482, 0xD488,\n    0xD489, 0xD48B, 0xD48D, 0xD494, 0xD4A9, 0xD4CC, 0xD4D0, 0xD4D4,\n    0xD4DC, 0xD4DF, 0xD4E8, 0xD4EC, 0xD4F0, 0xD4F8, 0xD4FB, 0xD4FD,\n    0xD504, 0xD508, 0xD50C, 0xD514, 0xD515, 0xD517, 0xD53C, 0xD53D,\n    0xD540, 0xD544, 0xD54C, 0xD54D, 0xD54F, 0xD551, 0xD558, 0xD559,\n    0xD55C, 0xD560, 0xD565, 0xD568, 0xD569, 0xD56B, 0xD56D, 0xD574,\n    0xD575, 0xD578, 0xD57C, 0xD584, 0xD585, 0xD587, 0xD588, 0xD589,\n    0xD590, 0xD5A5, 0xD5C8, 0xD5C9, 0xD5CC, 0xD5D0, 0xD5D2, 0xD5D8,\n    0xD5D9, 0xD5DB, 0xD5DD, 0xD5E4, 0xD5E5, 0xD5E8, 0xD5EC, 0xD5F4,\n    0xD5F5, 0xD5F7, 0xD5F9, 0xD600, 0xD601, 0xD604, 0xD608, 0xD610,\n    0xD611, 0xD613, 0xD614, 0xD615, 0xD61C, 0xD620, 0xD624, 0xD62D,\n    0xD638, 0xD639, 0xD63C, 0xD640, 0xD645, 0xD648, 0xD649, 0xD64B,\n    0xD64D, 0xD651, 0xD654, 0xD655, 0xD658, 0xD65C, 0xD667, 0xD669,\n    0xD670, 0xD671, 0xD674, 0xD683, 0xD685, 0xD68C, 0xD68D, 0xD690,\n    0xD694, 0xD69D, 0xD69F, 0xD6A1, 0xD6A8, 0xD6AC, 0xD6B0, 0xD6B9,\n    0xD6BB, 0xD6C4, 0xD6C5, 0xD6C8, 0xD6CC, 0xD6D1, 0xD6D4, 0xD6D7,\n    0xD6D9, 0xD6E0, 0xD6E4, 0xD6E8, 0xD6F0, 0xD6F5, 0xD6FC, 0xD6FD,\n    0xD700, 0xD704, 0xD711, 0xD718, 0xD719, 0xD71C, 0xD720, 0xD728,\n    0xD729, 0xD72B, 0xD72D, 0xD734, 0xD735, 0xD738, 0xD73C, 0xD744,\n    0xD747, 0xD749, 0xD750, 0xD751, 0xD754, 0xD756, 0xD757, 0xD758,\n    0xD759, 0xD760, 0xD761, 0xD763, 0xD765, 0xD769, 0xD76C, 0xD770,\n    0xD774, 0xD77C, 0xD77D, 0xD781, 0xD788, 0xD789, 0xD78C, 0xD790,\n    0xD798, 0xD799, 0xD79B, 0xD79D, 0x4F3D, 0x4F73, 0x5047, 0x50F9,\n    0x52A0, 0x53EF, 0x5475, 0x54E5, 0x5609, 0x5AC1, 0x5BB6, 0x6687,\n    0x67B6, 0x67B7, 0x67EF, 0x6B4C, 0x73C2, 0x75C2, 0x7A3C, 0x82DB,\n    0x8304, 0x8857, 0x8888, 0x8A36, 0x8CC8, 0x8DCF, 0x8EFB, 0x8FE6,\n    0x99D5, 0x523B, 0x5374, 0x5404, 0x606A, 0x6164, 0x6BBC, 0x73CF,\n    0x811A, 0x89BA, 0x89D2, 0x95A3, 0x4F83, 0x520A, 0x58BE, 0x5978,\n    0x59E6, 0x5E72, 0x5E79, 0x61C7, 0x63C0, 0x6746, 0x67EC, 0x687F,\n    0x6F97, 0x764E, 0x770B, 0x78F5, 0x7A08, 0x7AFF, 0x7C21, 0x809D,\n    0x826E, 0x8271, 0x8AEB, 0x9593, 0x4E6B, 0x559D, 0x66F7, 0x6E34,\n    0x78A3, 0x7AED, 0x845B, 0x8910, 0x874E, 0x97A8, 0x52D8, 0x574E,\n    0x582A, 0x5D4C, 0x611F, 0x61BE, 0x6221, 0x6562, 0x67D1, 0x6A44,\n    0x6E1B, 0x7518, 0x75B3, 0x76E3, 0x77B0, 0x7D3A, 0x90AF, 0x9451,\n    0x9452, 0x9F95, 0x5323, 0x5CAC, 0x7532, 0x80DB, 0x9240, 0x9598,\n    0x525B, 0x5808, 0x59DC, 0x5CA1, 0x5D17, 0x5EB7, 0x5F3A, 0x5F4A,\n    0x6177, 0x6C5F, 0x757A, 0x7586, 0x7CE0, 0x7D73, 0x7DB1, 0x7F8C,\n    0x8154, 0x8221, 0x8591, 0x8941, 0x8B1B, 0x92FC, 0x964D, 0x9C47,\n    0x4ECB, 0x4EF7, 0x500B, 0x51F1, 0x584F, 0x6137, 0x613E, 0x6168,\n    0x6539, 0x69EA, 0x6F11, 0x75A5, 0x7686, 0x76D6, 0x7B87, 0x82A5,\n    0x84CB, 0x93A7, 0x958B, 0x5580, 0x5BA2, 0x5751, 0x7CB3, 0x7FB9,\n    0x91B5, 0x5028, 0x53BB, 0x5C45, 0x5DE8, 0x62D2, 0x636E, 0x64DA,\n    0x64E7, 0x6E20, 0x70AC, 0x795B, 0x8DDD, 0x8E1E, 0x907D, 0x9245,\n    0x92F8, 0x4E7E, 0x4EF6, 0x5065, 0x5DFE, 0x5EFA, 0x6106, 0x6957,\n    0x8171, 0x8654, 0x8E47, 0x9375, 0x9A2B, 0x4E5E, 0x5091, 0x6770,\n    0x6840, 0x5109, 0x528D, 0x5292, 0x6AA2, 0x77BC, 0x9210, 0x9ED4,\n    0x52AB, 0x602F, 0x8FF2, 0x5048, 0x61A9, 0x63ED, 0x64CA, 0x683C,\n    0x6A84, 0x6FC0, 0x8188, 0x89A1, 0x9694, 0x5805, 0x727D, 0x72AC,\n    0x7504, 0x7D79, 0x7E6D, 0x80A9, 0x898B, 0x8B74, 0x9063, 0x9D51,\n    0x6289, 0x6C7A, 0x6F54, 0x7D50, 0x7F3A, 0x8A23, 0x517C, 0x614A,\n    0x7B9D, 0x8B19, 0x9257, 0x938C, 0x4EAC, 0x4FD3, 0x501E, 0x50BE,\n    0x5106, 0x52C1, 0x52CD, 0x537F, 0x5770, 0x5883, 0x5E9A, 0x5F91,\n    0x6176, 0x61AC, 0x64CE, 0x656C, 0x666F, 0x66BB, 0x66F4, 0x6897,\n    0x6D87, 0x7085, 0x70F1, 0x749F, 0x74A5, 0x74CA, 0x75D9, 0x786C,\n    0x78EC, 0x7ADF, 0x7AF6, 0x7D45, 0x7D93, 0x8015, 0x803F, 0x811B,\n    0x8396, 0x8B66, 0x8F15, 0x9015, 0x93E1, 0x9803, 0x9838, 0x9A5A,\n    0x9BE8, 0x4FC2, 0x5553, 0x583A, 0x5951, 0x5B63, 0x5C46, 0x60B8,\n    0x6212, 0x6842, 0x68B0, 0x68E8, 0x6EAA, 0x754C, 0x7678, 0x78CE,\n    0x7A3D, 0x7CFB, 0x7E6B, 0x7E7C, 0x8A08, 0x8AA1, 0x8C3F, 0x968E,\n    0x9DC4, 0x53E4, 0x53E9, 0x544A, 0x5471, 0x56FA, 0x59D1, 0x5B64,\n    0x5C3B, 0x5EAB, 0x62F7, 0x6537, 0x6545, 0x6572, 0x66A0, 0x67AF,\n    0x69C1, 0x6CBD, 0x75FC, 0x7690, 0x777E, 0x7A3F, 0x7F94, 0x8003,\n    0x80A1, 0x818F, 0x82E6, 0x82FD, 0x83F0, 0x85C1, 0x8831, 0x88B4,\n    0x8AA5, 0x8F9C, 0x932E, 0x96C7, 0x9867, 0x9AD8, 0x9F13, 0x54ED,\n    0x659B, 0x66F2, 0x688F, 0x7A40, 0x8C37, 0x9D60, 0x56F0, 0x5764,\n    0x5D11, 0x6606, 0x68B1, 0x68CD, 0x6EFE, 0x7428, 0x889E, 0x9BE4,\n    0x6C68, 0x9AA8, 0x4F9B, 0x516C, 0x5171, 0x529F, 0x5B54, 0x5DE5,\n    0x6050, 0x606D, 0x62F1, 0x63A7, 0x653B, 0x73D9, 0x7A7A, 0x86A3,\n    0x8CA2, 0x978F, 0x4E32, 0x5BE1, 0x6208, 0x679C, 0x74DC, 0x79D1,\n    0x83D3, 0x8A87, 0x8AB2, 0x8DE8, 0x904E, 0x934B, 0x9846, 0x5ED3,\n    0x69E8, 0x85FF, 0x90ED, 0x51A0, 0x5B98, 0x5BEC, 0x6163, 0x68FA,\n    0x6B3E, 0x704C, 0x742F, 0x74D8, 0x7BA1, 0x7F50, 0x83C5, 0x89C0,\n    0x8CAB, 0x95DC, 0x9928, 0x522E, 0x605D, 0x62EC, 0x9002, 0x4F8A,\n    0x5149, 0x5321, 0x58D9, 0x5EE3, 0x66E0, 0x6D38, 0x709A, 0x72C2,\n    0x73D6, 0x7B50, 0x80F1, 0x945B, 0x5366, 0x639B, 0x7F6B, 0x4E56,\n    0x5080, 0x584A, 0x58DE, 0x602A, 0x6127, 0x62D0, 0x69D0, 0x9B41,\n    0x5B8F, 0x7D18, 0x80B1, 0x8F5F, 0x4EA4, 0x50D1, 0x54AC, 0x55AC,\n    0x5B0C, 0x5DA0, 0x5DE7, 0x652A, 0x654E, 0x6821, 0x6A4B, 0x72E1,\n    0x768E, 0x77EF, 0x7D5E, 0x7FF9, 0x81A0, 0x854E, 0x86DF, 0x8F03,\n    0x8F4E, 0x90CA, 0x9903, 0x9A55, 0x9BAB, 0x4E18, 0x4E45, 0x4E5D,\n    0x4EC7, 0x4FF1, 0x5177, 0x52FE, 0x5340, 0x53E3, 0x53E5, 0x548E,\n    0x5614, 0x5775, 0x57A2, 0x5BC7, 0x5D87, 0x5ED0, 0x61FC, 0x62D8,\n    0x6551, 0x67B8, 0x67E9, 0x69CB, 0x6B50, 0x6BC6, 0x6BEC, 0x6C42,\n    0x6E9D, 0x7078, 0x72D7, 0x7396, 0x7403, 0x77BF, 0x77E9, 0x7A76,\n    0x7D7F, 0x8009, 0x81FC, 0x8205, 0x820A, 0x82DF, 0x8862, 0x8B33,\n    0x8CFC, 0x8EC0, 0x9011, 0x90B1, 0x9264, 0x92B6, 0x99D2, 0x9A45,\n    0x9CE9, 0x9DD7, 0x9F9C, 0x570B, 0x5C40, 0x83CA, 0x97A0, 0x97AB,\n    0x9EB4, 0x541B, 0x7A98, 0x7FA4, 0x88D9, 0x8ECD, 0x90E1, 0x5800,\n    0x5C48, 0x6398, 0x7A9F, 0x5BAE, 0x5F13, 0x7A79, 0x7AAE, 0x828E,\n    0x8EAC, 0x5026, 0x5238, 0x52F8, 0x5377, 0x5708, 0x62F3, 0x6372,\n    0x6B0A, 0x6DC3, 0x7737, 0x53A5, 0x7357, 0x8568, 0x8E76, 0x95D5,\n    0x673A, 0x6AC3, 0x6F70, 0x8A6D, 0x8ECC, 0x994B, 0x6677, 0x6B78,\n    0x8CB4, 0x9B3C, 0x53EB, 0x572D, 0x594E, 0x63C6, 0x69FB, 0x73EA,\n    0x7845, 0x7ABA, 0x7AC5, 0x7CFE, 0x8475, 0x898F, 0x8D73, 0x9035,\n    0x95A8, 0x52FB, 0x5747, 0x7547, 0x7B60, 0x83CC, 0x921E, 0x6A58,\n    0x514B, 0x524B, 0x5287, 0x621F, 0x68D8, 0x6975, 0x9699, 0x50C5,\n    0x52A4, 0x52E4, 0x61C3, 0x65A4, 0x6839, 0x69FF, 0x747E, 0x7B4B,\n    0x82B9, 0x83EB, 0x89B2, 0x8B39, 0x8FD1, 0x9949, 0x4ECA, 0x5997,\n    0x64D2, 0x6611, 0x6A8E, 0x7434, 0x7981, 0x79BD, 0x82A9, 0x887E,\n    0x887F, 0x895F, 0x9326, 0x4F0B, 0x53CA, 0x6025, 0x6271, 0x6C72,\n    0x7D1A, 0x7D66, 0x4E98, 0x5162, 0x77DC, 0x80AF, 0x4F01, 0x4F0E,\n    0x5176, 0x5180, 0x55DC, 0x5668, 0x573B, 0x57FA, 0x57FC, 0x5914,\n    0x5947, 0x5993, 0x5BC4, 0x5C90, 0x5D0E, 0x5DF1, 0x5E7E, 0x5FCC,\n    0x6280, 0x65D7, 0x65E3, 0x671E, 0x671F, 0x675E, 0x68CB, 0x68C4,\n    0x6A5F, 0x6B3A, 0x6C23, 0x6C7D, 0x6C82, 0x6DC7, 0x7398, 0x7426,\n    0x742A, 0x7482, 0x74A3, 0x7578, 0x757F, 0x7881, 0x78EF, 0x7941,\n    0x7947, 0x7948, 0x797A, 0x7B95, 0x7D00, 0x7DBA, 0x7F88, 0x8006,\n    0x802D, 0x808C, 0x8A18, 0x8B4F, 0x8C48, 0x8D77, 0x9321, 0x9324,\n    0x98E2, 0x9951, 0x9A0E, 0x9A0F, 0x9A65, 0x9E92, 0x7DCA, 0x4F76,\n    0x5409, 0x62EE, 0x6854, 0x91D1, 0x55AB, 0x513A, 0x5A1C, 0x61E6,\n    0x62CF, 0x62FF, 0x90A3, 0x8AFE, 0x6696, 0x7156, 0x96E3, 0x634F,\n    0x637A, 0x5357, 0x678F, 0x6960, 0x6E73, 0x7537, 0x7D0D, 0x8872,\n    0x56CA, 0x5A18, 0x4E43, 0x5167, 0x5948, 0x67F0, 0x8010, 0x5973,\n    0x5E74, 0x649A, 0x79CA, 0x5FF5, 0x606C, 0x62C8, 0x637B, 0x5BE7,\n    0x5BD7, 0x52AA, 0x5974, 0x5F29, 0x6012, 0x7459, 0x99D1, 0x6FC3,\n    0x81BF, 0x8FB2, 0x60F1, 0x8166, 0x5C3F, 0x5AE9, 0x8A25, 0x677B,\n    0x7D10, 0x80FD, 0x5C3C, 0x6CE5, 0x533F, 0x6EBA, 0x591A, 0x8336,\n    0x4E39, 0x4EB6, 0x4F46, 0x55AE, 0x5718, 0x58C7, 0x5F56, 0x65B7,\n    0x65E6, 0x6A80, 0x6BB5, 0x6E4D, 0x77ED, 0x7AEF, 0x7C1E, 0x7DDE,\n    0x86CB, 0x8892, 0x9132, 0x935B, 0x64BB, 0x6FBE, 0x737A, 0x75B8,\n    0x9054, 0x5556, 0x574D, 0x61BA, 0x64D4, 0x66C7, 0x6DE1, 0x6E5B,\n    0x6F6D, 0x6FB9, 0x75F0, 0x8043, 0x81BD, 0x8541, 0x8983, 0x8AC7,\n    0x8B5A, 0x931F, 0x6C93, 0x7553, 0x7B54, 0x8E0F, 0x905D, 0x5510,\n    0x5802, 0x5858, 0x5E62, 0x6207, 0x649E, 0x68E0, 0x7576, 0x7CD6,\n    0x87B3, 0x9EE8, 0x4EE3, 0x5788, 0x576E, 0x5927, 0x5C0D, 0x5CB1,\n    0x5E36, 0x5F85, 0x6234, 0x64E1, 0x73B3, 0x81FA, 0x888B, 0x8CB8,\n    0x968A, 0x9EDB, 0x5B85, 0x5FB7, 0x60B3, 0x5012, 0x5200, 0x5230,\n    0x5716, 0x5835, 0x5857, 0x5C0E, 0x5C60, 0x5CF6, 0x5D8B, 0x5EA6,\n    0x5F92, 0x60BC, 0x6311, 0x6389, 0x6417, 0x6843, 0x68F9, 0x6AC2,\n    0x6DD8, 0x6E21, 0x6ED4, 0x6FE4, 0x71FE, 0x76DC, 0x7779, 0x79B1,\n    0x7A3B, 0x8404, 0x89A9, 0x8CED, 0x8DF3, 0x8E48, 0x9003, 0x9014,\n    0x9053, 0x90FD, 0x934D, 0x9676, 0x97DC, 0x6BD2, 0x7006, 0x7258,\n    0x72A2, 0x7368, 0x7763, 0x79BF, 0x7BE4, 0x7E9B, 0x8B80, 0x58A9,\n    0x60C7, 0x6566, 0x65FD, 0x66BE, 0x6C8C, 0x711E, 0x71C9, 0x8C5A,\n    0x9813, 0x4E6D, 0x7A81, 0x4EDD, 0x51AC, 0x51CD, 0x52D5, 0x540C,\n    0x61A7, 0x6771, 0x6850, 0x68DF, 0x6D1E, 0x6F7C, 0x75BC, 0x77B3,\n    0x7AE5, 0x80F4, 0x8463, 0x9285, 0x515C, 0x6597, 0x675C, 0x6793,\n    0x75D8, 0x7AC7, 0x8373, 0x8C46, 0x9017, 0x982D, 0x5C6F, 0x81C0,\n    0x829A, 0x9041, 0x906F, 0x920D, 0x5F97, 0x5D9D, 0x6A59, 0x71C8,\n    0x767B, 0x7B49, 0x85E4, 0x8B04, 0x9127, 0x9A30, 0x5587, 0x61F6,\n    0x7669, 0x7F85, 0x863F, 0x87BA, 0x88F8, 0x908F, 0x6D1B, 0x70D9,\n    0x73DE, 0x7D61, 0x843D, 0x916A, 0x99F1, 0x4E82, 0x5375, 0x6B04,\n    0x6B12, 0x703E, 0x721B, 0x862D, 0x9E1E, 0x524C, 0x8FA3, 0x5D50,\n    0x64E5, 0x652C, 0x6B16, 0x6FEB, 0x7C43, 0x7E9C, 0x85CD, 0x8964,\n    0x89BD, 0x62C9, 0x81D8, 0x881F, 0x5ECA, 0x6717, 0x6D6A, 0x72FC,\n    0x7405, 0x746F, 0x8782, 0x90DE, 0x4F86, 0x5D0D, 0x5FA0, 0x840A,\n    0x51B7, 0x63A0, 0x7565, 0x4EAE, 0x5006, 0x5169, 0x51C9, 0x6881,\n    0x6A11, 0x7CAE, 0x7CB1, 0x7CE7, 0x826F, 0x8AD2, 0x8F1B, 0x91CF,\n    0x4FB6, 0x5137, 0x52F5, 0x5442, 0x5EEC, 0x616E, 0x623E, 0x65C5,\n    0x6ADA, 0x6FFE, 0x792A, 0x85DC, 0x8823, 0x95AD, 0x9A62, 0x9A6A,\n    0x9E97, 0x9ECE, 0x529B, 0x66C6, 0x6B77, 0x701D, 0x792B, 0x8F62,\n    0x9742, 0x6190, 0x6200, 0x6523, 0x6F23, 0x7149, 0x7489, 0x7DF4,\n    0x806F, 0x84EE, 0x8F26, 0x9023, 0x934A, 0x51BD, 0x5217, 0x52A3,\n    0x6D0C, 0x70C8, 0x88C2, 0x5EC9, 0x6582, 0x6BAE, 0x6FC2, 0x7C3E,\n    0x7375, 0x4EE4, 0x4F36, 0x56F9, 0x5CBA, 0x5DBA, 0x601C, 0x73B2,\n    0x7B2D, 0x7F9A, 0x7FCE, 0x8046, 0x901E, 0x9234, 0x96F6, 0x9748,\n    0x9818, 0x9F61, 0x4F8B, 0x6FA7, 0x79AE, 0x91B4, 0x96B7, 0x52DE,\n    0x6488, 0x64C4, 0x6AD3, 0x6F5E, 0x7018, 0x7210, 0x76E7, 0x8001,\n    0x8606, 0x865C, 0x8DEF, 0x8F05, 0x9732, 0x9B6F, 0x9DFA, 0x9E75,\n    0x788C, 0x797F, 0x7DA0, 0x83C9, 0x9304, 0x9E7F, 0x9E93, 0x8AD6,\n    0x58DF, 0x5F04, 0x6727, 0x7027, 0x74CF, 0x7C60, 0x807E, 0x5121,\n    0x7028, 0x7262, 0x78CA, 0x8CC2, 0x8CDA, 0x8CF4, 0x96F7, 0x4E86,\n    0x50DA, 0x5BEE, 0x5ED6, 0x6599, 0x71CE, 0x7642, 0x77AD, 0x804A,\n    0x84FC, 0x907C, 0x9B27, 0x9F8D, 0x58D8, 0x5A41, 0x5C62, 0x6A13,\n    0x6DDA, 0x6F0F, 0x763B, 0x7D2F, 0x7E37, 0x851E, 0x8938, 0x93E4,\n    0x964B, 0x5289, 0x65D2, 0x67F3, 0x69B4, 0x6D41, 0x6E9C, 0x700F,\n    0x7409, 0x7460, 0x7559, 0x7624, 0x786B, 0x8B2C, 0x985E, 0x516D,\n    0x622E, 0x9678, 0x4F96, 0x502B, 0x5D19, 0x6DEA, 0x7DB8, 0x8F2A,\n    0x5F8B, 0x6144, 0x6817, 0x9686, 0x52D2, 0x808B, 0x51DC, 0x51CC,\n    0x695E, 0x7A1C, 0x7DBE, 0x83F1, 0x9675, 0x4FDA, 0x5229, 0x5398,\n    0x540F, 0x550E, 0x5C65, 0x60A7, 0x674E, 0x68A8, 0x6D6C, 0x7281,\n    0x72F8, 0x7406, 0x7483, 0x75E2, 0x7C6C, 0x7F79, 0x7FB8, 0x8389,\n    0x88CF, 0x88E1, 0x91CC, 0x91D0, 0x96E2, 0x9BC9, 0x541D, 0x6F7E,\n    0x71D0, 0x7498, 0x85FA, 0x8EAA, 0x96A3, 0x9C57, 0x9E9F, 0x6797,\n    0x6DCB, 0x7433, 0x81E8, 0x9716, 0x782C, 0x7ACB, 0x7B20, 0x7C92,\n    0x6469, 0x746A, 0x75F2, 0x78BC, 0x78E8, 0x99AC, 0x9B54, 0x9EBB,\n    0x5BDE, 0x5E55, 0x6F20, 0x819C, 0x83AB, 0x9088, 0x4E07, 0x534D,\n    0x5A29, 0x5DD2, 0x5F4E, 0x6162, 0x633D, 0x6669, 0x66FC, 0x6EFF,\n    0x6F2B, 0x7063, 0x779E, 0x842C, 0x8513, 0x883B, 0x8F13, 0x9945,\n    0x9C3B, 0x551C, 0x62B9, 0x672B, 0x6CAB, 0x8309, 0x896A, 0x977A,\n    0x4EA1, 0x5984, 0x5FD8, 0x5FD9, 0x671B, 0x7DB2, 0x7F54, 0x8292,\n    0x832B, 0x83BD, 0x8F1E, 0x9099, 0x57CB, 0x59B9, 0x5A92, 0x5BD0,\n    0x6627, 0x679A, 0x6885, 0x6BCF, 0x7164, 0x7F75, 0x8CB7, 0x8CE3,\n    0x9081, 0x9B45, 0x8108, 0x8C8A, 0x964C, 0x9A40, 0x9EA5, 0x5B5F,\n    0x6C13, 0x731B, 0x76F2, 0x76DF, 0x840C, 0x51AA, 0x8993, 0x514D,\n    0x5195, 0x52C9, 0x68C9, 0x6C94, 0x7704, 0x7720, 0x7DBF, 0x7DEC,\n    0x9762, 0x9EB5, 0x6EC5, 0x8511, 0x51A5, 0x540D, 0x547D, 0x660E,\n    0x669D, 0x6927, 0x6E9F, 0x76BF, 0x7791, 0x8317, 0x84C2, 0x879F,\n    0x9169, 0x9298, 0x9CF4, 0x8882, 0x4FAE, 0x5192, 0x52DF, 0x59C6,\n    0x5E3D, 0x6155, 0x6478, 0x6479, 0x66AE, 0x67D0, 0x6A21, 0x6BCD,\n    0x6BDB, 0x725F, 0x7261, 0x7441, 0x7738, 0x77DB, 0x8017, 0x82BC,\n    0x8305, 0x8B00, 0x8B28, 0x8C8C, 0x6728, 0x6C90, 0x7267, 0x76EE,\n    0x7766, 0x7A46, 0x9DA9, 0x6B7F, 0x6C92, 0x5922, 0x6726, 0x8499,\n    0x536F, 0x5893, 0x5999, 0x5EDF, 0x63CF, 0x6634, 0x6773, 0x6E3A,\n    0x732B, 0x7AD7, 0x82D7, 0x9328, 0x52D9, 0x5DEB, 0x61AE, 0x61CB,\n    0x620A, 0x62C7, 0x64AB, 0x65E0, 0x6959, 0x6B66, 0x6BCB, 0x7121,\n    0x73F7, 0x755D, 0x7E46, 0x821E, 0x8302, 0x856A, 0x8AA3, 0x8CBF,\n    0x9727, 0x9D61, 0x58A8, 0x9ED8, 0x5011, 0x520E, 0x543B, 0x554F,\n    0x6587, 0x6C76, 0x7D0A, 0x7D0B, 0x805E, 0x868A, 0x9580, 0x96EF,\n    0x52FF, 0x6C95, 0x7269, 0x5473, 0x5A9A, 0x5C3E, 0x5D4B, 0x5F4C,\n    0x5FAE, 0x672A, 0x68B6, 0x6963, 0x6E3C, 0x6E44, 0x7709, 0x7C73,\n    0x7F8E, 0x8587, 0x8B0E, 0x8FF7, 0x9761, 0x9EF4, 0x5CB7, 0x60B6,\n    0x610D, 0x61AB, 0x654F, 0x65FB, 0x65FC, 0x6C11, 0x6CEF, 0x739F,\n    0x73C9, 0x7DE1, 0x9594, 0x5BC6, 0x871C, 0x8B10, 0x525D, 0x535A,\n    0x62CD, 0x640F, 0x64B2, 0x6734, 0x6A38, 0x6CCA, 0x73C0, 0x749E,\n    0x7B94, 0x7C95, 0x7E1B, 0x818A, 0x8236, 0x8584, 0x8FEB, 0x96F9,\n    0x99C1, 0x4F34, 0x534A, 0x53CD, 0x53DB, 0x62CC, 0x642C, 0x6500,\n    0x6591, 0x69C3, 0x6CEE, 0x6F58, 0x73ED, 0x7554, 0x7622, 0x76E4,\n    0x76FC, 0x78D0, 0x78FB, 0x792C, 0x7D46, 0x822C, 0x87E0, 0x8FD4,\n    0x9812, 0x98EF, 0x52C3, 0x62D4, 0x64A5, 0x6E24, 0x6F51, 0x767C,\n    0x8DCB, 0x91B1, 0x9262, 0x9AEE, 0x9B43, 0x5023, 0x508D, 0x574A,\n    0x59A8, 0x5C28, 0x5E47, 0x5F77, 0x623F, 0x653E, 0x65B9, 0x65C1,\n    0x6609, 0x678B, 0x699C, 0x6EC2, 0x78C5, 0x7D21, 0x80AA, 0x8180,\n    0x822B, 0x82B3, 0x84A1, 0x868C, 0x8A2A, 0x8B17, 0x90A6, 0x9632,\n    0x9F90, 0x500D, 0x4FF3, 0x57F9, 0x5F98, 0x62DC, 0x6392, 0x676F,\n    0x6E43, 0x7119, 0x76C3, 0x80CC, 0x80DA, 0x88F4, 0x88F5, 0x8919,\n    0x8CE0, 0x8F29, 0x914D, 0x966A, 0x4F2F, 0x4F70, 0x5E1B, 0x67CF,\n    0x6822, 0x767D, 0x767E, 0x9B44, 0x5E61, 0x6A0A, 0x7169, 0x71D4,\n    0x756A, 0x7E41, 0x8543, 0x85E9, 0x98DC, 0x4F10, 0x7B4F, 0x7F70,\n    0x95A5, 0x51E1, 0x5E06, 0x68B5, 0x6C3E, 0x6C4E, 0x6CDB, 0x72AF,\n    0x7BC4, 0x8303, 0x6CD5, 0x743A, 0x50FB, 0x5288, 0x58C1, 0x64D8,\n    0x6A97, 0x74A7, 0x7656, 0x78A7, 0x8617, 0x95E2, 0x9739, 0x535E,\n    0x5F01, 0x8B8A, 0x8FA8, 0x8FAF, 0x908A, 0x5225, 0x77A5, 0x9C49,\n    0x9F08, 0x4E19, 0x5002, 0x5175, 0x5C5B, 0x5E77, 0x661E, 0x663A,\n    0x67C4, 0x68C5, 0x70B3, 0x7501, 0x75C5, 0x79C9, 0x7ADD, 0x8F27,\n    0x9920, 0x9A08, 0x4FDD, 0x5821, 0x5831, 0x5BF6, 0x666E, 0x6B65,\n    0x6D11, 0x6E7A, 0x6F7D, 0x73E4, 0x752B, 0x83E9, 0x88DC, 0x8913,\n    0x8B5C, 0x8F14, 0x4F0F, 0x50D5, 0x5310, 0x535C, 0x5B93, 0x5FA9,\n    0x670D, 0x798F, 0x8179, 0x832F, 0x8514, 0x8907, 0x8986, 0x8F39,\n    0x8F3B, 0x99A5, 0x9C12, 0x672C, 0x4E76, 0x4FF8, 0x5949, 0x5C01,\n    0x5CEF, 0x5CF0, 0x6367, 0x68D2, 0x70FD, 0x71A2, 0x742B, 0x7E2B,\n    0x84EC, 0x8702, 0x9022, 0x92D2, 0x9CF3, 0x4E0D, 0x4ED8, 0x4FEF,\n    0x5085, 0x5256, 0x526F, 0x5426, 0x5490, 0x57E0, 0x592B, 0x5A66,\n    0x5B5A, 0x5B75, 0x5BCC, 0x5E9C, 0x6276, 0x6577, 0x65A7, 0x6D6E,\n    0x6EA5, 0x7236, 0x7B26, 0x7C3F, 0x7F36, 0x8150, 0x8151, 0x819A,\n    0x8240, 0x8299, 0x83A9, 0x8A03, 0x8CA0, 0x8CE6, 0x8CFB, 0x8D74,\n    0x8DBA, 0x90E8, 0x91DC, 0x961C, 0x9644, 0x99D9, 0x9CE7, 0x5317,\n    0x5206, 0x5429, 0x5674, 0x58B3, 0x5954, 0x596E, 0x5FFF, 0x61A4,\n    0x626E, 0x6610, 0x6C7E, 0x711A, 0x76C6, 0x7C89, 0x7CDE, 0x7D1B,\n    0x82AC, 0x8CC1, 0x96F0, 0x4F5B, 0x5F17, 0x5F7F, 0x62C2, 0x5D29,\n    0x670B, 0x68DA, 0x787C, 0x7E43, 0x9D6C, 0x4E15, 0x5099, 0x5315,\n    0x532A, 0x5351, 0x5983, 0x5A62, 0x5E87, 0x60B2, 0x618A, 0x6249,\n    0x6279, 0x6590, 0x6787, 0x69A7, 0x6BD4, 0x6BD6, 0x6BD7, 0x6BD8,\n    0x6CB8, 0x7435, 0x75FA, 0x7812, 0x7891, 0x79D5, 0x79D8, 0x7C83,\n    0x7DCB, 0x7FE1, 0x80A5, 0x813E, 0x81C2, 0x83F2, 0x871A, 0x88E8,\n    0x8AB9, 0x8B6C, 0x8CBB, 0x9119, 0x975E, 0x98DB, 0x9F3B, 0x56AC,\n    0x5B2A, 0x5F6C, 0x658C, 0x6AB3, 0x6BAF, 0x6D5C, 0x6FF1, 0x7015,\n    0x725D, 0x73AD, 0x8CA7, 0x8CD3, 0x983B, 0x6191, 0x6C37, 0x8058,\n    0x9A01, 0x4E4D, 0x4E8B, 0x4E9B, 0x4ED5, 0x4F3A, 0x4F3C, 0x4F7F,\n    0x4FDF, 0x50FF, 0x53F2, 0x53F8, 0x5506, 0x55E3, 0x56DB, 0x58EB,\n    0x5962, 0x5A11, 0x5BEB, 0x5BFA, 0x5C04, 0x5DF3, 0x5E2B, 0x5F99,\n    0x601D, 0x6368, 0x659C, 0x65AF, 0x67F6, 0x67FB, 0x68AD, 0x6B7B,\n    0x6C99, 0x6CD7, 0x6E23, 0x7009, 0x7345, 0x7802, 0x793E, 0x7940,\n    0x7960, 0x79C1, 0x7BE9, 0x7D17, 0x7D72, 0x8086, 0x820D, 0x838E,\n    0x84D1, 0x86C7, 0x88DF, 0x8A50, 0x8A5E, 0x8B1D, 0x8CDC, 0x8D66,\n    0x8FAD, 0x90AA, 0x98FC, 0x99DF, 0x9E9D, 0x524A, 0x6714, 0x5098,\n    0x522A, 0x5C71, 0x6563, 0x6C55, 0x73CA, 0x7523, 0x759D, 0x7B97,\n    0x849C, 0x9178, 0x9730, 0x4E77, 0x6492, 0x6BBA, 0x715E, 0x85A9,\n    0x4E09, 0x6749, 0x68EE, 0x6E17, 0x829F, 0x8518, 0x886B, 0x63F7,\n    0x6F81, 0x9212, 0x98AF, 0x4E0A, 0x50B7, 0x50CF, 0x511F, 0x5546,\n    0x55AA, 0x5617, 0x5B40, 0x5C19, 0x5CE0, 0x5E38, 0x5E8A, 0x5EA0,\n    0x5EC2, 0x60F3, 0x6851, 0x6A61, 0x6E58, 0x723D, 0x7240, 0x72C0,\n    0x76F8, 0x7965, 0x7BB1, 0x7FD4, 0x88F3, 0x89F4, 0x8A73, 0x8C61,\n    0x8CDE, 0x971C, 0x585E, 0x74BD, 0x8CFD, 0x55C7, 0x7A61, 0x7D22,\n    0x8272, 0x7272, 0x751F, 0x7525, 0x7B19, 0x5885, 0x58FB, 0x5DBC,\n    0x5E8F, 0x5EB6, 0x5F90, 0x6055, 0x6292, 0x637F, 0x654D, 0x6691,\n    0x66D9, 0x66F8, 0x6816, 0x68F2, 0x7280, 0x745E, 0x7B6E, 0x7D6E,\n    0x7DD6, 0x7F72, 0x80E5, 0x8212, 0x85AF, 0x897F, 0x8A93, 0x901D,\n    0x92E4, 0x9ECD, 0x9F20, 0x5915, 0x596D, 0x5E2D, 0x60DC, 0x6614,\n    0x6673, 0x6790, 0x6C50, 0x6DC5, 0x6F5F, 0x77F3, 0x78A9, 0x84C6,\n    0x91CB, 0x932B, 0x4ED9, 0x50CA, 0x5148, 0x5584, 0x5B0B, 0x5BA3,\n    0x6247, 0x657E, 0x65CB, 0x6E32, 0x717D, 0x7401, 0x7444, 0x7487,\n    0x74BF, 0x766C, 0x79AA, 0x7DDA, 0x7E55, 0x7FA8, 0x817A, 0x81B3,\n    0x8239, 0x861A, 0x87EC, 0x8A75, 0x8DE3, 0x9078, 0x9291, 0x9425,\n    0x994D, 0x9BAE, 0x5368, 0x5C51, 0x6954, 0x6CC4, 0x6D29, 0x6E2B,\n    0x820C, 0x859B, 0x893B, 0x8A2D, 0x8AAA, 0x96EA, 0x9F67, 0x5261,\n    0x66B9, 0x6BB2, 0x7E96, 0x87FE, 0x8D0D, 0x9583, 0x965D, 0x651D,\n    0x6D89, 0x71EE, 0x57CE, 0x59D3, 0x5BAC, 0x6027, 0x60FA, 0x6210,\n    0x661F, 0x665F, 0x7329, 0x73F9, 0x76DB, 0x7701, 0x7B6C, 0x8056,\n    0x8072, 0x8165, 0x8AA0, 0x9192, 0x4E16, 0x52E2, 0x6B72, 0x6D17,\n    0x7A05, 0x7B39, 0x7D30, 0x8CB0, 0x53EC, 0x562F, 0x5851, 0x5BB5,\n    0x5C0F, 0x5C11, 0x5DE2, 0x6240, 0x6383, 0x6414, 0x662D, 0x68B3,\n    0x6CBC, 0x6D88, 0x6EAF, 0x701F, 0x70A4, 0x71D2, 0x7526, 0x758F,\n    0x758E, 0x7619, 0x7B11, 0x7BE0, 0x7C2B, 0x7D20, 0x7D39, 0x852C,\n    0x856D, 0x8607, 0x8A34, 0x900D, 0x9061, 0x90B5, 0x92B7, 0x97F6,\n    0x9A37, 0x4FD7, 0x5C6C, 0x675F, 0x6D91, 0x7C9F, 0x7E8C, 0x8B16,\n    0x8D16, 0x901F, 0x5B6B, 0x5DFD, 0x640D, 0x84C0, 0x905C, 0x98E1,\n    0x7387, 0x5B8B, 0x609A, 0x677E, 0x6DDE, 0x8A1F, 0x8AA6, 0x9001,\n    0x980C, 0x5237, 0x7051, 0x788E, 0x9396, 0x8870, 0x91D7, 0x4FEE,\n    0x53D7, 0x55FD, 0x56DA, 0x5782, 0x58FD, 0x5AC2, 0x5B88, 0x5CAB,\n    0x5CC0, 0x5E25, 0x6101, 0x620D, 0x624B, 0x6388, 0x641C, 0x6536,\n    0x6578, 0x6A39, 0x6B8A, 0x6C34, 0x6D19, 0x6F31, 0x71E7, 0x72E9,\n    0x7378, 0x7407, 0x74B2, 0x7626, 0x7761, 0x79C0, 0x7A57, 0x7AEA,\n    0x7CB9, 0x7D8F, 0x7DAC, 0x7E61, 0x7F9E, 0x8129, 0x8331, 0x8490,\n    0x84DA, 0x85EA, 0x8896, 0x8AB0, 0x8B90, 0x8F38, 0x9042, 0x9083,\n    0x916C, 0x9296, 0x92B9, 0x968B, 0x96A7, 0x96A8, 0x96D6, 0x9700,\n    0x9808, 0x9996, 0x9AD3, 0x9B1A, 0x53D4, 0x587E, 0x5919, 0x5B70,\n    0x5BBF, 0x6DD1, 0x6F5A, 0x719F, 0x7421, 0x74B9, 0x8085, 0x83FD,\n    0x5DE1, 0x5F87, 0x5FAA, 0x6042, 0x65EC, 0x6812, 0x696F, 0x6A53,\n    0x6B89, 0x6D35, 0x6DF3, 0x73E3, 0x76FE, 0x77AC, 0x7B4D, 0x7D14,\n    0x8123, 0x821C, 0x8340, 0x84F4, 0x8563, 0x8A62, 0x8AC4, 0x9187,\n    0x931E, 0x9806, 0x99B4, 0x620C, 0x8853, 0x8FF0, 0x9265, 0x5D07,\n    0x5D27, 0x5D69, 0x745F, 0x819D, 0x8768, 0x6FD5, 0x62FE, 0x7FD2,\n    0x8936, 0x8972, 0x4E1E, 0x4E58, 0x50E7, 0x52DD, 0x5347, 0x627F,\n    0x6607, 0x7E69, 0x8805, 0x965E, 0x4F8D, 0x5319, 0x5636, 0x59CB,\n    0x5AA4, 0x5C38, 0x5C4E, 0x5C4D, 0x5E02, 0x5F11, 0x6043, 0x65BD,\n    0x662F, 0x6642, 0x67BE, 0x67F4, 0x731C, 0x77E2, 0x793A, 0x7FC5,\n    0x8494, 0x84CD, 0x8996, 0x8A66, 0x8A69, 0x8AE1, 0x8C55, 0x8C7A,\n    0x57F4, 0x5BD4, 0x5F0F, 0x606F, 0x62ED, 0x690D, 0x6B96, 0x6E5C,\n    0x7184, 0x7BD2, 0x8755, 0x8B58, 0x8EFE, 0x98DF, 0x98FE, 0x4F38,\n    0x4F81, 0x4FE1, 0x547B, 0x5A20, 0x5BB8, 0x613C, 0x65B0, 0x6668,\n    0x71FC, 0x7533, 0x795E, 0x7D33, 0x814E, 0x81E3, 0x8398, 0x85AA,\n    0x85CE, 0x8703, 0x8A0A, 0x8EAB, 0x8F9B, 0x8FC5, 0x5931, 0x5BA4,\n    0x5BE6, 0x6089, 0x5BE9, 0x5C0B, 0x5FC3, 0x6C81, 0x6DF1, 0x700B,\n    0x751A, 0x82AF, 0x8AF6, 0x4EC0, 0x5341, 0x96D9, 0x6C0F, 0x4E9E,\n    0x4FC4, 0x5152, 0x555E, 0x5A25, 0x5CE8, 0x6211, 0x7259, 0x82BD,\n    0x83AA, 0x86FE, 0x8859, 0x8A1D, 0x963F, 0x96C5, 0x9913, 0x9D09,\n    0x9D5D, 0x580A, 0x5CB3, 0x5DBD, 0x5E44, 0x60E1, 0x6115, 0x63E1,\n    0x6A02, 0x6E25, 0x9102, 0x9354, 0x984E, 0x9C10, 0x9F77, 0x5B89,\n    0x5CB8, 0x6309, 0x664F, 0x6848, 0x773C, 0x96C1, 0x978D, 0x9854,\n    0x9B9F, 0x65A1, 0x8B01, 0x8ECB, 0x95BC, 0x5535, 0x5CA9, 0x5DD6,\n    0x5EB5, 0x6697, 0x764C, 0x83F4, 0x95C7, 0x58D3, 0x62BC, 0x72CE,\n    0x9D28, 0x4EF0, 0x592E, 0x600F, 0x663B, 0x6B83, 0x79E7, 0x9D26,\n    0x5393, 0x54C0, 0x57C3, 0x5D16, 0x611B, 0x66D6, 0x6DAF, 0x788D,\n    0x827E, 0x9698, 0x9744, 0x5384, 0x627C, 0x6396, 0x6DB2, 0x7E0A,\n    0x814B, 0x984D, 0x6AFB, 0x7F4C, 0x9DAF, 0x9E1A, 0x4E5F, 0x503B,\n    0x51B6, 0x591C, 0x60F9, 0x63F6, 0x6930, 0x723A, 0x8036, 0x91CE,\n    0x5F31, 0x7D04, 0x82E5, 0x846F, 0x84BB, 0x85E5, 0x8E8D, 0x4F6F,\n    0x58E4, 0x5B43, 0x6059, 0x63DA, 0x6518, 0x656D, 0x6698, 0x694A,\n    0x6A23, 0x6D0B, 0x7001, 0x716C, 0x75D2, 0x760D, 0x79B3, 0x7A70,\n    0x7F8A, 0x8944, 0x8B93, 0x91C0, 0x967D, 0x990A, 0x5704, 0x5FA1,\n    0x65BC, 0x6F01, 0x7600, 0x79A6, 0x8A9E, 0x99AD, 0x9B5A, 0x9F6C,\n    0x5104, 0x61B6, 0x6291, 0x6A8D, 0x81C6, 0x5043, 0x5830, 0x5F66,\n    0x7109, 0x8A00, 0x8AFA, 0x5B7C, 0x8616, 0x4FFA, 0x513C, 0x56B4,\n    0x5944, 0x63A9, 0x6DF9, 0x5DAA, 0x696D, 0x5186, 0x4E88, 0x4F59,\n    0x5982, 0x6B5F, 0x6C5D, 0x74B5, 0x7916, 0x8207, 0x8245, 0x8339,\n    0x8F3F, 0x8F5D, 0x9918, 0x4EA6, 0x57DF, 0x5F79, 0x6613, 0x75AB,\n    0x7E79, 0x8B6F, 0x9006, 0x9A5B, 0x56A5, 0x5827, 0x59F8, 0x5A1F,\n    0x5BB4, 0x5EF6, 0x6350, 0x633B, 0x693D, 0x6C87, 0x6CBF, 0x6D8E,\n    0x6D93, 0x6DF5, 0x6F14, 0x70DF, 0x7136, 0x7159, 0x71C3, 0x71D5,\n    0x784F, 0x786F, 0x7B75, 0x7DE3, 0x7E2F, 0x884D, 0x8EDF, 0x925B,\n    0x9CF6, 0x6085, 0x6D85, 0x71B1, 0x95B1, 0x53AD, 0x67D3, 0x708E,\n    0x7130, 0x7430, 0x8276, 0x82D2, 0x95BB, 0x9AE5, 0x9E7D, 0x66C4,\n    0x71C1, 0x8449, 0x584B, 0x5DB8, 0x5F71, 0x6620, 0x668E, 0x6979,\n    0x69AE, 0x6C38, 0x6CF3, 0x6E36, 0x6F41, 0x6FDA, 0x701B, 0x702F,\n    0x7150, 0x71DF, 0x7370, 0x745B, 0x74D4, 0x76C8, 0x7A4E, 0x7E93,\n    0x82F1, 0x8A60, 0x8FCE, 0x9348, 0x9719, 0x4E42, 0x502A, 0x5208,\n    0x53E1, 0x66F3, 0x6C6D, 0x6FCA, 0x730A, 0x777F, 0x7A62, 0x82AE,\n    0x85DD, 0x8602, 0x88D4, 0x8A63, 0x8B7D, 0x8C6B, 0x92B3, 0x9713,\n    0x9810, 0x4E94, 0x4F0D, 0x4FC9, 0x50B2, 0x5348, 0x543E, 0x5433,\n    0x55DA, 0x5862, 0x58BA, 0x5967, 0x5A1B, 0x5BE4, 0x609F, 0x61CA,\n    0x6556, 0x65FF, 0x6664, 0x68A7, 0x6C5A, 0x6FB3, 0x70CF, 0x71AC,\n    0x7352, 0x7B7D, 0x8708, 0x8AA4, 0x9C32, 0x9F07, 0x5C4B, 0x6C83,\n    0x7344, 0x7389, 0x923A, 0x6EAB, 0x7465, 0x761F, 0x7A69, 0x7E15,\n    0x860A, 0x5140, 0x58C5, 0x64C1, 0x74EE, 0x7515, 0x7670, 0x7FC1,\n    0x9095, 0x96CD, 0x9954, 0x6E26, 0x74E6, 0x7AA9, 0x7AAA, 0x81E5,\n    0x86D9, 0x8778, 0x8A1B, 0x5A49, 0x5B8C, 0x5B9B, 0x68A1, 0x6900,\n    0x6D63, 0x73A9, 0x7413, 0x742C, 0x7897, 0x7DE9, 0x7FEB, 0x8118,\n    0x8155, 0x839E, 0x8C4C, 0x962E, 0x9811, 0x66F0, 0x5F80, 0x65FA,\n    0x6789, 0x6C6A, 0x738B, 0x502D, 0x5A03, 0x6B6A, 0x77EE, 0x5916,\n    0x5D6C, 0x5DCD, 0x7325, 0x754F, 0x50E5, 0x51F9, 0x582F, 0x592D,\n    0x5996, 0x59DA, 0x5BE5, 0x5DA2, 0x62D7, 0x6416, 0x6493, 0x64FE,\n    0x66DC, 0x6A48, 0x71FF, 0x7464, 0x7A88, 0x7AAF, 0x7E47, 0x7E5E,\n    0x8000, 0x8170, 0x87EF, 0x8981, 0x8B20, 0x9059, 0x9080, 0x9952,\n    0x617E, 0x6B32, 0x6D74, 0x7E1F, 0x8925, 0x8FB1, 0x4FD1, 0x50AD,\n    0x5197, 0x52C7, 0x57C7, 0x5889, 0x5BB9, 0x5EB8, 0x6142, 0x6995,\n    0x6D8C, 0x6E67, 0x6EB6, 0x7194, 0x7462, 0x7528, 0x752C, 0x8073,\n    0x8338, 0x84C9, 0x8E0A, 0x9394, 0x93DE, 0x4E8E, 0x4F51, 0x5076,\n    0x512A, 0x53C8, 0x53CB, 0x53F3, 0x5B87, 0x5BD3, 0x5C24, 0x611A,\n    0x6182, 0x65F4, 0x725B, 0x7397, 0x7440, 0x76C2, 0x7950, 0x7991,\n    0x79B9, 0x7D06, 0x7FBD, 0x828B, 0x85D5, 0x865E, 0x8FC2, 0x9047,\n    0x90F5, 0x91EA, 0x9685, 0x96E8, 0x96E9, 0x52D6, 0x5F67, 0x65ED,\n    0x6631, 0x682F, 0x715C, 0x7A36, 0x90C1, 0x980A, 0x4E91, 0x6A52,\n    0x6B9E, 0x6F90, 0x7189, 0x8018, 0x82B8, 0x8553, 0x904B, 0x9695,\n    0x96F2, 0x97FB, 0x851A, 0x9B31, 0x4E90, 0x718A, 0x96C4, 0x5143,\n    0x539F, 0x54E1, 0x5713, 0x5712, 0x57A3, 0x5A9B, 0x5AC4, 0x5BC3,\n    0x6028, 0x613F, 0x63F4, 0x6C85, 0x6D39, 0x6E72, 0x6E90, 0x7230,\n    0x733F, 0x7457, 0x82D1, 0x8881, 0x8F45, 0x9060, 0x9662, 0x9858,\n    0x9D1B, 0x6708, 0x8D8A, 0x925E, 0x4F4D, 0x5049, 0x50DE, 0x5371,\n    0x570D, 0x59D4, 0x5A01, 0x5C09, 0x6170, 0x6690, 0x6E2D, 0x7232,\n    0x744B, 0x7DEF, 0x80C3, 0x840E, 0x8466, 0x853F, 0x875F, 0x885B,\n    0x8918, 0x8B02, 0x9055, 0x97CB, 0x9B4F, 0x4E73, 0x4F91, 0x5112,\n    0x516A, 0x552F, 0x55A9, 0x5B7A, 0x5BA5, 0x5E7C, 0x5E7D, 0x5EBE,\n    0x60A0, 0x60DF, 0x6108, 0x6109, 0x63C4, 0x6538, 0x6709, 0x67D4,\n    0x67DA, 0x6961, 0x6962, 0x6CB9, 0x6D27, 0x6E38, 0x6FE1, 0x7336,\n    0x7337, 0x745C, 0x7531, 0x7652, 0x7DAD, 0x81FE, 0x8438, 0x88D5,\n    0x8A98, 0x8ADB, 0x8AED, 0x8E30, 0x8E42, 0x904A, 0x903E, 0x907A,\n    0x9149, 0x91C9, 0x936E, 0x5809, 0x6BD3, 0x8089, 0x80B2, 0x5141,\n    0x596B, 0x5C39, 0x6F64, 0x73A7, 0x80E4, 0x8D07, 0x9217, 0x958F,\n    0x807F, 0x620E, 0x701C, 0x7D68, 0x878D, 0x57A0, 0x6069, 0x6147,\n    0x6BB7, 0x8ABE, 0x9280, 0x96B1, 0x4E59, 0x541F, 0x6DEB, 0x852D,\n    0x9670, 0x97F3, 0x98EE, 0x63D6, 0x6CE3, 0x9091, 0x51DD, 0x61C9,\n    0x81BA, 0x9DF9, 0x4F9D, 0x501A, 0x5100, 0x5B9C, 0x610F, 0x61FF,\n    0x64EC, 0x6905, 0x6BC5, 0x7591, 0x77E3, 0x7FA9, 0x8264, 0x858F,\n    0x87FB, 0x8863, 0x8ABC, 0x8B70, 0x91AB, 0x4E8C, 0x4EE5, 0x4F0A,\n    0x5937, 0x59E8, 0x5DF2, 0x5F1B, 0x5F5B, 0x6021, 0x723E, 0x73E5,\n    0x7570, 0x75CD, 0x79FB, 0x800C, 0x8033, 0x8084, 0x82E1, 0x8351,\n    0x8CBD, 0x8CB3, 0x9087, 0x98F4, 0x990C, 0x7037, 0x76CA, 0x7FCA,\n    0x7FCC, 0x7FFC, 0x8B1A, 0x4EBA, 0x4EC1, 0x5203, 0x5370, 0x54BD,\n    0x56E0, 0x59FB, 0x5BC5, 0x5F15, 0x5FCD, 0x6E6E, 0x7D6A, 0x8335,\n    0x8693, 0x8A8D, 0x976D, 0x9777, 0x4E00, 0x4F5A, 0x4F7E, 0x58F9,\n    0x65E5, 0x6EA2, 0x9038, 0x93B0, 0x99B9, 0x4EFB, 0x58EC, 0x598A,\n    0x59D9, 0x6041, 0x7A14, 0x834F, 0x8CC3, 0x5165, 0x5344, 0x4ECD,\n    0x5269, 0x5B55, 0x82BF, 0x4ED4, 0x523A, 0x54A8, 0x59C9, 0x59FF,\n    0x5B50, 0x5B57, 0x5B5C, 0x6063, 0x6148, 0x6ECB, 0x7099, 0x716E,\n    0x7386, 0x74F7, 0x75B5, 0x78C1, 0x7D2B, 0x8005, 0x81EA, 0x8328,\n    0x8517, 0x85C9, 0x8AEE, 0x8CC7, 0x96CC, 0x4F5C, 0x52FA, 0x56BC,\n    0x65AB, 0x6628, 0x707C, 0x70B8, 0x7235, 0x7DBD, 0x828D, 0x914C,\n    0x96C0, 0x9D72, 0x5B71, 0x68E7, 0x6B98, 0x6F7A, 0x76DE, 0x5C91,\n    0x66AB, 0x6F5B, 0x7BB4, 0x7C2A, 0x8836, 0x96DC, 0x4E08, 0x4ED7,\n    0x5320, 0x5834, 0x58BB, 0x58EF, 0x596C, 0x5C07, 0x5E33, 0x5E84,\n    0x5F35, 0x638C, 0x66B2, 0x6756, 0x6A1F, 0x6AA3, 0x6B0C, 0x6F3F,\n    0x7246, 0x7350, 0x748B, 0x7AE0, 0x7CA7, 0x8178, 0x81DF, 0x81E7,\n    0x838A, 0x846C, 0x8523, 0x8594, 0x85CF, 0x88DD, 0x8D13, 0x91AC,\n    0x9577, 0x969C, 0x518D, 0x54C9, 0x5728, 0x5BB0, 0x624D, 0x6750,\n    0x683D, 0x6893, 0x6E3D, 0x6ED3, 0x707D, 0x7E21, 0x88C1, 0x8CA1,\n    0x8F09, 0x9F4B, 0x9F4E, 0x722D, 0x7B8F, 0x8ACD, 0x931A, 0x4F47,\n    0x4F4E, 0x5132, 0x5480, 0x59D0, 0x5E95, 0x62B5, 0x6775, 0x696E,\n    0x6A17, 0x6CAE, 0x6E1A, 0x72D9, 0x732A, 0x75BD, 0x7BB8, 0x7D35,\n    0x82E7, 0x83F9, 0x8457, 0x85F7, 0x8A5B, 0x8CAF, 0x8E87, 0x9019,\n    0x90B8, 0x96CE, 0x9F5F, 0x52E3, 0x540A, 0x5AE1, 0x5BC2, 0x6458,\n    0x6575, 0x6EF4, 0x72C4, 0x7684, 0x7A4D, 0x7B1B, 0x7C4D, 0x7E3E,\n    0x7FDF, 0x837B, 0x8B2B, 0x8CCA, 0x8D64, 0x8DE1, 0x8E5F, 0x8FEA,\n    0x8FF9, 0x9069, 0x93D1, 0x4F43, 0x4F7A, 0x50B3, 0x5168, 0x5178,\n    0x524D, 0x526A, 0x5861, 0x587C, 0x5960, 0x5C08, 0x5C55, 0x5EDB,\n    0x609B, 0x6230, 0x6813, 0x6BBF, 0x6C08, 0x6FB1, 0x714E, 0x7420,\n    0x7530, 0x7538, 0x7551, 0x7672, 0x7B4C, 0x7B8B, 0x7BAD, 0x7BC6,\n    0x7E8F, 0x8A6E, 0x8F3E, 0x8F49, 0x923F, 0x9293, 0x9322, 0x942B,\n    0x96FB, 0x985A, 0x986B, 0x991E, 0x5207, 0x622A, 0x6298, 0x6D59,\n    0x7664, 0x7ACA, 0x7BC0, 0x7D76, 0x5360, 0x5CBE, 0x5E97, 0x6F38,\n    0x70B9, 0x7C98, 0x9711, 0x9B8E, 0x9EDE, 0x63A5, 0x647A, 0x8776,\n    0x4E01, 0x4E95, 0x4EAD, 0x505C, 0x5075, 0x5448, 0x59C3, 0x5B9A,\n    0x5E40, 0x5EAD, 0x5EF7, 0x5F81, 0x60C5, 0x633A, 0x653F, 0x6574,\n    0x65CC, 0x6676, 0x6678, 0x67FE, 0x6968, 0x6A89, 0x6B63, 0x6C40,\n    0x6DC0, 0x6DE8, 0x6E1F, 0x6E5E, 0x701E, 0x70A1, 0x738E, 0x73FD,\n    0x753A, 0x775B, 0x7887, 0x798E, 0x7A0B, 0x7A7D, 0x7CBE, 0x7D8E,\n    0x8247, 0x8A02, 0x8AEA, 0x8C9E, 0x912D, 0x914A, 0x91D8, 0x9266,\n    0x92CC, 0x9320, 0x9706, 0x9756, 0x975C, 0x9802, 0x9F0E, 0x5236,\n    0x5291, 0x557C, 0x5824, 0x5E1D, 0x5F1F, 0x608C, 0x63D0, 0x68AF,\n    0x6FDF, 0x796D, 0x7B2C, 0x81CD, 0x85BA, 0x88FD, 0x8AF8, 0x8E44,\n    0x918D, 0x9664, 0x969B, 0x973D, 0x984C, 0x9F4A, 0x4FCE, 0x5146,\n    0x51CB, 0x52A9, 0x5632, 0x5F14, 0x5F6B, 0x63AA, 0x64CD, 0x65E9,\n    0x6641, 0x66FA, 0x66F9, 0x671D, 0x689D, 0x68D7, 0x69FD, 0x6F15,\n    0x6F6E, 0x7167, 0x71E5, 0x722A, 0x74AA, 0x773A, 0x7956, 0x795A,\n    0x79DF, 0x7A20, 0x7A95, 0x7C97, 0x7CDF, 0x7D44, 0x7E70, 0x8087,\n    0x85FB, 0x86A4, 0x8A54, 0x8ABF, 0x8D99, 0x8E81, 0x9020, 0x906D,\n    0x91E3, 0x963B, 0x96D5, 0x9CE5, 0x65CF, 0x7C07, 0x8DB3, 0x93C3,\n    0x5B58, 0x5C0A, 0x5352, 0x62D9, 0x731D, 0x5027, 0x5B97, 0x5F9E,\n    0x60B0, 0x616B, 0x68D5, 0x6DD9, 0x742E, 0x7A2E, 0x7D42, 0x7D9C,\n    0x7E31, 0x816B, 0x8E2A, 0x8E35, 0x937E, 0x9418, 0x4F50, 0x5750,\n    0x5DE6, 0x5EA7, 0x632B, 0x7F6A, 0x4E3B, 0x4F4F, 0x4F8F, 0x505A,\n    0x59DD, 0x80C4, 0x546A, 0x5468, 0x55FE, 0x594F, 0x5B99, 0x5DDE,\n    0x5EDA, 0x665D, 0x6731, 0x67F1, 0x682A, 0x6CE8, 0x6D32, 0x6E4A,\n    0x6F8D, 0x70B7, 0x73E0, 0x7587, 0x7C4C, 0x7D02, 0x7D2C, 0x7DA2,\n    0x821F, 0x86DB, 0x8A3B, 0x8A85, 0x8D70, 0x8E8A, 0x8F33, 0x9031,\n    0x914E, 0x9152, 0x9444, 0x99D0, 0x7AF9, 0x7CA5, 0x4FCA, 0x5101,\n    0x51C6, 0x57C8, 0x5BEF, 0x5CFB, 0x6659, 0x6A3D, 0x6D5A, 0x6E96,\n    0x6FEC, 0x710C, 0x756F, 0x7AE3, 0x8822, 0x9021, 0x9075, 0x96CB,\n    0x99FF, 0x8301, 0x4E2D, 0x4EF2, 0x8846, 0x91CD, 0x537D, 0x6ADB,\n    0x696B, 0x6C41, 0x847A, 0x589E, 0x618E, 0x66FE, 0x62EF, 0x70DD,\n    0x7511, 0x75C7, 0x7E52, 0x84B8, 0x8B49, 0x8D08, 0x4E4B, 0x53EA,\n    0x54AB, 0x5730, 0x5740, 0x5FD7, 0x6301, 0x6307, 0x646F, 0x652F,\n    0x65E8, 0x667A, 0x679D, 0x67B3, 0x6B62, 0x6C60, 0x6C9A, 0x6F2C,\n    0x77E5, 0x7825, 0x7949, 0x7957, 0x7D19, 0x80A2, 0x8102, 0x81F3,\n    0x829D, 0x82B7, 0x8718, 0x8A8C, 0x8D04, 0x8DBE, 0x9072, 0x76F4,\n    0x7A19, 0x7A37, 0x7E54, 0x8077, 0x5507, 0x55D4, 0x5875, 0x632F,\n    0x6422, 0x6649, 0x664B, 0x686D, 0x699B, 0x6B84, 0x6D25, 0x6EB1,\n    0x73CD, 0x7468, 0x74A1, 0x755B, 0x75B9, 0x76E1, 0x771E, 0x778B,\n    0x79E6, 0x7E09, 0x7E1D, 0x81FB, 0x852F, 0x8897, 0x8A3A, 0x8CD1,\n    0x8EEB, 0x8FB0, 0x9032, 0x93AD, 0x9663, 0x9673, 0x9707, 0x4F84,\n    0x53F1, 0x59EA, 0x5AC9, 0x5E19, 0x684E, 0x74C6, 0x75BE, 0x79E9,\n    0x7A92, 0x81A3, 0x86ED, 0x8CEA, 0x8DCC, 0x8FED, 0x659F, 0x6715,\n    0x57F7, 0x6F57, 0x7DDD, 0x8F2F, 0x93F6, 0x96C6, 0x5FB5, 0x61F2,\n    0x6F84, 0x4E14, 0x4F98, 0x501F, 0x53C9, 0x55DF, 0x5D6F, 0x5DEE,\n    0x6B21, 0x6B64, 0x78CB, 0x7B9A, 0x8E49, 0x8ECA, 0x906E, 0x6349,\n    0x643E, 0x7740, 0x7A84, 0x932F, 0x947F, 0x9F6A, 0x64B0, 0x6FAF,\n    0x71E6, 0x74A8, 0x74DA, 0x7AC4, 0x7C12, 0x7E82, 0x7CB2, 0x7E98,\n    0x8B9A, 0x8D0A, 0x947D, 0x9910, 0x994C, 0x5239, 0x5BDF, 0x64E6,\n    0x672D, 0x7D2E, 0x50ED, 0x53C3, 0x5879, 0x6158, 0x6159, 0x61FA,\n    0x65AC, 0x7AD9, 0x8B92, 0x8B96, 0x5009, 0x5021, 0x5275, 0x5531,\n    0x5A3C, 0x5EE0, 0x5F70, 0x6134, 0x655E, 0x660C, 0x6636, 0x66A2,\n    0x69CD, 0x6EC4, 0x6F32, 0x7316, 0x7621, 0x7A93, 0x8139, 0x8259,\n    0x83D6, 0x84BC, 0x50B5, 0x57F0, 0x5BC0, 0x5BE8, 0x5F69, 0x63A1,\n    0x7826, 0x7DB5, 0x83DC, 0x8521, 0x91C7, 0x91F5, 0x518A, 0x67F5,\n    0x7B56, 0x8CAC, 0x51C4, 0x59BB, 0x60BD, 0x8655, 0x501C, 0x5254,\n    0x5C3A, 0x617D, 0x621A, 0x62D3, 0x64F2, 0x65A5, 0x6ECC, 0x7620,\n    0x810A, 0x8E60, 0x965F, 0x96BB, 0x4EDF, 0x5343, 0x5598, 0x5929,\n    0x5DDD, 0x64C5, 0x6CC9, 0x6DFA, 0x7394, 0x7A7F, 0x821B, 0x85A6,\n    0x8CE4, 0x8E10, 0x9077, 0x91E7, 0x95E1, 0x9621, 0x97C6, 0x51F8,\n    0x54F2, 0x5586, 0x5FB9, 0x64A4, 0x6F88, 0x7DB4, 0x8F1F, 0x8F4D,\n    0x9435, 0x50C9, 0x5C16, 0x6CBE, 0x6DFB, 0x751B, 0x77BB, 0x7C3D,\n    0x7C64, 0x8A79, 0x8AC2, 0x581E, 0x59BE, 0x5E16, 0x6377, 0x7252,\n    0x758A, 0x776B, 0x8ADC, 0x8CBC, 0x8F12, 0x5EF3, 0x6674, 0x6DF8,\n    0x807D, 0x83C1, 0x8ACB, 0x9751, 0x9BD6, 0x5243, 0x66FF, 0x6D95,\n    0x6EEF, 0x7DE0, 0x8AE6, 0x902E, 0x905E, 0x9AD4, 0x521D, 0x527F,\n    0x54E8, 0x6194, 0x6284, 0x62DB, 0x68A2, 0x6912, 0x695A, 0x6A35,\n    0x7092, 0x7126, 0x785D, 0x7901, 0x790E, 0x79D2, 0x7A0D, 0x8096,\n    0x8278, 0x82D5, 0x8349, 0x8549, 0x8C82, 0x8D85, 0x9162, 0x918B,\n    0x91AE, 0x4FC3, 0x56D1, 0x71ED, 0x77D7, 0x8700, 0x89F8, 0x5BF8,\n    0x5FD6, 0x6751, 0x90A8, 0x53E2, 0x585A, 0x5BF5, 0x60A4, 0x6181,\n    0x6460, 0x7E3D, 0x8070, 0x8525, 0x9283, 0x64AE, 0x50AC, 0x5D14,\n    0x6700, 0x589C, 0x62BD, 0x63A8, 0x690E, 0x6978, 0x6A1E, 0x6E6B,\n    0x76BA, 0x79CB, 0x82BB, 0x8429, 0x8ACF, 0x8DA8, 0x8FFD, 0x9112,\n    0x914B, 0x919C, 0x9310, 0x9318, 0x939A, 0x96DB, 0x9A36, 0x9C0D,\n    0x4E11, 0x755C, 0x795D, 0x7AFA, 0x7B51, 0x7BC9, 0x7E2E, 0x84C4,\n    0x8E59, 0x8E74, 0x8EF8, 0x9010, 0x6625, 0x693F, 0x7443, 0x51FA,\n    0x672E, 0x9EDC, 0x5145, 0x5FE0, 0x6C96, 0x87F2, 0x885D, 0x8877,\n    0x60B4, 0x81B5, 0x8403, 0x8D05, 0x53D6, 0x5439, 0x5634, 0x5A36,\n    0x5C31, 0x708A, 0x7FE0, 0x805A, 0x8106, 0x81ED, 0x8DA3, 0x9189,\n    0x9A5F, 0x9DF2, 0x5074, 0x4EC4, 0x53A0, 0x60FB, 0x6E2C, 0x5C64,\n    0x4F88, 0x5024, 0x55E4, 0x5CD9, 0x5E5F, 0x6065, 0x6894, 0x6CBB,\n    0x6DC4, 0x71BE, 0x75D4, 0x75F4, 0x7661, 0x7A1A, 0x7A49, 0x7DC7,\n    0x7DFB, 0x7F6E, 0x81F4, 0x86A9, 0x8F1C, 0x96C9, 0x99B3, 0x9F52,\n    0x5247, 0x52C5, 0x98ED, 0x89AA, 0x4E03, 0x67D2, 0x6F06, 0x4FB5,\n    0x5BE2, 0x6795, 0x6C88, 0x6D78, 0x741B, 0x7827, 0x91DD, 0x937C,\n    0x87C4, 0x79E4, 0x7A31, 0x5FEB, 0x4ED6, 0x54A4, 0x553E, 0x58AE,\n    0x59A5, 0x60F0, 0x6253, 0x62D6, 0x6736, 0x6955, 0x8235, 0x9640,\n    0x99B1, 0x99DD, 0x502C, 0x5353, 0x5544, 0x577C, 0x6258, 0x64E2,\n    0x666B, 0x67DD, 0x6FC1, 0x6FEF, 0x7422, 0x7438, 0x8A17, 0x9438,\n    0x5451, 0x5606, 0x5766, 0x5F48, 0x619A, 0x6B4E, 0x7058, 0x70AD,\n    0x7DBB, 0x8A95, 0x596A, 0x812B, 0x63A2, 0x7708, 0x803D, 0x8CAA,\n    0x5854, 0x642D, 0x69BB, 0x5B95, 0x5E11, 0x6E6F, 0x8569, 0x514C,\n    0x53F0, 0x592A, 0x6020, 0x614B, 0x6B86, 0x6C70, 0x6CF0, 0x7B1E,\n    0x80CE, 0x82D4, 0x8DC6, 0x90B0, 0x98B1, 0x64C7, 0x6FA4, 0x6491,\n    0x6504, 0x514E, 0x5410, 0x571F, 0x8A0E, 0x615F, 0x6876, 0x75DB,\n    0x7B52, 0x7D71, 0x901A, 0x5806, 0x69CC, 0x817F, 0x892A, 0x9000,\n    0x9839, 0x5078, 0x5957, 0x59AC, 0x6295, 0x900F, 0x9B2A, 0x615D,\n    0x7279, 0x95D6, 0x5761, 0x5A46, 0x5DF4, 0x628A, 0x64AD, 0x64FA,\n    0x6777, 0x6CE2, 0x6D3E, 0x722C, 0x7436, 0x7834, 0x7F77, 0x82AD,\n    0x8DDB, 0x9817, 0x5224, 0x5742, 0x677F, 0x7248, 0x74E3, 0x8CA9,\n    0x8FA6, 0x9211, 0x962A, 0x516B, 0x53ED, 0x634C, 0x4F69, 0x5504,\n    0x6096, 0x6557, 0x6C9B, 0x6D7F, 0x724C, 0x72FD, 0x7A17, 0x8987,\n    0x8C9D, 0x5F6D, 0x6F8E, 0x70F9, 0x81A8, 0x610E, 0x4FBF, 0x504F,\n    0x6241, 0x7247, 0x7BC7, 0x7DE8, 0x7FE9, 0x904D, 0x97AD, 0x9A19,\n    0x8CB6, 0x576A, 0x5E73, 0x67B0, 0x840D, 0x8A55, 0x5420, 0x5B16,\n    0x5E63, 0x5EE2, 0x5F0A, 0x6583, 0x80BA, 0x853D, 0x9589, 0x965B,\n    0x4F48, 0x5305, 0x530D, 0x530F, 0x5486, 0x54FA, 0x5703, 0x5E03,\n    0x6016, 0x629B, 0x62B1, 0x6355, 0x6CE1, 0x6D66, 0x75B1, 0x7832,\n    0x80DE, 0x812F, 0x82DE, 0x8461, 0x84B2, 0x888D, 0x8912, 0x900B,\n    0x92EA, 0x98FD, 0x9B91, 0x5E45, 0x66B4, 0x66DD, 0x7011, 0x7206,\n    0x4FF5, 0x527D, 0x5F6A, 0x6153, 0x6753, 0x6A19, 0x6F02, 0x74E2,\n    0x7968, 0x8868, 0x8C79, 0x98C7, 0x98C4, 0x9A43, 0x54C1, 0x7A1F,\n    0x6953, 0x8AF7, 0x8C4A, 0x98A8, 0x99AE, 0x5F7C, 0x62AB, 0x75B2,\n    0x76AE, 0x88AB, 0x907F, 0x9642, 0x5339, 0x5F3C, 0x5FC5, 0x6CCC,\n    0x73CC, 0x7562, 0x758B, 0x7B46, 0x82FE, 0x999D, 0x4E4F, 0x903C,\n    0x4E0B, 0x4F55, 0x53A6, 0x590F, 0x5EC8, 0x6630, 0x6CB3, 0x7455,\n    0x8377, 0x8766, 0x8CC0, 0x9050, 0x971E, 0x9C15, 0x58D1, 0x5B78,\n    0x8650, 0x8B14, 0x9DB4, 0x5BD2, 0x6068, 0x608D, 0x65F1, 0x6C57,\n    0x6F22, 0x6FA3, 0x701A, 0x7F55, 0x7FF0, 0x9591, 0x9592, 0x9650,\n    0x97D3, 0x5272, 0x8F44, 0x51FD, 0x542B, 0x54B8, 0x5563, 0x558A,\n    0x6ABB, 0x6DB5, 0x7DD8, 0x8266, 0x929C, 0x9677, 0x9E79, 0x5408,\n    0x54C8, 0x76D2, 0x86E4, 0x95A4, 0x95D4, 0x965C, 0x4EA2, 0x4F09,\n    0x59EE, 0x5AE6, 0x5DF7, 0x6052, 0x6297, 0x676D, 0x6841, 0x6C86,\n    0x6E2F, 0x7F38, 0x809B, 0x822A, 0x9805, 0x4EA5, 0x5055, 0x54B3,\n    0x5793, 0x595A, 0x5B69, 0x5BB3, 0x61C8, 0x6977, 0x6D77, 0x7023,\n    0x87F9, 0x89E3, 0x8A72, 0x8AE7, 0x9082, 0x99ED, 0x9AB8, 0x52BE,\n    0x6838, 0x5016, 0x5E78, 0x674F, 0x8347, 0x884C, 0x4EAB, 0x5411,\n    0x56AE, 0x73E6, 0x9115, 0x97FF, 0x9909, 0x9957, 0x9999, 0x5653,\n    0x589F, 0x865B, 0x8A31, 0x61B2, 0x6AF6, 0x737B, 0x8ED2, 0x6B47,\n    0x96AA, 0x9A57, 0x5955, 0x7200, 0x8D6B, 0x9769, 0x4FD4, 0x5CF4,\n    0x5F26, 0x61F8, 0x665B, 0x6CEB, 0x70AB, 0x7384, 0x73B9, 0x73FE,\n    0x7729, 0x774D, 0x7D43, 0x7D62, 0x7E23, 0x8237, 0x8852, 0x8CE2,\n    0x9249, 0x986F, 0x5B51, 0x7A74, 0x8840, 0x9801, 0x5ACC, 0x4FE0,\n    0x5354, 0x593E, 0x5CFD, 0x633E, 0x6D79, 0x72F9, 0x8105, 0x8107,\n    0x83A2, 0x92CF, 0x9830, 0x4EA8, 0x5144, 0x5211, 0x578B, 0x5F62,\n    0x6CC2, 0x6ECE, 0x7005, 0x7050, 0x70AF, 0x7192, 0x73E9, 0x7469,\n    0x834A, 0x87A2, 0x8861, 0x9008, 0x90A2, 0x93A3, 0x99A8, 0x516E,\n    0x5F57, 0x60E0, 0x6167, 0x66B3, 0x8559, 0x8E4A, 0x91AF, 0x978B,\n    0x4E4E, 0x4E92, 0x547C, 0x58D5, 0x58FA, 0x597D, 0x5CB5, 0x5F27,\n    0x6236, 0x6248, 0x660A, 0x6667, 0x6BEB, 0x6D69, 0x6DCF, 0x6E56,\n    0x6EF8, 0x6F94, 0x6FE0, 0x6FE9, 0x705D, 0x72D0, 0x7425, 0x745A,\n    0x74E0, 0x7693, 0x795C, 0x7CCA, 0x7E1E, 0x80E1, 0x82A6, 0x846B,\n    0x84BF, 0x864E, 0x865F, 0x8774, 0x8B77, 0x8C6A, 0x93AC, 0x9800,\n    0x9865, 0x60D1, 0x6216, 0x9177, 0x5A5A, 0x660F, 0x6DF7, 0x6E3E,\n    0x743F, 0x9B42, 0x5FFD, 0x60DA, 0x7B0F, 0x54C4, 0x5F18, 0x6C5E,\n    0x6CD3, 0x6D2A, 0x70D8, 0x7D05, 0x8679, 0x8A0C, 0x9D3B, 0x5316,\n    0x548C, 0x5B05, 0x6A3A, 0x706B, 0x7575, 0x798D, 0x79BE, 0x82B1,\n    0x83EF, 0x8A71, 0x8B41, 0x8CA8, 0x9774, 0x64F4, 0x652B, 0x78BA,\n    0x78BB, 0x7A6B, 0x4E38, 0x559A, 0x5950, 0x5BA6, 0x5E7B, 0x60A3,\n    0x63DB, 0x6B61, 0x6665, 0x6853, 0x6E19, 0x7165, 0x74B0, 0x7D08,\n    0x9084, 0x9A69, 0x9C25, 0x6D3B, 0x6ED1, 0x733E, 0x8C41, 0x95CA,\n    0x51F0, 0x5E4C, 0x5FA8, 0x604D, 0x60F6, 0x6130, 0x614C, 0x6643,\n    0x6644, 0x69A5, 0x6CC1, 0x6E5F, 0x6EC9, 0x6F62, 0x714C, 0x749C,\n    0x7687, 0x7BC1, 0x7C27, 0x8352, 0x8757, 0x9051, 0x968D, 0x9EC3,\n    0x532F, 0x56DE, 0x5EFB, 0x5F8A, 0x6062, 0x6094, 0x61F7, 0x6666,\n    0x6703, 0x6A9C, 0x6DEE, 0x6FAE, 0x7070, 0x736A, 0x7E6A, 0x81BE,\n    0x8334, 0x86D4, 0x8AA8, 0x8CC4, 0x5283, 0x7372, 0x5B96, 0x6A6B,\n    0x9404, 0x54EE, 0x5686, 0x5B5D, 0x6548, 0x6585, 0x66C9, 0x689F,\n    0x6D8D, 0x6DC6, 0x723B, 0x80B4, 0x9175, 0x9A4D, 0x4FAF, 0x5019,\n    0x539A, 0x540E, 0x543C, 0x5589, 0x55C5, 0x5E3F, 0x5F8C, 0x673D,\n    0x7166, 0x73DD, 0x9005, 0x52DB, 0x52F3, 0x5864, 0x58CE, 0x7104,\n    0x718F, 0x71FB, 0x85B0, 0x8A13, 0x6688, 0x85A8, 0x55A7, 0x6684,\n    0x714A, 0x8431, 0x5349, 0x5599, 0x6BC1, 0x5F59, 0x5FBD, 0x63EE,\n    0x6689, 0x7147, 0x8AF1, 0x8F1D, 0x9EBE, 0x4F11, 0x643A, 0x70CB,\n    0x7566, 0x8667, 0x6064, 0x8B4E, 0x9DF8, 0x5147, 0x51F6, 0x5308,\n    0x6D36, 0x80F8, 0x9ED1, 0x6615, 0x6B23, 0x7098, 0x75D5, 0x5403,\n    0x5C79, 0x7D07, 0x8A16, 0x6B20, 0x6B3D, 0x6B46, 0x5438, 0x6070,\n    0x6D3D, 0x7FD5, 0x8208, 0x50D6, 0x51DE, 0x559C, 0x566B, 0x56CD,\n    0x59EC, 0x5B09, 0x5E0C, 0x6199, 0x6198, 0x6231, 0x665E, 0x66E6,\n    0x7199, 0x71B9, 0x71BA, 0x72A7, 0x79A7, 0x7A00, 0x7FB2, 0x8A70,\n    0x3001, 0x3002, 0x2025, 0x00AD, 0x2015, 0x2225, 0xFF5E, 0x3014,\n    0x3015, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E,\n    0x300F, 0x3010, 0x3011, 0x3013, 0xFF01, 0xFF08, 0xFF09, 0xFF0C,\n    0xFF0E, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, 0xFF3B,\n    0xFF3D, 0xFF3F, 0xFF5B, 0xFF5C, 0xFF5D, 0xFF5E, 0x0020, 0x0021,\n    0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029,\n    0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031,\n    0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,\n    0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041,\n    0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049,\n    0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,\n    0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,\n    0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061,\n    0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069,\n    0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071,\n    0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079,\n    0x007A, 0x007B, 0x007C, 0x007D, 0x203E, 0x007E, 0x005C, 0x231C,\n    0x231F, 0x0000, 0x0000, 0x0000, 0x0000, 0x300E, 0x300F, 0x300A,\n    0x300B, 0x3008, 0x3009, 0x0028, 0x0029, 0x0000, 0x0000, 0x0028,\n    0x0029, 0x0028, 0x0029, 0x0000, 0x0000, 0x0028, 0x0029, 0x0000,\n    0x0000, 0x3016, 0x3017, 0x3016, 0x3017, 0x3018, 0x3019, 0x005B,\n    0x005D, 0x0000, 0x0000, 0x263E, 0x263D, 0x2021, 0x2021, 0x2020,\n    0x2021, 0x0000, 0x2217, 0x0000, 0x0000, 0x201F, 0x201B, 0x02D6,\n    0x02D7, 0x00D7, 0x221E, 0x0000, 0x00B1, 0x2213, 0x003E, 0x003C,\n    0x003D, 0x2260, 0x207D, 0x207E, 0x007B, 0x007D, 0x0000, 0x0000,\n    0x2229, 0x222A, 0x2282, 0x2208, 0x03A3, 0x0021, 0x0000, 0x3021,\n    0x3022, 0x3023, 0x0000, 0x0000, 0x0000, 0x4E03, 0x0000, 0x0000,\n    0x5341, 0x0000, 0x0000, 0x0027, 0x3014, 0x3015, 0x002A, 0x0000,\n    0x2217, 0x002A, 0xCDCD, 0x3001, 0x3002, 0x0028, 0x0029, 0x0028,\n    0x0029, 0x0028, 0x0029, 0x3016, 0x3017, 0x3010, 0x3011, 0x0000,\n    0x0000, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,\n    0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,\n    0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x00B6, 0x0000, 0x0000,\n    0x22EF, 0x2237, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,\n    0x20DE, 0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,\n    0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x278A, 0x278B,\n    0x278C, 0x278D, 0x278E, 0x278F, 0x2790, 0x2791, 0x2792, 0x2793,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,\n    0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,\n    0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,\n    0x0029, 0x0029, 0x0029, 0x0029, 0x24B6, 0x24B7, 0x24B8, 0x24B9,\n    0x24BA, 0x24BB, 0x24BC, 0x24BD, 0x24BE, 0x24BF, 0x24C0, 0x24C1,\n    0x24C2, 0x24C3, 0x24C4, 0x24C5, 0x24C6, 0x24C7, 0x24C8, 0x24C9,\n    0x24CA, 0x24CB, 0x24CC, 0x24CD, 0x24CE, 0x24CF, 0x20DE, 0x20DE,\n    0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x005D,\n    0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,\n    0x005D, 0x005D, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,\n    0x20DE, 0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,\n    0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x22CF, 0x22CE, 0x22CF, 0x22CE, 0x2280,\n    0x2281, 0x2270, 0x2271, 0x2272, 0x2273, 0x0000, 0x228A, 0x0000,\n    0x228B, 0x2276, 0x2277, 0x2279, 0x22DA, 0x22DB, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x2221, 0x2245, 0x2243, 0x2248, 0x0000, 0x22A4,\n    0x22AB, 0x0000, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,\n    0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x0000, 0x2460, 0x2461, 0x2462,\n    0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x0029, 0x0029,\n    0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,\n    0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,\n    0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,\n    0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,\n    0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,\n    0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,\n    0x0029, 0x0029, 0x0021, 0x00B0, 0x0027, 0x0022, 0x2034, 0x0029,\n    0x0029, 0x0029, 0x0029, 0x0000, 0x0000, 0x2020, 0x2020, 0x2021,\n    0x2020, 0x00A7, 0x0023, 0x002A, 0x002A, 0x0000, 0x0000, 0x2042,\n    0x002A, 0x0000, 0x0000, 0x2042, 0x002A, 0x0000, 0x0000, 0x2022,\n    0x20DF, 0x20DF, 0x0000, 0x20DF, 0x3008, 0x3009, 0x300A, 0x300B,\n    0x261C, 0x261E, 0x0000, 0x0000, 0x20DE, 0x0000, 0x20DE, 0x20DE,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x20DD, 0x20DD, 0x271A, 0x2716,\n    0x0000, 0x25EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x25CC,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20A9, 0x0000, 0x0000,\n    0x262F, 0x0000, 0x262F, 0x262F, 0x0000, 0x0000, 0x0000, 0x3020,\n    0x0000, 0x2776, 0x2777, 0x2778, 0x2779, 0x277A, 0x277B, 0x277C,\n    0x277D, 0x277E, 0x277F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0029, 0x0029, 0x0029,\n    0x0029, 0x0029, 0x0029, 0x2642, 0x22A9, 0x3036, 0x25CB, 0x25D3,\n    0x25A1, 0x2302, 0x0000, 0x25AD, 0x25AD, 0x0000, 0x0000, 0x0000,\n    0x25C7, 0x0000, 0x0000, 0x2206, 0x22BF, 0x231E, 0x0000, 0x2225,\n    0x2226, 0x0000, 0x2253, 0x2251, 0x2266, 0x2267, 0x2213, 0x2295,\n    0x2296, 0x2297, 0x20DD, 0x2314, 0x0000, 0x0000, 0x2262, 0x0000,\n    0x25B1, 0x0000, 0x2222, 0x2250, 0x00D8, 0x234A, 0x22A3, 0x0338,\n    0x0000, 0x226E, 0x226F, 0x2285, 0x2284, 0x2209, 0x220C, 0x22BB,\n    0x0016, 0x225A, 0x2306, 0x0024, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x329E, 0x0000, 0x203C, 0x003F, 0x0000, 0x003F, 0x22C4,\n    0x25C7, 0x22C4, 0x25C6, 0x25AB, 0x25A1, 0x25AB, 0x25A0, 0x25E6,\n    0x25CB, 0x25E6, 0x25CF, 0x25BD, 0x25B3, 0x25B7, 0x25C1, 0x2726,\n    0x25CF, 0x25A0, 0x0000, 0x25CA, 0x3231, 0x3239, 0x33CB, 0x2483,\n    0x2494, 0x2495, 0x2496, 0x2497, 0x0029, 0x0029, 0x0029, 0x0029,\n    0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x2192, 0x2190,\n    0x2191, 0x2193, 0x2196, 0x2197, 0x2198, 0x2199, 0x21D0, 0x21CF,\n    0x21CD, 0x21D4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x2794, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x279C, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x27BA, 0x0000, 0x0000, 0x0000, 0x0000, 0x21D1, 0x21D3,\n    0x0000, 0x279E, 0x0000, 0x0000, 0x0000, 0x279E, 0x0000, 0x0000,\n    0x21B5, 0x21B1, 0x0000, 0x21B4, 0x21B0, 0x21B3, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x21E6, 0x21E8, 0x21E7, 0x21E9, 0x21BC, 0x21C0, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x21C0, 0x21BC, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x21C4, 0x21C5, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,\n    0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,\n    0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,\n    0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,\n    0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,\n    0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,\n    0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x20DE, 0x20DE,\n    0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,\n    0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,\n    0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,\n    0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,\n    0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,\n    0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,\n    0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,\n    0x20DE, 0x20DE, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,\n    0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,\n    0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,\n    0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,\n    0x20DD, 0x20DD, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, 0x0029,\n    0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x20DD, 0x20DD, 0x20DD,\n    0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,\n    0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,\n    0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,\n    0x3294, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,\n    0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,\n    0x32A5, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,\n    0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,\n    0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,\n    0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,\n    0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,\n    0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,\n    0x20DD, 0x0029, 0x0029, 0x0029, 0x0029, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x2794, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x21E0, 0x21E1,\n    0x21E2, 0x21E3, 0x0000, 0x27A1, 0x0000, 0x0000, 0x21E6, 0x21E8,\n    0x21E7, 0x21E9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x261D, 0x261F,\n    0x0000, 0x0000, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,\n    0x20DD, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,\n    0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,\n    0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x20DE, 0x20DE, 0x20DE,\n    0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x005D,\n    0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,\n    0x005D, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,\n    0x20DE, 0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,\n    0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x20DE, 0x20DE, 0x20DE,\n    0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x3290, 0x328A, 0x328B, 0x328C,\n    0x328D, 0x328E, 0x328F, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,\n    0x20DE, 0x20DE, 0x300C, 0x300D, 0x300E, 0x300F, 0x21E8, 0x21E6,\n    0x21E7, 0x21E9, 0x0022, 0x301F, 0x301D, 0x2036, 0x0060, 0x3001,\n    0x0000, 0x0021, 0x3021, 0x002C, 0x3002, 0xAC02, 0xAC03, 0xAC05,\n    0xAC06, 0xAC0B, 0xAC0C, 0xAC0D, 0xAC0E, 0xAC0F, 0xAC18, 0xAC1E,\n    0xAC1F, 0xAC21, 0xAC22, 0xAC23, 0xAC25, 0xAC26, 0xAC27, 0xAC28,\n    0xAC29, 0xAC2A, 0xAC2B, 0xAC2E, 0xAC32, 0xAC33, 0xAC34, 0xAC35,\n    0xAC36, 0xAC37, 0xAC3A, 0xAC3B, 0xAC3D, 0xAC3E, 0xAC3F, 0xAC41,\n    0xAC42, 0xAC43, 0xAC44, 0xAC45, 0xAC46, 0xAC47, 0xAC48, 0xAC49,\n    0xAC4A, 0xAC4C, 0xAC4E, 0xAC4F, 0xAC50, 0xAC51, 0xAC52, 0xAC53,\n    0xAC55, 0xAC56, 0xAC57, 0xAC59, 0xAC5A, 0xAC5B, 0xAC5D, 0xAC5E,\n    0xAC5F, 0xAC60, 0xAC61, 0xAC62, 0xAC63, 0xAC64, 0xAC65, 0xAC66,\n    0xAC67, 0xAC68, 0xAC69, 0xAC6A, 0xAC6B, 0xAC6C, 0xAC6D, 0xAC6E,\n    0xAC6F, 0xAC72, 0xAC73, 0xAC75, 0xAC76, 0xAC79, 0xAC7B, 0xAC7C,\n    0xAC7D, 0xAC7E, 0xAC7F, 0xAC82, 0xAC87, 0xAC88, 0xAC8D, 0xAC8E,\n    0xAC8F, 0xAC91, 0xAC92, 0xAC93, 0xAC95, 0xAC96, 0xAC97, 0xAC98,\n    0xAC99, 0xAC9A, 0xAC9B, 0xAC9E, 0xACA2, 0xACA3, 0xACA4, 0xACA5,\n    0xACA6, 0xACA7, 0xACAB, 0xACAD, 0xACAE, 0xACB1, 0xACB2, 0xACB3,\n    0xACB4, 0xACB5, 0xACB6, 0xACB7, 0xACBA, 0xACBE, 0xACBF, 0xACC0,\n    0xACC2, 0xACC3, 0xACC5, 0xACC6, 0xACC7, 0xACC9, 0xACCA, 0xACCB,\n    0xACCD, 0xACCE, 0xACCF, 0xACD0, 0xACD1, 0xACD2, 0xACD3, 0xACD4,\n    0xACD6, 0xACD8, 0xACD9, 0xACDA, 0xACDB, 0xACDC, 0xACDD, 0xACDE,\n    0xACDF, 0xACE2, 0xACE3, 0xACE5, 0xACE6, 0xACE9, 0xACEB, 0xACED,\n    0xACEE, 0xACF2, 0xACF4, 0xACF7, 0xACF8, 0xACF9, 0xACFA, 0xACFB,\n    0xACFE, 0xACFF, 0xAD01, 0xAD02, 0xAD03, 0xAD05, 0xAD07, 0xAD08,\n    0xAD09, 0xAD0A, 0xAD0B, 0xAD0E, 0xAD10, 0xAD12, 0xAD13, 0xAD14,\n    0xAD15, 0xAD16, 0xAD17, 0xAD19, 0xAD1A, 0xAD1B, 0xAD1D, 0xAD1E,\n    0xAD1F, 0xAD21, 0xAD22, 0xAD23, 0xAD24, 0xAD25, 0xAD26, 0xAD27,\n    0xAD28, 0xAD2A, 0xAD2B, 0xAD2E, 0xAD2F, 0xAD30, 0xAD31, 0xAD32,\n    0xAD33, 0xAD36, 0xAD37, 0xAD39, 0xAD3A, 0xAD3B, 0xAD3D, 0xAD3E,\n    0xAD3F, 0xAD40, 0xAD41, 0xAD42, 0xAD43, 0xAD46, 0xAD48, 0xAD4A,\n    0xAD4B, 0xAD4C, 0xAD4D, 0xAD4E, 0xAD4F, 0xAD51, 0xAD52, 0xAD53,\n    0xAD55, 0xAD56, 0xAD57, 0xAD59, 0xAD5A, 0xAD5B, 0xAD5C, 0xAD5D,\n    0xAD5E, 0xAD5F, 0xAD60, 0xAD62, 0xAD64, 0xAD65, 0xAD66, 0xAD67,\n    0xAD68, 0xAD69, 0xAD6A, 0xAD6B, 0xAD6E, 0xAD6F, 0xAD71, 0xAD72,\n    0xAD77, 0xAD78, 0xAD79, 0xAD7A, 0xAD7E, 0xAD80, 0xAD83, 0xAD84,\n    0xAD85, 0xAD86, 0xAD87, 0xAD8A, 0xAD8B, 0xAD8D, 0xAD8E, 0xAD8F,\n    0xAD91, 0xAD92, 0xAD93, 0xAD94, 0xAD95, 0xAD96, 0xAD97, 0xAD98,\n    0xAD99, 0xAD9A, 0xAD9B, 0xAD9E, 0xAD9F, 0xADA0, 0xADA1, 0xADA2,\n    0xADA3, 0xADA5, 0xADA6, 0xADA7, 0xADA8, 0xADA9, 0xADAA, 0xADAB,\n    0xADAC, 0xADAD, 0xADAE, 0xADAF, 0xADB0, 0xADB1, 0xADB2, 0xADB3,\n    0xADB4, 0xADB5, 0xADB6, 0xADB8, 0xADB9, 0xADBA, 0xADBB, 0xADBC,\n    0xADBD, 0xADBE, 0xADBF, 0xADC2, 0xADC3, 0xADC5, 0xADC6, 0xADC7,\n    0xADC9, 0xADCA, 0xADCB, 0xADCC, 0xADCD, 0xADCE, 0xADCF, 0xADD2,\n    0xADD4, 0xADD5, 0xADD6, 0xADD7, 0xADD8, 0xADD9, 0xADDA, 0xADDB,\n    0xADDD, 0xADDE, 0xADDF, 0xADE1, 0xADE2, 0xADE3, 0xADE5, 0xADE6,\n    0xADE7, 0xADE8, 0xADE9, 0xADEA, 0xADEB, 0xADEC, 0xADED, 0xADEE,\n    0xADEF, 0xADF0, 0xADF1, 0xADF2, 0xADF3, 0xADF4, 0xADF5, 0xADF6,\n    0xADF7, 0xADFA, 0xADFB, 0xADFD, 0xADFE, 0xAE02, 0xAE03, 0xAE04,\n    0xAE05, 0xAE06, 0xAE07, 0xAE0A, 0xAE0C, 0xAE0E, 0xAE0F, 0xAE10,\n    0xAE11, 0xAE12, 0xAE13, 0xAE15, 0xAE16, 0xAE17, 0xAE18, 0xAE19,\n    0xAE1A, 0xAE1B, 0xAE1C, 0xAE1D, 0xAE1E, 0xAE1F, 0xAE20, 0xAE21,\n    0xAE22, 0xAE23, 0xAE24, 0xAE25, 0xAE26, 0xAE27, 0xAE28, 0xAE29,\n    0xAE2A, 0xAE2B, 0xAE2C, 0xAE2D, 0xAE2E, 0xAE2F, 0xAE32, 0xAE33,\n    0xAE35, 0xAE36, 0xAE39, 0xAE3B, 0xAE3C, 0xAE3D, 0xAE3E, 0xAE3F,\n    0xAE42, 0xAE44, 0xAE47, 0xAE48, 0xAE49, 0xAE4B, 0xAE4F, 0xAE51,\n    0xAE52, 0xAE53, 0xAE55, 0xAE57, 0xAE58, 0xAE59, 0xAE5A, 0xAE5B,\n    0xAE5E, 0xAE62, 0xAE63, 0xAE64, 0xAE66, 0xAE67, 0xAE6A, 0xAE6B,\n    0xAE6D, 0xAE6E, 0xAE6F, 0xAE71, 0xAE72, 0xAE73, 0xAE74, 0xAE75,\n    0xAE76, 0xAE77, 0xAE7A, 0xAE7E, 0xAE7F, 0xAE80, 0xAE81, 0xAE82,\n    0xAE83, 0xAE86, 0xAE87, 0xAE88, 0xAE89, 0xAE8A, 0xAE8B, 0xAE8D,\n    0xAE8E, 0xAE8F, 0xAE90, 0xAE91, 0xAE92, 0xAE93, 0xAE94, 0xAE95,\n    0xAE96, 0xAE97, 0xAE98, 0xAE99, 0xAE9A, 0xAE9B, 0xAE9C, 0xAE9D,\n    0xAE9E, 0xAE9F, 0xAEA0, 0xAEA1, 0xAEA2, 0xAEA3, 0xAEA4, 0xAEA5,\n    0xAEA6, 0xAEA7, 0xAEA8, 0xAEA9, 0xAEAA, 0xAEAB, 0xAEAC, 0xAEAD,\n    0xAEAE, 0xAEAF, 0xAEB0, 0xAEB1, 0xAEB2, 0xAEB3, 0xAEB4, 0xAEB5,\n    0xAEB6, 0xAEB7, 0xAEB8, 0xAEB9, 0xAEBA, 0xAEBB, 0xAEBF, 0xAEC1,\n    0xAEC2, 0xAEC3, 0xAEC5, 0xAEC6, 0xAEC7, 0xAEC8, 0xAEC9, 0xAECA,\n    0xAECB, 0xAECE, 0xAED2, 0xAED3, 0xAED4, 0xAED5, 0xAED6, 0xAED7,\n    0xAEDA, 0xAEDB, 0xAEDD, 0xAEDE, 0xAEDF, 0xAEE0, 0xAEE1, 0xAEE2,\n    0xAEE3, 0xAEE4, 0xAEE5, 0xAEE6, 0xAEE7, 0xAEE9, 0xAEEA, 0xAEEC,\n    0xAEEE, 0xAEEF, 0xAEF0, 0xAEF1, 0xAEF2, 0xAEF3, 0xAEF5, 0xAEF6,\n    0xAEF7, 0xAEF9, 0xAEFA, 0xAEFB, 0xAEFD, 0xAEFE, 0xAEFF, 0xAF00,\n    0xAF01, 0xAF02, 0xAF03, 0xAF04, 0xAF05, 0xAF06, 0xAF09, 0xAF0A,\n    0xAF0B, 0xAF0C, 0xAF0E, 0xAF0F, 0xAF11, 0xAF12, 0xAF13, 0xAF14,\n    0xAF15, 0xAF16, 0xAF17, 0xAF18, 0xAF19, 0xAF1A, 0xAF1B, 0xAF1C,\n    0xAF1D, 0xAF1E, 0xAF1F, 0xAF20, 0xAF21, 0xAF22, 0xAF23, 0xAF24,\n    0xAF25, 0xAF26, 0xAF27, 0xAF28, 0xAF29, 0xAF2A, 0xAF2B, 0xAF2E,\n    0xAF2F, 0xAF31, 0xAF33, 0xAF35, 0xAF36, 0xAF37, 0xAF38, 0xAF39,\n    0xAF3A, 0xAF3B, 0xAF3E, 0xAF40, 0xAF44, 0xAF45, 0xAF46, 0xAF47,\n    0xAF4A, 0xAF4B, 0xAF4C, 0xAF4D, 0xAF4E, 0xAF4F, 0xAF51, 0xAF52,\n    0xAF53, 0xAF54, 0xAF55, 0xAF56, 0xAF57, 0xAF58, 0xAF59, 0xAF5A,\n    0xAF5B, 0xAF5E, 0xAF5F, 0xAF60, 0xAF61, 0xAF62, 0xAF63, 0xAF66,\n    0xAF67, 0xAF68, 0xAF69, 0xAF6A, 0xAF6B, 0xAF6C, 0xAF6D, 0xAF6E,\n    0xAF6F, 0xAF70, 0xAF71, 0xAF72, 0xAF73, 0xAF74, 0xAF75, 0xAF76,\n    0xAF77, 0xAF78, 0xAF7A, 0xAF7B, 0xAF7C, 0xAF7D, 0xAF7E, 0xAF7F,\n    0xAF81, 0xAF82, 0xAF83, 0xAF85, 0xAF86, 0xAF87, 0xAF89, 0xAF8A,\n    0xAF8B, 0xAF8C, 0xAF8D, 0xAF8E, 0xAF8F, 0xAF92, 0xAF93, 0xAF94,\n    0xAF96, 0xAF97, 0xAF98, 0xAF99, 0xAF9A, 0xAF9B, 0xAF9D, 0xAF9E,\n    0xAF9F, 0xAFA0, 0xAFA1, 0xAFA2, 0xAFA3, 0xAFA4, 0xAFA5, 0xAFA6,\n    0xAFA7, 0xAFA8, 0xAFA9, 0xAFAA, 0xAFAB, 0xAFAC, 0xAFAD, 0xAFAE,\n    0xAFAF, 0xAFB0, 0xAFB1, 0xAFB2, 0xAFB3, 0xAFB4, 0xAFB5, 0xAFB6,\n    0xAFB7, 0xAFBA, 0xAFBB, 0xAFBD, 0xAFBE, 0xAFBF, 0xAFC1, 0xAFC2,\n    0xAFC3, 0xAFC4, 0xAFC5, 0xAFC6, 0xAFCA, 0xAFCC, 0xAFCF, 0xAFD0,\n    0xAFD1, 0xAFD2, 0xAFD3, 0xAFD5, 0xAFD6, 0xAFD7, 0xAFD8, 0xAFD9,\n    0xAFDA, 0xAFDB, 0xAFDD, 0xAFDE, 0xAFDF, 0xAFE0, 0xAFE1, 0xAFE2,\n    0xAFE3, 0xAFE4, 0xAFE5, 0xAFE6, 0xAFE7, 0xAFEA, 0xAFEB, 0xAFEC,\n    0xAFED, 0xAFEE, 0xAFEF, 0xAFF2, 0xAFF3, 0xAFF5, 0xAFF6, 0xAFF7,\n    0xAFF9, 0xAFFA, 0xAFFB, 0xAFFC, 0xAFFD, 0xAFFE, 0xAFFF, 0xB002,\n    0xB003, 0xB005, 0xB006, 0xB007, 0xB008, 0xB009, 0xB00A, 0xB00B,\n    0xB00D, 0xB00E, 0xB00F, 0xB011, 0xB012, 0xB013, 0xB015, 0xB016,\n    0xB017, 0xB018, 0xB019, 0xB01A, 0xB01B, 0xB01E, 0xB01F, 0xB020,\n    0xB021, 0xB022, 0xB023, 0xB024, 0xB025, 0xB026, 0xB027, 0xB029,\n    0xB02A, 0xB02B, 0xB02C, 0xB02D, 0xB02E, 0xB02F, 0xB030, 0xB031,\n    0xB032, 0xB033, 0xB034, 0xB035, 0xB036, 0xB037, 0xB038, 0xB039,\n    0xB03A, 0xB03B, 0xB03C, 0xB03D, 0xB03E, 0xB03F, 0xB040, 0xB041,\n    0xB042, 0xB043, 0xB046, 0xB047, 0xB049, 0xB04B, 0xB04D, 0xB04F,\n    0xB050, 0xB051, 0xB052, 0xB056, 0xB058, 0xB05A, 0xB05B, 0xB05C,\n    0xB05E, 0xB05F, 0xB060, 0xB061, 0xB062, 0xB063, 0xB064, 0xB065,\n    0xB066, 0xB067, 0xB068, 0xB069, 0xB06A, 0xB06B, 0xB06C, 0xB06D,\n    0xB06E, 0xB06F, 0xB070, 0xB071, 0xB072, 0xB073, 0xB074, 0xB075,\n    0xB076, 0xB077, 0xB078, 0xB079, 0xB07A, 0xB07B, 0xB07E, 0xB07F,\n    0xB081, 0xB082, 0xB083, 0xB085, 0xB086, 0xB087, 0xB088, 0xB089,\n    0xB08A, 0xB08B, 0xB08E, 0xB090, 0xB092, 0xB093, 0xB094, 0xB095,\n    0xB096, 0xB097, 0xB09B, 0xB09D, 0xB09E, 0xB0A3, 0xB0A4, 0xB0A5,\n    0xB0A6, 0xB0A7, 0xB0AA, 0xB0B0, 0xB0B2, 0xB0B6, 0xB0B7, 0xB0B9,\n    0xB0BA, 0xB0BB, 0xB0BD, 0xB0BE, 0xB0BF, 0xB0C0, 0xB0C1, 0xB0C2,\n    0xB0C3, 0xB0C6, 0xB0CA, 0xB0CB, 0xB0CC, 0xB0CD, 0xB0CE, 0xB0CF,\n    0xB0D2, 0xB0D3, 0xB0D5, 0xB0D6, 0xB0D7, 0xB0D9, 0xB0DA, 0xB0DB,\n    0xB0DC, 0xB0DD, 0xB0DE, 0xB0DF, 0xB0E1, 0xB0E2, 0xB0E3, 0xB0E4,\n    0xB0E6, 0xB0E7, 0xB0E8, 0xB0E9, 0xB0EA, 0xB0EB, 0xB0EC, 0xB0ED,\n    0xB0EE, 0xB0EF, 0xB0F0, 0xB0F1, 0xB0F2, 0xB0F3, 0xB0F4, 0xB0F5,\n    0xB0F6, 0xB0F7, 0xB0F8, 0xB0F9, 0xB0FA, 0xB0FB, 0xB0FC, 0xB0FD,\n    0xB0FE, 0xB0FF, 0xB100, 0xB101, 0xB102, 0xB103, 0xB104, 0xB105,\n    0xB106, 0xB107, 0xB10A, 0xB10D, 0xB10E, 0xB10F, 0xB111, 0xB114,\n    0xB115, 0xB116, 0xB117, 0xB11A, 0xB11E, 0xB11F, 0xB120, 0xB121,\n    0xB122, 0xB126, 0xB127, 0xB129, 0xB12A, 0xB12B, 0xB12D, 0xB12E,\n    0xB12F, 0xB130, 0xB131, 0xB132, 0xB133, 0xB136, 0xB13A, 0xB13B,\n    0xB13C, 0xB13D, 0xB13E, 0xB13F, 0xB142, 0xB143, 0xB145, 0xB146,\n    0xB147, 0xB149, 0xB14A, 0xB14B, 0xB14C, 0xB14D, 0xB14E, 0xB14F,\n    0xB152, 0xB153, 0xB156, 0xB157, 0xB159, 0xB15A, 0xB15B, 0xB15D,\n    0xB15E, 0xB15F, 0xB161, 0xB162, 0xB163, 0xB164, 0xB165, 0xB166,\n    0xB167, 0xB168, 0xB169, 0xB16A, 0xB16B, 0xB16C, 0xB16D, 0xB16E,\n    0xB16F, 0xB170, 0xB171, 0xB172, 0xB173, 0xB174, 0xB175, 0xB176,\n    0xB177, 0xB17A, 0xB17B, 0xB17D, 0xB17E, 0xB17F, 0xB181, 0xB183,\n    0xB184, 0xB185, 0xB186, 0xB187, 0xB18A, 0xB18C, 0xB18E, 0xB18F,\n    0xB190, 0xB191, 0xB195, 0xB196, 0xB197, 0xB199, 0xB19A, 0xB19B,\n    0xB19D, 0xB19E, 0xB19F, 0xB1A0, 0xB1A1, 0xB1A2, 0xB1A3, 0xB1A4,\n    0xB1A5, 0xB1A6, 0xB1A7, 0xB1A9, 0xB1AA, 0xB1AB, 0xB1AC, 0xB1AD,\n    0xB1AE, 0xB1AF, 0xB1B0, 0xB1B1, 0xB1B2, 0xB1B3, 0xB1B4, 0xB1B5,\n    0xB1B6, 0xB1B7, 0xB1B8, 0xB1B9, 0xB1BA, 0xB1BB, 0xB1BC, 0xB1BD,\n    0xB1BE, 0xB1BF, 0xB1C0, 0xB1C1, 0xB1C2, 0xB1C3, 0xB1C4, 0xB1C5,\n    0xB1C6, 0xB1C7, 0xB1C8, 0xB1C9, 0xB1CA, 0xB1CB, 0xB1CD, 0xB1CE,\n    0xB1CF, 0xB1D1, 0xB1D2, 0xB1D3, 0xB1D5, 0xB1D6, 0xB1D7, 0xB1D8,\n    0xB1D9, 0xB1DA, 0xB1DB, 0xB1DE, 0xB1E0, 0xB1E1, 0xB1E2, 0xB1E3,\n    0xB1E4, 0xB1E5, 0xB1E6, 0xB1E7, 0xB1EA, 0xB1EB, 0xB1ED, 0xB1EE,\n    0xB1EF, 0xB1F1, 0xB1F2, 0xB1F3, 0xB1F4, 0xB1F5, 0xB1F6, 0xB1F7,\n    0xB1F8, 0xB1FA, 0xB1FC, 0xB1FE, 0xB1FF, 0xB200, 0xB201, 0xB202,\n    0xB203, 0xB206, 0xB207, 0xB209, 0xB20A, 0xB20D, 0xB20E, 0xB20F,\n    0xB210, 0xB211, 0xB212, 0xB213, 0xB216, 0xB218, 0xB21A, 0xB21B,\n    0xB21C, 0xB21D, 0xB21E, 0xB21F, 0xB221, 0xB222, 0xB223, 0xB224,\n    0xB225, 0xB226, 0xB227, 0xB228, 0xB229, 0xB22A, 0xB22B, 0xB22C,\n    0xB22D, 0xB22E, 0xB22F, 0xB230, 0xB231, 0xB232, 0xB233, 0xB235,\n    0xB236, 0xB237, 0xB238, 0xB239, 0xB23A, 0xB23B, 0xB23D, 0xB23E,\n    0xB23F, 0xB240, 0xB241, 0xB242, 0xB243, 0xB244, 0xB245, 0xB246,\n    0xB247, 0xB248, 0xB249, 0xB24A, 0xB24B, 0xB24C, 0xB24D, 0xB24E,\n    0xB24F, 0xB250, 0xB251, 0xB252, 0xB253, 0xB254, 0xB255, 0xB256,\n    0xB257, 0xB259, 0xB25A, 0xB25B, 0xB25D, 0xB25E, 0xB25F, 0xB261,\n    0xB262, 0xB263, 0xB264, 0xB265, 0xB266, 0xB267, 0xB26A, 0xB26B,\n    0xB26C, 0xB26D, 0xB26E, 0xB26F, 0xB270, 0xB271, 0xB272, 0xB273,\n    0xB276, 0xB277, 0xB278, 0xB279, 0xB27A, 0xB27B, 0xB27D, 0xB27E,\n    0xB27F, 0xB280, 0xB281, 0xB282, 0xB283, 0xB286, 0xB287, 0xB288,\n    0xB28A, 0xB28B, 0xB28C, 0xB28D, 0xB28E, 0xB28F, 0xB292, 0xB293,\n    0xB295, 0xB296, 0xB297, 0xB29B, 0xB29C, 0xB29D, 0xB29E, 0xB29F,\n    0xB2A2, 0xB2A4, 0xB2A7, 0xB2A8, 0xB2A9, 0xB2AB, 0xB2AD, 0xB2AE,\n    0xB2AF, 0xB2B1, 0xB2B2, 0xB2B3, 0xB2B5, 0xB2B6, 0xB2B7, 0xB2B8,\n    0xB2B9, 0xB2BA, 0xB2BB, 0xB2BC, 0xB2BD, 0xB2BE, 0xB2BF, 0xB2C0,\n    0xB2C1, 0xB2C2, 0xB2C3, 0xB2C4, 0xB2C5, 0xB2C6, 0xB2C7, 0xB2CA,\n    0xB2CB, 0xB2CD, 0xB2CE, 0xB2CF, 0xB2D1, 0xB2D3, 0xB2D4, 0xB2D5,\n    0xB2D6, 0xB2D7, 0xB2DA, 0xB2DC, 0xB2DE, 0xB2DF, 0xB2E0, 0xB2E1,\n    0xB2E3, 0xB2E7, 0xB2E9, 0xB2EA, 0xB2F0, 0xB2F1, 0xB2F2, 0xB2F6,\n    0xB2FC, 0xB2FD, 0xB2FE, 0xB302, 0xB303, 0xB305, 0xB306, 0xB307,\n    0xB309, 0xB30A, 0xB30B, 0xB30C, 0xB30D, 0xB30E, 0xB30F, 0xB312,\n    0xB316, 0xB317, 0xB318, 0xB319, 0xB31A, 0xB31B, 0xB31D, 0xB31E,\n    0xB31F, 0xB320, 0xB321, 0xB322, 0xB323, 0xB324, 0xB325, 0xB326,\n    0xB327, 0xB328, 0xB329, 0xB32A, 0xB32B, 0xB32C, 0xB32D, 0xB32E,\n    0xB32F, 0xB330, 0xB331, 0xB332, 0xB333, 0xB334, 0xB335, 0xB336,\n    0xB337, 0xB338, 0xB339, 0xB33A, 0xB33B, 0xB33C, 0xB33D, 0xB33E,\n    0xB33F, 0xB340, 0xB341, 0xB342, 0xB343, 0xB344, 0xB345, 0xB346,\n    0xB347, 0xB348, 0xB349, 0xB34A, 0xB34B, 0xB34C, 0xB34D, 0xB34E,\n    0xB34F, 0xB350, 0xB351, 0xB352, 0xB353, 0xB357, 0xB359, 0xB35A,\n    0xB35D, 0xB360, 0xB361, 0xB362, 0xB363, 0xB366, 0xB368, 0xB36A,\n    0xB36C, 0xB36D, 0xB36F, 0xB372, 0xB373, 0xB375, 0xB376, 0xB377,\n    0xB379, 0xB37A, 0xB37B, 0xB37C, 0xB37D, 0xB37E, 0xB37F, 0xB382,\n    0xB386, 0xB387, 0xB388, 0xB389, 0xB38A, 0xB38B, 0xB38D, 0xB38E,\n    0xB38F, 0xB391, 0xB392, 0xB393, 0xB395, 0xB396, 0xB397, 0xB398,\n    0xB399, 0xB39A, 0xB39B, 0xB39C, 0xB39D, 0xB39E, 0xB39F, 0xB3A2,\n    0xB3A3, 0xB3A4, 0xB3A5, 0xB3A6, 0xB3A7, 0xB3A9, 0xB3AA, 0xB3AB,\n    0xB3AD, 0xB3AE, 0xB3AF, 0xB3B0, 0xB3B1, 0xB3B2, 0xB3B3, 0xB3B4,\n    0xB3B5, 0xB3B6, 0xB3B7, 0xB3B8, 0xB3B9, 0xB3BA, 0xB3BB, 0xB3BC,\n    0xB3BD, 0xB3BE, 0xB3BF, 0xB3C0, 0xB3C1, 0xB3C2, 0xB3C3, 0xB3C6,\n    0xB3C7, 0xB3C9, 0xB3CA, 0xB3CD, 0xB3CF, 0xB3D1, 0xB3D2, 0xB3D3,\n    0xB3D6, 0xB3D8, 0xB3DA, 0xB3DC, 0xB3DE, 0xB3DF, 0xB3E1, 0xB3E2,\n    0xB3E3, 0xB3E5, 0xB3E6, 0xB3E7, 0xB3E9, 0xB3EA, 0xB3EB, 0xB3EC,\n    0xB3ED, 0xB3EE, 0xB3EF, 0xB3F0, 0xB3F1, 0xB3F2, 0xB3F3, 0xB3F4,\n    0xB3F5, 0xB3F6, 0xB3F7, 0xB3F8, 0xB3F9, 0xB3FA, 0xB3FB, 0xB3FD,\n    0xB3FE, 0xB3FF, 0xB400, 0xB401, 0xB402, 0xB403, 0xB404, 0xB405,\n    0xB406, 0xB407, 0xB408, 0xB409, 0xB40A, 0xB40B, 0xB40C, 0xB40D,\n    0xB40E, 0xB40F, 0xB411, 0xB412, 0xB413, 0xB414, 0xB415, 0xB416,\n    0xB417, 0xB419, 0xB41A, 0xB41B, 0xB41D, 0xB41E, 0xB41F, 0xB421,\n    0xB422, 0xB423, 0xB424, 0xB425, 0xB426, 0xB427, 0xB42A, 0xB42C,\n    0xB42D, 0xB42E, 0xB42F, 0xB430, 0xB431, 0xB432, 0xB433, 0xB435,\n    0xB436, 0xB437, 0xB438, 0xB439, 0xB43A, 0xB43B, 0xB43C, 0xB43D,\n    0xB43E, 0xB43F, 0xB440, 0xB441, 0xB442, 0xB443, 0xB444, 0xB445,\n    0xB446, 0xB447, 0xB448, 0xB449, 0xB44A, 0xB44B, 0xB44C, 0xB44D,\n    0xB44E, 0xB44F, 0xB452, 0xB453, 0xB455, 0xB456, 0xB457, 0xB459,\n    0xB45A, 0xB45B, 0xB45C, 0xB45D, 0xB45E, 0xB45F, 0xB462, 0xB464,\n    0xB466, 0xB467, 0xB468, 0xB469, 0xB46A, 0xB46B, 0xB46D, 0xB46E,\n    0xB46F, 0xB470, 0xB471, 0xB472, 0xB473, 0xB474, 0xB475, 0xB476,\n    0xB477, 0xB478, 0xB479, 0xB47A, 0xB47B, 0xB47C, 0xB47D, 0xB47E,\n    0xB47F, 0xB481, 0xB482, 0xB483, 0xB484, 0xB485, 0xB486, 0xB487,\n    0xB489, 0xB48A, 0xB48B, 0xB48C, 0xB48D, 0xB48E, 0xB48F, 0xB490,\n    0xB491, 0xB492, 0xB493, 0xB494, 0xB495, 0xB496, 0xB497, 0xB498,\n    0xB499, 0xB49A, 0xB49B, 0xB49C, 0xB49E, 0xB49F, 0xB4A0, 0xB4A1,\n    0xB4A2, 0xB4A3, 0xB4A5, 0xB4A6, 0xB4A7, 0xB4A9, 0xB4AA, 0xB4AB,\n    0xB4AD, 0xB4AE, 0xB4AF, 0xB4B0, 0xB4B1, 0xB4B2, 0xB4B3, 0xB4B4,\n    0xB4B6, 0xB4B8, 0xB4BA, 0xB4BB, 0xB4BC, 0xB4BD, 0xB4BE, 0xB4BF,\n    0xB4C1, 0xB4C2, 0xB4C3, 0xB4C5, 0xB4C6, 0xB4C7, 0xB4C9, 0xB4CA,\n    0xB4CB, 0xB4CC, 0xB4CD, 0xB4CE, 0xB4CF, 0xB4D1, 0xB4D2, 0xB4D3,\n    0xB4D4, 0xB4D6, 0xB4D7, 0xB4D8, 0xB4D9, 0xB4DA, 0xB4DB, 0xB4DE,\n    0xB4DF, 0xB4E1, 0xB4E2, 0xB4E5, 0xB4E7, 0xB4E8, 0xB4E9, 0xB4EA,\n    0xB4EB, 0xB4EE, 0xB4F0, 0xB4F2, 0xB4F3, 0xB4F4, 0xB4F5, 0xB4F6,\n    0xB4F7, 0xB4F9, 0xB4FA, 0xB4FB, 0xB4FC, 0xB4FD, 0xB4FE, 0xB4FF,\n    0xB500, 0xB501, 0xB502, 0xB503, 0xB504, 0xB505, 0xB506, 0xB507,\n    0xB508, 0xB509, 0xB50A, 0xB50B, 0xB50C, 0xB50D, 0xB50E, 0xB50F,\n    0xB510, 0xB511, 0xB512, 0xB513, 0xB516, 0xB517, 0xB519, 0xB51A,\n    0xB51D, 0xB51E, 0xB51F, 0xB520, 0xB521, 0xB522, 0xB523, 0xB526,\n    0xB52B, 0xB52C, 0xB52D, 0xB52E, 0xB52F, 0xB532, 0xB533, 0xB535,\n    0xB536, 0xB537, 0xB539, 0xB53A, 0xB53B, 0xB53C, 0xB53D, 0xB53E,\n    0xB53F, 0xB542, 0xB546, 0xB547, 0xB548, 0xB549, 0xB54A, 0xB54E,\n    0xB54F, 0xB551, 0xB552, 0xB553, 0xB555, 0xB556, 0xB557, 0xB558,\n    0xB559, 0xB55A, 0xB55B, 0xB55E, 0xB562, 0xB563, 0xB564, 0xB565,\n    0xB566, 0xB567, 0xB568, 0xB569, 0xB56A, 0xB56B, 0xB56C, 0xB56D,\n    0xB56E, 0xB56F, 0xB570, 0xB571, 0xB572, 0xB573, 0xB574, 0xB575,\n    0xB576, 0xB577, 0xB578, 0xB579, 0xB57A, 0xB57B, 0xB57C, 0xB57D,\n    0xB57E, 0xB57F, 0xB580, 0xB581, 0xB582, 0xB583, 0xB584, 0xB585,\n    0xB586, 0xB587, 0xB588, 0xB589, 0xB58A, 0xB58B, 0xB58C, 0xB58D,\n    0xB58E, 0xB58F, 0xB590, 0xB591, 0xB592, 0xB593, 0xB594, 0xB595,\n    0xB596, 0xB597, 0xB598, 0xB599, 0xB59A, 0xB59B, 0xB59C, 0xB59D,\n    0xB59E, 0xB59F, 0xB5A2, 0xB5A3, 0xB5A5, 0xB5A6, 0xB5A7, 0xB5A9,\n    0xB5AC, 0xB5AD, 0xB5AE, 0xB5AF, 0xB5B2, 0xB5B6, 0xB5B7, 0xB5B8,\n    0xB5B9, 0xB5BA, 0xB5BE, 0xB5BF, 0xB5C1, 0xB5C2, 0xB5C3, 0xB5C5,\n    0xB5C6, 0xB5C7, 0xB5C8, 0xB5C9, 0xB5CA, 0xB5CB, 0xB5CE, 0xB5D2,\n    0xB5D3, 0xB5D4, 0xB5D5, 0xB5D6, 0xB5D7, 0xB5D9, 0xB5DA, 0xB5DB,\n    0xB5DC, 0xB5DD, 0xB5DE, 0xB5DF, 0xB5E0, 0xB5E1, 0xB5E2, 0xB5E3,\n    0xB5E4, 0xB5E5, 0xB5E6, 0xB5E7, 0xB5E8, 0xB5E9, 0xB5EA, 0xB5EB,\n    0xB5ED, 0xB5EE, 0xB5EF, 0xB5F0, 0xB5F1, 0xB5F2, 0xB5F3, 0xB5F4,\n    0xB5F5, 0xB5F6, 0xB5F7, 0xB5F8, 0xB5F9, 0xB5FA, 0xB5FB, 0xB5FC,\n    0xB5FD, 0xB5FE, 0xB5FF, 0xB600, 0xB601, 0xB602, 0xB603, 0xB604,\n    0xB605, 0xB606, 0xB607, 0xB608, 0xB609, 0xB60A, 0xB60B, 0xB60C,\n    0xB60D, 0xB60E, 0xB60F, 0xB612, 0xB613, 0xB615, 0xB616, 0xB617,\n    0xB619, 0xB61A, 0xB61B, 0xB61C, 0xB61D, 0xB61E, 0xB61F, 0xB620,\n    0xB621, 0xB622, 0xB623, 0xB624, 0xB626, 0xB627, 0xB628, 0xB629,\n    0xB62A, 0xB62B, 0xB62D, 0xB62E, 0xB62F, 0xB630, 0xB631, 0xB632,\n    0xB633, 0xB635, 0xB636, 0xB637, 0xB638, 0xB639, 0xB63A, 0xB63B,\n    0xB63C, 0xB63D, 0xB63E, 0xB63F, 0xB640, 0xB641, 0xB642, 0xB643,\n    0xB644, 0xB645, 0xB646, 0xB647, 0xB649, 0xB64A, 0xB64B, 0xB64C,\n    0xB64D, 0xB64E, 0xB64F, 0xB650, 0xB651, 0xB652, 0xB653, 0xB654,\n    0xB655, 0xB656, 0xB657, 0xB658, 0xB659, 0xB65A, 0xB65B, 0xB65C,\n    0xB65D, 0xB65E, 0xB65F, 0xB660, 0xB661, 0xB662, 0xB663, 0xB665,\n    0xB666, 0xB667, 0xB669, 0xB66A, 0xB66B, 0xB66C, 0xB66D, 0xB66E,\n    0xB66F, 0xB670, 0xB671, 0xB672, 0xB673, 0xB674, 0xB675, 0xB676,\n    0xB677, 0xB678, 0xB679, 0xB67A, 0xB67B, 0xB67C, 0xB67D, 0xB67E,\n    0xB67F, 0xB680, 0xB681, 0xB682, 0xB683, 0xB684, 0xB685, 0xB686,\n    0xB687, 0xB688, 0xB689, 0xB68A, 0xB68B, 0xB68C, 0xB68D, 0xB68E,\n    0xB68F, 0xB690, 0xB691, 0xB692, 0xB693, 0xB694, 0xB695, 0xB696,\n    0xB697, 0xB698, 0xB699, 0xB69A, 0xB69B, 0xB69E, 0xB69F, 0xB6A1,\n    0xB6A2, 0xB6A3, 0xB6A5, 0xB6A6, 0xB6A7, 0xB6A8, 0xB6A9, 0xB6AA,\n    0xB6AD, 0xB6AE, 0xB6AF, 0xB6B0, 0xB6B2, 0xB6B3, 0xB6B4, 0xB6B5,\n    0xB6B6, 0xB6B7, 0xB6B8, 0xB6B9, 0xB6BA, 0xB6BB, 0xB6BC, 0xB6BD,\n    0xB6BE, 0xB6BF, 0xB6C0, 0xB6C1, 0xB6C2, 0xB6C3, 0xB6C4, 0xB6C5,\n    0xB6C6, 0xB6C7, 0xB6C8, 0xB6C9, 0xB6CA, 0xB6CB, 0xB6CC, 0xB6CD,\n    0xB6CE, 0xB6CF, 0xB6D0, 0xB6D1, 0xB6D2, 0xB6D3, 0xB6D5, 0xB6D6,\n    0xB6D7, 0xB6D8, 0xB6D9, 0xB6DA, 0xB6DB, 0xB6DC, 0xB6DD, 0xB6DE,\n    0xB6DF, 0xB6E0, 0xB6E1, 0xB6E2, 0xB6E3, 0xB6E4, 0xB6E5, 0xB6E6,\n    0xB6E7, 0xB6E8, 0xB6E9, 0xB6EA, 0xB6EB, 0xB6EC, 0xB6ED, 0xB6EE,\n    0xB6EF, 0xB6F1, 0xB6F2, 0xB6F3, 0xB6F5, 0xB6F6, 0xB6F7, 0xB6F9,\n    0xB6FA, 0xB6FB, 0xB6FC, 0xB6FD, 0xB6FE, 0xB6FF, 0xB702, 0xB703,\n    0xB704, 0xB706, 0xB707, 0xB708, 0xB709, 0xB70A, 0xB70B, 0xB70C,\n    0xB70D, 0xB70E, 0xB70F, 0xB710, 0xB711, 0xB712, 0xB713, 0xB714,\n    0xB715, 0xB716, 0xB717, 0xB718, 0xB719, 0xB71A, 0xB71B, 0xB71C,\n    0xB71D, 0xB71E, 0xB71F, 0xB720, 0xB721, 0xB722, 0xB723, 0xB724,\n    0xB725, 0xB726, 0xB727, 0xB72A, 0xB72B, 0xB72D, 0xB72E, 0xB731,\n    0xB732, 0xB733, 0xB734, 0xB735, 0xB736, 0xB737, 0xB73A, 0xB73C,\n    0xB73D, 0xB73E, 0xB73F, 0xB740, 0xB741, 0xB742, 0xB743, 0xB745,\n    0xB746, 0xB747, 0xB749, 0xB74A, 0xB74B, 0xB74D, 0xB74E, 0xB74F,\n    0xB750, 0xB751, 0xB752, 0xB753, 0xB756, 0xB757, 0xB758, 0xB759,\n    0xB75A, 0xB75B, 0xB75C, 0xB75D, 0xB75E, 0xB75F, 0xB761, 0xB762,\n    0xB763, 0xB765, 0xB766, 0xB767, 0xB769, 0xB76A, 0xB76B, 0xB76C,\n    0xB76D, 0xB76E, 0xB76F, 0xB772, 0xB774, 0xB776, 0xB777, 0xB778,\n    0xB779, 0xB77A, 0xB77B, 0xB77E, 0xB77F, 0xB781, 0xB782, 0xB783,\n    0xB785, 0xB786, 0xB787, 0xB788, 0xB789, 0xB78A, 0xB78B, 0xB78E,\n    0xB793, 0xB794, 0xB795, 0xB79A, 0xB79B, 0xB79D, 0xB79E, 0xB79F,\n    0xB7A1, 0xB7A2, 0xB7A3, 0xB7A4, 0xB7A5, 0xB7A6, 0xB7A7, 0xB7AA,\n    0xB7AE, 0xB7AF, 0xB7B0, 0xB7B1, 0xB7B2, 0xB7B3, 0xB7B6, 0xB7B7,\n    0xB7B9, 0xB7BA, 0xB7BB, 0xB7BC, 0xB7BD, 0xB7BE, 0xB7BF, 0xB7C0,\n    0xB7C1, 0xB7C2, 0xB7C3, 0xB7C4, 0xB7C5, 0xB7C6, 0xB7C8, 0xB7CA,\n    0xB7CB, 0xB7CC, 0xB7CD, 0xB7CE, 0xB7CF, 0xB7D0, 0xB7D1, 0xB7D2,\n    0xB7D3, 0xB7D4, 0xB7D5, 0xB7D6, 0xB7D7, 0xB7D8, 0xB7D9, 0xB7DA,\n    0xB7DB, 0xB7DC, 0xB7DD, 0xB7DE, 0xB7DF, 0xB7E0, 0xB7E1, 0xB7E2,\n    0xB7E3, 0xB7E4, 0xB7E5, 0xB7E6, 0xB7E7, 0xB7E8, 0xB7E9, 0xB7EA,\n    0xB7EB, 0xB7EE, 0xB7EF, 0xB7F1, 0xB7F2, 0xB7F3, 0xB7F5, 0xB7F6,\n    0xB7F7, 0xB7F8, 0xB7F9, 0xB7FA, 0xB7FB, 0xB7FE, 0xB802, 0xB803,\n    0xB804, 0xB805, 0xB806, 0xB80A, 0xB80B, 0xB80D, 0xB80E, 0xB80F,\n    0xB811, 0xB812, 0xB813, 0xB814, 0xB815, 0xB816, 0xB817, 0xB81A,\n    0xB81C, 0xB81E, 0xB81F, 0xB820, 0xB821, 0xB822, 0xB823, 0xB826,\n    0xB827, 0xB829, 0xB82A, 0xB82B, 0xB82D, 0xB82E, 0xB82F, 0xB830,\n    0xB831, 0xB832, 0xB833, 0xB836, 0xB83A, 0xB83B, 0xB83C, 0xB83D,\n    0xB83E, 0xB83F, 0xB841, 0xB842, 0xB843, 0xB845, 0xB846, 0xB847,\n    0xB848, 0xB849, 0xB84A, 0xB84B, 0xB84C, 0xB84D, 0xB84E, 0xB84F,\n    0xB850, 0xB852, 0xB854, 0xB855, 0xB856, 0xB857, 0xB858, 0xB859,\n    0xB85A, 0xB85B, 0xB85E, 0xB85F, 0xB861, 0xB862, 0xB863, 0xB865,\n    0xB866, 0xB867, 0xB868, 0xB869, 0xB86A, 0xB86B, 0xB86E, 0xB870,\n    0xB872, 0xB873, 0xB874, 0xB875, 0xB876, 0xB877, 0xB879, 0xB87A,\n    0xB87B, 0xB87D, 0xB87E, 0xB87F, 0xB880, 0xB881, 0xB882, 0xB883,\n    0xB884, 0xB885, 0xB886, 0xB887, 0xB888, 0xB889, 0xB88A, 0xB88B,\n    0xB88C, 0xB88E, 0xB88F, 0xB890, 0xB891, 0xB892, 0xB893, 0xB894,\n    0xB895, 0xB896, 0xB897, 0xB898, 0xB899, 0xB89A, 0xB89B, 0xB89C,\n    0xB89D, 0xB89E, 0xB89F, 0xB8A0, 0xB8A1, 0xB8A2, 0xB8A3, 0xB8A4,\n    0xB8A5, 0xB8A6, 0xB8A7, 0xB8A9, 0xB8AA, 0xB8AB, 0xB8AC, 0xB8AD,\n    0xB8AE, 0xB8AF, 0xB8B1, 0xB8B2, 0xB8B3, 0xB8B5, 0xB8B6, 0xB8B7,\n    0xB8B9, 0xB8BA, 0xB8BB, 0xB8BC, 0xB8BD, 0xB8BE, 0xB8BF, 0xB8C2,\n    0xB8C4, 0xB8C6, 0xB8C7, 0xB8C8, 0xB8C9, 0xB8CA, 0xB8CB, 0xB8CD,\n    0xB8CE, 0xB8CF, 0xB8D1, 0xB8D2, 0xB8D3, 0xB8D5, 0xB8D6, 0xB8D7,\n    0xB8D8, 0xB8D9, 0xB8DA, 0xB8DB, 0xB8DC, 0xB8DE, 0xB8E0, 0xB8E2,\n    0xB8E3, 0xB8E4, 0xB8E5, 0xB8E6, 0xB8E7, 0xB8EA, 0xB8EB, 0xB8ED,\n    0xB8EE, 0xB8EF, 0xB8F1, 0xB8F2, 0xB8F3, 0xB8F4, 0xB8F5, 0xB8F6,\n    0xB8F7, 0xB8FA, 0xB8FC, 0xB8FE, 0xB8FF, 0xB900, 0xB901, 0xB902,\n    0xB903, 0xB905, 0xB906, 0xB907, 0xB908, 0xB909, 0xB90A, 0xB90B,\n    0xB90C, 0xB90D, 0xB90E, 0xB90F, 0xB910, 0xB911, 0xB912, 0xB913,\n    0xB914, 0xB915, 0xB916, 0xB917, 0xB919, 0xB91A, 0xB91B, 0xB91C,\n    0xB91D, 0xB91E, 0xB91F, 0xB921, 0xB922, 0xB923, 0xB924, 0xB925,\n    0xB926, 0xB927, 0xB928, 0xB929, 0xB92A, 0xB92B, 0xB92C, 0xB92D,\n    0xB92E, 0xB92F, 0xB930, 0xB931, 0xB932, 0xB933, 0xB934, 0xB935,\n    0xB936, 0xB937, 0xB938, 0xB939, 0xB93A, 0xB93B, 0xB93E, 0xB93F,\n    0xB941, 0xB942, 0xB943, 0xB945, 0xB946, 0xB947, 0xB948, 0xB949,\n    0xB94A, 0xB94B, 0xB94D, 0xB94E, 0xB950, 0xB952, 0xB953, 0xB954,\n    0xB955, 0xB956, 0xB957, 0xB95A, 0xB95B, 0xB95D, 0xB95E, 0xB95F,\n    0xB961, 0xB962, 0xB963, 0xB964, 0xB965, 0xB966, 0xB967, 0xB96A,\n    0xB96C, 0xB96E, 0xB96F, 0xB970, 0xB971, 0xB972, 0xB973, 0xB976,\n    0xB977, 0xB979, 0xB97A, 0xB97B, 0xB97D, 0xB97E, 0xB97F, 0xB980,\n    0xB981, 0xB982, 0xB983, 0xB986, 0xB988, 0xB98B, 0xB98C, 0xB98F,\n    0xB990, 0xB991, 0xB992, 0xB993, 0xB994, 0xB995, 0xB996, 0xB997,\n    0xB998, 0xB999, 0xB99A, 0xB99B, 0xB99C, 0xB99D, 0xB99E, 0xB99F,\n    0xB9A0, 0xB9A1, 0xB9A2, 0xB9A3, 0xB9A4, 0xB9A5, 0xB9A6, 0xB9A7,\n    0xB9A8, 0xB9A9, 0xB9AA, 0xB9AB, 0xB9AE, 0xB9AF, 0xB9B1, 0xB9B2,\n    0xB9B3, 0xB9B5, 0xB9B6, 0xB9B7, 0xB9B8, 0xB9B9, 0xB9BA, 0xB9BB,\n    0xB9BE, 0xB9C0, 0xB9C2, 0xB9C3, 0xB9C4, 0xB9C5, 0xB9C6, 0xB9C7,\n    0xB9CA, 0xB9CB, 0xB9CD, 0xB9D3, 0xB9D4, 0xB9D5, 0xB9D6, 0xB9D7,\n    0xB9DA, 0xB9DC, 0xB9DF, 0xB9E0, 0xB9E2, 0xB9E6, 0xB9E7, 0xB9E9,\n    0xB9EA, 0xB9EB, 0xB9ED, 0xB9EE, 0xB9EF, 0xB9F0, 0xB9F1, 0xB9F2,\n    0xB9F3, 0xB9F6, 0xB9FB, 0xB9FC, 0xB9FD, 0xB9FE, 0xB9FF, 0xBA02,\n    0xBA03, 0xBA04, 0xBA05, 0xBA06, 0xBA07, 0xBA09, 0xBA0A, 0xBA0B,\n    0xBA0C, 0xBA0D, 0xBA0E, 0xBA0F, 0xBA10, 0xBA11, 0xBA12, 0xBA13,\n    0xBA14, 0xBA16, 0xBA17, 0xBA18, 0xBA19, 0xBA1A, 0xBA1B, 0xBA1C,\n    0xBA1D, 0xBA1E, 0xBA1F, 0xBA20, 0xBA21, 0xBA22, 0xBA23, 0xBA24,\n    0xBA25, 0xBA26, 0xBA27, 0xBA28, 0xBA29, 0xBA2A, 0xBA2B, 0xBA2C,\n    0xBA2D, 0xBA2E, 0xBA2F, 0xBA30, 0xBA31, 0xBA32, 0xBA33, 0xBA34,\n    0xBA35, 0xBA36, 0xBA37, 0xBA3A, 0xBA3B, 0xBA3D, 0xBA3E, 0xBA3F,\n    0xBA41, 0xBA43, 0xBA44, 0xBA45, 0xBA46, 0xBA47, 0xBA4A, 0xBA4C,\n    0xBA4F, 0xBA50, 0xBA51, 0xBA52, 0xBA56, 0xBA57, 0xBA59, 0xBA5A,\n    0xBA5B, 0xBA5D, 0xBA5E, 0xBA5F, 0xBA60, 0xBA61, 0xBA62, 0xBA63,\n    0xBA66, 0xBA6A, 0xBA6B, 0xBA6C, 0xBA6D, 0xBA6E, 0xBA6F, 0xBA72,\n    0xBA73, 0xBA75, 0xBA76, 0xBA77, 0xBA79, 0xBA7A, 0xBA7B, 0xBA7C,\n    0xBA7D, 0xBA7E, 0xBA7F, 0xBA80, 0xBA81, 0xBA82, 0xBA86, 0xBA88,\n    0xBA89, 0xBA8A, 0xBA8B, 0xBA8D, 0xBA8E, 0xBA8F, 0xBA90, 0xBA91,\n    0xBA92, 0xBA93, 0xBA94, 0xBA95, 0xBA96, 0xBA97, 0xBA98, 0xBA99,\n    0xBA9A, 0xBA9B, 0xBA9C, 0xBA9D, 0xBA9E, 0xBA9F, 0xBAA0, 0xBAA1,\n    0xBAA2, 0xBAA3, 0xBAA4, 0xBAA5, 0xBAA6, 0xBAA7, 0xBAAA, 0xBAAD,\n    0xBAAE, 0xBAAF, 0xBAB1, 0xBAB3, 0xBAB4, 0xBAB5, 0xBAB6, 0xBAB7,\n    0xBABA, 0xBABC, 0xBABE, 0xBABF, 0xBAC0, 0xBAC1, 0xBAC2, 0xBAC3,\n    0xBAC5, 0xBAC6, 0xBAC7, 0xBAC9, 0xBACA, 0xBACB, 0xBACC, 0xBACD,\n    0xBACE, 0xBACF, 0xBAD0, 0xBAD1, 0xBAD2, 0xBAD3, 0xBAD4, 0xBAD5,\n    0xBAD6, 0xBAD7, 0xBADA, 0xBADB, 0xBADC, 0xBADD, 0xBADE, 0xBADF,\n    0xBAE0, 0xBAE1, 0xBAE2, 0xBAE3, 0xBAE4, 0xBAE5, 0xBAE6, 0xBAE7,\n    0xBAE8, 0xBAE9, 0xBAEA, 0xBAEB, 0xBAEC, 0xBAED, 0xBAEE, 0xBAEF,\n    0xBAF0, 0xBAF1, 0xBAF2, 0xBAF3, 0xBAF4, 0xBAF5, 0xBAF6, 0xBAF7,\n    0xBAF8, 0xBAF9, 0xBAFA, 0xBAFB, 0xBAFD, 0xBAFE, 0xBAFF, 0xBB01,\n    0xBB02, 0xBB03, 0xBB05, 0xBB06, 0xBB07, 0xBB08, 0xBB09, 0xBB0A,\n    0xBB0B, 0xBB0C, 0xBB0E, 0xBB10, 0xBB12, 0xBB13, 0xBB14, 0xBB15,\n    0xBB16, 0xBB17, 0xBB19, 0xBB1A, 0xBB1B, 0xBB1D, 0xBB1E, 0xBB1F,\n    0xBB21, 0xBB22, 0xBB23, 0xBB24, 0xBB25, 0xBB26, 0xBB27, 0xBB28,\n    0xBB2A, 0xBB2C, 0xBB2D, 0xBB2E, 0xBB2F, 0xBB30, 0xBB31, 0xBB32,\n    0xBB33, 0xBB37, 0xBB39, 0xBB3A, 0xBB3F, 0xBB40, 0xBB41, 0xBB42,\n    0xBB43, 0xBB46, 0xBB48, 0xBB4A, 0xBB4B, 0xBB4C, 0xBB4E, 0xBB51,\n    0xBB52, 0xBB53, 0xBB55, 0xBB56, 0xBB57, 0xBB59, 0xBB5A, 0xBB5B,\n    0xBB5C, 0xBB5D, 0xBB5E, 0xBB5F, 0xBB60, 0xBB62, 0xBB64, 0xBB65,\n    0xBB66, 0xBB67, 0xBB68, 0xBB69, 0xBB6A, 0xBB6B, 0xBB6D, 0xBB6E,\n    0xBB6F, 0xBB70, 0xBB71, 0xBB72, 0xBB73, 0xBB74, 0xBB75, 0xBB76,\n    0xBB77, 0xBB78, 0xBB79, 0xBB7A, 0xBB7B, 0xBB7C, 0xBB7D, 0xBB7E,\n    0xBB7F, 0xBB80, 0xBB81, 0xBB82, 0xBB83, 0xBB84, 0xBB85, 0xBB86,\n    0xBB87, 0xBB89, 0xBB8A, 0xBB8B, 0xBB8D, 0xBB8E, 0xBB8F, 0xBB91,\n    0xBB92, 0xBB93, 0xBB94, 0xBB95, 0xBB96, 0xBB97, 0xBB98, 0xBB99,\n    0xBB9A, 0xBB9B, 0xBB9C, 0xBB9D, 0xBB9E, 0xBB9F, 0xBBA0, 0xBBA1,\n    0xBBA2, 0xBBA3, 0xBBA5, 0xBBA6, 0xBBA7, 0xBBA9, 0xBBAA, 0xBBAB,\n    0xBBAD, 0xBBAE, 0xBBAF, 0xBBB0, 0xBBB1, 0xBBB2, 0xBBB3, 0xBBB5,\n    0xBBB6, 0xBBB8, 0xBBB9, 0xBBBA, 0xBBBB, 0xBBBC, 0xBBBD, 0xBBBE,\n    0xBBBF, 0xBBC1, 0xBBC2, 0xBBC3, 0xBBC5, 0xBBC6, 0xBBC7, 0xBBC9,\n    0xBBCA, 0xBBCB, 0xBBCC, 0xBBCD, 0xBBCE, 0xBBCF, 0xBBD1, 0xBBD2,\n    0xBBD4, 0xBBD5, 0xBBD6, 0xBBD7, 0xBBD8, 0xBBD9, 0xBBDA, 0xBBDB,\n    0xBBDC, 0xBBDD, 0xBBDE, 0xBBDF, 0xBBE0, 0xBBE1, 0xBBE2, 0xBBE3,\n    0xBBE4, 0xBBE5, 0xBBE6, 0xBBE7, 0xBBE8, 0xBBE9, 0xBBEA, 0xBBEB,\n    0xBBEC, 0xBBED, 0xBBEE, 0xBBEF, 0xBBF0, 0xBBF1, 0xBBF2, 0xBBF3,\n    0xBBF4, 0xBBF5, 0xBBF6, 0xBBF7, 0xBBFA, 0xBBFB, 0xBBFD, 0xBBFE,\n    0xBC01, 0xBC03, 0xBC04, 0xBC05, 0xBC06, 0xBC07, 0xBC0A, 0xBC0E,\n    0xBC10, 0xBC12, 0xBC13, 0xBC19, 0xBC1A, 0xBC20, 0xBC21, 0xBC22,\n    0xBC23, 0xBC26, 0xBC28, 0xBC2A, 0xBC2B, 0xBC2C, 0xBC2E, 0xBC2F,\n    0xBC32, 0xBC33, 0xBC35, 0xBC36, 0xBC37, 0xBC39, 0xBC3A, 0xBC3B,\n    0xBC3C, 0xBC3D, 0xBC3E, 0xBC3F, 0xBC42, 0xBC46, 0xBC47, 0xBC48,\n    0xBC4A, 0xBC4B, 0xBC4E, 0xBC4F, 0xBC51, 0xBC52, 0xBC53, 0xBC54,\n    0xBC55, 0xBC56, 0xBC57, 0xBC58, 0xBC59, 0xBC5A, 0xBC5B, 0xBC5C,\n    0xBC5E, 0xBC5F, 0xBC60, 0xBC61, 0xBC62, 0xBC63, 0xBC64, 0xBC65,\n    0xBC66, 0xBC67, 0xBC68, 0xBC69, 0xBC6A, 0xBC6B, 0xBC6C, 0xBC6D,\n    0xBC6E, 0xBC6F, 0xBC70, 0xBC71, 0xBC72, 0xBC73, 0xBC74, 0xBC75,\n    0xBC76, 0xBC77, 0xBC78, 0xBC79, 0xBC7A, 0xBC7B, 0xBC7C, 0xBC7D,\n    0xBC7E, 0xBC7F, 0xBC80, 0xBC81, 0xBC82, 0xBC83, 0xBC86, 0xBC87,\n    0xBC89, 0xBC8A, 0xBC8D, 0xBC8F, 0xBC90, 0xBC91, 0xBC92, 0xBC93,\n    0xBC96, 0xBC98, 0xBC9B, 0xBC9C, 0xBC9D, 0xBC9E, 0xBC9F, 0xBCA2,\n    0xBCA3, 0xBCA5, 0xBCA6, 0xBCA9, 0xBCAA, 0xBCAB, 0xBCAC, 0xBCAD,\n    0xBCAE, 0xBCAF, 0xBCB2, 0xBCB6, 0xBCB7, 0xBCB8, 0xBCB9, 0xBCBA,\n    0xBCBB, 0xBCBE, 0xBCBF, 0xBCC1, 0xBCC2, 0xBCC3, 0xBCC5, 0xBCC6,\n    0xBCC7, 0xBCC8, 0xBCC9, 0xBCCA, 0xBCCB, 0xBCCC, 0xBCCE, 0xBCD2,\n    0xBCD3, 0xBCD4, 0xBCD6, 0xBCD7, 0xBCD9, 0xBCDA, 0xBCDB, 0xBCDD,\n    0xBCDE, 0xBCDF, 0xBCE0, 0xBCE1, 0xBCE2, 0xBCE3, 0xBCE4, 0xBCE5,\n    0xBCE6, 0xBCE7, 0xBCE8, 0xBCE9, 0xBCEA, 0xBCEB, 0xBCEC, 0xBCED,\n    0xBCEE, 0xBCEF, 0xBCF0, 0xBCF1, 0xBCF2, 0xBCF3, 0xBCF7, 0xBCF9,\n    0xBCFA, 0xBCFB, 0xBCFD, 0xBCFE, 0xBCFF, 0xBD00, 0xBD01, 0xBD02,\n    0xBD03, 0xBD06, 0xBD08, 0xBD0A, 0xBD0B, 0xBD0C, 0xBD0D, 0xBD0E,\n    0xBD0F, 0xBD11, 0xBD12, 0xBD13, 0xBD15, 0xBD16, 0xBD17, 0xBD18,\n    0xBD19, 0xBD1A, 0xBD1B, 0xBD1C, 0xBD1D, 0xBD1E, 0xBD1F, 0xBD20,\n    0xBD21, 0xBD22, 0xBD23, 0xBD25, 0xBD26, 0xBD27, 0xBD28, 0xBD29,\n    0xBD2A, 0xBD2B, 0xBD2D, 0xBD2E, 0xBD2F, 0xBD30, 0xBD31, 0xBD32,\n    0xBD33, 0xBD34, 0xBD35, 0xBD36, 0xBD37, 0xBD38, 0xBD39, 0xBD3A,\n    0xBD3B, 0xBD3C, 0xBD3D, 0xBD3E, 0xBD3F, 0xBD41, 0xBD42, 0xBD43,\n    0xBD44, 0xBD45, 0xBD46, 0xBD47, 0xBD4A, 0xBD4B, 0xBD4D, 0xBD4E,\n    0xBD4F, 0xBD51, 0xBD52, 0xBD53, 0xBD54, 0xBD55, 0xBD56, 0xBD57,\n    0xBD5A, 0xBD5B, 0xBD5C, 0xBD5D, 0xBD5E, 0xBD5F, 0xBD60, 0xBD61,\n    0xBD62, 0xBD63, 0xBD65, 0xBD66, 0xBD67, 0xBD69, 0xBD6A, 0xBD6B,\n    0xBD6C, 0xBD6D, 0xBD6E, 0xBD6F, 0xBD70, 0xBD71, 0xBD72, 0xBD73,\n    0xBD74, 0xBD75, 0xBD76, 0xBD77, 0xBD78, 0xBD79, 0xBD7A, 0xBD7B,\n    0xBD7C, 0xBD7D, 0xBD7E, 0xBD7F, 0xBD82, 0xBD83, 0xBD85, 0xBD86,\n    0xBD8B, 0xBD8C, 0xBD8D, 0xBD8E, 0xBD8F, 0xBD92, 0xBD94, 0xBD96,\n    0xBD97, 0xBD98, 0xBD9B, 0xBD9D, 0xBD9E, 0xBD9F, 0xBDA0, 0xBDA1,\n    0xBDA2, 0xBDA3, 0xBDA5, 0xBDA6, 0xBDA7, 0xBDA8, 0xBDA9, 0xBDAA,\n    0xBDAB, 0xBDAC, 0xBDAD, 0xBDAE, 0xBDAF, 0xBDB1, 0xBDB2, 0xBDB3,\n    0xBDB4, 0xBDB5, 0xBDB6, 0xBDB7, 0xBDB9, 0xBDBA, 0xBDBB, 0xBDBC,\n    0xBDBD, 0xBDBE, 0xBDBF, 0xBDC0, 0xBDC1, 0xBDC2, 0xBDC3, 0xBDC4,\n    0xBDC5, 0xBDC6, 0xBDC7, 0xBDC8, 0xBDC9, 0xBDCA, 0xBDCB, 0xBDCC,\n    0xBDCD, 0xBDCE, 0xBDCF, 0xBDD0, 0xBDD1, 0xBDD2, 0xBDD3, 0xBDD6,\n    0xBDD7, 0xBDD9, 0xBDDA, 0xBDDB, 0xBDDD, 0xBDDE, 0xBDDF, 0xBDE0,\n    0xBDE1, 0xBDE2, 0xBDE3, 0xBDE4, 0xBDE5, 0xBDE6, 0xBDE7, 0xBDE8,\n    0xBDEA, 0xBDEB, 0xBDEC, 0xBDED, 0xBDEE, 0xBDEF, 0xBDF1, 0xBDF2,\n    0xBDF3, 0xBDF5, 0xBDF6, 0xBDF7, 0xBDF9, 0xBDFA, 0xBDFB, 0xBDFC,\n    0xBDFD, 0xBDFE, 0xBDFF, 0xBE01, 0xBE02, 0xBE04, 0xBE06, 0xBE07,\n    0xBE08, 0xBE09, 0xBE0A, 0xBE0B, 0xBE0E, 0xBE0F, 0xBE11, 0xBE12,\n    0xBE13, 0xBE15, 0xBE16, 0xBE17, 0xBE18, 0xBE19, 0xBE1A, 0xBE1B,\n    0xBE1E, 0xBE20, 0xBE21, 0xBE22, 0xBE23, 0xBE24, 0xBE25, 0xBE26,\n    0xBE27, 0xBE28, 0xBE29, 0xBE2A, 0xBE2B, 0xBE2C, 0xBE2D, 0xBE2E,\n    0xBE2F, 0xBE30, 0xBE31, 0xBE32, 0xBE33, 0xBE34, 0xBE35, 0xBE36,\n    0xBE37, 0xBE38, 0xBE39, 0xBE3A, 0xBE3B, 0xBE3C, 0xBE3D, 0xBE3E,\n    0xBE3F, 0xBE40, 0xBE41, 0xBE42, 0xBE43, 0xBE46, 0xBE47, 0xBE49,\n    0xBE4A, 0xBE4B, 0xBE4D, 0xBE4F, 0xBE50, 0xBE51, 0xBE52, 0xBE53,\n    0xBE56, 0xBE58, 0xBE5C, 0xBE5D, 0xBE5E, 0xBE5F, 0xBE62, 0xBE63,\n    0xBE65, 0xBE66, 0xBE67, 0xBE69, 0xBE6B, 0xBE6C, 0xBE6D, 0xBE6E,\n    0xBE6F, 0xBE72, 0xBE76, 0xBE77, 0xBE78, 0xBE79, 0xBE7A, 0xBE7E,\n    0xBE7F, 0xBE81, 0xBE82, 0xBE83, 0xBE85, 0xBE86, 0xBE87, 0xBE88,\n    0xBE89, 0xBE8A, 0xBE8B, 0xBE8E, 0xBE92, 0xBE93, 0xBE94, 0xBE95,\n    0xBE96, 0xBE97, 0xBE9A, 0xBE9B, 0xBE9C, 0xBE9D, 0xBE9E, 0xBE9F,\n    0xBEA0, 0xBEA1, 0xBEA2, 0xBEA3, 0xBEA4, 0xBEA5, 0xBEA6, 0xBEA7,\n    0xBEA9, 0xBEAA, 0xBEAB, 0xBEAC, 0xBEAD, 0xBEAE, 0xBEAF, 0xBEB0,\n    0xBEB1, 0xBEB2, 0xBEB3, 0xBEB4, 0xBEB5, 0xBEB6, 0xBEB7, 0xBEB8,\n    0xBEB9, 0xBEBA, 0xBEBB, 0xBEBC, 0xBEBD, 0xBEBE, 0xBEBF, 0xBEC0,\n    0xBEC1, 0xBEC2, 0xBEC3, 0xBEC4, 0xBEC5, 0xBEC6, 0xBEC7, 0xBEC8,\n    0xBEC9, 0xBECA, 0xBECB, 0xBECC, 0xBECD, 0xBECE, 0xBECF, 0xBED2,\n    0xBED3, 0xBED5, 0xBED6, 0xBED9, 0xBEDA, 0xBEDB, 0xBEDC, 0xBEDD,\n    0xBEDE, 0xBEDF, 0xBEE1, 0xBEE2, 0xBEE6, 0xBEE7, 0xBEE8, 0xBEE9,\n    0xBEEA, 0xBEEB, 0xBEED, 0xBEEE, 0xBEEF, 0xBEF0, 0xBEF1, 0xBEF2,\n    0xBEF3, 0xBEF4, 0xBEF5, 0xBEF6, 0xBEF7, 0xBEF8, 0xBEF9, 0xBEFA,\n    0xBEFB, 0xBEFC, 0xBEFD, 0xBEFE, 0xBEFF, 0xBF00, 0xBF02, 0xBF03,\n    0xBF04, 0xBF05, 0xBF06, 0xBF07, 0xBF0A, 0xBF0B, 0xBF0C, 0xBF0D,\n    0xBF0E, 0xBF0F, 0xBF10, 0xBF11, 0xBF12, 0xBF13, 0xBF14, 0xBF15,\n    0xBF16, 0xBF17, 0xBF1A, 0xBF1E, 0xBF1F, 0xBF20, 0xBF21, 0xBF22,\n    0xBF23, 0xBF24, 0xBF25, 0xBF26, 0xBF27, 0xBF28, 0xBF29, 0xBF2A,\n    0xBF2B, 0xBF2C, 0xBF2D, 0xBF2E, 0xBF2F, 0xBF30, 0xBF31, 0xBF32,\n    0xBF33, 0xBF34, 0xBF35, 0xBF36, 0xBF37, 0xBF38, 0xBF39, 0xBF3A,\n    0xBF3B, 0xBF3C, 0xBF3D, 0xBF3E, 0xBF3F, 0xBF42, 0xBF43, 0xBF45,\n    0xBF46, 0xBF47, 0xBF49, 0xBF4A, 0xBF4B, 0xBF4C, 0xBF4D, 0xBF4E,\n    0xBF4F, 0xBF52, 0xBF53, 0xBF54, 0xBF56, 0xBF57, 0xBF58, 0xBF59,\n    0xBF5A, 0xBF5B, 0xBF5C, 0xBF5D, 0xBF5E, 0xBF5F, 0xBF60, 0xBF61,\n    0xBF62, 0xBF63, 0xBF64, 0xBF65, 0xBF66, 0xBF67, 0xBF68, 0xBF69,\n    0xBF6A, 0xBF6B, 0xBF6C, 0xBF6D, 0xBF6E, 0xBF6F, 0xBF70, 0xBF71,\n    0xBF72, 0xBF73, 0xBF74, 0xBF75, 0xBF76, 0xBF77, 0xBF78, 0xBF79,\n    0xBF7A, 0xBF7B, 0xBF7C, 0xBF7D, 0xBF7E, 0xBF7F, 0xBF80, 0xBF81,\n    0xBF82, 0xBF83, 0xBF84, 0xBF85, 0xBF86, 0xBF87, 0xBF88, 0xBF89,\n    0xBF8A, 0xBF8B, 0xBF8C, 0xBF8D, 0xBF8E, 0xBF8F, 0xBF90, 0xBF91,\n    0xBF92, 0xBF93, 0xBF95, 0xBF96, 0xBF97, 0xBF98, 0xBF99, 0xBF9A,\n    0xBF9B, 0xBF9C, 0xBF9D, 0xBF9E, 0xBF9F, 0xBFA0, 0xBFA1, 0xBFA2,\n    0xBFA3, 0xBFA4, 0xBFA5, 0xBFA6, 0xBFA7, 0xBFA8, 0xBFA9, 0xBFAA,\n    0xBFAB, 0xBFAC, 0xBFAD, 0xBFAE, 0xBFAF, 0xBFB1, 0xBFB2, 0xBFB3,\n    0xBFB4, 0xBFB5, 0xBFB6, 0xBFB7, 0xBFB8, 0xBFB9, 0xBFBA, 0xBFBB,\n    0xBFBC, 0xBFBD, 0xBFBE, 0xBFBF, 0xBFC0, 0xBFC1, 0xBFC2, 0xBFC3,\n    0xBFC4, 0xBFC6, 0xBFC7, 0xBFC8, 0xBFC9, 0xBFCA, 0xBFCB, 0xBFCE,\n    0xBFCF, 0xBFD1, 0xBFD2, 0xBFD3, 0xBFD5, 0xBFD6, 0xBFD7, 0xBFD8,\n    0xBFD9, 0xBFDA, 0xBFDB, 0xBFDD, 0xBFDE, 0xBFE0, 0xBFE2, 0xBFE3,\n    0xBFE4, 0xBFE5, 0xBFE6, 0xBFE7, 0xBFE8, 0xBFE9, 0xBFEA, 0xBFEB,\n    0xBFEC, 0xBFED, 0xBFEE, 0xBFEF, 0xBFF0, 0xBFF1, 0xBFF2, 0xBFF3,\n    0xBFF4, 0xBFF5, 0xBFF6, 0xBFF7, 0xBFF8, 0xBFF9, 0xBFFA, 0xBFFB,\n    0xBFFC, 0xBFFD, 0xBFFE, 0xBFFF, 0xC000, 0xC001, 0xC002, 0xC003,\n    0xC004, 0xC005, 0xC006, 0xC007, 0xC008, 0xC009, 0xC00A, 0xC00B,\n    0xC00C, 0xC00D, 0xC00E, 0xC00F, 0xC010, 0xC011, 0xC012, 0xC013,\n    0xC014, 0xC015, 0xC016, 0xC017, 0xC018, 0xC019, 0xC01A, 0xC01B,\n    0xC01C, 0xC01D, 0xC01E, 0xC01F, 0xC020, 0xC021, 0xC022, 0xC023,\n    0xC024, 0xC025, 0xC026, 0xC027, 0xC028, 0xC029, 0xC02A, 0xC02B,\n    0xC02C, 0xC02D, 0xC02E, 0xC02F, 0xC030, 0xC031, 0xC032, 0xC033,\n    0xC034, 0xC035, 0xC036, 0xC037, 0xC038, 0xC039, 0xC03A, 0xC03B,\n    0xC03D, 0xC03E, 0xC03F, 0xC040, 0xC041, 0xC042, 0xC043, 0xC044,\n    0xC045, 0xC046, 0xC047, 0xC048, 0xC049, 0xC04A, 0xC04B, 0xC04C,\n    0xC04D, 0xC04E, 0xC04F, 0xC050, 0xC052, 0xC053, 0xC054, 0xC055,\n    0xC056, 0xC057, 0xC059, 0xC05A, 0xC05B, 0xC05D, 0xC05E, 0xC05F,\n    0xC061, 0xC062, 0xC063, 0xC064, 0xC065, 0xC066, 0xC067, 0xC06A,\n    0xC06B, 0xC06C, 0xC06D, 0xC06E, 0xC06F, 0xC070, 0xC071, 0xC072,\n    0xC073, 0xC074, 0xC075, 0xC076, 0xC077, 0xC078, 0xC079, 0xC07A,\n    0xC07B, 0xC07C, 0xC07D, 0xC07E, 0xC07F, 0xC080, 0xC081, 0xC082,\n    0xC083, 0xC084, 0xC085, 0xC086, 0xC087, 0xC088, 0xC089, 0xC08A,\n    0xC08B, 0xC08C, 0xC08D, 0xC08E, 0xC08F, 0xC092, 0xC093, 0xC095,\n    0xC096, 0xC097, 0xC099, 0xC09A, 0xC09B, 0xC09C, 0xC09D, 0xC09E,\n    0xC09F, 0xC0A2, 0xC0A4, 0xC0A6, 0xC0A7, 0xC0A8, 0xC0A9, 0xC0AA,\n    0xC0AB, 0xC0AE, 0xC0B1, 0xC0B2, 0xC0B7, 0xC0B8, 0xC0B9, 0xC0BA,\n    0xC0BB, 0xC0BE, 0xC0C2, 0xC0C3, 0xC0C4, 0xC0C6, 0xC0C7, 0xC0CA,\n    0xC0CB, 0xC0CD, 0xC0CE, 0xC0CF, 0xC0D1, 0xC0D2, 0xC0D3, 0xC0D4,\n    0xC0D5, 0xC0D6, 0xC0D7, 0xC0DA, 0xC0DE, 0xC0DF, 0xC0E0, 0xC0E1,\n    0xC0E2, 0xC0E3, 0xC0E6, 0xC0E7, 0xC0E9, 0xC0EA, 0xC0EB, 0xC0ED,\n    0xC0EE, 0xC0EF, 0xC0F0, 0xC0F1, 0xC0F2, 0xC0F3, 0xC0F6, 0xC0F8,\n    0xC0FA, 0xC0FB, 0xC0FC, 0xC0FD, 0xC0FE, 0xC0FF, 0xC101, 0xC102,\n    0xC103, 0xC105, 0xC106, 0xC107, 0xC109, 0xC10A, 0xC10B, 0xC10C,\n    0xC10D, 0xC10E, 0xC10F, 0xC111, 0xC112, 0xC113, 0xC114, 0xC116,\n    0xC117, 0xC118, 0xC119, 0xC11A, 0xC11B, 0xC121, 0xC122, 0xC125,\n    0xC128, 0xC129, 0xC12A, 0xC12B, 0xC12E, 0xC132, 0xC133, 0xC134,\n    0xC135, 0xC137, 0xC13A, 0xC13B, 0xC13D, 0xC13E, 0xC13F, 0xC141,\n    0xC142, 0xC143, 0xC144, 0xC145, 0xC146, 0xC147, 0xC14A, 0xC14E,\n    0xC14F, 0xC150, 0xC151, 0xC152, 0xC153, 0xC156, 0xC157, 0xC159,\n    0xC15A, 0xC15B, 0xC15D, 0xC15E, 0xC15F, 0xC160, 0xC161, 0xC162,\n    0xC163, 0xC166, 0xC16A, 0xC16B, 0xC16C, 0xC16D, 0xC16E, 0xC16F,\n    0xC171, 0xC172, 0xC173, 0xC175, 0xC176, 0xC177, 0xC179, 0xC17A,\n    0xC17B, 0xC17C, 0xC17D, 0xC17E, 0xC17F, 0xC180, 0xC181, 0xC182,\n    0xC183, 0xC184, 0xC186, 0xC187, 0xC188, 0xC189, 0xC18A, 0xC18B,\n    0xC18F, 0xC191, 0xC192, 0xC193, 0xC195, 0xC197, 0xC198, 0xC199,\n    0xC19A, 0xC19B, 0xC19E, 0xC1A0, 0xC1A2, 0xC1A3, 0xC1A4, 0xC1A6,\n    0xC1A7, 0xC1AA, 0xC1AB, 0xC1AD, 0xC1AE, 0xC1AF, 0xC1B1, 0xC1B2,\n    0xC1B3, 0xC1B4, 0xC1B5, 0xC1B6, 0xC1B7, 0xC1B8, 0xC1B9, 0xC1BA,\n    0xC1BB, 0xC1BC, 0xC1BE, 0xC1BF, 0xC1C0, 0xC1C1, 0xC1C2, 0xC1C3,\n    0xC1C5, 0xC1C6, 0xC1C7, 0xC1C9, 0xC1CA, 0xC1CB, 0xC1CD, 0xC1CE,\n    0xC1CF, 0xC1D0, 0xC1D1, 0xC1D2, 0xC1D3, 0xC1D5, 0xC1D6, 0xC1D9,\n    0xC1DA, 0xC1DB, 0xC1DC, 0xC1DD, 0xC1DE, 0xC1DF, 0xC1E1, 0xC1E2,\n    0xC1E3, 0xC1E5, 0xC1E6, 0xC1E7, 0xC1E9, 0xC1EA, 0xC1EB, 0xC1EC,\n    0xC1ED, 0xC1EE, 0xC1EF, 0xC1F2, 0xC1F4, 0xC1F5, 0xC1F6, 0xC1F7,\n    0xC1F8, 0xC1F9, 0xC1FA, 0xC1FB, 0xC1FE, 0xC1FF, 0xC201, 0xC202,\n    0xC203, 0xC205, 0xC206, 0xC207, 0xC208, 0xC209, 0xC20A, 0xC20B,\n    0xC20E, 0xC210, 0xC212, 0xC213, 0xC214, 0xC215, 0xC216, 0xC217,\n    0xC21A, 0xC21B, 0xC21D, 0xC21E, 0xC221, 0xC222, 0xC223, 0xC224,\n    0xC225, 0xC226, 0xC227, 0xC22A, 0xC22C, 0xC22E, 0xC230, 0xC233,\n    0xC235, 0xC236, 0xC237, 0xC238, 0xC239, 0xC23A, 0xC23B, 0xC23C,\n    0xC23D, 0xC23E, 0xC23F, 0xC240, 0xC241, 0xC242, 0xC243, 0xC244,\n    0xC245, 0xC246, 0xC247, 0xC249, 0xC24A, 0xC24B, 0xC24C, 0xC24D,\n    0xC24E, 0xC24F, 0xC252, 0xC253, 0xC255, 0xC256, 0xC257, 0xC259,\n    0xC25A, 0xC25B, 0xC25C, 0xC25D, 0xC25E, 0xC25F, 0xC261, 0xC262,\n    0xC263, 0xC264, 0xC266, 0xC267, 0xC268, 0xC269, 0xC26A, 0xC26B,\n    0xC26E, 0xC26F, 0xC271, 0xC272, 0xC273, 0xC275, 0xC276, 0xC277,\n    0xC278, 0xC279, 0xC27A, 0xC27B, 0xC27E, 0xC280, 0xC282, 0xC283,\n    0xC284, 0xC285, 0xC286, 0xC287, 0xC28A, 0xC28B, 0xC28C, 0xC28D,\n    0xC28E, 0xC28F, 0xC291, 0xC292, 0xC293, 0xC294, 0xC295, 0xC296,\n    0xC297, 0xC299, 0xC29A, 0xC29C, 0xC29E, 0xC29F, 0xC2A0, 0xC2A1,\n    0xC2A2, 0xC2A3, 0xC2A6, 0xC2A7, 0xC2A9, 0xC2AA, 0xC2AB, 0xC2AE,\n    0xC2AF, 0xC2B0, 0xC2B1, 0xC2B2, 0xC2B3, 0xC2B6, 0xC2B8, 0xC2BA,\n    0xC2BB, 0xC2BC, 0xC2BD, 0xC2BE, 0xC2BF, 0xC2C0, 0xC2C1, 0xC2C2,\n    0xC2C3, 0xC2C4, 0xC2C5, 0xC2C6, 0xC2C7, 0xC2C8, 0xC2C9, 0xC2CA,\n    0xC2CB, 0xC2CC, 0xC2CD, 0xC2CE, 0xC2CF, 0xC2D0, 0xC2D1, 0xC2D2,\n    0xC2D3, 0xC2D4, 0xC2D5, 0xC2D6, 0xC2D7, 0xC2D8, 0xC2D9, 0xC2DA,\n    0xC2DB, 0xC2DE, 0xC2DF, 0xC2E1, 0xC2E2, 0xC2E5, 0xC2E6, 0xC2E7,\n    0xC2E8, 0xC2E9, 0xC2EA, 0xC2EE, 0xC2F0, 0xC2F2, 0xC2F3, 0xC2F4,\n    0xC2F5, 0xC2F7, 0xC2FA, 0xC2FD, 0xC2FE, 0xC2FF, 0xC301, 0xC302,\n    0xC303, 0xC304, 0xC305, 0xC306, 0xC307, 0xC30A, 0xC30B, 0xC30E,\n    0xC30F, 0xC310, 0xC311, 0xC312, 0xC316, 0xC317, 0xC319, 0xC31A,\n    0xC31B, 0xC31D, 0xC31E, 0xC31F, 0xC320, 0xC321, 0xC322, 0xC323,\n    0xC326, 0xC327, 0xC32A, 0xC32B, 0xC32C, 0xC32D, 0xC32E, 0xC32F,\n    0xC330, 0xC331, 0xC332, 0xC333, 0xC334, 0xC335, 0xC336, 0xC337,\n    0xC338, 0xC339, 0xC33A, 0xC33B, 0xC33C, 0xC33D, 0xC33E, 0xC33F,\n    0xC340, 0xC341, 0xC342, 0xC343, 0xC344, 0xC346, 0xC347, 0xC348,\n    0xC349, 0xC34A, 0xC34B, 0xC34C, 0xC34D, 0xC34E, 0xC34F, 0xC350,\n    0xC351, 0xC352, 0xC353, 0xC354, 0xC355, 0xC356, 0xC357, 0xC358,\n    0xC359, 0xC35A, 0xC35B, 0xC35C, 0xC35D, 0xC35E, 0xC35F, 0xC360,\n    0xC361, 0xC362, 0xC363, 0xC364, 0xC365, 0xC366, 0xC367, 0xC36A,\n    0xC36B, 0xC36D, 0xC36E, 0xC36F, 0xC371, 0xC373, 0xC374, 0xC375,\n    0xC376, 0xC377, 0xC37A, 0xC37B, 0xC37E, 0xC37F, 0xC380, 0xC381,\n    0xC382, 0xC383, 0xC385, 0xC386, 0xC387, 0xC389, 0xC38A, 0xC38B,\n    0xC38D, 0xC38E, 0xC38F, 0xC390, 0xC391, 0xC392, 0xC393, 0xC394,\n    0xC395, 0xC396, 0xC397, 0xC398, 0xC399, 0xC39A, 0xC39B, 0xC39C,\n    0xC39D, 0xC39E, 0xC39F, 0xC3A0, 0xC3A1, 0xC3A2, 0xC3A3, 0xC3A4,\n    0xC3A5, 0xC3A6, 0xC3A7, 0xC3A8, 0xC3A9, 0xC3AA, 0xC3AB, 0xC3AC,\n    0xC3AD, 0xC3AE, 0xC3AF, 0xC3B0, 0xC3B1, 0xC3B2, 0xC3B3, 0xC3B4,\n    0xC3B5, 0xC3B6, 0xC3B7, 0xC3B8, 0xC3B9, 0xC3BA, 0xC3BB, 0xC3BC,\n    0xC3BD, 0xC3BE, 0xC3BF, 0xC3C1, 0xC3C2, 0xC3C3, 0xC3C4, 0xC3C5,\n    0xC3C6, 0xC3C7, 0xC3C8, 0xC3C9, 0xC3CA, 0xC3CB, 0xC3CC, 0xC3CD,\n    0xC3CE, 0xC3CF, 0xC3D0, 0xC3D1, 0xC3D2, 0xC3D3, 0xC3D4, 0xC3D5,\n    0xC3D6, 0xC3D7, 0xC3DA, 0xC3DB, 0xC3DD, 0xC3DE, 0xC3E1, 0xC3E3,\n    0xC3E4, 0xC3E5, 0xC3E6, 0xC3E7, 0xC3EA, 0xC3EB, 0xC3EC, 0xC3EE,\n    0xC3EF, 0xC3F0, 0xC3F1, 0xC3F2, 0xC3F3, 0xC3F6, 0xC3F7, 0xC3F9,\n    0xC3FA, 0xC3FB, 0xC3FC, 0xC3FD, 0xC3FE, 0xC3FF, 0xC400, 0xC401,\n    0xC402, 0xC403, 0xC404, 0xC405, 0xC406, 0xC407, 0xC409, 0xC40A,\n    0xC40B, 0xC40C, 0xC40D, 0xC40E, 0xC40F, 0xC411, 0xC412, 0xC413,\n    0xC414, 0xC415, 0xC416, 0xC417, 0xC418, 0xC419, 0xC41A, 0xC41B,\n    0xC41C, 0xC41D, 0xC41E, 0xC41F, 0xC420, 0xC421, 0xC422, 0xC423,\n    0xC425, 0xC426, 0xC427, 0xC428, 0xC429, 0xC42A, 0xC42B, 0xC42D,\n    0xC42E, 0xC42F, 0xC431, 0xC432, 0xC433, 0xC435, 0xC436, 0xC437,\n    0xC438, 0xC439, 0xC43A, 0xC43B, 0xC43E, 0xC43F, 0xC440, 0xC441,\n    0xC442, 0xC443, 0xC444, 0xC445, 0xC446, 0xC447, 0xC449, 0xC44A,\n    0xC44B, 0xC44C, 0xC44D, 0xC44E, 0xC44F, 0xC450, 0xC451, 0xC452,\n    0xC453, 0xC454, 0xC455, 0xC456, 0xC457, 0xC458, 0xC459, 0xC45A,\n    0xC45B, 0xC45C, 0xC45D, 0xC45E, 0xC45F, 0xC460, 0xC461, 0xC462,\n    0xC463, 0xC466, 0xC467, 0xC469, 0xC46A, 0xC46B, 0xC46D, 0xC46E,\n    0xC46F, 0xC470, 0xC471, 0xC472, 0xC473, 0xC476, 0xC477, 0xC478,\n    0xC47A, 0xC47B, 0xC47C, 0xC47D, 0xC47E, 0xC47F, 0xC481, 0xC482,\n    0xC483, 0xC484, 0xC485, 0xC486, 0xC487, 0xC488, 0xC489, 0xC48A,\n    0xC48B, 0xC48C, 0xC48D, 0xC48E, 0xC48F, 0xC490, 0xC491, 0xC492,\n    0xC493, 0xC495, 0xC496, 0xC497, 0xC498, 0xC499, 0xC49A, 0xC49B,\n    0xC49D, 0xC49E, 0xC49F, 0xC4A0, 0xC4A1, 0xC4A2, 0xC4A3, 0xC4A4,\n    0xC4A5, 0xC4A6, 0xC4A7, 0xC4A8, 0xC4A9, 0xC4AA, 0xC4AB, 0xC4AC,\n    0xC4AD, 0xC4AE, 0xC4AF, 0xC4B0, 0xC4B1, 0xC4B2, 0xC4B3, 0xC4B4,\n    0xC4B5, 0xC4B6, 0xC4B7, 0xC4B9, 0xC4BA, 0xC4BB, 0xC4BD, 0xC4BE,\n    0xC4BF, 0xC4C0, 0xC4C1, 0xC4C2, 0xC4C3, 0xC4C4, 0xC4C5, 0xC4C6,\n    0xC4C7, 0xC4C8, 0xC4C9, 0xC4CA, 0xC4CB, 0xC4CC, 0xC4CD, 0xC4CE,\n    0xC4CF, 0xC4D0, 0xC4D1, 0xC4D2, 0xC4D3, 0xC4D4, 0xC4D5, 0xC4D6,\n    0xC4D7, 0xC4D8, 0xC4D9, 0xC4DA, 0xC4DB, 0xC4DC, 0xC4DD, 0xC4DE,\n    0xC4DF, 0xC4E0, 0xC4E1, 0xC4E2, 0xC4E3, 0xC4E4, 0xC4E5, 0xC4E6,\n    0xC4E7, 0xC4E8, 0xC4EA, 0xC4EB, 0xC4EC, 0xC4ED, 0xC4EE, 0xC4EF,\n    0xC4F2, 0xC4F3, 0xC4F5, 0xC4F6, 0xC4F7, 0xC4F9, 0xC4FB, 0xC4FC,\n    0xC4FD, 0xC4FE, 0xC502, 0xC503, 0xC504, 0xC505, 0xC506, 0xC507,\n    0xC508, 0xC509, 0xC50A, 0xC50B, 0xC50D, 0xC50E, 0xC50F, 0xC511,\n    0xC512, 0xC513, 0xC515, 0xC516, 0xC517, 0xC518, 0xC519, 0xC51A,\n    0xC51B, 0xC51D, 0xC51E, 0xC51F, 0xC520, 0xC521, 0xC522, 0xC523,\n    0xC524, 0xC525, 0xC526, 0xC527, 0xC52A, 0xC52B, 0xC52D, 0xC52E,\n    0xC52F, 0xC531, 0xC532, 0xC533, 0xC534, 0xC535, 0xC536, 0xC537,\n    0xC53A, 0xC53C, 0xC53E, 0xC53F, 0xC540, 0xC541, 0xC542, 0xC543,\n    0xC546, 0xC547, 0xC54B, 0xC54F, 0xC550, 0xC551, 0xC552, 0xC556,\n    0xC55A, 0xC55B, 0xC55C, 0xC55F, 0xC562, 0xC563, 0xC565, 0xC566,\n    0xC567, 0xC569, 0xC56A, 0xC56B, 0xC56C, 0xC56D, 0xC56E, 0xC56F,\n    0xC572, 0xC576, 0xC577, 0xC578, 0xC579, 0xC57A, 0xC57B, 0xC57E,\n    0xC57F, 0xC581, 0xC582, 0xC583, 0xC585, 0xC586, 0xC588, 0xC589,\n    0xC58A, 0xC58B, 0xC58E, 0xC590, 0xC592, 0xC593, 0xC594, 0xC596,\n    0xC599, 0xC59A, 0xC59B, 0xC59D, 0xC59E, 0xC59F, 0xC5A1, 0xC5A2,\n    0xC5A3, 0xC5A4, 0xC5A5, 0xC5A6, 0xC5A7, 0xC5A8, 0xC5AA, 0xC5AB,\n    0xC5AC, 0xC5AD, 0xC5AE, 0xC5AF, 0xC5B0, 0xC5B1, 0xC5B2, 0xC5B3,\n    0xC5B6, 0xC5B7, 0xC5BA, 0xC5BF, 0xC5C0, 0xC5C1, 0xC5C2, 0xC5C3,\n    0xC5CB, 0xC5CD, 0xC5CF, 0xC5D2, 0xC5D3, 0xC5D5, 0xC5D6, 0xC5D7,\n    0xC5D9, 0xC5DA, 0xC5DB, 0xC5DC, 0xC5DD, 0xC5DE, 0xC5DF, 0xC5E2,\n    0xC5E4, 0xC5E6, 0xC5E7, 0xC5E8, 0xC5E9, 0xC5EA, 0xC5EB, 0xC5EF,\n    0xC5F1, 0xC5F2, 0xC5F3, 0xC5F5, 0xC5F8, 0xC5F9, 0xC5FA, 0xC5FB,\n    0xC602, 0xC603, 0xC604, 0xC609, 0xC60A, 0xC60B, 0xC60D, 0xC60E,\n    0xC60F, 0xC611, 0xC612, 0xC613, 0xC614, 0xC615, 0xC616, 0xC617,\n    0xC61A, 0xC61D, 0xC61E, 0xC61F, 0xC620, 0xC621, 0xC622, 0xC623,\n    0xC626, 0xC627, 0xC629, 0xC62A, 0xC62B, 0xC62F, 0xC631, 0xC632,\n    0xC636, 0xC638, 0xC63A, 0xC63C, 0xC63D, 0xC63E, 0xC63F, 0xC642,\n    0xC643, 0xC645, 0xC646, 0xC647, 0xC649, 0xC64A, 0xC64B, 0xC64C,\n    0xC64D, 0xC64E, 0xC64F, 0xC652, 0xC656, 0xC657, 0xC658, 0xC659,\n    0xC65A, 0xC65B, 0xC65E, 0xC65F, 0xC661, 0xC662, 0xC663, 0xC664,\n    0xC665, 0xC666, 0xC667, 0xC668, 0xC669, 0xC66A, 0xC66B, 0xC66D,\n    0xC66E, 0xC670, 0xC672, 0xC673, 0xC674, 0xC675, 0xC676, 0xC677,\n    0xC67A, 0xC67B, 0xC67D, 0xC67E, 0xC67F, 0xC681, 0xC682, 0xC683,\n    0xC684, 0xC685, 0xC686, 0xC687, 0xC68A, 0xC68C, 0xC68E, 0xC68F,\n    0xC690, 0xC691, 0xC692, 0xC693, 0xC696, 0xC697, 0xC699, 0xC69A,\n    0xC69B, 0xC69D, 0xC69E, 0xC69F, 0xC6A0, 0xC6A1, 0xC6A2, 0xC6A3,\n    0xC6A6, 0xC6A8, 0xC6AA, 0xC6AB, 0xC6AC, 0xC6AD, 0xC6AE, 0xC6AF,\n    0xC6B2, 0xC6B3, 0xC6B5, 0xC6B6, 0xC6B7, 0xC6BB, 0xC6BC, 0xC6BD,\n    0xC6BE, 0xC6BF, 0xC6C2, 0xC6C4, 0xC6C6, 0xC6C7, 0xC6C8, 0xC6C9,\n    0xC6CA, 0xC6CB, 0xC6CE, 0xC6CF, 0xC6D1, 0xC6D2, 0xC6D3, 0xC6D5,\n    0xC6D6, 0xC6D7, 0xC6D8, 0xC6D9, 0xC6DA, 0xC6DB, 0xC6DE, 0xC6DF,\n    0xC6E2, 0xC6E3, 0xC6E4, 0xC6E5, 0xC6E6, 0xC6E7, 0xC6EA, 0xC6EB,\n    0xC6ED, 0xC6EE, 0xC6EF, 0xC6F1, 0xC6F2, 0xC6F3, 0xC6F4, 0xC6F5,\n    0xC6F6, 0xC6F7, 0xC6FA, 0xC6FB, 0xC6FC, 0xC6FE, 0xC6FF, 0xC700,\n    0xC701, 0xC702, 0xC703, 0xC706, 0xC707, 0xC709, 0xC70A, 0xC70B,\n    0xC70D, 0xC70E, 0xC70F, 0xC710, 0xC711, 0xC712, 0xC713, 0xC716,\n    0xC718, 0xC71A, 0xC71B, 0xC71C, 0xC71D, 0xC71E, 0xC71F, 0xC722,\n    0xC723, 0xC725, 0xC726, 0xC727, 0xC729, 0xC72A, 0xC72B, 0xC72C,\n    0xC72D, 0xC72E, 0xC72F, 0xC732, 0xC734, 0xC736, 0xC738, 0xC739,\n    0xC73A, 0xC73B, 0xC73E, 0xC73F, 0xC741, 0xC742, 0xC743, 0xC745,\n    0xC746, 0xC747, 0xC748, 0xC749, 0xC74B, 0xC74E, 0xC750, 0xC759,\n    0xC75A, 0xC75B, 0xC75D, 0xC75E, 0xC75F, 0xC761, 0xC762, 0xC763,\n    0xC764, 0xC765, 0xC766, 0xC767, 0xC769, 0xC76A, 0xC76C, 0xC76D,\n    0xC76E, 0xC76F, 0xC770, 0xC771, 0xC772, 0xC773, 0xC776, 0xC777,\n    0xC779, 0xC77A, 0xC77B, 0xC77F, 0xC780, 0xC781, 0xC782, 0xC786,\n    0xC78B, 0xC78C, 0xC78D, 0xC78F, 0xC792, 0xC793, 0xC795, 0xC799,\n    0xC79B, 0xC79C, 0xC79D, 0xC79E, 0xC79F, 0xC7A2, 0xC7A7, 0xC7A8,\n    0xC7A9, 0xC7AA, 0xC7AB, 0xC7AE, 0xC7AF, 0xC7B1, 0xC7B2, 0xC7B3,\n    0xC7B5, 0xC7B6, 0xC7B7, 0xC7B8, 0xC7B9, 0xC7BA, 0xC7BB, 0xC7BE,\n    0xC7C2, 0xC7C3, 0xC7C4, 0xC7C5, 0xC7C6, 0xC7C7, 0xC7CA, 0xC7CB,\n    0xC7CD, 0xC7CF, 0xC7D1, 0xC7D2, 0xC7D3, 0xC7D4, 0xC7D5, 0xC7D6,\n    0xC7D7, 0xC7D9, 0xC7DA, 0xC7DB, 0xC7DC, 0xC7DE, 0xC7DF, 0xC7E0,\n    0xC7E1, 0xC7E2, 0xC7E3, 0xC7E5, 0xC7E6, 0xC7E7, 0xC7E9, 0xC7EA,\n    0xC7EB, 0xC7ED, 0xC7EE, 0xC7EF, 0xC7F0, 0xC7F1, 0xC7F2, 0xC7F3,\n    0xC7F4, 0xC7F5, 0xC7F6, 0xC7F7, 0xC7F8, 0xC7F9, 0xC7FA, 0xC7FB,\n    0xC7FC, 0xC7FD, 0xC7FE, 0xC7FF, 0xC802, 0xC803, 0xC805, 0xC806,\n    0xC807, 0xC809, 0xC80B, 0xC80C, 0xC80D, 0xC80E, 0xC80F, 0xC812,\n    0xC814, 0xC817, 0xC818, 0xC819, 0xC81A, 0xC81B, 0xC81E, 0xC81F,\n    0xC821, 0xC822, 0xC823, 0xC825, 0xC826, 0xC827, 0xC828, 0xC829,\n    0xC82A, 0xC82B, 0xC82E, 0xC830, 0xC832, 0xC833, 0xC834, 0xC835,\n    0xC836, 0xC837, 0xC839, 0xC83A, 0xC83B, 0xC83D, 0xC83E, 0xC83F,\n    0xC841, 0xC842, 0xC843, 0xC844, 0xC845, 0xC846, 0xC847, 0xC84A,\n    0xC84B, 0xC84E, 0xC84F, 0xC850, 0xC851, 0xC852, 0xC853, 0xC855,\n    0xC856, 0xC857, 0xC858, 0xC859, 0xC85A, 0xC85B, 0xC85C, 0xC85D,\n    0xC85E, 0xC85F, 0xC860, 0xC861, 0xC862, 0xC863, 0xC864, 0xC865,\n    0xC866, 0xC867, 0xC868, 0xC869, 0xC86A, 0xC86B, 0xC86C, 0xC86D,\n    0xC86E, 0xC86F, 0xC872, 0xC873, 0xC875, 0xC876, 0xC877, 0xC879,\n    0xC87B, 0xC87C, 0xC87D, 0xC87E, 0xC87F, 0xC882, 0xC884, 0xC888,\n    0xC889, 0xC88A, 0xC88E, 0xC88F, 0xC890, 0xC891, 0xC892, 0xC893,\n    0xC895, 0xC896, 0xC897, 0xC898, 0xC899, 0xC89A, 0xC89B, 0xC89C,\n    0xC89E, 0xC8A0, 0xC8A2, 0xC8A3, 0xC8A4, 0xC8A5, 0xC8A6, 0xC8A7,\n    0xC8A9, 0xC8AA, 0xC8AB, 0xC8AC, 0xC8AD, 0xC8AE, 0xC8AF, 0xC8B0,\n    0xC8B1, 0xC8B2, 0xC8B3, 0xC8B4, 0xC8B5, 0xC8B6, 0xC8B7, 0xC8B8,\n    0xC8B9, 0xC8BA, 0xC8BB, 0xC8BE, 0xC8BF, 0xC8C0, 0xC8C1, 0xC8C2,\n    0xC8C3, 0xC8C5, 0xC8C6, 0xC8C7, 0xC8C9, 0xC8CA, 0xC8CB, 0xC8CD,\n    0xC8CE, 0xC8CF, 0xC8D0, 0xC8D1, 0xC8D2, 0xC8D3, 0xC8D6, 0xC8D8,\n    0xC8DA, 0xC8DB, 0xC8DC, 0xC8DD, 0xC8DE, 0xC8DF, 0xC8E2, 0xC8E3,\n    0xC8E5, 0xC8E6, 0xC8E7, 0xC8E8, 0xC8E9, 0xC8EA, 0xC8EB, 0xC8EC,\n    0xC8ED, 0xC8EE, 0xC8EF, 0xC8F0, 0xC8F1, 0xC8F2, 0xC8F3, 0xC8F4,\n    0xC8F6, 0xC8F7, 0xC8F8, 0xC8F9, 0xC8FA, 0xC8FB, 0xC8FE, 0xC8FF,\n    0xC901, 0xC902, 0xC903, 0xC907, 0xC908, 0xC909, 0xC90A, 0xC90B,\n    0xC90E, 0xC910, 0xC912, 0xC913, 0xC914, 0xC915, 0xC916, 0xC917,\n    0xC919, 0xC91A, 0xC91B, 0xC91C, 0xC91D, 0xC91E, 0xC91F, 0xC920,\n    0xC921, 0xC922, 0xC923, 0xC924, 0xC925, 0xC926, 0xC927, 0xC928,\n    0xC929, 0xC92A, 0xC92B, 0xC92D, 0xC92E, 0xC92F, 0xC930, 0xC931,\n    0xC932, 0xC933, 0xC935, 0xC936, 0xC937, 0xC938, 0xC939, 0xC93A,\n    0xC93B, 0xC93C, 0xC93D, 0xC93E, 0xC93F, 0xC940, 0xC941, 0xC942,\n    0xC943, 0xC944, 0xC945, 0xC946, 0xC947, 0xC948, 0xC949, 0xC94A,\n    0xC94B, 0xC94C, 0xC94D, 0xC94E, 0xC94F, 0xC952, 0xC953, 0xC955,\n    0xC956, 0xC957, 0xC959, 0xC95A, 0xC95B, 0xC95C, 0xC95D, 0xC95E,\n    0xC95F, 0xC962, 0xC964, 0xC965, 0xC966, 0xC967, 0xC968, 0xC969,\n    0xC96A, 0xC96B, 0xC96D, 0xC96E, 0xC96F, 0xC971, 0xC972, 0xC973,\n    0xC975, 0xC976, 0xC977, 0xC978, 0xC979, 0xC97A, 0xC97B, 0xC97D,\n    0xC97E, 0xC97F, 0xC980, 0xC981, 0xC982, 0xC983, 0xC984, 0xC985,\n    0xC986, 0xC987, 0xC98A, 0xC98B, 0xC98D, 0xC98E, 0xC98F, 0xC991,\n    0xC992, 0xC993, 0xC994, 0xC995, 0xC996, 0xC997, 0xC99A, 0xC99C,\n    0xC99E, 0xC99F, 0xC9A0, 0xC9A1, 0xC9A2, 0xC9A3, 0xC9A4, 0xC9A5,\n    0xC9A6, 0xC9A7, 0xC9A8, 0xC9A9, 0xC9AA, 0xC9AB, 0xC9AC, 0xC9AD,\n    0xC9AE, 0xC9AF, 0xC9B0, 0xC9B1, 0xC9B2, 0xC9B3, 0xC9B4, 0xC9B5,\n    0xC9B6, 0xC9B7, 0xC9B8, 0xC9B9, 0xC9BA, 0xC9BB, 0xC9BC, 0xC9BD,\n    0xC9BE, 0xC9BF, 0xC9C2, 0xC9C3, 0xC9C5, 0xC9C6, 0xC9C9, 0xC9CB,\n    0xC9CC, 0xC9CD, 0xC9CE, 0xC9CF, 0xC9D2, 0xC9D4, 0xC9D7, 0xC9D8,\n    0xC9DB, 0xC9DE, 0xC9DF, 0xC9E1, 0xC9E3, 0xC9E5, 0xC9E6, 0xC9E8,\n    0xC9E9, 0xC9EA, 0xC9EB, 0xC9EE, 0xC9F2, 0xC9F3, 0xC9F4, 0xC9F5,\n    0xC9F6, 0xC9F7, 0xC9FA, 0xC9FB, 0xC9FD, 0xC9FE, 0xC9FF, 0xCA01,\n    0xCA02, 0xCA03, 0xCA04, 0xCA05, 0xCA06, 0xCA07, 0xCA0A, 0xCA0E,\n    0xCA0F, 0xCA10, 0xCA11, 0xCA12, 0xCA13, 0xCA15, 0xCA16, 0xCA17,\n    0xCA19, 0xCA1A, 0xCA1B, 0xCA1C, 0xCA1D, 0xCA1E, 0xCA1F, 0xCA20,\n    0xCA21, 0xCA22, 0xCA23, 0xCA24, 0xCA25, 0xCA26, 0xCA27, 0xCA28,\n    0xCA2A, 0xCA2B, 0xCA2C, 0xCA2D, 0xCA2E, 0xCA2F, 0xCA30, 0xCA31,\n    0xCA32, 0xCA33, 0xCA34, 0xCA35, 0xCA36, 0xCA37, 0xCA38, 0xCA39,\n    0xCA3A, 0xCA3B, 0xCA3C, 0xCA3D, 0xCA3E, 0xCA3F, 0xCA40, 0xCA41,\n    0xCA42, 0xCA43, 0xCA44, 0xCA45, 0xCA46, 0xCA47, 0xCA48, 0xCA49,\n    0xCA4A, 0xCA4B, 0xCA4E, 0xCA4F, 0xCA51, 0xCA52, 0xCA53, 0xCA55,\n    0xCA56, 0xCA57, 0xCA58, 0xCA59, 0xCA5A, 0xCA5B, 0xCA5E, 0xCA62,\n    0xCA63, 0xCA64, 0xCA65, 0xCA66, 0xCA67, 0xCA69, 0xCA6A, 0xCA6B,\n    0xCA6C, 0xCA6D, 0xCA6E, 0xCA6F, 0xCA70, 0xCA71, 0xCA72, 0xCA73,\n    0xCA74, 0xCA75, 0xCA76, 0xCA77, 0xCA78, 0xCA79, 0xCA7A, 0xCA7B,\n    0xCA7C, 0xCA7E, 0xCA7F, 0xCA80, 0xCA81, 0xCA82, 0xCA83, 0xCA85,\n    0xCA86, 0xCA87, 0xCA88, 0xCA89, 0xCA8A, 0xCA8B, 0xCA8C, 0xCA8D,\n    0xCA8E, 0xCA8F, 0xCA90, 0xCA91, 0xCA92, 0xCA93, 0xCA94, 0xCA95,\n    0xCA96, 0xCA97, 0xCA99, 0xCA9A, 0xCA9B, 0xCA9C, 0xCA9D, 0xCA9E,\n    0xCA9F, 0xCAA0, 0xCAA1, 0xCAA2, 0xCAA3, 0xCAA4, 0xCAA5, 0xCAA6,\n    0xCAA7, 0xCAA8, 0xCAA9, 0xCAAA, 0xCAAB, 0xCAAC, 0xCAAD, 0xCAAE,\n    0xCAAF, 0xCAB0, 0xCAB1, 0xCAB2, 0xCAB3, 0xCAB4, 0xCAB5, 0xCAB6,\n    0xCAB7, 0xCAB8, 0xCAB9, 0xCABA, 0xCABB, 0xCABE, 0xCABF, 0xCAC1,\n    0xCAC2, 0xCAC3, 0xCAC5, 0xCAC6, 0xCAC7, 0xCAC8, 0xCAC9, 0xCACA,\n    0xCACB, 0xCACE, 0xCAD0, 0xCAD2, 0xCAD4, 0xCAD5, 0xCAD6, 0xCAD7,\n    0xCADA, 0xCADB, 0xCADC, 0xCADD, 0xCADE, 0xCADF, 0xCAE1, 0xCAE2,\n    0xCAE3, 0xCAE4, 0xCAE5, 0xCAE6, 0xCAE7, 0xCAE8, 0xCAE9, 0xCAEA,\n    0xCAEB, 0xCAED, 0xCAEE, 0xCAEF, 0xCAF0, 0xCAF1, 0xCAF2, 0xCAF3,\n    0xCAF5, 0xCAF6, 0xCAF7, 0xCAF8, 0xCAF9, 0xCAFA, 0xCAFB, 0xCAFC,\n    0xCAFD, 0xCAFE, 0xCAFF, 0xCB00, 0xCB01, 0xCB02, 0xCB03, 0xCB04,\n    0xCB05, 0xCB06, 0xCB07, 0xCB09, 0xCB0A, 0xCB0B, 0xCB0C, 0xCB0D,\n    0xCB0E, 0xCB0F, 0xCB11, 0xCB12, 0xCB13, 0xCB15, 0xCB16, 0xCB17,\n    0xCB19, 0xCB1A, 0xCB1B, 0xCB1C, 0xCB1D, 0xCB1E, 0xCB1F, 0xCB22,\n    0xCB23, 0xCB24, 0xCB25, 0xCB26, 0xCB27, 0xCB28, 0xCB29, 0xCB2A,\n    0xCB2B, 0xCB2C, 0xCB2D, 0xCB2E, 0xCB2F, 0xCB30, 0xCB31, 0xCB32,\n    0xCB33, 0xCB34, 0xCB35, 0xCB36, 0xCB37, 0xCB38, 0xCB39, 0xCB3A,\n    0xCB3B, 0xCB3C, 0xCB3D, 0xCB3E, 0xCB3F, 0xCB40, 0xCB42, 0xCB43,\n    0xCB44, 0xCB45, 0xCB46, 0xCB47, 0xCB4A, 0xCB4B, 0xCB4D, 0xCB4E,\n    0xCB4F, 0xCB51, 0xCB52, 0xCB53, 0xCB54, 0xCB55, 0xCB56, 0xCB57,\n    0xCB5A, 0xCB5B, 0xCB5C, 0xCB5E, 0xCB5F, 0xCB60, 0xCB61, 0xCB62,\n    0xCB63, 0xCB65, 0xCB66, 0xCB67, 0xCB68, 0xCB69, 0xCB6A, 0xCB6B,\n    0xCB6C, 0xCB6D, 0xCB6E, 0xCB6F, 0xCB70, 0xCB71, 0xCB72, 0xCB73,\n    0xCB74, 0xCB75, 0xCB76, 0xCB77, 0xCB7A, 0xCB7B, 0xCB7C, 0xCB7D,\n    0xCB7E, 0xCB7F, 0xCB80, 0xCB81, 0xCB82, 0xCB83, 0xCB84, 0xCB85,\n    0xCB86, 0xCB87, 0xCB88, 0xCB89, 0xCB8A, 0xCB8B, 0xCB8C, 0xCB8D,\n    0xCB8E, 0xCB8F, 0xCB90, 0xCB91, 0xCB92, 0xCB93, 0xCB94, 0xCB95,\n    0xCB96, 0xCB97, 0xCB98, 0xCB99, 0xCB9A, 0xCB9B, 0xCB9D, 0xCB9E,\n    0xCB9F, 0xCBA0, 0xCBA1, 0xCBA2, 0xCBA3, 0xCBA4, 0xCBA5, 0xCBA6,\n    0xCBA7, 0xCBA8, 0xCBA9, 0xCBAA, 0xCBAB, 0xCBAC, 0xCBAD, 0xCBAE,\n    0xCBAF, 0xCBB0, 0xCBB1, 0xCBB2, 0xCBB3, 0xCBB4, 0xCBB5, 0xCBB6,\n    0xCBB7, 0xCBB9, 0xCBBA, 0xCBBB, 0xCBBC, 0xCBBD, 0xCBBE, 0xCBBF,\n    0xCBC0, 0xCBC1, 0xCBC2, 0xCBC3, 0xCBC4, 0xCBC5, 0xCBC6, 0xCBC7,\n    0xCBC8, 0xCBC9, 0xCBCA, 0xCBCB, 0xCBCC, 0xCBCD, 0xCBCE, 0xCBCF,\n    0xCBD0, 0xCBD1, 0xCBD2, 0xCBD3, 0xCBD5, 0xCBD6, 0xCBD7, 0xCBD8,\n    0xCBD9, 0xCBDA, 0xCBDB, 0xCBDC, 0xCBDD, 0xCBDE, 0xCBDF, 0xCBE0,\n    0xCBE1, 0xCBE2, 0xCBE3, 0xCBE5, 0xCBE6, 0xCBE8, 0xCBEA, 0xCBEB,\n    0xCBEC, 0xCBED, 0xCBEE, 0xCBEF, 0xCBF0, 0xCBF1, 0xCBF2, 0xCBF3,\n    0xCBF4, 0xCBF5, 0xCBF6, 0xCBF7, 0xCBF8, 0xCBF9, 0xCBFA, 0xCBFB,\n    0xCBFC, 0xCBFD, 0xCBFE, 0xCBFF, 0xCC00, 0xCC01, 0xCC02, 0xCC03,\n    0xCC04, 0xCC05, 0xCC06, 0xCC07, 0xCC08, 0xCC09, 0xCC0A, 0xCC0B,\n    0xCC0E, 0xCC0F, 0xCC11, 0xCC12, 0xCC13, 0xCC15, 0xCC16, 0xCC17,\n    0xCC18, 0xCC19, 0xCC1A, 0xCC1B, 0xCC1E, 0xCC1F, 0xCC20, 0xCC23,\n    0xCC24, 0xCC25, 0xCC26, 0xCC2A, 0xCC2B, 0xCC2D, 0xCC2F, 0xCC31,\n    0xCC32, 0xCC33, 0xCC34, 0xCC35, 0xCC36, 0xCC37, 0xCC3A, 0xCC3F,\n    0xCC40, 0xCC41, 0xCC42, 0xCC43, 0xCC46, 0xCC47, 0xCC49, 0xCC4A,\n    0xCC4B, 0xCC4D, 0xCC4E, 0xCC4F, 0xCC50, 0xCC51, 0xCC52, 0xCC53,\n    0xCC56, 0xCC5A, 0xCC5B, 0xCC5C, 0xCC5D, 0xCC5E, 0xCC5F, 0xCC61,\n    0xCC62, 0xCC63, 0xCC65, 0xCC67, 0xCC69, 0xCC6A, 0xCC6B, 0xCC6C,\n    0xCC6D, 0xCC6E, 0xCC6F, 0xCC71, 0xCC72, 0xCC73, 0xCC74, 0xCC76,\n    0xCC77, 0xCC78, 0xCC79, 0xCC7A, 0xCC7B, 0xCC7C, 0xCC7D, 0xCC7E,\n    0xCC7F, 0xCC80, 0xCC81, 0xCC82, 0xCC83, 0xCC84, 0xCC85, 0xCC86,\n    0xCC87, 0xCC88, 0xCC89, 0xCC8A, 0xCC8B, 0xCC8C, 0xCC8D, 0xCC8E,\n    0xCC8F, 0xCC90, 0xCC91, 0xCC92, 0xCC93, 0xCC94, 0xCC95, 0xCC96,\n    0xCC97, 0xCC9A, 0xCC9B, 0xCC9D, 0xCC9E, 0xCC9F, 0xCCA1, 0xCCA2,\n    0xCCA3, 0xCCA4, 0xCCA5, 0xCCA6, 0xCCA7, 0xCCAA, 0xCCAE, 0xCCAF,\n    0xCCB0, 0xCCB1, 0xCCB2, 0xCCB3, 0xCCB6, 0xCCB7, 0xCCB9, 0xCCBA,\n    0xCCBB, 0xCCBD, 0xCCBE, 0xCCBF, 0xCCC0, 0xCCC1, 0xCCC2, 0xCCC3,\n    0xCCC6, 0xCCC8, 0xCCCA, 0xCCCB, 0xCCCC, 0xCCCD, 0xCCCE, 0xCCCF,\n    0xCCD1, 0xCCD2, 0xCCD3, 0xCCD5, 0xCCD6, 0xCCD7, 0xCCD8, 0xCCD9,\n    0xCCDA, 0xCCDB, 0xCCDC, 0xCCDD, 0xCCDE, 0xCCDF, 0xCCE0, 0xCCE1,\n    0xCCE2, 0xCCE3, 0xCCE5, 0xCCE6, 0xCCE7, 0xCCE8, 0xCCE9, 0xCCEA,\n    0xCCEB, 0xCCED, 0xCCEE, 0xCCEF, 0xCCF1, 0xCCF2, 0xCCF3, 0xCCF4,\n    0xCCF5, 0xCCF6, 0xCCF7, 0xCCF8, 0xCCF9, 0xCCFA, 0xCCFB, 0xCCFC,\n    0xCCFD, 0xCCFE, 0xCCFF, 0xCD00, 0xCD02, 0xCD03, 0xCD04, 0xCD05,\n    0xCD06, 0xCD07, 0xCD0A, 0xCD0B, 0xCD0D, 0xCD0E, 0xCD0F, 0xCD11,\n    0xCD12, 0xCD13, 0xCD14, 0xCD15, 0xCD16, 0xCD17, 0xCD1A, 0xCD1C,\n    0xCD1E, 0xCD1F, 0xCD20, 0xCD21, 0xCD22, 0xCD23, 0xCD25, 0xCD26,\n    0xCD27, 0xCD29, 0xCD2A, 0xCD2B, 0xCD2D, 0xCD2E, 0xCD2F, 0xCD30,\n    0xCD31, 0xCD32, 0xCD33, 0xCD34, 0xCD35, 0xCD36, 0xCD37, 0xCD38,\n    0xCD3A, 0xCD3B, 0xCD3C, 0xCD3D, 0xCD3E, 0xCD3F, 0xCD40, 0xCD41,\n    0xCD42, 0xCD43, 0xCD44, 0xCD45, 0xCD46, 0xCD47, 0xCD48, 0xCD49,\n    0xCD4A, 0xCD4B, 0xCD4C, 0xCD4D, 0xCD4E, 0xCD4F, 0xCD50, 0xCD51,\n    0xCD52, 0xCD53, 0xCD54, 0xCD55, 0xCD56, 0xCD57, 0xCD58, 0xCD59,\n    0xCD5A, 0xCD5B, 0xCD5D, 0xCD5E, 0xCD5F, 0xCD61, 0xCD62, 0xCD63,\n    0xCD65, 0xCD66, 0xCD67, 0xCD68, 0xCD69, 0xCD6A, 0xCD6B, 0xCD6E,\n    0xCD70, 0xCD72, 0xCD73, 0xCD74, 0xCD75, 0xCD76, 0xCD77, 0xCD79,\n    0xCD7A, 0xCD7B, 0xCD7C, 0xCD7D, 0xCD7E, 0xCD7F, 0xCD80, 0xCD81,\n    0xCD82, 0xCD83, 0xCD84, 0xCD85, 0xCD86, 0xCD87, 0xCD89, 0xCD8A,\n    0xCD8B, 0xCD8C, 0xCD8D, 0xCD8E, 0xCD8F, 0xCD90, 0xCD91, 0xCD92,\n    0xCD93, 0xCD96, 0xCD97, 0xCD99, 0xCD9A, 0xCD9B, 0xCD9D, 0xCD9E,\n    0xCD9F, 0xCDA0, 0xCDA1, 0xCDA2, 0xCDA3, 0xCDA6, 0xCDA8, 0xCDAA,\n    0xCDAB, 0xCDAC, 0xCDAD, 0xCDAE, 0xCDAF, 0xCDB1, 0xCDB2, 0xCDB3,\n    0xCDB4, 0xCDB5, 0xCDB6, 0xCDB7, 0xCDB8, 0xCDB9, 0xCDBA, 0xCDBB,\n    0xCDBC, 0xCDBD, 0xCDBE, 0xCDBF, 0xCDC0, 0xCDC1, 0xCDC2, 0xCDC3,\n    0xCDC5, 0xCDC6, 0xCDC7, 0xCDC8, 0xCDC9, 0xCDCA, 0xCDCB, 0xCDCD,\n    0xCDCE, 0xCDCF, 0xCDD1, 0xCDD2, 0xCDD3, 0xCDD4, 0xCDD5, 0xCDD6,\n    0xCDD7, 0xCDD8, 0xCDD9, 0xCDDA, 0xCDDB, 0xCDDC, 0xCDDD, 0xCDDE,\n    0xCDDF, 0xCDE0, 0xCDE1, 0xCDE2, 0xCDE3, 0xCDE4, 0xCDE5, 0xCDE6,\n    0xCDE7, 0xCDE9, 0xCDEA, 0xCDEB, 0xCDED, 0xCDEE, 0xCDEF, 0xCDF1,\n    0xCDF2, 0xCDF3, 0xCDF4, 0xCDF5, 0xCDF6, 0xCDF7, 0xCDFA, 0xCDFC,\n    0xCDFE, 0xCDFF, 0xCE00, 0xCE01, 0xCE02, 0xCE03, 0xCE05, 0xCE06,\n    0xCE07, 0xCE09, 0xCE0A, 0xCE0B, 0xCE0D, 0xCE0E, 0xCE0F, 0xCE10,\n    0xCE11, 0xCE12, 0xCE13, 0xCE15, 0xCE16, 0xCE17, 0xCE18, 0xCE1A,\n    0xCE1B, 0xCE1C, 0xCE1D, 0xCE1E, 0xCE1F, 0xCE22, 0xCE23, 0xCE25,\n    0xCE26, 0xCE27, 0xCE29, 0xCE2A, 0xCE2B, 0xCE2C, 0xCE2D, 0xCE2E,\n    0xCE2F, 0xCE32, 0xCE34, 0xCE36, 0xCE37, 0xCE38, 0xCE39, 0xCE3A,\n    0xCE3B, 0xCE3C, 0xCE3D, 0xCE3E, 0xCE3F, 0xCE40, 0xCE41, 0xCE42,\n    0xCE43, 0xCE44, 0xCE45, 0xCE46, 0xCE47, 0xCE48, 0xCE49, 0xCE4A,\n    0xCE4B, 0xCE4C, 0xCE4D, 0xCE4E, 0xCE4F, 0xCE50, 0xCE51, 0xCE52,\n    0xCE53, 0xCE54, 0xCE55, 0xCE56, 0xCE57, 0xCE5A, 0xCE5B, 0xCE5D,\n    0xCE5E, 0xCE62, 0xCE63, 0xCE64, 0xCE65, 0xCE66, 0xCE67, 0xCE6A,\n    0xCE6C, 0xCE6E, 0xCE6F, 0xCE70, 0xCE71, 0xCE72, 0xCE73, 0xCE76,\n    0xCE77, 0xCE79, 0xCE7A, 0xCE7B, 0xCE7D, 0xCE7E, 0xCE7F, 0xCE80,\n    0xCE81, 0xCE82, 0xCE83, 0xCE86, 0xCE88, 0xCE8A, 0xCE8B, 0xCE8C,\n    0xCE8D, 0xCE8E, 0xCE8F, 0xCE92, 0xCE93, 0xCE95, 0xCE96, 0xCE97,\n    0xCE99, 0xCE9A, 0xCE9B, 0xCE9C, 0xCE9D, 0xCE9E, 0xCE9F, 0xCEA2,\n    0xCEA6, 0xCEA7, 0xCEA8, 0xCEA9, 0xCEAA, 0xCEAB, 0xCEAE, 0xCEAF,\n    0xCEB0, 0xCEB1, 0xCEB2, 0xCEB3, 0xCEB4, 0xCEB5, 0xCEB6, 0xCEB7,\n    0xCEB8, 0xCEB9, 0xCEBA, 0xCEBB, 0xCEBC, 0xCEBD, 0xCEBE, 0xCEBF,\n    0xCEC0, 0xCEC2, 0xCEC3, 0xCEC4, 0xCEC5, 0xCEC6, 0xCEC7, 0xCEC8,\n    0xCEC9, 0xCECA, 0xCECB, 0xCECC, 0xCECD, 0xCECE, 0xCECF, 0xCED0,\n    0xCED1, 0xCED2, 0xCED3, 0xCED4, 0xCED5, 0xCED6, 0xCED7, 0xCED8,\n    0xCED9, 0xCEDA, 0xCEDB, 0xCEDC, 0xCEDD, 0xCEDE, 0xCEDF, 0xCEE0,\n    0xCEE1, 0xCEE2, 0xCEE3, 0xCEE6, 0xCEE7, 0xCEE9, 0xCEEA, 0xCEED,\n    0xCEEE, 0xCEEF, 0xCEF0, 0xCEF1, 0xCEF2, 0xCEF3, 0xCEF6, 0xCEFA,\n    0xCEFB, 0xCEFC, 0xCEFD, 0xCEFE, 0xCEFF, 0xCF02, 0xCF03, 0xCF05,\n    0xCF06, 0xCF07, 0xCF09, 0xCF0A, 0xCF0B, 0xCF0C, 0xCF0D, 0xCF0E,\n    0xCF0F, 0xCF12, 0xCF14, 0xCF16, 0xCF17, 0xCF18, 0xCF19, 0xCF1A,\n    0xCF1B, 0xCF1D, 0xCF1E, 0xCF1F, 0xCF21, 0xCF22, 0xCF23, 0xCF25,\n    0xCF26, 0xCF27, 0xCF28, 0xCF29, 0xCF2A, 0xCF2B, 0xCF2E, 0xCF32,\n    0xCF33, 0xCF34, 0xCF35, 0xCF36, 0xCF37, 0xCF39, 0xCF3A, 0xCF3B,\n    0xCF3C, 0xCF3D, 0xCF3E, 0xCF3F, 0xCF40, 0xCF41, 0xCF42, 0xCF43,\n    0xCF44, 0xCF45, 0xCF46, 0xCF47, 0xCF48, 0xCF49, 0xCF4A, 0xCF4B,\n    0xCF4C, 0xCF4D, 0xCF4E, 0xCF4F, 0xCF50, 0xCF51, 0xCF52, 0xCF53,\n    0xCF56, 0xCF57, 0xCF59, 0xCF5A, 0xCF5B, 0xCF5D, 0xCF5E, 0xCF5F,\n    0xCF60, 0xCF61, 0xCF62, 0xCF63, 0xCF66, 0xCF68, 0xCF6A, 0xCF6B,\n    0xCF6C, 0xCF6D, 0xCF6E, 0xCF6F, 0xCF72, 0xCF73, 0xCF75, 0xCF76,\n    0xCF77, 0xCF79, 0xCF7A, 0xCF7B, 0xCF7C, 0xCF7D, 0xCF7E, 0xCF7F,\n    0xCF81, 0xCF82, 0xCF83, 0xCF84, 0xCF86, 0xCF87, 0xCF88, 0xCF89,\n    0xCF8A, 0xCF8B, 0xCF8D, 0xCF8E, 0xCF8F, 0xCF90, 0xCF91, 0xCF92,\n    0xCF93, 0xCF94, 0xCF95, 0xCF96, 0xCF97, 0xCF98, 0xCF99, 0xCF9A,\n    0xCF9B, 0xCF9C, 0xCF9D, 0xCF9E, 0xCF9F, 0xCFA0, 0xCFA2, 0xCFA3,\n    0xCFA4, 0xCFA5, 0xCFA6, 0xCFA7, 0xCFA9, 0xCFAA, 0xCFAB, 0xCFAC,\n    0xCFAD, 0xCFAE, 0xCFAF, 0xCFB1, 0xCFB2, 0xCFB3, 0xCFB4, 0xCFB5,\n    0xCFB6, 0xCFB7, 0xCFB8, 0xCFB9, 0xCFBA, 0xCFBB, 0xCFBC, 0xCFBD,\n    0xCFBE, 0xCFBF, 0xCFC0, 0xCFC1, 0xCFC2, 0xCFC3, 0xCFC5, 0xCFC6,\n    0xCFC7, 0xCFC8, 0xCFC9, 0xCFCA, 0xCFCB, 0xCFCC, 0xCFCD, 0xCFCE,\n    0xCFCF, 0xCFD0, 0xCFD1, 0xCFD2, 0xCFD3, 0xCFD4, 0xCFD5, 0xCFD6,\n    0xCFD7, 0xCFD8, 0xCFD9, 0xCFDA, 0xCFDB, 0xCFDC, 0xCFDD, 0xCFDE,\n    0xCFDF, 0xCFE2, 0xCFE3, 0xCFE5, 0xCFE6, 0xCFE7, 0xCFE9, 0xCFEA,\n    0xCFEB, 0xCFEC, 0xCFED, 0xCFEE, 0xCFEF, 0xCFF2, 0xCFF4, 0xCFF6,\n    0xCFF7, 0xCFF8, 0xCFF9, 0xCFFA, 0xCFFB, 0xCFFD, 0xCFFE, 0xCFFF,\n    0xD001, 0xD002, 0xD003, 0xD005, 0xD006, 0xD007, 0xD008, 0xD009,\n    0xD00A, 0xD00B, 0xD00C, 0xD00D, 0xD00E, 0xD00F, 0xD010, 0xD012,\n    0xD013, 0xD014, 0xD015, 0xD016, 0xD017, 0xD019, 0xD01A, 0xD01B,\n    0xD01C, 0xD01D, 0xD01E, 0xD01F, 0xD020, 0xD021, 0xD022, 0xD023,\n    0xD024, 0xD025, 0xD026, 0xD027, 0xD028, 0xD029, 0xD02A, 0xD02B,\n    0xD02C, 0xD02E, 0xD02F, 0xD030, 0xD031, 0xD032, 0xD033, 0xD036,\n    0xD037, 0xD039, 0xD03A, 0xD03B, 0xD03D, 0xD03E, 0xD03F, 0xD040,\n    0xD041, 0xD042, 0xD043, 0xD046, 0xD048, 0xD04A, 0xD04B, 0xD04C,\n    0xD04D, 0xD04E, 0xD04F, 0xD051, 0xD052, 0xD053, 0xD055, 0xD056,\n    0xD057, 0xD059, 0xD05A, 0xD05B, 0xD05C, 0xD05D, 0xD05E, 0xD05F,\n    0xD061, 0xD062, 0xD063, 0xD064, 0xD065, 0xD066, 0xD067, 0xD068,\n    0xD069, 0xD06A, 0xD06B, 0xD06E, 0xD06F, 0xD071, 0xD072, 0xD073,\n    0xD075, 0xD076, 0xD077, 0xD078, 0xD079, 0xD07A, 0xD07B, 0xD07E,\n    0xD07F, 0xD080, 0xD082, 0xD083, 0xD084, 0xD085, 0xD086, 0xD087,\n    0xD088, 0xD089, 0xD08A, 0xD08B, 0xD08C, 0xD08D, 0xD08E, 0xD08F,\n    0xD090, 0xD091, 0xD092, 0xD093, 0xD094, 0xD095, 0xD096, 0xD097,\n    0xD098, 0xD099, 0xD09A, 0xD09B, 0xD09C, 0xD09D, 0xD09E, 0xD09F,\n    0xD0A0, 0xD0A1, 0xD0A2, 0xD0A3, 0xD0A6, 0xD0A7, 0xD0A9, 0xD0AA,\n    0xD0AB, 0xD0AD, 0xD0AE, 0xD0AF, 0xD0B0, 0xD0B1, 0xD0B2, 0xD0B3,\n    0xD0B6, 0xD0B8, 0xD0BA, 0xD0BB, 0xD0BC, 0xD0BD, 0xD0BE, 0xD0BF,\n    0xD0C2, 0xD0C3, 0xD0C5, 0xD0C6, 0xD0C7, 0xD0CA, 0xD0CB, 0xD0CC,\n    0xD0CD, 0xD0CE, 0xD0CF, 0xD0D2, 0xD0D6, 0xD0D7, 0xD0D8, 0xD0D9,\n    0xD0DA, 0xD0DB, 0xD0DE, 0xD0DF, 0xD0E1, 0xD0E2, 0xD0E3, 0xD0E5,\n    0xD0E6, 0xD0E7, 0xD0E8, 0xD0E9, 0xD0EA, 0xD0EB, 0xD0EE, 0xD0F2,\n    0xD0F3, 0xD0F4, 0xD0F5, 0xD0F6, 0xD0F7, 0xD0F9, 0xD0FA, 0xD0FB,\n    0xD0FC, 0xD0FD, 0xD0FE, 0xD0FF, 0xD100, 0xD101, 0xD102, 0xD103,\n    0xD104, 0xD105, 0xD106, 0xD107, 0xD108, 0xD109, 0xD10A, 0xD10B,\n    0xD10C, 0xD10E, 0xD10F, 0xD110, 0xD111, 0xD112, 0xD113, 0xD114,\n    0xD115, 0xD116, 0xD117, 0xD118, 0xD119, 0xD11A, 0xD11B, 0xD11C,\n    0xD11D, 0xD11E, 0xD11F, 0xD120, 0xD121, 0xD122, 0xD123, 0xD124,\n    0xD125, 0xD126, 0xD127, 0xD128, 0xD129, 0xD12A, 0xD12B, 0xD12C,\n    0xD12D, 0xD12E, 0xD12F, 0xD132, 0xD133, 0xD135, 0xD136, 0xD137,\n    0xD139, 0xD13B, 0xD13C, 0xD13D, 0xD13E, 0xD13F, 0xD142, 0xD146,\n    0xD147, 0xD148, 0xD149, 0xD14A, 0xD14B, 0xD14E, 0xD14F, 0xD151,\n    0xD152, 0xD153, 0xD155, 0xD156, 0xD157, 0xD158, 0xD159, 0xD15A,\n    0xD15B, 0xD15E, 0xD160, 0xD162, 0xD163, 0xD164, 0xD165, 0xD166,\n    0xD167, 0xD169, 0xD16A, 0xD16B, 0xD16D, 0xD16E, 0xD16F, 0xD170,\n    0xD171, 0xD172, 0xD173, 0xD174, 0xD175, 0xD176, 0xD177, 0xD178,\n    0xD179, 0xD17A, 0xD17B, 0xD17D, 0xD17E, 0xD17F, 0xD180, 0xD181,\n    0xD182, 0xD183, 0xD185, 0xD186, 0xD187, 0xD189, 0xD18A, 0xD18B,\n    0xD18C, 0xD18D, 0xD18E, 0xD18F, 0xD190, 0xD191, 0xD192, 0xD193,\n    0xD194, 0xD195, 0xD196, 0xD197, 0xD198, 0xD199, 0xD19A, 0xD19B,\n    0xD19C, 0xD19D, 0xD19E, 0xD19F, 0xD1A2, 0xD1A3, 0xD1A5, 0xD1A6,\n    0xD1A7, 0xD1A9, 0xD1AA, 0xD1AB, 0xD1AC, 0xD1AD, 0xD1AE, 0xD1AF,\n    0xD1B2, 0xD1B4, 0xD1B6, 0xD1B7, 0xD1B8, 0xD1B9, 0xD1BB, 0xD1BD,\n    0xD1BE, 0xD1BF, 0xD1C1, 0xD1C2, 0xD1C3, 0xD1C4, 0xD1C5, 0xD1C6,\n    0xD1C7, 0xD1C8, 0xD1C9, 0xD1CA, 0xD1CB, 0xD1CC, 0xD1CD, 0xD1CE,\n    0xD1CF, 0xD1D0, 0xD1D1, 0xD1D2, 0xD1D3, 0xD1D4, 0xD1D5, 0xD1D6,\n    0xD1D7, 0xD1D9, 0xD1DA, 0xD1DB, 0xD1DC, 0xD1DD, 0xD1DE, 0xD1DF,\n    0xD1E0, 0xD1E1, 0xD1E2, 0xD1E3, 0xD1E4, 0xD1E5, 0xD1E6, 0xD1E7,\n    0xD1E8, 0xD1E9, 0xD1EA, 0xD1EB, 0xD1EC, 0xD1ED, 0xD1EE, 0xD1EF,\n    0xD1F0, 0xD1F1, 0xD1F2, 0xD1F3, 0xD1F5, 0xD1F6, 0xD1F7, 0xD1F9,\n    0xD1FA, 0xD1FB, 0xD1FC, 0xD1FD, 0xD1FE, 0xD1FF, 0xD200, 0xD201,\n    0xD202, 0xD203, 0xD204, 0xD205, 0xD206, 0xD208, 0xD20A, 0xD20B,\n    0xD20C, 0xD20D, 0xD20E, 0xD20F, 0xD211, 0xD212, 0xD213, 0xD214,\n    0xD215, 0xD216, 0xD217, 0xD218, 0xD219, 0xD21A, 0xD21B, 0xD21C,\n    0xD21D, 0xD21E, 0xD21F, 0xD220, 0xD221, 0xD222, 0xD223, 0xD224,\n    0xD225, 0xD226, 0xD227, 0xD228, 0xD229, 0xD22A, 0xD22B, 0xD22E,\n    0xD22F, 0xD231, 0xD232, 0xD233, 0xD235, 0xD236, 0xD237, 0xD238,\n    0xD239, 0xD23A, 0xD23B, 0xD23E, 0xD240, 0xD242, 0xD243, 0xD244,\n    0xD245, 0xD246, 0xD247, 0xD249, 0xD24A, 0xD24B, 0xD24C, 0xD24D,\n    0xD24E, 0xD24F, 0xD250, 0xD251, 0xD252, 0xD253, 0xD254, 0xD255,\n    0xD256, 0xD257, 0xD258, 0xD259, 0xD25A, 0xD25B, 0xD25D, 0xD25E,\n    0xD25F, 0xD260, 0xD261, 0xD262, 0xD263, 0xD265, 0xD266, 0xD267,\n    0xD268, 0xD269, 0xD26A, 0xD26B, 0xD26C, 0xD26D, 0xD26E, 0xD26F,\n    0xD270, 0xD271, 0xD272, 0xD273, 0xD274, 0xD275, 0xD276, 0xD277,\n    0xD278, 0xD279, 0xD27A, 0xD27B, 0xD27C, 0xD27D, 0xD27E, 0xD27F,\n    0xD282, 0xD283, 0xD285, 0xD286, 0xD287, 0xD289, 0xD28A, 0xD28B,\n    0xD28C, 0xD28D, 0xD28E, 0xD28F, 0xD292, 0xD293, 0xD294, 0xD296,\n    0xD297, 0xD298, 0xD299, 0xD29A, 0xD29B, 0xD29D, 0xD29E, 0xD29F,\n    0xD2A1, 0xD2A2, 0xD2A3, 0xD2A5, 0xD2A6, 0xD2A7, 0xD2A8, 0xD2A9,\n    0xD2AA, 0xD2AB, 0xD2AD, 0xD2AE, 0xD2AF, 0xD2B0, 0xD2B2, 0xD2B3,\n    0xD2B4, 0xD2B5, 0xD2B6, 0xD2B7, 0xD2BA, 0xD2BB, 0xD2BD, 0xD2BE,\n    0xD2C1, 0xD2C3, 0xD2C4, 0xD2C5, 0xD2C6, 0xD2C7, 0xD2CA, 0xD2CC,\n    0xD2CD, 0xD2CE, 0xD2CF, 0xD2D0, 0xD2D1, 0xD2D2, 0xD2D3, 0xD2D5,\n    0xD2D6, 0xD2D7, 0xD2D9, 0xD2DA, 0xD2DB, 0xD2DD, 0xD2DE, 0xD2DF,\n    0xD2E0, 0xD2E1, 0xD2E2, 0xD2E3, 0xD2E6, 0xD2E7, 0xD2E8, 0xD2E9,\n    0xD2EA, 0xD2EB, 0xD2EC, 0xD2ED, 0xD2EE, 0xD2EF, 0xD2F2, 0xD2F3,\n    0xD2F5, 0xD2F6, 0xD2F7, 0xD2F9, 0xD2FA, 0xD2FB, 0xD2FC, 0xD2FD,\n    0xD2FE, 0xD2FF, 0xD302, 0xD304, 0xD306, 0xD307, 0xD308, 0xD309,\n    0xD30A, 0xD30B, 0xD30F, 0xD311, 0xD312, 0xD313, 0xD315, 0xD317,\n    0xD318, 0xD319, 0xD31A, 0xD31B, 0xD31E, 0xD322, 0xD323, 0xD324,\n    0xD326, 0xD327, 0xD32A, 0xD32B, 0xD32D, 0xD32E, 0xD32F, 0xD331,\n    0xD332, 0xD333, 0xD334, 0xD335, 0xD336, 0xD337, 0xD33A, 0xD33E,\n    0xD33F, 0xD340, 0xD341, 0xD342, 0xD343, 0xD346, 0xD347, 0xD348,\n    0xD349, 0xD34A, 0xD34B, 0xD34C, 0xD34D, 0xD34E, 0xD34F, 0xD350,\n    0xD351, 0xD352, 0xD353, 0xD354, 0xD355, 0xD356, 0xD357, 0xD358,\n    0xD359, 0xD35A, 0xD35B, 0xD35C, 0xD35D, 0xD35E, 0xD35F, 0xD360,\n    0xD361, 0xD362, 0xD363, 0xD364, 0xD365, 0xD366, 0xD367, 0xD368,\n    0xD369, 0xD36A, 0xD36B, 0xD36C, 0xD36D, 0xD36E, 0xD36F, 0xD370,\n    0xD371, 0xD372, 0xD373, 0xD374, 0xD375, 0xD376, 0xD377, 0xD378,\n    0xD379, 0xD37A, 0xD37B, 0xD37E, 0xD37F, 0xD381, 0xD382, 0xD383,\n    0xD385, 0xD386, 0xD387, 0xD388, 0xD389, 0xD38A, 0xD38B, 0xD38E,\n    0xD392, 0xD393, 0xD394, 0xD395, 0xD396, 0xD397, 0xD39A, 0xD39B,\n    0xD39D, 0xD39E, 0xD39F, 0xD3A1, 0xD3A2, 0xD3A3, 0xD3A4, 0xD3A5,\n    0xD3A6, 0xD3A7, 0xD3AA, 0xD3AC, 0xD3AE, 0xD3AF, 0xD3B0, 0xD3B1,\n    0xD3B2, 0xD3B3, 0xD3B5, 0xD3B6, 0xD3B7, 0xD3B9, 0xD3BA, 0xD3BB,\n    0xD3BD, 0xD3BE, 0xD3BF, 0xD3C0, 0xD3C1, 0xD3C2, 0xD3C3, 0xD3C6,\n    0xD3C7, 0xD3CA, 0xD3CB, 0xD3CC, 0xD3CD, 0xD3CE, 0xD3CF, 0xD3D1,\n    0xD3D2, 0xD3D3, 0xD3D4, 0xD3D5, 0xD3D6, 0xD3D7, 0xD3D9, 0xD3DA,\n    0xD3DB, 0xD3DC, 0xD3DD, 0xD3DE, 0xD3DF, 0xD3E0, 0xD3E2, 0xD3E4,\n    0xD3E5, 0xD3E6, 0xD3E7, 0xD3E8, 0xD3E9, 0xD3EA, 0xD3EB, 0xD3EE,\n    0xD3EF, 0xD3F1, 0xD3F2, 0xD3F3, 0xD3F5, 0xD3F6, 0xD3F7, 0xD3F8,\n    0xD3F9, 0xD3FA, 0xD3FB, 0xD3FE, 0xD400, 0xD402, 0xD403, 0xD404,\n    0xD405, 0xD406, 0xD407, 0xD409, 0xD40A, 0xD40B, 0xD40C, 0xD40D,\n    0xD40E, 0xD40F, 0xD410, 0xD411, 0xD412, 0xD413, 0xD414, 0xD415,\n    0xD416, 0xD417, 0xD418, 0xD419, 0xD41A, 0xD41B, 0xD41C, 0xD41E,\n    0xD41F, 0xD420, 0xD421, 0xD422, 0xD423, 0xD424, 0xD425, 0xD426,\n    0xD427, 0xD428, 0xD429, 0xD42A, 0xD42B, 0xD42C, 0xD42D, 0xD42E,\n    0xD42F, 0xD430, 0xD431, 0xD432, 0xD433, 0xD434, 0xD435, 0xD436,\n    0xD437, 0xD438, 0xD439, 0xD43A, 0xD43B, 0xD43C, 0xD43D, 0xD43E,\n    0xD43F, 0xD441, 0xD442, 0xD443, 0xD445, 0xD446, 0xD447, 0xD448,\n    0xD449, 0xD44A, 0xD44B, 0xD44C, 0xD44D, 0xD44E, 0xD44F, 0xD450,\n    0xD451, 0xD452, 0xD453, 0xD454, 0xD455, 0xD456, 0xD457, 0xD458,\n    0xD459, 0xD45A, 0xD45B, 0xD45D, 0xD45E, 0xD45F, 0xD461, 0xD462,\n    0xD463, 0xD465, 0xD466, 0xD467, 0xD468, 0xD469, 0xD46A, 0xD46B,\n    0xD46C, 0xD46E, 0xD470, 0xD471, 0xD472, 0xD473, 0xD474, 0xD475,\n    0xD476, 0xD477, 0xD47A, 0xD47B, 0xD47D, 0xD47E, 0xD481, 0xD483,\n    0xD484, 0xD485, 0xD486, 0xD487, 0xD48A, 0xD48C, 0xD48E, 0xD48F,\n    0xD490, 0xD491, 0xD492, 0xD493, 0xD495, 0xD496, 0xD497, 0xD498,\n    0xD499, 0xD49A, 0xD49B, 0xD49C, 0xD49D, 0xD49E, 0xD49F, 0xD4A0,\n    0xD4A1, 0xD4A2, 0xD4A3, 0xD4A4, 0xD4A5, 0xD4A6, 0xD4A7, 0xD4A8,\n    0xD4AA, 0xD4AB, 0xD4AC, 0xD4AD, 0xD4AE, 0xD4AF, 0xD4B0, 0xD4B1,\n    0xD4B2, 0xD4B3, 0xD4B4, 0xD4B5, 0xD4B6, 0xD4B7, 0xD4B8, 0xD4B9,\n    0xD4BA, 0xD4BB, 0xD4BC, 0xD4BD, 0xD4BE, 0xD4BF, 0xD4C0, 0xD4C1,\n    0xD4C2, 0xD4C3, 0xD4C4, 0xD4C5, 0xD4C6, 0xD4C7, 0xD4C8, 0xD4C9,\n    0xD4CA, 0xD4CB, 0xD4CD, 0xD4CE, 0xD4CF, 0xD4D1, 0xD4D2, 0xD4D3,\n    0xD4D5, 0xD4D6, 0xD4D7, 0xD4D8, 0xD4D9, 0xD4DA, 0xD4DB, 0xD4DD,\n    0xD4DE, 0xD4E0, 0xD4E1, 0xD4E2, 0xD4E3, 0xD4E4, 0xD4E5, 0xD4E6,\n    0xD4E7, 0xD4E9, 0xD4EA, 0xD4EB, 0xD4ED, 0xD4EE, 0xD4EF, 0xD4F1,\n    0xD4F2, 0xD4F3, 0xD4F4, 0xD4F5, 0xD4F6, 0xD4F7, 0xD4F9, 0xD4FA,\n    0xD4FC, 0xD4FE, 0xD4FF, 0xD500, 0xD501, 0xD502, 0xD503, 0xD505,\n    0xD506, 0xD507, 0xD509, 0xD50A, 0xD50B, 0xD50D, 0xD50E, 0xD50F,\n    0xD510, 0xD511, 0xD512, 0xD513, 0xD516, 0xD518, 0xD519, 0xD51A,\n    0xD51B, 0xD51C, 0xD51D, 0xD51E, 0xD51F, 0xD520, 0xD521, 0xD522,\n    0xD523, 0xD524, 0xD525, 0xD526, 0xD527, 0xD528, 0xD529, 0xD52A,\n    0xD52B, 0xD52C, 0xD52D, 0xD52E, 0xD52F, 0xD530, 0xD531, 0xD532,\n    0xD533, 0xD534, 0xD535, 0xD536, 0xD537, 0xD538, 0xD539, 0xD53A,\n    0xD53B, 0xD53E, 0xD53F, 0xD541, 0xD542, 0xD543, 0xD545, 0xD546,\n    0xD547, 0xD548, 0xD549, 0xD54A, 0xD54B, 0xD54E, 0xD550, 0xD552,\n    0xD553, 0xD554, 0xD555, 0xD556, 0xD557, 0xD55A, 0xD55B, 0xD55D,\n    0xD55E, 0xD55F, 0xD561, 0xD562, 0xD563, 0xD564, 0xD566, 0xD567,\n    0xD56A, 0xD56C, 0xD56E, 0xD56F, 0xD570, 0xD571, 0xD572, 0xD573,\n    0xD576, 0xD577, 0xD579, 0xD57A, 0xD57B, 0xD57D, 0xD57E, 0xD57F,\n    0xD580, 0xD581, 0xD582, 0xD583, 0xD586, 0xD58A, 0xD58B, 0xD58C,\n    0xD58D, 0xD58E, 0xD58F, 0xD591, 0xD592, 0xD593, 0xD594, 0xD595,\n    0xD596, 0xD597, 0xD598, 0xD599, 0xD59A, 0xD59B, 0xD59C, 0xD59D,\n    0xD59E, 0xD59F, 0xD5A0, 0xD5A1, 0xD5A2, 0xD5A3, 0xD5A4, 0xD5A6,\n    0xD5A7, 0xD5A8, 0xD5A9, 0xD5AA, 0xD5AB, 0xD5AC, 0xD5AD, 0xD5AE,\n    0xD5AF, 0xD5B0, 0xD5B1, 0xD5B2, 0xD5B3, 0xD5B4, 0xD5B5, 0xD5B6,\n    0xD5B7, 0xD5B8, 0xD5B9, 0xD5BA, 0xD5BB, 0xD5BC, 0xD5BD, 0xD5BE,\n    0xD5BF, 0xD5C0, 0xD5C1, 0xD5C2, 0xD5C3, 0xD5C4, 0xD5C5, 0xD5C6,\n    0xD5C7, 0xD5CA, 0xD5CB, 0xD5CD, 0xD5CE, 0xD5CF, 0xD5D1, 0xD5D3,\n    0xD5D4, 0xD5D5, 0xD5D6, 0xD5D7, 0xD5DA, 0xD5DC, 0xD5DE, 0xD5DF,\n    0xD5E0, 0xD5E1, 0xD5E2, 0xD5E3, 0xD5E6, 0xD5E7, 0xD5E9, 0xD5EA,\n    0xD5EB, 0xD5ED, 0xD5EE, 0xD5EF, 0xD5F0, 0xD5F1, 0xD5F2, 0xD5F3,\n    0xD5F6, 0xD5F8, 0xD5FA, 0xD5FB, 0xD5FC, 0xD5FD, 0xD5FE, 0xD5FF,\n    0xD602, 0xD603, 0xD605, 0xD606, 0xD607, 0xD609, 0xD60A, 0xD60B,\n    0xD60C, 0xD60D, 0xD60E, 0xD60F, 0xD612, 0xD616, 0xD617, 0xD618,\n    0xD619, 0xD61A, 0xD61B, 0xD61D, 0xD61E, 0xD61F, 0xD621, 0xD622,\n    0xD623, 0xD625, 0xD626, 0xD627, 0xD628, 0xD629, 0xD62A, 0xD62B,\n    0xD62C, 0xD62E, 0xD62F, 0xD630, 0xD631, 0xD632, 0xD633, 0xD634,\n    0xD635, 0xD636, 0xD637, 0xD63A, 0xD63B, 0xD63D, 0xD63E, 0xD63F,\n    0xD641, 0xD642, 0xD643, 0xD644, 0xD646, 0xD647, 0xD64A, 0xD64C,\n    0xD64E, 0xD64F, 0xD650, 0xD652, 0xD653, 0xD656, 0xD657, 0xD659,\n    0xD65A, 0xD65B, 0xD65D, 0xD65E, 0xD65F, 0xD660, 0xD661, 0xD662,\n    0xD663, 0xD664, 0xD665, 0xD666, 0xD668, 0xD66A, 0xD66B, 0xD66C,\n    0xD66D, 0xD66E, 0xD66F, 0xD672, 0xD673, 0xD675, 0xD676, 0xD677,\n    0xD678, 0xD679, 0xD67A, 0xD67B, 0xD67C, 0xD67D, 0xD67E, 0xD67F,\n    0xD680, 0xD681, 0xD682, 0xD684, 0xD686, 0xD687, 0xD688, 0xD689,\n    0xD68A, 0xD68B, 0xD68E, 0xD68F, 0xD691, 0xD692, 0xD693, 0xD695,\n    0xD696, 0xD697, 0xD698, 0xD699, 0xD69A, 0xD69B, 0xD69C, 0xD69E,\n    0xD6A0, 0xD6A2, 0xD6A3, 0xD6A4, 0xD6A5, 0xD6A6, 0xD6A7, 0xD6A9,\n    0xD6AA, 0xD6AB, 0xD6AD, 0xD6AE, 0xD6AF, 0xD6B1, 0xD6B2, 0xD6B3,\n    0xD6B4, 0xD6B5, 0xD6B6, 0xD6B7, 0xD6B8, 0xD6BA, 0xD6BC, 0xD6BD,\n    0xD6BE, 0xD6BF, 0xD6C0, 0xD6C1, 0xD6C2, 0xD6C3, 0xD6C6, 0xD6C7,\n    0xD6C9, 0xD6CA, 0xD6CB, 0xD6CD, 0xD6CE, 0xD6CF, 0xD6D0, 0xD6D2,\n    0xD6D3, 0xD6D5, 0xD6D6, 0xD6D8, 0xD6DA, 0xD6DB, 0xD6DC, 0xD6DD,\n    0xD6DE, 0xD6DF, 0xD6E1, 0xD6E2, 0xD6E3, 0xD6E5, 0xD6E6, 0xD6E7,\n    0xD6E9, 0xD6EA, 0xD6EB, 0xD6EC, 0xD6ED, 0xD6EE, 0xD6EF, 0xD6F1,\n    0xD6F2, 0xD6F3, 0xD6F4, 0xD6F6, 0xD6F7, 0xD6F8, 0xD6F9, 0xD6FA,\n    0xD6FB, 0xD6FE, 0xD6FF, 0xD701, 0xD702, 0xD703, 0xD705, 0xD706,\n    0xD707, 0xD708, 0xD709, 0xD70A, 0xD70B, 0xD70C, 0xD70D, 0xD70E,\n    0xD70F, 0xD710, 0xD712, 0xD713, 0xD714, 0xD715, 0xD716, 0xD717,\n    0xD71A, 0xD71B, 0xD71D, 0xD71E, 0xD71F, 0xD721, 0xD722, 0xD723,\n    0xD724, 0xD725, 0xD726, 0xD727, 0xD72A, 0xD72C, 0xD72E, 0xD72F,\n    0xD730, 0xD731, 0xD732, 0xD733, 0xD736, 0xD737, 0xD739, 0xD73A,\n    0xD73B, 0xD73D, 0xD73E, 0xD73F, 0xD740, 0xD741, 0xD742, 0xD743,\n    0xD745, 0xD746, 0xD748, 0xD74A, 0xD74B, 0xD74C, 0xD74D, 0xD74E,\n    0xD74F, 0xD752, 0xD753, 0xD755, 0xD75A, 0xD75B, 0xD75C, 0xD75D,\n    0xD75E, 0xD75F, 0xD762, 0xD764, 0xD766, 0xD767, 0xD768, 0xD76A,\n    0xD76B, 0xD76D, 0xD76E, 0xD76F, 0xD771, 0xD772, 0xD773, 0xD775,\n    0xD776, 0xD777, 0xD778, 0xD779, 0xD77A, 0xD77B, 0xD77E, 0xD77F,\n    0xD780, 0xD782, 0xD783, 0xD784, 0xD785, 0xD786, 0xD787, 0xD78A,\n    0xD78B, 0xD78D, 0xD78E, 0xD78F, 0xD791, 0xD792, 0xD793, 0xD794,\n    0xD795, 0xD796, 0xD797, 0xD79A, 0xD79C, 0xD79E, 0xD79F, 0xD7A0,\n    0xD7A1, 0xD7A2, 0xD7A3, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024,\n    0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C,\n    0x002D, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034,\n    0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C,\n    0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044,\n    0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C,\n    0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054,\n    0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C,\n    0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064,\n    0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C,\n    0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074,\n    0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C,\n    0x007D, 0x007E, 0x20A9, 0x2010, 0x00A9, 0x2122, 0x22EF, 0x0020,\n    0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028,\n    0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030,\n    0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038,\n    0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040,\n    0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048,\n    0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050,\n    0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058,\n    0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060,\n    0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068,\n    0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070,\n    0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078,\n    0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x203E, 0x007E, 0x005C,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-H_0.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_KSC_EUC_H_0[467 * 3] = {\n    0x0020, 0x007E, 0x1F9E, 0xA1A1, 0xA1FE, 0x0065, 0xA2A1, 0xA2E5, 0x00C3,\n    0xA3A1, 0xA3FE, 0x0108, 0xA4A1, 0xA4D3, 0x0166, 0xA4D5, 0xA4FE, 0x0199,\n    0xA5A1, 0xA5AA, 0x01C3, 0xA5B0, 0xA5B9, 0x01CD, 0xA5C1, 0xA5D8, 0x01D7,\n    0xA5E1, 0xA5F8, 0x01EF, 0xA6A1, 0xA6E4, 0x0207, 0xA7A1, 0xA7EF, 0x024B,\n    0xA8A1, 0xA8A4, 0x029A, 0xA8A6, 0xA8A6, 0x029E, 0xA8A8, 0xA8AF, 0x029F,\n    0xA8B1, 0xA8FE, 0x02A7, 0xA9A1, 0xA9FE, 0x02F5, 0xAAA1, 0xAAF3, 0x0353,\n    0xABA1, 0xABF6, 0x03A6, 0xACA1, 0xACC1, 0x03FC, 0xACD1, 0xACF1, 0x041D,\n    0xB0A1, 0xB0FE, 0x043E, 0xB1A1, 0xB1FE, 0x049C, 0xB2A1, 0xB2FE, 0x04FA,\n    0xB3A1, 0xB3FE, 0x0558, 0xB4A1, 0xB4FE, 0x05B6, 0xB5A1, 0xB5FE, 0x0614,\n    0xB6A1, 0xB6FE, 0x0672, 0xB7A1, 0xB7FE, 0x06D0, 0xB8A1, 0xB8FE, 0x072E,\n    0xB9A1, 0xB9FE, 0x078C, 0xBAA1, 0xBAFE, 0x07EA, 0xBBA1, 0xBBFE, 0x0848,\n    0xBCA1, 0xBCFE, 0x08A6, 0xBDA1, 0xBDFE, 0x0904, 0xBEA1, 0xBEFE, 0x0962,\n    0xBFA1, 0xBFFE, 0x09C0, 0xC0A1, 0xC0FE, 0x0A1E, 0xC1A1, 0xC1FE, 0x0A7C,\n    0xC2A1, 0xC2FE, 0x0ADA, 0xC3A1, 0xC3FE, 0x0B38, 0xC4A1, 0xC4FE, 0x0B96,\n    0xC5A1, 0xC5FE, 0x0BF4, 0xC6A1, 0xC6FE, 0x0C52, 0xC7A1, 0xC7FE, 0x0CB0,\n    0xC8A1, 0xC8FE, 0x0D0E, 0xCAA1, 0xCAFE, 0x0D6C, 0xCBA1, 0xCBCF, 0x0DCA,\n    0xCBD0, 0xCBD0, 0x1014, 0xCBD1, 0xCBD5, 0x0DF9, 0xCBD6, 0xCBD6, 0x0E5E,\n    0xCBD7, 0xCBE6, 0x0DFE, 0xCBE7, 0xCBE7, 0x1B8D, 0xCBE8, 0xCBFE, 0x0E0E,\n    0xCCA1, 0xCCFE, 0x0E25, 0xCDA1, 0xCDCE, 0x0E83, 0xCDCF, 0xCDCF, 0x0D84,\n    0xCDD0, 0xCDE7, 0x0EB1, 0xCDE8, 0xCDE8, 0x1EDC, 0xCDE9, 0xCDFE, 0x0EC9,\n    0xCEA1, 0xCEAC, 0x0EDF, 0xCEAD, 0xCEAD, 0x0EDA, 0xCEAE, 0xCEFE, 0x0EEB,\n    0xCFA1, 0xCFFA, 0x0F3C, 0xCFFB, 0xCFFB, 0x0F3E, 0xCFFC, 0xCFFE, 0x0F96,\n    0xD0A1, 0xD0A1, 0x0F99, 0xD0A2, 0xD0A2, 0x0F6A, 0xD0A3, 0xD0B7, 0x0F9A,\n    0xD0B8, 0xD0B8, 0x0F6A, 0xD0B9, 0xD0CF, 0x0FAF, 0xD0D0, 0xD0D0, 0x0E7C,\n    0xD0D1, 0xD0DC, 0x0FC6, 0xD0DD, 0xD0DD, 0x1023, 0xD0DE, 0xD0FE, 0x0FD2,\n    0xD1A1, 0xD1D3, 0x0FF3, 0xD1D4, 0xD1D4, 0x1116, 0xD1D5, 0xD1D5, 0x103C,\n    0xD1D6, 0xD1D7, 0x1026, 0xD1D8, 0xD1D8, 0x1117, 0xD1D9, 0xD1DA, 0x1028,\n    0xD1DB, 0xD1E0, 0x1118, 0xD1E1, 0xD1E1, 0x102A, 0xD1E2, 0xD1E2, 0x16A8,\n    0xD1E3, 0xD1E5, 0x111E, 0xD1E6, 0xD1E6, 0x1122, 0xD1E7, 0xD1E7, 0x102B,\n    0xD1E8, 0xD1EB, 0x1123, 0xD1EC, 0xD1EC, 0x102C, 0xD1ED, 0xD1ED, 0x1127,\n    0xD1EE, 0xD1EE, 0x102D, 0xD1EF, 0xD1F0, 0x112A, 0xD1F1, 0xD1F1, 0x102E,\n    0xD1F2, 0xD1F2, 0x112C, 0xD1F3, 0xD1F5, 0x102F, 0xD1F6, 0xD1F6, 0x112F,\n    0xD1F7, 0xD1F9, 0x1032, 0xD1FA, 0xD1FA, 0x1133, 0xD1FB, 0xD1FB, 0x1035,\n    0xD1FC, 0xD1FD, 0x1136, 0xD1FE, 0xD1FE, 0x1139, 0xD2A1, 0xD2A1, 0x1036,\n    0xD2A2, 0xD2A3, 0x113A, 0xD2A4, 0xD2A6, 0x1037, 0xD2A7, 0xD2AA, 0x113C,\n    0xD2AB, 0xD2AB, 0x1143, 0xD2AC, 0xD2AC, 0x103A, 0xD2AD, 0xD2AD, 0x1144,\n    0xD2AE, 0xD2B1, 0x103B, 0xD2B2, 0xD2B2, 0x1148, 0xD2B3, 0xD2BD, 0x103F,\n    0xD2BE, 0xD2BE, 0x119F, 0xD2BF, 0xD2C1, 0x104A, 0xD2C2, 0xD2C3, 0x11A1,\n    0xD2C4, 0xD2C4, 0x11A5, 0xD2C5, 0xD2C5, 0x104D, 0xD2C6, 0xD2CA, 0x11A6,\n    0xD2CB, 0xD2CB, 0x11AC, 0xD2CC, 0xD2CC, 0x104E, 0xD2CD, 0xD2CE, 0x11AD,\n    0xD2CF, 0xD2D4, 0x11B0, 0xD2D5, 0xD2D7, 0x11B7, 0xD2D8, 0xD2D8, 0x104F,\n    0xD2D9, 0xD2DA, 0x11BD, 0xD2DB, 0xD2DD, 0x1050, 0xD2DE, 0xD2DF, 0x11C1,\n    0xD2E0, 0xD2E0, 0x1053, 0xD2E1, 0xD2E1, 0x11C3, 0xD2E2, 0xD2E2, 0x11C6,\n    0xD2E3, 0xD2E3, 0x1054, 0xD2E4, 0xD2E4, 0x11D4, 0xD2E5, 0xD2E8, 0x11D6,\n    0xD2E9, 0xD2EA, 0x11DB, 0xD2EB, 0xD2EB, 0x11E0, 0xD2EC, 0xD2EF, 0x1055,\n    0xD2F0, 0xD2F3, 0x11FC, 0xD2F4, 0xD2F5, 0x1201, 0xD2F6, 0xD2F6, 0x1059,\n    0xD2F7, 0xD2F8, 0x1203, 0xD2F9, 0xD2FE, 0x105A, 0xD3A1, 0xD3FE, 0x1060,\n    0xD4A1, 0xD4E5, 0x10BE, 0xD4E6, 0xD4E6, 0x10DE, 0xD4E7, 0xD4FB, 0x1103,\n    0xD4FC, 0xD4FC, 0x1028, 0xD4FD, 0xD4FE, 0x1118, 0xD5A1, 0xD5A4, 0x111A,\n    0xD5A5, 0xD5A5, 0x16A8, 0xD5A6, 0xD5AA, 0x111E, 0xD5AB, 0xD5AB, 0x102B,\n    0xD5AC, 0xD5AD, 0x1123, 0xD5AE, 0xD5AE, 0x1060, 0xD5AF, 0xD5FE, 0x1125,\n    0xD6A1, 0xD6B7, 0x1175, 0xD6B8, 0xD6B8, 0x1047, 0xD6B9, 0xD6CC, 0x118C,\n    0xD6CD, 0xD6CD, 0x104C, 0xD6CE, 0xD6FE, 0x11A0, 0xD7A1, 0xD7CA, 0x11D1,\n    0xD7CB, 0xD7CB, 0x15B0, 0xD7CC, 0xD7E3, 0x11FB, 0xD7E4, 0xD7E4, 0x1918,\n    0xD7E5, 0xD7FE, 0x1213, 0xD8A1, 0xD8FE, 0x122D, 0xD9A1, 0xD9FE, 0x128B,\n    0xDAA1, 0xDAFE, 0x12E9, 0xDBA1, 0xDBC4, 0x1347, 0xDBC5, 0xDBC5, 0x141F,\n    0xDBC6, 0xDBE3, 0x136B, 0xDBE4, 0xDBE4, 0x133A, 0xDBE5, 0xDBFE, 0x1389,\n    0xDCA1, 0xDCA4, 0x13A3, 0xDCA5, 0xDCA5, 0x1D5E, 0xDCA6, 0xDCFE, 0x13A7,\n    0xDDA1, 0xDDA4, 0x1400, 0xDDA5, 0xDDA5, 0x13D7, 0xDDA6, 0xDDD4, 0x1404,\n    0xDDD5, 0xDDD5, 0x13F5, 0xDDD6, 0xDDF3, 0x1433, 0xDDF4, 0xDDF4, 0x1DB7,\n    0xDDF5, 0xDDFE, 0x1451, 0xDEA1, 0xDEFB, 0x145B, 0xDEFC, 0xDEFC, 0x15D0,\n    0xDEFD, 0xDEFD, 0x14B6, 0xDEFE, 0xDEFE, 0x14F7, 0xDFA1, 0xDFB2, 0x14B7,\n    0xDFB3, 0xDFB3, 0x1BAB, 0xDFB4, 0xDFE0, 0x14C9, 0xDFE1, 0xDFE1, 0x14F2,\n    0xDFE2, 0xDFE7, 0x14F6, 0xDFE8, 0xDFE8, 0x156D, 0xDFE9, 0xDFFE, 0x14FC,\n    0xE0A1, 0xE0F0, 0x1512, 0xE0F1, 0xE0F1, 0x1771, 0xE0F2, 0xE0FE, 0x1562,\n    0xE1A1, 0xE1AC, 0x156F, 0xE1AD, 0xE1AD, 0x1554, 0xE1AE, 0xE1EC, 0x157B,\n    0xE1ED, 0xE1ED, 0x14C5, 0xE1EE, 0xE1FE, 0x15BA, 0xE2A1, 0xE2FE, 0x15CB,\n    0xE3A1, 0xE3F4, 0x1629, 0xE3F5, 0xE3F5, 0x1B61, 0xE3F6, 0xE3FE, 0x167D,\n    0xE4A1, 0xE4A1, 0x1CCA, 0xE4A2, 0xE4A8, 0x1686, 0xE4A9, 0xE4A9, 0x162E,\n    0xE4AA, 0xE4FE, 0x168D, 0xE5A1, 0xE5AD, 0x16E2, 0xE5AE, 0xE5AE, 0x16F2,\n    0xE5AF, 0xE5B0, 0x16EF, 0xE5B1, 0xE5B2, 0x1149, 0xE5B3, 0xE5B8, 0x16F1,\n    0xE5B9, 0xE5B9, 0x114B, 0xE5BA, 0xE5BA, 0x16F7, 0xE5BB, 0xE5BC, 0x114D,\n    0xE5BD, 0xE5C3, 0x16F8, 0xE5C4, 0xE5C4, 0x114F, 0xE5C5, 0xE5CD, 0x16FF,\n    0xE5CE, 0xE5CE, 0x1153, 0xE5CF, 0xE5CF, 0x1708, 0xE5D0, 0xE5D0, 0x1154,\n    0xE5D1, 0xE5D1, 0x1709, 0xE5D2, 0xE5D2, 0x1155, 0xE5D3, 0xE5D5, 0x170A,\n    0xE5D6, 0xE5D6, 0x1157, 0xE5D7, 0xE5F9, 0x170D, 0xE5FA, 0xE5FB, 0x115A,\n    0xE5FC, 0xE5FC, 0x103F, 0xE5FD, 0xE5FD, 0x1730, 0xE5FE, 0xE5FE, 0x115C,\n    0xE6A1, 0xE6A1, 0x115F, 0xE6A2, 0xE6A3, 0x1731, 0xE6A4, 0xE6A4, 0x1161,\n    0xE6A5, 0xE6A6, 0x1733, 0xE6A7, 0xE6A7, 0x1162, 0xE6A8, 0xE6AC, 0x1735,\n    0xE6AD, 0xE6AD, 0x1165, 0xE6AE, 0xE6AE, 0x173A, 0xE6AF, 0xE6B1, 0x1167,\n    0xE6B2, 0xE6B2, 0x173B, 0xE6B3, 0xE6B3, 0x116A, 0xE6B4, 0xE6B6, 0x173C,\n    0xE6B7, 0xE6B8, 0x116B, 0xE6B9, 0xE6BB, 0x173F, 0xE6BC, 0xE6BC, 0x116F,\n    0xE6BD, 0xE6C3, 0x1742, 0xE6C4, 0xE6C4, 0x1040, 0xE6C5, 0xE6C5, 0x1749,\n    0xE6C6, 0xE6C7, 0x1171, 0xE6C8, 0xE6C9, 0x174A, 0xE6CA, 0xE6CA, 0x1041,\n    0xE6CB, 0xE6D1, 0x174C, 0xE6D2, 0xE6D2, 0x1174, 0xE6D3, 0xE6D5, 0x1753,\n    0xE6D6, 0xE6D6, 0x1175, 0xE6D7, 0xE6D8, 0x1756, 0xE6D9, 0xE6D9, 0x1176,\n    0xE6DA, 0xE6DB, 0x1758, 0xE6DC, 0xE6DC, 0x1042, 0xE6DD, 0xE6DE, 0x175A,\n    0xE6DF, 0xE6DF, 0x1177, 0xE6E0, 0xE6E0, 0x175C, 0xE6E1, 0xE6E1, 0x1178,\n    0xE6E2, 0xE6E3, 0x175D, 0xE6E4, 0xE6E4, 0x117A, 0xE6E5, 0xE6E5, 0x1179,\n    0xE6E6, 0xE6E6, 0x117B, 0xE6E7, 0xE6E7, 0x175F, 0xE6E8, 0xE6E8, 0x117C,\n    0xE6E9, 0xE6E9, 0x1760, 0xE6EA, 0xE6EB, 0x117E, 0xE6EC, 0xE6EC, 0x192F,\n    0xE6ED, 0xE6EE, 0x1761, 0xE6EF, 0xE6EF, 0x1181, 0xE6F0, 0xE6F0, 0x1763,\n    0xE6F1, 0xE6F1, 0x1182, 0xE6F2, 0xE6F2, 0x1554, 0xE6F3, 0xE6F4, 0x1764,\n    0xE6F5, 0xE6F5, 0x1183, 0xE6F6, 0xE6F6, 0x1043, 0xE6F7, 0xE6F7, 0x1046,\n    0xE6F8, 0xE6F8, 0x1766, 0xE6F9, 0xE6F9, 0x1185, 0xE6FA, 0xE6FE, 0x1767,\n    0xE7A1, 0xE7A1, 0x1187, 0xE7A2, 0xE7A5, 0x176C, 0xE7A6, 0xE7A6, 0x1188,\n    0xE7A7, 0xE7A8, 0x1770, 0xE7A9, 0xE7A9, 0x1189, 0xE7AA, 0xE7AA, 0x118B,\n    0xE7AB, 0xE7AB, 0x1772, 0xE7AC, 0xE7AC, 0x1047, 0xE7AD, 0xE7AD, 0x118D,\n    0xE7AE, 0xE7AF, 0x1773, 0xE7B0, 0xE7B0, 0x118E, 0xE7B1, 0xE7BE, 0x1775,\n    0xE7BF, 0xE7BF, 0x118F, 0xE7C0, 0xE7C0, 0x1783, 0xE7C1, 0xE7C1, 0x1E67,\n    0xE7C2, 0xE7C5, 0x1784, 0xE7C6, 0xE7C6, 0x1191, 0xE7C7, 0xE7C7, 0x1193,\n    0xE7C8, 0xE7CA, 0x1788, 0xE7CB, 0xE7CB, 0x1195, 0xE7CC, 0xE7CC, 0x178B,\n    0xE7CD, 0xE7CD, 0x1196, 0xE7CE, 0xE7CE, 0x178C, 0xE7CF, 0xE7D0, 0x1197,\n    0xE7D1, 0xE7D2, 0x178D, 0xE7D3, 0xE7D3, 0x119A, 0xE7D4, 0xE7DE, 0x178F,\n    0xE7DF, 0xE7DF, 0x119C, 0xE7E0, 0xE7E3, 0x179A, 0xE7E4, 0xE7E4, 0x119D,\n    0xE7E5, 0xE7E5, 0x179E, 0xE7E6, 0xE7E6, 0x119E, 0xE7E7, 0xE7F6, 0x179F,\n    0xE7F7, 0xE7F7, 0x16A5, 0xE7F8, 0xE7FE, 0x17AF, 0xE8A1, 0xE8E6, 0x17B6,\n    0xE8E7, 0xE8E8, 0x11C7, 0xE8E9, 0xE8EF, 0x17FC, 0xE8F0, 0xE8F0, 0x11C9,\n    0xE8F1, 0xE8F1, 0x1054, 0xE8F2, 0xE8F6, 0x1803, 0xE8F7, 0xE8F7, 0x11CB,\n    0xE8F8, 0xE8F8, 0x1808, 0xE8F9, 0xE8F9, 0x16A8, 0xE8FA, 0xE8FA, 0x1809,\n    0xE8FB, 0xE8FB, 0x11CC, 0xE8FC, 0xE8FD, 0x180A, 0xE8FE, 0xE8FE, 0x11CD,\n    0xE9A1, 0xE9A6, 0x180C, 0xE9A7, 0xE9A7, 0x11D0, 0xE9A8, 0xE9AB, 0x1812,\n    0xE9AC, 0xE9AC, 0x11D1, 0xE9AD, 0xE9CB, 0x1816, 0xE9CC, 0xE9CC, 0x11D3,\n    0xE9CD, 0xE9F6, 0x1835, 0xE9F7, 0xE9F7, 0x1F34, 0xE9F8, 0xE9FE, 0x185F,\n    0xEAA1, 0xEAC0, 0x1866, 0xEAC1, 0xEAC1, 0x17EB, 0xEAC2, 0xEAE4, 0x1886,\n    0xEAE5, 0xEAE5, 0x11E1, 0xEAE6, 0xEAF3, 0x18A9, 0xEAF4, 0xEAF4, 0x1057,\n    0xEAF5, 0xEAF6, 0x18B7, 0xEAF7, 0xEAF7, 0x11E3, 0xEAF8, 0xEAFB, 0x18B9,\n    0xEAFC, 0xEAFC, 0x11E5, 0xEAFD, 0xEAFD, 0x18BD, 0xEAFE, 0xEAFE, 0x11E6,\n    0xEBA1, 0xEBA3, 0x18BE, 0xEBA4, 0xEBA4, 0x11E8, 0xEBA5, 0xEBA6, 0x18C1,\n    0xEBA7, 0xEBA7, 0x11EA, 0xEBA8, 0xEBA8, 0x18C3, 0xEBA9, 0xEBA9, 0x11EC,\n    0xEBAA, 0xEBAA, 0x1058, 0xEBAB, 0xEBB9, 0x18C4, 0xEBBA, 0xEBBB, 0x11EE,\n    0xEBBC, 0xEBBC, 0x18D3, 0xEBBD, 0xEBBD, 0x11F0, 0xEBBE, 0xEBC0, 0x18D4,\n    0xEBC1, 0xEBC1, 0x11F1, 0xEBC2, 0xEBC2, 0x11F3, 0xEBC3, 0xEBC5, 0x18D7,\n    0xEBC6, 0xEBC7, 0x11F4, 0xEBC8, 0xEBCB, 0x18DA, 0xEBCC, 0xEBCC, 0x11F7,\n    0xEBCD, 0xEBCE, 0x18DE, 0xEBCF, 0xEBD1, 0x11F8, 0xEBD2, 0xEBD2, 0x15B0,\n    0xEBD3, 0xEBD7, 0x18E0, 0xEBD8, 0xEBD8, 0x11FB, 0xEBD9, 0xEBFE, 0x18E5,\n    0xECA1, 0xECA5, 0x190B, 0xECA6, 0xECA6, 0x1206, 0xECA7, 0xECA7, 0x1208,\n    0xECA8, 0xECA9, 0x1910, 0xECAA, 0xECAA, 0x120A, 0xECAB, 0xECAE, 0x1912,\n    0xECAF, 0xECAF, 0x173E, 0xECB0, 0xECB1, 0x120C, 0xECB2, 0xECB2, 0x105B,\n    0xECB3, 0xECB4, 0x1916, 0xECB5, 0xECB5, 0x1211, 0xECB6, 0xECB7, 0x1918,\n    0xECB8, 0xECB8, 0x1213, 0xECB9, 0xECB9, 0x191A, 0xECBA, 0xECBA, 0x1215,\n    0xECBB, 0xECBF, 0x191B, 0xECC0, 0xECC1, 0x1218, 0xECC2, 0xECC4, 0x1920,\n    0xECC5, 0xECC5, 0x121A, 0xECC6, 0xECC6, 0x121C, 0xECC7, 0xECC8, 0x1923,\n    0xECC9, 0xECCA, 0x105C, 0xECCB, 0xECD4, 0x1925, 0xECD5, 0xECD5, 0x121E,\n    0xECD6, 0xECDC, 0x192F, 0xECDD, 0xECDE, 0x1220, 0xECDF, 0xECE0, 0x1936,\n    0xECE1, 0xECE1, 0x1222, 0xECE2, 0xECE3, 0x1938, 0xECE4, 0xECE4, 0x1224,\n    0xECE5, 0xECE6, 0x193A, 0xECE7, 0xECE8, 0x1225, 0xECE9, 0xECF6, 0x193C,\n    0xECF7, 0xECF8, 0x1227, 0xECF9, 0xECF9, 0x194A, 0xECFA, 0xECFA, 0x122A,\n    0xECFB, 0xECFE, 0x194B, 0xEDA1, 0xEDA3, 0x122D, 0xEDA4, 0xEDED, 0x194F,\n    0xEDEE, 0xEDEE, 0x14E7, 0xEDEF, 0xEDFE, 0x1999, 0xEEA1, 0xEEDA, 0x19A9,\n    0xEEDB, 0xEEDB, 0x195E, 0xEEDC, 0xEEFE, 0x19E3, 0xEFA1, 0xEFFE, 0x1A06,\n    0xF0A1, 0xF0FE, 0x1A64, 0xF1A1, 0xF1FE, 0x1AC2, 0xF2A1, 0xF2BC, 0x1B20,\n    0xF2BD, 0xF2BD, 0x1663, 0xF2BE, 0xF2F9, 0x1B3C, 0xF2FA, 0xF2FA, 0x168B,\n    0xF2FB, 0xF2FE, 0x1B78, 0xF3A1, 0xF3B0, 0x1B7C, 0xF3B1, 0xF3B1, 0x105F,\n    0xF3B2, 0xF3FE, 0x1B8C, 0xF4A1, 0xF4A6, 0x1BD9, 0xF4A7, 0xF4A7, 0x1954,\n    0xF4A8, 0xF4ED, 0x1BDF, 0xF4EE, 0xF4EE, 0x1A1C, 0xF4EF, 0xF4FE, 0x1C25,\n    0xF5A1, 0xF5FE, 0x1C35, 0xF6A1, 0xF6F3, 0x1C93, 0xF6F4, 0xF6F4, 0x10B7,\n    0xF6F5, 0xF6F5, 0x1CE6, 0xF6F6, 0xF6F6, 0x1BE3, 0xF6F7, 0xF6FE, 0x1CE7,\n    0xF7A1, 0xF7B7, 0x1CEF, 0xF7B8, 0xF7B8, 0x1097, 0xF7B9, 0xF7C7, 0x1D06,\n    0xF7C8, 0xF7C8, 0x10AA, 0xF7C9, 0xF7D2, 0x1D15, 0xF7D3, 0xF7D3, 0x10F4,\n    0xF7D4, 0xF7FE, 0x1D1F, 0xF8A1, 0xF8DA, 0x1D4A, 0xF8DB, 0xF8DB, 0x1D94,\n    0xF8DC, 0xF8EF, 0x1D84, 0xF8F0, 0xF8F0, 0x13E0, 0xF8F1, 0xF8FE, 0x1D98,\n    0xF9A1, 0xF9FE, 0x1DA6, 0xFAA1, 0xFAA1, 0x1E1D, 0xFAA2, 0xFAA2, 0x0DE6,\n    0xFAA3, 0xFAE5, 0x1E04, 0xFAE6, 0xFAE6, 0x0E3C, 0xFAE7, 0xFAFE, 0x1E47,\n    0xFBA1, 0xFBFE, 0x1E5F, 0xFCA1, 0xFCA8, 0x1EBD, 0xFCA9, 0xFCA9, 0x0EE7,\n    0xFCAA, 0xFCFE, 0x1EC5, 0xFDA1, 0xFDFE, 0x1F1A,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-V_0.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_KSC_EUC_V_0[16 * 3] = {\n    0xA1A2, 0xA1A3, 0x1F78, 0xA1A5, 0xA1A5, 0x1F7A, 0xA1A6, 0xA1A6, 0x2080,\n    0xA1A9, 0xA1AB, 0x1F7B, 0xA1AD, 0xA1AD, 0x1F7E, 0xA1B2, 0xA1BD, 0x1F7F,\n    0xA1EB, 0xA1EB, 0x1F8B, 0xA3A1, 0xA3A1, 0x1F8C, 0xA3A8, 0xA3A9, 0x1F8D,\n    0xA3AC, 0xA3AC, 0x1F8F, 0xA3AE, 0xA3AE, 0x1F90, 0xA3BA, 0xA3BF, 0x1F91,\n    0xA3DB, 0xA3DB, 0x1F97, 0xA3DD, 0xA3DD, 0x1F98, 0xA3DF, 0xA3DF, 0x1F99,\n    0xA3FB, 0xA3FE, 0x1F9A,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-H_1.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_KSCms_UHC_HW_H_1[675 * 3] = {\n    0x0020, 0x007E, 0x1F9E, 0x8141, 0x815A, 0x2475, 0x8161, 0x817A, 0x248F,\n    0x8181, 0x81FE, 0x24A9, 0x8241, 0x825A, 0x2527, 0x8261, 0x827A, 0x2541,\n    0x8281, 0x82FE, 0x255B, 0x8341, 0x835A, 0x25D9, 0x8361, 0x837A, 0x25F3,\n    0x8381, 0x83FE, 0x260D, 0x8441, 0x845A, 0x268B, 0x8461, 0x847A, 0x26A5,\n    0x8481, 0x84FE, 0x26BF, 0x8541, 0x855A, 0x273D, 0x8561, 0x857A, 0x2757,\n    0x8581, 0x85FE, 0x2771, 0x8641, 0x865A, 0x27EF, 0x8661, 0x867A, 0x2809,\n    0x8681, 0x86FE, 0x2823, 0x8741, 0x875A, 0x28A1, 0x8761, 0x877A, 0x28BB,\n    0x8781, 0x87FE, 0x28D5, 0x8841, 0x885A, 0x2953, 0x8861, 0x887A, 0x296D,\n    0x8881, 0x88FE, 0x2987, 0x8941, 0x895A, 0x2A05, 0x8961, 0x897A, 0x2A1F,\n    0x8981, 0x89FE, 0x2A39, 0x8A41, 0x8A5A, 0x2AB7, 0x8A61, 0x8A7A, 0x2AD1,\n    0x8A81, 0x8AFE, 0x2AEB, 0x8B41, 0x8B5A, 0x2B69, 0x8B61, 0x8B7A, 0x2B83,\n    0x8B81, 0x8BFE, 0x2B9D, 0x8C41, 0x8C5A, 0x2C1B, 0x8C61, 0x8C7A, 0x2C35,\n    0x8C81, 0x8CFE, 0x2C4F, 0x8D41, 0x8D5A, 0x2CCD, 0x8D61, 0x8D7A, 0x2CE7,\n    0x8D81, 0x8DFE, 0x2D01, 0x8E41, 0x8E5A, 0x2D7F, 0x8E61, 0x8E7A, 0x2D99,\n    0x8E81, 0x8EFE, 0x2DB3, 0x8F41, 0x8F5A, 0x2E31, 0x8F61, 0x8F7A, 0x2E4B,\n    0x8F81, 0x8FFE, 0x2E65, 0x9041, 0x905A, 0x2EE3, 0x9061, 0x907A, 0x2EFD,\n    0x9081, 0x90FE, 0x2F17, 0x9141, 0x915A, 0x2F95, 0x9161, 0x917A, 0x2FAF,\n    0x9181, 0x91FE, 0x2FC9, 0x9241, 0x925A, 0x3047, 0x9261, 0x927A, 0x3061,\n    0x9281, 0x92FE, 0x307B, 0x9341, 0x935A, 0x30F9, 0x9361, 0x937A, 0x3113,\n    0x9381, 0x93FE, 0x312D, 0x9441, 0x945A, 0x31AB, 0x9461, 0x947A, 0x31C5,\n    0x9481, 0x94FE, 0x31DF, 0x9541, 0x955A, 0x325D, 0x9561, 0x957A, 0x3277,\n    0x9581, 0x95FE, 0x3291, 0x9641, 0x965A, 0x330F, 0x9661, 0x967A, 0x3329,\n    0x9681, 0x96FE, 0x3343, 0x9741, 0x975A, 0x33C1, 0x9761, 0x977A, 0x33DB,\n    0x9781, 0x97FE, 0x33F5, 0x9841, 0x985A, 0x3473, 0x9861, 0x987A, 0x348D,\n    0x9881, 0x98FE, 0x34A7, 0x9941, 0x995A, 0x3525, 0x9961, 0x997A, 0x353F,\n    0x9981, 0x99FE, 0x3559, 0x9A41, 0x9A5A, 0x35D7, 0x9A61, 0x9A7A, 0x35F1,\n    0x9A81, 0x9AFE, 0x360B, 0x9B41, 0x9B5A, 0x3689, 0x9B61, 0x9B7A, 0x36A3,\n    0x9B81, 0x9BFE, 0x36BD, 0x9C41, 0x9C5A, 0x373B, 0x9C61, 0x9C7A, 0x3755,\n    0x9C81, 0x9CFE, 0x376F, 0x9D41, 0x9D5A, 0x37ED, 0x9D61, 0x9D7A, 0x3807,\n    0x9D81, 0x9DFE, 0x3821, 0x9E41, 0x9E5A, 0x389F, 0x9E61, 0x9E7A, 0x38B9,\n    0x9E81, 0x9EFE, 0x38D3, 0x9F41, 0x9F5A, 0x3951, 0x9F61, 0x9F7A, 0x396B,\n    0x9F81, 0x9FFE, 0x3985, 0xA041, 0xA05A, 0x3A03, 0xA061, 0xA07A, 0x3A1D,\n    0xA081, 0xA0FE, 0x3A37, 0xA141, 0xA15A, 0x3AB5, 0xA161, 0xA17A, 0x3ACF,\n    0xA181, 0xA1A0, 0x3AE9, 0xA1A1, 0xA1FE, 0x0065, 0xA241, 0xA25A, 0x3B09,\n    0xA261, 0xA27A, 0x3B23, 0xA281, 0xA2A0, 0x3B3D, 0xA2A1, 0xA2E5, 0x00C3,\n    0xA341, 0xA35A, 0x3B5D, 0xA361, 0xA37A, 0x3B77, 0xA381, 0xA3A0, 0x3B91,\n    0xA3A1, 0xA3FE, 0x0108, 0xA441, 0xA45A, 0x3BB1, 0xA461, 0xA47A, 0x3BCB,\n    0xA481, 0xA4A0, 0x3BE5, 0xA4A1, 0xA4D3, 0x0166, 0xA4D5, 0xA4FE, 0x0199,\n    0xA541, 0xA55A, 0x3C05, 0xA561, 0xA57A, 0x3C1F, 0xA581, 0xA5A0, 0x3C39,\n    0xA5A1, 0xA5AA, 0x01C3, 0xA5B0, 0xA5B9, 0x01CD, 0xA5C1, 0xA5D8, 0x01D7,\n    0xA5E1, 0xA5F8, 0x01EF, 0xA641, 0xA65A, 0x3C59, 0xA661, 0xA67A, 0x3C73,\n    0xA681, 0xA6A0, 0x3C8D, 0xA6A1, 0xA6E4, 0x0207, 0xA741, 0xA75A, 0x3CAD,\n    0xA761, 0xA77A, 0x3CC7, 0xA781, 0xA7A0, 0x3CE1, 0xA7A1, 0xA7EF, 0x024B,\n    0xA841, 0xA85A, 0x3D01, 0xA861, 0xA87A, 0x3D1B, 0xA881, 0xA8A0, 0x3D35,\n    0xA8A1, 0xA8A4, 0x029A, 0xA8A6, 0xA8A6, 0x029E, 0xA8A8, 0xA8AF, 0x029F,\n    0xA8B1, 0xA8FE, 0x02A7, 0xA941, 0xA95A, 0x3D55, 0xA961, 0xA97A, 0x3D6F,\n    0xA981, 0xA9A0, 0x3D89, 0xA9A1, 0xA9FE, 0x02F5, 0xAA41, 0xAA5A, 0x3DA9,\n    0xAA61, 0xAA7A, 0x3DC3, 0xAA81, 0xAAA0, 0x3DDD, 0xAAA1, 0xAAF3, 0x0353,\n    0xAB41, 0xAB5A, 0x3DFD, 0xAB61, 0xAB7A, 0x3E17, 0xAB81, 0xABA0, 0x3E31,\n    0xABA1, 0xABF6, 0x03A6, 0xAC41, 0xAC5A, 0x3E51, 0xAC61, 0xAC7A, 0x3E6B,\n    0xAC81, 0xACA0, 0x3E85, 0xACA1, 0xACC1, 0x03FC, 0xACD1, 0xACF1, 0x041D,\n    0xAD41, 0xAD5A, 0x3EA5, 0xAD61, 0xAD7A, 0x3EBF, 0xAD81, 0xADA0, 0x3ED9,\n    0xAE41, 0xAE5A, 0x3EF9, 0xAE61, 0xAE7A, 0x3F13, 0xAE81, 0xAEA0, 0x3F2D,\n    0xAF41, 0xAF5A, 0x3F4D, 0xAF61, 0xAF7A, 0x3F67, 0xAF81, 0xAFA0, 0x3F81,\n    0xB041, 0xB05A, 0x3FA1, 0xB061, 0xB07A, 0x3FBB, 0xB081, 0xB0A0, 0x3FD5,\n    0xB0A1, 0xB0FE, 0x043E, 0xB141, 0xB15A, 0x3FF5, 0xB161, 0xB17A, 0x400F,\n    0xB181, 0xB1A0, 0x4029, 0xB1A1, 0xB1FE, 0x049C, 0xB241, 0xB25A, 0x4049,\n    0xB261, 0xB27A, 0x4063, 0xB281, 0xB2A0, 0x407D, 0xB2A1, 0xB2FE, 0x04FA,\n    0xB341, 0xB35A, 0x409D, 0xB361, 0xB37A, 0x40B7, 0xB381, 0xB3A0, 0x40D1,\n    0xB3A1, 0xB3FE, 0x0558, 0xB441, 0xB45A, 0x40F1, 0xB461, 0xB47A, 0x410B,\n    0xB481, 0xB4A0, 0x4125, 0xB4A1, 0xB4FE, 0x05B6, 0xB541, 0xB55A, 0x4145,\n    0xB561, 0xB57A, 0x415F, 0xB581, 0xB5A0, 0x4179, 0xB5A1, 0xB5FE, 0x0614,\n    0xB641, 0xB65A, 0x4199, 0xB661, 0xB67A, 0x41B3, 0xB681, 0xB6A0, 0x41CD,\n    0xB6A1, 0xB6FE, 0x0672, 0xB741, 0xB75A, 0x41ED, 0xB761, 0xB77A, 0x4207,\n    0xB781, 0xB7A0, 0x4221, 0xB7A1, 0xB7FE, 0x06D0, 0xB841, 0xB85A, 0x4241,\n    0xB861, 0xB87A, 0x425B, 0xB881, 0xB8A0, 0x4275, 0xB8A1, 0xB8FE, 0x072E,\n    0xB941, 0xB95A, 0x4295, 0xB961, 0xB97A, 0x42AF, 0xB981, 0xB9A0, 0x42C9,\n    0xB9A1, 0xB9FE, 0x078C, 0xBA41, 0xBA5A, 0x42E9, 0xBA61, 0xBA7A, 0x4303,\n    0xBA81, 0xBAA0, 0x431D, 0xBAA1, 0xBAFE, 0x07EA, 0xBB41, 0xBB5A, 0x433D,\n    0xBB61, 0xBB7A, 0x4357, 0xBB81, 0xBBA0, 0x4371, 0xBBA1, 0xBBFE, 0x0848,\n    0xBC41, 0xBC5A, 0x4391, 0xBC61, 0xBC7A, 0x43AB, 0xBC81, 0xBCA0, 0x43C5,\n    0xBCA1, 0xBCFE, 0x08A6, 0xBD41, 0xBD5A, 0x43E5, 0xBD61, 0xBD7A, 0x43FF,\n    0xBD81, 0xBDA0, 0x4419, 0xBDA1, 0xBDFE, 0x0904, 0xBE41, 0xBE5A, 0x4439,\n    0xBE61, 0xBE7A, 0x4453, 0xBE81, 0xBEA0, 0x446D, 0xBEA1, 0xBEFE, 0x0962,\n    0xBF41, 0xBF5A, 0x448D, 0xBF61, 0xBF7A, 0x44A7, 0xBF81, 0xBFA0, 0x44C1,\n    0xBFA1, 0xBFFE, 0x09C0, 0xC041, 0xC05A, 0x44E1, 0xC061, 0xC07A, 0x44FB,\n    0xC081, 0xC0A0, 0x4515, 0xC0A1, 0xC0FE, 0x0A1E, 0xC141, 0xC15A, 0x4535,\n    0xC161, 0xC17A, 0x454F, 0xC181, 0xC1A0, 0x4569, 0xC1A1, 0xC1FE, 0x0A7C,\n    0xC241, 0xC25A, 0x4589, 0xC261, 0xC27A, 0x45A3, 0xC281, 0xC2A0, 0x45BD,\n    0xC2A1, 0xC2FE, 0x0ADA, 0xC341, 0xC35A, 0x45DD, 0xC361, 0xC37A, 0x45F7,\n    0xC381, 0xC3A0, 0x4611, 0xC3A1, 0xC3FE, 0x0B38, 0xC441, 0xC45A, 0x4631,\n    0xC461, 0xC47A, 0x464B, 0xC481, 0xC4A0, 0x4665, 0xC4A1, 0xC4FE, 0x0B96,\n    0xC541, 0xC55A, 0x4685, 0xC561, 0xC57A, 0x469F, 0xC581, 0xC5A0, 0x46B9,\n    0xC5A1, 0xC5FE, 0x0BF4, 0xC641, 0xC652, 0x46D9, 0xC6A1, 0xC6FE, 0x0C52,\n    0xC7A1, 0xC7FE, 0x0CB0, 0xC8A1, 0xC8FE, 0x0D0E, 0xCAA1, 0xCAFE, 0x0D6C,\n    0xCBA1, 0xCBCF, 0x0DCA, 0xCBD0, 0xCBD0, 0x1014, 0xCBD1, 0xCBD5, 0x0DF9,\n    0xCBD6, 0xCBD6, 0x0E5E, 0xCBD7, 0xCBE6, 0x0DFE, 0xCBE7, 0xCBE7, 0x1B8D,\n    0xCBE8, 0xCBFE, 0x0E0E, 0xCCA1, 0xCCFE, 0x0E25, 0xCDA1, 0xCDCE, 0x0E83,\n    0xCDCF, 0xCDCF, 0x0D84, 0xCDD0, 0xCDE7, 0x0EB1, 0xCDE8, 0xCDE8, 0x1EDC,\n    0xCDE9, 0xCDFE, 0x0EC9, 0xCEA1, 0xCEAC, 0x0EDF, 0xCEAD, 0xCEAD, 0x0EDA,\n    0xCEAE, 0xCEFE, 0x0EEB, 0xCFA1, 0xCFFA, 0x0F3C, 0xCFFB, 0xCFFB, 0x0F3E,\n    0xCFFC, 0xCFFE, 0x0F96, 0xD0A1, 0xD0A1, 0x0F99, 0xD0A2, 0xD0A2, 0x0F6A,\n    0xD0A3, 0xD0B7, 0x0F9A, 0xD0B8, 0xD0B8, 0x0F6A, 0xD0B9, 0xD0CF, 0x0FAF,\n    0xD0D0, 0xD0D0, 0x0E7C, 0xD0D1, 0xD0DC, 0x0FC6, 0xD0DD, 0xD0DD, 0x1023,\n    0xD0DE, 0xD0FE, 0x0FD2, 0xD1A1, 0xD1D3, 0x0FF3, 0xD1D4, 0xD1D4, 0x1116,\n    0xD1D5, 0xD1D5, 0x103C, 0xD1D6, 0xD1D7, 0x1026, 0xD1D8, 0xD1D8, 0x1117,\n    0xD1D9, 0xD1DA, 0x1028, 0xD1DB, 0xD1E0, 0x1118, 0xD1E1, 0xD1E1, 0x102A,\n    0xD1E2, 0xD1E2, 0x16A8, 0xD1E3, 0xD1E5, 0x111E, 0xD1E6, 0xD1E6, 0x1122,\n    0xD1E7, 0xD1E7, 0x102B, 0xD1E8, 0xD1EB, 0x1123, 0xD1EC, 0xD1EC, 0x102C,\n    0xD1ED, 0xD1ED, 0x1127, 0xD1EE, 0xD1EE, 0x102D, 0xD1EF, 0xD1F0, 0x112A,\n    0xD1F1, 0xD1F1, 0x102E, 0xD1F2, 0xD1F2, 0x112C, 0xD1F3, 0xD1F5, 0x102F,\n    0xD1F6, 0xD1F6, 0x112F, 0xD1F7, 0xD1F9, 0x1032, 0xD1FA, 0xD1FA, 0x1133,\n    0xD1FB, 0xD1FB, 0x1035, 0xD1FC, 0xD1FD, 0x1136, 0xD1FE, 0xD1FE, 0x1139,\n    0xD2A1, 0xD2A1, 0x1036, 0xD2A2, 0xD2A3, 0x113A, 0xD2A4, 0xD2A6, 0x1037,\n    0xD2A7, 0xD2AA, 0x113C, 0xD2AB, 0xD2AB, 0x1143, 0xD2AC, 0xD2AC, 0x103A,\n    0xD2AD, 0xD2AD, 0x1144, 0xD2AE, 0xD2B1, 0x103B, 0xD2B2, 0xD2B2, 0x1148,\n    0xD2B3, 0xD2BD, 0x103F, 0xD2BE, 0xD2BE, 0x119F, 0xD2BF, 0xD2C1, 0x104A,\n    0xD2C2, 0xD2C3, 0x11A1, 0xD2C4, 0xD2C4, 0x11A5, 0xD2C5, 0xD2C5, 0x104D,\n    0xD2C6, 0xD2CA, 0x11A6, 0xD2CB, 0xD2CB, 0x11AC, 0xD2CC, 0xD2CC, 0x104E,\n    0xD2CD, 0xD2CE, 0x11AD, 0xD2CF, 0xD2D4, 0x11B0, 0xD2D5, 0xD2D7, 0x11B7,\n    0xD2D8, 0xD2D8, 0x104F, 0xD2D9, 0xD2DA, 0x11BD, 0xD2DB, 0xD2DD, 0x1050,\n    0xD2DE, 0xD2DF, 0x11C1, 0xD2E0, 0xD2E0, 0x1053, 0xD2E1, 0xD2E1, 0x11C3,\n    0xD2E2, 0xD2E2, 0x11C6, 0xD2E3, 0xD2E3, 0x1054, 0xD2E4, 0xD2E4, 0x11D4,\n    0xD2E5, 0xD2E8, 0x11D6, 0xD2E9, 0xD2EA, 0x11DB, 0xD2EB, 0xD2EB, 0x11E0,\n    0xD2EC, 0xD2EF, 0x1055, 0xD2F0, 0xD2F3, 0x11FC, 0xD2F4, 0xD2F5, 0x1201,\n    0xD2F6, 0xD2F6, 0x1059, 0xD2F7, 0xD2F8, 0x1203, 0xD2F9, 0xD2FE, 0x105A,\n    0xD3A1, 0xD3FE, 0x1060, 0xD4A1, 0xD4E5, 0x10BE, 0xD4E6, 0xD4E6, 0x10DE,\n    0xD4E7, 0xD4FB, 0x1103, 0xD4FC, 0xD4FC, 0x1028, 0xD4FD, 0xD4FE, 0x1118,\n    0xD5A1, 0xD5A4, 0x111A, 0xD5A5, 0xD5A5, 0x16A8, 0xD5A6, 0xD5AA, 0x111E,\n    0xD5AB, 0xD5AB, 0x102B, 0xD5AC, 0xD5AD, 0x1123, 0xD5AE, 0xD5AE, 0x1060,\n    0xD5AF, 0xD5FE, 0x1125, 0xD6A1, 0xD6B7, 0x1175, 0xD6B8, 0xD6B8, 0x1047,\n    0xD6B9, 0xD6CC, 0x118C, 0xD6CD, 0xD6CD, 0x104C, 0xD6CE, 0xD6FE, 0x11A0,\n    0xD7A1, 0xD7CA, 0x11D1, 0xD7CB, 0xD7CB, 0x15B0, 0xD7CC, 0xD7E3, 0x11FB,\n    0xD7E4, 0xD7E4, 0x1918, 0xD7E5, 0xD7FE, 0x1213, 0xD8A1, 0xD8FE, 0x122D,\n    0xD9A1, 0xD9FE, 0x128B, 0xDAA1, 0xDAFE, 0x12E9, 0xDBA1, 0xDBC4, 0x1347,\n    0xDBC5, 0xDBC5, 0x141F, 0xDBC6, 0xDBE3, 0x136B, 0xDBE4, 0xDBE4, 0x133A,\n    0xDBE5, 0xDBFE, 0x1389, 0xDCA1, 0xDCA4, 0x13A3, 0xDCA5, 0xDCA5, 0x1D5E,\n    0xDCA6, 0xDCFE, 0x13A7, 0xDDA1, 0xDDA4, 0x1400, 0xDDA5, 0xDDA5, 0x13D7,\n    0xDDA6, 0xDDD4, 0x1404, 0xDDD5, 0xDDD5, 0x13F5, 0xDDD6, 0xDDF3, 0x1433,\n    0xDDF4, 0xDDF4, 0x1DB7, 0xDDF5, 0xDDFE, 0x1451, 0xDEA1, 0xDEFB, 0x145B,\n    0xDEFC, 0xDEFC, 0x15D0, 0xDEFD, 0xDEFD, 0x14B6, 0xDEFE, 0xDEFE, 0x14F7,\n    0xDFA1, 0xDFB2, 0x14B7, 0xDFB3, 0xDFB3, 0x1BAB, 0xDFB4, 0xDFE0, 0x14C9,\n    0xDFE1, 0xDFE1, 0x14F2, 0xDFE2, 0xDFE7, 0x14F6, 0xDFE8, 0xDFE8, 0x156D,\n    0xDFE9, 0xDFFE, 0x14FC, 0xE0A1, 0xE0F0, 0x1512, 0xE0F1, 0xE0F1, 0x1771,\n    0xE0F2, 0xE0FE, 0x1562, 0xE1A1, 0xE1AC, 0x156F, 0xE1AD, 0xE1AD, 0x1554,\n    0xE1AE, 0xE1EC, 0x157B, 0xE1ED, 0xE1ED, 0x14C5, 0xE1EE, 0xE1FE, 0x15BA,\n    0xE2A1, 0xE2FE, 0x15CB, 0xE3A1, 0xE3F4, 0x1629, 0xE3F5, 0xE3F5, 0x1B61,\n    0xE3F6, 0xE3FE, 0x167D, 0xE4A1, 0xE4A1, 0x1CCA, 0xE4A2, 0xE4A8, 0x1686,\n    0xE4A9, 0xE4A9, 0x162E, 0xE4AA, 0xE4FE, 0x168D, 0xE5A1, 0xE5AD, 0x16E2,\n    0xE5AE, 0xE5AE, 0x16F2, 0xE5AF, 0xE5B0, 0x16EF, 0xE5B1, 0xE5B2, 0x1149,\n    0xE5B3, 0xE5B8, 0x16F1, 0xE5B9, 0xE5B9, 0x114B, 0xE5BA, 0xE5BA, 0x16F7,\n    0xE5BB, 0xE5BC, 0x114D, 0xE5BD, 0xE5C3, 0x16F8, 0xE5C4, 0xE5C4, 0x114F,\n    0xE5C5, 0xE5CD, 0x16FF, 0xE5CE, 0xE5CE, 0x1153, 0xE5CF, 0xE5CF, 0x1708,\n    0xE5D0, 0xE5D0, 0x1154, 0xE5D1, 0xE5D1, 0x1709, 0xE5D2, 0xE5D2, 0x1155,\n    0xE5D3, 0xE5D5, 0x170A, 0xE5D6, 0xE5D6, 0x1157, 0xE5D7, 0xE5F9, 0x170D,\n    0xE5FA, 0xE5FB, 0x115A, 0xE5FC, 0xE5FC, 0x103F, 0xE5FD, 0xE5FD, 0x1730,\n    0xE5FE, 0xE5FE, 0x115C, 0xE6A1, 0xE6A1, 0x115F, 0xE6A2, 0xE6A3, 0x1731,\n    0xE6A4, 0xE6A4, 0x1161, 0xE6A5, 0xE6A6, 0x1733, 0xE6A7, 0xE6A7, 0x1162,\n    0xE6A8, 0xE6AC, 0x1735, 0xE6AD, 0xE6AD, 0x1165, 0xE6AE, 0xE6AE, 0x173A,\n    0xE6AF, 0xE6B1, 0x1167, 0xE6B2, 0xE6B2, 0x173B, 0xE6B3, 0xE6B3, 0x116A,\n    0xE6B4, 0xE6B6, 0x173C, 0xE6B7, 0xE6B8, 0x116B, 0xE6B9, 0xE6BB, 0x173F,\n    0xE6BC, 0xE6BC, 0x116F, 0xE6BD, 0xE6C3, 0x1742, 0xE6C4, 0xE6C4, 0x1040,\n    0xE6C5, 0xE6C5, 0x1749, 0xE6C6, 0xE6C7, 0x1171, 0xE6C8, 0xE6C9, 0x174A,\n    0xE6CA, 0xE6CA, 0x1041, 0xE6CB, 0xE6D1, 0x174C, 0xE6D2, 0xE6D2, 0x1174,\n    0xE6D3, 0xE6D5, 0x1753, 0xE6D6, 0xE6D6, 0x1175, 0xE6D7, 0xE6D8, 0x1756,\n    0xE6D9, 0xE6D9, 0x1176, 0xE6DA, 0xE6DB, 0x1758, 0xE6DC, 0xE6DC, 0x1042,\n    0xE6DD, 0xE6DE, 0x175A, 0xE6DF, 0xE6DF, 0x1177, 0xE6E0, 0xE6E0, 0x175C,\n    0xE6E1, 0xE6E1, 0x1178, 0xE6E2, 0xE6E3, 0x175D, 0xE6E4, 0xE6E4, 0x117A,\n    0xE6E5, 0xE6E5, 0x1179, 0xE6E6, 0xE6E6, 0x117B, 0xE6E7, 0xE6E7, 0x175F,\n    0xE6E8, 0xE6E8, 0x117C, 0xE6E9, 0xE6E9, 0x1760, 0xE6EA, 0xE6EB, 0x117E,\n    0xE6EC, 0xE6EC, 0x192F, 0xE6ED, 0xE6EE, 0x1761, 0xE6EF, 0xE6EF, 0x1181,\n    0xE6F0, 0xE6F0, 0x1763, 0xE6F1, 0xE6F1, 0x1182, 0xE6F2, 0xE6F2, 0x1554,\n    0xE6F3, 0xE6F4, 0x1764, 0xE6F5, 0xE6F5, 0x1183, 0xE6F6, 0xE6F6, 0x1043,\n    0xE6F7, 0xE6F7, 0x1046, 0xE6F8, 0xE6F8, 0x1766, 0xE6F9, 0xE6F9, 0x1185,\n    0xE6FA, 0xE6FE, 0x1767, 0xE7A1, 0xE7A1, 0x1187, 0xE7A2, 0xE7A5, 0x176C,\n    0xE7A6, 0xE7A6, 0x1188, 0xE7A7, 0xE7A8, 0x1770, 0xE7A9, 0xE7A9, 0x1189,\n    0xE7AA, 0xE7AA, 0x118B, 0xE7AB, 0xE7AB, 0x1772, 0xE7AC, 0xE7AC, 0x1047,\n    0xE7AD, 0xE7AD, 0x118D, 0xE7AE, 0xE7AF, 0x1773, 0xE7B0, 0xE7B0, 0x118E,\n    0xE7B1, 0xE7BE, 0x1775, 0xE7BF, 0xE7BF, 0x118F, 0xE7C0, 0xE7C0, 0x1783,\n    0xE7C1, 0xE7C1, 0x1E67, 0xE7C2, 0xE7C5, 0x1784, 0xE7C6, 0xE7C6, 0x1191,\n    0xE7C7, 0xE7C7, 0x1193, 0xE7C8, 0xE7CA, 0x1788, 0xE7CB, 0xE7CB, 0x1195,\n    0xE7CC, 0xE7CC, 0x178B, 0xE7CD, 0xE7CD, 0x1196, 0xE7CE, 0xE7CE, 0x178C,\n    0xE7CF, 0xE7D0, 0x1197, 0xE7D1, 0xE7D2, 0x178D, 0xE7D3, 0xE7D3, 0x119A,\n    0xE7D4, 0xE7DE, 0x178F, 0xE7DF, 0xE7DF, 0x119C, 0xE7E0, 0xE7E3, 0x179A,\n    0xE7E4, 0xE7E4, 0x119D, 0xE7E5, 0xE7E5, 0x179E, 0xE7E6, 0xE7E6, 0x119E,\n    0xE7E7, 0xE7F6, 0x179F, 0xE7F7, 0xE7F7, 0x16A5, 0xE7F8, 0xE7FE, 0x17AF,\n    0xE8A1, 0xE8E6, 0x17B6, 0xE8E7, 0xE8E8, 0x11C7, 0xE8E9, 0xE8EF, 0x17FC,\n    0xE8F0, 0xE8F0, 0x11C9, 0xE8F1, 0xE8F1, 0x1054, 0xE8F2, 0xE8F6, 0x1803,\n    0xE8F7, 0xE8F7, 0x11CB, 0xE8F8, 0xE8F8, 0x1808, 0xE8F9, 0xE8F9, 0x16A8,\n    0xE8FA, 0xE8FA, 0x1809, 0xE8FB, 0xE8FB, 0x11CC, 0xE8FC, 0xE8FD, 0x180A,\n    0xE8FE, 0xE8FE, 0x11CD, 0xE9A1, 0xE9A6, 0x180C, 0xE9A7, 0xE9A7, 0x11D0,\n    0xE9A8, 0xE9AB, 0x1812, 0xE9AC, 0xE9AC, 0x11D1, 0xE9AD, 0xE9CB, 0x1816,\n    0xE9CC, 0xE9CC, 0x11D3, 0xE9CD, 0xE9F6, 0x1835, 0xE9F7, 0xE9F7, 0x1F34,\n    0xE9F8, 0xE9FE, 0x185F, 0xEAA1, 0xEAC0, 0x1866, 0xEAC1, 0xEAC1, 0x17EB,\n    0xEAC2, 0xEAE4, 0x1886, 0xEAE5, 0xEAE5, 0x11E1, 0xEAE6, 0xEAF3, 0x18A9,\n    0xEAF4, 0xEAF4, 0x1057, 0xEAF5, 0xEAF6, 0x18B7, 0xEAF7, 0xEAF7, 0x11E3,\n    0xEAF8, 0xEAFB, 0x18B9, 0xEAFC, 0xEAFC, 0x11E5, 0xEAFD, 0xEAFD, 0x18BD,\n    0xEAFE, 0xEAFE, 0x11E6, 0xEBA1, 0xEBA3, 0x18BE, 0xEBA4, 0xEBA4, 0x11E8,\n    0xEBA5, 0xEBA6, 0x18C1, 0xEBA7, 0xEBA7, 0x11EA, 0xEBA8, 0xEBA8, 0x18C3,\n    0xEBA9, 0xEBA9, 0x11EC, 0xEBAA, 0xEBAA, 0x1058, 0xEBAB, 0xEBB9, 0x18C4,\n    0xEBBA, 0xEBBB, 0x11EE, 0xEBBC, 0xEBBC, 0x18D3, 0xEBBD, 0xEBBD, 0x11F0,\n    0xEBBE, 0xEBC0, 0x18D4, 0xEBC1, 0xEBC1, 0x11F1, 0xEBC2, 0xEBC2, 0x11F3,\n    0xEBC3, 0xEBC5, 0x18D7, 0xEBC6, 0xEBC7, 0x11F4, 0xEBC8, 0xEBCB, 0x18DA,\n    0xEBCC, 0xEBCC, 0x11F7, 0xEBCD, 0xEBCE, 0x18DE, 0xEBCF, 0xEBD1, 0x11F8,\n    0xEBD2, 0xEBD2, 0x15B0, 0xEBD3, 0xEBD7, 0x18E0, 0xEBD8, 0xEBD8, 0x11FB,\n    0xEBD9, 0xEBFE, 0x18E5, 0xECA1, 0xECA5, 0x190B, 0xECA6, 0xECA6, 0x1206,\n    0xECA7, 0xECA7, 0x1208, 0xECA8, 0xECA9, 0x1910, 0xECAA, 0xECAA, 0x120A,\n    0xECAB, 0xECAE, 0x1912, 0xECAF, 0xECAF, 0x173E, 0xECB0, 0xECB1, 0x120C,\n    0xECB2, 0xECB2, 0x105B, 0xECB3, 0xECB4, 0x1916, 0xECB5, 0xECB5, 0x1211,\n    0xECB6, 0xECB7, 0x1918, 0xECB8, 0xECB8, 0x1213, 0xECB9, 0xECB9, 0x191A,\n    0xECBA, 0xECBA, 0x1215, 0xECBB, 0xECBF, 0x191B, 0xECC0, 0xECC1, 0x1218,\n    0xECC2, 0xECC4, 0x1920, 0xECC5, 0xECC5, 0x121A, 0xECC6, 0xECC6, 0x121C,\n    0xECC7, 0xECC8, 0x1923, 0xECC9, 0xECCA, 0x105C, 0xECCB, 0xECD4, 0x1925,\n    0xECD5, 0xECD5, 0x121E, 0xECD6, 0xECDC, 0x192F, 0xECDD, 0xECDE, 0x1220,\n    0xECDF, 0xECE0, 0x1936, 0xECE1, 0xECE1, 0x1222, 0xECE2, 0xECE3, 0x1938,\n    0xECE4, 0xECE4, 0x1224, 0xECE5, 0xECE6, 0x193A, 0xECE7, 0xECE8, 0x1225,\n    0xECE9, 0xECF6, 0x193C, 0xECF7, 0xECF8, 0x1227, 0xECF9, 0xECF9, 0x194A,\n    0xECFA, 0xECFA, 0x122A, 0xECFB, 0xECFE, 0x194B, 0xEDA1, 0xEDA3, 0x122D,\n    0xEDA4, 0xEDED, 0x194F, 0xEDEE, 0xEDEE, 0x14E7, 0xEDEF, 0xEDFE, 0x1999,\n    0xEEA1, 0xEEDA, 0x19A9, 0xEEDB, 0xEEDB, 0x195E, 0xEEDC, 0xEEFE, 0x19E3,\n    0xEFA1, 0xEFFE, 0x1A06, 0xF0A1, 0xF0FE, 0x1A64, 0xF1A1, 0xF1FE, 0x1AC2,\n    0xF2A1, 0xF2BC, 0x1B20, 0xF2BD, 0xF2BD, 0x1663, 0xF2BE, 0xF2F9, 0x1B3C,\n    0xF2FA, 0xF2FA, 0x168B, 0xF2FB, 0xF2FE, 0x1B78, 0xF3A1, 0xF3B0, 0x1B7C,\n    0xF3B1, 0xF3B1, 0x105F, 0xF3B2, 0xF3FE, 0x1B8C, 0xF4A1, 0xF4A6, 0x1BD9,\n    0xF4A7, 0xF4A7, 0x1954, 0xF4A8, 0xF4ED, 0x1BDF, 0xF4EE, 0xF4EE, 0x1A1C,\n    0xF4EF, 0xF4FE, 0x1C25, 0xF5A1, 0xF5FE, 0x1C35, 0xF6A1, 0xF6F3, 0x1C93,\n    0xF6F4, 0xF6F4, 0x10B7, 0xF6F5, 0xF6F5, 0x1CE6, 0xF6F6, 0xF6F6, 0x1BE3,\n    0xF6F7, 0xF6FE, 0x1CE7, 0xF7A1, 0xF7B7, 0x1CEF, 0xF7B8, 0xF7B8, 0x1097,\n    0xF7B9, 0xF7C7, 0x1D06, 0xF7C8, 0xF7C8, 0x10AA, 0xF7C9, 0xF7D2, 0x1D15,\n    0xF7D3, 0xF7D3, 0x10F4, 0xF7D4, 0xF7FE, 0x1D1F, 0xF8A1, 0xF8DA, 0x1D4A,\n    0xF8DB, 0xF8DB, 0x1D94, 0xF8DC, 0xF8EF, 0x1D84, 0xF8F0, 0xF8F0, 0x13E0,\n    0xF8F1, 0xF8FE, 0x1D98, 0xF9A1, 0xF9FE, 0x1DA6, 0xFAA1, 0xFAA1, 0x1E1D,\n    0xFAA2, 0xFAA2, 0x0DE6, 0xFAA3, 0xFAE5, 0x1E04, 0xFAE6, 0xFAE6, 0x0E3C,\n    0xFAE7, 0xFAFE, 0x1E47, 0xFBA1, 0xFBFE, 0x1E5F, 0xFCA1, 0xFCA8, 0x1EBD,\n    0xFCA9, 0xFCA9, 0x0EE7, 0xFCAA, 0xFCFE, 0x1EC5, 0xFDA1, 0xFDFE, 0x1F1A,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-V_1.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_KSCms_UHC_HW_V_1[16 * 3] = {\n    0xA1A2, 0xA1A3, 0x1F78, 0xA1A5, 0xA1A5, 0x1F7A, 0xA1A6, 0xA1A6, 0x2080,\n    0xA1A9, 0xA1AB, 0x1F7B, 0xA1AD, 0xA1AD, 0x1F7E, 0xA1B2, 0xA1BD, 0x1F7F,\n    0xA1EB, 0xA1EB, 0x1F8B, 0xA3A1, 0xA3A1, 0x1F8C, 0xA3A8, 0xA3A9, 0x1F8D,\n    0xA3AC, 0xA3AC, 0x1F8F, 0xA3AE, 0xA3AE, 0x1F90, 0xA3BA, 0xA3BF, 0x1F91,\n    0xA3DB, 0xA3DB, 0x1F97, 0xA3DD, 0xA3DD, 0x1F98, 0xA3DF, 0xA3DF, 0x1F99,\n    0xA3FB, 0xA3FE, 0x1F9A,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-H_1.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_KSCms_UHC_H_1[675 * 3] = {\n    0x0020, 0x007E, 0x0001, 0x8141, 0x815A, 0x2475, 0x8161, 0x817A, 0x248F,\n    0x8181, 0x81FE, 0x24A9, 0x8241, 0x825A, 0x2527, 0x8261, 0x827A, 0x2541,\n    0x8281, 0x82FE, 0x255B, 0x8341, 0x835A, 0x25D9, 0x8361, 0x837A, 0x25F3,\n    0x8381, 0x83FE, 0x260D, 0x8441, 0x845A, 0x268B, 0x8461, 0x847A, 0x26A5,\n    0x8481, 0x84FE, 0x26BF, 0x8541, 0x855A, 0x273D, 0x8561, 0x857A, 0x2757,\n    0x8581, 0x85FE, 0x2771, 0x8641, 0x865A, 0x27EF, 0x8661, 0x867A, 0x2809,\n    0x8681, 0x86FE, 0x2823, 0x8741, 0x875A, 0x28A1, 0x8761, 0x877A, 0x28BB,\n    0x8781, 0x87FE, 0x28D5, 0x8841, 0x885A, 0x2953, 0x8861, 0x887A, 0x296D,\n    0x8881, 0x88FE, 0x2987, 0x8941, 0x895A, 0x2A05, 0x8961, 0x897A, 0x2A1F,\n    0x8981, 0x89FE, 0x2A39, 0x8A41, 0x8A5A, 0x2AB7, 0x8A61, 0x8A7A, 0x2AD1,\n    0x8A81, 0x8AFE, 0x2AEB, 0x8B41, 0x8B5A, 0x2B69, 0x8B61, 0x8B7A, 0x2B83,\n    0x8B81, 0x8BFE, 0x2B9D, 0x8C41, 0x8C5A, 0x2C1B, 0x8C61, 0x8C7A, 0x2C35,\n    0x8C81, 0x8CFE, 0x2C4F, 0x8D41, 0x8D5A, 0x2CCD, 0x8D61, 0x8D7A, 0x2CE7,\n    0x8D81, 0x8DFE, 0x2D01, 0x8E41, 0x8E5A, 0x2D7F, 0x8E61, 0x8E7A, 0x2D99,\n    0x8E81, 0x8EFE, 0x2DB3, 0x8F41, 0x8F5A, 0x2E31, 0x8F61, 0x8F7A, 0x2E4B,\n    0x8F81, 0x8FFE, 0x2E65, 0x9041, 0x905A, 0x2EE3, 0x9061, 0x907A, 0x2EFD,\n    0x9081, 0x90FE, 0x2F17, 0x9141, 0x915A, 0x2F95, 0x9161, 0x917A, 0x2FAF,\n    0x9181, 0x91FE, 0x2FC9, 0x9241, 0x925A, 0x3047, 0x9261, 0x927A, 0x3061,\n    0x9281, 0x92FE, 0x307B, 0x9341, 0x935A, 0x30F9, 0x9361, 0x937A, 0x3113,\n    0x9381, 0x93FE, 0x312D, 0x9441, 0x945A, 0x31AB, 0x9461, 0x947A, 0x31C5,\n    0x9481, 0x94FE, 0x31DF, 0x9541, 0x955A, 0x325D, 0x9561, 0x957A, 0x3277,\n    0x9581, 0x95FE, 0x3291, 0x9641, 0x965A, 0x330F, 0x9661, 0x967A, 0x3329,\n    0x9681, 0x96FE, 0x3343, 0x9741, 0x975A, 0x33C1, 0x9761, 0x977A, 0x33DB,\n    0x9781, 0x97FE, 0x33F5, 0x9841, 0x985A, 0x3473, 0x9861, 0x987A, 0x348D,\n    0x9881, 0x98FE, 0x34A7, 0x9941, 0x995A, 0x3525, 0x9961, 0x997A, 0x353F,\n    0x9981, 0x99FE, 0x3559, 0x9A41, 0x9A5A, 0x35D7, 0x9A61, 0x9A7A, 0x35F1,\n    0x9A81, 0x9AFE, 0x360B, 0x9B41, 0x9B5A, 0x3689, 0x9B61, 0x9B7A, 0x36A3,\n    0x9B81, 0x9BFE, 0x36BD, 0x9C41, 0x9C5A, 0x373B, 0x9C61, 0x9C7A, 0x3755,\n    0x9C81, 0x9CFE, 0x376F, 0x9D41, 0x9D5A, 0x37ED, 0x9D61, 0x9D7A, 0x3807,\n    0x9D81, 0x9DFE, 0x3821, 0x9E41, 0x9E5A, 0x389F, 0x9E61, 0x9E7A, 0x38B9,\n    0x9E81, 0x9EFE, 0x38D3, 0x9F41, 0x9F5A, 0x3951, 0x9F61, 0x9F7A, 0x396B,\n    0x9F81, 0x9FFE, 0x3985, 0xA041, 0xA05A, 0x3A03, 0xA061, 0xA07A, 0x3A1D,\n    0xA081, 0xA0FE, 0x3A37, 0xA141, 0xA15A, 0x3AB5, 0xA161, 0xA17A, 0x3ACF,\n    0xA181, 0xA1A0, 0x3AE9, 0xA1A1, 0xA1FE, 0x0065, 0xA241, 0xA25A, 0x3B09,\n    0xA261, 0xA27A, 0x3B23, 0xA281, 0xA2A0, 0x3B3D, 0xA2A1, 0xA2E5, 0x00C3,\n    0xA341, 0xA35A, 0x3B5D, 0xA361, 0xA37A, 0x3B77, 0xA381, 0xA3A0, 0x3B91,\n    0xA3A1, 0xA3FE, 0x0108, 0xA441, 0xA45A, 0x3BB1, 0xA461, 0xA47A, 0x3BCB,\n    0xA481, 0xA4A0, 0x3BE5, 0xA4A1, 0xA4D3, 0x0166, 0xA4D5, 0xA4FE, 0x0199,\n    0xA541, 0xA55A, 0x3C05, 0xA561, 0xA57A, 0x3C1F, 0xA581, 0xA5A0, 0x3C39,\n    0xA5A1, 0xA5AA, 0x01C3, 0xA5B0, 0xA5B9, 0x01CD, 0xA5C1, 0xA5D8, 0x01D7,\n    0xA5E1, 0xA5F8, 0x01EF, 0xA641, 0xA65A, 0x3C59, 0xA661, 0xA67A, 0x3C73,\n    0xA681, 0xA6A0, 0x3C8D, 0xA6A1, 0xA6E4, 0x0207, 0xA741, 0xA75A, 0x3CAD,\n    0xA761, 0xA77A, 0x3CC7, 0xA781, 0xA7A0, 0x3CE1, 0xA7A1, 0xA7EF, 0x024B,\n    0xA841, 0xA85A, 0x3D01, 0xA861, 0xA87A, 0x3D1B, 0xA881, 0xA8A0, 0x3D35,\n    0xA8A1, 0xA8A4, 0x029A, 0xA8A6, 0xA8A6, 0x029E, 0xA8A8, 0xA8AF, 0x029F,\n    0xA8B1, 0xA8FE, 0x02A7, 0xA941, 0xA95A, 0x3D55, 0xA961, 0xA97A, 0x3D6F,\n    0xA981, 0xA9A0, 0x3D89, 0xA9A1, 0xA9FE, 0x02F5, 0xAA41, 0xAA5A, 0x3DA9,\n    0xAA61, 0xAA7A, 0x3DC3, 0xAA81, 0xAAA0, 0x3DDD, 0xAAA1, 0xAAF3, 0x0353,\n    0xAB41, 0xAB5A, 0x3DFD, 0xAB61, 0xAB7A, 0x3E17, 0xAB81, 0xABA0, 0x3E31,\n    0xABA1, 0xABF6, 0x03A6, 0xAC41, 0xAC5A, 0x3E51, 0xAC61, 0xAC7A, 0x3E6B,\n    0xAC81, 0xACA0, 0x3E85, 0xACA1, 0xACC1, 0x03FC, 0xACD1, 0xACF1, 0x041D,\n    0xAD41, 0xAD5A, 0x3EA5, 0xAD61, 0xAD7A, 0x3EBF, 0xAD81, 0xADA0, 0x3ED9,\n    0xAE41, 0xAE5A, 0x3EF9, 0xAE61, 0xAE7A, 0x3F13, 0xAE81, 0xAEA0, 0x3F2D,\n    0xAF41, 0xAF5A, 0x3F4D, 0xAF61, 0xAF7A, 0x3F67, 0xAF81, 0xAFA0, 0x3F81,\n    0xB041, 0xB05A, 0x3FA1, 0xB061, 0xB07A, 0x3FBB, 0xB081, 0xB0A0, 0x3FD5,\n    0xB0A1, 0xB0FE, 0x043E, 0xB141, 0xB15A, 0x3FF5, 0xB161, 0xB17A, 0x400F,\n    0xB181, 0xB1A0, 0x4029, 0xB1A1, 0xB1FE, 0x049C, 0xB241, 0xB25A, 0x4049,\n    0xB261, 0xB27A, 0x4063, 0xB281, 0xB2A0, 0x407D, 0xB2A1, 0xB2FE, 0x04FA,\n    0xB341, 0xB35A, 0x409D, 0xB361, 0xB37A, 0x40B7, 0xB381, 0xB3A0, 0x40D1,\n    0xB3A1, 0xB3FE, 0x0558, 0xB441, 0xB45A, 0x40F1, 0xB461, 0xB47A, 0x410B,\n    0xB481, 0xB4A0, 0x4125, 0xB4A1, 0xB4FE, 0x05B6, 0xB541, 0xB55A, 0x4145,\n    0xB561, 0xB57A, 0x415F, 0xB581, 0xB5A0, 0x4179, 0xB5A1, 0xB5FE, 0x0614,\n    0xB641, 0xB65A, 0x4199, 0xB661, 0xB67A, 0x41B3, 0xB681, 0xB6A0, 0x41CD,\n    0xB6A1, 0xB6FE, 0x0672, 0xB741, 0xB75A, 0x41ED, 0xB761, 0xB77A, 0x4207,\n    0xB781, 0xB7A0, 0x4221, 0xB7A1, 0xB7FE, 0x06D0, 0xB841, 0xB85A, 0x4241,\n    0xB861, 0xB87A, 0x425B, 0xB881, 0xB8A0, 0x4275, 0xB8A1, 0xB8FE, 0x072E,\n    0xB941, 0xB95A, 0x4295, 0xB961, 0xB97A, 0x42AF, 0xB981, 0xB9A0, 0x42C9,\n    0xB9A1, 0xB9FE, 0x078C, 0xBA41, 0xBA5A, 0x42E9, 0xBA61, 0xBA7A, 0x4303,\n    0xBA81, 0xBAA0, 0x431D, 0xBAA1, 0xBAFE, 0x07EA, 0xBB41, 0xBB5A, 0x433D,\n    0xBB61, 0xBB7A, 0x4357, 0xBB81, 0xBBA0, 0x4371, 0xBBA1, 0xBBFE, 0x0848,\n    0xBC41, 0xBC5A, 0x4391, 0xBC61, 0xBC7A, 0x43AB, 0xBC81, 0xBCA0, 0x43C5,\n    0xBCA1, 0xBCFE, 0x08A6, 0xBD41, 0xBD5A, 0x43E5, 0xBD61, 0xBD7A, 0x43FF,\n    0xBD81, 0xBDA0, 0x4419, 0xBDA1, 0xBDFE, 0x0904, 0xBE41, 0xBE5A, 0x4439,\n    0xBE61, 0xBE7A, 0x4453, 0xBE81, 0xBEA0, 0x446D, 0xBEA1, 0xBEFE, 0x0962,\n    0xBF41, 0xBF5A, 0x448D, 0xBF61, 0xBF7A, 0x44A7, 0xBF81, 0xBFA0, 0x44C1,\n    0xBFA1, 0xBFFE, 0x09C0, 0xC041, 0xC05A, 0x44E1, 0xC061, 0xC07A, 0x44FB,\n    0xC081, 0xC0A0, 0x4515, 0xC0A1, 0xC0FE, 0x0A1E, 0xC141, 0xC15A, 0x4535,\n    0xC161, 0xC17A, 0x454F, 0xC181, 0xC1A0, 0x4569, 0xC1A1, 0xC1FE, 0x0A7C,\n    0xC241, 0xC25A, 0x4589, 0xC261, 0xC27A, 0x45A3, 0xC281, 0xC2A0, 0x45BD,\n    0xC2A1, 0xC2FE, 0x0ADA, 0xC341, 0xC35A, 0x45DD, 0xC361, 0xC37A, 0x45F7,\n    0xC381, 0xC3A0, 0x4611, 0xC3A1, 0xC3FE, 0x0B38, 0xC441, 0xC45A, 0x4631,\n    0xC461, 0xC47A, 0x464B, 0xC481, 0xC4A0, 0x4665, 0xC4A1, 0xC4FE, 0x0B96,\n    0xC541, 0xC55A, 0x4685, 0xC561, 0xC57A, 0x469F, 0xC581, 0xC5A0, 0x46B9,\n    0xC5A1, 0xC5FE, 0x0BF4, 0xC641, 0xC652, 0x46D9, 0xC6A1, 0xC6FE, 0x0C52,\n    0xC7A1, 0xC7FE, 0x0CB0, 0xC8A1, 0xC8FE, 0x0D0E, 0xCAA1, 0xCAFE, 0x0D6C,\n    0xCBA1, 0xCBCF, 0x0DCA, 0xCBD0, 0xCBD0, 0x1014, 0xCBD1, 0xCBD5, 0x0DF9,\n    0xCBD6, 0xCBD6, 0x0E5E, 0xCBD7, 0xCBE6, 0x0DFE, 0xCBE7, 0xCBE7, 0x1B8D,\n    0xCBE8, 0xCBFE, 0x0E0E, 0xCCA1, 0xCCFE, 0x0E25, 0xCDA1, 0xCDCE, 0x0E83,\n    0xCDCF, 0xCDCF, 0x0D84, 0xCDD0, 0xCDE7, 0x0EB1, 0xCDE8, 0xCDE8, 0x1EDC,\n    0xCDE9, 0xCDFE, 0x0EC9, 0xCEA1, 0xCEAC, 0x0EDF, 0xCEAD, 0xCEAD, 0x0EDA,\n    0xCEAE, 0xCEFE, 0x0EEB, 0xCFA1, 0xCFFA, 0x0F3C, 0xCFFB, 0xCFFB, 0x0F3E,\n    0xCFFC, 0xCFFE, 0x0F96, 0xD0A1, 0xD0A1, 0x0F99, 0xD0A2, 0xD0A2, 0x0F6A,\n    0xD0A3, 0xD0B7, 0x0F9A, 0xD0B8, 0xD0B8, 0x0F6A, 0xD0B9, 0xD0CF, 0x0FAF,\n    0xD0D0, 0xD0D0, 0x0E7C, 0xD0D1, 0xD0DC, 0x0FC6, 0xD0DD, 0xD0DD, 0x1023,\n    0xD0DE, 0xD0FE, 0x0FD2, 0xD1A1, 0xD1D3, 0x0FF3, 0xD1D4, 0xD1D4, 0x1116,\n    0xD1D5, 0xD1D5, 0x103C, 0xD1D6, 0xD1D7, 0x1026, 0xD1D8, 0xD1D8, 0x1117,\n    0xD1D9, 0xD1DA, 0x1028, 0xD1DB, 0xD1E0, 0x1118, 0xD1E1, 0xD1E1, 0x102A,\n    0xD1E2, 0xD1E2, 0x16A8, 0xD1E3, 0xD1E5, 0x111E, 0xD1E6, 0xD1E6, 0x1122,\n    0xD1E7, 0xD1E7, 0x102B, 0xD1E8, 0xD1EB, 0x1123, 0xD1EC, 0xD1EC, 0x102C,\n    0xD1ED, 0xD1ED, 0x1127, 0xD1EE, 0xD1EE, 0x102D, 0xD1EF, 0xD1F0, 0x112A,\n    0xD1F1, 0xD1F1, 0x102E, 0xD1F2, 0xD1F2, 0x112C, 0xD1F3, 0xD1F5, 0x102F,\n    0xD1F6, 0xD1F6, 0x112F, 0xD1F7, 0xD1F9, 0x1032, 0xD1FA, 0xD1FA, 0x1133,\n    0xD1FB, 0xD1FB, 0x1035, 0xD1FC, 0xD1FD, 0x1136, 0xD1FE, 0xD1FE, 0x1139,\n    0xD2A1, 0xD2A1, 0x1036, 0xD2A2, 0xD2A3, 0x113A, 0xD2A4, 0xD2A6, 0x1037,\n    0xD2A7, 0xD2AA, 0x113C, 0xD2AB, 0xD2AB, 0x1143, 0xD2AC, 0xD2AC, 0x103A,\n    0xD2AD, 0xD2AD, 0x1144, 0xD2AE, 0xD2B1, 0x103B, 0xD2B2, 0xD2B2, 0x1148,\n    0xD2B3, 0xD2BD, 0x103F, 0xD2BE, 0xD2BE, 0x119F, 0xD2BF, 0xD2C1, 0x104A,\n    0xD2C2, 0xD2C3, 0x11A1, 0xD2C4, 0xD2C4, 0x11A5, 0xD2C5, 0xD2C5, 0x104D,\n    0xD2C6, 0xD2CA, 0x11A6, 0xD2CB, 0xD2CB, 0x11AC, 0xD2CC, 0xD2CC, 0x104E,\n    0xD2CD, 0xD2CE, 0x11AD, 0xD2CF, 0xD2D4, 0x11B0, 0xD2D5, 0xD2D7, 0x11B7,\n    0xD2D8, 0xD2D8, 0x104F, 0xD2D9, 0xD2DA, 0x11BD, 0xD2DB, 0xD2DD, 0x1050,\n    0xD2DE, 0xD2DF, 0x11C1, 0xD2E0, 0xD2E0, 0x1053, 0xD2E1, 0xD2E1, 0x11C3,\n    0xD2E2, 0xD2E2, 0x11C6, 0xD2E3, 0xD2E3, 0x1054, 0xD2E4, 0xD2E4, 0x11D4,\n    0xD2E5, 0xD2E8, 0x11D6, 0xD2E9, 0xD2EA, 0x11DB, 0xD2EB, 0xD2EB, 0x11E0,\n    0xD2EC, 0xD2EF, 0x1055, 0xD2F0, 0xD2F3, 0x11FC, 0xD2F4, 0xD2F5, 0x1201,\n    0xD2F6, 0xD2F6, 0x1059, 0xD2F7, 0xD2F8, 0x1203, 0xD2F9, 0xD2FE, 0x105A,\n    0xD3A1, 0xD3FE, 0x1060, 0xD4A1, 0xD4E5, 0x10BE, 0xD4E6, 0xD4E6, 0x10DE,\n    0xD4E7, 0xD4FB, 0x1103, 0xD4FC, 0xD4FC, 0x1028, 0xD4FD, 0xD4FE, 0x1118,\n    0xD5A1, 0xD5A4, 0x111A, 0xD5A5, 0xD5A5, 0x16A8, 0xD5A6, 0xD5AA, 0x111E,\n    0xD5AB, 0xD5AB, 0x102B, 0xD5AC, 0xD5AD, 0x1123, 0xD5AE, 0xD5AE, 0x1060,\n    0xD5AF, 0xD5FE, 0x1125, 0xD6A1, 0xD6B7, 0x1175, 0xD6B8, 0xD6B8, 0x1047,\n    0xD6B9, 0xD6CC, 0x118C, 0xD6CD, 0xD6CD, 0x104C, 0xD6CE, 0xD6FE, 0x11A0,\n    0xD7A1, 0xD7CA, 0x11D1, 0xD7CB, 0xD7CB, 0x15B0, 0xD7CC, 0xD7E3, 0x11FB,\n    0xD7E4, 0xD7E4, 0x1918, 0xD7E5, 0xD7FE, 0x1213, 0xD8A1, 0xD8FE, 0x122D,\n    0xD9A1, 0xD9FE, 0x128B, 0xDAA1, 0xDAFE, 0x12E9, 0xDBA1, 0xDBC4, 0x1347,\n    0xDBC5, 0xDBC5, 0x141F, 0xDBC6, 0xDBE3, 0x136B, 0xDBE4, 0xDBE4, 0x133A,\n    0xDBE5, 0xDBFE, 0x1389, 0xDCA1, 0xDCA4, 0x13A3, 0xDCA5, 0xDCA5, 0x1D5E,\n    0xDCA6, 0xDCFE, 0x13A7, 0xDDA1, 0xDDA4, 0x1400, 0xDDA5, 0xDDA5, 0x13D7,\n    0xDDA6, 0xDDD4, 0x1404, 0xDDD5, 0xDDD5, 0x13F5, 0xDDD6, 0xDDF3, 0x1433,\n    0xDDF4, 0xDDF4, 0x1DB7, 0xDDF5, 0xDDFE, 0x1451, 0xDEA1, 0xDEFB, 0x145B,\n    0xDEFC, 0xDEFC, 0x15D0, 0xDEFD, 0xDEFD, 0x14B6, 0xDEFE, 0xDEFE, 0x14F7,\n    0xDFA1, 0xDFB2, 0x14B7, 0xDFB3, 0xDFB3, 0x1BAB, 0xDFB4, 0xDFE0, 0x14C9,\n    0xDFE1, 0xDFE1, 0x14F2, 0xDFE2, 0xDFE7, 0x14F6, 0xDFE8, 0xDFE8, 0x156D,\n    0xDFE9, 0xDFFE, 0x14FC, 0xE0A1, 0xE0F0, 0x1512, 0xE0F1, 0xE0F1, 0x1771,\n    0xE0F2, 0xE0FE, 0x1562, 0xE1A1, 0xE1AC, 0x156F, 0xE1AD, 0xE1AD, 0x1554,\n    0xE1AE, 0xE1EC, 0x157B, 0xE1ED, 0xE1ED, 0x14C5, 0xE1EE, 0xE1FE, 0x15BA,\n    0xE2A1, 0xE2FE, 0x15CB, 0xE3A1, 0xE3F4, 0x1629, 0xE3F5, 0xE3F5, 0x1B61,\n    0xE3F6, 0xE3FE, 0x167D, 0xE4A1, 0xE4A1, 0x1CCA, 0xE4A2, 0xE4A8, 0x1686,\n    0xE4A9, 0xE4A9, 0x162E, 0xE4AA, 0xE4FE, 0x168D, 0xE5A1, 0xE5AD, 0x16E2,\n    0xE5AE, 0xE5AE, 0x16F2, 0xE5AF, 0xE5B0, 0x16EF, 0xE5B1, 0xE5B2, 0x1149,\n    0xE5B3, 0xE5B8, 0x16F1, 0xE5B9, 0xE5B9, 0x114B, 0xE5BA, 0xE5BA, 0x16F7,\n    0xE5BB, 0xE5BC, 0x114D, 0xE5BD, 0xE5C3, 0x16F8, 0xE5C4, 0xE5C4, 0x114F,\n    0xE5C5, 0xE5CD, 0x16FF, 0xE5CE, 0xE5CE, 0x1153, 0xE5CF, 0xE5CF, 0x1708,\n    0xE5D0, 0xE5D0, 0x1154, 0xE5D1, 0xE5D1, 0x1709, 0xE5D2, 0xE5D2, 0x1155,\n    0xE5D3, 0xE5D5, 0x170A, 0xE5D6, 0xE5D6, 0x1157, 0xE5D7, 0xE5F9, 0x170D,\n    0xE5FA, 0xE5FB, 0x115A, 0xE5FC, 0xE5FC, 0x103F, 0xE5FD, 0xE5FD, 0x1730,\n    0xE5FE, 0xE5FE, 0x115C, 0xE6A1, 0xE6A1, 0x115F, 0xE6A2, 0xE6A3, 0x1731,\n    0xE6A4, 0xE6A4, 0x1161, 0xE6A5, 0xE6A6, 0x1733, 0xE6A7, 0xE6A7, 0x1162,\n    0xE6A8, 0xE6AC, 0x1735, 0xE6AD, 0xE6AD, 0x1165, 0xE6AE, 0xE6AE, 0x173A,\n    0xE6AF, 0xE6B1, 0x1167, 0xE6B2, 0xE6B2, 0x173B, 0xE6B3, 0xE6B3, 0x116A,\n    0xE6B4, 0xE6B6, 0x173C, 0xE6B7, 0xE6B8, 0x116B, 0xE6B9, 0xE6BB, 0x173F,\n    0xE6BC, 0xE6BC, 0x116F, 0xE6BD, 0xE6C3, 0x1742, 0xE6C4, 0xE6C4, 0x1040,\n    0xE6C5, 0xE6C5, 0x1749, 0xE6C6, 0xE6C7, 0x1171, 0xE6C8, 0xE6C9, 0x174A,\n    0xE6CA, 0xE6CA, 0x1041, 0xE6CB, 0xE6D1, 0x174C, 0xE6D2, 0xE6D2, 0x1174,\n    0xE6D3, 0xE6D5, 0x1753, 0xE6D6, 0xE6D6, 0x1175, 0xE6D7, 0xE6D8, 0x1756,\n    0xE6D9, 0xE6D9, 0x1176, 0xE6DA, 0xE6DB, 0x1758, 0xE6DC, 0xE6DC, 0x1042,\n    0xE6DD, 0xE6DE, 0x175A, 0xE6DF, 0xE6DF, 0x1177, 0xE6E0, 0xE6E0, 0x175C,\n    0xE6E1, 0xE6E1, 0x1178, 0xE6E2, 0xE6E3, 0x175D, 0xE6E4, 0xE6E4, 0x117A,\n    0xE6E5, 0xE6E5, 0x1179, 0xE6E6, 0xE6E6, 0x117B, 0xE6E7, 0xE6E7, 0x175F,\n    0xE6E8, 0xE6E8, 0x117C, 0xE6E9, 0xE6E9, 0x1760, 0xE6EA, 0xE6EB, 0x117E,\n    0xE6EC, 0xE6EC, 0x192F, 0xE6ED, 0xE6EE, 0x1761, 0xE6EF, 0xE6EF, 0x1181,\n    0xE6F0, 0xE6F0, 0x1763, 0xE6F1, 0xE6F1, 0x1182, 0xE6F2, 0xE6F2, 0x1554,\n    0xE6F3, 0xE6F4, 0x1764, 0xE6F5, 0xE6F5, 0x1183, 0xE6F6, 0xE6F6, 0x1043,\n    0xE6F7, 0xE6F7, 0x1046, 0xE6F8, 0xE6F8, 0x1766, 0xE6F9, 0xE6F9, 0x1185,\n    0xE6FA, 0xE6FE, 0x1767, 0xE7A1, 0xE7A1, 0x1187, 0xE7A2, 0xE7A5, 0x176C,\n    0xE7A6, 0xE7A6, 0x1188, 0xE7A7, 0xE7A8, 0x1770, 0xE7A9, 0xE7A9, 0x1189,\n    0xE7AA, 0xE7AA, 0x118B, 0xE7AB, 0xE7AB, 0x1772, 0xE7AC, 0xE7AC, 0x1047,\n    0xE7AD, 0xE7AD, 0x118D, 0xE7AE, 0xE7AF, 0x1773, 0xE7B0, 0xE7B0, 0x118E,\n    0xE7B1, 0xE7BE, 0x1775, 0xE7BF, 0xE7BF, 0x118F, 0xE7C0, 0xE7C0, 0x1783,\n    0xE7C1, 0xE7C1, 0x1E67, 0xE7C2, 0xE7C5, 0x1784, 0xE7C6, 0xE7C6, 0x1191,\n    0xE7C7, 0xE7C7, 0x1193, 0xE7C8, 0xE7CA, 0x1788, 0xE7CB, 0xE7CB, 0x1195,\n    0xE7CC, 0xE7CC, 0x178B, 0xE7CD, 0xE7CD, 0x1196, 0xE7CE, 0xE7CE, 0x178C,\n    0xE7CF, 0xE7D0, 0x1197, 0xE7D1, 0xE7D2, 0x178D, 0xE7D3, 0xE7D3, 0x119A,\n    0xE7D4, 0xE7DE, 0x178F, 0xE7DF, 0xE7DF, 0x119C, 0xE7E0, 0xE7E3, 0x179A,\n    0xE7E4, 0xE7E4, 0x119D, 0xE7E5, 0xE7E5, 0x179E, 0xE7E6, 0xE7E6, 0x119E,\n    0xE7E7, 0xE7F6, 0x179F, 0xE7F7, 0xE7F7, 0x16A5, 0xE7F8, 0xE7FE, 0x17AF,\n    0xE8A1, 0xE8E6, 0x17B6, 0xE8E7, 0xE8E8, 0x11C7, 0xE8E9, 0xE8EF, 0x17FC,\n    0xE8F0, 0xE8F0, 0x11C9, 0xE8F1, 0xE8F1, 0x1054, 0xE8F2, 0xE8F6, 0x1803,\n    0xE8F7, 0xE8F7, 0x11CB, 0xE8F8, 0xE8F8, 0x1808, 0xE8F9, 0xE8F9, 0x16A8,\n    0xE8FA, 0xE8FA, 0x1809, 0xE8FB, 0xE8FB, 0x11CC, 0xE8FC, 0xE8FD, 0x180A,\n    0xE8FE, 0xE8FE, 0x11CD, 0xE9A1, 0xE9A6, 0x180C, 0xE9A7, 0xE9A7, 0x11D0,\n    0xE9A8, 0xE9AB, 0x1812, 0xE9AC, 0xE9AC, 0x11D1, 0xE9AD, 0xE9CB, 0x1816,\n    0xE9CC, 0xE9CC, 0x11D3, 0xE9CD, 0xE9F6, 0x1835, 0xE9F7, 0xE9F7, 0x1F34,\n    0xE9F8, 0xE9FE, 0x185F, 0xEAA1, 0xEAC0, 0x1866, 0xEAC1, 0xEAC1, 0x17EB,\n    0xEAC2, 0xEAE4, 0x1886, 0xEAE5, 0xEAE5, 0x11E1, 0xEAE6, 0xEAF3, 0x18A9,\n    0xEAF4, 0xEAF4, 0x1057, 0xEAF5, 0xEAF6, 0x18B7, 0xEAF7, 0xEAF7, 0x11E3,\n    0xEAF8, 0xEAFB, 0x18B9, 0xEAFC, 0xEAFC, 0x11E5, 0xEAFD, 0xEAFD, 0x18BD,\n    0xEAFE, 0xEAFE, 0x11E6, 0xEBA1, 0xEBA3, 0x18BE, 0xEBA4, 0xEBA4, 0x11E8,\n    0xEBA5, 0xEBA6, 0x18C1, 0xEBA7, 0xEBA7, 0x11EA, 0xEBA8, 0xEBA8, 0x18C3,\n    0xEBA9, 0xEBA9, 0x11EC, 0xEBAA, 0xEBAA, 0x1058, 0xEBAB, 0xEBB9, 0x18C4,\n    0xEBBA, 0xEBBB, 0x11EE, 0xEBBC, 0xEBBC, 0x18D3, 0xEBBD, 0xEBBD, 0x11F0,\n    0xEBBE, 0xEBC0, 0x18D4, 0xEBC1, 0xEBC1, 0x11F1, 0xEBC2, 0xEBC2, 0x11F3,\n    0xEBC3, 0xEBC5, 0x18D7, 0xEBC6, 0xEBC7, 0x11F4, 0xEBC8, 0xEBCB, 0x18DA,\n    0xEBCC, 0xEBCC, 0x11F7, 0xEBCD, 0xEBCE, 0x18DE, 0xEBCF, 0xEBD1, 0x11F8,\n    0xEBD2, 0xEBD2, 0x15B0, 0xEBD3, 0xEBD7, 0x18E0, 0xEBD8, 0xEBD8, 0x11FB,\n    0xEBD9, 0xEBFE, 0x18E5, 0xECA1, 0xECA5, 0x190B, 0xECA6, 0xECA6, 0x1206,\n    0xECA7, 0xECA7, 0x1208, 0xECA8, 0xECA9, 0x1910, 0xECAA, 0xECAA, 0x120A,\n    0xECAB, 0xECAE, 0x1912, 0xECAF, 0xECAF, 0x173E, 0xECB0, 0xECB1, 0x120C,\n    0xECB2, 0xECB2, 0x105B, 0xECB3, 0xECB4, 0x1916, 0xECB5, 0xECB5, 0x1211,\n    0xECB6, 0xECB7, 0x1918, 0xECB8, 0xECB8, 0x1213, 0xECB9, 0xECB9, 0x191A,\n    0xECBA, 0xECBA, 0x1215, 0xECBB, 0xECBF, 0x191B, 0xECC0, 0xECC1, 0x1218,\n    0xECC2, 0xECC4, 0x1920, 0xECC5, 0xECC5, 0x121A, 0xECC6, 0xECC6, 0x121C,\n    0xECC7, 0xECC8, 0x1923, 0xECC9, 0xECCA, 0x105C, 0xECCB, 0xECD4, 0x1925,\n    0xECD5, 0xECD5, 0x121E, 0xECD6, 0xECDC, 0x192F, 0xECDD, 0xECDE, 0x1220,\n    0xECDF, 0xECE0, 0x1936, 0xECE1, 0xECE1, 0x1222, 0xECE2, 0xECE3, 0x1938,\n    0xECE4, 0xECE4, 0x1224, 0xECE5, 0xECE6, 0x193A, 0xECE7, 0xECE8, 0x1225,\n    0xECE9, 0xECF6, 0x193C, 0xECF7, 0xECF8, 0x1227, 0xECF9, 0xECF9, 0x194A,\n    0xECFA, 0xECFA, 0x122A, 0xECFB, 0xECFE, 0x194B, 0xEDA1, 0xEDA3, 0x122D,\n    0xEDA4, 0xEDED, 0x194F, 0xEDEE, 0xEDEE, 0x14E7, 0xEDEF, 0xEDFE, 0x1999,\n    0xEEA1, 0xEEDA, 0x19A9, 0xEEDB, 0xEEDB, 0x195E, 0xEEDC, 0xEEFE, 0x19E3,\n    0xEFA1, 0xEFFE, 0x1A06, 0xF0A1, 0xF0FE, 0x1A64, 0xF1A1, 0xF1FE, 0x1AC2,\n    0xF2A1, 0xF2BC, 0x1B20, 0xF2BD, 0xF2BD, 0x1663, 0xF2BE, 0xF2F9, 0x1B3C,\n    0xF2FA, 0xF2FA, 0x168B, 0xF2FB, 0xF2FE, 0x1B78, 0xF3A1, 0xF3B0, 0x1B7C,\n    0xF3B1, 0xF3B1, 0x105F, 0xF3B2, 0xF3FE, 0x1B8C, 0xF4A1, 0xF4A6, 0x1BD9,\n    0xF4A7, 0xF4A7, 0x1954, 0xF4A8, 0xF4ED, 0x1BDF, 0xF4EE, 0xF4EE, 0x1A1C,\n    0xF4EF, 0xF4FE, 0x1C25, 0xF5A1, 0xF5FE, 0x1C35, 0xF6A1, 0xF6F3, 0x1C93,\n    0xF6F4, 0xF6F4, 0x10B7, 0xF6F5, 0xF6F5, 0x1CE6, 0xF6F6, 0xF6F6, 0x1BE3,\n    0xF6F7, 0xF6FE, 0x1CE7, 0xF7A1, 0xF7B7, 0x1CEF, 0xF7B8, 0xF7B8, 0x1097,\n    0xF7B9, 0xF7C7, 0x1D06, 0xF7C8, 0xF7C8, 0x10AA, 0xF7C9, 0xF7D2, 0x1D15,\n    0xF7D3, 0xF7D3, 0x10F4, 0xF7D4, 0xF7FE, 0x1D1F, 0xF8A1, 0xF8DA, 0x1D4A,\n    0xF8DB, 0xF8DB, 0x1D94, 0xF8DC, 0xF8EF, 0x1D84, 0xF8F0, 0xF8F0, 0x13E0,\n    0xF8F1, 0xF8FE, 0x1D98, 0xF9A1, 0xF9FE, 0x1DA6, 0xFAA1, 0xFAA1, 0x1E1D,\n    0xFAA2, 0xFAA2, 0x0DE6, 0xFAA3, 0xFAE5, 0x1E04, 0xFAE6, 0xFAE6, 0x0E3C,\n    0xFAE7, 0xFAFE, 0x1E47, 0xFBA1, 0xFBFE, 0x1E5F, 0xFCA1, 0xFCA8, 0x1EBD,\n    0xFCA9, 0xFCA9, 0x0EE7, 0xFCAA, 0xFCFE, 0x1EC5, 0xFDA1, 0xFDFE, 0x1F1A,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-V_1.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_KSCms_UHC_V_1[16 * 3] = {\n    0xA1A2, 0xA1A3, 0x1F78, 0xA1A5, 0xA1A5, 0x1F7A, 0xA1A6, 0xA1A6, 0x2080,\n    0xA1A9, 0xA1AB, 0x1F7B, 0xA1AD, 0xA1AD, 0x1F7E, 0xA1B2, 0xA1BD, 0x1F7F,\n    0xA1EB, 0xA1EB, 0x1F8B, 0xA3A1, 0xA3A1, 0x1F8C, 0xA3A8, 0xA3A9, 0x1F8D,\n    0xA3AC, 0xA3AC, 0x1F8F, 0xA3AE, 0xA3AE, 0x1F90, 0xA3BA, 0xA3BF, 0x1F91,\n    0xA3DB, 0xA3DB, 0x1F97, 0xA3DD, 0xA3DD, 0x1F98, 0xA3DF, 0xA3DF, 0x1F99,\n    0xA3FB, 0xA3FE, 0x1F9A,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Korea1/KSCpc-EUC-H_0.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_KSCpc_EUC_H_0[509 * 3] = {\n    0x0020, 0x007E, 0x0001, 0x0081, 0x0083, 0x0060, 0x00FE, 0x00FF, 0x0063,\n    0xA141, 0xA17D, 0x1FFF, 0xA181, 0xA19A, 0x203C, 0xA19C, 0xA1A0, 0x2056,\n    0xA1A1, 0xA1A1, 0x0065, 0xA1A2, 0xA1A3, 0x205B, 0xA1A4, 0xA1FE, 0x0068,\n    0xA241, 0xA24C, 0x205D, 0xA2A1, 0xA2E5, 0x00C3, 0xA2E6, 0xA2FE, 0x2069,\n    0xA341, 0xA37D, 0x2082, 0xA381, 0xA39F, 0x20BF, 0xA3A1, 0xA3FE, 0x0108,\n    0xA441, 0xA47D, 0x20DE, 0xA481, 0xA49F, 0x211B, 0xA4A1, 0xA4D3, 0x0166,\n    0xA4D5, 0xA4FE, 0x0199, 0xA541, 0xA57D, 0x213A, 0xA581, 0xA58B, 0x2177,\n    0xA5A1, 0xA5AA, 0x01C3, 0xA5B0, 0xA5B9, 0x01CD, 0xA5C1, 0xA5D8, 0x01D7,\n    0xA5DA, 0xA5DE, 0x2182, 0xA5E1, 0xA5F8, 0x01EF, 0xA5F9, 0xA5FC, 0x2187,\n    0xA641, 0xA67D, 0x218B, 0xA681, 0xA68A, 0x21C8, 0xA68D, 0xA693, 0x21D2,\n    0xA696, 0xA69B, 0x21D9, 0xA69E, 0xA69F, 0x21DF, 0xA6A1, 0xA6E4, 0x0207,\n    0xA6E5, 0xA6FE, 0x21E1, 0xA741, 0xA77D, 0x21FB, 0xA781, 0xA79F, 0x2238,\n    0xA7A1, 0xA7EF, 0x024B, 0xA7F0, 0xA7FE, 0x2257, 0xA841, 0xA87D, 0x2266,\n    0xA881, 0xA89F, 0x22A3, 0xA8A1, 0xA8A4, 0x029A, 0xA8A6, 0xA8A6, 0x029E,\n    0xA8A8, 0xA8AF, 0x029F, 0xA8B1, 0xA8FE, 0x02A7, 0xA941, 0xA974, 0x22C2,\n    0xA9A1, 0xA9FE, 0x02F5, 0xAA41, 0xAA7D, 0x22F6, 0xAA81, 0xAA9F, 0x2333,\n    0xAAA1, 0xAAF3, 0x0353, 0xAAF4, 0xAAFE, 0x2352, 0xAB41, 0xAB7D, 0x235D,\n    0xAB81, 0xAB9F, 0x239A, 0xABA1, 0xABF6, 0x03A6, 0xABF7, 0xABFA, 0x23B9,\n    0xABFB, 0xABFD, 0x2472, 0xAC41, 0xAC7D, 0x23BD, 0xAC81, 0xAC97, 0x23FA,\n    0xACA1, 0xACC1, 0x03FC, 0xACC2, 0xACD0, 0x2411, 0xACD1, 0xACF1, 0x041D,\n    0xACF2, 0xACF6, 0x2420, 0xAD41, 0xAD7D, 0x2425, 0xADA1, 0xADB0, 0x2462,\n    0xB0A1, 0xB0FE, 0x043E, 0xB1A1, 0xB1FE, 0x049C, 0xB2A1, 0xB2FE, 0x04FA,\n    0xB3A1, 0xB3FE, 0x0558, 0xB4A1, 0xB4FE, 0x05B6, 0xB5A1, 0xB5FE, 0x0614,\n    0xB6A1, 0xB6FE, 0x0672, 0xB7A1, 0xB7FE, 0x06D0, 0xB8A1, 0xB8FE, 0x072E,\n    0xB9A1, 0xB9FE, 0x078C, 0xBAA1, 0xBAFE, 0x07EA, 0xBBA1, 0xBBFE, 0x0848,\n    0xBCA1, 0xBCFE, 0x08A6, 0xBDA1, 0xBDFE, 0x0904, 0xBEA1, 0xBEFE, 0x0962,\n    0xBFA1, 0xBFFE, 0x09C0, 0xC0A1, 0xC0FE, 0x0A1E, 0xC1A1, 0xC1FE, 0x0A7C,\n    0xC2A1, 0xC2FE, 0x0ADA, 0xC3A1, 0xC3FE, 0x0B38, 0xC4A1, 0xC4FE, 0x0B96,\n    0xC5A1, 0xC5FE, 0x0BF4, 0xC6A1, 0xC6FE, 0x0C52, 0xC7A1, 0xC7FE, 0x0CB0,\n    0xC8A1, 0xC8FE, 0x0D0E, 0xCAA1, 0xCAFE, 0x0D6C, 0xCBA1, 0xCBCF, 0x0DCA,\n    0xCBD0, 0xCBD0, 0x1014, 0xCBD1, 0xCBD5, 0x0DF9, 0xCBD6, 0xCBD6, 0x0E5E,\n    0xCBD7, 0xCBE6, 0x0DFE, 0xCBE7, 0xCBE7, 0x1B8D, 0xCBE8, 0xCBFE, 0x0E0E,\n    0xCCA1, 0xCCFE, 0x0E25, 0xCDA1, 0xCDCE, 0x0E83, 0xCDCF, 0xCDCF, 0x0D84,\n    0xCDD0, 0xCDE7, 0x0EB1, 0xCDE8, 0xCDE8, 0x1EDC, 0xCDE9, 0xCDFE, 0x0EC9,\n    0xCEA1, 0xCEAC, 0x0EDF, 0xCEAD, 0xCEAD, 0x0EDA, 0xCEAE, 0xCEFE, 0x0EEB,\n    0xCFA1, 0xCFFA, 0x0F3C, 0xCFFB, 0xCFFB, 0x0F3E, 0xCFFC, 0xCFFE, 0x0F96,\n    0xD0A1, 0xD0A1, 0x0F99, 0xD0A2, 0xD0A2, 0x0F6A, 0xD0A3, 0xD0B7, 0x0F9A,\n    0xD0B8, 0xD0B8, 0x0F6A, 0xD0B9, 0xD0CF, 0x0FAF, 0xD0D0, 0xD0D0, 0x0E7C,\n    0xD0D1, 0xD0DC, 0x0FC6, 0xD0DD, 0xD0DD, 0x1023, 0xD0DE, 0xD0FE, 0x0FD2,\n    0xD1A1, 0xD1D3, 0x0FF3, 0xD1D4, 0xD1D4, 0x1116, 0xD1D5, 0xD1D5, 0x103C,\n    0xD1D6, 0xD1D7, 0x1026, 0xD1D8, 0xD1D8, 0x1117, 0xD1D9, 0xD1DA, 0x1028,\n    0xD1DB, 0xD1E0, 0x1118, 0xD1E1, 0xD1E1, 0x102A, 0xD1E2, 0xD1E2, 0x16A8,\n    0xD1E3, 0xD1E5, 0x111E, 0xD1E6, 0xD1E6, 0x1122, 0xD1E7, 0xD1E7, 0x102B,\n    0xD1E8, 0xD1EB, 0x1123, 0xD1EC, 0xD1EC, 0x102C, 0xD1ED, 0xD1ED, 0x1127,\n    0xD1EE, 0xD1EE, 0x102D, 0xD1EF, 0xD1F0, 0x112A, 0xD1F1, 0xD1F1, 0x102E,\n    0xD1F2, 0xD1F2, 0x112C, 0xD1F3, 0xD1F5, 0x102F, 0xD1F6, 0xD1F6, 0x112F,\n    0xD1F7, 0xD1F9, 0x1032, 0xD1FA, 0xD1FA, 0x1133, 0xD1FB, 0xD1FB, 0x1035,\n    0xD1FC, 0xD1FD, 0x1136, 0xD1FE, 0xD1FE, 0x1139, 0xD2A1, 0xD2A1, 0x1036,\n    0xD2A2, 0xD2A3, 0x113A, 0xD2A4, 0xD2A6, 0x1037, 0xD2A7, 0xD2AA, 0x113C,\n    0xD2AB, 0xD2AB, 0x1143, 0xD2AC, 0xD2AC, 0x103A, 0xD2AD, 0xD2AD, 0x1144,\n    0xD2AE, 0xD2B1, 0x103B, 0xD2B2, 0xD2B2, 0x1148, 0xD2B3, 0xD2BD, 0x103F,\n    0xD2BE, 0xD2BE, 0x119F, 0xD2BF, 0xD2C1, 0x104A, 0xD2C2, 0xD2C3, 0x11A1,\n    0xD2C4, 0xD2C4, 0x11A5, 0xD2C5, 0xD2C5, 0x104D, 0xD2C6, 0xD2CA, 0x11A6,\n    0xD2CB, 0xD2CB, 0x11AC, 0xD2CC, 0xD2CC, 0x104E, 0xD2CD, 0xD2CE, 0x11AD,\n    0xD2CF, 0xD2D4, 0x11B0, 0xD2D5, 0xD2D7, 0x11B7, 0xD2D8, 0xD2D8, 0x104F,\n    0xD2D9, 0xD2DA, 0x11BD, 0xD2DB, 0xD2DD, 0x1050, 0xD2DE, 0xD2DF, 0x11C1,\n    0xD2E0, 0xD2E0, 0x1053, 0xD2E1, 0xD2E1, 0x11C3, 0xD2E2, 0xD2E2, 0x11C6,\n    0xD2E3, 0xD2E3, 0x1054, 0xD2E4, 0xD2E4, 0x11D4, 0xD2E5, 0xD2E8, 0x11D6,\n    0xD2E9, 0xD2EA, 0x11DB, 0xD2EB, 0xD2EB, 0x11E0, 0xD2EC, 0xD2EF, 0x1055,\n    0xD2F0, 0xD2F3, 0x11FC, 0xD2F4, 0xD2F5, 0x1201, 0xD2F6, 0xD2F6, 0x1059,\n    0xD2F7, 0xD2F8, 0x1203, 0xD2F9, 0xD2FE, 0x105A, 0xD3A1, 0xD3FE, 0x1060,\n    0xD4A1, 0xD4E5, 0x10BE, 0xD4E6, 0xD4E6, 0x10DE, 0xD4E7, 0xD4FB, 0x1103,\n    0xD4FC, 0xD4FC, 0x1028, 0xD4FD, 0xD4FE, 0x1118, 0xD5A1, 0xD5A4, 0x111A,\n    0xD5A5, 0xD5A5, 0x16A8, 0xD5A6, 0xD5AA, 0x111E, 0xD5AB, 0xD5AB, 0x102B,\n    0xD5AC, 0xD5AD, 0x1123, 0xD5AE, 0xD5AE, 0x1060, 0xD5AF, 0xD5FE, 0x1125,\n    0xD6A1, 0xD6B7, 0x1175, 0xD6B8, 0xD6B8, 0x1047, 0xD6B9, 0xD6CC, 0x118C,\n    0xD6CD, 0xD6CD, 0x104C, 0xD6CE, 0xD6FE, 0x11A0, 0xD7A1, 0xD7CA, 0x11D1,\n    0xD7CB, 0xD7CB, 0x15B0, 0xD7CC, 0xD7E3, 0x11FB, 0xD7E4, 0xD7E4, 0x1918,\n    0xD7E5, 0xD7FE, 0x1213, 0xD8A1, 0xD8FE, 0x122D, 0xD9A1, 0xD9FE, 0x128B,\n    0xDAA1, 0xDAFE, 0x12E9, 0xDBA1, 0xDBC4, 0x1347, 0xDBC5, 0xDBC5, 0x141F,\n    0xDBC6, 0xDBE3, 0x136B, 0xDBE4, 0xDBE4, 0x133A, 0xDBE5, 0xDBFE, 0x1389,\n    0xDCA1, 0xDCA4, 0x13A3, 0xDCA5, 0xDCA5, 0x1D5E, 0xDCA6, 0xDCFE, 0x13A7,\n    0xDDA1, 0xDDA4, 0x1400, 0xDDA5, 0xDDA5, 0x13D7, 0xDDA6, 0xDDD4, 0x1404,\n    0xDDD5, 0xDDD5, 0x13F5, 0xDDD6, 0xDDF3, 0x1433, 0xDDF4, 0xDDF4, 0x1DB7,\n    0xDDF5, 0xDDFE, 0x1451, 0xDEA1, 0xDEFB, 0x145B, 0xDEFC, 0xDEFC, 0x15D0,\n    0xDEFD, 0xDEFD, 0x14B6, 0xDEFE, 0xDEFE, 0x14F7, 0xDFA1, 0xDFB2, 0x14B7,\n    0xDFB3, 0xDFB3, 0x1BAB, 0xDFB4, 0xDFE0, 0x14C9, 0xDFE1, 0xDFE1, 0x14F2,\n    0xDFE2, 0xDFE7, 0x14F6, 0xDFE8, 0xDFE8, 0x156D, 0xDFE9, 0xDFFE, 0x14FC,\n    0xE0A1, 0xE0F0, 0x1512, 0xE0F1, 0xE0F1, 0x1771, 0xE0F2, 0xE0FE, 0x1562,\n    0xE1A1, 0xE1AC, 0x156F, 0xE1AD, 0xE1AD, 0x1554, 0xE1AE, 0xE1EC, 0x157B,\n    0xE1ED, 0xE1ED, 0x14C5, 0xE1EE, 0xE1FE, 0x15BA, 0xE2A1, 0xE2FE, 0x15CB,\n    0xE3A1, 0xE3F4, 0x1629, 0xE3F5, 0xE3F5, 0x1B61, 0xE3F6, 0xE3FE, 0x167D,\n    0xE4A1, 0xE4A1, 0x1CCA, 0xE4A2, 0xE4A8, 0x1686, 0xE4A9, 0xE4A9, 0x162E,\n    0xE4AA, 0xE4FE, 0x168D, 0xE5A1, 0xE5AD, 0x16E2, 0xE5AE, 0xE5AE, 0x16F2,\n    0xE5AF, 0xE5B0, 0x16EF, 0xE5B1, 0xE5B2, 0x1149, 0xE5B3, 0xE5B8, 0x16F1,\n    0xE5B9, 0xE5B9, 0x114B, 0xE5BA, 0xE5BA, 0x16F7, 0xE5BB, 0xE5BC, 0x114D,\n    0xE5BD, 0xE5C3, 0x16F8, 0xE5C4, 0xE5C4, 0x114F, 0xE5C5, 0xE5CD, 0x16FF,\n    0xE5CE, 0xE5CE, 0x1153, 0xE5CF, 0xE5CF, 0x1708, 0xE5D0, 0xE5D0, 0x1154,\n    0xE5D1, 0xE5D1, 0x1709, 0xE5D2, 0xE5D2, 0x1155, 0xE5D3, 0xE5D5, 0x170A,\n    0xE5D6, 0xE5D6, 0x1157, 0xE5D7, 0xE5F9, 0x170D, 0xE5FA, 0xE5FB, 0x115A,\n    0xE5FC, 0xE5FC, 0x103F, 0xE5FD, 0xE5FD, 0x1730, 0xE5FE, 0xE5FE, 0x115C,\n    0xE6A1, 0xE6A1, 0x115F, 0xE6A2, 0xE6A3, 0x1731, 0xE6A4, 0xE6A4, 0x1161,\n    0xE6A5, 0xE6A6, 0x1733, 0xE6A7, 0xE6A7, 0x1162, 0xE6A8, 0xE6AC, 0x1735,\n    0xE6AD, 0xE6AD, 0x1165, 0xE6AE, 0xE6AE, 0x173A, 0xE6AF, 0xE6B1, 0x1167,\n    0xE6B2, 0xE6B2, 0x173B, 0xE6B3, 0xE6B3, 0x116A, 0xE6B4, 0xE6B6, 0x173C,\n    0xE6B7, 0xE6B8, 0x116B, 0xE6B9, 0xE6BB, 0x173F, 0xE6BC, 0xE6BC, 0x116F,\n    0xE6BD, 0xE6C3, 0x1742, 0xE6C4, 0xE6C4, 0x1040, 0xE6C5, 0xE6C5, 0x1749,\n    0xE6C6, 0xE6C7, 0x1171, 0xE6C8, 0xE6C9, 0x174A, 0xE6CA, 0xE6CA, 0x1041,\n    0xE6CB, 0xE6D1, 0x174C, 0xE6D2, 0xE6D2, 0x1174, 0xE6D3, 0xE6D5, 0x1753,\n    0xE6D6, 0xE6D6, 0x1175, 0xE6D7, 0xE6D8, 0x1756, 0xE6D9, 0xE6D9, 0x1176,\n    0xE6DA, 0xE6DB, 0x1758, 0xE6DC, 0xE6DC, 0x1042, 0xE6DD, 0xE6DE, 0x175A,\n    0xE6DF, 0xE6DF, 0x1177, 0xE6E0, 0xE6E0, 0x175C, 0xE6E1, 0xE6E1, 0x1178,\n    0xE6E2, 0xE6E3, 0x175D, 0xE6E4, 0xE6E4, 0x117A, 0xE6E5, 0xE6E5, 0x1179,\n    0xE6E6, 0xE6E6, 0x117B, 0xE6E7, 0xE6E7, 0x175F, 0xE6E8, 0xE6E8, 0x117C,\n    0xE6E9, 0xE6E9, 0x1760, 0xE6EA, 0xE6EB, 0x117E, 0xE6EC, 0xE6EC, 0x192F,\n    0xE6ED, 0xE6EE, 0x1761, 0xE6EF, 0xE6EF, 0x1181, 0xE6F0, 0xE6F0, 0x1763,\n    0xE6F1, 0xE6F1, 0x1182, 0xE6F2, 0xE6F2, 0x1554, 0xE6F3, 0xE6F4, 0x1764,\n    0xE6F5, 0xE6F5, 0x1183, 0xE6F6, 0xE6F6, 0x1043, 0xE6F7, 0xE6F7, 0x1046,\n    0xE6F8, 0xE6F8, 0x1766, 0xE6F9, 0xE6F9, 0x1185, 0xE6FA, 0xE6FE, 0x1767,\n    0xE7A1, 0xE7A1, 0x1187, 0xE7A2, 0xE7A5, 0x176C, 0xE7A6, 0xE7A6, 0x1188,\n    0xE7A7, 0xE7A8, 0x1770, 0xE7A9, 0xE7A9, 0x1189, 0xE7AA, 0xE7AA, 0x118B,\n    0xE7AB, 0xE7AB, 0x1772, 0xE7AC, 0xE7AC, 0x1047, 0xE7AD, 0xE7AD, 0x118D,\n    0xE7AE, 0xE7AF, 0x1773, 0xE7B0, 0xE7B0, 0x118E, 0xE7B1, 0xE7BE, 0x1775,\n    0xE7BF, 0xE7BF, 0x118F, 0xE7C0, 0xE7C0, 0x1783, 0xE7C1, 0xE7C1, 0x1E67,\n    0xE7C2, 0xE7C5, 0x1784, 0xE7C6, 0xE7C6, 0x1191, 0xE7C7, 0xE7C7, 0x1193,\n    0xE7C8, 0xE7CA, 0x1788, 0xE7CB, 0xE7CB, 0x1195, 0xE7CC, 0xE7CC, 0x178B,\n    0xE7CD, 0xE7CD, 0x1196, 0xE7CE, 0xE7CE, 0x178C, 0xE7CF, 0xE7D0, 0x1197,\n    0xE7D1, 0xE7D2, 0x178D, 0xE7D3, 0xE7D3, 0x119A, 0xE7D4, 0xE7DE, 0x178F,\n    0xE7DF, 0xE7DF, 0x119C, 0xE7E0, 0xE7E3, 0x179A, 0xE7E4, 0xE7E4, 0x119D,\n    0xE7E5, 0xE7E5, 0x179E, 0xE7E6, 0xE7E6, 0x119E, 0xE7E7, 0xE7F6, 0x179F,\n    0xE7F7, 0xE7F7, 0x16A5, 0xE7F8, 0xE7FE, 0x17AF, 0xE8A1, 0xE8E6, 0x17B6,\n    0xE8E7, 0xE8E8, 0x11C7, 0xE8E9, 0xE8EF, 0x17FC, 0xE8F0, 0xE8F0, 0x11C9,\n    0xE8F1, 0xE8F1, 0x1054, 0xE8F2, 0xE8F6, 0x1803, 0xE8F7, 0xE8F7, 0x11CB,\n    0xE8F8, 0xE8F8, 0x1808, 0xE8F9, 0xE8F9, 0x16A8, 0xE8FA, 0xE8FA, 0x1809,\n    0xE8FB, 0xE8FB, 0x11CC, 0xE8FC, 0xE8FD, 0x180A, 0xE8FE, 0xE8FE, 0x11CD,\n    0xE9A1, 0xE9A6, 0x180C, 0xE9A7, 0xE9A7, 0x11D0, 0xE9A8, 0xE9AB, 0x1812,\n    0xE9AC, 0xE9AC, 0x11D1, 0xE9AD, 0xE9CB, 0x1816, 0xE9CC, 0xE9CC, 0x11D3,\n    0xE9CD, 0xE9F6, 0x1835, 0xE9F7, 0xE9F7, 0x1F34, 0xE9F8, 0xE9FE, 0x185F,\n    0xEAA1, 0xEAC0, 0x1866, 0xEAC1, 0xEAC1, 0x17EB, 0xEAC2, 0xEAE4, 0x1886,\n    0xEAE5, 0xEAE5, 0x11E1, 0xEAE6, 0xEAF3, 0x18A9, 0xEAF4, 0xEAF4, 0x1057,\n    0xEAF5, 0xEAF6, 0x18B7, 0xEAF7, 0xEAF7, 0x11E3, 0xEAF8, 0xEAFB, 0x18B9,\n    0xEAFC, 0xEAFC, 0x11E5, 0xEAFD, 0xEAFD, 0x18BD, 0xEAFE, 0xEAFE, 0x11E6,\n    0xEBA1, 0xEBA3, 0x18BE, 0xEBA4, 0xEBA4, 0x11E8, 0xEBA5, 0xEBA6, 0x18C1,\n    0xEBA7, 0xEBA7, 0x11EA, 0xEBA8, 0xEBA8, 0x18C3, 0xEBA9, 0xEBA9, 0x11EC,\n    0xEBAA, 0xEBAA, 0x1058, 0xEBAB, 0xEBB9, 0x18C4, 0xEBBA, 0xEBBB, 0x11EE,\n    0xEBBC, 0xEBBC, 0x18D3, 0xEBBD, 0xEBBD, 0x11F0, 0xEBBE, 0xEBC0, 0x18D4,\n    0xEBC1, 0xEBC1, 0x11F1, 0xEBC2, 0xEBC2, 0x11F3, 0xEBC3, 0xEBC5, 0x18D7,\n    0xEBC6, 0xEBC7, 0x11F4, 0xEBC8, 0xEBCB, 0x18DA, 0xEBCC, 0xEBCC, 0x11F7,\n    0xEBCD, 0xEBCE, 0x18DE, 0xEBCF, 0xEBD1, 0x11F8, 0xEBD2, 0xEBD2, 0x15B0,\n    0xEBD3, 0xEBD7, 0x18E0, 0xEBD8, 0xEBD8, 0x11FB, 0xEBD9, 0xEBFE, 0x18E5,\n    0xECA1, 0xECA5, 0x190B, 0xECA6, 0xECA6, 0x1206, 0xECA7, 0xECA7, 0x1208,\n    0xECA8, 0xECA9, 0x1910, 0xECAA, 0xECAA, 0x120A, 0xECAB, 0xECAE, 0x1912,\n    0xECAF, 0xECAF, 0x173E, 0xECB0, 0xECB1, 0x120C, 0xECB2, 0xECB2, 0x105B,\n    0xECB3, 0xECB4, 0x1916, 0xECB5, 0xECB5, 0x1211, 0xECB6, 0xECB7, 0x1918,\n    0xECB8, 0xECB8, 0x1213, 0xECB9, 0xECB9, 0x191A, 0xECBA, 0xECBA, 0x1215,\n    0xECBB, 0xECBF, 0x191B, 0xECC0, 0xECC1, 0x1218, 0xECC2, 0xECC4, 0x1920,\n    0xECC5, 0xECC5, 0x121A, 0xECC6, 0xECC6, 0x121C, 0xECC7, 0xECC8, 0x1923,\n    0xECC9, 0xECCA, 0x105C, 0xECCB, 0xECD4, 0x1925, 0xECD5, 0xECD5, 0x121E,\n    0xECD6, 0xECDC, 0x192F, 0xECDD, 0xECDE, 0x1220, 0xECDF, 0xECE0, 0x1936,\n    0xECE1, 0xECE1, 0x1222, 0xECE2, 0xECE3, 0x1938, 0xECE4, 0xECE4, 0x1224,\n    0xECE5, 0xECE6, 0x193A, 0xECE7, 0xECE8, 0x1225, 0xECE9, 0xECF6, 0x193C,\n    0xECF7, 0xECF8, 0x1227, 0xECF9, 0xECF9, 0x194A, 0xECFA, 0xECFA, 0x122A,\n    0xECFB, 0xECFE, 0x194B, 0xEDA1, 0xEDA3, 0x122D, 0xEDA4, 0xEDED, 0x194F,\n    0xEDEE, 0xEDEE, 0x14E7, 0xEDEF, 0xEDFE, 0x1999, 0xEEA1, 0xEEDA, 0x19A9,\n    0xEEDB, 0xEEDB, 0x195E, 0xEEDC, 0xEEFE, 0x19E3, 0xEFA1, 0xEFFE, 0x1A06,\n    0xF0A1, 0xF0FE, 0x1A64, 0xF1A1, 0xF1FE, 0x1AC2, 0xF2A1, 0xF2BC, 0x1B20,\n    0xF2BD, 0xF2BD, 0x1663, 0xF2BE, 0xF2F9, 0x1B3C, 0xF2FA, 0xF2FA, 0x168B,\n    0xF2FB, 0xF2FE, 0x1B78, 0xF3A1, 0xF3B0, 0x1B7C, 0xF3B1, 0xF3B1, 0x105F,\n    0xF3B2, 0xF3FE, 0x1B8C, 0xF4A1, 0xF4A6, 0x1BD9, 0xF4A7, 0xF4A7, 0x1954,\n    0xF4A8, 0xF4ED, 0x1BDF, 0xF4EE, 0xF4EE, 0x1A1C, 0xF4EF, 0xF4FE, 0x1C25,\n    0xF5A1, 0xF5FE, 0x1C35, 0xF6A1, 0xF6F3, 0x1C93, 0xF6F4, 0xF6F4, 0x10B7,\n    0xF6F5, 0xF6F5, 0x1CE6, 0xF6F6, 0xF6F6, 0x1BE3, 0xF6F7, 0xF6FE, 0x1CE7,\n    0xF7A1, 0xF7B7, 0x1CEF, 0xF7B8, 0xF7B8, 0x1097, 0xF7B9, 0xF7C7, 0x1D06,\n    0xF7C8, 0xF7C8, 0x10AA, 0xF7C9, 0xF7D2, 0x1D15, 0xF7D3, 0xF7D3, 0x10F4,\n    0xF7D4, 0xF7FE, 0x1D1F, 0xF8A1, 0xF8DA, 0x1D4A, 0xF8DB, 0xF8DB, 0x1D94,\n    0xF8DC, 0xF8EF, 0x1D84, 0xF8F0, 0xF8F0, 0x13E0, 0xF8F1, 0xF8FE, 0x1D98,\n    0xF9A1, 0xF9FE, 0x1DA6, 0xFAA1, 0xFAA1, 0x1E1D, 0xFAA2, 0xFAA2, 0x0DE6,\n    0xFAA3, 0xFAE5, 0x1E04, 0xFAE6, 0xFAE6, 0x0E3C, 0xFAE7, 0xFAFE, 0x1E47,\n    0xFBA1, 0xFBFE, 0x1E5F, 0xFCA1, 0xFCA8, 0x1EBD, 0xFCA9, 0xFCA9, 0x0EE7,\n    0xFCAA, 0xFCFE, 0x1EC5, 0xFDA1, 0xFDFE, 0x1F1A,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-H_1.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_UniKS_UCS2_H_1[8394 * 3] = {\n    0x0020, 0x007E, 0x0001, 0x00A1, 0x00A1, 0x00D0, 0x00A4, 0x00A4, 0x00D6,\n    0x00A7, 0x00A7, 0x009B, 0x00A8, 0x00A8, 0x006B, 0x00AA, 0x00AA, 0x029C,\n    0x00AB, 0x00AB, 0x00B0, 0x00B0, 0x00B0, 0x008A, 0x00B1, 0x00B1, 0x0082,\n    0x00B2, 0x00B3, 0x034B, 0x00B4, 0x00B4, 0x00C7, 0x00B6, 0x00B6, 0x00F4,\n    0x00B8, 0x00B8, 0x00CE, 0x00B9, 0x00B9, 0x034A, 0x00BA, 0x00BA, 0x02A3,\n    0x00BB, 0x00BB, 0x00B1, 0x00BC, 0x00BC, 0x02EF, 0x00BD, 0x00BD, 0x02EC,\n    0x00BE, 0x00BE, 0x02F0, 0x00BF, 0x00BF, 0x00D1, 0x00C6, 0x00C6, 0x029A,\n    0x00D0, 0x00D0, 0x029B, 0x00D7, 0x00D7, 0x0083, 0x00D8, 0x00D8, 0x02A1,\n    0x00DE, 0x00DE, 0x02A4, 0x00DF, 0x00DF, 0x0300, 0x00E6, 0x00E6, 0x02F5,\n    0x00F0, 0x00F0, 0x02F7, 0x00F7, 0x00F7, 0x0084, 0x00F8, 0x00F8, 0x02FE,\n    0x00FE, 0x00FE, 0x0301, 0x0111, 0x0111, 0x02F6, 0x0126, 0x0126, 0x029D,\n    0x0127, 0x0127, 0x02F8, 0x0131, 0x0131, 0x02F9, 0x0132, 0x0132, 0x029E,\n    0x0133, 0x0133, 0x02FA, 0x0138, 0x0138, 0x02FB, 0x013F, 0x013F, 0x029F,\n    0x0140, 0x0140, 0x02FC, 0x0141, 0x0141, 0x02A0, 0x0142, 0x0142, 0x02FD,\n    0x0149, 0x0149, 0x0304, 0x014A, 0x014A, 0x02A6, 0x014B, 0x014B, 0x0303,\n    0x0152, 0x0152, 0x02A2, 0x0153, 0x0153, 0x02FF, 0x0166, 0x0166, 0x02A5,\n    0x0167, 0x0167, 0x0302, 0x02BC, 0x02BC, 0x2053, 0x02C7, 0x02C7, 0x00C9,\n    0x02D8, 0x02D8, 0x00CA, 0x02D9, 0x02D9, 0x00CD, 0x02DA, 0x02DA, 0x00CC,\n    0x02DB, 0x02DB, 0x00CF, 0x02DC, 0x02DC, 0x00C8, 0x02DD, 0x02DD, 0x00CB,\n    0x0391, 0x03A1, 0x01D7, 0x03A3, 0x03A9, 0x01E8, 0x03B1, 0x03C1, 0x01EF,\n    0x03C3, 0x03C9, 0x0200, 0x0401, 0x0401, 0x0402, 0x0410, 0x0415, 0x03FC,\n    0x0416, 0x0435, 0x0403, 0x0436, 0x044F, 0x0424, 0x0451, 0x0451, 0x0423,\n    0x2013, 0x2014, 0x006D, 0x2016, 0x2016, 0x006F, 0x2018, 0x2019, 0x0072,\n    0x201B, 0x201B, 0x202E, 0x201C, 0x201D, 0x0074, 0x201F, 0x201F, 0x202D,\n    0x2020, 0x2021, 0x00F5, 0x2022, 0x2022, 0x219F, 0x2025, 0x2026, 0x0069,\n    0x2030, 0x2030, 0x00D8, 0x2032, 0x2033, 0x008B, 0x2034, 0x2034, 0x2186,\n    0x2035, 0x2035, 0x246E, 0x2036, 0x2036, 0x246C, 0x2039, 0x203A, 0x21A4,\n    0x203B, 0x203B, 0x009C, 0x203C, 0x203C, 0x223B, 0x2042, 0x2042, 0x2197,\n    0x2074, 0x2074, 0x034D, 0x207A, 0x207B, 0x202F, 0x207C, 0x207C, 0x2038,\n    0x207D, 0x207E, 0x203A, 0x207F, 0x207F, 0x034E, 0x2081, 0x2084, 0x034F,\n    0x2103, 0x2103, 0x008D, 0x2109, 0x2109, 0x00D7, 0x2113, 0x2113, 0x024E,\n    0x2116, 0x2116, 0x0102, 0x2121, 0x2121, 0x0107, 0x2122, 0x2122, 0x0104,\n    0x2126, 0x2126, 0x0283, 0x212B, 0x212B, 0x008E, 0x2153, 0x2154, 0x02ED,\n    0x215B, 0x215E, 0x02F1, 0x2160, 0x2169, 0x01CD, 0x2170, 0x2179, 0x01C3,\n    0x2190, 0x2191, 0x00AB, 0x2192, 0x2192, 0x00AA, 0x2193, 0x2194, 0x00AD,\n    0x2195, 0x2195, 0x00F7, 0x2196, 0x2196, 0x00FA, 0x2197, 0x2197, 0x00F8,\n    0x2198, 0x2198, 0x00FB, 0x2199, 0x2199, 0x00F9, 0x21B0, 0x21B0, 0x22A4,\n    0x21B1, 0x21B1, 0x22A1, 0x21B2, 0x21B2, 0x22A0, 0x21B3, 0x21B3, 0x22A5,\n    0x21B4, 0x21B4, 0x22A3, 0x21BC, 0x21BC, 0x22B4, 0x21C0, 0x21C0, 0x22B5,\n    0x21C4, 0x21C5, 0x22C0, 0x21CD, 0x21CD, 0x2270, 0x21CF, 0x21CF, 0x226F,\n    0x21D0, 0x21D0, 0x226E, 0x21D1, 0x21D1, 0x2296, 0x21D2, 0x21D2, 0x00C3,\n    0x21D3, 0x21D3, 0x2297, 0x21D4, 0x21D4, 0x00C4, 0x21E0, 0x21E0, 0x23E6,\n    0x21E1, 0x21E1, 0x23E8, 0x21E2, 0x21E2, 0x23E7, 0x21E3, 0x21E3, 0x23E9,\n    0x21E6, 0x21E6, 0x23EE, 0x21E7, 0x21E7, 0x23F0, 0x21E8, 0x21E8, 0x23EF,\n    0x21E9, 0x21E9, 0x23F1, 0x2200, 0x2200, 0x00C5, 0x2202, 0x2202, 0x0097,\n    0x2203, 0x2203, 0x00C6, 0x2206, 0x2206, 0x220B, 0x2207, 0x2207, 0x0098,\n    0x2208, 0x2208, 0x00B8, 0x2209, 0x2209, 0x222D, 0x220B, 0x220B, 0x00B9,\n    0x220C, 0x220C, 0x222E, 0x220F, 0x220F, 0x00D5, 0x2211, 0x2211, 0x00D4,\n    0x2213, 0x2213, 0x2216, 0x221A, 0x221A, 0x00B2, 0x221D, 0x221D, 0x00B4,\n    0x221E, 0x221E, 0x0088, 0x221F, 0x221F, 0x220D, 0x2220, 0x2220, 0x0094,\n    0x2222, 0x2222, 0x2222, 0x2225, 0x2226, 0x220F, 0x2227, 0x2228, 0x00C0,\n    0x2229, 0x2229, 0x00BF, 0x222A, 0x222A, 0x00BE, 0x222B, 0x222C, 0x00B6,\n    0x222E, 0x222E, 0x00D3, 0x2234, 0x2234, 0x0089, 0x2235, 0x2235, 0x00B5,\n    0x2236, 0x2236, 0x00D2, 0x2237, 0x2237, 0x2081, 0x223D, 0x223D, 0x00B3,\n    0x2243, 0x2243, 0x2134, 0x2245, 0x2245, 0x2133, 0x2248, 0x2248, 0x2135,\n    0x2250, 0x2250, 0x2223, 0x2251, 0x2251, 0x2213, 0x2252, 0x2252, 0x009A,\n    0x2253, 0x2253, 0x2212, 0x225A, 0x225A, 0x2231, 0x2260, 0x2260, 0x0085,\n    0x2261, 0x2261, 0x0099, 0x2262, 0x2262, 0x221E, 0x2264, 0x2265, 0x0086,\n    0x2266, 0x2267, 0x2214, 0x226E, 0x226F, 0x2229, 0x2270, 0x2273, 0x2121,\n    0x2276, 0x2277, 0x2129, 0x2279, 0x2279, 0x212B, 0x227A, 0x227B, 0x211B,\n    0x2280, 0x2281, 0x211F, 0x2282, 0x2283, 0x00BC, 0x2284, 0x2284, 0x222C,\n    0x2285, 0x2285, 0x222B, 0x2286, 0x2287, 0x00BA, 0x228A, 0x228A, 0x2126,\n    0x228B, 0x228B, 0x2128, 0x2295, 0x2297, 0x2217, 0x22A3, 0x22A3, 0x2226,\n    0x22A4, 0x22A4, 0x2137, 0x22A5, 0x22A5, 0x0095, 0x22BB, 0x22BC, 0x222F,\n    0x22CE, 0x22CF, 0x211D, 0x22DA, 0x22DB, 0x212C, 0x22EE, 0x22EE, 0x2080,\n    0x22EF, 0x22EF, 0x006A, 0x2306, 0x2306, 0x2232, 0x2312, 0x2312, 0x0096,\n    0x2314, 0x2314, 0x221B, 0x2460, 0x246E, 0x02DD, 0x246F, 0x2473, 0x2257,\n    0x2474, 0x2482, 0x033B, 0x2483, 0x2487, 0x2352, 0x249C, 0x24B5, 0x0321,\n    0x24B6, 0x24CF, 0x20C4, 0x24D0, 0x24E9, 0x02C3, 0x2500, 0x2500, 0x0207,\n    0x2501, 0x2501, 0x0212, 0x2502, 0x2502, 0x0208, 0x2503, 0x2503, 0x0213,\n    0x250C, 0x250C, 0x0209, 0x250D, 0x250D, 0x022E, 0x250E, 0x250E, 0x022D,\n    0x250F, 0x250F, 0x0214, 0x2510, 0x2510, 0x020A, 0x2511, 0x2511, 0x0228,\n    0x2512, 0x2512, 0x0227, 0x2513, 0x2513, 0x0215, 0x2514, 0x2514, 0x020C,\n    0x2515, 0x2515, 0x022C, 0x2516, 0x2516, 0x022B, 0x2517, 0x2517, 0x0217,\n    0x2518, 0x2518, 0x020B, 0x2519, 0x2519, 0x022A, 0x251A, 0x251A, 0x0229,\n    0x251B, 0x251B, 0x0216, 0x251C, 0x251C, 0x020D, 0x251D, 0x251D, 0x0222,\n    0x251E, 0x251F, 0x022F, 0x2520, 0x2520, 0x021D, 0x2521, 0x2522, 0x0231,\n    0x2523, 0x2523, 0x0218, 0x2524, 0x2524, 0x020F, 0x2525, 0x2525, 0x0224,\n    0x2526, 0x2527, 0x0233, 0x2528, 0x2528, 0x021F, 0x2529, 0x252A, 0x0235,\n    0x252B, 0x252B, 0x021A, 0x252C, 0x252C, 0x020E, 0x252D, 0x252E, 0x0237,\n    0x252F, 0x252F, 0x021E, 0x2530, 0x2530, 0x0223, 0x2531, 0x2532, 0x0239,\n    0x2533, 0x2533, 0x0219, 0x2534, 0x2534, 0x0210, 0x2535, 0x2536, 0x023B,\n    0x2537, 0x2537, 0x0220, 0x2538, 0x2538, 0x0225, 0x2539, 0x253A, 0x023D,\n    0x253B, 0x253B, 0x021B, 0x253C, 0x253C, 0x0211, 0x253D, 0x253E, 0x023F,\n    0x253F, 0x253F, 0x0221, 0x2540, 0x2541, 0x0241, 0x2542, 0x2542, 0x0226,\n    0x2543, 0x254A, 0x0243, 0x254B, 0x254B, 0x021C, 0x2592, 0x2592, 0x00E8,\n    0x25A0, 0x25A0, 0x00A5, 0x25A1, 0x25A1, 0x00A4, 0x25A3, 0x25A3, 0x00E5,\n    0x25A4, 0x25A5, 0x00E9, 0x25A6, 0x25A6, 0x00ED, 0x25A7, 0x25A7, 0x00EC,\n    0x25A8, 0x25A8, 0x00EB, 0x25A9, 0x25A9, 0x00EE, 0x25B1, 0x25B1, 0x2220,\n    0x25B2, 0x25B2, 0x00A7, 0x25B3, 0x25B3, 0x00A6, 0x25B5, 0x25B5, 0x224C,\n    0x25B6, 0x25B6, 0x00DC, 0x25B7, 0x25B7, 0x00DB, 0x25B9, 0x25B9, 0x224D,\n    0x25BC, 0x25BC, 0x00A9, 0x25BD, 0x25BD, 0x00A8, 0x25BF, 0x25BF, 0x224B,\n    0x25C0, 0x25C0, 0x00DA, 0x25C1, 0x25C1, 0x00D9, 0x25C3, 0x25C3, 0x224E,\n    0x25C6, 0x25C6, 0x00A3, 0x25C7, 0x25C7, 0x00A2, 0x25C8, 0x25C8, 0x00E4,\n    0x25C9, 0x25C9, 0x00E3, 0x25CA, 0x25CA, 0x2253, 0x25CB, 0x25CB, 0x009F,\n    0x25CC, 0x25CC, 0x21BF, 0x25CE, 0x25CE, 0x00A1, 0x25CF, 0x25CF, 0x00A0,\n    0x25D0, 0x25D1, 0x00E6, 0x25E6, 0x25E6, 0x2247, 0x25EF, 0x25EF, 0x21B9,\n    0x2605, 0x2605, 0x009E, 0x2606, 0x2606, 0x009D, 0x260E, 0x260E, 0x00F1,\n    0x260F, 0x260F, 0x00F0, 0x261C, 0x261C, 0x00F2, 0x261D, 0x261D, 0x2406,\n    0x261E, 0x261E, 0x00F3, 0x261F, 0x261F, 0x2407, 0x262F, 0x262F, 0x21D8,\n    0x2640, 0x2640, 0x0093, 0x2642, 0x2642, 0x0092, 0x2660, 0x2661, 0x00DE,\n    0x2663, 0x2663, 0x00E2, 0x2664, 0x2664, 0x00DD, 0x2665, 0x2665, 0x00E0,\n    0x2667, 0x2667, 0x00E1, 0x2668, 0x2668, 0x00EF, 0x2669, 0x266A, 0x00FD,\n    0x266C, 0x266C, 0x00FF, 0x266D, 0x266D, 0x00FC, 0x266F, 0x266F, 0x2192,\n    0x2716, 0x2716, 0x21B7, 0x271A, 0x271A, 0x21B6, 0x273D, 0x273D, 0x219C,\n    0x2756, 0x2756, 0x21BD, 0x2776, 0x277F, 0x21E1, 0x278A, 0x2793, 0x2096,\n    0x3000, 0x3002, 0x0065, 0x3003, 0x3003, 0x006C, 0x3008, 0x3011, 0x0078,\n    0x3012, 0x3012, 0x21FC, 0x3013, 0x3013, 0x00AF, 0x3014, 0x3015, 0x0076,\n    0x3016, 0x3019, 0x201B, 0x301E, 0x301F, 0x246A, 0x3020, 0x3020, 0x21DF,\n    0x3036, 0x3036, 0x21FD, 0x3041, 0x3093, 0x0353, 0x30A1, 0x30F6, 0x03A6,\n    0x30FB, 0x30FB, 0x0068, 0x30FC, 0x30FC, 0x2472, 0x3131, 0x3163, 0x0166,\n    0x3164, 0x3164, 0x0065, 0x3165, 0x318E, 0x0199, 0x3200, 0x321B, 0x0305,\n    0x321C, 0x321C, 0x0101, 0x3231, 0x3231, 0x2254, 0x3239, 0x3239, 0x2255,\n    0x3260, 0x327B, 0x02A7, 0x327F, 0x327F, 0x0100, 0x328A, 0x328F, 0x2455,\n    0x3290, 0x3290, 0x2454, 0x3294, 0x3294, 0x2378, 0x329E, 0x329E, 0x2239,\n    0x32A5, 0x32A5, 0x2388, 0x3380, 0x3384, 0x0273, 0x3388, 0x3389, 0x0264,\n    0x338A, 0x338C, 0x0286, 0x338D, 0x338F, 0x0260, 0x3390, 0x3394, 0x027E,\n    0x3395, 0x3397, 0x024B, 0x3398, 0x3398, 0x024F, 0x3399, 0x33A2, 0x0255,\n    0x33A3, 0x33A6, 0x0251, 0x33A7, 0x33A8, 0x0267, 0x33A9, 0x33AC, 0x028F,\n    0x33AD, 0x33AF, 0x028B, 0x33B0, 0x33B9, 0x0269, 0x33BA, 0x33BF, 0x0278,\n    0x33C0, 0x33C1, 0x0284, 0x33C2, 0x33C2, 0x0105, 0x33C3, 0x33C3, 0x0296,\n    0x33C4, 0x33C4, 0x0250, 0x33C5, 0x33C5, 0x028A, 0x33C6, 0x33C6, 0x0299,\n    0x33C7, 0x33C7, 0x0103, 0x33C8, 0x33C8, 0x0266, 0x33C9, 0x33C9, 0x0297,\n    0x33CA, 0x33CA, 0x025F, 0x33CB, 0x33CB, 0x2256, 0x33CF, 0x33CF, 0x0263,\n    0x33D0, 0x33D0, 0x0294, 0x33D3, 0x33D3, 0x0295, 0x33D6, 0x33D6, 0x0289,\n    0x33D8, 0x33D8, 0x0106, 0x33DB, 0x33DB, 0x028E, 0x33DC, 0x33DC, 0x0298,\n    0x33DD, 0x33DD, 0x0293, 0x4E00, 0x4E00, 0x193C, 0x4E01, 0x4E01, 0x1A30,\n    0x4E03, 0x4E03, 0x1CC4, 0x4E07, 0x4E07, 0x123E, 0x4E08, 0x4E08, 0x1986,\n    0x4E09, 0x4E09, 0x14C8, 0x4E0A, 0x4E0A, 0x14D3, 0x4E0B, 0x4E0B, 0x1DC0,\n    0x4E0D, 0x4E0D, 0x13F5, 0x4E11, 0x4E11, 0x1C78, 0x4E14, 0x4E14, 0x1B81,\n    0x4E15, 0x4E15, 0x143D, 0x4E16, 0x4E16, 0x1574, 0x4E18, 0x4E18, 0x0F35,\n    0x4E19, 0x4E19, 0x13B1, 0x4E1E, 0x4E1E, 0x1632, 0x4E2D, 0x4E2D, 0x1B0A,\n    0x4E32, 0x4E32, 0x0EDA, 0x4E38, 0x4E38, 0x1ECA, 0x4E39, 0x4E39, 0x1060,\n    0x4E3B, 0x4E3B, 0x1ACC, 0x4E42, 0x4E42, 0x178D, 0x4E43, 0x4E43, 0x103A,\n    0x4E45, 0x4E45, 0x0F36, 0x4E4B, 0x4E4B, 0x1B1E, 0x4E4D, 0x4E4D, 0x1479,\n    0x4E4E, 0x4E4E, 0x1E78, 0x4E4F, 0x4E4F, 0x1DBE, 0x4E56, 0x4E56, 0x0F0F,\n    0x4E58, 0x4E58, 0x1633, 0x4E59, 0x4E59, 0x18EC, 0x4E5D, 0x4E5D, 0x0F37,\n    0x4E5E, 0x4E5E, 0x0E1D, 0x4E5F, 0x4E5F, 0x16E6, 0x4E6B, 0x4E6B, 0x0DAC,\n    0x4E6D, 0x4E6D, 0x10E9, 0x4E73, 0x4E73, 0x18A5, 0x4E76, 0x4E76, 0x13E4,\n    0x4E77, 0x4E77, 0x14C3, 0x4E7E, 0x4E7E, 0x0E11, 0x4E82, 0x4E82, 0x1125,\n    0x4E86, 0x4E86, 0x11C7, 0x4E88, 0x4E88, 0x172E, 0x4E8B, 0x4E8B, 0x147A,\n    0x4E8C, 0x4E8C, 0x190D, 0x4E8E, 0x4E8E, 0x1835, 0x4E90, 0x4E90, 0x186C,\n    0x4E91, 0x4E91, 0x185E, 0x4E92, 0x4E92, 0x1E79, 0x4E94, 0x4E94, 0x17A1,\n    0x4E95, 0x4E95, 0x1A31, 0x4E98, 0x4E98, 0x0FDA, 0x4E9B, 0x4E9B, 0x147B,\n    0x4E9E, 0x4E9E, 0x168F, 0x4EA1, 0x4EA1, 0x1258, 0x4EA2, 0x4EA2, 0x1DF6,\n    0x4EA4, 0x4EA4, 0x0F1C, 0x4EA5, 0x4EA5, 0x1E05, 0x4EA6, 0x4EA6, 0x173B,\n    0x4EA8, 0x4EA8, 0x1E5B, 0x4EAB, 0x4EAB, 0x1E1E, 0x4EAC, 0x4EAC, 0x0E4C,\n    0x4EAD, 0x4EAD, 0x1A32, 0x4EAE, 0x4EAE, 0x114B, 0x4EB6, 0x4EB6, 0x1061,\n    0x4EBA, 0x4EBA, 0x192B, 0x4EC0, 0x4EC0, 0x168B, 0x4EC1, 0x4EC1, 0x192C,\n    0x4EC4, 0x4EC4, 0x1CA3, 0x4EC7, 0x4EC7, 0x0F38, 0x4ECA, 0x4ECA, 0x0FC6,\n    0x4ECB, 0x4ECB, 0x0DE8, 0x4ECD, 0x4ECD, 0x194F, 0x4ED4, 0x4ED4, 0x1953,\n    0x4ED5, 0x4ED5, 0x147C, 0x4ED6, 0x4ED6, 0x1CD4, 0x4ED7, 0x4ED7, 0x1987,\n    0x4ED8, 0x4ED8, 0x13F6, 0x4ED9, 0x4ED9, 0x152A, 0x4EDD, 0x4EDD, 0x10EB,\n    0x4EDF, 0x4EDF, 0x1BEC, 0x4EE3, 0x4EE3, 0x109A, 0x4EE4, 0x4EE4, 0x1189,\n    0x4EE5, 0x4EE5, 0x190E, 0x4EF0, 0x4EF0, 0x16C9, 0x4EF2, 0x4EF2, 0x1B0B,\n    0x4EF6, 0x4EF6, 0x0E12, 0x4EF7, 0x4EF7, 0x0DE9, 0x4EFB, 0x4EFB, 0x1945,\n    0x4F01, 0x4F01, 0x0FDE, 0x4F09, 0x4F09, 0x1DF7, 0x4F0A, 0x4F0A, 0x190F,\n    0x4F0B, 0x4F0B, 0x0FD3, 0x4F0D, 0x4F0D, 0x17A2, 0x4F0E, 0x4F0E, 0x0FDF,\n    0x4F0F, 0x4F0F, 0x13D2, 0x4F10, 0x4F10, 0x138D, 0x4F11, 0x4F11, 0x1F45,\n    0x4F2F, 0x4F2F, 0x137C, 0x4F34, 0x4F34, 0x1329, 0x4F36, 0x4F36, 0x118A,\n    0x4F38, 0x4F38, 0x1667, 0x4F3A, 0x4F3A, 0x147D, 0x4F3C, 0x4F3C, 0x147E,\n    0x4F3D, 0x4F3D, 0x0D6C, 0x4F43, 0x4F43, 0x19F3, 0x4F46, 0x4F46, 0x1062,\n    0x4F47, 0x4F47, 0x19BF, 0x4F48, 0x4F48, 0x1D78, 0x4F4D, 0x4F4D, 0x188C,\n    0x4F4E, 0x4F4E, 0x19C0, 0x4F4F, 0x4F4F, 0x1ACD, 0x4F50, 0x4F50, 0x1AC6,\n    0x4F51, 0x4F51, 0x1836, 0x4F55, 0x4F55, 0x1DC1, 0x4F59, 0x4F59, 0x172F,\n    0x4F5A, 0x4F5A, 0x193D, 0x4F5B, 0x4F5B, 0x1433, 0x4F5C, 0x4F5C, 0x196D,\n    0x4F69, 0x4F69, 0x1D4E, 0x4F6F, 0x4F6F, 0x16F7, 0x4F70, 0x4F70, 0x137D,\n    0x4F73, 0x4F73, 0x0D6D, 0x4F76, 0x4F76, 0x101F, 0x4F7A, 0x4F7A, 0x19F4,\n    0x4F7E, 0x4F7E, 0x193E, 0x4F7F, 0x4F7F, 0x147F, 0x4F81, 0x4F81, 0x1668,\n    0x4F83, 0x4F83, 0x0D94, 0x4F84, 0x4F84, 0x1B67, 0x4F86, 0x4F86, 0x1144,\n    0x4F88, 0x4F88, 0x1CA8, 0x4F8A, 0x4F8A, 0x0EFF, 0x4F8B, 0x4F8B, 0x119A,\n    0x4F8D, 0x4F8D, 0x163C, 0x4F8F, 0x4F8F, 0x1ACE, 0x4F91, 0x4F91, 0x18A6,\n    0x4F96, 0x4F96, 0x11F2, 0x4F98, 0x4F98, 0x1B82, 0x4F9B, 0x4F9B, 0x0ECA,\n    0x4F9D, 0x4F9D, 0x18FA, 0x4FAE, 0x4FAE, 0x129C, 0x4FAF, 0x4FAF, 0x1F1E,\n    0x4FB5, 0x4FB5, 0x1CC7, 0x4FB6, 0x4FB6, 0x1158, 0x4FBF, 0x4FBF, 0x1D5E,\n    0x4FC2, 0x4FC2, 0x0E79, 0x4FC3, 0x4FC3, 0x1C49, 0x4FC4, 0x4FC4, 0x1690,\n    0x4FC9, 0x4FC9, 0x17A3, 0x4FCA, 0x4FCA, 0x1AF6, 0x4FCE, 0x4FCE, 0x1A7E,\n    0x4FD1, 0x4FD1, 0x181E, 0x4FD3, 0x4FD3, 0x0E4D, 0x4FD4, 0x4FD4, 0x1E36,\n    0x4FD7, 0x4FD7, 0x15A1, 0x4FDA, 0x4FDA, 0x1205, 0x4FDD, 0x4FDD, 0x13C2,\n    0x4FDF, 0x4FDF, 0x1480, 0x4FE0, 0x4FE0, 0x1E4F, 0x4FE1, 0x4FE1, 0x1669,\n    0x4FEE, 0x4FEE, 0x15BF, 0x4FEF, 0x4FEF, 0x13F7, 0x4FF1, 0x4FF1, 0x0F39,\n    0x4FF3, 0x4FF3, 0x136A, 0x4FF5, 0x4FF5, 0x1D98, 0x4FF8, 0x4FF8, 0x13E5,\n    0x4FFA, 0x4FFA, 0x1725, 0x5002, 0x5002, 0x13B2, 0x5006, 0x5006, 0x114C,\n    0x5009, 0x5009, 0x1BB4, 0x500B, 0x500B, 0x0DEA, 0x500D, 0x500D, 0x1369,\n    0x5011, 0x5011, 0x12E4, 0x5012, 0x5012, 0x10AD, 0x5016, 0x5016, 0x1E19,\n    0x5019, 0x5019, 0x1F1F, 0x501A, 0x501A, 0x18FB, 0x501C, 0x501C, 0x1BDE,\n    0x501E, 0x501E, 0x0E4E, 0x501F, 0x501F, 0x1B83, 0x5021, 0x5021, 0x1BB5,\n    0x5023, 0x5023, 0x134D, 0x5024, 0x5024, 0x1CA9, 0x5026, 0x5026, 0x0F81,\n    0x5027, 0x5027, 0x1AB5, 0x5028, 0x5028, 0x0E01, 0x502A, 0x502A, 0x178E,\n    0x502B, 0x502B, 0x11F3, 0x502C, 0x502C, 0x1CE2, 0x502D, 0x502D, 0x17F3,\n    0x503B, 0x503B, 0x16E7, 0x5043, 0x5043, 0x171D, 0x5047, 0x5047, 0x0D6E,\n    0x5048, 0x5048, 0x0E2B, 0x5049, 0x5049, 0x188D, 0x504F, 0x504F, 0x1D5F,\n    0x5055, 0x5055, 0x1E06, 0x505A, 0x505A, 0x1ACF, 0x505C, 0x505C, 0x1A33,\n    0x5065, 0x5065, 0x0E13, 0x5074, 0x5074, 0x1CA2, 0x5075, 0x5075, 0x1A34,\n    0x5076, 0x5076, 0x1837, 0x5078, 0x5078, 0x1D29, 0x5080, 0x5080, 0x0F10,\n    0x5085, 0x5085, 0x13F8, 0x508D, 0x508D, 0x134E, 0x5091, 0x5091, 0x0E1E,\n    0x5098, 0x5098, 0x14B7, 0x5099, 0x5099, 0x143E, 0x50AC, 0x50AC, 0x1C5E,\n    0x50AD, 0x50AD, 0x181F, 0x50B2, 0x50B2, 0x17A4, 0x50B3, 0x50B3, 0x19F5,\n    0x50B5, 0x50B5, 0x1BCA, 0x50B7, 0x50B7, 0x14D4, 0x50BE, 0x50BE, 0x0E4F,\n    0x50C5, 0x50C5, 0x0FB7, 0x50C9, 0x50C9, 0x1C09, 0x50CA, 0x50CA, 0x152B,\n    0x50CF, 0x50CF, 0x14D5, 0x50D1, 0x50D1, 0x0F1D, 0x50D5, 0x50D5, 0x13D3,\n    0x50D6, 0x50D6, 0x1F63, 0x50DA, 0x50DA, 0x11C8, 0x50DE, 0x50DE, 0x188E,\n    0x50E5, 0x50E5, 0x17FC, 0x50E7, 0x50E7, 0x1634, 0x50ED, 0x50ED, 0x1BAA,\n    0x50F9, 0x50F9, 0x0D6F, 0x50FB, 0x50FB, 0x139C, 0x50FF, 0x50FF, 0x1481,\n    0x5100, 0x5100, 0x18FC, 0x5101, 0x5101, 0x1AF7, 0x5104, 0x5104, 0x1718,\n    0x5106, 0x5106, 0x0E50, 0x5109, 0x5109, 0x0E21, 0x5112, 0x5112, 0x18A7,\n    0x511F, 0x511F, 0x14D6, 0x5121, 0x5121, 0x11BF, 0x512A, 0x512A, 0x1838,\n    0x5132, 0x5132, 0x19C1, 0x5137, 0x5137, 0x1159, 0x513A, 0x513A, 0x1025,\n    0x513C, 0x513C, 0x1726, 0x5140, 0x5140, 0x17C9, 0x5141, 0x5141, 0x18D7,\n    0x5143, 0x5143, 0x186F, 0x5144, 0x5144, 0x1E5C, 0x5145, 0x5145, 0x1C8A,\n    0x5146, 0x5146, 0x1A7F, 0x5147, 0x5147, 0x1F4D, 0x5148, 0x5148, 0x152C,\n    0x5149, 0x5149, 0x0F00, 0x514B, 0x514B, 0x0FB0, 0x514C, 0x514C, 0x1D07,\n    0x514D, 0x514D, 0x127F, 0x514E, 0x514E, 0x1D19, 0x5152, 0x5152, 0x1691,\n    0x515C, 0x515C, 0x10FC, 0x5162, 0x5162, 0x0FDB, 0x5165, 0x5165, 0x194D,\n    0x5167, 0x5167, 0x103B, 0x5168, 0x5168, 0x19F6, 0x5169, 0x5169, 0x114D,\n    0x516A, 0x516A, 0x18A8, 0x516B, 0x516B, 0x1D4B, 0x516C, 0x516C, 0x0ECB,\n    0x516D, 0x516D, 0x11EF, 0x516E, 0x516E, 0x1E6F, 0x5171, 0x5171, 0x0ECC,\n    0x5175, 0x5175, 0x13B3, 0x5176, 0x5176, 0x0FE0, 0x5177, 0x5177, 0x0F3A,\n    0x5178, 0x5178, 0x19F7, 0x517C, 0x517C, 0x0E46, 0x5180, 0x5180, 0x0FE1,\n    0x5186, 0x5186, 0x172D, 0x518A, 0x518A, 0x1BD6, 0x518D, 0x518D, 0x19AA,\n    0x5192, 0x5192, 0x129D, 0x5195, 0x5195, 0x1280, 0x5197, 0x5197, 0x1820,\n    0x51A0, 0x51A0, 0x0EEB, 0x51A5, 0x51A5, 0x128C, 0x51AA, 0x51AA, 0x127D,\n    0x51AC, 0x51AC, 0x10EC, 0x51B6, 0x51B6, 0x16E8, 0x51B7, 0x51B7, 0x1148,\n    0x51BD, 0x51BD, 0x117D, 0x51C4, 0x51C4, 0x1BDA, 0x51C6, 0x51C6, 0x1AF8,\n    0x51C9, 0x51C9, 0x114E, 0x51CB, 0x51CB, 0x1A80, 0x51CC, 0x51CC, 0x11FF,\n    0x51CD, 0x51CD, 0x10ED, 0x51DC, 0x51DC, 0x11FE, 0x51DD, 0x51DD, 0x18F6,\n    0x51DE, 0x51DE, 0x1F64, 0x51E1, 0x51E1, 0x1391, 0x51F0, 0x51F0, 0x1EE0,\n    0x51F1, 0x51F1, 0x0DEB, 0x51F6, 0x51F6, 0x1F4E, 0x51F8, 0x51F8, 0x1BFF,\n    0x51F9, 0x51F9, 0x17FD, 0x51FA, 0x51FA, 0x1C87, 0x51FD, 0x51FD, 0x1DE3,\n    0x5200, 0x5200, 0x10AE, 0x5203, 0x5203, 0x192D, 0x5206, 0x5206, 0x1420,\n    0x5207, 0x5207, 0x1A1C, 0x5208, 0x5208, 0x178F, 0x520A, 0x520A, 0x0D95,\n    0x520E, 0x520E, 0x12E5, 0x5211, 0x5211, 0x1E5D, 0x5217, 0x5217, 0x117E,\n    0x521D, 0x521D, 0x1C2E, 0x5224, 0x5224, 0x1D42, 0x5225, 0x5225, 0x13AD,\n    0x5229, 0x5229, 0x1206, 0x522A, 0x522A, 0x14B8, 0x522E, 0x522E, 0x0EFB,\n    0x5230, 0x5230, 0x10AF, 0x5236, 0x5236, 0x1A67, 0x5237, 0x5237, 0x15B9,\n    0x5238, 0x5238, 0x0F82, 0x5239, 0x5239, 0x1BA5, 0x523A, 0x523A, 0x1954,\n    0x523B, 0x523B, 0x0D89, 0x5243, 0x5243, 0x1C25, 0x5247, 0x5247, 0x1CC0,\n    0x524A, 0x524A, 0x14B5, 0x524B, 0x524B, 0x0FB1, 0x524C, 0x524C, 0x112D,\n    0x524D, 0x524D, 0x19F8, 0x5254, 0x5254, 0x1BDF, 0x5256, 0x5256, 0x13F9,\n    0x525B, 0x525B, 0x0DD0, 0x525D, 0x525D, 0x1316, 0x5261, 0x5261, 0x1557,\n    0x5269, 0x5269, 0x1950, 0x526A, 0x526A, 0x19F9, 0x526F, 0x526F, 0x13FA,\n    0x5272, 0x5272, 0x1DE1, 0x5275, 0x5275, 0x1BB6, 0x527D, 0x527D, 0x1D99,\n    0x527F, 0x527F, 0x1C2F, 0x5283, 0x5283, 0x1F0C, 0x5287, 0x5287, 0x0FB2,\n    0x5288, 0x5288, 0x139D, 0x5289, 0x5289, 0x11E1, 0x528D, 0x528D, 0x0E22,\n    0x5291, 0x5291, 0x1A68, 0x5292, 0x5292, 0x0E23, 0x529B, 0x529B, 0x116A,\n    0x529F, 0x529F, 0x0ECD, 0x52A0, 0x52A0, 0x0D70, 0x52A3, 0x52A3, 0x117F,\n    0x52A4, 0x52A4, 0x0FB8, 0x52A9, 0x52A9, 0x1A81, 0x52AA, 0x52AA, 0x1049,\n    0x52AB, 0x52AB, 0x0E28, 0x52BE, 0x52BE, 0x1E17, 0x52C1, 0x52C1, 0x0E51,\n    0x52C3, 0x52C3, 0x1342, 0x52C5, 0x52C5, 0x1CC1, 0x52C7, 0x52C7, 0x1821,\n    0x52C9, 0x52C9, 0x1281, 0x52CD, 0x52CD, 0x0E52, 0x52D2, 0x52D2, 0x11FC,\n    0x52D5, 0x52D5, 0x10EE, 0x52D6, 0x52D6, 0x1855, 0x52D8, 0x52D8, 0x0DB6,\n    0x52D9, 0x52D9, 0x12CC, 0x52DB, 0x52DB, 0x1F2B, 0x52DD, 0x52DD, 0x1635,\n    0x52DE, 0x52DE, 0x119F, 0x52DF, 0x52DF, 0x129E, 0x52E2, 0x52E2, 0x1575,\n    0x52E3, 0x52E3, 0x19DB, 0x52E4, 0x52E4, 0x0FB9, 0x52F3, 0x52F3, 0x1F2C,\n    0x52F5, 0x52F5, 0x115A, 0x52F8, 0x52F8, 0x0F83, 0x52FA, 0x52FA, 0x196E,\n    0x52FB, 0x52FB, 0x0FA9, 0x52FE, 0x52FE, 0x0F3B, 0x52FF, 0x52FF, 0x12F0,\n    0x5305, 0x5305, 0x1D79, 0x5308, 0x5308, 0x1F4F, 0x530D, 0x530D, 0x1D7A,\n    0x530F, 0x530F, 0x1D7B, 0x5310, 0x5310, 0x13D4, 0x5315, 0x5315, 0x143F,\n    0x5316, 0x5316, 0x1EB7, 0x5317, 0x5317, 0x141F, 0x5319, 0x5319, 0x163D,\n    0x5320, 0x5320, 0x1988, 0x5321, 0x5321, 0x0F01, 0x5323, 0x5323, 0x0DCA,\n    0x532A, 0x532A, 0x1440, 0x532F, 0x532F, 0x1EF8, 0x5339, 0x5339, 0x1DB4,\n    0x533F, 0x533F, 0x105C, 0x5340, 0x5340, 0x0F3C, 0x5341, 0x5341, 0x168C,\n    0x5343, 0x5343, 0x1BED, 0x5344, 0x5344, 0x194E, 0x5347, 0x5347, 0x1636,\n    0x5348, 0x5348, 0x17A5, 0x5349, 0x5349, 0x1F3A, 0x534A, 0x534A, 0x132A,\n    0x534D, 0x534D, 0x123F, 0x5351, 0x5351, 0x1441, 0x5352, 0x5352, 0x1AB2,\n    0x5353, 0x5353, 0x1CE3, 0x5354, 0x5354, 0x1E50, 0x5357, 0x5357, 0x1031,\n    0x535A, 0x535A, 0x1317, 0x535C, 0x535C, 0x13D5, 0x535E, 0x535E, 0x13A7,\n    0x5360, 0x5360, 0x1A24, 0x5366, 0x5366, 0x0F0C, 0x5368, 0x5368, 0x154A,\n    0x536F, 0x536F, 0x12C0, 0x5370, 0x5370, 0x192E, 0x5371, 0x5371, 0x188F,\n    0x5374, 0x5374, 0x0D8A, 0x5375, 0x5375, 0x1126, 0x5377, 0x5377, 0x0F84,\n    0x537D, 0x537D, 0x1B0E, 0x537F, 0x537F, 0x0E53, 0x5384, 0x5384, 0x16DB,\n    0x5393, 0x5393, 0x16D0, 0x5398, 0x5398, 0x1207, 0x539A, 0x539A, 0x1F20,\n    0x539F, 0x539F, 0x1870, 0x53A0, 0x53A0, 0x1CA4, 0x53A5, 0x53A5, 0x0F8B,\n    0x53A6, 0x53A6, 0x1DC2, 0x53AD, 0x53AD, 0x1765, 0x53BB, 0x53BB, 0x0E02,\n    0x53C3, 0x53C3, 0x1BAB, 0x53C8, 0x53C8, 0x1839, 0x53C9, 0x53C9, 0x1B84,\n    0x53CA, 0x53CA, 0x0FD4, 0x53CB, 0x53CB, 0x183A, 0x53CD, 0x53CD, 0x132B,\n    0x53D4, 0x53D4, 0x15FC, 0x53D6, 0x53D6, 0x1C94, 0x53D7, 0x53D7, 0x15C0,\n    0x53DB, 0x53DB, 0x132C, 0x53E1, 0x53E1, 0x1790, 0x53E2, 0x53E2, 0x1C53,\n    0x53E3, 0x53E3, 0x0F3D, 0x53E4, 0x53E4, 0x0E91, 0x53E5, 0x53E5, 0x0F3E,\n    0x53E9, 0x53E9, 0x0E92, 0x53EA, 0x53EA, 0x1B1F, 0x53EB, 0x53EB, 0x0F9A,\n    0x53EC, 0x53EC, 0x157C, 0x53ED, 0x53ED, 0x1D4C, 0x53EF, 0x53EF, 0x0D71,\n    0x53F0, 0x53F0, 0x1D08, 0x53F1, 0x53F1, 0x1B68, 0x53F2, 0x53F2, 0x1482,\n    0x53F3, 0x53F3, 0x183B, 0x53F8, 0x53F8, 0x1483, 0x5403, 0x5403, 0x1F57,\n    0x5404, 0x5404, 0x0D8B, 0x5408, 0x5408, 0x1DEF, 0x5409, 0x5409, 0x1020,\n    0x540A, 0x540A, 0x19DC, 0x540C, 0x540C, 0x10EF, 0x540D, 0x540D, 0x128D,\n    0x540E, 0x540E, 0x1F21, 0x540F, 0x540F, 0x1208, 0x5410, 0x5410, 0x1D1A,\n    0x5411, 0x5411, 0x1E1F, 0x541B, 0x541B, 0x0F71, 0x541D, 0x541D, 0x121E,\n    0x541F, 0x541F, 0x18ED, 0x5420, 0x5420, 0x1D6E, 0x5426, 0x5426, 0x13FB,\n    0x5429, 0x5429, 0x1421, 0x542B, 0x542B, 0x1DE4, 0x5433, 0x5433, 0x17A7,\n    0x5438, 0x5438, 0x1F5E, 0x5439, 0x5439, 0x1C95, 0x543B, 0x543B, 0x12E6,\n    0x543C, 0x543C, 0x1F22, 0x543E, 0x543E, 0x17A6, 0x5442, 0x5442, 0x115B,\n    0x5448, 0x5448, 0x1A35, 0x544A, 0x544A, 0x0E93, 0x5451, 0x5451, 0x1CF0,\n    0x5468, 0x5468, 0x1AD3, 0x546A, 0x546A, 0x1AD2, 0x5471, 0x5471, 0x0E94,\n    0x5473, 0x5473, 0x12F3, 0x5475, 0x5475, 0x0D72, 0x547B, 0x547B, 0x166A,\n    0x547C, 0x547C, 0x1E7A, 0x547D, 0x547D, 0x128E, 0x5480, 0x5480, 0x19C2,\n    0x5486, 0x5486, 0x1D7C, 0x548C, 0x548C, 0x1EB8, 0x548E, 0x548E, 0x0F3F,\n    0x5490, 0x5490, 0x13FC, 0x54A4, 0x54A4, 0x1CD5, 0x54A8, 0x54A8, 0x1955,\n    0x54AB, 0x54AB, 0x1B20, 0x54AC, 0x54AC, 0x0F1E, 0x54B3, 0x54B3, 0x1E07,\n    0x54B8, 0x54B8, 0x1DE5, 0x54BD, 0x54BD, 0x192F, 0x54C0, 0x54C0, 0x16D1,\n    0x54C1, 0x54C1, 0x1DA6, 0x54C4, 0x54C4, 0x1EAD, 0x54C8, 0x54C8, 0x1DF0,\n    0x54C9, 0x54C9, 0x19AB, 0x54E1, 0x54E1, 0x1871, 0x54E5, 0x54E5, 0x0D73,\n    0x54E8, 0x54E8, 0x1C30, 0x54ED, 0x54ED, 0x0EB7, 0x54EE, 0x54EE, 0x1F11,\n    0x54F2, 0x54F2, 0x1C00, 0x54FA, 0x54FA, 0x1D7D, 0x5504, 0x5504, 0x1D4F,\n    0x5506, 0x5506, 0x1484, 0x5507, 0x5507, 0x1B44, 0x550E, 0x550E, 0x1209,\n    0x5510, 0x5510, 0x108F, 0x551C, 0x551C, 0x1251, 0x552F, 0x552F, 0x18A9,\n    0x5531, 0x5531, 0x1BB7, 0x5535, 0x5535, 0x16BD, 0x553E, 0x553E, 0x1CD6,\n    0x5544, 0x5544, 0x1CE4, 0x5546, 0x5546, 0x14D7, 0x554F, 0x554F, 0x12E7,\n    0x5553, 0x5553, 0x0E7A, 0x5556, 0x5556, 0x1079, 0x555E, 0x555E, 0x1692,\n    0x5563, 0x5563, 0x1DE6, 0x557C, 0x557C, 0x1A69, 0x5580, 0x5580, 0x0DFB,\n    0x5584, 0x5584, 0x152D, 0x5586, 0x5586, 0x1C01, 0x5587, 0x5587, 0x1116,\n    0x5589, 0x5589, 0x1F23, 0x558A, 0x558A, 0x1DE7, 0x5598, 0x5598, 0x1BEE,\n    0x5599, 0x5599, 0x1F3B, 0x559A, 0x559A, 0x1ECB, 0x559C, 0x559C, 0x1F65,\n    0x559D, 0x559D, 0x0DAD, 0x55A7, 0x55A7, 0x1F36, 0x55A9, 0x55A9, 0x18AA,\n    0x55AA, 0x55AA, 0x14D8, 0x55AB, 0x55AB, 0x1024, 0x55AC, 0x55AC, 0x0F1F,\n    0x55AE, 0x55AE, 0x1063, 0x55C5, 0x55C5, 0x1F24, 0x55C7, 0x55C7, 0x14F5,\n    0x55D4, 0x55D4, 0x1B45, 0x55DA, 0x55DA, 0x17A8, 0x55DC, 0x55DC, 0x0FE2,\n    0x55DF, 0x55DF, 0x1B85, 0x55E3, 0x55E3, 0x1485, 0x55E4, 0x55E4, 0x1CAA,\n    0x55FD, 0x55FD, 0x15C1, 0x55FE, 0x55FE, 0x1AD4, 0x5606, 0x5606, 0x1CF1,\n    0x5609, 0x5609, 0x0D74, 0x5614, 0x5614, 0x0F40, 0x5617, 0x5617, 0x14D9,\n    0x562F, 0x562F, 0x157D, 0x5632, 0x5632, 0x1A82, 0x5634, 0x5634, 0x1C96,\n    0x5636, 0x5636, 0x163E, 0x5653, 0x5653, 0x1E27, 0x5668, 0x5668, 0x0FE3,\n    0x566B, 0x566B, 0x1F66, 0x5674, 0x5674, 0x1422, 0x5686, 0x5686, 0x1F12,\n    0x56A5, 0x56A5, 0x1744, 0x56AC, 0x56AC, 0x1467, 0x56AE, 0x56AE, 0x1E20,\n    0x56B4, 0x56B4, 0x1727, 0x56BC, 0x56BC, 0x196F, 0x56CA, 0x56CA, 0x1038,\n    0x56CD, 0x56CD, 0x1F67, 0x56D1, 0x56D1, 0x1C4A, 0x56DA, 0x56DA, 0x15C2,\n    0x56DB, 0x56DB, 0x1486, 0x56DE, 0x56DE, 0x1EF9, 0x56E0, 0x56E0, 0x1930,\n    0x56F0, 0x56F0, 0x0EBE, 0x56F9, 0x56F9, 0x118B, 0x56FA, 0x56FA, 0x0E95,\n    0x5703, 0x5703, 0x1D7E, 0x5704, 0x5704, 0x170E, 0x5708, 0x5708, 0x0F85,\n    0x570B, 0x570B, 0x0F6B, 0x570D, 0x570D, 0x1890, 0x5712, 0x5712, 0x1873,\n    0x5713, 0x5713, 0x1872, 0x5716, 0x5716, 0x10B0, 0x5718, 0x5718, 0x1064,\n    0x571F, 0x571F, 0x1D1B, 0x5728, 0x5728, 0x19AC, 0x572D, 0x572D, 0x0F9B,\n    0x5730, 0x5730, 0x1B21, 0x573B, 0x573B, 0x0FE4, 0x5740, 0x5740, 0x1B22,\n    0x5742, 0x5742, 0x1D43, 0x5747, 0x5747, 0x0FAA, 0x574A, 0x574A, 0x134F,\n    0x574D, 0x574D, 0x107A, 0x574E, 0x574E, 0x0DB7, 0x5750, 0x5750, 0x1AC7,\n    0x5751, 0x5751, 0x0DFD, 0x5761, 0x5761, 0x1D32, 0x5764, 0x5764, 0x0EBF,\n    0x5766, 0x5766, 0x1CF2, 0x576A, 0x576A, 0x1D69, 0x576E, 0x576E, 0x109C,\n    0x5770, 0x5770, 0x0E54, 0x5775, 0x5775, 0x0F41, 0x577C, 0x577C, 0x1CE5,\n    0x5782, 0x5782, 0x15C3, 0x5788, 0x5788, 0x109B, 0x578B, 0x578B, 0x1E5E,\n    0x5793, 0x5793, 0x1E08, 0x57A0, 0x57A0, 0x18E5, 0x57A2, 0x57A2, 0x0F42,\n    0x57A3, 0x57A3, 0x1874, 0x57C3, 0x57C3, 0x16D2, 0x57C7, 0x57C7, 0x1822,\n    0x57C8, 0x57C8, 0x1AF9, 0x57CB, 0x57CB, 0x1264, 0x57CE, 0x57CE, 0x1562,\n    0x57DF, 0x57DF, 0x173C, 0x57E0, 0x57E0, 0x13FD, 0x57F0, 0x57F0, 0x1BCB,\n    0x57F4, 0x57F4, 0x1658, 0x57F7, 0x57F7, 0x1B78, 0x57F9, 0x57F9, 0x136B,\n    0x57FA, 0x57FA, 0x0FE5, 0x57FC, 0x57FC, 0x0FE6, 0x5800, 0x5800, 0x0F77,\n    0x5802, 0x5802, 0x1090, 0x5805, 0x5805, 0x0E35, 0x5806, 0x5806, 0x1D23,\n    0x5808, 0x5808, 0x0DD1, 0x5809, 0x5809, 0x18D3, 0x580A, 0x580A, 0x16A1,\n    0x581E, 0x581E, 0x1C13, 0x5821, 0x5821, 0x13C3, 0x5824, 0x5824, 0x1A6A,\n    0x5827, 0x5827, 0x1745, 0x582A, 0x582A, 0x0DB8, 0x582F, 0x582F, 0x17FE,\n    0x5830, 0x5830, 0x171E, 0x5831, 0x5831, 0x13C4, 0x5834, 0x5834, 0x1989,\n    0x5835, 0x5835, 0x10B1, 0x583A, 0x583A, 0x0E7B, 0x584A, 0x584A, 0x0F11,\n    0x584B, 0x584B, 0x1772, 0x584F, 0x584F, 0x0DEC, 0x5851, 0x5851, 0x157E,\n    0x5854, 0x5854, 0x1D00, 0x5857, 0x5857, 0x10B2, 0x5858, 0x5858, 0x1091,\n    0x585A, 0x585A, 0x1C54, 0x585E, 0x585E, 0x14F2, 0x5861, 0x5861, 0x19FA,\n    0x5862, 0x5862, 0x17A9, 0x5864, 0x5864, 0x1F2D, 0x5875, 0x5875, 0x1B46,\n    0x5879, 0x5879, 0x1BAC, 0x587C, 0x587C, 0x19FB, 0x587E, 0x587E, 0x15FD,\n    0x5883, 0x5883, 0x0E55, 0x5885, 0x5885, 0x14FD, 0x5889, 0x5889, 0x1823,\n    0x5893, 0x5893, 0x12C1, 0x589C, 0x589C, 0x1C61, 0x589E, 0x589E, 0x1B13,\n    0x589F, 0x589F, 0x1E28, 0x58A8, 0x58A8, 0x12E2, 0x58A9, 0x58A9, 0x10DF,\n    0x58AE, 0x58AE, 0x1CD7, 0x58B3, 0x58B3, 0x1423, 0x58BA, 0x58BA, 0x17AA,\n    0x58BB, 0x58BB, 0x198A, 0x58BE, 0x58BE, 0x0D96, 0x58C1, 0x58C1, 0x139E,\n    0x58C5, 0x58C5, 0x17CA, 0x58C7, 0x58C7, 0x1065, 0x58CE, 0x58CE, 0x1F2E,\n    0x58D1, 0x58D1, 0x1DCE, 0x58D3, 0x58D3, 0x16C5, 0x58D5, 0x58D5, 0x1E7B,\n    0x58D8, 0x58D8, 0x11D4, 0x58D9, 0x58D9, 0x0F02, 0x58DE, 0x58DE, 0x0F12,\n    0x58DF, 0x58DF, 0x11B8, 0x58E4, 0x58E4, 0x16F8, 0x58EB, 0x58EB, 0x1487,\n    0x58EC, 0x58EC, 0x1946, 0x58EF, 0x58EF, 0x198B, 0x58F9, 0x58F9, 0x193F,\n    0x58FA, 0x58FA, 0x1E7C, 0x58FB, 0x58FB, 0x14FE, 0x58FD, 0x58FD, 0x15C4,\n    0x590F, 0x590F, 0x1DC3, 0x5914, 0x5914, 0x0FE7, 0x5915, 0x5915, 0x151B,\n    0x5916, 0x5916, 0x17F7, 0x5919, 0x5919, 0x15FE, 0x591A, 0x591A, 0x105E,\n    0x591C, 0x591C, 0x16E9, 0x5922, 0x5922, 0x12BD, 0x5927, 0x5927, 0x109D,\n    0x5929, 0x5929, 0x1BEF, 0x592A, 0x592A, 0x1D09, 0x592B, 0x592B, 0x13FE,\n    0x592D, 0x592D, 0x17FF, 0x592E, 0x592E, 0x16CA, 0x5931, 0x5931, 0x167E,\n    0x5937, 0x5937, 0x1910, 0x593E, 0x593E, 0x1E51, 0x5944, 0x5944, 0x1728,\n    0x5947, 0x5947, 0x0FE8, 0x5948, 0x5948, 0x103C, 0x5949, 0x5949, 0x13E6,\n    0x594E, 0x594E, 0x0F9C, 0x594F, 0x594F, 0x1AD5, 0x5950, 0x5950, 0x1ECC,\n    0x5951, 0x5951, 0x0E7C, 0x5954, 0x5954, 0x1424, 0x5955, 0x5955, 0x1E32,\n    0x5957, 0x5957, 0x1D2A, 0x595A, 0x595A, 0x1E09, 0x5960, 0x5960, 0x19FC,\n    0x5962, 0x5962, 0x1488, 0x5967, 0x5967, 0x17AB, 0x596A, 0x596A, 0x1CFA,\n    0x596B, 0x596B, 0x18D8, 0x596C, 0x596C, 0x198C, 0x596D, 0x596D, 0x151C,\n    0x596E, 0x596E, 0x1425, 0x5973, 0x5973, 0x103F, 0x5974, 0x5974, 0x104A,\n    0x5978, 0x5978, 0x0D97, 0x597D, 0x597D, 0x1E7D, 0x5982, 0x5982, 0x1730,\n    0x5983, 0x5983, 0x1442, 0x5984, 0x5984, 0x1259, 0x598A, 0x598A, 0x1947,\n    0x5993, 0x5993, 0x0FE9, 0x5996, 0x5996, 0x1800, 0x5997, 0x5997, 0x0FC7,\n    0x5999, 0x5999, 0x12C2, 0x59A5, 0x59A5, 0x1CD8, 0x59A8, 0x59A8, 0x1350,\n    0x59AC, 0x59AC, 0x1D2B, 0x59B9, 0x59B9, 0x1265, 0x59BB, 0x59BB, 0x1BDB,\n    0x59BE, 0x59BE, 0x1C14, 0x59C3, 0x59C3, 0x1A36, 0x59C6, 0x59C6, 0x129F,\n    0x59C9, 0x59C9, 0x1956, 0x59CB, 0x59CB, 0x163F, 0x59D0, 0x59D0, 0x19C3,\n    0x59D1, 0x59D1, 0x0E96, 0x59D3, 0x59D3, 0x1563, 0x59D4, 0x59D4, 0x1891,\n    0x59D9, 0x59D9, 0x1948, 0x59DA, 0x59DA, 0x1801, 0x59DC, 0x59DC, 0x0DD2,\n    0x59DD, 0x59DD, 0x1AD0, 0x59E6, 0x59E6, 0x0D98, 0x59E8, 0x59E8, 0x1911,\n    0x59EA, 0x59EA, 0x1B69, 0x59EC, 0x59EC, 0x1F68, 0x59EE, 0x59EE, 0x1DF8,\n    0x59F8, 0x59F8, 0x1746, 0x59FB, 0x59FB, 0x1931, 0x59FF, 0x59FF, 0x1957,\n    0x5A01, 0x5A01, 0x1892, 0x5A03, 0x5A03, 0x17F4, 0x5A11, 0x5A11, 0x1489,\n    0x5A18, 0x5A18, 0x1039, 0x5A1B, 0x5A1B, 0x17AC, 0x5A1C, 0x5A1C, 0x1026,\n    0x5A1F, 0x5A1F, 0x1747, 0x5A20, 0x5A20, 0x166B, 0x5A25, 0x5A25, 0x1693,\n    0x5A29, 0x5A29, 0x1240, 0x5A36, 0x5A36, 0x1C97, 0x5A3C, 0x5A3C, 0x1BB8,\n    0x5A41, 0x5A41, 0x11D5, 0x5A46, 0x5A46, 0x1D33, 0x5A49, 0x5A49, 0x17DB,\n    0x5A5A, 0x5A5A, 0x1EA4, 0x5A62, 0x5A62, 0x1443, 0x5A66, 0x5A66, 0x13FF,\n    0x5A92, 0x5A92, 0x1266, 0x5A9A, 0x5A9A, 0x12F4, 0x5A9B, 0x5A9B, 0x1875,\n    0x5AA4, 0x5AA4, 0x1640, 0x5AC1, 0x5AC1, 0x0D75, 0x5AC2, 0x5AC2, 0x15C5,\n    0x5AC4, 0x5AC4, 0x1876, 0x5AC9, 0x5AC9, 0x1B6A, 0x5ACC, 0x5ACC, 0x1E4E,\n    0x5AE1, 0x5AE1, 0x19DD, 0x5AE6, 0x5AE6, 0x1DF9, 0x5AE9, 0x5AE9, 0x1055,\n    0x5B05, 0x5B05, 0x1EB9, 0x5B09, 0x5B09, 0x1F69, 0x5B0B, 0x5B0B, 0x152E,\n    0x5B0C, 0x5B0C, 0x0F20, 0x5B16, 0x5B16, 0x1D6F, 0x5B2A, 0x5B2A, 0x1468,\n    0x5B40, 0x5B40, 0x14DA, 0x5B43, 0x5B43, 0x16F9, 0x5B50, 0x5B50, 0x1958,\n    0x5B51, 0x5B51, 0x1E4A, 0x5B54, 0x5B54, 0x0ECE, 0x5B55, 0x5B55, 0x1951,\n    0x5B57, 0x5B57, 0x1959, 0x5B58, 0x5B58, 0x1AB0, 0x5B5A, 0x5B5A, 0x1400,\n    0x5B5C, 0x5B5C, 0x195A, 0x5B5D, 0x5B5D, 0x1F13, 0x5B5F, 0x5B5F, 0x1277,\n    0x5B63, 0x5B63, 0x0E7D, 0x5B64, 0x5B64, 0x0E97, 0x5B69, 0x5B69, 0x1E0A,\n    0x5B6B, 0x5B6B, 0x15AA, 0x5B70, 0x5B70, 0x15FF, 0x5B71, 0x5B71, 0x197A,\n    0x5B75, 0x5B75, 0x1401, 0x5B78, 0x5B78, 0x1DCF, 0x5B7A, 0x5B7A, 0x18AB,\n    0x5B7C, 0x5B7C, 0x1723, 0x5B85, 0x5B85, 0x10AA, 0x5B87, 0x5B87, 0x183C,\n    0x5B88, 0x5B88, 0x15C6, 0x5B89, 0x5B89, 0x16AF, 0x5B8B, 0x5B8B, 0x15B1,\n    0x5B8C, 0x5B8C, 0x17DC, 0x5B8F, 0x5B8F, 0x0F18, 0x5B93, 0x5B93, 0x13D6,\n    0x5B95, 0x5B95, 0x1D03, 0x5B96, 0x5B96, 0x1F0E, 0x5B97, 0x5B97, 0x1AB6,\n    0x5B98, 0x5B98, 0x0EEC, 0x5B99, 0x5B99, 0x1AD6, 0x5B9A, 0x5B9A, 0x1A37,\n    0x5B9B, 0x5B9B, 0x17DD, 0x5B9C, 0x5B9C, 0x18FD, 0x5BA2, 0x5BA2, 0x0DFC,\n    0x5BA3, 0x5BA3, 0x152F, 0x5BA4, 0x5BA4, 0x167F, 0x5BA5, 0x5BA5, 0x18AC,\n    0x5BA6, 0x5BA6, 0x1ECD, 0x5BAC, 0x5BAC, 0x1564, 0x5BAE, 0x5BAE, 0x0F7B,\n    0x5BB0, 0x5BB0, 0x19AD, 0x5BB3, 0x5BB3, 0x1E0B, 0x5BB4, 0x5BB4, 0x1748,\n    0x5BB5, 0x5BB5, 0x157F, 0x5BB6, 0x5BB6, 0x0D76, 0x5BB8, 0x5BB8, 0x166C,\n    0x5BB9, 0x5BB9, 0x1824, 0x5BBF, 0x5BBF, 0x1600, 0x5BC0, 0x5BC0, 0x1BCC,\n    0x5BC2, 0x5BC2, 0x19DE, 0x5BC3, 0x5BC3, 0x1877, 0x5BC4, 0x5BC4, 0x0FEA,\n    0x5BC5, 0x5BC5, 0x1932, 0x5BC6, 0x5BC6, 0x1313, 0x5BC7, 0x5BC7, 0x0F43,\n    0x5BCC, 0x5BCC, 0x1402, 0x5BD0, 0x5BD0, 0x1267, 0x5BD2, 0x5BD2, 0x1DD3,\n    0x5BD3, 0x5BD3, 0x183D, 0x5BD4, 0x5BD4, 0x1659, 0x5BD7, 0x5BD7, 0x1048,\n    0x5BDE, 0x5BDE, 0x1238, 0x5BDF, 0x5BDF, 0x1BA6, 0x5BE1, 0x5BE1, 0x0EDB,\n    0x5BE2, 0x5BE2, 0x1CC8, 0x5BE4, 0x5BE4, 0x17AD, 0x5BE5, 0x5BE5, 0x1802,\n    0x5BE6, 0x5BE6, 0x1680, 0x5BE7, 0x5BE7, 0x1047, 0x5BE8, 0x5BE8, 0x1BCD,\n    0x5BE9, 0x5BE9, 0x1682, 0x5BEB, 0x5BEB, 0x148A, 0x5BEC, 0x5BEC, 0x0EED,\n    0x5BEE, 0x5BEE, 0x11C9, 0x5BEF, 0x5BEF, 0x1AFA, 0x5BF5, 0x5BF5, 0x1C55,\n    0x5BF6, 0x5BF6, 0x13C5, 0x5BF8, 0x5BF8, 0x1C4F, 0x5BFA, 0x5BFA, 0x148B,\n    0x5C01, 0x5C01, 0x13E7, 0x5C04, 0x5C04, 0x148C, 0x5C07, 0x5C07, 0x198D,\n    0x5C08, 0x5C08, 0x19FD, 0x5C09, 0x5C09, 0x1893, 0x5C0A, 0x5C0A, 0x1AB1,\n    0x5C0B, 0x5C0B, 0x1683, 0x5C0D, 0x5C0D, 0x109E, 0x5C0E, 0x5C0E, 0x10B3,\n    0x5C0F, 0x5C0F, 0x1580, 0x5C11, 0x5C11, 0x1581, 0x5C16, 0x5C16, 0x1C0A,\n    0x5C19, 0x5C19, 0x14DB, 0x5C24, 0x5C24, 0x183E, 0x5C28, 0x5C28, 0x1351,\n    0x5C31, 0x5C31, 0x1C98, 0x5C38, 0x5C38, 0x1641, 0x5C39, 0x5C39, 0x18D9,\n    0x5C3A, 0x5C3A, 0x1BE0, 0x5C3B, 0x5C3B, 0x0E98, 0x5C3C, 0x5C3C, 0x105A,\n    0x5C3E, 0x5C3E, 0x12F5, 0x5C3F, 0x5C3F, 0x1054, 0x5C40, 0x5C40, 0x0F6C,\n    0x5C45, 0x5C45, 0x0E03, 0x5C46, 0x5C46, 0x0E7E, 0x5C48, 0x5C48, 0x0F78,\n    0x5C4B, 0x5C4B, 0x17BE, 0x5C4D, 0x5C4D, 0x1643, 0x5C4E, 0x5C4E, 0x1642,\n    0x5C51, 0x5C51, 0x154B, 0x5C55, 0x5C55, 0x19FE, 0x5C5B, 0x5C5B, 0x13B4,\n    0x5C60, 0x5C60, 0x10B4, 0x5C62, 0x5C62, 0x11D6, 0x5C64, 0x5C64, 0x1CA7,\n    0x5C65, 0x5C65, 0x120A, 0x5C6C, 0x5C6C, 0x15A2, 0x5C6F, 0x5C6F, 0x1106,\n    0x5C71, 0x5C71, 0x14B9, 0x5C79, 0x5C79, 0x1F58, 0x5C90, 0x5C90, 0x0FEB,\n    0x5C91, 0x5C91, 0x197F, 0x5CA1, 0x5CA1, 0x0DD3, 0x5CA9, 0x5CA9, 0x16BE,\n    0x5CAB, 0x5CAB, 0x15C7, 0x5CAC, 0x5CAC, 0x0DCB, 0x5CB1, 0x5CB1, 0x109F,\n    0x5CB3, 0x5CB3, 0x16A2, 0x5CB5, 0x5CB5, 0x1E7E, 0x5CB7, 0x5CB7, 0x1306,\n    0x5CB8, 0x5CB8, 0x16B0, 0x5CBA, 0x5CBA, 0x118C, 0x5CBE, 0x5CBE, 0x1A25,\n    0x5CC0, 0x5CC0, 0x15C8, 0x5CD9, 0x5CD9, 0x1CAB, 0x5CE0, 0x5CE0, 0x14DC,\n    0x5CE8, 0x5CE8, 0x1694, 0x5CEF, 0x5CF0, 0x13E8, 0x5CF4, 0x5CF4, 0x1E37,\n    0x5CF6, 0x5CF6, 0x10B5, 0x5CFB, 0x5CFB, 0x1AFB, 0x5CFD, 0x5CFD, 0x1E52,\n    0x5D07, 0x5D07, 0x1627, 0x5D0D, 0x5D0D, 0x1145, 0x5D0E, 0x5D0E, 0x0FEC,\n    0x5D11, 0x5D11, 0x0EC0, 0x5D14, 0x5D14, 0x1C5F, 0x5D16, 0x5D16, 0x16D3,\n    0x5D17, 0x5D17, 0x0DD4, 0x5D19, 0x5D19, 0x11F4, 0x5D27, 0x5D27, 0x1628,\n    0x5D29, 0x5D29, 0x1437, 0x5D4B, 0x5D4B, 0x12F6, 0x5D4C, 0x5D4C, 0x0DB9,\n    0x5D50, 0x5D50, 0x112F, 0x5D69, 0x5D69, 0x1629, 0x5D6C, 0x5D6C, 0x17F8,\n    0x5D6F, 0x5D6F, 0x1B86, 0x5D87, 0x5D87, 0x0F44, 0x5D8B, 0x5D8B, 0x10B6,\n    0x5D9D, 0x5D9D, 0x110D, 0x5DA0, 0x5DA0, 0x0F21, 0x5DA2, 0x5DA2, 0x1803,\n    0x5DAA, 0x5DAA, 0x172B, 0x5DB8, 0x5DB8, 0x1773, 0x5DBA, 0x5DBA, 0x118D,\n    0x5DBC, 0x5DBC, 0x14FF, 0x5DBD, 0x5DBD, 0x16A3, 0x5DCD, 0x5DCD, 0x17F9,\n    0x5DD2, 0x5DD2, 0x1241, 0x5DD6, 0x5DD6, 0x16BF, 0x5DDD, 0x5DDD, 0x1BF0,\n    0x5DDE, 0x5DDE, 0x1AD7, 0x5DE1, 0x5DE1, 0x1608, 0x5DE2, 0x5DE2, 0x1582,\n    0x5DE5, 0x5DE5, 0x0ECF, 0x5DE6, 0x5DE6, 0x1AC8, 0x5DE7, 0x5DE7, 0x0F22,\n    0x5DE8, 0x5DE8, 0x0E04, 0x5DEB, 0x5DEB, 0x12CD, 0x5DEE, 0x5DEE, 0x1B87,\n    0x5DF1, 0x5DF1, 0x0FED, 0x5DF2, 0x5DF2, 0x1912, 0x5DF3, 0x5DF3, 0x148D,\n    0x5DF4, 0x5DF4, 0x1D34, 0x5DF7, 0x5DF7, 0x1DFA, 0x5DFD, 0x5DFD, 0x15AB,\n    0x5DFE, 0x5DFE, 0x0E14, 0x5E02, 0x5E02, 0x1644, 0x5E03, 0x5E03, 0x1D7F,\n    0x5E06, 0x5E06, 0x1392, 0x5E0C, 0x5E0C, 0x1F6A, 0x5E11, 0x5E11, 0x1D04,\n    0x5E16, 0x5E16, 0x1C15, 0x5E19, 0x5E19, 0x1B6B, 0x5E1B, 0x5E1B, 0x137E,\n    0x5E1D, 0x5E1D, 0x1A6B, 0x5E25, 0x5E25, 0x15C9, 0x5E2B, 0x5E2B, 0x148E,\n    0x5E2D, 0x5E2D, 0x151D, 0x5E33, 0x5E33, 0x198E, 0x5E36, 0x5E36, 0x10A0,\n    0x5E38, 0x5E38, 0x14DD, 0x5E3D, 0x5E3D, 0x12A0, 0x5E3F, 0x5E3F, 0x1F25,\n    0x5E40, 0x5E40, 0x1A38, 0x5E44, 0x5E44, 0x16A4, 0x5E45, 0x5E45, 0x1D93,\n    0x5E47, 0x5E47, 0x1352, 0x5E4C, 0x5E4C, 0x1EE1, 0x5E55, 0x5E55, 0x1239,\n    0x5E5F, 0x5E5F, 0x1CAC, 0x5E61, 0x5E61, 0x1384, 0x5E62, 0x5E62, 0x1092,\n    0x5E63, 0x5E63, 0x1D70, 0x5E72, 0x5E72, 0x0D99, 0x5E73, 0x5E73, 0x1D6A,\n    0x5E74, 0x5E74, 0x1040, 0x5E77, 0x5E77, 0x13B5, 0x5E78, 0x5E78, 0x1E1A,\n    0x5E79, 0x5E79, 0x0D9A, 0x5E7B, 0x5E7B, 0x1ECE, 0x5E7C, 0x5E7D, 0x18AD,\n    0x5E7E, 0x5E7E, 0x0FEE, 0x5E84, 0x5E84, 0x198F, 0x5E87, 0x5E87, 0x1444,\n    0x5E8A, 0x5E8A, 0x14DE, 0x5E8F, 0x5E8F, 0x1500, 0x5E95, 0x5E95, 0x19C4,\n    0x5E97, 0x5E97, 0x1A26, 0x5E9A, 0x5E9A, 0x0E56, 0x5E9C, 0x5E9C, 0x1403,\n    0x5EA0, 0x5EA0, 0x14DF, 0x5EA6, 0x5EA6, 0x10B7, 0x5EA7, 0x5EA7, 0x1AC9,\n    0x5EAB, 0x5EAB, 0x0E99, 0x5EAD, 0x5EAD, 0x1A39, 0x5EB5, 0x5EB5, 0x16C0,\n    0x5EB6, 0x5EB6, 0x1501, 0x5EB7, 0x5EB7, 0x0DD5, 0x5EB8, 0x5EB8, 0x1825,\n    0x5EBE, 0x5EBE, 0x18AF, 0x5EC2, 0x5EC2, 0x14E0, 0x5EC8, 0x5EC8, 0x1DC4,\n    0x5EC9, 0x5EC9, 0x1183, 0x5ECA, 0x5ECA, 0x113C, 0x5ED0, 0x5ED0, 0x0F45,\n    0x5ED3, 0x5ED3, 0x0EE7, 0x5ED6, 0x5ED6, 0x11CA, 0x5EDA, 0x5EDA, 0x1AD8,\n    0x5EDB, 0x5EDB, 0x19FF, 0x5EDF, 0x5EDF, 0x12C3, 0x5EE0, 0x5EE0, 0x1BB9,\n    0x5EE2, 0x5EE2, 0x1D71, 0x5EE3, 0x5EE3, 0x0F03, 0x5EEC, 0x5EEC, 0x115C,\n    0x5EF3, 0x5EF3, 0x1C1D, 0x5EF6, 0x5EF6, 0x1749, 0x5EF7, 0x5EF7, 0x1A3A,\n    0x5EFA, 0x5EFA, 0x0E15, 0x5EFB, 0x5EFB, 0x1EFA, 0x5F01, 0x5F01, 0x13A8,\n    0x5F04, 0x5F04, 0x11B9, 0x5F0A, 0x5F0A, 0x1D72, 0x5F0F, 0x5F0F, 0x165A,\n    0x5F11, 0x5F11, 0x1645, 0x5F13, 0x5F13, 0x0F7C, 0x5F14, 0x5F14, 0x1A83,\n    0x5F15, 0x5F15, 0x1933, 0x5F17, 0x5F17, 0x1434, 0x5F18, 0x5F18, 0x1EAE,\n    0x5F1B, 0x5F1B, 0x1913, 0x5F1F, 0x5F1F, 0x1A6C, 0x5F26, 0x5F26, 0x1E38,\n    0x5F27, 0x5F27, 0x1E7F, 0x5F29, 0x5F29, 0x104B, 0x5F31, 0x5F31, 0x16F0,\n    0x5F35, 0x5F35, 0x1990, 0x5F3A, 0x5F3A, 0x0DD6, 0x5F3C, 0x5F3C, 0x1DB5,\n    0x5F48, 0x5F48, 0x1CF3, 0x5F4A, 0x5F4A, 0x0DD7, 0x5F4C, 0x5F4C, 0x12F7,\n    0x5F4E, 0x5F4E, 0x1242, 0x5F56, 0x5F56, 0x1066, 0x5F57, 0x5F57, 0x1E70,\n    0x5F59, 0x5F59, 0x1F3D, 0x5F5B, 0x5F5B, 0x1914, 0x5F62, 0x5F62, 0x1E5F,\n    0x5F66, 0x5F66, 0x171F, 0x5F67, 0x5F67, 0x1856, 0x5F69, 0x5F69, 0x1BCE,\n    0x5F6A, 0x5F6A, 0x1D9A, 0x5F6B, 0x5F6B, 0x1A84, 0x5F6C, 0x5F6C, 0x1469,\n    0x5F6D, 0x5F6D, 0x1D59, 0x5F70, 0x5F70, 0x1BBA, 0x5F71, 0x5F71, 0x1774,\n    0x5F77, 0x5F77, 0x1353, 0x5F79, 0x5F79, 0x173D, 0x5F7C, 0x5F7C, 0x1DAD,\n    0x5F7F, 0x5F7F, 0x1435, 0x5F80, 0x5F80, 0x17EE, 0x5F81, 0x5F81, 0x1A3B,\n    0x5F85, 0x5F85, 0x10A1, 0x5F87, 0x5F87, 0x1609, 0x5F8A, 0x5F8A, 0x1EFB,\n    0x5F8B, 0x5F8B, 0x11F8, 0x5F8C, 0x5F8C, 0x1F26, 0x5F90, 0x5F90, 0x1502,\n    0x5F91, 0x5F91, 0x0E57, 0x5F92, 0x5F92, 0x10B8, 0x5F97, 0x5F97, 0x110C,\n    0x5F98, 0x5F98, 0x136C, 0x5F99, 0x5F99, 0x148F, 0x5F9E, 0x5F9E, 0x1AB7,\n    0x5FA0, 0x5FA0, 0x1146, 0x5FA1, 0x5FA1, 0x170F, 0x5FA8, 0x5FA8, 0x1EE2,\n    0x5FA9, 0x5FA9, 0x13D7, 0x5FAA, 0x5FAA, 0x160A, 0x5FAE, 0x5FAE, 0x12F8,\n    0x5FB5, 0x5FB5, 0x1B7E, 0x5FB7, 0x5FB7, 0x10AB, 0x5FB9, 0x5FB9, 0x1C02,\n    0x5FBD, 0x5FBD, 0x1F3E, 0x5FC3, 0x5FC3, 0x1684, 0x5FC5, 0x5FC5, 0x1DB6,\n    0x5FCC, 0x5FCC, 0x0FEF, 0x5FCD, 0x5FCD, 0x1934, 0x5FD6, 0x5FD6, 0x1C50,\n    0x5FD7, 0x5FD7, 0x1B23, 0x5FD8, 0x5FD9, 0x125A, 0x5FE0, 0x5FE0, 0x1C8B,\n    0x5FEB, 0x5FEB, 0x1CD3, 0x5FF5, 0x5FF5, 0x1043, 0x5FFD, 0x5FFD, 0x1EAA,\n    0x5FFF, 0x5FFF, 0x1426, 0x600F, 0x600F, 0x16CB, 0x6012, 0x6012, 0x104C,\n    0x6016, 0x6016, 0x1D80, 0x601C, 0x601C, 0x118E, 0x601D, 0x601D, 0x1490,\n    0x6020, 0x6020, 0x1D0A, 0x6021, 0x6021, 0x1915, 0x6025, 0x6025, 0x0FD5,\n    0x6027, 0x6027, 0x1565, 0x6028, 0x6028, 0x1878, 0x602A, 0x602A, 0x0F13,\n    0x602F, 0x602F, 0x0E29, 0x6041, 0x6041, 0x1949, 0x6042, 0x6042, 0x160B,\n    0x6043, 0x6043, 0x1646, 0x604D, 0x604D, 0x1EE3, 0x6050, 0x6050, 0x0ED0,\n    0x6052, 0x6052, 0x1DFB, 0x6055, 0x6055, 0x1503, 0x6059, 0x6059, 0x16FA,\n    0x605D, 0x605D, 0x0EFC, 0x6062, 0x6062, 0x1EFC, 0x6063, 0x6063, 0x195B,\n    0x6064, 0x6064, 0x1F4A, 0x6065, 0x6065, 0x1CAD, 0x6068, 0x6068, 0x1DD4,\n    0x6069, 0x6069, 0x18E6, 0x606A, 0x606A, 0x0D8C, 0x606C, 0x606C, 0x1044,\n    0x606D, 0x606D, 0x0ED1, 0x606F, 0x606F, 0x165B, 0x6070, 0x6070, 0x1F5F,\n    0x6085, 0x6085, 0x1761, 0x6089, 0x6089, 0x1681, 0x608C, 0x608C, 0x1A6D,\n    0x608D, 0x608D, 0x1DD5, 0x6094, 0x6094, 0x1EFD, 0x6096, 0x6096, 0x1D50,\n    0x609A, 0x609A, 0x15B2, 0x609B, 0x609B, 0x1A00, 0x609F, 0x609F, 0x17AE,\n    0x60A0, 0x60A0, 0x18B0, 0x60A3, 0x60A3, 0x1ECF, 0x60A4, 0x60A4, 0x1C56,\n    0x60A7, 0x60A7, 0x120B, 0x60B0, 0x60B0, 0x1AB8, 0x60B2, 0x60B2, 0x1445,\n    0x60B3, 0x60B3, 0x10AC, 0x60B4, 0x60B4, 0x1C90, 0x60B6, 0x60B6, 0x1307,\n    0x60B8, 0x60B8, 0x0E7F, 0x60BC, 0x60BC, 0x10B9, 0x60BD, 0x60BD, 0x1BDC,\n    0x60C5, 0x60C5, 0x1A3C, 0x60C7, 0x60C7, 0x10E0, 0x60D1, 0x60D1, 0x1EA1,\n    0x60DA, 0x60DA, 0x1EAB, 0x60DC, 0x60DC, 0x151E, 0x60DF, 0x60DF, 0x18B1,\n    0x60E0, 0x60E0, 0x1E71, 0x60E1, 0x60E1, 0x16A5, 0x60F0, 0x60F0, 0x1CD9,\n    0x60F1, 0x60F1, 0x1052, 0x60F3, 0x60F3, 0x14E1, 0x60F6, 0x60F6, 0x1EE4,\n    0x60F9, 0x60F9, 0x16EA, 0x60FA, 0x60FA, 0x1566, 0x60FB, 0x60FB, 0x1CA5,\n    0x6101, 0x6101, 0x15CA, 0x6106, 0x6106, 0x0E16, 0x6108, 0x6109, 0x18B2,\n    0x610D, 0x610D, 0x1308, 0x610E, 0x610E, 0x1D5D, 0x610F, 0x610F, 0x18FE,\n    0x6115, 0x6115, 0x16A6, 0x611A, 0x611A, 0x183F, 0x611B, 0x611B, 0x16D4,\n    0x611F, 0x611F, 0x0DBA, 0x6127, 0x6127, 0x0F14, 0x6130, 0x6130, 0x1EE5,\n    0x6134, 0x6134, 0x1BBB, 0x6137, 0x6137, 0x0DED, 0x613C, 0x613C, 0x166D,\n    0x613E, 0x613E, 0x0DEE, 0x613F, 0x613F, 0x1879, 0x6142, 0x6142, 0x1826,\n    0x6144, 0x6144, 0x11F9, 0x6147, 0x6147, 0x18E7, 0x6148, 0x6148, 0x195C,\n    0x614A, 0x614A, 0x0E47, 0x614B, 0x614B, 0x1D0B, 0x614C, 0x614C, 0x1EE6,\n    0x6153, 0x6153, 0x1D9B, 0x6155, 0x6155, 0x12A1, 0x6158, 0x6159, 0x1BAD,\n    0x615D, 0x615D, 0x1D2F, 0x615F, 0x615F, 0x1D1D, 0x6162, 0x6162, 0x1243,\n    0x6163, 0x6163, 0x0EEE, 0x6164, 0x6164, 0x0D8D, 0x6167, 0x6167, 0x1E72,\n    0x6168, 0x6168, 0x0DEF, 0x616B, 0x616B, 0x1AB9, 0x616E, 0x616E, 0x115D,\n    0x6170, 0x6170, 0x1894, 0x6176, 0x6176, 0x0E58, 0x6177, 0x6177, 0x0DD8,\n    0x617D, 0x617D, 0x1BE1, 0x617E, 0x617E, 0x1818, 0x6181, 0x6181, 0x1C57,\n    0x6182, 0x6182, 0x1840, 0x618A, 0x618A, 0x1446, 0x618E, 0x618E, 0x1B14,\n    0x6190, 0x6190, 0x1171, 0x6191, 0x6191, 0x1475, 0x6194, 0x6194, 0x1C31,\n    0x6198, 0x6198, 0x1F6C, 0x6199, 0x6199, 0x1F6B, 0x619A, 0x619A, 0x1CF4,\n    0x61A4, 0x61A4, 0x1427, 0x61A7, 0x61A7, 0x10F0, 0x61A9, 0x61A9, 0x0E2C,\n    0x61AB, 0x61AB, 0x1309, 0x61AC, 0x61AC, 0x0E59, 0x61AE, 0x61AE, 0x12CE,\n    0x61B2, 0x61B2, 0x1E2B, 0x61B6, 0x61B6, 0x1719, 0x61BA, 0x61BA, 0x107B,\n    0x61BE, 0x61BE, 0x0DBB, 0x61C3, 0x61C3, 0x0FBA, 0x61C7, 0x61C7, 0x0D9B,\n    0x61C8, 0x61C8, 0x1E0C, 0x61C9, 0x61C9, 0x18F7, 0x61CA, 0x61CA, 0x17AF,\n    0x61CB, 0x61CB, 0x12CF, 0x61E6, 0x61E6, 0x1027, 0x61F2, 0x61F2, 0x1B7F,\n    0x61F6, 0x61F6, 0x1117, 0x61F7, 0x61F7, 0x1EFE, 0x61F8, 0x61F8, 0x1E39,\n    0x61FA, 0x61FA, 0x1BAF, 0x61FC, 0x61FC, 0x0F46, 0x61FF, 0x61FF, 0x18FF,\n    0x6200, 0x6200, 0x1172, 0x6207, 0x6207, 0x1093, 0x6208, 0x6208, 0x0EDC,\n    0x620A, 0x620A, 0x12D0, 0x620C, 0x620C, 0x1623, 0x620D, 0x620D, 0x15CB,\n    0x620E, 0x620E, 0x18E1, 0x6210, 0x6210, 0x1567, 0x6211, 0x6211, 0x1695,\n    0x6212, 0x6212, 0x0E80, 0x6216, 0x6216, 0x1EA2, 0x621A, 0x621A, 0x1BE2,\n    0x621F, 0x621F, 0x0FB3, 0x6221, 0x6221, 0x0DBC, 0x622A, 0x622A, 0x1A1D,\n    0x622E, 0x622E, 0x11F0, 0x6230, 0x6230, 0x1A01, 0x6231, 0x6231, 0x1F6D,\n    0x6234, 0x6234, 0x10A2, 0x6236, 0x6236, 0x1E80, 0x623E, 0x623E, 0x115E,\n    0x623F, 0x623F, 0x1354, 0x6240, 0x6240, 0x1583, 0x6241, 0x6241, 0x1D60,\n    0x6247, 0x6247, 0x1530, 0x6248, 0x6248, 0x1E81, 0x6249, 0x6249, 0x1447,\n    0x624B, 0x624B, 0x15CC, 0x624D, 0x624D, 0x19AE, 0x6253, 0x6253, 0x1CDA,\n    0x6258, 0x6258, 0x1CE6, 0x626E, 0x626E, 0x1428, 0x6271, 0x6271, 0x0FD6,\n    0x6276, 0x6276, 0x1404, 0x6279, 0x6279, 0x1448, 0x627C, 0x627C, 0x16DC,\n    0x627F, 0x627F, 0x1637, 0x6280, 0x6280, 0x0FF0, 0x6284, 0x6284, 0x1C32,\n    0x6289, 0x6289, 0x0E40, 0x628A, 0x628A, 0x1D35, 0x6291, 0x6291, 0x171A,\n    0x6292, 0x6292, 0x1504, 0x6295, 0x6295, 0x1D2C, 0x6297, 0x6297, 0x1DFC,\n    0x6298, 0x6298, 0x1A1E, 0x629B, 0x629B, 0x1D81, 0x62AB, 0x62AB, 0x1DAE,\n    0x62B1, 0x62B1, 0x1D82, 0x62B5, 0x62B5, 0x19C5, 0x62B9, 0x62B9, 0x1252,\n    0x62BC, 0x62BC, 0x16C6, 0x62BD, 0x62BD, 0x1C62, 0x62C2, 0x62C2, 0x1436,\n    0x62C7, 0x62C7, 0x12D1, 0x62C8, 0x62C8, 0x1045, 0x62C9, 0x62C9, 0x1139,\n    0x62CC, 0x62CC, 0x132D, 0x62CD, 0x62CD, 0x1318, 0x62CF, 0x62CF, 0x1028,\n    0x62D0, 0x62D0, 0x0F15, 0x62D2, 0x62D2, 0x0E05, 0x62D3, 0x62D3, 0x1BE3,\n    0x62D4, 0x62D4, 0x1343, 0x62D6, 0x62D6, 0x1CDB, 0x62D7, 0x62D7, 0x1804,\n    0x62D8, 0x62D8, 0x0F47, 0x62D9, 0x62D9, 0x1AB3, 0x62DB, 0x62DB, 0x1C33,\n    0x62DC, 0x62DC, 0x136D, 0x62EC, 0x62EC, 0x0EFD, 0x62ED, 0x62ED, 0x165C,\n    0x62EE, 0x62EE, 0x1021, 0x62EF, 0x62EF, 0x1B16, 0x62F1, 0x62F1, 0x0ED2,\n    0x62F3, 0x62F3, 0x0F86, 0x62F7, 0x62F7, 0x0E9A, 0x62FE, 0x62FE, 0x162E,\n    0x62FF, 0x62FF, 0x1029, 0x6301, 0x6301, 0x1B24, 0x6307, 0x6307, 0x1B25,\n    0x6309, 0x6309, 0x16B1, 0x6311, 0x6311, 0x10BA, 0x632B, 0x632B, 0x1ACA,\n    0x632F, 0x632F, 0x1B47, 0x633A, 0x633A, 0x1A3D, 0x633B, 0x633B, 0x174B,\n    0x633D, 0x633D, 0x1244, 0x633E, 0x633E, 0x1E53, 0x6349, 0x6349, 0x1B8F,\n    0x634C, 0x634C, 0x1D4D, 0x634F, 0x634F, 0x102F, 0x6350, 0x6350, 0x174A,\n    0x6355, 0x6355, 0x1D83, 0x6367, 0x6367, 0x13EA, 0x6368, 0x6368, 0x1491,\n    0x636E, 0x636E, 0x0E06, 0x6372, 0x6372, 0x0F87, 0x6377, 0x6377, 0x1C16,\n    0x637A, 0x637A, 0x1030, 0x637B, 0x637B, 0x1046, 0x637F, 0x637F, 0x1505,\n    0x6383, 0x6383, 0x1584, 0x6388, 0x6388, 0x15CD, 0x6389, 0x6389, 0x10BB,\n    0x638C, 0x638C, 0x1991, 0x6392, 0x6392, 0x136E, 0x6396, 0x6396, 0x16DD,\n    0x6398, 0x6398, 0x0F79, 0x639B, 0x639B, 0x0F0D, 0x63A0, 0x63A0, 0x1149,\n    0x63A1, 0x63A1, 0x1BCF, 0x63A2, 0x63A2, 0x1CFC, 0x63A5, 0x63A5, 0x1A2D,\n    0x63A7, 0x63A7, 0x0ED3, 0x63A8, 0x63A8, 0x1C63, 0x63A9, 0x63A9, 0x1729,\n    0x63AA, 0x63AA, 0x1A85, 0x63C0, 0x63C0, 0x0D9C, 0x63C4, 0x63C4, 0x18B4,\n    0x63C6, 0x63C6, 0x0F9D, 0x63CF, 0x63CF, 0x12C4, 0x63D0, 0x63D0, 0x1A6E,\n    0x63D6, 0x63D6, 0x18F3, 0x63DA, 0x63DA, 0x16FB, 0x63DB, 0x63DB, 0x1ED0,\n    0x63E1, 0x63E1, 0x16A7, 0x63ED, 0x63ED, 0x0E2D, 0x63EE, 0x63EE, 0x1F3F,\n    0x63F4, 0x63F4, 0x187A, 0x63F6, 0x63F6, 0x16EB, 0x63F7, 0x63F7, 0x14CF,\n    0x640D, 0x640D, 0x15AC, 0x640F, 0x640F, 0x1319, 0x6414, 0x6414, 0x1585,\n    0x6416, 0x6416, 0x1805, 0x6417, 0x6417, 0x10BC, 0x641C, 0x641C, 0x15CE,\n    0x6422, 0x6422, 0x1B48, 0x642C, 0x642C, 0x132E, 0x642D, 0x642D, 0x1D01,\n    0x643A, 0x643A, 0x1F46, 0x643E, 0x643E, 0x1B90, 0x6458, 0x6458, 0x19DF,\n    0x6460, 0x6460, 0x1C58, 0x6469, 0x6469, 0x1230, 0x646F, 0x646F, 0x1B26,\n    0x6478, 0x6479, 0x12A2, 0x647A, 0x647A, 0x1A2E, 0x6488, 0x6488, 0x11A0,\n    0x6491, 0x6491, 0x1D17, 0x6492, 0x6492, 0x14C4, 0x6493, 0x6493, 0x1806,\n    0x649A, 0x649A, 0x1041, 0x649E, 0x649E, 0x1094, 0x64A4, 0x64A4, 0x1C03,\n    0x64A5, 0x64A5, 0x1344, 0x64AB, 0x64AB, 0x12D2, 0x64AD, 0x64AD, 0x1D36,\n    0x64AE, 0x64AE, 0x1C5D, 0x64B0, 0x64B0, 0x1B96, 0x64B2, 0x64B2, 0x131A,\n    0x64BB, 0x64BB, 0x1074, 0x64C1, 0x64C1, 0x17CB, 0x64C4, 0x64C4, 0x11A1,\n    0x64C5, 0x64C5, 0x1BF1, 0x64C7, 0x64C7, 0x1D15, 0x64CA, 0x64CA, 0x0E2E,\n    0x64CD, 0x64CD, 0x1A86, 0x64CE, 0x64CE, 0x0E5A, 0x64D2, 0x64D2, 0x0FC8,\n    0x64D4, 0x64D4, 0x107C, 0x64D8, 0x64D8, 0x139F, 0x64DA, 0x64DA, 0x0E07,\n    0x64E1, 0x64E1, 0x10A3, 0x64E2, 0x64E2, 0x1CE7, 0x64E5, 0x64E5, 0x1130,\n    0x64E6, 0x64E6, 0x1BA7, 0x64E7, 0x64E7, 0x0E08, 0x64EC, 0x64EC, 0x1900,\n    0x64F2, 0x64F2, 0x1BE4, 0x64F4, 0x64F4, 0x1EC5, 0x64FA, 0x64FA, 0x1D37,\n    0x64FE, 0x64FE, 0x1807, 0x6500, 0x6500, 0x132F, 0x6504, 0x6504, 0x1D18,\n    0x6518, 0x6518, 0x16FC, 0x651D, 0x651D, 0x155F, 0x6523, 0x6523, 0x1173,\n    0x652A, 0x652A, 0x0F23, 0x652B, 0x652B, 0x1EC6, 0x652C, 0x652C, 0x1131,\n    0x652F, 0x652F, 0x1B27, 0x6536, 0x6536, 0x15CF, 0x6537, 0x6537, 0x0E9B,\n    0x6538, 0x6538, 0x18B5, 0x6539, 0x6539, 0x0DF0, 0x653B, 0x653B, 0x0ED4,\n    0x653E, 0x653E, 0x1355, 0x653F, 0x653F, 0x1A3E, 0x6545, 0x6545, 0x0E9C,\n    0x6548, 0x6548, 0x1F14, 0x654D, 0x654D, 0x1506, 0x654E, 0x654E, 0x0F24,\n    0x654F, 0x654F, 0x130A, 0x6551, 0x6551, 0x0F48, 0x6556, 0x6556, 0x17B0,\n    0x6557, 0x6557, 0x1D51, 0x655E, 0x655E, 0x1BBC, 0x6562, 0x6562, 0x0DBD,\n    0x6563, 0x6563, 0x14BA, 0x6566, 0x6566, 0x10E1, 0x656C, 0x656C, 0x0E5B,\n    0x656D, 0x656D, 0x16FD, 0x6572, 0x6572, 0x0E9D, 0x6574, 0x6574, 0x1A3F,\n    0x6575, 0x6575, 0x19E0, 0x6577, 0x6577, 0x1405, 0x6578, 0x6578, 0x15D0,\n    0x657E, 0x657E, 0x1531, 0x6582, 0x6582, 0x1184, 0x6583, 0x6583, 0x1D73,\n    0x6585, 0x6585, 0x1F15, 0x6587, 0x6587, 0x12E8, 0x658C, 0x658C, 0x146A,\n    0x6590, 0x6590, 0x1449, 0x6591, 0x6591, 0x1330, 0x6597, 0x6597, 0x10FD,\n    0x6599, 0x6599, 0x11CB, 0x659B, 0x659B, 0x0EB8, 0x659C, 0x659C, 0x1492,\n    0x659F, 0x659F, 0x1B76, 0x65A1, 0x65A1, 0x16B9, 0x65A4, 0x65A4, 0x0FBB,\n    0x65A5, 0x65A5, 0x1BE5, 0x65A7, 0x65A7, 0x1406, 0x65AB, 0x65AB, 0x1970,\n    0x65AC, 0x65AC, 0x1BB0, 0x65AF, 0x65AF, 0x1493, 0x65B0, 0x65B0, 0x166E,\n    0x65B7, 0x65B7, 0x1067, 0x65B9, 0x65B9, 0x1356, 0x65BC, 0x65BC, 0x1710,\n    0x65BD, 0x65BD, 0x1647, 0x65C1, 0x65C1, 0x1357, 0x65C5, 0x65C5, 0x115F,\n    0x65CB, 0x65CB, 0x1532, 0x65CC, 0x65CC, 0x1A40, 0x65CF, 0x65CF, 0x1AAC,\n    0x65D2, 0x65D2, 0x11E2, 0x65D7, 0x65D7, 0x0FF1, 0x65E0, 0x65E0, 0x12D3,\n    0x65E3, 0x65E3, 0x0FF2, 0x65E5, 0x65E5, 0x1940, 0x65E6, 0x65E6, 0x1068,\n    0x65E8, 0x65E8, 0x1B28, 0x65E9, 0x65E9, 0x1A87, 0x65EC, 0x65EC, 0x160C,\n    0x65ED, 0x65ED, 0x1857, 0x65F1, 0x65F1, 0x1DD6, 0x65F4, 0x65F4, 0x1841,\n    0x65FA, 0x65FA, 0x17EF, 0x65FB, 0x65FC, 0x130B, 0x65FD, 0x65FD, 0x10E2,\n    0x65FF, 0x65FF, 0x17B1, 0x6606, 0x6606, 0x0EC1, 0x6607, 0x6607, 0x1638,\n    0x6609, 0x6609, 0x1358, 0x660A, 0x660A, 0x1E82, 0x660C, 0x660C, 0x1BBD,\n    0x660E, 0x660E, 0x128F, 0x660F, 0x660F, 0x1EA5, 0x6610, 0x6610, 0x1429,\n    0x6611, 0x6611, 0x0FC9, 0x6613, 0x6613, 0x173E, 0x6614, 0x6614, 0x151F,\n    0x6615, 0x6615, 0x1F53, 0x661E, 0x661E, 0x13B6, 0x661F, 0x661F, 0x1568,\n    0x6620, 0x6620, 0x1775, 0x6625, 0x6625, 0x1C84, 0x6627, 0x6627, 0x1268,\n    0x6628, 0x6628, 0x1971, 0x662D, 0x662D, 0x1586, 0x662F, 0x662F, 0x1648,\n    0x6630, 0x6630, 0x1DC5, 0x6631, 0x6631, 0x1858, 0x6634, 0x6634, 0x12C5,\n    0x6636, 0x6636, 0x1BBE, 0x663A, 0x663A, 0x13B7, 0x663B, 0x663B, 0x16CC,\n    0x6641, 0x6641, 0x1A88, 0x6642, 0x6642, 0x1649, 0x6643, 0x6644, 0x1EE7,\n    0x6649, 0x6649, 0x1B49, 0x664B, 0x664B, 0x1B4A, 0x664F, 0x664F, 0x16B2,\n    0x6659, 0x6659, 0x1AFC, 0x665B, 0x665B, 0x1E3A, 0x665D, 0x665D, 0x1AD9,\n    0x665E, 0x665E, 0x1F6E, 0x665F, 0x665F, 0x1569, 0x6664, 0x6664, 0x17B2,\n    0x6665, 0x6665, 0x1ED2, 0x6666, 0x6666, 0x1EFF, 0x6667, 0x6667, 0x1E83,\n    0x6668, 0x6668, 0x166F, 0x6669, 0x6669, 0x1245, 0x666B, 0x666B, 0x1CE8,\n    0x666E, 0x666E, 0x13C6, 0x666F, 0x666F, 0x0E5C, 0x6673, 0x6673, 0x1520,\n    0x6674, 0x6674, 0x1C1E, 0x6676, 0x6676, 0x1A41, 0x6677, 0x6677, 0x0F96,\n    0x6678, 0x6678, 0x1A42, 0x667A, 0x667A, 0x1B29, 0x6684, 0x6684, 0x1F37,\n    0x6687, 0x6687, 0x0D77, 0x6688, 0x6688, 0x1F34, 0x6689, 0x6689, 0x1F40,\n    0x668E, 0x668E, 0x1776, 0x6690, 0x6690, 0x1895, 0x6691, 0x6691, 0x1507,\n    0x6696, 0x6696, 0x102C, 0x6697, 0x6697, 0x16C1, 0x6698, 0x6698, 0x16FE,\n    0x669D, 0x669D, 0x1290, 0x66A0, 0x66A0, 0x0E9E, 0x66A2, 0x66A2, 0x1BBF,\n    0x66AB, 0x66AB, 0x1980, 0x66AE, 0x66AE, 0x12A4, 0x66B2, 0x66B2, 0x1992,\n    0x66B3, 0x66B3, 0x1E73, 0x66B4, 0x66B4, 0x1D94, 0x66B9, 0x66B9, 0x1558,\n    0x66BB, 0x66BB, 0x0E5D, 0x66BE, 0x66BE, 0x10E3, 0x66C4, 0x66C4, 0x176F,\n    0x66C6, 0x66C6, 0x116B, 0x66C7, 0x66C7, 0x107D, 0x66C9, 0x66C9, 0x1F16,\n    0x66D6, 0x66D6, 0x16D5, 0x66D9, 0x66D9, 0x1508, 0x66DC, 0x66DC, 0x1808,\n    0x66DD, 0x66DD, 0x1D95, 0x66E0, 0x66E0, 0x0F04, 0x66E6, 0x66E6, 0x1F6F,\n    0x66F0, 0x66F0, 0x17ED, 0x66F2, 0x66F2, 0x0EB9, 0x66F3, 0x66F3, 0x1791,\n    0x66F4, 0x66F4, 0x0E5E, 0x66F7, 0x66F7, 0x0DAE, 0x66F8, 0x66F8, 0x1509,\n    0x66F9, 0x66F9, 0x1A8A, 0x66FA, 0x66FA, 0x1A89, 0x66FC, 0x66FC, 0x1246,\n    0x66FE, 0x66FE, 0x1B15, 0x66FF, 0x66FF, 0x1C26, 0x6700, 0x6700, 0x1C60,\n    0x6703, 0x6703, 0x1F00, 0x6708, 0x6708, 0x1889, 0x6709, 0x6709, 0x18B6,\n    0x670B, 0x670B, 0x1438, 0x670D, 0x670D, 0x13D8, 0x6714, 0x6714, 0x14B6,\n    0x6715, 0x6715, 0x1B77, 0x6717, 0x6717, 0x113D, 0x671B, 0x671B, 0x125C,\n    0x671D, 0x671D, 0x1A8B, 0x671E, 0x671F, 0x0FF3, 0x6726, 0x6726, 0x12BE,\n    0x6727, 0x6727, 0x11BA, 0x6728, 0x6728, 0x12B4, 0x672A, 0x672A, 0x12F9,\n    0x672B, 0x672B, 0x1253, 0x672C, 0x672C, 0x13E3, 0x672D, 0x672D, 0x1BA8,\n    0x672E, 0x672E, 0x1C88, 0x6731, 0x6731, 0x1ADA, 0x6734, 0x6734, 0x131B,\n    0x6736, 0x6736, 0x1CDC, 0x673A, 0x673A, 0x0F90, 0x673D, 0x673D, 0x1F27,\n    0x6746, 0x6746, 0x0D9D, 0x6749, 0x6749, 0x14C9, 0x674E, 0x674E, 0x120C,\n    0x674F, 0x674F, 0x1E1B, 0x6750, 0x6750, 0x19AF, 0x6751, 0x6751, 0x1C51,\n    0x6753, 0x6753, 0x1D9C, 0x6756, 0x6756, 0x1993, 0x675C, 0x675C, 0x10FE,\n    0x675E, 0x675E, 0x0FF5, 0x675F, 0x675F, 0x15A3, 0x676D, 0x676D, 0x1DFD,\n    0x676F, 0x676F, 0x136F, 0x6770, 0x6770, 0x0E1F, 0x6771, 0x6771, 0x10F1,\n    0x6773, 0x6773, 0x12C6, 0x6775, 0x6775, 0x19C6, 0x6777, 0x6777, 0x1D38,\n    0x677B, 0x677B, 0x1057, 0x677E, 0x677E, 0x15B3, 0x677F, 0x677F, 0x1D44,\n    0x6787, 0x6787, 0x144A, 0x6789, 0x6789, 0x17F0, 0x678B, 0x678B, 0x1359,\n    0x678F, 0x678F, 0x1032, 0x6790, 0x6790, 0x1521, 0x6793, 0x6793, 0x10FF,\n    0x6795, 0x6795, 0x1CC9, 0x6797, 0x6797, 0x1227, 0x679A, 0x679A, 0x1269,\n    0x679C, 0x679C, 0x0EDD, 0x679D, 0x679D, 0x1B2A, 0x67AF, 0x67AF, 0x0E9F,\n    0x67B0, 0x67B0, 0x1D6B, 0x67B3, 0x67B3, 0x1B2B, 0x67B6, 0x67B7, 0x0D78,\n    0x67B8, 0x67B8, 0x0F49, 0x67BE, 0x67BE, 0x164A, 0x67C4, 0x67C4, 0x13B8,\n    0x67CF, 0x67CF, 0x137F, 0x67D0, 0x67D0, 0x12A5, 0x67D1, 0x67D1, 0x0DBE,\n    0x67D2, 0x67D2, 0x1CC5, 0x67D3, 0x67D3, 0x1766, 0x67D4, 0x67D4, 0x18B7,\n    0x67DA, 0x67DA, 0x18B8, 0x67DD, 0x67DD, 0x1CE9, 0x67E9, 0x67E9, 0x0F4A,\n    0x67EC, 0x67EC, 0x0D9E, 0x67EF, 0x67EF, 0x0D7A, 0x67F0, 0x67F0, 0x103D,\n    0x67F1, 0x67F1, 0x1ADB, 0x67F3, 0x67F3, 0x11E3, 0x67F4, 0x67F4, 0x164B,\n    0x67F5, 0x67F5, 0x1BD7, 0x67F6, 0x67F6, 0x1494, 0x67FB, 0x67FB, 0x1495,\n    0x67FE, 0x67FE, 0x1A43, 0x6812, 0x6812, 0x160D, 0x6813, 0x6813, 0x1A02,\n    0x6816, 0x6816, 0x150A, 0x6817, 0x6817, 0x11FA, 0x6821, 0x6821, 0x0F25,\n    0x6822, 0x6822, 0x1380, 0x682A, 0x682A, 0x1ADC, 0x682F, 0x682F, 0x1859,\n    0x6838, 0x6838, 0x1E18, 0x6839, 0x6839, 0x0FBC, 0x683C, 0x683C, 0x0E2F,\n    0x683D, 0x683D, 0x19B0, 0x6840, 0x6840, 0x0E20, 0x6841, 0x6841, 0x1DFE,\n    0x6842, 0x6842, 0x0E81, 0x6843, 0x6843, 0x10BD, 0x6848, 0x6848, 0x16B3,\n    0x684E, 0x684E, 0x1B6C, 0x6850, 0x6850, 0x10F2, 0x6851, 0x6851, 0x14E2,\n    0x6853, 0x6853, 0x1ED3, 0x6854, 0x6854, 0x1022, 0x686D, 0x686D, 0x1B4B,\n    0x6876, 0x6876, 0x1D1E, 0x687F, 0x687F, 0x0D9F, 0x6881, 0x6881, 0x114F,\n    0x6885, 0x6885, 0x126A, 0x688F, 0x688F, 0x0EBA, 0x6893, 0x6893, 0x19B1,\n    0x6894, 0x6894, 0x1CAE, 0x6897, 0x6897, 0x0E5F, 0x689D, 0x689D, 0x1A8C,\n    0x689F, 0x689F, 0x1F17, 0x68A1, 0x68A1, 0x17DE, 0x68A2, 0x68A2, 0x1C34,\n    0x68A7, 0x68A7, 0x17B3, 0x68A8, 0x68A8, 0x120D, 0x68AD, 0x68AD, 0x1496,\n    0x68AF, 0x68AF, 0x1A6F, 0x68B0, 0x68B0, 0x0E82, 0x68B1, 0x68B1, 0x0EC2,\n    0x68B3, 0x68B3, 0x1587, 0x68B5, 0x68B5, 0x1393, 0x68B6, 0x68B6, 0x12FA,\n    0x68C4, 0x68C4, 0x0FF7, 0x68C5, 0x68C5, 0x13B9, 0x68C9, 0x68C9, 0x1282,\n    0x68CB, 0x68CB, 0x0FF6, 0x68CD, 0x68CD, 0x0EC3, 0x68D2, 0x68D2, 0x13EB,\n    0x68D5, 0x68D5, 0x1ABA, 0x68D7, 0x68D7, 0x1A8D, 0x68D8, 0x68D8, 0x0FB4,\n    0x68DA, 0x68DA, 0x1439, 0x68DF, 0x68DF, 0x10F3, 0x68E0, 0x68E0, 0x1095,\n    0x68E7, 0x68E7, 0x197B, 0x68E8, 0x68E8, 0x0E83, 0x68EE, 0x68EE, 0x14CA,\n    0x68F2, 0x68F2, 0x150B, 0x68F9, 0x68F9, 0x10BE, 0x68FA, 0x68FA, 0x0EEF,\n    0x6900, 0x6900, 0x17DF, 0x6905, 0x6905, 0x1901, 0x690D, 0x690D, 0x165D,\n    0x690E, 0x690E, 0x1C64, 0x6912, 0x6912, 0x1C35, 0x6927, 0x6927, 0x1291,\n    0x6930, 0x6930, 0x16EC, 0x693D, 0x693D, 0x174C, 0x693F, 0x693F, 0x1C85,\n    0x694A, 0x694A, 0x16FF, 0x6953, 0x6953, 0x1DA8, 0x6954, 0x6954, 0x154C,\n    0x6955, 0x6955, 0x1CDD, 0x6957, 0x6957, 0x0E17, 0x6959, 0x6959, 0x12D4,\n    0x695A, 0x695A, 0x1C36, 0x695E, 0x695E, 0x1200, 0x6960, 0x6960, 0x1033,\n    0x6961, 0x6962, 0x18B9, 0x6963, 0x6963, 0x12FB, 0x6968, 0x6968, 0x1A44,\n    0x696B, 0x696B, 0x1B10, 0x696D, 0x696D, 0x172C, 0x696E, 0x696E, 0x19C7,\n    0x696F, 0x696F, 0x160E, 0x6975, 0x6975, 0x0FB5, 0x6977, 0x6977, 0x1E0D,\n    0x6978, 0x6978, 0x1C65, 0x6979, 0x6979, 0x1777, 0x6995, 0x6995, 0x1827,\n    0x699B, 0x699B, 0x1B4C, 0x699C, 0x699C, 0x135A, 0x69A5, 0x69A5, 0x1EE9,\n    0x69A7, 0x69A7, 0x144B, 0x69AE, 0x69AE, 0x1778, 0x69B4, 0x69B4, 0x11E4,\n    0x69BB, 0x69BB, 0x1D02, 0x69C1, 0x69C1, 0x0EA0, 0x69C3, 0x69C3, 0x1331,\n    0x69CB, 0x69CB, 0x0F4B, 0x69CC, 0x69CC, 0x1D24, 0x69CD, 0x69CD, 0x1BC0,\n    0x69D0, 0x69D0, 0x0F16, 0x69E8, 0x69E8, 0x0EE8, 0x69EA, 0x69EA, 0x0DF1,\n    0x69FB, 0x69FB, 0x0F9E, 0x69FD, 0x69FD, 0x1A8E, 0x69FF, 0x69FF, 0x0FBD,\n    0x6A02, 0x6A02, 0x16A8, 0x6A0A, 0x6A0A, 0x1385, 0x6A11, 0x6A11, 0x1150,\n    0x6A13, 0x6A13, 0x11D7, 0x6A17, 0x6A17, 0x19C8, 0x6A19, 0x6A19, 0x1D9D,\n    0x6A1E, 0x6A1E, 0x1C66, 0x6A1F, 0x6A1F, 0x1994, 0x6A21, 0x6A21, 0x12A6,\n    0x6A23, 0x6A23, 0x1700, 0x6A35, 0x6A35, 0x1C37, 0x6A38, 0x6A38, 0x131C,\n    0x6A39, 0x6A39, 0x15D1, 0x6A3A, 0x6A3A, 0x1EBA, 0x6A3D, 0x6A3D, 0x1AFD,\n    0x6A44, 0x6A44, 0x0DBF, 0x6A48, 0x6A48, 0x1809, 0x6A4B, 0x6A4B, 0x0F26,\n    0x6A52, 0x6A52, 0x185F, 0x6A53, 0x6A53, 0x160F, 0x6A58, 0x6A58, 0x0FAF,\n    0x6A59, 0x6A59, 0x110E, 0x6A5F, 0x6A5F, 0x0FF8, 0x6A61, 0x6A61, 0x14E3,\n    0x6A6B, 0x6A6B, 0x1F0F, 0x6A80, 0x6A80, 0x1069, 0x6A84, 0x6A84, 0x0E30,\n    0x6A89, 0x6A89, 0x1A45, 0x6A8D, 0x6A8D, 0x171B, 0x6A8E, 0x6A8E, 0x0FCA,\n    0x6A97, 0x6A97, 0x13A0, 0x6A9C, 0x6A9C, 0x1F01, 0x6AA2, 0x6AA2, 0x0E24,\n    0x6AA3, 0x6AA3, 0x1995, 0x6AB3, 0x6AB3, 0x146B, 0x6ABB, 0x6ABB, 0x1DE8,\n    0x6AC2, 0x6AC2, 0x10BF, 0x6AC3, 0x6AC3, 0x0F91, 0x6AD3, 0x6AD3, 0x11A2,\n    0x6ADA, 0x6ADA, 0x1160, 0x6ADB, 0x6ADB, 0x1B0F, 0x6AF6, 0x6AF6, 0x1E2C,\n    0x6AFB, 0x6AFB, 0x16E2, 0x6B04, 0x6B04, 0x1127, 0x6B0A, 0x6B0A, 0x0F88,\n    0x6B0C, 0x6B0C, 0x1996, 0x6B12, 0x6B12, 0x1128, 0x6B16, 0x6B16, 0x1132,\n    0x6B20, 0x6B20, 0x1F5B, 0x6B21, 0x6B21, 0x1B88, 0x6B23, 0x6B23, 0x1F54,\n    0x6B32, 0x6B32, 0x1819, 0x6B3A, 0x6B3A, 0x0FF9, 0x6B3D, 0x6B3D, 0x1F5C,\n    0x6B3E, 0x6B3E, 0x0EF0, 0x6B46, 0x6B46, 0x1F5D, 0x6B47, 0x6B47, 0x1E2F,\n    0x6B4C, 0x6B4C, 0x0D7B, 0x6B4E, 0x6B4E, 0x1CF5, 0x6B50, 0x6B50, 0x0F4C,\n    0x6B5F, 0x6B5F, 0x1731, 0x6B61, 0x6B61, 0x1ED1, 0x6B62, 0x6B62, 0x1B2C,\n    0x6B63, 0x6B63, 0x1A46, 0x6B64, 0x6B64, 0x1B89, 0x6B65, 0x6B65, 0x13C7,\n    0x6B66, 0x6B66, 0x12D5, 0x6B6A, 0x6B6A, 0x17F5, 0x6B72, 0x6B72, 0x1576,\n    0x6B77, 0x6B77, 0x116C, 0x6B78, 0x6B78, 0x0F97, 0x6B7B, 0x6B7B, 0x1497,\n    0x6B7F, 0x6B7F, 0x12BB, 0x6B83, 0x6B83, 0x16CD, 0x6B84, 0x6B84, 0x1B4D,\n    0x6B86, 0x6B86, 0x1D0C, 0x6B89, 0x6B89, 0x1610, 0x6B8A, 0x6B8A, 0x15D2,\n    0x6B96, 0x6B96, 0x165E, 0x6B98, 0x6B98, 0x197C, 0x6B9E, 0x6B9E, 0x1860,\n    0x6BAE, 0x6BAE, 0x1185, 0x6BAF, 0x6BAF, 0x146C, 0x6BB2, 0x6BB2, 0x1559,\n    0x6BB5, 0x6BB5, 0x106A, 0x6BB7, 0x6BB7, 0x18E8, 0x6BBA, 0x6BBA, 0x14C5,\n    0x6BBC, 0x6BBC, 0x0D8E, 0x6BBF, 0x6BBF, 0x1A03, 0x6BC1, 0x6BC1, 0x1F3C,\n    0x6BC5, 0x6BC5, 0x1902, 0x6BC6, 0x6BC6, 0x0F4D, 0x6BCB, 0x6BCB, 0x12D6,\n    0x6BCD, 0x6BCD, 0x12A7, 0x6BCF, 0x6BCF, 0x126B, 0x6BD2, 0x6BD2, 0x10D5,\n    0x6BD3, 0x6BD3, 0x18D4, 0x6BD4, 0x6BD4, 0x144C, 0x6BD6, 0x6BD8, 0x144D,\n    0x6BDB, 0x6BDB, 0x12A8, 0x6BEB, 0x6BEB, 0x1E84, 0x6BEC, 0x6BEC, 0x0F4E,\n    0x6C08, 0x6C08, 0x1A04, 0x6C0F, 0x6C0F, 0x168E, 0x6C11, 0x6C11, 0x130D,\n    0x6C13, 0x6C13, 0x1278, 0x6C23, 0x6C23, 0x0FFA, 0x6C34, 0x6C34, 0x15D3,\n    0x6C37, 0x6C37, 0x1476, 0x6C38, 0x6C38, 0x1779, 0x6C3E, 0x6C3E, 0x1394,\n    0x6C40, 0x6C40, 0x1A47, 0x6C41, 0x6C41, 0x1B11, 0x6C42, 0x6C42, 0x0F4F,\n    0x6C4E, 0x6C4E, 0x1395, 0x6C50, 0x6C50, 0x1522, 0x6C55, 0x6C55, 0x14BB,\n    0x6C57, 0x6C57, 0x1DD7, 0x6C5A, 0x6C5A, 0x17B4, 0x6C5D, 0x6C5D, 0x1732,\n    0x6C5E, 0x6C5E, 0x1EAF, 0x6C5F, 0x6C5F, 0x0DD9, 0x6C60, 0x6C60, 0x1B2D,\n    0x6C68, 0x6C68, 0x0EC8, 0x6C6A, 0x6C6A, 0x17F1, 0x6C6D, 0x6C6D, 0x1792,\n    0x6C70, 0x6C70, 0x1D0D, 0x6C72, 0x6C72, 0x0FD7, 0x6C76, 0x6C76, 0x12E9,\n    0x6C7A, 0x6C7A, 0x0E41, 0x6C7D, 0x6C7D, 0x0FFB, 0x6C7E, 0x6C7E, 0x142A,\n    0x6C81, 0x6C81, 0x1685, 0x6C82, 0x6C82, 0x0FFC, 0x6C83, 0x6C83, 0x17BF,\n    0x6C85, 0x6C85, 0x187B, 0x6C86, 0x6C86, 0x1DFF, 0x6C87, 0x6C87, 0x174D,\n    0x6C88, 0x6C88, 0x1CCA, 0x6C8C, 0x6C8C, 0x10E4, 0x6C90, 0x6C90, 0x12B5,\n    0x6C92, 0x6C92, 0x12BC, 0x6C93, 0x6C93, 0x108A, 0x6C94, 0x6C94, 0x1283,\n    0x6C95, 0x6C95, 0x12F1, 0x6C96, 0x6C96, 0x1C8C, 0x6C99, 0x6C99, 0x1498,\n    0x6C9A, 0x6C9A, 0x1B2E, 0x6C9B, 0x6C9B, 0x1D52, 0x6CAB, 0x6CAB, 0x1254,\n    0x6CAE, 0x6CAE, 0x19C9, 0x6CB3, 0x6CB3, 0x1DC6, 0x6CB8, 0x6CB8, 0x1450,\n    0x6CB9, 0x6CB9, 0x18BB, 0x6CBB, 0x6CBB, 0x1CAF, 0x6CBC, 0x6CBC, 0x1588,\n    0x6CBD, 0x6CBD, 0x0EA1, 0x6CBE, 0x6CBE, 0x1C0B, 0x6CBF, 0x6CBF, 0x174E,\n    0x6CC1, 0x6CC1, 0x1EEA, 0x6CC2, 0x6CC2, 0x1E60, 0x6CC4, 0x6CC4, 0x154D,\n    0x6CC9, 0x6CC9, 0x1BF2, 0x6CCA, 0x6CCA, 0x131D, 0x6CCC, 0x6CCC, 0x1DB7,\n    0x6CD3, 0x6CD3, 0x1EB0, 0x6CD5, 0x6CD5, 0x139A, 0x6CD7, 0x6CD7, 0x1499,\n    0x6CDB, 0x6CDB, 0x1396, 0x6CE1, 0x6CE1, 0x1D84, 0x6CE2, 0x6CE2, 0x1D39,\n    0x6CE3, 0x6CE3, 0x18F4, 0x6CE5, 0x6CE5, 0x105B, 0x6CE8, 0x6CE8, 0x1ADD,\n    0x6CEB, 0x6CEB, 0x1E3B, 0x6CEE, 0x6CEE, 0x1332, 0x6CEF, 0x6CEF, 0x130E,\n    0x6CF0, 0x6CF0, 0x1D0E, 0x6CF3, 0x6CF3, 0x177A, 0x6D0B, 0x6D0B, 0x1701,\n    0x6D0C, 0x6D0C, 0x1180, 0x6D11, 0x6D11, 0x13C8, 0x6D17, 0x6D17, 0x1577,\n    0x6D19, 0x6D19, 0x15D4, 0x6D1B, 0x6D1B, 0x111E, 0x6D1E, 0x6D1E, 0x10F4,\n    0x6D25, 0x6D25, 0x1B4E, 0x6D27, 0x6D27, 0x18BC, 0x6D29, 0x6D29, 0x154E,\n    0x6D2A, 0x6D2A, 0x1EB1, 0x6D32, 0x6D32, 0x1ADE, 0x6D35, 0x6D35, 0x1611,\n    0x6D36, 0x6D36, 0x1F50, 0x6D38, 0x6D38, 0x0F05, 0x6D39, 0x6D39, 0x187C,\n    0x6D3B, 0x6D3B, 0x1EDB, 0x6D3D, 0x6D3D, 0x1F60, 0x6D3E, 0x6D3E, 0x1D3A,\n    0x6D41, 0x6D41, 0x11E5, 0x6D59, 0x6D59, 0x1A1F, 0x6D5A, 0x6D5A, 0x1AFE,\n    0x6D5C, 0x6D5C, 0x146D, 0x6D63, 0x6D63, 0x17E0, 0x6D66, 0x6D66, 0x1D85,\n    0x6D69, 0x6D69, 0x1E85, 0x6D6A, 0x6D6A, 0x113E, 0x6D6C, 0x6D6C, 0x120E,\n    0x6D6E, 0x6D6E, 0x1407, 0x6D74, 0x6D74, 0x181A, 0x6D77, 0x6D77, 0x1E0E,\n    0x6D78, 0x6D78, 0x1CCB, 0x6D79, 0x6D79, 0x1E54, 0x6D7F, 0x6D7F, 0x1D53,\n    0x6D85, 0x6D85, 0x1762, 0x6D87, 0x6D87, 0x0E60, 0x6D88, 0x6D88, 0x1589,\n    0x6D89, 0x6D89, 0x1560, 0x6D8C, 0x6D8C, 0x1828, 0x6D8D, 0x6D8D, 0x1F18,\n    0x6D8E, 0x6D8E, 0x174F, 0x6D91, 0x6D91, 0x15A4, 0x6D93, 0x6D93, 0x1750,\n    0x6D95, 0x6D95, 0x1C27, 0x6DAF, 0x6DAF, 0x16D6, 0x6DB2, 0x6DB2, 0x16DE,\n    0x6DB5, 0x6DB5, 0x1DE9, 0x6DC0, 0x6DC0, 0x1A48, 0x6DC3, 0x6DC3, 0x0F89,\n    0x6DC4, 0x6DC4, 0x1CB0, 0x6DC5, 0x6DC5, 0x1523, 0x6DC6, 0x6DC6, 0x1F19,\n    0x6DC7, 0x6DC7, 0x0FFD, 0x6DCB, 0x6DCB, 0x1228, 0x6DCF, 0x6DCF, 0x1E86,\n    0x6DD1, 0x6DD1, 0x1601, 0x6DD8, 0x6DD8, 0x10C0, 0x6DD9, 0x6DD9, 0x1ABB,\n    0x6DDA, 0x6DDA, 0x11D8, 0x6DDE, 0x6DDE, 0x15B4, 0x6DE1, 0x6DE1, 0x107E,\n    0x6DE8, 0x6DE8, 0x1A49, 0x6DEA, 0x6DEA, 0x11F5, 0x6DEB, 0x6DEB, 0x18EE,\n    0x6DEE, 0x6DEE, 0x1F02, 0x6DF1, 0x6DF1, 0x1686, 0x6DF3, 0x6DF3, 0x1612,\n    0x6DF5, 0x6DF5, 0x1751, 0x6DF7, 0x6DF7, 0x1EA6, 0x6DF8, 0x6DF8, 0x1C1F,\n    0x6DF9, 0x6DF9, 0x172A, 0x6DFA, 0x6DFA, 0x1BF3, 0x6DFB, 0x6DFB, 0x1C0C,\n    0x6E17, 0x6E17, 0x14CB, 0x6E19, 0x6E19, 0x1ED4, 0x6E1A, 0x6E1A, 0x19CA,\n    0x6E1B, 0x6E1B, 0x0DC0, 0x6E1F, 0x6E1F, 0x1A4A, 0x6E20, 0x6E20, 0x0E09,\n    0x6E21, 0x6E21, 0x10C1, 0x6E23, 0x6E23, 0x149A, 0x6E24, 0x6E24, 0x1345,\n    0x6E25, 0x6E25, 0x16A9, 0x6E26, 0x6E26, 0x17D3, 0x6E2B, 0x6E2B, 0x154F,\n    0x6E2C, 0x6E2C, 0x1CA6, 0x6E2D, 0x6E2D, 0x1896, 0x6E2F, 0x6E2F, 0x1E00,\n    0x6E32, 0x6E32, 0x1533, 0x6E34, 0x6E34, 0x0DAF, 0x6E36, 0x6E36, 0x177B,\n    0x6E38, 0x6E38, 0x18BD, 0x6E3A, 0x6E3A, 0x12C7, 0x6E3C, 0x6E3C, 0x12FC,\n    0x6E3D, 0x6E3D, 0x19B2, 0x6E3E, 0x6E3E, 0x1EA7, 0x6E43, 0x6E43, 0x1370,\n    0x6E44, 0x6E44, 0x12FD, 0x6E4A, 0x6E4A, 0x1ADF, 0x6E4D, 0x6E4D, 0x106B,\n    0x6E56, 0x6E56, 0x1E87, 0x6E58, 0x6E58, 0x14E4, 0x6E5B, 0x6E5B, 0x107F,\n    0x6E5C, 0x6E5C, 0x165F, 0x6E5E, 0x6E5E, 0x1A4B, 0x6E5F, 0x6E5F, 0x1EEB,\n    0x6E67, 0x6E67, 0x1829, 0x6E6B, 0x6E6B, 0x1C67, 0x6E6E, 0x6E6E, 0x1935,\n    0x6E6F, 0x6E6F, 0x1D05, 0x6E72, 0x6E72, 0x187D, 0x6E73, 0x6E73, 0x1034,\n    0x6E7A, 0x6E7A, 0x13C9, 0x6E90, 0x6E90, 0x187E, 0x6E96, 0x6E96, 0x1AFF,\n    0x6E9C, 0x6E9C, 0x11E6, 0x6E9D, 0x6E9D, 0x0F50, 0x6E9F, 0x6E9F, 0x1292,\n    0x6EA2, 0x6EA2, 0x1941, 0x6EA5, 0x6EA5, 0x1408, 0x6EAA, 0x6EAA, 0x0E84,\n    0x6EAB, 0x6EAB, 0x17C3, 0x6EAF, 0x6EAF, 0x158A, 0x6EB1, 0x6EB1, 0x1B4F,\n    0x6EB6, 0x6EB6, 0x182A, 0x6EBA, 0x6EBA, 0x105D, 0x6EC2, 0x6EC2, 0x135B,\n    0x6EC4, 0x6EC4, 0x1BC1, 0x6EC5, 0x6EC5, 0x128A, 0x6EC9, 0x6EC9, 0x1EEC,\n    0x6ECB, 0x6ECB, 0x195D, 0x6ECC, 0x6ECC, 0x1BE6, 0x6ECE, 0x6ECE, 0x1E61,\n    0x6ED1, 0x6ED1, 0x1EDC, 0x6ED3, 0x6ED3, 0x19B3, 0x6ED4, 0x6ED4, 0x10C2,\n    0x6EEF, 0x6EEF, 0x1C28, 0x6EF4, 0x6EF4, 0x19E1, 0x6EF8, 0x6EF8, 0x1E88,\n    0x6EFE, 0x6EFE, 0x0EC4, 0x6EFF, 0x6EFF, 0x1247, 0x6F01, 0x6F01, 0x1711,\n    0x6F02, 0x6F02, 0x1D9E, 0x6F06, 0x6F06, 0x1CC6, 0x6F0F, 0x6F0F, 0x11D9,\n    0x6F11, 0x6F11, 0x0DF2, 0x6F14, 0x6F14, 0x1752, 0x6F15, 0x6F15, 0x1A8F,\n    0x6F20, 0x6F20, 0x123A, 0x6F22, 0x6F22, 0x1DD8, 0x6F23, 0x6F23, 0x1174,\n    0x6F2B, 0x6F2B, 0x1248, 0x6F2C, 0x6F2C, 0x1B2F, 0x6F31, 0x6F31, 0x15D5,\n    0x6F32, 0x6F32, 0x1BC2, 0x6F38, 0x6F38, 0x1A27, 0x6F3F, 0x6F3F, 0x1997,\n    0x6F41, 0x6F41, 0x177C, 0x6F51, 0x6F51, 0x1346, 0x6F54, 0x6F54, 0x0E42,\n    0x6F57, 0x6F57, 0x1B79, 0x6F58, 0x6F58, 0x1333, 0x6F5A, 0x6F5A, 0x1602,\n    0x6F5B, 0x6F5B, 0x1981, 0x6F5E, 0x6F5E, 0x11A3, 0x6F5F, 0x6F5F, 0x1524,\n    0x6F62, 0x6F62, 0x1EED, 0x6F64, 0x6F64, 0x18DA, 0x6F6D, 0x6F6D, 0x1080,\n    0x6F6E, 0x6F6E, 0x1A90, 0x6F70, 0x6F70, 0x0F92, 0x6F7A, 0x6F7A, 0x197D,\n    0x6F7C, 0x6F7C, 0x10F5, 0x6F7D, 0x6F7D, 0x13CA, 0x6F7E, 0x6F7E, 0x121F,\n    0x6F81, 0x6F81, 0x14D0, 0x6F84, 0x6F84, 0x1B80, 0x6F88, 0x6F88, 0x1C04,\n    0x6F8D, 0x6F8D, 0x1AE0, 0x6F8E, 0x6F8E, 0x1D5A, 0x6F90, 0x6F90, 0x1861,\n    0x6F94, 0x6F94, 0x1E89, 0x6F97, 0x6F97, 0x0DA0, 0x6FA3, 0x6FA3, 0x1DD9,\n    0x6FA4, 0x6FA4, 0x1D16, 0x6FA7, 0x6FA7, 0x119B, 0x6FAE, 0x6FAE, 0x1F03,\n    0x6FAF, 0x6FAF, 0x1B97, 0x6FB1, 0x6FB1, 0x1A05, 0x6FB3, 0x6FB3, 0x17B5,\n    0x6FB9, 0x6FB9, 0x1081, 0x6FBE, 0x6FBE, 0x1075, 0x6FC0, 0x6FC0, 0x0E31,\n    0x6FC1, 0x6FC1, 0x1CEA, 0x6FC2, 0x6FC2, 0x1186, 0x6FC3, 0x6FC3, 0x104F,\n    0x6FCA, 0x6FCA, 0x1793, 0x6FD5, 0x6FD5, 0x162D, 0x6FDA, 0x6FDA, 0x177D,\n    0x6FDF, 0x6FDF, 0x1A70, 0x6FE0, 0x6FE0, 0x1E8A, 0x6FE1, 0x6FE1, 0x18BE,\n    0x6FE4, 0x6FE4, 0x10C3, 0x6FE9, 0x6FE9, 0x1E8B, 0x6FEB, 0x6FEB, 0x1133,\n    0x6FEC, 0x6FEC, 0x1B00, 0x6FEF, 0x6FEF, 0x1CEB, 0x6FF1, 0x6FF1, 0x146E,\n    0x6FFE, 0x6FFE, 0x1161, 0x7001, 0x7001, 0x1702, 0x7005, 0x7005, 0x1E62,\n    0x7006, 0x7006, 0x10D6, 0x7009, 0x7009, 0x149B, 0x700B, 0x700B, 0x1687,\n    0x700F, 0x700F, 0x11E7, 0x7011, 0x7011, 0x1D96, 0x7015, 0x7015, 0x146F,\n    0x7018, 0x7018, 0x11A4, 0x701A, 0x701A, 0x1DDA, 0x701B, 0x701B, 0x177E,\n    0x701C, 0x701C, 0x18E2, 0x701D, 0x701D, 0x116D, 0x701E, 0x701E, 0x1A4C,\n    0x701F, 0x701F, 0x158B, 0x7023, 0x7023, 0x1E0F, 0x7027, 0x7027, 0x11BB,\n    0x7028, 0x7028, 0x11C0, 0x702F, 0x702F, 0x177F, 0x7037, 0x7037, 0x1925,\n    0x703E, 0x703E, 0x1129, 0x704C, 0x704C, 0x0EF1, 0x7050, 0x7050, 0x1E63,\n    0x7051, 0x7051, 0x15BA, 0x7058, 0x7058, 0x1CF6, 0x705D, 0x705D, 0x1E8C,\n    0x7063, 0x7063, 0x1249, 0x706B, 0x706B, 0x1EBB, 0x7070, 0x7070, 0x1F04,\n    0x7078, 0x7078, 0x0F51, 0x707C, 0x707C, 0x1972, 0x707D, 0x707D, 0x19B4,\n    0x7085, 0x7085, 0x0E61, 0x708A, 0x708A, 0x1C99, 0x708E, 0x708E, 0x1767,\n    0x7092, 0x7092, 0x1C38, 0x7098, 0x7098, 0x1F55, 0x7099, 0x7099, 0x195E,\n    0x709A, 0x709A, 0x0F06, 0x70A1, 0x70A1, 0x1A4D, 0x70A4, 0x70A4, 0x158C,\n    0x70AB, 0x70AB, 0x1E3C, 0x70AC, 0x70AC, 0x0E0A, 0x70AD, 0x70AD, 0x1CF7,\n    0x70AF, 0x70AF, 0x1E64, 0x70B3, 0x70B3, 0x13BA, 0x70B7, 0x70B7, 0x1AE1,\n    0x70B8, 0x70B8, 0x1973, 0x70B9, 0x70B9, 0x1A28, 0x70C8, 0x70C8, 0x1181,\n    0x70CB, 0x70CB, 0x1F47, 0x70CF, 0x70CF, 0x17B6, 0x70D8, 0x70D8, 0x1EB2,\n    0x70D9, 0x70D9, 0x111F, 0x70DD, 0x70DD, 0x1B17, 0x70DF, 0x70DF, 0x1753,\n    0x70F1, 0x70F1, 0x0E62, 0x70F9, 0x70F9, 0x1D5B, 0x70FD, 0x70FD, 0x13EC,\n    0x7104, 0x7104, 0x1F2F, 0x7109, 0x7109, 0x1720, 0x710C, 0x710C, 0x1B01,\n    0x7119, 0x7119, 0x1371, 0x711A, 0x711A, 0x142B, 0x711E, 0x711E, 0x10E5,\n    0x7121, 0x7121, 0x12D7, 0x7126, 0x7126, 0x1C39, 0x7130, 0x7130, 0x1768,\n    0x7136, 0x7136, 0x1754, 0x7147, 0x7147, 0x1F41, 0x7149, 0x7149, 0x1175,\n    0x714A, 0x714A, 0x1F38, 0x714C, 0x714C, 0x1EEE, 0x714E, 0x714E, 0x1A06,\n    0x7150, 0x7150, 0x1780, 0x7156, 0x7156, 0x102D, 0x7159, 0x7159, 0x1755,\n    0x715C, 0x715C, 0x185A, 0x715E, 0x715E, 0x14C6, 0x7164, 0x7164, 0x126C,\n    0x7165, 0x7165, 0x1ED5, 0x7166, 0x7166, 0x1F28, 0x7167, 0x7167, 0x1A91,\n    0x7169, 0x7169, 0x1386, 0x716C, 0x716C, 0x1703, 0x716E, 0x716E, 0x195F,\n    0x717D, 0x717D, 0x1534, 0x7184, 0x7184, 0x1660, 0x7189, 0x7189, 0x1862,\n    0x718A, 0x718A, 0x186D, 0x718F, 0x718F, 0x1F30, 0x7192, 0x7192, 0x1E65,\n    0x7194, 0x7194, 0x182B, 0x7199, 0x7199, 0x1F70, 0x719F, 0x719F, 0x1603,\n    0x71A2, 0x71A2, 0x13ED, 0x71AC, 0x71AC, 0x17B7, 0x71B1, 0x71B1, 0x1763,\n    0x71B9, 0x71BA, 0x1F71, 0x71BE, 0x71BE, 0x1CB1, 0x71C1, 0x71C1, 0x1770,\n    0x71C3, 0x71C3, 0x1756, 0x71C8, 0x71C8, 0x110F, 0x71C9, 0x71C9, 0x10E6,\n    0x71CE, 0x71CE, 0x11CC, 0x71D0, 0x71D0, 0x1220, 0x71D2, 0x71D2, 0x158D,\n    0x71D4, 0x71D4, 0x1387, 0x71D5, 0x71D5, 0x1757, 0x71DF, 0x71DF, 0x1781,\n    0x71E5, 0x71E5, 0x1A92, 0x71E6, 0x71E6, 0x1B98, 0x71E7, 0x71E7, 0x15D6,\n    0x71ED, 0x71ED, 0x1C4B, 0x71EE, 0x71EE, 0x1561, 0x71FB, 0x71FB, 0x1F31,\n    0x71FC, 0x71FC, 0x1670, 0x71FE, 0x71FE, 0x10C4, 0x71FF, 0x71FF, 0x180A,\n    0x7200, 0x7200, 0x1E33, 0x7206, 0x7206, 0x1D97, 0x7210, 0x7210, 0x11A5,\n    0x721B, 0x721B, 0x112A, 0x722A, 0x722A, 0x1A93, 0x722C, 0x722C, 0x1D3B,\n    0x722D, 0x722D, 0x19BB, 0x7230, 0x7230, 0x187F, 0x7232, 0x7232, 0x1897,\n    0x7235, 0x7235, 0x1974, 0x7236, 0x7236, 0x1409, 0x723A, 0x723A, 0x16ED,\n    0x723B, 0x723B, 0x1F1A, 0x723D, 0x723D, 0x14E5, 0x723E, 0x723E, 0x1916,\n    0x7240, 0x7240, 0x14E6, 0x7246, 0x7246, 0x1998, 0x7247, 0x7247, 0x1D61,\n    0x7248, 0x7248, 0x1D45, 0x724C, 0x724C, 0x1D54, 0x7252, 0x7252, 0x1C17,\n    0x7258, 0x7258, 0x10D7, 0x7259, 0x7259, 0x1696, 0x725B, 0x725B, 0x1842,\n    0x725D, 0x725D, 0x1470, 0x725F, 0x725F, 0x12A9, 0x7261, 0x7261, 0x12AA,\n    0x7262, 0x7262, 0x11C1, 0x7267, 0x7267, 0x12B6, 0x7269, 0x7269, 0x12F2,\n    0x7272, 0x7272, 0x14F9, 0x7279, 0x7279, 0x1D30, 0x727D, 0x727D, 0x0E36,\n    0x7280, 0x7280, 0x150C, 0x7281, 0x7281, 0x120F, 0x72A2, 0x72A2, 0x10D8,\n    0x72A7, 0x72A7, 0x1F73, 0x72AC, 0x72AC, 0x0E37, 0x72AF, 0x72AF, 0x1397,\n    0x72C0, 0x72C0, 0x14E7, 0x72C2, 0x72C2, 0x0F07, 0x72C4, 0x72C4, 0x19E2,\n    0x72CE, 0x72CE, 0x16C7, 0x72D0, 0x72D0, 0x1E8D, 0x72D7, 0x72D7, 0x0F52,\n    0x72D9, 0x72D9, 0x19CB, 0x72E1, 0x72E1, 0x0F27, 0x72E9, 0x72E9, 0x15D7,\n    0x72F8, 0x72F8, 0x1210, 0x72F9, 0x72F9, 0x1E55, 0x72FC, 0x72FC, 0x113F,\n    0x72FD, 0x72FD, 0x1D55, 0x730A, 0x730A, 0x1794, 0x7316, 0x7316, 0x1BC3,\n    0x731B, 0x731B, 0x1279, 0x731C, 0x731C, 0x164C, 0x731D, 0x731D, 0x1AB4,\n    0x7325, 0x7325, 0x17FA, 0x7329, 0x7329, 0x156A, 0x732A, 0x732A, 0x19CC,\n    0x732B, 0x732B, 0x12C8, 0x7336, 0x7337, 0x18BF, 0x733E, 0x733E, 0x1EDD,\n    0x733F, 0x733F, 0x1880, 0x7344, 0x7344, 0x17C0, 0x7345, 0x7345, 0x149C,\n    0x7350, 0x7350, 0x1999, 0x7352, 0x7352, 0x17B8, 0x7357, 0x7357, 0x0F8C,\n    0x7368, 0x7368, 0x10D9, 0x736A, 0x736A, 0x1F05, 0x7370, 0x7370, 0x1782,\n    0x7372, 0x7372, 0x1F0D, 0x7375, 0x7375, 0x1188, 0x7378, 0x7378, 0x15D8,\n    0x737A, 0x737A, 0x1076, 0x737B, 0x737B, 0x1E2D, 0x7384, 0x7384, 0x1E3D,\n    0x7386, 0x7386, 0x1960, 0x7387, 0x7387, 0x15B0, 0x7389, 0x7389, 0x17C1,\n    0x738B, 0x738B, 0x17F2, 0x738E, 0x738E, 0x1A4E, 0x7394, 0x7394, 0x1BF4,\n    0x7396, 0x7396, 0x0F53, 0x7397, 0x7397, 0x1843, 0x7398, 0x7398, 0x0FFE,\n    0x739F, 0x739F, 0x130F, 0x73A7, 0x73A7, 0x18DB, 0x73A9, 0x73A9, 0x17E1,\n    0x73AD, 0x73AD, 0x1471, 0x73B2, 0x73B2, 0x118F, 0x73B3, 0x73B3, 0x10A4,\n    0x73B9, 0x73B9, 0x1E3E, 0x73C0, 0x73C0, 0x131E, 0x73C2, 0x73C2, 0x0D7C,\n    0x73C9, 0x73C9, 0x1310, 0x73CA, 0x73CA, 0x14BC, 0x73CC, 0x73CC, 0x1DB8,\n    0x73CD, 0x73CD, 0x1B50, 0x73CF, 0x73CF, 0x0D8F, 0x73D6, 0x73D6, 0x0F08,\n    0x73D9, 0x73D9, 0x0ED5, 0x73DD, 0x73DD, 0x1F29, 0x73DE, 0x73DE, 0x1120,\n    0x73E0, 0x73E0, 0x1AE2, 0x73E3, 0x73E3, 0x1613, 0x73E4, 0x73E4, 0x13CB,\n    0x73E5, 0x73E5, 0x1917, 0x73E6, 0x73E6, 0x1E21, 0x73E9, 0x73E9, 0x1E66,\n    0x73EA, 0x73EA, 0x0F9F, 0x73ED, 0x73ED, 0x1334, 0x73F7, 0x73F7, 0x12D8,\n    0x73F9, 0x73F9, 0x156B, 0x73FD, 0x73FD, 0x1A4F, 0x73FE, 0x73FE, 0x1E3F,\n    0x7401, 0x7401, 0x1535, 0x7403, 0x7403, 0x0F54, 0x7405, 0x7405, 0x1140,\n    0x7406, 0x7406, 0x1211, 0x7407, 0x7407, 0x15D9, 0x7409, 0x7409, 0x11E8,\n    0x7413, 0x7413, 0x17E2, 0x741B, 0x741B, 0x1CCC, 0x7420, 0x7420, 0x1A07,\n    0x7421, 0x7421, 0x1604, 0x7422, 0x7422, 0x1CEC, 0x7425, 0x7425, 0x1E8E,\n    0x7426, 0x7426, 0x0FFF, 0x7428, 0x7428, 0x0EC5, 0x742A, 0x742A, 0x1000,\n    0x742B, 0x742B, 0x13EE, 0x742C, 0x742C, 0x17E3, 0x742E, 0x742E, 0x1ABC,\n    0x742F, 0x742F, 0x0EF2, 0x7430, 0x7430, 0x1769, 0x7433, 0x7433, 0x1229,\n    0x7434, 0x7434, 0x0FCB, 0x7435, 0x7435, 0x1451, 0x7436, 0x7436, 0x1D3C,\n    0x7438, 0x7438, 0x1CED, 0x743A, 0x743A, 0x139B, 0x743F, 0x743F, 0x1EA8,\n    0x7440, 0x7440, 0x1844, 0x7441, 0x7441, 0x12AB, 0x7443, 0x7443, 0x1C86,\n    0x7444, 0x7444, 0x1536, 0x744B, 0x744B, 0x1898, 0x7455, 0x7455, 0x1DC7,\n    0x7457, 0x7457, 0x1881, 0x7459, 0x7459, 0x104D, 0x745A, 0x745A, 0x1E8F,\n    0x745B, 0x745B, 0x1783, 0x745C, 0x745C, 0x18C1, 0x745E, 0x745E, 0x150D,\n    0x745F, 0x745F, 0x162A, 0x7460, 0x7460, 0x11E9, 0x7462, 0x7462, 0x182C,\n    0x7464, 0x7464, 0x180B, 0x7465, 0x7465, 0x17C4, 0x7468, 0x7468, 0x1B51,\n    0x7469, 0x7469, 0x1E67, 0x746A, 0x746A, 0x1231, 0x746F, 0x746F, 0x1141,\n    0x747E, 0x747E, 0x0FBE, 0x7482, 0x7482, 0x1001, 0x7483, 0x7483, 0x1212,\n    0x7487, 0x7487, 0x1537, 0x7489, 0x7489, 0x1176, 0x748B, 0x748B, 0x199A,\n    0x7498, 0x7498, 0x1221, 0x749C, 0x749C, 0x1EEF, 0x749E, 0x749E, 0x131F,\n    0x749F, 0x749F, 0x0E63, 0x74A1, 0x74A1, 0x1B52, 0x74A3, 0x74A3, 0x1002,\n    0x74A5, 0x74A5, 0x0E64, 0x74A7, 0x74A7, 0x13A1, 0x74A8, 0x74A8, 0x1B99,\n    0x74AA, 0x74AA, 0x1A94, 0x74B0, 0x74B0, 0x1ED6, 0x74B2, 0x74B2, 0x15DA,\n    0x74B5, 0x74B5, 0x1733, 0x74B9, 0x74B9, 0x1605, 0x74BD, 0x74BD, 0x14F3,\n    0x74BF, 0x74BF, 0x1538, 0x74C6, 0x74C6, 0x1B6D, 0x74CA, 0x74CA, 0x0E65,\n    0x74CF, 0x74CF, 0x11BC, 0x74D4, 0x74D4, 0x1784, 0x74D8, 0x74D8, 0x0EF3,\n    0x74DA, 0x74DA, 0x1B9A, 0x74DC, 0x74DC, 0x0EDE, 0x74E0, 0x74E0, 0x1E90,\n    0x74E2, 0x74E2, 0x1D9F, 0x74E3, 0x74E3, 0x1D46, 0x74E6, 0x74E6, 0x17D4,\n    0x74EE, 0x74EE, 0x17CC, 0x74F7, 0x74F7, 0x1961, 0x7501, 0x7501, 0x13BB,\n    0x7504, 0x7504, 0x0E38, 0x7511, 0x7511, 0x1B18, 0x7515, 0x7515, 0x17CD,\n    0x7518, 0x7518, 0x0DC1, 0x751A, 0x751A, 0x1688, 0x751B, 0x751B, 0x1C0D,\n    0x751F, 0x751F, 0x14FA, 0x7523, 0x7523, 0x14BD, 0x7525, 0x7525, 0x14FB,\n    0x7526, 0x7526, 0x158E, 0x7528, 0x7528, 0x182D, 0x752B, 0x752B, 0x13CC,\n    0x752C, 0x752C, 0x182E, 0x7530, 0x7530, 0x1A08, 0x7531, 0x7531, 0x18C2,\n    0x7532, 0x7532, 0x0DCC, 0x7533, 0x7533, 0x1671, 0x7537, 0x7537, 0x1035,\n    0x7538, 0x7538, 0x1A09, 0x753A, 0x753A, 0x1A50, 0x7547, 0x7547, 0x0FAB,\n    0x754C, 0x754C, 0x0E85, 0x754F, 0x754F, 0x17FB, 0x7551, 0x7551, 0x1A0A,\n    0x7553, 0x7553, 0x108B, 0x7554, 0x7554, 0x1335, 0x7559, 0x7559, 0x11EA,\n    0x755B, 0x755B, 0x1B53, 0x755C, 0x755C, 0x1C79, 0x755D, 0x755D, 0x12D9,\n    0x7562, 0x7562, 0x1DB9, 0x7565, 0x7565, 0x114A, 0x7566, 0x7566, 0x1F48,\n    0x756A, 0x756A, 0x1388, 0x756F, 0x756F, 0x1B02, 0x7570, 0x7570, 0x1918,\n    0x7575, 0x7575, 0x1EBC, 0x7576, 0x7576, 0x1096, 0x7578, 0x7578, 0x1003,\n    0x757A, 0x757A, 0x0DDA, 0x757F, 0x757F, 0x1004, 0x7586, 0x7586, 0x0DDB,\n    0x7587, 0x7587, 0x1AE3, 0x758A, 0x758A, 0x1C18, 0x758B, 0x758B, 0x1DBA,\n    0x758E, 0x758E, 0x1590, 0x758F, 0x758F, 0x158F, 0x7591, 0x7591, 0x1903,\n    0x759D, 0x759D, 0x14BE, 0x75A5, 0x75A5, 0x0DF3, 0x75AB, 0x75AB, 0x173F,\n    0x75B1, 0x75B1, 0x1D86, 0x75B2, 0x75B2, 0x1DAF, 0x75B3, 0x75B3, 0x0DC2,\n    0x75B5, 0x75B5, 0x1962, 0x75B8, 0x75B8, 0x1077, 0x75B9, 0x75B9, 0x1B54,\n    0x75BC, 0x75BC, 0x10F6, 0x75BD, 0x75BD, 0x19CD, 0x75BE, 0x75BE, 0x1B6E,\n    0x75C2, 0x75C2, 0x0D7D, 0x75C5, 0x75C5, 0x13BC, 0x75C7, 0x75C7, 0x1B19,\n    0x75CD, 0x75CD, 0x1919, 0x75D2, 0x75D2, 0x1704, 0x75D4, 0x75D4, 0x1CB2,\n    0x75D5, 0x75D5, 0x1F56, 0x75D8, 0x75D8, 0x1100, 0x75D9, 0x75D9, 0x0E66,\n    0x75DB, 0x75DB, 0x1D1F, 0x75E2, 0x75E2, 0x1213, 0x75F0, 0x75F0, 0x1082,\n    0x75F2, 0x75F2, 0x1232, 0x75F4, 0x75F4, 0x1CB3, 0x75FA, 0x75FA, 0x1452,\n    0x75FC, 0x75FC, 0x0EA2, 0x7600, 0x7600, 0x1712, 0x760D, 0x760D, 0x1705,\n    0x7619, 0x7619, 0x1591, 0x761F, 0x761F, 0x17C5, 0x7620, 0x7620, 0x1BE7,\n    0x7621, 0x7621, 0x1BC4, 0x7622, 0x7622, 0x1336, 0x7624, 0x7624, 0x11EB,\n    0x7626, 0x7626, 0x15DB, 0x763B, 0x763B, 0x11DA, 0x7642, 0x7642, 0x11CD,\n    0x764C, 0x764C, 0x16C2, 0x764E, 0x764E, 0x0DA1, 0x7652, 0x7652, 0x18C3,\n    0x7656, 0x7656, 0x13A2, 0x7661, 0x7661, 0x1CB4, 0x7664, 0x7664, 0x1A20,\n    0x7669, 0x7669, 0x1118, 0x766C, 0x766C, 0x1539, 0x7670, 0x7670, 0x17CE,\n    0x7672, 0x7672, 0x1A0B, 0x7678, 0x7678, 0x0E86, 0x767B, 0x767B, 0x1110,\n    0x767C, 0x767C, 0x1347, 0x767D, 0x767E, 0x1381, 0x7684, 0x7684, 0x19E3,\n    0x7686, 0x7686, 0x0DF4, 0x7687, 0x7687, 0x1EF0, 0x768E, 0x768E, 0x0F28,\n    0x7690, 0x7690, 0x0EA3, 0x7693, 0x7693, 0x1E91, 0x76AE, 0x76AE, 0x1DB0,\n    0x76BA, 0x76BA, 0x1C68, 0x76BF, 0x76BF, 0x1293, 0x76C2, 0x76C2, 0x1845,\n    0x76C3, 0x76C3, 0x1372, 0x76C6, 0x76C6, 0x142C, 0x76C8, 0x76C8, 0x1785,\n    0x76CA, 0x76CA, 0x1926, 0x76D2, 0x76D2, 0x1DF1, 0x76D6, 0x76D6, 0x0DF5,\n    0x76DB, 0x76DB, 0x156C, 0x76DC, 0x76DC, 0x10C5, 0x76DE, 0x76DE, 0x197E,\n    0x76DF, 0x76DF, 0x127B, 0x76E1, 0x76E1, 0x1B55, 0x76E3, 0x76E3, 0x0DC3,\n    0x76E4, 0x76E4, 0x1337, 0x76E7, 0x76E7, 0x11A6, 0x76EE, 0x76EE, 0x12B7,\n    0x76F2, 0x76F2, 0x127A, 0x76F4, 0x76F4, 0x1B3F, 0x76F8, 0x76F8, 0x14E8,\n    0x76FC, 0x76FC, 0x1338, 0x76FE, 0x76FE, 0x1614, 0x7701, 0x7701, 0x156D,\n    0x7704, 0x7704, 0x1284, 0x7708, 0x7708, 0x1CFD, 0x7709, 0x7709, 0x12FE,\n    0x770B, 0x770B, 0x0DA2, 0x771E, 0x771E, 0x1B56, 0x7720, 0x7720, 0x1285,\n    0x7729, 0x7729, 0x1E40, 0x7737, 0x7737, 0x0F8A, 0x7738, 0x7738, 0x12AC,\n    0x773A, 0x773A, 0x1A95, 0x773C, 0x773C, 0x16B4, 0x7740, 0x7740, 0x1B91,\n    0x774D, 0x774D, 0x1E41, 0x775B, 0x775B, 0x1A51, 0x7761, 0x7761, 0x15DC,\n    0x7763, 0x7763, 0x10DA, 0x7766, 0x7766, 0x12B8, 0x776B, 0x776B, 0x1C19,\n    0x7779, 0x7779, 0x10C6, 0x777E, 0x777E, 0x0EA4, 0x777F, 0x777F, 0x1795,\n    0x778B, 0x778B, 0x1B57, 0x7791, 0x7791, 0x1294, 0x779E, 0x779E, 0x124A,\n    0x77A5, 0x77A5, 0x13AE, 0x77AC, 0x77AC, 0x1615, 0x77AD, 0x77AD, 0x11CE,\n    0x77B0, 0x77B0, 0x0DC4, 0x77B3, 0x77B3, 0x10F7, 0x77BB, 0x77BB, 0x1C0E,\n    0x77BC, 0x77BC, 0x0E25, 0x77BF, 0x77BF, 0x0F55, 0x77D7, 0x77D7, 0x1C4C,\n    0x77DB, 0x77DB, 0x12AD, 0x77DC, 0x77DC, 0x0FDC, 0x77E2, 0x77E2, 0x164D,\n    0x77E3, 0x77E3, 0x1904, 0x77E5, 0x77E5, 0x1B30, 0x77E9, 0x77E9, 0x0F56,\n    0x77ED, 0x77ED, 0x106C, 0x77EE, 0x77EE, 0x17F6, 0x77EF, 0x77EF, 0x0F29,\n    0x77F3, 0x77F3, 0x1525, 0x7802, 0x7802, 0x149D, 0x7812, 0x7812, 0x1453,\n    0x7825, 0x7825, 0x1B31, 0x7826, 0x7826, 0x1BD0, 0x7827, 0x7827, 0x1CCD,\n    0x782C, 0x782C, 0x122C, 0x7832, 0x7832, 0x1D87, 0x7834, 0x7834, 0x1D3D,\n    0x7845, 0x7845, 0x0FA0, 0x784F, 0x784F, 0x1758, 0x785D, 0x785D, 0x1C3A,\n    0x786B, 0x786B, 0x11EC, 0x786C, 0x786C, 0x0E67, 0x786F, 0x786F, 0x1759,\n    0x787C, 0x787C, 0x143A, 0x7881, 0x7881, 0x1005, 0x7887, 0x7887, 0x1A52,\n    0x788C, 0x788C, 0x11B0, 0x788D, 0x788D, 0x16D7, 0x788E, 0x788E, 0x15BB,\n    0x7891, 0x7891, 0x1454, 0x7897, 0x7897, 0x17E4, 0x78A3, 0x78A3, 0x0DB0,\n    0x78A7, 0x78A7, 0x13A3, 0x78A9, 0x78A9, 0x1526, 0x78BA, 0x78BB, 0x1EC7,\n    0x78BC, 0x78BC, 0x1233, 0x78C1, 0x78C1, 0x1963, 0x78C5, 0x78C5, 0x135C,\n    0x78CA, 0x78CA, 0x11C2, 0x78CB, 0x78CB, 0x1B8A, 0x78CE, 0x78CE, 0x0E87,\n    0x78D0, 0x78D0, 0x1339, 0x78E8, 0x78E8, 0x1234, 0x78EC, 0x78EC, 0x0E68,\n    0x78EF, 0x78EF, 0x1006, 0x78F5, 0x78F5, 0x0DA3, 0x78FB, 0x78FB, 0x133A,\n    0x7901, 0x7901, 0x1C3B, 0x790E, 0x790E, 0x1C3C, 0x7916, 0x7916, 0x1734,\n    0x792A, 0x792A, 0x1162, 0x792B, 0x792B, 0x116E, 0x792C, 0x792C, 0x133B,\n    0x793A, 0x793A, 0x164E, 0x793E, 0x793E, 0x149E, 0x7940, 0x7940, 0x149F,\n    0x7941, 0x7941, 0x1007, 0x7947, 0x7948, 0x1008, 0x7949, 0x7949, 0x1B32,\n    0x7950, 0x7950, 0x1846, 0x7956, 0x7956, 0x1A96, 0x7957, 0x7957, 0x1B33,\n    0x795A, 0x795A, 0x1A97, 0x795B, 0x795B, 0x0E0B, 0x795C, 0x795C, 0x1E92,\n    0x795D, 0x795D, 0x1C7A, 0x795E, 0x795E, 0x1672, 0x7960, 0x7960, 0x14A0,\n    0x7965, 0x7965, 0x14E9, 0x7968, 0x7968, 0x1DA0, 0x796D, 0x796D, 0x1A71,\n    0x797A, 0x797A, 0x100A, 0x797F, 0x797F, 0x11B1, 0x7981, 0x7981, 0x0FCC,\n    0x798D, 0x798D, 0x1EBD, 0x798E, 0x798E, 0x1A53, 0x798F, 0x798F, 0x13D9,\n    0x7991, 0x7991, 0x1847, 0x79A6, 0x79A6, 0x1713, 0x79A7, 0x79A7, 0x1F74,\n    0x79AA, 0x79AA, 0x153A, 0x79AE, 0x79AE, 0x119C, 0x79B1, 0x79B1, 0x10C7,\n    0x79B3, 0x79B3, 0x1706, 0x79B9, 0x79B9, 0x1848, 0x79BD, 0x79BD, 0x0FCD,\n    0x79BE, 0x79BE, 0x1EBE, 0x79BF, 0x79BF, 0x10DB, 0x79C0, 0x79C0, 0x15DD,\n    0x79C1, 0x79C1, 0x14A1, 0x79C9, 0x79C9, 0x13BD, 0x79CA, 0x79CA, 0x1042,\n    0x79CB, 0x79CB, 0x1C69, 0x79D1, 0x79D1, 0x0EDF, 0x79D2, 0x79D2, 0x1C3D,\n    0x79D5, 0x79D5, 0x1455, 0x79D8, 0x79D8, 0x1456, 0x79DF, 0x79DF, 0x1A98,\n    0x79E4, 0x79E4, 0x1CD1, 0x79E6, 0x79E6, 0x1B58, 0x79E7, 0x79E7, 0x16CE,\n    0x79E9, 0x79E9, 0x1B6F, 0x79FB, 0x79FB, 0x191A, 0x7A00, 0x7A00, 0x1F75,\n    0x7A05, 0x7A05, 0x1578, 0x7A08, 0x7A08, 0x0DA4, 0x7A0B, 0x7A0B, 0x1A54,\n    0x7A0D, 0x7A0D, 0x1C3E, 0x7A14, 0x7A14, 0x194A, 0x7A17, 0x7A17, 0x1D56,\n    0x7A19, 0x7A19, 0x1B40, 0x7A1A, 0x7A1A, 0x1CB5, 0x7A1C, 0x7A1C, 0x1201,\n    0x7A1F, 0x7A1F, 0x1DA7, 0x7A20, 0x7A20, 0x1A99, 0x7A2E, 0x7A2E, 0x1ABD,\n    0x7A31, 0x7A31, 0x1CD2, 0x7A36, 0x7A36, 0x185B, 0x7A37, 0x7A37, 0x1B41,\n    0x7A3B, 0x7A3B, 0x10C8, 0x7A3C, 0x7A3C, 0x0D7E, 0x7A3D, 0x7A3D, 0x0E88,\n    0x7A3F, 0x7A3F, 0x0EA5, 0x7A40, 0x7A40, 0x0EBB, 0x7A46, 0x7A46, 0x12B9,\n    0x7A49, 0x7A49, 0x1CB6, 0x7A4D, 0x7A4D, 0x19E4, 0x7A4E, 0x7A4E, 0x1786,\n    0x7A57, 0x7A57, 0x15DE, 0x7A61, 0x7A61, 0x14F6, 0x7A62, 0x7A62, 0x1796,\n    0x7A69, 0x7A69, 0x17C6, 0x7A6B, 0x7A6B, 0x1EC9, 0x7A70, 0x7A70, 0x1707,\n    0x7A74, 0x7A74, 0x1E4B, 0x7A76, 0x7A76, 0x0F57, 0x7A79, 0x7A79, 0x0F7D,\n    0x7A7A, 0x7A7A, 0x0ED6, 0x7A7D, 0x7A7D, 0x1A55, 0x7A7F, 0x7A7F, 0x1BF5,\n    0x7A81, 0x7A81, 0x10EA, 0x7A84, 0x7A84, 0x1B92, 0x7A88, 0x7A88, 0x180C,\n    0x7A92, 0x7A92, 0x1B70, 0x7A93, 0x7A93, 0x1BC5, 0x7A95, 0x7A95, 0x1A9A,\n    0x7A98, 0x7A98, 0x0F72, 0x7A9F, 0x7A9F, 0x0F7A, 0x7AA9, 0x7AAA, 0x17D5,\n    0x7AAE, 0x7AAE, 0x0F7E, 0x7AAF, 0x7AAF, 0x180D, 0x7ABA, 0x7ABA, 0x0FA1,\n    0x7AC4, 0x7AC4, 0x1B9B, 0x7AC5, 0x7AC5, 0x0FA2, 0x7AC7, 0x7AC7, 0x1101,\n    0x7ACA, 0x7ACA, 0x1A21, 0x7ACB, 0x7ACB, 0x122D, 0x7AD7, 0x7AD7, 0x12C9,\n    0x7AD9, 0x7AD9, 0x1BB1, 0x7ADD, 0x7ADD, 0x13BE, 0x7ADF, 0x7ADF, 0x0E69,\n    0x7AE0, 0x7AE0, 0x199B, 0x7AE3, 0x7AE3, 0x1B03, 0x7AE5, 0x7AE5, 0x10F8,\n    0x7AEA, 0x7AEA, 0x15DF, 0x7AED, 0x7AED, 0x0DB1, 0x7AEF, 0x7AEF, 0x106D,\n    0x7AF6, 0x7AF6, 0x0E6A, 0x7AF9, 0x7AF9, 0x1AF4, 0x7AFA, 0x7AFA, 0x1C7B,\n    0x7AFF, 0x7AFF, 0x0DA5, 0x7B0F, 0x7B0F, 0x1EAC, 0x7B11, 0x7B11, 0x1592,\n    0x7B19, 0x7B19, 0x14FC, 0x7B1B, 0x7B1B, 0x19E5, 0x7B1E, 0x7B1E, 0x1D0F,\n    0x7B20, 0x7B20, 0x122E, 0x7B26, 0x7B26, 0x140A, 0x7B2C, 0x7B2C, 0x1A72,\n    0x7B2D, 0x7B2D, 0x1190, 0x7B39, 0x7B39, 0x1579, 0x7B46, 0x7B46, 0x1DBB,\n    0x7B49, 0x7B49, 0x1111, 0x7B4B, 0x7B4B, 0x0FBF, 0x7B4C, 0x7B4C, 0x1A0C,\n    0x7B4D, 0x7B4D, 0x1616, 0x7B4F, 0x7B4F, 0x138E, 0x7B50, 0x7B50, 0x0F09,\n    0x7B51, 0x7B51, 0x1C7C, 0x7B52, 0x7B52, 0x1D20, 0x7B54, 0x7B54, 0x108C,\n    0x7B56, 0x7B56, 0x1BD8, 0x7B60, 0x7B60, 0x0FAC, 0x7B6C, 0x7B6C, 0x156E,\n    0x7B6E, 0x7B6E, 0x150E, 0x7B75, 0x7B75, 0x175A, 0x7B7D, 0x7B7D, 0x17B9,\n    0x7B87, 0x7B87, 0x0DF6, 0x7B8B, 0x7B8B, 0x1A0D, 0x7B8F, 0x7B8F, 0x19BC,\n    0x7B94, 0x7B94, 0x1320, 0x7B95, 0x7B95, 0x100B, 0x7B97, 0x7B97, 0x14BF,\n    0x7B9A, 0x7B9A, 0x1B8B, 0x7B9D, 0x7B9D, 0x0E48, 0x7BA1, 0x7BA1, 0x0EF4,\n    0x7BAD, 0x7BAD, 0x1A0E, 0x7BB1, 0x7BB1, 0x14EA, 0x7BB4, 0x7BB4, 0x1982,\n    0x7BB8, 0x7BB8, 0x19CE, 0x7BC0, 0x7BC0, 0x1A22, 0x7BC1, 0x7BC1, 0x1EF1,\n    0x7BC4, 0x7BC4, 0x1398, 0x7BC6, 0x7BC6, 0x1A0F, 0x7BC7, 0x7BC7, 0x1D62,\n    0x7BC9, 0x7BC9, 0x1C7D, 0x7BD2, 0x7BD2, 0x1661, 0x7BE0, 0x7BE0, 0x1593,\n    0x7BE4, 0x7BE4, 0x10DC, 0x7BE9, 0x7BE9, 0x14A2, 0x7C07, 0x7C07, 0x1AAD,\n    0x7C12, 0x7C12, 0x1B9C, 0x7C1E, 0x7C1E, 0x106E, 0x7C21, 0x7C21, 0x0DA6,\n    0x7C27, 0x7C27, 0x1EF2, 0x7C2A, 0x7C2A, 0x1983, 0x7C2B, 0x7C2B, 0x1594,\n    0x7C3D, 0x7C3D, 0x1C0F, 0x7C3E, 0x7C3E, 0x1187, 0x7C3F, 0x7C3F, 0x140B,\n    0x7C43, 0x7C43, 0x1134, 0x7C4C, 0x7C4C, 0x1AE4, 0x7C4D, 0x7C4D, 0x19E6,\n    0x7C60, 0x7C60, 0x11BD, 0x7C64, 0x7C64, 0x1C10, 0x7C6C, 0x7C6C, 0x1214,\n    0x7C73, 0x7C73, 0x12FF, 0x7C83, 0x7C83, 0x1457, 0x7C89, 0x7C89, 0x142D,\n    0x7C92, 0x7C92, 0x122F, 0x7C95, 0x7C95, 0x1321, 0x7C97, 0x7C97, 0x1A9B,\n    0x7C98, 0x7C98, 0x1A29, 0x7C9F, 0x7C9F, 0x15A5, 0x7CA5, 0x7CA5, 0x1AF5,\n    0x7CA7, 0x7CA7, 0x199C, 0x7CAE, 0x7CAE, 0x1151, 0x7CB1, 0x7CB1, 0x1152,\n    0x7CB2, 0x7CB2, 0x1B9E, 0x7CB3, 0x7CB3, 0x0DFE, 0x7CB9, 0x7CB9, 0x15E0,\n    0x7CBE, 0x7CBE, 0x1A56, 0x7CCA, 0x7CCA, 0x1E93, 0x7CD6, 0x7CD6, 0x1097,\n    0x7CDE, 0x7CDE, 0x142E, 0x7CDF, 0x7CDF, 0x1A9C, 0x7CE0, 0x7CE0, 0x0DDC,\n    0x7CE7, 0x7CE7, 0x1153, 0x7CFB, 0x7CFB, 0x0E89, 0x7CFE, 0x7CFE, 0x0FA3,\n    0x7D00, 0x7D00, 0x100C, 0x7D02, 0x7D02, 0x1AE5, 0x7D04, 0x7D04, 0x16F1,\n    0x7D05, 0x7D05, 0x1EB3, 0x7D06, 0x7D06, 0x1849, 0x7D07, 0x7D07, 0x1F59,\n    0x7D08, 0x7D08, 0x1ED7, 0x7D0A, 0x7D0B, 0x12EA, 0x7D0D, 0x7D0D, 0x1036,\n    0x7D10, 0x7D10, 0x1058, 0x7D14, 0x7D14, 0x1617, 0x7D17, 0x7D17, 0x14A3,\n    0x7D18, 0x7D18, 0x0F19, 0x7D19, 0x7D19, 0x1B34, 0x7D1A, 0x7D1A, 0x0FD8,\n    0x7D1B, 0x7D1B, 0x142F, 0x7D20, 0x7D20, 0x1595, 0x7D21, 0x7D21, 0x135D,\n    0x7D22, 0x7D22, 0x14F7, 0x7D2B, 0x7D2B, 0x1964, 0x7D2C, 0x7D2C, 0x1AE6,\n    0x7D2E, 0x7D2E, 0x1BA9, 0x7D2F, 0x7D2F, 0x11DB, 0x7D30, 0x7D30, 0x157A,\n    0x7D33, 0x7D33, 0x1673, 0x7D35, 0x7D35, 0x19CF, 0x7D39, 0x7D39, 0x1596,\n    0x7D3A, 0x7D3A, 0x0DC5, 0x7D42, 0x7D42, 0x1ABE, 0x7D43, 0x7D43, 0x1E42,\n    0x7D44, 0x7D44, 0x1A9D, 0x7D45, 0x7D45, 0x0E6B, 0x7D46, 0x7D46, 0x133C,\n    0x7D50, 0x7D50, 0x0E43, 0x7D5E, 0x7D5E, 0x0F2A, 0x7D61, 0x7D61, 0x1121,\n    0x7D62, 0x7D62, 0x1E43, 0x7D66, 0x7D66, 0x0FD9, 0x7D68, 0x7D68, 0x18E3,\n    0x7D6A, 0x7D6A, 0x1936, 0x7D6E, 0x7D6E, 0x150F, 0x7D71, 0x7D71, 0x1D21,\n    0x7D72, 0x7D72, 0x14A4, 0x7D73, 0x7D73, 0x0DDD, 0x7D76, 0x7D76, 0x1A23,\n    0x7D79, 0x7D79, 0x0E39, 0x7D7F, 0x7D7F, 0x0F58, 0x7D8E, 0x7D8E, 0x1A57,\n    0x7D8F, 0x7D8F, 0x15E1, 0x7D93, 0x7D93, 0x0E6C, 0x7D9C, 0x7D9C, 0x1ABF,\n    0x7DA0, 0x7DA0, 0x11B2, 0x7DA2, 0x7DA2, 0x1AE7, 0x7DAC, 0x7DAC, 0x15E2,\n    0x7DAD, 0x7DAD, 0x18C4, 0x7DB1, 0x7DB1, 0x0DDE, 0x7DB2, 0x7DB2, 0x125D,\n    0x7DB4, 0x7DB4, 0x1C05, 0x7DB5, 0x7DB5, 0x1BD1, 0x7DB8, 0x7DB8, 0x11F6,\n    0x7DBA, 0x7DBA, 0x100D, 0x7DBB, 0x7DBB, 0x1CF8, 0x7DBD, 0x7DBD, 0x1975,\n    0x7DBE, 0x7DBE, 0x1202, 0x7DBF, 0x7DBF, 0x1286, 0x7DC7, 0x7DC7, 0x1CB7,\n    0x7DCA, 0x7DCA, 0x101E, 0x7DCB, 0x7DCB, 0x1458, 0x7DD6, 0x7DD6, 0x1510,\n    0x7DD8, 0x7DD8, 0x1DEA, 0x7DDA, 0x7DDA, 0x153B, 0x7DDD, 0x7DDD, 0x1B7A,\n    0x7DDE, 0x7DDE, 0x106F, 0x7DE0, 0x7DE0, 0x1C29, 0x7DE1, 0x7DE1, 0x1311,\n    0x7DE3, 0x7DE3, 0x175B, 0x7DE8, 0x7DE8, 0x1D63, 0x7DE9, 0x7DE9, 0x17E5,\n    0x7DEC, 0x7DEC, 0x1287, 0x7DEF, 0x7DEF, 0x1899, 0x7DF4, 0x7DF4, 0x1177,\n    0x7DFB, 0x7DFB, 0x1CB8, 0x7E09, 0x7E09, 0x1B59, 0x7E0A, 0x7E0A, 0x16DF,\n    0x7E15, 0x7E15, 0x17C7, 0x7E1B, 0x7E1B, 0x1322, 0x7E1D, 0x7E1D, 0x1B5A,\n    0x7E1E, 0x7E1E, 0x1E94, 0x7E1F, 0x7E1F, 0x181B, 0x7E21, 0x7E21, 0x19B5,\n    0x7E23, 0x7E23, 0x1E44, 0x7E2B, 0x7E2B, 0x13EF, 0x7E2E, 0x7E2E, 0x1C7E,\n    0x7E2F, 0x7E2F, 0x175C, 0x7E31, 0x7E31, 0x1AC0, 0x7E37, 0x7E37, 0x11DC,\n    0x7E3D, 0x7E3D, 0x1C59, 0x7E3E, 0x7E3E, 0x19E7, 0x7E41, 0x7E41, 0x1389,\n    0x7E43, 0x7E43, 0x143B, 0x7E46, 0x7E46, 0x12DA, 0x7E47, 0x7E47, 0x180E,\n    0x7E52, 0x7E52, 0x1B1A, 0x7E54, 0x7E54, 0x1B42, 0x7E55, 0x7E55, 0x153C,\n    0x7E5E, 0x7E5E, 0x180F, 0x7E61, 0x7E61, 0x15E3, 0x7E69, 0x7E69, 0x1639,\n    0x7E6A, 0x7E6A, 0x1F06, 0x7E6B, 0x7E6B, 0x0E8A, 0x7E6D, 0x7E6D, 0x0E3A,\n    0x7E70, 0x7E70, 0x1A9E, 0x7E79, 0x7E79, 0x1740, 0x7E7C, 0x7E7C, 0x0E8B,\n    0x7E82, 0x7E82, 0x1B9D, 0x7E8C, 0x7E8C, 0x15A6, 0x7E8F, 0x7E8F, 0x1A10,\n    0x7E93, 0x7E93, 0x1787, 0x7E96, 0x7E96, 0x155A, 0x7E98, 0x7E98, 0x1B9F,\n    0x7E9B, 0x7E9B, 0x10DD, 0x7E9C, 0x7E9C, 0x1135, 0x7F36, 0x7F36, 0x140C,\n    0x7F38, 0x7F38, 0x1E01, 0x7F3A, 0x7F3A, 0x0E44, 0x7F4C, 0x7F4C, 0x16E3,\n    0x7F50, 0x7F50, 0x0EF5, 0x7F54, 0x7F54, 0x125E, 0x7F55, 0x7F55, 0x1DDB,\n    0x7F6A, 0x7F6A, 0x1ACB, 0x7F6B, 0x7F6B, 0x0F0E, 0x7F6E, 0x7F6E, 0x1CB9,\n    0x7F70, 0x7F70, 0x138F, 0x7F72, 0x7F72, 0x1511, 0x7F75, 0x7F75, 0x126D,\n    0x7F77, 0x7F77, 0x1D3E, 0x7F79, 0x7F79, 0x1215, 0x7F85, 0x7F85, 0x1119,\n    0x7F88, 0x7F88, 0x100E, 0x7F8A, 0x7F8A, 0x1708, 0x7F8C, 0x7F8C, 0x0DDF,\n    0x7F8E, 0x7F8E, 0x1300, 0x7F94, 0x7F94, 0x0EA6, 0x7F9A, 0x7F9A, 0x1191,\n    0x7F9E, 0x7F9E, 0x15E4, 0x7FA4, 0x7FA4, 0x0F73, 0x7FA8, 0x7FA8, 0x153D,\n    0x7FA9, 0x7FA9, 0x1905, 0x7FB2, 0x7FB2, 0x1F76, 0x7FB8, 0x7FB8, 0x1216,\n    0x7FB9, 0x7FB9, 0x0DFF, 0x7FBD, 0x7FBD, 0x184A, 0x7FC1, 0x7FC1, 0x17CF,\n    0x7FC5, 0x7FC5, 0x164F, 0x7FCA, 0x7FCA, 0x1927, 0x7FCC, 0x7FCC, 0x1928,\n    0x7FCE, 0x7FCE, 0x1192, 0x7FD2, 0x7FD2, 0x162F, 0x7FD4, 0x7FD4, 0x14EB,\n    0x7FD5, 0x7FD5, 0x1F61, 0x7FDF, 0x7FDF, 0x19E8, 0x7FE0, 0x7FE0, 0x1C9A,\n    0x7FE1, 0x7FE1, 0x1459, 0x7FE9, 0x7FE9, 0x1D64, 0x7FEB, 0x7FEB, 0x17E6,\n    0x7FF0, 0x7FF0, 0x1DDC, 0x7FF9, 0x7FF9, 0x0F2B, 0x7FFC, 0x7FFC, 0x1929,\n    0x8000, 0x8000, 0x1810, 0x8001, 0x8001, 0x11A7, 0x8003, 0x8003, 0x0EA7,\n    0x8005, 0x8005, 0x1965, 0x8006, 0x8006, 0x100F, 0x8009, 0x8009, 0x0F59,\n    0x800C, 0x800C, 0x191B, 0x8010, 0x8010, 0x103E, 0x8015, 0x8015, 0x0E6D,\n    0x8017, 0x8017, 0x12AE, 0x8018, 0x8018, 0x1863, 0x802D, 0x802D, 0x1010,\n    0x8033, 0x8033, 0x191C, 0x8036, 0x8036, 0x16EE, 0x803D, 0x803D, 0x1CFE,\n    0x803F, 0x803F, 0x0E6E, 0x8043, 0x8043, 0x1083, 0x8046, 0x8046, 0x1193,\n    0x804A, 0x804A, 0x11CF, 0x8056, 0x8056, 0x156F, 0x8058, 0x8058, 0x1477,\n    0x805A, 0x805A, 0x1C9B, 0x805E, 0x805E, 0x12EC, 0x806F, 0x806F, 0x1178,\n    0x8070, 0x8070, 0x1C5A, 0x8072, 0x8072, 0x1570, 0x8073, 0x8073, 0x182F,\n    0x8077, 0x8077, 0x1B43, 0x807D, 0x807D, 0x1C20, 0x807E, 0x807E, 0x11BE,\n    0x807F, 0x807F, 0x18E0, 0x8084, 0x8084, 0x191D, 0x8085, 0x8085, 0x1606,\n    0x8086, 0x8086, 0x14A5, 0x8087, 0x8087, 0x1A9F, 0x8089, 0x8089, 0x18D5,\n    0x808B, 0x808B, 0x11FD, 0x808C, 0x808C, 0x1011, 0x8096, 0x8096, 0x1C3F,\n    0x809B, 0x809B, 0x1E02, 0x809D, 0x809D, 0x0DA7, 0x80A1, 0x80A1, 0x0EA8,\n    0x80A2, 0x80A2, 0x1B35, 0x80A5, 0x80A5, 0x145A, 0x80A9, 0x80A9, 0x0E3B,\n    0x80AA, 0x80AA, 0x135E, 0x80AF, 0x80AF, 0x0FDD, 0x80B1, 0x80B1, 0x0F1A,\n    0x80B2, 0x80B2, 0x18D6, 0x80B4, 0x80B4, 0x1F1B, 0x80BA, 0x80BA, 0x1D74,\n    0x80C3, 0x80C3, 0x189A, 0x80C4, 0x80C4, 0x1AD1, 0x80CC, 0x80CC, 0x1373,\n    0x80CE, 0x80CE, 0x1D10, 0x80DA, 0x80DA, 0x1374, 0x80DB, 0x80DB, 0x0DCD,\n    0x80DE, 0x80DE, 0x1D88, 0x80E1, 0x80E1, 0x1E95, 0x80E4, 0x80E4, 0x18DC,\n    0x80E5, 0x80E5, 0x1512, 0x80F1, 0x80F1, 0x0F0A, 0x80F4, 0x80F4, 0x10F9,\n    0x80F8, 0x80F8, 0x1F51, 0x80FD, 0x80FD, 0x1059, 0x8102, 0x8102, 0x1B36,\n    0x8105, 0x8105, 0x1E56, 0x8106, 0x8106, 0x1C9C, 0x8107, 0x8107, 0x1E57,\n    0x8108, 0x8108, 0x1272, 0x810A, 0x810A, 0x1BE8, 0x8118, 0x8118, 0x17E7,\n    0x811A, 0x811A, 0x0D90, 0x811B, 0x811B, 0x0E6F, 0x8123, 0x8123, 0x1618,\n    0x8129, 0x8129, 0x15E5, 0x812B, 0x812B, 0x1CFB, 0x812F, 0x812F, 0x1D89,\n    0x8139, 0x8139, 0x1BC6, 0x813E, 0x813E, 0x145B, 0x814B, 0x814B, 0x16E0,\n    0x814E, 0x814E, 0x1674, 0x8150, 0x8151, 0x140D, 0x8154, 0x8154, 0x0DE0,\n    0x8155, 0x8155, 0x17E8, 0x8165, 0x8165, 0x1571, 0x8166, 0x8166, 0x1053,\n    0x816B, 0x816B, 0x1AC1, 0x8170, 0x8170, 0x1811, 0x8171, 0x8171, 0x0E18,\n    0x8178, 0x8178, 0x199D, 0x8179, 0x8179, 0x13DA, 0x817A, 0x817A, 0x153E,\n    0x817F, 0x817F, 0x1D25, 0x8180, 0x8180, 0x135F, 0x8188, 0x8188, 0x0E32,\n    0x818A, 0x818A, 0x1323, 0x818F, 0x818F, 0x0EA9, 0x819A, 0x819A, 0x140F,\n    0x819C, 0x819C, 0x123B, 0x819D, 0x819D, 0x162B, 0x81A0, 0x81A0, 0x0F2C,\n    0x81A3, 0x81A3, 0x1B71, 0x81A8, 0x81A8, 0x1D5C, 0x81B3, 0x81B3, 0x153F,\n    0x81B5, 0x81B5, 0x1C91, 0x81BA, 0x81BA, 0x18F8, 0x81BD, 0x81BD, 0x1084,\n    0x81BE, 0x81BE, 0x1F07, 0x81BF, 0x81BF, 0x1050, 0x81C0, 0x81C0, 0x1107,\n    0x81C2, 0x81C2, 0x145C, 0x81C6, 0x81C6, 0x171C, 0x81CD, 0x81CD, 0x1A73,\n    0x81D8, 0x81D8, 0x113A, 0x81DF, 0x81DF, 0x199E, 0x81E3, 0x81E3, 0x1675,\n    0x81E5, 0x81E5, 0x17D7, 0x81E7, 0x81E7, 0x199F, 0x81E8, 0x81E8, 0x122A,\n    0x81EA, 0x81EA, 0x1966, 0x81ED, 0x81ED, 0x1C9D, 0x81F3, 0x81F3, 0x1B37,\n    0x81F4, 0x81F4, 0x1CBA, 0x81FA, 0x81FA, 0x10A5, 0x81FB, 0x81FB, 0x1B5B,\n    0x81FC, 0x81FC, 0x0F5A, 0x81FE, 0x81FE, 0x18C5, 0x8205, 0x8205, 0x0F5B,\n    0x8207, 0x8207, 0x1735, 0x8208, 0x8208, 0x1F62, 0x820A, 0x820A, 0x0F5C,\n    0x820C, 0x820C, 0x1550, 0x820D, 0x820D, 0x14A6, 0x8212, 0x8212, 0x1513,\n    0x821B, 0x821B, 0x1BF6, 0x821C, 0x821C, 0x1619, 0x821E, 0x821E, 0x12DB,\n    0x821F, 0x821F, 0x1AE8, 0x8221, 0x8221, 0x0DE1, 0x822A, 0x822A, 0x1E03,\n    0x822B, 0x822B, 0x1360, 0x822C, 0x822C, 0x133D, 0x8235, 0x8235, 0x1CDE,\n    0x8236, 0x8236, 0x1324, 0x8237, 0x8237, 0x1E45, 0x8239, 0x8239, 0x1540,\n    0x8240, 0x8240, 0x1410, 0x8245, 0x8245, 0x1736, 0x8247, 0x8247, 0x1A58,\n    0x8259, 0x8259, 0x1BC7, 0x8264, 0x8264, 0x1906, 0x8266, 0x8266, 0x1DEB,\n    0x826E, 0x826E, 0x0DA8, 0x826F, 0x826F, 0x1154, 0x8271, 0x8271, 0x0DA9,\n    0x8272, 0x8272, 0x14F8, 0x8276, 0x8276, 0x176A, 0x8278, 0x8278, 0x1C40,\n    0x827E, 0x827E, 0x16D8, 0x828B, 0x828B, 0x184B, 0x828D, 0x828D, 0x1976,\n    0x828E, 0x828E, 0x0F7F, 0x8292, 0x8292, 0x125F, 0x8299, 0x8299, 0x1411,\n    0x829A, 0x829A, 0x1108, 0x829D, 0x829D, 0x1B38, 0x829F, 0x829F, 0x14CC,\n    0x82A5, 0x82A5, 0x0DF7, 0x82A6, 0x82A6, 0x1E96, 0x82A9, 0x82A9, 0x0FCE,\n    0x82AC, 0x82AC, 0x1430, 0x82AD, 0x82AD, 0x1D3F, 0x82AE, 0x82AE, 0x1797,\n    0x82AF, 0x82AF, 0x1689, 0x82B1, 0x82B1, 0x1EBF, 0x82B3, 0x82B3, 0x1361,\n    0x82B7, 0x82B7, 0x1B39, 0x82B8, 0x82B8, 0x1864, 0x82B9, 0x82B9, 0x0FC0,\n    0x82BB, 0x82BB, 0x1C6A, 0x82BC, 0x82BC, 0x12AF, 0x82BD, 0x82BD, 0x1697,\n    0x82BF, 0x82BF, 0x1952, 0x82D1, 0x82D1, 0x1882, 0x82D2, 0x82D2, 0x176B,\n    0x82D4, 0x82D4, 0x1D11, 0x82D5, 0x82D5, 0x1C41, 0x82D7, 0x82D7, 0x12CA,\n    0x82DB, 0x82DB, 0x0D7F, 0x82DE, 0x82DE, 0x1D8A, 0x82DF, 0x82DF, 0x0F5D,\n    0x82E1, 0x82E1, 0x191E, 0x82E5, 0x82E5, 0x16F2, 0x82E6, 0x82E6, 0x0EAA,\n    0x82E7, 0x82E7, 0x19D0, 0x82F1, 0x82F1, 0x1788, 0x82FD, 0x82FD, 0x0EAB,\n    0x82FE, 0x82FE, 0x1DBC, 0x8301, 0x8301, 0x1B09, 0x8302, 0x8302, 0x12DC,\n    0x8303, 0x8303, 0x1399, 0x8304, 0x8304, 0x0D80, 0x8305, 0x8305, 0x12B0,\n    0x8309, 0x8309, 0x1255, 0x8317, 0x8317, 0x1295, 0x8328, 0x8328, 0x1967,\n    0x832B, 0x832B, 0x1260, 0x832F, 0x832F, 0x13DB, 0x8331, 0x8331, 0x15E6,\n    0x8334, 0x8334, 0x1F08, 0x8335, 0x8335, 0x1937, 0x8336, 0x8336, 0x105F,\n    0x8338, 0x8338, 0x1830, 0x8339, 0x8339, 0x1737, 0x8340, 0x8340, 0x161A,\n    0x8347, 0x8347, 0x1E1C, 0x8349, 0x8349, 0x1C42, 0x834A, 0x834A, 0x1E68,\n    0x834F, 0x834F, 0x194B, 0x8351, 0x8351, 0x191F, 0x8352, 0x8352, 0x1EF3,\n    0x8373, 0x8373, 0x1102, 0x8377, 0x8377, 0x1DC8, 0x837B, 0x837B, 0x19E9,\n    0x8389, 0x8389, 0x1217, 0x838A, 0x838A, 0x19A0, 0x838E, 0x838E, 0x14A7,\n    0x8396, 0x8396, 0x0E70, 0x8398, 0x8398, 0x1676, 0x839E, 0x839E, 0x17E9,\n    0x83A2, 0x83A2, 0x1E58, 0x83A9, 0x83A9, 0x1412, 0x83AA, 0x83AA, 0x1698,\n    0x83AB, 0x83AB, 0x123C, 0x83BD, 0x83BD, 0x1261, 0x83C1, 0x83C1, 0x1C21,\n    0x83C5, 0x83C5, 0x0EF6, 0x83C9, 0x83C9, 0x11B3, 0x83CA, 0x83CA, 0x0F6D,\n    0x83CC, 0x83CC, 0x0FAD, 0x83D3, 0x83D3, 0x0EE0, 0x83D6, 0x83D6, 0x1BC8,\n    0x83DC, 0x83DC, 0x1BD2, 0x83E9, 0x83E9, 0x13CD, 0x83EB, 0x83EB, 0x0FC1,\n    0x83EF, 0x83EF, 0x1EC0, 0x83F0, 0x83F0, 0x0EAC, 0x83F1, 0x83F1, 0x1203,\n    0x83F2, 0x83F2, 0x145D, 0x83F4, 0x83F4, 0x16C3, 0x83F9, 0x83F9, 0x19D1,\n    0x83FD, 0x83FD, 0x1607, 0x8403, 0x8403, 0x1C92, 0x8404, 0x8404, 0x10C9,\n    0x840A, 0x840A, 0x1147, 0x840C, 0x840C, 0x127C, 0x840D, 0x840D, 0x1D6C,\n    0x840E, 0x840E, 0x189B, 0x8429, 0x8429, 0x1C6B, 0x842C, 0x842C, 0x124B,\n    0x8431, 0x8431, 0x1F39, 0x8438, 0x8438, 0x18C6, 0x843D, 0x843D, 0x1122,\n    0x8449, 0x8449, 0x1771, 0x8457, 0x8457, 0x19D2, 0x845B, 0x845B, 0x0DB2,\n    0x8461, 0x8461, 0x1D8B, 0x8463, 0x8463, 0x10FA, 0x8466, 0x8466, 0x189C,\n    0x846B, 0x846B, 0x1E97, 0x846C, 0x846C, 0x19A1, 0x846F, 0x846F, 0x16F3,\n    0x8475, 0x8475, 0x0FA4, 0x847A, 0x847A, 0x1B12, 0x8490, 0x8490, 0x15E7,\n    0x8494, 0x8494, 0x1650, 0x8499, 0x8499, 0x12BF, 0x849C, 0x849C, 0x14C0,\n    0x84A1, 0x84A1, 0x1362, 0x84B2, 0x84B2, 0x1D8C, 0x84B8, 0x84B8, 0x1B1B,\n    0x84BB, 0x84BB, 0x16F4, 0x84BC, 0x84BC, 0x1BC9, 0x84BF, 0x84BF, 0x1E98,\n    0x84C0, 0x84C0, 0x15AD, 0x84C2, 0x84C2, 0x1296, 0x84C4, 0x84C4, 0x1C7F,\n    0x84C6, 0x84C6, 0x1527, 0x84C9, 0x84C9, 0x1831, 0x84CB, 0x84CB, 0x0DF8,\n    0x84CD, 0x84CD, 0x1651, 0x84D1, 0x84D1, 0x14A8, 0x84DA, 0x84DA, 0x15E8,\n    0x84EC, 0x84EC, 0x13F0, 0x84EE, 0x84EE, 0x1179, 0x84F4, 0x84F4, 0x161B,\n    0x84FC, 0x84FC, 0x11D0, 0x8511, 0x8511, 0x128B, 0x8513, 0x8513, 0x124C,\n    0x8514, 0x8514, 0x13DC, 0x8517, 0x8517, 0x1968, 0x8518, 0x8518, 0x14CD,\n    0x851A, 0x851A, 0x186A, 0x851E, 0x851E, 0x11DD, 0x8521, 0x8521, 0x1BD3,\n    0x8523, 0x8523, 0x19A2, 0x8525, 0x8525, 0x1C5B, 0x852C, 0x852C, 0x1597,\n    0x852D, 0x852D, 0x18EF, 0x852F, 0x852F, 0x1B5C, 0x853D, 0x853D, 0x1D75,\n    0x853F, 0x853F, 0x189D, 0x8541, 0x8541, 0x1085, 0x8543, 0x8543, 0x138A,\n    0x8549, 0x8549, 0x1C43, 0x854E, 0x854E, 0x0F2D, 0x8553, 0x8553, 0x1865,\n    0x8559, 0x8559, 0x1E74, 0x8563, 0x8563, 0x161C, 0x8568, 0x8568, 0x0F8D,\n    0x8569, 0x8569, 0x1D06, 0x856A, 0x856A, 0x12DD, 0x856D, 0x856D, 0x1598,\n    0x8584, 0x8584, 0x1325, 0x8587, 0x8587, 0x1301, 0x858F, 0x858F, 0x1907,\n    0x8591, 0x8591, 0x0DE2, 0x8594, 0x8594, 0x19A3, 0x859B, 0x859B, 0x1551,\n    0x85A6, 0x85A6, 0x1BF7, 0x85A8, 0x85A8, 0x1F35, 0x85A9, 0x85A9, 0x14C7,\n    0x85AA, 0x85AA, 0x1677, 0x85AF, 0x85AF, 0x1514, 0x85B0, 0x85B0, 0x1F32,\n    0x85BA, 0x85BA, 0x1A74, 0x85C1, 0x85C1, 0x0EAD, 0x85C9, 0x85C9, 0x1969,\n    0x85CD, 0x85CD, 0x1136, 0x85CE, 0x85CE, 0x1678, 0x85CF, 0x85CF, 0x19A4,\n    0x85D5, 0x85D5, 0x184C, 0x85DC, 0x85DC, 0x1163, 0x85DD, 0x85DD, 0x1798,\n    0x85E4, 0x85E4, 0x1112, 0x85E5, 0x85E5, 0x16F5, 0x85E9, 0x85E9, 0x138B,\n    0x85EA, 0x85EA, 0x15E9, 0x85F7, 0x85F7, 0x19D3, 0x85FA, 0x85FA, 0x1222,\n    0x85FB, 0x85FB, 0x1AA0, 0x85FF, 0x85FF, 0x0EE9, 0x8602, 0x8602, 0x1799,\n    0x8606, 0x8606, 0x11A8, 0x8607, 0x8607, 0x1599, 0x860A, 0x860A, 0x17C8,\n    0x8616, 0x8616, 0x1724, 0x8617, 0x8617, 0x13A4, 0x861A, 0x861A, 0x1541,\n    0x862D, 0x862D, 0x112B, 0x863F, 0x863F, 0x111A, 0x864E, 0x864E, 0x1E99,\n    0x8650, 0x8650, 0x1DD0, 0x8654, 0x8654, 0x0E19, 0x8655, 0x8655, 0x1BDD,\n    0x865B, 0x865B, 0x1E29, 0x865C, 0x865C, 0x11A9, 0x865E, 0x865E, 0x184D,\n    0x865F, 0x865F, 0x1E9A, 0x8667, 0x8667, 0x1F49, 0x8679, 0x8679, 0x1EB4,\n    0x868A, 0x868A, 0x12ED, 0x868C, 0x868C, 0x1363, 0x8693, 0x8693, 0x1938,\n    0x86A3, 0x86A3, 0x0ED7, 0x86A4, 0x86A4, 0x1AA1, 0x86A9, 0x86A9, 0x1CBB,\n    0x86C7, 0x86C7, 0x14A9, 0x86CB, 0x86CB, 0x1070, 0x86D4, 0x86D4, 0x1F09,\n    0x86D9, 0x86D9, 0x17D8, 0x86DB, 0x86DB, 0x1AE9, 0x86DF, 0x86DF, 0x0F2E,\n    0x86E4, 0x86E4, 0x1DF2, 0x86ED, 0x86ED, 0x1B72, 0x86FE, 0x86FE, 0x1699,\n    0x8700, 0x8700, 0x1C4D, 0x8702, 0x8702, 0x13F1, 0x8703, 0x8703, 0x1679,\n    0x8708, 0x8708, 0x17BA, 0x8718, 0x8718, 0x1B3A, 0x871A, 0x871A, 0x145E,\n    0x871C, 0x871C, 0x1314, 0x874E, 0x874E, 0x0DB4, 0x8755, 0x8755, 0x1662,\n    0x8757, 0x8757, 0x1EF4, 0x875F, 0x875F, 0x189E, 0x8766, 0x8766, 0x1DC9,\n    0x8768, 0x8768, 0x162C, 0x8774, 0x8774, 0x1E9B, 0x8776, 0x8776, 0x1A2F,\n    0x8778, 0x8778, 0x17D9, 0x8782, 0x8782, 0x1142, 0x878D, 0x878D, 0x18E4,\n    0x879F, 0x879F, 0x1297, 0x87A2, 0x87A2, 0x1E69, 0x87B3, 0x87B3, 0x1098,\n    0x87BA, 0x87BA, 0x111B, 0x87C4, 0x87C4, 0x1CD0, 0x87E0, 0x87E0, 0x133E,\n    0x87EC, 0x87EC, 0x1542, 0x87EF, 0x87EF, 0x1812, 0x87F2, 0x87F2, 0x1C8D,\n    0x87F9, 0x87F9, 0x1E10, 0x87FB, 0x87FB, 0x1908, 0x87FE, 0x87FE, 0x155B,\n    0x8805, 0x8805, 0x163A, 0x881F, 0x881F, 0x113B, 0x8822, 0x8822, 0x1B04,\n    0x8823, 0x8823, 0x1164, 0x8831, 0x8831, 0x0EAE, 0x8836, 0x8836, 0x1984,\n    0x883B, 0x883B, 0x124D, 0x8840, 0x8840, 0x1E4C, 0x8846, 0x8846, 0x1B0C,\n    0x884C, 0x884C, 0x1E1D, 0x884D, 0x884D, 0x175D, 0x8852, 0x8852, 0x1E46,\n    0x8853, 0x8853, 0x1624, 0x8857, 0x8857, 0x0D81, 0x8859, 0x8859, 0x169A,\n    0x885B, 0x885B, 0x189F, 0x885D, 0x885D, 0x1C8E, 0x8861, 0x8861, 0x1E6A,\n    0x8862, 0x8862, 0x0F5E, 0x8863, 0x8863, 0x1909, 0x8868, 0x8868, 0x1DA1,\n    0x886B, 0x886B, 0x14CE, 0x8870, 0x8870, 0x15BD, 0x8872, 0x8872, 0x1037,\n    0x8877, 0x8877, 0x1C8F, 0x887E, 0x887F, 0x0FCF, 0x8881, 0x8881, 0x1883,\n    0x8882, 0x8882, 0x129B, 0x8888, 0x8888, 0x0D82, 0x888B, 0x888B, 0x10A6,\n    0x888D, 0x888D, 0x1D8D, 0x8892, 0x8892, 0x1071, 0x8896, 0x8896, 0x15EA,\n    0x8897, 0x8897, 0x1B5D, 0x889E, 0x889E, 0x0EC6, 0x88AB, 0x88AB, 0x1DB1,\n    0x88B4, 0x88B4, 0x0EAF, 0x88C1, 0x88C1, 0x19B6, 0x88C2, 0x88C2, 0x1182,\n    0x88CF, 0x88CF, 0x1218, 0x88D4, 0x88D4, 0x179A, 0x88D5, 0x88D5, 0x18C7,\n    0x88D9, 0x88D9, 0x0F74, 0x88DC, 0x88DC, 0x13CE, 0x88DD, 0x88DD, 0x19A5,\n    0x88DF, 0x88DF, 0x14AA, 0x88E1, 0x88E1, 0x1219, 0x88E8, 0x88E8, 0x145F,\n    0x88F3, 0x88F3, 0x14EC, 0x88F4, 0x88F5, 0x1375, 0x88F8, 0x88F8, 0x111C,\n    0x88FD, 0x88FD, 0x1A75, 0x8907, 0x8907, 0x13DD, 0x8910, 0x8910, 0x0DB3,\n    0x8912, 0x8912, 0x1D8E, 0x8913, 0x8913, 0x13CF, 0x8918, 0x8918, 0x18A0,\n    0x8919, 0x8919, 0x1377, 0x8925, 0x8925, 0x181C, 0x892A, 0x892A, 0x1D26,\n    0x8936, 0x8936, 0x1630, 0x8938, 0x8938, 0x11DE, 0x893B, 0x893B, 0x1552,\n    0x8941, 0x8941, 0x0DE3, 0x8944, 0x8944, 0x1709, 0x895F, 0x895F, 0x0FD1,\n    0x8964, 0x8964, 0x1137, 0x896A, 0x896A, 0x1256, 0x8972, 0x8972, 0x1631,\n    0x897F, 0x897F, 0x1515, 0x8981, 0x8981, 0x1813, 0x8983, 0x8983, 0x1086,\n    0x8986, 0x8986, 0x13DE, 0x8987, 0x8987, 0x1D57, 0x898B, 0x898B, 0x0E3C,\n    0x898F, 0x898F, 0x0FA5, 0x8993, 0x8993, 0x127E, 0x8996, 0x8996, 0x1652,\n    0x89A1, 0x89A1, 0x0E33, 0x89A9, 0x89A9, 0x10CA, 0x89AA, 0x89AA, 0x1CC3,\n    0x89B2, 0x89B2, 0x0FC2, 0x89BA, 0x89BA, 0x0D91, 0x89BD, 0x89BD, 0x1138,\n    0x89C0, 0x89C0, 0x0EF7, 0x89D2, 0x89D2, 0x0D92, 0x89E3, 0x89E3, 0x1E11,\n    0x89F4, 0x89F4, 0x14ED, 0x89F8, 0x89F8, 0x1C4E, 0x8A00, 0x8A00, 0x1721,\n    0x8A02, 0x8A02, 0x1A59, 0x8A03, 0x8A03, 0x1413, 0x8A08, 0x8A08, 0x0E8C,\n    0x8A0A, 0x8A0A, 0x167A, 0x8A0C, 0x8A0C, 0x1EB5, 0x8A0E, 0x8A0E, 0x1D1C,\n    0x8A13, 0x8A13, 0x1F33, 0x8A16, 0x8A16, 0x1F5A, 0x8A17, 0x8A17, 0x1CEE,\n    0x8A18, 0x8A18, 0x1012, 0x8A1B, 0x8A1B, 0x17DA, 0x8A1D, 0x8A1D, 0x169B,\n    0x8A1F, 0x8A1F, 0x15B5, 0x8A23, 0x8A23, 0x0E45, 0x8A25, 0x8A25, 0x1056,\n    0x8A2A, 0x8A2A, 0x1364, 0x8A2D, 0x8A2D, 0x1553, 0x8A31, 0x8A31, 0x1E2A,\n    0x8A34, 0x8A34, 0x159A, 0x8A36, 0x8A36, 0x0D83, 0x8A3A, 0x8A3A, 0x1B5E,\n    0x8A3B, 0x8A3B, 0x1AEA, 0x8A50, 0x8A50, 0x14AB, 0x8A54, 0x8A54, 0x1AA2,\n    0x8A55, 0x8A55, 0x1D6D, 0x8A5B, 0x8A5B, 0x19D4, 0x8A5E, 0x8A5E, 0x14AC,\n    0x8A60, 0x8A60, 0x1789, 0x8A62, 0x8A62, 0x161D, 0x8A63, 0x8A63, 0x179B,\n    0x8A66, 0x8A66, 0x1653, 0x8A69, 0x8A69, 0x1654, 0x8A6D, 0x8A6D, 0x0F93,\n    0x8A6E, 0x8A6E, 0x1A11, 0x8A70, 0x8A70, 0x1F77, 0x8A71, 0x8A71, 0x1EC1,\n    0x8A72, 0x8A72, 0x1E12, 0x8A73, 0x8A73, 0x14EE, 0x8A75, 0x8A75, 0x1543,\n    0x8A79, 0x8A79, 0x1C11, 0x8A85, 0x8A85, 0x1AEB, 0x8A87, 0x8A87, 0x0EE1,\n    0x8A8C, 0x8A8C, 0x1B3B, 0x8A8D, 0x8A8D, 0x1939, 0x8A93, 0x8A93, 0x1516,\n    0x8A95, 0x8A95, 0x1CF9, 0x8A98, 0x8A98, 0x18C8, 0x8A9E, 0x8A9E, 0x1714,\n    0x8AA0, 0x8AA0, 0x1572, 0x8AA1, 0x8AA1, 0x0E8D, 0x8AA3, 0x8AA3, 0x12DE,\n    0x8AA4, 0x8AA4, 0x17BB, 0x8AA5, 0x8AA5, 0x0EB0, 0x8AA6, 0x8AA6, 0x15B6,\n    0x8AA8, 0x8AA8, 0x1F0A, 0x8AAA, 0x8AAA, 0x1554, 0x8AB0, 0x8AB0, 0x15EB,\n    0x8AB2, 0x8AB2, 0x0EE2, 0x8AB9, 0x8AB9, 0x1460, 0x8ABC, 0x8ABC, 0x190A,\n    0x8ABE, 0x8ABE, 0x18E9, 0x8ABF, 0x8ABF, 0x1AA3, 0x8AC2, 0x8AC2, 0x1C12,\n    0x8AC4, 0x8AC4, 0x161E, 0x8AC7, 0x8AC7, 0x1087, 0x8ACB, 0x8ACB, 0x1C22,\n    0x8ACD, 0x8ACD, 0x19BD, 0x8ACF, 0x8ACF, 0x1C6C, 0x8AD2, 0x8AD2, 0x1155,\n    0x8AD6, 0x8AD6, 0x11B7, 0x8ADB, 0x8ADB, 0x18C9, 0x8ADC, 0x8ADC, 0x1C1A,\n    0x8AE1, 0x8AE1, 0x1655, 0x8AE6, 0x8AE6, 0x1C2A, 0x8AE7, 0x8AE7, 0x1E13,\n    0x8AEA, 0x8AEA, 0x1A5A, 0x8AEB, 0x8AEB, 0x0DAA, 0x8AED, 0x8AED, 0x18CA,\n    0x8AEE, 0x8AEE, 0x196A, 0x8AF1, 0x8AF1, 0x1F42, 0x8AF6, 0x8AF6, 0x168A,\n    0x8AF7, 0x8AF7, 0x1DA9, 0x8AF8, 0x8AF8, 0x1A76, 0x8AFA, 0x8AFA, 0x1722,\n    0x8AFE, 0x8AFE, 0x102B, 0x8B00, 0x8B00, 0x12B1, 0x8B01, 0x8B01, 0x16BA,\n    0x8B02, 0x8B02, 0x18A1, 0x8B04, 0x8B04, 0x1113, 0x8B0E, 0x8B0E, 0x1302,\n    0x8B10, 0x8B10, 0x1315, 0x8B14, 0x8B14, 0x1DD1, 0x8B16, 0x8B16, 0x15A7,\n    0x8B17, 0x8B17, 0x1365, 0x8B19, 0x8B19, 0x0E49, 0x8B1A, 0x8B1A, 0x192A,\n    0x8B1B, 0x8B1B, 0x0DE4, 0x8B1D, 0x8B1D, 0x14AD, 0x8B20, 0x8B20, 0x1814,\n    0x8B28, 0x8B28, 0x12B2, 0x8B2B, 0x8B2B, 0x19EA, 0x8B2C, 0x8B2C, 0x11ED,\n    0x8B33, 0x8B33, 0x0F5F, 0x8B39, 0x8B39, 0x0FC3, 0x8B41, 0x8B41, 0x1EC2,\n    0x8B49, 0x8B49, 0x1B1C, 0x8B4E, 0x8B4E, 0x1F4B, 0x8B4F, 0x8B4F, 0x1013,\n    0x8B58, 0x8B58, 0x1663, 0x8B5A, 0x8B5A, 0x1088, 0x8B5C, 0x8B5C, 0x13D0,\n    0x8B66, 0x8B66, 0x0E71, 0x8B6C, 0x8B6C, 0x1461, 0x8B6F, 0x8B6F, 0x1741,\n    0x8B70, 0x8B70, 0x190B, 0x8B74, 0x8B74, 0x0E3D, 0x8B77, 0x8B77, 0x1E9C,\n    0x8B7D, 0x8B7D, 0x179C, 0x8B80, 0x8B80, 0x10DE, 0x8B8A, 0x8B8A, 0x13A9,\n    0x8B90, 0x8B90, 0x15EC, 0x8B92, 0x8B92, 0x1BB2, 0x8B93, 0x8B93, 0x170A,\n    0x8B96, 0x8B96, 0x1BB3, 0x8B9A, 0x8B9A, 0x1BA0, 0x8C37, 0x8C37, 0x0EBC,\n    0x8C3F, 0x8C3F, 0x0E8E, 0x8C41, 0x8C41, 0x1EDE, 0x8C46, 0x8C46, 0x1103,\n    0x8C48, 0x8C48, 0x1014, 0x8C4A, 0x8C4A, 0x1DAA, 0x8C4C, 0x8C4C, 0x17EA,\n    0x8C55, 0x8C55, 0x1656, 0x8C5A, 0x8C5A, 0x10E7, 0x8C61, 0x8C61, 0x14EF,\n    0x8C6A, 0x8C6A, 0x1E9D, 0x8C6B, 0x8C6B, 0x179D, 0x8C79, 0x8C79, 0x1DA2,\n    0x8C7A, 0x8C7A, 0x1657, 0x8C82, 0x8C82, 0x1C44, 0x8C8A, 0x8C8A, 0x1273,\n    0x8C8C, 0x8C8C, 0x12B3, 0x8C9D, 0x8C9D, 0x1D58, 0x8C9E, 0x8C9E, 0x1A5B,\n    0x8CA0, 0x8CA0, 0x1414, 0x8CA1, 0x8CA1, 0x19B7, 0x8CA2, 0x8CA2, 0x0ED8,\n    0x8CA7, 0x8CA7, 0x1472, 0x8CA8, 0x8CA8, 0x1EC3, 0x8CA9, 0x8CA9, 0x1D47,\n    0x8CAA, 0x8CAA, 0x1CFF, 0x8CAB, 0x8CAB, 0x0EF8, 0x8CAC, 0x8CAC, 0x1BD9,\n    0x8CAF, 0x8CAF, 0x19D5, 0x8CB0, 0x8CB0, 0x157B, 0x8CB3, 0x8CB3, 0x1921,\n    0x8CB4, 0x8CB4, 0x0F98, 0x8CB6, 0x8CB6, 0x1D68, 0x8CB7, 0x8CB7, 0x126E,\n    0x8CB8, 0x8CB8, 0x10A7, 0x8CBB, 0x8CBB, 0x1462, 0x8CBC, 0x8CBC, 0x1C1B,\n    0x8CBD, 0x8CBD, 0x1920, 0x8CBF, 0x8CBF, 0x12DF, 0x8CC0, 0x8CC0, 0x1DCA,\n    0x8CC1, 0x8CC1, 0x1431, 0x8CC2, 0x8CC2, 0x11C3, 0x8CC3, 0x8CC3, 0x194C,\n    0x8CC4, 0x8CC4, 0x1F0B, 0x8CC7, 0x8CC7, 0x196B, 0x8CC8, 0x8CC8, 0x0D84,\n    0x8CCA, 0x8CCA, 0x19EB, 0x8CD1, 0x8CD1, 0x1B5F, 0x8CD3, 0x8CD3, 0x1473,\n    0x8CDA, 0x8CDA, 0x11C4, 0x8CDC, 0x8CDC, 0x14AE, 0x8CDE, 0x8CDE, 0x14F0,\n    0x8CE0, 0x8CE0, 0x1378, 0x8CE2, 0x8CE2, 0x1E47, 0x8CE3, 0x8CE3, 0x126F,\n    0x8CE4, 0x8CE4, 0x1BF8, 0x8CE6, 0x8CE6, 0x1415, 0x8CEA, 0x8CEA, 0x1B73,\n    0x8CED, 0x8CED, 0x10CB, 0x8CF4, 0x8CF4, 0x11C5, 0x8CFB, 0x8CFB, 0x1416,\n    0x8CFC, 0x8CFC, 0x0F60, 0x8CFD, 0x8CFD, 0x14F4, 0x8D04, 0x8D04, 0x1B3C,\n    0x8D05, 0x8D05, 0x1C93, 0x8D07, 0x8D07, 0x18DD, 0x8D08, 0x8D08, 0x1B1D,\n    0x8D0A, 0x8D0A, 0x1BA1, 0x8D0D, 0x8D0D, 0x155C, 0x8D13, 0x8D13, 0x19A6,\n    0x8D16, 0x8D16, 0x15A8, 0x8D64, 0x8D64, 0x19EC, 0x8D66, 0x8D66, 0x14AF,\n    0x8D6B, 0x8D6B, 0x1E34, 0x8D70, 0x8D70, 0x1AEC, 0x8D73, 0x8D73, 0x0FA6,\n    0x8D74, 0x8D74, 0x1417, 0x8D77, 0x8D77, 0x1015, 0x8D85, 0x8D85, 0x1C45,\n    0x8D8A, 0x8D8A, 0x188A, 0x8D99, 0x8D99, 0x1AA4, 0x8DA3, 0x8DA3, 0x1C9E,\n    0x8DA8, 0x8DA8, 0x1C6D, 0x8DB3, 0x8DB3, 0x1AAE, 0x8DBA, 0x8DBA, 0x1418,\n    0x8DBE, 0x8DBE, 0x1B3D, 0x8DC6, 0x8DC6, 0x1D12, 0x8DCB, 0x8DCB, 0x1348,\n    0x8DCC, 0x8DCC, 0x1B74, 0x8DCF, 0x8DCF, 0x0D85, 0x8DDB, 0x8DDB, 0x1D40,\n    0x8DDD, 0x8DDD, 0x0E0C, 0x8DE1, 0x8DE1, 0x19ED, 0x8DE3, 0x8DE3, 0x1544,\n    0x8DE8, 0x8DE8, 0x0EE3, 0x8DEF, 0x8DEF, 0x11AA, 0x8DF3, 0x8DF3, 0x10CC,\n    0x8E0A, 0x8E0A, 0x1832, 0x8E0F, 0x8E0F, 0x108D, 0x8E10, 0x8E10, 0x1BF9,\n    0x8E1E, 0x8E1E, 0x0E0D, 0x8E2A, 0x8E2A, 0x1AC2, 0x8E30, 0x8E30, 0x18CB,\n    0x8E35, 0x8E35, 0x1AC3, 0x8E42, 0x8E42, 0x18CC, 0x8E44, 0x8E44, 0x1A77,\n    0x8E47, 0x8E47, 0x0E1A, 0x8E48, 0x8E48, 0x10CD, 0x8E49, 0x8E49, 0x1B8C,\n    0x8E4A, 0x8E4A, 0x1E75, 0x8E59, 0x8E59, 0x1C80, 0x8E5F, 0x8E5F, 0x19EE,\n    0x8E60, 0x8E60, 0x1BE9, 0x8E74, 0x8E74, 0x1C81, 0x8E76, 0x8E76, 0x0F8E,\n    0x8E81, 0x8E81, 0x1AA5, 0x8E87, 0x8E87, 0x19D6, 0x8E8A, 0x8E8A, 0x1AED,\n    0x8E8D, 0x8E8D, 0x16F6, 0x8EAA, 0x8EAA, 0x1223, 0x8EAB, 0x8EAB, 0x167B,\n    0x8EAC, 0x8EAC, 0x0F80, 0x8EC0, 0x8EC0, 0x0F61, 0x8ECA, 0x8ECA, 0x1B8D,\n    0x8ECB, 0x8ECB, 0x16BB, 0x8ECC, 0x8ECC, 0x0F94, 0x8ECD, 0x8ECD, 0x0F75,\n    0x8ED2, 0x8ED2, 0x1E2E, 0x8EDF, 0x8EDF, 0x175E, 0x8EEB, 0x8EEB, 0x1B60,\n    0x8EF8, 0x8EF8, 0x1C82, 0x8EFB, 0x8EFB, 0x0D86, 0x8EFE, 0x8EFE, 0x1664,\n    0x8F03, 0x8F03, 0x0F2F, 0x8F05, 0x8F05, 0x11AB, 0x8F09, 0x8F09, 0x19B8,\n    0x8F12, 0x8F12, 0x1C1C, 0x8F13, 0x8F13, 0x124E, 0x8F14, 0x8F14, 0x13D1,\n    0x8F15, 0x8F15, 0x0E72, 0x8F1B, 0x8F1B, 0x1156, 0x8F1C, 0x8F1C, 0x1CBC,\n    0x8F1D, 0x8F1D, 0x1F43, 0x8F1E, 0x8F1E, 0x1262, 0x8F1F, 0x8F1F, 0x1C06,\n    0x8F26, 0x8F26, 0x117A, 0x8F27, 0x8F27, 0x13BF, 0x8F29, 0x8F29, 0x1379,\n    0x8F2A, 0x8F2A, 0x11F7, 0x8F2F, 0x8F2F, 0x1B7B, 0x8F33, 0x8F33, 0x1AEE,\n    0x8F38, 0x8F38, 0x15ED, 0x8F39, 0x8F39, 0x13DF, 0x8F3B, 0x8F3B, 0x13E0,\n    0x8F3E, 0x8F3E, 0x1A12, 0x8F3F, 0x8F3F, 0x1738, 0x8F44, 0x8F44, 0x1DE2,\n    0x8F45, 0x8F45, 0x1884, 0x8F49, 0x8F49, 0x1A13, 0x8F4D, 0x8F4D, 0x1C07,\n    0x8F4E, 0x8F4E, 0x0F30, 0x8F5D, 0x8F5D, 0x1739, 0x8F5F, 0x8F5F, 0x0F1B,\n    0x8F62, 0x8F62, 0x116F, 0x8F9B, 0x8F9B, 0x167C, 0x8F9C, 0x8F9C, 0x0EB1,\n    0x8FA3, 0x8FA3, 0x112E, 0x8FA6, 0x8FA6, 0x1D48, 0x8FA8, 0x8FA8, 0x13AA,\n    0x8FAD, 0x8FAD, 0x14B0, 0x8FAF, 0x8FAF, 0x13AB, 0x8FB0, 0x8FB0, 0x1B61,\n    0x8FB1, 0x8FB1, 0x181D, 0x8FB2, 0x8FB2, 0x1051, 0x8FC2, 0x8FC2, 0x184E,\n    0x8FC5, 0x8FC5, 0x167D, 0x8FCE, 0x8FCE, 0x178A, 0x8FD1, 0x8FD1, 0x0FC4,\n    0x8FD4, 0x8FD4, 0x133F, 0x8FE6, 0x8FE6, 0x0D87, 0x8FEA, 0x8FEA, 0x19EF,\n    0x8FEB, 0x8FEB, 0x1326, 0x8FED, 0x8FED, 0x1B75, 0x8FF0, 0x8FF0, 0x1625,\n    0x8FF2, 0x8FF2, 0x0E2A, 0x8FF7, 0x8FF7, 0x1303, 0x8FF9, 0x8FF9, 0x19F0,\n    0x8FFD, 0x8FFD, 0x1C6E, 0x9000, 0x9000, 0x1D27, 0x9001, 0x9001, 0x15B7,\n    0x9002, 0x9002, 0x0EFE, 0x9003, 0x9003, 0x10CE, 0x9005, 0x9005, 0x1F2A,\n    0x9006, 0x9006, 0x1742, 0x9008, 0x9008, 0x1E6B, 0x900B, 0x900B, 0x1D8F,\n    0x900D, 0x900D, 0x159B, 0x900F, 0x900F, 0x1D2D, 0x9010, 0x9010, 0x1C83,\n    0x9011, 0x9011, 0x0F62, 0x9014, 0x9014, 0x10CF, 0x9015, 0x9015, 0x0E73,\n    0x9017, 0x9017, 0x1104, 0x9019, 0x9019, 0x19D7, 0x901A, 0x901A, 0x1D22,\n    0x901D, 0x901D, 0x1517, 0x901E, 0x901E, 0x1194, 0x901F, 0x901F, 0x15A9,\n    0x9020, 0x9020, 0x1AA6, 0x9021, 0x9021, 0x1B05, 0x9022, 0x9022, 0x13F2,\n    0x9023, 0x9023, 0x117B, 0x902E, 0x902E, 0x1C2B, 0x9031, 0x9031, 0x1AEF,\n    0x9032, 0x9032, 0x1B62, 0x9035, 0x9035, 0x0FA7, 0x9038, 0x9038, 0x1942,\n    0x903C, 0x903C, 0x1DBF, 0x903E, 0x903E, 0x18CE, 0x9041, 0x9041, 0x1109,\n    0x9042, 0x9042, 0x15EE, 0x9047, 0x9047, 0x184F, 0x904A, 0x904A, 0x18CD,\n    0x904B, 0x904B, 0x1866, 0x904D, 0x904D, 0x1D65, 0x904E, 0x904E, 0x0EE4,\n    0x9050, 0x9050, 0x1DCB, 0x9051, 0x9051, 0x1EF5, 0x9053, 0x9053, 0x10D0,\n    0x9054, 0x9054, 0x1078, 0x9055, 0x9055, 0x18A2, 0x9059, 0x9059, 0x1815,\n    0x905C, 0x905C, 0x15AE, 0x905D, 0x905D, 0x108E, 0x905E, 0x905E, 0x1C2C,\n    0x9060, 0x9060, 0x1885, 0x9061, 0x9061, 0x159C, 0x9063, 0x9063, 0x0E3E,\n    0x9069, 0x9069, 0x19F1, 0x906D, 0x906D, 0x1AA7, 0x906E, 0x906E, 0x1B8E,\n    0x906F, 0x906F, 0x110A, 0x9072, 0x9072, 0x1B3E, 0x9075, 0x9075, 0x1B06,\n    0x9077, 0x9077, 0x1BFA, 0x9078, 0x9078, 0x1545, 0x907A, 0x907A, 0x18CF,\n    0x907C, 0x907C, 0x11D1, 0x907D, 0x907D, 0x0E0E, 0x907F, 0x907F, 0x1DB2,\n    0x9080, 0x9080, 0x1816, 0x9081, 0x9081, 0x1270, 0x9082, 0x9082, 0x1E14,\n    0x9083, 0x9083, 0x15EF, 0x9084, 0x9084, 0x1ED8, 0x9087, 0x9087, 0x1922,\n    0x9088, 0x9088, 0x123D, 0x908A, 0x908A, 0x13AC, 0x908F, 0x908F, 0x111D,\n    0x9091, 0x9091, 0x18F5, 0x9095, 0x9095, 0x17D0, 0x9099, 0x9099, 0x1263,\n    0x90A2, 0x90A2, 0x1E6C, 0x90A3, 0x90A3, 0x102A, 0x90A6, 0x90A6, 0x1366,\n    0x90A8, 0x90A8, 0x1C52, 0x90AA, 0x90AA, 0x14B1, 0x90AF, 0x90AF, 0x0DC6,\n    0x90B0, 0x90B0, 0x1D13, 0x90B1, 0x90B1, 0x0F63, 0x90B5, 0x90B5, 0x159D,\n    0x90B8, 0x90B8, 0x19D8, 0x90C1, 0x90C1, 0x185C, 0x90CA, 0x90CA, 0x0F31,\n    0x90DE, 0x90DE, 0x1143, 0x90E1, 0x90E1, 0x0F76, 0x90E8, 0x90E8, 0x1419,\n    0x90ED, 0x90ED, 0x0EEA, 0x90F5, 0x90F5, 0x1850, 0x90FD, 0x90FD, 0x10D1,\n    0x9102, 0x9102, 0x16AA, 0x9112, 0x9112, 0x1C6F, 0x9115, 0x9115, 0x1E22,\n    0x9119, 0x9119, 0x1463, 0x9127, 0x9127, 0x1114, 0x912D, 0x912D, 0x1A5C,\n    0x9132, 0x9132, 0x1072, 0x9149, 0x9149, 0x18D0, 0x914A, 0x914A, 0x1A5D,\n    0x914B, 0x914B, 0x1C70, 0x914C, 0x914C, 0x1977, 0x914D, 0x914D, 0x137A,\n    0x914E, 0x914E, 0x1AF0, 0x9152, 0x9152, 0x1AF1, 0x9162, 0x9162, 0x1C46,\n    0x9169, 0x9169, 0x1298, 0x916A, 0x916A, 0x1123, 0x916C, 0x916C, 0x15F0,\n    0x9175, 0x9175, 0x1F1C, 0x9177, 0x9177, 0x1EA3, 0x9178, 0x9178, 0x14C1,\n    0x9187, 0x9187, 0x161F, 0x9189, 0x9189, 0x1C9F, 0x918B, 0x918B, 0x1C47,\n    0x918D, 0x918D, 0x1A78, 0x9192, 0x9192, 0x1573, 0x919C, 0x919C, 0x1C71,\n    0x91AB, 0x91AB, 0x190C, 0x91AC, 0x91AC, 0x19A7, 0x91AE, 0x91AE, 0x1C48,\n    0x91AF, 0x91AF, 0x1E76, 0x91B1, 0x91B1, 0x1349, 0x91B4, 0x91B4, 0x119D,\n    0x91B5, 0x91B5, 0x0E00, 0x91C0, 0x91C0, 0x170B, 0x91C7, 0x91C7, 0x1BD4,\n    0x91C9, 0x91C9, 0x18D1, 0x91CB, 0x91CB, 0x1528, 0x91CC, 0x91CC, 0x121A,\n    0x91CD, 0x91CD, 0x1B0D, 0x91CE, 0x91CE, 0x16EF, 0x91CF, 0x91CF, 0x1157,\n    0x91D0, 0x91D0, 0x121B, 0x91D1, 0x91D1, 0x1023, 0x91D7, 0x91D7, 0x15BE,\n    0x91D8, 0x91D8, 0x1A5E, 0x91DC, 0x91DC, 0x141A, 0x91DD, 0x91DD, 0x1CCE,\n    0x91E3, 0x91E3, 0x1AA8, 0x91E7, 0x91E7, 0x1BFB, 0x91EA, 0x91EA, 0x1851,\n    0x91F5, 0x91F5, 0x1BD5, 0x920D, 0x920D, 0x110B, 0x9210, 0x9210, 0x0E26,\n    0x9211, 0x9211, 0x1D49, 0x9212, 0x9212, 0x14D1, 0x9217, 0x9217, 0x18DE,\n    0x921E, 0x921E, 0x0FAE, 0x9234, 0x9234, 0x1195, 0x923A, 0x923A, 0x17C2,\n    0x923F, 0x923F, 0x1A14, 0x9240, 0x9240, 0x0DCE, 0x9245, 0x9245, 0x0E0F,\n    0x9249, 0x9249, 0x1E48, 0x9257, 0x9257, 0x0E4A, 0x925B, 0x925B, 0x175F,\n    0x925E, 0x925E, 0x188B, 0x9262, 0x9262, 0x134A, 0x9264, 0x9264, 0x0F64,\n    0x9265, 0x9265, 0x1626, 0x9266, 0x9266, 0x1A5F, 0x9280, 0x9280, 0x18EA,\n    0x9283, 0x9283, 0x1C5C, 0x9285, 0x9285, 0x10FB, 0x9291, 0x9291, 0x1546,\n    0x9293, 0x9293, 0x1A15, 0x9296, 0x9296, 0x15F1, 0x9298, 0x9298, 0x1299,\n    0x929C, 0x929C, 0x1DEC, 0x92B3, 0x92B3, 0x179E, 0x92B6, 0x92B6, 0x0F65,\n    0x92B7, 0x92B7, 0x159E, 0x92B9, 0x92B9, 0x15F2, 0x92CC, 0x92CC, 0x1A60,\n    0x92CF, 0x92CF, 0x1E59, 0x92D2, 0x92D2, 0x13F3, 0x92E4, 0x92E4, 0x1518,\n    0x92EA, 0x92EA, 0x1D90, 0x92F8, 0x92F8, 0x0E10, 0x92FC, 0x92FC, 0x0DE5,\n    0x9304, 0x9304, 0x11B4, 0x9310, 0x9310, 0x1C72, 0x9318, 0x9318, 0x1C73,\n    0x931A, 0x931A, 0x19BE, 0x931E, 0x931E, 0x1620, 0x931F, 0x931F, 0x1089,\n    0x9320, 0x9320, 0x1A61, 0x9321, 0x9321, 0x1016, 0x9322, 0x9322, 0x1A16,\n    0x9324, 0x9324, 0x1017, 0x9326, 0x9326, 0x0FD2, 0x9328, 0x9328, 0x12CB,\n    0x932B, 0x932B, 0x1529, 0x932E, 0x932E, 0x0EB2, 0x932F, 0x932F, 0x1B93,\n    0x9348, 0x9348, 0x178B, 0x934A, 0x934A, 0x117C, 0x934B, 0x934B, 0x0EE5,\n    0x934D, 0x934D, 0x10D2, 0x9354, 0x9354, 0x16AB, 0x935B, 0x935B, 0x1073,\n    0x936E, 0x936E, 0x18D2, 0x9375, 0x9375, 0x0E1B, 0x937C, 0x937C, 0x1CCF,\n    0x937E, 0x937E, 0x1AC4, 0x938C, 0x938C, 0x0E4B, 0x9394, 0x9394, 0x1833,\n    0x9396, 0x9396, 0x15BC, 0x939A, 0x939A, 0x1C74, 0x93A3, 0x93A3, 0x1E6D,\n    0x93A7, 0x93A7, 0x0DF9, 0x93AC, 0x93AC, 0x1E9E, 0x93AD, 0x93AD, 0x1B63,\n    0x93B0, 0x93B0, 0x1943, 0x93C3, 0x93C3, 0x1AAF, 0x93D1, 0x93D1, 0x19F2,\n    0x93DE, 0x93DE, 0x1834, 0x93E1, 0x93E1, 0x0E74, 0x93E4, 0x93E4, 0x11DF,\n    0x93F6, 0x93F6, 0x1B7C, 0x9404, 0x9404, 0x1F10, 0x9418, 0x9418, 0x1AC5,\n    0x9425, 0x9425, 0x1547, 0x942B, 0x942B, 0x1A17, 0x9435, 0x9435, 0x1C08,\n    0x9438, 0x9438, 0x1CEF, 0x9444, 0x9444, 0x1AF2, 0x9451, 0x9452, 0x0DC7,\n    0x945B, 0x945B, 0x0F0B, 0x947D, 0x947D, 0x1BA2, 0x947F, 0x947F, 0x1B94,\n    0x9577, 0x9577, 0x19A8, 0x9580, 0x9580, 0x12EE, 0x9583, 0x9583, 0x155D,\n    0x9589, 0x9589, 0x1D76, 0x958B, 0x958B, 0x0DFA, 0x958F, 0x958F, 0x18DF,\n    0x9591, 0x9592, 0x1DDD, 0x9593, 0x9593, 0x0DAB, 0x9594, 0x9594, 0x1312,\n    0x9598, 0x9598, 0x0DCF, 0x95A3, 0x95A3, 0x0D93, 0x95A4, 0x95A4, 0x1DF3,\n    0x95A5, 0x95A5, 0x1390, 0x95A8, 0x95A8, 0x0FA8, 0x95AD, 0x95AD, 0x1165,\n    0x95B1, 0x95B1, 0x1764, 0x95BB, 0x95BB, 0x176C, 0x95BC, 0x95BC, 0x16BC,\n    0x95C7, 0x95C7, 0x16C4, 0x95CA, 0x95CA, 0x1EDF, 0x95D4, 0x95D4, 0x1DF4,\n    0x95D5, 0x95D5, 0x0F8F, 0x95D6, 0x95D6, 0x1D31, 0x95DC, 0x95DC, 0x0EF9,\n    0x95E1, 0x95E1, 0x1BFC, 0x95E2, 0x95E2, 0x13A5, 0x961C, 0x961C, 0x141B,\n    0x9621, 0x9621, 0x1BFD, 0x962A, 0x962A, 0x1D4A, 0x962E, 0x962E, 0x17EB,\n    0x9632, 0x9632, 0x1367, 0x963B, 0x963B, 0x1AA9, 0x963F, 0x963F, 0x169C,\n    0x9640, 0x9640, 0x1CDF, 0x9642, 0x9642, 0x1DB3, 0x9644, 0x9644, 0x141C,\n    0x964B, 0x964B, 0x11E0, 0x964C, 0x964C, 0x1274, 0x964D, 0x964D, 0x0DE6,\n    0x9650, 0x9650, 0x1DDF, 0x965B, 0x965B, 0x1D77, 0x965C, 0x965C, 0x1DF5,\n    0x965D, 0x965D, 0x155E, 0x965E, 0x965E, 0x163B, 0x965F, 0x965F, 0x1BEA,\n    0x9662, 0x9662, 0x1886, 0x9663, 0x9663, 0x1B64, 0x9664, 0x9664, 0x1A79,\n    0x966A, 0x966A, 0x137B, 0x9670, 0x9670, 0x18F0, 0x9673, 0x9673, 0x1B65,\n    0x9675, 0x9675, 0x1204, 0x9676, 0x9676, 0x10D3, 0x9677, 0x9677, 0x1DED,\n    0x9678, 0x9678, 0x11F1, 0x967D, 0x967D, 0x170C, 0x9685, 0x9685, 0x1852,\n    0x9686, 0x9686, 0x11FB, 0x968A, 0x968A, 0x10A8, 0x968B, 0x968B, 0x15F3,\n    0x968D, 0x968D, 0x1EF6, 0x968E, 0x968E, 0x0E8F, 0x9694, 0x9694, 0x0E34,\n    0x9695, 0x9695, 0x1867, 0x9698, 0x9698, 0x16D9, 0x9699, 0x9699, 0x0FB6,\n    0x969B, 0x969B, 0x1A7A, 0x969C, 0x969C, 0x19A9, 0x96A3, 0x96A3, 0x1224,\n    0x96A7, 0x96A8, 0x15F4, 0x96AA, 0x96AA, 0x1E30, 0x96B1, 0x96B1, 0x18EB,\n    0x96B7, 0x96B7, 0x119E, 0x96BB, 0x96BB, 0x1BEB, 0x96C0, 0x96C0, 0x1978,\n    0x96C1, 0x96C1, 0x16B5, 0x96C4, 0x96C4, 0x186E, 0x96C5, 0x96C5, 0x169D,\n    0x96C6, 0x96C6, 0x1B7D, 0x96C7, 0x96C7, 0x0EB3, 0x96C9, 0x96C9, 0x1CBD,\n    0x96CB, 0x96CB, 0x1B07, 0x96CC, 0x96CC, 0x196C, 0x96CD, 0x96CD, 0x17D1,\n    0x96CE, 0x96CE, 0x19D9, 0x96D5, 0x96D5, 0x1AAA, 0x96D6, 0x96D6, 0x15F6,\n    0x96D9, 0x96D9, 0x168D, 0x96DB, 0x96DB, 0x1C75, 0x96DC, 0x96DC, 0x1985,\n    0x96E2, 0x96E2, 0x121C, 0x96E3, 0x96E3, 0x102E, 0x96E8, 0x96E9, 0x1853,\n    0x96EA, 0x96EA, 0x1555, 0x96EF, 0x96EF, 0x12EF, 0x96F0, 0x96F0, 0x1432,\n    0x96F2, 0x96F2, 0x1868, 0x96F6, 0x96F6, 0x1196, 0x96F7, 0x96F7, 0x11C6,\n    0x96F9, 0x96F9, 0x1327, 0x96FB, 0x96FB, 0x1A18, 0x9700, 0x9700, 0x15F7,\n    0x9706, 0x9706, 0x1A62, 0x9707, 0x9707, 0x1B66, 0x9711, 0x9711, 0x1A2A,\n    0x9713, 0x9713, 0x179F, 0x9716, 0x9716, 0x122B, 0x9719, 0x9719, 0x178C,\n    0x971C, 0x971C, 0x14F1, 0x971E, 0x971E, 0x1DCC, 0x9727, 0x9727, 0x12E0,\n    0x9730, 0x9730, 0x14C2, 0x9732, 0x9732, 0x11AC, 0x9739, 0x9739, 0x13A6,\n    0x973D, 0x973D, 0x1A7B, 0x9742, 0x9742, 0x1170, 0x9744, 0x9744, 0x16DA,\n    0x9748, 0x9748, 0x1197, 0x9751, 0x9751, 0x1C23, 0x9756, 0x9756, 0x1A63,\n    0x975C, 0x975C, 0x1A64, 0x975E, 0x975E, 0x1464, 0x9761, 0x9761, 0x1304,\n    0x9762, 0x9762, 0x1288, 0x9769, 0x9769, 0x1E35, 0x976D, 0x976D, 0x193A,\n    0x9774, 0x9774, 0x1EC4, 0x9777, 0x9777, 0x193B, 0x977A, 0x977A, 0x1257,\n    0x978B, 0x978B, 0x1E77, 0x978D, 0x978D, 0x16B6, 0x978F, 0x978F, 0x0ED9,\n    0x97A0, 0x97A0, 0x0F6E, 0x97A8, 0x97A8, 0x0DB5, 0x97AB, 0x97AB, 0x0F6F,\n    0x97AD, 0x97AD, 0x1D66, 0x97C6, 0x97C6, 0x1BFE, 0x97CB, 0x97CB, 0x18A3,\n    0x97D3, 0x97D3, 0x1DE0, 0x97DC, 0x97DC, 0x10D4, 0x97F3, 0x97F3, 0x18F1,\n    0x97F6, 0x97F6, 0x159F, 0x97FB, 0x97FB, 0x1869, 0x97FF, 0x97FF, 0x1E23,\n    0x9800, 0x9800, 0x1E9F, 0x9801, 0x9801, 0x1E4D, 0x9802, 0x9802, 0x1A65,\n    0x9803, 0x9803, 0x0E75, 0x9805, 0x9805, 0x1E04, 0x9806, 0x9806, 0x1621,\n    0x9808, 0x9808, 0x15F8, 0x980A, 0x980A, 0x185D, 0x980C, 0x980C, 0x15B8,\n    0x9810, 0x9810, 0x17A0, 0x9811, 0x9811, 0x17EC, 0x9812, 0x9812, 0x1340,\n    0x9813, 0x9813, 0x10E8, 0x9817, 0x9817, 0x1D41, 0x9818, 0x9818, 0x1198,\n    0x982D, 0x982D, 0x1105, 0x9830, 0x9830, 0x1E5A, 0x9838, 0x9838, 0x0E76,\n    0x9839, 0x9839, 0x1D28, 0x983B, 0x983B, 0x1474, 0x9846, 0x9846, 0x0EE6,\n    0x984C, 0x984C, 0x1A7C, 0x984D, 0x984D, 0x16E1, 0x984E, 0x984E, 0x16AC,\n    0x9854, 0x9854, 0x16B7, 0x9858, 0x9858, 0x1887, 0x985A, 0x985A, 0x1A19,\n    0x985E, 0x985E, 0x11EE, 0x9865, 0x9865, 0x1EA0, 0x9867, 0x9867, 0x0EB4,\n    0x986B, 0x986B, 0x1A1A, 0x986F, 0x986F, 0x1E49, 0x98A8, 0x98A8, 0x1DAB,\n    0x98AF, 0x98AF, 0x14D2, 0x98B1, 0x98B1, 0x1D14, 0x98C4, 0x98C4, 0x1DA4,\n    0x98C7, 0x98C7, 0x1DA3, 0x98DB, 0x98DB, 0x1465, 0x98DC, 0x98DC, 0x138C,\n    0x98DF, 0x98DF, 0x1665, 0x98E1, 0x98E1, 0x15AF, 0x98E2, 0x98E2, 0x1018,\n    0x98ED, 0x98ED, 0x1CC2, 0x98EE, 0x98EE, 0x18F2, 0x98EF, 0x98EF, 0x1341,\n    0x98F4, 0x98F4, 0x1923, 0x98FC, 0x98FC, 0x14B2, 0x98FD, 0x98FD, 0x1D91,\n    0x98FE, 0x98FE, 0x1666, 0x9903, 0x9903, 0x0F32, 0x9909, 0x9909, 0x1E24,\n    0x990A, 0x990A, 0x170D, 0x990C, 0x990C, 0x1924, 0x9910, 0x9910, 0x1BA3,\n    0x9913, 0x9913, 0x169E, 0x9918, 0x9918, 0x173A, 0x991E, 0x991E, 0x1A1B,\n    0x9920, 0x9920, 0x13C0, 0x9928, 0x9928, 0x0EFA, 0x9945, 0x9945, 0x124F,\n    0x9949, 0x9949, 0x0FC5, 0x994B, 0x994B, 0x0F95, 0x994C, 0x994C, 0x1BA4,\n    0x994D, 0x994D, 0x1548, 0x9951, 0x9951, 0x1019, 0x9952, 0x9952, 0x1817,\n    0x9954, 0x9954, 0x17D2, 0x9957, 0x9957, 0x1E25, 0x9996, 0x9996, 0x15F9,\n    0x9999, 0x9999, 0x1E26, 0x999D, 0x999D, 0x1DBD, 0x99A5, 0x99A5, 0x13E1,\n    0x99A8, 0x99A8, 0x1E6E, 0x99AC, 0x99AC, 0x1235, 0x99AD, 0x99AD, 0x1715,\n    0x99AE, 0x99AE, 0x1DAC, 0x99B1, 0x99B1, 0x1CE0, 0x99B3, 0x99B3, 0x1CBE,\n    0x99B4, 0x99B4, 0x1622, 0x99B9, 0x99B9, 0x1944, 0x99C1, 0x99C1, 0x1328,\n    0x99D0, 0x99D0, 0x1AF3, 0x99D1, 0x99D1, 0x104E, 0x99D2, 0x99D2, 0x0F66,\n    0x99D5, 0x99D5, 0x0D88, 0x99D9, 0x99D9, 0x141D, 0x99DD, 0x99DD, 0x1CE1,\n    0x99DF, 0x99DF, 0x14B3, 0x99ED, 0x99ED, 0x1E15, 0x99F1, 0x99F1, 0x1124,\n    0x99FF, 0x99FF, 0x1B08, 0x9A01, 0x9A01, 0x1478, 0x9A08, 0x9A08, 0x13C1,\n    0x9A0E, 0x9A0F, 0x101A, 0x9A19, 0x9A19, 0x1D67, 0x9A2B, 0x9A2B, 0x0E1C,\n    0x9A30, 0x9A30, 0x1115, 0x9A36, 0x9A36, 0x1C76, 0x9A37, 0x9A37, 0x15A0,\n    0x9A40, 0x9A40, 0x1275, 0x9A43, 0x9A43, 0x1DA5, 0x9A45, 0x9A45, 0x0F67,\n    0x9A4D, 0x9A4D, 0x1F1D, 0x9A55, 0x9A55, 0x0F33, 0x9A57, 0x9A57, 0x1E31,\n    0x9A5A, 0x9A5A, 0x0E77, 0x9A5B, 0x9A5B, 0x1743, 0x9A5F, 0x9A5F, 0x1CA0,\n    0x9A62, 0x9A62, 0x1166, 0x9A65, 0x9A65, 0x101C, 0x9A69, 0x9A69, 0x1ED9,\n    0x9A6A, 0x9A6A, 0x1167, 0x9AA8, 0x9AA8, 0x0EC9, 0x9AB8, 0x9AB8, 0x1E16,\n    0x9AD3, 0x9AD3, 0x15FA, 0x9AD4, 0x9AD4, 0x1C2D, 0x9AD8, 0x9AD8, 0x0EB5,\n    0x9AE5, 0x9AE5, 0x176D, 0x9AEE, 0x9AEE, 0x134B, 0x9B1A, 0x9B1A, 0x15FB,\n    0x9B27, 0x9B27, 0x11D2, 0x9B2A, 0x9B2A, 0x1D2E, 0x9B31, 0x9B31, 0x186B,\n    0x9B3C, 0x9B3C, 0x0F99, 0x9B41, 0x9B41, 0x0F17, 0x9B42, 0x9B42, 0x1EA9,\n    0x9B43, 0x9B43, 0x134C, 0x9B44, 0x9B44, 0x1383, 0x9B45, 0x9B45, 0x1271,\n    0x9B4F, 0x9B4F, 0x18A4, 0x9B54, 0x9B54, 0x1236, 0x9B5A, 0x9B5A, 0x1716,\n    0x9B6F, 0x9B6F, 0x11AD, 0x9B8E, 0x9B8E, 0x1A2B, 0x9B91, 0x9B91, 0x1D92,\n    0x9B9F, 0x9B9F, 0x16B8, 0x9BAB, 0x9BAB, 0x0F34, 0x9BAE, 0x9BAE, 0x1549,\n    0x9BC9, 0x9BC9, 0x121D, 0x9BD6, 0x9BD6, 0x1C24, 0x9BE4, 0x9BE4, 0x0EC7,\n    0x9BE8, 0x9BE8, 0x0E78, 0x9C0D, 0x9C0D, 0x1C77, 0x9C10, 0x9C10, 0x16AD,\n    0x9C12, 0x9C12, 0x13E2, 0x9C15, 0x9C15, 0x1DCD, 0x9C25, 0x9C25, 0x1EDA,\n    0x9C32, 0x9C32, 0x17BC, 0x9C3B, 0x9C3B, 0x1250, 0x9C47, 0x9C47, 0x0DE7,\n    0x9C49, 0x9C49, 0x13AF, 0x9C57, 0x9C57, 0x1225, 0x9CE5, 0x9CE5, 0x1AAB,\n    0x9CE7, 0x9CE7, 0x141E, 0x9CE9, 0x9CE9, 0x0F68, 0x9CF3, 0x9CF3, 0x13F4,\n    0x9CF4, 0x9CF4, 0x129A, 0x9CF6, 0x9CF6, 0x1760, 0x9D09, 0x9D09, 0x169F,\n    0x9D1B, 0x9D1B, 0x1888, 0x9D26, 0x9D26, 0x16CF, 0x9D28, 0x9D28, 0x16C8,\n    0x9D3B, 0x9D3B, 0x1EB6, 0x9D51, 0x9D51, 0x0E3F, 0x9D5D, 0x9D5D, 0x16A0,\n    0x9D60, 0x9D60, 0x0EBD, 0x9D61, 0x9D61, 0x12E1, 0x9D6C, 0x9D6C, 0x143C,\n    0x9D72, 0x9D72, 0x1979, 0x9DA9, 0x9DA9, 0x12BA, 0x9DAF, 0x9DAF, 0x16E4,\n    0x9DB4, 0x9DB4, 0x1DD2, 0x9DC4, 0x9DC4, 0x0E90, 0x9DD7, 0x9DD7, 0x0F69,\n    0x9DF2, 0x9DF2, 0x1CA1, 0x9DF8, 0x9DF8, 0x1F4C, 0x9DF9, 0x9DF9, 0x18F9,\n    0x9DFA, 0x9DFA, 0x11AE, 0x9E1A, 0x9E1A, 0x16E5, 0x9E1E, 0x9E1E, 0x112C,\n    0x9E75, 0x9E75, 0x11AF, 0x9E79, 0x9E79, 0x1DEE, 0x9E7D, 0x9E7D, 0x176E,\n    0x9E7F, 0x9E7F, 0x11B5, 0x9E92, 0x9E92, 0x101D, 0x9E93, 0x9E93, 0x11B6,\n    0x9E97, 0x9E97, 0x1168, 0x9E9D, 0x9E9D, 0x14B4, 0x9E9F, 0x9E9F, 0x1226,\n    0x9EA5, 0x9EA5, 0x1276, 0x9EB4, 0x9EB4, 0x0F70, 0x9EB5, 0x9EB5, 0x1289,\n    0x9EBB, 0x9EBB, 0x1237, 0x9EBE, 0x9EBE, 0x1F44, 0x9EC3, 0x9EC3, 0x1EF7,\n    0x9ECD, 0x9ECD, 0x1519, 0x9ECE, 0x9ECE, 0x1169, 0x9ED1, 0x9ED1, 0x1F52,\n    0x9ED4, 0x9ED4, 0x0E27, 0x9ED8, 0x9ED8, 0x12E3, 0x9EDB, 0x9EDB, 0x10A9,\n    0x9EDC, 0x9EDC, 0x1C89, 0x9EDE, 0x9EDE, 0x1A2C, 0x9EE8, 0x9EE8, 0x1099,\n    0x9EF4, 0x9EF4, 0x1305, 0x9F07, 0x9F07, 0x17BD, 0x9F08, 0x9F08, 0x13B0,\n    0x9F0E, 0x9F0E, 0x1A66, 0x9F13, 0x9F13, 0x0EB6, 0x9F20, 0x9F20, 0x151A,\n    0x9F3B, 0x9F3B, 0x1466, 0x9F4A, 0x9F4A, 0x1A7D, 0x9F4B, 0x9F4B, 0x19B9,\n    0x9F4E, 0x9F4E, 0x19BA, 0x9F52, 0x9F52, 0x1CBF, 0x9F5F, 0x9F5F, 0x19DA,\n    0x9F61, 0x9F61, 0x1199, 0x9F67, 0x9F67, 0x1556, 0x9F6A, 0x9F6A, 0x1B95,\n    0x9F6C, 0x9F6C, 0x1717, 0x9F77, 0x9F77, 0x16AE, 0x9F8D, 0x9F8D, 0x11D3,\n    0x9F90, 0x9F90, 0x1368, 0x9F95, 0x9F95, 0x0DC9, 0x9F9C, 0x9F9C, 0x0F6A,\n    0xAC00, 0xAC01, 0x043E, 0xAC02, 0xAC03, 0x2475, 0xAC04, 0xAC04, 0x0440,\n    0xAC05, 0xAC06, 0x2477, 0xAC07, 0xAC0A, 0x0441, 0xAC0B, 0xAC0F, 0x2479,\n    0xAC10, 0xAC17, 0x0445, 0xAC18, 0xAC18, 0x247E, 0xAC19, 0xAC1D, 0x044D,\n    0xAC1E, 0xAC1F, 0x247F, 0xAC20, 0xAC20, 0x0452, 0xAC21, 0xAC23, 0x2481,\n    0xAC24, 0xAC24, 0x0453, 0xAC25, 0xAC2B, 0x2484, 0xAC2C, 0xAC2D, 0x0454,\n    0xAC2E, 0xAC2E, 0x248B, 0xAC2F, 0xAC31, 0x0456, 0xAC32, 0xAC37, 0x248C,\n    0xAC38, 0xAC39, 0x0459, 0xAC3A, 0xAC3B, 0x2492, 0xAC3C, 0xAC3C, 0x045B,\n    0xAC3D, 0xAC3F, 0x2494, 0xAC40, 0xAC40, 0x045C, 0xAC41, 0xAC4A, 0x2497,\n    0xAC4B, 0xAC4B, 0x045D, 0xAC4C, 0xAC4C, 0x24A1, 0xAC4D, 0xAC4D, 0x045E,\n    0xAC4E, 0xAC53, 0x24A2, 0xAC54, 0xAC54, 0x045F, 0xAC55, 0xAC57, 0x24A8,\n    0xAC58, 0xAC58, 0x0460, 0xAC59, 0xAC5B, 0x24AB, 0xAC5C, 0xAC5C, 0x0461,\n    0xAC5D, 0xAC6F, 0x24AE, 0xAC70, 0xAC71, 0x0462, 0xAC72, 0xAC73, 0x24C1,\n    0xAC74, 0xAC74, 0x0464, 0xAC75, 0xAC76, 0x24C3, 0xAC77, 0xAC78, 0x0465,\n    0xAC79, 0xAC79, 0x24C5, 0xAC7A, 0xAC7A, 0x0467, 0xAC7B, 0xAC7F, 0x24C6,\n    0xAC80, 0xAC81, 0x0468, 0xAC82, 0xAC82, 0x24CB, 0xAC83, 0xAC86, 0x046A,\n    0xAC87, 0xAC88, 0x24CC, 0xAC89, 0xAC8C, 0x046E, 0xAC8D, 0xAC8F, 0x24CE,\n    0xAC90, 0xAC90, 0x0472, 0xAC91, 0xAC93, 0x24D1, 0xAC94, 0xAC94, 0x0473,\n    0xAC95, 0xAC9B, 0x24D4, 0xAC9C, 0xAC9D, 0x0474, 0xAC9E, 0xAC9E, 0x24DB,\n    0xAC9F, 0xACA1, 0x0476, 0xACA2, 0xACA7, 0x24DC, 0xACA8, 0xACAA, 0x0479,\n    0xACAB, 0xACAB, 0x24E2, 0xACAC, 0xACAC, 0x047C, 0xACAD, 0xACAE, 0x24E3,\n    0xACAF, 0xACB0, 0x047D, 0xACB1, 0xACB7, 0x24E5, 0xACB8, 0xACB9, 0x047F,\n    0xACBA, 0xACBA, 0x24EC, 0xACBB, 0xACBD, 0x0481, 0xACBE, 0xACC0, 0x24ED,\n    0xACC1, 0xACC1, 0x0484, 0xACC2, 0xACC3, 0x24F0, 0xACC4, 0xACC4, 0x0485,\n    0xACC5, 0xACC7, 0x24F2, 0xACC8, 0xACC8, 0x0486, 0xACC9, 0xACCB, 0x24F5,\n    0xACCC, 0xACCC, 0x0487, 0xACCD, 0xACD4, 0x24F8, 0xACD5, 0xACD5, 0x0488,\n    0xACD6, 0xACD6, 0x2500, 0xACD7, 0xACD7, 0x0489, 0xACD8, 0xACDF, 0x2501,\n    0xACE0, 0xACE1, 0x048A, 0xACE2, 0xACE3, 0x2509, 0xACE4, 0xACE4, 0x048C,\n    0xACE5, 0xACE6, 0x250B, 0xACE7, 0xACE8, 0x048D, 0xACE9, 0xACE9, 0x250D,\n    0xACEA, 0xACEA, 0x048F, 0xACEB, 0xACEB, 0x250E, 0xACEC, 0xACEC, 0x0490,\n    0xACED, 0xACEE, 0x250F, 0xACEF, 0xACF1, 0x0491, 0xACF2, 0xACF2, 0x2511,\n    0xACF3, 0xACF3, 0x0494, 0xACF4, 0xACF4, 0x2512, 0xACF5, 0xACF6, 0x0495,\n    0xACF7, 0xACFB, 0x2513, 0xACFC, 0xACFD, 0x0497, 0xACFE, 0xACFF, 0x2518,\n    0xAD00, 0xAD00, 0x0499, 0xAD01, 0xAD03, 0x251A, 0xAD04, 0xAD04, 0x049A,\n    0xAD05, 0xAD05, 0x251D, 0xAD06, 0xAD06, 0x049B, 0xAD07, 0xAD0B, 0x251E,\n    0xAD0C, 0xAD0D, 0x049C, 0xAD0E, 0xAD0E, 0x2523, 0xAD0F, 0xAD0F, 0x049E,\n    0xAD10, 0xAD10, 0x2524, 0xAD11, 0xAD11, 0x049F, 0xAD12, 0xAD17, 0x2525,\n    0xAD18, 0xAD18, 0x04A0, 0xAD19, 0xAD1B, 0x252B, 0xAD1C, 0xAD1C, 0x04A1,\n    0xAD1D, 0xAD1F, 0x252E, 0xAD20, 0xAD20, 0x04A2, 0xAD21, 0xAD28, 0x2531,\n    0xAD29, 0xAD29, 0x04A3, 0xAD2A, 0xAD2B, 0x2539, 0xAD2C, 0xAD2D, 0x04A4,\n    0xAD2E, 0xAD33, 0x253B, 0xAD34, 0xAD35, 0x04A6, 0xAD36, 0xAD37, 0x2541,\n    0xAD38, 0xAD38, 0x04A8, 0xAD39, 0xAD3B, 0x2543, 0xAD3C, 0xAD3C, 0x04A9,\n    0xAD3D, 0xAD43, 0x2546, 0xAD44, 0xAD45, 0x04AA, 0xAD46, 0xAD46, 0x254D,\n    0xAD47, 0xAD47, 0x04AC, 0xAD48, 0xAD48, 0x254E, 0xAD49, 0xAD49, 0x04AD,\n    0xAD4A, 0xAD4F, 0x254F, 0xAD50, 0xAD50, 0x04AE, 0xAD51, 0xAD53, 0x2555,\n    0xAD54, 0xAD54, 0x04AF, 0xAD55, 0xAD57, 0x2558, 0xAD58, 0xAD58, 0x04B0,\n    0xAD59, 0xAD60, 0x255B, 0xAD61, 0xAD61, 0x04B1, 0xAD62, 0xAD62, 0x2563,\n    0xAD63, 0xAD63, 0x04B2, 0xAD64, 0xAD6B, 0x2564, 0xAD6C, 0xAD6D, 0x04B3,\n    0xAD6E, 0xAD6F, 0x256C, 0xAD70, 0xAD70, 0x04B5, 0xAD71, 0xAD72, 0x256E,\n    0xAD73, 0xAD76, 0x04B6, 0xAD77, 0xAD7A, 0x2570, 0xAD7B, 0xAD7D, 0x04BA,\n    0xAD7E, 0xAD7E, 0x2574, 0xAD7F, 0xAD7F, 0x04BD, 0xAD80, 0xAD80, 0x2575,\n    0xAD81, 0xAD82, 0x04BE, 0xAD83, 0xAD87, 0x2576, 0xAD88, 0xAD89, 0x04C0,\n    0xAD8A, 0xAD8B, 0x257B, 0xAD8C, 0xAD8C, 0x04C2, 0xAD8D, 0xAD8F, 0x257D,\n    0xAD90, 0xAD90, 0x04C3, 0xAD91, 0xAD9B, 0x2580, 0xAD9C, 0xAD9D, 0x04C4,\n    0xAD9E, 0xADA3, 0x258B, 0xADA4, 0xADA4, 0x04C6, 0xADA5, 0xADB6, 0x2591,\n    0xADB7, 0xADB7, 0x04C7, 0xADB8, 0xADBF, 0x25A3, 0xADC0, 0xADC1, 0x04C8,\n    0xADC2, 0xADC3, 0x25AB, 0xADC4, 0xADC4, 0x04CA, 0xADC5, 0xADC7, 0x25AD,\n    0xADC8, 0xADC8, 0x04CB, 0xADC9, 0xADCF, 0x25B0, 0xADD0, 0xADD1, 0x04CC,\n    0xADD2, 0xADD2, 0x25B7, 0xADD3, 0xADD3, 0x04CE, 0xADD4, 0xADDB, 0x25B8,\n    0xADDC, 0xADDC, 0x04CF, 0xADDD, 0xADDF, 0x25C0, 0xADE0, 0xADE0, 0x04D0,\n    0xADE1, 0xADE3, 0x25C3, 0xADE4, 0xADE4, 0x04D1, 0xADE5, 0xADF7, 0x25C6,\n    0xADF8, 0xADF9, 0x04D2, 0xADFA, 0xADFB, 0x25D9, 0xADFC, 0xADFC, 0x04D4,\n    0xADFD, 0xADFE, 0x25DB, 0xADFF, 0xADFF, 0x04D5, 0xAE00, 0xAE01, 0x04D6,\n    0xAE02, 0xAE07, 0x25DD, 0xAE08, 0xAE09, 0x04D8, 0xAE0A, 0xAE0A, 0x25E3,\n    0xAE0B, 0xAE0B, 0x04DA, 0xAE0C, 0xAE0C, 0x25E4, 0xAE0D, 0xAE0D, 0x04DB,\n    0xAE0E, 0xAE13, 0x25E5, 0xAE14, 0xAE14, 0x04DC, 0xAE15, 0xAE2F, 0x25EB,\n    0xAE30, 0xAE31, 0x04DD, 0xAE32, 0xAE33, 0x2606, 0xAE34, 0xAE34, 0x04DF,\n    0xAE35, 0xAE36, 0x2608, 0xAE37, 0xAE38, 0x04E0, 0xAE39, 0xAE39, 0x260A,\n    0xAE3A, 0xAE3A, 0x04E2, 0xAE3B, 0xAE3F, 0x260B, 0xAE40, 0xAE41, 0x04E3,\n    0xAE42, 0xAE42, 0x2610, 0xAE43, 0xAE43, 0x04E5, 0xAE44, 0xAE44, 0x2611,\n    0xAE45, 0xAE46, 0x04E6, 0xAE47, 0xAE49, 0x2612, 0xAE4A, 0xAE4A, 0x04E8,\n    0xAE4B, 0xAE4B, 0x2615, 0xAE4C, 0xAE4E, 0x04E9, 0xAE4F, 0xAE4F, 0x2616,\n    0xAE50, 0xAE50, 0x04EC, 0xAE51, 0xAE53, 0x2617, 0xAE54, 0xAE54, 0x04ED,\n    0xAE55, 0xAE55, 0x261A, 0xAE56, 0xAE56, 0x04EE, 0xAE57, 0xAE5B, 0x261B,\n    0xAE5C, 0xAE5D, 0x04EF, 0xAE5E, 0xAE5E, 0x2620, 0xAE5F, 0xAE61, 0x04F1,\n    0xAE62, 0xAE64, 0x2621, 0xAE65, 0xAE65, 0x04F4, 0xAE66, 0xAE67, 0x2624,\n    0xAE68, 0xAE69, 0x04F5, 0xAE6A, 0xAE6B, 0x2626, 0xAE6C, 0xAE6C, 0x04F7,\n    0xAE6D, 0xAE6F, 0x2628, 0xAE70, 0xAE70, 0x04F8, 0xAE71, 0xAE77, 0x262B,\n    0xAE78, 0xAE79, 0x04F9, 0xAE7A, 0xAE7A, 0x2632, 0xAE7B, 0xAE7D, 0x04FB,\n    0xAE7E, 0xAE83, 0x2633, 0xAE84, 0xAE85, 0x04FE, 0xAE86, 0xAE8B, 0x2639,\n    0xAE8C, 0xAE8C, 0x0500, 0xAE8D, 0xAEBB, 0x263F, 0xAEBC, 0xAEBE, 0x0501,\n    0xAEBF, 0xAEBF, 0x266E, 0xAEC0, 0xAEC0, 0x0504, 0xAEC1, 0xAEC3, 0x266F,\n    0xAEC4, 0xAEC4, 0x0505, 0xAEC5, 0xAECB, 0x2672, 0xAECC, 0xAECD, 0x0506,\n    0xAECE, 0xAECE, 0x2679, 0xAECF, 0xAED1, 0x0508, 0xAED2, 0xAED7, 0x267A,\n    0xAED8, 0xAED9, 0x050B, 0xAEDA, 0xAEDB, 0x2680, 0xAEDC, 0xAEDC, 0x050D,\n    0xAEDD, 0xAEE7, 0x2682, 0xAEE8, 0xAEE8, 0x050E, 0xAEE9, 0xAEEA, 0x268D,\n    0xAEEB, 0xAEEB, 0x050F, 0xAEEC, 0xAEEC, 0x268F, 0xAEED, 0xAEED, 0x0510,\n    0xAEEE, 0xAEF3, 0x2690, 0xAEF4, 0xAEF4, 0x0511, 0xAEF5, 0xAEF7, 0x2696,\n    0xAEF8, 0xAEF8, 0x0512, 0xAEF9, 0xAEFB, 0x2699, 0xAEFC, 0xAEFC, 0x0513,\n    0xAEFD, 0xAEFF, 0x269C, 0xAF00, 0xAF06, 0x269F, 0xAF07, 0xAF08, 0x0514,\n    0xAF09, 0xAF0C, 0x26A6, 0xAF0D, 0xAF0D, 0x0516, 0xAF0E, 0xAF0F, 0x26AA,\n    0xAF10, 0xAF10, 0x0517, 0xAF11, 0xAF2B, 0x26AC, 0xAF2C, 0xAF2D, 0x0518,\n    0xAF2E, 0xAF2F, 0x26C7, 0xAF30, 0xAF30, 0x051A, 0xAF31, 0xAF31, 0x26C9,\n    0xAF32, 0xAF32, 0x051B, 0xAF33, 0xAF33, 0x26CA, 0xAF34, 0xAF34, 0x051C,\n    0xAF35, 0xAF3B, 0x26CB, 0xAF3C, 0xAF3D, 0x051D, 0xAF3E, 0xAF3E, 0x26D2,\n    0xAF3F, 0xAF3F, 0x051F, 0xAF40, 0xAF40, 0x26D3, 0xAF41, 0xAF43, 0x0520,\n    0xAF44, 0xAF47, 0x26D4, 0xAF48, 0xAF49, 0x0523, 0xAF4A, 0xAF4F, 0x26D8,\n    0xAF50, 0xAF50, 0x0525, 0xAF51, 0xAF5B, 0x26DE, 0xAF5C, 0xAF5D, 0x0526,\n    0xAF5E, 0xAF63, 0x26E9, 0xAF64, 0xAF65, 0x0528, 0xAF66, 0xAF78, 0x26EF,\n    0xAF79, 0xAF79, 0x052A, 0xAF7A, 0xAF7F, 0x2702, 0xAF80, 0xAF80, 0x052B,\n    0xAF81, 0xAF83, 0x2708, 0xAF84, 0xAF84, 0x052C, 0xAF85, 0xAF87, 0x270B,\n    0xAF88, 0xAF88, 0x052D, 0xAF89, 0xAF8F, 0x270E, 0xAF90, 0xAF91, 0x052E,\n    0xAF92, 0xAF94, 0x2715, 0xAF95, 0xAF95, 0x0530, 0xAF96, 0xAF9B, 0x2718,\n    0xAF9C, 0xAF9C, 0x0531, 0xAF9D, 0xAFB7, 0x271E, 0xAFB8, 0xAFB9, 0x0532,\n    0xAFBA, 0xAFBB, 0x2739, 0xAFBC, 0xAFBC, 0x0534, 0xAFBD, 0xAFBF, 0x273B,\n    0xAFC0, 0xAFC0, 0x0535, 0xAFC1, 0xAFC6, 0x273E, 0xAFC7, 0xAFC9, 0x0536,\n    0xAFCA, 0xAFCA, 0x2744, 0xAFCB, 0xAFCB, 0x0539, 0xAFCC, 0xAFCC, 0x2745,\n    0xAFCD, 0xAFCE, 0x053A, 0xAFCF, 0xAFD3, 0x2746, 0xAFD4, 0xAFD4, 0x053C,\n    0xAFD5, 0xAFDB, 0x274B, 0xAFDC, 0xAFDC, 0x053D, 0xAFDD, 0xAFE7, 0x2752,\n    0xAFE8, 0xAFE9, 0x053E, 0xAFEA, 0xAFEF, 0x275D, 0xAFF0, 0xAFF1, 0x0540,\n    0xAFF2, 0xAFF3, 0x2763, 0xAFF4, 0xAFF4, 0x0542, 0xAFF5, 0xAFF7, 0x2765,\n    0xAFF8, 0xAFF8, 0x0543, 0xAFF9, 0xAFFF, 0x2768, 0xB000, 0xB001, 0x0544,\n    0xB002, 0xB003, 0x276F, 0xB004, 0xB004, 0x0546, 0xB005, 0xB00B, 0x2771,\n    0xB00C, 0xB00C, 0x0547, 0xB00D, 0xB00F, 0x2778, 0xB010, 0xB010, 0x0548,\n    0xB011, 0xB013, 0x277B, 0xB014, 0xB014, 0x0549, 0xB015, 0xB01B, 0x277E,\n    0xB01C, 0xB01D, 0x054A, 0xB01E, 0xB027, 0x2785, 0xB028, 0xB028, 0x054C,\n    0xB029, 0xB043, 0x278F, 0xB044, 0xB045, 0x054D, 0xB046, 0xB047, 0x27AA,\n    0xB048, 0xB048, 0x054F, 0xB049, 0xB049, 0x27AC, 0xB04A, 0xB04A, 0x0550,\n    0xB04B, 0xB04B, 0x27AD, 0xB04C, 0xB04C, 0x0551, 0xB04D, 0xB04D, 0x27AE,\n    0xB04E, 0xB04E, 0x0552, 0xB04F, 0xB052, 0x27AF, 0xB053, 0xB055, 0x0553,\n    0xB056, 0xB056, 0x27B3, 0xB057, 0xB057, 0x0556, 0xB058, 0xB058, 0x27B4,\n    0xB059, 0xB059, 0x0557, 0xB05A, 0xB05C, 0x27B5, 0xB05D, 0xB05D, 0x0558,\n    0xB05E, 0xB07B, 0x27B8, 0xB07C, 0xB07D, 0x0559, 0xB07E, 0xB07F, 0x27D6,\n    0xB080, 0xB080, 0x055B, 0xB081, 0xB083, 0x27D8, 0xB084, 0xB084, 0x055C,\n    0xB085, 0xB08B, 0x27DB, 0xB08C, 0xB08D, 0x055D, 0xB08E, 0xB08E, 0x27E2,\n    0xB08F, 0xB08F, 0x055F, 0xB090, 0xB090, 0x27E3, 0xB091, 0xB091, 0x0560,\n    0xB092, 0xB097, 0x27E4, 0xB098, 0xB09A, 0x0561, 0xB09B, 0xB09B, 0x27EA,\n    0xB09C, 0xB09C, 0x0564, 0xB09D, 0xB09E, 0x27EB, 0xB09F, 0xB0A2, 0x0565,\n    0xB0A3, 0xB0A7, 0x27ED, 0xB0A8, 0xB0A9, 0x0569, 0xB0AA, 0xB0AA, 0x27F2,\n    0xB0AB, 0xB0AF, 0x056B, 0xB0B0, 0xB0B0, 0x27F3, 0xB0B1, 0xB0B1, 0x0570,\n    0xB0B2, 0xB0B2, 0x27F4, 0xB0B3, 0xB0B5, 0x0571, 0xB0B6, 0xB0B7, 0x27F5,\n    0xB0B8, 0xB0B8, 0x0574, 0xB0B9, 0xB0BB, 0x27F7, 0xB0BC, 0xB0BC, 0x0575,\n    0xB0BD, 0xB0C3, 0x27FA, 0xB0C4, 0xB0C5, 0x0576, 0xB0C6, 0xB0C6, 0x2801,\n    0xB0C7, 0xB0C9, 0x0578, 0xB0CA, 0xB0CF, 0x2802, 0xB0D0, 0xB0D1, 0x057B,\n    0xB0D2, 0xB0D3, 0x2808, 0xB0D4, 0xB0D4, 0x057D, 0xB0D5, 0xB0D7, 0x280A,\n    0xB0D8, 0xB0D8, 0x057E, 0xB0D9, 0xB0DF, 0x280D, 0xB0E0, 0xB0E0, 0x057F,\n    0xB0E1, 0xB0E4, 0x2814, 0xB0E5, 0xB0E5, 0x0580, 0xB0E6, 0xB0FF, 0x2818,\n    0xB100, 0xB107, 0x2832, 0xB108, 0xB109, 0x0581, 0xB10A, 0xB10A, 0x283A,\n    0xB10B, 0xB10C, 0x0583, 0xB10D, 0xB10F, 0x283B, 0xB110, 0xB110, 0x0585,\n    0xB111, 0xB111, 0x283E, 0xB112, 0xB113, 0x0586, 0xB114, 0xB117, 0x283F,\n    0xB118, 0xB119, 0x0588, 0xB11A, 0xB11A, 0x2843, 0xB11B, 0xB11D, 0x058A,\n    0xB11E, 0xB122, 0x2844, 0xB123, 0xB125, 0x058D, 0xB126, 0xB127, 0x2849,\n    0xB128, 0xB128, 0x0590, 0xB129, 0xB12B, 0x284B, 0xB12C, 0xB12C, 0x0591,\n    0xB12D, 0xB133, 0x284E, 0xB134, 0xB135, 0x0592, 0xB136, 0xB136, 0x2855,\n    0xB137, 0xB139, 0x0594, 0xB13A, 0xB13F, 0x2856, 0xB140, 0xB141, 0x0597,\n    0xB142, 0xB143, 0x285C, 0xB144, 0xB144, 0x0599, 0xB145, 0xB147, 0x285E,\n    0xB148, 0xB148, 0x059A, 0xB149, 0xB14F, 0x2861, 0xB150, 0xB151, 0x059B,\n    0xB152, 0xB153, 0x2868, 0xB154, 0xB155, 0x059D, 0xB156, 0xB157, 0x286A,\n    0xB158, 0xB158, 0x059F, 0xB159, 0xB15B, 0x286C, 0xB15C, 0xB15C, 0x05A0,\n    0xB15D, 0xB15F, 0x286F, 0xB160, 0xB160, 0x05A1, 0xB161, 0xB177, 0x2872,\n    0xB178, 0xB179, 0x05A2, 0xB17A, 0xB17B, 0x2889, 0xB17C, 0xB17C, 0x05A4,\n    0xB17D, 0xB17F, 0x288B, 0xB180, 0xB180, 0x05A5, 0xB181, 0xB181, 0x288E,\n    0xB182, 0xB182, 0x05A6, 0xB183, 0xB187, 0x288F, 0xB188, 0xB189, 0x05A7,\n    0xB18A, 0xB18A, 0x2894, 0xB18B, 0xB18B, 0x05A9, 0xB18C, 0xB18C, 0x2895,\n    0xB18D, 0xB18D, 0x05AA, 0xB18E, 0xB191, 0x2896, 0xB192, 0xB194, 0x05AB,\n    0xB195, 0xB197, 0x289A, 0xB198, 0xB198, 0x05AE, 0xB199, 0xB19B, 0x289D,\n    0xB19C, 0xB19C, 0x05AF, 0xB19D, 0xB1A7, 0x28A0, 0xB1A8, 0xB1A8, 0x05B0,\n    0xB1A9, 0xB1CB, 0x28AB, 0xB1CC, 0xB1CC, 0x05B1, 0xB1CD, 0xB1CF, 0x28CE,\n    0xB1D0, 0xB1D0, 0x05B2, 0xB1D1, 0xB1D3, 0x28D1, 0xB1D4, 0xB1D4, 0x05B3,\n    0xB1D5, 0xB1DB, 0x28D4, 0xB1DC, 0xB1DD, 0x05B4, 0xB1DE, 0xB1DE, 0x28DB,\n    0xB1DF, 0xB1DF, 0x05B6, 0xB1E0, 0xB1E7, 0x28DC, 0xB1E8, 0xB1E9, 0x05B7,\n    0xB1EA, 0xB1EB, 0x28E4, 0xB1EC, 0xB1EC, 0x05B9, 0xB1ED, 0xB1EF, 0x28E6,\n    0xB1F0, 0xB1F0, 0x05BA, 0xB1F1, 0xB1F8, 0x28E9, 0xB1F9, 0xB1F9, 0x05BB,\n    0xB1FA, 0xB1FA, 0x28F1, 0xB1FB, 0xB1FB, 0x05BC, 0xB1FC, 0xB1FC, 0x28F2,\n    0xB1FD, 0xB1FD, 0x05BD, 0xB1FE, 0xB1FF, 0x28F3, 0xB200, 0xB203, 0x28F5,\n    0xB204, 0xB205, 0x05BE, 0xB206, 0xB207, 0x28F9, 0xB208, 0xB208, 0x05C0,\n    0xB209, 0xB20A, 0x28FB, 0xB20B, 0xB20C, 0x05C1, 0xB20D, 0xB213, 0x28FD,\n    0xB214, 0xB215, 0x05C3, 0xB216, 0xB216, 0x2904, 0xB217, 0xB217, 0x05C5,\n    0xB218, 0xB218, 0x2905, 0xB219, 0xB219, 0x05C6, 0xB21A, 0xB21F, 0x2906,\n    0xB220, 0xB220, 0x05C7, 0xB221, 0xB233, 0x290C, 0xB234, 0xB234, 0x05C8,\n    0xB235, 0xB23B, 0x291F, 0xB23C, 0xB23C, 0x05C9, 0xB23D, 0xB257, 0x2926,\n    0xB258, 0xB258, 0x05CA, 0xB259, 0xB25B, 0x2941, 0xB25C, 0xB25C, 0x05CB,\n    0xB25D, 0xB25F, 0x2944, 0xB260, 0xB260, 0x05CC, 0xB261, 0xB267, 0x2947,\n    0xB268, 0xB269, 0x05CD, 0xB26A, 0xB273, 0x294E, 0xB274, 0xB275, 0x05CF,\n    0xB276, 0xB27B, 0x2958, 0xB27C, 0xB27C, 0x05D1, 0xB27D, 0xB283, 0x295E,\n    0xB284, 0xB285, 0x05D2, 0xB286, 0xB288, 0x2965, 0xB289, 0xB289, 0x05D4,\n    0xB28A, 0xB28F, 0x2968, 0xB290, 0xB291, 0x05D5, 0xB292, 0xB293, 0x296E,\n    0xB294, 0xB294, 0x05D7, 0xB295, 0xB297, 0x2970, 0xB298, 0xB29A, 0x05D8,\n    0xB29B, 0xB29F, 0x2973, 0xB2A0, 0xB2A1, 0x05DB, 0xB2A2, 0xB2A2, 0x2978,\n    0xB2A3, 0xB2A3, 0x05DD, 0xB2A4, 0xB2A4, 0x2979, 0xB2A5, 0xB2A6, 0x05DE,\n    0xB2A7, 0xB2A9, 0x297A, 0xB2AA, 0xB2AA, 0x05E0, 0xB2AB, 0xB2AB, 0x297D,\n    0xB2AC, 0xB2AC, 0x05E1, 0xB2AD, 0xB2AF, 0x297E, 0xB2B0, 0xB2B0, 0x05E2,\n    0xB2B1, 0xB2B3, 0x2981, 0xB2B4, 0xB2B4, 0x05E3, 0xB2B5, 0xB2C7, 0x2984,\n    0xB2C8, 0xB2C9, 0x05E4, 0xB2CA, 0xB2CB, 0x2997, 0xB2CC, 0xB2CC, 0x05E6,\n    0xB2CD, 0xB2CF, 0x2999, 0xB2D0, 0xB2D0, 0x05E7, 0xB2D1, 0xB2D1, 0x299C,\n    0xB2D2, 0xB2D2, 0x05E8, 0xB2D3, 0xB2D7, 0x299D, 0xB2D8, 0xB2D9, 0x05E9,\n    0xB2DA, 0xB2DA, 0x29A2, 0xB2DB, 0xB2DB, 0x05EB, 0xB2DC, 0xB2DC, 0x29A3,\n    0xB2DD, 0xB2DD, 0x05EC, 0xB2DE, 0xB2E1, 0x29A4, 0xB2E2, 0xB2E2, 0x05ED,\n    0xB2E3, 0xB2E3, 0x29A8, 0xB2E4, 0xB2E6, 0x05EE, 0xB2E7, 0xB2E7, 0x29A9,\n    0xB2E8, 0xB2E8, 0x05F1, 0xB2E9, 0xB2EA, 0x29AA, 0xB2EB, 0xB2EF, 0x05F2,\n    0xB2F0, 0xB2F2, 0x29AC, 0xB2F3, 0xB2F5, 0x05F7, 0xB2F6, 0xB2F6, 0x29AF,\n    0xB2F7, 0xB2FB, 0x05FA, 0xB2FC, 0xB2FE, 0x29B0, 0xB2FF, 0xB2FF, 0x05FF,\n    0xB300, 0xB301, 0x0600, 0xB302, 0xB303, 0x29B3, 0xB304, 0xB304, 0x0602,\n    0xB305, 0xB307, 0x29B5, 0xB308, 0xB308, 0x0603, 0xB309, 0xB30F, 0x29B8,\n    0xB310, 0xB311, 0x0604, 0xB312, 0xB312, 0x29BF, 0xB313, 0xB315, 0x0606,\n    0xB316, 0xB31B, 0x29C0, 0xB31C, 0xB31C, 0x0609, 0xB31D, 0xB353, 0x29C6,\n    0xB354, 0xB356, 0x060A, 0xB357, 0xB357, 0x29FD, 0xB358, 0xB358, 0x060D,\n    0xB359, 0xB35A, 0x29FE, 0xB35B, 0xB35C, 0x060E, 0xB35D, 0xB35D, 0x2A00,\n    0xB35E, 0xB35F, 0x0610, 0xB360, 0xB363, 0x2A01, 0xB364, 0xB365, 0x0612,\n    0xB366, 0xB366, 0x2A05, 0xB367, 0xB367, 0x0614, 0xB368, 0xB368, 0x2A06,\n    0xB369, 0xB369, 0x0615, 0xB36A, 0xB36A, 0x2A07, 0xB36B, 0xB36B, 0x0616,\n    0xB36C, 0xB36D, 0x2A08, 0xB36E, 0xB36E, 0x0617, 0xB36F, 0xB36F, 0x2A0A,\n    0xB370, 0xB371, 0x0618, 0xB372, 0xB373, 0x2A0B, 0xB374, 0xB374, 0x061A,\n    0xB375, 0xB377, 0x2A0D, 0xB378, 0xB378, 0x061B, 0xB379, 0xB37F, 0x2A10,\n    0xB380, 0xB381, 0x061C, 0xB382, 0xB382, 0x2A17, 0xB383, 0xB385, 0x061E,\n    0xB386, 0xB38B, 0x2A18, 0xB38C, 0xB38C, 0x0621, 0xB38D, 0xB38F, 0x2A1E,\n    0xB390, 0xB390, 0x0622, 0xB391, 0xB393, 0x2A21, 0xB394, 0xB394, 0x0623,\n    0xB395, 0xB39F, 0x2A24, 0xB3A0, 0xB3A1, 0x0624, 0xB3A2, 0xB3A7, 0x2A2F,\n    0xB3A8, 0xB3A8, 0x0626, 0xB3A9, 0xB3AB, 0x2A35, 0xB3AC, 0xB3AC, 0x0627,\n    0xB3AD, 0xB3C3, 0x2A38, 0xB3C4, 0xB3C5, 0x0628, 0xB3C6, 0xB3C7, 0x2A4F,\n    0xB3C8, 0xB3C8, 0x062A, 0xB3C9, 0xB3CA, 0x2A51, 0xB3CB, 0xB3CC, 0x062B,\n    0xB3CD, 0xB3CD, 0x2A53, 0xB3CE, 0xB3CE, 0x062D, 0xB3CF, 0xB3CF, 0x2A54,\n    0xB3D0, 0xB3D0, 0x062E, 0xB3D1, 0xB3D3, 0x2A55, 0xB3D4, 0xB3D5, 0x062F,\n    0xB3D6, 0xB3D6, 0x2A58, 0xB3D7, 0xB3D7, 0x0631, 0xB3D8, 0xB3D8, 0x2A59,\n    0xB3D9, 0xB3D9, 0x0632, 0xB3DA, 0xB3DA, 0x2A5A, 0xB3DB, 0xB3DB, 0x0633,\n    0xB3DC, 0xB3DC, 0x2A5B, 0xB3DD, 0xB3DD, 0x0634, 0xB3DE, 0xB3DF, 0x2A5C,\n    0xB3E0, 0xB3E0, 0x0635, 0xB3E1, 0xB3E3, 0x2A5E, 0xB3E4, 0xB3E4, 0x0636,\n    0xB3E5, 0xB3E7, 0x2A61, 0xB3E8, 0xB3E8, 0x0637, 0xB3E9, 0xB3FB, 0x2A64,\n    0xB3FC, 0xB3FC, 0x0638, 0xB3FD, 0xB3FF, 0x2A77, 0xB400, 0xB40F, 0x2A7A,\n    0xB410, 0xB410, 0x0639, 0xB411, 0xB417, 0x2A8A, 0xB418, 0xB418, 0x063A,\n    0xB419, 0xB41B, 0x2A91, 0xB41C, 0xB41C, 0x063B, 0xB41D, 0xB41F, 0x2A94,\n    0xB420, 0xB420, 0x063C, 0xB421, 0xB427, 0x2A97, 0xB428, 0xB429, 0x063D,\n    0xB42A, 0xB42A, 0x2A9E, 0xB42B, 0xB42B, 0x063F, 0xB42C, 0xB433, 0x2A9F,\n    0xB434, 0xB434, 0x0640, 0xB435, 0xB44F, 0x2AA7, 0xB450, 0xB451, 0x0641,\n    0xB452, 0xB453, 0x2AC2, 0xB454, 0xB454, 0x0643, 0xB455, 0xB457, 0x2AC4,\n    0xB458, 0xB458, 0x0644, 0xB459, 0xB45F, 0x2AC7, 0xB460, 0xB461, 0x0645,\n    0xB462, 0xB462, 0x2ACE, 0xB463, 0xB463, 0x0647, 0xB464, 0xB464, 0x2ACF,\n    0xB465, 0xB465, 0x0648, 0xB466, 0xB46B, 0x2AD0, 0xB46C, 0xB46C, 0x0649,\n    0xB46D, 0xB47F, 0x2AD6, 0xB480, 0xB480, 0x064A, 0xB481, 0xB487, 0x2AE9,\n    0xB488, 0xB488, 0x064B, 0xB489, 0xB49C, 0x2AF0, 0xB49D, 0xB49D, 0x064C,\n    0xB49E, 0xB4A3, 0x2B04, 0xB4A4, 0xB4A4, 0x064D, 0xB4A5, 0xB4A7, 0x2B0A,\n    0xB4A8, 0xB4A8, 0x064E, 0xB4A9, 0xB4AB, 0x2B0D, 0xB4AC, 0xB4AC, 0x064F,\n    0xB4AD, 0xB4B4, 0x2B10, 0xB4B5, 0xB4B5, 0x0650, 0xB4B6, 0xB4B6, 0x2B18,\n    0xB4B7, 0xB4B7, 0x0651, 0xB4B8, 0xB4B8, 0x2B19, 0xB4B9, 0xB4B9, 0x0652,\n    0xB4BA, 0xB4BF, 0x2B1A, 0xB4C0, 0xB4C0, 0x0653, 0xB4C1, 0xB4C3, 0x2B20,\n    0xB4C4, 0xB4C4, 0x0654, 0xB4C5, 0xB4C7, 0x2B23, 0xB4C8, 0xB4C8, 0x0655,\n    0xB4C9, 0xB4CF, 0x2B26, 0xB4D0, 0xB4D0, 0x0656, 0xB4D1, 0xB4D4, 0x2B2D,\n    0xB4D5, 0xB4D5, 0x0657, 0xB4D6, 0xB4DB, 0x2B31, 0xB4DC, 0xB4DD, 0x0658,\n    0xB4DE, 0xB4DF, 0x2B37, 0xB4E0, 0xB4E0, 0x065A, 0xB4E1, 0xB4E2, 0x2B39,\n    0xB4E3, 0xB4E4, 0x065B, 0xB4E5, 0xB4E5, 0x2B3B, 0xB4E6, 0xB4E6, 0x065D,\n    0xB4E7, 0xB4EB, 0x2B3C, 0xB4EC, 0xB4ED, 0x065E, 0xB4EE, 0xB4EE, 0x2B41,\n    0xB4EF, 0xB4EF, 0x0660, 0xB4F0, 0xB4F0, 0x2B42, 0xB4F1, 0xB4F1, 0x0661,\n    0xB4F2, 0xB4F7, 0x2B43, 0xB4F8, 0xB4F8, 0x0662, 0xB4F9, 0xB4FF, 0x2B49,\n    0xB500, 0xB513, 0x2B50, 0xB514, 0xB515, 0x0663, 0xB516, 0xB517, 0x2B64,\n    0xB518, 0xB518, 0x0665, 0xB519, 0xB51A, 0x2B66, 0xB51B, 0xB51C, 0x0666,\n    0xB51D, 0xB523, 0x2B68, 0xB524, 0xB525, 0x0668, 0xB526, 0xB526, 0x2B6F,\n    0xB527, 0xB52A, 0x066A, 0xB52B, 0xB52F, 0x2B70, 0xB530, 0xB531, 0x066E,\n    0xB532, 0xB533, 0x2B75, 0xB534, 0xB534, 0x0670, 0xB535, 0xB537, 0x2B77,\n    0xB538, 0xB538, 0x0671, 0xB539, 0xB53F, 0x2B7A, 0xB540, 0xB541, 0x0672,\n    0xB542, 0xB542, 0x2B81, 0xB543, 0xB545, 0x0674, 0xB546, 0xB54A, 0x2B82,\n    0xB54B, 0xB54D, 0x0677, 0xB54E, 0xB54F, 0x2B87, 0xB550, 0xB550, 0x067A,\n    0xB551, 0xB553, 0x2B89, 0xB554, 0xB554, 0x067B, 0xB555, 0xB55B, 0x2B8C,\n    0xB55C, 0xB55D, 0x067C, 0xB55E, 0xB55E, 0x2B93, 0xB55F, 0xB561, 0x067E,\n    0xB562, 0xB59F, 0x2B94, 0xB5A0, 0xB5A1, 0x0681, 0xB5A2, 0xB5A3, 0x2BD2,\n    0xB5A4, 0xB5A4, 0x0683, 0xB5A5, 0xB5A7, 0x2BD4, 0xB5A8, 0xB5A8, 0x0684,\n    0xB5A9, 0xB5A9, 0x2BD7, 0xB5AA, 0xB5AB, 0x0685, 0xB5AC, 0xB5AF, 0x2BD8,\n    0xB5B0, 0xB5B1, 0x0687, 0xB5B2, 0xB5B2, 0x2BDC, 0xB5B3, 0xB5B5, 0x0689,\n    0xB5B6, 0xB5BA, 0x2BDD, 0xB5BB, 0xB5BD, 0x068C, 0xB5BE, 0xB5BF, 0x2BE2,\n    0xB5C0, 0xB5C0, 0x068F, 0xB5C1, 0xB5C3, 0x2BE4, 0xB5C4, 0xB5C4, 0x0690,\n    0xB5C5, 0xB5CB, 0x2BE7, 0xB5CC, 0xB5CD, 0x0691, 0xB5CE, 0xB5CE, 0x2BEE,\n    0xB5CF, 0xB5D1, 0x0693, 0xB5D2, 0xB5D7, 0x2BEF, 0xB5D8, 0xB5D8, 0x0696,\n    0xB5D9, 0xB5EB, 0x2BF5, 0xB5EC, 0xB5EC, 0x0697, 0xB5ED, 0xB5FF, 0x2C08,\n    0xB600, 0xB60F, 0x2C1B, 0xB610, 0xB611, 0x0698, 0xB612, 0xB613, 0x2C2B,\n    0xB614, 0xB614, 0x069A, 0xB615, 0xB617, 0x2C2D, 0xB618, 0xB618, 0x069B,\n    0xB619, 0xB624, 0x2C30, 0xB625, 0xB625, 0x069C, 0xB626, 0xB62B, 0x2C3C,\n    0xB62C, 0xB62C, 0x069D, 0xB62D, 0xB633, 0x2C42, 0xB634, 0xB634, 0x069E,\n    0xB635, 0xB647, 0x2C49, 0xB648, 0xB648, 0x069F, 0xB649, 0xB663, 0x2C5C,\n    0xB664, 0xB664, 0x06A0, 0xB665, 0xB667, 0x2C77, 0xB668, 0xB668, 0x06A1,\n    0xB669, 0xB69B, 0x2C7A, 0xB69C, 0xB69D, 0x06A2, 0xB69E, 0xB69F, 0x2CAD,\n    0xB6A0, 0xB6A0, 0x06A4, 0xB6A1, 0xB6A3, 0x2CAF, 0xB6A4, 0xB6A4, 0x06A5,\n    0xB6A5, 0xB6AA, 0x2CB2, 0xB6AB, 0xB6AC, 0x06A6, 0xB6AD, 0xB6B0, 0x2CB8,\n    0xB6B1, 0xB6B1, 0x06A8, 0xB6B2, 0xB6D3, 0x2CBC, 0xB6D4, 0xB6D4, 0x06A9,\n    0xB6D5, 0xB6EF, 0x2CDE, 0xB6F0, 0xB6F0, 0x06AA, 0xB6F1, 0xB6F3, 0x2CF9,\n    0xB6F4, 0xB6F4, 0x06AB, 0xB6F5, 0xB6F7, 0x2CFC, 0xB6F8, 0xB6F8, 0x06AC,\n    0xB6F9, 0xB6FF, 0x2CFF, 0xB700, 0xB701, 0x06AD, 0xB702, 0xB704, 0x2D06,\n    0xB705, 0xB705, 0x06AF, 0xB706, 0xB727, 0x2D09, 0xB728, 0xB729, 0x06B0,\n    0xB72A, 0xB72B, 0x2D2B, 0xB72C, 0xB72C, 0x06B2, 0xB72D, 0xB72E, 0x2D2D,\n    0xB72F, 0xB730, 0x06B3, 0xB731, 0xB737, 0x2D2F, 0xB738, 0xB739, 0x06B5,\n    0xB73A, 0xB73A, 0x2D36, 0xB73B, 0xB73B, 0x06B7, 0xB73C, 0xB743, 0x2D37,\n    0xB744, 0xB744, 0x06B8, 0xB745, 0xB747, 0x2D3F, 0xB748, 0xB748, 0x06B9,\n    0xB749, 0xB74B, 0x2D42, 0xB74C, 0xB74C, 0x06BA, 0xB74D, 0xB753, 0x2D45,\n    0xB754, 0xB755, 0x06BB, 0xB756, 0xB75F, 0x2D4C, 0xB760, 0xB760, 0x06BD,\n    0xB761, 0xB763, 0x2D56, 0xB764, 0xB764, 0x06BE, 0xB765, 0xB767, 0x2D59,\n    0xB768, 0xB768, 0x06BF, 0xB769, 0xB76F, 0x2D5C, 0xB770, 0xB771, 0x06C0,\n    0xB772, 0xB772, 0x2D63, 0xB773, 0xB773, 0x06C2, 0xB774, 0xB774, 0x2D64,\n    0xB775, 0xB775, 0x06C3, 0xB776, 0xB77B, 0x2D65, 0xB77C, 0xB77D, 0x06C4,\n    0xB77E, 0xB77F, 0x2D6B, 0xB780, 0xB780, 0x06C6, 0xB781, 0xB783, 0x2D6D,\n    0xB784, 0xB784, 0x06C7, 0xB785, 0xB78B, 0x2D70, 0xB78C, 0xB78D, 0x06C8,\n    0xB78E, 0xB78E, 0x2D77, 0xB78F, 0xB792, 0x06CA, 0xB793, 0xB795, 0x2D78,\n    0xB796, 0xB799, 0x06CE, 0xB79A, 0xB79B, 0x2D7B, 0xB79C, 0xB79C, 0x06D2,\n    0xB79D, 0xB79F, 0x2D7D, 0xB7A0, 0xB7A0, 0x06D3, 0xB7A1, 0xB7A7, 0x2D80,\n    0xB7A8, 0xB7A9, 0x06D4, 0xB7AA, 0xB7AA, 0x2D87, 0xB7AB, 0xB7AD, 0x06D6,\n    0xB7AE, 0xB7B3, 0x2D88, 0xB7B4, 0xB7B5, 0x06D9, 0xB7B6, 0xB7B7, 0x2D8E,\n    0xB7B8, 0xB7B8, 0x06DB, 0xB7B9, 0xB7C6, 0x2D90, 0xB7C7, 0xB7C7, 0x06DC,\n    0xB7C8, 0xB7C8, 0x2D9E, 0xB7C9, 0xB7C9, 0x06DD, 0xB7CA, 0xB7EB, 0x2D9F,\n    0xB7EC, 0xB7ED, 0x06DE, 0xB7EE, 0xB7EF, 0x2DC1, 0xB7F0, 0xB7F0, 0x06E0,\n    0xB7F1, 0xB7F3, 0x2DC3, 0xB7F4, 0xB7F4, 0x06E1, 0xB7F5, 0xB7FB, 0x2DC6,\n    0xB7FC, 0xB7FD, 0x06E2, 0xB7FE, 0xB7FE, 0x2DCD, 0xB7FF, 0xB7FF, 0x06E4,\n    0xB800, 0xB801, 0x06E5, 0xB802, 0xB806, 0x2DCE, 0xB807, 0xB809, 0x06E7,\n    0xB80A, 0xB80B, 0x2DD3, 0xB80C, 0xB80C, 0x06EA, 0xB80D, 0xB80F, 0x2DD5,\n    0xB810, 0xB810, 0x06EB, 0xB811, 0xB817, 0x2DD8, 0xB818, 0xB819, 0x06EC,\n    0xB81A, 0xB81A, 0x2DDF, 0xB81B, 0xB81B, 0x06EE, 0xB81C, 0xB81C, 0x2DE0,\n    0xB81D, 0xB81D, 0x06EF, 0xB81E, 0xB823, 0x2DE1, 0xB824, 0xB825, 0x06F0,\n    0xB826, 0xB827, 0x2DE7, 0xB828, 0xB828, 0x06F2, 0xB829, 0xB82B, 0x2DE9,\n    0xB82C, 0xB82C, 0x06F3, 0xB82D, 0xB833, 0x2DEC, 0xB834, 0xB835, 0x06F4,\n    0xB836, 0xB836, 0x2DF3, 0xB837, 0xB839, 0x06F6, 0xB83A, 0xB83F, 0x2DF4,\n    0xB840, 0xB840, 0x06F9, 0xB841, 0xB843, 0x2DFA, 0xB844, 0xB844, 0x06FA,\n    0xB845, 0xB850, 0x2DFD, 0xB851, 0xB851, 0x06FB, 0xB852, 0xB852, 0x2E09,\n    0xB853, 0xB853, 0x06FC, 0xB854, 0xB85B, 0x2E0A, 0xB85C, 0xB85D, 0x06FD,\n    0xB85E, 0xB85F, 0x2E12, 0xB860, 0xB860, 0x06FF, 0xB861, 0xB863, 0x2E14,\n    0xB864, 0xB864, 0x0700, 0xB865, 0xB86B, 0x2E17, 0xB86C, 0xB86D, 0x0701,\n    0xB86E, 0xB86E, 0x2E1E, 0xB86F, 0xB86F, 0x0703, 0xB870, 0xB870, 0x2E1F,\n    0xB871, 0xB871, 0x0704, 0xB872, 0xB877, 0x2E20, 0xB878, 0xB878, 0x0705,\n    0xB879, 0xB87B, 0x2E26, 0xB87C, 0xB87C, 0x0706, 0xB87D, 0xB88C, 0x2E29,\n    0xB88D, 0xB88D, 0x0707, 0xB88E, 0xB8A7, 0x2E39, 0xB8A8, 0xB8A8, 0x0708,\n    0xB8A9, 0xB8AF, 0x2E53, 0xB8B0, 0xB8B0, 0x0709, 0xB8B1, 0xB8B3, 0x2E5A,\n    0xB8B4, 0xB8B4, 0x070A, 0xB8B5, 0xB8B7, 0x2E5D, 0xB8B8, 0xB8B8, 0x070B,\n    0xB8B9, 0xB8BF, 0x2E60, 0xB8C0, 0xB8C1, 0x070C, 0xB8C2, 0xB8C2, 0x2E67,\n    0xB8C3, 0xB8C3, 0x070E, 0xB8C4, 0xB8C4, 0x2E68, 0xB8C5, 0xB8C5, 0x070F,\n    0xB8C6, 0xB8CB, 0x2E69, 0xB8CC, 0xB8CC, 0x0710, 0xB8CD, 0xB8CF, 0x2E6F,\n    0xB8D0, 0xB8D0, 0x0711, 0xB8D1, 0xB8D3, 0x2E72, 0xB8D4, 0xB8D4, 0x0712,\n    0xB8D5, 0xB8DC, 0x2E75, 0xB8DD, 0xB8DD, 0x0713, 0xB8DE, 0xB8DE, 0x2E7D,\n    0xB8DF, 0xB8DF, 0x0714, 0xB8E0, 0xB8E0, 0x2E7E, 0xB8E1, 0xB8E1, 0x0715,\n    0xB8E2, 0xB8E7, 0x2E7F, 0xB8E8, 0xB8E9, 0x0716, 0xB8EA, 0xB8EB, 0x2E85,\n    0xB8EC, 0xB8EC, 0x0718, 0xB8ED, 0xB8EF, 0x2E87, 0xB8F0, 0xB8F0, 0x0719,\n    0xB8F1, 0xB8F7, 0x2E8A, 0xB8F8, 0xB8F9, 0x071A, 0xB8FA, 0xB8FA, 0x2E91,\n    0xB8FB, 0xB8FB, 0x071C, 0xB8FC, 0xB8FC, 0x2E92, 0xB8FD, 0xB8FD, 0x071D,\n    0xB8FE, 0xB8FF, 0x2E93, 0xB900, 0xB903, 0x2E95, 0xB904, 0xB904, 0x071E,\n    0xB905, 0xB917, 0x2E99, 0xB918, 0xB918, 0x071F, 0xB919, 0xB91F, 0x2EAC,\n    0xB920, 0xB920, 0x0720, 0xB921, 0xB93B, 0x2EB3, 0xB93C, 0xB93D, 0x0721,\n    0xB93E, 0xB93F, 0x2ECE, 0xB940, 0xB940, 0x0723, 0xB941, 0xB943, 0x2ED0,\n    0xB944, 0xB944, 0x0724, 0xB945, 0xB94B, 0x2ED3, 0xB94C, 0xB94C, 0x0725,\n    0xB94D, 0xB94E, 0x2EDA, 0xB94F, 0xB94F, 0x0726, 0xB950, 0xB950, 0x2EDC,\n    0xB951, 0xB951, 0x0727, 0xB952, 0xB957, 0x2EDD, 0xB958, 0xB959, 0x0728,\n    0xB95A, 0xB95B, 0x2EE3, 0xB95C, 0xB95C, 0x072A, 0xB95D, 0xB95F, 0x2EE5,\n    0xB960, 0xB960, 0x072B, 0xB961, 0xB967, 0x2EE8, 0xB968, 0xB969, 0x072C,\n    0xB96A, 0xB96A, 0x2EEF, 0xB96B, 0xB96B, 0x072E, 0xB96C, 0xB96C, 0x2EF0,\n    0xB96D, 0xB96D, 0x072F, 0xB96E, 0xB973, 0x2EF1, 0xB974, 0xB975, 0x0730,\n    0xB976, 0xB977, 0x2EF7, 0xB978, 0xB978, 0x0732, 0xB979, 0xB97B, 0x2EF9,\n    0xB97C, 0xB97C, 0x0733, 0xB97D, 0xB983, 0x2EFC, 0xB984, 0xB985, 0x0734,\n    0xB986, 0xB986, 0x2F03, 0xB987, 0xB987, 0x0736, 0xB988, 0xB988, 0x2F04,\n    0xB989, 0xB98A, 0x0737, 0xB98B, 0xB98C, 0x2F05, 0xB98D, 0xB98E, 0x0739,\n    0xB98F, 0xB9AB, 0x2F07, 0xB9AC, 0xB9AD, 0x073B, 0xB9AE, 0xB9AF, 0x2F24,\n    0xB9B0, 0xB9B0, 0x073D, 0xB9B1, 0xB9B3, 0x2F26, 0xB9B4, 0xB9B4, 0x073E,\n    0xB9B5, 0xB9BB, 0x2F29, 0xB9BC, 0xB9BD, 0x073F, 0xB9BE, 0xB9BE, 0x2F30,\n    0xB9BF, 0xB9BF, 0x0741, 0xB9C0, 0xB9C0, 0x2F31, 0xB9C1, 0xB9C1, 0x0742,\n    0xB9C2, 0xB9C7, 0x2F32, 0xB9C8, 0xB9C9, 0x0743, 0xB9CA, 0xB9CB, 0x2F38,\n    0xB9CC, 0xB9CC, 0x0745, 0xB9CD, 0xB9CD, 0x2F3A, 0xB9CE, 0xB9D2, 0x0746,\n    0xB9D3, 0xB9D7, 0x2F3B, 0xB9D8, 0xB9D9, 0x074B, 0xB9DA, 0xB9DA, 0x2F40,\n    0xB9DB, 0xB9DB, 0x074D, 0xB9DC, 0xB9DC, 0x2F41, 0xB9DD, 0xB9DE, 0x074E,\n    0xB9DF, 0xB9E0, 0x2F42, 0xB9E1, 0xB9E1, 0x0750, 0xB9E2, 0xB9E2, 0x2F44,\n    0xB9E3, 0xB9E5, 0x0751, 0xB9E6, 0xB9E7, 0x2F45, 0xB9E8, 0xB9E8, 0x0754,\n    0xB9E9, 0xB9EB, 0x2F47, 0xB9EC, 0xB9EC, 0x0755, 0xB9ED, 0xB9F3, 0x2F4A,\n    0xB9F4, 0xB9F5, 0x0756, 0xB9F6, 0xB9F6, 0x2F51, 0xB9F7, 0xB9FA, 0x0758,\n    0xB9FB, 0xB9FF, 0x2F52, 0xBA00, 0xBA01, 0x075C, 0xBA02, 0xBA07, 0x2F57,\n    0xBA08, 0xBA08, 0x075E, 0xBA09, 0xBA14, 0x2F5D, 0xBA15, 0xBA15, 0x075F,\n    0xBA16, 0xBA37, 0x2F69, 0xBA38, 0xBA39, 0x0760, 0xBA3A, 0xBA3B, 0x2F8B,\n    0xBA3C, 0xBA3C, 0x0762, 0xBA3D, 0xBA3F, 0x2F8D, 0xBA40, 0xBA40, 0x0763,\n    0xBA41, 0xBA41, 0x2F90, 0xBA42, 0xBA42, 0x0764, 0xBA43, 0xBA47, 0x2F91,\n    0xBA48, 0xBA49, 0x0765, 0xBA4A, 0xBA4A, 0x2F96, 0xBA4B, 0xBA4B, 0x0767,\n    0xBA4C, 0xBA4C, 0x2F97, 0xBA4D, 0xBA4E, 0x0768, 0xBA4F, 0xBA52, 0x2F98,\n    0xBA53, 0xBA55, 0x076A, 0xBA56, 0xBA57, 0x2F9C, 0xBA58, 0xBA58, 0x076D,\n    0xBA59, 0xBA5B, 0x2F9E, 0xBA5C, 0xBA5C, 0x076E, 0xBA5D, 0xBA63, 0x2FA1,\n    0xBA64, 0xBA65, 0x076F, 0xBA66, 0xBA66, 0x2FA8, 0xBA67, 0xBA69, 0x0771,\n    0xBA6A, 0xBA6F, 0x2FA9, 0xBA70, 0xBA71, 0x0774, 0xBA72, 0xBA73, 0x2FAF,\n    0xBA74, 0xBA74, 0x0776, 0xBA75, 0xBA77, 0x2FB1, 0xBA78, 0xBA78, 0x0777,\n    0xBA79, 0xBA82, 0x2FB4, 0xBA83, 0xBA85, 0x0778, 0xBA86, 0xBA86, 0x2FBE,\n    0xBA87, 0xBA87, 0x077B, 0xBA88, 0xBA8B, 0x2FBF, 0xBA8C, 0xBA8C, 0x077C,\n    0xBA8D, 0xBAA7, 0x2FC3, 0xBAA8, 0xBAA9, 0x077D, 0xBAAA, 0xBAAA, 0x2FDE,\n    0xBAAB, 0xBAAC, 0x077F, 0xBAAD, 0xBAAF, 0x2FDF, 0xBAB0, 0xBAB0, 0x0781,\n    0xBAB1, 0xBAB1, 0x2FE2, 0xBAB2, 0xBAB2, 0x0782, 0xBAB3, 0xBAB7, 0x2FE3,\n    0xBAB8, 0xBAB9, 0x0783, 0xBABA, 0xBABA, 0x2FE8, 0xBABB, 0xBABB, 0x0785,\n    0xBABC, 0xBABC, 0x2FE9, 0xBABD, 0xBABD, 0x0786, 0xBABE, 0xBAC3, 0x2FEA,\n    0xBAC4, 0xBAC4, 0x0787, 0xBAC5, 0xBAC7, 0x2FF0, 0xBAC8, 0xBAC8, 0x0788,\n    0xBAC9, 0xBAD7, 0x2FF3, 0xBAD8, 0xBAD9, 0x0789, 0xBADA, 0xBAFB, 0x3002,\n    0xBAFC, 0xBAFC, 0x078B, 0xBAFD, 0xBAFF, 0x3024, 0xBB00, 0xBB00, 0x078C,\n    0xBB01, 0xBB03, 0x3027, 0xBB04, 0xBB04, 0x078D, 0xBB05, 0xBB0C, 0x302A,\n    0xBB0D, 0xBB0D, 0x078E, 0xBB0E, 0xBB0E, 0x3032, 0xBB0F, 0xBB0F, 0x078F,\n    0xBB10, 0xBB10, 0x3033, 0xBB11, 0xBB11, 0x0790, 0xBB12, 0xBB17, 0x3034,\n    0xBB18, 0xBB18, 0x0791, 0xBB19, 0xBB1B, 0x303A, 0xBB1C, 0xBB1C, 0x0792,\n    0xBB1D, 0xBB1F, 0x303D, 0xBB20, 0xBB20, 0x0793, 0xBB21, 0xBB28, 0x3040,\n    0xBB29, 0xBB29, 0x0794, 0xBB2A, 0xBB2A, 0x3048, 0xBB2B, 0xBB2B, 0x0795,\n    0xBB2C, 0xBB33, 0x3049, 0xBB34, 0xBB36, 0x0796, 0xBB37, 0xBB37, 0x3051,\n    0xBB38, 0xBB38, 0x0799, 0xBB39, 0xBB3A, 0x3052, 0xBB3B, 0xBB3E, 0x079A,\n    0xBB3F, 0xBB43, 0x3054, 0xBB44, 0xBB45, 0x079E, 0xBB46, 0xBB46, 0x3059,\n    0xBB47, 0xBB47, 0x07A0, 0xBB48, 0xBB48, 0x305A, 0xBB49, 0xBB49, 0x07A1,\n    0xBB4A, 0xBB4C, 0x305B, 0xBB4D, 0xBB4D, 0x07A2, 0xBB4E, 0xBB4E, 0x305E,\n    0xBB4F, 0xBB50, 0x07A3, 0xBB51, 0xBB53, 0x305F, 0xBB54, 0xBB54, 0x07A5,\n    0xBB55, 0xBB57, 0x3062, 0xBB58, 0xBB58, 0x07A6, 0xBB59, 0xBB60, 0x3065,\n    0xBB61, 0xBB61, 0x07A7, 0xBB62, 0xBB62, 0x306D, 0xBB63, 0xBB63, 0x07A8,\n    0xBB64, 0xBB6B, 0x306E, 0xBB6C, 0xBB6C, 0x07A9, 0xBB6D, 0xBB87, 0x3076,\n    0xBB88, 0xBB88, 0x07AA, 0xBB89, 0xBB8B, 0x3091, 0xBB8C, 0xBB8C, 0x07AB,\n    0xBB8D, 0xBB8F, 0x3094, 0xBB90, 0xBB90, 0x07AC, 0xBB91, 0xBBA3, 0x3097,\n    0xBBA4, 0xBBA4, 0x07AD, 0xBBA5, 0xBBA7, 0x30AA, 0xBBA8, 0xBBA8, 0x07AE,\n    0xBBA9, 0xBBAB, 0x30AD, 0xBBAC, 0xBBAC, 0x07AF, 0xBBAD, 0xBBB3, 0x30B0,\n    0xBBB4, 0xBBB4, 0x07B0, 0xBBB5, 0xBBB6, 0x30B7, 0xBBB7, 0xBBB7, 0x07B1,\n    0xBBB8, 0xBBBF, 0x30B9, 0xBBC0, 0xBBC0, 0x07B2, 0xBBC1, 0xBBC3, 0x30C1,\n    0xBBC4, 0xBBC4, 0x07B3, 0xBBC5, 0xBBC7, 0x30C4, 0xBBC8, 0xBBC8, 0x07B4,\n    0xBBC9, 0xBBCF, 0x30C7, 0xBBD0, 0xBBD0, 0x07B5, 0xBBD1, 0xBBD2, 0x30CE,\n    0xBBD3, 0xBBD3, 0x07B6, 0xBBD4, 0xBBF7, 0x30D0, 0xBBF8, 0xBBF9, 0x07B7,\n    0xBBFA, 0xBBFB, 0x30F4, 0xBBFC, 0xBBFC, 0x07B9, 0xBBFD, 0xBBFE, 0x30F6,\n    0xBBFF, 0xBBFF, 0x07BA, 0xBC00, 0xBC00, 0x07BB, 0xBC01, 0xBC01, 0x30F8,\n    0xBC02, 0xBC02, 0x07BC, 0xBC03, 0xBC07, 0x30F9, 0xBC08, 0xBC09, 0x07BD,\n    0xBC0A, 0xBC0A, 0x30FE, 0xBC0B, 0xBC0D, 0x07BF, 0xBC0E, 0xBC0E, 0x30FF,\n    0xBC0F, 0xBC0F, 0x07C2, 0xBC10, 0xBC10, 0x3100, 0xBC11, 0xBC11, 0x07C3,\n    0xBC12, 0xBC13, 0x3101, 0xBC14, 0xBC18, 0x07C4, 0xBC19, 0xBC1A, 0x3103,\n    0xBC1B, 0xBC1F, 0x07C9, 0xBC20, 0xBC23, 0x3105, 0xBC24, 0xBC25, 0x07CE,\n    0xBC26, 0xBC26, 0x3109, 0xBC27, 0xBC27, 0x07D0, 0xBC28, 0xBC28, 0x310A,\n    0xBC29, 0xBC29, 0x07D1, 0xBC2A, 0xBC2C, 0x310B, 0xBC2D, 0xBC2D, 0x07D2,\n    0xBC2E, 0xBC2F, 0x310E, 0xBC30, 0xBC31, 0x07D3, 0xBC32, 0xBC33, 0x3110,\n    0xBC34, 0xBC34, 0x07D5, 0xBC35, 0xBC37, 0x3112, 0xBC38, 0xBC38, 0x07D6,\n    0xBC39, 0xBC3F, 0x3115, 0xBC40, 0xBC41, 0x07D7, 0xBC42, 0xBC42, 0x311C,\n    0xBC43, 0xBC45, 0x07D9, 0xBC46, 0xBC48, 0x311D, 0xBC49, 0xBC49, 0x07DC,\n    0xBC4A, 0xBC4B, 0x3120, 0xBC4C, 0xBC4D, 0x07DD, 0xBC4E, 0xBC4F, 0x3122,\n    0xBC50, 0xBC50, 0x07DF, 0xBC51, 0xBC5C, 0x3124, 0xBC5D, 0xBC5D, 0x07E0,\n    0xBC5E, 0xBC83, 0x3130, 0xBC84, 0xBC85, 0x07E1, 0xBC86, 0xBC87, 0x3156,\n    0xBC88, 0xBC88, 0x07E3, 0xBC89, 0xBC8A, 0x3158, 0xBC8B, 0xBC8C, 0x07E4,\n    0xBC8D, 0xBC8D, 0x315A, 0xBC8E, 0xBC8E, 0x07E6, 0xBC8F, 0xBC93, 0x315B,\n    0xBC94, 0xBC95, 0x07E7, 0xBC96, 0xBC96, 0x3160, 0xBC97, 0xBC97, 0x07E9,\n    0xBC98, 0xBC98, 0x3161, 0xBC99, 0xBC9A, 0x07EA, 0xBC9B, 0xBC9F, 0x3162,\n    0xBCA0, 0xBCA1, 0x07EC, 0xBCA2, 0xBCA3, 0x3167, 0xBCA4, 0xBCA4, 0x07EE,\n    0xBCA5, 0xBCA6, 0x3169, 0xBCA7, 0xBCA8, 0x07EF, 0xBCA9, 0xBCAF, 0x316B,\n    0xBCB0, 0xBCB1, 0x07F1, 0xBCB2, 0xBCB2, 0x3172, 0xBCB3, 0xBCB5, 0x07F3,\n    0xBCB6, 0xBCBB, 0x3173, 0xBCBC, 0xBCBD, 0x07F6, 0xBCBE, 0xBCBF, 0x3179,\n    0xBCC0, 0xBCC0, 0x07F8, 0xBCC1, 0xBCC3, 0x317B, 0xBCC4, 0xBCC4, 0x07F9,\n    0xBCC5, 0xBCCC, 0x317E, 0xBCCD, 0xBCCD, 0x07FA, 0xBCCE, 0xBCCE, 0x3186,\n    0xBCCF, 0xBCD1, 0x07FB, 0xBCD2, 0xBCD4, 0x3187, 0xBCD5, 0xBCD5, 0x07FE,\n    0xBCD6, 0xBCD7, 0x318A, 0xBCD8, 0xBCD8, 0x07FF, 0xBCD9, 0xBCDB, 0x318C,\n    0xBCDC, 0xBCDC, 0x0800, 0xBCDD, 0xBCF3, 0x318F, 0xBCF4, 0xBCF6, 0x0801,\n    0xBCF7, 0xBCF7, 0x31A6, 0xBCF8, 0xBCF8, 0x0804, 0xBCF9, 0xBCFB, 0x31A7,\n    0xBCFC, 0xBCFC, 0x0805, 0xBCFD, 0xBCFF, 0x31AA, 0xBD00, 0xBD03, 0x31AD,\n    0xBD04, 0xBD05, 0x0806, 0xBD06, 0xBD06, 0x31B1, 0xBD07, 0xBD07, 0x0808,\n    0xBD08, 0xBD08, 0x31B2, 0xBD09, 0xBD09, 0x0809, 0xBD0A, 0xBD0F, 0x31B3,\n    0xBD10, 0xBD10, 0x080A, 0xBD11, 0xBD13, 0x31B9, 0xBD14, 0xBD14, 0x080B,\n    0xBD15, 0xBD23, 0x31BC, 0xBD24, 0xBD24, 0x080C, 0xBD25, 0xBD2B, 0x31CB,\n    0xBD2C, 0xBD2C, 0x080D, 0xBD2D, 0xBD3F, 0x31D2, 0xBD40, 0xBD40, 0x080E,\n    0xBD41, 0xBD47, 0x31E5, 0xBD48, 0xBD49, 0x080F, 0xBD4A, 0xBD4B, 0x31EC,\n    0xBD4C, 0xBD4C, 0x0811, 0xBD4D, 0xBD4F, 0x31EE, 0xBD50, 0xBD50, 0x0812,\n    0xBD51, 0xBD57, 0x31F1, 0xBD58, 0xBD59, 0x0813, 0xBD5A, 0xBD63, 0x31F8,\n    0xBD64, 0xBD64, 0x0815, 0xBD65, 0xBD67, 0x3202, 0xBD68, 0xBD68, 0x0816,\n    0xBD69, 0xBD7F, 0x3205, 0xBD80, 0xBD81, 0x0817, 0xBD82, 0xBD83, 0x321C,\n    0xBD84, 0xBD84, 0x0819, 0xBD85, 0xBD86, 0x321E, 0xBD87, 0xBD8A, 0x081A,\n    0xBD8B, 0xBD8F, 0x3220, 0xBD90, 0xBD91, 0x081E, 0xBD92, 0xBD92, 0x3225,\n    0xBD93, 0xBD93, 0x0820, 0xBD94, 0xBD94, 0x3226, 0xBD95, 0xBD95, 0x0821,\n    0xBD96, 0xBD98, 0x3227, 0xBD99, 0xBD9A, 0x0822, 0xBD9B, 0xBD9B, 0x322A,\n    0xBD9C, 0xBD9C, 0x0824, 0xBD9D, 0xBDA3, 0x322B, 0xBDA4, 0xBDA4, 0x0825,\n    0xBDA5, 0xBDAF, 0x3232, 0xBDB0, 0xBDB0, 0x0826, 0xBDB1, 0xBDB7, 0x323D,\n    0xBDB8, 0xBDB8, 0x0827, 0xBDB9, 0xBDD3, 0x3244, 0xBDD4, 0xBDD5, 0x0828,\n    0xBDD6, 0xBDD7, 0x325F, 0xBDD8, 0xBDD8, 0x082A, 0xBDD9, 0xBDDB, 0x3261,\n    0xBDDC, 0xBDDC, 0x082B, 0xBDDD, 0xBDE8, 0x3264, 0xBDE9, 0xBDE9, 0x082C,\n    0xBDEA, 0xBDEF, 0x3270, 0xBDF0, 0xBDF0, 0x082D, 0xBDF1, 0xBDF3, 0x3276,\n    0xBDF4, 0xBDF4, 0x082E, 0xBDF5, 0xBDF7, 0x3279, 0xBDF8, 0xBDF8, 0x082F,\n    0xBDF9, 0xBDFF, 0x327C, 0xBE00, 0xBE00, 0x0830, 0xBE01, 0xBE02, 0x3283,\n    0xBE03, 0xBE03, 0x0831, 0xBE04, 0xBE04, 0x3285, 0xBE05, 0xBE05, 0x0832,\n    0xBE06, 0xBE0B, 0x3286, 0xBE0C, 0xBE0D, 0x0833, 0xBE0E, 0xBE0F, 0x328C,\n    0xBE10, 0xBE10, 0x0835, 0xBE11, 0xBE13, 0x328E, 0xBE14, 0xBE14, 0x0836,\n    0xBE15, 0xBE1B, 0x3291, 0xBE1C, 0xBE1D, 0x0837, 0xBE1E, 0xBE1E, 0x3298,\n    0xBE1F, 0xBE1F, 0x0839, 0xBE20, 0xBE43, 0x3299, 0xBE44, 0xBE45, 0x083A,\n    0xBE46, 0xBE47, 0x32BD, 0xBE48, 0xBE48, 0x083C, 0xBE49, 0xBE4B, 0x32BF,\n    0xBE4C, 0xBE4C, 0x083D, 0xBE4D, 0xBE4D, 0x32C2, 0xBE4E, 0xBE4E, 0x083E,\n    0xBE4F, 0xBE53, 0x32C3, 0xBE54, 0xBE55, 0x083F, 0xBE56, 0xBE56, 0x32C8,\n    0xBE57, 0xBE57, 0x0841, 0xBE58, 0xBE58, 0x32C9, 0xBE59, 0xBE5B, 0x0842,\n    0xBE5C, 0xBE5F, 0x32CA, 0xBE60, 0xBE61, 0x0845, 0xBE62, 0xBE63, 0x32CE,\n    0xBE64, 0xBE64, 0x0847, 0xBE65, 0xBE67, 0x32D0, 0xBE68, 0xBE68, 0x0848,\n    0xBE69, 0xBE69, 0x32D3, 0xBE6A, 0xBE6A, 0x0849, 0xBE6B, 0xBE6F, 0x32D4,\n    0xBE70, 0xBE71, 0x084A, 0xBE72, 0xBE72, 0x32D9, 0xBE73, 0xBE75, 0x084C,\n    0xBE76, 0xBE7A, 0x32DA, 0xBE7B, 0xBE7D, 0x084F, 0xBE7E, 0xBE7F, 0x32DF,\n    0xBE80, 0xBE80, 0x0852, 0xBE81, 0xBE83, 0x32E1, 0xBE84, 0xBE84, 0x0853,\n    0xBE85, 0xBE8B, 0x32E4, 0xBE8C, 0xBE8D, 0x0854, 0xBE8E, 0xBE8E, 0x32EB,\n    0xBE8F, 0xBE91, 0x0856, 0xBE92, 0xBE97, 0x32EC, 0xBE98, 0xBE99, 0x0859,\n    0xBE9A, 0xBEA7, 0x32F2, 0xBEA8, 0xBEA8, 0x085B, 0xBEA9, 0xBECF, 0x3300,\n    0xBED0, 0xBED1, 0x085C, 0xBED2, 0xBED3, 0x3327, 0xBED4, 0xBED4, 0x085E,\n    0xBED5, 0xBED6, 0x3329, 0xBED7, 0xBED8, 0x085F, 0xBED9, 0xBEDF, 0x332B,\n    0xBEE0, 0xBEE0, 0x0861, 0xBEE1, 0xBEE2, 0x3332, 0xBEE3, 0xBEE5, 0x0862,\n    0xBEE6, 0xBEEB, 0x3334, 0xBEEC, 0xBEEC, 0x0865, 0xBEED, 0xBEFF, 0x333A,\n    0xBF00, 0xBF00, 0x334D, 0xBF01, 0xBF01, 0x0866, 0xBF02, 0xBF07, 0x334E,\n    0xBF08, 0xBF09, 0x0867, 0xBF0A, 0xBF17, 0x3354, 0xBF18, 0xBF19, 0x0869,\n    0xBF1A, 0xBF1A, 0x3362, 0xBF1B, 0xBF1D, 0x086B, 0xBF1E, 0xBF3F, 0x3363,\n    0xBF40, 0xBF41, 0x086E, 0xBF42, 0xBF43, 0x3385, 0xBF44, 0xBF44, 0x0870,\n    0xBF45, 0xBF47, 0x3387, 0xBF48, 0xBF48, 0x0871, 0xBF49, 0xBF4F, 0x338A,\n    0xBF50, 0xBF51, 0x0872, 0xBF52, 0xBF54, 0x3391, 0xBF55, 0xBF55, 0x0874,\n    0xBF56, 0xBF93, 0x3394, 0xBF94, 0xBF94, 0x0875, 0xBF95, 0xBFAF, 0x33D2,\n    0xBFB0, 0xBFB0, 0x0876, 0xBFB1, 0xBFC4, 0x33ED, 0xBFC5, 0xBFC5, 0x0877,\n    0xBFC6, 0xBFCB, 0x3401, 0xBFCC, 0xBFCD, 0x0878, 0xBFCE, 0xBFCF, 0x3407,\n    0xBFD0, 0xBFD0, 0x087A, 0xBFD1, 0xBFD3, 0x3409, 0xBFD4, 0xBFD4, 0x087B,\n    0xBFD5, 0xBFDB, 0x340C, 0xBFDC, 0xBFDC, 0x087C, 0xBFDD, 0xBFDE, 0x3413,\n    0xBFDF, 0xBFDF, 0x087D, 0xBFE0, 0xBFE0, 0x3415, 0xBFE1, 0xBFE1, 0x087E,\n    0xBFE2, 0xBFFF, 0x3416, 0xC000, 0xC03B, 0x3434, 0xC03C, 0xC03C, 0x087F,\n    0xC03D, 0xC050, 0x3470, 0xC051, 0xC051, 0x0880, 0xC052, 0xC057, 0x3484,\n    0xC058, 0xC058, 0x0881, 0xC059, 0xC05B, 0x348A, 0xC05C, 0xC05C, 0x0882,\n    0xC05D, 0xC05F, 0x348D, 0xC060, 0xC060, 0x0883, 0xC061, 0xC067, 0x3490,\n    0xC068, 0xC069, 0x0884, 0xC06A, 0xC08F, 0x3497, 0xC090, 0xC091, 0x0886,\n    0xC092, 0xC093, 0x34BD, 0xC094, 0xC094, 0x0888, 0xC095, 0xC097, 0x34BF,\n    0xC098, 0xC098, 0x0889, 0xC099, 0xC09F, 0x34C2, 0xC0A0, 0xC0A1, 0x088A,\n    0xC0A2, 0xC0A2, 0x34C9, 0xC0A3, 0xC0A3, 0x088C, 0xC0A4, 0xC0A4, 0x34CA,\n    0xC0A5, 0xC0A5, 0x088D, 0xC0A6, 0xC0AB, 0x34CB, 0xC0AC, 0xC0AD, 0x088E,\n    0xC0AE, 0xC0AE, 0x34D1, 0xC0AF, 0xC0B0, 0x0890, 0xC0B1, 0xC0B2, 0x34D2,\n    0xC0B3, 0xC0B6, 0x0892, 0xC0B7, 0xC0BB, 0x34D4, 0xC0BC, 0xC0BD, 0x0896,\n    0xC0BE, 0xC0BE, 0x34D9, 0xC0BF, 0xC0C1, 0x0898, 0xC0C2, 0xC0C4, 0x34DA,\n    0xC0C5, 0xC0C5, 0x089B, 0xC0C6, 0xC0C7, 0x34DD, 0xC0C8, 0xC0C9, 0x089C,\n    0xC0CA, 0xC0CB, 0x34DF, 0xC0CC, 0xC0CC, 0x089E, 0xC0CD, 0xC0CF, 0x34E1,\n    0xC0D0, 0xC0D0, 0x089F, 0xC0D1, 0xC0D7, 0x34E4, 0xC0D8, 0xC0D9, 0x08A0,\n    0xC0DA, 0xC0DA, 0x34EB, 0xC0DB, 0xC0DD, 0x08A2, 0xC0DE, 0xC0E3, 0x34EC,\n    0xC0E4, 0xC0E5, 0x08A5, 0xC0E6, 0xC0E7, 0x34F2, 0xC0E8, 0xC0E8, 0x08A7,\n    0xC0E9, 0xC0EB, 0x34F4, 0xC0EC, 0xC0EC, 0x08A8, 0xC0ED, 0xC0F3, 0x34F7,\n    0xC0F4, 0xC0F5, 0x08A9, 0xC0F6, 0xC0F6, 0x34FE, 0xC0F7, 0xC0F7, 0x08AB,\n    0xC0F8, 0xC0F8, 0x34FF, 0xC0F9, 0xC0F9, 0x08AC, 0xC0FA, 0xC0FF, 0x3500,\n    0xC100, 0xC100, 0x08AD, 0xC101, 0xC103, 0x3506, 0xC104, 0xC104, 0x08AE,\n    0xC105, 0xC107, 0x3509, 0xC108, 0xC108, 0x08AF, 0xC109, 0xC10F, 0x350C,\n    0xC110, 0xC110, 0x08B0, 0xC111, 0xC114, 0x3513, 0xC115, 0xC115, 0x08B1,\n    0xC116, 0xC11B, 0x3517, 0xC11C, 0xC120, 0x08B2, 0xC121, 0xC122, 0x351D,\n    0xC123, 0xC124, 0x08B7, 0xC125, 0xC125, 0x351F, 0xC126, 0xC127, 0x08B9,\n    0xC128, 0xC12B, 0x3520, 0xC12C, 0xC12D, 0x08BB, 0xC12E, 0xC12E, 0x3524,\n    0xC12F, 0xC131, 0x08BD, 0xC132, 0xC135, 0x3525, 0xC136, 0xC136, 0x08C0,\n    0xC137, 0xC137, 0x3529, 0xC138, 0xC139, 0x08C1, 0xC13A, 0xC13B, 0x352A,\n    0xC13C, 0xC13C, 0x08C3, 0xC13D, 0xC13F, 0x352C, 0xC140, 0xC140, 0x08C4,\n    0xC141, 0xC147, 0x352F, 0xC148, 0xC149, 0x08C5, 0xC14A, 0xC14A, 0x3536,\n    0xC14B, 0xC14D, 0x08C7, 0xC14E, 0xC153, 0x3537, 0xC154, 0xC155, 0x08CA,\n    0xC156, 0xC157, 0x353D, 0xC158, 0xC158, 0x08CC, 0xC159, 0xC15B, 0x353F,\n    0xC15C, 0xC15C, 0x08CD, 0xC15D, 0xC163, 0x3542, 0xC164, 0xC165, 0x08CE,\n    0xC166, 0xC166, 0x3549, 0xC167, 0xC169, 0x08D0, 0xC16A, 0xC16F, 0x354A,\n    0xC170, 0xC170, 0x08D3, 0xC171, 0xC173, 0x3550, 0xC174, 0xC174, 0x08D4,\n    0xC175, 0xC177, 0x3553, 0xC178, 0xC178, 0x08D5, 0xC179, 0xC184, 0x3556,\n    0xC185, 0xC185, 0x08D6, 0xC186, 0xC18B, 0x3562, 0xC18C, 0xC18E, 0x08D7,\n    0xC18F, 0xC18F, 0x3568, 0xC190, 0xC190, 0x08DA, 0xC191, 0xC193, 0x3569,\n    0xC194, 0xC194, 0x08DB, 0xC195, 0xC195, 0x356C, 0xC196, 0xC196, 0x08DC,\n    0xC197, 0xC19B, 0x356D, 0xC19C, 0xC19D, 0x08DD, 0xC19E, 0xC19E, 0x3572,\n    0xC19F, 0xC19F, 0x08DF, 0xC1A0, 0xC1A0, 0x3573, 0xC1A1, 0xC1A1, 0x08E0,\n    0xC1A2, 0xC1A4, 0x3574, 0xC1A5, 0xC1A5, 0x08E1, 0xC1A6, 0xC1A7, 0x3577,\n    0xC1A8, 0xC1A9, 0x08E2, 0xC1AA, 0xC1AB, 0x3579, 0xC1AC, 0xC1AC, 0x08E4,\n    0xC1AD, 0xC1AF, 0x357B, 0xC1B0, 0xC1B0, 0x08E5, 0xC1B1, 0xC1BC, 0x357E,\n    0xC1BD, 0xC1BD, 0x08E6, 0xC1BE, 0xC1C3, 0x358A, 0xC1C4, 0xC1C4, 0x08E7,\n    0xC1C5, 0xC1C7, 0x3590, 0xC1C8, 0xC1C8, 0x08E8, 0xC1C9, 0xC1CB, 0x3593,\n    0xC1CC, 0xC1CC, 0x08E9, 0xC1CD, 0xC1D3, 0x3596, 0xC1D4, 0xC1D4, 0x08EA,\n    0xC1D5, 0xC1D6, 0x359D, 0xC1D7, 0xC1D8, 0x08EB, 0xC1D9, 0xC1DF, 0x359F,\n    0xC1E0, 0xC1E0, 0x08ED, 0xC1E1, 0xC1E3, 0x35A6, 0xC1E4, 0xC1E4, 0x08EE,\n    0xC1E5, 0xC1E7, 0x35A9, 0xC1E8, 0xC1E8, 0x08EF, 0xC1E9, 0xC1EF, 0x35AC,\n    0xC1F0, 0xC1F1, 0x08F0, 0xC1F2, 0xC1F2, 0x35B3, 0xC1F3, 0xC1F3, 0x08F2,\n    0xC1F4, 0xC1FB, 0x35B4, 0xC1FC, 0xC1FD, 0x08F3, 0xC1FE, 0xC1FF, 0x35BC,\n    0xC200, 0xC200, 0x08F5, 0xC201, 0xC203, 0x35BE, 0xC204, 0xC204, 0x08F6,\n    0xC205, 0xC20B, 0x35C1, 0xC20C, 0xC20D, 0x08F7, 0xC20E, 0xC20E, 0x35C8,\n    0xC20F, 0xC20F, 0x08F9, 0xC210, 0xC210, 0x35C9, 0xC211, 0xC211, 0x08FA,\n    0xC212, 0xC217, 0x35CA, 0xC218, 0xC219, 0x08FB, 0xC21A, 0xC21B, 0x35D0,\n    0xC21C, 0xC21C, 0x08FD, 0xC21D, 0xC21E, 0x35D2, 0xC21F, 0xC220, 0x08FE,\n    0xC221, 0xC227, 0x35D4, 0xC228, 0xC229, 0x0900, 0xC22A, 0xC22A, 0x35DB,\n    0xC22B, 0xC22B, 0x0902, 0xC22C, 0xC22C, 0x35DC, 0xC22D, 0xC22D, 0x0903,\n    0xC22E, 0xC22E, 0x35DD, 0xC22F, 0xC22F, 0x0904, 0xC230, 0xC230, 0x35DE,\n    0xC231, 0xC232, 0x0905, 0xC233, 0xC233, 0x35DF, 0xC234, 0xC234, 0x0907,\n    0xC235, 0xC247, 0x35E0, 0xC248, 0xC248, 0x0908, 0xC249, 0xC24F, 0x35F3,\n    0xC250, 0xC251, 0x0909, 0xC252, 0xC253, 0x35FA, 0xC254, 0xC254, 0x090B,\n    0xC255, 0xC257, 0x35FC, 0xC258, 0xC258, 0x090C, 0xC259, 0xC25F, 0x35FF,\n    0xC260, 0xC260, 0x090D, 0xC261, 0xC264, 0x3606, 0xC265, 0xC265, 0x090E,\n    0xC266, 0xC26B, 0x360A, 0xC26C, 0xC26D, 0x090F, 0xC26E, 0xC26F, 0x3610,\n    0xC270, 0xC270, 0x0911, 0xC271, 0xC273, 0x3612, 0xC274, 0xC274, 0x0912,\n    0xC275, 0xC27B, 0x3615, 0xC27C, 0xC27D, 0x0913, 0xC27E, 0xC27E, 0x361C,\n    0xC27F, 0xC27F, 0x0915, 0xC280, 0xC280, 0x361D, 0xC281, 0xC281, 0x0916,\n    0xC282, 0xC287, 0x361E, 0xC288, 0xC289, 0x0917, 0xC28A, 0xC28F, 0x3624,\n    0xC290, 0xC290, 0x0919, 0xC291, 0xC297, 0x362A, 0xC298, 0xC298, 0x091A,\n    0xC299, 0xC29A, 0x3631, 0xC29B, 0xC29B, 0x091B, 0xC29C, 0xC29C, 0x3633,\n    0xC29D, 0xC29D, 0x091C, 0xC29E, 0xC2A3, 0x3634, 0xC2A4, 0xC2A5, 0x091D,\n    0xC2A6, 0xC2A7, 0x363A, 0xC2A8, 0xC2A8, 0x091F, 0xC2A9, 0xC2AB, 0x363C,\n    0xC2AC, 0xC2AD, 0x0920, 0xC2AE, 0xC2B3, 0x363F, 0xC2B4, 0xC2B5, 0x0922,\n    0xC2B6, 0xC2B6, 0x3645, 0xC2B7, 0xC2B7, 0x0924, 0xC2B8, 0xC2B8, 0x3646,\n    0xC2B9, 0xC2B9, 0x0925, 0xC2BA, 0xC2DB, 0x3647, 0xC2DC, 0xC2DD, 0x0926,\n    0xC2DE, 0xC2DF, 0x3669, 0xC2E0, 0xC2E0, 0x0928, 0xC2E1, 0xC2E2, 0x366B,\n    0xC2E3, 0xC2E4, 0x0929, 0xC2E5, 0xC2EA, 0x366D, 0xC2EB, 0xC2ED, 0x092B,\n    0xC2EE, 0xC2EE, 0x3673, 0xC2EF, 0xC2EF, 0x092E, 0xC2F0, 0xC2F0, 0x3674,\n    0xC2F1, 0xC2F1, 0x092F, 0xC2F2, 0xC2F5, 0x3675, 0xC2F6, 0xC2F6, 0x0930,\n    0xC2F7, 0xC2F7, 0x3679, 0xC2F8, 0xC2F9, 0x0931, 0xC2FA, 0xC2FA, 0x367A,\n    0xC2FB, 0xC2FC, 0x0933, 0xC2FD, 0xC2FF, 0x367B, 0xC300, 0xC300, 0x0935,\n    0xC301, 0xC307, 0x367E, 0xC308, 0xC309, 0x0936, 0xC30A, 0xC30B, 0x3685,\n    0xC30C, 0xC30D, 0x0938, 0xC30E, 0xC312, 0x3687, 0xC313, 0xC315, 0x093A,\n    0xC316, 0xC317, 0x368C, 0xC318, 0xC318, 0x093D, 0xC319, 0xC31B, 0x368E,\n    0xC31C, 0xC31C, 0x093E, 0xC31D, 0xC323, 0x3691, 0xC324, 0xC325, 0x093F,\n    0xC326, 0xC327, 0x3698, 0xC328, 0xC329, 0x0941, 0xC32A, 0xC344, 0x369A,\n    0xC345, 0xC345, 0x0943, 0xC346, 0xC367, 0x36B5, 0xC368, 0xC369, 0x0944,\n    0xC36A, 0xC36B, 0x36D7, 0xC36C, 0xC36C, 0x0946, 0xC36D, 0xC36F, 0x36D9,\n    0xC370, 0xC370, 0x0947, 0xC371, 0xC371, 0x36DC, 0xC372, 0xC372, 0x0948,\n    0xC373, 0xC377, 0x36DD, 0xC378, 0xC379, 0x0949, 0xC37A, 0xC37B, 0x36E2,\n    0xC37C, 0xC37D, 0x094B, 0xC37E, 0xC383, 0x36E4, 0xC384, 0xC384, 0x094D,\n    0xC385, 0xC387, 0x36EA, 0xC388, 0xC388, 0x094E, 0xC389, 0xC38B, 0x36ED,\n    0xC38C, 0xC38C, 0x094F, 0xC38D, 0xC3BF, 0x36F0, 0xC3C0, 0xC3C0, 0x0950,\n    0xC3C1, 0xC3D7, 0x3723, 0xC3D8, 0xC3D9, 0x0951, 0xC3DA, 0xC3DB, 0x373A,\n    0xC3DC, 0xC3DC, 0x0953, 0xC3DD, 0xC3DE, 0x373C, 0xC3DF, 0xC3E0, 0x0954,\n    0xC3E1, 0xC3E1, 0x373E, 0xC3E2, 0xC3E2, 0x0956, 0xC3E3, 0xC3E7, 0x373F,\n    0xC3E8, 0xC3E9, 0x0957, 0xC3EA, 0xC3EC, 0x3744, 0xC3ED, 0xC3ED, 0x0959,\n    0xC3EE, 0xC3F3, 0x3747, 0xC3F4, 0xC3F5, 0x095A, 0xC3F6, 0xC3F7, 0x374D,\n    0xC3F8, 0xC3F8, 0x095C, 0xC3F9, 0xC3FF, 0x374F, 0xC400, 0xC407, 0x3756,\n    0xC408, 0xC408, 0x095D, 0xC409, 0xC40F, 0x375E, 0xC410, 0xC410, 0x095E,\n    0xC411, 0xC423, 0x3765, 0xC424, 0xC424, 0x095F, 0xC425, 0xC42B, 0x3778,\n    0xC42C, 0xC42C, 0x0960, 0xC42D, 0xC42F, 0x377F, 0xC430, 0xC430, 0x0961,\n    0xC431, 0xC433, 0x3782, 0xC434, 0xC434, 0x0962, 0xC435, 0xC43B, 0x3785,\n    0xC43C, 0xC43D, 0x0963, 0xC43E, 0xC447, 0x378C, 0xC448, 0xC448, 0x0965,\n    0xC449, 0xC463, 0x3796, 0xC464, 0xC465, 0x0966, 0xC466, 0xC467, 0x37B1,\n    0xC468, 0xC468, 0x0968, 0xC469, 0xC46B, 0x37B3, 0xC46C, 0xC46C, 0x0969,\n    0xC46D, 0xC473, 0x37B6, 0xC474, 0xC475, 0x096A, 0xC476, 0xC478, 0x37BD,\n    0xC479, 0xC479, 0x096C, 0xC47A, 0xC47F, 0x37C0, 0xC480, 0xC480, 0x096D,\n    0xC481, 0xC493, 0x37C6, 0xC494, 0xC494, 0x096E, 0xC495, 0xC49B, 0x37D9,\n    0xC49C, 0xC49C, 0x096F, 0xC49D, 0xC4B7, 0x37E0, 0xC4B8, 0xC4B8, 0x0970,\n    0xC4B9, 0xC4BB, 0x37FB, 0xC4BC, 0xC4BC, 0x0971, 0xC4BD, 0xC4E8, 0x37FE,\n    0xC4E9, 0xC4E9, 0x0972, 0xC4EA, 0xC4EF, 0x382A, 0xC4F0, 0xC4F1, 0x0973,\n    0xC4F2, 0xC4F3, 0x3830, 0xC4F4, 0xC4F4, 0x0975, 0xC4F5, 0xC4F7, 0x3832,\n    0xC4F8, 0xC4F8, 0x0976, 0xC4F9, 0xC4F9, 0x3835, 0xC4FA, 0xC4FA, 0x0977,\n    0xC4FB, 0xC4FE, 0x3836, 0xC4FF, 0xC4FF, 0x0978, 0xC500, 0xC501, 0x0979,\n    0xC502, 0xC50B, 0x383A, 0xC50C, 0xC50C, 0x097B, 0xC50D, 0xC50F, 0x3844,\n    0xC510, 0xC510, 0x097C, 0xC511, 0xC513, 0x3847, 0xC514, 0xC514, 0x097D,\n    0xC515, 0xC51B, 0x384A, 0xC51C, 0xC51C, 0x097E, 0xC51D, 0xC527, 0x3851,\n    0xC528, 0xC529, 0x097F, 0xC52A, 0xC52B, 0x385C, 0xC52C, 0xC52C, 0x0981,\n    0xC52D, 0xC52F, 0x385E, 0xC530, 0xC530, 0x0982, 0xC531, 0xC537, 0x3861,\n    0xC538, 0xC539, 0x0983, 0xC53A, 0xC53A, 0x3868, 0xC53B, 0xC53B, 0x0985,\n    0xC53C, 0xC53C, 0x3869, 0xC53D, 0xC53D, 0x0986, 0xC53E, 0xC543, 0x386A,\n    0xC544, 0xC545, 0x0987, 0xC546, 0xC547, 0x3870, 0xC548, 0xC54A, 0x0989,\n    0xC54B, 0xC54B, 0x3872, 0xC54C, 0xC54E, 0x098C, 0xC54F, 0xC552, 0x3873,\n    0xC553, 0xC555, 0x098F, 0xC556, 0xC556, 0x3877, 0xC557, 0xC559, 0x0992,\n    0xC55A, 0xC55C, 0x3878, 0xC55D, 0xC55E, 0x0995, 0xC55F, 0xC55F, 0x387B,\n    0xC560, 0xC561, 0x0997, 0xC562, 0xC563, 0x387C, 0xC564, 0xC564, 0x0999,\n    0xC565, 0xC567, 0x387E, 0xC568, 0xC568, 0x099A, 0xC569, 0xC56F, 0x3881,\n    0xC570, 0xC571, 0x099B, 0xC572, 0xC572, 0x3888, 0xC573, 0xC575, 0x099D,\n    0xC576, 0xC57B, 0x3889, 0xC57C, 0xC57D, 0x09A0, 0xC57E, 0xC57F, 0x388F,\n    0xC580, 0xC580, 0x09A2, 0xC581, 0xC583, 0x3891, 0xC584, 0xC584, 0x09A3,\n    0xC585, 0xC586, 0x3894, 0xC587, 0xC587, 0x09A4, 0xC588, 0xC58B, 0x3896,\n    0xC58C, 0xC58D, 0x09A5, 0xC58E, 0xC58E, 0x389A, 0xC58F, 0xC58F, 0x09A7,\n    0xC590, 0xC590, 0x389B, 0xC591, 0xC591, 0x09A8, 0xC592, 0xC594, 0x389C,\n    0xC595, 0xC595, 0x09A9, 0xC596, 0xC596, 0x389F, 0xC597, 0xC598, 0x09AA,\n    0xC599, 0xC59B, 0x38A0, 0xC59C, 0xC59C, 0x09AC, 0xC59D, 0xC59F, 0x38A3,\n    0xC5A0, 0xC5A0, 0x09AD, 0xC5A1, 0xC5A8, 0x38A6, 0xC5A9, 0xC5A9, 0x09AE,\n    0xC5AA, 0xC5B3, 0x38AE, 0xC5B4, 0xC5B5, 0x09AF, 0xC5B6, 0xC5B7, 0x38B8,\n    0xC5B8, 0xC5B9, 0x09B1, 0xC5BA, 0xC5BA, 0x38BA, 0xC5BB, 0xC5BE, 0x09B3,\n    0xC5BF, 0xC5C3, 0x38BB, 0xC5C4, 0xC5CA, 0x09B7, 0xC5CB, 0xC5CB, 0x38C0,\n    0xC5CC, 0xC5CC, 0x09BE, 0xC5CD, 0xC5CD, 0x38C1, 0xC5CE, 0xC5CE, 0x09BF,\n    0xC5CF, 0xC5CF, 0x38C2, 0xC5D0, 0xC5D1, 0x09C0, 0xC5D2, 0xC5D3, 0x38C3,\n    0xC5D4, 0xC5D4, 0x09C2, 0xC5D5, 0xC5D7, 0x38C5, 0xC5D8, 0xC5D8, 0x09C3,\n    0xC5D9, 0xC5DF, 0x38C8, 0xC5E0, 0xC5E1, 0x09C4, 0xC5E2, 0xC5E2, 0x38CF,\n    0xC5E3, 0xC5E3, 0x09C6, 0xC5E4, 0xC5E4, 0x38D0, 0xC5E5, 0xC5E5, 0x09C7,\n    0xC5E6, 0xC5EB, 0x38D1, 0xC5EC, 0xC5EE, 0x09C8, 0xC5EF, 0xC5EF, 0x38D7,\n    0xC5F0, 0xC5F0, 0x09CB, 0xC5F1, 0xC5F3, 0x38D8, 0xC5F4, 0xC5F4, 0x09CC,\n    0xC5F5, 0xC5F5, 0x38DB, 0xC5F6, 0xC5F7, 0x09CD, 0xC5F8, 0xC5FB, 0x38DC,\n    0xC5FC, 0xC5FF, 0x09CF, 0xC600, 0xC601, 0x09D3, 0xC602, 0xC604, 0x38E0,\n    0xC605, 0xC608, 0x09D5, 0xC609, 0xC60B, 0x38E3, 0xC60C, 0xC60C, 0x09D9,\n    0xC60D, 0xC60F, 0x38E6, 0xC610, 0xC610, 0x09DA, 0xC611, 0xC617, 0x38E9,\n    0xC618, 0xC619, 0x09DB, 0xC61A, 0xC61A, 0x38F0, 0xC61B, 0xC61C, 0x09DD,\n    0xC61D, 0xC623, 0x38F1, 0xC624, 0xC625, 0x09DF, 0xC626, 0xC627, 0x38F8,\n    0xC628, 0xC628, 0x09E1, 0xC629, 0xC62B, 0x38FA, 0xC62C, 0xC62E, 0x09E2,\n    0xC62F, 0xC62F, 0x38FD, 0xC630, 0xC630, 0x09E5, 0xC631, 0xC632, 0x38FE,\n    0xC633, 0xC635, 0x09E6, 0xC636, 0xC636, 0x3900, 0xC637, 0xC637, 0x09E9,\n    0xC638, 0xC638, 0x3901, 0xC639, 0xC639, 0x09EA, 0xC63A, 0xC63A, 0x3902,\n    0xC63B, 0xC63B, 0x09EB, 0xC63C, 0xC63F, 0x3903, 0xC640, 0xC641, 0x09EC,\n    0xC642, 0xC643, 0x3907, 0xC644, 0xC644, 0x09EE, 0xC645, 0xC647, 0x3909,\n    0xC648, 0xC648, 0x09EF, 0xC649, 0xC64F, 0x390C, 0xC650, 0xC651, 0x09F0,\n    0xC652, 0xC652, 0x3913, 0xC653, 0xC655, 0x09F2, 0xC656, 0xC65B, 0x3914,\n    0xC65C, 0xC65D, 0x09F5, 0xC65E, 0xC65F, 0x391A, 0xC660, 0xC660, 0x09F7,\n    0xC661, 0xC66B, 0x391C, 0xC66C, 0xC66C, 0x09F8, 0xC66D, 0xC66E, 0x3927,\n    0xC66F, 0xC66F, 0x09F9, 0xC670, 0xC670, 0x3929, 0xC671, 0xC671, 0x09FA,\n    0xC672, 0xC677, 0x392A, 0xC678, 0xC679, 0x09FB, 0xC67A, 0xC67B, 0x3930,\n    0xC67C, 0xC67C, 0x09FD, 0xC67D, 0xC67F, 0x3932, 0xC680, 0xC680, 0x09FE,\n    0xC681, 0xC687, 0x3935, 0xC688, 0xC689, 0x09FF, 0xC68A, 0xC68A, 0x393C,\n    0xC68B, 0xC68B, 0x0A01, 0xC68C, 0xC68C, 0x393D, 0xC68D, 0xC68D, 0x0A02,\n    0xC68E, 0xC693, 0x393E, 0xC694, 0xC695, 0x0A03, 0xC696, 0xC697, 0x3944,\n    0xC698, 0xC698, 0x0A05, 0xC699, 0xC69B, 0x3946, 0xC69C, 0xC69C, 0x0A06,\n    0xC69D, 0xC6A3, 0x3949, 0xC6A4, 0xC6A5, 0x0A07, 0xC6A6, 0xC6A6, 0x3950,\n    0xC6A7, 0xC6A7, 0x0A09, 0xC6A8, 0xC6A8, 0x3951, 0xC6A9, 0xC6A9, 0x0A0A,\n    0xC6AA, 0xC6AF, 0x3952, 0xC6B0, 0xC6B1, 0x0A0B, 0xC6B2, 0xC6B3, 0x3958,\n    0xC6B4, 0xC6B4, 0x0A0D, 0xC6B5, 0xC6B7, 0x395A, 0xC6B8, 0xC6BA, 0x0A0E,\n    0xC6BB, 0xC6BF, 0x395D, 0xC6C0, 0xC6C1, 0x0A11, 0xC6C2, 0xC6C2, 0x3962,\n    0xC6C3, 0xC6C3, 0x0A13, 0xC6C4, 0xC6C4, 0x3963, 0xC6C5, 0xC6C5, 0x0A14,\n    0xC6C6, 0xC6CB, 0x3964, 0xC6CC, 0xC6CD, 0x0A15, 0xC6CE, 0xC6CF, 0x396A,\n    0xC6D0, 0xC6D0, 0x0A17, 0xC6D1, 0xC6D3, 0x396C, 0xC6D4, 0xC6D4, 0x0A18,\n    0xC6D5, 0xC6DB, 0x396F, 0xC6DC, 0xC6DD, 0x0A19, 0xC6DE, 0xC6DF, 0x3976,\n    0xC6E0, 0xC6E1, 0x0A1B, 0xC6E2, 0xC6E7, 0x3978, 0xC6E8, 0xC6E9, 0x0A1D,\n    0xC6EA, 0xC6EB, 0x397E, 0xC6EC, 0xC6EC, 0x0A1F, 0xC6ED, 0xC6EF, 0x3980,\n    0xC6F0, 0xC6F0, 0x0A20, 0xC6F1, 0xC6F7, 0x3983, 0xC6F8, 0xC6F9, 0x0A21,\n    0xC6FA, 0xC6FC, 0x398A, 0xC6FD, 0xC6FD, 0x0A23, 0xC6FE, 0xC6FF, 0x398D,\n    0xC700, 0xC703, 0x398F, 0xC704, 0xC705, 0x0A24, 0xC706, 0xC707, 0x3993,\n    0xC708, 0xC708, 0x0A26, 0xC709, 0xC70B, 0x3995, 0xC70C, 0xC70C, 0x0A27,\n    0xC70D, 0xC713, 0x3998, 0xC714, 0xC715, 0x0A28, 0xC716, 0xC716, 0x399F,\n    0xC717, 0xC717, 0x0A2A, 0xC718, 0xC718, 0x39A0, 0xC719, 0xC719, 0x0A2B,\n    0xC71A, 0xC71F, 0x39A1, 0xC720, 0xC721, 0x0A2C, 0xC722, 0xC723, 0x39A7,\n    0xC724, 0xC724, 0x0A2E, 0xC725, 0xC727, 0x39A9, 0xC728, 0xC728, 0x0A2F,\n    0xC729, 0xC72F, 0x39AC, 0xC730, 0xC731, 0x0A30, 0xC732, 0xC732, 0x39B3,\n    0xC733, 0xC733, 0x0A32, 0xC734, 0xC734, 0x39B4, 0xC735, 0xC735, 0x0A33,\n    0xC736, 0xC736, 0x39B5, 0xC737, 0xC737, 0x0A34, 0xC738, 0xC73B, 0x39B6,\n    0xC73C, 0xC73D, 0x0A35, 0xC73E, 0xC73F, 0x39BA, 0xC740, 0xC740, 0x0A37,\n    0xC741, 0xC743, 0x39BC, 0xC744, 0xC744, 0x0A38, 0xC745, 0xC749, 0x39BF,\n    0xC74A, 0xC74A, 0x0A39, 0xC74B, 0xC74B, 0x39C4, 0xC74C, 0xC74D, 0x0A3A,\n    0xC74E, 0xC74E, 0x39C5, 0xC74F, 0xC74F, 0x0A3C, 0xC750, 0xC750, 0x39C6,\n    0xC751, 0xC758, 0x0A3D, 0xC759, 0xC75B, 0x39C7, 0xC75C, 0xC75C, 0x0A45,\n    0xC75D, 0xC75F, 0x39CA, 0xC760, 0xC760, 0x0A46, 0xC761, 0xC767, 0x39CD,\n    0xC768, 0xC768, 0x0A47, 0xC769, 0xC76A, 0x39D4, 0xC76B, 0xC76B, 0x0A48,\n    0xC76C, 0xC773, 0x39D6, 0xC774, 0xC775, 0x0A49, 0xC776, 0xC777, 0x39DE,\n    0xC778, 0xC778, 0x0A4B, 0xC779, 0xC77B, 0x39E0, 0xC77C, 0xC77E, 0x0A4C,\n    0xC77F, 0xC782, 0x39E3, 0xC783, 0xC785, 0x0A4F, 0xC786, 0xC786, 0x39E7,\n    0xC787, 0xC78A, 0x0A52, 0xC78B, 0xC78D, 0x39E8, 0xC78E, 0xC78E, 0x0A56,\n    0xC78F, 0xC78F, 0x39EB, 0xC790, 0xC791, 0x0A57, 0xC792, 0xC793, 0x39EC,\n    0xC794, 0xC794, 0x0A59, 0xC795, 0xC795, 0x39EE, 0xC796, 0xC798, 0x0A5A,\n    0xC799, 0xC799, 0x39EF, 0xC79A, 0xC79A, 0x0A5D, 0xC79B, 0xC79F, 0x39F0,\n    0xC7A0, 0xC7A1, 0x0A5E, 0xC7A2, 0xC7A2, 0x39F5, 0xC7A3, 0xC7A6, 0x0A60,\n    0xC7A7, 0xC7AB, 0x39F6, 0xC7AC, 0xC7AD, 0x0A64, 0xC7AE, 0xC7AF, 0x39FB,\n    0xC7B0, 0xC7B0, 0x0A66, 0xC7B1, 0xC7B3, 0x39FD, 0xC7B4, 0xC7B4, 0x0A67,\n    0xC7B5, 0xC7BB, 0x3A00, 0xC7BC, 0xC7BD, 0x0A68, 0xC7BE, 0xC7BE, 0x3A07,\n    0xC7BF, 0xC7C1, 0x0A6A, 0xC7C2, 0xC7C7, 0x3A08, 0xC7C8, 0xC7C9, 0x0A6D,\n    0xC7CA, 0xC7CB, 0x3A0E, 0xC7CC, 0xC7CC, 0x0A6F, 0xC7CD, 0xC7CD, 0x3A10,\n    0xC7CE, 0xC7CE, 0x0A70, 0xC7CF, 0xC7CF, 0x3A11, 0xC7D0, 0xC7D0, 0x0A71,\n    0xC7D1, 0xC7D7, 0x3A12, 0xC7D8, 0xC7D8, 0x0A72, 0xC7D9, 0xC7DC, 0x3A19,\n    0xC7DD, 0xC7DD, 0x0A73, 0xC7DE, 0xC7E3, 0x3A1D, 0xC7E4, 0xC7E4, 0x0A74,\n    0xC7E5, 0xC7E7, 0x3A23, 0xC7E8, 0xC7E8, 0x0A75, 0xC7E9, 0xC7EB, 0x3A26,\n    0xC7EC, 0xC7EC, 0x0A76, 0xC7ED, 0xC7FF, 0x3A29, 0xC800, 0xC801, 0x0A77,\n    0xC802, 0xC803, 0x3A3C, 0xC804, 0xC804, 0x0A79, 0xC805, 0xC807, 0x3A3E,\n    0xC808, 0xC808, 0x0A7A, 0xC809, 0xC809, 0x3A41, 0xC80A, 0xC80A, 0x0A7B,\n    0xC80B, 0xC80F, 0x3A42, 0xC810, 0xC811, 0x0A7C, 0xC812, 0xC812, 0x3A47,\n    0xC813, 0xC813, 0x0A7E, 0xC814, 0xC814, 0x3A48, 0xC815, 0xC816, 0x0A7F,\n    0xC817, 0xC81B, 0x3A49, 0xC81C, 0xC81D, 0x0A81, 0xC81E, 0xC81F, 0x3A4E,\n    0xC820, 0xC820, 0x0A83, 0xC821, 0xC823, 0x3A50, 0xC824, 0xC824, 0x0A84,\n    0xC825, 0xC82B, 0x3A53, 0xC82C, 0xC82D, 0x0A85, 0xC82E, 0xC82E, 0x3A5A,\n    0xC82F, 0xC82F, 0x0A87, 0xC830, 0xC830, 0x3A5B, 0xC831, 0xC831, 0x0A88,\n    0xC832, 0xC837, 0x3A5C, 0xC838, 0xC838, 0x0A89, 0xC839, 0xC83B, 0x3A62,\n    0xC83C, 0xC83C, 0x0A8A, 0xC83D, 0xC83F, 0x3A65, 0xC840, 0xC840, 0x0A8B,\n    0xC841, 0xC847, 0x3A68, 0xC848, 0xC849, 0x0A8C, 0xC84A, 0xC84B, 0x3A6F,\n    0xC84C, 0xC84D, 0x0A8E, 0xC84E, 0xC853, 0x3A71, 0xC854, 0xC854, 0x0A90,\n    0xC855, 0xC86F, 0x3A77, 0xC870, 0xC871, 0x0A91, 0xC872, 0xC873, 0x3A92,\n    0xC874, 0xC874, 0x0A93, 0xC875, 0xC877, 0x3A94, 0xC878, 0xC878, 0x0A94,\n    0xC879, 0xC879, 0x3A97, 0xC87A, 0xC87A, 0x0A95, 0xC87B, 0xC87F, 0x3A98,\n    0xC880, 0xC881, 0x0A96, 0xC882, 0xC882, 0x3A9D, 0xC883, 0xC883, 0x0A98,\n    0xC884, 0xC884, 0x3A9E, 0xC885, 0xC887, 0x0A99, 0xC888, 0xC88A, 0x3A9F,\n    0xC88B, 0xC88D, 0x0A9C, 0xC88E, 0xC893, 0x3AA2, 0xC894, 0xC894, 0x0A9F,\n    0xC895, 0xC89C, 0x3AA8, 0xC89D, 0xC89D, 0x0AA0, 0xC89E, 0xC89E, 0x3AB0,\n    0xC89F, 0xC89F, 0x0AA1, 0xC8A0, 0xC8A0, 0x3AB1, 0xC8A1, 0xC8A1, 0x0AA2,\n    0xC8A2, 0xC8A7, 0x3AB2, 0xC8A8, 0xC8A8, 0x0AA3, 0xC8A9, 0xC8BB, 0x3AB8,\n    0xC8BC, 0xC8BD, 0x0AA4, 0xC8BE, 0xC8C3, 0x3ACB, 0xC8C4, 0xC8C4, 0x0AA6,\n    0xC8C5, 0xC8C7, 0x3AD1, 0xC8C8, 0xC8C8, 0x0AA7, 0xC8C9, 0xC8CB, 0x3AD4,\n    0xC8CC, 0xC8CC, 0x0AA8, 0xC8CD, 0xC8D3, 0x3AD7, 0xC8D4, 0xC8D5, 0x0AA9,\n    0xC8D6, 0xC8D6, 0x3ADE, 0xC8D7, 0xC8D7, 0x0AAB, 0xC8D8, 0xC8D8, 0x3ADF,\n    0xC8D9, 0xC8D9, 0x0AAC, 0xC8DA, 0xC8DF, 0x3AE0, 0xC8E0, 0xC8E1, 0x0AAD,\n    0xC8E2, 0xC8E3, 0x3AE6, 0xC8E4, 0xC8E4, 0x0AAF, 0xC8E5, 0xC8F4, 0x3AE8,\n    0xC8F5, 0xC8F5, 0x0AB0, 0xC8F6, 0xC8FB, 0x3AF8, 0xC8FC, 0xC8FD, 0x0AB1,\n    0xC8FE, 0xC8FF, 0x3AFE, 0xC900, 0xC900, 0x0AB3, 0xC901, 0xC903, 0x3B00,\n    0xC904, 0xC906, 0x0AB4, 0xC907, 0xC90B, 0x3B03, 0xC90C, 0xC90D, 0x0AB7,\n    0xC90E, 0xC90E, 0x3B08, 0xC90F, 0xC90F, 0x0AB9, 0xC910, 0xC910, 0x3B09,\n    0xC911, 0xC911, 0x0ABA, 0xC912, 0xC917, 0x3B0A, 0xC918, 0xC918, 0x0ABB,\n    0xC919, 0xC92B, 0x3B10, 0xC92C, 0xC92C, 0x0ABC, 0xC92D, 0xC933, 0x3B23,\n    0xC934, 0xC934, 0x0ABD, 0xC935, 0xC94F, 0x3B2A, 0xC950, 0xC951, 0x0ABE,\n    0xC952, 0xC953, 0x3B45, 0xC954, 0xC954, 0x0AC0, 0xC955, 0xC957, 0x3B47,\n    0xC958, 0xC958, 0x0AC1, 0xC959, 0xC95F, 0x3B4A, 0xC960, 0xC961, 0x0AC2,\n    0xC962, 0xC962, 0x3B51, 0xC963, 0xC963, 0x0AC4, 0xC964, 0xC96B, 0x3B52,\n    0xC96C, 0xC96C, 0x0AC5, 0xC96D, 0xC96F, 0x3B5A, 0xC970, 0xC970, 0x0AC6,\n    0xC971, 0xC973, 0x3B5D, 0xC974, 0xC974, 0x0AC7, 0xC975, 0xC97B, 0x3B60,\n    0xC97C, 0xC97C, 0x0AC8, 0xC97D, 0xC987, 0x3B67, 0xC988, 0xC989, 0x0AC9,\n    0xC98A, 0xC98B, 0x3B72, 0xC98C, 0xC98C, 0x0ACB, 0xC98D, 0xC98F, 0x3B74,\n    0xC990, 0xC990, 0x0ACC, 0xC991, 0xC997, 0x3B77, 0xC998, 0xC999, 0x0ACD,\n    0xC99A, 0xC99A, 0x3B7E, 0xC99B, 0xC99B, 0x0ACF, 0xC99C, 0xC99C, 0x3B7F,\n    0xC99D, 0xC99D, 0x0AD0, 0xC99E, 0xC9BF, 0x3B80, 0xC9C0, 0xC9C1, 0x0AD1,\n    0xC9C2, 0xC9C3, 0x3BA2, 0xC9C4, 0xC9C4, 0x0AD3, 0xC9C5, 0xC9C6, 0x3BA4,\n    0xC9C7, 0xC9C8, 0x0AD4, 0xC9C9, 0xC9C9, 0x3BA6, 0xC9CA, 0xC9CA, 0x0AD6,\n    0xC9CB, 0xC9CF, 0x3BA7, 0xC9D0, 0xC9D1, 0x0AD7, 0xC9D2, 0xC9D2, 0x3BAC,\n    0xC9D3, 0xC9D3, 0x0AD9, 0xC9D4, 0xC9D4, 0x3BAD, 0xC9D5, 0xC9D6, 0x0ADA,\n    0xC9D7, 0xC9D8, 0x3BAE, 0xC9D9, 0xC9DA, 0x0ADC, 0xC9DB, 0xC9DB, 0x3BB0,\n    0xC9DC, 0xC9DD, 0x0ADE, 0xC9DE, 0xC9DF, 0x3BB1, 0xC9E0, 0xC9E0, 0x0AE0,\n    0xC9E1, 0xC9E1, 0x3BB3, 0xC9E2, 0xC9E2, 0x0AE1, 0xC9E3, 0xC9E3, 0x3BB4,\n    0xC9E4, 0xC9E4, 0x0AE2, 0xC9E5, 0xC9E6, 0x3BB5, 0xC9E7, 0xC9E7, 0x0AE3,\n    0xC9E8, 0xC9EB, 0x3BB7, 0xC9EC, 0xC9ED, 0x0AE4, 0xC9EE, 0xC9EE, 0x3BBB,\n    0xC9EF, 0xC9F1, 0x0AE6, 0xC9F2, 0xC9F7, 0x3BBC, 0xC9F8, 0xC9F9, 0x0AE9,\n    0xC9FA, 0xC9FB, 0x3BC2, 0xC9FC, 0xC9FC, 0x0AEB, 0xC9FD, 0xC9FF, 0x3BC4,\n    0xCA00, 0xCA00, 0x0AEC, 0xCA01, 0xCA07, 0x3BC7, 0xCA08, 0xCA09, 0x0AED,\n    0xCA0A, 0xCA0A, 0x3BCE, 0xCA0B, 0xCA0D, 0x0AEF, 0xCA0E, 0xCA13, 0x3BCF,\n    0xCA14, 0xCA14, 0x0AF2, 0xCA15, 0xCA17, 0x3BD5, 0xCA18, 0xCA18, 0x0AF3,\n    0xCA19, 0xCA28, 0x3BD8, 0xCA29, 0xCA29, 0x0AF4, 0xCA2A, 0xCA4B, 0x3BE8,\n    0xCA4C, 0xCA4D, 0x0AF5, 0xCA4E, 0xCA4F, 0x3C0A, 0xCA50, 0xCA50, 0x0AF7,\n    0xCA51, 0xCA53, 0x3C0C, 0xCA54, 0xCA54, 0x0AF8, 0xCA55, 0xCA5B, 0x3C0F,\n    0xCA5C, 0xCA5D, 0x0AF9, 0xCA5E, 0xCA5E, 0x3C16, 0xCA5F, 0xCA61, 0x0AFB,\n    0xCA62, 0xCA67, 0x3C17, 0xCA68, 0xCA68, 0x0AFE, 0xCA69, 0xCA7C, 0x3C1D,\n    0xCA7D, 0xCA7D, 0x0AFF, 0xCA7E, 0xCA83, 0x3C31, 0xCA84, 0xCA84, 0x0B00,\n    0xCA85, 0xCA97, 0x3C37, 0xCA98, 0xCA98, 0x0B01, 0xCA99, 0xCABB, 0x3C4A,\n    0xCABC, 0xCABD, 0x0B02, 0xCABE, 0xCABF, 0x3C6D, 0xCAC0, 0xCAC0, 0x0B04,\n    0xCAC1, 0xCAC3, 0x3C6F, 0xCAC4, 0xCAC4, 0x0B05, 0xCAC5, 0xCACB, 0x3C72,\n    0xCACC, 0xCACD, 0x0B06, 0xCACE, 0xCACE, 0x3C79, 0xCACF, 0xCACF, 0x0B08,\n    0xCAD0, 0xCAD0, 0x3C7A, 0xCAD1, 0xCAD1, 0x0B09, 0xCAD2, 0xCAD2, 0x3C7B,\n    0xCAD3, 0xCAD3, 0x0B0A, 0xCAD4, 0xCAD7, 0x3C7C, 0xCAD8, 0xCAD9, 0x0B0B,\n    0xCADA, 0xCADF, 0x3C80, 0xCAE0, 0xCAE0, 0x0B0D, 0xCAE1, 0xCAEB, 0x3C86,\n    0xCAEC, 0xCAEC, 0x0B0E, 0xCAED, 0xCAF3, 0x3C91, 0xCAF4, 0xCAF4, 0x0B0F,\n    0xCAF5, 0xCAFF, 0x3C98, 0xCB00, 0xCB07, 0x3CA3, 0xCB08, 0xCB08, 0x0B10,\n    0xCB09, 0xCB0F, 0x3CAB, 0xCB10, 0xCB10, 0x0B11, 0xCB11, 0xCB13, 0x3CB2,\n    0xCB14, 0xCB14, 0x0B12, 0xCB15, 0xCB17, 0x3CB5, 0xCB18, 0xCB18, 0x0B13,\n    0xCB19, 0xCB1F, 0x3CB8, 0xCB20, 0xCB21, 0x0B14, 0xCB22, 0xCB40, 0x3CBF,\n    0xCB41, 0xCB41, 0x0B16, 0xCB42, 0xCB47, 0x3CDE, 0xCB48, 0xCB49, 0x0B17,\n    0xCB4A, 0xCB4B, 0x3CE4, 0xCB4C, 0xCB4C, 0x0B19, 0xCB4D, 0xCB4F, 0x3CE6,\n    0xCB50, 0xCB50, 0x0B1A, 0xCB51, 0xCB57, 0x3CE9, 0xCB58, 0xCB59, 0x0B1B,\n    0xCB5A, 0xCB5C, 0x3CF0, 0xCB5D, 0xCB5D, 0x0B1D, 0xCB5E, 0xCB63, 0x3CF3,\n    0xCB64, 0xCB64, 0x0B1E, 0xCB65, 0xCB77, 0x3CF9, 0xCB78, 0xCB79, 0x0B1F,\n    0xCB7A, 0xCB9B, 0x3D0C, 0xCB9C, 0xCB9C, 0x0B21, 0xCB9D, 0xCBB7, 0x3D2E,\n    0xCBB8, 0xCBB8, 0x0B22, 0xCBB9, 0xCBD3, 0x3D49, 0xCBD4, 0xCBD4, 0x0B23,\n    0xCBD5, 0xCBE3, 0x3D64, 0xCBE4, 0xCBE4, 0x0B24, 0xCBE5, 0xCBE6, 0x3D73,\n    0xCBE7, 0xCBE7, 0x0B25, 0xCBE8, 0xCBE8, 0x3D75, 0xCBE9, 0xCBE9, 0x0B26,\n    0xCBEA, 0xCBFF, 0x3D76, 0xCC00, 0xCC0B, 0x3D8C, 0xCC0C, 0xCC0D, 0x0B27,\n    0xCC0E, 0xCC0F, 0x3D98, 0xCC10, 0xCC10, 0x0B29, 0xCC11, 0xCC13, 0x3D9A,\n    0xCC14, 0xCC14, 0x0B2A, 0xCC15, 0xCC1B, 0x3D9D, 0xCC1C, 0xCC1D, 0x0B2B,\n    0xCC1E, 0xCC20, 0x3DA4, 0xCC21, 0xCC22, 0x0B2D, 0xCC23, 0xCC26, 0x3DA7,\n    0xCC27, 0xCC29, 0x0B2F, 0xCC2A, 0xCC2B, 0x3DAB, 0xCC2C, 0xCC2C, 0x0B32,\n    0xCC2D, 0xCC2D, 0x3DAD, 0xCC2E, 0xCC2E, 0x0B33, 0xCC2F, 0xCC2F, 0x3DAE,\n    0xCC30, 0xCC30, 0x0B34, 0xCC31, 0xCC37, 0x3DAF, 0xCC38, 0xCC39, 0x0B35,\n    0xCC3A, 0xCC3A, 0x3DB6, 0xCC3B, 0xCC3E, 0x0B37, 0xCC3F, 0xCC43, 0x3DB7,\n    0xCC44, 0xCC45, 0x0B3B, 0xCC46, 0xCC47, 0x3DBC, 0xCC48, 0xCC48, 0x0B3D,\n    0xCC49, 0xCC4B, 0x3DBE, 0xCC4C, 0xCC4C, 0x0B3E, 0xCC4D, 0xCC53, 0x3DC1,\n    0xCC54, 0xCC55, 0x0B3F, 0xCC56, 0xCC56, 0x3DC8, 0xCC57, 0xCC59, 0x0B41,\n    0xCC5A, 0xCC5F, 0x3DC9, 0xCC60, 0xCC60, 0x0B44, 0xCC61, 0xCC63, 0x3DCF,\n    0xCC64, 0xCC64, 0x0B45, 0xCC65, 0xCC65, 0x3DD2, 0xCC66, 0xCC66, 0x0B46,\n    0xCC67, 0xCC67, 0x3DD3, 0xCC68, 0xCC68, 0x0B47, 0xCC69, 0xCC6F, 0x3DD4,\n    0xCC70, 0xCC70, 0x0B48, 0xCC71, 0xCC74, 0x3DDB, 0xCC75, 0xCC75, 0x0B49,\n    0xCC76, 0xCC97, 0x3DDF, 0xCC98, 0xCC99, 0x0B4A, 0xCC9A, 0xCC9B, 0x3E01,\n    0xCC9C, 0xCC9C, 0x0B4C, 0xCC9D, 0xCC9F, 0x3E03, 0xCCA0, 0xCCA0, 0x0B4D,\n    0xCCA1, 0xCCA7, 0x3E06, 0xCCA8, 0xCCA9, 0x0B4E, 0xCCAA, 0xCCAA, 0x3E0D,\n    0xCCAB, 0xCCAD, 0x0B50, 0xCCAE, 0xCCB3, 0x3E0E, 0xCCB4, 0xCCB5, 0x0B53,\n    0xCCB6, 0xCCB7, 0x3E14, 0xCCB8, 0xCCB8, 0x0B55, 0xCCB9, 0xCCBB, 0x3E16,\n    0xCCBC, 0xCCBC, 0x0B56, 0xCCBD, 0xCCC3, 0x3E19, 0xCCC4, 0xCCC5, 0x0B57,\n    0xCCC6, 0xCCC6, 0x3E20, 0xCCC7, 0xCCC7, 0x0B59, 0xCCC8, 0xCCC8, 0x3E21,\n    0xCCC9, 0xCCC9, 0x0B5A, 0xCCCA, 0xCCCF, 0x3E22, 0xCCD0, 0xCCD0, 0x0B5B,\n    0xCCD1, 0xCCD3, 0x3E28, 0xCCD4, 0xCCD4, 0x0B5C, 0xCCD5, 0xCCE3, 0x3E2B,\n    0xCCE4, 0xCCE4, 0x0B5D, 0xCCE5, 0xCCEB, 0x3E3A, 0xCCEC, 0xCCEC, 0x0B5E,\n    0xCCED, 0xCCEF, 0x3E41, 0xCCF0, 0xCCF0, 0x0B5F, 0xCCF1, 0xCCFF, 0x3E44,\n    0xCD00, 0xCD00, 0x3E53, 0xCD01, 0xCD01, 0x0B60, 0xCD02, 0xCD07, 0x3E54,\n    0xCD08, 0xCD09, 0x0B61, 0xCD0A, 0xCD0B, 0x3E5A, 0xCD0C, 0xCD0C, 0x0B63,\n    0xCD0D, 0xCD0F, 0x3E5C, 0xCD10, 0xCD10, 0x0B64, 0xCD11, 0xCD17, 0x3E5F,\n    0xCD18, 0xCD19, 0x0B65, 0xCD1A, 0xCD1A, 0x3E66, 0xCD1B, 0xCD1B, 0x0B67,\n    0xCD1C, 0xCD1C, 0x3E67, 0xCD1D, 0xCD1D, 0x0B68, 0xCD1E, 0xCD23, 0x3E68,\n    0xCD24, 0xCD24, 0x0B69, 0xCD25, 0xCD27, 0x3E6E, 0xCD28, 0xCD28, 0x0B6A,\n    0xCD29, 0xCD2B, 0x3E71, 0xCD2C, 0xCD2C, 0x0B6B, 0xCD2D, 0xCD38, 0x3E74,\n    0xCD39, 0xCD39, 0x0B6C, 0xCD3A, 0xCD5B, 0x3E80, 0xCD5C, 0xCD5C, 0x0B6D,\n    0xCD5D, 0xCD5F, 0x3EA2, 0xCD60, 0xCD60, 0x0B6E, 0xCD61, 0xCD63, 0x3EA5,\n    0xCD64, 0xCD64, 0x0B6F, 0xCD65, 0xCD6B, 0x3EA8, 0xCD6C, 0xCD6D, 0x0B70,\n    0xCD6E, 0xCD6E, 0x3EAF, 0xCD6F, 0xCD6F, 0x0B72, 0xCD70, 0xCD70, 0x3EB0,\n    0xCD71, 0xCD71, 0x0B73, 0xCD72, 0xCD77, 0x3EB1, 0xCD78, 0xCD78, 0x0B74,\n    0xCD79, 0xCD87, 0x3EB7, 0xCD88, 0xCD88, 0x0B75, 0xCD89, 0xCD93, 0x3EC6,\n    0xCD94, 0xCD95, 0x0B76, 0xCD96, 0xCD97, 0x3ED1, 0xCD98, 0xCD98, 0x0B78,\n    0xCD99, 0xCD9B, 0x3ED3, 0xCD9C, 0xCD9C, 0x0B79, 0xCD9D, 0xCDA3, 0x3ED6,\n    0xCDA4, 0xCDA5, 0x0B7A, 0xCDA6, 0xCDA6, 0x3EDD, 0xCDA7, 0xCDA7, 0x0B7C,\n    0xCDA8, 0xCDA8, 0x3EDE, 0xCDA9, 0xCDA9, 0x0B7D, 0xCDAA, 0xCDAF, 0x3EDF,\n    0xCDB0, 0xCDB0, 0x0B7E, 0xCDB1, 0xCDC3, 0x3EE5, 0xCDC4, 0xCDC4, 0x0B7F,\n    0xCDC5, 0xCDCB, 0x3EF8, 0xCDCC, 0xCDCC, 0x0B80, 0xCDCD, 0xCDCF, 0x3EFF,\n    0xCDD0, 0xCDD0, 0x0B81, 0xCDD1, 0xCDE7, 0x3F02, 0xCDE8, 0xCDE8, 0x0B82,\n    0xCDE9, 0xCDEB, 0x3F19, 0xCDEC, 0xCDEC, 0x0B83, 0xCDED, 0xCDEF, 0x3F1C,\n    0xCDF0, 0xCDF0, 0x0B84, 0xCDF1, 0xCDF7, 0x3F1F, 0xCDF8, 0xCDF9, 0x0B85,\n    0xCDFA, 0xCDFA, 0x3F26, 0xCDFB, 0xCDFB, 0x0B87, 0xCDFC, 0xCDFC, 0x3F27,\n    0xCDFD, 0xCDFD, 0x0B88, 0xCDFE, 0xCDFF, 0x3F28, 0xCE00, 0xCE03, 0x3F2A,\n    0xCE04, 0xCE04, 0x0B89, 0xCE05, 0xCE07, 0x3F2E, 0xCE08, 0xCE08, 0x0B8A,\n    0xCE09, 0xCE0B, 0x3F31, 0xCE0C, 0xCE0C, 0x0B8B, 0xCE0D, 0xCE13, 0x3F34,\n    0xCE14, 0xCE14, 0x0B8C, 0xCE15, 0xCE18, 0x3F3B, 0xCE19, 0xCE19, 0x0B8D,\n    0xCE1A, 0xCE1F, 0x3F3F, 0xCE20, 0xCE21, 0x0B8E, 0xCE22, 0xCE23, 0x3F45,\n    0xCE24, 0xCE24, 0x0B90, 0xCE25, 0xCE27, 0x3F47, 0xCE28, 0xCE28, 0x0B91,\n    0xCE29, 0xCE2F, 0x3F4A, 0xCE30, 0xCE31, 0x0B92, 0xCE32, 0xCE32, 0x3F51,\n    0xCE33, 0xCE33, 0x0B94, 0xCE34, 0xCE34, 0x3F52, 0xCE35, 0xCE35, 0x0B95,\n    0xCE36, 0xCE57, 0x3F53, 0xCE58, 0xCE59, 0x0B96, 0xCE5A, 0xCE5B, 0x3F75,\n    0xCE5C, 0xCE5C, 0x0B98, 0xCE5D, 0xCE5E, 0x3F77, 0xCE5F, 0xCE61, 0x0B99,\n    0xCE62, 0xCE67, 0x3F79, 0xCE68, 0xCE69, 0x0B9C, 0xCE6A, 0xCE6A, 0x3F7F,\n    0xCE6B, 0xCE6B, 0x0B9E, 0xCE6C, 0xCE6C, 0x3F80, 0xCE6D, 0xCE6D, 0x0B9F,\n    0xCE6E, 0xCE73, 0x3F81, 0xCE74, 0xCE75, 0x0BA0, 0xCE76, 0xCE77, 0x3F87,\n    0xCE78, 0xCE78, 0x0BA2, 0xCE79, 0xCE7B, 0x3F89, 0xCE7C, 0xCE7C, 0x0BA3,\n    0xCE7D, 0xCE83, 0x3F8C, 0xCE84, 0xCE85, 0x0BA4, 0xCE86, 0xCE86, 0x3F93,\n    0xCE87, 0xCE87, 0x0BA6, 0xCE88, 0xCE88, 0x3F94, 0xCE89, 0xCE89, 0x0BA7,\n    0xCE8A, 0xCE8F, 0x3F95, 0xCE90, 0xCE91, 0x0BA8, 0xCE92, 0xCE93, 0x3F9B,\n    0xCE94, 0xCE94, 0x0BAA, 0xCE95, 0xCE97, 0x3F9D, 0xCE98, 0xCE98, 0x0BAB,\n    0xCE99, 0xCE9F, 0x3FA0, 0xCEA0, 0xCEA1, 0x0BAC, 0xCEA2, 0xCEA2, 0x3FA7,\n    0xCEA3, 0xCEA5, 0x0BAE, 0xCEA6, 0xCEAB, 0x3FA8, 0xCEAC, 0xCEAD, 0x0BB1,\n    0xCEAE, 0xCEC0, 0x3FAE, 0xCEC1, 0xCEC1, 0x0BB3, 0xCEC2, 0xCEE3, 0x3FC1,\n    0xCEE4, 0xCEE5, 0x0BB4, 0xCEE6, 0xCEE7, 0x3FE3, 0xCEE8, 0xCEE8, 0x0BB6,\n    0xCEE9, 0xCEEA, 0x3FE5, 0xCEEB, 0xCEEC, 0x0BB7, 0xCEED, 0xCEF3, 0x3FE7,\n    0xCEF4, 0xCEF5, 0x0BB9, 0xCEF6, 0xCEF6, 0x3FEE, 0xCEF7, 0xCEF9, 0x0BBB,\n    0xCEFA, 0xCEFF, 0x3FEF, 0xCF00, 0xCF01, 0x0BBE, 0xCF02, 0xCF03, 0x3FF5,\n    0xCF04, 0xCF04, 0x0BC0, 0xCF05, 0xCF07, 0x3FF7, 0xCF08, 0xCF08, 0x0BC1,\n    0xCF09, 0xCF0F, 0x3FFA, 0xCF10, 0xCF11, 0x0BC2, 0xCF12, 0xCF12, 0x4001,\n    0xCF13, 0xCF13, 0x0BC4, 0xCF14, 0xCF14, 0x4002, 0xCF15, 0xCF15, 0x0BC5,\n    0xCF16, 0xCF1B, 0x4003, 0xCF1C, 0xCF1C, 0x0BC6, 0xCF1D, 0xCF1F, 0x4009,\n    0xCF20, 0xCF20, 0x0BC7, 0xCF21, 0xCF23, 0x400C, 0xCF24, 0xCF24, 0x0BC8,\n    0xCF25, 0xCF2B, 0x400F, 0xCF2C, 0xCF2D, 0x0BC9, 0xCF2E, 0xCF2E, 0x4016,\n    0xCF2F, 0xCF31, 0x0BCB, 0xCF32, 0xCF37, 0x4017, 0xCF38, 0xCF38, 0x0BCE,\n    0xCF39, 0xCF53, 0x401D, 0xCF54, 0xCF55, 0x0BCF, 0xCF56, 0xCF57, 0x4038,\n    0xCF58, 0xCF58, 0x0BD1, 0xCF59, 0xCF5B, 0x403A, 0xCF5C, 0xCF5C, 0x0BD2,\n    0xCF5D, 0xCF63, 0x403D, 0xCF64, 0xCF65, 0x0BD3, 0xCF66, 0xCF66, 0x4044,\n    0xCF67, 0xCF67, 0x0BD5, 0xCF68, 0xCF68, 0x4045, 0xCF69, 0xCF69, 0x0BD6,\n    0xCF6A, 0xCF6F, 0x4046, 0xCF70, 0xCF71, 0x0BD7, 0xCF72, 0xCF73, 0x404C,\n    0xCF74, 0xCF74, 0x0BD9, 0xCF75, 0xCF77, 0x404E, 0xCF78, 0xCF78, 0x0BDA,\n    0xCF79, 0xCF7F, 0x4051, 0xCF80, 0xCF80, 0x0BDB, 0xCF81, 0xCF84, 0x4058,\n    0xCF85, 0xCF85, 0x0BDC, 0xCF86, 0xCF8B, 0x405C, 0xCF8C, 0xCF8C, 0x0BDD,\n    0xCF8D, 0xCFA0, 0x4062, 0xCFA1, 0xCFA1, 0x0BDE, 0xCFA2, 0xCFA7, 0x4076,\n    0xCFA8, 0xCFA8, 0x0BDF, 0xCFA9, 0xCFAF, 0x407C, 0xCFB0, 0xCFB0, 0x0BE0,\n    0xCFB1, 0xCFC3, 0x4083, 0xCFC4, 0xCFC4, 0x0BE1, 0xCFC5, 0xCFDF, 0x4096,\n    0xCFE0, 0xCFE1, 0x0BE2, 0xCFE2, 0xCFE3, 0x40B1, 0xCFE4, 0xCFE4, 0x0BE4,\n    0xCFE5, 0xCFE7, 0x40B3, 0xCFE8, 0xCFE8, 0x0BE5, 0xCFE9, 0xCFEF, 0x40B6,\n    0xCFF0, 0xCFF1, 0x0BE6, 0xCFF2, 0xCFF2, 0x40BD, 0xCFF3, 0xCFF3, 0x0BE8,\n    0xCFF4, 0xCFF4, 0x40BE, 0xCFF5, 0xCFF5, 0x0BE9, 0xCFF6, 0xCFFB, 0x40BF,\n    0xCFFC, 0xCFFC, 0x0BEA, 0xCFFD, 0xCFFF, 0x40C5, 0xD000, 0xD000, 0x0BEB,\n    0xD001, 0xD003, 0x40C8, 0xD004, 0xD004, 0x0BEC, 0xD005, 0xD010, 0x40CB,\n    0xD011, 0xD011, 0x0BED, 0xD012, 0xD017, 0x40D7, 0xD018, 0xD018, 0x0BEE,\n    0xD019, 0xD02C, 0x40DD, 0xD02D, 0xD02D, 0x0BEF, 0xD02E, 0xD033, 0x40F1,\n    0xD034, 0xD035, 0x0BF0, 0xD036, 0xD037, 0x40F7, 0xD038, 0xD038, 0x0BF2,\n    0xD039, 0xD03B, 0x40F9, 0xD03C, 0xD03C, 0x0BF3, 0xD03D, 0xD043, 0x40FC,\n    0xD044, 0xD045, 0x0BF4, 0xD046, 0xD046, 0x4103, 0xD047, 0xD047, 0x0BF6,\n    0xD048, 0xD048, 0x4104, 0xD049, 0xD049, 0x0BF7, 0xD04A, 0xD04F, 0x4105,\n    0xD050, 0xD050, 0x0BF8, 0xD051, 0xD053, 0x410B, 0xD054, 0xD054, 0x0BF9,\n    0xD055, 0xD057, 0x410E, 0xD058, 0xD058, 0x0BFA, 0xD059, 0xD05F, 0x4111,\n    0xD060, 0xD060, 0x0BFB, 0xD061, 0xD06B, 0x4118, 0xD06C, 0xD06D, 0x0BFC,\n    0xD06E, 0xD06F, 0x4123, 0xD070, 0xD070, 0x0BFE, 0xD071, 0xD073, 0x4125,\n    0xD074, 0xD074, 0x0BFF, 0xD075, 0xD07B, 0x4128, 0xD07C, 0xD07D, 0x0C00,\n    0xD07E, 0xD080, 0x412F, 0xD081, 0xD081, 0x0C02, 0xD082, 0xD0A3, 0x4132,\n    0xD0A4, 0xD0A5, 0x0C03, 0xD0A6, 0xD0A7, 0x4154, 0xD0A8, 0xD0A8, 0x0C05,\n    0xD0A9, 0xD0AB, 0x4156, 0xD0AC, 0xD0AC, 0x0C06, 0xD0AD, 0xD0B3, 0x4159,\n    0xD0B4, 0xD0B5, 0x0C07, 0xD0B6, 0xD0B6, 0x4160, 0xD0B7, 0xD0B7, 0x0C09,\n    0xD0B8, 0xD0B8, 0x4161, 0xD0B9, 0xD0B9, 0x0C0A, 0xD0BA, 0xD0BF, 0x4162,\n    0xD0C0, 0xD0C1, 0x0C0B, 0xD0C2, 0xD0C3, 0x4168, 0xD0C4, 0xD0C4, 0x0C0D,\n    0xD0C5, 0xD0C7, 0x416A, 0xD0C8, 0xD0C9, 0x0C0E, 0xD0CA, 0xD0CF, 0x416D,\n    0xD0D0, 0xD0D1, 0x0C10, 0xD0D2, 0xD0D2, 0x4173, 0xD0D3, 0xD0D5, 0x0C12,\n    0xD0D6, 0xD0DB, 0x4174, 0xD0DC, 0xD0DD, 0x0C15, 0xD0DE, 0xD0DF, 0x417A,\n    0xD0E0, 0xD0E0, 0x0C17, 0xD0E1, 0xD0E3, 0x417C, 0xD0E4, 0xD0E4, 0x0C18,\n    0xD0E5, 0xD0EB, 0x417F, 0xD0EC, 0xD0ED, 0x0C19, 0xD0EE, 0xD0EE, 0x4186,\n    0xD0EF, 0xD0F1, 0x0C1B, 0xD0F2, 0xD0F7, 0x4187, 0xD0F8, 0xD0F8, 0x0C1E,\n    0xD0F9, 0xD0FF, 0x418D, 0xD100, 0xD10C, 0x4194, 0xD10D, 0xD10D, 0x0C1F,\n    0xD10E, 0xD12F, 0x41A1, 0xD130, 0xD131, 0x0C20, 0xD132, 0xD133, 0x41C3,\n    0xD134, 0xD134, 0x0C22, 0xD135, 0xD137, 0x41C5, 0xD138, 0xD138, 0x0C23,\n    0xD139, 0xD139, 0x41C8, 0xD13A, 0xD13A, 0x0C24, 0xD13B, 0xD13F, 0x41C9,\n    0xD140, 0xD141, 0x0C25, 0xD142, 0xD142, 0x41CE, 0xD143, 0xD145, 0x0C27,\n    0xD146, 0xD14B, 0x41CF, 0xD14C, 0xD14D, 0x0C2A, 0xD14E, 0xD14F, 0x41D5,\n    0xD150, 0xD150, 0x0C2C, 0xD151, 0xD153, 0x41D7, 0xD154, 0xD154, 0x0C2D,\n    0xD155, 0xD15B, 0x41DA, 0xD15C, 0xD15D, 0x0C2E, 0xD15E, 0xD15E, 0x41E1,\n    0xD15F, 0xD15F, 0x0C30, 0xD160, 0xD160, 0x41E2, 0xD161, 0xD161, 0x0C31,\n    0xD162, 0xD167, 0x41E3, 0xD168, 0xD168, 0x0C32, 0xD169, 0xD16B, 0x41E9,\n    0xD16C, 0xD16C, 0x0C33, 0xD16D, 0xD17B, 0x41EC, 0xD17C, 0xD17C, 0x0C34,\n    0xD17D, 0xD183, 0x41FB, 0xD184, 0xD184, 0x0C35, 0xD185, 0xD187, 0x4202,\n    0xD188, 0xD188, 0x0C36, 0xD189, 0xD19F, 0x4205, 0xD1A0, 0xD1A1, 0x0C37,\n    0xD1A2, 0xD1A3, 0x421C, 0xD1A4, 0xD1A4, 0x0C39, 0xD1A5, 0xD1A7, 0x421E,\n    0xD1A8, 0xD1A8, 0x0C3A, 0xD1A9, 0xD1AF, 0x4221, 0xD1B0, 0xD1B1, 0x0C3B,\n    0xD1B2, 0xD1B2, 0x4228, 0xD1B3, 0xD1B3, 0x0C3D, 0xD1B4, 0xD1B4, 0x4229,\n    0xD1B5, 0xD1B5, 0x0C3E, 0xD1B6, 0xD1B9, 0x422A, 0xD1BA, 0xD1BA, 0x0C3F,\n    0xD1BB, 0xD1BB, 0x422E, 0xD1BC, 0xD1BC, 0x0C40, 0xD1BD, 0xD1BF, 0x422F,\n    0xD1C0, 0xD1C0, 0x0C41, 0xD1C1, 0xD1D7, 0x4232, 0xD1D8, 0xD1D8, 0x0C42,\n    0xD1D9, 0xD1F3, 0x4249, 0xD1F4, 0xD1F4, 0x0C43, 0xD1F5, 0xD1F7, 0x4264,\n    0xD1F8, 0xD1F8, 0x0C44, 0xD1F9, 0xD1FF, 0x4267, 0xD200, 0xD206, 0x426E,\n    0xD207, 0xD207, 0x0C45, 0xD208, 0xD208, 0x4275, 0xD209, 0xD209, 0x0C46,\n    0xD20A, 0xD20F, 0x4276, 0xD210, 0xD210, 0x0C47, 0xD211, 0xD22B, 0x427C,\n    0xD22C, 0xD22D, 0x0C48, 0xD22E, 0xD22F, 0x4297, 0xD230, 0xD230, 0x0C4A,\n    0xD231, 0xD233, 0x4299, 0xD234, 0xD234, 0x0C4B, 0xD235, 0xD23B, 0x429C,\n    0xD23C, 0xD23D, 0x0C4C, 0xD23E, 0xD23E, 0x42A3, 0xD23F, 0xD23F, 0x0C4E,\n    0xD240, 0xD240, 0x42A4, 0xD241, 0xD241, 0x0C4F, 0xD242, 0xD247, 0x42A5,\n    0xD248, 0xD248, 0x0C50, 0xD249, 0xD25B, 0x42AB, 0xD25C, 0xD25C, 0x0C51,\n    0xD25D, 0xD263, 0x42BE, 0xD264, 0xD264, 0x0C52, 0xD265, 0xD27F, 0x42C5,\n    0xD280, 0xD281, 0x0C53, 0xD282, 0xD283, 0x42E0, 0xD284, 0xD284, 0x0C55,\n    0xD285, 0xD287, 0x42E2, 0xD288, 0xD288, 0x0C56, 0xD289, 0xD28F, 0x42E5,\n    0xD290, 0xD291, 0x0C57, 0xD292, 0xD294, 0x42EC, 0xD295, 0xD295, 0x0C59,\n    0xD296, 0xD29B, 0x42EF, 0xD29C, 0xD29C, 0x0C5A, 0xD29D, 0xD29F, 0x42F5,\n    0xD2A0, 0xD2A0, 0x0C5B, 0xD2A1, 0xD2A3, 0x42F8, 0xD2A4, 0xD2A4, 0x0C5C,\n    0xD2A5, 0xD2AB, 0x42FB, 0xD2AC, 0xD2AC, 0x0C5D, 0xD2AD, 0xD2B0, 0x4302,\n    0xD2B1, 0xD2B1, 0x0C5E, 0xD2B2, 0xD2B7, 0x4306, 0xD2B8, 0xD2B9, 0x0C5F,\n    0xD2BA, 0xD2BB, 0x430C, 0xD2BC, 0xD2BC, 0x0C61, 0xD2BD, 0xD2BE, 0x430E,\n    0xD2BF, 0xD2C0, 0x0C62, 0xD2C1, 0xD2C1, 0x4310, 0xD2C2, 0xD2C2, 0x0C64,\n    0xD2C3, 0xD2C7, 0x4311, 0xD2C8, 0xD2C9, 0x0C65, 0xD2CA, 0xD2CA, 0x4316,\n    0xD2CB, 0xD2CB, 0x0C67, 0xD2CC, 0xD2D3, 0x4317, 0xD2D4, 0xD2D4, 0x0C68,\n    0xD2D5, 0xD2D7, 0x431F, 0xD2D8, 0xD2D8, 0x0C69, 0xD2D9, 0xD2DB, 0x4322,\n    0xD2DC, 0xD2DC, 0x0C6A, 0xD2DD, 0xD2E3, 0x4325, 0xD2E4, 0xD2E5, 0x0C6B,\n    0xD2E6, 0xD2EF, 0x432C, 0xD2F0, 0xD2F1, 0x0C6D, 0xD2F2, 0xD2F3, 0x4336,\n    0xD2F4, 0xD2F4, 0x0C6F, 0xD2F5, 0xD2F7, 0x4338, 0xD2F8, 0xD2F8, 0x0C70,\n    0xD2F9, 0xD2FF, 0x433B, 0xD300, 0xD301, 0x0C71, 0xD302, 0xD302, 0x4342,\n    0xD303, 0xD303, 0x0C73, 0xD304, 0xD304, 0x4343, 0xD305, 0xD305, 0x0C74,\n    0xD306, 0xD30B, 0x4344, 0xD30C, 0xD30E, 0x0C75, 0xD30F, 0xD30F, 0x434A,\n    0xD310, 0xD310, 0x0C78, 0xD311, 0xD313, 0x434B, 0xD314, 0xD314, 0x0C79,\n    0xD315, 0xD315, 0x434E, 0xD316, 0xD316, 0x0C7A, 0xD317, 0xD31B, 0x434F,\n    0xD31C, 0xD31D, 0x0C7B, 0xD31E, 0xD31E, 0x4354, 0xD31F, 0xD321, 0x0C7D,\n    0xD322, 0xD324, 0x4355, 0xD325, 0xD325, 0x0C80, 0xD326, 0xD327, 0x4358,\n    0xD328, 0xD329, 0x0C81, 0xD32A, 0xD32B, 0x435A, 0xD32C, 0xD32C, 0x0C83,\n    0xD32D, 0xD32F, 0x435C, 0xD330, 0xD330, 0x0C84, 0xD331, 0xD337, 0x435F,\n    0xD338, 0xD339, 0x0C85, 0xD33A, 0xD33A, 0x4366, 0xD33B, 0xD33D, 0x0C87,\n    0xD33E, 0xD343, 0x4367, 0xD344, 0xD345, 0x0C8A, 0xD346, 0xD37B, 0x436D,\n    0xD37C, 0xD37D, 0x0C8C, 0xD37E, 0xD37F, 0x43A3, 0xD380, 0xD380, 0x0C8E,\n    0xD381, 0xD383, 0x43A5, 0xD384, 0xD384, 0x0C8F, 0xD385, 0xD38B, 0x43A8,\n    0xD38C, 0xD38D, 0x0C90, 0xD38E, 0xD38E, 0x43AF, 0xD38F, 0xD391, 0x0C92,\n    0xD392, 0xD397, 0x43B0, 0xD398, 0xD399, 0x0C95, 0xD39A, 0xD39B, 0x43B6,\n    0xD39C, 0xD39C, 0x0C97, 0xD39D, 0xD39F, 0x43B8, 0xD3A0, 0xD3A0, 0x0C98,\n    0xD3A1, 0xD3A7, 0x43BB, 0xD3A8, 0xD3A9, 0x0C99, 0xD3AA, 0xD3AA, 0x43C2,\n    0xD3AB, 0xD3AB, 0x0C9B, 0xD3AC, 0xD3AC, 0x43C3, 0xD3AD, 0xD3AD, 0x0C9C,\n    0xD3AE, 0xD3B3, 0x43C4, 0xD3B4, 0xD3B4, 0x0C9D, 0xD3B5, 0xD3B7, 0x43CA,\n    0xD3B8, 0xD3B8, 0x0C9E, 0xD3B9, 0xD3BB, 0x43CD, 0xD3BC, 0xD3BC, 0x0C9F,\n    0xD3BD, 0xD3C3, 0x43D0, 0xD3C4, 0xD3C5, 0x0CA0, 0xD3C6, 0xD3C7, 0x43D7,\n    0xD3C8, 0xD3C9, 0x0CA2, 0xD3CA, 0xD3CF, 0x43D9, 0xD3D0, 0xD3D0, 0x0CA4,\n    0xD3D1, 0xD3D7, 0x43DF, 0xD3D8, 0xD3D8, 0x0CA5, 0xD3D9, 0xD3E0, 0x43E6,\n    0xD3E1, 0xD3E1, 0x0CA6, 0xD3E2, 0xD3E2, 0x43EE, 0xD3E3, 0xD3E3, 0x0CA7,\n    0xD3E4, 0xD3EB, 0x43EF, 0xD3EC, 0xD3ED, 0x0CA8, 0xD3EE, 0xD3EF, 0x43F7,\n    0xD3F0, 0xD3F0, 0x0CAA, 0xD3F1, 0xD3F3, 0x43F9, 0xD3F4, 0xD3F4, 0x0CAB,\n    0xD3F5, 0xD3FB, 0x43FC, 0xD3FC, 0xD3FD, 0x0CAC, 0xD3FE, 0xD3FE, 0x4403,\n    0xD3FF, 0xD3FF, 0x0CAE, 0xD400, 0xD400, 0x4404, 0xD401, 0xD401, 0x0CAF,\n    0xD402, 0xD407, 0x4405, 0xD408, 0xD408, 0x0CB0, 0xD409, 0xD41C, 0x440B,\n    0xD41D, 0xD41D, 0x0CB1, 0xD41E, 0xD43F, 0x441F, 0xD440, 0xD440, 0x0CB2,\n    0xD441, 0xD443, 0x4441, 0xD444, 0xD444, 0x0CB3, 0xD445, 0xD45B, 0x4444,\n    0xD45C, 0xD45C, 0x0CB4, 0xD45D, 0xD45F, 0x445B, 0xD460, 0xD460, 0x0CB5,\n    0xD461, 0xD463, 0x445E, 0xD464, 0xD464, 0x0CB6, 0xD465, 0xD46C, 0x4461,\n    0xD46D, 0xD46D, 0x0CB7, 0xD46E, 0xD46E, 0x4469, 0xD46F, 0xD46F, 0x0CB8,\n    0xD470, 0xD477, 0x446A, 0xD478, 0xD479, 0x0CB9, 0xD47A, 0xD47B, 0x4472,\n    0xD47C, 0xD47C, 0x0CBB, 0xD47D, 0xD47E, 0x4474, 0xD47F, 0xD480, 0x0CBC,\n    0xD481, 0xD481, 0x4476, 0xD482, 0xD482, 0x0CBE, 0xD483, 0xD487, 0x4477,\n    0xD488, 0xD489, 0x0CBF, 0xD48A, 0xD48A, 0x447C, 0xD48B, 0xD48B, 0x0CC1,\n    0xD48C, 0xD48C, 0x447D, 0xD48D, 0xD48D, 0x0CC2, 0xD48E, 0xD493, 0x447E,\n    0xD494, 0xD494, 0x0CC3, 0xD495, 0xD4A8, 0x4484, 0xD4A9, 0xD4A9, 0x0CC4,\n    0xD4AA, 0xD4CB, 0x4498, 0xD4CC, 0xD4CC, 0x0CC5, 0xD4CD, 0xD4CF, 0x44BA,\n    0xD4D0, 0xD4D0, 0x0CC6, 0xD4D1, 0xD4D3, 0x44BD, 0xD4D4, 0xD4D4, 0x0CC7,\n    0xD4D5, 0xD4DB, 0x44C0, 0xD4DC, 0xD4DC, 0x0CC8, 0xD4DD, 0xD4DE, 0x44C7,\n    0xD4DF, 0xD4DF, 0x0CC9, 0xD4E0, 0xD4E7, 0x44C9, 0xD4E8, 0xD4E8, 0x0CCA,\n    0xD4E9, 0xD4EB, 0x44D1, 0xD4EC, 0xD4EC, 0x0CCB, 0xD4ED, 0xD4EF, 0x44D4,\n    0xD4F0, 0xD4F0, 0x0CCC, 0xD4F1, 0xD4F7, 0x44D7, 0xD4F8, 0xD4F8, 0x0CCD,\n    0xD4F9, 0xD4FA, 0x44DE, 0xD4FB, 0xD4FB, 0x0CCE, 0xD4FC, 0xD4FC, 0x44E0,\n    0xD4FD, 0xD4FD, 0x0CCF, 0xD4FE, 0xD4FF, 0x44E1, 0xD500, 0xD503, 0x44E3,\n    0xD504, 0xD504, 0x0CD0, 0xD505, 0xD507, 0x44E7, 0xD508, 0xD508, 0x0CD1,\n    0xD509, 0xD50B, 0x44EA, 0xD50C, 0xD50C, 0x0CD2, 0xD50D, 0xD513, 0x44ED,\n    0xD514, 0xD515, 0x0CD3, 0xD516, 0xD516, 0x44F4, 0xD517, 0xD517, 0x0CD5,\n    0xD518, 0xD53B, 0x44F5, 0xD53C, 0xD53D, 0x0CD6, 0xD53E, 0xD53F, 0x4519,\n    0xD540, 0xD540, 0x0CD8, 0xD541, 0xD543, 0x451B, 0xD544, 0xD544, 0x0CD9,\n    0xD545, 0xD54B, 0x451E, 0xD54C, 0xD54D, 0x0CDA, 0xD54E, 0xD54E, 0x4525,\n    0xD54F, 0xD54F, 0x0CDC, 0xD550, 0xD550, 0x4526, 0xD551, 0xD551, 0x0CDD,\n    0xD552, 0xD557, 0x4527, 0xD558, 0xD559, 0x0CDE, 0xD55A, 0xD55B, 0x452D,\n    0xD55C, 0xD55C, 0x0CE0, 0xD55D, 0xD55F, 0x452F, 0xD560, 0xD560, 0x0CE1,\n    0xD561, 0xD564, 0x4532, 0xD565, 0xD565, 0x0CE2, 0xD566, 0xD567, 0x4536,\n    0xD568, 0xD569, 0x0CE3, 0xD56A, 0xD56A, 0x4538, 0xD56B, 0xD56B, 0x0CE5,\n    0xD56C, 0xD56C, 0x4539, 0xD56D, 0xD56D, 0x0CE6, 0xD56E, 0xD573, 0x453A,\n    0xD574, 0xD575, 0x0CE7, 0xD576, 0xD577, 0x4540, 0xD578, 0xD578, 0x0CE9,\n    0xD579, 0xD57B, 0x4542, 0xD57C, 0xD57C, 0x0CEA, 0xD57D, 0xD583, 0x4545,\n    0xD584, 0xD585, 0x0CEB, 0xD586, 0xD586, 0x454C, 0xD587, 0xD589, 0x0CED,\n    0xD58A, 0xD58F, 0x454D, 0xD590, 0xD590, 0x0CF0, 0xD591, 0xD5A4, 0x4553,\n    0xD5A5, 0xD5A5, 0x0CF1, 0xD5A6, 0xD5C7, 0x4567, 0xD5C8, 0xD5C9, 0x0CF2,\n    0xD5CA, 0xD5CB, 0x4589, 0xD5CC, 0xD5CC, 0x0CF4, 0xD5CD, 0xD5CF, 0x458B,\n    0xD5D0, 0xD5D0, 0x0CF5, 0xD5D1, 0xD5D1, 0x458E, 0xD5D2, 0xD5D2, 0x0CF6,\n    0xD5D3, 0xD5D7, 0x458F, 0xD5D8, 0xD5D9, 0x0CF7, 0xD5DA, 0xD5DA, 0x4594,\n    0xD5DB, 0xD5DB, 0x0CF9, 0xD5DC, 0xD5DC, 0x4595, 0xD5DD, 0xD5DD, 0x0CFA,\n    0xD5DE, 0xD5E3, 0x4596, 0xD5E4, 0xD5E5, 0x0CFB, 0xD5E6, 0xD5E7, 0x459C,\n    0xD5E8, 0xD5E8, 0x0CFD, 0xD5E9, 0xD5EB, 0x459E, 0xD5EC, 0xD5EC, 0x0CFE,\n    0xD5ED, 0xD5F3, 0x45A1, 0xD5F4, 0xD5F5, 0x0CFF, 0xD5F6, 0xD5F6, 0x45A8,\n    0xD5F7, 0xD5F7, 0x0D01, 0xD5F8, 0xD5F8, 0x45A9, 0xD5F9, 0xD5F9, 0x0D02,\n    0xD5FA, 0xD5FF, 0x45AA, 0xD600, 0xD601, 0x0D03, 0xD602, 0xD603, 0x45B0,\n    0xD604, 0xD604, 0x0D05, 0xD605, 0xD607, 0x45B2, 0xD608, 0xD608, 0x0D06,\n    0xD609, 0xD60F, 0x45B5, 0xD610, 0xD611, 0x0D07, 0xD612, 0xD612, 0x45BC,\n    0xD613, 0xD615, 0x0D09, 0xD616, 0xD61B, 0x45BD, 0xD61C, 0xD61C, 0x0D0C,\n    0xD61D, 0xD61F, 0x45C3, 0xD620, 0xD620, 0x0D0D, 0xD621, 0xD623, 0x45C6,\n    0xD624, 0xD624, 0x0D0E, 0xD625, 0xD62C, 0x45C9, 0xD62D, 0xD62D, 0x0D0F,\n    0xD62E, 0xD637, 0x45D1, 0xD638, 0xD639, 0x0D10, 0xD63A, 0xD63B, 0x45DB,\n    0xD63C, 0xD63C, 0x0D12, 0xD63D, 0xD63F, 0x45DD, 0xD640, 0xD640, 0x0D13,\n    0xD641, 0xD644, 0x45E0, 0xD645, 0xD645, 0x0D14, 0xD646, 0xD647, 0x45E4,\n    0xD648, 0xD649, 0x0D15, 0xD64A, 0xD64A, 0x45E6, 0xD64B, 0xD64B, 0x0D17,\n    0xD64C, 0xD64C, 0x45E7, 0xD64D, 0xD64D, 0x0D18, 0xD64E, 0xD650, 0x45E8,\n    0xD651, 0xD651, 0x0D19, 0xD652, 0xD653, 0x45EB, 0xD654, 0xD655, 0x0D1A,\n    0xD656, 0xD657, 0x45ED, 0xD658, 0xD658, 0x0D1C, 0xD659, 0xD65B, 0x45EF,\n    0xD65C, 0xD65C, 0x0D1D, 0xD65D, 0xD666, 0x45F2, 0xD667, 0xD667, 0x0D1E,\n    0xD668, 0xD668, 0x45FC, 0xD669, 0xD669, 0x0D1F, 0xD66A, 0xD66F, 0x45FD,\n    0xD670, 0xD671, 0x0D20, 0xD672, 0xD673, 0x4603, 0xD674, 0xD674, 0x0D22,\n    0xD675, 0xD682, 0x4605, 0xD683, 0xD683, 0x0D23, 0xD684, 0xD684, 0x4613,\n    0xD685, 0xD685, 0x0D24, 0xD686, 0xD68B, 0x4614, 0xD68C, 0xD68D, 0x0D25,\n    0xD68E, 0xD68F, 0x461A, 0xD690, 0xD690, 0x0D27, 0xD691, 0xD693, 0x461C,\n    0xD694, 0xD694, 0x0D28, 0xD695, 0xD69C, 0x461F, 0xD69D, 0xD69D, 0x0D29,\n    0xD69E, 0xD69E, 0x4627, 0xD69F, 0xD69F, 0x0D2A, 0xD6A0, 0xD6A0, 0x4628,\n    0xD6A1, 0xD6A1, 0x0D2B, 0xD6A2, 0xD6A7, 0x4629, 0xD6A8, 0xD6A8, 0x0D2C,\n    0xD6A9, 0xD6AB, 0x462F, 0xD6AC, 0xD6AC, 0x0D2D, 0xD6AD, 0xD6AF, 0x4632,\n    0xD6B0, 0xD6B0, 0x0D2E, 0xD6B1, 0xD6B8, 0x4635, 0xD6B9, 0xD6B9, 0x0D2F,\n    0xD6BA, 0xD6BA, 0x463D, 0xD6BB, 0xD6BB, 0x0D30, 0xD6BC, 0xD6C3, 0x463E,\n    0xD6C4, 0xD6C5, 0x0D31, 0xD6C6, 0xD6C7, 0x4646, 0xD6C8, 0xD6C8, 0x0D33,\n    0xD6C9, 0xD6CB, 0x4648, 0xD6CC, 0xD6CC, 0x0D34, 0xD6CD, 0xD6D0, 0x464B,\n    0xD6D1, 0xD6D1, 0x0D35, 0xD6D2, 0xD6D3, 0x464F, 0xD6D4, 0xD6D4, 0x0D36,\n    0xD6D5, 0xD6D6, 0x4651, 0xD6D7, 0xD6D7, 0x0D37, 0xD6D8, 0xD6D8, 0x4653,\n    0xD6D9, 0xD6D9, 0x0D38, 0xD6DA, 0xD6DF, 0x4654, 0xD6E0, 0xD6E0, 0x0D39,\n    0xD6E1, 0xD6E3, 0x465A, 0xD6E4, 0xD6E4, 0x0D3A, 0xD6E5, 0xD6E7, 0x465D,\n    0xD6E8, 0xD6E8, 0x0D3B, 0xD6E9, 0xD6EF, 0x4660, 0xD6F0, 0xD6F0, 0x0D3C,\n    0xD6F1, 0xD6F4, 0x4667, 0xD6F5, 0xD6F5, 0x0D3D, 0xD6F6, 0xD6FB, 0x466B,\n    0xD6FC, 0xD6FD, 0x0D3E, 0xD6FE, 0xD6FF, 0x4671, 0xD700, 0xD700, 0x0D40,\n    0xD701, 0xD703, 0x4673, 0xD704, 0xD704, 0x0D41, 0xD705, 0xD710, 0x4676,\n    0xD711, 0xD711, 0x0D42, 0xD712, 0xD717, 0x4682, 0xD718, 0xD719, 0x0D43,\n    0xD71A, 0xD71B, 0x4688, 0xD71C, 0xD71C, 0x0D45, 0xD71D, 0xD71F, 0x468A,\n    0xD720, 0xD720, 0x0D46, 0xD721, 0xD727, 0x468D, 0xD728, 0xD729, 0x0D47,\n    0xD72A, 0xD72A, 0x4694, 0xD72B, 0xD72B, 0x0D49, 0xD72C, 0xD72C, 0x4695,\n    0xD72D, 0xD72D, 0x0D4A, 0xD72E, 0xD733, 0x4696, 0xD734, 0xD735, 0x0D4B,\n    0xD736, 0xD737, 0x469C, 0xD738, 0xD738, 0x0D4D, 0xD739, 0xD73B, 0x469E,\n    0xD73C, 0xD73C, 0x0D4E, 0xD73D, 0xD743, 0x46A1, 0xD744, 0xD744, 0x0D4F,\n    0xD745, 0xD746, 0x46A8, 0xD747, 0xD747, 0x0D50, 0xD748, 0xD748, 0x46AA,\n    0xD749, 0xD749, 0x0D51, 0xD74A, 0xD74F, 0x46AB, 0xD750, 0xD751, 0x0D52,\n    0xD752, 0xD753, 0x46B1, 0xD754, 0xD754, 0x0D54, 0xD755, 0xD755, 0x46B3,\n    0xD756, 0xD759, 0x0D55, 0xD75A, 0xD75F, 0x46B4, 0xD760, 0xD761, 0x0D59,\n    0xD762, 0xD762, 0x46BA, 0xD763, 0xD763, 0x0D5B, 0xD764, 0xD764, 0x46BB,\n    0xD765, 0xD765, 0x0D5C, 0xD766, 0xD768, 0x46BC, 0xD769, 0xD769, 0x0D5D,\n    0xD76A, 0xD76B, 0x46BF, 0xD76C, 0xD76C, 0x0D5E, 0xD76D, 0xD76F, 0x46C1,\n    0xD770, 0xD770, 0x0D5F, 0xD771, 0xD773, 0x46C4, 0xD774, 0xD774, 0x0D60,\n    0xD775, 0xD77B, 0x46C7, 0xD77C, 0xD77D, 0x0D61, 0xD77E, 0xD780, 0x46CE,\n    0xD781, 0xD781, 0x0D63, 0xD782, 0xD787, 0x46D1, 0xD788, 0xD789, 0x0D64,\n    0xD78A, 0xD78B, 0x46D7, 0xD78C, 0xD78C, 0x0D66, 0xD78D, 0xD78F, 0x46D9,\n    0xD790, 0xD790, 0x0D67, 0xD791, 0xD797, 0x46DC, 0xD798, 0xD799, 0x0D68,\n    0xD79A, 0xD79A, 0x46E3, 0xD79B, 0xD79B, 0x0D6A, 0xD79C, 0xD79C, 0x46E4,\n    0xD79D, 0xD79D, 0x0D6B, 0xD79E, 0xD7A3, 0x46E5, 0xF900, 0xF900, 0x1014,\n    0xF901, 0xF901, 0x0E5E, 0xF902, 0xF902, 0x1B8D, 0xF903, 0xF903, 0x0D84,\n    0xF904, 0xF904, 0x1EDC, 0xF905, 0xF905, 0x0EDA, 0xF906, 0xF906, 0x0F3E,\n    0xF907, 0xF907, 0x0F6A, 0xF908, 0xF908, 0x0F6A, 0xF909, 0xF909, 0x0E7C,\n    0xF90A, 0xF90A, 0x1023, 0xF90B, 0xF90B, 0x1116, 0xF90C, 0xF90C, 0x103C,\n    0xF90D, 0xF913, 0x1117, 0xF914, 0xF914, 0x16A8, 0xF915, 0xF917, 0x111E,\n    0xF918, 0xF91D, 0x1122, 0xF91E, 0xF920, 0x112A, 0xF921, 0xF921, 0x112F,\n    0xF922, 0xF922, 0x1133, 0xF923, 0xF924, 0x1136, 0xF925, 0xF92B, 0x1139,\n    0xF92C, 0xF92D, 0x1143, 0xF92E, 0xF92E, 0x1148, 0xF92F, 0xF92F, 0x119F,\n    0xF930, 0xF931, 0x11A1, 0xF932, 0xF937, 0x11A5, 0xF938, 0xF93A, 0x11AC,\n    0xF93B, 0xF940, 0x11B0, 0xF941, 0xF943, 0x11B7, 0xF944, 0xF945, 0x11BD,\n    0xF946, 0xF948, 0x11C1, 0xF949, 0xF949, 0x11C6, 0xF94A, 0xF94A, 0x11D4,\n    0xF94B, 0xF94E, 0x11D6, 0xF94F, 0xF950, 0x11DB, 0xF951, 0xF951, 0x11E0,\n    0xF952, 0xF955, 0x11FC, 0xF956, 0xF959, 0x1201, 0xF95A, 0xF95A, 0x10DE,\n    0xF95B, 0xF95B, 0x1028, 0xF95C, 0xF95C, 0x16A8, 0xF95D, 0xF95D, 0x102B,\n    0xF95E, 0xF95E, 0x1060, 0xF95F, 0xF95F, 0x1047, 0xF960, 0xF960, 0x104C,\n    0xF961, 0xF961, 0x15B0, 0xF962, 0xF962, 0x1918, 0xF963, 0xF963, 0x141F,\n    0xF964, 0xF964, 0x133A, 0xF965, 0xF965, 0x1D5E, 0xF966, 0xF966, 0x13D7,\n    0xF967, 0xF967, 0x13F5, 0xF968, 0xF968, 0x1DB7, 0xF969, 0xF969, 0x15D0,\n    0xF96A, 0xF96A, 0x14F7, 0xF96B, 0xF96B, 0x1BAB, 0xF96C, 0xF96C, 0x14F2,\n    0xF96D, 0xF96D, 0x156D, 0xF96E, 0xF96E, 0x1771, 0xF96F, 0xF96F, 0x1554,\n    0xF970, 0xF970, 0x14C5, 0xF971, 0xF971, 0x1B61, 0xF972, 0xF972, 0x1CCA,\n    0xF973, 0xF973, 0x162E, 0xF974, 0xF974, 0x16F2, 0xF975, 0xF977, 0x1149,\n    0xF978, 0xF97A, 0x114D, 0xF97B, 0xF97D, 0x1153, 0xF97E, 0xF97E, 0x1157,\n    0xF97F, 0xF980, 0x115A, 0xF981, 0xF981, 0x103F, 0xF982, 0xF982, 0x115C,\n    0xF983, 0xF983, 0x115F, 0xF984, 0xF985, 0x1161, 0xF986, 0xF986, 0x1165,\n    0xF987, 0xF98C, 0x1167, 0xF98D, 0xF98D, 0x116F, 0xF98E, 0xF98E, 0x1040,\n    0xF98F, 0xF990, 0x1171, 0xF991, 0xF991, 0x1041, 0xF992, 0xF994, 0x1174,\n    0xF995, 0xF995, 0x1042, 0xF996, 0xF997, 0x1177, 0xF998, 0xF998, 0x117A,\n    0xF999, 0xF999, 0x1179, 0xF99A, 0xF99B, 0x117B, 0xF99C, 0xF99D, 0x117E,\n    0xF99E, 0xF99E, 0x192F, 0xF99F, 0xF9A0, 0x1181, 0xF9A1, 0xF9A1, 0x1554,\n    0xF9A2, 0xF9A2, 0x1183, 0xF9A3, 0xF9A3, 0x1043, 0xF9A4, 0xF9A4, 0x1046,\n    0xF9A5, 0xF9A5, 0x1185, 0xF9A6, 0xF9A8, 0x1187, 0xF9A9, 0xF9A9, 0x118B,\n    0xF9AA, 0xF9AA, 0x1047, 0xF9AB, 0xF9AD, 0x118D, 0xF9AE, 0xF9AE, 0x1E67,\n    0xF9AF, 0xF9AF, 0x1191, 0xF9B0, 0xF9B0, 0x1193, 0xF9B1, 0xF9B4, 0x1195,\n    0xF9B5, 0xF9B5, 0x119A, 0xF9B6, 0xF9B8, 0x119C, 0xF9B9, 0xF9B9, 0x16A5,\n    0xF9BA, 0xF9BC, 0x11C7, 0xF9BD, 0xF9BD, 0x1054, 0xF9BE, 0xF9BE, 0x11CB,\n    0xF9BF, 0xF9BF, 0x16A8, 0xF9C0, 0xF9C1, 0x11CC, 0xF9C2, 0xF9C3, 0x11D0,\n    0xF9C4, 0xF9C4, 0x11D3, 0xF9C5, 0xF9C5, 0x1F34, 0xF9C6, 0xF9C6, 0x17EB,\n    0xF9C7, 0xF9C7, 0x11E1, 0xF9C8, 0xF9C8, 0x1057, 0xF9C9, 0xF9C9, 0x11E3,\n    0xF9CA, 0xF9CB, 0x11E5, 0xF9CC, 0xF9CC, 0x11E8, 0xF9CD, 0xF9CD, 0x11EA,\n    0xF9CE, 0xF9CE, 0x11EC, 0xF9CF, 0xF9CF, 0x1058, 0xF9D0, 0xF9D3, 0x11EE,\n    0xF9D4, 0xF9D6, 0x11F3, 0xF9D7, 0xF9DA, 0x11F7, 0xF9DB, 0xF9DB, 0x15B0,\n    0xF9DC, 0xF9DC, 0x11FB, 0xF9DD, 0xF9DD, 0x1206, 0xF9DE, 0xF9DE, 0x1208,\n    0xF9DF, 0xF9DF, 0x120A, 0xF9E0, 0xF9E0, 0x173E, 0xF9E1, 0xF9E2, 0x120C,\n    0xF9E3, 0xF9E3, 0x105B, 0xF9E4, 0xF9E4, 0x1211, 0xF9E5, 0xF9E5, 0x1213,\n    0xF9E6, 0xF9E6, 0x1215, 0xF9E7, 0xF9E9, 0x1218, 0xF9EA, 0xF9EA, 0x121C,\n    0xF9EB, 0xF9EC, 0x105C, 0xF9ED, 0xF9ED, 0x121E, 0xF9EE, 0xF9F0, 0x1220,\n    0xF9F1, 0xF9F5, 0x1224, 0xF9F6, 0xF9F6, 0x122A, 0xF9F7, 0xF9F9, 0x122D,\n    0xF9FA, 0xF9FA, 0x14E7, 0xF9FB, 0xF9FB, 0x195E, 0xF9FC, 0xF9FC, 0x1663,\n    0xF9FD, 0xF9FD, 0x168B, 0xF9FE, 0xF9FE, 0x105F, 0xF9FF, 0xF9FF, 0x1954,\n    0xFA00, 0xFA00, 0x1A1C, 0xFA01, 0xFA01, 0x10B7, 0xFA02, 0xFA02, 0x1BE3,\n    0xFA03, 0xFA03, 0x1097, 0xFA04, 0xFA04, 0x10AA, 0xFA05, 0xFA05, 0x10F4,\n    0xFA06, 0xFA06, 0x1D94, 0xFA07, 0xFA07, 0x13E0, 0xFA08, 0xFA08, 0x1E1D,\n    0xFA09, 0xFA09, 0x0DE6, 0xFA0A, 0xFA0A, 0x0E3C, 0xFA0B, 0xFA0B, 0x0EE7,\n    0xFF01, 0xFF3B, 0x0108, 0xFF3C, 0xFF3C, 0x0070, 0xFF3D, 0xFF5D, 0x0144,\n    0xFF5E, 0xFF5E, 0x0071, 0xFFE0, 0xFFE1, 0x008F, 0xFFE2, 0xFFE2, 0x00C2,\n    0xFFE3, 0xFFE3, 0x0165, 0xFFE5, 0xFFE5, 0x0091, 0xFFE6, 0xFFE6, 0x0143,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-V_1.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_UniKS_UCS2_V_1[18 * 3] = {\n    0x2013, 0x2014, 0x1F7B, 0x2016, 0x2016, 0x1F7D, 0x2025, 0x2025, 0x1F7A,\n    0x3001, 0x3002, 0x1F78, 0x3008, 0x3011, 0x1F81, 0x3013, 0x3013, 0x1F8B,\n    0x3014, 0x3015, 0x1F7F, 0xFF01, 0xFF01, 0x1F8C, 0xFF08, 0xFF09, 0x1F8D,\n    0xFF0C, 0xFF0C, 0x1F8F, 0xFF0E, 0xFF0E, 0x1F90, 0xFF1A, 0xFF1F, 0x1F91,\n    0xFF3B, 0xFF3B, 0x1F97, 0xFF3D, 0xFF3D, 0x1F98, 0xFF3F, 0xFF3F, 0x1F99,\n    0xFF5B, 0xFF5D, 0x1F9A, 0xFF5E, 0xFF5E, 0x1F7E, 0xFFE3, 0xFFE3, 0x1F9D,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UTF16-H_0.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nextern const unsigned short g_FXCMAP_UniKS_UTF16_H_0[158 * 2] = {\n    0x00A9, 0x0062, 0x2010, 0x0061, 0x20A9, 0x0060, 0x2F00, 0x193C,\n    0x2F04, 0x18EC, 0x2F06, 0x190D, 0x2F08, 0x192B, 0x2F0A, 0x194D,\n    0x2F0B, 0x1D4B, 0x2F11, 0x10AE, 0x2F12, 0x116A, 0x2F14, 0x143F,\n    0x2F17, 0x168C, 0x2F18, 0x13D5, 0x2F1C, 0x1839, 0x2F1D, 0x0F3D,\n    0x2F1F, 0x1D1B, 0x2F20, 0x1487, 0x2F23, 0x151B, 0x2F24, 0x109D,\n    0x2F25, 0x103F, 0x2F26, 0x1958, 0x2F28, 0x1C4F, 0x2F29, 0x1580,\n    0x2F2B, 0x1641, 0x2F2D, 0x14B9, 0x2F2F, 0x0ECF, 0x2F30, 0x0FED,\n    0x2F31, 0x0E14, 0x2F32, 0x0D99, 0x2F38, 0x0F7C, 0x2F3C, 0x1684,\n    0x2F3D, 0x0EDC, 0x2F3E, 0x1E80, 0x2F3F, 0x15CC, 0x2F40, 0x1B27,\n    0x2F42, 0x12E8, 0x2F43, 0x10FD, 0x2F44, 0x0FBB, 0x2F45, 0x1356,\n    0x2F46, 0x12D3, 0x2F47, 0x1940, 0x2F48, 0x17ED, 0x2F49, 0x1889,\n    0x2F4A, 0x12B4, 0x2F4B, 0x1F5B, 0x2F4C, 0x1B2C, 0x2F4F, 0x12D6,\n    0x2F50, 0x144C, 0x2F51, 0x12A8, 0x2F52, 0x168E, 0x2F54, 0x15D3,\n    0x2F55, 0x1EBB, 0x2F56, 0x1A93, 0x2F57, 0x1409, 0x2F58, 0x1F1A,\n    0x2F5A, 0x1D61, 0x2F5B, 0x1696, 0x2F5C, 0x1842, 0x2F5D, 0x0E37,\n    0x2F5E, 0x1E3D, 0x2F5F, 0x17C1, 0x2F60, 0x0EDE, 0x2F61, 0x17D4,\n    0x2F62, 0x0DC1, 0x2F63, 0x14FA, 0x2F64, 0x182D, 0x2F65, 0x1A08,\n    0x2F66, 0x1DBA, 0x2F69, 0x1381, 0x2F6A, 0x1DB0, 0x2F6B, 0x1293,\n    0x2F6C, 0x12B7, 0x2F6D, 0x12AD, 0x2F6E, 0x164D, 0x2F6F, 0x1525,\n    0x2F70, 0x164E, 0x2F72, 0x1EBE, 0x2F73, 0x1E4B, 0x2F74, 0x122D,\n    0x2F75, 0x1AF4, 0x2F76, 0x12FF, 0x2F78, 0x140C, 0x2F7A, 0x1708,\n    0x2F7B, 0x184A, 0x2F7C, 0x11A7, 0x2F7D, 0x191B, 0x2F7F, 0x191C,\n    0x2F80, 0x18E0, 0x2F81, 0x18D5, 0x2F82, 0x1675, 0x2F83, 0x1966,\n    0x2F84, 0x1B37, 0x2F85, 0x0F5A, 0x2F86, 0x1550, 0x2F87, 0x1BF6,\n    0x2F88, 0x1AE8, 0x2F89, 0x0DA8, 0x2F8A, 0x14F8, 0x2F8B, 0x1C40,\n    0x2F8E, 0x1E4C, 0x2F8F, 0x1E1D, 0x2F90, 0x1909, 0x2F92, 0x0E3C,\n    0x2F93, 0x0D92, 0x2F94, 0x1721, 0x2F95, 0x0EBC, 0x2F96, 0x1103,\n    0x2F97, 0x1656, 0x2F99, 0x1D58, 0x2F9A, 0x19EC, 0x2F9B, 0x1AEC,\n    0x2F9C, 0x1AAE, 0x2F9D, 0x167B, 0x2F9E, 0x1B8D, 0x2F9F, 0x167C,\n    0x2FA0, 0x1B61, 0x2FA2, 0x18F5, 0x2FA3, 0x18D0, 0x2FA5, 0x121A,\n    0x2FA6, 0x1023, 0x2FA7, 0x19A8, 0x2FA8, 0x12EE, 0x2FA9, 0x141B,\n    0x2FAC, 0x1853, 0x2FAD, 0x1C23, 0x2FAE, 0x1464, 0x2FAF, 0x1288,\n    0x2FB0, 0x1E35, 0x2FB1, 0x18A3, 0x2FB3, 0x18F1, 0x2FB4, 0x1E4D,\n    0x2FB5, 0x1DAB, 0x2FB6, 0x1465, 0x2FB7, 0x1665, 0x2FB8, 0x15F9,\n    0x2FB9, 0x1E26, 0x2FBA, 0x1235, 0x2FBB, 0x0EC9, 0x2FBC, 0x0EB5,\n    0x2FC1, 0x0F99, 0x2FC2, 0x1716, 0x2FC3, 0x1AAB, 0x2FC4, 0x11AF,\n    0x2FC5, 0x11B5, 0x2FC6, 0x1276, 0x2FC7, 0x1237, 0x2FC8, 0x1EF7,\n    0x2FC9, 0x1519, 0x2FCA, 0x1F52, 0x2FCD, 0x1A66, 0x2FCE, 0x0EB6,\n    0x2FCF, 0x151A, 0x2FD0, 0x1466, 0x2FD1, 0x1A7D, 0x2FD2, 0x1CBF,\n    0x2FD3, 0x11D3, 0x2FD4, 0x0F6A,\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/Korea1/cmaps_korea1.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../../include/fpdfapi/fpdf_resource.h\"\n#include \"../../../../include/fpdfapi/fpdf_module.h\"\n#include \"../../fpdf_font/font_int.h\"\n#include \"../cmap_int.h\"\nextern const FX_WORD g_FXCMAP_KSC_EUC_H_0[];\nextern const FX_WORD g_FXCMAP_KSC_EUC_V_0[];\nextern const FX_WORD g_FXCMAP_KSCms_UHC_H_1[];\nextern const FX_WORD g_FXCMAP_KSCms_UHC_V_1[];\nextern const FX_WORD g_FXCMAP_KSCms_UHC_HW_H_1[];\nextern const FX_WORD g_FXCMAP_KSCms_UHC_HW_V_1[];\nextern const FX_WORD g_FXCMAP_KSCpc_EUC_H_0[];\nextern const FX_WORD g_FXCMAP_UniKS_UCS2_H_1[];\nextern const FX_WORD g_FXCMAP_UniKS_UCS2_V_1[];\nextern const FX_WORD g_FXCMAP_UniKS_UTF16_H_0[];\nextern const FX_WORD g_FXCMAP_Korea1CID2Unicode_2[];\nconst FXCMAP_CMap g_FXCMAP_Korea1_cmaps[] = {\n    { \"KSC-EUC-H\", FXCMAP_CMap::Range, g_FXCMAP_KSC_EUC_H_0, 467, FXCMAP_CMap::None, NULL, 0, 0 },\n    { \"KSC-EUC-V\", FXCMAP_CMap::Range, g_FXCMAP_KSC_EUC_V_0, 16, FXCMAP_CMap::None, NULL, 0, -1 },\n    { \"KSCms-UHC-H\", FXCMAP_CMap::Range, g_FXCMAP_KSCms_UHC_H_1, 675, FXCMAP_CMap::None, NULL, 0, -2 },\n    { \"KSCms-UHC-V\", FXCMAP_CMap::Range, g_FXCMAP_KSCms_UHC_V_1, 16, FXCMAP_CMap::None, NULL, 0, -1 },\n    { \"KSCms-UHC-HW-H\", FXCMAP_CMap::Range, g_FXCMAP_KSCms_UHC_HW_H_1, 675, FXCMAP_CMap::None, NULL, 0, 0 },\n    { \"KSCms-UHC-HW-V\", FXCMAP_CMap::Range, g_FXCMAP_KSCms_UHC_HW_V_1, 16, FXCMAP_CMap::None, NULL, 0, -1 },\n    { \"KSCpc-EUC-H\", FXCMAP_CMap::Range, g_FXCMAP_KSCpc_EUC_H_0, 509, FXCMAP_CMap::None, NULL, 0, -6 },\n    { \"UniKS-UCS2-H\", FXCMAP_CMap::Range, g_FXCMAP_UniKS_UCS2_H_1, 8394, FXCMAP_CMap::None, NULL, 0, 0 },\n    { \"UniKS-UCS2-V\", FXCMAP_CMap::Range, g_FXCMAP_UniKS_UCS2_V_1, 18, FXCMAP_CMap::None, NULL, 0, -1 },\n    { \"UniKS-UTF16-H\", FXCMAP_CMap::Single, g_FXCMAP_UniKS_UTF16_H_0, 158, FXCMAP_CMap::None, NULL, 0, -2 },\n    { \"UniKS-UTF16-V\", FXCMAP_CMap::Range, g_FXCMAP_UniKS_UCS2_V_1, 18, FXCMAP_CMap::None, NULL, 0, -1 },\n};\nvoid CPDF_ModuleMgr::LoadEmbeddedKorea1CMaps()\n{\n    CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();\n    pFontGlobals->m_EmbeddedCharsets[CIDSET_KOREA1].m_pMapList = g_FXCMAP_Korea1_cmaps;\n    pFontGlobals->m_EmbeddedCharsets[CIDSET_KOREA1].m_Count = sizeof g_FXCMAP_Korea1_cmaps / sizeof (FXCMAP_CMap);\n    pFontGlobals->m_EmbeddedToUnicodes[CIDSET_KOREA1].m_pMap = g_FXCMAP_Korea1CID2Unicode_2;\n    pFontGlobals->m_EmbeddedToUnicodes[CIDSET_KOREA1].m_Count = 18352;\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/cmap_int.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDFAPI_CMAP_INT_H_\n#define _FPDFAPI_CMAP_INT_H_\nstruct FXCMAP_CMap {\n    typedef enum { None, Single, Range, Reverse } MapType;\n    const char*\t\tm_Name;\n    MapType\t\t\tm_WordMapType;\n    const FX_WORD*\tm_pWordMap;\n    int\t\t\t\tm_WordCount;\n    MapType\t\t\tm_DWordMapType;\n    const FX_WORD*\tm_pDWordMap;\n    int\t\t\t\tm_DWordCount;\n    int\t\t\t\tm_UseOffset;\n};\n#endif\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_cmaps/fpdf_cmaps.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_resource.h\"\n#include \"../../../include/fpdfapi/fpdf_module.h\"\n#include \"../fpdf_font/font_int.h\"\n#include \"cmap_int.h\"\nvoid FPDFAPI_FindEmbeddedCMap(const char* name, int charset, int coding, const FXCMAP_CMap*& pMap)\n{\n    pMap = NULL;\n    CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();\n    const FXCMAP_CMap* pCMaps = pFontGlobals->m_EmbeddedCharsets[charset].m_pMapList;\n    int nCMaps = pFontGlobals->m_EmbeddedCharsets[charset].m_Count;\n    for (int i = 0; i < nCMaps; i ++) {\n        if (FXSYS_strcmp(name, pCMaps[i].m_Name)) {\n            continue;\n        }\n        pMap = &pCMaps[i];\n        break;\n    }\n}\nextern \"C\" {\n    static int compareWord(const void* p1, const void* p2)\n    {\n        return (*(FX_WORD*)p1) - (*(FX_WORD*)p2);\n    }\n};\nextern \"C\" {\n    static int compareWordRange(const void* key, const void* element)\n    {\n        if (*(FX_WORD*)key < * (FX_WORD*)element) {\n            return -1;\n        }\n        if (*(FX_WORD*)key > ((FX_WORD*)element)[1]) {\n            return 1;\n        }\n        return 0;\n    }\n};\nextern \"C\" {\n    static int compareDWordRange(const void* p1, const void* p2)\n    {\n        FX_DWORD key = *(FX_DWORD*)p1;\n        FX_WORD hiword = (FX_WORD)(key >> 16);\n        FX_WORD* element = (FX_WORD*)p2;\n        if (hiword < element[0]) {\n            return -1;\n        }\n        if (hiword > element[0]) {\n            return 1;\n        }\n        FX_WORD loword = (FX_WORD)key;\n        if (loword < element[1]) {\n            return -1;\n        }\n        if (loword > element[2]) {\n            return 1;\n        }\n        return 0;\n    }\n};\nextern \"C\" {\n    static int compareDWordSingle(const void* p1, const void* p2)\n    {\n        FX_DWORD key = *(FX_DWORD*)p1;\n        FX_DWORD value = ((*(FX_WORD*)p2) << 16) | ((FX_WORD*)p2)[1];\n        if (key < value) {\n            return -1;\n        }\n        if (key > value) {\n            return 1;\n        }\n        return 0;\n    }\n};\nFX_WORD FPDFAPI_CIDFromCharCode(const FXCMAP_CMap* pMap, FX_DWORD charcode)\n{\n    if (charcode >> 16) {\n        while (1) {\n            if (pMap->m_DWordMapType == FXCMAP_CMap::Range) {\n                FX_WORD* found = (FX_WORD*)FXSYS_bsearch(&charcode, pMap->m_pDWordMap, pMap->m_DWordCount, 8, compareDWordRange);\n                if (found) {\n                    return found[3] + (FX_WORD)charcode - found[1];\n                }\n            } else if (pMap->m_DWordMapType == FXCMAP_CMap::Single) {\n                FX_WORD* found = (FX_WORD*)FXSYS_bsearch(&charcode, pMap->m_pDWordMap, pMap->m_DWordCount, 6, compareDWordSingle);\n                if (found) {\n                    return found[2];\n                }\n            }\n            if (pMap->m_UseOffset == 0) {\n                return 0;\n            }\n            pMap = pMap + pMap->m_UseOffset;\n        }\n        return 0;\n    }\n    FX_WORD code = (FX_WORD)charcode;\n    while (1) {\n        if (pMap->m_pWordMap == NULL) {\n            return 0;\n        }\n        if (pMap->m_WordMapType == FXCMAP_CMap::Single) {\n            FX_WORD* found = (FX_WORD*)FXSYS_bsearch(&code, pMap->m_pWordMap, pMap->m_WordCount, 4, compareWord);\n            if (found) {\n                return found[1];\n            }\n        } else if (pMap->m_WordMapType == FXCMAP_CMap::Range) {\n            FX_WORD* found = (FX_WORD*)FXSYS_bsearch(&code, pMap->m_pWordMap, pMap->m_WordCount, 6, compareWordRange);\n            if (found) {\n                return found[2] + code - found[0];\n            }\n        }\n        if (pMap->m_UseOffset == 0) {\n            return 0;\n        }\n        pMap = pMap + pMap->m_UseOffset;\n    }\n    return 0;\n}\nFX_DWORD FPDFAPI_CharCodeFromCID(const FXCMAP_CMap* pMap, FX_WORD cid)\n{\n    while (1) {\n        if (pMap->m_WordMapType == FXCMAP_CMap::Single) {\n            const FX_WORD *pCur = pMap->m_pWordMap;\n            const FX_WORD *pEnd = pMap->m_pWordMap + pMap->m_WordCount * 2;\n            while (pCur < pEnd) {\n                if (pCur[1] == cid) {\n                    return pCur[0];\n                }\n                pCur += 2;\n            }\n        } else if (pMap->m_WordMapType == FXCMAP_CMap::Range) {\n            const FX_WORD *pCur = pMap->m_pWordMap;\n            const FX_WORD *pEnd = pMap->m_pWordMap + pMap->m_WordCount * 3;\n            while (pCur < pEnd) {\n                if (cid >= pCur[2] && cid <= pCur[2] + pCur[1] - pCur[0]) {\n                    return pCur[0] + cid - pCur[2];\n                }\n                pCur += 3;\n            }\n        }\n        if (pMap->m_UseOffset == 0) {\n            return 0;\n        }\n        pMap = pMap + pMap->m_UseOffset;\n    }\n    while (1) {\n        if (pMap->m_DWordMapType == FXCMAP_CMap::Range) {\n            const FX_WORD *pCur = pMap->m_pDWordMap;\n            const FX_WORD *pEnd = pMap->m_pDWordMap + pMap->m_DWordCount * 4;\n            while (pCur < pEnd) {\n                if (cid >= pCur[3] && cid <= pCur[3] + pCur[2] - pCur[1]) {\n                    return (((FX_DWORD)pCur[0] << 16) | pCur[1]) + cid - pCur[3];\n                }\n                pCur += 4;\n            }\n        } else if (pMap->m_DWordMapType == FXCMAP_CMap::Single) {\n            const FX_WORD *pCur = pMap->m_pDWordMap;\n            const FX_WORD *pEnd = pMap->m_pDWordMap + pMap->m_DWordCount * 3;\n            while (pCur < pEnd) {\n                if (pCur[2] == cid) {\n                    return ((FX_DWORD)pCur[0] << 16) | pCur[1];\n                }\n                pCur += 3;\n            }\n        }\n        if (pMap->m_UseOffset == 0) {\n            return 0;\n        }\n        pMap = pMap + pMap->m_UseOffset;\n    }\n    return 0;\n}\nvoid FPDFAPI_LoadCID2UnicodeMap(int charset, const FX_WORD*& pMap, FX_DWORD& count)\n{\n    CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();\n    pMap = pFontGlobals->m_EmbeddedToUnicodes[charset].m_pMap;\n    count = pFontGlobals->m_EmbeddedToUnicodes[charset].m_Count;\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_edit/editint.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDF_EDITINT_\n#define _FPDF_EDITINT_\nclass CPDF_ObjectStream : public CFX_Object\n{\npublic:\n    CPDF_ObjectStream();\n\n    FX_BOOL\t\t\t\tStart();\n\n    FX_INT32\t\t\tCompressIndirectObject(FX_DWORD dwObjNum, const CPDF_Object *pObj);\n    FX_INT32\t\t\tCompressIndirectObject(FX_DWORD dwObjNum, FX_LPCBYTE pBuffer, FX_DWORD dwSize);\n\n    FX_FILESIZE\t\t\tEnd(CPDF_Creator* pCreator);\n\n    CFX_DWordArray\t\tm_ObjNumArray;\n\n    CFX_ByteTextBuf\t\tm_Buffer;\n    FX_DWORD\t\t\tm_dwObjNum;\n    FX_INT32\t\t\tm_index;\nprotected:\n\n    CFX_DWordArray\t\tm_OffsetArray;\n};\nclass CPDF_XRefStream : public CFX_Object\n{\npublic:\n\n    CPDF_XRefStream();\n\n    FX_BOOL\t\t\t\tStart();\n\n    FX_INT32\t\t\tCompressIndirectObject(FX_DWORD dwObjNum, const CPDF_Object *pObj, CPDF_Creator *pCreator);\n\n    FX_INT32\t\t\tCompressIndirectObject(FX_DWORD dwObjNum, FX_LPCBYTE pBuffer, FX_DWORD dwSize, CPDF_Creator *pCreator);\n\n    FX_BOOL\t\t\t\tEnd(CPDF_Creator *pCreator, FX_BOOL bEOF = FALSE);\n    FX_BOOL\t\t\t\tAddObjectNumberToIndexArray(FX_DWORD objnum);\n    FX_BOOL\t\t\t\tEndXRefStream(CPDF_Creator* pCreator);\n\n\n    CFX_DWordArray\t\tm_IndexArray;\n\n    FX_FILESIZE\t\t\tm_PrevOffset;\n    FX_DWORD\t\t\tm_dwTempObjNum;\n\nprotected:\n    FX_INT32\t\t\tEndObjectStream(CPDF_Creator *pCreator, FX_BOOL bEOF = TRUE);\n    FX_BOOL\t\t\t\tGenerateXRefStream(CPDF_Creator* pCreator, FX_BOOL bEOF);\n    FX_INT32\t\t\tm_iSeg;\n    CPDF_ObjectStream\tm_ObjStream;\n    CFX_ByteTextBuf\t\tm_Buffer;\n};\n#endif\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_edit/fpdf_edit_content.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_page.h\"\n#include \"../../../include/fpdfapi/fpdf_serial.h\"\n#include \"../../../include/fpdfapi/fpdf_module.h\"\n#include \"../../../include/fxcodec/fx_codec.h\"\n#include \"../fpdf_page/pageint.h\"\nCFX_ByteTextBuf& operator << (CFX_ByteTextBuf& ar, CFX_AffineMatrix& matrix)\n{\n    ar << matrix.a << \" \" << matrix.b << \" \" << matrix.c << \" \" << matrix.d << \" \" << matrix.e << \" \" << matrix.f;\n    return ar;\n}\nCPDF_PageContentGenerate::CPDF_PageContentGenerate(CPDF_Page* pPage) : m_pPage(pPage)\n{\n    m_pDocument = NULL;\n    if (m_pPage) {\n        m_pDocument = m_pPage->m_pDocument;\n    }\n}\nCPDF_PageContentGenerate::~CPDF_PageContentGenerate()\n{\n    for (int i = 0; i < m_pageObjects.GetSize(); ++i) {\n        CPDF_PageObject* pPageObj = (CPDF_PageObject*)m_pageObjects[i];\n        if (pPageObj) {\n            pPageObj->Release();\n        }\n    }\n}\nFX_BOOL CPDF_PageContentGenerate::InsertPageObject(CPDF_PageObject* pPageObject)\n{\n    if (!pPageObject) {\n        return FALSE;\n    }\n    return m_pageObjects.Add(pPageObject);\n}\nvoid CPDF_PageContentGenerate::GenerateContent()\n{\n    CFX_ByteTextBuf buf;\n    CPDF_Dictionary* pPageDict = m_pPage->m_pFormDict;\n    for (int i = 0; i < m_pageObjects.GetSize(); ++i) {\n        CPDF_PageObject* pPageObj = (CPDF_PageObject*)m_pageObjects[i];\n        if (!pPageObj || pPageObj->m_Type != PDFPAGE_IMAGE) {\n            continue;\n        }\n        ProcessImage(buf, (CPDF_ImageObject*)pPageObj);\n    }\n    CPDF_Object* pContent = pPageDict ? pPageDict->GetElementValue(\"Contents\") : NULL;\n    if (pContent != NULL) {\n        pPageDict->RemoveAt(\"Contents\");\n    }\n    CPDF_Stream* pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);\n    pStream->SetData(buf.GetBuffer(), buf.GetLength(), FALSE, FALSE);\n    m_pDocument->AddIndirectObject(pStream);\n    pPageDict->SetAtReference(\"Contents\", m_pDocument, pStream->GetObjNum());\n}\nCFX_ByteString CPDF_PageContentGenerate::RealizeResource(CPDF_Object* pResourceObj, const FX_CHAR* szType)\n{\n    if (m_pPage->m_pResources == NULL) {\n        m_pPage->m_pResources = FX_NEW CPDF_Dictionary;\n        int objnum = m_pDocument->AddIndirectObject(m_pPage->m_pResources);\n        m_pPage->m_pFormDict->SetAtReference(\"Resources\", m_pDocument, objnum);\n    }\n    CPDF_Dictionary* pResList = m_pPage->m_pResources->GetDict(szType);\n    if (pResList == NULL) {\n        pResList = FX_NEW CPDF_Dictionary;\n        m_pPage->m_pResources->SetAt(szType, pResList);\n    }\n    m_pDocument->AddIndirectObject(pResourceObj);\n    CFX_ByteString name;\n    int idnum = 1;\n    while (1) {\n        name.Format(\"FX%c%d\", szType[0], idnum);\n        if (!pResList->KeyExist(name)) {\n            break;\n        }\n        idnum ++;\n    }\n    pResList->AddReference(name, m_pDocument, pResourceObj->GetObjNum());\n    return name;\n}\nvoid CPDF_PageContentGenerate::ProcessImage(CFX_ByteTextBuf& buf, CPDF_ImageObject* pImageObj)\n{\n    if ((pImageObj->m_Matrix.a == 0 && pImageObj->m_Matrix.b == 0) ||\n            (pImageObj->m_Matrix.c == 0 && pImageObj->m_Matrix.d == 0)) {\n        return;\n    }\n    buf << \"q \" << pImageObj->m_Matrix << \" cm \";\n    if (!pImageObj->m_pImage->IsInline()) {\n        CPDF_Stream* pStream = pImageObj->m_pImage->GetStream();\n        FX_DWORD dwSavedObjNum = pStream->GetObjNum();\n        CFX_ByteString name = RealizeResource(pStream, \"XObject\");\n        if (dwSavedObjNum == 0) {\n            if (pImageObj->m_pImage)\n                pImageObj->m_pImage->Release();\n            pImageObj->m_pImage = m_pDocument->GetPageData()->GetImage(pStream);\n        }\n        buf << \"/\" << PDF_NameEncode(name) << \" Do Q\\n\";\n    }\n}\nvoid CPDF_PageContentGenerate::ProcessForm(CFX_ByteTextBuf& buf, FX_LPCBYTE data, FX_DWORD size, CFX_Matrix& matrix)\n{\n    if (!data || !size) {\n        return;\n    }\n    CPDF_Stream* pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);\n    CPDF_Dictionary* pFormDict = CPDF_Dictionary::Create();\n    pFormDict->SetAtName(FX_BSTR(\"Type\"), FX_BSTR(\"XObject\"));\n    pFormDict->SetAtName(FX_BSTR(\"Subtype\"), FX_BSTR(\"Form\"));\n    CFX_FloatRect bbox = m_pPage->GetPageBBox();\n    matrix.TransformRect(bbox);\n    pFormDict->SetAtRect(FX_BSTR(\"BBox\"), bbox);\n    pStream->InitStream((FX_LPBYTE)data, size, pFormDict);\n    buf << \"q \" << matrix << \" cm \";\n    CFX_ByteString name = RealizeResource(pStream, \"XObject\");\n    buf << \"/\" << PDF_NameEncode(name) << \" Do Q\\n\";\n}\nvoid CPDF_PageContentGenerate::TransformContent(CFX_Matrix& matrix)\n{\n    CPDF_Dictionary* pDict = m_pPage->m_pFormDict;\n    CPDF_Object* pContent = pDict ? pDict->GetElementValue(\"Contents\") : NULL;\n    if (!pContent) {\n        return;\n    }\n    CFX_ByteTextBuf buf;\n    int type = pContent->GetType();\n    if (type == PDFOBJ_ARRAY) {\n        CPDF_Array* pArray = (CPDF_Array*)pContent;\n        int iCount = pArray->GetCount();\n        CPDF_StreamAcc** pContentArray = (CPDF_StreamAcc**)FX_Alloc(CPDF_StreamAcc*, iCount);\n        int size = 0;\n        int i = 0;\n        for (i = 0; i < iCount; ++i) {\n            pContent = pArray->GetElement(i);\n            if (!pContent || pContent->GetType() != PDFOBJ_STREAM) {\n                continue;\n            }\n            CPDF_StreamAcc* pStream = FX_NEW CPDF_StreamAcc();\n            pStream->LoadAllData((CPDF_Stream*)pContent);\n            pContentArray[i] = pStream;\n            size += pContentArray[i]->GetSize() + 1;\n        }\n        int pos = 0;\n        FX_LPBYTE pBuf = FX_Alloc(FX_BYTE, size);\n        for (i = 0; i < iCount; ++i) {\n            FXSYS_memcpy32(pBuf + pos, pContentArray[i]->GetData(), pContentArray[i]->GetSize());\n            pos += pContentArray[i]->GetSize() + 1;\n            pBuf[pos - 1] = ' ';\n            delete pContentArray[i];\n        }\n        ProcessForm(buf, pBuf, size, matrix);\n        FX_Free(pBuf);\n        FX_Free(pContentArray);\n    } else if (type == PDFOBJ_STREAM) {\n        CPDF_StreamAcc contentStream;\n        contentStream.LoadAllData((CPDF_Stream*)pContent);\n        ProcessForm(buf, contentStream.GetData(), contentStream.GetSize(), matrix);\n    }\n    CPDF_Stream* pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);\n    pStream->SetData(buf.GetBuffer(), buf.GetLength(), FALSE, FALSE);\n    m_pDocument->AddIndirectObject(pStream);\n    m_pPage->m_pFormDict->SetAtReference(\"Contents\", m_pDocument, pStream->GetObjNum());\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_serial.h\"\n#include \"editint.h\"\n#define PDF_OBJECTSTREAM_MAXLENGTH\t(256 * 1024)\n#define PDF_XREFSTREAM_MAXSIZE\t\t10000\nextern void FlateEncode(const FX_BYTE* src_buf, FX_DWORD src_data, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);\nextern void FlateEncode(FX_LPCBYTE src_buf, FX_DWORD src_size, int predictor, int Colors, int BitsPerComponent, int Columns,\n                        FX_LPBYTE& dest_buf, FX_DWORD& dest_size);\nextern FX_BOOL IsSignatureDict(const CPDF_Dictionary* pDict);\nFX_INT32 PDF_CreatorAppendObject(const CPDF_Object* pObj, CFX_FileBufferArchive *pFile, FX_FILESIZE& offset)\n{\n    FX_INT32 len = 0;\n    if (pObj == NULL) {\n        if (pFile->AppendString(FX_BSTRC(\" null\")) < 0) {\n            return -1;\n        }\n        offset += 5;\n        return 1;\n    }\n    switch (pObj->GetType()) {\n        case PDFOBJ_NULL:\n            if (pFile->AppendString(FX_BSTRC(\" null\")) < 0) {\n                return -1;\n            }\n            offset += 5;\n            break;\n        case PDFOBJ_BOOLEAN:\n        case PDFOBJ_NUMBER:\n            if (pFile->AppendString(FX_BSTRC(\" \")) < 0) {\n                return -1;\n            }\n            if ((len = pFile->AppendString(pObj->GetString())) < 0) {\n                return -1;\n            }\n            offset += len + 1;\n            break;\n        case PDFOBJ_STRING: {\n                CFX_ByteString str = pObj->GetString();\n                FX_BOOL bHex = ((CPDF_String*)pObj)->IsHex();\n                if ((len = pFile->AppendString(PDF_EncodeString(str, bHex))) < 0) {\n                    return -1;\n                }\n                offset += len;\n                break;\n            }\n        case PDFOBJ_NAME: {\n                if (pFile->AppendString(FX_BSTRC(\"/\")) < 0) {\n                    return -1;\n                }\n                CFX_ByteString str = pObj->GetString();\n                if ((len = pFile->AppendString(PDF_NameEncode(str))) < 0) {\n                    return -1;\n                }\n                offset += len + 1;\n                break;\n            }\n        case PDFOBJ_REFERENCE: {\n                if (pFile->AppendString(FX_BSTRC(\" \")) < 0) {\n                    return -1;\n                }\n                CPDF_Reference* p = (CPDF_Reference*)pObj;\n                if ((len = pFile->AppendDWord(p->GetRefObjNum())) < 0) {\n                    return -1;\n                }\n                if (pFile->AppendString(FX_BSTRC(\" 0 R \")) < 0) {\n                    return -1;\n                }\n                offset += len + 6;\n                break;\n            }\n        case PDFOBJ_ARRAY: {\n                if (pFile->AppendString(FX_BSTRC(\"[\")) < 0) {\n                    return -1;\n                }\n                offset += 1;\n                CPDF_Array* p = (CPDF_Array*)pObj;\n                for (FX_DWORD i = 0; i < p->GetCount(); i ++) {\n                    CPDF_Object* pElement = p->GetElement(i);\n                    if (pElement->GetObjNum()) {\n                        if (pFile->AppendString(FX_BSTRC(\" \")) < 0) {\n                            return -1;\n                        }\n                        if ((len = pFile->AppendDWord(pElement->GetObjNum())) < 0) {\n                            return -1;\n                        }\n                        if (pFile->AppendString(FX_BSTRC(\" 0 R\")) < 0) {\n                            return -1;\n                        }\n                        offset += len + 5;\n                    } else {\n                        if (PDF_CreatorAppendObject(pElement, pFile, offset) < 0) {\n                            return -1;\n                        }\n                    }\n                }\n                if (pFile->AppendString(FX_BSTRC(\"]\")) < 0) {\n                    return -1;\n                }\n                offset += 1;\n                break;\n            }\n        case PDFOBJ_DICTIONARY: {\n                if (pFile->AppendString(FX_BSTRC(\"<<\")) < 0) {\n                    return -1;\n                }\n                offset += 2;\n                CPDF_Dictionary* p = (CPDF_Dictionary*)pObj;\n                FX_POSITION pos = p->GetStartPos();\n                while (pos) {\n                    CFX_ByteString key;\n                    CPDF_Object* pValue = p->GetNextElement(pos, key);\n                    if (pFile->AppendString(FX_BSTRC(\"/\")) < 0) {\n                        return -1;\n                    }\n                    if ((len = pFile->AppendString(PDF_NameEncode(key))) < 0) {\n                        return -1;\n                    }\n                    offset += len + 1;\n                    if (pValue->GetObjNum()) {\n                        if (pFile->AppendString(FX_BSTRC(\" \")) < 0) {\n                            return -1;\n                        }\n                        if ((len = pFile->AppendDWord(pValue->GetObjNum())) < 0) {\n                            return -1;\n                        }\n                        if (pFile->AppendString(FX_BSTRC(\" 0 R\")) < 0) {\n                            return -1;\n                        }\n                        offset += len + 5;\n                    } else {\n                        if (PDF_CreatorAppendObject(pValue, pFile, offset) < 0) {\n                            return -1;\n                        }\n                    }\n                }\n                if (pFile->AppendString(FX_BSTRC(\">>\")) < 0) {\n                    return -1;\n                }\n                offset += 2;\n                break;\n            }\n        case PDFOBJ_STREAM: {\n                CPDF_Stream* p = (CPDF_Stream*)pObj;\n                if (PDF_CreatorAppendObject(p->GetDict(), pFile, offset) < 0) {\n                    return -1;\n                }\n                if (pFile->AppendString(FX_BSTRC(\"stream\\r\\n\")) < 0) {\n                    return -1;\n                }\n                offset += 8;\n                CPDF_StreamAcc acc;\n                acc.LoadAllData(p, TRUE);\n                if (pFile->AppendBlock(acc.GetData(), acc.GetSize()) < 0) {\n                    return -1;\n                }\n                offset += acc.GetSize();\n                if ((len = pFile->AppendString(FX_BSTRC(\"\\r\\nendstream\"))) < 0) {\n                    return -1;\n                }\n                offset += len;\n                break;\n            }\n        default:\n            ASSERT(FALSE);\n            break;\n    }\n    return 1;\n}\nFX_INT32 PDF_CreatorWriteTrailer(CPDF_Document* pDocument, CFX_FileBufferArchive* pFile, CPDF_Array* pIDArray, FX_BOOL bCompress)\n{\n    FX_FILESIZE offset = 0;\n    FX_INT32 len = 0;\n    FXSYS_assert(pDocument && pFile);\n    CPDF_Parser *pParser = (CPDF_Parser*)pDocument->GetParser();\n    if (pParser) {\n        CPDF_Dictionary* p = pParser->GetTrailer();\n        FX_POSITION pos = p->GetStartPos();\n        while (pos) {\n            CFX_ByteString key;\n            CPDF_Object* pValue = p->GetNextElement(pos, key);\n            if (key == FX_BSTRC(\"Encrypt\") || key == FX_BSTRC(\"Size\") || key == FX_BSTRC(\"Filter\") ||\n                    key == FX_BSTRC(\"Index\") || key == FX_BSTRC(\"Length\") || key == FX_BSTRC(\"Prev\") ||\n                    key == FX_BSTRC(\"W\") || key == FX_BSTRC(\"XRefStm\") || key == FX_BSTRC(\"Type\") || key == FX_BSTRC(\"ID\")) {\n                continue;\n            }\n            if (bCompress && key == FX_BSTRC(\"DecodeParms\")) {\n                continue;\n            }\n            if (pFile->AppendString((FX_BSTRC(\"/\"))) < 0) {\n                return -1;\n            }\n            if ((len = pFile->AppendString(PDF_NameEncode(key))) < 0) {\n                return -1;\n            }\n            offset += len + 1;\n            if (pValue->GetObjNum()) {\n                if (pFile->AppendString(FX_BSTRC(\" \")) < 0) {\n                    return -1;\n                }\n                if ((len = pFile->AppendDWord(pValue->GetObjNum())) < 0) {\n                    return -1;\n                }\n                if (pFile->AppendString(FX_BSTRC(\" 0 R \")) < 0) {\n                    return -1;\n                }\n                offset += len + 6;\n            } else {\n                if (PDF_CreatorAppendObject(pValue, pFile, offset) < 0) {\n                    return -1;\n                }\n            }\n        }\n        if (pIDArray) {\n            if (pFile->AppendString((FX_BSTRC(\"/ID\"))) < 0) {\n                return -1;\n            }\n            offset += 3;\n            if (PDF_CreatorAppendObject(pIDArray, pFile, offset) < 0) {\n                return -1;\n            }\n        }\n        return offset;\n    }\n    if (pFile->AppendString(FX_BSTRC(\"\\r\\n/Root \")) < 0) {\n        return -1;\n    }\n    if ((len = pFile->AppendDWord(pDocument->GetRoot()->GetObjNum())) < 0) {\n        return -1;\n    }\n    if (pFile->AppendString(FX_BSTRC(\" 0 R\\r\\n\")) < 0) {\n        return -1;\n    }\n    offset += len + 14;\n    if (pDocument->GetInfo()) {\n        if (pFile->AppendString(FX_BSTRC(\"/Info \")) < 0) {\n            return -1;\n        }\n        if ((len = pFile->AppendDWord(pDocument->GetInfo()->GetObjNum())) < 0) {\n            return -1;\n        }\n        if (pFile->AppendString(FX_BSTRC(\" 0 R\\r\\n\")) < 0) {\n            return -1;\n        }\n        offset += len + 12;\n    }\n    if (pIDArray) {\n        if (pFile->AppendString((FX_BSTRC(\"/ID\"))) < 0) {\n            return -1;\n        }\n        offset += 3;\n        if (PDF_CreatorAppendObject(pIDArray, pFile, offset) < 0) {\n            return -1;\n        }\n    }\n    return offset;\n}\nFX_INT32 PDF_CreatorWriteEncrypt(const CPDF_Dictionary* pEncryptDict, FX_DWORD dwObjNum, CFX_FileBufferArchive *pFile)\n{\n    if (!pEncryptDict) {\n        return 0;\n    }\n    FXSYS_assert(pFile);\n    FX_FILESIZE offset = 0;\n    FX_INT32 len = 0;\n    if (pFile->AppendString(FX_BSTRC(\"/Encrypt\")) < 0) {\n        return -1;\n    }\n    offset += 8;\n    if (pFile->AppendString(FX_BSTRC(\" \")) < 0) {\n        return -1;\n    }\n    if ((len = pFile->AppendDWord(dwObjNum)) < 0) {\n        return -1;\n    }\n    if (pFile->AppendString(FX_BSTRC(\" 0 R \")) < 0) {\n        return -1;\n    }\n    offset += len + 6;\n    return offset;\n}\nFX_BOOL PDF_GenerateFileID(FX_DWORD dwSeed1, FX_DWORD dwSeed2, FX_LPDWORD pBuffer)\n{\n    if (!pBuffer) {\n        return FALSE;\n    }\n    FX_LPVOID pContext = FX_Random_MT_Start(dwSeed1);\n    FX_INT32 i = 0;\n    for (i = 0; i < 2; i++) {\n        *pBuffer++ = FX_Random_MT_Generate(pContext);\n    }\n    FX_Random_MT_Close(pContext);\n    pContext = FX_Random_MT_Start(dwSeed2);\n    for (i = 0; i < 2; i++) {\n        *pBuffer++ = FX_Random_MT_Generate(pContext);\n    }\n    FX_Random_MT_Close(pContext);\n    return TRUE;\n}\nclass CPDF_FlateEncoder\n{\npublic:\n    CPDF_FlateEncoder();\n    ~CPDF_FlateEncoder();\n    FX_BOOL\t\tInitialize(CPDF_Stream* pStream, FX_BOOL bFlateEncode);\n    FX_BOOL\t\tInitialize(FX_LPCBYTE pBuffer, FX_DWORD size, FX_BOOL bFlateEncode, FX_BOOL bXRefStream = FALSE);\n    void\t\tCloneDict();\n    FX_LPBYTE\t\t\tm_pData;\n    FX_DWORD\t\t\tm_dwSize;\n    CPDF_Dictionary*\tm_pDict;\n    FX_BOOL\t\t\t\tm_bCloned;\n    FX_BOOL\t\t\t\tm_bNewData;\n    CPDF_StreamAcc\t\tm_Acc;\n};\nCPDF_FlateEncoder::CPDF_FlateEncoder()\n{\n    m_pData = NULL;\n    m_dwSize = 0;\n    m_pDict = NULL;\n    m_bCloned = FALSE;\n    m_bNewData = FALSE;\n}\nvoid CPDF_FlateEncoder::CloneDict()\n{\n    if (!m_bCloned) {\n        m_pDict = (CPDF_Dictionary*)m_pDict->Clone();\n        m_bCloned = TRUE;\n    }\n}\nFX_BOOL CPDF_FlateEncoder::Initialize(CPDF_Stream* pStream, FX_BOOL bFlateEncode)\n{\n    m_Acc.LoadAllData(pStream, TRUE);\n    if ((pStream && pStream->GetDict() && pStream->GetDict()->KeyExist(\"Filter\")) || !bFlateEncode) {\n        if (pStream->GetDict()->KeyExist(\"Filter\") && !bFlateEncode) {\n            CPDF_StreamAcc destAcc;\n            destAcc.LoadAllData(pStream);\n            m_dwSize = destAcc.GetSize();\n            m_pData = (FX_LPBYTE)destAcc.DetachData();\n            m_pDict = (CPDF_Dictionary*)pStream->GetDict()->Clone();\n            m_pDict->RemoveAt(FX_BSTRC(\"Filter\"));\n            m_bNewData = TRUE;\n            m_bCloned = TRUE;\n        } else {\n            m_pData = (FX_LPBYTE)m_Acc.GetData();\n            m_dwSize = m_Acc.GetSize();\n            m_pDict = pStream->GetDict();\n        }\n        return TRUE;\n    }\n    m_pData = NULL;\n    m_dwSize = 0;\n    m_bNewData = TRUE;\n    m_bCloned = TRUE;\n    ::FlateEncode(m_Acc.GetData(), m_Acc.GetSize(), m_pData, m_dwSize);\n    m_pDict = (CPDF_Dictionary*)pStream->GetDict()->Clone();\n    m_pDict->SetAtInteger(\"Length\", m_dwSize);\n    m_pDict->SetAtName(\"Filter\", \"FlateDecode\");\n    m_pDict->RemoveAt(\"DecodeParms\");\n    return TRUE;\n}\nFX_BOOL CPDF_FlateEncoder::Initialize(FX_LPCBYTE pBuffer, FX_DWORD size, FX_BOOL bFlateEncode, FX_BOOL bXRefStream)\n{\n    if (!bFlateEncode) {\n        m_pData = (FX_LPBYTE)pBuffer;\n        m_dwSize = size;\n        return TRUE;\n    }\n    m_bNewData = TRUE;\n    if (bXRefStream) {\n        ::FlateEncode(pBuffer, size, 12, 1, 8, 7, m_pData, m_dwSize);\n    } else {\n        ::FlateEncode(pBuffer, size, m_pData, m_dwSize);\n    }\n    return TRUE;\n}\nCPDF_FlateEncoder::~CPDF_FlateEncoder()\n{\n    if (m_bCloned && m_pDict) {\n        m_pDict->Release();\n    }\n    if (m_bNewData && m_pData) {\n        FX_Free(m_pData);\n    }\n}\nclass CPDF_Encryptor\n{\npublic:\n    CPDF_Encryptor();\n    ~CPDF_Encryptor();\n    FX_BOOL\t\tInitialize(CPDF_CryptoHandler* pHandler, int objnum, FX_LPBYTE src_data, FX_DWORD src_size);\n    FX_LPBYTE\t\t\tm_pData;\n    FX_DWORD\t\t\tm_dwSize;\n    FX_BOOL\t\t\t\tm_bNewBuf;\n};\nCPDF_Encryptor::CPDF_Encryptor()\n{\n    m_pData = NULL;\n    m_dwSize = 0;\n    m_bNewBuf = FALSE;\n}\nFX_BOOL CPDF_Encryptor::Initialize(CPDF_CryptoHandler* pHandler, int objnum, FX_LPBYTE src_data, FX_DWORD src_size)\n{\n    if (src_size == 0) {\n        return TRUE;\n    }\n    if (pHandler == NULL) {\n        m_pData = (FX_LPBYTE)src_data;\n        m_dwSize = src_size;\n        m_bNewBuf = FALSE;\n        return TRUE;\n    }\n    m_dwSize = pHandler->EncryptGetSize(objnum, 0, src_data, src_size);\n    m_pData = FX_Alloc(FX_BYTE, m_dwSize);\n    if(!m_pData) {\n        return FALSE;\n    }\n    pHandler->EncryptContent(objnum, 0, src_data, src_size, m_pData, m_dwSize);\n    m_bNewBuf = TRUE;\n    return TRUE;\n}\nCPDF_Encryptor::~CPDF_Encryptor()\n{\n    if (m_bNewBuf) {\n        FX_Free(m_pData);\n    }\n}\nCPDF_ObjectStream::CPDF_ObjectStream()\n    : m_dwObjNum(0)\n    , m_index(0)\n{\n}\nFX_BOOL CPDF_ObjectStream::Start()\n{\n    m_ObjNumArray.RemoveAll();\n    m_OffsetArray.RemoveAll();\n    m_Buffer.Clear();\n    m_dwObjNum = 0;\n    m_index = 0;\n    return TRUE;\n}\nFX_INT32 CPDF_ObjectStream::CompressIndirectObject(FX_DWORD dwObjNum, const CPDF_Object *pObj)\n{\n    m_ObjNumArray.Add(dwObjNum);\n    m_OffsetArray.Add(m_Buffer.GetLength());\n    m_Buffer << pObj;\n    return 1;\n}\nFX_INT32 CPDF_ObjectStream::CompressIndirectObject(FX_DWORD dwObjNum, FX_LPCBYTE pBuffer, FX_DWORD dwSize)\n{\n    m_ObjNumArray.Add(dwObjNum);\n    m_OffsetArray.Add(m_Buffer.GetLength());\n    m_Buffer.AppendBlock(pBuffer, dwSize);\n    return 1;\n}\nFX_FILESIZE CPDF_ObjectStream::End(CPDF_Creator* pCreator)\n{\n    FXSYS_assert(pCreator);\n    if (m_ObjNumArray.GetSize() == 0) {\n        return 0;\n    }\n    CFX_FileBufferArchive *pFile = &pCreator->m_File;\n    CPDF_CryptoHandler *pHandler = pCreator->m_pCryptoHandler;\n    FX_FILESIZE ObjOffset = pCreator->m_Offset;\n    if (!m_dwObjNum) {\n        m_dwObjNum = ++pCreator->m_dwLastObjNum;\n    }\n    CFX_ByteTextBuf tempBuffer;\n    FX_INT32 iCount = m_ObjNumArray.GetSize();\n    for (FX_INT32 i = 0; i < iCount; i++) {\n        tempBuffer << m_ObjNumArray.ElementAt(i) << FX_BSTRC(\" \") << m_OffsetArray.ElementAt(i) << FX_BSTRC(\" \");\n    }\n    FX_FILESIZE &offset = pCreator->m_Offset;\n    FX_INT32 len = pFile->AppendDWord(m_dwObjNum);\n    if (len < 0) {\n        return -1;\n    }\n    offset += len;\n    if ((len = pFile->AppendString(FX_BSTRC(\" 0 obj\\r\\n<</Type /ObjStm /N \"))) < 0) {\n        return -1;\n    }\n    offset += len;\n    if ((len = pFile->AppendDWord((FX_DWORD)iCount)) < 0) {\n        return -1;\n    }\n    offset += len;\n    if (pFile->AppendString(FX_BSTRC(\"/First \")) < 0) {\n        return -1;\n    }\n    if ((len = pFile->AppendDWord((FX_DWORD)tempBuffer.GetLength())) < 0) {\n        return -1;\n    }\n    if (pFile->AppendString(FX_BSTRC(\"/Length \")) < 0) {\n        return -1;\n    }\n    offset += len + 15;\n    if (!pCreator->m_bCompress && !pHandler) {\n        if ((len = pFile->AppendDWord((FX_DWORD)(tempBuffer.GetLength() + m_Buffer.GetLength()))) < 0) {\n            return -1;\n        }\n        offset += len;\n        if ((len = pFile->AppendString(FX_BSTRC(\">>stream\\r\\n\"))) < 0) {\n            return -1;\n        }\n        if (pFile->AppendBlock(tempBuffer.GetBuffer(), tempBuffer.GetLength()) < 0) {\n            return -1;\n        }\n        if (pFile->AppendBlock(m_Buffer.GetBuffer(), m_Buffer.GetLength()) < 0) {\n            return -1;\n        }\n        offset += len + tempBuffer.GetLength() + m_Buffer.GetLength();\n    } else {\n        tempBuffer << m_Buffer;\n        CPDF_FlateEncoder encoder;\n        encoder.Initialize(tempBuffer.GetBuffer(), tempBuffer.GetLength(), pCreator->m_bCompress);\n        CPDF_Encryptor encryptor;\n        encryptor.Initialize(pHandler, m_dwObjNum, encoder.m_pData, encoder.m_dwSize);\n        if ((len = pFile->AppendDWord(encryptor.m_dwSize)) < 0) {\n            return -1;\n        }\n        offset += len;\n        if (pCreator->m_bCompress) {\n            if (pFile->AppendString(FX_BSTRC(\"/Filter /FlateDecode\")) < 0) {\n                return -1;\n            }\n            offset += 20;\n        }\n        if ((len = pFile->AppendString(FX_BSTRC(\">>stream\\r\\n\"))) < 0) {\n            return -1;\n        }\n        if (pFile->AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) {\n            return -1;\n        }\n        offset += len + encryptor.m_dwSize;\n    }\n    if ((len = pFile->AppendString(FX_BSTRC(\"\\r\\nendstream\\r\\nendobj\\r\\n\"))) < 0) {\n        return -1;\n    }\n    offset += len;\n    return ObjOffset;\n}\nCPDF_XRefStream::CPDF_XRefStream()\n    : m_PrevOffset(0)\n    , m_iSeg(0)\n    , m_dwTempObjNum(0)\n{\n}\nFX_BOOL CPDF_XRefStream::Start()\n{\n    m_IndexArray.RemoveAll();\n    m_Buffer.Clear();\n    m_iSeg = 0;\n    return TRUE;\n}\nFX_INT32 CPDF_XRefStream::CompressIndirectObject(FX_DWORD dwObjNum, const CPDF_Object *pObj, CPDF_Creator *pCreator)\n{\n    if (!pCreator) {\n        return 0;\n    }\n    m_ObjStream.CompressIndirectObject(dwObjNum, pObj);\n    if (m_ObjStream.m_ObjNumArray.GetSize() < pCreator->m_ObjectStreamSize &&\n            m_ObjStream.m_Buffer.GetLength() < PDF_OBJECTSTREAM_MAXLENGTH) {\n        return 1;\n    }\n    return EndObjectStream(pCreator);\n}\nFX_INT32 CPDF_XRefStream::CompressIndirectObject(FX_DWORD dwObjNum, FX_LPCBYTE pBuffer, FX_DWORD dwSize, CPDF_Creator *pCreator)\n{\n    if (!pCreator) {\n        return 0;\n    }\n    m_ObjStream.CompressIndirectObject(dwObjNum, pBuffer, dwSize);\n    if (m_ObjStream.m_ObjNumArray.GetSize() < pCreator->m_ObjectStreamSize &&\n            m_ObjStream.m_Buffer.GetLength() < PDF_OBJECTSTREAM_MAXLENGTH) {\n        return 1;\n    }\n    return EndObjectStream(pCreator);\n}\nstatic void _AppendIndex0(CFX_ByteTextBuf& buffer, FX_BOOL bFirstObject =  TRUE)\n{\n    buffer.AppendByte(0);\n    buffer.AppendByte(0);\n    buffer.AppendByte(0);\n    buffer.AppendByte(0);\n    buffer.AppendByte(0);\n    if (bFirstObject) {\n        buffer.AppendByte(0xFF);\n        buffer.AppendByte(0xFF);\n    } else {\n        buffer.AppendByte(0);\n        buffer.AppendByte(0);\n    }\n}\nstatic void _AppendIndex1(CFX_ByteTextBuf& buffer, FX_FILESIZE offset)\n{\n    buffer.AppendByte(1);\n    buffer.AppendByte(FX_GETBYTEOFFSET24(offset));\n    buffer.AppendByte(FX_GETBYTEOFFSET16(offset));\n    buffer.AppendByte(FX_GETBYTEOFFSET8(offset));\n    buffer.AppendByte(FX_GETBYTEOFFSET0(offset));\n    buffer.AppendByte(0);\n    buffer.AppendByte(0);\n}\nstatic void _AppendIndex2(CFX_ByteTextBuf& buffer, FX_DWORD objnum, FX_INT32 index)\n{\n    buffer.AppendByte(2);\n    buffer.AppendByte(FX_GETBYTEOFFSET24(objnum));\n    buffer.AppendByte(FX_GETBYTEOFFSET16(objnum));\n    buffer.AppendByte(FX_GETBYTEOFFSET8(objnum));\n    buffer.AppendByte(FX_GETBYTEOFFSET0(objnum));\n    buffer.AppendByte(FX_GETBYTEOFFSET8(index));\n    buffer.AppendByte(FX_GETBYTEOFFSET0(index));\n}\nFX_INT32 CPDF_XRefStream::EndObjectStream(CPDF_Creator *pCreator, FX_BOOL bEOF)\n{\n    FX_FILESIZE objOffset = 0;\n    if (bEOF) {\n        objOffset = m_ObjStream.End(pCreator);\n        if (objOffset < 0) {\n            return -1;\n        }\n    }\n    FX_DWORD &dwObjStmNum = m_ObjStream.m_dwObjNum;\n    if (!dwObjStmNum) {\n        dwObjStmNum = ++pCreator->m_dwLastObjNum;\n    }\n    FX_INT32 iSize = m_ObjStream.m_ObjNumArray.GetSize();\n    FX_INT32 iSeg = m_IndexArray.GetSize() / 2;\n    if (!(pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL)) {\n        if (m_dwTempObjNum == 0) {\n            _AppendIndex0(m_Buffer);\n            m_dwTempObjNum++;\n        }\n        FX_DWORD end_num = m_IndexArray.GetAt((iSeg - 1) * 2) + m_IndexArray.GetAt((iSeg - 1) * 2 + 1);\n        int index = 0;\n        for (; m_dwTempObjNum < end_num; m_dwTempObjNum++) {\n            FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(m_dwTempObjNum);\n            if (offset) {\n                if (index >= iSize || m_dwTempObjNum != m_ObjStream.m_ObjNumArray[index]) {\n                    _AppendIndex1(m_Buffer, *offset);\n                } else {\n                    _AppendIndex2(m_Buffer, dwObjStmNum, index++);\n                }\n            } else {\n                _AppendIndex0(m_Buffer, FALSE);\n            }\n        }\n        if (iSize > 0 && bEOF) {\n            pCreator->m_ObjectOffset.Add(dwObjStmNum, 1);\n            pCreator->m_ObjectSize.Add(dwObjStmNum, 1);\n            pCreator->m_ObjectOffset[dwObjStmNum] = objOffset;\n        }\n        m_iSeg = iSeg;\n        if (bEOF) {\n            m_ObjStream.Start();\n        }\n        return 1;\n    }\n    FX_INT32 &j = m_ObjStream.m_index;\n    for (int i = m_iSeg; i < iSeg; i++) {\n        FX_DWORD start = m_IndexArray.ElementAt(i * 2);\n        FX_DWORD end = m_IndexArray.ElementAt(i * 2 + 1) + start;\n        for (FX_DWORD m = start; m < end; m++) {\n            if (j >= iSize || m != m_ObjStream.m_ObjNumArray.ElementAt(j)) {\n                _AppendIndex1(m_Buffer, pCreator->m_ObjectOffset[m]);\n            } else {\n                _AppendIndex2(m_Buffer, dwObjStmNum, j++);\n            }\n        }\n    }\n    if (iSize > 0 && bEOF) {\n        _AppendIndex1(m_Buffer, objOffset);\n        m_IndexArray.Add(dwObjStmNum);\n        m_IndexArray.Add(1);\n        iSeg += 1;\n    }\n    m_iSeg = iSeg;\n    if (bEOF) {\n        m_ObjStream.Start();\n    }\n    return 1;\n}\nFX_BOOL CPDF_XRefStream::GenerateXRefStream(CPDF_Creator* pCreator, FX_BOOL bEOF)\n{\n    FX_FILESIZE offset_tmp = pCreator->m_Offset;\n    FX_DWORD objnum = ++pCreator->m_dwLastObjNum;\n    CFX_FileBufferArchive *pFile = &pCreator->m_File;\n    FX_BOOL bIncremental = (pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL) != 0;\n    if (bIncremental) {\n        AddObjectNumberToIndexArray(objnum);\n    } else {\n        for (; m_dwTempObjNum < pCreator->m_dwLastObjNum; m_dwTempObjNum++) {\n            FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(m_dwTempObjNum);\n            if (offset) {\n                _AppendIndex1(m_Buffer, *offset);\n            } else {\n                _AppendIndex0(m_Buffer, FALSE);\n            }\n        }\n    }\n    _AppendIndex1(m_Buffer, offset_tmp);\n    FX_FILESIZE &offset = pCreator->m_Offset;\n    FX_INT32 len = pFile->AppendDWord(objnum);\n    if (len < 0) {\n        return FALSE;\n    }\n    offset += len;\n    if ((len = pFile->AppendString(FX_BSTRC(\" 0 obj\\r\\n<</Type /XRef/W[1 4 2]/Index[\"))) < 0) {\n        return FALSE;\n    }\n    offset += len;\n    if (!bIncremental) {\n        if ((len = pFile->AppendDWord(0)) < 0) {\n            return FALSE;\n        }\n        if ((len = pFile->AppendString(FX_BSTRC(\" \"))) < 0) {\n            return FALSE;\n        }\n        offset += len + 1;\n        if ((len = pFile->AppendDWord(objnum + 1)) < 0) {\n            return FALSE;\n        }\n        offset += len;\n    } else {\n        FX_INT32 iSeg = m_IndexArray.GetSize() / 2;\n        for (FX_INT32 i = 0; i < iSeg; i++) {\n            if ((len = pFile->AppendDWord(m_IndexArray.ElementAt(i * 2))) < 0) {\n                return FALSE;\n            }\n            if (pFile->AppendString(FX_BSTRC(\" \")) < 0) {\n                return FALSE;\n            }\n            offset += len + 1;\n            if ((len = pFile->AppendDWord(m_IndexArray.ElementAt(i * 2 + 1))) < 0) {\n                return FALSE;\n            }\n            if (pFile->AppendString(FX_BSTRC(\" \")) < 0) {\n                return FALSE;\n            }\n            offset += len + 1;\n        }\n    }\n    if (pFile->AppendString(FX_BSTRC(\"]/Size \")) < 0) {\n        return FALSE;\n    }\n    if ((len = pFile->AppendDWord(objnum + 1)) < 0) {\n        return FALSE;\n    }\n    offset += len + 7;\n    if (m_PrevOffset > 0) {\n        if (pFile->AppendString(FX_BSTRC(\"/Prev \")) < 0) {\n            return -1;\n        }\n        FX_CHAR offset_buf[20];\n        FXSYS_memset32(offset_buf, 0, sizeof(offset_buf));\n        FXSYS_i64toa(m_PrevOffset, offset_buf, 10);\n        FX_INT32 len = (FX_INT32)FXSYS_strlen(offset_buf);\n        if (pFile->AppendBlock(offset_buf, len) < 0) {\n            return -1;\n        }\n        offset += len + 6;\n    }\n    FX_BOOL bPredictor = TRUE;\n    CPDF_FlateEncoder encoder;\n    encoder.Initialize(m_Buffer.GetBuffer(), m_Buffer.GetLength(), pCreator->m_bCompress, bPredictor);\n    if (pCreator->m_bCompress) {\n        if (pFile->AppendString(FX_BSTRC(\"/Filter /FlateDecode\")) < 0) {\n            return FALSE;\n        }\n        offset += 20;\n        if (bPredictor) {\n            if ((len = pFile->AppendString(FX_BSTRC(\"/DecodeParms<</Columns 7/Predictor 12>>\"))) < 0) {\n                return FALSE;\n            }\n            offset += len;\n        }\n    }\n    if (pFile->AppendString(FX_BSTRC(\"/Length \")) < 0) {\n        return FALSE;\n    }\n    if ((len = pFile->AppendDWord(encoder.m_dwSize)) < 0) {\n        return FALSE;\n    }\n    offset += len + 8;\n    if (bEOF) {\n        if ((len = PDF_CreatorWriteTrailer(pCreator->m_pDocument, pFile, pCreator->m_pIDArray, pCreator->m_bCompress)) < 0) {\n            return -1;\n        }\n        offset += len;\n        if (pCreator->m_pEncryptDict) {\n            FX_DWORD dwEncryptObjNum = pCreator->m_pEncryptDict->GetObjNum();\n            if (dwEncryptObjNum == 0) {\n                dwEncryptObjNum = pCreator->m_dwEnryptObjNum;\n            }\n            if ((len = PDF_CreatorWriteEncrypt(pCreator->m_pEncryptDict, dwEncryptObjNum, pFile)) < 0) {\n                return -1;\n            }\n            offset += len;\n        }\n    }\n    if ((len = pFile->AppendString(FX_BSTRC(\">>stream\\r\\n\"))) < 0) {\n        return FALSE;\n    }\n    offset += len;\n    if (pFile->AppendBlock(encoder.m_pData, encoder.m_dwSize) < 0) {\n        return FALSE;\n    }\n    if ((len = pFile->AppendString(FX_BSTRC(\"\\r\\nendstream\\r\\nendobj\\r\\n\"))) < 0) {\n        return FALSE;\n    }\n    offset += encoder.m_dwSize + len;\n    m_PrevOffset = offset_tmp;\n    return TRUE;\n}\nFX_BOOL CPDF_XRefStream::End(CPDF_Creator *pCreator, FX_BOOL bEOF )\n{\n    if (EndObjectStream(pCreator, bEOF) < 0) {\n        return FALSE;\n    }\n    return GenerateXRefStream(pCreator, bEOF);\n}\nFX_BOOL CPDF_XRefStream::EndXRefStream(CPDF_Creator* pCreator)\n{\n    if (!(pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL)) {\n        _AppendIndex0(m_Buffer);\n        for (FX_DWORD i = 1; i < pCreator->m_dwLastObjNum + 1; i++) {\n            FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(i);\n            if (offset) {\n                _AppendIndex1(m_Buffer, *offset);\n            } else {\n                _AppendIndex0(m_Buffer, FALSE);\n            }\n        }\n    } else {\n        FX_INT32 iSeg = m_IndexArray.GetSize() / 2;\n        for (int i = 0; i < iSeg; i++) {\n            FX_DWORD start = m_IndexArray.ElementAt(i * 2);\n            FX_DWORD end = m_IndexArray.ElementAt(i * 2 + 1) + start;\n            for (FX_DWORD j = start; j < end; j++) {\n                _AppendIndex1(m_Buffer, pCreator->m_ObjectOffset[j]);\n            }\n        }\n    }\n    return GenerateXRefStream(pCreator, FALSE);\n}\nFX_BOOL CPDF_XRefStream::AddObjectNumberToIndexArray(FX_DWORD objnum)\n{\n    FX_INT32 iSize = m_IndexArray.GetSize();\n    if (iSize == 0) {\n        m_IndexArray.Add(objnum);\n        m_IndexArray.Add(1);\n    } else {\n        FXSYS_assert(iSize > 1);\n        FX_DWORD startobjnum = m_IndexArray.ElementAt(iSize - 2);\n        FX_INT32 iCount = m_IndexArray.ElementAt(iSize - 1);\n        if (objnum == startobjnum + iCount) {\n            m_IndexArray[iSize - 1] = iCount + 1;\n        } else {\n            m_IndexArray.Add(objnum);\n            m_IndexArray.Add(1);\n        }\n    }\n    return TRUE;\n}\nCPDF_Creator::CPDF_Creator(CPDF_Document* pDoc)\n{\n    m_pDocument = pDoc;\n    m_pParser = (CPDF_Parser*)pDoc->m_pParser;\n    m_bCompress = TRUE;\n    if (m_pParser) {\n        m_pEncryptDict = m_pParser->GetEncryptDict();\n        m_pCryptoHandler = m_pParser->GetCryptoHandler();\n    } else {\n        m_pEncryptDict = NULL;\n        m_pCryptoHandler = NULL;\n    }\n    m_bSecurityChanged = FALSE;\n    m_bStandardSecurity = FALSE;\n    m_pMetadata = NULL;\n    m_bEncryptCloned = FALSE;\n    m_bEncryptMetadata = FALSE;\n    m_Offset = 0;\n    m_iStage = -1;\n    m_dwFlags = 0;\n    m_Pos = NULL;\n    m_XrefStart = 0;\n    m_pXRefStream = NULL;\n    m_ObjectStreamSize = 200;\n    m_dwLastObjNum = m_pDocument->GetLastObjNum();\n    m_pIDArray = NULL;\n    m_FileVersion = 0;\n    m_dwEnryptObjNum = 0;\n    m_bNewCrypto = FALSE;\n}\nCPDF_Creator::~CPDF_Creator()\n{\n    ResetStandardSecurity();\n    if (m_bEncryptCloned && m_pEncryptDict) {\n        m_pEncryptDict->Release();\n        m_pEncryptDict = NULL;\n    }\n    Clear();\n}\nstatic FX_BOOL _IsXRefNeedEnd(CPDF_XRefStream* pXRef, FX_DWORD flag)\n{\n    if (!(flag & FPDFCREATE_INCREMENTAL)) {\n        return FALSE;\n    }\n    FX_INT32 iSize = pXRef->m_IndexArray.GetSize() / 2;\n    FX_INT32 iCount = 0;\n    for (FX_INT32 i = 0; i < iSize; i++) {\n        iCount += pXRef->m_IndexArray.ElementAt(i * 2 + 1);\n    }\n    return (iCount >= PDF_XREFSTREAM_MAXSIZE);\n}\nFX_INT32 CPDF_Creator::WriteIndirectObjectToStream(const CPDF_Object* pObj)\n{\n    if (!m_pXRefStream) {\n        return 1;\n    }\n    FX_DWORD objnum = pObj->GetObjNum();\n    if (m_pParser && m_pParser->m_ObjVersion.GetSize() > (FX_INT32)objnum && m_pParser->m_ObjVersion[objnum] > 0) {\n        return 1;\n    }\n    if (pObj->GetType() == PDFOBJ_NUMBER) {\n        return 1;\n    }\n    CPDF_Dictionary *pDict = pObj->GetDict();\n    if (pObj->GetType() == PDFOBJ_STREAM) {\n        if (pDict && pDict->GetString(FX_BSTRC(\"Type\")) == FX_BSTRC(\"XRef\")) {\n            return 0;\n        }\n        return 1;\n    }\n    if (pDict) {\n        if (pDict == m_pDocument->m_pRootDict || pDict == m_pEncryptDict) {\n            return 1;\n        }\n        if (IsSignatureDict(pDict)) {\n            return 1;\n        }\n        if (pDict->GetString(FX_BSTRC(\"Type\")) == FX_BSTRC(\"Page\")) {\n            return 1;\n        }\n    }\n    m_pXRefStream->AddObjectNumberToIndexArray(objnum);\n    if (m_pXRefStream->CompressIndirectObject(objnum, pObj, this) < 0) {\n        return -1;\n    }\n    if (!_IsXRefNeedEnd(m_pXRefStream, m_dwFlags)) {\n        return 0;\n    }\n    if (!m_pXRefStream->End(this)) {\n        return -1;\n    }\n    if (!m_pXRefStream->Start()) {\n        return -1;\n    }\n    return 0;\n}\nFX_INT32 CPDF_Creator::WriteIndirectObjectToStream(FX_DWORD objnum, FX_LPCBYTE pBuffer, FX_DWORD dwSize)\n{\n    if (!m_pXRefStream) {\n        return 1;\n    }\n    m_pXRefStream->AddObjectNumberToIndexArray(objnum);\n    FX_INT32 iRet = m_pXRefStream->CompressIndirectObject(objnum, pBuffer, dwSize, this);\n    if (iRet < 1) {\n        return iRet;\n    }\n    if (!_IsXRefNeedEnd(m_pXRefStream, m_dwFlags)) {\n        return 0;\n    }\n    if (!m_pXRefStream->End(this)) {\n        return -1;\n    }\n    if (!m_pXRefStream->Start()) {\n        return -1;\n    }\n    return 0;\n}\nFX_INT32 CPDF_Creator::AppendObjectNumberToXRef(FX_DWORD objnum)\n{\n    if (!m_pXRefStream) {\n        return 1;\n    }\n    m_pXRefStream->AddObjectNumberToIndexArray(objnum);\n    if (!_IsXRefNeedEnd(m_pXRefStream, m_dwFlags)) {\n        return 0;\n    }\n    if (!m_pXRefStream->End(this)) {\n        return -1;\n    }\n    if (!m_pXRefStream->Start()) {\n        return -1;\n    }\n    return 0;\n}\nFX_INT32 CPDF_Creator::WriteStream(const CPDF_Object* pStream, FX_DWORD objnum, CPDF_CryptoHandler* pCrypto)\n{\n    CPDF_FlateEncoder encoder;\n    encoder.Initialize((CPDF_Stream*)pStream, pStream == m_pMetadata ? FALSE : m_bCompress);\n    CPDF_Encryptor encryptor;\n    if(!encryptor.Initialize(pCrypto, objnum, encoder.m_pData, encoder.m_dwSize)) {\n        return -1;\n    }\n    if ((FX_DWORD)encoder.m_pDict->GetInteger(FX_BSTRC(\"Length\")) != encryptor.m_dwSize) {\n        encoder.CloneDict();\n        encoder.m_pDict->SetAtInteger(FX_BSTRC(\"Length\"), encryptor.m_dwSize);\n    }\n    if (WriteDirectObj(objnum, encoder.m_pDict) < 0) {\n        return -1;\n    }\n    int len = m_File.AppendString(FX_BSTRC(\"stream\\r\\n\"));\n    if (len < 0) {\n        return -1;\n    }\n    m_Offset += len;\n    if (m_File.AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) {\n        return -1;\n    }\n    m_Offset += encryptor.m_dwSize;\n    if ((len = m_File.AppendString(FX_BSTRC(\"\\r\\nendstream\"))) < 0) {\n        return -1;\n    }\n    m_Offset += len;\n    return 1;\n}\nFX_INT32 CPDF_Creator::WriteIndirectObj(FX_DWORD objnum, const CPDF_Object* pObj)\n{\n    FX_INT32 len = m_File.AppendDWord(objnum);\n    if (len < 0) {\n        return -1;\n    }\n    m_Offset += len;\n    if ((len = m_File.AppendString(FX_BSTRC(\" 0 obj\\r\\n\"))) < 0) {\n        return -1;\n    }\n    m_Offset += len;\n    if (pObj->GetType() == PDFOBJ_STREAM) {\n        CPDF_CryptoHandler *pHandler = NULL;\n        pHandler = (pObj == m_pMetadata && !m_bEncryptMetadata) ? NULL : m_pCryptoHandler;\n        if (WriteStream(pObj, objnum, pHandler) < 0) {\n            return -1;\n        }\n    } else {\n        if (WriteDirectObj(objnum, pObj) < 0) {\n            return -1;\n        }\n    }\n    if ((len = m_File.AppendString(FX_BSTRC(\"\\r\\nendobj\\r\\n\"))) < 0) {\n        return -1;\n    }\n    m_Offset += len;\n    if (AppendObjectNumberToXRef(objnum) < 0) {\n        return -1;\n    }\n    return 0;\n}\nFX_INT32 CPDF_Creator::WriteIndirectObj(const CPDF_Object* pObj)\n{\n    FX_INT32 iRet = WriteIndirectObjectToStream(pObj);\n    if (iRet < 1) {\n        return iRet;\n    }\n    return WriteIndirectObj(pObj->GetObjNum(), pObj);\n}\nFX_INT32 CPDF_Creator::WriteDirectObj(FX_DWORD objnum, const CPDF_Object* pObj, FX_BOOL bEncrypt)\n{\n    FX_INT32 len = 0;\n    if (pObj == NULL) {\n        if (m_File.AppendString(FX_BSTRC(\" null\")) < 0) {\n            return -1;\n        }\n        m_Offset += 5;\n        return 1;\n    }\n    switch (pObj->GetType()) {\n        case PDFOBJ_NULL:\n            if (m_File.AppendString(FX_BSTRC(\" null\")) < 0) {\n                return -1;\n            }\n            m_Offset += 5;\n            break;\n        case PDFOBJ_BOOLEAN:\n        case PDFOBJ_NUMBER:\n            if (m_File.AppendString(FX_BSTRC(\" \")) < 0) {\n                return -1;\n            }\n            if ((len = m_File.AppendString(pObj->GetString())) < 0) {\n                return -1;\n            }\n            m_Offset += len + 1;\n            break;\n        case PDFOBJ_STRING: {\n                CFX_ByteString str = pObj->GetString();\n                FX_BOOL bHex = ((CPDF_String*)pObj)->IsHex();\n                if (m_pCryptoHandler == NULL || !bEncrypt) {\n                    CFX_ByteString content = PDF_EncodeString(str, bHex);\n                    if ((len = m_File.AppendString(content)) < 0) {\n                        return -1;\n                    }\n                    m_Offset += len;\n                    break;\n                }\n                CPDF_Encryptor encryptor;\n                encryptor.Initialize(m_pCryptoHandler, objnum, (FX_LPBYTE)(FX_LPCSTR)str, str.GetLength());\n                CFX_ByteString content = PDF_EncodeString(CFX_ByteString((FX_LPCSTR)encryptor.m_pData, encryptor.m_dwSize), bHex);\n                if ((len = m_File.AppendString(content)) < 0) {\n                    return -1;\n                }\n                m_Offset += len;\n                break;\n            }\n        case PDFOBJ_STREAM: {\n                CPDF_FlateEncoder encoder;\n                encoder.Initialize((CPDF_Stream*)pObj, m_bCompress);\n                CPDF_Encryptor encryptor;\n                CPDF_CryptoHandler* pHandler = m_pCryptoHandler;\n                encryptor.Initialize(pHandler, objnum, encoder.m_pData, encoder.m_dwSize);\n                if ((FX_DWORD)encoder.m_pDict->GetInteger(FX_BSTRC(\"Length\")) != encryptor.m_dwSize) {\n                    encoder.CloneDict();\n                    encoder.m_pDict->SetAtInteger(FX_BSTRC(\"Length\"), encryptor.m_dwSize);\n                }\n                if (WriteDirectObj(objnum, encoder.m_pDict) < 0) {\n                    return -1;\n                }\n                if ((len = m_File.AppendString(FX_BSTRC(\"stream\\r\\n\"))) < 0) {\n                    return -1;\n                }\n                m_Offset += len;\n                if (m_File.AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) {\n                    return -1;\n                }\n                m_Offset += encryptor.m_dwSize;\n                if ((len = m_File.AppendString(FX_BSTRC(\"\\r\\nendstream\"))) < 0) {\n                    return -1;\n                }\n                m_Offset += len;\n                break;\n            }\n        case PDFOBJ_NAME: {\n                if (m_File.AppendString(FX_BSTRC(\"/\")) < 0) {\n                    return -1;\n                }\n                CFX_ByteString str = pObj->GetString();\n                if ((len = m_File.AppendString(PDF_NameEncode(str))) < 0) {\n                    return -1;\n                }\n                m_Offset += len + 1;\n                break;\n            }\n        case PDFOBJ_REFERENCE: {\n                if (m_File.AppendString(FX_BSTRC(\" \")) < 0) {\n                    return -1;\n                }\n                CPDF_Reference* p = (CPDF_Reference*)pObj;\n                if ((len = m_File.AppendDWord(p->GetRefObjNum())) < 0) {\n                    return -1;\n                }\n                if (m_File.AppendString(FX_BSTRC(\" 0 R\")) < 0) {\n                    return -1;\n                }\n                m_Offset += len + 5;\n                break;\n            }\n        case PDFOBJ_ARRAY: {\n                if (m_File.AppendString(FX_BSTRC(\"[\")) < 0) {\n                    return -1;\n                }\n                m_Offset += 1;\n                CPDF_Array* p = (CPDF_Array*)pObj;\n                for (FX_DWORD i = 0; i < p->GetCount(); i ++) {\n                    CPDF_Object* pElement = p->GetElement(i);\n                    if (pElement->GetObjNum()) {\n                        if (m_File.AppendString(FX_BSTRC(\" \")) < 0) {\n                            return -1;\n                        }\n                        if ((len = m_File.AppendDWord(pElement->GetObjNum())) < 0) {\n                            return -1;\n                        }\n                        if (m_File.AppendString(FX_BSTRC(\" 0 R\")) < 0) {\n                            return -1;\n                        }\n                        m_Offset += len + 5;\n                    } else {\n                        if (WriteDirectObj(objnum, pElement) < 0) {\n                            return -1;\n                        }\n                    }\n                }\n                if (m_File.AppendString(FX_BSTRC(\"]\")) < 0) {\n                    return -1;\n                }\n                m_Offset += 1;\n                break;\n            }\n        case PDFOBJ_DICTIONARY: {\n                if (m_pCryptoHandler == NULL || pObj == m_pEncryptDict) {\n                    return PDF_CreatorAppendObject(pObj, &m_File, m_Offset);\n                }\n                if (m_File.AppendString(FX_BSTRC(\"<<\")) < 0) {\n                    return -1;\n                }\n                m_Offset += 2;\n                CPDF_Dictionary* p = (CPDF_Dictionary*)pObj;\n                FX_BOOL bSignDict = IsSignatureDict(p);\n                FX_POSITION pos = p->GetStartPos();\n                while (pos) {\n                    FX_BOOL bSignValue = FALSE;\n                    CFX_ByteString key;\n                    CPDF_Object* pValue = p->GetNextElement(pos, key);\n                    if (m_File.AppendString(FX_BSTRC(\"/\")) < 0) {\n                        return -1;\n                    }\n                    if ((len = m_File.AppendString(PDF_NameEncode(key))) < 0) {\n                        return -1;\n                    }\n                    m_Offset += len + 1;\n                    if (bSignDict && key == FX_BSTRC(\"Contents\")) {\n                        bSignValue = TRUE;\n                    }\n                    if (pValue->GetObjNum()) {\n                        if (m_File.AppendString(FX_BSTRC(\" \")) < 0) {\n                            return -1;\n                        }\n                        if ((len = m_File.AppendDWord(pValue->GetObjNum())) < 0) {\n                            return -1;\n                        }\n                        if (m_File.AppendString(FX_BSTRC(\" 0 R \")) < 0) {\n                            return -1;\n                        }\n                        m_Offset += len + 6;\n                    } else {\n                        if (WriteDirectObj(objnum, pValue, !bSignValue) < 0) {\n                            return -1;\n                        }\n                    }\n                }\n                if (m_File.AppendString(FX_BSTRC(\">>\")) < 0) {\n                    return -1;\n                }\n                m_Offset += 2;\n                break;\n            }\n    }\n    return 1;\n}\nFX_INT32 CPDF_Creator::WriteOldIndirectObject(FX_DWORD objnum)\n{\n    if(m_pParser->m_V5Type[objnum] == 0 || m_pParser->m_V5Type[objnum] == 255) {\n        return 0;\n    }\n    m_ObjectOffset[objnum] = m_Offset;\n    FX_LPVOID valuetemp = NULL;\n    FX_BOOL bExistInMap = m_pDocument->m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, valuetemp);\n    FX_BOOL bObjStm = (m_pParser->m_V5Type[objnum] == 2) && m_pEncryptDict && !m_pXRefStream;\n    if(m_pParser->m_bVersionUpdated || m_bSecurityChanged || bExistInMap || bObjStm) {\n        CPDF_Object* pObj = m_pDocument->GetIndirectObject(objnum);\n        if (pObj == NULL) {\n            m_ObjectOffset[objnum] = 0;\n            m_ObjectSize[objnum] = 0;\n            return 0;\n        }\n        if (WriteIndirectObj(pObj)) {\n            return -1;\n        }\n        if (!bExistInMap) {\n            m_pDocument->ReleaseIndirectObject(objnum);\n        }\n    } else {\n        FX_BYTE* pBuffer;\n        FX_DWORD size;\n        m_pParser->GetIndirectBinary(objnum, pBuffer, size);\n        if (pBuffer == NULL) {\n            return 0;\n        }\n        if (m_pParser->m_V5Type[objnum] == 2) {\n            if (m_pXRefStream) {\n                if (WriteIndirectObjectToStream(objnum, pBuffer, size) < 0) {\n                    FX_Free(pBuffer);\n                    return -1;\n                }\n            } else {\n                FX_INT32 len = m_File.AppendDWord(objnum);\n                if (len < 0) {\n                    return -1;\n                }\n                if (m_File.AppendString(FX_BSTRC(\" 0 obj \")) < 0) {\n                    return -1;\n                }\n                m_Offset += len + 7;\n                if (m_File.AppendBlock(pBuffer, size) < 0) {\n                    return -1;\n                }\n                m_Offset += size;\n                if (m_File.AppendString(FX_BSTRC(\"\\r\\nendobj\\r\\n\")) < 0) {\n                    return -1;\n                }\n                m_Offset += 10;\n            }\n        } else {\n            if (m_File.AppendBlock(pBuffer, size) < 0) {\n                return -1;\n            }\n            m_Offset += size;\n            if(AppendObjectNumberToXRef(objnum) < 0) {\n                return -1;\n            }\n        }\n        FX_Free(pBuffer);\n    }\n    return 1;\n}\nFX_INT32 CPDF_Creator::WriteOldObjs(IFX_Pause *pPause)\n{\n    FX_DWORD nOldSize = m_pParser->m_CrossRef.GetSize();\n    FX_DWORD objnum = (FX_DWORD)(FX_UINTPTR)m_Pos;\n    for(; objnum < nOldSize; objnum ++) {\n        FX_INT32 iRet = WriteOldIndirectObject(objnum);\n        if (!iRet) {\n            continue;\n        }\n        if (iRet < 0) {\n            return iRet;\n        }\n        m_ObjectSize[objnum] = (FX_DWORD)(m_Offset - m_ObjectOffset[objnum]);\n        if (pPause && pPause->NeedToPauseNow()) {\n            m_Pos = (FX_LPVOID)(FX_UINTPTR)(objnum + 1);\n            return 1;\n        }\n    }\n    return 0;\n}\nFX_INT32 CPDF_Creator::WriteNewObjs(FX_BOOL bIncremental, IFX_Pause *pPause)\n{\n    FX_INT32 iCount = m_NewObjNumArray.GetSize();\n    FX_INT32 index = (FX_INT32)(FX_UINTPTR)m_Pos;\n    while (index < iCount) {\n        FX_DWORD objnum = m_NewObjNumArray.ElementAt(index);\n        CPDF_Object *pObj = NULL;\n        m_pDocument->m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, (FX_LPVOID&)pObj);\n        if (NULL == pObj) {\n            ++index;\n            continue;\n        }\n        m_ObjectOffset[objnum] = m_Offset;\n        if (WriteIndirectObj(pObj)) {\n            return -1;\n        }\n        m_ObjectSize[objnum] = (FX_DWORD)(m_Offset - m_ObjectOffset[objnum]);\n        index++;\n        if (pPause && pPause->NeedToPauseNow()) {\n            m_Pos = (FX_POSITION)(FX_UINTPTR)index;\n            return 1;\n        }\n    }\n    return 0;\n}\nvoid CPDF_Creator::InitOldObjNumOffsets()\n{\n    if (!m_pParser) {\n        return;\n    }\n    FX_DWORD j = 0;\n    FX_DWORD dwStart = 0;\n    FX_DWORD dwEnd = m_pParser->GetLastObjNum();\n    while (dwStart <= dwEnd) {\n        while (dwStart <= dwEnd && (m_pParser->m_V5Type[dwStart] == 0 || m_pParser->m_V5Type[dwStart] == 255)) {\n            dwStart++;\n        }\n        if (dwStart > dwEnd) {\n            break;\n        }\n        j = dwStart;\n        while (j <= dwEnd && m_pParser->m_V5Type[j] != 0 && m_pParser->m_V5Type[j] != 255) {\n            j++;\n        }\n        m_ObjectOffset.Add(dwStart, j - dwStart);\n        m_ObjectSize.Add(dwStart, j - dwStart);\n        dwStart = j;\n    }\n}\nvoid CPDF_Creator::InitNewObjNumOffsets()\n{\n    FX_BOOL bIncremental = (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0;\n    FX_BOOL bNoOriginal = (m_dwFlags & FPDFCREATE_NO_ORIGINAL) != 0;\n    FX_DWORD nOldSize = m_pParser ? m_pParser->m_CrossRef.GetSize() : 0;\n    FX_POSITION pos = m_pDocument->m_IndirectObjs.GetStartPosition();\n    while (pos) {\n        size_t key = 0;\n        CPDF_Object* pObj;\n        m_pDocument->m_IndirectObjs.GetNextAssoc(pos, (FX_LPVOID&)key, (FX_LPVOID&)pObj);\n        FX_DWORD objnum = (FX_DWORD)key;\n        if (pObj->GetObjNum() == -1) {\n            continue;\n        }\n        if (bIncremental) {\n            if (!pObj->IsModified()) {\n                continue;\n            }\n        } else {\n            if (objnum < nOldSize && m_pParser->m_V5Type[objnum] != 0) {\n                continue;\n            }\n        }\n        AppendNewObjNum(objnum);\n    }\n    FX_INT32 iCount = m_NewObjNumArray.GetSize();\n    if (iCount == 0) {\n        return;\n    }\n    FX_INT32 i = 0;\n    FX_DWORD dwStartObjNum = 0;\n    FX_BOOL bCrossRefValid = m_pParser && m_pParser->GetLastXRefOffset() > 0;\n    while (i < iCount) {\n        dwStartObjNum = m_NewObjNumArray.ElementAt(i);\n        if ((bIncremental && (bNoOriginal || bCrossRefValid)) || !m_ObjectOffset.GetPtrAt(dwStartObjNum)) {\n            break;\n        }\n        i++;\n    }\n    if (i >= iCount) {\n        return;\n    }\n    FX_DWORD dwLastObjNum = dwStartObjNum;\n    i++;\n    FX_BOOL bNewStart = FALSE;\n    for (; i < iCount; i++) {\n        FX_DWORD dwCurObjNum = m_NewObjNumArray.ElementAt(i);\n        FX_BOOL bExist = (dwCurObjNum < nOldSize && m_ObjectOffset.GetPtrAt(dwCurObjNum) != NULL);\n        if (bExist || dwCurObjNum - dwLastObjNum > 1) {\n            if (!bNewStart) {\n                m_ObjectOffset.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1);\n                m_ObjectSize.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1);\n            }\n            dwStartObjNum = dwCurObjNum;\n        }\n        if (bNewStart) {\n            dwStartObjNum = dwCurObjNum;\n        }\n        bNewStart = bExist;\n        dwLastObjNum = dwCurObjNum;\n    }\n    m_ObjectOffset.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1);\n    m_ObjectSize.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1);\n}\nvoid CPDF_Creator::AppendNewObjNum(FX_DWORD objbum)\n{\n    FX_INT32 iStart = 0, iFind = 0;\n    FX_INT32 iEnd = m_NewObjNumArray.GetUpperBound();\n    while (iStart <= iEnd) {\n        FX_INT32 iMid = (iStart + iEnd) / 2;\n        FX_DWORD dwMid = m_NewObjNumArray.ElementAt(iMid);\n        if (objbum < dwMid) {\n            iEnd = iMid - 1;\n        } else {\n            if (iMid == iEnd) {\n                iFind = iMid + 1;\n                break;\n            }\n            FX_DWORD dwNext = m_NewObjNumArray.ElementAt(iMid + 1);\n            if (objbum < dwNext) {\n                iFind = iMid + 1;\n                break;\n            }\n            iStart = iMid + 1;\n        }\n    }\n    m_NewObjNumArray.InsertAt(iFind, objbum);\n}\nFX_INT32 CPDF_Creator::WriteDoc_Stage1(IFX_Pause *pPause)\n{\n    FXSYS_assert(m_iStage > -1 || m_iStage < 20);\n    if (m_iStage == 0) {\n        if (m_pParser == NULL) {\n            m_dwFlags &= ~FPDFCREATE_INCREMENTAL;\n        }\n        if (m_bSecurityChanged && (m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0) {\n            m_dwFlags &= ~FPDFCREATE_INCREMENTAL;\n        }\n        CPDF_Dictionary* pDict = m_pDocument->GetRoot();\n        m_pMetadata = pDict ? pDict->GetElementValue(FX_BSTRC(\"Metadata\")) : NULL;\n        if (m_dwFlags & FPDFCREATE_OBJECTSTREAM) {\n            m_pXRefStream = FX_NEW CPDF_XRefStream;\n            m_pXRefStream->Start();\n            if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser) {\n                FX_FILESIZE prev = m_pParser->GetLastXRefOffset();\n                m_pXRefStream->m_PrevOffset = prev;\n            }\n        }\n        m_iStage = 10;\n    }\n    if (m_iStage == 10) {\n        if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0) {\n            if (m_File.AppendString(FX_BSTRC(\"%PDF-1.\")) < 0) {\n                return -1;\n            }\n            m_Offset += 7;\n            FX_INT32 version = 7;\n            if (m_FileVersion) {\n                version = m_FileVersion;\n            } else if (m_pParser) {\n                version = m_pParser->GetFileVersion();\n            }\n            FX_INT32 len = m_File.AppendDWord(version % 10);\n            if (len < 0) {\n                return -1;\n            }\n            m_Offset += len;\n            if ((len = m_File.AppendString(FX_BSTRC(\"\\r\\n%\\xA1\\xB3\\xC5\\xD7\\r\\n\"))) < 0) {\n                return -1;\n            }\n            m_Offset += len;\n            InitOldObjNumOffsets();\n            m_iStage = 20;\n        } else {\n            IFX_FileRead* pSrcFile = m_pParser->GetFileAccess();\n            m_Offset = pSrcFile->GetSize();\n            m_Pos = (FX_LPVOID)(FX_UINTPTR)m_Offset;\n            m_iStage = 15;\n        }\n    }\n    if (m_iStage == 15) {\n        if ((m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0 && m_Pos) {\n            IFX_FileRead* pSrcFile = m_pParser->GetFileAccess();\n            FX_BYTE buffer[4096];\n            FX_DWORD src_size = (FX_DWORD)(FX_UINTPTR)m_Pos;\n            while (src_size) {\n                FX_DWORD block_size = src_size > 4096 ? 4096 : src_size;\n                if (!pSrcFile->ReadBlock(buffer, m_Offset - src_size, block_size)) {\n                    return -1;\n                }\n                if (m_File.AppendBlock(buffer, block_size) < 0) {\n                    return -1;\n                }\n                src_size -= block_size;\n                if (pPause && pPause->NeedToPauseNow()) {\n                    m_Pos = (FX_LPVOID)(FX_UINTPTR)src_size;\n                    return 1;\n                }\n            }\n        }\n        if ((m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0 && m_pParser->GetLastXRefOffset() == 0) {\n            InitOldObjNumOffsets();\n            FX_DWORD dwEnd = m_pParser->GetLastObjNum();\n            FX_BOOL bObjStm = (m_dwFlags & FPDFCREATE_OBJECTSTREAM) != 0;\n            for (FX_DWORD objnum = 0; objnum <= dwEnd; objnum++) {\n                if (m_pParser->m_V5Type[objnum] == 0 || m_pParser->m_V5Type[objnum] == 255) {\n                    continue;\n                }\n                m_ObjectOffset[objnum] = m_pParser->m_CrossRef[objnum];\n                if (bObjStm) {\n                    m_pXRefStream->AddObjectNumberToIndexArray(objnum);\n                }\n            }\n            if (bObjStm) {\n                m_pXRefStream->EndXRefStream(this);\n                m_pXRefStream->Start();\n            }\n        }\n        m_iStage = 20;\n    }\n    InitNewObjNumOffsets();\n    return m_iStage;\n}\nFX_INT32 CPDF_Creator::WriteDoc_Stage2(IFX_Pause *pPause)\n{\n    FXSYS_assert(m_iStage >= 20 || m_iStage < 30);\n    if (m_iStage == 20) {\n        if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 && m_pParser) {\n            m_Pos = (FX_LPVOID)(FX_UINTPTR)0;\n            m_iStage = 21;\n        } else {\n            m_iStage = 25;\n        }\n    }\n    if (m_iStage == 21) {\n        FX_INT32 iRet = WriteOldObjs(pPause);\n        if (iRet) {\n            return iRet;\n        }\n        m_iStage = 25;\n    }\n    if (m_iStage == 25) {\n        m_Pos = (FX_LPVOID)(FX_UINTPTR)0;\n        m_iStage = 26;\n    }\n    if (m_iStage == 26) {\n        FX_INT32 iRet = WriteNewObjs((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0, pPause);\n        if (iRet) {\n            return iRet;\n        }\n        m_iStage = 27;\n    }\n    if (m_iStage == 27) {\n        if (NULL != m_pEncryptDict && 0 == m_pEncryptDict->GetObjNum()) {\n            m_dwLastObjNum += 1;\n            FX_FILESIZE saveOffset = m_Offset;\n            if (WriteIndirectObj(m_dwLastObjNum, m_pEncryptDict) < 0) {\n                return -1;\n            }\n            m_ObjectOffset.Add(m_dwLastObjNum, 1);\n            m_ObjectOffset[m_dwLastObjNum] = saveOffset;\n            m_ObjectSize.Add(m_dwLastObjNum, 1);\n            m_ObjectSize[m_dwLastObjNum] = m_Offset - saveOffset;\n            m_dwEnryptObjNum = m_dwLastObjNum;\n            if (m_dwFlags & FPDFCREATE_INCREMENTAL) {\n                m_NewObjNumArray.Add(m_dwLastObjNum);\n            }\n        }\n        m_iStage = 80;\n    }\n    return m_iStage;\n}\nFX_INT32 CPDF_Creator::WriteDoc_Stage3(IFX_Pause *pPause)\n{\n    FXSYS_assert(m_iStage >= 80 || m_iStage < 90);\n    FX_DWORD dwLastObjNum = m_dwLastObjNum;\n    if (m_iStage == 80) {\n        m_XrefStart = m_Offset;\n        if (m_dwFlags & FPDFCREATE_OBJECTSTREAM) {\n            m_pXRefStream->End(this, TRUE);\n            m_XrefStart = m_pXRefStream->m_PrevOffset;\n            m_iStage = 90;\n        } else if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 || !m_pParser->IsXRefStream()) {\n            if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 || m_pParser->GetLastXRefOffset() == 0) {\n                CFX_ByteString str;\n                str = m_ObjectOffset.GetPtrAt(1) ? FX_BSTRC(\"xref\\r\\n\") : FX_BSTRC(\"xref\\r\\n0 1\\r\\n0000000000 65536 f\\r\\n\");\n                if (m_File.AppendString(str) < 0) {\n                    return -1;\n                }\n                m_Pos = (FX_LPVOID)(FX_UINTPTR)1;\n                m_iStage = 81;\n            } else {\n                if (m_File.AppendString(FX_BSTRC(\"xref\\r\\n\")) < 0) {\n                    return -1;\n                }\n                m_Pos = (FX_LPVOID)(FX_UINTPTR)0;\n                m_iStage = 82;\n            }\n        } else {\n            m_iStage = 90;\n        }\n    }\n    if (m_iStage == 81) {\n        CFX_ByteString str;\n        FX_DWORD i = (FX_DWORD)(FX_UINTPTR)m_Pos, j;\n        while (i <= dwLastObjNum) {\n            while (i <= dwLastObjNum && !m_ObjectOffset.GetPtrAt(i)) {\n                i++;\n            }\n            if (i > dwLastObjNum) {\n                break;\n            }\n            j = i;\n            while (j <= dwLastObjNum && m_ObjectOffset.GetPtrAt(j)) {\n                j++;\n            }\n            if (i == 1) {\n                str.Format(\"0 %d\\r\\n0000000000 65536 f\\r\\n\", j);\n            } else {\n                str.Format(\"%d %d\\r\\n\", i, j - i);\n            }\n            if (m_File.AppendBlock((FX_LPCSTR)str, str.GetLength()) < 0) {\n                return -1;\n            }\n            while (i < j) {\n                str.Format(\"%010d 00000 n\\r\\n\", m_ObjectOffset[i ++]);\n                if (m_File.AppendBlock((FX_LPCSTR)str, str.GetLength()) < 0) {\n                    return -1;\n                }\n            }\n            if (i > dwLastObjNum) {\n                break;\n            }\n            if (pPause && pPause->NeedToPauseNow()) {\n                m_Pos = (FX_LPVOID)(FX_UINTPTR)i;\n                return 1;\n            }\n        }\n        m_iStage = 90;\n    }\n    if (m_iStage == 82) {\n        CFX_ByteString str;\n        FX_INT32 iCount = m_NewObjNumArray.GetSize();\n        FX_INT32 i = (FX_INT32)(FX_UINTPTR)m_Pos;\n        while (i < iCount) {\n            FX_INT32 j = i;\n            FX_DWORD objnum = m_NewObjNumArray.ElementAt(i);\n            while (j < iCount) {\n                if (++j == iCount) {\n                    break;\n                }\n                FX_DWORD dwCurrent = m_NewObjNumArray.ElementAt(j);\n                if (dwCurrent - objnum > 1) {\n                    break;\n                }\n                objnum = dwCurrent;\n            }\n            objnum = m_NewObjNumArray.ElementAt(i);\n            if (objnum == 1) {\n                str.Format(\"0 %d\\r\\n0000000000 65536 f\\r\\n\", j - i + 1);\n            } else {\n                str.Format(\"%d %d\\r\\n\", objnum, j - i);\n            }\n            if (m_File.AppendBlock((FX_LPCSTR)str, str.GetLength()) < 0) {\n                return -1;\n            }\n            while (i < j) {\n                objnum = m_NewObjNumArray.ElementAt(i++);\n                str.Format(\"%010d 00000 n\\r\\n\", m_ObjectOffset[objnum]);\n                if (m_File.AppendBlock((FX_LPCSTR)str, str.GetLength()) < 0) {\n                    return -1;\n                }\n            }\n            if (pPause && (i % 100) == 0 && pPause->NeedToPauseNow()) {\n                m_Pos = (FX_LPVOID)(FX_UINTPTR)i;\n                return 1;\n            }\n        }\n        m_iStage = 90;\n    }\n    return m_iStage;\n}\nstatic FX_INT32 _OutPutIndex(CFX_FileBufferArchive* pFile, FX_FILESIZE offset)\n{\n    FXSYS_assert(pFile);\n    if (sizeof(offset) > 4) {\n        if (FX_GETBYTEOFFSET32(offset)) {\n            if (pFile->AppendByte(FX_GETBYTEOFFSET56(offset)) < 0) {\n                return -1;\n            }\n            if (pFile->AppendByte(FX_GETBYTEOFFSET48(offset)) < 0) {\n                return -1;\n            }\n            if (pFile->AppendByte(FX_GETBYTEOFFSET40(offset)) < 0) {\n                return -1;\n            }\n            if (pFile->AppendByte(FX_GETBYTEOFFSET32(offset)) < 0) {\n                return -1;\n            }\n        }\n    }\n    if (pFile->AppendByte(FX_GETBYTEOFFSET24(offset)) < 0) {\n        return -1;\n    }\n    if (pFile->AppendByte(FX_GETBYTEOFFSET16(offset)) < 0) {\n        return -1;\n    }\n    if (pFile->AppendByte(FX_GETBYTEOFFSET8(offset)) < 0) {\n        return -1;\n    }\n    if (pFile->AppendByte(FX_GETBYTEOFFSET0(offset)) < 0) {\n        return -1;\n    }\n    if (pFile->AppendByte(0) < 0) {\n        return -1;\n    }\n    return 0;\n}\nFX_INT32 CPDF_Creator::WriteDoc_Stage4(IFX_Pause *pPause)\n{\n    FXSYS_assert(m_iStage >= 90);\n    if ((m_dwFlags & FPDFCREATE_OBJECTSTREAM) == 0) {\n        FX_BOOL bXRefStream = (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser->IsXRefStream();\n        if (!bXRefStream) {\n            if (m_File.AppendString(FX_BSTRC(\"trailer\\r\\n<<\")) < 0) {\n                return -1;\n            }\n        } else {\n            if (m_File.AppendDWord(m_pDocument->m_LastObjNum + 1) < 0) {\n                return -1;\n            }\n            if (m_File.AppendString(FX_BSTRC(\" 0 obj <<\")) < 0) {\n                return -1;\n            }\n        }\n        if (m_pParser) {\n            CPDF_Dictionary* p = m_pParser->m_pTrailer;\n            FX_POSITION pos = p->GetStartPos();\n            while (pos) {\n                CFX_ByteString key;\n                CPDF_Object* pValue = p->GetNextElement(pos, key);\n                if (key == FX_BSTRC(\"Encrypt\") || key == FX_BSTRC(\"Size\") || key == FX_BSTRC(\"Filter\") ||\n                        key == FX_BSTRC(\"Index\") || key == FX_BSTRC(\"Length\") || key == FX_BSTRC(\"Prev\") ||\n                        key == FX_BSTRC(\"W\") || key == FX_BSTRC(\"XRefStm\") || key == FX_BSTRC(\"ID\")) {\n                    continue;\n                }\n                if (m_File.AppendString((FX_BSTRC(\"/\"))) < 0) {\n                    return -1;\n                }\n                if (m_File.AppendString(PDF_NameEncode(key)) < 0) {\n                    return -1;\n                }\n                if (pValue->GetObjNum()) {\n                    if (m_File.AppendString(FX_BSTRC(\" \")) < 0) {\n                        return -1;\n                    }\n                    if (m_File.AppendDWord(pValue->GetObjNum()) < 0) {\n                        return -1;\n                    }\n                    if (m_File.AppendString(FX_BSTRC(\" 0 R \")) < 0) {\n                        return -1;\n                    }\n                } else {\n                    FX_FILESIZE offset = 0;\n                    if (PDF_CreatorAppendObject(pValue, &m_File, offset) < 0) {\n                        return -1;\n                    }\n                }\n            }\n        } else {\n            if (m_File.AppendString(FX_BSTRC(\"\\r\\n/Root \")) < 0) {\n                return -1;\n            }\n            if (m_File.AppendDWord(m_pDocument->m_pRootDict->GetObjNum()) < 0) {\n                return -1;\n            }\n            if (m_File.AppendString(FX_BSTRC(\" 0 R\\r\\n\")) < 0) {\n                return -1;\n            }\n            if (m_pDocument->m_pInfoDict) {\n                if (m_File.AppendString(FX_BSTRC(\"/Info \")) < 0) {\n                    return -1;\n                }\n                if (m_File.AppendDWord(m_pDocument->m_pInfoDict->GetObjNum()) < 0) {\n                    return -1;\n                }\n                if (m_File.AppendString(FX_BSTRC(\" 0 R\\r\\n\")) < 0) {\n                    return -1;\n                }\n            }\n        }\n        if (m_pEncryptDict) {\n            if (m_File.AppendString(FX_BSTRC(\"/Encrypt\")) < 0) {\n                return -1;\n            }\n            FX_DWORD dwObjNum = m_pEncryptDict->GetObjNum();\n            if (dwObjNum == 0) {\n                dwObjNum = m_pDocument->GetLastObjNum() + 1;\n            }\n            if (m_File.AppendString(FX_BSTRC(\" \")) < 0) {\n                return -1;\n            }\n            if (m_File.AppendDWord(dwObjNum) < 0) {\n                return -1;\n            }\n            if (m_File.AppendString(FX_BSTRC(\" 0 R \")) < 0) {\n                return -1;\n            }\n        }\n        if (m_File.AppendString(FX_BSTRC(\"/Size \")) < 0) {\n            return -1;\n        }\n        if (m_File.AppendDWord(m_dwLastObjNum + (bXRefStream ? 2 : 1)) < 0) {\n            return -1;\n        }\n        if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0) {\n            FX_FILESIZE prev = m_pParser->GetLastXRefOffset();\n            if (prev) {\n                if (m_File.AppendString(FX_BSTRC(\"/Prev \")) < 0) {\n                    return -1;\n                }\n                FX_CHAR offset_buf[20];\n                FXSYS_memset32(offset_buf, 0, sizeof(offset_buf));\n                FXSYS_i64toa(prev, offset_buf, 10);\n                if (m_File.AppendBlock(offset_buf, FXSYS_strlen(offset_buf)) < 0) {\n                    return -1;\n                }\n            }\n        }\n        if (m_pIDArray) {\n            if (m_File.AppendString((FX_BSTRC(\"/ID\"))) < 0) {\n                return -1;\n            }\n            FX_FILESIZE offset = 0;\n            if (PDF_CreatorAppendObject(m_pIDArray, &m_File, offset) < 0) {\n                return -1;\n            }\n        }\n        if (!bXRefStream) {\n            if (m_File.AppendString(FX_BSTRC(\">>\")) < 0) {\n                return -1;\n            }\n        } else {\n            if (m_File.AppendString(FX_BSTRC(\"/W[0 4 1]/Index[\")) < 0) {\n                return -1;\n            }\n            if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser && m_pParser->GetLastXRefOffset() == 0) {\n                FX_DWORD i = 0;\n                for (i = 0; i < m_dwLastObjNum; i++) {\n                    if (!m_ObjectOffset.GetPtrAt(i)) {\n                        continue;\n                    }\n                    if (m_File.AppendDWord(i) < 0) {\n                        return -1;\n                    }\n                    if (m_File.AppendString(FX_BSTRC(\" 1 \")) < 0) {\n                        return -1;\n                    }\n                }\n                if (m_File.AppendString(FX_BSTRC(\"]/Length \")) < 0) {\n                    return -1;\n                }\n                if (m_File.AppendDWord(m_dwLastObjNum * 5) < 0) {\n                    return -1;\n                }\n                if (m_File.AppendString(FX_BSTRC(\">>stream\\r\\n\")) < 0) {\n                    return -1;\n                }\n                for (i = 0; i < m_dwLastObjNum; i++) {\n                    FX_FILESIZE* offset = m_ObjectOffset.GetPtrAt(i);\n                    if (!offset) {\n                        continue;\n                    }\n                    _OutPutIndex(&m_File, *offset);\n                }\n            } else {\n                int count = m_NewObjNumArray.GetSize();\n                FX_INT32 i = 0;\n                for (i = 0; i < count; i++) {\n                    FX_DWORD objnum = m_NewObjNumArray.ElementAt(i);\n                    if (m_File.AppendDWord(objnum) < 0) {\n                        return -1;\n                    }\n                    if (m_File.AppendString(FX_BSTRC(\" 1 \")) < 0) {\n                        return -1;\n                    }\n                }\n                if (m_File.AppendString(FX_BSTRC(\"]/Length \")) < 0) {\n                    return -1;\n                }\n                if (m_File.AppendDWord(count * 5) < 0) {\n                    return -1;\n                }\n                if (m_File.AppendString(FX_BSTRC(\">>stream\\r\\n\")) < 0) {\n                    return -1;\n                }\n                for (i = 0; i < count; i++) {\n                    FX_DWORD objnum = m_NewObjNumArray.ElementAt(i);\n                    FX_FILESIZE offset = m_ObjectOffset[objnum];\n                    _OutPutIndex(&m_File, offset);\n                }\n            }\n            if (m_File.AppendString(FX_BSTRC(\"\\r\\nendstream\")) < 0) {\n                return -1;\n            }\n        }\n    }\n    if (m_File.AppendString(FX_BSTRC(\"\\r\\nstartxref\\r\\n\")) < 0) {\n        return -1;\n    }\n    FX_CHAR offset_buf[20];\n    FXSYS_memset32(offset_buf, 0, sizeof(offset_buf));\n    FXSYS_i64toa(m_XrefStart, offset_buf, 10);\n    if (m_File.AppendBlock(offset_buf, FXSYS_strlen(offset_buf)) < 0) {\n        return -1;\n    }\n    if (m_File.AppendString(FX_BSTRC(\"\\r\\n%%EOF\\r\\n\")) < 0) {\n        return -1;\n    }\n    m_File.Flush();\n    return m_iStage = 100;\n}\nvoid CPDF_Creator::Clear()\n{\n    if (m_pXRefStream) {\n        delete m_pXRefStream;\n        m_pXRefStream = NULL;\n    }\n    m_File.Clear();\n    m_NewObjNumArray.RemoveAll();\n    if (m_pIDArray) {\n        m_pIDArray->Release();\n        m_pIDArray = NULL;\n    }\n}\nFX_BOOL CPDF_Creator::Create(FX_LPCSTR filename, FX_DWORD flags)\n{\n    if (!m_File.AttachFile(filename)) {\n        return FALSE;\n    }\n    FX_BOOL bRet = Create(flags);\n    if (!bRet || !(flags & FPDFCREATE_PROGRESSIVE)) {\n        Clear();\n    }\n    return bRet;\n}\nFX_BOOL CPDF_Creator::Create(FX_LPCWSTR filename, FX_DWORD flags)\n{\n    if (!m_File.AttachFile(filename)) {\n        return FALSE;\n    }\n    FX_BOOL bRet = Create(flags);\n    if (!bRet || !(flags & FPDFCREATE_PROGRESSIVE)) {\n        Clear();\n    }\n    return bRet;\n}\nFX_BOOL CPDF_Creator::Create(IFX_StreamWrite* pFile, FX_DWORD flags)\n{\n    if (!pFile) {\n        return FALSE;\n    }\n    if (!m_File.AttachFile(pFile, FALSE)) {\n        return FALSE;\n    }\n    return Create(flags);\n}\nFX_BOOL CPDF_Creator::Create(FX_DWORD flags)\n{\n    m_dwFlags = flags;\n    m_iStage = 0;\n    m_Offset = 0;\n    m_dwLastObjNum = m_pDocument->GetLastObjNum();\n    m_ObjectOffset.Clear();\n    m_ObjectSize.Clear();\n    m_NewObjNumArray.RemoveAll();\n    InitID();\n    if (flags & FPDFCREATE_PROGRESSIVE) {\n        return TRUE;\n    }\n    return Continue(NULL) > -1;\n}\nvoid CPDF_Creator::InitID(FX_BOOL bDefault )\n{\n    CPDF_Array* pOldIDArray = m_pParser ? m_pParser->GetIDArray() : NULL;\n    FX_BOOL bNewId = !m_pIDArray;\n    if (!m_pIDArray) {\n        FX_LPDWORD pBuffer = NULL;\n        m_pIDArray = CPDF_Array::Create();\n        CPDF_Object* pID1 = pOldIDArray ? pOldIDArray->GetElement(0) : NULL;\n        if (pID1) {\n            m_pIDArray->Add(pID1->Clone());\n        } else {\n            pBuffer = FX_Alloc(FX_DWORD, 4);\n            PDF_GenerateFileID((FX_DWORD)(FX_UINTPTR)this, m_dwLastObjNum, pBuffer);\n            CFX_ByteStringC bsBuffer((FX_LPCBYTE)pBuffer, 4 * sizeof(FX_DWORD));\n            m_pIDArray->Add(CPDF_String::Create(bsBuffer, TRUE), m_pDocument);\n        }\n        if (pBuffer) {\n            FX_Free(pBuffer);\n        }\n    }\n    if (!bDefault) {\n        return;\n    }\n    if (pOldIDArray) {\n        CPDF_Object* pID2 = pOldIDArray->GetElement(1);\n        if ((m_dwFlags & FPDFCREATE_INCREMENTAL) && m_pEncryptDict && pID2) {\n            m_pIDArray->Add(pID2->Clone());\n            return;\n        }\n        FX_LPDWORD pBuffer = FX_Alloc(FX_DWORD, 4);\n        PDF_GenerateFileID((FX_DWORD)(FX_UINTPTR)this, m_dwLastObjNum, pBuffer);\n        CFX_ByteStringC bsBuffer((FX_LPCBYTE)pBuffer, 4 * sizeof(FX_DWORD));\n        m_pIDArray->Add(CPDF_String::Create(bsBuffer, TRUE), m_pDocument);\n        FX_Free(pBuffer);\n        return;\n    }\n    m_pIDArray->Add(m_pIDArray->GetElement(0)->Clone());\n    if (m_pEncryptDict && !pOldIDArray && m_pParser && bNewId) {\n        if (m_pEncryptDict->GetString(FX_BSTRC(\"Filter\")) == FX_BSTRC(\"Standard\")) {\n            CPDF_StandardSecurityHandler handler;\n            CFX_ByteString user_pass = m_pParser->GetPassword();\n            FX_DWORD flag = PDF_ENCRYPT_CONTENT;\n            handler.OnCreate(m_pEncryptDict, m_pIDArray, (FX_LPCBYTE)user_pass, user_pass.GetLength(), flag);\n            if (m_pCryptoHandler && m_bNewCrypto) {\n                delete m_pCryptoHandler;\n            }\n            m_pCryptoHandler = FX_NEW CPDF_StandardCryptoHandler;\n            m_pCryptoHandler->Init(m_pEncryptDict, &handler);\n            m_bNewCrypto = TRUE;\n            m_bSecurityChanged = TRUE;\n        }\n    }\n}\nFX_INT32 CPDF_Creator::Continue(IFX_Pause *pPause)\n{\n    if (m_iStage < 0) {\n        return m_iStage;\n    }\n    FX_INT32 iRet;\n    while (m_iStage < 100) {\n        if (m_iStage < 20) {\n            iRet = WriteDoc_Stage1(pPause);\n        } else if (m_iStage < 30) {\n            iRet = WriteDoc_Stage2(pPause);\n        } else if (m_iStage < 90) {\n            iRet = WriteDoc_Stage3(pPause);\n        } else {\n            iRet = WriteDoc_Stage4(pPause);\n        }\n        if (iRet < m_iStage) {\n            break;\n        }\n    }\n    if (iRet < 1 || m_iStage == 100) {\n        m_iStage = -1;\n        Clear();\n        return iRet > 99 ? 0 : (iRet < 1 ? -1 : iRet);\n    }\n    return m_iStage;\n}\nFX_BOOL CPDF_Creator::SetFileVersion(FX_INT32 fileVersion )\n{\n    if (fileVersion < 10 || fileVersion > 17) {\n        return FALSE;\n    }\n    m_FileVersion = fileVersion;\n    return TRUE;\n}\nvoid CPDF_Creator::RemoveSecurity()\n{\n    ResetStandardSecurity();\n    m_bSecurityChanged = TRUE;\n    m_pEncryptDict = NULL;\n    m_pCryptoHandler = NULL;\n}\nvoid CPDF_Creator::ResetStandardSecurity()\n{\n    if ((m_bStandardSecurity || m_bNewCrypto) && m_pCryptoHandler) {\n        delete m_pCryptoHandler;\n        m_pCryptoHandler = NULL;\n    }\n    m_bNewCrypto = FALSE;\n    if (!m_bStandardSecurity) {\n        return;\n    }\n    if (m_pEncryptDict) {\n        m_pEncryptDict->Release();\n        m_pEncryptDict = NULL;\n    }\n    m_bStandardSecurity = FALSE;\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_page.h\"\n#include \"../../../include/fpdfapi/fpdf_module.h\"\n#include \"../fpdf_page/pageint.h\"\n#include <limits.h>\nCPDF_Document::CPDF_Document() : CPDF_IndirectObjects(NULL)\n{\n    m_pRootDict = NULL;\n    m_pInfoDict = NULL;\n    m_bLinearized = FALSE;\n    m_dwFirstPageNo = 0;\n    m_dwFirstPageObjNum = 0;\n    m_pDocPage = CPDF_ModuleMgr::Get()->GetPageModule()->CreateDocData(this);\n    m_pDocRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreateDocData(this);\n}\nvoid CPDF_Document::CreateNewDoc()\n{\n    ASSERT(m_pRootDict == NULL && m_pInfoDict == NULL);\n    m_pRootDict = FX_NEW CPDF_Dictionary;\n    m_pRootDict->SetAtName(\"Type\", \"Catalog\");\n    int objnum = AddIndirectObject(m_pRootDict);\n    CPDF_Dictionary* pPages = FX_NEW CPDF_Dictionary;\n    pPages->SetAtName(\"Type\", \"Pages\");\n    pPages->SetAtNumber(\"Count\", 0);\n    pPages->SetAt(\"Kids\", FX_NEW CPDF_Array);\n    objnum = AddIndirectObject(pPages);\n    m_pRootDict->SetAtReference(\"Pages\", this, objnum);\n    m_pInfoDict = FX_NEW CPDF_Dictionary;\n    AddIndirectObject(m_pInfoDict);\n}\nstatic const FX_WCHAR g_FX_CP874Unicodes[128] = {\n    0x20AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x2026, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07,\n    0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F,\n    0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17,\n    0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F,\n    0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27,\n    0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F,\n    0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37,\n    0x0E38, 0x0E39, 0x0E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E3F,\n    0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47,\n    0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F,\n    0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57,\n    0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0x0000, 0x0000, 0x0000, 0x0000,\n};\nstatic const FX_WCHAR g_FX_CP1250Unicodes[128] = {\n    0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021,\n    0x0000, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179,\n    0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,\n    0x0000, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A,\n    0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7,\n    0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B,\n    0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7,\n    0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C,\n    0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7,\n    0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E,\n    0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7,\n    0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,\n    0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7,\n    0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,\n    0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7,\n    0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9,\n};\nstatic const FX_WCHAR g_FX_CP1251Unicodes[128] = {\n    0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021,\n    0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F,\n    0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,\n    0x0000, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F,\n    0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7,\n    0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407,\n    0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7,\n    0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457,\n    0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,\n    0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,\n    0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,\n    0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,\n    0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,\n    0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,\n    0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,\n    0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,\n};\nstatic const FX_WCHAR g_FX_CP1253Unicodes[128] = {\n    0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,\n    0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,\n    0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,\n    0x00A8, 0x00A9, 0x0000, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015,\n    0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7,\n    0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F,\n    0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,\n    0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,\n    0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7,\n    0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF,\n    0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7,\n    0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,\n    0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7,\n    0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000,\n};\nstatic const FX_WCHAR g_FX_CP1254Unicodes[128] = {\n    0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,\n    0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,\n    0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178,\n    0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,\n    0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,\n    0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,\n    0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,\n    0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,\n    0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,\n    0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,\n    0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF,\n    0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,\n    0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,\n    0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,\n    0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF,\n};\nstatic const FX_WCHAR g_FX_CP1255Unicodes[128] = {\n    0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,\n    0x02C6, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,\n    0x02DC, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AA, 0x00A5, 0x00A6, 0x00A7,\n    0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,\n    0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,\n    0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,\n    0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7,\n    0x05B8, 0x05B9, 0x0000, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF,\n    0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3,\n    0x05F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7,\n    0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,\n    0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7,\n    0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000,\n};\nstatic const FX_WCHAR g_FX_CP1256Unicodes[128] = {\n    0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,\n    0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688,\n    0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,\n    0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA,\n    0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,\n    0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,\n    0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,\n    0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F,\n    0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,\n    0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F,\n    0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7,\n    0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643,\n    0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7,\n    0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF,\n    0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7,\n    0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2,\n};\nstatic const FX_WCHAR g_FX_CP1257Unicodes[128] = {\n    0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021,\n    0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x00A8, 0x02C7, 0x00B8,\n    0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,\n    0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x00AF, 0x02DB, 0x0000,\n    0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x0000, 0x00A6, 0x00A7,\n    0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6,\n    0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,\n    0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6,\n    0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112,\n    0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B,\n    0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7,\n    0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF,\n    0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113,\n    0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C,\n    0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7,\n    0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9,\n};\ntypedef struct {\n    FX_BYTE\t\tm_Charset;\n    const FX_WCHAR*\tm_pUnicodes;\n} FX_CharsetUnicodes;\nconst FX_CharsetUnicodes g_FX_CharsetUnicodes[] = {\n    { FXFONT_THAI_CHARSET, g_FX_CP874Unicodes },\n    { FXFONT_EASTEUROPE_CHARSET, g_FX_CP1250Unicodes },\n    { FXFONT_RUSSIAN_CHARSET, g_FX_CP1251Unicodes },\n    { FXFONT_GREEK_CHARSET, g_FX_CP1253Unicodes },\n    { FXFONT_TURKISH_CHARSET, g_FX_CP1254Unicodes },\n    { FXFONT_HEBREW_CHARSET, g_FX_CP1255Unicodes },\n    { FXFONT_ARABIC_CHARSET, g_FX_CP1256Unicodes },\n    { FXFONT_BALTIC_CHARSET, g_FX_CP1257Unicodes },\n};\n#if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_WIN64_)\nstatic void _InsertWidthArray(HDC hDC, int start, int end, CPDF_Array* pWidthArray)\n{\n    int size = end - start + 1;\n    int* widths = FX_Alloc(int, size);\n    GetCharWidth(hDC, start, end, widths);\n    int i;\n    for (i = 1; i < size; i ++)\n        if (widths[i] != *widths) {\n            break;\n        }\n    if (i == size) {\n        int first = pWidthArray->GetInteger(pWidthArray->GetCount() - 1);\n        pWidthArray->AddInteger(first + size - 1);\n        pWidthArray->AddInteger(*widths);\n    } else {\n        CPDF_Array* pWidthArray1 = FX_NEW CPDF_Array;\n        pWidthArray->Add(pWidthArray1);\n        for (i = 0; i < size; i ++) {\n            pWidthArray1->AddInteger(widths[i]);\n        }\n    }\n    FX_Free(widths);\n}\nCPDF_Font* CPDF_Document::AddWindowsFont(LOGFONTW* pLogFont, FX_BOOL bVert, FX_BOOL bTranslateName)\n{\n    LOGFONTA lfa;\n    FXSYS_memcpy32(&lfa, pLogFont, (char*)lfa.lfFaceName - (char*)&lfa);\n    CFX_ByteString face = CFX_ByteString::FromUnicode(pLogFont->lfFaceName);\n    if (face.GetLength() >= LF_FACESIZE) {\n        return NULL;\n    }\n    FXSYS_strcpy(lfa.lfFaceName, (FX_LPCSTR)face);\n    return AddWindowsFont(&lfa, bVert, bTranslateName);\n}\nextern CFX_ByteString _FPDF_GetNameFromTT(FX_LPCBYTE name_table, FX_DWORD name);\nCFX_ByteString _FPDF_GetPSNameFromTT(HDC hDC)\n{\n    CFX_ByteString result;\n    DWORD size = ::GetFontData(hDC, 'eman', 0, NULL, 0);\n    if (size != GDI_ERROR) {\n        LPBYTE buffer = FX_Alloc(BYTE, size);\n        ::GetFontData(hDC, 'eman', 0, buffer, size);\n        result = _FPDF_GetNameFromTT(buffer, 6);\n        FX_Free(buffer);\n    }\n    return result;\n}\nCPDF_Font* CPDF_Document::AddWindowsFont(LOGFONTA* pLogFont, FX_BOOL bVert, FX_BOOL bTranslateName)\n{\n    pLogFont->lfHeight = -1000;\n    pLogFont->lfWidth = 0;\n    HGDIOBJ hFont = CreateFontIndirectA(pLogFont);\n    HDC hDC = CreateCompatibleDC(NULL);\n    hFont = SelectObject(hDC, hFont);\n    int tm_size = GetOutlineTextMetrics(hDC, 0, NULL);\n    if (tm_size == 0) {\n        hFont = SelectObject(hDC, hFont);\n        DeleteObject(hFont);\n        DeleteDC(hDC);\n        return NULL;\n    }\n    LPBYTE tm_buf = FX_Alloc(BYTE, tm_size);\n    OUTLINETEXTMETRIC* ptm = (OUTLINETEXTMETRIC*)tm_buf;\n    GetOutlineTextMetrics(hDC, tm_size, ptm);\n    int flags = 0, italicangle, ascend, descend, capheight, bbox[4];\n    if (pLogFont->lfItalic) {\n        flags |= PDFFONT_ITALIC;\n    }\n    if ((pLogFont->lfPitchAndFamily & 3) == FIXED_PITCH) {\n        flags |= PDFFONT_FIXEDPITCH;\n    }\n    if ((pLogFont->lfPitchAndFamily & 0xf8) == FF_ROMAN) {\n        flags |= PDFFONT_SERIF;\n    }\n    if ((pLogFont->lfPitchAndFamily & 0xf8) == FF_SCRIPT) {\n        flags |= PDFFONT_SCRIPT;\n    }\n    FX_BOOL bCJK = pLogFont->lfCharSet == CHINESEBIG5_CHARSET || pLogFont->lfCharSet == GB2312_CHARSET ||\n                   pLogFont->lfCharSet == HANGEUL_CHARSET || pLogFont->lfCharSet == SHIFTJIS_CHARSET;\n    CFX_ByteString basefont;\n    if (bTranslateName && bCJK) {\n        basefont = _FPDF_GetPSNameFromTT(hDC);\n    }\n    if (basefont.IsEmpty()) {\n        basefont = pLogFont->lfFaceName;\n    }\n    italicangle = ptm->otmItalicAngle / 10;\n    ascend = ptm->otmrcFontBox.top;\n    descend = ptm->otmrcFontBox.bottom;\n    capheight = ptm->otmsCapEmHeight;\n    bbox[0] = ptm->otmrcFontBox.left;\n    bbox[1] = ptm->otmrcFontBox.bottom;\n    bbox[2] = ptm->otmrcFontBox.right;\n    bbox[3] = ptm->otmrcFontBox.top;\n    FX_Free(tm_buf);\n    basefont.Replace(\" \", \"\");\n    CPDF_Dictionary* pBaseDict = FX_NEW CPDF_Dictionary;\n    pBaseDict->SetAtName(\"Type\", \"Font\");\n    CPDF_Dictionary* pFontDict = pBaseDict;\n    if (!bCJK) {\n        if (pLogFont->lfCharSet == ANSI_CHARSET || pLogFont->lfCharSet == DEFAULT_CHARSET ||\n                pLogFont->lfCharSet == SYMBOL_CHARSET) {\n            if (pLogFont->lfCharSet == SYMBOL_CHARSET) {\n                flags |= PDFFONT_SYMBOLIC;\n            } else {\n                flags |= PDFFONT_NONSYMBOLIC;\n            }\n            pBaseDict->SetAtName(FX_BSTRC(\"Encoding\"), \"WinAnsiEncoding\");\n        } else {\n            flags |= PDFFONT_NONSYMBOLIC;\n            int i;\n            for (i = 0; i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes); i ++)\n                if (g_FX_CharsetUnicodes[i].m_Charset == pLogFont->lfCharSet) {\n                    break;\n                }\n            if (i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes)) {\n                CPDF_Dictionary* pEncoding = FX_NEW CPDF_Dictionary;\n                pEncoding->SetAtName(FX_BSTRC(\"BaseEncoding\"), \"WinAnsiEncoding\");\n                CPDF_Array* pArray = FX_NEW CPDF_Array;\n                pArray->AddInteger(128);\n                const FX_WCHAR* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes;\n                for (int j = 0; j < 128; j ++) {\n                    CFX_ByteString name = PDF_AdobeNameFromUnicode(pUnicodes[j]);\n                    if (name.IsEmpty()) {\n                        pArray->AddName(FX_BSTRC(\".notdef\"));\n                    } else {\n                        pArray->AddName(name);\n                    }\n                }\n                pEncoding->SetAt(FX_BSTRC(\"Differences\"), pArray);\n                AddIndirectObject(pEncoding);\n                pBaseDict->SetAtReference(FX_BSTRC(\"Encoding\"), this, pEncoding);\n            }\n        }\n        if (pLogFont->lfWeight > FW_MEDIUM && pLogFont->lfItalic) {\n            basefont += \",BoldItalic\";\n        } else if (pLogFont->lfWeight > FW_MEDIUM) {\n            basefont += \",Bold\";\n        } else if (pLogFont->lfItalic) {\n            basefont += \",Italic\";\n        }\n        pBaseDict->SetAtName(\"Subtype\", \"TrueType\");\n        pBaseDict->SetAtName(\"BaseFont\", basefont);\n        pBaseDict->SetAtNumber(\"FirstChar\", 32);\n        pBaseDict->SetAtNumber(\"LastChar\", 255);\n        int char_widths[224];\n        GetCharWidth(hDC, 32, 255, char_widths);\n        CPDF_Array* pWidths = FX_NEW CPDF_Array;\n        for (int i = 0; i < 224; i ++) {\n            pWidths->AddInteger(char_widths[i]);\n        }\n        pBaseDict->SetAt(\"Widths\", pWidths);\n    } else {\n        flags |= PDFFONT_NONSYMBOLIC;\n        pFontDict = FX_NEW CPDF_Dictionary;\n        CFX_ByteString cmap;\n        CFX_ByteString ordering;\n        int supplement;\n        CPDF_Array* pWidthArray = FX_NEW CPDF_Array;\n        switch (pLogFont->lfCharSet) {\n            case CHINESEBIG5_CHARSET:\n                cmap = bVert ? \"ETenms-B5-V\" : \"ETenms-B5-H\";\n                ordering = \"CNS1\";\n                supplement = 4;\n                pWidthArray->AddInteger(1);\n                _InsertWidthArray(hDC, 0x20, 0x7e, pWidthArray);\n                break;\n            case GB2312_CHARSET:\n                cmap = bVert ? \"GBK-EUC-V\" : \"GBK-EUC-H\";\n                ordering = \"GB1\", supplement = 2;\n                pWidthArray->AddInteger(7716);\n                _InsertWidthArray(hDC, 0x20, 0x20, pWidthArray);\n                pWidthArray->AddInteger(814);\n                _InsertWidthArray(hDC, 0x21, 0x7e, pWidthArray);\n                break;\n            case HANGEUL_CHARSET:\n                cmap = bVert ? \"KSCms-UHC-V\" : \"KSCms-UHC-H\";\n                ordering = \"Korea1\";\n                supplement = 2;\n                pWidthArray->AddInteger(1);\n                _InsertWidthArray(hDC, 0x20, 0x7e, pWidthArray);\n                break;\n            case SHIFTJIS_CHARSET:\n                cmap = bVert ? \"90ms-RKSJ-V\" : \"90ms-RKSJ-H\";\n                ordering = \"Japan1\";\n                supplement = 5;\n                pWidthArray->AddInteger(231);\n                _InsertWidthArray(hDC, 0x20, 0x7d, pWidthArray);\n                pWidthArray->AddInteger(326);\n                _InsertWidthArray(hDC, 0xa0, 0xa0, pWidthArray);\n                pWidthArray->AddInteger(327);\n                _InsertWidthArray(hDC, 0xa1, 0xdf, pWidthArray);\n                pWidthArray->AddInteger(631);\n                _InsertWidthArray(hDC, 0x7e, 0x7e, pWidthArray);\n                break;\n        }\n        pBaseDict->SetAtName(\"Subtype\", \"Type0\");\n        pBaseDict->SetAtName(\"BaseFont\", basefont);\n        pBaseDict->SetAtName(\"Encoding\", cmap);\n        pFontDict->SetAt(\"W\", pWidthArray);\n        pFontDict->SetAtName(\"Type\", \"Font\");\n        pFontDict->SetAtName(\"Subtype\", \"CIDFontType2\");\n        pFontDict->SetAtName(\"BaseFont\", basefont);\n        CPDF_Dictionary* pCIDSysInfo = FX_NEW CPDF_Dictionary;\n        pCIDSysInfo->SetAtString(\"Registry\", \"Adobe\");\n        pCIDSysInfo->SetAtString(\"Ordering\", ordering);\n        pCIDSysInfo->SetAtInteger(\"Supplement\", supplement);\n        pFontDict->SetAt(\"CIDSystemInfo\", pCIDSysInfo);\n        CPDF_Array* pArray = FX_NEW CPDF_Array;\n        pBaseDict->SetAt(\"DescendantFonts\", pArray);\n        AddIndirectObject(pFontDict);\n        pArray->AddReference(this, pFontDict);\n    }\n    AddIndirectObject(pBaseDict);\n    CPDF_Dictionary* pFontDesc = FX_NEW CPDF_Dictionary;\n    pFontDesc->SetAtName(\"Type\", \"FontDescriptor\");\n    pFontDesc->SetAtName(\"FontName\", basefont);\n    pFontDesc->SetAtInteger(\"Flags\", flags);\n    CPDF_Array* pBBox = FX_NEW CPDF_Array;\n    for (int i = 0; i < 4; i ++) {\n        pBBox->AddInteger(bbox[i]);\n    }\n    pFontDesc->SetAt(\"FontBBox\", pBBox);\n    pFontDesc->SetAtInteger(\"ItalicAngle\", italicangle);\n    pFontDesc->SetAtInteger(\"Ascent\", ascend);\n    pFontDesc->SetAtInteger(\"Descent\", descend);\n    pFontDesc->SetAtInteger(\"CapHeight\", capheight);\n    pFontDesc->SetAtInteger(\"StemV\", pLogFont->lfWeight / 5);\n    AddIndirectObject(pFontDesc);\n    pFontDict->SetAtReference(\"FontDescriptor\", this, pFontDesc);\n    hFont = SelectObject(hDC, hFont);\n    DeleteObject(hFont);\n    DeleteDC(hDC);\n    return LoadFont(pBaseDict);\n}\n#endif\n#if (_FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_)\nFX_UINT32 FX_GetLangHashCode( FX_LPCSTR pStr)\n{\n    FXSYS_assert( pStr != NULL);\n    FX_INT32 iLength = FXSYS_strlen(pStr);\n    FX_LPCSTR pStrEnd = pStr + iLength;\n    FX_UINT32 uHashCode = 0;\n    while ( pStr < pStrEnd) {\n        uHashCode = 31 * uHashCode + tolower(*pStr++);\n    }\n    return uHashCode;\n}\nstruct FX_LANG2CS {\n    FX_DWORD    uLang;\n    int         uCharset;\n}*FX_LPLANG2CS;\nstatic const FX_LANG2CS gs_FXLang2CharsetTable[] = {\n    {3109, 0},\n    {3121, 178},\n    {3129, 162},\n    {3139, 204},\n    {3141, 204},\n    {3166, 0},\n    {3184, 238},\n    {3197, 0},\n    {3201, 0},\n    {3239, 161},\n    {3241, 0},\n    {3246, 0},\n    {3247, 186},\n    {3248, 0},\n    {3259, 178},\n    {3267, 0},\n    {3273, 0},\n    {3276, 0},\n    {3301, 0},\n    {3310, 1},\n    {3325, 177},\n    {3329, 1},\n    {3338, 238},\n    {3341, 238},\n    {3345, 1},\n    {3355, 0},\n    {3370, 0},\n    {3371, 0},\n    {3383, 128},\n    {3424, 204},\n    {3427, 1},\n    {3428, 129},\n    {3436, 178},\n    {3464, 186},\n    {3466, 186},\n    {3486, 204},\n    {3487, 0},\n    {3493, 1},\n    {3494, 0},\n    {3508, 0},\n    {3518, 0},\n    {3520, 0},\n    {3569, 1},\n    {3580, 238},\n    {3588, 0},\n    {3645, 238},\n    {3651, 204},\n    {3672, 238},\n    {3673, 238},\n    {3678, 238},\n    {3679, 238},\n    {3683, 0},\n    {3684, 0},\n    {3693, 1},\n    {3697, 1},\n    {3700, 222},\n    {3710, 162},\n    {3734, 204},\n    {3741, 178},\n    {3749, 162},\n    {3763, 163},\n    {3886, 134},\n    {105943, 0},\n    {106375, 1},\n    {3923451837, 134},\n    {3923451838, 136},\n};\nstatic FX_WORD FX_GetCsFromLangCode(FX_UINT32 uCode)\n{\n    FX_INT32 iStart = 0;\n    FX_INT32 iEnd = sizeof(gs_FXLang2CharsetTable) / sizeof(FX_LANG2CS) - 1;\n    while (iStart <= iEnd) {\n        FX_INT32 iMid = (iStart + iEnd) / 2;\n        const FX_LANG2CS &charset = gs_FXLang2CharsetTable[iMid];\n        if (uCode == charset.uLang) {\n            return charset.uCharset;\n        } else if (uCode < charset.uLang) {\n            iEnd = iMid - 1;\n        } else {\n            iStart = iMid + 1;\n        }\n    };\n    return 0;\n}\nstatic FX_WORD FX_GetCharsetFromLang(FX_LPCSTR pLang, FX_INT32 iLength)\n{\n    FXSYS_assert(pLang);\n    if (iLength < 0) {\n        iLength = FXSYS_strlen(pLang);\n    }\n    FX_UINT32 uHash = FX_GetLangHashCode(pLang);\n    return FX_GetCsFromLangCode(uHash);\n}\nstatic void _CFString2CFXByteString(CFStringRef src, CFX_ByteString &dest)\n{\n    SInt32 len =  CFStringGetLength(src);\n    CFRange range = CFRangeMake(0, len);\n    CFIndex used = 0;\n    UInt8* pBuffer = (UInt8*)calloc(len+1, sizeof(UInt8));\n    CFStringGetBytes(src, range, kCFStringEncodingASCII, 0, false, pBuffer, len, &used);\n    dest = (FX_LPSTR)pBuffer;\n    free(pBuffer);\n}\nFX_BOOL IsHasCharSet(CFArrayRef languages, const CFX_DWordArray &charSets)\n{\n    int iCount = charSets.GetSize();\n    for (int i = 0; i < CFArrayGetCount(languages); ++i) {\n        CFStringRef language = (CFStringRef)CFArrayGetValueAtIndex(languages, i);\n        FX_DWORD CharSet = FX_GetCharsetFromLang(CFStringGetCStringPtr(language, kCFStringEncodingMacRoman), -1);\n        for (int j = 0; j < iCount; ++j) {\n            if (CharSet == charSets[j]) {\n                return TRUE;\n            }\n        }\n    }\n    return FALSE;\n}\nvoid FX_GetCharWidth(CTFontRef font, UniChar start, UniChar end, int* width)\n{\n    CGFloat size = CTFontGetSize(font);\n    for (; start <= end; ++start) {\n        CGGlyph pGlyph = 0;\n        CFIndex count = 1;\n        CTFontGetGlyphsForCharacters(font, &start, &pGlyph, count);\n        CGSize advances;\n        CTFontGetAdvancesForGlyphs(font, kCTFontDefaultOrientation, &pGlyph, &advances, 1);\n        *width = (int)(advances.width / size * 1000) ;\n        width++;\n    }\n}\nstatic void _InsertWidthArray(CTFontRef font, int start, int end, CPDF_Array* pWidthArray)\n{\n    int size = end - start + 1;\n    int* widths = FX_Alloc(int, size);\n    FX_GetCharWidth(font, start, end, widths);\n    int i;\n    for (i = 1; i < size; i ++)\n        if (widths[i] != *widths) {\n            break;\n        }\n    if (i == size) {\n        int first = pWidthArray->GetInteger(pWidthArray->GetCount() - 1);\n        pWidthArray->AddInteger(first + size - 1);\n        pWidthArray->AddInteger(*widths);\n    } else {\n        CPDF_Array* pWidthArray1 = FX_NEW CPDF_Array;\n        pWidthArray->Add(pWidthArray1);\n        for (i = 0; i < size; i ++) {\n            pWidthArray1->AddInteger(widths[i]);\n        }\n    }\n    FX_Free(widths);\n}\nCPDF_Font* CPDF_Document::AddMacFont(CTFontRef pFont, FX_BOOL bVert, FX_BOOL bTranslateName)\n{\n    CTFontRef font = (CTFontRef)pFont;\n    CTFontDescriptorRef descriptor = CTFontCopyFontDescriptor(font);\n    if (descriptor == NULL) {\n        return NULL;\n    }\n    CFX_ByteString basefont;\n    FX_BOOL bCJK = FALSE;\n    int flags = 0, italicangle = 0, ascend = 0, descend = 0, capheight = 0, bbox[4];\n    FXSYS_memset32(bbox, 0, sizeof(int) * 4);\n    CFArrayRef languages = (CFArrayRef)CTFontDescriptorCopyAttribute(descriptor, kCTFontLanguagesAttribute);\n    if (languages == NULL) {\n        CFRelease(descriptor);\n        return NULL;\n    }\n    CFX_DWordArray charSets;\n    charSets.Add(FXFONT_CHINESEBIG5_CHARSET);\n    charSets.Add(FXFONT_GB2312_CHARSET);\n    charSets.Add(FXFONT_HANGEUL_CHARSET);\n    charSets.Add(FXFONT_SHIFTJIS_CHARSET);\n    if (IsHasCharSet(languages, charSets)) {\n        bCJK = TRUE;\n    }\n    CFRelease(descriptor);\n    CFDictionaryRef traits = (CFDictionaryRef)CTFontCopyTraits(font);\n    if (traits == NULL) {\n        CFRelease(languages);\n        return NULL;\n    }\n    CFNumberRef sybolicTrait = (CFNumberRef)CFDictionaryGetValue(traits, kCTFontSymbolicTrait);\n    CTFontSymbolicTraits trait = 0;\n    CFNumberGetValue(sybolicTrait, kCFNumberSInt32Type, &trait);\n    if (trait & kCTFontItalicTrait) {\n        flags |= PDFFONT_ITALIC;\n    }\n    if (trait & kCTFontMonoSpaceTrait) {\n        flags |= PDFFONT_FIXEDPITCH;\n    }\n    if (trait & kCTFontModernSerifsClass) {\n        flags |= PDFFONT_SERIF;\n    }\n    if (trait & kCTFontScriptsClass) {\n        flags |= PDFFONT_SCRIPT;\n    }\n    CFNumberRef weightTrait = (CFNumberRef)CFDictionaryGetValue(traits, kCTFontWeightTrait);\n    Float32 weight = 0;\n    CFNumberGetValue(weightTrait, kCFNumberFloat32Type, &weight);\n    italicangle = CTFontGetSlantAngle(font);\n    ascend      = CTFontGetAscent(font);\n    descend     = CTFontGetDescent(font);\n    capheight   = CTFontGetCapHeight(font);\n    CGRect box  = CTFontGetBoundingBox(font);\n    bbox[0]     = box.origin.x;\n    bbox[1]     = box.origin.y;\n    bbox[2]     = box.origin.x + box.size.width;\n    bbox[3]     = box.origin.y + box.size.height;\n    if (bTranslateName && bCJK) {\n        CFStringRef postName = CTFontCopyPostScriptName(font);\n        _CFString2CFXByteString(postName, basefont);\n        CFRelease(postName);\n    }\n    if (basefont.IsEmpty()) {\n        CFStringRef fullName = CTFontCopyFullName(font);\n        _CFString2CFXByteString(fullName, basefont);\n        CFRelease(fullName);\n    }\n    basefont.Replace(\" \", \"\");\n    CPDF_Dictionary* pFontDict = NULL;\n    CPDF_Dictionary* pBaseDict = FX_NEW CPDF_Dictionary;\n    pFontDict = pBaseDict;\n    if (!bCJK) {\n        charSets.RemoveAll();\n        charSets.Add(FXFONT_ANSI_CHARSET);\n        charSets.Add(FXFONT_DEFAULT_CHARSET);\n        charSets.Add(FXFONT_SYMBOL_CHARSET);\n        if (IsHasCharSet(languages, charSets)) {\n            charSets.RemoveAll();\n            charSets.Add(FXFONT_SYMBOL_CHARSET);\n            if (IsHasCharSet(languages, charSets)) {\n                flags |= PDFFONT_SYMBOLIC;\n            } else {\n                flags |= PDFFONT_NONSYMBOLIC;\n            }\n            pBaseDict->SetAtName(FX_BSTRC(\"Encoding\"), \"WinAnsiEncoding\");\n        } else {\n            flags |= PDFFONT_NONSYMBOLIC;\n            int i;\n            for (i = 0; i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes); i ++) {\n                charSets.RemoveAll();\n                charSets.Add(g_FX_CharsetUnicodes[i].m_Charset);\n                if (IsHasCharSet(languages, charSets)) {\n                    break;\n                }\n            }\n            if (i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes)) {\n                CPDF_Dictionary* pEncoding = FX_NEW CPDF_Dictionary;\n                pEncoding->SetAtName(FX_BSTRC(\"BaseEncoding\"), \"WinAnsiEncoding\");\n                CPDF_Array* pArray = FX_NEW CPDF_Array;\n                pArray->AddInteger(128);\n                const FX_WCHAR* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes;\n                for (int j = 0; j < 128; j ++) {\n                    CFX_ByteString name = PDF_AdobeNameFromUnicode(pUnicodes[j]);\n                    if (name.IsEmpty()) {\n                        pArray->AddName(FX_BSTRC(\".notdef\"));\n                    } else {\n                        pArray->AddName(name);\n                    }\n                }\n                pEncoding->SetAt(FX_BSTRC(\"Differences\"), pArray);\n                AddIndirectObject(pEncoding);\n                pBaseDict->SetAtReference(FX_BSTRC(\"Encoding\"), this, pEncoding);\n            }\n        }\n        if (weight > 0.0 && trait & kCTFontItalicTrait) {\n            basefont += \",BoldItalic\";\n        } else if (weight > 0.0) {\n            basefont += \",Bold\";\n        } else if (trait & kCTFontItalicTrait) {\n            basefont += \",Italic\";\n        }\n        pBaseDict->SetAtName(\"Subtype\", \"TrueType\");\n        pBaseDict->SetAtName(\"BaseFont\", basefont);\n        pBaseDict->SetAtNumber(\"FirstChar\", 32);\n        pBaseDict->SetAtNumber(\"LastChar\", 255);\n        int char_widths[224];\n        FX_GetCharWidth(font, 32, 255, char_widths);\n        CPDF_Array* pWidths = FX_NEW CPDF_Array;\n        for (int i = 0; i < 224; i ++) {\n            pWidths->AddInteger(char_widths[i]);\n        }\n        pBaseDict->SetAt(\"Widths\", pWidths);\n    }  else {\n        flags |= PDFFONT_NONSYMBOLIC;\n        CPDF_Array* pArray = NULL;\n        pFontDict = FX_NEW CPDF_Dictionary;\n        CFX_ByteString cmap;\n        CFX_ByteString ordering;\n        int supplement;\n        FX_BOOL bFound = FALSE;\n        CPDF_Array* pWidthArray = FX_NEW CPDF_Array;\n        charSets.RemoveAll();\n        charSets.Add(FXFONT_CHINESEBIG5_CHARSET);\n        if (IsHasCharSet(languages, charSets)) {\n            cmap = bVert ? \"ETenms-B5-V\" : \"ETenms-B5-H\";\n            ordering = \"CNS1\";\n            supplement = 4;\n            pWidthArray->AddInteger(1);\n            _InsertWidthArray(font, 0x20, 0x7e, pWidthArray);\n            bFound = TRUE;\n        }\n        charSets.RemoveAll();\n        charSets.Add(FXFONT_GB2312_CHARSET);\n        if (!bFound && IsHasCharSet(languages, charSets)) {\n            cmap = bVert ? \"GBK-EUC-V\" : \"GBK-EUC-H\";\n            ordering = \"GB1\", supplement = 2;\n            pWidthArray->AddInteger(7716);\n            _InsertWidthArray(font, 0x20, 0x20, pWidthArray);\n            pWidthArray->AddInteger(814);\n            _InsertWidthArray(font, 0x21, 0x7e, pWidthArray);\n            bFound = TRUE;\n        }\n        charSets.RemoveAll();\n        charSets.Add(FXFONT_HANGEUL_CHARSET);\n        if (!bFound && IsHasCharSet(languages, charSets)) {\n            cmap = bVert ? \"KSCms-UHC-V\" : \"KSCms-UHC-H\";\n            ordering = \"Korea1\";\n            supplement = 2;\n            pWidthArray->AddInteger(1);\n            _InsertWidthArray(font, 0x20, 0x7e, pWidthArray);\n            bFound = TRUE;\n        }\n        charSets.RemoveAll();\n        charSets.Add(FXFONT_SHIFTJIS_CHARSET);\n        if (!bFound && IsHasCharSet(languages, charSets)) {\n            cmap = bVert ? \"90ms-RKSJ-V\" : \"90ms-RKSJ-H\";\n            ordering = \"Japan1\";\n            supplement = 5;\n            pWidthArray->AddInteger(231);\n            _InsertWidthArray(font, 0x20, 0x7d, pWidthArray);\n            pWidthArray->AddInteger(326);\n            _InsertWidthArray(font, 0xa0, 0xa0, pWidthArray);\n            pWidthArray->AddInteger(327);\n            _InsertWidthArray(font, 0xa1, 0xdf, pWidthArray);\n            pWidthArray->AddInteger(631);\n            _InsertWidthArray(font, 0x7e, 0x7e, pWidthArray);\n        }\n        pBaseDict->SetAtName(\"Subtype\", \"Type0\");\n        pBaseDict->SetAtName(\"BaseFont\", basefont);\n        pBaseDict->SetAtName(\"Encoding\", cmap);\n        pFontDict->SetAt(\"W\", pWidthArray);\n        pFontDict->SetAtName(\"Type\", \"Font\");\n        pFontDict->SetAtName(\"Subtype\", \"CIDFontType2\");\n        pFontDict->SetAtName(\"BaseFont\", basefont);\n        CPDF_Dictionary* pCIDSysInfo = FX_NEW CPDF_Dictionary;\n        pCIDSysInfo->SetAtString(\"Registry\", \"Adobe\");\n        pCIDSysInfo->SetAtString(\"Ordering\", ordering);\n        pCIDSysInfo->SetAtInteger(\"Supplement\", supplement);\n        pFontDict->SetAt(\"CIDSystemInfo\", pCIDSysInfo);\n        pArray = FX_NEW CPDF_Array;\n        pBaseDict->SetAt(\"DescendantFonts\", pArray);\n        AddIndirectObject(pFontDict);\n        pArray->AddReference(this, pFontDict);\n    }\n    AddIndirectObject(pBaseDict);\n    CPDF_Dictionary* pFontDesc = FX_NEW CPDF_Dictionary;\n    pFontDesc->SetAtName(\"Type\", \"FontDescriptor\");\n    pFontDesc->SetAtName(\"FontName\", basefont);\n    pFontDesc->SetAtInteger(\"Flags\", flags);\n    CPDF_Array* pBBox = FX_NEW CPDF_Array;\n    for (int i = 0; i < 4; i ++) {\n        pBBox->AddInteger(bbox[i]);\n    }\n    pFontDesc->SetAt(\"FontBBox\", pBBox);\n    pFontDesc->SetAtInteger(\"ItalicAngle\", italicangle);\n    pFontDesc->SetAtInteger(\"Ascent\", ascend);\n    pFontDesc->SetAtInteger(\"Descent\", descend);\n    pFontDesc->SetAtInteger(\"CapHeight\", capheight);\n    CGFloat fStemV = 0;\n    int16_t min_width = SHRT_MAX;\n    static const UniChar stem_chars[] = {'i', 'I', '!', '1'};\n    const size_t count = sizeof(stem_chars) / sizeof(stem_chars[0]);\n    CGGlyph glyphs[count];\n    CGRect boundingRects[count];\n    if (CTFontGetGlyphsForCharacters(font, stem_chars, glyphs, count)) {\n        CTFontGetBoundingRectsForGlyphs(font, kCTFontHorizontalOrientation,\n                                        glyphs, boundingRects, count);\n        for (size_t i = 0; i < count; i++) {\n            int16_t width = boundingRects[i].size.width;\n            if (width > 0 && width < min_width) {\n                min_width = width;\n                fStemV = min_width;\n            }\n        }\n    }\n    pFontDesc->SetAtInteger(\"StemV\", fStemV);\n    AddIndirectObject(pFontDesc);\n    pFontDict->SetAtReference(\"FontDescriptor\", this, pFontDesc);\n    CFRelease(traits);\n    CFRelease(languages);\n    return LoadFont(pBaseDict);\n}\n#endif\nstatic void _InsertWidthArray1(CFX_Font* pFont, IFX_FontEncoding* pEncoding, FX_WCHAR start, FX_WCHAR end, CPDF_Array* pWidthArray)\n{\n    int size = end - start + 1;\n    int* widths = FX_Alloc(int, size);\n    int i;\n    for (i = 0; i < size; i ++) {\n        int glyph_index = pEncoding->GlyphFromCharCode(start + i);\n        widths[i] = pFont->GetGlyphWidth(glyph_index);\n    }\n    for (i = 1; i < size; i ++)\n        if (widths[i] != *widths) {\n            break;\n        }\n    if (i == size) {\n        int first = pWidthArray->GetInteger(pWidthArray->GetCount() - 1);\n        pWidthArray->AddInteger(first + size - 1);\n        pWidthArray->AddInteger(*widths);\n    } else {\n        CPDF_Array* pWidthArray1 = FX_NEW CPDF_Array;\n        pWidthArray->Add(pWidthArray1);\n        for (i = 0; i < size; i ++) {\n            pWidthArray1->AddInteger(widths[i]);\n        }\n    }\n    FX_Free(widths);\n}\nCPDF_Font* CPDF_Document::AddFont(CFX_Font* pFont, int charset, FX_BOOL bVert)\n{\n    if (pFont == NULL) {\n        return NULL;\n    }\n    FX_BOOL bCJK = charset == FXFONT_CHINESEBIG5_CHARSET || charset == FXFONT_GB2312_CHARSET ||\n                   charset == FXFONT_HANGEUL_CHARSET || charset == FXFONT_SHIFTJIS_CHARSET;\n    CFX_ByteString basefont = pFont->GetFamilyName();\n    basefont.Replace(\" \", \"\");\n    int flags = 0;\n    if (pFont->IsBold()) {\n        flags |= PDFFONT_FORCEBOLD;\n    }\n    if (pFont->IsItalic()) {\n        flags |= PDFFONT_ITALIC;\n    }\n    if (pFont->IsFixedWidth()) {\n        flags |= PDFFONT_FIXEDPITCH;\n    }\n    CPDF_Dictionary* pBaseDict = FX_NEW CPDF_Dictionary;\n    pBaseDict->SetAtName(\"Type\", \"Font\");\n    IFX_FontEncoding* pEncoding = FXGE_CreateUnicodeEncoding(pFont);\n    CPDF_Dictionary* pFontDict = pBaseDict;\n    if (!bCJK) {\n        CPDF_Array* pWidths = FX_NEW CPDF_Array;\n        int charcode;\n        for (charcode = 32; charcode < 128; charcode ++) {\n            int glyph_index = pEncoding->GlyphFromCharCode(charcode);\n            int char_width = pFont->GetGlyphWidth(glyph_index);\n            pWidths->AddInteger(char_width);\n        }\n        if (charset == FXFONT_ANSI_CHARSET || charset == FXFONT_DEFAULT_CHARSET ||\n                charset == FXFONT_SYMBOL_CHARSET) {\n            if (charset == FXFONT_SYMBOL_CHARSET) {\n                flags |= PDFFONT_SYMBOLIC;\n            } else {\n                flags |= PDFFONT_NONSYMBOLIC;\n            }\n            pBaseDict->SetAtName(FX_BSTRC(\"Encoding\"), \"WinAnsiEncoding\");\n            for (charcode = 128; charcode <= 255; charcode ++) {\n                int glyph_index = pEncoding->GlyphFromCharCode(charcode);\n                int char_width = pFont->GetGlyphWidth(glyph_index);\n                pWidths->AddInteger(char_width);\n            }\n        } else {\n            flags |= PDFFONT_NONSYMBOLIC;\n            int i;\n            for (i = 0; i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes); i ++)\n                if (g_FX_CharsetUnicodes[i].m_Charset == charset) {\n                    break;\n                }\n            if (i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes)) {\n                CPDF_Dictionary* pEncodingDict = FX_NEW CPDF_Dictionary;\n                pEncodingDict->SetAtName(FX_BSTRC(\"BaseEncoding\"), \"WinAnsiEncoding\");\n                CPDF_Array* pArray = FX_NEW CPDF_Array;\n                pArray->AddInteger(128);\n                const FX_WCHAR* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes;\n                for (int j = 0; j < 128; j ++) {\n                    CFX_ByteString name = PDF_AdobeNameFromUnicode(pUnicodes[j]);\n                    if (name.IsEmpty()) {\n                        pArray->AddName(FX_BSTRC(\".notdef\"));\n                    } else {\n                        pArray->AddName(name);\n                    }\n                    int glyph_index = pEncoding->GlyphFromCharCode(pUnicodes[j]);\n                    int char_width = pFont->GetGlyphWidth(glyph_index);\n                    pWidths->AddInteger(char_width);\n                }\n                pEncodingDict->SetAt(FX_BSTRC(\"Differences\"), pArray);\n                AddIndirectObject(pEncodingDict);\n                pBaseDict->SetAtReference(FX_BSTRC(\"Encoding\"), this, pEncodingDict);\n            }\n        }\n        if (pFont->IsBold() && pFont->IsItalic()) {\n            basefont += \",BoldItalic\";\n        } else if (pFont->IsBold()) {\n            basefont += \",Bold\";\n        } else if (pFont->IsItalic()) {\n            basefont += \",Italic\";\n        }\n        pBaseDict->SetAtName(\"Subtype\", \"TrueType\");\n        pBaseDict->SetAtName(\"BaseFont\", basefont);\n        pBaseDict->SetAtNumber(\"FirstChar\", 32);\n        pBaseDict->SetAtNumber(\"LastChar\", 255);\n        pBaseDict->SetAt(\"Widths\", pWidths);\n    } else {\n        flags |= PDFFONT_NONSYMBOLIC;\n        pFontDict = FX_NEW CPDF_Dictionary;\n        CFX_ByteString cmap;\n        CFX_ByteString ordering;\n        int supplement;\n        CPDF_Array* pWidthArray = FX_NEW CPDF_Array;\n        switch (charset) {\n            case FXFONT_CHINESEBIG5_CHARSET:\n                cmap = bVert ? \"ETenms-B5-V\" : \"ETenms-B5-H\";\n                ordering = \"CNS1\";\n                supplement = 4;\n                pWidthArray->AddInteger(1);\n                _InsertWidthArray1(pFont, pEncoding, 0x20, 0x7e, pWidthArray);\n                break;\n            case FXFONT_GB2312_CHARSET:\n                cmap = bVert ? \"GBK-EUC-V\" : \"GBK-EUC-H\";\n                ordering = \"GB1\", supplement = 2;\n                pWidthArray->AddInteger(7716);\n                _InsertWidthArray1(pFont, pEncoding, 0x20, 0x20, pWidthArray);\n                pWidthArray->AddInteger(814);\n                _InsertWidthArray1(pFont, pEncoding, 0x21, 0x7e, pWidthArray);\n                break;\n            case FXFONT_HANGEUL_CHARSET:\n                cmap = bVert ? \"KSCms-UHC-V\" : \"KSCms-UHC-H\";\n                ordering = \"Korea1\";\n                supplement = 2;\n                pWidthArray->AddInteger(1);\n                _InsertWidthArray1(pFont, pEncoding, 0x20, 0x7e, pWidthArray);\n                break;\n            case FXFONT_SHIFTJIS_CHARSET:\n                cmap = bVert ? \"90ms-RKSJ-V\" : \"90ms-RKSJ-H\";\n                ordering = \"Japan1\";\n                supplement = 5;\n                pWidthArray->AddInteger(231);\n                _InsertWidthArray1(pFont, pEncoding, 0x20, 0x7d, pWidthArray);\n                pWidthArray->AddInteger(326);\n                _InsertWidthArray1(pFont, pEncoding, 0xa0, 0xa0, pWidthArray);\n                pWidthArray->AddInteger(327);\n                _InsertWidthArray1(pFont, pEncoding, 0xa1, 0xdf, pWidthArray);\n                pWidthArray->AddInteger(631);\n                _InsertWidthArray1(pFont, pEncoding, 0x7e, 0x7e, pWidthArray);\n                break;\n        }\n        pBaseDict->SetAtName(\"Subtype\", \"Type0\");\n        pBaseDict->SetAtName(\"BaseFont\", basefont);\n        pBaseDict->SetAtName(\"Encoding\", cmap);\n        pFontDict->SetAt(\"W\", pWidthArray);\n        pFontDict->SetAtName(\"Type\", \"Font\");\n        pFontDict->SetAtName(\"Subtype\", \"CIDFontType2\");\n        pFontDict->SetAtName(\"BaseFont\", basefont);\n        CPDF_Dictionary* pCIDSysInfo = FX_NEW CPDF_Dictionary;\n        pCIDSysInfo->SetAtString(\"Registry\", \"Adobe\");\n        pCIDSysInfo->SetAtString(\"Ordering\", ordering);\n        pCIDSysInfo->SetAtInteger(\"Supplement\", supplement);\n        pFontDict->SetAt(\"CIDSystemInfo\", pCIDSysInfo);\n        CPDF_Array* pArray = FX_NEW CPDF_Array;\n        pBaseDict->SetAt(\"DescendantFonts\", pArray);\n        AddIndirectObject(pFontDict);\n        pArray->AddReference(this, pFontDict);\n    }\n    AddIndirectObject(pBaseDict);\n    CPDF_Dictionary* pFontDesc = FX_NEW CPDF_Dictionary;\n    pFontDesc->SetAtName(\"Type\", \"FontDescriptor\");\n    pFontDesc->SetAtName(\"FontName\", basefont);\n    pFontDesc->SetAtInteger(\"Flags\", flags);\n    pFontDesc->SetAtInteger(\"ItalicAngle\", pFont->m_pSubstFont ? pFont->m_pSubstFont->m_ItalicAngle : 0);\n    pFontDesc->SetAtInteger(\"Ascent\", pFont->GetAscent());\n    pFontDesc->SetAtInteger(\"Descent\", pFont->GetDescent());\n    FX_RECT bbox;\n    pFont->GetBBox(bbox);\n    CPDF_Array* pBBox = FX_NEW CPDF_Array;\n    pBBox->AddInteger(bbox.left);\n    pBBox->AddInteger(bbox.bottom);\n    pBBox->AddInteger(bbox.right);\n    pBBox->AddInteger(bbox.top);\n    pFontDesc->SetAt(\"FontBBox\", pBBox);\n    FX_INT32 nStemV = 0;\n    if (pFont->m_pSubstFont) {\n        nStemV = pFont->m_pSubstFont->m_Weight / 5;\n    } else {\n        static const FX_CHAR stem_chars[] = {'i', 'I', '!', '1'};\n        const size_t count = sizeof(stem_chars) / sizeof(stem_chars[0]);\n        FX_DWORD glyph = pEncoding->GlyphFromCharCode(stem_chars[0]);\n        nStemV = pFont->GetGlyphWidth(glyph);\n        for (size_t i = 1; i < count; i++) {\n            glyph = pEncoding->GlyphFromCharCode(stem_chars[i]);\n            int width = pFont->GetGlyphWidth(glyph);\n            if (width > 0 && width < nStemV) {\n                nStemV = width;\n            }\n        }\n    }\n    if (pEncoding) {\n        delete pEncoding;\n    }\n    pFontDesc->SetAtInteger(\"StemV\", nStemV);\n    AddIndirectObject(pFontDesc);\n    pFontDict->SetAtReference(\"FontDescriptor\", this, pFontDesc);\n    return LoadFont(pBaseDict);\n}\nstatic CPDF_Stream* GetFormStream(CPDF_Document* pDoc, CPDF_Object* pResObj)\n{\n    if (pResObj->GetType() != PDFOBJ_REFERENCE) {\n        return NULL;\n    }\n    CPDF_Reference* pRef = (CPDF_Reference*)pResObj;\n    FX_BOOL bForm;\n    if (pDoc->IsFormStream(pRef->GetRefObjNum(), bForm) && !bForm) {\n        return NULL;\n    }\n    pResObj = pRef->GetDirect();\n    if (pResObj->GetType() != PDFOBJ_STREAM) {\n        return NULL;\n    }\n    CPDF_Stream* pXObject = (CPDF_Stream*)pResObj;\n    if (pXObject->GetDict()->GetString(FX_BSTRC(\"Subtype\")) != FX_BSTRC(\"Form\")) {\n        return NULL;\n    }\n    return pXObject;\n}\nstatic int InsertDeletePDFPage(CPDF_Document* pDoc, CPDF_Dictionary* pPages,\n                               int nPagesToGo, CPDF_Dictionary* pPage, FX_BOOL bInsert, CFX_PtrArray& stackList)\n{\n    CPDF_Array* pKidList = pPages->GetArray(\"Kids\");\n    if (!pKidList) {\n        return -1;\n    }\n    int nKids = pKidList->GetCount();\n    for (int i = 0; i < nKids; i ++) {\n        CPDF_Dictionary* pKid = pKidList->GetDict(i);\n        if (pKid->GetString(\"Type\") == FX_BSTRC(\"Page\")) {\n            if (nPagesToGo == 0) {\n                if (bInsert) {\n                    pKidList->InsertAt(i, CPDF_Reference::Create(pDoc, pPage->GetObjNum()));\n                    pPage->SetAtReference(\"Parent\", pDoc, pPages->GetObjNum());\n                } else {\n                    pKidList->RemoveAt(i);\n                }\n                pPages->SetAtInteger(\"Count\", pPages->GetInteger(\"Count\") + (bInsert ? 1 : -1));\n                return 1;\n            }\n            nPagesToGo --;\n        } else {\n            int nPages = pKid->GetInteger(\"Count\");\n            if (nPagesToGo < nPages) {\n                int stackCount = stackList.GetSize();\n                for (int j = 0; j < stackCount; ++j) {\n                    if (pKid == stackList[j]) {\n                        return -1;\n                    }\n                }\n                stackList.Add(pKid);\n                if (InsertDeletePDFPage(pDoc, pKid, nPagesToGo, pPage, bInsert, stackList) < 0) {\n                    return -1;\n                }\n                stackList.RemoveAt(stackCount);\n                pPages->SetAtInteger(\"Count\", pPages->GetInteger(\"Count\") + (bInsert ? 1 : -1));\n                return 1;\n            }\n            nPagesToGo -= nPages;\n        }\n    }\n    return 0;\n}\nstatic int InsertNewPage(CPDF_Document* pDoc, int iPage, CPDF_Dictionary* pPageDict, CFX_DWordArray &pageList)\n{\n    CPDF_Dictionary* pRoot = pDoc->GetRoot();\n    if (!pRoot) {\n        return -1;\n    }\n    CPDF_Dictionary* pPages = pRoot->GetDict(FX_BSTRC(\"Pages\"));\n    if (!pPages) {\n        return -1;\n    }\n    int nPages = pDoc->GetPageCount();\n    if (iPage < 0 || iPage > nPages) {\n        return -1;\n    }\n    if (iPage == nPages) {\n        CPDF_Array* pPagesList = pPages->GetArray(FX_BSTRC(\"Kids\"));\n        if (!pPagesList) {\n            pPagesList = FX_NEW CPDF_Array;\n            pPages->SetAt(FX_BSTRC(\"Kids\"), pPagesList);\n        }\n        pPagesList->Add(pPageDict, pDoc);\n        pPages->SetAtInteger(FX_BSTRC(\"Count\"), nPages + 1);\n        pPageDict->SetAtReference(FX_BSTRC(\"Parent\"), pDoc, pPages->GetObjNum());\n    } else {\n        CFX_PtrArray stack;\n        stack.Add(pPages);\n        if (InsertDeletePDFPage(pDoc, pPages, iPage, pPageDict, TRUE, stack) < 0) {\n            return -1;\n        }\n    }\n    pageList.InsertAt(iPage, pPageDict->GetObjNum());\n    return iPage;\n}\nCPDF_Dictionary* CPDF_Document::CreateNewPage(int iPage)\n{\n    CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;\n    pDict->SetAtName(\"Type\", \"Page\");\n    FX_DWORD dwObjNum = AddIndirectObject(pDict);\n    if (InsertNewPage(this, iPage, pDict, m_PageList) < 0) {\n        ReleaseIndirectObject(dwObjNum);\n        return NULL;\n    }\n    return pDict;\n}\nint _PDF_GetStandardFontName(CFX_ByteString& name);\nCPDF_Font* CPDF_Document::AddStandardFont(FX_LPCSTR font, CPDF_FontEncoding* pEncoding)\n{\n    CFX_ByteString name(font, -1);\n    if (_PDF_GetStandardFontName(name) < 0) {\n        return NULL;\n    }\n    return GetPageData()->GetStandardFont(name, pEncoding);\n}\nvoid CPDF_Document::DeletePage(int iPage)\n{\n    CPDF_Dictionary* pRoot = GetRoot();\n    if (pRoot == NULL) {\n        return;\n    }\n    CPDF_Dictionary* pPages = pRoot->GetDict(\"Pages\");\n    if (pPages == NULL) {\n        return;\n    }\n    int nPages = pPages->GetInteger(\"Count\");\n    if (iPage < 0 || iPage >= nPages) {\n        return;\n    }\n    CFX_PtrArray stack;\n    stack.Add(pPages);\n    if (InsertDeletePDFPage(this, pPages, iPage, NULL, FALSE, stack) < 0) {\n        return;\n    }\n    m_PageList.RemoveAt(iPage);\n}\nCPDF_Object* FPDFAPI_GetPageAttr(CPDF_Dictionary* pPageDict, FX_BSTR name);\nvoid FPDFAPI_FlatPageAttr(CPDF_Dictionary* pPageDict, FX_BSTR name)\n{\n    if (pPageDict->KeyExist(name)) {\n        return;\n    }\n    CPDF_Object* pObj = FPDFAPI_GetPageAttr(pPageDict, name);\n    if (pObj) {\n        pPageDict->SetAt(name, pObj->Clone());\n    }\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_module.h\"\n#include \"../../../include/fpdfapi/fpdf_page.h\"\n#include \"../../../include/fxcodec/fx_codec.h\"\n#include \"../../../include/fpdfapi/fpdf_render.h\"\n#include \"../fpdf_page/pageint.h\"\n#include \"../fpdf_render/render_int.h\"\nCPDF_Dictionary* CPDF_Image::InitJPEG(FX_LPBYTE pData, FX_DWORD size)\n{\n    FX_INT32 width, height, color_trans, num_comps, bits;\n    if (!CPDF_ModuleMgr::Get()->GetJpegModule()->\n            LoadInfo(pData, size, width, height, num_comps, bits, color_trans)) {\n        return NULL;\n    }\n    CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;\n    pDict->SetAtName(\"Type\", \"XObject\");\n    pDict->SetAtName(\"Subtype\", \"Image\");\n    pDict->SetAtInteger(\"Width\", width);\n    pDict->SetAtInteger(\"Height\", height);\n    FX_LPCSTR csname = NULL;\n    if (num_comps == 1) {\n        csname = \"DeviceGray\";\n    } else if (num_comps == 3) {\n        csname = \"DeviceRGB\";\n    } else if (num_comps == 4) {\n        csname = \"DeviceCMYK\";\n        CPDF_Array* pDecode = CPDF_Array::Create();\n        for (int n = 0; n < 4; n ++) {\n            pDecode->AddInteger(1);\n            pDecode->AddInteger(0);\n        }\n        pDict->SetAt(FX_BSTRC(\"Decode\"), pDecode);\n    }\n    pDict->SetAtName(\"ColorSpace\", csname);\n    pDict->SetAtInteger(\"BitsPerComponent\", bits);\n    pDict->SetAtName(\"Filter\", \"DCTDecode\");\n    if (!color_trans) {\n        CPDF_Dictionary* pParms = FX_NEW CPDF_Dictionary;\n        pDict->SetAt(\"DecodeParms\", pParms);\n        pParms->SetAtInteger(\"ColorTransform\", 0);\n    }\n    m_bIsMask = FALSE;\n    m_Width = width;\n    m_Height = height;\n    if (m_pStream == NULL) {\n        m_pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);\n    }\n    return pDict;\n}\nvoid CPDF_Image::SetJpegImage(FX_LPBYTE pData, FX_DWORD size)\n{\n    CPDF_Dictionary *pDict = InitJPEG(pData, size);\n    if (!pDict) {\n        return;\n    }\n    m_pStream->InitStream(pData, size, pDict);\n}\nvoid CPDF_Image::SetJpegImage(IFX_FileRead *pFile)\n{\n    FX_DWORD size = (FX_DWORD)pFile->GetSize();\n    if (!size) {\n        return;\n    }\n    FX_DWORD dwEstimateSize = size;\n    if (dwEstimateSize > 8192) {\n        dwEstimateSize = 8192;\n    }\n    FX_LPBYTE pData = FX_Alloc(FX_BYTE, dwEstimateSize);\n    if (!pData) {\n        return;\n    }\n    pFile->ReadBlock(pData, 0, dwEstimateSize);\n    CPDF_Dictionary *pDict = InitJPEG(pData, dwEstimateSize);\n    FX_Free(pData);\n    if (!pDict && size > dwEstimateSize) {\n        pData = FX_Alloc(FX_BYTE, size);\n        if (!pData) {\n            return;\n        }\n        pFile->ReadBlock(pData, 0, size);\n        pDict = InitJPEG(pData, size);\n        FX_Free(pData);\n    }\n    if (!pDict) {\n        return;\n    }\n    m_pStream->InitStream(pFile, pDict);\n}\nvoid _DCTEncodeBitmap(CPDF_Dictionary *pBitmapDict, const CFX_DIBitmap* pBitmap, int quality, FX_LPBYTE &buf, FX_STRSIZE &size)\n{\n}\nvoid _JBIG2EncodeBitmap(CPDF_Dictionary *pBitmapDict, const CFX_DIBitmap *pBitmap, CPDF_Document *pDoc, FX_LPBYTE &buf, FX_STRSIZE &size, FX_BOOL bLossLess)\n{\n}\nvoid CPDF_Image::SetImage(const CFX_DIBitmap* pBitmap, FX_INT32 iCompress, IFX_FileWrite *pFileWrite, IFX_FileRead *pFileRead, const CFX_DIBitmap* pMask, const CPDF_ImageSetParam* pParam)\n{\n    FX_INT32 BitmapWidth = pBitmap->GetWidth();\n    FX_INT32 BitmapHeight = pBitmap->GetHeight();\n    if (BitmapWidth < 1 || BitmapHeight < 1) {\n        return;\n    }\n    FX_LPBYTE src_buf = pBitmap->GetBuffer();\n    FX_INT32 src_pitch = pBitmap->GetPitch();\n    FX_INT32 bpp = pBitmap->GetBPP();\n    FX_BOOL bUseMatte = pParam && pParam->pMatteColor && (pBitmap->GetFormat() == FXDIB_Argb);\n    CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;\n    pDict->SetAtName(FX_BSTRC(\"Type\"), FX_BSTRC(\"XObject\"));\n    pDict->SetAtName(FX_BSTRC(\"Subtype\"), FX_BSTRC(\"Image\"));\n    pDict->SetAtInteger(FX_BSTRC(\"Width\"), BitmapWidth);\n    pDict->SetAtInteger(FX_BSTRC(\"Height\"), BitmapHeight);\n    FX_LPBYTE dest_buf = NULL;\n    FX_STRSIZE dest_pitch = 0, dest_size = 0, opType = -1;\n    if (bpp == 1) {\n        FX_INT32 reset_a = 0, reset_r = 0, reset_g = 0, reset_b = 0;\n        FX_INT32 set_a = 0, set_r = 0, set_g = 0, set_b = 0;\n        if (!pBitmap->IsAlphaMask()) {\n            ArgbDecode(pBitmap->GetPaletteArgb(0), reset_a, reset_r, reset_g, reset_b);\n            ArgbDecode(pBitmap->GetPaletteArgb(1), set_a, set_r, set_g, set_b);\n        }\n        if (set_a == 0 || reset_a == 0) {\n            pDict->SetAt(FX_BSTRC(\"ImageMask\"), FX_NEW CPDF_Boolean(TRUE));\n            if (reset_a == 0) {\n                CPDF_Array* pArray = FX_NEW CPDF_Array;\n                pArray->AddInteger(1);\n                pArray->AddInteger(0);\n                pDict->SetAt(FX_BSTRC(\"Decode\"), pArray);\n            }\n        } else {\n            CPDF_Array* pCS = FX_NEW CPDF_Array;\n            pCS->AddName(FX_BSTRC(\"Indexed\"));\n            pCS->AddName(FX_BSTRC(\"DeviceRGB\"));\n            pCS->AddInteger(1);\n            CFX_ByteString ct;\n            FX_LPSTR pBuf = ct.GetBuffer(6);\n            pBuf[0] = (FX_CHAR)reset_r;\n            pBuf[1] = (FX_CHAR)reset_g;\n            pBuf[2] = (FX_CHAR)reset_b;\n            pBuf[3] = (FX_CHAR)set_r;\n            pBuf[4] = (FX_CHAR)set_g;\n            pBuf[5] = (FX_CHAR)set_b;\n            ct.ReleaseBuffer(6);\n            pCS->Add(CPDF_String::Create(ct, TRUE));\n            pDict->SetAt(FX_BSTRC(\"ColorSpace\"), pCS);\n        }\n        pDict->SetAtInteger(FX_BSTRC(\"BitsPerComponent\"), 1);\n        dest_pitch = (BitmapWidth + 7) / 8;\n        if ((iCompress & 0x03) == PDF_IMAGE_NO_COMPRESS) {\n            opType = 1;\n        } else {\n            opType = 0;\n        }\n    } else if (bpp == 8) {\n        FX_INT32 iPalette = pBitmap->GetPaletteSize();\n        if (iPalette > 0) {\n            CPDF_Array* pCS = FX_NEW CPDF_Array;\n            m_pDocument->AddIndirectObject(pCS);\n            pCS->AddName(FX_BSTRC(\"Indexed\"));\n            pCS->AddName(FX_BSTRC(\"DeviceRGB\"));\n            pCS->AddInteger(iPalette - 1);\n            FX_LPBYTE pColorTable = FX_Alloc(FX_BYTE, iPalette * 3);\n            FX_LPBYTE ptr = pColorTable;\n            for (FX_INT32 i = 0; i < iPalette; i ++) {\n                FX_DWORD argb = pBitmap->GetPaletteArgb(i);\n                ptr[0] = (FX_BYTE)(argb >> 16);\n                ptr[1] = (FX_BYTE)(argb >> 8);\n                ptr[2] = (FX_BYTE)argb;\n                ptr += 3;\n            }\n            CPDF_Stream *pCTS = CPDF_Stream::Create(pColorTable, iPalette * 3, CPDF_Dictionary::Create());\n            m_pDocument->AddIndirectObject(pCTS);\n            pCS->AddReference(m_pDocument, pCTS);\n            pDict->SetAtReference(FX_BSTRC(\"ColorSpace\"), m_pDocument, pCS);\n        } else {\n            pDict->SetAtName(FX_BSTRC(\"ColorSpace\"), FX_BSTRC(\"DeviceGray\"));\n        }\n        pDict->SetAtInteger(FX_BSTRC(\"BitsPerComponent\"), 8);\n        if ((iCompress & 0x03) == PDF_IMAGE_NO_COMPRESS) {\n            dest_pitch = BitmapWidth;\n            opType = 1;\n        } else {\n            opType = 0;\n        }\n    } else {\n        pDict->SetAtName(FX_BSTRC(\"ColorSpace\"), FX_BSTRC(\"DeviceRGB\"));\n        pDict->SetAtInteger(FX_BSTRC(\"BitsPerComponent\"), 8);\n        if ((iCompress & 0x03) == PDF_IMAGE_NO_COMPRESS) {\n            dest_pitch = BitmapWidth * 3;\n            opType = 2;\n        } else {\n            opType = 0;\n        }\n    }\n    const CFX_DIBitmap* pMaskBitmap = NULL;\n    if (pBitmap->HasAlpha()) {\n        pMaskBitmap = pBitmap->GetAlphaMask();\n    }\n    if (!pMaskBitmap && pMask) {\n        FXDIB_Format maskFormat = pMask->GetFormat();\n        if (maskFormat == FXDIB_1bppMask || maskFormat == FXDIB_8bppMask) {\n            pMaskBitmap = pMask;\n        }\n    }\n    if (pMaskBitmap) {\n        FX_INT32 maskWidth = pMaskBitmap->GetWidth();\n        FX_INT32 maskHeight = pMaskBitmap->GetHeight();\n        FX_LPBYTE mask_buf = NULL;\n        FX_STRSIZE mask_size;\n        FX_BOOL bDeleteMask = TRUE;\n        CPDF_Dictionary* pMaskDict = FX_NEW CPDF_Dictionary;\n        pMaskDict->SetAtName(FX_BSTRC(\"Type\"), FX_BSTRC(\"XObject\"));\n        pMaskDict->SetAtName(FX_BSTRC(\"Subtype\"), FX_BSTRC(\"Image\"));\n        pMaskDict->SetAtInteger(FX_BSTRC(\"Width\"), maskWidth);\n        pMaskDict->SetAtInteger(FX_BSTRC(\"Height\"), maskHeight);\n        pMaskDict->SetAtName(FX_BSTRC(\"ColorSpace\"), FX_BSTRC(\"DeviceGray\"));\n        pMaskDict->SetAtInteger(FX_BSTRC(\"BitsPerComponent\"), 8);\n        if (pMaskBitmap->GetBPP() == 8 && (iCompress & PDF_IMAGE_MASK_LOSSY_COMPRESS) != 0) {\n            _DCTEncodeBitmap(pMaskDict, pMaskBitmap, pParam ? pParam->nQuality : 75, mask_buf, mask_size);\n        } else if (pMaskBitmap->GetFormat() == FXDIB_1bppMask) {\n            _JBIG2EncodeBitmap(pMaskDict, pMaskBitmap, m_pDocument, mask_buf, mask_size, TRUE);\n        } else {\n            mask_size = maskHeight * maskWidth;\n            mask_buf = FX_Alloc(FX_BYTE, mask_size);\n            for (FX_INT32 a = 0; a < maskHeight; a ++) {\n                FXSYS_memcpy32(mask_buf + a * maskWidth, pMaskBitmap->GetScanline(a), maskWidth);\n            }\n        }\n        if (pMaskDict) {\n            pMaskDict->SetAtInteger(FX_BSTRC(\"Length\"), mask_size);\n            CPDF_Stream* pMaskStream = NULL;\n            if (bUseMatte) {\n                int a, r, g, b;\n                ArgbDecode(*(pParam->pMatteColor), a, r, g, b);\n                CPDF_Array* pMatte = FX_NEW CPDF_Array;\n                pMatte->AddInteger(r);\n                pMatte->AddInteger(g);\n                pMatte->AddInteger(b);\n                pMaskDict->SetAt(FX_BSTRC(\"Matte\"), pMatte);\n            }\n            pMaskStream = FX_NEW CPDF_Stream(mask_buf, mask_size, pMaskDict);\n            m_pDocument->AddIndirectObject(pMaskStream);\n            bDeleteMask = FALSE;\n            pDict->SetAtReference(FX_BSTRC(\"SMask\"), m_pDocument, pMaskStream);\n        }\n        if (pBitmap->HasAlpha()) {\n            delete pMaskBitmap;\n        }\n    }\n    FX_BOOL bStream = pFileWrite != NULL && pFileRead != NULL;\n    if (opType == 0) {\n        if (iCompress & PDF_IMAGE_LOSSLESS_COMPRESS) {\n            if (pBitmap->GetBPP() == 1) {\n                _JBIG2EncodeBitmap(pDict, pBitmap, m_pDocument, dest_buf, dest_size, TRUE);\n            }\n        } else {\n            if (pBitmap->GetBPP() == 1) {\n                _JBIG2EncodeBitmap(pDict, pBitmap, m_pDocument, dest_buf, dest_size, FALSE);\n            } else if (pBitmap->GetBPP() >= 8 && pBitmap->GetPalette() != NULL) {\n                CFX_DIBitmap *pNewBitmap = FX_NEW CFX_DIBitmap();\n                pNewBitmap->Copy(pBitmap);\n                pNewBitmap->ConvertFormat(FXDIB_Rgb);\n                SetImage(pNewBitmap, iCompress, pFileWrite, pFileRead);\n                if (pDict) {\n                    pDict->Release();\n                    pDict = NULL;\n                }\n                if (dest_buf) {\n                    FX_Free(dest_buf);\n                    dest_buf = NULL;\n                }\n                dest_size = 0;\n                delete pNewBitmap;\n                return;\n            } else {\n                if (bUseMatte) {\n                    CFX_DIBitmap *pNewBitmap = FX_NEW CFX_DIBitmap();\n                    pNewBitmap->Create(BitmapWidth, BitmapHeight, FXDIB_Argb);\n                    FX_LPBYTE dst_buf = pNewBitmap->GetBuffer();\n                    FX_INT32 src_offset = 0;\n                    for (FX_INT32 row = 0; row < BitmapHeight; row ++) {\n                        src_offset = row * src_pitch;\n                        for (FX_INT32 column = 0; column < BitmapWidth; column ++) {\n                            FX_FLOAT alpha = src_buf[src_offset + 3] / 255.0f;\n                            dst_buf[src_offset] = (FX_BYTE)(src_buf[src_offset] * alpha);\n                            dst_buf[src_offset + 1] = (FX_BYTE)(src_buf[src_offset + 1] * alpha);\n                            dst_buf[src_offset + 2] = (FX_BYTE)(src_buf[src_offset + 2] * alpha);\n                            dst_buf[src_offset + 3] = (FX_BYTE)(src_buf[src_offset + 3]);\n                            src_offset += 4;\n                        }\n                    }\n                    _DCTEncodeBitmap(pDict, pNewBitmap, pParam ? pParam->nQuality : 75, dest_buf, dest_size);\n                    delete pNewBitmap;\n                } else {\n                    _DCTEncodeBitmap(pDict, pBitmap, pParam ? pParam->nQuality : 75, dest_buf, dest_size);\n                }\n            }\n        }\n        if (bStream) {\n            pFileWrite->WriteBlock(dest_buf, dest_size);\n            FX_Free(dest_buf);\n            dest_buf = NULL;\n        }\n    } else if (opType == 1) {\n        if (!bStream) {\n            dest_size = dest_pitch * BitmapHeight;\n            dest_buf = FX_Alloc(FX_BYTE, dest_size);\n        }\n        FX_LPBYTE pDest = dest_buf;\n        for (FX_INT32 i = 0; i < BitmapHeight; i ++) {\n            if (!bStream) {\n                FXSYS_memcpy32(pDest, src_buf, dest_pitch);\n                pDest += dest_pitch;\n            } else {\n                pFileWrite->WriteBlock(src_buf, dest_pitch);\n            }\n            src_buf += src_pitch;\n        }\n    } else if (opType == 2) {\n        if (!bStream) {\n            dest_size = dest_pitch * BitmapHeight;\n            dest_buf = FX_Alloc(FX_BYTE, dest_size);\n        } else {\n            dest_buf = FX_Alloc(FX_BYTE, dest_pitch);\n        }\n        FX_LPBYTE pDest = dest_buf;\n        FX_INT32 src_offset = 0;\n        FX_INT32 dest_offset = 0;\n        for (FX_INT32 row = 0; row < BitmapHeight; row ++) {\n            src_offset = row * src_pitch;\n            for (FX_INT32 column = 0; column < BitmapWidth; column ++) {\n                FX_FLOAT alpha = bUseMatte ? src_buf[src_offset + 3] / 255.0f : 1;\n                pDest[dest_offset] = (FX_BYTE)(src_buf[src_offset + 2] * alpha);\n                pDest[dest_offset + 1] = (FX_BYTE)(src_buf[src_offset + 1] * alpha);\n                pDest[dest_offset + 2] = (FX_BYTE)(src_buf[src_offset] * alpha);\n                dest_offset += 3;\n                src_offset += bpp == 24 ? 3 : 4;\n            }\n            if (bStream) {\n                pFileWrite->WriteBlock(pDest, dest_pitch);\n                pDest = dest_buf;\n            } else {\n                pDest += dest_pitch;\n            }\n            dest_offset = 0;\n        }\n        if (bStream) {\n            FX_Free(dest_buf);\n            dest_buf = NULL;\n        }\n    }\n    if (m_pStream == NULL) {\n        m_pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);\n    }\n    if (!bStream) {\n        m_pStream->InitStream(dest_buf, dest_size, pDict);\n    } else {\n        pFileWrite->Flush();\n        m_pStream->InitStream(pFileRead, pDict);\n    }\n    m_bIsMask = pBitmap->IsAlphaMask();\n    m_Width = BitmapWidth;\n    m_Height = BitmapHeight;\n    if (dest_buf) {\n        FX_Free(dest_buf);\n    }\n}\nvoid CPDF_Image::ResetCache(CPDF_Page* pPage, const CFX_DIBitmap* pBitmap)\n{\n    pPage->GetRenderCache()->ResetBitmap(m_pStream, pBitmap);\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_font/common.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef COMMON_H\n#define COMMON_H\ntypedef signed char TT_int8_t;\ntypedef unsigned char TT_uint8_t;\ntypedef signed short TT_int16_t;\ntypedef unsigned short TT_uint16_t;\ntypedef FX_INT32 TT_int32_t;\ntypedef FX_DWORD TT_uint32_t;\ntypedef FX_INT64 TT_int64_t;\ntypedef FX_UINT64 TT_uint64_t;\n#endif\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_font/font_int.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\ntypedef void* FXFT_Library;\nclass CPDF_CMapManager : public CFX_Object\n{\npublic:\n    CPDF_CMapManager();\n    ~CPDF_CMapManager();\n    FX_LPVOID\t\t\t\tGetPackage(FX_BOOL bPrompt);\n    CPDF_CMap*\t\t\t\tGetPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPrompt);\n    CPDF_CID2UnicodeMap*\tGetCID2UnicodeMap(int charset, FX_BOOL bPrompt);\n    void\t\t\t\t\tReloadAll();\nprivate:\n    CPDF_CMap*\t\t\t\tLoadPredefinedCMap(const CFX_ByteString& name,  FX_BOOL bPrompt);\n    CPDF_CID2UnicodeMap*\tLoadCID2UnicodeMap(int charset, FX_BOOL bPrompt);\n    void\t\t\t\t\tDropAll(FX_BOOL bReload);\n#ifndef _FPDFAPI_MINI_\n    FX_BOOL\t\t\t\t\tm_bPrompted;\n    FX_LPVOID\t\t\t\tm_pPackage;\n#endif\n    CFX_MapByteStringToPtr\tm_CMaps;\n    CPDF_CID2UnicodeMap*\tm_CID2UnicodeMaps[6];\n};\nclass CPDF_FontGlobals : public CFX_Object\n{\npublic:\n    CPDF_FontGlobals();\n    ~CPDF_FontGlobals();\n    void\t\t\t\tClearAll();\n    void\t\t\t\tClear(void* key);\n    CPDF_Font*\t\t\tFind(void* key, int index);\n    void\t\t\t\tSet(void* key, int index, CPDF_Font* pFont);\n    CFX_MapPtrToPtr\t\tm_pStockMap;\n    CPDF_CMapManager\tm_CMapManager;\n    struct {\n        const struct FXCMAP_CMap*\tm_pMapList;\n        int\t\t\t\tm_Count;\n    } m_EmbeddedCharsets[5];\n    struct {\n        const FX_WORD*\tm_pMap;\n        int\t\t\t\tm_Count;\n    } m_EmbeddedToUnicodes[5];\n    FX_LPBYTE\t\t\tm_pContrastRamps;\n};\nstruct _CMap_CodeRange {\n    int\t\t\tm_CharSize;\n    FX_BYTE\t\tm_Lower[4];\n    FX_BYTE\t\tm_Upper[4];\n};\nclass CPDF_CMapParser : public CFX_Object\n{\npublic:\n    CPDF_CMapParser();\n    ~CPDF_CMapParser() {}\n    FX_BOOL\tInitialize(CPDF_CMap*);\n    void\tParseWord(FX_BSTR str);\n    CFX_BinaryBuf\tm_AddMaps;\nprivate:\n    CPDF_CMap*\tm_pCMap;\n    int\t\t\t\tm_Status;\n    int\t\t\t\tm_CodeSeq;\n    FX_DWORD\t\tm_CodePoints[4];\n    CFX_ArrayTemplate<_CMap_CodeRange>\tm_CodeRanges;\n    CFX_ByteString\tm_Registry, m_Ordering, m_Supplement;\n    CFX_ByteString\tm_LastWord;\n};\n#define CIDCODING_UNKNOWN\t0\n#define CIDCODING_GB\t\t1\n#define CIDCODING_BIG5\t\t2\n#define CIDCODING_JIS\t\t3\n#define CIDCODING_KOREA\t\t4\n#define CIDCODING_UCS2\t\t5\n#define CIDCODING_CID\t\t6\n#define CIDCODING_UTF16\t\t7\nclass CPDF_CMap : public CFX_Object\n{\npublic:\n    CPDF_CMap();\n    FX_BOOL\t\t\t\t\tLoadPredefined(CPDF_CMapManager* pMgr, const FX_CHAR* name, FX_BOOL bPromptCJK);\n    FX_BOOL\t\t\t\t\tLoadEmbedded(FX_LPCBYTE pData, FX_DWORD dwSize);\n    void\t\t\t\t\tRelease();\n    FX_BOOL\t\t\t\t\tIsLoaded() const\n    {\n        return m_bLoaded;\n    }\n    int\t\t\t\t\t\tGetCharset()\n    {\n        return m_Charset;\n    }\n    FX_BOOL\t\t\t\t\tIsVertWriting() const\n    {\n        return m_bVertical;\n    }\n    FX_WORD\t\t\t\t\tCIDFromCharCode(FX_DWORD charcode) const;\n    FX_DWORD\t\t\t\tCharCodeFromCID(FX_WORD CID) const;\n    int\t\t\t\t\t\tGetCharSize(FX_DWORD charcode) const;\n    FX_DWORD\t\t\t\tGetNextChar(const FX_CHAR* pString, int& offset) const;\n    int\t\t\t\t\t\tCountChar(const FX_CHAR* pString, int size) const;\n    int\t\t\t\t\t\tAppendChar(FX_LPSTR str, FX_DWORD charcode) const;\n    typedef enum {OneByte, TwoBytes, MixedTwoBytes, MixedFourBytes} CodingScheme;\nprotected:\n    ~CPDF_CMap();\n    friend class\t\t\tCPDF_CMapParser;\n    friend class\t\t\tCPDF_CMapManager;\n    friend class\t\t\tCPDF_CIDFont;\nprotected:\n    CFX_ByteString\t\t\tm_PredefinedCMap;\n    FX_BOOL\t\t\t\t\tm_bVertical;\n    int\t\t\t\t\t\tm_Charset, m_Coding;\n    CodingScheme\t\t\tm_CodingScheme;\n    int\t\t\t\t\t\tm_nCodeRanges;\n    FX_BYTE*\t\t\t\tm_pLeadingBytes;\n    FX_WORD*\t\t\t\tm_pMapping;\n    FX_LPBYTE\t\t\t\tm_pAddMapping;\n    FX_BOOL\t\t\t\t\tm_bLoaded;\n    const FXCMAP_CMap*\t\tm_pEmbedMap;\n    CPDF_CMap*\t\t\t\tm_pUseMap;\n};\nclass CPDF_PredefinedCMap\n{\npublic:\n    FX_LPCSTR\tm_pName;\n    int\t\t\tm_Charset;\n    int\t\t\tm_Coding;\n    CPDF_CMap::CodingScheme\tm_CodingScheme;\n    FX_DWORD\tm_LeadingSegCount;\n    FX_BYTE\t\tm_LeadingSegs[4];\n};\ntypedef struct _FileHeader {\n    FX_BYTE\t\tbtTag[4];\n    FX_BYTE\t\tbtVersion;\n    FX_BYTE\t\tbtFormat;\n    FX_BYTE\t\tbtReserved1[2];\n    FX_DWORD\tdwStartIndex;\n    FX_DWORD\tdwEndIndex;\n    FX_DWORD\tdwDataSize;\n    FX_DWORD\tdwDataOffset;\n    FX_DWORD\tdwRecordSize;\n} FXMP_FILEHEADER;\nclass CPDF_FXMP : public CFX_Object\n{\npublic:\n    CPDF_FXMP()\n    {\n        m_pHeader = NULL;\n        m_pTable = NULL;\n    }\n    ~CPDF_FXMP()\n    {\n        if (m_pHeader) {\n            FX_Free(m_pHeader);\n        }\n    }\n    FX_BOOL\t\tIsLoaded()\n    {\n        return m_pTable != NULL;\n    }\n    FX_BOOL\t\tLoadFile(FX_LPVOID pPackage, FX_LPCSTR fileid);\n    FX_LPBYTE\tGetRecord(FX_DWORD index);\nprivate:\n    FXMP_FILEHEADER*\tm_pHeader;\n    FX_LPBYTE\tm_pTable;\n};\nclass CPDF_CID2UnicodeMap : public CFX_Object\n{\npublic:\n    CPDF_CID2UnicodeMap();\n    ~CPDF_CID2UnicodeMap();\n    FX_BOOL\t\tInitialize();\n    FX_BOOL\t\tIsLoaded();\n    void\t\tLoad(CPDF_CMapManager* pMgr, int charset, FX_BOOL bPromptCJK);\n    FX_WCHAR\tUnicodeFromCID(FX_WORD CID);\nprotected:\n    int\t\t\tm_Charset;\n    const FX_WORD*\tm_pEmbeddedMap;\n    FX_DWORD\tm_EmbeddedCount;\n#ifndef _FPDFAPI_MINI_\n    CPDF_FXMP*\tm_pExternalMap;\n#endif\n};\nclass CPDF_ToUnicodeMap : public CFX_Object\n{\npublic:\n    void\t\t\t\t\tLoad(CPDF_Stream* pStream);\n    CFX_WideString\t\t\tLookup(FX_DWORD charcode);\n    FX_DWORD\t\t\t\tReverseLookup(FX_WCHAR unicode);\nprotected:\n    CFX_CMapDWordToDWord\tm_Map;\n    CPDF_CID2UnicodeMap*\tm_pBaseMap;\n    CFX_WideTextBuf\t\t\tm_MultiCharBuf;\n};\nclass CPDF_FontCharMap : public CFX_CharMap, public CFX_Object\n{\npublic:\n    CPDF_FontCharMap(CPDF_Font* pFont);\n    CPDF_Font*\t\tm_pFont;\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_font/fpdf_font.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_page.h\"\n#include \"../../../include/fpdfapi/fpdf_module.h\"\n#include \"../../../include/fpdfapi/fpdf_pageobj.h\"\n#include \"font_int.h\"\n#include \"../fpdf_page/pageint.h\"\n#include \"../../../include/fxge/fx_freetype.h\"\nFX_BOOL FT_UseTTCharmap(FXFT_Face face, int platform_id, int encoding_id)\n{\n    for (int i = 0; i < FXFT_Get_Face_CharmapCount(face); i ++) {\n        if (FXFT_Get_Charmap_PlatformID(FXFT_Get_Face_Charmaps(face)[i]) == platform_id &&\n                FXFT_Get_Charmap_EncodingID(FXFT_Get_Face_Charmaps(face)[i]) == encoding_id) {\n            FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[i]);\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nextern const FX_WORD* PDF_UnicodesForPredefinedCharSet(int);\nCPDF_FontGlobals::CPDF_FontGlobals()\n{\n    FXSYS_memset32(m_EmbeddedCharsets, 0, sizeof m_EmbeddedCharsets);\n    FXSYS_memset32(m_EmbeddedToUnicodes, 0, sizeof m_EmbeddedToUnicodes);\n    m_pContrastRamps = NULL;\n}\nCPDF_FontGlobals::~CPDF_FontGlobals()\n{\n    ClearAll();\n    if (m_pContrastRamps) {\n        FX_Free(m_pContrastRamps);\n    }\n}\nclass CFX_StockFontArray : public CFX_Object\n{\npublic:\n    CFX_StockFontArray()\n    {\n        FXSYS_memset32(m_pStockFonts, 0, sizeof(CPDF_Font*) * 14);\n    }\n    CPDF_Font*\t\t\tm_pStockFonts[14];\n};\nCPDF_Font* CPDF_FontGlobals::Find(void* key, int index)\n{\n    void* value = NULL;\n    if (!m_pStockMap.Lookup(key, value)) {\n        return NULL;\n    }\n    if (!value) {\n        return NULL;\n    }\n    return ((CFX_StockFontArray*)value)->m_pStockFonts[index];\n}\nvoid CPDF_FontGlobals::Set(void* key, int index, CPDF_Font* pFont)\n{\n    void* value = NULL;\n    if (m_pStockMap.Lookup(key, value)) {\n        ((CFX_StockFontArray*)value)->m_pStockFonts[index] = pFont;\n        return;\n    }\n    CFX_StockFontArray* pFonts = FX_NEW CFX_StockFontArray();\n    if (pFonts) {\n        pFonts->m_pStockFonts[index] = pFont;\n    }\n    m_pStockMap.SetAt(key, pFonts);\n}\nvoid CPDF_FontGlobals::Clear(void* key)\n{\n    void* value = NULL;\n    if (!m_pStockMap.Lookup(key, value)) {\n        return;\n    }\n    if (value) {\n        CFX_StockFontArray* pStockFonts = (CFX_StockFontArray*)value;\n        for (int i = 0; i < 14; i ++) {\n            if (pStockFonts->m_pStockFonts[i]) {\n                CPDF_Dictionary* pFontDict = pStockFonts->m_pStockFonts[i]->GetFontDict();\n                if (pFontDict)\n                    pFontDict->Release();\n                delete pStockFonts->m_pStockFonts[i];\n            }\n        }\n        delete pStockFonts;\n    }\n    m_pStockMap.RemoveKey(key);\n}\nvoid CPDF_FontGlobals::ClearAll()\n{\n    FX_POSITION pos = m_pStockMap.GetStartPosition();\n    while (pos) {\n        void *key = NULL;\n        void* value = NULL;\n        m_pStockMap.GetNextAssoc(pos, key, value);\n        if (value) {\n            CFX_StockFontArray* pStockFonts = (CFX_StockFontArray*)value;\n            for (int i = 0; i < 14; i ++) {\n                if (pStockFonts->m_pStockFonts[i]) {\n                    CPDF_Dictionary* pFontDict = pStockFonts->m_pStockFonts[i]->GetFontDict();\n                    if (pFontDict)\n                        pFontDict->Release();\n                    delete pStockFonts->m_pStockFonts[i];\n                }\n            }\n            delete pStockFonts;\n        }\n        m_pStockMap.RemoveKey(key);\n    }\n}\nCPDF_Font::CPDF_Font()\n{\n    m_FontType = 0;\n    m_FontBBox.left = m_FontBBox.right = m_FontBBox.top = m_FontBBox.bottom = 0;\n    m_StemV = m_Ascent = m_Descent = m_ItalicAngle = 0;\n    m_pFontFile = NULL;\n    m_Flags = 0;\n    m_pToUnicodeMap = NULL;\n    m_bToUnicodeLoaded = FALSE;\n    m_pCharMap = NULL;\n}\nFX_BOOL CPDF_Font::Initialize()\n{\n    m_pCharMap = FX_NEW CPDF_FontCharMap(this);\n    return TRUE;\n}\nCPDF_Font::~CPDF_Font()\n{\n    if (m_pCharMap) {\n        FX_Free(m_pCharMap);\n        m_pCharMap = NULL;\n    }\n    if (m_pToUnicodeMap) {\n        delete m_pToUnicodeMap;\n        m_pToUnicodeMap = NULL;\n    }\n    if (m_pFontFile) {\n        m_pDocument->GetPageData()->ReleaseFontFileStreamAcc((CPDF_Stream*)m_pFontFile->GetStream());\n    }\n}\nFX_BOOL CPDF_Font::IsVertWriting() const\n{\n    FX_BOOL bVertWriting = FALSE;\n    CPDF_CIDFont* pCIDFont = GetCIDFont();\n    if (pCIDFont) {\n        bVertWriting = pCIDFont->IsVertWriting();\n    } else {\n        bVertWriting = m_Font.IsVertical();\n    }\n    return bVertWriting;\n}\nCFX_ByteString CPDF_Font::GetFontTypeName() const\n{\n    switch (m_FontType) {\n        case PDFFONT_TYPE1:\n            return FX_BSTRC(\"Type1\");\n        case PDFFONT_TRUETYPE:\n            return FX_BSTRC(\"TrueType\");\n        case PDFFONT_TYPE3:\n            return FX_BSTRC(\"Type3\");\n        case PDFFONT_CIDFONT:\n            return FX_BSTRC(\"Type0\");\n    }\n    return CFX_ByteString();\n}\nvoid CPDF_Font::AppendChar(CFX_ByteString& str, FX_DWORD charcode) const\n{\n    char buf[4];\n    int len = AppendChar(buf, charcode);\n    if (len == 1) {\n        str += buf[0];\n    } else {\n        str += CFX_ByteString(buf, len);\n    }\n}\nCFX_WideString CPDF_Font::UnicodeFromCharCode(FX_DWORD charcode) const\n{\n    if (!m_bToUnicodeLoaded) {\n        ((CPDF_Font*)this)->LoadUnicodeMap();\n    }\n    if (m_pToUnicodeMap) {\n        CFX_WideString wsRet = m_pToUnicodeMap->Lookup(charcode);\n        if (!wsRet.IsEmpty()) {\n            return wsRet;\n        }\n    }\n    FX_WCHAR unicode = _UnicodeFromCharCode(charcode);\n    if (unicode == 0) {\n        return CFX_WideString();\n    }\n    return unicode;\n}\nFX_DWORD CPDF_Font::CharCodeFromUnicode(FX_WCHAR unicode) const\n{\n    if (!m_bToUnicodeLoaded) {\n        ((CPDF_Font*)this)->LoadUnicodeMap();\n    }\n    if (m_pToUnicodeMap) {\n        FX_DWORD charcode = m_pToUnicodeMap->ReverseLookup(unicode);\n        if (charcode) {\n            return charcode;\n        }\n    }\n    return _CharCodeFromUnicode(unicode);\n}\nCFX_WideString CPDF_Font::DecodeString(const CFX_ByteString& str) const\n{\n    CFX_WideString result;\n    int src_len = str.GetLength();\n    result.Reserve(src_len);\n    FX_LPCSTR src_buf = str;\n    int src_pos = 0;\n    while (src_pos < src_len) {\n        FX_DWORD charcode = GetNextChar(src_buf, src_pos);\n        CFX_WideString unicode = UnicodeFromCharCode(charcode);\n        if (!unicode.IsEmpty()) {\n            result += unicode;\n        } else {\n            result += (FX_WCHAR)charcode;\n        }\n    }\n    return result;\n}\nCFX_ByteString CPDF_Font::EncodeString(const CFX_WideString& str) const\n{\n    CFX_ByteString result;\n    int src_len = str.GetLength();\n    FX_LPSTR dest_buf = result.GetBuffer(src_len * 2);\n    FX_LPCWSTR src_buf = str;\n    int dest_pos = 0;\n    for (int src_pos = 0; src_pos < src_len; src_pos ++) {\n        FX_DWORD charcode = CharCodeFromUnicode(src_buf[src_pos]);\n        dest_pos += AppendChar(dest_buf + dest_pos, charcode);\n    }\n    result.ReleaseBuffer(dest_pos);\n    return result;\n}\nvoid CPDF_Font::LoadFontDescriptor(CPDF_Dictionary* pFontDesc)\n{\n    m_Flags = pFontDesc->GetInteger(FX_BSTRC(\"Flags\"), PDFFONT_NONSYMBOLIC);\n    int ItalicAngle = 0;\n    FX_BOOL bExistItalicAngle = FALSE;\n    if (pFontDesc->KeyExist(FX_BSTRC(\"ItalicAngle\"))) {\n        ItalicAngle = pFontDesc->GetInteger(FX_BSTRC(\"ItalicAngle\"));\n        bExistItalicAngle = TRUE;\n    }\n    if (ItalicAngle < 0) {\n        m_Flags |= PDFFONT_ITALIC;\n        m_ItalicAngle = ItalicAngle;\n    }\n    FX_BOOL bExistStemV = FALSE;\n    if (pFontDesc->KeyExist(FX_BSTRC(\"StemV\"))) {\n        m_StemV = pFontDesc->GetInteger(FX_BSTRC(\"StemV\"));\n        bExistStemV = TRUE;\n    }\n    FX_BOOL bExistAscent = FALSE;\n    if (pFontDesc->KeyExist(FX_BSTRC(\"Ascent\"))) {\n        m_Ascent = pFontDesc->GetInteger(FX_BSTRC(\"Ascent\"));\n        bExistAscent = TRUE;\n    }\n    FX_BOOL bExistDescent = FALSE;\n    if (pFontDesc->KeyExist(FX_BSTRC(\"Descent\"))) {\n        m_Descent = pFontDesc->GetInteger(FX_BSTRC(\"Descent\"));\n        bExistDescent = TRUE;\n    }\n    FX_BOOL bExistCapHeight = FALSE;\n    if (pFontDesc->KeyExist(FX_BSTRC(\"CapHeight\"))) {\n        bExistCapHeight = TRUE;\n    }\n    if (bExistItalicAngle && bExistAscent && bExistCapHeight && bExistDescent && bExistStemV) {\n        m_Flags |= PDFFONT_USEEXTERNATTR;\n    }\n    if (m_Descent > 10) {\n        m_Descent = -m_Descent;\n    }\n    CPDF_Array* pBBox = pFontDesc->GetArray(FX_BSTRC(\"FontBBox\"));\n    if (pBBox) {\n        m_FontBBox.left = pBBox->GetInteger(0);\n        m_FontBBox.bottom = pBBox->GetInteger(1);\n        m_FontBBox.right = pBBox->GetInteger(2);\n        m_FontBBox.top = pBBox->GetInteger(3);\n    }\n    CPDF_Stream* pFontFile = pFontDesc->GetStream(FX_BSTRC(\"FontFile\"));\n    if (pFontFile == NULL) {\n        pFontFile = pFontDesc->GetStream(FX_BSTRC(\"FontFile2\"));\n    }\n    if (pFontFile == NULL) {\n        pFontFile = pFontDesc->GetStream(FX_BSTRC(\"FontFile3\"));\n    }\n    if (pFontFile) {\n        m_pFontFile = m_pDocument->LoadFontFile(pFontFile);\n        if (m_pFontFile == NULL) {\n            return;\n        }\n        FX_LPCBYTE pFontData = m_pFontFile->GetData();\n        FX_DWORD dwFontSize = m_pFontFile->GetSize();\n        m_Font.LoadEmbedded(pFontData, dwFontSize);\n        if (m_Font.m_Face == NULL) {\n            m_pFontFile = NULL;\n        }\n    }\n}\nshort TT2PDF(int m, FXFT_Face face)\n{\n    int upm = FXFT_Get_Face_UnitsPerEM(face);\n    if (upm == 0) {\n        return (short)m;\n    }\n    return (m * 1000 + upm / 2) / upm;\n}\nvoid CPDF_Font::CheckFontMetrics()\n{\n    if (m_FontBBox.top == 0 && m_FontBBox.bottom == 0 && m_FontBBox.left == 0 && m_FontBBox.right == 0) {\n        if (m_Font.m_Face) {\n            m_FontBBox.left = TT2PDF(FXFT_Get_Face_xMin(m_Font.m_Face), m_Font.m_Face);\n            m_FontBBox.bottom = TT2PDF(FXFT_Get_Face_yMin(m_Font.m_Face), m_Font.m_Face);\n            m_FontBBox.right = TT2PDF(FXFT_Get_Face_xMax(m_Font.m_Face), m_Font.m_Face);\n            m_FontBBox.top = TT2PDF(FXFT_Get_Face_yMax(m_Font.m_Face), m_Font.m_Face);\n            m_Ascent = TT2PDF(FXFT_Get_Face_Ascender(m_Font.m_Face), m_Font.m_Face);\n            m_Descent = TT2PDF(FXFT_Get_Face_Descender(m_Font.m_Face), m_Font.m_Face);\n        } else {\n            FX_BOOL bFirst = TRUE;\n            for (int i = 0; i < 256; i ++) {\n                FX_RECT rect;\n                GetCharBBox(i, rect);\n                if (rect.left == rect.right) {\n                    continue;\n                }\n                if (bFirst) {\n                    m_FontBBox = rect;\n                    bFirst = FALSE;\n                } else {\n                    if (m_FontBBox.top < rect.top) {\n                        m_FontBBox.top = rect.top;\n                    }\n                    if (m_FontBBox.right < rect.right) {\n                        m_FontBBox.right = rect.right;\n                    }\n                    if (m_FontBBox.left > rect.left) {\n                        m_FontBBox.left = rect.left;\n                    }\n                    if (m_FontBBox.bottom > rect.bottom) {\n                        m_FontBBox.bottom = rect.bottom;\n                    }\n                }\n            }\n        }\n    }\n    if (m_Ascent == 0 && m_Descent == 0) {\n        FX_RECT rect;\n        GetCharBBox('A', rect);\n        if (rect.bottom == rect.top) {\n            m_Ascent = m_FontBBox.top;\n        } else {\n            m_Ascent = rect.top;\n        }\n        GetCharBBox('g', rect);\n        if (rect.bottom == rect.top) {\n            m_Descent = m_FontBBox.bottom;\n        } else {\n            m_Descent = rect.bottom;\n        }\n    }\n}\nvoid CPDF_Font::LoadUnicodeMap()\n{\n    m_bToUnicodeLoaded = TRUE;\n    CPDF_Stream* pStream = m_pFontDict->GetStream(FX_BSTRC(\"ToUnicode\"));\n    if (pStream == NULL) {\n        return;\n    }\n    m_pToUnicodeMap = FX_NEW CPDF_ToUnicodeMap;\n    m_pToUnicodeMap->Load(pStream);\n}\nint CPDF_Font::GetStringWidth(FX_LPCSTR pString, int size)\n{\n    int offset = 0;\n    int width = 0;\n    while (offset < size) {\n        FX_DWORD charcode = GetNextChar(pString, offset);\n        width += GetCharWidthF(charcode);\n    }\n    return width;\n}\nint CPDF_Font::GetCharTypeWidth(FX_DWORD charcode)\n{\n    if (m_Font.m_Face == NULL) {\n        return 0;\n    }\n    int glyph_index = GlyphFromCharCode(charcode);\n    if (glyph_index == 0xffff) {\n        return 0;\n    }\n    return m_Font.GetGlyphWidth(glyph_index);\n}\nint _PDF_GetStandardFontName(CFX_ByteString& name);\nCPDF_Font* CPDF_Font::GetStockFont(CPDF_Document* pDoc, FX_BSTR name)\n{\n    CFX_ByteString fontname(name);\n    int font_id = _PDF_GetStandardFontName(fontname);\n    if (font_id < 0) {\n        return NULL;\n    }\n    CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();\n    CPDF_Font* pFont = pFontGlobals->Find(pDoc, font_id);\n    if (pFont) {\n        return pFont;\n    }\n    CPDF_Dictionary* pDict = CPDF_Dictionary::Create();\n    pDict->SetAtName(FX_BSTRC(\"Type\"), FX_BSTRC(\"Font\"));\n    pDict->SetAtName(FX_BSTRC(\"Subtype\"), FX_BSTRC(\"Type1\"));\n    pDict->SetAtName(FX_BSTRC(\"BaseFont\"), fontname);\n    pDict->SetAtName(FX_BSTRC(\"Encoding\"), FX_BSTRC(\"WinAnsiEncoding\"));\n    pFont = CPDF_Font::CreateFontF(NULL, pDict);\n    pFontGlobals->Set(pDoc, font_id, pFont);\n    return pFont;\n}\nconst FX_BYTE ChineseFontNames[][5] = {\n    {0xCB, 0xCE, 0xCC, 0xE5, 0x00},\n    {0xBF, 0xAC, 0xCC, 0xE5, 0x00},\n    {0xBA, 0xDA, 0xCC, 0xE5, 0x00},\n    {0xB7, 0xC2, 0xCB, 0xCE, 0x00},\n    {0xD0, 0xC2, 0xCB, 0xCE, 0x00}\n};\nCPDF_Font* CPDF_Font::CreateFontF(CPDF_Document* pDoc, CPDF_Dictionary* pFontDict)\n{\n    CFX_ByteString type = pFontDict->GetString(FX_BSTRC(\"Subtype\"));\n    CPDF_Font* pFont;\n    if (type == FX_BSTRC(\"TrueType\")) {\n        {\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_WINDOWS_ || _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_ || _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_\n            CFX_ByteString basefont = pFontDict->GetString(FX_BSTRC(\"BaseFont\"));\n            CFX_ByteString tag = basefont.Left(4);\n            int i;\n            int count = sizeof(ChineseFontNames) / sizeof(ChineseFontNames[0]);\n            for (i = 0; i < count; ++i) {\n                if (tag == CFX_ByteString((FX_LPCSTR)ChineseFontNames[i])) {\n                    break;\n                }\n            }\n            if (i < count) {\n                CPDF_Dictionary* pFontDesc = pFontDict->GetDict(FX_BSTRC(\"FontDescriptor\"));\n                if (pFontDesc == NULL || !pFontDesc->KeyExist(FX_BSTRC(\"FontFile2\"))) {\n                    pFont = FX_NEW CPDF_CIDFont;\n                    pFont->Initialize();\n                    pFont->m_FontType = PDFFONT_CIDFONT;\n                    pFont->m_pFontDict = pFontDict;\n                    pFont->m_pDocument = pDoc;\n                    if (!pFont->Load()) {\n                        delete pFont;\n                        return NULL;\n                    }\n                    return pFont;\n                }\n            }\n#endif\n        }\n        pFont = FX_NEW CPDF_TrueTypeFont;\n        pFont->Initialize();\n        pFont->m_FontType = PDFFONT_TRUETYPE;\n    } else if (type == FX_BSTRC(\"Type3\")) {\n        pFont = FX_NEW CPDF_Type3Font;\n        pFont->Initialize();\n        pFont->m_FontType = PDFFONT_TYPE3;\n    } else if (type == FX_BSTRC(\"Type0\")) {\n        pFont = FX_NEW CPDF_CIDFont;\n        pFont->Initialize();\n        pFont->m_FontType = PDFFONT_CIDFONT;\n    } else {\n        pFont = FX_NEW CPDF_Type1Font;\n        pFont->Initialize();\n        pFont->m_FontType = PDFFONT_TYPE1;\n    }\n    pFont->m_pFontDict = pFontDict;\n    pFont->m_pDocument = pDoc;\n    if (!pFont->Load()) {\n        delete pFont;\n        return NULL;\n    }\n    return pFont;\n}\nFX_BOOL CPDF_Font::Load()\n{\n    if (m_pFontDict == NULL) {\n        return FALSE;\n    }\n    CFX_ByteString type = m_pFontDict->GetString(FX_BSTRC(\"Subtype\"));\n    m_BaseFont = m_pFontDict->GetString(FX_BSTRC(\"BaseFont\"));\n    if (type == FX_BSTRC(\"MMType1\")) {\n        type = FX_BSTRC(\"Type1\");\n    }\n    return _Load();\n}\nstatic CFX_WideString _FontMap_GetWideString(CFX_CharMap* pMap, const CFX_ByteString& bytestr)\n{\n    return ((CPDF_FontCharMap*)pMap)->m_pFont->DecodeString(bytestr);\n}\nstatic CFX_ByteString _FontMap_GetByteString(CFX_CharMap* pMap, const CFX_WideString& widestr)\n{\n    return ((CPDF_FontCharMap*)pMap)->m_pFont->EncodeString(widestr);\n}\nCPDF_FontCharMap::CPDF_FontCharMap(CPDF_Font* pFont)\n{\n    m_GetByteString = _FontMap_GetByteString;\n    m_GetWideString = _FontMap_GetWideString;\n    m_pFont = pFont;\n}\nCFX_WideString CPDF_ToUnicodeMap::Lookup(FX_DWORD charcode)\n{\n    FX_DWORD value;\n    if (m_Map.Lookup(charcode, value)) {\n        FX_WCHAR unicode = (FX_WCHAR)(value & 0xffff);\n        if (unicode != 0xffff) {\n            return unicode;\n        }\n        FX_LPCWSTR buf = m_MultiCharBuf.GetBuffer();\n        FX_DWORD buf_len = m_MultiCharBuf.GetLength();\n        if (buf == NULL || buf_len == 0) {\n            return CFX_WideString();\n        }\n        FX_DWORD index = value >> 16;\n        if (index >= buf_len) {\n            return CFX_WideString();\n        }\n        FX_DWORD len = buf[index];\n        if (index + len < index || index + len >= buf_len) {\n            return CFX_WideString();\n        }\n        return CFX_WideString(buf + index + 1, len);\n    }\n    if (m_pBaseMap) {\n        return m_pBaseMap->UnicodeFromCID((FX_WORD)charcode);\n    }\n    return CFX_WideString();\n}\nFX_DWORD CPDF_ToUnicodeMap::ReverseLookup(FX_WCHAR unicode)\n{\n    FX_POSITION pos = m_Map.GetStartPosition();\n    while (pos) {\n        FX_DWORD key, value;\n        m_Map.GetNextAssoc(pos, key, value);\n        if ((FX_WCHAR)value == unicode) {\n            return key;\n        }\n    }\n    return 0;\n}\nstatic FX_DWORD _StringToCode(FX_BSTR str)\n{\n    FX_LPCSTR buf = str.GetCStr();\n    int len = str.GetLength();\n    if (len == 0) {\n        return 0;\n    }\n    int result = 0;\n    if (buf[0] == '<') {\n        for (int i = 1; i < len; i ++) {\n            int digit;\n            if (buf[i] >= '0' && buf[i] <= '9') {\n                digit = buf[i] - '0';\n            } else if (buf[i] >= 'a' && buf[i] <= 'f') {\n                digit = buf[i] - 'a' + 10;\n            } else if (buf[i] >= 'A' && buf[i] <= 'F') {\n                digit = buf[i] - 'A' + 10;\n            } else {\n                break;\n            }\n            result = result * 16 + digit;\n        }\n        return result;\n    } else {\n        for (int i = 0; i < len; i ++) {\n            if (buf[i] < '0' || buf[i] > '9') {\n                break;\n            }\n            result = result * 10 + buf[i] - '0';\n        }\n    }\n    return result;\n}\nstatic CFX_WideString _StringDataAdd(CFX_WideString str)\n{\n    CFX_WideString ret;\n    int len = str.GetLength();\n    FX_WCHAR value = 1;\n    for (int i = len - 1; i >= 0 ; --i) {\n        FX_WCHAR ch = str[i] + value;\n        if (ch < str[i]) {\n            ret.Insert(0, 0);\n        } else {\n            ret.Insert(0, ch);\n            value = 0;\n        }\n    }\n    if (value) {\n        ret.Insert(0, value);\n    }\n    return ret;\n}\nstatic CFX_WideString _StringToWideString(FX_BSTR str)\n{\n    FX_LPCSTR buf = str.GetCStr();\n    int len = str.GetLength();\n    if (len == 0) {\n        return CFX_WideString();\n    }\n    CFX_WideString result;\n    if (buf[0] == '<') {\n        int byte_pos = 0;\n        FX_WCHAR ch = 0;\n        for (int i = 1; i < len; i ++) {\n            int digit;\n            if (buf[i] >= '0' && buf[i] <= '9') {\n                digit = buf[i] - '0';\n            } else if (buf[i] >= 'a' && buf[i] <= 'f') {\n                digit = buf[i] - 'a' + 10;\n            } else if (buf[i] >= 'A' && buf[i] <= 'F') {\n                digit = buf[i] - 'A' + 10;\n            } else {\n                break;\n            }\n            ch = ch * 16 + digit;\n            byte_pos ++;\n            if (byte_pos == 4) {\n                result += ch;\n                byte_pos = 0;\n                ch = 0;\n            }\n        }\n        return result;\n    }\n    if (buf[0] == '(') {\n    }\n    return result;\n}\nvoid CPDF_ToUnicodeMap::Load(CPDF_Stream* pStream)\n{\n    int CIDSet = 0;\n    CPDF_StreamAcc stream;\n    stream.LoadAllData(pStream, FALSE);\n    CPDF_SimpleParser parser(stream.GetData(), stream.GetSize());\n    m_Map.EstimateSize(stream.GetSize() / 8, 1024);\n    while (1) {\n        CFX_ByteStringC word = parser.GetWord();\n        if (word.IsEmpty()) {\n            break;\n        }\n        if (word == FX_BSTRC(\"beginbfchar\")) {\n            while (1) {\n                word = parser.GetWord();\n                if (word.IsEmpty() || word == FX_BSTRC(\"endbfchar\")) {\n                    break;\n                }\n                FX_DWORD srccode = _StringToCode(word);\n                word = parser.GetWord();\n                CFX_WideString destcode = _StringToWideString(word);\n                int len = destcode.GetLength();\n                if (len == 0) {\n                    continue;\n                }\n                if (len == 1) {\n                    m_Map.SetAt(srccode, destcode.GetAt(0));\n                } else {\n                    m_Map.SetAt(srccode, m_MultiCharBuf.GetLength() * 0x10000 + 0xffff);\n                    m_MultiCharBuf.AppendChar(destcode.GetLength());\n                    m_MultiCharBuf << destcode;\n                }\n            }\n        } else if (word == FX_BSTRC(\"beginbfrange\")) {\n            while (1) {\n                CFX_ByteString low, high;\n                low = parser.GetWord();\n                if (low.IsEmpty() || low == FX_BSTRC(\"endbfrange\")) {\n                    break;\n                }\n                high = parser.GetWord();\n                FX_DWORD lowcode = _StringToCode(low);\n                FX_DWORD highcode = (lowcode & 0xffffff00) | (_StringToCode(high) & 0xff);\n                if (highcode == (FX_DWORD) - 1) {\n                    break;\n                }\n                CFX_ByteString start = parser.GetWord();\n                if (start == FX_BSTRC(\"[\")) {\n                    for (FX_DWORD code = lowcode; code <= highcode; code ++) {\n                        CFX_ByteString dest = parser.GetWord();\n                        CFX_WideString destcode = _StringToWideString(dest);\n                        int len = destcode.GetLength();\n                        if (len == 0) {\n                            continue;\n                        }\n                        if (len == 1) {\n                            m_Map.SetAt(code, destcode.GetAt(0));\n                        } else {\n                            m_Map.SetAt(code, m_MultiCharBuf.GetLength() * 0x10000 + 0xffff);\n                            m_MultiCharBuf.AppendChar(destcode.GetLength());\n                            m_MultiCharBuf << destcode;\n                        }\n                    }\n                    parser.GetWord();\n                } else {\n                    CFX_WideString destcode = _StringToWideString(start);\n                    int len = destcode.GetLength();\n                    FX_DWORD value = 0;\n                    if (len == 1) {\n                        value = _StringToCode(start);\n                        for (FX_DWORD code = lowcode; code <= highcode; code ++) {\n                            m_Map.SetAt(code, value++);\n                        }\n                    } else {\n                        for (FX_DWORD code = lowcode; code <= highcode; code ++) {\n                            CFX_WideString retcode;\n                            if (code == lowcode) {\n                                retcode = destcode;\n                            } else {\n                                retcode = _StringDataAdd(destcode);\n                            }\n                            m_Map.SetAt(code, m_MultiCharBuf.GetLength() * 0x10000 + 0xffff);\n                            m_MultiCharBuf.AppendChar(retcode.GetLength());\n                            m_MultiCharBuf << retcode;\n                            destcode = retcode;\n                        }\n                    }\n                }\n            }\n        } else if (word == FX_BSTRC(\"/Adobe-Korea1-UCS2\")) {\n            CIDSet = CIDSET_KOREA1;\n        } else if (word == FX_BSTRC(\"/Adobe-Japan1-UCS2\")) {\n            CIDSet = CIDSET_JAPAN1;\n        } else if (word == FX_BSTRC(\"/Adobe-CNS1-UCS2\")) {\n            CIDSet = CIDSET_CNS1;\n        } else if (word == FX_BSTRC(\"/Adobe-GB1-UCS2\")) {\n            CIDSet = CIDSET_GB1;\n        }\n    }\n    if (CIDSet) {\n        m_pBaseMap = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals()->m_CMapManager.GetCID2UnicodeMap(CIDSet, FALSE);\n    } else {\n        m_pBaseMap = NULL;\n    }\n}\nstatic FX_BOOL GetPredefinedEncoding(int& basemap, const CFX_ByteString& value)\n{\n    if (value == FX_BSTRC(\"WinAnsiEncoding\")) {\n        basemap = PDFFONT_ENCODING_WINANSI;\n    } else if (value == FX_BSTRC(\"MacRomanEncoding\")) {\n        basemap = PDFFONT_ENCODING_MACROMAN;\n    } else if (value == FX_BSTRC(\"MacExpertEncoding\")) {\n        basemap = PDFFONT_ENCODING_MACEXPERT;\n    } else if (value == FX_BSTRC(\"PDFDocEncoding\")) {\n        basemap = PDFFONT_ENCODING_PDFDOC;\n    } else {\n        return FALSE;\n    }\n    return TRUE;\n}\nvoid CPDF_Font::LoadPDFEncoding(CPDF_Object* pEncoding, int& iBaseEncoding, CFX_ByteString*& pCharNames,\n                                FX_BOOL bEmbedded, FX_BOOL bTrueType)\n{\n    if (pEncoding == NULL) {\n        if (m_BaseFont == FX_BSTRC(\"Symbol\")) {\n            iBaseEncoding = bTrueType ? PDFFONT_ENCODING_MS_SYMBOL : PDFFONT_ENCODING_ADOBE_SYMBOL;\n        } else if (!bEmbedded && iBaseEncoding == PDFFONT_ENCODING_BUILTIN) {\n            iBaseEncoding = PDFFONT_ENCODING_WINANSI;\n        }\n        return;\n    }\n    if (pEncoding->GetType() == PDFOBJ_NAME) {\n        if (iBaseEncoding == PDFFONT_ENCODING_ADOBE_SYMBOL || iBaseEncoding == PDFFONT_ENCODING_ZAPFDINGBATS) {\n            return;\n        }\n        if ((m_Flags & PDFFONT_SYMBOLIC) && m_BaseFont == FX_BSTRC(\"Symbol\")) {\n            if (!bTrueType) {\n                iBaseEncoding = PDFFONT_ENCODING_ADOBE_SYMBOL;\n            }\n            return;\n        }\n        CFX_ByteString bsEncoding = pEncoding->GetString();\n        if (bsEncoding.Compare(FX_BSTRC(\"MacExpertEncoding\")) == 0) {\n            bsEncoding = FX_BSTRC(\"WinAnsiEncoding\");\n        }\n        GetPredefinedEncoding(iBaseEncoding, bsEncoding);\n        return;\n    }\n    if (pEncoding->GetType() != PDFOBJ_DICTIONARY) {\n        return;\n    }\n    CPDF_Dictionary* pDict = (CPDF_Dictionary*)pEncoding;\n    if (iBaseEncoding != PDFFONT_ENCODING_ADOBE_SYMBOL && iBaseEncoding != PDFFONT_ENCODING_ZAPFDINGBATS) {\n        CFX_ByteString bsEncoding = pDict->GetString(FX_BSTRC(\"BaseEncoding\"));\n        if (bsEncoding.Compare(FX_BSTRC(\"MacExpertEncoding\")) == 0 && bTrueType) {\n            bsEncoding = FX_BSTRC(\"WinAnsiEncoding\");\n        }\n        GetPredefinedEncoding(iBaseEncoding, bsEncoding);\n    }\n    if ((!bEmbedded || bTrueType) && iBaseEncoding == PDFFONT_ENCODING_BUILTIN) {\n        iBaseEncoding = PDFFONT_ENCODING_STANDARD;\n    }\n    CPDF_Array* pDiffs = pDict->GetArray(FX_BSTRC(\"Differences\"));\n    if (pDiffs == NULL) {\n        return;\n    }\n    FX_NEW_VECTOR(pCharNames, CFX_ByteString, 256);\n    FX_DWORD cur_code = 0;\n    for (FX_DWORD i = 0; i < pDiffs->GetCount(); i ++) {\n        CPDF_Object* pElement = pDiffs->GetElementValue(i);\n        if (pElement == NULL) {\n            continue;\n        }\n        if (pElement->GetType() == PDFOBJ_NAME) {\n            if (cur_code < 256) {\n                pCharNames[cur_code] = ((CPDF_Name*)pElement)->GetString();\n            }\n            cur_code ++;\n        } else {\n            cur_code = pElement->GetInteger();\n        }\n    }\n}\nFX_BOOL CPDF_Font::IsStandardFont() const\n{\n    if (m_FontType != PDFFONT_TYPE1) {\n        return FALSE;\n    }\n    if (m_pFontFile != NULL) {\n        return FALSE;\n    }\n    if (((CPDF_Type1Font*)this)->GetBase14Font() < 0) {\n        return FALSE;\n    }\n    return TRUE;\n}\nextern FX_LPCSTR PDF_CharNameFromPredefinedCharSet(int encoding, FX_BYTE charcode);\nCPDF_SimpleFont::CPDF_SimpleFont()\n{\n    FXSYS_memset8(m_CharBBox, 0xff, sizeof m_CharBBox);\n    FXSYS_memset8(m_CharWidth, 0xff, sizeof m_CharWidth);\n    FXSYS_memset8(m_GlyphIndex, 0xff, sizeof m_GlyphIndex);\n    FXSYS_memset8(m_ExtGID, 0xff, sizeof m_ExtGID);\n    m_pCharNames = NULL;\n    m_BaseEncoding = PDFFONT_ENCODING_BUILTIN;\n}\nCPDF_SimpleFont::~CPDF_SimpleFont()\n{\n    if (m_pCharNames) {\n        FX_DELETE_VECTOR(m_pCharNames, CFX_ByteString, 256);\n    }\n}\nint CPDF_SimpleFont::GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph)\n{\n    if (pVertGlyph) {\n        *pVertGlyph = FALSE;\n    }\n    if (charcode > 0xff) {\n        return -1;\n    }\n    int index = m_GlyphIndex[(FX_BYTE)charcode];\n    if (index == 0xffff) {\n        return -1;\n    }\n    return index;\n}\nvoid CPDF_SimpleFont::LoadCharMetrics(int charcode)\n{\n    if (m_Font.m_Face == NULL) {\n        return;\n    }\n    if (charcode < 0 || charcode > 0xff) {\n        return;\n    }\n    int glyph_index = m_GlyphIndex[charcode];\n    if (glyph_index == 0xffff) {\n        if (m_pFontFile == NULL && charcode != 32) {\n            LoadCharMetrics(32);\n            m_CharBBox[charcode] = m_CharBBox[32];\n            if (m_bUseFontWidth) {\n                m_CharWidth[charcode] = m_CharWidth[32];\n            }\n        }\n        return;\n    }\n    int err = FXFT_Load_Glyph(m_Font.m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);\n    if (err) {\n        return;\n    }\n    m_CharBBox[charcode].Left = TT2PDF(FXFT_Get_Glyph_HoriBearingX(m_Font.m_Face), m_Font.m_Face);\n    m_CharBBox[charcode].Right = TT2PDF(FXFT_Get_Glyph_HoriBearingX(m_Font.m_Face) + FXFT_Get_Glyph_Width(m_Font.m_Face), m_Font.m_Face);\n    m_CharBBox[charcode].Top = TT2PDF(FXFT_Get_Glyph_HoriBearingY(m_Font.m_Face), m_Font.m_Face);\n    m_CharBBox[charcode].Bottom = TT2PDF(FXFT_Get_Glyph_HoriBearingY(m_Font.m_Face) - FXFT_Get_Glyph_Height(m_Font.m_Face), m_Font.m_Face);\n    if (m_bUseFontWidth) {\n        int TT_Width = TT2PDF(FXFT_Get_Glyph_HoriAdvance(m_Font.m_Face), m_Font.m_Face);\n        if (m_CharWidth[charcode] == 0xffff) {\n            m_CharWidth[charcode] = TT_Width;\n        } else if (TT_Width && !IsEmbedded()) {\n            m_CharBBox[charcode].Right = m_CharBBox[charcode].Right * m_CharWidth[charcode] / TT_Width;\n            m_CharBBox[charcode].Left = m_CharBBox[charcode].Left * m_CharWidth[charcode] / TT_Width;\n        }\n    }\n}\nint CPDF_SimpleFont::GetCharWidthF(FX_DWORD charcode, int level)\n{\n    if (charcode > 0xff) {\n        charcode = 0;\n    }\n    if (m_CharWidth[charcode] == 0xffff) {\n        LoadCharMetrics(charcode);\n        if (m_CharWidth[charcode] == 0xffff) {\n            m_CharWidth[charcode] = 0;\n        }\n    }\n    return (FX_INT16)m_CharWidth[charcode];\n}\nvoid CPDF_SimpleFont::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level)\n{\n    if (charcode > 0xff) {\n        charcode = 0;\n    }\n    if (m_CharBBox[charcode].Left == (FX_SHORT)0xffff) {\n        LoadCharMetrics(charcode);\n    }\n    rect.left = m_CharBBox[charcode].Left;\n    rect.right = m_CharBBox[charcode].Right;\n    rect.bottom = m_CharBBox[charcode].Bottom;\n    rect.top = m_CharBBox[charcode].Top;\n}\nFX_LPCSTR GetAdobeCharName(int iBaseEncoding, const CFX_ByteString* pCharNames, int charcode)\n{\n    ASSERT(charcode >= 0 && charcode < 256);\n    if (charcode < 0 || charcode >= 256) {\n        return NULL;\n    }\n    FX_LPCSTR name = NULL;\n    if (pCharNames) {\n        name = pCharNames[charcode];\n    }\n    if ((name == NULL || name[0] == 0) && iBaseEncoding) {\n        name = PDF_CharNameFromPredefinedCharSet(iBaseEncoding, charcode);\n    }\n    if (name == NULL || name[0] == 0) {\n        return NULL;\n    }\n    return name;\n}\nFX_BOOL CPDF_SimpleFont::LoadCommon()\n{\n    CPDF_Dictionary* pFontDesc = m_pFontDict->GetDict(FX_BSTRC(\"FontDescriptor\"));\n    if (pFontDesc) {\n        LoadFontDescriptor(pFontDesc);\n    }\n    CPDF_Array* pWidthArray = m_pFontDict->GetArray(FX_BSTRC(\"Widths\"));\n    int width_start = 0, width_end = -1;\n    m_bUseFontWidth = TRUE;\n    if (pWidthArray) {\n        m_bUseFontWidth = FALSE;\n        if (pFontDesc && pFontDesc->KeyExist(FX_BSTRC(\"MissingWidth\"))) {\n            int MissingWidth = pFontDesc->GetInteger(FX_BSTRC(\"MissingWidth\"));\n            for (int i = 0; i < 256; i ++) {\n                m_CharWidth[i] = MissingWidth;\n            }\n        }\n        width_start = m_pFontDict->GetInteger(FX_BSTRC(\"FirstChar\"), 0);\n        width_end = m_pFontDict->GetInteger(FX_BSTRC(\"LastChar\"), 0);\n        if (width_start >= 0 && width_start <= 255) {\n            if (width_end <= 0 || width_end >= width_start + (int)pWidthArray->GetCount()) {\n                width_end = width_start + pWidthArray->GetCount() - 1;\n            }\n            if (width_end > 255) {\n                width_end = 255;\n            }\n            for (int i = width_start; i <= width_end; i ++) {\n                m_CharWidth[i] = pWidthArray->GetInteger(i - width_start);\n            }\n        }\n    }\n    if (m_pFontFile == NULL) {\n        LoadSubstFont();\n    } else {\n        if (m_BaseFont.GetLength() > 8 && m_BaseFont[7] == '+') {\n            m_BaseFont = m_BaseFont.Mid(8);\n        }\n    }\n    if (!(m_Flags & PDFFONT_SYMBOLIC)) {\n        m_BaseEncoding = PDFFONT_ENCODING_STANDARD;\n    }\n    CPDF_Object* pEncoding = m_pFontDict->GetElementValue(FX_BSTRC(\"Encoding\"));\n    LoadPDFEncoding(pEncoding, m_BaseEncoding, m_pCharNames, m_pFontFile != NULL, m_Font.IsTTFont());\n    LoadGlyphMap();\n    if (m_pCharNames) {\n        FX_DELETE_VECTOR(m_pCharNames, CFX_ByteString, 256);\n        m_pCharNames = NULL;\n    }\n    if (m_Font.m_Face == NULL) {\n        return TRUE;\n    }\n    if (m_Flags & PDFFONT_ALLCAP) {\n        unsigned char lowercases[] = {'a', 'z', 0xe0, 0xf6, 0xf8, 0xfd};\n        for (int range = 0; range < sizeof lowercases / 2; range ++) {\n            for (int i = lowercases[range * 2]; i <= lowercases[range * 2 + 1]; i ++) {\n                if (m_GlyphIndex[i] != 0xffff && m_pFontFile != NULL) {\n                    continue;\n                }\n                m_GlyphIndex[i] = m_GlyphIndex[i - 32];\n                if (m_CharWidth[i - 32]) {\n                    m_CharWidth[i] = m_CharWidth[i - 32];\n                    m_CharBBox[i] = m_CharBBox[i - 32];\n                }\n            }\n        }\n    }\n    CheckFontMetrics();\n    return TRUE;\n}\nvoid CPDF_SimpleFont::LoadSubstFont()\n{\n    if (!m_bUseFontWidth && !(m_Flags & PDFFONT_FIXEDPITCH)) {\n        int width = 0, i;\n        for (i = 0; i < 256; i ++) {\n            if (m_CharWidth[i] == 0 || m_CharWidth[i] == 0xffff) {\n                continue;\n            }\n            if (width == 0) {\n                width = m_CharWidth[i];\n            } else if (width != m_CharWidth[i]) {\n                break;\n            }\n        }\n        if (i == 256 && width) {\n            m_Flags |= PDFFONT_FIXEDPITCH;\n        }\n    }\n    int weight = m_StemV < 140 ? m_StemV * 5 : (m_StemV * 4 + 140);\n    m_Font.LoadSubst(m_BaseFont, m_FontType == PDFFONT_TRUETYPE, m_Flags, weight, m_ItalicAngle, 0);\n    if (m_Font.m_pSubstFont->m_SubstFlags & FXFONT_SUBST_NONSYMBOL) {\n    }\n}\nFX_BOOL CPDF_SimpleFont::IsUnicodeCompatible() const\n{\n    return m_BaseEncoding != PDFFONT_ENCODING_BUILTIN && m_BaseEncoding != PDFFONT_ENCODING_ADOBE_SYMBOL &&\n           m_BaseEncoding != PDFFONT_ENCODING_ZAPFDINGBATS;\n}\nCPDF_Type1Font::CPDF_Type1Font()\n{\n    m_Base14Font = -1;\n}\nFX_BOOL CPDF_Type1Font::_Load()\n{\n    m_Base14Font = _PDF_GetStandardFontName(m_BaseFont);\n    if (m_Base14Font >= 0) {\n        CPDF_Dictionary* pFontDesc = m_pFontDict->GetDict(FX_BSTRC(\"FontDescriptor\"));\n        if (pFontDesc && pFontDesc->KeyExist(FX_BSTRC(\"Flags\"))) {\n            m_Flags = pFontDesc->GetInteger(FX_BSTRC(\"Flags\"));\n        } else {\n            m_Flags = m_Base14Font >= 12 ? PDFFONT_SYMBOLIC : PDFFONT_NONSYMBOLIC;\n        }\n        if (m_Base14Font < 4)\n            for (int i = 0; i < 256; i ++) {\n                m_CharWidth[i] = 600;\n            }\n        if (m_Base14Font == 12) {\n            m_BaseEncoding = PDFFONT_ENCODING_ADOBE_SYMBOL;\n        } else if (m_Base14Font == 13) {\n            m_BaseEncoding = PDFFONT_ENCODING_ZAPFDINGBATS;\n        } else if (m_Flags & PDFFONT_NONSYMBOLIC) {\n            m_BaseEncoding = PDFFONT_ENCODING_STANDARD;\n        }\n    }\n    return LoadCommon();\n}\nstatic FX_BOOL FT_UseType1Charmap(FXFT_Face face)\n{\n    if (FXFT_Get_Face_CharmapCount(face) == 0) {\n        return FALSE;\n    }\n    if (FXFT_Get_Face_CharmapCount(face) == 1 &&\n            FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[0]) == FXFT_ENCODING_UNICODE) {\n        return FALSE;\n    }\n    if (FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[0]) == FXFT_ENCODING_UNICODE) {\n        FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[1]);\n    } else {\n        FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[0]);\n    }\n    return TRUE;\n}\nextern FX_WCHAR FT_UnicodeFromCharCode(int encoding, FX_DWORD charcode);\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n#include \"../../fxge/apple/apple_int.h\"\n#endif\nint CPDF_Type1Font::GlyphFromCharCodeExt(FX_DWORD charcode)\n{\n    if (charcode > 0xff) {\n        return -1;\n    }\n    int index = m_ExtGID[(FX_BYTE)charcode];\n    if (index == 0xffff) {\n        return -1;\n    }\n    return index;\n}\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\nstruct _GlyphNameMap {\n    FX_LPCSTR m_pStrAdobe;\n    FX_LPCSTR m_pStrUnicode;\n};\nstatic const _GlyphNameMap g_GlyphNameSubsts[] = {\n    {\"ff\", \"uniFB00\"},\n    {\"fi\", \"uniFB01\"},\n    {\"fl\", \"uniFB02\"},\n    {\"ffi\", \"uniFB03\"},\n    {\"ffl\", \"uniFB04\"}\n};\nextern \"C\" {\n    static int compareString(const void* key, const void* element)\n    {\n        return FXSYS_stricmp((FX_LPCSTR)key, ((_GlyphNameMap*)element)->m_pStrAdobe);\n    }\n}\nstatic FX_LPCSTR _GlyphNameRemap(FX_LPCSTR pStrAdobe)\n{\n    _GlyphNameMap* found = (_GlyphNameMap*)FXSYS_bsearch(pStrAdobe, g_GlyphNameSubsts,\n                           sizeof g_GlyphNameSubsts / sizeof(_GlyphNameMap), sizeof(_GlyphNameMap),\n                           compareString);\n    if (found) {\n        return found->m_pStrUnicode;\n    }\n    return NULL;\n}\n#endif\nvoid CPDF_Type1Font::LoadGlyphMap()\n{\n    if (m_Font.m_Face == NULL) {\n        return;\n    }\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n    FX_BOOL bCoreText = TRUE;\n    CQuartz2D & quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;\n    if (!m_Font.m_pPlatformFont) {\n        if (m_Font.GetPsName() == CFX_WideString::FromLocal(\"DFHeiStd-W5\")) {\n            bCoreText = FALSE;\n        }\n        m_Font.m_pPlatformFont = quartz2d.CreateFont(m_Font.m_pFontData, m_Font.m_dwSize);\n        if (NULL == m_Font.m_pPlatformFont) {\n            bCoreText = FALSE;\n        }\n    }\n#endif\n    if (!IsEmbedded() && (m_Base14Font < 12) && m_Font.IsTTFont()) {\n        if (FT_UseTTCharmap(m_Font.m_Face, 3, 0)) {\n            FX_BOOL bGotOne = FALSE;\n            for (int charcode = 0; charcode < 256; charcode ++) {\n                const FX_BYTE prefix[4] = {0x00, 0xf0, 0xf1, 0xf2};\n                for (int j = 0; j < 4; j ++) {\n                    FX_WORD unicode = prefix[j] * 256 + charcode;\n                    m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, unicode);\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n                    FX_CHAR name_glyph[256];\n                    FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);\n                    name_glyph[255] = 0;\n                    CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);\n                    m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);\n                    if (name_ct) {\n                        CFRelease(name_ct);\n                    }\n#endif\n                    if (m_GlyphIndex[charcode]) {\n                        bGotOne = TRUE;\n                        break;\n                    }\n                }\n            }\n            if (bGotOne) {\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n                if (!bCoreText) {\n                    FXSYS_memcpy32(m_ExtGID, m_GlyphIndex, 256);\n                }\n#endif\n                return;\n            }\n        }\n        FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE);\n        if (m_BaseEncoding == 0) {\n            m_BaseEncoding = PDFFONT_ENCODING_STANDARD;\n        }\n        for (int charcode = 0; charcode < 256; charcode ++) {\n            FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);\n            if (name == NULL) {\n                continue;\n            }\n            m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);\n            m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, m_Encoding.m_Unicodes[charcode]);\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n            FX_CHAR name_glyph[256];\n            FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);\n            name_glyph[255] = 0;\n            CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);\n            m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);\n            if (name_ct) {\n                CFRelease(name_ct);\n            }\n#endif\n            if (m_GlyphIndex[charcode] == 0 && FXSYS_strcmp(name, \".notdef\") == 0) {\n                m_Encoding.m_Unicodes[charcode] = 0x20;\n                m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, 0x20);\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n                FX_CHAR name_glyph[256];\n                FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);\n                name_glyph[255] = 0;\n                CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);\n                m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);\n                if (name_ct) {\n                    CFRelease(name_ct);\n                }\n#endif\n            }\n        }\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n        if (!bCoreText) {\n            FXSYS_memcpy32(m_ExtGID, m_GlyphIndex, 256);\n        }\n#endif\n        return;\n    }\n    FT_UseType1Charmap(m_Font.m_Face);\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n    if (bCoreText) {\n        if (m_Flags & PDFFONT_SYMBOLIC) {\n            for (int charcode = 0; charcode < 256; charcode ++) {\n                FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);\n                if (name) {\n                    m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);\n                    m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);\n                    CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name, kCFStringEncodingASCII, kCFAllocatorNull);\n                    m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);\n                    if (name_ct) {\n                        CFRelease(name_ct);\n                    }\n                } else {\n                    m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, charcode);\n                    FX_WCHAR unicode = 0;\n                    if (m_GlyphIndex[charcode]) {\n                        unicode = FT_UnicodeFromCharCode(PDFFONT_ENCODING_STANDARD, charcode);\n                    }\n                    FX_CHAR name_glyph[256];\n                    FXSYS_memset32(name_glyph, 0, sizeof(name_glyph));\n                    FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);\n                    name_glyph[255] = 0;\n                    if (unicode == 0 && name_glyph[0] != 0) {\n                        unicode = PDF_UnicodeFromAdobeName(name_glyph);\n                    }\n                    m_Encoding.m_Unicodes[charcode] = unicode;\n                    CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);\n                    m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);\n                    if (name_ct) {\n                        CFRelease(name_ct);\n                    }\n                }\n            }\n            return;\n        }\n        FX_BOOL bUnicode = FALSE;\n        if (0 == FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE)) {\n            bUnicode = TRUE;\n        }\n        for (int charcode = 0; charcode < 256; charcode ++) {\n            FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);\n            if (name == NULL) {\n                continue;\n            }\n            m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);\n            FX_LPCSTR pStrUnicode = _GlyphNameRemap(name);\n            if (pStrUnicode && 0 == FXFT_Get_Name_Index(m_Font.m_Face, (char*)name)) {\n                name = pStrUnicode;\n            }\n            m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);\n            CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name, kCFStringEncodingASCII, kCFAllocatorNull);\n            m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);\n            if (name_ct) {\n                CFRelease(name_ct);\n            }\n            if (m_GlyphIndex[charcode] == 0) {\n                if (FXSYS_strcmp(name, \".notdef\") != 0 && FXSYS_strcmp(name, \"space\") != 0) {\n                    m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, bUnicode ? m_Encoding.m_Unicodes[charcode] : charcode);\n                    FX_CHAR name_glyph[256];\n                    FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);\n                    name_glyph[255] = 0;\n                    CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);\n                    m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);\n                    if (name_ct) {\n                        CFRelease(name_ct);\n                    }\n                } else {\n                    m_Encoding.m_Unicodes[charcode] = 0x20;\n                    m_GlyphIndex[charcode] = bUnicode ? FXFT_Get_Char_Index(m_Font.m_Face, 0x20) : 0xffff;\n                    FX_CHAR name_glyph[256];\n                    FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);\n                    name_glyph[255] = 0;\n                    CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);\n                    m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);\n                    if (name_ct) {\n                        CFRelease(name_ct);\n                    }\n                }\n            }\n        }\n        return;\n    }\n#endif\n    if (m_Flags & PDFFONT_SYMBOLIC) {\n        for (int charcode = 0; charcode < 256; charcode ++) {\n            FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);\n            if (name) {\n                m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);\n                m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);\n            } else {\n                m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, charcode);\n                if (m_GlyphIndex[charcode]) {\n                    FX_WCHAR unicode = FT_UnicodeFromCharCode(PDFFONT_ENCODING_STANDARD, charcode);\n                    if (unicode == 0) {\n                        FX_CHAR name_glyph[256];\n                        FXSYS_memset32(name_glyph, 0, sizeof(name_glyph));\n                        FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);\n                        name_glyph[255] = 0;\n                        if (name_glyph[0] != 0) {\n                            unicode = PDF_UnicodeFromAdobeName(name_glyph);\n                        }\n                    }\n                    m_Encoding.m_Unicodes[charcode] = unicode;\n                }\n            }\n        }\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n        if (!bCoreText) {\n            FXSYS_memcpy32(m_ExtGID, m_GlyphIndex, 256);\n        }\n#endif\n        return;\n    }\n    FX_BOOL bUnicode = FALSE;\n    if (0 == FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE)) {\n        bUnicode = TRUE;\n    }\n    for (int charcode = 0; charcode < 256; charcode ++) {\n        FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);\n        if (name == NULL) {\n            continue;\n        }\n        m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);\n        m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);\n        if (m_GlyphIndex[charcode] == 0) {\n            if (FXSYS_strcmp(name, \".notdef\") != 0 && FXSYS_strcmp(name, \"space\") != 0) {\n                m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, bUnicode ? m_Encoding.m_Unicodes[charcode] : charcode);\n            } else {\n                m_Encoding.m_Unicodes[charcode] = 0x20;\n                m_GlyphIndex[charcode] = 0xffff;\n            }\n        }\n    }\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n    if (!bCoreText) {\n        FXSYS_memcpy32(m_ExtGID, m_GlyphIndex, 256);\n    }\n#endif\n}\nCPDF_FontEncoding::CPDF_FontEncoding()\n{\n    FXSYS_memset32(m_Unicodes, 0, sizeof(m_Unicodes));\n}\nint CPDF_FontEncoding::CharCodeFromUnicode(FX_WCHAR unicode) const\n{\n    for (int i = 0; i < 256; i ++)\n        if (m_Unicodes[i] == unicode) {\n            return i;\n        }\n    return -1;\n}\nCPDF_FontEncoding::CPDF_FontEncoding(int PredefinedEncoding)\n{\n    const FX_WORD* pSrc = PDF_UnicodesForPredefinedCharSet(PredefinedEncoding);\n    if (!pSrc) {\n        FXSYS_memset32(m_Unicodes, 0, sizeof(m_Unicodes));\n    } else\n        for (int i = 0; i < 256; i++) {\n            m_Unicodes[i] = pSrc[i];\n        }\n}\nFX_BOOL CPDF_FontEncoding::IsIdentical(CPDF_FontEncoding* pAnother) const\n{\n    return FXSYS_memcmp32(m_Unicodes, pAnother->m_Unicodes, sizeof(m_Unicodes)) == 0;\n}\nCPDF_Object* CPDF_FontEncoding::Realize()\n{\n    int predefined = 0;\n    for (int cs = PDFFONT_ENCODING_WINANSI; cs < PDFFONT_ENCODING_ZAPFDINGBATS; cs ++) {\n        const FX_WORD* pSrc = PDF_UnicodesForPredefinedCharSet(cs);\n        FX_BOOL match = TRUE;\n        for (int i = 0; i < 256; ++i) {\n            if (m_Unicodes[i] != pSrc[i]) {\n                match = FALSE;\n                break;\n            }\n        }\n        if (match) {\n            predefined = cs;\n            break;\n        }\n    }\n    if (predefined) {\n        if (predefined == PDFFONT_ENCODING_WINANSI) {\n            return CPDF_Name::Create(\"WinAnsiEncoding\");\n        }\n        if (predefined == PDFFONT_ENCODING_MACROMAN) {\n            return CPDF_Name::Create(\"MacRomanEncoding\");\n        }\n        if (predefined == PDFFONT_ENCODING_MACEXPERT) {\n            return CPDF_Name::Create(\"MacExpertEncoding\");\n        }\n        return NULL;\n    }\n    CPDF_Dictionary* pDict = CPDF_Dictionary::Create();\n    pDict->SetAtName(FX_BSTRC(\"BaseEncoding\"), FX_BSTRC(\"WinAnsiEncoding\"));\n    const FX_WORD* pStandard = PDF_UnicodesForPredefinedCharSet(PDFFONT_ENCODING_WINANSI);\n    CPDF_Array* pDiff = CPDF_Array::Create();\n    for (int i = 0; i < 256; i ++) {\n        if (pStandard[i] == m_Unicodes[i]) {\n            continue;\n        }\n        pDiff->Add(CPDF_Number::Create(i));\n        pDiff->Add(CPDF_Name::Create(PDF_AdobeNameFromUnicode(m_Unicodes[i])));\n    }\n    pDict->SetAt(FX_BSTRC(\"Differences\"), pDiff);\n    return pDict;\n}\nCPDF_TrueTypeFont::CPDF_TrueTypeFont()\n{\n}\nFX_BOOL CPDF_TrueTypeFont::_Load()\n{\n    return LoadCommon();\n}\nextern FX_DWORD FT_CharCodeFromUnicode(int encoding, FX_WCHAR unicode);\nvoid CPDF_TrueTypeFont::LoadGlyphMap()\n{\n    if (m_Font.m_Face == NULL) {\n        return;\n    }\n    int baseEncoding = m_BaseEncoding;\n    if (m_pFontFile && m_Font.m_Face->num_charmaps > 0\n            && (baseEncoding == PDFFONT_ENCODING_MACROMAN || baseEncoding == PDFFONT_ENCODING_WINANSI)\n            && (m_Flags & PDFFONT_SYMBOLIC)) {\n        FX_BOOL bSupportWin = FALSE;\n        FX_BOOL bSupportMac = FALSE;\n        for (int i = 0; i < FXFT_Get_Face_CharmapCount(m_Font.m_Face); i++) {\n            int platform_id = FXFT_Get_Charmap_PlatformID(FXFT_Get_Face_Charmaps(m_Font.m_Face)[i]);\n            if (platform_id == 0 || platform_id == 3) {\n                bSupportWin = TRUE;\n            } else if (platform_id == 0 || platform_id == 1) {\n                bSupportMac = TRUE;\n            }\n        }\n        if (baseEncoding == PDFFONT_ENCODING_WINANSI && !bSupportWin) {\n            baseEncoding = bSupportMac ? PDFFONT_ENCODING_MACROMAN : PDFFONT_ENCODING_BUILTIN;\n        } else if (baseEncoding == PDFFONT_ENCODING_MACROMAN && !bSupportMac) {\n            baseEncoding = bSupportWin ? PDFFONT_ENCODING_WINANSI : PDFFONT_ENCODING_BUILTIN;\n        }\n    }\n    if (((baseEncoding == PDFFONT_ENCODING_MACROMAN || baseEncoding == PDFFONT_ENCODING_WINANSI)\n            && m_pCharNames == NULL) || (m_Flags & PDFFONT_NONSYMBOLIC)) {\n        if (!FXFT_Has_Glyph_Names(m_Font.m_Face) && (!m_Font.m_Face->num_charmaps || !m_Font.m_Face->charmaps)) {\n            int nStartChar = m_pFontDict->GetInteger(FX_BSTRC(\"FirstChar\"));\n            if(nStartChar < 0 || nStartChar > 255)\n                return;\n\n            int charcode = 0;\n            for (; charcode < nStartChar; charcode ++) {\n                m_GlyphIndex[charcode] = 0;\n            }\n            FX_WORD nGlyph = charcode - nStartChar + 3;\n            for (; charcode < 256; charcode ++, nGlyph ++) {\n                m_GlyphIndex[charcode] = nGlyph;\n            }\n            return;\n        }\n        FX_BOOL bMSUnicode = FT_UseTTCharmap(m_Font.m_Face, 3, 1);\n        FX_BOOL bMacRoman = FALSE, bMSSymbol = FALSE;\n        if (!bMSUnicode) {\n            if (m_Flags & PDFFONT_NONSYMBOLIC) {\n                bMacRoman = FT_UseTTCharmap(m_Font.m_Face, 1, 0);\n                bMSSymbol = !bMacRoman && FT_UseTTCharmap(m_Font.m_Face, 3, 0);\n            } else {\n                bMSSymbol = FT_UseTTCharmap(m_Font.m_Face, 3, 0);\n                bMacRoman = !bMSSymbol && FT_UseTTCharmap(m_Font.m_Face, 1, 0);\n            }\n        }\n        FX_BOOL bToUnicode = m_pFontDict->KeyExist(FX_BSTRC(\"ToUnicode\"));\n        for (int charcode = 0; charcode < 256; charcode ++) {\n            FX_LPCSTR name = GetAdobeCharName(baseEncoding, m_pCharNames, charcode);\n            if (name == NULL) {\n                m_GlyphIndex[charcode] = m_pFontFile ? FXFT_Get_Char_Index(m_Font.m_Face, charcode) : -1;\n                continue;\n            }\n            m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);\n            if (bMSSymbol) {\n                const FX_BYTE prefix[4] = {0x00, 0xf0, 0xf1, 0xf2};\n                for (int j = 0; j < 4; j ++) {\n                    FX_WORD unicode = prefix[j] * 256 + charcode;\n                    m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, unicode);\n                    if (m_GlyphIndex[charcode]) {\n                        break;\n                    }\n                }\n            } else if (m_Encoding.m_Unicodes[charcode]) {\n                if (bMSUnicode) {\n                    m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, m_Encoding.m_Unicodes[charcode]);\n                } else if (bMacRoman) {\n                    FX_DWORD maccode = FT_CharCodeFromUnicode(FXFT_ENCODING_APPLE_ROMAN, m_Encoding.m_Unicodes[charcode]);\n                    if (!maccode) {\n                        m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char *)name);\n                    } else {\n                        m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, maccode);\n                    }\n                }\n            }\n            if ((m_GlyphIndex[charcode] == 0 || m_GlyphIndex[charcode] == 0xffff) && name != NULL) {\n                if (name[0] == '.' && FXSYS_strcmp(name, \".notdef\") == 0) {\n                    m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, 32);\n                } else {\n                    m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);\n                    if (m_GlyphIndex[charcode] == 0) {\n                        if (bToUnicode) {\n                            CFX_WideString wsUnicode = UnicodeFromCharCode(charcode);\n                            if (!wsUnicode.IsEmpty()) {\n                                m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, wsUnicode[0]);\n                                m_Encoding.m_Unicodes[charcode] = wsUnicode[0];\n                            }\n                        }\n                        if (m_GlyphIndex[charcode] == 0) {\n                            m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, charcode);\n                        }\n                    }\n                }\n            }\n        }\n        return;\n    }\n    if (FT_UseTTCharmap(m_Font.m_Face, 3, 0)) {\n        const FX_BYTE prefix[4] = {0x00, 0xf0, 0xf1, 0xf2};\n        FX_BOOL bGotOne = FALSE;\n        for (int charcode = 0; charcode < 256; charcode ++) {\n            for (int j = 0; j < 4; j ++) {\n                FX_WORD unicode = prefix[j] * 256 + charcode;\n                m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, unicode);\n                if (m_GlyphIndex[charcode]) {\n                    bGotOne = TRUE;\n                    break;\n                }\n            }\n        }\n        if (bGotOne) {\n            if (baseEncoding != PDFFONT_ENCODING_BUILTIN) {\n                for (int charcode = 0; charcode < 256; charcode ++) {\n                    FX_LPCSTR name = GetAdobeCharName(baseEncoding, m_pCharNames, charcode);\n                    if (name == NULL) {\n                        continue;\n                    }\n                    m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);\n                }\n            } else if (FT_UseTTCharmap(m_Font.m_Face, 1, 0)) {\n                for (int charcode = 0; charcode < 256; charcode ++) {\n                    m_Encoding.m_Unicodes[charcode] = FT_UnicodeFromCharCode(FXFT_ENCODING_APPLE_ROMAN, charcode);\n                }\n            }\n            return;\n        }\n    }\n    if (FT_UseTTCharmap(m_Font.m_Face, 1, 0)) {\n        FX_BOOL bGotOne = FALSE;\n        for (int charcode = 0; charcode < 256; charcode ++) {\n            m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, charcode);\n            m_Encoding.m_Unicodes[charcode] = FT_UnicodeFromCharCode(FXFT_ENCODING_APPLE_ROMAN, charcode);\n            if (m_GlyphIndex[charcode]) {\n                bGotOne = TRUE;\n            }\n        }\n        if (m_pFontFile || bGotOne) {\n            return;\n        }\n    }\n    if (FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE) == 0) {\n        FX_BOOL bGotOne = FALSE;\n        const FX_WORD* pUnicodes = PDF_UnicodesForPredefinedCharSet(baseEncoding);\n        for (int charcode = 0; charcode < 256; charcode ++) {\n            if (m_pFontFile == NULL) {\n                FX_LPCSTR name = GetAdobeCharName(0, m_pCharNames, charcode);\n                if (name != NULL) {\n                    m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);\n                } else if (pUnicodes) {\n                    m_Encoding.m_Unicodes[charcode] = pUnicodes[charcode];\n                }\n            } else {\n                m_Encoding.m_Unicodes[charcode] = charcode;\n            }\n            m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, m_Encoding.m_Unicodes[charcode]);\n            if (m_GlyphIndex[charcode]) {\n                bGotOne = TRUE;\n            }\n        }\n        if (bGotOne) {\n            return;\n        }\n    }\n    for (int charcode = 0; charcode < 256; charcode ++) {\n        m_GlyphIndex[charcode] = charcode;\n    }\n}\nCPDF_Type3Font::CPDF_Type3Font()\n{\n    m_pPageResources = NULL;\n    FXSYS_memset32(m_CharWidthL, 0, sizeof m_CharWidthL);\n}\nCPDF_Type3Font::~CPDF_Type3Font()\n{\n    FX_POSITION pos = m_CacheMap.GetStartPosition();\n    while (pos) {\n        FX_LPVOID key, value;\n        m_CacheMap.GetNextAssoc(pos, key, value);\n        delete (CPDF_Type3Char*)value;\n    }\n    m_CacheMap.RemoveAll();\n    pos = m_DeletedMap.GetStartPosition();\n    while (pos) {\n        FX_LPVOID key, value;\n        m_DeletedMap.GetNextAssoc(pos, key, value);\n        delete (CPDF_Type3Char*)key;\n    }\n}\nFX_BOOL CPDF_Type3Font::_Load()\n{\n    m_pFontResources = m_pFontDict->GetDict(FX_BSTRC(\"Resources\"));\n    CPDF_Array* pMatrix = m_pFontDict->GetArray(FX_BSTRC(\"FontMatrix\"));\n    FX_FLOAT xscale = 1.0f, yscale = 1.0f;\n    if (pMatrix) {\n        m_FontMatrix = pMatrix->GetMatrix();\n        xscale = m_FontMatrix.a;\n        yscale = m_FontMatrix.d;\n    }\n    CPDF_Array* pBBox = m_pFontDict->GetArray(FX_BSTRC(\"FontBBox\"));\n    if (pBBox) {\n        m_FontBBox.left = (FX_INT32)(FXSYS_Mul(pBBox->GetNumber(0), xscale) * 1000);\n        m_FontBBox.bottom = (FX_INT32)(FXSYS_Mul(pBBox->GetNumber(1), yscale) * 1000);\n        m_FontBBox.right = (FX_INT32)(FXSYS_Mul(pBBox->GetNumber(2), xscale) * 1000);\n        m_FontBBox.top = (FX_INT32)(FXSYS_Mul(pBBox->GetNumber(3), yscale) * 1000);\n    }\n    int StartChar = m_pFontDict->GetInteger(FX_BSTRC(\"FirstChar\"));\n    CPDF_Array* pWidthArray = m_pFontDict->GetArray(FX_BSTRC(\"Widths\"));\n    if (pWidthArray && (StartChar >= 0 && StartChar < 256)) {\n        FX_DWORD count = pWidthArray->GetCount();\n        if (count > 256) {\n            count = 256;\n        }\n        if (StartChar + count > 256) {\n            count = 256 - StartChar;\n        }\n        for (FX_DWORD i = 0; i < count; i ++) {\n            m_CharWidthL[StartChar + i] = FXSYS_round(FXSYS_Mul(pWidthArray->GetNumber(i), xscale) * 1000);\n        }\n    }\n    m_pCharProcs = m_pFontDict->GetDict(FX_BSTRC(\"CharProcs\"));\n    CPDF_Object* pEncoding = m_pFontDict->GetElementValue(FX_BSTRC(\"Encoding\"));\n    if (pEncoding) {\n        LoadPDFEncoding(pEncoding, m_BaseEncoding, m_pCharNames, FALSE, FALSE);\n        if (m_pCharNames) {\n            for (int i = 0; i < 256; i ++) {\n                m_Encoding.m_Unicodes[i] = PDF_UnicodeFromAdobeName(m_pCharNames[i]);\n                if (m_Encoding.m_Unicodes[i] == 0) {\n                    m_Encoding.m_Unicodes[i] = i;\n                }\n            }\n        }\n    }\n    return TRUE;\n}\nvoid CPDF_Type3Font::CheckType3FontMetrics()\n{\n    CheckFontMetrics();\n}\nCPDF_Type3Char* CPDF_Type3Font::LoadChar(FX_DWORD charcode, int level)\n{\n    if (level >= _FPDF_MAX_TYPE3_FORM_LEVEL_) {\n        return NULL;\n    }\n    CPDF_Type3Char* pChar = NULL;\n    if (m_CacheMap.Lookup((FX_LPVOID)(FX_UINTPTR)charcode, (FX_LPVOID&)pChar)) {\n        if (pChar->m_bPageRequired && m_pPageResources) {\n            delete pChar;\n            m_CacheMap.RemoveKey((FX_LPVOID)(FX_UINTPTR)charcode);\n            return LoadChar(charcode, level + 1);\n        }\n        return pChar;\n    }\n    FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);\n    if (name == NULL) {\n        return NULL;\n    }\n    CPDF_Stream* pStream = (CPDF_Stream*)(m_pCharProcs ? m_pCharProcs->GetElementValue(name) : NULL);\n    if (pStream == NULL || pStream->GetType() != PDFOBJ_STREAM) {\n        return NULL;\n    }\n    pChar = FX_NEW CPDF_Type3Char;\n    pChar->m_pForm = FX_NEW CPDF_Form(m_pDocument, m_pFontResources ? m_pFontResources : m_pPageResources, pStream, NULL);\n    pChar->m_pForm->ParseContent(NULL, NULL, pChar, NULL, level + 1);\n    FX_FLOAT scale = m_FontMatrix.GetXUnit();\n    pChar->m_Width = (FX_INT32)(pChar->m_Width * scale + 0.5f);\n    FX_RECT &rcBBox = pChar->m_BBox;\n    CFX_FloatRect char_rect((FX_FLOAT)rcBBox.left / 1000.0f, (FX_FLOAT)rcBBox.bottom / 1000.0f,\n                            (FX_FLOAT)rcBBox.right / 1000.0f, (FX_FLOAT)rcBBox.top / 1000.0f);\n    if (rcBBox.right <= rcBBox.left || rcBBox.bottom >= rcBBox.top) {\n        char_rect = pChar->m_pForm->CalcBoundingBox();\n    }\n    char_rect.Transform(&m_FontMatrix);\n    rcBBox.left = FXSYS_round(char_rect.left * 1000);\n    rcBBox.right = FXSYS_round(char_rect.right * 1000);\n    rcBBox.top = FXSYS_round(char_rect.top * 1000);\n    rcBBox.bottom = FXSYS_round(char_rect.bottom * 1000);\n    m_CacheMap.SetAt((FX_LPVOID)(FX_UINTPTR)charcode, pChar);\n    if (pChar->m_pForm->CountObjects() == 0) {\n        delete pChar->m_pForm;\n        pChar->m_pForm = NULL;\n    }\n    return pChar;\n}\nint CPDF_Type3Font::GetCharWidthF(FX_DWORD charcode, int level)\n{\n    if (charcode > 0xff) {\n        charcode = 0;\n    }\n    if (m_CharWidthL[charcode]) {\n        return m_CharWidthL[charcode];\n    }\n    CPDF_Type3Char* pChar = LoadChar(charcode, level);\n    if (pChar == NULL) {\n        return 0;\n    }\n    return pChar->m_Width;\n}\nvoid CPDF_Type3Font::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level)\n{\n    CPDF_Type3Char* pChar = LoadChar(charcode, level);\n    if (pChar == NULL) {\n        rect.left = rect.right = rect.top = rect.bottom = 0;\n        return;\n    }\n    rect = pChar->m_BBox;\n}\nCPDF_Type3Char::CPDF_Type3Char()\n{\n    m_pForm = NULL;\n    m_pBitmap = NULL;\n    m_bPageRequired = FALSE;\n    m_bColored = FALSE;\n}\nCPDF_Type3Char::~CPDF_Type3Char()\n{\n    if (m_pForm) {\n        delete m_pForm;\n    }\n    if (m_pBitmap) {\n        delete m_pBitmap;\n    }\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_font/fpdf_font_charset.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_page.h\"\n#include \"../../../include/fxge/fx_freetype.h\"\nextern FX_WCHAR PDF_UnicodeFromAdobeName(const FX_CHAR*);\nconst struct _UnicodeAlt {\n    FX_WORD\tm_Unicode;\n    const FX_CHAR* m_Alter;\n}\nUnicodeAlts[] = {\n    {0x00a0, \" \"}, {0x00a1, \"!\"}, {0x00a2, \"c\"}, {0x00a3, \"P\"}, {0x00a4, \"o\"},\n    {0x00a5, \"Y\"}, {0x00a6, \"|\"}, {0x00a7, \"S\"}, {0x00a9, \"(C)\"}, {0x00aa, \"a\"},\n    {0x00ab, \"<<\"}, {0x00ac, \"-|\"}, {0x00ae, \"(R)\"}, {0x00af, \"-\"},\n    {0x00b0, \"o\"}, {0x00b1, \"+/-\"}, {0x00b2, \"^2\"}, { 0x00b3, \"^3\"},\n    {0x00b4, \"'\"}, {0x00b5, \"u\"}, {0x00b6, \"P\"}, {0x00b7, \".\"},\n    {0x00b9, \"^1\"}, {0x00ba, \"o\"}, {0x00bb, \">>\"}, {0x00bc, \"1/4\"},\n    {0x00bd, \"1/2\"}, {0x00be, \"3/4\"},  {0x00bf, \"?\"}, {0x00c0, \"A\"},\n    {0x00c1, \"A\"}, {0x00c2, \"A\"}, {0x00c3, \"A\"}, {0x00c4, \"A\"},\n    {0x00c5, \"A\"}, {0x00c6, \"AE\"}, {0x00c7, \"C\"}, {0x00c8, \"E\"},\n    {0x00c9, \"E\"}, {0x00ca, \"E\"}, {0x00cb, \"E\"}, {0x00cc, \"I\"},\n    {0x00cd, \"I\"}, {0x00ce, \"I\"}, {0x00cf, \"I\"},\n    {0x00d1, \"N\"}, {0x00d2, \"O\"}, {0x00d3, \"O\"}, {0x00d4, \"O\"},\n    {0x00d5, \"O\"}, {0x00d6, \"O\"}, {0x00d7, \"x\"}, {0x00d8, \"O\"},\n    {0x00d9, \"U\"}, {0x00da, \"U\"}, {0x00db, \"U\"}, {0x00dc, \"U\"},\n    {0x00dd, \"Y\"}, {0x00df, \"S\"}, {0x00e0, \"a\"},\n    {0x00e1, \"a\"}, {0x00e2, \"a\"}, {0x00e3, \"a\"}, {0x00e4, \"a\"},\n    {0x00e5, \"a\"}, {0x00e6, \"ae\"}, {0x00e7, \"c\"}, {0x00e8, \"e\"},\n    {0x00e9, \"e\"}, {0x00ea, \"e\"}, {0x00eb, \"e\"}, {0x00ec, \"i\"},\n    {0x00ed, \"i\"}, {0x00ee, \"i\"}, {0x00ef, \"i\"},\n    {0x00f1, \"n\"}, {0x00f2, \"o\"}, {0x00f3, \"o\"}, {0x00f4, \"o\"},\n    {0x00f5, \"o\"}, {0x00f6, \"o\"}, {0x00f7, \"/\"}, {0x00f8, \"o\"},\n    {0x00f9, \"u\"}, {0x00fa, \"u\"}, {0x00fb, \"u\"}, {0x00fc, \"u\"},\n    {0x00fd, \"y\"}, {0x00ff, \"y\"},\n    {0x02b0, \"h\"}, {0x02b2, \"j\"}, {0x02b3, \"r\"}, {0x02b7, \"w\"},\n    {0x02b8, \"y\"}, {0x02b9, \"'\"}, {0x02ba, \"\\\"\"}, {0x02bb, \"'\"},\n    {0x02bc, \"'\"}, {0x02bd, \"'\"}, {0x02be, \"'\"}, {0x02bf, \"'\"},\n    {0x02c2, \"<\"}, {0x02c3, \">\"}, {0x02c4, \"^\"}, {0x02c5, \"v\"},\n    {0x02c6, \"^\"}, {0x02c7, \"v\"}, {0x02c8, \"'\"}, {0x02c9, \"-\"},\n    {0x02ca, \"'\"}, {0x02cb, \"'\"}, {0x02cc, \".\"}, {0x02cd, \"_\"},\n    {0x2010, \"-\"}, {0x2012, \"-\"}, {0x2013, \"-\"}, {0x2014, \"--\"},\n    {0x2015, \"--\"}, {0x2016, \"|\"}, {0x2017, \"_\"},\n    {0x2018, \"'\"}, {0x2019, \"'\"}, {0x201a, \",\"}, {0x201b, \"'\"},\n    {0x201c, \"\\\"\"}, {0x201d, \"\\\"\"}, {0x201e, \",\"}, {0x201f, \"'\"},\n    {0x2020, \"+\"}, {0x2021, \"+\"}, {0x2022, \"*\"}, {0x2023, \">\"},\n    {0x2024, \".\"}, {0x2025, \"..\"}, {0x2027, \".\"}, {0x2032, \"'\"},\n    {0x2033, \"\\\"\"}, {0x2035, \"'\"}, {0x2036, \"\\\"\"}, {0x2038, \"^\"},\n    {0x2039, \"<\"}, {0x203a, \">\"}, {0x203b, \"*\"}, {0x203c, \"!!\"},\n    {0x203d, \"?!\"}, {0x203e, \"-\"}, {0x2044, \"/\"}, {0x2047, \"??\"},\n    {0x2048, \"?!\"}, {0x2049, \"!?\"}, {0x204e, \"*\"}, {0x2052, \"%\"},\n    {0x2122, \"(TM)\"},\n    {0x2212, \"-\"}, {0x2215, \"/\"}, {0x2216, \"\\\\\"}, {0x2217, \"*\"},\n    {0x2218, \"*\"}, {0x2219, \"*\"}, {0x2223, \"|\"}, {0x22c5, \".\"},\n    {0x266f, \"#\"},\n    {0XF6D9, \"(C)\"}, {0XF6DA, \"(C)\"}, {0XF6DB, \"(TM)\"},\n    {0XF8E8, \"(C)\"}, {0xf8e9, \"(C)\"}, {0XF8EA, \"(TM)\"},\n\n    {0xfb01, \"fi\"}, {0xfb02, \"fl\"}\n};\nconst FX_CHAR* FCS_GetAltStr(FX_WCHAR unicode)\n{\n    int begin = 0;\n    int end = sizeof UnicodeAlts / sizeof(struct _UnicodeAlt) - 1;\n    while (begin <= end) {\n        int middle = (begin + end) / 2;\n        FX_WORD middlecode = UnicodeAlts[middle].m_Unicode;\n        if (middlecode > unicode) {\n            end = middle - 1;\n        } else if (middlecode < unicode) {\n            begin = middle + 1;\n        } else {\n            return UnicodeAlts[middle].m_Alter;\n        }\n    }\n    return NULL;\n}\nconst FX_WORD StandardEncoding[256] = {\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019,\n    0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031,\n    0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b,\n    0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045,\n    0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,\n    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,\n    0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x2018, 0x0061, 0x0062, 0x0063,\n    0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d,\n    0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,\n    0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x00a1, 0x00a2, 0x00a3, 0x2044, 0x00a5, 0x0192, 0x00a7, 0x00a4, 0x0027,\n    0x201c, 0x00ab, 0x2039, 0x203a, 0xfb01, 0xfb02, 0x0000, 0x2013, 0x2020, 0x2021,\n    0x00b7, 0x0000, 0x00b6, 0x2022, 0x201a, 0x201e, 0x201d, 0x00bb, 0x2026, 0x2030,\n    0x0000, 0x00bf, 0x0000, 0x0060, 0x00b4, 0x02c6, 0x02dc, 0x00af, 0x02d8, 0x02d9,\n    0x00a8, 0x0000, 0x02da, 0x00b8, 0x0000, 0x02dd, 0x02db, 0x02c7, 0x2014, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00c6, 0x0000, 0x00aa, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0141, 0x00d8, 0x0152, 0x00ba, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x00e6, 0x0000, 0x0000, 0x0000, 0x0131, 0x0000, 0x0000, 0x0142, 0x00f8,\n    0x0153, 0x00df, 0x0000, 0x0000, 0x0000, 0x0000\n};\nconst FX_WORD MacRomanEncoding[256] = {\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,\n    0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031,\n    0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b,\n    0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045,\n    0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,\n    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,\n    0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063,\n    0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d,\n    0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,\n    0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000, 0x00c4, 0x00c5,\n    0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, 0x00e0, 0x00e2, 0x00e4, 0x00e3,\n    0x00e5, 0x00e7, 0x00e9, 0x00e8, 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef,\n    0x00f1, 0x00f3, 0x00f2, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc,\n    0x2020, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, 0x00ae, 0x00a9,\n    0x2122, 0x00b4, 0x00a8, 0x0000, 0x00c6, 0x00d8, 0x0000, 0x00b1, 0x0000, 0x0000,\n    0x00a5, 0x00b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00aa, 0x00ba, 0x0000,\n    0x00e6, 0x00f8, 0x00bf, 0x00a3, 0x00ac, 0x0000, 0x0192, 0x0000, 0x0000, 0x00ab,\n    0x00bb, 0x2026, 0x0020, 0x00c0, 0x00c3, 0x00d5, 0x0152, 0x0153, 0x2013, 0x2014,\n    0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x0000, 0x00ff, 0x0178, 0x2044, 0x00a4,\n    0x2039, 0x203a, 0xfb01, 0xfb02, 0x2021, 0x00b7, 0x201a, 0x201e, 0x2030, 0x00c2,\n    0x00ca, 0x00c1, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00d3, 0x00d4,\n    0x0000, 0x00d2, 0x00da, 0x00db, 0x00d9, 0x0131, 0x02c6, 0x02dc, 0x00af, 0x02d8,\n    0x02d9, 0x02da, 0x00b8, 0x02dd, 0x02db, 0x02c7\n};\nconst FX_WORD AdobeWinAnsiEncoding[256] = {\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,\n    0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,\n    0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,\n    0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,\n    0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,\n    0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,\n    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,\n    0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,\n    0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,\n    0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,\n    0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,\n    0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2022,\n    0x20ac, 0x2022, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021,\n    0x02c6, 0x2030, 0x0160, 0x2039,\t0x0152, 0x2022, 0x017d, 0x2022,\n    0x2022, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,\n    0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x2022, 0x017e, 0x0178,\n    0x0020, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,\n    0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x002d, 0x00ae, 0x00af,\n    0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,\n    0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,\n    0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,\n    0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,\n    0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,\n    0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,\n    0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,\n    0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,\n    0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,\n    0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff\n};\nextern const FX_WORD PDFDocEncoding[256];\nconst FX_WORD MacExpertEncoding[256] = {\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0020, 0xf721, 0xf6f8, 0xf7a2, 0xf724, 0xf6e4, 0xf726, 0xf7b4,\n    0x207d, 0x207e, 0x2025, 0x2024, 0x002c, 0x002d, 0x002e, 0x2044, 0xf730, 0xf731,\n    0xf732, 0xf733, 0xf734, 0xf735, 0xf736, 0xf737, 0xf738, 0xf739, 0x003a, 0x003b,\n    0x0000, 0xf6de, 0x0000, 0xf73f, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7f0, 0x0000,\n    0x0000, 0x00bc, 0x00bd, 0x00be, 0x215b, 0x215c, 0x215d, 0x215e, 0x2153, 0x2154,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb00, 0xfb01, 0xfb02, 0xfb03,\n    0xfb04, 0x208d, 0x0000, 0x208e, 0xf6f6, 0xf6e5, 0xf760, 0xf761, 0xf762, 0xf763,\n    0xf764, 0xf765, 0xf766, 0xf767, 0xf768, 0xf769, 0xf76a, 0xf76b, 0xf76c, 0xf76d,\n    0xf76e, 0xf76f, 0xf770, 0xf771, 0xf772, 0xf773, 0xf774, 0xf775, 0xf776, 0xf777,\n    0xf778, 0xf779, 0xf77a, 0x20a1, 0xf6dc, 0xf6dd, 0xf6fe, 0x0000, 0x0000, 0xf6e9,\n    0xf6e0, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7e1, 0xf7e0, 0xf7e2, 0xf7e4, 0xf7e3,\n    0xf7e5, 0xf7e7, 0xf7e9, 0xf7e8, 0xf7ea, 0xf7eb, 0xf7ed, 0xf7ec, 0xf7ee, 0xf7ef,\n    0xf7f1, 0xf7f3, 0xf7f2, 0xf7f4, 0xf7f6, 0xf7f5, 0xf7fa, 0xf7f9, 0xf7fb, 0xf7fc,\n    0x0000, 0x2078, 0x2084, 0x2083, 0x2086, 0x2088, 0x2087, 0xf6fd, 0x0000, 0xf6df,\n    0x2082, 0x0000, 0xf7a8, 0x0000, 0xf6f5, 0xf6fd, 0x2085, 0x0000, 0xf6e1, 0xf6e7,\n    0xf7fd, 0x0000, 0xf6e3, 0x0000, 0x0000, 0xf7fe, 0x0000, 0x2089, 0x2080, 0xf6ff,\n    0xf7e6, 0xf7f8, 0xf7bf, 0x2081, 0xf6e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0xf7b8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6fa, 0x2012, 0xf6e6,\n    0x0000, 0x0000, 0x0000, 0x0000, 0xf7a1, 0x0000, 0xf7ff, 0x0000, 0x00b9, 0x00b2,\n    0x00b3, 0x2074, 0x2075, 0x2076, 0x2077, 0x2079, 0x2070, 0x0000, 0xf6ec, 0xf6f1,\n    0x0000, 0x0000, 0x0000, 0xf6ed, 0xf6f2, 0xf6eb, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0xf6ee, 0xf6fb, 0xf6f4, 0xf7af, 0xf6ea, 0x207f, 0xf6ef, 0xf6e2, 0xf6e8,\n    0xf6f7, 0xf6fc, 0x0000, 0x0000, 0x0000, 0x0000\n};\nconst FX_WORD AdobeSymbolEncoding[256] = {\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0020, 0x0021, 0x2200, 0x0023, 0x2203, 0x0025, 0x0026, 0x220B,\n    0x0028, 0x0029, 0x2217, 0x002B, 0x002C, 0x2212, 0x002E, 0x002F,\n    0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,\n    0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,\n    0x2245, 0x0391, 0x0392, 0x03A7, 0x0394, 0x0395, 0x03A6, 0x0393,\n    0x0397, 0x0399, 0x03D1, 0x039A, 0x039B, 0x039C, 0x039D, 0x039F,\n    0x03A0, 0x0398, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03C2, 0x03A9,\n    0x039E, 0x03A8, 0x0396, 0x005B, 0x2234, 0x005D, 0x22A5, 0x005F,\n    0xF8E5, 0x03B1, 0x03B2, 0x03C7, 0x03B4, 0x03B5, 0x03C6, 0x03B3,\n    0x03B7, 0x03B9, 0x03D5, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BF,\n    0x03C0, 0x03B8, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03D6, 0x03C9,\n    0x03BE, 0x03C8, 0x03B6, 0x007B, 0x007C, 0x007D, 0x223C, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x20AC, 0x03D2, 0x2032, 0x2264, 0x2044, 0x221E, 0x0192, 0x2663,\n    0x2666, 0x2665, 0x2660, 0x2194, 0x2190, 0x2191, 0x2192, 0x2193,\n    0x00B0, 0x00B1, 0x2033, 0x2265, 0x00D7, 0x221D, 0x2202, 0x2022,\n    0x00F7, 0x2260, 0x2261, 0x2248, 0x2026, 0xF8E6, 0xF8E7, 0x21B5,\n    0x2135, 0x2111, 0x211C, 0x2118, 0x2297, 0x2295, 0x2205, 0x2229,\n    0x222A, 0x2283, 0x2287, 0x2284, 0x2282, 0x2286, 0x2208, 0x2209,\n    0x2220, 0x2207, 0xF6DA, 0xF6D9, 0xF6DB, 0x220F, 0x221A, 0x22C5,\n    0x00AC, 0x2227, 0x2228, 0x21D4, 0x21D0, 0x21D1, 0x21D2, 0x21D3,\n    0x25CA, 0x2329, 0xF8E8, 0xF8E9, 0xF8EA, 0x2211, 0xF8EB, 0xF8EC,\n    0xF8ED, 0xF8EE, 0xF8EF, 0xF8F0, 0xF8F1, 0xF8F2, 0xF8F3, 0xF8F4,\n    0x0000, 0x232A, 0x222B, 0x2320, 0xF8F5, 0x2321, 0xF8F6, 0xF8F7,\n    0xF8F8, 0xF8F9, 0xF8FA, 0xF8FB, 0xF8FC, 0xF8FD, 0xF8FE, 0x0000,\n};\nconst FX_WORD ZapfEncoding[256] = {\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0020, 0x2701, 0x2702, 0x2703, 0x2704, 0x260E, 0x2706, 0x2707,\n    0x2708, 0x2709, 0x261B, 0x261E, 0x270C, 0x270D, 0x270E, 0x270F,\n    0x2710, 0x2711, 0x2712, 0x2713, 0x2714, 0x2715, 0x2716, 0x2717,\n    0x2718, 0x2719, 0x271A, 0x271B, 0x271C, 0x271D, 0x271E, 0x271F,\n    0x2720, 0x2721, 0x2722, 0x2723, 0x2724, 0x2725, 0x2726, 0x2727,\n    0x2605, 0x2729, 0x272A, 0x272B, 0x272C, 0x272D, 0x272E, 0x272F,\n    0x2730, 0x2731, 0x2732, 0x2733, 0x2734, 0x2735, 0x2736, 0x2737,\n    0x2738, 0x2739, 0x273A, 0x273B, 0x273C, 0x273D, 0x273E, 0x273F,\n    0x2740, 0x2741, 0x2742, 0x2743, 0x2744, 0x2745, 0x2746, 0x2747,\n    0x2748, 0x2749, 0x274A, 0x274B, 0x25CF, 0x274D, 0x25A0, 0x274F,\n    0x2750, 0x2751, 0x2752, 0x25B2, 0x25BC, 0x25C6, 0x2756, 0x25D7,\n    0x2758, 0x2759, 0x275A, 0x275B, 0x275C, 0x275D, 0x275E, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x2761, 0x2762, 0x2763, 0x2764, 0x2765, 0x2766, 0x2767,\n    0x2663, 0x2666, 0x2665, 0x2660, 0x2460, 0x2461, 0x2462, 0x2463,\n    0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x2776, 0x2777,\n    0x2778, 0x2779, 0x277A, 0x277B, 0x277C, 0x277D, 0x277E, 0x277F,\n    0x2780, 0x2781, 0x2782, 0x2783, 0x2784, 0x2785, 0x2786, 0x2787,\n    0x2788, 0x2789, 0x278A, 0x278B, 0x278C, 0x278D, 0x278E, 0x278F,\n    0x2790, 0x2791, 0x2792, 0x2793, 0x2794, 0x2192, 0x2194, 0x2195,\n    0x2798, 0x2799, 0x279A, 0x279B, 0x279C, 0x279D, 0x279E, 0x279F,\n    0x27A0, 0x27A1, 0x27A2, 0x27A3, 0x27A4, 0x27A5, 0x27A6, 0x27A7,\n    0x27A8, 0x27A9, 0x27AA, 0x27AB, 0x27AC, 0x27AD, 0x27AE, 0x27AF,\n    0x0000, 0x27B1, 0x27B2, 0x27B3, 0x27B4, 0x27B5, 0x27B6, 0x27B7,\n    0x27B8, 0x27B9, 0x27BA, 0x27BB, 0x27BC, 0x27BD, 0x27BE, 0x0000,\n};\nconst FX_LPCSTR StandardEncodingNames[224] = {\n    \"space\", \"exclam\", \"quotedbl\", \"numbersign\", \"dollar\", \"percent\", \"ampersand\", \"quoteright\",\n    \"parenleft\", \"parenright\", \"asterisk\", \"plus\", \"comma\", \"hyphen\", \"period\", \"slash\",\n    \"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\",\n    \"eight\", \"nine\", \"colon\", \"semicolon\", \"less\", \"equal\", \"greater\", \"question\",\n    \"at\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\",\n    \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\",\n    \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\",\n    \"X\", \"Y\", \"Z\", \"bracketleft\", \"backslash\", \"bracketright\", \"asciicircum\", \"underscore\",\n    \"quoteleft\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\",\n    \"h\", \"i\", \"j\", \"k\", \"l\", \"m\", \"n\", \"o\",\n    \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\", \"w\",\n    \"x\", \"y\", \"z\", \"braceleft\", \"bar\", \"braceright\", \"asciitilde\", NULL,\n    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n    NULL, \"exclamdown\", \"cent\", \"sterling\", \"fraction\", \"yen\", \"florin\", \"section\",\n    \"currency\", \"quotesingle\", \"quotedblleft\", \"guillemotleft\", \"guilsinglleft\", \"guilsinglright\", \"fi\", \"fl\",\n    NULL, \"endash\", \"dagger\", \"daggerdbl\", \"periodcentered\", NULL, \"paragraph\", \"bullet\",\n    \"quotesinglbase\", \"quotedblbase\", \"quotedblright\", \"guillemotright\", \"ellipsis\", \"perthousand\", NULL, \"questiondown\",\n    NULL, \"grave\", \"acute\", \"circumflex\", \"tilde\", \"macron\", \"breve\", \"dotaccent\",\n    \"dieresis\", NULL, \"ring\", \"cedilla\", NULL, \"hungarumlaut\", \"ogonek\", \"caron\",\n    \"emdash\", NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n    NULL, \"AE\", NULL, \"ordfeminine\", NULL, NULL, NULL, NULL,\n    \"Lslash\", \"Oslash\", \"OE\", \"ordmasculine\", NULL, NULL, NULL, NULL,\n    NULL, \"ae\", NULL, NULL, NULL, \"dotlessi\", NULL, NULL,\n    \"lslash\", \"oslash\", \"oe\", \"germandbls\", NULL, NULL, NULL, NULL,\n};\nconst FX_LPCSTR AdobeWinAnsiEncodingNames[224] = {\n    \"space\", \"exclam\", \"quotedbl\", \"numbersign\", \"dollar\", \"percent\", \"ampersand\", \"quotesingle\",\n    \"parenleft\", \"parenright\", \"asterisk\", \"plus\", \"comma\", \"hyphen\", \"period\", \"slash\",\n    \"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\",\n    \"eight\", \"nine\", \"colon\", \"semicolon\", \"less\", \"equal\", \"greater\", \"question\",\n    \"at\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\",\n    \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\",\n    \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\",\n    \"X\", \"Y\", \"Z\", \"bracketleft\", \"backslash\", \"bracketright\", \"asciicircum\", \"underscore\",\n    \"grave\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\",\n    \"h\", \"i\", \"j\", \"k\", \"l\", \"m\", \"n\", \"o\",\n    \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\", \"w\",\n    \"x\", \"y\", \"z\", \"braceleft\", \"bar\", \"braceright\", \"asciitilde\", \"bullet\",\n    \"Euro\", \"bullet\", \"quotesinglbase\", \"florin\", \"quotedblbase\", \"ellipsis\", \"dagger\", \"daggerdbl\",\n    \"circumflex\", \"perthousand\", \"Scaron\", \"guilsinglleft\", \"OE\", \"bullet\", \"Zcaron\", \"bullet\",\n    \"bullet\", \"quoteleft\", \"quoteright\", \"quotedblleft\", \"quotedblright\", \"bullet\", \"endash\", \"emdash\",\n    \"tilde\", \"trademark\", \"scaron\", \"guilsinglright\", \"oe\", \"bullet\", \"zcaron\", \"Ydieresis\",\n    \"space\", \"exclamdown\", \"cent\", \"sterling\", \"currency\", \"yen\", \"brokenbar\", \"section\",\n    \"dieresis\", \"copyright\", \"ordfeminine\", \"guillemotleft\", \"logicalnot\", \"hyphen\", \"registered\", \"macron\",\n    \"degree\", \"plusminus\", \"twosuperior\", \"threesuperior\", \"acute\", \"mu\", \"paragraph\", \"periodcentered\",\n    \"cedilla\", \"onesuperior\", \"ordmasculine\", \"guillemotright\", \"onequarter\", \"onehalf\", \"threequarters\", \"questiondown\",\n    \"Agrave\", \"Aacute\", \"Acircumflex\", \"Atilde\", \"Adieresis\", \"Aring\", \"AE\", \"Ccedilla\",\n    \"Egrave\", \"Eacute\", \"Ecircumflex\", \"Edieresis\", \"Igrave\", \"Iacute\", \"Icircumflex\", \"Idieresis\",\n    \"Eth\", \"Ntilde\", \"Ograve\", \"Oacute\", \"Ocircumflex\", \"Otilde\", \"Odieresis\", \"multiply\",\n    \"Oslash\", \"Ugrave\", \"Uacute\", \"Ucircumflex\", \"Udieresis\", \"Yacute\", \"Thorn\", \"germandbls\",\n    \"agrave\", \"aacute\", \"acircumflex\", \"atilde\", \"adieresis\", \"aring\", \"ae\", \"ccedilla\",\n    \"egrave\", \"eacute\", \"ecircumflex\", \"edieresis\", \"igrave\", \"iacute\", \"icircumflex\", \"idieresis\",\n    \"eth\", \"ntilde\", \"ograve\", \"oacute\", \"ocircumflex\", \"otilde\", \"odieresis\", \"divide\",\n    \"oslash\", \"ugrave\", \"uacute\", \"ucircumflex\", \"udieresis\", \"yacute\", \"thorn\", \"ydieresis\",\n};\nconst FX_LPCSTR  MacRomanEncodingNames[224] = {\n    \"space\", \"exclam\", \"quotedbl\", \"numbersign\", \"dollar\", \"percent\", \"ampersand\", \"quotesingle\",\n    \"parenleft\", \"parenright\", \"asterisk\", \"plus\", \"comma\", \"hyphen\", \"period\", \"slash\",\n    \"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\",\n    \"eight\", \"nine\", \"colon\", \"semicolon\", \"less\", \"equal\", \"greater\", \"question\",\n    \"at\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\",\n    \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\",\n    \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\",\n    \"X\", \"Y\", \"Z\", \"bracketleft\", \"backslash\", \"bracketright\", \"asciicircum\", \"underscore\",\n    \"grave\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\",\n    \"h\", \"i\", \"j\", \"k\", \"l\", \"m\", \"n\", \"o\",\n    \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\", \"w\",\n    \"x\", \"y\", \"z\", \"braceleft\", \"bar\", \"braceright\", \"asciitilde\", NULL,\n    \"Adieresis\", \"Aring\", \"Ccedilla\", \"Eacute\", \"Ntilde\", \"Odieresis\", \"Udieresis\", \"aacute\",\n    \"agrave\", \"acircumflex\", \"adieresis\", \"atilde\", \"aring\", \"ccedilla\", \"eacute\", \"egrave\",\n    \"ecircumflex\", \"edieresis\", \"iacute\", \"igrave\", \"icircumflex\", \"idieresis\", \"ntilde\", \"oacute\",\n    \"ograve\", \"ocircumflex\", \"odieresis\", \"otilde\", \"uacute\", \"ugrave\", \"ucircumflex\", \"udieresis\",\n    \"dagger\", \"degree\", \"cent\", \"sterling\", \"section\", \"bullet\", \"paragraph\", \"germandbls\",\n    \"registered\", \"copyright\", \"trademark\", \"acute\", \"dieresis\", \"notequal\", \"AE\", \"Oslash\",\n    \"infinity\", \"plusminus\", \"lessequal\", \"greaterequal\", \"yen\", \"mu\", \"partialdiff\", \"summation\",\n    \"product\", \"pi\", \"integral\", \"ordfeminine\", \"ordmasculine\", \"Omega\", \"ae\", \"oslash\",\n    \"questiondown\", \"exclamdown\", \"logicalnot\", \"radical\", \"florin\", \"approxequal\", \"Delta\", \"guillemotleft\",\n    \"guillemotright\", \"ellipsis\", \"space\", \"Agrave\", \"Atilde\", \"Otilde\", \"OE\", \"oe\",\n    \"endash\", \"emdash\", \"quotedblleft\", \"quotedblright\", \"quoteleft\", \"quoteright\", \"divide\", \"lozenge\",\n    \"ydieresis\", \"Ydieresis\", \"fraction\", \"currency\", \"guilsinglleft\", \"guilsinglright\", \"fi\", \"fl\",\n    \"daggerdbl\", \"periodcentered\", \"quotesinglbase\", \"quotedblbase\", \"perthousand\", \"Acircumflex\", \"Ecircumflex\", \"Aacute\",\n    \"Edieresis\", \"Egrave\", \"Iacute\", \"Icircumflex\", \"Idieresis\", \"Igrave\", \"Oacute\", \"Ocircumflex\",\n    \"apple\", \"Ograve\", \"Uacute\", \"Ucircumflex\", \"Ugrave\", \"dotlessi\", \"circumflex\", \"tilde\",\n    \"macron\", \"breve\", \"dotaccent\", \"ring\", \"cedilla\", \"hungarumlaut\", \"ogonek\", \"caron\",\n};\nconst FX_LPCSTR  MacExpertEncodingNames[224] = {\n    \"space\", \"exclamsmall\", \"Hungarumlautsmall\", \"centoldstyle\", \"dollaroldstyle\", \"dollarsuperior\", \"ampersandsmall\", \"Acutesmall\",\n    \"parenleftsuperior\", \"parenrightsuperior\", \"twodotenleader\", \"onedotenleader\", \"comma\", \"hyphen\", \"period\", \"fraction\",\n    \"zerooldstyle\", \"oneoldstyle\", \"twooldstyle\", \"threeoldstyle\", \"fouroldstyle\", \"fiveoldstyle\", \"sixoldstyle\", \"sevenoldstyle\",\n    \"eightoldstyle\", \"nineoldstyle\", \"colon\", \"semicolon\", NULL, \"threequartersemdash\", NULL, \"questionsmall\",\n    NULL, NULL, NULL, NULL, \"Ethsmall\", NULL, NULL, \"onequarter\",\n    \"onehalf\", \"threequarters\", \"oneeighth\", \"threeeighths\", \"fiveeighths\", \"seveneighths\", \"onethird\", \"twothirds\",\n    NULL, NULL, NULL, NULL, NULL, NULL, \"ff\", \"fi\",\n    \"fl\", \"ffi\", \"ffl\", \"parenleftinferior\", NULL, \"parenrightinferior\", \"Circumflexsmall\", \"hypheninferior\",\n    \"Gravesmall\", \"Asmall\", \"Bsmall\", \"Csmall\", \"Dsmall\", \"Esmall\", \"Fsmall\", \"Gsmall\",\n    \"Hsmall\", \"Ismall\", \"Jsmall\", \"Ksmall\", \"Lsmall\", \"Msmall\", \"Nsmall\", \"Osmall\",\n    \"Psmall\", \"Qsmall\", \"Rsmall\", \"Ssmall\", \"Tsmall\", \"Usmall\", \"Vsmall\", \"Wsmall\",\n    \"Xsmall\", \"Ysmall\", \"Zsmall\", \"colonmonetary\", \"onefitted\", \"rupiah\", \"Tildesmall\", NULL,\n    NULL, \"asuperior\", \"centsuperior\", NULL, NULL, NULL, NULL, \"Aacutesmall\",\n    \"Agravesmall\", \"Acircumflexsmall\", \"Adieresissmall\", \"Atildesmall\", \"Aringsmall\", \"Ccedillasmall\", \"Eacutesmall\", \"Egravesmall\",\n    \"Ecircumflexsmall\", \"Edieresissmall\", \"Iacutesmall\", \"Igravesmall\", \"Icircumflexsmall\", \"Idieresissmall\", \"Ntildesmall\", \"Oacutesmall\",\n    \"Ogravesmall\", \"Ocircumflexsmall\", \"Odieresissmall\", \"Otildesmall\", \"Uacutesmall\", \"Ugravesmall\", \"Ucircumflexsmall\", \"Udieresissmall\",\n    NULL, \"eightsuperior\", \"fourinferior\", \"threeinferior\", \"sixinferior\", \"eightinferior\", \"seveninferior\", \"Scaronsmall\",\n    NULL, \"centinferior\", \"twoinferior\", NULL, \"Dieresissmall\", NULL, \"Caronsmall\", \"Scaronsmall\",\n    \"fiveinferior\", NULL, \"commainferior\", \"periodinferior\", \"Yacutesmall\", NULL, \"dollarinferior\", NULL,\n    NULL, \"Thornsmall\", NULL, \"nineinferior\", \"zeroinferior\", \"Zcaronsmall\", \"AEsmall\", \"Oslashsmall\",\n    \"questiondownsmall\", \"oneinferior\", \"asuperior\", NULL, NULL, NULL, NULL, NULL,\n    NULL, \"Cedillasmall\", NULL, NULL, NULL, NULL, NULL, \"OEsmall\",\n    \"figuredash\", \"hyphensuperior\", NULL, NULL, NULL, NULL, \"exclamdownsmall\", NULL,\n    \"Ydieresissmall\", NULL, \"onesuperior\", \"twosuperior\", \"threesuperior\", \"foursuperior\", \"fivesuperior\", \"sixsuperior\",\n    \"sevensuperior\", \"ninesuperior\", \"zerosuperior\", NULL, \"esuperior\", \"rsuperior\", NULL, NULL,\n    NULL, \"isuperior\", \"ssuperior\", \"dsuperior\", NULL, NULL, NULL, NULL,\n    NULL, \"lsuperior\", \"Ogoneksmall\", \"Brevesmall\", \"Macronsmall\", \"bsuperior\", \"nsuperior\", \"msuperior\",\n    \"commasuperior\", \"periodsuperior\", \"Dotaccentsmall\", \"Ringsmall\", NULL, NULL, NULL, NULL,\n};\nconst FX_LPCSTR  PDFDocEncodingNames[232] = {\n    \"breve\", \"caron\", \"circumflex\", \"dotaccent\", \"hungarumlaut\", \"ogonek\", \"ring\", \"tilde\",\n    \"space\", \"exclam\", \"quotedbl\", \"numbersign\", \"dollar\", \"percent\", \"ampersand\", \"quotesingle\",\n    \"parenleft\", \"parenright\", \"asterisk\", \"plus\", \"comma\", \"hyphen\", \"period\", \"slash\",\n    \"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\",\n    \"eight\", \"nine\", \"colon\", \"semicolon\", \"less\", \"equal\", \"greater\", \"question\",\n    \"at\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\",\n    \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\",\n    \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\",\n    \"X\", \"Y\", \"Z\", \"bracketleft\", \"backslash\", \"bracketright\", \"asciicircum\", \"underscore\",\n    \"grave\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\",\n    \"h\", \"i\", \"j\", \"k\", \"l\", \"m\", \"n\", \"o\",\n    \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\", \"w\",\n    \"x\", \"y\", \"z\", \"braceleft\", \"bar\", \"braceright\", \"asciitilde\", NULL,\n    \"bullet3\", \"dagger\", \"daggerdbl\", \"ellipsis\", \"emdash\", \"endash\", \"florin\", \"fraction\",\n    \"guilsinglleft\", \"guilsinglright\", \"minus\", \"perthousand\", \"quotedblbase\", \"quotedblleft\", \"quotedblright\", \"quoteleft\",\n    \"quoteright\", \"quotesinglbase\", \"trademark\", \"fi\", \"fl\", \"Lslash\", \"OE\", \"Scaron\",\n    \"Ydieresis\", \"Zcaron2\", \"dotlessi\", \"lslash\", \"oe\", \"scaron\", \"zcaron2\", NULL,\n    \"Euro\", \"exclamdown\", \"cent\", \"sterling\", \"currency\", \"yen\", \"brokenbar\", \"section\",\n    \"dieresis\", \"copyright\", \"ordfeminine\", \"guillemotleft4\", \"logicalnot\", NULL, \"registered\", \"macron\",\n    \"degree\", \"plusminus\", \"twosuperior\", \"threesuperior\", \"acute\", \"mu\", \"paragraph\", \"periodcentered\",\n    \"cedilla\", \"onesuperior\", \"ordmasculine\", \"guillemotright4\", \"onequarter\", \"onehalf\", \"threequarters\", \"questiondown\",\n    \"Agrave\", \"Aacute\", \"Acircumflex\", \"Atilde\", \"Adieresis\", \"Aring\", \"AE\", \"Ccedilla\",\n    \"Egrave\", \"Eacute\", \"Ecircumflex\", \"Edieresis\", \"Igrave\", \"Iacute\", \"Icircumflex\", \"Idieresis\",\n    \"Eth\", \"Ntilde\", \"Ograve\", \"Oacute\", \"Ocircumflex\", \"Otilde\", \"Odieresis\", \"multiply\",\n    \"Oslash\", \"Ugrave\", \"Uacute\", \"Ucircumflex\", \"Udieresis\", \"Yacute\", \"Thorn\", \"germandbls\",\n    \"agrave\", \"aacute\", \"acircumflex\", \"atilde\", \"adieresis\", \"aring\", \"ae\", \"ccedilla\",\n    \"egrave\", \"eacute\", \"ecircumflex\", \"edieresis\", \"igrave\", \"iacute\", \"icircumflex\", \"idieresis\",\n    \"eth\", \"ntilde\", \"ograve\", \"oacute\", \"ocircumflex\", \"otilde\", \"odieresis\", \"divide\",\n    \"oslash\", \"ugrave\", \"uacute\", \"ucircumflex\", \"udieresis\", \"yacute\", \"thorn\", \"ydieresis\",\n};\nconst FX_LPCSTR  AdobeSymbolEncodingNames[224] = {\n    \"space\", \"exclam\", \"universal\", \"numbersign\", \"existential\", \"percent\", \"ampersand\", \"suchthat\",\n    \"parenleft\", \"parenright\", \"asteriskmath\", \"plus\", \"comma\", \"minus\", \"period\", \"slash\",\n    \"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\",\n    \"eight\", \"nine\", \"colon\", \"semicolon\", \"less\", \"equal\", \"greater\", \"question\",\n    \"congruent\", \"Alpha\", \"Beta\", \"Chi\", \"Delta\", \"Epsilon\", \"Phi\", \"Gamma\",\n    \"Eta\", \"Iota\", \"theta1\", \"Kappa\", \"Lambda\", \"Mu\", \"Nu\", \"Omicron\",\n    \"Pi\", \"Theta\", \"Rho\", \"Sigma\", \"Tau\", \"Upsilon\", \"sigma1\", \"Omega\",\n    \"Xi\", \"Psi\", \"Zeta\", \"bracketleft\", \"therefore\", \"bracketright\", \"perpendicular\", \"underscore\",\n    \"radicalex\", \"alpha\", \"beta\", \"chi\", \"delta\", \"epsilon\", \"phi\", \"gamma\",\n    \"eta\", \"iota\", \"phi1\", \"kappa\", \"lambda\", \"mu\", \"nu\", \"omicron\",\n    \"pi\", \"theta\", \"rho\", \"sigma\", \"tau\", \"upsilon\", \"omega1\", \"omega\",\n    \"xi\", \"psi\", \"zeta\", \"braceleft\", \"bar\", \"braceright\", \"similar\", NULL,\n    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n    \"Euro\", \"Upsilon1\", \"minute\", \"lessequal\", \"fraction\", \"infinity\", \"florin\", \"club\",\n    \"diamond\", \"heart\", \"spade\", \"arrowboth\", \"arrowleft\", \"arrowup\", \"arrowright\", \"arrowdown\",\n    \"degree\", \"plusminus\", \"second\", \"greaterequal\", \"multiply\", \"proportional\", \"partialdiff\", \"bullet\",\n    \"divide\", \"notequal\", \"equivalence\", \"approxequal\", \"ellipsis\", \"arrowvertex\", \"arrowhorizex\", \"carriagereturn\",\n    \"aleph\", \"Ifraktur\", \"Rfraktur\", \"weierstrass\", \"circlemultiply\", \"circleplus\", \"emptyset\", \"intersection\",\n    \"union\", \"propersuperset\", \"reflexsuperset\", \"notsubset\", \"propersubset\", \"reflexsubset\", \"element\", \"notelement\",\n    \"angle\", \"gradient\", \"registerserif\", \"copyrightserif\", \"trademarkserif\", \"product\", \"radical\", \"dotmath\",\n    \"logicalnot\", \"logicaland\", \"logicalor\", \"arrowdblboth\", \"arrowdblleft\", \"arrowdblup\", \"arrowdblright\", \"arrowdbldown\",\n    \"lozenge\", \"angleleft\", \"registersans\", \"copyrightsans\", \"trademarksans\", \"summation\", \"parenlefttp\", \"parenleftex\",\n    \"parenleftbt\", \"bracketlefttp\", \"bracketleftex\", \"bracketleftbt\", \"bracelefttp\", \"braceleftmid\", \"braceleftbt\", \"braceex\",\n    NULL, \"angleright\", \"integral\", \"integraltp\", \"integralex\", \"integralbt\", \"parenrighttp\", \"parenrightex\",\n    \"parenrightbt\", \"bracketrighttp\", \"bracketrightex\", \"bracketrightbt\", \"bracerighttp\", \"bracerightmid\", \"bracerightbt\", NULL,\n};\nconst FX_LPCSTR  ZapfEncodingNames[224] = {\n    \"space\", \"a1\", \"a2\", \"a202\", \"a3\", \"a4\", \"a5\", \"a119\",\n    \"a118\", \"a117\", \"a11\", \"a12\", \"a13\", \"a14\", \"a15\", \"a16\",\n    \"a105\", \"a17\", \"a18\", \"a19\", \"a20\", \"a21\", \"a22\", \"a23\",\n    \"a24\", \"a25\", \"a26\", \"a27\", \"a28\", \"a6\", \"a7\", \"a8\",\n    \"a9\", \"a10\", \"a29\", \"a30\", \"a31\", \"a32\", \"a33\", \"a34\",\n    \"a35\", \"a36\", \"a37\", \"a38\", \"a39\", \"a40\", \"a41\", \"a42\",\n    \"a43\", \"a44\", \"a45\", \"a46\", \"a47\", \"a48\", \"a49\", \"a50\",\n    \"a51\", \"a52\", \"a53\", \"a54\", \"a55\", \"a56\", \"a57\", \"a58\",\n    \"a59\", \"a60\", \"a61\", \"a62\", \"a63\", \"a64\", \"a65\", \"a66\",\n    \"a67\", \"a68\", \"a69\", \"a70\", \"a71\", \"a72\", \"a73\", \"a74\",\n    \"a203\", \"a75\", \"a204\", \"a76\", \"a77\", \"a78\", \"a79\", \"a81\",\n    \"a82\", \"a83\", \"a84\", \"a97\", \"a98\", \"a99\", \"a100\", NULL,\n    \"a89\", \"a90\", \"a93\", \"a94\", \"a91\", \"a92\", \"a205\", \"a85\",\n    \"a206\", \"a86\", \"a87\", \"a88\", \"a95\", \"a96\", NULL, NULL,\n    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n    NULL, \"a101\", \"a102\", \"a103\", \"a104\", \"a106\", \"a107\", \"a108\",\n    \"a112\", \"a111\", \"a110\", \"a109\", \"a120\", \"a121\", \"a122\", \"a123\",\n    \"a124\", \"a125\", \"a126\", \"a127\", \"a128\", \"a129\", \"a130\", \"a131\",\n    \"a132\", \"a133\", \"a134\", \"a135\", \"a136\", \"a137\", \"a138\", \"a139\",\n    \"a140\", \"a141\", \"a142\", \"a143\", \"a144\", \"a145\", \"a146\", \"a147\",\n    \"a148\", \"a149\", \"a150\", \"a151\", \"a152\", \"a153\", \"a154\", \"a155\",\n    \"a156\", \"a157\", \"a158\", \"a159\", \"a160\", \"a161\", \"a163\", \"a164\",\n    \"a196\", \"a165\", \"a192\", \"a166\", \"a167\", \"a168\", \"a169\", \"a170\",\n    \"a171\", \"a172\", \"a173\", \"a162\", \"a174\", \"a175\", \"a176\", \"a177\",\n    \"a178\", \"a179\", \"a193\", \"a180\", \"a199\", \"a181\", \"a200\", \"a182\",\n    NULL, \"a201\", \"a183\", \"a184\", \"a197\", \"a185\", \"a194\", \"a198\",\n    \"a186\", \"a195\", \"a187\", \"a188\", \"a189\", \"a190\", \"a191\", NULL\n};\nconst FX_CHAR*  PDF_CharNameFromPredefinedCharSet(int encoding, FX_BYTE charcode)\n{\n    if (encoding == PDFFONT_ENCODING_PDFDOC) {\n        if (charcode < 24) {\n            return NULL;\n        }\n        charcode -= 24;\n    } else {\n        if (charcode < 32) {\n            return NULL;\n        }\n        charcode -= 32;\n    }\n    switch (encoding) {\n        case PDFFONT_ENCODING_WINANSI:\n            return AdobeWinAnsiEncodingNames[charcode];\n        case PDFFONT_ENCODING_MACROMAN:\n            return MacRomanEncodingNames[charcode];\n        case PDFFONT_ENCODING_MACEXPERT:\n            return MacExpertEncodingNames[charcode];\n        case PDFFONT_ENCODING_STANDARD:\n            return StandardEncodingNames[charcode];\n        case PDFFONT_ENCODING_ADOBE_SYMBOL:\n            return AdobeSymbolEncodingNames[charcode];\n        case PDFFONT_ENCODING_ZAPFDINGBATS:\n            return ZapfEncodingNames[charcode];\n        case PDFFONT_ENCODING_PDFDOC:\n            return PDFDocEncodingNames[charcode];\n    }\n    return NULL;\n}\nFX_WCHAR FT_UnicodeFromCharCode(int encoding, FX_DWORD charcode)\n{\n    switch (encoding) {\n        case FXFT_ENCODING_UNICODE:\n            return (FX_WORD)charcode;\n        case FXFT_ENCODING_ADOBE_STANDARD:\n            return StandardEncoding[(FX_BYTE)charcode];\n        case FXFT_ENCODING_ADOBE_EXPERT:\n            return MacExpertEncoding[(FX_BYTE)charcode];\n        case FXFT_ENCODING_ADOBE_LATIN_1:\n            return AdobeWinAnsiEncoding[(FX_BYTE)charcode];\n        case FXFT_ENCODING_APPLE_ROMAN:\n            return MacRomanEncoding[(FX_BYTE)charcode];\n        case PDFFONT_ENCODING_PDFDOC:\n            return PDFDocEncoding[(FX_BYTE)charcode];\n    }\n    return 0;\n}\nstatic FX_DWORD PDF_FindCode(const FX_WORD* pCodes, FX_WORD unicode)\n{\n    for (FX_DWORD i = 0; i < 256; i ++)\n        if (pCodes[i] == unicode) {\n            return i;\n        }\n    return 0;\n}\nconst FX_WORD MSSymbolEncoding[256] = {\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 32, 33, 8704, 35, 8707, 37, 38, 8715,\n    40, 41, 8727, 43, 44, 8722, 46, 47, 48, 49,\n    50, 51, 52, 53, 54, 55, 56, 57, 58, 59,\n    60, 61, 62, 63, 8773, 913, 914, 935, 916, 917,\n    934, 915, 919, 921, 977, 922, 923, 924, 925, 927,\n    928, 920, 929, 931, 932, 933, 962, 937, 926, 936,\n    918, 91, 8756, 93, 8869, 95, 8254, 945, 946, 967,\n    948, 949, 966, 947, 951, 953, 981, 954, 955, 956,\n    957, 959, 960, 952, 961, 963, 964, 965, 982, 969,\n    958, 968, 950, 123, 124, 125, 8764, 0, 0, 0,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 978, 8242, 8804, 8725, 8734, 402, 9827, 9830, 9828,\n    9824, 8596, 8592, 8593, 8594, 8595, 176, 177, 8243, 8805,\n    215, 8733, 8706, 8729, 247, 8800, 8801, 8776, 8943, 0,\n    0, 8629, 0, 8465, 8476, 8472, 8855, 8853, 8709, 8745,\n    8746, 8835, 8839, 8836, 8834, 8838, 8712, 8713, 8736, 8711,\n    174, 169, 8482, 8719, 8730, 8901, 172, 8743, 8744, 8660,\n    8656, 8657, 8658, 8659, 9674, 9001, 0, 0, 0, 8721,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0x0000, 9002, 8747, 8992, 0, 8993, 0, 0, 0, 0,\n    0, 0, 0x0000, 0x0000, 0x0000, 0x0000\n};\nFX_DWORD FT_CharCodeFromUnicode(int encoding, FX_WCHAR unicode)\n{\n    switch (encoding) {\n        case FXFT_ENCODING_UNICODE:\n            return unicode;\n        case FXFT_ENCODING_ADOBE_STANDARD:\n            return PDF_FindCode(StandardEncoding, unicode);\n        case FXFT_ENCODING_ADOBE_EXPERT:\n            return PDF_FindCode(MacExpertEncoding, unicode);\n        case FXFT_ENCODING_ADOBE_LATIN_1:\n            return PDF_FindCode(AdobeWinAnsiEncoding, unicode);\n        case FXFT_ENCODING_APPLE_ROMAN:\n            return PDF_FindCode(MacRomanEncoding, unicode);\n        case FXFT_ENCODING_ADOBE_CUSTOM:\n            return PDF_FindCode(PDFDocEncoding, unicode);\n        case FXFT_ENCODING_MS_SYMBOL:\n            return PDF_FindCode(MSSymbolEncoding, unicode);\n    }\n    return 0;\n}\nconst FX_WORD* PDF_UnicodesForPredefinedCharSet(int encoding)\n{\n    switch (encoding) {\n        case PDFFONT_ENCODING_WINANSI:\n            return AdobeWinAnsiEncoding;\n        case PDFFONT_ENCODING_MACROMAN:\n            return MacRomanEncoding;\n        case PDFFONT_ENCODING_MACEXPERT:\n            return MacExpertEncoding;\n        case PDFFONT_ENCODING_STANDARD:\n            return StandardEncoding;\n        case PDFFONT_ENCODING_ADOBE_SYMBOL:\n            return AdobeSymbolEncoding;\n        case PDFFONT_ENCODING_ZAPFDINGBATS:\n            return ZapfEncoding;\n        case PDFFONT_ENCODING_PDFDOC:\n            return PDFDocEncoding;\n        case PDFFONT_ENCODING_MS_SYMBOL:\n            return MSSymbolEncoding;\n    }\n    return NULL;\n}\nFX_DWORD PDF_PredefinedCharCodeFromUnicode(int encoding, FX_WCHAR unicode)\n{\n    return PDF_FindCode(PDF_UnicodesForPredefinedCharSet(encoding), unicode);\n}\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nextern int FXFT_unicode_from_adobe_name(const char* name);\n#ifdef __cplusplus\n}\n#endif\nFX_WCHAR PDF_UnicodeFromAdobeName(const FX_CHAR* name)\n{\n    return (FX_WCHAR)(FXFT_unicode_from_adobe_name(name) & 0x7FFFFFFF);\n}\nCFX_ByteString PDF_AdobeNameFromUnicode(FX_WCHAR unicode)\n{\n    char glyph_name[64];\n    FXFT_adobe_name_from_unicode(glyph_name, unicode);\n    return CFX_ByteString(glyph_name, -1);\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_module.h\"\n#include \"../../../include/fpdfapi/fpdf_page.h\"\n#include \"font_int.h\"\n#include \"../fpdf_cmaps/cmap_int.h\"\n#include \"../../../include/fxge/fx_ge.h\"\n#include \"../../../include/fxge/fx_freetype.h\"\nextern FX_DWORD FT_CharCodeFromUnicode(int encoding, FX_WCHAR unicode);\nextern FX_LPVOID FXFC_LoadPackage(FX_LPCSTR name);\nextern FX_BOOL FXFC_LoadFile(FX_LPVOID pPackage, FX_LPCSTR name, FX_LPBYTE& pBuffer, FX_DWORD& size);\nextern void FXFC_ClosePackage(FX_LPVOID pPackage);\nextern short TT2PDF(int m, FXFT_Face face);\nextern FX_BOOL FT_UseTTCharmap(FXFT_Face face, int platform_id, int encoding_id);\nextern FX_LPCSTR GetAdobeCharName(int iBaseEncoding, const CFX_ByteString* pCharNames, int charcode);\nCPDF_CMapManager::CPDF_CMapManager()\n{\n#ifndef _FPDFAPI_MINI_\n    m_bPrompted = FALSE;\n    m_pPackage = NULL;\n#endif\n    FXSYS_memset32(m_CID2UnicodeMaps, 0, sizeof m_CID2UnicodeMaps);\n}\nCPDF_CMapManager::~CPDF_CMapManager()\n{\n    DropAll(FALSE);\n#ifndef _FPDFAPI_MINI_\n    if (m_pPackage) {\n        FXFC_ClosePackage(m_pPackage);\n    }\n#endif\n}\n#ifndef _FPDFAPI_MINI_\nFX_LPVOID CPDF_CMapManager::GetPackage(FX_BOOL bPrompt)\n{\n#ifndef FOXIT_CHROME_BUILD\n    if (m_pPackage == NULL) {\n        CFX_ByteString filename = CPDF_ModuleMgr::Get()->GetModuleFilePath(ADDIN_NAME_CJK, \"FPDFCJK.BIN\");\n        m_pPackage = FXFC_LoadPackage(filename);\n        if (bPrompt && m_pPackage == NULL && !m_bPrompted) {\n            m_bPrompted = TRUE;\n            if (!CPDF_ModuleMgr::Get()->DownloadModule(ADDIN_NAME_CJK)) {\n                return NULL;\n            }\n            m_pPackage = FXFC_LoadPackage(filename);\n        }\n    }\n#endif\n    return m_pPackage;\n}\n#endif\nCPDF_CMap* CPDF_CMapManager::GetPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPromptCJK)\n{\n    CPDF_CMap* pCMap;\n    if (m_CMaps.Lookup(name, (FX_LPVOID&)pCMap)) {\n        return pCMap;\n    }\n    pCMap = LoadPredefinedCMap(name, bPromptCJK);\n    if (name.IsEmpty()) {\n        return pCMap;\n    }\n    m_CMaps.SetAt(name, pCMap);\n    return pCMap;\n}\nCPDF_CMap* CPDF_CMapManager::LoadPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPromptCJK)\n{\n    CPDF_CMap* pCMap = FX_NEW CPDF_CMap;\n    FX_LPCSTR pname = name;\n    if (*pname == '/') {\n        pname ++;\n    }\n    pCMap->LoadPredefined(this, pname, bPromptCJK);\n    return pCMap;\n}\nconst FX_LPCSTR g_CharsetNames[] = {NULL, \"GB1\", \"CNS1\", \"Japan1\", \"Korea1\", \"UCS\", NULL};\nconst int g_CharsetCPs[] = {0, 936, 950, 932, 949, 1200, 0};\nint _CharsetFromOrdering(const CFX_ByteString& Ordering)\n{\n    int charset = 1;\n    while (g_CharsetNames[charset] && Ordering != CFX_ByteStringC(g_CharsetNames[charset])) {\n        charset ++;\n    }\n    if (g_CharsetNames[charset] == NULL) {\n        return CIDSET_UNKNOWN;\n    }\n    return charset;\n}\nvoid CPDF_CMapManager::ReloadAll()\n{\n    DropAll(TRUE);\n}\nvoid CPDF_CMapManager::DropAll(FX_BOOL bReload)\n{\n    FX_POSITION pos = m_CMaps.GetStartPosition();\n    while (pos) {\n        CFX_ByteString name;\n        CPDF_CMap* pCMap;\n        m_CMaps.GetNextAssoc(pos, name, (FX_LPVOID&)pCMap);\n        if (pCMap == NULL) {\n            continue;\n        }\n        if (bReload) {\n            pCMap->LoadPredefined(this, name, FALSE);\n        } else {\n            delete pCMap;\n        }\n    }\n    for (int i = 0; i < sizeof m_CID2UnicodeMaps / sizeof(CPDF_CID2UnicodeMap*); i ++) {\n        CPDF_CID2UnicodeMap* pMap = m_CID2UnicodeMaps[i];\n        if (pMap == NULL) {\n            continue;\n        }\n        if (bReload) {\n            pMap->Load(this, i, FALSE);\n        } else {\n            delete pMap;\n        }\n    }\n}\nCPDF_CID2UnicodeMap* CPDF_CMapManager::GetCID2UnicodeMap(int charset, FX_BOOL bPromptCJK)\n{\n    if (m_CID2UnicodeMaps[charset] == NULL) {\n        m_CID2UnicodeMaps[charset] = LoadCID2UnicodeMap(charset, bPromptCJK);\n    }\n    return m_CID2UnicodeMaps[charset];\n}\nCPDF_CID2UnicodeMap* CPDF_CMapManager::LoadCID2UnicodeMap(int charset, FX_BOOL bPromptCJK)\n{\n    CPDF_CID2UnicodeMap* pMap = FX_NEW CPDF_CID2UnicodeMap();\n    if (!pMap->Initialize()) {\n        delete pMap;\n        return NULL;\n    }\n    pMap->Load(this, charset, bPromptCJK);\n    return pMap;\n}\nCPDF_CMapParser::CPDF_CMapParser()\n{\n    m_pCMap = NULL;\n    m_Status = 0;\n    m_CodeSeq = 0;\n}\nFX_BOOL\tCPDF_CMapParser::Initialize(CPDF_CMap* pCMap)\n{\n    m_pCMap = pCMap;\n    m_Status = 0;\n    m_CodeSeq = 0;\n    m_AddMaps.EstimateSize(0, 10240);\n    return TRUE;\n}\nstatic FX_DWORD CMap_GetCode(FX_BSTR word)\n{\n    int num = 0;\n    if (word.GetAt(0) == '<') {\n        for (int i = 1; i < word.GetLength(); i ++) {\n            FX_BYTE digit = word.GetAt(i);\n            if (digit >= '0' && digit <= '9') {\n                digit = digit - '0';\n            } else if (digit >= 'a' && digit <= 'f') {\n                digit = digit - 'a' + 10;\n            } else if (digit >= 'A' && digit <= 'F') {\n                digit = digit - 'A' + 10;\n            } else {\n                return num;\n            }\n            num = num * 16 + digit;\n        }\n    } else {\n        for (int i = 0; i < word.GetLength(); i ++) {\n            if (word.GetAt(i) < '0' || word.GetAt(i) > '9') {\n                return num;\n            }\n            num = num * 10 + word.GetAt(i) - '0';\n        }\n    }\n    return num;\n}\nstatic FX_BOOL _CMap_GetCodeRange(_CMap_CodeRange& range, FX_BSTR first, FX_BSTR second)\n{\n    if (first.GetLength() == 0 || first.GetAt(0) != '<') {\n        return FALSE;\n    }\n    int num = 0;\n    int i;\n    for (i = 1; i < first.GetLength(); i ++)\n        if (first.GetAt(i) == '>') {\n            break;\n        }\n    range.m_CharSize = (i - 1) / 2;\n    if (range.m_CharSize > 4) {\n        return FALSE;\n    }\n    for (i = 0; i < range.m_CharSize; i ++) {\n        FX_BYTE digit1 = first.GetAt(i * 2 + 1);\n        FX_BYTE digit2 = first.GetAt(i * 2 + 2);\n        FX_BYTE byte = (digit1 >= '0' && digit1 <= '9') ? (digit1 - '0') : ((digit1 & 0xdf) - 'A' + 10);\n        byte = byte * 16 + ((digit2 >= '0' && digit2 <= '9') ? (digit2 - '0') : ((digit2 & 0xdf) - 'A' + 10));\n        range.m_Lower[i] = byte;\n    }\n    FX_DWORD size = second.GetLength();\n    for (i = 0; i < range.m_CharSize; i ++) {\n        FX_BYTE digit1 = ((FX_DWORD)i * 2 + 1 < size) ? second.GetAt((FX_STRSIZE)i * 2 + 1) : 0;\n        FX_BYTE digit2 = ((FX_DWORD)i * 2 + 2 < size) ? second.GetAt((FX_STRSIZE)i * 2 + 2) : 0;\n        FX_BYTE byte = (digit1 >= '0' && digit1 <= '9') ? (digit1 - '0') : ((digit1 & 0xdf) - 'A' + 10);\n        byte = byte * 16 + ((digit2 >= '0' && digit2 <= '9') ? (digit2 - '0') : ((digit2 & 0xdf) - 'A' + 10));\n        range.m_Upper[i] = byte;\n    }\n    return TRUE;\n}\nstatic CFX_ByteString CMap_GetString(FX_BSTR word)\n{\n    return word.Mid(1, word.GetLength() - 2);\n}\nvoid CPDF_CMapParser::ParseWord(FX_BSTR word)\n{\n    if (word.IsEmpty()) {\n        return;\n    }\n    if (word == FX_BSTRC(\"begincidchar\")) {\n        m_Status = 1;\n        m_CodeSeq = 0;\n    } else if (word == FX_BSTRC(\"begincidrange\")) {\n        m_Status = 2;\n        m_CodeSeq = 0;\n    } else if (word == FX_BSTRC(\"endcidrange\") || word == FX_BSTRC(\"endcidchar\")) {\n        m_Status = 0;\n    } else if (word == FX_BSTRC(\"/WMode\")) {\n        m_Status = 6;\n    } else if (word == FX_BSTRC(\"/Registry\")) {\n        m_Status = 3;\n    } else if (word == FX_BSTRC(\"/Ordering\")) {\n        m_Status = 4;\n    } else if (word == FX_BSTRC(\"/Supplement\")) {\n        m_Status = 5;\n    } else if (word == FX_BSTRC(\"begincodespacerange\")) {\n        m_Status = 7;\n        m_CodeSeq = 0;\n    } else if (word == FX_BSTRC(\"usecmap\")) {\n    } else if (m_Status == 1 || m_Status == 2) {\n        m_CodePoints[m_CodeSeq] = CMap_GetCode(word);\n        m_CodeSeq ++;\n        FX_DWORD StartCode, EndCode;\n        FX_WORD StartCID;\n        if (m_Status == 1) {\n            if (m_CodeSeq < 2) {\n                return;\n            }\n            EndCode = StartCode = m_CodePoints[0];\n            StartCID = (FX_WORD)m_CodePoints[1];\n        } else {\n            if (m_CodeSeq < 3) {\n                return;\n            }\n            StartCode = m_CodePoints[0];\n            EndCode = m_CodePoints[1];\n            StartCID = (FX_WORD)m_CodePoints[2];\n        }\n        if (EndCode < 0x10000) {\n            for (FX_DWORD code = StartCode; code <= EndCode; code ++) {\n                m_pCMap->m_pMapping[code] = (FX_WORD)(StartCID + code - StartCode);\n            }\n        } else {\n            FX_DWORD buf[2];\n            buf[0] = StartCode;\n            buf[1] = ((EndCode - StartCode) << 16) + StartCID;\n            m_AddMaps.AppendBlock(buf, sizeof buf);\n        }\n        m_CodeSeq = 0;\n    } else if (m_Status == 3) {\n        CMap_GetString(word);\n        m_Status = 0;\n    } else if (m_Status == 4) {\n        m_pCMap->m_Charset = _CharsetFromOrdering(CMap_GetString(word));\n        m_Status = 0;\n    } else if (m_Status == 5) {\n        CMap_GetCode(word);\n        m_Status = 0;\n    } else if (m_Status == 6) {\n        m_pCMap->m_bVertical = CMap_GetCode(word);\n        m_Status = 0;\n    } else if (m_Status == 7) {\n        if (word == FX_BSTRC(\"endcodespacerange\")) {\n            int nSegs = m_CodeRanges.GetSize();\n            if (nSegs > 1) {\n                m_pCMap->m_CodingScheme = CPDF_CMap::MixedFourBytes;\n                m_pCMap->m_nCodeRanges = nSegs;\n                m_pCMap->m_pLeadingBytes = FX_Alloc(FX_BYTE, nSegs * sizeof(_CMap_CodeRange));\n                FXSYS_memcpy32(m_pCMap->m_pLeadingBytes, m_CodeRanges.GetData(), nSegs * sizeof(_CMap_CodeRange));\n            } else if (nSegs == 1) {\n                m_pCMap->m_CodingScheme = (m_CodeRanges[0].m_CharSize == 2) ? CPDF_CMap::TwoBytes : CPDF_CMap::OneByte;\n            }\n            m_Status = 0;\n        } else {\n            if (word.GetLength() == 0 || word.GetAt(0) != '<') {\n                return;\n            }\n            if (m_CodeSeq % 2) {\n                _CMap_CodeRange range;\n                if (_CMap_GetCodeRange(range, m_LastWord, word)) {\n                    m_CodeRanges.Add(range);\n                }\n            }\n            m_CodeSeq ++;\n        }\n    }\n    m_LastWord = word;\n}\nCPDF_CMap::CPDF_CMap()\n{\n    m_Charset = CIDSET_UNKNOWN;\n    m_Coding = CIDCODING_UNKNOWN;\n    m_CodingScheme = TwoBytes;\n    m_bVertical = 0;\n    m_bLoaded = FALSE;\n    m_pMapping = NULL;\n    m_pLeadingBytes = NULL;\n    m_pAddMapping = NULL;\n    m_pEmbedMap = NULL;\n    m_pUseMap = NULL;\n    m_nCodeRanges = 0;\n}\nCPDF_CMap::~CPDF_CMap()\n{\n    if (m_pMapping) {\n        FX_Free(m_pMapping);\n    }\n    if (m_pAddMapping) {\n        FX_Free(m_pAddMapping);\n    }\n    if (m_pLeadingBytes) {\n        FX_Free(m_pLeadingBytes);\n    }\n    if (m_pUseMap) {\n        delete m_pUseMap;\n    }\n}\nvoid CPDF_CMap::Release()\n{\n    if (m_PredefinedCMap.IsEmpty()) {\n        delete this;\n    }\n}\nconst CPDF_PredefinedCMap g_PredefinedCMaps[] = {\n    { \"GB-EUC\", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfe} },\n    { \"GBpc-EUC\", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfc} },\n    { \"GBK-EUC\", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },\n    { \"GBKp-EUC\", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },\n    { \"GBK2K-EUC\", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },\n    { \"GBK2K\", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },\n    { \"UniGB-UCS2\", CIDSET_GB1, CIDCODING_UCS2, CPDF_CMap::TwoBytes },\n    { \"UniGB-UTF16\", CIDSET_GB1, CIDCODING_UTF16, CPDF_CMap::TwoBytes },\n    { \"B5pc\", CIDSET_CNS1, CIDCODING_BIG5, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfc} },\n    { \"HKscs-B5\", CIDSET_CNS1, CIDCODING_BIG5, CPDF_CMap::MixedTwoBytes, 1, {0x88, 0xfe} },\n    { \"ETen-B5\", CIDSET_CNS1, CIDCODING_BIG5, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfe} },\n    { \"ETenms-B5\", CIDSET_CNS1, CIDCODING_BIG5, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfe} },\n    { \"UniCNS-UCS2\", CIDSET_CNS1, CIDCODING_UCS2, CPDF_CMap::TwoBytes },\n    { \"UniCNS-UTF16\", CIDSET_CNS1, CIDCODING_UTF16, CPDF_CMap::TwoBytes },\n    { \"83pv-RKSJ\", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },\n    { \"90ms-RKSJ\", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },\n    { \"90msp-RKSJ\", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },\n    { \"90pv-RKSJ\", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },\n    { \"Add-RKSJ\", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },\n    { \"EUC\", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x8e, 0x8e, 0xa1, 0xfe} },\n    { \"H\", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::TwoBytes, 1, {0x21, 0x7e} },\n    { \"V\", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::TwoBytes, 1, {0x21, 0x7e} },\n    { \"Ext-RKSJ\", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },\n    { \"UniJIS-UCS2\", CIDSET_JAPAN1, CIDCODING_UCS2, CPDF_CMap::TwoBytes },\n    { \"UniJIS-UCS2-HW\", CIDSET_JAPAN1, CIDCODING_UCS2, CPDF_CMap::TwoBytes },\n    { \"UniJIS-UTF16\", CIDSET_JAPAN1, CIDCODING_UTF16, CPDF_CMap::TwoBytes },\n    { \"KSC-EUC\", CIDSET_KOREA1, CIDCODING_KOREA, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfe} },\n    { \"KSCms-UHC\", CIDSET_KOREA1, CIDCODING_KOREA, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },\n    { \"KSCms-UHC-HW\", CIDSET_KOREA1, CIDCODING_KOREA, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },\n    { \"KSCpc-EUC\", CIDSET_KOREA1, CIDCODING_KOREA, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfd} },\n    { \"UniKS-UCS2\", CIDSET_KOREA1, CIDCODING_UCS2, CPDF_CMap::TwoBytes },\n    { \"UniKS-UTF16\", CIDSET_KOREA1, CIDCODING_UTF16, CPDF_CMap::TwoBytes },\n    { NULL, 0, 0 }\n};\nextern void FPDFAPI_FindEmbeddedCMap(const char* name, int charset, int coding, const FXCMAP_CMap*& pMap);\nextern FX_WORD FPDFAPI_CIDFromCharCode(const FXCMAP_CMap* pMap, FX_DWORD charcode);\nFX_BOOL CPDF_CMap::LoadPredefined(CPDF_CMapManager* pMgr, FX_LPCSTR pName, FX_BOOL bPromptCJK)\n{\n    m_PredefinedCMap = pName;\n    if (m_PredefinedCMap == FX_BSTRC(\"Identity-H\") || m_PredefinedCMap == FX_BSTRC(\"Identity-V\")) {\n        m_Coding = CIDCODING_CID;\n        m_bVertical = pName[9] == 'V';\n        m_bLoaded = TRUE;\n        return TRUE;\n    }\n    CFX_ByteString cmapid = m_PredefinedCMap;\n    m_bVertical = cmapid.Right(1) == FX_BSTRC(\"V\");\n    if (cmapid.GetLength() > 2) {\n        cmapid = cmapid.Left(cmapid.GetLength() - 2);\n    }\n    int index = 0;\n    while (1) {\n        if (g_PredefinedCMaps[index].m_pName == NULL) {\n            return FALSE;\n        }\n        if (cmapid == CFX_ByteStringC(g_PredefinedCMaps[index].m_pName)) {\n            break;\n        }\n        index ++;\n    }\n    const CPDF_PredefinedCMap& map = g_PredefinedCMaps[index];\n    m_Charset = map.m_Charset;\n    m_Coding = map.m_Coding;\n    m_CodingScheme = map.m_CodingScheme;\n    if (m_CodingScheme == MixedTwoBytes) {\n        m_pLeadingBytes = FX_Alloc(FX_BYTE, 256);\n        for (FX_DWORD i = 0; i < map.m_LeadingSegCount; i ++) {\n            for (int b = map.m_LeadingSegs[i * 2]; b <= map.m_LeadingSegs[i * 2 + 1]; b ++) {\n                m_pLeadingBytes[b] = 1;\n            }\n        }\n    }\n    FPDFAPI_FindEmbeddedCMap(pName, m_Charset, m_Coding, m_pEmbedMap);\n    if (m_pEmbedMap) {\n        m_bLoaded = TRUE;\n        return TRUE;\n    }\n#ifndef _FPDFAPI_MINI_\n    FX_LPVOID pPackage = pMgr->GetPackage(bPromptCJK);\n    FX_LPBYTE pBuffer;\n    FX_DWORD size;\n    if (pPackage == NULL || !FXFC_LoadFile(pPackage, m_PredefinedCMap, pBuffer, size)) {\n        return FALSE;\n    }\n    m_pMapping = FX_Alloc(FX_WORD, 65536);\n    FX_DWORD dwRecodeEndPos = 0;\n    if (pBuffer[5] == 0) {\n        FX_DWORD dwStartIndex = *(FX_DWORD*)(pBuffer + 8);\n        FX_DWORD dwRecordCount = *(FX_DWORD*)(pBuffer + 16);\n        FX_DWORD dwDataOffset = *(FX_DWORD*)(pBuffer + 20);\n        if (dwRecordCount * 2 + dwStartIndex * 2 < 65536) {\n            FXSYS_memcpy32(m_pMapping + dwStartIndex * 2, pBuffer + dwDataOffset, dwRecordCount * 2);\n        }\n        dwRecodeEndPos = dwDataOffset + dwRecordCount * 2;\n    } else if (pBuffer[5] == 2) {\n        FX_DWORD nSegments = *(FX_DWORD*)(pBuffer + 16);\n        FX_DWORD dwDataOffset = *(FX_DWORD*)(pBuffer + 20);\n        dwRecodeEndPos = dwDataOffset + 6 * nSegments;\n        for (FX_DWORD i = 0; i < nSegments; i ++) {\n            FX_LPBYTE pRecord = pBuffer + dwDataOffset + i * 6;\n            FX_WORD IndexStart = *(FX_WORD*)pRecord;\n            FX_WORD IndexCount = *(FX_WORD*)(pRecord + 2);\n            FX_WORD CodeStart = *(FX_WORD*)(pRecord + 4);\n            if (IndexStart + IndexCount < 65536)\n                for (FX_DWORD j = 0; j < IndexCount; j ++) {\n                    m_pMapping[IndexStart + j ] = (FX_WORD)(CodeStart + j);\n                }\n        }\n    }\n    if (dwRecodeEndPos < size) {\n        FX_DWORD dwMapLen = *(FX_DWORD*)(pBuffer + dwRecodeEndPos);\n        if (dwMapLen) {\n            m_pUseMap = FX_NEW CPDF_CMap;\n            CFX_ByteString bsName(pBuffer + dwRecodeEndPos + 4 , dwMapLen);\n            if (m_pUseMap) {\n                m_pUseMap->LoadPredefined(pMgr, bsName, bPromptCJK);\n            }\n        }\n    }\n    FX_Free(pBuffer);\n    m_bLoaded = TRUE;\n#endif\n    return TRUE;\n}\nextern \"C\" {\n    static int compare_dword(const void* data1, const void* data2)\n    {\n        return (*(FX_DWORD*)data1) - (*(FX_DWORD*)data2);\n    }\n};\nFX_BOOL CPDF_CMap::LoadEmbedded(FX_LPCBYTE pData, FX_DWORD size)\n{\n    m_pMapping = FX_Alloc(FX_WORD, 65536);\n    CPDF_CMapParser parser;\n    parser.Initialize(this);\n    CPDF_SimpleParser syntax(pData, size);\n    while (1) {\n        CFX_ByteStringC word = syntax.GetWord();\n        if (word.IsEmpty()) {\n            break;\n        }\n        parser.ParseWord(word);\n    }\n    if (m_CodingScheme == MixedFourBytes && parser.m_AddMaps.GetSize()) {\n        m_pAddMapping = FX_Alloc(FX_BYTE, parser.m_AddMaps.GetSize() + 4);\n        *(FX_DWORD*)m_pAddMapping = parser.m_AddMaps.GetSize() / 8;\n        FXSYS_memcpy32(m_pAddMapping + 4, parser.m_AddMaps.GetBuffer(), parser.m_AddMaps.GetSize());\n        FXSYS_qsort(m_pAddMapping + 4, parser.m_AddMaps.GetSize() / 8, 8, compare_dword);\n    }\n    return TRUE;\n}\nextern \"C\" {\n    static int compareCID(const void* key, const void* element)\n    {\n        if ((*(FX_DWORD*)key) < (*(FX_DWORD*)element)) {\n            return -1;\n        }\n        if ((*(FX_DWORD*)key) > (*(FX_DWORD*)element) + ((FX_DWORD*)element)[1] / 65536) {\n            return 1;\n        }\n        return 0;\n    }\n};\nFX_WORD CPDF_CMap::CIDFromCharCode(FX_DWORD charcode) const\n{\n    if (m_Coding == CIDCODING_CID) {\n        return (FX_WORD)charcode;\n    }\n    if (m_pEmbedMap) {\n        return FPDFAPI_CIDFromCharCode(m_pEmbedMap, charcode);\n    }\n    if (m_pMapping == NULL) {\n        return (FX_WORD)charcode;\n    }\n    if (charcode >> 16) {\n        if (m_pAddMapping) {\n            void* found = FXSYS_bsearch(&charcode, m_pAddMapping + 4, *(FX_DWORD*)m_pAddMapping, 8, compareCID);\n            if (found == NULL) {\n                if (m_pUseMap) {\n                    return m_pUseMap->CIDFromCharCode(charcode);\n                }\n                return 0;\n            }\n            return (FX_WORD)(((FX_DWORD*)found)[1] % 65536 + charcode - * (FX_DWORD*)found);\n        }\n        if (m_pUseMap) {\n            return m_pUseMap->CIDFromCharCode(charcode);\n        }\n        return 0;\n    }\n    FX_DWORD CID = m_pMapping[charcode];\n    if (!CID && m_pUseMap) {\n        return m_pUseMap->CIDFromCharCode(charcode);\n    }\n    return (FX_WORD)CID;\n}\nstatic int _CheckCodeRange(FX_LPBYTE codes, int size, _CMap_CodeRange* pRanges, int nRanges)\n{\n    int iSeg = nRanges - 1;\n    while (iSeg >= 0) {\n        if (pRanges[iSeg].m_CharSize < size) {\n            iSeg --;\n            continue;\n        }\n        int iChar = 0;\n        while (iChar < size) {\n            if (codes[iChar] < pRanges[iSeg].m_Lower[iChar] ||\n                    codes[iChar] > pRanges[iSeg].m_Upper[iChar]) {\n                break;\n            }\n            iChar ++;\n        }\n        if (iChar == pRanges[iSeg].m_CharSize) {\n            return 2;\n        }\n        if (iChar) {\n            if (size == pRanges[iSeg].m_CharSize) {\n                return 2;\n            }\n            return 1;\n        }\n        iSeg --;\n    }\n    return 0;\n}\nFX_DWORD CPDF_CMap::GetNextChar(FX_LPCSTR pString, int& offset) const\n{\n    switch (m_CodingScheme) {\n        case OneByte:\n            return ((FX_LPBYTE)pString)[offset++];\n        case TwoBytes:\n            offset += 2;\n            return ((FX_LPBYTE)pString)[offset - 2] * 256 + ((FX_LPBYTE)pString)[offset - 1];\n        case MixedTwoBytes: {\n                FX_BYTE byte1 = ((FX_LPBYTE)pString)[offset++];\n                if (!m_pLeadingBytes[byte1]) {\n                    return byte1;\n                }\n                FX_BYTE byte2 = ((FX_LPBYTE)pString)[offset++];\n                return byte1 * 256 + byte2;\n            }\n        case MixedFourBytes: {\n                FX_BYTE codes[4];\n                int char_size = 1;\n                codes[0] = ((FX_LPBYTE)pString)[offset++];\n                _CMap_CodeRange* pRanges = (_CMap_CodeRange*)m_pLeadingBytes;\n                while (1) {\n                    int ret = _CheckCodeRange(codes, char_size, pRanges, m_nCodeRanges);\n                    if (ret == 0) {\n                        return 0;\n                    }\n                    if (ret == 2) {\n                        FX_DWORD charcode = 0;\n                        for (int i = 0; i < char_size; i ++) {\n                            charcode = (charcode << 8) + codes[i];\n                        }\n                        return charcode;\n                    }\n                    if (char_size == 4) {\n                        return 0;\n                    }\n                    codes[char_size ++] = ((FX_LPBYTE)pString)[offset++];\n                }\n                break;\n            }\n    }\n    return 0;\n}\nint CPDF_CMap::GetCharSize(FX_DWORD charcode) const\n{\n    switch (m_CodingScheme) {\n        case OneByte:\n            return 1;\n        case TwoBytes:\n            return 2;\n        case MixedTwoBytes:\n        case MixedFourBytes:\n            if (charcode < 0x100) {\n                return 1;\n            }\n            if (charcode < 0x10000) {\n                return 2;\n            }\n            if (charcode < 0x1000000) {\n                return 3;\n            }\n            return 4;\n    }\n    return 1;\n}\nint CPDF_CMap::CountChar(FX_LPCSTR pString, int size) const\n{\n    switch (m_CodingScheme) {\n        case OneByte:\n            return size;\n        case TwoBytes:\n            return (size + 1) / 2;\n        case MixedTwoBytes: {\n                int count = 0;\n                for (int i = 0; i < size; i ++) {\n                    count ++;\n                    if (m_pLeadingBytes[((FX_LPBYTE)pString)[i]]) {\n                        i ++;\n                    }\n                }\n                return count;\n            }\n        case MixedFourBytes: {\n                int count = 0, offset = 0;\n                while (offset < size) {\n                    GetNextChar(pString, offset);\n                    count ++;\n                }\n                return count;\n            }\n    }\n    return size;\n}\nint _GetCharSize(FX_DWORD charcode, _CMap_CodeRange* pRanges, int iRangesSize)\n{\n    if (!iRangesSize) {\n        return 1;\n    }\n    FX_BYTE codes[4];\n    codes[0] = codes[1] = 0x00;\n    codes[2] = (FX_BYTE)(charcode >> 8 & 0xFF);\n    codes[3] = (FX_BYTE)charcode;\n    int offset = 0, size = 4;\n    for (int i = 0; i < 4; ++i) {\n        int iSeg = iRangesSize - 1;\n        while (iSeg >= 0) {\n            if (pRanges[iSeg].m_CharSize < size) {\n                iSeg --;\n                continue;\n            }\n            int iChar = 0;\n            while (iChar < size) {\n                if (codes[offset + iChar] < pRanges[iSeg].m_Lower[iChar] ||\n                        codes[offset + iChar] > pRanges[iSeg].m_Upper[iChar]) {\n                    break;\n                }\n                iChar ++;\n            }\n            if (iChar == pRanges[iSeg].m_CharSize) {\n                return size;\n            }\n            iSeg --;\n        }\n        size --;\n        offset ++;\n    }\n    return 1;\n}\nint CPDF_CMap::AppendChar(FX_LPSTR str, FX_DWORD charcode) const\n{\n    switch (m_CodingScheme) {\n        case OneByte:\n            str[0] = (FX_BYTE)charcode;\n            return 1;\n        case TwoBytes:\n            str[0] = (FX_BYTE)(charcode / 256);\n            str[1] = (FX_BYTE)(charcode % 256);\n            return 2;\n        case MixedTwoBytes:\n        case MixedFourBytes:\n            if (charcode < 0x100) {\n                _CMap_CodeRange* pRanges = (_CMap_CodeRange*)m_pLeadingBytes;\n                int iSize = _GetCharSize(charcode, pRanges, m_nCodeRanges);\n                if (iSize == 0) {\n                    iSize = 1;\n                }\n                if (iSize > 1) {\n                    FXSYS_memset32(str, 0, sizeof(FX_BYTE) * iSize);\n                }\n                str[iSize - 1] = (FX_BYTE)charcode;\n                return iSize;\n            } else if (charcode < 0x10000) {\n                str[0] = (FX_BYTE)(charcode >> 8);\n                str[1] = (FX_BYTE)charcode;\n                return 2;\n            } else if (charcode < 0x1000000) {\n                str[0] = (FX_BYTE)(charcode >> 16);\n                str[1] = (FX_BYTE)(charcode >> 8);\n                str[2] = (FX_BYTE)charcode;\n                return 3;\n            } else {\n                str[0] = (FX_BYTE)(charcode >> 24);\n                str[1] = (FX_BYTE)(charcode >> 16);\n                str[2] = (FX_BYTE)(charcode >> 8);\n                str[3] = (FX_BYTE)charcode;\n                return 4;\n            }\n    }\n    return 0;\n}\nCPDF_CID2UnicodeMap::CPDF_CID2UnicodeMap()\n{\n    m_EmbeddedCount = 0;\n#ifndef _FPDFAPI_MINI_\n    m_pExternalMap = NULL;\n#endif\n}\nCPDF_CID2UnicodeMap::~CPDF_CID2UnicodeMap()\n{\n#ifndef _FPDFAPI_MINI_\n    if (m_pExternalMap) {\n        delete m_pExternalMap;\n    }\n#endif\n}\nFX_BOOL CPDF_CID2UnicodeMap::Initialize()\n{\n#ifndef _FPDFAPI_MINI_\n    m_pExternalMap = FX_NEW CPDF_FXMP;\n#endif\n    return TRUE;\n}\nFX_BOOL CPDF_CID2UnicodeMap::IsLoaded()\n{\n#ifdef _FPDFAPI_MINI_\n    return m_EmbeddedCount != 0;\n#else\n    return m_EmbeddedCount != 0 || (m_pExternalMap != NULL && m_pExternalMap->IsLoaded());\n#endif\n}\nFX_WCHAR CPDF_CID2UnicodeMap::UnicodeFromCID(FX_WORD CID)\n{\n    if (m_Charset == CIDSET_UNICODE) {\n        return CID;\n    }\n    if (CID < m_EmbeddedCount) {\n        return m_pEmbeddedMap[CID];\n    }\n#ifdef _FPDFAPI_MINI_\n    return 0;\n#else\n    FX_LPCBYTE record = m_pExternalMap->GetRecord(CID);\n    if (record == NULL) {\n        return 0;\n    }\n    return *(FX_WORD*)record;\n#endif\n}\nvoid FPDFAPI_LoadCID2UnicodeMap(int charset, const FX_WORD*& pMap, FX_DWORD& count);\nvoid CPDF_CID2UnicodeMap::Load(CPDF_CMapManager* pMgr, int charset, FX_BOOL bPromptCJK)\n{\n    m_Charset = charset;\n    FPDFAPI_LoadCID2UnicodeMap(charset, m_pEmbeddedMap, m_EmbeddedCount);\n    if (m_EmbeddedCount) {\n        return;\n    }\n#ifndef _FPDFAPI_MINI_\n    FX_LPVOID pPackage = pMgr->GetPackage(bPromptCJK);\n    if (pPackage == NULL) {\n        return;\n    }\n    m_pExternalMap->LoadFile(pPackage, FX_BSTRC(\"CIDInfo_\") + g_CharsetNames[charset]);\n#endif\n}\n#include \"ttgsubtable.h\"\nCPDF_CIDFont::CPDF_CIDFont()\n{\n    m_pCMap = NULL;\n    m_pAllocatedCMap = NULL;\n    m_pCID2UnicodeMap = NULL;\n    m_pAnsiWidths = NULL;\n    m_pCIDToGIDMap = NULL;\n    m_bCIDIsGID = FALSE;\n    m_bAdobeCourierStd = FALSE;\n    m_pTTGSUBTable = NULL;\n    FXSYS_memset8(m_CharBBox, 0xff, 256 * sizeof(FX_SMALL_RECT));\n}\nCPDF_CIDFont::~CPDF_CIDFont()\n{\n    if (m_pAnsiWidths) {\n        FX_Free(m_pAnsiWidths);\n    }\n    if (m_pAllocatedCMap) {\n        delete m_pAllocatedCMap;\n    }\n    if (m_pCIDToGIDMap) {\n        delete m_pCIDToGIDMap;\n    }\n    if (m_pTTGSUBTable) {\n        delete m_pTTGSUBTable;\n    }\n}\nFX_WORD CPDF_CIDFont::CIDFromCharCode(FX_DWORD charcode) const\n{\n    if (m_pCMap == NULL) {\n        return (FX_WORD)charcode;\n    }\n    return m_pCMap->CIDFromCharCode(charcode);\n}\nFX_BOOL CPDF_CIDFont::IsVertWriting() const\n{\n    return m_pCMap ? m_pCMap->IsVertWriting() : FALSE;\n}\nextern FX_DWORD FPDFAPI_CharCodeFromCID(const FXCMAP_CMap* pMap, FX_WORD cid);\nstatic FX_DWORD _EmbeddedCharcodeFromUnicode(const FXCMAP_CMap* pEmbedMap, int charset, FX_WCHAR unicode)\n{\n    if (charset <= 0 || charset > 4) {\n        return 0;\n    }\n    CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();\n    const FX_WORD* pCodes = pFontGlobals->m_EmbeddedToUnicodes[charset].m_pMap;\n    if (pCodes == NULL) {\n        return 0;\n    }\n    int nCodes = pFontGlobals->m_EmbeddedToUnicodes[charset].m_Count;\n    for (int i = 0; i < nCodes; i++) {\n        if (pCodes[i] == unicode) {\n            FX_DWORD CharCode = FPDFAPI_CharCodeFromCID(pEmbedMap, i);\n            if (CharCode == 0) {\n                continue;\n            }\n            return CharCode;\n        }\n    }\n    return 0;\n}\nstatic FX_WCHAR _EmbeddedUnicodeFromCharcode(const FXCMAP_CMap* pEmbedMap, int charset, FX_DWORD charcode)\n{\n    if (charset <= 0 || charset > 4) {\n        return 0;\n    }\n    FX_WORD cid = FPDFAPI_CIDFromCharCode(pEmbedMap, charcode);\n    if (cid == 0) {\n        return 0;\n    }\n    CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();\n    const FX_WORD* pCodes = pFontGlobals->m_EmbeddedToUnicodes[charset].m_pMap;\n    if (pCodes == NULL) {\n        return 0;\n    }\n    if (cid < pFontGlobals->m_EmbeddedToUnicodes[charset].m_Count) {\n        return pCodes[cid];\n    }\n    return 0;\n}\nFX_WCHAR CPDF_CIDFont::_UnicodeFromCharCode(FX_DWORD charcode) const\n{\n    switch (m_pCMap->m_Coding) {\n        case CIDCODING_UCS2:\n        case CIDCODING_UTF16:\n            return (FX_WCHAR)charcode;\n        case CIDCODING_CID:\n            if (m_pCID2UnicodeMap == NULL || !m_pCID2UnicodeMap->IsLoaded()) {\n                return 0;\n            }\n            return m_pCID2UnicodeMap->UnicodeFromCID((FX_WORD)charcode);\n    }\n    if (!m_pCMap->IsLoaded() || m_pCID2UnicodeMap == NULL || !m_pCID2UnicodeMap->IsLoaded()) {\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\n        FX_WCHAR unicode;\n        int charsize = 1;\n        if (charcode > 255) {\n            charcode = (charcode % 256) * 256 + (charcode / 256);\n            charsize = 2;\n        }\n        int ret = FXSYS_MultiByteToWideChar(g_CharsetCPs[m_pCMap->m_Coding], 0, (FX_LPCSTR)&charcode, charsize, &unicode, 1);\n        if (ret != 1) {\n            return 0;\n        }\n        return unicode;\n#endif\n        if (m_pCMap->m_pEmbedMap) {\n            return _EmbeddedUnicodeFromCharcode(m_pCMap->m_pEmbedMap, m_pCMap->m_Charset, charcode);\n        } else {\n            return 0;\n        }\n    }\n    return m_pCID2UnicodeMap->UnicodeFromCID(CIDFromCharCode(charcode));\n}\nFX_DWORD CPDF_CIDFont::_CharCodeFromUnicode(FX_WCHAR unicode) const\n{\n    switch (m_pCMap->m_Coding) {\n        case CIDCODING_UNKNOWN:\n            return 0;\n        case CIDCODING_UCS2:\n        case CIDCODING_UTF16:\n            return unicode;\n        case CIDCODING_CID: {\n                if (m_pCID2UnicodeMap == NULL || !m_pCID2UnicodeMap->IsLoaded()) {\n                    return 0;\n                }\n                FX_DWORD CID = 0;\n                while (CID < 65536) {\n                    FX_WCHAR this_unicode = m_pCID2UnicodeMap->UnicodeFromCID((FX_WORD)CID);\n                    if (this_unicode == unicode) {\n                        return CID;\n                    }\n                    CID ++;\n                }\n                break;\n            }\n    }\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\n    FX_BYTE buffer[32];\n    int ret = FXSYS_WideCharToMultiByte(g_CharsetCPs[m_pCMap->m_Coding], 0, &unicode, 1, (char*)buffer, 4, NULL, NULL);\n    if (ret == 1) {\n        return buffer[0];\n    } else if (ret == 2) {\n        return buffer[0] * 256 + buffer[1];\n    }\n    return 0;\n#endif\n    if (unicode < 0x80) {\n        return (FX_DWORD)unicode;\n    } else {\n        if (m_pCMap->m_pEmbedMap) {\n            return _EmbeddedCharcodeFromUnicode(m_pCMap->m_pEmbedMap, m_pCMap->m_Charset, unicode);\n        } else {\n            return 0;\n        }\n    }\n}\nstatic void FT_UseCIDCharmap(FXFT_Face face, int coding)\n{\n    int encoding;\n    switch (coding) {\n        case CIDCODING_GB:\n            encoding = FXFT_ENCODING_GB2312;\n            break;\n        case CIDCODING_BIG5:\n            encoding = FXFT_ENCODING_BIG5;\n            break;\n        case CIDCODING_JIS:\n            encoding = FXFT_ENCODING_SJIS;\n            break;\n        case CIDCODING_KOREA:\n            encoding = FXFT_ENCODING_JOHAB;\n            break;\n        default:\n            encoding = FXFT_ENCODING_UNICODE;\n    }\n    int err = FXFT_Select_Charmap(face, encoding);\n    if (err) {\n        err = FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE);\n    }\n    if (err && FXFT_Get_Face_Charmaps(face)) {\n        FXFT_Set_Charmap(face, *FXFT_Get_Face_Charmaps(face));\n    }\n}\nFX_BOOL CPDF_CIDFont::_Load()\n{\n    if (m_pFontDict->GetString(FX_BSTRC(\"Subtype\")) == FX_BSTRC(\"TrueType\")) {\n        return LoadGB2312();\n    }\n    CPDF_Array* pFonts = m_pFontDict->GetArray(FX_BSTRC(\"DescendantFonts\"));\n    if (pFonts == NULL) {\n        return FALSE;\n    }\n    if (pFonts->GetCount() != 1) {\n        return FALSE;\n    }\n    CPDF_Dictionary* pCIDFontDict = pFonts->GetDict(0);\n    if (pCIDFontDict == NULL) {\n        return FALSE;\n    }\n    m_BaseFont = pCIDFontDict->GetString(FX_BSTRC(\"BaseFont\"));\n    if ((m_BaseFont.Compare(\"CourierStd\") == 0 || m_BaseFont.Compare(\"CourierStd-Bold\") == 0\n            || m_BaseFont.Compare(\"CourierStd-BoldOblique\") == 0 || m_BaseFont.Compare(\"CourierStd-Oblique\") == 0)\n            && !IsEmbedded()) {\n        m_bAdobeCourierStd = TRUE;\n    }\n    CPDF_Dictionary* pFontDesc = pCIDFontDict->GetDict(FX_BSTRC(\"FontDescriptor\"));\n    if (pFontDesc) {\n        LoadFontDescriptor(pFontDesc);\n    }\n    CPDF_Object* pEncoding = m_pFontDict->GetElementValue(FX_BSTRC(\"Encoding\"));\n    if (pEncoding == NULL) {\n        return FALSE;\n    }\n    CFX_ByteString subtype = pCIDFontDict->GetString(FX_BSTRC(\"Subtype\"));\n    m_bType1 = FALSE;\n    if (subtype == FX_BSTRC(\"CIDFontType0\")) {\n        m_bType1 = TRUE;\n    }\n    if (pEncoding->GetType() == PDFOBJ_NAME) {\n        CFX_ByteString cmap = pEncoding->GetString();\n        m_pCMap = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals()->m_CMapManager.GetPredefinedCMap(cmap,\n                  m_pFontFile && m_bType1);\n    } else if (pEncoding->GetType() == PDFOBJ_STREAM) {\n        m_pAllocatedCMap = m_pCMap = FX_NEW CPDF_CMap;\n        CPDF_Stream* pStream = (CPDF_Stream*)pEncoding;\n        CPDF_StreamAcc acc;\n        acc.LoadAllData(pStream, FALSE);\n        m_pCMap->LoadEmbedded(acc.GetData(), acc.GetSize());\n    } else {\n        return FALSE;\n    }\n    if (m_pCMap == NULL) {\n        return FALSE;\n    }\n    m_Charset = m_pCMap->m_Charset;\n    if (m_Charset == CIDSET_UNKNOWN) {\n        CPDF_Dictionary* pCIDInfo = pCIDFontDict->GetDict(FX_BSTRC(\"CIDSystemInfo\"));\n        if (pCIDInfo) {\n            m_Charset = _CharsetFromOrdering(pCIDInfo->GetString(FX_BSTRC(\"Ordering\")));\n        }\n    }\n    if (m_Charset != CIDSET_UNKNOWN)\n        m_pCID2UnicodeMap = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals()->m_CMapManager.GetCID2UnicodeMap(m_Charset,\n                            m_pFontFile == NULL && (m_pCMap->m_Coding == CIDCODING_CID || pCIDFontDict->KeyExist(FX_BSTRC(\"W\"))));\n    if (m_Font.GetFace()) {\n        if (m_bType1) {\n            FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE);\n        } else {\n            FT_UseCIDCharmap(m_Font.GetFace(), m_pCMap->m_Coding);\n        }\n    }\n    m_DefaultWidth = pCIDFontDict->GetInteger(FX_BSTRC(\"DW\"), 1000);\n    CPDF_Array* pWidthArray = pCIDFontDict->GetArray(FX_BSTRC(\"W\"));\n    if (pWidthArray) {\n        LoadMetricsArray(pWidthArray, m_WidthList, 1);\n    }\n    if (!IsEmbedded()) {\n        LoadSubstFont();\n    }\n    if (1) {\n        if (m_pFontFile || (GetSubstFont()->m_SubstFlags & FXFONT_SUBST_EXACT)) {\n            CPDF_Object* pmap = pCIDFontDict->GetElementValue(FX_BSTRC(\"CIDToGIDMap\"));\n            if (pmap) {\n                if (pmap->GetType() == PDFOBJ_STREAM) {\n                    m_pCIDToGIDMap = FX_NEW CPDF_StreamAcc;\n                    m_pCIDToGIDMap->LoadAllData((CPDF_Stream*)pmap, FALSE);\n                } else if (pmap->GetString() == FX_BSTRC(\"Identity\")) {\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n                    if (m_pFontFile) {\n                        m_bCIDIsGID = TRUE;\n                    }\n#else\n                    m_bCIDIsGID = TRUE;\n#endif\n                }\n            }\n        }\n    }\n    CheckFontMetrics();\n    if (IsVertWriting()) {\n        pWidthArray = pCIDFontDict->GetArray(FX_BSTRC(\"W2\"));\n        if (pWidthArray) {\n            LoadMetricsArray(pWidthArray, m_VertMetrics, 3);\n        }\n        CPDF_Array* pDefaultArray = pCIDFontDict->GetArray(FX_BSTRC(\"DW2\"));\n        if (pDefaultArray) {\n            m_DefaultVY = pDefaultArray->GetInteger(0);\n            m_DefaultW1 = pDefaultArray->GetInteger(1);\n        } else {\n            m_DefaultVY = 880;\n            m_DefaultW1 = -1000;\n        }\n    }\n    return TRUE;\n}\nFX_FLOAT _CIDTransformToFloat(FX_BYTE ch)\n{\n    if (ch < 128) {\n        return ch * 1.0f / 127;\n    }\n    return (-255 + ch) * 1.0f / 127;\n}\nvoid CPDF_CIDFont::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level)\n{\n    if (charcode < 256 && m_CharBBox[charcode].Right != -1) {\n        rect.bottom = m_CharBBox[charcode].Bottom;\n        rect.left = m_CharBBox[charcode].Left;\n        rect.right = m_CharBBox[charcode].Right;\n        rect.top = m_CharBBox[charcode].Top;\n        return;\n    }\n    FX_BOOL bVert = FALSE;\n    int glyph_index = GlyphFromCharCode(charcode, &bVert);\n    if (m_Font.m_Face == NULL) {\n        rect = FX_RECT(0, 0, 0, 0);\n    } else {\n        rect.left = rect.bottom = rect.right = rect.top = 0;\n        FXFT_Face face = m_Font.m_Face;\n        if (FXFT_Is_Face_Tricky(face)) {\n            int err = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);\n            if (!err) {\n                FXFT_BBox cbox;\n                FXFT_Glyph glyph;\n                err = FXFT_Get_Glyph(((FXFT_Face)face)->glyph, &glyph);\n                if (!err) {\n                    FXFT_Glyph_Get_CBox(glyph, FXFT_GLYPH_BBOX_PIXELS, &cbox);\n                    int pixel_size_x = ((FXFT_Face)face)->size->metrics.x_ppem;\n                    int\tpixel_size_y = ((FXFT_Face)face)->size->metrics.y_ppem;\n                    if (pixel_size_x == 0 || pixel_size_y == 0) {\n                        rect.left = cbox.xMin;\n                        rect.right = cbox.xMax;\n                        rect.top = cbox.yMax;\n                        rect.bottom = cbox.yMin;\n                    } else {\n                        rect.left = cbox.xMin * 1000 / pixel_size_x;\n                        rect.right = cbox.xMax * 1000 / pixel_size_x;\n                        rect.top = cbox.yMax * 1000 / pixel_size_y;\n                        rect.bottom = cbox.yMin * 1000 / pixel_size_y;\n                    }\n                    if (rect.top > FXFT_Get_Face_Ascender(face)) {\n                        rect.top = FXFT_Get_Face_Ascender(face);\n                    }\n                    if (rect.bottom < FXFT_Get_Face_Descender(face)) {\n                        rect.bottom = FXFT_Get_Face_Descender(face);\n                    }\n                    FXFT_Done_Glyph(glyph);\n                }\n            }\n        } else {\n            int err = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_NO_SCALE);\n            if (err == 0) {\n                rect.left = TT2PDF(FXFT_Get_Glyph_HoriBearingX(face), face);\n                rect.right = TT2PDF(FXFT_Get_Glyph_HoriBearingX(face) + FXFT_Get_Glyph_Width(face), face);\n                rect.top = TT2PDF(FXFT_Get_Glyph_HoriBearingY(face), face);\n                rect.top += rect.top / 64;\n                rect.bottom = TT2PDF(FXFT_Get_Glyph_HoriBearingY(face) - FXFT_Get_Glyph_Height(face), face);\n            }\n        }\n    }\n    if (m_pFontFile == NULL && m_Charset == CIDSET_JAPAN1) {\n        FX_WORD CID = CIDFromCharCode(charcode);\n        FX_LPCBYTE pTransform = GetCIDTransform(CID);\n        if (pTransform && !bVert) {\n            CFX_AffineMatrix matrix(_CIDTransformToFloat(pTransform[0]), _CIDTransformToFloat(pTransform[1]),\n                                    _CIDTransformToFloat(pTransform[2]), _CIDTransformToFloat(pTransform[3]),\n                                    _CIDTransformToFloat(pTransform[4]) * 1000 , _CIDTransformToFloat(pTransform[5]) * 1000);\n            CFX_FloatRect rect_f(rect);\n            rect_f.Transform(&matrix);\n            rect = rect_f.GetOutterRect();\n        }\n    }\n    if (charcode < 256) {\n        m_CharBBox[charcode].Bottom = (short)rect.bottom;\n        m_CharBBox[charcode].Left = (short)rect.left;\n        m_CharBBox[charcode].Right = (short)rect.right;\n        m_CharBBox[charcode].Top = (short)rect.top;\n    }\n}\nint CPDF_CIDFont::GetCharWidthF(FX_DWORD charcode, int level)\n{\n    if (m_pAnsiWidths && charcode < 0x80) {\n        return m_pAnsiWidths[charcode];\n    }\n    FX_WORD cid = CIDFromCharCode(charcode);\n    int size = m_WidthList.GetSize();\n    FX_DWORD* list = m_WidthList.GetData();\n    for (int i = 0; i < size; i += 3) {\n        if (cid >= list[i] && cid <= list[i + 1]) {\n            return (int)list[i + 2];\n        }\n    }\n    return m_DefaultWidth;\n}\nshort CPDF_CIDFont::GetVertWidth(FX_WORD CID) const\n{\n    FX_DWORD vertsize = m_VertMetrics.GetSize() / 5;\n    if (vertsize == 0) {\n        return m_DefaultW1;\n    }\n    const FX_DWORD* pTable = m_VertMetrics.GetData();\n    for (FX_DWORD i = 0; i < vertsize; i ++)\n        if (pTable[i * 5] <= CID && pTable[i * 5 + 1] >= CID) {\n            return (short)(int)pTable[i * 5 + 2];\n        }\n    return m_DefaultW1;\n}\nvoid CPDF_CIDFont::GetVertOrigin(FX_WORD CID, short& vx, short &vy) const\n{\n    FX_DWORD vertsize = m_VertMetrics.GetSize() / 5;\n    if (vertsize) {\n        const FX_DWORD* pTable = m_VertMetrics.GetData();\n        for (FX_DWORD i = 0; i < vertsize; i ++)\n            if (pTable[i * 5] <= CID && pTable[i * 5 + 1] >= CID) {\n                vx = (short)(int)pTable[i * 5 + 3];\n                vy = (short)(int)pTable[i * 5 + 4];\n                return;\n            }\n    }\n    FX_DWORD dwWidth = m_DefaultWidth;\n    int size = m_WidthList.GetSize();\n    const FX_DWORD* list = m_WidthList.GetData();\n    for (int i = 0; i < size; i += 3) {\n        if (CID >= list[i] && CID <= list[i + 1]) {\n            dwWidth = (FX_WORD)list[i + 2];\n            break;\n        }\n    }\n    vx = (short)dwWidth / 2;\n    vy = (short)m_DefaultVY;\n}\nint\tCPDF_CIDFont::GetGlyphIndex(FX_DWORD unicode, FX_BOOL *pVertGlyph)\n{\n    if (pVertGlyph) {\n        *pVertGlyph = FALSE;\n    }\n    int index = FXFT_Get_Char_Index(m_Font.m_Face, unicode );\n    if (unicode == 0x2502) {\n        return index;\n    }\n    if (index && IsVertWriting()) {\n        if (m_pTTGSUBTable) {\n            TT_uint32_t vindex = 0;\n            m_pTTGSUBTable->GetVerticalGlyph(index, &vindex);\n            if (vindex) {\n                index = vindex;\n                if (pVertGlyph) {\n                    *pVertGlyph = TRUE;\n                }\n            }\n            return index;\n        }\n        if (NULL == m_Font.m_pGsubData) {\n            unsigned long length = 0;\n            int error = FXFT_Load_Sfnt_Table( m_Font.m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, NULL, &length);\n            if (!error) {\n                m_Font.m_pGsubData = (unsigned char*)FX_Alloc(FX_BYTE, length);\n            }\n        }\n        int error = FXFT_Load_Sfnt_Table( m_Font.m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, m_Font.m_pGsubData, NULL);\n        if (!error && m_Font.m_pGsubData) {\n            m_pTTGSUBTable = FX_NEW CFX_CTTGSUBTable;\n            m_pTTGSUBTable->LoadGSUBTable((FT_Bytes)m_Font.m_pGsubData);\n            TT_uint32_t vindex = 0;\n            m_pTTGSUBTable->GetVerticalGlyph(index, &vindex);\n            if (vindex) {\n                index = vindex;\n                if (pVertGlyph) {\n                    *pVertGlyph = TRUE;\n                }\n            }\n        }\n        return index;\n    }\n    if (pVertGlyph) {\n        *pVertGlyph = FALSE;\n    }\n    return index;\n}\nint CPDF_CIDFont::GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph)\n{\n    if (pVertGlyph) {\n        *pVertGlyph = FALSE;\n    }\n    if (m_pFontFile == NULL && m_pCIDToGIDMap == NULL) {\n        FX_WORD cid = CIDFromCharCode(charcode);\n        FX_WCHAR unicode = 0;\n        if (m_bCIDIsGID) {\n#if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_\n            return cid;\n#else\n            if (m_Flags & PDFFONT_SYMBOLIC) {\n                return cid;\n            }\n            CFX_WideString uni_str = UnicodeFromCharCode(charcode);\n            if (uni_str.IsEmpty()) {\n                return cid;\n            }\n            unicode = uni_str.GetAt(0);\n#endif\n        } else {\n            if (cid && m_pCID2UnicodeMap && m_pCID2UnicodeMap->IsLoaded()) {\n                unicode = m_pCID2UnicodeMap->UnicodeFromCID(cid);\n            }\n            if (unicode == 0) {\n                unicode = _UnicodeFromCharCode(charcode);\n            }\n            if (unicode == 0 && !(m_Flags & PDFFONT_SYMBOLIC)) {\n                unicode = UnicodeFromCharCode(charcode).GetAt(0);\n            }\n        }\n        if (unicode == 0) {\n            if (!m_bAdobeCourierStd) {\n                return charcode == 0 ? -1 : (int)charcode;\n            }\n            charcode += 31;\n            int index = 0, iBaseEncoding;\n            FX_BOOL bMSUnicode = FT_UseTTCharmap(m_Font.m_Face, 3, 1);\n            FX_BOOL bMacRoman = FALSE;\n            if (!bMSUnicode) {\n                bMacRoman = FT_UseTTCharmap(m_Font.m_Face, 1, 0);\n            }\n            iBaseEncoding = PDFFONT_ENCODING_STANDARD;\n            if (bMSUnicode) {\n                iBaseEncoding = PDFFONT_ENCODING_WINANSI;\n            } else if (bMacRoman) {\n                iBaseEncoding = PDFFONT_ENCODING_MACROMAN;\n            }\n            FX_LPCSTR name = GetAdobeCharName(iBaseEncoding, NULL, charcode);\n            if (name == NULL) {\n                return charcode == 0 ? -1 : (int)charcode;\n            }\n            FX_WORD unicode = PDF_UnicodeFromAdobeName(name);\n            if (unicode) {\n                if (bMSUnicode) {\n                    index = FXFT_Get_Char_Index(m_Font.m_Face, unicode);\n                } else if (bMacRoman) {\n                    FX_DWORD maccode = FT_CharCodeFromUnicode(FXFT_ENCODING_APPLE_ROMAN, unicode);\n                    index = !maccode ? FXFT_Get_Name_Index(m_Font.m_Face, (char *)name) : FXFT_Get_Char_Index(m_Font.m_Face, maccode);\n                } else {\n                    return FXFT_Get_Char_Index(m_Font.m_Face, unicode);\n                }\n            } else {\n                return charcode == 0 ? -1 : (int)charcode;\n            }\n            if (index == 0 || index == 0xffff) {\n                return charcode == 0 ? -1 : (int)charcode;\n            } else {\n                return index;\n            }\n        }\n        if (m_Charset == CIDSET_JAPAN1) {\n            if (unicode == '\\\\') {\n                unicode = '/';\n            }\n#if !defined(_FPDFAPI_MINI_) && _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_\n            else if (unicode == 0xa5) {\n                unicode = 0x5c;\n            }\n#endif\n        }\n        if (m_Font.m_Face == NULL) {\n            return unicode;\n        }\n        int err = FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE);\n        if (err != 0) {\n            int i;\n            for (i = 0; i < FXFT_Get_Face_CharmapCount(m_Font.m_Face); i ++) {\n                FX_DWORD ret = FT_CharCodeFromUnicode(FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(m_Font.m_Face)[i]), (FX_WCHAR)charcode);\n                if (ret == 0) {\n                    continue;\n                }\n                FXFT_Set_Charmap(m_Font.m_Face, FXFT_Get_Face_Charmaps(m_Font.m_Face)[i]);\n                unicode = (FX_WCHAR)ret;\n                break;\n            }\n            if (i == FXFT_Get_Face_CharmapCount(m_Font.m_Face) && i) {\n                FXFT_Set_Charmap(m_Font.m_Face, FXFT_Get_Face_Charmaps(m_Font.m_Face)[0]);\n                unicode = (FX_WCHAR)charcode;\n            }\n        }\n        if (FXFT_Get_Face_Charmap(m_Font.m_Face)) {\n            int index = GetGlyphIndex(unicode, pVertGlyph);\n            if (index == 0) {\n                return -1;\n            }\n            return index;\n        }\n        return unicode ;\n    }\n    if (m_Font.m_Face == NULL) {\n        return -1;\n    }\n    FX_WORD cid = CIDFromCharCode(charcode);\n    if (m_bType1) {\n        if (NULL == m_pCIDToGIDMap) {\n            return cid;\n        }\n    } else {\n        if (m_pCIDToGIDMap == NULL) {\n            if (m_pFontFile && m_pCMap->m_pMapping == NULL) {\n                return cid;\n            }\n            if (m_pCMap->m_Coding == CIDCODING_UNKNOWN || FXFT_Get_Face_Charmap(m_Font.m_Face) == NULL) {\n                return cid;\n            }\n            if (FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmap(m_Font.m_Face)) == FXFT_ENCODING_UNICODE) {\n                CFX_WideString unicode_str = UnicodeFromCharCode(charcode);\n                if (unicode_str.IsEmpty()) {\n                    return -1;\n                }\n                charcode = unicode_str.GetAt(0);\n            }\n            return GetGlyphIndex(charcode, pVertGlyph);\n        }\n    }\n    FX_DWORD byte_pos = cid * 2;\n    if (byte_pos + 2 > m_pCIDToGIDMap->GetSize()) {\n        return -1;\n    }\n    FX_LPCBYTE pdata = m_pCIDToGIDMap->GetData() + byte_pos;\n    return pdata[0] * 256 + pdata[1];\n}\nFX_DWORD CPDF_CIDFont::GetNextChar(FX_LPCSTR pString, int& offset) const\n{\n    return m_pCMap->GetNextChar(pString, offset);\n}\nint CPDF_CIDFont::GetCharSize(FX_DWORD charcode) const\n{\n    return m_pCMap->GetCharSize(charcode);\n}\nint CPDF_CIDFont::CountChar(FX_LPCSTR pString, int size) const\n{\n    return m_pCMap->CountChar(pString, size);\n}\nint CPDF_CIDFont::AppendChar(FX_LPSTR str, FX_DWORD charcode) const\n{\n    return m_pCMap->AppendChar(str, charcode);\n}\nFX_BOOL CPDF_CIDFont::IsUnicodeCompatible() const\n{\n    if (!m_pCMap->IsLoaded() || m_pCID2UnicodeMap == NULL || !m_pCID2UnicodeMap->IsLoaded()) {\n        return m_pCMap->m_Coding != CIDCODING_UNKNOWN;\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_CIDFont::IsFontStyleFromCharCode(FX_DWORD charcode) const\n{\n    return TRUE;\n}\nvoid CPDF_CIDFont::LoadSubstFont()\n{\n    m_Font.LoadSubst(m_BaseFont, !m_bType1, m_Flags, m_StemV * 5, m_ItalicAngle, g_CharsetCPs[m_Charset], IsVertWriting());\n}\nvoid CPDF_CIDFont::LoadMetricsArray(CPDF_Array* pArray, CFX_DWordArray& result, int nElements)\n{\n    int width_status = 0;\n    int iCurElement = 0;\n    int first_code = 0, last_code;\n    FX_DWORD count = pArray->GetCount();\n    for (FX_DWORD i = 0; i < count; i ++) {\n        CPDF_Object* pObj = pArray->GetElementValue(i);\n        if (pObj == NULL) {\n            continue;\n        }\n        if (pObj->GetType() == PDFOBJ_ARRAY) {\n            if (width_status != 1) {\n                return;\n            }\n            CPDF_Array* pArray = (CPDF_Array*)pObj;\n            FX_DWORD count = pArray->GetCount();\n            for (FX_DWORD j = 0; j < count; j += nElements) {\n                result.Add(first_code);\n                result.Add(first_code);\n                for (int k = 0; k < nElements; k ++) {\n                    result.Add(pArray->GetInteger(j + k));\n                }\n                first_code ++;\n            }\n            width_status = 0;\n        } else {\n            if (width_status == 0) {\n                first_code = pObj->GetInteger();\n                width_status = 1;\n            } else if (width_status == 1) {\n                last_code = pObj->GetInteger();\n                width_status = 2;\n                iCurElement = 0;\n            } else {\n                if (!iCurElement) {\n                    result.Add(first_code);\n                    result.Add(last_code);\n                }\n                result.Add(pObj->GetInteger());\n                iCurElement ++;\n                if (iCurElement == nElements) {\n                    width_status = 0;\n                }\n            }\n        }\n    }\n}\nFX_BOOL CPDF_CIDFont::LoadGB2312()\n{\n    m_BaseFont = m_pFontDict->GetString(FX_BSTRC(\"BaseFont\"));\n    CPDF_Dictionary* pFontDesc = m_pFontDict->GetDict(FX_BSTRC(\"FontDescriptor\"));\n    if (pFontDesc) {\n        LoadFontDescriptor(pFontDesc);\n    }\n    m_Charset = CIDSET_GB1;\n    m_bType1 = FALSE;\n    m_pCMap = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals()->m_CMapManager.GetPredefinedCMap(\n                  FX_BSTRC(\"GBK-EUC-H\"), FALSE);\n    m_pCID2UnicodeMap = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals()->m_CMapManager.GetCID2UnicodeMap(m_Charset, FALSE);\n    if (!IsEmbedded()) {\n        LoadSubstFont();\n    }\n    CheckFontMetrics();\n    m_DefaultWidth = 1000;\n    m_pAnsiWidths = FX_Alloc(FX_WORD, 128);\n    for (int i = 32; i < 127; i ++) {\n        m_pAnsiWidths[i] = 500;\n    }\n    return TRUE;\n}\nconst struct _CIDTransform {\n    FX_WORD\t\tCID;\n    FX_BYTE\t\ta, b, c, d, e, f;\n}\nJapan1_VertCIDs[] = {\n    {97, 129, 0, 0, 127, 55, 0},\n    {7887, 127, 0, 0, 127, 76, 89},\n    {7888, 127, 0, 0, 127, 79, 94},\n    {7889, 0, 129, 127, 0, 17, 127},\n    {7890, 0, 129, 127, 0, 17, 127},\n    {7891, 0, 129, 127, 0, 17, 127},\n    {7892, 0, 129, 127, 0, 17, 127},\n    {7893, 0, 129, 127, 0, 17, 127},\n    {7894, 0, 129, 127, 0, 17, 127},\n    {7895, 0, 129, 127, 0, 17, 127},\n    {7896, 0, 129, 127, 0, 17, 127},\n    {7897, 0, 129, 127, 0, 17, 127},\n    {7898, 0, 129, 127, 0, 17, 127},\n    {7899, 0, 129, 127, 0, 17, 104},\n    {7900, 0, 129, 127, 0, 17, 127},\n    {7901, 0, 129, 127, 0, 17, 104},\n    {7902, 0, 129, 127, 0, 17, 127},\n    {7903, 0, 129, 127, 0, 17, 127},\n    {7904, 0, 129, 127, 0, 17, 127},\n    {7905, 0, 129, 127, 0, 17, 114},\n    {7906, 0, 129, 127, 0, 17, 127},\n    {7907, 0, 129, 127, 0, 17, 127},\n    {7908, 0, 129, 127, 0, 17, 127},\n    {7909, 0, 129, 127, 0, 17, 127},\n    {7910, 0, 129, 127, 0, 17, 127},\n    {7911, 0, 129, 127, 0, 17, 127},\n    {7912, 0, 129, 127, 0, 17, 127},\n    {7913, 0, 129, 127, 0, 17, 127},\n    {7914, 0, 129, 127, 0, 17, 127},\n    {7915, 0, 129, 127, 0, 17, 114},\n    {7916, 0, 129, 127, 0, 17, 127},\n    {7917, 0, 129, 127, 0, 17, 127},\n    {7918, 127, 0, 0, 127, 18, 25},\n    {7919, 127, 0, 0, 127, 18, 25},\n    {7920, 127, 0, 0, 127, 18, 25},\n    {7921, 127, 0, 0, 127, 18, 25},\n    {7922, 127, 0, 0, 127, 18, 25},\n    {7923, 127, 0, 0, 127, 18, 25},\n    {7924, 127, 0, 0, 127, 18, 25},\n    {7925, 127, 0, 0, 127, 18, 25},\n    {7926, 127, 0, 0, 127, 18, 25},\n    {7927, 127, 0, 0, 127, 18, 25},\n    {7928, 127, 0, 0, 127, 18, 25},\n    {7929, 127, 0, 0, 127, 18, 25},\n    {7930, 127, 0, 0, 127, 18, 25},\n    {7931, 127, 0, 0, 127, 18, 25},\n    {7932, 127, 0, 0, 127, 18, 25},\n    {7933, 127, 0, 0, 127, 18, 25},\n    {7934, 127, 0, 0, 127, 18, 25},\n    {7935, 127, 0, 0, 127, 18, 25},\n    {7936, 127, 0, 0, 127, 18, 25},\n    {7937, 127, 0, 0, 127, 18, 25},\n    {7938, 127, 0, 0, 127, 18, 25},\n    {7939, 127, 0, 0, 127, 18, 25},\n    {8720, 0, 129, 127, 0, 19, 102},\n    {8721, 0, 129, 127, 0, 13, 127},\n    {8722, 0, 129, 127, 0, 19, 108},\n    {8723, 0, 129, 127, 0, 19, 102},\n    {8724, 0, 129, 127, 0, 19, 102},\n    {8725, 0, 129, 127, 0, 19, 102},\n    {8726, 0, 129, 127, 0, 19, 102},\n    {8727, 0, 129, 127, 0, 19, 102},\n    {8728, 0, 129, 127, 0, 19, 114},\n    {8729, 0, 129, 127, 0, 19, 114},\n    {8730, 0, 129, 127, 0, 38, 108},\n    {8731, 0, 129, 127, 0, 13, 108},\n    {8732, 0, 129, 127, 0, 19, 108},\n    {8733, 0, 129, 127, 0, 19, 108},\n    {8734, 0, 129, 127, 0, 19, 108},\n    {8735, 0, 129, 127, 0, 19, 108},\n    {8736, 0, 129, 127, 0, 19, 102},\n    {8737, 0, 129, 127, 0, 19, 102},\n    {8738, 0, 129, 127, 0, 19, 102},\n    {8739, 0, 129, 127, 0, 19, 102},\n    {8740, 0, 129, 127, 0, 19, 102},\n    {8741, 0, 129, 127, 0, 19, 102},\n    {8742, 0, 129, 127, 0, 19, 102},\n    {8743, 0, 129, 127, 0, 19, 102},\n    {8744, 0, 129, 127, 0, 19, 102},\n    {8745, 0, 129, 127, 0, 19, 102},\n    {8746, 0, 129, 127, 0, 19, 114},\n    {8747, 0, 129, 127, 0, 19, 114},\n    {8748, 0, 129, 127, 0, 19, 102},\n    {8749, 0, 129, 127, 0, 19, 102},\n    {8750, 0, 129, 127, 0, 19, 102},\n    {8751, 0, 129, 127, 0, 19, 102},\n    {8752, 0, 129, 127, 0, 19, 102},\n    {8753, 0, 129, 127, 0, 19, 102},\n    {8754, 0, 129, 127, 0, 19, 102},\n    {8755, 0, 129, 127, 0, 19, 102},\n    {8756, 0, 129, 127, 0, 19, 102},\n    {8757, 0, 129, 127, 0, 19, 102},\n    {8758, 0, 129, 127, 0, 19, 102},\n    {8759, 0, 129, 127, 0, 19, 102},\n    {8760, 0, 129, 127, 0, 19, 102},\n    {8761, 0, 129, 127, 0, 19, 102},\n    {8762, 0, 129, 127, 0, 19, 102},\n    {8763, 0, 129, 127, 0, 19, 102},\n    {8764, 0, 129, 127, 0, 19, 102},\n    {8765, 0, 129, 127, 0, 19, 102},\n    {8766, 0, 129, 127, 0, 19, 102},\n    {8767, 0, 129, 127, 0, 19, 102},\n    {8768, 0, 129, 127, 0, 19, 102},\n    {8769, 0, 129, 127, 0, 19, 102},\n    {8770, 0, 129, 127, 0, 19, 102},\n    {8771, 0, 129, 127, 0, 19, 102},\n    {8772, 0, 129, 127, 0, 19, 102},\n    {8773, 0, 129, 127, 0, 19, 102},\n    {8774, 0, 129, 127, 0, 19, 102},\n    {8775, 0, 129, 127, 0, 19, 102},\n    {8776, 0, 129, 127, 0, 19, 102},\n    {8777, 0, 129, 127, 0, 19, 102},\n    {8778, 0, 129, 127, 0, 19, 102},\n    {8779, 0, 129, 127, 0, 19, 114},\n    {8780, 0, 129, 127, 0, 19, 108},\n    {8781, 0, 129, 127, 0, 19, 114},\n    {8782, 0, 129, 127, 0, 13, 114},\n    {8783, 0, 129, 127, 0, 19, 108},\n    {8784, 0, 129, 127, 0, 13, 114},\n    {8785, 0, 129, 127, 0, 19, 108},\n    {8786, 0, 129, 127, 0, 19, 108},\n    {8787, 0, 129, 127, 0, 19, 108},\n    {8788, 0, 129, 127, 0, 19, 108},\n    {8789, 0, 129, 127, 0, 19, 108},\n    {8790, 0, 129, 127, 0, 19, 108},\n    {8791, 0, 129, 127, 0, 19, 108},\n    {8792, 0, 129, 127, 0, 19, 108},\n    {8793, 0, 129, 127, 0, 19, 108},\n    {8794, 0, 129, 127, 0, 19, 108},\n    {8795, 0, 129, 127, 0, 19, 108},\n    {8796, 0, 129, 127, 0, 19, 108},\n    {8797, 0, 129, 127, 0, 19, 108},\n    {8798, 0, 129, 127, 0, 19, 108},\n    {8799, 0, 129, 127, 0, 19, 108},\n    {8800, 0, 129, 127, 0, 19, 108},\n    {8801, 0, 129, 127, 0, 19, 108},\n    {8802, 0, 129, 127, 0, 19, 108},\n    {8803, 0, 129, 127, 0, 19, 108},\n    {8804, 0, 129, 127, 0, 19, 108},\n    {8805, 0, 129, 127, 0, 19, 108},\n    {8806, 0, 129, 127, 0, 19, 108},\n    {8807, 0, 129, 127, 0, 19, 108},\n    {8808, 0, 129, 127, 0, 19, 108},\n    {8809, 0, 129, 127, 0, 19, 108},\n    {8810, 0, 129, 127, 0, 19, 108},\n    {8811, 0, 129, 127, 0, 19, 114},\n    {8812, 0, 129, 127, 0, 19, 102},\n    {8813, 0, 129, 127, 0, 19, 114},\n    {8814, 0, 129, 127, 0, 76, 102},\n    {8815, 0, 129, 127, 0, 13, 121},\n    {8816, 0, 129, 127, 0, 19, 114},\n    {8817, 0, 129, 127, 0, 19, 127},\n    {8818, 0, 129, 127, 0, 19, 114},\n    {8819, 0, 129, 127, 0, 218, 108},\n};\nFX_LPCBYTE CPDF_CIDFont::GetCIDTransform(FX_WORD CID) const\n{\n    if (m_Charset != CIDSET_JAPAN1 || m_pFontFile != NULL) {\n        return NULL;\n    }\n    int begin = 0;\n    int end = sizeof Japan1_VertCIDs / sizeof(struct _CIDTransform) - 1;\n    while (begin <= end) {\n        int middle = (begin + end) / 2;\n        FX_WORD middlecode = Japan1_VertCIDs[middle].CID;\n        if (middlecode > CID) {\n            end = middle - 1;\n        } else if (middlecode < CID) {\n            begin = middle + 1;\n        } else {\n            return &Japan1_VertCIDs[middle].a;\n        }\n    }\n    return NULL;\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_font/fpdf_font_utility.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_module.h\"\n#include \"../../../include/fpdfapi/fpdf_resource.h\"\n#include \"../../../include/fxcodec/fx_codec.h\"\n#include \"font_int.h\"\n#ifndef _FPDFAPI_MINI_\ntypedef struct {\n    FXSYS_FILE*\tm_pFile;\n    int\t\tm_nFiles;\n    int\t\tm_IndexSize;\n    int\t\tm_IndexOffset;\n} FXFC_PACKAGE;\nFX_LPVOID FXFC_LoadPackage(FX_LPCSTR name)\n{\n    FXSYS_FILE* file = FXSYS_fopen(name, (FX_LPCSTR)\"rb\");\n    if (file == NULL) {\n        return NULL;\n    }\n    FX_BYTE buf[256];\n    size_t read = FXSYS_fread(buf, 1, 20, file);\n    if (*(FX_DWORD*)buf != 0x43465846) {\n        FXSYS_fclose(file);\n        return NULL;\n    }\n    FXFC_PACKAGE* pPackage = FX_Alloc(FXFC_PACKAGE, 1);\n    pPackage->m_pFile = file;\n    pPackage->m_nFiles = *(int*)(buf + 8);\n    pPackage->m_IndexSize = *(int*)(buf + 12);\n    pPackage->m_IndexOffset = *(int*)(buf + 16);\n    return pPackage;\n}\nvoid FXFC_ClosePackage(FX_LPVOID p)\n{\n    FXFC_PACKAGE* pPackage = (FXFC_PACKAGE*)p;\n    FXSYS_fclose(pPackage->m_pFile);\n    FX_Free(pPackage);\n}\nFX_BOOL FXFC_LoadFile(FX_LPVOID p, FX_LPCSTR name, FX_LPBYTE& pBuffer, FX_DWORD& size)\n{\n    FXFC_PACKAGE* pPackage = (FXFC_PACKAGE*)p;\n    FXSYS_fseek(pPackage->m_pFile, pPackage->m_IndexOffset, FXSYS_SEEK_SET);\n    FX_BYTE buf[128];\n    size_t read = 0;\n    for (int i = 0; i < pPackage->m_nFiles; i ++) {\n        read = FXSYS_fread(buf, pPackage->m_IndexSize, 1, pPackage->m_pFile);\n        if (FXSYS_stricmp((FX_LPCSTR)buf, name) == 0) {\n            FX_DWORD offset = *(FX_DWORD*)&buf[64];\n            size = *(FX_DWORD*)&buf[68];\n            pBuffer = FX_Alloc(FX_BYTE, size);\n            FXSYS_fseek(pPackage->m_pFile, offset, FXSYS_SEEK_SET);\n            read = FXSYS_fread(pBuffer, size, 1, pPackage->m_pFile);\n            if (buf[72]) {\n                FX_DWORD orig_size;\n                FX_LPBYTE comp_buf = pBuffer;\n                CPDF_ModuleMgr::Get()->GetFlateModule()->FlateOrLZWDecode(FALSE, comp_buf, size, FALSE,\n                        0, 0, 0, 0, 0, pBuffer, orig_size);\n                FX_Free(comp_buf);\n                size = orig_size;\n            }\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nFX_BOOL CPDF_FXMP::LoadFile(FX_LPVOID pPackage, FX_LPCSTR fileid)\n{\n    if (m_pHeader) {\n        FX_Free(m_pHeader);\n        m_pHeader = NULL;\n    }\n    m_pTable = NULL;\n    FX_DWORD size;\n    if (!FXFC_LoadFile(pPackage, fileid, (FX_LPBYTE&)m_pHeader, size)) {\n        return FALSE;\n    }\n    if (FXSYS_memcmp32(m_pHeader, \"FXMP\", 4)) {\n        return FALSE;\n    }\n    m_pTable = (FX_LPBYTE)m_pHeader + m_pHeader->dwDataOffset;\n    return TRUE;\n}\nFX_LPBYTE CPDF_FXMP::GetRecord(FX_DWORD index)\n{\n    if (m_pTable == NULL) {\n        return NULL;\n    }\n    if ((int)index < (int)m_pHeader->dwStartIndex || index > m_pHeader->dwEndIndex) {\n        return NULL;\n    }\n    return m_pTable + (index - m_pHeader->dwStartIndex) * m_pHeader->dwRecordSize;\n}\n#endif\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_font/ttgsubtable.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxge/fx_ge.h\"\n#include \"../../../include/fxge/fx_freetype.h\"\n#include \"ttgsubtable.h\"\nCFX_GlyphMap::CFX_GlyphMap()\n{\n}\nCFX_GlyphMap::~CFX_GlyphMap()\n{\n}\nextern \"C\" {\n    static int _CompareInt(const void* p1, const void* p2)\n    {\n        return (*(FX_DWORD*)p1) - (*(FX_DWORD*)p2);\n    }\n};\nstruct _IntPair {\n    FX_INT32 key;\n    FX_INT32 value;\n};\nvoid CFX_GlyphMap::SetAt(int key, int value)\n{\n    FX_DWORD count = m_Buffer.GetSize() / sizeof(_IntPair);\n    _IntPair* buf = (_IntPair*)m_Buffer.GetBuffer();\n    _IntPair pair = {key, value};\n    if (count == 0 || key > buf[count - 1].key) {\n        m_Buffer.AppendBlock(&pair, sizeof(_IntPair));\n        return;\n    }\n    int low = 0, high = count - 1;\n    while (low <= high) {\n        int mid = (low + high) / 2;\n        if (buf[mid].key < key) {\n            low = mid + 1;\n        } else if (buf[mid].key > key) {\n            high = mid - 1;\n        } else {\n            buf[mid].value = value;\n            return;\n        }\n    }\n    m_Buffer.InsertBlock(low * sizeof(_IntPair), &pair, sizeof(_IntPair));\n}\nFX_BOOL CFX_GlyphMap::Lookup(int key, int &value)\n{\n    FX_LPVOID pResult = FXSYS_bsearch(&key, m_Buffer.GetBuffer(), m_Buffer.GetSize() / sizeof(_IntPair),\n                                      sizeof(_IntPair), _CompareInt);\n    if (pResult == NULL) {\n        return FALSE;\n    }\n    value = ((FX_DWORD*)pResult)[1];\n    return TRUE;\n}\nbool CFX_CTTGSUBTable::LoadGSUBTable(FT_Bytes gsub)\n{\n    header.Version = gsub[0] << 24 | gsub[1] << 16 | gsub[2] << 8 | gsub[3];\n    if(header.Version != 0x00010000) {\n        return false;\n    }\n    header.ScriptList  = gsub[4] << 8 | gsub[5];\n    header.FeatureList = gsub[6] << 8 | gsub[7];\n    header.LookupList  = gsub[8] << 8 | gsub[9];\n    return Parse(\n               &gsub[header.ScriptList],\n               &gsub[header.FeatureList],\n               &gsub[header.LookupList]);\n}\nbool CFX_CTTGSUBTable::GetVerticalGlyph(TT_uint32_t glyphnum, TT_uint32_t *vglyphnum)\n{\n    TT_uint32_t tag[] = {\n        (TT_uint8_t)'v' << 24 |\n        (TT_uint8_t)'r' << 16 |\n        (TT_uint8_t)'t' <<  8 |\n        (TT_uint8_t)'2',\n        (TT_uint8_t)'v' << 24 |\n        (TT_uint8_t)'e' << 16 |\n        (TT_uint8_t)'r' <<  8 |\n        (TT_uint8_t)'t',\n    };\n    if (!m_bFeautureMapLoad) {\n        for (int i = 0; i < ScriptList.ScriptCount; i++) {\n            for (int j = 0; j <\t(ScriptList.ScriptRecord + i)->Script.LangSysCount; ++j) {\n                for (int k = 0; k < ((ScriptList.ScriptRecord + i)->Script.LangSysRecord + j)->LangSys.FeatureCount; ++k) {\n                    FX_DWORD index = *(((ScriptList.ScriptRecord + i)->Script.LangSysRecord + j)->LangSys.FeatureIndex + k);\n                    if (FeatureList.FeatureRecord[index].FeatureTag == tag[0] || FeatureList.FeatureRecord[index].FeatureTag == tag[1]) {\n                        FX_DWORD value;\n                        if (!m_featureMap.Lookup(index, value)) {\n                            m_featureMap.SetAt(index, index);\n                        }\n                    }\n                }\n            }\n        }\n        if (!m_featureMap.GetStartPosition()) {\n            for (int i = 0; i < FeatureList.FeatureCount; i ++) {\n                if (FeatureList.FeatureRecord[i].FeatureTag == tag[0] || FeatureList.FeatureRecord[i].FeatureTag == tag[1]) {\n                    FX_DWORD value;\n                    if (!m_featureMap.Lookup(i, value)) {\n                        m_featureMap.SetAt(i, i);\n                    }\n                }\n            }\n        }\n        m_bFeautureMapLoad = TRUE;\n    }\n    FX_POSITION pos = m_featureMap.GetStartPosition();\n    while (pos) {\n        FX_DWORD index, value;\n        m_featureMap.GetNextAssoc(pos, index, value);\n        if(GetVerticalGlyphSub(glyphnum, vglyphnum,\t&FeatureList.FeatureRecord[value].Feature)) {\n            return true;\n        }\n    }\n    return false;\n}\nbool CFX_CTTGSUBTable::GetVerticalGlyphSub(\n    TT_uint32_t glyphnum,\n    TT_uint32_t *vglyphnum,\n    struct TFeature *Feature)\n{\n    for(int i = 0; i < Feature->LookupCount; i++) {\n        int index = Feature->LookupListIndex[i];\n        if(index < 0 || LookupList.LookupCount < index) {\n            continue;\n        }\n        if(LookupList.Lookup[index].LookupType == 1) {\n            if(GetVerticalGlyphSub2(\n                        glyphnum,\n                        vglyphnum,\n                        &LookupList.Lookup[index])) {\n                return true;\n            }\n        }\n    }\n    return false;\n}\nbool CFX_CTTGSUBTable::GetVerticalGlyphSub2(\n    TT_uint32_t glyphnum,\n    TT_uint32_t *vglyphnum,\n    struct TLookup *Lookup)\n{\n    for(int i = 0; i < Lookup->SubTableCount; i++) {\n        switch(Lookup->SubTable[i]->SubstFormat) {\n            case 1: {\n                    TSingleSubstFormat1 *tbl1 = (TSingleSubstFormat1*)Lookup->SubTable[i];\n                    if(GetCoverageIndex(tbl1->Coverage, glyphnum) >= 0) {\n                        *vglyphnum = glyphnum + tbl1->DeltaGlyphID;\n                        return true;\n                    }\n                    break;\n                }\n            case 2: {\n                    TSingleSubstFormat2 *tbl2 = (TSingleSubstFormat2*)Lookup->SubTable[i];\n                    int index = -1;\n                    index = GetCoverageIndex(tbl2->Coverage, glyphnum);\n                    if(0 <= index && index < tbl2->GlyphCount) {\n                        *vglyphnum = tbl2->Substitute[index];\n                        return true;\n                    }\n                    break;\n                }\n        }\n    }\n    return false;\n}\nint CFX_CTTGSUBTable::GetCoverageIndex(struct TCoverageFormatBase *Coverage, TT_uint32_t g)\n{\n    int i = 0;\n    if(Coverage == NULL) {\n        return -1;\n    }\n    switch(Coverage->CoverageFormat) {\n        case 1: {\n                TCoverageFormat1 *c1 = (TCoverageFormat1*)Coverage;\n                for(i = 0; i < c1->GlyphCount; i++) {\n                    if((TT_uint32_t)c1->GlyphArray[i] == g) {\n                        return i;\n                    }\n                }\n                return -1;\n            }\n        case 2: {\n                TCoverageFormat2 *c2 = (TCoverageFormat2*)Coverage;\n                for(i = 0; i < c2->RangeCount; i++) {\n                    TT_uint32_t s = c2->RangeRecord[i].Start;\n                    TT_uint32_t e = c2->RangeRecord[i].End;\n                    TT_uint32_t si = c2->RangeRecord[i].StartCoverageIndex;\n                    if (s <= g && g <= e) {\n                        return si + g - s;\n                    }\n                }\n                return -1;\n            }\n    }\n    return -1;\n}\nbool CFX_CTTGSUBTable::Parse(\n    FT_Bytes scriptlist,\n    FT_Bytes featurelist,\n    FT_Bytes lookuplist)\n{\n    ParseScriptList(scriptlist, &ScriptList);\n    ParseFeatureList(featurelist, &FeatureList);\n    ParseLookupList(lookuplist, &LookupList);\n    return true;\n}\nvoid CFX_CTTGSUBTable::ParseScriptList(FT_Bytes raw, struct TScriptList *rec)\n{\n    int i;\n    FT_Bytes sp = raw;\n    rec->ScriptCount = GetUInt16(sp);\n    if(rec->ScriptCount <= 0) {\n        return;\n    }\n    rec->ScriptRecord = new struct TScriptRecord[rec->ScriptCount];\n    for(i = 0; i < rec->ScriptCount; i++) {\n        rec->ScriptRecord[i].ScriptTag = GetUInt32(sp);\n        TT_uint16_t offset = GetUInt16(sp);\n        ParseScript(\n            &raw[offset],\n            &rec->ScriptRecord[i].Script);\n    }\n}\nvoid CFX_CTTGSUBTable::ParseScript(FT_Bytes raw, struct TScript *rec)\n{\n    int i;\n    FT_Bytes sp = raw;\n    rec->DefaultLangSys = GetUInt16(sp);\n    rec->LangSysCount = GetUInt16(sp);\n    if(rec->LangSysCount <= 0) {\n        return;\n    }\n    rec->LangSysRecord = new struct TLangSysRecord[rec->LangSysCount];\n    for(i = 0; i < rec->LangSysCount; i++) {\n        rec->LangSysRecord[i].LangSysTag = GetUInt32(sp);\n        TT_uint16_t offset = GetUInt16(sp);\n        ParseLangSys(\n            &raw[offset],\n            &rec->LangSysRecord[i].LangSys);\n    }\n}\nvoid CFX_CTTGSUBTable::ParseLangSys(FT_Bytes raw, struct TLangSys *rec)\n{\n    FT_Bytes sp = raw;\n    rec->LookupOrder = GetUInt16(sp);\n    rec->ReqFeatureIndex = GetUInt16(sp);\n    rec->FeatureCount = GetUInt16(sp);\n    if(rec->FeatureCount <= 0) {\n        return;\n    }\n    rec->FeatureIndex = new TT_uint16_t[rec->FeatureCount];\n    FXSYS_memset32(rec->FeatureIndex, 0, sizeof(TT_uint16_t) * rec->FeatureCount);\n    for (int i = 0; i < rec->FeatureCount; ++i) {\n        rec->FeatureIndex[i] = GetUInt16(sp);\n    }\n}\nvoid CFX_CTTGSUBTable::ParseFeatureList(FT_Bytes raw, TFeatureList *rec)\n{\n    int i;\n    FT_Bytes sp = raw;\n    rec->FeatureCount = GetUInt16(sp);\n    if(rec->FeatureCount <= 0) {\n        return;\n    }\n    rec->FeatureRecord = new struct TFeatureRecord[rec->FeatureCount];\n    for(i = 0; i < rec->FeatureCount; i++) {\n        rec->FeatureRecord[i].FeatureTag = GetUInt32(sp);\n        TT_uint16_t offset = GetUInt16(sp);\n        ParseFeature(\n            &raw[offset],\n            &rec->FeatureRecord[i].Feature);\n    }\n}\nvoid CFX_CTTGSUBTable::ParseFeature(FT_Bytes raw, TFeature *rec)\n{\n    int i;\n    FT_Bytes sp = raw;\n    rec->FeatureParams = GetUInt16(sp);\n    rec->LookupCount = GetUInt16(sp);\n    if(rec->LookupCount <= 0) {\n        return;\n    }\n    rec->LookupListIndex = new TT_uint16_t[rec->LookupCount];\n    for(i = 0; i < rec->LookupCount; i++) {\n        rec->LookupListIndex[i] = GetUInt16(sp);\n    }\n}\nvoid CFX_CTTGSUBTable::ParseLookupList(FT_Bytes raw, TLookupList *rec)\n{\n    int i;\n    FT_Bytes sp = raw;\n    rec->LookupCount = GetUInt16(sp);\n    if(rec->LookupCount <= 0) {\n        return;\n    }\n    rec->Lookup = new struct TLookup[rec->LookupCount];\n    for(i = 0; i < rec->LookupCount; i++) {\n        TT_uint16_t offset = GetUInt16(sp);\n        ParseLookup(\n            &raw[offset],\n            &rec->Lookup[i]);\n    }\n}\nvoid CFX_CTTGSUBTable::ParseLookup(FT_Bytes raw, TLookup *rec)\n{\n    int i;\n    FT_Bytes sp = raw;\n    rec->LookupType = GetUInt16(sp);\n    rec->LookupFlag = GetUInt16(sp);\n    rec->SubTableCount = GetUInt16(sp);\n    if(rec->SubTableCount <= 0) {\n        return;\n    }\n    rec->SubTable = new struct TSubTableBase*[rec->SubTableCount];\n    for(i = 0; i < rec->SubTableCount; i++) {\n        rec->SubTable[i] = NULL;\n    }\n    if(rec->LookupType != 1) {\n        return;\n    }\n    for(i = 0; i < rec->SubTableCount; i++) {\n        TT_uint16_t offset = GetUInt16(sp);\n        ParseSingleSubst(\n            &raw[offset],\n            &rec->SubTable[i]);\n    }\n}\nvoid CFX_CTTGSUBTable::ParseCoverage(FT_Bytes raw, TCoverageFormatBase **rec)\n{\n    FT_Bytes sp = raw;\n    TT_uint16_t Format = GetUInt16(sp);\n    switch(Format) {\n        case 1:\n            *rec = new TCoverageFormat1();\n            ParseCoverageFormat1(raw, (TCoverageFormat1*)*rec);\n            break;\n        case 2:\n            *rec = new TCoverageFormat2();\n            ParseCoverageFormat2(raw, (TCoverageFormat2*)*rec);\n            break;\n    }\n}\nvoid CFX_CTTGSUBTable::ParseCoverageFormat1(FT_Bytes raw, TCoverageFormat1 *rec)\n{\n    int i;\n    FT_Bytes sp = raw;\n    GetUInt16(sp);\n    rec->GlyphCount = GetUInt16(sp);\n    if(rec->GlyphCount <= 0) {\n        return;\n    }\n    rec->GlyphArray = new TT_uint16_t[rec->GlyphCount];\n    for(i = 0; i < rec->GlyphCount; i++) {\n        rec->GlyphArray[i] = GetUInt16(sp);\n    }\n}\nvoid CFX_CTTGSUBTable::ParseCoverageFormat2(FT_Bytes raw, TCoverageFormat2 *rec)\n{\n    int i;\n    FT_Bytes sp = raw;\n    GetUInt16(sp);\n    rec->RangeCount = GetUInt16(sp);\n    if(rec->RangeCount <= 0) {\n        return;\n    }\n    rec->RangeRecord = new TRangeRecord[rec->RangeCount];\n    for(i = 0; i < rec->RangeCount; i++) {\n        rec->RangeRecord[i].Start = GetUInt16(sp);\n        rec->RangeRecord[i].End = GetUInt16(sp);\n        rec->RangeRecord[i].StartCoverageIndex = GetUInt16(sp);\n    }\n}\nvoid CFX_CTTGSUBTable::ParseSingleSubst(FT_Bytes raw, TSubTableBase **rec)\n{\n    FT_Bytes sp = raw;\n    TT_uint16_t Format = GetUInt16(sp);\n    switch(Format) {\n        case 1:\n            *rec = new TSingleSubstFormat1();\n            ParseSingleSubstFormat1(raw, (TSingleSubstFormat1*)*rec);\n            break;\n        case 2:\n            *rec = new TSingleSubstFormat2();\n            ParseSingleSubstFormat2(raw, (TSingleSubstFormat2*)*rec);\n            break;\n    }\n}\nvoid CFX_CTTGSUBTable::ParseSingleSubstFormat1(FT_Bytes raw, TSingleSubstFormat1 *rec)\n{\n    FT_Bytes sp = raw;\n    GetUInt16(sp);\n    TT_uint16_t offset = GetUInt16(sp);\n    ParseCoverage(\n        &raw[offset],\n        &rec->Coverage);\n    rec->DeltaGlyphID = GetInt16(sp);\n}\nvoid CFX_CTTGSUBTable::ParseSingleSubstFormat2(FT_Bytes raw, TSingleSubstFormat2 *rec)\n{\n    int i;\n    FT_Bytes sp = raw;\n    GetUInt16(sp);\n    TT_uint16_t offset = GetUInt16(sp);\n    ParseCoverage(\n        &raw[offset],\n        &rec->Coverage);\n    rec->GlyphCount = GetUInt16(sp);\n    if(rec->GlyphCount <= 0) {\n        return;\n    }\n    rec->Substitute = new TT_uint16_t[rec->GlyphCount];\n    for(i = 0; i < rec->GlyphCount; i++) {\n        rec->Substitute[i] = GetUInt16(sp);\n    }\n}\nFX_BOOL CFX_GSUBTable::GetVerticalGlyph(FX_DWORD glyphnum, FX_DWORD* vglyphnum)\n{\n    return m_GsubImp.GetVerticalGlyph(glyphnum, vglyphnum);\n}\nIFX_GSUBTable* FXGE_CreateGSUBTable(CFX_Font* pFont)\n{\n    if (!pFont) {\n        return NULL;\n    }\n    if (NULL == pFont->m_pGsubData) {\n        unsigned long length = 0;\n        int error = FXFT_Load_Sfnt_Table(pFont->m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, NULL, &length);\n        if (!error) {\n            pFont->m_pGsubData = (unsigned char*)FX_Alloc(FX_BYTE, length);\n        }\n        if (!pFont->m_pGsubData) {\n            return NULL;\n        }\n    }\n    int error = FXFT_Load_Sfnt_Table(pFont->m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, pFont->m_pGsubData, NULL);\n    if (!error && pFont->m_pGsubData) {\n        CFX_GSUBTable* pGsubTable = FX_NEW CFX_GSUBTable;\n        if (!pGsubTable) {\n            return NULL;\n        }\n        if (pGsubTable->m_GsubImp.LoadGSUBTable((FT_Bytes)pFont->m_pGsubData)) {\n            return pGsubTable;\n        }\n        delete pGsubTable;\n    }\n    return NULL;\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_font/ttgsubtable.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef TTGSUBTable_H\n#define TTGSUBTable_H\n#include \"../../fx_freetype.h\"\n#include \"../../../include/fxcrt/fx_basic.h\"\n#include \"common.h\"\nclass CFX_GlyphMap\n{\npublic:\n    CFX_GlyphMap();\n    ~CFX_GlyphMap();\n    void\tSetAt(int key, int value);\n    FX_BOOL\tLookup(int key, int &value);\nprotected:\n    CFX_BinaryBuf\tm_Buffer;\n};\nclass CFX_CTTGSUBTable : public CFX_Object\n{\npublic:\n    CFX_CTTGSUBTable(void): loaded(false), m_bFeautureMapLoad(FALSE) {};\n    CFX_CTTGSUBTable(FT_Bytes gsub): loaded(false), m_bFeautureMapLoad(FALSE)\n    {\n        LoadGSUBTable(gsub);\n    }\n    virtual ~CFX_CTTGSUBTable() {}\n    bool IsOk(void) const\n    {\n        return loaded;\n    }\n    bool LoadGSUBTable(FT_Bytes gsub);\n    bool GetVerticalGlyph(TT_uint32_t glyphnum, TT_uint32_t *vglyphnum);\nprivate:\n    struct tt_gsub_header {\n        TT_uint32_t Version;\n        TT_uint16_t ScriptList;\n        TT_uint16_t FeatureList;\n        TT_uint16_t LookupList;\n    };\n    struct TLangSys {\n        TT_uint16_t LookupOrder;\n        TT_uint16_t ReqFeatureIndex;\n        TT_uint16_t FeatureCount;\n        TT_uint16_t *FeatureIndex;\n        TLangSys(): LookupOrder(0), ReqFeatureIndex(0), FeatureCount(0), FeatureIndex(NULL) {}\n        ~TLangSys()\n        {\n            if(FeatureIndex) {\n                delete[] FeatureIndex;\n            }\n        }\n    private:\n        TLangSys(const TLangSys&);\n        TLangSys& operator=(const TLangSys&);\n    };\n    struct TLangSysRecord {\n        TT_uint32_t LangSysTag;\n        struct TLangSys LangSys;\n        TLangSysRecord(): LangSysTag(0) {}\n    private:\n        TLangSysRecord(const TLangSysRecord&);\n        TLangSysRecord& operator=(const TLangSysRecord&);\n    };\n    struct TScript {\n        TT_uint16_t DefaultLangSys;\n        TT_uint16_t LangSysCount;\n        struct TLangSysRecord *LangSysRecord;\n        TScript(): DefaultLangSys(0), LangSysCount(0), LangSysRecord(NULL) {}\n        ~TScript()\n        {\n            if(LangSysRecord) {\n                delete[] LangSysRecord;\n            }\n        }\n    private:\n        TScript(const TScript&);\n        TScript& operator=(const TScript&);\n    };\n    struct TScriptRecord {\n        TT_uint32_t ScriptTag;\n        struct TScript Script;\n        TScriptRecord(): ScriptTag(0) {}\n    private:\n        TScriptRecord(const TScriptRecord&);\n        TScriptRecord& operator=(const TScriptRecord&);\n    };\n    struct TScriptList {\n        TT_uint16_t ScriptCount;\n        struct TScriptRecord *ScriptRecord;\n        TScriptList(): ScriptCount(0), ScriptRecord(NULL) {}\n        ~TScriptList()\n        {\n            if(ScriptRecord) {\n                delete[] ScriptRecord;\n            }\n        }\n    private:\n        TScriptList(const TScriptList&);\n        TScriptList& operator=(const TScriptList&);\n    };\n    struct TFeature {\n        TT_uint16_t FeatureParams;\n        int LookupCount;\n        TT_uint16_t *LookupListIndex;\n        TFeature(): FeatureParams(0), LookupCount(0), LookupListIndex(NULL) {}\n        ~TFeature()\n        {\n            if(LookupListIndex) {\n                delete[] LookupListIndex;\n            }\n        }\n    private:\n        TFeature(const TFeature&);\n        TFeature& operator=(const TFeature&);\n    };\n    struct TFeatureRecord {\n        TT_uint32_t FeatureTag;\n        struct TFeature Feature;\n        TFeatureRecord(): FeatureTag(0) {}\n    private:\n        TFeatureRecord(const TFeatureRecord&);\n        TFeatureRecord& operator=(const TFeatureRecord&);\n    };\n    struct TFeatureList {\n        int FeatureCount;\n        struct TFeatureRecord *FeatureRecord;\n        TFeatureList(): FeatureCount(0), FeatureRecord(NULL) {}\n        ~TFeatureList()\n        {\n            if(FeatureRecord) {\n                delete[] FeatureRecord;\n            }\n        }\n    private:\n        TFeatureList(const TFeatureList&);\n        TFeatureList& operator=(const TFeatureList&);\n    };\n    enum TLookupFlag {\n        LOOKUPFLAG_RightToLeft = 0x0001,\n        LOOKUPFLAG_IgnoreBaseGlyphs = 0x0002,\n        LOOKUPFLAG_IgnoreLigatures = 0x0004,\n        LOOKUPFLAG_IgnoreMarks = 0x0008,\n        LOOKUPFLAG_Reserved = 0x00F0,\n        LOOKUPFLAG_MarkAttachmentType = 0xFF00,\n    };\n    struct TCoverageFormatBase {\n        TT_uint16_t CoverageFormat;\n        CFX_GlyphMap m_glyphMap;\n        TCoverageFormatBase(): CoverageFormat(0) {}\n        virtual ~TCoverageFormatBase() {}\n    private:\n        TCoverageFormatBase(const TCoverageFormatBase&);\n        TCoverageFormatBase& operator=(const TCoverageFormatBase&);\n    };\n    struct TCoverageFormat1: public TCoverageFormatBase {\n        TT_uint16_t GlyphCount;\n        TT_uint16_t *GlyphArray;\n        TCoverageFormat1(): GlyphCount(0), GlyphArray(NULL)\n        {\n            CoverageFormat = 1;\n        }\n        ~TCoverageFormat1()\n        {\n            if(GlyphArray) {\n                delete[] GlyphArray;\n            }\n        }\n    private:\n        TCoverageFormat1(const TCoverageFormat1&);\n        TCoverageFormat1& operator=(const TCoverageFormat1&);\n    };\n    struct TRangeRecord {\n        TT_uint16_t Start;\n        TT_uint16_t End;\n        TT_uint16_t StartCoverageIndex;\n        TRangeRecord(): Start(0), End(0), StartCoverageIndex(0) {}\n        friend bool operator > (const TRangeRecord &r1, const TRangeRecord &r2)\n        {\n            return r1.Start > r2.Start;\n        }\n    private:\n        TRangeRecord(const TRangeRecord&);\n    };\n    struct TCoverageFormat2: public TCoverageFormatBase {\n        TT_uint16_t RangeCount;\n        struct TRangeRecord *RangeRecord;\n        TCoverageFormat2(): RangeCount(0), RangeRecord(NULL)\n        {\n            CoverageFormat = 2;\n        }\n        ~TCoverageFormat2()\n        {\n            if(RangeRecord) {\n                delete[] RangeRecord;\n            }\n        }\n    private:\n        TCoverageFormat2(const TCoverageFormat2&);\n        TCoverageFormat2& operator=(const TCoverageFormat2&);\n    };\n    struct TClassDefFormatBase {\n        TT_uint16_t ClassFormat;\n        TClassDefFormatBase(): ClassFormat(0) {}\n        virtual ~TClassDefFormatBase() {}\n    private:\n        TClassDefFormatBase(const TClassDefFormatBase&);\n        TClassDefFormatBase& operator=(const TClassDefFormatBase&);\n    };\n    struct TClassDefFormat1: public TClassDefFormatBase {\n        TT_uint16_t StartGlyph;\n        TT_uint16_t GlyphCount;\n        TT_uint16_t *ClassValueArray;\n        TClassDefFormat1(): StartGlyph(0), GlyphCount(0), ClassValueArray(NULL)\n        {\n            ClassFormat = 1;\n        }\n        ~TClassDefFormat1()\n        {\n            if(ClassValueArray) {\n                delete[] ClassValueArray;\n            }\n        }\n    private:\n        TClassDefFormat1(const TClassDefFormat1&);\n        TClassDefFormat1& operator=(const TClassDefFormat1&);\n    };\n    struct TClassRangeRecord {\n        TT_uint16_t Start;\n        TT_uint16_t End;\n        TT_uint16_t Class;\n        TClassRangeRecord(): Start(0), End(0), Class(0) {}\n    private:\n        TClassRangeRecord(const TClassRangeRecord&);\n        TClassRangeRecord& operator=(const TClassRangeRecord&);\n    };\n    struct TClassDefFormat2: public TClassDefFormatBase {\n        TT_uint16_t ClassRangeCount;\n        struct TClassRangeRecord *ClassRangeRecord;\n        TClassDefFormat2(): ClassRangeCount(0), ClassRangeRecord(NULL)\n        {\n            ClassFormat = 2;\n        }\n        ~TClassDefFormat2()\n        {\n            if(ClassRangeRecord) {\n                delete[] ClassRangeRecord;\n            }\n        }\n    private:\n        TClassDefFormat2(const TClassDefFormat2&);\n        TClassDefFormat2& operator=(const TClassDefFormat2&);\n    };\n    struct TDevice {\n        TT_uint16_t StartSize;\n        TT_uint16_t EndSize;\n        TT_uint16_t DeltaFormat;\n        TDevice(): StartSize(0), EndSize(0), DeltaFormat(0) {}\n    private:\n        TDevice(const TDevice&);\n        TDevice& operator=(const TDevice&);\n    };\n    struct TSubTableBase {\n        TT_uint16_t SubstFormat;\n        TSubTableBase(): SubstFormat(0) {}\n        virtual ~TSubTableBase() {}\n    private:\n        TSubTableBase(const TSubTableBase&);\n        TSubTableBase& operator=(const TSubTableBase&);\n    };\n    struct TSingleSubstFormat1: public TSubTableBase {\n        TCoverageFormatBase *Coverage;\n        TT_int16_t DeltaGlyphID;\n        TSingleSubstFormat1(): DeltaGlyphID(0), Coverage(NULL)\n        {\n            SubstFormat = 1;\n        }\n        ~TSingleSubstFormat1()\n        {\n            if(Coverage) {\n                delete Coverage;\n            }\n        }\n    private:\n        TSingleSubstFormat1(const TSingleSubstFormat1&);\n        TSingleSubstFormat1& operator=(const TSingleSubstFormat1&);\n    };\n    struct TSingleSubstFormat2: public TSubTableBase {\n        TCoverageFormatBase *Coverage;\n        TT_uint16_t GlyphCount;\n        TT_uint16_t *Substitute;\n        TSingleSubstFormat2(): Coverage(NULL), GlyphCount(0), Substitute(NULL)\n        {\n            SubstFormat = 2;\n        }\n        ~TSingleSubstFormat2()\n        {\n            if(Coverage) {\n                delete Coverage;\n            }\n            if(Substitute) {\n                delete[] Substitute;\n            }\n        }\n    private:\n        TSingleSubstFormat2(const TSingleSubstFormat2&);\n        TSingleSubstFormat2& operator=(const TSingleSubstFormat2&);\n    };\n    struct TLookup {\n        TT_uint16_t LookupType;\n        TT_uint16_t LookupFlag;\n        TT_uint16_t SubTableCount;\n        struct TSubTableBase **SubTable;\n        TLookup(): LookupType(0), LookupFlag(0), SubTableCount(0), SubTable(NULL) {}\n        ~TLookup()\n        {\n            if(SubTableCount > 0 && SubTable != NULL) {\n                for(int i = 0; i < SubTableCount; i++) {\n                    delete SubTable[i];\n                }\n                delete[] SubTable;\n            }\n        }\n    private:\n        TLookup(const TLookup&);\n        TLookup& operator=(const TLookup&);\n    };\n    struct TLookupList {\n        int LookupCount;\n        struct TLookup *Lookup;\n        TLookupList(): LookupCount(0), Lookup(NULL) {}\n        ~TLookupList()\n        {\n            if(Lookup) {\n                delete[] Lookup;\n            }\n        }\n    private:\n        TLookupList(const TLookupList&);\n        TLookupList& operator=(const TLookupList&);\n    };\n    bool Parse(\n        FT_Bytes scriptlist,\n        FT_Bytes featurelist,\n        FT_Bytes lookuplist);\n    void ParseScriptList(FT_Bytes raw, TScriptList *rec);\n    void ParseScript(FT_Bytes raw, TScript *rec);\n    void ParseLangSys(FT_Bytes raw, TLangSys *rec);\n    void ParseFeatureList(FT_Bytes raw, TFeatureList *rec);\n    void ParseFeature(FT_Bytes raw, TFeature *rec);\n    void ParseLookupList(FT_Bytes raw, TLookupList *rec);\n    void ParseLookup(FT_Bytes raw, TLookup *rec);\n    void ParseCoverage(FT_Bytes raw, TCoverageFormatBase **rec);\n    void ParseCoverageFormat1(FT_Bytes raw, TCoverageFormat1 *rec);\n    void ParseCoverageFormat2(FT_Bytes raw, TCoverageFormat2 *rec);\n    void ParseSingleSubst(FT_Bytes raw, TSubTableBase **rec);\n    void ParseSingleSubstFormat1(FT_Bytes raw, TSingleSubstFormat1 *rec);\n    void ParseSingleSubstFormat2(FT_Bytes raw, TSingleSubstFormat2 *rec);\n    bool GetVerticalGlyphSub(\n        TT_uint32_t glyphnum,\n        TT_uint32_t *vglyphnum,\n        struct TFeature *Feature);\n    bool GetVerticalGlyphSub2(\n        TT_uint32_t glyphnum,\n        TT_uint32_t *vglyphnum,\n        struct TLookup *Lookup);\n    int GetCoverageIndex(struct TCoverageFormatBase *Coverage, TT_uint32_t g);\n    TT_uint8_t GetUInt8(FT_Bytes& p) const\n    {\n        TT_uint8_t ret = p[0];\n        p += 1;\n        return ret;\n    }\n    TT_int16_t GetInt16(FT_Bytes& p) const\n    {\n        TT_uint16_t ret = p[0] << 8 | p[1];\n        p += 2;\n        return *(TT_int16_t*)&ret;\n    }\n    TT_uint16_t GetUInt16(FT_Bytes& p) const\n    {\n        TT_uint16_t ret = p[0] << 8 | p[1];\n        p += 2;\n        return ret;\n    }\n    TT_int32_t GetInt32(FT_Bytes& p) const\n    {\n        TT_uint32_t ret = p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3];\n        p += 4;\n        return *(TT_int32_t*)&ret;\n    }\n    TT_uint32_t GetUInt32(FT_Bytes& p) const\n    {\n        TT_uint32_t ret = p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3];\n        p += 4;\n        return ret;\n    }\n    CFX_CMapDWordToDWord m_featureMap;\n    FX_BOOL\tm_bFeautureMapLoad;\n    bool loaded;\n    struct tt_gsub_header header;\n    struct TScriptList ScriptList;\n    struct TFeatureList FeatureList;\n    struct TLookupList LookupList;\n};\nclass CFX_GSUBTable FX_FINAL : public IFX_GSUBTable, public CFX_Object\n{\npublic:\n    virtual void\tRelease()\n    {\n        delete this;\n    }\n    virtual FX_BOOL GetVerticalGlyph(FX_DWORD glyphnum, FX_DWORD* vglyphnum);\n    CFX_CTTGSUBTable m_GsubImp;\n};\n#endif\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_page/fpdf_page.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_page.h\"\n#include \"../../../include/fpdfapi/fpdf_module.h\"\n#include \"pageint.h\"\nvoid CPDF_PageObject::Release()\n{\n    delete this;\n}\nCPDF_PageObject* CPDF_PageObject::Create(int type)\n{\n    switch (type) {\n        case PDFPAGE_TEXT:\n            return FX_NEW CPDF_TextObject;\n        case PDFPAGE_IMAGE:\n            return FX_NEW CPDF_ImageObject;\n        case PDFPAGE_PATH:\n            return FX_NEW CPDF_PathObject;\n        case PDFPAGE_SHADING:\n            return FX_NEW CPDF_ShadingObject;\n        case PDFPAGE_FORM:\n            return FX_NEW CPDF_FormObject;\n    }\n    return NULL;\n}\nCPDF_PageObject* CPDF_PageObject::Clone() const\n{\n    CPDF_PageObject* pObj = Create(m_Type);\n    pObj->Copy(this);\n    return pObj;\n}\nvoid CPDF_PageObject::Copy(const CPDF_PageObject* pSrc)\n{\n    if (m_Type != pSrc->m_Type) {\n        return;\n    }\n    CopyData(pSrc);\n    CopyStates(*pSrc);\n    m_Left = pSrc->m_Left;\n    m_Right = pSrc->m_Right;\n    m_Top = pSrc->m_Top;\n    m_Bottom = pSrc->m_Bottom;\n}\nvoid CPDF_PageObject::AppendClipPath(CPDF_Path path, int type, FX_BOOL bAutoMerge)\n{\n    m_ClipPath.AppendPath(path, type, bAutoMerge);\n}\nvoid CPDF_PageObject::CopyClipPath(CPDF_PageObject* pObj)\n{\n    m_ClipPath = pObj->m_ClipPath;\n}\nvoid CPDF_PageObject::RemoveClipPath()\n{\n    m_ClipPath.SetNull();\n}\nvoid CPDF_PageObject::RecalcBBox()\n{\n    switch (m_Type) {\n        case PDFPAGE_TEXT:\n            ((CPDF_TextObject*)this)->RecalcPositionData();\n            break;\n        case PDFPAGE_PATH:\n            ((CPDF_PathObject*)this)->CalcBoundingBox();\n            break;\n        case PDFPAGE_SHADING:\n            ((CPDF_ShadingObject*)this)->CalcBoundingBox();\n            break;\n    }\n}\nvoid CPDF_PageObject::TransformClipPath(CFX_AffineMatrix& matrix)\n{\n    if (m_ClipPath.IsNull()) {\n        return;\n    }\n    m_ClipPath.GetModify();\n    m_ClipPath.Transform(matrix);\n}\nvoid CPDF_PageObject::TransformGeneralState(CFX_AffineMatrix& matrix)\n{\n    if(m_GeneralState.IsNull()) {\n        return;\n    }\n    CPDF_GeneralStateData* pGS = m_GeneralState.GetModify();\n    pGS->m_Matrix.Concat(matrix);\n}\nFX_RECT CPDF_PageObject::GetBBox(const CFX_AffineMatrix* pMatrix) const\n{\n    CFX_FloatRect rect(m_Left, m_Bottom, m_Right, m_Top);\n    if (pMatrix) {\n        pMatrix->TransformRect(rect);\n    }\n    return rect.GetOutterRect();\n}\nCPDF_TextObject::CPDF_TextObject()\n{\n    m_Type = PDFPAGE_TEXT;\n    m_pCharCodes = NULL;\n    m_pCharPos = NULL;\n    m_nChars = 0;\n    m_PosX = m_PosY = 0;\n}\nCPDF_TextObject::~CPDF_TextObject()\n{\n    if (m_nChars > 1 && m_pCharCodes) {\n        FX_Free(m_pCharCodes);\n    }\n    if (m_pCharPos) {\n        FX_Free(m_pCharPos);\n    }\n}\nvoid CPDF_TextObject::GetItemInfo(int index, CPDF_TextObjectItem* pInfo) const\n{\n    pInfo->m_CharCode = m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)m_pCharCodes : m_pCharCodes[index];\n    pInfo->m_OriginX = index ? m_pCharPos[index - 1] : 0;\n    pInfo->m_OriginY = 0;\n    if (pInfo->m_CharCode == -1) {\n        return;\n    }\n    CPDF_Font* pFont = m_TextState.GetFont();\n    if (pFont->GetFontType() != PDFFONT_CIDFONT) {\n        return;\n    }\n    if (!((CPDF_CIDFont*)pFont)->IsVertWriting()) {\n        return;\n    }\n    FX_WORD CID = ((CPDF_CIDFont*)pFont)->CIDFromCharCode(pInfo->m_CharCode);\n    pInfo->m_OriginY = pInfo->m_OriginX;\n    pInfo->m_OriginX = 0;\n    short vx, vy;\n    ((CPDF_CIDFont*)pFont)->GetVertOrigin(CID, vx, vy);\n    FX_FLOAT fontsize = m_TextState.GetFontSize();\n    pInfo->m_OriginX -= fontsize * vx / 1000;\n    pInfo->m_OriginY -= fontsize * vy / 1000;\n}\nint CPDF_TextObject::CountChars() const\n{\n    if (m_nChars == 1) {\n        return 1;\n    }\n    int count = 0;\n    for (int i = 0; i < m_nChars; i ++)\n        if (m_pCharCodes[i] != (FX_DWORD) - 1) {\n            count ++;\n        }\n    return count;\n}\nvoid CPDF_TextObject::GetCharInfo(int index, FX_DWORD& charcode, FX_FLOAT& kerning) const\n{\n    if (m_nChars == 1) {\n        charcode = (FX_DWORD)(FX_UINTPTR)m_pCharCodes;\n        kerning = 0;\n        return;\n    }\n    int count = 0;\n    for (int i = 0; i < m_nChars; i ++) {\n        if (m_pCharCodes[i] != (FX_DWORD) - 1) {\n            if (count == index) {\n                charcode = m_pCharCodes[i];\n                if (i == m_nChars - 1 || m_pCharCodes[i + 1] != (FX_DWORD) - 1) {\n                    kerning = 0;\n                } else {\n                    kerning = m_pCharPos[i];\n                }\n                return;\n            }\n            count ++;\n        }\n    }\n}\nvoid CPDF_TextObject::GetCharInfo(int index, CPDF_TextObjectItem* pInfo) const\n{\n    if (m_nChars == 1) {\n        GetItemInfo(0, pInfo);\n        return;\n    }\n    int count = 0;\n    for (int i = 0; i < m_nChars; i ++) {\n        FX_DWORD charcode = m_pCharCodes[i];\n        if (charcode == (FX_DWORD) - 1) {\n            continue;\n        }\n        if (count == index) {\n            GetItemInfo(i, pInfo);\n            break;\n        }\n        count ++;\n    }\n}\nvoid CPDF_TextObject::CopyData(const CPDF_PageObject* pSrc)\n{\n    const CPDF_TextObject* pSrcObj = (const CPDF_TextObject*)pSrc;\n    if (m_nChars > 1 && m_pCharCodes) {\n        FX_Free(m_pCharCodes);\n        m_pCharCodes = NULL;\n    }\n    if (m_pCharPos) {\n        FX_Free(m_pCharPos);\n        m_pCharPos = NULL;\n    }\n    m_nChars = pSrcObj->m_nChars;\n    if (m_nChars > 1) {\n        m_pCharCodes = FX_Alloc(FX_DWORD, m_nChars);\n        m_pCharPos = FX_Alloc(FX_FLOAT, m_nChars - 1);\n        int i;\n        for (i = 0; i < m_nChars; i ++) {\n            m_pCharCodes[i] = pSrcObj->m_pCharCodes[i];\n        }\n        for (i = 0; i < m_nChars - 1; i ++) {\n            m_pCharPos[i] = pSrcObj->m_pCharPos[i];\n        }\n    } else {\n        m_pCharCodes = pSrcObj->m_pCharCodes;\n    }\n    m_PosX = pSrcObj->m_PosX;\n    m_PosY = pSrcObj->m_PosY;\n}\nvoid CPDF_TextObject::GetTextMatrix(CFX_AffineMatrix* pMatrix) const\n{\n    FX_FLOAT* pTextMatrix = m_TextState.GetMatrix();\n    pMatrix->Set(pTextMatrix[0], pTextMatrix[2], pTextMatrix[1], pTextMatrix[3], m_PosX, m_PosY);\n}\nvoid CPDF_TextObject::SetSegments(const CFX_ByteString* pStrs, FX_FLOAT* pKerning, int nsegs)\n{\n    if (m_nChars > 1 && m_pCharCodes) {\n        FX_Free(m_pCharCodes);\n        m_pCharCodes = NULL;\n    }\n    if (m_pCharPos) {\n        FX_Free(m_pCharPos);\n        m_pCharPos = NULL;\n    }\n    CPDF_Font* pFont = m_TextState.GetFont();\n    m_nChars = 0;\n    for (int i = 0; i < nsegs; i ++) {\n        m_nChars += pFont->CountChar(pStrs[i], pStrs[i].GetLength());\n    }\n    m_nChars += nsegs - 1;\n    if (m_nChars > 1) {\n        m_pCharCodes = FX_Alloc(FX_DWORD, m_nChars);\n        m_pCharPos = FX_Alloc(FX_FLOAT, m_nChars - 1);\n        int index = 0;\n        for (int i = 0; i < nsegs; i ++) {\n            FX_LPCSTR segment = pStrs[i];\n            int offset = 0, len = pStrs[i].GetLength();\n            while (offset < len) {\n                m_pCharCodes[index++] = pFont->GetNextChar(segment, offset);\n            }\n            if (i != nsegs - 1) {\n                m_pCharPos[index - 1] = pKerning[i];\n                m_pCharCodes[index ++] = (FX_DWORD) - 1;\n            }\n        }\n    } else {\n        int offset = 0;\n        m_pCharCodes = (FX_DWORD*)(FX_UINTPTR)pFont->GetNextChar(pStrs[0], offset);\n    }\n}\nvoid CPDF_TextObject::SetText(const CFX_ByteString& str)\n{\n    SetSegments(&str, NULL, 1);\n    RecalcPositionData();\n}\nvoid CPDF_TextObject::SetEmpty()\n{\n    if (m_nChars > 1 && m_pCharCodes) {\n        FX_Free(m_pCharCodes);\n    }\n    if (m_nChars > 1 && m_pCharPos) {\n        FX_Free(m_pCharPos);\n    }\n    m_nChars = 0;\n    m_pCharCodes = NULL;\n    m_pCharPos = NULL;\n    m_Left = m_Right = m_PosX;\n    m_Top = m_Bottom = m_PosY;\n}\nvoid CPDF_TextObject::SetText(CFX_ByteString* pStrs, FX_FLOAT* pKerning, int nSegs)\n{\n    SetSegments(pStrs, pKerning, nSegs);\n    RecalcPositionData();\n}\nvoid CPDF_TextObject::SetText(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pKernings)\n{\n    if (m_nChars > 1 && m_pCharCodes) {\n        FX_Free(m_pCharCodes);\n        m_pCharCodes = NULL;\n    }\n    if (m_pCharPos) {\n        FX_Free(m_pCharPos);\n        m_pCharPos = NULL;\n    }\n    int nKernings = 0;\n    int i;\n    for (i = 0; i < nChars - 1; i ++)\n        if (pKernings[i] != 0) {\n            nKernings ++;\n        }\n    m_nChars = nChars + nKernings;\n    if (m_nChars > 1) {\n        m_pCharCodes = FX_Alloc(FX_DWORD, m_nChars);\n        m_pCharPos = FX_Alloc(FX_FLOAT, m_nChars - 1);\n        int index = 0;\n        for (int i = 0; i < nChars; i ++) {\n            m_pCharCodes[index++] = pCharCodes[i];\n            if (pKernings[i] != 0 && i != nChars - 1) {\n                m_pCharCodes[index] = (FX_DWORD) - 1;\n                m_pCharPos[index - 1] = pKernings[i];\n                index ++;\n            }\n        }\n    } else {\n        int offset = 0;\n        m_pCharCodes = (FX_DWORD*)(FX_UINTPTR)pCharCodes[0];\n    }\n    RecalcPositionData();\n}\nFX_FLOAT CPDF_TextObject::GetCharWidth(FX_DWORD charcode) const\n{\n    FX_FLOAT fontsize = m_TextState.GetFontSize() / 1000;\n    CPDF_Font* pFont = m_TextState.GetFont();\n    FX_BOOL bVertWriting = FALSE;\n    CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();\n    if (pCIDFont) {\n        bVertWriting = pCIDFont->IsVertWriting();\n    }\n    if (!bVertWriting) {\n        return pFont->GetCharWidthF(charcode, 0) * fontsize;\n    } else {\n        FX_WORD CID = pCIDFont->CIDFromCharCode(charcode);\n        return pCIDFont->GetVertWidth(CID) * fontsize;\n    }\n}\nFX_FLOAT CPDF_TextObject::GetSpaceCharWidth() const\n{\n    CPDF_Font* pFont = m_TextState.GetFont();\n    FX_DWORD charCode = m_TextState.GetFont()->CharCodeFromUnicode(32);\n    if (charCode != (FX_DWORD) - 1) {\n        return GetCharWidth(charCode);\n    }\n    FX_FLOAT fontSize = m_TextState.GetFontSize() / 4000.0f;\n    FX_BOOL bVertWriting = FALSE;\n    CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();\n    if (pCIDFont) {\n        bVertWriting = pCIDFont->IsVertWriting();\n    }\n    FX_RECT fontRect;\n    pFont->GetFontBBox(fontRect);\n    fontSize *= bVertWriting ? (FX_FLOAT)fontRect.Height() : (FX_FLOAT)fontRect.Width();\n    return fontSize;\n}\nvoid CPDF_TextObject::GetCharRect(int index, CFX_FloatRect& rect) const\n{\n    FX_FLOAT curpos = 0;\n    CPDF_Font* pFont = m_TextState.GetFont();\n    FX_BOOL bVertWriting = FALSE;\n    CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();\n    if (pCIDFont) {\n        bVertWriting = pCIDFont->IsVertWriting();\n    }\n    FX_FLOAT fontsize = m_TextState.GetFontSize() / 1000;\n    int count = 0;\n    for (int i = 0; i < m_nChars; i ++) {\n        FX_DWORD charcode = m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)m_pCharCodes : m_pCharCodes[i];\n        if (charcode == (FX_DWORD) - 1) {\n            continue;\n        }\n        if( count != index) {\n            count++;\n            continue;\n        }\n        FX_FLOAT curpos = i > 0 ? m_pCharPos[i - 1] : 0;\n        FX_RECT char_rect;\n        pFont->GetCharBBox(charcode, char_rect, 0);\n        if (!bVertWriting) {\n            rect.left = curpos + char_rect.left * fontsize;\n            rect.right = curpos + char_rect.right * fontsize;\n            rect.top = char_rect.top * fontsize;\n            rect.bottom = char_rect.bottom * fontsize;\n        } else {\n            FX_WORD CID = pCIDFont->CIDFromCharCode(charcode);\n            short vx, vy;\n            pCIDFont->GetVertOrigin(CID, vx, vy);\n            char_rect.left -= vx;\n            char_rect.right -= vx;\n            char_rect.top -= vy;\n            char_rect.bottom -= vy;\n            rect.left = char_rect.left * fontsize;\n            rect.right = char_rect.right * fontsize;\n            rect.top = curpos + char_rect.top * fontsize;\n            rect.bottom = curpos + char_rect.bottom * fontsize;\n        }\n        return;\n    }\n}\nvoid CPDF_TextObject::CalcPositionData(FX_FLOAT* pTextAdvanceX, FX_FLOAT* pTextAdvanceY, FX_FLOAT horz_scale, int level)\n{\n    FX_FLOAT curpos = 0;\n    FX_FLOAT min_x = 10000 * 1.0f, max_x = -10000 * 1.0f, min_y = 10000 * 1.0f, max_y = -10000 * 1.0f;\n    CPDF_Font* pFont = m_TextState.GetFont();\n    FX_BOOL bVertWriting = FALSE;\n    CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();\n    if (pCIDFont) {\n        bVertWriting = pCIDFont->IsVertWriting();\n    }\n    FX_FLOAT fontsize = m_TextState.GetFontSize();\n    for (int i = 0; i < m_nChars; i ++) {\n        FX_DWORD charcode = m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)m_pCharCodes : m_pCharCodes[i];\n        if (charcode == (FX_DWORD) - 1) {\n            curpos -= FXSYS_Mul(m_pCharPos[i - 1], fontsize) / 1000;\n            continue;\n        }\n        if (i) {\n            m_pCharPos[i - 1] = curpos;\n        }\n        FX_RECT char_rect;\n        pFont->GetCharBBox(charcode, char_rect, level);\n        FX_FLOAT charwidth;\n        if (!bVertWriting) {\n            if (min_y > char_rect.top) {\n                min_y = (FX_FLOAT)char_rect.top;\n            }\n            if (max_y < char_rect.top) {\n                max_y = (FX_FLOAT)char_rect.top;\n            }\n            if (min_y > char_rect.bottom) {\n                min_y = (FX_FLOAT)char_rect.bottom;\n            }\n            if (max_y < char_rect.bottom) {\n                max_y = (FX_FLOAT)char_rect.bottom;\n            }\n            FX_FLOAT char_left = curpos + char_rect.left * fontsize / 1000;\n            FX_FLOAT char_right = curpos + char_rect.right * fontsize / 1000;\n            if (min_x > char_left) {\n                min_x = char_left;\n            }\n            if (max_x < char_left) {\n                max_x = char_left;\n            }\n            if (min_x > char_right) {\n                min_x = char_right;\n            }\n            if (max_x < char_right) {\n                max_x = char_right;\n            }\n            charwidth = pFont->GetCharWidthF(charcode, level) * fontsize / 1000;\n        } else {\n            FX_WORD CID = pCIDFont->CIDFromCharCode(charcode);\n            short vx, vy;\n            pCIDFont->GetVertOrigin(CID, vx, vy);\n            char_rect.left -= vx;\n            char_rect.right -= vx;\n            char_rect.top -= vy;\n            char_rect.bottom -= vy;\n            if (min_x > char_rect.left) {\n                min_x = (FX_FLOAT)char_rect.left;\n            }\n            if (max_x < char_rect.left) {\n                max_x = (FX_FLOAT)char_rect.left;\n            }\n            if (min_x > char_rect.right) {\n                min_x = (FX_FLOAT)char_rect.right;\n            }\n            if (max_x < char_rect.right) {\n                max_x = (FX_FLOAT)char_rect.right;\n            }\n            FX_FLOAT char_top = curpos + char_rect.top * fontsize / 1000;\n            FX_FLOAT char_bottom = curpos + char_rect.bottom * fontsize / 1000;\n            if (min_y > char_top) {\n                min_y = char_top;\n            }\n            if (max_y < char_top) {\n                max_y = char_top;\n            }\n            if (min_y > char_bottom) {\n                min_y = char_bottom;\n            }\n            if (max_y < char_bottom) {\n                max_y = char_bottom;\n            }\n            charwidth = pCIDFont->GetVertWidth(CID) * fontsize / 1000;\n        }\n        curpos += charwidth;\n        if (charcode == ' ' && (pCIDFont == NULL || pCIDFont->GetCharSize(32) == 1)) {\n            curpos += m_TextState.GetObject()->m_WordSpace;\n        }\n        curpos += m_TextState.GetObject()->m_CharSpace;\n    }\n    if (bVertWriting) {\n        if (pTextAdvanceX) {\n            *pTextAdvanceX = 0;\n        }\n        if (pTextAdvanceY) {\n            *pTextAdvanceY = curpos;\n        }\n        min_x = min_x * fontsize / 1000;\n        max_x = max_x * fontsize / 1000;\n    } else {\n        if (pTextAdvanceX) {\n            *pTextAdvanceX = FXSYS_Mul(curpos, horz_scale);\n        }\n        if (pTextAdvanceY) {\n            *pTextAdvanceY = 0;\n        }\n        min_y = min_y * fontsize / 1000;\n        max_y = max_y * fontsize / 1000;\n    }\n    CFX_AffineMatrix matrix;\n    GetTextMatrix(&matrix);\n    m_Left = min_x;\n    m_Right = max_x;\n    m_Bottom = min_y;\n    m_Top = max_y;\n    matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom);\n    int textmode = m_TextState.GetObject()->m_TextMode;\n    if (textmode == 1 || textmode == 2 || textmode == 5 || textmode == 6) {\n        FX_FLOAT half_width = m_GraphState.GetObject()->m_LineWidth / 2;\n        m_Left -= half_width;\n        m_Right += half_width;\n        m_Top += half_width;\n        m_Bottom -= half_width;\n    }\n}\nvoid CPDF_TextObject::CalcCharPos(FX_FLOAT* pPosArray) const\n{\n    FX_FLOAT curpos = 0;\n    int count = 0;\n    CPDF_Font* pFont = m_TextState.GetFont();\n    FX_BOOL bVertWriting = FALSE;\n    CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();\n    if (pCIDFont) {\n        bVertWriting = pCIDFont->IsVertWriting();\n    }\n    FX_FLOAT fontsize = m_TextState.GetFontSize();\n    int index = 0;\n    for (int i = 0; i < m_nChars; i ++) {\n        FX_DWORD charcode = m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)m_pCharCodes : m_pCharCodes[i];\n        if (charcode == (FX_DWORD) - 1) {\n            continue;\n        }\n        pPosArray[index++] = i ? m_pCharPos[i - 1] : 0;\n        FX_FLOAT charwidth;\n        if (bVertWriting) {\n            FX_WORD CID = pCIDFont->CIDFromCharCode(charcode);\n            charwidth = pCIDFont->GetVertWidth(CID) * fontsize / 1000;\n        } else {\n            charwidth = pFont->GetCharWidthF(charcode) * fontsize / 1000;\n        }\n        pPosArray[index] = pPosArray[index - 1] + charwidth;\n        index++;\n    }\n}\nvoid CPDF_TextObject::Transform(const CFX_AffineMatrix& matrix)\n{\n    m_TextState.GetModify();\n    CFX_AffineMatrix text_matrix;\n    GetTextMatrix(&text_matrix);\n    text_matrix.Concat(matrix);\n    FX_FLOAT* pTextMatrix = m_TextState.GetMatrix();\n    pTextMatrix[0] = text_matrix.GetA();\n    pTextMatrix[1] = text_matrix.GetC();\n    pTextMatrix[2] = text_matrix.GetB();\n    pTextMatrix[3] = text_matrix.GetD();\n    m_PosX = text_matrix.GetE();\n    m_PosY = text_matrix.GetF();\n    CalcPositionData(NULL, NULL, 0);\n}\nvoid CPDF_TextObject::SetPosition(FX_FLOAT x, FX_FLOAT y)\n{\n    FX_FLOAT dx = x - m_PosX;\n    FX_FLOAT dy = y - m_PosY;\n    m_PosX = x;\n    m_PosY = y;\n    m_Left += dx;\n    m_Right += dx;\n    m_Top += dy;\n    m_Bottom += dy;\n}\nvoid CPDF_TextObject::SetData(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, FX_FLOAT x, FX_FLOAT y)\n{\n    ASSERT(m_nChars == 0);\n    m_nChars = nChars;\n    m_PosX = x;\n    m_PosY = y;\n    if (nChars == 0) {\n        return;\n    }\n    if (nChars == 1) {\n        m_pCharCodes = (FX_DWORD*)(FX_UINTPTR) * pCharCodes;\n    } else {\n        m_pCharCodes = FX_Alloc(FX_DWORD, nChars);\n        FXSYS_memcpy32(m_pCharCodes, pCharCodes, sizeof(FX_DWORD)*nChars);\n        m_pCharPos = FX_Alloc(FX_FLOAT, nChars - 1);\n        FXSYS_memcpy32(m_pCharPos, pCharPos, sizeof(FX_FLOAT) * (nChars - 1));\n    }\n    RecalcPositionData();\n}\nvoid CPDF_TextObject::SetTextState(CPDF_TextState TextState)\n{\n    m_TextState = TextState;\n    CalcPositionData(NULL, NULL, 0);\n}\nCPDF_ShadingObject::CPDF_ShadingObject()\n{\n    m_pShading = NULL;\n    m_Type = PDFPAGE_SHADING;\n}\nCPDF_ShadingObject::~CPDF_ShadingObject()\n{\n    CPDF_ShadingPattern* pShading = m_pShading;\n    if (pShading && pShading->m_pDocument) {\n        pShading->m_pDocument->GetPageData()->ReleasePattern(pShading->m_pShadingObj);\n    }\n}\nvoid CPDF_ShadingObject::CopyData(const CPDF_PageObject* pSrc)\n{\n    CPDF_ShadingObject* pSrcObj = (CPDF_ShadingObject*)pSrc;\n    m_pShading = pSrcObj->m_pShading;\n    if (m_pShading && m_pShading->m_pDocument) {\n        CPDF_DocPageData* pDocPageData = m_pShading->m_pDocument->GetPageData();\n        m_pShading = (CPDF_ShadingPattern*)pDocPageData->GetPattern(m_pShading->m_pShadingObj, m_pShading->m_bShadingObj, &m_pShading->m_ParentMatrix);\n    }\n    m_Matrix = pSrcObj->m_Matrix;\n}\nvoid CPDF_ShadingObject::Transform(const CFX_AffineMatrix& matrix)\n{\n    if (!m_ClipPath.IsNull()) {\n        m_ClipPath.GetModify();\n        m_ClipPath.Transform(matrix);\n    }\n    m_Matrix.Concat(matrix);\n    if (!m_ClipPath.IsNull()) {\n        CalcBoundingBox();\n    } else {\n        matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom);\n    }\n}\nvoid CPDF_ShadingObject::CalcBoundingBox()\n{\n    if (m_ClipPath.IsNull()) {\n        return;\n    }\n    CFX_FloatRect rect = m_ClipPath.GetClipBox();\n    m_Left = rect.left;\n    m_Bottom = rect.bottom;\n    m_Right = rect.right;\n    m_Top = rect.top;\n}\nCPDF_FormObject::~CPDF_FormObject()\n{\n    if (m_pForm) {\n        delete m_pForm;\n    }\n}\nvoid CPDF_FormObject::Transform(const CFX_AffineMatrix& matrix)\n{\n    m_FormMatrix.Concat(matrix);\n    CalcBoundingBox();\n}\nvoid CPDF_FormObject::CopyData(const CPDF_PageObject* pSrc)\n{\n    const CPDF_FormObject* pSrcObj = (const CPDF_FormObject*)pSrc;\n    if (m_pForm) {\n        delete m_pForm;\n    }\n    m_pForm = pSrcObj->m_pForm->Clone();\n    m_FormMatrix = pSrcObj->m_FormMatrix;\n}\nvoid CPDF_FormObject::CalcBoundingBox()\n{\n    CFX_FloatRect form_rect = m_pForm->CalcBoundingBox();\n    form_rect.Transform(&m_FormMatrix);\n    m_Left = form_rect.left;\n    m_Bottom = form_rect.bottom;\n    m_Right = form_rect.right;\n    m_Top = form_rect.top;\n}\nCPDF_PageObjects::CPDF_PageObjects(FX_BOOL bReleaseMembers) : m_ObjectList(128)\n{\n    m_bBackgroundAlphaNeeded = FALSE;\n    m_bReleaseMembers = bReleaseMembers;\n    m_ParseState = PDF_CONTENT_NOT_PARSED;\n    m_pParser = NULL;\n    m_pFormStream = NULL;\n    m_pResources = NULL;\n}\nCPDF_PageObjects::~CPDF_PageObjects()\n{\n    if (m_pParser) {\n        delete m_pParser;\n    }\n    if (!m_bReleaseMembers) {\n        return;\n    }\n    FX_POSITION pos = m_ObjectList.GetHeadPosition();\n    while (pos) {\n        CPDF_PageObject* pPageObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);\n        if (!pPageObj) {\n            continue;\n        }\n        pPageObj->Release();\n    }\n}\nvoid CPDF_PageObjects::ContinueParse(IFX_Pause* pPause)\n{\n    if (m_pParser == NULL) {\n        return;\n    }\n    m_pParser->Continue(pPause);\n    if (m_pParser->GetStatus() == CPDF_ContentParser::Done) {\n        m_ParseState = PDF_CONTENT_PARSED;\n        delete m_pParser;\n        m_pParser = NULL;\n    }\n}\nint CPDF_PageObjects::EstimateParseProgress() const\n{\n    if (m_pParser == NULL) {\n        return m_ParseState == PDF_CONTENT_PARSED ? 100 : 0;\n    }\n    return m_pParser->EstimateProgress();\n}\nFX_POSITION CPDF_PageObjects::InsertObject(FX_POSITION posInsertAfter, CPDF_PageObject* pNewObject)\n{\n    if (posInsertAfter == NULL) {\n        return m_ObjectList.AddHead(pNewObject);\n    } else {\n        return m_ObjectList.InsertAfter(posInsertAfter, pNewObject);\n    }\n}\nint CPDF_PageObjects::GetObjectIndex(CPDF_PageObject* pObj) const\n{\n    int index = 0;\n    FX_POSITION pos = m_ObjectList.GetHeadPosition();\n    while (pos) {\n        CPDF_PageObject* pThisObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);\n        if (pThisObj == pObj) {\n            return index;\n        }\n        index ++;\n    }\n    return -1;\n}\nCPDF_PageObject* CPDF_PageObjects::GetObjectByIndex(int index) const\n{\n    FX_POSITION pos = m_ObjectList.FindIndex(index);\n    if (pos == NULL) {\n        return NULL;\n    }\n    return (CPDF_PageObject*)m_ObjectList.GetAt(pos);\n}\nvoid CPDF_PageObjects::Transform(const CFX_AffineMatrix& matrix)\n{\n    FX_POSITION pos = m_ObjectList.GetHeadPosition();\n    while (pos) {\n        CPDF_PageObject* pObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);\n        pObj->Transform(matrix);\n    }\n}\nCFX_FloatRect CPDF_PageObjects::CalcBoundingBox() const\n{\n    if (m_ObjectList.GetCount() == 0) {\n        return CFX_FloatRect(0, 0, 0, 0);\n    }\n    FX_FLOAT left, right, top, bottom;\n    left = bottom = 1000000 * 1.0f;\n    right = top = -1000000 * 1.0f;\n    FX_POSITION pos = m_ObjectList.GetHeadPosition();\n    while (pos) {\n        CPDF_PageObject* pObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);\n        if (left > pObj->m_Left) {\n            left = pObj->m_Left;\n        }\n        if (right < pObj->m_Right) {\n            right = pObj->m_Right;\n        }\n        if (top < pObj->m_Top) {\n            top = pObj->m_Top;\n        }\n        if (bottom > pObj->m_Bottom) {\n            bottom = pObj->m_Bottom;\n        }\n    }\n    return CFX_FloatRect(left, bottom, right, top);\n}\nvoid CPDF_PageObjects::LoadTransInfo()\n{\n    if (m_pFormDict == NULL) {\n        return;\n    }\n    CPDF_Dictionary* pGroup = m_pFormDict->GetDict(FX_BSTRC(\"Group\"));\n    if (pGroup == NULL) {\n        return;\n    }\n    if (pGroup->GetString(FX_BSTRC(\"S\")) != FX_BSTRC(\"Transparency\")) {\n        return;\n    }\n    m_Transparency |= PDFTRANS_GROUP;\n    if (pGroup->GetInteger(FX_BSTRC(\"I\"))) {\n        m_Transparency |= PDFTRANS_ISOLATED;\n    }\n    if (pGroup->GetInteger(FX_BSTRC(\"K\"))) {\n        m_Transparency |= PDFTRANS_KNOCKOUT;\n    }\n}\nvoid CPDF_PageObjects::ClearCacheObjects()\n{\n    m_ParseState = PDF_CONTENT_NOT_PARSED;\n    if (m_pParser) {\n        delete m_pParser;\n    }\n    m_pParser = NULL;\n    if (m_bReleaseMembers) {\n        FX_POSITION pos = m_ObjectList.GetHeadPosition();\n        while (pos) {\n            CPDF_PageObject* pPageObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);\n            if (!pPageObj) {\n                continue;\n            }\n            pPageObj->Release();\n        }\n    }\n    m_ObjectList.RemoveAll();\n}\nCPDF_Page::CPDF_Page()\n{\n    m_pPageRender = NULL;\n}\nvoid CPDF_Page::Load(CPDF_Document* pDocument, CPDF_Dictionary* pPageDict, FX_BOOL bPageCache)\n{\n    m_pDocument = (CPDF_Document*)pDocument;\n    m_pFormDict = pPageDict;\n    if (bPageCache) {\n        m_pPageRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreatePageCache(this);\n    }\n    if (pPageDict == NULL) {\n        m_PageWidth = m_PageHeight = 100 * 1.0f;\n        m_pPageResources = m_pResources = NULL;\n        return;\n    }\n    CPDF_Object* pageAttr = GetPageAttr(FX_BSTRC(\"Resources\"));\n    m_pResources = pageAttr ? pageAttr->GetDict() : NULL;\n    m_pPageResources = m_pResources;\n    CPDF_Object* pRotate = GetPageAttr(FX_BSTRC(\"Rotate\"));\n    int rotate = 0;\n    if (pRotate) {\n        rotate = pRotate->GetInteger() / 90 % 4;\n    }\n    if (rotate < 0) {\n        rotate += 4;\n    }\n    CPDF_Array* pMediaBox, *pCropBox;\n    pMediaBox = (CPDF_Array*)GetPageAttr(FX_BSTRC(\"MediaBox\"));\n    CFX_FloatRect mediabox;\n    if (pMediaBox) {\n        mediabox = pMediaBox->GetRect();\n        mediabox.Normalize();\n    }\n    if (mediabox.IsEmpty()) {\n        mediabox = CFX_FloatRect(0, 0, 612, 792);\n    }\n    pCropBox = (CPDF_Array*)GetPageAttr(FX_BSTRC(\"CropBox\"));\n    if (pCropBox) {\n        m_BBox = pCropBox->GetRect();\n        m_BBox.Normalize();\n    }\n    if (m_BBox.IsEmpty()) {\n        m_BBox = mediabox;\n    } else {\n        m_BBox.Intersect(mediabox);\n    }\n    if (rotate % 2) {\n        m_PageHeight = m_BBox.right - m_BBox.left;\n        m_PageWidth = m_BBox.top - m_BBox.bottom;\n    } else {\n        m_PageWidth = m_BBox.right - m_BBox.left;\n        m_PageHeight = m_BBox.top - m_BBox.bottom;\n    }\n    switch (rotate) {\n        case 0:\n            m_PageMatrix.Set(1.0f, 0, 0, 1.0f, -m_BBox.left, -m_BBox.bottom);\n            break;\n        case 1:\n            m_PageMatrix.Set(0, -1.0f, 1.0f, 0, -m_BBox.bottom, m_BBox.right);\n            break;\n        case 2:\n            m_PageMatrix.Set(-1.0f, 0, 0, -1.0f, m_BBox.right, m_BBox.top);\n            break;\n        case 3:\n            m_PageMatrix.Set(0, 1.0f, -1.0f, 0, m_BBox.top, -m_BBox.left);\n            break;\n    }\n    m_Transparency = PDFTRANS_ISOLATED;\n    LoadTransInfo();\n}\nvoid CPDF_Page::StartParse(CPDF_ParseOptions* pOptions, FX_BOOL bReParse)\n{\n    if (bReParse) {\n        ClearCacheObjects();\n    }\n    if (m_ParseState == PDF_CONTENT_PARSED || m_ParseState == PDF_CONTENT_PARSING) {\n        return;\n    }\n    m_pParser = FX_NEW CPDF_ContentParser;\n    m_pParser->Start(this, pOptions);\n    m_ParseState = PDF_CONTENT_PARSING;\n}\nvoid CPDF_Page::ParseContent(CPDF_ParseOptions* pOptions, FX_BOOL bReParse)\n{\n    StartParse(pOptions, bReParse);\n    ContinueParse(NULL);\n}\nCPDF_Page::~CPDF_Page()\n{\n    if (m_pPageRender) {\n        CPDF_RenderModuleDef* pModule = CPDF_ModuleMgr::Get()->GetRenderModule();\n        pModule->DestroyPageCache(m_pPageRender);\n    }\n}\nCPDF_Object* FPDFAPI_GetPageAttr(CPDF_Dictionary* pPageDict, FX_BSTR name)\n{\n    int level = 0;\n    while (1) {\n        CPDF_Object* pObj = pPageDict->GetElementValue(name);\n        if (pObj) {\n            return pObj;\n        }\n        CPDF_Dictionary* pParent = pPageDict->GetDict(FX_BSTRC(\"Parent\"));\n        if (!pParent || pParent == pPageDict) {\n            return NULL;\n        }\n        pPageDict = pParent;\n        level ++;\n        if (level == 1000) {\n            return NULL;\n        }\n    }\n}\nCPDF_Object* CPDF_Page::GetPageAttr(FX_BSTR name) const\n{\n    return FPDFAPI_GetPageAttr(m_pFormDict, name);\n}\nCPDF_Form::CPDF_Form(CPDF_Document* pDoc, CPDF_Dictionary* pPageResources, CPDF_Stream* pFormStream, CPDF_Dictionary* pParentResources)\n{\n    m_pDocument = pDoc;\n    m_pFormStream = pFormStream;\n    m_pFormDict = pFormStream ? pFormStream->GetDict() : NULL;\n    m_pResources = m_pFormDict->GetDict(FX_BSTRC(\"Resources\"));\n    m_pPageResources = pPageResources;\n    if (m_pResources == NULL) {\n        m_pResources = pParentResources;\n    }\n    if (m_pResources == NULL) {\n        m_pResources = pPageResources;\n    }\n    m_Transparency = 0;\n    LoadTransInfo();\n}\nCPDF_Form::~CPDF_Form()\n{\n}\nvoid CPDF_Form::StartParse(CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,\n                           CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level)\n{\n    if (m_ParseState == PDF_CONTENT_PARSED || m_ParseState == PDF_CONTENT_PARSING) {\n        return;\n    }\n    m_pParser = FX_NEW CPDF_ContentParser;\n    m_pParser->Start(this, pGraphicStates, pParentMatrix, pType3Char, pOptions, level);\n    m_ParseState = PDF_CONTENT_PARSING;\n}\nvoid CPDF_Form::ParseContent(CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,\n                             CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level)\n{\n    StartParse(pGraphicStates, pParentMatrix, pType3Char, pOptions, level);\n    ContinueParse(NULL);\n}\nCPDF_Form* CPDF_Form::Clone() const\n{\n    CPDF_Form* pClone = FX_NEW CPDF_Form(m_pDocument, m_pPageResources, m_pFormStream, m_pResources);\n    FX_POSITION pos = m_ObjectList.GetHeadPosition();\n    while (pos) {\n        CPDF_PageObject* pObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);\n        pClone->m_ObjectList.AddTail(pObj->Clone());\n    }\n    return pClone;\n}\nvoid CPDF_Page::GetDisplayMatrix(CFX_AffineMatrix& matrix, int xPos, int yPos,\n                                 int xSize, int ySize, int iRotate) const\n{\n    if (m_PageWidth == 0 || m_PageHeight == 0) {\n        return;\n    }\n    CFX_AffineMatrix display_matrix;\n    int x0, y0, x1, y1, x2, y2;\n    iRotate %= 4;\n    switch (iRotate) {\n        case 0:\n            x0 = xPos;\n            y0 = yPos + ySize;\n            x1 = xPos;\n            y1 = yPos;\n            x2 = xPos + xSize;\n            y2 = yPos + ySize;\n            break;\n        case 1:\n            x0 = xPos;\n            y0 = yPos;\n            x1 = xPos + xSize;\n            y1 = yPos;\n            x2 = xPos;\n            y2 = yPos + ySize;\n            break;\n        case 2:\n            x0 = xPos + xSize;\n            y0 = yPos;\n            x1 = xPos + xSize;\n            y1 = yPos + ySize;\n            x2 = xPos;\n            y2 = yPos;\n            break;\n        case 3:\n            x0 = xPos + xSize;\n            y0 = yPos + ySize;\n            x1 = xPos;\n            y1 = yPos + ySize;\n            x2 = xPos + xSize;\n            y2 = yPos;\n            break;\n    }\n    display_matrix.Set(FXSYS_Div((FX_FLOAT)(x2 - x0), m_PageWidth),\n                       FXSYS_Div((FX_FLOAT)(y2 - y0), m_PageWidth),\n                       FXSYS_Div((FX_FLOAT)(x1 - x0), m_PageHeight),\n                       FXSYS_Div((FX_FLOAT)(y1 - y0), m_PageHeight),\n                       (FX_FLOAT)x0, (FX_FLOAT)y0);\n    matrix = m_PageMatrix;\n    matrix.Concat(display_matrix);\n}\nCPDF_ParseOptions::CPDF_ParseOptions()\n{\n    m_bTextOnly = FALSE;\n    m_bMarkedContent = TRUE;\n    m_bSeparateForm = TRUE;\n    m_bDecodeInlineImage = FALSE;\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_page.h\"\n#include \"../../../include/fpdfapi/fpdf_module.h\"\n#include \"../../../include/fxcodec/fx_codec.h\"\n#include \"pageint.h\"\n#include <limits.h>\nvoid sRGB_to_AdobeCMYK(FX_FLOAT R, FX_FLOAT G, FX_FLOAT B, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k)\n{\n    c = 1.0f - R;\n    m = 1.0f - G;\n    y = 1.0f - B;\n    k = c;\n    if (m < k) {\n        k = m;\n    }\n    if (y < k) {\n        k = y;\n    }\n}\nCPDF_DeviceCS::CPDF_DeviceCS(int family)\n{\n    m_Family = family;\n    if (m_Family == PDFCS_DEVICERGB) {\n        m_nComponents = 3;\n    } else if (m_Family == PDFCS_DEVICEGRAY) {\n        m_nComponents = 1;\n    } else {\n        m_nComponents = 4;\n    }\n}\nFX_BOOL CPDF_DeviceCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const\n{\n    if (m_Family == PDFCS_DEVICERGB) {\n        R = pBuf[0];\n        if (R < 0) {\n            R = 0;\n        } else if (R > 1) {\n            R = 1;\n        }\n        G = pBuf[1];\n        if (G < 0) {\n            G = 0;\n        } else if (G > 1) {\n            G = 1;\n        }\n        B = pBuf[2];\n        if (B < 0) {\n            B = 0;\n        } else if (B > 1) {\n            B = 1;\n        }\n    } else if (m_Family == PDFCS_DEVICEGRAY) {\n        R = *pBuf;\n        if (R < 0) {\n            R = 0;\n        } else if (R > 1) {\n            R = 1;\n        }\n        G = B = R;\n    } else if (m_Family == PDFCS_DEVICECMYK) {\n        if (!m_dwStdConversion) {\n            AdobeCMYK_to_sRGB(pBuf[0], pBuf[1], pBuf[2], pBuf[3], R, G, B);\n        } else {\n            FX_FLOAT k = pBuf[3];\n            R = 1.0f - FX_MIN(1.0f, pBuf[0] + k);\n            G = 1.0f - FX_MIN(1.0f, pBuf[1] + k);\n            B = 1.0f - FX_MIN(1.0f, pBuf[2] + k);\n        }\n    } else {\n        ASSERT(m_Family == PDFCS_PATTERN);\n        R = G = B = 0;\n        return FALSE;\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_DeviceCS::v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const\n{\n    if (m_Family != PDFCS_DEVICECMYK) {\n        return FALSE;\n    }\n    c = pBuf[0];\n    m = pBuf[1];\n    y = pBuf[2];\n    k = pBuf[3];\n    return TRUE;\n}\nFX_BOOL CPDF_DeviceCS::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const\n{\n    if (m_Family == PDFCS_DEVICERGB) {\n        pBuf[0] = R;\n        pBuf[1] = G;\n        pBuf[2] = B;\n        return TRUE;\n    } else if (m_Family == PDFCS_DEVICEGRAY) {\n        if (R == G && R == B) {\n            *pBuf = R;\n            return TRUE;\n        } else {\n            return FALSE;\n        }\n    } else if (m_Family == PDFCS_DEVICECMYK) {\n        sRGB_to_AdobeCMYK(R, G, B, pBuf[0], pBuf[1], pBuf[2], pBuf[3]);\n        return TRUE;\n    }\n    return FALSE;\n}\nFX_BOOL CPDF_DeviceCS::v_SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const\n{\n    if (m_Family == PDFCS_DEVICERGB) {\n        AdobeCMYK_to_sRGB(c, m, y, k, pBuf[0], pBuf[1], pBuf[2]);\n        return TRUE;\n    } else if (m_Family == PDFCS_DEVICEGRAY) {\n        return FALSE;\n    } else if (m_Family == PDFCS_DEVICECMYK) {\n        pBuf[0] = c;\n        pBuf[1] = m;\n        pBuf[2] = y;\n        pBuf[3] = k;\n        return TRUE;\n    }\n    return FALSE;\n}\nstatic void ReverseRGB(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels)\n{\n    if (pDestBuf == pSrcBuf)\n        for (int i = 0; i < pixels; i ++) {\n            FX_BYTE temp = pDestBuf[2];\n            pDestBuf[2] = pDestBuf[0];\n            pDestBuf[0] = temp;\n            pDestBuf += 3;\n        }\n    else\n        for (int i = 0; i < pixels; i ++) {\n            *pDestBuf ++ = pSrcBuf[2];\n            *pDestBuf ++ = pSrcBuf[1];\n            *pDestBuf ++ = pSrcBuf[0];\n            pSrcBuf += 3;\n        }\n}\nvoid CPDF_DeviceCS::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const\n{\n    if (bTransMask && m_Family == PDFCS_DEVICECMYK) {\n        for (int i = 0; i < pixels; i ++) {\n            int k = 255 - pSrcBuf[3];\n            pDestBuf[0] = ((255 - pSrcBuf[0]) * k) / 255;\n            pDestBuf[1] = ((255 - pSrcBuf[1]) * k) / 255;\n            pDestBuf[2] = ((255 - pSrcBuf[2]) * k) / 255;\n            pDestBuf += 3;\n            pSrcBuf += 4;\n        }\n        return;\n    }\n    if (m_Family == PDFCS_DEVICERGB) {\n        ReverseRGB(pDestBuf, pSrcBuf, pixels);\n    } else if (m_Family == PDFCS_DEVICEGRAY) {\n        for (int i = 0; i < pixels; i ++) {\n            *pDestBuf ++ = pSrcBuf[i];\n            *pDestBuf ++ = pSrcBuf[i];\n            *pDestBuf ++ = pSrcBuf[i];\n        }\n    } else {\n        for (int i = 0; i < pixels; i ++) {\n            if (!m_dwStdConversion) {\n                AdobeCMYK_to_sRGB1(pSrcBuf[0], pSrcBuf[1], pSrcBuf[2], pSrcBuf[3], pDestBuf[2], pDestBuf[1], pDestBuf[0]);\n            } else {\n                FX_BYTE k = pSrcBuf[3];\n                pDestBuf[2] = 255 - FX_MIN(255, pSrcBuf[0] + k);\n                pDestBuf[1] = 255 - FX_MIN(255, pSrcBuf[1] + k);\n                pDestBuf[0] = 255 - FX_MIN(255, pSrcBuf[2] + k);\n            }\n            pSrcBuf += 4;\n            pDestBuf += 3;\n        }\n    }\n}\nconst FX_BYTE g_sRGBSamples1[] = {\n    0,   3,   6,  10,  13,  15,  18,  20,  22,  23,  25,  27,  28,  30,  31,  32,\n    34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,\n    49,  50,  51,  52,  53,  53,  54,  55,  56,  56,  57,  58,  58,  59,  60,  61,\n    61,  62,  62,  63,  64,  64,  65,  66,  66,  67,  67,  68,  68,  69,  70,  70,\n    71,  71,  72,  72,  73,  73,  74,  74,  75,  76,  76,  77,  77,  78,  78,  79,\n    79,  79,  80,  80,  81,  81,  82,  82,  83,  83,  84,  84,  85,  85,  85,  86,\n    86,  87,  87,  88,  88,  88,  89,  89,  90,  90,  91,  91,  91,  92,  92,  93,\n    93,  93,  94,  94,  95,  95,  95,  96,  96,  97,  97,  97,  98,  98,  98,  99,\n    99,  99, 100, 100, 101, 101, 101, 102, 102, 102, 103, 103, 103, 104, 104, 104,\n    105, 105, 106, 106, 106, 107, 107, 107, 108, 108, 108, 109, 109, 109, 110, 110,\n    110, 110, 111, 111, 111, 112, 112, 112, 113, 113, 113, 114, 114, 114, 115, 115,\n    115, 115, 116, 116, 116, 117, 117, 117, 118, 118, 118, 118, 119, 119, 119, 120,\n};\nconst FX_BYTE g_sRGBSamples2[] = {\n    120, 121, 122, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136,\n    137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 148, 149, 150, 151,\n    152, 153, 154, 155, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 163, 164,\n    165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 173, 173, 174, 175, 175, 176,\n    177, 178, 178, 179, 180, 180, 181, 182, 182, 183, 184, 185, 185, 186, 187, 187,\n    188, 189, 189, 190, 190, 191, 192, 192, 193, 194, 194, 195, 196, 196, 197, 197,\n    198, 199, 199, 200, 200, 201, 202, 202, 203, 203, 204, 205, 205, 206, 206, 207,\n    208, 208, 209, 209, 210, 210, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216,\n    216, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224,\n    225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 232, 233,\n    233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 238, 239, 239, 240, 240,\n    241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 246, 247, 247, 248,\n    248, 249, 249, 250, 250, 251, 251, 251, 252, 252, 253, 253, 254, 254, 255, 255,\n};\nstatic void XYZ_to_sRGB(FX_FLOAT X, FX_FLOAT Y, FX_FLOAT Z, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B)\n{\n    FX_FLOAT R1 = 3.2410f * X - 1.5374f * Y - 0.4986f * Z;\n    FX_FLOAT G1 = -0.9692f * X + 1.8760f * Y + 0.0416f * Z;\n    FX_FLOAT B1 =  0.0556f * X - 0.2040f * Y + 1.0570f * Z;\n    if (R1 > 1) {\n        R1 = 1;\n    }\n    if (R1 < 0) {\n        R1 = 0;\n    }\n    if (G1 > 1) {\n        G1 = 1;\n    }\n    if (G1 < 0) {\n        G1 = 0;\n    }\n    if (B1 > 1) {\n        B1 = 1;\n    }\n    if (B1 < 0) {\n        B1 = 0;\n    }\n    int scale = (int)(R1 * 1023);\n    if (scale < 0) {\n        scale = 0;\n    }\n    if (scale < 192) {\n        R = (g_sRGBSamples1[scale] / 255.0f);\n    } else {\n        R = (g_sRGBSamples2[scale / 4 - 48] / 255.0f);\n    }\n    scale = (int)(G1 * 1023);\n    if (scale < 0) {\n        scale = 0;\n    }\n    if (scale < 192) {\n        G = (g_sRGBSamples1[scale] / 255.0f);\n    } else {\n        G = (g_sRGBSamples2[scale / 4 - 48] / 255.0f);\n    }\n    scale = (int)(B1 * 1023);\n    if (scale < 0) {\n        scale = 0;\n    }\n    if (scale < 192) {\n        B = (g_sRGBSamples1[scale] / 255.0f);\n    } else {\n        B = (g_sRGBSamples2[scale / 4 - 48] / 255.0f);\n    }\n}\nclass CPDF_CalGray : public CPDF_ColorSpace\n{\npublic:\n    CPDF_CalGray();\n    virtual FX_BOOL\t\tv_Load(CPDF_Document* pDoc, CPDF_Array* pArray);\n    virtual FX_BOOL\t\tGetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;\n    virtual void\t\tTranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;\n    FX_BOOL\t\t\t\tSetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;\n    FX_FLOAT\t\t\tm_WhitePoint[3];\n    FX_FLOAT\t\t\tm_BlackPoint[3];\n    FX_FLOAT\t\t\tm_Gamma;\n};\nCPDF_CalGray::CPDF_CalGray()\n{\n    m_Family = PDFCS_CALGRAY;\n    m_nComponents = 1;\n}\nFX_BOOL CPDF_CalGray::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)\n{\n    CPDF_Dictionary* pDict = pArray->GetDict(1);\n    CPDF_Array* pParam = pDict->GetArray(FX_BSTRC(\"WhitePoint\"));\n    int i;\n    for (i = 0; i < 3; i ++) {\n        m_WhitePoint[i] = pParam ? pParam->GetNumber(i) : 0;\n    }\n    pParam = pDict->GetArray(FX_BSTRC(\"BlackPoint\"));\n    for (i = 0; i < 3; i ++) {\n        m_BlackPoint[i] = pParam ? pParam->GetNumber(i) : 0;\n    }\n    m_Gamma = pDict->GetNumber(FX_BSTRC(\"Gamma\"));\n    if (m_Gamma == 0) {\n        m_Gamma = 1.0f;\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_CalGray::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const\n{\n    R = G = B = *pBuf;\n    return TRUE;\n}\nFX_BOOL CPDF_CalGray::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const\n{\n    if (R == G && R == B) {\n        *pBuf = R;\n        return TRUE;\n    } else {\n        return FALSE;\n    }\n}\nvoid CPDF_CalGray::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const\n{\n    for (int i = 0; i < pixels; i ++) {\n        *pDestBuf ++ = pSrcBuf[i];\n        *pDestBuf ++ = pSrcBuf[i];\n        *pDestBuf ++ = pSrcBuf[i];\n    }\n}\nclass CPDF_CalRGB : public CPDF_ColorSpace\n{\npublic:\n    CPDF_CalRGB();\n    virtual FX_BOOL\t\tv_Load(CPDF_Document* pDoc, CPDF_Array* pArray);\n    virtual FX_BOOL\t\tGetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;\n    virtual void\t\tTranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;\n    FX_BOOL\t\t\t\tSetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;\n    FX_FLOAT\t\t\tm_WhitePoint[3];\n    FX_FLOAT\t\t\tm_BlackPoint[3];\n    FX_FLOAT\t\t\tm_Gamma[3];\n    FX_FLOAT\t\t\tm_Matrix[9];\n    FX_BOOL\t\t\t\tm_bGamma, m_bMatrix;\n};\nCPDF_CalRGB::CPDF_CalRGB()\n{\n    m_Family = PDFCS_CALRGB;\n    m_nComponents = 3;\n}\nFX_BOOL CPDF_CalRGB::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)\n{\n    CPDF_Dictionary* pDict = pArray->GetDict(1);\n    CPDF_Array* pParam = pDict->GetArray(FX_BSTRC(\"WhitePoint\"));\n    int i;\n    for (i = 0; i < 3; i ++) {\n        m_WhitePoint[i] = pParam ? pParam->GetNumber(i) : 0;\n    }\n    pParam = pDict->GetArray(FX_BSTRC(\"BlackPoint\"));\n    for (i = 0; i < 3; i ++) {\n        m_BlackPoint[i] = pParam ? pParam->GetNumber(i) : 0;\n    }\n    pParam = pDict->GetArray(FX_BSTRC(\"Gamma\"));\n    if (pParam) {\n        m_bGamma = TRUE;\n        for (i = 0; i < 3; i ++) {\n            m_Gamma[i] = pParam->GetNumber(i);\n        }\n    } else {\n        m_bGamma = FALSE;\n    }\n    pParam = pDict->GetArray(FX_BSTRC(\"Matrix\"));\n    if (pParam) {\n        m_bMatrix = TRUE;\n        for (i = 0; i < 9; i ++) {\n            m_Matrix[i] = pParam->GetNumber(i);\n        }\n    } else {\n        m_bMatrix = FALSE;\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_CalRGB::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const\n{\n    FX_FLOAT A_ = pBuf[0];\n    FX_FLOAT B_ = pBuf[1];\n    FX_FLOAT C_ = pBuf[2];\n    if (m_bGamma) {\n        A_ = (FX_FLOAT)FXSYS_pow(A_, m_Gamma[0]);\n        B_ = (FX_FLOAT)FXSYS_pow(B_, m_Gamma[1]);\n        C_ = (FX_FLOAT)FXSYS_pow(C_, m_Gamma[2]);\n    }\n    FX_FLOAT X, Y, Z;\n    if (m_bMatrix) {\n        X = m_Matrix[0] * A_ + m_Matrix[3] * B_ + m_Matrix[6] * C_;\n        Y = m_Matrix[1] * A_ + m_Matrix[4] * B_ + m_Matrix[7] * C_;\n        Z = m_Matrix[2] * A_ + m_Matrix[5] * B_ + m_Matrix[8] * C_;\n    } else {\n        X = A_;\n        Y = B_;\n        Z = C_;\n    }\n    XYZ_to_sRGB(X, Y, Z, R, G, B);\n    return TRUE;\n}\nFX_BOOL CPDF_CalRGB::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const\n{\n    pBuf[0] = R;\n    pBuf[1] = G;\n    pBuf[2] = B;\n    return TRUE;\n}\nvoid CPDF_CalRGB::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const\n{\n    if (bTransMask) {\n        FX_FLOAT Cal[3];\n        FX_FLOAT R, G, B;\n        for(int i = 0; i < pixels; i ++) {\n            Cal[0] = ((FX_FLOAT)pSrcBuf[2]) / 255;\n            Cal[1] = ((FX_FLOAT)pSrcBuf[1]) / 255;\n            Cal[2] = ((FX_FLOAT)pSrcBuf[0]) / 255;\n            GetRGB(Cal, R, G, B);\n            pDestBuf[0] = FXSYS_round(B * 255);\n            pDestBuf[1] = FXSYS_round(G * 255);\n            pDestBuf[2] = FXSYS_round(R * 255);\n            pSrcBuf += 3;\n            pDestBuf += 3;\n        }\n    }\n    ReverseRGB(pDestBuf, pSrcBuf, pixels);\n}\nclass CPDF_LabCS : public CPDF_ColorSpace\n{\npublic:\n    CPDF_LabCS()\n    {\n        m_Family = PDFCS_LAB;\n        m_nComponents = 3;\n    }\n    virtual FX_BOOL\t\tv_Load(CPDF_Document* pDoc, CPDF_Array* pArray);\n    virtual void\t\tGetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const;\n    virtual FX_BOOL\t\tGetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;\n    FX_BOOL\t\tSetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;\n    virtual void\t\tTranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;\n    FX_FLOAT\tm_WhitePoint[3];\n    FX_FLOAT\tm_BlackPoint[3];\n    FX_FLOAT\tm_Ranges[4];\n};\nFX_BOOL CPDF_LabCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)\n{\n    CPDF_Dictionary* pDict = pArray->GetDict(1);\n    CPDF_Array* pParam = pDict->GetArray(FX_BSTRC(\"WhitePoint\"));\n    int i;\n    for (i = 0; i < 3; i ++) {\n        m_WhitePoint[i] = pParam ? pParam->GetNumber(i) : 0;\n    }\n    pParam = pDict->GetArray(FX_BSTRC(\"BlackPoint\"));\n    for (i = 0; i < 3; i ++) {\n        m_BlackPoint[i] = pParam ? pParam->GetNumber(i) : 0;\n    }\n    pParam = pDict->GetArray(FX_BSTRC(\"Range\"));\n    const FX_FLOAT def_ranges[4] = { -100 * 1.0f, 100 * 1.0f, -100 * 1.0f, 100 * 1.0f};\n    for (i = 0; i < 4; i ++) {\n        m_Ranges[i] = pParam ? pParam->GetNumber(i) : def_ranges[i];\n    }\n    return TRUE;\n}\nvoid CPDF_LabCS::GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const\n{\n    value = 0;\n    if (iComponent == 0) {\n        min = 0;\n        max = 100 * 1.0f;\n    } else {\n        min = m_Ranges[iComponent * 2 - 2];\n        max = m_Ranges[iComponent * 2 - 1];\n        if (value < min) {\n            value = min;\n        } else if (value > max) {\n            value = max;\n        }\n    }\n}\nFX_BOOL CPDF_LabCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const\n{\n    FX_FLOAT Lstar = pBuf[0];\n    FX_FLOAT astar = pBuf[1];\n    FX_FLOAT bstar = pBuf[2];\n    FX_FLOAT M = (Lstar + 16.0f) / 116.0f;\n    FX_FLOAT L = M + astar / 500.0f;\n    FX_FLOAT N = M - bstar / 200.0f;\n    FX_FLOAT X, Y, Z;\n    if (L < 0.2069f) {\n        X = 0.957f * 0.12842f * (L - 0.1379f);\n    } else {\n        X = 0.957f * L * L * L;\n    }\n    if (M < 0.2069f) {\n        Y = 0.12842f * (M - 0.1379f);\n    } else {\n        Y = M * M * M;\n    }\n    if (N < 0.2069f) {\n        Z = 1.0889f * 0.12842f * (N - 0.1379f);\n    } else {\n        Z = 1.0889f * N * N * N;\n    }\n    XYZ_to_sRGB(X, Y, Z, R, G, B);\n    return TRUE;\n}\nFX_BOOL CPDF_LabCS::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const\n{\n    return FALSE;\n}\nvoid CPDF_LabCS::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const\n{\n    for (int i = 0; i < pixels; i ++) {\n        FX_FLOAT lab[3];\n        FX_FLOAT R, G, B;\n        lab[0] = (pSrcBuf[0] * 100 / 255.0f);\n        lab[1] = (FX_FLOAT)(pSrcBuf[1] - 128);\n        lab[2] = (FX_FLOAT)(pSrcBuf[2] - 128);\n        GetRGB(lab, R, G, B);\n        pDestBuf[0] = (FX_INT32)(B * 255);\n        pDestBuf[1] = (FX_INT32)(G * 255);\n        pDestBuf[2] = (FX_INT32)(R * 255);\n        pDestBuf += 3;\n        pSrcBuf += 3;\n    }\n}\nCPDF_IccProfile::CPDF_IccProfile(FX_LPCBYTE pData, FX_DWORD dwSize, int nComponents)\n{\n    m_bsRGB = nComponents == 3 && dwSize == 3144 && FXSYS_memcmp32(pData + 0x190, \"sRGB IEC61966-2.1\", 17) == 0;\n    m_pTransform = NULL;\n    if (!m_bsRGB && CPDF_ModuleMgr::Get()->GetIccModule()) {\n        m_pTransform = CPDF_ModuleMgr::Get()->GetIccModule()->CreateTransform_sRGB(pData, dwSize, nComponents);\n    }\n}\nCPDF_IccProfile::~CPDF_IccProfile()\n{\n    if (m_pTransform) {\n        CPDF_ModuleMgr::Get()->GetIccModule()->DestroyTransform(m_pTransform);\n    }\n}\nclass CPDF_ICCBasedCS : public CPDF_ColorSpace\n{\npublic:\n    CPDF_ICCBasedCS();\n    virtual ~CPDF_ICCBasedCS();\n    virtual FX_BOOL\t\tv_Load(CPDF_Document* pDoc, CPDF_Array* pArray);\n    void\t\t\t\tGetDefaultValue(int i, FX_FLOAT& min, FX_FLOAT& max) const\n    {\n        min = m_pRanges[i * 2];\n        max = m_pRanges[i * 2 + 1];\n    }\n    virtual FX_BOOL\t\tGetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;\n    FX_BOOL\t\t\t\tv_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const;\n    FX_BOOL\t\t\t\tSetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;\n    virtual void\t\tEnableStdConversion(FX_BOOL bEnabled);\n    virtual void\t\tTranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;\n    FX_FLOAT*\t\tm_pRanges;\n    CPDF_IccProfile*\tm_pProfile;\n    CPDF_ColorSpace*\tm_pAlterCS;\n    FX_LPBYTE\t\t\tm_pCache;\n    FX_BOOL\t\t\t\tm_bOwn;\n};\nCPDF_ICCBasedCS::CPDF_ICCBasedCS()\n{\n    m_pAlterCS = NULL;\n    m_pProfile = NULL;\n    m_Family = PDFCS_ICCBASED;\n    m_pCache = NULL;\n    m_pRanges = NULL;\n    m_bOwn = FALSE;\n}\nCPDF_ICCBasedCS::~CPDF_ICCBasedCS()\n{\n    if (m_pCache) {\n        FX_Free(m_pCache);\n    }\n    if (m_pRanges) {\n        FX_Free(m_pRanges);\n    }\n    if (m_pAlterCS && m_bOwn) {\n        m_pAlterCS->ReleaseCS();\n    }\n    if (m_pProfile && m_pDocument) {\n        m_pDocument->GetPageData()->ReleaseIccProfile(NULL, m_pProfile);\n    }\n}\nFX_BOOL CPDF_ICCBasedCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)\n{\n    CPDF_Stream* pStream = pArray->GetStream(1);\n    if (pStream == NULL) {\n        return FALSE;\n    }\n    CPDF_Dictionary* pDict = pStream->GetDict();\n    m_nComponents = pDict ? pDict->GetInteger(FX_BSTRC(\"N\")) : 0;\n    if (m_nComponents <= 0 || m_nComponents > (1 << 16)) {\n        return FALSE;\n    }\n    CPDF_Array* pRanges = pDict->GetArray(FX_BSTRC(\"Range\"));\n    m_pRanges = FX_Alloc(FX_FLOAT, m_nComponents * 2);\n    for (int i = 0; i < m_nComponents * 2; i ++) {\n        if (pRanges) {\n            m_pRanges[i] = pRanges->GetNumber(i);\n        } else if (i % 2) {\n            m_pRanges[i] = 1.0f;\n        } else {\n            m_pRanges[i] = 0;\n        }\n    }\n    m_pProfile = pDoc->LoadIccProfile(pStream, m_nComponents);\n    if (!m_pProfile) {\n        return FALSE;\n    }\n    if (m_pProfile->m_pTransform == NULL) {\n        CPDF_Object* pAlterCSObj = pDict ? pDict->GetElementValue(FX_BSTRC(\"Alternate\")) : NULL;\n        if (pAlterCSObj) {\n            CPDF_ColorSpace* alter_cs = CPDF_ColorSpace::Load(pDoc, pAlterCSObj);\n            if (alter_cs) {\n                if (alter_cs->CountComponents() > m_nComponents) {\n                    alter_cs->ReleaseCS();\n                } else {\n                    m_pAlterCS = alter_cs;\n                    m_bOwn = TRUE;\n                }\n            }\n        }\n        if (!m_pAlterCS) {\n            if (m_nComponents == 3) {\n                m_pAlterCS = GetStockCS(PDFCS_DEVICERGB);\n            } else if (m_nComponents == 4) {\n                m_pAlterCS = GetStockCS(PDFCS_DEVICECMYK);\n            } else {\n                m_pAlterCS = GetStockCS(PDFCS_DEVICEGRAY);\n            }\n        }\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_ICCBasedCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const\n{\n    if (m_pProfile && m_pProfile->m_bsRGB) {\n        R = pBuf[0];\n        G = pBuf[1];\n        B = pBuf[2];\n        return TRUE;\n    }\n    ICodec_IccModule *pIccModule = CPDF_ModuleMgr::Get()->GetIccModule();\n    if (m_pProfile->m_pTransform == NULL || pIccModule == NULL) {\n        if (m_pAlterCS) {\n            m_pAlterCS->GetRGB(pBuf, R, G, B);\n        } else {\n            R = G = B = 0.0f;\n        }\n        return TRUE;\n    }\n    FX_FLOAT rgb[3];\n    pIccModule->SetComponents(m_nComponents);\n    pIccModule->Translate(m_pProfile->m_pTransform, pBuf, rgb);\n    R = rgb[0];\n    G = rgb[1];\n    B = rgb[2];\n    return TRUE;\n}\nFX_BOOL CPDF_ICCBasedCS::v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const\n{\n    if (m_nComponents != 4) {\n        return FALSE;\n    }\n    c = pBuf[0];\n    m = pBuf[1];\n    y = pBuf[2];\n    k = pBuf[3];\n    return TRUE;\n}\nFX_BOOL CPDF_ICCBasedCS::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const\n{\n    return FALSE;\n}\nvoid CPDF_ICCBasedCS::EnableStdConversion(FX_BOOL bEnabled)\n{\n    CPDF_ColorSpace::EnableStdConversion(bEnabled);\n    if (m_pAlterCS) {\n        m_pAlterCS->EnableStdConversion(bEnabled);\n    }\n}\nvoid CPDF_ICCBasedCS::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const\n{\n    if (m_pProfile->m_bsRGB) {\n        ReverseRGB(pDestBuf, pSrcBuf, pixels);\n    } else if (m_pProfile->m_pTransform) {\n        int nMaxColors = 1;\n        for (int i = 0; i < m_nComponents; i ++) {\n            nMaxColors *= 52;\n        }\n        if (m_nComponents > 3 || image_width * image_height < nMaxColors * 3 / 2) {\n            CPDF_ModuleMgr::Get()->GetIccModule()->TranslateScanline(m_pProfile->m_pTransform, pDestBuf, pSrcBuf, pixels);\n        } else {\n            if (m_pCache == NULL) {\n                ((CPDF_ICCBasedCS*)this)->m_pCache = FX_Alloc(FX_BYTE, nMaxColors * 3);\n                FX_LPBYTE temp_src = FX_Alloc(FX_BYTE, nMaxColors * m_nComponents);\n                FX_LPBYTE pSrc = temp_src;\n                for (int i = 0; i < nMaxColors; i ++) {\n                    FX_DWORD color = i;\n                    FX_DWORD order = nMaxColors / 52;\n                    for (int c = 0; c < m_nComponents; c ++) {\n                        *pSrc++ = (FX_BYTE)(color / order * 5);\n                        color %= order;\n                        order /= 52;\n                    }\n                }\n                CPDF_ModuleMgr::Get()->GetIccModule()->TranslateScanline(m_pProfile->m_pTransform, m_pCache, temp_src, nMaxColors);\n                FX_Free(temp_src);\n            }\n            for (int i = 0; i < pixels; i ++) {\n                int index = 0;\n                for (int c = 0; c < m_nComponents; c ++) {\n                    index = index * 52 + (*pSrcBuf) / 5;\n                    pSrcBuf ++;\n                }\n                index *= 3;\n                *pDestBuf++ = m_pCache[index];\n                *pDestBuf++ = m_pCache[index + 1];\n                *pDestBuf++ = m_pCache[index + 2];\n            }\n        }\n    } else if (m_pAlterCS) {\n        m_pAlterCS->TranslateImageLine(pDestBuf, pSrcBuf, pixels, image_width, image_height);\n    }\n}\nclass CPDF_IndexedCS : public CPDF_ColorSpace\n{\npublic:\n    CPDF_IndexedCS();\n    virtual ~CPDF_IndexedCS();\n    virtual FX_BOOL\t\tv_Load(CPDF_Document* pDoc, CPDF_Array* pArray);\n    void\t\t\t\tGetDefaultValue(int iComponent, FX_FLOAT& min, FX_FLOAT& max) const\n    {\n        min = 0;\n        max = (FX_FLOAT)m_MaxIndex;\n    }\n    virtual FX_BOOL\t\tGetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;\n    virtual CPDF_ColorSpace*\tGetBaseCS() const\n    {\n        return m_pBaseCS;\n    }\n    virtual void\t\tEnableStdConversion(FX_BOOL bEnabled);\n    CPDF_ColorSpace*\tm_pBaseCS;\n    int\t\t\t\t\tm_nBaseComponents;\n    int\t\t\t\t\tm_MaxIndex;\n    CFX_ByteString\t\tm_Table;\n    FX_FLOAT*\t\tm_pCompMinMax;\n};\nCPDF_IndexedCS::CPDF_IndexedCS()\n{\n    m_pBaseCS = NULL;\n    m_Family = PDFCS_INDEXED;\n    m_nComponents = 1;\n    m_pCompMinMax = NULL;\n}\nCPDF_IndexedCS::~CPDF_IndexedCS()\n{\n    if (m_pCompMinMax) {\n        FX_Free(m_pCompMinMax);\n    }\n    CPDF_ColorSpace* pCS = m_pBaseCS;\n    if (pCS && m_pDocument) {\n        m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray());\n    }\n}\nFX_BOOL CPDF_IndexedCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)\n{\n    if (pArray->GetCount() < 4) {\n        return FALSE;\n    }\n    CPDF_Object* pBaseObj = pArray->GetElementValue(1);\n    if (pBaseObj == m_pArray) {\n        return FALSE;\n    }\n    CPDF_DocPageData* pDocPageData = pDoc->GetPageData();\n    m_pBaseCS = pDocPageData->GetColorSpace(pBaseObj, NULL);\n    if (m_pBaseCS == NULL) {\n        return FALSE;\n    }\n    m_nBaseComponents = m_pBaseCS->CountComponents();\n    m_pCompMinMax = FX_Alloc(FX_FLOAT, m_nBaseComponents * 2);\n    FX_FLOAT defvalue;\n    for (int i = 0; i < m_nBaseComponents; i ++) {\n        m_pBaseCS->GetDefaultValue(i, defvalue, m_pCompMinMax[i * 2], m_pCompMinMax[i * 2 + 1]);\n        m_pCompMinMax[i * 2 + 1] -= m_pCompMinMax[i * 2];\n    }\n    m_MaxIndex = pArray->GetInteger(2);\n    CPDF_Object* pTableObj = pArray->GetElementValue(3);\n    if (pTableObj == NULL) {\n        return FALSE;\n    }\n    FX_LPCBYTE pTable = NULL;\n    FX_DWORD size = 0;\n    CPDF_StreamAcc* pStreamAcc = NULL;\n    if (pTableObj->GetType() == PDFOBJ_STRING) {\n        m_Table = ((CPDF_String*)pTableObj)->GetString();\n    } else if (pTableObj->GetType() == PDFOBJ_STREAM) {\n        CPDF_StreamAcc acc;\n        acc.LoadAllData((CPDF_Stream*)pTableObj, FALSE);\n        m_Table = CFX_ByteStringC(acc.GetData(), acc.GetSize());\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_IndexedCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const\n{\n    int index = (FX_INT32)(*pBuf);\n    if (index < 0 || index > m_MaxIndex) {\n        return FALSE;\n    }\n    if (m_nBaseComponents) {\n        if (index == INT_MAX || (index + 1) > INT_MAX / m_nBaseComponents ||\n                (index + 1)*m_nBaseComponents > (int)m_Table.GetLength()) {\n            R = G = B = 0;\n            return FALSE;\n        }\n    }\n    CFX_FixedBufGrow<FX_FLOAT, 16> Comps(m_nBaseComponents);\n    FX_FLOAT* comps = Comps;\n    FX_LPCBYTE pTable = m_Table;\n    for (int i = 0; i < m_nBaseComponents; i ++) {\n        comps[i] = m_pCompMinMax[i * 2] + m_pCompMinMax[i * 2 + 1] * pTable[index * m_nBaseComponents + i] / 255;\n    }\n    m_pBaseCS->GetRGB(comps, R, G, B);\n    return TRUE;\n}\nvoid CPDF_IndexedCS::EnableStdConversion(FX_BOOL bEnabled)\n{\n    CPDF_ColorSpace::EnableStdConversion(bEnabled);\n    if (m_pBaseCS) {\n        m_pBaseCS->EnableStdConversion(bEnabled);\n    }\n}\n#define MAX_PATTERN_COLORCOMPS\t16\ntypedef struct _PatternValue {\n    CPDF_Pattern*\tm_pPattern;\n    int\t\t\t\tm_nComps;\n    FX_FLOAT\t\tm_Comps[MAX_PATTERN_COLORCOMPS];\n} PatternValue;\nCPDF_PatternCS::CPDF_PatternCS()\n{\n    m_Family = PDFCS_PATTERN;\n    m_pBaseCS = NULL;\n    m_nComponents = 1;\n}\nCPDF_PatternCS::~CPDF_PatternCS()\n{\n    CPDF_ColorSpace* pCS = m_pBaseCS;\n    if (pCS && m_pDocument) {\n        m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray());\n    }\n}\nFX_BOOL CPDF_PatternCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)\n{\n    CPDF_Object* pBaseCS = pArray->GetElementValue(1);\n    if (pBaseCS == m_pArray) {\n        return FALSE;\n    }\n    CPDF_DocPageData* pDocPageData = pDoc->GetPageData();\n    m_pBaseCS = pDocPageData->GetColorSpace(pBaseCS, NULL);\n    if (m_pBaseCS) {\n        m_nComponents = m_pBaseCS->CountComponents() + 1;\n        if (m_pBaseCS->CountComponents() > MAX_PATTERN_COLORCOMPS) {\n            return FALSE;\n        }\n    } else {\n        m_nComponents = 1;\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_PatternCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const\n{\n    if (m_pBaseCS) {\n        PatternValue* pvalue = (PatternValue*)pBuf;\n        m_pBaseCS->GetRGB(pvalue->m_Comps, R, G, B);\n        return TRUE;\n    }\n    R = G = B = 0.75f;\n    return FALSE;\n}\nclass CPDF_SeparationCS : public CPDF_ColorSpace\n{\npublic:\n    CPDF_SeparationCS();\n    virtual ~CPDF_SeparationCS();\n    virtual void\t\tGetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const\n    {\n        value = 1.0f;\n        min = 0;\n        max = 1.0f;\n    }\n    virtual FX_BOOL\t\tv_Load(CPDF_Document* pDoc, CPDF_Array* pArray);\n    virtual FX_BOOL\t\tGetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;\n    virtual void\t\tEnableStdConversion(FX_BOOL bEnabled);\n    CPDF_ColorSpace*\tm_pAltCS;\n    CPDF_Function*\t\tm_pFunc;\n    enum {None, All, Colorant}\tm_Type;\n};\nCPDF_SeparationCS::CPDF_SeparationCS()\n{\n    m_Family = PDFCS_SEPARATION;\n    m_pAltCS = NULL;\n    m_pFunc = NULL;\n    m_nComponents = 1;\n}\nCPDF_SeparationCS::~CPDF_SeparationCS()\n{\n    if (m_pAltCS) {\n        m_pAltCS->ReleaseCS();\n    }\n    if (m_pFunc) {\n        delete m_pFunc;\n    }\n}\nFX_BOOL CPDF_SeparationCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)\n{\n    CFX_ByteString name = pArray->GetString(1);\n    if (name == FX_BSTRC(\"None\")) {\n        m_Type = None;\n    } else {\n        m_Type = Colorant;\n        CPDF_Object* pAltCS = pArray->GetElementValue(2);\n        if (pAltCS == m_pArray) {\n            return FALSE;\n        }\n        m_pAltCS = Load(pDoc, pAltCS);\n        CPDF_Object* pFuncObj = pArray->GetElementValue(3);\n        if (pFuncObj && pFuncObj->GetType() != PDFOBJ_NAME) {\n            m_pFunc = CPDF_Function::Load(pFuncObj);\n        }\n        if (m_pFunc && m_pAltCS && m_pFunc->CountOutputs() < m_pAltCS->CountComponents()) {\n            delete m_pFunc;\n            m_pFunc = NULL;\n        }\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_SeparationCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const\n{\n    if (m_Type == None) {\n        return FALSE;\n    }\n    if (m_pFunc == NULL) {\n        if (m_pAltCS == NULL) {\n            return FALSE;\n        }\n        int nComps = m_pAltCS->CountComponents();\n        CFX_FixedBufGrow<FX_FLOAT, 16> results(nComps);\n        for (int i = 0; i < nComps; i ++) {\n            results[i] = *pBuf;\n        }\n        m_pAltCS->GetRGB(results, R, G, B);\n        return TRUE;\n    }\n    CFX_FixedBufGrow<FX_FLOAT, 16> results(m_pFunc->CountOutputs());\n    int nresults = 0;\n    m_pFunc->Call(pBuf, 1, results, nresults);\n    if (nresults == 0) {\n        return FALSE;\n    }\n    if (m_pAltCS) {\n        m_pAltCS->GetRGB(results, R, G, B);\n        return TRUE;\n    } else {\n        R = G = B = 0;\n        return FALSE;\n    }\n}\nvoid CPDF_SeparationCS::EnableStdConversion(FX_BOOL bEnabled)\n{\n    CPDF_ColorSpace::EnableStdConversion(bEnabled);\n    if (m_pAltCS) {\n        m_pAltCS->EnableStdConversion(bEnabled);\n    }\n}\nclass CPDF_DeviceNCS : public CPDF_ColorSpace\n{\npublic:\n    CPDF_DeviceNCS();\n    virtual ~CPDF_DeviceNCS();\n    virtual void\t\tGetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const\n    {\n        value = 1.0f;\n        min = 0;\n        max = 1.0f;\n    }\n    virtual FX_BOOL\tv_Load(CPDF_Document* pDoc, CPDF_Array* pArray);\n    virtual FX_BOOL\tGetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;\n    virtual void\tEnableStdConversion(FX_BOOL bEnabled);\n    CPDF_ColorSpace*\tm_pAltCS;\n    CPDF_Function*\t\tm_pFunc;\n};\nCPDF_DeviceNCS::CPDF_DeviceNCS()\n{\n    m_Family = PDFCS_DEVICEN;\n    m_pAltCS = NULL;\n    m_pFunc = NULL;\n}\nCPDF_DeviceNCS::~CPDF_DeviceNCS()\n{\n    if (m_pFunc) {\n        delete m_pFunc;\n    }\n    if (m_pAltCS) {\n        m_pAltCS->ReleaseCS();\n    }\n}\nFX_BOOL CPDF_DeviceNCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)\n{\n    CPDF_Object* pObj = pArray->GetElementValue(1);\n    if (!pObj) {\n        return FALSE;\n    }\n    if (pObj->GetType() != PDFOBJ_ARRAY) {\n        return FALSE;\n    }\n    m_nComponents = ((CPDF_Array*)pObj)->GetCount();\n    CPDF_Object* pAltCS = pArray->GetElementValue(2);\n    if (!pAltCS || pAltCS == m_pArray) {\n        return FALSE;\n    }\n    m_pAltCS = Load(pDoc, pAltCS);\n    m_pFunc = CPDF_Function::Load(pArray->GetElementValue(3));\n    if (m_pAltCS == NULL || m_pFunc == NULL) {\n        return FALSE;\n    }\n    if (m_pFunc->CountOutputs() < m_pAltCS->CountComponents()) {\n        return FALSE;\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_DeviceNCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const\n{\n    if (m_pFunc == NULL) {\n        return FALSE;\n    }\n    CFX_FixedBufGrow<FX_FLOAT, 16> results(m_pFunc->CountOutputs());\n    int nresults = 0;\n    m_pFunc->Call(pBuf, m_nComponents, results, nresults);\n    if (nresults == 0) {\n        return FALSE;\n    }\n    m_pAltCS->GetRGB(results, R, G, B);\n    return TRUE;\n}\nvoid CPDF_DeviceNCS::EnableStdConversion(FX_BOOL bEnabled)\n{\n    CPDF_ColorSpace::EnableStdConversion(bEnabled);\n    if (m_pAltCS) {\n        m_pAltCS->EnableStdConversion(bEnabled);\n    }\n}\nCPDF_ColorSpace* CPDF_ColorSpace::GetStockCS(int family)\n{\n    return CPDF_ModuleMgr::Get()->GetPageModule()->GetStockCS(family);;\n}\nCPDF_ColorSpace* _CSFromName(const CFX_ByteString& name)\n{\n    if (name == FX_BSTRC(\"DeviceRGB\") || name == FX_BSTRC(\"RGB\")) {\n        return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);\n    }\n    if (name == FX_BSTRC(\"DeviceGray\") || name == FX_BSTRC(\"G\")) {\n        return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);\n    }\n    if (name == FX_BSTRC(\"DeviceCMYK\") || name == FX_BSTRC(\"CMYK\")) {\n        return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);\n    }\n    if (name == FX_BSTRC(\"Pattern\")) {\n        return CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN);\n    }\n    return NULL;\n}\nCPDF_ColorSpace* CPDF_ColorSpace::Load(CPDF_Document* pDoc, CPDF_Object* pObj)\n{\n    if (pObj == NULL) {\n        return NULL;\n    }\n    if (pObj->GetType() == PDFOBJ_NAME) {\n        return _CSFromName(pObj->GetString());\n    }\n    if (pObj->GetType() == PDFOBJ_STREAM) {\n        CPDF_Dictionary *pDict = ((CPDF_Stream *)pObj)->GetDict();\n        if (!pDict) {\n            return NULL;\n        }\n        CPDF_ColorSpace *pRet = NULL;\n        FX_POSITION pos = pDict->GetStartPos();\n        while (pos) {\n            CFX_ByteString bsKey;\n            CPDF_Object *pValue = pDict->GetNextElement(pos, bsKey);\n            if (pValue && pValue->GetType() == PDFOBJ_NAME) {\n                pRet = _CSFromName(pValue->GetString());\n            }\n            if (pRet) {\n                return pRet;\n            }\n        }\n        return NULL;\n    }\n    if (pObj->GetType() != PDFOBJ_ARRAY) {\n        return NULL;\n    }\n    CPDF_Array* pArray = (CPDF_Array*)pObj;\n    if (pArray->GetCount() == 0) {\n        return NULL;\n    }\n    CFX_ByteString familyname = pArray->GetElementValue(0)->GetString();\n    if (pArray->GetCount() == 1) {\n        return _CSFromName(familyname);\n    }\n    CPDF_ColorSpace* pCS = NULL;\n    FX_DWORD id = familyname.GetID();\n    if (id == FXBSTR_ID('C', 'a', 'l', 'G')) {\n        pCS = FX_NEW CPDF_CalGray();\n    } else if (id == FXBSTR_ID('C', 'a', 'l', 'R')) {\n        pCS = FX_NEW CPDF_CalRGB();\n    } else if (id == FXBSTR_ID('L', 'a', 'b', 0)) {\n        pCS = FX_NEW CPDF_LabCS();\n    } else if (id == FXBSTR_ID('I', 'C', 'C', 'B')) {\n        pCS = FX_NEW CPDF_ICCBasedCS();\n    } else if (id == FXBSTR_ID('I', 'n', 'd', 'e') || id == FXBSTR_ID('I', 0, 0, 0)) {\n        pCS = FX_NEW CPDF_IndexedCS();\n    } else if (id == FXBSTR_ID('S', 'e', 'p', 'a')) {\n        pCS = FX_NEW CPDF_SeparationCS();\n    } else if (id == FXBSTR_ID('D', 'e', 'v', 'i')) {\n        pCS = FX_NEW CPDF_DeviceNCS();\n    } else if (id == FXBSTR_ID('P', 'a', 't', 't')) {\n        pCS = FX_NEW CPDF_PatternCS();\n    } else {\n        return NULL;\n    }\n    pCS->m_pDocument = pDoc;\n    pCS->m_pArray = pArray;\n    if (!pCS->v_Load(pDoc, pArray)) {\n        pCS->ReleaseCS();\n        return NULL;\n    }\n    return pCS;\n}\nCPDF_ColorSpace::CPDF_ColorSpace()\n{\n    m_Family = 0;\n    m_pArray = NULL;\n    m_dwStdConversion = 0;\n    m_pDocument = NULL;\n}\nvoid CPDF_ColorSpace::ReleaseCS()\n{\n    if (this == GetStockCS(PDFCS_DEVICERGB)) {\n        return;\n    }\n    if (this == GetStockCS(PDFCS_DEVICEGRAY)) {\n        return;\n    }\n    if (this == GetStockCS(PDFCS_DEVICECMYK)) {\n        return;\n    }\n    if (this == GetStockCS(PDFCS_PATTERN)) {\n        return;\n    }\n    delete this;\n}\nint CPDF_ColorSpace::GetBufSize() const\n{\n    if (m_Family == PDFCS_PATTERN) {\n        return sizeof(PatternValue);\n    }\n    return m_nComponents * sizeof(FX_FLOAT);\n}\nFX_FLOAT* CPDF_ColorSpace::CreateBuf()\n{\n    int size = GetBufSize();\n    FX_BYTE* pBuf = FX_Alloc(FX_BYTE, size);\n    return (FX_FLOAT*)pBuf;\n}\nFX_BOOL CPDF_ColorSpace::sRGB() const\n{\n    if (m_Family == PDFCS_DEVICERGB) {\n        return TRUE;\n    }\n    if (m_Family != PDFCS_ICCBASED) {\n        return FALSE;\n    }\n    CPDF_ICCBasedCS* pCS = (CPDF_ICCBasedCS*)this;\n    return pCS->m_pProfile->m_bsRGB;\n}\nFX_BOOL CPDF_ColorSpace::GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const\n{\n    if (v_GetCMYK(pBuf, c, m, y, k)) {\n        return TRUE;\n    }\n    FX_FLOAT R, G, B;\n    if (!GetRGB(pBuf, R, G, B)) {\n        return FALSE;\n    }\n    sRGB_to_AdobeCMYK(R, G, B, c, m, y, k);\n    return TRUE;\n}\nFX_BOOL CPDF_ColorSpace::SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const\n{\n    if (v_SetCMYK(pBuf, c, m, y, k)) {\n        return TRUE;\n    }\n    FX_FLOAT R, G, B;\n    AdobeCMYK_to_sRGB(c, m, y, k, R, G, B);\n    return SetRGB(pBuf, R, G, B);\n}\nvoid CPDF_ColorSpace::GetDefaultColor(FX_FLOAT* buf) const\n{\n    if (buf == NULL || m_Family == PDFCS_PATTERN) {\n        return;\n    }\n    FX_FLOAT min, max;\n    for (int i = 0; i < m_nComponents; i ++) {\n        GetDefaultValue(i, buf[i], min, max);\n    }\n}\nint CPDF_ColorSpace::GetMaxIndex() const\n{\n    if (m_Family != PDFCS_INDEXED) {\n        return 0;\n    }\n    CPDF_IndexedCS* pCS = (CPDF_IndexedCS*)this;\n    return pCS->m_MaxIndex;\n}\nvoid CPDF_ColorSpace::TranslateImageLine(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const\n{\n    CFX_FixedBufGrow<FX_FLOAT, 16> srcbuf(m_nComponents);\n    FX_FLOAT* src = srcbuf;\n    FX_FLOAT R, G, B;\n    for (int i = 0; i < pixels; i ++) {\n        for (int j = 0; j < m_nComponents; j ++)\n            if (m_Family == PDFCS_INDEXED) {\n                src[j] = (FX_FLOAT)(*src_buf ++);\n            } else {\n                src[j] = (FX_FLOAT)(*src_buf ++) / 255;\n            }\n        GetRGB(src, R, G, B);\n        *dest_buf ++ = (FX_INT32)(B * 255);\n        *dest_buf ++ = (FX_INT32)(G * 255);\n        *dest_buf ++ = (FX_INT32)(R * 255);\n    }\n}\nvoid CPDF_ColorSpace::EnableStdConversion(FX_BOOL bEnabled)\n{\n    if (bEnabled) {\n        m_dwStdConversion ++;\n    } else if (m_dwStdConversion) {\n        m_dwStdConversion --;\n    }\n}\nCPDF_Color::CPDF_Color(int family)\n{\n    m_pCS = CPDF_ColorSpace::GetStockCS(family);\n    int nComps = 3;\n    if (family == PDFCS_DEVICEGRAY) {\n        nComps = 1;\n    } else if (family == PDFCS_DEVICECMYK) {\n        nComps = 4;\n    }\n    m_pBuffer = FX_Alloc(FX_FLOAT, nComps);\n    for (int i = 0; i < nComps; i ++) {\n        m_pBuffer[i] = 0;\n    }\n}\nCPDF_Color::~CPDF_Color()\n{\n    ReleaseBuffer();\n    ReleaseColorSpace();\n}\nvoid CPDF_Color::ReleaseBuffer()\n{\n    if (!m_pBuffer) {\n        return;\n    }\n    if (m_pCS->GetFamily() == PDFCS_PATTERN) {\n        PatternValue* pvalue = (PatternValue*)m_pBuffer;\n        CPDF_Pattern* pPattern = pvalue->m_pPattern;\n        if (pPattern && pPattern->m_pDocument) {\n            pPattern->m_pDocument->GetPageData()->ReleasePattern(pPattern->m_pPatternObj);\n        }\n    }\n    FX_Free(m_pBuffer);\n    m_pBuffer = NULL;\n}\nvoid CPDF_Color::ReleaseColorSpace()\n{\n    if (m_pCS && m_pCS->m_pDocument && m_pCS->GetArray()) {\n        m_pCS->m_pDocument->GetPageData()->ReleaseColorSpace(m_pCS->GetArray());\n        m_pCS = NULL;\n    }\n}\nvoid CPDF_Color::SetColorSpace(CPDF_ColorSpace* pCS)\n{\n    if (m_pCS == pCS) {\n        if (m_pBuffer == NULL) {\n            m_pBuffer = pCS->CreateBuf();\n        }\n        ReleaseColorSpace();\n        m_pCS = pCS;\n        return;\n    }\n    ReleaseBuffer();\n    ReleaseColorSpace();\n    m_pCS = pCS;\n    if (m_pCS) {\n        m_pBuffer = pCS->CreateBuf();\n        pCS->GetDefaultColor(m_pBuffer);\n    }\n}\nvoid CPDF_Color::SetValue(FX_FLOAT* comps)\n{\n    if (m_pBuffer == NULL) {\n        return;\n    }\n    if (m_pCS->GetFamily() != PDFCS_PATTERN) {\n        FXSYS_memcpy32(m_pBuffer, comps, m_pCS->CountComponents() * sizeof(FX_FLOAT));\n    }\n}\nvoid CPDF_Color::SetValue(CPDF_Pattern* pPattern, FX_FLOAT* comps, int ncomps)\n{\n    if (ncomps > MAX_PATTERN_COLORCOMPS) {\n        return;\n    }\n    if (m_pCS == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {\n        if (m_pBuffer) {\n            FX_Free(m_pBuffer);\n        }\n        m_pCS = CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN);\n        m_pBuffer = m_pCS->CreateBuf();\n    }\n    CPDF_DocPageData* pDocPageData = NULL;\n    PatternValue* pvalue = (PatternValue*)m_pBuffer;\n    if (pvalue->m_pPattern && pvalue->m_pPattern->m_pDocument) {\n        pDocPageData = pvalue->m_pPattern->m_pDocument->GetPageData();\n        pDocPageData->ReleasePattern(pvalue->m_pPattern->m_pPatternObj);\n    }\n    pvalue->m_nComps = ncomps;\n    pvalue->m_pPattern = pPattern;\n    if (ncomps) {\n        FXSYS_memcpy32(pvalue->m_Comps, comps, ncomps * sizeof(FX_FLOAT));\n    }\n}\nvoid CPDF_Color::Copy(const CPDF_Color* pSrc)\n{\n    ReleaseBuffer();\n    ReleaseColorSpace();\n    m_pCS = pSrc->m_pCS;\n    if (m_pCS && m_pCS->m_pDocument) {\n        CPDF_Array* pArray = m_pCS->GetArray();\n        if (pArray) {\n            m_pCS = m_pCS->m_pDocument->GetPageData()->GetCopiedColorSpace(pArray);\n        }\n    }\n    if (m_pCS == NULL) {\n        return;\n    }\n    m_pBuffer = m_pCS->CreateBuf();\n    FXSYS_memcpy32(m_pBuffer, pSrc->m_pBuffer, m_pCS->GetBufSize());\n    if (m_pCS->GetFamily() == PDFCS_PATTERN) {\n        PatternValue* pvalue = (PatternValue*)m_pBuffer;\n        if (pvalue->m_pPattern && pvalue->m_pPattern->m_pDocument) {\n            pvalue->m_pPattern = pvalue->m_pPattern->m_pDocument->GetPageData()->GetPattern(pvalue->m_pPattern->m_pPatternObj, FALSE, &pvalue->m_pPattern->m_ParentMatrix);\n        }\n    }\n}\nFX_BOOL CPDF_Color::GetRGB(int& R, int& G, int& B) const\n{\n    if (m_pCS == NULL || m_pBuffer == NULL) {\n        return FALSE;\n    }\n    FX_FLOAT r=0.0f, g=0.0f, b=0.0f;\n    if (!m_pCS->GetRGB(m_pBuffer, r, g, b)) {\n        return FALSE;\n    }\n    R = (FX_INT32)(r * 255 + 0.5f);\n    G = (FX_INT32)(g * 255 + 0.5f);\n    B = (FX_INT32)(b * 255 + 0.5f);\n    return TRUE;\n}\nCPDF_Pattern* CPDF_Color::GetPattern() const\n{\n    if (m_pBuffer == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {\n        return NULL;\n    }\n    PatternValue* pvalue = (PatternValue*)m_pBuffer;\n    return pvalue->m_pPattern;\n}\nCPDF_ColorSpace* CPDF_Color::GetPatternCS() const\n{\n    if (m_pBuffer == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {\n        return NULL;\n    }\n    return m_pCS->GetBaseCS();\n}\nFX_FLOAT* CPDF_Color::GetPatternColor() const\n{\n    if (m_pBuffer == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {\n        return NULL;\n    }\n    PatternValue* pvalue = (PatternValue*)m_pBuffer;\n    return pvalue->m_nComps ? pvalue->m_Comps : NULL;\n}\nFX_BOOL CPDF_Color::IsEqual(const CPDF_Color& other) const\n{\n    if (m_pCS != other.m_pCS || m_pCS == NULL) {\n        return FALSE;\n    }\n    return FXSYS_memcmp32(m_pBuffer, other.m_pBuffer, m_pCS->GetBufSize()) == 0;\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_page.h\"\n#include \"../../../include/fpdfapi/fpdf_module.h\"\n#include \"../../../include/fdrm/fx_crypt.h\"\n#include \"../fpdf_font/font_int.h\"\n#include \"pageint.h\"\nclass CPDF_PageModule : public CPDF_PageModuleDef\n{\npublic:\n    CPDF_PageModule() : m_StockGrayCS(PDFCS_DEVICEGRAY), m_StockRGBCS(PDFCS_DEVICERGB),\n        m_StockCMYKCS(PDFCS_DEVICECMYK) {}\n    virtual ~CPDF_PageModule() {}\n    virtual FX_BOOL\t\tInstalled()\n    {\n        return TRUE;\n    }\n    virtual CPDF_DocPageData*\tCreateDocData(CPDF_Document* pDoc)\n    {\n        return FX_NEW CPDF_DocPageData(pDoc);\n    }\n    virtual void\t\tReleaseDoc(CPDF_Document* pDoc);\n    virtual void\t\tClearDoc(CPDF_Document* pDoc);\n    virtual CPDF_FontGlobals*\tGetFontGlobals()\n    {\n        return &m_FontGlobals;\n    }\n    virtual void\t\t\t\tClearStockFont(CPDF_Document* pDoc)\n    {\n        m_FontGlobals.Clear(pDoc);\n    }\n    virtual CPDF_ColorSpace*\tGetStockCS(int family);\n    virtual void\t\tNotifyCJKAvailable();\n    CPDF_FontGlobals\tm_FontGlobals;\n    CPDF_DeviceCS\t\tm_StockGrayCS;\n    CPDF_DeviceCS\t\tm_StockRGBCS;\n    CPDF_DeviceCS\t\tm_StockCMYKCS;\n    CPDF_PatternCS\t\tm_StockPatternCS;\n};\nCPDF_ColorSpace* CPDF_PageModule::GetStockCS(int family)\n{\n    if (family == PDFCS_DEVICEGRAY) {\n        return &m_StockGrayCS;\n    }\n    if (family == PDFCS_DEVICERGB) {\n        return &m_StockRGBCS;\n    }\n    if (family == PDFCS_DEVICECMYK) {\n        return &m_StockCMYKCS;\n    }\n    if (family == PDFCS_PATTERN) {\n        return &m_StockPatternCS;\n    }\n    return NULL;\n}\nvoid CPDF_ModuleMgr::InitPageModule()\n{\n    if (m_pPageModule) {\n        delete m_pPageModule;\n    }\n    CPDF_PageModule* pPageModule = FX_NEW CPDF_PageModule;\n    m_pPageModule = pPageModule;\n}\nvoid CPDF_PageModule::ReleaseDoc(CPDF_Document* pDoc)\n{\n    delete pDoc->GetPageData();\n}\nvoid CPDF_PageModule::ClearDoc(CPDF_Document* pDoc)\n{\n    pDoc->GetPageData()->Clear(FALSE);\n}\nvoid CPDF_PageModule::NotifyCJKAvailable()\n{\n    m_FontGlobals.m_CMapManager.ReloadAll();\n}\nCPDF_Font* CPDF_Document::LoadFont(CPDF_Dictionary* pFontDict)\n{\n    if (!pFontDict) {\n        return NULL;\n    }\n    return GetValidatePageData()->GetFont(pFontDict, FALSE);\n}\nCPDF_Font* CPDF_Document::FindFont(CPDF_Dictionary* pFontDict)\n{\n    if (!pFontDict) {\n        return NULL;\n    }\n    return GetValidatePageData()->GetFont(pFontDict, TRUE);\n}\nCPDF_StreamAcc* CPDF_Document::LoadFontFile(CPDF_Stream* pStream)\n{\n    if (pStream == NULL) {\n        return NULL;\n    }\n    return GetValidatePageData()->GetFontFileStreamAcc(pStream);\n}\nCPDF_ColorSpace* _CSFromName(const CFX_ByteString& name);\nCPDF_ColorSpace* CPDF_Document::LoadColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources)\n{\n    return GetValidatePageData()->GetColorSpace(pCSObj, pResources);\n}\nCPDF_Pattern* CPDF_Document::LoadPattern(CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix)\n{\n    return GetValidatePageData()->GetPattern(pPatternObj, bShading, matrix);\n}\nCPDF_IccProfile* CPDF_Document::LoadIccProfile(CPDF_Stream* pStream, int nComponents)\n{\n    return GetValidatePageData()->GetIccProfile(pStream, nComponents);\n}\nCPDF_Image* CPDF_Document::LoadImageF(CPDF_Object* pObj)\n{\n    if (!pObj) {\n        return NULL;\n    }\n    FXSYS_assert(pObj->GetObjNum());\n    return GetValidatePageData()->GetImage(pObj);\n}\nvoid CPDF_Document::RemoveColorSpaceFromPageData(CPDF_Object* pCSObj)\n{\n    if (!pCSObj) {\n        return;\n    }\n    GetPageData()->ReleaseColorSpace(pCSObj);\n}\nCPDF_DocPageData::CPDF_DocPageData(CPDF_Document *pPDFDoc)\n    : m_pPDFDoc(pPDFDoc)\n    , m_FontMap()\n    , m_ColorSpaceMap()\n    , m_PatternMap()\n    , m_ImageMap()\n    , m_IccProfileMap()\n    , m_FontFileMap()\n{\n    m_FontMap.InitHashTable(64);\n    m_ColorSpaceMap.InitHashTable(32);\n    m_PatternMap.InitHashTable(16);\n    m_ImageMap.InitHashTable(64);\n    m_IccProfileMap.InitHashTable(16);\n    m_FontFileMap.InitHashTable(32);\n}\nCPDF_DocPageData::~CPDF_DocPageData()\n{\n    Clear(FALSE);\n    Clear(TRUE);\n    FX_POSITION pos = NULL;\n}\nvoid CPDF_DocPageData::Clear(FX_BOOL bRelease)\n{\n    FX_POSITION pos;\n    FX_DWORD\tnCount;\n    {\n        pos = m_PatternMap.GetStartPosition();\n        while (pos) {\n            CPDF_Object* ptObj;\n            CPDF_CountedObject<CPDF_Pattern*>* ptData;\n            m_PatternMap.GetNextAssoc(pos, ptObj, ptData);\n            nCount = ptData->m_nCount;\n            if (bRelease || nCount < 2) {\n                delete ptData->m_Obj;\n                ptData->m_Obj = NULL;\n            }\n        }\n    }\n    {\n        pos = m_FontMap.GetStartPosition();\n        while (pos) {\n            CPDF_Dictionary* fontDict;\n            CPDF_CountedObject<CPDF_Font*>* fontData;\n            m_FontMap.GetNextAssoc(pos, fontDict, fontData);\n            nCount = fontData->m_nCount;\n            if (bRelease || nCount < 2) {\n                delete fontData->m_Obj;\n                fontData->m_Obj = NULL;\n            }\n        }\n    }\n    {\n        pos = m_ImageMap.GetStartPosition();\n        while (pos) {\n            FX_DWORD objNum;\n            CPDF_CountedObject<CPDF_Image*>* imageData;\n            m_ImageMap.GetNextAssoc(pos, objNum, imageData);\n            nCount = imageData->m_nCount;\n            if (bRelease || nCount < 2) {\n                delete imageData->m_Obj;\n                delete imageData;\n                m_ImageMap.RemoveKey(objNum);\n            }\n        }\n    }\n    {\n        pos = m_ColorSpaceMap.GetStartPosition();\n        while (pos) {\n            CPDF_Object* csKey;\n            CPDF_CountedObject<CPDF_ColorSpace*>* csData;\n            m_ColorSpaceMap.GetNextAssoc(pos, csKey, csData);\n            nCount = csData->m_nCount;\n            if (bRelease || nCount < 2) {\n                csData->m_Obj->ReleaseCS();\n                csData->m_Obj = NULL;\n            }\n        }\n    }\n    {\n        pos = m_IccProfileMap.GetStartPosition();\n        while (pos) {\n            CPDF_Stream* ipKey;\n            CPDF_CountedObject<CPDF_IccProfile*>* ipData;\n            m_IccProfileMap.GetNextAssoc(pos, ipKey, ipData);\n            nCount = ipData->m_nCount;\n            if (bRelease || nCount < 2) {\n                FX_POSITION pos2 = m_HashProfileMap.GetStartPosition();\n                while (pos2) {\n                    CFX_ByteString bsKey;\n                    CPDF_Stream* pFindStream = NULL;\n                    m_HashProfileMap.GetNextAssoc(pos2, bsKey, (void*&)pFindStream);\n                    if (ipKey == pFindStream) {\n                        m_HashProfileMap.RemoveKey(bsKey);\n                        break;\n                    }\n                }\n                delete ipData->m_Obj;\n                delete ipData;\n                m_IccProfileMap.RemoveKey(ipKey);\n            }\n        }\n    }\n    {\n        pos = m_FontFileMap.GetStartPosition();\n        while (pos) {\n            CPDF_Stream* ftKey;\n            CPDF_CountedObject<CPDF_StreamAcc*>* ftData;\n            m_FontFileMap.GetNextAssoc(pos, ftKey, ftData);\n            nCount = ftData->m_nCount;\n            if (bRelease || nCount < 2) {\n                delete ftData->m_Obj;\n                delete ftData;\n                m_FontFileMap.RemoveKey(ftKey);\n            }\n        }\n    }\n}\nCPDF_Font* CPDF_DocPageData::GetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnly)\n{\n    if (!pFontDict) {\n        return NULL;\n    }\n    if (findOnly) {\n        CPDF_CountedObject<CPDF_Font*>* fontData;\n        if (m_FontMap.Lookup(pFontDict, fontData)) {\n            if (!fontData->m_Obj) {\n                return NULL;\n            }\n            fontData->m_nCount ++;\n            return fontData->m_Obj;\n        }\n        return NULL;\n    }\n    CPDF_CountedObject<CPDF_Font*>* fontData = NULL;\n    if (m_FontMap.Lookup(pFontDict, fontData)) {\n        if (fontData->m_Obj) {\n            fontData->m_nCount ++;\n            return fontData->m_Obj;\n        }\n    }\n    FX_BOOL bNew = FALSE;\n    if (!fontData) {\n        fontData = FX_NEW CPDF_CountedObject<CPDF_Font*>;\n        bNew = TRUE;\n        if (!fontData) {\n            return NULL;\n        }\n    }\n    CPDF_Font* pFont = CPDF_Font::CreateFontF(m_pPDFDoc, pFontDict);\n    if (!pFont) {\n        if (bNew) {\n            delete fontData;\n        }\n        return NULL;\n    }\n    fontData->m_nCount = 2;\n    fontData->m_Obj = pFont;\n    m_FontMap.SetAt(pFontDict, fontData);\n    return pFont;\n}\nCPDF_Font* CPDF_DocPageData::GetStandardFont(FX_BSTR fontName, CPDF_FontEncoding* pEncoding)\n{\n    if (fontName.IsEmpty()) {\n        return NULL;\n    }\n    FX_POSITION pos = m_FontMap.GetStartPosition();\n    while (pos) {\n        CPDF_Dictionary* fontDict;\n        CPDF_CountedObject<CPDF_Font*>* fontData;\n        m_FontMap.GetNextAssoc(pos, fontDict, fontData);\n        CPDF_Font* pFont = fontData->m_Obj;\n        if (!pFont) {\n            continue;\n        }\n        if (pFont->GetBaseFont() != fontName) {\n            continue;\n        }\n        if (pFont->IsEmbedded()) {\n            continue;\n        }\n        if (pFont->GetFontType() != PDFFONT_TYPE1) {\n            continue;\n        }\n        if (pFont->GetFontDict()->KeyExist(FX_BSTRC(\"Widths\"))) {\n            continue;\n        }\n        CPDF_Type1Font* pT1Font = pFont->GetType1Font();\n        if (pEncoding && !pT1Font->GetEncoding()->IsIdentical(pEncoding)) {\n            continue;\n        }\n        fontData->m_nCount ++;\n        return pFont;\n    }\n    CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;\n    pDict->SetAtName(FX_BSTRC(\"Type\"), FX_BSTRC(\"Font\"));\n    pDict->SetAtName(FX_BSTRC(\"Subtype\"), FX_BSTRC(\"Type1\"));\n    pDict->SetAtName(FX_BSTRC(\"BaseFont\"), fontName);\n    if (pEncoding) {\n        pDict->SetAt(FX_BSTRC(\"Encoding\"), pEncoding->Realize());\n    }\n    m_pPDFDoc->AddIndirectObject(pDict);\n    CPDF_CountedObject<CPDF_Font*>* fontData = FX_NEW CPDF_CountedObject<CPDF_Font*>;\n    if (!fontData) {\n        return NULL;\n    }\n    CPDF_Font* pFont = CPDF_Font::CreateFontF(m_pPDFDoc, pDict);\n    if (!pFont) {\n        delete fontData;\n        return NULL;\n    }\n    fontData->m_nCount = 2;\n    fontData->m_Obj = pFont;\n    m_FontMap.SetAt(pDict, fontData);\n    return pFont;\n}\nvoid CPDF_DocPageData::ReleaseFont(CPDF_Dictionary* pFontDict)\n{\n    if (!pFontDict) {\n        return;\n    }\n    CPDF_CountedObject<CPDF_Font*>* fontData;\n    if (!m_FontMap.Lookup(pFontDict, fontData)) {\n        return;\n    }\n    if (fontData->m_Obj && --fontData->m_nCount == 0) {\n        delete fontData->m_Obj;\n        fontData->m_Obj = NULL;\n    }\n}\nCPDF_ColorSpace* CPDF_DocPageData::GetColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources)\n{\n    if (!pCSObj) {\n        return NULL;\n    }\n    if (pCSObj->GetType() == PDFOBJ_NAME) {\n        CFX_ByteString name = pCSObj->GetConstString();\n        CPDF_ColorSpace* pCS = _CSFromName(name);\n        if (!pCS && pResources) {\n            CPDF_Dictionary* pList = pResources->GetDict(FX_BSTRC(\"ColorSpace\"));\n            if (pList) {\n                pCSObj = pList->GetElementValue(name);\n                return GetColorSpace(pCSObj, NULL);\n            }\n        }\n        if (pCS == NULL || pResources == NULL) {\n            return pCS;\n        }\n        CPDF_Dictionary* pColorSpaces = pResources->GetDict(FX_BSTRC(\"ColorSpace\"));\n        if (pColorSpaces == NULL) {\n            return pCS;\n        }\n        CPDF_Object* pDefaultCS = NULL;\n        switch (pCS->GetFamily()) {\n            case PDFCS_DEVICERGB:\n                pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC(\"DefaultRGB\"));\n                break;\n            case PDFCS_DEVICEGRAY:\n                pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC(\"DefaultGray\"));\n                break;\n            case PDFCS_DEVICECMYK:\n                pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC(\"DefaultCMYK\"));\n                break;\n        }\n        if (pDefaultCS == NULL) {\n            return pCS;\n        }\n        return GetColorSpace(pDefaultCS, NULL);\n    }\n    if (pCSObj->GetType() != PDFOBJ_ARRAY) {\n        return NULL;\n    }\n    CPDF_Array* pArray = (CPDF_Array*)pCSObj;\n    if (pArray->GetCount() == 0) {\n        return NULL;\n    }\n    if (pArray->GetCount() == 1) {\n        return GetColorSpace(pArray->GetElementValue(0), pResources);\n    }\n    CPDF_CountedObject<CPDF_ColorSpace*>* csData = NULL;\n    if (m_ColorSpaceMap.Lookup(pCSObj, csData)) {\n        if (csData->m_Obj) {\n            csData->m_nCount++;\n            return csData->m_Obj;\n        }\n    }\n    FX_BOOL bNew = FALSE;\n    if (!csData) {\n        csData = FX_NEW CPDF_CountedObject<CPDF_ColorSpace*>;\n        if (!csData) {\n            return NULL;\n        }\n        bNew = TRUE;\n    }\n    CPDF_ColorSpace* pCS = CPDF_ColorSpace::Load(m_pPDFDoc, pArray);\n    if (!pCS) {\n        if (bNew) {\n            delete csData;\n        }\n        return NULL;\n    }\n    csData->m_nCount = 2;\n    csData->m_Obj = pCS;\n    m_ColorSpaceMap.SetAt(pCSObj, csData);\n    return pCS;\n}\nCPDF_ColorSpace* CPDF_DocPageData::GetCopiedColorSpace(CPDF_Object* pCSObj)\n{\n    if (!pCSObj) {\n        return NULL;\n    }\n    CPDF_CountedObject<CPDF_ColorSpace*>* csData;\n    if (!m_ColorSpaceMap.Lookup(pCSObj, csData)) {\n        return NULL;\n    }\n    if (!csData->m_Obj) {\n        return NULL;\n    }\n    csData->m_nCount ++;\n    return csData->m_Obj;\n}\nvoid CPDF_DocPageData::ReleaseColorSpace(CPDF_Object* pColorSpace)\n{\n    if (!pColorSpace) {\n        return;\n    }\n    CPDF_CountedObject<CPDF_ColorSpace*>* csData;\n    if (!m_ColorSpaceMap.Lookup(pColorSpace, csData)) {\n        return;\n    }\n    if (csData->m_Obj && --csData->m_nCount == 0) {\n        csData->m_Obj->ReleaseCS();\n        csData->m_Obj = NULL;\n    }\n}\nCPDF_Pattern* CPDF_DocPageData::GetPattern(CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix)\n{\n    if (!pPatternObj) {\n        return NULL;\n    }\n    CPDF_CountedObject<CPDF_Pattern*>* ptData = NULL;\n    if (m_PatternMap.Lookup(pPatternObj, ptData)) {\n        if (ptData->m_Obj) {\n            ptData->m_nCount++;\n            return ptData->m_Obj;\n        }\n    }\n    FX_BOOL bNew = FALSE;\n    if (!ptData) {\n        ptData = FX_NEW CPDF_CountedObject<CPDF_Pattern*>;\n        bNew = TRUE;\n        if (!ptData) {\n            return NULL;\n        }\n    }\n    CPDF_Pattern* pPattern = NULL;\n    if (bShading) {\n        pPattern = FX_NEW CPDF_ShadingPattern(m_pPDFDoc, pPatternObj, bShading, matrix);\n    } else {\n        CPDF_Dictionary* pDict = pPatternObj ? pPatternObj->GetDict() : NULL;\n        if (pDict) {\n            int type = pDict->GetInteger(FX_BSTRC(\"PatternType\"));\n            if (type == 1) {\n                pPattern = FX_NEW CPDF_TilingPattern(m_pPDFDoc, pPatternObj, matrix);\n            } else if (type == 2) {\n                pPattern = FX_NEW CPDF_ShadingPattern(m_pPDFDoc, pPatternObj, FALSE, matrix);\n            }\n        }\n    }\n    if (!pPattern) {\n        if (bNew) {\n            delete ptData;\n        }\n        return NULL;\n    }\n    ptData->m_nCount = 2;\n    ptData->m_Obj = pPattern;\n    m_PatternMap.SetAt(pPatternObj, ptData);\n    return pPattern;\n}\nvoid CPDF_DocPageData::ReleasePattern(CPDF_Object* pPatternObj)\n{\n    if (!pPatternObj) {\n        return;\n    }\n    CPDF_CountedObject<CPDF_Pattern*>* ptData;\n    if (!m_PatternMap.Lookup(pPatternObj, ptData)) {\n        return;\n    }\n    if (ptData->m_Obj && --ptData->m_nCount == 0) {\n        delete ptData->m_Obj;\n        ptData->m_Obj = NULL;\n    }\n}\nCPDF_Image* CPDF_DocPageData::GetImage(CPDF_Object* pImageStream)\n{\n    if (!pImageStream) {\n        return NULL;\n    }\n    FX_DWORD dwImageObjNum = pImageStream->GetObjNum();\n    CPDF_CountedObject<CPDF_Image*>* imageData;\n    if (m_ImageMap.Lookup(dwImageObjNum, imageData)) {\n        imageData->m_nCount ++;\n        return imageData->m_Obj;\n    }\n    imageData = FX_NEW CPDF_CountedObject<CPDF_Image*>;\n    if (!imageData) {\n        return NULL;\n    }\n    CPDF_Image* pImage = FX_NEW CPDF_Image(m_pPDFDoc);\n    if (!pImage) {\n        delete imageData;\n        return NULL;\n    }\n    pImage->LoadImageF((CPDF_Stream*)pImageStream, FALSE);\n    imageData->m_nCount = 2;\n    imageData->m_Obj = pImage;\n    m_ImageMap.SetAt(dwImageObjNum, imageData);\n    return pImage;\n}\nvoid CPDF_DocPageData::ReleaseImage(CPDF_Object* pImageStream)\n{\n    if (!pImageStream) {\n        return;\n    }\n    PDF_DocPageData_Release<FX_DWORD, CPDF_Image*>(m_ImageMap, pImageStream->GetObjNum(), NULL);\n}\nCPDF_IccProfile* CPDF_DocPageData::GetIccProfile(CPDF_Stream* pIccProfileStream, FX_INT32 nComponents)\n{\n    if (!pIccProfileStream) {\n        return NULL;\n    }\n    CPDF_CountedObject<CPDF_IccProfile*>* ipData = NULL;\n    if (m_IccProfileMap.Lookup(pIccProfileStream, ipData)) {\n        ipData->m_nCount++;\n        return ipData->m_Obj;\n    }\n    CPDF_StreamAcc stream;\n    stream.LoadAllData(pIccProfileStream, FALSE);\n    FX_BYTE digest[20];\n    CPDF_Stream* pCopiedStream = NULL;\n    CRYPT_SHA1Generate(stream.GetData(), stream.GetSize(), digest);\n    if (m_HashProfileMap.Lookup(CFX_ByteStringC(digest, 20), (void*&)pCopiedStream)) {\n        m_IccProfileMap.Lookup(pCopiedStream, ipData);\n        ipData->m_nCount++;\n        return ipData->m_Obj;\n    }\n    CPDF_IccProfile* pProfile = FX_NEW CPDF_IccProfile(stream.GetData(), stream.GetSize(), nComponents);\n    if (!pProfile) {\n        return NULL;\n    }\n    ipData = FX_NEW CPDF_CountedObject<CPDF_IccProfile*>;\n    if (!ipData) {\n        delete pProfile;\n        return NULL;\n    }\n    ipData->m_nCount = 2;\n    ipData->m_Obj = pProfile;\n    m_IccProfileMap.SetAt(pIccProfileStream, ipData);\n    m_HashProfileMap.SetAt(CFX_ByteStringC(digest, 20), pIccProfileStream);\n    return pProfile;\n}\nvoid CPDF_DocPageData::ReleaseIccProfile(CPDF_Stream* pIccProfileStream, CPDF_IccProfile* pIccProfile)\n{\n    if (!pIccProfileStream && !pIccProfile) {\n        return;\n    }\n    CPDF_CountedObject<CPDF_IccProfile*>* ipData = NULL;\n    if (m_IccProfileMap.Lookup(pIccProfileStream, ipData) && ipData->m_nCount < 2) {\n        FX_POSITION pos = m_HashProfileMap.GetStartPosition();\n        while (pos) {\n            CFX_ByteString key;\n            CPDF_Stream* pFindStream = NULL;\n            m_HashProfileMap.GetNextAssoc(pos, key, (void*&)pFindStream);\n            if (pIccProfileStream == pFindStream) {\n                m_HashProfileMap.RemoveKey(key);\n                break;\n            }\n        }\n    }\n    PDF_DocPageData_Release<CPDF_Stream*, CPDF_IccProfile*>(m_IccProfileMap, pIccProfileStream, pIccProfile);\n}\nCPDF_StreamAcc* CPDF_DocPageData::GetFontFileStreamAcc(CPDF_Stream* pFontStream)\n{\n    if (!pFontStream) {\n        return NULL;\n    }\n    CPDF_CountedObject<CPDF_StreamAcc*>* ftData;\n    if (m_FontFileMap.Lookup(pFontStream, ftData)) {\n        ftData->m_nCount ++;\n        return ftData->m_Obj;\n    }\n    ftData = FX_NEW CPDF_CountedObject<CPDF_StreamAcc*>;\n    if (!ftData) {\n        return NULL;\n    }\n    CPDF_StreamAcc* pFontFile = FX_NEW CPDF_StreamAcc;\n    if (!pFontFile) {\n        delete ftData;\n        return NULL;\n    }\n    CPDF_Dictionary* pFontDict = pFontStream->GetDict();\n    FX_INT32 org_size = pFontDict->GetInteger(FX_BSTRC(\"Length1\")) + pFontDict->GetInteger(FX_BSTRC(\"Length2\")) + pFontDict->GetInteger(FX_BSTRC(\"Length3\"));\n    if (org_size < 0) {\n        org_size = 0;\n    }\n    pFontFile->LoadAllData(pFontStream, FALSE, org_size);\n    ftData->m_nCount = 2;\n    ftData->m_Obj = pFontFile;\n    m_FontFileMap.SetAt(pFontStream, ftData);\n    return pFontFile;\n}\nvoid CPDF_DocPageData::ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, FX_BOOL bForce)\n{\n    if (!pFontStream) {\n        return;\n    }\n    PDF_DocPageData_Release<CPDF_Stream*, CPDF_StreamAcc*>(m_FontFileMap, pFontStream, NULL, bForce);\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_page/fpdf_page_func.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_page.h\"\n#include \"../../../include/fpdfapi/fpdf_module.h\"\n#include \"pageint.h\"\n#include <limits.h>\nclass CPDF_PSEngine;\ntypedef enum {PSOP_ADD, PSOP_SUB, PSOP_MUL, PSOP_DIV, PSOP_IDIV, PSOP_MOD,\n              PSOP_NEG, PSOP_ABS, PSOP_CEILING, PSOP_FLOOR, PSOP_ROUND, PSOP_TRUNCATE,\n              PSOP_SQRT, PSOP_SIN, PSOP_COS, PSOP_ATAN, PSOP_EXP, PSOP_LN, PSOP_LOG,\n              PSOP_CVI, PSOP_CVR, PSOP_EQ, PSOP_NE, PSOP_GT, PSOP_GE, PSOP_LT, PSOP_LE,\n              PSOP_AND, PSOP_OR, PSOP_XOR, PSOP_NOT, PSOP_BITSHIFT, PSOP_TRUE, PSOP_FALSE,\n              PSOP_IF, PSOP_IFELSE, PSOP_POP, PSOP_EXCH, PSOP_DUP, PSOP_COPY,\n              PSOP_INDEX, PSOP_ROLL, PSOP_PROC, PSOP_CONST\n             } PDF_PSOP;\nclass CPDF_PSProc : public CFX_Object\n{\npublic:\n    ~CPDF_PSProc();\n    FX_BOOL\tParse(CPDF_SimpleParser& parser);\n    FX_BOOL\tExecute(CPDF_PSEngine* pEngine);\n    CFX_PtrArray\t\tm_Operators;\n};\n#define PSENGINE_STACKSIZE 100\nclass CPDF_PSEngine : public CFX_Object\n{\npublic:\n    CPDF_PSEngine();\n    ~CPDF_PSEngine();\n    FX_BOOL\tParse(const FX_CHAR* string, int size);\n    FX_BOOL\tExecute()\n    {\n        return m_MainProc.Execute(this);\n    }\n    FX_BOOL\tDoOperator(PDF_PSOP op);\n    void\tReset()\n    {\n        m_StackCount = 0;\n    }\n    void\tPush(FX_FLOAT value);\n    void\tPush(int value)\n    {\n        Push((FX_FLOAT)value);\n    }\n    FX_FLOAT\tPop();\n    int\t\tGetStackSize()\n    {\n        return m_StackCount;\n    }\nprivate:\n    FX_FLOAT\tm_Stack[PSENGINE_STACKSIZE];\n    int\t\tm_StackCount;\n    CPDF_PSProc\tm_MainProc;\n};\nCPDF_PSProc::~CPDF_PSProc()\n{\n    int size = m_Operators.GetSize();\n    for (int i = 0; i < size; i ++) {\n        if (m_Operators[i] == (FX_LPVOID)PSOP_PROC) {\n            delete (CPDF_PSProc*)m_Operators[i + 1];\n            i ++;\n        } else if (m_Operators[i] == (FX_LPVOID)PSOP_CONST) {\n            FX_Free((FX_FLOAT*)m_Operators[i + 1]);\n            i ++;\n        }\n    }\n}\n#pragma optimize( \"\", off )\nFX_BOOL CPDF_PSProc::Execute(CPDF_PSEngine* pEngine)\n{\n    int size = m_Operators.GetSize();\n    for (int i = 0; i < size; i ++) {\n        PDF_PSOP op = (PDF_PSOP)(FX_UINTPTR)m_Operators[i];\n        if (op == PSOP_PROC) {\n            i ++;\n        } else if (op == PSOP_CONST) {\n            pEngine->Push(*(FX_FLOAT*)m_Operators[i + 1]);\n            i ++;\n        } else if (op == PSOP_IF) {\n            if (i < 2 || m_Operators[i - 2] != (FX_LPVOID)PSOP_PROC) {\n                return FALSE;\n            }\n            if ((int)pEngine->Pop()) {\n                ((CPDF_PSProc*)m_Operators[i - 1])->Execute(pEngine);\n            }\n        } else if (op == PSOP_IFELSE) {\n            if (i < 4 || m_Operators[i - 2] != (FX_LPVOID)PSOP_PROC ||\n                    m_Operators[i - 4] != (FX_LPVOID)PSOP_PROC) {\n                return FALSE;\n            }\n            if ((int)pEngine->Pop()) {\n                ((CPDF_PSProc*)m_Operators[i - 3])->Execute(pEngine);\n            } else {\n                ((CPDF_PSProc*)m_Operators[i - 1])->Execute(pEngine);\n            }\n        } else {\n            pEngine->DoOperator(op);\n        }\n    }\n    return TRUE;\n}\n#pragma optimize( \"\", on )\nCPDF_PSEngine::CPDF_PSEngine()\n{\n    m_StackCount = 0;\n}\nCPDF_PSEngine::~CPDF_PSEngine()\n{\n}\nvoid CPDF_PSEngine::Push(FX_FLOAT v)\n{\n    if (m_StackCount == 100) {\n        return;\n    }\n    m_Stack[m_StackCount++] = v;\n}\nFX_FLOAT CPDF_PSEngine::Pop()\n{\n    if (m_StackCount == 0) {\n        return 0;\n    }\n    return m_Stack[--m_StackCount];\n}\nconst struct _PDF_PSOpName {\n    const FX_CHAR* name;\n    PDF_PSOP op;\n} _PDF_PSOpNames[] = {\n    {\"add\", PSOP_ADD}, {\"sub\", PSOP_SUB}, {\"mul\", PSOP_MUL}, {\"div\", PSOP_DIV},\n    {\"idiv\", PSOP_IDIV}, {\"mod\", PSOP_MOD}, {\"neg\", PSOP_NEG}, {\"abs\", PSOP_ABS},\n    {\"ceiling\", PSOP_CEILING}, {\"floor\", PSOP_FLOOR}, {\"round\", PSOP_ROUND},\n    {\"truncate\", PSOP_TRUNCATE}, {\"sqrt\", PSOP_SQRT}, {\"sin\", PSOP_SIN},\n    {\"cos\", PSOP_COS}, {\"atan\", PSOP_ATAN}, {\"exp\", PSOP_EXP}, {\"ln\", PSOP_LN},\n    {\"log\", PSOP_LOG}, {\"cvi\", PSOP_CVI}, {\"cvr\", PSOP_CVR}, {\"eq\", PSOP_EQ},\n    {\"ne\", PSOP_NE}, {\"gt\", PSOP_GT}, {\"ge\", PSOP_GE}, {\"lt\", PSOP_LT},\n    {\"le\", PSOP_LE}, {\"and\", PSOP_AND}, {\"or\", PSOP_OR}, {\"xor\", PSOP_XOR},\n    {\"not\", PSOP_NOT}, {\"bitshift\", PSOP_BITSHIFT}, {\"true\", PSOP_TRUE},\n    {\"false\", PSOP_FALSE}, {\"if\", PSOP_IF}, {\"ifelse\", PSOP_IFELSE},\n    {\"pop\", PSOP_POP}, {\"exch\", PSOP_EXCH}, {\"dup\", PSOP_DUP},\n    {\"copy\", PSOP_COPY}, {\"index\", PSOP_INDEX}, {\"roll\", PSOP_ROLL},\n    {NULL, PSOP_PROC}\n};\nFX_BOOL CPDF_PSEngine::Parse(const FX_CHAR* string, int size)\n{\n    CPDF_SimpleParser parser((FX_LPBYTE)string, size);\n    CFX_ByteStringC word = parser.GetWord();\n    if (word != FX_BSTRC(\"{\")) {\n        return FALSE;\n    }\n    return m_MainProc.Parse(parser);\n}\nFX_BOOL CPDF_PSProc::Parse(CPDF_SimpleParser& parser)\n{\n    while (1) {\n        CFX_ByteStringC word = parser.GetWord();\n        if (word.IsEmpty()) {\n            return FALSE;\n        }\n        if (word == FX_BSTRC(\"}\")) {\n            return TRUE;\n        }\n        if (word == FX_BSTRC(\"{\")) {\n            CPDF_PSProc* pProc = FX_NEW CPDF_PSProc;\n            m_Operators.Add((FX_LPVOID)PSOP_PROC);\n            m_Operators.Add(pProc);\n            if (!pProc->Parse(parser)) {\n                return FALSE;\n            }\n        } else {\n            int i = 0;\n            while (_PDF_PSOpNames[i].name) {\n                if (word == CFX_ByteStringC(_PDF_PSOpNames[i].name)) {\n                    m_Operators.Add((FX_LPVOID)_PDF_PSOpNames[i].op);\n                    break;\n                }\n                i ++;\n            }\n            if (_PDF_PSOpNames[i].name == NULL) {\n                FX_FLOAT* pd = FX_Alloc(FX_FLOAT, 1);\n                *pd = FX_atof(word);\n                m_Operators.Add((FX_LPVOID)PSOP_CONST);\n                m_Operators.Add(pd);\n            }\n        }\n    }\n}\n#define PI 3.1415926535897932384626433832795f\nFX_BOOL CPDF_PSEngine::DoOperator(PDF_PSOP op)\n{\n    int i1, i2;\n    FX_FLOAT d1, d2;\n    switch (op) {\n        case PSOP_ADD:\n            d1 = Pop();\n            d2 = Pop();\n            Push(d1 + d2);\n            break;\n        case PSOP_SUB:\n            d2 = Pop();\n            d1 = Pop();\n            Push(d1 - d2);\n            break;\n        case PSOP_MUL:\n            d1 = Pop();\n            d2 = Pop();\n            Push(d1 * d2);\n            break;\n        case PSOP_DIV:\n            d2 = Pop();\n            d1 = Pop();\n            Push(d1 / d2);\n            break;\n        case PSOP_IDIV:\n            i2 = (int)Pop();\n            i1 = (int)Pop();\n            Push(i1 / i2);\n            break;\n        case PSOP_MOD:\n            i2 = (int)Pop();\n            i1 = (int)Pop();\n            Push(i1 % i2);\n            break;\n        case PSOP_NEG:\n            d1 = Pop();\n            Push(-d1);\n            break;\n        case PSOP_ABS:\n            d1 = Pop();\n            Push((FX_FLOAT)FXSYS_fabs(d1));\n            break;\n        case PSOP_CEILING:\n            d1 = Pop();\n            Push((FX_FLOAT)FXSYS_ceil(d1));\n            break;\n        case PSOP_FLOOR:\n            d1 = Pop();\n            Push((FX_FLOAT)FXSYS_floor(d1));\n            break;\n        case PSOP_ROUND:\n            d1 = Pop();\n            Push(FXSYS_round(d1));\n            break;\n        case PSOP_TRUNCATE:\n            i1 = (int)Pop();\n            Push(i1);\n            break;\n        case PSOP_SQRT:\n            d1 = Pop();\n            Push((FX_FLOAT)FXSYS_sqrt(d1));\n            break;\n        case PSOP_SIN:\n            d1 = Pop();\n            Push((FX_FLOAT)FXSYS_sin(d1 * PI / 180.0f));\n            break;\n        case PSOP_COS:\n            d1 = Pop();\n            Push((FX_FLOAT)FXSYS_cos(d1 * PI / 180.0f));\n            break;\n        case PSOP_ATAN:\n            d2 = Pop();\n            d1 = Pop();\n            d1 = (FX_FLOAT)(FXSYS_atan2(d1, d2) * 180.0 / PI);\n            if (d1 < 0) {\n                d1 += 360;\n            }\n            Push(d1);\n            break;\n        case PSOP_EXP:\n            d2 = Pop();\n            d1 = Pop();\n            Push((FX_FLOAT)FXSYS_pow(d1, d2));\n            break;\n        case PSOP_LN:\n            d1 = Pop();\n            Push((FX_FLOAT)FXSYS_log(d1));\n            break;\n        case PSOP_LOG:\n            d1 = Pop();\n            Push((FX_FLOAT)FXSYS_log10(d1));\n            break;\n        case PSOP_CVI:\n            i1 = (int)Pop();\n            Push(i1);\n            break;\n        case PSOP_CVR:\n            break;\n        case PSOP_EQ:\n            d2 = Pop();\n            d1 = Pop();\n            Push((int)(d1 == d2));\n            break;\n        case PSOP_NE:\n            d2 = Pop();\n            d1 = Pop();\n            Push((int)(d1 != d2));\n            break;\n        case PSOP_GT:\n            d2 = Pop();\n            d1 = Pop();\n            Push((int)(d1 > d2));\n            break;\n        case PSOP_GE:\n            d2 = Pop();\n            d1 = Pop();\n            Push((int)(d1 >= d2));\n            break;\n        case PSOP_LT:\n            d2 = Pop();\n            d1 = Pop();\n            Push((int)(d1 < d2));\n            break;\n        case PSOP_LE:\n            d2 = Pop();\n            d1 = Pop();\n            Push((int)(d1 <= d2));\n            break;\n        case PSOP_AND:\n            i1 = (int)Pop();\n            i2 = (int)Pop();\n            Push(i1 & i2);\n            break;\n        case PSOP_OR:\n            i1 = (int)Pop();\n            i2 = (int)Pop();\n            Push(i1 | i2);\n            break;\n        case PSOP_XOR:\n            i1 = (int)Pop();\n            i2 = (int)Pop();\n            Push(i1 ^ i2);\n            break;\n        case PSOP_NOT:\n            i1 = (int)Pop();\n            Push((int)!i1);\n            break;\n        case PSOP_BITSHIFT: {\n                int shift = (int)Pop();\n                int i = (int)Pop();\n                if (shift > 0) {\n                    Push(i << shift);\n                } else {\n                    Push(i >> -shift);\n                }\n                break;\n            }\n        case PSOP_TRUE:\n            Push(1);\n            break;\n        case PSOP_FALSE:\n            Push(0);\n            break;\n        case PSOP_POP:\n            Pop();\n            break;\n        case PSOP_EXCH:\n            d2 = Pop();\n            d1 = Pop();\n            Push(d2);\n            Push(d1);\n            break;\n        case PSOP_DUP:\n            d1 = Pop();\n            Push(d1);\n            Push(d1);\n            break;\n        case PSOP_COPY: {\n                int n = (int)Pop();\n                if (n < 0 || n > PSENGINE_STACKSIZE || m_StackCount + n > PSENGINE_STACKSIZE || n > m_StackCount) {\n                    break;\n                }\n                for (int i = 0; i < n; i ++) {\n                    m_Stack[m_StackCount + i] = m_Stack[m_StackCount + i - n];\n                }\n                m_StackCount += n;\n                break;\n            }\n        case PSOP_INDEX: {\n                int n = (int)Pop();\n                if (n < 0 || n >= m_StackCount) {\n                    break;\n                }\n                Push(m_Stack[m_StackCount - n - 1]);\n                break;\n            }\n        case PSOP_ROLL: {\n                int j = (int)Pop();\n                int n = (int)Pop();\n                if (m_StackCount == 0) {\n                    break;\n                }\n                if (n < 0 || n > m_StackCount) {\n                    break;\n                }\n                if (j < 0)\n                    for (int i = 0; i < -j; i ++) {\n                        FX_FLOAT first = m_Stack[m_StackCount - n];\n                        for (int ii = 0; ii < n - 1; ii ++) {\n                            m_Stack[m_StackCount - n + ii] = m_Stack[m_StackCount - n + ii + 1];\n                        }\n                        m_Stack[m_StackCount - 1] = first;\n                    }\n                else\n                    for (int i = 0; i < j; i ++) {\n                        FX_FLOAT last = m_Stack[m_StackCount - 1];\n                        int ii;\n                        for (ii = 0; ii < n - 1; ii ++) {\n                            m_Stack[m_StackCount - ii - 1] = m_Stack[m_StackCount - ii - 2];\n                        }\n                        m_Stack[m_StackCount - ii - 1] = last;\n                    }\n                break;\n            }\n        default:\n            break;\n    }\n    return TRUE;\n}\nstatic FX_FLOAT PDF_Interpolate(FX_FLOAT x, FX_FLOAT xmin, FX_FLOAT xmax, FX_FLOAT ymin, FX_FLOAT ymax)\n{\n    return ((x - xmin) * (ymax - ymin) / (xmax - xmin)) + ymin;\n}\nstatic FX_DWORD _GetBits32(FX_LPCBYTE pData, int bitpos, int nbits)\n{\n    int result = 0;\n    for (int i = 0; i < nbits; i ++)\n        if (pData[(bitpos + i) / 8] & (1 << (7 - (bitpos + i) % 8))) {\n            result |= 1 << (nbits - i - 1);\n        }\n    return result;\n}\ntypedef struct {\n    FX_FLOAT\tencode_max, encode_min;\n    int\t\t\tsizes;\n} SampleEncodeInfo;\ntypedef struct {\n    FX_FLOAT\tdecode_max, decode_min;\n} SampleDecodeInfo;\nclass CPDF_SampledFunc : public CPDF_Function\n{\npublic:\n    CPDF_SampledFunc();\n    virtual ~CPDF_SampledFunc();\n    virtual FX_BOOL\t\tv_Init(CPDF_Object* pObj);\n    virtual FX_BOOL\t\tv_Call(FX_FLOAT* inputs, FX_FLOAT* results) const;\n    SampleEncodeInfo*\tm_pEncodeInfo;\n    SampleDecodeInfo*\tm_pDecodeInfo;\n    FX_DWORD\tm_nBitsPerSample, m_SampleMax;\n    CPDF_StreamAcc*\tm_pSampleStream;\n};\nCPDF_SampledFunc::CPDF_SampledFunc()\n{\n    m_pSampleStream = NULL;\n    m_pEncodeInfo = NULL;\n    m_pDecodeInfo = NULL;\n}\nCPDF_SampledFunc::~CPDF_SampledFunc()\n{\n    if (m_pSampleStream) {\n        delete m_pSampleStream;\n    }\n    if (m_pEncodeInfo) {\n        FX_Free(m_pEncodeInfo);\n    }\n    if (m_pDecodeInfo) {\n        FX_Free(m_pDecodeInfo);\n    }\n}\nFX_BOOL CPDF_SampledFunc::v_Init(CPDF_Object* pObj)\n{\n    if (pObj->GetType() != PDFOBJ_STREAM) {\n        return FALSE;\n    }\n    CPDF_Stream* pStream = (CPDF_Stream*)pObj;\n    CPDF_Dictionary* pDict = pStream->GetDict();\n    CPDF_Array* pSize = pDict->GetArray(FX_BSTRC(\"Size\"));\n    CPDF_Array* pEncode = pDict->GetArray(FX_BSTRC(\"Encode\"));\n    CPDF_Array* pDecode = pDict->GetArray(FX_BSTRC(\"Decode\"));\n    m_nBitsPerSample = pDict->GetInteger(FX_BSTRC(\"BitsPerSample\"));\n    m_SampleMax = 0xffffffff >> (32 - m_nBitsPerSample);\n    m_pSampleStream = FX_NEW CPDF_StreamAcc;\n    m_pSampleStream->LoadAllData(pStream, FALSE);\n    m_pEncodeInfo = FX_Alloc(SampleEncodeInfo, m_nInputs);\n    int i;\n    FX_DWORD nTotalSamples = 1;\n    for (i = 0; i < m_nInputs; i ++) {\n        m_pEncodeInfo[i].sizes = pSize ? pSize->GetInteger(i) : 0;\n        if (!pSize && i == 0) {\n            m_pEncodeInfo[i].sizes = pDict->GetInteger(FX_BSTRC(\"Size\"));\n        }\n        if (nTotalSamples > 0 && (FX_UINT32)(m_pEncodeInfo[i].sizes) > UINT_MAX / nTotalSamples) {\n            return FALSE;\n        }\n        nTotalSamples *= m_pEncodeInfo[i].sizes;\n        if (pEncode) {\n            m_pEncodeInfo[i].encode_min = pEncode->GetFloat(i * 2);\n            m_pEncodeInfo[i].encode_max = pEncode->GetFloat(i * 2 + 1);\n        } else {\n            m_pEncodeInfo[i].encode_min = 0;\n            if (m_pEncodeInfo[i].sizes == 1) {\n                m_pEncodeInfo[i].encode_max = 1;\n            } else {\n                m_pEncodeInfo[i].encode_max = (FX_FLOAT)m_pEncodeInfo[i].sizes - 1;\n            }\n        }\n    }\n    if (nTotalSamples > 0 && m_nBitsPerSample > UINT_MAX / nTotalSamples) {\n        return FALSE;\n    }\n    nTotalSamples *= m_nBitsPerSample;\n    if (nTotalSamples > 0 && ((FX_UINT32)m_nOutputs) > UINT_MAX / nTotalSamples) {\n        return FALSE;\n    }\n    nTotalSamples *= m_nOutputs;\n    if (nTotalSamples == 0 || m_pSampleStream->GetSize() * 8 < nTotalSamples) {\n        return FALSE;\n    }\n    m_pDecodeInfo = FX_Alloc(SampleDecodeInfo, m_nOutputs);\n    for (i = 0; i < m_nOutputs; i ++) {\n        if (pDecode) {\n            m_pDecodeInfo[i].decode_min = pDecode->GetFloat(2 * i);\n            m_pDecodeInfo[i].decode_max = pDecode->GetFloat(2 * i + 1);\n        } else {\n            m_pDecodeInfo[i].decode_min = m_pRanges[i * 2];\n            m_pDecodeInfo[i].decode_max = m_pRanges[i * 2 + 1];\n        }\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_SampledFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const\n{\n    int pos = 0;\n    CFX_FixedBufGrow<FX_FLOAT, 16> encoded_input_buf(m_nInputs);\n    FX_FLOAT* encoded_input = encoded_input_buf;\n    CFX_FixedBufGrow<int, 32> int_buf(m_nInputs * 2);\n    int* index = int_buf;\n    int* blocksize = index + m_nInputs;\n    for (int i = 0; i < m_nInputs; i ++) {\n        if (i == 0) {\n            blocksize[i] = 1;\n        } else {\n            blocksize[i] = blocksize[i - 1] * m_pEncodeInfo[i - 1].sizes;\n        }\n        encoded_input[i] = PDF_Interpolate(inputs[i], m_pDomains[i * 2], m_pDomains[i * 2 + 1],\n                                           m_pEncodeInfo[i].encode_min, m_pEncodeInfo[i].encode_max);\n        index[i] = (int)encoded_input[i];\n        if (index[i] < 0) {\n            index[i] = 0;\n        } else if (index[i] > m_pEncodeInfo[i].sizes - 1) {\n            index[i] = m_pEncodeInfo[i].sizes - 1;\n        }\n        pos += index[i] * blocksize[i];\n    }\n    int bitpos = pos * m_nBitsPerSample * m_nOutputs;\n    FX_LPCBYTE pSampleData = m_pSampleStream->GetData();\n    if (pSampleData == NULL) {\n        return FALSE;\n    }\n    for (int j = 0; j < m_nOutputs; j ++) {\n        FX_DWORD sample = _GetBits32(pSampleData, bitpos + j * m_nBitsPerSample, m_nBitsPerSample);\n        FX_FLOAT encoded = (FX_FLOAT)sample;\n        for (int i = 0; i < m_nInputs; i ++) {\n            if (index[i] == m_pEncodeInfo[i].sizes - 1) {\n                if (index[i] == 0) {\n                    encoded = encoded_input[i] * (FX_FLOAT)sample;\n                }\n            } else {\n                int bitpos1 = bitpos + m_nBitsPerSample * m_nOutputs * blocksize[i];\n                FX_DWORD sample1 = _GetBits32(pSampleData, bitpos1 + j * m_nBitsPerSample, m_nBitsPerSample);\n                encoded += (encoded_input[i] - index[i]) * ((FX_FLOAT)sample1 - (FX_FLOAT)sample);\n            }\n        }\n        results[j] = PDF_Interpolate(encoded, 0, (FX_FLOAT)m_SampleMax,\n                                     m_pDecodeInfo[j].decode_min, m_pDecodeInfo[j].decode_max);\n    }\n    return TRUE;\n}\nclass CPDF_PSFunc : public CPDF_Function\n{\npublic:\n    virtual FX_BOOL\t\tv_Init(CPDF_Object* pObj);\n    virtual FX_BOOL\t\tv_Call(FX_FLOAT* inputs, FX_FLOAT* results) const;\n    CPDF_PSEngine m_PS;\n};\nFX_BOOL CPDF_PSFunc::v_Init(CPDF_Object* pObj)\n{\n    CPDF_Stream* pStream = (CPDF_Stream*)pObj;\n    CPDF_StreamAcc acc;\n    acc.LoadAllData(pStream, FALSE);\n    return m_PS.Parse((const FX_CHAR*)acc.GetData(), acc.GetSize());\n}\nFX_BOOL CPDF_PSFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const\n{\n    CPDF_PSEngine& PS = (CPDF_PSEngine&)m_PS;\n    PS.Reset();\n    int i;\n    for (i = 0; i < m_nInputs; i ++) {\n        PS.Push(inputs[i]);\n    }\n    PS.Execute();\n    if (PS.GetStackSize() < m_nOutputs) {\n        return FALSE;\n    }\n    for (i = 0; i < m_nOutputs; i ++) {\n        results[m_nOutputs - i - 1] = PS.Pop();\n    }\n    return TRUE;\n}\nclass CPDF_ExpIntFunc : public CPDF_Function\n{\npublic:\n    CPDF_ExpIntFunc();\n    virtual ~CPDF_ExpIntFunc();\n    virtual FX_BOOL\t\tv_Init(CPDF_Object* pObj);\n    virtual FX_BOOL\t\tv_Call(FX_FLOAT* inputs, FX_FLOAT* results) const;\n    FX_FLOAT\tm_Exponent;\n    FX_FLOAT*\tm_pBeginValues;\n    FX_FLOAT*\tm_pEndValues;\n    int\t\tm_nOrigOutputs;\n};\nCPDF_ExpIntFunc::CPDF_ExpIntFunc()\n{\n    m_pBeginValues = NULL;\n    m_pEndValues = NULL;\n}\nCPDF_ExpIntFunc::~CPDF_ExpIntFunc()\n{\n    if (m_pBeginValues) {\n        FX_Free(m_pBeginValues);\n    }\n    if (m_pEndValues) {\n        FX_Free(m_pEndValues);\n    }\n}\nFX_BOOL CPDF_ExpIntFunc::v_Init(CPDF_Object* pObj)\n{\n    CPDF_Dictionary* pDict = pObj->GetDict();\n    if (pDict == NULL) {\n        return FALSE;\n    }\n    CPDF_Array* pArray0 = pDict->GetArray(FX_BSTRC(\"C0\"));\n    if (m_nOutputs == 0) {\n        m_nOutputs = 1;\n        if (pArray0) {\n            m_nOutputs = pArray0->GetCount();\n        }\n    }\n    CPDF_Array* pArray1 = pDict->GetArray(FX_BSTRC(\"C1\"));\n    m_pBeginValues = FX_Alloc(FX_FLOAT, m_nOutputs * 2);\n    m_pEndValues = FX_Alloc(FX_FLOAT, m_nOutputs * 2);\n    for (int i = 0; i < m_nOutputs; i ++) {\n        m_pBeginValues[i] = pArray0 ? pArray0->GetFloat(i) : 0.0f;\n        m_pEndValues[i] = pArray1 ? pArray1->GetFloat(i) : 1.0f;\n    }\n    m_Exponent = pDict->GetFloat(FX_BSTRC(\"N\"));\n    m_nOrigOutputs = m_nOutputs;\n    if (m_nOutputs && m_nInputs > INT_MAX / m_nOutputs) {\n        return FALSE;\n    }\n    m_nOutputs *= m_nInputs;\n    return TRUE;\n}\nFX_BOOL CPDF_ExpIntFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const\n{\n    for (int i = 0; i < m_nInputs; i ++)\n        for (int j = 0; j < m_nOrigOutputs; j ++) {\n            results[i * m_nOrigOutputs + j] = m_pBeginValues[j] + (FX_FLOAT)FXSYS_pow(inputs[i], m_Exponent) *\n                                              (m_pEndValues[j] - m_pBeginValues[j]);\n        }\n    return TRUE;\n}\nclass CPDF_StitchFunc : public CPDF_Function\n{\npublic:\n    CPDF_StitchFunc();\n    virtual ~CPDF_StitchFunc();\n    virtual FX_BOOL\t\tv_Init(CPDF_Object* pObj);\n    virtual FX_BOOL\t\tv_Call(FX_FLOAT* inputs, FX_FLOAT* results) const;\n    int\t\t\tm_nSubs;\n    CPDF_Function** m_pSubFunctions;\n    FX_FLOAT*\tm_pBounds;\n    FX_FLOAT*\tm_pEncode;\n};\nCPDF_StitchFunc::CPDF_StitchFunc()\n{\n    m_nSubs = 0;\n    m_pSubFunctions = NULL;\n    m_pBounds = NULL;\n    m_pEncode = NULL;\n}\nCPDF_StitchFunc::~CPDF_StitchFunc()\n{\n    for (int i = 0; i < m_nSubs; i ++)\n        if (m_pSubFunctions[i]) {\n            delete m_pSubFunctions[i];\n        }\n    if (m_pSubFunctions) {\n        FX_Free(m_pSubFunctions);\n    }\n    if (m_pBounds) {\n        FX_Free(m_pBounds);\n    }\n    if (m_pEncode) {\n        FX_Free(m_pEncode);\n    }\n}\nFX_BOOL CPDF_StitchFunc::v_Init(CPDF_Object* pObj)\n{\n    CPDF_Dictionary* pDict = pObj->GetDict();\n    if (pDict == NULL) {\n        return FALSE;\n    }\n    CPDF_Array* pArray = pDict->GetArray(FX_BSTRC(\"Functions\"));\n    if (pArray == NULL) {\n        return FALSE;\n    }\n    m_nSubs = pArray->GetCount();\n    if (m_nSubs == 0) {\n        return FALSE;\n    }\n    m_pSubFunctions = FX_Alloc(CPDF_Function*, m_nSubs);\n    m_nOutputs = 0;\n    int i;\n    for (i = 0; i < m_nSubs; i ++) {\n        CPDF_Object* pSub = pArray->GetElementValue(i);\n        if (pSub == pObj) {\n            return FALSE;\n        }\n        m_pSubFunctions[i] = CPDF_Function::Load(pSub);\n        if (m_pSubFunctions[i] == NULL) {\n            return FALSE;\n        }\n        if (m_pSubFunctions[i]->CountOutputs() > m_nOutputs) {\n            m_nOutputs = m_pSubFunctions[i]->CountOutputs();\n        }\n    }\n    m_pBounds = FX_Alloc(FX_FLOAT, m_nSubs + 1);\n    m_pBounds[0] = m_pDomains[0];\n    pArray = pDict->GetArray(FX_BSTRC(\"Bounds\"));\n    if (pArray == NULL) {\n        return FALSE;\n    }\n    for (i = 0; i < m_nSubs - 1; i ++) {\n        m_pBounds[i + 1] = pArray->GetFloat(i);\n    }\n    m_pBounds[m_nSubs] = m_pDomains[1];\n    m_pEncode = FX_Alloc(FX_FLOAT, m_nSubs * 2);\n    pArray = pDict->GetArray(FX_BSTRC(\"Encode\"));\n    if (pArray == NULL) {\n        return FALSE;\n    }\n    for (i = 0; i < m_nSubs * 2; i ++) {\n        m_pEncode[i] = pArray->GetFloat(i);\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_StitchFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* outputs) const\n{\n    FX_FLOAT input = inputs[0];\n    int i;\n    for (i = 0; i < m_nSubs - 1; i ++)\n        if (input < m_pBounds[i + 1]) {\n            break;\n        }\n    if (m_pSubFunctions[i] == NULL) {\n        return FALSE;\n    }\n    input = PDF_Interpolate(input, m_pBounds[i], m_pBounds[i + 1], m_pEncode[i * 2], m_pEncode[i * 2 + 1]);\n    int nresults;\n    m_pSubFunctions[i]->Call(&input, m_nInputs, outputs, nresults);\n    return TRUE;\n}\nCPDF_Function* CPDF_Function::Load(CPDF_Object* pFuncObj)\n{\n    if (pFuncObj == NULL) {\n        return NULL;\n    }\n    CPDF_Function* pFunc = NULL;\n    int type;\n    if (pFuncObj->GetType() == PDFOBJ_STREAM) {\n        type = ((CPDF_Stream*)pFuncObj)->GetDict()->GetInteger(FX_BSTRC(\"FunctionType\"));\n    } else if (pFuncObj->GetType() == PDFOBJ_DICTIONARY) {\n        type = ((CPDF_Dictionary*)pFuncObj)->GetInteger(FX_BSTRC(\"FunctionType\"));\n    } else {\n        return NULL;\n    }\n    if (type == 0) {\n        pFunc = FX_NEW CPDF_SampledFunc;\n    } else if (type == 2) {\n        pFunc = FX_NEW CPDF_ExpIntFunc;\n    } else if (type == 3) {\n        pFunc = FX_NEW CPDF_StitchFunc;\n    } else if (type == 4) {\n        pFunc = FX_NEW CPDF_PSFunc;\n    } else {\n        return NULL;\n    }\n    if (!pFunc->Init(pFuncObj)) {\n        delete pFunc;\n        return NULL;\n    }\n    return pFunc;\n}\nCPDF_Function::CPDF_Function()\n{\n    m_pDomains = NULL;\n    m_pRanges = NULL;\n}\nCPDF_Function::~CPDF_Function()\n{\n    if (m_pDomains) {\n        FX_Free(m_pDomains);\n        m_pDomains = NULL;\n    }\n    if (m_pRanges) {\n        FX_Free(m_pRanges);\n        m_pRanges = NULL;\n    }\n}\nFX_BOOL CPDF_Function::Init(CPDF_Object* pObj)\n{\n    CPDF_Dictionary* pDict;\n    if (pObj->GetType() == PDFOBJ_STREAM) {\n        pDict = ((CPDF_Stream*)pObj)->GetDict();\n    } else {\n        pDict = (CPDF_Dictionary*)pObj;\n    }\n    CPDF_Array* pDomains = pDict->GetArray(FX_BSTRC(\"Domain\"));\n    if (pDomains == NULL) {\n        return FALSE;\n    }\n    m_nInputs = pDomains->GetCount() / 2;\n    if (m_nInputs == 0) {\n        return FALSE;\n    }\n    m_pDomains = FX_Alloc(FX_FLOAT, m_nInputs * 2);\n    for (int i = 0; i < m_nInputs * 2; i ++) {\n        m_pDomains[i] = pDomains->GetFloat(i);\n    }\n    CPDF_Array* pRanges = pDict->GetArray(FX_BSTRC(\"Range\"));\n    m_nOutputs = 0;\n    if (pRanges) {\n        m_nOutputs = pRanges->GetCount() / 2;\n        m_pRanges = FX_Alloc(FX_FLOAT, m_nOutputs * 2);\n        for (int i = 0; i < m_nOutputs * 2; i ++) {\n            m_pRanges[i] = pRanges->GetFloat(i);\n        }\n    }\n    FX_DWORD old_outputs = m_nOutputs;\n    FX_BOOL ret = v_Init(pObj);\n    if (m_pRanges && m_nOutputs > (int)old_outputs) {\n        m_pRanges = FX_Realloc(FX_FLOAT, m_pRanges, m_nOutputs * 2);\n        if (m_pRanges) {\n            FXSYS_memset32(m_pRanges + (old_outputs * 2), 0, sizeof(FX_FLOAT) * (m_nOutputs - old_outputs) * 2);\n        }\n    }\n    return ret;\n}\nFX_BOOL CPDF_Function::Call(FX_FLOAT* inputs, int ninputs, FX_FLOAT* results, int& nresults) const\n{\n    if (m_nInputs != ninputs) {\n        return FALSE;\n    }\n    nresults = m_nOutputs;\n    for (int i = 0; i < m_nInputs; i ++) {\n        if (inputs[i] < m_pDomains[i * 2]) {\n            inputs[i] = m_pDomains[i * 2];\n        } else if (inputs[i] > m_pDomains[i * 2 + 1]) {\n            inputs[i] = m_pDomains[i * 2] + 1;\n        }\n    }\n    v_Call(inputs, results);\n    if (m_pRanges) {\n        for (int i = 0; i < m_nOutputs; i ++) {\n            if (results[i] < m_pRanges[i * 2]) {\n                results[i] = m_pRanges[i * 2];\n            } else if (results[i] > m_pRanges[i * 2 + 1]) {\n                results[i] = m_pRanges[i * 2 + 1];\n            }\n        }\n    }\n    return TRUE;\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_page.h\"\n#include \"../../../include/fpdfapi/fpdf_pageobj.h\"\n#include \"../../../include/fpdfapi/fpdf_module.h\"\n#include \"../../../include/fpdfapi/fpdf_render.h\"\n#include \"pageint.h\"\n#include \"../fpdf_render/render_int.h\"\nvoid CPDF_GraphicStates::DefaultStates()\n{\n    m_ColorState.New()->Default();\n}\nvoid CPDF_GraphicStates::CopyStates(const CPDF_GraphicStates& src)\n{\n    m_ClipPath = src.m_ClipPath;\n    m_GraphState = src.m_GraphState;\n    m_ColorState = src.m_ColorState;\n    m_TextState = src.m_TextState;\n    m_GeneralState = src.m_GeneralState;\n}\nCPDF_ClipPathData::CPDF_ClipPathData()\n{\n    m_PathCount = 0;\n    m_pPathList = NULL;\n    m_pTypeList = NULL;\n    m_TextCount = 0;\n    m_pTextList = NULL;\n}\nCPDF_ClipPathData::~CPDF_ClipPathData()\n{\n    int i;\n    if (m_pPathList) {\n        FX_DELETE_VECTOR(m_pPathList, CPDF_Path, m_PathCount);\n    }\n    if (m_pTypeList) {\n        FX_Free(m_pTypeList);\n    }\n    for (i = m_TextCount - 1; i > -1; i --)\n        if (m_pTextList[i]) {\n            delete m_pTextList[i];\n        }\n    if (m_pTextList) {\n        FX_Free(m_pTextList);\n    }\n}\nCPDF_ClipPathData::CPDF_ClipPathData(const CPDF_ClipPathData& src)\n{\n    m_pPathList = NULL;\n    m_pPathList = NULL;\n    m_pTextList = NULL;\n    m_PathCount = src.m_PathCount;\n    if (m_PathCount) {\n        int alloc_size = m_PathCount;\n        if (alloc_size % 8) {\n            alloc_size += 8 - (alloc_size % 8);\n        }\n        FX_NEW_VECTOR(m_pPathList, CPDF_Path, alloc_size);\n        for (int i = 0; i < m_PathCount; i ++) {\n            m_pPathList[i] = src.m_pPathList[i];\n        }\n        m_pTypeList = FX_Alloc(FX_BYTE, alloc_size);\n        FXSYS_memcpy32(m_pTypeList, src.m_pTypeList, m_PathCount);\n    } else {\n        m_pPathList = NULL;\n        m_pTypeList = NULL;\n    }\n    m_TextCount = src.m_TextCount;\n    if (m_TextCount) {\n        m_pTextList = FX_Alloc(CPDF_TextObject*, m_TextCount);\n        for (int i = 0; i < m_TextCount; i ++) {\n            if (src.m_pTextList[i]) {\n                m_pTextList[i] = FX_NEW CPDF_TextObject;\n                m_pTextList[i]->Copy(src.m_pTextList[i]);\n            } else {\n                m_pTextList[i] = NULL;\n            }\n        }\n    } else {\n        m_pTextList = NULL;\n    }\n}\nvoid CPDF_ClipPathData::SetCount(int path_count, int text_count)\n{\n    ASSERT(m_TextCount == 0 && m_PathCount == 0);\n    if (path_count) {\n        m_PathCount = path_count;\n        int alloc_size = (path_count + 7) / 8 * 8;\n        FX_NEW_VECTOR(m_pPathList, CPDF_Path, alloc_size);\n        m_pTypeList = FX_Alloc(FX_BYTE, alloc_size);\n    }\n    if (text_count) {\n        m_TextCount = text_count;\n        m_pTextList = FX_Alloc(CPDF_TextObject*, text_count);\n    }\n}\nCPDF_Rect CPDF_ClipPath::GetClipBox() const\n{\n    CPDF_Rect rect;\n    FX_BOOL bStarted = FALSE;\n    int count = GetPathCount();\n    if (count) {\n        rect = GetPath(0).GetBoundingBox();\n        for (int i = 1; i < count; i ++) {\n            CPDF_Rect path_rect = GetPath(i).GetBoundingBox();\n            rect.Intersect(path_rect);\n        }\n        bStarted = TRUE;\n    }\n    count = GetTextCount();\n    if (count) {\n        CPDF_Rect layer_rect;\n        FX_BOOL bLayerStarted = FALSE;\n        for (int i = 0; i < count; i ++) {\n            CPDF_TextObject* pTextObj = GetText(i);\n            if (pTextObj == NULL) {\n                if (!bStarted) {\n                    rect = layer_rect;\n                    bStarted = TRUE;\n                } else {\n                    rect.Intersect(layer_rect);\n                }\n                bLayerStarted = FALSE;\n            } else {\n                if (!bLayerStarted) {\n                    layer_rect = pTextObj->GetBBox(NULL);\n                    bLayerStarted = TRUE;\n                } else {\n                    layer_rect.Union(pTextObj->GetBBox(NULL));\n                }\n            }\n        }\n    }\n    return rect;\n}\nvoid CPDF_ClipPath::AppendPath(CPDF_Path path, int type, FX_BOOL bAutoMerge)\n{\n    CPDF_ClipPathData* pData = GetModify();\n    if (pData->m_PathCount && bAutoMerge) {\n        CPDF_Path old_path = pData->m_pPathList[pData->m_PathCount - 1];\n        if (old_path.IsRect()) {\n            CPDF_Rect old_rect(old_path.GetPointX(0), old_path.GetPointY(0),\n                               old_path.GetPointX(2), old_path.GetPointY(2));\n            CPDF_Rect new_rect = path.GetBoundingBox();\n            if (old_rect.Contains(new_rect)) {\n                pData->m_PathCount --;\n                pData->m_pPathList[pData->m_PathCount].SetNull();\n            }\n        }\n    }\n    if (pData->m_PathCount % 8 == 0) {\n        CPDF_Path* pNewPath;\n        FX_NEW_VECTOR(pNewPath, CPDF_Path, pData->m_PathCount + 8);\n        for (int i = 0; i < pData->m_PathCount; i ++) {\n            pNewPath[i] = pData->m_pPathList[i];\n        }\n        if (pData->m_pPathList) {\n            FX_DELETE_VECTOR(pData->m_pPathList, CPDF_Path, pData->m_PathCount);\n        }\n        FX_BYTE* pNewType = FX_Alloc(FX_BYTE, pData->m_PathCount + 8);\n        FXSYS_memcpy32(pNewType, pData->m_pTypeList, pData->m_PathCount);\n        if (pData->m_pTypeList) {\n            FX_Free(pData->m_pTypeList);\n        }\n        pData->m_pPathList = pNewPath;\n        pData->m_pTypeList = pNewType;\n    }\n    pData->m_pPathList[pData->m_PathCount] = path;\n    pData->m_pTypeList[pData->m_PathCount] = (FX_BYTE)type;\n    pData->m_PathCount ++;\n}\nvoid CPDF_ClipPath::DeletePath(int index)\n{\n    CPDF_ClipPathData* pData = GetModify();\n    if (index >= pData->m_PathCount) {\n        return;\n    }\n    pData->m_pPathList[index].SetNull();\n    for (int i = index; i < pData->m_PathCount - 1; i ++) {\n        pData->m_pPathList[i] = pData->m_pPathList[i + 1];\n    }\n    pData->m_pPathList[pData->m_PathCount - 1].SetNull();\n    FXSYS_memmove32(pData->m_pTypeList + index, pData->m_pTypeList + index + 1, pData->m_PathCount - index - 1);\n    pData->m_PathCount --;\n}\n#define FPDF_CLIPPATH_MAX_TEXTS 1024\nvoid CPDF_ClipPath::AppendTexts(CPDF_TextObject** pTexts, int count)\n{\n    CPDF_ClipPathData* pData = GetModify();\n    if (pData->m_TextCount + count > FPDF_CLIPPATH_MAX_TEXTS) {\n        for (int i = 0; i < count; i ++) {\n            if (pTexts[i])\n                pTexts[i]->Release();\n        }\n        return;\n    }\n    CPDF_TextObject** pNewList = FX_Alloc(CPDF_TextObject*, pData->m_TextCount + count + 1);\n    if (pData->m_pTextList) {\n        FXSYS_memcpy32(pNewList, pData->m_pTextList, pData->m_TextCount * sizeof(CPDF_TextObject*));\n        FX_Free(pData->m_pTextList);\n    }\n    pData->m_pTextList = pNewList;\n    for (int i = 0; i < count; i ++) {\n        pData->m_pTextList[pData->m_TextCount + i] = pTexts[i];\n    }\n    pData->m_pTextList[pData->m_TextCount + count] = NULL;\n    pData->m_TextCount += count + 1;\n}\nvoid CPDF_ClipPath::Transform(const CPDF_Matrix& matrix)\n{\n    CPDF_ClipPathData* pData = GetModify();\n    int i;\n    for (i = 0; i < pData->m_PathCount; i ++) {\n        pData->m_pPathList[i].Transform(&matrix);\n    }\n    for (i = 0; i < pData->m_TextCount; i ++)\n        if (pData->m_pTextList[i]) {\n            pData->m_pTextList[i]->Transform(matrix);\n        }\n}\nCPDF_ColorStateData::CPDF_ColorStateData(const CPDF_ColorStateData& src)\n{\n    m_FillColor.Copy(&src.m_FillColor);\n    m_FillRGB = src.m_FillRGB;\n    m_StrokeColor.Copy(&src.m_StrokeColor);\n    m_StrokeRGB = src.m_StrokeRGB;\n}\nvoid CPDF_ColorStateData::Default()\n{\n    m_FillRGB = m_StrokeRGB = 0;\n    m_FillColor.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY));\n    m_StrokeColor.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY));\n}\nvoid CPDF_ColorState::SetFillColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues)\n{\n    CPDF_ColorStateData* pData = GetModify();\n    SetColor(pData->m_FillColor, pData->m_FillRGB, pCS, pValue, nValues);\n}\nvoid CPDF_ColorState::SetStrokeColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues)\n{\n    CPDF_ColorStateData* pData = GetModify();\n    SetColor(pData->m_StrokeColor, pData->m_StrokeRGB, pCS, pValue, nValues);\n}\nvoid CPDF_ColorState::SetColor(CPDF_Color& color, FX_DWORD& rgb, CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues)\n{\n    if (pCS) {\n        color.SetColorSpace(pCS);\n    } else if (color.IsNull()) {\n        color.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY));\n    }\n    if (color.m_pCS->CountComponents() > nValues) {\n        return;\n    }\n    color.SetValue(pValue);\n    int R, G, B;\n    rgb = color.GetRGB(R, G, B) ? FXSYS_RGB(R, G, B) : (FX_DWORD) - 1;\n}\nvoid CPDF_ColorState::SetFillPattern(CPDF_Pattern* pPattern, FX_FLOAT* pValue, int nValues)\n{\n    CPDF_ColorStateData* pData = GetModify();\n    pData->m_FillColor.SetValue(pPattern, pValue, nValues);\n    int R, G, B;\n    FX_BOOL ret = pData->m_FillColor.GetRGB(R, G, B);\n    if (pPattern->m_PatternType == 1 && ((CPDF_TilingPattern*)pPattern)->m_bColored && !ret) {\n        pData->m_FillRGB = 0x00BFBFBF;\n        return;\n    }\n    pData->m_FillRGB = ret ? FXSYS_RGB(R, G, B) : (FX_DWORD) - 1;\n}\nvoid CPDF_ColorState::SetStrokePattern(CPDF_Pattern* pPattern, FX_FLOAT* pValue, int nValues)\n{\n    CPDF_ColorStateData* pData = GetModify();\n    pData->m_StrokeColor.SetValue(pPattern, pValue, nValues);\n    int R, G, B;\n    FX_BOOL ret = pData->m_StrokeColor.GetRGB(R, G, B);\n    if (pPattern->m_PatternType == 1 && ((CPDF_TilingPattern*)pPattern)->m_bColored && !ret) {\n        pData->m_StrokeRGB = 0x00BFBFBF;\n        return;\n    }\n    pData->m_StrokeRGB = pData->m_StrokeColor.GetRGB(R, G, B) ? FXSYS_RGB(R, G, B) : (FX_DWORD) - 1;\n}\nCPDF_TextStateData::CPDF_TextStateData()\n{\n    m_pFont = NULL;\n    m_FontSize = 1.0f;\n    m_WordSpace = 0;\n    m_CharSpace = 0;\n    m_TextMode = 0;\n    m_Matrix[0] = m_Matrix[3] = 1.0f;\n    m_Matrix[1] = m_Matrix[2] = 0;\n    m_CTM[0] = m_CTM[3] = 1.0f;\n    m_CTM[1] = m_CTM[2] = 0;\n}\nCPDF_TextStateData::CPDF_TextStateData(const CPDF_TextStateData& src)\n{\n    FXSYS_memcpy32(this, &src, sizeof(CPDF_TextStateData));\n    if (m_pFont && m_pFont->m_pDocument) {\n        m_pFont = m_pFont->m_pDocument->GetPageData()->GetFont(m_pFont->GetFontDict(), FALSE);\n    }\n}\nCPDF_TextStateData::~CPDF_TextStateData()\n{\n    CPDF_Font* pFont = m_pFont;\n    if (pFont && pFont->m_pDocument) {\n        pFont->m_pDocument->GetPageData()->ReleaseFont(pFont->GetFontDict());\n    }\n}\nvoid CPDF_TextState::SetFont(CPDF_Font* pFont)\n{\n    CPDF_Font*& pStateFont = GetModify()->m_pFont;\n    CPDF_DocPageData* pDocPageData = NULL;\n    if (pStateFont && pStateFont->m_pDocument) {\n        pDocPageData = pStateFont->m_pDocument->GetPageData();\n        pDocPageData->ReleaseFont(pStateFont->GetFontDict());\n    }\n    pStateFont = pFont;\n}\nFX_FLOAT CPDF_TextState::GetFontSizeV() const\n{\n    FX_FLOAT* pMatrix = GetMatrix();\n    FX_FLOAT unit = FXSYS_sqrt2(pMatrix[1], pMatrix[3]);\n    FX_FLOAT size = FXSYS_Mul(unit, GetFontSize());\n    return (FX_FLOAT)FXSYS_fabs(size);\n}\nFX_FLOAT CPDF_TextState::GetFontSizeH() const\n{\n    FX_FLOAT* pMatrix = GetMatrix();\n    FX_FLOAT unit = FXSYS_sqrt2(pMatrix[0], pMatrix[2]);\n    FX_FLOAT size = FXSYS_Mul(unit, GetFontSize());\n    return (FX_FLOAT)FXSYS_fabs(size);\n}\nFX_FLOAT CPDF_TextState::GetBaselineAngle() const\n{\n    FX_FLOAT* m_Matrix = GetMatrix();\n    return FXSYS_atan2(m_Matrix[2], m_Matrix[0]);\n}\nFX_FLOAT CPDF_TextState::GetShearAngle() const\n{\n    FX_FLOAT* m_Matrix = GetMatrix();\n    FX_FLOAT shear_angle = FXSYS_atan2(m_Matrix[1], m_Matrix[3]);\n    return GetBaselineAngle() + shear_angle;\n}\nCPDF_GeneralStateData::CPDF_GeneralStateData()\n{\n    FXSYS_memset32(this, 0, sizeof(CPDF_GeneralStateData));\n    FXSYS_strcpy((FX_LPSTR)m_BlendMode, (FX_LPCSTR)\"Normal\");\n    m_StrokeAlpha = 1.0f;\n    m_FillAlpha = 1.0f;\n    m_Flatness = 1.0f;\n    m_Matrix.SetIdentity();\n}\nCPDF_GeneralStateData::CPDF_GeneralStateData(const CPDF_GeneralStateData& src)\n{\n    FXSYS_memcpy32(this, &src, sizeof(CPDF_GeneralStateData));\n    if (src.m_pTransferFunc && src.m_pTransferFunc->m_pPDFDoc) {\n        CPDF_DocRenderData* pDocCache = src.m_pTransferFunc->m_pPDFDoc->GetRenderData();\n        if (!pDocCache) {\n            return;\n        }\n        m_pTransferFunc = pDocCache->GetTransferFunc(m_pTR);\n    }\n}\nCPDF_GeneralStateData::~CPDF_GeneralStateData()\n{\n    if (m_pTransferFunc && m_pTransferFunc->m_pPDFDoc) {\n        CPDF_DocRenderData* pDocCache = m_pTransferFunc->m_pPDFDoc->GetRenderData();\n        if (!pDocCache) {\n            return;\n        }\n        pDocCache->ReleaseTransferFunc(m_pTR);\n    }\n}\nstatic int GetBlendType(FX_BSTR mode)\n{\n    switch (mode.GetID()) {\n        case FXBSTR_ID('N', 'o', 'r', 'm'):\n        case FXBSTR_ID('C', 'o', 'm', 'p'):\n            return FXDIB_BLEND_NORMAL;\n        case FXBSTR_ID('M', 'u', 'l', 't'):\n            return FXDIB_BLEND_MULTIPLY;\n        case FXBSTR_ID('S', 'c', 'r', 'e'):\n            return FXDIB_BLEND_SCREEN;\n        case FXBSTR_ID('O', 'v', 'e', 'r'):\n            return FXDIB_BLEND_OVERLAY;\n        case FXBSTR_ID('D', 'a', 'r', 'k'):\n            return FXDIB_BLEND_DARKEN;\n        case FXBSTR_ID('L', 'i', 'g', 'h'):\n            return FXDIB_BLEND_LIGHTEN;\n        case FXBSTR_ID('C', 'o', 'l', 'o'):\n            if (mode.GetLength() == 10) {\n                return FXDIB_BLEND_COLORDODGE;\n            }\n            if (mode.GetLength() == 9) {\n                return FXDIB_BLEND_COLORBURN;\n            }\n            return FXDIB_BLEND_COLOR;\n        case FXBSTR_ID('H', 'a', 'r', 'd'):\n            return FXDIB_BLEND_HARDLIGHT;\n        case FXBSTR_ID('S', 'o', 'f', 't'):\n            return FXDIB_BLEND_SOFTLIGHT;\n        case FXBSTR_ID('D', 'i', 'f', 'f'):\n            return FXDIB_BLEND_DIFFERENCE;\n        case FXBSTR_ID('E', 'x', 'c', 'l'):\n            return FXDIB_BLEND_EXCLUSION;\n        case FXBSTR_ID('H', 'u', 'e', 0):\n            return FXDIB_BLEND_HUE;\n        case FXBSTR_ID('S', 'a', 't', 'u'):\n            return FXDIB_BLEND_SATURATION;\n        case FXBSTR_ID('L', 'u', 'm', 'i'):\n            return FXDIB_BLEND_LUMINOSITY;\n    }\n    return FXDIB_BLEND_NORMAL;\n}\nvoid CPDF_GeneralStateData::SetBlendMode(FX_BSTR blend_mode)\n{\n    if (blend_mode.GetLength() > 15) {\n        return;\n    }\n    FXSYS_memcpy32(m_BlendMode, (FX_LPCBYTE)blend_mode, blend_mode.GetLength());\n    m_BlendMode[blend_mode.GetLength()] = 0;\n    m_BlendType = ::GetBlendType(blend_mode);\n}\nint RI_StringToId(const CFX_ByteString& ri)\n{\n    FX_DWORD id = ri.GetID();\n    if (id == FXBSTR_ID('A', 'b', 's', 'o')) {\n        return 1;\n    }\n    if (id == FXBSTR_ID('S', 'a', 't', 'u')) {\n        return 2;\n    }\n    if (id == FXBSTR_ID('P', 'e', 'r', 'c')) {\n        return 3;\n    }\n    return 0;\n}\nvoid CPDF_GeneralState::SetRenderIntent(const CFX_ByteString& ri)\n{\n    GetModify()->m_RenderIntent = RI_StringToId(ri);\n}\nCPDF_AllStates::CPDF_AllStates()\n{\n    m_TextX = m_TextY = m_TextLineX = m_TextLineY = 0;\n    m_TextLeading = 0;\n    m_TextRise = 0;\n    m_TextHorzScale = 1.0f;\n}\nCPDF_AllStates::~CPDF_AllStates()\n{\n}\nvoid CPDF_AllStates::Copy(const CPDF_AllStates& src)\n{\n    CopyStates(src);\n    m_TextMatrix.Copy(src.m_TextMatrix);\n    m_ParentMatrix.Copy(src.m_ParentMatrix);\n    m_CTM.Copy(src.m_CTM);\n    m_TextX = src.m_TextX;\n    m_TextY = src.m_TextY;\n    m_TextLineX = src.m_TextLineX;\n    m_TextLineY = src.m_TextLineY;\n    m_TextLeading = src.m_TextLeading;\n    m_TextRise = src.m_TextRise;\n    m_TextHorzScale = src.m_TextHorzScale;\n}\nvoid CPDF_AllStates::SetLineDash(CPDF_Array* pArray, FX_FLOAT phase, FX_FLOAT scale)\n{\n    CFX_GraphStateData* pData = m_GraphState.GetModify();\n    pData->m_DashPhase = FXSYS_Mul(phase, scale);\n    pData->SetDashCount(pArray->GetCount());\n    for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {\n        pData->m_DashArray[i] = FXSYS_Mul(pArray->GetNumber(i), scale);\n    }\n}\nvoid CPDF_AllStates::ProcessExtGS(CPDF_Dictionary* pGS, CPDF_StreamContentParser* pParser)\n{\n    CPDF_GeneralStateData* pGeneralState = m_GeneralState.GetModify();\n    FX_POSITION pos = pGS->GetStartPos();\n    while (pos) {\n        CFX_ByteString key_str;\n        CPDF_Object* pElement = pGS->GetNextElement(pos, key_str);\n        CPDF_Object* pObject = pElement ? pElement->GetDirect() : NULL;\n        if (pObject == NULL) {\n            continue;\n        }\n        FX_DWORD key = key_str.GetID();\n        switch (key) {\n            case FXBSTR_ID('L', 'W', 0, 0):\n                m_GraphState.GetModify()->m_LineWidth = pObject->GetNumber();\n                break;\n            case FXBSTR_ID('L', 'C', 0, 0):\n                m_GraphState.GetModify()->m_LineCap = (CFX_GraphStateData::LineCap)pObject->GetInteger();\n                break;\n            case FXBSTR_ID('L', 'J', 0, 0):\n                m_GraphState.GetModify()->m_LineJoin = (CFX_GraphStateData::LineJoin)pObject->GetInteger();\n                break;\n            case FXBSTR_ID('M', 'L', 0, 0):\n                m_GraphState.GetModify()->m_MiterLimit = pObject->GetNumber();\n                break;\n            case FXBSTR_ID('D', 0, 0, 0):\t{\n                    if (pObject->GetType() != PDFOBJ_ARRAY) {\n                        break;\n                    }\n                    CPDF_Array* pDash = (CPDF_Array*)pObject;\n                    CPDF_Array* pArray = pDash->GetArray(0);\n                    if (pArray == NULL) {\n                        break;\n                    }\n                    SetLineDash(pArray, pDash->GetNumber(1), 1.0f);\n                    break;\n                }\n            case FXBSTR_ID('R', 'I', 0, 0):\n                m_GeneralState.SetRenderIntent(pObject->GetString());\n                break;\n            case FXBSTR_ID('F', 'o', 'n', 't'):\t{\n                    if (pObject->GetType() != PDFOBJ_ARRAY) {\n                        break;\n                    }\n                    CPDF_Array* pFont = (CPDF_Array*)pObject;\n                    m_TextState.GetModify()->m_FontSize = pFont->GetNumber(1);\n                    m_TextState.SetFont(pParser->FindFont(pFont->GetString(0)));\n                    break;\n                }\n            case FXBSTR_ID('T', 'R', 0, 0):\n                if (pGS->KeyExist(FX_BSTRC(\"TR2\"))) {\n                    continue;\n                }\n            case FXBSTR_ID('T', 'R', '2', 0):\n                if (pObject && pObject->GetType() != PDFOBJ_NAME) {\n                    pGeneralState->m_pTR = pObject;\n                } else {\n                    pGeneralState->m_pTR = NULL;\n                }\n                break;\n            case FXBSTR_ID('B', 'M', 0, 0):\t{\n                    CFX_ByteString mode;\n                    if (pObject->GetType() == PDFOBJ_ARRAY) {\n                        mode = ((CPDF_Array*)pObject)->GetString(0);\n                    } else {\n                        mode = pObject->GetString();\n                    }\n                    pGeneralState->SetBlendMode(mode);\n                    if (pGeneralState->m_BlendType > FXDIB_BLEND_MULTIPLY) {\n                        pParser->m_pObjectList->m_bBackgroundAlphaNeeded = TRUE;\n                    }\n                    break;\n                }\n            case FXBSTR_ID('S', 'M', 'a', 's'):\n                if (pObject && pObject->GetType() == PDFOBJ_DICTIONARY) {\n                    pGeneralState->m_pSoftMask = pObject;\n                    FXSYS_memcpy32(pGeneralState->m_SMaskMatrix, &pParser->m_pCurStates->m_CTM, sizeof(CPDF_Matrix));\n                } else {\n                    pGeneralState->m_pSoftMask = NULL;\n                }\n                break;\n            case FXBSTR_ID('C', 'A', 0, 0):\n                pGeneralState->m_StrokeAlpha = PDF_ClipFloat(pObject->GetNumber());\n                break;\n            case FXBSTR_ID('c', 'a', 0, 0):\n                pGeneralState->m_FillAlpha = PDF_ClipFloat(pObject->GetNumber());\n                break;\n            case FXBSTR_ID('O', 'P', 0, 0):\n                pGeneralState->m_StrokeOP = pObject->GetInteger();\n                if (!pGS->KeyExist(FX_BSTRC(\"op\"))) {\n                    pGeneralState->m_FillOP = pObject->GetInteger();\n                }\n                break;\n            case FXBSTR_ID('o', 'p', 0, 0):\n                pGeneralState->m_FillOP = pObject->GetInteger();\n                break;\n            case FXBSTR_ID('O', 'P', 'M', 0):\n                pGeneralState->m_OPMode = pObject->GetInteger();\n                break;\n            case FXBSTR_ID('B', 'G', 0, 0):\n                if (pGS->KeyExist(FX_BSTRC(\"BG2\"))) {\n                    continue;\n                }\n            case FXBSTR_ID('B', 'G', '2', 0):\n                pGeneralState->m_pBG = pObject;\n                break;\n            case FXBSTR_ID('U', 'C', 'R', 0):\n                if (pGS->KeyExist(FX_BSTRC(\"UCR2\"))) {\n                    continue;\n                }\n            case FXBSTR_ID('U', 'C', 'R', '2'):\n                pGeneralState->m_pUCR = pObject;\n                break;\n            case FXBSTR_ID('H', 'T', 0, 0):\n                pGeneralState->m_pHT = pObject;\n                break;\n            case FXBSTR_ID('F', 'L', 0, 0):\n                pGeneralState->m_Flatness = pObject->GetNumber();\n                break;\n            case FXBSTR_ID('S', 'M', 0, 0):\n                pGeneralState->m_Smoothness = pObject->GetNumber();\n                break;\n            case FXBSTR_ID('S', 'A', 0, 0):\n                pGeneralState->m_StrokeAdjust = pObject->GetInteger();\n                break;\n            case FXBSTR_ID('A', 'I', 'S', 0):\n                pGeneralState->m_AlphaSource = pObject->GetInteger();\n                break;\n            case FXBSTR_ID('T', 'K', 0, 0):\n                pGeneralState->m_TextKnockout = pObject->GetInteger();\n                break;\n        }\n    }\n    pGeneralState->m_Matrix = m_CTM;\n}\nCPDF_ContentMarkItem::CPDF_ContentMarkItem()\n{\n    m_ParamType = None;\n}\nCPDF_ContentMarkItem::CPDF_ContentMarkItem(const CPDF_ContentMarkItem& src)\n{\n    m_MarkName = src.m_MarkName;\n    m_ParamType = src.m_ParamType;\n    if (m_ParamType == DirectDict) {\n        m_pParam = ((CPDF_Dictionary*)src.m_pParam)->Clone();\n    } else {\n        m_pParam = src.m_pParam;\n    }\n}\nCPDF_ContentMarkItem::~CPDF_ContentMarkItem()\n{\n    if (m_ParamType == DirectDict && m_pParam) {\n        ((CPDF_Dictionary*)m_pParam)->Release();\n    }\n}\nFX_BOOL\tCPDF_ContentMarkItem::HasMCID() const\n{\n    if (m_pParam && (m_ParamType == DirectDict || m_ParamType == PropertiesDict)) {\n        return ((CPDF_Dictionary *)m_pParam)->KeyExist(FX_BSTRC(\"MCID\"));\n    }\n    return FALSE;\n}\nCPDF_ContentMarkData::CPDF_ContentMarkData(const CPDF_ContentMarkData& src)\n{\n    for (int i = 0; i < src.m_Marks.GetSize(); i ++) {\n        m_Marks.Add(src.m_Marks[i]);\n    }\n}\nint CPDF_ContentMarkData::GetMCID() const\n{\n    CPDF_ContentMarkItem::ParamType type = CPDF_ContentMarkItem::None;\n    for (int i = 0; i < m_Marks.GetSize(); i ++) {\n        type = m_Marks[i].GetParamType();\n        if (type == CPDF_ContentMarkItem::PropertiesDict || type == CPDF_ContentMarkItem::DirectDict) {\n            CPDF_Dictionary *pDict = (CPDF_Dictionary *)m_Marks[i].GetParam();\n            if (pDict->KeyExist(FX_BSTRC(\"MCID\"))) {\n                return pDict->GetInteger(FX_BSTRC(\"MCID\"));\n            }\n        }\n    }\n    return -1;\n}\nvoid CPDF_ContentMarkData::AddMark(const CFX_ByteString& name, CPDF_Dictionary* pDict, FX_BOOL bDirect)\n{\n    CPDF_ContentMarkItem& item = m_Marks.Add();\n    item.SetName(name);\n    if (pDict == NULL) {\n        return;\n    }\n    item.SetParam(bDirect ? CPDF_ContentMarkItem::DirectDict : CPDF_ContentMarkItem::PropertiesDict,\n                  bDirect ? pDict->Clone() : pDict);\n}\nvoid CPDF_ContentMarkData::DeleteLastMark()\n{\n    int size = m_Marks.GetSize();\n    if (size == 0) {\n        return;\n    }\n    m_Marks.RemoveAt(size - 1);\n}\nFX_BOOL CPDF_ContentMark::HasMark(FX_BSTR mark) const\n{\n    if (m_pObject == NULL) {\n        return FALSE;\n    }\n    for (int i = 0; i < m_pObject->CountItems(); i ++) {\n        CPDF_ContentMarkItem& item = m_pObject->GetItem(i);\n        if (item.GetName() == mark) {\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nFX_BOOL CPDF_ContentMark::LookupMark(FX_BSTR mark, CPDF_Dictionary*& pDict) const\n{\n    if (m_pObject == NULL) {\n        return FALSE;\n    }\n    for (int i = 0; i < m_pObject->CountItems(); i ++) {\n        CPDF_ContentMarkItem& item = m_pObject->GetItem(i);\n        if (item.GetName() == mark) {\n            pDict = NULL;\n            if (item.GetParamType() == CPDF_ContentMarkItem::PropertiesDict ||\n                    item.GetParamType() == CPDF_ContentMarkItem::DirectDict) {\n                pDict = (CPDF_Dictionary*)item.GetParam();\n            }\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_page.h\"\n#include \"../../../include/fpdfapi/fpdf_pageobj.h\"\n#include \"pageint.h\"\nCPDF_ImageObject::CPDF_ImageObject()\n{\n    m_pImage = NULL;\n    m_Type = PDFPAGE_IMAGE;\n}\nCPDF_ImageObject::~CPDF_ImageObject()\n{\n    if (!m_pImage) {\n        return;\n    }\n    if (m_pImage->IsInline() || (m_pImage->GetStream() && m_pImage->GetStream()->GetObjNum() == 0)) {\n        delete m_pImage;\n    } else {\n        m_pImage->GetDocument()->GetPageData()->ReleaseImage(m_pImage->GetStream());\n    }\n}\nvoid CPDF_ImageObject::CopyData(const CPDF_PageObject* pSrc)\n{\n    const CPDF_ImageObject* pSrcObj = (const CPDF_ImageObject*)pSrc;\n    if (m_pImage) {\n        m_pImage->Release();\n    }\n    m_pImage = pSrcObj->m_pImage->Clone();\n    m_Matrix = pSrcObj->m_Matrix;\n}\nvoid CPDF_ImageObject::Transform(const CFX_AffineMatrix& matrix)\n{\n    m_Matrix.Concat(matrix);\n    CalcBoundingBox();\n}\nvoid CPDF_ImageObject::CalcBoundingBox()\n{\n    m_Left = m_Bottom = 0;\n    m_Right = m_Top = 1.0f;\n    m_Matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom);\n}\nvoid CPDF_Image::Release()\n{\n    if (m_bInline || (m_pStream && m_pStream->GetObjNum() == 0)) {\n        delete this;\n    }\n}\nCPDF_Image* CPDF_Image::Clone()\n{\n    if (m_pStream->GetObjNum()) {\n        return m_pDocument->GetPageData()->GetImage(m_pStream);\n    }\n    CPDF_Image* pImage = FX_NEW CPDF_Image(m_pDocument);\n    pImage->LoadImageF((CPDF_Stream*)((CPDF_Object*)m_pStream)->Clone(), m_bInline);\n    if (m_bInline) {\n        CPDF_Dictionary *pInlineDict = (CPDF_Dictionary*)m_pInlineDict->Clone(TRUE);\n        pImage->SetInlineDict(pInlineDict);\n    }\n    return pImage;\n}\nCPDF_Image::CPDF_Image(CPDF_Document* pDoc)\n{\n    m_pDocument = pDoc;\n    m_pStream = NULL;\n    m_pOC = NULL;\n    m_bInline = FALSE;\n    m_pInlineDict = NULL;\n    m_pDIBSource = NULL;\n    m_pMask = NULL;\n    m_MatteColor = 0;\n}\nCPDF_Image::~CPDF_Image()\n{\n    if (m_bInline) {\n        if (m_pStream) {\n#ifndef FOXIT_CHROME_BUILD\n            CPDF_Dictionary* pDict = m_pStream->GetDict();\n            if (pDict) {\n                CPDF_Object* pCSObj = pDict->GetElementValue(FX_BSTRC(\"ColorSpace\"));\n                if (pCSObj && m_pDocument) {\n                    m_pDocument->RemoveColorSpaceFromPageData(pCSObj);\n                }\n            }\n#endif\n            m_pStream->Release();\n        }\n        if (m_pInlineDict) {\n            m_pInlineDict->Release();\n        }\n    }\n}\nFX_BOOL CPDF_Image::LoadImageF(CPDF_Stream* pStream, FX_BOOL bInline)\n{\n    m_pStream = pStream;\n    if (m_bInline && m_pInlineDict) {\n        m_pInlineDict->Release();\n        m_pInlineDict = NULL;\n    }\n    m_bInline = bInline;\n    CPDF_Dictionary* pDict = pStream->GetDict();\n    if (m_bInline) {\n        m_pInlineDict = (CPDF_Dictionary*)pDict->Clone();\n    }\n    m_pOC = pDict->GetDict(FX_BSTRC(\"OC\"));\n    m_bIsMask = !pDict->KeyExist(FX_BSTRC(\"ColorSpace\")) || pDict->GetInteger(FX_BSTRC(\"ImageMask\"));\n#ifndef _FPDFAPI_MINI_\n    m_bInterpolate = pDict->GetInteger(FX_BSTRC(\"Interpolate\"));\n#endif\n    m_Height = pDict->GetInteger(FX_BSTRC(\"Height\"));\n    m_Width = pDict->GetInteger(FX_BSTRC(\"Width\"));\n    return TRUE;\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_page.h\"\n#include \"../../../include/fpdfapi/fpdf_module.h\"\n#include \"../../../include/fpdfapi/fpdf_serial.h\"\n#include \"pageint.h\"\n#define REQUIRE_PARAMS(count) if (m_ParamCount != count) { m_bAbort = TRUE; return; }\nCPDF_StreamContentParser::CPDF_StreamContentParser()\n{\n    m_DefFontSize = 0;\n    m_pCurStates = NULL;\n    m_pLastTextObject = NULL;\n    m_pPathPoints = NULL;\n    m_PathClipType = 0;\n    m_PathPointCount = m_PathAllocSize = 0;\n    m_PathCurrentX = m_PathCurrentY = 0.0f;\n    m_bResourceMissing = FALSE;\n    m_bColored = FALSE;\n    FXSYS_memset32(m_Type3Data, 0, sizeof(FX_FLOAT) * 6);\n    m_ParamCount = 0;\n    m_ParamStartPos = 0;\n    m_bAbort = FALSE;\n    m_pLastImageDict = NULL;\n    m_pLastCloneImageDict = NULL;\n    m_pLastImage = NULL;\n    m_bReleaseLastDict = TRUE;\n    m_pParentResources = NULL;\n#ifdef _FPDFAPI_MINI_\n    m_pObjectState = NULL;\n    m_pObjectStack = NULL;\n    m_pWordBuf = NULL;\n    m_pDictName = NULL;\n    m_pStreamBuf = NULL;\n    m_WordState = 0;\n    m_ObjectSize = 0;\n#endif\n}\nFX_BOOL CPDF_StreamContentParser::Initialize()\n{\n#ifdef _FPDFAPI_MINI_\n    m_pObjectState = FX_Alloc(FX_BOOL, _FPDF_MAX_OBJECT_STACK_SIZE_);\n    FXSYS_memset32(m_pObjectState, 0, _FPDF_MAX_OBJECT_STACK_SIZE_ * sizeof(FX_BOOL));\n    m_pObjectStack = FX_Alloc(CPDF_Object*, _FPDF_MAX_OBJECT_STACK_SIZE_);\n    FXSYS_memset32(m_pObjectStack, 0, _FPDF_MAX_OBJECT_STACK_SIZE_ * sizeof(CPDF_Object*));\n    m_pWordBuf = FX_Alloc(FX_BYTE, 256);\n    FXSYS_memset32(m_pWordBuf, 0, 256 * sizeof(FX_BYTE));\n    m_pDictName = FX_Alloc(FX_BYTE, 256);\n    FXSYS_memset32(m_pDictName, 0, 256 * sizeof(FX_BYTE));\n    m_pStreamBuf = FX_Alloc(FX_BYTE, STREAM_PARSE_BUFSIZE);\n    FXSYS_memset32(m_pStreamBuf, 0, STREAM_PARSE_BUFSIZE * sizeof(FX_BYTE));\n    m_StringBuf.EstimateSize(1024);\n    m_ObjectSize = 0;\n    m_ImageSrcBuf.EstimateSize(STREAM_PARSE_BUFSIZE);\n#endif\n    return TRUE;\n}\nCPDF_StreamContentParser::~CPDF_StreamContentParser()\n{\n    ClearAllParams();\n    int i = 0;\n    for (i = 0; i < m_StateStack.GetSize(); i ++) {\n        delete (CPDF_AllStates*)m_StateStack[i];\n    }\n    if (m_pPathPoints) {\n        FX_Free(m_pPathPoints);\n    }\n    if (m_pCurStates) {\n        delete m_pCurStates;\n    }\n    if (m_pLastImageDict) {\n        m_pLastImageDict->Release();\n    }\n    if (m_pLastCloneImageDict) {\n        m_pLastCloneImageDict->Release();\n    }\n#ifdef _FPDFAPI_MINI_\n    for (i = 0; i < (int)m_ObjectSize; ++i) {\n        if (!m_pObjectState[i]) {\n            m_pObjectStack[i]->Release();\n        }\n    }\n    FX_Free(m_pObjectStack);\n    FX_Free(m_pObjectState);\n    FX_Free(m_pStreamBuf);\n    FX_Free(m_pWordBuf);\n    FX_Free(m_pDictName);\n#endif\n}\nvoid CPDF_StreamContentParser::PrepareParse(CPDF_Document* pDocument,\n        CPDF_Dictionary* pPageResources, CPDF_Dictionary* pParentResources, CFX_AffineMatrix* pmtContentToUser, CPDF_PageObjects* pObjList,\n        CPDF_Dictionary* pResources, CPDF_Rect* pBBox, CPDF_ParseOptions* pOptions,\n        CPDF_AllStates* pStates, int level)\n{\n    for (int i = 0; i < 6; i ++) {\n        m_Type3Data[i] = 0;\n    }\n    m_pDocument = pDocument;\n    m_pPageResources = pPageResources;\n    m_pParentResources = pParentResources;\n    if (pmtContentToUser) {\n        m_mtContentToUser = *pmtContentToUser;\n    }\n    if (pOptions) {\n        m_Options = *pOptions;\n    }\n    m_pObjectList = pObjList;\n    m_pResources = pResources;\n    if (pResources == NULL) {\n        m_pResources = m_pParentResources;\n    }\n    if (m_pResources == NULL) {\n        m_pResources = pPageResources;\n    }\n    if (pBBox) {\n        m_BBox = *pBBox;\n    }\n    m_Level = level;\n    m_pCurStates = FX_NEW CPDF_AllStates;\n    if (pStates) {\n        m_pCurStates->Copy(*pStates);\n    } else {\n        m_pCurStates->m_GeneralState.New();\n        m_pCurStates->m_GraphState.New();\n        m_pCurStates->m_TextState.New();\n        m_pCurStates->m_ColorState.New();\n    }\n#ifdef _FPDFAPI_MINI_\n    FXSYS_memset32(m_pObjectState, 0, _FPDF_MAX_OBJECT_STACK_SIZE_ * sizeof(FX_BOOL));\n#endif\n}\nint CPDF_StreamContentParser::GetNextParamPos()\n{\n    if (m_ParamCount == PARAM_BUF_SIZE) {\n        m_ParamStartPos ++;\n        if (m_ParamStartPos == PARAM_BUF_SIZE) {\n            m_ParamStartPos = 0;\n        }\n        if (m_ParamBuf1[m_ParamStartPos].m_Type == 0) {\n            if (CPDF_Object* pObject = m_ParamBuf1[m_ParamStartPos].m_pObject)\n                pObject->Release();\n        }\n        return m_ParamStartPos;\n    }\n    int index = m_ParamStartPos + m_ParamCount;\n    if (index >= PARAM_BUF_SIZE) {\n        index -= PARAM_BUF_SIZE;\n    }\n    m_ParamCount ++;\n    return index;\n}\nvoid CPDF_StreamContentParser::AddNameParam(FX_LPCSTR name, int len)\n{\n    int index = GetNextParamPos();\n    if (len > 32) {\n        m_ParamBuf1[index].m_Type = 0;\n        m_ParamBuf1[index].m_pObject = CPDF_Name::Create(PDF_NameDecode(CFX_ByteStringC(name, len)));\n    } else {\n        m_ParamBuf1[index].m_Type = PDFOBJ_NAME;\n        if (FXSYS_memchr(name, '#', len) == NULL) {\n            FXSYS_memcpy32(m_ParamBuf1[index].m_Name.m_Buffer, name, len);\n            m_ParamBuf1[index].m_Name.m_Len = len;\n        } else {\n            CFX_ByteString str = PDF_NameDecode(CFX_ByteStringC(name, len));\n            FXSYS_memcpy32(m_ParamBuf1[index].m_Name.m_Buffer, (FX_LPCSTR)str, str.GetLength());\n            m_ParamBuf1[index].m_Name.m_Len = str.GetLength();\n        }\n    }\n}\nvoid CPDF_StreamContentParser::AddNumberParam(FX_LPCSTR str, int len)\n{\n    int index = GetNextParamPos();\n    m_ParamBuf1[index].m_Type = PDFOBJ_NUMBER;\n    FX_atonum(CFX_ByteStringC(str, len), m_ParamBuf1[index].m_Number.m_bInteger,\n              &m_ParamBuf1[index].m_Number.m_Integer);\n}\nvoid CPDF_StreamContentParser::AddObjectParam(CPDF_Object* pObj)\n{\n    int index = GetNextParamPos();\n    m_ParamBuf1[index].m_Type = 0;\n    m_ParamBuf1[index].m_pObject = pObj;\n}\nvoid CPDF_StreamContentParser::ClearAllParams()\n{\n    FX_DWORD index = m_ParamStartPos;\n    for (FX_DWORD i = 0; i < m_ParamCount; i ++) {\n        if (m_ParamBuf1[index].m_Type == 0) {\n            if (CPDF_Object* pObject = m_ParamBuf1[index].m_pObject)\n                pObject->Release();\n        }\n        index ++;\n        if (index == PARAM_BUF_SIZE) {\n            index = 0;\n        }\n    }\n    m_ParamStartPos = 0;\n    m_ParamCount = 0;\n}\nCPDF_Object* CPDF_StreamContentParser::GetObject(FX_DWORD index)\n{\n    if (index >= m_ParamCount) {\n        return NULL;\n    }\n    int real_index = m_ParamStartPos + m_ParamCount - index - 1;\n    if (real_index >= PARAM_BUF_SIZE) {\n        real_index -= PARAM_BUF_SIZE;\n    }\n    _ContentParam& param = m_ParamBuf1[real_index];\n    if (param.m_Type == PDFOBJ_NUMBER) {\n        CPDF_Number* pNumber = CPDF_Number::Create(param.m_Number.m_bInteger, &param.m_Number.m_Integer);\n        param.m_Type = 0;\n        param.m_pObject = pNumber;\n        return pNumber;\n    }\n    if (param.m_Type == PDFOBJ_NAME) {\n        CPDF_Name* pName = CPDF_Name::Create(CFX_ByteString(param.m_Name.m_Buffer, param.m_Name.m_Len));\n        param.m_Type = 0;\n        param.m_pObject = pName;\n        return pName;\n    }\n    if (param.m_Type == 0) {\n        return param.m_pObject;\n    }\n    ASSERT(FALSE);\n    return NULL;\n}\nCFX_ByteString CPDF_StreamContentParser::GetString(FX_DWORD index)\n{\n    if (index >= m_ParamCount) {\n        return CFX_ByteString();\n    }\n    int real_index = m_ParamStartPos + m_ParamCount - index - 1;\n    if (real_index >= PARAM_BUF_SIZE) {\n        real_index -= PARAM_BUF_SIZE;\n    }\n    _ContentParam& param = m_ParamBuf1[real_index];\n    if (param.m_Type == PDFOBJ_NAME) {\n        return CFX_ByteString(param.m_Name.m_Buffer, param.m_Name.m_Len);\n    }\n    if (param.m_Type == 0 && param.m_pObject) {\n        return param.m_pObject->GetString();\n    }\n    return CFX_ByteString();\n}\nFX_FLOAT CPDF_StreamContentParser::GetNumber(FX_DWORD index)\n{\n    if (index >= m_ParamCount) {\n        return 0;\n    }\n    int real_index = m_ParamStartPos + m_ParamCount - index - 1;\n    if (real_index >= PARAM_BUF_SIZE) {\n        real_index -= PARAM_BUF_SIZE;\n    }\n    _ContentParam& param = m_ParamBuf1[real_index];\n    if (param.m_Type == PDFOBJ_NUMBER) {\n        return param.m_Number.m_bInteger ? (FX_FLOAT)param.m_Number.m_Integer : param.m_Number.m_Float;\n    }\n    if (param.m_Type == 0 && param.m_pObject) {\n        return param.m_pObject->GetNumber();\n    }\n    return 0;\n}\nFX_FLOAT CPDF_StreamContentParser::GetNumber16(FX_DWORD index)\n{\n    return GetNumber(index);\n}\nvoid CPDF_StreamContentParser::SetGraphicStates(CPDF_PageObject* pObj, FX_BOOL bColor, FX_BOOL bText, FX_BOOL bGraph)\n{\n    pObj->m_GeneralState = m_pCurStates->m_GeneralState;\n    pObj->m_ClipPath = m_pCurStates->m_ClipPath;\n    pObj->m_ContentMark = m_CurContentMark;\n    if (bColor) {\n        pObj->m_ColorState = m_pCurStates->m_ColorState;\n    }\n    if (bGraph) {\n        pObj->m_GraphState = m_pCurStates->m_GraphState;\n    }\n    if (bText) {\n        pObj->m_TextState = m_pCurStates->m_TextState;\n    }\n}\nconst struct _OpCode {\n    FX_DWORD\tm_OpId;\n    void (CPDF_StreamContentParser::*m_OpHandler)();\n} g_OpCodes[] = {\n    {FXBSTR_ID('\"', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_NextLineShowText_Space},\n    {FXBSTR_ID('\\'', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_NextLineShowText},\n    {FXBSTR_ID('B', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_FillStrokePath},\n    {FXBSTR_ID('B', '*', 0, 0),\t&CPDF_StreamContentParser::Handle_EOFillStrokePath},\n    {FXBSTR_ID('B', 'D', 'C', 0),\t&CPDF_StreamContentParser::Handle_BeginMarkedContent_Dictionary},\n    {FXBSTR_ID('B', 'I', 0, 0),\t&CPDF_StreamContentParser::Handle_BeginImage},\n    {FXBSTR_ID('B', 'M', 'C', 0),\t&CPDF_StreamContentParser::Handle_BeginMarkedContent},\n    {FXBSTR_ID('B', 'T', 0, 0),\t&CPDF_StreamContentParser::Handle_BeginText},\n    {FXBSTR_ID('B', 'X', 0, 0),\t&CPDF_StreamContentParser::Handle_BeginSectionUndefined},\n    {FXBSTR_ID('C', 'S', 0, 0),\t&CPDF_StreamContentParser::Handle_SetColorSpace_Stroke},\n    {FXBSTR_ID('D', 'P', 0, 0),\t&CPDF_StreamContentParser::Handle_MarkPlace_Dictionary},\n    {FXBSTR_ID('D', 'o', 0, 0),\t&CPDF_StreamContentParser::Handle_ExecuteXObject},\n    {FXBSTR_ID('E', 'I', 0, 0),\t&CPDF_StreamContentParser::Handle_EndImage},\n    {FXBSTR_ID('E', 'M', 'C', 0),\t&CPDF_StreamContentParser::Handle_EndMarkedContent},\n    {FXBSTR_ID('E', 'T', 0, 0),\t&CPDF_StreamContentParser::Handle_EndText},\n    {FXBSTR_ID('E', 'X', 0, 0),\t&CPDF_StreamContentParser::Handle_EndSectionUndefined},\n    {FXBSTR_ID('F', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_FillPathOld},\n    {FXBSTR_ID('G', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_SetGray_Stroke},\n    {FXBSTR_ID('I', 'D', 0, 0),\t&CPDF_StreamContentParser::Handle_BeginImageData},\n    {FXBSTR_ID('J', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_SetLineCap},\n    {FXBSTR_ID('K', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_SetCMYKColor_Stroke},\n    {FXBSTR_ID('M', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_SetMiterLimit},\n    {FXBSTR_ID('M', 'P', 0, 0),\t&CPDF_StreamContentParser::Handle_MarkPlace},\n    {FXBSTR_ID('Q', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_RestoreGraphState},\n    {FXBSTR_ID('R', 'G', 0, 0),\t&CPDF_StreamContentParser::Handle_SetRGBColor_Stroke},\n    {FXBSTR_ID('S', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_StrokePath},\n    {FXBSTR_ID('S', 'C', 0, 0),\t&CPDF_StreamContentParser::Handle_SetColor_Stroke},\n    {FXBSTR_ID('S', 'C', 'N', 0),\t&CPDF_StreamContentParser::Handle_SetColorPS_Stroke},\n    {FXBSTR_ID('T', '*', 0, 0),\t&CPDF_StreamContentParser::Handle_MoveToNextLine},\n    {FXBSTR_ID('T', 'D', 0, 0),\t&CPDF_StreamContentParser::Handle_MoveTextPoint_SetLeading},\n    {FXBSTR_ID('T', 'J', 0, 0),\t&CPDF_StreamContentParser::Handle_ShowText_Positioning},\n    {FXBSTR_ID('T', 'L', 0, 0),\t&CPDF_StreamContentParser::Handle_SetTextLeading},\n    {FXBSTR_ID('T', 'c', 0, 0),\t&CPDF_StreamContentParser::Handle_SetCharSpace},\n    {FXBSTR_ID('T', 'd', 0, 0),\t&CPDF_StreamContentParser::Handle_MoveTextPoint},\n    {FXBSTR_ID('T', 'f', 0, 0),\t&CPDF_StreamContentParser::Handle_SetFont},\n    {FXBSTR_ID('T', 'j', 0, 0),\t&CPDF_StreamContentParser::Handle_ShowText},\n    {FXBSTR_ID('T', 'm', 0, 0),\t&CPDF_StreamContentParser::Handle_SetTextMatrix},\n    {FXBSTR_ID('T', 'r', 0, 0),\t&CPDF_StreamContentParser::Handle_SetTextRenderMode},\n    {FXBSTR_ID('T', 's', 0, 0),\t&CPDF_StreamContentParser::Handle_SetTextRise},\n    {FXBSTR_ID('T', 'w', 0, 0),\t&CPDF_StreamContentParser::Handle_SetWordSpace},\n    {FXBSTR_ID('T', 'z', 0, 0),\t&CPDF_StreamContentParser::Handle_SetHorzScale},\n    {FXBSTR_ID('W', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_Clip},\n    {FXBSTR_ID('W', '*', 0, 0),\t&CPDF_StreamContentParser::Handle_EOClip},\n    {FXBSTR_ID('b', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_CloseFillStrokePath},\n    {FXBSTR_ID('b', '*', 0, 0),\t&CPDF_StreamContentParser::Handle_CloseEOFillStrokePath},\n    {FXBSTR_ID('c', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_CurveTo_123},\n    {FXBSTR_ID('c', 'm', 0, 0),\t&CPDF_StreamContentParser::Handle_ConcatMatrix},\n    {FXBSTR_ID('c', 's', 0, 0),\t&CPDF_StreamContentParser::Handle_SetColorSpace_Fill},\n    {FXBSTR_ID('d', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_SetDash},\n    {FXBSTR_ID('d', '0', 0, 0),\t&CPDF_StreamContentParser::Handle_SetCharWidth},\n    {FXBSTR_ID('d', '1', 0, 0),\t&CPDF_StreamContentParser::Handle_SetCachedDevice},\n    {FXBSTR_ID('f', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_FillPath},\n    {FXBSTR_ID('f', '*', 0, 0),\t&CPDF_StreamContentParser::Handle_EOFillPath},\n    {FXBSTR_ID('g', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_SetGray_Fill},\n    {FXBSTR_ID('g', 's', 0, 0),\t&CPDF_StreamContentParser::Handle_SetExtendGraphState},\n    {FXBSTR_ID('h', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_ClosePath},\n    {FXBSTR_ID('i', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_SetFlat},\n    {FXBSTR_ID('j', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_SetLineJoin},\n    {FXBSTR_ID('k', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_SetCMYKColor_Fill},\n    {FXBSTR_ID('l', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_LineTo},\n    {FXBSTR_ID('m', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_MoveTo},\n    {FXBSTR_ID('n', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_EndPath},\n    {FXBSTR_ID('q', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_SaveGraphState},\n    {FXBSTR_ID('r', 'e', 0, 0),\t&CPDF_StreamContentParser::Handle_Rectangle},\n    {FXBSTR_ID('r', 'g', 0, 0),\t&CPDF_StreamContentParser::Handle_SetRGBColor_Fill},\n    {FXBSTR_ID('r', 'i', 0, 0),\t&CPDF_StreamContentParser::Handle_SetRenderIntent},\n    {FXBSTR_ID('s', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_CloseStrokePath},\n    {FXBSTR_ID('s', 'c', 0, 0),\t&CPDF_StreamContentParser::Handle_SetColor_Fill},\n    {FXBSTR_ID('s', 'c', 'n', 0),\t&CPDF_StreamContentParser::Handle_SetColorPS_Fill},\n    {FXBSTR_ID('s', 'h', 0, 0),\t&CPDF_StreamContentParser::Handle_ShadeFill},\n    {FXBSTR_ID('v', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_CurveTo_23},\n    {FXBSTR_ID('w', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_SetLineWidth},\n    {FXBSTR_ID('y', 0, 0, 0),\t\t&CPDF_StreamContentParser::Handle_CurveTo_13},\n};\nFX_BOOL CPDF_StreamContentParser::OnOperator(FX_LPCSTR op)\n{\n    int i = 0;\n    FX_DWORD opid = 0;\n    while (i < 4 && op[i]) {\n        opid = (opid << 8) + op[i];\n        i ++;\n    }\n    while (i < 4) {\n        opid <<= 8;\n        i ++;\n    };\n    int low = 0, high = sizeof g_OpCodes / sizeof(struct _OpCode) - 1;\n    while (low <= high) {\n        int middle = (low + high) / 2;\n        int compare = opid - g_OpCodes[middle].m_OpId;\n        if (compare == 0) {\n            (this->*g_OpCodes[middle].m_OpHandler)();\n            return TRUE;\n        } else if (compare < 0) {\n            high = middle - 1;\n        } else {\n            low = middle + 1;\n        }\n    }\n    return m_CompatCount != 0;\n}\nvoid CPDF_StreamContentParser::Handle_CloseFillStrokePath()\n{\n    if (m_Options.m_bTextOnly) {\n        return;\n    }\n    Handle_ClosePath();\n    AddPathObject(FXFILL_WINDING, TRUE);\n}\nvoid CPDF_StreamContentParser::Handle_FillStrokePath()\n{\n    if (m_Options.m_bTextOnly) {\n        return;\n    }\n    AddPathObject(FXFILL_WINDING, TRUE);\n}\nvoid CPDF_StreamContentParser::Handle_CloseEOFillStrokePath()\n{\n    if (m_Options.m_bTextOnly) {\n        return;\n    }\n    AddPathPoint(m_PathStartX, m_PathStartY, FXPT_LINETO | FXPT_CLOSEFIGURE);\n    AddPathObject(FXFILL_ALTERNATE, TRUE);\n}\nvoid CPDF_StreamContentParser::Handle_EOFillStrokePath()\n{\n    if (m_Options.m_bTextOnly) {\n        return;\n    }\n    AddPathObject(FXFILL_ALTERNATE, TRUE);\n}\nvoid CPDF_StreamContentParser::Handle_BeginMarkedContent_Dictionary()\n{\n    if (!m_Options.m_bMarkedContent) {\n        return;\n    }\n    CFX_ByteString tag = GetString(1);\n    CPDF_Object* pProperty = GetObject(0);\n    if (pProperty == NULL) {\n        return;\n    }\n    FX_BOOL bDirect = TRUE;\n    if (pProperty->GetType() == PDFOBJ_NAME) {\n        pProperty = FindResourceObj(FX_BSTRC(\"Properties\"), pProperty->GetString());\n        if (pProperty == NULL) {\n            return;\n        }\n        bDirect = FALSE;\n    }\n    if (pProperty->GetType() != PDFOBJ_DICTIONARY) {\n        return;\n    }\n    m_CurContentMark.GetModify()->AddMark(tag, (CPDF_Dictionary*)pProperty, bDirect);\n}\nvoid CPDF_StreamContentParser::Handle_BeginMarkedContent()\n{\n    if (!m_Options.m_bMarkedContent) {\n        return;\n    }\n    CFX_ByteString tag = GetString(0);\n    m_CurContentMark.GetModify()->AddMark(tag, NULL, FALSE);\n}\nstruct _FX_BSTR {\n    FX_LPCSTR\tm_Ptr;\n    int\t\t\tm_Size;\n};\n#define _FX_BSTRC(str) {str, sizeof(str)-1}\nconst _FX_BSTR _PDF_InlineKeyAbbr[] = {\n    _FX_BSTRC(\"BitsPerComponent\"), _FX_BSTRC(\"BPC\"),\n    _FX_BSTRC(\"ColorSpace\"), _FX_BSTRC(\"CS\"),\n    _FX_BSTRC(\"Decode\"), _FX_BSTRC(\"D\"),\n    _FX_BSTRC(\"DecodeParms\"), _FX_BSTRC(\"DP\"),\n    _FX_BSTRC(\"Filter\"), _FX_BSTRC(\"F\"),\n    _FX_BSTRC(\"Height\"), _FX_BSTRC(\"H\"),\n    _FX_BSTRC(\"ImageMask\"), _FX_BSTRC(\"IM\"),\n    _FX_BSTRC(\"Interpolate\"), _FX_BSTRC(\"I\"),\n    _FX_BSTRC(\"Width\"), _FX_BSTRC(\"W\"),\n};\nconst _FX_BSTR _PDF_InlineValueAbbr[] = {\n    _FX_BSTRC(\"DeviceGray\"), _FX_BSTRC(\"G\"),\n    _FX_BSTRC(\"DeviceRGB\"), _FX_BSTRC(\"RGB\"),\n    _FX_BSTRC(\"DeviceCMYK\"), _FX_BSTRC(\"CMYK\"),\n    _FX_BSTRC(\"Indexed\"), _FX_BSTRC(\"I\"),\n    _FX_BSTRC(\"ASCIIHexDecode\"), _FX_BSTRC(\"AHx\"),\n    _FX_BSTRC(\"ASCII85Decode\"), _FX_BSTRC(\"A85\"),\n    _FX_BSTRC(\"LZWDecode\"), _FX_BSTRC(\"LZW\"),\n    _FX_BSTRC(\"FlateDecode\"), _FX_BSTRC(\"Fl\"),\n    _FX_BSTRC(\"RunLengthDecode\"), _FX_BSTRC(\"RL\"),\n    _FX_BSTRC(\"CCITTFaxDecode\"), _FX_BSTRC(\"CCF\"),\n    _FX_BSTRC(\"DCTDecode\"), _FX_BSTRC(\"DCT\"),\n};\nstatic CFX_ByteStringC _PDF_FindFullName(const _FX_BSTR* table, int count, FX_BSTR abbr)\n{\n    int i = 0;\n    while (i < count) {\n        if (abbr.GetLength() == table[i + 1].m_Size && FXSYS_memcmp32(abbr.GetPtr(), table[i + 1].m_Ptr, abbr.GetLength()) == 0) {\n            return CFX_ByteStringC(table[i].m_Ptr, table[i].m_Size);\n        }\n        i += 2;\n    }\n    return CFX_ByteStringC();\n}\nvoid _PDF_ReplaceAbbr(CPDF_Object* pObj)\n{\n    switch (pObj->GetType()) {\n        case PDFOBJ_DICTIONARY: {\n                CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;\n                FX_POSITION pos = pDict->GetStartPos();\n                while (pos) {\n                    CFX_ByteString key;\n                    CPDF_Object* value = pDict->GetNextElement(pos, key);\n                    CFX_ByteStringC fullname = _PDF_FindFullName(_PDF_InlineKeyAbbr,\n                                               sizeof _PDF_InlineKeyAbbr / sizeof(_FX_BSTR), key);\n                    if (!fullname.IsEmpty()) {\n                        pDict->ReplaceKey(key, fullname);\n                        key = fullname;\n                    }\n                    if (value->GetType() == PDFOBJ_NAME) {\n                        CFX_ByteString name = value->GetString();\n                        fullname = _PDF_FindFullName(_PDF_InlineValueAbbr,\n                                                     sizeof _PDF_InlineValueAbbr / sizeof(_FX_BSTR), name);\n                        if (!fullname.IsEmpty()) {\n                            pDict->SetAtName(key, fullname);\n                        }\n                    } else {\n                        _PDF_ReplaceAbbr(value);\n                    }\n                }\n                break;\n            }\n        case PDFOBJ_ARRAY: {\n                CPDF_Array* pArray = (CPDF_Array*)pObj;\n                for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {\n                    CPDF_Object* pElement = pArray->GetElement(i);\n                    if (pElement->GetType() == PDFOBJ_NAME) {\n                        CFX_ByteString name = pElement->GetString();\n                        CFX_ByteStringC fullname = _PDF_FindFullName(_PDF_InlineValueAbbr,\n                                                   sizeof _PDF_InlineValueAbbr / sizeof(_FX_BSTR), name);\n                        if (!fullname.IsEmpty()) {\n                            pArray->SetAt(i, CPDF_Name::Create(fullname));\n                        }\n                    } else {\n                        _PDF_ReplaceAbbr(pElement);\n                    }\n                }\n                break;\n            }\n    }\n}\nstatic CFX_ByteStringC _PDF_FindAbbrName(const _FX_BSTR* table, int count, FX_BSTR fullName)\n{\n    int i = 0;\n    while (i < count) {\n        if (fullName.GetLength() == table[i].m_Size && FXSYS_memcmp32(fullName.GetPtr(), table[i].m_Ptr, fullName.GetLength()) == 0) {\n            return CFX_ByteStringC(table[i + 1].m_Ptr, table[i + 1].m_Size);\n        }\n        i += 2;\n    }\n    return CFX_ByteStringC();\n}\nvoid _PDF_ReplaceFull(CPDF_Object* pObj)\n{\n    switch (pObj->GetType()) {\n        case PDFOBJ_DICTIONARY: {\n                CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;\n                FX_POSITION pos = pDict->GetStartPos();\n                while (pos) {\n                    CFX_ByteString key;\n                    CPDF_Object* value = pDict->GetNextElement(pos, key);\n                    CFX_ByteStringC abbrName = _PDF_FindAbbrName(_PDF_InlineKeyAbbr,\n                                               sizeof(_PDF_InlineKeyAbbr) / sizeof(_FX_BSTR), key);\n                    if (!abbrName.IsEmpty()) {\n                        pDict->ReplaceKey(key, abbrName);\n                        key = abbrName;\n                    }\n                    if (value->GetType() == PDFOBJ_NAME) {\n                        CFX_ByteString name = value->GetString();\n                        abbrName = _PDF_FindAbbrName(_PDF_InlineValueAbbr,\n                                                     sizeof(_PDF_InlineValueAbbr) / sizeof(_FX_BSTR), name);\n                        if (!abbrName.IsEmpty()) {\n                            pDict->SetAtName(key, abbrName);\n                        }\n                    } else {\n                        _PDF_ReplaceFull(value);\n                    }\n                }\n                break;\n            }\n        case PDFOBJ_ARRAY: {\n                CPDF_Array* pArray = (CPDF_Array*)pObj;\n                for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {\n                    CPDF_Object* pElement = pArray->GetElement(i);\n                    if (pElement->GetType() == PDFOBJ_NAME) {\n                        CFX_ByteString name = pElement->GetString();\n                        CFX_ByteStringC abbrName = _PDF_FindAbbrName(_PDF_InlineValueAbbr,\n                                                   sizeof _PDF_InlineValueAbbr / sizeof(_FX_BSTR), name);\n                        if (!abbrName.IsEmpty()) {\n                            pArray->SetAt(i, CPDF_Name::Create(abbrName));\n                        }\n                    } else {\n                        _PDF_ReplaceFull(pElement);\n                    }\n                }\n                break;\n            }\n    }\n}\nvoid CPDF_StreamContentParser::Handle_BeginText()\n{\n    m_pCurStates->m_TextMatrix.Set(1.0f, 0, 0, 1.0f, 0, 0);\n    OnChangeTextMatrix();\n    m_pCurStates->m_TextX = 0;\n    m_pCurStates->m_TextY = 0;\n    m_pCurStates->m_TextLineX = 0;\n    m_pCurStates->m_TextLineY = 0;\n}\nvoid CPDF_StreamContentParser::Handle_BeginSectionUndefined()\n{\n    m_CompatCount ++;\n}\nvoid CPDF_StreamContentParser::Handle_CurveTo_123()\n{\n    if (m_Options.m_bTextOnly) {\n        return;\n    }\n    AddPathPoint(GetNumber(5), GetNumber(4), FXPT_BEZIERTO);\n    AddPathPoint(GetNumber(3), GetNumber(2), FXPT_BEZIERTO);\n    AddPathPoint(GetNumber(1), GetNumber(0), FXPT_BEZIERTO);\n}\nvoid CPDF_StreamContentParser::Handle_ConcatMatrix()\n{\n    FX_FLOAT a2 = GetNumber16(5), b2 = GetNumber16(4), c2 = GetNumber16(3), d2 = GetNumber16(2);\n    FX_FLOAT e2 = GetNumber(1), f2 = GetNumber(0);\n    FX_FLOAT old_width_scale = m_pCurStates->m_CTM.GetXUnit();\n    CFX_AffineMatrix new_matrix(a2, b2, c2, d2, e2, f2);\n    new_matrix.Concat(m_pCurStates->m_CTM);\n    m_pCurStates->m_CTM = new_matrix;\n    FX_FLOAT new_width_scale = m_pCurStates->m_CTM.GetXUnit();\n    OnChangeTextMatrix();\n}\nvoid CPDF_StreamContentParser::Handle_SetColorSpace_Fill()\n{\n    if (m_Options.m_bTextOnly) {\n        return;\n    }\n    CFX_ByteString csname = GetString(0);\n    CPDF_ColorSpace* pCS = FindColorSpace(csname);\n    if (pCS == NULL) {\n        return;\n    }\n    m_pCurStates->m_ColorState.GetModify()->m_FillColor.SetColorSpace(pCS);\n}\nvoid CPDF_StreamContentParser::Handle_SetColorSpace_Stroke()\n{\n    if (m_Options.m_bTextOnly) {\n        return;\n    }\n    CFX_ByteString csname = GetString(0);\n    CPDF_ColorSpace* pCS = FindColorSpace(csname);\n    if (pCS == NULL) {\n        return;\n    }\n    m_pCurStates->m_ColorState.GetModify()->m_StrokeColor.SetColorSpace(pCS);\n}\nvoid CPDF_StreamContentParser::Handle_SetDash()\n{\n    if (m_Options.m_bTextOnly) {\n        return;\n    }\n    CPDF_Array* pArray = GetObject(1) ? GetObject(1)->GetArray() : NULL;\n    if (pArray == NULL) {\n        return;\n    }\n    m_pCurStates->SetLineDash(pArray, GetNumber(0), 1.0f);\n}\nvoid CPDF_StreamContentParser::Handle_SetCharWidth()\n{\n    m_Type3Data[0] = GetNumber(1);\n    m_Type3Data[1] = GetNumber(0);\n    m_bColored = TRUE;\n}\nvoid CPDF_StreamContentParser::Handle_SetCachedDevice()\n{\n    for (int i = 0; i < 6; i ++) {\n        m_Type3Data[i] = GetNumber(5 - i);\n    }\n    m_bColored = FALSE;\n}\nvoid CPDF_StreamContentParser::Handle_ExecuteXObject()\n{\n    CFX_ByteString name = GetString(0);\n    if (name == m_LastImageName && m_pLastImage && m_pLastImage->GetStream() && m_pLastImage->GetStream()->GetObjNum()) {\n#if defined(_FPDFAPI_MINI_) && !defined(_FXCORE_FEATURE_ALL_)\n        AddDuplicateImage();\n#else\n        AddImage(NULL, m_pLastImage, FALSE);\n#endif\n        return;\n    }\n    if (m_Options.m_bTextOnly) {\n        CPDF_Object* pRes = NULL;\n        if (m_pResources == NULL) {\n            return;\n        }\n        if (m_pResources == m_pPageResources) {\n            CPDF_Dictionary* pList = m_pResources->GetDict(FX_BSTRC(\"XObject\"));\n            if (pList == NULL) {\n                return;\n            }\n            pRes = pList->GetElement(name);\n            if (pRes == NULL || pRes->GetType() != PDFOBJ_REFERENCE) {\n                return;\n            }\n        } else {\n            CPDF_Dictionary* pList = m_pResources->GetDict(FX_BSTRC(\"XObject\"));\n            if (pList == NULL) {\n                if (m_pPageResources == NULL) {\n                    return;\n                }\n                CPDF_Dictionary* pList = m_pPageResources->GetDict(FX_BSTRC(\"XObject\"));\n                if (pList == NULL) {\n                    return;\n                }\n                pRes = pList->GetElement(name);\n                if (pRes == NULL || pRes->GetType() != PDFOBJ_REFERENCE) {\n                    return;\n                }\n            } else {\n                pRes = pList->GetElement(name);\n                if (pRes == NULL || pRes->GetType() != PDFOBJ_REFERENCE) {\n                    return;\n                }\n            }\n        }\n        FX_BOOL bForm;\n        if (m_pDocument->IsFormStream(((CPDF_Reference*)pRes)->GetRefObjNum(), bForm) && !bForm) {\n            return;\n        }\n    }\n    CPDF_Stream* pXObject = (CPDF_Stream*)FindResourceObj(FX_BSTRC(\"XObject\"), name);\n    if (pXObject == NULL || pXObject->GetType() != PDFOBJ_STREAM) {\n        m_bResourceMissing = TRUE;\n        return;\n    }\n    CFX_ByteStringC type = pXObject->GetDict() ? pXObject->GetDict()->GetConstString(FX_BSTRC(\"Subtype\")) : CFX_ByteStringC();\n    if (type == FX_BSTRC(\"Image\")) {\n        if (m_Options.m_bTextOnly) {\n            return;\n        }\n        CPDF_ImageObject* pObj = AddImage(pXObject, NULL, FALSE);\n        m_LastImageName = name;\n        m_pLastImage = pObj->m_pImage;\n    } else if (type == FX_BSTRC(\"Form\")) {\n        AddForm(pXObject);\n    } else {\n        return;\n    }\n}\nvoid CPDF_StreamContentParser::AddForm(CPDF_Stream* pStream)\n{\n#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)\n    if (!m_Options.m_bSeparateForm) {\n        CPDF_Dictionary* pResources = pStream->GetDict()->GetDict(FX_BSTRC(\"Resources\"));\n        CFX_AffineMatrix form_matrix = pStream->GetDict()->GetMatrix(FX_BSTRC(\"Matrix\"));\n        form_matrix.Concat(m_pCurStates->m_CTM);\n        CPDF_Array* pBBox = pStream->GetDict()->GetArray(FX_BSTRC(\"BBox\"));\n        CFX_FloatRect form_bbox;\n        CPDF_Path ClipPath;\n        if (pBBox) {\n            form_bbox = pStream->GetDict()->GetRect(FX_BSTRC(\"BBox\"));\n            ClipPath.New();\n            ClipPath.AppendRect(form_bbox.left, form_bbox.bottom, form_bbox.right, form_bbox.top);\n            ClipPath.Transform(&form_matrix);\n            form_bbox.Transform(&form_matrix);\n        }\n        CPDF_StreamContentParser parser;\n        parser.Initialize();\n        parser.PrepareParse(m_pDocument, m_pPageResources, m_pResources, &m_mtContentToUser,\n                            m_pObjectList, pResources, &form_bbox, &m_Options, m_pCurStates, m_Level + 1);\n        parser.m_pCurStates->m_CTM = form_matrix;\n        if (ClipPath.NotNull()) {\n            parser.m_pCurStates->m_ClipPath.AppendPath(ClipPath, FXFILL_WINDING, TRUE);\n        }\n        CPDF_StreamAcc stream;\n        stream.LoadAllData(pStream, FALSE);\n        if (stream.GetSize() == 0) {\n            return;\n        }\n#ifdef _FPDFAPI_MINI_\n        parser.InputData(stream.GetData(), stream.GetSize());\n        parser.Finish();\n#else\n        parser.Parse(stream.GetData(), stream.GetSize(), 0);\n#endif\n        return;\n    }\n#endif\n    CPDF_FormObject* pFormObj = FX_NEW CPDF_FormObject;\n    pFormObj->m_pForm = FX_NEW CPDF_Form(m_pDocument, m_pPageResources, pStream, m_pResources);\n    pFormObj->m_FormMatrix = m_pCurStates->m_CTM;\n    pFormObj->m_FormMatrix.Concat(m_mtContentToUser);\n    CPDF_AllStates status;\n    status.m_GeneralState = m_pCurStates->m_GeneralState;\n    status.m_GraphState = m_pCurStates->m_GraphState;\n    status.m_ColorState = m_pCurStates->m_ColorState;\n    status.m_TextState = m_pCurStates->m_TextState;\n    pFormObj->m_pForm->ParseContent(&status, NULL, NULL, &m_Options, m_Level + 1);\n    if (!m_pObjectList->m_bBackgroundAlphaNeeded && pFormObj->m_pForm->m_bBackgroundAlphaNeeded) {\n        m_pObjectList->m_bBackgroundAlphaNeeded = TRUE;\n    }\n    pFormObj->CalcBoundingBox();\n    SetGraphicStates(pFormObj, TRUE, TRUE, TRUE);\n    m_pObjectList->m_ObjectList.AddTail(pFormObj);\n}\n#if defined(_FPDFAPI_MINI_) && !defined(_FXCORE_FEATURE_ALL_)\nvoid CPDF_StreamContentParser::AddDuplicateImage()\n{\n    FX_POSITION tailpos = m_pObjectList->m_ObjectList.GetTailPosition();\n    CPDF_PageObject* pLastObj = (CPDF_PageObject*)m_pObjectList->m_ObjectList.GetAt(tailpos);\n    if (pLastObj == NULL || (pLastObj->m_Type != PDFPAGE_INLINES && pLastObj->m_Type != PDFPAGE_IMAGE)) {\n        AddImage(NULL, m_pLastImage, FALSE);\n        return;\n    }\n    if (pLastObj->m_GeneralState != m_pCurStates->m_GeneralState ||\n            pLastObj->m_ClipPath != m_pCurStates->m_ClipPath ||\n            pLastObj->m_ColorState != m_pCurStates->m_ColorState) {\n        AddImage(NULL, m_pLastImage, FALSE);\n        return;\n    }\n    CFX_AffineMatrix ImageMatrix;\n    ImageMatrix.Copy(m_pCurStates->m_CTM);\n    ImageMatrix.Concat(m_mtContentToUser);\n    if (pLastObj->m_Type == PDFPAGE_INLINES) {\n        CPDF_InlineImages* pInlines = (CPDF_InlineImages*)pLastObj;\n        if (pInlines->m_pStream != m_pLastImage->GetStream()) {\n            AddImage(NULL, m_pLastImage, FALSE);\n            return;\n        }\n        pInlines->AddMatrix(ImageMatrix);\n    } else {\n        CPDF_ImageObject* pImageObj = (CPDF_ImageObject*)pLastObj;\n        CPDF_InlineImages* pInlines = FX_NEW CPDF_InlineImages;\n        pInlines->m_pStream = m_pLastImage->GetStream();\n        SetGraphicStates(pInlines, !pInlines->m_pStream->GetDict()->KeyExist(FX_BSTRC(\"ColorSpace\")), FALSE, FALSE);\n        pInlines->AddMatrix(pImageObj->m_Matrix);\n        pInlines->AddMatrix(ImageMatrix);\n        m_pObjectList->m_ObjectList.RemoveAt(tailpos);\n        m_pObjectList->m_ObjectList.AddTail(pInlines);\n        pLastObj->Release();\n    }\n}\n#endif\nCPDF_ImageObject* CPDF_StreamContentParser::AddImage(CPDF_Stream* pStream, CPDF_Image* pImage, FX_BOOL bInline)\n{\n    if (pStream == NULL && pImage == NULL) {\n        return NULL;\n    }\n    CFX_AffineMatrix ImageMatrix;\n    ImageMatrix.Copy(m_pCurStates->m_CTM);\n    ImageMatrix.Concat(m_mtContentToUser);\n    CPDF_ImageObject* pImageObj = FX_NEW CPDF_ImageObject;\n    if (pImage) {\n        pImageObj->m_pImage = m_pDocument->GetPageData()->GetImage(pImage->GetStream());\n    } else if (pStream->GetObjNum()) {\n        pImageObj->m_pImage = m_pDocument->LoadImageF(pStream);\n    } else {\n        pImageObj->m_pImage = FX_NEW CPDF_Image(m_pDocument);\n        pImageObj->m_pImage->LoadImageF(pStream, bInline);\n    }\n    SetGraphicStates(pImageObj, pImageObj->m_pImage->IsMask(), FALSE, FALSE);\n    pImageObj->m_Matrix = ImageMatrix;\n    pImageObj->CalcBoundingBox();\n    m_pObjectList->m_ObjectList.AddTail(pImageObj);\n    return pImageObj;\n}\nvoid CPDF_StreamContentParser::Handle_MarkPlace_Dictionary()\n{\n}\nvoid CPDF_StreamContentParser::Handle_EndImage()\n{\n}\nvoid CPDF_StreamContentParser::Handle_EndMarkedContent()\n{\n    if (!m_Options.m_bMarkedContent) {\n        return;\n    }\n    if (m_CurContentMark.IsNull()) {\n        return;\n    }\n    int count = m_CurContentMark.GetObject()->CountItems();\n    if (count == 1) {\n        m_CurContentMark.SetNull();\n        return;\n    }\n    m_CurContentMark.GetModify()->DeleteLastMark();\n}\nvoid CPDF_StreamContentParser::Handle_EndText()\n{\n    int count = m_ClipTextList.GetSize();\n    if (count == 0) {\n        return;\n    }\n    if (m_pCurStates->m_TextState.GetObject()->m_TextMode < 4) {\n        for (int i = 0; i < count; i ++) {\n            CPDF_TextObject* pText = (CPDF_TextObject*)m_ClipTextList.GetAt(i);\n            if (pText) {\n                delete pText;\n            }\n        }\n    } else {\n        m_pCurStates->m_ClipPath.AppendTexts((CPDF_TextObject**)m_ClipTextList.GetData(), count);\n    }\n    m_ClipTextList.RemoveAll();\n}\nvoid CPDF_StreamContentParser::Handle_EndSectionUndefined()\n{\n    if (m_CompatCount) {\n        m_CompatCount --;\n    }\n}\nvoid CPDF_StreamContentParser::Handle_FillPath()\n{\n    if (m_Options.m_bTextOnly) {\n        return;\n    }\n    AddPathObject(FXFILL_WINDING, FALSE);\n}\nvoid CPDF_StreamContentParser::Handle_FillPathOld()\n{\n    if (m_Options.m_bTextOnly) {\n        return;\n    }\n    AddPathObject(FXFILL_WINDING, FALSE);\n}\nvoid CPDF_StreamContentParser::Handle_EOFillPath()\n{\n    if (m_Options.m_bTextOnly) {\n        return;\n    }\n    AddPathObject(FXFILL_ALTERNATE, FALSE);\n}\nvoid CPDF_StreamContentParser::Handle_SetGray_Fill()\n{\n    FX_FLOAT value = GetNumber(0);\n    CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);\n    m_pCurStates->m_ColorState.SetFillColor(pCS, &value, 1);\n}\nvoid CPDF_StreamContentParser::Handle_SetGray_Stroke()\n{\n    FX_FLOAT value = GetNumber(0);\n    CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);\n    m_pCurStates->m_ColorState.SetStrokeColor(pCS, &value, 1);\n}\nvoid CPDF_StreamContentParser::Handle_SetExtendGraphState()\n{\n    CFX_ByteString name = GetString(0);\n    CPDF_Dictionary* pGS = (CPDF_Dictionary*)FindResourceObj(FX_BSTRC(\"ExtGState\"), name);\n    if (pGS == NULL || pGS->GetType() != PDFOBJ_DICTIONARY) {\n        m_bResourceMissing = TRUE;\n        return;\n    }\n    m_pCurStates->ProcessExtGS(pGS, this);\n}\nvoid CPDF_StreamContentParser::Handle_ClosePath()\n{\n    if (m_Options.m_bTextOnly) {\n        return;\n    }\n    if (m_PathPointCount == 0) {\n        return;\n    }\n    if (m_PathStartX != m_PathCurrentX || m_PathStartY != m_PathCurrentY) {\n        AddPathPoint(m_PathStartX, m_PathStartY, FXPT_LINETO | FXPT_CLOSEFIGURE);\n    } else if (m_pPathPoints[m_PathPointCount - 1].m_Flag != FXPT_MOVETO) {\n        m_pPathPoints[m_PathPointCount - 1].m_Flag |= FXPT_CLOSEFIGURE;\n    }\n}\nvoid CPDF_StreamContentParser::Handle_SetFlat()\n{\n#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)\n    m_pCurStates->m_GeneralState.GetModify()->m_Flatness = GetNumber(0);\n#endif\n}\nvoid CPDF_StreamContentParser::Handle_BeginImageData()\n{\n}\nvoid CPDF_StreamContentParser::Handle_SetLineJoin()\n{\n    m_pCurStates->m_GraphState.GetModify()->m_LineJoin = (CFX_GraphStateData::LineJoin)GetInteger(0);\n}\nvoid CPDF_StreamContentParser::Handle_SetLineCap()\n{\n    m_pCurStates->m_GraphState.GetModify()->m_LineCap = (CFX_GraphStateData::LineCap)GetInteger(0);\n}\nvoid CPDF_StreamContentParser::Handle_SetCMYKColor_Fill()\n{\n    REQUIRE_PARAMS(4);\n    FX_FLOAT values[4];\n    for (int i = 0; i < 4; i ++) {\n        values[i] = GetNumber(3 - i);\n    }\n    CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);\n    m_pCurStates->m_ColorState.SetFillColor(pCS, values, 4);\n}\nvoid CPDF_StreamContentParser::Handle_SetCMYKColor_Stroke()\n{\n    REQUIRE_PARAMS(4);\n    FX_FLOAT values[4];\n    for (int i = 0; i < 4; i ++) {\n        values[i] = GetNumber(3 - i);\n    }\n    CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);\n    m_pCurStates->m_ColorState.SetStrokeColor(pCS, values, 4);\n}\nvoid CPDF_StreamContentParser::Handle_LineTo()\n{\n    REQUIRE_PARAMS(2);\n    if (m_Options.m_bTextOnly) {\n        return;\n    }\n    AddPathPoint(GetNumber(1), GetNumber(0), FXPT_LINETO);\n}\nvoid CPDF_StreamContentParser::Handle_MoveTo()\n{\n    REQUIRE_PARAMS(2);\n    if (m_Options.m_bTextOnly) {\n#ifndef _FPDFAPI_MINI_\n        m_pSyntax->SkipPathObject();\n#endif\n        return;\n    }\n    AddPathPoint(GetNumber(1), GetNumber(0), FXPT_MOVETO);\n#ifndef _FPDFAPI_MINI_\n    ParsePathObject();\n#endif\n}\nvoid CPDF_StreamContentParser::Handle_SetMiterLimit()\n{\n    m_pCurStates->m_GraphState.GetModify()->m_MiterLimit = GetNumber(0);\n}\nvoid CPDF_StreamContentParser::Handle_MarkPlace()\n{\n}\nvoid CPDF_StreamContentParser::Handle_EndPath()\n{\n    if (m_Options.m_bTextOnly) {\n        return;\n    }\n    AddPathObject(0, FALSE);\n}\nvoid CPDF_StreamContentParser::Handle_SaveGraphState()\n{\n    CPDF_AllStates* pStates = FX_NEW CPDF_AllStates;\n    pStates->Copy(*m_pCurStates);\n    m_StateStack.Add(pStates);\n}\nvoid CPDF_StreamContentParser::Handle_RestoreGraphState()\n{\n    int size = m_StateStack.GetSize();\n    if (size == 0) {\n        return;\n    }\n    CPDF_AllStates* pStates = (CPDF_AllStates*)m_StateStack.GetAt(size - 1);\n    m_pCurStates->Copy(*pStates);\n    delete pStates;\n    m_StateStack.RemoveAt(size - 1);\n}\nvoid CPDF_StreamContentParser::Handle_Rectangle()\n{\n    if (m_Options.m_bTextOnly) {\n        return;\n    }\n    FX_FLOAT x = GetNumber(3), y = GetNumber(2);\n    FX_FLOAT w = GetNumber(1), h = GetNumber(0);\n    AddPathRect(x, y, w, h);\n}\nvoid CPDF_StreamContentParser::AddPathRect(FX_FLOAT x, FX_FLOAT y, FX_FLOAT w, FX_FLOAT h)\n{\n    AddPathPoint(x, y, FXPT_MOVETO);\n    AddPathPoint(x + w, y, FXPT_LINETO);\n    AddPathPoint(x + w, y + h, FXPT_LINETO);\n    AddPathPoint(x, y + h, FXPT_LINETO);\n    AddPathPoint(x, y, FXPT_LINETO | FXPT_CLOSEFIGURE);\n}\nvoid CPDF_StreamContentParser::Handle_SetRGBColor_Fill()\n{\n    REQUIRE_PARAMS(3);\n    FX_FLOAT values[3];\n    for (int i = 0; i < 3; i ++) {\n        values[i] = GetNumber(2 - i);\n    }\n    CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);\n    m_pCurStates->m_ColorState.SetFillColor(pCS, values, 3);\n}\nvoid CPDF_StreamContentParser::Handle_SetRGBColor_Stroke()\n{\n    REQUIRE_PARAMS(3);\n    FX_FLOAT values[3];\n    for (int i = 0; i < 3; i ++) {\n        values[i] = GetNumber(2 - i);\n    }\n    CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);\n    m_pCurStates->m_ColorState.SetStrokeColor(pCS, values, 3);\n}\nvoid CPDF_StreamContentParser::Handle_SetRenderIntent()\n{\n}\nvoid CPDF_StreamContentParser::Handle_CloseStrokePath()\n{\n    if (m_Options.m_bTextOnly) {\n        return;\n    }\n    Handle_ClosePath();\n    AddPathObject(0, TRUE);\n}\nvoid CPDF_StreamContentParser::Handle_StrokePath()\n{\n    if (m_Options.m_bTextOnly) {\n        return;\n    }\n    AddPathObject(0, TRUE);\n}\nvoid CPDF_StreamContentParser::Handle_SetColor_Fill()\n{\n    if (m_Options.m_bTextOnly) {\n        return;\n    }\n    FX_FLOAT values[4];\n    int nargs = m_ParamCount;\n    if (nargs > 4) {\n        nargs = 4;\n    }\n    for (int i = 0; i < nargs; i ++) {\n        values[i] = GetNumber(nargs - i - 1);\n    }\n    m_pCurStates->m_ColorState.SetFillColor(NULL, values, nargs);\n}\nvoid CPDF_StreamContentParser::Handle_SetColor_Stroke()\n{\n    if (m_Options.m_bTextOnly) {\n        return;\n    }\n    FX_FLOAT values[4];\n    int nargs = m_ParamCount;\n    if (nargs > 4) {\n        nargs = 4;\n    }\n    for (int i = 0; i < nargs; i ++) {\n        values[i] = GetNumber(nargs - i - 1);\n    }\n    m_pCurStates->m_ColorState.SetStrokeColor(NULL, values, nargs);\n}\nvoid CPDF_StreamContentParser::Handle_SetColorPS_Fill()\n{\n    if (m_Options.m_bTextOnly) {\n        return;\n    }\n    CPDF_Object* pLastParam = GetObject(0);\n    if (pLastParam == NULL) {\n        return;\n    }\n    int nargs = m_ParamCount;\n    int nvalues = nargs;\n    if (pLastParam->GetType() == PDFOBJ_NAME) {\n        nvalues --;\n    }\n    FX_FLOAT* values = NULL;\n    if (nvalues) {\n        values = FX_Alloc(FX_FLOAT, nvalues);\n        for (int i = 0; i < nvalues; i ++) {\n            values[i] = GetNumber(nargs - i - 1);\n        }\n    }\n    if (nvalues != nargs) {\n        CPDF_Pattern* pPattern = FindPattern(GetString(0), FALSE);\n        if (pPattern) {\n            m_pCurStates->m_ColorState.SetFillPattern(pPattern, values, nvalues);\n        }\n    } else {\n        m_pCurStates->m_ColorState.SetFillColor(NULL, values, nvalues);\n    }\n    if (values) {\n        FX_Free(values);\n    }\n}\nvoid CPDF_StreamContentParser::Handle_SetColorPS_Stroke()\n{\n    if (m_Options.m_bTextOnly) {\n        return;\n    }\n    CPDF_Object* pLastParam = GetObject(0);\n    if (pLastParam == NULL) {\n        return;\n    }\n    int nargs = m_ParamCount;\n    int nvalues = nargs;\n    if (pLastParam->GetType() == PDFOBJ_NAME) {\n        nvalues --;\n    }\n    FX_FLOAT* values = NULL;\n    if (nvalues) {\n        values = FX_Alloc(FX_FLOAT, nvalues);\n        for (int i = 0; i < nvalues; i ++) {\n            values[i] = GetNumber(nargs - i - 1);\n        }\n    }\n    if (nvalues != nargs) {\n        CPDF_Pattern* pPattern = FindPattern(GetString(0), FALSE);\n        if (pPattern) {\n            m_pCurStates->m_ColorState.SetStrokePattern(pPattern, values, nvalues);\n        }\n    } else {\n        m_pCurStates->m_ColorState.SetStrokeColor(NULL, values, nvalues);\n    }\n    if (values) {\n        FX_Free(values);\n    }\n}\nCFX_FloatRect _GetShadingBBox(CPDF_Stream* pStream, int type, const CFX_AffineMatrix* pMatrix,\n                              CPDF_Function** pFuncs, int nFuncs, CPDF_ColorSpace* pCS);\nvoid CPDF_StreamContentParser::Handle_ShadeFill()\n{\n    if (m_Options.m_bTextOnly) {\n        return;\n    }\n    CPDF_Pattern* pPattern = FindPattern(GetString(0), TRUE);\n    if (pPattern == NULL) {\n        return;\n    }\n    if (pPattern->m_PatternType != PATTERN_SHADING) {\n        return;\n    }\n    CPDF_ShadingPattern* pShading = (CPDF_ShadingPattern*)pPattern;\n    if (!pShading->m_bShadingObj) {\n        return;\n    }\n    if (!pShading->Load()) {\n        return;\n    }\n    CPDF_ShadingObject* pObj = FX_NEW CPDF_ShadingObject;\n    pObj->m_pShading = pShading;\n    SetGraphicStates(pObj, FALSE, FALSE, FALSE);\n    pObj->m_Matrix = m_pCurStates->m_CTM;\n    pObj->m_Matrix.Concat(m_mtContentToUser);\n    CFX_FloatRect bbox;\n    if (!pObj->m_ClipPath.IsNull()) {\n        bbox = pObj->m_ClipPath.GetClipBox();\n    } else {\n        bbox = m_BBox;\n    }\n    if (pShading->m_ShadingType >= 4) {\n        bbox.Intersect(_GetShadingBBox((CPDF_Stream*)pShading->m_pShadingObj, pShading->m_ShadingType, &pObj->m_Matrix,\n                                       pShading->m_pFunctions, pShading->m_nFuncs, pShading->m_pCS));\n    }\n    pObj->m_Left = bbox.left;\n    pObj->m_Right = bbox.right;\n    pObj->m_Top = bbox.top;\n    pObj->m_Bottom = bbox.bottom;\n    m_pObjectList->m_ObjectList.AddTail(pObj);\n}\nvoid CPDF_StreamContentParser::Handle_SetCharSpace()\n{\n    m_pCurStates->m_TextState.GetModify()->m_CharSpace = GetNumber(0);\n}\nvoid CPDF_StreamContentParser::Handle_MoveTextPoint()\n{\n    m_pCurStates->m_TextLineX += GetNumber(1);\n    m_pCurStates->m_TextLineY += GetNumber(0);\n    m_pCurStates->m_TextX = m_pCurStates->m_TextLineX;\n    m_pCurStates->m_TextY = m_pCurStates->m_TextLineY;\n}\nvoid CPDF_StreamContentParser::Handle_MoveTextPoint_SetLeading()\n{\n    Handle_MoveTextPoint();\n    m_pCurStates->m_TextLeading = -GetNumber(0);\n}\nvoid CPDF_StreamContentParser::Handle_SetFont()\n{\n    FX_FLOAT fs = GetNumber(0);\n    if (fs == 0) {\n        fs = m_DefFontSize;\n    }\n    m_pCurStates->m_TextState.GetModify()->m_FontSize = fs;\n    CPDF_Font* pFont = FindFont(GetString(1));\n    if (pFont) {\n        m_pCurStates->m_TextState.SetFont(pFont);\n    }\n}\nCPDF_Object* CPDF_StreamContentParser::FindResourceObj(FX_BSTR type, const CFX_ByteString& name)\n{\n    if (m_pResources == NULL) {\n        return NULL;\n    }\n    if (m_pResources == m_pPageResources) {\n        CPDF_Dictionary* pList = m_pResources->GetDict(type);\n        if (pList == NULL) {\n            return NULL;\n        }\n        CPDF_Object* pRes = pList->GetElementValue(name);\n        return pRes;\n    }\n    CPDF_Dictionary* pList = m_pResources->GetDict(type);\n    if (pList == NULL) {\n        if (m_pPageResources == NULL) {\n            return NULL;\n        }\n        CPDF_Dictionary* pList = m_pPageResources->GetDict(type);\n        if (pList == NULL) {\n            return NULL;\n        }\n        CPDF_Object* pRes = pList->GetElementValue(name);\n        return pRes;\n    }\n    CPDF_Object* pRes = pList->GetElementValue(name);\n    return pRes;\n}\nCPDF_Font* CPDF_StreamContentParser::FindFont(const CFX_ByteString& name)\n{\n    CPDF_Dictionary* pFontDict = (CPDF_Dictionary*)FindResourceObj(FX_BSTRC(\"Font\"), name);\n    if (pFontDict == NULL || pFontDict->GetType() != PDFOBJ_DICTIONARY) {\n        m_bResourceMissing = TRUE;\n        return CPDF_Font::GetStockFont(m_pDocument, FX_BSTRC(\"Helvetica\"));\n    }\n    CPDF_Font* pFont = m_pDocument->LoadFont(pFontDict);\n    if (pFont && pFont->GetType3Font()) {\n        pFont->GetType3Font()->SetPageResources(m_pResources);\n        pFont->GetType3Font()->CheckType3FontMetrics();\n    }\n    return pFont;\n}\nCPDF_ColorSpace* CPDF_StreamContentParser::FindColorSpace(const CFX_ByteString& name)\n{\n    if (name == FX_BSTRC(\"Pattern\")) {\n        return CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN);\n    }\n    if (name == FX_BSTRC(\"DeviceGray\") || name == FX_BSTRC(\"DeviceCMYK\") || name == FX_BSTRC(\"DeviceRGB\")) {\n        CFX_ByteString defname = \"Default\";\n        defname += name.Mid(7);\n        CPDF_Object* pDefObj = FindResourceObj(FX_BSTRC(\"ColorSpace\"), defname);\n        if (pDefObj == NULL) {\n            if (name == FX_BSTRC(\"DeviceGray\")) {\n                return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);\n            }\n            if (name == FX_BSTRC(\"DeviceRGB\")) {\n                return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);\n            }\n            return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);\n        }\n        return m_pDocument->LoadColorSpace(pDefObj);\n    }\n    CPDF_Object* pCSObj = FindResourceObj(FX_BSTRC(\"ColorSpace\"), name);\n    if (pCSObj == NULL) {\n        m_bResourceMissing = TRUE;\n        return NULL;\n    }\n    return m_pDocument->LoadColorSpace(pCSObj);\n}\nCPDF_Pattern* CPDF_StreamContentParser::FindPattern(const CFX_ByteString& name, FX_BOOL bShading)\n{\n    CPDF_Object* pPattern = FindResourceObj(bShading ? FX_BSTRC(\"Shading\") : FX_BSTRC(\"Pattern\"), name);\n    if (pPattern == NULL || (pPattern->GetType() != PDFOBJ_DICTIONARY &&\n                             pPattern->GetType() != PDFOBJ_STREAM)) {\n        m_bResourceMissing = TRUE;\n        return NULL;\n    }\n    return m_pDocument->LoadPattern(pPattern, bShading, &m_pCurStates->m_ParentMatrix);\n}\nvoid CPDF_StreamContentParser::ConvertTextSpace(FX_FLOAT& x, FX_FLOAT& y)\n{\n    m_pCurStates->m_TextMatrix.Transform(x, y, x, y);\n    ConvertUserSpace(x, y);\n}\nvoid CPDF_StreamContentParser::ConvertUserSpace(FX_FLOAT& x, FX_FLOAT& y)\n{\n    m_pCurStates->m_CTM.Transform(x, y, x, y);\n    m_mtContentToUser.Transform(x, y, x, y);\n}\nvoid CPDF_StreamContentParser::AddTextObject(CFX_ByteString* pStrs, FX_FLOAT fInitKerning, FX_FLOAT* pKerning, int nsegs)\n{\n    CPDF_Font* pFont = m_pCurStates->m_TextState.GetFont();\n    if (pFont == NULL) {\n        return;\n    }\n    if (fInitKerning != 0) {\n        if (!pFont->IsVertWriting()) {\n            m_pCurStates->m_TextX -= FXSYS_Mul(fInitKerning, m_pCurStates->m_TextState.GetFontSize()) / 1000;\n        } else {\n            m_pCurStates->m_TextY -= FXSYS_Mul(fInitKerning, m_pCurStates->m_TextState.GetFontSize()) / 1000;\n        }\n    }\n    if (nsegs == 0) {\n        return;\n    }\n    int textmode;\n    if (pFont->GetFontType() == PDFFONT_TYPE3) {\n        textmode = 0;\n    } else {\n        textmode = m_pCurStates->m_TextState.GetObject()->m_TextMode;\n    }\n    CPDF_TextObject* pText = FX_NEW CPDF_TextObject;\n    m_pLastTextObject = pText;\n    SetGraphicStates(pText, TRUE, TRUE, TRUE);\n    if (textmode && textmode != 3 && textmode != 4 && textmode != 7) {\n        FX_FLOAT* pCTM = pText->m_TextState.GetModify()->m_CTM;\n        pCTM[0] = m_pCurStates->m_CTM.a;\n        pCTM[1] = m_pCurStates->m_CTM.c;\n        pCTM[2] = m_pCurStates->m_CTM.b;\n        pCTM[3] = m_pCurStates->m_CTM.d;\n    }\n    pText->SetSegments(pStrs, pKerning, nsegs);\n    pText->m_PosX = m_pCurStates->m_TextX;\n    pText->m_PosY = m_pCurStates->m_TextY + m_pCurStates->m_TextRise;\n    ConvertTextSpace(pText->m_PosX, pText->m_PosY);\n    FX_FLOAT x_advance, y_advance;\n    pText->CalcPositionData(&x_advance, &y_advance, m_pCurStates->m_TextHorzScale, m_Level);\n    m_pCurStates->m_TextX += x_advance;\n    m_pCurStates->m_TextY += y_advance;\n    if (textmode > 3) {\n        CPDF_TextObject* pCopy = FX_NEW CPDF_TextObject;\n        pCopy->Copy(pText);\n        m_ClipTextList.Add(pCopy);\n    }\n    m_pObjectList->m_ObjectList.AddTail(pText);\n    if (pKerning && pKerning[nsegs - 1] != 0) {\n        if (!pFont->IsVertWriting()) {\n            m_pCurStates->m_TextX -= FXSYS_Mul(pKerning[nsegs - 1], m_pCurStates->m_TextState.GetFontSize()) / 1000;\n        } else {\n            m_pCurStates->m_TextY -= FXSYS_Mul(pKerning[nsegs - 1], m_pCurStates->m_TextState.GetFontSize()) / 1000;\n        }\n    }\n}\nvoid CPDF_StreamContentParser::Handle_ShowText()\n{\n    CFX_ByteString str = GetString(0);\n    if (str.IsEmpty()) {\n        return;\n    }\n    AddTextObject(&str, 0, NULL, 1);\n}\nvoid CPDF_StreamContentParser::Handle_ShowText_Positioning()\n{\n    CPDF_Array* pArray = GetObject(0) ? GetObject(0)->GetArray() : NULL;\n    if (pArray == NULL) {\n        return;\n    }\n    int n = pArray->GetCount(), nsegs = 0, i;\n    for (i = 0; i < n; i ++) {\n        CPDF_Object* pObj = pArray->GetElementValue(i);\n        if (pObj->GetType() == PDFOBJ_STRING) {\n            nsegs ++;\n        }\n    }\n    if (nsegs == 0) {\n        for (i = 0; i < n; i ++) {\n            m_pCurStates->m_TextX -= FXSYS_Mul(pArray->GetNumber(i), m_pCurStates->m_TextState.GetFontSize()) / 1000;\n        };\n        return;\n    }\n    CFX_ByteString* pStrs;\n    FX_NEW_VECTOR(pStrs, CFX_ByteString, nsegs);\n    FX_FLOAT* pKerning = FX_Alloc(FX_FLOAT, nsegs);\n    int iSegment = 0;\n    FX_FLOAT fInitKerning = 0;\n    for (i = 0; i < n; i ++) {\n        CPDF_Object* pObj = pArray->GetElementValue(i);\n        if (pObj->GetType() == PDFOBJ_STRING) {\n            CFX_ByteString str = pObj->GetString();\n            if (str.IsEmpty()) {\n                continue;\n            }\n            pStrs[iSegment] = str;\n            pKerning[iSegment ++] = 0;\n        } else {\n            FX_FLOAT num = pObj ? pObj->GetNumber() : 0;\n            if (iSegment == 0) {\n                fInitKerning += num;\n            } else {\n                pKerning[iSegment - 1] += num;\n            }\n        }\n    }\n    AddTextObject(pStrs, fInitKerning, pKerning, iSegment);\n    FX_DELETE_VECTOR(pStrs, CFX_ByteString, nsegs);\n    FX_Free(pKerning);\n}\nvoid CPDF_StreamContentParser::Handle_SetTextLeading()\n{\n    m_pCurStates->m_TextLeading = GetNumber(0);\n}\nvoid CPDF_StreamContentParser::Handle_SetTextMatrix()\n{\n    m_pCurStates->m_TextMatrix.Set(GetNumber16(5), GetNumber16(4), GetNumber16(3),\n                                   GetNumber16(2), GetNumber(1), GetNumber(0));\n    OnChangeTextMatrix();\n    m_pCurStates->m_TextX = 0;\n    m_pCurStates->m_TextY = 0;\n    m_pCurStates->m_TextLineX = 0;\n    m_pCurStates->m_TextLineY = 0;\n}\nvoid CPDF_StreamContentParser::OnChangeTextMatrix()\n{\n    CFX_AffineMatrix text_matrix(m_pCurStates->m_TextHorzScale, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);\n    text_matrix.Concat(m_pCurStates->m_TextMatrix);\n    text_matrix.Concat(m_pCurStates->m_CTM);\n    text_matrix.Concat(m_mtContentToUser);\n    FX_FLOAT* pTextMatrix = m_pCurStates->m_TextState.GetModify()->m_Matrix;\n    pTextMatrix[0] = text_matrix.a;\n    pTextMatrix[1] = text_matrix.c;\n    pTextMatrix[2] = text_matrix.b;\n    pTextMatrix[3] = text_matrix.d;\n}\nvoid CPDF_StreamContentParser::Handle_SetTextRenderMode()\n{\n    int mode = GetInteger(0);\n    if (mode < 0 || mode > 7) {\n        return;\n    }\n    m_pCurStates->m_TextState.GetModify()->m_TextMode = mode;\n}\nvoid CPDF_StreamContentParser::Handle_SetTextRise()\n{\n    m_pCurStates->m_TextRise = GetNumber(0);\n}\nvoid CPDF_StreamContentParser::Handle_SetWordSpace()\n{\n    m_pCurStates->m_TextState.GetModify()->m_WordSpace = GetNumber(0);\n}\nvoid CPDF_StreamContentParser::Handle_SetHorzScale()\n{\n    if (m_ParamCount != 1) {\n        return;\n    }\n    m_pCurStates->m_TextHorzScale = GetNumber(0) / 100;\n    OnChangeTextMatrix();\n}\nvoid CPDF_StreamContentParser::Handle_MoveToNextLine()\n{\n    m_pCurStates->m_TextLineY -= m_pCurStates->m_TextLeading;\n    m_pCurStates->m_TextX = m_pCurStates->m_TextLineX;\n    m_pCurStates->m_TextY = m_pCurStates->m_TextLineY;\n}\nvoid CPDF_StreamContentParser::Handle_CurveTo_23()\n{\n    if (m_Options.m_bTextOnly) {\n        return;\n    }\n    AddPathPoint(m_PathCurrentX, m_PathCurrentY, FXPT_BEZIERTO);\n    AddPathPoint(GetNumber(3), GetNumber(2), FXPT_BEZIERTO);\n    AddPathPoint(GetNumber(1), GetNumber(0), FXPT_BEZIERTO);\n}\nvoid CPDF_StreamContentParser::Handle_SetLineWidth()\n{\n    FX_FLOAT width = GetNumber(0);\n    m_pCurStates->m_GraphState.GetModify()->m_LineWidth = width;\n}\nvoid CPDF_StreamContentParser::Handle_Clip()\n{\n    m_PathClipType = FXFILL_WINDING;\n}\nvoid CPDF_StreamContentParser::Handle_EOClip()\n{\n    m_PathClipType = FXFILL_ALTERNATE;\n}\nvoid CPDF_StreamContentParser::Handle_CurveTo_13()\n{\n    if (m_Options.m_bTextOnly) {\n        return;\n    }\n    AddPathPoint(GetNumber(3), GetNumber(2), FXPT_BEZIERTO);\n    AddPathPoint(GetNumber(1), GetNumber(0), FXPT_BEZIERTO);\n    AddPathPoint(GetNumber(1), GetNumber(0), FXPT_BEZIERTO);\n}\nvoid CPDF_StreamContentParser::Handle_NextLineShowText()\n{\n    Handle_MoveToNextLine();\n    Handle_ShowText();\n}\nvoid CPDF_StreamContentParser::Handle_NextLineShowText_Space()\n{\n    m_pCurStates->m_TextState.GetModify()->m_WordSpace = GetNumber(2);\n    m_pCurStates->m_TextState.GetModify()->m_CharSpace = GetNumber(1);\n    Handle_NextLineShowText();\n}\nvoid CPDF_StreamContentParser::Handle_Invalid()\n{\n}\nvoid CPDF_StreamContentParser::AddPathPoint(FX_FLOAT x, FX_FLOAT y, int flag)\n{\n    m_PathCurrentX = x;\n    m_PathCurrentY = y;\n    if (flag == FXPT_MOVETO) {\n        m_PathStartX = x;\n        m_PathStartY = y;\n        if (m_PathPointCount && m_pPathPoints[m_PathPointCount - 1].m_Flag == FXPT_MOVETO) {\n            m_pPathPoints[m_PathPointCount - 1].m_PointX = x;\n            m_pPathPoints[m_PathPointCount - 1].m_PointY = y;\n            return;\n        }\n    } else if (m_PathPointCount == 0) {\n        return;\n    }\n    m_PathPointCount ++;\n    if (m_PathPointCount > m_PathAllocSize) {\n        int newsize = m_PathPointCount + 256;\n        FX_PATHPOINT* pNewPoints = FX_Alloc(FX_PATHPOINT, newsize);\n        if (m_PathAllocSize) {\n            FXSYS_memcpy32(pNewPoints, m_pPathPoints, m_PathAllocSize * sizeof(FX_PATHPOINT));\n            FX_Free(m_pPathPoints);\n        }\n        m_pPathPoints = pNewPoints;\n        m_PathAllocSize = newsize;\n    }\n    m_pPathPoints[m_PathPointCount - 1].m_Flag = flag;\n    m_pPathPoints[m_PathPointCount - 1].m_PointX = x;\n    m_pPathPoints[m_PathPointCount - 1].m_PointY = y;\n}\nvoid CPDF_StreamContentParser::AddPathObject(int FillType, FX_BOOL bStroke)\n{\n    int PathPointCount = m_PathPointCount, PathClipType = m_PathClipType;\n    m_PathPointCount = 0;\n    m_PathClipType = 0;\n    if (PathPointCount <= 1) {\n        if (PathPointCount && PathClipType) {\n            CPDF_Path path;\n            path.New()->AppendRect(0, 0, 0, 0);\n            m_pCurStates->m_ClipPath.AppendPath(path, FXFILL_WINDING, TRUE);\n        }\n        return;\n    }\n    if (PathPointCount && m_pPathPoints[PathPointCount - 1].m_Flag == FXPT_MOVETO) {\n        PathPointCount --;\n    }\n    CPDF_Path Path;\n    CFX_PathData* pPathData = Path.New();\n    pPathData->SetPointCount(PathPointCount);\n    FXSYS_memcpy32(pPathData->GetPoints(), m_pPathPoints, sizeof(FX_PATHPOINT) * PathPointCount);\n    CFX_AffineMatrix matrix = m_pCurStates->m_CTM;\n    matrix.Concat(m_mtContentToUser);\n    if (bStroke || FillType) {\n        CPDF_PathObject* pPathObj = FX_NEW CPDF_PathObject;\n        pPathObj->m_bStroke = bStroke;\n        pPathObj->m_FillType = FillType;\n        pPathObj->m_Path = Path;\n        pPathObj->m_Matrix = matrix;\n        SetGraphicStates(pPathObj, TRUE, FALSE, TRUE);\n        pPathObj->CalcBoundingBox();\n        m_pObjectList->m_ObjectList.AddTail(pPathObj);\n    }\n    if (PathClipType) {\n        if (!matrix.IsIdentity()) {\n            Path.Transform(&matrix);\n            matrix.SetIdentity();\n        }\n        m_pCurStates->m_ClipPath.AppendPath(Path, PathClipType, TRUE);\n    }\n}\nCFX_ByteString _FPDF_ByteStringFromHex(CFX_BinaryBuf& src_buf)\n{\n    CFX_ByteTextBuf buf;\n    FX_BOOL bFirst = TRUE;\n    int code = 0;\n    FX_LPCBYTE str = src_buf.GetBuffer();\n    FX_DWORD size = src_buf.GetSize();\n    for (FX_DWORD i = 0; i < size; i ++) {\n        FX_BYTE ch = str[i];\n        if (ch >= '0' && ch <= '9') {\n            if (bFirst) {\n                code = (ch - '0') * 16;\n            } else {\n                code += ch - '0';\n                buf.AppendChar((char)code);\n            }\n            bFirst = !bFirst;\n        } else if (ch >= 'A' && ch <= 'F') {\n            if (bFirst) {\n                code = (ch - 'A' + 10) * 16;\n            } else {\n                code += ch - 'A' + 10;\n                buf.AppendChar((char)code);\n            }\n            bFirst = !bFirst;\n        } else if (ch >= 'a' && ch <= 'f') {\n            if (bFirst) {\n                code = (ch - 'a' + 10) * 16;\n            } else {\n                code += ch - 'a' + 10;\n                buf.AppendChar((char)code);\n            }\n            bFirst = !bFirst;\n        }\n    }\n    if (!bFirst) {\n        buf.AppendChar((char)code);\n    }\n    return buf.GetByteString();\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_page/fpdf_page_parser_new.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_page.h\"\n#include \"../../../include/fpdfapi/fpdf_module.h\"\n#include \"pageint.h\"\n#if defined(_FPDFAPI_MINI_)\nextern const FX_LPCSTR _PDF_CharType;\nvoid CPDF_StreamContentParser::InputData(FX_LPCBYTE src_buf, FX_DWORD src_size)\n{\n    if (m_Level > _FPDF_MAX_FORM_LEVEL_) {\n        return;\n    }\n    for (FX_DWORD i = 0; i < src_size; i ++) {\n        int ch = src_buf[i];\n        int type = _PDF_CharType[ch];\nstart:\n        switch (m_WordState) {\n            case 0:\n                if (type == 'W') {\n                } else if (type == 'N') {\n                    m_WordState = 5;\n                    m_pWordBuf[0] = ch;\n                    m_WordSize = 1;\n                } else if (type == 'R') {\n                    m_WordState = 4;\n                    m_pWordBuf[0] = ch;\n                    m_WordSize = 1;\n                } else switch (ch) {\n                        case '/':\n                            m_WordState = 2;\n                            m_WordSize = 0;\n                            break;\n                        case '[':\n                            StartArray();\n                            break;\n                        case ']':\n                            EndArray();\n                            break;\n                        case '(':\n                            m_WordState = 7;\n                            m_StringLevel = 1;\n                            m_StringState = 0;\n                            m_StringBuf.Clear();\n                            break;\n                        case '<':\n                            m_WordState = 3;\n                            break;\n                        case '>':\n                            m_WordState = 8;\n                            break;\n                        case '%':\n                            m_WordState = 1;\n                            break;\n                    }\n                break;\n            case 1:\n                if (ch == '\\n' || ch == '\\r') {\n                    m_WordState = 0;\n                }\n                break;\n            case 2:\n                if (type != 'R' && type != 'N') {\n                    EndName();\n                    m_WordState = 0;\n                    goto start;\n                }\n                if (m_WordSize < 256) {\n                    m_pWordBuf[m_WordSize++] = ch;\n                }\n                break;\n            case 3:\n                if (ch == '<') {\n                    StartDict();\n                    m_WordState = 0;\n                } else {\n                    m_StringBuf.Clear();\n                    m_WordState = 6;\n                    goto start;\n                }\n                break;\n            case 4:\n                if (type != 'R' && type != 'N') {\n                    m_WordState = 0;\n                    EndKeyword();\n                    if (m_bAbort) {\n                        return;\n                    }\n                    goto start;\n                }\n                if (m_WordSize < 256) {\n                    m_pWordBuf[m_WordSize++] = ch;\n                }\n                break;\n            case 5:\n                if (type != 'N') {\n                    EndNumber();\n                    m_WordState = 0;\n                    goto start;\n                }\n                if (m_WordSize < 256) {\n                    m_pWordBuf[m_WordSize++] = ch;\n                }\n                break;\n            case 6:\n                if (ch == '>') {\n                    EndHexString();\n                    m_WordState = 0;\n                } else {\n                    m_StringBuf.AppendByte(ch);\n                }\n                break;\n            case 7:\n                switch (m_StringState) {\n                    case 0:\n                        if (ch == ')') {\n                            m_StringLevel --;\n                            if (m_StringLevel == 0) {\n                                EndString();\n                                m_WordState = 0;\n                                break;\n                            }\n                            m_StringBuf.AppendByte(')');\n                        } else if (ch == '(') {\n                            m_StringLevel ++;\n                            m_StringBuf.AppendByte('(');\n                        } else if (ch == '\\\\') {\n                            m_StringState = 1;\n                        } else {\n                            m_StringBuf.AppendByte((char)ch);\n                        }\n                        break;\n                    case 1:\n                        if (ch >= '0' && ch <= '7') {\n                            m_EscCode = ch - '0';\n                            m_StringState = 2;\n                            break;\n                        }\n                        if (ch == 'n') {\n                            m_StringBuf.AppendByte('\\n');\n                        } else if (ch == 'r') {\n                            m_StringBuf.AppendByte('\\r');\n                        } else if (ch == 't') {\n                            m_StringBuf.AppendByte('\\t');\n                        } else if (ch == 'b') {\n                            m_StringBuf.AppendByte('\\b');\n                        } else if (ch == 'f') {\n                            m_StringBuf.AppendByte('\\f');\n                        } else if (ch == '\\\\') {\n                            m_StringBuf.AppendByte('\\\\');\n                        } else if (ch == '(') {\n                            m_StringBuf.AppendByte('(');\n                        } else if (ch == ')') {\n                            m_StringBuf.AppendByte(')');\n                        } else if (ch == '\\r') {\n                            m_StringState = 4;\n                            break;\n                        } else if (ch == '\\n') {\n                        } else {\n                            m_StringBuf.AppendByte(ch);\n                        }\n                        m_StringState = 0;\n                        break;\n                    case 2:\n                        if (ch >= '0' && ch <= '7') {\n                            m_EscCode = m_EscCode * 8 + ch - '0';\n                            m_StringState = 3;\n                        } else {\n                            m_StringBuf.AppendByte(m_EscCode);\n                            m_StringState = 0;\n                            goto start;\n                        }\n                        break;\n                    case 3:\n                        if (ch >= '0' && ch <= '7') {\n                            m_EscCode = m_EscCode * 8 + ch - '0';\n                            m_StringBuf.AppendByte(m_EscCode);\n                            m_StringState = 0;\n                        } else {\n                            m_StringBuf.AppendByte(m_EscCode);\n                            m_StringState = 0;\n                            goto start;\n                        }\n                        break;\n                    case 4:\n                        m_StringState = 0;\n                        if (ch != '\\n') {\n                            goto start;\n                        }\n                        break;\n                }\n                break;\n            case 8:\n                m_WordState = 0;\n                if (ch == '>') {\n                    EndDict();\n                } else {\n                    goto start;\n                }\n                break;\n            case 9:\n                switch (m_InlineImageState) {\n                    case 0:\n                        if (type == 'W' || type == 'D') {\n                            m_InlineImageState = 1;\n                            m_InlineWhiteChar = ch;\n                        } else {\n                            m_StringBuf.AppendByte(ch);\n                        }\n                        break;\n                    case 1:\n                        m_StringBuf.AppendByte(m_InlineWhiteChar);\n                        if (ch == 'I') {\n                            m_InlineImageState = 2;\n                        } else {\n                            m_InlineImageState = 0;\n                            goto start;\n                        }\n                        break;\n                    case 2:\n                        if (ch == 'D') {\n                            m_InlineImageState = 3;\n                        } else {\n                            m_StringBuf.AppendByte('I');\n                            m_InlineImageState = 0;\n                            goto start;\n                        }\n                        break;\n                    case 3:\n                        EndImageDict();\n                        break;\n                }\n                break;\n            case 10:\n                switch (m_InlineImageState) {\n                    case 0:\n                        if (type == 'W') {\n                            m_InlineImageState = 1;\n                            m_InlineWhiteChar = ch;\n                        } else {\n                            m_ImageSrcBuf.AppendByte(ch);\n                        }\n                        break;\n                    case 1:\n                        if (ch == 'E') {\n                            m_InlineImageState = 2;\n                        } else {\n                            m_ImageSrcBuf.AppendByte(m_InlineWhiteChar);\n                            m_InlineImageState = 0;\n                            goto start;\n                        }\n                        break;\n                    case 2:\n                        if (ch == 'I') {\n                            m_InlineImageState = 3;\n                        } else {\n                            m_ImageSrcBuf.AppendByte(m_InlineWhiteChar);\n                            m_ImageSrcBuf.AppendByte('E');\n                            m_InlineImageState = 0;\n                            goto start;\n                        }\n                        break;\n                    case 3:\n                        if (type == 'W') {\n                            EndInlineImage();\n                        } else {\n                            m_ImageSrcBuf.AppendByte(m_InlineWhiteChar);\n                            m_ImageSrcBuf.AppendByte('E');\n                            m_ImageSrcBuf.AppendByte('I');\n                            m_InlineImageState = 0;\n                            goto start;\n                        }\n                        break;\n                }\n                break;\n            case 11:\n                if (m_InlineImageState < m_ImageSrcBuf.GetSize()) {\n                    m_ImageSrcBuf.GetBuffer()[m_InlineImageState ++] = ch;\n                } else {\n                    if (ch == 'I') {\n                        EndInlineImage();\n                    }\n                }\n                break;\n        }\n    }\n}\nvoid CPDF_StreamContentParser::Finish()\n{\n    switch (m_WordState) {\n        case 0:\n            break;\n        case 1:\n            break;\n        case 2:\n            EndName();\n            break;\n        case 3:\n            break;\n        case 4:\n            EndKeyword();\n            break;\n        case 5:\n            EndNumber();\n            break;\n        case 6:\n            EndHexString();\n            break;\n        case 7:\n            EndString();\n            break;\n        case 8:\n            break;\n        case 9:\n            break;\n        case 10:\n            EndInlineImage();\n            break;\n    }\n    m_WordState = 0;\n}\nvoid CPDF_StreamContentParser::AddContainer(CPDF_Object* pObject)\n{\n    if (m_ObjectSize) {\n        m_pObjectState[m_ObjectSize] = SetToCurObj(pObject);\n    }\n    FXSYS_assert(m_ObjectSize < _FPDF_MAX_OBJECT_STACK_SIZE_);\n    m_pObjectStack[m_ObjectSize++] = pObject;\n}\nFX_BOOL CPDF_StreamContentParser::SetToCurObj(CPDF_Object* pObject)\n{\n    if (m_ObjectSize == 0) {\n        AddObjectParam(pObject);\n        return TRUE;\n    }\n    FX_BOOL bInArrayOrDict = TRUE;\n    CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];\n    if (pCurObj->GetType() == PDFOBJ_ARRAY) {\n        ((CPDF_Array*)pCurObj)->Add(pObject, m_pDocument);\n    } else {\n        if (!m_bDictName && m_pDictName[0]) {\n            ((CPDF_Dictionary*)pCurObj)->SetAt((FX_LPCSTR)m_pDictName, pObject, m_pDocument);\n        } else {\n            bInArrayOrDict = FALSE;\n        }\n        m_bDictName = TRUE;\n    }\n    return bInArrayOrDict;\n}\nvoid CPDF_StreamContentParser::StartArray()\n{\n    if (m_ObjectSize)\n        if (m_pObjectStack[0]->GetType() != PDFOBJ_DICTIONARY && m_pObjectStack[m_ObjectSize - 1]->GetType() == PDFOBJ_ARRAY) {\n            return;\n        }\n    CPDF_Array* pArray = FX_NEW CPDF_Array;\n    AddContainer(pArray);\n}\nvoid CPDF_StreamContentParser::EndArray()\n{\n    if (m_ObjectSize == 0) {\n        return;\n    }\n    CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];\n    if (pCurObj->GetType() != PDFOBJ_ARRAY) {\n        return;\n    }\n    m_ObjectSize --;\n    if (m_ObjectSize == 0) {\n        AddObjectParam(pCurObj);\n    } else {\n        if (!m_pObjectState[m_ObjectSize]) {\n            pCurObj->Release();\n        }\n    }\n    m_pObjectState[m_ObjectSize] = FALSE;\n}\nvoid CPDF_StreamContentParser::StartDict()\n{\n    CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;\n    AddContainer(pDict);\n    m_bDictName = TRUE;\n}\nvoid CPDF_StreamContentParser::EndDict()\n{\n    if (m_ObjectSize == 0) {\n        return;\n    }\n    CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];\n    if (pCurObj->GetType() != PDFOBJ_DICTIONARY) {\n        return;\n    }\n    m_ObjectSize --;\n    if (m_ObjectSize == 0) {\n        AddObjectParam(pCurObj);\n    } else {\n        if (!m_pObjectState[m_ObjectSize]) {\n            pCurObj->Release();\n        }\n    }\n    m_pObjectState[m_ObjectSize] = FALSE;\n}\nvoid CPDF_StreamContentParser::EndName()\n{\n    if (m_ObjectSize == 0) {\n        AddNameParam((FX_LPCSTR)m_pWordBuf, m_WordSize);\n        return;\n    }\n    CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];\n    if (pCurObj->GetType() == PDFOBJ_ARRAY) {\n        ((CPDF_Array*)pCurObj)->AddName(CFX_ByteString(m_pWordBuf, m_WordSize));\n    } else {\n        if (m_bDictName) {\n            FXSYS_memcpy32(m_pDictName, m_pWordBuf, m_WordSize);\n            m_pDictName[m_WordSize] = 0;\n        } else {\n            if (m_pDictName[0] != 0) {\n                ((CPDF_Dictionary*)pCurObj)->SetAtName((FX_LPCSTR)m_pDictName, CFX_ByteString(m_pWordBuf, m_WordSize));\n            }\n        }\n        m_bDictName = !m_bDictName;\n    }\n}\nvoid CPDF_StreamContentParser::EndNumber()\n{\n    if (m_ObjectSize == 0) {\n        AddNumberParam((FX_LPCSTR)m_pWordBuf, m_WordSize);\n        return;\n    }\n    CPDF_Number *pObj = FX_NEW CPDF_Number(CFX_ByteStringC(m_pWordBuf, m_WordSize));\n    if (!SetToCurObj(pObj)) {\n        pObj->Release();\n    }\n}\nextern CFX_ByteString _FPDF_ByteStringFromHex(CFX_BinaryBuf& src_buf);\nvoid CPDF_StreamContentParser::EndHexString()\n{\n    CPDF_String *pObj = FX_NEW CPDF_String(_FPDF_ByteStringFromHex(m_StringBuf), TRUE);\n    if (!SetToCurObj(pObj)) {\n        pObj->Release();\n    }\n}\nvoid CPDF_StreamContentParser::EndString()\n{\n    CPDF_String *pObj = FX_NEW CPDF_String(m_StringBuf.GetByteString());\n    if (!SetToCurObj(pObj)) {\n        pObj->Release();\n    }\n}\nvoid CPDF_StreamContentParser::Handle_BeginImage(void)\n{\n    m_WordState = 9;\n    m_InlineImageState = 0;\n    m_StringBuf.Clear();\n}\nvoid _PDF_ReplaceAbbr(CPDF_Object* pObj);\nvoid CPDF_StreamContentParser::EndImageDict()\n{\n    if (m_StringBuf.GetSize() != m_LastImageDict.GetSize() ||\n            FXSYS_memcmp32(m_StringBuf.GetBuffer(), m_LastImageDict.GetBuffer(), m_StringBuf.GetSize())) {\n        m_WordState = 0;\n        StartDict();\n        InputData(m_StringBuf.GetBuffer(), m_StringBuf.GetSize());\n        Finish();\n        m_bSameLastDict = FALSE;\n        if (m_pLastImageDict && m_bReleaseLastDict) {\n            m_pLastImageDict->Release();\n            m_pLastImageDict = NULL;\n        }\n        if (!m_ObjectSize) {\n            m_InlineImageState = 0;\n            return;\n        }\n        m_pLastImageDict = (CPDF_Dictionary*)m_pObjectStack[--m_ObjectSize];\n        m_bReleaseLastDict = !m_pObjectState[m_ObjectSize];\n        m_pObjectState[m_ObjectSize] = FALSE;\n        _PDF_ReplaceAbbr(m_pLastImageDict);\n        m_LastImageDict.TakeOver(m_StringBuf);\n        if (m_pLastImageDict->KeyExist(FX_BSTRC(\"ColorSpace\"))) {\n            CPDF_Object* pCSObj = m_pLastImageDict->GetElementValue(FX_BSTRC(\"ColorSpace\"));\n            if (pCSObj->GetType() == PDFOBJ_NAME) {\n                CFX_ByteString name = pCSObj->GetString();\n                if (name != FX_BSTRC(\"DeviceRGB\") && name != FX_BSTRC(\"DeviceGray\") && name != FX_BSTRC(\"DeviceCMYK\")) {\n                    pCSObj = FindResourceObj(FX_BSTRC(\"ColorSpace\"), name);\n                    if (pCSObj) {\n                        if (!pCSObj->GetObjNum()) {\n                            pCSObj = pCSObj->Clone();\n                        }\n                        m_pLastImageDict->SetAt(FX_BSTRC(\"ColorSpace\"), pCSObj, m_pDocument);\n                    }\n                }\n            }\n        }\n    } else {\n        m_bSameLastDict = TRUE;\n    }\n    m_ImageSrcBuf.Clear();\n    if (m_pLastCloneImageDict)\n        m_pLastCloneImageDict->Release();\n\n    m_pLastCloneImageDict = (CPDF_Dictionary*)m_pLastImageDict->Clone();\n    if (m_pLastCloneImageDict->KeyExist(FX_BSTRC(\"Filter\"))) {\n        m_WordState = 10;\n        m_InlineImageState = 0;\n    } else {\n        int width = m_pLastCloneImageDict->GetInteger(FX_BSTRC(\"Width\"));\n        int height = m_pLastCloneImageDict->GetInteger(FX_BSTRC(\"Height\"));\n        int OrigSize = 0;\n        CPDF_Object* pCSObj = m_pLastCloneImageDict->GetElementValue(FX_BSTRC(\"ColorSpace\"));\n        if (pCSObj != NULL) {\n            int bpc = m_pLastCloneImageDict->GetInteger(FX_BSTRC(\"BitsPerComponent\"));\n            int nComponents = 1;\n            CPDF_ColorSpace* pCS = m_pDocument->LoadColorSpace(pCSObj);\n            if (pCS == NULL) {\n                nComponents = 3;\n            } else {\n                nComponents = pCS->CountComponents();\n                m_pDocument->GetPageData()->ReleaseColorSpace(pCSObj);\n            }\n            int pitch = (width * bpc * nComponents + 7) / 8;\n            OrigSize = pitch * height;\n        } else {\n            OrigSize = ((width + 7) / 8) * height;\n        }\n        m_ImageSrcBuf.AppendBlock(NULL, OrigSize);\n        m_WordState = 11;\n        m_InlineImageState = 0;\n    }\n}\nvoid CPDF_StreamContentParser::EndInlineImage()\n{\n    CFX_AffineMatrix ImageMatrix;\n    ImageMatrix.Copy(m_pCurStates->m_CTM);\n    ImageMatrix.Concat(m_mtContentToUser);\n    m_LastImageData.CopyData(m_ImageSrcBuf.GetBuffer(), m_ImageSrcBuf.GetSize());\n    CPDF_Stream* pStream = CPDF_Stream::Create(m_ImageSrcBuf.GetBuffer(), m_ImageSrcBuf.GetSize(),\n                           m_pLastCloneImageDict);\n    m_ImageSrcBuf.DetachBuffer();\n    m_pLastCloneImageDict = NULL;\n    CPDF_InlineImages* pImages = FX_NEW CPDF_InlineImages;\n    pImages->m_pStream = pStream;\n    SetGraphicStates(pImages, !m_pLastCloneImageDict->KeyExist(FX_BSTRC(\"ColorSpace\")), FALSE, FALSE);\n    pImages->AddMatrix(ImageMatrix);\n    m_pObjectList->m_ObjectList.AddTail(pImages);\n    m_WordState = 0;\n}\n#define FXDWORD_TRUE FXDWORD_FROM_LSBFIRST(0x65757274)\n#define FXDWORD_NULL FXDWORD_FROM_LSBFIRST(0x6c6c756e)\n#define FXDWORD_FALS FXDWORD_FROM_LSBFIRST(0x736c6166)\nvoid CPDF_StreamContentParser::EndKeyword()\n{\n    CPDF_Object *pObj = NULL;\n    if (m_WordSize == 4) {\n        if (*(FX_DWORD*)m_pWordBuf == FXDWORD_TRUE) {\n            pObj = CPDF_Boolean::Create(TRUE);\n            if (!SetToCurObj(pObj)) {\n                pObj->Release();\n            }\n            return;\n        } else if (*(FX_DWORD*)m_pWordBuf == FXDWORD_NULL) {\n            pObj = CPDF_Null::Create();\n            if (!SetToCurObj(pObj)) {\n                pObj->Release();\n            }\n            return;\n        }\n    } else if (m_WordSize == 5) {\n        if (*(FX_DWORD*)m_pWordBuf == FXDWORD_FALS && m_pWordBuf[4] == 'e') {\n            pObj = CPDF_Boolean::Create(FALSE);\n            if (!SetToCurObj(pObj)) {\n                pObj->Release();\n            }\n            return;\n        }\n    }\n    m_pWordBuf[m_WordSize] = 0;\n    OnOperator((char*)m_pWordBuf);\n    ClearAllParams();\n}\n#define PAGEPARSE_STAGE_PARSE\t\t\t2\n#define PAGEPARSE_STAGE_CHECKCLIP\t\t3\nCPDF_ContentParser::CPDF_ContentParser()\n{\n    m_pParser = NULL;\n    m_Status = Ready;\n    m_pStreamFilter = NULL;\n    m_pType3Char = NULL;\n}\nCPDF_ContentParser::~CPDF_ContentParser()\n{\n    Clear();\n}\nvoid CPDF_ContentParser::Clear()\n{\n    if (m_pParser) {\n        delete m_pParser;\n    }\n    if (m_pStreamFilter) {\n        delete m_pStreamFilter;\n    }\n    m_pParser = NULL;\n    m_Status = Ready;\n}\nvoid CPDF_ContentParser::Start(CPDF_Page* pPage, CPDF_ParseOptions* pOptions)\n{\n    if (m_Status != Ready || pPage == NULL || pPage->m_pDocument == NULL || pPage->m_pFormDict == NULL) {\n        m_Status = Done;\n        return;\n    }\n    m_pObjects = pPage;\n    m_bForm = FALSE;\n    if (pOptions) {\n        m_Options = *pOptions;\n    }\n    CPDF_Object* pContent = pPage->m_pFormDict->GetElementValue(FX_BSTRC(\"Contents\"));\n    if (pContent == NULL) {\n        m_Status = Done;\n        return;\n    }\n    if (pContent->GetType() == PDFOBJ_STREAM) {\n        m_nStreams = 1;\n    } else if (pContent->GetType() == PDFOBJ_ARRAY) {\n        m_nStreams = ((CPDF_Array*)pContent)->GetCount();\n    } else {\n        m_Status = Done;\n        return;\n    }\n    m_Status = ToBeContinued;\n    m_InternalStage = PAGEPARSE_STAGE_PARSE;\n    m_CurrentOffset = 0;\n    m_pParser = FX_NEW CPDF_StreamContentParser;\n    m_pParser->Initialize();\n    m_pParser->PrepareParse(pPage->m_pDocument, pPage->m_pResources, NULL, NULL, pPage,\n                            pPage->m_pResources, &pPage->m_BBox, &m_Options, NULL, 0);\n    m_pParser->m_pCurStates->m_ColorState.GetModify()->Default();\n}\nvoid CPDF_ContentParser::Start(CPDF_Form* pForm, CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,\n                               CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level)\n{\n    m_pType3Char = pType3Char;\n    m_pObjects = pForm;\n    m_bForm = TRUE;\n    CFX_AffineMatrix form_matrix = pForm->m_pFormDict->GetMatrix(FX_BSTRC(\"Matrix\"));\n    if (pGraphicStates) {\n        form_matrix.Concat(pGraphicStates->m_CTM);\n    }\n    CPDF_Array* pBBox = pForm->m_pFormDict->GetArray(FX_BSTRC(\"BBox\"));\n    CFX_FloatRect form_bbox;\n    CPDF_Path ClipPath;\n    if (pBBox) {\n        form_bbox = pBBox->GetRect();\n        ClipPath.New();\n        ClipPath.AppendRect(form_bbox.left, form_bbox.bottom, form_bbox.right, form_bbox.top);\n        ClipPath.Transform(&form_matrix);\n        if (pParentMatrix) {\n            ClipPath.Transform(pParentMatrix);\n        }\n        form_bbox.Transform(&form_matrix);\n    }\n    CPDF_Dictionary* pResources = pForm->m_pFormDict->GetDict(FX_BSTRC(\"Resources\"));\n    m_pParser = FX_NEW CPDF_StreamContentParser;\n    m_pParser->Initialize();\n    m_pParser->PrepareParse(pForm->m_pDocument, pForm->m_pPageResources, pForm->m_pResources, pParentMatrix, pForm,\n                            pResources, &form_bbox, pOptions, pGraphicStates, level);\n    m_pParser->m_pCurStates->m_CTM = form_matrix;\n    if (ClipPath.NotNull()) {\n        m_pParser->m_pCurStates->m_ClipPath.AppendPath(ClipPath, FXFILL_WINDING, TRUE);\n    }\n    if (pForm->m_Transparency & PDFTRANS_GROUP) {\n        CPDF_GeneralStateData* pData = m_pParser->m_pCurStates->m_GeneralState.GetModify();\n        pData->m_BlendType = FXDIB_BLEND_NORMAL;\n        pData->m_StrokeAlpha = 1.0f;\n        pData->m_FillAlpha = 1.0f;\n        pData->m_pSoftMask = NULL;\n    }\n    m_pStreamFilter = pForm->m_pFormStream->GetStreamFilter();\n    m_nStreams = 1;\n    m_Status = ToBeContinued;\n    m_InternalStage = PAGEPARSE_STAGE_PARSE;\n    m_CurrentOffset = 0;\n}\nvoid CPDF_ContentParser::Continue(IFX_Pause* pPause)\n{\n    while (m_Status == ToBeContinued) {\n        if (m_InternalStage == PAGEPARSE_STAGE_PARSE) {\n            if (m_pStreamFilter == NULL) {\n                if (m_CurrentOffset == m_nStreams) {\n                    m_InternalStage = PAGEPARSE_STAGE_CHECKCLIP;\n                    if (m_pType3Char) {\n                        m_pType3Char->m_bColored = m_pParser->m_bColored;\n                        m_pType3Char->m_Width = FXSYS_round(m_pParser->m_Type3Data[0] * 1000);\n                        m_pType3Char->m_BBox.left = FXSYS_round(m_pParser->m_Type3Data[2] * 1000);\n                        m_pType3Char->m_BBox.bottom = FXSYS_round(m_pParser->m_Type3Data[3] * 1000);\n                        m_pType3Char->m_BBox.right = FXSYS_round(m_pParser->m_Type3Data[4] * 1000);\n                        m_pType3Char->m_BBox.top = FXSYS_round(m_pParser->m_Type3Data[5] * 1000);\n                        m_pType3Char->m_bPageRequired = m_pParser->m_bResourceMissing;\n                    }\n                    delete m_pParser;\n                    m_pParser = NULL;\n                    continue;\n                }\n                CPDF_Object* pContent = m_pObjects->m_pFormDict->GetElementValue(FX_BSTRC(\"Contents\"));\n                if (pContent->GetType() == PDFOBJ_STREAM) {\n                    m_pStreamFilter = ((CPDF_Stream*)pContent)->GetStreamFilter();\n                } else {\n                    CPDF_Stream* pStream = ((CPDF_Array*)pContent)->GetStream(m_CurrentOffset);\n                    if (pStream == NULL) {\n                        m_CurrentOffset ++;\n                        continue;\n                    }\n                    m_pStreamFilter = pStream->GetStreamFilter();\n                }\n            }\n            FX_DWORD len = m_pStreamFilter->ReadBlock(m_pParser->m_pStreamBuf, STREAM_PARSE_BUFSIZE);\n            m_pParser->InputData(m_pParser->m_pStreamBuf, len);\n            if (m_pParser->m_bAbort) {\n                delete m_pStreamFilter;\n                m_pStreamFilter = NULL;\n                m_Status = Done;\n                delete m_pParser;\n                m_pParser = NULL;\n                return;\n            }\n            if (len < STREAM_PARSE_BUFSIZE) {\n                m_pParser->Finish();\n                m_CurrentOffset ++;\n                delete m_pStreamFilter;\n                m_pStreamFilter = NULL;\n            }\n            if (pPause && pPause->NeedToPauseNow()) {\n                return;\n            }\n        }\n        if (m_InternalStage == PAGEPARSE_STAGE_CHECKCLIP) {\n            FX_POSITION pos = m_pObjects->m_ObjectList.GetHeadPosition();\n            while (pos) {\n                CPDF_PageObject* pObj = (CPDF_PageObject*)m_pObjects->m_ObjectList.GetNext(pos);\n                if (pObj == NULL) {\n                    continue;\n                }\n                if (pObj->m_ClipPath.IsNull()) {\n                    continue;\n                }\n                if (pObj->m_ClipPath.GetPathCount() != 1) {\n                    continue;\n                }\n                if (pObj->m_ClipPath.GetTextCount()) {\n                    continue;\n                }\n                CPDF_Path ClipPath = pObj->m_ClipPath.GetPath(0);\n                if (!ClipPath.IsRect() || pObj->m_Type == PDFPAGE_SHADING) {\n                    continue;\n                }\n                CFX_FloatRect old_rect(ClipPath.GetPointX(0), ClipPath.GetPointY(0),\n                                       ClipPath.GetPointX(2), ClipPath.GetPointY(2));\n                CFX_FloatRect obj_rect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);\n                if (old_rect.Contains(obj_rect)) {\n                    pObj->m_ClipPath.SetNull();\n                }\n            }\n            if (m_pObjects->m_ObjectList.GetCount() == 1) {\n                CPDF_PageObject* pObj = (CPDF_PageObject*)m_pObjects->m_ObjectList.GetAt(m_pObjects->m_ObjectList.GetHeadPosition());\n                if (pObj && pObj->m_Type == PDFPAGE_TEXT) {\n                    CPDF_TextObject* pText = (CPDF_TextObject*)pObj;\n                }\n            }\n            m_Status = Done;\n            return;\n        }\n    }\n}\nint CPDF_ContentParser::EstimateProgress()\n{\n    if (m_Status == Ready) {\n        return 0;\n    }\n    if (m_Status == Done) {\n        return 100;\n    }\n    if (m_InternalStage == PAGEPARSE_STAGE_CHECKCLIP) {\n        return 90;\n    }\n    if (m_pStreamFilter == NULL) {\n        return 90 * m_CurrentOffset / m_nStreams;\n    }\n    int total_raw_size = m_pStreamFilter->GetStream()->GetRawSize() * m_nStreams;\n    int parsed_raw_size = m_pStreamFilter->GetStream()->GetRawSize() * m_CurrentOffset +\n                          m_pStreamFilter->GetSrcPos();\n    return 90 * parsed_raw_size / total_raw_size;\n}\nCPDF_InlineImages::CPDF_InlineImages()\n{\n    m_Type = PDFPAGE_INLINES;\n    m_pStream = NULL;\n    m_pBitmap = NULL;\n}\nCPDF_InlineImages::~CPDF_InlineImages()\n{\n    if (m_pStream) {\n        m_pStream->Release();\n    }\n    if (m_pBitmap) {\n        delete m_pBitmap;\n    }\n}\nvoid CPDF_InlineImages::AddMatrix(CFX_AffineMatrix& matrix)\n{\n    m_Matrices.Add(matrix);\n    CFX_FloatRect rect = matrix.GetUnitRect();\n    if (m_Matrices.GetSize() > 1) {\n        CFX_FloatRect rect1(m_Left, m_Bottom, m_Right, m_Top);\n        rect.Union(rect1);\n    }\n    m_Left = rect.left;\n    m_Right = rect.right;\n    m_Top = rect.top;\n    m_Bottom = rect.bottom;\n}\n#endif\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_page.h\"\n#include \"../../../include/fpdfapi/fpdf_module.h\"\n#include \"../../../include/fxcodec/fx_codec.h\"\n#include \"pageint.h\"\n#include <limits.h>\nextern const FX_LPCSTR _PDF_OpCharType =\n    \"IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII\"\n    \"IIVIIIIVIIVIIIIIVVIIIIIIIIIIIIII\"\n    \"IIVVVVVVIVVVVVVIVVVVVIIVVIIIIIII\"\n    \"IIVVVVVVVVVVVVVVIVVVIIVVIVVIIIII\"\n    \"IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII\"\n    \"IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII\"\n    \"IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII\"\n    \"IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII\";\nFX_BOOL _PDF_HasInvalidOpChar(FX_LPCSTR op)\n{\n    if(!op) {\n        return FALSE;\n    }\n    FX_BYTE ch;\n    while((ch = *op++)) {\n        if(_PDF_OpCharType[ch] == 'I') {\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nFX_DWORD CPDF_StreamContentParser::Parse(FX_LPCBYTE pData, FX_DWORD dwSize, FX_DWORD max_cost)\n{\n    if (m_Level > _FPDF_MAX_FORM_LEVEL_) {\n        return dwSize;\n    }\n    FX_DWORD InitObjCount = m_pObjectList->CountObjects();\n    CPDF_StreamParser syntax(pData, dwSize);\n    m_pSyntax = &syntax;\n    m_CompatCount = 0;\n    while (1) {\n        FX_DWORD cost = m_pObjectList->CountObjects() - InitObjCount;\n        if (max_cost && cost >= max_cost) {\n            break;\n        }\n        switch (syntax.ParseNextElement()) {\n            case CPDF_StreamParser::EndOfData:\n                return m_pSyntax->GetPos();\n            case CPDF_StreamParser::Keyword:\n                if(!OnOperator((char*)syntax.GetWordBuf()) && _PDF_HasInvalidOpChar((char*)syntax.GetWordBuf())) {\n                    m_bAbort = TRUE;\n                }\n                if (m_bAbort) {\n                    return m_pSyntax->GetPos();\n                }\n                ClearAllParams();\n                break;\n            case CPDF_StreamParser::Number:\n                AddNumberParam((char*)syntax.GetWordBuf(), syntax.GetWordSize());\n                break;\n            case CPDF_StreamParser::Name:\n                AddNameParam((FX_LPCSTR)syntax.GetWordBuf() + 1, syntax.GetWordSize() - 1);\n                break;\n            default:\n                AddObjectParam(syntax.GetObject());\n        }\n    }\n    return m_pSyntax->GetPos();\n}\nvoid _PDF_ReplaceAbbr(CPDF_Object* pObj);\nvoid CPDF_StreamContentParser::Handle_BeginImage()\n{\n    FX_FILESIZE savePos = m_pSyntax->GetPos();\n    CPDF_Dictionary* pDict = CPDF_Dictionary::Create();\n    while (1) {\n        CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement();\n        if (type == CPDF_StreamParser::Keyword) {\n            CFX_ByteString bsKeyword(m_pSyntax->GetWordBuf(), m_pSyntax->GetWordSize());\n            if (bsKeyword != FX_BSTRC(\"ID\")) {\n                m_pSyntax->SetPos(savePos);\n                pDict->Release();\n                return;\n            }\n        }\n        if (type != CPDF_StreamParser::Name) {\n            break;\n        }\n        CFX_ByteString key((FX_LPCSTR)m_pSyntax->GetWordBuf() + 1, m_pSyntax->GetWordSize() - 1);\n        CPDF_Object* pObj = m_pSyntax->ReadNextObject();\n        if (!key.IsEmpty()) {\n            pDict->SetAt(key, pObj, m_pDocument);\n        } else if (pObj) {\n            pObj->Release();\n        }\n    }\n    _PDF_ReplaceAbbr(pDict);\n    CPDF_Object* pCSObj = NULL;\n    if (pDict->KeyExist(FX_BSTRC(\"ColorSpace\"))) {\n        pCSObj = pDict->GetElementValue(FX_BSTRC(\"ColorSpace\"));\n        if (pCSObj->GetType() == PDFOBJ_NAME) {\n            CFX_ByteString name = pCSObj->GetString();\n            if (name != FX_BSTRC(\"DeviceRGB\") && name != FX_BSTRC(\"DeviceGray\") && name != FX_BSTRC(\"DeviceCMYK\")) {\n                pCSObj = FindResourceObj(FX_BSTRC(\"ColorSpace\"), name);\n                if (pCSObj && !pCSObj->GetObjNum()) {\n                    pCSObj = pCSObj->Clone();\n                    pDict->SetAt(FX_BSTRC(\"ColorSpace\"), pCSObj, m_pDocument);\n                }\n            }\n        }\n    }\n    CPDF_Stream* pStream = m_pSyntax->ReadInlineStream(m_pDocument, pDict, pCSObj, m_Options.m_bDecodeInlineImage);\n    while (1) {\n        CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement();\n        if (type == CPDF_StreamParser::EndOfData) {\n            break;\n        }\n        if (type != CPDF_StreamParser::Keyword) {\n            continue;\n        }\n        if (m_pSyntax->GetWordSize() == 2 && m_pSyntax->GetWordBuf()[0] == 'E' &&\n                m_pSyntax->GetWordBuf()[1] == 'I') {\n            break;\n        }\n    }\n    if (m_Options.m_bTextOnly) {\n        if (pStream) {\n            pStream->Release();\n        } else {\n            pDict->Release();\n        }\n        return;\n    }\n    pDict->SetAtName(FX_BSTRC(\"Subtype\"), FX_BSTRC(\"Image\"));\n    CPDF_ImageObject *pImgObj = AddImage(pStream, NULL, TRUE);\n    if (!pImgObj) {\n        if (pStream) {\n            pStream->Release();\n        } else {\n            pDict->Release();\n        }\n    }\n}\nvoid CPDF_StreamContentParser::ParsePathObject()\n{\n    FX_FLOAT params[6] = {0};\n    int nParams = 0;\n    int last_pos = m_pSyntax->GetPos();\n    while (1) {\n        CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement();\n        FX_BOOL bProcessed = TRUE;\n        switch (type) {\n            case CPDF_StreamParser::EndOfData:\n                return;\n            case CPDF_StreamParser::Keyword: {\n                    int len = m_pSyntax->GetWordSize();\n                    if (len == 1) {\n                        switch (m_pSyntax->GetWordBuf()[0]) {\n                            case 'm':\n                                AddPathPoint(params[0], params[1], FXPT_MOVETO);\n                                nParams = 0;\n                                break;\n                            case 'l':\n                                AddPathPoint(params[0], params[1], FXPT_LINETO);\n                                nParams = 0;\n                                break;\n                            case 'c':\n                                AddPathPoint(params[0], params[1], FXPT_BEZIERTO);\n                                AddPathPoint(params[2], params[3], FXPT_BEZIERTO);\n                                AddPathPoint(params[4], params[5], FXPT_BEZIERTO);\n                                nParams = 0;\n                                break;\n                            case 'v':\n                                AddPathPoint(m_PathCurrentX, m_PathCurrentY, FXPT_BEZIERTO);\n                                AddPathPoint(params[0], params[1], FXPT_BEZIERTO);\n                                AddPathPoint(params[2], params[3], FXPT_BEZIERTO);\n                                nParams = 0;\n                                break;\n                            case 'y':\n                                AddPathPoint(params[0], params[1], FXPT_BEZIERTO);\n                                AddPathPoint(params[2], params[3], FXPT_BEZIERTO);\n                                AddPathPoint(params[2], params[3], FXPT_BEZIERTO);\n                                nParams = 0;\n                                break;\n                            case 'h':\n                                Handle_ClosePath();\n                                nParams = 0;\n                                break;\n                            default:\n                                bProcessed = FALSE;\n                                break;\n                        }\n                    } else if (len == 2) {\n                        if (m_pSyntax->GetWordBuf()[0] == 'r' && m_pSyntax->GetWordBuf()[1] == 'e') {\n                            AddPathRect(params[0], params[1], params[2], params[3]);\n                            nParams = 0;\n                        } else {\n                            bProcessed = FALSE;\n                        }\n                    } else {\n                        bProcessed = FALSE;\n                    }\n                    if (bProcessed) {\n                        last_pos = m_pSyntax->GetPos();\n                    }\n                    break;\n                }\n            case CPDF_StreamParser::Number: {\n                    if (nParams == 6) {\n                        break;\n                    }\n                    FX_BOOL bInteger;\n                    int value;\n                    FX_atonum(CFX_ByteStringC(m_pSyntax->GetWordBuf(), m_pSyntax->GetWordSize()), bInteger, &value);\n                    params[nParams++] = bInteger ? (FX_FLOAT)value : *(FX_FLOAT*)&value;\n                    break;\n                }\n            default:\n                bProcessed = FALSE;\n        }\n        if (!bProcessed) {\n            m_pSyntax->SetPos(last_pos);\n            return;\n        }\n    }\n}\nCPDF_StreamParser::CPDF_StreamParser(const FX_BYTE* pData, FX_DWORD dwSize)\n{\n    m_pBuf = pData;\n    m_Size = dwSize;\n    m_Pos = 0;\n    m_pLastObj = NULL;\n}\nCPDF_StreamParser::~CPDF_StreamParser()\n{\n    if (m_pLastObj) {\n        m_pLastObj->Release();\n    }\n}\nFX_DWORD _DecodeAllScanlines(ICodec_ScanlineDecoder* pDecoder, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)\n{\n    if (pDecoder == NULL) {\n        return (FX_DWORD) - 1;\n    }\n    int ncomps = pDecoder->CountComps();\n    int bpc = pDecoder->GetBPC();\n    int width = pDecoder->GetWidth();\n    int height = pDecoder->GetHeight();\n    int pitch = (width * ncomps * bpc + 7) / 8;\n    if (height == 0 || pitch > (1 << 30) / height) {\n        delete pDecoder;\n        return -1;\n    }\n    dest_size = pitch * height;\n    dest_buf = FX_Alloc( FX_BYTE, dest_size);\n    for (int row = 0; row < height; row ++) {\n        FX_LPBYTE pLine = pDecoder->GetScanline(row);\n        if (pLine == NULL) {\n            break;\n        }\n        FXSYS_memcpy32(dest_buf + row * pitch, pLine, pitch);\n    }\n    FX_DWORD srcoff = pDecoder->GetSrcOffset();\n    delete pDecoder;\n    return srcoff;\n}\nICodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,\n        const CPDF_Dictionary* pParams);\nFX_DWORD _A85Decode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);\nFX_DWORD _HexDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);\nFX_DWORD FPDFAPI_FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, CPDF_Dictionary* pParams,\n                                  FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);\nFX_DWORD PDF_DecodeInlineStream(const FX_BYTE* src_buf, FX_DWORD limit,\n                                int width, int height, CFX_ByteString& decoder,\n                                CPDF_Dictionary* pParam, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)\n{\n    if (decoder == FX_BSTRC(\"CCITTFaxDecode\") || decoder == FX_BSTRC(\"CCF\")) {\n        ICodec_ScanlineDecoder* pDecoder = FPDFAPI_CreateFaxDecoder(src_buf, limit, width, height, pParam);\n        return _DecodeAllScanlines(pDecoder, dest_buf, dest_size);\n    } else if (decoder == FX_BSTRC(\"ASCII85Decode\") || decoder == FX_BSTRC(\"A85\")) {\n        return _A85Decode(src_buf, limit, dest_buf, dest_size);\n    } else if (decoder == FX_BSTRC(\"ASCIIHexDecode\") || decoder == FX_BSTRC(\"AHx\")) {\n        return _HexDecode(src_buf, limit, dest_buf, dest_size);\n    } else if (decoder == FX_BSTRC(\"FlateDecode\") || decoder == FX_BSTRC(\"Fl\")) {\n        return FPDFAPI_FlateOrLZWDecode(FALSE, src_buf, limit, pParam, dest_size, dest_buf, dest_size);\n    } else if (decoder == FX_BSTRC(\"LZWDecode\") || decoder == FX_BSTRC(\"LZW\")) {\n        return FPDFAPI_FlateOrLZWDecode(TRUE, src_buf, limit, pParam, 0, dest_buf, dest_size);\n    } else if (decoder == FX_BSTRC(\"DCTDecode\") || decoder == FX_BSTRC(\"DCT\")) {\n        ICodec_ScanlineDecoder* pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder(\n                                               src_buf, limit, width, height, 0, pParam ? pParam->GetInteger(FX_BSTRC(\"ColorTransform\"), 1) : 1);\n        return _DecodeAllScanlines(pDecoder, dest_buf, dest_size);\n    } else if (decoder == FX_BSTRC(\"RunLengthDecode\") || decoder == FX_BSTRC(\"RL\")) {\n        return RunLengthDecode(src_buf, limit, dest_buf, dest_size);\n    }\n    dest_size = 0;\n    dest_buf = 0;\n    return (FX_DWORD) - 1;\n}\nextern const FX_LPCSTR _PDF_CharType;\nCPDF_Stream* CPDF_StreamParser::ReadInlineStream(CPDF_Document* pDoc, CPDF_Dictionary* pDict, CPDF_Object* pCSObj, FX_BOOL bDecode)\n{\n    if (m_Pos == m_Size) {\n        return NULL;\n    }\n    if (_PDF_CharType[m_pBuf[m_Pos]] == 'W') {\n        m_Pos ++;\n    }\n    CFX_ByteString Decoder;\n    CPDF_Dictionary* pParam = NULL;\n    CPDF_Object* pFilter = pDict->GetElementValue(FX_BSTRC(\"Filter\"));\n    if (pFilter == NULL) {\n    } else if (pFilter->GetType() == PDFOBJ_ARRAY) {\n        Decoder = ((CPDF_Array*)pFilter)->GetString(0);\n        CPDF_Array* pParams = pDict->GetArray(FX_BSTRC(\"DecodeParms\"));\n        if (pParams) {\n            pParam = pParams->GetDict(0);\n        }\n    } else {\n        Decoder = pFilter->GetString();\n        pParam = pDict->GetDict(FX_BSTRC(\"DecodeParms\"));\n    }\n    FX_DWORD width = pDict->GetInteger(FX_BSTRC(\"Width\"));\n    FX_DWORD height = pDict->GetInteger(FX_BSTRC(\"Height\"));\n    FX_DWORD OrigSize = 0;\n    if (pCSObj != NULL) {\n        FX_DWORD bpc = pDict->GetInteger(FX_BSTRC(\"BitsPerComponent\"));\n        FX_DWORD nComponents = 1;\n        CPDF_ColorSpace* pCS = pDoc->LoadColorSpace(pCSObj);\n        if (pCS == NULL) {\n            nComponents = 3;\n        } else {\n            nComponents = pCS->CountComponents();\n            pDoc->GetPageData()->ReleaseColorSpace(pCSObj);\n        }\n        FX_DWORD pitch = width;\n        if (bpc && pitch > INT_MAX / bpc) {\n            return NULL;\n        }\n        pitch *= bpc;\n        if (nComponents && pitch > INT_MAX / nComponents) {\n            return NULL;\n        }\n        pitch *= nComponents;\n        if (pitch > INT_MAX - 7) {\n            return NULL;\n        }\n        pitch += 7;\n        pitch /= 8;\n        OrigSize = pitch;\n    } else {\n        if (width > INT_MAX - 7) {\n            return NULL;\n        }\n        OrigSize = ((width + 7) / 8);\n    }\n    if (height && OrigSize > INT_MAX / height) {\n        return NULL;\n    }\n    OrigSize *= height;\n    FX_LPBYTE pData = NULL;\n    FX_DWORD dwStreamSize;\n    if (Decoder.IsEmpty()) {\n        if (OrigSize > m_Size - m_Pos) {\n            OrigSize = m_Size - m_Pos;\n        }\n        pData = FX_Alloc(FX_BYTE, OrigSize);\n        FXSYS_memcpy32(pData, m_pBuf + m_Pos, OrigSize);\n        dwStreamSize = OrigSize;\n        m_Pos += OrigSize;\n    } else {\n        FX_DWORD dwDestSize = OrigSize;\n        dwStreamSize = PDF_DecodeInlineStream(m_pBuf + m_Pos, m_Size - m_Pos, width, height, Decoder, pParam,\n                                              pData, dwDestSize);\n        if ((int)dwStreamSize < 0) {\n            return NULL;\n        }\n        if (bDecode) {\n            m_Pos += dwStreamSize;\n            dwStreamSize = dwDestSize;\n            if (pFilter->GetType() == PDFOBJ_ARRAY) {\n                ((CPDF_Array*)pFilter)->RemoveAt(0);\n                CPDF_Array* pParams = pDict->GetArray(FX_BSTRC(\"DecodeParms\"));\n                if (pParams) {\n                    pParams->RemoveAt(0);\n                }\n            } else {\n                pDict->RemoveAt(FX_BSTRC(\"Filter\"));\n                pDict->RemoveAt(FX_BSTRC(\"DecodeParms\"));\n            }\n        } else {\n            if (pData) {\n                FX_Free(pData);\n            }\n            FX_DWORD dwSavePos = m_Pos;\n            m_Pos += dwStreamSize;\n            while (1) {\n                FX_DWORD dwPrevPos = m_Pos;\n                CPDF_StreamParser::SyntaxType type = ParseNextElement();\n                if (type == CPDF_StreamParser::EndOfData) {\n                    break;\n                }\n                if (type != CPDF_StreamParser::Keyword) {\n                    dwStreamSize += m_Pos - dwPrevPos;\n                    continue;\n                }\n                if (GetWordSize() == 2 && GetWordBuf()[0] == 'E' &&\n                        GetWordBuf()[1] == 'I') {\n                    m_Pos = dwPrevPos;\n                    break;\n                }\n                dwStreamSize += m_Pos - dwPrevPos;\n            }\n            m_Pos = dwSavePos;\n            pData = FX_Alloc(FX_BYTE, dwStreamSize);\n            FXSYS_memcpy32(pData, m_pBuf + m_Pos, dwStreamSize);\n            m_Pos += dwStreamSize;\n        }\n    }\n    pDict->SetAtInteger(FX_BSTRC(\"Length\"), (int)dwStreamSize);\n    return CPDF_Stream::Create(pData, dwStreamSize, pDict);\n}\n#define MAX_WORD_BUFFER 256\n#define MAX_STRING_LENGTH\t32767\n#define FXDWORD_TRUE FXDWORD_FROM_LSBFIRST(0x65757274)\n#define FXDWORD_NULL FXDWORD_FROM_LSBFIRST(0x6c6c756e)\n#define FXDWORD_FALS FXDWORD_FROM_LSBFIRST(0x736c6166)\nCPDF_StreamParser::SyntaxType CPDF_StreamParser::ParseNextElement()\n{\n    if (m_pLastObj) {\n        m_pLastObj->Release();\n        m_pLastObj = NULL;\n    }\n    m_WordSize = 0;\n    FX_BOOL bIsNumber = TRUE;\n    if (m_Pos >= m_Size) {\n        return EndOfData;\n    }\n    int ch = m_pBuf[m_Pos++];\n    int type = _PDF_CharType[ch];\n    while (1) {\n        while (type == 'W') {\n            if (m_Size <= m_Pos) {\n                return EndOfData;\n            }\n            ch = m_pBuf[m_Pos++];\n            type = _PDF_CharType[ch];\n        }\n        if (ch != '%') {\n            break;\n        }\n        while (1) {\n            if (m_Size <= m_Pos) {\n                return EndOfData;\n            }\n            ch = m_pBuf[m_Pos++];\n            if (ch == '\\r' || ch == '\\n') {\n                break;\n            }\n        }\n        type = _PDF_CharType[ch];\n    }\n    if (type == 'D' && ch != '/') {\n        m_Pos --;\n        m_pLastObj = ReadNextObject();\n        return Others;\n    }\n    while (1) {\n        if (m_WordSize < MAX_WORD_BUFFER) {\n            m_WordBuffer[m_WordSize++] = ch;\n        }\n        if (type != 'N') {\n            bIsNumber = FALSE;\n        }\n        if (m_Size <= m_Pos) {\n            break;\n        }\n        ch = m_pBuf[m_Pos++];\n        type = _PDF_CharType[ch];\n        if (type == 'D' || type == 'W') {\n            m_Pos --;\n            break;\n        }\n    }\n    m_WordBuffer[m_WordSize] = 0;\n    if (bIsNumber) {\n        return Number;\n    }\n    if (m_WordBuffer[0] == '/') {\n        return Name;\n    }\n    if (m_WordSize == 4) {\n        if (*(FX_DWORD*)m_WordBuffer == FXDWORD_TRUE) {\n            m_pLastObj = CPDF_Boolean::Create(TRUE);\n            return Others;\n        }\n        if (*(FX_DWORD*)m_WordBuffer == FXDWORD_NULL) {\n            m_pLastObj = CPDF_Null::Create();\n            return Others;\n        }\n    } else if (m_WordSize == 5) {\n        if (*(FX_DWORD*)m_WordBuffer == FXDWORD_FALS && m_WordBuffer[4] == 'e') {\n            m_pLastObj = CPDF_Boolean::Create(FALSE);\n            return Others;\n        }\n    }\n    return Keyword;\n}\nvoid CPDF_StreamParser::SkipPathObject()\n{\n    FX_DWORD command_startpos = m_Pos;\n    if (m_Pos >= m_Size) {\n        return;\n    }\n    int ch = m_pBuf[m_Pos++];\n    int type = _PDF_CharType[ch];\n    while (1) {\n        while (type == 'W') {\n            if (m_Pos >= m_Size) {\n                return;\n            }\n            ch = m_pBuf[m_Pos++];\n            type = _PDF_CharType[ch];\n        }\n        if (type != 'N') {\n            m_Pos = command_startpos;\n            return;\n        }\n        while (1) {\n            while (type != 'W') {\n                if (m_Pos >= m_Size) {\n                    return;\n                }\n                ch = m_pBuf[m_Pos++];\n                type = _PDF_CharType[ch];\n            }\n            while (type == 'W') {\n                if (m_Pos >= m_Size) {\n                    return;\n                }\n                ch = m_pBuf[m_Pos++];\n                type = _PDF_CharType[ch];\n            }\n            if (type == 'N') {\n                continue;\n            }\n            FX_DWORD op_startpos = m_Pos - 1;\n            while (type != 'W' && type != 'D') {\n                if (m_Pos >= m_Size) {\n                    return;\n                }\n                ch = m_pBuf[m_Pos++];\n                type = _PDF_CharType[ch];\n            }\n            if (m_Pos - op_startpos == 2) {\n                int op = m_pBuf[op_startpos];\n                if (op == 'm' || op == 'l' || op == 'c' || op == 'v' || op == 'y') {\n                    command_startpos = m_Pos;\n                    break;\n                }\n            } else if (m_Pos - op_startpos == 3) {\n                if (m_pBuf[op_startpos] == 'r' && m_pBuf[op_startpos + 1] == 'e') {\n                    command_startpos = m_Pos;\n                    break;\n                }\n            }\n            m_Pos = command_startpos;\n            return;\n        }\n    }\n}\nCPDF_Object* CPDF_StreamParser::ReadNextObject(FX_BOOL bAllowNestedArray, FX_BOOL bInArray)\n{\n    FX_BOOL bIsNumber;\n    GetNextWord(bIsNumber);\n    if (m_WordSize == 0) {\n        return NULL;\n    }\n    if (bIsNumber) {\n        m_WordBuffer[m_WordSize] = 0;\n        return CPDF_Number::Create(CFX_ByteStringC(m_WordBuffer, m_WordSize));\n    }\n    int first_char = m_WordBuffer[0];\n    if (first_char == '/') {\n        return CPDF_Name::Create(PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)));\n    }\n    if (first_char == '(') {\n        return CPDF_String::Create(ReadString());\n    }\n    if (first_char == '<') {\n        if (m_WordSize == 1) {\n            return CPDF_String::Create(ReadHexString(), TRUE);\n        }\n        CPDF_Dictionary* pDict = CPDF_Dictionary::Create();\n        while (1) {\n            GetNextWord(bIsNumber);\n            if (m_WordSize == 0) {\n                pDict->Release();\n                return NULL;\n            }\n            if (m_WordSize == 2 && m_WordBuffer[0] == '>') {\n                break;\n            }\n            if (m_WordBuffer[0] != '/') {\n                pDict->Release();\n                return NULL;\n            }\n            CFX_ByteString key = PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1));\n            CPDF_Object* pObj = ReadNextObject(TRUE);\n            if (pObj == NULL) {\n                if (pDict) {\n                    pDict->Release();\n                }\n                return NULL;\n            }\n            if (!key.IsEmpty()) {\n                pDict->SetAt(key, pObj);\n            } else {\n                pObj->Release();\n            }\n        }\n        return pDict;\n    }\n    if (first_char == '[') {\n        if (!bAllowNestedArray && bInArray) {\n            return NULL;\n        }\n        CPDF_Array* pArray = CPDF_Array::Create();\n        while (1) {\n            CPDF_Object* pObj = ReadNextObject(bAllowNestedArray, TRUE);\n            if (pObj == NULL) {\n                if (m_WordSize == 0 || m_WordBuffer[0] == ']') {\n                    return pArray;\n                }\n                if (m_WordBuffer[0] == '[') {\n                    continue;\n                }\n            } else {\n                pArray->Add(pObj);\n            }\n        }\n    }\n    if (m_WordSize == 4) {\n        if (*(FX_DWORD*)m_WordBuffer == FXDWORD_TRUE) {\n            return CPDF_Boolean::Create(TRUE);\n        }\n        if (*(FX_DWORD*)m_WordBuffer == FXDWORD_NULL) {\n            return CPDF_Null::Create();\n        }\n    } else if (m_WordSize == 5) {\n        if (*(FX_DWORD*)m_WordBuffer == FXDWORD_FALS && m_WordBuffer[4] == 'e') {\n            return CPDF_Boolean::Create(FALSE);\n        }\n    }\n    return NULL;\n}\nvoid CPDF_StreamParser::GetNextWord(FX_BOOL& bIsNumber)\n{\n    m_WordSize = 0;\n    bIsNumber = TRUE;\n    if (m_Size <= m_Pos) {\n        return;\n    }\n    int ch = m_pBuf[m_Pos++];\n    int type = _PDF_CharType[ch];\n    while (1) {\n        while (type == 'W') {\n            if (m_Size <= m_Pos) {\n                return;\n            }\n            ch = m_pBuf[m_Pos++];\n            type = _PDF_CharType[ch];\n        }\n        if (ch != '%') {\n            break;\n        }\n        while (1) {\n            if (m_Size <= m_Pos) {\n                return;\n            }\n            ch = m_pBuf[m_Pos++];\n            if (ch == '\\r' || ch == '\\n') {\n                break;\n            }\n        }\n        type = _PDF_CharType[ch];\n    }\n    if (type == 'D') {\n        bIsNumber = FALSE;\n        m_WordBuffer[m_WordSize++] = ch;\n        if (ch == '/') {\n            while (1) {\n                if (m_Size <= m_Pos) {\n                    return;\n                }\n                ch = m_pBuf[m_Pos++];\n                type = _PDF_CharType[ch];\n                if (type != 'R' && type != 'N') {\n                    m_Pos --;\n                    return;\n                }\n                if (m_WordSize < MAX_WORD_BUFFER) {\n                    m_WordBuffer[m_WordSize++] = ch;\n                }\n            }\n        } else if (ch == '<') {\n            if (m_Size <= m_Pos) {\n                return;\n            }\n            ch = m_pBuf[m_Pos++];\n            if (ch == '<') {\n                m_WordBuffer[m_WordSize++] = ch;\n            } else {\n                m_Pos --;\n            }\n        } else if (ch == '>') {\n            if (m_Size <= m_Pos) {\n                return;\n            }\n            ch = m_pBuf[m_Pos++];\n            if (ch == '>') {\n                m_WordBuffer[m_WordSize++] = ch;\n            } else {\n                m_Pos --;\n            }\n        }\n        return;\n    }\n    while (1) {\n        if (m_WordSize < MAX_WORD_BUFFER) {\n            m_WordBuffer[m_WordSize++] = ch;\n        }\n        if (type != 'N') {\n            bIsNumber = FALSE;\n        }\n        if (m_Size <= m_Pos) {\n            return;\n        }\n        ch = m_pBuf[m_Pos++];\n        type = _PDF_CharType[ch];\n        if (type == 'D' || type == 'W') {\n            m_Pos --;\n            break;\n        }\n    }\n}\nCFX_ByteString CPDF_StreamParser::ReadString()\n{\n    if (m_Size <= m_Pos) {\n        return CFX_ByteString();\n    }\n    int ch = m_pBuf[m_Pos++];\n    CFX_ByteTextBuf buf;\n    int parlevel = 0;\n    int status = 0, iEscCode = 0;\n    while (1) {\n        switch (status) {\n            case 0:\n                if (ch == ')') {\n                    if (parlevel == 0) {\n                        if (buf.GetLength() > MAX_STRING_LENGTH) {\n                            return CFX_ByteString(buf.GetBuffer(), MAX_STRING_LENGTH);\n                        }\n                        return buf.GetByteString();\n                    }\n                    parlevel --;\n                    buf.AppendChar(')');\n                } else if (ch == '(') {\n                    parlevel ++;\n                    buf.AppendChar('(');\n                } else if (ch == '\\\\') {\n                    status = 1;\n                } else {\n                    buf.AppendChar((char)ch);\n                }\n                break;\n            case 1:\n                if (ch >= '0' && ch <= '7') {\n                    iEscCode = ch - '0';\n                    status = 2;\n                    break;\n                }\n                if (ch == 'n') {\n                    buf.AppendChar('\\n');\n                } else if (ch == 'r') {\n                    buf.AppendChar('\\r');\n                } else if (ch == 't') {\n                    buf.AppendChar('\\t');\n                } else if (ch == 'b') {\n                    buf.AppendChar('\\b');\n                } else if (ch == 'f') {\n                    buf.AppendChar('\\f');\n                } else if (ch == '\\r') {\n                    status = 4;\n                    break;\n                } else if (ch == '\\n') {\n                } else {\n                    buf.AppendChar(ch);\n                }\n                status = 0;\n                break;\n            case 2:\n                if (ch >= '0' && ch <= '7') {\n                    iEscCode = iEscCode * 8 + ch - '0';\n                    status = 3;\n                } else {\n                    buf.AppendChar(iEscCode);\n                    status = 0;\n                    continue;\n                }\n                break;\n            case 3:\n                if (ch >= '0' && ch <= '7') {\n                    iEscCode = iEscCode * 8 + ch - '0';\n                    buf.AppendChar(iEscCode);\n                    status = 0;\n                } else {\n                    buf.AppendChar(iEscCode);\n                    status = 0;\n                    continue;\n                }\n                break;\n            case 4:\n                status = 0;\n                if (ch != '\\n') {\n                    continue;\n                }\n                break;\n        }\n        if (m_Size <= m_Pos) {\n            break;\n        }\n        ch = m_pBuf[m_Pos++];\n    }\n    if (m_Size > m_Pos) {\n        ch = m_pBuf[m_Pos++];\n    }\n    if (buf.GetLength() > MAX_STRING_LENGTH) {\n        return CFX_ByteString(buf.GetBuffer(), MAX_STRING_LENGTH);\n    }\n    return buf.GetByteString();\n}\nCFX_ByteString CPDF_StreamParser::ReadHexString()\n{\n    if (m_Size <= m_Pos) {\n        return CFX_ByteString();\n    }\n    int ch = m_pBuf[m_Pos++];\n    CFX_ByteTextBuf buf;\n    FX_BOOL bFirst = TRUE;\n    int code = 0;\n    while (1) {\n        if (ch == '>') {\n            break;\n        }\n        if (ch >= '0' && ch <= '9') {\n            if (bFirst) {\n                code = (ch - '0') * 16;\n            } else {\n                code += ch - '0';\n                buf.AppendChar((char)code);\n            }\n            bFirst = !bFirst;\n        } else if (ch >= 'A' && ch <= 'F') {\n            if (bFirst) {\n                code = (ch - 'A' + 10) * 16;\n            } else {\n                code += ch - 'A' + 10;\n                buf.AppendChar((char)code);\n            }\n            bFirst = !bFirst;\n        } else if (ch >= 'a' && ch <= 'f') {\n            if (bFirst) {\n                code = (ch - 'a' + 10) * 16;\n            } else {\n                code += ch - 'a' + 10;\n                buf.AppendChar((char)code);\n            }\n            bFirst = !bFirst;\n        }\n        if (m_Size <= m_Pos) {\n            break;\n        }\n        ch = m_pBuf[m_Pos++];\n    }\n    if (!bFirst) {\n        buf.AppendChar((char)code);\n    }\n    if (buf.GetLength() > MAX_STRING_LENGTH) {\n        return CFX_ByteString(buf.GetBuffer(), MAX_STRING_LENGTH);\n    }\n    return buf.GetByteString();\n}\n#define PAGEPARSE_STAGE_GETCONTENT\t\t1\n#define PAGEPARSE_STAGE_PARSE\t\t\t2\n#define PAGEPARSE_STAGE_CHECKCLIP\t\t3\nCPDF_ContentParser::CPDF_ContentParser()\n{\n    m_pParser = NULL;\n    m_pStreamArray = NULL;\n    m_pSingleStream = NULL;\n    m_pData = NULL;\n    m_Status = Ready;\n    m_pType3Char = NULL;\n}\nCPDF_ContentParser::~CPDF_ContentParser()\n{\n    Clear();\n}\nvoid CPDF_ContentParser::Clear()\n{\n    if (m_pParser) {\n        delete m_pParser;\n    }\n    if (m_pSingleStream) {\n        delete m_pSingleStream;\n    }\n    if (m_pStreamArray) {\n        for (FX_DWORD i = 0; i < m_nStreams; i ++)\n            if (m_pStreamArray[i]) {\n                delete m_pStreamArray[i];\n            }\n        FX_Free(m_pStreamArray);\n    }\n    if (m_pData && m_pSingleStream == NULL) {\n        FX_Free((void*)m_pData);\n    }\n    m_pParser = NULL;\n    m_pStreamArray = NULL;\n    m_pSingleStream = NULL;\n    m_pData = NULL;\n    m_Status = Ready;\n}\nvoid CPDF_ContentParser::Start(CPDF_Page* pPage, CPDF_ParseOptions* pOptions)\n{\n    if (m_Status != Ready || pPage == NULL || pPage->m_pDocument == NULL || pPage->m_pFormDict == NULL) {\n        m_Status = Done;\n        return;\n    }\n    m_pObjects = pPage;\n    m_bForm = FALSE;\n    if (pOptions) {\n        m_Options = *pOptions;\n    }\n    m_Status = ToBeContinued;\n    m_InternalStage = PAGEPARSE_STAGE_GETCONTENT;\n    m_CurrentOffset = 0;\n    CPDF_Object* pContent = pPage->m_pFormDict->GetElementValue(FX_BSTRC(\"Contents\"));\n    if (pContent == NULL) {\n        m_Status = Done;\n        return;\n    }\n    if (pContent->GetType() == PDFOBJ_STREAM) {\n        m_nStreams = 0;\n        m_pSingleStream = FX_NEW CPDF_StreamAcc;\n        m_pSingleStream->LoadAllData((CPDF_Stream*)pContent, FALSE);\n    } else if (pContent->GetType() == PDFOBJ_ARRAY) {\n        CPDF_Array* pArray = (CPDF_Array*)pContent;\n        m_nStreams = pArray->GetCount();\n        if (m_nStreams == 0) {\n            m_Status = Done;\n            return;\n        }\n        m_pStreamArray = FX_Alloc(CPDF_StreamAcc*, m_nStreams);\n    } else {\n        m_Status = Done;\n        return;\n    }\n}\nvoid CPDF_ContentParser::Start(CPDF_Form* pForm, CPDF_AllStates* pGraphicStates,\n                               CFX_AffineMatrix* pParentMatrix, CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level)\n{\n    m_pType3Char = pType3Char;\n    m_pObjects = pForm;\n    m_bForm = TRUE;\n    CFX_AffineMatrix form_matrix = pForm->m_pFormDict->GetMatrix(FX_BSTRC(\"Matrix\"));\n    if (pGraphicStates) {\n        form_matrix.Concat(pGraphicStates->m_CTM);\n    }\n    CPDF_Array* pBBox = pForm->m_pFormDict->GetArray(FX_BSTRC(\"BBox\"));\n    CFX_FloatRect form_bbox;\n    CPDF_Path ClipPath;\n    if (pBBox) {\n        form_bbox = pBBox->GetRect();\n        ClipPath.New();\n        ClipPath.AppendRect(form_bbox.left, form_bbox.bottom, form_bbox.right, form_bbox.top);\n        ClipPath.Transform(&form_matrix);\n        if (pParentMatrix) {\n            ClipPath.Transform(pParentMatrix);\n        }\n        form_bbox.Transform(&form_matrix);\n        if (pParentMatrix) {\n            form_bbox.Transform(pParentMatrix);\n        }\n    }\n    CPDF_Dictionary* pResources = pForm->m_pFormDict->GetDict(FX_BSTRC(\"Resources\"));\n    m_pParser = FX_NEW CPDF_StreamContentParser;\n    m_pParser->Initialize();\n    m_pParser->PrepareParse(pForm->m_pDocument, pForm->m_pPageResources, pForm->m_pResources, pParentMatrix, pForm,\n                            pResources, &form_bbox, pOptions, pGraphicStates, level);\n    m_pParser->m_pCurStates->m_CTM = form_matrix;\n    m_pParser->m_pCurStates->m_ParentMatrix = form_matrix;\n    if (ClipPath.NotNull()) {\n        m_pParser->m_pCurStates->m_ClipPath.AppendPath(ClipPath, FXFILL_WINDING, TRUE);\n    }\n    if (pForm->m_Transparency & PDFTRANS_GROUP) {\n        CPDF_GeneralStateData* pData = m_pParser->m_pCurStates->m_GeneralState.GetModify();\n        pData->m_BlendType = FXDIB_BLEND_NORMAL;\n        pData->m_StrokeAlpha = 1.0f;\n        pData->m_FillAlpha = 1.0f;\n        pData->m_pSoftMask = NULL;\n    }\n    m_nStreams = 0;\n    m_pSingleStream = FX_NEW CPDF_StreamAcc;\n    if (pForm->m_pDocument) {\n        m_pSingleStream->LoadAllData(pForm->m_pFormStream, FALSE);\n    } else {\n        m_pSingleStream->LoadAllData(pForm->m_pFormStream, FALSE);\n    }\n    m_pData = (FX_LPBYTE)m_pSingleStream->GetData();\n    m_Size = m_pSingleStream->GetSize();\n    m_Status = ToBeContinued;\n    m_InternalStage = PAGEPARSE_STAGE_PARSE;\n    m_CurrentOffset = 0;\n}\nvoid CPDF_ContentParser::Continue(IFX_Pause* pPause)\n{\n    int steps = 0;\n    while (m_Status == ToBeContinued) {\n        if (m_InternalStage == PAGEPARSE_STAGE_GETCONTENT) {\n            if (m_CurrentOffset == m_nStreams) {\n                if (m_pStreamArray) {\n                    m_Size = 0;\n                    FX_DWORD i;\n                    for (i = 0; i < m_nStreams; i ++) {\n                        FX_DWORD size = m_pStreamArray[i]->GetSize();\n                        if (m_Size + size + 1 <= m_Size) {\n                            m_Status = Done;\n                            return;\n                        }\n                        m_Size += size + 1;\n                    }\n                    m_pData = FX_Alloc(FX_BYTE, m_Size);\n                    if (!m_pData) {\n                        m_Status = Done;\n                        return;\n                    }\n                    FX_DWORD pos = 0;\n                    for (i = 0; i < m_nStreams; i ++) {\n                        FXSYS_memcpy32(m_pData + pos, m_pStreamArray[i]->GetData(), m_pStreamArray[i]->GetSize());\n                        pos += m_pStreamArray[i]->GetSize() + 1;\n                        m_pData[pos - 1] = ' ';\n                        delete m_pStreamArray[i];\n                    }\n                    FX_Free(m_pStreamArray);\n                    m_pStreamArray = NULL;\n                } else {\n                    m_pData = (FX_LPBYTE)m_pSingleStream->GetData();\n                    m_Size = m_pSingleStream->GetSize();\n                }\n                m_InternalStage = PAGEPARSE_STAGE_PARSE;\n                m_CurrentOffset = 0;\n            } else {\n                CPDF_Array* pContent = m_pObjects->m_pFormDict->GetArray(FX_BSTRC(\"Contents\"));\n                m_pStreamArray[m_CurrentOffset] = FX_NEW CPDF_StreamAcc;\n                CPDF_Stream* pStreamObj = (CPDF_Stream*)(pContent ? pContent->GetElementValue(m_CurrentOffset) : NULL);\n                m_pStreamArray[m_CurrentOffset]->LoadAllData(pStreamObj, FALSE);\n                m_CurrentOffset ++;\n            }\n        }\n        if (m_InternalStage == PAGEPARSE_STAGE_PARSE) {\n            if (m_pParser == NULL) {\n                m_pParser = FX_NEW CPDF_StreamContentParser;\n                m_pParser->Initialize();\n                m_pParser->PrepareParse(m_pObjects->m_pDocument, m_pObjects->m_pPageResources, NULL, NULL, m_pObjects,\n                                        m_pObjects->m_pResources, &m_pObjects->m_BBox, &m_Options, NULL, 0);\n                m_pParser->m_pCurStates->m_ColorState.GetModify()->Default();\n            }\n            if (m_CurrentOffset >= m_Size) {\n                m_InternalStage = PAGEPARSE_STAGE_CHECKCLIP;\n            } else {\n                m_CurrentOffset += m_pParser->Parse(m_pData + m_CurrentOffset, m_Size - m_CurrentOffset, PARSE_STEP_LIMIT);\n                if (m_pParser->m_bAbort) {\n                    m_InternalStage = PAGEPARSE_STAGE_CHECKCLIP;\n                    continue;\n                }\n            }\n        }\n        if (m_InternalStage == PAGEPARSE_STAGE_CHECKCLIP) {\n            if (m_pType3Char) {\n                m_pType3Char->m_bColored = m_pParser->m_bColored;\n                m_pType3Char->m_Width = FXSYS_round(m_pParser->m_Type3Data[0] * 1000);\n                m_pType3Char->m_BBox.left = FXSYS_round(m_pParser->m_Type3Data[2] * 1000);\n                m_pType3Char->m_BBox.bottom = FXSYS_round(m_pParser->m_Type3Data[3] * 1000);\n                m_pType3Char->m_BBox.right = FXSYS_round(m_pParser->m_Type3Data[4] * 1000);\n                m_pType3Char->m_BBox.top = FXSYS_round(m_pParser->m_Type3Data[5] * 1000);\n            }\n            FX_POSITION pos = m_pObjects->m_ObjectList.GetHeadPosition();\n            while (pos) {\n                CPDF_PageObject* pObj = (CPDF_PageObject*)m_pObjects->m_ObjectList.GetNext(pos);\n                if (pObj->m_ClipPath.IsNull()) {\n                    continue;\n                }\n                if (pObj->m_ClipPath.GetPathCount() != 1) {\n                    continue;\n                }\n                if (pObj->m_ClipPath.GetTextCount()) {\n                    continue;\n                }\n                CPDF_Path ClipPath = pObj->m_ClipPath.GetPath(0);\n                if (!ClipPath.IsRect() || pObj->m_Type == PDFPAGE_SHADING) {\n                    continue;\n                }\n                CFX_FloatRect old_rect(ClipPath.GetPointX(0), ClipPath.GetPointY(0),\n                                       ClipPath.GetPointX(2), ClipPath.GetPointY(2));\n                CFX_FloatRect obj_rect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);\n                if (old_rect.Contains(obj_rect)) {\n                    pObj->m_ClipPath.SetNull();\n                }\n            }\n            m_Status = Done;\n            return;\n        }\n        steps ++;\n        if (pPause && pPause->NeedToPauseNow()) {\n            break;\n        }\n    }\n}\nint CPDF_ContentParser::EstimateProgress()\n{\n    if (m_Status == Ready) {\n        return 0;\n    }\n    if (m_Status == Done) {\n        return 100;\n    }\n    if (m_InternalStage == PAGEPARSE_STAGE_GETCONTENT) {\n        return 10;\n    }\n    if (m_InternalStage == PAGEPARSE_STAGE_CHECKCLIP) {\n        return 90;\n    }\n    return 10 + 80 * m_CurrentOffset / m_Size;\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_page/fpdf_page_path.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_page.h\"\n#include \"../../../include/fpdfapi/fpdf_pageobj.h\"\n#include \"../../../include/fpdfapi/fpdf_module.h\"\n#include \"pageint.h\"\nvoid CPDF_PathObject::CopyData(const CPDF_PageObject* pSrc)\n{\n    const CPDF_PathObject* pSrcObj = (const CPDF_PathObject*)pSrc;\n    m_Path = pSrcObj->m_Path;\n    m_FillType = pSrcObj->m_FillType;\n    m_bStroke = pSrcObj->m_bStroke;\n    m_Matrix = pSrcObj->m_Matrix;\n}\nvoid CPDF_PathObject::Transform(const CPDF_Matrix& matrix)\n{\n    m_Matrix.Concat(matrix);\n    CalcBoundingBox();\n}\nvoid CPDF_PathObject::SetGraphState(CPDF_GraphState GraphState)\n{\n    m_GraphState = GraphState;\n    CalcBoundingBox();\n}\nvoid CPDF_PathObject::CalcBoundingBox()\n{\n    if (m_Path.IsNull()) {\n        return;\n    }\n    CFX_FloatRect rect;\n    FX_FLOAT width = m_GraphState.GetObject()->m_LineWidth;\n    if (m_bStroke && width != 0) {\n        rect = m_Path.GetBoundingBox(width, m_GraphState.GetObject()->m_MiterLimit);\n    } else {\n        rect = m_Path.GetBoundingBox();\n    }\n    rect.Transform(&m_Matrix);\n    if (width == 0 && m_bStroke) {\n        rect.left += -0.5f;\n        rect.right += 0.5f;\n        rect.bottom += -0.5f;\n        rect.top += 0.5f;\n    }\n    m_Left = rect.left;\n    m_Right = rect.right;\n    m_Top = rect.top;\n    m_Bottom = rect.bottom;\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_page.h\"\n#include \"pageint.h\"\nCPDF_TilingPattern::CPDF_TilingPattern(CPDF_Document* pDoc, CPDF_Object* pPatternObj, const CFX_AffineMatrix* parentMatrix) :\n    CPDF_Pattern(parentMatrix)\n{\n    m_PatternType = PATTERN_TILING;\n    m_pPatternObj = pPatternObj;\n    m_pDocument = pDoc;\n    CPDF_Dictionary* pDict = m_pPatternObj->GetDict();\n    ASSERT(pDict != NULL);\n    m_Pattern2Form = pDict->GetMatrix(FX_BSTRC(\"Matrix\"));\n    m_bColored = pDict->GetInteger(FX_BSTRC(\"PaintType\")) == 1;\n    if (parentMatrix) {\n        m_Pattern2Form.Concat(*parentMatrix);\n    }\n    m_pForm = NULL;\n}\nCPDF_TilingPattern::~CPDF_TilingPattern()\n{\n    if (m_pForm) {\n        delete m_pForm;\n    }\n}\nFX_BOOL CPDF_TilingPattern::Load()\n{\n    if (m_pForm != NULL) {\n        return TRUE;\n    }\n    CPDF_Dictionary* pDict = m_pPatternObj->GetDict();\n    if (pDict == NULL) {\n        return FALSE;\n    }\n    m_bColored = pDict->GetInteger(FX_BSTRC(\"PaintType\")) == 1;\n    m_XStep = (FX_FLOAT)FXSYS_fabs(pDict->GetNumber(FX_BSTRC(\"XStep\")));\n    m_YStep = (FX_FLOAT)FXSYS_fabs(pDict->GetNumber(FX_BSTRC(\"YStep\")));\n    if (m_pPatternObj->GetType() != PDFOBJ_STREAM) {\n        return FALSE;\n    }\n    CPDF_Stream* pStream = (CPDF_Stream*)m_pPatternObj;\n    m_pForm = FX_NEW CPDF_Form(m_pDocument, NULL, pStream);\n    m_pForm->ParseContent(NULL, &m_ParentMatrix, NULL, NULL);\n    m_BBox = pDict->GetRect(FX_BSTRC(\"BBox\"));\n    return TRUE;\n}\nCPDF_ShadingPattern::CPDF_ShadingPattern(CPDF_Document* pDoc, CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* parentMatrix) : CPDF_Pattern(parentMatrix)\n{\n    m_PatternType = PATTERN_SHADING;\n    m_pPatternObj = bShading ? NULL : pPatternObj;\n    m_pDocument = pDoc;\n    m_bShadingObj = bShading;\n    if (!bShading) {\n        CPDF_Dictionary* pDict = m_pPatternObj->GetDict();\n        ASSERT(pDict != NULL);\n        m_Pattern2Form = pDict->GetMatrix(FX_BSTRC(\"Matrix\"));\n        m_pShadingObj = pDict->GetElementValue(FX_BSTRC(\"Shading\"));\n        if (parentMatrix) {\n            m_Pattern2Form.Concat(*parentMatrix);\n        }\n    } else {\n        m_pShadingObj = pPatternObj;\n    }\n    m_ShadingType = 0;\n    m_pCS = NULL;\n    m_nFuncs = 0;\n    for (int i = 0; i < 4; i ++) {\n        m_pFunctions[i] = NULL;\n    }\n}\nCPDF_ShadingPattern::~CPDF_ShadingPattern()\n{\n    Clear();\n}\nvoid CPDF_ShadingPattern::Clear()\n{\n    for (int i = 0; i < m_nFuncs; i ++) {\n        if (m_pFunctions[i]) {\n            delete m_pFunctions[i];\n        }\n        m_pFunctions[i] = NULL;\n    }\n    CPDF_ColorSpace* pCS = m_pCS;\n    if (pCS && m_pDocument) {\n        m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray());\n    }\n    m_ShadingType = 0;\n    m_pCS = NULL;\n    m_nFuncs = 0;\n}\nFX_BOOL CPDF_ShadingPattern::Load()\n{\n    if (m_ShadingType != 0) {\n        return TRUE;\n    }\n    CPDF_Dictionary* pShadingDict = m_pShadingObj ? m_pShadingObj->GetDict() : NULL;\n    if (pShadingDict == NULL) {\n        return FALSE;\n    }\n    if (m_nFuncs) {\n        for (int i = 0; i < m_nFuncs; i ++)\n            if (m_pFunctions[i]) {\n                delete m_pFunctions[i];\n            }\n        m_nFuncs = 0;\n    }\n    CPDF_Object* pFunc = pShadingDict->GetElementValue(FX_BSTRC(\"Function\"));\n    if (pFunc) {\n        if (pFunc->GetType() == PDFOBJ_ARRAY) {\n            m_nFuncs = ((CPDF_Array*)pFunc)->GetCount();\n            if (m_nFuncs > 4) {\n                m_nFuncs = 4;\n            }\n            for (int i = 0; i < m_nFuncs; i ++) {\n                m_pFunctions[i] = CPDF_Function::Load(((CPDF_Array*)pFunc)->GetElementValue(i));\n            }\n        } else {\n            m_pFunctions[0] = CPDF_Function::Load(pFunc);\n            m_nFuncs = 1;\n        }\n    }\n    CPDF_Object* pCSObj = pShadingDict->GetElementValue(FX_BSTRC(\"ColorSpace\"));\n    if (pCSObj == NULL) {\n        return FALSE;\n    }\n    CPDF_DocPageData* pDocPageData = m_pDocument->GetPageData();\n    m_pCS = pDocPageData->GetColorSpace(pCSObj, NULL);\n    m_ShadingType = pShadingDict->GetInteger(FX_BSTRC(\"ShadingType\"));\n    return TRUE;\n}\nFX_BOOL CPDF_ShadingPattern::Reload()\n{\n    Clear();\n    return Load();\n}\nFX_BOOL CPDF_MeshStream::Load(CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs, CPDF_ColorSpace* pCS)\n{\n    m_Stream.LoadAllData(pShadingStream);\n    m_BitStream.Init(m_Stream.GetData(), m_Stream.GetSize());\n    m_pFuncs = pFuncs;\n    m_nFuncs = nFuncs;\n    m_pCS = pCS;\n    CPDF_Dictionary* pDict = pShadingStream->GetDict();\n    m_nCoordBits = pDict->GetInteger(FX_BSTRC(\"BitsPerCoordinate\"));\n    m_nCompBits = pDict->GetInteger(FX_BSTRC(\"BitsPerComponent\"));\n    m_nFlagBits = pDict->GetInteger(FX_BSTRC(\"BitsPerFlag\"));\n    if (!m_nCoordBits || !m_nCompBits) {\n        return FALSE;\n    }\n    int nComps = pCS->CountComponents();\n    if (nComps > 8) {\n        return FALSE;\n    }\n    m_nComps = nFuncs ? 1 : nComps;\n    if (((int)m_nComps < 0) || m_nComps > 8) {\n        return FALSE;\n    }\n    m_CoordMax = m_nCoordBits == 32 ? -1 : (1 << m_nCoordBits) - 1;\n    m_CompMax = (1 << m_nCompBits) - 1;\n    CPDF_Array* pDecode = pDict->GetArray(FX_BSTRC(\"Decode\"));\n    if (pDecode == NULL || pDecode->GetCount() != 4 + m_nComps * 2) {\n        return FALSE;\n    }\n    m_xmin = pDecode->GetNumber(0);\n    m_xmax = pDecode->GetNumber(1);\n    m_ymin = pDecode->GetNumber(2);\n    m_ymax = pDecode->GetNumber(3);\n    for (FX_DWORD i = 0; i < m_nComps; i ++) {\n        m_ColorMin[i] = pDecode->GetNumber(i * 2 + 4);\n        m_ColorMax[i] = pDecode->GetNumber(i * 2 + 5);\n    }\n    return TRUE;\n}\nFX_DWORD CPDF_MeshStream::GetFlag()\n{\n    return m_BitStream.GetBits(m_nFlagBits) & 0x03;\n}\nvoid CPDF_MeshStream::GetCoords(FX_FLOAT& x, FX_FLOAT& y)\n{\n    if (m_nCoordBits == 32) {\n        x = m_xmin + (FX_FLOAT)(m_BitStream.GetBits(m_nCoordBits) * (m_xmax - m_xmin) / (double)m_CoordMax);\n        y = m_ymin + (FX_FLOAT)(m_BitStream.GetBits(m_nCoordBits) * (m_ymax - m_ymin) / (double)m_CoordMax);\n    } else {\n        x = m_xmin + m_BitStream.GetBits(m_nCoordBits) * (m_xmax - m_xmin) / m_CoordMax;\n        y = m_ymin + m_BitStream.GetBits(m_nCoordBits) * (m_ymax - m_ymin) / m_CoordMax;\n    }\n}\nvoid CPDF_MeshStream::GetColor(FX_FLOAT& r, FX_FLOAT& g, FX_FLOAT& b)\n{\n    FX_DWORD i;\n    FX_FLOAT color_value[8];\n    for (i = 0; i < m_nComps; i ++) {\n        color_value[i] = m_ColorMin[i] + m_BitStream.GetBits(m_nCompBits) * (m_ColorMax[i] - m_ColorMin[i]) / m_CompMax;\n    }\n    if (m_nFuncs) {\n        static const int kMaxResults = 8;\n        FX_FLOAT result[kMaxResults];\n        int nResults;\n        FXSYS_memset32(result, 0, sizeof(result));\n        for (FX_DWORD i = 0; i < m_nFuncs; i ++) {\n            if (m_pFuncs[i] && m_pFuncs[i]->CountOutputs() <= kMaxResults) {\n                m_pFuncs[i]->Call(color_value, 1, result, nResults);\n            }\n        }\n        m_pCS->GetRGB(result, r, g, b);\n    } else {\n        m_pCS->GetRGB(color_value, r, g, b);\n    }\n}\nFX_DWORD CPDF_MeshStream::GetVertex(CPDF_MeshVertex& vertex, CFX_AffineMatrix* pObject2Bitmap)\n{\n    FX_DWORD flag = GetFlag();\n    GetCoords(vertex.x, vertex.y);\n    pObject2Bitmap->Transform(vertex.x, vertex.y);\n    GetColor(vertex.r, vertex.g, vertex.b);\n    m_BitStream.ByteAlign();\n    return flag;\n}\nFX_BOOL CPDF_MeshStream::GetVertexRow(CPDF_MeshVertex* vertex, int count, CFX_AffineMatrix* pObject2Bitmap)\n{\n    for (int i = 0; i < count; i ++) {\n        if (m_BitStream.IsEOF()) {\n            return FALSE;\n        }\n        GetCoords(vertex[i].x, vertex[i].y);\n        pObject2Bitmap->Transform(vertex[i].x, vertex[i].y);\n        GetColor(vertex[i].r, vertex[i].g, vertex[i].b);\n        m_BitStream.ByteAlign();\n    }\n    return TRUE;\n}\nCFX_FloatRect _GetShadingBBox(CPDF_Stream* pStream, int type, const CFX_AffineMatrix* pMatrix,\n                              CPDF_Function** pFuncs, int nFuncs, CPDF_ColorSpace* pCS)\n{\n    if (pStream == NULL || pStream->GetType() != PDFOBJ_STREAM || pFuncs == NULL || pCS == NULL) {\n        return CFX_FloatRect(0, 0, 0, 0);\n    }\n    CPDF_MeshStream stream;\n    if (!stream.Load(pStream, pFuncs, nFuncs, pCS)) {\n        return CFX_FloatRect(0, 0, 0, 0);\n    }\n    CFX_FloatRect rect;\n    FX_BOOL bStarted = FALSE;\n    FX_BOOL bGouraud = type == 4 || type == 5;\n    int full_point_count = type == 7 ? 16 : (type == 6 ? 12 : 1);\n    int full_color_count = (type == 6 || type == 7) ? 4 : 1;\n    while (!stream.m_BitStream.IsEOF()) {\n        FX_DWORD flag;\n        if (type != 5) {\n            flag = stream.GetFlag();\n        }\n        int point_count = full_point_count, color_count = full_color_count;\n        if (!bGouraud && flag) {\n            point_count -= 4;\n            color_count -= 2;\n        }\n        for (int i = 0; i < point_count; i ++) {\n            FX_FLOAT x, y;\n            stream.GetCoords(x, y);\n            if (bStarted) {\n                rect.UpdateRect(x, y);\n            } else {\n                rect.InitRect(x, y);\n                bStarted = TRUE;\n            }\n        }\n        stream.m_BitStream.SkipBits(stream.m_nComps * stream.m_nCompBits * color_count);\n        if (bGouraud) {\n            stream.m_BitStream.ByteAlign();\n        }\n    }\n    rect.Transform(pMatrix);\n    return rect;\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_page/pageint.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_pageobj.h\"\n#define PARSE_STEP_LIMIT\t\t100\n#define STREAM_PARSE_BUFSIZE\t20480\nclass CPDF_QuickFontCache;\n#ifndef _FPDFAPI_MINI_\nclass CPDF_StreamParser : public CFX_Object\n{\npublic:\n\n    CPDF_StreamParser(const FX_BYTE* pData, FX_DWORD dwSize);\n    ~CPDF_StreamParser();\n\n    CPDF_Stream*\t\tReadInlineStream(CPDF_Document* pDoc, CPDF_Dictionary* pDict, CPDF_Object* pCSObj, FX_BOOL bDecode);\n    typedef enum { EndOfData, Number, Keyword, Name, Others } SyntaxType;\n\n    SyntaxType\t\t\tParseNextElement();\n    FX_LPBYTE\t\t\tGetWordBuf()\n    {\n        return m_WordBuffer;\n    }\n    FX_DWORD\t\t\tGetWordSize()\n    {\n        return m_WordSize;\n    }\n    CPDF_Object*\t\tGetObject()\n    {\n        CPDF_Object* pObj = m_pLastObj;\n        m_pLastObj = NULL;\n        return pObj;\n    }\n    FX_DWORD\t\t\tGetPos()\n    {\n        return m_Pos;\n    }\n    void\t\t\t\tSetPos(FX_DWORD pos)\n    {\n        m_Pos = pos;\n    }\n\n    CPDF_Object*\t\tReadNextObject(FX_BOOL bAllowNestedArray = FALSE, FX_BOOL bInArray = FALSE);\n    void\t\t\t\tSkipPathObject();\nprotected:\n    void\t\t\t\tGetNextWord(FX_BOOL& bIsNumber);\n    CFX_ByteString\t\tReadString();\n    CFX_ByteString\t\tReadHexString();\n    const FX_BYTE*\t\tm_pBuf;\n    FX_DWORD\t\t\tm_Size;\n    FX_DWORD\t\t\tm_Pos;\n    FX_BYTE\t\t\t\tm_WordBuffer[256];\n    FX_DWORD\t\t\tm_WordSize;\n    CPDF_Object*\t\tm_pLastObj;\n};\n#endif\ntypedef enum {\n    PDFOP_CloseFillStrokePath = 0, PDFOP_FillStrokePath,\n    PDFOP_CloseEOFillStrokePath, PDFOP_EOFillStrokePath,\n    PDFOP_BeginMarkedContent_Dictionary, PDFOP_BeginImage,\n    PDFOP_BeginMarkedContent, PDFOP_BeginText,\n    PDFOP_BeginSectionUndefined, PDFOP_CurveTo_123,\n    PDFOP_ConcatMatrix, PDFOP_SetColorSpace_Fill,\n    PDFOP_SetColorSpace_Stroke, PDFOP_SetDash,\n    PDFOP_SetCharWidth, PDFOP_SetCachedDevice,\n    PDFOP_ExecuteXObject, PDFOP_MarkPlace_Dictionary,\n    PDFOP_EndImage, PDFOP_EndMarkedContent,\n    PDFOP_EndText, PDFOP_EndSectionUndefined,\n    PDFOP_FillPath, PDFOP_FillPathOld,\n    PDFOP_EOFillPath, PDFOP_SetGray_Fill,\n    PDFOP_SetGray_Stroke, PDFOP_SetExtendGraphState,\n    PDFOP_ClosePath, PDFOP_SetFlat,\n    PDFOP_BeginImageData, PDFOP_SetLineJoin,\n    PDFOP_SetLineCap, PDFOP_SetCMYKColor_Fill,\n    PDFOP_SetCMYKColor_Stroke, PDFOP_LineTo,\n    PDFOP_MoveTo, PDFOP_SetMiterLimit,\n    PDFOP_MarkPlace, PDFOP_EndPath,\n    PDFOP_SaveGraphState, PDFOP_RestoreGraphState,\n    PDFOP_Rectangle, PDFOP_SetRGBColor_Fill,\n    PDFOP_SetRGBColor_Stroke, PDFOP_SetRenderIntent,\n    PDFOP_CloseStrokePath, PDFOP_StrokePath,\n    PDFOP_SetColor_Fill, PDFOP_SetColor_Stroke,\n    PDFOP_SetColorPS_Fill, PDFOP_SetColorPS_Stroke,\n    PDFOP_ShadeFill, PDFOP_SetCharSpace,\n    PDFOP_MoveTextPoint, PDFOP_MoveTextPoint_SetLeading,\n    PDFOP_SetFont, PDFOP_ShowText,\n    PDFOP_ShowText_Positioning, PDFOP_SetTextLeading,\n    PDFOP_SetTextMatrix, PDFOP_SetTextRenderMode,\n    PDFOP_SetTextRise, PDFOP_SetWordSpace,\n    PDFOP_SetHorzScale, PDFOP_MoveToNextLine,\n    PDFOP_CurveTo_23, PDFOP_SetLineWidth,\n    PDFOP_Clip, PDFOP_EOClip,\n    PDFOP_CurveTo_13, PDFOP_NextLineShowText,\n    PDFOP_NextLineShowText_Space, PDFOP_Invalid\n} PDFOP;\n#define PARAM_BUF_SIZE\t16\ntypedef struct {\n    int\t\t\tm_Type;\n    union {\n        struct {\n            FX_BOOL\t\tm_bInteger;\n            union {\n                int\t\tm_Integer;\n                FX_FLOAT m_Float;\n            };\n        } m_Number;\n        CPDF_Object*\tm_pObject;\n        struct {\n            int\t\t\tm_Len;\n            char\t\tm_Buffer[32];\n        } m_Name;\n    };\n} _ContentParam;\n#if defined(_FPDFAPI_MINI_)\n#define _FPDF_MAX_FORM_LEVEL_\t\t17\n#else\n#define _FPDF_MAX_FORM_LEVEL_\t\t30\n#endif\n#define _FPDF_MAX_TYPE3_FORM_LEVEL_\t4\n#define _FPDF_MAX_OBJECT_STACK_SIZE_ 512\nclass CPDF_StreamContentParser : public CFX_Object\n{\npublic:\n    CPDF_StreamContentParser();\n    ~CPDF_StreamContentParser();\n    FX_BOOL Initialize();\n    void\tPrepareParse(CPDF_Document* pDoc, CPDF_Dictionary* pPageResources, CPDF_Dictionary* pParentResources,\n                         CFX_AffineMatrix* pmtContentToUser,\n                         CPDF_PageObjects* pObjList, CPDF_Dictionary* pResources,\n                         CFX_FloatRect* pBBox, CPDF_ParseOptions* pOptions,\n                         CPDF_AllStates* pAllStates, int level);\n    CPDF_Document*\t\tm_pDocument;\n    CPDF_Dictionary*\tm_pPageResources;\n    CPDF_Dictionary*\tm_pParentResources;\n    CPDF_PageObjects*\tm_pObjectList;\n    CPDF_Dictionary*\tm_pResources;\n    int\t\t\t\t\tm_Level;\n    CFX_AffineMatrix\tm_mtContentToUser;\n    CFX_FloatRect\t\tm_BBox;\n    CPDF_ParseOptions\tm_Options;\n    _ContentParam\t\tm_ParamBuf1[PARAM_BUF_SIZE];\n    FX_DWORD\t\t\tm_ParamStartPos;\n    FX_DWORD\t\t\tm_ParamCount;\n    void\t\t\t\tAddNumberParam(FX_LPCSTR str, int len);\n    void\t\t\t\tAddObjectParam(CPDF_Object* pObj);\n    void\t\t\t\tAddNameParam(FX_LPCSTR name, int size);\n    int\t\t\t\t\tGetNextParamPos();\n    void\t\t\t\tClearAllParams();\n    CPDF_Object*\t\tGetObject(FX_DWORD index);\n    CFX_ByteString\t\tGetString(FX_DWORD index);\n    FX_FLOAT\t\t\tGetNumber(FX_DWORD index);\n    FX_FLOAT\t\tGetNumber16(FX_DWORD index);\n    int\t\t\t\t\tGetInteger(FX_DWORD index)\n    {\n        return (FX_INT32)(GetNumber(index));\n    }\n    FX_BOOL\t\t\t\tOnOperator(FX_LPCSTR op);\n    void\t\t\t\tBigCaseCaller(int index);\n    FX_BOOL\t\t\t\tm_bAbort;\n#ifndef _FPDFAPI_MINI_\n    CPDF_StreamParser*\tm_pSyntax;\n    FX_DWORD\t\t\tGetParsePos()\n    {\n        return m_pSyntax->GetPos();\n    }\n#else\n    int\t\t\t\t\tm_WordState;\n    void\t\t\t\tInputData(FX_LPCBYTE src_buf, FX_DWORD src_size);\n    void\t\t\t\tFinish();\n    void\t\t\t\tStartArray();\n    void\t\t\t\tEndArray();\n    void\t\t\t\tStartDict();\n    void\t\t\t\tEndDict();\n    void\t\t\t\tEndName();\n    void\t\t\t\tEndNumber();\n    void\t\t\t\tEndKeyword();\n    void\t\t\t\tEndHexString();\n    void\t\t\t\tEndString();\n    void\t\t\t\tEndImageDict();\n    void\t\t\t\tEndInlineImage();\n    FX_LPBYTE\t\t\tm_pWordBuf;\n    FX_DWORD\t\t\tm_WordSize;\n    CFX_BinaryBuf\t\tm_StringBuf;\n    int\t\t\t\t\tm_StringLevel, m_StringState, m_EscCode;\n    void\t\t\t\tAddContainer(CPDF_Object* pObject);\n    FX_BOOL\t\t\t\tSetToCurObj(CPDF_Object* pObject);\n    FX_LPBYTE\t\t\tm_pDictName;\n    FX_BOOL\t\t\t\tm_bDictName;\n    CPDF_Object**\t\tm_pObjectStack;\n    FX_BOOL*\t\t\tm_pObjectState;\n    FX_DWORD\t\t\tm_ObjectSize;\n    int\t\t\t\t\tm_InlineImageState;\n    FX_BYTE\t\t\t\tm_InlineWhiteChar;\n    CFX_BinaryBuf\t\tm_ImageSrcBuf;\n    FX_LPBYTE\t\t\tm_pStreamBuf;\n#endif\n    CPDF_AllStates*\t\tm_pCurStates;\n    CPDF_ContentMark\tm_CurContentMark;\n    CFX_PtrArray\t\tm_ClipTextList;\n    CPDF_TextObject*\tm_pLastTextObject;\n    FX_FLOAT\t\t\tm_DefFontSize;\n    void\t\t\t\tAddTextObject(CFX_ByteString* pText, FX_FLOAT fInitKerning, FX_FLOAT* pKerning, int count);\n\n    void\t\t\t\tConvertUserSpace(FX_FLOAT& x, FX_FLOAT& y);\n    void\t\t\t\tConvertTextSpace(FX_FLOAT& x, FX_FLOAT& y);\n    void\t\t\t\tOnChangeTextMatrix();\n#ifndef _FPDFAPI_MINI_\n    FX_DWORD\t\t\tParse(FX_LPCBYTE pData, FX_DWORD dwSize, FX_DWORD max_cost);\n    void\t\t\t\tParsePathObject();\n#endif\n    int\t\t\t\t\tm_CompatCount;\n    FX_PATHPOINT*\t\tm_pPathPoints;\n    int\t\t\t\t\tm_PathPointCount;\n    int\t\t\t\t\tm_PathAllocSize;\n    FX_FLOAT\t\t\tm_PathStartX, m_PathStartY;\n    FX_FLOAT\t\t\tm_PathCurrentX, m_PathCurrentY;\n    int\t\t\t\t\tm_PathClipType;\n    void\t\t\t\tAddPathPoint(FX_FLOAT x, FX_FLOAT y, int flag);\n    void\t\t\t\tAddPathRect(FX_FLOAT x, FX_FLOAT y, FX_FLOAT w, FX_FLOAT h);\n    void\t\t\t\tAddPathObject(int FillType, FX_BOOL bStroke);\n    CPDF_ImageObject*\tAddImage(CPDF_Stream* pStream, CPDF_Image* pImage, FX_BOOL bInline);\n    void\t\t\t\tAddDuplicateImage();\n    void\t\t\t\tAddForm(CPDF_Stream*);\n    CFX_ByteString\t\tm_LastImageName;\n    CPDF_Image*\t\t\tm_pLastImage;\n    CFX_BinaryBuf\t\tm_LastImageDict, m_LastImageData;\n    CPDF_Dictionary*\tm_pLastImageDict;\n    CPDF_Dictionary*    m_pLastCloneImageDict;\n    FX_BOOL\t\t\t\tm_bReleaseLastDict;\n    FX_BOOL\t\t\t\tm_bSameLastDict;\n    void\t\t\t\tSetGraphicStates(CPDF_PageObject* pObj, FX_BOOL bColor, FX_BOOL bText, FX_BOOL bGraph);\n    FX_BOOL\t\t\t\tm_bColored;\n    FX_FLOAT\t\t\tm_Type3Data[6];\n    FX_BOOL\t\t\t\tm_bResourceMissing;\n    CFX_PtrArray\t\tm_StateStack;\n    void\t\t\t\tSaveStates(CPDF_AllStates*);\n    void\t\t\t\tRestoreStates(CPDF_AllStates*);\n    CPDF_Font*\t\t\tFindFont(const CFX_ByteString& name);\n    CPDF_ColorSpace*\tFindColorSpace(const CFX_ByteString& name);\n    CPDF_Pattern*\t\tFindPattern(const CFX_ByteString& name, FX_BOOL bShading);\n    CPDF_Object*\t\tFindResourceObj(FX_BSTR type, const CFX_ByteString& name);\n    void Handle_CloseFillStrokePath();\n    void Handle_FillStrokePath();\n    void Handle_CloseEOFillStrokePath();\n    void Handle_EOFillStrokePath();\n    void Handle_BeginMarkedContent_Dictionary();\n    void Handle_BeginImage();\n    void Handle_BeginMarkedContent();\n    void Handle_BeginText();\n    void Handle_BeginSectionUndefined();\n    void Handle_CurveTo_123();\n    void Handle_ConcatMatrix();\n    void Handle_SetColorSpace_Fill();\n    void Handle_SetColorSpace_Stroke();\n    void Handle_SetDash();\n    void Handle_SetCharWidth();\n    void Handle_SetCachedDevice();\n    void Handle_ExecuteXObject();\n    void Handle_MarkPlace_Dictionary();\n    void Handle_EndImage();\n    void Handle_EndMarkedContent();\n    void Handle_EndText();\n    void Handle_EndSectionUndefined();\n    void Handle_FillPath();\n    void Handle_FillPathOld();\n    void Handle_EOFillPath();\n    void Handle_SetGray_Fill();\n    void Handle_SetGray_Stroke();\n    void Handle_SetExtendGraphState();\n    void Handle_ClosePath();\n    void Handle_SetFlat();\n    void Handle_BeginImageData();\n    void Handle_SetLineJoin();\n    void Handle_SetLineCap();\n    void Handle_SetCMYKColor_Fill();\n    void Handle_SetCMYKColor_Stroke();\n    void Handle_LineTo();\n    void Handle_MoveTo();\n    void Handle_SetMiterLimit();\n    void Handle_MarkPlace();\n    void Handle_EndPath();\n    void Handle_SaveGraphState();\n    void Handle_RestoreGraphState();\n    void Handle_Rectangle();\n    void Handle_SetRGBColor_Fill();\n    void Handle_SetRGBColor_Stroke();\n    void Handle_SetRenderIntent();\n    void Handle_CloseStrokePath();\n    void Handle_StrokePath();\n    void Handle_SetColor_Fill();\n    void Handle_SetColor_Stroke();\n    void Handle_SetColorPS_Fill();\n    void Handle_SetColorPS_Stroke();\n    void Handle_ShadeFill();\n    void Handle_SetCharSpace();\n    void Handle_MoveTextPoint();\n    void Handle_MoveTextPoint_SetLeading();\n    void Handle_SetFont();\n    void Handle_ShowText();\n    void Handle_ShowText_Positioning();\n    void Handle_SetTextLeading();\n    void Handle_SetTextMatrix();\n    void Handle_SetTextRenderMode();\n    void Handle_SetTextRise();\n    void Handle_SetWordSpace();\n    void Handle_SetHorzScale();\n    void Handle_MoveToNextLine();\n    void Handle_CurveTo_23();\n    void Handle_SetLineWidth();\n    void Handle_Clip();\n    void Handle_EOClip();\n    void Handle_CurveTo_13();\n    void Handle_NextLineShowText();\n    void Handle_NextLineShowText_Space();\n    void Handle_Invalid();\n};\nclass CPDF_ContentParser : public CFX_Object\n{\npublic:\n    CPDF_ContentParser();\n    ~CPDF_ContentParser();\n    typedef enum { Ready, ToBeContinued, Done } ParseStatus;\n    ParseStatus\t\t\tGetStatus()\n    {\n        return m_Status;\n    }\n    void\t\t\t\tStart(CPDF_Page* pPage, CPDF_ParseOptions* pOptions);\n    void\t\t\t\tStart(CPDF_Form* pForm, CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,\n                              CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level);\n    void\t\t\t\tContinue(IFX_Pause* pPause);\n    int\t\t\t\t\tEstimateProgress();\nprotected:\n    void\t\t\t\tClear();\n    ParseStatus\t\t\tm_Status;\n    CPDF_PageObjects*\tm_pObjects;\n    FX_BOOL\t\t\t\tm_bForm;\n    CPDF_ParseOptions\tm_Options;\n    CPDF_Type3Char*\t\tm_pType3Char;\n    int\t\t\t\t\tm_InternalStage;\n    CPDF_StreamAcc*\t\tm_pSingleStream;\n    CPDF_StreamAcc**\tm_pStreamArray;\n    FX_DWORD\t\t\tm_nStreams;\n    FX_LPBYTE\t\t\tm_pData;\n    FX_DWORD\t\t\tm_Size;\n    class CPDF_StreamContentParser*\tm_pParser;\n    FX_DWORD\t\t\tm_CurrentOffset;\n    CPDF_StreamFilter*\tm_pStreamFilter;\n};\nclass CPDF_AllStates : public CPDF_GraphicStates\n{\npublic:\n    CPDF_AllStates();\n    ~CPDF_AllStates();\n    void\tCopy(const CPDF_AllStates& src);\n    void\tProcessExtGS(CPDF_Dictionary* pGS, CPDF_StreamContentParser* pParser);\n    void\tSetLineDash(CPDF_Array*, FX_FLOAT, FX_FLOAT scale);\n    CFX_AffineMatrix\t\tm_TextMatrix, m_CTM, m_ParentMatrix;\n    FX_FLOAT\t\t\t\tm_TextX, m_TextY, m_TextLineX, m_TextLineY;\n    FX_FLOAT\t\t\t\tm_TextLeading, m_TextRise, m_TextHorzScale;\n};\ntemplate <class ObjClass> class CPDF_CountedObject : public CFX_Object\n{\npublic:\n    ObjClass\tm_Obj;\n    FX_DWORD\tm_nCount;\n};\ntypedef CFX_MapPtrTemplate<CPDF_Dictionary*, CPDF_CountedObject<CPDF_Font*>*>\t\tCPDF_FontMap;\ntypedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_ColorSpace*>*>\t\tCPDF_ColorSpaceMap;\ntypedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_Pattern*>*>\t\tCPDF_PatternMap;\ntypedef CFX_MapPtrTemplate<FX_DWORD, CPDF_CountedObject<CPDF_Image*>*>\t\t\t\tCPDF_ImageMap;\ntypedef CFX_MapPtrTemplate<CPDF_Stream*, CPDF_CountedObject<CPDF_IccProfile*>*>\t\tCPDF_IccProfileMap;\ntypedef CFX_MapPtrTemplate<CPDF_Stream*, CPDF_CountedObject<CPDF_StreamAcc*>*>\t\tCPDF_FontFileMap;\ntemplate <class KeyType, class ValueType>\nKeyType PDF_DocPageData_FindValue(const CFX_MapPtrTemplate<KeyType, CPDF_CountedObject<ValueType>*> &map, ValueType findValue, CPDF_CountedObject<ValueType>*& findData)\n{\n    FX_POSITION pos = map.GetStartPosition();\n    while (pos) {\n        KeyType findKey;\n        map.GetNextAssoc(pos, findKey, findData);\n        if (findData->m_Obj == findValue) {\n            return findKey;\n        }\n    }\n    findData = NULL;\n    return (KeyType)(FX_UINTPTR)NULL;\n}\ntemplate <class KeyType, class ValueType>\nFX_BOOL PDF_DocPageData_Release(CFX_MapPtrTemplate<KeyType, CPDF_CountedObject<ValueType>*> &map, KeyType findKey, ValueType findValue, FX_BOOL bForce = FALSE)\n{\n    if (!findKey && !findValue) {\n        return FALSE;\n    }\n    CPDF_CountedObject<ValueType>* findData = NULL;\n    if (!findKey) {\n        findKey = PDF_DocPageData_FindValue<KeyType, ValueType>(map, findValue, findData);\n    } else if (!map.Lookup(findKey, findData)) {\n        return FALSE;\n    }\n    if (findData && ((-- findData->m_nCount) == 0 || bForce)) {\n        delete findData->m_Obj;\n        delete findData;\n        map.RemoveKey(findKey);\n        return TRUE;\n    }\n    return FALSE;\n}\nclass CPDF_DocPageData : public CFX_Object\n{\npublic:\n    CPDF_DocPageData(CPDF_Document *pPDFDoc);\n    ~CPDF_DocPageData();\n    void\t\t\t\t\tClear(FX_BOOL bRelease = FALSE);\n    CPDF_Font*\t\t\t\tGetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnly);\n    CPDF_Font*\t\t\t\tGetStandardFont(FX_BSTR fontName, CPDF_FontEncoding* pEncoding);\n    void\t\t\t\t\tReleaseFont(CPDF_Dictionary* pFontDict);\n    CPDF_ColorSpace*\t\tGetColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources);\n    CPDF_ColorSpace*\t\tGetCopiedColorSpace(CPDF_Object* pCSObj);\n    void\t\t\t\t\tReleaseColorSpace(CPDF_Object* pColorSpace);\n    CPDF_Pattern*\t\t\tGetPattern(CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix);\n    void\t\t\t\t\tReleasePattern(CPDF_Object* pPatternObj);\n    CPDF_Image*\t\t\t\tGetImage(CPDF_Object* pImageStream);\n    void\t\t\t\t\tReleaseImage(CPDF_Object* pImageStream);\n    CPDF_IccProfile*\t\tGetIccProfile(CPDF_Stream* pIccProfileStream, FX_INT32 nComponents);\n    void\t\t\t\t\tReleaseIccProfile(CPDF_Stream* pIccProfileStream, CPDF_IccProfile* pIccProfile);\n    CPDF_StreamAcc*\t\t\tGetFontFileStreamAcc(CPDF_Stream* pFontStream);\n    void\t\t\t\t\tReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, FX_BOOL bForce = FALSE);\n    CPDF_Document*\t\t\tm_pPDFDoc;\n    CPDF_FontMap\t\t\tm_FontMap;\n    CPDF_ColorSpaceMap\t\tm_ColorSpaceMap;\n    CPDF_PatternMap\t\t\tm_PatternMap;\n    CPDF_ImageMap\t\t\tm_ImageMap;\n    CPDF_IccProfileMap\t\tm_IccProfileMap;\n    CFX_MapByteStringToPtr\tm_HashProfileMap;\n    CPDF_FontFileMap\t\tm_FontFileMap;\n};\nclass CPDF_Function : public CFX_Object\n{\npublic:\n    static CPDF_Function*\tLoad(CPDF_Object* pFuncObj);\n    virtual ~CPDF_Function();\n    FX_BOOL\t\tCall(FX_FLOAT* inputs, int ninputs, FX_FLOAT* results, int& nresults) const;\n    int\t\t\tCountInputs()\n    {\n        return m_nInputs;\n    }\n    int\t\t\tCountOutputs()\n    {\n        return m_nOutputs;\n    }\nprotected:\n    CPDF_Function();\n    int\t\t\tm_nInputs, m_nOutputs;\n    FX_FLOAT*\tm_pDomains;\n    FX_FLOAT*\tm_pRanges;\n    FX_BOOL\t\tInit(CPDF_Object* pObj);\n    virtual FX_BOOL\tv_Init(CPDF_Object* pObj) = 0;\n    virtual FX_BOOL\tv_Call(FX_FLOAT* inputs, FX_FLOAT* results) const = 0;\n};\nclass CPDF_IccProfile : public CFX_Object\n{\npublic:\n    CPDF_IccProfile(FX_LPCBYTE pData, FX_DWORD dwSize, int nComponents);\n    ~CPDF_IccProfile();\n    FX_BOOL\t\t\t\t\tm_bsRGB;\n    FX_LPVOID\t\t\t\tm_pTransform;\n};\nclass CPDF_DeviceCS : public CPDF_ColorSpace\n{\npublic:\n    CPDF_DeviceCS(int family);\n    virtual FX_BOOL\tGetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;\n    FX_BOOL\tSetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;\n    FX_BOOL\tv_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const;\n    FX_BOOL\tv_SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const;\n    virtual void\tTranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;\n};\nclass CPDF_PatternCS : public CPDF_ColorSpace\n{\npublic:\n    CPDF_PatternCS();\n    ~CPDF_PatternCS();\n    virtual FX_BOOL\t\tv_Load(CPDF_Document* pDoc, CPDF_Array* pArray);\n    virtual FX_BOOL\t\tGetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;\n    virtual CPDF_ColorSpace*\tGetBaseCS() const\n    {\n        return m_pBaseCS;\n    }\n    CPDF_ColorSpace*\tm_pBaseCS;\n};\n#define\tMAX_PAGE_OBJECTS_UNIFY_NAMING\t\t\t\t4096\nclass CPDF_ResourceNaming : public CFX_Object\n{\npublic:\n    struct _NamingState : public CFX_Object {\n        CFX_ByteString\tm_Prefix;\n        int\t\t\t\tm_nIndex;\n    };\n    ~CPDF_ResourceNaming();\n    CFX_ByteString\t\tGetName(const CPDF_Dictionary* pResList, FX_LPCSTR szType);\nprotected:\n    CFX_MapByteStringToPtr\tm_NamingCache;\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_parser/filters_int.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nclass CPDF_DecryptFilter : public CFX_DataFilter\n{\npublic:\n    CPDF_DecryptFilter(CPDF_CryptoHandler* pCryptoHandler, FX_DWORD objnum, FX_DWORD gennum);\n    virtual ~CPDF_DecryptFilter();\n    virtual\tvoid\tv_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);\n    virtual void\tv_FilterFinish(CFX_BinaryBuf& dest_buf);\n    CPDF_CryptoHandler*\tm_pCryptoHandler;\n    FX_LPVOID\t\tm_pContext;\n    FX_DWORD\t\tm_ObjNum, m_GenNum;\n};\nclass CPDF_FlateFilter : public CFX_DataFilter\n{\npublic:\n    CPDF_FlateFilter();\n    virtual ~CPDF_FlateFilter();\n    virtual\tvoid\tv_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);\n    virtual void\tv_FilterFinish(CFX_BinaryBuf& dest_buf) {}\n    void*\t\t\tm_pContext;\n    FX_BYTE\t\t\tm_DestBuffer[FPDF_FILTER_BUFFER_SIZE];\n};\nclass CPDF_LzwFilter : public CFX_DataFilter\n{\npublic:\n    CPDF_LzwFilter(FX_BOOL bEarlyChange);\n    virtual ~CPDF_LzwFilter() {}\n    virtual\tvoid\tv_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);\n    virtual void\tv_FilterFinish(CFX_BinaryBuf& dest_buf) {}\n    FX_BOOL\t\t\tm_bEarlyChange;\n    FX_DWORD\t\tm_CodeArray[5021];\n    FX_DWORD\t\tm_nCodes;\n    FX_DWORD\t\tm_CodeLen;\n    FX_DWORD\t\tm_OldCode;\n    FX_BYTE\t\t\tm_LastChar;\n    FX_DWORD\t\tm_nLeftBits, m_LeftBits;\n    FX_BYTE\t\t\tm_DecodeStack[4000];\n    FX_DWORD\t\tm_StackLen;\n    void\t\t\tAddCode(FX_DWORD prefix_code, FX_BYTE append_char);\n    void\t\t\tDecodeString(FX_DWORD code);\n};\nclass CPDF_PredictorFilter : public CFX_DataFilter\n{\npublic:\n    CPDF_PredictorFilter(int predictor, int colors, int bpc, int cols);\n    virtual ~CPDF_PredictorFilter();\n    virtual\tvoid\tv_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);\n    virtual void\tv_FilterFinish(CFX_BinaryBuf& dest_buf) {}\n    FX_BOOL\t\t\tm_bTiff;\n    FX_DWORD\t\tm_Pitch, m_Bpp;\n    FX_LPBYTE\t\tm_pRefLine, m_pCurLine;\n    FX_DWORD\t\tm_iLine, m_LineInSize;\n};\nclass CPDF_AsciiHexFilter : public CFX_DataFilter\n{\npublic:\n    CPDF_AsciiHexFilter();\n    virtual ~CPDF_AsciiHexFilter() {}\n    virtual\tvoid\tv_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);\n    virtual void\tv_FilterFinish(CFX_BinaryBuf& dest_buf) {}\n    int\t\t\t\tm_State;\n    int\t\t\t\tm_FirstDigit;\n};\nclass CPDF_Ascii85Filter : public CFX_DataFilter\n{\npublic:\n    CPDF_Ascii85Filter();\n    virtual ~CPDF_Ascii85Filter() {}\n    virtual\tvoid\tv_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);\n    virtual void\tv_FilterFinish(CFX_BinaryBuf& dest_buf) {}\n    int\t\t\t\tm_State;\n    int\t\t\t\tm_CharCount;\n    FX_DWORD\t\tm_CurDWord;\n};\nclass CPDF_RunLenFilter : public CFX_DataFilter\n{\npublic:\n    CPDF_RunLenFilter();\n    virtual ~CPDF_RunLenFilter() {}\n    virtual\tvoid\tv_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);\n    virtual void\tv_FilterFinish(CFX_BinaryBuf& dest_buf) {}\n    int\t\t\t\tm_State;\n    FX_DWORD\t\tm_Count;\n};\nclass CPDF_JpegFilter : public CFX_DataFilter\n{\npublic:\n    CPDF_JpegFilter();\n    virtual ~CPDF_JpegFilter();\n    virtual\tvoid\tv_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);\n    virtual void\tv_FilterFinish(CFX_BinaryBuf& dest_buf) {}\n    void*\t\t\tm_pContext;\n    CFX_BinaryBuf\tm_InputBuf;\n    FX_LPBYTE\t\tm_pScanline;\n    int\t\t\t\tm_Pitch, m_Height, m_Width, m_nComps, m_iLine;\n    FX_BOOL\t\t\tm_bGotHeader;\n};\nclass CPDF_FaxFilter : public CFX_DataFilter\n{\npublic:\n    CPDF_FaxFilter();\n    virtual ~CPDF_FaxFilter();\n    FX_BOOL\t\t\tInitialize(int Encoding, int bEndOfLine, int bByteAlign, int bBlack, int nRows, int nColumns);\n    virtual\tvoid\tv_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);\n    virtual void\tv_FilterFinish(CFX_BinaryBuf& dest_buf);\n    int\t\t\t\tm_Encoding, m_bEndOfLine, m_bByteAlign, m_bBlack;\n    int\t\t\t\tm_nRows, m_nColumns, m_Pitch, m_iRow;\n    FX_LPBYTE\t\tm_pScanlineBuf, m_pRefBuf;\n    CFX_BinaryBuf\tm_InputBuf;\n    int\t\t\t\tm_InputBitPos;\n    void\t\t\tProcessData(FX_LPCBYTE src_buf, FX_DWORD src_size, int& bitpos, FX_BOOL bFinish,\n                                CFX_BinaryBuf& dest_buf);\n    FX_BOOL\t\t\tReadLine(FX_LPCBYTE src_buf, int bitsize, int& bitpos);\n};\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_parser.h\"\n#include \"../../../include/fpdfapi/fpdf_module.h\"\n#include \"../../../include/fxcodec/fx_codec.h\"\n#include <limits.h>\n#define _STREAM_MAX_SIZE_\t\t20 * 1024 * 1024\nFX_DWORD _A85Decode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)\n{\n    dest_size = 0;\n    dest_buf = NULL;\n    if (src_size == 0) {\n        return 0;\n    }\n    FX_DWORD zcount = 0;\n    FX_DWORD pos = 0;\n    while (pos < src_size) {\n        FX_BYTE ch = src_buf[pos];\n        if (ch < '!' && ch != '\\n' && ch != '\\r' && ch != ' ' && ch != '\\t') {\n            break;\n        }\n        if (ch == 'z') {\n            zcount ++;\n        } else if (ch > 'u') {\n            break;\n        }\n        pos ++;\n    }\n    if (pos == 0) {\n        return 0;\n    }\n    if (zcount > UINT_MAX / 4) {\n        return (FX_DWORD) - 1;\n    }\n    if (zcount * 4 > UINT_MAX - (pos - zcount)) {\n        return (FX_DWORD) - 1;\n    }\n    dest_buf = FX_Alloc(FX_BYTE, zcount * 4 + (pos - zcount));\n    if (dest_buf == NULL) {\n        return (FX_DWORD) - 1;\n    }\n    int state = 0;\n    FX_UINT32 res = 0;\n    pos = dest_size = 0;\n    while (pos < src_size) {\n        FX_BYTE ch = src_buf[pos++];\n        if (ch == '\\n' || ch == '\\r' || ch == ' ' || ch == '\\t') {\n            continue;\n        }\n        if (ch == 'z') {\n            FXSYS_memset32(dest_buf + dest_size, 0, 4);\n            state = 0;\n            res = 0;\n            dest_size += 4;\n        } else {\n            if (ch < '!' || ch > 'u') {\n                break;\n            }\n            res = res * 85 + ch - 33;\n            state ++;\n            if (state == 5) {\n                for (int i = 0; i < 4; i ++) {\n                    dest_buf[dest_size++] = (FX_BYTE)(res >> (3 - i) * 8);\n                }\n                state = 0;\n                res = 0;\n            }\n        }\n    }\n    if (state) {\n        int i;\n        for (i = state; i < 5; i ++) {\n            res = res * 85 + 84;\n        }\n        for (i = 0; i < state - 1; i ++) {\n            dest_buf[dest_size++] = (FX_BYTE)(res >> (3 - i) * 8);\n        }\n    }\n    if (pos < src_size && src_buf[pos] == '>') {\n        pos ++;\n    }\n    return pos;\n}\nFX_DWORD _HexDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)\n{\n    FX_DWORD i;\n    for (i = 0; i < src_size; i ++)\n        if (src_buf[i] == '>') {\n            break;\n        }\n    dest_buf = FX_Alloc( FX_BYTE, i / 2 + 1);\n    dest_size = 0;\n    FX_BOOL bFirstDigit = TRUE;\n    for (i = 0; i < src_size; i ++) {\n        FX_BYTE ch = src_buf[i];\n        if (ch == ' ' || ch == '\\n' || ch == '\\t' || ch == '\\r') {\n            continue;\n        }\n        int digit;\n        if (ch <= '9' && ch >= '0') {\n            digit = ch - '0';\n        } else if (ch <= 'f' && ch >= 'a') {\n            digit = ch - 'a' + 10;\n        } else if (ch <= 'F' && ch >= 'A') {\n            digit = ch - 'A' + 10;\n        } else if (ch == '>') {\n            i ++;\n            break;\n        } else {\n            continue;\n        }\n        if (bFirstDigit) {\n            dest_buf[dest_size] = digit * 16;\n        } else {\n            dest_buf[dest_size ++] += digit;\n        }\n        bFirstDigit = !bFirstDigit;\n    }\n    if (!bFirstDigit) {\n        dest_size ++;\n    }\n    return i;\n}\nFX_DWORD RunLengthDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)\n{\n    FX_DWORD i = 0;\n    FX_DWORD old;\n    dest_size = 0;\n    while (i < src_size) {\n        if (src_buf[i] < 128) {\n            old = dest_size;\n            dest_size += src_buf[i] + 1;\n            if (dest_size < old) {\n                return (FX_DWORD) - 1;\n            }\n            i += src_buf[i] + 2;\n        } else if (src_buf[i] > 128) {\n            old = dest_size;\n            dest_size += 257 - src_buf[i];\n            if (dest_size < old) {\n                return (FX_DWORD) - 1;\n            }\n            i += 2;\n        } else {\n            break;\n        }\n    }\n    if (dest_size >= _STREAM_MAX_SIZE_) {\n        return -1;\n    }\n    dest_buf = FX_Alloc( FX_BYTE, dest_size);\n    if (!dest_buf) {\n        return -1;\n    }\n    i = 0;\n    int dest_count = 0;\n    while (i < src_size) {\n        if (src_buf[i] < 128) {\n            FX_DWORD copy_len = src_buf[i] + 1;\n            FX_DWORD buf_left = src_size - i - 1;\n            if (buf_left < copy_len) {\n                FX_DWORD delta = copy_len - buf_left;\n                copy_len = buf_left;\n                FXSYS_memset8(dest_buf + dest_count + copy_len, '\\0', delta);\n            }\n            FXSYS_memcpy32(dest_buf + dest_count, src_buf + i + 1, copy_len);\n            dest_count += src_buf[i] + 1;\n            i += src_buf[i] + 2;\n        } else if (src_buf[i] > 128) {\n            int fill = 0;\n            if (i < src_size - 1) {\n                fill = src_buf[i + 1];\n            }\n            FXSYS_memset8(dest_buf + dest_count, fill, 257 - src_buf[i]);\n            dest_count += 257 - src_buf[i];\n            i += 2;\n        } else {\n            break;\n        }\n    }\n    FX_DWORD ret = i + 1;\n    if (ret > src_size) {\n        ret = src_size;\n    }\n    return ret;\n}\nICodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,\n        const CPDF_Dictionary* pParams)\n{\n    int K = 0;\n    FX_BOOL EndOfLine = FALSE;\n    FX_BOOL ByteAlign = FALSE;\n    FX_BOOL BlackIs1 = FALSE;\n    int Columns = 1728;\n    int Rows = 0;\n    if (pParams) {\n        K = pParams->GetInteger(FX_BSTRC(\"K\"));\n        EndOfLine = pParams->GetInteger(FX_BSTRC(\"EndOfLine\"));\n        ByteAlign = pParams->GetInteger(FX_BSTRC(\"EncodedByteAlign\"));\n        BlackIs1 = pParams->GetInteger(FX_BSTRC(\"BlackIs1\"));\n        Columns = pParams->GetInteger(FX_BSTRC(\"Columns\"), 1728);\n        Rows = pParams->GetInteger(FX_BSTRC(\"Rows\"));\n        if (Rows > USHRT_MAX) {\n            Rows = 0;\n        }\n        if (Columns <= 0 || Rows < 0 || Columns > USHRT_MAX || Rows > USHRT_MAX) {\n            return NULL;\n        }\n    }\n    return CPDF_ModuleMgr::Get()->GetFaxModule()->CreateDecoder(src_buf, src_size, width, height,\n            K, EndOfLine, ByteAlign, BlackIs1, Columns, Rows);\n}\nstatic FX_BOOL CheckFlateDecodeParams(int Colors, int BitsPerComponent, int Columns)\n{\n    if (Columns < 0) {\n        return FALSE;\n    }\n    int check = Columns;\n    if (Colors < 0 || (check > 0 && Colors > INT_MAX / check)) {\n        return FALSE;\n    }\n    check *= Colors;\n    if (BitsPerComponent < 0 ||\n            (check > 0 && BitsPerComponent > INT_MAX / check)) {\n        return FALSE;\n    }\n    check *= BitsPerComponent;\n    if (check > INT_MAX - 7) {\n        return FALSE;\n    }\n    return TRUE;\n}\nICodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,\n        int nComps, int bpc, const CPDF_Dictionary* pParams)\n{\n    int predictor = 0;\n    FX_BOOL bEarlyChange = TRUE;\n    int Colors = 0, BitsPerComponent = 0, Columns = 0;\n    if (pParams) {\n        predictor = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC(\"Predictor\"));\n        bEarlyChange = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC(\"EarlyChange\"), 1);\n        Colors = pParams->GetInteger(FX_BSTRC(\"Colors\"), 1);\n        BitsPerComponent = pParams->GetInteger(FX_BSTRC(\"BitsPerComponent\"), 8);\n        Columns = pParams->GetInteger(FX_BSTRC(\"Columns\"), 1);\n        if (!CheckFlateDecodeParams(Colors, BitsPerComponent, Columns)) {\n            return NULL;\n        }\n    }\n    return CPDF_ModuleMgr::Get()->GetFlateModule()->CreateDecoder(src_buf, src_size, width, height,\n            nComps, bpc, predictor, Colors, BitsPerComponent, Columns);\n}\nFX_DWORD FPDFAPI_FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, CPDF_Dictionary* pParams,\n                                  FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)\n{\n    int predictor = 0;\n    FX_BOOL bEarlyChange = TRUE;\n    int Colors = 0, BitsPerComponent = 0, Columns = 0;\n    if (pParams) {\n        predictor = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC(\"Predictor\"));\n        bEarlyChange = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC(\"EarlyChange\"), 1);\n        Colors = pParams->GetInteger(FX_BSTRC(\"Colors\"), 1);\n        BitsPerComponent = pParams->GetInteger(FX_BSTRC(\"BitsPerComponent\"), 8);\n        Columns = pParams->GetInteger(FX_BSTRC(\"Columns\"), 1);\n        if (!CheckFlateDecodeParams(Colors, BitsPerComponent, Columns)) {\n            return (FX_DWORD) - 1;\n        }\n    }\n    return CPDF_ModuleMgr::Get()->GetFlateModule()->FlateOrLZWDecode(bLZW, src_buf, src_size,\n            bEarlyChange, predictor, Colors, BitsPerComponent, Columns, estimated_size,\n            dest_buf, dest_size);\n}\nFX_BOOL PDF_DataDecode(FX_LPCBYTE src_buf, FX_DWORD src_size, const CPDF_Dictionary* pDict,\n                       FX_LPBYTE& dest_buf, FX_DWORD& dest_size, CFX_ByteString& ImageEncoding,\n                       CPDF_Dictionary*& pImageParms, FX_DWORD last_estimated_size, FX_BOOL bImageAcc)\n\n{\n    CPDF_Object* pDecoder = pDict ? pDict->GetElementValue(FX_BSTRC(\"Filter\")) : NULL;\n    if (pDecoder == NULL || (pDecoder->GetType() != PDFOBJ_ARRAY && pDecoder->GetType() != PDFOBJ_NAME)) {\n        return FALSE;\n    }\n    CPDF_Object* pParams = pDict ? pDict->GetElementValue(FX_BSTRC(\"DecodeParms\")) : NULL;\n    CFX_ByteStringArray DecoderList;\n    CFX_PtrArray ParamList;\n    if (pDecoder->GetType() == PDFOBJ_ARRAY) {\n        if (pParams && pParams->GetType() != PDFOBJ_ARRAY) {\n            pParams = NULL;\n        }\n        CPDF_Array* pDecoders = (CPDF_Array*)pDecoder;\n        for (FX_DWORD i = 0; i < pDecoders->GetCount(); i ++) {\n            CFX_ByteStringC str = pDecoders->GetConstString(i);\n            DecoderList.Add(str);\n            if (pParams) {\n                ParamList.Add(((CPDF_Array*)pParams)->GetDict(i));\n            } else {\n                ParamList.Add(NULL);\n            }\n        }\n    } else {\n        DecoderList.Add(pDecoder->GetConstString());\n        ParamList.Add(pParams ? pParams->GetDict() : NULL);\n    }\n    FX_LPBYTE last_buf = (FX_LPBYTE)src_buf;\n    FX_DWORD last_size = src_size;\n    for (int i = 0; i < DecoderList.GetSize(); i ++) {\n        int estimated_size = i == DecoderList.GetSize() - 1 ? last_estimated_size : 0;\n        CFX_ByteString decoder = DecoderList[i];\n        CPDF_Dictionary* pParam = (CPDF_Dictionary*)ParamList[i];\n        FX_LPBYTE new_buf = NULL;\n        FX_DWORD new_size = (FX_DWORD) - 1;\n        int offset = -1;\n        if (decoder == FX_BSTRC(\"FlateDecode\") || decoder == FX_BSTRC(\"Fl\")) {\n            if (bImageAcc && i == DecoderList.GetSize() - 1) {\n                ImageEncoding = FX_BSTRC(\"FlateDecode\");\n                dest_buf = (FX_LPBYTE)last_buf;\n                dest_size = last_size;\n                pImageParms = pParam;\n                return TRUE;\n            } else {\n                offset = FPDFAPI_FlateOrLZWDecode(FALSE, last_buf, last_size, pParam, estimated_size, new_buf, new_size);\n            }\n        } else if (decoder == FX_BSTRC(\"LZWDecode\") || decoder == FX_BSTRC(\"LZW\")) {\n            offset = FPDFAPI_FlateOrLZWDecode(TRUE, last_buf, last_size, pParam, estimated_size, new_buf, new_size);\n        } else if (decoder == FX_BSTRC(\"ASCII85Decode\") || decoder == FX_BSTRC(\"A85\")) {\n            offset = _A85Decode(last_buf, last_size, new_buf, new_size);\n        } else if (decoder == FX_BSTRC(\"ASCIIHexDecode\") || decoder == FX_BSTRC(\"AHx\")) {\n            offset = _HexDecode(last_buf, last_size, new_buf, new_size);\n        } else if (decoder == FX_BSTRC(\"RunLengthDecode\") || decoder == FX_BSTRC(\"RL\")) {\n            if (bImageAcc && i == DecoderList.GetSize() - 1) {\n                ImageEncoding = FX_BSTRC(\"RunLengthDecode\");\n                dest_buf = (FX_LPBYTE)last_buf;\n                dest_size = last_size;\n                pImageParms = pParam;\n                return TRUE;\n            }\n            offset = RunLengthDecode(last_buf, last_size, new_buf, new_size);\n        } else {\n            if (decoder == FX_BSTRC(\"DCT\")) {\n                decoder = \"DCTDecode\";\n            } else if (decoder == FX_BSTRC(\"CCF\")) {\n                decoder = \"CCITTFaxDecode\";\n            } else if (decoder == FX_BSTRC(\"Crypt\")) {\n                continue;\n            }\n            ImageEncoding = decoder;\n            pImageParms = pParam;\n            dest_buf = (FX_LPBYTE)last_buf;\n            dest_size = last_size;\n            return TRUE;\n        }\n        if (last_buf != src_buf) {\n            FX_Free(last_buf);\n        }\n        if (offset == -1) {\n            return FALSE;\n        }\n        last_buf = new_buf;\n        last_size = new_size;\n    }\n    ImageEncoding = \"\";\n    pImageParms = NULL;\n    dest_buf = last_buf;\n    dest_size = last_size;\n    return TRUE;\n}\nextern const FX_WORD PDFDocEncoding[256] = {\n    0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009,\n    0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013,\n    0x0014, 0x0015, 0x0016, 0x0017, 0x02d8, 0x02c7, 0x02c6, 0x02d9, 0x02dd, 0x02db,\n    0x02da, 0x02dc, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,\n    0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031,\n    0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b,\n    0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045,\n    0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,\n    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,\n    0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063,\n    0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d,\n    0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,\n    0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000, 0x2022, 0x2020,\n    0x2021, 0x2026, 0x2014, 0x2013, 0x0192, 0x2044, 0x2039, 0x203a, 0x2212, 0x2030,\n    0x201e, 0x201c, 0x201d, 0x2018, 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x0141,\n    0x0152, 0x0160, 0x0178, 0x017d, 0x0131, 0x0142, 0x0153, 0x0161, 0x017e, 0x0000,\n    0x20ac, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9,\n    0x00aa, 0x00ab, 0x00ac, 0x0000, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3,\n    0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd,\n    0x00be, 0x00bf, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,\n    0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x00d0, 0x00d1,\n    0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db,\n    0x00dc, 0x00dd, 0x00de, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5,\n    0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,\n    0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9,\n    0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff\n};\nCFX_WideString PDF_DecodeText(FX_LPCBYTE src_data, FX_DWORD src_len, CFX_CharMap* pCharMap)\n{\n    CFX_WideString result;\n    if (src_len >= 2 && ((src_data[0] == 0xfe && src_data[1] == 0xff) || (src_data[0] == 0xff && src_data[1] == 0xfe))) {\n        FX_BOOL bBE = src_data[0] == 0xfe;\n        FX_DWORD max_chars = (src_len - 2) / 2;\n        if (!max_chars) {\n            return result;\n        }\n        if (src_data[0] == 0xff) {\n            bBE = !src_data[2];\n        }\n        FX_LPWSTR dest_buf = result.GetBuffer(max_chars);\n        FX_LPCBYTE uni_str = src_data + 2;\n        int dest_pos = 0;\n        for (FX_DWORD i = 0; i < max_chars * 2; i += 2) {\n            FX_WORD unicode = bBE ? (uni_str[i] << 8 | uni_str[i + 1]) : (uni_str[i + 1] << 8 | uni_str[i]);\n            if (unicode == 0x1b) {\n                i += 2;\n                while (i < max_chars * 2) {\n                    FX_WORD unicode = bBE ? (uni_str[i] << 8 | uni_str[i + 1]) : (uni_str[i + 1] << 8 | uni_str[i]);\n                    i += 2;\n                    if (unicode == 0x1b) {\n                        break;\n                    }\n                }\n            } else {\n                dest_buf[dest_pos++] = unicode;\n            }\n        }\n        result.ReleaseBuffer(dest_pos);\n    } else if (pCharMap == NULL) {\n        FX_LPWSTR dest_buf = result.GetBuffer(src_len);\n        for (FX_DWORD i = 0; i < src_len; i ++) {\n            dest_buf[i] = PDFDocEncoding[src_data[i]];\n        }\n        result.ReleaseBuffer(src_len);\n    } else {\n        return (*pCharMap->m_GetWideString)(pCharMap, CFX_ByteString((FX_LPCSTR)src_data, src_len));\n    }\n    return result;\n}\nCFX_WideString PDF_DecodeText(const CFX_ByteString& bstr, CFX_CharMap* pCharMap)\n{\n    return PDF_DecodeText((FX_LPCBYTE)(FX_LPCSTR)bstr, bstr.GetLength(), pCharMap);\n}\nCFX_ByteString PDF_EncodeText(FX_LPCWSTR pString, int len, CFX_CharMap* pCharMap)\n{\n    if (len == -1) {\n        len = (FX_STRSIZE)FXSYS_wcslen(pString);\n    }\n    CFX_ByteString result;\n    if (pCharMap == NULL) {\n        FX_LPSTR dest_buf1 = result.GetBuffer(len);\n        int i;\n        for (i = 0; i < len; i ++) {\n            int code;\n            for (code = 0; code < 256; code ++)\n                if (PDFDocEncoding[code] == pString[i]) {\n                    break;\n                }\n            if (code == 256) {\n                break;\n            }\n            dest_buf1[i] = code;\n        }\n        result.ReleaseBuffer(i);\n        if (i == len) {\n            return result;\n        }\n    }\n\n    if(len > INT_MAX/2-1)\n    {\n        result.ReleaseBuffer(0);\n        return result;\n    }\n\n    int encLen = len * 2 + 2;\n\n    FX_LPBYTE dest_buf2 = (FX_LPBYTE)result.GetBuffer(encLen);\n    dest_buf2[0] = 0xfe;\n    dest_buf2[1] = 0xff;\n    dest_buf2 += 2;\n    for (int i = 0; i < len; i ++) {\n        *dest_buf2++ = pString[i] >> 8;\n        *dest_buf2++ = (FX_BYTE)pString[i];\n    }\n    result.ReleaseBuffer(encLen);\n    return result;\n}\nCFX_ByteString PDF_EncodeString(const CFX_ByteString& src, FX_BOOL bHex)\n{\n    CFX_ByteTextBuf result;\n    int srclen = src.GetLength();\n    if (bHex) {\n        result.AppendChar('<');\n        for (int i = 0; i < srclen; i ++) {\n            result.AppendChar(\"0123456789ABCDEF\"[src[i] / 16]);\n            result.AppendChar(\"0123456789ABCDEF\"[src[i] % 16]);\n        }\n        result.AppendChar('>');\n        return result.GetByteString();\n    }\n    result.AppendChar('(');\n    for (int i = 0; i < srclen; i ++) {\n        FX_BYTE ch = src[i];\n        if (ch == ')' || ch == '\\\\' || ch == '(') {\n            result.AppendChar('\\\\');\n        } else if (ch == 0x0a) {\n            result << FX_BSTRC(\"\\\\n\");\n            continue;\n        } else if (ch == 0x0d) {\n            result << FX_BSTRC(\"\\\\r\");\n            continue;\n        }\n        result.AppendChar(ch);\n    }\n    result.AppendChar(')');\n    return result.GetByteString();\n}\nvoid FlateEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)\n{\n    CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule();\n    if (pEncoders) {\n        pEncoders->GetFlateModule()->Encode(src_buf, src_size, dest_buf, dest_size);\n    }\n}\nvoid FlateEncode(FX_LPCBYTE src_buf, FX_DWORD src_size, int predictor, int Colors, int BitsPerComponent, int Columns,\n                 FX_LPBYTE& dest_buf, FX_DWORD& dest_size)\n{\n    CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule();\n    if (pEncoders) {\n        pEncoders->GetFlateModule()->Encode(src_buf, src_size, predictor, Colors, BitsPerComponent, Columns, dest_buf, dest_size);\n    }\n}\nFX_DWORD FlateDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)\n{\n    CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule();\n    if (pEncoders) {\n        return pEncoders->GetFlateModule()->FlateOrLZWDecode(FALSE, src_buf, src_size, FALSE, 0, 0, 0, 0, 0, dest_buf, dest_size);\n    }\n    return 0;\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_parser.h\"\n#include \"../../../include/fpdfapi/fpdf_module.h\"\nextern FX_LPVOID PDFPreviewInitCache(CPDF_Document* pDoc);\nextern void PDFPreviewClearCache(FX_LPVOID pCache);\nCPDF_Document::CPDF_Document(IPDF_DocParser* pParser) : CPDF_IndirectObjects(pParser)\n{\n    ASSERT(pParser != NULL);\n    m_pRootDict = NULL;\n    m_pInfoDict = NULL;\n    m_bLinearized = FALSE;\n    m_dwFirstPageNo = 0;\n    m_dwFirstPageObjNum = 0;\n    m_pDocPage = CPDF_ModuleMgr::Get()->GetPageModule()->CreateDocData(this);\n    m_pDocRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreateDocData(this);\n}\nCPDF_DocPageData* CPDF_Document::GetValidatePageData()\n{\n    if (m_pDocPage) {\n        return m_pDocPage;\n    }\n    m_pDocPage = CPDF_ModuleMgr::Get()->GetPageModule()->CreateDocData(this);\n    return m_pDocPage;\n}\nCPDF_DocRenderData* CPDF_Document::GetValidateRenderData()\n{\n    if (m_pDocRender) {\n        return m_pDocRender;\n    }\n    m_pDocRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreateDocData(this);\n    return m_pDocRender;\n}\nvoid CPDF_Document::LoadDoc()\n{\n    m_LastObjNum = m_pParser->GetLastObjNum();\n    CPDF_Object* pRootObj = GetIndirectObject(m_pParser->GetRootObjNum());\n    if (pRootObj == NULL) {\n        return;\n    }\n    m_pRootDict = pRootObj->GetDict();\n    if (m_pRootDict == NULL) {\n        return;\n    }\n    CPDF_Object* pInfoObj = GetIndirectObject(m_pParser->GetInfoObjNum());\n    if (pInfoObj) {\n        m_pInfoDict = pInfoObj->GetDict();\n    }\n    CPDF_Array* pIDArray = m_pParser->GetIDArray();\n    if (pIDArray) {\n        m_ID1 = pIDArray->GetString(0);\n        m_ID2 = pIDArray->GetString(1);\n    }\n    m_PageList.SetSize(_GetPageCount());\n}\nvoid CPDF_Document::LoadAsynDoc(CPDF_Dictionary *pLinearized)\n{\n    m_bLinearized = TRUE;\n    m_LastObjNum = m_pParser->GetLastObjNum();\n    CPDF_Object* indirectObj = GetIndirectObject(m_pParser->GetRootObjNum());\n    m_pRootDict = indirectObj ? indirectObj->GetDict() : NULL;\n    if (m_pRootDict == NULL) {\n        return;\n    }\n    indirectObj = GetIndirectObject(m_pParser->GetInfoObjNum());\n    m_pInfoDict = indirectObj ? indirectObj->GetDict() : NULL;\n    CPDF_Array* pIDArray = m_pParser->GetIDArray();\n    if (pIDArray) {\n        m_ID1 = pIDArray->GetString(0);\n        m_ID2 = pIDArray->GetString(1);\n    }\n    FX_DWORD dwPageCount = 0;\n    CPDF_Object *pCount = pLinearized->GetElement(FX_BSTRC(\"N\"));\n    if (pCount && pCount->GetType() == PDFOBJ_NUMBER) {\n        dwPageCount = pCount->GetInteger();\n    }\n    m_PageList.SetSize(dwPageCount);\n    CPDF_Object *pNo = pLinearized->GetElement(FX_BSTRC(\"P\"));\n    if (pNo && pNo->GetType() == PDFOBJ_NUMBER) {\n        m_dwFirstPageNo = pNo->GetInteger();\n    }\n    CPDF_Object *pObjNum = pLinearized->GetElement(FX_BSTRC(\"O\"));\n    if (pObjNum && pObjNum->GetType() == PDFOBJ_NUMBER) {\n        m_dwFirstPageObjNum = pObjNum->GetInteger();\n    }\n}\nvoid CPDF_Document::LoadPages()\n{\n    m_PageList.SetSize(_GetPageCount());\n}\nextern void FPDF_TTFaceMapper_ReleaseDoc(CPDF_Document*);\nCPDF_Document::~CPDF_Document()\n{\n    if (m_pDocRender) {\n        CPDF_ModuleMgr::Get()->GetRenderModule()->DestroyDocData(m_pDocRender);\n    }\n    if (m_pDocPage) {\n        CPDF_ModuleMgr::Get()->GetPageModule()->ReleaseDoc(this);\n        CPDF_ModuleMgr::Get()->GetPageModule()->ClearStockFont(this);\n    }\n}\n#define\t\tFX_MAX_PAGE_LEVEL\t\t\t1024\nCPDF_Dictionary* CPDF_Document::_FindPDFPage(CPDF_Dictionary* pPages, int iPage, int nPagesToGo, int level)\n{\n    CPDF_Array* pKidList = pPages->GetArray(FX_BSTRC(\"Kids\"));\n    if (pKidList == NULL) {\n        if (nPagesToGo == 0) {\n            return pPages;\n        }\n        return NULL;\n    }\n    if (level >= FX_MAX_PAGE_LEVEL) {\n        return NULL;\n    }\n    int nKids = pKidList->GetCount();\n    for (int i = 0; i < nKids; i ++) {\n        CPDF_Dictionary* pKid = pKidList->GetDict(i);\n        if (pKid == NULL) {\n            nPagesToGo --;\n            continue;\n        }\n        if (pKid == pPages) {\n            continue;\n        }\n        if (!pKid->KeyExist(FX_BSTRC(\"Kids\"))) {\n            if (nPagesToGo == 0) {\n                return pKid;\n            }\n            m_PageList.SetAt(iPage - nPagesToGo, pKid->GetObjNum());\n            nPagesToGo --;\n        } else {\n            int nPages = pKid->GetInteger(FX_BSTRC(\"Count\"));\n            if (nPagesToGo < nPages) {\n                return _FindPDFPage(pKid, iPage, nPagesToGo, level + 1);\n            }\n            nPagesToGo -= nPages;\n        }\n    }\n    return NULL;\n}\nCPDF_Dictionary* CPDF_Document::GetPage(int iPage)\n{\n    if (iPage < 0 || iPage >= m_PageList.GetSize()) {\n        return NULL;\n    }\n    if (m_bLinearized && (iPage == (int)m_dwFirstPageNo)) {\n        CPDF_Object* pObj = GetIndirectObject(m_dwFirstPageObjNum);\n        if (pObj && pObj->GetType() == PDFOBJ_DICTIONARY) {\n            return (CPDF_Dictionary*)pObj;\n        }\n    }\n    int objnum = m_PageList.GetAt(iPage);\n    if (objnum) {\n        CPDF_Object* pObj = GetIndirectObject(objnum);\n        ASSERT(pObj->GetType() == PDFOBJ_DICTIONARY);\n        return (CPDF_Dictionary*)pObj;\n    }\n    CPDF_Dictionary* pRoot = GetRoot();\n    if (pRoot == NULL) {\n        return NULL;\n    }\n    CPDF_Dictionary* pPages = pRoot->GetDict(FX_BSTRC(\"Pages\"));\n    if (pPages == NULL) {\n        return NULL;\n    }\n    CPDF_Dictionary* pPage = _FindPDFPage(pPages, iPage, iPage, 0);\n    if (pPage == NULL) {\n        return NULL;\n    }\n    m_PageList.SetAt(iPage, pPage->GetObjNum());\n    return pPage;\n}\nint CPDF_Document::_FindPageIndex(CPDF_Dictionary* pNode, FX_DWORD& skip_count, FX_DWORD objnum, int& index, int level)\n{\n    if (pNode->KeyExist(FX_BSTRC(\"Kids\"))) {\n        CPDF_Array* pKidList = pNode->GetArray(FX_BSTRC(\"Kids\"));\n        if (pKidList == NULL) {\n            return -1;\n        }\n        if (level >= FX_MAX_PAGE_LEVEL) {\n            return -1;\n        }\n        FX_DWORD count = pNode->GetInteger(FX_BSTRC(\"Count\"));\n        if (count <= skip_count) {\n            skip_count -= count;\n            index += count;\n            return -1;\n        }\n        if (count && count == pKidList->GetCount()) {\n            for (FX_DWORD i = 0; i < count; i ++) {\n                CPDF_Reference* pKid = (CPDF_Reference*)pKidList->GetElement(i);\n                if (pKid && pKid->GetType() == PDFOBJ_REFERENCE) {\n                    if (pKid->GetRefObjNum() == objnum) {\n                        m_PageList.SetAt(index + i, objnum);\n                        return index + i;\n                    }\n                }\n            }\n        }\n        for (FX_DWORD i = 0; i < pKidList->GetCount(); i ++) {\n            CPDF_Dictionary* pKid = pKidList->GetDict(i);\n            if (pKid == NULL) {\n                continue;\n            }\n            if (pKid == pNode) {\n                continue;\n            }\n            int found_index = _FindPageIndex(pKid, skip_count, objnum, index, level + 1);\n            if (found_index >= 0) {\n                return found_index;\n            }\n        }\n    } else {\n        if (objnum == pNode->GetObjNum()) {\n            return index;\n        }\n        if (skip_count) {\n            skip_count--;\n        }\n        index ++;\n    }\n    return -1;\n}\nint CPDF_Document::GetPageIndex(FX_DWORD objnum)\n{\n    FX_DWORD nPages = m_PageList.GetSize();\n    FX_DWORD skip_count = 0;\n    FX_BOOL bSkipped = FALSE;\n    for (FX_DWORD i = 0; i < nPages; i ++) {\n        FX_DWORD objnum1 = m_PageList.GetAt(i);\n        if (objnum1 == objnum) {\n            return i;\n        }\n        if (!bSkipped && objnum1 == 0) {\n            skip_count = i;\n            bSkipped = TRUE;\n        }\n    }\n    CPDF_Dictionary* pRoot = GetRoot();\n    if (pRoot == NULL) {\n        return -1;\n    }\n    CPDF_Dictionary* pPages = pRoot->GetDict(FX_BSTRC(\"Pages\"));\n    if (pPages == NULL) {\n        return -1;\n    }\n    int index = 0;\n    return _FindPageIndex(pPages, skip_count, objnum, index);\n}\nint CPDF_Document::GetPageCount() const\n{\n    return m_PageList.GetSize();\n}\nstatic int _CountPages(CPDF_Dictionary* pPages, int level)\n{\n    if (level > 128) {\n        return 0;\n    }\n    int count = pPages->GetInteger(FX_BSTRC(\"Count\"));\n    if (count > 0 && count < FPDF_PAGE_MAX_NUM) {\n        return count;\n    }\n    CPDF_Array* pKidList = pPages->GetArray(FX_BSTRC(\"Kids\"));\n    if (pKidList == NULL) {\n        return 0;\n    }\n    count = 0;\n    for (FX_DWORD i = 0; i < pKidList->GetCount(); i ++) {\n        CPDF_Dictionary* pKid = pKidList->GetDict(i);\n        if (pKid == NULL) {\n            continue;\n        }\n        if (!pKid->KeyExist(FX_BSTRC(\"Kids\"))) {\n            count ++;\n        } else {\n            count += _CountPages(pKid, level + 1);\n        }\n    }\n    pPages->SetAtInteger(FX_BSTRC(\"Count\"), count);\n    return count;\n}\nint CPDF_Document::_GetPageCount() const\n{\n    CPDF_Dictionary* pRoot = GetRoot();\n    if (pRoot == NULL) {\n        return 0;\n    }\n    CPDF_Dictionary* pPages = pRoot->GetDict(FX_BSTRC(\"Pages\"));\n    if (pPages == NULL) {\n        return 0;\n    }\n    if (!pPages->KeyExist(FX_BSTRC(\"Kids\"))) {\n        return 1;\n    }\n    return _CountPages(pPages, 0);\n}\nstatic FX_BOOL _EnumPages(CPDF_Dictionary* pPages, IPDF_EnumPageHandler* pHandler)\n{\n    CPDF_Array* pKidList = pPages->GetArray(FX_BSTRC(\"Kids\"));\n    if (pKidList == NULL) {\n        return pHandler->EnumPage(pPages);\n    }\n    for (FX_DWORD i = 0; i < pKidList->GetCount(); i ++) {\n        CPDF_Dictionary* pKid = pKidList->GetDict(i);\n        if (pKid == NULL) {\n            continue;\n        }\n        if (!pKid->KeyExist(FX_BSTRC(\"Kids\"))) {\n            if (!pHandler->EnumPage(pKid)) {\n                return FALSE;\n            }\n        } else {\n            return _EnumPages(pKid, pHandler);\n        }\n    }\n    return TRUE;\n}\nvoid CPDF_Document::EnumPages(IPDF_EnumPageHandler* pHandler)\n{\n    CPDF_Dictionary* pRoot = GetRoot();\n    if (pRoot == NULL) {\n        return;\n    }\n    CPDF_Dictionary* pPages = pRoot->GetDict(FX_BSTRC(\"Pages\"));\n    if (pPages == NULL) {\n        return;\n    }\n    _EnumPages(pPages, pHandler);\n}\nFX_BOOL CPDF_Document::IsContentUsedElsewhere(FX_DWORD objnum, CPDF_Dictionary* pThisPageDict)\n{\n    for (int i = 0; i < m_PageList.GetSize(); i ++) {\n        CPDF_Dictionary* pPageDict = GetPage(i);\n        if (pPageDict == pThisPageDict) {\n            continue;\n        }\n        CPDF_Object* pContents = pPageDict ? pPageDict->GetElement(FX_BSTRC(\"Contents\")) : NULL;\n        if (pContents == NULL) {\n            continue;\n        }\n        if (pContents->GetDirectType() == PDFOBJ_ARRAY) {\n            CPDF_Array* pArray = (CPDF_Array*)pContents->GetDirect();\n            for (FX_DWORD j = 0; j < pArray->GetCount(); j ++) {\n                CPDF_Reference* pRef = (CPDF_Reference*)pArray->GetElement(j);\n                if (pRef->GetRefObjNum() == objnum) {\n                    return TRUE;\n                }\n            }\n        } else if (pContents->GetObjNum() == objnum) {\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nFX_DWORD CPDF_Document::GetUserPermissions(FX_BOOL bCheckRevision) const\n{\n    if (m_pParser == NULL) {\n        return (FX_DWORD) - 1;\n    }\n    return m_pParser->GetPermissions(bCheckRevision);\n}\nFX_BOOL CPDF_Document::IsOwner() const\n{\n    if (m_pParser == NULL) {\n        return TRUE;\n    }\n    return m_pParser->IsOwner();\n}\nFX_BOOL CPDF_Document::IsFormStream(FX_DWORD objnum, FX_BOOL& bForm) const\n{\n    {\n        CPDF_Object* pObj;\n        if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, (FX_LPVOID&)pObj)) {\n            bForm = pObj->GetType() == PDFOBJ_STREAM &&\n                    ((CPDF_Stream*)pObj)->GetDict()->GetString(FX_BSTRC(\"Subtype\")) == FX_BSTRC(\"Form\");\n            return TRUE;\n        }\n    }\n    if (m_pParser == NULL) {\n        bForm = FALSE;\n        return TRUE;\n    }\n    return m_pParser->IsFormStream(objnum, bForm);\n}\nvoid CPDF_Document::ClearPageData()\n{\n    if (m_pDocPage) {\n        CPDF_ModuleMgr::Get()->GetPageModule()->ClearDoc(this);\n    }\n}\nvoid CPDF_Document::ClearRenderData()\n{\n    if (m_pDocRender) {\n        CPDF_ModuleMgr::Get()->GetRenderModule()->ClearDocData(m_pDocRender);\n    }\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_parser/fpdf_parser_encrypt.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include <time.h>\n#include \"../../../include/fpdfapi/fpdf_parser.h\"\n#include \"../../../include/fdrm/fx_crypt.h\"\nconst FX_BYTE defpasscode[32] = {\n    0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41,\n    0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08,\n    0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80,\n    0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a\n};\nvoid CalcEncryptKey(CPDF_Dictionary* pEncrypt, FX_LPCBYTE password, FX_DWORD pass_size,\n                    FX_LPBYTE key, int keylen, FX_BOOL bIgnoreMeta, CPDF_Array* pIdArray)\n{\n    int revision = pEncrypt->GetInteger(FX_BSTRC(\"R\"));\n    FX_BYTE passcode[32];\n    for (FX_DWORD i = 0; i < 32; i ++) {\n        passcode[i] = i < pass_size ? password[i] : defpasscode[i - pass_size];\n    }\n    FX_BYTE md5[100];\n    CRYPT_MD5Start(md5);\n    CRYPT_MD5Update(md5, passcode, 32);\n    CFX_ByteString okey = pEncrypt->GetString(FX_BSTRC(\"O\"));\n    CRYPT_MD5Update(md5, (FX_LPBYTE)(FX_LPCSTR)okey, okey.GetLength());\n    FX_DWORD perm = pEncrypt->GetInteger(FX_BSTRC(\"P\"));\n    CRYPT_MD5Update(md5, (FX_LPBYTE)&perm, 4);\n    if (pIdArray) {\n        CFX_ByteString id = pIdArray->GetString(0);\n        CRYPT_MD5Update(md5, (FX_LPBYTE)(FX_LPCSTR)id, id.GetLength());\n    }\n    if (!bIgnoreMeta && revision >= 3 && !pEncrypt->GetInteger(FX_BSTRC(\"EncryptMetadata\"), 1)) {\n        FX_DWORD tag = (FX_DWORD) - 1;\n        CRYPT_MD5Update(md5, (FX_LPBYTE)&tag, 4);\n    }\n    FX_BYTE digest[16];\n    CRYPT_MD5Finish(md5, digest);\n    FX_DWORD copy_len = keylen;\n    if (copy_len > sizeof(digest)) {\n        copy_len = sizeof(digest);\n    }\n    if (revision >= 3) {\n        for (int i = 0; i < 50; i ++) {\n            CRYPT_MD5Generate(digest, copy_len, digest);\n        }\n    }\n    FXSYS_memset32(key, 0, keylen);\n    FXSYS_memcpy32(key, digest, copy_len);\n}\nCPDF_CryptoHandler* CPDF_StandardSecurityHandler::CreateCryptoHandler()\n{\n    return FX_NEW CPDF_StandardCryptoHandler;\n}\ntypedef struct _PDF_CRYPTOITEM : public CFX_Object {\n    FX_INT32\tm_Cipher;\n    FX_INT32\tm_KeyLen;\n    FX_BOOL\t\tm_bChecked;\n    CPDF_StandardCryptoHandler*\tm_pCryptoHandler;\n} PDF_CRYPTOITEM;\nCPDF_StandardSecurityHandler::CPDF_StandardSecurityHandler()\n{\n    m_Version = 0;\n    m_Revision = 0;\n    m_pParser = NULL;\n    m_pEncryptDict = NULL;\n    m_bOwner = FALSE;\n    m_Permissions = 0;\n    m_Cipher = FXCIPHER_NONE;\n    m_KeyLen = 0;\n}\nCPDF_StandardSecurityHandler::~CPDF_StandardSecurityHandler()\n{\n}\nFX_BOOL CPDF_StandardSecurityHandler::OnInit(CPDF_Parser* pParser, CPDF_Dictionary* pEncryptDict)\n{\n    m_pParser = pParser;\n    if (!LoadDict(pEncryptDict)) {\n        return FALSE;\n    }\n    if (m_Cipher == FXCIPHER_NONE) {\n        return TRUE;\n    }\n    return CheckSecurity(m_KeyLen);\n}\nFX_BOOL CPDF_StandardSecurityHandler::CheckSecurity(FX_INT32 key_len)\n{\n    CFX_ByteString password = m_pParser->GetPassword();\n    if (CheckPassword(password, password.GetLength(), TRUE, m_EncryptKey, key_len)) {\n        if (password.IsEmpty()) {\n            if (!CheckPassword(password, password.GetLength(), FALSE, m_EncryptKey, key_len)) {\n                return FALSE;\n            }\n        }\n        m_bOwner = TRUE;\n        return TRUE;\n    }\n    return CheckPassword(password, password.GetLength(), FALSE, m_EncryptKey, key_len);\n}\nFX_DWORD CPDF_StandardSecurityHandler::GetPermissions()\n{\n    return m_Permissions;\n}\nstatic FX_BOOL _LoadCryptInfo(CPDF_Dictionary* pEncryptDict, FX_BSTR name, int& cipher, int& keylen)\n{\n    int Version = pEncryptDict->GetInteger(FX_BSTRC(\"V\"));\n    int Revision = pEncryptDict->GetInteger(FX_BSTRC(\"R\"));\n    cipher = FXCIPHER_RC4;\n    keylen = 0;\n    if (Version >= 4) {\n        CPDF_Dictionary* pCryptFilters = pEncryptDict->GetDict(FX_BSTRC(\"CF\"));\n        if (pCryptFilters == NULL) {\n            return FALSE;\n        }\n        if (name == FX_BSTRC(\"Identity\")) {\n            cipher = FXCIPHER_NONE;\n        } else {\n            CPDF_Dictionary* pDefFilter = pCryptFilters->GetDict(name);\n            if (pDefFilter == NULL) {\n                return FALSE;\n            }\n            int nKeyBits = 0;\n            if (Version == 4) {\n                nKeyBits = pDefFilter->GetInteger(FX_BSTRC(\"Length\"), 0);\n                if (nKeyBits == 0) {\n                    nKeyBits = pEncryptDict->GetInteger(FX_BSTRC(\"Length\"), 128);\n                }\n            } else {\n                nKeyBits = pEncryptDict->GetInteger(FX_BSTRC(\"Length\"), 256);\n            }\n            if (nKeyBits < 40) {\n                nKeyBits *= 8;\n            }\n            keylen = nKeyBits / 8;\n            CFX_ByteString cipher_name = pDefFilter->GetString(FX_BSTRC(\"CFM\"));\n            if (cipher_name == FX_BSTRC(\"AESV2\") || cipher_name == FX_BSTRC(\"AESV3\")) {\n                cipher = FXCIPHER_AES;\n            }\n        }\n    } else {\n        keylen = Version > 1 ? pEncryptDict->GetInteger(FX_BSTRC(\"Length\"), 40) / 8 : 5;\n    }\n    if (keylen > 32 || keylen < 0) {\n        return FALSE;\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_StandardSecurityHandler::LoadDict(CPDF_Dictionary* pEncryptDict)\n{\n    m_pEncryptDict = pEncryptDict;\n    m_bOwner = FALSE;\n    m_Version = pEncryptDict->GetInteger(FX_BSTRC(\"V\"));\n    m_Revision = pEncryptDict->GetInteger(FX_BSTRC(\"R\"));\n    m_Permissions = pEncryptDict->GetInteger(FX_BSTRC(\"P\"), -1);\n    if (m_Version < 4) {\n        return _LoadCryptInfo(pEncryptDict, CFX_ByteString(), m_Cipher, m_KeyLen);\n    }\n    CFX_ByteString stmf_name = pEncryptDict->GetString(FX_BSTRC(\"StmF\"));\n    CFX_ByteString strf_name = pEncryptDict->GetString(FX_BSTRC(\"StrF\"));\n    if (stmf_name != strf_name) {\n        return FALSE;\n    }\n    if (!_LoadCryptInfo(pEncryptDict, strf_name, m_Cipher, m_KeyLen)) {\n        return FALSE;\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_StandardSecurityHandler::LoadDict(CPDF_Dictionary* pEncryptDict, FX_DWORD type, int& cipher, int& key_len)\n{\n    m_pEncryptDict = pEncryptDict;\n    m_bOwner = FALSE;\n    m_Version = pEncryptDict->GetInteger(FX_BSTRC(\"V\"));\n    m_Revision = pEncryptDict->GetInteger(FX_BSTRC(\"R\"));\n    m_Permissions = pEncryptDict->GetInteger(FX_BSTRC(\"P\"), -1);\n    CFX_ByteString strf_name, stmf_name;\n    if (m_Version >= 4) {\n        stmf_name = pEncryptDict->GetString(FX_BSTRC(\"StmF\"));\n        strf_name = pEncryptDict->GetString(FX_BSTRC(\"StrF\"));\n        if (stmf_name != strf_name) {\n            return FALSE;\n        }\n    }\n    if (!_LoadCryptInfo(pEncryptDict, strf_name, cipher, key_len)) {\n        return FALSE;\n    }\n    m_Cipher = cipher;\n    m_KeyLen = key_len;\n    return TRUE;\n    return TRUE;\n}\nFX_BOOL CPDF_StandardSecurityHandler::GetCryptInfo(int& cipher, FX_LPCBYTE& buffer, int& keylen)\n{\n    cipher = m_Cipher;\n    buffer = m_EncryptKey;\n    keylen = m_KeyLen;\n    return TRUE;\n}\n#define FX_GET_32WORD(n,b,i)\t\t\t\t\t\t\t\t\\\n    {\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n        (n) = (FX_DWORD)(( (FX_UINT64) (b)[(i)] << 24 )\t\t\t\\\n                         | ( (FX_UINT64) (b)[(i) + 1] << 16 )\t\t\t\t\t\\\n                         | ( (FX_UINT64) (b)[(i) + 2] <<  8 )\t\t\t\t\t\\\n                         | ( (FX_UINT64) (b)[(i) + 3]       ));\t\t\t\t\t\\\n    }\nint BigOrder64BitsMod3(FX_LPBYTE data)\n{\n    FX_UINT64 ret = 0;\n    for (int i = 0; i < 4; ++i) {\n        FX_DWORD value;\n        FX_GET_32WORD(value, data, 4 * i);\n        ret <<= 32;\n        ret |= value;\n        ret %= 3;\n    }\n    return (int)ret;\n}\nvoid Revision6_Hash(FX_LPCBYTE password, FX_DWORD size, FX_LPCBYTE salt, FX_LPCBYTE vector, FX_LPBYTE hash)\n{\n    int iBlockSize = 32;\n    FX_BYTE sha[128];\n    CRYPT_SHA256Start(sha);\n    CRYPT_SHA256Update(sha, password, size);\n    CRYPT_SHA256Update(sha, salt, 8);\n    if (vector) {\n        CRYPT_SHA256Update(sha, vector, 48);\n    }\n    FX_BYTE digest[32];\n    CRYPT_SHA256Finish(sha, digest);\n    CFX_ByteTextBuf buf;\n    FX_LPBYTE input = digest;\n    FX_LPBYTE key = input;\n    FX_LPBYTE iv = input + 16;\n    FX_LPBYTE E = buf.GetBuffer();\n    int iBufLen = buf.GetLength();\n    CFX_ByteTextBuf interDigest;\n    int i = 0;\n    FX_LPBYTE aes = FX_Alloc(FX_BYTE, 2048);\n    while (i < 64 || i < E[iBufLen - 1]  + 32) {\n        int iRoundSize = size + iBlockSize;\n        if (vector) {\n            iRoundSize += 48;\n        }\n        iBufLen = iRoundSize * 64;\n        buf.EstimateSize(iBufLen);\n        E = buf.GetBuffer();\n        CFX_ByteTextBuf content;\n        for (int j = 0; j < 64; ++j) {\n            content.AppendBlock(password, size);\n            content.AppendBlock(input, iBlockSize);\n            if (vector) {\n                content.AppendBlock(vector, 48);\n            }\n        }\n        CRYPT_AESSetKey(aes, 16, key, 16, TRUE);\n        CRYPT_AESSetIV(aes, iv);\n        CRYPT_AESEncrypt(aes, E, content.GetBuffer(), iBufLen);\n        int iHash = 0;\n        switch (BigOrder64BitsMod3(E)) {\n            case 0:\n                iHash = 0;\n                iBlockSize = 32;\n                break;\n            case 1:\n                iHash = 1;\n                iBlockSize = 48;\n                break;\n            default:\n                iHash = 2;\n                iBlockSize = 64;\n                break;\n        }\n        interDigest.EstimateSize(iBlockSize);\n        input = interDigest.GetBuffer();\n        if (iHash == 0) {\n            CRYPT_SHA256Generate(E, iBufLen, input);\n        } else if (iHash == 1) {\n            CRYPT_SHA384Generate(E, iBufLen, input);\n        } else if (iHash == 2) {\n            CRYPT_SHA512Generate(E, iBufLen, input);\n        }\n        key = input;\n        iv = input + 16;\n        ++i;\n    }\n    FX_Free(aes);\n    if (hash) {\n        FXSYS_memcpy32(hash, input, 32);\n    }\n}\nFX_BOOL CPDF_StandardSecurityHandler::AES256_CheckPassword(FX_LPCBYTE password, FX_DWORD size,\n        FX_BOOL bOwner, FX_LPBYTE key)\n{\n    CFX_ByteString okey = m_pEncryptDict ? m_pEncryptDict->GetString(FX_BSTRC(\"O\")) : CFX_ByteString();\n    if (okey.GetLength() < 48) {\n        return FALSE;\n    }\n    CFX_ByteString ukey = m_pEncryptDict ? m_pEncryptDict->GetString(FX_BSTRC(\"U\")) : CFX_ByteString();\n    if (ukey.GetLength() < 48) {\n        return FALSE;\n    }\n    FX_LPCBYTE pkey = bOwner ? (FX_LPCBYTE)okey : (FX_LPCBYTE)ukey;\n    FX_BYTE sha[128];\n    FX_BYTE digest[32];\n    if (m_Revision >= 6) {\n        Revision6_Hash(password, size, (FX_LPCBYTE)pkey + 32, (bOwner ? (FX_LPCBYTE)ukey : NULL), digest);\n    } else {\n        CRYPT_SHA256Start(sha);\n        CRYPT_SHA256Update(sha, password, size);\n        CRYPT_SHA256Update(sha, pkey + 32, 8);\n        if (bOwner) {\n            CRYPT_SHA256Update(sha, ukey, 48);\n        }\n        CRYPT_SHA256Finish(sha, digest);\n    }\n    if (FXSYS_memcmp32(digest, pkey, 32) != 0) {\n        return FALSE;\n    }\n    if (key == NULL) {\n        return TRUE;\n    }\n    if (m_Revision >= 6) {\n        Revision6_Hash(password, size, (FX_LPCBYTE)pkey + 40, (bOwner ? (FX_LPCBYTE)ukey : NULL), digest);\n    } else {\n        CRYPT_SHA256Start(sha);\n        CRYPT_SHA256Update(sha, password, size);\n        CRYPT_SHA256Update(sha, pkey + 40, 8);\n        if (bOwner) {\n            CRYPT_SHA256Update(sha, ukey, 48);\n        }\n        CRYPT_SHA256Finish(sha, digest);\n    }\n    CFX_ByteString ekey = m_pEncryptDict ? m_pEncryptDict->GetString(bOwner ? FX_BSTRC(\"OE\") : FX_BSTRC(\"UE\")) : CFX_ByteString();\n    if (ekey.GetLength() < 32) {\n        return FALSE;\n    }\n    FX_BYTE* aes = FX_Alloc(FX_BYTE, 2048);\n    CRYPT_AESSetKey(aes, 16, digest, 32, FALSE);\n    FX_BYTE iv[16];\n    FXSYS_memset32(iv, 0, 16);\n    CRYPT_AESSetIV(aes, iv);\n    CRYPT_AESDecrypt(aes, key, ekey, 32);\n    CRYPT_AESSetKey(aes, 16, key, 32, FALSE);\n    CRYPT_AESSetIV(aes, iv);\n    CFX_ByteString perms = m_pEncryptDict->GetString(FX_BSTRC(\"Perms\"));\n    if (perms.IsEmpty()) {\n        return FALSE;\n    }\n    FX_BYTE perms_buf[16];\n    FXSYS_memset32(perms_buf, 0, sizeof(perms_buf));\n    FX_DWORD copy_len = sizeof(perms_buf);\n    if (copy_len > (FX_DWORD)perms.GetLength()) {\n        copy_len = perms.GetLength();\n    }\n    FXSYS_memcpy32(perms_buf, (FX_LPCBYTE)perms, copy_len);\n    FX_BYTE buf[16];\n    CRYPT_AESDecrypt(aes, buf, perms_buf, 16);\n    FX_Free(aes);\n    if (buf[9] != 'a' || buf[10] != 'd' || buf[11] != 'b') {\n        return FALSE;\n    }\n    if (FXDWORD_GET_LSBFIRST(buf) != m_Permissions) {\n        return FALSE;\n    }\n    if ((buf[8] == 'T' && !IsMetadataEncrypted()) || (buf[8] == 'F' && IsMetadataEncrypted())) {\n        return FALSE;\n    }\n    return TRUE;\n}\nint CPDF_StandardSecurityHandler::CheckPassword(FX_LPCBYTE password, FX_DWORD pass_size, FX_BOOL bOwner, FX_LPBYTE key)\n{\n    return CheckPassword(password, pass_size, bOwner, key, m_KeyLen);\n}\nint CPDF_StandardSecurityHandler::CheckPassword(FX_LPCBYTE password, FX_DWORD size, FX_BOOL bOwner, FX_LPBYTE key, FX_INT32 key_len)\n{\n    if (m_Revision >= 5) {\n        return AES256_CheckPassword(password, size, bOwner, key);\n    }\n    FX_BYTE keybuf[32];\n    if (key == NULL) {\n        key = keybuf;\n    }\n    if (bOwner) {\n        return CheckOwnerPassword(password, size, key, key_len);\n    }\n    return CheckUserPassword(password, size, FALSE, key, key_len) || CheckUserPassword(password, size, TRUE, key, key_len);\n}\nFX_BOOL CPDF_StandardSecurityHandler::CheckUserPassword(FX_LPCBYTE password, FX_DWORD pass_size,\n        FX_BOOL bIgnoreEncryptMeta, FX_LPBYTE key, FX_INT32 key_len)\n{\n    CalcEncryptKey(m_pEncryptDict, password, pass_size, key, key_len, bIgnoreEncryptMeta,\n                   m_pParser->GetIDArray());\n    CFX_ByteString ukey = m_pEncryptDict ? m_pEncryptDict->GetString(FX_BSTRC(\"U\")) : CFX_ByteString();\n    if (ukey.GetLength() < 16) {\n        return FALSE;\n    }\n    FX_BYTE ukeybuf[32];\n    if (m_Revision == 2) {\n        FXSYS_memcpy32(ukeybuf, defpasscode, 32);\n        CRYPT_ArcFourCryptBlock(ukeybuf, 32, key, key_len);\n    } else {\n        FX_BYTE test[32], tmpkey[32];\n        FX_DWORD copy_len = sizeof(test);\n        if (copy_len > (FX_DWORD)ukey.GetLength()) {\n            copy_len = ukey.GetLength();\n        }\n        FXSYS_memset32(test, 0, sizeof(test));\n        FXSYS_memset32(tmpkey, 0, sizeof(tmpkey));\n        FXSYS_memcpy32(test, (FX_LPCSTR)ukey, copy_len);\n        for (int i = 19; i >= 0; i --) {\n            for (int j = 0; j < key_len; j ++) {\n                tmpkey[j] = key[j] ^ i;\n            }\n            CRYPT_ArcFourCryptBlock(test, 32, tmpkey, key_len);\n        }\n        FX_BYTE md5[100];\n        CRYPT_MD5Start(md5);\n        CRYPT_MD5Update(md5, defpasscode, 32);\n        CPDF_Array* pIdArray = m_pParser->GetIDArray();\n        if (pIdArray) {\n            CFX_ByteString id = pIdArray->GetString(0);\n            CRYPT_MD5Update(md5, (FX_LPBYTE)(FX_LPCSTR)id, id.GetLength());\n        }\n        CRYPT_MD5Finish(md5, ukeybuf);\n        return FXSYS_memcmp32(test, ukeybuf, 16) == 0;\n    }\n    if (FXSYS_memcmp32((FX_LPVOID)(FX_LPCSTR)ukey, ukeybuf, 16) == 0) {\n        return TRUE;\n    }\n    return FALSE;\n}\nCFX_ByteString CPDF_StandardSecurityHandler::GetUserPassword(FX_LPCBYTE owner_pass, FX_DWORD pass_size)\n{\n    return GetUserPassword(owner_pass, pass_size, m_KeyLen);\n}\nCFX_ByteString CPDF_StandardSecurityHandler::GetUserPassword(FX_LPCBYTE owner_pass, FX_DWORD pass_size, FX_INT32 key_len)\n{\n    CFX_ByteString okey = m_pEncryptDict->GetString(FX_BSTRC(\"O\"));\n    FX_BYTE passcode[32];\n    FX_DWORD i;\n    for (i = 0; i < 32; i ++) {\n        passcode[i] = i < pass_size ? owner_pass[i] : defpasscode[i - pass_size];\n    }\n    FX_BYTE digest[16];\n    CRYPT_MD5Generate(passcode, 32, digest);\n    if (m_Revision >= 3) {\n        for (int i = 0; i < 50; i ++) {\n            CRYPT_MD5Generate(digest, 16, digest);\n        }\n    }\n    FX_BYTE enckey[32];\n    FXSYS_memset32(enckey, 0, sizeof(enckey));\n    FX_DWORD copy_len = key_len;\n    if (copy_len > sizeof(digest)) {\n        copy_len = sizeof(digest);\n    }\n    FXSYS_memcpy32(enckey, digest, copy_len);\n    int okeylen = okey.GetLength();\n    if (okeylen > 32) {\n        okeylen = 32;\n    }\n    FX_BYTE okeybuf[64];\n    FXSYS_memset32(okeybuf, 0, sizeof(okeybuf));\n    FXSYS_memcpy32(okeybuf, (FX_LPCSTR)okey, okeylen);\n    if (m_Revision == 2) {\n        CRYPT_ArcFourCryptBlock(okeybuf, okeylen, enckey, key_len);\n    } else {\n        for (int i = 19; i >= 0; i --) {\n            FX_BYTE tempkey[32];\n            FXSYS_memset32(tempkey, 0, sizeof(tempkey));\n            for (int j = 0; j < m_KeyLen; j ++) {\n                tempkey[j] = enckey[j] ^ i;\n            }\n            CRYPT_ArcFourCryptBlock(okeybuf, okeylen, tempkey, key_len);\n        }\n    }\n    int len = 32;\n    while (len && defpasscode[len - 1] == okeybuf[len - 1]) {\n        len --;\n    }\n    return CFX_ByteString(okeybuf, len);\n}\nFX_BOOL CPDF_StandardSecurityHandler::CheckOwnerPassword(FX_LPCBYTE password, FX_DWORD pass_size,\n        FX_LPBYTE key, FX_INT32 key_len)\n{\n    CFX_ByteString user_pass = GetUserPassword(password, pass_size, key_len);\n    if (CheckUserPassword(user_pass, user_pass.GetLength(), FALSE, key, key_len)) {\n        return TRUE;\n    }\n    return CheckUserPassword(user_pass, user_pass.GetLength(), TRUE, key, key_len);\n}\nFX_BOOL CPDF_StandardSecurityHandler::IsMetadataEncrypted()\n{\n    return m_pEncryptDict->GetBoolean(FX_BSTRC(\"EncryptMetadata\"), TRUE);\n}\nCPDF_SecurityHandler* FPDF_CreateStandardSecurityHandler()\n{\n    return FX_NEW CPDF_StandardSecurityHandler;\n}\nvoid CPDF_StandardSecurityHandler::OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,\n        FX_LPCBYTE user_pass, FX_DWORD user_size,\n        FX_LPCBYTE owner_pass, FX_DWORD owner_size, FX_BOOL bDefault, FX_DWORD type)\n{\n    int cipher = 0, key_len = 0;\n    if (!LoadDict(pEncryptDict, type, cipher, key_len)) {\n        return;\n    }\n    if (bDefault && (owner_pass == NULL || owner_size == 0)) {\n        owner_pass = user_pass;\n        owner_size = user_size;\n    }\n    if (m_Revision >= 5) {\n        int t = (int)time(NULL);\n        FX_BYTE sha[128];\n        CRYPT_SHA256Start(sha);\n        CRYPT_SHA256Update(sha, (FX_BYTE*)&t, sizeof t);\n        CRYPT_SHA256Update(sha, m_EncryptKey, 32);\n        CRYPT_SHA256Update(sha, (FX_BYTE*)\"there\", 5);\n        CRYPT_SHA256Finish(sha, m_EncryptKey);\n        AES256_SetPassword(pEncryptDict, user_pass, user_size, FALSE, m_EncryptKey);\n        if (bDefault) {\n            AES256_SetPassword(pEncryptDict, owner_pass, owner_size, TRUE, m_EncryptKey);\n            AES256_SetPerms(pEncryptDict, m_Permissions, pEncryptDict->GetBoolean(FX_BSTRC(\"EncryptMetadata\"), TRUE), m_EncryptKey);\n        }\n        return;\n    }\n    if (bDefault) {\n        FX_BYTE passcode[32];\n        FX_DWORD i;\n        for (i = 0; i < 32; i ++) {\n            passcode[i] = i < owner_size ? owner_pass[i] : defpasscode[i - owner_size];\n        }\n        FX_BYTE digest[16];\n        CRYPT_MD5Generate(passcode, 32, digest);\n        if (m_Revision >= 3) {\n            for (int i = 0; i < 50; i ++) {\n                CRYPT_MD5Generate(digest, 16, digest);\n            }\n        }\n        FX_BYTE enckey[32];\n        FXSYS_memcpy32(enckey, digest, key_len);\n        for (i = 0; i < 32; i ++) {\n            passcode[i] = i < user_size ? user_pass[i] : defpasscode[i - user_size];\n        }\n        CRYPT_ArcFourCryptBlock(passcode, 32, enckey, key_len);\n        FX_BYTE tempkey[32];\n        if (m_Revision >= 3) {\n            for (i = 1; i <= 19; i ++) {\n                for (int j = 0; j < key_len; j ++) {\n                    tempkey[j] = enckey[j] ^ (FX_BYTE)i;\n                }\n                CRYPT_ArcFourCryptBlock(passcode, 32, tempkey, key_len);\n            }\n        }\n        pEncryptDict->SetAtString(FX_BSTRC(\"O\"), CFX_ByteString(passcode, 32));\n    }\n    CalcEncryptKey(m_pEncryptDict, (FX_LPBYTE)user_pass, user_size, m_EncryptKey, key_len, FALSE, pIdArray);\n    if (m_Revision < 3) {\n        FX_BYTE tempbuf[32];\n        FXSYS_memcpy32(tempbuf, defpasscode, 32);\n        CRYPT_ArcFourCryptBlock(tempbuf, 32, m_EncryptKey, key_len);\n        pEncryptDict->SetAtString(FX_BSTRC(\"U\"), CFX_ByteString(tempbuf, 32));\n    } else {\n        FX_BYTE md5[100];\n        CRYPT_MD5Start(md5);\n        CRYPT_MD5Update(md5, defpasscode, 32);\n        if (pIdArray) {\n            CFX_ByteString id = pIdArray->GetString(0);\n            CRYPT_MD5Update(md5, (FX_LPBYTE)(FX_LPCSTR)id, id.GetLength());\n        }\n        FX_BYTE digest[32];\n        CRYPT_MD5Finish(md5, digest);\n        CRYPT_ArcFourCryptBlock(digest, 16, m_EncryptKey, key_len);\n        FX_BYTE tempkey[32];\n        for (int i = 1; i <= 19; i ++) {\n            for (int j = 0; j < key_len; j ++) {\n                tempkey[j] = m_EncryptKey[j] ^ (FX_BYTE)i;\n            }\n            CRYPT_ArcFourCryptBlock(digest, 16, tempkey, key_len);\n        }\n        CRYPT_MD5Generate(digest, 16, digest + 16);\n        pEncryptDict->SetAtString(FX_BSTRC(\"U\"), CFX_ByteString(digest, 32));\n    }\n}\nvoid CPDF_StandardSecurityHandler::OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,\n        FX_LPCBYTE user_pass, FX_DWORD user_size,\n        FX_LPCBYTE owner_pass, FX_DWORD owner_size, FX_DWORD type)\n{\n    OnCreate(pEncryptDict, pIdArray, user_pass, user_size, owner_pass, owner_size, TRUE, type);\n}\nvoid CPDF_StandardSecurityHandler::OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray, FX_LPCBYTE user_pass, FX_DWORD user_size, FX_DWORD type)\n{\n    OnCreate(pEncryptDict, pIdArray, user_pass, user_size, NULL, 0, FALSE, type);\n}\nvoid CPDF_StandardSecurityHandler::AES256_SetPassword(CPDF_Dictionary* pEncryptDict, FX_LPCBYTE password, FX_DWORD size, FX_BOOL bOwner, FX_LPCBYTE key)\n{\n    FX_BYTE sha[128];\n    CRYPT_SHA1Start(sha);\n    CRYPT_SHA1Update(sha, key, 32);\n    CRYPT_SHA1Update(sha, (FX_BYTE*)\"hello\", 5);\n    FX_BYTE digest[20];\n    CRYPT_SHA1Finish(sha, digest);\n    CFX_ByteString ukey = pEncryptDict->GetString(FX_BSTRC(\"U\"));\n    FX_BYTE digest1[48];\n    if (m_Revision >= 6) {\n        Revision6_Hash(password, size, digest, (bOwner ? (FX_LPCBYTE)ukey : NULL), digest1);\n    } else {\n        CRYPT_SHA256Start(sha);\n        CRYPT_SHA256Update(sha, password, size);\n        CRYPT_SHA256Update(sha, digest, 8);\n        if (bOwner) {\n            CRYPT_SHA256Update(sha, ukey, ukey.GetLength());\n        }\n        CRYPT_SHA256Finish(sha, digest1);\n    }\n    FXSYS_memcpy32(digest1 + 32, digest, 16);\n    pEncryptDict->SetAtString(bOwner ? FX_BSTRC(\"O\") : FX_BSTRC(\"U\"), CFX_ByteString(digest1, 48));\n    if (m_Revision >= 6) {\n        Revision6_Hash(password, size, digest + 8, (bOwner ? (FX_LPCBYTE)ukey : NULL), digest1);\n    } else {\n        CRYPT_SHA256Start(sha);\n        CRYPT_SHA256Update(sha, password, size);\n        CRYPT_SHA256Update(sha, digest + 8, 8);\n        if (bOwner) {\n            CRYPT_SHA256Update(sha, ukey, ukey.GetLength());\n        }\n        CRYPT_SHA256Finish(sha, digest1);\n    }\n    FX_BYTE* aes = FX_Alloc(FX_BYTE, 2048);\n    CRYPT_AESSetKey(aes, 16, digest1, 32, TRUE);\n    FX_BYTE iv[16];\n    FXSYS_memset32(iv, 0, 16);\n    CRYPT_AESSetIV(aes, iv);\n    CRYPT_AESEncrypt(aes, digest1, key, 32);\n    FX_Free(aes);\n    pEncryptDict->SetAtString(bOwner ? FX_BSTRC(\"OE\") : FX_BSTRC(\"UE\"), CFX_ByteString(digest1, 32));\n}\nvoid CPDF_StandardSecurityHandler::AES256_SetPerms(CPDF_Dictionary* pEncryptDict, FX_DWORD permissions,\n        FX_BOOL bEncryptMetadata, FX_LPCBYTE key)\n{\n    FX_BYTE buf[16];\n    buf[0] = (FX_BYTE)permissions;\n    buf[1] = (FX_BYTE)(permissions >> 8);\n    buf[2] = (FX_BYTE)(permissions >> 16);\n    buf[3] = (FX_BYTE)(permissions >> 24);\n    buf[4] = 0xff;\n    buf[5] = 0xff;\n    buf[6] = 0xff;\n    buf[7] = 0xff;\n    buf[8] = bEncryptMetadata ? 'T' : 'F';\n    buf[9] = 'a';\n    buf[10] = 'd';\n    buf[11] = 'b';\n    FX_BYTE* aes = FX_Alloc(FX_BYTE, 2048);\n    CRYPT_AESSetKey(aes, 16, key, 32, TRUE);\n    FX_BYTE iv[16], buf1[16];\n    FXSYS_memset32(iv, 0, 16);\n    CRYPT_AESSetIV(aes, iv);\n    CRYPT_AESEncrypt(aes, buf1, buf, 16);\n    FX_Free(aes);\n    pEncryptDict->SetAtString(FX_BSTRC(\"Perms\"), CFX_ByteString(buf1, 16));\n}\nvoid CPDF_StandardCryptoHandler::CryptBlock(FX_BOOL bEncrypt, FX_DWORD objnum, FX_DWORD gennum, FX_LPCBYTE src_buf, FX_DWORD src_size,\n        FX_LPBYTE dest_buf, FX_DWORD& dest_size)\n{\n    if (m_Cipher == FXCIPHER_NONE) {\n        FXSYS_memcpy32(dest_buf, src_buf, src_size);\n        return;\n    }\n    FX_BYTE realkey[16];\n    int realkeylen = 16;\n    if (m_Cipher != FXCIPHER_AES || m_KeyLen != 32) {\n        FX_BYTE key1[32];\n        FXSYS_memcpy32(key1, m_EncryptKey, m_KeyLen);\n        key1[m_KeyLen + 0] = (FX_BYTE)objnum;\n        key1[m_KeyLen + 1] = (FX_BYTE)(objnum >> 8);\n        key1[m_KeyLen + 2] = (FX_BYTE)(objnum >> 16);\n        key1[m_KeyLen + 3] = (FX_BYTE)gennum;\n        key1[m_KeyLen + 4] = (FX_BYTE)(gennum >> 8);\n        FXSYS_memcpy32(key1 + m_KeyLen, &objnum, 3);\n        FXSYS_memcpy32(key1 + m_KeyLen + 3, &gennum, 2);\n        if (m_Cipher == FXCIPHER_AES) {\n            FXSYS_memcpy32(key1 + m_KeyLen + 5, \"sAlT\", 4);\n        }\n        CRYPT_MD5Generate(key1, m_Cipher == FXCIPHER_AES ? m_KeyLen + 9 : m_KeyLen + 5, realkey);\n        realkeylen = m_KeyLen + 5;\n        if (realkeylen > 16) {\n            realkeylen = 16;\n        }\n    }\n    if (m_Cipher == FXCIPHER_AES) {\n        CRYPT_AESSetKey(m_pAESContext, 16, m_KeyLen == 32 ? m_EncryptKey : realkey, m_KeyLen, bEncrypt);\n        if (bEncrypt) {\n            FX_BYTE iv[16];\n            for (int i = 0; i < 16; i ++) {\n                iv[i] = (FX_BYTE)rand();\n            }\n            CRYPT_AESSetIV(m_pAESContext, iv);\n            FXSYS_memcpy32(dest_buf, iv, 16);\n            int nblocks = src_size / 16;\n            CRYPT_AESEncrypt(m_pAESContext, dest_buf + 16, src_buf, nblocks * 16);\n            FX_BYTE padding[16];\n            FXSYS_memcpy32(padding, src_buf + nblocks * 16, src_size % 16);\n            FXSYS_memset8(padding + src_size % 16, 16 - src_size % 16, 16 - src_size % 16);\n            CRYPT_AESEncrypt(m_pAESContext, dest_buf + nblocks * 16 + 16, padding, 16);\n            dest_size = 32 + nblocks * 16;\n        } else {\n            CRYPT_AESSetIV(m_pAESContext, src_buf);\n            CRYPT_AESDecrypt(m_pAESContext, dest_buf, src_buf + 16, src_size - 16);\n            dest_size = src_size - 16;\n            dest_size -= dest_buf[dest_size - 1];\n        }\n    } else {\n        ASSERT(dest_size == src_size);\n        if (dest_buf != src_buf) {\n            FXSYS_memcpy32(dest_buf, src_buf, src_size);\n        }\n        CRYPT_ArcFourCryptBlock(dest_buf, dest_size, realkey, realkeylen);\n    }\n}\ntypedef struct _AESCryptContext {\n    FX_BYTE\t\tm_Context[2048];\n    FX_BOOL\t\tm_bIV;\n    FX_BYTE\t\tm_Block[16];\n    FX_DWORD\tm_BlockOffset;\n} AESCryptContext;\nFX_LPVOID CPDF_StandardCryptoHandler::CryptStart(FX_DWORD objnum, FX_DWORD gennum, FX_BOOL bEncrypt)\n{\n    if (m_Cipher == FXCIPHER_NONE) {\n        return this;\n    }\n    if (m_Cipher == FXCIPHER_AES && m_KeyLen == 32) {\n        AESCryptContext* pContext = FX_Alloc(AESCryptContext, 1);\n        pContext->m_bIV = TRUE;\n        pContext->m_BlockOffset = 0;\n        CRYPT_AESSetKey(pContext->m_Context, 16, m_EncryptKey, 32, bEncrypt);\n        if (bEncrypt) {\n            for (int i = 0; i < 16; i ++) {\n                pContext->m_Block[i] = (FX_BYTE)rand();\n            }\n            CRYPT_AESSetIV(pContext->m_Context, pContext->m_Block);\n        }\n        return pContext;\n    }\n    FX_BYTE key1[48];\n    FXSYS_memcpy32(key1, m_EncryptKey, m_KeyLen);\n    FXSYS_memcpy32(key1 + m_KeyLen, &objnum, 3);\n    FXSYS_memcpy32(key1 + m_KeyLen + 3, &gennum, 2);\n    if (m_Cipher == FXCIPHER_AES) {\n        FXSYS_memcpy32(key1 + m_KeyLen + 5, \"sAlT\", 4);\n    }\n    FX_BYTE realkey[16];\n    CRYPT_MD5Generate(key1, m_Cipher == FXCIPHER_AES ? m_KeyLen + 9 : m_KeyLen + 5, realkey);\n    int realkeylen = m_KeyLen + 5;\n    if (realkeylen > 16) {\n        realkeylen = 16;\n    }\n    if (m_Cipher == FXCIPHER_AES) {\n        AESCryptContext* pContext = FX_Alloc(AESCryptContext, 1);\n        pContext->m_bIV = TRUE;\n        pContext->m_BlockOffset = 0;\n        CRYPT_AESSetKey(pContext->m_Context, 16, realkey, 16, bEncrypt);\n        if (bEncrypt) {\n            for (int i = 0; i < 16; i ++) {\n                pContext->m_Block[i] = (FX_BYTE)rand();\n            }\n            CRYPT_AESSetIV(pContext->m_Context, pContext->m_Block);\n        }\n        return pContext;\n    }\n    void* pContext = FX_Alloc(FX_BYTE, 1040);\n    CRYPT_ArcFourSetup(pContext, realkey, realkeylen);\n    return pContext;\n}\nFX_BOOL CPDF_StandardCryptoHandler::CryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf, FX_BOOL bEncrypt)\n{\n    if (!context) {\n        return FALSE;\n    }\n    if (m_Cipher == FXCIPHER_NONE) {\n        dest_buf.AppendBlock(src_buf, src_size);\n        return TRUE;\n    }\n    if (m_Cipher == FXCIPHER_RC4) {\n        int old_size = dest_buf.GetSize();\n        dest_buf.AppendBlock(src_buf, src_size);\n        CRYPT_ArcFourCrypt(context, dest_buf.GetBuffer() + old_size, src_size);\n        return TRUE;\n    }\n    AESCryptContext* pContext = (AESCryptContext*)context;\n    if (pContext->m_bIV && bEncrypt) {\n        dest_buf.AppendBlock(pContext->m_Block, 16);\n        pContext->m_bIV = FALSE;\n    }\n    FX_DWORD src_off = 0;\n    FX_DWORD src_left = src_size;\n    while (1) {\n        FX_DWORD copy_size = 16 - pContext->m_BlockOffset;\n        if (copy_size > src_left) {\n            copy_size = src_left;\n        }\n        FXSYS_memcpy32(pContext->m_Block + pContext->m_BlockOffset, src_buf + src_off, copy_size);\n        src_off += copy_size;\n        src_left -= copy_size;\n        pContext->m_BlockOffset += copy_size;\n        if (pContext->m_BlockOffset == 16) {\n            if (!bEncrypt && pContext->m_bIV) {\n                CRYPT_AESSetIV(pContext->m_Context, pContext->m_Block);\n                pContext->m_bIV = FALSE;\n                pContext->m_BlockOffset = 0;\n            } else if (src_off < src_size) {\n                FX_BYTE block_buf[16];\n                if (bEncrypt) {\n                    CRYPT_AESEncrypt(pContext->m_Context, block_buf, pContext->m_Block, 16);\n                } else {\n                    CRYPT_AESDecrypt(pContext->m_Context, block_buf, pContext->m_Block, 16);\n                }\n                dest_buf.AppendBlock(block_buf, 16);\n                pContext->m_BlockOffset = 0;\n            }\n        }\n        if (!src_left) {\n            break;\n        }\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_StandardCryptoHandler::CryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf, FX_BOOL bEncrypt)\n{\n    if (!context) {\n        return FALSE;\n    }\n    if (m_Cipher == FXCIPHER_NONE) {\n        return TRUE;\n    }\n    if (m_Cipher == FXCIPHER_RC4) {\n        FX_Free(context);\n        return TRUE;\n    }\n    AESCryptContext* pContext = (AESCryptContext*)context;\n    if (bEncrypt) {\n        FX_BYTE block_buf[16];\n        if (pContext->m_BlockOffset == 16) {\n            CRYPT_AESEncrypt(pContext->m_Context, block_buf, pContext->m_Block, 16);\n            dest_buf.AppendBlock(block_buf, 16);\n            pContext->m_BlockOffset = 0;\n        }\n        FXSYS_memset8(pContext->m_Block + pContext->m_BlockOffset, (FX_BYTE)(16 - pContext->m_BlockOffset), 16 - pContext->m_BlockOffset);\n        CRYPT_AESEncrypt(pContext->m_Context, block_buf, pContext->m_Block, 16);\n        dest_buf.AppendBlock(block_buf, 16);\n    } else if (pContext->m_BlockOffset == 16) {\n        FX_BYTE block_buf[16];\n        CRYPT_AESDecrypt(pContext->m_Context, block_buf, pContext->m_Block, 16);\n        if (block_buf[15] <= 16) {\n            dest_buf.AppendBlock(block_buf, 16 - block_buf[15]);\n        }\n    }\n    FX_Free(pContext);\n    return TRUE;\n}\nFX_LPVOID CPDF_StandardCryptoHandler::DecryptStart(FX_DWORD objnum, FX_DWORD gennum)\n{\n    return CryptStart(objnum, gennum, FALSE);\n}\nFX_DWORD CPDF_StandardCryptoHandler::DecryptGetSize(FX_DWORD src_size)\n{\n    return m_Cipher == FXCIPHER_AES ? src_size - 16 : src_size;\n}\nFX_BOOL CPDF_StandardCryptoHandler::Init(CPDF_Dictionary* pEncryptDict, CPDF_SecurityHandler* pSecurityHandler)\n{\n    FX_LPCBYTE key;\n    if (!pSecurityHandler->GetCryptInfo(m_Cipher, key, m_KeyLen)) {\n        return FALSE;\n    }\n    if (m_KeyLen > 32 || m_KeyLen < 0) {\n        return FALSE;\n    }\n    if (m_Cipher != FXCIPHER_NONE) {\n        FXSYS_memcpy32(m_EncryptKey, key, m_KeyLen);\n    }\n    if (m_Cipher == FXCIPHER_AES) {\n        m_pAESContext = FX_Alloc(FX_BYTE, 2048);\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_StandardCryptoHandler::Init(int cipher, FX_LPCBYTE key, int keylen)\n{\n    if (cipher == FXCIPHER_AES) {\n        switch(keylen) {\n            case 16:\n            case 24:\n            case 32:\n                break;\n            default:\n                return FALSE;\n        }\n    } else if (cipher == FXCIPHER_AES2) {\n        if (keylen != 32) {\n            return FALSE;\n        }\n    } else if (cipher == FXCIPHER_RC4) {\n        if (keylen < 5 || keylen > 16) {\n            return FALSE;\n        }\n    } else {\n        if (keylen > 32) {\n            keylen = 32;\n        }\n    }\n    m_Cipher = cipher;\n    m_KeyLen = keylen;\n    FXSYS_memcpy32(m_EncryptKey, key, keylen);\n    if (m_Cipher == FXCIPHER_AES) {\n        m_pAESContext = FX_Alloc(FX_BYTE, 2048);\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_StandardCryptoHandler::DecryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size,\n        CFX_BinaryBuf& dest_buf)\n{\n    return CryptStream(context, src_buf, src_size, dest_buf, FALSE);\n}\nFX_BOOL CPDF_StandardCryptoHandler::DecryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf)\n{\n    return CryptFinish(context, dest_buf, FALSE);\n}\nFX_DWORD CPDF_StandardCryptoHandler::EncryptGetSize(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size)\n{\n    if (m_Cipher == FXCIPHER_AES) {\n        return src_size + 32;\n    }\n    return src_size;\n}\nFX_BOOL CPDF_StandardCryptoHandler::EncryptContent(FX_DWORD objnum, FX_DWORD gennum, FX_LPCBYTE src_buf, FX_DWORD src_size,\n        FX_LPBYTE dest_buf, FX_DWORD& dest_size)\n{\n    CryptBlock(TRUE, objnum, gennum, src_buf, src_size, dest_buf, dest_size);\n    return TRUE;\n}\nvoid CPDF_CryptoHandler::Decrypt(FX_DWORD objnum, FX_DWORD gennum, CFX_ByteString& str)\n{\n    CFX_BinaryBuf dest_buf;\n    FX_LPVOID context = DecryptStart(objnum, gennum);\n    DecryptStream(context, (FX_LPCBYTE)str, str.GetLength(), dest_buf);\n    DecryptFinish(context, dest_buf);\n    str = dest_buf;\n}\nCPDF_StandardCryptoHandler::CPDF_StandardCryptoHandler()\n{\n    m_pAESContext = NULL;\n    m_Cipher = FXCIPHER_NONE;\n    m_KeyLen = 0;\n}\nCPDF_StandardCryptoHandler::~CPDF_StandardCryptoHandler()\n{\n    if (m_pAESContext) {\n        FX_Free(m_pAESContext);\n    }\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_parser/fpdf_parser_fdf.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_serial.h\"\nCFDF_Document::CFDF_Document() : CPDF_IndirectObjects(NULL)\n{\n    m_pRootDict = NULL;\n    m_pFile = NULL;\n    m_bOwnFile = FALSE;\n}\nCFDF_Document::~CFDF_Document()\n{\n    if (m_bOwnFile && m_pFile) {\n        m_pFile->Release();\n    }\n}\nCFDF_Document* CFDF_Document::CreateNewDoc()\n{\n    CFDF_Document* pDoc = FX_NEW CFDF_Document;\n    pDoc->m_pRootDict = FX_NEW CPDF_Dictionary;\n    pDoc->AddIndirectObject(pDoc->m_pRootDict);\n    CPDF_Dictionary* pFDFDict = FX_NEW CPDF_Dictionary;\n    pDoc->m_pRootDict->SetAt(FX_BSTRC(\"FDF\"), pFDFDict);\n    return pDoc;\n}\nCFDF_Document* CFDF_Document::ParseFile(FX_LPCSTR file_path)\n{\n    return CFDF_Document::ParseFile(FX_CreateFileRead(file_path), TRUE);\n}\nCFDF_Document* CFDF_Document::ParseFile(FX_LPCWSTR file_path)\n{\n    return CFDF_Document::ParseFile(FX_CreateFileRead(file_path), TRUE);\n}\nCFDF_Document* CFDF_Document::ParseFile(IFX_FileRead *pFile, FX_BOOL bOwnFile)\n{\n    if (!pFile) {\n        return NULL;\n    }\n    CFDF_Document* pDoc = FX_NEW CFDF_Document;\n    pDoc->ParseStream(pFile, bOwnFile);\n    if (pDoc->m_pRootDict == NULL) {\n        delete pDoc;\n        return NULL;\n    }\n    return pDoc;\n}\nCFDF_Document* CFDF_Document::ParseMemory(FX_LPCBYTE pData, FX_DWORD size)\n{\n    return CFDF_Document::ParseFile(FX_CreateMemoryStream((FX_LPBYTE)pData, size), TRUE);\n}\nvoid CFDF_Document::ParseStream(IFX_FileRead *pFile, FX_BOOL bOwnFile)\n{\n    m_pFile = pFile;\n    m_bOwnFile = bOwnFile;\n    CPDF_SyntaxParser parser;\n    parser.InitParser(m_pFile, 0);\n    while (1) {\n        FX_BOOL bNumber;\n        CFX_ByteString word = parser.GetNextWord(bNumber);\n        if (bNumber) {\n            FX_DWORD objnum = FXSYS_atoi(word);\n            word = parser.GetNextWord(bNumber);\n            if (!bNumber) {\n                break;\n            }\n            word = parser.GetNextWord(bNumber);\n            if (word != FX_BSTRC(\"obj\")) {\n                break;\n            }\n            CPDF_Object* pObj = parser.GetObject(this, objnum, 0, FALSE);\n            if (pObj == NULL) {\n                break;\n            }\n            InsertIndirectObject(objnum, pObj);\n            word = parser.GetNextWord(bNumber);\n            if (word != FX_BSTRC(\"endobj\")) {\n                break;\n            }\n        } else {\n            if (word != FX_BSTRC(\"trailer\")) {\n                break;\n            }\n            CPDF_Dictionary* pMainDict = (CPDF_Dictionary*)parser.GetObject(this, 0, 0, 0);\n            if (pMainDict == NULL || pMainDict->GetType() != PDFOBJ_DICTIONARY) {\n                break;\n            }\n            m_pRootDict = pMainDict->GetDict(FX_BSTRC(\"Root\"));\n            pMainDict->Release();\n            break;\n        }\n    }\n}\nFX_BOOL CFDF_Document::WriteBuf(CFX_ByteTextBuf& buf) const\n{\n    if (m_pRootDict == NULL) {\n        return FALSE;\n    }\n    buf << FX_BSTRC(\"%FDF-1.2\\r\\n\");\n    FX_POSITION pos = m_IndirectObjs.GetStartPosition();\n    while(pos) {\n        size_t objnum;\n        CPDF_Object* pObj;\n        m_IndirectObjs.GetNextAssoc(pos, (FX_LPVOID&)objnum, (FX_LPVOID&)pObj);\n        buf << (FX_DWORD)objnum << FX_BSTRC(\" 0 obj\\r\\n\") << pObj << FX_BSTRC(\"\\r\\nendobj\\r\\n\\r\\n\");\n    }\n    buf << FX_BSTRC(\"trailer\\r\\n<</Root \") << m_pRootDict->GetObjNum() << FX_BSTRC(\" 0 R>>\\r\\n%%EOF\\r\\n\");\n    return TRUE;\n}\nCFX_WideString CFDF_Document::GetWin32Path() const\n{\n    CPDF_Dictionary* pDict = m_pRootDict ? m_pRootDict->GetDict(FX_BSTRC(\"FDF\")) : NULL;\n    CPDF_Object* pFileSpec = pDict ? pDict->GetElementValue(FX_BSTRC(\"F\")) : NULL;\n    if (pFileSpec == NULL) {\n        return CFX_WideString();\n    }\n    if (pFileSpec->GetType() == PDFOBJ_STRING) {\n        return FPDF_FileSpec_GetWin32Path(m_pRootDict->GetDict(FX_BSTRC(\"FDF\")));\n    }\n    return FPDF_FileSpec_GetWin32Path(pFileSpec);\n}\nFX_BOOL CFDF_Document::WriteFile(FX_LPCSTR file_path) const\n{\n    IFX_FileWrite *pFile = FX_CreateFileWrite(file_path);\n    if (!pFile) {\n        return FALSE;\n    }\n    FX_BOOL bRet = WriteFile(pFile);\n    pFile->Release();\n    return bRet;\n}\nFX_BOOL CFDF_Document::WriteFile(FX_LPCWSTR file_path) const\n{\n    IFX_FileWrite *pFile = FX_CreateFileWrite(file_path);\n    if (!pFile) {\n        return FALSE;\n    }\n    FX_BOOL bRet = WriteFile(pFile);\n    pFile->Release();\n    return bRet;\n}\nFX_BOOL CFDF_Document::WriteFile(IFX_FileWrite *pFile) const\n{\n    CFX_ByteTextBuf buf;\n    WriteBuf(buf);\n    FX_BOOL bRet = pFile->WriteBlock(buf.GetBuffer(), buf.GetSize());\n    if (bRet) {\n        pFile->Flush();\n    }\n    return bRet;\n}\nstatic CFX_WideString ChangeSlash(FX_LPCWSTR str)\n{\n    CFX_WideString result;\n    while (*str) {\n        if (*str == '\\\\') {\n            result += '/';\n        } else if (*str == '/') {\n            result += '\\\\';\n        } else {\n            result += *str;\n        }\n        str ++;\n    }\n    return result;\n}\nvoid FPDF_FileSpec_SetWin32Path(CPDF_Object* pFileSpec, const CFX_WideString& filepath)\n{\n    CFX_WideString result;\n    if (filepath.GetLength() > 1 && filepath[1] == ':') {\n        result = L\"/\";\n        result += filepath[0];\n        if (filepath[2] != '\\\\') {\n            result += '/';\n        }\n        result += ChangeSlash((FX_LPCWSTR)filepath + 2);\n    } else if (filepath.GetLength() > 1 && filepath[0] == '\\\\' && filepath[1] == '\\\\') {\n        result = ChangeSlash((FX_LPCWSTR)filepath + 1);\n    } else {\n        result = ChangeSlash(filepath);\n    }\n    if (pFileSpec->GetType() == PDFOBJ_STRING) {\n        pFileSpec->SetString(CFX_ByteString::FromUnicode(result));\n    } else if (pFileSpec->GetType() == PDFOBJ_DICTIONARY) {\n        ((CPDF_Dictionary*)pFileSpec)->SetAtString(FX_BSTRC(\"F\"), CFX_ByteString::FromUnicode(result));\n        ((CPDF_Dictionary*)pFileSpec)->SetAtString(FX_BSTRC(\"UF\"), PDF_EncodeText(result));\n        ((CPDF_Dictionary*)pFileSpec)->RemoveAt(FX_BSTRC(\"FS\"));\n    }\n}\nCFX_WideString\tFPDF_FileSpec_GetWin32Path(const CPDF_Object* pFileSpec)\n{\n    CFX_WideString wsFileName;\n    if (pFileSpec->GetType() == PDFOBJ_DICTIONARY) {\n        CPDF_Dictionary* pDict = (CPDF_Dictionary*)pFileSpec;\n        wsFileName = pDict->GetUnicodeText(FX_BSTRC(\"UF\"));\n        if (wsFileName.IsEmpty()) {\n            wsFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC(\"F\")));\n        }\n        if (pDict->GetString(FX_BSTRC(\"FS\")) == FX_BSTRC(\"URL\")) {\n            return wsFileName;\n        }\n        if (wsFileName.IsEmpty() && pDict->KeyExist(FX_BSTRC(\"DOS\"))) {\n            wsFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC(\"DOS\")));\n        }\n    }\n    else if (!pFileSpec)\n        wsFileName = CFX_WideString();\n    else {\n        wsFileName = CFX_WideString::FromLocal(pFileSpec->GetString());\n    }\n    if (wsFileName[0] != '/') {\n        return ChangeSlash(wsFileName);\n    }\n    if (wsFileName[2] == '/') {\n        CFX_WideString result;\n        result += wsFileName[1];\n        result += ':';\n        result += ChangeSlash(((FX_LPCWSTR)wsFileName) + 2);\n        return result;\n    } else {\n        CFX_WideString result;\n        result += '\\\\';\n        result += ChangeSlash(wsFileName);\n        return result;\n    }\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_parser/fpdf_parser_filters.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../fx_zlib.h\"\n#include \"../../../include/fpdfapi/fpdf_parser.h\"\n#include \"../../../include/fxcodec/fx_codec.h\"\n#include \"../../../include/fpdfapi/fpdf_module.h\"\n#include \"filters_int.h\"\nCFX_DataFilter::CFX_DataFilter()\n{\n    m_bEOF = FALSE;\n    m_pDestFilter = NULL;\n    m_SrcPos = 0;\n}\nCFX_DataFilter::~CFX_DataFilter()\n{\n    if (m_pDestFilter) {\n        delete m_pDestFilter;\n    }\n}\nvoid CFX_DataFilter::SetDestFilter(CFX_DataFilter* pFilter)\n{\n    if (m_pDestFilter) {\n        m_pDestFilter->SetDestFilter(pFilter);\n    } else {\n        m_pDestFilter = pFilter;\n    }\n}\nvoid CFX_DataFilter::FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)\n{\n    if (m_bEOF) {\n        return;\n    }\n    m_SrcPos += src_size;\n    if (m_pDestFilter) {\n        CFX_BinaryBuf temp_buf;\n        temp_buf.EstimateSize(FPDF_FILTER_BUFFER_SIZE, FPDF_FILTER_BUFFER_SIZE);\n        v_FilterIn(src_buf, src_size, temp_buf);\n        m_pDestFilter->FilterIn(temp_buf.GetBuffer(), temp_buf.GetSize(), dest_buf);\n    } else {\n        v_FilterIn(src_buf, src_size, dest_buf);\n    }\n}\nvoid CFX_DataFilter::FilterFinish(CFX_BinaryBuf& dest_buf)\n{\n    if (m_pDestFilter) {\n        CFX_BinaryBuf temp_buf;\n        v_FilterFinish(temp_buf);\n        if (temp_buf.GetSize()) {\n            m_pDestFilter->FilterIn(temp_buf.GetBuffer(), temp_buf.GetSize(), dest_buf);\n        }\n        m_pDestFilter->FilterFinish(dest_buf);\n    } else {\n        v_FilterFinish(dest_buf);\n    }\n    m_bEOF = TRUE;\n}\nvoid CFX_DataFilter::ReportEOF(FX_DWORD left_input)\n{\n    if (m_bEOF) {\n        return;\n    }\n    m_bEOF = TRUE;\n    m_SrcPos -= left_input;\n}\nCFX_DataFilter* FPDF_CreateFilter(FX_BSTR name, const CPDF_Dictionary* pParam, int width, int height)\n{\n    FX_DWORD id = name.GetID();\n    switch (id) {\n        case FXBSTR_ID('F', 'l', 'a', 't'):\n        case FXBSTR_ID('F', 'l', 0, 0):\n        case FXBSTR_ID('L', 'Z', 'W', 'D'):\n        case FXBSTR_ID('L', 'Z', 'W', 0): {\n                CFX_DataFilter* pFilter;\n                if (id == FXBSTR_ID('L', 'Z', 'W', 'D') || id == FXBSTR_ID('L', 'Z', 'W', 0)) {\n                    pFilter = FX_NEW CPDF_LzwFilter(pParam ? pParam->GetInteger(\"EarlyChange\", 1) : 1);\n                } else {\n                    pFilter = FX_NEW CPDF_FlateFilter;\n                }\n                if ((pParam ? pParam->GetInteger(\"Predictor\", 1) : 1) > 1) {\n                    CFX_DataFilter* pPredictor = FX_NEW CPDF_PredictorFilter(pParam->GetInteger(FX_BSTRC(\"Predictor\"), 1),\n                                                 pParam->GetInteger(FX_BSTRC(\"Colors\"), 1), pParam->GetInteger(FX_BSTRC(\"BitsPerComponent\"), 8),\n                                                 pParam->GetInteger(FX_BSTRC(\"Columns\"), 1));\n                    pFilter->SetDestFilter(pPredictor);\n                }\n                return pFilter;\n            }\n        case FXBSTR_ID('A', 'S', 'C', 'I'):\n            if (name == \"ASCIIHexDecode\") {\n                return FX_NEW CPDF_AsciiHexFilter;\n            }\n            return FX_NEW CPDF_Ascii85Filter;\n        case FXBSTR_ID('A', 'H', 'x', 0):\n            return FX_NEW CPDF_AsciiHexFilter;\n        case FXBSTR_ID('A', '8', '5', 0):\n            return FX_NEW CPDF_Ascii85Filter;\n        case FXBSTR_ID('R', 'u', 'n', 'L'):\n            return FX_NEW CPDF_RunLenFilter;\n        case FXBSTR_ID('C', 'C', 'I', 'T'): {\n                int Encoding = 0;\n                int bEndOfLine = FALSE;\n                int bByteAlign = FALSE;\n                int bBlack = FALSE;\n                int nRows = 0;\n                int nColumns = 1728;\n                if (pParam) {\n                    Encoding = pParam->GetInteger(FX_BSTRC(\"K\"));\n                    bEndOfLine = pParam->GetInteger(FX_BSTRC(\"EndOfLine\"));\n                    bByteAlign = pParam->GetInteger(FX_BSTRC(\"EncodedByteAlign\"));\n                    bBlack = pParam->GetInteger(FX_BSTRC(\"BlackIs1\"));\n                    nColumns = pParam->GetInteger(FX_BSTRC(\"Columns\"), 1728);\n                    nRows = pParam->GetInteger(FX_BSTRC(\"Rows\"));\n                }\n                if (nColumns == 0) {\n                    nColumns = width;\n                }\n                if (nRows == 0) {\n                    nRows = height;\n                }\n                CPDF_FaxFilter* pFilter = FX_NEW CPDF_FaxFilter();\n                pFilter->Initialize(Encoding, bEndOfLine, bByteAlign, bBlack, nRows, nColumns);\n                return pFilter;\n            }\n        case FXBSTR_ID('D', 'C', 'T', 'D'):\n            return FX_NEW CPDF_JpegFilter;\n        default:\n            return NULL;\n    }\n}\nCFX_DataFilter* _FPDF_CreateFilterFromDict(CPDF_Dictionary* pDict)\n{\n    CPDF_Object* pDecoder = pDict->GetElementValue(\"Filter\");\n    if (pDecoder == NULL) {\n        return NULL;\n    }\n    CFX_DataFilter* pFirstFilter = NULL;\n    int width = pDict->GetInteger(FX_BSTRC(\"Width\")), height = pDict->GetInteger(FX_BSTRC(\"Height\"));\n    CPDF_Object* pParams = pDict->GetElementValue(\"DecodeParms\");\n    if (pDecoder->GetType() == PDFOBJ_ARRAY) {\n        if (pParams && pParams->GetType() != PDFOBJ_ARRAY) {\n            pParams = NULL;\n        }\n        for (FX_DWORD i = 0; i < ((CPDF_Array*)pDecoder)->GetCount(); i ++) {\n            CFX_ByteString name = ((CPDF_Array*)pDecoder)->GetString(i);\n            CPDF_Dictionary* pParam = NULL;\n            if (pParams) {\n                pParam = ((CPDF_Array*)pParams)->GetDict(i);\n            }\n            CFX_DataFilter* pDestFilter = FPDF_CreateFilter(name, pParam, width, height);\n            if (pDestFilter) {\n                if (pFirstFilter == NULL) {\n                    pFirstFilter = pDestFilter;\n                } else {\n                    pFirstFilter->SetDestFilter(pDestFilter);\n                }\n            }\n        }\n    } else {\n        if (pParams && pParams->GetType() != PDFOBJ_DICTIONARY) {\n            pParams = NULL;\n        }\n        pFirstFilter = FPDF_CreateFilter(pDecoder->GetString(), (CPDF_Dictionary*)pParams, width, height);\n    }\n    return pFirstFilter;\n}\nCPDF_StreamFilter* CPDF_Stream::GetStreamFilter(FX_BOOL bRaw) const\n{\n    CFX_DataFilter* pFirstFilter = NULL;\n    if (m_pCryptoHandler) {\n        pFirstFilter = FX_NEW CPDF_DecryptFilter(m_pCryptoHandler, m_ObjNum, m_GenNum);\n    }\n    if (!bRaw) {\n        CFX_DataFilter* pFilter = _FPDF_CreateFilterFromDict(m_pDict);\n        if (pFilter) {\n            if (pFirstFilter == NULL) {\n                pFirstFilter = pFilter;\n            } else {\n                pFirstFilter->SetDestFilter(pFilter);\n            }\n        }\n    }\n    CPDF_StreamFilter* pStreamFilter = FX_NEW CPDF_StreamFilter;\n    pStreamFilter->m_pStream = this;\n    pStreamFilter->m_pFilter = pFirstFilter;\n    pStreamFilter->m_pBuffer = NULL;\n    pStreamFilter->m_SrcOffset = 0;\n    return pStreamFilter;\n}\nCPDF_StreamFilter::~CPDF_StreamFilter()\n{\n    if (m_pFilter) {\n        delete m_pFilter;\n    }\n    if (m_pBuffer) {\n        delete m_pBuffer;\n    }\n}\n#define FPDF_FILTER_BUFFER_IN_SIZE\tFPDF_FILTER_BUFFER_SIZE\nFX_DWORD CPDF_StreamFilter::ReadBlock(FX_LPBYTE buffer, FX_DWORD buf_size)\n{\n    if (m_pFilter == NULL) {\n        FX_DWORD read_size = m_pStream->GetRawSize() - m_SrcOffset;\n        if (read_size == 0) {\n            return 0;\n        }\n        if (read_size > buf_size) {\n            read_size = buf_size;\n        }\n        m_pStream->ReadRawData(m_SrcOffset, buffer, read_size);\n        m_SrcOffset += read_size;\n        return read_size;\n    }\n    FX_DWORD read_size = 0;\n    if (m_pBuffer) {\n        read_size = ReadLeftOver(buffer, buf_size);\n        if (read_size == buf_size) {\n            return read_size;\n        }\n        buffer += read_size;\n        buf_size -= read_size;\n    }\n    ASSERT(m_pBuffer == NULL);\n    if (m_pFilter->IsEOF()) {\n        return read_size;\n    }\n    m_pBuffer = FX_NEW CFX_BinaryBuf;\n    m_pBuffer->EstimateSize(FPDF_FILTER_BUFFER_SIZE, FPDF_FILTER_BUFFER_SIZE);\n    m_BufOffset = 0;\n    while (1) {\n        int src_size = m_pStream->GetRawSize() - m_SrcOffset;\n        if (src_size == 0) {\n            m_pFilter->FilterFinish(*m_pBuffer);\n            break;\n        }\n        if (src_size > FPDF_FILTER_BUFFER_IN_SIZE) {\n            src_size = FPDF_FILTER_BUFFER_IN_SIZE;\n        }\n        if (!m_pStream->ReadRawData(m_SrcOffset, m_SrcBuffer, src_size)) {\n            return 0;\n        }\n        m_SrcOffset += src_size;\n        m_pFilter->FilterIn(m_SrcBuffer, src_size, *m_pBuffer);\n        if (m_pBuffer->GetSize() >= (int)buf_size) {\n            break;\n        }\n    }\n    return read_size + ReadLeftOver(buffer, buf_size);\n}\nFX_DWORD CPDF_StreamFilter::ReadLeftOver(FX_LPBYTE buffer, FX_DWORD buf_size)\n{\n    FX_DWORD read_size = m_pBuffer->GetSize() - m_BufOffset;\n    if (read_size > buf_size) {\n        read_size = buf_size;\n    }\n    FXSYS_memcpy32(buffer, m_pBuffer->GetBuffer() + m_BufOffset, read_size);\n    m_BufOffset += read_size;\n    if (m_BufOffset == (FX_DWORD)m_pBuffer->GetSize()) {\n        delete m_pBuffer;\n        m_pBuffer = NULL;\n    }\n    return read_size;\n}\nCPDF_DecryptFilter::CPDF_DecryptFilter(CPDF_CryptoHandler* pCryptoHandler, FX_DWORD objnum, FX_DWORD gennum)\n{\n    m_pCryptoHandler = pCryptoHandler;\n    m_pContext = NULL;\n    m_ObjNum = objnum;\n    m_GenNum = gennum;\n}\nCPDF_DecryptFilter::~CPDF_DecryptFilter()\n{\n    CFX_BinaryBuf buf;\n    if (m_pContext) {\n        m_pCryptoHandler->DecryptFinish(m_pContext, buf);\n    }\n}\nvoid CPDF_DecryptFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)\n{\n    if (m_pContext == NULL) {\n        m_pContext = m_pCryptoHandler->DecryptStart(m_ObjNum, m_GenNum);\n    }\n    m_pCryptoHandler->DecryptStream(m_pContext, src_buf, src_size, dest_buf);\n}\nvoid CPDF_DecryptFilter::v_FilterFinish(CFX_BinaryBuf& dest_buf)\n{\n    m_bEOF = TRUE;\n    if (m_pContext == NULL) {\n        return;\n    }\n    m_pCryptoHandler->DecryptFinish(m_pContext, dest_buf);\n    m_pContext = NULL;\n}\nextern \"C\" {\n    static void* my_alloc_func (void* opaque, unsigned int items, unsigned int size)\n    {\n        return FX_Alloc(FX_BYTE, items * size);\n    }\n    static void   my_free_func  (void* opaque, void* address)\n    {\n        FX_Free(address);\n    }\n    void* FPDFAPI_FlateInit(void* (*alloc_func)(void*, unsigned int, unsigned int),\n                            void (*free_func)(void*, void*));\n    void FPDFAPI_FlateInput(void* context, const unsigned char* src_buf, unsigned int src_size);\n    int FPDFAPI_FlateOutput(void* context, unsigned char* dest_buf, unsigned int dest_size);\n    int FPDFAPI_FlateGetAvailIn(void* context);\n    int FPDFAPI_FlateGetAvailOut(void* context);\n    void FPDFAPI_FlateEnd(void* context);\n}\nCPDF_FlateFilter::CPDF_FlateFilter()\n{\n    m_pContext = NULL;\n}\nCPDF_FlateFilter::~CPDF_FlateFilter()\n{\n    if (m_pContext) {\n        FPDFAPI_FlateEnd(m_pContext);\n    }\n}\nvoid CPDF_FlateFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)\n{\n    if (m_pContext == NULL) {\n        m_pContext = FPDFAPI_FlateInit(my_alloc_func, my_free_func);\n    }\n    FPDFAPI_FlateInput(m_pContext, src_buf, src_size);\n    while (1) {\n        int ret = FPDFAPI_FlateOutput(m_pContext, m_DestBuffer, FPDF_FILTER_BUFFER_SIZE);\n        int out_size = FPDF_FILTER_BUFFER_SIZE - FPDFAPI_FlateGetAvailOut(m_pContext);\n        dest_buf.AppendBlock(m_DestBuffer, out_size);\n        if (ret == Z_BUF_ERROR) {\n            break;\n        }\n        if (ret != Z_OK) {\n            ReportEOF(FPDFAPI_FlateGetAvailIn(m_pContext));\n            break;\n        }\n    }\n}\nCPDF_LzwFilter::CPDF_LzwFilter(FX_BOOL bEarlyChange)\n{\n    m_bEarlyChange = bEarlyChange ? 1 : 0;\n    m_CodeLen = 9;\n    m_nCodes = 0;\n    m_nLeftBits = 0;\n    m_LeftBits = 0;\n    m_OldCode = (FX_DWORD) - 1;\n}\nvoid CPDF_LzwFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)\n{\n    for (FX_DWORD i = 0; i < src_size; i ++) {\n        if (m_nLeftBits + 8 < m_CodeLen) {\n            m_nLeftBits += 8;\n            m_LeftBits = (m_LeftBits << 8) | src_buf[i];\n            continue;\n        }\n        FX_DWORD new_bits = m_CodeLen - m_nLeftBits;\n        FX_DWORD code = (m_LeftBits << new_bits) | (src_buf[i] >> (8 - new_bits));\n        m_nLeftBits = 8 - new_bits;\n        m_LeftBits = src_buf[i] % (1 << m_nLeftBits);\n        if (code < 256) {\n            dest_buf.AppendByte((FX_BYTE)code);\n            m_LastChar = (FX_BYTE)code;\n            if (m_OldCode != -1) {\n                AddCode(m_OldCode, m_LastChar);\n            }\n            m_OldCode = code;\n        } else if (code == 256) {\n            m_CodeLen = 9;\n            m_nCodes = 0;\n            m_OldCode = (FX_DWORD) - 1;\n        } else if (code == 257) {\n            ReportEOF(src_size - i - 1);\n            return;\n        } else {\n            if (m_OldCode == -1) {\n                ReportEOF(src_size - i - 1);\n                return;\n            }\n            m_StackLen = 0;\n            if (code >= m_nCodes + 258) {\n                if (m_StackLen < sizeof(m_DecodeStack)) {\n                    m_DecodeStack[m_StackLen++] = m_LastChar;\n                }\n                DecodeString(m_OldCode);\n            } else {\n                DecodeString(code);\n            }\n            dest_buf.AppendBlock(NULL, m_StackLen);\n            FX_LPBYTE pOutput = dest_buf.GetBuffer() + dest_buf.GetSize() - m_StackLen;\n            for (FX_DWORD cc = 0; cc < m_StackLen; cc ++) {\n                pOutput[cc] = m_DecodeStack[m_StackLen - cc - 1];\n            }\n            m_LastChar = m_DecodeStack[m_StackLen - 1];\n            if (m_OldCode < 256) {\n                AddCode(m_OldCode, m_LastChar);\n            } else if (m_OldCode - 258 >= m_nCodes) {\n                ReportEOF(src_size - i - 1);\n                return;\n            } else {\n                AddCode(m_OldCode, m_LastChar);\n            }\n            m_OldCode = code;\n        }\n    }\n}\nvoid CPDF_LzwFilter::AddCode(FX_DWORD prefix_code, FX_BYTE append_char)\n{\n    if (m_nCodes + m_bEarlyChange == 4094) {\n        return;\n    }\n    m_CodeArray[m_nCodes ++] = (prefix_code << 16) | append_char;\n    if (m_nCodes + m_bEarlyChange == 512 - 258) {\n        m_CodeLen = 10;\n    } else if (m_nCodes + m_bEarlyChange == 1024 - 258) {\n        m_CodeLen = 11;\n    } else if (m_nCodes + m_bEarlyChange == 2048 - 258) {\n        m_CodeLen = 12;\n    }\n}\nvoid CPDF_LzwFilter::DecodeString(FX_DWORD code)\n{\n    while (1) {\n        int index = code - 258;\n        if (index < 0 || index >= (int)m_nCodes) {\n            break;\n        }\n        FX_DWORD data = m_CodeArray[index];\n        if (m_StackLen >= sizeof(m_DecodeStack)) {\n            return;\n        }\n        m_DecodeStack[m_StackLen++] = (FX_BYTE)data;\n        code = data >> 16;\n    }\n    if (m_StackLen >= sizeof(m_DecodeStack)) {\n        return;\n    }\n    m_DecodeStack[m_StackLen++] = (FX_BYTE)code;\n}\nCPDF_PredictorFilter::CPDF_PredictorFilter(int predictor, int colors, int bpc, int cols)\n{\n    m_bTiff = predictor < 10;\n    m_pRefLine = NULL;\n    m_pCurLine = NULL;\n    m_iLine = 0;\n    m_LineInSize = 0;\n    m_Bpp = (colors * bpc + 7) / 8;\n    m_Pitch = (colors * bpc * cols + 7) / 8;\n    if (!m_bTiff) {\n        m_Pitch ++;\n    }\n}\nCPDF_PredictorFilter::~CPDF_PredictorFilter()\n{\n    if (m_pCurLine) {\n        FX_Free(m_pCurLine);\n    }\n    if (m_pRefLine) {\n        FX_Free(m_pRefLine);\n    }\n}\nstatic FX_BYTE PaethPredictor(int a, int b, int c)\n{\n    int p = a + b - c;\n    int pa = FXSYS_abs(p - a);\n    int pb = FXSYS_abs(p - b);\n    int pc = FXSYS_abs(p - c);\n    if (pa <= pb && pa <= pc) {\n        return (FX_BYTE)a;\n    }\n    if (pb <= pc) {\n        return (FX_BYTE)b;\n    }\n    return (FX_BYTE)c;\n}\nstatic void PNG_PredictorLine(FX_LPBYTE cur_buf, FX_LPBYTE ref_buf, int pitch, int Bpp)\n{\n    FX_BYTE tag = cur_buf[0];\n    if (tag == 0) {\n        return;\n    }\n    cur_buf ++;\n    if (ref_buf) {\n        ref_buf ++;\n    }\n    for (int byte = 0; byte < pitch; byte ++) {\n        FX_BYTE raw_byte = cur_buf[byte];\n        switch (tag) {\n            case 1:\t{\n                    FX_BYTE left = 0;\n                    if (byte >= Bpp) {\n                        left = cur_buf[byte - Bpp];\n                    }\n                    cur_buf[byte] = raw_byte + left;\n                    break;\n                }\n            case 2: {\n                    FX_BYTE up = 0;\n                    if (ref_buf) {\n                        up = ref_buf[byte];\n                    }\n                    cur_buf[byte] = raw_byte + up;\n                    break;\n                }\n            case 3: {\n                    FX_BYTE left = 0;\n                    if (byte >= Bpp) {\n                        left = cur_buf[byte - Bpp];\n                    }\n                    FX_BYTE up = 0;\n                    if (ref_buf) {\n                        up = ref_buf[byte];\n                    }\n                    cur_buf[byte] = raw_byte + (up + left) / 2;\n                    break;\n                }\n            case 4: {\n                    FX_BYTE left = 0;\n                    if (byte >= Bpp) {\n                        left = cur_buf[byte - Bpp];\n                    }\n                    FX_BYTE up = 0;\n                    if (ref_buf) {\n                        up = ref_buf[byte];\n                    }\n                    FX_BYTE upper_left = 0;\n                    if (byte >= Bpp && ref_buf) {\n                        upper_left = ref_buf[byte - Bpp];\n                    }\n                    cur_buf[byte] = raw_byte + PaethPredictor(left, up, upper_left);\n                    break;\n                }\n        }\n    }\n}\nvoid CPDF_PredictorFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)\n{\n    if (m_pCurLine == NULL) {\n        m_pCurLine = FX_Alloc(FX_BYTE, m_Pitch);\n        if (!m_bTiff) {\n            m_pRefLine = FX_Alloc(FX_BYTE, m_Pitch);\n        }\n    }\n    while (1) {\n        FX_DWORD read_size = m_Pitch - m_LineInSize;\n        if (read_size > src_size) {\n            read_size = src_size;\n        }\n        FXSYS_memcpy32(m_pCurLine + m_LineInSize, src_buf, read_size);\n        m_LineInSize += read_size;\n        if (m_LineInSize < m_Pitch) {\n            break;\n        }\n        src_buf += read_size;\n        src_size -= read_size;\n        if (m_bTiff) {\n            for (FX_DWORD byte = m_Bpp; byte < m_Pitch; byte ++) {\n                m_pCurLine[byte] += m_pCurLine[byte - m_Bpp];\n            }\n            dest_buf.AppendBlock(m_pCurLine, m_Pitch);\n        } else {\n            PNG_PredictorLine(m_pCurLine, m_iLine ? m_pRefLine : NULL, m_Pitch - 1, m_Bpp);\n            dest_buf.AppendBlock(m_pCurLine + 1, m_Pitch - 1);\n            m_iLine ++;\n            FX_LPBYTE temp = m_pCurLine;\n            m_pCurLine = m_pRefLine;\n            m_pRefLine = temp;\n        }\n        m_LineInSize = 0;\n    }\n}\nCPDF_Ascii85Filter::CPDF_Ascii85Filter()\n{\n    m_State = 0;\n    m_CharCount = 0;\n}\nextern const FX_LPCSTR _PDF_CharType;\nvoid CPDF_Ascii85Filter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)\n{\n    for (FX_DWORD i = 0; i < src_size; i ++) {\n        FX_BYTE byte = src_buf[i];\n        if (_PDF_CharType[byte] == 'W') {\n            continue;\n        }\n        switch (m_State) {\n            case 0:\n                if (byte >= '!' && byte <= 'u') {\n                    int digit = byte - '!';\n                    m_CurDWord = digit;\n                    m_CharCount = 1;\n                    m_State = 1;\n                } else if (byte == 'z') {\n                    int zero = 0;\n                    dest_buf.AppendBlock(&zero, 4);\n                } else if (byte == '~') {\n                    m_State = 2;\n                }\n                break;\n            case 1: {\n                    if (byte >= '!' && byte <= 'u') {\n                        int digit = byte - '!';\n                        m_CurDWord = m_CurDWord * 85 + digit;\n                        m_CharCount ++;\n                        if (m_CharCount == 5) {\n                            for (int i = 0; i < 4; i ++) {\n                                dest_buf.AppendByte((FX_BYTE)(m_CurDWord >> (3 - i) * 8));\n                            }\n                            m_State = 0;\n                        }\n                    } else if (byte == '~') {\n                        if (m_CharCount > 1) {\n                            int i;\n                            for (i = m_CharCount; i < 5; i ++) {\n                                m_CurDWord = m_CurDWord * 85 + 84;\n                            }\n                            for (i = 0; i < m_CharCount - 1; i ++) {\n                                dest_buf.AppendByte((FX_BYTE)(m_CurDWord >> (3 - i) * 8));\n                            }\n                        }\n                        m_State = 2;\n                    }\n                    break;\n                }\n            case 2:\n                if (byte == '>') {\n                    ReportEOF(src_size - i - 1);\n                    return;\n                }\n                break;\n        }\n    }\n}\nCPDF_AsciiHexFilter::CPDF_AsciiHexFilter()\n{\n    m_State = 0;\n}\nvoid CPDF_AsciiHexFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)\n{\n    for (FX_DWORD i = 0; i < src_size; i ++) {\n        FX_BYTE byte = src_buf[i];\n        if (_PDF_CharType[byte] == 'W') {\n            continue;\n        }\n        int digit;\n        if (byte >= '0' && byte <= '9') {\n            digit = byte - '0';\n        } else if (byte >= 'a' && byte <= 'f') {\n            digit = byte - 'a' + 10;\n        } else if (byte >= 'A' && byte <= 'F') {\n            digit = byte - 'A' + 10;\n        } else {\n            if (m_State) {\n                dest_buf.AppendByte(m_FirstDigit * 16);\n            }\n            ReportEOF(src_size - i - 1);\n            return;\n        }\n        if (m_State == 0) {\n            m_FirstDigit = digit;\n            m_State ++;\n        } else {\n            dest_buf.AppendByte(m_FirstDigit * 16 + digit);\n            m_State --;\n        }\n    }\n}\nCPDF_RunLenFilter::CPDF_RunLenFilter()\n{\n    m_State = 0;\n    m_Count = 0;\n}\nvoid CPDF_RunLenFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)\n{\n    for (FX_DWORD i = 0; i < src_size; i ++) {\n        FX_BYTE byte = src_buf[i];\n        switch (m_State) {\n            case 0:\n                if (byte < 128) {\n                    m_State = 1;\n                    m_Count = byte + 1;\n                } else if (byte == 128) {\n                    ReportEOF(src_size - i - 1);\n                    return;\n                } else {\n                    m_State = 2;\n                    m_Count = 257 - byte;\n                }\n                break;\n            case 1:\n                dest_buf.AppendByte(byte);\n                m_Count --;\n                if (m_Count == 0) {\n                    m_State = 0;\n                }\n                break;\n            case 2:\t{\n                    dest_buf.AppendBlock(NULL, m_Count);\n                    FXSYS_memset8(dest_buf.GetBuffer() + dest_buf.GetSize() - m_Count, byte, m_Count);\n                    m_State = 0;\n                    break;\n                }\n        }\n    }\n}\nCPDF_JpegFilter::CPDF_JpegFilter()\n{\n    m_pContext = NULL;\n    m_bGotHeader = FALSE;\n    m_pScanline = NULL;\n    m_iLine = 0;\n}\nCPDF_JpegFilter::~CPDF_JpegFilter()\n{\n    if (m_pScanline) {\n        FX_Free(m_pScanline);\n    }\n    if (m_pContext) {\n        CPDF_ModuleMgr::Get()->GetJpegModule()->Finish(m_pContext);\n    }\n}\nvoid CPDF_JpegFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)\n{\n    if (m_pContext == NULL) {\n        m_pContext = CPDF_ModuleMgr::Get()->GetJpegModule()->Start();\n    }\n    FX_LPCBYTE jpeg_src_buf;\n    FX_DWORD jpeg_src_size;\n    CFX_BinaryBuf temp_buf;\n    if (m_InputBuf.GetSize()) {\n        temp_buf.EstimateSize(m_InputBuf.GetSize() + src_size);\n        temp_buf.AppendBlock(m_InputBuf.GetBuffer(), m_InputBuf.GetSize());\n        m_InputBuf.Clear();\n        temp_buf.AppendBlock(src_buf, src_size);\n        jpeg_src_buf = temp_buf.GetBuffer();\n        jpeg_src_size = temp_buf.GetSize();\n    } else {\n        jpeg_src_buf = src_buf;\n        jpeg_src_size = src_size;\n    }\n    CPDF_ModuleMgr::Get()->GetJpegModule()->Input(m_pContext, jpeg_src_buf, jpeg_src_size);\n    if (!m_bGotHeader) {\n        int ret = CPDF_ModuleMgr::Get()->GetJpegModule()->ReadHeader(m_pContext, &m_Width, &m_Height, &m_nComps);\n        int left_size = CPDF_ModuleMgr::Get()->GetJpegModule()->GetAvailInput(m_pContext);\n        if (ret == 1) {\n            ReportEOF(left_size);\n            return;\n        }\n        if (ret == 2) {\n            m_InputBuf.AppendBlock(jpeg_src_buf + jpeg_src_size - left_size, left_size);\n            return;\n        }\n        CPDF_ModuleMgr::Get()->GetJpegModule()->StartScanline(m_pContext, 1);\n        m_bGotHeader = TRUE;\n        m_Pitch = m_Width * m_nComps;\n    }\n    if (m_pScanline == NULL) {\n        m_pScanline = FX_Alloc(FX_BYTE, m_Pitch + 4);\n    }\n    while (1) {\n        if (!CPDF_ModuleMgr::Get()->GetJpegModule()->ReadScanline(m_pContext, m_pScanline)) {\n            int left_size = CPDF_ModuleMgr::Get()->GetJpegModule()->GetAvailInput(m_pContext);\n            m_InputBuf.AppendBlock(jpeg_src_buf + jpeg_src_size - left_size, left_size);\n            break;\n        }\n        dest_buf.AppendBlock(m_pScanline, m_Pitch);\n        m_iLine ++;\n        if (m_iLine == m_Height) {\n            ReportEOF(CPDF_ModuleMgr::Get()->GetJpegModule()->GetAvailInput(m_pContext));\n            return;\n        }\n    }\n}\nCPDF_FaxFilter::CPDF_FaxFilter()\n{\n    m_Encoding = 0;\n    m_bEndOfLine = FALSE;\n    m_bByteAlign = FALSE;\n    m_bBlack = FALSE;\n    m_nRows = 0;\n    m_nColumns = 0;\n    m_Pitch = 0;\n    m_pScanlineBuf = NULL;\n    m_pRefBuf = NULL;\n    m_iRow = 0;\n    m_InputBitPos = 0;\n}\nCPDF_FaxFilter::~CPDF_FaxFilter()\n{\n    if (m_pScanlineBuf) {\n        FX_Free(m_pScanlineBuf);\n    }\n    if (m_pRefBuf) {\n        FX_Free(m_pRefBuf);\n    }\n}\nFX_BOOL CPDF_FaxFilter::Initialize(int Encoding, int bEndOfLine, int bByteAlign, int bBlack, int nRows, int nColumns)\n{\n    m_Encoding = Encoding;\n    m_bEndOfLine = bEndOfLine;\n    m_bByteAlign = bByteAlign;\n    m_bBlack = bBlack;\n    m_nRows = nRows;\n    m_nColumns = nColumns;\n    m_Pitch = (m_nColumns + 7) / 8;\n    m_pScanlineBuf = FX_Alloc(FX_BYTE, m_Pitch);\n    m_pRefBuf = FX_Alloc(FX_BYTE, m_Pitch);\n    FXSYS_memset8(m_pScanlineBuf, 0xff, m_Pitch);\n    FXSYS_memset8(m_pRefBuf, 0xff, m_Pitch);\n    m_iRow = 0;\n    m_InputBitPos = 0;\n    return TRUE;\n}\nvoid CPDF_FaxFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)\n{\n    FX_LPCBYTE fax_src_buf;\n    FX_DWORD fax_src_size;\n    CFX_BinaryBuf temp_buf;\n    int bitpos;\n    if (m_InputBuf.GetSize()) {\n        temp_buf.EstimateSize(m_InputBuf.GetSize() + src_size);\n        temp_buf.AppendBlock(m_InputBuf.GetBuffer(), m_InputBuf.GetSize());\n        m_InputBuf.Clear();\n        temp_buf.AppendBlock(src_buf, src_size);\n        fax_src_buf = temp_buf.GetBuffer();\n        fax_src_size = temp_buf.GetSize();\n        bitpos = m_InputBitPos;\n    } else {\n        fax_src_buf = src_buf;\n        fax_src_size = src_size;\n        bitpos = 0;\n    }\n    ProcessData(fax_src_buf, fax_src_size, bitpos, FALSE, dest_buf);\n    int left_bits = fax_src_size * 8 - bitpos;\n    m_InputBuf.AppendBlock(fax_src_buf + bitpos / 8, (left_bits + 7) / 8);\n    m_InputBitPos = bitpos % 8;\n}\nvoid CPDF_FaxFilter::v_FilterFinish(CFX_BinaryBuf& dest_buf)\n{\n    ProcessData(m_InputBuf.GetBuffer(), m_InputBuf.GetSize(), m_InputBitPos, TRUE, dest_buf);\n}\nFX_BOOL _FaxSkipEOL(const FX_BYTE* src_buf, int bitsize, int& bitpos);\nFX_BOOL _FaxG4GetRow(const FX_BYTE* src_buf, int bitsize, int& bitpos, FX_LPBYTE dest_buf, const FX_BYTE* ref_buf, int columns);\nFX_BOOL _FaxGet1DLine(const FX_BYTE* src_buf, int bitsize, int& bitpos, FX_LPBYTE dest_buf, int columns);\nvoid CPDF_FaxFilter::ProcessData(FX_LPCBYTE src_buf, FX_DWORD src_size, int& bitpos, FX_BOOL bFinish,\n                                 CFX_BinaryBuf& dest_buf)\n{\n    int bitsize = src_size * 8;\n    while (1) {\n        if ((bitsize < bitpos + 256) && !bFinish) {\n            return;\n        }\n        int start_bitpos = bitpos;\n        FXSYS_memset8(m_pScanlineBuf, 0xff, m_Pitch);\n        if (!ReadLine(src_buf, bitsize, bitpos)) {\n            bitpos = start_bitpos;\n            return;\n        }\n        if (m_Encoding) {\n            FXSYS_memcpy32(m_pRefBuf, m_pScanlineBuf, m_Pitch);\n        }\n        if (m_bBlack) {\n            for (int i = 0; i < m_Pitch; i ++) {\n                m_pScanlineBuf[i] = ~m_pScanlineBuf[i];\n            }\n        }\n        dest_buf.AppendBlock(m_pScanlineBuf, m_Pitch);\n        m_iRow ++;\n        if (m_iRow == m_nRows) {\n            ReportEOF(src_size - (bitpos + 7) / 8);\n            return;\n        }\n    }\n}\nFX_BOOL CPDF_FaxFilter::ReadLine(FX_LPCBYTE src_buf, int bitsize, int& bitpos)\n{\n    if (!_FaxSkipEOL(src_buf, bitsize, bitpos)) {\n        return FALSE;\n    }\n    FX_BOOL ret;\n    if (m_Encoding < 0) {\n        ret = _FaxG4GetRow(src_buf, bitsize, bitpos, m_pScanlineBuf, m_pRefBuf, m_nColumns);\n    } else if (m_Encoding == 0) {\n        ret = _FaxGet1DLine(src_buf, bitsize, bitpos, m_pScanlineBuf, m_nColumns);\n    } else {\n        if (bitpos == bitsize) {\n            return FALSE;\n        }\n        FX_BOOL bNext1D = src_buf[bitpos / 8] & (1 << (7 - bitpos % 8));\n        bitpos ++;\n        if (bNext1D) {\n            ret = _FaxGet1DLine(src_buf, bitsize, bitpos, m_pScanlineBuf, m_nColumns);\n        } else {\n            ret = _FaxG4GetRow(src_buf, bitsize, bitpos, m_pScanlineBuf, m_pRefBuf, m_nColumns);\n        }\n    }\n    if (!ret) {\n        return FALSE;\n    }\n    if (m_bEndOfLine)\n        if (!_FaxSkipEOL(src_buf, bitsize, bitpos)) {\n            return FALSE;\n        }\n    if (m_bByteAlign) {\n        bitpos = (bitpos + 7) / 8 * 8;\n    }\n    return TRUE;\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_parser.h\"\nvoid CPDF_Object::Release()\n{\n    if (m_ObjNum) {\n        return;\n    }\n    Destroy();\n}\nvoid CPDF_Object::Destroy()\n{\n    switch (m_Type) {\n        case PDFOBJ_STRING:\n            delete (CPDF_String*)this;\n            break;\n        case PDFOBJ_NAME:\n            delete (CPDF_Name*)this;\n            break;\n        case PDFOBJ_ARRAY:\n            delete (CPDF_Array*)this;\n            break;\n        case PDFOBJ_DICTIONARY:\n            delete (CPDF_Dictionary*)this;\n            break;\n        case PDFOBJ_STREAM:\n            delete (CPDF_Stream*)this;\n            break;\n        default:\n            delete this;\n    }\n}\nCFX_ByteString CPDF_Object::GetString() const\n{\n    switch (m_Type) {\n        case PDFOBJ_BOOLEAN:\n            return ((CPDF_Boolean*)this)->m_bValue ? \"true\" : \"false\";\n        case PDFOBJ_NUMBER:\n            return ((CPDF_Number*)this)->GetString();\n        case PDFOBJ_STRING:\n            return ((CPDF_String*)this)->m_String;\n        case PDFOBJ_NAME:\n            return ((CPDF_Name*)this)->m_Name;\n        case PDFOBJ_REFERENCE: {\n                CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;\n                if (pRef->m_pObjList == NULL) {\n                    break;\n                }\n                CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);\n                if (pObj == NULL) {\n                    return CFX_ByteString();\n                }\n                return pObj->GetString();\n            }\n    }\n    return CFX_ByteString();\n}\nCFX_ByteStringC CPDF_Object::GetConstString() const\n{\n    switch (m_Type) {\n        case PDFOBJ_STRING:\n            return CFX_ByteStringC((FX_LPCBYTE)((CPDF_String*)this)->m_String, ((CPDF_String*)this)->m_String.GetLength());\n        case PDFOBJ_NAME:\n            return CFX_ByteStringC((FX_LPCBYTE)((CPDF_Name*)this)->m_Name, ((CPDF_Name*)this)->m_Name.GetLength());\n        case PDFOBJ_REFERENCE: {\n                CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;\n                if (pRef->m_pObjList == NULL) {\n                    break;\n                }\n                CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);\n                if (pObj == NULL) {\n                    return CFX_ByteStringC();\n                }\n                return pObj->GetConstString();\n            }\n    }\n    return CFX_ByteStringC();\n}\nFX_FLOAT CPDF_Object::GetNumber() const\n{\n    switch (m_Type) {\n        case PDFOBJ_NUMBER:\n            return ((CPDF_Number*)this)->GetNumber();\n        case PDFOBJ_REFERENCE: {\n                CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;\n                if (pRef->m_pObjList == NULL) {\n                    break;\n                }\n                CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);\n                if (pObj == NULL) {\n                    return 0;\n                }\n                return pObj->GetNumber();\n            }\n    }\n    return 0;\n}\nFX_FLOAT CPDF_Object::GetNumber16() const\n{\n    return GetNumber();\n}\nint CPDF_Object::GetInteger() const\n{\n    switch (m_Type) {\n        case PDFOBJ_BOOLEAN:\n            return ((CPDF_Boolean*)this)->m_bValue;\n        case PDFOBJ_NUMBER:\n            return ((CPDF_Number*)this)->GetInteger();\n        case PDFOBJ_REFERENCE: {\n                CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;\n                PARSE_CONTEXT context;\n                FXSYS_memset32(&context, 0, sizeof(PARSE_CONTEXT));\n                if (pRef->m_pObjList == NULL) {\n                    return 0;\n                }\n                CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum, &context);\n                if (pObj == NULL) {\n                    return 0;\n                }\n                return pObj->GetInteger();\n            }\n    }\n    return 0;\n}\nCPDF_Dictionary* CPDF_Object::GetDict() const\n{\n    switch (m_Type) {\n        case PDFOBJ_DICTIONARY:\n            return (CPDF_Dictionary*)this;\n        case PDFOBJ_STREAM:\n            return ((CPDF_Stream*)this)->GetDict();\n        case PDFOBJ_REFERENCE: {\n                CPDF_Reference* pRef = (CPDF_Reference*)this;\n                if (pRef->m_pObjList == NULL) {\n                    break;\n                }\n                CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);\n                if (pObj == NULL) {\n                    return NULL;\n                }\n                return pObj->GetDict();\n            }\n    }\n    return NULL;\n}\nCPDF_Array* CPDF_Object::GetArray() const\n{\n    if (m_Type == PDFOBJ_ARRAY) \n        return (CPDF_Array*)this;\n    else\n        return NULL;\n}\nvoid CPDF_Object::SetString(const CFX_ByteString& str)\n{\n    ASSERT(this != NULL);\n    switch (m_Type) {\n        case PDFOBJ_BOOLEAN:\n            ((CPDF_Boolean*)this)->m_bValue = str == FX_BSTRC(\"true\") ? 1 : 0;\n            return;\n        case PDFOBJ_NUMBER:\n            ((CPDF_Number*)this)->SetString(str);\n            return;\n        case PDFOBJ_STRING:\n            ((CPDF_String*)this)->m_String = str;\n            return;\n        case PDFOBJ_NAME:\n            ((CPDF_Name*)this)->m_Name = str;\n            return;\n    }\n    ASSERT(FALSE);\n}\nint CPDF_Object::GetDirectType() const\n{\n    if (m_Type != PDFOBJ_REFERENCE) {\n        return m_Type;\n    }\n    CPDF_Reference* pRef = (CPDF_Reference*)this;\n    return pRef->m_pObjList->GetIndirectType(pRef->m_RefObjNum);\n}\nFX_BOOL CPDF_Object::IsIdentical(CPDF_Object* pOther) const\n{\n    if (this == pOther) {\n        return TRUE;\n    }\n    if (pOther == NULL) {\n        return FALSE;\n    }\n    if (pOther->m_Type != m_Type) {\n        if (m_Type == PDFOBJ_REFERENCE && GetDirect()) {\n            return GetDirect()->IsIdentical(pOther);\n        } else if (pOther->m_Type == PDFOBJ_REFERENCE) {\n            return IsIdentical(pOther->GetDirect());\n        }\n        return FALSE;\n    }\n    switch (m_Type) {\n        case PDFOBJ_BOOLEAN:\n            return (((CPDF_Boolean*)this)->Identical((CPDF_Boolean*)pOther));\n        case PDFOBJ_NUMBER:\n            return (((CPDF_Number*)this)->Identical((CPDF_Number*)pOther));\n        case PDFOBJ_STRING:\n            return (((CPDF_String*)this)->Identical((CPDF_String*)pOther));\n        case PDFOBJ_NAME:\n            return (((CPDF_Name*)this)->Identical((CPDF_Name*)pOther));\n        case PDFOBJ_ARRAY:\n            return (((CPDF_Array*)this)->Identical((CPDF_Array*)pOther));\n        case PDFOBJ_DICTIONARY:\n            return (((CPDF_Dictionary*)this)->Identical((CPDF_Dictionary*)pOther));\n        case PDFOBJ_NULL:\n            return TRUE;\n        case PDFOBJ_STREAM:\n            return (((CPDF_Stream*)this)->Identical((CPDF_Stream*)pOther));\n        case PDFOBJ_REFERENCE:\n            return (((CPDF_Reference*)this)->Identical((CPDF_Reference*)pOther));\n    }\n    return FALSE;\n}\nCPDF_Object* CPDF_Object::GetDirect() const\n{\n    if (m_Type != PDFOBJ_REFERENCE) {\n        return (CPDF_Object*)this;\n    }\n    CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;\n    if (pRef->m_pObjList == NULL) {\n        return NULL;\n    }\n    return pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);\n}\nCPDF_Object* CPDF_Object::Clone(FX_BOOL bDirect) const\n{\n    CFX_MapPtrToPtr visited;\n    return CloneInternal(bDirect, &visited);\n}\nCPDF_Object* CPDF_Object::CloneInternal(FX_BOOL bDirect, CFX_MapPtrToPtr* visited) const\n{\n    switch (m_Type) {\n        case PDFOBJ_BOOLEAN:\n            return FX_NEW CPDF_Boolean(((CPDF_Boolean*)this)->m_bValue);\n        case PDFOBJ_NUMBER:\n            return FX_NEW CPDF_Number(((CPDF_Number*)this)->m_bInteger, &((CPDF_Number*)this)->m_Integer);\n        case PDFOBJ_STRING:\n            return FX_NEW CPDF_String(((CPDF_String*)this)->m_String, ((CPDF_String*)this)->IsHex());\n        case PDFOBJ_NAME:\n            return FX_NEW CPDF_Name(((CPDF_Name*)this)->m_Name);\n        case PDFOBJ_ARRAY: {\n                CPDF_Array* pCopy = FX_NEW CPDF_Array();\n                CPDF_Array* pThis = (CPDF_Array*)this;\n                int n = pThis->GetCount();\n                for (int i = 0; i < n; i ++) {\n                    CPDF_Object* value = (CPDF_Object*)pThis->m_Objects.GetAt(i);\n                    pCopy->m_Objects.Add(value->CloneInternal(bDirect, visited));\n                }\n                return pCopy;\n            }\n        case PDFOBJ_DICTIONARY: {\n                CPDF_Dictionary* pCopy = FX_NEW CPDF_Dictionary();\n                CPDF_Dictionary* pThis = (CPDF_Dictionary*)this;\n                FX_POSITION pos = pThis->m_Map.GetStartPosition();\n                while (pos) {\n                    CFX_ByteString key;\n                    CPDF_Object* value;\n                    pThis->m_Map.GetNextAssoc(pos, key, (void*&)value);\n                    pCopy->m_Map.SetAt(key, value->CloneInternal(bDirect, visited));\n                }\n                return pCopy;\n            }\n        case PDFOBJ_NULL: {\n                return FX_NEW CPDF_Null;\n            }\n        case PDFOBJ_STREAM: {\n                CPDF_Stream* pThis = (CPDF_Stream*)this;\n                CPDF_StreamAcc acc;\n                acc.LoadAllData(pThis, TRUE);\n                FX_DWORD streamSize = acc.GetSize();\n                CPDF_Stream* pObj;\n                if (pThis->GetDict())\n                    pObj = FX_NEW CPDF_Stream(acc.DetachData(), streamSize, (CPDF_Dictionary*)((CPDF_Object*)pThis->GetDict())->CloneInternal(bDirect, visited));\n                else\n                    pObj = FX_NEW CPDF_Stream(acc.DetachData(), streamSize, NULL);\n                return pObj;\n            }\n        case PDFOBJ_REFERENCE: {\n                CPDF_Reference* pRef = (CPDF_Reference*)this;\n                FX_DWORD obj_num = pRef->m_RefObjNum;\n                if (bDirect && !visited->GetValueAt((void*)(FX_UINTPTR)obj_num)) {\n                    visited->SetAt((void*)(FX_UINTPTR)obj_num, (void*)1);\n                    CPDF_Object* ret;\n                    if (pRef->GetDirect())\n                        ret = pRef->GetDirect()->CloneInternal(TRUE, visited);\n                    else\n                        ret = NULL;\n                    return ret;\n                } else {\n                    return FX_NEW CPDF_Reference(pRef->m_pObjList, obj_num);\n                }\n            }\n    }\n    return NULL;\n}\nCPDF_Object* CPDF_Object::CloneRef(CPDF_IndirectObjects* pDoc) const\n{\n    if (m_ObjNum) {\n        return FX_NEW CPDF_Reference(pDoc, m_ObjNum);\n    }\n    return Clone();\n}\nCFX_WideString CPDF_Object::GetUnicodeText(CFX_CharMap* pCharMap) const\n{\n    if (m_Type == PDFOBJ_STRING) {\n        return PDF_DecodeText(((CPDF_String*)this)->m_String, pCharMap);\n    } else if (m_Type == PDFOBJ_STREAM) {\n        CPDF_StreamAcc stream;\n        stream.LoadAllData((CPDF_Stream*)this, FALSE);\n        CFX_WideString result = PDF_DecodeText(stream.GetData(), stream.GetSize(), pCharMap);\n        return result;\n    } else if (m_Type == PDFOBJ_NAME) {\n        return PDF_DecodeText(((CPDF_Name*)this)->m_Name, pCharMap);\n    }\n    return CFX_WideString();\n}\nvoid CPDF_Object::SetUnicodeText(FX_LPCWSTR pUnicodes, int len)\n{\n    if (m_Type == PDFOBJ_STRING) {\n        ((CPDF_String*)this)->m_String = PDF_EncodeText(pUnicodes, len);\n    } else if (m_Type == PDFOBJ_STREAM) {\n        CFX_ByteString result = PDF_EncodeText(pUnicodes, len);\n        ((CPDF_Stream*)this)->SetData((FX_LPBYTE)(FX_LPCSTR)result, result.GetLength(), FALSE, FALSE);\n    }\n}\nCPDF_Number::CPDF_Number(int value)\n{\n    m_Type = PDFOBJ_NUMBER;\n    m_bInteger = TRUE;\n    m_Integer = value;\n}\nCPDF_Number::CPDF_Number(FX_FLOAT value)\n{\n    m_Type = PDFOBJ_NUMBER;\n    m_bInteger = FALSE;\n    m_Float = value;\n}\nCPDF_Number::CPDF_Number(FX_BOOL bInteger, void* pData)\n{\n    m_Type = PDFOBJ_NUMBER;\n    m_bInteger = bInteger;\n    m_Integer = *(int*)pData;\n}\nextern void FX_atonum(FX_BSTR, FX_BOOL&, void*);\nCPDF_Number::CPDF_Number(FX_BSTR str)\n{\n    m_Type = PDFOBJ_NUMBER;\n    FX_atonum(str, m_bInteger, &m_Integer);\n}\nvoid CPDF_Number::SetString(FX_BSTR str)\n{\n    FX_atonum(str, m_bInteger, &m_Integer);\n}\nFX_BOOL CPDF_Number::Identical(CPDF_Number* pOther) const\n{\n    return m_bInteger == pOther->m_bInteger && m_Integer == pOther->m_Integer;\n}\nCFX_ByteString CPDF_Number::GetString() const\n{\n    return m_bInteger ? CFX_ByteString::FormatInteger(m_Integer, FXFORMAT_SIGNED) : CFX_ByteString::FormatFloat(m_Float);\n}\nvoid CPDF_Number::SetNumber(FX_FLOAT value)\n{\n    m_bInteger = FALSE;\n    m_Float = value;\n}\nCPDF_String::CPDF_String(const CFX_WideString& str)\n{\n    m_Type = PDFOBJ_STRING;\n    m_String = PDF_EncodeText(str, str.GetLength());\n    m_bHex = FALSE;\n}\nCPDF_Array::~CPDF_Array()\n{\n    int size = m_Objects.GetSize();\n    CPDF_Object** pList = (CPDF_Object**)m_Objects.GetData();\n    for (int i = 0; i < size; i ++) {\n        if (pList[i])\n            pList[i]->Release();\n    }\n}\nCFX_FloatRect CPDF_Array::GetRect()\n{\n    CFX_FloatRect rect;\n    if (m_Type != PDFOBJ_ARRAY || m_Objects.GetSize() != 4) {\n        return rect;\n    }\n    rect.left = GetNumber(0);\n    rect.bottom = GetNumber(1);\n    rect.right = GetNumber(2);\n    rect.top = GetNumber(3);\n    return rect;\n}\nCFX_AffineMatrix CPDF_Array::GetMatrix()\n{\n    CFX_AffineMatrix matrix;\n    if (m_Type != PDFOBJ_ARRAY || m_Objects.GetSize() != 6) {\n        return matrix;\n    }\n    matrix.Set(GetNumber(0), GetNumber(1), GetNumber(2), GetNumber(3), GetNumber(4), GetNumber(5));\n    return matrix;\n}\nCPDF_Object* CPDF_Array::GetElement(FX_DWORD i) const\n{\n    if (i >= (FX_DWORD)m_Objects.GetSize()) {\n        return NULL;\n    }\n    return (CPDF_Object*)m_Objects.GetAt(i);\n}\nCPDF_Object* CPDF_Array::GetElementValue(FX_DWORD i) const\n{\n    if (i >= (FX_DWORD)m_Objects.GetSize()) {\n        return NULL;\n    }\n    return ((CPDF_Object*)m_Objects.GetAt(i))->GetDirect();\n}\nCFX_ByteString CPDF_Array::GetString(FX_DWORD i) const\n{\n    if (i < (FX_DWORD)m_Objects.GetSize()) {\n        CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);\n        return p->GetString();\n    }\n    else\n        return CFX_ByteString();\n}\nCFX_ByteStringC CPDF_Array::GetConstString(FX_DWORD i) const\n{\n    if (i < (FX_DWORD)m_Objects.GetSize()) {\n        CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);\n        return p->GetConstString();\n    }\n    else\n        return CFX_ByteStringC();\n}\nint CPDF_Array::GetInteger(FX_DWORD i) const\n{\n    if (i >= (FX_DWORD)m_Objects.GetSize()) {\n        return 0;\n    }\n    CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);\n    return p->GetInteger();\n}\nFX_FLOAT CPDF_Array::GetNumber(FX_DWORD i) const\n{\n    if (i >= (FX_DWORD)m_Objects.GetSize()) {\n        return 0;\n    }\n    CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);\n    return p->GetNumber();\n}\nCPDF_Dictionary* CPDF_Array::GetDict(FX_DWORD i) const\n{\n    CPDF_Object* p = GetElementValue(i);\n    if (p == NULL) {\n        return NULL;\n    } else if (p->GetType() == PDFOBJ_DICTIONARY) {\n        return (CPDF_Dictionary*)p;\n    } else if (p->GetType() == PDFOBJ_STREAM) {\n        return ((CPDF_Stream*)p)->GetDict();\n    }\n    return NULL;\n}\nCPDF_Stream* CPDF_Array::GetStream(FX_DWORD i) const\n{\n    CPDF_Object* p = GetElementValue(i);\n    if (p == NULL || p->GetType() != PDFOBJ_STREAM) {\n        return NULL;\n    }\n    return (CPDF_Stream*)p;\n}\nCPDF_Array* CPDF_Array::GetArray(FX_DWORD i) const\n{\n    CPDF_Object* p = GetElementValue(i);\n    if (p == NULL || p->GetType() != PDFOBJ_ARRAY) {\n        return NULL;\n    }\n    return (CPDF_Array*)p;\n}\nvoid CPDF_Array::RemoveAt(FX_DWORD i)\n{\n    ASSERT(m_Type == PDFOBJ_ARRAY);\n    if (i >= (FX_DWORD)m_Objects.GetSize()) {\n        return;\n    }\n    CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);\n    if (p)\n        p->Release();\n    m_Objects.RemoveAt(i);\n}\nvoid CPDF_Array::SetAt(FX_DWORD i, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)\n{\n    ASSERT(m_Type == PDFOBJ_ARRAY);\n    ASSERT(i < (FX_DWORD)m_Objects.GetSize());\n    if (i >= (FX_DWORD)m_Objects.GetSize()) {\n        return;\n    }\n    CPDF_Object* pOld = (CPDF_Object*)m_Objects.GetAt(i);\n    if (pOld)\n        pOld->Release();\n    if (pObj->GetObjNum()) {\n        ASSERT(pObjs != NULL);\n        pObj = CPDF_Reference::Create(pObjs, pObj->GetObjNum());\n    }\n    m_Objects.SetAt(i, pObj);\n}\nvoid CPDF_Array::InsertAt(FX_DWORD index, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)\n{\n    ASSERT(pObj != NULL);\n    if (pObj->GetObjNum()) {\n        ASSERT(pObjs != NULL);\n        pObj = CPDF_Reference::Create(pObjs, pObj->GetObjNum());\n    }\n    m_Objects.InsertAt(index, pObj);\n}\nvoid CPDF_Array::Add(CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)\n{\n    ASSERT(pObj != NULL);\n    if (pObj->GetObjNum()) {\n        ASSERT(pObjs != NULL);\n        pObj = CPDF_Reference::Create(pObjs, pObj->GetObjNum());\n    }\n    m_Objects.Add(pObj);\n}\nvoid CPDF_Array::AddName(const CFX_ByteString& str)\n{\n    ASSERT(m_Type == PDFOBJ_ARRAY);\n    Add(FX_NEW CPDF_Name(str));\n}\nvoid CPDF_Array::AddString(const CFX_ByteString& str)\n{\n    ASSERT(m_Type == PDFOBJ_ARRAY);\n    Add(FX_NEW CPDF_String(str));\n}\nvoid CPDF_Array::AddInteger(int i)\n{\n    ASSERT(m_Type == PDFOBJ_ARRAY);\n    Add(FX_NEW CPDF_Number(i));\n}\nvoid CPDF_Array::AddNumber(FX_FLOAT f)\n{\n    ASSERT(m_Type == PDFOBJ_ARRAY);\n    CPDF_Number* pNumber = FX_NEW CPDF_Number;\n    pNumber->SetNumber(f);\n    Add(pNumber);\n}\nvoid CPDF_Array::AddReference(CPDF_IndirectObjects* pDoc, FX_DWORD objnum)\n{\n    ASSERT(m_Type == PDFOBJ_ARRAY);\n    Add(FX_NEW CPDF_Reference(pDoc, objnum));\n}\nFX_BOOL CPDF_Array::Identical(CPDF_Array* pOther) const\n{\n    if (m_Objects.GetSize() != pOther->m_Objects.GetSize()) {\n        return FALSE;\n    }\n    for (int i = 0; i < m_Objects.GetSize(); i ++)\n        if (!((CPDF_Object*)m_Objects[i])->IsIdentical((CPDF_Object*)pOther->m_Objects[i])) {\n            return FALSE;\n        }\n    return TRUE;\n}\nCPDF_Dictionary::~CPDF_Dictionary()\n{\n    FX_POSITION pos = m_Map.GetStartPosition();\n    while (pos) {\n        FX_LPVOID value = m_Map.GetNextValue(pos);\n        if (value)\n            ((CPDF_Object*)value)->Release();\n    }\n}\nFX_POSITION CPDF_Dictionary::GetStartPos() const\n{\n    return m_Map.GetStartPosition();\n}\nCPDF_Object* CPDF_Dictionary::GetNextElement(FX_POSITION& pos, CFX_ByteString& key) const\n{\n    if (pos == NULL) {\n        return NULL;\n    }\n    CPDF_Object* p;\n    m_Map.GetNextAssoc(pos, key, (FX_LPVOID&)p);\n    return p;\n}\nCPDF_Object* CPDF_Dictionary::GetElement(FX_BSTR key) const\n{\n    CPDF_Object* p = NULL;\n    m_Map.Lookup(key, (void*&)p);\n    return p;\n}\nCPDF_Object* CPDF_Dictionary::GetElementValue(FX_BSTR key) const\n{\n    CPDF_Object* p = NULL;\n    m_Map.Lookup(key, (void*&)p);\n    return p ? p->GetDirect() : NULL;\n}\nCFX_ByteString CPDF_Dictionary::GetString(FX_BSTR key) const\n{\n    CPDF_Object* p = NULL;\n    m_Map.Lookup(key, (void*&)p);\n    if (p)\n        return p->GetString();\n    else\n        return CFX_ByteString();\n}\nCFX_ByteStringC CPDF_Dictionary::GetConstString(FX_BSTR key) const\n{\n    CPDF_Object* p = NULL;\n    m_Map.Lookup(key, (void*&)p);\n    if (p)\n        return p->GetConstString();\n    else\n        return CFX_ByteStringC();\n}\nCFX_WideString CPDF_Dictionary::GetUnicodeText(FX_BSTR key, CFX_CharMap* pCharMap) const\n{\n    CPDF_Object* p = NULL;\n    m_Map.Lookup(key, (void*&)p);\n    if (p) {\n        if(p->GetType() == PDFOBJ_REFERENCE) {\n            p = ((CPDF_Reference*)p)->GetDirect();\n            return p->GetUnicodeText(pCharMap);\n        } else {\n            return p->GetUnicodeText(pCharMap);\n        }\n    }\n    return CFX_WideString();\n}\nCFX_ByteString CPDF_Dictionary::GetString(FX_BSTR key, FX_BSTR def) const\n{\n    CPDF_Object* p = NULL;\n    m_Map.Lookup(key, (void*&)p);\n    if (p) {\n        return p->GetString();\n    }\n    return CFX_ByteString(def);\n}\nCFX_ByteStringC CPDF_Dictionary::GetConstString(FX_BSTR key, FX_BSTR def) const\n{\n    CPDF_Object* p = NULL;\n    m_Map.Lookup(key, (void*&)p);\n    if (p)\n        return p->GetConstString();\n    else\n        return CFX_ByteStringC(def);\n}\nint CPDF_Dictionary::GetInteger(FX_BSTR key) const\n{\n    CPDF_Object* p = NULL;\n    m_Map.Lookup(key, (void*&)p);\n    if (p) {\n        return p->GetInteger();\n    }\n    return 0;\n}\nint CPDF_Dictionary::GetInteger(FX_BSTR key, int def) const\n{\n    CPDF_Object* p = NULL;\n    m_Map.Lookup(key, (void*&)p);\n    if (p) {\n        return p->GetInteger();\n    }\n    return def;\n}\nFX_FLOAT CPDF_Dictionary::GetNumber(FX_BSTR key) const\n{\n    CPDF_Object* p = NULL;\n    m_Map.Lookup(key, (void*&)p);\n    if (p) {\n        return p->GetNumber();\n    }\n    return 0;\n}\nFX_BOOL CPDF_Dictionary::GetBoolean(FX_BSTR key, FX_BOOL bDefault) const\n{\n    CPDF_Object* p = NULL;\n    m_Map.Lookup(key, (void*&)p);\n    if (p && p->GetType() == PDFOBJ_BOOLEAN) {\n        return p->GetInteger();\n    }\n    return bDefault;\n}\nCPDF_Dictionary* CPDF_Dictionary::GetDict(FX_BSTR key) const\n{\n    CPDF_Object* p = GetElementValue(key);\n    if (p == NULL) {\n        return NULL;\n    } else if (p->GetType() == PDFOBJ_DICTIONARY) {\n        return (CPDF_Dictionary*)p;\n    } else if (p->GetType() == PDFOBJ_STREAM) {\n        return ((CPDF_Stream*)p)->GetDict();\n    }\n    return NULL;\n}\nCPDF_Array* CPDF_Dictionary::GetArray(FX_BSTR key) const\n{\n    CPDF_Object* p = GetElementValue(key);\n    if (p == NULL || p->GetType() != PDFOBJ_ARRAY) {\n        return NULL;\n    }\n    return (CPDF_Array*)p;\n}\nCPDF_Stream* CPDF_Dictionary::GetStream(FX_BSTR key) const\n{\n    CPDF_Object* p = GetElementValue(key);\n    if (p == NULL || p->GetType() != PDFOBJ_STREAM) {\n        return NULL;\n    }\n    return (CPDF_Stream*)p;\n}\nCFX_FloatRect CPDF_Dictionary::GetRect(FX_BSTR key) const\n{\n    CFX_FloatRect rect;\n    CPDF_Array* pArray = GetArray(key);\n    if (pArray) {\n        rect = pArray->GetRect();\n    }\n    return rect;\n}\nCFX_AffineMatrix CPDF_Dictionary::GetMatrix(FX_BSTR key) const\n{\n    CFX_AffineMatrix matrix;\n    CPDF_Array* pArray = GetArray(key);\n    if (pArray) {\n        matrix = pArray->GetMatrix();\n    }\n    return matrix;\n}\nFX_BOOL CPDF_Dictionary::KeyExist(FX_BSTR key) const\n{\n    FX_LPVOID value;\n    return m_Map.Lookup(key, value);\n}\nvoid CPDF_Dictionary::SetAt(FX_BSTR key, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)\n{\n    ASSERT(m_Type == PDFOBJ_DICTIONARY);\n    CPDF_Object* p = NULL;\n    m_Map.Lookup(key, (void*&)p);\n    if (p == pObj) {\n        return;\n    }\n    if (p)\n        p->Release();\n    if (pObj) {\n        if (pObj->GetObjNum()) {\n            ASSERT(pObjs != NULL);\n            pObj = CPDF_Reference::Create(pObjs, pObj->GetObjNum());\n        }\n        m_Map.SetAt(key, pObj);\n    } else {\n        m_Map.RemoveKey(key);\n    }\n}\nvoid CPDF_Dictionary::AddValue(FX_BSTR key, CPDF_Object* pObj)\n{\n    ASSERT(m_Type == PDFOBJ_DICTIONARY);\n    m_Map.AddValue(key, pObj);\n}\nvoid CPDF_Dictionary::RemoveAt(FX_BSTR key)\n{\n    ASSERT(m_Type == PDFOBJ_DICTIONARY);\n    CPDF_Object* p = NULL;\n    m_Map.Lookup(key, (void*&)p);\n    if (p == NULL) {\n        return;\n    }\n    p->Release();\n    m_Map.RemoveKey(key);\n}\nvoid CPDF_Dictionary::ReplaceKey(FX_BSTR oldkey, FX_BSTR newkey)\n{\n    ASSERT(m_Type == PDFOBJ_DICTIONARY);\n    CPDF_Object* p = NULL;\n    m_Map.Lookup(oldkey, (void*&)p);\n    if (p == NULL) {\n        return;\n    }\n    m_Map.RemoveKey(oldkey);\n    m_Map.SetAt(newkey, p);\n}\nFX_BOOL CPDF_Dictionary::Identical(CPDF_Dictionary* pOther) const\n{\n    if (pOther == NULL) {\n        return FALSE;\n    }\n    if (m_Map.GetCount() != pOther->m_Map.GetCount()) {\n        return FALSE;\n    }\n    FX_POSITION pos = m_Map.GetStartPosition();\n    while (pos) {\n        CFX_ByteString key;\n        FX_LPVOID value;\n        m_Map.GetNextAssoc(pos, key, value);\n        if (!value)\n            return FALSE;\n        if (!((CPDF_Object*)value)->IsIdentical(pOther->GetElement(key))) {\n            return FALSE;\n        }\n    }\n    return TRUE;\n}\nvoid CPDF_Dictionary::SetAtInteger(FX_BSTR key, int i)\n{\n    SetAt(key, FX_NEW CPDF_Number(i));\n}\nvoid CPDF_Dictionary::SetAtName(FX_BSTR key, const CFX_ByteString& name)\n{\n    SetAt(key, FX_NEW CPDF_Name(name));\n}\nvoid CPDF_Dictionary::SetAtString(FX_BSTR key, const CFX_ByteString& str)\n{\n    SetAt(key, FX_NEW CPDF_String(str));\n}\nvoid CPDF_Dictionary::SetAtReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, FX_DWORD objnum)\n{\n    SetAt(key, FX_NEW CPDF_Reference(pDoc, objnum));\n}\nvoid CPDF_Dictionary::AddReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, FX_DWORD objnum)\n{\n    AddValue(key, FX_NEW CPDF_Reference(pDoc, objnum));\n}\nvoid CPDF_Dictionary::SetAtNumber(FX_BSTR key, FX_FLOAT f)\n{\n    CPDF_Number* pNumber = FX_NEW CPDF_Number;\n    pNumber->SetNumber(f);\n    SetAt(key, pNumber);\n}\nvoid CPDF_Dictionary::SetAtBoolean(FX_BSTR key, FX_BOOL bValue)\n{\n    SetAt(key, FX_NEW CPDF_Boolean(bValue));\n}\nvoid CPDF_Dictionary::SetAtRect(FX_BSTR key, const CFX_FloatRect& rect)\n{\n    CPDF_Array* pArray = FX_NEW CPDF_Array;\n    pArray->AddNumber(rect.left);\n    pArray->AddNumber(rect.bottom);\n    pArray->AddNumber(rect.right);\n    pArray->AddNumber(rect.top);\n    SetAt(key, pArray);\n}\nvoid CPDF_Dictionary::SetAtMatrix(FX_BSTR key, const CFX_AffineMatrix& matrix)\n{\n    CPDF_Array* pArray = FX_NEW CPDF_Array;\n    pArray->AddNumber16(matrix.a);\n    pArray->AddNumber16(matrix.b);\n    pArray->AddNumber16(matrix.c);\n    pArray->AddNumber16(matrix.d);\n    pArray->AddNumber(matrix.e);\n    pArray->AddNumber(matrix.f);\n    SetAt(key, pArray);\n}\nCPDF_Stream::CPDF_Stream(FX_LPBYTE pData, FX_DWORD size, CPDF_Dictionary* pDict)\n{\n    m_Type = PDFOBJ_STREAM;\n    m_pDict = pDict;\n    m_dwSize = size;\n    m_GenNum = (FX_DWORD) - 1;\n    m_pDataBuf = pData;\n    m_pCryptoHandler = NULL;\n}\nCPDF_Stream::~CPDF_Stream()\n{\n    if (m_GenNum == (FX_DWORD) - 1 && m_pDataBuf != NULL) {\n        FX_Free(m_pDataBuf);\n    }\n    if (m_pDict) {\n        m_pDict->Release();\n    }\n}\nvoid CPDF_Stream::InitStream(CPDF_Dictionary* pDict)\n{\n    if (pDict) {\n        if (m_pDict) {\n            m_pDict->Release();\n        }\n        m_pDict = pDict;\n    }\n    if (m_GenNum == (FX_DWORD) - 1) {\n        if (m_pDataBuf) {\n            FX_Free(m_pDataBuf);\n        }\n    }\n    m_GenNum = 0;\n    m_pFile = NULL;\n    m_pCryptoHandler = NULL;\n    m_FileOffset = 0;\n}\nvoid CPDF_Stream::InitStream(FX_LPBYTE pData, FX_DWORD size, CPDF_Dictionary* pDict)\n{\n    InitStream(pDict);\n    m_GenNum = (FX_DWORD) - 1;\n    m_pDataBuf = FX_Alloc(FX_BYTE, size);\n    if (pData) {\n        FXSYS_memcpy32(m_pDataBuf, pData, size);\n    }\n    m_dwSize = size;\n    if (m_pDict) {\n        m_pDict->SetAtInteger(FX_BSTRC(\"Length\"), size);\n    }\n}\nvoid CPDF_Stream::SetData(FX_LPCBYTE pData, FX_DWORD size, FX_BOOL bCompressed, FX_BOOL bKeepBuf)\n{\n    if (m_GenNum == (FX_DWORD) - 1) {\n        if (m_pDataBuf) {\n            FX_Free(m_pDataBuf);\n        }\n    } else {\n        m_GenNum = (FX_DWORD) - 1;\n        m_pCryptoHandler = NULL;\n    }\n    if (bKeepBuf) {\n        m_pDataBuf = (FX_LPBYTE)pData;\n    } else {\n        m_pDataBuf = FX_Alloc(FX_BYTE, size);\n        if (pData) {\n            FXSYS_memcpy32(m_pDataBuf, pData, size);\n        }\n    }\n    m_dwSize = size;\n    if (m_pDict == NULL) {\n        m_pDict = FX_NEW CPDF_Dictionary;\n    }\n    m_pDict->SetAtInteger(FX_BSTRC(\"Length\"), size);\n    if (!bCompressed) {\n        m_pDict->RemoveAt(FX_BSTRC(\"Filter\"));\n        m_pDict->RemoveAt(FX_BSTRC(\"DecodeParms\"));\n    }\n}\nFX_BOOL CPDF_Stream::ReadRawData(FX_FILESIZE offset, FX_LPBYTE buf, FX_DWORD size) const\n{\n    if ((m_GenNum != (FX_DWORD) - 1) && m_pFile) {\n        return m_pFile->ReadBlock(buf, m_FileOffset + offset, size);\n    }\n    if (m_pDataBuf) {\n        FXSYS_memcpy32(buf, m_pDataBuf + offset, size);\n    }\n    return TRUE;\n}\nvoid CPDF_Stream::InitStream(IFX_FileRead *pFile, CPDF_Dictionary* pDict)\n{\n    InitStream(pDict);\n    m_pFile = pFile;\n    m_dwSize = (FX_DWORD)pFile->GetSize();\n    if (m_pDict) {\n        m_pDict->SetAtInteger(FX_BSTRC(\"Length\"), m_dwSize);\n    }\n}\nFX_BOOL CPDF_Stream::Identical(CPDF_Stream* pOther) const\n{\n    if (!m_pDict)\n        return pOther->m_pDict ? FALSE : TRUE;\n\n    if (!m_pDict->Identical(pOther->m_pDict)) {\n        return FALSE;\n    }\n    if (m_dwSize != pOther->m_dwSize) {\n        return FALSE;\n    }\n    if (m_GenNum != (FX_DWORD) - 1 && pOther->m_GenNum != (FX_DWORD) - 1) {\n        if (m_pFile == pOther->m_pFile && m_pFile == NULL) {\n            return TRUE;\n        }\n        if (!m_pFile || !pOther->m_pFile) {\n            return FALSE;\n        }\n        FX_BYTE srcBuf[1024];\n        FX_BYTE destBuf[1024];\n        FX_DWORD size = m_dwSize;\n        FX_DWORD srcOffset = m_FileOffset;\n        FX_DWORD destOffset = pOther->m_FileOffset;\n        if (m_pFile == pOther->m_pFile && srcOffset == destOffset) {\n            return TRUE;\n        }\n        while (size > 0) {\n            FX_DWORD actualSize = size > 1024 ? 1024 : size;\n            m_pFile->ReadBlock(srcBuf, srcOffset, actualSize);\n            pOther->m_pFile->ReadBlock(destBuf, destOffset, actualSize);\n            if (FXSYS_memcmp32(srcBuf, destBuf, actualSize) != 0) {\n                return FALSE;\n            }\n            size -= actualSize;\n            srcOffset += actualSize;\n            destOffset += actualSize;\n        }\n        return TRUE;\n    }\n    if (m_GenNum != (FX_DWORD) - 1 || pOther->m_GenNum != (FX_DWORD) - 1) {\n        IFX_FileRead* pFile = NULL;\n        FX_LPBYTE pBuf = NULL;\n        FX_DWORD offset = 0;\n        if (m_GenNum != (FX_DWORD) - 1) {\n            pFile = m_pFile;\n            pBuf = pOther->m_pDataBuf;\n            offset = m_FileOffset;\n        }\n        if (pOther->m_GenNum != (FX_DWORD) - 1) {\n            pFile = pOther->m_pFile;\n            pBuf = m_pDataBuf;\n            offset = pOther->m_FileOffset;\n        }\n        if (NULL == pBuf) {\n            return FALSE;\n        }\n        FX_BYTE srcBuf[1024];\n        FX_DWORD size = m_dwSize;\n        while (size > 0) {\n            FX_DWORD actualSize = size > 1024 ? 1024 : size;\n            m_pFile->ReadBlock(srcBuf, offset, actualSize);\n            if (FXSYS_memcmp32(srcBuf, pBuf, actualSize) != 0) {\n                return FALSE;\n            }\n            pBuf += actualSize;\n            size -= actualSize;\n            offset += actualSize;\n        }\n        return TRUE;\n    }\n    return FXSYS_memcmp32(m_pDataBuf, pOther->m_pDataBuf, m_dwSize) == 0;\n}\nCPDF_Stream* CPDF_Stream::Clone(FX_BOOL bDirect, FPDF_LPFCloneStreamCallback lpfCallback, FX_LPVOID pUserData) const\n{\n    CPDF_Dictionary *pCloneDict = (CPDF_Dictionary*)m_pDict->Clone(bDirect);\n    IFX_FileStream *pFS = NULL;\n    if (lpfCallback) {\n        pFS = lpfCallback((CPDF_Stream*)this, pUserData);\n    }\n    if (!pFS) {\n        CPDF_StreamAcc acc;\n        acc.LoadAllData(this, TRUE);\n        FX_DWORD streamSize = acc.GetSize();\n        CPDF_Stream* pObj = FX_NEW CPDF_Stream(acc.DetachData(), streamSize, pCloneDict);\n        return pObj;\n    }\n    CPDF_Stream* pObj = FX_NEW CPDF_Stream(NULL, 0, NULL);\n    CPDF_StreamFilter *pSF = GetStreamFilter(TRUE);\n    if (pSF) {\n        FX_LPBYTE pBuf = FX_Alloc(FX_BYTE, 4096);\n        FX_DWORD dwRead;\n        do {\n            dwRead = pSF->ReadBlock(pBuf, 4096);\n            if (dwRead) {\n                pFS->WriteBlock(pBuf, dwRead);\n            }\n        } while (dwRead == 4096);\n        pFS->Flush();\n        FX_Free(pBuf);\n        delete pSF;\n    }\n    pObj->InitStream((IFX_FileRead*)pFS, pCloneDict);\n    return pObj;\n}\nextern FX_BOOL PDF_DataDecode(FX_LPCBYTE src_buf, FX_DWORD src_size, const CPDF_Dictionary* pDict,\n                              FX_LPBYTE& dest_buf, FX_DWORD& dest_size, CFX_ByteString& ImageEncoding,\n                              CPDF_Dictionary*& pImageParms, FX_DWORD estimated_size, FX_BOOL bImageAcc);\nCPDF_StreamAcc::CPDF_StreamAcc()\n{\n    m_bNewBuf = FALSE;\n    m_pData = NULL;\n    m_dwSize = 0;\n    m_pImageParam = NULL;\n    m_pStream = NULL;\n    m_pSrcData = NULL;\n}\nvoid CPDF_StreamAcc::LoadAllData(const CPDF_Stream* pStream, FX_BOOL bRawAccess, FX_DWORD estimated_size,\n                                 FX_BOOL bImageAcc)\n{\n    if (pStream == NULL || pStream->GetType() != PDFOBJ_STREAM) {\n        return;\n    }\n    m_pStream = pStream;\n    if (pStream->IsMemoryBased() &&\n            (!pStream->GetDict()->KeyExist(FX_BSTRC(\"Filter\")) || bRawAccess)) {\n        m_dwSize = pStream->m_dwSize;\n        m_pData = (FX_LPBYTE)pStream->m_pDataBuf;\n        return;\n    }\n    FX_LPBYTE pSrcData;\n    FX_DWORD dwSrcSize = pStream->m_dwSize;\n    if (dwSrcSize == 0) {\n        return;\n    }\n    if (!pStream->IsMemoryBased()) {\n        pSrcData = m_pSrcData = FX_Alloc(FX_BYTE, dwSrcSize);\n        if (!pSrcData || !pStream->ReadRawData(0, pSrcData, dwSrcSize)) {\n            return;\n        }\n    } else {\n        pSrcData = pStream->m_pDataBuf;\n    }\n    FX_LPBYTE pDecryptedData;\n    FX_DWORD dwDecryptedSize;\n    if (pStream->m_pCryptoHandler) {\n        CFX_BinaryBuf dest_buf;\n        dest_buf.EstimateSize(pStream->m_pCryptoHandler->DecryptGetSize(dwSrcSize));\n        FX_LPVOID context = pStream->m_pCryptoHandler->DecryptStart(pStream->GetObjNum(), pStream->m_GenNum);\n        pStream->m_pCryptoHandler->DecryptStream(context, pSrcData, dwSrcSize, dest_buf);\n        pStream->m_pCryptoHandler->DecryptFinish(context, dest_buf);\n        pDecryptedData = dest_buf.GetBuffer();\n        dwDecryptedSize = dest_buf.GetSize();\n        dest_buf.DetachBuffer();\n    } else {\n        pDecryptedData = pSrcData;\n        dwDecryptedSize = dwSrcSize;\n    }\n    if (!pStream->GetDict()->KeyExist(FX_BSTRC(\"Filter\")) || bRawAccess) {\n        m_pData = pDecryptedData;\n        m_dwSize = dwDecryptedSize;\n    } else {\n        FX_BOOL bRet = PDF_DataDecode(pDecryptedData, dwDecryptedSize, m_pStream->GetDict(),\n                                      m_pData, m_dwSize, m_ImageDecoder, m_pImageParam, estimated_size, bImageAcc);\n        if (!bRet) {\n            m_pData = pDecryptedData;\n            m_dwSize = dwDecryptedSize;\n        }\n    }\n    if (pSrcData != pStream->m_pDataBuf && pSrcData != m_pData) {\n        FX_Free(pSrcData);\n    }\n    if (pDecryptedData != pSrcData && pDecryptedData != m_pData) {\n        FX_Free(pDecryptedData);\n    }\n    m_pSrcData = NULL;\n    m_bNewBuf = m_pData != pStream->m_pDataBuf;\n}\nCPDF_StreamAcc::~CPDF_StreamAcc()\n{\n    if (m_bNewBuf && m_pData) {\n        FX_Free(m_pData);\n    }\n    if (m_pSrcData) {\n        FX_Free(m_pSrcData);\n    }\n}\nFX_LPCBYTE CPDF_StreamAcc::GetData() const\n{\n    if (m_bNewBuf) {\n        return m_pData;\n    }\n    if (!m_pStream) {\n        return NULL;\n    }\n    return m_pStream->m_pDataBuf;\n}\nFX_DWORD CPDF_StreamAcc::GetSize() const\n{\n    if (m_bNewBuf) {\n        return m_dwSize;\n    }\n    if (!m_pStream) {\n        return 0;\n    }\n    return m_pStream->m_dwSize;\n}\nFX_LPBYTE CPDF_StreamAcc::DetachData()\n{\n    if (m_bNewBuf) {\n        FX_LPBYTE p = m_pData;\n        m_pData = NULL;\n        m_dwSize = 0;\n        return p;\n    }\n    FX_LPBYTE p = FX_Alloc(FX_BYTE, m_dwSize);\n    if (p == NULL) {\n        return NULL;\n    }\n    FXSYS_memcpy32(p, m_pData, m_dwSize);\n    return p;\n}\nvoid CPDF_Reference::SetRef(CPDF_IndirectObjects* pDoc, FX_DWORD objnum)\n{\n    m_pObjList = pDoc;\n    m_RefObjNum = objnum;\n}\nCPDF_IndirectObjects::CPDF_IndirectObjects(IPDF_DocParser* pParser)\n{\n    m_pParser = pParser;\n    m_IndirectObjs.InitHashTable(1013);\n    if (pParser) {\n        m_LastObjNum = m_pParser->GetLastObjNum();\n    } else {\n        m_LastObjNum = 0;\n    }\n}\nCPDF_IndirectObjects::~CPDF_IndirectObjects()\n{\n    FX_POSITION pos = m_IndirectObjs.GetStartPosition();\n    while (pos) {\n        FX_LPVOID key, value;\n        m_IndirectObjs.GetNextAssoc(pos, key, value);\n        ((CPDF_Object*)value)->Destroy();\n    }\n}\nCPDF_Object* CPDF_IndirectObjects::GetIndirectObject(FX_DWORD objnum, struct PARSE_CONTEXT* pContext)\n{\n    if (objnum == 0) {\n        return NULL;\n    }\n    FX_LPVOID value;\n    {\n        if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {\n            if (((CPDF_Object*)value)->GetObjNum() == -1) {\n                return NULL;\n            }\n            return (CPDF_Object*)value;\n        }\n    }\n    CPDF_Object* pObj = NULL;\n    if (m_pParser) {\n        pObj = m_pParser->ParseIndirectObject(this, objnum, pContext);\n    }\n    if (pObj == NULL) {\n        return NULL;\n    }\n    pObj->m_ObjNum = objnum;\n    if (m_LastObjNum < objnum) {\n        m_LastObjNum = objnum;\n    }\n    if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {\n        if (value) {\n            ((CPDF_Object *)value)->Destroy();\n        }\n    }\n    m_IndirectObjs.SetAt((FX_LPVOID)(FX_UINTPTR)objnum, pObj);\n    return pObj;\n}\nint CPDF_IndirectObjects::GetIndirectType(FX_DWORD objnum)\n{\n    FX_LPVOID value;\n    if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {\n        return ((CPDF_Object*)value)->GetType();\n    }\n    if (m_pParser) {\n        PARSE_CONTEXT context;\n        FXSYS_memset32(&context, 0, sizeof(PARSE_CONTEXT));\n        context.m_Flags = PDFPARSE_TYPEONLY;\n        return (int)(FX_UINTPTR)m_pParser->ParseIndirectObject(this, objnum, &context);\n    }\n    return 0;\n}\nFX_DWORD CPDF_IndirectObjects::AddIndirectObject(CPDF_Object* pObj)\n{\n    if (pObj->m_ObjNum) {\n        return pObj->m_ObjNum;\n    }\n    m_LastObjNum ++;\n    m_IndirectObjs.SetAt((FX_LPVOID)(FX_UINTPTR)m_LastObjNum, pObj);\n    pObj->m_ObjNum = m_LastObjNum;\n    return m_LastObjNum;\n}\nvoid CPDF_IndirectObjects::ReleaseIndirectObject(FX_DWORD objnum)\n{\n    FX_LPVOID value;\n    if (!m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {\n        return;\n    }\n    if (((CPDF_Object*)value)->GetObjNum() == -1) {\n        return;\n    }\n    ((CPDF_Object*)value)->Destroy();\n    m_IndirectObjs.RemoveKey((FX_LPVOID)(FX_UINTPTR)objnum);\n}\nvoid CPDF_IndirectObjects::InsertIndirectObject(FX_DWORD objnum, CPDF_Object* pObj)\n{\n    if (objnum == 0 || pObj == NULL) {\n        return;\n    }\n    FX_LPVOID value = NULL;\n    if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {\n        if (value)\n        {\n            if (pObj->GetGenNum() <= ((CPDF_Object*)value)->GetGenNum())\n                return;\n            else \n                ((CPDF_Object*)value)->Destroy();\n         }         \n    }\n    pObj->m_ObjNum = objnum;\n    m_IndirectObjs.SetAt((FX_LPVOID)(FX_UINTPTR)objnum, pObj);\n    if (m_LastObjNum < objnum) {\n        m_LastObjNum = objnum;\n    }\n}\nFX_DWORD CPDF_IndirectObjects::GetLastObjNum() const\n{\n    return m_LastObjNum;\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_parser.h\"\n#include \"../../../include/fpdfapi/fpdf_module.h\"\n#include \"../../../include/fpdfapi/fpdf_page.h\"\n#include \"../../../../third_party/numerics/safe_math.h\"\n#include \"../fpdf_page/pageint.h\"\n#include <limits.h>\n#define _PARSER_OBJECT_LEVLE_\t\t64\nextern const FX_LPCSTR _PDF_CharType;\nFX_BOOL IsSignatureDict(const CPDF_Dictionary* pDict)\n{\n    CPDF_Object* pType = pDict->GetElementValue(FX_BSTRC(\"Type\"));\n    if (!pType) {\n        pType = pDict->GetElementValue(FX_BSTRC(\"FT\"));\n        if (!pType) {\n            return FALSE;\n        }\n    }\n    if (pType->GetString() == FX_BSTRC(\"Sig\")) {\n        return TRUE;\n    }\n    return FALSE;\n}\nstatic FX_INT32 _CompareDWord(const void* p1, const void* p2)\n{\n    return (*(FX_DWORD*)p1) - (*(FX_DWORD*)p2);\n}\nstatic int _CompareFileSize(const void* p1, const void* p2)\n{\n    FX_FILESIZE ret = (*(FX_FILESIZE*)p1) - (*(FX_FILESIZE*)p2);\n    if (ret > 0) {\n        return 1;\n    }\n    if (ret < 0) {\n        return -1;\n    }\n    return 0;\n}\nCPDF_Parser::CPDF_Parser()\n{\n    m_pDocument = NULL;\n    m_pTrailer = NULL;\n    m_pEncryptDict = NULL;\n    m_pSecurityHandler = NULL;\n    m_pLinearized = NULL;\n    m_dwFirstPageNo = 0;\n    m_dwXrefStartObjNum = 0;\n    m_bOwnFileRead = TRUE;\n    m_bForceUseSecurityHandler = FALSE;\n}\nCPDF_Parser::~CPDF_Parser()\n{\n    CloseParser(FALSE);\n}\nFX_DWORD CPDF_Parser::GetLastObjNum()\n{\n    FX_DWORD dwSize = m_CrossRef.GetSize();\n    return dwSize ? dwSize - 1 : 0;\n}\nvoid CPDF_Parser::SetEncryptDictionary(CPDF_Dictionary* pDict)\n{\n    m_pEncryptDict = pDict;\n}\nvoid CPDF_Parser::CloseParser(FX_BOOL bReParse)\n{\n    m_bVersionUpdated = FALSE;\n    if (m_pDocument && !bReParse) {\n        delete m_pDocument;\n        m_pDocument = NULL;\n    }\n    if (m_pTrailer) {\n        m_pTrailer->Release();\n        m_pTrailer = NULL;\n    }\n    ReleaseEncryptHandler();\n    SetEncryptDictionary(NULL);\n    if (m_bOwnFileRead && m_Syntax.m_pFileAccess) {\n        m_Syntax.m_pFileAccess->Release();\n        m_Syntax.m_pFileAccess = NULL;\n    }\n    FX_POSITION pos = m_ObjectStreamMap.GetStartPosition();\n    while (pos) {\n        FX_LPVOID objnum;\n        CPDF_StreamAcc* pStream;\n        m_ObjectStreamMap.GetNextAssoc(pos, objnum, (void*&)pStream);\n        delete pStream;\n    }\n    m_ObjectStreamMap.RemoveAll();\n    m_SortedOffset.RemoveAll();\n    m_CrossRef.RemoveAll();\n    m_V5Type.RemoveAll();\n    m_ObjVersion.RemoveAll();\n    FX_INT32 iLen = m_Trailers.GetSize();\n    for (FX_INT32 i = 0; i < iLen; ++i) {\n        if (CPDF_Dictionary* trailer = m_Trailers.GetAt(i))\n            trailer->Release();\n    }\n    m_Trailers.RemoveAll();\n    if (m_pLinearized) {\n        m_pLinearized->Release();\n        m_pLinearized = NULL;\n    }\n}\nstatic FX_INT32 GetHeaderOffset(IFX_FileRead* pFile)\n{\n    FX_DWORD tag = FXDWORD_FROM_LSBFIRST(0x46445025);\n    FX_BYTE buf[4];\n    FX_INT32 offset = 0;\n    while (1) {\n        if (!pFile->ReadBlock(buf, offset, 4)) {\n            return -1;\n        }\n        if (*(FX_DWORD*)buf == tag) {\n            return offset;\n        }\n        offset ++;\n        if (offset > 1024) {\n            return -1;\n        }\n    }\n    return -1;\n}\nFX_DWORD CPDF_Parser::StartParse(FX_LPCSTR filename, FX_BOOL bReParse)\n{\n    IFX_FileRead* pFileAccess = FX_CreateFileRead(filename);\n    if (!pFileAccess) {\n        return PDFPARSE_ERROR_FILE;\n    }\n    return StartParse(pFileAccess, bReParse);\n}\nFX_DWORD CPDF_Parser::StartParse(FX_LPCWSTR filename, FX_BOOL bReParse)\n{\n    IFX_FileRead* pFileAccess = FX_CreateFileRead(filename);\n    if (!pFileAccess) {\n        return PDFPARSE_ERROR_FILE;\n    }\n    return StartParse(pFileAccess, bReParse);\n}\nCPDF_SecurityHandler* FPDF_CreateStandardSecurityHandler();\nCPDF_SecurityHandler* FPDF_CreatePubKeyHandler(void*);\nFX_DWORD CPDF_Parser::StartParse(IFX_FileRead* pFileAccess, FX_BOOL bReParse, FX_BOOL bOwnFileRead)\n{\n    CloseParser(bReParse);\n    m_bXRefStream = FALSE;\n    m_LastXRefOffset = 0;\n    m_bOwnFileRead = bOwnFileRead;\n    FX_INT32 offset = GetHeaderOffset(pFileAccess);\n    if (offset == -1) {\n        if (bOwnFileRead && pFileAccess) {\n            pFileAccess->Release();\n        }\n        return PDFPARSE_ERROR_FORMAT;\n    }\n    m_Syntax.InitParser(pFileAccess, offset);\n    FX_BYTE ch;\n    m_Syntax.GetCharAt(5, ch);\n    m_FileVersion = (ch - '0') * 10;\n    m_Syntax.GetCharAt(7, ch);\n    m_FileVersion += ch - '0';\n    m_Syntax.RestorePos(m_Syntax.m_FileLen - m_Syntax.m_HeaderOffset - 9);\n    if (!bReParse) {\n        m_pDocument = FX_NEW CPDF_Document(this);\n    }\n    FX_BOOL bXRefRebuilt = FALSE;\n    if (m_Syntax.SearchWord(FX_BSTRC(\"startxref\"), TRUE, FALSE, 4096)) {\n        FX_FILESIZE startxref_offset = m_Syntax.SavePos();\n        FX_LPVOID pResult = FXSYS_bsearch(&startxref_offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);\n        if (pResult == NULL) {\n            m_SortedOffset.Add(startxref_offset);\n        }\n        m_Syntax.GetKeyword();\n        FX_BOOL bNumber;\n        CFX_ByteString xrefpos_str = m_Syntax.GetNextWord(bNumber);\n        if (!bNumber) {\n            return PDFPARSE_ERROR_FORMAT;\n        }\n        m_LastXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str);\n        if (!LoadAllCrossRefV4(m_LastXRefOffset) && !LoadAllCrossRefV5(m_LastXRefOffset)) {\n            if (!RebuildCrossRef()) {\n                return PDFPARSE_ERROR_FORMAT;\n            }\n            bXRefRebuilt = TRUE;\n            m_LastXRefOffset = 0;\n        }\n    } else {\n        if (!RebuildCrossRef()) {\n            return PDFPARSE_ERROR_FORMAT;\n        }\n        bXRefRebuilt = TRUE;\n    }\n    FX_DWORD dwRet = SetEncryptHandler();\n    if (dwRet != PDFPARSE_ERROR_SUCCESS) {\n        return dwRet;\n    }\n    m_pDocument->LoadDoc();\n    if (m_pDocument->GetRoot() == NULL || m_pDocument->GetPageCount() == 0) {\n        if (bXRefRebuilt) {\n            return PDFPARSE_ERROR_FORMAT;\n        }\n        ReleaseEncryptHandler();\n        if (!RebuildCrossRef()) {\n            return PDFPARSE_ERROR_FORMAT;\n        }\n        dwRet = SetEncryptHandler();\n        if (dwRet != PDFPARSE_ERROR_SUCCESS) {\n            return dwRet;\n        }\n        m_pDocument->LoadDoc();\n        if (m_pDocument->GetRoot() == NULL) {\n            return PDFPARSE_ERROR_FORMAT;\n        }\n    }\n    FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);\n    FX_DWORD RootObjNum = GetRootObjNum();\n    if (RootObjNum == 0) {\n        ReleaseEncryptHandler();\n        RebuildCrossRef();\n        RootObjNum = GetRootObjNum();\n        if (RootObjNum == 0) {\n            return PDFPARSE_ERROR_FORMAT;\n        }\n        dwRet = SetEncryptHandler();\n        if (dwRet != PDFPARSE_ERROR_SUCCESS) {\n            return dwRet;\n        }\n    }\n    if (m_pSecurityHandler && !m_pSecurityHandler->IsMetadataEncrypted()) {\n        CPDF_Reference* pMetadata = (CPDF_Reference*)m_pDocument->GetRoot()->GetElement(FX_BSTRC(\"Metadata\"));\n        if (pMetadata && pMetadata->GetType() == PDFOBJ_REFERENCE) {\n            m_Syntax.m_MetadataObjnum = pMetadata->GetRefObjNum();\n        }\n    }\n    return PDFPARSE_ERROR_SUCCESS;\n}\nFX_DWORD CPDF_Parser::SetEncryptHandler()\n{\n    ReleaseEncryptHandler();\n    SetEncryptDictionary(NULL);\n    if (m_pTrailer == NULL) {\n        return PDFPARSE_ERROR_FORMAT;\n    }\n    CPDF_Object* pEncryptObj = m_pTrailer->GetElement(FX_BSTRC(\"Encrypt\"));\n    if (pEncryptObj) {\n        if (pEncryptObj->GetType() == PDFOBJ_DICTIONARY) {\n            SetEncryptDictionary((CPDF_Dictionary*)pEncryptObj);\n        } else if (pEncryptObj->GetType() == PDFOBJ_REFERENCE) {\n            pEncryptObj = m_pDocument->GetIndirectObject(((CPDF_Reference*)pEncryptObj)->GetRefObjNum());\n            if (pEncryptObj) {\n                SetEncryptDictionary(pEncryptObj->GetDict());\n            }\n        }\n    }\n    if (m_bForceUseSecurityHandler) {\n        FX_DWORD err = PDFPARSE_ERROR_HANDLER;\n        if (m_pSecurityHandler == NULL) {\n            return PDFPARSE_ERROR_HANDLER;\n        }\n        if (!m_pSecurityHandler->OnInit(this, m_pEncryptDict)) {\n            return err;\n        }\n        CPDF_CryptoHandler* pCryptoHandler = m_pSecurityHandler->CreateCryptoHandler();\n        if (!pCryptoHandler->Init(m_pEncryptDict, m_pSecurityHandler)) {\n            delete pCryptoHandler;\n            pCryptoHandler = NULL;\n            return PDFPARSE_ERROR_HANDLER;\n        }\n        m_Syntax.SetEncrypt(pCryptoHandler);\n    } else if (m_pEncryptDict) {\n        CFX_ByteString filter = m_pEncryptDict->GetString(FX_BSTRC(\"Filter\"));\n        CPDF_SecurityHandler* pSecurityHandler = NULL;\n        FX_DWORD err = PDFPARSE_ERROR_HANDLER;\n        if (filter == FX_BSTRC(\"Standard\")) {\n            pSecurityHandler = FPDF_CreateStandardSecurityHandler();\n            err = PDFPARSE_ERROR_PASSWORD;\n        }\n        if (pSecurityHandler == NULL) {\n            return PDFPARSE_ERROR_HANDLER;\n        }\n        if (!pSecurityHandler->OnInit(this, m_pEncryptDict)) {\n            delete pSecurityHandler;\n            pSecurityHandler = NULL;\n            return err;\n        }\n        m_pSecurityHandler = pSecurityHandler;\n        CPDF_CryptoHandler* pCryptoHandler = pSecurityHandler->CreateCryptoHandler();\n        if (!pCryptoHandler->Init(m_pEncryptDict, m_pSecurityHandler)) {\n            delete pCryptoHandler;\n            pCryptoHandler = NULL;\n            return PDFPARSE_ERROR_HANDLER;\n        }\n        m_Syntax.SetEncrypt(pCryptoHandler);\n    }\n    return PDFPARSE_ERROR_SUCCESS;\n}\nvoid CPDF_Parser::ReleaseEncryptHandler()\n{\n    if (m_Syntax.m_pCryptoHandler) {\n        delete m_Syntax.m_pCryptoHandler;\n        m_Syntax.m_pCryptoHandler = NULL;\n    }\n    if (m_pSecurityHandler && !m_bForceUseSecurityHandler) {\n        delete m_pSecurityHandler;\n        m_pSecurityHandler = NULL;\n    }\n}\nFX_FILESIZE CPDF_Parser::GetObjectOffset(FX_DWORD objnum)\n{\n    if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) {\n        return 0;\n    }\n    if (m_V5Type[objnum] == 1) {\n        return m_CrossRef[objnum];\n    }\n    if (m_V5Type[objnum] == 2) {\n        return m_CrossRef[(FX_INT32)m_CrossRef[objnum]];\n    }\n    return 0;\n}\nstatic FX_INT32 GetDirectInteger(CPDF_Dictionary* pDict, FX_BSTR key)\n{\n    CPDF_Object* pObj = pDict->GetElement(key);\n    if (pObj == NULL) {\n        return 0;\n    }\n    if (pObj->GetType() == PDFOBJ_NUMBER) {\n        return ((CPDF_Number*)pObj)->GetInteger();\n    }\n    return 0;\n}\nstatic FX_BOOL CheckDirectType(CPDF_Dictionary* pDict, FX_BSTR key, FX_INT32 iType)\n{\n    CPDF_Object* pObj = pDict->GetElement(key);\n    if (!pObj) {\n        return TRUE;\n    }\n    return pObj->GetType() == iType;\n}\nFX_BOOL CPDF_Parser::LoadAllCrossRefV4(FX_FILESIZE xrefpos)\n{\n    if (!LoadCrossRefV4(xrefpos, 0, TRUE, FALSE)) {\n        return FALSE;\n    }\n    m_pTrailer = LoadTrailerV4();\n    if (m_pTrailer == NULL) {\n        return FALSE;\n    }\n    FX_INT32 xrefsize = GetDirectInteger(m_pTrailer, FX_BSTRC(\"Size\"));\n    if (xrefsize <= 0 || xrefsize > (1 << 20)) {\n        return FALSE;\n    }\n    m_CrossRef.SetSize(xrefsize);\n    m_V5Type.SetSize(xrefsize);\n    CFX_FileSizeArray CrossRefList, XRefStreamList;\n    CrossRefList.Add(xrefpos);\n    XRefStreamList.Add(GetDirectInteger(m_pTrailer, FX_BSTRC(\"XRefStm\")));\n    if (!CheckDirectType(m_pTrailer, FX_BSTRC(\"Prev\"), PDFOBJ_NUMBER)) {\n        return FALSE;\n    }\n    FX_FILESIZE newxrefpos = GetDirectInteger(m_pTrailer, FX_BSTRC(\"Prev\"));\n    if (newxrefpos == xrefpos) {\n        return FALSE;\n    }\n    xrefpos = newxrefpos;\n    while (xrefpos) {\n        CrossRefList.InsertAt(0, xrefpos);\n        LoadCrossRefV4(xrefpos, 0, TRUE, FALSE);\n        CPDF_Dictionary* pDict = LoadTrailerV4();\n        if (pDict == NULL) {\n            return FALSE;\n        }\n        if (!CheckDirectType(pDict, FX_BSTRC(\"Prev\"), PDFOBJ_NUMBER)) {\n            pDict->Release();\n            return FALSE;\n        }\n        newxrefpos = GetDirectInteger(pDict, FX_BSTRC(\"Prev\"));\n        if (newxrefpos == xrefpos) {\n            pDict->Release();\n            return FALSE;\n        }\n        xrefpos = newxrefpos;\n        XRefStreamList.InsertAt(0, pDict->GetInteger(FX_BSTRC(\"XRefStm\")));\n        m_Trailers.Add(pDict);\n    }\n    for (FX_INT32 i = 0; i < CrossRefList.GetSize(); i ++)\n        if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE, i == 0)) {\n            return FALSE;\n        }\n    return TRUE;\n}\nFX_BOOL CPDF_Parser::LoadLinearizedAllCrossRefV4(FX_FILESIZE xrefpos, FX_DWORD dwObjCount)\n{\n    if (!LoadLinearizedCrossRefV4(xrefpos, dwObjCount)) {\n        return FALSE;\n    }\n    m_pTrailer = LoadTrailerV4();\n    if (m_pTrailer == NULL) {\n        return FALSE;\n    }\n    FX_INT32 xrefsize = GetDirectInteger(m_pTrailer, FX_BSTRC(\"Size\"));\n    if (xrefsize == 0) {\n        return FALSE;\n    }\n    CFX_FileSizeArray CrossRefList, XRefStreamList;\n    CrossRefList.Add(xrefpos);\n    XRefStreamList.Add(GetDirectInteger(m_pTrailer, FX_BSTRC(\"XRefStm\")));\n    xrefpos = GetDirectInteger(m_pTrailer, FX_BSTRC(\"Prev\"));\n    while (xrefpos) {\n        CrossRefList.InsertAt(0, xrefpos);\n        LoadCrossRefV4(xrefpos, 0, TRUE, FALSE);\n        CPDF_Dictionary* pDict = LoadTrailerV4();\n        if (pDict == NULL) {\n            return FALSE;\n        }\n        xrefpos = GetDirectInteger(pDict, FX_BSTRC(\"Prev\"));\n        XRefStreamList.InsertAt(0, pDict->GetInteger(FX_BSTRC(\"XRefStm\")));\n        m_Trailers.Add(pDict);\n    }\n    for (FX_INT32 i = 1; i < CrossRefList.GetSize(); i ++)\n        if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE, i == 0)) {\n            return FALSE;\n        }\n    return TRUE;\n}\nFX_BOOL CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos, FX_DWORD dwObjCount)\n{\n    FX_FILESIZE dwStartPos = pos - m_Syntax.m_HeaderOffset;\n    m_Syntax.RestorePos(dwStartPos);\n    FX_LPVOID pResult = FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);\n    if (pResult == NULL) {\n        m_SortedOffset.Add(pos);\n    }\n    FX_DWORD start_objnum = 0;\n    FX_DWORD count = dwObjCount;\n    FX_FILESIZE SavedPos = m_Syntax.SavePos();\n    FX_INT32 recordsize = 20;\n    char* pBuf = FX_Alloc(char, 1024 * recordsize + 1);\n    pBuf[1024 * recordsize] = '\\0';\n    FX_INT32 nBlocks = count / 1024 + 1;\n    for (FX_INT32 block = 0; block < nBlocks; block ++) {\n        FX_INT32 block_size = block == nBlocks - 1 ? count % 1024 : 1024;\n        FX_DWORD dwReadSize = block_size * recordsize;\n        if ((FX_FILESIZE)(dwStartPos + dwReadSize) > m_Syntax.m_FileLen) {\n            FX_Free(pBuf);\n            return FALSE;\n        }\n        if (!m_Syntax.ReadBlock((FX_LPBYTE)pBuf, dwReadSize)) {\n            FX_Free(pBuf);\n            return FALSE;\n        }\n        for (FX_INT32 i = 0; i < block_size; i ++) {\n            FX_DWORD objnum = start_objnum + block * 1024 + i;\n            char* pEntry = pBuf + i * recordsize;\n            if (pEntry[17] == 'f') {\n                m_CrossRef.SetAtGrow(objnum, 0);\n                m_V5Type.SetAtGrow(objnum, 0);\n            } else {\n                FX_INT32 offset = FXSYS_atoi(pEntry);\n                if (offset == 0) {\n                    for (FX_INT32 c = 0; c < 10; c ++) {\n                        if (pEntry[c] < '0' || pEntry[c] > '9') {\n                            FX_Free(pBuf);\n                            return FALSE;\n                        }\n                    }\n                }\n                m_CrossRef.SetAtGrow(objnum, offset);\n                FX_INT32 version = FXSYS_atoi(pEntry + 11);\n                if (version >= 1) {\n                    m_bVersionUpdated = TRUE;\n                }\n                m_ObjVersion.SetAtGrow(objnum, version);\n                if (m_CrossRef[objnum] < m_Syntax.m_FileLen) {\n                    FX_LPVOID pResult = FXSYS_bsearch(&m_CrossRef[objnum], m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);\n                    if (pResult == NULL) {\n                        m_SortedOffset.Add(m_CrossRef[objnum]);\n                    }\n                }\n                m_V5Type.SetAtGrow(objnum, 1);\n            }\n        }\n    }\n    FX_Free(pBuf);\n    m_Syntax.RestorePos(SavedPos + count * recordsize);\n    return TRUE;\n}\nFX_BOOL CPDF_Parser::LoadCrossRefV4(FX_FILESIZE pos, FX_FILESIZE streampos, FX_BOOL bSkip, FX_BOOL bFirst)\n{\n    m_Syntax.RestorePos(pos);\n    if (m_Syntax.GetKeyword() != FX_BSTRC(\"xref\")) {\n        return FALSE;\n    }\n    FX_LPVOID pResult = FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);\n    if (pResult == NULL) {\n        m_SortedOffset.Add(pos);\n    }\n    if (streampos) {\n        FX_LPVOID pResult = FXSYS_bsearch(&streampos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);\n        if (pResult == NULL) {\n            m_SortedOffset.Add(streampos);\n        }\n    }\n    while (1) {\n        FX_FILESIZE SavedPos = m_Syntax.SavePos();\n        FX_BOOL bIsNumber;\n        CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber);\n        if (word.IsEmpty()) {\n            return FALSE;\n        }\n        if (!bIsNumber) {\n            m_Syntax.RestorePos(SavedPos);\n            break;\n        }\n        FX_DWORD start_objnum = FXSYS_atoi(word);\n        if (start_objnum >= (1 << 20)) {\n            return FALSE;\n        }\n        FX_DWORD count = m_Syntax.GetDirectNum();\n        m_Syntax.ToNextWord();\n        SavedPos = m_Syntax.SavePos();\n        FX_BOOL bFirstItem = FALSE;\n        FX_INT32 recordsize = 20;\n        if (bFirst) {\n            bFirstItem = TRUE;\n        }\n        m_dwXrefStartObjNum = start_objnum;\n        if (!bSkip) {\n            char* pBuf = FX_Alloc(char, 1024 * recordsize + 1);\n            pBuf[1024 * recordsize] = '\\0';\n            FX_INT32 nBlocks = count / 1024 + 1;\n            FX_BOOL bFirstBlock = TRUE;\n            for (FX_INT32 block = 0; block < nBlocks; block ++) {\n                FX_INT32 block_size = block == nBlocks - 1 ? count % 1024 : 1024;\n                m_Syntax.ReadBlock((FX_LPBYTE)pBuf, block_size * recordsize);\n                for (FX_INT32 i = 0; i < block_size; i ++) {\n                    FX_DWORD objnum = start_objnum + block * 1024 + i;\n                    char* pEntry = pBuf + i * recordsize;\n                    if (pEntry[17] == 'f') {\n                        if (bFirstItem) {\n                            objnum = 0;\n                            bFirstItem = FALSE;\n                        }\n                        if (bFirstBlock) {\n                            FX_FILESIZE offset = (FX_FILESIZE)FXSYS_atoi64(pEntry);\n                            FX_INT32 version = FXSYS_atoi(pEntry + 11);\n                            if (offset == 0 && version == 65535 && start_objnum != 0) {\n                                start_objnum--;\n                                objnum = 0;\n                            }\n                        }\n                        m_CrossRef.SetAtGrow(objnum, 0);\n                        m_V5Type.SetAtGrow(objnum, 0);\n                    } else {\n                        FX_FILESIZE offset = (FX_FILESIZE)FXSYS_atoi64(pEntry);\n                        if (offset == 0) {\n                            for (FX_INT32 c = 0; c < 10; c ++) {\n                                if (pEntry[c] < '0' || pEntry[c] > '9') {\n                                    FX_Free(pBuf);\n                                    return FALSE;\n                                }\n                            }\n                        }\n                        m_CrossRef.SetAtGrow(objnum, offset);\n                        FX_INT32 version = FXSYS_atoi(pEntry + 11);\n                        if (version >= 1) {\n                            m_bVersionUpdated = TRUE;\n                        }\n                        m_ObjVersion.SetAtGrow(objnum, version);\n                        if (m_CrossRef[objnum] < m_Syntax.m_FileLen) {\n                            FX_LPVOID pResult = FXSYS_bsearch(&m_CrossRef[objnum], m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);\n                            if (pResult == NULL) {\n                                m_SortedOffset.Add(m_CrossRef[objnum]);\n                            }\n                        }\n                        m_V5Type.SetAtGrow(objnum, 1);\n                    }\n                    if (bFirstBlock) {\n                        bFirstBlock = FALSE;\n                    }\n                }\n            }\n            FX_Free(pBuf);\n        }\n        m_Syntax.RestorePos(SavedPos + count * recordsize);\n    }\n    if (streampos)\n        if (!LoadCrossRefV5(streampos, streampos, FALSE)) {\n            return FALSE;\n        }\n    return TRUE;\n}\nFX_BOOL CPDF_Parser::LoadAllCrossRefV5(FX_FILESIZE xrefpos)\n{\n    if (!LoadCrossRefV5(xrefpos, xrefpos, TRUE)) {\n        return FALSE;\n    }\n    while (xrefpos)\n        if (!LoadCrossRefV5(xrefpos, xrefpos, FALSE)) {\n            return FALSE;\n        }\n    m_ObjectStreamMap.InitHashTable(101, FALSE);\n    m_bXRefStream = TRUE;\n    return TRUE;\n}\nFX_BOOL CPDF_Parser::RebuildCrossRef()\n{\n    m_CrossRef.RemoveAll();\n    m_V5Type.RemoveAll();\n    m_SortedOffset.RemoveAll();\n    m_ObjVersion.RemoveAll();\n    if (m_pTrailer) {\n        m_pTrailer->Release();\n        m_pTrailer = NULL;\n    }\n    FX_INT32 status = 0;\n    FX_INT32 inside_index = 0;\n    FX_DWORD objnum, gennum;\n    FX_INT32 depth = 0;\n    FX_LPBYTE buffer = FX_Alloc(FX_BYTE, 4096);\n    FX_FILESIZE pos = m_Syntax.m_HeaderOffset;\n    FX_FILESIZE start_pos, start_pos1;\n    FX_FILESIZE last_obj = -1, last_xref = -1, last_trailer = -1;\n    FX_BOOL bInUpdate = FALSE;\n    while (pos < m_Syntax.m_FileLen) {\n        FX_BOOL bOverFlow = FALSE;\n        FX_DWORD size = (FX_DWORD)(m_Syntax.m_FileLen - pos);\n        if (size > 4096) {\n            size = 4096;\n        }\n        if (!m_Syntax.m_pFileAccess->ReadBlock(buffer, pos, size)) {\n            break;\n        }\n        for (FX_DWORD i = 0; i < size; i ++) {\n            FX_BYTE byte = buffer[i];\n            FX_LPBYTE pData = buffer + i;\n            switch (status) {\n                case 0:\n                    if (_PDF_CharType[byte] == 'W') {\n                        status = 1;\n                    }\n                    if (byte <= '9' && byte >= '0') {\n                        --i;\n                        status = 1;\n                    }\n                    if (byte == '%') {\n                        inside_index = 0;\n                        status = 9;\n                    }\n                    if (byte == '(') {\n                        status = 10;\n                        depth = 1;\n                    }\n                    if (byte == '<') {\n                        inside_index = 1;\n                        status = 11;\n                    }\n                    if (byte == '\\\\') {\n                        status = 13;\n                    }\n                    if (byte == 't') {\n                        status = 7;\n                        inside_index = 1;\n                    }\n                    break;\n                case 1:\n                    if (_PDF_CharType[byte] == 'W') {\n                        break;\n                    } else if (byte <= '9' && byte >= '0') {\n                        start_pos = pos + i;\n                        status = 2;\n                        objnum = byte - '0';\n                    } else if (byte == 't') {\n                        status = 7;\n                        inside_index = 1;\n                    } else if (byte == 'x') {\n                        status = 8;\n                        inside_index = 1;\n                    } else {\n                        --i;\n                        status = 0;\n                    }\n                    break;\n                case 2:\n                    if (byte <= '9' && byte >= '0') {\n                        objnum = objnum * 10 + byte - '0';\n                        break;\n                    } else if (_PDF_CharType[byte] == 'W') {\n                        status = 3;\n                    } else {\n                        --i;\n                        status = 14;\n                        inside_index = 0;\n                    }\n                    break;\n                case 3:\n                    if (byte <= '9' && byte >= '0') {\n                        start_pos1 = pos + i;\n                        status = 4;\n                        gennum = byte - '0';\n                    } else if (_PDF_CharType[byte] == 'W') {\n                        break;\n                    } else if (byte == 't') {\n                        status = 7;\n                        inside_index = 1;\n                    } else {\n                        --i;\n                        status = 0;\n                    }\n                    break;\n                case 4:\n                    if (byte <= '9' && byte >= '0') {\n                        gennum = gennum * 10 + byte - '0';\n                        break;\n                    } else if (_PDF_CharType[byte] == 'W') {\n                        status = 5;\n                    } else {\n                        --i;\n                        status = 0;\n                    }\n                    break;\n                case 5:\n                    if (byte == 'o') {\n                        status = 6;\n                        inside_index = 1;\n                    } else if (_PDF_CharType[byte] == 'W') {\n                        break;\n                    } else if (byte <= '9' && byte >= '0') {\n                        objnum = gennum;\n                        gennum = byte - '0';\n                        start_pos = start_pos1;\n                        start_pos1 = pos + i;\n                        status = 4;\n                    } else if (byte == 't') {\n                        status = 7;\n                        inside_index = 1;\n                    } else {\n                        --i;\n                        status = 0;\n                    }\n                    break;\n                case 6:\n                    switch (inside_index) {\n                        case 1:\n                            if (byte != 'b') {\n                                --i;\n                                status = 0;\n                            } else {\n                                inside_index ++;\n                            }\n                            break;\n                        case 2:\n                            if (byte != 'j') {\n                                --i;\n                                status = 0;\n                            } else {\n                                inside_index ++;\n                            }\n                            break;\n                        case 3:\n                            if (_PDF_CharType[byte] == 'W' || _PDF_CharType[byte] == 'D') {\n                                if (objnum > 0x1000000) {\n                                    status = 0;\n                                    break;\n                                }\n                                FX_FILESIZE obj_pos = start_pos - m_Syntax.m_HeaderOffset;\n                                last_obj = start_pos;\n                                FX_LPVOID pResult = FXSYS_bsearch(&obj_pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);\n                                if (pResult == NULL) {\n                                    m_SortedOffset.Add(obj_pos);\n                                }\n                                FX_FILESIZE obj_end = 0;\n                                CPDF_Object *pObject = ParseIndirectObjectAtByStrict(m_pDocument, obj_pos, objnum, NULL, &obj_end);\n                                if (pObject) {\n                                    int iType =\tpObject->GetType();\n                                    if (iType == PDFOBJ_STREAM) {\n                                        CPDF_Stream* pStream = (CPDF_Stream*)pObject;\n                                        CPDF_Dictionary* pDict = pStream->GetDict();\n                                        if (pDict) {\n                                            if (pDict->KeyExist(FX_BSTRC(\"Type\"))) {\n                                                CFX_ByteString bsValue = pDict->GetString(FX_BSTRC(\"Type\"));\n                                                if (bsValue == FX_BSTRC(\"XRef\") && pDict->KeyExist(FX_BSTRC(\"Size\"))) {\n                                                    CPDF_Object* pRoot = pDict->GetElement(FX_BSTRC(\"Root\"));\n                                                    if (pRoot && pRoot->GetDict() && pRoot->GetDict()->GetElement(FX_BSTRC(\"Pages\"))) {\n                                                        if (m_pTrailer) {\n                                                            m_pTrailer->Release();\n                                                        }\n                                                        m_pTrailer = (CPDF_Dictionary*)pDict->Clone();\n                                                    }\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                                FX_FILESIZE offset = 0;\n                                m_Syntax.RestorePos(obj_pos);\n                                offset = m_Syntax.FindTag(FX_BSTRC(\"obj\"), 0);\n                                if (offset == -1) {\n                                    offset = 0;\n                                } else {\n                                    offset += 3;\n                                }\n                                FX_FILESIZE nLen = obj_end - obj_pos - offset;\n                                if ((FX_DWORD)nLen > size - i) {\n                                    pos = obj_end + m_Syntax.m_HeaderOffset;\n                                    bOverFlow = TRUE;\n                                } else {\n                                    i += (FX_DWORD)nLen;\n                                }\n                                if (m_CrossRef.GetSize() > (FX_INT32)objnum && m_CrossRef[objnum]) {\n                                    if (pObject) {\n                                        FX_DWORD oldgen = m_ObjVersion.GetAt(objnum);\n                                        m_CrossRef[objnum] = obj_pos;\n                                        m_ObjVersion.SetAt(objnum, (FX_SHORT)gennum);\n                                        if (oldgen != gennum) {\n                                            m_bVersionUpdated = TRUE;\n                                        }\n                                    }\n                                } else {\n                                    m_CrossRef.SetAtGrow(objnum, obj_pos);\n                                    m_V5Type.SetAtGrow(objnum, 1);\n                                    m_ObjVersion.SetAtGrow(objnum, (FX_SHORT)gennum);\n                                }\n                                if (pObject) {\n                                    pObject->Release();\n                                }\n                            }\n                            --i;\n                            status = 0;\n                            break;\n                    }\n                    break;\n                case 7:\n                    if (inside_index == 7) {\n                        if (_PDF_CharType[byte] == 'W' || _PDF_CharType[byte] == 'D') {\n                            last_trailer = pos + i - 7;\n                            m_Syntax.RestorePos(pos + i - m_Syntax.m_HeaderOffset);\n                            CPDF_Object* pObj = m_Syntax.GetObject(m_pDocument, 0, 0, 0);\n                            if (pObj) {\n                                if (pObj->GetType() != PDFOBJ_DICTIONARY && pObj->GetType() != PDFOBJ_STREAM) {\n                                    pObj->Release();\n                                } else {\n                                    CPDF_Dictionary* pTrailer = NULL;\n                                    if (pObj->GetType() == PDFOBJ_STREAM) {\n                                        pTrailer = ((CPDF_Stream*)pObj)->GetDict();\n                                    } else {\n                                        pTrailer = (CPDF_Dictionary*)pObj;\n                                    }\n                                    if (pTrailer) {\n                                        if (m_pTrailer) {\n                                            CPDF_Object* pRoot = pTrailer->GetElement(FX_BSTRC(\"Root\"));\n                                            if (pRoot == NULL || (pRoot->GetType() == PDFOBJ_REFERENCE &&\n                                                                  (FX_DWORD)m_CrossRef.GetSize() > ((CPDF_Reference*)pRoot)->GetRefObjNum() &&\n                                                                  m_CrossRef.GetAt(((CPDF_Reference*)pRoot)->GetRefObjNum()) != 0)) {\n                                                FX_POSITION pos = pTrailer->GetStartPos();\n                                                while (pos) {\n                                                    CFX_ByteString key;\n                                                    CPDF_Object* pObj = pTrailer->GetNextElement(pos, key);\n                                                    m_pTrailer->SetAt(key, pObj->Clone(), m_pDocument);\n                                                }\n                                                pObj->Release();\n                                            } else {\n                                                pObj->Release();\n                                            }\n                                        } else {\n                                            if (pObj->GetType() == PDFOBJ_STREAM) {\n                                                m_pTrailer = (CPDF_Dictionary*)pTrailer->Clone();\n                                                pObj->Release();\n                                            } else {\n                                                m_pTrailer = pTrailer;\n                                            }\n                                            FX_FILESIZE dwSavePos = m_Syntax.SavePos();\n                                            CFX_ByteString strWord = m_Syntax.GetKeyword();\n                                            if (!strWord.Compare(FX_BSTRC(\"startxref\"))) {\n                                                FX_BOOL bNumber = FALSE;\n                                                CFX_ByteString bsOffset = m_Syntax.GetNextWord(bNumber);\n                                                if (bNumber) {\n                                                    m_LastXRefOffset = FXSYS_atoi(bsOffset);\n                                                }\n                                            }\n                                            m_Syntax.RestorePos(dwSavePos);\n                                        }\n                                    } else {\n                                        pObj->Release();\n                                    }\n                                    bInUpdate = TRUE;\n                                }\n                            }\n                        }\n                        --i;\n                        status = 0;\n                    } else if (byte == \"trailer\"[inside_index]) {\n                        inside_index ++;\n                    } else {\n                        --i;\n                        status = 0;\n                    }\n                    break;\n                case 8:\n                    if (inside_index == 4) {\n                        last_xref = pos + i - 4;\n                        status = 1;\n                    } else if (byte == \"xref\"[inside_index]) {\n                        inside_index ++;\n                    } else {\n                        --i;\n                        status = 0;\n                    }\n                    break;\n                case 9:\n                    if (byte == '\\r' || byte == '\\n') {\n                        status = 0;\n                    }\n                    break;\n                case 10:\n                    if (byte == ')') {\n                        if (depth > 0) {\n                            depth--;\n                        }\n                    } else if (byte == '(') {\n                        depth++;\n                    }\n                    if (!depth) {\n                        status = 0;\n                    }\n                    break;\n                case 11:\n                    if (byte == '<' && inside_index == 1) {\n                        status = 12;\n                    } else if (byte == '>') {\n                        status = 0;\n                    }\n                    inside_index = 0;\n                    break;\n                case 12:\n                    --i;\n                    status = 0;\n                    break;\n                case 13:\n                    if (_PDF_CharType[byte] == 'D' || _PDF_CharType[byte] == 'W') {\n                        --i;\n                        status = 0;\n                    }\n                    break;\n                case 14:\n                    if (_PDF_CharType[byte] == 'W') {\n                        status = 0;\n                    } else if (byte == '%' || byte == '(' || byte == '<' || byte == '\\\\') {\n                        status = 0;\n                        --i;\n                    } else if (inside_index == 6) {\n                        status = 0;\n                        --i;\n                    } else if (byte == \"endobj\"[inside_index]) {\n                        inside_index++;\n                    }\n                    break;\n            }\n            if (bOverFlow) {\n                size = 0;\n                break;\n            }\n        }\n        pos += size;\n    }\n    if (last_xref != -1 && last_xref > last_obj) {\n        last_trailer = last_xref;\n    } else if (last_trailer == -1 || last_xref < last_obj) {\n        last_trailer = m_Syntax.m_FileLen;\n    }\n    FX_FILESIZE offset = last_trailer - m_Syntax.m_HeaderOffset;\n    FX_LPVOID pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);\n    if (pResult == NULL) {\n        m_SortedOffset.Add(offset);\n    }\n    FX_Free(buffer);\n    return TRUE;\n}\nstatic FX_DWORD _GetVarInt(FX_LPCBYTE p, FX_INT32 n)\n{\n    FX_DWORD result = 0;\n    for (FX_INT32 i = 0; i < n; i ++) {\n        result = result * 256 + p[i];\n    }\n    return result;\n}\nFX_BOOL CPDF_Parser::LoadCrossRefV5(FX_FILESIZE pos, FX_FILESIZE& prev, FX_BOOL bMainXRef)\n{\n    CPDF_Stream* pStream = (CPDF_Stream*)ParseIndirectObjectAt(m_pDocument, pos, 0, NULL);\n    if (!pStream) {\n        return FALSE;\n    }\n    if (m_pDocument) {\n        m_pDocument->InsertIndirectObject(pStream->m_ObjNum, pStream);\n    }\n    if (pStream->GetType() != PDFOBJ_STREAM) {\n        return FALSE;\n    }\n    prev = pStream->GetDict()->GetInteger(FX_BSTRC(\"Prev\"));\n    FX_INT32 size = pStream->GetDict()->GetInteger(FX_BSTRC(\"Size\"));\n    if (size < 0) {\n        pStream->Release();\n        return FALSE;\n    }\n    if (bMainXRef) {\n        m_pTrailer = (CPDF_Dictionary*)pStream->GetDict()->Clone();\n        m_CrossRef.SetSize(size);\n        if (m_V5Type.SetSize(size)) {\n            FXSYS_memset32(m_V5Type.GetData(), 0, size);\n        }\n    } else {\n        m_Trailers.Add((CPDF_Dictionary*)pStream->GetDict()->Clone());\n    }\n    CFX_DWordArray IndexArray, WidthArray;\n    FX_DWORD nSegs = 0;\n    CPDF_Array* pArray = pStream->GetDict()->GetArray(FX_BSTRC(\"Index\"));\n    if (pArray == NULL) {\n        IndexArray.Add(0);\n        IndexArray.Add(size);\n        nSegs = 1;\n    } else {\n        for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {\n            IndexArray.Add(pArray->GetInteger(i));\n        }\n        nSegs = pArray->GetCount() / 2;\n    }\n    pArray = pStream->GetDict()->GetArray(FX_BSTRC(\"W\"));\n    if (pArray == NULL) {\n        pStream->Release();\n        return FALSE;\n    }\n    FX_DWORD totalwidth = 0;\n    FX_DWORD i;\n    for (i = 0; i < pArray->GetCount(); i ++) {\n        WidthArray.Add(pArray->GetInteger(i));\n        if (totalwidth + WidthArray[i] < totalwidth) {\n            pStream->Release();\n            return FALSE;\n        }\n        totalwidth += WidthArray[i];\n    }\n    if (totalwidth == 0 || WidthArray.GetSize() < 3) {\n        pStream->Release();\n        return FALSE;\n    }\n    CPDF_StreamAcc acc;\n    acc.LoadAllData(pStream);\n    FX_LPCBYTE pData = acc.GetData();\n    FX_DWORD dwTotalSize = acc.GetSize();\n    FX_DWORD segindex = 0;\n    for (i = 0; i < nSegs; i ++) {\n        FX_INT32 startnum = IndexArray[i * 2];\n        if (startnum < 0) {\n            continue;\n        }\n        m_dwXrefStartObjNum = startnum;\n        FX_DWORD count = IndexArray[i * 2 + 1];\n        if (segindex + count < segindex || segindex + count == 0 ||\n                (FX_DWORD)totalwidth >= UINT_MAX / (segindex + count) || (segindex + count) * (FX_DWORD)totalwidth > dwTotalSize) {\n            continue;\n        }\n        FX_LPCBYTE segstart = pData + segindex * (FX_DWORD)totalwidth;\n        if ((FX_DWORD)startnum + count < (FX_DWORD)startnum ||\n                (FX_DWORD)startnum + count > (FX_DWORD)m_V5Type.GetSize()) {\n            continue;\n        }\n        for (FX_DWORD j = 0; j < count; j ++) {\n            FX_INT32 type = 1;\n            FX_LPCBYTE entrystart = segstart + j * totalwidth;\n            if (WidthArray[0]) {\n                type = _GetVarInt(entrystart, WidthArray[0]);\n            }\n            if (m_V5Type[startnum + j] == 255) {\n                FX_FILESIZE offset = _GetVarInt(entrystart + WidthArray[0], WidthArray[1]);\n                m_CrossRef[startnum + j] = offset;\n                FX_LPVOID pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);\n                if (pResult == NULL) {\n                    m_SortedOffset.Add(offset);\n                }\n                continue;\n            }\n            if (m_V5Type[startnum + j]) {\n                continue;\n            }\n            m_V5Type[startnum + j] = type;\n            if (type == 0) {\n                m_CrossRef[startnum + j] = 0;\n            } else {\n                FX_FILESIZE offset = _GetVarInt(entrystart + WidthArray[0], WidthArray[1]);\n                m_CrossRef[startnum + j] = offset;\n                if (type == 1) {\n                    FX_LPVOID pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);\n                    if (pResult == NULL) {\n                        m_SortedOffset.Add(offset);\n                    }\n                } else {\n                    if (offset < 0 || offset >= m_V5Type.GetSize()) {\n                        pStream->Release();\n                        return FALSE;\n                    }\n                    m_V5Type[offset] = 255;\n                }\n            }\n        }\n        segindex += count;\n    }\n    pStream->Release();\n    return TRUE;\n}\nCPDF_Array* CPDF_Parser::GetIDArray()\n{\n    CPDF_Object* pID = m_pTrailer ? m_pTrailer->GetElement(FX_BSTRC(\"ID\")) : NULL;\n    if (pID == NULL) {\n        return NULL;\n    }\n    if (pID->GetType() == PDFOBJ_REFERENCE) {\n        pID = ParseIndirectObject(NULL, ((CPDF_Reference*)pID)->GetRefObjNum());\n        m_pTrailer->SetAt(FX_BSTRC(\"ID\"), pID);\n    }\n    if (pID == NULL || pID->GetType() != PDFOBJ_ARRAY) {\n        return NULL;\n    }\n    return (CPDF_Array*)pID;\n}\nFX_DWORD CPDF_Parser::GetRootObjNum()\n{\n    CPDF_Reference* pRef = m_pTrailer ? (CPDF_Reference*)m_pTrailer->GetElement(FX_BSTRC(\"Root\")) : NULL;\n    if (pRef == NULL || pRef->GetType() != PDFOBJ_REFERENCE) {\n        return 0;\n    }\n    return pRef->GetRefObjNum();\n}\nFX_DWORD CPDF_Parser::GetInfoObjNum()\n{\n    CPDF_Reference* pRef = m_pTrailer ? (CPDF_Reference*)m_pTrailer->GetElement(FX_BSTRC(\"Info\")) : NULL;\n    if (pRef == NULL || pRef->GetType() != PDFOBJ_REFERENCE) {\n        return 0;\n    }\n    return pRef->GetRefObjNum();\n}\nFX_BOOL CPDF_Parser::IsFormStream(FX_DWORD objnum, FX_BOOL& bForm)\n{\n    bForm = FALSE;\n    if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) {\n        return TRUE;\n    }\n    if (m_V5Type[objnum] == 0) {\n        return TRUE;\n    }\n    if (m_V5Type[objnum] == 2) {\n        return TRUE;\n    }\n    FX_FILESIZE pos = m_CrossRef[objnum];\n    FX_LPVOID pResult = FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);\n    if (pResult == NULL) {\n        return TRUE;\n    }\n    if ((FX_FILESIZE*)pResult - (FX_FILESIZE*)m_SortedOffset.GetData() == m_SortedOffset.GetSize() - 1) {\n        return FALSE;\n    }\n    FX_FILESIZE size = ((FX_FILESIZE*)pResult)[1] - pos;\n    FX_FILESIZE SavedPos = m_Syntax.SavePos();\n    m_Syntax.RestorePos(pos);\n    bForm = m_Syntax.SearchMultiWord(FX_BSTRC(\"/Form\\0stream\"), TRUE, size) == 0;\n    m_Syntax.RestorePos(SavedPos);\n    return TRUE;\n}\nCPDF_Object* CPDF_Parser::ParseIndirectObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, PARSE_CONTEXT* pContext)\n{\n    if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) {\n        return NULL;\n    }\n    if (m_V5Type[objnum] == 1 || m_V5Type[objnum] == 255) {\n        FX_FILESIZE pos = m_CrossRef[objnum];\n        if (pos <= 0) {\n            return NULL;\n        }\n        return ParseIndirectObjectAt(pObjList, pos, objnum, pContext);\n    }\n    if (m_V5Type[objnum] == 2) {\n        CPDF_StreamAcc* pObjStream = GetObjectStream((FX_DWORD)m_CrossRef[objnum]);\n        if (pObjStream == NULL) {\n            return NULL;\n        }\n        FX_INT32 n = pObjStream->GetDict()->GetInteger(FX_BSTRC(\"N\"));\n        FX_INT32 offset = pObjStream->GetDict()->GetInteger(FX_BSTRC(\"First\"));\n        CPDF_SyntaxParser syntax;\n        CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream((FX_LPBYTE)pObjStream->GetData(), (size_t)pObjStream->GetSize(), FALSE));\n        syntax.InitParser((IFX_FileStream*)file, 0);\n        CPDF_Object* pRet = NULL;\n        while (n) {\n            FX_DWORD thisnum = syntax.GetDirectNum();\n            FX_DWORD thisoff = syntax.GetDirectNum();\n            if (thisnum == objnum) {\n                syntax.RestorePos(offset + thisoff);\n                pRet = syntax.GetObject(pObjList, 0, 0, 0, pContext);\n                break;\n            }\n            n --;\n        }\n        return pRet;\n    }\n    return NULL;\n}\nCPDF_StreamAcc* CPDF_Parser::GetObjectStream(FX_DWORD objnum)\n{\n    CPDF_StreamAcc* pStreamAcc = NULL;\n    if (m_ObjectStreamMap.Lookup((void*)(FX_UINTPTR)objnum, (void*&)pStreamAcc)) {\n        return pStreamAcc;\n    }\n    const CPDF_Stream* pStream = m_pDocument ? (CPDF_Stream*)m_pDocument->GetIndirectObject(objnum) : NULL;\n    if (pStream == NULL || pStream->GetType() != PDFOBJ_STREAM) {\n        return NULL;\n    }\n    pStreamAcc = FX_NEW CPDF_StreamAcc;\n    pStreamAcc->LoadAllData(pStream);\n    m_ObjectStreamMap.SetAt((void*)(FX_UINTPTR)objnum, pStreamAcc);\n    return pStreamAcc;\n}\nFX_FILESIZE CPDF_Parser::GetObjectSize(FX_DWORD objnum)\n{\n    if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) {\n        return 0;\n    }\n    if (m_V5Type[objnum] == 2) {\n        objnum = (FX_DWORD)m_CrossRef[objnum];\n    }\n    if (m_V5Type[objnum] == 1 || m_V5Type[objnum] == 255) {\n        FX_FILESIZE offset = m_CrossRef[objnum];\n        if (offset == 0) {\n            return 0;\n        }\n        FX_LPVOID pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);\n        if (pResult == NULL) {\n            return 0;\n        }\n        if ((FX_FILESIZE*)pResult - (FX_FILESIZE*)m_SortedOffset.GetData() == m_SortedOffset.GetSize() - 1) {\n            return 0;\n        }\n        return ((FX_FILESIZE*)pResult)[1] - offset;\n    }\n    return 0;\n}\nvoid CPDF_Parser::GetIndirectBinary(FX_DWORD objnum, FX_LPBYTE& pBuffer, FX_DWORD& size)\n{\n    pBuffer = NULL;\n    size = 0;\n    if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) {\n        return;\n    }\n    if (m_V5Type[objnum] == 2) {\n        CPDF_StreamAcc* pObjStream = GetObjectStream((FX_DWORD)m_CrossRef[objnum]);\n        if (pObjStream == NULL) {\n            return;\n        }\n        FX_INT32 n = pObjStream->GetDict()->GetInteger(FX_BSTRC(\"N\"));\n        FX_INT32 offset = pObjStream->GetDict()->GetInteger(FX_BSTRC(\"First\"));\n        CPDF_SyntaxParser syntax;\n        FX_LPCBYTE pData = pObjStream->GetData();\n        FX_DWORD totalsize = pObjStream->GetSize();\n        CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream((FX_LPBYTE)pData, (size_t)totalsize, FALSE));\n        syntax.InitParser((IFX_FileStream*)file, 0);\n        while (n) {\n            FX_DWORD thisnum = syntax.GetDirectNum();\n            FX_DWORD thisoff = syntax.GetDirectNum();\n            if (thisnum == objnum) {\n                if (n == 1) {\n                    size = totalsize - (thisoff + offset);\n                } else {\n                    FX_DWORD nextnum = syntax.GetDirectNum();\n                    FX_DWORD nextoff = syntax.GetDirectNum();\n                    size = nextoff - thisoff;\n                }\n                pBuffer = FX_Alloc(FX_BYTE, size);\n                FXSYS_memcpy32(pBuffer, pData + thisoff + offset, size);\n                return;\n            }\n            n --;\n        }\n        return;\n    }\n    if (m_V5Type[objnum] == 1) {\n        FX_FILESIZE pos = m_CrossRef[objnum];\n        if (pos == 0) {\n            return;\n        }\n        FX_FILESIZE SavedPos = m_Syntax.SavePos();\n        m_Syntax.RestorePos(pos);\n        FX_BOOL bIsNumber;\n        CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber);\n        if (!bIsNumber) {\n            m_Syntax.RestorePos(SavedPos);\n            return;\n        }\n        FX_DWORD real_objnum = FXSYS_atoi(word);\n        if (real_objnum && real_objnum != objnum) {\n            m_Syntax.RestorePos(SavedPos);\n            return;\n        }\n        word = m_Syntax.GetNextWord(bIsNumber);\n        if (!bIsNumber) {\n            m_Syntax.RestorePos(SavedPos);\n            return;\n        }\n        if (m_Syntax.GetKeyword() != FX_BSTRC(\"obj\")) {\n            m_Syntax.RestorePos(SavedPos);\n            return;\n        }\n        FX_LPVOID pResult = FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);\n        if (pResult == NULL) {\n            m_Syntax.RestorePos(SavedPos);\n            return;\n        }\n        FX_FILESIZE nextoff = ((FX_FILESIZE*)pResult)[1];\n        FX_BOOL bNextOffValid = FALSE;\n        if (nextoff != pos) {\n            m_Syntax.RestorePos(nextoff);\n            word = m_Syntax.GetNextWord(bIsNumber);\n            if (word == FX_BSTRC(\"xref\")) {\n                bNextOffValid = TRUE;\n            } else if (bIsNumber) {\n                word = m_Syntax.GetNextWord(bIsNumber);\n                if (bIsNumber && m_Syntax.GetKeyword() == FX_BSTRC(\"obj\")) {\n                    bNextOffValid = TRUE;\n                }\n            }\n        }\n        if (!bNextOffValid) {\n            m_Syntax.RestorePos(pos);\n            while (1) {\n                if (m_Syntax.GetKeyword() == FX_BSTRC(\"endobj\")) {\n                    break;\n                }\n                if (m_Syntax.SavePos() == m_Syntax.m_FileLen) {\n                    break;\n                }\n            }\n            nextoff = m_Syntax.SavePos();\n        }\n        size = (FX_DWORD)(nextoff - pos);\n        pBuffer = FX_Alloc(FX_BYTE, size);\n        m_Syntax.RestorePos(pos);\n        m_Syntax.ReadBlock(pBuffer, size);\n        m_Syntax.RestorePos(SavedPos);\n    }\n}\nCPDF_Object* CPDF_Parser::ParseIndirectObjectAt(CPDF_IndirectObjects* pObjList, FX_FILESIZE pos, FX_DWORD objnum,\n        PARSE_CONTEXT* pContext)\n{\n    FX_FILESIZE SavedPos = m_Syntax.SavePos();\n    m_Syntax.RestorePos(pos);\n    FX_BOOL bIsNumber;\n    CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber);\n    if (!bIsNumber) {\n        m_Syntax.RestorePos(SavedPos);\n        return NULL;\n    }\n    FX_FILESIZE objOffset = m_Syntax.SavePos();\n    objOffset -= word.GetLength();\n    FX_DWORD real_objnum = FXSYS_atoi(word);\n    if (objnum && real_objnum != objnum) {\n        m_Syntax.RestorePos(SavedPos);\n        return NULL;\n    }\n    word = m_Syntax.GetNextWord(bIsNumber);\n    if (!bIsNumber) {\n        m_Syntax.RestorePos(SavedPos);\n        return NULL;\n    }\n    FX_DWORD gennum = FXSYS_atoi(word);\n    if (m_Syntax.GetKeyword() != FX_BSTRC(\"obj\")) {\n        m_Syntax.RestorePos(SavedPos);\n        return NULL;\n    }\n    CPDF_Object* pObj = m_Syntax.GetObject(pObjList, objnum, gennum, 0, pContext);\n    FX_FILESIZE endOffset = m_Syntax.SavePos();\n    CFX_ByteString bsWord = m_Syntax.GetKeyword();\n    if (bsWord == FX_BSTRC(\"endobj\")) {\n        endOffset = m_Syntax.SavePos();\n    }\n    FX_DWORD objSize = endOffset - objOffset;\n    m_Syntax.RestorePos(SavedPos);\n    if (pObj && !objnum) {\n        pObj->m_ObjNum = real_objnum;\n        pObj->m_GenNum = gennum;\n    }\n    return pObj;\n}\nCPDF_Object* CPDF_Parser::ParseIndirectObjectAtByStrict(CPDF_IndirectObjects* pObjList, FX_FILESIZE pos, FX_DWORD objnum,\n        struct PARSE_CONTEXT* pContext, FX_FILESIZE *pResultPos)\n{\n    FX_FILESIZE SavedPos = m_Syntax.SavePos();\n    m_Syntax.RestorePos(pos);\n    FX_BOOL bIsNumber;\n    CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber);\n    if (!bIsNumber) {\n        m_Syntax.RestorePos(SavedPos);\n        return NULL;\n    }\n    FX_DWORD real_objnum = FXSYS_atoi(word);\n    if (objnum && real_objnum != objnum) {\n        m_Syntax.RestorePos(SavedPos);\n        return NULL;\n    }\n    word = m_Syntax.GetNextWord(bIsNumber);\n    if (!bIsNumber) {\n        m_Syntax.RestorePos(SavedPos);\n        return NULL;\n    }\n    FX_DWORD gennum = FXSYS_atoi(word);\n    if (m_Syntax.GetKeyword() != FX_BSTRC(\"obj\")) {\n        m_Syntax.RestorePos(SavedPos);\n        return NULL;\n    }\n    CPDF_Object* pObj = m_Syntax.GetObjectByStrict(pObjList, objnum, gennum, 0, pContext);\n    if (pResultPos) {\n        *pResultPos = m_Syntax.m_Pos;\n    }\n    m_Syntax.RestorePos(SavedPos);\n    return pObj;\n}\nCPDF_Dictionary* CPDF_Parser::LoadTrailerV4()\n{\n    if (m_Syntax.GetKeyword() != FX_BSTRC(\"trailer\")) {\n        return NULL;\n    }\n    CPDF_Object* pObj = m_Syntax.GetObject(m_pDocument, 0, 0, 0);\n    if (pObj == NULL || pObj->GetType() != PDFOBJ_DICTIONARY) {\n        if (pObj) {\n            pObj->Release();\n        }\n        return NULL;\n    }\n    return (CPDF_Dictionary*)pObj;\n}\nFX_DWORD CPDF_Parser::GetPermissions(FX_BOOL bCheckRevision)\n{\n    if (m_pSecurityHandler == NULL) {\n        return (FX_DWORD) - 1;\n    }\n    FX_DWORD dwPermission = m_pSecurityHandler->GetPermissions();\n    if (m_pEncryptDict && m_pEncryptDict->GetString(FX_BSTRC(\"Filter\")) == FX_BSTRC(\"Standard\")) {\n        dwPermission &= 0xFFFFFFFC;\n        dwPermission |= 0xFFFFF0C0;\n        if(bCheckRevision && m_pEncryptDict->GetInteger(FX_BSTRC(\"R\")) == 2) {\n            dwPermission &= 0xFFFFF0FF;\n        }\n    }\n    return dwPermission;\n}\nFX_BOOL CPDF_Parser::IsOwner()\n{\n    return m_pSecurityHandler == NULL ? TRUE : m_pSecurityHandler->IsOwner();\n}\nvoid CPDF_Parser::SetSecurityHandler(CPDF_SecurityHandler* pSecurityHandler, FX_BOOL bForced)\n{\n    ASSERT(m_pSecurityHandler == NULL);\n    if (m_pSecurityHandler && !m_bForceUseSecurityHandler) {\n        delete m_pSecurityHandler;\n        m_pSecurityHandler = NULL;\n    }\n    m_bForceUseSecurityHandler = bForced;\n    m_pSecurityHandler = pSecurityHandler;\n    if (m_bForceUseSecurityHandler) {\n        return;\n    }\n    m_Syntax.m_pCryptoHandler = pSecurityHandler->CreateCryptoHandler();\n    m_Syntax.m_pCryptoHandler->Init(NULL, pSecurityHandler);\n}\nFX_BOOL CPDF_Parser::IsLinearizedFile(IFX_FileRead* pFileAccess, FX_DWORD offset)\n{\n    m_Syntax.InitParser(pFileAccess, offset);\n    m_Syntax.RestorePos(m_Syntax.m_HeaderOffset + 9);\n    FX_FILESIZE SavedPos = m_Syntax.SavePos();\n    FX_BOOL bIsNumber;\n    CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber);\n    if (!bIsNumber) {\n        return FALSE;\n    }\n    FX_DWORD objnum = FXSYS_atoi(word);\n    word = m_Syntax.GetNextWord(bIsNumber);\n    if (!bIsNumber) {\n        return FALSE;\n    }\n    FX_DWORD gennum = FXSYS_atoi(word);\n    if (m_Syntax.GetKeyword() != FX_BSTRC(\"obj\")) {\n        m_Syntax.RestorePos(SavedPos);\n        return FALSE;\n    }\n    m_pLinearized = m_Syntax.GetObject(NULL, objnum, gennum, 0);\n    if (!m_pLinearized) {\n        return FALSE;\n    }\n    if (m_pLinearized->GetDict() && m_pLinearized->GetDict()->GetElement(FX_BSTRC(\"Linearized\"))) {\n        m_Syntax.GetNextWord(bIsNumber);\n        CPDF_Object *pLen = m_pLinearized->GetDict()->GetElement(FX_BSTRC(\"L\"));\n        if (!pLen) {\n            m_pLinearized->Release();\n            return FALSE;\n        }\n        if (pLen->GetInteger() != (int)pFileAccess->GetSize()) {\n            return FALSE;\n        }\n        CPDF_Object *pNo = m_pLinearized->GetDict()->GetElement(FX_BSTRC(\"P\"));\n        if (pNo && pNo->GetType() == PDFOBJ_NUMBER) {\n            m_dwFirstPageNo = pNo->GetInteger();\n        }\n        CPDF_Object *pTable = m_pLinearized->GetDict()->GetElement(FX_BSTRC(\"T\"));\n        if (pTable && pTable->GetType() == PDFOBJ_NUMBER) {\n            m_LastXRefOffset = pTable->GetInteger();\n        }\n        return TRUE;\n    }\n    m_pLinearized->Release();\n    m_pLinearized = NULL;\n    return FALSE;\n}\nFX_DWORD CPDF_Parser::StartAsynParse(IFX_FileRead* pFileAccess, FX_BOOL bReParse, FX_BOOL bOwnFileRead)\n{\n    CloseParser(bReParse);\n    m_bXRefStream = FALSE;\n    m_LastXRefOffset = 0;\n    m_bOwnFileRead = bOwnFileRead;\n    FX_INT32 offset = GetHeaderOffset(pFileAccess);\n    if (offset == -1) {\n        return PDFPARSE_ERROR_FORMAT;\n    }\n    if (!IsLinearizedFile(pFileAccess, offset)) {\n        m_Syntax.m_pFileAccess = NULL;\n        return StartParse(pFileAccess, bReParse, bOwnFileRead);\n    }\n    if (!bReParse) {\n        m_pDocument = FX_NEW CPDF_Document(this);\n    }\n    FX_FILESIZE dwFirstXRefOffset = m_Syntax.SavePos();\n    FX_BOOL bXRefRebuilt = FALSE;\n    FX_BOOL bLoadV4 = FALSE;\n    if (!(bLoadV4 = LoadCrossRefV4(dwFirstXRefOffset, 0, FALSE, FALSE)) && !LoadCrossRefV5(dwFirstXRefOffset, dwFirstXRefOffset, TRUE)) {\n        if (!RebuildCrossRef()) {\n            return PDFPARSE_ERROR_FORMAT;\n        }\n        bXRefRebuilt = TRUE;\n        m_LastXRefOffset = 0;\n    }\n    if (bLoadV4) {\n        m_pTrailer = LoadTrailerV4();\n        if (m_pTrailer == NULL) {\n            return FALSE;\n        }\n        FX_INT32 xrefsize = GetDirectInteger(m_pTrailer, FX_BSTRC(\"Size\"));\n        if (xrefsize == 0) {\n            return FALSE;\n        }\n        m_CrossRef.SetSize(xrefsize);\n        m_V5Type.SetSize(xrefsize);\n    }\n    FX_DWORD dwRet = SetEncryptHandler();\n    if (dwRet != PDFPARSE_ERROR_SUCCESS) {\n        return dwRet;\n    }\n    m_pDocument->LoadAsynDoc(m_pLinearized->GetDict());\n    if (m_pDocument->GetRoot() == NULL || m_pDocument->GetPageCount() == 0) {\n        if (bXRefRebuilt) {\n            return PDFPARSE_ERROR_FORMAT;\n        }\n        ReleaseEncryptHandler();\n        if (!RebuildCrossRef()) {\n            return PDFPARSE_ERROR_FORMAT;\n        }\n        dwRet = SetEncryptHandler();\n        if (dwRet != PDFPARSE_ERROR_SUCCESS) {\n            return dwRet;\n        }\n        m_pDocument->LoadAsynDoc(m_pLinearized->GetDict());\n        if (m_pDocument->GetRoot() == NULL) {\n            return PDFPARSE_ERROR_FORMAT;\n        }\n    }\n    FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);\n    FX_DWORD RootObjNum = GetRootObjNum();\n    if (RootObjNum == 0) {\n        ReleaseEncryptHandler();\n        RebuildCrossRef();\n        RootObjNum = GetRootObjNum();\n        if (RootObjNum == 0) {\n            return PDFPARSE_ERROR_FORMAT;\n        }\n        dwRet = SetEncryptHandler();\n        if (dwRet != PDFPARSE_ERROR_SUCCESS) {\n            return dwRet;\n        }\n    }\n    if (m_pSecurityHandler && m_pSecurityHandler->IsMetadataEncrypted()) {\n        CPDF_Reference* pMetadata = (CPDF_Reference*)m_pDocument->GetRoot()->GetElement(FX_BSTRC(\"Metadata\"));\n        if (pMetadata && pMetadata->GetType() == PDFOBJ_REFERENCE) {\n            m_Syntax.m_MetadataObjnum = pMetadata->GetRefObjNum();\n        }\n    }\n    return PDFPARSE_ERROR_SUCCESS;\n}\nFX_BOOL CPDF_Parser::LoadLinearizedAllCrossRefV5(FX_FILESIZE xrefpos)\n{\n    if (!LoadCrossRefV5(xrefpos, xrefpos, FALSE)) {\n        return FALSE;\n    }\n    while (xrefpos)\n        if (!LoadCrossRefV5(xrefpos, xrefpos, FALSE)) {\n            return FALSE;\n        }\n    m_ObjectStreamMap.InitHashTable(101, FALSE);\n    m_bXRefStream = TRUE;\n    return TRUE;\n}\nFX_DWORD CPDF_Parser::LoadLinearizedMainXRefTable()\n{\n    FX_DWORD dwSaveMetadataObjnum = m_Syntax.m_MetadataObjnum;\n    m_Syntax.m_MetadataObjnum = 0;\n    if (m_pTrailer) {\n        m_pTrailer->Release();\n        m_pTrailer = NULL;\n    }\n    m_Syntax.RestorePos(m_LastXRefOffset - m_Syntax.m_HeaderOffset);\n    FX_FILESIZE dwSavedPos = m_Syntax.SavePos();\n    FX_BYTE ch = 0;\n    FX_DWORD dwCount = 0;\n    m_Syntax.GetNextChar(ch);\n    FX_INT32 type = _PDF_CharType[ch];\n    while (type == 'W') {\n        ++dwCount;\n        if (m_Syntax.m_FileLen >= (FX_FILESIZE)(m_Syntax.SavePos() + m_Syntax.m_HeaderOffset)) {\n            break;\n        }\n        m_Syntax.GetNextChar(ch);\n        type = _PDF_CharType[ch];\n    }\n    m_LastXRefOffset += dwCount;\n    FX_POSITION pos = m_ObjectStreamMap.GetStartPosition();\n    while (pos) {\n        FX_LPVOID objnum;\n        CPDF_StreamAcc* pStream;\n        m_ObjectStreamMap.GetNextAssoc(pos, objnum, (void*&)pStream);\n        delete pStream;\n    }\n    m_ObjectStreamMap.RemoveAll();\n    if (!LoadLinearizedAllCrossRefV4(m_LastXRefOffset, m_dwXrefStartObjNum) && !LoadLinearizedAllCrossRefV5(m_LastXRefOffset)) {\n        m_LastXRefOffset = 0;\n        m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum;\n        return PDFPARSE_ERROR_FORMAT;\n    }\n    FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);\n    m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum;\n    return PDFPARSE_ERROR_SUCCESS;\n}\nCPDF_SyntaxParser::CPDF_SyntaxParser()\n{\n    m_pFileAccess = NULL;\n    m_pCryptoHandler = NULL;\n    m_pFileBuf = NULL;\n    m_BufSize = CPDF_ModuleMgr::Get()->m_FileBufSize;\n    m_pFileBuf = NULL;\n    m_MetadataObjnum = 0;\n    m_dwWordPos = 0;\n#if defined(_FPDFAPI_MINI_)\n    m_bFileStream = TRUE;\n#else\n    m_bFileStream = FALSE;\n#endif\n}\nCPDF_SyntaxParser::~CPDF_SyntaxParser()\n{\n    if (m_pFileBuf) {\n        FX_Free(m_pFileBuf);\n    }\n}\nFX_BOOL CPDF_SyntaxParser::GetCharAt(FX_FILESIZE pos, FX_BYTE& ch)\n{\n    FX_FILESIZE save_pos = m_Pos;\n    m_Pos = pos;\n    FX_BOOL ret = GetNextChar(ch);\n    m_Pos = save_pos;\n    return ret;\n}\nFX_BOOL CPDF_SyntaxParser::GetNextChar(FX_BYTE& ch)\n{\n    FX_FILESIZE pos = m_Pos + m_HeaderOffset;\n    if (pos >= m_FileLen) {\n        return FALSE;\n    }\n    if (m_BufOffset >= pos || (FX_FILESIZE)(m_BufOffset + m_BufSize) <= pos) {\n        FX_FILESIZE read_pos = pos;\n        FX_DWORD read_size = m_BufSize;\n        if ((FX_FILESIZE)read_size > m_FileLen) {\n            read_size = (FX_DWORD)m_FileLen;\n        }\n        if ((FX_FILESIZE)(read_pos + read_size) > m_FileLen) {\n            if (m_FileLen < (FX_FILESIZE)read_size) {\n                read_pos = 0;\n                read_size = (FX_DWORD)m_FileLen;\n            } else {\n                read_pos = m_FileLen - read_size;\n            }\n        }\n        if (!m_pFileAccess->ReadBlock(m_pFileBuf, read_pos, read_size)) {\n            return FALSE;\n        }\n        m_BufOffset = read_pos;\n    }\n    ch = m_pFileBuf[pos - m_BufOffset];\n    m_Pos ++;\n    return TRUE;\n}\nFX_BOOL CPDF_SyntaxParser::GetCharAtBackward(FX_FILESIZE pos, FX_BYTE& ch)\n{\n    pos += m_HeaderOffset;\n    if (pos >= m_FileLen) {\n        return FALSE;\n    }\n    if (m_BufOffset >= pos || (FX_FILESIZE)(m_BufOffset + m_BufSize) <= pos) {\n        FX_FILESIZE read_pos;\n        if (pos < (FX_FILESIZE)m_BufSize) {\n            read_pos = 0;\n        } else {\n            read_pos = pos - m_BufSize + 1;\n        }\n        FX_DWORD read_size = m_BufSize;\n        if ((FX_FILESIZE)(read_pos + read_size) > m_FileLen) {\n            if (m_FileLen < (FX_FILESIZE)read_size) {\n                read_pos = 0;\n                read_size = (FX_DWORD)m_FileLen;\n            } else {\n                read_pos = m_FileLen - read_size;\n            }\n        }\n        if (!m_pFileAccess->ReadBlock(m_pFileBuf, read_pos, read_size)) {\n            return FALSE;\n        }\n        m_BufOffset = read_pos;\n    }\n    ch = m_pFileBuf[pos - m_BufOffset];\n    return TRUE;\n}\nFX_BOOL CPDF_SyntaxParser::ReadBlock(FX_LPBYTE pBuf, FX_DWORD size)\n{\n    if (!m_pFileAccess->ReadBlock(pBuf, m_Pos + m_HeaderOffset, size)) {\n        return FALSE;\n    }\n    m_Pos += size;\n    return TRUE;\n}\n#define MAX_WORD_BUFFER 256\nvoid CPDF_SyntaxParser::GetNextWord()\n{\n    m_WordSize = 0;\n    m_bIsNumber = TRUE;\n    FX_BYTE ch;\n    if (!GetNextChar(ch)) {\n        return;\n    }\n    FX_BYTE type = _PDF_CharType[ch];\n    while (1) {\n        while (type == 'W') {\n            if (!GetNextChar(ch)) {\n                return;\n            }\n            type = _PDF_CharType[ch];\n        }\n        if (ch != '%') {\n            break;\n        }\n        while (1) {\n            if (!GetNextChar(ch)) {\n                return;\n            }\n            if (ch == '\\r' || ch == '\\n') {\n                break;\n            }\n        }\n        type = _PDF_CharType[ch];\n    }\n    if (type == 'D') {\n        m_bIsNumber = FALSE;\n        m_WordBuffer[m_WordSize++] = ch;\n        if (ch == '/') {\n            while (1) {\n                if (!GetNextChar(ch)) {\n                    return;\n                }\n                type = _PDF_CharType[ch];\n                if (type != 'R' && type != 'N') {\n                    m_Pos --;\n                    return;\n                }\n                if (m_WordSize < MAX_WORD_BUFFER) {\n                    m_WordBuffer[m_WordSize++] = ch;\n                }\n            }\n        } else if (ch == '<') {\n            if (!GetNextChar(ch)) {\n                return;\n            }\n            if (ch == '<') {\n                m_WordBuffer[m_WordSize++] = ch;\n            } else {\n                m_Pos --;\n            }\n        } else if (ch == '>') {\n            if (!GetNextChar(ch)) {\n                return;\n            }\n            if (ch == '>') {\n                m_WordBuffer[m_WordSize++] = ch;\n            } else {\n                m_Pos --;\n            }\n        }\n        return;\n    }\n    while (1) {\n        if (m_WordSize < MAX_WORD_BUFFER) {\n            m_WordBuffer[m_WordSize++] = ch;\n        }\n        if (type != 'N') {\n            m_bIsNumber = FALSE;\n        }\n        if (!GetNextChar(ch)) {\n            return;\n        }\n        type = _PDF_CharType[ch];\n        if (type == 'D' || type == 'W') {\n            m_Pos --;\n            break;\n        }\n    }\n}\nCFX_ByteString CPDF_SyntaxParser::ReadString()\n{\n    FX_BYTE ch;\n    if (!GetNextChar(ch)) {\n        return CFX_ByteString();\n    }\n    CFX_ByteTextBuf buf;\n    FX_INT32 parlevel = 0;\n    FX_INT32 status = 0, iEscCode = 0;\n    while (1) {\n        switch (status) {\n            case 0:\n                if (ch == ')') {\n                    if (parlevel == 0) {\n                        return buf.GetByteString();\n                    }\n                    parlevel --;\n                    buf.AppendChar(')');\n                } else if (ch == '(') {\n                    parlevel ++;\n                    buf.AppendChar('(');\n                } else if (ch == '\\\\') {\n                    status = 1;\n                } else {\n                    buf.AppendChar(ch);\n                }\n                break;\n            case 1:\n                if (ch >= '0' && ch <= '7') {\n                    iEscCode = ch - '0';\n                    status = 2;\n                    break;\n                }\n                if (ch == 'n') {\n                    buf.AppendChar('\\n');\n                } else if (ch == 'r') {\n                    buf.AppendChar('\\r');\n                } else if (ch == 't') {\n                    buf.AppendChar('\\t');\n                } else if (ch == 'b') {\n                    buf.AppendChar('\\b');\n                } else if (ch == 'f') {\n                    buf.AppendChar('\\f');\n                } else if (ch == '\\r') {\n                    status = 4;\n                    break;\n                } else if (ch == '\\n') {\n                } else {\n                    buf.AppendChar(ch);\n                }\n                status = 0;\n                break;\n            case 2:\n                if (ch >= '0' && ch <= '7') {\n                    iEscCode = iEscCode * 8 + ch - '0';\n                    status = 3;\n                } else {\n                    buf.AppendChar(iEscCode);\n                    status = 0;\n                    continue;\n                }\n                break;\n            case 3:\n                if (ch >= '0' && ch <= '7') {\n                    iEscCode = iEscCode * 8 + ch - '0';\n                    buf.AppendChar(iEscCode);\n                    status = 0;\n                } else {\n                    buf.AppendChar(iEscCode);\n                    status = 0;\n                    continue;\n                }\n                break;\n            case 4:\n                status = 0;\n                if (ch != '\\n') {\n                    continue;\n                }\n                break;\n        }\n        if (!GetNextChar(ch)) {\n            break;\n        }\n    }\n    GetNextChar(ch);\n    return buf.GetByteString();\n}\nCFX_ByteString CPDF_SyntaxParser::ReadHexString()\n{\n    FX_BYTE ch;\n    if (!GetNextChar(ch)) {\n        return CFX_ByteString();\n    }\n    CFX_BinaryBuf buf;\n    FX_BOOL bFirst = TRUE;\n    FX_BYTE code = 0;\n    while (1) {\n        if (ch == '>') {\n            break;\n        }\n        if (ch >= '0' && ch <= '9') {\n            if (bFirst) {\n                code = (ch - '0') * 16;\n            } else {\n                code += ch - '0';\n                buf.AppendByte((FX_BYTE)code);\n            }\n            bFirst = !bFirst;\n        } else if (ch >= 'A' && ch <= 'F') {\n            if (bFirst) {\n                code = (ch - 'A' + 10) * 16;\n            } else {\n                code += ch - 'A' + 10;\n                buf.AppendByte((FX_BYTE)code);\n            }\n            bFirst = !bFirst;\n        } else if (ch >= 'a' && ch <= 'f') {\n            if (bFirst) {\n                code = (ch - 'a' + 10) * 16;\n            } else {\n                code += ch - 'a' + 10;\n                buf.AppendByte((FX_BYTE)code);\n            }\n            bFirst = !bFirst;\n        }\n        if (!GetNextChar(ch)) {\n            break;\n        }\n    }\n    if (!bFirst) {\n        buf.AppendByte((FX_BYTE)code);\n    }\n    return buf.GetByteString();\n}\nvoid CPDF_SyntaxParser::ToNextLine()\n{\n    FX_BYTE ch;\n    while (1) {\n        if (!GetNextChar(ch)) {\n            return;\n        }\n        if (ch == '\\n') {\n            return;\n        }\n        if (ch == '\\r') {\n            GetNextChar(ch);\n            if (ch == '\\n') {\n                return;\n            } else {\n                m_Pos --;\n                return;\n            }\n        }\n    }\n}\nvoid CPDF_SyntaxParser::ToNextWord()\n{\n    FX_BYTE ch;\n    if (!GetNextChar(ch)) {\n        return;\n    }\n    FX_BYTE type = _PDF_CharType[ch];\n    while (1) {\n        while (type == 'W') {\n            m_dwWordPos = m_Pos;\n            if (!GetNextChar(ch)) {\n                return;\n            }\n            type = _PDF_CharType[ch];\n        }\n        if (ch != '%') {\n            break;\n        }\n        while (1) {\n            if (!GetNextChar(ch)) {\n                return;\n            }\n            if (ch == '\\r' || ch == '\\n') {\n                break;\n            }\n        }\n        type = _PDF_CharType[ch];\n    }\n    m_Pos --;\n}\nCFX_ByteString CPDF_SyntaxParser::GetNextWord(FX_BOOL& bIsNumber)\n{\n    GetNextWord();\n    bIsNumber = m_bIsNumber;\n    return CFX_ByteString((FX_LPCSTR)m_WordBuffer, m_WordSize);\n}\nCFX_ByteString CPDF_SyntaxParser::GetKeyword()\n{\n    GetNextWord();\n    return CFX_ByteString((FX_LPCSTR)m_WordBuffer, m_WordSize);\n}\nCPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, FX_DWORD gennum, FX_INT32 level, PARSE_CONTEXT* pContext, FX_BOOL bDecrypt)\n{\n    if (level > _PARSER_OBJECT_LEVLE_) {\n        return NULL;\n    }\n    FX_FILESIZE SavedPos = m_Pos;\n    FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY);\n    FX_BOOL bIsNumber;\n    CFX_ByteString word = GetNextWord(bIsNumber);\n    CPDF_Object* pRet = NULL;\n    if (word.GetLength() == 0) {\n        if (bTypeOnly) {\n            return (CPDF_Object*)PDFOBJ_INVALID;\n        }\n        return NULL;\n    }\n    FX_FILESIZE wordOffset = m_Pos - word.GetLength();\n    if (bIsNumber) {\n        FX_FILESIZE SavedPos = m_Pos;\n        CFX_ByteString nextword = GetNextWord(bIsNumber);\n        if (bIsNumber) {\n            CFX_ByteString nextword2 = GetNextWord(bIsNumber);\n            if (nextword2 == FX_BSTRC(\"R\")) {\n                FX_DWORD objnum = FXSYS_atoi(word);\n                if (bTypeOnly) {\n                    return (CPDF_Object*)PDFOBJ_REFERENCE;\n                }\n                pRet = CPDF_Reference::Create(pObjList, objnum);\n                return pRet;\n            } else {\n                m_Pos = SavedPos;\n                if (bTypeOnly) {\n                    return (CPDF_Object*)PDFOBJ_NUMBER;\n                }\n                pRet = CPDF_Number::Create(word);\n                return pRet;\n            }\n        } else {\n            m_Pos = SavedPos;\n            if (bTypeOnly) {\n                return (CPDF_Object*)PDFOBJ_NUMBER;\n            }\n            pRet = CPDF_Number::Create(word);\n            return pRet;\n        }\n    }\n    if (word == FX_BSTRC(\"true\") || word == FX_BSTRC(\"false\")) {\n        if (bTypeOnly) {\n            return (CPDF_Object*)PDFOBJ_BOOLEAN;\n        }\n        pRet = CPDF_Boolean::Create(word == FX_BSTRC(\"true\"));\n        return pRet;\n    }\n    if (word == FX_BSTRC(\"null\")) {\n        if (bTypeOnly) {\n            return (CPDF_Object*)PDFOBJ_NULL;\n        }\n        pRet = CPDF_Null::Create();\n        return pRet;\n    }\n    if (word == FX_BSTRC(\"(\")) {\n        if (bTypeOnly) {\n            return (CPDF_Object*)PDFOBJ_STRING;\n        }\n        FX_FILESIZE SavedPos = m_Pos - 1;\n        CFX_ByteString str = ReadString();\n        if (m_pCryptoHandler && bDecrypt) {\n            m_pCryptoHandler->Decrypt(objnum, gennum, str);\n        }\n        pRet = CPDF_String::Create(str, FALSE);\n        return pRet;\n    }\n    if (word == FX_BSTRC(\"<\")) {\n        if (bTypeOnly) {\n            return (CPDF_Object*)PDFOBJ_STRING;\n        }\n        FX_FILESIZE SavedPos = m_Pos - 1;\n        CFX_ByteString str = ReadHexString();\n        if (m_pCryptoHandler && bDecrypt) {\n            m_pCryptoHandler->Decrypt(objnum, gennum, str);\n        }\n        pRet = CPDF_String::Create(str, TRUE);\n        return pRet;\n    }\n    if (word == FX_BSTRC(\"[\")) {\n        if (bTypeOnly) {\n            return (CPDF_Object*)PDFOBJ_ARRAY;\n        }\n        CPDF_Array* pArray = CPDF_Array::Create();\n        FX_FILESIZE firstPos = m_Pos - 1;\n        while (1) {\n            FX_FILESIZE SavedPos = m_Pos;\n            CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1);\n            if (pObj == NULL) {\n                return pArray;\n            }\n            pArray->Add(pObj);\n        }\n    }\n    if (word[0] == '/') {\n        if (bTypeOnly) {\n            return (CPDF_Object*)PDFOBJ_NAME;\n        }\n        pRet = CPDF_Name::Create(PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)));\n        return pRet;\n    }\n    if (word == FX_BSTRC(\"<<\")) {\n        FX_FILESIZE saveDictOffset = m_Pos - 2;\n        FX_DWORD dwDictSize = 0;\n        if (bTypeOnly) {\n            return (CPDF_Object*)PDFOBJ_DICTIONARY;\n        }\n        if (pContext) {\n            pContext->m_DictStart = SavedPos;\n        }\n        CPDF_Dictionary* pDict = CPDF_Dictionary::Create();\n        FX_INT32 nKeys = 0;\n        FX_FILESIZE dwSignValuePos = 0;\n        while (1) {\n            FX_BOOL bIsNumber;\n            CFX_ByteString key = GetNextWord(bIsNumber);\n            if (key.IsEmpty()) {\n                if (pDict)\n                    pDict->Release();\n                return NULL;\n            }\n            FX_FILESIZE SavedPos = m_Pos - key.GetLength();\n            if (key == FX_BSTRC(\">>\")) {\n                dwDictSize = m_Pos - saveDictOffset;\n                break;\n            }\n            if (key == FX_BSTRC(\"endobj\")) {\n                dwDictSize = m_Pos - 6 - saveDictOffset;\n                m_Pos = SavedPos;\n                break;\n            }\n            if (key[0] != '/') {\n                continue;\n            }\n            nKeys ++;\n            key = PDF_NameDecode(key);\n            if (key == FX_BSTRC(\"/Contents\")) {\n                dwSignValuePos = m_Pos;\n            }\n            CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1);\n            if (pObj == NULL) {\n                continue;\n            }\n            if (key.GetLength() == 1) {\n                pDict->SetAt(CFX_ByteStringC(((FX_LPCSTR)key) + 1, key.GetLength() - 1), pObj);\n            } else {\n                if (nKeys < 32) {\n                    pDict->SetAt(CFX_ByteStringC(((FX_LPCSTR)key) + 1, key.GetLength() - 1), pObj);\n                } else {\n                    pDict->AddValue(CFX_ByteStringC(((FX_LPCSTR)key) + 1, key.GetLength() - 1), pObj);\n                }\n            }\n        }\n        if (IsSignatureDict(pDict)) {\n            FX_FILESIZE dwSavePos = m_Pos;\n            m_Pos = dwSignValuePos;\n            CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1, NULL, FALSE);\n            pDict->SetAt(FX_BSTRC(\"Contents\"), pObj);\n            m_Pos = dwSavePos;\n        }\n        if (pContext) {\n            pContext->m_DictEnd = m_Pos;\n            if (pContext->m_Flags & PDFPARSE_NOSTREAM) {\n                return pDict;\n            }\n        }\n        FX_FILESIZE SavedPos = m_Pos;\n        FX_BOOL bIsNumber;\n        CFX_ByteString nextword = GetNextWord(bIsNumber);\n        if (nextword == FX_BSTRC(\"stream\")) {\n            CPDF_Stream* pStream = ReadStream(pDict, pContext, objnum, gennum);\n            if (pStream) {\n                return pStream;\n            }\n            if (pDict)\n                pDict->Release();\n            return NULL;\n        } else {\n            m_Pos = SavedPos;\n            return pDict;\n        }\n    }\n    if (word == FX_BSTRC(\">>\")) {\n        m_Pos = SavedPos;\n        return NULL;\n    }\n    if (bTypeOnly) {\n        return (CPDF_Object*)PDFOBJ_INVALID;\n    }\n    return NULL;\n}\nCPDF_Object* CPDF_SyntaxParser::GetObjectByStrict(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, FX_DWORD gennum,\n        FX_INT32 level, struct PARSE_CONTEXT* pContext)\n{\n    if (level > _PARSER_OBJECT_LEVLE_) {\n        return NULL;\n    }\n    FX_FILESIZE SavedPos = m_Pos;\n    FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY);\n    FX_BOOL bIsNumber;\n    CFX_ByteString word = GetNextWord(bIsNumber);\n    if (word.GetLength() == 0) {\n        if (bTypeOnly) {\n            return (CPDF_Object*)PDFOBJ_INVALID;\n        }\n        return NULL;\n    }\n    if (bIsNumber) {\n        FX_FILESIZE SavedPos = m_Pos;\n        CFX_ByteString nextword = GetNextWord(bIsNumber);\n        if (bIsNumber) {\n            CFX_ByteString nextword2 = GetNextWord(bIsNumber);\n            if (nextword2 == FX_BSTRC(\"R\")) {\n                FX_DWORD objnum = FXSYS_atoi(word);\n                if (bTypeOnly) {\n                    return (CPDF_Object*)PDFOBJ_REFERENCE;\n                }\n                return CPDF_Reference::Create(pObjList, objnum);\n            } else {\n                m_Pos = SavedPos;\n                if (bTypeOnly) {\n                    return (CPDF_Object*)PDFOBJ_NUMBER;\n                }\n                return CPDF_Number::Create(word);\n            }\n        } else {\n            m_Pos = SavedPos;\n            if (bTypeOnly) {\n                return (CPDF_Object*)PDFOBJ_NUMBER;\n            }\n            return CPDF_Number::Create(word);\n        }\n    }\n    if (word == FX_BSTRC(\"true\") || word == FX_BSTRC(\"false\")) {\n        if (bTypeOnly) {\n            return (CPDF_Object*)PDFOBJ_BOOLEAN;\n        }\n        return CPDF_Boolean::Create(word == FX_BSTRC(\"true\"));\n    }\n    if (word == FX_BSTRC(\"null\")) {\n        if (bTypeOnly) {\n            return (CPDF_Object*)PDFOBJ_NULL;\n        }\n        return CPDF_Null::Create();\n    }\n    if (word == FX_BSTRC(\"(\")) {\n        if (bTypeOnly) {\n            return (CPDF_Object*)PDFOBJ_STRING;\n        }\n        CFX_ByteString str = ReadString();\n        if (m_pCryptoHandler) {\n            m_pCryptoHandler->Decrypt(objnum, gennum, str);\n        }\n        return CPDF_String::Create(str, FALSE);\n    }\n    if (word == FX_BSTRC(\"<\")) {\n        if (bTypeOnly) {\n            return (CPDF_Object*)PDFOBJ_STRING;\n        }\n        CFX_ByteString str = ReadHexString();\n        if (m_pCryptoHandler) {\n            m_pCryptoHandler->Decrypt(objnum, gennum, str);\n        }\n        return CPDF_String::Create(str, TRUE);\n    }\n    if (word == FX_BSTRC(\"[\")) {\n        if (bTypeOnly) {\n            return (CPDF_Object*)PDFOBJ_ARRAY;\n        }\n        CPDF_Array* pArray = CPDF_Array::Create();\n        while (1) {\n            CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1);\n            if (pObj == NULL) {\n                if (m_WordBuffer[0] == ']') {\n                    return pArray;\n                }\n                if (pArray)\n                    pArray->Release();\n                return NULL;\n            }\n            pArray->Add(pObj);\n        }\n    }\n    if (word[0] == '/') {\n        if (bTypeOnly) {\n            return (CPDF_Object*)PDFOBJ_NAME;\n        }\n        return CPDF_Name::Create(PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)));\n    }\n    if (word == FX_BSTRC(\"<<\")) {\n        if (bTypeOnly) {\n            return (CPDF_Object*)PDFOBJ_DICTIONARY;\n        }\n        if (pContext) {\n            pContext->m_DictStart = SavedPos;\n        }\n        CPDF_Dictionary* pDict = CPDF_Dictionary::Create();\n        while (1) {\n            FX_BOOL bIsNumber;\n            FX_FILESIZE SavedPos = m_Pos;\n            CFX_ByteString key = GetNextWord(bIsNumber);\n            if (key.IsEmpty()) {\n                if (pDict)\n                    pDict->Release();\n                return NULL;\n            }\n            if (key == FX_BSTRC(\">>\")) {\n                break;\n            }\n            if (key == FX_BSTRC(\"endobj\")) {\n                m_Pos = SavedPos;\n                break;\n            }\n            if (key[0] != '/') {\n                continue;\n            }\n            key = PDF_NameDecode(key);\n            CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1);\n            if (pObj == NULL) {\n                if (pDict)\n                    pDict->Release();\n                FX_BYTE ch;\n                while (1) {\n                    if (!GetNextChar(ch)) {\n                        break;\n                    }\n                    if (ch == 0x0A || ch == 0x0D) {\n                        break;\n                    }\n                }\n                return NULL;\n            }\n            if (key.GetLength() == 1) {\n                pDict->SetAt(CFX_ByteStringC(((FX_LPCSTR)key) + 1, key.GetLength() - 1), pObj);\n            } else {\n                pDict->AddValue(CFX_ByteStringC(((FX_LPCSTR)key) + 1, key.GetLength() - 1), pObj);\n            }\n        }\n        if (pContext) {\n            pContext->m_DictEnd = m_Pos;\n            if (pContext->m_Flags & PDFPARSE_NOSTREAM) {\n                return pDict;\n            }\n        }\n        FX_FILESIZE SavedPos = m_Pos;\n        FX_BOOL bIsNumber;\n        CFX_ByteString nextword = GetNextWord(bIsNumber);\n        if (nextword == FX_BSTRC(\"stream\")) {\n            CPDF_Stream* pStream = ReadStream(pDict, pContext, objnum, gennum);\n            if (pStream) {\n                return pStream;\n            }\n            if (pDict)\n                pDict->Release();\n            return NULL;\n        } else {\n            m_Pos = SavedPos;\n            return pDict;\n        }\n    }\n    if (word == FX_BSTRC(\">>\")) {\n        m_Pos = SavedPos;\n        return NULL;\n    }\n    if (bTypeOnly) {\n        return (CPDF_Object*)PDFOBJ_INVALID;\n    }\n    return NULL;\n}\nCPDF_Stream* CPDF_SyntaxParser::ReadStream(CPDF_Dictionary* pDict, PARSE_CONTEXT* pContext,\n        FX_DWORD objnum, FX_DWORD gennum)\n{\n    CPDF_Object* pLenObj = pDict->GetElement(FX_BSTRC(\"Length\"));\n    FX_FILESIZE len = 0;\n    if (pLenObj && ((pLenObj->GetType() != PDFOBJ_REFERENCE) ||\n                    ((((CPDF_Reference*)pLenObj)->GetObjList() != NULL) &&\n                     ((CPDF_Reference*)pLenObj)->GetRefObjNum() != objnum))) {\n        len = pLenObj->GetInteger();\n    }\n\n    ToNextLine();\n    FX_FILESIZE StreamStartPos = m_Pos;\n    if (pContext) {\n        pContext->m_DataStart = m_Pos;\n    }\n\n    base::CheckedNumeric<FX_FILESIZE> pos = m_Pos;\n    pos += len;\n    if (pos.IsValid() && pos.ValueOrDie() < m_FileLen) {\n        m_Pos = pos.ValueOrDie();\n    } else {\n        return NULL;\n    }\n\n    CPDF_CryptoHandler* pCryptoHandler = objnum == (FX_DWORD)m_MetadataObjnum ? NULL : m_pCryptoHandler;\n    if (pCryptoHandler == NULL) {\n        FX_FILESIZE SavedPos = m_Pos;\n        GetNextWord();\n        if (m_WordSize < 9 || FXSYS_memcmp32(m_WordBuffer, \"endstream\", 9)) {\n            m_Pos = StreamStartPos;\n            FX_FILESIZE offset = FindTag(FX_BSTRC(\"endstream\"), 0);\n            if (offset >= 0) {\n                FX_FILESIZE curPos = m_Pos;\n                m_Pos = StreamStartPos;\n                FX_FILESIZE endobjOffset = FindTag(FX_BSTRC(\"endobj\"), 0);\n                if (endobjOffset < offset && endobjOffset >= 0) {\n                    offset = endobjOffset;\n                } else {\n                    m_Pos = curPos;\n                }\n                FX_BYTE byte1, byte2;\n                GetCharAt(StreamStartPos + offset - 1, byte1);\n                GetCharAt(StreamStartPos + offset - 2, byte2);\n                if (byte1 == 0x0a && byte2 == 0x0d) {\n                    len -= 2;\n                } else if (byte1 == 0x0a || byte1 == 0x0d) {\n                    len --;\n                }\n                len = (FX_DWORD)offset;\n                pDict->SetAtInteger(FX_BSTRC(\"Length\"), len);\n            } else {\n                m_Pos = StreamStartPos;\n                if (FindTag(FX_BSTRC(\"endobj\"), 0) < 0) {\n                    return NULL;\n                }\n            }\n        }\n    }\n    m_Pos = StreamStartPos;\n    CPDF_Stream* pStream;\n#if defined(_FPDFAPI_MINI_) && !defined(_FXCORE_FEATURE_ALL_)\n    pStream = FX_NEW CPDF_Stream(m_pFileAccess, pCryptoHandler, m_HeaderOffset + m_Pos, len, pDict, gennum);\n    m_Pos += len;\n#else\n    FX_LPBYTE pData = FX_Alloc(FX_BYTE, len);\n    if (!pData) {\n        return NULL;\n    }\n    ReadBlock(pData, len);\n    if (pCryptoHandler) {\n        CFX_BinaryBuf dest_buf;\n        dest_buf.EstimateSize(pCryptoHandler->DecryptGetSize(len));\n        FX_LPVOID context = pCryptoHandler->DecryptStart(objnum, gennum);\n        pCryptoHandler->DecryptStream(context, pData, len, dest_buf);\n        pCryptoHandler->DecryptFinish(context, dest_buf);\n        FX_Free(pData);\n        pData = dest_buf.GetBuffer();\n        len = dest_buf.GetSize();\n        dest_buf.DetachBuffer();\n    }\n    pStream = FX_NEW CPDF_Stream(pData, len, pDict);\n#endif\n    if (pContext) {\n        pContext->m_DataEnd = pContext->m_DataStart + len;\n    }\n    StreamStartPos = m_Pos;\n    GetNextWord();\n    if (m_WordSize == 6 && 0 == FXSYS_memcmp32(m_WordBuffer, \"endobj\", 6)) {\n        m_Pos = StreamStartPos;\n    }\n    return pStream;\n}\nvoid CPDF_SyntaxParser::InitParser(IFX_FileRead* pFileAccess, FX_DWORD HeaderOffset)\n{\n    if (m_pFileBuf) {\n        FX_Free(m_pFileBuf);\n        m_pFileBuf = NULL;\n    }\n    m_pFileBuf = FX_Alloc(FX_BYTE, m_BufSize);\n    m_HeaderOffset = HeaderOffset;\n    m_FileLen = pFileAccess->GetSize();\n    m_Pos = 0;\n    m_pFileAccess = pFileAccess;\n    m_BufOffset = 0;\n    pFileAccess->ReadBlock(m_pFileBuf, 0, (size_t)((FX_FILESIZE)m_BufSize > m_FileLen ? m_FileLen : m_BufSize));\n}\nFX_INT32 CPDF_SyntaxParser::GetDirectNum()\n{\n    GetNextWord();\n    if (!m_bIsNumber) {\n        return 0;\n    }\n    m_WordBuffer[m_WordSize] = 0;\n    return FXSYS_atoi((FX_LPCSTR)m_WordBuffer);\n}\nFX_BOOL CPDF_SyntaxParser::IsWholeWord(FX_FILESIZE startpos, FX_FILESIZE limit, FX_LPCBYTE tag, FX_DWORD taglen)\n{\n    FX_BYTE type = _PDF_CharType[tag[0]];\n    FX_BOOL bCheckLeft = type != 'D' && type != 'W';\n    type = _PDF_CharType[tag[taglen - 1]];\n    FX_BOOL bCheckRight = type != 'D' || type != 'W';\n    FX_BYTE ch;\n    if (bCheckRight && startpos + (FX_INT32)taglen <= limit && GetCharAt(startpos + (FX_INT32)taglen, ch)) {\n        FX_BYTE type = _PDF_CharType[ch];\n        if (type == 'N' || type == 'R') {\n            return FALSE;\n        }\n    }\n    if (bCheckLeft && startpos > 0 && GetCharAt(startpos - 1, ch)) {\n        FX_BYTE type = _PDF_CharType[ch];\n        if (type == 'N' || type == 'R') {\n            return FALSE;\n        }\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_SyntaxParser::SearchWord(FX_BSTR tag, FX_BOOL bWholeWord, FX_BOOL bForward, FX_FILESIZE limit)\n{\n    FX_INT32 taglen = tag.GetLength();\n    if (taglen == 0) {\n        return FALSE;\n    }\n    FX_FILESIZE pos = m_Pos;\n    FX_INT32 offset = 0;\n    if (!bForward) {\n        offset = taglen - 1;\n    }\n    FX_LPCBYTE tag_data = tag;\n    FX_BYTE byte;\n    while (1) {\n        if (bForward) {\n            if (limit) {\n                if (pos >= m_Pos + limit) {\n                    return FALSE;\n                }\n            }\n            if (!GetCharAt(pos, byte)) {\n                return FALSE;\n            }\n        } else {\n            if (limit) {\n                if (pos <= m_Pos - limit) {\n                    return FALSE;\n                }\n            }\n            if (!GetCharAtBackward(pos, byte)) {\n                return FALSE;\n            }\n        }\n        if (byte == tag_data[offset]) {\n            if (bForward) {\n                offset ++;\n                if (offset < taglen) {\n                    pos ++;\n                    continue;\n                }\n            } else {\n                offset --;\n                if (offset >= 0) {\n                    pos --;\n                    continue;\n                }\n            }\n            FX_FILESIZE startpos = bForward ? pos - taglen + 1 : pos;\n            if (!bWholeWord || IsWholeWord(startpos, limit, tag, taglen)) {\n                m_Pos = startpos;\n                return TRUE;\n            }\n        }\n        if (bForward) {\n            offset = byte == tag_data[0] ? 1 : 0;\n            pos ++;\n        } else {\n            offset = byte == tag_data[taglen - 1] ? taglen - 2 : taglen - 1;\n            pos --;\n        }\n        if (pos < 0) {\n            return FALSE;\n        }\n    }\n    return FALSE;\n}\nstruct _SearchTagRecord {\n    FX_LPCBYTE\tm_pTag;\n    FX_DWORD\tm_Len;\n    FX_DWORD\tm_Offset;\n};\nFX_INT32 CPDF_SyntaxParser::SearchMultiWord(FX_BSTR tags, FX_BOOL bWholeWord, FX_FILESIZE limit)\n{\n    FX_INT32 ntags = 1, i;\n    for (i = 0; i < tags.GetLength(); i ++)\n        if (tags[i] == 0) {\n            ntags ++;\n        }\n    _SearchTagRecord* pPatterns = FX_Alloc(_SearchTagRecord, ntags);\n    FX_DWORD start = 0, itag = 0, max_len = 0;\n    for (i = 0; i <= tags.GetLength(); i ++) {\n        if (tags[i] == 0) {\n            FX_DWORD len = i - start;\n            if (len > max_len) {\n                max_len = len;\n            }\n            pPatterns[itag].m_pTag = tags.GetPtr() + start;\n            pPatterns[itag].m_Len = len;\n            pPatterns[itag].m_Offset = 0;\n            start = i + 1;\n            itag ++;\n        }\n    }\n    FX_FILESIZE pos = m_Pos;\n    FX_BYTE byte;\n    GetCharAt(pos++, byte);\n    FX_INT32 found = -1;\n    while (1) {\n        for (i = 0; i < ntags; i ++) {\n            if (pPatterns[i].m_pTag[pPatterns[i].m_Offset] == byte) {\n                pPatterns[i].m_Offset ++;\n                if (pPatterns[i].m_Offset == pPatterns[i].m_Len) {\n                    if (!bWholeWord || IsWholeWord(pos - pPatterns[i].m_Len, limit, pPatterns[i].m_pTag, pPatterns[i].m_Len)) {\n                        found = i;\n                        goto end;\n                    } else {\n                        if (pPatterns[i].m_pTag[0] == byte) {\n                            pPatterns[i].m_Offset = 1;\n                        } else {\n                            pPatterns[i].m_Offset = 0;\n                        }\n                    }\n                }\n            } else {\n                if (pPatterns[i].m_pTag[0] == byte) {\n                    pPatterns[i].m_Offset = 1;\n                } else {\n                    pPatterns[i].m_Offset = 0;\n                }\n            }\n        }\n        if (limit && pos >= m_Pos + limit) {\n            goto end;\n        }\n        if (!GetCharAt(pos, byte)) {\n            goto end;\n        }\n        pos ++;\n    }\nend:\n    FX_Free(pPatterns);\n    return found;\n}\nFX_FILESIZE CPDF_SyntaxParser::FindTag(FX_BSTR tag, FX_FILESIZE limit)\n{\n    FX_INT32 taglen = tag.GetLength();\n    FX_INT32 match = 0;\n    limit += m_Pos;\n    FX_FILESIZE startpos = m_Pos;\n    while (1) {\n        FX_BYTE ch;\n        if (!GetNextChar(ch)) {\n            return -1;\n        }\n        if (ch == tag[match]) {\n            match ++;\n            if (match == taglen) {\n                return m_Pos - startpos - taglen;\n            }\n        } else {\n            match = ch == tag[0] ? 1 : 0;\n        }\n        if (limit && m_Pos == limit) {\n            return -1;\n        }\n    }\n    return -1;\n}\nvoid CPDF_SyntaxParser::GetBinary(FX_BYTE* buffer, FX_DWORD size)\n{\n    FX_DWORD offset = 0;\n    FX_BYTE ch;\n    while (1) {\n        if (!GetNextChar(ch)) {\n            return;\n        }\n        buffer[offset++] = ch;\n        if (offset == size) {\n            break;\n        }\n    }\n}\nCPDF_DataAvail::CPDF_DataAvail(IFX_FileAvail* pFileAvail, IFX_FileRead* pFileRead)\n{\n    m_pFileAvail = pFileAvail;\n    m_pFileRead = pFileRead;\n    m_Pos = 0;\n    m_dwFileLen = 0;\n    if (m_pFileRead) {\n        m_dwFileLen = (FX_DWORD)m_pFileRead->GetSize();\n    }\n    m_dwCurrentOffset = 0;\n    m_WordSize = 0;\n    m_dwXRefOffset = 0;\n    m_bufferOffset = 0;\n    m_dwFirstPageNo = 0;\n    m_bufferSize = 0;\n    m_PagesObjNum = 0;\n    m_dwCurrentXRefSteam = 0;\n    m_dwAcroFormObjNum = 0;\n    m_dwInfoObjNum = 0;\n    m_pDocument = 0;\n    m_dwEncryptObjNum = 0;\n    m_dwPrevXRefOffset = 0;\n    m_dwLastXRefOffset = 0;\n    m_bDocAvail = FALSE;\n    m_bMainXRefLoad = FALSE;\n    m_bDocAvail = FALSE;\n    m_bLinearized = FALSE;\n    m_bPagesLoad = FALSE;\n    m_bPagesTreeLoad = FALSE;\n    m_bMainXRefLoadedOK = FALSE;\n    m_bAnnotsLoad = FALSE;\n    m_bHaveAcroForm = FALSE;\n    m_bAcroFormLoad = FALSE;\n    m_bPageLoadedOK = FALSE;\n    m_bNeedDownLoadResource = FALSE;\n    m_bLinearizedFormParamLoad = FALSE;\n    m_pLinearized = NULL;\n    m_pRoot = NULL;\n    m_pTrailer = NULL;\n    m_pCurrentParser = NULL;\n    m_pAcroForm = NULL;\n    m_pPageDict = NULL;\n    m_pPageResource = NULL;\n    m_pageMapCheckState = NULL;\n    m_docStatus = PDF_DATAAVAIL_HEADER;\n    m_parser.m_bOwnFileRead = FALSE;\n    m_bTotalLoadPageTree = FALSE;\n    m_bCurPageDictLoadOK = FALSE;\n    m_bLinearedDataOK = FALSE;\n    m_pagesLoadState = NULL;\n}\nCPDF_DataAvail::~CPDF_DataAvail()\n{\n    if (m_pLinearized)\t{\n        m_pLinearized->Release();\n    }\n    if (m_pRoot) {\n        m_pRoot->Release();\n    }\n    if (m_pTrailer) {\n        m_pTrailer->Release();\n    }\n    if (m_pageMapCheckState) {\n        delete m_pageMapCheckState;\n    }\n    if (m_pagesLoadState) {\n        delete m_pagesLoadState;\n    }\n    FX_INT32 i = 0;\n    FX_INT32 iSize = m_arrayAcroforms.GetSize();\n    for (i = 0; i < iSize; ++i) {\n        ((CPDF_Object *)m_arrayAcroforms.GetAt(i))->Release();\n    }\n}\nvoid CPDF_DataAvail::SetDocument(CPDF_Document* pDoc)\n{\n    m_pDocument = pDoc;\n}\nFX_DWORD CPDF_DataAvail::GetObjectSize(FX_DWORD objnum, FX_FILESIZE& offset)\n{\n    CPDF_Parser *pParser = (CPDF_Parser *)(m_pDocument->GetParser());\n    if (pParser == NULL) {\n        return 0;\n    }\n    if (objnum >= (FX_DWORD)pParser->m_CrossRef.GetSize()) {\n        return 0;\n    }\n    if (pParser->m_V5Type[objnum] == 2) {\n        objnum = (FX_DWORD)pParser->m_CrossRef[objnum];\n    }\n    if (pParser->m_V5Type[objnum] == 1 || pParser->m_V5Type[objnum] == 255) {\n        offset = pParser->m_CrossRef[objnum];\n        if (offset == 0) {\n            return 0;\n        }\n        FX_LPVOID pResult = FXSYS_bsearch(&offset, pParser->m_SortedOffset.GetData(), pParser->m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);\n        if (pResult == NULL) {\n            return 0;\n        }\n        if ((FX_FILESIZE*)pResult - (FX_FILESIZE*)pParser->m_SortedOffset.GetData() == pParser->m_SortedOffset.GetSize() - 1) {\n            return 0;\n        }\n        return (FX_DWORD)(((FX_FILESIZE*)pResult)[1] - offset);\n    }\n    return 0;\n}\nFX_BOOL CPDF_DataAvail::IsObjectsAvail(CFX_PtrArray& obj_array, FX_BOOL bParsePage, IFX_DownloadHints* pHints, CFX_PtrArray &ret_array)\n{\n    if (!obj_array.GetSize()) {\n        return TRUE;\n    }\n    FX_DWORD count = 0;\n    CFX_PtrArray new_obj_array;\n    FX_INT32 i = 0;\n    for (i = 0; i < obj_array.GetSize(); i++) {\n        CPDF_Object *pObj = (CPDF_Object *)obj_array[i];\n        if (!pObj) {\n            continue;\n        }\n        FX_INT32 type = pObj->GetType();\n        switch (type) {\n            case PDFOBJ_ARRAY: {\n                    CPDF_Array *pArray = pObj->GetArray();\n                    for (FX_DWORD k = 0; k < pArray->GetCount(); k++) {\n                        new_obj_array.Add(pArray->GetElement(k));\n                    }\n                }\n                break;\n            case PDFOBJ_STREAM:\n                pObj = pObj->GetDict();\n            case PDFOBJ_DICTIONARY: {\n                    CPDF_Dictionary *pDict = pObj->GetDict();\n                    if (pDict && pDict->GetString(\"Type\") == \"Page\" && !bParsePage) {\n                        continue;\n                    }\n                    FX_POSITION pos = pDict->GetStartPos();\n                    while (pos) {\n                        CPDF_Object *value;\n                        CFX_ByteString key;\n                        value = pDict->GetNextElement(pos, key);\n                        if (key != \"Parent\") {\n                            new_obj_array.Add(value);\n                        }\n                    }\n                }\n                break;\n            case PDFOBJ_REFERENCE: {\n                    CPDF_Reference *pRef = (CPDF_Reference*)pObj;\n                    FX_DWORD dwNum = pRef->GetRefObjNum();\n                    FX_FILESIZE offset;\n                    FX_DWORD original_size = GetObjectSize(dwNum, offset);\n                    base::CheckedNumeric<FX_DWORD> size = original_size;\n                    if (size.ValueOrDefault(0) == 0 || offset < 0 || offset >= m_dwFileLen) {\n                        break;\n                    }\n\n                    size += offset;\n                    size += 512;\n                    if (!size.IsValid()) {\n                        break;\n                    }\n                    if (size.ValueOrDie() > m_dwFileLen) {\n                        size = m_dwFileLen - offset;\n                    } else {\n                        size = original_size + 512;\n                    }\n                    if (!size.IsValid()) {\n                        break;\n                    }\n                    if (!m_pFileAvail->IsDataAvail(offset, size.ValueOrDie())) {\n                        pHints->AddSegment(offset, size.ValueOrDie());\n                        ret_array.Add(pObj);\n                        count++;\n                    } else if (!m_objnum_array.Find(dwNum)) {\n                        m_objnum_array.AddObjNum(dwNum);\n                        CPDF_Object *pReferred = m_pDocument->GetIndirectObject(pRef->GetRefObjNum(), NULL);\n                        if (pReferred) {\n                            new_obj_array.Add(pReferred);\n                        }\n                    }\n                }\n                break;\n        }\n    }\n    if (count > 0) {\n        FX_INT32 iSize = new_obj_array.GetSize();\n        for (i = 0; i < iSize; ++i) {\n            CPDF_Object *pObj = (CPDF_Object *)new_obj_array[i];\n            FX_INT32 type = pObj->GetType();\n            if (type == PDFOBJ_REFERENCE) {\n                CPDF_Reference *pRef = (CPDF_Reference *)pObj;\n                FX_DWORD dwNum = pRef->GetRefObjNum();\n                if (!m_objnum_array.Find(dwNum)) {\n                    ret_array.Add(pObj);\n                }\n            } else {\n                ret_array.Add(pObj);\n            }\n        }\n        return FALSE;\n    }\n    obj_array.RemoveAll();\n    obj_array.Append(new_obj_array);\n    return IsObjectsAvail(obj_array, FALSE, pHints, ret_array);\n}\nFX_BOOL CPDF_DataAvail::IsDocAvail(IFX_DownloadHints* pHints)\n{\n    if (!m_dwFileLen && m_pFileRead) {\n        m_dwFileLen = (FX_DWORD)m_pFileRead->GetSize();\n        if (!m_dwFileLen) {\n            return TRUE;\n        }\n    }\n    while (!m_bDocAvail) {\n        if (!CheckDocStatus(pHints)) {\n            return FALSE;\n        }\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_DataAvail::CheckAcroFormSubObject(IFX_DownloadHints* pHints)\n{\n    if (!m_objs_array.GetSize()) {\n        m_objs_array.RemoveAll();\n        m_objnum_array.RemoveAll();\n        CFX_PtrArray obj_array;\n        obj_array.Append(m_arrayAcroforms);\n        FX_BOOL bRet = IsObjectsAvail(obj_array, FALSE, pHints, m_objs_array);\n        if (bRet) {\n            m_objs_array.RemoveAll();\n        }\n        return bRet;\n    } else {\n        CFX_PtrArray new_objs_array;\n        FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);\n        if (bRet) {\n            FX_INT32 iSize = m_arrayAcroforms.GetSize();\n            for (FX_INT32 i = 0; i < iSize; ++i) {\n                ((CPDF_Object *)m_arrayAcroforms.GetAt(i))->Release();\n            }\n            m_arrayAcroforms.RemoveAll();\n        } else {\n            m_objs_array.RemoveAll();\n            m_objs_array.Append(new_objs_array);\n        }\n        return bRet;\n    }\n}\nFX_BOOL CPDF_DataAvail::CheckAcroForm(IFX_DownloadHints* pHints)\n{\n    FX_BOOL bExist = FALSE;\n    m_pAcroForm = GetObject(m_dwAcroFormObjNum, pHints, &bExist);\n    if (!bExist) {\n        m_docStatus = PDF_DATAAVAIL_PAGETREE;\n        return TRUE;\n    }\n    if (!m_pAcroForm) {\n        if (m_docStatus == PDF_DATAAVAIL_ERROR) {\n            m_docStatus = PDF_DATAAVAIL_LOADALLFILE;\n            return TRUE;\n        }\n        return FALSE;\n    }\n    m_arrayAcroforms.Add(m_pAcroForm);\n    m_docStatus = PDF_DATAAVAIL_PAGETREE;\n    return TRUE;\n}\nFX_BOOL CPDF_DataAvail::CheckDocStatus(IFX_DownloadHints *pHints)\n{\n    switch (m_docStatus) {\n        case PDF_DATAAVAIL_HEADER:\n            return CheckHeader(pHints);\n        case PDF_DATAAVAIL_FIRSTPAGE:\n        case PDF_DATAAVAIL_FIRSTPAGE_PREPARE:\n            return CheckFirstPage(pHints);\n        case PDF_DATAAVAIL_END:\n            return CheckEnd(pHints);\n        case PDF_DATAAVAIL_CROSSREF:\n            return CheckCrossRef(pHints);\n        case PDF_DATAAVAIL_CROSSREF_ITEM:\n            return CheckCrossRefItem(pHints);\n        case PDF_DATAAVAIL_CROSSREF_STREAM:\n            return CheckAllCrossRefStream(pHints);\n        case PDF_DATAAVAIL_TRAILER:\n            return CheckTrailer(pHints);\n        case PDF_DATAAVAIL_TRAILER_APPEND:\n            return CheckTrailerAppend(pHints);\n        case PDF_DATAAVAIL_LOADALLCRSOSSREF:\n            return LoadAllXref(pHints);\n        case PDF_DATAAVAIL_LOADALLFILE:\n            return LoadAllFile(pHints);\n        case PDF_DATAAVAIL_ROOT:\n            return CheckRoot(pHints);\n        case PDF_DATAAVAIL_INFO:\n            return CheckInfo(pHints);\n        case PDF_DATAAVAIL_ACROFORM:\n            return CheckAcroForm(pHints);\n        case PDF_DATAAVAIL_PAGETREE:\n            if (m_bTotalLoadPageTree) {\n                return CheckPages(pHints);\n            } else {\n                return LoadDocPages(pHints);\n            }\n        case PDF_DATAAVAIL_PAGE:\n            if (m_bTotalLoadPageTree) {\n                return CheckPage(pHints);\n            } else {\n                m_docStatus = PDF_DATAAVAIL_PAGE_LATERLOAD;\n                return TRUE;\n            }\n        case PDF_DATAAVAIL_ERROR:\n            return LoadAllFile(pHints);\n        case PDF_DATAAVAIL_PAGE_LATERLOAD:\n            m_docStatus = PDF_DATAAVAIL_PAGE;\n        default:\n            m_bDocAvail = TRUE;\n            return TRUE;\n    }\n}\nFX_BOOL\tCPDF_DataAvail::CheckPageStatus(IFX_DownloadHints* pHints)\n{\n    switch (m_docStatus) {\n        case PDF_DATAAVAIL_PAGETREE:\n            return CheckPages(pHints);\n        case PDF_DATAAVAIL_PAGE:\n            return CheckPage(pHints);\n        case PDF_DATAAVAIL_ERROR:\n            return LoadAllFile(pHints);\n        default:\n            m_bPagesTreeLoad = TRUE;\n            m_bPagesLoad = TRUE;\n            return TRUE;\n    }\n}\nFX_BOOL CPDF_DataAvail::LoadAllFile(IFX_DownloadHints* pHints)\n{\n    if (m_pFileAvail->IsDataAvail(0, (FX_DWORD)m_dwFileLen)) {\n        m_docStatus = PDF_DATAAVAIL_DONE;\n        return TRUE;\n    }\n    pHints->AddSegment(0, (FX_DWORD)m_dwFileLen);\n    return FALSE;\n}\nFX_BOOL CPDF_DataAvail::LoadAllXref(IFX_DownloadHints* pHints)\n{\n    m_parser.m_Syntax.InitParser(m_pFileRead, (FX_DWORD)m_dwHeaderOffset);\n    m_parser.m_bOwnFileRead = FALSE;\n    if (!m_parser.LoadAllCrossRefV4(m_dwLastXRefOffset) && !m_parser.LoadAllCrossRefV5(m_dwLastXRefOffset)) {\n        m_docStatus = PDF_DATAAVAIL_LOADALLFILE;\n        return FALSE;\n    }\n    FXSYS_qsort(m_parser.m_SortedOffset.GetData(), m_parser.m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);\n    m_dwRootObjNum = m_parser.GetRootObjNum();\n    m_dwInfoObjNum = m_parser.GetInfoObjNum();\n    m_pCurrentParser = &m_parser;\n    m_docStatus = PDF_DATAAVAIL_ROOT;\n    return TRUE;\n}\nCPDF_Object* CPDF_DataAvail::GetObject(FX_DWORD objnum, IFX_DownloadHints* pHints, FX_BOOL *pExistInFile)\n{\n    CPDF_Object *pRet = NULL;\n    if (pExistInFile) {\n        *pExistInFile = TRUE;\n    }\n    if (m_pDocument == NULL) {\n        FX_FILESIZE offset = m_parser.GetObjectOffset(objnum);\n        if (offset < 0) {\n            *pExistInFile = FALSE;\n            return NULL;\n        }\n        FX_DWORD size = (FX_DWORD)m_parser.GetObjectSize(objnum);\n        size = (FX_DWORD)(((FX_FILESIZE)(offset + size + 512)) > m_dwFileLen ? m_dwFileLen - offset : size + 512);\n        if (!m_pFileAvail->IsDataAvail(offset, size)) {\n            pHints->AddSegment(offset, size);\n            return NULL;\n        }\n        pRet = m_parser.ParseIndirectObject(NULL, objnum);\n        if (!pRet && pExistInFile) {\n            *pExistInFile = FALSE;\n        }\n        return pRet;\n    }\n    FX_FILESIZE offset = 0;\n    FX_DWORD size = GetObjectSize(objnum, offset);\n    size = (FX_DWORD)((FX_FILESIZE)(offset + size + 512) > m_dwFileLen ? m_dwFileLen - offset : size + 512);\n    if (!m_pFileAvail->IsDataAvail(offset, size)) {\n        pHints->AddSegment(offset, size);\n        return NULL;\n    }\n    CPDF_Parser *pParser = (CPDF_Parser *)(m_pDocument->GetParser());\n    pRet = pParser->ParseIndirectObject(NULL, objnum, NULL);\n    if (!pRet && pExistInFile) {\n        *pExistInFile = FALSE;\n    }\n    return pRet;\n}\nFX_BOOL CPDF_DataAvail::CheckInfo(IFX_DownloadHints* pHints)\n{\n    FX_BOOL bExist = FALSE;\n    CPDF_Object *pInfo = GetObject(m_dwInfoObjNum, pHints, &bExist);\n    if (!bExist) {\n        if (m_bHaveAcroForm) {\n            m_docStatus = PDF_DATAAVAIL_ACROFORM;\n        } else {\n            m_docStatus = PDF_DATAAVAIL_PAGETREE;\n        }\n        return TRUE;\n    }\n    if (!pInfo) {\n        if (m_docStatus == PDF_DATAAVAIL_ERROR) {\n            m_docStatus = PDF_DATAAVAIL_LOADALLFILE;\n            return TRUE;\n        }\n        if (m_Pos == m_dwFileLen) {\n            m_docStatus = PDF_DATAAVAIL_ERROR;\n        }\n        return FALSE;\n    }\n    if (pInfo) {\n        pInfo->Release();\n    }\n    if (m_bHaveAcroForm) {\n        m_docStatus = PDF_DATAAVAIL_ACROFORM;\n    } else {\n        m_docStatus = PDF_DATAAVAIL_PAGETREE;\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_DataAvail::CheckRoot(IFX_DownloadHints* pHints)\n{\n    FX_BOOL bExist = FALSE;\n    m_pRoot = GetObject(m_dwRootObjNum, pHints, &bExist);\n    if (!bExist) {\n        m_docStatus = PDF_DATAAVAIL_LOADALLFILE;\n        return TRUE;\n    }\n    if (!m_pRoot) {\n        if (m_docStatus == PDF_DATAAVAIL_ERROR) {\n            m_docStatus = PDF_DATAAVAIL_LOADALLFILE;\n            return TRUE;\n        }\n        return FALSE;\n    }\n    CPDF_Reference* pRef = (CPDF_Reference*)m_pRoot->GetDict()->GetElement(FX_BSTRC(\"Pages\"));\n    if (pRef == NULL || pRef->GetType() != PDFOBJ_REFERENCE) {\n        m_docStatus = PDF_DATAAVAIL_ERROR;\n        return FALSE;\n    }\n    m_PagesObjNum = pRef->GetRefObjNum();\n    CPDF_Reference* pAcroFormRef = (CPDF_Reference*)m_pRoot->GetDict()->GetElement(FX_BSTRC(\"AcroForm\"));\n    if (pAcroFormRef && pAcroFormRef->GetType() == PDFOBJ_REFERENCE) {\n        m_bHaveAcroForm = TRUE;\n        m_dwAcroFormObjNum = pAcroFormRef->GetRefObjNum();\n    }\n    if (m_dwInfoObjNum) {\n        m_docStatus = PDF_DATAAVAIL_INFO;\n    } else {\n        if (m_bHaveAcroForm) {\n            m_docStatus = PDF_DATAAVAIL_ACROFORM;\n        } else {\n            m_docStatus = PDF_DATAAVAIL_PAGETREE;\n        }\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_DataAvail::PreparePageItem()\n{\n    CPDF_Dictionary *pRoot = m_pDocument->GetRoot();\n    CPDF_Reference* pRef = pRoot ? (CPDF_Reference*)pRoot->GetElement(FX_BSTRC(\"Pages\")) : NULL;\n    if (pRef == NULL || pRef->GetType() != PDFOBJ_REFERENCE) {\n        m_docStatus = PDF_DATAAVAIL_ERROR;\n        return FALSE;\n    }\n    m_PagesObjNum = pRef->GetRefObjNum();\n    m_pCurrentParser = (CPDF_Parser *)m_pDocument->GetParser();\n    m_docStatus = PDF_DATAAVAIL_PAGETREE;\n    return TRUE;\n}\nFX_BOOL CPDF_DataAvail::IsFirstCheck(int iPage)\n{\n    if (NULL == m_pageMapCheckState) {\n        m_pageMapCheckState = FX_NEW CFX_CMapDWordToDWord();\n    }\n    FX_DWORD dwValue = 0;\n    if (!m_pageMapCheckState->Lookup(iPage, dwValue)) {\n        m_pageMapCheckState->SetAt(iPage, 1);\n        return TRUE;\n    }\n    if (dwValue != 0) {\n        return FALSE;\n    }\n    m_pageMapCheckState->SetAt(iPage, 1);\n    return TRUE;\n}\nvoid CPDF_DataAvail::ResetFirstCheck(int iPage)\n{\n    if (NULL == m_pageMapCheckState) {\n        m_pageMapCheckState = FX_NEW CFX_CMapDWordToDWord();\n    }\n    FX_DWORD dwValue = 1;\n    if (!m_pageMapCheckState->Lookup(iPage, dwValue)) {\n        return;\n    }\n    m_pageMapCheckState->SetAt(iPage, 0);\n}\nFX_BOOL CPDF_DataAvail::CheckPage(IFX_DownloadHints* pHints)\n{\n    FX_DWORD i = 0;\n    FX_DWORD iLen = m_PageObjList.GetSize();\n    CFX_DWordArray UnavailObjList;\n    for (; i < iLen; ++i) {\n        FX_DWORD dwPageObjNum = m_PageObjList.GetAt(i);\n        FX_BOOL bExist = FALSE;\n        CPDF_Object *pObj = GetObject(dwPageObjNum, pHints, &bExist);\n        if (!pObj) {\n            if (bExist) {\n                UnavailObjList.Add(dwPageObjNum);\n            }\n            continue;\n        }\n        if (pObj->GetType() == PDFOBJ_ARRAY) {\n            CPDF_Array *pArray = pObj->GetArray();\n            if (pArray) {\n                FX_INT32 iSize = pArray->GetCount();\n                CPDF_Object *pItem = NULL;\n                for (FX_INT32 j = 0; j < iSize; ++j) {\n                    pItem = pArray->GetElement(j);\n                    if (pItem && pItem->GetType() == PDFOBJ_REFERENCE) {\n                        UnavailObjList.Add(((CPDF_Reference *)pItem)->GetRefObjNum());\n                    }\n                }\n            }\n        }\n        if (pObj->GetType() != PDFOBJ_DICTIONARY) {\n            pObj->Release();\n            continue;\n        }\n        CFX_ByteString type = pObj->GetDict()->GetString(FX_BSTRC(\"Type\"));\n        if (type == FX_BSTRC(\"Pages\")) {\n            m_PagesArray.Add(pObj);\n            continue;\n        }\n        pObj->Release();\n    }\n    m_PageObjList.RemoveAll();\n    if (UnavailObjList.GetSize()) {\n        m_PageObjList.Append(UnavailObjList);\n        return FALSE;\n    }\n    i = 0;\n    iLen = m_PagesArray.GetSize();\n    for (; i < iLen; ++i) {\n        CPDF_Object *pPages = (CPDF_Object *)m_PagesArray.GetAt(i);\n        if (!pPages) {\n            continue;\n        }\n        if (!GetPageKids(m_pCurrentParser, pPages)) {\n            pPages->Release();\n            while (i++ < iLen) {\n                pPages = (CPDF_Object *)m_PagesArray.GetAt(i);\n                pPages->Release();\n            }\n            m_PagesArray.RemoveAll();\n            m_docStatus = PDF_DATAAVAIL_ERROR;\n            return FALSE;\n        }\n        pPages->Release();\n    }\n    m_PagesArray.RemoveAll();\n    if (!m_PageObjList.GetSize()) {\n        m_docStatus = PDF_DATAAVAIL_DONE;\n        return TRUE;\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_DataAvail::GetPageKids(CPDF_Parser *pParser, CPDF_Object *pPages)\n{\n    if (!pParser) {\n        m_docStatus = PDF_DATAAVAIL_ERROR;\n        return FALSE;\n    }\n    CPDF_Dictionary* pDict = pPages->GetDict();\n    CPDF_Object *pKids = pDict ? pDict->GetElement(FX_BSTRC(\"Kids\")) : NULL;\n    if (!pKids) {\n        return TRUE;\n    }\n    switch (pKids->GetType()) {\n        case PDFOBJ_REFERENCE: {\n                CPDF_Reference *pKid = (CPDF_Reference *)pKids;\n                m_PageObjList.Add(pKid->GetRefObjNum());\n            }\n            break;\n        case PDFOBJ_ARRAY: {\n                CPDF_Array *pKidsArray = (CPDF_Array *)pKids;\n                for (FX_DWORD i = 0; i < pKidsArray->GetCount(); ++i) {\n                    CPDF_Reference *pKid = (CPDF_Reference *)pKidsArray->GetElement(i);\n                    m_PageObjList.Add(pKid->GetRefObjNum());\n                }\n            }\n            break;\n        default:\n            m_docStatus = PDF_DATAAVAIL_ERROR;\n            return FALSE;\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_DataAvail::CheckPages(IFX_DownloadHints* pHints)\n{\n    FX_BOOL bExist = FALSE;\n    CPDF_Object *pPages = GetObject(m_PagesObjNum, pHints, &bExist);\n    if (!bExist) {\n        m_docStatus = PDF_DATAAVAIL_LOADALLFILE;\n        return TRUE;\n    }\n    if (!pPages) {\n        if (m_docStatus == PDF_DATAAVAIL_ERROR) {\n            m_docStatus = PDF_DATAAVAIL_LOADALLFILE;\n            return TRUE;\n        }\n        return FALSE;\n    }\n    FX_BOOL bNeedLoad = FALSE;\n    if (!GetPageKids(m_pCurrentParser, pPages)) {\n        pPages->Release();\n        m_docStatus = PDF_DATAAVAIL_ERROR;\n        return FALSE;\n    }\n    pPages->Release();\n    m_docStatus = PDF_DATAAVAIL_PAGE;\n    return TRUE;\n}\nFX_BOOL CPDF_DataAvail::CheckHeader(IFX_DownloadHints* pHints)\n{\n    FX_DWORD req_size = 1024;\n    if ((FX_FILESIZE)req_size > m_dwFileLen) {\n        req_size = (FX_DWORD)m_dwFileLen;\n    }\n    if (m_pFileAvail->IsDataAvail(0, req_size)) {\n        FX_BYTE buffer[1024];\n        m_pFileRead->ReadBlock(buffer, 0, req_size);\n        if (IsLinearizedFile(buffer, req_size)) {\n            m_docStatus = PDF_DATAAVAIL_FIRSTPAGE;\n        } else {\n            if (m_docStatus == PDF_DATAAVAIL_ERROR) {\n                return FALSE;\n            }\n            m_docStatus = PDF_DATAAVAIL_END;\n        }\n        return TRUE;\n    }\n    pHints->AddSegment(0, req_size);\n    return FALSE;\n}\nFX_BOOL CPDF_DataAvail::CheckFirstPage(IFX_DownloadHints *pHints)\n{\n    FX_DWORD dwFirstPageEndOffset = 0;\n    CPDF_Dictionary* pDict = m_pLinearized->GetDict();\n    CPDF_Object *pEndOffSet = pDict ? pDict->GetElement(FX_BSTRC(\"E\")) : NULL;\n    if (!pEndOffSet) {\n        m_docStatus = PDF_DATAAVAIL_ERROR;\n        return FALSE;\n    }\n    CPDF_Object *pXRefOffset = pDict ? pDict->GetElement(FX_BSTRC(\"T\")) : NULL;\n    if (!pXRefOffset) {\n        m_docStatus = PDF_DATAAVAIL_ERROR;\n        return FALSE;\n    }\n    CPDF_Object *pFileLen = pDict ? pDict->GetElement(FX_BSTRC(\"L\")) : NULL;\n    if (!pFileLen) {\n        m_docStatus = PDF_DATAAVAIL_ERROR;\n        return FALSE;\n    }\n    FX_BOOL bNeedDownLoad = FALSE;\n    if (pEndOffSet->GetType() == PDFOBJ_NUMBER) {\n        FX_DWORD dwEnd = pEndOffSet->GetInteger();\n        dwEnd += 512;\n        if ((FX_FILESIZE)dwEnd > m_dwFileLen) {\n            dwEnd = (FX_DWORD)m_dwFileLen;\n        }\n        FX_INT32 iStartPos = (FX_INT32)(m_dwFileLen > 1024 ? 1024 : m_dwFileLen);\n        FX_INT32 iSize = dwEnd > 1024 ? dwEnd - 1024 : 0;\n        if (!m_pFileAvail->IsDataAvail(iStartPos, iSize)) {\n            pHints->AddSegment(iStartPos, iSize);\n            bNeedDownLoad = TRUE;\n        }\n    }\n    m_dwLastXRefOffset = 0;\n    FX_FILESIZE dwFileLen = 0;\n    if (pXRefOffset->GetType() == PDFOBJ_NUMBER) {\n        m_dwLastXRefOffset = pXRefOffset->GetInteger();\n    }\n    if (pFileLen->GetType() == PDFOBJ_NUMBER) {\n        dwFileLen = pFileLen->GetInteger();\n    }\n    if (!m_pFileAvail->IsDataAvail(m_dwLastXRefOffset, (FX_DWORD)(dwFileLen - m_dwLastXRefOffset))) {\n        if (m_docStatus == PDF_DATAAVAIL_FIRSTPAGE)\t{\n            FX_DWORD dwSize = (FX_DWORD)(dwFileLen - m_dwLastXRefOffset);\n            FX_FILESIZE offset = m_dwLastXRefOffset;\n            if (dwSize < 512 && dwFileLen > 512) {\n                dwSize = 512;\n                offset = dwFileLen - 512;\n            }\n            pHints->AddSegment(offset, dwSize);\n        }\n    } else {\n        m_docStatus = PDF_DATAAVAIL_FIRSTPAGE_PREPARE;\n    }\n    if (!bNeedDownLoad && m_docStatus == PDF_DATAAVAIL_FIRSTPAGE_PREPARE) {\n        m_docStatus = PDF_DATAAVAIL_DONE;\n        return TRUE;\n    }\n    m_docStatus = PDF_DATAAVAIL_FIRSTPAGE_PREPARE;\n    return FALSE;\n}\nCPDF_Object\t* CPDF_DataAvail::ParseIndirectObjectAt(FX_FILESIZE pos, FX_DWORD objnum)\n{\n    FX_FILESIZE SavedPos = m_syntaxParser.SavePos();\n    m_syntaxParser.RestorePos(pos);\n    FX_BOOL bIsNumber;\n    CFX_ByteString word = m_syntaxParser.GetNextWord(bIsNumber);\n    if (!bIsNumber) {\n        return NULL;\n    }\n    FX_DWORD real_objnum = FXSYS_atoi(word);\n    if (objnum && real_objnum != objnum) {\n        return NULL;\n    }\n    word = m_syntaxParser.GetNextWord(bIsNumber);\n    if (!bIsNumber) {\n        return NULL;\n    }\n    FX_DWORD gennum = FXSYS_atoi(word);\n    if (m_syntaxParser.GetKeyword() != FX_BSTRC(\"obj\")) {\n        m_syntaxParser.RestorePos(SavedPos);\n        return NULL;\n    }\n    CPDF_Object* pObj = m_syntaxParser.GetObject(NULL, objnum, gennum, 0);\n    m_syntaxParser.RestorePos(SavedPos);\n    return pObj;\n}\nFX_INT32 CPDF_DataAvail::IsLinearizedPDF()\n{\n    FX_DWORD req_size = 1024;\n    if (!m_pFileAvail->IsDataAvail(0, req_size)) {\n        return PDF_UNKNOW_LINEARIZED;\n    }\n    if (!m_pFileRead) {\n        return PDF_NOT_LINEARIZED;\n    }\n    FX_FILESIZE dwSize = m_pFileRead->GetSize();\n    if (dwSize < (FX_FILESIZE)req_size) {\n        return PDF_UNKNOW_LINEARIZED;\n    }\n    FX_BYTE buffer[1024];\n    m_pFileRead->ReadBlock(buffer, 0, req_size);\n    if (IsLinearizedFile(buffer, req_size)) {\n        return PDF_IS_LINEARIZED;\n    }\n    return PDF_NOT_LINEARIZED;\n}\nFX_BOOL CPDF_DataAvail::IsLinearizedFile(FX_LPBYTE pData, FX_DWORD dwLen)\n{\n    CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(pData, (size_t)dwLen, FALSE));\n    FX_INT32 offset = GetHeaderOffset((IFX_FileStream*)file);\n    if (offset == -1) {\n        m_docStatus = PDF_DATAAVAIL_ERROR;\n        return FALSE;\n    }\n    m_dwHeaderOffset = offset;\n    m_syntaxParser.InitParser((IFX_FileStream*)file, offset);\n    m_syntaxParser.RestorePos(m_syntaxParser.m_HeaderOffset + 9);\n    FX_BOOL bNumber = FALSE;\n    FX_FILESIZE dwSavePos = m_syntaxParser.SavePos();\n    CFX_ByteString wordObjNum = m_syntaxParser.GetNextWord(bNumber);\n    if (!bNumber) {\n        return FALSE;\n    }\n    FX_DWORD objnum = FXSYS_atoi(wordObjNum);\n    if (m_pLinearized) {\n        m_pLinearized->Release();\n        m_pLinearized = NULL;\n    }\n    m_pLinearized = ParseIndirectObjectAt(m_syntaxParser.m_HeaderOffset + 9, objnum);\n    if (!m_pLinearized) {\n        return FALSE;\n    }\n    if (m_pLinearized->GetDict() && m_pLinearized->GetDict()->GetElement(FX_BSTRC(\"Linearized\"))) {\n        CPDF_Object *pLen = m_pLinearized->GetDict()->GetElement(FX_BSTRC(\"L\"));\n        if (!pLen) {\n            return FALSE;\n        }\n        if ((FX_FILESIZE)pLen->GetInteger() != m_pFileRead->GetSize()) {\n            return FALSE;\n        }\n        m_bLinearized = TRUE;\n        CPDF_Object *pNo = m_pLinearized->GetDict()->GetElement(FX_BSTRC(\"P\"));\n        if (pNo && pNo->GetType() == PDFOBJ_NUMBER) {\n            m_dwFirstPageNo = pNo->GetInteger();\n        }\n        return TRUE;\n    }\n    return FALSE;\n}\nFX_BOOL CPDF_DataAvail::CheckEnd(IFX_DownloadHints* pHints)\n{\n    FX_DWORD req_pos = (FX_DWORD)(m_dwFileLen > 1024 ? m_dwFileLen - 1024 : 0);\n    FX_DWORD dwSize = (FX_DWORD)(m_dwFileLen - req_pos);\n    if (m_pFileAvail->IsDataAvail(req_pos, dwSize)) {\n        FX_BYTE buffer[1024];\n        m_pFileRead->ReadBlock(buffer, req_pos, dwSize);\n        CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(buffer, (size_t)dwSize, FALSE));\n        m_syntaxParser.InitParser((IFX_FileStream*)file, 0);\n        m_syntaxParser.RestorePos(dwSize - 1);\n        if (m_syntaxParser.SearchWord(FX_BSTRC(\"startxref\"), TRUE, FALSE, dwSize)) {\n            FX_BOOL bNumber;\n            m_syntaxParser.GetNextWord(bNumber);\n            CFX_ByteString xrefpos_str = m_syntaxParser.GetNextWord(bNumber);\n            if (!bNumber) {\n                m_docStatus = PDF_DATAAVAIL_ERROR;\n                return FALSE;\n            }\n            m_dwXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str);\n            if (!m_dwXRefOffset || m_dwXRefOffset > m_dwFileLen) {\n                m_docStatus = PDF_DATAAVAIL_LOADALLFILE;\n                return TRUE;\n            }\n            m_dwLastXRefOffset = m_dwXRefOffset;\n            SetStartOffset(m_dwXRefOffset);\n            m_docStatus = PDF_DATAAVAIL_CROSSREF;\n            return TRUE;\n        } else {\n            m_docStatus = PDF_DATAAVAIL_LOADALLFILE;\n            return TRUE;\n        }\n    }\n    pHints->AddSegment(req_pos, dwSize);\n    return FALSE;\n}\nFX_DWORD CPDF_DataAvail::CheckCrossRefStream(IFX_DownloadHints* pHints, FX_FILESIZE &xref_offset)\n{\n    xref_offset = 0;\n    FX_DWORD req_size = (FX_DWORD)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512);\n    if (m_pFileAvail->IsDataAvail(m_Pos, req_size)) {\n        FX_INT32 iSize = (FX_INT32)(m_Pos + req_size - m_dwCurrentXRefSteam);\n        CFX_BinaryBuf buf(iSize);\n        FX_LPBYTE pBuf = buf.GetBuffer();\n        m_pFileRead->ReadBlock(pBuf, m_dwCurrentXRefSteam, iSize);\n        CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(pBuf, (size_t)iSize, FALSE));\n        m_parser.m_Syntax.InitParser((IFX_FileStream*)file, 0);\n        FX_BOOL bNumber = FALSE;\n        FX_FILESIZE dwSavePos = m_parser.m_Syntax.SavePos();\n        CFX_ByteString objnum = m_parser.m_Syntax.GetNextWord(bNumber);\n        if (!bNumber) {\n            return -1;\n        }\n        FX_DWORD objNum = FXSYS_atoi(objnum);\n        CPDF_Object *pObj = m_parser.ParseIndirectObjectAt(NULL, 0, objNum, NULL);\n        if (!pObj) {\n            m_Pos += m_parser.m_Syntax.SavePos();\n            return 0;\n        }\n        CPDF_Dictionary* pDict = pObj->GetDict();\n        CPDF_Object *pName = pDict ? pDict->GetElement(FX_BSTRC(\"Type\")) : NULL;\n        if (pName && pName->GetType() == PDFOBJ_NAME) {\n            if (pName->GetString() == FX_BSTRC(\"XRef\")) {\n                m_Pos += m_parser.m_Syntax.SavePos();\n                xref_offset = pObj->GetDict()->GetInteger(FX_BSTRC(\"Prev\"));\n                pObj->Release();\n                return 1;\n            } else {\n                pObj->Release();\n                return -1;\n            }\n        }\n        pObj->Release();\n        return -1;\n    }\n    pHints->AddSegment(m_Pos, req_size);\n    return 0;\n}\ninline void CPDF_DataAvail::SetStartOffset(FX_FILESIZE dwOffset)\n{\n    m_Pos = dwOffset;\n}\n#define MAX_WORD_BUFFER 256\nFX_BOOL CPDF_DataAvail::GetNextToken(CFX_ByteString &token)\n{\n    m_WordSize = 0;\n    FX_BYTE ch;\n    if (!GetNextChar(ch)) {\n        return FALSE;\n    }\n    FX_BYTE type = _PDF_CharType[ch];\n    while (1) {\n        while (type == 'W') {\n            if (!GetNextChar(ch)) {\n                return FALSE;\n            }\n            type = _PDF_CharType[ch];\n        }\n        if (ch != '%') {\n            break;\n        }\n        while (1) {\n            if (!GetNextChar(ch)) {\n                return FALSE;\n            }\n            if (ch == '\\r' || ch == '\\n') {\n                break;\n            }\n        }\n        type = _PDF_CharType[ch];\n    }\n    if (type == 'D') {\n        m_WordBuffer[m_WordSize++] = ch;\n        if (ch == '/') {\n            while (1) {\n                if (!GetNextChar(ch)) {\n                    return FALSE;\n                }\n                type = _PDF_CharType[ch];\n                if (type != 'R' && type != 'N') {\n                    m_Pos --;\n                    CFX_ByteString ret(m_WordBuffer, m_WordSize);\n                    token = ret;\n                    return TRUE;\n                }\n                if (m_WordSize < MAX_WORD_BUFFER) {\n                    m_WordBuffer[m_WordSize++] = ch;\n                }\n            }\n        } else if (ch == '<') {\n            if (!GetNextChar(ch)) {\n                return FALSE;\n            }\n            if (ch == '<') {\n                m_WordBuffer[m_WordSize++] = ch;\n            } else {\n                m_Pos --;\n            }\n        } else if (ch == '>') {\n            if (!GetNextChar(ch)) {\n                return FALSE;\n            }\n            if (ch == '>') {\n                m_WordBuffer[m_WordSize++] = ch;\n            } else {\n                m_Pos --;\n            }\n        }\n        CFX_ByteString ret(m_WordBuffer, m_WordSize);\n        token = ret;\n        return TRUE;\n    }\n    while (1) {\n        if (m_WordSize < MAX_WORD_BUFFER) {\n            m_WordBuffer[m_WordSize++] = ch;\n        }\n        if (!GetNextChar(ch)) {\n            return FALSE;\n        }\n        type = _PDF_CharType[ch];\n        if (type == 'D' || type == 'W') {\n            m_Pos --;\n            break;\n        }\n    }\n    CFX_ByteString ret(m_WordBuffer, m_WordSize);\n    token = ret;\n    return TRUE;\n}\nFX_BOOL CPDF_DataAvail::GetNextChar(FX_BYTE &ch)\n{\n    FX_FILESIZE pos = m_Pos;\n    if (pos >= m_dwFileLen) {\n        return FALSE;\n    }\n    if (m_bufferOffset >= pos || (FX_FILESIZE)(m_bufferOffset + m_bufferSize) <= pos) {\n        FX_FILESIZE read_pos = pos;\n        FX_DWORD read_size = 512;\n        if ((FX_FILESIZE)read_size > m_dwFileLen) {\n            read_size = (FX_DWORD)m_dwFileLen;\n        }\n        if ((FX_FILESIZE)(read_pos + read_size) > m_dwFileLen) {\n            read_pos = m_dwFileLen - read_size;\n        }\n        if (!m_pFileRead->ReadBlock(m_bufferData, read_pos, read_size)) {\n            return FALSE;\n        }\n        m_bufferOffset = read_pos;\n        m_bufferSize = read_size;\n    }\n    ch = m_bufferData[pos - m_bufferOffset];\n    m_Pos ++;\n    return TRUE;\n}\nFX_BOOL CPDF_DataAvail::CheckCrossRefItem(IFX_DownloadHints *pHints)\n{\n    FX_INT32 iSize = 0;\n    CFX_ByteString token;\n    while (1) {\n        if (!GetNextToken(token)) {\n            iSize = (FX_INT32)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512);\n            pHints->AddSegment(m_Pos, iSize);\n            return FALSE;\n        }\n        if (token == \"trailer\") {\n            m_dwTrailerOffset = m_Pos;\n            m_docStatus = PDF_DATAAVAIL_TRAILER;\n            return TRUE;\n        }\n    }\n}\nFX_BOOL CPDF_DataAvail::CheckAllCrossRefStream(IFX_DownloadHints *pHints)\n{\n    FX_FILESIZE xref_offset = 0;\n    FX_DWORD dwRet = CheckCrossRefStream(pHints, xref_offset);\n    if (dwRet == 1) {\n        if (!xref_offset) {\n            m_docStatus = PDF_DATAAVAIL_LOADALLCRSOSSREF;\n        } else {\n            m_dwCurrentXRefSteam = xref_offset;\n            m_Pos = xref_offset;\n        }\n        return TRUE;\n    } else if (dwRet == -1) {\n        m_docStatus = PDF_DATAAVAIL_ERROR;\n    }\n    return FALSE;\n}\nFX_BOOL CPDF_DataAvail::CheckCrossRef(IFX_DownloadHints* pHints)\n{\n    FX_FILESIZE dwSavePos = m_Pos;\n    FX_INT32 iSize = 0;\n    CFX_ByteString token;\n    if (!GetNextToken(token)) {\n        iSize = (FX_INT32)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512);\n        pHints->AddSegment(m_Pos, iSize);\n        return FALSE;\n    }\n    if (token == \"xref\") {\n        m_CrossOffset.InsertAt(0, m_dwXRefOffset);\n        while (1) {\n            if (!GetNextToken(token)) {\n                iSize = (FX_INT32)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512);\n                pHints->AddSegment(m_Pos, iSize);\n                m_docStatus = PDF_DATAAVAIL_CROSSREF_ITEM;\n                return FALSE;\n            }\n            if (token == \"trailer\") {\n                m_dwTrailerOffset = m_Pos;\n                m_docStatus = PDF_DATAAVAIL_TRAILER;\n                return TRUE;\n            }\n        }\n    } else {\n        m_docStatus = PDF_DATAAVAIL_LOADALLFILE;\n        return TRUE;\n    }\n    return FALSE;\n}\nFX_BOOL CPDF_DataAvail::CheckTrailerAppend(IFX_DownloadHints* pHints)\n{\n    if (m_Pos < m_dwFileLen) {\n        FX_FILESIZE dwAppendPos = m_Pos + m_syntaxParser.SavePos();\n        FX_INT32 iSize = (FX_INT32)(dwAppendPos + 512 > m_dwFileLen ? m_dwFileLen - dwAppendPos : 512);\n        if (!m_pFileAvail->IsDataAvail(dwAppendPos, iSize)) {\n            pHints->AddSegment(dwAppendPos, iSize);\n            return FALSE;\n        }\n    }\n    if (m_dwPrevXRefOffset) {\n        SetStartOffset(m_dwPrevXRefOffset);\n        m_docStatus = PDF_DATAAVAIL_CROSSREF;\n    } else {\n        m_docStatus = PDF_DATAAVAIL_LOADALLCRSOSSREF;\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_DataAvail::CheckTrailer(IFX_DownloadHints* pHints)\n{\n    FX_INT32 iTrailerSize = (FX_INT32)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512);\n    if (m_pFileAvail->IsDataAvail(m_Pos, iTrailerSize)) {\n        FX_INT32 iSize = (FX_INT32)(m_Pos + iTrailerSize - m_dwTrailerOffset);\n        CFX_BinaryBuf buf(iSize);\n        FX_LPBYTE pBuf = buf.GetBuffer();\n        if (!pBuf) {\n            m_docStatus = PDF_DATAAVAIL_ERROR;\n            return FALSE;\n        }\n        if (!m_pFileRead->ReadBlock(pBuf, m_dwTrailerOffset, iSize)) {\n            return FALSE;\n        }\n        CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(pBuf, (size_t)iSize, FALSE));\n        m_syntaxParser.InitParser((IFX_FileStream*)file, 0);\n        CPDF_Object *pTrailer = m_syntaxParser.GetObject(NULL, 0, 0, 0);\n        if (!pTrailer) {\n            m_Pos += m_syntaxParser.SavePos();\n            pHints->AddSegment(m_Pos, iTrailerSize);\n            return FALSE;\n        }\n        CPDF_Dictionary *pTrailerDict = pTrailer->GetDict();\n        if (pTrailerDict) {\n            CPDF_Object *pEncrypt = pTrailerDict->GetElement(\"Encrypt\");\n            if (pEncrypt && pEncrypt->GetType() == PDFOBJ_REFERENCE) {\n                m_docStatus = PDF_DATAAVAIL_LOADALLFILE;\n                pTrailer->Release();\n                return TRUE;\n            }\n        }\n        FX_DWORD xrefpos = GetDirectInteger(pTrailer->GetDict(), FX_BSTRC(\"Prev\"));\n        if (xrefpos) {\n            m_dwPrevXRefOffset = GetDirectInteger(pTrailer->GetDict(), FX_BSTRC(\"XRefStm\"));\n            pTrailer->Release();\n            if (m_dwPrevXRefOffset) {\n                m_docStatus = PDF_DATAAVAIL_LOADALLFILE;\n            } else {\n                m_dwPrevXRefOffset = xrefpos;\n                if (m_dwPrevXRefOffset >= m_dwFileLen) {\n                    m_docStatus = PDF_DATAAVAIL_LOADALLFILE;\n                } else {\n                    SetStartOffset(m_dwPrevXRefOffset);\n                    m_docStatus = PDF_DATAAVAIL_TRAILER_APPEND;\n                }\n            }\n            return TRUE;\n        } else {\n            m_dwPrevXRefOffset = 0;\n            m_docStatus = PDF_DATAAVAIL_TRAILER_APPEND;\n            pTrailer->Release();\n        }\n        return TRUE;\n    }\n    pHints->AddSegment(m_Pos, iTrailerSize);\n    return FALSE;\n}\nFX_BOOL CPDF_DataAvail::CheckPage(FX_INT32 iPage, IFX_DownloadHints* pHints)\n{\n    while (TRUE) {\n        switch (m_docStatus) {\n            case PDF_DATAAVAIL_PAGETREE:\n                if (!LoadDocPages(pHints)) {\n                    return FALSE;\n                }\n                break;\n            case PDF_DATAAVAIL_PAGE:\n                if (!LoadDocPage(iPage, pHints)) {\n                    return FALSE;\n                }\n                break;\n            case PDF_DATAAVAIL_ERROR:\n                return LoadAllFile(pHints);\n            default:\n                m_bPagesTreeLoad = TRUE;\n                m_bPagesLoad = TRUE;\n                m_bCurPageDictLoadOK = TRUE;\n                m_docStatus = PDF_DATAAVAIL_PAGE;\n                return TRUE;\n        }\n    }\n}\nFX_BOOL\tCPDF_DataAvail::CheckArrayPageNode(FX_DWORD dwPageNo, CPDF_PageNode *pPageNode, IFX_DownloadHints* pHints)\n{\n    FX_BOOL bExist = FALSE;\n    CPDF_Object *pPages = GetObject(dwPageNo, pHints, &bExist);\n    if (!bExist) {\n        m_docStatus = PDF_DATAAVAIL_ERROR;\n        return FALSE;\n    }\n    if (!pPages) {\n        if (m_docStatus == PDF_DATAAVAIL_ERROR) {\n            m_docStatus = PDF_DATAAVAIL_ERROR;\n            return FALSE;\n        }\n        return FALSE;\n    }\n    if (pPages->GetType() != PDFOBJ_ARRAY) {\n        pPages->Release();\n        m_docStatus = PDF_DATAAVAIL_ERROR;\n        return FALSE;\n    }\n    pPageNode->m_type = PDF_PAGENODE_PAGES;\n    CPDF_Array* pArray = (CPDF_Array*)pPages;\n    for (FX_DWORD i = 0; i < pArray->GetCount(); ++i) {\n        CPDF_Object *pKid = (CPDF_Object *)pArray->GetElement(i);\n        if (!pKid || pKid->GetType() != PDFOBJ_REFERENCE) {\n            continue;\n        }\n        CPDF_PageNode *pNode = FX_NEW CPDF_PageNode();\n        pPageNode->m_childNode.Add(pNode);\n        pNode->m_dwPageNo = ((CPDF_Reference*)pKid)->GetRefObjNum();\n    }\n    pPages->Release();\n    return TRUE;\n}\nFX_BOOL CPDF_DataAvail::CheckUnkownPageNode(FX_DWORD dwPageNo, CPDF_PageNode *pPageNode, IFX_DownloadHints* pHints)\n{\n    FX_BOOL bExist = FALSE;\n    CPDF_Object *pPage = GetObject(dwPageNo, pHints, &bExist);\n    if (!bExist) {\n        m_docStatus = PDF_DATAAVAIL_ERROR;\n        return FALSE;\n    }\n    if (!pPage) {\n        if (m_docStatus == PDF_DATAAVAIL_ERROR) {\n            m_docStatus = PDF_DATAAVAIL_ERROR;\n            return FALSE;\n        }\n        return FALSE;\n    }\n    if (pPage->GetType() == PDFOBJ_ARRAY) {\n        pPageNode->m_dwPageNo = dwPageNo;\n        pPageNode->m_type = PDF_PAGENODE_ARRAY;\n        pPage->Release();\n        return TRUE;\n    }\n    if (pPage->GetType() != PDFOBJ_DICTIONARY) {\n        pPage->Release();\n        m_docStatus = PDF_DATAAVAIL_ERROR;\n        return FALSE;\n    }\n    pPageNode->m_dwPageNo = dwPageNo;\n    CPDF_Dictionary* pDict = pPage->GetDict();\n    CFX_ByteString type = pDict ? pDict->GetString(FX_BSTRC(\"Type\")) : CFX_ByteString();\n    if (type == FX_BSTRC(\"Pages\")) {\n        pPageNode->m_type = PDF_PAGENODE_PAGES;\n        CPDF_Object *pKids = pDict->GetElement(FX_BSTRC(\"Kids\"));\n        if (!pKids) {\n            m_docStatus = PDF_DATAAVAIL_PAGE;\n            return TRUE;\n        }\n        switch (pKids->GetType()) {\n            case PDFOBJ_REFERENCE: {\n                    CPDF_Reference *pKid = (CPDF_Reference *)pKids;\n                    CPDF_PageNode *pNode = FX_NEW CPDF_PageNode();\n                    pPageNode->m_childNode.Add(pNode);\n                    pNode->m_dwPageNo = pKid->GetRefObjNum();\n                }\n                break;\n            case PDFOBJ_ARRAY: {\n                    CPDF_Array *pKidsArray = (CPDF_Array *)pKids;\n                    for (FX_DWORD i = 0; i < pKidsArray->GetCount(); ++i) {\n                        CPDF_Object *pKid = (CPDF_Object *)pKidsArray->GetElement(i);\n                        if (!pKid || pKid->GetType() != PDFOBJ_REFERENCE) {\n                            continue;\n                        }\n                        CPDF_PageNode *pNode = FX_NEW CPDF_PageNode();\n                        pPageNode->m_childNode.Add(pNode);\n                        pNode->m_dwPageNo = ((CPDF_Reference*)pKid)->GetRefObjNum();\n                    }\n                }\n                break;\n            default:\n                break;\n        }\n    } else if (type == FX_BSTRC(\"Page\")) {\n        pPageNode->m_type = PDF_PAGENODE_PAGE;\n    } else {\n        pPage->Release();\n        m_docStatus = PDF_DATAAVAIL_ERROR;\n        return FALSE;\n    }\n    pPage->Release();\n    return TRUE;\n}\nFX_BOOL CPDF_DataAvail::CheckPageNode(CPDF_PageNode &pageNodes, FX_INT32 iPage, FX_INT32 &iCount, IFX_DownloadHints* pHints)\n{\n    FX_INT32 iSize = pageNodes.m_childNode.GetSize();\n    if (!iSize) {\n        m_docStatus = PDF_DATAAVAIL_ERROR;\n        return FALSE;\n    }\n    for (FX_INT32 i = 0; i < iSize; ++i) {\n        CPDF_PageNode *pNode = (CPDF_PageNode*)pageNodes.m_childNode.GetAt(i);\n        if (!pNode) {\n            continue;\n        }\n        switch (pNode->m_type) {\n            case PDF_PAGENODE_UNKOWN:\n                if (!CheckUnkownPageNode(pNode->m_dwPageNo, pNode, pHints)) {\n                    return FALSE;\n                }\n                --i;\n                break;\n            case PDF_PAGENODE_PAGE:\n                iCount++;\n                if (iPage == iCount && m_pDocument) {\n                    m_pDocument->m_PageList.SetAt(iPage, pNode->m_dwPageNo);\n                }\n                break;\n            case PDF_PAGENODE_PAGES:\n                if (!CheckPageNode(*pNode, iPage, iCount, pHints)) {\n                    return FALSE;\n                }\n                break;\n            case PDF_PAGENODE_ARRAY:\n                if (!CheckArrayPageNode(pNode->m_dwPageNo, pNode, pHints)) {\n                    return FALSE;\n                }\n                --i;\n                break;\n        }\n        if (iPage == iCount) {\n            m_docStatus = PDF_DATAAVAIL_DONE;\n            return TRUE;\n        }\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_DataAvail::LoadDocPage(FX_INT32 iPage, IFX_DownloadHints* pHints)\n{\n    if (m_pDocument->GetPageCount() <= iPage || m_pDocument->m_PageList.GetAt(iPage)) {\n        m_docStatus = PDF_DATAAVAIL_DONE;\n        return TRUE;\n    }\n    if (m_pageNodes.m_type == PDF_PAGENODE_PAGE) {\n        if (iPage == 0) {\n            m_docStatus = PDF_DATAAVAIL_DONE;\n            return TRUE;\n        }\n        m_docStatus = PDF_DATAAVAIL_ERROR;\n        return TRUE;\n    }\n    FX_INT32 iCount = -1;\n    return CheckPageNode(m_pageNodes, iPage, iCount, pHints);\n}\nFX_BOOL CPDF_DataAvail::CheckPageCount(IFX_DownloadHints* pHints)\n{\n    FX_BOOL bExist = FALSE;\n    CPDF_Object *pPages = GetObject(m_PagesObjNum, pHints, &bExist);\n    if (!bExist) {\n        m_docStatus = PDF_DATAAVAIL_ERROR;\n        return FALSE;\n    }\n    if (!pPages) {\n        return FALSE;\n    }\n    CPDF_Dictionary* pPagesDict = pPages->GetDict();\n    if (!pPagesDict) {\n        pPages->Release();\n        m_docStatus = PDF_DATAAVAIL_ERROR;\n        return FALSE;\n    }\n    if (!pPagesDict->KeyExist(FX_BSTRC(\"Kids\"))) {\n        pPages->Release();\n        return TRUE;\n    }\n    int count = pPagesDict->GetInteger(FX_BSTRC(\"Count\"));\n    if (count > 0) {\n        pPages->Release();\n        return TRUE;\n    }\n    pPages->Release();\n    return FALSE;\n}\nFX_BOOL CPDF_DataAvail::LoadDocPages(IFX_DownloadHints* pHints)\n{\n    if (!CheckUnkownPageNode(m_PagesObjNum, &m_pageNodes, pHints)) {\n        return FALSE;\n    }\n    if (CheckPageCount(pHints)) {\n        m_docStatus = PDF_DATAAVAIL_PAGE;\n        return TRUE;\n    } else {\n        m_bTotalLoadPageTree = TRUE;\n    }\n    return FALSE;\n}\nFX_BOOL CPDF_DataAvail::LoadPages(IFX_DownloadHints* pHints)\n{\n    while (!m_bPagesTreeLoad) {\n        if (!CheckPageStatus(pHints)) {\n            return FALSE;\n        }\n    }\n    if (m_bPagesLoad) {\n        return TRUE;\n    }\n    m_pDocument->LoadPages();\n    return FALSE;\n}\nFX_BOOL CPDF_DataAvail::CheckLinearizedData(IFX_DownloadHints* pHints)\n{\n    if (m_bLinearedDataOK) {\n        return TRUE;\n    }\n    if (!m_pFileAvail->IsDataAvail(m_dwLastXRefOffset, (FX_DWORD)(m_dwFileLen - m_dwLastXRefOffset))) {\n        pHints->AddSegment(m_dwLastXRefOffset, (FX_DWORD)(m_dwFileLen - m_dwLastXRefOffset));\n        return FALSE;\n    }\n    FX_DWORD dwRet = 0;\n    if (!m_bMainXRefLoad) {\n        dwRet = ((CPDF_Parser *)m_pDocument->GetParser())->LoadLinearizedMainXRefTable();\n        if (dwRet == PDFPARSE_ERROR_SUCCESS) {\n            if (!PreparePageItem()) {\n                return FALSE;\n            }\n            m_bMainXRefLoadedOK = TRUE;\n        }\n        m_bMainXRefLoad = TRUE;\n    }\n    m_bLinearedDataOK = TRUE;\n    return TRUE;\n}\nFX_BOOL CPDF_DataAvail::CheckPageAnnots(FX_INT32 iPage, IFX_DownloadHints* pHints)\n{\n    if (!m_objs_array.GetSize()) {\n        m_objs_array.RemoveAll();\n        m_objnum_array.RemoveAll();\n        CPDF_Dictionary *pPageDict = m_pDocument->GetPage(iPage);\n        if (!pPageDict) {\n            return TRUE;\n        }\n        CPDF_Object *pAnnots = pPageDict->GetElement(FX_BSTRC(\"Annots\"));\n        if (!pAnnots) {\n            return TRUE;\n        }\n        CFX_PtrArray obj_array;\n        obj_array.Add(pAnnots);\n        FX_BOOL bRet = IsObjectsAvail(obj_array, FALSE, pHints, m_objs_array);\n        if (bRet) {\n            m_objs_array.RemoveAll();\n        }\n        return bRet;\n    } else {\n        CFX_PtrArray new_objs_array;\n        FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);\n        m_objs_array.RemoveAll();\n        if (!bRet) {\n            m_objs_array.Append(new_objs_array);\n        }\n        return bRet;\n    }\n}\nFX_BOOL CPDF_DataAvail::CheckLinearizedFirstPage(FX_INT32 iPage, IFX_DownloadHints* pHints)\n{\n    if (!m_bAnnotsLoad) {\n        if (!CheckPageAnnots(iPage, pHints)) {\n            return FALSE;\n        }\n        m_bAnnotsLoad = TRUE;\n    }\n    if (m_bAnnotsLoad)\n        if (!CheckLinearizedData(pHints)) {\n            return FALSE;\n        }\n    m_bPageLoadedOK = FALSE;\n    return TRUE;\n}\nFX_BOOL CPDF_DataAvail::HaveResourceAncestor(CPDF_Dictionary *pDict)\n{\n    CPDF_Object *pParent = pDict->GetElement(\"Parent\");\n    if (!pParent) {\n        return FALSE;\n    }\n    CPDF_Dictionary *pParentDict = pParent->GetDict();\n    if (!pParentDict) {\n        return FALSE;\n    }\n    CPDF_Object *pRet = pParentDict->GetElement(\"Resource\");\n    if (pRet) {\n        m_pPageResource = pRet;\n        return TRUE;\n    } else {\n        return HaveResourceAncestor(pParentDict);\n    }\n}\nFX_BOOL CPDF_DataAvail::IsPageAvail(FX_INT32 iPage, IFX_DownloadHints* pHints)\n{\n    if (!m_pDocument) {\n        return FALSE;\n    }\n    if (IsFirstCheck(iPage)) {\n        m_bCurPageDictLoadOK = FALSE;\n        m_bPageLoadedOK = FALSE;\n        m_bAnnotsLoad = FALSE;\n        m_bNeedDownLoadResource = FALSE;\n        m_objs_array.RemoveAll();\n        m_objnum_array.RemoveAll();\n    }\n    if (m_pagesLoadState == NULL) {\n        m_pagesLoadState = FX_NEW CFX_CMapDWordToDWord();\n    }\n    FX_DWORD dwPageLoad = 0;\n    if (m_pagesLoadState->Lookup(iPage, dwPageLoad) && dwPageLoad != 0) {\n        return TRUE;\n    }\n    if (m_bLinearized) {\n        if ((FX_DWORD)iPage == m_dwFirstPageNo) {\n            m_pagesLoadState->SetAt(iPage, TRUE);\n            return TRUE;\n        }\n        if (!CheckLinearizedData(pHints)) {\n            return FALSE;\n        }\n        if (m_bMainXRefLoadedOK) {\n            if (m_bTotalLoadPageTree) {\n                if (!LoadPages(pHints)) {\n                    return FALSE;\n                }\n            } else {\n                if (!m_bCurPageDictLoadOK && !CheckPage(iPage, pHints)) {\n                    return FALSE;\n                }\n            }\n        } else {\n            if (!LoadAllFile(pHints)) {\n                return FALSE;\n            }\n            ((CPDF_Parser *)m_pDocument->GetParser())->RebuildCrossRef();\n            ResetFirstCheck(iPage);\n            return TRUE;\n        }\n    } else {\n        if (!m_bTotalLoadPageTree) {\n            if (!m_bCurPageDictLoadOK && !CheckPage(iPage, pHints)) {\n                return FALSE;\n            }\n        }\n    }\n    if (m_bHaveAcroForm && !m_bAcroFormLoad) {\n        if (!CheckAcroFormSubObject(pHints)) {\n            return FALSE;\n        }\n        m_bAcroFormLoad = TRUE;\n    }\n    if (!m_bPageLoadedOK) {\n        if (!m_objs_array.GetSize()) {\n            m_objs_array.RemoveAll();\n            m_objnum_array.RemoveAll();\n            m_pPageDict = m_pDocument->GetPage(iPage);\n            if (!m_pPageDict) {\n                ResetFirstCheck(iPage);\n                return TRUE;\n            }\n            CFX_PtrArray obj_array;\n            obj_array.Add(m_pPageDict);\n            FX_BOOL bRet = IsObjectsAvail(obj_array, TRUE, pHints, m_objs_array);\n            if (bRet) {\n                m_objs_array.RemoveAll();\n                m_bPageLoadedOK = TRUE;\n            } else {\n                return bRet;\n            }\n        } else {\n            CFX_PtrArray new_objs_array;\n            FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);\n            m_objs_array.RemoveAll();\n            if (bRet) {\n                m_bPageLoadedOK = TRUE;\n            } else {\n                m_objs_array.Append(new_objs_array);\n                return bRet;\n            }\n        }\n    }\n    if (m_bPageLoadedOK) {\n        if (!m_bAnnotsLoad) {\n            if (!CheckPageAnnots(iPage, pHints)) {\n                return FALSE;\n            }\n            m_bAnnotsLoad = TRUE;\n        }\n    }\n    if (m_pPageDict && !m_bNeedDownLoadResource) {\n        CPDF_Object *pRes = m_pPageDict->GetElement(\"Resource\");\n        if (!pRes) {\n            m_bNeedDownLoadResource = HaveResourceAncestor(m_pPageDict);\n        }\n        m_bNeedDownLoadResource = FALSE;\n    }\n    if (m_bNeedDownLoadResource) {\n        FX_BOOL bRet = CheckResources(pHints);\n        if (!bRet) {\n            return FALSE;\n        }\n        m_bNeedDownLoadResource = FALSE;\n    }\n    m_bPageLoadedOK = FALSE;\n    m_bAnnotsLoad = FALSE;\n    m_bCurPageDictLoadOK = FALSE;\n    ResetFirstCheck(iPage);\n    m_pagesLoadState->SetAt(iPage, TRUE);\n    return TRUE;\n}\nFX_BOOL CPDF_DataAvail::CheckResources(IFX_DownloadHints* pHints)\n{\n    if (!m_objs_array.GetSize()) {\n        m_objs_array.RemoveAll();\n        CFX_PtrArray obj_array;\n        obj_array.Add(m_pPageResource);\n        FX_BOOL bRet = IsObjectsAvail(obj_array, TRUE, pHints, m_objs_array);\n        if (bRet) {\n            m_objs_array.RemoveAll();\n        }\n        return bRet;\n    } else {\n        CFX_PtrArray new_objs_array;\n        FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);\n        m_objs_array.RemoveAll();\n        if (!bRet) {\n            m_objs_array.Append(new_objs_array);\n        }\n        return bRet;\n    }\n}\nvoid CPDF_DataAvail::GetLinearizedMainXRefInfo(FX_FILESIZE *pPos, FX_DWORD *pSize)\n{\n    if (pPos) {\n        *pPos = m_dwLastXRefOffset;\n    }\n    if (pSize) {\n        *pSize = (FX_DWORD)(m_dwFileLen - m_dwLastXRefOffset);\n    }\n}\nFX_INT32 CPDF_DataAvail::IsFormAvail(IFX_DownloadHints *pHints)\n{\n    if (!m_pDocument) {\n        return PDFFORM_AVAIL;\n    }\n    if (!m_bLinearizedFormParamLoad) {\n        CPDF_Dictionary *pRoot = m_pDocument->GetRoot();\n        if (!pRoot) {\n            return PDFFORM_AVAIL;\n        }\n        CPDF_Object *pAcroForm = pRoot->GetElement(FX_BSTRC(\"AcroForm\"));\n        if (!pAcroForm) {\n            return PDFFORM_NOTEXIST;\n        }\n        if (!m_bMainXRefLoad && !CheckLinearizedData(pHints)) {\n            return PDFFORM_NOTAVAIL;\n        }\n        if (!m_objs_array.GetSize()) {\n            m_objs_array.Add(pAcroForm->GetDict());\n        }\n        m_bLinearizedFormParamLoad = TRUE;\n    }\n    CFX_PtrArray new_objs_array;\n    FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);\n    m_objs_array.RemoveAll();\n    if (!bRet) {\n        m_objs_array.Append(new_objs_array);\n        return PDFFORM_NOTAVAIL;\n    }\n    return PDFFORM_AVAIL;\n}\nvoid CPDF_SortObjNumArray::AddObjNum(FX_DWORD dwObjNum)\n{\n    FX_INT32 iNext = 0;\n    if (BinarySearch(dwObjNum, iNext)) {\n        return;\n    }\n    m_number_array.InsertAt(iNext, dwObjNum);\n}\nFX_BOOL CPDF_SortObjNumArray::Find(FX_DWORD dwObjNum)\n{\n    FX_INT32 iNext = 0;\n    return BinarySearch(dwObjNum, iNext);\n}\nFX_BOOL CPDF_SortObjNumArray::BinarySearch(FX_DWORD value, FX_INT32 &iNext)\n{\n    FX_INT32 iLen = m_number_array.GetSize();\n    FX_INT32 iLow = 0;\n    FX_INT32 iHigh = iLen - 1;\n    FX_INT32 iMid = 0;\n    while (iLow <= iHigh) {\n        iMid = (iLow + iHigh) / 2;\n        FX_DWORD tt = m_number_array.GetAt(iMid);\n        if (m_number_array.GetAt(iMid) == value) {\n            iNext = iMid;\n            return TRUE;\n        } else if (m_number_array.GetAt(iMid) > value) {\n            iHigh = iMid - 1;\n        } else if (m_number_array.GetAt(iMid) < value) {\n            iLow = iMid + 1;\n        }\n    }\n    iNext = iLow;\n    return FALSE;\n}\nCPDF_PageNode::~CPDF_PageNode()\n{\n    FX_INT32 iSize = m_childNode.GetSize();\n    for (FX_INT32 i = 0; i < iSize; ++i) {\n        CPDF_PageNode *pNode = (CPDF_PageNode*)m_childNode[i];\n        if (pNode) {\n            delete pNode;\n        }\n    }\n    m_childNode.RemoveAll();\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_parser.h\"\nextern const FX_LPCSTR _PDF_CharType =\n    \"WRRRRRRRRWWRWWRRRRRRRRRRRRRRRRRR\"\n    \"WRRRRDRRDDRNRNNDNNNNNNNNNNRRDRDR\"\n    \"RRRRRRRRRRRRRRRRRRRRRRRRRRRDRDRR\"\n    \"RRRRRRRRRRRRRRRRRRRRRRRRRRRDRDRR\"\n    \"WRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR\"\n    \"RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR\"\n    \"RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR\"\n    \"RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRW\";\n#ifndef MAX_PATH\n#define MAX_PATH 4096\n#endif\nCPDF_SimpleParser::CPDF_SimpleParser(FX_LPCBYTE pData, FX_DWORD dwSize)\n{\n    m_pData = pData;\n    m_dwSize = dwSize;\n    m_dwCurPos = 0;\n}\nCPDF_SimpleParser::CPDF_SimpleParser(FX_BSTR str)\n{\n    m_pData = str;\n    m_dwSize = str.GetLength();\n    m_dwCurPos = 0;\n}\nvoid CPDF_SimpleParser::ParseWord(FX_LPCBYTE& pStart, FX_DWORD& dwSize, int& type)\n{\n    pStart = NULL;\n    dwSize = 0;\n    type = PDFWORD_EOF;\n    FX_BYTE ch;\n    char chartype;\n    while (1) {\n        if (m_dwSize <= m_dwCurPos) {\n            return;\n        }\n        ch = m_pData[m_dwCurPos++];\n        chartype = _PDF_CharType[ch];\n        while (chartype == 'W') {\n            if (m_dwSize <= m_dwCurPos) {\n                return;\n            }\n            ch = m_pData[m_dwCurPos++];\n            chartype = _PDF_CharType[ch];\n        }\n        if (ch != '%') {\n            break;\n        }\n        while (1) {\n            if (m_dwSize <= m_dwCurPos) {\n                return;\n            }\n            ch = m_pData[m_dwCurPos++];\n            if (ch == '\\r' || ch == '\\n') {\n                break;\n            }\n        }\n        chartype = _PDF_CharType[ch];\n    }\n    FX_DWORD start_pos = m_dwCurPos - 1;\n    pStart = m_pData + start_pos;\n    if (chartype == 'D') {\n        if (ch == '/') {\n            while (1) {\n                if (m_dwSize <= m_dwCurPos) {\n                    return;\n                }\n                ch = m_pData[m_dwCurPos++];\n                chartype = _PDF_CharType[ch];\n                if (chartype != 'R' && chartype != 'N') {\n                    m_dwCurPos --;\n                    dwSize = m_dwCurPos - start_pos;\n                    type = PDFWORD_NAME;\n                    return;\n                }\n            }\n        } else {\n            type = PDFWORD_DELIMITER;\n            dwSize = 1;\n            if (ch == '<') {\n                if (m_dwSize <= m_dwCurPos) {\n                    return;\n                }\n                ch = m_pData[m_dwCurPos++];\n                if (ch == '<') {\n                    dwSize = 2;\n                } else {\n                    m_dwCurPos --;\n                }\n            } else if (ch == '>') {\n                if (m_dwSize <= m_dwCurPos) {\n                    return;\n                }\n                ch = m_pData[m_dwCurPos++];\n                if (ch == '>') {\n                    dwSize = 2;\n                } else {\n                    m_dwCurPos --;\n                }\n            }\n        }\n        return;\n    }\n    type = PDFWORD_NUMBER;\n    dwSize = 1;\n    while (1) {\n        if (chartype != 'N') {\n            type = PDFWORD_TEXT;\n        }\n        if (m_dwSize <= m_dwCurPos) {\n            return;\n        }\n        ch = m_pData[m_dwCurPos++];\n        chartype = _PDF_CharType[ch];\n        if (chartype == 'D' || chartype == 'W') {\n            m_dwCurPos --;\n            break;\n        }\n        dwSize ++;\n    }\n}\nCFX_ByteStringC CPDF_SimpleParser::GetWord()\n{\n    FX_LPCBYTE pStart;\n    FX_DWORD dwSize;\n    int type;\n    ParseWord(pStart, dwSize, type);\n    if (dwSize == 1 && pStart[0] == '<') {\n        while (m_dwCurPos < m_dwSize && m_pData[m_dwCurPos] != '>') {\n            m_dwCurPos ++;\n        }\n        if (m_dwCurPos < m_dwSize) {\n            m_dwCurPos ++;\n        }\n        return CFX_ByteStringC(pStart, (FX_STRSIZE)(m_dwCurPos - (pStart - m_pData)));\n    } else if (dwSize == 1 && pStart[0] == '(') {\n        int level = 1;\n        while (m_dwCurPos < m_dwSize) {\n            if (m_pData[m_dwCurPos] == ')') {\n                level --;\n                if (level == 0) {\n                    break;\n                }\n            }\n            if (m_pData[m_dwCurPos] == '\\\\') {\n                if (m_dwSize <= m_dwCurPos) {\n                    break;\n                }\n                m_dwCurPos ++;\n            } else if (m_pData[m_dwCurPos] == '(') {\n                level ++;\n            }\n            if (m_dwSize <= m_dwCurPos) {\n                break;\n            }\n            m_dwCurPos ++;\n        }\n        if (m_dwCurPos < m_dwSize) {\n            m_dwCurPos ++;\n        }\n        return CFX_ByteStringC(pStart, (FX_STRSIZE)(m_dwCurPos - (pStart - m_pData)));\n    }\n    return CFX_ByteStringC(pStart, dwSize);\n}\nFX_BOOL CPDF_SimpleParser::SearchToken(FX_BSTR token)\n{\n    int token_len = token.GetLength();\n    while (m_dwCurPos < m_dwSize - token_len) {\n        if (FXSYS_memcmp32(m_pData + m_dwCurPos, token, token_len) == 0) {\n            break;\n        }\n        m_dwCurPos ++;\n    }\n    if (m_dwCurPos == m_dwSize - token_len) {\n        return FALSE;\n    }\n    m_dwCurPos += token_len;\n    return TRUE;\n}\nFX_BOOL CPDF_SimpleParser::SkipWord(FX_BSTR token)\n{\n    while (1) {\n        CFX_ByteStringC word = GetWord();\n        if (word.IsEmpty()) {\n            return FALSE;\n        }\n        if (word == token) {\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nFX_BOOL CPDF_SimpleParser::FindTagPair(FX_BSTR start_token, FX_BSTR end_token,\n                                       FX_DWORD& start_pos, FX_DWORD& end_pos)\n{\n    if (!start_token.IsEmpty()) {\n        if (!SkipWord(start_token)) {\n            return FALSE;\n        }\n        start_pos = m_dwCurPos;\n    }\n    while (1) {\n        end_pos = m_dwCurPos;\n        CFX_ByteStringC word = GetWord();\n        if (word.IsEmpty()) {\n            return FALSE;\n        }\n        if (word == end_token) {\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nFX_BOOL CPDF_SimpleParser::FindTagParam(FX_BSTR token, int nParams)\n{\n    nParams ++;\n    FX_DWORD* pBuf = FX_Alloc(FX_DWORD, nParams);\n    int buf_index = 0;\n    int buf_count = 0;\n    while (1) {\n        pBuf[buf_index++] = m_dwCurPos;\n        if (buf_index == nParams) {\n            buf_index = 0;\n        }\n        buf_count ++;\n        if (buf_count > nParams) {\n            buf_count = nParams;\n        }\n        CFX_ByteStringC word = GetWord();\n        if (word.IsEmpty()) {\n            FX_Free(pBuf);\n            return FALSE;\n        }\n        if (word == token) {\n            if (buf_count < nParams) {\n                continue;\n            }\n            m_dwCurPos = pBuf[buf_index];\n            FX_Free(pBuf);\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nstatic int _hex2dec(char ch)\n{\n    if (ch >= '0' && ch <= '9') {\n        return ch - '0';\n    }\n    if (ch >= 'a' && ch <= 'f') {\n        return ch - 'a' + 10;\n    }\n    if (ch >= 'A' && ch <= 'F') {\n        return ch - 'A' + 10;\n    }\n    return 0;\n}\nCFX_ByteString PDF_NameDecode(FX_BSTR bstr)\n{\n    int size = bstr.GetLength();\n    FX_LPCSTR pSrc = bstr.GetCStr();\n    if (FXSYS_memchr(pSrc, '#', size) == NULL) {\n        return bstr;\n    }\n    CFX_ByteString result;\n    FX_LPSTR pDestStart = result.GetBuffer(size);\n    FX_LPSTR pDest = pDestStart;\n    for (int i = 0; i < size; i ++) {\n        if (pSrc[i] == '#' && i < size - 2) {\n            *pDest ++ = _hex2dec(pSrc[i + 1]) * 16 + _hex2dec(pSrc[i + 2]);\n            i += 2;\n        } else {\n            *pDest ++ = pSrc[i];\n        }\n    }\n    result.ReleaseBuffer((FX_STRSIZE)(pDest - pDestStart));\n    return result;\n}\nCFX_ByteString PDF_NameDecode(const CFX_ByteString& orig)\n{\n    if (FXSYS_memchr((FX_LPCSTR)orig, '#', orig.GetLength()) == NULL) {\n        return orig;\n    }\n    return PDF_NameDecode(CFX_ByteStringC(orig));\n}\nCFX_ByteString PDF_NameEncode(const CFX_ByteString& orig)\n{\n    FX_LPBYTE src_buf = (FX_LPBYTE)(FX_LPCSTR)orig;\n    int src_len = orig.GetLength();\n    int dest_len = 0;\n    int i;\n    for (i = 0; i < src_len; i ++) {\n        FX_BYTE ch = src_buf[i];\n        if (ch >= 0x80 || _PDF_CharType[ch] == 'W' || ch == '#' ||\n                _PDF_CharType[ch] == 'D') {\n            dest_len += 3;\n        } else {\n            dest_len ++;\n        }\n    }\n    if (dest_len == src_len) {\n        return orig;\n    }\n    CFX_ByteString res;\n    FX_LPSTR dest_buf = res.GetBuffer(dest_len);\n    dest_len = 0;\n    for (i = 0; i < src_len; i ++) {\n        FX_BYTE ch = src_buf[i];\n        if (ch >= 0x80 || _PDF_CharType[ch] == 'W' || ch == '#' ||\n                _PDF_CharType[ch] == 'D') {\n            dest_buf[dest_len++] = '#';\n            dest_buf[dest_len++] = \"0123456789ABCDEF\"[ch / 16];\n            dest_buf[dest_len++] = \"0123456789ABCDEF\"[ch % 16];\n        } else {\n            dest_buf[dest_len++] = ch;\n        }\n    }\n    dest_buf[dest_len] = 0;\n    res.ReleaseBuffer();\n    return res;\n}\nCFX_ByteTextBuf& operator << (CFX_ByteTextBuf& buf, const CPDF_Object* pObj)\n{\n    if (pObj == NULL) {\n        buf << FX_BSTRC(\" null\");\n        return buf;\n    }\n    switch (pObj->GetType()) {\n        case PDFOBJ_NULL:\n            buf << FX_BSTRC(\" null\");\n            break;\n        case PDFOBJ_BOOLEAN:\n        case PDFOBJ_NUMBER:\n            buf << \" \" << pObj->GetString();\n            break;\n        case PDFOBJ_STRING: {\n                CFX_ByteString str = pObj->GetString();\n                FX_BOOL bHex = ((CPDF_String*)pObj)->IsHex();\n                buf << PDF_EncodeString(str, bHex);\n                break;\n            }\n        case PDFOBJ_NAME: {\n                CFX_ByteString str = pObj->GetString();\n                buf << FX_BSTRC(\"/\") << PDF_NameEncode(str);\n                break;\n            }\n        case PDFOBJ_REFERENCE: {\n                CPDF_Reference* p = (CPDF_Reference*)pObj;\n                buf << \" \" << p->GetRefObjNum() << FX_BSTRC(\" 0 R \");\n                break;\n            }\n        case PDFOBJ_ARRAY: {\n                CPDF_Array* p = (CPDF_Array*)pObj;\n                buf << FX_BSTRC(\"[\");\n                for (FX_DWORD i = 0; i < p->GetCount(); i ++) {\n                    CPDF_Object* pElement = p->GetElement(i);\n                    if (pElement->GetObjNum()) {\n                        buf << \" \" << pElement->GetObjNum() << FX_BSTRC(\" 0 R\");\n                    } else {\n                        buf << pElement;\n                    }\n                }\n                buf << FX_BSTRC(\"]\");\n                break;\n            }\n        case PDFOBJ_DICTIONARY: {\n                CPDF_Dictionary* p = (CPDF_Dictionary*)pObj;\n                buf << FX_BSTRC(\"<<\");\n                FX_POSITION pos = p->GetStartPos();\n                while (pos) {\n                    CFX_ByteString key;\n                    CPDF_Object* pValue = p->GetNextElement(pos, key);\n                    buf << FX_BSTRC(\"/\") << PDF_NameEncode(key);\n                    if (pValue->GetObjNum()) {\n                        buf << \" \" << pValue->GetObjNum() << FX_BSTRC(\" 0 R \");\n                    } else {\n                        buf << pValue;\n                    }\n                }\n                buf << FX_BSTRC(\">>\");\n                break;\n            }\n        case PDFOBJ_STREAM: {\n                CPDF_Stream* p = (CPDF_Stream*)pObj;\n                buf << p->GetDict() << FX_BSTRC(\"stream\\r\\n\");\n                CPDF_StreamAcc acc;\n                acc.LoadAllData(p, TRUE);\n                buf.AppendBlock(acc.GetData(), acc.GetSize());\n                buf << FX_BSTRC(\"\\r\\nendstream\");\n                break;\n            }\n        default:\n            ASSERT(FALSE);\n            break;\n    }\n    return buf;\n}\nFX_FLOAT PDF_ClipFloat(FX_FLOAT f)\n{\n    if (f < 0) {\n        return 0;\n    }\n    if (f > 1.0f) {\n        return 1.0f;\n    }\n    return f;\n}\nstatic CPDF_Object* SearchNumberNode(CPDF_Dictionary* pNode, int num)\n{\n    CPDF_Array* pLimits = pNode->GetArray(\"Limits\");\n    if (pLimits && (num < pLimits->GetInteger(0) || num > pLimits->GetInteger(1))) {\n        return NULL;\n    }\n    CPDF_Array* pNumbers = pNode->GetArray(\"Nums\");\n    if (pNumbers) {\n        FX_DWORD dwCount = pNumbers->GetCount() / 2;\n        for (FX_DWORD i = 0; i < dwCount; i ++) {\n            int index = pNumbers->GetInteger(i * 2);\n            if (num == index) {\n                return pNumbers->GetElementValue(i * 2 + 1);\n            }\n            if (index > num) {\n                break;\n            }\n        }\n        return NULL;\n    }\n    CPDF_Array* pKids = pNode->GetArray(\"Kids\");\n    if (pKids == NULL) {\n        return NULL;\n    }\n    for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {\n        CPDF_Dictionary* pKid = pKids->GetDict(i);\n        if (pKid == NULL) {\n            continue;\n        }\n        CPDF_Object* pFound = SearchNumberNode(pKid, num);\n        if (pFound) {\n            return pFound;\n        }\n    }\n    return NULL;\n}\nCPDF_Object* CPDF_NumberTree::LookupValue(int num)\n{\n    return SearchNumberNode(m_pRoot, num);\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_render/fpdf_render.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_render.h\"\n#include \"../../../include/fpdfapi/fpdf_module.h\"\n#include \"../fpdf_page/pageint.h\"\n#include \"../../../include/fxge/fx_ge.h\"\n#include \"../../../include/fxcodec/fx_codec.h\"\n#include \"render_int.h\"\nCPDF_DocRenderData::CPDF_DocRenderData(CPDF_Document* pPDFDoc)\n    : m_pPDFDoc(pPDFDoc)\n    , m_pFontCache(NULL)\n{\n}\nCPDF_DocRenderData::~CPDF_DocRenderData()\n{\n    Clear(TRUE);\n}\nvoid CPDF_DocRenderData::Clear(FX_BOOL bRelease)\n{\n    FX_POSITION pos;\n    {\n        pos = m_Type3FaceMap.GetStartPosition();\n        while (pos) {\n            CPDF_Font* pFont;\n            CPDF_CountedObject<CPDF_Type3Cache*>* cache;\n            m_Type3FaceMap.GetNextAssoc(pos, pFont, cache);\n            if (bRelease || cache->m_nCount < 2) {\n                delete cache->m_Obj;\n                delete cache;\n                m_Type3FaceMap.RemoveKey(pFont);\n            }\n        }\n    }\n#ifndef _FPDFAPI_MINI_\n    {\n        pos = m_TransferFuncMap.GetStartPosition();\n        while (pos) {\n            CPDF_Object* key;\n            CPDF_CountedObject<CPDF_TransferFunc*>* value;\n            m_TransferFuncMap.GetNextAssoc(pos, key, value);\n            if (bRelease || value->m_nCount < 2) {\n                delete value->m_Obj;\n                delete value;\n                m_TransferFuncMap.RemoveKey(key);\n            }\n        }\n    }\n#endif\n    if (m_pFontCache) {\n        if (bRelease) {\n            delete m_pFontCache;\n            m_pFontCache = NULL;\n        } else {\n            m_pFontCache->FreeCache(FALSE);\n        }\n    }\n}\nFX_BOOL CPDF_DocRenderData::Initialize()\n{\n    m_pFontCache = FX_NEW CFX_FontCache;\n    return TRUE;\n}\nCPDF_Type3Cache* CPDF_DocRenderData::GetCachedType3(CPDF_Type3Font* pFont)\n{\n    CPDF_CountedObject<CPDF_Type3Cache*>* pCache;\n    if (!m_Type3FaceMap.Lookup(pFont, pCache)) {\n        CPDF_Type3Cache* pType3 = FX_NEW CPDF_Type3Cache(pFont);\n        pCache = FX_NEW CPDF_CountedObject<CPDF_Type3Cache*>;\n        pCache->m_Obj = pType3;\n        pCache->m_nCount = 1;\n        m_Type3FaceMap.SetAt(pFont, pCache);\n    }\n    pCache->m_nCount++;\n    return pCache->m_Obj;\n}\nvoid CPDF_DocRenderData::ReleaseCachedType3(CPDF_Type3Font* pFont)\n{\n    CPDF_CountedObject<CPDF_Type3Cache*>* pCache;\n    if (!m_Type3FaceMap.Lookup(pFont, pCache)) {\n        return;\n    }\n    pCache->m_nCount--;\n}\nclass CPDF_RenderModule : public CPDF_RenderModuleDef\n{\npublic:\n    virtual ~CPDF_RenderModule() {}\n    virtual FX_BOOL\tInstalled()\n    {\n        return TRUE;\n    }\n    virtual CPDF_DocRenderData*\tCreateDocData(CPDF_Document* pDoc);\n    virtual void\tDestroyDocData(CPDF_DocRenderData* p);\n    virtual void\tClearDocData(CPDF_DocRenderData* p);\n    virtual CPDF_DocRenderData* GetRenderData()\n    {\n        return &m_RenderData;\n    }\n    virtual CPDF_PageRenderCache*\tCreatePageCache(CPDF_Page* pPage)\n    {\n        return FX_NEW CPDF_PageRenderCache(pPage);\n    }\n    virtual void\tDestroyPageCache(CPDF_PageRenderCache* pCache);\n    virtual CPDF_RenderConfig*\tGetConfig()\n    {\n        return &m_RenderConfig;\n    }\nprivate:\n    CPDF_DocRenderData\tm_RenderData;\n    CPDF_RenderConfig\tm_RenderConfig;\n};\nCPDF_DocRenderData*\tCPDF_RenderModule::CreateDocData(CPDF_Document* pDoc)\n{\n    CPDF_DocRenderData* pData = FX_NEW CPDF_DocRenderData(pDoc);\n    pData->Initialize();\n    return pData;\n}\nvoid CPDF_RenderModule::DestroyDocData(CPDF_DocRenderData* pDocData)\n{\n    delete pDocData;\n}\nvoid CPDF_RenderModule::ClearDocData(CPDF_DocRenderData* p)\n{\n    if (p) {\n        p->Clear(FALSE);\n    }\n}\nvoid CPDF_RenderModule::DestroyPageCache(CPDF_PageRenderCache* pCache)\n{\n    delete pCache;\n}\nvoid CPDF_ModuleMgr::InitRenderModule()\n{\n    if (m_pRenderModule) {\n        delete m_pRenderModule;\n    }\n    m_pRenderModule = FX_NEW CPDF_RenderModule;\n}\nCPDF_RenderOptions::CPDF_RenderOptions()\n    : m_ColorMode(RENDER_COLOR_NORMAL)\n    , m_Flags(RENDER_CLEARTYPE)\n    , m_Interpolation(0)\n    , m_AddFlags(0)\n    , m_pOCContext(NULL)\n    , m_dwLimitCacheSize(1024 * 1024 * 100)\n    , m_HalftoneLimit(-1)\n{\n#if defined(_FPDFAPI_MINI_)\n    m_Flags |= RENDER_LIMITEDIMAGECACHE;\n#endif\n}\nFX_ARGB CPDF_RenderOptions::TranslateColor(FX_ARGB argb) const\n{\n    if (m_ColorMode == RENDER_COLOR_NORMAL) {\n        return argb;\n    }\n    if (m_ColorMode == RENDER_COLOR_ALPHA) {\n        return argb;\n    }\n    int a, r, g, b;\n    ArgbDecode(argb, a, r, g, b);\n    int gray = FXRGB2GRAY(r, g, b);\n    if (m_ColorMode == RENDER_COLOR_TWOCOLOR) {\n        int color = (r - gray) * (r - gray) + (g - gray) * (g - gray) + (b - gray) * (b - gray);\n        if (gray < 35 && color < 20) {\n            return ArgbEncode(a, m_ForeColor);\n        }\n        if (gray > 221 && color < 20) {\n            return ArgbEncode(a, m_BackColor);\n        }\n        return argb;\n    }\n    int fr = FXSYS_GetRValue(m_ForeColor);\n    int fg = FXSYS_GetGValue(m_ForeColor);\n    int fb = FXSYS_GetBValue(m_ForeColor);\n    int br = FXSYS_GetRValue(m_BackColor);\n    int bg = FXSYS_GetGValue(m_BackColor);\n    int bb = FXSYS_GetBValue(m_BackColor);\n    r = (br - fr) * gray / 255 + fr;\n    g = (bg - fg) * gray / 255 + fg;\n    b = (bb - fb) * gray / 255 + fb;\n    return ArgbEncode(a, r, g, b);\n}\nCPDF_RenderStatus::CPDF_RenderStatus()\n{\n    m_pContext = NULL;\n    m_bStopped = FALSE;\n    m_Level = 0;\n    m_pDevice = NULL;\n    m_pCurObj = NULL;\n    m_pStopObj = NULL;\n    m_HalftoneLimit = 0;\n    m_pObjectRenderer = NULL;\n    m_bPrint = FALSE;\n    m_Transparency = 0;\n    m_DitherBits = 0;\n    m_bDropObjects = FALSE;\n    m_bStdCS = FALSE;\n    m_GroupFamily = 0;\n    m_bLoadMask = FALSE;\n    m_pType3Char = NULL;\n    m_T3FillColor = 0;\n    m_pFormResource = NULL;\n    m_pPageResource = NULL;\n    m_curBlend = FXDIB_BLEND_NORMAL;\n}\nCPDF_RenderStatus::~CPDF_RenderStatus()\n{\n    if (m_pObjectRenderer) {\n        delete m_pObjectRenderer;\n    }\n}\nFX_BOOL CPDF_RenderStatus::Initialize(int level, CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice,\n                                      const CFX_AffineMatrix* pDeviceMatrix, const CPDF_PageObject* pStopObj,\n                                      const CPDF_RenderStatus* pParentState, const CPDF_GraphicStates* pInitialStates,\n                                      const CPDF_RenderOptions* pOptions, int transparency, FX_BOOL bDropObjects,\n                                      CPDF_Dictionary* pFormResource, FX_BOOL bStdCS, CPDF_Type3Char* pType3Char,\n                                      FX_ARGB fill_color, FX_DWORD GroupFamily,\n                                      FX_BOOL bLoadMask)\n{\n    m_Level = level;\n    m_pContext = pContext;\n    m_pDevice = pDevice;\n    m_DitherBits = pDevice->GetDeviceCaps(FXDC_DITHER_BITS);\n    m_bPrint = m_pDevice->GetDeviceClass() != FXDC_DISPLAY;\n    if (pDeviceMatrix) {\n        m_DeviceMatrix = *pDeviceMatrix;\n    }\n    m_pStopObj = pStopObj;\n    if (pOptions) {\n        m_Options = *pOptions;\n    }\n    m_bDropObjects = bDropObjects;\n    m_bStdCS = bStdCS;\n    m_T3FillColor = fill_color;\n    m_pType3Char = pType3Char;\n    m_GroupFamily = GroupFamily;\n    m_bLoadMask = bLoadMask;\n    m_pFormResource = pFormResource;\n    m_pPageResource = m_pContext->m_pPageResources;\n    if (pInitialStates && !m_pType3Char) {\n        m_InitialStates.CopyStates(*pInitialStates);\n        if (pParentState) {\n            CPDF_ColorStateData* pColorData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)m_InitialStates.m_ColorState;\n            CPDF_ColorStateData* pParentData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)pParentState->m_InitialStates.m_ColorState;\n            if (!pColorData || pColorData->m_FillColor.IsNull()) {\n                CPDF_ColorStateData* pData = m_InitialStates.m_ColorState.GetModify();\n                pData->m_FillRGB = pParentData->m_FillRGB;\n                pData->m_FillColor.Copy(&pParentData->m_FillColor);\n            }\n            if (!pColorData || pColorData->m_StrokeColor.IsNull()) {\n                CPDF_ColorStateData* pData = m_InitialStates.m_ColorState.GetModify();\n                pData->m_StrokeRGB = pParentData->m_FillRGB;\n                pData->m_StrokeColor.Copy(&pParentData->m_StrokeColor);\n            }\n        }\n    } else {\n        m_InitialStates.DefaultStates();\n    }\n#if defined(_FPDFAPI_MINI_)||defined(_FXCORE_LIMITED_CPU_)\n    m_HalftoneLimit = CPDF_ModuleMgr::Get()->GetRenderModule()->GetConfig()->m_HalftoneLimit;\n    if (pOptions && pOptions->m_HalftoneLimit >= 0) {\n        m_HalftoneLimit = pOptions->m_HalftoneLimit;\n    }\n#endif\n    m_pObjectRenderer = NULL;\n    m_Transparency = transparency;\n    return TRUE;\n}\nvoid CPDF_RenderStatus::RenderObjectList(const CPDF_PageObjects* pObjs, const CFX_AffineMatrix* pObj2Device)\n{\n    if (m_Level > 32) {\n        return;\n    }\n    CFX_FloatRect clip_rect = m_pDevice->GetClipBox();\n    CFX_AffineMatrix device2object;\n    device2object.SetReverse(*pObj2Device);\n    device2object.TransformRect(clip_rect);\n    int index = 0;\n    FX_POSITION pos = pObjs->GetFirstObjectPosition();\n    while(pos) {\n        index ++;\n        CPDF_PageObject* pCurObj = pObjs->GetNextObject(pos);\n        if (pCurObj == m_pStopObj) {\n            m_bStopped = TRUE;\n            return;\n        }\n        if (!pCurObj) {\n            continue;\n        }\n        if(pCurObj == NULL || pCurObj->m_Left > clip_rect.right || pCurObj->m_Right < clip_rect.left ||\n                pCurObj->m_Bottom > clip_rect.top || pCurObj->m_Top < clip_rect.bottom) {\n            continue;\n        }\n        RenderSingleObject(pCurObj, pObj2Device);\n        if (m_bStopped) {\n            return;\n        }\n    }\n}\nvoid CPDF_RenderStatus::RenderSingleObject(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device)\n{\n    if (m_Level > 32) {\n        return;\n    }\n    m_pCurObj = pObj;\n    if (m_Options.m_pOCContext && pObj->m_ContentMark.NotNull())\n        if (!m_Options.m_pOCContext->CheckObjectVisible(pObj)) {\n            return;\n        }\n    ProcessClipPath(pObj->m_ClipPath, pObj2Device);\n    if (ProcessTransparency(pObj, pObj2Device)) {\n        return;\n    }\n    ProcessObjectNoClip(pObj, pObj2Device);\n}\nFX_BOOL CPDF_RenderStatus::ContinueSingleObject(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, IFX_Pause* pPause)\n{\n    if (m_pObjectRenderer) {\n        if (m_pObjectRenderer->Continue(pPause)) {\n            return TRUE;\n        }\n        if (!m_pObjectRenderer->m_Result) {\n            DrawObjWithBackground(pObj, pObj2Device);\n        }\n#ifdef _FPDFAPI_MINI_\n        if (m_DitherBits) {\n            DitherObjectArea(pObj, pObj2Device);\n        }\n#endif\n        delete m_pObjectRenderer;\n        m_pObjectRenderer = NULL;\n        return FALSE;\n    }\n    m_pCurObj = pObj;\n    if (m_Options.m_pOCContext && pObj->m_ContentMark.NotNull())\n        if (!m_Options.m_pOCContext->CheckObjectVisible(pObj)) {\n            return FALSE;\n        }\n    ProcessClipPath(pObj->m_ClipPath, pObj2Device);\n    if (ProcessTransparency(pObj, pObj2Device)) {\n        return FALSE;\n    }\n    if (pObj->m_Type == PDFPAGE_IMAGE) {\n        m_pObjectRenderer = IPDF_ObjectRenderer::Create(pObj->m_Type);\n        if (!m_pObjectRenderer->Start(this, pObj, pObj2Device, FALSE)) {\n            if (!m_pObjectRenderer->m_Result) {\n                DrawObjWithBackground(pObj, pObj2Device);\n            }\n#ifdef _FPDFAPI_MINI_\n            if (m_DitherBits) {\n                DitherObjectArea(pObj, pObj2Device);\n            }\n#endif\n            delete m_pObjectRenderer;\n            m_pObjectRenderer = NULL;\n            return FALSE;\n        }\n        return ContinueSingleObject(pObj, pObj2Device, pPause);\n    }\n    ProcessObjectNoClip(pObj, pObj2Device);\n    return FALSE;\n}\nIPDF_ObjectRenderer* IPDF_ObjectRenderer::Create(int type)\n{\n    IPDF_ObjectRenderer* pRenderer = NULL;\n    if (type == PDFPAGE_IMAGE) {\n        pRenderer = FX_NEW CPDF_ImageRenderer;\n    }\n    return pRenderer;\n}\nFX_BOOL CPDF_RenderStatus::GetObjectClippedRect(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bLogical, FX_RECT &rect) const\n{\n    rect = pObj->GetBBox(pObj2Device);\n    FX_RECT rtClip = m_pDevice->GetClipBox();\n    if (!bLogical) {\n        CFX_Matrix dCTM = m_pDevice->GetCTM();\n        FX_FLOAT a = FXSYS_fabs(dCTM.a);\n        FX_FLOAT d = FXSYS_fabs(dCTM.d);\n        if (a != 1.0f || d != 1.0f) {\n            rect.right = rect.left + (FX_INT32)FXSYS_ceil((FX_FLOAT)rect.Width() * a);\n            rect.bottom = rect.top + (FX_INT32)FXSYS_ceil((FX_FLOAT)rect.Height() * d);\n            rtClip.right = rtClip.left + (FX_INT32)FXSYS_ceil((FX_FLOAT)rtClip.Width() * a);\n            rtClip.bottom = rtClip.top + (FX_INT32)FXSYS_ceil((FX_FLOAT)rtClip.Height() * d);\n        }\n    }\n    rect.Intersect(rtClip);\n    return rect.IsEmpty();\n}\nvoid CPDF_RenderStatus::DitherObjectArea(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device)\n{\n    CFX_DIBitmap* pBitmap = m_pDevice->GetBitmap();\n    if (pBitmap == NULL) {\n        return;\n    }\n    FX_RECT rect;\n    if (GetObjectClippedRect(pObj, pObj2Device, FALSE, rect)) {\n        return;\n    }\n    if (m_DitherBits == 2) {\n        static FX_ARGB pal[4] = {0, 85, 170, 255};\n        pBitmap->DitherFS(pal, 4, &rect);\n    } else if (m_DitherBits == 3) {\n        static FX_ARGB pal[8] = {0, 36, 73, 109, 146, 182, 219, 255};\n        pBitmap->DitherFS(pal, 8, &rect);\n    } else if (m_DitherBits == 4) {\n        static FX_ARGB pal[16] = {0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255};\n        pBitmap->DitherFS(pal, 16, &rect);\n    }\n}\nvoid CPDF_RenderStatus::ProcessObjectNoClip(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device)\n{\n    FX_BOOL bRet = FALSE;\n    switch (pObj->m_Type) {\n        case PDFPAGE_TEXT:\n            bRet = ProcessText((CPDF_TextObject*)pObj, pObj2Device, NULL);\n            break;\n        case PDFPAGE_PATH:\n            bRet = ProcessPath((CPDF_PathObject*)pObj, pObj2Device);\n            break;\n        case PDFPAGE_IMAGE:\n            bRet = ProcessImage((CPDF_ImageObject*)pObj, pObj2Device);\n            break;\n        case PDFPAGE_SHADING:\n            bRet = ProcessShading((CPDF_ShadingObject*)pObj, pObj2Device);\n            break;\n        case PDFPAGE_FORM:\n            bRet = ProcessForm((CPDF_FormObject*)pObj, pObj2Device);\n            break;\n#if defined(_FPDFAPI_MINI_)\n        case PDFPAGE_INLINES:\n            bRet = ProcessInlines((CPDF_InlineImages*)pObj, pObj2Device);\n            break;\n#endif\n    }\n    if (!bRet) {\n        DrawObjWithBackground(pObj, pObj2Device);\n    }\n}\nFX_BOOL CPDF_RenderStatus::DrawObjWithBlend(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device)\n{\n    FX_BOOL bRet = FALSE;\n    switch (pObj->m_Type) {\n        case PDFPAGE_PATH:\n            bRet = ProcessPath((CPDF_PathObject*)pObj, pObj2Device);\n            break;\n        case PDFPAGE_IMAGE:\n            bRet = ProcessImage((CPDF_ImageObject *)pObj, pObj2Device);\n            break;\n        case PDFPAGE_FORM:\n            bRet = ProcessForm((CPDF_FormObject*)pObj, pObj2Device);\n            break;\n    }\n    return bRet;\n}\nvoid CPDF_RenderStatus::GetScaledMatrix(CFX_Matrix &matrix) const\n{\n    CFX_Matrix dCTM = m_pDevice->GetCTM();\n    matrix.a *= FXSYS_fabs(dCTM.a);\n    matrix.d *= FXSYS_fabs(dCTM.d);\n}\nvoid CPDF_RenderStatus::DrawObjWithBackground(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device)\n{\n#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)\n    FX_RECT rect;\n    if (GetObjectClippedRect(pObj, pObj2Device, FALSE, rect)) {\n        return;\n    }\n    int res = 300;\n    if (pObj->m_Type == PDFPAGE_IMAGE && m_pDevice->GetDeviceCaps(FXDC_DEVICE_CLASS) == FXDC_PRINTER) {\n        res = 0;\n    }\n    CPDF_ScaledRenderBuffer buffer;\n    if (!buffer.Initialize(m_pContext, m_pDevice, &rect, pObj, &m_Options, res)) {\n        return;\n    }\n    CFX_AffineMatrix matrix = *pObj2Device;\n    matrix.Concat(*buffer.GetMatrix());\n    GetScaledMatrix(matrix);\n    CPDF_Dictionary* pFormResource = NULL;\n    if (pObj->m_Type == PDFPAGE_FORM) {\n        CPDF_FormObject* pFormObj = (CPDF_FormObject*)pObj;\n        if (pFormObj->m_pForm && pFormObj->m_pForm->m_pFormDict) {\n            pFormResource = pFormObj->m_pForm->m_pFormDict->GetDict(FX_BSTRC(\"Resources\"));\n        }\n    }\n    CPDF_RenderStatus status;\n    status.Initialize(m_Level + 1, m_pContext, buffer.GetDevice(), buffer.GetMatrix(), NULL, NULL, NULL, &m_Options, m_Transparency, m_bDropObjects, pFormResource);\n    status.RenderSingleObject(pObj, &matrix);\n    buffer.OutputToDevice();\n#endif\n}\nFX_BOOL CPDF_RenderStatus::ProcessForm(CPDF_FormObject* pFormObj, const CFX_AffineMatrix* pObj2Device)\n{\n    CPDF_Dictionary* pOC = pFormObj->m_pForm->m_pFormDict->GetDict(FX_BSTRC(\"OC\"));\n    if (pOC && m_Options.m_pOCContext && !m_Options.m_pOCContext->CheckOCGVisible(pOC)) {\n        return TRUE;\n    }\n    CFX_AffineMatrix matrix = pFormObj->m_FormMatrix;\n    matrix.Concat(*pObj2Device);\n    CPDF_Dictionary* pResources = NULL;\n    if (pFormObj->m_pForm && pFormObj->m_pForm->m_pFormDict) {\n        pResources = pFormObj->m_pForm->m_pFormDict->GetDict(FX_BSTRC(\"Resources\"));\n    }\n    CPDF_RenderStatus status;\n    status.Initialize(m_Level + 1, m_pContext, m_pDevice, NULL, m_pStopObj,\n                      this, pFormObj, &m_Options, m_Transparency, m_bDropObjects, pResources, FALSE);\n    status.m_curBlend = m_curBlend;\n    m_pDevice->SaveState();\n    status.RenderObjectList(pFormObj->m_pForm, &matrix);\n    m_bStopped = status.m_bStopped;\n    m_pDevice->RestoreState();\n    return TRUE;\n}\nFX_BOOL IsAvailableMatrix(const CFX_AffineMatrix& matrix)\n{\n    if (matrix.a == 0 || matrix.d == 0) {\n        return matrix.b != 0 && matrix.c != 0;\n    }\n    if (matrix.b == 0 || matrix.c == 0) {\n        return matrix.a != 0 && matrix.d != 0;\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_RenderStatus::ProcessPath(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device)\n{\n    int FillType = pPathObj->m_FillType;\n    FX_BOOL bStroke = pPathObj->m_bStroke;\n    ProcessPathPattern(pPathObj, pObj2Device, FillType, bStroke);\n    if (FillType == 0 && !bStroke) {\n        return TRUE;\n    }\n    FX_DWORD fill_argb = 0;\n    if (FillType) {\n        fill_argb = GetFillArgb(pPathObj);\n    }\n    FX_DWORD stroke_argb = 0;\n    if (bStroke) {\n        stroke_argb = GetStrokeArgb(pPathObj);\n    }\n    CFX_AffineMatrix path_matrix = pPathObj->m_Matrix;\n    path_matrix.Concat(*pObj2Device);\n    if (!IsAvailableMatrix(path_matrix)) {\n        return TRUE;\n    }\n    if (FillType && (m_Options.m_Flags & RENDER_RECT_AA)) {\n        FillType |= FXFILL_RECT_AA;\n    }\n    if (m_Options.m_Flags & RENDER_FILL_FULLCOVER) {\n        FillType |= FXFILL_FULLCOVER;\n    }\n    if (m_Options.m_Flags & RENDER_NOPATHSMOOTH) {\n        FillType |= FXFILL_NOPATHSMOOTH;\n    }\n    if (bStroke) {\n        FillType |= FX_FILL_STROKE;\n    }\n#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)\n    const CPDF_GeneralStateData* pGeneralData = ((CPDF_PageObject*)pPathObj)->m_GeneralState;\n    if (pGeneralData && pGeneralData->m_StrokeAdjust) {\n        FillType |= FX_STROKE_ADJUST;\n    }\n#endif\n    if (m_pType3Char) {\n        FillType |= FX_FILL_TEXT_MODE;\n    }\n    CFX_GraphStateData graphState(*pPathObj->m_GraphState);\n    if (m_Options.m_Flags & RENDER_THINLINE) {\n        graphState.m_LineWidth = 0;\n    }\n    return m_pDevice->DrawPath(pPathObj->m_Path, &path_matrix, &graphState, fill_argb, stroke_argb, FillType, 0, NULL, m_curBlend);\n}\nCPDF_TransferFunc* CPDF_RenderStatus::GetTransferFunc(CPDF_Object* pObj) const\n{\n    ASSERT(pObj != NULL);\n    CPDF_DocRenderData* pDocCache = m_pContext->m_pDocument->GetRenderData();\n    if (!pDocCache) {\n        return NULL;\n    }\n    return pDocCache->GetTransferFunc(pObj);\n}\nFX_ARGB CPDF_RenderStatus::GetFillArgb(const CPDF_PageObject* pObj, FX_BOOL bType3) const\n{\n    CPDF_ColorStateData* pColorData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)pObj->m_ColorState;\n    if (m_pType3Char && !bType3 && (!m_pType3Char->m_bColored || (m_pType3Char->m_bColored && (!pColorData || pColorData->m_FillColor.IsNull())))) {\n        return m_T3FillColor;\n    } else if (!pColorData || pColorData->m_FillColor.IsNull()) {\n        pColorData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)m_InitialStates.m_ColorState;\n    }\n    FX_COLORREF rgb = pColorData->m_FillRGB;\n    if (rgb == (FX_DWORD) - 1) {\n        return 0;\n    }\n    const CPDF_GeneralStateData* pGeneralData = pObj->m_GeneralState;\n    int alpha;\n    if (pGeneralData) {\n        alpha = (FX_INT32)(pGeneralData->m_FillAlpha * 255);\n#ifndef _FPDFAPI_MINI_\n        if (pGeneralData->m_pTR) {\n            if (!pGeneralData->m_pTransferFunc) {\n                ((CPDF_GeneralStateData*)pGeneralData)->m_pTransferFunc = GetTransferFunc(pGeneralData->m_pTR);\n            }\n            if (pGeneralData->m_pTransferFunc) {\n                rgb = pGeneralData->m_pTransferFunc->TranslateColor(rgb);\n            }\n        }\n#endif\n    } else {\n        alpha = 255;\n    }\n    return m_Options.TranslateColor(ArgbEncode(alpha, rgb));\n}\nFX_ARGB CPDF_RenderStatus::GetStrokeArgb(const CPDF_PageObject* pObj) const\n{\n    CPDF_ColorStateData* pColorData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)pObj->m_ColorState;\n    if (m_pType3Char && (!m_pType3Char->m_bColored || (m_pType3Char->m_bColored && (!pColorData || pColorData->m_StrokeColor.IsNull())))) {\n        return m_T3FillColor;\n    } else if (!pColorData || pColorData->m_StrokeColor.IsNull()) {\n        pColorData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)m_InitialStates.m_ColorState;\n    }\n    FX_COLORREF rgb = pColorData->m_StrokeRGB;\n    if (rgb == (FX_DWORD) - 1) {\n        return 0;\n    }\n    const CPDF_GeneralStateData* pGeneralData = pObj->m_GeneralState;\n    int alpha;\n    if (pGeneralData) {\n        alpha = (FX_INT32)(pGeneralData->m_StrokeAlpha * 255);\n#ifndef _FPDFAPI_MINI_\n        if (pGeneralData->m_pTR) {\n            if (!pGeneralData->m_pTransferFunc) {\n                ((CPDF_GeneralStateData*)pGeneralData)->m_pTransferFunc = GetTransferFunc(pGeneralData->m_pTR);\n            }\n            if (pGeneralData->m_pTransferFunc) {\n                rgb = pGeneralData->m_pTransferFunc->TranslateColor(rgb);\n            }\n        }\n#endif\n    } else {\n        alpha = 255;\n    }\n    return m_Options.TranslateColor(ArgbEncode(alpha, rgb));\n}\nvoid CPDF_RenderStatus::ProcessClipPath(CPDF_ClipPath ClipPath, const CFX_AffineMatrix* pObj2Device)\n{\n    if (ClipPath.IsNull()) {\n        if (m_LastClipPath.IsNull()) {\n            return;\n        }\n        m_pDevice->RestoreState(TRUE);\n        m_LastClipPath.SetNull();\n        return;\n    }\n    if (m_LastClipPath == ClipPath) {\n        return;\n    }\n    m_LastClipPath = ClipPath;\n    m_pDevice->RestoreState(TRUE);\n    int nClipPath = ClipPath.GetPathCount();\n    int i;\n    for (i = 0; i < nClipPath; i++) {\n        const CFX_PathData* pPathData = ClipPath.GetPath(i);\n        if (pPathData == NULL) {\n            continue;\n        }\n        if (pPathData->GetPointCount() == 0) {\n            CFX_PathData EmptyPath;\n            EmptyPath.AppendRect(-1, -1, 0, 0);\n            int fill_mode = FXFILL_WINDING;\n            m_pDevice->SetClip_PathFill(&EmptyPath, NULL, fill_mode);\n        } else {\n            int ClipType = ClipPath.GetClipType(i);\n            m_pDevice->SetClip_PathFill(pPathData, pObj2Device, ClipType);\n        }\n    }\n    int textcount = ClipPath.GetTextCount();\n    if (textcount == 0) {\n        return;\n    }\n    if (m_pDevice->GetDeviceClass() == FXDC_DISPLAY && !(m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_SOFT_CLIP)) {\n        return;\n    }\n    CFX_PathData* pTextClippingPath = NULL;\n    for (i = 0; i < textcount; i ++) {\n        CPDF_TextObject* pText = ClipPath.GetText(i);\n        if (pText == NULL) {\n            if (pTextClippingPath) {\n                int fill_mode = FXFILL_WINDING;\n                if (m_Options.m_Flags & RENDER_NOTEXTSMOOTH) {\n                    fill_mode |= FXFILL_NOPATHSMOOTH;\n                }\n                m_pDevice->SetClip_PathFill(pTextClippingPath, NULL, fill_mode);\n                delete pTextClippingPath;\n                pTextClippingPath = NULL;\n            }\n        } else {\n            if (pTextClippingPath == NULL) {\n                pTextClippingPath = FX_NEW CFX_PathData;\n            }\n            ProcessText(pText, pObj2Device, pTextClippingPath);\n        }\n    }\n    if (pTextClippingPath) {\n        delete pTextClippingPath;\n    }\n}\nvoid CPDF_RenderStatus::DrawClipPath(CPDF_ClipPath ClipPath, const CFX_AffineMatrix* pObj2Device)\n{\n    if (ClipPath.IsNull()) {\n        return;\n    }\n    int fill_mode = 0;\n    if (m_Options.m_Flags & RENDER_NOPATHSMOOTH) {\n        fill_mode |= FXFILL_NOPATHSMOOTH;\n    }\n    int nClipPath = ClipPath.GetPathCount();\n    int i;\n    for (i = 0; i < nClipPath; i++) {\n        const CFX_PathData* pPathData = ClipPath.GetPath(i);\n        if (pPathData == NULL) {\n            continue;\n        }\n        CFX_GraphStateData stroke_state;\n        if (m_Options.m_Flags & RENDER_THINLINE) {\n            stroke_state.m_LineWidth = 0;\n        }\n        m_pDevice->DrawPath(pPathData, pObj2Device, &stroke_state, 0, 0xffff0000, fill_mode);\n    }\n}\nFX_BOOL CPDF_RenderStatus::SelectClipPath(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke)\n{\n    CFX_AffineMatrix path_matrix = pPathObj->m_Matrix;\n    path_matrix.Concat(*pObj2Device);\n    if (bStroke) {\n        CFX_GraphStateData graphState(*pPathObj->m_GraphState);\n        if (m_Options.m_Flags & RENDER_THINLINE) {\n            graphState.m_LineWidth = 0;\n        }\n        return m_pDevice->SetClip_PathStroke(pPathObj->m_Path, &path_matrix, &graphState);\n    }\n    int fill_mode = pPathObj->m_FillType;\n    if (m_Options.m_Flags & RENDER_NOPATHSMOOTH) {\n        fill_mode |= FXFILL_NOPATHSMOOTH;\n    }\n    return m_pDevice->SetClip_PathFill(pPathObj->m_Path, &path_matrix, fill_mode);\n}\nFX_BOOL CPDF_RenderStatus::ProcessTransparency(const CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device)\n{\n    const CPDF_GeneralStateData* pGeneralState = pPageObj->m_GeneralState;\n    int blend_type = pGeneralState ? pGeneralState->m_BlendType : FXDIB_BLEND_NORMAL;\n    if (blend_type == FXDIB_BLEND_UNSUPPORTED) {\n        return TRUE;\n    }\n    CPDF_Dictionary* pSMaskDict = pGeneralState ? (CPDF_Dictionary*)pGeneralState->m_pSoftMask : NULL;\n    if (pSMaskDict) {\n        if (pPageObj->m_Type == PDFPAGE_IMAGE &&\n                ((CPDF_ImageObject*)pPageObj)->m_pImage->GetDict()->KeyExist(FX_BSTRC(\"SMask\"))) {\n            pSMaskDict = NULL;\n        }\n    }\n    CPDF_Dictionary* pFormResource = NULL;\n    FX_FLOAT group_alpha = 1.0f;\n    int Transparency = m_Transparency;\n    FX_BOOL bGroupTransparent = FALSE;\n    if (pPageObj->m_Type == PDFPAGE_FORM) {\n        CPDF_FormObject* pFormObj = (CPDF_FormObject*)pPageObj;\n        const CPDF_GeneralStateData *pStateData = pFormObj->m_GeneralState.GetObject();\n        if (pStateData) {\n            group_alpha = pStateData->m_FillAlpha;\n        }\n        Transparency = pFormObj->m_pForm->m_Transparency;\n        bGroupTransparent = Transparency & PDFTRANS_ISOLATED ? TRUE : FALSE;\n        if (pFormObj->m_pForm->m_pFormDict) {\n            pFormResource = pFormObj->m_pForm->m_pFormDict->GetDict(\"Resources\");\n        }\n    }\n    FX_BOOL bTextClip = FALSE;\n    if (pPageObj->m_ClipPath.NotNull() && pPageObj->m_ClipPath.GetTextCount() &&\n            m_pDevice->GetDeviceClass() == FXDC_DISPLAY && !(m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_SOFT_CLIP)) {\n        bTextClip = TRUE;\n    }\n    if ((m_Options.m_Flags & RENDER_OVERPRINT) && pPageObj->m_Type == PDFPAGE_IMAGE && pGeneralState && pGeneralState->m_FillOP && pGeneralState->m_StrokeOP) {\n        CPDF_Document* pDocument = NULL;\n        CPDF_Page* pPage = NULL;\n        if (m_pContext->m_pPageCache) {\n            pPage = m_pContext->m_pPageCache->GetPage();\n            pDocument = pPage->m_pDocument;\n        } else {\n            pDocument = ((CPDF_ImageObject*)pPageObj)->m_pImage->GetDocument();\n        }\n        CPDF_Dictionary* pPageResources = pPage ? pPage->m_pPageResources : NULL;\n        CPDF_Object* pCSObj = ((CPDF_ImageObject*)pPageObj)->m_pImage->GetStream()->GetDict()->GetElementValue(FX_BSTRC(\"ColorSpace\"));\n        CPDF_ColorSpace* pColorSpace = pDocument->LoadColorSpace(pCSObj, pPageResources);\n        if (pColorSpace) {\n            int format = pColorSpace->GetFamily();\n            if (format == PDFCS_DEVICECMYK || format == PDFCS_SEPARATION || format == PDFCS_DEVICEN) {\n                blend_type = FXDIB_BLEND_DARKEN;\n            }\n            pDocument->GetPageData()->ReleaseColorSpace(pCSObj);\n        }\n    }\n    if (pSMaskDict == NULL && group_alpha == 1.0f && blend_type == FXDIB_BLEND_NORMAL && !bTextClip && !bGroupTransparent) {\n        return FALSE;\n    }\n    FX_BOOL isolated = Transparency & PDFTRANS_ISOLATED;\n    if (m_bPrint) {\n        FX_BOOL bRet = FALSE;\n        int rendCaps = m_pDevice->GetRenderCaps();\n        if (!((Transparency & PDFTRANS_ISOLATED) || pSMaskDict || bTextClip) && (rendCaps & FXRC_BLEND_MODE)) {\n            int oldBlend = m_curBlend;\n            m_curBlend = blend_type;\n            bRet = DrawObjWithBlend(pPageObj, pObj2Device);\n            m_curBlend = oldBlend;\n        }\n        if (!bRet) {\n            DrawObjWithBackground(pPageObj, pObj2Device);\n        }\n        return TRUE;\n    }\n    FX_RECT rect = pPageObj->GetBBox(pObj2Device);\n    rect.Intersect(m_pDevice->GetClipBox());\n    if (rect.IsEmpty()) {\n        return TRUE;\n    }\n    CFX_Matrix deviceCTM = m_pDevice->GetCTM();\n    FX_FLOAT scaleX = FXSYS_fabs(deviceCTM.a);\n    FX_FLOAT scaleY = FXSYS_fabs(deviceCTM.d);\n    int width = FXSYS_round((FX_FLOAT)rect.Width() * scaleX);\n    int height = FXSYS_round((FX_FLOAT)rect.Height() * scaleY);\n    CFX_FxgeDevice bitmap_device;\n    CFX_DIBitmap* oriDevice = NULL;\n    if (!isolated && (m_pDevice->GetRenderCaps() & FXRC_GET_BITS)) {\n        oriDevice = FX_NEW CFX_DIBitmap;\n        if (!m_pDevice->CreateCompatibleBitmap(oriDevice, width, height)) {\n            return TRUE;\n        }\n        m_pDevice->GetDIBits(oriDevice, rect.left, rect.top);\n    }\n    if (!bitmap_device.Create(width, height, FXDIB_Argb, 0, oriDevice)) {\n        return TRUE;\n    }\n    CFX_DIBitmap* bitmap = bitmap_device.GetBitmap();\n    bitmap->Clear(0);\n    CFX_AffineMatrix new_matrix = *pObj2Device;\n    new_matrix.TranslateI(-rect.left, -rect.top);\n    new_matrix.Scale(scaleX, scaleY);\n    CFX_DIBitmap* pTextMask = NULL;\n    if (bTextClip) {\n        pTextMask = FX_NEW CFX_DIBitmap;\n        if (!pTextMask->Create(width, height, FXDIB_8bppMask)) {\n            delete pTextMask;\n            return TRUE;\n        }\n        pTextMask->Clear(0);\n        CFX_FxgeDevice text_device;\n        text_device.Attach(pTextMask);\n        for (FX_DWORD i = 0; i < pPageObj->m_ClipPath.GetTextCount(); i ++) {\n            CPDF_TextObject* textobj = pPageObj->m_ClipPath.GetText(i);\n            if (textobj == NULL) {\n                break;\n            }\n            CFX_AffineMatrix text_matrix;\n            textobj->GetTextMatrix(&text_matrix);\n            CPDF_TextRenderer::DrawTextPath(&text_device, textobj->m_nChars, textobj->m_pCharCodes, textobj->m_pCharPos,\n                                            textobj->m_TextState.GetFont(), textobj->m_TextState.GetFontSize(),\n                                            &text_matrix, &new_matrix, textobj->m_GraphState, (FX_ARGB) - 1, 0, NULL);\n        }\n    }\n    CPDF_RenderStatus bitmap_render;\n    bitmap_render.Initialize(m_Level + 1, m_pContext, &bitmap_device, NULL,\n                             m_pStopObj, NULL, NULL, &m_Options, 0, m_bDropObjects, pFormResource, TRUE);\n    bitmap_render.ProcessObjectNoClip(pPageObj, &new_matrix);\n    m_bStopped = bitmap_render.m_bStopped;\n    if (pSMaskDict) {\n        CFX_AffineMatrix smask_matrix;\n        FXSYS_memcpy32(&smask_matrix, pGeneralState->m_SMaskMatrix, sizeof smask_matrix);\n        smask_matrix.Concat(*pObj2Device);\n        CFX_DIBSource* pSMaskSource = LoadSMask(pSMaskDict, &rect, &smask_matrix);\n        if (pSMaskSource) {\n            bitmap->MultiplyAlpha(pSMaskSource);\n            delete pSMaskSource;\n        }\n    }\n    if (pTextMask) {\n        bitmap->MultiplyAlpha(pTextMask);\n        delete pTextMask;\n        pTextMask = NULL;\n    }\n    if (Transparency & PDFTRANS_GROUP && group_alpha != 1.0f) {\n        bitmap->MultiplyAlpha((FX_INT32)(group_alpha * 255));\n    }\n    Transparency = m_Transparency;\n    if (pPageObj->m_Type == PDFPAGE_FORM) {\n        Transparency |= PDFTRANS_GROUP;\n    }\n    CompositeDIBitmap(bitmap, rect.left, rect.top, 0, 255, blend_type, Transparency);\n    if (oriDevice) {\n        delete oriDevice;\n    }\n    return TRUE;\n}\nCFX_DIBitmap* CPDF_RenderStatus::GetBackdrop(const CPDF_PageObject* pObj, const FX_RECT& rect, int& left, int& top,\n        FX_BOOL bBackAlphaRequired)\n{\n    FX_RECT bbox = rect;\n    bbox.Intersect(m_pDevice->GetClipBox());\n    left = bbox.left;\n    top = bbox.top;\n    CFX_Matrix deviceCTM = m_pDevice->GetCTM();\n    FX_FLOAT scaleX = FXSYS_fabs(deviceCTM.a);\n    FX_FLOAT scaleY = FXSYS_fabs(deviceCTM.d);\n    int width = FXSYS_round(bbox.Width() * scaleX);\n    int height = FXSYS_round(bbox.Height() * scaleY);\n    CFX_DIBitmap* pBackdrop = FX_NEW CFX_DIBitmap;\n    if (bBackAlphaRequired && !m_bDropObjects) {\n        pBackdrop->Create(width, height, FXDIB_Argb);\n    } else {\n        m_pDevice->CreateCompatibleBitmap(pBackdrop, width, height);\n    }\n    if (pBackdrop->GetBuffer() == NULL) {\n        delete pBackdrop;\n        return NULL;\n    }\n    FX_BOOL bNeedDraw;\n    if (pBackdrop->HasAlpha()) {\n        bNeedDraw = !(m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT);\n    } else {\n        bNeedDraw = !(m_pDevice->GetRenderCaps() & FXRC_GET_BITS);\n    }\n    if (!bNeedDraw) {\n        m_pDevice->GetDIBits(pBackdrop, left, top);\n        return pBackdrop;\n    }\n    CFX_AffineMatrix FinalMatrix = m_DeviceMatrix;\n    FinalMatrix.TranslateI(-left, -top);\n    FinalMatrix.Scale(scaleX, scaleY);\n    pBackdrop->Clear(pBackdrop->HasAlpha() ? 0 : 0xffffffff);\n    CFX_FxgeDevice device;\n    device.Attach(pBackdrop);\n    m_pContext->Render(&device, pObj, &m_Options, &FinalMatrix);\n    return pBackdrop;\n}\nvoid CPDF_RenderContext::GetBackground(CFX_DIBitmap* pBuffer, const CPDF_PageObject* pObj,\n                                       const CPDF_RenderOptions* pOptions, CFX_AffineMatrix* pFinalMatrix)\n{\n    CFX_FxgeDevice device;\n    device.Attach(pBuffer);\n    if (m_pBackgroundDraw) {\n        m_pBackgroundDraw->OnDrawBackground(&device, pFinalMatrix);\n    } else {\n        FX_RECT rect(0, 0, device.GetWidth(), device.GetHeight());\n        device.FillRect(&rect, 0xffffffff);\n    }\n    Render(&device, pObj, pOptions, pFinalMatrix);\n}\nCPDF_GraphicStates* CPDF_RenderStatus::CloneObjStates(const CPDF_GraphicStates* pSrcStates, FX_BOOL bStroke)\n{\n    if (!pSrcStates) {\n        return NULL;\n    }\n    CPDF_GraphicStates* pStates = FX_NEW CPDF_GraphicStates;\n    if (!pStates) {\n        return NULL;\n    }\n    pStates->CopyStates(*pSrcStates);\n    CPDF_Color* pObjColor = bStroke ? pSrcStates->m_ColorState.GetStrokeColor() :\n                            pSrcStates->m_ColorState.GetFillColor();\n    if (!pObjColor->IsNull()) {\n        CPDF_ColorStateData* pColorData = pStates->m_ColorState.GetModify();\n        pColorData->m_FillRGB = bStroke ? pSrcStates->m_ColorState.GetObject()->m_StrokeRGB :\n                                pSrcStates->m_ColorState.GetObject()->m_FillRGB;\n        pColorData->m_StrokeRGB = pColorData->m_FillRGB;\n    }\n    return pStates;\n}\nCPDF_RenderContext::CPDF_RenderContext()\n{\n}\nvoid CPDF_RenderContext::Create(CPDF_Document* pDoc, CPDF_PageRenderCache* pPageCache,\n                                CPDF_Dictionary* pPageResources, FX_BOOL bFirstLayer)\n{\n    m_pBackgroundDraw = NULL;\n    m_pDocument = pDoc;\n    m_pPageResources = pPageResources;\n    m_pPageCache = pPageCache;\n    m_bFirstLayer = bFirstLayer;\n}\nvoid CPDF_RenderContext::Create(CPDF_Page* pPage, FX_BOOL bFirstLayer)\n{\n    m_pBackgroundDraw = NULL;\n    m_pDocument = pPage->m_pDocument;\n    m_pPageResources = pPage->m_pPageResources;\n    m_pPageCache = pPage->GetRenderCache();\n    m_bFirstLayer = bFirstLayer;\n}\nCPDF_RenderContext::~CPDF_RenderContext()\n{\n}\nvoid CPDF_RenderContext::Clear()\n{\n    m_pDocument = NULL;\n    m_pPageResources = NULL;\n    m_pPageCache = NULL;\n    m_pBackgroundDraw = NULL;\n    m_bFirstLayer = TRUE;\n    m_ContentList.RemoveAll();\n}\nvoid CPDF_RenderContext::AppendObjectList(CPDF_PageObjects* pObjs, const CFX_AffineMatrix* pObject2Device)\n{\n    _PDF_RenderItem* pItem = m_ContentList.AddSpace();\n    pItem->m_pObjectList = pObjs;\n    if (pObject2Device) {\n        pItem->m_Matrix = *pObject2Device;\n    } else {\n        pItem->m_Matrix.SetIdentity();\n    }\n}\nvoid CPDF_RenderContext::Render(CFX_RenderDevice* pDevice, const CPDF_RenderOptions* pOptions,\n                                const CFX_AffineMatrix* pLastMatrix)\n{\n    Render(pDevice, NULL, pOptions, pLastMatrix);\n}\nvoid CPDF_RenderContext::Render(CFX_RenderDevice* pDevice, const CPDF_PageObject* pStopObj,\n                                const CPDF_RenderOptions* pOptions, const CFX_AffineMatrix* pLastMatrix)\n{\n    int count = m_ContentList.GetSize();\n    for (int j = 0; j < count; j ++) {\n        pDevice->SaveState();\n        _PDF_RenderItem* pItem = m_ContentList.GetDataPtr(j);\n        if (pLastMatrix) {\n            CFX_AffineMatrix FinalMatrix = pItem->m_Matrix;\n            FinalMatrix.Concat(*pLastMatrix);\n            CPDF_RenderStatus status;\n            status.Initialize(0, this, pDevice, pLastMatrix, pStopObj, NULL, NULL, pOptions,\n                              pItem->m_pObjectList->m_Transparency, FALSE, NULL);\n            status.RenderObjectList(pItem->m_pObjectList, &FinalMatrix);\n#if !defined(_FPDFAPI_MINI_)\n            if (status.m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) {\n                m_pPageCache->CacheOptimization(status.m_Options.m_dwLimitCacheSize);\n            }\n#endif\n            if (status.m_bStopped) {\n                pDevice->RestoreState();\n                break;\n            }\n        } else {\n            CPDF_RenderStatus status;\n            status.Initialize(0, this, pDevice, NULL, pStopObj, NULL, NULL, pOptions,\n                              pItem->m_pObjectList->m_Transparency, FALSE, NULL);\n            status.RenderObjectList(pItem->m_pObjectList, &pItem->m_Matrix);\n#if !defined(_FPDFAPI_MINI_)\n            if (status.m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) {\n                m_pPageCache->CacheOptimization(status.m_Options.m_dwLimitCacheSize);\n            }\n#endif\n            if (status.m_bStopped) {\n                pDevice->RestoreState();\n                break;\n            }\n        }\n        pDevice->RestoreState();\n    }\n}\nvoid CPDF_RenderContext::DrawObjectList(CFX_RenderDevice* pDevice, CPDF_PageObjects* pObjs,\n                                        const CFX_AffineMatrix* pObject2Device, const CPDF_RenderOptions* pOptions)\n{\n    AppendObjectList(pObjs, pObject2Device);\n    Render(pDevice, pOptions);\n}\nCPDF_ProgressiveRenderer::CPDF_ProgressiveRenderer()\n{\n    m_pRenderer = NULL;\n    m_pContext = NULL;\n    m_pDevice = NULL;\n    m_Status = Ready;\n}\nCPDF_ProgressiveRenderer::~CPDF_ProgressiveRenderer()\n{\n    Clear();\n}\nvoid CPDF_ProgressiveRenderer::Clear()\n{\n    if (m_pRenderer) {\n        delete m_pRenderer;\n        m_pDevice->RestoreState();\n        m_pRenderer = NULL;\n    }\n    m_Status = Ready;\n}\nvoid CPDF_ProgressiveRenderer::Start(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice,\n                                     const CPDF_RenderOptions* pOptions, IFX_Pause* pPause, FX_BOOL bDropObjects)\n{\n    if (m_Status != Ready) {\n        m_Status = Failed;\n        return;\n    }\n    m_pContext = pContext;\n    m_pDevice = pDevice;\n    m_pOptions = pOptions;\n    m_bDropObjects = bDropObjects;\n    if (pContext == NULL || pDevice == NULL) {\n        m_Status = Failed;\n        return;\n    }\n    m_Status = ToBeContinued;\n    m_ObjectPos = NULL;\n    m_LayerIndex = 0;\n    m_ObjectIndex = 0;\n    m_PrevLastPos = NULL;\n    Continue(pPause);\n}\n#ifdef _FPDFAPI_MINI_\n#define RENDER_STEP_LIMIT 20\n#else\n#define RENDER_STEP_LIMIT 100\n#endif\nvoid CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause)\n{\n    if (m_Status != ToBeContinued) {\n        return;\n    }\n    FX_DWORD nLayers = m_pContext->m_ContentList.GetSize();\n    for (; m_LayerIndex < nLayers; m_LayerIndex ++) {\n        _PDF_RenderItem* pItem = m_pContext->m_ContentList.GetDataPtr(m_LayerIndex);\n        FX_POSITION LastPos = pItem->m_pObjectList->GetLastObjectPosition();\n        if (m_ObjectPos == NULL) {\n            if (LastPos == m_PrevLastPos) {\n                if (!pItem->m_pObjectList->IsParsed()) {\n                    pItem->m_pObjectList->ContinueParse(pPause);\n                    if (!pItem->m_pObjectList->IsParsed()) {\n                        return;\n                    }\n                    LastPos = pItem->m_pObjectList->GetLastObjectPosition();\n                }\n            }\n            if (LastPos == m_PrevLastPos) {\n                if (m_pRenderer) {\n                    delete m_pRenderer;\n                    m_pRenderer = NULL;\n                    m_pDevice->RestoreState();\n                    m_ObjectPos = NULL;\n                    m_PrevLastPos = NULL;\n                }\n                continue;\n            }\n            if (m_PrevLastPos) {\n                m_ObjectPos = m_PrevLastPos;\n                pItem->m_pObjectList->GetNextObject(m_ObjectPos);\n            } else {\n                m_ObjectPos = pItem->m_pObjectList->GetFirstObjectPosition();\n            }\n            m_PrevLastPos = LastPos;\n        }\n        if (m_pRenderer == NULL) {\n            m_ObjectPos = pItem->m_pObjectList->GetFirstObjectPosition();\n            m_ObjectIndex = 0;\n            m_pRenderer = FX_NEW CPDF_RenderStatus();\n            m_pRenderer->Initialize(0, m_pContext, m_pDevice, NULL, NULL, NULL, NULL,\n                                    m_pOptions, pItem->m_pObjectList->m_Transparency, m_bDropObjects, NULL);\n            m_pDevice->SaveState();\n            m_ClipRect = m_pDevice->GetClipBox();\n            CFX_AffineMatrix device2object;\n            device2object.SetReverse(pItem->m_Matrix);\n            device2object.TransformRect(m_ClipRect);\n        }\n        int objs_to_go = CPDF_ModuleMgr::Get()->GetRenderModule()->GetConfig()->m_RenderStepLimit;\n        while (m_ObjectPos) {\n            CPDF_PageObject* pCurObj = pItem->m_pObjectList->GetObjectAt(m_ObjectPos);\n            if (pCurObj && pCurObj->m_Left <= m_ClipRect.right && pCurObj->m_Right >= m_ClipRect.left &&\n                    pCurObj->m_Bottom <= m_ClipRect.top && pCurObj->m_Top >= m_ClipRect.bottom) {\n                if (m_pRenderer->ContinueSingleObject(pCurObj, &pItem->m_Matrix, pPause)) {\n                    return;\n                }\n#if !defined(_FPDFAPI_MINI_)\n                if (pCurObj->m_Type == PDFPAGE_IMAGE && m_pRenderer->m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) {\n                    m_pContext->GetPageCache()->CacheOptimization(m_pRenderer->m_Options.m_dwLimitCacheSize);\n                }\n#endif\n                if (pCurObj->m_Type == PDFPAGE_FORM || pCurObj->m_Type == PDFPAGE_SHADING) {\n                    objs_to_go = 0;\n                } else {\n                    objs_to_go --;\n                }\n            }\n            m_ObjectIndex ++;\n            pItem->m_pObjectList->GetNextObject(m_ObjectPos);\n            if (objs_to_go == 0) {\n                if (pPause && pPause->NeedToPauseNow()) {\n                    return;\n                }\n                objs_to_go = CPDF_ModuleMgr::Get()->GetRenderModule()->GetConfig()->m_RenderStepLimit;\n            }\n        }\n        if (!pItem->m_pObjectList->IsParsed()) {\n            return;\n        }\n        delete m_pRenderer;\n        m_pRenderer = NULL;\n        m_pDevice->RestoreState();\n        m_ObjectPos = NULL;\n        m_PrevLastPos = NULL;\n        if (pPause && pPause->NeedToPauseNow()) {\n            m_LayerIndex++;\n            return;\n        }\n    }\n    m_Status = Done;\n}\nint CPDF_ProgressiveRenderer::EstimateProgress()\n{\n    if (!m_pContext) {\n        return 0;\n    }\n    FX_DWORD nLayers = m_pContext->m_ContentList.GetSize();\n    int nTotal = 0, nRendered = 0;\n    for (FX_DWORD layer = 0; layer < nLayers; layer ++) {\n        _PDF_RenderItem* pItem = m_pContext->m_ContentList.GetDataPtr(layer);\n        int nObjs = pItem->m_pObjectList->CountObjects();\n        if (layer == m_LayerIndex) {\n            nRendered += m_ObjectIndex;\n        } else if (layer < m_LayerIndex) {\n            nRendered += nObjs;\n        }\n        nTotal += nObjs;\n    }\n    if (nTotal == 0) {\n        return 0;\n    }\n    return 100 * nRendered / nTotal;\n}\nCPDF_TransferFunc* CPDF_DocRenderData::GetTransferFunc(CPDF_Object* pObj)\n{\n    if (pObj == NULL) {\n        return NULL;\n    }\n    CPDF_CountedObject<CPDF_TransferFunc*>* pTransferCounter;\n    if (!m_TransferFuncMap.Lookup(pObj, pTransferCounter)) {\n        CPDF_TransferFunc* pTransfer = NULL;\n        CPDF_Function* pFuncs[3] = {NULL, NULL, NULL};\n        FX_BOOL bUniTransfer = TRUE;\n        int i;\n        FX_BOOL bIdentity = TRUE;\n        if (pObj->GetType() == PDFOBJ_ARRAY) {\n            bUniTransfer = FALSE;\n            CPDF_Array* pArray = (CPDF_Array*)pObj;\n            if (pArray->GetCount() < 3) {\n                return NULL;\n            }\n            for (FX_DWORD i = 0; i < 3; i ++) {\n                pFuncs[2 - i] = CPDF_Function::Load(pArray->GetElementValue(i));\n                if (pFuncs[2 - i] == NULL) {\n                    return NULL;\n                }\n            }\n        } else {\n            pFuncs[0] = CPDF_Function::Load(pObj);\n            if (pFuncs[0] == NULL) {\n                return NULL;\n            }\n        }\n        pTransfer = FX_NEW CPDF_TransferFunc;\n        pTransfer->m_pPDFDoc = m_pPDFDoc;\n        pTransferCounter = FX_NEW CPDF_CountedObject<CPDF_TransferFunc*>;\n        pTransferCounter->m_nCount = 1;\n        pTransferCounter->m_Obj = pTransfer;\n        m_TransferFuncMap.SetAt(pObj, pTransferCounter);\n        static const int kMaxOutputs = 16;\n        FX_FLOAT output[kMaxOutputs];\n        FXSYS_memset32(output, 0, sizeof(output));\n        FX_FLOAT input;\n        int noutput;\n        for (int v = 0; v < 256; v ++) {\n            input = (FX_FLOAT)v / 255.0f;\n            if (bUniTransfer) {\n                if (pFuncs[0] && pFuncs[0]->CountOutputs() <= kMaxOutputs) {\n                    pFuncs[0]->Call(&input, 1, output, noutput);\n                }\n                int o = FXSYS_round(output[0] * 255);\n                if (o != v) {\n                    bIdentity = FALSE;\n                }\n                for (i = 0; i < 3; i ++) {\n                    pTransfer->m_Samples[i * 256 + v] = o;\n                }\n            } else\n                for (i = 0; i < 3; i ++) {\n                    if (pFuncs[i] && pFuncs[i]->CountOutputs() <= kMaxOutputs) {\n                        pFuncs[i]->Call(&input, 1, output, noutput);\n                        int o = FXSYS_round(output[0] * 255);\n                        if (o != v) {\n                            bIdentity = FALSE;\n                        }\n                        pTransfer->m_Samples[i * 256 + v] = o;\n                    } else {\n                        pTransfer->m_Samples[i * 256 + v] = v;\n                    }\n                }\n        }\n        for (i = 0; i < 3; i ++)\n            if (pFuncs[i]) {\n                delete pFuncs[i];\n            }\n        pTransfer->m_bIdentity = bIdentity;\n    }\n    pTransferCounter->m_nCount++;\n    return pTransferCounter->m_Obj;\n}\nvoid CPDF_DocRenderData::ReleaseTransferFunc(CPDF_Object* pObj)\n{\n    CPDF_CountedObject<CPDF_TransferFunc*>* pTransferCounter;\n    if (!m_TransferFuncMap.Lookup(pObj, pTransferCounter)) {\n        return;\n    }\n    pTransferCounter->m_nCount--;\n}\nCPDF_RenderConfig::CPDF_RenderConfig()\n{\n    m_HalftoneLimit = 0;\n#ifdef _FPDFAPI_MINI_\n    m_RenderStepLimit = 20;\n#else\n    m_RenderStepLimit = 100;\n#endif\n}\nCPDF_RenderConfig::~CPDF_RenderConfig()\n{\n}\nCPDF_DeviceBuffer::CPDF_DeviceBuffer()\n{\n    m_pBitmap = NULL;\n    m_pDevice = NULL;\n    m_pContext = NULL;\n    m_pObject = NULL;\n}\nCPDF_DeviceBuffer::~CPDF_DeviceBuffer()\n{\n    if (m_pBitmap) {\n        delete m_pBitmap;\n    }\n}\nFX_BOOL CPDF_DeviceBuffer::Initialize(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, FX_RECT* pRect,\n                                      const CPDF_PageObject* pObj, int max_dpi)\n{\n    m_pDevice = pDevice;\n    m_pContext = pContext;\n    m_Rect = *pRect;\n    m_pObject = pObj;\n    m_Matrix.TranslateI(-pRect->left, -pRect->top);\n#if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_\n    int horz_size = pDevice->GetDeviceCaps(FXDC_HORZ_SIZE);\n    int vert_size = pDevice->GetDeviceCaps(FXDC_VERT_SIZE);\n    if (horz_size && vert_size && max_dpi) {\n        int dpih = pDevice->GetDeviceCaps(FXDC_PIXEL_WIDTH) * 254 / (horz_size * 10);\n        int dpiv = pDevice->GetDeviceCaps(FXDC_PIXEL_HEIGHT) * 254 / (vert_size * 10);\n        if (dpih > max_dpi) {\n            m_Matrix.Scale((FX_FLOAT)(max_dpi) / dpih, 1.0f);\n        }\n        if (dpiv > max_dpi) {\n            m_Matrix.Scale(1.0f, (FX_FLOAT)(max_dpi) / (FX_FLOAT)dpiv);\n        }\n    }\n#ifdef _FPDFAPI_MINI_\n    m_Matrix.Scale(0.5f, 0.5f);\n#endif\n#endif\n    CFX_Matrix ctm = m_pDevice->GetCTM();\n    FX_FLOAT fScaleX = FXSYS_fabs(ctm.a);\n    FX_FLOAT fScaleY = FXSYS_fabs(ctm.d);\n    m_Matrix.Concat(fScaleX, 0, 0, fScaleY, 0, 0);\n    CFX_FloatRect rect(*pRect);\n    m_Matrix.TransformRect(rect);\n    FX_RECT bitmap_rect = rect.GetOutterRect();\n    m_pBitmap = FX_NEW CFX_DIBitmap;\n    m_pBitmap->Create(bitmap_rect.Width(), bitmap_rect.Height(), FXDIB_Argb);\n    return TRUE;\n}\nvoid CPDF_DeviceBuffer::OutputToDevice()\n{\n    if (m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_GET_BITS) {\n        if (m_Matrix.a == 1.0f && m_Matrix.d == 1.0f) {\n            m_pDevice->SetDIBits(m_pBitmap, m_Rect.left, m_Rect.top);\n        } else {\n            m_pDevice->StretchDIBits(m_pBitmap, m_Rect.left, m_Rect.top, m_Rect.Width(), m_Rect.Height());\n        }\n    } else {\n#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)\n        CFX_DIBitmap buffer;\n        m_pDevice->CreateCompatibleBitmap(&buffer, m_pBitmap->GetWidth(), m_pBitmap->GetHeight());\n        m_pContext->GetBackground(&buffer, m_pObject, NULL, &m_Matrix);\n        buffer.CompositeBitmap(0, 0, buffer.GetWidth(), buffer.GetHeight(), m_pBitmap, 0, 0);\n        m_pDevice->StretchDIBits(&buffer, m_Rect.left, m_Rect.top, m_Rect.Width(), m_Rect.Height());\n#endif\n    }\n}\nCPDF_ScaledRenderBuffer::CPDF_ScaledRenderBuffer()\n{\n    m_pBitmapDevice = NULL;\n}\nCPDF_ScaledRenderBuffer::~CPDF_ScaledRenderBuffer()\n{\n    if (m_pBitmapDevice) {\n        delete m_pBitmapDevice;\n    }\n}\n#ifndef _FPDFAPI_MINI_\n#define _FPDFAPI_IMAGESIZE_LIMIT_\t(30 * 1024 * 1024)\n#else\n#define _FPDFAPI_IMAGESIZE_LIMIT_\t(10 * 1024 * 1024)\n#endif\nFX_BOOL CPDF_ScaledRenderBuffer::Initialize(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, FX_RECT* pRect,\n        const CPDF_PageObject* pObj, const CPDF_RenderOptions *pOptions, int max_dpi)\n{\n    FXSYS_assert(pRect != NULL);\n    m_pDevice = pDevice;\n    if (m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_GET_BITS) {\n        return TRUE;\n    }\n    m_pContext = pContext;\n    m_Rect = *pRect;\n    m_pObject = pObj;\n    m_Matrix.TranslateI(-pRect->left, -pRect->top);\n    int horz_size = pDevice->GetDeviceCaps(FXDC_HORZ_SIZE);\n    int vert_size = pDevice->GetDeviceCaps(FXDC_VERT_SIZE);\n    if (horz_size && vert_size && max_dpi) {\n        int dpih = pDevice->GetDeviceCaps(FXDC_PIXEL_WIDTH) * 254 / (horz_size * 10);\n        int dpiv = pDevice->GetDeviceCaps(FXDC_PIXEL_HEIGHT) * 254 / (vert_size * 10);\n        if (dpih > max_dpi) {\n            m_Matrix.Scale((FX_FLOAT)(max_dpi) / dpih, 1.0f);\n        }\n        if (dpiv > max_dpi) {\n            m_Matrix.Scale(1.0f, (FX_FLOAT)(max_dpi) / (FX_FLOAT)dpiv);\n        }\n    }\n    m_pBitmapDevice = FX_NEW CFX_FxgeDevice;\n    FXDIB_Format dibFormat = FXDIB_Rgb;\n    FX_INT32 bpp = 24;\n    if (m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_ALPHA_OUTPUT) {\n        dibFormat = FXDIB_Argb;\n        bpp = 32;\n    }\n    CFX_FloatRect rect;\n    FX_INT32 iWidth, iHeight, iPitch;\n    while (1) {\n        rect = *pRect;\n        m_Matrix.TransformRect(rect);\n        FX_RECT bitmap_rect = rect.GetOutterRect();\n        iWidth = bitmap_rect.Width();\n        iHeight = bitmap_rect.Height();\n        iPitch = (iWidth * bpp + 31) / 32 * 4;\n        if (iWidth * iHeight < 1) {\n            return FALSE;\n        }\n        if (iPitch * iHeight <= _FPDFAPI_IMAGESIZE_LIMIT_ &&\n                m_pBitmapDevice->Create(iWidth, iHeight, dibFormat)) {\n            break;\n        }\n        m_Matrix.Scale(0.5f, 0.5f);\n    }\n#if  !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)\n    m_pContext->GetBackground(m_pBitmapDevice->GetBitmap(), m_pObject, pOptions, &m_Matrix);\n#endif\n    return TRUE;\n}\nvoid CPDF_ScaledRenderBuffer::OutputToDevice()\n{\n    if (m_pBitmapDevice) {\n        m_pDevice->StretchDIBits(m_pBitmapDevice->GetBitmap(), m_Rect.left, m_Rect.top, m_Rect.Width(), m_Rect.Height());\n    }\n}\nFX_BOOL IPDF_OCContext::CheckObjectVisible(const CPDF_PageObject* pObj)\n{\n    const CPDF_ContentMarkData* pData = pObj->m_ContentMark;\n    int nItems = pData->CountItems();\n    for (int i = 0; i < nItems; i ++) {\n        CPDF_ContentMarkItem& item = pData->GetItem(i);\n        if (item.GetName() == FX_BSTRC(\"OC\") && item.GetParamType() == CPDF_ContentMarkItem::PropertiesDict) {\n            CPDF_Dictionary* pOCG = (CPDF_Dictionary*)item.GetParam();\n            if (!CheckOCGVisible(pOCG)) {\n                return FALSE;\n            }\n        }\n    }\n    return TRUE;\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_render/fpdf_render_cache.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_render.h\"\n#include \"../../../include/fpdfapi/fpdf_pageobj.h\"\n#include \"../../../include/fxge/fx_ge.h\"\n#include \"../fpdf_page/pageint.h\"\n#include \"render_int.h\"\nstruct CACHEINFO {\n    FX_DWORD time;\n    CPDF_Stream* pStream;\n};\nextern \"C\" {\n    static int compare(const void* data1, const void* data2)\n    {\n        return ((CACHEINFO*)data1)->time - ((CACHEINFO*)data2)->time;\n    }\n};\nvoid CPDF_Page::ClearRenderCache()\n{\n    if (m_pPageRender) {\n        m_pPageRender->ClearAll();\n    }\n}\nvoid CPDF_PageRenderCache::ClearAll()\n{\n    FX_POSITION pos = m_ImageCaches.GetStartPosition();\n    while (pos) {\n        FX_LPVOID key, value;\n        m_ImageCaches.GetNextAssoc(pos, key, value);\n        delete (CPDF_ImageCache*)value;\n    }\n    m_ImageCaches.RemoveAll();\n    m_nCacheSize = 0;\n    m_nTimeCount = 0;\n}\nvoid CPDF_PageRenderCache::CacheOptimization(FX_INT32 dwLimitCacheSize)\n{\n    if (m_nCacheSize <= (FX_DWORD)dwLimitCacheSize) {\n        return;\n    }\n    int nCount = m_ImageCaches.GetCount();\n    CACHEINFO* pCACHEINFO = (CACHEINFO*)FX_Alloc(FX_BYTE, (sizeof (CACHEINFO)) * nCount);\n    FX_POSITION pos = m_ImageCaches.GetStartPosition();\n    int i = 0;\n    while (pos) {\n        FX_LPVOID key, value;\n        m_ImageCaches.GetNextAssoc(pos, key, value);\n        pCACHEINFO[i].time = ((CPDF_ImageCache*)value)->GetTimeCount();\n        pCACHEINFO[i++].pStream = ((CPDF_ImageCache*)value)->GetStream();\n    }\n    FXSYS_qsort(pCACHEINFO, nCount, sizeof (CACHEINFO), compare);\n    FX_DWORD nTimeCount = m_nTimeCount;\n    if (nTimeCount + 1 < nTimeCount) {\n        for (i = 0; i < nCount; i ++) {\n            ((CPDF_ImageCache*)(m_ImageCaches[pCACHEINFO[i].pStream]))->m_dwTimeCount = i;\n        }\n        m_nTimeCount = nCount;\n    }\n    i = 0;\n    while(nCount > 15) {\n        ClearImageCache(pCACHEINFO[i++].pStream);\n        nCount--;\n    }\n    while (m_nCacheSize > (FX_DWORD)dwLimitCacheSize) {\n        ClearImageCache(pCACHEINFO[i++].pStream);\n    }\n    FX_Free(pCACHEINFO);\n}\nvoid CPDF_PageRenderCache::ClearImageCache(CPDF_Stream* pStream)\n{\n    FX_LPVOID value = m_ImageCaches.GetValueAt(pStream);\n    if (value == NULL)\t{\n        m_ImageCaches.RemoveKey(pStream);\n        return;\n    }\n    m_nCacheSize -= ((CPDF_ImageCache*)value)->EstimateSize();\n    delete (CPDF_ImageCache*)value;\n    m_ImageCaches.RemoveKey(pStream);\n}\nFX_DWORD CPDF_PageRenderCache::EstimateSize()\n{\n    FX_DWORD dwSize = 0;\n    FX_POSITION pos = m_ImageCaches.GetStartPosition();\n    while (pos) {\n        FX_LPVOID key, value;\n        m_ImageCaches.GetNextAssoc(pos, key, value);\n        dwSize += ((CPDF_ImageCache*)value)->EstimateSize();\n    }\n    m_nCacheSize = dwSize;\n    return dwSize;\n}\nFX_DWORD CPDF_PageRenderCache::GetCachedSize(CPDF_Stream* pStream) const\n{\n    if (pStream == NULL) {\n        return m_nCacheSize;\n    }\n    CPDF_ImageCache* pImageCache;\n    if (!m_ImageCaches.Lookup(pStream, (FX_LPVOID&)pImageCache)) {\n        return 0;\n    }\n    return pImageCache->EstimateSize();\n}\nvoid CPDF_PageRenderCache::GetCachedBitmap(CPDF_Stream* pStream, CFX_DIBSource*& pBitmap, CFX_DIBSource*& pMask, FX_DWORD& MatteColor,\n        FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus,\n        FX_INT32 downsampleWidth, FX_INT32 downsampleHeight)\n{\n    CPDF_ImageCache* pImageCache;\n    FX_BOOL bFind = m_ImageCaches.Lookup(pStream, (FX_LPVOID&)pImageCache);\n    if (!bFind) {\n        pImageCache = FX_NEW CPDF_ImageCache(m_pPage->m_pDocument, pStream);\n    }\n    m_nTimeCount ++;\n    FX_BOOL bCached = pImageCache->GetCachedBitmap(pBitmap, pMask, MatteColor, m_pPage->m_pPageResources, bStdCS, GroupFamily, bLoadMask, pRenderStatus, downsampleWidth, downsampleHeight);\n    if (!bFind) {\n        m_ImageCaches.SetAt(pStream, pImageCache);\n    }\n    if (!bCached) {\n        m_nCacheSize += pImageCache->EstimateSize();\n    }\n}\nFX_BOOL\tCPDF_PageRenderCache::StartGetCachedBitmap(CPDF_Stream* pStream, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus, FX_INT32 downsampleWidth, FX_INT32 downsampleHeight)\n{\n    m_bCurFindCache = m_ImageCaches.Lookup(pStream, (FX_LPVOID&)m_pCurImageCache);\n    if (!m_bCurFindCache) {\n        m_pCurImageCache = FX_NEW CPDF_ImageCache(m_pPage->m_pDocument, pStream);\n    }\n    int ret = m_pCurImageCache->StartGetCachedBitmap(pRenderStatus->m_pFormResource, m_pPage->m_pPageResources, bStdCS, GroupFamily, bLoadMask, pRenderStatus, downsampleWidth, downsampleHeight);\n    if (ret == 2) {\n        return TRUE;\n    }\n    m_nTimeCount ++;\n    if (!m_bCurFindCache) {\n        m_ImageCaches.SetAt(pStream, m_pCurImageCache);\n    }\n    if (!ret) {\n        m_nCacheSize += m_pCurImageCache->EstimateSize();\n    }\n    return FALSE;\n}\nFX_BOOL\tCPDF_PageRenderCache::Continue(IFX_Pause* pPause)\n{\n    int ret = m_pCurImageCache->Continue(pPause);\n    if (ret == 2) {\n        return TRUE;\n    }\n    m_nTimeCount ++;\n    if (!m_bCurFindCache) {\n        m_ImageCaches.SetAt(m_pCurImageCache->GetStream(), m_pCurImageCache);\n    }\n    if (!ret) {\n        m_nCacheSize += m_pCurImageCache->EstimateSize();\n    }\n    return FALSE;\n}\nvoid CPDF_PageRenderCache::ResetBitmap(CPDF_Stream* pStream, const CFX_DIBitmap* pBitmap)\n{\n    CPDF_ImageCache* pImageCache;\n    if (!m_ImageCaches.Lookup(pStream, (FX_LPVOID&)pImageCache)) {\n        if (pBitmap == NULL) {\n            return;\n        }\n        pImageCache = FX_NEW CPDF_ImageCache(m_pPage->m_pDocument, pStream);\n        m_ImageCaches.SetAt(pStream, pImageCache);\n    }\n    int oldsize = pImageCache->EstimateSize();\n    pImageCache->Reset(pBitmap);\n    m_nCacheSize = pImageCache->EstimateSize() - oldsize;\n}\nCPDF_ImageCache::CPDF_ImageCache(CPDF_Document* pDoc, CPDF_Stream* pStream)\n    : m_pDocument(pDoc)\n    , m_pStream(pStream)\n    , m_pCachedBitmap(NULL)\n    , m_pCachedMask(NULL)\n    , m_dwCacheSize(0)\n    , m_dwTimeCount(0)\n    , m_pCurBitmap(NULL)\n    , m_pCurMask(NULL)\n    , m_MatteColor(0)\n    , m_pRenderStatus(NULL)\n{\n}\nCPDF_ImageCache::~CPDF_ImageCache()\n{\n    if (m_pCachedBitmap) {\n        delete m_pCachedBitmap;\n        m_pCachedBitmap = NULL;\n    }\n    if (m_pCachedMask) {\n        delete m_pCachedMask;\n        m_pCachedMask = NULL;\n    }\n}\nvoid CPDF_ImageCache::Reset(const CFX_DIBitmap* pBitmap)\n{\n    if (m_pCachedBitmap) {\n        delete m_pCachedBitmap;\n    }\n    m_pCachedBitmap = NULL;\n    if (pBitmap) {\n        m_pCachedBitmap = pBitmap->Clone();\n    }\n    CalcSize();\n}\nvoid CPDF_PageRenderCache::ClearImageData()\n{\n    FX_POSITION pos = m_ImageCaches.GetStartPosition();\n    while (pos) {\n        FX_LPVOID key, value;\n        m_ImageCaches.GetNextAssoc(pos, key, value);\n        ((CPDF_ImageCache*)value)->ClearImageData();\n    }\n}\nvoid CPDF_ImageCache::ClearImageData()\n{\n    if (m_pCachedBitmap && m_pCachedBitmap->GetBuffer() == NULL) {\n        ((CPDF_DIBSource*)m_pCachedBitmap)->ClearImageData();\n    }\n}\nstatic FX_DWORD FPDF_ImageCache_EstimateImageSize(const CFX_DIBSource* pDIB)\n{\n    return pDIB && pDIB->GetBuffer() ? (FX_DWORD)pDIB->GetHeight() * pDIB->GetPitch() + (FX_DWORD)pDIB->GetPaletteSize() * 4 : 0;\n}\nFX_BOOL CPDF_ImageCache::GetCachedBitmap(CFX_DIBSource*& pBitmap, CFX_DIBSource*& pMask, FX_DWORD& MatteColor, CPDF_Dictionary* pPageResources,\n        FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus,\n        FX_INT32 downsampleWidth, FX_INT32 downsampleHeight)\n{\n    if (m_pCachedBitmap) {\n        pBitmap = m_pCachedBitmap;\n        pMask = m_pCachedMask;\n        MatteColor = m_MatteColor;\n        return TRUE;\n    }\n    if (!pRenderStatus) {\n        return FALSE;\n    }\n    CPDF_RenderContext*pContext = pRenderStatus->GetContext();\n    CPDF_PageRenderCache* pPageRenderCache = pContext->m_pPageCache;\n    m_dwTimeCount = pPageRenderCache->GetTimeCount();\n    CPDF_DIBSource* pSrc = FX_NEW CPDF_DIBSource;\n    CPDF_DIBSource* pMaskSrc = NULL;\n    if (!pSrc->Load(m_pDocument, m_pStream, &pMaskSrc, &MatteColor, pRenderStatus->m_pFormResource, pPageResources, bStdCS, GroupFamily, bLoadMask)) {\n        delete pSrc;\n        pBitmap = NULL;\n        return FALSE;\n    }\n    m_MatteColor = MatteColor;\n#if !defined(_FPDFAPI_MINI_)\n    if (pSrc->GetPitch() * pSrc->GetHeight() < FPDF_HUGE_IMAGE_SIZE) {\n        m_pCachedBitmap = pSrc->Clone();\n        delete pSrc;\n    } else {\n        m_pCachedBitmap = pSrc;\n    }\n    if (pMaskSrc) {\n        m_pCachedMask = pMaskSrc->Clone();\n        delete pMaskSrc;\n    }\n#else\n    if (pSrc->GetFormat() == FXDIB_8bppRgb && pSrc->GetPalette() &&\n            pSrc->GetHeight() * pSrc->GetWidth() * 3 < 1024) {\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n        m_pCachedBitmap = pSrc->CloneConvert(FXDIB_Rgb32);\n#else\n        m_pCachedBitmap = pSrc->CloneConvert(FXDIB_Rgb);\n#endif\n        delete pSrc;\n    } else if (pSrc->GetPitch() * pSrc->GetHeight() < 102400) {\n        m_pCachedBitmap = pSrc->Clone();\n        delete pSrc;\n    } else {\n        m_pCachedBitmap = pSrc;\n    }\n    m_pCachedMask = pMaskSrc;\n#endif\n    pBitmap = m_pCachedBitmap;\n    pMask = m_pCachedMask;\n    CalcSize();\n    return FALSE;\n}\nCFX_DIBSource* CPDF_ImageCache::DetachBitmap()\n{\n    CFX_DIBSource* pDIBSource = m_pCurBitmap;\n    m_pCurBitmap = NULL;\n    return pDIBSource;\n}\nCFX_DIBSource* CPDF_ImageCache::DetachMask()\n{\n    CFX_DIBSource* pDIBSource = m_pCurMask;\n    m_pCurMask = NULL;\n    return pDIBSource;\n}\nint\tCPDF_ImageCache::StartGetCachedBitmap(CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources, FX_BOOL bStdCS,\n        FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus,\n        FX_INT32 downsampleWidth, FX_INT32 downsampleHeight)\n{\n    if (m_pCachedBitmap) {\n        m_pCurBitmap = m_pCachedBitmap;\n        m_pCurMask = m_pCachedMask;\n        return 1;\n    }\n    if (!pRenderStatus) {\n        return 0;\n    }\n    m_pRenderStatus = pRenderStatus;\n    m_pCurBitmap = FX_NEW CPDF_DIBSource;\n    int ret = ((CPDF_DIBSource*)m_pCurBitmap)->StartLoadDIBSource(m_pDocument, m_pStream, TRUE, pFormResources, pPageResources, bStdCS, GroupFamily, bLoadMask);\n    if (ret == 2) {\n        return ret;\n    }\n    if (!ret) {\n        delete m_pCurBitmap;\n        m_pCurBitmap = NULL;\n        return 0;\n    }\n    ContinueGetCachedBitmap();\n    return 0;\n}\nint CPDF_ImageCache::ContinueGetCachedBitmap()\n{\n    m_MatteColor = ((CPDF_DIBSource*)m_pCurBitmap)->m_MatteColor;\n    m_pCurMask = ((CPDF_DIBSource*)m_pCurBitmap)->DetachMask();\n    CPDF_RenderContext*pContext = m_pRenderStatus->GetContext();\n    CPDF_PageRenderCache* pPageRenderCache = pContext->m_pPageCache;\n    m_dwTimeCount = pPageRenderCache->GetTimeCount();\n#if !defined(_FPDFAPI_MINI_)\n    if (m_pCurBitmap->GetPitch() * m_pCurBitmap->GetHeight() < FPDF_HUGE_IMAGE_SIZE) {\n        m_pCachedBitmap = m_pCurBitmap->Clone();\n        delete m_pCurBitmap;\n        m_pCurBitmap = NULL;\n    } else {\n        m_pCachedBitmap = m_pCurBitmap;\n    }\n    if (m_pCurMask) {\n        m_pCachedMask = m_pCurMask->Clone();\n        delete m_pCurMask;\n        m_pCurMask = NULL;\n    }\n#else\n    if (m_pCurBitmap->GetFormat() == FXDIB_8bppRgb && m_pCurBitmap->GetPalette() &&\n            m_pCurBitmap->GetHeight() * m_pCurBitmap->GetWidth() * 3 < 1024) {\n        m_pCachedBitmap = m_pCurBitmap->CloneConvert(FXDIB_Rgb32);\n        m_pCachedBitmap = m_pCurBitmap->CloneConvert(FXDIB_Rgb);\n        delete m_pCurBitmap;\n        m_pCurBitmap = NULL;\n    } else if (m_pCurBitmap->GetPitch() * m_pCurBitmap->GetHeight() < 102400) {\n        m_pCachedBitmap = m_pCurBitmap->Clone();\n        delete m_pCurBitmap;\n        m_pCurBitmap = NULL;\n    } else {\n        m_pCachedBitmap = m_pCurBitmap;\n    }\n    m_pCachedMask = m_pCurMask;\n#endif\n    m_pCurBitmap = m_pCachedBitmap;\n    m_pCurMask = m_pCachedMask;\n    CalcSize();\n    return 0;\n}\nint\tCPDF_ImageCache::Continue(IFX_Pause* pPause)\n{\n    int ret = ((CPDF_DIBSource*)m_pCurBitmap)->ContinueLoadDIBSource(pPause);\n    if (ret == 2) {\n        return ret;\n    }\n    if (!ret) {\n        delete m_pCurBitmap;\n        m_pCurBitmap = NULL;\n        return 0;\n    }\n    ContinueGetCachedBitmap();\n    return 0;\n}\nvoid CPDF_ImageCache::CalcSize()\n{\n    m_dwCacheSize = FPDF_ImageCache_EstimateImageSize(m_pCachedBitmap) + FPDF_ImageCache_EstimateImageSize(m_pCachedMask);\n}\nvoid CPDF_Document::ClearRenderFont()\n{\n    if (m_pDocRender) {\n        CFX_FontCache* pCache = m_pDocRender->GetFontCache();\n        if (pCache) {\n            pCache->FreeCache(FALSE);\n        }\n    }\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxge/fx_ge.h\"\n#include \"../../../include/fxcodec/fx_codec.h\"\n#include \"../../../include/fpdfapi/fpdf_module.h\"\n#include \"../../../include/fpdfapi/fpdf_render.h\"\n#include \"../../../include/fpdfapi/fpdf_pageobj.h\"\n#include \"../fpdf_page/pageint.h\"\n#include \"render_int.h\"\nFX_BOOL CPDF_RenderStatus::ProcessImage(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pObj2Device)\n{\n    CPDF_ImageRenderer render;\n    if (render.Start(this, pImageObj, pObj2Device, m_bStdCS, m_curBlend)) {\n        render.Continue(NULL);\n    }\n#ifdef _FPDFAPI_MINI_\n    if (m_DitherBits) {\n        DitherObjectArea(pImageObj, pObj2Device);\n    }\n#endif\n    return render.m_Result;\n}\n#if defined(_FPDFAPI_MINI_)\nFX_BOOL CPDF_RenderStatus::ProcessInlines(CPDF_InlineImages* pInlines, const CFX_AffineMatrix* pObj2Device)\n{\n    int bitmap_alpha = 255;\n    if (!pInlines->m_GeneralState.IsNull()) {\n        bitmap_alpha = FXSYS_round(pInlines->m_GeneralState.GetObject()->m_FillAlpha * 255);\n    }\n    if (pInlines->m_pStream) {\n        CPDF_DIBSource dibsrc;\n        if (!dibsrc.Load(m_pContext->m_pDocument, pInlines->m_pStream, NULL, NULL, NULL, NULL)) {\n            return TRUE;\n        }\n        pInlines->m_pBitmap = dibsrc.Clone();\n        pInlines->m_pStream->Release();\n        pInlines->m_pStream = NULL;\n    }\n    if (pInlines->m_pBitmap == NULL) {\n        return TRUE;\n    }\n    FX_ARGB fill_argb = 0;\n    if (pInlines->m_pBitmap->IsAlphaMask()) {\n        fill_argb = GetFillArgb(pInlines);\n    }\n    int flags = 0;\n    if (m_Options.m_Flags & RENDER_FORCE_DOWNSAMPLE) {\n        flags |= RENDER_FORCE_DOWNSAMPLE;\n    } else if (m_Options.m_Flags & RENDER_FORCE_HALFTONE) {\n        flags = 0;\n    }\n    for (int i = 0; i < pInlines->m_Matrices.GetSize(); i ++) {\n        CFX_AffineMatrix image_matrix = pInlines->m_Matrices.GetAt(i);\n        image_matrix.Concat(*pObj2Device);\n        CPDF_ImageRenderer renderer;\n        if (renderer.Start(this, pInlines->m_pBitmap, fill_argb, bitmap_alpha, &image_matrix, flags, FALSE, m_curBlend)) {\n            renderer.Continue(NULL);\n        }\n    }\n    return TRUE;\n}\n#endif\nvoid CPDF_RenderStatus::CompositeDIBitmap(CFX_DIBitmap* pDIBitmap, int left, int top, FX_ARGB mask_argb,\n        int bitmap_alpha, int blend_mode, int Transparency)\n{\n    if (pDIBitmap == NULL) {\n        return;\n    }\n    FX_BOOL bIsolated = Transparency & PDFTRANS_ISOLATED;\n    FX_BOOL bGroup = Transparency & PDFTRANS_GROUP;\n    if (blend_mode == FXDIB_BLEND_NORMAL) {\n        if (!pDIBitmap->IsAlphaMask()) {\n            if (bitmap_alpha < 255) {\n                pDIBitmap->MultiplyAlpha(bitmap_alpha);\n            }\n            if (m_pDevice->SetDIBits(pDIBitmap, left, top)) {\n                return;\n            }\n        } else {\n            FX_DWORD fill_argb = m_Options.TranslateColor(mask_argb);\n            if (bitmap_alpha < 255) {\n                ((FX_BYTE*)&fill_argb)[3] = ((FX_BYTE*)&fill_argb)[3] * bitmap_alpha / 255;\n            }\n            if (m_pDevice->SetBitMask(pDIBitmap, left, top, fill_argb)) {\n                return;\n            }\n        }\n    }\n    FX_BOOL bBackAlphaRequired = blend_mode && bIsolated && !m_bDropObjects;\n    FX_BOOL bGetBackGround = ((m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT)) ||\n                             (!(m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT) && (m_pDevice->GetRenderCaps()\n                                     & FXRC_GET_BITS) && !bBackAlphaRequired);\n    if (bGetBackGround) {\n        if (bIsolated || !bGroup) {\n            if (pDIBitmap->IsAlphaMask()) {\n                return;\n            }\n            m_pDevice->SetDIBits(pDIBitmap, left, top, blend_mode);\n        } else {\n            FX_RECT rect(left, top, left + pDIBitmap->GetWidth(), top + pDIBitmap->GetHeight());\n            rect.Intersect(m_pDevice->GetClipBox());\n            CFX_DIBitmap* pClone = NULL;\n            FX_BOOL bClone = FALSE;\n            if (m_pDevice->GetBackDrop() && m_pDevice->GetBitmap()) {\n                bClone = TRUE;\n                pClone = m_pDevice->GetBackDrop()->Clone(&rect);\n                CFX_DIBitmap *pForeBitmap = m_pDevice->GetBitmap();\n                pClone->CompositeBitmap(0, 0, pClone->GetWidth(), pClone->GetHeight(), pForeBitmap, rect.left, rect.top);\n                left = left >= 0 ? 0 : left;\n                top = top >= 0 ? 0 : top;\n                if (!pDIBitmap->IsAlphaMask())\n                    pClone->CompositeBitmap(0, 0, pClone->GetWidth(), pClone->GetHeight(), pDIBitmap,\n                                            left, top, blend_mode);\n                else\n                    pClone->CompositeMask(0, 0, pClone->GetWidth(), pClone->GetHeight(), pDIBitmap,\n                                          mask_argb, left, top, blend_mode);\n            } else {\n                pClone = pDIBitmap;\n            }\n            if (m_pDevice->GetBackDrop()) {\n                m_pDevice->SetDIBits(pClone, rect.left, rect.top);\n            } else {\n                if (pDIBitmap->IsAlphaMask()) {\n                    return;\n                }\n                m_pDevice->SetDIBits(pDIBitmap, rect.left, rect.top, blend_mode);\n            }\n            if (bClone) {\n                delete pClone;\n            }\n        }\n        return;\n    }\n    int back_left, back_top;\n    FX_RECT rect(left, top, left + pDIBitmap->GetWidth(), top + pDIBitmap->GetHeight());\n    CFX_DIBitmap* pBackdrop = GetBackdrop(m_pCurObj, rect, back_left, back_top, blend_mode > FXDIB_BLEND_NORMAL && bIsolated);\n    if (!pBackdrop) {\n        return;\n    }\n    if (!pDIBitmap->IsAlphaMask())\n        pBackdrop->CompositeBitmap(left - back_left, top - back_top, pDIBitmap->GetWidth(), pDIBitmap->GetHeight(), pDIBitmap,\n                                   0, 0, blend_mode);\n    else\n        pBackdrop->CompositeMask(left - back_left, top - back_top, pDIBitmap->GetWidth(), pDIBitmap->GetHeight(), pDIBitmap,\n                                 mask_argb, 0, 0, blend_mode);\n    CFX_DIBitmap* pBackdrop1 = FX_NEW CFX_DIBitmap;\n    pBackdrop1->Create(pBackdrop->GetWidth(), pBackdrop->GetHeight(), FXDIB_Rgb32);\n    pBackdrop1->Clear((FX_DWORD) - 1);\n    pBackdrop1->CompositeBitmap(0, 0, pBackdrop->GetWidth(), pBackdrop->GetHeight(), pBackdrop, 0, 0);\n    delete pBackdrop;\n    pBackdrop = pBackdrop1;\n    m_pDevice->SetDIBits(pBackdrop, back_left, back_top);\n    delete pBackdrop;\n}\nFX_COLORREF CPDF_TransferFunc::TranslateColor(FX_COLORREF rgb)\n{\n    return FXSYS_RGB(m_Samples[FXSYS_GetRValue(rgb)], m_Samples[256 + FXSYS_GetGValue(rgb)],\n                     m_Samples[512 + FXSYS_GetBValue(rgb)]);\n}\nCFX_DIBSource* CPDF_TransferFunc::TranslateImage(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc)\n{\n    CPDF_DIBTransferFunc* pDest = FX_NEW CPDF_DIBTransferFunc(this);\n    pDest->LoadSrc(pSrc, bAutoDropSrc);\n    return pDest;\n}\nFXDIB_Format CPDF_DIBTransferFunc::GetDestFormat()\n{\n    if (m_pSrc->IsAlphaMask()) {\n        return FXDIB_8bppMask;\n    }\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n    return (m_pSrc->HasAlpha()) ? FXDIB_Argb : FXDIB_Rgb32;\n#else\n    return (m_pSrc->HasAlpha()) ? FXDIB_Argb : FXDIB_Rgb;\n#endif\n}\nCPDF_DIBTransferFunc::CPDF_DIBTransferFunc(const CPDF_TransferFunc* pTransferFunc)\n{\n    m_RampR = pTransferFunc->m_Samples;\n    m_RampG = &pTransferFunc->m_Samples[256];\n    m_RampB = &pTransferFunc->m_Samples[512];\n}\nvoid CPDF_DIBTransferFunc::TranslateScanline(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf) const\n{\n    int i;\n    FX_BOOL bSkip = FALSE;\n    switch (m_pSrc->GetFormat()) {\n        case FXDIB_1bppRgb: {\n                int r0 = m_RampR[0], g0 = m_RampG[0], b0 = m_RampB[0];\n                int r1 = m_RampR[255], g1 = m_RampG[255], b1 = m_RampB[255];\n                for (i = 0; i < m_Width; i ++) {\n                    if (src_buf[i / 8] & (1 << (7 - i % 8))) {\n                        *dest_buf++ = b1;\n                        *dest_buf++ = g1;\n                        *dest_buf++ = r1;\n                    } else {\n                        *dest_buf++ = b0;\n                        *dest_buf++ = g0;\n                        *dest_buf++ = r0;\n                    }\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n                    dest_buf++;\n#endif\n                }\n                break;\n            }\n        case FXDIB_1bppMask: {\n                int m0 = m_RampR[0], m1 = m_RampR[255];\n                for (i = 0; i < m_Width; i ++) {\n                    if (src_buf[i / 8] & (1 << (7 - i % 8))) {\n                        *dest_buf++ = m1;\n                    } else {\n                        *dest_buf++ = m0;\n                    }\n                }\n                break;\n            }\n        case FXDIB_8bppRgb: {\n                FX_ARGB* pPal = m_pSrc->GetPalette();\n                for (i = 0; i < m_Width; i ++) {\n                    if (pPal) {\n                        FX_ARGB src_argb = pPal[*src_buf];\n                        *dest_buf++ = m_RampB[FXARGB_R(src_argb)];\n                        *dest_buf++ = m_RampG[FXARGB_G(src_argb)];\n                        *dest_buf++ = m_RampR[FXARGB_B(src_argb)];\n                    } else {\n                        FX_DWORD src_byte = *src_buf;\n                        *dest_buf++ = m_RampB[src_byte];\n                        *dest_buf++ = m_RampG[src_byte];\n                        *dest_buf++ = m_RampR[src_byte];\n                    }\n                    src_buf ++;\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n                    dest_buf++;\n#endif\n                }\n                break;\n            }\n        case FXDIB_8bppMask:\n            for (i = 0; i < m_Width; i ++) {\n                *dest_buf++ = m_RampR[*(src_buf++)];\n            }\n            break;\n        case FXDIB_Rgb:\n            for (i = 0; i < m_Width; i ++) {\n                *dest_buf++ = m_RampB[*(src_buf++)];\n                *dest_buf++ = m_RampG[*(src_buf++)];\n                *dest_buf++ = m_RampR[*(src_buf++)];\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n                dest_buf++;\n#endif\n            }\n            break;\n        case FXDIB_Rgb32:\n            bSkip = TRUE;\n        case FXDIB_Argb:\n            for (i = 0; i < m_Width; i ++) {\n                *dest_buf++ = m_RampB[*(src_buf++)];\n                *dest_buf++ = m_RampG[*(src_buf++)];\n                *dest_buf++ = m_RampR[*(src_buf++)];\n                if (!bSkip) {\n                    *dest_buf++ = *src_buf;\n                }\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n                else {\n                    dest_buf++;\n                }\n#endif\n                src_buf ++;\n            }\n            break;\n        default:\n            break;\n    }\n}\nvoid CPDF_DIBTransferFunc::TranslateDownSamples(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels, int Bpp) const\n{\n    if (Bpp == 8) {\n        for (int i = 0; i < pixels; i ++) {\n            *dest_buf++ = m_RampR[*(src_buf++)];\n        }\n    } else if (Bpp == 24) {\n        for (int i = 0; i < pixels; i ++) {\n            *dest_buf++ = m_RampB[*(src_buf++)];\n            *dest_buf++ = m_RampG[*(src_buf++)];\n            *dest_buf++ = m_RampR[*(src_buf++)];\n        }\n    } else {\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n        if (!m_pSrc->HasAlpha()) {\n            for (int i = 0; i < pixels; i ++) {\n                *dest_buf++ = m_RampB[*(src_buf++)];\n                *dest_buf++ = m_RampG[*(src_buf++)];\n                *dest_buf++ = m_RampR[*(src_buf++)];\n                dest_buf++;\n                src_buf++;\n            }\n        } else\n#endif\n            for (int i = 0; i < pixels; i ++) {\n                *dest_buf++ = m_RampB[*(src_buf++)];\n                *dest_buf++ = m_RampG[*(src_buf++)];\n                *dest_buf++ = m_RampR[*(src_buf++)];\n                *dest_buf++ = *(src_buf++);\n            }\n    }\n}\nstatic FX_BOOL _IsSupported(CPDF_ColorSpace* pCS)\n{\n    if (pCS->GetFamily() == PDFCS_DEVICERGB || pCS->GetFamily() == PDFCS_DEVICEGRAY ||\n            pCS->GetFamily() == PDFCS_DEVICECMYK || pCS->GetFamily() == PDFCS_CALGRAY ||\n            pCS->GetFamily() == PDFCS_CALRGB) {\n        return TRUE;\n    }\n    if (pCS->GetFamily() == PDFCS_INDEXED && _IsSupported(pCS->GetBaseCS())) {\n        return TRUE;\n    }\n    return FALSE;\n}\nCPDF_ImageRenderer::CPDF_ImageRenderer()\n{\n    m_pRenderStatus = NULL;\n    m_pImageObject = NULL;\n    m_Result = TRUE;\n    m_Status = 0;\n    m_pQuickStretcher = NULL;\n    m_pTransformer = NULL;\n    m_DeviceHandle = NULL;\n    m_LoadHandle = NULL;\n    m_pClone = NULL;\n    m_bStdCS = FALSE;\n    m_bPatternColor = FALSE;\n    m_BlendType = FXDIB_BLEND_NORMAL;\n    m_pPattern = NULL;\n    m_pObj2Device = NULL;\n}\nCPDF_ImageRenderer::~CPDF_ImageRenderer()\n{\n    if (m_pQuickStretcher) {\n        delete m_pQuickStretcher;\n    }\n    if (m_pTransformer) {\n        delete m_pTransformer;\n    }\n    if (m_DeviceHandle) {\n        m_pRenderStatus->m_pDevice->CancelDIBits(m_DeviceHandle);\n    }\n    if (m_LoadHandle) {\n        delete (CPDF_ProgressiveImageLoaderHandle*)m_LoadHandle;\n    }\n    if (m_pClone) {\n        delete m_pClone;\n    }\n}\nFX_BOOL CPDF_ImageRenderer::StartLoadDIBSource()\n{\n    CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();\n    FX_RECT image_rect = image_rect_f.GetOutterRect();\n    int dest_width = image_rect.Width();\n    int dest_height = image_rect.Height();\n    if (m_ImageMatrix.a < 0) {\n        dest_width = -dest_width;\n    }\n    if (m_ImageMatrix.d > 0) {\n        dest_height = -dest_height;\n    }\n    if (m_Loader.StartLoadImage(m_pImageObject, m_pRenderStatus->m_pContext->m_pPageCache, m_LoadHandle, m_bStdCS,\n                                m_pRenderStatus->m_GroupFamily, m_pRenderStatus->m_bLoadMask, m_pRenderStatus, dest_width, dest_height)) {\n        if (m_LoadHandle != NULL) {\n            m_Status = 4;\n            return TRUE;\n        }\n        return FALSE;\n    }\n    return FALSE;\n}\nFX_BOOL CPDF_ImageRenderer::StartRenderDIBSource()\n{\n    if (m_Loader.m_pBitmap == NULL) {\n        return FALSE;\n    }\n    m_BitmapAlpha = 255;\n    const CPDF_GeneralStateData* pGeneralState = m_pImageObject->m_GeneralState;\n    if (pGeneralState) {\n        m_BitmapAlpha = FXSYS_round(pGeneralState->m_FillAlpha * 255);\n    }\n    m_pDIBSource = m_Loader.m_pBitmap;\n    if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_ALPHA && m_Loader.m_pMask == NULL) {\n        return StartBitmapAlpha();\n    }\n#ifndef _FPDFAPI_MINI_\n    if (pGeneralState && pGeneralState->m_pTR) {\n        if (!pGeneralState->m_pTransferFunc) {\n            ((CPDF_GeneralStateData*)pGeneralState)->m_pTransferFunc = m_pRenderStatus->GetTransferFunc(pGeneralState->m_pTR);\n        }\n        if (pGeneralState->m_pTransferFunc && !pGeneralState->m_pTransferFunc->m_bIdentity) {\n            m_pDIBSource = m_Loader.m_pBitmap = pGeneralState->m_pTransferFunc->TranslateImage(m_Loader.m_pBitmap, !m_Loader.m_bCached);\n            if (m_Loader.m_bCached && m_Loader.m_pMask) {\n                m_Loader.m_pMask = m_Loader.m_pMask->Clone();\n            }\n            m_Loader.m_bCached = FALSE;\n        }\n    }\n#endif\n    m_FillArgb = 0;\n    m_bPatternColor = FALSE;\n    m_pPattern = NULL;\n    if (m_pDIBSource->IsAlphaMask()) {\n        CPDF_Color* pColor = m_pImageObject->m_ColorState.GetFillColor();\n        if (pColor && pColor->IsPattern()) {\n            m_pPattern = pColor->GetPattern();\n            if (m_pPattern != NULL) {\n                m_bPatternColor = TRUE;\n            }\n        }\n        m_FillArgb = m_pRenderStatus->GetFillArgb(m_pImageObject);\n    } else if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_GRAY) {\n        m_pClone = m_pDIBSource->Clone();\n        m_pClone->ConvertColorScale(m_pRenderStatus->m_Options.m_BackColor, m_pRenderStatus->m_Options.m_ForeColor);\n        m_pDIBSource = m_pClone;\n    }\n    m_Flags = 0;\n#if !defined(_FPDFAPI_MINI_)\n    if (m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_DOWNSAMPLE) {\n        m_Flags |= RENDER_FORCE_DOWNSAMPLE;\n    } else if (m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_HALFTONE) {\n        m_Flags |= RENDER_FORCE_HALFTONE;\n    }\n#else\n    if (!(m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_HALFTONE)) {\n        if (m_pRenderStatus->m_HalftoneLimit) {\n            CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();\n            FX_RECT image_rect = image_rect_f.GetOutterRect();\n            FX_RECT image_clip = image_rect;\n            image_rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox());\n            if (image_rect.Width() && image_rect.Height()) {\n                if ((image_clip.Width() * m_pDIBSource->GetWidth() / image_rect.Width()) *\n                        (image_clip.Height() * m_pDIBSource->GetHeight() / image_rect.Height()) >\n                        m_pRenderStatus->m_HalftoneLimit) {\n                    m_Flags |= RENDER_FORCE_DOWNSAMPLE;\n                }\n            }\n        } else {\n            m_Flags |= RENDER_FORCE_DOWNSAMPLE;\n        }\n    }\n#endif\n#ifndef _FPDFAPI_MINI_\n    if (m_pRenderStatus->m_pDevice->GetDeviceClass() != FXDC_DISPLAY) {\n        CPDF_Object* pFilters = m_pImageObject->m_pImage->GetStream()->GetDict()->GetElementValue(FX_BSTRC(\"Filter\"));\n        if (pFilters) {\n            if (pFilters->GetType() == PDFOBJ_NAME) {\n                CFX_ByteStringC bsDecodeType = pFilters->GetConstString();\n                if (bsDecodeType == FX_BSTRC(\"DCTDecode\") || bsDecodeType == FX_BSTRC(\"JPXDecode\")) {\n                    m_Flags |= FXRENDER_IMAGE_LOSSY;\n                }\n            } else if (pFilters->GetType() == PDFOBJ_ARRAY) {\n                CPDF_Array* pArray = (CPDF_Array*)pFilters;\n                for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {\n                    CFX_ByteStringC bsDecodeType = pArray->GetConstString(i);\n                    if (bsDecodeType == FX_BSTRC(\"DCTDecode\") || bsDecodeType == FX_BSTRC(\"JPXDecode\")) {\n                        m_Flags |= FXRENDER_IMAGE_LOSSY;\n                        break;\n                    }\n                }\n            }\n        }\n    }\n    if (m_pRenderStatus->m_Options.m_Flags & RENDER_NOIMAGESMOOTH) {\n        m_Flags |= FXDIB_NOSMOOTH;\n    } else if (m_pImageObject->m_pImage->IsInterpol()) {\n        m_Flags |= FXDIB_INTERPOL;\n    }\n#endif\n    if (m_Loader.m_pMask) {\n        return DrawMaskedImage();\n    }\n    if (m_bPatternColor) {\n        return DrawPatternImage(m_pObj2Device);\n    }\n#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)\n    if (m_BitmapAlpha == 255 && pGeneralState && pGeneralState->m_FillOP &&\n            pGeneralState->m_OPMode == 0 && pGeneralState->m_BlendType == FXDIB_BLEND_NORMAL && pGeneralState->m_StrokeAlpha == 1 && pGeneralState->m_FillAlpha == 1) {\n        CPDF_Document* pDocument = NULL;\n        CPDF_Page* pPage = NULL;\n        if (m_pRenderStatus->m_pContext->m_pPageCache) {\n            pPage = m_pRenderStatus->m_pContext->m_pPageCache->GetPage();\n            pDocument = pPage->m_pDocument;\n        } else {\n            pDocument = m_pImageObject->m_pImage->GetDocument();\n        }\n        CPDF_Dictionary* pPageResources = pPage ? pPage->m_pPageResources : NULL;\n        CPDF_Object* pCSObj = m_pImageObject->m_pImage->GetStream()->GetDict()->GetElementValue(FX_BSTRC(\"ColorSpace\"));\n        CPDF_ColorSpace* pColorSpace = pDocument->LoadColorSpace(pCSObj, pPageResources);\n        if (pColorSpace) {\n            int format = pColorSpace->GetFamily();\n            if (format == PDFCS_DEVICECMYK || format == PDFCS_SEPARATION || format == PDFCS_DEVICEN) {\n                m_BlendType = FXDIB_BLEND_DARKEN;\n            }\n            pDocument->GetPageData()->ReleaseColorSpace(pCSObj);\n        }\n    }\n#endif\n    return StartDIBSource();\n}\nFX_BOOL CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStdCS, int blendType)\n{\n    m_pRenderStatus = pStatus;\n    m_bStdCS = bStdCS;\n    m_pImageObject = (CPDF_ImageObject*)pObj;\n    m_BlendType = blendType;\n    m_pObj2Device = pObj2Device;\n#ifndef _FPDFAPI_MINI_\n    CPDF_Dictionary* pOC = m_pImageObject->m_pImage->GetOC();\n    if (pOC && m_pRenderStatus->m_Options.m_pOCContext && !m_pRenderStatus->m_Options.m_pOCContext->CheckOCGVisible(pOC)) {\n        return FALSE;\n    }\n#endif\n    m_ImageMatrix = m_pImageObject->m_Matrix;\n    m_ImageMatrix.Concat(*pObj2Device);\n    if (StartLoadDIBSource()) {\n        return TRUE;\n    }\n    return StartRenderDIBSource();\n}\nFX_BOOL CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, const CFX_DIBSource* pDIBSource, FX_ARGB bitmap_argb,\n                                  int bitmap_alpha, const CFX_AffineMatrix* pImage2Device, FX_DWORD flags, FX_BOOL bStdCS, int blendType)\n{\n    m_pRenderStatus = pStatus;\n    m_pDIBSource = pDIBSource;\n    m_FillArgb = bitmap_argb;\n    m_BitmapAlpha = bitmap_alpha;\n    m_ImageMatrix = *pImage2Device;\n    m_Flags = flags;\n    m_bStdCS = bStdCS;\n    m_BlendType = blendType;\n    return StartDIBSource();\n}\nFX_BOOL\tCPDF_ImageRenderer::DrawPatternImage(const CFX_Matrix* pObj2Device)\n{\n    if (m_pRenderStatus->m_bPrint && !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {\n        m_Result = FALSE;\n        return FALSE;\n    }\n    FX_RECT rect = m_ImageMatrix.GetUnitRect().GetOutterRect();\n    rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox());\n    if (rect.IsEmpty()) {\n        return FALSE;\n    }\n    CFX_AffineMatrix new_matrix = m_ImageMatrix;\n    new_matrix.TranslateI(-rect.left, -rect.top);\n    int width = rect.Width();\n    int height = rect.Height();\n    CFX_FxgeDevice bitmap_device1;\n    if (!bitmap_device1.Create(rect.Width(), rect.Height(), FXDIB_Rgb32)) {\n        return TRUE;\n    }\n    bitmap_device1.GetBitmap()->Clear(0xffffff);\n    {\n        CPDF_RenderStatus bitmap_render;\n        bitmap_render.Initialize(m_pRenderStatus->m_Level + 1, m_pRenderStatus->m_pContext, &bitmap_device1, NULL, NULL,\n                                 NULL, NULL, &m_pRenderStatus->m_Options, 0, m_pRenderStatus->m_bDropObjects, NULL, TRUE);\n        CFX_Matrix patternDevice = *pObj2Device;\n        patternDevice.Translate((FX_FLOAT) - rect.left, (FX_FLOAT) - rect.top);\n        if(m_pPattern->m_PatternType == PATTERN_TILING) {\n            bitmap_render.DrawTilingPattern((CPDF_TilingPattern*)m_pPattern, m_pImageObject, &patternDevice, FALSE);\n        } else {\n            bitmap_render.DrawShadingPattern((CPDF_ShadingPattern*)m_pPattern, m_pImageObject, &patternDevice, FALSE);\n        }\n    }\n    {\n        CFX_FxgeDevice bitmap_device2;\n        if (!bitmap_device2.Create(rect.Width(), rect.Height(), FXDIB_8bppRgb)) {\n            return TRUE;\n        }\n        bitmap_device2.GetBitmap()->Clear(0);\n        CPDF_RenderStatus bitmap_render;\n        bitmap_render.Initialize(m_pRenderStatus->m_Level + 1, m_pRenderStatus->m_pContext, &bitmap_device2, NULL, NULL,\n                                 NULL, NULL, NULL, 0, m_pRenderStatus->m_bDropObjects, NULL, TRUE);\n        CPDF_ImageRenderer image_render;\n        if (image_render.Start(&bitmap_render, m_pDIBSource, 0xffffffff, 255, &new_matrix, m_Flags, TRUE)) {\n            image_render.Continue(NULL);\n        }\n        if (m_Loader.m_MatteColor != 0xffffffff) {\n            int matte_r = FXARGB_R(m_Loader.m_MatteColor);\n            int matte_g = FXARGB_G(m_Loader.m_MatteColor);\n            int matte_b = FXARGB_B(m_Loader.m_MatteColor);\n            for (int row = 0; row < height; row ++) {\n                FX_LPBYTE dest_scan = (FX_LPBYTE)bitmap_device1.GetBitmap()->GetScanline(row);\n                FX_LPCBYTE mask_scan = bitmap_device2.GetBitmap()->GetScanline(row);\n                for (int col = 0; col < width; col ++) {\n                    int alpha = *mask_scan ++;\n                    if (alpha) {\n                        int orig = (*dest_scan - matte_b) * 255 / alpha + matte_b;\n                        if (orig < 0) {\n                            orig = 0;\n                        } else if (orig > 255) {\n                            orig = 255;\n                        }\n                        *dest_scan++ = orig;\n                        orig = (*dest_scan - matte_g) * 255 / alpha + matte_g;\n                        if (orig < 0) {\n                            orig = 0;\n                        } else if (orig > 255) {\n                            orig = 255;\n                        }\n                        *dest_scan++ = orig;\n                        orig = (*dest_scan - matte_r) * 255 / alpha + matte_r;\n                        if (orig < 0) {\n                            orig = 0;\n                        } else if (orig > 255) {\n                            orig = 255;\n                        }\n                        *dest_scan++ = orig;\n                        dest_scan ++;\n                    } else {\n                        dest_scan += 4;\n                    }\n                }\n            }\n        }\n        bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_8bppMask);\n        bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap());\n        bitmap_device1.GetBitmap()->MultiplyAlpha(255);\n    }\n    m_pRenderStatus->m_pDevice->SetDIBits(bitmap_device1.GetBitmap(), rect.left, rect.top, m_BlendType);\n    return FALSE;\n}\nFX_BOOL CPDF_ImageRenderer::DrawMaskedImage()\n{\n    if (m_pRenderStatus->m_bPrint && !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {\n        m_Result = FALSE;\n        return FALSE;\n    }\n    FX_RECT rect = m_ImageMatrix.GetUnitRect().GetOutterRect();\n    rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox());\n    if (rect.IsEmpty()) {\n        return FALSE;\n    }\n    CFX_AffineMatrix new_matrix = m_ImageMatrix;\n    new_matrix.TranslateI(-rect.left, -rect.top);\n    int width = rect.Width();\n    int height = rect.Height();\n    CFX_FxgeDevice bitmap_device1;\n    if (!bitmap_device1.Create(width, height, FXDIB_Rgb32)) {\n        return TRUE;\n    }\n    bitmap_device1.GetBitmap()->Clear(0xffffff);\n    {\n        CPDF_RenderStatus bitmap_render;\n        bitmap_render.Initialize(m_pRenderStatus->m_Level + 1, m_pRenderStatus->m_pContext, &bitmap_device1, NULL, NULL,\n                                 NULL, NULL, NULL, 0, m_pRenderStatus->m_bDropObjects, NULL, TRUE);\n        CPDF_ImageRenderer image_render;\n        if (image_render.Start(&bitmap_render, m_pDIBSource, 0, 255, &new_matrix, m_Flags, TRUE)) {\n            image_render.Continue(NULL);\n        }\n    }\n    {\n        CFX_FxgeDevice bitmap_device2;\n        if (!bitmap_device2.Create(width, height, FXDIB_8bppRgb)) {\n            return TRUE;\n        }\n        bitmap_device2.GetBitmap()->Clear(0);\n        CPDF_RenderStatus bitmap_render;\n        bitmap_render.Initialize(m_pRenderStatus->m_Level + 1, m_pRenderStatus->m_pContext, &bitmap_device2, NULL, NULL,\n                                 NULL, NULL, NULL, 0, m_pRenderStatus->m_bDropObjects, NULL, TRUE);\n        CPDF_ImageRenderer image_render;\n        if (image_render.Start(&bitmap_render, m_Loader.m_pMask, 0xffffffff, 255, &new_matrix, m_Flags, TRUE)) {\n            image_render.Continue(NULL);\n        }\n        if (m_Loader.m_MatteColor != 0xffffffff) {\n            int matte_r = FXARGB_R(m_Loader.m_MatteColor);\n            int matte_g = FXARGB_G(m_Loader.m_MatteColor);\n            int matte_b = FXARGB_B(m_Loader.m_MatteColor);\n            for (int row = 0; row < height; row ++) {\n                FX_LPBYTE dest_scan = (FX_LPBYTE)bitmap_device1.GetBitmap()->GetScanline(row);\n                FX_LPCBYTE mask_scan = bitmap_device2.GetBitmap()->GetScanline(row);\n                for (int col = 0; col < width; col ++) {\n                    int alpha = *mask_scan ++;\n                    if (alpha) {\n                        int orig = (*dest_scan - matte_b) * 255 / alpha + matte_b;\n                        if (orig < 0) {\n                            orig = 0;\n                        } else if (orig > 255) {\n                            orig = 255;\n                        }\n                        *dest_scan++ = orig;\n                        orig = (*dest_scan - matte_g) * 255 / alpha + matte_g;\n                        if (orig < 0) {\n                            orig = 0;\n                        } else if (orig > 255) {\n                            orig = 255;\n                        }\n                        *dest_scan++ = orig;\n                        orig = (*dest_scan - matte_r) * 255 / alpha + matte_r;\n                        if (orig < 0) {\n                            orig = 0;\n                        } else if (orig > 255) {\n                            orig = 255;\n                        }\n                        *dest_scan++ = orig;\n                        dest_scan ++;\n                    } else {\n                        dest_scan += 4;\n                    }\n                }\n            }\n        }\n        bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_8bppMask);\n        bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap());\n        if (m_BitmapAlpha < 255) {\n            bitmap_device1.GetBitmap()->MultiplyAlpha(m_BitmapAlpha);\n        }\n    }\n    m_pRenderStatus->m_pDevice->SetDIBits(bitmap_device1.GetBitmap(), rect.left, rect.top, m_BlendType);\n    return FALSE;\n}\nFX_BOOL CPDF_ImageRenderer::StartDIBSource()\n{\n#if !defined(_FPDFAPI_MINI_)\n    if (!(m_Flags & RENDER_FORCE_DOWNSAMPLE) && m_pDIBSource->GetBPP() > 1) {\n        int image_size = m_pDIBSource->GetBPP() / 8 * m_pDIBSource->GetWidth() * m_pDIBSource->GetHeight();\n        if (image_size > FPDF_HUGE_IMAGE_SIZE && !(m_Flags & RENDER_FORCE_HALFTONE)) {\n            m_Flags |= RENDER_FORCE_DOWNSAMPLE;\n        }\n    }\n#endif\n    if (m_pRenderStatus->m_pDevice->StartDIBits(m_pDIBSource, m_BitmapAlpha, m_FillArgb,\n            &m_ImageMatrix, m_Flags, m_DeviceHandle, 0, NULL, m_BlendType)) {\n        if (m_DeviceHandle != NULL) {\n            m_Status = 3;\n            return TRUE;\n        }\n        return FALSE;\n    }\n#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)\n    CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();\n    FX_RECT image_rect = image_rect_f.GetOutterRect();\n    int dest_width = image_rect.Width();\n    int dest_height = image_rect.Height();\n    if ((FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || m_ImageMatrix.a == 0) ||\n            (FXSYS_fabs(m_ImageMatrix.c) >= 0.5f || m_ImageMatrix.d == 0) ) {\n        if (m_pRenderStatus->m_bPrint && !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {\n            m_Result = FALSE;\n            return FALSE;\n        }\n        FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox();\n        clip_box.Intersect(image_rect);\n        m_Status = 2;\n        m_pTransformer = FX_NEW CFX_ImageTransformer;\n        m_pTransformer->Start(m_pDIBSource, &m_ImageMatrix, m_Flags, &clip_box);\n        return TRUE;\n    }\n    if (m_ImageMatrix.a < 0) {\n        dest_width = -dest_width;\n    }\n    if (m_ImageMatrix.d > 0) {\n        dest_height = -dest_height;\n    }\n    int dest_left, dest_top;\n    dest_left = dest_width > 0 ? image_rect.left : image_rect.right;\n    dest_top = dest_height > 0 ? image_rect.top : image_rect.bottom;\n    if (m_pDIBSource->IsOpaqueImage() && m_BitmapAlpha == 255) {\n        if (m_pRenderStatus->m_pDevice->StretchDIBits(m_pDIBSource, dest_left, dest_top,\n                dest_width, dest_height, m_Flags, NULL, m_BlendType)) {\n            return FALSE;\n        }\n    }\n    if (m_pDIBSource->IsAlphaMask()) {\n        if (m_BitmapAlpha != 255) {\n            m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha);\n        }\n        if (m_pRenderStatus->m_pDevice->StretchBitMask(m_pDIBSource, dest_left, dest_top, dest_width, dest_height, m_FillArgb, m_Flags)) {\n            return FALSE;\n        }\n    }\n    if (m_pRenderStatus->m_bPrint && !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {\n        m_Result = FALSE;\n        return TRUE;\n    }\n    FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox();\n    FX_RECT dest_rect = clip_box;\n    dest_rect.Intersect(image_rect);\n    FX_RECT dest_clip(dest_rect.left - image_rect.left, dest_rect.top - image_rect.top,\n                      dest_rect.right - image_rect.left, dest_rect.bottom - image_rect.top);\n    CFX_DIBitmap* pStretched = m_pDIBSource->StretchTo(dest_width, dest_height, m_Flags, &dest_clip);\n    if (pStretched) {\n        m_pRenderStatus->CompositeDIBitmap(pStretched, dest_rect.left, dest_rect.top, m_FillArgb,\n                                           m_BitmapAlpha, m_BlendType, FALSE);\n        delete pStretched;\n        pStretched = NULL;\n    }\n#endif\n    return FALSE;\n}\nFX_BOOL CPDF_ImageRenderer::StartBitmapAlpha()\n{\n#ifndef _FPDFAPI_MINI_\n    if (m_pDIBSource->IsOpaqueImage()) {\n        CFX_PathData path;\n        path.AppendRect(0, 0, 1, 1);\n        path.Transform(&m_ImageMatrix);\n        FX_DWORD fill_color = ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha);\n        m_pRenderStatus->m_pDevice->DrawPath(&path, NULL, NULL, fill_color, 0, FXFILL_WINDING);\n    } else {\n        const CFX_DIBSource* pAlphaMask = m_pDIBSource->IsAlphaMask() ? m_pDIBSource : m_pDIBSource->GetAlphaMask();\n        if (FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || FXSYS_fabs(m_ImageMatrix.c) >= 0.5f) {\n            int left, top;\n            CFX_DIBitmap* pTransformed = pAlphaMask->TransformTo(&m_ImageMatrix, left, top);\n            if (pTransformed == NULL) {\n                return TRUE;\n            }\n            m_pRenderStatus->m_pDevice->SetBitMask(pTransformed, left, top, ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha));\n            delete pTransformed;\n        } else {\n            CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();\n            FX_RECT image_rect = image_rect_f.GetOutterRect();\n            int dest_width = m_ImageMatrix.a > 0 ? image_rect.Width() : -image_rect.Width();\n            int dest_height = m_ImageMatrix.d > 0 ? -image_rect.Height() : image_rect.Height();\n            int left = dest_width > 0 ? image_rect.left : image_rect.right;\n            int top = dest_height > 0 ? image_rect.top : image_rect.bottom;\n            m_pRenderStatus->m_pDevice->StretchBitMask(pAlphaMask, left, top, dest_width, dest_height,\n                    ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha));\n        }\n        if (m_pDIBSource != pAlphaMask) {\n            delete pAlphaMask;\n        }\n    }\n#endif\n    return FALSE;\n}\nFX_BOOL CPDF_ImageRenderer::Continue(IFX_Pause* pPause)\n{\n    if (m_Status == 1) {\n#ifndef _FPDFAPI_MINI_\n        if (m_pQuickStretcher->Continue(pPause)) {\n            return TRUE;\n        }\n        if (m_pQuickStretcher->m_pBitmap->IsAlphaMask())\n            m_pRenderStatus->m_pDevice->SetBitMask(m_pQuickStretcher->m_pBitmap, m_pQuickStretcher->m_ResultLeft,\n                                                   m_pQuickStretcher->m_ResultTop, m_FillArgb);\n        else\n            m_pRenderStatus->m_pDevice->SetDIBits(m_pQuickStretcher->m_pBitmap, m_pQuickStretcher->m_ResultLeft,\n                                                  m_pQuickStretcher->m_ResultTop, m_BlendType);\n        return FALSE;\n#endif\n    } else if (m_Status == 2) {\n#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)\n        if (m_pTransformer->Continue(pPause)) {\n            return TRUE;\n        }\n        CFX_DIBitmap* pBitmap = m_pTransformer->m_Storer.Detach();\n        if (pBitmap == NULL) {\n            return FALSE;\n        }\n        if (pBitmap->IsAlphaMask()) {\n            if (m_BitmapAlpha != 255) {\n                m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha);\n            }\n            m_Result = m_pRenderStatus->m_pDevice->SetBitMask(pBitmap,\n                       m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop, m_FillArgb);\n        } else {\n            if (m_BitmapAlpha != 255) {\n                pBitmap->MultiplyAlpha(m_BitmapAlpha);\n            }\n            m_Result = m_pRenderStatus->m_pDevice->SetDIBits(pBitmap,\n                       m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop, m_BlendType);\n        }\n        delete pBitmap;\n        return FALSE;\n#endif\n    } else if (m_Status == 3) {\n        return m_pRenderStatus->m_pDevice->ContinueDIBits(m_DeviceHandle, pPause);\n    } else if (m_Status == 4) {\n        if (m_Loader.Continue(m_LoadHandle, pPause)) {\n            return TRUE;\n        }\n        if (StartRenderDIBSource()) {\n            return Continue(pPause);\n        }\n        return FALSE;\n    }\n    return FALSE;\n}\nCPDF_QuickStretcher::CPDF_QuickStretcher()\n{\n    m_pBitmap = NULL;\n    m_pDecoder = NULL;\n    m_pCS = NULL;\n}\nCPDF_QuickStretcher::~CPDF_QuickStretcher()\n{\n    if (m_pBitmap) {\n        delete m_pBitmap;\n    }\n    if (m_pCS) {\n        m_pCS->ReleaseCS();\n    }\n    if (m_pDecoder) {\n        delete m_pDecoder;\n    }\n}\nICodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,\n        int nComps, int bpc, const CPDF_Dictionary* pParams);\nFX_BOOL CPDF_QuickStretcher::Start(CPDF_ImageObject* pImageObj, CFX_AffineMatrix* pImage2Device, const FX_RECT* pClipBox)\n{\n    if (FXSYS_fabs(pImage2Device->a) < FXSYS_fabs(pImage2Device->b) * 10 && FXSYS_fabs(pImage2Device->d) < FXSYS_fabs(pImage2Device->c) * 10) {\n        return FALSE;\n    }\n    CFX_FloatRect image_rect_f = pImage2Device->GetUnitRect();\n    FX_RECT image_rect = image_rect_f.GetOutterRect();\n    m_DestWidth = image_rect.Width();\n    m_DestHeight = image_rect.Height();\n    m_bFlipX = pImage2Device->a < 0;\n    m_bFlipY = pImage2Device->d > 0;\n    FX_RECT result_rect = *pClipBox;\n    result_rect.Intersect(image_rect);\n    if (result_rect.IsEmpty()) {\n        return FALSE;\n    }\n    m_ResultWidth = result_rect.Width();\n    m_ResultHeight = result_rect.Height();\n    m_ResultLeft = result_rect.left;\n    m_ResultTop = result_rect.top;\n    m_ClipLeft = result_rect.left - image_rect.left;\n    m_ClipTop = result_rect.top - image_rect.top;\n    CPDF_Dictionary* pDict = pImageObj->m_pImage->GetDict();\n    if (pDict->GetInteger(FX_BSTRC(\"BitsPerComponent\")) != 8) {\n        return FALSE;\n    }\n    if (pDict->KeyExist(FX_BSTRC(\"SMask\")) || pDict->KeyExist(FX_BSTRC(\"Mask\"))) {\n        return FALSE;\n    }\n    m_SrcWidth = pDict->GetInteger(FX_BSTRC(\"Width\"));\n    m_SrcHeight = pDict->GetInteger(FX_BSTRC(\"Height\"));\n    m_pCS = NULL;\n    m_Bpp = 3;\n    CPDF_Object* pCSObj = pDict->GetElementValue(FX_BSTRC(\"ColorSpace\"));\n    if (pCSObj == NULL) {\n        return FALSE;\n    }\n    m_pCS = CPDF_ColorSpace::Load(pImageObj->m_pImage->GetDocument(), pCSObj);\n    if (m_pCS == NULL) {\n        return FALSE;\n    }\n    if (!_IsSupported(m_pCS)) {\n        return FALSE;\n    }\n    m_Bpp = m_pCS->CountComponents();\n    if (m_pCS->sRGB()) {\n        m_pCS->ReleaseCS();\n        m_pCS = NULL;\n    }\n    CPDF_Stream* pStream = pImageObj->m_pImage->GetStream();\n    m_StreamAcc.LoadAllData(pStream, FALSE, m_SrcWidth * m_SrcHeight * m_Bpp, TRUE);\n    m_pDecoder = NULL;\n    if (!m_StreamAcc.GetImageDecoder().IsEmpty()) {\n        if (m_StreamAcc.GetImageDecoder() == FX_BSTRC(\"DCTDecode\")) {\n            const CPDF_Dictionary* pParam = m_StreamAcc.GetImageParam();\n            m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder(\n                             m_StreamAcc.GetData(), m_StreamAcc.GetSize(), m_SrcWidth, m_SrcHeight, m_Bpp,\n                             pParam ? pParam->GetInteger(FX_BSTRC(\"ColorTransform\"), 1) : 1);\n        } else if (m_StreamAcc.GetImageDecoder() == FX_BSTRC(\"FlateDecode\")) {\n            m_pDecoder = FPDFAPI_CreateFlateDecoder(\n                             m_StreamAcc.GetData(), m_StreamAcc.GetSize(), m_SrcWidth, m_SrcHeight, m_Bpp, 8,\n                             m_StreamAcc.GetImageParam());\n        } else {\n            return FALSE;\n        }\n        m_pDecoder->DownScale(m_DestWidth, m_DestHeight);\n    }\n    m_pBitmap = FX_NEW CFX_DIBitmap;\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n    m_pBitmap->Create(m_ResultWidth, m_ResultHeight, FXDIB_Rgb32);\n#else\n    m_pBitmap->Create(m_ResultWidth, m_ResultHeight, FXDIB_Rgb);\n#endif\n    m_LineIndex = 0;\n    return TRUE;\n}\nFX_BOOL CPDF_QuickStretcher::Continue(IFX_Pause* pPause)\n{\n    FX_LPBYTE result_buf = m_pBitmap->GetBuffer();\n    int src_width = m_pDecoder ? m_pDecoder->GetWidth() : m_SrcWidth;\n    int src_height = m_pDecoder ? m_pDecoder->GetHeight() : m_SrcHeight;\n    int src_pitch = src_width * m_Bpp;\n    while (m_LineIndex < m_ResultHeight) {\n        int dest_y, src_y;\n        if (m_bFlipY) {\n            dest_y = m_ResultHeight - m_LineIndex - 1;\n            src_y = (m_DestHeight - (dest_y + m_ClipTop) - 1) * src_height / m_DestHeight;\n        } else {\n            dest_y = m_LineIndex;\n            src_y = (dest_y + m_ClipTop) * src_height / m_DestHeight;\n        }\n        FX_LPCBYTE src_scan;\n        if (m_pDecoder) {\n            src_scan = m_pDecoder->GetScanline(src_y);\n            if (src_scan == NULL) {\n                break;\n            }\n        } else {\n            src_scan = m_StreamAcc.GetData();\n            if (src_scan == NULL) {\n                break;\n            }\n            src_scan += src_y * src_pitch;\n        }\n        FX_LPBYTE result_scan = result_buf + dest_y * m_pBitmap->GetPitch();\n        for (int x = 0; x < m_ResultWidth; x ++) {\n            int dest_x = m_ClipLeft + x;\n            int src_x = (m_bFlipX ? (m_DestWidth - dest_x - 1) : dest_x) * src_width / m_DestWidth;\n            FX_LPCBYTE src_pixel = src_scan + src_x * m_Bpp;\n            if (m_pCS == NULL) {\n                *result_scan = src_pixel[2];\n                result_scan ++;\n                *result_scan = src_pixel[1];\n                result_scan ++;\n                *result_scan = src_pixel[0];\n                result_scan ++;\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n                result_scan ++;\n#endif\n            } else {\n                m_pCS->TranslateImageLine(result_scan, src_pixel, 1, 0, 0);\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n                result_scan += 4;\n#else\n                result_scan += 3;\n#endif\n            }\n        }\n        m_LineIndex ++;\n        if (pPause && pPause->NeedToPauseNow()) {\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nCFX_DIBitmap* CPDF_RenderStatus::LoadSMask(CPDF_Dictionary* pSMaskDict,\n        FX_RECT* pClipRect, const CFX_AffineMatrix* pMatrix)\n{\n    if (pSMaskDict == NULL) {\n        return NULL;\n    }\n    CFX_DIBitmap* pMask = NULL;\n    int width = pClipRect->right - pClipRect->left;\n    int height = pClipRect->bottom - pClipRect->top;\n    FX_BOOL bLuminosity = FALSE;\n    bLuminosity = pSMaskDict->GetConstString(FX_BSTRC(\"S\")) != FX_BSTRC(\"Alpha\");\n    CPDF_Stream* pGroup = pSMaskDict->GetStream(FX_BSTRC(\"G\"));\n    if (pGroup == NULL) {\n        return NULL;\n    }\n    CPDF_Function* pFunc = NULL;\n    CPDF_Object* pFuncObj = pSMaskDict->GetElementValue(FX_BSTRC(\"TR\"));\n    if (pFuncObj && (pFuncObj->GetType() == PDFOBJ_DICTIONARY || pFuncObj->GetType() == PDFOBJ_STREAM)) {\n        pFunc = CPDF_Function::Load(pFuncObj);\n    }\n    CFX_AffineMatrix matrix = *pMatrix;\n    matrix.TranslateI(-pClipRect->left, -pClipRect->top);\n    CPDF_Form form(m_pContext->m_pDocument, m_pContext->m_pPageResources, pGroup);\n    form.ParseContent(NULL, NULL, NULL, NULL);\n    CFX_FxgeDevice bitmap_device;\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n    if (!bitmap_device.Create(width, height, bLuminosity ? FXDIB_Rgb32 : FXDIB_8bppMask)) {\n        return NULL;\n    }\n#else\n    if (!bitmap_device.Create(width, height, bLuminosity ? FXDIB_Rgb : FXDIB_8bppMask)) {\n        return NULL;\n    }\n#endif\n    CFX_DIBitmap& bitmap = *bitmap_device.GetBitmap();\n    CPDF_Object* pCSObj = NULL;\n    CPDF_ColorSpace* pCS = NULL;\n    if (bLuminosity) {\n        CPDF_Array* pBC = pSMaskDict->GetArray(FX_BSTRC(\"BC\"));\n        FX_ARGB back_color = 0xff000000;\n        if (pBC) {\n            CPDF_Dictionary* pDict = pGroup->GetDict();\n            if (pDict && pDict->GetDict(FX_BSTRC(\"Group\")))\n                pCSObj = pDict->GetDict(FX_BSTRC(\"Group\"))->GetElementValue(FX_BSTRC(\"CS\"));\n            else\n                pCSObj = NULL;\n            pCS = m_pContext->m_pDocument->LoadColorSpace(pCSObj);\n            if (pCS) {\n                FX_FLOAT R, G, B;\n                FX_DWORD num_floats = 8;\n                if (pCS->CountComponents() > (FX_INT32)num_floats) {\n                    num_floats = (FX_DWORD)pCS->CountComponents();\n                }\n                CFX_FixedBufGrow<FX_FLOAT, 8> float_array(num_floats);\n                FX_FLOAT* pFloats = float_array;\n                FXSYS_memset32(pFloats, 0, num_floats * sizeof(FX_FLOAT));\n                int count = pBC->GetCount() > 8 ? 8 : pBC->GetCount();\n                for (int i = 0; i < count; i ++) {\n                    pFloats[i] = pBC->GetNumber(i);\n                }\n                pCS->GetRGB(pFloats, R, G, B);\n                back_color = 0xff000000 | ((FX_INT32)(R * 255) << 16) | ((FX_INT32)(G * 255) << 8) | (FX_INT32)(B * 255);\n                m_pContext->m_pDocument->GetPageData()->ReleaseColorSpace(pCSObj);\n            }\n        }\n        bitmap.Clear(back_color);\n    } else {\n        bitmap.Clear(0);\n    }\n    CPDF_Dictionary* pFormResource = NULL;\n    if (form.m_pFormDict) {\n        pFormResource = form.m_pFormDict->GetDict(FX_BSTRC(\"Resources\"));\n    }\n    CPDF_RenderOptions options;\n    options.m_ColorMode = bLuminosity ? RENDER_COLOR_NORMAL : RENDER_COLOR_ALPHA;\n    CPDF_RenderStatus status;\n    status.Initialize(m_Level + 1, m_pContext, &bitmap_device, NULL, NULL, NULL, NULL,\n                      &options, 0, m_bDropObjects, pFormResource, TRUE, NULL, 0, pCS ? pCS->GetFamily() : 0, bLuminosity);\n    status.RenderObjectList(&form, &matrix);\n    pMask = FX_NEW CFX_DIBitmap;\n    if (!pMask->Create(width, height, FXDIB_8bppMask)) {\n        delete pMask;\n        return NULL;\n    }\n    FX_LPBYTE dest_buf = pMask->GetBuffer();\n    int dest_pitch = pMask->GetPitch();\n    FX_LPBYTE src_buf = bitmap.GetBuffer();\n    int src_pitch = bitmap.GetPitch();\n    FX_LPBYTE pTransfer = FX_Alloc(FX_BYTE, 256);\n    if (pFunc) {\n        CFX_FixedBufGrow<FX_FLOAT, 16> results(pFunc->CountOutputs());\n        for (int i = 0; i < 256; i ++) {\n            FX_FLOAT input = (FX_FLOAT)i / 255.0f;\n            int nresult;\n            pFunc->Call(&input, 1, results, nresult);\n            pTransfer[i] = FXSYS_round(results[0] * 255);\n        }\n    } else {\n        for (int i = 0; i < 256; i ++) {\n            pTransfer[i] = i;\n        }\n    }\n    if (bLuminosity) {\n        int Bpp = bitmap.GetBPP() / 8;\n        for (int row = 0; row < height; row ++) {\n            FX_LPBYTE dest_pos = dest_buf + row * dest_pitch;\n            FX_LPBYTE src_pos = src_buf + row * src_pitch;\n            for (int col = 0; col < width; col ++) {\n                *dest_pos ++ = pTransfer[FXRGB2GRAY(src_pos[2], src_pos[1], *src_pos)];\n                src_pos += Bpp;\n            }\n        }\n    } else if (pFunc) {\n        int size = dest_pitch * height;\n        for (int i = 0; i < size; i ++) {\n            dest_buf[i] = pTransfer[src_buf[i]];\n        }\n    } else {\n        FXSYS_memcpy32(dest_buf, src_buf, dest_pitch * height);\n    }\n    if (pFunc) {\n        delete pFunc;\n    }\n    FX_Free(pTransfer);\n    return pMask;\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxge/fx_ge.h\"\n#include \"../../../include/fxcodec/fx_codec.h\"\n#include \"../../../include/fpdfapi/fpdf_module.h\"\n#include \"../../../include/fpdfapi/fpdf_render.h\"\n#include \"../../../include/fpdfapi/fpdf_pageobj.h\"\n#include \"../fpdf_page/pageint.h\"\n#include \"render_int.h\"\n#include <limits.h>\nstatic unsigned int _GetBits8(FX_LPCBYTE pData, int bitpos, int nbits)\n{\n    unsigned int byte = pData[bitpos / 8];\n    if (nbits == 8) {\n        return byte;\n    } else if (nbits == 4) {\n        return (bitpos % 8) ? (byte & 0x0f) : (byte >> 4);\n    } else if (nbits == 2) {\n        return (byte >> (6 - bitpos % 8)) & 0x03;\n    } else if (nbits == 1) {\n        return (byte >> (7 - bitpos % 8)) & 0x01;\n    } else if (nbits == 16) {\n        return byte * 256 + pData[bitpos / 8 + 1];\n    }\n    return 0;\n}\nCFX_DIBSource* CPDF_Image::LoadDIBSource(CFX_DIBSource** ppMask, FX_DWORD* pMatteColor, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask) const\n{\n    CPDF_DIBSource* pSource = FX_NEW CPDF_DIBSource;\n    if (pSource->Load(m_pDocument, m_pStream, (CPDF_DIBSource**)ppMask, pMatteColor, NULL, NULL, bStdCS, GroupFamily, bLoadMask)) {\n        return pSource;\n    }\n    delete pSource;\n    return NULL;\n}\nCFX_DIBSource* CPDF_Image::DetachBitmap()\n{\n    CFX_DIBSource* pBitmap = m_pDIBSource;\n    m_pDIBSource = NULL;\n    return pBitmap;\n}\nCFX_DIBSource* CPDF_Image::DetachMask()\n{\n    CFX_DIBSource* pBitmap = m_pMask;\n    m_pMask = NULL;\n    return pBitmap;\n}\nFX_BOOL CPDF_Image::StartLoadDIBSource(CPDF_Dictionary* pFormResource, CPDF_Dictionary* pPageResource, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask)\n{\n    m_pDIBSource = FX_NEW CPDF_DIBSource;\n    int ret = ((CPDF_DIBSource*)m_pDIBSource)->StartLoadDIBSource(m_pDocument, m_pStream, TRUE, pFormResource, pPageResource, bStdCS, GroupFamily, bLoadMask);\n    if (ret == 2) {\n        return TRUE;\n    }\n    if (!ret) {\n        delete m_pDIBSource;\n        m_pDIBSource = NULL;\n        return FALSE;\n    }\n    m_pMask = ((CPDF_DIBSource*)m_pDIBSource)->DetachMask();\n    m_MatteColor = ((CPDF_DIBSource*)m_pDIBSource)->m_MatteColor;\n    return FALSE;\n}\nFX_BOOL CPDF_Image::Continue(IFX_Pause* pPause)\n{\n    int ret = ((CPDF_DIBSource*)m_pDIBSource)->ContinueLoadDIBSource(pPause);\n    if (ret == 2) {\n        return TRUE;\n    }\n    if (!ret) {\n        delete m_pDIBSource;\n        m_pDIBSource = NULL;\n        return FALSE;\n    }\n    m_pMask = ((CPDF_DIBSource*)m_pDIBSource)->DetachMask();\n    m_MatteColor = ((CPDF_DIBSource*)m_pDIBSource)->m_MatteColor;\n    return FALSE;\n}\nCPDF_DIBSource::CPDF_DIBSource()\n{\n    m_pDocument = NULL;\n    m_pStreamAcc = NULL;\n    m_pDict = NULL;\n    m_bpp = 0;\n    m_Width = m_Height = 0;\n    m_pColorSpace = NULL;\n    m_bDefaultDecode = TRUE;\n    m_bImageMask = FALSE;\n    m_pPalette = NULL;\n    m_pCompData = NULL;\n    m_bColorKey = FALSE;\n    m_pMaskedLine = m_pLineBuf = NULL;\n    m_pCachedBitmap = NULL;\n    m_pDecoder = NULL;\n    m_nComponents = 0;\n    m_bpc = 0;\n    m_bLoadMask = FALSE;\n    m_Family = 0;\n    m_pMask = NULL;\n    m_MatteColor = 0;\n    m_pJbig2Context = NULL;\n    m_pGlobalStream = NULL;\n    m_bStdCS = FALSE;\n    m_pMaskStream = NULL;\n    m_Status = 0;\n    m_bHasMask = FALSE;\n}\nCPDF_DIBSource::~CPDF_DIBSource()\n{\n    if (m_pStreamAcc) {\n        delete m_pStreamAcc;\n    }\n    if (m_pMaskedLine) {\n        FX_Free(m_pMaskedLine);\n    }\n    if (m_pLineBuf) {\n        FX_Free(m_pLineBuf);\n    }\n    if (m_pCachedBitmap) {\n        delete m_pCachedBitmap;\n    }\n    if (m_pDecoder) {\n        delete m_pDecoder;\n    }\n    if (m_pCompData) {\n        FX_Free(m_pCompData);\n    }\n    CPDF_ColorSpace* pCS = m_pColorSpace;\n    if (pCS && m_pDocument) {\n        m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray());\n    }\n    if (m_pJbig2Context) {\n        ICodec_Jbig2Module* pJbig2Moudle = CPDF_ModuleMgr::Get()->GetJbig2Module();\n        pJbig2Moudle->DestroyJbig2Context(m_pJbig2Context);\n        m_pJbig2Context = NULL;\n    }\n    if (m_pGlobalStream) {\n        delete m_pGlobalStream;\n    }\n    m_pGlobalStream = NULL;\n}\nCFX_DIBitmap* CPDF_DIBSource::GetBitmap() const\n{\n    if (m_pCachedBitmap) {\n        return m_pCachedBitmap;\n    }\n    return Clone();\n}\nvoid CPDF_DIBSource::ReleaseBitmap(CFX_DIBitmap* pBitmap) const\n{\n    if (pBitmap && pBitmap != m_pCachedBitmap) {\n        delete pBitmap;\n    }\n}\nFX_BOOL CPDF_DIBSource::Load(CPDF_Document* pDoc, const CPDF_Stream* pStream, CPDF_DIBSource** ppMask,\n                             FX_DWORD* pMatteColor, CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask)\n{\n    if (pStream == NULL) {\n        return FALSE;\n    }\n    m_pDocument = pDoc;\n    m_pDict = pStream->GetDict();\n    m_pStream = pStream;\n    m_Width = m_pDict->GetInteger(FX_BSTRC(\"Width\"));\n    m_Height = m_pDict->GetInteger(FX_BSTRC(\"Height\"));\n    if (m_Width <= 0 || m_Height <= 0 || m_Width > 0x01ffff || m_Height > 0x01ffff) {\n        return FALSE;\n    }\n    m_GroupFamily = GroupFamily;\n    m_bLoadMask = bLoadMask;\n    if (!LoadColorInfo(m_pStream->GetObjNum() != 0 ? NULL : pFormResources, pPageResources)) {\n        return FALSE;\n    }\n    FX_DWORD src_pitch = m_bpc;\n    if (m_bpc != 0 && m_nComponents != 0) {\n        if (src_pitch > 0 && m_nComponents > (unsigned)INT_MAX / src_pitch) {\n            return FALSE;\n        }\n        src_pitch *= m_nComponents;\n        if (src_pitch > 0 && (FX_DWORD)m_Width > (unsigned)INT_MAX / src_pitch) {\n            return FALSE;\n        }\n        src_pitch *= m_Width;\n        if (src_pitch + 7 < src_pitch) {\n            return FALSE;\n        }\n        src_pitch += 7;\n        src_pitch /= 8;\n        if (src_pitch > 0 && (FX_DWORD)m_Height > (unsigned)INT_MAX / src_pitch) {\n            return FALSE;\n        }\n    }\n    m_pStreamAcc = FX_NEW CPDF_StreamAcc;\n    m_pStreamAcc->LoadAllData(pStream, FALSE, m_Height * src_pitch, TRUE);\n    if (m_pStreamAcc->GetSize() == 0 || m_pStreamAcc->GetData() == NULL) {\n        return FALSE;\n    }\n    const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder();\n    if (!decoder.IsEmpty() && decoder == FX_BSTRC(\"CCITTFaxDecode\")) {\n        m_bpc = 1;\n    }\n    if (!CreateDecoder()) {\n        return FALSE;\n    }\n    if (m_bImageMask) {\n        m_bpp = 1;\n        m_bpc = 1;\n        m_nComponents = 1;\n        m_AlphaFlag = 1;\n    } else if (m_bpc * m_nComponents == 1) {\n        m_bpp = 1;\n    } else if (m_bpc * m_nComponents <= 8) {\n        m_bpp = 8;\n    } else {\n        m_bpp = 24;\n    }\n    if (!m_bpc || !m_nComponents) {\n        return FALSE;\n    }\n    m_Pitch = m_Width;\n    if ((FX_DWORD)m_bpp > (unsigned)INT_MAX / m_Pitch) {\n        return FALSE;\n    }\n    m_Pitch *= m_bpp;\n    if (m_Pitch + 31 < m_Pitch) {\n        return FALSE;\n    }\n    m_Pitch += 31;\n    m_Pitch = m_Pitch / 32 * 4;\n    m_pLineBuf = FX_Alloc(FX_BYTE, m_Pitch);\n    if (m_pColorSpace && bStdCS) {\n        m_pColorSpace->EnableStdConversion(TRUE);\n    }\n    LoadPalette();\n    if (m_bColorKey) {\n        m_bpp = 32;\n        m_AlphaFlag = 2;\n        m_Pitch = m_Width;\n        if ((FX_DWORD)m_bpp > (unsigned)INT_MAX / m_Pitch) {\n            return FALSE;\n        }\n        m_Pitch *= m_bpp;\n        if (m_Pitch + 31 < m_Pitch) {\n            return FALSE;\n        }\n        m_Pitch += 31;\n        m_Pitch = m_Pitch / 32 * 4;\n        m_pMaskedLine = FX_Alloc(FX_BYTE, m_Pitch);\n    }\n    if (ppMask) {\n        *ppMask = LoadMask(*pMatteColor);\n    }\n    if (m_pColorSpace && bStdCS) {\n        m_pColorSpace->EnableStdConversion(FALSE);\n    }\n    return TRUE;\n}\nint\tCPDF_DIBSource::ContinueToLoadMask()\n{\n    if (m_bImageMask) {\n        m_bpp = 1;\n        m_bpc = 1;\n        m_nComponents = 1;\n        m_AlphaFlag = 1;\n    } else if (m_bpc * m_nComponents == 1) {\n        m_bpp = 1;\n    } else if (m_bpc * m_nComponents <= 8) {\n        m_bpp = 8;\n    } else {\n        m_bpp = 24;\n    }\n    if (!m_bpc || !m_nComponents) {\n        return 0;\n    }\n    m_Pitch = m_Width;\n    if ((FX_DWORD)m_bpp > (unsigned)INT_MAX / m_Pitch) {\n        return 0;\n    }\n    m_Pitch *= m_bpp;\n    if (m_Pitch + 31 < m_Pitch) {\n        return 0;\n    }\n    m_Pitch += 31;\n    m_Pitch = m_Pitch / 32 * 4;\n    m_pLineBuf = FX_Alloc(FX_BYTE, m_Pitch);\n    if (m_pColorSpace && m_bStdCS) {\n        m_pColorSpace->EnableStdConversion(TRUE);\n    }\n    LoadPalette();\n    if (m_bColorKey) {\n        m_bpp = 32;\n        m_AlphaFlag = 2;\n        m_Pitch = m_Width;\n        if ((FX_DWORD)m_bpp > (unsigned)INT_MAX / m_Pitch) {\n            return 0;\n        }\n        m_Pitch *= m_bpp;\n        if (m_Pitch + 31 < m_Pitch) {\n            return 0;\n        }\n        m_Pitch += 31;\n        m_Pitch = m_Pitch / 32 * 4;\n        m_pMaskedLine = FX_Alloc(FX_BYTE, m_Pitch);\n    }\n    return 1;\n}\nint\tCPDF_DIBSource::StartLoadDIBSource(CPDF_Document* pDoc, const CPDF_Stream* pStream, FX_BOOL bHasMask,\n                                       CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources,\n                                       FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask)\n{\n    if (pStream == NULL) {\n        return 0;\n    }\n    m_pDocument = pDoc;\n    m_pDict = pStream->GetDict();\n    m_pStream = pStream;\n    m_bStdCS = bStdCS;\n    m_bHasMask = bHasMask;\n    m_Width = m_pDict->GetInteger(FX_BSTRC(\"Width\"));\n    m_Height = m_pDict->GetInteger(FX_BSTRC(\"Height\"));\n    if (m_Width <= 0 || m_Height <= 0 || m_Width > 0x01ffff || m_Height > 0x01ffff) {\n        return 0;\n    }\n    m_GroupFamily = GroupFamily;\n    m_bLoadMask = bLoadMask;\n    if (!LoadColorInfo(m_pStream->GetObjNum() != 0 ? NULL : pFormResources, pPageResources)) {\n        return 0;\n    }\n    FX_DWORD src_pitch = m_bpc;\n    if (m_bpc != 0 && m_nComponents != 0) {\n        if (src_pitch > 0 && m_nComponents > (unsigned)INT_MAX / src_pitch) {\n            return 0;\n        }\n        src_pitch *= m_nComponents;\n        if (src_pitch > 0 && (FX_DWORD)m_Width > (unsigned)INT_MAX / src_pitch) {\n            return 0;\n        }\n        src_pitch *= m_Width;\n        if (src_pitch + 7 < src_pitch) {\n            return 0;\n        }\n        src_pitch += 7;\n        src_pitch /= 8;\n        if (src_pitch > 0 && (FX_DWORD)m_Height > (unsigned)INT_MAX / src_pitch) {\n            return 0;\n        }\n    }\n    m_pStreamAcc = FX_NEW CPDF_StreamAcc;\n    m_pStreamAcc->LoadAllData(pStream, FALSE, m_Height * src_pitch, TRUE);\n    if (m_pStreamAcc->GetSize() == 0 || m_pStreamAcc->GetData() == NULL) {\n        return 0;\n    }\n    const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder();\n    if (!decoder.IsEmpty() && decoder == FX_BSTRC(\"CCITTFaxDecode\")) {\n        m_bpc = 1;\n    }\n    int ret = CreateDecoder();\n    if (ret != 1) {\n        if (!ret) {\n            return ret;\n        }\n        if (!ContinueToLoadMask()) {\n            return 0;\n        }\n        if (m_bHasMask) {\n            StratLoadMask();\n        }\n        return ret;\n    }\n    if (!ContinueToLoadMask()) {\n        return 0;\n    }\n    if (m_bHasMask) {\n        ret = StratLoadMask();\n    }\n    if (ret == 2) {\n        return ret;\n    }\n    if (m_pColorSpace && m_bStdCS) {\n        m_pColorSpace->EnableStdConversion(FALSE);\n    }\n    return ret;\n}\nint\tCPDF_DIBSource::ContinueLoadDIBSource(IFX_Pause* pPause)\n{\n    FXCODEC_STATUS ret;\n    if (m_Status == 1) {\n        const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder();\n        if (decoder == FX_BSTRC(\"JPXDecode\")) {\n            return 0;\n        }\n        ICodec_Jbig2Module* pJbig2Moudle = CPDF_ModuleMgr::Get()->GetJbig2Module();\n        if (m_pJbig2Context == NULL) {\n            m_pJbig2Context = pJbig2Moudle->CreateJbig2Context();\n            if (m_pStreamAcc->GetImageParam()) {\n                CPDF_Stream* pGlobals = m_pStreamAcc->GetImageParam()->GetStream(FX_BSTRC(\"JBIG2Globals\"));\n                if (pGlobals) {\n                    m_pGlobalStream = FX_NEW CPDF_StreamAcc;\n                    m_pGlobalStream->LoadAllData(pGlobals, FALSE);\n                }\n            }\n            ret = pJbig2Moudle->StartDecode(m_pJbig2Context, m_Width, m_Height, m_pStreamAcc->GetData(), m_pStreamAcc->GetSize(),\n                                            m_pGlobalStream ? m_pGlobalStream->GetData() : NULL, m_pGlobalStream ? m_pGlobalStream->GetSize() : 0, m_pCachedBitmap->GetBuffer(),\n                                            m_pCachedBitmap->GetPitch(), pPause);\n            if (ret < 0) {\n                delete m_pCachedBitmap;\n                m_pCachedBitmap = NULL;\n                if (m_pGlobalStream) {\n                    delete m_pGlobalStream;\n                }\n                m_pGlobalStream = NULL;\n                pJbig2Moudle->DestroyJbig2Context(m_pJbig2Context);\n                m_pJbig2Context = NULL;\n                return 0;\n            }\n            if (ret == FXCODEC_STATUS_DECODE_TOBECONTINUE) {\n                return 2;\n            }\n            int ret1 = 1;\n            if (m_bHasMask) {\n                ret1 = ContinueLoadMaskDIB(pPause);\n                m_Status = 2;\n            }\n            if (ret1 == 2) {\n                return ret1;\n            }\n            if (m_pColorSpace && m_bStdCS) {\n                m_pColorSpace->EnableStdConversion(FALSE);\n            }\n            return ret1;\n        }\n        FXCODEC_STATUS ret = pJbig2Moudle->ContinueDecode(m_pJbig2Context, pPause);\n        if (ret < 0) {\n            delete m_pCachedBitmap;\n            m_pCachedBitmap = NULL;\n            if (m_pGlobalStream) {\n                delete m_pGlobalStream;\n            }\n            m_pGlobalStream = NULL;\n            pJbig2Moudle->DestroyJbig2Context(m_pJbig2Context);\n            m_pJbig2Context = NULL;\n            return 0;\n        }\n        if (ret == FXCODEC_STATUS_DECODE_TOBECONTINUE) {\n            return 2;\n        }\n        int ret1 = 1;\n        if (m_bHasMask) {\n            ret1 = ContinueLoadMaskDIB(pPause);\n            m_Status = 2;\n        }\n        if (ret1 == 2) {\n            return ret1;\n        }\n        if (m_pColorSpace && m_bStdCS) {\n            m_pColorSpace->EnableStdConversion(FALSE);\n        }\n        return ret1;\n    } else if (m_Status == 2) {\n        return ContinueLoadMaskDIB(pPause);\n    }\n    return 0;\n}\nFX_BOOL CPDF_DIBSource::LoadColorInfo(CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources)\n{\n    if (m_pDict->GetInteger(\"ImageMask\")) {\n        m_bImageMask = TRUE;\n    }\n    if (m_bImageMask || !m_pDict->KeyExist(FX_BSTRC(\"ColorSpace\"))) {\n        if (!m_bImageMask) {\n            CPDF_Object* pFilter = m_pDict->GetElementValue(FX_BSTRC(\"Filter\"));\n            if (pFilter) {\n                CFX_ByteString filter;\n                if (pFilter->GetType() == PDFOBJ_NAME) {\n                    filter = pFilter->GetString();\n                    if (filter == FX_BSTRC(\"JPXDecode\")) {\n                        return TRUE;\n                    }\n                } else if (pFilter->GetType() == PDFOBJ_ARRAY) {\n                    CPDF_Array* pArray = (CPDF_Array*)pFilter;\n                    if (pArray->GetString(pArray->GetCount() - 1) == FX_BSTRC(\"JPXDecode\")) {\n                        return TRUE;\n                    }\n                }\n            }\n        }\n        m_bImageMask = TRUE;\n        m_bpc = m_nComponents = 1;\n        CPDF_Array* pDecode = m_pDict->GetArray(FX_BSTRC(\"Decode\"));\n        m_bDefaultDecode = pDecode == NULL || pDecode->GetInteger(0) == 0;\n        return TRUE;\n    }\n    CPDF_Object* pCSObj = m_pDict->GetElementValue(FX_BSTRC(\"ColorSpace\"));\n    if (pCSObj == NULL) {\n        return FALSE;\n    }\n    CPDF_DocPageData* pDocPageData = m_pDocument->GetPageData();\n    if (pFormResources) {\n        m_pColorSpace = pDocPageData->GetColorSpace(pCSObj, pFormResources);\n    }\n    if (m_pColorSpace == NULL) {\n        m_pColorSpace = pDocPageData->GetColorSpace(pCSObj, pPageResources);\n    }\n    if (m_pColorSpace == NULL) {\n        return FALSE;\n    }\n    m_bpc = m_pDict->GetInteger(FX_BSTRC(\"BitsPerComponent\"));\n    m_Family = m_pColorSpace->GetFamily();\n    m_nComponents = m_pColorSpace->CountComponents();\n    if (m_Family == PDFCS_ICCBASED && pCSObj->GetType() == PDFOBJ_NAME) {\n        CFX_ByteString cs = pCSObj->GetString();\n        if (cs == FX_BSTRC(\"DeviceGray\")) {\n            m_nComponents = 1;\n        } else if (cs == FX_BSTRC(\"DeviceRGB\")) {\n            m_nComponents = 3;\n        } else if (cs == FX_BSTRC(\"DeviceCMYK\")) {\n            m_nComponents = 4;\n        }\n    }\n    m_pCompData = FX_Alloc(DIB_COMP_DATA, m_nComponents);\n    if (m_bpc == 0) {\n        return TRUE;\n    }\n    int max_data = (1 << m_bpc) - 1;\n    CPDF_Array* pDecode = m_pDict->GetArray(FX_BSTRC(\"Decode\"));\n    if (pDecode) {\n        for (FX_DWORD i = 0; i < m_nComponents; i ++) {\n            m_pCompData[i].m_DecodeMin = pDecode->GetNumber(i * 2);\n            FX_FLOAT max = pDecode->GetNumber(i * 2 + 1);\n            m_pCompData[i].m_DecodeStep = (max - m_pCompData[i].m_DecodeMin) / max_data;\n            FX_FLOAT def_value, def_min, def_max;\n            m_pColorSpace->GetDefaultValue(i, def_value, def_min, def_max);\n            if (m_Family == PDFCS_INDEXED) {\n                def_max = (FX_FLOAT)max_data;\n            }\n            if (def_min != m_pCompData[i].m_DecodeMin || def_max != max) {\n                m_bDefaultDecode = FALSE;\n            }\n        }\n    } else {\n        for (FX_DWORD i = 0; i < m_nComponents; i ++) {\n            FX_FLOAT def_value;\n            m_pColorSpace->GetDefaultValue(i, def_value, m_pCompData[i].m_DecodeMin, m_pCompData[i].m_DecodeStep);\n            if (m_Family == PDFCS_INDEXED) {\n                m_pCompData[i].m_DecodeStep = (FX_FLOAT)max_data;\n            }\n            m_pCompData[i].m_DecodeStep = (m_pCompData[i].m_DecodeStep - m_pCompData[i].m_DecodeMin) / max_data;\n        }\n    }\n    if (!m_pDict->KeyExist(FX_BSTRC(\"SMask\"))) {\n        CPDF_Object* pMask = m_pDict->GetElementValue(FX_BSTRC(\"Mask\"));\n        if (pMask == NULL) {\n            return TRUE;\n        }\n        if (pMask->GetType() == PDFOBJ_ARRAY) {\n            CPDF_Array* pArray = (CPDF_Array*)pMask;\n            if (pArray->GetCount() >= m_nComponents * 2)\n                for (FX_DWORD i = 0; i < m_nComponents * 2; i ++) {\n                    if (i % 2) {\n                        m_pCompData[i / 2].m_ColorKeyMax = pArray->GetInteger(i);\n                    } else {\n                        m_pCompData[i / 2].m_ColorKeyMin = pArray->GetInteger(i);\n                    }\n                }\n            m_bColorKey = TRUE;\n        }\n    }\n    return TRUE;\n}\nICodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,\n        const CPDF_Dictionary* pParams);\nICodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,\n        int nComps, int bpc, const CPDF_Dictionary* pParams);\nint CPDF_DIBSource::CreateDecoder()\n{\n    const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder();\n    if (decoder.IsEmpty()) {\n        return 1;\n    }\n    FX_LPCBYTE src_data = m_pStreamAcc->GetData();\n    FX_DWORD src_size = m_pStreamAcc->GetSize();\n    const CPDF_Dictionary* pParams = m_pStreamAcc->GetImageParam();\n    if (decoder == FX_BSTRC(\"CCITTFaxDecode\")) {\n        m_pDecoder = FPDFAPI_CreateFaxDecoder(src_data, src_size, m_Width, m_Height, pParams);\n    } else if (decoder == FX_BSTRC(\"DCTDecode\")) {\n        m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder(src_data, src_size, m_Width, m_Height,\n                     m_nComponents, pParams ? pParams->GetInteger(FX_BSTR(\"ColorTransform\"), 1) : 1);\n        if (NULL == m_pDecoder) {\n            FX_BOOL bTransform = FALSE;\n            int comps, bpc;\n            ICodec_JpegModule* pJpegModule = CPDF_ModuleMgr::Get()->GetJpegModule();\n            if (pJpegModule->LoadInfo(src_data, src_size, m_Width, m_Height, comps, bpc, bTransform)) {\n                m_nComponents = comps;\n                m_bpc = bpc;\n                m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder(src_data, src_size, m_Width, m_Height,\n                             m_nComponents, bTransform);\n            }\n        }\n    } else if (decoder == FX_BSTRC(\"FlateDecode\")) {\n        m_pDecoder = FPDFAPI_CreateFlateDecoder(src_data, src_size, m_Width, m_Height, m_nComponents, m_bpc, pParams);\n    } else if (decoder == FX_BSTRC(\"JPXDecode\")) {\n        LoadJpxBitmap();\n        return m_pCachedBitmap != NULL ? 1 : 0;\n    } else if (decoder == FX_BSTRC(\"JBIG2Decode\")) {\n        m_pCachedBitmap = FX_NEW CFX_DIBitmap;\n        if (!m_pCachedBitmap->Create(m_Width, m_Height, m_bImageMask ? FXDIB_1bppMask : FXDIB_1bppRgb)) {\n            delete m_pCachedBitmap;\n            m_pCachedBitmap = NULL;\n            return 0;\n        }\n        m_Status = 1;\n        return 2;\n    } else if (decoder == FX_BSTRC(\"RunLengthDecode\")) {\n        m_pDecoder = CPDF_ModuleMgr::Get()->GetCodecModule()->GetBasicModule()->CreateRunLengthDecoder(src_data, src_size, m_Width, m_Height, m_nComponents, m_bpc);\n    }\n    if (m_pDecoder) {\n        int requested_pitch = (m_Width * m_nComponents * m_bpc + 7) / 8;\n        int provided_pitch = (m_pDecoder->GetWidth() * m_pDecoder->CountComps() * m_pDecoder->GetBPC() + 7) / 8;\n        if (provided_pitch < requested_pitch) {\n            return 0;\n        }\n        return 1;\n    }\n    return 0;\n}\nvoid CPDF_DIBSource::LoadJpxBitmap()\n{\n    ICodec_JpxModule* pJpxModule = CPDF_ModuleMgr::Get()->GetJpxModule();\n    if (pJpxModule == NULL) {\n        return;\n    }\n    FX_LPVOID ctx = pJpxModule->CreateDecoder(m_pStreamAcc->GetData(), m_pStreamAcc->GetSize(), m_pColorSpace != NULL);\n    if (ctx == NULL) {\n        return;\n    }\n    FX_DWORD width = 0, height = 0, codestream_nComps = 0, image_nComps = 0;\n    pJpxModule->GetImageInfo(ctx, width, height, codestream_nComps, image_nComps);\n    if ((int)width < m_Width || (int)height < m_Height) {\n        pJpxModule->DestroyDecoder(ctx);\n        return;\n    }\n    int output_nComps;\n    FX_BOOL bTranslateColor, bSwapRGB = FALSE;\n    if (m_pColorSpace) {\n        if (codestream_nComps != (FX_DWORD)m_pColorSpace->CountComponents()) {\n            return;\n        }\n        output_nComps = codestream_nComps;\n        bTranslateColor = FALSE;\n        if (m_pColorSpace == CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB)) {\n            bSwapRGB = TRUE;\n            m_pColorSpace = NULL;\n        }\n    } else {\n        bTranslateColor = TRUE;\n        if (image_nComps) {\n            output_nComps = image_nComps;\n        } else {\n            output_nComps = codestream_nComps;\n        }\n        if (output_nComps == 3) {\n            bSwapRGB = TRUE;\n        } else if (output_nComps == 4) {\n            m_pColorSpace = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);\n            bTranslateColor = FALSE;\n        }\n        m_nComponents = output_nComps;\n    }\n    FXDIB_Format format;\n    if (output_nComps == 1) {\n        format = FXDIB_8bppRgb;\n    } else if (output_nComps <= 3) {\n        format = FXDIB_Rgb;\n    } else if (output_nComps == 4) {\n        format = FXDIB_Rgb32;\n    } else {\n        width = (width * output_nComps + 2) / 3;\n        format = FXDIB_Rgb;\n    }\n    m_pCachedBitmap = FX_NEW CFX_DIBitmap;\n    if (!m_pCachedBitmap->Create(width, height, format)) {\n        delete m_pCachedBitmap;\n        m_pCachedBitmap = NULL;\n        return;\n    }\n    m_pCachedBitmap->Clear(0xFFFFFFFF);\n    FX_LPBYTE output_offsets = FX_Alloc(FX_BYTE, output_nComps);\n    for (int i = 0; i < output_nComps; i ++) {\n        output_offsets[i] = i;\n    }\n    if (bSwapRGB) {\n        output_offsets[0] = 2;\n        output_offsets[2] = 0;\n    }\n    if (!pJpxModule->Decode(ctx, m_pCachedBitmap->GetBuffer(), m_pCachedBitmap->GetPitch(), bTranslateColor, output_offsets)) {\n        delete m_pCachedBitmap;\n        m_pCachedBitmap = NULL;\n        return;\n    }\n    FX_Free(output_offsets);\n    pJpxModule->DestroyDecoder(ctx);\n    if (m_pColorSpace && m_pColorSpace->GetFamily() == PDFCS_INDEXED && m_bpc < 8) {\n        int scale = 8 - m_bpc;\n        for (FX_DWORD row = 0; row < height; row ++) {\n            FX_LPBYTE scanline = (FX_LPBYTE)m_pCachedBitmap->GetScanline(row);\n            for (FX_DWORD col = 0; col < width; col ++) {\n                *scanline = (*scanline) >> scale;\n                scanline++;\n            }\n        }\n    }\n    m_bpc = 8;\n}\nvoid CPDF_DIBSource::LoadJbig2Bitmap()\n{\n    ICodec_Jbig2Module* pJbig2Module = CPDF_ModuleMgr::Get()->GetJbig2Module();\n    if (pJbig2Module == NULL) {\n        return;\n    }\n    CPDF_StreamAcc* pGlobalStream = NULL;\n    if (m_pStreamAcc->GetImageParam()) {\n        CPDF_Stream* pGlobals = m_pStreamAcc->GetImageParam()->GetStream(FX_BSTRC(\"JBIG2Globals\"));\n        if (pGlobals) {\n            pGlobalStream = FX_NEW CPDF_StreamAcc;\n            pGlobalStream->LoadAllData(pGlobals, FALSE);\n        }\n    }\n    m_pCachedBitmap = FX_NEW CFX_DIBitmap;\n    if (!m_pCachedBitmap->Create(m_Width, m_Height, m_bImageMask ? FXDIB_1bppMask : FXDIB_1bppRgb)) {\n        return;\n    }\n    int ret = pJbig2Module->Decode(m_Width, m_Height, m_pStreamAcc->GetData(), m_pStreamAcc->GetSize(),\n                                   pGlobalStream ? pGlobalStream->GetData() : NULL, pGlobalStream ? pGlobalStream->GetSize() : 0,\n                                   m_pCachedBitmap->GetBuffer(), m_pCachedBitmap->GetPitch());\n    if (ret < 0) {\n        delete m_pCachedBitmap;\n        m_pCachedBitmap = NULL;\n    }\n    if (pGlobalStream) {\n        delete pGlobalStream;\n    }\n    m_bpc = 1;\n    m_nComponents = 1;\n}\nCPDF_DIBSource* CPDF_DIBSource::LoadMask(FX_DWORD& MatteColor)\n{\n    MatteColor = 0xffffffff;\n    CPDF_Stream* pSoftMask = m_pDict->GetStream(FX_BSTRC(\"SMask\"));\n    if (pSoftMask) {\n        CPDF_Array* pMatte = pSoftMask->GetDict()->GetArray(FX_BSTRC(\"Matte\"));\n        if (pMatte != NULL && m_pColorSpace && (FX_DWORD)m_pColorSpace->CountComponents() <= m_nComponents) {\n            FX_FLOAT* pColor = FX_Alloc(FX_FLOAT, m_nComponents);\n            for (FX_DWORD i = 0; i < m_nComponents; i ++) {\n                pColor[i] = pMatte->GetFloat(i);\n            }\n            FX_FLOAT R, G, B;\n            m_pColorSpace->GetRGB(pColor, R, G, B);\n            FX_Free(pColor);\n            MatteColor = FXARGB_MAKE(0, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255));\n        }\n        return LoadMaskDIB(pSoftMask);\n    }\n    CPDF_Object* pMask = m_pDict->GetElementValue(FX_BSTRC(\"Mask\"));\n    if (pMask == NULL) {\n        return NULL;\n    }\n    if (pMask->GetType() == PDFOBJ_STREAM) {\n        return LoadMaskDIB((CPDF_Stream*)pMask);\n    }\n    return NULL;\n}\nint\tCPDF_DIBSource::StratLoadMask()\n{\n    m_MatteColor = 0xffffffff;\n    m_pMaskStream = m_pDict->GetStream(FX_BSTRC(\"SMask\"));\n    if (m_pMaskStream) {\n        CPDF_Array* pMatte = m_pMaskStream->GetDict()->GetArray(FX_BSTRC(\"Matte\"));\n        if (pMatte != NULL && m_pColorSpace && (FX_DWORD)m_pColorSpace->CountComponents() <= m_nComponents) {\n            FX_FLOAT R, G, B;\n            FX_FLOAT* pColor = FX_Alloc(FX_FLOAT, m_nComponents);\n            for (FX_DWORD i = 0; i < m_nComponents; i ++) {\n                pColor[i] = pMatte->GetFloat(i);\n            }\n            m_pColorSpace->GetRGB(pColor, R, G, B);\n            FX_Free(pColor);\n            m_MatteColor = FXARGB_MAKE(0, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255));\n        }\n        return StartLoadMaskDIB();\n    }\n    m_pMaskStream = m_pDict->GetElementValue(FX_BSTRC(\"Mask\"));\n    if (m_pMaskStream == NULL) {\n        return 1;\n    }\n    if (m_pMaskStream->GetType() == PDFOBJ_STREAM) {\n        return StartLoadMaskDIB();\n    }\n    return 1;\n}\nint\tCPDF_DIBSource::ContinueLoadMaskDIB(IFX_Pause* pPause)\n{\n    if (m_pMask == NULL) {\n        return 1;\n    }\n    int ret = m_pMask->ContinueLoadDIBSource(pPause);\n    if (ret == 2) {\n        return ret;\n    }\n    if (m_pColorSpace && m_bStdCS) {\n        m_pColorSpace->EnableStdConversion(FALSE);\n    }\n    if (!ret) {\n        delete m_pMask;\n        m_pMask = NULL;\n        return ret;\n    }\n    return 1;\n}\nCPDF_DIBSource*\tCPDF_DIBSource::DetachMask()\n{\n    CPDF_DIBSource* pDIBSource = m_pMask;\n    m_pMask = NULL;\n    return pDIBSource;\n}\nCPDF_DIBSource* CPDF_DIBSource::LoadMaskDIB(CPDF_Stream* pMask)\n{\n    CPDF_DIBSource* pMaskSource = FX_NEW CPDF_DIBSource;\n    if (!pMaskSource->Load(m_pDocument, pMask, NULL, NULL, NULL, NULL, TRUE)) {\n        delete pMaskSource;\n        return NULL;\n    }\n    return pMaskSource;\n}\nint CPDF_DIBSource::StartLoadMaskDIB()\n{\n    m_pMask = FX_NEW CPDF_DIBSource;\n    int ret = m_pMask->StartLoadDIBSource(m_pDocument, (CPDF_Stream*)m_pMaskStream, FALSE, NULL, NULL, TRUE);\n    if (ret == 2) {\n        if (m_Status == 0) {\n            m_Status = 2;\n        }\n        return 2;\n    }\n    if (!ret) {\n        delete m_pMask;\n        m_pMask = NULL;\n        return 1;\n    }\n    return 1;\n}\nvoid CPDF_DIBSource::LoadPalette()\n{\n    if (m_bpc * m_nComponents > 8) {\n        return;\n    }\n    if (m_pColorSpace == NULL) {\n        return;\n    }\n    if (m_bpc * m_nComponents == 1) {\n        if (m_bDefaultDecode && (m_Family == PDFCS_DEVICEGRAY || m_Family == PDFCS_DEVICERGB)) {\n            return;\n        }\n        if (m_pColorSpace->CountComponents() > 3) {\n            return;\n        }\n        FX_FLOAT color_values[3];\n        color_values[0] = m_pCompData[0].m_DecodeMin;\n        color_values[1] = color_values[2] = color_values[0];\n        FX_FLOAT R=0.0f, G=0.0f, B=0.0f;\n        m_pColorSpace->GetRGB(color_values, R, G, B);\n        FX_ARGB argb0 = ArgbEncode(255, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255));\n        color_values[0] += m_pCompData[0].m_DecodeStep;\n        color_values[1] += m_pCompData[0].m_DecodeStep;\n        color_values[2] += m_pCompData[0].m_DecodeStep;\n        m_pColorSpace->GetRGB(color_values, R, G, B);\n        FX_ARGB argb1 = ArgbEncode(255, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255));\n        if (argb0 != 0xFF000000 || argb1 != 0xFFFFFFFF) {\n            SetPaletteArgb(0, argb0);\n            SetPaletteArgb(1, argb1);\n        }\n        return;\n    }\n    if (m_pColorSpace == CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY) && m_bpc == 8 && m_bDefaultDecode) {\n    } else {\n        int palette_count = 1 << (m_bpc * m_nComponents);\n        CFX_FixedBufGrow<FX_FLOAT, 16> color_values(m_nComponents);\n        FX_FLOAT* color_value = color_values;\n        for (int i = 0; i < palette_count; i ++) {\n            int color_data = i;\n            for (FX_DWORD j = 0; j < m_nComponents; j ++) {\n                int encoded_component = color_data % (1 << m_bpc);\n                color_data /= 1 << m_bpc;\n                color_value[j] = m_pCompData[j].m_DecodeMin + m_pCompData[j].m_DecodeStep * encoded_component;\n            }\n            FX_FLOAT R = 0, G = 0, B = 0;\n            if (m_nComponents == 1 && m_Family == PDFCS_ICCBASED && m_pColorSpace->CountComponents() > 1) {\n                int nComponents = m_pColorSpace->CountComponents();\n                FX_FLOAT* temp_buf = FX_Alloc(FX_FLOAT, nComponents);\n                for (int i = 0; i < nComponents; i++) {\n                    temp_buf[i] = *color_value;\n                }\n                m_pColorSpace->GetRGB(temp_buf, R, G, B);\n                FX_Free(temp_buf);\n            } else {\n                m_pColorSpace->GetRGB(color_value, R, G, B);\n            }\n            SetPaletteArgb(i, ArgbEncode(255, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255)));\n        }\n    }\n}\nFX_DWORD CPDF_DIBSource::GetValidBpc() const\n{\n    FX_DWORD bpc = m_bpc;\n\tCPDF_Object * pFilter = m_pDict ? m_pDict->GetElementValue(FX_BSTRC(\"Filter\")) : NULL;\n    if (pFilter) {\n        if (pFilter->GetType() == PDFOBJ_NAME) {\n            CFX_ByteString filter = pFilter->GetString();\n            if (filter == FX_BSTRC(\"CCITTFaxDecode\") || filter == FX_BSTRC(\"JBIG2Decode\")) {\n                bpc = 1;\n            }\n            if (filter == FX_BSTRC(\"RunLengthDecode\") || filter == FX_BSTRC(\"DCTDecode\")) {\n                bpc = 8;\n            }\n        } else if (pFilter->GetType() == PDFOBJ_ARRAY) {\n            CPDF_Array *pArray = (CPDF_Array *)pFilter;\n            if (pArray->GetString(pArray->GetCount() - 1) == FX_BSTRC(\"CCITTFacDecode\") ||\n                    pArray->GetString(pArray->GetCount() - 1) == FX_BSTRC(\"JBIG2Decode\")) {\n                bpc = 1;\n            }\n            if (pArray->GetString(pArray->GetCount() - 1) == FX_BSTRC(\"RunLengthDecode\") ||\n                    pArray->GetString(pArray->GetCount() - 1) == FX_BSTRC(\"DCTDecode\")) {\n                bpc = 8;\n            }\n        }\n    }\n    return bpc;\n}\n#define NORMALCOLOR_MAX(color, max) (color) > (max) ? (max) : (color) < 0 ? 0 : (color);\nvoid CPDF_DIBSource::TranslateScanline24bpp(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan) const\n{\n    int max_data = (1 << m_bpc) - 1;\n    if (m_bDefaultDecode) {\n        if (m_Family == PDFCS_DEVICERGB || m_Family == PDFCS_CALRGB) {\n            if (m_bpc == 16) {\n                FX_LPBYTE dest_pos = dest_scan;\n                FX_LPCBYTE src_pos = src_scan;\n                for (int col = 0; col < m_Width; col ++) {\n                    *dest_scan++ = src_pos[4];\n                    *dest_scan++ = src_pos[2];\n                    *dest_scan++ = *src_pos;\n                    src_pos += 6;\n                }\n            } else if (m_bpc == 8) {\n                FX_LPBYTE dest_pos = dest_scan;\n                FX_LPCBYTE src_pos = src_scan;\n                for (int column = 0; column < m_Width; column ++) {\n                    *dest_scan++ = src_pos[2];\n                    *dest_scan++ = src_pos[1];\n                    *dest_scan++ = *src_pos;\n                    src_pos += 3;\n                }\n            } else {\n                int src_bit_pos = 0;\n                int dest_byte_pos = 0;\n                FX_DWORD bpc = GetValidBpc();\n                for (int column = 0; column < m_Width; column ++) {\n                    int R = _GetBits8(src_scan, src_bit_pos, bpc);\n                    src_bit_pos += bpc;\n                    int G = _GetBits8(src_scan, src_bit_pos, bpc);\n                    src_bit_pos += bpc;\n                    int B = _GetBits8(src_scan, src_bit_pos, bpc);\n                    src_bit_pos += bpc;\n                    R = NORMALCOLOR_MAX(R, max_data);\n                    G = NORMALCOLOR_MAX(G, max_data);\n                    B = NORMALCOLOR_MAX(B, max_data);\n                    dest_scan[dest_byte_pos] = B * 255 / max_data;\n                    dest_scan[dest_byte_pos + 1] = G * 255 / max_data;\n                    dest_scan[dest_byte_pos + 2] = R * 255 / max_data;\n                    dest_byte_pos += 3;\n                }\n            }\n            return;\n        } else if (m_bpc == 8) {\n            if (m_nComponents == m_pColorSpace->CountComponents())\n                m_pColorSpace->TranslateImageLine(dest_scan, src_scan, m_Width, m_Width, m_Height,\n                                                  m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK);\n            return;\n        }\n    }\n    CFX_FixedBufGrow<FX_FLOAT, 16> color_values1(m_nComponents);\n    FX_FLOAT* color_values = color_values1;\n    FX_FLOAT R = 0.0f, G = 0.0f, B = 0.0f;\n    if (m_bpc == 8) {\n        int src_byte_pos = 0;\n        int dest_byte_pos = 0;\n        for (int column = 0; column < m_Width; column ++) {\n            for (FX_DWORD color = 0; color < m_nComponents; color ++) {\n                int data = src_scan[src_byte_pos ++];\n                color_values[color] = m_pCompData[color].m_DecodeMin +\n                                      m_pCompData[color].m_DecodeStep * data;\n            }\n            if (m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK) {\n                FX_FLOAT k = 1.0f - color_values[3];\n                R = (1.0f - color_values[0]) * k;\n                G = (1.0f - color_values[1]) * k;\n                B = (1.0f - color_values[2]) * k;\n            } else {\n                m_pColorSpace->GetRGB(color_values, R, G, B);\n            }\n            R = NORMALCOLOR_MAX(R, 1);\n            G = NORMALCOLOR_MAX(G, 1);\n            B = NORMALCOLOR_MAX(B, 1);\n            dest_scan[dest_byte_pos] = (FX_INT32)(B * 255);\n            dest_scan[dest_byte_pos + 1] = (FX_INT32)(G * 255);\n            dest_scan[dest_byte_pos + 2] = (FX_INT32)(R * 255);\n            dest_byte_pos += 3;\n        }\n    } else {\n        int src_bit_pos = 0;\n        int dest_byte_pos = 0;\n        FX_DWORD bpc = GetValidBpc();\n        for (int column = 0; column < m_Width; column ++) {\n            for (FX_DWORD color = 0; color < m_nComponents; color ++) {\n                int data = _GetBits8(src_scan, src_bit_pos, bpc);\n                color_values[color] = m_pCompData[color].m_DecodeMin +\n                                      m_pCompData[color].m_DecodeStep * data;\n                src_bit_pos += bpc;\n            }\n            if (m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK) {\n                FX_FLOAT k = 1.0f - color_values[3];\n                R = (1.0f - color_values[0]) * k;\n                G = (1.0f - color_values[1]) * k;\n                B = (1.0f - color_values[2]) * k;\n            } else {\n                m_pColorSpace->GetRGB(color_values, R, G, B);\n            }\n            R = NORMALCOLOR_MAX(R, 1);\n            G = NORMALCOLOR_MAX(G, 1);\n            B = NORMALCOLOR_MAX(B, 1);\n            dest_scan[dest_byte_pos] = (FX_INT32)(B * 255);\n            dest_scan[dest_byte_pos + 1] = (FX_INT32)(G * 255);\n            dest_scan[dest_byte_pos + 2] = (FX_INT32)(R * 255);\n            dest_byte_pos += 3;\n        }\n    }\n}\nFX_LPBYTE CPDF_DIBSource::GetBuffer() const\n{\n    if (m_pCachedBitmap) {\n        return m_pCachedBitmap->GetBuffer();\n    }\n    return NULL;\n}\nFX_LPCBYTE CPDF_DIBSource::GetScanline(int line) const\n{\n    FX_DWORD src_pitch = (m_Width * m_bpc * m_nComponents + 7) / 8;\n    FX_LPCBYTE pSrcLine = NULL;\n    if (m_pCachedBitmap) {\n        if (line >= m_pCachedBitmap->GetHeight()) {\n            line = m_pCachedBitmap->GetHeight() - 1;\n        }\n        pSrcLine = m_pCachedBitmap->GetScanline(line);\n    } else if (m_pDecoder) {\n        pSrcLine = m_pDecoder->GetScanline(line);\n    } else {\n        if (m_pStreamAcc->GetSize() >= (line + 1) * src_pitch) {\n            pSrcLine = m_pStreamAcc->GetData() + line * src_pitch;\n        }\n    }\n    if (pSrcLine == NULL) {\n        FX_LPBYTE pLineBuf = m_pMaskedLine ? m_pMaskedLine : m_pLineBuf;\n        FXSYS_memset8(pLineBuf, 0xff, m_Pitch);\n        return pLineBuf;\n    }\n    if (m_bpc * m_nComponents == 1) {\n        if (m_bImageMask && m_bDefaultDecode) {\n            for (FX_DWORD i = 0; i < src_pitch; i ++) {\n                m_pLineBuf[i] = ~pSrcLine[i];\n            }\n        } else if (m_bColorKey) {\n            FX_DWORD reset_argb, set_argb;\n            reset_argb = m_pPalette ? m_pPalette[0] : 0xff000000;\n            set_argb = m_pPalette ? m_pPalette[1] : 0xffffffff;\n            if (m_pCompData[0].m_ColorKeyMin == 0) {\n                reset_argb = 0;\n            }\n            if (m_pCompData[0].m_ColorKeyMax == 1) {\n                set_argb = 0;\n            }\n            set_argb = FXARGB_TODIB(set_argb);\n            reset_argb = FXARGB_TODIB(reset_argb);\n            FX_DWORD* dest_scan = (FX_DWORD*)m_pMaskedLine;\n            for (int col = 0; col < m_Width; col ++) {\n                if (pSrcLine[col / 8] & (1 << (7 - col % 8))) {\n                    *dest_scan = set_argb;\n                } else {\n                    *dest_scan = reset_argb;\n                }\n                dest_scan ++;\n            }\n            return m_pMaskedLine;\n        } else {\n            FXSYS_memcpy32(m_pLineBuf, pSrcLine, src_pitch);\n        }\n        return m_pLineBuf;\n    }\n    if (m_bpc * m_nComponents <= 8) {\n        if (m_bpc == 8) {\n            FXSYS_memcpy32(m_pLineBuf, pSrcLine, src_pitch);\n        } else {\n            int src_bit_pos = 0;\n            for (int col = 0; col < m_Width; col ++) {\n                int color_index = 0;\n                for (FX_DWORD color = 0; color < m_nComponents; color ++) {\n                    int data = _GetBits8(pSrcLine, src_bit_pos, m_bpc);\n                    color_index |= data << (color * m_bpc);\n                    src_bit_pos += m_bpc;\n                }\n                m_pLineBuf[col] = color_index;\n            }\n        }\n        if (m_bColorKey) {\n            FX_LPBYTE pDestPixel = m_pMaskedLine;\n            FX_LPCBYTE pSrcPixel = m_pLineBuf;\n            for (int col = 0; col < m_Width; col ++) {\n                FX_BYTE index = *pSrcPixel++;\n                if (m_pPalette) {\n                    *pDestPixel++ = FXARGB_B(m_pPalette[index]);\n                    *pDestPixel++ = FXARGB_G(m_pPalette[index]);\n                    *pDestPixel++ = FXARGB_R(m_pPalette[index]);\n                } else {\n                    *pDestPixel++ = index;\n                    *pDestPixel++ = index;\n                    *pDestPixel++ = index;\n                }\n                *pDestPixel = (index < m_pCompData[0].m_ColorKeyMin || index > m_pCompData[0].m_ColorKeyMax) ? 0xff : 0;\n                pDestPixel ++ ;\n            }\n            return m_pMaskedLine;\n        }\n        return m_pLineBuf;\n    }\n    if (m_bColorKey) {\n        if (m_nComponents == 3 && m_bpc == 8) {\n            FX_LPBYTE alpha_channel = m_pMaskedLine + 3;\n            for (int col = 0; col < m_Width; col ++) {\n                FX_LPCBYTE pPixel = pSrcLine + col * 3;\n                alpha_channel[col * 4] = (pPixel[0] < m_pCompData[0].m_ColorKeyMin ||\n                                          pPixel[0] > m_pCompData[0].m_ColorKeyMax ||\n                                          pPixel[1] < m_pCompData[1].m_ColorKeyMin || pPixel[1] > m_pCompData[1].m_ColorKeyMax ||\n                                          pPixel[2] < m_pCompData[2].m_ColorKeyMin || pPixel[2] > m_pCompData[2].m_ColorKeyMax) ? 0xff : 0;\n            }\n        } else {\n            FXSYS_memset8(m_pMaskedLine, 0xff, m_Pitch);\n        }\n    }\n    if (m_pColorSpace) {\n        TranslateScanline24bpp(m_pLineBuf, pSrcLine);\n        pSrcLine = m_pLineBuf;\n    }\n    if (m_bColorKey) {\n        FX_LPCBYTE pSrcPixel = pSrcLine;\n        FX_LPBYTE pDestPixel = m_pMaskedLine;\n        for (int col = 0; col < m_Width; col ++) {\n            *pDestPixel++ = *pSrcPixel++;\n            *pDestPixel++ = *pSrcPixel++;\n            *pDestPixel++ = *pSrcPixel++;\n            pDestPixel ++;\n        }\n        return m_pMaskedLine;\n    }\n    return pSrcLine;\n}\nFX_BOOL CPDF_DIBSource::SkipToScanline(int line, IFX_Pause* pPause) const\n{\n    if (m_pDecoder) {\n        return m_pDecoder->SkipToScanline(line, pPause);\n    }\n    return FALSE;\n}\nvoid CPDF_DIBSource::DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,\n                                        int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const\n{\n    FX_DWORD bpc = GetValidBpc();\n    FX_DWORD src_width = m_Width;\n    FX_DWORD src_pitch = (src_width * bpc * m_nComponents + 7) / 8;\n    FX_LPCBYTE pSrcLine = NULL;\n    if (m_pCachedBitmap) {\n        pSrcLine = m_pCachedBitmap->GetScanline(line);\n    } else if (m_pDecoder) {\n        pSrcLine = m_pDecoder->GetScanline(line);\n    } else {\n        if (m_pStreamAcc->GetSize() >= (line + 1) * src_pitch) {\n            pSrcLine = m_pStreamAcc->GetData() + line * src_pitch;\n        }\n    }\n    int orig_Bpp = bpc * m_nComponents / 8;\n    int dest_Bpp = dest_bpp / 8;\n    if (pSrcLine == NULL) {\n        FXSYS_memset32(dest_scan, 0xff, dest_Bpp * clip_width);\n        return;\n    }\n    CFX_FixedBufGrow<FX_BYTE, 128> temp(orig_Bpp);\n    if (bpc * m_nComponents == 1) {\n        FX_DWORD set_argb = (FX_DWORD) - 1, reset_argb = 0;\n        if (m_bImageMask) {\n            if (m_bDefaultDecode) {\n                set_argb = 0;\n                reset_argb = (FX_DWORD) - 1;\n            }\n        } else if (m_bColorKey) {\n            reset_argb = m_pPalette ? m_pPalette[0] : 0xff000000;\n            set_argb = m_pPalette ? m_pPalette[1] : 0xffffffff;\n            if (m_pCompData[0].m_ColorKeyMin == 0) {\n                reset_argb = 0;\n            }\n            if (m_pCompData[0].m_ColorKeyMax == 1) {\n                set_argb = 0;\n            }\n            set_argb = FXARGB_TODIB(set_argb);\n            reset_argb = FXARGB_TODIB(reset_argb);\n            for (int i = 0; i < clip_width; i ++) {\n                FX_DWORD src_x = (clip_left + i) * src_width / dest_width;\n                if (bFlipX) {\n                    src_x = src_width - src_x - 1;\n                }\n                src_x %= src_width;\n                if (pSrcLine[src_x / 8] & (1 << (7 - src_x % 8))) {\n                    ((FX_DWORD*)dest_scan)[i] = set_argb;\n                } else {\n                    ((FX_DWORD*)dest_scan)[i] = reset_argb;\n                }\n            }\n            return;\n        } else {\n            if (dest_Bpp == 1) {\n            } else if (m_pPalette) {\n                reset_argb = m_pPalette[0];\n                set_argb = m_pPalette[1];\n            }\n        }\n        for (int i = 0; i < clip_width; i ++) {\n            FX_DWORD src_x = (clip_left + i) * src_width / dest_width;\n            if (bFlipX) {\n                src_x = src_width - src_x - 1;\n            }\n            src_x %= src_width;\n            int dest_pos = i * dest_Bpp;\n            if (pSrcLine[src_x / 8] & (1 << (7 - src_x % 8))) {\n                if (dest_Bpp == 1) {\n                    dest_scan[dest_pos] = (FX_BYTE)set_argb;\n                } else if (dest_Bpp == 3) {\n                    dest_scan[dest_pos] = FXARGB_B(set_argb);\n                    dest_scan[dest_pos + 1] = FXARGB_G(set_argb);\n                    dest_scan[dest_pos + 2] = FXARGB_R(set_argb);\n                } else {\n                    *(FX_DWORD*)(dest_scan + dest_pos) = set_argb;\n                }\n            } else {\n                if (dest_Bpp == 1) {\n                    dest_scan[dest_pos] = (FX_BYTE)reset_argb;\n                } else if (dest_Bpp == 3) {\n                    dest_scan[dest_pos] = FXARGB_B(reset_argb);\n                    dest_scan[dest_pos + 1] = FXARGB_G(reset_argb);\n                    dest_scan[dest_pos + 2] = FXARGB_R(reset_argb);\n                } else {\n                    *(FX_DWORD*)(dest_scan + dest_pos) = reset_argb;\n                }\n            }\n        }\n        return;\n    } else if (bpc * m_nComponents <= 8) {\n        if (bpc < 8) {\n            int src_bit_pos = 0;\n            for (FX_DWORD col = 0; col < src_width; col ++) {\n                int color_index = 0;\n                for (FX_DWORD color = 0; color < m_nComponents; color ++) {\n                    int data = _GetBits8(pSrcLine, src_bit_pos, bpc);\n                    color_index |= data << (color * bpc);\n                    src_bit_pos += bpc;\n                }\n                m_pLineBuf[col] = color_index;\n            }\n            pSrcLine = m_pLineBuf;\n        }\n        if (m_bColorKey) {\n            for (int i = 0; i < clip_width; i ++) {\n                FX_DWORD src_x = (clip_left + i) * src_width / dest_width;\n                if (bFlipX) {\n                    src_x = src_width - src_x - 1;\n                }\n                src_x %= src_width;\n                FX_LPBYTE pDestPixel = dest_scan + i * 4;\n                FX_BYTE index = pSrcLine[src_x];\n                if (m_pPalette) {\n                    *pDestPixel++ = FXARGB_B(m_pPalette[index]);\n                    *pDestPixel++ = FXARGB_G(m_pPalette[index]);\n                    *pDestPixel++ = FXARGB_R(m_pPalette[index]);\n                } else {\n                    *pDestPixel++ = index;\n                    *pDestPixel++ = index;\n                    *pDestPixel++ = index;\n                }\n                *pDestPixel = (index < m_pCompData[0].m_ColorKeyMin || index > m_pCompData[0].m_ColorKeyMax) ? 0xff : 0;\n            }\n            return;\n        }\n        for (int i = 0; i < clip_width; i ++) {\n            FX_DWORD src_x = (clip_left + i) * src_width / dest_width;\n            if (bFlipX) {\n                src_x = src_width - src_x - 1;\n            }\n            src_x %= src_width;\n            FX_BYTE index = pSrcLine[src_x];\n            if (dest_Bpp == 1) {\n                dest_scan[i] = index;\n            } else {\n                int dest_pos = i * dest_Bpp;\n                FX_ARGB argb = m_pPalette[index];\n                dest_scan[dest_pos] = FXARGB_B(argb);\n                dest_scan[dest_pos + 1] = FXARGB_G(argb);\n                dest_scan[dest_pos + 2] = FXARGB_R(argb);\n            }\n        }\n        return;\n    } else {\n        int last_src_x = -1;\n        FX_ARGB last_argb;\n        FX_FLOAT orig_Not8Bpp = (FX_FLOAT)bpc * (FX_FLOAT)m_nComponents / 8.0f;\n        FX_FLOAT unit_To8Bpc = 255.0f / ((1 << bpc) - 1);\n        for (int i = 0; i < clip_width; i ++) {\n            int dest_x = clip_left + i;\n            FX_DWORD src_x = (bFlipX ? (dest_width - dest_x - 1) : dest_x) * (FX_INT64)src_width / dest_width;\n            src_x %= src_width;\n            FX_LPCBYTE pSrcPixel = NULL;\n            if (bpc % 8 == 0) {\n                pSrcPixel = pSrcLine + src_x * orig_Bpp;\n            } else {\n                pSrcPixel = pSrcLine + (int)(src_x * orig_Not8Bpp);\n            }\n            FX_LPBYTE pDestPixel = dest_scan + i * dest_Bpp;\n            FX_ARGB argb;\n            if (src_x == last_src_x) {\n                argb = last_argb;\n            } else {\n                if (m_pColorSpace) {\n                    FX_BYTE color[4];\n                    if (!m_bDefaultDecode) {\n                        for (int i = 0; i < orig_Bpp; i ++) {\n                            int color_value = (int)((m_pCompData[i].m_DecodeMin + m_pCompData[i].m_DecodeStep * (FX_FLOAT)pSrcPixel[i]) * 255.0f + 0.5f);\n                            temp[i] = color_value > 255 ? 255 : (color_value < 0 ? 0 : color_value);\n                        }\n                        m_pColorSpace->TranslateImageLine(color, temp, 1, 0, 0, m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK);\n                    } else {\n                        if (bpc < 8) {\n                            int src_bit_pos = 0;\n                            if (src_x % 2) {\n                                src_bit_pos = 4;\n                            }\n                            int value = (1 << bpc)  - 1;\n                            for (FX_DWORD i = 0; i < m_nComponents; i ++) {\n                                temp[i] = (FX_BYTE)(_GetBits8(pSrcPixel, src_bit_pos, bpc) * unit_To8Bpc);\n                                src_bit_pos += bpc;\n                            }\n                            m_pColorSpace->TranslateImageLine(color, temp, 1, 0, 0, m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK);\n                        } else {\n                            m_pColorSpace->TranslateImageLine(color, pSrcPixel, 1, 0, 0, m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK);\n                        }\n                    }\n                    argb = FXARGB_MAKE(0xff, color[2], color[1], color[0]);\n                } else {\n                    argb = FXARGB_MAKE(0xff, pSrcPixel[2], pSrcPixel[1], pSrcPixel[0]);\n                }\n                if (m_bColorKey) {\n                    int alpha = 0xff;\n                    if (m_nComponents == 3 && bpc == 8) {\n                        alpha = (pSrcPixel[0] < m_pCompData[0].m_ColorKeyMin ||\n                                 pSrcPixel[0] > m_pCompData[0].m_ColorKeyMax ||\n                                 pSrcPixel[1] < m_pCompData[1].m_ColorKeyMin ||\n                                 pSrcPixel[1] > m_pCompData[1].m_ColorKeyMax ||\n                                 pSrcPixel[2] < m_pCompData[2].m_ColorKeyMin ||\n                                 pSrcPixel[2] > m_pCompData[2].m_ColorKeyMax) ? 0xff : 0;\n                    }\n                    argb &= 0xffffff;\n                    argb |= alpha << 24;\n                }\n                last_src_x = src_x;\n                last_argb = argb;\n            }\n            if (dest_Bpp == 4) {\n                *(FX_DWORD*)pDestPixel = FXARGB_TODIB(argb);\n            } else {\n                *pDestPixel++ = FXARGB_B(argb);\n                *pDestPixel++ = FXARGB_G(argb);\n                *pDestPixel = FXARGB_R(argb);\n            }\n        }\n    }\n}\nvoid CPDF_DIBSource::SetDownSampleSize(int dest_width, int dest_height) const\n{\n    if (m_pDecoder) {\n        m_pDecoder->DownScale(dest_width, dest_height);\n        ((CPDF_DIBSource*)this)->m_Width = m_pDecoder->GetWidth();\n        ((CPDF_DIBSource*)this)->m_Height = m_pDecoder->GetHeight();\n    }\n}\nvoid CPDF_DIBSource::ClearImageData()\n{\n    if (m_pDecoder) {\n        m_pDecoder->ClearImageData();\n    }\n}\nCPDF_ProgressiveImageLoaderHandle::CPDF_ProgressiveImageLoaderHandle()\n{\n    m_pImageLoader = NULL;\n    m_pCache = NULL;\n    m_pImage = NULL;\n}\nCPDF_ProgressiveImageLoaderHandle::~CPDF_ProgressiveImageLoaderHandle()\n{\n    m_pImageLoader = NULL;\n    m_pCache = NULL;\n    m_pImage = NULL;\n}\nFX_BOOL CPDF_ProgressiveImageLoaderHandle::Start(CPDF_ImageLoader* pImageLoader, const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus, FX_INT32 nDownsampleWidth, FX_INT32 nDownsampleHeight)\n{\n    m_pImageLoader = pImageLoader;\n    m_pCache = pCache;\n    m_pImage = (CPDF_ImageObject*)pImage;\n    m_nDownsampleWidth = nDownsampleWidth;\n    m_nDownsampleHeight = nDownsampleHeight;\n    FX_BOOL ret;\n    if (pCache) {\n        ret = pCache->StartGetCachedBitmap(pImage->m_pImage->GetStream(), bStdCS, GroupFamily, bLoadMask, pRenderStatus, m_nDownsampleWidth, m_nDownsampleHeight);\n        if (ret == FALSE) {\n            m_pImageLoader->m_bCached = TRUE;\n            m_pImageLoader->m_pBitmap = pCache->m_pCurImageCache->DetachBitmap();\n            m_pImageLoader->m_pMask = pCache->m_pCurImageCache->DetachMask();\n            m_pImageLoader->m_MatteColor = pCache->m_pCurImageCache->m_MatteColor;\n        }\n    } else {\n        ret = pImage->m_pImage->StartLoadDIBSource(pRenderStatus->m_pFormResource, pRenderStatus->m_pPageResource, bStdCS, GroupFamily, bLoadMask);\n        if (ret == FALSE) {\n            m_pImageLoader->m_bCached = FALSE;\n            m_pImageLoader->m_pBitmap = m_pImage->m_pImage->DetachBitmap();\n            m_pImageLoader->m_pMask = m_pImage->m_pImage->DetachMask();\n            m_pImageLoader->m_MatteColor = m_pImage->m_pImage->m_MatteColor;\n        }\n    }\n    return ret;\n}\nFX_BOOL CPDF_ProgressiveImageLoaderHandle::Continue(IFX_Pause* pPause)\n{\n    FX_BOOL ret;\n    if (m_pCache) {\n        ret = m_pCache->Continue(pPause);\n        if (ret == FALSE) {\n            m_pImageLoader->m_bCached = TRUE;\n            m_pImageLoader->m_pBitmap = m_pCache->m_pCurImageCache->DetachBitmap();\n            m_pImageLoader->m_pMask = m_pCache->m_pCurImageCache->DetachMask();\n            m_pImageLoader->m_MatteColor = m_pCache->m_pCurImageCache->m_MatteColor;\n        }\n    } else {\n        ret = m_pImage->m_pImage->Continue(pPause);\n        if (ret == FALSE) {\n            m_pImageLoader->m_bCached = FALSE;\n            m_pImageLoader->m_pBitmap = m_pImage->m_pImage->DetachBitmap();\n            m_pImageLoader->m_pMask = m_pImage->m_pImage->DetachMask();\n            m_pImageLoader->m_MatteColor = m_pImage->m_pImage->m_MatteColor;\n        }\n    }\n    return ret;\n}\nFX_BOOL CPDF_ImageLoader::Load(const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus)\n{\n    if (pImage == NULL) {\n        return FALSE;\n    }\n    if (pCache) {\n        pCache->GetCachedBitmap(pImage->m_pImage->GetStream(), m_pBitmap, m_pMask, m_MatteColor, bStdCS, GroupFamily, bLoadMask, pRenderStatus, m_nDownsampleWidth, m_nDownsampleHeight);\n        m_bCached = TRUE;\n    } else {\n        m_pBitmap = pImage->m_pImage->LoadDIBSource(&m_pMask, &m_MatteColor, bStdCS, GroupFamily, bLoadMask);\n        m_bCached = FALSE;\n    }\n    return FALSE;\n}\nFX_BOOL CPDF_ImageLoader::StartLoadImage(const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_LPVOID& LoadHandle, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus, FX_INT32 nDownsampleWidth, FX_INT32 nDownsampleHeight)\n{\n    m_nDownsampleWidth = nDownsampleWidth;\n    m_nDownsampleHeight = nDownsampleHeight;\n    CPDF_ProgressiveImageLoaderHandle* pLoaderHandle = NULL;\n    pLoaderHandle =\tFX_NEW CPDF_ProgressiveImageLoaderHandle;\n    FX_BOOL ret = pLoaderHandle->Start(this, pImage, pCache, bStdCS, GroupFamily, bLoadMask, pRenderStatus, m_nDownsampleWidth, m_nDownsampleHeight);\n    LoadHandle = pLoaderHandle;\n    return ret;\n}\nFX_BOOL\tCPDF_ImageLoader::Continue(FX_LPVOID LoadHandle, IFX_Pause* pPause)\n{\n    return ((CPDF_ProgressiveImageLoaderHandle*)LoadHandle)->Continue(pPause);\n}\nCPDF_ImageLoader::~CPDF_ImageLoader()\n{\n    if (!m_bCached) {\n        if (m_pBitmap) {\n            delete m_pBitmap;\n            m_pBitmap = NULL;\n        }\n        if (m_pMask) {\n            delete m_pMask;\n        }\n    }\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_render/fpdf_render_pattern.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fpdfapi/fpdf_render.h\"\n#include \"../../../include/fpdfapi/fpdf_pageobj.h\"\n#include \"../../../include/fxge/fx_ge.h\"\n#include \"../fpdf_page/pageint.h\"\n#include \"render_int.h\"\n#define SHADING_STEPS 256\nstatic void _DrawAxialShading(CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,\n                              CPDF_Dictionary* pDict, CPDF_Function** pFuncs, int nFuncs,\n                              CPDF_ColorSpace* pCS, int alpha)\n{\n    ASSERT(pBitmap->GetFormat() == FXDIB_Argb);\n    CPDF_Array* pCoords = pDict->GetArray(FX_BSTRC(\"Coords\"));\n    if (pCoords == NULL) {\n        return;\n    }\n    FX_FLOAT start_x = pCoords->GetNumber(0);\n    FX_FLOAT start_y = pCoords->GetNumber(1);\n    FX_FLOAT end_x = pCoords->GetNumber(2);\n    FX_FLOAT end_y = pCoords->GetNumber(3);\n    FX_FLOAT t_min = 0, t_max = 1.0f;\n    CPDF_Array* pArray = pDict->GetArray(FX_BSTRC(\"Domain\"));\n    if (pArray) {\n        t_min = pArray->GetNumber(0);\n        t_max = pArray->GetNumber(1);\n    }\n    FX_BOOL bStartExtend = FALSE, bEndExtend = FALSE;\n    pArray = pDict->GetArray(FX_BSTRC(\"Extend\"));\n    if (pArray) {\n        bStartExtend = pArray->GetInteger(0);\n        bEndExtend = pArray->GetInteger(1);\n    }\n    int width = pBitmap->GetWidth();\n    int height = pBitmap->GetHeight();\n    FX_FLOAT x_span = end_x - start_x;\n    FX_FLOAT y_span = end_y - start_y;\n    FX_FLOAT axis_len_square = FXSYS_Mul(x_span, x_span) + FXSYS_Mul(y_span, y_span);\n    CFX_AffineMatrix matrix;\n    matrix.SetReverse(*pObject2Bitmap);\n    int total_results = 0;\n    for (int j = 0; j < nFuncs; j ++) {\n        if (pFuncs[j]) {\n            total_results += pFuncs[j]->CountOutputs();\n        }\n    }\n    if (pCS->CountComponents() > total_results) {\n        total_results = pCS->CountComponents();\n    }\n    CFX_FixedBufGrow<FX_FLOAT, 16> result_array(total_results);\n    FX_FLOAT* pResults = result_array;\n    FXSYS_memset32(pResults, 0, total_results * sizeof(FX_FLOAT));\n    FX_DWORD rgb_array[SHADING_STEPS];\n    for (int i = 0; i < SHADING_STEPS; i ++) {\n        FX_FLOAT input = (t_max - t_min) * i / SHADING_STEPS + t_min;\n        int offset = 0;\n        for (int j = 0; j < nFuncs; j ++) {\n            if (pFuncs[j]) {\n                int nresults = 0;\n                if (pFuncs[j]->Call(&input, 1, pResults + offset, nresults)) {\n                    offset += nresults;\n                }\n            }\n        }\n        FX_FLOAT R = 0.0f, G = 0.0f, B = 0.0f;\n        pCS->GetRGB(pResults, R, G, B);\n        rgb_array[i] = FXARGB_TODIB(FXARGB_MAKE(alpha, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255)));\n    }\n    int pitch = pBitmap->GetPitch();\n    int Bpp = pBitmap->GetBPP() / 8;\n    for (int row = 0; row < height; row ++) {\n        FX_DWORD* dib_buf = (FX_DWORD*)(pBitmap->GetBuffer() + row * pitch);\n        for (int column = 0; column < width; column ++) {\n            FX_FLOAT x = (FX_FLOAT)column, y = (FX_FLOAT)row;\n            matrix.Transform(x, y);\n            FX_FLOAT scale = FXSYS_Div(FXSYS_Mul(x - start_x, x_span) + FXSYS_Mul(y - start_y, y_span), axis_len_square);\n            int index = (FX_INT32)(scale * (SHADING_STEPS - 1));\n            if (index < 0) {\n                if (!bStartExtend) {\n                    continue;\n                }\n                index = 0;\n            } else if (index >= SHADING_STEPS) {\n                if (!bEndExtend) {\n                    continue;\n                }\n                index = SHADING_STEPS - 1;\n            }\n            dib_buf[column] = rgb_array[index];\n        }\n    }\n}\nstatic void _DrawRadialShading(CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,\n                               CPDF_Dictionary* pDict, CPDF_Function** pFuncs, int nFuncs,\n                               CPDF_ColorSpace* pCS, int alpha)\n{\n    ASSERT(pBitmap->GetFormat() == FXDIB_Argb);\n    CPDF_Array* pCoords = pDict->GetArray(FX_BSTRC(\"Coords\"));\n    if (pCoords == NULL) {\n        return;\n    }\n    FX_FLOAT start_x = pCoords->GetNumber(0);\n    FX_FLOAT start_y = pCoords->GetNumber(1);\n    FX_FLOAT start_r = pCoords->GetNumber(2);\n    FX_FLOAT end_x = pCoords->GetNumber(3);\n    FX_FLOAT end_y = pCoords->GetNumber(4);\n    FX_FLOAT end_r = pCoords->GetNumber(5);\n    CFX_AffineMatrix matrix;\n    matrix.SetReverse(*pObject2Bitmap);\n    FX_FLOAT t_min = 0, t_max = 1.0f;\n    CPDF_Array* pArray = pDict->GetArray(FX_BSTRC(\"Domain\"));\n    if (pArray) {\n        t_min = pArray->GetNumber(0);\n        t_max = pArray->GetNumber(1);\n    }\n    FX_BOOL bStartExtend = FALSE, bEndExtend = FALSE;\n    pArray = pDict->GetArray(FX_BSTRC(\"Extend\"));\n    if (pArray) {\n        bStartExtend = pArray->GetInteger(0);\n        bEndExtend = pArray->GetInteger(1);\n    }\n    int total_results = 0;\n    for (int j = 0; j < nFuncs; j ++) {\n        if (pFuncs[j]) {\n            total_results += pFuncs[j]->CountOutputs();\n        }\n    }\n    if (pCS->CountComponents() > total_results) {\n        total_results = pCS->CountComponents();\n    }\n    CFX_FixedBufGrow<FX_FLOAT, 16> result_array(total_results);\n    FX_FLOAT* pResults = result_array;\n    FXSYS_memset32(pResults, 0, total_results * sizeof(FX_FLOAT));\n    FX_DWORD rgb_array[SHADING_STEPS];\n    for (int i = 0; i < SHADING_STEPS; i ++) {\n        FX_FLOAT input = (t_max - t_min) * i / SHADING_STEPS + t_min;\n        int offset = 0;\n        for (int j = 0; j < nFuncs; j ++) {\n            if (pFuncs[j]) {\n                int nresults;\n                if (pFuncs[j]->Call(&input, 1, pResults + offset, nresults)) {\n                    offset += nresults;\n                }\n            }\n        }\n        FX_FLOAT R, G, B;\n        pCS->GetRGB(pResults, R, G, B);\n        rgb_array[i] = FXARGB_TODIB(FXARGB_MAKE(alpha, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255)));\n    }\n    FX_FLOAT a = FXSYS_Mul(start_x - end_x, start_x - end_x) +\n                 FXSYS_Mul(start_y - end_y, start_y - end_y) - FXSYS_Mul(start_r - end_r, start_r - end_r);\n    int width = pBitmap->GetWidth();\n    int height = pBitmap->GetHeight();\n    int pitch = pBitmap->GetPitch();\n    int Bpp = pBitmap->GetBPP() / 8;\n    FX_BOOL bDecreasing = FALSE;\n    if (start_r > end_r) {\n        int length = (int)FXSYS_sqrt((FXSYS_Mul(start_x - end_x, start_x - end_x) + FXSYS_Mul(start_y - end_y, start_y - end_y)));\n        if (length < start_r - end_r) {\n            bDecreasing = TRUE;\n        }\n    }\n    for (int row = 0; row < height; row ++) {\n        FX_DWORD* dib_buf = (FX_DWORD*)(pBitmap->GetBuffer() + row * pitch);\n        for (int column = 0; column < width; column ++) {\n            FX_FLOAT x = (FX_FLOAT)column, y = (FX_FLOAT)row;\n            matrix.Transform(x, y);\n            FX_FLOAT b = -2 * (FXSYS_Mul(x - start_x, end_x - start_x) + FXSYS_Mul(y - start_y, end_y - start_y) +\n                               FXSYS_Mul(start_r, end_r - start_r));\n            FX_FLOAT c = FXSYS_Mul(x - start_x, x - start_x) + FXSYS_Mul(y - start_y, y - start_y) -\n                         FXSYS_Mul(start_r, start_r);\n            FX_FLOAT s;\n            if (a == 0) {\n                s = FXSYS_Div(-c, b);\n            } else {\n                FX_FLOAT b2_4ac = FXSYS_Mul(b, b) - 4 * FXSYS_Mul(a, c);\n                if (b2_4ac < 0) {\n                    continue;\n                }\n                FX_FLOAT root = FXSYS_sqrt(b2_4ac);\n                FX_FLOAT s1, s2;\n                if (a > 0) {\n                    s1 = FXSYS_Div(-b - root, 2 * a);\n                    s2 = FXSYS_Div(-b + root, 2 * a);\n                } else {\n                    s2 = FXSYS_Div(-b - root, 2 * a);\n                    s1 = FXSYS_Div(-b + root, 2 * a);\n                }\n                if (bDecreasing) {\n                    if (s1 >= 0 || bStartExtend) {\n                        s = s1;\n                    } else {\n                        s = s2;\n                    }\n                } else {\n                    if (s2 <= 1.0f || bEndExtend) {\n                        s = s2;\n                    } else {\n                        s = s1;\n                    }\n                }\n                if ((start_r + s * (end_r - start_r)) < 0) {\n                    continue;\n                }\n            }\n            int index = (FX_INT32)(s * (SHADING_STEPS - 1));\n            if (index < 0) {\n                if (!bStartExtend) {\n                    continue;\n                }\n                index = 0;\n            }\n            if (index >= SHADING_STEPS) {\n                if (!bEndExtend) {\n                    continue;\n                }\n                index = SHADING_STEPS - 1;\n            }\n            dib_buf[column] = rgb_array[index];\n        }\n    }\n}\nstatic void _DrawFuncShading(CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,\n                             CPDF_Dictionary* pDict, CPDF_Function** pFuncs, int nFuncs,\n                             CPDF_ColorSpace* pCS, int alpha)\n{\n    ASSERT(pBitmap->GetFormat() == FXDIB_Argb);\n    CPDF_Array* pDomain = pDict->GetArray(FX_BSTRC(\"Domain\"));\n    FX_FLOAT xmin = 0, ymin = 0, xmax = 1.0f, ymax = 1.0f;\n    if (pDomain) {\n        xmin = pDomain->GetNumber(0);\n        xmax = pDomain->GetNumber(1);\n        ymin = pDomain->GetNumber(2);\n        ymax = pDomain->GetNumber(3);\n    }\n    CFX_AffineMatrix mtDomain2Target = pDict->GetMatrix(FX_BSTRC(\"Matrix\"));\n    CFX_AffineMatrix matrix, reverse_matrix;\n    matrix.SetReverse(*pObject2Bitmap);\n    reverse_matrix.SetReverse(mtDomain2Target);\n    matrix.Concat(reverse_matrix);\n    int width = pBitmap->GetWidth();\n    int height = pBitmap->GetHeight();\n    int pitch = pBitmap->GetPitch();\n    int Bpp = pBitmap->GetBPP() / 8;\n    int total_results = 0;\n    for (int j = 0; j < nFuncs; j ++) {\n        if (pFuncs[j]) {\n            total_results += pFuncs[j]->CountOutputs();\n        }\n    }\n    if (pCS->CountComponents() > total_results) {\n        total_results = pCS->CountComponents();\n    }\n    CFX_FixedBufGrow<FX_FLOAT, 16> result_array(total_results);\n    FX_FLOAT* pResults = result_array;\n    FXSYS_memset32(pResults, 0, total_results * sizeof(FX_FLOAT));\n    for (int row = 0; row < height; row ++) {\n        FX_DWORD* dib_buf = (FX_DWORD*)(pBitmap->GetBuffer() + row * pitch);\n        for (int column = 0; column < width; column ++) {\n            FX_FLOAT x = (FX_FLOAT)column, y = (FX_FLOAT)row;\n            matrix.Transform(x, y);\n            if (x < xmin || x > xmax || y < ymin || y > ymax) {\n                continue;\n            }\n            FX_FLOAT input[2];\n            int offset = 0;\n            input[0] = x;\n            input[1] = y;\n            for (int j = 0; j < nFuncs; j ++) {\n                if (pFuncs[j]) {\n                    int nresults;\n                    if (pFuncs[j]->Call(input, 2, pResults + offset, nresults)) {\n                        offset += nresults;\n                    }\n                }\n            }\n            FX_FLOAT R, G, B;\n            pCS->GetRGB(pResults, R, G, B);\n            dib_buf[column] = FXARGB_TODIB(FXARGB_MAKE(alpha, (FX_INT32)(R * 255), (FX_INT32)(G * 255), (FX_INT32)(B * 255)));\n        }\n    }\n}\nFX_BOOL _GetScanlineIntersect(int y, FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_FLOAT& x)\n{\n    if (y1 == y2) {\n        return FALSE;\n    }\n    if (y1 < y2) {\n        if (y < y1 || y > y2) {\n            return FALSE;\n        }\n    } else {\n        if (y < y2 || y > y1) {\n            return FALSE;\n        }\n    }\n    x = x1 + FXSYS_MulDiv(x2 - x1, y - y1, y2 - y1);\n    return TRUE;\n}\nstatic void _DrawGouraud(CFX_DIBitmap* pBitmap, int alpha, CPDF_MeshVertex triangle[3])\n{\n    FX_FLOAT min_y = triangle[0].y, max_y = triangle[0].y;\n    for (int i = 1; i < 3; i ++) {\n        if (min_y > triangle[i].y) {\n            min_y = triangle[i].y;\n        }\n        if (max_y < triangle[i].y) {\n            max_y = triangle[i].y;\n        }\n    }\n    if (min_y == max_y) {\n        return;\n    }\n    int min_yi = (int)FXSYS_floor(min_y), max_yi = (int)FXSYS_ceil(max_y);\n    if (min_yi < 0) {\n        min_yi = 0;\n    }\n    if (max_yi >= pBitmap->GetHeight()) {\n        max_yi = pBitmap->GetHeight() - 1;\n    }\n    for (int y = min_yi; y <= max_yi; y ++) {\n        int nIntersects = 0;\n        FX_FLOAT inter_x[3], r[3], g[3], b[3];\n        for (int i = 0; i < 3; i ++) {\n            CPDF_MeshVertex& vertex1 = triangle[i];\n            CPDF_MeshVertex& vertex2 = triangle[(i + 1) % 3];\n            FX_BOOL bIntersect = _GetScanlineIntersect(y, vertex1.x, vertex1.y,\n                                 vertex2.x, vertex2.y, inter_x[nIntersects]);\n            if (!bIntersect) {\n                continue;\n            }\n            r[nIntersects] = vertex1.r + FXSYS_MulDiv(vertex2.r - vertex1.r, y - vertex1.y, vertex2.y - vertex1.y);\n            g[nIntersects] = vertex1.g + FXSYS_MulDiv(vertex2.g - vertex1.g, y - vertex1.y, vertex2.y - vertex1.y);\n            b[nIntersects] = vertex1.b + FXSYS_MulDiv(vertex2.b - vertex1.b, y - vertex1.y, vertex2.y - vertex1.y);\n            nIntersects ++;\n        }\n        if (nIntersects != 2) {\n            continue;\n        }\n        int min_x, max_x, start_index, end_index;\n        if (inter_x[0] < inter_x[1]) {\n            min_x = (int)FXSYS_floor(inter_x[0]);\n            max_x = (int)FXSYS_ceil(inter_x[1]);\n            start_index = 0;\n            end_index = 1;\n        } else {\n            min_x = (int)FXSYS_floor(inter_x[1]);\n            max_x = (int)FXSYS_ceil(inter_x[0]);\n            start_index = 1;\n            end_index = 0;\n        }\n        int start_x = min_x, end_x = max_x;\n        if (start_x < 0) {\n            start_x = 0;\n        }\n        if (end_x > pBitmap->GetWidth()) {\n            end_x = pBitmap->GetWidth();\n        }\n        FX_LPBYTE dib_buf = pBitmap->GetBuffer() + y * pBitmap->GetPitch() + start_x * 4;\n        FX_FLOAT r_unit = (r[end_index] - r[start_index]) / (max_x - min_x);\n        FX_FLOAT g_unit = (g[end_index] - g[start_index]) / (max_x - min_x);\n        FX_FLOAT b_unit = (b[end_index] - b[start_index]) / (max_x - min_x);\n        FX_FLOAT R = r[start_index] + (start_x - min_x) * r_unit;\n        FX_FLOAT G = g[start_index] + (start_x - min_x) * g_unit;\n        FX_FLOAT B = b[start_index] + (start_x - min_x) * b_unit;\n        for (int x = start_x; x < end_x; x ++) {\n            R += r_unit;\n            G += g_unit;\n            B += b_unit;\n            FXARGB_SETDIB(dib_buf, FXARGB_MAKE(alpha, (FX_INT32)(R * 255), (FX_INT32)(G * 255), (FX_INT32)(B * 255)));\n            dib_buf += 4;\n        }\n    }\n}\nstatic void _DrawFreeGouraudShading(CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,\n                                    CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs,\n                                    CPDF_ColorSpace* pCS, int alpha)\n{\n    ASSERT(pBitmap->GetFormat() == FXDIB_Argb);\n    if (pShadingStream->GetType() != PDFOBJ_STREAM) {\n        return;\n    }\n    CPDF_MeshStream stream;\n    if (!stream.Load(pShadingStream, pFuncs, nFuncs, pCS)) {\n        return;\n    }\n    CPDF_MeshVertex triangle[3];\n    FXSYS_memset32(triangle, 0, sizeof(triangle));\n\n    while (!stream.m_BitStream.IsEOF()) {\n        CPDF_MeshVertex vertex;\n        FX_DWORD flag = stream.GetVertex(vertex, pObject2Bitmap);\n        if (flag == 0) {\n            triangle[0] = vertex;\n            for (int j = 1; j < 3; j ++) {\n                stream.GetVertex(triangle[j], pObject2Bitmap);\n            }\n        } else {\n            if (flag == 1) {\n                triangle[0] = triangle[1];\n            }\n            triangle[1] = triangle[2];\n            triangle[2] = vertex;\n        }\n        _DrawGouraud(pBitmap, alpha, triangle);\n    }\n}\nstatic void _DrawLatticeGouraudShading(CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,\n                                       CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs,\n                                       CPDF_ColorSpace* pCS, int alpha)\n{\n    ASSERT(pBitmap->GetFormat() == FXDIB_Argb);\n    if (pShadingStream->GetType() != PDFOBJ_STREAM) {\n        return;\n    }\n    int row_verts = pShadingStream->GetDict()->GetInteger(\"VerticesPerRow\");\n    if (row_verts < 2) {\n        return;\n    }\n    CPDF_MeshStream stream;\n    if (!stream.Load(pShadingStream, pFuncs, nFuncs, pCS)) {\n        return;\n    }\n    CPDF_MeshVertex* vertex = FX_Alloc(CPDF_MeshVertex, row_verts * 2);\n    if (!stream.GetVertexRow(vertex, row_verts, pObject2Bitmap)) {\n        FX_Free(vertex);\n        return;\n    }\n    int last_index = 0;\n    while (1) {\n        CPDF_MeshVertex* last_row = vertex + last_index * row_verts;\n        CPDF_MeshVertex* this_row = vertex + (1 - last_index) * row_verts;\n        if (!stream.GetVertexRow(this_row, row_verts, pObject2Bitmap)) {\n            FX_Free(vertex);\n            return;\n        }\n        CPDF_MeshVertex triangle[3];\n        for (int i = 1; i < row_verts; i ++) {\n            triangle[0] = last_row[i];\n            triangle[1] = this_row[i - 1];\n            triangle[2] = last_row[i - 1];\n            _DrawGouraud(pBitmap, alpha, triangle);\n            triangle[2] = this_row[i];\n            _DrawGouraud(pBitmap, alpha, triangle);\n        }\n        last_index = 1 - last_index;\n    }\n    FX_Free(vertex);\n}\nstruct Coon_BezierCoeff {\n    float a, b, c, d;\n    void FromPoints(float p0, float p1, float p2, float p3)\n    {\n        a = -p0 + 3 * p1 - 3 * p2 + p3;\n        b = 3 * p0 - 6 * p1 + 3 * p2;\n        c = -3 * p0 + 3 * p1;\n        d = p0;\n    }\n    Coon_BezierCoeff first_half()\n    {\n        Coon_BezierCoeff result;\n        result.a = a / 8;\n        result.b = b / 4;\n        result.c = c / 2;\n        result.d = d;\n        return result;\n    }\n    Coon_BezierCoeff second_half()\n    {\n        Coon_BezierCoeff result;\n        result.a = a / 8;\n        result.b = 3 * a / 8 + b / 4;\n        result.c = 3 * a / 8 + b / 2 + c / 2;\n        result.d = a / 8 + b / 4 + c / 2 + d;\n        return result;\n    }\n    void GetPoints(float p[4])\n    {\n        p[0] = d;\n        p[1] = c / 3 + p[0];\n        p[2] = b / 3 - p[0] + 2 * p[1];\n        p[3] = a + p[0] - 3 * p[1] + 3 * p[2];\n    }\n    void GetPointsReverse(float p[4])\n    {\n        p[3] = d;\n        p[2] = c / 3 + p[3];\n        p[1] = b / 3 - p[3] + 2 * p[2];\n        p[0] = a + p[3] - 3 * p[2] + 3 * p[1];\n    }\n    void BezierInterpol(Coon_BezierCoeff& C1, Coon_BezierCoeff& C2, Coon_BezierCoeff& D1, Coon_BezierCoeff& D2)\n    {\n        a = (D1.a + D2.a) / 2;\n        b = (D1.b + D2.b) / 2;\n        c = (D1.c + D2.c) / 2 - (C1.a / 8 + C1.b / 4 + C1.c / 2) + (C2.a / 8 + C2.b / 4) + (-C1.d + D2.d) / 2 - (C2.a + C2.b) / 2;\n        d = C1.a / 8 + C1.b / 4 + C1.c / 2 + C1.d;\n    }\n    float Distance()\n    {\n        float dis = a + b + c;\n        return dis < 0 ? -dis : dis;\n    }\n};\nstruct Coon_Bezier {\n    Coon_BezierCoeff x, y;\n    void FromPoints(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3)\n    {\n        x.FromPoints(x0, x1, x2, x3);\n        y.FromPoints(y0, y1, y2, y3);\n    }\n    Coon_Bezier first_half()\n    {\n        Coon_Bezier result;\n        result.x = x.first_half();\n        result.y = y.first_half();\n        return result;\n    }\n    Coon_Bezier second_half()\n    {\n        Coon_Bezier result;\n        result.x = x.second_half();\n        result.y = y.second_half();\n        return result;\n    }\n    void BezierInterpol(Coon_Bezier& C1, Coon_Bezier& C2, Coon_Bezier& D1, Coon_Bezier& D2)\n    {\n        x.BezierInterpol(C1.x, C2.x, D1.x, D2.x);\n        y.BezierInterpol(C1.y, C2.y, D1.y, D2.y);\n    }\n    void GetPoints(FX_PATHPOINT* pPoints)\n    {\n        float p[4];\n        int i;\n        x.GetPoints(p);\n        for (i = 0; i < 4; i ++) {\n            pPoints[i].m_PointX = p[i];\n        }\n        y.GetPoints(p);\n        for (i = 0; i < 4; i ++) {\n            pPoints[i].m_PointY = p[i];\n        }\n    }\n    void GetPointsReverse(FX_PATHPOINT* pPoints)\n    {\n        float p[4];\n        int i;\n        x.GetPointsReverse(p);\n        for (i = 0; i < 4; i ++) {\n            pPoints[i].m_PointX = p[i];\n        }\n        y.GetPointsReverse(p);\n        for (i = 0; i < 4; i ++) {\n            pPoints[i].m_PointY = p[i];\n        }\n    }\n    float Distance()\n    {\n        return x.Distance() + y.Distance();\n    }\n};\nstatic int _BiInterpol(int c0, int c1, int c2, int c3, int x, int y, int x_scale, int y_scale)\n{\n    int x1 = c0 + (c3 - c0) * x / x_scale;\n    int x2 = c1 + (c2 - c1) * x / x_scale;\n    return x1 + (x2 - x1) * y / y_scale;\n}\nstruct Coon_Color {\n    Coon_Color()\n    {\n        FXSYS_memset32(comp, 0, sizeof(int) * 3);\n    }\n    int\t\tcomp[3];\n    void\tBiInterpol(Coon_Color colors[4], int x, int y, int x_scale, int y_scale)\n    {\n        for (int i = 0; i < 3; i ++)\n            comp[i] = _BiInterpol(colors[0].comp[i], colors[1].comp[i], colors[2].comp[i], colors[3].comp[i],\n                                  x, y, x_scale, y_scale);\n    }\n    int\t\tDistance(Coon_Color& o)\n    {\n        int max, diff;\n        max = FXSYS_abs(comp[0] - o.comp[0]);\n        diff = FXSYS_abs(comp[1] - o.comp[1]);\n        if (max < diff) {\n            max = diff;\n        }\n        diff = FXSYS_abs(comp[2] - o.comp[2]);\n        if (max < diff) {\n            max = diff;\n        }\n        return max;\n    }\n};\nstruct CPDF_PatchDrawer {\n    Coon_Color\t\t\tpatch_colors[4];\n    int\t\t\t\t\tmax_delta;\n    CFX_PathData\t\tpath;\n    CFX_RenderDevice*\tpDevice;\n    int\t\t\t\t\tfill_mode;\n    int\t\t\t\t\talpha;\n    void Draw(int x_scale, int y_scale, int left, int bottom, Coon_Bezier C1, Coon_Bezier C2, Coon_Bezier D1, Coon_Bezier D2)\n    {\n        FX_BOOL bSmall = C1.Distance() < 2 && C2.Distance() < 2 && D1.Distance() < 2 && D2.Distance() < 2;\n        Coon_Color div_colors[4];\n        int d_bottom, d_left, d_top, d_right;\n        div_colors[0].BiInterpol(patch_colors, left, bottom, x_scale, y_scale);\n        if (!bSmall) {\n            div_colors[1].BiInterpol(patch_colors, left, bottom + 1, x_scale, y_scale);\n            div_colors[2].BiInterpol(patch_colors, left + 1, bottom + 1, x_scale, y_scale);\n            div_colors[3].BiInterpol(patch_colors, left + 1, bottom, x_scale, y_scale);\n            d_bottom = div_colors[3].Distance(div_colors[0]);\n            d_left = div_colors[1].Distance(div_colors[0]);\n            d_top = div_colors[1].Distance(div_colors[2]);\n            d_right = div_colors[2].Distance(div_colors[3]);\n        }\n#define COONCOLOR_THRESHOLD 4\n        if (bSmall || (d_bottom < COONCOLOR_THRESHOLD && d_left < COONCOLOR_THRESHOLD &&\n                       d_top < COONCOLOR_THRESHOLD && d_right < COONCOLOR_THRESHOLD)) {\n            FX_PATHPOINT* pPoints = path.GetPoints();\n            C1.GetPoints(pPoints);\n            D2.GetPoints(pPoints + 3);\n            C2.GetPointsReverse(pPoints + 6);\n            D1.GetPointsReverse(pPoints + 9);\n            int fillFlags = FXFILL_WINDING | FXFILL_FULLCOVER;\n            if (fill_mode & RENDER_NOPATHSMOOTH) {\n                fillFlags |= FXFILL_NOPATHSMOOTH;\n            }\n            pDevice->DrawPath(&path, NULL, NULL, FXARGB_MAKE(alpha, div_colors[0].comp[0], div_colors[0].comp[1], div_colors[0].comp[2]), 0, fillFlags);\n        } else {\n            if (d_bottom < COONCOLOR_THRESHOLD && d_top < COONCOLOR_THRESHOLD) {\n                Coon_Bezier m1;\n                m1.BezierInterpol(D1, D2, C1, C2);\n                y_scale *= 2;\n                bottom *= 2;\n                Draw(x_scale, y_scale, left, bottom, C1, m1, D1.first_half(), D2.first_half());\n                Draw(x_scale, y_scale, left, bottom + 1, m1, C2, D1.second_half(), D2.second_half());\n            } else if (d_left < COONCOLOR_THRESHOLD && d_right < COONCOLOR_THRESHOLD) {\n                Coon_Bezier m2;\n                m2.BezierInterpol(C1, C2, D1, D2);\n                x_scale *= 2;\n                left *= 2;\n                Draw(x_scale, y_scale, left, bottom, C1.first_half(), C2.first_half(), D1, m2);\n                Draw(x_scale, y_scale, left + 1, bottom, C1.second_half(), C2.second_half(), m2, D2);\n            } else {\n                Coon_Bezier m1, m2;\n                m1.BezierInterpol(D1, D2, C1, C2);\n                m2.BezierInterpol(C1, C2, D1, D2);\n                Coon_Bezier m1f = m1.first_half();\n                Coon_Bezier m1s = m1.second_half();\n                Coon_Bezier m2f = m2.first_half();\n                Coon_Bezier m2s = m2.second_half();\n                x_scale *= 2;\n                y_scale *= 2;\n                left *= 2;\n                bottom *= 2;\n                Draw(x_scale, y_scale, left, bottom, C1.first_half(), m1f, D1.first_half(), m2f);\n                Draw(x_scale, y_scale, left, bottom + 1, m1f, C2.first_half(), D1.second_half(), m2s);\n                Draw(x_scale, y_scale, left + 1, bottom, C1.second_half(), m1s, m2f, D2.first_half());\n                Draw(x_scale, y_scale, left + 1, bottom + 1, m1s, C2.second_half(), m2s, D2.second_half());\n            }\n        }\n    }\n};\nstatic void _DrawCoonPatchMeshes(FX_BOOL bTensor, CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,\n                                 CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs,\n                                 CPDF_ColorSpace* pCS, int fill_mode, int alpha)\n{\n    ASSERT(pBitmap->GetFormat() == FXDIB_Argb);\n    if (pShadingStream->GetType() != PDFOBJ_STREAM) {\n        return;\n    }\n    CFX_FxgeDevice device;\n    device.Attach(pBitmap);\n    CPDF_MeshStream stream;\n    if (!stream.Load(pShadingStream, pFuncs, nFuncs, pCS)) {\n        return;\n    }\n    CPDF_PatchDrawer patch;\n    patch.alpha = alpha;\n    patch.pDevice = &device;\n    patch.fill_mode = fill_mode;\n    patch.path.SetPointCount(13);\n    FX_PATHPOINT* pPoints = patch.path.GetPoints();\n    pPoints[0].m_Flag = FXPT_MOVETO;\n    for (int i = 1; i < 13; i ++) {\n        pPoints[i].m_Flag = FXPT_BEZIERTO;\n    }\n    CFX_FloatPoint coords[16];\n    for (int i = 0; i < 16; i ++)\n    {\n        coords[i].Set(0.0f, 0.0f);\n    }\n\n    int point_count = bTensor ? 16 : 12;\n    while (!stream.m_BitStream.IsEOF()) {\n        FX_DWORD flag = stream.GetFlag();\n        int iStartPoint = 0, iStartColor = 0, i;\n        if (flag) {\n            iStartPoint = 4;\n            iStartColor = 2;\n            CFX_FloatPoint tempCoords[4];\n            for (int i = 0; i < 4; i ++) {\n                tempCoords[i] = coords[(flag * 3 + i) % 12];\n            }\n            FXSYS_memcpy32(coords, tempCoords, sizeof(CFX_FloatPoint) * 4);\n            Coon_Color tempColors[2];\n            tempColors[0] = patch.patch_colors[flag];\n            tempColors[1] = patch.patch_colors[(flag + 1) % 4];\n            FXSYS_memcpy32(patch.patch_colors, tempColors, sizeof(Coon_Color) * 2);\n        }\n        for (i = iStartPoint; i < point_count; i ++) {\n            stream.GetCoords(coords[i].x, coords[i].y);\n            pObject2Bitmap->Transform(coords[i].x, coords[i].y);\n        }\n        for (i = iStartColor; i < 4; i ++) {\n            FX_FLOAT r=0.0f, g=0.0f, b=0.0f;\n            stream.GetColor(r, g, b);\n            patch.patch_colors[i].comp[0] = (FX_INT32)(r * 255);\n            patch.patch_colors[i].comp[1] = (FX_INT32)(g * 255);\n            patch.patch_colors[i].comp[2] = (FX_INT32)(b * 255);\n        }\n        CFX_FloatRect bbox = CFX_FloatRect::GetBBox(coords, point_count);\n        if (bbox.right <= 0 || bbox.left >= (FX_FLOAT)pBitmap->GetWidth() || bbox.top <= 0 ||\n                bbox.bottom >= (FX_FLOAT)pBitmap->GetHeight()) {\n            continue;\n        }\n        Coon_Bezier C1, C2, D1, D2;\n        C1.FromPoints(coords[0].x, coords[0].y, coords[11].x, coords[11].y, coords[10].x, coords[10].y,\n                      coords[9].x, coords[9].y);\n        C2.FromPoints(coords[3].x, coords[3].y, coords[4].x, coords[4].y, coords[5].x, coords[5].y,\n                      coords[6].x, coords[6].y);\n        D1.FromPoints(coords[0].x, coords[0].y, coords[1].x, coords[1].y, coords[2].x, coords[2].y,\n                      coords[3].x, coords[3].y);\n        D2.FromPoints(coords[9].x, coords[9].y, coords[8].x, coords[8].y, coords[7].x, coords[7].y,\n                      coords[6].x, coords[6].y);\n        patch.Draw(1, 1, 0, 0, C1, C2, D1, D2);\n    }\n}\nvoid CPDF_RenderStatus::DrawShading(CPDF_ShadingPattern* pPattern, CFX_AffineMatrix* pMatrix,\n                                    FX_RECT& clip_rect, int alpha, FX_BOOL bAlphaMode)\n{\n    int width = clip_rect.Width();\n    int height = clip_rect.Height();\n    CPDF_Function** pFuncs = pPattern->m_pFunctions;\n    int nFuncs = pPattern->m_nFuncs;\n    CPDF_Dictionary* pDict = pPattern->m_pShadingObj->GetDict();\n    CPDF_ColorSpace* pColorSpace = pPattern->m_pCS;\n    if (pColorSpace == NULL) {\n        return;\n    }\n    FX_ARGB background = 0;\n    if (!pPattern->m_bShadingObj && pPattern->m_pShadingObj->GetDict()->KeyExist(FX_BSTRC(\"Background\"))) {\n        CPDF_Array* pBackColor = pPattern->m_pShadingObj->GetDict()->GetArray(FX_BSTRC(\"Background\"));\n        if (pBackColor && pBackColor->GetCount() >= (FX_DWORD)pColorSpace->CountComponents()) {\n            CFX_FixedBufGrow<FX_FLOAT, 16> comps(pColorSpace->CountComponents());\n            for (int i = 0; i < pColorSpace->CountComponents(); i ++) {\n                comps[i] = pBackColor->GetNumber(i);\n            }\n            FX_FLOAT R = 0.0f, G = 0.0f, B = 0.0f;\n            pColorSpace->GetRGB(comps, R, G, B);\n            background = ArgbEncode(255, (FX_INT32)(R * 255), (FX_INT32)(G * 255), (FX_INT32)(B * 255));\n        }\n    }\n    if (pDict->KeyExist(FX_BSTRC(\"BBox\"))) {\n        CFX_FloatRect rect = pDict->GetRect(FX_BSTRC(\"BBox\"));\n        rect.Transform(pMatrix);\n        clip_rect.Intersect(rect.GetOutterRect());\n    }\n    CPDF_DeviceBuffer buffer;\n    buffer.Initialize(m_pContext, m_pDevice, &clip_rect, m_pCurObj, 150);\n    CFX_AffineMatrix FinalMatrix = *pMatrix;\n    FinalMatrix.Concat(*buffer.GetMatrix());\n    CFX_DIBitmap* pBitmap = buffer.GetBitmap();\n    if (pBitmap->GetBuffer() == NULL) {\n        return;\n    }\n    pBitmap->Clear(background);\n    int fill_mode = m_Options.m_Flags;\n    switch (pPattern->m_ShadingType) {\n        case 1:\n            _DrawFuncShading(pBitmap, &FinalMatrix, pDict, pFuncs, nFuncs, pColorSpace, alpha);\n            break;\n        case 2:\n            _DrawAxialShading(pBitmap, &FinalMatrix, pDict, pFuncs, nFuncs, pColorSpace, alpha);\n            break;\n        case 3:\n            _DrawRadialShading(pBitmap, &FinalMatrix, pDict, pFuncs, nFuncs, pColorSpace, alpha);\n            break;\n        case 4: {\n                _DrawFreeGouraudShading(pBitmap, &FinalMatrix, (CPDF_Stream*)pPattern->m_pShadingObj,\n                                        pFuncs, nFuncs, pColorSpace, alpha);\n            }\n            break;\n        case 5: {\n                _DrawLatticeGouraudShading(pBitmap, &FinalMatrix, (CPDF_Stream*)pPattern->m_pShadingObj,\n                                           pFuncs, nFuncs, pColorSpace, alpha);\n            }\n            break;\n        case 6:\n        case 7: {\n                _DrawCoonPatchMeshes(pPattern->m_ShadingType - 6, pBitmap, &FinalMatrix, (CPDF_Stream*)pPattern->m_pShadingObj,\n                                     pFuncs, nFuncs, pColorSpace, fill_mode, alpha);\n            }\n            break;\n    }\n    if (bAlphaMode) {\n        pBitmap->LoadChannel(FXDIB_Red, pBitmap, FXDIB_Alpha);\n    }\n    if (m_Options.m_ColorMode == RENDER_COLOR_GRAY) {\n        pBitmap->ConvertColorScale(m_Options.m_ForeColor, m_Options.m_BackColor);\n    }\n    buffer.OutputToDevice();\n}\nvoid CPDF_RenderStatus::DrawShadingPattern(CPDF_ShadingPattern* pattern, CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke)\n{\n    if (!pattern->Load()) {\n        return;\n    }\n    m_pDevice->SaveState();\n    if (pPageObj->m_Type == PDFPAGE_PATH) {\n        if (!SelectClipPath((CPDF_PathObject*)pPageObj, pObj2Device, bStroke)) {\n            m_pDevice->RestoreState();\n            return;\n        }\n    } else if (pPageObj->m_Type == PDFPAGE_IMAGE) {\n        FX_RECT rect = pPageObj->GetBBox(pObj2Device);\n        m_pDevice->SetClip_Rect(&rect);\n    } else {\n        return;\n    }\n    FX_RECT rect;\n    if (GetObjectClippedRect(pPageObj, pObj2Device, FALSE, rect)) {\n        m_pDevice->RestoreState();\n        return;\n    }\n    CFX_AffineMatrix matrix = pattern->m_Pattern2Form;\n    matrix.Concat(*pObj2Device);\n    GetScaledMatrix(matrix);\n    int alpha = pPageObj->m_GeneralState.GetAlpha(bStroke);\n    DrawShading(pattern, &matrix, rect, alpha, m_Options.m_ColorMode == RENDER_COLOR_ALPHA);\n    m_pDevice->RestoreState();\n}\nFX_BOOL CPDF_RenderStatus::ProcessShading(CPDF_ShadingObject* pShadingObj, const CFX_AffineMatrix* pObj2Device)\n{\n    FX_RECT rect = pShadingObj->GetBBox(pObj2Device);\n    FX_RECT clip_box = m_pDevice->GetClipBox();\n    rect.Intersect(clip_box);\n    if (rect.IsEmpty()) {\n        return TRUE;\n    }\n    CFX_AffineMatrix matrix = pShadingObj->m_Matrix;\n    matrix.Concat(*pObj2Device);\n    DrawShading(pShadingObj->m_pShading, &matrix, rect, pShadingObj->m_GeneralState.GetAlpha(FALSE),\n                m_Options.m_ColorMode == RENDER_COLOR_ALPHA);\n#ifdef _FPDFAPI_MINI_\n    if (m_DitherBits) {\n        DitherObjectArea(pShadingObj, pObj2Device);\n    }\n#endif\n    return TRUE;\n}\nstatic CFX_DIBitmap* DrawPatternBitmap(CPDF_Document* pDoc, CPDF_PageRenderCache* pCache,\n                                       CPDF_TilingPattern* pPattern, const CFX_AffineMatrix* pObject2Device,\n                                       int width, int height, int flags)\n{\n    CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;\n    if (!pBitmap->Create(width, height, pPattern->m_bColored ? FXDIB_Argb : FXDIB_8bppMask)) {\n        delete pBitmap;\n        return NULL;\n    }\n    CFX_FxgeDevice bitmap_device;\n    bitmap_device.Attach(pBitmap);\n    pBitmap->Clear(0);\n    CFX_FloatRect cell_bbox = pPattern->m_BBox;\n    pPattern->m_Pattern2Form.TransformRect(cell_bbox);\n    pObject2Device->TransformRect(cell_bbox);\n    CFX_FloatRect bitmap_rect(0.0f, 0.0f, (FX_FLOAT)width, (FX_FLOAT)height);\n    CFX_AffineMatrix mtAdjust;\n    mtAdjust.MatchRect(bitmap_rect, cell_bbox);\n    CFX_AffineMatrix mtPattern2Bitmap = *pObject2Device;\n    mtPattern2Bitmap.Concat(mtAdjust);\n    CPDF_RenderOptions options;\n    if (!pPattern->m_bColored) {\n        options.m_ColorMode = RENDER_COLOR_ALPHA;\n    }\n    flags |= RENDER_FORCE_HALFTONE;\n    options.m_Flags = flags;\n    CPDF_RenderContext context;\n    context.Create(pDoc, pCache, NULL);\n    context.DrawObjectList(&bitmap_device, pPattern->m_pForm, &mtPattern2Bitmap, &options);\n    return pBitmap;\n}\nvoid CPDF_RenderStatus::DrawTilingPattern(CPDF_TilingPattern* pPattern, CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke)\n{\n    if (!pPattern->Load()) {\n        return;\n    }\n    m_pDevice->SaveState();\n    if (pPageObj->m_Type == PDFPAGE_PATH) {\n        if (!SelectClipPath((CPDF_PathObject*)pPageObj, pObj2Device, bStroke)) {\n            m_pDevice->RestoreState();\n            return;\n        }\n    } else if (pPageObj->m_Type == PDFPAGE_IMAGE) {\n        FX_RECT rect = pPageObj->GetBBox(pObj2Device);\n        m_pDevice->SetClip_Rect(&rect);\n    } else {\n        return;\n    }\n    FX_RECT clip_box = m_pDevice->GetClipBox();\n    if (clip_box.IsEmpty()) {\n        m_pDevice->RestoreState();\n        return;\n    }\n    CFX_Matrix dCTM = m_pDevice->GetCTM();\n    FX_FLOAT sa = FXSYS_fabs(dCTM.a);\n    FX_FLOAT sd = FXSYS_fabs(dCTM.d);\n    clip_box.right = clip_box.left + (FX_INT32)FXSYS_ceil(clip_box.Width() * sa);\n    clip_box.bottom = clip_box.top + (FX_INT32)FXSYS_ceil(clip_box.Height() * sd);\n    CFX_AffineMatrix mtPattern2Device = pPattern->m_Pattern2Form;\n    mtPattern2Device.Concat(*pObj2Device);\n    GetScaledMatrix(mtPattern2Device);\n    FX_BOOL bAligned = FALSE;\n    if (pPattern->m_BBox.left == 0 && pPattern->m_BBox.bottom == 0 &&\n            pPattern->m_BBox.right == pPattern->m_XStep && pPattern->m_BBox.top == pPattern->m_YStep &&\n            (mtPattern2Device.IsScaled() || mtPattern2Device.Is90Rotated())) {\n        bAligned = TRUE;\n    }\n    CFX_FloatRect cell_bbox = pPattern->m_BBox;\n    mtPattern2Device.TransformRect(cell_bbox);\n    int width = (int)FXSYS_ceil(cell_bbox.Width());\n    int height = (int)FXSYS_ceil(cell_bbox.Height());\n    if (width == 0) {\n        width = 1;\n    }\n    if (height == 0) {\n        height = 1;\n    }\n    int min_col, max_col, min_row, max_row;\n    CFX_AffineMatrix mtDevice2Pattern;\n    mtDevice2Pattern.SetReverse(mtPattern2Device);\n    CFX_FloatRect clip_box_p(clip_box);\n    clip_box_p.Transform(&mtDevice2Pattern);\n    min_col = (int)FXSYS_ceil(FXSYS_Div(clip_box_p.left - pPattern->m_BBox.right, pPattern->m_XStep));\n    max_col = (int)FXSYS_floor(FXSYS_Div(clip_box_p.right - pPattern->m_BBox.left, pPattern->m_XStep));\n    min_row = (int)FXSYS_ceil(FXSYS_Div(clip_box_p.bottom - pPattern->m_BBox.top, pPattern->m_YStep));\n    max_row = (int)FXSYS_floor(FXSYS_Div(clip_box_p.top - pPattern->m_BBox.bottom, pPattern->m_YStep));\n    if (width > clip_box.Width() || height > clip_box.Height() || width * height > clip_box.Width() * clip_box.Height()) {\n        CPDF_GraphicStates* pStates = NULL;\n        if (!pPattern->m_bColored) {\n            pStates = CloneObjStates(pPageObj, bStroke);\n        }\n        CPDF_Dictionary* pFormResource = NULL;\n        if (pPattern->m_pForm->m_pFormDict) {\n            pFormResource = pPattern->m_pForm->m_pFormDict->GetDict(FX_BSTRC(\"Resources\"));\n        }\n        for (int col = min_col; col <= max_col; col ++)\n            for (int row = min_row; row <= max_row; row ++) {\n                FX_FLOAT orig_x, orig_y;\n                orig_x = col * pPattern->m_XStep;\n                orig_y = row * pPattern->m_YStep;\n                mtPattern2Device.Transform(orig_x, orig_y);\n                CFX_AffineMatrix matrix = *pObj2Device;\n                matrix.Translate(orig_x - mtPattern2Device.e, orig_y - mtPattern2Device.f);\n                m_pDevice->SaveState();\n                CPDF_RenderStatus status;\n                status.Initialize(m_Level + 1, m_pContext, m_pDevice, NULL, NULL, this, pStates, &m_Options,\n                                  pPattern->m_pForm->m_Transparency, m_bDropObjects, pFormResource);\n                status.RenderObjectList(pPattern->m_pForm, &matrix);\n                m_pDevice->RestoreState();\n            }\n        m_pDevice->RestoreState();\n        if (pStates) {\n            delete pStates;\n        }\n        return;\n    }\n    if (bAligned) {\n        int orig_x = FXSYS_round(mtPattern2Device.e);\n        int orig_y = FXSYS_round(mtPattern2Device.f);\n        min_col = (clip_box.left - orig_x) / width;\n        if (clip_box.left < orig_x) {\n            min_col --;\n        }\n        max_col = (clip_box.right - orig_x) / width;\n        if (clip_box.right <= orig_x) {\n            max_col --;\n        }\n        min_row = (clip_box.top - orig_y) / height;\n        if (clip_box.top < orig_y) {\n            min_row --;\n        }\n        max_row = (clip_box.bottom - orig_y) / height;\n        if (clip_box.bottom <= orig_y) {\n            max_row --;\n        }\n    }\n    FX_FLOAT left_offset = cell_bbox.left - mtPattern2Device.e;\n    FX_FLOAT top_offset = cell_bbox.bottom - mtPattern2Device.f;\n    CFX_DIBitmap* pPatternBitmap = NULL;\n    if (width * height < 16) {\n        CFX_DIBitmap* pEnlargedBitmap = DrawPatternBitmap(m_pContext->m_pDocument, m_pContext->m_pPageCache, pPattern, pObj2Device, 8, 8, m_Options.m_Flags);\n        pPatternBitmap = pEnlargedBitmap->StretchTo(width, height);\n        delete pEnlargedBitmap;\n    } else {\n        pPatternBitmap = DrawPatternBitmap(m_pContext->m_pDocument, m_pContext->m_pPageCache, pPattern, pObj2Device, width, height, m_Options.m_Flags);\n    }\n    if (pPatternBitmap == NULL) {\n        m_pDevice->RestoreState();\n        return;\n    }\n    if (m_Options.m_ColorMode == RENDER_COLOR_GRAY) {\n        pPatternBitmap->ConvertColorScale(m_Options.m_ForeColor, m_Options.m_BackColor);\n    }\n    FX_ARGB fill_argb = GetFillArgb(pPageObj);\n    int clip_width = clip_box.right - clip_box.left;\n    int clip_height = clip_box.bottom - clip_box.top;\n    CFX_DIBitmap screen;\n    if (!screen.Create(clip_width, clip_height, FXDIB_Argb)) {\n        return;\n    }\n    screen.Clear(0);\n    FX_DWORD* src_buf = (FX_DWORD*)pPatternBitmap->GetBuffer();\n    for (int col = min_col; col <= max_col; col ++) {\n        for (int row = min_row; row <= max_row; row ++) {\n            int start_x, start_y;\n            if (bAligned) {\n                start_x = FXSYS_round(mtPattern2Device.e) + col * width - clip_box.left;\n                start_y = FXSYS_round(mtPattern2Device.f) + row * height - clip_box.top;\n            } else {\n                FX_FLOAT orig_x = col * pPattern->m_XStep;\n                FX_FLOAT orig_y = row * pPattern->m_YStep;\n                mtPattern2Device.Transform(orig_x, orig_y);\n                start_x = FXSYS_round(orig_x + left_offset) - clip_box.left;\n                start_y = FXSYS_round(orig_y + top_offset) - clip_box.top;\n            }\n            if (width == 1 && height == 1) {\n                if (start_x < 0 || start_x >= clip_box.Width() || start_y < 0 || start_y >= clip_box.Height()) {\n                    continue;\n                }\n                FX_DWORD* dest_buf = (FX_DWORD*)(screen.GetBuffer() + screen.GetPitch() * start_y + start_x * 4);\n                if (pPattern->m_bColored) {\n                    *dest_buf = *src_buf;\n                } else {\n                    *dest_buf = (*(FX_LPBYTE)src_buf << 24) | (fill_argb & 0xffffff);\n                }\n            } else {\n                if (pPattern->m_bColored) {\n                    screen.CompositeBitmap(start_x, start_y, width, height, pPatternBitmap, 0, 0);\n                } else {\n                    screen.CompositeMask(start_x, start_y, width, height, pPatternBitmap, fill_argb, 0, 0);\n                }\n            }\n        }\n    }\n    CompositeDIBitmap(&screen, clip_box.left, clip_box.top, 0, 255, FXDIB_BLEND_NORMAL, FALSE);\n    m_pDevice->RestoreState();\n    delete pPatternBitmap;\n}\nvoid CPDF_RenderStatus::DrawPathWithPattern(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, CPDF_Color* pColor, FX_BOOL bStroke)\n{\n    CPDF_Pattern* pattern = pColor->GetPattern();\n    if (pattern == NULL) {\n        return;\n    }\n    if(pattern->m_PatternType == PATTERN_TILING) {\n        DrawTilingPattern((CPDF_TilingPattern*)pattern, pPathObj, pObj2Device, bStroke);\n    } else {\n        DrawShadingPattern((CPDF_ShadingPattern*)pattern, pPathObj, pObj2Device, bStroke);\n    }\n}\nvoid CPDF_RenderStatus::ProcessPathPattern(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, int& filltype, FX_BOOL& bStroke)\n{\n    FX_BOOL bPattern = FALSE;\n    if(filltype) {\n        CPDF_Color& FillColor = *pPathObj->m_ColorState.GetFillColor();\n        if(FillColor.m_pCS && FillColor.m_pCS->GetFamily() == PDFCS_PATTERN) {\n            DrawPathWithPattern(pPathObj, pObj2Device, &FillColor, FALSE);\n            filltype = 0;\n            bPattern = TRUE;\n        }\n    }\n    if(bStroke) {\n        CPDF_Color& StrokeColor = *pPathObj->m_ColorState.GetStrokeColor();\n        if(StrokeColor.m_pCS && StrokeColor.m_pCS->GetFamily() == PDFCS_PATTERN) {\n            DrawPathWithPattern(pPathObj, pObj2Device, &StrokeColor, TRUE);\n            bStroke = FALSE;\n            bPattern = TRUE;\n        }\n    }\n#ifdef _FPDFAPI_MINI_\n    if (bPattern && m_DitherBits) {\n        DitherObjectArea(pPathObj, pObj2Device);\n    }\n#endif\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxge/fx_ge.h\"\n#include \"../../../include/fpdfapi/fpdf_render.h\"\n#include \"../../../include/fpdfapi/fpdf_pageobj.h\"\n#include \"../fpdf_page/pageint.h\"\n#include \"render_int.h\"\nextern FX_BOOL IsAvailableMatrix(const CFX_AffineMatrix& matrix);\nCPDF_Type3Cache::~CPDF_Type3Cache()\n{\n    FX_POSITION pos = m_SizeMap.GetStartPosition();\n    CFX_ByteString Key;\n    CPDF_Type3Glyphs* pSizeCache = NULL;\n    while(pos) {\n        pSizeCache = (CPDF_Type3Glyphs*)m_SizeMap.GetNextValue(pos);\n        delete pSizeCache;\n    }\n    m_SizeMap.RemoveAll();\n}\nCFX_GlyphBitmap* CPDF_Type3Cache::LoadGlyph(FX_DWORD charcode, const CFX_AffineMatrix* pMatrix, FX_FLOAT retinaScaleX, FX_FLOAT retinaScaleY)\n{\n    _CPDF_UniqueKeyGen keygen;\n    keygen.Generate(4, FXSYS_round(pMatrix->a * 10000), FXSYS_round(pMatrix->b * 10000),\n                    FXSYS_round(pMatrix->c * 10000), FXSYS_round(pMatrix->d * 10000));\n    CFX_ByteStringC FaceGlyphsKey(keygen.m_Key, keygen.m_KeyLen);\n    CPDF_Type3Glyphs* pSizeCache = NULL;\n    if(!m_SizeMap.Lookup(FaceGlyphsKey, (void*&)pSizeCache)) {\n        pSizeCache = FX_NEW CPDF_Type3Glyphs;\n        m_SizeMap.SetAt(FaceGlyphsKey, pSizeCache);\n    }\n    CFX_GlyphBitmap* pGlyphBitmap;\n    if(pSizeCache->m_GlyphMap.Lookup((FX_LPVOID)(FX_UINTPTR)charcode, (void*&)pGlyphBitmap)) {\n        return pGlyphBitmap;\n    }\n    pGlyphBitmap = RenderGlyph(pSizeCache, charcode, pMatrix, retinaScaleX, retinaScaleY);\n    pSizeCache->m_GlyphMap.SetAt((FX_LPVOID)(FX_UINTPTR)charcode, pGlyphBitmap);\n    return pGlyphBitmap;\n}\nCPDF_Type3Glyphs::~CPDF_Type3Glyphs()\n{\n    FX_POSITION pos = m_GlyphMap.GetStartPosition();\n    FX_LPVOID Key;\n    CFX_GlyphBitmap* pGlyphBitmap;\n    while(pos) {\n        m_GlyphMap.GetNextAssoc(pos, Key, (void*&)pGlyphBitmap);\n        delete pGlyphBitmap;\n    }\n}\nstatic int _AdjustBlue(FX_FLOAT pos, int& count, int blues[])\n{\n    FX_FLOAT min_distance = 1000000.0f * 1.0f;\n    int closest_pos = -1;\n    for (int i = 0; i < count; i ++) {\n        FX_FLOAT distance = (FX_FLOAT)FXSYS_fabs(pos - (FX_FLOAT)blues[i]);\n        if (distance < 1.0f * 80.0f / 100.0f && distance < min_distance) {\n            min_distance = distance;\n            closest_pos = i;\n        }\n    }\n    if (closest_pos >= 0) {\n        return blues[closest_pos];\n    }\n    int new_pos = FXSYS_round(pos);\n    if (count == TYPE3_MAX_BLUES) {\n        return new_pos;\n    }\n    blues[count++] = new_pos;\n    return new_pos;\n}\nvoid CPDF_Type3Glyphs::AdjustBlue(FX_FLOAT top, FX_FLOAT bottom, int& top_line, int& bottom_line)\n{\n    top_line = _AdjustBlue(top, m_TopBlueCount, m_TopBlue);\n    bottom_line = _AdjustBlue(bottom, m_BottomBlueCount, m_BottomBlue);\n}\nstatic FX_BOOL _IsScanLine1bpp(FX_LPBYTE pBuf, int width)\n{\n    int size = width / 8;\n    for (int i = 0; i < size; i ++)\n        if (pBuf[i]) {\n            return TRUE;\n        }\n    if (width % 8)\n        if (pBuf[width / 8] & (0xff << (8 - width % 8))) {\n            return TRUE;\n        }\n    return FALSE;\n}\nstatic FX_BOOL _IsScanLine8bpp(FX_LPBYTE pBuf, int width)\n{\n    for (int i = 0; i < width; i ++)\n        if (pBuf[i] > 0x40) {\n            return TRUE;\n        }\n    return FALSE;\n}\nstatic int _DetectFirstLastScan(const CFX_DIBitmap* pBitmap, FX_BOOL bFirst)\n{\n    int height = pBitmap->GetHeight(), pitch = pBitmap->GetPitch(), width = pBitmap->GetWidth();\n    int bpp = pBitmap->GetBPP();\n    if (bpp > 8) {\n        width *= bpp / 8;\n    }\n    FX_LPBYTE pBuf = pBitmap->GetBuffer();\n    int line = bFirst ? 0 : height - 1;\n    int line_step = bFirst ? 1 : -1;\n    int line_end = bFirst ? height : -1;\n    while (line != line_end) {\n        if (bpp == 1) {\n            if (_IsScanLine1bpp(pBuf + line * pitch, width)) {\n                return line;\n            }\n        } else {\n            if (_IsScanLine8bpp(pBuf + line * pitch, width)) {\n                return line;\n            }\n        }\n        line += line_step;\n    }\n    return -1;\n}\nCFX_GlyphBitmap* CPDF_Type3Cache::RenderGlyph(CPDF_Type3Glyphs* pSize, FX_DWORD charcode, const CFX_AffineMatrix* pMatrix, FX_FLOAT retinaScaleX, FX_FLOAT retinaScaleY)\n{\n    CPDF_Type3Char* pChar = m_pFont->LoadChar(charcode);\n    if (pChar == NULL || pChar->m_pBitmap == NULL) {\n        return NULL;\n    }\n    CFX_DIBitmap* pBitmap = pChar->m_pBitmap;\n    CFX_AffineMatrix image_matrix, text_matrix;\n    image_matrix = pChar->m_ImageMatrix;\n    text_matrix.Set(pMatrix->a, pMatrix->b, pMatrix->c, pMatrix->d, 0, 0);\n    image_matrix.Concat(text_matrix);\n    CFX_DIBitmap* pResBitmap = NULL;\n    int left, top;\n    if (FXSYS_fabs(image_matrix.b) < FXSYS_fabs(image_matrix.a) / 100 && FXSYS_fabs(image_matrix.c) < FXSYS_fabs(image_matrix.d) / 100) {\n        int top_line, bottom_line;\n        top_line = _DetectFirstLastScan(pBitmap, TRUE);\n        bottom_line = _DetectFirstLastScan(pBitmap, FALSE);\n        if (top_line == 0 && bottom_line == pBitmap->GetHeight() - 1) {\n            FX_FLOAT top_y = image_matrix.d + image_matrix.f;\n            FX_FLOAT bottom_y = image_matrix.f;\n            FX_BOOL bFlipped = top_y > bottom_y;\n            if (bFlipped) {\n                FX_FLOAT temp = top_y;\n                top_y = bottom_y;\n                bottom_y = temp;\n            }\n            pSize->AdjustBlue(top_y, bottom_y, top_line, bottom_line);\n            pResBitmap = pBitmap->StretchTo((int)(FXSYS_round(image_matrix.a) * retinaScaleX), (int)((bFlipped ? top_line - bottom_line : bottom_line - top_line) * retinaScaleY));\n            top = top_line;\n            if (image_matrix.a < 0) {\n                image_matrix.Scale(retinaScaleX, retinaScaleY);\n                left = FXSYS_round(image_matrix.e + image_matrix.a);\n            } else {\n                left = FXSYS_round(image_matrix.e);\n            }\n        } else {\n        }\n    }\n    if (pResBitmap == NULL) {\n        image_matrix.Scale(retinaScaleX, retinaScaleY);\n        pResBitmap = pBitmap->TransformTo(&image_matrix, left, top);\n    }\n    if (pResBitmap == NULL) {\n        return NULL;\n    }\n    CFX_GlyphBitmap* pGlyph = FX_NEW CFX_GlyphBitmap;\n    pGlyph->m_Left = left;\n    pGlyph->m_Top = -top;\n    pGlyph->m_Bitmap.TakeOver(pResBitmap);\n    delete pResBitmap;\n    return pGlyph;\n}\nvoid _CPDF_UniqueKeyGen::Generate(int count, ...)\n{\n    va_list argList;\n    va_start(argList, count);\n    for (int i = 0; i < count; i ++) {\n        int p = va_arg(argList, int);\n        ((FX_DWORD*)m_Key)[i] = p;\n    }\n    va_end(argList);\n    m_KeyLen = count * sizeof(FX_DWORD);\n}\nFX_BOOL CPDF_RenderStatus::ProcessText(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device, CFX_PathData* pClippingPath)\n{\n    if(textobj->m_nChars == 0) {\n        return TRUE;\n    }\n    int text_render_mode = textobj->m_TextState.GetObject()->m_TextMode;\n    if (text_render_mode == 3) {\n        return TRUE;\n    }\n    CPDF_Font* pFont = textobj->m_TextState.GetFont();\n    if (pFont->GetFontType() == PDFFONT_TYPE3) {\n        return ProcessType3Text(textobj, pObj2Device);\n    }\n    FX_BOOL bFill = FALSE, bStroke = FALSE, bClip = FALSE;\n    if (pClippingPath) {\n        bClip = TRUE;\n    } else {\n        switch (text_render_mode) {\n            case 0:\n            case 4:\n                bFill = TRUE;\n                break;\n            case 1:\n            case 5:\n                if (pFont->GetFace() == NULL && !(pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_GLYPHPATH)) {\n                    bFill = TRUE;\n                } else {\n                    bStroke = TRUE;\n                }\n                break;\n            case 2:\n            case 6:\n                if (pFont->GetFace() == NULL && !(pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_GLYPHPATH)) {\n                    bFill = TRUE;\n                } else {\n                    bFill = bStroke = TRUE;\n                }\n                break;\n            case 3:\n            case 7:\n                return TRUE;\n            default:\n                bFill = TRUE;\n        }\n    }\n    FX_ARGB stroke_argb = 0, fill_argb = 0;\n    FX_BOOL bPattern = FALSE;\n    if (bStroke) {\n        if (textobj->m_ColorState.GetStrokeColor()->IsPattern()) {\n            bPattern = TRUE;\n        } else {\n            stroke_argb = GetStrokeArgb(textobj);\n        }\n    }\n    if (bFill) {\n        if (textobj->m_ColorState.GetFillColor()->IsPattern()) {\n            bPattern = TRUE;\n        } else {\n            fill_argb = GetFillArgb(textobj);\n        }\n    }\n    CFX_AffineMatrix text_matrix;\n    textobj->GetTextMatrix(&text_matrix);\n    if(IsAvailableMatrix(text_matrix) == FALSE) {\n        return TRUE;\n    }\n    FX_FLOAT font_size = textobj->m_TextState.GetFontSize();\n    if (bPattern) {\n        DrawTextPathWithPattern(textobj, pObj2Device, pFont, font_size, &text_matrix, bFill, bStroke);\n        return TRUE;\n    }\n#if defined(_FPDFAPI_MINI_)\n    if (bFill) {\n        bStroke = FALSE;\n    }\n    if (bStroke) {\n        if (font_size * text_matrix.GetXUnit() * pObj2Device->GetXUnit() < 6) {\n            bStroke = FALSE;\n        }\n    }\n#endif\n    if (bClip || bStroke) {\n        const CFX_AffineMatrix* pDeviceMatrix = pObj2Device;\n        CFX_AffineMatrix device_matrix;\n        if (bStroke) {\n            const FX_FLOAT* pCTM = textobj->m_TextState.GetObject()->m_CTM;\n            if (pCTM[0] != 1.0f || pCTM[3] != 1.0f) {\n                CFX_AffineMatrix ctm(pCTM[0], pCTM[1], pCTM[2], pCTM[3], 0, 0);\n                text_matrix.ConcatInverse(ctm);\n                device_matrix.Copy(ctm);\n                device_matrix.Concat(*pObj2Device);\n                pDeviceMatrix = &device_matrix;\n            }\n        }\n        int flag = 0;\n        if (bStroke && bFill) {\n            flag |= FX_FILL_STROKE;\n            flag |= FX_STROKE_TEXT_MODE;\n        }\n#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)\n        const CPDF_GeneralStateData* pGeneralData = ((CPDF_PageObject*)textobj)->m_GeneralState;\n        if (pGeneralData && pGeneralData->m_StrokeAdjust) {\n            flag |= FX_STROKE_ADJUST;\n        }\n#endif\n        if (m_Options.m_Flags & RENDER_NOTEXTSMOOTH) {\n            flag |= FXFILL_NOPATHSMOOTH;\n        }\n        return CPDF_TextRenderer::DrawTextPath(m_pDevice, textobj->m_nChars, textobj->m_pCharCodes, textobj->m_pCharPos, pFont, font_size,\n                                               &text_matrix, pDeviceMatrix, textobj->m_GraphState, fill_argb, stroke_argb, pClippingPath, flag);\n    }\n    text_matrix.Concat(*pObj2Device);\n    return CPDF_TextRenderer::DrawNormalText(m_pDevice, textobj->m_nChars, textobj->m_pCharCodes, textobj->m_pCharPos, pFont, font_size,\n            &text_matrix, fill_argb, &m_Options);\n}\nCPDF_Type3Cache* CPDF_RenderStatus::GetCachedType3(CPDF_Type3Font* pFont)\n{\n    if (pFont->m_pDocument == NULL) {\n        return NULL;\n    }\n    pFont->m_pDocument->GetPageData()->GetFont(pFont->GetFontDict(), FALSE);\n    return pFont->m_pDocument->GetRenderData()->GetCachedType3(pFont);\n}\nstatic void ReleaseCachedType3(CPDF_Type3Font* pFont)\n{\n    if (pFont->m_pDocument == NULL) {\n        return;\n    }\n    pFont->m_pDocument->GetRenderData()->ReleaseCachedType3(pFont);\n    pFont->m_pDocument->GetPageData()->ReleaseFont(pFont->GetFontDict());\n}\nFX_BOOL CPDF_Type3Char::LoadBitmap(CPDF_RenderContext* pContext)\n{\n    if (m_pBitmap != NULL || m_pForm == NULL) {\n        return TRUE;\n    }\n    if (m_pForm->CountObjects() == 1 && !m_bColored) {\n        CPDF_PageObject *pPageObj = m_pForm->GetObjectAt(m_pForm->GetFirstObjectPosition());\n        if (pPageObj->m_Type == PDFPAGE_IMAGE) {\n            CPDF_ImageObject* pImage = (CPDF_ImageObject*)pPageObj;\n            m_ImageMatrix = pImage->m_Matrix;\n            const CFX_DIBSource* pSource = pImage->m_pImage->LoadDIBSource();\n            if (pSource) {\n                m_pBitmap = pSource->Clone();\n                delete pSource;\n            }\n            delete m_pForm;\n            m_pForm = NULL;\n            return TRUE;\n        }\n        if (pPageObj->m_Type == PDFPAGE_INLINES) {\n            CPDF_InlineImages *pInlines = (CPDF_InlineImages *)pPageObj;\n            if (pInlines->m_pStream) {\n                m_ImageMatrix = pInlines->m_Matrices[0];\n                CPDF_DIBSource dibsrc;\n                if (!dibsrc.Load(pContext->m_pDocument, pInlines->m_pStream, NULL, NULL, NULL, NULL)) {\n                    return FALSE;\n                }\n                m_pBitmap = dibsrc.Clone();\n                delete m_pForm;\n                m_pForm = NULL;\n                return TRUE;\n            }\n        }\n    }\n    return FALSE;\n}\nclass CPDF_RefType3Cache\n{\npublic:\n    CPDF_RefType3Cache(CPDF_Type3Font* pType3Font)\n    {\n        m_dwCount = 0;\n        m_pType3Font = pType3Font;\n    }\n    ~CPDF_RefType3Cache()\n    {\n        while(m_dwCount--) {\n            ReleaseCachedType3(m_pType3Font);\n        }\n    }\n    FX_DWORD m_dwCount;\n    CPDF_Type3Font* m_pType3Font;\n};\nFX_BOOL CPDF_RenderStatus::ProcessType3Text(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device)\n{\n    CPDF_Type3Font* pType3Font = textobj->m_TextState.GetFont()->GetType3Font();\n    for (int j = 0; j < m_Type3FontCache.GetSize(); j++)\n        if ((CPDF_Type3Font*)m_Type3FontCache.GetAt(j) == pType3Font) {\n            return TRUE;\n        }\n    CFX_Matrix dCTM = m_pDevice->GetCTM();\n    FX_FLOAT sa = FXSYS_fabs(dCTM.a);\n    FX_FLOAT sd = FXSYS_fabs(dCTM.d);\n    CFX_AffineMatrix text_matrix;\n    textobj->GetTextMatrix(&text_matrix);\n    CFX_AffineMatrix char_matrix = pType3Font->GetFontMatrix();\n    FX_FLOAT font_size = textobj->m_TextState.GetFontSize();\n    char_matrix.Scale(font_size, font_size);\n    FX_ARGB fill_argb = GetFillArgb(textobj, TRUE);\n    int fill_alpha = FXARGB_A(fill_argb);\n    int device_class = m_pDevice->GetDeviceClass();\n    FXTEXT_GLYPHPOS* pGlyphAndPos = NULL;\n    if (device_class == FXDC_DISPLAY) {\n        pGlyphAndPos = FX_Alloc(FXTEXT_GLYPHPOS, textobj->m_nChars);\n    } else if (fill_alpha < 255) {\n        return FALSE;\n    }\n    CPDF_RefType3Cache refTypeCache(pType3Font);\n    FX_DWORD *pChars = textobj->m_pCharCodes;\n    if (textobj->m_nChars == 1) {\n        pChars = (FX_DWORD*)(&textobj->m_pCharCodes);\n    }\n    for (int iChar = 0; iChar < textobj->m_nChars; iChar ++) {\n        FX_DWORD charcode = pChars[iChar];\n        if (charcode == (FX_DWORD) - 1) {\n            continue;\n        }\n        CPDF_Type3Char* pType3Char = pType3Font->LoadChar(charcode);\n        if (pType3Char == NULL) {\n            continue;\n        }\n        CFX_AffineMatrix matrix = char_matrix;\n        matrix.e += iChar ? textobj->m_pCharPos[iChar - 1] : 0;\n        matrix.Concat(text_matrix);\n        matrix.Concat(*pObj2Device);\n        if (!pType3Char->LoadBitmap(m_pContext)) {\n            if (pGlyphAndPos) {\n                for (int i = 0; i < iChar; i ++) {\n                    FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[i];\n                    if (glyph.m_pGlyph == NULL) {\n                        continue;\n                    }\n                    m_pDevice->SetBitMask(&glyph.m_pGlyph->m_Bitmap,\n                                          glyph.m_OriginX + glyph.m_pGlyph->m_Left,\n                                          glyph.m_OriginY - glyph.m_pGlyph->m_Top, fill_argb);\n                }\n                FX_Free(pGlyphAndPos);\n                pGlyphAndPos = NULL;\n            }\n            CPDF_GraphicStates* pStates = CloneObjStates(textobj, FALSE);\n            CPDF_RenderOptions Options = m_Options;\n            Options.m_Flags |= RENDER_FORCE_HALFTONE | RENDER_RECT_AA;\n            Options.m_Flags &= ~RENDER_FORCE_DOWNSAMPLE;\n            CPDF_Dictionary* pFormResource = NULL;\n            if (pType3Char->m_pForm && pType3Char->m_pForm->m_pFormDict) {\n                pFormResource = pType3Char->m_pForm->m_pFormDict->GetDict(FX_BSTRC(\"Resources\"));\n            }\n            if (fill_alpha == 255) {\n                CPDF_RenderStatus status;\n                status.Initialize(m_Level + 1, m_pContext, m_pDevice, NULL, NULL, this, pStates, &Options,\n                                  pType3Char->m_pForm->m_Transparency, m_bDropObjects, pFormResource, FALSE, pType3Char, fill_argb);\n                status.m_Type3FontCache.Append(m_Type3FontCache);\n                status.m_Type3FontCache.Add(pType3Font);\n                m_pDevice->SaveState();\n                status.RenderObjectList(pType3Char->m_pForm, &matrix);\n                m_pDevice->RestoreState();\n            } else {\n                CFX_FloatRect rect_f = pType3Char->m_pForm->CalcBoundingBox();\n                rect_f.Transform(&matrix);\n                FX_RECT rect = rect_f.GetOutterRect();\n                CFX_FxgeDevice bitmap_device;\n                if (!bitmap_device.Create((int)(rect.Width() * sa), (int)(rect.Height() * sd), FXDIB_Argb)) {\n                    return TRUE;\n                }\n                bitmap_device.GetBitmap()->Clear(0);\n                CPDF_RenderStatus status;\n                status.Initialize(m_Level + 1, m_pContext, &bitmap_device, NULL, NULL, this, pStates, &Options,\n                                  pType3Char->m_pForm->m_Transparency, m_bDropObjects, pFormResource, FALSE, pType3Char, fill_argb);\n                status.m_Type3FontCache.Append(m_Type3FontCache);\n                status.m_Type3FontCache.Add(pType3Font);\n                matrix.TranslateI(-rect.left, -rect.top);\n                matrix.Scale(sa, sd);\n                status.RenderObjectList(pType3Char->m_pForm, &matrix);\n                m_pDevice->SetDIBits(bitmap_device.GetBitmap(), rect.left, rect.top);\n            }\n            delete pStates;\n        } else if (pType3Char->m_pBitmap) {\n            if (device_class == FXDC_DISPLAY) {\n                CPDF_Type3Cache* pCache = GetCachedType3(pType3Font);\n                refTypeCache.m_dwCount++;\n                CFX_GlyphBitmap* pBitmap = pCache->LoadGlyph(charcode, &matrix, sa, sd);\n                if (pBitmap == NULL) {\n                    continue;\n                }\n                int origin_x = FXSYS_round(matrix.e);\n                int origin_y = FXSYS_round(matrix.f);\n                if (pGlyphAndPos) {\n                    pGlyphAndPos[iChar].m_pGlyph = pBitmap;\n                    pGlyphAndPos[iChar].m_OriginX = origin_x;\n                    pGlyphAndPos[iChar].m_OriginY = origin_y;\n                } else {\n                    m_pDevice->SetBitMask(&pBitmap->m_Bitmap, origin_x + pBitmap->m_Left, origin_y - pBitmap->m_Top, fill_argb);\n                }\n            } else {\n                CFX_AffineMatrix image_matrix = pType3Char->m_ImageMatrix;\n                image_matrix.Concat(matrix);\n                CPDF_ImageRenderer renderer;\n                if (renderer.Start(this, pType3Char->m_pBitmap, fill_argb, 255, &image_matrix, 0, FALSE)) {\n                    renderer.Continue(NULL);\n                }\n                if (!renderer.m_Result) {\n                    return FALSE;\n                }\n            }\n        }\n    }\n    if (pGlyphAndPos) {\n        FX_RECT rect = FXGE_GetGlyphsBBox(pGlyphAndPos, textobj->m_nChars, 0, sa, sd);\n        CFX_DIBitmap bitmap;\n        if (!bitmap.Create((int)(rect.Width() * sa), (int)(rect.Height() * sd), FXDIB_8bppMask)) {\n            FX_Free(pGlyphAndPos);\n            return TRUE;\n        }\n        bitmap.Clear(0);\n        for (int iChar = 0; iChar < textobj->m_nChars; iChar ++) {\n            FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];\n            if (glyph.m_pGlyph == NULL) {\n                continue;\n            }\n            bitmap.TransferBitmap((int)((glyph.m_OriginX + glyph.m_pGlyph->m_Left - rect.left) * sa),\n                                  (int)((glyph.m_OriginY - glyph.m_pGlyph->m_Top - rect.top) * sd),\n                                  glyph.m_pGlyph->m_Bitmap.GetWidth(), glyph.m_pGlyph->m_Bitmap.GetHeight(),\n                                  &glyph.m_pGlyph->m_Bitmap, 0, 0);\n        }\n        m_pDevice->SetBitMask(&bitmap, rect.left, rect.top, fill_argb);\n        FX_Free(pGlyphAndPos);\n    }\n    return TRUE;\n}\nclass CPDF_CharPosList\n{\npublic:\n    CPDF_CharPosList();\n    ~CPDF_CharPosList();\n    void\t\t\t\tLoad(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, CPDF_Font* pFont, FX_FLOAT font_size);\n    FXTEXT_CHARPOS*\t\tm_pCharPos;\n    FX_DWORD\t\t\tm_nChars;\n};\nFX_FLOAT _CIDTransformToFloat(FX_BYTE ch);\nCPDF_CharPosList::CPDF_CharPosList()\n{\n    m_pCharPos = NULL;\n}\nCPDF_CharPosList::~CPDF_CharPosList()\n{\n    if (m_pCharPos) {\n        FX_Free(m_pCharPos);\n    }\n}\nvoid CPDF_CharPosList::Load(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, CPDF_Font* pFont,\n                            FX_FLOAT FontSize)\n{\n    m_pCharPos = FX_Alloc(FXTEXT_CHARPOS, nChars);\n    m_nChars = 0;\n    CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();\n    FX_BOOL bVertWriting = pCIDFont && pCIDFont->IsVertWriting();\n    for (int iChar = 0; iChar < nChars; iChar ++) {\n        FX_DWORD CharCode = nChars == 1 ? (FX_DWORD)(FX_UINTPTR)pCharCodes : pCharCodes[iChar];\n        if (CharCode == (FX_DWORD) - 1) {\n            continue;\n        }\n        FX_BOOL bVert = FALSE;\n        FXTEXT_CHARPOS& charpos = m_pCharPos[m_nChars++];\n        if (pCIDFont) {\n            charpos.m_bFontStyle = pCIDFont->IsFontStyleFromCharCode(CharCode);\n        }\n        charpos.m_GlyphIndex = pFont->GlyphFromCharCode(CharCode, &bVert);\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n        charpos.m_ExtGID = pFont->GlyphFromCharCodeExt(CharCode);\n#endif\n        if (!pFont->IsEmbedded() && pFont->GetFontType() != PDFFONT_CIDFONT) {\n            charpos.m_FontCharWidth = pFont->GetCharWidthF(CharCode);\n        } else {\n            charpos.m_FontCharWidth = 0;\n        }\n        charpos.m_OriginX = iChar ? pCharPos[iChar - 1] : 0;\n        charpos.m_OriginY = 0;\n        charpos.m_bGlyphAdjust = FALSE;\n        if (pCIDFont == NULL) {\n            continue;\n        }\n        FX_WORD CID = pCIDFont->CIDFromCharCode(CharCode);\n        if (bVertWriting) {\n            charpos.m_OriginY = charpos.m_OriginX;\n            charpos.m_OriginX = 0;\n            short vx, vy;\n            pCIDFont->GetVertOrigin(CID, vx, vy);\n            charpos.m_OriginX -= FontSize * vx / 1000;\n            charpos.m_OriginY -= FontSize * vy / 1000;\n        }\n        FX_LPCBYTE pTransform = pCIDFont->GetCIDTransform(CID);\n        if (pTransform && !bVert) {\n            charpos.m_AdjustMatrix[0] = _CIDTransformToFloat(pTransform[0]);\n            charpos.m_AdjustMatrix[2] = _CIDTransformToFloat(pTransform[2]);\n            charpos.m_AdjustMatrix[1] = _CIDTransformToFloat(pTransform[1]);\n            charpos.m_AdjustMatrix[3] = _CIDTransformToFloat(pTransform[3]);\n            charpos.m_OriginX += _CIDTransformToFloat(pTransform[4]) * FontSize;\n            charpos.m_OriginY += _CIDTransformToFloat(pTransform[5]) * FontSize;\n            charpos.m_bGlyphAdjust = TRUE;\n        }\n    }\n}\nFX_BOOL CPDF_TextRenderer::DrawTextPath(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos,\n                                        CPDF_Font* pFont, FX_FLOAT font_size,\n                                        const CFX_AffineMatrix* pText2User, const CFX_AffineMatrix* pUser2Device,\n                                        const CFX_GraphStateData* pGraphState,\n                                        FX_ARGB fill_argb, FX_ARGB stroke_argb, CFX_PathData* pClippingPath, int nFlag)\n{\n    CFX_FontCache* pCache = pFont->m_pDocument ? pFont->m_pDocument->GetRenderData()->GetFontCache() : NULL;\n    CPDF_CharPosList CharPosList;\n    CharPosList.Load(nChars, pCharCodes, pCharPos, pFont, font_size);\n    return pDevice->DrawTextPath(CharPosList.m_nChars, CharPosList.m_pCharPos,\n                                 &pFont->m_Font, pCache, font_size, pText2User, pUser2Device,\n                                 pGraphState, fill_argb, stroke_argb, pClippingPath, nFlag);\n}\nvoid CPDF_TextRenderer::DrawTextString(CFX_RenderDevice* pDevice, int left, int top, CPDF_Font* pFont, int height,\n                                       const CFX_ByteString& str, FX_ARGB argb)\n{\n    FX_RECT font_bbox;\n    pFont->GetFontBBox(font_bbox);\n    FX_FLOAT font_size = (FX_FLOAT)height * 1000.0f / (FX_FLOAT)(font_bbox.top - font_bbox.bottom);\n    FX_FLOAT origin_x = (FX_FLOAT)left;\n    FX_FLOAT origin_y = (FX_FLOAT)top + font_size * (FX_FLOAT)font_bbox.top / 1000.0f;\n    CFX_AffineMatrix matrix(1.0f, 0, 0, -1.0f, 0, 0);\n    DrawTextString(pDevice, origin_x, origin_y, pFont, font_size, &matrix, str, argb);\n}\nvoid CPDF_TextRenderer::DrawTextString(CFX_RenderDevice* pDevice, FX_FLOAT origin_x, FX_FLOAT origin_y, CPDF_Font* pFont, FX_FLOAT font_size,\n                                       const CFX_AffineMatrix* pMatrix, const CFX_ByteString& str, FX_ARGB fill_argb,\n                                       FX_ARGB stroke_argb, const CFX_GraphStateData* pGraphState, const CPDF_RenderOptions* pOptions)\n{\n    int nChars = pFont->CountChar(str, str.GetLength());\n    if (nChars == 0) {\n        return;\n    }\n    FX_DWORD charcode;\n    int offset = 0;\n    FX_DWORD* pCharCodes;\n    FX_FLOAT* pCharPos;\n    if (nChars == 1) {\n        charcode = pFont->GetNextChar(str, offset);\n        pCharCodes = (FX_DWORD*)(FX_UINTPTR)charcode;\n        pCharPos = NULL;\n    } else {\n        pCharCodes = FX_Alloc(FX_DWORD, nChars);\n        pCharPos = FX_Alloc(FX_FLOAT, nChars - 1);\n        FX_FLOAT cur_pos = 0;\n        for (int i = 0; i < nChars; i ++) {\n            pCharCodes[i] = pFont->GetNextChar(str, offset);\n            if (i) {\n                pCharPos[i - 1] = cur_pos;\n            }\n            cur_pos += pFont->GetCharWidthF(pCharCodes[i]) * font_size / 1000;\n        }\n    }\n    CFX_AffineMatrix matrix;\n    if (pMatrix) {\n        matrix = *pMatrix;\n    }\n    matrix.e = origin_x;\n    matrix.f = origin_y;\n    if (pFont->GetFontType() == PDFFONT_TYPE3)\n        ;\n    else if (stroke_argb == 0) {\n        DrawNormalText(pDevice, nChars, pCharCodes, pCharPos, pFont, font_size, &matrix, fill_argb, pOptions);\n    } else\n        DrawTextPath(pDevice, nChars, pCharCodes, pCharPos, pFont, font_size, &matrix, NULL, pGraphState,\n                     fill_argb, stroke_argb, NULL);\n    if (nChars > 1) {\n        FX_Free(pCharCodes);\n        FX_Free(pCharPos);\n    }\n}\nFX_BOOL CPDF_TextRenderer::DrawNormalText(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos,\n        CPDF_Font* pFont, FX_FLOAT font_size,\n        const CFX_AffineMatrix* pText2Device,\n        FX_ARGB fill_argb, const CPDF_RenderOptions* pOptions)\n{\n    CFX_FontCache* pCache = pFont->m_pDocument ? pFont->m_pDocument->GetRenderData()->GetFontCache() : NULL;\n    CPDF_CharPosList CharPosList;\n    CharPosList.Load(nChars, pCharCodes, pCharPos, pFont, font_size);\n    int FXGE_flags = 0;\n    if (pOptions) {\n        FX_DWORD dwFlags = pOptions->m_Flags;\n        if (dwFlags & RENDER_CLEARTYPE) {\n            FXGE_flags |= FXTEXT_CLEARTYPE;\n            if (dwFlags & RENDER_BGR_STRIPE) {\n                FXGE_flags |= FXTEXT_BGR_STRIPE;\n            }\n        }\n        if (dwFlags & RENDER_NOTEXTSMOOTH) {\n            FXGE_flags |= FXTEXT_NOSMOOTH;\n        }\n        if (dwFlags & RENDER_PRINTGRAPHICTEXT) {\n            FXGE_flags |= FXTEXT_PRINTGRAPHICTEXT;\n        }\n        if (dwFlags & RENDER_NO_NATIVETEXT) {\n            FXGE_flags |= FXTEXT_NO_NATIVETEXT;\n        }\n        if (dwFlags & RENDER_PRINTIMAGETEXT) {\n            FXGE_flags |= FXTEXT_PRINTIMAGETEXT;\n        }\n    } else {\n        FXGE_flags = FXTEXT_CLEARTYPE;\n    }\n    if (pFont->GetFontType() & PDFFONT_CIDFONT) {\n        FXGE_flags |= FXFONT_CIDFONT;\n    }\n    return pDevice->DrawNormalText(CharPosList.m_nChars, CharPosList.m_pCharPos, &pFont->m_Font, pCache, font_size, pText2Device, fill_argb, FXGE_flags);\n}\nvoid CPDF_RenderStatus::DrawTextPathWithPattern(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device,\n        CPDF_Font* pFont, FX_FLOAT font_size,\n        const CFX_AffineMatrix* pTextMatrix, FX_BOOL bFill, FX_BOOL bStroke)\n{\n    if (!bStroke) {\n        CPDF_PathObject path;\n        CPDF_TextObject* pCopy = FX_NEW CPDF_TextObject;\n        pCopy->Copy(textobj);\n        path.m_bStroke = FALSE;\n        path.m_FillType = FXFILL_WINDING;\n        path.m_ClipPath.AppendTexts(&pCopy, 1);\n        path.m_ColorState = textobj->m_ColorState;\n        path.m_Path.New()->AppendRect(textobj->m_Left, textobj->m_Bottom, textobj->m_Right, textobj->m_Top);\n        path.m_Left = textobj->m_Left;\n        path.m_Bottom = textobj->m_Bottom;\n        path.m_Right = textobj->m_Right;\n        path.m_Top = textobj->m_Top;\n        RenderSingleObject(&path, pObj2Device);\n        return;\n    }\n    CFX_FontCache* pCache;\n    if (pFont->m_pDocument) {\n        pCache = pFont->m_pDocument->GetRenderData()->GetFontCache();\n    } else {\n        pCache = CFX_GEModule::Get()->GetFontCache();\n    }\n    CFX_FaceCache* pFaceCache = pCache->GetCachedFace(&pFont->m_Font);\n    FX_FONTCACHE_DEFINE(pCache, &pFont->m_Font);\n    CPDF_CharPosList CharPosList;\n    CharPosList.Load(textobj->m_nChars, textobj->m_pCharCodes, textobj->m_pCharPos, pFont, font_size);\n    for (FX_DWORD i = 0; i < CharPosList.m_nChars; i ++) {\n        FXTEXT_CHARPOS& charpos = CharPosList.m_pCharPos[i];\n        const CFX_PathData* pPath = pFaceCache->LoadGlyphPath(&pFont->m_Font, charpos.m_GlyphIndex,\n                                    charpos.m_FontCharWidth);\n        if (pPath == NULL) {\n            continue;\n        }\n        CPDF_PathObject path;\n        path.m_GraphState = textobj->m_GraphState;\n        path.m_ColorState = textobj->m_ColorState;\n        CFX_AffineMatrix matrix;\n        if (charpos.m_bGlyphAdjust)\n            matrix.Set(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],\n                       charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);\n        matrix.Concat(font_size, 0, 0, font_size, charpos.m_OriginX, charpos.m_OriginY);\n        path.m_Path.New()->Append(pPath, &matrix);\n        path.m_Matrix = *pTextMatrix;\n        path.m_bStroke = bStroke;\n        path.m_FillType = bFill ? FXFILL_WINDING : 0;\n        path.CalcBoundingBox();\n        ProcessPath(&path, pObj2Device);\n    }\n}\nCFX_PathData* CPDF_Font::LoadGlyphPath(FX_DWORD charcode, int dest_width)\n{\n    int glyph_index = GlyphFromCharCode(charcode);\n    if (m_Font.m_Face == NULL) {\n        return NULL;\n    }\n    return m_Font.LoadGlyphPath(glyph_index, dest_width);\n}\n"
  },
  {
    "path": "core/src/fpdfapi/fpdf_render/render_int.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDF_PAGEOBJ_H_\n#include \"../../../include/fpdfapi/fpdf_pageobj.h\"\n#endif\nclass CPDF_QuickStretcher;\n#define TYPE3_MAX_BLUES\t\t16\nclass CPDF_Type3Glyphs : public CFX_Object\n{\npublic:\n    CPDF_Type3Glyphs()\n    {\n        m_GlyphMap.InitHashTable(253);\n        m_TopBlueCount = m_BottomBlueCount = 0;\n    }\n    ~CPDF_Type3Glyphs();\n    CFX_MapPtrToPtr\t\t\tm_GlyphMap;\n    void\t\t\t\t\tAdjustBlue(FX_FLOAT top, FX_FLOAT bottom, int& top_line, int& bottom_line);\n\n    int\t\t\t\t\t\tm_TopBlue[TYPE3_MAX_BLUES], m_BottomBlue[TYPE3_MAX_BLUES];\n    int\t\t\t\t\t\tm_TopBlueCount, m_BottomBlueCount;\n};\nclass CFX_GlyphBitmap;\nclass CPDF_Type3Cache : public CFX_Object\n{\npublic:\n    CPDF_Type3Cache(CPDF_Type3Font* pFont)\n    {\n        m_pFont = pFont;\n    }\n    ~CPDF_Type3Cache();\n    CFX_GlyphBitmap*\t\tLoadGlyph(FX_DWORD charcode, const CFX_AffineMatrix* pMatrix, FX_FLOAT retinaScaleX = 1.0f, FX_FLOAT retinaScaleY = 1.0f);\nprotected:\n    CFX_GlyphBitmap*\t\tRenderGlyph(CPDF_Type3Glyphs* pSize, FX_DWORD charcode, const CFX_AffineMatrix* pMatrix, FX_FLOAT retinaScaleX = 1.0f, FX_FLOAT retinaScaleY = 1.0f);\n    CPDF_Type3Font*\t\t\tm_pFont;\n    CFX_MapByteStringToPtr\tm_SizeMap;\n};\nclass CPDF_TransferFunc : public CFX_Object\n{\npublic:\n    CPDF_Document*\tm_pPDFDoc;\n    FX_BYTE\t\t\tm_Samples[256 * 3];\n    FX_BOOL\t\t\tm_bIdentity;\n\n    CFX_DIBSource*\tTranslateImage(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc);\n    FX_COLORREF\t\tTranslateColor(FX_COLORREF src);\n};\ntypedef CFX_MapPtrTemplate<CPDF_Font*, CPDF_CountedObject<CPDF_Type3Cache*>*> CPDF_Type3CacheMap;\ntypedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_TransferFunc*>*> CPDF_TransferFuncMap;\nclass CPDF_DocRenderData : public CFX_Object\n{\npublic:\n    CPDF_DocRenderData(CPDF_Document* pPDFDoc = NULL);\n    ~CPDF_DocRenderData();\n    FX_BOOL\t\t\t\tInitialize();\n    CPDF_Type3Cache*\tGetCachedType3(CPDF_Type3Font* pFont);\n    CPDF_TransferFunc*\tGetTransferFunc(CPDF_Object* pObj);\n    CFX_FontCache*\t\tGetFontCache()\n    {\n        return m_pFontCache;\n    }\n    void\t\t\t\tClear(FX_BOOL bRelease = FALSE);\n    void\t\t\t\tReleaseCachedType3(CPDF_Type3Font* pFont);\n    void\t\t\t\tReleaseTransferFunc(CPDF_Object* pObj);\nprivate:\n    CPDF_Document*\t\tm_pPDFDoc;\n    CFX_FontCache*\t\tm_pFontCache;\n    CPDF_Type3CacheMap\tm_Type3FaceMap;\n    CPDF_TransferFuncMap\tm_TransferFuncMap;\n};\nstruct _PDF_RenderItem {\npublic:\n    CPDF_PageObjects*\t\t\tm_pObjectList;\n    CFX_AffineMatrix\t\t\tm_Matrix;\n};\ntypedef CFX_ArrayTemplate<_PDF_RenderItem>\tCPDF_RenderLayer;\nclass IPDF_ObjectRenderer : public CFX_Object\n{\npublic:\n    static IPDF_ObjectRenderer* Create(int type);\n    virtual ~IPDF_ObjectRenderer() {}\n    virtual FX_BOOL Start(CPDF_RenderStatus* pRenderStatus, const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStdCS, int blendType = FXDIB_BLEND_NORMAL) = 0;\n    virtual FX_BOOL Continue(IFX_Pause* pPause) = 0;\n    FX_BOOL\t\tm_Result;\n};\nclass CPDF_RenderStatus : public CFX_Object\n{\npublic:\n    CPDF_RenderStatus();\n    ~CPDF_RenderStatus();\n    FX_BOOL\t\t\tInitialize(int level, class CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pDeviceMatrix,\n                               const CPDF_PageObject* pStopObj, const CPDF_RenderStatus* pParentStatus,\n                               const CPDF_GraphicStates* pInitialStates, const CPDF_RenderOptions* pOptions,\n                               int transparency, FX_BOOL bDropObjects, CPDF_Dictionary* pFormResource = NULL,\n                               FX_BOOL bStdCS = FALSE,\tCPDF_Type3Char* pType3Char = NULL, FX_ARGB fill_color = 0,\n                               FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);\n    void\t\t\tRenderObjectList(const CPDF_PageObjects* pObjs, const CFX_AffineMatrix* pObj2Device);\n    void\t\t\tRenderSingleObject(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);\n    FX_BOOL\t\t\tContinueSingleObject(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, IFX_Pause* pPause);\n    CPDF_RenderOptions\tm_Options;\n    CPDF_Dictionary*    m_pFormResource;\n    CPDF_Dictionary*    m_pPageResource;\n    CFX_PtrArray\t\tm_Type3FontCache;\n    CPDF_RenderContext* GetContext()\n    {\n        return m_pContext;\n    }\nprotected:\n    friend class\tCPDF_ImageRenderer;\n    friend class\tCPDF_RenderContext;\n    void\t\t\tProcessClipPath(CPDF_ClipPath ClipPath, const CFX_AffineMatrix* pObj2Device);\n    void\t\t\tDrawClipPath(CPDF_ClipPath ClipPath, const CFX_AffineMatrix* pObj2Device);\n    FX_BOOL\t\t\tProcessTransparency(const CPDF_PageObject* PageObj, const CFX_AffineMatrix* pObj2Device);\n    void\t\t\tProcessObjectNoClip(const CPDF_PageObject* PageObj, const CFX_AffineMatrix* pObj2Device);\n    void\t\t\tDrawObjWithBackground(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);\n    FX_BOOL         DrawObjWithBlend(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);\n    FX_BOOL\t\t\tProcessPath(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device);\n    void\t\t\tProcessPathPattern(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, int& filltype, FX_BOOL& bStroke);\n    void\t\t\tDrawPathWithPattern(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, CPDF_Color* pColor, FX_BOOL bStroke);\n    void\t\t\tDrawTilingPattern(CPDF_TilingPattern* pPattern, CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke);\n    void\t\t\tDrawShadingPattern(CPDF_ShadingPattern* pPattern, CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke);\n    FX_BOOL\t\t\tSelectClipPath(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke);\n    FX_BOOL\t\t\tProcessImage(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pObj2Device);\n    FX_BOOL\t\t\tOutputBitmapAlpha(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pImage2Device);\n    FX_BOOL\t\t\tOutputImage(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pImage2Device);\n    FX_BOOL\t\t\tOutputDIBSource(const CFX_DIBSource* pOutputBitmap, FX_ARGB fill_argb, int bitmap_alpha,\n                                    const CFX_AffineMatrix* pImage2Device, CPDF_ImageCache* pImageCache, FX_DWORD flags);\n    void\t\t\tCompositeDIBitmap(CFX_DIBitmap* pDIBitmap, int left, int top, FX_ARGB mask_argb,\n                                      int bitmap_alpha, int blend_mode, int bIsolated);\n    FX_BOOL\t\t\tProcessInlines(CPDF_InlineImages* pInlines, const CFX_AffineMatrix* pObj2Device);\n    FX_BOOL\t\t\tProcessShading(CPDF_ShadingObject* pShadingObj, const CFX_AffineMatrix* pObj2Device);\n    void\t\t\tDrawShading(CPDF_ShadingPattern* pPattern, CFX_AffineMatrix* pMatrix, FX_RECT& clip_rect,\n                                int alpha, FX_BOOL bAlphaMode);\n    FX_BOOL\t\t\tProcessType3Text(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device);\n    FX_BOOL\t\t\tProcessText(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device, CFX_PathData* pClippingPath);\n    void\t\t\tDrawTextPathWithPattern(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device,\n                                            CPDF_Font* pFont, FX_FLOAT font_size,\n                                            const CFX_AffineMatrix* pTextMatrix, FX_BOOL bFill, FX_BOOL bStroke);\n    FX_BOOL\t\t\tProcessForm(CPDF_FormObject* pFormObj, const CFX_AffineMatrix* pObj2Device);\n    CFX_DIBitmap*\tGetBackdrop(const CPDF_PageObject* pObj, const FX_RECT& rect, int& left, int& top,\n                                FX_BOOL bBackAlphaRequired);\n    CFX_DIBitmap*\tLoadSMask(CPDF_Dictionary* pSMaskDict, FX_RECT* pClipRect, const CFX_AffineMatrix* pMatrix);\n    void\t\t\tInit(CPDF_RenderContext* pParent);\n    static class CPDF_Type3Cache*\tGetCachedType3(CPDF_Type3Font* pFont);\n    static CPDF_GraphicStates* CloneObjStates(const CPDF_GraphicStates* pPathObj, FX_BOOL bStroke);\n    CPDF_TransferFunc*\tGetTransferFunc(CPDF_Object* pObject) const;\n    FX_ARGB\t\t\tGetFillArgb(const CPDF_PageObject* pObj, FX_BOOL bType3 = FALSE) const;\n    FX_ARGB\t\t\tGetStrokeArgb(const CPDF_PageObject* pObj) const;\n    CPDF_RenderContext*\t\tm_pContext;\n    FX_BOOL\t\t\t\t\tm_bStopped;\n    void\t\t\tDitherObjectArea(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);\n    FX_BOOL\t\t\tGetObjectClippedRect(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bLogical, FX_RECT &rect) const;\n    void\t\t\tGetScaledMatrix(CFX_Matrix &matrix) const;\nprotected:\n    int\t\t\t\t\t\tm_Level;\n    CFX_RenderDevice*\t\tm_pDevice;\n    CFX_AffineMatrix\t\tm_DeviceMatrix;\n    CPDF_ClipPath\t\t\tm_LastClipPath;\n    const CPDF_PageObject*\tm_pCurObj;\n    const CPDF_PageObject*\tm_pStopObj;\n    CPDF_GraphicStates\t\tm_InitialStates;\n    int\t\t\t\t\t\tm_HalftoneLimit;\n    IPDF_ObjectRenderer*\tm_pObjectRenderer;\n    FX_BOOL\t\t\t\t\tm_bPrint;\n    int\t\t\t\t\t\tm_Transparency;\n    int\t\t\t\t\t\tm_DitherBits;\n    FX_BOOL\t\t\t\t\tm_bDropObjects;\n    FX_BOOL\t\t\t\t\tm_bStdCS;\n    FX_DWORD                m_GroupFamily;\n    FX_BOOL                 m_bLoadMask;\n    CPDF_Type3Char *        m_pType3Char;\n    FX_ARGB\t\t\t\t\tm_T3FillColor;\n    int                     m_curBlend;\n};\nclass CPDF_ImageLoader : public CFX_Object\n{\npublic:\n    CPDF_ImageLoader()\n    {\n        m_pBitmap = NULL;\n        m_pMask = NULL;\n        m_MatteColor = 0;\n        m_bCached = FALSE;\n        m_nDownsampleWidth = 0;\n        m_nDownsampleHeight = 0;\n    }\n\n    FX_BOOL\t\t\t\t\tLoad(const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL);\n\n    FX_BOOL\t\t\t\t\tStartLoadImage(const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_LPVOID& LoadHandle, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 nDownsampleWidth = 0, FX_INT32 nDownsampleHeight = 0);\n    FX_BOOL\t\t\t\t\tContinue(FX_LPVOID LoadHandle, IFX_Pause* pPause);\n    ~CPDF_ImageLoader();\n    CFX_DIBSource*\t\t\tm_pBitmap;\n    CFX_DIBSource*\t\t\tm_pMask;\n    FX_DWORD\t\t\t\tm_MatteColor;\n    FX_BOOL\t\t\t\t\tm_bCached;\nprotected:\n    FX_INT32                m_nDownsampleWidth;\n    FX_INT32                m_nDownsampleHeight;\n};\nclass CPDF_ProgressiveImageLoaderHandle : public CFX_Object\n{\npublic:\n    CPDF_ProgressiveImageLoaderHandle();\n    ~CPDF_ProgressiveImageLoaderHandle();\n\n    FX_BOOL\t\t\tStart(CPDF_ImageLoader* pImageLoader, const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 nDownsampleWidth = 0, FX_INT32 nDownsampleHeight = 0);\n    FX_BOOL\t\t\tContinue(IFX_Pause* pPause);\nprotected:\n    CPDF_ImageLoader*\tm_pImageLoader;\n    CPDF_PageRenderCache* m_pCache;\n    CPDF_ImageObject* m_pImage;\n    FX_INT32            m_nDownsampleWidth;\n    FX_INT32            m_nDownsampleHeight;\n};\nclass CFX_ImageTransformer;\nclass CPDF_ImageRenderer : public IPDF_ObjectRenderer\n{\npublic:\n    CPDF_ImageRenderer();\n    ~CPDF_ImageRenderer();\n    FX_BOOL\t\tStart(CPDF_RenderStatus* pStatus, const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStdCS, int blendType = FXDIB_BLEND_NORMAL);\n    FX_BOOL\t\tStart(CPDF_RenderStatus* pStatus, const CFX_DIBSource* pDIBSource, FX_ARGB bitmap_argb,\n                      int bitmap_alpha, const CFX_AffineMatrix* pImage2Device, FX_DWORD flags, FX_BOOL bStdCS, int blendType = FXDIB_BLEND_NORMAL);\n    FX_BOOL\t\tContinue(IFX_Pause* pPause);\nprotected:\n    CPDF_RenderStatus*\tm_pRenderStatus;\n    CPDF_ImageObject*\tm_pImageObject;\n    int\t\t\t\t\tm_Status;\n    const CFX_AffineMatrix* m_pObj2Device;\n    CFX_AffineMatrix\tm_ImageMatrix;\n    CPDF_ImageLoader\tm_Loader;\n    const CFX_DIBSource*\t\tm_pDIBSource;\n    CFX_DIBitmap*\t\tm_pClone;\n    int\t\t\t\t\tm_BitmapAlpha;\n    FX_BOOL\t\t\t\tm_bPatternColor;\n    CPDF_Pattern*\t\tm_pPattern;\n    FX_ARGB\t\t\t\tm_FillArgb;\n    FX_DWORD\t\t\tm_Flags;\n    CPDF_QuickStretcher*\tm_pQuickStretcher;\n    CFX_ImageTransformer*\tm_pTransformer;\n    CPDF_ImageRenderer*\tm_pRenderer2;\n    FX_LPVOID\t\t\tm_DeviceHandle;\n    FX_LPVOID           m_LoadHandle;\n    FX_BOOL\t\t\t\tm_bStdCS;\n    int\t\t\t\t\tm_BlendType;\n    FX_BOOL\t\t\t\tStartBitmapAlpha();\n    FX_BOOL\t\t\t\tStartDIBSource();\n    FX_BOOL\t\t\t\tStartRenderDIBSource();\n    FX_BOOL\t\t\t\tStartLoadDIBSource();\n    FX_BOOL\t\t\t\tDrawMaskedImage();\n    FX_BOOL\t\t\t\tDrawPatternImage(const CFX_Matrix* pObj2Device);\n};\nclass CPDF_ScaledRenderBuffer : public CFX_Object\n{\npublic:\n    CPDF_ScaledRenderBuffer();\n    ~CPDF_ScaledRenderBuffer();\n    FX_BOOL\t\t\t\tInitialize(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, FX_RECT* pRect,\n                                   const CPDF_PageObject* pObj, const CPDF_RenderOptions *pOptions = NULL, int max_dpi = 0);\n    CFX_RenderDevice*\tGetDevice()\n    {\n        return m_pBitmapDevice ? m_pBitmapDevice : m_pDevice;\n    }\n    CFX_AffineMatrix*\tGetMatrix()\n    {\n        return &m_Matrix;\n    }\n    void\t\t\t\tOutputToDevice();\nprivate:\n    CFX_RenderDevice*\tm_pDevice;\n    CPDF_RenderContext*\tm_pContext;\n    FX_RECT\t\t\t\tm_Rect;\n    const CPDF_PageObject* m_pObject;\n    CFX_FxgeDevice*\tm_pBitmapDevice;\n    CFX_AffineMatrix\tm_Matrix;\n};\nclass ICodec_ScanlineDecoder;\nclass CPDF_QuickStretcher : public CFX_Object\n{\npublic:\n    CPDF_QuickStretcher();\n    ~CPDF_QuickStretcher();\n    FX_BOOL\t\tStart(CPDF_ImageObject* pImageObj, CFX_AffineMatrix* pImage2Device, const FX_RECT* pClipBox);\n    FX_BOOL\t\tContinue(IFX_Pause* pPause);\n    CFX_DIBitmap*\tm_pBitmap;\n    int\t\t\tm_ResultLeft, m_ResultTop, m_ClipLeft, m_ClipTop;\n    int\t\t\tm_DestWidth, m_DestHeight, m_ResultWidth, m_ResultHeight;\n    int\t\t\tm_Bpp, m_SrcWidth, m_SrcHeight;\n    FX_BOOL\t\tm_bFlipX, m_bFlipY;\n    CPDF_ColorSpace*\tm_pCS;\n    ICodec_ScanlineDecoder*\tm_pDecoder;\n    CPDF_StreamAcc m_StreamAcc;\n    int\t\t\tm_LineIndex;\n};\nclass CPDF_DeviceBuffer : public CFX_Object\n{\npublic:\n    CPDF_DeviceBuffer();\n    ~CPDF_DeviceBuffer();\n    FX_BOOL\t\t\t\tInitialize(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, FX_RECT* pRect,\n                                   const CPDF_PageObject* pObj, int max_dpi = 0);\n    void\t\t\t\tOutputToDevice();\n    CFX_DIBitmap*\t\tGetBitmap() const\n    {\n        return m_pBitmap;\n    }\n    const CFX_AffineMatrix*\tGetMatrix() const\n    {\n        return &m_Matrix;\n    }\nprivate:\n    CFX_RenderDevice*\tm_pDevice;\n    CPDF_RenderContext*\tm_pContext;\n    FX_RECT\t\t\t\tm_Rect;\n    const CPDF_PageObject* m_pObject;\n    CFX_DIBitmap*\t\tm_pBitmap;\n    CFX_AffineMatrix\tm_Matrix;\n};\nclass CPDF_ImageCache : public CFX_Object\n{\npublic:\n    CPDF_ImageCache(CPDF_Document* pDoc, CPDF_Stream* pStream);\n    ~CPDF_ImageCache();\n    void\t\t\t\tClearImageData();\n    void\t\t\t\tReset(const CFX_DIBitmap* pBitmap);\n    FX_BOOL\t\t\t\tGetCachedBitmap(CFX_DIBSource*& pBitmap, CFX_DIBSource*& pMask, FX_DWORD& MatteColor, CPDF_Dictionary* pPageResources,\n                                        FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE,\n                                        CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 downsampleWidth = 0, FX_INT32 downsampleHeight = 0);\n    FX_DWORD\t\t\tEstimateSize() const\n    {\n        return m_dwCacheSize;\n    }\n    FX_DWORD\t\t\tGetTimeCount() const\n    {\n        return m_dwTimeCount;\n    }\n    CPDF_Stream*\t\tGetStream() const\n    {\n        return m_pStream;\n    }\n    void\t\t\t\tSetTimeCount(FX_DWORD dwTimeCount)\n    {\n        m_dwTimeCount = dwTimeCount;\n    }\n    int\t\t\t\t\tm_dwTimeCount;\npublic:\n    int\t\t\t\t\tStartGetCachedBitmap(CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources,\n            FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0,\n            FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 downsampleWidth = 0, FX_INT32 downsampleHeight = 0);\n    int\t\t\t\t\tContinue(IFX_Pause* pPause);\n    int \t\t\t\tContinueGetCachedBitmap();\n    CFX_DIBSource*\t\tDetachBitmap();\n    CFX_DIBSource*\t\tDetachMask();\n    CFX_DIBSource*\t\tm_pCurBitmap;\n    CFX_DIBSource*\t\tm_pCurMask;\n    FX_DWORD\t\t\tm_MatteColor;\n    CPDF_RenderStatus*  m_pRenderStatus;\nprotected:\n    CPDF_Document*\t\tm_pDocument;\n    CPDF_Stream*\t\tm_pStream;\n    CFX_DIBSource*\t\tm_pCachedBitmap;\n    CFX_DIBSource*\t\tm_pCachedMask;\n    FX_DWORD\t\t\tm_dwCacheSize;\n    void\tCalcSize();\n};\ntypedef struct {\n    FX_FLOAT\t\t\tm_DecodeMin;\n    FX_FLOAT\t\t\tm_DecodeStep;\n    int\t\t\t\t\tm_ColorKeyMin;\n    int\t\t\t\t\tm_ColorKeyMax;\n} DIB_COMP_DATA;\nclass CPDF_DIBSource : public CFX_DIBSource\n{\npublic:\n    CPDF_DIBSource();\n    virtual ~CPDF_DIBSource();\n    FX_BOOL\t\t\t\tLoad(CPDF_Document* pDoc, const CPDF_Stream* pStream,\n                             CPDF_DIBSource** ppMask, FX_DWORD* pMatteColor,\n                             CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources,\n                             FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);\n    virtual FX_BOOL\t\tSkipToScanline(int line, IFX_Pause* pPause) const;\n    virtual\tFX_LPBYTE\tGetBuffer() const;\n    virtual FX_LPCBYTE\tGetScanline(int line) const;\n    virtual void\t\tDownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,\n                                           int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const;\n    virtual void\t\tSetDownSampleSize(int dest_width, int dest_height) const;\n    CFX_DIBitmap*\t\tGetBitmap() const;\n    void\t\t\t\tReleaseBitmap(CFX_DIBitmap*) const;\n    void\t\t\t\tClearImageData();\npublic:\n    int\t\t\t\t\tStartLoadDIBSource(CPDF_Document* pDoc, const CPDF_Stream* pStream, FX_BOOL bHasMask,\n                                           CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources,\n                                           FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);\n    int\t\t\t\t\tContinueLoadDIBSource(IFX_Pause* pPause);\n    int\t\t\t\t\tStratLoadMask();\n    int\t\t\t\t\tStartLoadMaskDIB();\n    int\t\t\t\t\tContinueLoadMaskDIB(IFX_Pause* pPause);\n    int\t\t\t\t\tContinueToLoadMask();\n    CPDF_DIBSource*\t\tDetachMask();\n    CPDF_DIBSource*\t\tm_pMask;\n    FX_DWORD\t\t\tm_MatteColor;\n    FX_LPVOID\t\t\tm_pJbig2Context;\n    CPDF_StreamAcc*\t\tm_pGlobalStream;\n    FX_BOOL\t\t\t\tm_bStdCS;\n    int\t\t\t\t\tm_Status;\n    CPDF_Object*\t\tm_pMaskStream;\n    FX_BOOL\t\t\t\tm_bHasMask;\nprotected:\n    FX_BOOL\t\t\t\tLoadColorInfo(CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources);\n    CPDF_DIBSource*\t\tLoadMask(FX_DWORD& MatteColor);\n    CPDF_DIBSource*\t\tLoadMaskDIB(CPDF_Stream* pMask);\n    void\t\t\t\tLoadJpxBitmap();\n    void\t\t\t\tLoadJbig2Bitmap();\n    void\t\t\t\tLoadPalette();\n    FX_BOOL\t\t\t\tCreateDecoder();\n    void\t\t\t\tTranslateScanline24bpp(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan) const;\n    FX_DWORD            GetValidBpc() const;\n    CPDF_Document*\t\tm_pDocument;\n    const CPDF_Stream*\tm_pStream;\n    CPDF_StreamAcc*\t\tm_pStreamAcc;\n    const CPDF_Dictionary*\tm_pDict;\n    CPDF_ColorSpace*\tm_pColorSpace;\n    FX_DWORD\t\t\tm_Family, m_bpc, m_nComponents, m_GroupFamily;\n    FX_BOOL\t\t\t\tm_bLoadMask;\n    FX_BOOL\t\t\t\tm_bDefaultDecode, m_bImageMask, m_bColorKey;\n    DIB_COMP_DATA*\t\tm_pCompData;\n    FX_LPBYTE\t\t\tm_pLineBuf;\n    FX_LPBYTE\t\t\tm_pMaskedLine;\n    CFX_DIBitmap*\t\tm_pCachedBitmap;\n    ICodec_ScanlineDecoder*\tm_pDecoder;\n};\n#ifdef _FPDFAPI_MINI_\n#define FPDF_HUGE_IMAGE_SIZE\t3000000\n#else\n#define FPDF_HUGE_IMAGE_SIZE\t60000000\n#endif\nclass CPDF_DIBTransferFunc : public CFX_FilteredDIB\n{\npublic:\n    CPDF_DIBTransferFunc(const CPDF_TransferFunc* pTransferFunc);\n    virtual FXDIB_Format\tGetDestFormat();\n    virtual FX_ARGB*\t\tGetDestPalette()\n    {\n        return NULL;\n    }\n    virtual void\t\t\tTranslateScanline(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf) const;\n    virtual void\t\t\tTranslateDownSamples(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels, int Bpp) const;\n    FX_LPCBYTE\t\t\t\tm_RampR;\n    FX_LPCBYTE\t\t\t\tm_RampG;\n    FX_LPCBYTE\t\t\t\tm_RampB;\n};\nstruct _CPDF_UniqueKeyGen {\n    void\t\tGenerate(int count, ...);\n    FX_CHAR\t\tm_Key[128];\n    int\t\t\tm_KeyLen;\n};\n"
  },
  {
    "path": "core/src/fpdfdoc/doc_action.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fpdfdoc/fpdf_doc.h\"\nCPDF_Dest CPDF_Action::GetDest(CPDF_Document* pDoc) const\n{\n    if (m_pDict == NULL) {\n        return NULL;\n    }\n    CFX_ByteString type = m_pDict->GetString(\"S\");\n    if (type != \"GoTo\" && type != \"GoToR\") {\n        return NULL;\n    }\n    CPDF_Object* pDest = m_pDict->GetElementValue(\"D\");\n    if (pDest == NULL) {\n        return NULL;\n    }\n    if (pDest->GetType() == PDFOBJ_STRING || pDest->GetType() == PDFOBJ_NAME) {\n        CPDF_NameTree name_tree(pDoc, FX_BSTRC(\"Dests\"));\n        CFX_ByteStringC name = pDest->GetString();\n        return name_tree.LookupNamedDest(pDoc, name);\n    } else if (pDest->GetType() == PDFOBJ_ARRAY) {\n        return (CPDF_Array*)pDest;\n    }\n    return NULL;\n}\nconst FX_CHAR* g_sATypes[] = {\"Unknown\", \"GoTo\", \"GoToR\", \"GoToE\", \"Launch\", \"Thread\", \"URI\", \"Sound\", \"Movie\",\n                              \"Hide\",\t\"Named\", \"SubmitForm\", \"ResetForm\", \"ImportData\", \"JavaScript\", \"SetOCGState\",\n                              \"Rendition\", \"Trans\", \"GoTo3DView\", \"\"\n                             };\nCPDF_Action::ActionType CPDF_Action::GetType() const\n{\n    ActionType eType = Unknown;\n    if (m_pDict != NULL) {\n        CFX_ByteString csType = m_pDict->GetString(\"S\");\n        if (!csType.IsEmpty()) {\n            int i = 0;\n            while (g_sATypes[i][0] != '\\0') {\n                if (csType == g_sATypes[i]) {\n                    return (ActionType)i;\n                }\n                i ++;\n            }\n        }\n    }\n    return eType;\n}\nCFX_WideString CPDF_Action::GetFilePath() const\n{\n    CFX_ByteString type = m_pDict->GetString(\"S\");\n    if (type != \"GoToR\" && type != \"Launch\" &&\n            type != \"SubmitForm\" && type != \"ImportData\") {\n        return CFX_WideString();\n    }\n    CPDF_Object* pFile = m_pDict->GetElementValue(\"F\");\n    CFX_WideString path;\n    if (pFile == NULL) {\n        if (type == \"Launch\") {\n            CPDF_Dictionary* pWinDict = m_pDict->GetDict(FX_BSTRC(\"Win\"));\n            if (pWinDict) {\n                return CFX_WideString::FromLocal(pWinDict->GetString(FX_BSTRC(\"F\")));\n            }\n        }\n        return path;\n    }\n    CPDF_FileSpec filespec(pFile);\n    filespec.GetFileName(path);\n    return path;\n}\nCFX_ByteString CPDF_Action::GetURI(CPDF_Document* pDoc) const\n{\n    CFX_ByteString csURI;\n    if (m_pDict == NULL) {\n        return csURI;\n    }\n    if (m_pDict->GetString(\"S\") != \"URI\") {\n        return csURI;\n    }\n    csURI = m_pDict->GetString(\"URI\");\n    CPDF_Dictionary* pRoot = pDoc->GetRoot();\n    CPDF_Dictionary* pURI = pRoot->GetDict(\"URI\");\n    if (pURI != NULL) {\n        if (csURI.Find(FX_BSTRC(\":\"), 0) < 1) {\n            csURI = pURI->GetString(\"Base\") + csURI;\n        }\n    }\n    return csURI;\n}\nFX_DWORD CPDF_ActionFields::GetFieldsCount() const\n{\n    if (m_pAction == NULL) {\n        return 0;\n    }\n    CPDF_Dictionary* pDict = (CPDF_Dictionary*)(*m_pAction);\n    if (pDict == NULL) {\n        return 0;\n    }\n    CFX_ByteString csType = pDict->GetString(\"S\");\n    CPDF_Object* pFields = NULL;\n    if (csType == \"Hide\") {\n        pFields = pDict->GetElementValue(\"T\");\n    } else {\n        pFields = pDict->GetArray(\"Fields\");\n    }\n    if (pFields == NULL) {\n        return 0;\n    }\n    int iType = pFields->GetType();\n    if (iType == PDFOBJ_DICTIONARY) {\n        return 1;\n    } else if (iType == PDFOBJ_STRING) {\n        return 1;\n    } else if (iType == PDFOBJ_ARRAY) {\n        return ((CPDF_Array*)pFields)->GetCount();\n    }\n    return 0;\n}\nvoid CPDF_ActionFields::GetAllFields(CFX_PtrArray& fieldObjects) const\n{\n    fieldObjects.RemoveAll();\n    if (m_pAction == NULL) {\n        return;\n    }\n    CPDF_Dictionary* pDict = (CPDF_Dictionary*)(*m_pAction);\n    if (pDict == NULL) {\n        return;\n    }\n    CFX_ByteString csType = pDict->GetString(\"S\");\n    CPDF_Object* pFields = NULL;\n    if (csType == \"Hide\") {\n        pFields = pDict->GetElementValue(\"T\");\n    } else {\n        pFields = pDict->GetArray(\"Fields\");\n    }\n    if (pFields == NULL) {\n        return;\n    }\n    int iType = pFields->GetType();\n    if (iType == PDFOBJ_DICTIONARY || iType == PDFOBJ_STRING) {\n        fieldObjects.Add(pFields);\n    } else if (iType == PDFOBJ_ARRAY) {\n        CPDF_Array* pArray = (CPDF_Array*)pFields;\n        FX_DWORD iCount = pArray->GetCount();\n        for (FX_DWORD i = 0; i < iCount; i ++) {\n            CPDF_Object* pObj = pArray->GetElementValue(i);\n            if (pObj != NULL) {\n                fieldObjects.Add(pObj);\n            }\n        }\n    }\n}\nCPDF_Object* CPDF_ActionFields::GetField(FX_DWORD iIndex) const\n{\n    if (m_pAction == NULL) {\n        return NULL;\n    }\n    CPDF_Dictionary* pDict = (CPDF_Dictionary*)(*m_pAction);\n    if (pDict == NULL) {\n        return NULL;\n    }\n    CFX_ByteString csType = pDict->GetString(\"S\");\n    CPDF_Object* pFields = NULL;\n    if (csType == \"Hide\") {\n        pFields = pDict->GetElementValue(\"T\");\n    } else {\n        pFields = pDict->GetArray(\"Fields\");\n    }\n    if (pFields == NULL) {\n        return NULL;\n    }\n    CPDF_Object* pFindObj = NULL;\n    int iType = pFields->GetType();\n    if (iType == PDFOBJ_DICTIONARY || iType == PDFOBJ_STRING) {\n        if (iIndex == 0) {\n            pFindObj = pFields;\n        }\n    } else if (iType == PDFOBJ_ARRAY) {\n        pFindObj = ((CPDF_Array*)pFields)->GetElementValue(iIndex);\n    }\n    return pFindObj;\n}\nCPDF_LWinParam CPDF_Action::GetWinParam() const\n{\n    if (m_pDict == NULL) {\n        return NULL;\n    }\n    if (m_pDict->GetString(\"S\") != \"Launch\") {\n        return NULL;\n    }\n    return m_pDict->GetDict(\"Win\");\n}\nCFX_WideString CPDF_Action::GetJavaScript() const\n{\n    CFX_WideString csJS;\n    if (m_pDict == NULL) {\n        return csJS;\n    }\n    CPDF_Object* pJS = m_pDict->GetElementValue(\"JS\");\n    if (pJS != NULL) {\n        return pJS->GetUnicodeText();\n    }\n    return csJS;\n}\nCPDF_Dictionary* CPDF_Action::GetAnnot() const\n{\n    if (m_pDict == NULL) {\n        return NULL;\n    }\n    CFX_ByteString csType = m_pDict->GetString(\"S\");\n    if (csType == FX_BSTRC(\"Rendition\")) {\n        return m_pDict->GetDict(\"AN\");\n    } else if (csType == FX_BSTRC(\"Movie\")) {\n        return m_pDict->GetDict(\"Annotation\");\n    }\n    return NULL;\n}\nFX_INT32 CPDF_Action::GetOperationType() const\n{\n    if (m_pDict == NULL) {\n        return 0;\n    }\n    CFX_ByteString csType = m_pDict->GetString(\"S\");\n    if (csType == FX_BSTRC(\"Rendition\")) {\n        return m_pDict->GetInteger(\"OP\");\n    } else if (csType == FX_BSTRC(\"Movie\")) {\n        CFX_ByteString csOP = m_pDict->GetString(\"Operation\");\n        if (csOP == FX_BSTRC(\"Play\")) {\n            return 0;\n        } else if (csOP == FX_BSTRC(\"Stop\")) {\n            return 1;\n        } else if (csOP == FX_BSTRC(\"Pause\")) {\n            return 2;\n        } else if (csOP == FX_BSTRC(\"Resume\")) {\n            return 3;\n        }\n    }\n    return 0;\n}\nFX_DWORD CPDF_Action::GetSubActionsCount() const\n{\n    if (m_pDict == NULL || !m_pDict->KeyExist(\"Next\")) {\n        return 0;\n    }\n    CPDF_Object* pNext = m_pDict->GetElementValue(\"Next\");\n    if (!pNext) {\n        return 0;\n    }\n    int iObjType = pNext->GetType();\n    if (iObjType == PDFOBJ_DICTIONARY) {\n        return 1;\n    }\n    if (iObjType == PDFOBJ_ARRAY) {\n        return ((CPDF_Array*)pNext)->GetCount();\n    }\n    return 0;\n}\nCPDF_Action CPDF_Action::GetSubAction(FX_DWORD iIndex) const\n{\n    if (m_pDict == NULL || !m_pDict->KeyExist(\"Next\")) {\n        return NULL;\n    }\n    CPDF_Object* pNext = m_pDict->GetElementValue(\"Next\");\n    int iObjType = pNext->GetType();\n    if (iObjType == PDFOBJ_DICTIONARY) {\n        if (iIndex == 0) {\n            return (CPDF_Dictionary*)pNext;\n        }\n    }\n    if (iObjType == PDFOBJ_ARRAY) {\n        return ((CPDF_Array*)pNext)->GetDict(iIndex);\n    }\n    return NULL;\n}\nconst FX_CHAR* g_sAATypes[] = {\"E\", \"X\", \"D\", \"U\", \"Fo\", \"Bl\", \"PO\", \"PC\", \"PV\", \"PI\",\n                               \"O\", \"C\",\n                               \"K\", \"F\", \"V\", \"C\",\n                               \"WC\", \"WS\", \"DS\", \"WP\", \"DP\",\n                               \"\"\n                              };\nFX_BOOL CPDF_AAction::ActionExist(AActionType eType) const\n{\n    if (m_pDict == NULL) {\n        return FALSE;\n    }\n    return m_pDict->KeyExist(g_sAATypes[(int)eType]);\n}\nCPDF_Action CPDF_AAction::GetAction(AActionType eType) const\n{\n    if (m_pDict == NULL) {\n        return NULL;\n    }\n    return m_pDict->GetDict(g_sAATypes[(int)eType]);\n}\nFX_POSITION CPDF_AAction::GetStartPos() const\n{\n    if (m_pDict == NULL) {\n        return NULL;\n    }\n    return m_pDict->GetStartPos();\n}\nCPDF_Action CPDF_AAction::GetNextAction(FX_POSITION& pos, AActionType& eType) const\n{\n    if (m_pDict == NULL) {\n        return NULL;\n    }\n    CFX_ByteString csKey;\n    CPDF_Object* pObj = m_pDict->GetNextElement(pos, csKey);\n    if (pObj != NULL) {\n        CPDF_Object* pDirect = pObj->GetDirect();\n        if (pDirect != NULL && pDirect->GetType() == PDFOBJ_DICTIONARY) {\n            int i = 0;\n            while (g_sAATypes[i][0] != '\\0') {\n                if (csKey == g_sAATypes[i]) {\n                    break;\n                }\n                i ++;\n            }\n            eType = (AActionType)i;\n            return (CPDF_Dictionary*)pDirect;\n        }\n    }\n    return NULL;\n}\nCPDF_DocJSActions::CPDF_DocJSActions(CPDF_Document* pDoc)\n{\n    m_pDocument = pDoc;\n}\nint CPDF_DocJSActions::CountJSActions() const\n{\n    ASSERT(m_pDocument != NULL);\n    CPDF_NameTree name_tree(m_pDocument, FX_BSTRC(\"JavaScript\"));\n    return name_tree.GetCount();\n}\nCPDF_Action CPDF_DocJSActions::GetJSAction(int index, CFX_ByteString& csName) const\n{\n    ASSERT(m_pDocument != NULL);\n    CPDF_NameTree name_tree(m_pDocument, FX_BSTRC(\"JavaScript\"));\n    CPDF_Object *pAction = name_tree.LookupValue(index, csName);\n    if (pAction == NULL || pAction->GetType() != PDFOBJ_DICTIONARY) {\n        return NULL;\n    }\n    return pAction->GetDict();\n}\nCPDF_Action CPDF_DocJSActions::GetJSAction(const CFX_ByteString& csName) const\n{\n    ASSERT(m_pDocument != NULL);\n    CPDF_NameTree name_tree(m_pDocument, FX_BSTRC(\"JavaScript\"));\n    CPDF_Object *pAction = name_tree.LookupValue(csName);\n    if (pAction == NULL || pAction->GetType() != PDFOBJ_DICTIONARY) {\n        return NULL;\n    }\n    return pAction->GetDict();\n}\nint CPDF_DocJSActions::FindJSAction(const CFX_ByteString& csName) const\n{\n    ASSERT(m_pDocument != NULL);\n    CPDF_NameTree name_tree(m_pDocument, FX_BSTRC(\"JavaScript\"));\n    return name_tree.GetIndex(csName);\n}\n"
  },
  {
    "path": "core/src/fpdfdoc/doc_annot.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fpdfdoc/fpdf_doc.h\"\n#include \"../../include/fpdfapi/fpdf_pageobj.h\"\nCPDF_AnnotList::CPDF_AnnotList(CPDF_Page* pPage)\n{\n    ASSERT(pPage != NULL);\n    m_pPageDict = pPage->m_pFormDict;\n    if (m_pPageDict == NULL) {\n        return;\n    }\n    m_pDocument = pPage->m_pDocument;\n    CPDF_Array* pAnnots = m_pPageDict->GetArray(\"Annots\");\n    if (pAnnots == NULL) {\n        return;\n    }\n    CPDF_Dictionary* pRoot = m_pDocument->GetRoot();\n    CPDF_Dictionary* pAcroForm = pRoot->GetDict(\"AcroForm\");\n    FX_BOOL bRegenerateAP = pAcroForm && pAcroForm->GetBoolean(\"NeedAppearances\");\n    for (FX_DWORD i = 0; i < pAnnots->GetCount(); i ++) {\n        CPDF_Dictionary* pDict = (CPDF_Dictionary*)pAnnots->GetElementValue(i);\n        if (pDict == NULL || pDict->GetType() != PDFOBJ_DICTIONARY) {\n            continue;\n        }\n        FX_DWORD dwObjNum = pDict->GetObjNum();\n        if (dwObjNum == 0) {\n            dwObjNum = m_pDocument->AddIndirectObject(pDict);\n            CPDF_Reference* pAction = CPDF_Reference::Create(m_pDocument, dwObjNum);\n            if (pAction == NULL) {\n                break;\n            }\n            pAnnots->InsertAt(i, pAction);\n            pAnnots->RemoveAt(i + 1);\n            pDict = pAnnots->GetDict(i);\n        }\n        CPDF_Annot* pAnnot = FX_NEW CPDF_Annot(pDict);\n        if (pAnnot == NULL) {\n            break;\n        }\n        pAnnot->m_pList = this;\n        m_AnnotList.Add(pAnnot);\n        if (bRegenerateAP && pDict->GetConstString(FX_BSTRC(\"Subtype\")) == FX_BSTRC(\"Widget\"))\n            if (CPDF_InterForm::UpdatingAPEnabled()) {\n                FPDF_GenerateAP(m_pDocument, pDict);\n            }\n    }\n}\nCPDF_AnnotList::~CPDF_AnnotList()\n{\n    int i = 0;\n    for (i = 0; i < m_AnnotList.GetSize(); i ++) {\n        delete (CPDF_Annot*)m_AnnotList[i];\n    }\n    for (i = 0; i < m_Borders.GetSize(); ++i) {\n        delete (CPDF_PageObjects*)m_Borders[i];\n    }\n}\nvoid CPDF_AnnotList::DisplayPass(const CPDF_Page* pPage, CFX_RenderDevice* pDevice,\n                                 CPDF_RenderContext* pContext, FX_BOOL bPrinting, CFX_AffineMatrix* pMatrix,\n                                 FX_BOOL bWidgetPass, CPDF_RenderOptions* pOptions, FX_RECT* clip_rect)\n{\n    for (int i = 0; i < m_AnnotList.GetSize(); i ++) {\n        CPDF_Annot* pAnnot = (CPDF_Annot*)m_AnnotList[i];\n        FX_BOOL bWidget = pAnnot->GetSubType() == \"Widget\";\n        if ((bWidgetPass && !bWidget) || (!bWidgetPass && bWidget)) {\n            continue;\n        }\n        FX_DWORD annot_flags = pAnnot->GetFlags();\n        if (annot_flags & ANNOTFLAG_HIDDEN) {\n            continue;\n        }\n        if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) {\n            continue;\n        }\n        if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) {\n            continue;\n        }\n        if (pOptions != NULL) {\n            IPDF_OCContext* pOCContext = pOptions->m_pOCContext;\n            CPDF_Dictionary* pAnnotDict = pAnnot->m_pAnnotDict;\n            if (pOCContext != NULL && pAnnotDict != NULL &&\n                    !pOCContext->CheckOCGVisible(pAnnotDict->GetDict(FX_BSTRC(\"OC\")))) {\n                continue;\n            }\n        }\n        CPDF_Rect annot_rect_f;\n        pAnnot->GetRect(annot_rect_f);\n        CFX_Matrix matrix;\n        matrix = *pMatrix;\n        if (clip_rect) {\n            annot_rect_f.Transform(&matrix);\n            FX_RECT annot_rect = annot_rect_f.GetOutterRect();\n            annot_rect.Intersect(*clip_rect);\n            if (annot_rect.IsEmpty()) {\n                continue;\n            }\n        }\n        if (pContext) {\n            pAnnot->DrawInContext(pPage, pContext, &matrix, CPDF_Annot::Normal);\n        } else if (!pAnnot->DrawAppearance(pPage, pDevice, &matrix, CPDF_Annot::Normal, pOptions)) {\n            pAnnot->DrawBorder(pDevice, &matrix, pOptions);\n        }\n    }\n}\nvoid CPDF_AnnotList::DisplayAnnots(const CPDF_Page* pPage, CFX_RenderDevice* pDevice,\n                                   CFX_AffineMatrix* pUser2Device,\n                                   FX_BOOL bShowWidget, CPDF_RenderOptions* pOptions)\n{\n    FX_RECT clip_rect;\n    if (pDevice) {\n        clip_rect = pDevice->GetClipBox();\n    }\n    FX_BOOL bPrinting = pDevice->GetDeviceClass() == FXDC_PRINTER || (pOptions && (pOptions->m_Flags & RENDER_PRINTPREVIEW));\n    DisplayAnnots(pPage, pDevice, NULL, bPrinting, pUser2Device, bShowWidget ? 3 : 1, pOptions, &clip_rect);\n}\nvoid CPDF_AnnotList::DisplayAnnots(const CPDF_Page* pPage, CFX_RenderDevice* pDevice, CPDF_RenderContext* pContext,\n                                   FX_BOOL bPrinting, CFX_AffineMatrix* pUser2Device, FX_DWORD dwAnnotFlags,\n                                   CPDF_RenderOptions* pOptions, FX_RECT* pClipRect)\n{\n    if (dwAnnotFlags & 0x01) {\n        DisplayPass(pPage, pDevice, pContext, bPrinting, pUser2Device, FALSE, pOptions, pClipRect);\n    }\n    if (dwAnnotFlags & 0x02) {\n        DisplayPass(pPage, pDevice, pContext, bPrinting, pUser2Device, TRUE, pOptions, pClipRect);\n    }\n}\nint CPDF_AnnotList::GetIndex(CPDF_Annot* pAnnot)\n{\n    for (int i = 0; i < m_AnnotList.GetSize(); i ++)\n        if (m_AnnotList[i] == (FX_LPVOID)pAnnot) {\n            return i;\n        }\n    return -1;\n}\nCPDF_Annot::CPDF_Annot(CPDF_Dictionary* pDict)\n{\n    m_pList = NULL;\n    m_pAnnotDict = pDict;\n}\nCPDF_Annot::~CPDF_Annot()\n{\n    ClearCachedAP();\n}\nCPDF_Reference* CPDF_Annot::NewAnnotRef()\n{\n    if (m_pAnnotDict->GetObjNum() == 0) {\n        m_pList->m_pDocument->AddIndirectObject(m_pAnnotDict);\n    }\n    return CPDF_Reference::Create(m_pList->m_pDocument, m_pAnnotDict->GetObjNum());\n}\nvoid CPDF_Annot::ClearCachedAP()\n{\n    FX_POSITION pos = m_APMap.GetStartPosition();\n    while (pos) {\n        void* pForm;\n        void* pObjects;\n        m_APMap.GetNextAssoc(pos, pForm, pObjects);\n        delete (CPDF_PageObjects*)pObjects;\n    }\n    m_APMap.RemoveAll();\n}\nCFX_ByteString CPDF_Annot::GetSubType() const\n{\n    return m_pAnnotDict ? m_pAnnotDict->GetConstString(FX_BSTRC(\"Subtype\")) : CFX_ByteStringC();\n}\nvoid CPDF_Annot::GetRect(CPDF_Rect& rect) const\n{\n    if (m_pAnnotDict == NULL) {\n        return;\n    }\n    rect = m_pAnnotDict->GetRect(\"Rect\");\n    rect.Normalize();\n}\nCPDF_Stream* FPDFDOC_GetAnnotAP(CPDF_Dictionary* pAnnotDict, CPDF_Annot::AppearanceMode mode)\n{\n    CPDF_Dictionary* pAP = pAnnotDict->GetDict(\"AP\");\n    if (pAP == NULL) {\n        return NULL;\n    }\n    const FX_CHAR* ap_entry = \"N\";\n    if (mode == CPDF_Annot::Down) {\n        ap_entry = \"D\";\n    } else if (mode == CPDF_Annot::Rollover) {\n        ap_entry = \"R\";\n    }\n    if (!pAP->KeyExist(ap_entry)) {\n        ap_entry = \"N\";\n    }\n    CPDF_Object* psub = pAP->GetElementValue(ap_entry);\n    if (psub == NULL) {\n        return NULL;\n    }\n    CPDF_Stream* pStream = NULL;\n    if (psub->GetType() == PDFOBJ_STREAM) {\n        pStream = (CPDF_Stream*)psub;\n    } else if (psub->GetType() == PDFOBJ_DICTIONARY) {\n        CFX_ByteString as = pAnnotDict->GetString(\"AS\");\n        if (as.IsEmpty()) {\n            CFX_ByteString value = pAnnotDict->GetString(FX_BSTRC(\"V\"));\n            if (value.IsEmpty()) {\n                CPDF_Dictionary* pDict = pAnnotDict->GetDict(FX_BSTRC(\"Parent\"));\n                value = pDict ? pDict->GetString(FX_BSTRC(\"V\")) : CFX_ByteString();\n            }\n            if (value.IsEmpty() || !((CPDF_Dictionary*)psub)->KeyExist(value)) {\n                as = FX_BSTRC(\"Off\");\n            } else {\n                as = value;\n            }\n        }\n        pStream = ((CPDF_Dictionary*)psub)->GetStream(as);\n    }\n    return pStream;\n}\nCPDF_Form* CPDF_Annot::GetAPForm(const CPDF_Page* pPage, AppearanceMode mode)\n{\n    CPDF_Stream* pStream = FPDFDOC_GetAnnotAP(m_pAnnotDict, mode);\n    if (pStream == NULL) {\n        return NULL;\n    }\n    CPDF_Form* pForm;\n    if (m_APMap.Lookup(pStream, (void*&)pForm)) {\n        return pForm;\n    }\n    pForm = FX_NEW CPDF_Form(m_pList->m_pDocument, pPage->m_pResources, pStream);\n    if (pForm == NULL) {\n        return NULL;\n    }\n    pForm->ParseContent(NULL, NULL, NULL, NULL);\n    m_APMap.SetAt(pStream, pForm);\n    return pForm;\n}\nstatic CPDF_Form* FPDFDOC_Annot_GetMatrix(const CPDF_Page* pPage, CPDF_Annot* pAnnot, CPDF_Annot::AppearanceMode mode, const CFX_AffineMatrix* pUser2Device, CFX_Matrix &matrix)\n{\n    CPDF_Form* pForm = pAnnot->GetAPForm(pPage, mode);\n    if (!pForm) {\n        return NULL;\n    }\n    CFX_FloatRect form_bbox = pForm->m_pFormDict->GetRect(FX_BSTRC(\"BBox\"));\n    CFX_Matrix form_matrix = pForm->m_pFormDict->GetMatrix(FX_BSTRC(\"Matrix\"));\n    form_matrix.TransformRect(form_bbox);\n    CPDF_Rect arect;\n    pAnnot->GetRect(arect);\n    matrix.MatchRect(arect, form_bbox);\n    matrix.Concat(*pUser2Device);\n    return pForm;\n}\nFX_BOOL CPDF_Annot::DrawAppearance(const CPDF_Page* pPage, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pUser2Device,\n                                   AppearanceMode mode, const CPDF_RenderOptions* pOptions)\n{\n    CFX_Matrix matrix;\n    CPDF_Form* pForm = FPDFDOC_Annot_GetMatrix(pPage, this, mode, pUser2Device, matrix);\n    if (!pForm) {\n        return FALSE;\n    }\n    CPDF_RenderContext context;\n    context.Create((CPDF_Page*)pPage);\n    context.DrawObjectList(pDevice, pForm, &matrix, pOptions);\n    return TRUE;\n}\nFX_BOOL CPDF_Annot::DrawInContext(const CPDF_Page* pPage, const CPDF_RenderContext* pContext, const CFX_AffineMatrix* pUser2Device, AppearanceMode mode)\n{\n    CFX_Matrix matrix;\n    CPDF_Form* pForm = FPDFDOC_Annot_GetMatrix(pPage, this, mode, pUser2Device, matrix);\n    if (!pForm) {\n        return FALSE;\n    }\n    ((CPDF_RenderContext*)pContext)->AppendObjectList(pForm, &matrix);\n    return TRUE;\n}\nCPDF_PageObject* CPDF_Annot::GetBorder(FX_BOOL bPrint, const CPDF_RenderOptions* pOptions)\n{\n    if (GetSubType() == \"Popup\") {\n        return NULL;\n    }\n    FX_DWORD annot_flags = GetFlags();\n    if (annot_flags & ANNOTFLAG_HIDDEN) {\n        return NULL;\n    }\n    FX_BOOL bPrinting = bPrint || (pOptions && (pOptions->m_Flags & RENDER_PRINTPREVIEW));\n    if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) {\n        return NULL;\n    }\n    if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) {\n        return NULL;\n    }\n    CPDF_Dictionary* pBS = m_pAnnotDict->GetDict(\"BS\");\n    char style_char;\n    FX_FLOAT width;\n    CPDF_Array* pDashArray = NULL;\n    if (pBS == NULL) {\n        CPDF_Array* pBorderArray = m_pAnnotDict->GetArray(\"Border\");\n        style_char = 'S';\n        if (pBorderArray) {\n            width = pBorderArray->GetNumber(2);\n            if (pBorderArray->GetCount() == 4) {\n                pDashArray = pBorderArray->GetArray(3);\n                if (pDashArray == NULL) {\n                    return NULL;\n                }\n                style_char = 'D';\n            }\n        } else {\n            width = 1;\n        }\n    } else {\n        CFX_ByteString style = pBS->GetString(\"S\");\n        pDashArray = pBS->GetArray(\"D\");\n        style_char = style[1];\n        width = pBS->GetNumber(\"W\");\n    }\n    if (width <= 0) {\n        return NULL;\n    }\n    CPDF_Array* pColor = m_pAnnotDict->GetArray(\"C\");\n    FX_DWORD argb = 0xff000000;\n    if (pColor != NULL) {\n        int R = (FX_INT32)(pColor->GetNumber(0) * 255);\n        int G = (FX_INT32)(pColor->GetNumber(1) * 255);\n        int B = (FX_INT32)(pColor->GetNumber(2) * 255);\n        argb = ArgbEncode(0xff, R, G, B);\n    }\n    CPDF_PathObject *pPathObject = FX_NEW CPDF_PathObject();\n    if (!pPathObject) {\n        return NULL;\n    }\n    CPDF_GraphStateData *pGraphState = pPathObject->m_GraphState.GetModify();\n    if (!pGraphState) {\n        pPathObject->Release();\n        return NULL;\n    }\n    pGraphState->m_LineWidth = width;\n    CPDF_ColorStateData *pColorData = pPathObject->m_ColorState.GetModify();\n    if (!pColorData) {\n        pPathObject->Release();\n        return NULL;\n    }\n    pColorData->m_StrokeRGB = argb;\n    pPathObject->m_bStroke = TRUE;\n    pPathObject->m_FillType = 0;\n    if (style_char == 'D') {\n        if (pDashArray) {\n            FX_DWORD dash_count = pDashArray->GetCount();\n            if (dash_count % 2) {\n                dash_count ++;\n            }\n            pGraphState->m_DashArray = FX_Alloc(FX_FLOAT, dash_count);\n            if (pGraphState->m_DashArray == NULL) {\n                pPathObject->Release();\n                return NULL;\n            }\n            pGraphState->m_DashCount = dash_count;\n            FX_DWORD i;\n            for (i = 0; i < pDashArray->GetCount(); i ++) {\n                pGraphState->m_DashArray[i] = pDashArray->GetNumber(i);\n            }\n            if (i < dash_count) {\n                pGraphState->m_DashArray[i] = pGraphState->m_DashArray[i - 1];\n            }\n        } else {\n            pGraphState->m_DashArray = FX_Alloc(FX_FLOAT, 2);\n            if (pGraphState->m_DashArray == NULL) {\n                pPathObject->Release();\n                return NULL;\n            }\n            pGraphState->m_DashCount = 2;\n            pGraphState->m_DashArray[0] = pGraphState->m_DashArray[1] = 3 * 1.0f;\n        }\n    }\n    CFX_FloatRect rect;\n    GetRect(rect);\n    width /= 2;\n    CPDF_PathData *pPathData = pPathObject->m_Path.GetModify();\n    if (pPathData) {\n        pPathData->AppendRect(rect.left + width, rect.bottom + width, rect.right - width, rect.top - width);\n    }\n    pPathObject->CalcBoundingBox();\n    return pPathObject;\n}\nvoid CPDF_Annot::DrawBorder(CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pUser2Device, const CPDF_RenderOptions* pOptions)\n{\n    if (GetSubType() == \"Popup\") {\n        return;\n    }\n    FX_DWORD annot_flags = GetFlags();\n    if (annot_flags & ANNOTFLAG_HIDDEN) {\n        return;\n    }\n    FX_BOOL bPrinting = pDevice->GetDeviceClass() == FXDC_PRINTER || (pOptions && (pOptions->m_Flags & RENDER_PRINTPREVIEW));\n    if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) {\n        return;\n    }\n    if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) {\n        return;\n    }\n    CPDF_Dictionary* pBS = m_pAnnotDict->GetDict(\"BS\");\n    char style_char;\n    FX_FLOAT width;\n    CPDF_Array* pDashArray = NULL;\n    if (pBS == NULL) {\n        CPDF_Array* pBorderArray = m_pAnnotDict->GetArray(\"Border\");\n        style_char = 'S';\n        if (pBorderArray) {\n            width = pBorderArray->GetNumber(2);\n            if (pBorderArray->GetCount() == 4) {\n                pDashArray = pBorderArray->GetArray(3);\n                if (pDashArray == NULL) {\n                    return;\n                }\n                int nLen = pDashArray->GetCount();\n                int i = 0;\n                for (; i < nLen; ++i) {\n                    CPDF_Object*pObj = pDashArray->GetElementValue(i);\n                    if (pObj && pObj->GetInteger()) {\n                        break;\n                    }\n                }\n                if (i == nLen) {\n                    return;\n                }\n                style_char = 'D';\n            }\n        } else {\n            width = 1;\n        }\n    } else {\n        CFX_ByteString style = pBS->GetString(\"S\");\n        pDashArray = pBS->GetArray(\"D\");\n        style_char = style[1];\n        width = pBS->GetNumber(\"W\");\n    }\n    if (width <= 0) {\n        return;\n    }\n    CPDF_Array* pColor = m_pAnnotDict->GetArray(\"C\");\n    FX_DWORD argb = 0xff000000;\n    if (pColor != NULL) {\n        int R = (FX_INT32)(pColor->GetNumber(0) * 255);\n        int G = (FX_INT32)(pColor->GetNumber(1) * 255);\n        int B = (FX_INT32)(pColor->GetNumber(2) * 255);\n        argb = ArgbEncode(0xff, R, G, B);\n    }\n    CPDF_GraphStateData graph_state;\n    graph_state.m_LineWidth = width;\n    if (style_char == 'D') {\n        if (pDashArray) {\n            FX_DWORD dash_count = pDashArray->GetCount();\n            if (dash_count % 2) {\n                dash_count ++;\n            }\n            graph_state.m_DashArray = FX_Alloc(FX_FLOAT, dash_count);\n            if (graph_state.m_DashArray == NULL) {\n                return ;\n            }\n            graph_state.m_DashCount = dash_count;\n            FX_DWORD i;\n            for (i = 0; i < pDashArray->GetCount(); i ++) {\n                graph_state.m_DashArray[i] = pDashArray->GetNumber(i);\n            }\n            if (i < dash_count) {\n                graph_state.m_DashArray[i] = graph_state.m_DashArray[i - 1];\n            }\n        } else {\n            graph_state.m_DashArray = FX_Alloc(FX_FLOAT, 2);\n            if (graph_state.m_DashArray == NULL) {\n                return ;\n            }\n            graph_state.m_DashCount = 2;\n            graph_state.m_DashArray[0] = graph_state.m_DashArray[1] = 3 * 1.0f;\n        }\n    }\n    CFX_FloatRect rect;\n    GetRect(rect);\n    CPDF_PathData path;\n    width /= 2;\n    path.AppendRect(rect.left + width, rect.bottom + width, rect.right - width, rect.top - width);\n    int fill_type = 0;\n    if (pOptions && (pOptions->m_Flags & RENDER_NOPATHSMOOTH)) {\n        fill_type |= FXFILL_NOPATHSMOOTH;\n    }\n    pDevice->DrawPath(&path, pUser2Device, &graph_state, argb, argb, fill_type);\n}\nint CPDF_Annot::CountIRTNotes()\n{\n    int count = 0;\n    for (int i = 0; i < m_pList->Count(); i ++) {\n        CPDF_Annot* pAnnot = m_pList->GetAt(i);\n        if (pAnnot == NULL) {\n            continue;\n        }\n        CPDF_Dictionary* pIRT = pAnnot->m_pAnnotDict->GetDict(\"IRT\");\n        if (pIRT != m_pAnnotDict) {\n            continue;\n        }\n        count ++;\n    }\n    return count;\n}\nCPDF_Annot* CPDF_Annot::GetIRTNote(int index)\n{\n    int count = 0;\n    for (int i = 0; i < m_pList->Count(); i ++) {\n        CPDF_Annot* pAnnot = m_pList->GetAt(i);\n        if (pAnnot == NULL) {\n            continue;\n        }\n        CPDF_Dictionary* pIRT = pAnnot->m_pAnnotDict->GetDict(\"IRT\");\n        if (pIRT != m_pAnnotDict) {\n            continue;\n        }\n        if (count == index) {\n            return pAnnot;\n        }\n        count ++;\n    }\n    return NULL;\n}\n"
  },
  {
    "path": "core/src/fpdfdoc/doc_ap.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fpdfdoc/fpdf_doc.h\"\n#include \"../../include/fpdfdoc/fpdf_vt.h\"\n#include \"pdf_vt.h\"\n#include \"../../include/fpdfdoc/fpdf_ap.h\"\nFX_BOOL FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict)\n{\n    if (!pAnnotDict || pAnnotDict->GetConstString(\"Subtype\") != FX_BSTRC(\"Widget\")) {\n        return FALSE;\n    }\n    CFX_ByteString field_type = FPDF_GetFieldAttr(pAnnotDict, \"FT\")->GetString();\n    FX_DWORD flags = FPDF_GetFieldAttr(pAnnotDict, \"Ff\")? FPDF_GetFieldAttr(pAnnotDict, \"Ff\")->GetInteger() : 0;\n    if (field_type == \"Tx\") {\n        return CPVT_GenerateAP::GenerateTextFieldAP(pDoc, pAnnotDict);\n    } else if (field_type == \"Ch\") {\n        if (flags & (1 << 17)) {\n            return CPVT_GenerateAP::GenerateComboBoxAP(pDoc, pAnnotDict);\n        } else {\n            return CPVT_GenerateAP::GenerateListBoxAP(pDoc, pAnnotDict);\n        }\n    } else if (field_type == \"Btn\") {\n        if (!(flags & (1 << 16))) {\n            if (!pAnnotDict->KeyExist(\"AS\")) {\n                if (CPDF_Dictionary* pParentDict = pAnnotDict->GetDict(\"Parent\")) {\n                    if (pParentDict->KeyExist(\"AS\")) {\n                        pAnnotDict->SetAtString(\"AS\", pParentDict->GetString(\"AS\"));\n                    }\n                }\n            }\n        }\n    }\n    return FALSE;\n}\nclass CPVT_FontMap : public IPVT_FontMap\n{\npublic:\n    CPVT_FontMap(CPDF_Document * pDoc, CPDF_Dictionary * pResDict, CPDF_Font * pDefFont,\n                 const CFX_ByteString & sDefFontAlias);\n    virtual ~CPVT_FontMap();\n    CPDF_Font*\t\t\t\t\t\tGetPDFFont(FX_INT32 nFontIndex);\n    CFX_ByteString\t\t\t\t\tGetPDFFontAlias(FX_INT32 nFontIndex);\n    static void\t\t\t\t\t\tGetAnnotSysPDFFont(CPDF_Document * pDoc, CPDF_Dictionary * pResDict,\n            CPDF_Font * & pSysFont, CFX_ByteString & sSysFontAlias);\nprivate:\n    CPDF_Document*\t\t\t\t\tm_pDocument;\n    CPDF_Dictionary*\t\t\t\tm_pResDict;\n    CPDF_Font*\t\t\t\t\t\tm_pDefFont;\n    CFX_ByteString\t\t\t\t\tm_sDefFontAlias;\n    CPDF_Font*\t\t\t\t\t\tm_pSysFont;\n    CFX_ByteString\t\t\t\t\tm_sSysFontAlias;\n};\nCPVT_FontMap::CPVT_FontMap(CPDF_Document * pDoc, CPDF_Dictionary * pResDict, CPDF_Font * pDefFont,\n                           const CFX_ByteString & sDefFontAlias) :\n    m_pDocument(pDoc),\n    m_pResDict(pResDict),\n    m_pDefFont(pDefFont),\n    m_sDefFontAlias(sDefFontAlias),\n    m_pSysFont(NULL),\n    m_sSysFontAlias()\n{\n}\nCPVT_FontMap::~CPVT_FontMap()\n{\n}\nextern CPDF_Font*\t\tAddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);\nvoid CPVT_FontMap::GetAnnotSysPDFFont(CPDF_Document * pDoc, CPDF_Dictionary * pResDict,\n                                      CPDF_Font * & pSysFont, CFX_ByteString & sSysFontAlias)\n{\n    if (pDoc && pResDict) {\n        CFX_ByteString sFontAlias;\n        CPDF_Dictionary* pFormDict = pDoc->GetRoot()->GetDict(\"AcroForm\");\n        if (CPDF_Font * pPDFFont = AddNativeInterFormFont(pFormDict, pDoc, sSysFontAlias)) {\n            if (CPDF_Dictionary * pFontList = pResDict->GetDict(\"Font\")) {\n                if (!pFontList->KeyExist(sSysFontAlias)) {\n                    pFontList->SetAtReference(sSysFontAlias, pDoc, pPDFFont->GetFontDict());\n                }\n            }\n            pSysFont = pPDFFont;\n        }\n    }\n}\nCPDF_Font* CPVT_FontMap::GetPDFFont(FX_INT32 nFontIndex)\n{\n    switch (nFontIndex) {\n        case 0:\n            return m_pDefFont;\n        case 1:\n            if (!m_pSysFont) {\n                GetAnnotSysPDFFont(m_pDocument, m_pResDict, m_pSysFont, m_sSysFontAlias);\n            }\n            return m_pSysFont;\n    }\n    return NULL;\n}\nCFX_ByteString CPVT_FontMap::GetPDFFontAlias(FX_INT32 nFontIndex)\n{\n    switch (nFontIndex) {\n        case 0:\n            return m_sDefFontAlias;\n        case 1:\n            if (!m_pSysFont) {\n                GetAnnotSysPDFFont(m_pDocument, m_pResDict, m_pSysFont, m_sSysFontAlias);\n            }\n            return m_sSysFontAlias;\n    }\n    return \"\";\n}\nCPVT_Provider::CPVT_Provider(IPVT_FontMap * pFontMap) : m_pFontMap(pFontMap)\n{\n    ASSERT (m_pFontMap != NULL);\n}\nCPVT_Provider::~CPVT_Provider()\n{\n}\nFX_INT32 CPVT_Provider::GetCharWidth(FX_INT32 nFontIndex, FX_WORD word, FX_INT32 nWordStyle)\n{\n    if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) {\n        FX_DWORD charcode = pPDFFont->CharCodeFromUnicode(word);\n        if (charcode != -1) {\n            return pPDFFont->GetCharWidthF(charcode);\n        }\n    }\n    return 0;\n}\nFX_INT32 CPVT_Provider::GetTypeAscent(FX_INT32 nFontIndex)\n{\n    if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) {\n        return pPDFFont->GetTypeAscent();\n    }\n    return 0;\n}\nFX_INT32 CPVT_Provider::GetTypeDescent(FX_INT32 nFontIndex)\n{\n    if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) {\n        return pPDFFont->GetTypeDescent();\n    }\n    return 0;\n}\nFX_INT32 CPVT_Provider::GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex)\n{\n    if (CPDF_Font* pDefFont = m_pFontMap->GetPDFFont(0)) {\n        if (pDefFont->CharCodeFromUnicode(word) != -1) {\n            return 0;\n        }\n    }\n    if (CPDF_Font* pSysFont = m_pFontMap->GetPDFFont(1))\n        if (pSysFont->CharCodeFromUnicode(word) != -1) {\n            return 1;\n        }\n    return -1;\n}\nFX_BOOL CPVT_Provider::IsLatinWord(FX_WORD word)\n{\n    if ((word >= 0x61 && word <= 0x7A) || (word >= 0x41 && word <= 0x5A) || word == 0x2D || word == 0x27) {\n        return TRUE;\n    }\n    return FALSE;\n}\nFX_INT32 CPVT_Provider::GetDefaultFontIndex()\n{\n    return 0;\n}\nstatic CFX_ByteString GetPDFWordString(IPVT_FontMap * pFontMap, FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord)\n{\n    CFX_ByteString sWord;\n    if (SubWord > 0) {\n        sWord.Format(\"%c\", SubWord);\n    } else {\n        if (pFontMap) {\n            if (CPDF_Font * pPDFFont = pFontMap->GetPDFFont(nFontIndex)) {\n                if (pPDFFont->GetBaseFont().Compare(\"Symbol\") == 0 || pPDFFont->GetBaseFont().Compare(\"ZapfDingbats\") == 0) {\n                    sWord.Format(\"%c\", Word);\n                } else {\n                    FX_DWORD dwCharCode = pPDFFont->CharCodeFromUnicode(Word);\n                    if (dwCharCode != -1) {\n                        pPDFFont->AppendChar(sWord, dwCharCode);\n                    }\n                }\n            }\n        }\n    }\n    return sWord;\n}\nstatic CFX_ByteString GetWordRenderString(const CFX_ByteString & strWords)\n{\n    if (strWords.GetLength() > 0) {\n        return PDF_EncodeString(strWords) + \" Tj\\n\";\n    }\n    return \"\";\n}\nstatic CFX_ByteString GetFontSetString(IPVT_FontMap * pFontMap, FX_INT32 nFontIndex, FX_FLOAT fFontSize)\n{\n    CFX_ByteTextBuf sRet;\n    if (pFontMap) {\n        CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex);\n        if (sFontAlias.GetLength() > 0 && fFontSize > 0 ) {\n            sRet << \"/\" << sFontAlias << \" \" << fFontSize << \" Tf\\n\";\n        }\n    }\n    return sRet.GetByteString();\n}\nstatic CPVT_Color ParseColor(const CFX_ByteString & str)\n{\n    CPDF_SimpleParser syntax(str);\n    syntax.SetPos(0);\n    if (syntax.FindTagParam(\"g\", 1)) {\n        return CPVT_Color(CT_GRAY, FX_atof(syntax.GetWord()));\n    }\n    syntax.SetPos(0);\n    if (syntax.FindTagParam(\"rg\", 3)) {\n        FX_FLOAT f1 = FX_atof(syntax.GetWord());\n        FX_FLOAT f2 = FX_atof(syntax.GetWord());\n        FX_FLOAT f3 = FX_atof(syntax.GetWord());\n        return CPVT_Color(CT_RGB, f1, f2, f3);\n    }\n    syntax.SetPos(0);\n    if (syntax.FindTagParam(\"k\", 4)) {\n        FX_FLOAT f1 = FX_atof(syntax.GetWord());\n        FX_FLOAT f2 = FX_atof(syntax.GetWord());\n        FX_FLOAT f3 = FX_atof(syntax.GetWord());\n        FX_FLOAT f4 = FX_atof(syntax.GetWord());\n        return CPVT_Color(CT_CMYK, f1, f2, f3, f4);\n    }\n    return CPVT_Color(CT_TRANSPARENT);\n}\nstatic CPVT_Color ParseColor(const CPDF_Array & array)\n{\n    CPVT_Color rt;\n    switch (array.GetCount()) {\n        case 1:\n            rt = CPVT_Color(CT_GRAY, array.GetFloat(0));\n            break;\n        case 3:\n            rt = CPVT_Color(CT_RGB, array.GetFloat(0), array.GetFloat(1), array.GetFloat(2));\n            break;\n        case 4:\n            rt = CPVT_Color(CT_CMYK, array.GetFloat(0), array.GetFloat(1), array.GetFloat(2), array.GetFloat(3));\n            break;\n    }\n    return rt;\n}\nstatic FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict, const FX_INT32 & nWidgetType)\n{\n    CPDF_Dictionary* pFormDict = NULL;\n    if (CPDF_Dictionary * pRootDict = pDoc->GetRoot()) {\n        pFormDict = pRootDict->GetDict(\"AcroForm\");\n    }\n    if (!pFormDict) {\n        return FALSE;\n    }\n    CFX_ByteString DA;\n    if (CPDF_Object* pDAObj = FPDF_GetFieldAttr(pAnnotDict, \"DA\")) {\n        DA = pDAObj->GetString();\n    }\n    if (DA.IsEmpty()) {\n        DA = pFormDict->GetString(\"DA\");\n    }\n    if (DA.IsEmpty()) {\n        return FALSE;\n    }\n    CPDF_SimpleParser syntax(DA);\n    syntax.FindTagParam(\"Tf\", 2);\n    CFX_ByteString sFontName = syntax.GetWord();\n    sFontName = PDF_NameDecode(sFontName);\n    if (sFontName.IsEmpty()) {\n        return FALSE;\n    }\n    FX_FLOAT fFontSize = FX_atof(syntax.GetWord());\n    CPVT_Color crText = ParseColor(DA);\n    FX_BOOL bUseFormRes = FALSE;\n    CPDF_Dictionary * pFontDict = NULL;\n    CPDF_Dictionary* pDRDict = pAnnotDict->GetDict(FX_BSTRC(\"DR\"));\n    if (pDRDict == NULL) {\n        pDRDict = pFormDict->GetDict(FX_BSTRC(\"DR\"));\n        bUseFormRes = TRUE;\n    }\n    CPDF_Dictionary * pDRFontDict = NULL;\n    if (pDRDict && (pDRFontDict = pDRDict->GetDict(\"Font\"))) {\n        pFontDict = pDRFontDict->GetDict(sFontName.Mid(1));\n        if (!pFontDict && !bUseFormRes) {\n            pDRDict = pFormDict->GetDict(FX_BSTRC(\"DR\"));\n            pDRFontDict = pDRDict->GetDict(\"Font\");\n            if (pDRFontDict) {\n                pFontDict = pDRFontDict->GetDict(sFontName.Mid(1));\n            }\n        }\n    }\n    if (!pDRFontDict) {\n        return FALSE;\n    }\n    if (!pFontDict) {\n        pFontDict = CPDF_Dictionary::Create();\n        if (pFontDict == NULL) {\n            return FALSE;\n        }\n        pFontDict->SetAtName(FX_BSTRC(\"Type\"), \"Font\");\n        pFontDict->SetAtName(FX_BSTRC(\"Subtype\"), \"Type1\");\n        pFontDict->SetAtName(FX_BSTRC(\"BaseFont\"), \"Helvetica\");\n        pFontDict->SetAtName(FX_BSTRC(\"Encoding\"), \"WinAnsiEncoding\");\n        pDoc->AddIndirectObject(pFontDict);\n        pDRFontDict->SetAtReference(sFontName.Mid(1), pDoc, pFontDict);\n    }\n    CPDF_Font* pDefFont = pDoc->LoadFont(pFontDict);\n    if (!pDefFont) {\n        return FALSE;\n    }\n    CFX_CharMap* pCharMap = pDefFont->GetCharMap();\n    CPDF_Rect rcAnnot = pAnnotDict->GetRect(\"Rect\");\n    FX_INT32 nRotate = 0;\n    if (CPDF_Dictionary * pMKDict = pAnnotDict->GetDict(\"MK\")) {\n        nRotate = pMKDict->GetInteger(\"R\");\n    }\n    CPDF_Rect rcBBox;\n    CPDF_Matrix matrix;\n    switch (nRotate % 360) {\n        case 0:\n            rcBBox = CPDF_Rect(0, 0, rcAnnot.right - rcAnnot.left, rcAnnot.top - rcAnnot.bottom);\n            break;\n        case 90:\n            matrix = CPDF_Matrix(0, 1, -1, 0, rcAnnot.right - rcAnnot.left, 0);\n            rcBBox = CPDF_Rect(0, 0, rcAnnot.top - rcAnnot.bottom, rcAnnot.right - rcAnnot.left);\n            break;\n        case 180:\n            matrix = CPDF_Matrix(-1, 0, 0, -1, rcAnnot.right - rcAnnot.left, rcAnnot.top - rcAnnot.bottom);\n            rcBBox = CPDF_Rect(0, 0, rcAnnot.right - rcAnnot.left, rcAnnot.top - rcAnnot.bottom);\n            break;\n        case 270:\n            matrix = CPDF_Matrix(0, -1, 1, 0, 0, rcAnnot.top - rcAnnot.bottom);\n            rcBBox = CPDF_Rect(0, 0, rcAnnot.top - rcAnnot.bottom, rcAnnot.right - rcAnnot.left);\n            break;\n    }\n    FX_INT32 nBorderStyle = PBS_SOLID;\n    FX_FLOAT fBorderWidth = 1;\n    CPVT_Dash dsBorder(3, 0, 0);\n    CPVT_Color crLeftTop, crRightBottom;\n    if (CPDF_Dictionary * pBSDict = pAnnotDict->GetDict(\"BS\")) {\n        if (pBSDict->KeyExist(\"W\")) {\n            fBorderWidth = pBSDict->GetNumber(\"W\");\n        }\n        if (CPDF_Array * pArray = pBSDict->GetArray(\"D\")) {\n            dsBorder = CPVT_Dash(pArray->GetInteger(0), pArray->GetInteger(1), pArray->GetInteger(2));\n        }\n        switch (pBSDict->GetString(\"S\").GetAt(0)) {\n            case 'S':\n                nBorderStyle = PBS_SOLID;\n                break;\n            case 'D':\n                nBorderStyle = PBS_DASH;\n                break;\n            case 'B':\n                nBorderStyle = PBS_BEVELED;\n                fBorderWidth *= 2;\n                crLeftTop = CPVT_Color(CT_GRAY, 1);\n                crRightBottom = CPVT_Color(CT_GRAY, 0.5);\n                break;\n            case 'I':\n                nBorderStyle = PBS_INSET;\n                fBorderWidth *= 2;\n                crLeftTop = CPVT_Color(CT_GRAY, 0.5);\n                crRightBottom = CPVT_Color(CT_GRAY, 0.75);\n                break;\n            case 'U':\n                nBorderStyle = PBS_UNDERLINED;\n                break;\n        }\n    }\n    CPVT_Color crBorder, crBG;\n    if (CPDF_Dictionary * pMKDict = pAnnotDict->GetDict(\"MK\")) {\n        if (CPDF_Array * pArray = pMKDict->GetArray(\"BC\")) {\n            crBorder = ParseColor(*pArray);\n        }\n        if (CPDF_Array * pArray = pMKDict->GetArray(\"BG\")) {\n            crBG = ParseColor(*pArray);\n        }\n    }\n    CFX_ByteTextBuf sAppStream;\n    CFX_ByteString sBG = CPVT_GenerateAP::GenerateColorAP(crBG, TRUE);\n    if (sBG.GetLength() > 0) {\n        sAppStream << \"q\\n\" << sBG << rcBBox.left << \" \" << rcBBox.bottom << \" \"\n                   << rcBBox.Width() << \" \" << rcBBox.Height() << \" re f\\n\" << \"Q\\n\";\n    }\n    CFX_ByteString sBorderStream = CPVT_GenerateAP::GenerateBorderAP(rcBBox, fBorderWidth,\n                                   crBorder, crLeftTop, crRightBottom, nBorderStyle, dsBorder);\n    if (sBorderStream.GetLength() > 0) {\n        sAppStream << \"q\\n\" << sBorderStream << \"Q\\n\";\n    }\n    CPDF_Rect rcBody = CPDF_Rect(rcBBox.left + fBorderWidth, rcBBox.bottom + fBorderWidth,\n                                 rcBBox.right - fBorderWidth, rcBBox.top - fBorderWidth);\n    rcBody.Normalize();\n    CPDF_Dictionary* pAPDict = pAnnotDict->GetDict(\"AP\");\n    if (pAPDict == NULL) {\n        pAPDict = CPDF_Dictionary::Create();\n        if (pAPDict == NULL) {\n            return FALSE;\n        }\n        pAnnotDict->SetAt(\"AP\", pAPDict);\n    }\n    CPDF_Stream* pNormalStream = pAPDict->GetStream(\"N\");\n    if (pNormalStream == NULL) {\n        pNormalStream = CPDF_Stream::Create(NULL, 0, NULL);\n        if (pNormalStream == NULL) {\n            return FALSE;\n        }\n        FX_INT32 objnum = pDoc->AddIndirectObject(pNormalStream);\n        pAnnotDict->GetDict(\"AP\")->SetAtReference(\"N\", pDoc, objnum);\n    }\n    CPDF_Dictionary * pStreamDict = pNormalStream->GetDict();\n    if (pStreamDict) {\n        pStreamDict->SetAtMatrix(\"Matrix\", matrix);\n        pStreamDict->SetAtRect(\"BBox\", rcBBox);\n        CPDF_Dictionary* pStreamResList = pStreamDict->GetDict(\"Resources\");\n        if (pStreamResList) {\n            CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDict(\"Font\");\n            if (!pStreamResFontList) {\n                pStreamResFontList = CPDF_Dictionary::Create();\n                if (pStreamResFontList == NULL) {\n                    return FALSE;\n                }\n                pStreamResList->SetAt(\"Font\", pStreamResFontList);\n            }\n            if (!pStreamResFontList->KeyExist(sFontName)) {\n                pStreamResFontList->SetAtReference(sFontName, pDoc, pFontDict);\n            }\n        } else {\n            pStreamDict->SetAt(\"Resources\", pFormDict->GetDict(\"DR\")->Clone());\n            pStreamResList = pStreamDict->GetDict(\"Resources\");\n        }\n    }\n    switch (nWidgetType) {\n        case 0: {\n                CFX_WideString swValue = FPDF_GetFieldAttr(pAnnotDict, \"V\")? FPDF_GetFieldAttr(pAnnotDict, \"V\")->GetUnicodeText() : CFX_WideString();\n                FX_INT32 nAlign = FPDF_GetFieldAttr(pAnnotDict, \"Q\")? FPDF_GetFieldAttr(pAnnotDict, \"Q\")->GetInteger() : 0;\n                FX_DWORD dwFlags = FPDF_GetFieldAttr(pAnnotDict, \"Ff\")? FPDF_GetFieldAttr(pAnnotDict, \"Ff\")->GetInteger() : 0;\n                FX_DWORD dwMaxLen = FPDF_GetFieldAttr(pAnnotDict, \"MaxLen\") ? FPDF_GetFieldAttr(pAnnotDict, \"MaxLen\")->GetInteger() : 0;\n                CPVT_FontMap map(pDoc, pStreamDict ? pStreamDict->GetDict(\"Resources\") : NULL , pDefFont, sFontName.Right(sFontName.GetLength() - 1));\n                CPVT_Provider prd(&map);\n                CPDF_VariableText vt;\n                vt.SetProvider(&prd);\n                vt.SetPlateRect(rcBody);\n                vt.SetAlignment(nAlign);\n                if (IsFloatZero(fFontSize)) {\n                    vt.SetAutoFontSize(TRUE);\n                } else {\n                    vt.SetFontSize(fFontSize);\n                }\n                FX_BOOL bMultiLine = (dwFlags >> 12) & 1;\n                if (bMultiLine) {\n                    vt.SetMultiLine(TRUE);\n                    vt.SetAutoReturn(TRUE);\n                }\n                FX_WORD subWord = 0;\n                if ((dwFlags >> 13) & 1) {\n                    subWord = '*';\n                    vt.SetPasswordChar(subWord);\n                }\n                FX_BOOL bCharArray = (dwFlags >> 24) & 1;\n                if (bCharArray) {\n                    vt.SetCharArray(dwMaxLen);\n                } else {\n                    vt.SetLimitChar(dwMaxLen);\n                }\n                vt.Initialize();\n                vt.SetText(swValue);\n                vt.RearrangeAll();\n                CPDF_Rect rcContent = vt.GetContentRect();\n                CPDF_Point ptOffset(0.0f, 0.0f);\n                if (!bMultiLine) {\n                    ptOffset = CPDF_Point(0.0f, (rcContent.Height() - rcBody.Height()) / 2.0f);\n                }\n                CFX_ByteString sBody = CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), ptOffset, !bCharArray, subWord);\n                if (sBody.GetLength() > 0) {\n                    sAppStream << \"/Tx BMC\\n\" << \"q\\n\";\n                    if (rcContent.Width() > rcBody.Width() ||\n                            rcContent.Height() > rcBody.Height()) {\n                        sAppStream << rcBody.left << \" \" << rcBody.bottom << \" \"\n                                   << rcBody.Width() << \" \" << rcBody.Height() << \" re\\nW\\nn\\n\";\n                    }\n                    sAppStream << \"BT\\n\" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) << sBody << \"ET\\n\" << \"Q\\nEMC\\n\";\n                }\n            }\n            break;\n        case 1: {\n                CFX_WideString swValue = FPDF_GetFieldAttr(pAnnotDict, \"V\") ? FPDF_GetFieldAttr(pAnnotDict, \"V\")->GetUnicodeText() : CFX_WideString();\n                CPVT_FontMap map(pDoc, pStreamDict ? pStreamDict->GetDict(\"Resources\"):NULL, pDefFont, sFontName.Right(sFontName.GetLength() - 1));\n                CPVT_Provider prd(&map);\n                CPDF_VariableText vt;\n                vt.SetProvider(&prd);\n                CPDF_Rect rcButton = rcBody;\n                rcButton.left = rcButton.right - 13;\n                rcButton.Normalize();\n                CPDF_Rect rcEdit = rcBody;\n                rcEdit.right = rcButton.left;\n                rcEdit.Normalize();\n                vt.SetPlateRect(rcEdit);\n                if (IsFloatZero(fFontSize)) {\n                    vt.SetAutoFontSize(TRUE);\n                } else {\n                    vt.SetFontSize(fFontSize);\n                }\n                vt.Initialize();\n                vt.SetText(swValue);\n                vt.RearrangeAll();\n                CPDF_Rect rcContent = vt.GetContentRect();\n                CPDF_Point ptOffset = CPDF_Point(0.0f, (rcContent.Height() - rcEdit.Height()) / 2.0f);\n                CFX_ByteString sEdit = CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), ptOffset, TRUE, 0);\n                if (sEdit.GetLength() > 0) {\n                    sAppStream << \"/Tx BMC\\n\" << \"q\\n\";\n                    sAppStream << rcEdit.left << \" \" << rcEdit.bottom << \" \"\n                               << rcEdit.Width() << \" \" << rcEdit.Height() << \" re\\nW\\nn\\n\";\n                    sAppStream << \"BT\\n\" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) << sEdit << \"ET\\n\" << \"Q\\nEMC\\n\";\n                }\n                CFX_ByteString sButton = CPVT_GenerateAP::GenerateColorAP(CPVT_Color(CT_RGB, 220.0f / 255.0f, 220.0f / 255.0f, 220.0f / 255.0f), TRUE);\n                if (sButton.GetLength() > 0 && !rcButton.IsEmpty()) {\n                    sAppStream << \"q\\n\" << sButton;\n                    sAppStream << rcButton.left << \" \" << rcButton.bottom << \" \"\n                               << rcButton.Width() << \" \" << rcButton.Height() << \" re f\\n\";\n                    sAppStream << \"Q\\n\";\n                    CFX_ByteString sButtonBorder = CPVT_GenerateAP::GenerateBorderAP(rcButton, 2, CPVT_Color(CT_GRAY, 0), CPVT_Color(CT_GRAY, 1), CPVT_Color(CT_GRAY, 0.5), PBS_BEVELED, CPVT_Dash(3, 0, 0));\n                    if (sButtonBorder.GetLength() > 0) {\n                        sAppStream << \"q\\n\" << sButtonBorder << \"Q\\n\";\n                    }\n                    CPDF_Point ptCenter = CPDF_Point((rcButton.left + rcButton.right) / 2, (rcButton.top + rcButton.bottom) / 2);\n                    if (IsFloatBigger(rcButton.Width(), 6) && IsFloatBigger(rcButton.Height(), 6)) {\n                        sAppStream << \"q\\n\" << \" 0 g\\n\";\n                        sAppStream << ptCenter.x - 3 << \" \" << ptCenter.y + 1.5f << \" m\\n\";\n                        sAppStream << ptCenter.x + 3 << \" \" << ptCenter.y + 1.5f << \" l\\n\";\n                        sAppStream << ptCenter.x << \" \" << ptCenter.y - 1.5f << \" l\\n\";\n                        sAppStream << ptCenter.x - 3 << \" \" << ptCenter.y + 1.5f << \" l f\\n\";\n                        sAppStream << sButton << \"Q\\n\";\n                    }\n                }\n            }\n            break;\n        case 2: {\n                CPVT_FontMap map(pDoc, pStreamDict ? pStreamDict->GetDict(\"Resources\"):NULL, pDefFont, sFontName.Right(sFontName.GetLength() - 1));\n                CPVT_Provider prd(&map);\n                CPDF_Array * pOpts = FPDF_GetFieldAttr(pAnnotDict, \"Opt\") ? FPDF_GetFieldAttr(pAnnotDict, \"Opt\")->GetArray() : NULL;\n                CPDF_Array * pSels = FPDF_GetFieldAttr(pAnnotDict, \"I\") ? FPDF_GetFieldAttr(pAnnotDict, \"I\")->GetArray() : NULL;\n                FX_INT32 nTop = FPDF_GetFieldAttr(pAnnotDict, \"TI\") ? FPDF_GetFieldAttr(pAnnotDict, \"TI\")->GetInteger() : 0;\n                CFX_ByteTextBuf sBody;\n                if (pOpts) {\n                    FX_FLOAT fy = rcBody.top;\n                    for (FX_INT32 i = nTop, sz = pOpts->GetCount(); i < sz; i++) {\n                        if (IsFloatSmaller(fy, rcBody.bottom)) {\n                            break;\n                        }\n                        if (CPDF_Object* pOpt = pOpts->GetElementValue(i)) {\n                            CFX_WideString swItem;\n                            if (pOpt->GetType() == PDFOBJ_STRING) {\n                                swItem = pOpt->GetUnicodeText();\n                            } else if (pOpt->GetType() == PDFOBJ_ARRAY) {\n                                swItem = ((CPDF_Array*)pOpt)->GetElementValue(1)->GetUnicodeText();\n                            }\n                            FX_BOOL bSelected = FALSE;\n                            if (pSels) {\n                                for (FX_DWORD s = 0, ssz = pSels->GetCount(); s < ssz; s++) {\n                                    if (i == pSels->GetInteger(s)) {\n                                        bSelected = TRUE;\n                                        break;\n                                    }\n                                }\n                            }\n                            CPDF_VariableText vt;\n                            vt.SetProvider(&prd);\n                            vt.SetPlateRect(CPDF_Rect(rcBody.left, 0.0f, rcBody.right, 0.0f));\n                            if (IsFloatZero(fFontSize)) {\n                                vt.SetFontSize(12.0f);\n                            } else {\n                                vt.SetFontSize(fFontSize);\n                            }\n                            vt.Initialize();\n                            vt.SetText(swItem);\n                            vt.RearrangeAll();\n                            FX_FLOAT fItemHeight = vt.GetContentRect().Height();\n                            if (bSelected) {\n                                CPDF_Rect rcItem = CPDF_Rect(rcBody.left, fy - fItemHeight, rcBody.right, fy);\n                                sBody << \"q\\n\" << CPVT_GenerateAP::GenerateColorAP(CPVT_Color(CT_RGB, 0, 51.0f / 255.0f, 113.0f / 255.0f), TRUE)\n                                      << rcItem.left << \" \" << rcItem.bottom << \" \" << rcItem.Width() << \" \" << rcItem.Height() << \" re f\\n\" << \"Q\\n\";\n                                sBody << \"BT\\n\" << CPVT_GenerateAP::GenerateColorAP(CPVT_Color(CT_GRAY, 1), TRUE) << CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), CPDF_Point(0.0f, fy), TRUE, 0) << \"ET\\n\";\n                            } else {\n                                sBody << \"BT\\n\" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) << CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), CPDF_Point(0.0f, fy), TRUE, 0) << \"ET\\n\";\n                            }\n                            fy -= fItemHeight;\n                        }\n                    }\n                }\n                if (sBody.GetSize() > 0) {\n                    sAppStream << \"/Tx BMC\\n\" << \"q\\n\";\n                    sAppStream << rcBody.left << \" \" << rcBody.bottom << \" \"\n                               << rcBody.Width() << \" \" << rcBody.Height() << \" re\\nW\\nn\\n\";\n                    sAppStream << sBody.GetByteString() << \"Q\\nEMC\\n\";\n                }\n            }\n            break;\n    }\n    if (pNormalStream) {\n        pNormalStream->SetData((FX_BYTE*)sAppStream.GetBuffer(), sAppStream.GetSize(), FALSE, FALSE);\n        pStreamDict = pNormalStream->GetDict();\n        if (pStreamDict) {\n            pStreamDict->SetAtMatrix(\"Matrix\", matrix);\n            pStreamDict->SetAtRect(\"BBox\", rcBBox);\n            CPDF_Dictionary* pStreamResList = pStreamDict->GetDict(\"Resources\");\n            if (pStreamResList) {\n                CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDict(\"Font\");\n                if (!pStreamResFontList) {\n                    pStreamResFontList = CPDF_Dictionary::Create();\n                    if (pStreamResFontList == NULL) {\n                        return FALSE;\n                    }\n                    pStreamResList->SetAt(\"Font\", pStreamResFontList);\n                }\n                if (!pStreamResFontList->KeyExist(sFontName)) {\n                    pStreamResFontList->SetAtReference(sFontName, pDoc, pFontDict);\n                }\n            } else {\n                pStreamDict->SetAt(\"Resources\", pFormDict->GetDict(\"DR\")->Clone());\n                pStreamResList = pStreamDict->GetDict(\"Resources\");\n            }\n        }\n    }\n    return TRUE;\n}\nFX_BOOL CPVT_GenerateAP::GenerateTextFieldAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict)\n{\n    return GenerateWidgetAP(pDoc, pAnnotDict, 0);\n}\nFX_BOOL CPVT_GenerateAP::GenerateComboBoxAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict)\n{\n    return GenerateWidgetAP(pDoc, pAnnotDict, 1);\n}\nFX_BOOL CPVT_GenerateAP::GenerateListBoxAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict)\n{\n    return GenerateWidgetAP(pDoc, pAnnotDict, 2);\n}\nCFX_ByteString CPVT_GenerateAP::GenerateEditAP(IPVT_FontMap * pFontMap, IPDF_VariableText_Iterator* pIterator, const CPDF_Point & ptOffset, FX_BOOL bContinuous, FX_WORD SubWord, const CPVT_WordRange * pVisible)\n{\n    CFX_ByteTextBuf sEditStream, sLineStream, sWords;\n    CPDF_Point ptOld(0.0f, 0.0f), ptNew(0.0f, 0.0f);\n    FX_INT32 nCurFontIndex = -1;\n    if (pIterator) {\n        if (pVisible) {\n            pIterator->SetAt(pVisible->BeginPos);\n        } else {\n            pIterator->SetAt(0);\n        }\n        CPVT_WordPlace oldplace;\n        while (pIterator->NextWord()) {\n            CPVT_WordPlace place = pIterator->GetAt();\n            if (pVisible && place.WordCmp(pVisible->EndPos) > 0) {\n                break;\n            }\n            if (bContinuous) {\n                if (place.LineCmp(oldplace) != 0) {\n                    if (sWords.GetSize() > 0) {\n                        sLineStream << GetWordRenderString(sWords.GetByteString());\n                        sEditStream << sLineStream;\n                        sLineStream.Clear();\n                        sWords.Clear();\n                    }\n                    CPVT_Word word;\n                    if (pIterator->GetWord(word)) {\n                        ptNew = CPDF_Point(word.ptWord.x + ptOffset.x, word.ptWord.y + ptOffset.y);\n                    } else {\n                        CPVT_Line line;\n                        pIterator->GetLine(line);\n                        ptNew = CPDF_Point(line.ptLine.x + ptOffset.x, line.ptLine.y + ptOffset.y);\n                    }\n                    if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) {\n                        sLineStream << ptNew.x - ptOld.x << \" \" << ptNew.y - ptOld.y << \" Td\\n\";\n                        ptOld = ptNew;\n                    }\n                }\n                CPVT_Word word;\n                if (pIterator->GetWord(word)) {\n                    if (word.nFontIndex != nCurFontIndex) {\n                        if (sWords.GetSize() > 0) {\n                            sLineStream << GetWordRenderString(sWords.GetByteString());\n                            sWords.Clear();\n                        }\n                        sLineStream << GetFontSetString(pFontMap, word.nFontIndex, word.fFontSize);\n                        nCurFontIndex = word.nFontIndex;\n                    }\n                    sWords << GetPDFWordString(pFontMap, nCurFontIndex, word.Word, SubWord);\n                }\n                oldplace = place;\n            } else {\n                CPVT_Word word;\n                if (pIterator->GetWord(word)) {\n                    ptNew = CPDF_Point(word.ptWord.x + ptOffset.x, word.ptWord.y + ptOffset.y);\n                    if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) {\n                        sEditStream << ptNew.x - ptOld.x << \" \" << ptNew.y - ptOld.y << \" Td\\n\";\n                        ptOld = ptNew;\n                    }\n                    if (word.nFontIndex != nCurFontIndex) {\n                        sEditStream << GetFontSetString(pFontMap, word.nFontIndex, word.fFontSize);\n                        nCurFontIndex = word.nFontIndex;\n                    }\n                    sEditStream << GetWordRenderString(GetPDFWordString(pFontMap, nCurFontIndex, word.Word, SubWord));\n                }\n            }\n        }\n        if (sWords.GetSize() > 0) {\n            sLineStream << GetWordRenderString(sWords.GetByteString());\n            sEditStream << sLineStream;\n            sWords.Clear();\n        }\n    }\n    return sEditStream.GetByteString();\n}\nCFX_ByteString CPVT_GenerateAP::GenerateBorderAP(const CPDF_Rect & rect, FX_FLOAT fWidth,\n        const CPVT_Color & color, const CPVT_Color & crLeftTop, const CPVT_Color & crRightBottom,\n        FX_INT32 nStyle, const CPVT_Dash & dash)\n{\n    CFX_ByteTextBuf sAppStream;\n    CFX_ByteString sColor;\n    FX_FLOAT fLeft = rect.left;\n    FX_FLOAT fRight = rect.right;\n    FX_FLOAT fTop = rect.top;\n    FX_FLOAT fBottom = rect.bottom;\n    if (fWidth > 0.0f) {\n        FX_FLOAT fHalfWidth = fWidth / 2.0f;\n        switch (nStyle) {\n            default:\n            case PBS_SOLID:\n                sColor = GenerateColorAP(color, TRUE);\n                if (sColor.GetLength() > 0) {\n                    sAppStream << sColor;\n                    sAppStream << fLeft << \" \" << fBottom << \" \" << fRight - fLeft << \" \" << fTop - fBottom << \" re\\n\";\n                    sAppStream << fLeft + fWidth << \" \" << fBottom + fWidth << \" \"\n                               << fRight - fLeft - fWidth * 2 << \" \" << fTop - fBottom - fWidth * 2 << \" re\\n\";\n                    sAppStream << \"f*\\n\";\n                }\n                break;\n            case PBS_DASH:\n                sColor = GenerateColorAP(color, FALSE);\n                if (sColor.GetLength() > 0) {\n                    sAppStream << sColor;\n                    sAppStream << fWidth << \" w\" << \" [\" << dash.nDash << \" \" << dash.nGap << \"] \" << dash.nPhase << \" d\\n\";\n                    sAppStream << fLeft + fWidth / 2 << \" \" << fBottom + fWidth / 2 << \" m\\n\";\n                    sAppStream << fLeft + fWidth / 2 << \" \" << fTop - fWidth / 2 << \" l\\n\";\n                    sAppStream << fRight - fWidth / 2 << \" \" << fTop - fWidth / 2 << \" l\\n\";\n                    sAppStream << fRight - fWidth / 2 << \" \" << fBottom + fWidth / 2 << \" l\\n\";\n                    sAppStream << fLeft + fWidth / 2 << \" \" << fBottom + fWidth / 2 << \" l S\\n\";\n                }\n                break;\n            case PBS_BEVELED:\n            case PBS_INSET:\n                sColor = GenerateColorAP(crLeftTop, TRUE);\n                if (sColor.GetLength() > 0) {\n                    sAppStream << sColor;\n                    sAppStream << fLeft + fHalfWidth << \" \" << fBottom + fHalfWidth << \" m\\n\";\n                    sAppStream << fLeft + fHalfWidth << \" \" << fTop - fHalfWidth << \" l\\n\";\n                    sAppStream << fRight - fHalfWidth << \" \" << fTop - fHalfWidth << \" l\\n\";\n                    sAppStream << fRight - fHalfWidth * 2 << \" \" << fTop - fHalfWidth * 2 << \" l\\n\";\n                    sAppStream << fLeft + fHalfWidth * 2 << \" \" << fTop - fHalfWidth * 2 << \" l\\n\";\n                    sAppStream << fLeft + fHalfWidth * 2 << \" \" << fBottom + fHalfWidth * 2 << \" l f\\n\";\n                }\n                sColor = GenerateColorAP(crRightBottom, TRUE);\n                if (sColor.GetLength() > 0) {\n                    sAppStream << sColor;\n                    sAppStream << fRight - fHalfWidth << \" \" <<\tfTop - fHalfWidth << \" m\\n\";\n                    sAppStream << fRight - fHalfWidth << \" \" <<\tfBottom + fHalfWidth << \" l\\n\";\n                    sAppStream << fLeft + fHalfWidth << \" \" << \tfBottom + fHalfWidth << \" l\\n\";\n                    sAppStream << fLeft + fHalfWidth * 2 << \" \" << fBottom + fHalfWidth * 2 << \" l\\n\";\n                    sAppStream << fRight - fHalfWidth * 2 << \" \" << fBottom + fHalfWidth * 2 << \" l\\n\";\n                    sAppStream << fRight - fHalfWidth * 2 << \" \" << fTop - fHalfWidth * 2 << \" l f\\n\";\n                }\n                sColor = GenerateColorAP(color, TRUE);\n                if (sColor.GetLength() > 0) {\n                    sAppStream << sColor;\n                    sAppStream << fLeft << \" \" << fBottom << \" \" <<\tfRight - fLeft << \" \" << fTop - fBottom << \" re\\n\";\n                    sAppStream << fLeft + fHalfWidth << \" \" << fBottom + fHalfWidth << \" \"\n                               << fRight - fLeft - fHalfWidth * 2 << \" \" << fTop - fBottom - fHalfWidth * 2 << \" re f*\\n\";\n                }\n                break;\n            case PBS_UNDERLINED:\n                sColor = GenerateColorAP(color, FALSE);\n                if (sColor.GetLength() > 0) {\n                    sAppStream << sColor;\n                    sAppStream << fWidth << \" w\\n\";\n                    sAppStream << fLeft << \" \" << fBottom + fWidth / 2 << \" m\\n\";\n                    sAppStream << fRight << \" \" << fBottom + fWidth / 2 << \" l S\\n\";\n                }\n                break;\n        }\n    }\n    return sAppStream.GetByteString();\n}\nCFX_ByteString CPVT_GenerateAP::GenerateColorAP(const CPVT_Color & color, const FX_BOOL & bFillOrStroke)\n{\n    CFX_ByteTextBuf sColorStream;\n    switch (color.nColorType) {\n        case CT_RGB:\n            sColorStream << color.fColor1 << \" \" << color.fColor2 << \" \" << color.fColor3 << \" \"\n                         << (bFillOrStroke ? \"rg\" : \"RG\") << \"\\n\";\n            break;\n        case CT_GRAY:\n            sColorStream << color.fColor1 << \" \" << (bFillOrStroke ? \"g\" : \"G\") << \"\\n\";\n            break;\n        case CT_CMYK:\n            sColorStream << color.fColor1 << \" \" << color.fColor2 << \" \" << color.fColor3 << \" \" << color.fColor4 << \" \"\n                         << (bFillOrStroke ? \"k\" : \"K\") << \"\\n\";\n            break;\n    }\n    return sColorStream.GetByteString();\n}\n"
  },
  {
    "path": "core/src/fpdfdoc/doc_basic.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fpdfdoc/fpdf_doc.h\"\nconst int nMaxRecursion = 32;\nint CPDF_Dest::GetPageIndex(CPDF_Document* pDoc)\n{\n    if (m_pObj == NULL || m_pObj->GetType() != PDFOBJ_ARRAY) {\n        return 0;\n    }\n    CPDF_Object* pPage = ((CPDF_Array*)m_pObj)->GetElementValue(0);\n    if (pPage == NULL) {\n        return 0;\n    }\n    if (pPage->GetType() == PDFOBJ_NUMBER) {\n        return pPage->GetInteger();\n    }\n    if (pPage->GetType() != PDFOBJ_DICTIONARY) {\n        return 0;\n    }\n    return pDoc->GetPageIndex(pPage->GetObjNum());\n}\nFX_DWORD CPDF_Dest::GetPageObjNum()\n{\n    if (m_pObj == NULL || m_pObj->GetType() != PDFOBJ_ARRAY) {\n        return 0;\n    }\n    CPDF_Object* pPage = ((CPDF_Array*)m_pObj)->GetElementValue(0);\n    if (pPage == NULL) {\n        return 0;\n    }\n    if (pPage->GetType() == PDFOBJ_NUMBER) {\n        return pPage->GetInteger();\n    }\n    if (pPage->GetType() == PDFOBJ_DICTIONARY) {\n        return pPage->GetObjNum();\n    }\n    return 0;\n}\nconst FX_CHAR* g_sZoomModes[] = {\"XYZ\", \"Fit\", \"FitH\", \"FitV\", \"FitR\", \"FitB\", \"FitBH\", \"FitBV\", \"\"};\nint CPDF_Dest::GetZoomMode()\n{\n    if (m_pObj == NULL || m_pObj->GetType() != PDFOBJ_ARRAY) {\n        return 0;\n    }\n    CFX_ByteString mode;\n    CPDF_Object* pObj = ((CPDF_Array*)m_pObj)->GetElementValue(1);\n    mode = pObj ? pObj->GetString() : CFX_ByteString();\n    int i = 0;\n    while (g_sZoomModes[i][0] != '\\0') {\n        if (mode == g_sZoomModes[i]) {\n            return i + 1;\n        }\n        i ++;\n    }\n    return 0;\n}\nFX_FLOAT CPDF_Dest::GetParam(int index)\n{\n    if (m_pObj == NULL || m_pObj->GetType() != PDFOBJ_ARRAY) {\n        return 0;\n    }\n    return ((CPDF_Array*)m_pObj)->GetNumber(2 + index);\n}\nCFX_ByteString CPDF_Dest::GetRemoteName()\n{\n    if (m_pObj == NULL) {\n        return CFX_ByteString();\n    }\n    return m_pObj->GetString();\n}\nCPDF_NameTree::CPDF_NameTree(CPDF_Document* pDoc, FX_BSTR category)\n{\n    if (pDoc->GetRoot() && pDoc->GetRoot()->GetDict(FX_BSTRC(\"Names\")))\n        m_pRoot = pDoc->GetRoot()->GetDict(FX_BSTRC(\"Names\"))->GetDict(category);\n    else\n        m_pRoot = NULL;\n}\nstatic CPDF_Object* SearchNameNode(CPDF_Dictionary* pNode, const CFX_ByteString& csName,\n                                   int& nIndex, CPDF_Array** ppFind, int nLevel = 0)\n{\n    if (nLevel > nMaxRecursion) {\n        return NULL;\n    }\n    CPDF_Array* pLimits = pNode->GetArray(FX_BSTRC(\"Limits\"));\n    if (pLimits != NULL) {\n        CFX_ByteString csLeft = pLimits->GetString(0);\n        CFX_ByteString csRight = pLimits->GetString(1);\n        if (csLeft.Compare(csRight) > 0) {\n            CFX_ByteString csTmp = csRight;\n            csRight = csLeft;\n            csLeft = csTmp;\n        }\n        if (csName.Compare(csLeft) < 0 || csName.Compare(csRight) > 0) {\n            return NULL;\n        }\n    }\n    CPDF_Array* pNames = pNode->GetArray(FX_BSTRC(\"Names\"));\n    if (pNames) {\n        FX_DWORD dwCount = pNames->GetCount() / 2;\n        for (FX_DWORD i = 0; i < dwCount; i ++) {\n            CFX_ByteString csValue = pNames->GetString(i * 2);\n            FX_INT32 iCompare = csValue.Compare(csName);\n            if (iCompare <= 0) {\n                if (ppFind != NULL) {\n                    *ppFind = pNames;\n                }\n                if (iCompare < 0) {\n                    continue;\n                }\n            } else {\n                break;\n            }\n            nIndex += i;\n            return pNames->GetElementValue(i * 2 + 1);\n        }\n        nIndex += dwCount;\n        return NULL;\n    }\n    CPDF_Array* pKids = pNode->GetArray(FX_BSTRC(\"Kids\"));\n    if (pKids == NULL) {\n        return NULL;\n    }\n    for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {\n        CPDF_Dictionary* pKid = pKids->GetDict(i);\n        if (pKid == NULL) {\n            continue;\n        }\n        CPDF_Object* pFound = SearchNameNode(pKid, csName, nIndex, ppFind, nLevel + 1);\n        if (pFound) {\n            return pFound;\n        }\n    }\n    return NULL;\n}\nstatic CPDF_Object* SearchNameNode(CPDF_Dictionary* pNode, int nIndex, int& nCurIndex,\n                                   CFX_ByteString& csName, CPDF_Array** ppFind, int nLevel = 0)\n{\n    if (nLevel > nMaxRecursion) {\n        return NULL;\n    }\n    CPDF_Array* pNames = pNode->GetArray(FX_BSTRC(\"Names\"));\n    if (pNames) {\n        int nCount = pNames->GetCount() / 2;\n        if (nIndex >= nCurIndex + nCount) {\n            nCurIndex += nCount;\n            return NULL;\n        } else {\n            if (ppFind != NULL) {\n                *ppFind = pNames;\n            }\n            csName = pNames->GetString((nIndex - nCurIndex) * 2);\n            return pNames->GetElementValue((nIndex - nCurIndex) * 2 + 1);\n        }\n    }\n    CPDF_Array* pKids = pNode->GetArray(FX_BSTRC(\"Kids\"));\n    if (pKids == NULL) {\n        return NULL;\n    }\n    for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {\n        CPDF_Dictionary* pKid = pKids->GetDict(i);\n        if (pKid == NULL) {\n            continue;\n        }\n        CPDF_Object* pFound = SearchNameNode(pKid, nIndex, nCurIndex, csName, ppFind, nLevel + 1);\n        if (pFound) {\n            return pFound;\n        }\n    }\n    return NULL;\n}\nstatic int CountNames(CPDF_Dictionary* pNode, int nLevel = 0)\n{\n    if (nLevel > nMaxRecursion) {\n        return 0;\n    }\n    CPDF_Array* pNames = pNode->GetArray(FX_BSTRC(\"Names\"));\n    if (pNames) {\n        return pNames->GetCount() / 2;\n    }\n    CPDF_Array* pKids = pNode->GetArray(FX_BSTRC(\"Kids\"));\n    if (pKids == NULL) {\n        return 0;\n    }\n    int nCount = 0;\n    for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {\n        CPDF_Dictionary* pKid = pKids->GetDict(i);\n        if (pKid == NULL) {\n            continue;\n        }\n        nCount += CountNames(pKid, nLevel + 1);\n    }\n    return nCount;\n}\nint CPDF_NameTree::GetCount() const\n{\n    if (m_pRoot == NULL) {\n        return 0;\n    }\n    return ::CountNames(m_pRoot);\n}\nint CPDF_NameTree::GetIndex(const CFX_ByteString& csName) const\n{\n    if (m_pRoot == NULL) {\n        return -1;\n    }\n    int nIndex = 0;\n    if (SearchNameNode(m_pRoot, csName, nIndex, NULL) == NULL) {\n        return -1;\n    }\n    return nIndex;\n}\nCPDF_Object* CPDF_NameTree::LookupValue(int nIndex, CFX_ByteString& csName) const\n{\n    if (m_pRoot == NULL) {\n        return NULL;\n    }\n    int nCurIndex = 0;\n    return SearchNameNode(m_pRoot, nIndex, nCurIndex, csName, NULL);\n}\nCPDF_Object* CPDF_NameTree::LookupValue(const CFX_ByteString& csName) const\n{\n    if (m_pRoot == NULL) {\n        return NULL;\n    }\n    int nIndex = 0;\n    return SearchNameNode(m_pRoot, csName, nIndex, NULL);\n}\nCPDF_Array*\tCPDF_NameTree::LookupNamedDest(CPDF_Document* pDoc, FX_BSTR sName)\n{\n    CPDF_Object* pValue = LookupValue(sName);\n    if (pValue == NULL) {\n        CPDF_Dictionary* pDests = pDoc->GetRoot()->GetDict(FX_BSTRC(\"Dests\"));\n        if (pDests == NULL) {\n            return NULL;\n        }\n        pValue = pDests->GetElementValue(sName);\n    }\n    if (pValue == NULL) {\n        return NULL;\n    }\n    if (pValue->GetType() == PDFOBJ_ARRAY) {\n        return (CPDF_Array*)pValue;\n    }\n    if (pValue->GetType() == PDFOBJ_DICTIONARY) {\n        return ((CPDF_Dictionary*)pValue)->GetArray(FX_BSTRC(\"D\"));\n    }\n    return NULL;\n}\nstatic CFX_WideString ChangeSlashToPlatform(FX_LPCWSTR str)\n{\n    CFX_WideString result;\n    while (*str) {\n        if (*str == '/') {\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n            result += ':';\n#elif _FXM_PLATFORM_  == _FXM_PLATFORM_WINDOWS_\n            result += '\\\\';\n#else\n            result += *str;\n#endif\n        } else {\n            result += *str;\n        }\n        str++;\n    }\n    return result;\n}\nstatic CFX_WideString FILESPEC_DecodeFileName(FX_WSTR filepath)\n{\n    if (filepath.GetLength() <= 1) {\n        return CFX_WideString();\n    }\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n    if (filepath.Left(sizeof(\"/Mac\") - 1) == CFX_WideStringC(L\"/Mac\")) {\n        return ChangeSlashToPlatform(filepath.GetPtr() + 1);\n    }\n    return ChangeSlashToPlatform(filepath.GetPtr());\n#elif _FXM_PLATFORM_  == _FXM_PLATFORM_WINDOWS_\n    if (filepath.GetAt(0) != '/') {\n        return ChangeSlashToPlatform(filepath.GetPtr());\n    }\n    if (filepath.GetAt(1) == '/') {\n        return ChangeSlashToPlatform(filepath.GetPtr() + 1);\n    }\n    if (filepath.GetAt(2) == '/') {\n        CFX_WideString result;\n        result += filepath.GetAt(1);\n        result += ':';\n        result += ChangeSlashToPlatform(filepath.GetPtr() + 2);\n        return result;\n    }\n    CFX_WideString result;\n    result += '\\\\';\n    result += ChangeSlashToPlatform(filepath.GetPtr());\n    return result;\n#else\n    return filepath;\n#endif\n}\nFX_BOOL CPDF_FileSpec::GetFileName(CFX_WideString &csFileName) const\n{\n    if (m_pObj == NULL) {\n        return FALSE;\n    }\n    if (m_pObj->GetType() == PDFOBJ_DICTIONARY) {\n        CPDF_Dictionary* pDict = (CPDF_Dictionary*)m_pObj;\n        csFileName = pDict->GetUnicodeText(FX_BSTRC(\"UF\"));\n        if (csFileName.IsEmpty()) {\n            csFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC(\"F\")));\n        }\n        if (pDict->GetString(FX_BSTRC(\"FS\")) == FX_BSTRC(\"URL\")) {\n            return TRUE;\n        }\n        if (csFileName.IsEmpty()) {\n            if (pDict->KeyExist(FX_BSTRC(\"DOS\"))) {\n                csFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC(\"DOS\")));\n            } else if (pDict->KeyExist(FX_BSTRC(\"Mac\"))) {\n                csFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC(\"Mac\")));\n            } else if (pDict->KeyExist(FX_BSTRC(\"Unix\"))) {\n                csFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC(\"Unix\")));\n            } else {\n                return FALSE;\n            }\n        }\n    } else {\n        csFileName = CFX_WideString::FromLocal(m_pObj->GetString());\n    }\n    csFileName = FILESPEC_DecodeFileName(csFileName);\n    return TRUE;\n}\nCPDF_FileSpec::CPDF_FileSpec()\n{\n    m_pObj = CPDF_Dictionary::Create();\n    if (m_pObj != NULL) {\n        ((CPDF_Dictionary*)m_pObj)->SetAtName(FX_BSTRC(\"Type\"), FX_BSTRC(\"Filespec\"));\n    }\n}\nFX_BOOL CPDF_FileSpec::IsURL() const\n{\n    if (m_pObj == NULL) {\n        return FALSE;\n    }\n    if (m_pObj->GetType() != PDFOBJ_DICTIONARY) {\n        return FALSE;\n    }\n    return ((CPDF_Dictionary*)m_pObj)->GetString(FX_BSTRC(\"FS\")) == FX_BSTRC(\"URL\");\n}\nstatic CFX_WideString ChangeSlashToPDF(FX_LPCWSTR str)\n{\n    CFX_WideString result;\n    while (*str) {\n        if (*str == '\\\\' || *str == ':') {\n            result += '/';\n        } else {\n            result += *str;\n        }\n        str++;\n    }\n    return result;\n}\nCFX_WideString FILESPEC_EncodeFileName(FX_WSTR filepath)\n{\n    if (filepath.GetLength() <= 1) {\n        return CFX_WideString();\n    }\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_WINDOWS_\n    if (filepath.GetAt(1) == ':') {\n        CFX_WideString result;\n        result = '/';\n        result += filepath.GetAt(0);\n        if (filepath.GetAt(2) != '\\\\') {\n            result += '/';\n        }\n        result += ChangeSlashToPDF(filepath.GetPtr() + 2);\n        return result;\n    }\n    if (filepath.GetAt(0) == '\\\\' && filepath.GetAt(1) == '\\\\') {\n        return ChangeSlashToPDF(filepath.GetPtr() + 1);\n    }\n    if (filepath.GetAt(0) == '\\\\') {\n        CFX_WideString result;\n        result = '/';\n        result += ChangeSlashToPDF(filepath.GetPtr());\n        return result;\n    }\n    return ChangeSlashToPDF(filepath.GetPtr());\n#elif _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n    if (filepath.Left(sizeof(\"Mac\") - 1) == FX_WSTRC(L\"Mac\")) {\n        CFX_WideString result;\n        result = '/';\n        result += ChangeSlashToPDF(filepath.GetPtr());\n        return result;\n    }\n    return ChangeSlashToPDF(filepath.GetPtr());\n#else\n    return filepath;\n#endif\n}\nCPDF_Stream* CPDF_FileSpec::GetFileStream() const\n{\n    if (m_pObj == NULL) {\n        return NULL;\n    }\n    FX_INT32 iType = m_pObj->GetType();\n    if (iType == PDFOBJ_STREAM) {\n        return (CPDF_Stream*)m_pObj;\n    } else if (iType == PDFOBJ_DICTIONARY) {\n        CPDF_Dictionary *pEF = ((CPDF_Dictionary*)m_pObj)->GetDict(FX_BSTRC(\"EF\"));\n        if (pEF == NULL) {\n            return NULL;\n        }\n        return pEF->GetStream(FX_BSTRC(\"F\"));\n    }\n    return NULL;\n}\nstatic void FPDFDOC_FILESPEC_SetFileName(CPDF_Object *pObj, FX_WSTR wsFileName, FX_BOOL bURL)\n{\n    ASSERT(pObj != NULL);\n    CFX_WideString wsStr;\n    if (bURL) {\n        wsStr = wsFileName;\n    } else {\n        wsStr = FILESPEC_EncodeFileName(wsFileName);\n    }\n    FX_INT32 iType = pObj->GetType();\n    if (iType == PDFOBJ_STRING) {\n        pObj->SetString(CFX_ByteString::FromUnicode(wsStr));\n    } else if (iType == PDFOBJ_DICTIONARY) {\n        CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;\n        pDict->SetAtString(FX_BSTRC(\"F\"), CFX_ByteString::FromUnicode(wsStr));\n        pDict->SetAtString(FX_BSTRC(\"UF\"), PDF_EncodeText(wsStr));\n    }\n}\nvoid CPDF_FileSpec::SetFileName(FX_WSTR wsFileName, FX_BOOL bURL)\n{\n    ASSERT(m_pObj != NULL);\n    if (m_pObj->GetType() == PDFOBJ_DICTIONARY && bURL) {\n        ((CPDF_Dictionary*)m_pObj)->SetAtName(FX_BSTRC(\"FS\"), \"URL\");\n    }\n    FPDFDOC_FILESPEC_SetFileName(m_pObj, wsFileName, bURL);\n}\nstatic CFX_WideString _MakeRoman(int num)\n{\n    const int arabic[] = {\n        1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1\n    };\n    const CFX_WideString roman[] = {\n        L\"m\", L\"cm\", L\"d\", L\"cd\", L\"c\", L\"xc\", L\"l\", L\"xl\", L\"x\", L\"ix\", L\"v\", L\"iv\", L\"i\"\n    };\n    const int nMaxNum = 1000000;\n    num %= nMaxNum;\n    int i = 0;\n    CFX_WideString wsRomanNumber;\n    while (num > 0) {\n        while (num >= arabic[i]) {\n            num = num - arabic[i];\n            wsRomanNumber += roman[i];\n        }\n        i = i + 1;\n    }\n    return wsRomanNumber;\n}\nstatic CFX_WideString _MakeLetters(int num)\n{\n    if (num == 0) {\n        return CFX_WideString();\n    }\n    CFX_WideString wsLetters;\n    const int nMaxCount = 1000;\n    const int nLetterCount = 26;\n    num -= 1;\n    int count = num / nLetterCount + 1;\n    count %= nMaxCount;\n    FX_WCHAR ch = L'a' + num % nLetterCount;\n    for (int i = 0; i < count; i++) {\n        wsLetters += ch;\n    }\n    return wsLetters;\n}\nstatic CFX_WideString _GetLabelNumPortion(int num, const CFX_ByteString& bsStyle)\n{\n    CFX_WideString wsNumPortion;\n    if\t\t(bsStyle.IsEmpty()) {\n        return wsNumPortion;\n    }\n    if (bsStyle == \"D\") {\n        wsNumPortion.Format((FX_LPCWSTR)L\"%d\", num);\n    } else if (bsStyle == \"R\") {\n        wsNumPortion = _MakeRoman(num);\n        wsNumPortion.MakeUpper();\n    } else if (bsStyle == \"r\") {\n        wsNumPortion = _MakeRoman(num);\n    } else if (bsStyle == \"A\") {\n        wsNumPortion = _MakeLetters(num);\n        wsNumPortion.MakeUpper();\n    } else if (bsStyle == \"a\") {\n        wsNumPortion = _MakeLetters(num);\n    }\n    return wsNumPortion;\n}\nCFX_WideString CPDF_PageLabel::GetLabel(int nPage) const\n{\n    CFX_WideString wsLabel;\n    if (m_pDocument == NULL) {\n        return wsLabel;\n    }\n    CPDF_Dictionary* pPDFRoot = m_pDocument->GetRoot();\n    if (pPDFRoot == NULL) {\n        return wsLabel;\n    }\n    CPDF_Dictionary* pLabels = pPDFRoot->GetDict(FX_BSTRC(\"PageLabels\"));\n    CPDF_NumberTree numberTree(pLabels);\n    CPDF_Object* pValue = NULL;\n    int n = nPage;\n    while (n >= 0) {\n        pValue = numberTree.LookupValue(n);\n        if (pValue != NULL) {\n            break;\n        }\n        n--;\n    }\n    if (pValue != NULL) {\n        pValue = pValue->GetDirect();\n        if (pValue->GetType() == PDFOBJ_DICTIONARY) {\n            CPDF_Dictionary* pLabel = (CPDF_Dictionary*)pValue;\n            if (pLabel->KeyExist(FX_BSTRC(\"P\"))) {\n                wsLabel += pLabel->GetUnicodeText(FX_BSTRC(\"P\"));\n            }\n            CFX_ByteString bsNumberingStyle = pLabel->GetString(FX_BSTRC(\"S\"), NULL);\n            int nLabelNum = nPage - n + pLabel->GetInteger(FX_BSTRC(\"St\"), 1);\n            CFX_WideString wsNumPortion = _GetLabelNumPortion(nLabelNum, bsNumberingStyle);\n            wsLabel += wsNumPortion;\n            return wsLabel;\n        }\n    }\n    wsLabel.Format((FX_LPCWSTR)L\"%d\", nPage + 1);\n    return wsLabel;\n}\nFX_INT32 CPDF_PageLabel::GetPageByLabel(FX_BSTR bsLabel) const\n{\n    if (m_pDocument == NULL) {\n        return -1;\n    }\n    CPDF_Dictionary* pPDFRoot = m_pDocument->GetRoot();\n    if (pPDFRoot == NULL) {\n        return -1;\n    }\n    int nPages = m_pDocument->GetPageCount();\n    CFX_ByteString bsLbl;\n    CFX_ByteString bsOrig = bsLabel;\n    for (int i = 0; i < nPages; i++) {\n        bsLbl = PDF_EncodeText(GetLabel(i));\n        if (!bsLbl.Compare(bsOrig)) {\n            return i;\n        }\n    }\n    bsLbl = bsOrig;\n    int nPage = FXSYS_atoi(bsLbl);\n    if (nPage > 0 && nPage <= nPages) {\n        return nPage;\n    }\n    return -1;\n}\nFX_INT32 CPDF_PageLabel::GetPageByLabel(FX_WSTR wsLabel) const\n{\n    CFX_ByteString bsLabel = PDF_EncodeText((CFX_WideString)wsLabel);\n    return GetPageByLabel(bsLabel);\n}\n"
  },
  {
    "path": "core/src/fpdfdoc/doc_bookmark.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fpdfdoc/fpdf_doc.h\"\nCPDF_Bookmark CPDF_BookmarkTree::GetFirstChild(CPDF_Bookmark Parent)\n{\n    if (Parent.m_pDict == NULL) {\n        CPDF_Dictionary* pRoot = m_pDocument->GetRoot()->GetDict(\"Outlines\");\n        if (pRoot == NULL) {\n            return NULL;\n        }\n        return pRoot->GetDict(\"First\");\n    }\n    return Parent.m_pDict->GetDict(\"First\");\n}\nCPDF_Bookmark CPDF_BookmarkTree::GetNextSibling(CPDF_Bookmark This)\n{\n    if (This.m_pDict == NULL) {\n        return NULL;\n    }\n    CPDF_Dictionary *pNext = This.m_pDict->GetDict(\"Next\");\n    return pNext == This.m_pDict ? NULL : pNext;\n}\nFX_DWORD CPDF_Bookmark::GetColorRef()\n{\n    if (!m_pDict) {\n        return 0;\n    }\n    CPDF_Array* pColor = m_pDict->GetArray(\"C\");\n    if (pColor == NULL) {\n        return FXSYS_RGB(0, 0, 0);\n    }\n    int r = FXSYS_round(pColor->GetNumber(0) * 255);\n    int g = FXSYS_round(pColor->GetNumber(1) * 255);\n    int b = FXSYS_round(pColor->GetNumber(2) * 255);\n    return FXSYS_RGB(r, g, b);\n}\nFX_DWORD CPDF_Bookmark::GetFontStyle()\n{\n    if (!m_pDict) {\n        return 0;\n    }\n    return m_pDict->GetInteger(\"F\");\n}\nCFX_WideString CPDF_Bookmark::GetTitle()\n{\n    if (!m_pDict) {\n        return CFX_WideString();\n    }\n    CPDF_String* pString = (CPDF_String*)m_pDict->GetElementValue(\"Title\");\n    if (pString == NULL || pString->GetType() != PDFOBJ_STRING) {\n        return CFX_WideString();\n    }\n    CFX_WideString title = pString->GetUnicodeText();\n    FX_LPWSTR buf = title.LockBuffer();\n    int len = title.GetLength(), i;\n    for (i = 0; i < len; i ++)\n        if (buf[i] < 0x20) {\n            buf[i] = 0x20;\n        }\n    title.ReleaseBuffer(len);\n    return title;\n}\nCPDF_Dest CPDF_Bookmark::GetDest(CPDF_Document* pDocument)\n{\n    if (!m_pDict) {\n        return NULL;\n    }\n    CPDF_Object* pDest = m_pDict->GetElementValue(\"Dest\");\n    if (pDest == NULL) {\n        return NULL;\n    }\n    if (pDest->GetType() == PDFOBJ_STRING || pDest->GetType() == PDFOBJ_NAME) {\n        CPDF_NameTree name_tree(pDocument, FX_BSTRC(\"Dests\"));\n        CFX_ByteStringC name = pDest->GetString();\n        return name_tree.LookupNamedDest(pDocument, name);\n    } else if (pDest->GetType() == PDFOBJ_ARRAY) {\n        return (CPDF_Array*)pDest;\n    }\n    return NULL;\n}\nCPDF_Action CPDF_Bookmark::GetAction()\n{\n    if (!m_pDict) {\n        return NULL;\n    }\n    return m_pDict->GetDict(\"A\");\n}\n"
  },
  {
    "path": "core/src/fpdfdoc/doc_form.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fpdfdoc/fpdf_doc.h\"\n#include \"../../include/fxcrt/fx_xml.h\"\nCFX_WideString\tGetFullName(CPDF_Dictionary* pFieldDict);\nvoid\t\t\tInitInterFormDict(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument);\nFX_DWORD\t\tCountInterFormFonts(CPDF_Dictionary* pFormDict);\nCPDF_Font*\t\tGetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_DWORD index, CFX_ByteString& csNameTag);\nCPDF_Font*\t\tGetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csNameTag);\nCPDF_Font*\t\tGetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CFX_ByteString& csNameTag);\nCPDF_Font*\t\tGetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag);\nCPDF_Font*\t\tGetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);\nFX_BOOL\t\t\tFindInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont, CFX_ByteString& csNameTag);\nFX_BOOL\t\t\tFindInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag);\nvoid\t\t\tAddInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont, CFX_ByteString& csNameTag);\nCPDF_Font*\t\tAddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag);\nCPDF_Font*\t\tAddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);\nvoid\t\t\tRemoveInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont);\nvoid\t\t\tRemoveInterFormFont(CPDF_Dictionary* pFormDict, CFX_ByteString csNameTag);\nCPDF_Font*\t\tGetDefaultInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument);\nvoid\t\t\tSetDefaultInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont);\nvoid\t\t\tSaveCheckedFieldStatus(CPDF_FormField* pField, CFX_ByteArray& statusArray);\nFX_BOOL\t\t\tNeedPDFEncodeForFieldFullName(const CFX_WideString& csFieldName);\nFX_BOOL\t\t\tNeedPDFEncodeForFieldTree(CPDF_Dictionary* pFieldDict, int nLevel = 0);\nvoid\t\t\tEncodeFieldName(const CFX_WideString& csName, CFX_ByteString& csT);\nvoid\t\t\tUpdateEncodeFieldName(CPDF_Dictionary* pFieldDict, int nLevel = 0);\nconst int nMaxRecursion = 32;\nclass _CFieldNameExtractor : public CFX_Object\n{\npublic:\n    _CFieldNameExtractor(const CFX_WideString& full_name)\n    {\n        m_pStart = full_name;\n        m_pEnd = m_pStart + full_name.GetLength();\n        m_pCur = m_pStart;\n    }\n    void GetNext(FX_LPCWSTR &pSubName, FX_STRSIZE& size)\n    {\n        pSubName = m_pCur;\n        while (m_pCur < m_pEnd && m_pCur[0] != L'.') {\n            m_pCur++;\n        }\n        size = (FX_STRSIZE)(m_pCur - pSubName);\n        if (m_pCur < m_pEnd && m_pCur[0] == L'.') {\n            m_pCur++;\n        }\n    }\nprotected:\n    FX_LPCWSTR m_pStart;\n    FX_LPCWSTR m_pEnd;\n    FX_LPCWSTR m_pCur;\n};\nclass CFieldTree : public CFX_Object\n{\npublic:\n    struct _Node : public CFX_Object {\n        _Node *parent;\n        CFX_PtrArray children;\n        CFX_WideString short_name;\n        CPDF_FormField *field_ptr;\n        int CountFields(int nLevel = 0)\n        {\n            if (nLevel > nMaxRecursion) {\n                return 0;\n            }\n            if (field_ptr) {\n                return 1;\n            }\n            int count = 0;\n            for (int i = 0; i < children.GetSize(); i ++) {\n                count += ((_Node *)children.GetAt(i))->CountFields(nLevel + 1);\n            }\n            return count;\n        }\n        CPDF_FormField* GetField(int* fields_to_go)\n        {\n            if (field_ptr) {\n                if (*fields_to_go == 0) {\n                    return field_ptr;\n                }\n                --*fields_to_go;\n                return NULL;\n            }\n            for (int i = 0; i < children.GetSize(); i++) {\n                _Node *pNode = (_Node *)children.GetAt(i);\n                CPDF_FormField* pField = pNode->GetField(fields_to_go);\n                if (pField) {\n                    return pField;\n                }\n            }\n            return NULL;\n        }\n        CPDF_FormField* GetField(int index)\n        {\n            int fields_to_go = index;\n            return GetField(&fields_to_go);\n        }\n    };\n    CFieldTree();\n    ~CFieldTree();\n    void SetField(const CFX_WideString &full_name, CPDF_FormField *field_ptr);\n    CPDF_FormField *GetField(const CFX_WideString &full_name);\n    CPDF_FormField *RemoveField(const CFX_WideString &full_name);\n    void RemoveAll();\n    _Node *FindNode(const CFX_WideString &full_name);\n    _Node * AddChild(_Node *pParent, const CFX_WideString &short_name, CPDF_FormField *field_ptr);\n    void RemoveNode(_Node *pNode, int nLevel = 0);\n    _Node *_Lookup(_Node *pParent, const CFX_WideString &short_name);\n    _Node m_Root;\n};\nCFieldTree::CFieldTree()\n{\n    m_Root.parent = NULL;\n    m_Root.field_ptr = NULL;\n}\nCFieldTree::~CFieldTree()\n{\n    RemoveAll();\n}\nCFieldTree::_Node *CFieldTree::AddChild(_Node *pParent, const CFX_WideString &short_name, CPDF_FormField *field_ptr)\n{\n    if (pParent == NULL) {\n        return NULL;\n    }\n    _Node *pNode = FX_NEW _Node;\n    if (pNode == NULL) {\n        return NULL;\n    }\n    pNode->parent = pParent;\n    pNode->short_name = short_name;\n    pNode->field_ptr = field_ptr;\n    pParent->children.Add(pNode);\n    return pNode;\n}\nvoid CFieldTree::RemoveNode(_Node *pNode, int nLevel)\n{\n    if (pNode == NULL) {\n        return ;\n    }\n    if (nLevel > nMaxRecursion) {\n        delete pNode;\n        return ;\n    }\n    CFX_PtrArray& ptr_array = pNode->children;\n    for (int i = 0; i < ptr_array.GetSize(); i ++) {\n        _Node *pChild = (_Node *)ptr_array[i];\n        RemoveNode(pChild, nLevel + 1);\n    }\n    delete pNode;\n}\nCFieldTree::_Node *CFieldTree::_Lookup(_Node *pParent, const CFX_WideString &short_name)\n{\n    if (pParent == NULL) {\n        return NULL;\n    }\n    CFX_PtrArray& ptr_array = pParent->children;\n    for (int i = 0; i < ptr_array.GetSize(); i ++) {\n        _Node *pNode = (_Node *)ptr_array[i];\n        if (pNode->short_name.GetLength() == short_name.GetLength() &&\n                FXSYS_memcmp32((FX_LPCWSTR)pNode->short_name, (FX_LPCWSTR)short_name, short_name.GetLength()*sizeof(FX_WCHAR)) == 0) {\n            return pNode;\n        }\n    }\n    return NULL;\n}\nvoid CFieldTree::RemoveAll()\n{\n    CFX_PtrArray& ptr_array = m_Root.children;\n    for (int i = 0; i < ptr_array.GetSize(); i ++) {\n        _Node *pNode = (_Node *)ptr_array[i];\n        RemoveNode(pNode);\n    }\n}\nvoid CFieldTree::SetField(const CFX_WideString &full_name, CPDF_FormField *field_ptr)\n{\n    if (full_name == L\"\") {\n        return;\n    }\n    _CFieldNameExtractor name_extractor(full_name);\n    FX_LPCWSTR pName;\n    FX_STRSIZE nLength;\n    name_extractor.GetNext(pName, nLength);\n    _Node *pNode = &m_Root, *pLast = NULL;\n    while (nLength > 0) {\n        pLast = pNode;\n        CFX_WideString name = CFX_WideString(pName, nLength);\n        pNode = _Lookup(pLast, name);\n        if (pNode == NULL) {\n            pNode = AddChild(pLast, name, NULL);\n        }\n        name_extractor.GetNext(pName, nLength);\n    }\n    if (pNode != &m_Root) {\n        pNode->field_ptr = field_ptr;\n    }\n}\nCPDF_FormField *CFieldTree::GetField(const CFX_WideString &full_name)\n{\n    if (full_name == L\"\") {\n        return NULL;\n    }\n    _CFieldNameExtractor name_extractor(full_name);\n    FX_LPCWSTR pName;\n    FX_STRSIZE nLength;\n    name_extractor.GetNext(pName, nLength);\n    _Node *pNode = &m_Root, *pLast = NULL;\n    while (nLength > 0 && pNode) {\n        pLast = pNode;\n        CFX_WideString name = CFX_WideString(pName, nLength);\n        pNode = _Lookup(pLast, name);\n        name_extractor.GetNext(pName, nLength);\n    }\n    return pNode ? pNode->field_ptr : NULL;\n}\nCPDF_FormField *CFieldTree::RemoveField(const CFX_WideString & full_name)\n{\n    if (full_name == L\"\") {\n        return NULL;\n    }\n    _CFieldNameExtractor name_extractor(full_name);\n    FX_LPCWSTR pName;\n    FX_STRSIZE nLength;\n    name_extractor.GetNext(pName, nLength);\n    _Node *pNode = &m_Root, *pLast = NULL;\n    while (nLength > 0 && pNode) {\n        pLast = pNode;\n        CFX_WideString name = CFX_WideString(pName, nLength);\n        pNode = _Lookup(pLast, name);\n        name_extractor.GetNext(pName, nLength);\n    }\n    if (pNode && pNode != &m_Root) {\n        CFX_PtrArray& ptr_array = pLast->children;\n        for (int i = 0; i < ptr_array.GetSize(); i ++) {\n            if (pNode == (_Node *)ptr_array[i]) {\n                ptr_array.RemoveAt(i);\n                break;\n            }\n        }\n        CPDF_FormField *pField = pNode->field_ptr;\n        RemoveNode(pNode);\n        return pField;\n    }\n    return NULL;\n}\nCFieldTree::_Node *CFieldTree::FindNode(const CFX_WideString& full_name)\n{\n    if (full_name == L\"\") {\n        return NULL;\n    }\n    _CFieldNameExtractor name_extractor(full_name);\n    FX_LPCWSTR pName;\n    FX_STRSIZE nLength;\n    name_extractor.GetNext(pName, nLength);\n    _Node *pNode = &m_Root, *pLast = NULL;\n    while (nLength > 0 && pNode) {\n        pLast = pNode;\n        CFX_WideString name = CFX_WideString(pName, nLength);\n        pNode = _Lookup(pLast, name);\n        name_extractor.GetNext(pName, nLength);\n    }\n    return pNode;\n}\nCPDF_InterForm::CPDF_InterForm(CPDF_Document* pDocument, FX_BOOL bGenerateAP) : CFX_PrivateData()\n{\n    m_pDocument = pDocument;\n    m_bGenerateAP = bGenerateAP;\n    m_pFormNotify = NULL;\n    m_bUpdated = FALSE;\n    m_pFieldTree = FX_NEW CFieldTree;\n    CPDF_Dictionary* pRoot = m_pDocument->GetRoot();\n    m_pFormDict = pRoot->GetDict(\"AcroForm\");\n    if (m_pFormDict == NULL) {\n        return;\n    }\n    CPDF_Array* pFields = m_pFormDict->GetArray(\"Fields\");\n    if (pFields == NULL) {\n        return;\n    }\n    int count = pFields->GetCount();\n    for (int i = 0; i < count; i ++) {\n        LoadField(pFields->GetDict(i));\n    }\n}\nCPDF_InterForm::~CPDF_InterForm()\n{\n    FX_POSITION pos = m_ControlMap.GetStartPosition();\n    while (pos) {\n        FX_LPVOID key, value;\n        m_ControlMap.GetNextAssoc(pos, key, value);\n        delete (CPDF_FormControl*)value;\n    }\n    if (m_pFieldTree != NULL) {\n        int nCount = m_pFieldTree->m_Root.CountFields();\n        for (int i = 0; i < nCount; i++) {\n            CPDF_FormField *pField = m_pFieldTree->m_Root.GetField(i);\n            delete pField;\n        }\n        delete m_pFieldTree;\n    }\n}\nFX_BOOL\tCPDF_InterForm::m_bUpdateAP = TRUE;\nFX_BOOL CPDF_InterForm::UpdatingAPEnabled()\n{\n    return m_bUpdateAP;\n}\nvoid CPDF_InterForm::EnableUpdateAP(FX_BOOL bUpdateAP)\n{\n    m_bUpdateAP = bUpdateAP;\n}\nCFX_ByteString CPDF_InterForm::GenerateNewResourceName(const CPDF_Dictionary* pResDict, FX_LPCSTR csType, int iMinLen, FX_LPCSTR csPrefix)\n{\n    CFX_ByteString csStr = csPrefix;\n    CFX_ByteString csBType = csType;\n    if (csStr.IsEmpty()) {\n        if (csBType == \"ExtGState\") {\n            csStr = \"GS\";\n        } else if (csBType == \"ColorSpace\") {\n            csStr = \"CS\";\n        } else if (csBType == \"Font\") {\n            csStr = \"ZiTi\";\n        } else {\n            csStr = \"Res\";\n        }\n    }\n    CFX_ByteString csTmp = csStr;\n    int iCount = csStr.GetLength();\n    int m = 0;\n    if (iMinLen > 0) {\n        csTmp = \"\";\n        while (m < iMinLen && m < iCount) {\n            csTmp += csStr[m ++];\n        }\n        while (m < iMinLen) {\n            csTmp += '0' + m % 10;\n            m ++;\n        }\n    } else {\n        m = iCount;\n    }\n    if (pResDict == NULL) {\n        return csTmp;\n    }\n    CPDF_Dictionary* pDict = pResDict->GetDict(csType);\n    if (pDict == NULL) {\n        return csTmp;\n    }\n    int num = 0;\n    CFX_ByteString bsNum;\n    while (TRUE) {\n        if (!pDict->KeyExist(csTmp + bsNum)) {\n            return csTmp + bsNum;\n        }\n        if (m < iCount) {\n            csTmp += csStr[m ++];\n        } else {\n            bsNum.Format(\"%d\", num++);\n        }\n        m ++;\n    }\n    return csTmp;\n}\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\ntypedef struct _PDF_FONTDATA {\n    FX_BOOL\t\tbFind;\n    LOGFONTA\tlf;\n} PDF_FONTDATA, FAR* LPDF_FONTDATA;\nstatic int CALLBACK EnumFontFamExProc(\tENUMLOGFONTEXA *lpelfe,\n                                        NEWTEXTMETRICEX *lpntme,\n                                        DWORD FontType,\n                                        LPARAM lParam\n                                     )\n{\n    if (FontType != 0x004 || strchr(lpelfe->elfLogFont.lfFaceName, '@') != NULL) {\n        return 1;\n    } else {\n        LPDF_FONTDATA pData = (LPDF_FONTDATA)lParam;\n        memcpy(&pData->lf, &lpelfe->elfLogFont, sizeof(LOGFONTA));\n        pData->bFind = TRUE;\n        return 0;\n    }\n}\nstatic FX_BOOL RetrieveSpecificFont(LOGFONTA& lf)\n{\n    PDF_FONTDATA fd;\n    memset(&fd, 0, sizeof(PDF_FONTDATA));\n    HDC hDC = ::GetDC(NULL);\n    EnumFontFamiliesExA(hDC, &lf, (FONTENUMPROCA)EnumFontFamExProc, (LPARAM)&fd, 0);\n    ::ReleaseDC(NULL, hDC);\n    if (fd.bFind) {\n        memcpy(&lf, &fd.lf, sizeof(LOGFONTA));\n    }\n    return fd.bFind;\n}\nstatic FX_BOOL RetrieveSpecificFont(FX_BYTE charSet, FX_BYTE pitchAndFamily, LPCSTR pcsFontName, LOGFONTA& lf)\n{\n    memset(&lf, 0, sizeof(LOGFONTA));\n    lf.lfCharSet = charSet;\n    lf.lfPitchAndFamily = pitchAndFamily;\n    if (pcsFontName != NULL) {\n        strcpy(lf.lfFaceName, pcsFontName);\n    }\n    return RetrieveSpecificFont(lf);\n}\nstatic FX_BOOL RetrieveStockFont(int iFontObject, FX_BYTE charSet, LOGFONTA& lf)\n{\n    HFONT hFont = (HFONT)::GetStockObject(iFontObject);\n    if (hFont != NULL) {\n        memset(&lf, 0, sizeof(LOGFONTA));\n        int iRet = ::GetObject(hFont, sizeof(LOGFONTA), &lf);\n        if (iRet > 0 && (lf.lfCharSet == charSet || charSet == 255)) {\n            return RetrieveSpecificFont(lf);\n        }\n    }\n    return FALSE;\n}\n#endif\nCPDF_Font* CPDF_InterForm::AddSystemDefaultFont(const CPDF_Document* pDocument)\n{\n    if (pDocument == NULL) {\n        return NULL;\n    }\n    CPDF_Font* pFont = NULL;\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\n    LOGFONTA lf;\n    FX_BOOL bRet;\n    bRet = RetrieveStockFont(DEFAULT_GUI_FONT, 255, lf);\n    if (!bRet) {\n        bRet = RetrieveStockFont(SYSTEM_FONT, 255, lf);\n    }\n    if (bRet) {\n        pFont = ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);\n    }\n#endif\n    return pFont;\n}\nCPDF_Font* CPDF_InterForm::AddSystemFont(const CPDF_Document* pDocument, CFX_ByteString csFontName, FX_BYTE iCharSet)\n{\n    if (pDocument == NULL || csFontName.IsEmpty()) {\n        return NULL;\n    }\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\n    if (iCharSet == 1) {\n        iCharSet = GetNativeCharSet();\n    }\n    HFONT hFont = ::CreateFontA(0, 0, 0, 0, 0, 0, 0, 0, iCharSet, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, (FX_LPCSTR)csFontName);\n    if (hFont != NULL) {\n        LOGFONTA lf;\n        memset(&lf, 0, sizeof(LOGFONTA));\n        ::GetObjectA(hFont, sizeof(LOGFONTA), &lf);\n        ::DeleteObject(hFont);\n        if (strlen(lf.lfFaceName) > 0) {\n            return ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);\n        }\n    }\n#endif\n    return NULL;\n}\nCPDF_Font* CPDF_InterForm::AddSystemFont(const CPDF_Document* pDocument, CFX_WideString csFontName, FX_BYTE iCharSet)\n{\n    if (pDocument == NULL || csFontName.IsEmpty()) {\n        return NULL;\n    }\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\n    if (iCharSet == 1) {\n        iCharSet = GetNativeCharSet();\n    }\n    HFONT hFont = ::CreateFontW(0, 0, 0, 0, 0, 0, 0, 0, iCharSet, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, csFontName);\n    if (hFont != NULL) {\n        LOGFONTA lf;\n        memset(&lf, 0, sizeof(LOGFONTA));\n        ::GetObject(hFont, sizeof(LOGFONTA), &lf);\n        ::DeleteObject(hFont);\n        if (strlen(lf.lfFaceName) > 0) {\n            return ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);\n        }\n    }\n#endif\n    return NULL;\n}\nCPDF_Font* CPDF_InterForm::AddStandardFont(const CPDF_Document* pDocument, CFX_ByteString csFontName)\n{\n    if (pDocument == NULL || csFontName.IsEmpty()) {\n        return NULL;\n    }\n    CPDF_Font* pFont = NULL;\n    if (csFontName == \"ZapfDingbats\") {\n        pFont = ((CPDF_Document*)pDocument)->AddStandardFont(csFontName, NULL);\n    } else {\n        CPDF_FontEncoding encoding(PDFFONT_ENCODING_WINANSI);\n        pFont = ((CPDF_Document*)pDocument)->AddStandardFont(csFontName, &encoding);\n    }\n    return pFont;\n}\nCFX_ByteString CPDF_InterForm::GetNativeFont(FX_BYTE charSet, FX_LPVOID pLogFont)\n{\n    CFX_ByteString csFontName;\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\n    LOGFONTA lf;\n    FX_BOOL bRet;\n    if (charSet == ANSI_CHARSET) {\n        csFontName = \"Helvetica\";\n        return csFontName;\n    }\n    bRet = FALSE;\n    if (charSet == SHIFTJIS_CHARSET) {\n        bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, \"MS Mincho\", lf);\n    } else if (charSet == GB2312_CHARSET) {\n        bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, \"SimSun\", lf);\n    } else if (charSet == CHINESEBIG5_CHARSET) {\n        bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, \"MingLiU\", lf);\n    }\n    if (!bRet) {\n        bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, \"Arial Unicode MS\", lf);\n    }\n    if (!bRet) {\n        bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, \"Microsoft Sans Serif\", lf);\n    }\n    if (!bRet) {\n        bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, NULL, lf);\n    }\n    if (bRet) {\n        if (pLogFont != NULL) {\n            memcpy(pLogFont, &lf, sizeof(LOGFONTA));\n        }\n        csFontName = lf.lfFaceName;\n        return csFontName;\n    }\n#endif\n    return csFontName;\n}\nCFX_ByteString CPDF_InterForm::GetNativeFont(FX_LPVOID pLogFont)\n{\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\n    FX_BYTE charSet = GetNativeCharSet();\n    return GetNativeFont(charSet, pLogFont);\n#else\n    return CFX_ByteString();\n#endif\n}\nFX_BYTE CPDF_InterForm::GetNativeCharSet()\n{\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\n    FX_BYTE charSet = ANSI_CHARSET;\n    UINT iCodePage = ::GetACP();\n    switch (iCodePage) {\n        case 932:\n            charSet = SHIFTJIS_CHARSET;\n            break;\n        case 936:\n            charSet = GB2312_CHARSET;\n            break;\n        case 950:\n            charSet = CHINESEBIG5_CHARSET;\n            break;\n        case 1252:\n            charSet = ANSI_CHARSET;\n            break;\n        case 874:\n            charSet = THAI_CHARSET;\n            break;\n        case 949:\n            charSet = HANGUL_CHARSET;\n            break;\n        case 1200:\n            charSet = ANSI_CHARSET;\n            break;\n        case 1250:\n            charSet = EASTEUROPE_CHARSET;\n            break;\n        case 1251:\n            charSet = RUSSIAN_CHARSET;\n            break;\n        case 1253:\n            charSet = GREEK_CHARSET;\n            break;\n        case 1254:\n            charSet = TURKISH_CHARSET;\n            break;\n        case 1255:\n            charSet = HEBREW_CHARSET;\n            break;\n        case 1256:\n            charSet = ARABIC_CHARSET;\n            break;\n        case 1257:\n            charSet = BALTIC_CHARSET;\n            break;\n        case 1258:\n            charSet = VIETNAMESE_CHARSET;\n            break;\n        case 1361:\n            charSet = JOHAB_CHARSET;\n            break;\n    }\n    return charSet;\n#else\n    return 0;\n#endif\n}\nCPDF_Font* CPDF_InterForm::AddNativeFont(FX_BYTE charSet, const CPDF_Document* pDocument)\n{\n    if (pDocument == NULL) {\n        return NULL;\n    }\n    CPDF_Font* pFont = NULL;\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\n    LOGFONTA lf;\n    CFX_ByteString csFontName = GetNativeFont(charSet, &lf);\n    if (!csFontName.IsEmpty()) {\n        if (csFontName == \"Helvetica\") {\n            pFont = AddStandardFont(pDocument, csFontName);\n        } else {\n            pFont = ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);\n        }\n    }\n#endif\n    return pFont;\n}\nCPDF_Font* CPDF_InterForm::AddNativeFont(const CPDF_Document* pDocument)\n{\n    if (pDocument == NULL) {\n        return NULL;\n    }\n    CPDF_Font* pFont = NULL;\n    FX_BYTE charSet = GetNativeCharSet();\n    pFont = AddNativeFont(charSet, pDocument);\n    return pFont;\n}\nFX_BOOL CPDF_InterForm::ValidateFieldName(CFX_WideString& csNewFieldName, int iType, const CPDF_FormField* pExcludedField, const CPDF_FormControl* pExcludedControl)\n{\n    if (csNewFieldName.IsEmpty()) {\n        return FALSE;\n    }\n    int iPos = 0;\n    int iLength = csNewFieldName.GetLength();\n    CFX_WideString csSub;\n    while (TRUE) {\n        while (iPos < iLength && (csNewFieldName[iPos] == L'.' || csNewFieldName[iPos] == L' ')) {\n            iPos ++;\n        }\n        if (iPos < iLength && !csSub.IsEmpty()) {\n            csSub += L'.';\n        }\n        while (iPos < iLength && csNewFieldName[iPos] != L'.') {\n            csSub += csNewFieldName[iPos ++];\n        }\n        for (int i = csSub.GetLength() - 1; i > -1; i --) {\n            if (csSub[i] == L' ' || csSub[i] == L'.') {\n                csSub.SetAt(i, L'\\0');\n            } else {\n                break;\n            }\n        }\n        FX_DWORD dwCount = m_pFieldTree->m_Root.CountFields();\n        for (FX_DWORD m = 0; m < dwCount; m ++) {\n            CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(m);\n            if (pField == NULL) {\n                continue;\n            }\n            if (pField == pExcludedField) {\n                if (pExcludedControl != NULL) {\n                    if (pField->CountControls() < 2) {\n                        continue;\n                    }\n                } else {\n                    continue;\n                }\n            }\n            CFX_WideString csFullName = pField->GetFullName();\n            int iRet = CompareFieldName(csSub, csFullName);\n            if (iRet == 1) {\n                if (pField->GetFieldType() != iType) {\n                    return FALSE;\n                }\n            } else if (iRet == 2 && csSub == csNewFieldName) {\n                if (csFullName[iPos] == L'.') {\n                    return FALSE;\n                }\n            } else if (iRet == 3 && csSub == csNewFieldName) {\n                if (csNewFieldName[csFullName.GetLength()] == L'.') {\n                    return FALSE;\n                }\n            }\n        }\n        if (iPos >= iLength) {\n            break;\n        }\n    }\n    if (csSub.IsEmpty()) {\n        return FALSE;\n    }\n    csNewFieldName = csSub;\n    return TRUE;\n}\nFX_BOOL CPDF_InterForm::ValidateFieldName(CFX_WideString& csNewFieldName, int iType)\n{\n    return ValidateFieldName(csNewFieldName, iType, NULL, NULL);\n}\nFX_BOOL CPDF_InterForm::ValidateFieldName(const CPDF_FormField* pField, CFX_WideString& csNewFieldName)\n{\n    if (pField == NULL || csNewFieldName.IsEmpty()) {\n        return FALSE;\n    }\n    return ValidateFieldName(csNewFieldName, ((CPDF_FormField*)pField)->GetFieldType(), pField, NULL);\n}\nFX_BOOL CPDF_InterForm::ValidateFieldName(const CPDF_FormControl* pControl, CFX_WideString& csNewFieldName)\n{\n    if (pControl == NULL || csNewFieldName.IsEmpty()) {\n        return FALSE;\n    }\n    CPDF_FormField* pField = ((CPDF_FormControl*)pControl)->GetField();\n    return ValidateFieldName(csNewFieldName, pField->GetFieldType(), pField, pControl);\n}\nint CPDF_InterForm::CompareFieldName(const CFX_ByteString& name1, const CFX_ByteString& name2)\n{\n    FX_LPCSTR ptr1 = name1, ptr2 = name2;\n    if (name1.GetLength() != name2.GetLength()) {\n        int i = 0;\n        while (ptr1[i] == ptr2[i]) {\n            i ++;\n        }\n        if (i == name1.GetLength()) {\n            return 2;\n        }\n        if (i == name2.GetLength()) {\n            return 3;\n        }\n        return 0;\n    } else {\n        return name1 == name2 ? 1 : 0;\n    }\n}\nint CPDF_InterForm::CompareFieldName(const CFX_WideString& name1, const CFX_WideString& name2)\n{\n    FX_LPCWSTR ptr1 = name1, ptr2 = name2;\n    if (name1.GetLength() != name2.GetLength()) {\n        int i = 0;\n        while (ptr1[i] == ptr2[i]) {\n            i ++;\n        }\n        if (i == name1.GetLength()) {\n            return 2;\n        }\n        if (i == name2.GetLength()) {\n            return 3;\n        }\n        return 0;\n    } else {\n        return name1 == name2 ? 1 : 0;\n    }\n}\nFX_DWORD CPDF_InterForm::CountFields(const CFX_WideString &csFieldName)\n{\n    if (csFieldName.IsEmpty()) {\n        return (FX_DWORD)m_pFieldTree->m_Root.CountFields();\n    }\n    CFieldTree::_Node *pNode = m_pFieldTree->FindNode(csFieldName);\n    if (pNode == NULL) {\n        return 0;\n    }\n    return pNode->CountFields();\n}\nCPDF_FormField* CPDF_InterForm::GetField(FX_DWORD index, const CFX_WideString &csFieldName)\n{\n    if (csFieldName == L\"\") {\n        return m_pFieldTree->m_Root.GetField(index);\n    }\n    CFieldTree::_Node *pNode = m_pFieldTree->FindNode(csFieldName);\n    if (pNode == NULL) {\n        return NULL;\n    }\n    return pNode->GetField(index);\n}\nvoid CPDF_InterForm::GetAllFieldNames(CFX_WideStringArray& allFieldNames)\n{\n    allFieldNames.RemoveAll();\n    int nCount = m_pFieldTree->m_Root.CountFields();\n    for (int i = 0; i < nCount; i ++) {\n        CPDF_FormField *pField = m_pFieldTree->m_Root.GetField(i);\n        if (pField) {\n            CFX_WideString full_name = GetFullName(pField->GetFieldDict());\n            allFieldNames.Add(full_name);\n        }\n    }\n}\nFX_BOOL CPDF_InterForm::IsValidFormField(const void* pField)\n{\n    if (pField == NULL) {\n        return FALSE;\n    }\n    int nCount = m_pFieldTree->m_Root.CountFields();\n    for (int i = 0; i < nCount; i++) {\n        CPDF_FormField *pFormField = m_pFieldTree->m_Root.GetField(i);\n        if (pField == pFormField) {\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nCPDF_FormField* CPDF_InterForm::GetFieldByDict(CPDF_Dictionary* pFieldDict) const\n{\n    if (pFieldDict == NULL) {\n        return NULL;\n    }\n    CFX_WideString csWName = GetFullName(pFieldDict);\n    return m_pFieldTree->GetField(csWName);\n}\nFX_DWORD CPDF_InterForm::CountControls(CFX_WideString csFieldName)\n{\n    if (csFieldName.IsEmpty()) {\n        return (FX_DWORD)m_ControlMap.GetCount();\n    }\n    CPDF_FormField *pField = m_pFieldTree->GetField(csFieldName);\n    if (pField == NULL) {\n        return 0;\n    }\n    return pField->m_ControlList.GetSize();\n}\nCPDF_FormControl* CPDF_InterForm::GetControl(FX_DWORD index, CFX_WideString csFieldName)\n{\n    CPDF_FormField *pField = m_pFieldTree->GetField(csFieldName);\n    if (pField == NULL) {\n        return NULL;\n    }\n    if (index < (FX_DWORD)pField->m_ControlList.GetSize()) {\n        return (CPDF_FormControl *)pField->m_ControlList.GetAt(index);\n    }\n    return NULL;\n}\nFX_BOOL CPDF_InterForm::IsValidFormControl(const void* pControl)\n{\n    if (pControl == NULL) {\n        return FALSE;\n    }\n    FX_POSITION pos = m_ControlMap.GetStartPosition();\n    while (pos) {\n        CPDF_Dictionary* pWidgetDict = NULL;\n        void* pFormControl = NULL;\n        m_ControlMap.GetNextAssoc(pos, (FX_LPVOID&)pWidgetDict, pFormControl);\n        if (pControl == pFormControl) {\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nint CPDF_InterForm::CountPageControls(CPDF_Page* pPage) const\n{\n    CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray(\"Annots\");\n    if (pAnnotList == NULL) {\n        return 0;\n    }\n    int count = 0;\n    for (FX_DWORD i = 0; i < pAnnotList->GetCount(); i ++) {\n        CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i);\n        if (pAnnot == NULL) {\n            continue;\n        }\n        CPDF_FormControl* pControl;\n        if (!m_ControlMap.Lookup(pAnnot, (FX_LPVOID&)pControl)) {\n            continue;\n        }\n        count ++;\n    }\n    return count;\n}\nCPDF_FormControl* CPDF_InterForm::GetPageControl(CPDF_Page* pPage, int index) const\n{\n    CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray(\"Annots\");\n    if (pAnnotList == NULL) {\n        return NULL;\n    }\n    int count = 0;\n    for (FX_DWORD i = 0; i < pAnnotList->GetCount(); i ++) {\n        CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i);\n        if (pAnnot == NULL) {\n            continue;\n        }\n        CPDF_FormControl* pControl;\n        if (!m_ControlMap.Lookup(pAnnot, (FX_LPVOID&)pControl)) {\n            continue;\n        }\n        if (index == count) {\n            return pControl;\n        }\n        count ++;\n    }\n    return NULL;\n}\nCPDF_FormControl* CPDF_InterForm::GetControlAtPoint(CPDF_Page* pPage, FX_FLOAT pdf_x, FX_FLOAT pdf_y) const\n{\n    CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray(\"Annots\");\n    if (pAnnotList == NULL) {\n        return NULL;\n    }\n    for (FX_DWORD i = pAnnotList->GetCount(); i > 0; i --) {\n        CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i - 1);\n        if (pAnnot == NULL) {\n            continue;\n        }\n        CPDF_FormControl* pControl;\n        if (!m_ControlMap.Lookup(pAnnot, (FX_LPVOID&)pControl)) {\n            continue;\n        }\n        CFX_FloatRect rect = pControl->GetRect();\n        if (rect.Contains(pdf_x, pdf_y)) {\n            return pControl;\n        }\n    }\n    return NULL;\n}\nCPDF_FormControl* CPDF_InterForm::GetControlByDict(CPDF_Dictionary* pWidgetDict) const\n{\n    CPDF_FormControl* pControl = NULL;\n    m_ControlMap.Lookup(pWidgetDict, (FX_LPVOID&)pControl);\n    return pControl;\n}\nFX_DWORD CPDF_InterForm::CountInternalFields(const CFX_WideString& csFieldName) const\n{\n    if (m_pFormDict == NULL) {\n        return 0;\n    }\n    CPDF_Array* pArray = m_pFormDict->GetArray(\"Fields\");\n    if (pArray == NULL) {\n        return 0;\n    }\n    if (csFieldName.IsEmpty()) {\n        return pArray->GetCount();\n    } else {\n        int iLength = csFieldName.GetLength();\n        int iPos = 0;\n        CPDF_Dictionary* pDict = NULL;\n        while (pArray != NULL) {\n            CFX_WideString csSub;\n            if (iPos < iLength && csFieldName[iPos] == L'.') {\n                iPos ++;\n            }\n            while (iPos < iLength && csFieldName[iPos] != L'.') {\n                csSub += csFieldName[iPos ++];\n            }\n            int iCount = pArray->GetCount();\n            FX_BOOL bFind = FALSE;\n            for (int i = 0; i < iCount; i ++) {\n                pDict = pArray->GetDict(i);\n                if (pDict == NULL) {\n                    continue;\n                }\n                CFX_WideString csT = pDict->GetUnicodeText(\"T\");\n                if (csT == csSub) {\n                    bFind = TRUE;\n                    break;\n                }\n            }\n            if (!bFind) {\n                return 0;\n            }\n            if (iPos >= iLength) {\n                break;\n            }\n            pArray = pDict->GetArray(\"Kids\");\n        }\n        if (pDict == NULL) {\n            return 0;\n        } else {\n            pArray = pDict->GetArray(\"Kids\");\n            if (pArray == NULL) {\n                return 1;\n            } else {\n                return pArray->GetCount();\n            }\n        }\n    }\n}\nCPDF_Dictionary* CPDF_InterForm::GetInternalField(FX_DWORD index, const CFX_WideString& csFieldName) const\n{\n    if (m_pFormDict == NULL) {\n        return NULL;\n    }\n    CPDF_Array* pArray = m_pFormDict->GetArray(\"Fields\");\n    if (pArray == NULL) {\n        return 0;\n    }\n    if (csFieldName.IsEmpty()) {\n        return pArray->GetDict(index);\n    } else {\n        int iLength = csFieldName.GetLength();\n        int iPos = 0;\n        CPDF_Dictionary* pDict = NULL;\n        while (pArray != NULL) {\n            CFX_WideString csSub;\n            if (iPos < iLength && csFieldName[iPos] == L'.') {\n                iPos ++;\n            }\n            while (iPos < iLength && csFieldName[iPos] != L'.') {\n                csSub += csFieldName[iPos ++];\n            }\n            int iCount = pArray->GetCount();\n            FX_BOOL bFind = FALSE;\n            for (int i = 0; i < iCount; i ++) {\n                pDict = pArray->GetDict(i);\n                if (pDict == NULL) {\n                    continue;\n                }\n                CFX_WideString csT = pDict->GetUnicodeText(\"T\");\n                if (csT == csSub) {\n                    bFind = TRUE;\n                    break;\n                }\n            }\n            if (!bFind) {\n                return NULL;\n            }\n            if (iPos >= iLength) {\n                break;\n            }\n            pArray = pDict->GetArray(\"Kids\");\n        }\n        if (pDict == NULL) {\n            return NULL;\n        } else {\n            pArray = pDict->GetArray(\"Kids\");\n            if (pArray == NULL) {\n                return pDict;\n            } else {\n                return pArray->GetDict(index);\n            }\n        }\n    }\n}\nFX_BOOL CPDF_InterForm::NeedConstructAP()\n{\n    if (m_pFormDict == NULL) {\n        return FALSE;\n    }\n    return m_pFormDict->GetBoolean(\"NeedAppearances\");\n}\nvoid CPDF_InterForm::NeedConstructAP(FX_BOOL bNeedAP)\n{\n    if (m_pFormDict == NULL) {\n        InitInterFormDict(m_pFormDict, m_pDocument);\n    }\n    m_pFormDict->SetAtBoolean(\"NeedAppearances\", bNeedAP);\n    m_bGenerateAP = bNeedAP;\n}\nint CPDF_InterForm::CountFieldsInCalculationOrder()\n{\n    if (m_pFormDict == NULL) {\n        return 0;\n    }\n    CPDF_Array* pArray = m_pFormDict->GetArray(\"CO\");\n    if (pArray == NULL) {\n        return 0;\n    }\n    return pArray->GetCount();\n}\nCPDF_FormField* CPDF_InterForm::GetFieldInCalculationOrder(int index)\n{\n    if (m_pFormDict == NULL || index < 0) {\n        return NULL;\n    }\n    CPDF_Array* pArray = m_pFormDict->GetArray(\"CO\");\n    if (pArray == NULL) {\n        return NULL;\n    }\n    CPDF_Object* pElement = pArray->GetElementValue(index);\n    if (pElement != NULL && pElement->GetType() == PDFOBJ_DICTIONARY) {\n        return GetFieldByDict((CPDF_Dictionary*)pElement);\n    }\n    return NULL;\n}\nint CPDF_InterForm::FindFieldInCalculationOrder(const CPDF_FormField* pField)\n{\n    if (m_pFormDict == NULL || pField == NULL) {\n        return -1;\n    }\n    CPDF_Array* pArray = m_pFormDict->GetArray(\"CO\");\n    if (pArray == NULL) {\n        return -1;\n    }\n    for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {\n        CPDF_Object* pElement = pArray->GetElementValue(i);\n        if (pElement == pField->m_pDict) {\n            return i;\n        }\n    }\n    return -1;\n}\nFX_DWORD CPDF_InterForm::CountFormFonts()\n{\n    return CountInterFormFonts(m_pFormDict);\n}\nCPDF_Font* CPDF_InterForm::GetFormFont(FX_DWORD index, CFX_ByteString& csNameTag)\n{\n    return GetInterFormFont(m_pFormDict, m_pDocument, index, csNameTag);\n}\nCPDF_Font* CPDF_InterForm::GetFormFont(CFX_ByteString csNameTag)\n{\n    return GetInterFormFont(m_pFormDict, m_pDocument, csNameTag);\n}\nCPDF_Font* CPDF_InterForm::GetFormFont(CFX_ByteString csFontName, CFX_ByteString& csNameTag)\n{\n    return GetInterFormFont(m_pFormDict, m_pDocument, csFontName, csNameTag);\n}\nCPDF_Font* CPDF_InterForm::GetNativeFormFont(FX_BYTE charSet, CFX_ByteString& csNameTag)\n{\n    return GetNativeInterFormFont(m_pFormDict, m_pDocument, charSet, csNameTag);\n}\nCPDF_Font* CPDF_InterForm::GetNativeFormFont(CFX_ByteString& csNameTag)\n{\n    return GetNativeInterFormFont(m_pFormDict, m_pDocument, csNameTag);\n}\nFX_BOOL CPDF_InterForm::FindFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag)\n{\n    return FindInterFormFont(m_pFormDict, pFont, csNameTag);\n}\nFX_BOOL CPDF_InterForm::FindFormFont(CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag)\n{\n    return FindInterFormFont(m_pFormDict, m_pDocument, csFontName, pFont, csNameTag);\n}\nvoid CPDF_InterForm::AddFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag)\n{\n    AddInterFormFont(m_pFormDict, m_pDocument, pFont, csNameTag);\n    m_bUpdated = TRUE;\n}\nCPDF_Font* CPDF_InterForm::AddNativeFormFont(FX_BYTE charSet, CFX_ByteString& csNameTag)\n{\n    m_bUpdated = TRUE;\n    return AddNativeInterFormFont(m_pFormDict, m_pDocument, charSet, csNameTag);\n}\nCPDF_Font* CPDF_InterForm::AddNativeFormFont(CFX_ByteString& csNameTag)\n{\n    m_bUpdated = TRUE;\n    return AddNativeInterFormFont(m_pFormDict, m_pDocument, csNameTag);\n}\nvoid CPDF_InterForm::RemoveFormFont(const CPDF_Font* pFont)\n{\n    m_bUpdated = TRUE;\n    RemoveInterFormFont(m_pFormDict, pFont);\n}\nvoid CPDF_InterForm::RemoveFormFont(CFX_ByteString csNameTag)\n{\n    m_bUpdated = TRUE;\n    RemoveInterFormFont(m_pFormDict, csNameTag);\n}\nCPDF_DefaultAppearance CPDF_InterForm::GetDefaultAppearance()\n{\n    CFX_ByteString csDA;\n    if (m_pFormDict == NULL) {\n        return csDA;\n    }\n    csDA = m_pFormDict->GetString(\"DA\");\n    return csDA;\n}\nCPDF_Font* CPDF_InterForm::GetDefaultFormFont()\n{\n    return GetDefaultInterFormFont(m_pFormDict, m_pDocument);\n}\nint CPDF_InterForm::GetFormAlignment()\n{\n    if (m_pFormDict == NULL) {\n        return 0;\n    }\n    return m_pFormDict->GetInteger(\"Q\", 0);\n}\nFX_BOOL CPDF_InterForm::ResetForm(const CFX_PtrArray& fields, FX_BOOL bIncludeOrExclude, FX_BOOL bNotify)\n{\n    if (bNotify && m_pFormNotify != NULL) {\n        int iRet = m_pFormNotify->BeforeFormReset(this);\n        if (iRet < 0) {\n            return FALSE;\n        }\n    }\n    int nCount = m_pFieldTree->m_Root.CountFields();\n    for (int i = 0; i < nCount; i++) {\n        CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);\n        if (pField == NULL) {\n            continue;\n        }\n        FX_BOOL bFind = FALSE;\n        int iCount = fields.GetSize();\n        for (int i = 0; i < iCount; i ++) {\n            if (pField == (CPDF_FormField*)fields[i]) {\n                bFind = TRUE;\n                break;\n            }\n        }\n        if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {\n            pField->ResetField(bNotify);\n        }\n    }\n    if (bNotify && m_pFormNotify != NULL) {\n        m_pFormNotify->AfterFormReset(this);\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_InterForm::ResetForm(FX_BOOL bNotify)\n{\n    if (bNotify && m_pFormNotify != NULL) {\n        int iRet = m_pFormNotify->BeforeFormReset(this);\n        if (iRet < 0) {\n            return FALSE;\n        }\n    }\n    int nCount = m_pFieldTree->m_Root.CountFields();\n    for (int i = 0; i < nCount; i++) {\n        CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);\n        if (pField == NULL) {\n            continue;\n        }\n        pField->ResetField(bNotify);\n    }\n    if (bNotify && m_pFormNotify != NULL) {\n        m_pFormNotify->AfterFormReset(this);\n    }\n    return TRUE;\n}\nvoid CPDF_InterForm::ReloadForm()\n{\n    FX_POSITION pos = m_ControlMap.GetStartPosition();\n    while (pos) {\n        CPDF_Dictionary* pWidgetDict;\n        CPDF_FormControl* pControl;\n        m_ControlMap.GetNextAssoc(pos, (FX_LPVOID&)pWidgetDict, (FX_LPVOID&)pControl);\n        delete pControl;\n    }\n    m_ControlMap.RemoveAll();\n    int nCount = m_pFieldTree->m_Root.CountFields();\n    for (int k = 0; k < nCount; k ++) {\n        CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(k);\n        delete pField;\n    }\n    m_pFieldTree->RemoveAll();\n    if (m_pFormDict == NULL) {\n        return;\n    }\n    CPDF_Array* pFields = m_pFormDict->GetArray(\"Fields\");\n    if (pFields == NULL) {\n        return;\n    }\n    int iCount = pFields->GetCount();\n    for (int i = 0; i < iCount; i ++) {\n        LoadField(pFields->GetDict(i));\n    }\n}\nvoid CPDF_InterForm::LoadField(CPDF_Dictionary* pFieldDict, int nLevel)\n{\n    if (nLevel > nMaxRecursion) {\n        return;\n    }\n    if (pFieldDict == NULL) {\n        return;\n    }\n    FX_DWORD dwParentObjNum = pFieldDict->GetObjNum();\n    CPDF_Array* pKids = pFieldDict->GetArray(\"Kids\");\n    if (!pKids) {\n        AddTerminalField(pFieldDict);\n        return;\n    }\n    CPDF_Dictionary* pFirstKid = pKids->GetDict(0);\n    if (pFirstKid == NULL) {\n        return;\n    }\n    if (pFirstKid->KeyExist(\"T\") || pFirstKid->KeyExist(\"Kids\")) {\n        for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {\n            CPDF_Dictionary * pChildDict = pKids->GetDict(i);\n            if (pChildDict) {\n                if (pChildDict->GetObjNum() != dwParentObjNum) {\n                    LoadField(pChildDict, nLevel + 1);\n                }\n            }\n        }\n    } else {\n        AddTerminalField(pFieldDict);\n    }\n}\nFX_BOOL CPDF_InterForm::HasXFAForm() const\n{\n    return m_pFormDict && m_pFormDict->GetArray(FX_BSTRC(\"XFA\")) != NULL;\n}\nvoid CPDF_InterForm::FixPageFields(const CPDF_Page* pPage)\n{\n    ASSERT(pPage != NULL);\n    CPDF_Dictionary* pPageDict = pPage->m_pFormDict;\n    if (pPageDict == NULL) {\n        return;\n    }\n    CPDF_Array* pAnnots = pPageDict->GetArray(FX_BSTRC(\"Annots\"));\n    if (pAnnots == NULL) {\n        return;\n    }\n    int iAnnotCount = pAnnots->GetCount();\n    for (int i = 0; i < iAnnotCount; i++) {\n        CPDF_Dictionary* pAnnot = pAnnots->GetDict(i);\n        if (pAnnot != NULL && pAnnot->GetString(FX_BSTRC(\"Subtype\")) == \"Widget\") {\n            LoadField(pAnnot);\n        }\n    }\n}\nCPDF_FormField* CPDF_InterForm::AddTerminalField(const CPDF_Dictionary* pFieldDict)\n{\n    if (!pFieldDict->KeyExist(FX_BSTRC(\"T\"))) {\n        return NULL;\n    }\n    CPDF_Dictionary* pDict = (CPDF_Dictionary*)pFieldDict;\n    CFX_WideString csWName = GetFullName(pDict);\n    if (csWName.IsEmpty()) {\n        return NULL;\n    }\n    CPDF_FormField* pField = NULL;\n    pField = m_pFieldTree->GetField(csWName);\n    if (pField == NULL) {\n        CPDF_Dictionary *pParent = (CPDF_Dictionary*)pFieldDict;\n        if (!pFieldDict->KeyExist(FX_BSTR(\"T\")) &&\n                pFieldDict->GetString(FX_BSTRC(\"Subtype\")) == FX_BSTRC(\"Widget\")) {\n            pParent = pFieldDict->GetDict(FX_BSTRC(\"Parent\"));\n            if (!pParent) {\n                pParent = (CPDF_Dictionary*)pFieldDict;\n            }\n        }\n        if (pParent && pParent != pFieldDict && !pParent->KeyExist(FX_BSTRC(\"FT\"))) {\n            if (pFieldDict->KeyExist(FX_BSTRC(\"FT\"))) {\n                CPDF_Object *pFTValue = pFieldDict->GetElementValue(FX_BSTRC(\"FT\"));\n                if (pFTValue) {\n                    pParent->SetAt(FX_BSTRC(\"FT\"), pFTValue->Clone());\n                }\n            }\n            if (pFieldDict->KeyExist(FX_BSTRC(\"Ff\"))) {\n                CPDF_Object *pFfValue = pFieldDict->GetElementValue(FX_BSTRC(\"Ff\"));\n                if (pFfValue) {\n                    pParent->SetAt(FX_BSTRC(\"Ff\"), pFfValue->Clone());\n                }\n            }\n        }\n        pField = FX_NEW CPDF_FormField(this, pParent);\n        CPDF_Object* pTObj = pDict->GetElement(\"T\");\n        if (pTObj && pTObj->GetType() == PDFOBJ_REFERENCE) {\n            CPDF_Object* pClone = pTObj->Clone(TRUE);\n            if (pClone) {\n                pDict->SetAt(\"T\", pClone);\n            } else {\n                pDict->SetAtName(\"T\", \"\");\n            }\n        }\n        m_pFieldTree->SetField(csWName, pField);\n    }\n    CPDF_Array* pKids = pFieldDict->GetArray(\"Kids\");\n    if (pKids == NULL) {\n        if (pFieldDict->GetString(\"Subtype\") == \"Widget\") {\n            AddControl(pField, pFieldDict);\n        }\n    } else {\n        for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {\n            CPDF_Dictionary* pKid = pKids->GetDict(i);\n            if (pKid == NULL) {\n                continue;\n            }\n            if (pKid->GetString(\"Subtype\") != \"Widget\") {\n                continue;\n            }\n            AddControl(pField, pKid);\n        }\n    }\n    return pField;\n}\nCPDF_FormControl* CPDF_InterForm::AddControl(const CPDF_FormField* pField, const CPDF_Dictionary* pWidgetDict)\n{\n    void *rValue = NULL;\n    if (m_ControlMap.Lookup((CPDF_Dictionary*)pWidgetDict, rValue)) {\n        return (CPDF_FormControl*)rValue;\n    }\n    CPDF_FormControl* pControl = FX_NEW CPDF_FormControl((CPDF_FormField*)pField, (CPDF_Dictionary*)pWidgetDict);\n    if (pControl == NULL) {\n        return NULL;\n    }\n    m_ControlMap.SetAt((CPDF_Dictionary*)pWidgetDict, pControl);\n    ((CPDF_FormField*)pField)->m_ControlList.Add(pControl);\n    return pControl;\n}\nCPDF_FormField* CPDF_InterForm::CheckRequiredFields(const CFX_PtrArray *fields, FX_BOOL bIncludeOrExclude) const\n{\n    int nCount = m_pFieldTree->m_Root.CountFields();\n    for (int i = 0; i < nCount; i++) {\n        CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);\n        if (pField == NULL) {\n            continue;\n        }\n        FX_INT32 iType = pField->GetType();\n        if (iType == CPDF_FormField::PushButton || iType == CPDF_FormField::CheckBox || iType == CPDF_FormField::ListBox) {\n            continue;\n        }\n        FX_DWORD dwFlags = pField->GetFieldFlags();\n        if (dwFlags & 0x04) {\n            continue;\n        }\n        FX_BOOL bFind = TRUE;\n        if (fields != NULL) {\n            bFind = fields->Find(pField, 0) >= 0;\n        }\n        if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {\n            CPDF_Dictionary *pFieldDict = pField->m_pDict;\n            if ((dwFlags & 0x02) != 0 && pFieldDict->GetString(\"V\").IsEmpty()) {\n                return pField;\n            }\n        }\n    }\n    return NULL;\n}\nCFDF_Document* CPDF_InterForm::ExportToFDF(FX_WSTR pdf_path, FX_BOOL bSimpleFileSpec) const\n{\n    CFX_PtrArray fields;\n    int nCount = m_pFieldTree->m_Root.CountFields();\n    for (int i = 0; i < nCount; i ++) {\n        CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);\n        fields.Add(pField);\n    }\n    return ExportToFDF(pdf_path, fields, TRUE, bSimpleFileSpec);\n}\nCFX_WideString FILESPEC_EncodeFileName(FX_WSTR filepath);\nCFDF_Document* CPDF_InterForm::ExportToFDF(FX_WSTR pdf_path, CFX_PtrArray& fields, FX_BOOL bIncludeOrExclude, FX_BOOL bSimpleFileSpec) const\n{\n    CFDF_Document* pDoc = CFDF_Document::CreateNewDoc();\n    if (pDoc == NULL) {\n        return NULL;\n    }\n    CPDF_Dictionary* pMainDict = pDoc->GetRoot()->GetDict(\"FDF\");\n    if (!pdf_path.IsEmpty()) {\n        if (bSimpleFileSpec) {\n            CFX_WideString wsFilePath = FILESPEC_EncodeFileName(pdf_path);\n            pMainDict->SetAtString(FX_BSTRC(\"F\"), CFX_ByteString::FromUnicode(wsFilePath));\n            pMainDict->SetAtString(FX_BSTRC(\"UF\"), PDF_EncodeText(wsFilePath));\n        } else {\n            CPDF_FileSpec filespec;\n            filespec.SetFileName(pdf_path);\n            pMainDict->SetAt(\"F\", (CPDF_Object*)filespec);\n        }\n    }\n    CPDF_Array* pFields = CPDF_Array::Create();\n    if (pFields == NULL) {\n        return NULL;\n    }\n    pMainDict->SetAt(\"Fields\", pFields);\n    int nCount = m_pFieldTree->m_Root.CountFields();\n    for (int i = 0; i < nCount; i ++) {\n        CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);\n        if (pField == NULL || pField->GetType() == CPDF_FormField::PushButton) {\n            continue;\n        }\n        FX_DWORD dwFlags = pField->GetFieldFlags();\n        if (dwFlags & 0x04) {\n            continue;\n        }\n        FX_BOOL bFind = fields.Find(pField, 0) >= 0;\n        if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {\n            if ((dwFlags & 0x02) != 0 && pField->m_pDict->GetString(\"V\").IsEmpty()) {\n                continue;\n            }\n            CFX_WideString fullname = GetFullName(pField->GetFieldDict());\n            CPDF_Dictionary* pFieldDict = CPDF_Dictionary::Create();\n            if (pFieldDict == NULL) {\n                return NULL;\n            }\n            CPDF_String* pString = CPDF_String::Create(fullname);\n            if (pString == NULL) {\n                pFieldDict->Release();\n                return NULL;\n            }\n            pFieldDict->SetAt(\"T\", pString);\n            if (pField->GetType() == CPDF_FormField::CheckBox || pField->GetType() == CPDF_FormField::RadioButton) {\n                CFX_WideString csExport = pField->GetCheckValue(FALSE);\n                CFX_ByteString csBExport = PDF_EncodeText(csExport);\n                CPDF_Object* pOpt = FPDF_GetFieldAttr(pField->m_pDict, \"Opt\");\n                if (pOpt == NULL) {\n                    pFieldDict->SetAtName(\"V\", csBExport);\n                } else {\n                    pFieldDict->SetAtString(\"V\", csBExport);\n                }\n            } else {\n                CPDF_Object* pV = FPDF_GetFieldAttr(pField->m_pDict, \"V\");\n                if (pV != NULL) {\n                    pFieldDict->SetAt(\"V\", pV->Clone(TRUE));\n                }\n            }\n            pFields->Add(pFieldDict);\n        }\n    }\n    return pDoc;\n}\nconst struct _SupportFieldEncoding {\n    FX_LPCSTR m_name;\n    FX_INT32 m_codePage;\n} g_fieldEncoding[] = {\n    \"BigFive\", 950,\n    \"GBK\", 936,\n    \"Shift-JIS\", 932,\n    \"UHC\", 949,\n};\nstatic void FPDFDOC_FDF_GetFieldValue(CPDF_Dictionary *pFieldDict, CFX_WideString &csValue, CFX_ByteString &bsEncoding)\n{\n    ASSERT(pFieldDict != NULL);\n    CFX_ByteString csBValue = pFieldDict->GetString(\"V\");\n    FX_INT32 iCount = sizeof(g_fieldEncoding) / sizeof(g_fieldEncoding[0]);\n    FX_INT32 i = 0;\n    for (; i < iCount; ++i)\n        if (bsEncoding == g_fieldEncoding[i].m_name) {\n            break;\n        }\n    if (i < iCount) {\n        CFX_CharMap *pCharMap = CFX_CharMap::GetDefaultMapper(g_fieldEncoding[i].m_codePage);\n        FXSYS_assert(pCharMap != NULL);\n        csValue.ConvertFrom(csBValue, pCharMap);\n        return;\n    }\n    CFX_ByteString csTemp = csBValue.Left(2);\n    if (csTemp == \"\\xFF\\xFE\" || csTemp == \"\\xFE\\xFF\") {\n        csValue = PDF_DecodeText(csBValue);\n    } else {\n        csValue = CFX_WideString::FromLocal(csBValue);\n    }\n}\nvoid CPDF_InterForm::FDF_ImportField(CPDF_Dictionary* pFieldDict, const CFX_WideString& parent_name, FX_BOOL bNotify, int nLevel)\n{\n    CFX_WideString name;\n    if (!parent_name.IsEmpty()) {\n        name = parent_name + L\".\";\n    }\n    name += pFieldDict->GetUnicodeText(\"T\");\n    CPDF_Array* pKids = pFieldDict->GetArray(\"Kids\");\n    if (pKids) {\n        for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {\n            CPDF_Dictionary* pKid = pKids->GetDict(i);\n            if (pKid == NULL) {\n                continue;\n            }\n            if (nLevel <= nMaxRecursion) {\n                FDF_ImportField(pKid, name, bNotify, nLevel + 1);\n            }\n        }\n        return;\n    }\n    if (!pFieldDict->KeyExist(\"V\")) {\n        return;\n    }\n    CPDF_FormField* pField = m_pFieldTree->GetField(name);\n    if (pField == NULL) {\n        return;\n    }\n    CFX_WideString csWValue;\n    FPDFDOC_FDF_GetFieldValue(pFieldDict, csWValue, m_bsEncoding);\n    int iType = pField->GetFieldType();\n    if (bNotify && m_pFormNotify != NULL) {\n        int iRet = 0;\n        if (iType == FIELDTYPE_LISTBOX) {\n            iRet = m_pFormNotify->BeforeSelectionChange(pField, csWValue);\n        } else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) {\n            iRet = m_pFormNotify->BeforeValueChange(pField, csWValue);\n        }\n        if (iRet < 0) {\n            return;\n        }\n    }\n    CFX_ByteArray statusArray;\n    if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) {\n        SaveCheckedFieldStatus(pField, statusArray);\n    }\n    pField->SetValue(csWValue);\n    CPDF_FormField::Type eType = pField->GetType();\n    if ((eType == CPDF_FormField::ListBox || eType == CPDF_FormField::ComboBox) && pFieldDict->KeyExist(\"Opt\")) {\n        pField->m_pDict->SetAt(\"Opt\", pFieldDict->GetElementValue(\"Opt\")->Clone(TRUE));\n    }\n    if (bNotify && m_pFormNotify != NULL) {\n        if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) {\n            m_pFormNotify->AfterCheckedStatusChange(pField, statusArray);\n        } else if (iType == FIELDTYPE_LISTBOX) {\n            m_pFormNotify->AfterSelectionChange(pField);\n        } else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) {\n            m_pFormNotify->AfterValueChange(pField);\n        }\n    }\n    if (CPDF_InterForm::m_bUpdateAP) {\n        pField->UpdateAP(NULL);\n    }\n}\nFX_BOOL CPDF_InterForm::ImportFromFDF(const CFDF_Document* pFDF, FX_BOOL bNotify)\n{\n    if (pFDF == NULL) {\n        return FALSE;\n    }\n    CPDF_Dictionary* pMainDict = pFDF->GetRoot()->GetDict(\"FDF\");\n    if (pMainDict == NULL) {\n        return FALSE;\n    }\n    CPDF_Array* pFields = pMainDict->GetArray(\"Fields\");\n    if (pFields == NULL) {\n        return FALSE;\n    }\n    m_bsEncoding = pMainDict->GetString(FX_BSTRC(\"Encoding\"));\n    if (bNotify && m_pFormNotify != NULL) {\n        int iRet = m_pFormNotify->BeforeFormImportData(this);\n        if (iRet < 0) {\n            return FALSE;\n        }\n    }\n    for (FX_DWORD i = 0; i < pFields->GetCount(); i ++) {\n        CPDF_Dictionary* pField = pFields->GetDict(i);\n        if (pField == NULL) {\n            continue;\n        }\n        FDF_ImportField(pField, L\"\", bNotify);\n    }\n    if (bNotify && m_pFormNotify != NULL) {\n        m_pFormNotify->AfterFormImportData(this);\n    }\n    return TRUE;\n}\nvoid CPDF_InterForm::SetFormNotify(const CPDF_FormNotify* pNotify)\n{\n    m_pFormNotify = (CPDF_FormNotify*)pNotify;\n}\nint CPDF_InterForm::GetPageWithWidget(int iCurPage, FX_BOOL bNext)\n{\n    if (iCurPage < 0) {\n        return -1;\n    }\n    int iPageCount = m_pDocument->GetPageCount();\n    if (iCurPage >= iPageCount) {\n        return -1;\n    }\n    int iNewPage = iCurPage;\n    do {\n        iNewPage += bNext ? 1 : -1;\n        if (iNewPage >= iPageCount) {\n            iNewPage = 0;\n        }\n        if (iNewPage < 0) {\n            iNewPage = iPageCount - 1;\n        }\n        if (iNewPage == iCurPage) {\n            break;\n        }\n        CPDF_Dictionary* pPageDict = m_pDocument->GetPage(iNewPage);\n        if (pPageDict == NULL) {\n            continue;\n        }\n        CPDF_Array* pAnnots = pPageDict->GetArray(\"Annots\");\n        if (pAnnots == NULL) {\n            continue;\n        }\n        FX_DWORD dwCount = pAnnots->GetCount();\n        for (FX_DWORD i = 0; i < dwCount; i ++) {\n            CPDF_Object* pAnnotDict = pAnnots->GetElementValue(i);\n            if (pAnnotDict == NULL) {\n                continue;\n            }\n            CPDF_FormControl* pControl = NULL;\n            if (m_ControlMap.Lookup(pAnnotDict, (void*&)pControl)) {\n                return iNewPage;\n            }\n        }\n    } while (TRUE);\n    return -1;\n}\n"
  },
  {
    "path": "core/src/fpdfdoc/doc_formcontrol.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fpdfdoc/fpdf_doc.h\"\nCPDF_FormControl::CPDF_FormControl(CPDF_FormField* pField, CPDF_Dictionary* pWidgetDict)\n{\n    m_pField = pField;\n    m_pWidgetDict = pWidgetDict;\n    m_pForm = m_pField->m_pForm;\n}\nCFX_FloatRect CPDF_FormControl::GetRect()\n{\n    return m_pWidgetDict->GetRect(\"Rect\");\n}\nCFX_ByteString CPDF_FormControl::GetOnStateName()\n{\n    ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);\n    CFX_ByteString csOn;\n    CPDF_Dictionary* pAP = m_pWidgetDict->GetDict(\"AP\");\n    if (pAP == NULL) {\n        return csOn;\n    }\n    CPDF_Dictionary* pN = pAP->GetDict(\"N\");\n    if (pN == NULL) {\n        return csOn;\n    }\n    FX_POSITION pos = pN->GetStartPos();\n    while (pos) {\n        pN->GetNextElement(pos, csOn);\n        if (csOn != \"Off\") {\n            return csOn;\n        }\n    }\n    return CFX_ByteString();\n}\nvoid CPDF_FormControl::SetOnStateName(const CFX_ByteString& csOn)\n{\n    ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);\n    CFX_ByteString csValue = csOn;\n    if (csValue.IsEmpty()) {\n        csValue = \"Yes\";\n    }\n    if (csValue == \"Off\") {\n        csValue = \"Yes\";\n    }\n    CFX_ByteString csAS = m_pWidgetDict->GetString(\"AS\", \"Off\");\n    if (csAS != \"Off\") {\n        m_pWidgetDict->SetAtName(\"AS\", csValue);\n    }\n    CPDF_Dictionary* pAP = m_pWidgetDict->GetDict(\"AP\");\n    if (pAP == NULL) {\n        return;\n    }\n    FX_POSITION pos1 = pAP->GetStartPos();\n    while (pos1) {\n        CFX_ByteString csKey1;\n        CPDF_Object* pObj1 = pAP->GetNextElement(pos1, csKey1);\n        if (pObj1 == NULL) {\n            continue;\n        }\n        CPDF_Object* pObjDirect1 = pObj1->GetDirect();\n        if (pObjDirect1->GetType() != PDFOBJ_DICTIONARY) {\n            continue;\n        }\n        CPDF_Dictionary* pSubDict = (CPDF_Dictionary*)pObjDirect1;\n        FX_POSITION pos2 = pSubDict->GetStartPos();\n        while (pos2) {\n            CFX_ByteString csKey2;\n            CPDF_Object* pObj2 = pSubDict->GetNextElement(pos2, csKey2);\n            if (pObj2 == NULL) {\n                continue;\n            }\n            if (csKey2 != \"Off\") {\n                pSubDict->ReplaceKey(csKey2, csValue);\n                break;\n            }\n        }\n    }\n}\nCFX_ByteString CPDF_FormControl::GetCheckedAPState()\n{\n    ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);\n    CFX_ByteString csOn = GetOnStateName();\n    if (GetType() == CPDF_FormField::RadioButton || GetType() == CPDF_FormField::CheckBox) {\n        CPDF_Object* pOpt = FPDF_GetFieldAttr(m_pField->m_pDict, \"Opt\");\n        if (pOpt != NULL && pOpt->GetType() == PDFOBJ_ARRAY) {\n            int iIndex = m_pField->GetControlIndex(this);\n            csOn.Format(\"%d\", iIndex);\n        }\n    }\n    if (csOn.IsEmpty()) {\n        csOn = \"Yes\";\n    }\n    return csOn;\n}\nCFX_WideString CPDF_FormControl::GetExportValue()\n{\n    ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);\n    CFX_ByteString csOn = GetOnStateName();\n    if (GetType() == CPDF_FormField::RadioButton || GetType() == CPDF_FormField::CheckBox) {\n        CPDF_Object* pOpt = FPDF_GetFieldAttr(m_pField->m_pDict, \"Opt\");\n        if (pOpt != NULL && pOpt->GetType() == PDFOBJ_ARRAY) {\n            int iIndex = m_pField->GetControlIndex(this);\n            csOn = ((CPDF_Array*)pOpt)->GetString(iIndex);\n        }\n    }\n    if (csOn.IsEmpty()) {\n        csOn = \"Yes\";\n    }\n    CFX_WideString csWOn = PDF_DecodeText(csOn);\n    return csWOn;\n}\nFX_BOOL CPDF_FormControl::IsChecked()\n{\n    ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);\n    CFX_ByteString csOn = GetOnStateName();\n    CFX_ByteString csAS = m_pWidgetDict->GetString(\"AS\");\n    return csAS == csOn;\n}\nFX_BOOL CPDF_FormControl::IsDefaultChecked()\n{\n    ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);\n    CPDF_Object* pDV = FPDF_GetFieldAttr(m_pField->m_pDict, \"DV\");\n    if (pDV == NULL) {\n        return FALSE;\n    }\n    CFX_ByteString csDV = pDV->GetString();\n    CFX_ByteString csOn = GetOnStateName();\n    return (csDV == csOn);\n}\nvoid CPDF_FormControl::CheckControl(FX_BOOL bChecked)\n{\n    ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);\n    CFX_ByteString csOn = GetOnStateName();\n    CFX_ByteString csOldAS = m_pWidgetDict->GetString(\"AS\", \"Off\");\n    CFX_ByteString csAS = \"Off\";\n    if (bChecked) {\n        csAS = csOn;\n    }\n    if (csOldAS == csAS) {\n        return;\n    }\n    m_pWidgetDict->SetAtName(\"AS\", csAS);\n    m_pForm->m_bUpdated = TRUE;\n}\nCPDF_Stream* FPDFDOC_GetAnnotAP(CPDF_Dictionary* pAnnotDict, CPDF_Annot::AppearanceMode mode);\nvoid CPDF_FormControl::DrawControl(CFX_RenderDevice* pDevice, CFX_AffineMatrix* pMatrix, CPDF_Page* pPage,\n                                   CPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions)\n{\n    if (m_pWidgetDict->GetInteger(\"F\") & ANNOTFLAG_HIDDEN) {\n        return;\n    }\n    CPDF_Stream* pStream = FPDFDOC_GetAnnotAP(m_pWidgetDict, mode);\n    if (pStream == NULL) {\n        return;\n    }\n    CFX_FloatRect form_bbox = pStream->GetDict()->GetRect(\"BBox\");\n    CFX_AffineMatrix form_matrix = pStream->GetDict()->GetMatrix(\"Matrix\");\n    form_matrix.TransformRect(form_bbox);\n    CFX_FloatRect arect = m_pWidgetDict->GetRect(\"Rect\");\n    CFX_AffineMatrix matrix;\n    matrix.MatchRect(arect, form_bbox);\n    matrix.Concat(*pMatrix);\n    CPDF_Form form(m_pField->m_pForm->m_pDocument, m_pField->m_pForm->m_pFormDict->GetDict(\"DR\"), pStream);\n    form.ParseContent(NULL, NULL, NULL, NULL);\n    CPDF_RenderContext context;\n    context.Create(pPage);\n    context.DrawObjectList(pDevice, &form, &matrix, pOptions);\n}\nconst FX_CHAR* g_sHighlightingMode[] = {\"N\", \"I\", \"O\", \"P\", \"T\", \"\"};\nCPDF_FormControl::HighlightingMode CPDF_FormControl::GetHighlightingMode()\n{\n    if (m_pWidgetDict == NULL) {\n        return Invert;\n    }\n    CFX_ByteString csH = m_pWidgetDict->GetString(\"H\", \"I\");\n    int i = 0;\n    while (g_sHighlightingMode[i][0] != '\\0') {\n        if (csH.Equal(g_sHighlightingMode[i])) {\n            return (HighlightingMode)i;\n        }\n        i ++;\n    }\n    return Invert;\n}\nCPDF_ApSettings CPDF_FormControl::GetMK(FX_BOOL bCreate)\n{\n    if (!m_pWidgetDict) {\n        return NULL;\n    }\n    CPDF_ApSettings mk = m_pWidgetDict->GetDict(FX_BSTRC(\"MK\"));\n    if (!mk && bCreate) {\n        mk = CPDF_Dictionary::Create();\n        if (mk == NULL) {\n            return NULL;\n        }\n        m_pWidgetDict->SetAt(FX_BSTRC(\"MK\"), mk);\n    }\n    return mk;\n}\nFX_BOOL CPDF_FormControl::HasMKEntry(CFX_ByteString csEntry)\n{\n    CPDF_ApSettings mk = GetMK(FALSE);\n    return mk.HasMKEntry(csEntry);\n}\nint CPDF_FormControl::GetRotation()\n{\n    CPDF_ApSettings mk = GetMK(FALSE);\n    return mk.GetRotation();\n}\nFX_ARGB CPDF_FormControl::GetColor(int& iColorType, CFX_ByteString csEntry)\n{\n    CPDF_ApSettings mk = GetMK(FALSE);\n    return mk.GetColor(iColorType, csEntry);\n}\nFX_FLOAT CPDF_FormControl::GetOriginalColor(int index, CFX_ByteString csEntry)\n{\n    CPDF_ApSettings mk = GetMK(FALSE);\n    return mk.GetOriginalColor(index, csEntry);\n}\nvoid CPDF_FormControl::GetOriginalColor(int& iColorType, FX_FLOAT fc[4], CFX_ByteString csEntry)\n{\n    CPDF_ApSettings mk = GetMK(FALSE);\n    mk.GetOriginalColor(iColorType, fc, csEntry);\n}\nCFX_WideString CPDF_FormControl::GetCaption(CFX_ByteString csEntry)\n{\n    CPDF_ApSettings mk = GetMK(FALSE);\n    return mk.GetCaption(csEntry);\n}\nCPDF_Stream* CPDF_FormControl::GetIcon(CFX_ByteString csEntry)\n{\n    CPDF_ApSettings mk = GetMK(FALSE);\n    return mk.GetIcon(csEntry);\n}\nCPDF_IconFit CPDF_FormControl::GetIconFit()\n{\n    CPDF_ApSettings mk = GetMK(FALSE);\n    return mk.GetIconFit();\n}\nint CPDF_FormControl::GetTextPosition()\n{\n    CPDF_ApSettings mk = GetMK(FALSE);\n    return mk.GetTextPosition();\n}\nCPDF_Action CPDF_FormControl::GetAction()\n{\n    if (m_pWidgetDict == NULL) {\n        return NULL;\n    }\n    if (m_pWidgetDict->KeyExist(\"A\")) {\n        return m_pWidgetDict->GetDict(\"A\");\n    } else {\n        CPDF_Object* pObj = FPDF_GetFieldAttr(m_pField->m_pDict, \"A\");\n        if (pObj == NULL) {\n            return NULL;\n        }\n        return pObj->GetDict();\n    }\n}\nCPDF_AAction CPDF_FormControl::GetAdditionalAction()\n{\n    if (m_pWidgetDict == NULL) {\n        return NULL;\n    }\n    if (m_pWidgetDict->KeyExist(\"AA\")) {\n        return m_pWidgetDict->GetDict(\"AA\");\n    } else {\n        return m_pField->GetAdditionalAction();\n    }\n}\nCPDF_DefaultAppearance CPDF_FormControl::GetDefaultAppearance()\n{\n    if (m_pWidgetDict == NULL) {\n        return CFX_ByteString();\n    }\n    if (m_pWidgetDict->KeyExist(\"DA\")) {\n        return m_pWidgetDict->GetString(\"DA\");\n    } else {\n        CPDF_Object* pObj = FPDF_GetFieldAttr(m_pField->m_pDict, \"DA\");\n        if (pObj == NULL) {\n            return m_pField->m_pForm->GetDefaultAppearance();\n        }\n        return pObj->GetString();\n    }\n}\nCPDF_Font* CPDF_FormControl::GetDefaultControlFont()\n{\n    CPDF_DefaultAppearance cDA = GetDefaultAppearance();\n    CFX_ByteString csFontNameTag;\n    FX_FLOAT fFontSize;\n    cDA.GetFont(csFontNameTag, fFontSize);\n    if (csFontNameTag.IsEmpty()) {\n        return NULL;\n    }\n    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pWidgetDict, \"DR\");\n    if (pObj != NULL && pObj->GetType() == PDFOBJ_DICTIONARY) {\n        CPDF_Dictionary* pFonts = ((CPDF_Dictionary*)pObj)->GetDict(\"Font\");\n        if (pFonts != NULL) {\n            CPDF_Dictionary *pElement = pFonts->GetDict(csFontNameTag);\n            CPDF_Font *pFont = m_pField->m_pForm->m_pDocument->LoadFont(pElement);\n            if (pFont != NULL) {\n                return pFont;\n            }\n        }\n    }\n    CPDF_Font *pFont = m_pField->m_pForm->GetFormFont(csFontNameTag);\n    if (pFont != NULL) {\n        return pFont;\n    }\n    CPDF_Dictionary *pPageDict = m_pWidgetDict->GetDict(\"P\");\n    pObj = FPDF_GetFieldAttr(pPageDict, \"Resources\");\n    if (pObj != NULL && pObj->GetType() == PDFOBJ_DICTIONARY) {\n        CPDF_Dictionary* pFonts = ((CPDF_Dictionary*)pObj)->GetDict(\"Font\");\n        if (pFonts != NULL) {\n            CPDF_Dictionary *pElement = pFonts->GetDict(csFontNameTag);\n            CPDF_Font *pFont = m_pField->m_pForm->m_pDocument->LoadFont(pElement);\n            if (pFont != NULL) {\n                return pFont;\n            }\n        }\n    }\n    return NULL;\n}\nint CPDF_FormControl::GetControlAlignment()\n{\n    if (m_pWidgetDict == NULL) {\n        return 0;\n    }\n    if (m_pWidgetDict->KeyExist(\"Q\")) {\n        return m_pWidgetDict->GetInteger(\"Q\", 0);\n    } else {\n        CPDF_Object* pObj = FPDF_GetFieldAttr(m_pField->m_pDict, \"Q\");\n        if (pObj == NULL) {\n            return m_pField->m_pForm->GetFormAlignment();\n        }\n        return pObj->GetInteger();\n    }\n}\nFX_BOOL CPDF_ApSettings::HasMKEntry(FX_BSTR csEntry)\n{\n    if (m_pDict == NULL) {\n        return FALSE;\n    }\n    return m_pDict->KeyExist(csEntry);\n}\nint CPDF_ApSettings::GetRotation()\n{\n    if (m_pDict == NULL) {\n        return 0;\n    }\n    return m_pDict->GetInteger(FX_BSTRC(\"R\"));\n}\nFX_ARGB CPDF_ApSettings::GetColor(int& iColorType, FX_BSTR csEntry)\n{\n    iColorType = COLORTYPE_TRANSPARENT;\n    if (m_pDict == NULL) {\n        return 0;\n    }\n    FX_ARGB color = 0;\n    CPDF_Array* pEntry = m_pDict->GetArray(csEntry);\n    if (pEntry == NULL) {\n        return color;\n    }\n    FX_DWORD dwCount = pEntry->GetCount();\n    if (dwCount == 1) {\n        iColorType = COLORTYPE_GRAY;\n        FX_FLOAT g = pEntry->GetNumber(0) * 255;\n        color = ArgbEncode(255, (int)g, (int)g, (int)g);\n    } else if (dwCount == 3) {\n        iColorType = COLORTYPE_RGB;\n        FX_FLOAT r = pEntry->GetNumber(0) * 255;\n        FX_FLOAT g = pEntry->GetNumber(1) * 255;\n        FX_FLOAT b = pEntry->GetNumber(2) * 255;\n        color = ArgbEncode(255, (int)r, (int)g, (int)b);\n    } else if (dwCount == 4) {\n        iColorType = COLORTYPE_CMYK;\n        FX_FLOAT c = pEntry->GetNumber(0);\n        FX_FLOAT m = pEntry->GetNumber(1);\n        FX_FLOAT y = pEntry->GetNumber(2);\n        FX_FLOAT k = pEntry->GetNumber(3);\n        FX_FLOAT r = 1.0f - FX_MIN(1.0f, c + k);\n        FX_FLOAT g = 1.0f - FX_MIN(1.0f, m + k);\n        FX_FLOAT b = 1.0f - FX_MIN(1.0f, y + k);\n        color = ArgbEncode(255, (int)(r * 255), (int)(g * 255), (int)(b * 255));\n    }\n    return color;\n}\nFX_FLOAT CPDF_ApSettings::GetOriginalColor(int index, FX_BSTR csEntry)\n{\n    if (m_pDict == NULL) {\n        return 0;\n    }\n    CPDF_Array* pEntry = m_pDict->GetArray(csEntry);\n    if (pEntry != NULL) {\n        return pEntry->GetNumber(index);\n    }\n    return 0;\n}\nvoid CPDF_ApSettings::GetOriginalColor(int& iColorType, FX_FLOAT fc[4], FX_BSTR csEntry)\n{\n    iColorType = COLORTYPE_TRANSPARENT;\n    for (int i = 0; i < 4; i ++) {\n        fc[i] = 0;\n    }\n    if (m_pDict == NULL) {\n        return;\n    }\n    CPDF_Array* pEntry = m_pDict->GetArray(csEntry);\n    if (pEntry == NULL) {\n        return;\n    }\n    FX_DWORD dwCount = pEntry->GetCount();\n    if (dwCount == 1) {\n        iColorType = COLORTYPE_GRAY;\n        fc[0] = pEntry->GetNumber(0);\n    } else if (dwCount == 3) {\n        iColorType = COLORTYPE_RGB;\n        fc[0] = pEntry->GetNumber(0);\n        fc[1] = pEntry->GetNumber(1);\n        fc[2] = pEntry->GetNumber(2);\n    } else if (dwCount == 4) {\n        iColorType = COLORTYPE_CMYK;\n        fc[0] = pEntry->GetNumber(0);\n        fc[1] = pEntry->GetNumber(1);\n        fc[2] = pEntry->GetNumber(2);\n        fc[3] = pEntry->GetNumber(3);\n    }\n}\nCFX_WideString CPDF_ApSettings::GetCaption(FX_BSTR csEntry)\n{\n    CFX_WideString csCaption;\n    if (m_pDict == NULL) {\n        return csCaption;\n    }\n    return m_pDict->GetUnicodeText(csEntry);\n}\nCPDF_Stream* CPDF_ApSettings::GetIcon(FX_BSTR csEntry)\n{\n    if (m_pDict == NULL) {\n        return NULL;\n    }\n    return m_pDict->GetStream(csEntry);\n}\nCPDF_IconFit CPDF_ApSettings::GetIconFit()\n{\n    if (m_pDict == NULL) {\n        return NULL;\n    }\n    return m_pDict->GetDict(FX_BSTRC(\"IF\"));\n}\nint CPDF_ApSettings::GetTextPosition()\n{\n    if (m_pDict == NULL) {\n        return TEXTPOS_CAPTION;\n    }\n    return m_pDict->GetInteger(FX_BSTRC(\"TP\"), TEXTPOS_CAPTION);\n}\n"
  },
  {
    "path": "core/src/fpdfdoc/doc_formfield.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fpdfdoc/fpdf_doc.h\"\nCFX_WideString\t\tGetFullName(CPDF_Dictionary* pFieldDict);\nvoid\t\t\t\tSaveCheckedFieldStatus(CPDF_FormField* pField, CFX_ByteArray& statusArray);\nFX_BOOL PDF_FormField_IsUnison(CPDF_FormField *pField)\n{\n    FX_BOOL bUnison = FALSE;\n    if (pField->GetType() == CPDF_FormField::CheckBox) {\n        bUnison = TRUE;\n    } else {\n        FX_DWORD dwFlags = pField->GetFieldFlags();\n        bUnison = ((dwFlags & 0x2000000) != 0);\n    }\n    return bUnison;\n}\nCPDF_FormField::CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict)\n{\n    m_pDict = pDict;\n    m_Type = Unknown;\n    m_pForm = pForm;\n    m_pFont = NULL;\n    m_FontSize = 0;\n    SyncFieldFlags();\n}\nCPDF_FormField::~CPDF_FormField()\n{\n}\nvoid CPDF_FormField::SyncFieldFlags()\n{\n    CFX_ByteString type_name = FPDF_GetFieldAttr(m_pDict, \"FT\") ? FPDF_GetFieldAttr(m_pDict, \"FT\")->GetString() : CFX_ByteString();\n    FX_DWORD flags = FPDF_GetFieldAttr(m_pDict, \"Ff\")? FPDF_GetFieldAttr(m_pDict, \"Ff\")->GetInteger() : 0;\n    m_Flags = 0;\n    if (flags & 1) {\n        m_Flags |= FORMFIELD_READONLY;\n    }\n    if (flags & 2) {\n        m_Flags |= FORMFIELD_REQUIRED;\n    }\n    if (flags & 4) {\n        m_Flags |= FORMFIELD_NOEXPORT;\n    }\n    if (type_name == \"Btn\") {\n        if (flags & 0x8000) {\n            m_Type = RadioButton;\n            if (flags & 0x4000) {\n                m_Flags |= FORMRADIO_NOTOGGLEOFF;\n            }\n            if (flags & 0x2000000) {\n                m_Flags |= FORMRADIO_UNISON;\n            }\n        } else if (flags & 0x10000) {\n            m_Type = PushButton;\n        } else {\n            m_Type = CheckBox;\n        }\n    } else if (type_name == \"Tx\") {\n        if (flags & 0x100000) {\n            m_Type = File;\n        } else if (flags & 0x2000000) {\n            m_Type = RichText;\n        } else {\n            m_Type = Text;\n            if (flags & 0x1000) {\n                m_Flags |= FORMTEXT_MULTILINE;\n            }\n            if (flags & 0x2000) {\n                m_Flags |= FORMTEXT_PASSWORD;\n            }\n            if (flags & 0x800000) {\n                m_Flags |= FORMTEXT_NOSCROLL;\n            }\n            if (flags & 0x100000) {\n                m_Flags |= FORMTEXT_COMB;\n            }\n        }\n        LoadDA();\n    } else if (type_name == \"Ch\") {\n        if (flags & 0x20000) {\n            m_Type = ComboBox;\n            if (flags & 0x40000) {\n                m_Flags |= FORMCOMBO_EDIT;\n            }\n        } else {\n            m_Type = ListBox;\n            if (flags & 0x200000) {\n                m_Flags |= FORMLIST_MULTISELECT;\n            }\n        }\n        LoadDA();\n    } else if (type_name == \"Sig\") {\n        m_Type = Sign;\n    }\n}\nCFX_WideString CPDF_FormField::GetFullName()\n{\n    return ::GetFullName(m_pDict);\n}\nFX_BOOL CPDF_FormField::ResetField(FX_BOOL bNotify)\n{\n    switch (m_Type) {\n        case CPDF_FormField::CheckBox:\n        case CPDF_FormField::RadioButton: {\n                CFX_ByteArray statusArray;\n                if (bNotify && m_pForm->m_pFormNotify != NULL) {\n                    SaveCheckedFieldStatus(this, statusArray);\n                }\n                int iCount = CountControls();\n                if (iCount) {\n                    if (PDF_FormField_IsUnison(this)) {\n                        for(int i = 0; i < iCount; i++) {\n                            CheckControl(i, GetControl(i)->IsDefaultChecked(), FALSE);\n                        }\n                    } else {\n                        for (int i = 0; i < iCount; i ++) {\n                            CPDF_FormControl* pControl = GetControl(i);\n                            FX_BOOL bChecked = pControl->IsDefaultChecked();\n                            CheckControl(i, bChecked, FALSE);\n                        }\n                    }\n                }\n                if (bNotify && m_pForm->m_pFormNotify != NULL) {\n                    m_pForm->m_pFormNotify->AfterCheckedStatusChange(this, statusArray);\n                }\n            }\n            break;\n        case CPDF_FormField::ComboBox: {\n                CFX_WideString csValue;\n                ClearSelection();\n                int iIndex = GetDefaultSelectedItem();\n                if (iIndex >= 0) {\n                    csValue = GetOptionLabel(iIndex);\n                }\n                if (bNotify && m_pForm->m_pFormNotify != NULL) {\n                    int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);\n                    if (iRet < 0) {\n                        return FALSE;\n                    }\n                }\n                SetItemSelection(iIndex, TRUE);\n                if (bNotify && m_pForm->m_pFormNotify != NULL) {\n                    m_pForm->m_pFormNotify->AfterValueChange(this);\n                }\n            }\n            break;\n        case CPDF_FormField::ListBox: {\n                CFX_WideString csValue;\n                ClearSelection();\n                int iIndex = GetDefaultSelectedItem();\n                if (iIndex >= 0) {\n                    csValue = GetOptionLabel(iIndex);\n                }\n                if (bNotify && m_pForm->m_pFormNotify != NULL) {\n                    int iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);\n                    if (iRet < 0) {\n                        return FALSE;\n                    }\n                }\n                SetItemSelection(iIndex, TRUE);\n                if (bNotify && m_pForm->m_pFormNotify != NULL) {\n                    m_pForm->m_pFormNotify->AfterSelectionChange(this);\n                }\n            }\n            break;\n        case CPDF_FormField::Text:\n        case CPDF_FormField::RichText:\n        case CPDF_FormField::File:\n        default: {\n                CPDF_Object* pDV = FPDF_GetFieldAttr(m_pDict, \"DV\");\n                CFX_WideString csDValue;\n                if (pDV != NULL) {\n                    csDValue = pDV->GetUnicodeText();\n                }\n                CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, \"V\");\n                CFX_WideString csValue;\n                if (pV != NULL) {\n                    csValue = pV->GetUnicodeText();\n                }\n                CPDF_Object* pRV = FPDF_GetFieldAttr(m_pDict, \"RV\");\n                if (!pRV && (csDValue == csValue)) {\n                    return FALSE;\n                }\n                if (bNotify && m_pForm->m_pFormNotify != NULL) {\n                    int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csDValue);\n                    if (iRet < 0) {\n                        return FALSE;\n                    }\n                }\n                if (pDV == NULL) {\n                    m_pDict->RemoveAt(\"V\");\n                    m_pDict->RemoveAt(\"RV\");\n                } else {\n                    CPDF_Object* pClone = pDV->Clone();\n                    if (pClone == NULL) {\n                        return FALSE;\n                    }\n                    m_pDict->SetAt(\"V\", pClone);\n                    if(pRV) {\n                        CPDF_Object* pCloneR = pDV->Clone();\n                        m_pDict->SetAt(\"RV\", pCloneR);\n                    }\n                }\n                if (bNotify && m_pForm->m_pFormNotify != NULL) {\n                    m_pForm->m_pFormNotify->AfterValueChange(this);\n                }\n                m_pForm->m_bUpdated = TRUE;\n            }\n            break;\n    }\n    return TRUE;\n}\nint CPDF_FormField::GetControlIndex(const CPDF_FormControl* pControl)\n{\n    if (pControl == NULL) {\n        return -1;\n    }\n    int iCount = m_ControlList.GetSize();\n    for (int i = 0; i < iCount; i ++) {\n        CPDF_FormControl* pFind = (CPDF_FormControl*)m_ControlList.GetAt(i);\n        if (pFind == pControl) {\n            return i;\n        }\n    }\n    return -1;\n}\nint CPDF_FormField::GetFieldType()\n{\n    switch (m_Type) {\n        case PushButton:\n            return FIELDTYPE_PUSHBUTTON;\n        case CheckBox:\n            return FIELDTYPE_CHECKBOX;\n        case RadioButton:\n            return FIELDTYPE_RADIOBUTTON;\n        case ComboBox:\n            return FIELDTYPE_COMBOBOX;\n        case ListBox:\n            return FIELDTYPE_LISTBOX;\n        case Text:\n        case RichText:\n        case File:\n            return FIELDTYPE_TEXTFIELD;\n        case Sign:\n            return FIELDTYPE_SIGNATURE;\n        default:\n            break;\n    }\n    return FIELDTYPE_UNKNOWN;\n}\nCPDF_AAction CPDF_FormField::GetAdditionalAction()\n{\n    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, \"AA\");\n    if (pObj == NULL) {\n        return NULL;\n    }\n    return pObj->GetDict();\n}\nCFX_WideString CPDF_FormField::GetAlternateName()\n{\n    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, \"TU\");\n    if (pObj == NULL) {\n        return L\"\";\n    }\n    return pObj->GetUnicodeText();\n}\nCFX_WideString CPDF_FormField::GetMappingName()\n{\n    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, \"TM\");\n    if (pObj == NULL) {\n        return L\"\";\n    }\n    return pObj->GetUnicodeText();\n}\nFX_DWORD CPDF_FormField::GetFieldFlags()\n{\n    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, \"Ff\");\n    if (pObj == NULL) {\n        return 0;\n    }\n    return pObj->GetInteger();\n}\nCFX_ByteString CPDF_FormField::GetDefaultStyle()\n{\n    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, \"DS\");\n    if (pObj == NULL) {\n        return \"\";\n    }\n    return pObj->GetString();\n}\nCFX_WideString CPDF_FormField::GetRichTextString()\n{\n    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, \"RV\");\n    if (pObj == NULL) {\n        return L\"\";\n    }\n    return pObj->GetUnicodeText();\n}\nCFX_WideString CPDF_FormField::GetValue(FX_BOOL bDefault)\n{\n    if (GetType() == CheckBox || GetType() == RadioButton) {\n        return GetCheckValue(bDefault);\n    }\n    CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, bDefault ? \"DV\" : \"V\");\n    if (pValue == NULL) {\n        if (!bDefault) {\n            if (m_Type == RichText) {\n                pValue = FPDF_GetFieldAttr(m_pDict, \"V\");\n            }\n            if (pValue == NULL && m_Type != Text) {\n                pValue = FPDF_GetFieldAttr(m_pDict, \"DV\");\n            }\n        }\n        if (pValue == NULL) {\n            return CFX_WideString();\n        }\n    }\n    switch (pValue->GetType()) {\n        case PDFOBJ_STRING:\n        case PDFOBJ_STREAM:\n            return pValue->GetUnicodeText();\n        case PDFOBJ_ARRAY:\n            pValue = ((CPDF_Array*)pValue)->GetElementValue(0);\n            return pValue->GetUnicodeText();\n            break;\n    }\n    return CFX_WideString();\n}\nCFX_WideString CPDF_FormField::GetValue()\n{\n    return GetValue(FALSE);\n}\nCFX_WideString CPDF_FormField::GetDefaultValue()\n{\n    return GetValue(TRUE);\n}\nFX_BOOL CPDF_FormField::SetValue(const CFX_WideString& value, FX_BOOL bDefault, FX_BOOL bNotify)\n{\n    switch (m_Type) {\n        case CheckBox:\n        case RadioButton: {\n                SetCheckValue(value, bDefault, bNotify);\n                return TRUE;\n            }\n        case File:\n        case RichText:\n        case Text:\n        case ComboBox: {\n                CFX_WideString csValue = value;\n                if (bNotify && m_pForm->m_pFormNotify != NULL) {\n                    int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);\n                    if (iRet < 0) {\n                        return FALSE;\n                    }\n                }\n                int iIndex = FindOptionValue(csValue);\n                if (iIndex < 0) {\n                    CFX_ByteString bsEncodeText = PDF_EncodeText(csValue);\n                    m_pDict->SetAtString(bDefault ? \"DV\" : \"V\", bsEncodeText);\n                    if (m_Type == RichText && !bDefault) {\n                        m_pDict->SetAtString(\"RV\", bsEncodeText);\n                    }\n                    m_pDict->RemoveAt(\"I\");\n                } else {\n                    m_pDict->SetAtString(bDefault ? \"DV\" : \"V\", PDF_EncodeText(csValue));\n                    if (bDefault) {\n                    } else {\n                        ClearSelection();\n                        SetItemSelection(iIndex, TRUE);\n                    }\n                }\n                if (bNotify && m_pForm->m_pFormNotify != NULL) {\n                    m_pForm->m_pFormNotify->AfterValueChange(this);\n                }\n                m_pForm->m_bUpdated = TRUE;\n            }\n            break;\n        case ListBox: {\n                int iIndex = FindOptionValue(value);\n                if (iIndex < 0) {\n                    return FALSE;\n                }\n                if (bDefault && iIndex == GetDefaultSelectedItem()) {\n                    return FALSE;\n                }\n                if (bNotify && m_pForm->m_pFormNotify != NULL) {\n                    CFX_WideString csValue = value;\n                    int iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);\n                    if (iRet < 0) {\n                        return FALSE;\n                    }\n                }\n                if (bDefault) {\n                } else {\n                    ClearSelection();\n                    SetItemSelection(iIndex, TRUE);\n                }\n                if (bNotify && m_pForm->m_pFormNotify != NULL) {\n                    m_pForm->m_pFormNotify->AfterSelectionChange(this);\n                }\n                m_pForm->m_bUpdated = TRUE;\n                break;\n            }\n        default:\n            break;\n    }\n    if (CPDF_InterForm::m_bUpdateAP) {\n        UpdateAP(NULL);\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_FormField::SetValue(const CFX_WideString& value, FX_BOOL bNotify)\n{\n    return SetValue(value, FALSE, bNotify);\n}\nint CPDF_FormField::GetMaxLen()\n{\n    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, \"MaxLen\");\n    if (pObj == NULL) {\n        int iCount = m_ControlList.GetSize();\n        for (int i = 0; i < iCount; i ++) {\n            CPDF_FormControl* pControl = (CPDF_FormControl*)m_ControlList.GetAt(i);\n            if (pControl == NULL) {\n                continue;\n            }\n            CPDF_Dictionary* pWidgetDict = pControl->m_pWidgetDict;\n            if (pWidgetDict->KeyExist(\"MaxLen\")) {\n                return pWidgetDict->GetInteger(\"MaxLen\");\n            }\n        }\n        return 0;\n    }\n    return pObj->GetInteger();\n}\nint CPDF_FormField::CountSelectedItems()\n{\n    CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, \"V\");\n    if (pValue == NULL) {\n        pValue = FPDF_GetFieldAttr(m_pDict, \"I\");\n        if (pValue == NULL) {\n            return 0;\n        }\n    }\n    if (pValue->GetType() == PDFOBJ_STRING) {\n        if (pValue->GetString().IsEmpty()) {\n            return 0;\n        }\n        return 1;\n    }\n    if (pValue->GetType() == PDFOBJ_NUMBER) {\n        if (pValue->GetString().IsEmpty()) {\n            return 0;\n        }\n        return 1;\n    }\n    if (pValue->GetType() != PDFOBJ_ARRAY) {\n        return 0;\n    }\n    return ((CPDF_Array*)pValue)->GetCount();\n}\nint CPDF_FormField::GetSelectedIndex(int index)\n{\n    CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, \"V\");\n    if (pValue == NULL) {\n        pValue = FPDF_GetFieldAttr(m_pDict, \"I\");\n        if (pValue == NULL) {\n            return -1;\n        }\n    }\n    CFX_WideString sel_value;\n    if (pValue->GetType() == PDFOBJ_STRING) {\n        if (index != 0) {\n            return -1;\n        }\n        sel_value = pValue->GetUnicodeText();\n    } else if (pValue->GetType() == PDFOBJ_NUMBER) {\n        return pValue->GetInteger();\n    } else {\n        if (pValue->GetType() != PDFOBJ_ARRAY) {\n            return -1;\n        }\n        if (index < 0) {\n            return -1;\n        }\n        CPDF_Object* elementValue = ((CPDF_Array*)pValue)->GetElementValue(index);\n        sel_value = elementValue ? elementValue->GetUnicodeText() : CFX_WideString();\n    }\n    if (index < CountSelectedOptions()) {\n        int iOptIndex = GetSelectedOptionIndex(index);\n        CFX_WideString csOpt = GetOptionValue(iOptIndex);\n        if (csOpt == sel_value) {\n            return iOptIndex;\n        }\n    }\n    int nOpts = CountOptions();\n    for (int i = 0; i < nOpts; i ++) {\n        if (sel_value == GetOptionValue(i)) {\n            return i;\n        }\n    }\n    return -1;\n}\nFX_BOOL CPDF_FormField::ClearSelection(FX_BOOL bNotify)\n{\n    if (bNotify && m_pForm->m_pFormNotify != NULL) {\n        int iRet = 0;\n        CFX_WideString csValue;\n        int iIndex = GetSelectedIndex(0);\n        if (iIndex >= 0) {\n            csValue = GetOptionLabel(iIndex);\n        }\n        if (GetType() == ListBox) {\n            iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);\n        }\n        if (GetType() == ComboBox) {\n            iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);\n        }\n        if (iRet < 0) {\n            return FALSE;\n        }\n    }\n    m_pDict->RemoveAt(\"V\");\n    m_pDict->RemoveAt(\"I\");\n    if (bNotify && m_pForm->m_pFormNotify != NULL) {\n        if (GetType() == ListBox) {\n            m_pForm->m_pFormNotify->AfterSelectionChange(this);\n        }\n        if (GetType() == ComboBox) {\n            m_pForm->m_pFormNotify->AfterValueChange(this);\n        }\n    }\n    if (CPDF_InterForm::m_bUpdateAP) {\n        UpdateAP(NULL);\n    }\n    m_pForm->m_bUpdated = TRUE;\n    return TRUE;\n}\nFX_BOOL CPDF_FormField::IsItemSelected(int index)\n{\n    ASSERT(GetType() == ComboBox || GetType() == ListBox);\n    if (index < 0 || index >= CountOptions()) {\n        return FALSE;\n    }\n    if (IsOptionSelected(index)) {\n        return TRUE;\n    }\n    CFX_WideString opt_value = GetOptionValue(index);\n    CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, \"V\");\n    if (pValue == NULL) {\n        pValue = FPDF_GetFieldAttr(m_pDict, \"I\");\n        if (pValue == NULL) {\n            return FALSE;\n        }\n    }\n    if (pValue->GetType() == PDFOBJ_STRING) {\n        if (pValue->GetUnicodeText() == opt_value) {\n            return TRUE;\n        }\n        return FALSE;\n    }\n    if (pValue->GetType() == PDFOBJ_NUMBER) {\n        if (pValue->GetString().IsEmpty()) {\n            return FALSE;\n        }\n        if (pValue->GetInteger() == index) {\n            return TRUE;\n        }\n        return FALSE;\n    }\n    if (pValue->GetType() != PDFOBJ_ARRAY) {\n        return FALSE;\n    }\n    CPDF_Array* pArray = (CPDF_Array*)pValue;\n    int iPos = -1;\n    for (int j = 0; j < CountSelectedOptions(); j ++) {\n        if (GetSelectedOptionIndex(j) == index) {\n            iPos = j;\n            break;\n        }\n    }\n    for (FX_DWORD i = 0; i < pArray->GetCount(); i ++)\n        if (pArray->GetElementValue(i)->GetUnicodeText() == opt_value && (int)i == iPos) {\n            return TRUE;\n        }\n    return FALSE;\n}\nFX_BOOL CPDF_FormField::SetItemSelection(int index, FX_BOOL bSelected, FX_BOOL bNotify)\n{\n    ASSERT(GetType() == ComboBox || GetType() == ListBox);\n    if (index < 0 || index >= CountOptions()) {\n        return FALSE;\n    }\n    CFX_WideString opt_value = GetOptionValue(index);\n    if (bNotify && m_pForm->m_pFormNotify != NULL) {\n        int iRet = 0;\n        if (GetType() == ListBox) {\n            iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, opt_value);\n        }\n        if (GetType() == ComboBox) {\n            iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, opt_value);\n        }\n        if (iRet < 0) {\n            return FALSE;\n        }\n    }\n    if (!bSelected) {\n        CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, \"V\");\n        if (pValue != NULL) {\n            if (m_Type == ListBox) {\n                SelectOption(index, FALSE);\n                if (pValue->GetType() == PDFOBJ_STRING) {\n                    if (pValue->GetUnicodeText() == opt_value) {\n                        m_pDict->RemoveAt(\"V\");\n                    }\n                } else if (pValue->GetType() == PDFOBJ_ARRAY) {\n                    CPDF_Array* pArray = CPDF_Array::Create();\n                    if (pArray == NULL) {\n                        return FALSE;\n                    }\n                    int iCount = CountOptions();\n                    for (int i = 0; i < iCount; i ++) {\n                        if (i != index) {\n                            if (IsItemSelected(i)) {\n                                opt_value = GetOptionValue(i);\n                                pArray->AddString(PDF_EncodeText(opt_value));\n                            }\n                        }\n                    }\n                    if (pArray->GetCount() < 1) {\n                        pArray->Release();\n                    } else {\n                        m_pDict->SetAt(\"V\", pArray);\n                    }\n                }\n            } else if (m_Type == ComboBox) {\n                m_pDict->RemoveAt(\"V\");\n                m_pDict->RemoveAt(\"I\");\n            }\n        }\n    } else {\n        if (m_Type == ListBox) {\n            SelectOption(index, TRUE);\n            if (!(m_Flags & FORMLIST_MULTISELECT)) {\n                m_pDict->SetAtString(\"V\", PDF_EncodeText(opt_value, opt_value.GetLength()));\n            } else {\n                CPDF_Array* pArray = CPDF_Array::Create();\n                if (pArray == NULL) {\n                    return FALSE;\n                }\n                FX_BOOL bSelected;\n                int iCount = CountOptions();\n                for (int i = 0; i < iCount; i ++) {\n                    if (i != index) {\n                        bSelected = IsItemSelected(i);\n                    } else {\n                        bSelected = TRUE;\n                    }\n                    if (bSelected) {\n                        opt_value = GetOptionValue(i);\n                        pArray->AddString(PDF_EncodeText(opt_value));\n                    }\n                }\n                m_pDict->SetAt(\"V\", pArray);\n            }\n        } else if (m_Type == ComboBox) {\n            m_pDict->SetAtString(\"V\", PDF_EncodeText(opt_value, opt_value.GetLength()));\n            CPDF_Array* pI = CPDF_Array::Create();\n            if (pI == NULL) {\n                return FALSE;\n            }\n            pI->AddInteger(index);\n            m_pDict->SetAt(\"I\", pI);\n        }\n    }\n    if (bNotify && m_pForm->m_pFormNotify != NULL) {\n        if (GetType() == ListBox) {\n            m_pForm->m_pFormNotify->AfterSelectionChange(this);\n        }\n        if (GetType() == ComboBox) {\n            m_pForm->m_pFormNotify->AfterValueChange(this);\n        }\n    }\n    if (CPDF_InterForm::m_bUpdateAP) {\n        UpdateAP(NULL);\n    }\n    m_pForm->m_bUpdated = TRUE;\n    return TRUE;\n}\nFX_BOOL CPDF_FormField::IsItemDefaultSelected(int index)\n{\n    ASSERT(GetType() == ComboBox || GetType() == ListBox);\n    if (index < 0 || index >= CountOptions()) {\n        return FALSE;\n    }\n    int iDVIndex = GetDefaultSelectedItem();\n    if (iDVIndex < 0) {\n        return FALSE;\n    }\n    return (iDVIndex == index);\n}\nint CPDF_FormField::GetDefaultSelectedItem()\n{\n    ASSERT(GetType() == ComboBox || GetType() == ListBox);\n    CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, \"DV\");\n    if (pValue == NULL) {\n        return -1;\n    }\n    CFX_WideString csDV = pValue->GetUnicodeText();\n    if (csDV.IsEmpty()) {\n        return -1;\n    }\n    int iCount = CountOptions();\n    for (int i = 0; i < iCount; i ++) {\n        if (csDV == GetOptionValue(i)) {\n            return i;\n        }\n    }\n    return -1;\n}\nvoid CPDF_FormField::UpdateAP(CPDF_FormControl* pControl)\n{\n    if (m_Type == PushButton) {\n        return;\n    }\n    if (m_Type == RadioButton || m_Type == CheckBox) {\n        return;\n    }\n    if (!m_pForm->m_bGenerateAP) {\n        return;\n    }\n    for (int i = 0; i < CountControls(); i ++) {\n        CPDF_FormControl* pControl = GetControl(i);\n        FPDF_GenerateAP(m_pForm->m_pDocument, pControl->m_pWidgetDict);\n    }\n}\nint CPDF_FormField::CountOptions()\n{\n    CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, \"Opt\");\n    if (pValue == NULL || pValue->GetType() != PDFOBJ_ARRAY) {\n        return 0;\n    }\n    return ((CPDF_Array*)pValue)->GetCount();\n}\nCFX_WideString CPDF_FormField::GetOptionText(int index, int sub_index)\n{\n    CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, \"Opt\");\n    if (pValue == NULL || pValue->GetType() != PDFOBJ_ARRAY) {\n        return CFX_WideString();\n    }\n    CPDF_Object* pOption = ((CPDF_Array*)pValue)->GetElementValue(index);\n    if (pOption == NULL) {\n        return CFX_WideString();\n    }\n    if (pOption->GetType() == PDFOBJ_ARRAY) {\n        pOption = ((CPDF_Array*)pOption)->GetElementValue(sub_index);\n    }\n    if (pOption == NULL || pOption->GetType() != PDFOBJ_STRING) {\n        return CFX_WideString();\n    }\n    return ((CPDF_String*)pOption)->GetUnicodeText();\n}\nCFX_WideString CPDF_FormField::GetOptionLabel(int index)\n{\n    return GetOptionText(index, 1);\n}\nCFX_WideString CPDF_FormField::GetOptionValue(int index)\n{\n    return GetOptionText(index, 0);\n}\nint CPDF_FormField::FindOption(CFX_WideString csOptLabel)\n{\n    int iCount = CountOptions();\n    for (int i = 0; i < iCount; i ++) {\n        CFX_WideString csValue = GetOptionValue(i);\n        if (csValue == csOptLabel) {\n            return i;\n        }\n    }\n    return -1;\n}\nint CPDF_FormField::FindOptionValue(FX_LPCWSTR csOptValue, int iStartIndex)\n{\n    if (iStartIndex < 0) {\n        iStartIndex = 0;\n    }\n    int iCount = CountOptions();\n    for (; iStartIndex < iCount; iStartIndex ++) {\n        CFX_WideString csValue = GetOptionValue(iStartIndex);\n        if (csValue == csOptValue) {\n            return iStartIndex;\n        }\n    }\n    return -1;\n}\nFX_BOOL CPDF_FormField::CheckControl(int iControlIndex, FX_BOOL bChecked, FX_BOOL bNotify)\n{\n    ASSERT(GetType() == CheckBox || GetType() == RadioButton);\n    CPDF_FormControl* pControl = GetControl(iControlIndex);\n    if (pControl == NULL) {\n        return FALSE;\n    }\n    if (!bChecked && pControl->IsChecked() == bChecked) {\n        return FALSE;\n    }\n    CFX_ByteArray statusArray;\n    if (bNotify && m_pForm->m_pFormNotify != NULL) {\n        SaveCheckedFieldStatus(this, statusArray);\n    }\n    CFX_WideString csWExport =  pControl->GetExportValue();\n    CFX_ByteString csBExport = PDF_EncodeText(csWExport);\n    int iCount = CountControls();\n    FX_BOOL bUnison = PDF_FormField_IsUnison(this);\n    for (int i = 0; i < iCount; i ++) {\n        CPDF_FormControl* pCtrl = GetControl(i);\n        if (bUnison) {\n            CFX_WideString csEValue = pCtrl->GetExportValue();\n            if (csEValue == csWExport) {\n                if (pCtrl->GetOnStateName() == pControl->GetOnStateName()) {\n                    pCtrl->CheckControl(bChecked);\n                } else if (bChecked) {\n                    pCtrl->CheckControl(FALSE);\n                }\n            } else if (bChecked) {\n                pCtrl->CheckControl(FALSE);\n            }\n        } else {\n            if (i == iControlIndex) {\n                pCtrl->CheckControl(bChecked);\n            } else if (bChecked) {\n                pCtrl->CheckControl(FALSE);\n            }\n        }\n    }\n    CPDF_Object* pOpt = FPDF_GetFieldAttr(m_pDict, \"Opt\");\n    if (pOpt == NULL || pOpt->GetType() != PDFOBJ_ARRAY) {\n        if (bChecked) {\n            m_pDict->SetAtName(\"V\", csBExport);\n        } else {\n            CFX_ByteString csV;\n            CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, \"V\");\n            if (pV != NULL) {\n                csV = pV->GetString();\n            }\n            if (csV == csBExport) {\n                m_pDict->SetAtName(\"V\", \"Off\");\n            }\n        }\n    } else if (bChecked) {\n        CFX_ByteString csIndex;\n        csIndex.Format(\"%d\", iControlIndex);\n        m_pDict->SetAtName(\"V\", csIndex);\n    }\n    if (bNotify && m_pForm->m_pFormNotify != NULL) {\n        m_pForm->m_pFormNotify->AfterCheckedStatusChange(this, statusArray);\n    }\n    m_pForm->m_bUpdated = TRUE;\n    return TRUE;\n}\nCFX_WideString CPDF_FormField::GetCheckValue(FX_BOOL bDefault)\n{\n    ASSERT(GetType() == CheckBox || GetType() == RadioButton);\n    CFX_WideString csExport = L\"Off\";\n    FX_BOOL bChecked;\n    int iCount = CountControls();\n    for (int i = 0; i < iCount; i ++) {\n        CPDF_FormControl* pControl = GetControl(i);\n        if (bDefault) {\n            bChecked = pControl->IsDefaultChecked();\n        } else {\n            bChecked = pControl->IsChecked();\n        }\n        if (bChecked) {\n            csExport = pControl->GetExportValue();\n            break;\n        }\n    }\n    return csExport;\n}\nFX_BOOL CPDF_FormField::SetCheckValue(const CFX_WideString& value, FX_BOOL bDefault, FX_BOOL bNotify)\n{\n    ASSERT(GetType() == CheckBox || GetType() == RadioButton);\n    CFX_ByteArray statusArray;\n    if (bNotify && m_pForm->m_pFormNotify != NULL) {\n        SaveCheckedFieldStatus(this, statusArray);\n    }\n    int iCount = CountControls();\n    for (int i = 0; i < iCount; i ++) {\n        CPDF_FormControl* pControl = GetControl(i);\n        CFX_WideString csExport = pControl->GetExportValue();\n        if (csExport == value) {\n            if (bDefault) {\n            } else {\n                CheckControl(GetControlIndex(pControl), TRUE);\n            }\n            break;\n        } else {\n            if (bDefault) {\n            } else {\n                CheckControl(GetControlIndex(pControl), FALSE);\n            }\n        }\n    }\n    if (bNotify && m_pForm->m_pFormNotify != NULL) {\n        m_pForm->m_pFormNotify->AfterCheckedStatusChange(this, statusArray);\n    }\n    m_pForm->m_bUpdated = TRUE;\n    return TRUE;\n}\nint CPDF_FormField::GetTopVisibleIndex()\n{\n    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, \"TI\");\n    if (pObj == NULL) {\n        return 0;\n    }\n    return pObj->GetInteger();\n}\nint CPDF_FormField::CountSelectedOptions()\n{\n    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, \"I\");\n    if (pObj == NULL) {\n        return 0;\n    }\n    CPDF_Array* pArray = pObj->GetArray();\n    if (pArray == NULL) {\n        return 0;\n    }\n    return (int)pArray->GetCount();\n}\nint CPDF_FormField::GetSelectedOptionIndex(int index)\n{\n    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, \"I\");\n    if (pObj == NULL) {\n        return -1;\n    }\n    CPDF_Array* pArray = pObj->GetArray();\n    if (pArray == NULL) {\n        return -1;\n    }\n    int iCount = (int)pArray->GetCount();\n    if (iCount > 0 && index < iCount) {\n        return pArray->GetInteger(index);\n    }\n    return -1;\n}\nFX_BOOL CPDF_FormField::IsOptionSelected(int iOptIndex)\n{\n    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, \"I\");\n    if (pObj == NULL) {\n        return FALSE;\n    }\n    CPDF_Array* pArray = pObj->GetArray();\n    if (pArray == NULL) {\n        return FALSE;\n    }\n    int iCount = (int)pArray->GetCount();\n    for (int i = 0; i < iCount; i ++) {\n        if (pArray->GetInteger(i) == iOptIndex) {\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nFX_BOOL CPDF_FormField::SelectOption(int iOptIndex, FX_BOOL bSelected, FX_BOOL bNotify)\n{\n    CPDF_Array* pArray = m_pDict->GetArray(\"I\");\n    if (pArray == NULL) {\n        if (!bSelected) {\n            return TRUE;\n        }\n        pArray = CPDF_Array::Create();\n        if (pArray == NULL) {\n            return FALSE;\n        }\n        m_pDict->SetAt(\"I\", pArray);\n    }\n    FX_BOOL bReturn = FALSE;\n    for (int i = 0; i < (int)pArray->GetCount(); i ++) {\n        int iFind = pArray->GetInteger(i);\n        if (iFind == iOptIndex) {\n            if (bSelected) {\n                return TRUE;\n            }\n            if (bNotify && m_pForm->m_pFormNotify != NULL) {\n                int iRet = 0;\n                CFX_WideString csValue = GetOptionLabel(iOptIndex);\n                if (GetType() == ListBox) {\n                    iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);\n                }\n                if (GetType() == ComboBox) {\n                    iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);\n                }\n                if (iRet < 0) {\n                    return FALSE;\n                }\n            }\n            pArray->RemoveAt(i);\n            bReturn = TRUE;\n            break;\n        } else if (iFind > iOptIndex) {\n            if (!bSelected) {\n                continue;\n            }\n            if (bNotify && m_pForm->m_pFormNotify != NULL) {\n                int iRet = 0;\n                CFX_WideString csValue = GetOptionLabel(iOptIndex);\n                if (GetType() == ListBox) {\n                    iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);\n                }\n                if (GetType() == ComboBox) {\n                    iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);\n                }\n                if (iRet < 0) {\n                    return FALSE;\n                }\n            }\n            CPDF_Number* pNum = CPDF_Number::Create(iOptIndex);\n            if (pNum == NULL) {\n                return FALSE;\n            }\n            pArray->InsertAt(i, pNum);\n            bReturn = TRUE;\n            break;\n        }\n    }\n    if (!bReturn) {\n        if (bSelected) {\n            pArray->AddInteger(iOptIndex);\n        }\n        if (pArray->GetCount() == 0) {\n            m_pDict->RemoveAt(\"I\");\n        }\n    }\n    if (bNotify && m_pForm->m_pFormNotify != NULL) {\n        if (GetType() == ListBox) {\n            m_pForm->m_pFormNotify->AfterSelectionChange(this);\n        }\n        if (GetType() == ComboBox) {\n            m_pForm->m_pFormNotify->AfterValueChange(this);\n        }\n    }\n    m_pForm->m_bUpdated = TRUE;\n    return TRUE;\n}\nFX_BOOL CPDF_FormField::ClearSelectedOptions(FX_BOOL bNotify)\n{\n    if (bNotify && m_pForm->m_pFormNotify != NULL) {\n        int iRet = 0;\n        CFX_WideString csValue;\n        int iIndex = GetSelectedIndex(0);\n        if (iIndex >= 0) {\n            csValue = GetOptionLabel(iIndex);\n        }\n        if (GetType() == ListBox) {\n            iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);\n        }\n        if (GetType() == ComboBox) {\n            iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);\n        }\n        if (iRet < 0) {\n            return FALSE;\n        }\n    }\n    m_pDict->RemoveAt(\"I\");\n    if (bNotify && m_pForm->m_pFormNotify != NULL) {\n        if (GetType() == ListBox) {\n            m_pForm->m_pFormNotify->AfterSelectionChange(this);\n        }\n        if (GetType() == ComboBox) {\n            m_pForm->m_pFormNotify->AfterValueChange(this);\n        }\n    }\n    m_pForm->m_bUpdated = TRUE;\n    return TRUE;\n}\nvoid CPDF_FormField::LoadDA()\n{\n    CFX_ByteString DA;\n    if (CPDF_Object* pObj_t = FPDF_GetFieldAttr(m_pDict, \"DA\")) {\n        DA = pObj_t->GetString();\n    }\n    if (DA.IsEmpty() && m_pForm->m_pFormDict) {\n        DA = m_pForm->m_pFormDict->GetString(\"DA\");\n    }\n    if (DA.IsEmpty()) {\n        return;\n    }\n    CPDF_SimpleParser syntax(DA);\n    syntax.FindTagParam(\"Tf\", 2);\n    CFX_ByteString font_name = syntax.GetWord();\n    CPDF_Dictionary* pFontDict = NULL;\n    if (m_pForm->m_pFormDict && m_pForm->m_pFormDict->GetDict(\"DR\") &&\n        m_pForm->m_pFormDict->GetDict(\"DR\")->GetDict(\"Font\") )\n    pFontDict = m_pForm->m_pFormDict->GetDict(\"DR\")->GetDict(\"Font\")->GetDict(font_name);\n\n    if (pFontDict == NULL) {\n        return;\n    }\n    m_pFont = m_pForm->m_pDocument->LoadFont(pFontDict);\n    m_FontSize = FX_atof(syntax.GetWord());\n}\n"
  },
  {
    "path": "core/src/fpdfdoc/doc_link.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fpdfdoc/fpdf_doc.h\"\nCPDF_LinkList::~CPDF_LinkList()\n{\n    FX_POSITION pos = m_PageMap.GetStartPosition();\n    while (pos) {\n        FX_LPVOID key, value;\n        m_PageMap.GetNextAssoc(pos, key, value);\n        delete (CFX_PtrArray*)value;\n    }\n}\nCFX_PtrArray* CPDF_LinkList::GetPageLinks(CPDF_Page* pPage)\n{\n    FX_DWORD objnum = pPage->m_pFormDict->GetObjNum();\n    if (objnum == 0) {\n        return NULL;\n    }\n    CFX_PtrArray* pPageLinkList = NULL;\n    if (!m_PageMap.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, (FX_LPVOID&)pPageLinkList)) {\n        pPageLinkList = FX_NEW CFX_PtrArray;\n        if (pPageLinkList == NULL) {\n            return NULL;\n        }\n        m_PageMap.SetAt((FX_LPVOID)(FX_UINTPTR)objnum, pPageLinkList);\n        LoadPageLinks(pPage, pPageLinkList);\n    }\n    return pPageLinkList;\n}\nint CPDF_LinkList::CountLinks(CPDF_Page* pPage)\n{\n    CFX_PtrArray* pPageLinkList = GetPageLinks(pPage);\n    if (pPageLinkList == NULL) {\n        return 0;\n    }\n    return pPageLinkList->GetSize();\n}\nCPDF_Link CPDF_LinkList::GetLink(CPDF_Page* pPage, int index)\n{\n    CFX_PtrArray* pPageLinkList = GetPageLinks(pPage);\n    if (pPageLinkList == NULL) {\n        return NULL;\n    }\n    return (CPDF_Dictionary*)pPageLinkList->GetAt(index);\n}\nCPDF_Link CPDF_LinkList::GetLinkAtPoint(CPDF_Page* pPage, FX_FLOAT pdf_x, FX_FLOAT pdf_y)\n{\n    CFX_PtrArray* pPageLinkList = GetPageLinks(pPage);\n    if (pPageLinkList == NULL) {\n        return NULL;\n    }\n    int size = pPageLinkList->GetSize();\n    for (int i = 0; i < size; i ++) {\n        CPDF_Link Link = (CPDF_Dictionary*)pPageLinkList->GetAt(i);\n        CPDF_Rect rect = Link.GetRect();\n        if (rect.Contains(pdf_x, pdf_y)) {\n            return Link;\n        }\n    }\n    return NULL;\n}\nvoid CPDF_LinkList::LoadPageLinks(CPDF_Page* pPage, CFX_PtrArray* pList)\n{\n    CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray(\"Annots\");\n    if (pAnnotList == NULL) {\n        return;\n    }\n    for (FX_DWORD i = 0; i < pAnnotList->GetCount(); i ++) {\n        CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i);\n        if (pAnnot == NULL) {\n            continue;\n        }\n        if (pAnnot->GetString(\"Subtype\") != \"Link\") {\n            continue;\n        }\n        pList->Add(pAnnot);\n    }\n}\nCPDF_Rect CPDF_Link::GetRect()\n{\n    return m_pDict->GetRect(\"Rect\");\n}\nCPDF_Dest CPDF_Link::GetDest(CPDF_Document* pDoc)\n{\n    CPDF_Object* pDest = m_pDict->GetElementValue(\"Dest\");\n    if (pDest == NULL) {\n        return NULL;\n    }\n    if (pDest->GetType() == PDFOBJ_STRING || pDest->GetType() == PDFOBJ_NAME) {\n        CPDF_NameTree name_tree(pDoc, FX_BSTRC(\"Dests\"));\n        CFX_ByteStringC name = pDest->GetString();\n        return name_tree.LookupNamedDest(pDoc, name);\n    } else if (pDest->GetType() == PDFOBJ_ARRAY) {\n        return (CPDF_Array*)pDest;\n    }\n    return NULL;\n}\nCPDF_Action CPDF_Link::GetAction()\n{\n    return m_pDict->GetDict(\"A\");\n}\n"
  },
  {
    "path": "core/src/fpdfdoc/doc_metadata.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fpdfdoc/fpdf_doc.h\"\n#include \"../../include/fxcrt/fx_xml.h\"\ntypedef struct _PDFDOC_METADATA {\n    CPDF_Document *m_pDoc;\n    CXML_Element *m_pXmlElmnt;\n    CXML_Element *m_pElmntRdf;\n    CFX_CMapByteStringToPtr *m_pStringMap;\n} PDFDOC_METADATA, * PDFDOC_LPMETADATA;\ntypedef PDFDOC_METADATA const * PDFDOC_LPCMETADATA;\nconst FX_LPCSTR gs_FPDFDOC_Metadata_Titles[] = {\n    \"Title\", \"title\",\n    \"Subject\", \"description\",\n    \"Author\", \"creator\",\n    \"Keywords\", \"Keywords\",\n    \"Producer\", \"Producer\",\n    \"Creator\", \"CreatorTool\",\n    \"CreationDate\", \"CreateDate\",\n    \"ModDate\", \"ModifyDate\",\n    \"MetadataDate\", \"MetadataDate\"\n};\nCPDF_Metadata::CPDF_Metadata()\n{\n    m_pData = FX_Alloc(PDFDOC_METADATA, 1);\n    CFX_CMapByteStringToPtr *&pStringMap = ((PDFDOC_LPMETADATA)m_pData)->m_pStringMap;\n    pStringMap = FX_NEW(CFX_CMapByteStringToPtr);\n    if (pStringMap != NULL) {\n        CFX_ByteString bstr;\n        for (int i = 0; i < 18; i += 2) {\n            bstr = gs_FPDFDOC_Metadata_Titles[i];\n            pStringMap->AddValue(bstr, (void*)gs_FPDFDOC_Metadata_Titles[i + 1]);\n        }\n    }\n}\nCPDF_Metadata::~CPDF_Metadata()\n{\n    FXSYS_assert(m_pData != NULL);\n    CXML_Element *&p = ((PDFDOC_LPMETADATA)m_pData)->m_pXmlElmnt;\n    if (p) {\n        delete p;\n    }\n    CFX_CMapByteStringToPtr *pStringMap = ((PDFDOC_LPMETADATA)m_pData)->m_pStringMap;\n    if (pStringMap) {\n        pStringMap->RemoveAll();\n        FX_Free(pStringMap);\n    }\n    FX_Free(m_pData);\n}\nvoid CPDF_Metadata::LoadDoc(CPDF_Document *pDoc)\n{\n    FXSYS_assert(pDoc != NULL);\n    ((PDFDOC_LPMETADATA)m_pData)->m_pDoc = pDoc;\n    CPDF_Dictionary *pRoot = pDoc->GetRoot();\n    CPDF_Stream *pStream = pRoot->GetStream(FX_BSTRC(\"Metadata\"));\n    if (!pStream) {\n        return;\n    }\n    CPDF_StreamAcc acc;\n    acc.LoadAllData(pStream, FALSE);\n    int size = acc.GetSize();\n    FX_LPCBYTE pBuf = acc.GetData();\n    CXML_Element *&pXmlElmnt = ((PDFDOC_LPMETADATA)m_pData)->m_pXmlElmnt;\n    pXmlElmnt = CXML_Element::Parse(pBuf, size);\n    if (!pXmlElmnt) {\n        return;\n    }\n    CXML_Element *&pElmntRdf = ((PDFDOC_LPMETADATA)m_pData)->m_pElmntRdf;\n    if (pXmlElmnt->GetTagName() == FX_BSTRC(\"RDF\")) {\n        pElmntRdf = pXmlElmnt;\n    } else {\n        pElmntRdf = pXmlElmnt->GetElement(NULL, FX_BSTRC(\"RDF\"));\n    }\n}\nFX_INT32 CPDF_Metadata::GetString(FX_BSTR bsItem, CFX_WideString &wsStr)\n{\n    if (!((PDFDOC_LPMETADATA)m_pData)->m_pXmlElmnt) {\n        return -1;\n    }\n    if (!((PDFDOC_LPMETADATA)m_pData)->m_pStringMap) {\n        return -1;\n    }\n    void *szTag;\n    if (!((PDFDOC_LPMETADATA)m_pData)->m_pStringMap->Lookup(bsItem, szTag)) {\n        return -1;\n    }\n    CFX_ByteString bsTag = (FX_LPCSTR)szTag;\n    wsStr = L\"\";\n    CXML_Element *pElmntRdf = ((PDFDOC_LPMETADATA)m_pData)->m_pElmntRdf;\n    if (!pElmntRdf) {\n        return -1;\n    }\n    int nChild = pElmntRdf->CountChildren();\n    for (int i = 0; i < nChild; i++) {\n        CXML_Element *pTag = pElmntRdf->GetElement(NULL, FX_BSTRC(\"Description\"), i);\n        if (!pTag) {\n            continue;\n        }\n        if (bsItem == FX_BSTRC(\"Title\") || bsItem == FX_BSTRC(\"Subject\")) {\n            CXML_Element *pElmnt = pTag->GetElement(NULL, bsTag);\n            if (!pElmnt) {\n                continue;\n            }\n            pElmnt = pElmnt->GetElement(NULL, FX_BSTRC(\"Alt\"));\n            if (!pElmnt) {\n                continue;\n            }\n            pElmnt = pElmnt->GetElement(NULL, FX_BSTRC(\"li\"));\n            if (!pElmnt) {\n                continue;\n            }\n            wsStr = pElmnt->GetContent(0);\n            return wsStr.GetLength();\n        } else if (bsItem == FX_BSTRC(\"Author\")) {\n            CXML_Element *pElmnt = pTag->GetElement(NULL, bsTag);\n            if (!pElmnt) {\n                continue;\n            }\n            pElmnt = pElmnt->GetElement(NULL, FX_BSTRC(\"Seq\"));\n            if (!pElmnt) {\n                continue;\n            }\n            pElmnt = pElmnt->GetElement(NULL, FX_BSTRC(\"li\"));\n            if (!pElmnt) {\n                continue;\n            }\n            wsStr = pElmnt->GetContent(0);\n            return wsStr.GetLength();\n        } else {\n            CXML_Element *pElmnt = pTag->GetElement(NULL, bsTag);\n            if (!pElmnt) {\n                continue;\n            }\n            wsStr = pElmnt->GetContent(0);\n            return wsStr.GetLength();\n        }\n    }\n    return -1;\n}\nCXML_Element* CPDF_Metadata::GetRoot() const\n{\n    return ((PDFDOC_LPMETADATA)m_pData)->m_pXmlElmnt;\n}\nCXML_Element* CPDF_Metadata::GetRDF() const\n{\n    return ((PDFDOC_LPMETADATA)m_pData)->m_pElmntRdf;\n}\n"
  },
  {
    "path": "core/src/fpdfdoc/doc_ocg.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fpdfdoc/fpdf_doc.h\"\nstatic FX_INT32 FPDFDOC_OCG_FindGroup(const CPDF_Object *pObject, const CPDF_Dictionary *pGroupDict)\n{\n    if (pObject == NULL || pGroupDict == NULL) {\n        return -1;\n    }\n    FX_INT32 iType = pObject->GetType();\n    if (iType == PDFOBJ_ARRAY) {\n        FX_DWORD dwCount = ((CPDF_Array*)pObject)->GetCount();\n        for (FX_DWORD i = 0; i < dwCount; i++) {\n            if (((CPDF_Array*)pObject)->GetDict(i) == pGroupDict) {\n                return i;\n            }\n        }\n        return -1;\n    }\n    if (pObject->GetDict() == pGroupDict) {\n        return 0;\n    }\n    return -1;\n}\nstatic FX_BOOL FPDFDOC_OCG_HasIntent(const CPDF_Dictionary *pDict, FX_BSTR csElement, FX_BSTR csDef = FX_BSTRC(\"\"))\n{\n    FXSYS_assert(pDict != NULL);\n    CPDF_Object *pIntent = pDict->GetElementValue(FX_BSTRC(\"Intent\"));\n    if (pIntent == NULL) {\n        return csElement == csDef;\n    }\n    CFX_ByteString bsIntent;\n    if (pIntent->GetType() == PDFOBJ_ARRAY) {\n        FX_DWORD dwCount = ((CPDF_Array*)pIntent)->GetCount();\n        for (FX_DWORD i = 0; i < dwCount; i++) {\n            bsIntent = ((CPDF_Array*)pIntent)->GetString(i);\n            if (bsIntent == FX_BSTRC(\"All\") || bsIntent == csElement) {\n                return TRUE;\n            }\n        }\n        return FALSE;\n    }\n    bsIntent = pIntent->GetString();\n    return bsIntent == FX_BSTRC(\"All\") || bsIntent == csElement;\n}\nstatic CPDF_Dictionary* FPDFDOC_OCG_GetConfig(CPDF_Document *pDoc, const CPDF_Dictionary *pOCGDict, FX_BSTR bsState)\n{\n    FXSYS_assert(pDoc && pOCGDict);\n    CPDF_Dictionary *pOCProperties = pDoc->GetRoot()->GetDict(FX_BSTRC(\"OCProperties\"));\n    if (!pOCProperties) {\n        return NULL;\n    }\n    CPDF_Array *pOCGs = pOCProperties->GetArray(FX_BSTRC(\"OCGs\"));\n    if (!pOCGs) {\n        return NULL;\n    }\n    if (FPDFDOC_OCG_FindGroup(pOCGs, pOCGDict) < 0) {\n        return NULL;\n    }\n    CPDF_Dictionary *pConfig = pOCProperties->GetDict(FX_BSTRC(\"D\"));\n    CPDF_Array *pConfigs = pOCProperties->GetArray(FX_BSTRC(\"Configs\"));\n    if (pConfigs) {\n        CPDF_Dictionary *pFind;\n        FX_INT32 iCount = pConfigs->GetCount();\n        for (FX_INT32 i = 0; i < iCount; i ++) {\n            pFind = pConfigs->GetDict(i);\n            if (!pFind) {\n                continue;\n            }\n            if (!FPDFDOC_OCG_HasIntent(pFind, FX_BSTRC(\"View\"), FX_BSTRC(\"View\"))) {\n                continue;\n            }\n            pConfig = pFind;\n            break;\n        }\n    }\n    return pConfig;\n}\nstatic CFX_ByteString FPDFDOC_OCG_GetUsageTypeString(CPDF_OCContext::UsageType eType)\n{\n    CFX_ByteString csState = FX_BSTRC(\"View\");\n    if (eType == CPDF_OCContext::Design) {\n        csState = FX_BSTRC(\"Design\");\n    } else if (eType == CPDF_OCContext::Print) {\n        csState = FX_BSTRC(\"Print\");\n    } else if (eType == CPDF_OCContext::Export) {\n        csState = FX_BSTRC(\"Export\");\n    }\n    return csState;\n}\nCPDF_OCContext::CPDF_OCContext(CPDF_Document *pDoc, UsageType eUsageType)\n{\n    FXSYS_assert(pDoc != NULL);\n    m_pDocument = pDoc;\n    m_eUsageType = eUsageType;\n}\nCPDF_OCContext::~CPDF_OCContext()\n{\n    m_OCGStates.RemoveAll();\n}\nFX_BOOL CPDF_OCContext::LoadOCGStateFromConfig(FX_BSTR csConfig, const CPDF_Dictionary *pOCGDict, FX_BOOL &bValidConfig) const\n{\n    CPDF_Dictionary *pConfig = FPDFDOC_OCG_GetConfig(m_pDocument, pOCGDict, csConfig);\n    if (!pConfig) {\n        return TRUE;\n    }\n    bValidConfig = TRUE;\n    FX_BOOL bState = pConfig->GetString(FX_BSTRC(\"BaseState\"), FX_BSTRC(\"ON\")) != FX_BSTRC(\"OFF\");\n    CPDF_Array *pArray = pConfig->GetArray(FX_BSTRC(\"ON\"));\n    if (pArray) {\n        if (FPDFDOC_OCG_FindGroup(pArray, pOCGDict) >= 0) {\n            bState = TRUE;\n        }\n    }\n    pArray = pConfig->GetArray(FX_BSTRC(\"OFF\"));\n    if (pArray) {\n        if (FPDFDOC_OCG_FindGroup(pArray, pOCGDict) >= 0) {\n            bState = FALSE;\n        }\n    }\n    pArray = pConfig->GetArray(FX_BSTRC(\"AS\"));\n    if (pArray) {\n        CFX_ByteString csFind = csConfig + FX_BSTRC(\"State\");\n        FX_INT32 iCount = pArray->GetCount();\n        for (FX_INT32 i = 0; i < iCount; i ++) {\n            CPDF_Dictionary *pUsage = pArray->GetDict(i);\n            if (!pUsage) {\n                continue;\n            }\n            if (pUsage->GetString(FX_BSTRC(\"Event\"), FX_BSTRC(\"View\")) != csConfig) {\n                continue;\n            }\n            CPDF_Array *pOCGs = pUsage->GetArray(FX_BSTRC(\"OCGs\"));\n            if (!pOCGs) {\n                continue;\n            }\n            if (FPDFDOC_OCG_FindGroup(pOCGs, pOCGDict) < 0) {\n                continue;\n            }\n            CPDF_Dictionary *pState = pUsage->GetDict(csConfig);\n            if (!pState) {\n                continue;\n            }\n            bState = pState->GetString(csFind) != FX_BSTRC(\"OFF\");\n        }\n    }\n    return bState;\n}\nFX_BOOL CPDF_OCContext::LoadOCGState(const CPDF_Dictionary *pOCGDict) const\n{\n    if (!FPDFDOC_OCG_HasIntent(pOCGDict, FX_BSTRC(\"View\"), FX_BSTRC(\"View\"))) {\n        return TRUE;\n    }\n    CFX_ByteString csState = FPDFDOC_OCG_GetUsageTypeString(m_eUsageType);\n    CPDF_Dictionary *pUsage = pOCGDict->GetDict(FX_BSTRC(\"Usage\"));\n    if (pUsage) {\n        CPDF_Dictionary *pState = pUsage->GetDict(csState);\n        if (pState) {\n            CFX_ByteString csFind = csState + FX_BSTRC(\"State\");\n            if (pState->KeyExist(csFind)) {\n                return pState->GetString(csFind) != FX_BSTRC(\"OFF\");\n            }\n        }\n        if (csState != FX_BSTRC(\"View\")) {\n            pState = pUsage->GetDict(FX_BSTRC(\"View\"));\n            if (pState && pState->KeyExist(FX_BSTRC(\"ViewState\"))) {\n                return pState->GetString(FX_BSTRC(\"ViewState\")) != FX_BSTRC(\"OFF\");\n            }\n        }\n    }\n    FX_BOOL bDefValid = FALSE;\n    return LoadOCGStateFromConfig(csState, pOCGDict, bDefValid);\n}\nFX_BOOL CPDF_OCContext::GetOCGVisible(const CPDF_Dictionary *pOCGDict)\n{\n    if (!pOCGDict) {\n        return FALSE;\n    }\n    FX_LPVOID bState = NULL;\n    if (m_OCGStates.Lookup(pOCGDict, bState)) {\n        return (FX_UINTPTR)bState != 0;\n    }\n    bState = (FX_LPVOID)(FX_UINTPTR)LoadOCGState(pOCGDict);\n    m_OCGStates.SetAt(pOCGDict, bState);\n    return (FX_UINTPTR)bState != 0;\n}\nFX_BOOL CPDF_OCContext::GetOCGVE(CPDF_Array *pExpression, FX_BOOL bFromConfig, int nLevel)\n{\n    if (nLevel > 32) {\n        return FALSE;\n    }\n    if (pExpression == NULL) {\n        return FALSE;\n    }\n    FX_INT32 iCount = pExpression->GetCount();\n    CPDF_Object *pOCGObj;\n    CFX_ByteString csOperator = pExpression->GetString(0);\n    if (csOperator == FX_BSTRC(\"Not\")) {\n        pOCGObj = pExpression->GetElementValue(1);\n        if (pOCGObj == NULL) {\n            return FALSE;\n        }\n        if (pOCGObj->GetType() == PDFOBJ_DICTIONARY) {\n            return !(bFromConfig ? LoadOCGState((CPDF_Dictionary*)pOCGObj) : GetOCGVisible((CPDF_Dictionary*)pOCGObj));\n        } else if (pOCGObj->GetType() == PDFOBJ_ARRAY) {\n            return !GetOCGVE((CPDF_Array*)pOCGObj, bFromConfig, nLevel + 1);\n        } else {\n            return FALSE;\n        }\n    }\n    if (csOperator == FX_BSTRC(\"Or\") || csOperator == FX_BSTRC(\"And\")) {\n        FX_BOOL bValue = FALSE;\n        for (FX_INT32 i = 1; i < iCount; i ++) {\n            pOCGObj = pExpression->GetElementValue(1);\n            if (pOCGObj == NULL) {\n                continue;\n            }\n            FX_BOOL bItem = FALSE;\n            if (pOCGObj->GetType() == PDFOBJ_DICTIONARY) {\n                bItem = bFromConfig ? LoadOCGState((CPDF_Dictionary*)pOCGObj) : GetOCGVisible((CPDF_Dictionary*)pOCGObj);\n            } else if (pOCGObj->GetType() == PDFOBJ_ARRAY) {\n                bItem = GetOCGVE((CPDF_Array*)pOCGObj, bFromConfig, nLevel + 1);\n            }\n            if (i == 1) {\n                bValue = bItem;\n            } else {\n                if (csOperator == FX_BSTRC(\"Or\")) {\n                    bValue = bValue || bItem;\n                } else {\n                    bValue = bValue && bItem;\n                }\n            }\n        }\n        return bValue;\n    }\n    return FALSE;\n}\nFX_BOOL CPDF_OCContext::LoadOCMDState(const CPDF_Dictionary *pOCMDDict, FX_BOOL bFromConfig)\n{\n    FXSYS_assert(pOCMDDict != NULL);\n    CPDF_Array *pVE = pOCMDDict->GetArray(FX_BSTRC(\"VE\"));\n    if (pVE != NULL) {\n        return GetOCGVE(pVE, bFromConfig);\n    }\n    CFX_ByteString csP = pOCMDDict->GetString(FX_BSTRC(\"P\"), FX_BSTRC(\"AnyOn\"));\n    CPDF_Object *pOCGObj = pOCMDDict->GetElementValue(FX_BSTRC(\"OCGs\"));\n    if (pOCGObj == NULL) {\n        return TRUE;\n    }\n    if (pOCGObj->GetType() == PDFOBJ_DICTIONARY) {\n        return bFromConfig ? LoadOCGState((CPDF_Dictionary*)pOCGObj) : GetOCGVisible((CPDF_Dictionary*)pOCGObj);\n    }\n    if (pOCGObj->GetType() != PDFOBJ_ARRAY) {\n        return TRUE;\n    }\n    FX_BOOL bState = FALSE;\n    if (csP == FX_BSTRC(\"AllOn\") || csP == FX_BSTRC(\"AllOff\")) {\n        bState = TRUE;\n    }\n    FX_INT32 iCount = ((CPDF_Array*)pOCGObj)->GetCount();\n    for (FX_INT32 i = 0; i < iCount; i ++) {\n        FX_BOOL bItem = TRUE;\n        CPDF_Dictionary* pItemDict = ((CPDF_Array*)pOCGObj)->GetDict(i);\n        if (pItemDict) {\n            bItem = bFromConfig ? LoadOCGState(pItemDict) : GetOCGVisible(pItemDict);\n        }\n        if (csP == FX_BSTRC(\"AnyOn\") && bItem) {\n            return TRUE;\n        }\n        if (csP == FX_BSTRC(\"AnyOff\") && !bItem) {\n            return TRUE;\n        }\n        if (csP == FX_BSTRC(\"AllOn\") && !bItem) {\n            return FALSE;\n        }\n        if (csP == FX_BSTRC(\"AllOff\") && bItem) {\n            return FALSE;\n        }\n    }\n    return bState;\n}\nFX_BOOL CPDF_OCContext::CheckOCGVisible(const CPDF_Dictionary *pOCGDict)\n{\n    if (pOCGDict == NULL) {\n        return TRUE;\n    }\n    CFX_ByteString csType = pOCGDict->GetString(FX_BSTRC(\"Type\"), FX_BSTRC(\"OCG\"));\n    if (csType == FX_BSTRC(\"OCG\")) {\n        return GetOCGVisible(pOCGDict);\n    } else {\n        return LoadOCMDState(pOCGDict, FALSE);\n    }\n}\nvoid CPDF_OCContext::ResetOCContext()\n{\n    m_OCGStates.RemoveAll();\n}\n"
  },
  {
    "path": "core/src/fpdfdoc/doc_tagged.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fpdfapi/fpdf_parser.h\"\n#include \"../../include/fpdfapi/fpdf_page.h\"\n#include \"../../include/fpdfdoc/fpdf_tagged.h\"\n#include \"tagged_int.h\"\nconst int nMaxRecursion = 32;\nstatic FX_BOOL IsTagged(const CPDF_Document* pDoc)\n{\n    CPDF_Dictionary* pCatalog = pDoc->GetRoot();\n    CPDF_Dictionary* pMarkInfo = pCatalog->GetDict(FX_BSTRC(\"MarkInfo\"));\n    return pMarkInfo != NULL && pMarkInfo->GetInteger(FX_BSTRC(\"Marked\"));\n}\nCPDF_StructTree* CPDF_StructTree::LoadPage(const CPDF_Document* pDoc, const CPDF_Dictionary* pPageDict)\n{\n    if (!IsTagged(pDoc)) {\n        return NULL;\n    }\n    CPDF_StructTreeImpl* pTree = FX_NEW CPDF_StructTreeImpl(pDoc);\n    if (pTree == NULL) {\n        return NULL;\n    }\n    pTree->LoadPageTree(pPageDict);\n    return pTree;\n}\nCPDF_StructTree* CPDF_StructTree::LoadDoc(const CPDF_Document* pDoc)\n{\n    if (!IsTagged(pDoc)) {\n        return NULL;\n    }\n    CPDF_StructTreeImpl* pTree = FX_NEW CPDF_StructTreeImpl(pDoc);\n    if (pTree == NULL) {\n        return NULL;\n    }\n    pTree->LoadDocTree();\n    return pTree;\n}\nCPDF_StructTreeImpl::CPDF_StructTreeImpl(const CPDF_Document* pDoc)\n{\n    CPDF_Dictionary* pCatalog = pDoc->GetRoot();\n    m_pTreeRoot = pCatalog->GetDict(FX_BSTRC(\"StructTreeRoot\"));\n    if (m_pTreeRoot == NULL) {\n        return;\n    }\n    m_pRoleMap = m_pTreeRoot->GetDict(FX_BSTRC(\"RoleMap\"));\n}\nCPDF_StructTreeImpl::~CPDF_StructTreeImpl()\n{\n    for (int i = 0; i < m_Kids.GetSize(); i ++)\n        if (m_Kids[i]) {\n            m_Kids[i]->Release();\n        }\n}\nvoid CPDF_StructTreeImpl::LoadDocTree()\n{\n    m_pPage = NULL;\n    if (m_pTreeRoot == NULL) {\n        return;\n    }\n    CPDF_Object* pKids = m_pTreeRoot->GetElementValue(FX_BSTRC(\"K\"));\n    if (pKids == NULL) {\n        return;\n    }\n    if (pKids->GetType() == PDFOBJ_DICTIONARY) {\n        CPDF_StructElementImpl* pStructElementImpl = FX_NEW CPDF_StructElementImpl(this, NULL, (CPDF_Dictionary*)pKids);\n        if (pStructElementImpl == NULL) {\n            return;\n        }\n        m_Kids.Add(pStructElementImpl);\n        return;\n    }\n    if (pKids->GetType() != PDFOBJ_ARRAY) {\n        return;\n    }\n    CPDF_Array* pArray = (CPDF_Array*)pKids;\n    for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {\n        CPDF_Dictionary* pKid = pArray->GetDict(i);\n        CPDF_StructElementImpl* pStructElementImpl = FX_NEW CPDF_StructElementImpl(this, NULL, pKid);\n        if (pStructElementImpl == NULL) {\n            return;\n        }\n        m_Kids.Add(pStructElementImpl);\n    }\n}\nvoid CPDF_StructTreeImpl::LoadPageTree(const CPDF_Dictionary* pPageDict)\n{\n    m_pPage = pPageDict;\n    if (m_pTreeRoot == NULL) {\n        return;\n    }\n    CPDF_Object* pKids = m_pTreeRoot->GetElementValue(FX_BSTRC(\"K\"));\n    if (pKids == NULL) {\n        return;\n    }\n    FX_DWORD dwKids = 0;\n    if (pKids->GetType() == PDFOBJ_DICTIONARY) {\n        dwKids = 1;\n    } else if (pKids->GetType() == PDFOBJ_ARRAY) {\n        dwKids = ((CPDF_Array*)pKids)->GetCount();\n    } else {\n        return;\n    }\n    FX_DWORD i;\n    m_Kids.SetSize(dwKids);\n    for (i = 0; i < dwKids; i ++) {\n        m_Kids[i] = NULL;\n    }\n    CFX_MapPtrToPtr element_map;\n    CPDF_Dictionary* pParentTree = m_pTreeRoot->GetDict(FX_BSTRC(\"ParentTree\"));\n    if (pParentTree == NULL) {\n        return;\n    }\n    CPDF_NumberTree parent_tree(pParentTree);\n    int parents_id = pPageDict->GetInteger(FX_BSTRC(\"StructParents\"), -1);\n    if (parents_id >= 0) {\n        CPDF_Object* pParents = parent_tree.LookupValue(parents_id);\n        if (pParents == NULL || pParents->GetType() != PDFOBJ_ARRAY) {\n            return;\n        }\n        CPDF_Array* pParentArray = (CPDF_Array*)pParents;\n        for (i = 0; i < pParentArray->GetCount(); i ++) {\n            CPDF_Dictionary* pParent = pParentArray->GetDict(i);\n            if (pParent == NULL) {\n                continue;\n            }\n            AddPageNode(pParent, element_map);\n        }\n    }\n}\nCPDF_StructElementImpl* CPDF_StructTreeImpl::AddPageNode(CPDF_Dictionary* pDict, CFX_MapPtrToPtr& map, int nLevel)\n{\n    if (nLevel > nMaxRecursion) {\n        return NULL;\n    }\n    CPDF_StructElementImpl* pElement = NULL;\n    if (map.Lookup(pDict, (FX_LPVOID&)pElement)) {\n        return pElement;\n    }\n    pElement = FX_NEW CPDF_StructElementImpl(this, NULL, pDict);\n    if (pElement == NULL) {\n        return NULL;\n    }\n    map.SetAt(pDict, pElement);\n    CPDF_Dictionary* pParent = pDict->GetDict(FX_BSTRC(\"P\"));\n    if (pParent == NULL || pParent->GetString(FX_BSTRC(\"Type\")) == FX_BSTRC(\"StructTreeRoot\")) {\n        if (!AddTopLevelNode(pDict, pElement)) {\n            pElement->Release();\n            map.RemoveKey(pDict);\n        }\n    } else {\n        CPDF_StructElementImpl* pParentElement = AddPageNode(pParent, map, nLevel + 1);\n        FX_BOOL bSave = FALSE;\n        for (int i = 0; i < pParentElement->m_Kids.GetSize(); i ++) {\n            if (pParentElement->m_Kids[i].m_Type != CPDF_StructKid::Element) {\n                continue;\n            }\n            if (pParentElement->m_Kids[i].m_Element.m_pDict != pDict) {\n                continue;\n            }\n            pParentElement->m_Kids[i].m_Element.m_pElement = pElement->Retain();\n            bSave = TRUE;\n        }\n        if (!bSave) {\n            pElement->Release();\n            map.RemoveKey(pDict);\n        }\n    }\n    return pElement;\n}\nFX_BOOL CPDF_StructTreeImpl::AddTopLevelNode(CPDF_Dictionary* pDict, CPDF_StructElementImpl* pElement)\n{\n    CPDF_Object *pObj = m_pTreeRoot->GetElementValue(FX_BSTRC(\"K\"));\n    if (!pObj) {\n        return FALSE;\n    }\n    if (pObj->GetType() == PDFOBJ_DICTIONARY) {\n        if (pObj->GetObjNum() == pDict->GetObjNum()) {\n            if (m_Kids[0]) {\n                m_Kids[0]->Release();\n            }\n            m_Kids[0] = pElement->Retain();\n        } else {\n            return FALSE;\n        }\n    }\n    if (pObj->GetType() == PDFOBJ_ARRAY) {\n        CPDF_Array* pTopKids = (CPDF_Array*)pObj;\n        FX_DWORD i;\n        FX_BOOL bSave = FALSE;\n        for (i = 0; i < pTopKids->GetCount(); i ++) {\n            CPDF_Reference* pKidRef = (CPDF_Reference*)pTopKids->GetElement(i);\n            if (pKidRef->GetType() != PDFOBJ_REFERENCE || pKidRef->GetRefObjNum() != pDict->GetObjNum()) {\n                continue;\n            }\n            if (m_Kids[i]) {\n                m_Kids[i]->Release();\n            }\n            m_Kids[i] = pElement->Retain();\n            bSave = TRUE;\n        }\n        if (!bSave) {\n            return FALSE;\n        }\n    }\n    return TRUE;\n}\nCPDF_StructElementImpl::CPDF_StructElementImpl(CPDF_StructTreeImpl* pTree, CPDF_StructElementImpl* pParent, CPDF_Dictionary* pDict)\n    : m_RefCount(0)\n{\n    m_pTree = pTree;\n    m_pDict = pDict;\n    m_Type = pDict->GetString(FX_BSTRC(\"S\"));\n    CFX_ByteString mapped = pTree->m_pRoleMap->GetString(m_Type);\n    if (!mapped.IsEmpty()) {\n        m_Type = mapped;\n    }\n    m_pParent = pParent;\n    LoadKids(pDict);\n}\nCPDF_StructElementImpl::~CPDF_StructElementImpl()\n{\n    for (int i = 0; i < m_Kids.GetSize(); i ++) {\n        if (m_Kids[i].m_Type == CPDF_StructKid::Element && m_Kids[i].m_Element.m_pElement) {\n            ((CPDF_StructElementImpl*)m_Kids[i].m_Element.m_pElement)->Release();\n        }\n    }\n}\nCPDF_StructElementImpl* CPDF_StructElementImpl::Retain()\n{\n    m_RefCount++;\n    return this;\n}\nvoid CPDF_StructElementImpl::Release()\n{\n    if(--m_RefCount < 1) {\n        delete this;\n    }\n}\nvoid CPDF_StructElementImpl::LoadKids(CPDF_Dictionary* pDict)\n{\n    CPDF_Object* pObj = pDict->GetElement(FX_BSTRC(\"Pg\"));\n    FX_DWORD PageObjNum = 0;\n    if (pObj && pObj->GetType() == PDFOBJ_REFERENCE) {\n        PageObjNum = ((CPDF_Reference*)pObj)->GetRefObjNum();\n    }\n    CPDF_Object* pKids = pDict->GetElementValue(FX_BSTRC(\"K\"));\n    if (pKids == NULL) {\n        return;\n    }\n    if (pKids->GetType() == PDFOBJ_ARRAY) {\n        CPDF_Array* pArray = (CPDF_Array*)pKids;\n        m_Kids.SetSize(pArray->GetCount());\n        for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {\n            CPDF_Object* pKid = pArray->GetElementValue(i);\n            LoadKid(PageObjNum, pKid, &m_Kids[i]);\n        }\n    } else {\n        m_Kids.SetSize(1);\n        LoadKid(PageObjNum, pKids, &m_Kids[0]);\n    }\n}\nvoid CPDF_StructElementImpl::LoadKid(FX_DWORD PageObjNum, CPDF_Object* pKidObj, CPDF_StructKid* pKid)\n{\n    pKid->m_Type = CPDF_StructKid::Invalid;\n    if (pKidObj == NULL) {\n        return;\n    }\n    if (pKidObj->GetType() == PDFOBJ_NUMBER) {\n        if (m_pTree->m_pPage && m_pTree->m_pPage->GetObjNum() != PageObjNum) {\n            return;\n        }\n        pKid->m_Type = CPDF_StructKid::PageContent;\n        pKid->m_PageContent.m_ContentId = pKidObj->GetInteger();\n        pKid->m_PageContent.m_PageObjNum = PageObjNum;\n        return;\n    }\n    if (pKidObj->GetType() != PDFOBJ_DICTIONARY) {\n        return;\n    }\n    CPDF_Dictionary* pKidDict = (CPDF_Dictionary*)pKidObj;\n    CPDF_Object* pPageObj = pKidDict->GetElement(FX_BSTRC(\"Pg\"));\n    if (pPageObj && pPageObj->GetType() == PDFOBJ_REFERENCE) {\n        PageObjNum = ((CPDF_Reference*)pPageObj)->GetRefObjNum();\n    }\n    CFX_ByteString type = pKidDict->GetString(FX_BSTRC(\"Type\"));\n    if (type == FX_BSTRC(\"MCR\")) {\n        if (m_pTree->m_pPage && m_pTree->m_pPage->GetObjNum() != PageObjNum) {\n            return;\n        }\n        pKid->m_Type = CPDF_StructKid::StreamContent;\n        CPDF_Object* pStreamObj = pKidDict->GetElement(FX_BSTRC(\"Stm\"));\n        if (pStreamObj && pStreamObj->GetType() == PDFOBJ_REFERENCE) {\n            pKid->m_StreamContent.m_RefObjNum = ((CPDF_Reference*)pStreamObj)->GetRefObjNum();\n        } else {\n            pKid->m_StreamContent.m_RefObjNum = 0;\n        }\n        pKid->m_StreamContent.m_PageObjNum = PageObjNum;\n        pKid->m_StreamContent.m_ContentId = pKidDict->GetInteger(FX_BSTRC(\"MCID\"));\n    } else if (type == FX_BSTRC(\"OBJR\")) {\n        if (m_pTree->m_pPage && m_pTree->m_pPage->GetObjNum() != PageObjNum) {\n            return;\n        }\n        pKid->m_Type = CPDF_StructKid::Object;\n        CPDF_Object* pObj = pKidDict->GetElement(FX_BSTRC(\"Obj\"));\n        if (pObj && pObj->GetType() == PDFOBJ_REFERENCE) {\n            pKid->m_Object.m_RefObjNum = ((CPDF_Reference*)pObj)->GetRefObjNum();\n        } else {\n            pKid->m_Object.m_RefObjNum = 0;\n        }\n        pKid->m_Object.m_PageObjNum = PageObjNum;\n    } else {\n        pKid->m_Type = CPDF_StructKid::Element;\n        pKid->m_Element.m_pDict = pKidDict;\n        if (m_pTree->m_pPage == NULL) {\n            pKid->m_Element.m_pElement = FX_NEW CPDF_StructElementImpl(m_pTree, this, pKidDict);\n        } else {\n            pKid->m_Element.m_pElement = NULL;\n        }\n    }\n}\nstatic CPDF_Dictionary* FindAttrDict(CPDF_Object* pAttrs, FX_BSTR owner, FX_FLOAT nLevel = 0.0F)\n{\n    if (nLevel > nMaxRecursion) {\n        return NULL;\n    }\n    if (pAttrs == NULL) {\n        return NULL;\n    }\n    CPDF_Dictionary* pDict = NULL;\n    if (pAttrs->GetType() == PDFOBJ_DICTIONARY) {\n        pDict = (CPDF_Dictionary*)pAttrs;\n    } else if (pAttrs->GetType() == PDFOBJ_STREAM) {\n        pDict = ((CPDF_Stream*)pAttrs)->GetDict();\n    } else if (pAttrs->GetType() == PDFOBJ_ARRAY) {\n        CPDF_Array* pArray = (CPDF_Array*)pAttrs;\n        for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {\n            CPDF_Object* pElement = pArray->GetElementValue(i);\n            pDict = FindAttrDict(pElement, owner, nLevel + 1);\n            if (pDict) {\n                return pDict;\n            }\n        }\n    }\n    if (pDict && pDict->GetString(FX_BSTRC(\"O\")) == owner) {\n        return pDict;\n    }\n    return NULL;\n}\nCPDF_Object* CPDF_StructElementImpl::GetAttr(FX_BSTR owner, FX_BSTR name, FX_BOOL bInheritable, FX_FLOAT fLevel)\n{\n    if (fLevel > nMaxRecursion) {\n        return NULL;\n    }\n    if (bInheritable) {\n        CPDF_Object* pAttr = GetAttr(owner, name, FALSE);\n        if (pAttr) {\n            return pAttr;\n        }\n        if (m_pParent == NULL) {\n            return NULL;\n        }\n        return m_pParent->GetAttr(owner, name, TRUE, fLevel + 1);\n    }\n    CPDF_Object* pA = m_pDict->GetElementValue(FX_BSTRC(\"A\"));\n    if (pA) {\n        CPDF_Dictionary* pAttrDict = FindAttrDict(pA, owner);\n        if (pAttrDict) {\n            CPDF_Object* pAttr = pAttrDict->GetElementValue(name);\n            if (pAttr) {\n                return pAttr;\n            }\n        }\n    }\n    CPDF_Object* pC = m_pDict->GetElementValue(FX_BSTRC(\"C\"));\n    if (pC == NULL) {\n        return NULL;\n    }\n    CPDF_Dictionary* pClassMap = m_pTree->m_pTreeRoot->GetDict(FX_BSTRC(\"ClassMap\"));\n    if (pClassMap == NULL) {\n        return NULL;\n    }\n    if (pC->GetType() == PDFOBJ_ARRAY) {\n        CPDF_Array* pArray = (CPDF_Array*)pC;\n        for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {\n            CFX_ByteString class_name = pArray->GetString(i);\n            CPDF_Dictionary* pClassDict = pClassMap->GetDict(class_name);\n            if (pClassDict && pClassDict->GetString(FX_BSTRC(\"O\")) == owner) {\n                return pClassDict->GetElementValue(name);\n            }\n        }\n        return NULL;\n    }\n    CFX_ByteString class_name = pC->GetString();\n    CPDF_Dictionary* pClassDict = pClassMap->GetDict(class_name);\n    if (pClassDict && pClassDict->GetString(FX_BSTRC(\"O\")) == owner) {\n        return pClassDict->GetElementValue(name);\n    }\n    return NULL;\n}\nCPDF_Object* CPDF_StructElementImpl::GetAttr(FX_BSTR owner, FX_BSTR name, FX_BOOL bInheritable, int subindex)\n{\n    CPDF_Object* pAttr = GetAttr(owner, name, bInheritable);\n    if (pAttr == NULL || subindex == -1 || pAttr->GetType() != PDFOBJ_ARRAY) {\n        return pAttr;\n    }\n    CPDF_Array* pArray = (CPDF_Array*)pAttr;\n    if (subindex >= (int)pArray->GetCount()) {\n        return pAttr;\n    }\n    return pArray->GetElementValue(subindex);\n}\nCFX_ByteString CPDF_StructElementImpl::GetName(FX_BSTR owner, FX_BSTR name, FX_BSTR default_value, FX_BOOL bInheritable, int subindex)\n{\n    CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex);\n    if (pAttr == NULL || pAttr->GetType() != PDFOBJ_NAME) {\n        return default_value;\n    }\n    return pAttr->GetString();\n}\nFX_ARGB\tCPDF_StructElementImpl::GetColor(FX_BSTR owner, FX_BSTR name, FX_ARGB default_value, FX_BOOL bInheritable, int subindex)\n{\n    CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex);\n    if (pAttr == NULL || pAttr->GetType() != PDFOBJ_ARRAY) {\n        return default_value;\n    }\n    CPDF_Array* pArray = (CPDF_Array*)pAttr;\n    return 0xff000000 | ((int)(pArray->GetNumber(0) * 255) << 16) | ((int)(pArray->GetNumber(1) * 255) << 8) | (int)(pArray->GetNumber(2) * 255);\n}\nFX_FLOAT CPDF_StructElementImpl::GetNumber(FX_BSTR owner, FX_BSTR name, FX_FLOAT default_value, FX_BOOL bInheritable, int subindex)\n{\n    CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex);\n    if (pAttr == NULL || pAttr->GetType() != PDFOBJ_NUMBER) {\n        return default_value;\n    }\n    return pAttr->GetNumber();\n}\nint\tCPDF_StructElementImpl::GetInteger(FX_BSTR owner, FX_BSTR name, int default_value, FX_BOOL bInheritable, int subindex)\n{\n    CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex);\n    if (pAttr == NULL || pAttr->GetType() != PDFOBJ_NUMBER) {\n        return default_value;\n    }\n    return pAttr->GetInteger();\n}\n"
  },
  {
    "path": "core/src/fpdfdoc/doc_utils.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fpdfdoc/fpdf_doc.h\"\nstatic const int FPDFDOC_UTILS_MAXRECURSION = 32;\nCFX_WideString\tGetFullName(CPDF_Dictionary* pFieldDict);\nvoid\t\t\tInitInterFormDict(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument);\nFX_DWORD\t\tCountInterFormFonts(CPDF_Dictionary* pFormDict);\nCPDF_Font*\t\tGetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_DWORD index, CFX_ByteString& csNameTag);\nCPDF_Font*\t\tGetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csNameTag);\nCPDF_Font*\t\tGetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CFX_ByteString& csNameTag);\nCPDF_Font*\t\tGetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag);\nCPDF_Font*\t\tGetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);\nFX_BOOL\t\t\tFindInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont, CFX_ByteString& csNameTag);\nFX_BOOL\t\t\tFindInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag);\nvoid\t\t\tAddInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont, CFX_ByteString& csNameTag);\nCPDF_Font*\t\tAddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag);\nCPDF_Font*\t\tAddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);\nvoid\t\t\tRemoveInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont);\nvoid\t\t\tRemoveInterFormFont(CPDF_Dictionary* pFormDict, CFX_ByteString csNameTag);\nCPDF_Font*\t\tGetDefaultInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument);\nvoid\t\t\tSetDefaultInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont);\nvoid\t\t\tSaveCheckedFieldStatus(CPDF_FormField* pField, CFX_ByteArray& statusArray);\nFX_BOOL\t\t\tNeedPDFEncodeForFieldFullName(const CFX_WideString& csFieldName);\nFX_BOOL\t\t\tNeedPDFEncodeForFieldTree(CPDF_Dictionary* pFieldDict, int nLevel = 0);\nvoid\t\t\tEncodeFieldName(const CFX_WideString& csName, CFX_ByteString& csT);\nvoid\t\t\tUpdateEncodeFieldName(CPDF_Dictionary* pFieldDict, int nLevel = 0);\nCFX_WideString GetFullName(CPDF_Dictionary* pFieldDict)\n{\n    CFX_WideString full_name;\n    CPDF_Dictionary* pLevel = pFieldDict;\n    while (pLevel) {\n        CFX_WideString short_name = pLevel->GetUnicodeText(\"T\");\n        if (short_name != L\"\") {\n            if (full_name == L\"\") {\n                full_name = short_name;\n            } else {\n                full_name = short_name + L\".\" + full_name;\n            }\n        }\n        pLevel = pLevel->GetDict(\"Parent\");\n    }\n    return full_name;\n}\nFX_BOOL CPDF_DefaultAppearance::HasFont()\n{\n    if (m_csDA.IsEmpty()) {\n        return FALSE;\n    }\n    CPDF_SimpleParser syntax(m_csDA);\n    return syntax.FindTagParam(\"Tf\", 2);\n}\nCFX_ByteString CPDF_DefaultAppearance::GetFontString()\n{\n    CFX_ByteString csFont;\n    if (m_csDA.IsEmpty()) {\n        return csFont;\n    }\n    CPDF_SimpleParser syntax(m_csDA);\n    if (syntax.FindTagParam(\"Tf\", 2)) {\n        csFont += (CFX_ByteString)syntax.GetWord();\n        csFont += \" \";\n        csFont += (CFX_ByteString)syntax.GetWord();\n        csFont += \" \";\n        csFont += (CFX_ByteString)syntax.GetWord();\n    }\n    return csFont;\n}\nvoid CPDF_DefaultAppearance::GetFont(CFX_ByteString& csFontNameTag, FX_FLOAT& fFontSize)\n{\n    csFontNameTag = \"\";\n    fFontSize = 0;\n    if (m_csDA.IsEmpty()) {\n        return;\n    }\n    CPDF_SimpleParser syntax(m_csDA);\n    if (syntax.FindTagParam(\"Tf\", 2)) {\n        csFontNameTag = (CFX_ByteString)syntax.GetWord();\n        csFontNameTag.Delete(0, 1);\n        fFontSize = FX_atof((CFX_ByteString)syntax.GetWord());\n    }\n    csFontNameTag = PDF_NameDecode(csFontNameTag);\n}\nFX_BOOL CPDF_DefaultAppearance::HasColor(FX_BOOL bStrokingOperation)\n{\n    if (m_csDA.IsEmpty()) {\n        return FALSE;\n    }\n    CPDF_SimpleParser syntax(m_csDA);\n    if (syntax.FindTagParam(bStrokingOperation ? \"G\" : \"g\", 1)) {\n        return TRUE;\n    }\n    syntax.SetPos(0);\n    if (syntax.FindTagParam(bStrokingOperation ? \"RG\" : \"rg\", 3)) {\n        return TRUE;\n    }\n    syntax.SetPos(0);\n    return syntax.FindTagParam(bStrokingOperation ? \"K\" : \"k\", 4);\n}\nCFX_ByteString CPDF_DefaultAppearance::GetColorString(FX_BOOL bStrokingOperation)\n{\n    CFX_ByteString csColor;\n    if (m_csDA.IsEmpty()) {\n        return csColor;\n    }\n    CPDF_SimpleParser syntax(m_csDA);\n    if (syntax.FindTagParam(bStrokingOperation ? \"G\" : \"g\", 1)) {\n        csColor += (CFX_ByteString)syntax.GetWord();\n        csColor += \" \";\n        csColor += (CFX_ByteString)syntax.GetWord();\n        return csColor;\n    }\n    syntax.SetPos(0);\n    if (syntax.FindTagParam(bStrokingOperation ? \"RG\" : \"rg\", 3)) {\n        csColor += (CFX_ByteString)syntax.GetWord();\n        csColor += \" \";\n        csColor += (CFX_ByteString)syntax.GetWord();\n        csColor += \" \";\n        csColor += (CFX_ByteString)syntax.GetWord();\n        csColor += \" \";\n        csColor += (CFX_ByteString)syntax.GetWord();\n        return csColor;\n    }\n    syntax.SetPos(0);\n    if (syntax.FindTagParam(bStrokingOperation ? \"K\" : \"k\", 4)) {\n        csColor += (CFX_ByteString)syntax.GetWord();\n        csColor += \" \";\n        csColor += (CFX_ByteString)syntax.GetWord();\n        csColor += \" \";\n        csColor += (CFX_ByteString)syntax.GetWord();\n        csColor += \" \";\n        csColor += (CFX_ByteString)syntax.GetWord();\n        csColor += \" \";\n        csColor += (CFX_ByteString)syntax.GetWord();\n    }\n    return csColor;\n}\nvoid CPDF_DefaultAppearance::GetColor(int& iColorType, FX_FLOAT fc[4], FX_BOOL bStrokingOperation)\n{\n    iColorType = COLORTYPE_TRANSPARENT;\n    for (int c = 0; c < 4; c ++) {\n        fc[c] = 0;\n    }\n    if (m_csDA.IsEmpty()) {\n        return;\n    }\n    CPDF_SimpleParser syntax(m_csDA);\n    if (syntax.FindTagParam(bStrokingOperation ? \"G\" : \"g\", 1)) {\n        iColorType = COLORTYPE_GRAY;\n        fc[0] = FX_atof((CFX_ByteString)syntax.GetWord());\n        return;\n    }\n    syntax.SetPos(0);\n    if (syntax.FindTagParam(bStrokingOperation ? \"RG\" : \"rg\", 3)) {\n        iColorType = COLORTYPE_RGB;\n        fc[0] = FX_atof((CFX_ByteString)syntax.GetWord());\n        fc[1] = FX_atof((CFX_ByteString)syntax.GetWord());\n        fc[2] = FX_atof((CFX_ByteString)syntax.GetWord());\n        return;\n    }\n    syntax.SetPos(0);\n    if (syntax.FindTagParam(bStrokingOperation ? \"K\" : \"k\", 4)) {\n        iColorType = COLORTYPE_CMYK;\n        fc[0] = FX_atof((CFX_ByteString)syntax.GetWord());\n        fc[1] = FX_atof((CFX_ByteString)syntax.GetWord());\n        fc[2] = FX_atof((CFX_ByteString)syntax.GetWord());\n        fc[3] = FX_atof((CFX_ByteString)syntax.GetWord());\n    }\n}\nvoid CPDF_DefaultAppearance::GetColor(FX_ARGB& color, int& iColorType, FX_BOOL bStrokingOperation)\n{\n    color = 0;\n    iColorType = COLORTYPE_TRANSPARENT;\n    if (m_csDA.IsEmpty()) {\n        return;\n    }\n    CPDF_SimpleParser syntax(m_csDA);\n    if (syntax.FindTagParam(bStrokingOperation ? \"G\" : \"g\", 1)) {\n        iColorType = COLORTYPE_GRAY;\n        FX_FLOAT g = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;\n        color = ArgbEncode(255, (int)g, (int)g, (int)g);\n        return;\n    }\n    syntax.SetPos(0);\n    if (syntax.FindTagParam(bStrokingOperation ? \"RG\" : \"rg\", 3)) {\n        iColorType = COLORTYPE_RGB;\n        FX_FLOAT r = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;\n        FX_FLOAT g = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;\n        FX_FLOAT b = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;\n        color = ArgbEncode(255, (int)r, (int)g, (int)b);\n        return;\n    }\n    syntax.SetPos(0);\n    if (syntax.FindTagParam(bStrokingOperation ? \"K\" : \"k\", 4)) {\n        iColorType = COLORTYPE_CMYK;\n        FX_FLOAT c = FX_atof((CFX_ByteString)syntax.GetWord());\n        FX_FLOAT m = FX_atof((CFX_ByteString)syntax.GetWord());\n        FX_FLOAT y = FX_atof((CFX_ByteString)syntax.GetWord());\n        FX_FLOAT k = FX_atof((CFX_ByteString)syntax.GetWord());\n        FX_FLOAT r = 1.0f - FX_MIN(1.0f, c + k);\n        FX_FLOAT g = 1.0f - FX_MIN(1.0f, m + k);\n        FX_FLOAT b = 1.0f - FX_MIN(1.0f, y + k);\n        color = ArgbEncode(255, (int)(r * 255 + 0.5f), (int)(g * 255 + 0.5f), (int)(b * 255 + 0.5f));\n    }\n}\nFX_BOOL CPDF_DefaultAppearance::HasTextMatrix()\n{\n    if (m_csDA.IsEmpty()) {\n        return FALSE;\n    }\n    CPDF_SimpleParser syntax(m_csDA);\n    return syntax.FindTagParam(\"Tm\", 6);\n}\nCFX_ByteString CPDF_DefaultAppearance::GetTextMatrixString()\n{\n    CFX_ByteString csTM;\n    if (m_csDA.IsEmpty()) {\n        return csTM;\n    }\n    CPDF_SimpleParser syntax(m_csDA);\n    if (syntax.FindTagParam(\"Tm\", 6)) {\n        for (int i = 0; i < 6; i ++) {\n            csTM += (CFX_ByteString)syntax.GetWord();\n            csTM += \" \";\n        }\n        csTM += (CFX_ByteString)syntax.GetWord();\n    }\n    return csTM;\n}\nCFX_AffineMatrix CPDF_DefaultAppearance::GetTextMatrix()\n{\n    CFX_AffineMatrix tm;\n    if (m_csDA.IsEmpty()) {\n        return tm;\n    }\n    CPDF_SimpleParser syntax(m_csDA);\n    if (syntax.FindTagParam(\"Tm\", 6)) {\n        FX_FLOAT f[6];\n        for (int i = 0; i < 6; i ++) {\n            f[i] = FX_atof((CFX_ByteString)syntax.GetWord());\n        }\n        tm.Set(f[0], f[1], f[2], f[3], f[4], f[5]);\n    }\n    return tm;\n}\nvoid InitInterFormDict(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument)\n{\n    if (pDocument == NULL) {\n        return;\n    }\n    if (pFormDict == NULL) {\n        pFormDict = CPDF_Dictionary::Create();\n        if (pFormDict == NULL) {\n            return;\n        }\n        FX_DWORD dwObjNum = pDocument->AddIndirectObject(pFormDict);\n        CPDF_Dictionary* pRoot = pDocument->GetRoot();\n        pRoot->SetAtReference(\"AcroForm\", pDocument, dwObjNum);\n    }\n    CFX_ByteString csDA;\n    if (!pFormDict->KeyExist(\"DR\")) {\n        CPDF_Font* pFont = NULL;\n        CFX_ByteString csBaseName, csDefault;\n        FX_BYTE charSet = CPDF_InterForm::GetNativeCharSet();\n        pFont = CPDF_InterForm::AddStandardFont(pDocument, \"Helvetica\");\n        if (pFont != NULL) {\n            AddInterFormFont(pFormDict, pDocument, pFont, csBaseName);\n            csDefault = csBaseName;\n        }\n        if (charSet != 0) {\n            CFX_ByteString csFontName = CPDF_InterForm::GetNativeFont(charSet, NULL);\n            if (pFont == NULL || csFontName != \"Helvetica\") {\n                pFont = CPDF_InterForm::AddNativeFont(pDocument);\n                if (pFont != NULL) {\n                    csBaseName = \"\";\n                    AddInterFormFont(pFormDict, pDocument, pFont, csBaseName);\n                    csDefault = csBaseName;\n                }\n            }\n        }\n        if (pFont != NULL) {\n            csDA = \"/\" + PDF_NameEncode(csDefault) + \" 0 Tf\";\n        }\n    }\n    if (!csDA.IsEmpty()) {\n        csDA += \" \";\n    }\n    csDA += \"0 g\";\n    if (!pFormDict->KeyExist(\"DA\")) {\n        pFormDict->SetAtString(\"DA\", csDA);\n    }\n}\nFX_DWORD CountInterFormFonts(CPDF_Dictionary* pFormDict)\n{\n    if (pFormDict == NULL) {\n        return 0;\n    }\n    CPDF_Dictionary* pDR = pFormDict->GetDict(\"DR\");\n    if (pDR == NULL) {\n        return 0;\n    }\n    CPDF_Dictionary* pFonts = pDR->GetDict(\"Font\");\n    if (pFonts == NULL) {\n        return 0;\n    }\n    FX_DWORD dwCount = 0;\n    FX_POSITION pos = pFonts->GetStartPos();\n    while (pos) {\n        CPDF_Object* pObj = NULL;\n        CFX_ByteString csKey;\n        pObj = pFonts->GetNextElement(pos, csKey);\n        if (pObj == NULL) {\n            continue;\n        }\n        CPDF_Object* pDirect = pObj->GetDirect();\n        if (pDirect != NULL && pDirect->GetType() == PDFOBJ_DICTIONARY) {\n            if (((CPDF_Dictionary*)pDirect)->GetString(\"Type\") == \"Font\") {\n                dwCount ++;\n            }\n        }\n    }\n    return dwCount;\n}\nCPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_DWORD index, CFX_ByteString& csNameTag)\n{\n    if (pFormDict == NULL) {\n        return NULL;\n    }\n    CPDF_Dictionary* pDR = pFormDict->GetDict(\"DR\");\n    if (pDR == NULL) {\n        return NULL;\n    }\n    CPDF_Dictionary* pFonts = pDR->GetDict(\"Font\");\n    if (pFonts == NULL) {\n        return NULL;\n    }\n    FX_DWORD dwCount = 0;\n    FX_POSITION pos = pFonts->GetStartPos();\n    while (pos) {\n        CPDF_Object* pObj = NULL;\n        CFX_ByteString csKey;\n        pObj = pFonts->GetNextElement(pos, csKey);\n        if (pObj == NULL) {\n            continue;\n        }\n        CPDF_Object* pDirect = pObj->GetDirect();\n        if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {\n            continue;\n        }\n        CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;\n        if (pElement->GetString(\"Type\") != \"Font\") {\n            continue;\n        }\n        if (dwCount == index) {\n            csNameTag = csKey;\n            return pDocument->LoadFont(pElement);\n        }\n        dwCount ++;\n    }\n    return NULL;\n}\nCPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csNameTag)\n{\n    CFX_ByteString csAlias = PDF_NameDecode(csNameTag);\n    if (pFormDict == NULL || csAlias.IsEmpty()) {\n        return NULL;\n    }\n    CPDF_Dictionary* pDR = pFormDict->GetDict(\"DR\");\n    if (pDR == NULL) {\n        return NULL;\n    }\n    CPDF_Dictionary* pFonts = pDR->GetDict(\"Font\");\n    if (pFonts == NULL) {\n        return NULL;\n    }\n    CPDF_Dictionary* pElement = pFonts->GetDict(csAlias);\n    if (pElement == NULL) {\n        return NULL;\n    }\n    if (pElement->GetString(\"Type\") == \"Font\") {\n        return pDocument->LoadFont(pElement);\n    }\n    return NULL;\n}\nCPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CFX_ByteString& csNameTag)\n{\n    if (pFormDict == NULL || csFontName.IsEmpty()) {\n        return NULL;\n    }\n    CPDF_Dictionary* pDR = pFormDict->GetDict(\"DR\");\n    if (pDR == NULL) {\n        return NULL;\n    }\n    CPDF_Dictionary* pFonts = pDR->GetDict(\"Font\");\n    if (pFonts == NULL) {\n        return NULL;\n    }\n    FX_POSITION pos = pFonts->GetStartPos();\n    while (pos) {\n        CPDF_Object* pObj = NULL;\n        CFX_ByteString csKey;\n        pObj = pFonts->GetNextElement(pos, csKey);\n        if (pObj == NULL) {\n            continue;\n        }\n        CPDF_Object* pDirect = pObj->GetDirect();\n        if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {\n            continue;\n        }\n        CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;\n        if (pElement->GetString(\"Type\") != \"Font\") {\n            continue;\n        }\n        CPDF_Font* pFind = pDocument->LoadFont(pElement);\n        if (pFind == NULL) {\n            continue;\n        }\n        CFX_ByteString csBaseFont;\n        csBaseFont = pFind->GetBaseFont();\n        csBaseFont.Remove(' ');\n        if (csBaseFont == csFontName) {\n            csNameTag = csKey;\n            return pFind;\n        }\n    }\n    return NULL;\n}\nCPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag)\n{\n    if (pFormDict == NULL) {\n        return NULL;\n    }\n    CPDF_Dictionary* pDR = pFormDict->GetDict(\"DR\");\n    if (pDR == NULL) {\n        return NULL;\n    }\n    CPDF_Dictionary* pFonts = pDR->GetDict(\"Font\");\n    if (pFonts == NULL) {\n        return NULL;\n    }\n    FX_POSITION pos = pFonts->GetStartPos();\n    while (pos) {\n        CPDF_Object* pObj = NULL;\n        CFX_ByteString csKey;\n        pObj = pFonts->GetNextElement(pos, csKey);\n        if (pObj == NULL) {\n            continue;\n        }\n        CPDF_Object* pDirect = pObj->GetDirect();\n        if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {\n            continue;\n        }\n        CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;\n        if (pElement->GetString(\"Type\") != \"Font\") {\n            continue;\n        }\n        CPDF_Font* pFind = pDocument->LoadFont(pElement);\n        if (pFind == NULL) {\n            continue;\n        }\n        CFX_SubstFont* pSubst = (CFX_SubstFont*)pFind->GetSubstFont();\n        if (pSubst == NULL) {\n            continue;\n        }\n        if (pSubst->m_Charset == (int)charSet) {\n            csNameTag = csKey;\n            return pFind;\n        }\n    }\n    return NULL;\n}\nCPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag)\n{\n    csNameTag = \"\";\n    FX_BYTE charSet = CPDF_InterForm::GetNativeCharSet();\n    CFX_SubstFont* pSubst;\n    CPDF_Font* pFont = GetDefaultInterFormFont(pFormDict, pDocument);\n    if (pFont != NULL) {\n        pSubst = (CFX_SubstFont*)pFont->GetSubstFont();\n        if (pSubst != NULL && pSubst->m_Charset == (int)charSet) {\n            FindInterFormFont(pFormDict, pFont, csNameTag);\n            return pFont;\n        }\n    }\n    return GetNativeInterFormFont(pFormDict, pDocument, charSet, csNameTag);\n}\nFX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont, CFX_ByteString& csNameTag)\n{\n    if (pFormDict == NULL || pFont == NULL) {\n        return FALSE;\n    }\n    CPDF_Dictionary* pDR = pFormDict->GetDict(\"DR\");\n    if (pDR == NULL) {\n        return FALSE;\n    }\n    CPDF_Dictionary* pFonts = pDR->GetDict(\"Font\");\n    if (pFonts == NULL) {\n        return FALSE;\n    }\n    FX_POSITION pos = pFonts->GetStartPos();\n    while (pos) {\n        CPDF_Object* pObj = NULL;\n        CFX_ByteString csKey;\n        pObj = pFonts->GetNextElement(pos, csKey);\n        if (pObj == NULL) {\n            continue;\n        }\n        CPDF_Object* pDirect = pObj->GetDirect();\n        if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {\n            continue;\n        }\n        CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;\n        if (pElement->GetString(\"Type\") != \"Font\") {\n            continue;\n        }\n        if (pFont->GetFontDict() == pElement) {\n            csNameTag = csKey;\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nFX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag)\n{\n    if (pFormDict == NULL) {\n        return FALSE;\n    }\n    CPDF_Dictionary* pDR = pFormDict->GetDict(\"DR\");\n    if (pDR == NULL) {\n        return FALSE;\n    }\n    CPDF_Dictionary* pFonts = pDR->GetDict(\"Font\");\n    if (pFonts == NULL) {\n        return FALSE;\n    }\n    if (csFontName.GetLength() > 0) {\n        csFontName.Remove(' ');\n    }\n    FX_POSITION pos = pFonts->GetStartPos();\n    while (pos) {\n        CPDF_Object* pObj = NULL;\n        CFX_ByteString csKey, csTmp;\n        pObj = pFonts->GetNextElement(pos, csKey);\n        if (pObj == NULL) {\n            continue;\n        }\n        CPDF_Object* pDirect = pObj->GetDirect();\n        if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {\n            continue;\n        }\n        CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;\n        if (pElement->GetString(\"Type\") != \"Font\") {\n            continue;\n        }\n        pFont = pDocument->LoadFont(pElement);\n        if (pFont == NULL) {\n            continue;\n        }\n        CFX_ByteString csBaseFont;\n        csBaseFont = pFont->GetBaseFont();\n        csBaseFont.Remove(' ');\n        if (csBaseFont == csFontName) {\n            csNameTag = csKey;\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nvoid AddInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont, CFX_ByteString& csNameTag)\n{\n    if (pFont == NULL) {\n        return;\n    }\n    if (pFormDict == NULL) {\n        InitInterFormDict(pFormDict, pDocument);\n    }\n    CFX_ByteString csTag;\n    if (FindInterFormFont(pFormDict, pFont, csTag)) {\n        csNameTag = csTag;\n        return;\n    }\n    if (pFormDict == NULL) {\n        InitInterFormDict(pFormDict, pDocument);\n    }\n    CPDF_Dictionary* pDR = pFormDict->GetDict(\"DR\");\n    if (pDR == NULL) {\n        pDR = CPDF_Dictionary::Create();\n        if (pDR == NULL) {\n            return;\n        }\n        pFormDict->SetAt(\"DR\", pDR);\n    }\n    CPDF_Dictionary* pFonts = pDR->GetDict(\"Font\");\n    if (pFonts == NULL) {\n        pFonts = CPDF_Dictionary::Create();\n        pDR->SetAt(\"Font\", pFonts);\n    }\n    if (csNameTag.IsEmpty()) {\n        csNameTag = pFont->GetBaseFont();\n    }\n    csNameTag.Remove(' ');\n    csNameTag = CPDF_InterForm::GenerateNewResourceName(pDR, \"Font\", 4, csNameTag);\n    pFonts->SetAtReference(csNameTag, pDocument, pFont->GetFontDict());\n}\nCPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag)\n{\n    if (pFormDict == NULL) {\n        InitInterFormDict(pFormDict, pDocument);\n    }\n    CFX_ByteString csTemp;\n    CPDF_Font* pFont = GetNativeInterFormFont(pFormDict, pDocument, charSet, csTemp);\n    if (pFont != NULL) {\n        csNameTag = csTemp;\n        return pFont;\n    }\n    CFX_ByteString csFontName = CPDF_InterForm::GetNativeFont(charSet);\n    if (!csFontName.IsEmpty()) {\n        if (FindInterFormFont(pFormDict, pDocument, csFontName, pFont, csNameTag)) {\n            return pFont;\n        }\n    }\n    pFont = CPDF_InterForm::AddNativeFont(charSet, pDocument);\n    if (pFont != NULL) {\n        AddInterFormFont(pFormDict, pDocument, pFont, csNameTag);\n    }\n    return pFont;\n}\nCPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag)\n{\n    FX_BYTE charSet = CPDF_InterForm::GetNativeCharSet();\n    return AddNativeInterFormFont(pFormDict, pDocument, charSet, csNameTag);\n}\nvoid RemoveInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont)\n{\n    if (pFormDict == NULL || pFont == NULL) {\n        return;\n    }\n    CFX_ByteString csTag;\n    if (!FindInterFormFont(pFormDict, pFont, csTag)) {\n        return;\n    }\n    CPDF_Dictionary* pDR = pFormDict->GetDict(\"DR\");\n    CPDF_Dictionary* pFonts = pDR->GetDict(\"Font\");\n    pFonts->RemoveAt(csTag);\n}\nvoid RemoveInterFormFont(CPDF_Dictionary* pFormDict, CFX_ByteString csNameTag)\n{\n    if (pFormDict == NULL || csNameTag.IsEmpty()) {\n        return;\n    }\n    CPDF_Dictionary* pDR = pFormDict->GetDict(\"DR\");\n    if (pDR == NULL) {\n        return;\n    }\n    CPDF_Dictionary* pFonts = pDR->GetDict(\"Font\");\n    if (pFonts == NULL) {\n        return;\n    }\n    pFonts->RemoveAt(csNameTag);\n}\nCPDF_Font* GetDefaultInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument)\n{\n    if (pFormDict == NULL) {\n        return NULL;\n    }\n    CPDF_DefaultAppearance cDA = pFormDict->GetString(\"DA\");\n    CFX_ByteString csFontNameTag;\n    FX_FLOAT fFontSize;\n    cDA.GetFont(csFontNameTag, fFontSize);\n    return GetInterFormFont(pFormDict, pDocument, csFontNameTag);\n}\nCPDF_IconFit::ScaleMethod CPDF_IconFit::GetScaleMethod()\n{\n    if (m_pDict == NULL) {\n        return Always;\n    }\n    CFX_ByteString csSW = m_pDict->GetString(\"SW\", \"A\");\n    if (csSW == \"B\") {\n        return Bigger;\n    } else if (csSW == \"S\") {\n        return Smaller;\n    } else if (csSW == \"N\") {\n        return Never;\n    }\n    return Always;\n}\nFX_BOOL CPDF_IconFit::IsProportionalScale()\n{\n    if (m_pDict == NULL) {\n        return TRUE;\n    }\n    return m_pDict->GetString(\"S\", \"P\") != \"A\";\n}\nvoid CPDF_IconFit::GetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom)\n{\n    fLeft = fBottom = 0.5;\n    if (m_pDict == NULL) {\n        return;\n    }\n    CPDF_Array* pA = m_pDict->GetArray(\"A\");\n    if (pA != NULL) {\n        FX_DWORD dwCount = pA->GetCount();\n        if (dwCount > 0) {\n            fLeft = pA->GetNumber(0);\n        }\n        if (dwCount > 1) {\n            fBottom = pA->GetNumber(1);\n        }\n    }\n}\nFX_BOOL CPDF_IconFit::GetFittingBounds()\n{\n    if (m_pDict == NULL) {\n        return FALSE;\n    }\n    return m_pDict->GetBoolean(\"FB\");\n}\nvoid SaveCheckedFieldStatus(CPDF_FormField* pField, CFX_ByteArray& statusArray)\n{\n    int iCount = pField->CountControls();\n    for (int i = 0; i < iCount; i ++) {\n        CPDF_FormControl* pControl = pField->GetControl(i);\n        if (pControl == NULL) {\n            continue;\n        }\n        statusArray.Add(pControl->IsChecked() ? 1 : 0);\n    }\n}\nCPDF_Object* FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict, const FX_CHAR* name, int nLevel)\n{\n    if (nLevel > FPDFDOC_UTILS_MAXRECURSION) {\n        return NULL;\n    }\n    if (pFieldDict == NULL) {\n        return NULL;\n    }\n    CPDF_Object* pAttr = pFieldDict->GetElementValue(name);\n    if (pAttr) {\n        return pAttr;\n    }\n    CPDF_Dictionary* pParent = pFieldDict->GetDict(\"Parent\");\n    if (pParent == NULL) {\n        return NULL;\n    }\n    return FPDF_GetFieldAttr(pParent, name, nLevel + 1);\n}\n"
  },
  {
    "path": "core/src/fpdfdoc/doc_viewerPreferences.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fpdfdoc/fpdf_doc.h\"\nCPDF_ViewerPreferences::CPDF_ViewerPreferences(CPDF_Document *pDoc): m_pDoc(pDoc)\n{\n}\nCPDF_ViewerPreferences::~CPDF_ViewerPreferences()\n{\n}\nFX_BOOL CPDF_ViewerPreferences::IsDirectionR2L() const\n{\n    CPDF_Dictionary *pDict = m_pDoc->GetRoot();\n    pDict = pDict->GetDict(FX_BSTRC(\"ViewerPreferences\"));\n    if (!pDict)\t{\n        return FALSE;\n    }\n    return FX_BSTRC(\"R2L\") == pDict->GetString(FX_BSTRC(\"Direction\"));\n}\nFX_BOOL CPDF_ViewerPreferences::PrintScaling() const\n{\n    CPDF_Dictionary *pDict = m_pDoc->GetRoot();\n    pDict = pDict->GetDict(FX_BSTRC(\"ViewerPreferences\"));\n    if (!pDict)\t{\n        return TRUE;\n    }\n    return FX_BSTRC(\"None\") != pDict->GetString(FX_BSTRC(\"PrintScaling\"));\n}\nFX_INT32 CPDF_ViewerPreferences::NumCopies() const\n{\n    CPDF_Dictionary *pDict = m_pDoc->GetRoot();\n    pDict = pDict->GetDict(FX_BSTRC(\"ViewerPreferences\"));\n    if (!pDict) {\n        return 1;\n    }\n    return pDict->GetInteger(FX_BSTRC(\"NumCopies\"));\n}\nCPDF_Array* CPDF_ViewerPreferences::PrintPageRange() const\n{\n    CPDF_Dictionary *pDict = m_pDoc->GetRoot();\n    CPDF_Array *pRange = NULL;\n    pDict = pDict->GetDict(FX_BSTRC(\"ViewerPreferences\"));\n    if (!pDict) {\n        return pRange;\n    }\n    pRange = pDict->GetArray(FX_BSTRC(\"PrintPageRange\"));\n    return pRange;\n}\nCFX_ByteString CPDF_ViewerPreferences::Duplex() const\n{\n    CPDF_Dictionary *pDict = m_pDoc->GetRoot();\n    pDict = pDict->GetDict(FX_BSTRC(\"ViewerPreferences\"));\n    if (!pDict) {\n        return FX_BSTRC(\"None\");\n    }\n    return pDict->GetString(FX_BSTRC(\"Duplex\"));\n}\n"
  },
  {
    "path": "core/src/fpdfdoc/doc_vt.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fpdfdoc/fpdf_doc.h\"\n#include \"../../include/fpdfdoc/fpdf_vt.h\"\n#include \"pdf_vt.h\"\nconst FX_BYTE gFontSizeSteps[] = {\t4, 6, 8, 9, 10,\t12, 14, 18, 20, 25,\t30, 35, 40, 45, 50,\t55, 60, 70, 80, 90,\t100, 110, 120, 130, 144};\n#define PVT_RETURN_LENGTH\t\t\t\t\t1\n#define PVT_DEFAULT_FONTSIZE\t\t\t\t18.0f\n#define PVTWORD_SCRIPT_NORMAL\t\t\t\t0\n#define PVTWORD_SCRIPT_SUPER\t\t\t\t1\n#define PVTWORD_SCRIPT_SUB\t\t\t\t\t2\n#define\tPVT_FONTSCALE\t\t\t\t\t\t0.001f\n#define PVT_PERCENT\t\t\t\t\t\t\t0.01f\n#define PVT_HALF\t\t\t\t\t\t\t0.5f\nCLine::CLine()\n{\n}\nCLine::~CLine()\n{\n}\nCPVT_WordPlace CLine::GetBeginWordPlace() const\n{\n    return CPVT_WordPlace(LinePlace.nSecIndex, LinePlace.nLineIndex, -1);\n}\nCPVT_WordPlace CLine::GetEndWordPlace() const\n{\n    return CPVT_WordPlace(LinePlace.nSecIndex, LinePlace.nLineIndex, m_LineInfo.nEndWordIndex);\n}\nCPVT_WordPlace CLine::GetPrevWordPlace(const CPVT_WordPlace & place) const\n{\n    if (place.nWordIndex > m_LineInfo.nEndWordIndex) {\n        return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, m_LineInfo.nEndWordIndex);\n    }\n    return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, place.nWordIndex - 1);\n}\nCPVT_WordPlace CLine::GetNextWordPlace(const CPVT_WordPlace & place) const\n{\n    if (place.nWordIndex < m_LineInfo.nBeginWordIndex) {\n        return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, m_LineInfo.nBeginWordIndex);\n    }\n    return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, place.nWordIndex + 1);\n}\nCSection::CSection(CPDF_VariableText * pVT) : m_pVT(pVT)\n{\n}\nCSection::~CSection()\n{\n    ResetAll();\n}\nvoid CSection::ResetAll()\n{\n    ResetWordArray();\n    ResetLineArray();\n}\nvoid CSection::ResetLineArray()\n{\n    m_LineArray.RemoveAll();\n}\nvoid CSection::ResetWordArray()\n{\n    for (FX_INT32 i = 0, sz = m_WordArray.GetSize(); i < sz; i++) {\n        delete m_WordArray.GetAt(i);\n    }\n    m_WordArray.RemoveAll();\n}\nvoid CSection::ResetLinePlace()\n{\n    for (FX_INT32 i = 0, sz = m_LineArray.GetSize(); i < sz; i++) {\n        if (CLine * pLine = m_LineArray.GetAt(i)) {\n            pLine->LinePlace = CPVT_WordPlace(SecPlace.nSecIndex, i, -1);\n        }\n    }\n}\nCPVT_WordPlace CSection::AddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo)\n{\n    if (CPVT_WordInfo * pWord = FX_NEW CPVT_WordInfo(wordinfo)) {\n        FX_INT32 nWordIndex = FPDF_MAX(FPDF_MIN(place.nWordIndex, this->m_WordArray.GetSize()), 0);\n        if (nWordIndex == m_WordArray.GetSize()) {\n            m_WordArray.Add(pWord);\n        } else {\n            m_WordArray.InsertAt(nWordIndex, pWord);\n        }\n    }\n    return place;\n}\nCPVT_WordPlace CSection::AddLine(const CPVT_LineInfo & lineinfo)\n{\n    return CPVT_WordPlace(SecPlace.nSecIndex, m_LineArray.Add(lineinfo), -1);\n}\nCPVT_FloatRect CSection::Rearrange()\n{\n    ASSERT(m_pVT != NULL);\n    if (m_pVT->m_nCharArray > 0) {\n        return CTypeset(this).CharArray();\n    } else {\n        return CTypeset(this).Typeset();\n    }\n}\nCPVT_Size CSection::GetSectionSize(FX_FLOAT fFontSize)\n{\n    return CTypeset(this).GetEditSize(fFontSize);\n}\nCPVT_WordPlace CSection::GetBeginWordPlace() const\n{\n    if (CLine * pLine = m_LineArray.GetAt(0)) {\n        return pLine->GetBeginWordPlace();\n    } else {\n        return SecPlace;\n    }\n}\nCPVT_WordPlace CSection::GetEndWordPlace() const\n{\n    if (CLine * pLine = m_LineArray.GetAt(m_LineArray.GetSize() - 1)) {\n        return pLine->GetEndWordPlace();\n    } else {\n        return this->SecPlace;\n    }\n}\nCPVT_WordPlace CSection::GetPrevWordPlace(const CPVT_WordPlace & place) const\n{\n    if (place.nLineIndex < 0) {\n        return GetBeginWordPlace();\n    }\n    if (place.nLineIndex >= m_LineArray.GetSize()) {\n        return GetEndWordPlace();\n    }\n    if (CLine * pLine = m_LineArray.GetAt(place.nLineIndex)) {\n        if (place.nWordIndex == pLine->m_LineInfo.nBeginWordIndex) {\n            return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, -1);\n        } else if (place.nWordIndex < pLine->m_LineInfo.nBeginWordIndex) {\n            if (CLine * pPrevLine = m_LineArray.GetAt(place.nLineIndex - 1)) {\n                return pPrevLine->GetEndWordPlace();\n            }\n        } else {\n            return pLine->GetPrevWordPlace(place);\n        }\n    }\n    return place;\n}\nCPVT_WordPlace CSection::GetNextWordPlace(const CPVT_WordPlace & place) const\n{\n    if (place.nLineIndex < 0) {\n        return GetBeginWordPlace();\n    }\n    if (place.nLineIndex >= m_LineArray.GetSize()) {\n        return GetEndWordPlace();\n    }\n    if (CLine * pLine = m_LineArray.GetAt(place.nLineIndex)) {\n        if (place.nWordIndex >= pLine->m_LineInfo.nEndWordIndex) {\n            if (CLine * pNextLine = m_LineArray.GetAt(place.nLineIndex + 1)) {\n                return pNextLine->GetBeginWordPlace();\n            }\n        } else {\n            return pLine->GetNextWordPlace(place);\n        }\n    }\n    return place;\n}\nvoid CSection::UpdateWordPlace(CPVT_WordPlace & place) const\n{\n    FX_INT32 nLeft = 0;\n    FX_INT32 nRight = m_LineArray.GetSize() - 1;\n    FX_INT32 nMid = (nLeft + nRight) / 2;\n    while (nLeft <= nRight) {\n        if (CLine * pLine = m_LineArray.GetAt(nMid)) {\n            if (place.nWordIndex < pLine->m_LineInfo.nBeginWordIndex) {\n                nRight = nMid - 1;\n                nMid = (nLeft + nRight) / 2;\n            } else if (place.nWordIndex > pLine->m_LineInfo.nEndWordIndex) {\n                nLeft = nMid + 1;\n                nMid = (nLeft + nRight) / 2;\n            } else {\n                place.nLineIndex = nMid;\n                return;\n            }\n        } else {\n            break;\n        }\n    }\n}\nCPVT_WordPlace CSection::SearchWordPlace(const CPDF_Point & point) const\n{\n    ASSERT(m_pVT != NULL);\n    CPVT_WordPlace place = GetBeginWordPlace();\n    FX_BOOL bUp = TRUE;\n    FX_BOOL bDown = TRUE;\n    FX_INT32 nLeft = 0;\n    FX_INT32 nRight = m_LineArray.GetSize() - 1;\n    FX_INT32 nMid = m_LineArray.GetSize() / 2;\n    FX_FLOAT fTop = 0;\n    FX_FLOAT fBottom = 0;\n    while (nLeft <= nRight) {\n        if (CLine * pLine = m_LineArray.GetAt(nMid)) {\n            fTop = pLine->m_LineInfo.fLineY - pLine->m_LineInfo.fLineAscent - m_pVT->GetLineLeading(m_SecInfo);\n            fBottom = pLine->m_LineInfo.fLineY - pLine->m_LineInfo.fLineDescent;\n            if (IsFloatBigger(point.y, fTop)) {\n                bUp = FALSE;\n            }\n            if (IsFloatSmaller(point.y, fBottom)) {\n                bDown = FALSE;\n            }\n            if (IsFloatSmaller(point.y, fTop)) {\n                nRight = nMid - 1;\n                nMid = (nLeft + nRight) / 2;\n                continue;\n            } else if (IsFloatBigger(point.y, fBottom)) {\n                nLeft = nMid + 1;\n                nMid = (nLeft + nRight) / 2;\n                continue;\n            } else {\n                place = SearchWordPlace(point.x,\n                                        CPVT_WordRange(pLine->GetNextWordPlace(pLine->GetBeginWordPlace()), pLine->GetEndWordPlace())\n                                       );\n                place.nLineIndex = nMid;\n                return place;\n            }\n        }\n    }\n    if (bUp) {\n        place = GetBeginWordPlace();\n    }\n    if (bDown) {\n        place = GetEndWordPlace();\n    }\n    return place;\n}\nCPVT_WordPlace CSection::SearchWordPlace(FX_FLOAT fx, const CPVT_WordPlace & lineplace) const\n{\n    if (CLine * pLine = m_LineArray.GetAt(lineplace.nLineIndex)) {\n        return SearchWordPlace(fx - m_SecInfo.rcSection.left,\n                               CPVT_WordRange(pLine->GetNextWordPlace(pLine->GetBeginWordPlace()), pLine->GetEndWordPlace()));\n    }\n    return GetBeginWordPlace();\n}\nCPVT_WordPlace CSection::SearchWordPlace(FX_FLOAT fx, const CPVT_WordRange & range) const\n{\n    CPVT_WordPlace wordplace = range.BeginPos;\n    wordplace.nWordIndex = -1;\n    if (!m_pVT)\t{\n        return wordplace;\n    }\n    FX_INT32 nLeft = range.BeginPos.nWordIndex;\n    FX_INT32 nRight = range.EndPos.nWordIndex + 1;\n    FX_INT32 nMid = (nLeft + nRight) / 2;\n    while (nLeft < nRight) {\n        if (nMid == nLeft) {\n            break;\n        }\n        if (nMid == nRight) {\n            nMid--;\n            break;\n        }\n        if (CPVT_WordInfo * pWord = m_WordArray.GetAt(nMid)) {\n            if (fx > pWord->fWordX + m_pVT->GetWordWidth(*pWord) * PVT_HALF) {\n                nLeft = nMid;\n                nMid = (nLeft + nRight) / 2;\n                continue;\n            } else {\n                nRight = nMid;\n                nMid = (nLeft + nRight) / 2;\n                continue;\n            }\n        } else {\n            break;\n        }\n    }\n    if (CPVT_WordInfo * pWord = m_WordArray.GetAt(nMid)) {\n        if (fx > pWord->fWordX + m_pVT->GetWordWidth(*pWord) * PVT_HALF) {\n            wordplace.nWordIndex = nMid;\n        }\n    }\n    return wordplace;\n}\nvoid CSection::ClearLeftWords(FX_INT32 nWordIndex)\n{\n    for (FX_INT32 i = nWordIndex; i >= 0; i--) {\n        delete m_WordArray.GetAt(i);\n        m_WordArray.RemoveAt(i);\n    }\n}\nvoid CSection::ClearRightWords(FX_INT32 nWordIndex)\n{\n    for (FX_INT32 i = m_WordArray.GetSize() - 1; i > nWordIndex; i--) {\n        delete m_WordArray.GetAt(i);\n        m_WordArray.RemoveAt(i);\n    }\n}\nvoid CSection::ClearMidWords(FX_INT32 nBeginIndex, FX_INT32 nEndIndex)\n{\n    for (FX_INT32 i = nEndIndex; i > nBeginIndex; i--) {\n        delete m_WordArray.GetAt(i);\n        m_WordArray.RemoveAt(i);\n    }\n}\nvoid CSection::ClearWords(const CPVT_WordRange & PlaceRange)\n{\n    CPVT_WordPlace SecBeginPos = GetBeginWordPlace();\n    CPVT_WordPlace SecEndPos = GetEndWordPlace();\n    if (PlaceRange.BeginPos.WordCmp(SecBeginPos) >= 0) {\n        if (PlaceRange.EndPos.WordCmp(SecEndPos) <= 0) {\n            ClearMidWords(PlaceRange.BeginPos.nWordIndex, PlaceRange.EndPos.nWordIndex);\n        } else {\n            ClearRightWords(PlaceRange.BeginPos.nWordIndex);\n        }\n    } else if (PlaceRange.EndPos.WordCmp(SecEndPos) <= 0) {\n        ClearLeftWords(PlaceRange.EndPos.nWordIndex);\n    } else {\n        ResetWordArray();\n    }\n}\nvoid CSection::ClearWord(const CPVT_WordPlace & place)\n{\n    delete m_WordArray.GetAt(place.nWordIndex);\n    m_WordArray.RemoveAt(place.nWordIndex);\n}\nCTypeset::CTypeset(CSection * pSection) : m_pSection(pSection), m_pVT(pSection->m_pVT), m_rcRet(0.0f, 0.0f, 0.0f, 0.0f)\n{\n}\nCTypeset::~CTypeset()\n{\n}\nCPVT_FloatRect CTypeset::CharArray()\n{\n    ASSERT(m_pSection != NULL);\n    ASSERT(m_pVT != NULL);\n    FX_FLOAT fLineAscent = m_pVT->GetFontAscent(m_pVT->GetDefaultFontIndex(), m_pVT->GetFontSize());\n    FX_FLOAT fLineDescent = m_pVT->GetFontDescent(m_pVT->GetDefaultFontIndex(), m_pVT->GetFontSize());\n    m_rcRet.Default();\n    FX_FLOAT x = 0.0f, y = 0.0f;\n    FX_FLOAT fNextWidth;\n    FX_INT32 nStart = 0;\n    FX_FLOAT fNodeWidth = m_pVT->GetPlateWidth() / (m_pVT->m_nCharArray <= 0 ? 1 : m_pVT->m_nCharArray);\n    if (CLine * pLine = m_pSection->m_LineArray.GetAt(0)) {\n        x = 0.0f;\n        y +=  m_pVT->GetLineLeading(m_pSection->m_SecInfo);\n        y += fLineAscent;\n        nStart = 0;\n        switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) {\n            case 0:\n                pLine->m_LineInfo.fLineX = fNodeWidth * PVT_HALF;\n                break;\n            case 1:\n                nStart = (m_pVT->m_nCharArray - m_pSection->m_WordArray.GetSize()) / 2;\n                pLine->m_LineInfo.fLineX = fNodeWidth * nStart - fNodeWidth * PVT_HALF;\n                break;\n            case 2:\n                nStart = m_pVT->m_nCharArray - m_pSection->m_WordArray.GetSize();\n                pLine->m_LineInfo.fLineX = fNodeWidth * nStart - fNodeWidth * PVT_HALF;\n                break;\n        }\n        for (FX_INT32 w = 0, sz = m_pSection->m_WordArray.GetSize(); w < sz; w++) {\n            if (w >= m_pVT->m_nCharArray) {\n                break;\n            }\n            fNextWidth = 0;\n            if (CPVT_WordInfo * pNextWord = (CPVT_WordInfo *)m_pSection->m_WordArray.GetAt(w + 1)) {\n                pNextWord->fWordTail = 0;\n                fNextWidth = m_pVT->GetWordWidth(*pNextWord);\n            }\n            if (CPVT_WordInfo * pWord = (CPVT_WordInfo *)m_pSection->m_WordArray.GetAt(w)) {\n                pWord->fWordTail = 0;\n                FX_FLOAT fWordWidth = m_pVT->GetWordWidth(*pWord);\n                FX_FLOAT fWordAscent = m_pVT->GetWordAscent(*pWord);\n                FX_FLOAT fWordDescent = m_pVT->GetWordDescent(*pWord);\n                x = (FX_FLOAT)(fNodeWidth * (w + nStart + 0.5) - fWordWidth * PVT_HALF);\n                pWord->fWordX = x;\n                pWord->fWordY = y;\n                if (w == 0) {\n                    pLine->m_LineInfo.fLineX = x;\n                }\n                if (w != m_pSection->m_WordArray.GetSize() - 1)\n                    pWord->fWordTail = (fNodeWidth - (fWordWidth + fNextWidth) * PVT_HALF > 0 ?\n                                        fNodeWidth - (fWordWidth + fNextWidth) * PVT_HALF : 0);\n                else {\n                    pWord->fWordTail = 0;\n                }\n                x += fWordWidth;\n                fLineAscent = FPDF_MAX(fLineAscent, fWordAscent);\n                fLineDescent = FPDF_MIN(fLineDescent, fWordDescent);\n            }\n        }\n        pLine->m_LineInfo.nBeginWordIndex = 0;\n        pLine->m_LineInfo.nEndWordIndex = m_pSection->m_WordArray.GetSize() - 1;\n        pLine->m_LineInfo.fLineY = y;\n        pLine->m_LineInfo.fLineWidth = \tx - pLine->m_LineInfo.fLineX;\n        pLine->m_LineInfo.fLineAscent = fLineAscent;\n        pLine->m_LineInfo.fLineDescent = fLineDescent;\n        y += (-fLineDescent);\n    }\n    return m_rcRet = CPVT_FloatRect(0, 0, x, y);\n}\nCPVT_Size CTypeset::GetEditSize(FX_FLOAT fFontSize)\n{\n    ASSERT(m_pSection != NULL);\n    ASSERT(m_pVT != NULL);\n    SplitLines(FALSE, fFontSize);\n    return CPVT_Size(m_rcRet.Width(), m_rcRet.Height());\n}\nCPVT_FloatRect CTypeset::Typeset()\n{\n    ASSERT(m_pSection != NULL);\n    ASSERT(m_pVT != NULL);\n    m_pSection->m_LineArray.Empty();\n    SplitLines(TRUE, 0.0f);\n    m_pSection->m_LineArray.Clear();\n    OutputLines();\n    return m_rcRet;\n}\nstatic int special_chars[128] = {\n    0x0000, 0x000C, 0x0008, 0x000C, 0x0008, 0x0000, 0x0020, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0008, 0x0008, 0x0000, 0x0010, 0x0000, 0x0000, 0x0028,\n    0x000C, 0x0008, 0x0000, 0x0000, 0x0028, 0x0028, 0x0028, 0x0028,\n    0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,\n    0x0002, 0x0002, 0x0008, 0x0008, 0x0000, 0x0000, 0x0000, 0x0008,\n    0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,\n    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,\n    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,\n    0x0001, 0x0001, 0x0001, 0x000C, 0x0000, 0x0008, 0x0000, 0x0000,\n    0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,\n    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,\n    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,\n    0x0001, 0x0001, 0x0001, 0x000C, 0x0000, 0x0008, 0x0000, 0x0000,\n};\nstatic FX_BOOL IsLatin(FX_WORD word)\n{\n    if (word <= 0x007F) {\n        if (special_chars[word] & 0x0001) {\n            return TRUE;\n        }\n    }\n    if ((word >= 0x00C0 && word <= 0x00FF) ||\n            (word >= 0x0100 && word <= 0x024F) ||\n            (word >= 0x1E00 && word <= 0x1EFF) ||\n            (word >= 0x2C60 && word <= 0x2C7F) ||\n            (word >= 0xA720 && word <= 0xA7FF) ||\n            (word >= 0xFF21 && word <= 0xFF3A) ||\n            (word >= 0xFF41 && word <= 0xFF5A)) {\n        return TRUE;\n    }\n    return FALSE;\n}\nstatic FX_BOOL IsDigit(FX_DWORD word)\n{\n    return (word >= 0x0030 && word <= 0x0039) ? TRUE : FALSE;\n}\nstatic FX_BOOL IsCJK(FX_DWORD word)\n{\n    if ((word >= 0x1100 && word <= 0x11FF) ||\n            (word >= 0x2E80 && word <= 0x2FFF) ||\n            (word >= 0x3040 && word <= 0x9FBF) ||\n            (word >= 0xAC00 && word <= 0xD7AF) ||\n            (word >= 0xF900 && word <= 0xFAFF) ||\n            (word >= 0xFE30 && word <= 0xFE4F) ||\n            (word >= 0x20000 && word <= 0x2A6DF) ||\n            (word >= 0x2F800 && word <= 0x2FA1F)) {\n        return TRUE;\n    }\n    if (word >= 0x3000 && word <= 0x303F) {\n        if (word == 0x3005 || word == 0x3006 || word == 0x3021 || word == 0x3022 ||\n                word == 0x3023 || word == 0x3024 || word == 0x3025 || word == 0x3026 ||\n                word == 0x3027 || word == 0x3028 || word == 0x3029 || word == 0x3031 ||\n                word == 0x3032 || word == 0x3033 || word == 0x3034 || word == 0x3035) {\n            return TRUE;\n        }\n        return FALSE;\n    }\n    if (word >= 0xFF66 && word <= 0xFF9D) {\n        return TRUE;\n    }\n    return FALSE;\n}\nstatic FX_BOOL IsPunctuation(FX_DWORD word)\n{\n    if (word <= 0x007F) {\n        if ((special_chars[word] >> 3) & 1) {\n            return TRUE;\n        }\n    } else if (word >= 0x0080 && word <= 0x00FF) {\n        if (word == 0x0082 || word == 0x0084 || word == 0x0085 || word == 0x0091 ||\n                word == 0x0092 || word == 0x0093 || word <= 0x0094 || word == 0x0096 ||\n                word == 0x00B4 || word == 0x00B8) {\n            return TRUE;\n        }\n    } else if (word >= 0x2000 && word <= 0x206F) {\n        if (word == 0x2010 || word == 0x2011 || word == 0x2012 || word == 0x2013 ||\n                word == 0x2018 || word == 0x2019 || word == 0x201A || word == 0x201B ||\n                word == 0x201C || word == 0x201D || word == 0x201E || word == 0x201F ||\n                word == 0x2032 || word == 0x2033 || word == 0x2034 || word == 0x2035 ||\n                word == 0x2036 || word == 0x2037 || word == 0x203C || word == 0x203D ||\n                word == 0x203E || word == 0x2044) {\n            return TRUE;\n        }\n    } else if (word >= 0x3000 && word <= 0x303F) {\n        if (word == 0x3001 || word == 0x3002 || word == 0x3003 || word == 0x3005 ||\n                word == 0x3009 || word == 0x300A || word == 0x300B || word == 0x300C ||\n                word == 0x300D || word == 0x300F || word == 0x300E || word == 0x3010 ||\n                word == 0x3011 || word == 0x3014 || word == 0x3015 || word == 0x3016 ||\n                word == 0x3017 || word == 0x3018 || word == 0x3019 || word == 0x301A ||\n                word == 0x301B || word == 0x301D || word == 0x301E || word == 0x301F) {\n            return TRUE;\n        }\n    } else if (word >= 0xFE50 && word <= 0xFE6F) {\n        if ((word >= 0xFE50 && word <= 0xFE5E) || word == 0xFE63) {\n            return TRUE;\n        }\n    } else if (word >= 0xFF00 && word <= 0xFFEF) {\n        if (word == 0xFF01 || word == 0xFF02 || word == 0xFF07 || word == 0xFF08 ||\n                word == 0xFF09 || word == 0xFF0C || word == 0xFF0E || word == 0xFF0F ||\n                word == 0xFF1A || word == 0xFF1B || word == 0xFF1F || word == 0xFF3B ||\n                word == 0xFF3D || word == 0xFF40 || word == 0xFF5B || word == 0xFF5C ||\n                word == 0xFF5D || word == 0xFF61 || word == 0xFF62 || word == 0xFF63 ||\n                word == 0xFF64 || word == 0xFF65 || word == 0xFF9E || word == 0xFF9F) {\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nstatic FX_BOOL IsConnectiveSymbol(FX_DWORD word)\n{\n    if (word <= 0x007F) {\n        if ((special_chars[word] >> 5) & 1) {\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nstatic FX_BOOL IsOpenStylePunctuation(FX_DWORD word)\n{\n    if (word <= 0x007F) {\n        if ((special_chars[word] >> 2) & 1) {\n            return TRUE;\n        }\n    } else if (word == 0x300A || word == 0x300C || word == 0x300E || word == 0x3010 ||\n               word == 0x3014 || word == 0x3016 || word == 0x3018 || word == 0x301A ||\n               word == 0xFF08 || word == 0xFF3B || word == 0xFF5B || word == 0xFF62) {\n        return TRUE;\n    }\n    return FALSE;\n}\nstatic FX_BOOL IsCurrencySymbol(FX_WORD word)\n{\n    if (word == 0x0024 || word == 0x0080 || word == 0x00A2 || word == 0x00A3 ||\n            word == 0x00A4 || word == 0x00A5 || (word >= 0x20A0 && word <= 0x20CF) ||\n            word == 0xFE69 || word == 0xFF04 || word == 0xFFE0 || word == 0xFFE1 ||\n            word == 0xFFE5 || word == 0xFFE6) {\n        return TRUE;\n    }\n    return FALSE;\n}\nstatic FX_BOOL IsPrefixSymbol(FX_WORD word)\n{\n    if (IsCurrencySymbol(word)) {\n        return TRUE;\n    }\n    if (word == 0x2116) {\n        return TRUE;\n    }\n    return FALSE;\n}\nstatic FX_BOOL IsSpace(FX_WORD word)\n{\n    return (word == 0x0020 || word == 0x3000) ? TRUE : FALSE;\n}\nstatic FX_BOOL NeedDivision(FX_WORD prevWord, FX_WORD curWord)\n{\n    if ((IsLatin(prevWord) || IsDigit(prevWord)) && (IsLatin(curWord) || IsDigit(curWord))) {\n        return FALSE;\n    } else if (IsSpace(curWord) || IsPunctuation(curWord)) {\n        return FALSE;\n    } else if (IsConnectiveSymbol(prevWord) || IsConnectiveSymbol(curWord)) {\n        return FALSE;\n    } else if (IsSpace(prevWord) || IsPunctuation(prevWord)) {\n        return TRUE;\n    } else if (IsPrefixSymbol(prevWord)) {\n        return FALSE;\n    } else if (IsPrefixSymbol(curWord) || IsCJK(curWord)) {\n        return TRUE;\n    } else if (IsCJK(prevWord)) {\n        return TRUE;\n    }\n    return FALSE;\n}\nvoid CTypeset::SplitLines(FX_BOOL bTypeset, FX_FLOAT fFontSize)\n{\n    ASSERT(m_pVT != NULL);\n    ASSERT(m_pSection != NULL);\n    FX_INT32 nLineHead = 0;\n    FX_INT32 nLineTail = 0;\n    FX_FLOAT fMaxX = 0.0f, fMaxY = 0.0f;\n    FX_FLOAT fLineWidth = 0.0f, fBackupLineWidth = 0.0f;\n    FX_FLOAT fLineAscent = 0.0f, fBackupLineAscent = 0.0f;\n    FX_FLOAT fLineDescent = 0.0f, fBackupLineDescent = 0.0f;\n    FX_INT32 nWordStartPos = 0;\n    FX_BOOL bFullWord = FALSE;\n    FX_INT32 nLineFullWordIndex = 0;\n    FX_INT32 nCharIndex = 0;\n    CPVT_LineInfo line;\n    FX_FLOAT fWordWidth = 0;\n    FX_FLOAT fTypesetWidth = FPDF_MAX(m_pVT->GetPlateWidth() - m_pVT->GetLineIndent(m_pSection->m_SecInfo), 0.0f);\n    FX_INT32 nTotalWords = m_pSection->m_WordArray.GetSize();\n    FX_BOOL bOpened = FALSE;\n    if (nTotalWords > 0) {\n        FX_INT32 i = 0;\n        while (i < nTotalWords) {\n            CPVT_WordInfo * pWord = m_pSection->m_WordArray.GetAt(i);\n            CPVT_WordInfo* pOldWord = pWord;\n            if (i > 0) {\n                pOldWord = m_pSection->m_WordArray.GetAt(i - 1);\n            }\n            if (pWord) {\n                if (bTypeset) {\n                    fLineAscent = FPDF_MAX(fLineAscent, m_pVT->GetWordAscent(*pWord, TRUE));\n                    fLineDescent = FPDF_MIN(fLineDescent, m_pVT->GetWordDescent(*pWord, TRUE));\n                    fWordWidth = m_pVT->GetWordWidth(*pWord);\n                } else {\n                    fLineAscent = FPDF_MAX(fLineAscent, m_pVT->GetWordAscent(*pWord, fFontSize));\n                    fLineDescent = FPDF_MIN(fLineDescent, m_pVT->GetWordDescent(*pWord, fFontSize));\n                    fWordWidth = m_pVT->GetWordWidth(pWord->nFontIndex,\n                                                     pWord->Word,\n                                                     m_pVT->m_wSubWord,\n                                                     m_pVT->m_fCharSpace,\n                                                     m_pVT->m_nHorzScale,\n                                                     fFontSize,\n                                                     pWord->fWordTail,\n                                                     0);\n                }\n                if (!bOpened) {\n                    if (IsOpenStylePunctuation(pWord->Word)) {\n                        bOpened = TRUE;\n                        bFullWord = TRUE;\n                    } else if (pOldWord != NULL) {\n                        if (NeedDivision(pOldWord->Word, pWord->Word)) {\n                            bFullWord = TRUE;\n                        }\n                    }\n                } else {\n                    if (!IsSpace(pWord->Word) && !IsOpenStylePunctuation(pWord->Word)) {\n                        bOpened = FALSE;\n                    }\n                }\n                if (bFullWord) {\n                    bFullWord = FALSE;\n                    if (nCharIndex > 0) {\n                        nLineFullWordIndex ++;\n                    }\n                    nWordStartPos = i;\n                    fBackupLineWidth = fLineWidth;\n                    fBackupLineAscent = fLineAscent;\n                    fBackupLineDescent = fLineDescent;\n                }\n                nCharIndex++;\n            }\n            if (m_pVT->m_bLimitWidth && fTypesetWidth > 0 &&\n                    fLineWidth + fWordWidth > fTypesetWidth) {\n                if (nLineFullWordIndex > 0) {\n                    i = nWordStartPos;\n                    fLineWidth = fBackupLineWidth;\n                    fLineAscent = fBackupLineAscent;\n                    fLineDescent = fBackupLineDescent;\n                }\n                if (nCharIndex == 1) {\n                    fLineWidth =  fWordWidth;\n                    i++;\n                }\n                nLineTail = i - 1;\n                if (bTypeset) {\n                    line.nBeginWordIndex = nLineHead;\n                    line.nEndWordIndex = nLineTail;\n                    line.nTotalWord = nLineTail - nLineHead + 1;\n                    line.fLineWidth = fLineWidth;\n                    line.fLineAscent = fLineAscent;\n                    line.fLineDescent = fLineDescent;\n                    m_pSection->AddLine(line);\n                }\n                fMaxY += (fLineAscent + m_pVT->GetLineLeading(m_pSection->m_SecInfo));\n                fMaxY += (-fLineDescent);\n                fMaxX = FPDF_MAX(fLineWidth, fMaxX);\n                nLineHead = i;\n                fLineWidth = 0.0f;\n                fLineAscent = 0.0f;\n                fLineDescent = 0.0f;\n                nCharIndex = 0;\n                nLineFullWordIndex = 0;\n                bFullWord = FALSE;\n            } else {\n                fLineWidth += fWordWidth;\n                i++;\n            }\n        }\n        if (nLineHead <= nTotalWords - 1) {\n            nLineTail = nTotalWords - 1;\n            if (bTypeset) {\n                line.nBeginWordIndex = nLineHead;\n                line.nEndWordIndex = nLineTail;\n                line.nTotalWord = nLineTail - nLineHead + 1;\n                line.fLineWidth = fLineWidth;\n                line.fLineAscent = fLineAscent;\n                line.fLineDescent = fLineDescent;\n                m_pSection->AddLine(line);\n            }\n            fMaxY += (fLineAscent + m_pVT->GetLineLeading(m_pSection->m_SecInfo));\n            fMaxY += (-fLineDescent);\n            fMaxX = FPDF_MAX(fLineWidth, fMaxX);\n        }\n    } else {\n        if (bTypeset) {\n            fLineAscent = m_pVT->GetLineAscent(m_pSection->m_SecInfo);\n            fLineDescent = m_pVT->GetLineDescent(m_pSection->m_SecInfo);\n        } else {\n            fLineAscent = m_pVT->GetFontAscent(m_pVT->GetDefaultFontIndex(), fFontSize);\n            fLineDescent = m_pVT->GetFontDescent(m_pVT->GetDefaultFontIndex(), fFontSize);\n        }\n        if (bTypeset) {\n            line.nBeginWordIndex = -1;\n            line.nEndWordIndex = -1;\n            line.nTotalWord = 0;\n            line.fLineWidth = 0;\n            line.fLineAscent = fLineAscent;\n            line.fLineDescent = fLineDescent;\n            m_pSection->AddLine(line);\n        }\n        fMaxY += (m_pVT->GetLineLeading(m_pSection->m_SecInfo) + fLineAscent + (-fLineDescent));\n    }\n    m_rcRet = CPVT_FloatRect(0, 0, fMaxX, fMaxY);\n}\nvoid CTypeset::OutputLines()\n{\n    ASSERT(m_pVT != NULL);\n    ASSERT(m_pSection != NULL);\n    FX_FLOAT fMinX = 0.0f, fMinY = 0.0f, fMaxX = 0.0f, fMaxY = 0.0f;\n    FX_FLOAT fPosX = 0.0f, fPosY = 0.0f;\n    FX_FLOAT fLineIndent = m_pVT->GetLineIndent(m_pSection->m_SecInfo);\n    FX_FLOAT fTypesetWidth = FPDF_MAX(m_pVT->GetPlateWidth() - fLineIndent, 0.0f);\n    switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) {\n        default:\n        case 0:\n            fMinX = 0.0f;\n            break;\n        case 1:\n            fMinX = (fTypesetWidth - m_rcRet.Width())  * PVT_HALF;\n            break;\n        case 2:\n            fMinX = fTypesetWidth - m_rcRet.Width();\n            break;\n    }\n    fMaxX = fMinX + m_rcRet.Width();\n    fMinY = 0.0f;\n    fMaxY = m_rcRet.Height();\n    FX_INT32 nTotalLines = m_pSection->m_LineArray.GetSize();\n    if (nTotalLines > 0) {\n        m_pSection->m_SecInfo.nTotalLine = nTotalLines;\n        for (FX_INT32 l = 0; l < nTotalLines; l++) {\n            if (CLine * pLine = m_pSection->m_LineArray.GetAt(l)) {\n                switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) {\n                    default:\n                    case 0:\n                        fPosX = 0;\n                        break;\n                    case 1:\n                        fPosX = (fTypesetWidth - pLine->m_LineInfo.fLineWidth) * PVT_HALF;\n                        break;\n                    case 2:\n                        fPosX = fTypesetWidth - pLine->m_LineInfo.fLineWidth;\n                        break;\n                }\n                fPosX += fLineIndent;\n                fPosY += m_pVT->GetLineLeading(m_pSection->m_SecInfo);\n                fPosY += pLine->m_LineInfo.fLineAscent;\n                pLine->m_LineInfo.fLineX = fPosX - fMinX;\n                pLine->m_LineInfo.fLineY = fPosY - fMinY;\n                for (FX_INT32 w = pLine->m_LineInfo.nBeginWordIndex; w <= pLine->m_LineInfo.nEndWordIndex; w++) {\n                    if (CPVT_WordInfo * pWord = m_pSection->m_WordArray.GetAt(w)) {\n                        pWord->fWordX = fPosX - fMinX;\n                        if (pWord->pWordProps) {\n                            switch (pWord->pWordProps->nScriptType) {\n                                default:\n                                case PVTWORD_SCRIPT_NORMAL:\n                                    pWord->fWordY = fPosY - fMinY;\n                                    break;\n                                case PVTWORD_SCRIPT_SUPER:\n                                    pWord->fWordY = fPosY - m_pVT->GetWordAscent(*pWord) - fMinY;\n                                    break;\n                                case PVTWORD_SCRIPT_SUB:\n                                    pWord->fWordY = fPosY - m_pVT->GetWordDescent(*pWord) - fMinY;\n                                    break;\n                            }\n                        } else {\n                            pWord->fWordY = fPosY - fMinY;\n                        }\n                        fPosX += m_pVT->GetWordWidth(*pWord);\n                    }\n                }\n                fPosY += (-pLine->m_LineInfo.fLineDescent);\n            }\n        }\n    }\n    m_rcRet = CPVT_FloatRect(fMinX, fMinY, fMaxX, fMaxY);\n}\nCPDF_VariableText::CPDF_VariableText() :\n    m_pVTProvider(NULL),\n    m_pVTIterator(NULL),\n    m_bInitial(FALSE),\n    m_bRichText(FALSE),\n    m_bMultiLine(FALSE),\n    m_bLimitWidth(FALSE),\n    m_bAutoFontSize(FALSE),\n    m_nLimitChar(0),\n    m_nCharArray(0),\n    m_nAlignment(0),\n    m_fCharSpace(0.0f),\n    m_fWordSpace(0.0f),\n    m_fFontSize(0.0f),\n    m_nHorzScale(100),\n    m_wSubWord(0),\n    m_fLineLeading(0.0f)\n{\n}\nCPDF_VariableText::~CPDF_VariableText()\n{\n    if (m_pVTIterator) {\n        delete m_pVTIterator;\n        m_pVTIterator = NULL;\n    }\n    ResetAll();\n}\nvoid CPDF_VariableText::Initialize()\n{\n    if (!m_bInitial) {\n        CPVT_SectionInfo secinfo;\n        if (m_bRichText) {\n            secinfo.pSecProps = FX_NEW CPVT_SecProps(0.0f, 0.0f, 0);\n            secinfo.pWordProps = FX_NEW CPVT_WordProps(GetDefaultFontIndex(), PVT_DEFAULT_FONTSIZE, 0, 0, 0);\n        }\n        CPVT_WordPlace place;\n        place.nSecIndex = 0;\n        AddSection(place, secinfo);\n        CPVT_LineInfo lineinfo;\n        lineinfo.fLineAscent = GetFontAscent(GetDefaultFontIndex(), GetFontSize());\n        lineinfo.fLineDescent = GetFontDescent(GetDefaultFontIndex(), GetFontSize());\n        AddLine(place, lineinfo);\n        if (CSection * pSection = m_SectionArray.GetAt(0)) {\n            pSection->ResetLinePlace();\n        }\n        m_bInitial = TRUE;\n    }\n}\nvoid CPDF_VariableText::ResetAll()\n{\n    m_bInitial = FALSE;\n    ResetSectionArray();\n}\nCPVT_WordPlace CPDF_VariableText::InsertWord(const CPVT_WordPlace & place, FX_WORD word, FX_INT32 charset,\n        const CPVT_WordProps * pWordProps)\n{\n    FX_INT32 nTotlaWords = this->GetTotalWords();\n    if (m_nLimitChar > 0 && nTotlaWords >= m_nLimitChar) {\n        return place;\n    }\n    if (m_nCharArray > 0 && nTotlaWords >= m_nCharArray) {\n        return place;\n    }\n    CPVT_WordPlace newplace = place;\n    newplace.nWordIndex ++;\n    if (m_bRichText) {\n        CPVT_WordProps * pNewProps = pWordProps ? FX_NEW CPVT_WordProps(*pWordProps) : FX_NEW CPVT_WordProps();\n        if (pNewProps) {\n            pNewProps->nFontIndex = GetWordFontIndex(word, charset, pWordProps->nFontIndex);\n            return AddWord(newplace, CPVT_WordInfo(word, charset, -1, pNewProps));\n        }\n    } else {\n        FX_INT32 nFontIndex = GetSubWord() > 0 ? GetDefaultFontIndex() : GetWordFontIndex(word, charset, GetDefaultFontIndex());\n        return AddWord(newplace, CPVT_WordInfo(word, charset, nFontIndex, NULL));\n    }\n    return place;\n}\nCPVT_WordPlace CPDF_VariableText::InsertSection(const CPVT_WordPlace & place, const CPVT_SecProps * pSecProps,\n        const CPVT_WordProps * pWordProps)\n{\n    FX_INT32 nTotlaWords = this->GetTotalWords();\n    if (m_nLimitChar > 0 && nTotlaWords >= m_nLimitChar) {\n        return place;\n    }\n    if (m_nCharArray > 0 && nTotlaWords >= m_nCharArray) {\n        return place;\n    }\n    if (!m_bMultiLine) {\n        return place;\n    }\n    CPVT_WordPlace wordplace = place;\n    UpdateWordPlace(wordplace);\n    CPVT_WordPlace newplace = place;\n    if (CSection * pSection = m_SectionArray.GetAt(wordplace.nSecIndex)) {\n        CPVT_WordPlace NewPlace(wordplace.nSecIndex + 1, 0, -1);\n        CPVT_SectionInfo secinfo;\n        if (m_bRichText) {\n            if (pSecProps) {\n                secinfo.pSecProps = FX_NEW CPVT_SecProps(*pSecProps);\n            }\n            if (pWordProps) {\n                secinfo.pWordProps = FX_NEW CPVT_WordProps(*pWordProps);\n            }\n        }\n        AddSection(NewPlace, secinfo);\n        newplace = NewPlace;\n        if (CSection * pNewSection = m_SectionArray.GetAt(NewPlace.nSecIndex)) {\n            for (FX_INT32 w = wordplace.nWordIndex + 1, sz = pSection->m_WordArray.GetSize(); w < sz; w++) {\n                if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(w)) {\n                    NewPlace.nWordIndex++;\n                    pNewSection->AddWord(NewPlace, *pWord);\n                }\n            }\n        }\n        ClearSectionRightWords(wordplace);\n    }\n    return newplace;\n}\nCPVT_WordPlace CPDF_VariableText::InsertText(const CPVT_WordPlace & place, FX_LPCWSTR text, FX_INT32 charset,\n        const CPVT_SecProps * pSecProps, const CPVT_WordProps * pProps)\n{\n    CFX_WideString swText = text;\n    CPVT_WordPlace wp = place;\n    for (FX_INT32 i = 0, sz = swText.GetLength(); i < sz; i++) {\n        CPVT_WordPlace oldwp = wp;\n        FX_WORD word = swText.GetAt(i);\n        switch (word) {\n            case 0x0D:\n                if (m_bMultiLine) {\n                    if (swText.GetAt(i + 1) == 0x0A) {\n                        i += 1;\n                    }\n                    wp = InsertSection(wp, pSecProps, pProps);\n                }\n                break;\n            case 0x0A:\n                if (m_bMultiLine) {\n                    if (swText.GetAt(i + 1) == 0x0D) {\n                        i += 1;\n                    }\n                    wp = InsertSection(wp, pSecProps, pProps);\n                }\n                break;\n            case 0x09:\n                word = 0x20;\n            default:\n                wp = InsertWord(wp, word, charset, pProps);\n                break;\n        }\n        if (wp == oldwp) {\n            break;\n        }\n    }\n    return wp;\n}\nCPVT_WordPlace CPDF_VariableText::DeleteWords(const CPVT_WordRange & PlaceRange)\n{\n    FX_BOOL bLastSecPos = FALSE;\n    if (CSection * pSection = m_SectionArray.GetAt(PlaceRange.EndPos.nSecIndex)) {\n        bLastSecPos = (PlaceRange.EndPos == pSection->GetEndWordPlace());\n    }\n    ClearWords(PlaceRange);\n    if (PlaceRange.BeginPos.nSecIndex != PlaceRange.EndPos.nSecIndex) {\n        ClearEmptySections(PlaceRange);\n        if (!bLastSecPos) {\n            LinkLatterSection(PlaceRange.BeginPos);\n        }\n    }\n    return PlaceRange.BeginPos;\n}\nCPVT_WordPlace CPDF_VariableText::DeleteWord(const CPVT_WordPlace & place)\n{\n    return ClearRightWord(AjustLineHeader(place, TRUE));\n}\nCPVT_WordPlace CPDF_VariableText::BackSpaceWord(const CPVT_WordPlace & place)\n{\n    return ClearLeftWord(AjustLineHeader(place, TRUE));\n}\nvoid CPDF_VariableText::SetText(FX_LPCWSTR text, FX_INT32 charset, const CPVT_SecProps * pSecProps,\n                                const CPVT_WordProps * pWordProps)\n{\n    DeleteWords(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace()));\n    CFX_WideString swText = text;\n    CPVT_WordPlace\twp(0, 0, -1);\n    CPVT_SectionInfo secinfo;\n    if (m_bRichText) {\n        if (pSecProps) {\n            secinfo.pSecProps = FX_NEW CPVT_SecProps(*pSecProps);\n        }\n        if (pWordProps) {\n            secinfo.pWordProps = FX_NEW CPVT_WordProps(*pWordProps);\n        }\n    }\n    if (CSection * pSection = m_SectionArray.GetAt(0)) {\n        pSection->m_SecInfo = secinfo;\n    }\n    FX_INT32 nCharCount = 0;\n    for (FX_INT32 i = 0, sz = swText.GetLength(); i < sz; i++) {\n        if (m_nLimitChar > 0 && nCharCount >= m_nLimitChar) {\n            break;\n        }\n        if (m_nCharArray > 0 && nCharCount >= m_nCharArray) {\n            break;\n        }\n        FX_WORD word = swText.GetAt(i);\n        switch (word) {\n            case 0x0D:\n                if (m_bMultiLine) {\n                    if (swText.GetAt(i + 1) == 0x0A) {\n                        i += 1;\n                    }\n                    wp.nSecIndex ++;\n                    wp.nLineIndex = 0;\n                    wp.nWordIndex = -1;\n                    AddSection(wp, secinfo);\n                }\n                break;\n            case 0x0A:\n                if (m_bMultiLine) {\n                    if (swText.GetAt(i + 1) == 0x0D) {\n                        i += 1;\n                    }\n                    wp.nSecIndex ++;\n                    wp.nLineIndex = 0;\n                    wp.nWordIndex = -1;\n                    AddSection(wp, secinfo);\n                }\n                break;\n            case 0x09:\n                word = 0x20;\n            default:\n                wp = InsertWord(wp, word, charset, pWordProps);\n                break;\n        }\n        nCharCount++;\n    }\n}\nvoid CPDF_VariableText::UpdateWordPlace(CPVT_WordPlace & place) const\n{\n    if (place.nSecIndex < 0) {\n        place = GetBeginWordPlace();\n    }\n    if (place.nSecIndex >= m_SectionArray.GetSize()) {\n        place = GetEndWordPlace();\n    }\n    place = AjustLineHeader(place, TRUE);\n    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {\n        pSection->UpdateWordPlace(place);\n    }\n}\nFX_INT32 CPDF_VariableText::WordPlaceToWordIndex(const CPVT_WordPlace & place) const\n{\n    CPVT_WordPlace newplace = place;\n    UpdateWordPlace(newplace);\n    FX_INT32 nIndex = 0;\n    FX_INT32 i = 0;\n    FX_INT32 sz = 0;\n    for (i = 0, sz = m_SectionArray.GetSize(); i < sz && i < newplace.nSecIndex; i++) {\n        if (CSection * pSection = m_SectionArray.GetAt(i)) {\n            nIndex += pSection->m_WordArray.GetSize();\n            if (i != m_SectionArray.GetSize() - 1) {\n                nIndex += PVT_RETURN_LENGTH;\n            }\n        }\n    }\n    if (i >= 0 && i < m_SectionArray.GetSize()) {\n        nIndex += newplace.nWordIndex + PVT_RETURN_LENGTH;\n    }\n    return nIndex;\n}\nCPVT_WordPlace CPDF_VariableText::WordIndexToWordPlace(FX_INT32 index) const\n{\n    CPVT_WordPlace place = GetBeginWordPlace();\n    FX_INT32 nOldIndex = 0 , nIndex = 0;\n    FX_BOOL bFind = FALSE;\n    for (FX_INT32 i = 0, sz = m_SectionArray.GetSize(); i < sz; i++) {\n        if (CSection * pSection = m_SectionArray.GetAt(i)) {\n            nIndex += pSection->m_WordArray.GetSize();\n            if (nIndex == index) {\n                place = pSection->GetEndWordPlace();\n                bFind = TRUE;\n                break;\n            } else if (nIndex > index) {\n                place.nSecIndex = i;\n                place.nWordIndex = index - nOldIndex - 1;\n                pSection->UpdateWordPlace(place);\n                bFind = TRUE;\n                break;\n            }\n            if (i != m_SectionArray.GetSize() - 1) {\n                nIndex += PVT_RETURN_LENGTH;\n            }\n            nOldIndex = nIndex;\n        }\n    }\n    if (!bFind) {\n        place = GetEndWordPlace();\n    }\n    return place;\n}\nCPVT_WordPlace CPDF_VariableText::GetBeginWordPlace() const\n{\n    return m_bInitial ? CPVT_WordPlace(0, 0, -1) : CPVT_WordPlace();\n}\nCPVT_WordPlace CPDF_VariableText::GetEndWordPlace() const\n{\n    if (CSection * pSection = m_SectionArray.GetAt(m_SectionArray.GetSize() - 1)) {\n        return pSection->GetEndWordPlace();\n    }\n    return CPVT_WordPlace();\n}\nCPVT_WordPlace CPDF_VariableText::GetPrevWordPlace(const CPVT_WordPlace & place) const\n{\n    if( place.nSecIndex < 0) {\n        return GetBeginWordPlace();\n    }\n    if (place.nSecIndex >= m_SectionArray.GetSize()) {\n        return GetEndWordPlace();\n    }\n    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {\n        if (place.WordCmp(pSection->GetBeginWordPlace()) <= 0) {\n            if (CSection * pPrevSection = m_SectionArray.GetAt(place.nSecIndex - 1)) {\n                return pPrevSection->GetEndWordPlace();\n            } else {\n                return GetBeginWordPlace();\n            }\n        } else {\n            return pSection->GetPrevWordPlace(place);\n        }\n    }\n    return place;\n}\nCPVT_WordPlace CPDF_VariableText::GetNextWordPlace(const CPVT_WordPlace & place) const\n{\n    if (place.nSecIndex < 0) {\n        return GetBeginWordPlace();\n    }\n    if (place.nSecIndex >= m_SectionArray.GetSize()) {\n        return GetEndWordPlace();\n    }\n    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {\n        if (place.WordCmp(pSection->GetEndWordPlace()) >= 0) {\n            if (CSection * pNextSection = m_SectionArray.GetAt(place.nSecIndex + 1)) {\n                return pNextSection->GetBeginWordPlace();\n            } else {\n                return GetEndWordPlace();\n            }\n        } else {\n            return pSection->GetNextWordPlace(place);\n        }\n    }\n    return place;\n}\nCPVT_WordPlace CPDF_VariableText::SearchWordPlace(const CPDF_Point & point) const\n{\n    CPDF_Point pt = OutToIn(point);\n    CPVT_WordPlace place = GetBeginWordPlace();\n    FX_INT32 nLeft = 0;\n    FX_INT32 nRight = m_SectionArray.GetSize() - 1;\n    FX_INT32 nMid = m_SectionArray.GetSize() / 2;\n    FX_BOOL bUp = TRUE;\n    FX_BOOL bDown = TRUE;\n    while (nLeft <= nRight) {\n        if (CSection * pSection = m_SectionArray.GetAt(nMid)) {\n            if (IsFloatBigger(pt.y, pSection->m_SecInfo.rcSection.top)) {\n                bUp = FALSE;\n            }\n            if (IsFloatBigger(pSection->m_SecInfo.rcSection.bottom, pt.y)) {\n                bDown = FALSE;\n            }\n            if (IsFloatSmaller(pt.y, pSection->m_SecInfo.rcSection.top)) {\n                nRight = nMid - 1;\n                nMid = (nLeft + nRight) / 2;\n                continue;\n            } else if (IsFloatBigger(pt.y, pSection->m_SecInfo.rcSection.bottom)) {\n                nLeft = nMid + 1;\n                nMid = (nLeft + nRight) / 2;\n                continue;\n            } else {\n                place = pSection->SearchWordPlace(\n                            CPDF_Point(pt.x - pSection->m_SecInfo.rcSection.left, pt.y - pSection->m_SecInfo.rcSection.top)\n                        );\n                place.nSecIndex = nMid;\n                return place;\n            }\n        } else {\n            break;\n        }\n    }\n    if (bUp) {\n        place = GetBeginWordPlace();\n    }\n    if (bDown) {\n        place = GetEndWordPlace();\n    }\n    return place;\n}\nCPVT_WordPlace CPDF_VariableText::GetUpWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const\n{\n    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {\n        CPVT_WordPlace temp =  place;\n        CPDF_Point pt = OutToIn(point);\n        if (temp.nLineIndex-- > 0) {\n            return pSection->SearchWordPlace(pt.x - pSection->m_SecInfo.rcSection.left, temp);\n        } else {\n            if (temp.nSecIndex-- > 0) {\n                if (CSection * pLastSection = m_SectionArray.GetAt(temp.nSecIndex)) {\n                    temp.nLineIndex = pLastSection->m_LineArray.GetSize() - 1;\n                    return pLastSection->SearchWordPlace(pt.x - pLastSection->m_SecInfo.rcSection.left, temp);\n                }\n            }\n        }\n    }\n    return place;\n}\nCPVT_WordPlace CPDF_VariableText::GetDownWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const\n{\n    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {\n        CPVT_WordPlace temp =  place;\n        CPDF_Point pt = OutToIn(point);\n        if (temp.nLineIndex++ < pSection->m_LineArray.GetSize() - 1) {\n            return pSection->SearchWordPlace(pt.x - pSection->m_SecInfo.rcSection.left, temp);\n        } else {\n            if (temp.nSecIndex++ < m_SectionArray.GetSize() - 1) {\n                if (CSection * pNextSection = m_SectionArray.GetAt(temp.nSecIndex)) {\n                    temp.nLineIndex = 0;\n                    return pNextSection->SearchWordPlace(pt.x - pSection->m_SecInfo.rcSection.left, temp);\n                }\n            }\n        }\n    }\n    return place;\n}\nCPVT_WordPlace CPDF_VariableText::GetLineBeginPlace(const CPVT_WordPlace & place) const\n{\n    return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, -1);\n}\nCPVT_WordPlace CPDF_VariableText::GetLineEndPlace(const CPVT_WordPlace & place) const\n{\n    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex))\n        if (CLine * pLine = pSection->m_LineArray.GetAt(place.nLineIndex)) {\n            return pLine->GetEndWordPlace();\n        }\n    return place;\n}\nCPVT_WordPlace CPDF_VariableText::GetSectionBeginPlace(const CPVT_WordPlace & place) const\n{\n    return CPVT_WordPlace(place.nSecIndex, 0, -1);\n}\nCPVT_WordPlace CPDF_VariableText::GetSectionEndPlace(const CPVT_WordPlace & place) const\n{\n    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {\n        return pSection->GetEndWordPlace();\n    }\n    return place;\n}\nFX_INT32 CPDF_VariableText::GetTotalWords() const\n{\n    FX_INT32 nTotal = 0;\n    for (FX_INT32 i = 0, sz = m_SectionArray.GetSize(); i < sz; i++)\n        if (CSection * pSection = m_SectionArray.GetAt(i)) {\n            nTotal += (pSection->m_WordArray.GetSize() + PVT_RETURN_LENGTH);\n        }\n    return nTotal - PVT_RETURN_LENGTH;\n}\nvoid CPDF_VariableText::ResetSectionArray()\n{\n    for (FX_INT32 s = 0, sz = m_SectionArray.GetSize(); s < sz; s++) {\n        delete m_SectionArray.GetAt(s);\n    }\n    m_SectionArray.RemoveAll();\n}\nCPVT_WordPlace CPDF_VariableText::AddSection(const CPVT_WordPlace & place, const CPVT_SectionInfo & secinfo)\n{\n    if (IsValid() && !m_bMultiLine) {\n        return place;\n    }\n    FX_INT32 nSecIndex = FPDF_MAX(FPDF_MIN(place.nSecIndex, m_SectionArray.GetSize()), 0);\n    CSection * pSection = FX_NEW CSection(this);\n    if (!pSection) {\n        return place;\n    }\n    pSection->m_SecInfo = secinfo;\n    pSection->SecPlace.nSecIndex = nSecIndex;\n    if (nSecIndex == m_SectionArray.GetSize()) {\n        m_SectionArray.Add(pSection);\n    } else {\n        m_SectionArray.InsertAt(nSecIndex, pSection);\n    }\n    return place;\n}\nCPVT_WordPlace CPDF_VariableText::AddLine(const CPVT_WordPlace & place, const CPVT_LineInfo & lineinfo)\n{\n    if (m_SectionArray.IsEmpty()) {\n        return place;\n    }\n    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {\n        return pSection->AddLine(lineinfo);\n    }\n    return place;\n}\nCPVT_WordPlace CPDF_VariableText::AddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo)\n{\n    if (m_SectionArray.GetSize() <= 0) {\n        return place;\n    }\n    CPVT_WordPlace newplace = place;\n    newplace.nSecIndex = FPDF_MAX(FPDF_MIN(newplace.nSecIndex, m_SectionArray.GetSize() - 1), 0);\n    if (CSection * pSection = m_SectionArray.GetAt(newplace.nSecIndex)) {\n        return pSection->AddWord(newplace, wordinfo);\n    }\n    return place;\n}\nFX_BOOL CPDF_VariableText::GetWordInfo(const CPVT_WordPlace & place, CPVT_WordInfo & wordinfo)\n{\n    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {\n        if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(place.nWordIndex)) {\n            wordinfo = *pWord;\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nFX_BOOL CPDF_VariableText::SetWordInfo(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo)\n{\n    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {\n        if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(place.nWordIndex)) {\n            *pWord = wordinfo;\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nFX_BOOL CPDF_VariableText::GetLineInfo(const CPVT_WordPlace & place, CPVT_LineInfo & lineinfo)\n{\n    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {\n        if (CLine * pLine = pSection->m_LineArray.GetAt(place.nLineIndex)) {\n            lineinfo = pLine->m_LineInfo;\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nFX_BOOL CPDF_VariableText::GetSectionInfo(const CPVT_WordPlace & place, CPVT_SectionInfo & secinfo)\n{\n    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {\n        secinfo = pSection->m_SecInfo;\n        return TRUE;\n    }\n    return FALSE;\n}\nCPDF_Rect CPDF_VariableText::GetContentRect() const\n{\n    return InToOut(CPDF_EditContainer::GetContentRect());\n}\nFX_FLOAT CPDF_VariableText::GetWordFontSize(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize)\n{\n    return m_bRichText && WordInfo.pWordProps ? (WordInfo.pWordProps->nScriptType == PVTWORD_SCRIPT_NORMAL || bFactFontSize ? WordInfo.pWordProps->fFontSize : WordInfo.pWordProps->fFontSize * PVT_HALF) : GetFontSize();\n}\nFX_INT32 CPDF_VariableText::GetWordFontIndex(const CPVT_WordInfo & WordInfo)\n{\n    return m_bRichText && WordInfo.pWordProps ? WordInfo.pWordProps->nFontIndex : WordInfo.nFontIndex;\n}\nFX_FLOAT CPDF_VariableText::GetWordWidth(FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord,\n        FX_FLOAT fCharSpace, FX_INT32 nHorzScale,\n        FX_FLOAT fFontSize, FX_FLOAT fWordTail, FX_INT32 nWordStyle)\n{\n    return (GetCharWidth(nFontIndex, Word, SubWord, nWordStyle) * fFontSize * PVT_FONTSCALE + fCharSpace) * nHorzScale * PVT_PERCENT + fWordTail;\n}\nFX_FLOAT CPDF_VariableText::GetWordWidth(const CPVT_WordInfo & WordInfo)\n{\n    return GetWordWidth(GetWordFontIndex(WordInfo), WordInfo.Word, GetSubWord(), GetCharSpace(WordInfo), GetHorzScale(WordInfo),\n                        GetWordFontSize(WordInfo), WordInfo.fWordTail,\n                        WordInfo.pWordProps ? WordInfo.pWordProps->nWordStyle : 0);\n}\nFX_FLOAT CPDF_VariableText::GetLineAscent(const CPVT_SectionInfo & SecInfo)\n{\n    return m_bRichText && SecInfo.pWordProps ? GetFontAscent(SecInfo.pWordProps->nFontIndex, SecInfo.pWordProps->fFontSize) :\n           GetFontAscent(GetDefaultFontIndex(), GetFontSize());\n}\nFX_FLOAT CPDF_VariableText::GetLineDescent(const CPVT_SectionInfo & SecInfo)\n{\n    return m_bRichText && SecInfo.pWordProps ? GetFontDescent(SecInfo.pWordProps->nFontIndex, SecInfo.pWordProps->fFontSize) :\n           GetFontDescent(GetDefaultFontIndex(), GetFontSize());\n}\nFX_FLOAT CPDF_VariableText::GetFontAscent(FX_INT32 nFontIndex, FX_FLOAT fFontSize)\n{\n    return (FX_FLOAT)GetTypeAscent(nFontIndex) * fFontSize * PVT_FONTSCALE;\n}\nFX_FLOAT CPDF_VariableText::GetFontDescent(FX_INT32 nFontIndex, FX_FLOAT fFontSize)\n{\n    return (FX_FLOAT)GetTypeDescent(nFontIndex) * fFontSize * PVT_FONTSCALE;\n}\nFX_FLOAT CPDF_VariableText::GetWordAscent(const CPVT_WordInfo & WordInfo, FX_FLOAT fFontSize)\n{\n    return GetFontAscent(GetWordFontIndex(WordInfo), fFontSize);\n}\nFX_FLOAT CPDF_VariableText::GetWordDescent(const CPVT_WordInfo & WordInfo, FX_FLOAT fFontSize)\n{\n    return GetFontDescent(GetWordFontIndex(WordInfo), fFontSize);\n}\nFX_FLOAT CPDF_VariableText::GetWordAscent(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize)\n{\n    return GetFontAscent(GetWordFontIndex(WordInfo), GetWordFontSize(WordInfo, bFactFontSize));\n}\nFX_FLOAT CPDF_VariableText::GetWordDescent(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize)\n{\n    return GetFontDescent(GetWordFontIndex(WordInfo), GetWordFontSize(WordInfo, bFactFontSize));\n}\nFX_FLOAT CPDF_VariableText::GetLineLeading(const CPVT_SectionInfo & SecInfo)\n{\n    return m_bRichText && SecInfo.pSecProps ? SecInfo.pSecProps->fLineLeading : m_fLineLeading;\n}\nFX_FLOAT CPDF_VariableText::GetLineIndent(const CPVT_SectionInfo & SecInfo)\n{\n    return m_bRichText && SecInfo.pSecProps ? SecInfo.pSecProps->fLineIndent : 0.0f;\n}\nFX_INT32 CPDF_VariableText::GetAlignment(const CPVT_SectionInfo& SecInfo)\n{\n    return m_bRichText && SecInfo.pSecProps ? SecInfo.pSecProps->nAlignment : this->m_nAlignment;\n}\nFX_FLOAT CPDF_VariableText::GetCharSpace(const CPVT_WordInfo & WordInfo)\n{\n    return m_bRichText && WordInfo.pWordProps ? WordInfo.pWordProps->fCharSpace : m_fCharSpace;\n}\nFX_INT32 CPDF_VariableText::GetHorzScale(const CPVT_WordInfo & WordInfo)\n{\n    return m_bRichText && WordInfo.pWordProps ? WordInfo.pWordProps->nHorzScale : m_nHorzScale;\n}\nvoid CPDF_VariableText::ClearSectionRightWords(const CPVT_WordPlace & place)\n{\n    CPVT_WordPlace wordplace = AjustLineHeader(place, TRUE);\n    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {\n        for (FX_INT32 w = pSection->m_WordArray.GetSize() - 1; w > wordplace.nWordIndex; w--) {\n            delete pSection->m_WordArray.GetAt(w);\n            pSection->m_WordArray.RemoveAt(w);\n        }\n    }\n}\nCPVT_WordPlace CPDF_VariableText::AjustLineHeader(const CPVT_WordPlace & place, FX_BOOL bPrevOrNext) const\n{\n    if (place.nWordIndex < 0 && place.nLineIndex > 0) {\n        if (bPrevOrNext) {\n            return GetPrevWordPlace(place);\n        } else {\n            return GetNextWordPlace(place);\n        }\n    }\n    return place;\n}\nFX_BOOL CPDF_VariableText::ClearEmptySection(const CPVT_WordPlace & place)\n{\n    if (place.nSecIndex == 0 && m_SectionArray.GetSize() == 1) {\n        return FALSE;\n    }\n    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {\n        if (pSection->m_WordArray.GetSize() == 0) {\n            delete pSection;\n            m_SectionArray.RemoveAt(place.nSecIndex);\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nvoid CPDF_VariableText::ClearEmptySections(const CPVT_WordRange & PlaceRange)\n{\n    CPVT_WordPlace wordplace;\n    for (FX_INT32 s = PlaceRange.EndPos.nSecIndex; s > PlaceRange.BeginPos.nSecIndex; s--) {\n        wordplace.nSecIndex = s;\n        ClearEmptySection(wordplace);\n    }\n}\nvoid CPDF_VariableText::LinkLatterSection(const CPVT_WordPlace & place)\n{\n    CPVT_WordPlace oldplace = AjustLineHeader(place, TRUE);\n    if (CSection * pNextSection = m_SectionArray.GetAt(place.nSecIndex + 1)) {\n        if (CSection * pSection = m_SectionArray.GetAt(oldplace.nSecIndex)) {\n            for (FX_INT32 w = 0, sz = pNextSection->m_WordArray.GetSize(); w < sz; w++) {\n                if (CPVT_WordInfo * pWord = pNextSection->m_WordArray.GetAt(w)) {\n                    oldplace.nWordIndex ++;\n                    pSection->AddWord(oldplace, *pWord);\n                }\n            }\n        }\n        delete pNextSection;\n        m_SectionArray.RemoveAt(place.nSecIndex + 1);\n    }\n}\nvoid CPDF_VariableText::ClearWords(const CPVT_WordRange & PlaceRange)\n{\n    CPVT_WordRange NewRange;\n    NewRange.BeginPos = AjustLineHeader(PlaceRange.BeginPos, TRUE);\n    NewRange.EndPos = AjustLineHeader(PlaceRange.EndPos, TRUE);\n    for (FX_INT32 s = NewRange.EndPos.nSecIndex; s >= NewRange.BeginPos.nSecIndex; s--) {\n        if (CSection * pSection = m_SectionArray.GetAt(s)) {\n            pSection->ClearWords(NewRange);\n        }\n    }\n}\nCPVT_WordPlace CPDF_VariableText::ClearLeftWord(const CPVT_WordPlace & place)\n{\n    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {\n        CPVT_WordPlace leftplace = this->GetPrevWordPlace(place);\n        if (leftplace != place) {\n            if (leftplace.nSecIndex != place.nSecIndex) {\n                if (pSection->m_WordArray.GetSize() == 0) {\n                    this->ClearEmptySection(place);\n                } else {\n                    this->LinkLatterSection(leftplace);\n                }\n            } else {\n                pSection->ClearWord(place);\n            }\n        }\n        return leftplace;\n    }\n    return place;\n}\nCPVT_WordPlace CPDF_VariableText::ClearRightWord(const CPVT_WordPlace & place)\n{\n    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {\n        CPVT_WordPlace rightplace = AjustLineHeader(this->GetNextWordPlace(place), FALSE);\n        if (rightplace != place) {\n            if(rightplace.nSecIndex != place.nSecIndex) {\n                LinkLatterSection(place);\n            } else {\n                pSection->ClearWord(rightplace);\n            }\n        }\n    }\n    return place;\n}\nvoid CPDF_VariableText::RearrangeAll()\n{\n    Rearrange(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace()));\n}\nvoid CPDF_VariableText::RearrangePart(const CPVT_WordRange & PlaceRange)\n{\n    Rearrange(PlaceRange);\n}\nCPVT_FloatRect CPDF_VariableText::Rearrange(const CPVT_WordRange & PlaceRange)\n{\n    CPVT_FloatRect rcRet;\n    if (IsValid()) {\n        if (m_bAutoFontSize) {\n            SetFontSize(GetAutoFontSize());\n            rcRet = RearrangeSections(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace()));\n        } else {\n            rcRet = RearrangeSections(PlaceRange);\n        }\n    }\n    SetContentRect(rcRet);\n    return rcRet;\n}\nFX_FLOAT CPDF_VariableText::GetAutoFontSize()\n{\n    FX_INT32 nTotal = sizeof(gFontSizeSteps) / sizeof(FX_BYTE);\n    if (IsMultiLine()) {\n        nTotal /= 4;\n    }\n    if (nTotal <= 0) {\n        return 0;\n    }\n    if (GetPlateWidth() <= 0) {\n        return 0;\n    }\n    FX_INT32 nLeft = 0;\n    FX_INT32 nRight = nTotal - 1;\n    FX_INT32 nMid = nTotal / 2;\n    while (nLeft <= nRight) {\n        if (IsBigger(gFontSizeSteps[nMid])) {\n            nRight = nMid - 1;\n            nMid = (nLeft + nRight) / 2;\n            continue;\n        } else {\n            nLeft = nMid + 1;\n            nMid = (nLeft + nRight) / 2;\n            continue;\n        }\n    }\n    return (FX_FLOAT)gFontSizeSteps[nMid];\n}\nFX_BOOL\tCPDF_VariableText::IsBigger(FX_FLOAT fFontSize)\n{\n    FX_BOOL bBigger =  FALSE;\n    CPVT_Size szTotal;\n    for (FX_INT32 s = 0, sz = m_SectionArray.GetSize(); s < sz; s++) {\n        if (CSection * pSection = m_SectionArray.GetAt(s)) {\n            CPVT_Size size = pSection->GetSectionSize(fFontSize);\n            szTotal.x = FPDF_MAX(size.x, szTotal.x);\n            szTotal.y += size.y;\n            if (IsFloatBigger(szTotal.x, GetPlateWidth())\n                    || IsFloatBigger(szTotal.y, GetPlateHeight())\n               ) {\n                bBigger = TRUE;\n                break;\n            }\n        }\n    }\n    return bBigger;\n}\nCPVT_FloatRect CPDF_VariableText::RearrangeSections(const CPVT_WordRange & PlaceRange)\n{\n    CPVT_WordPlace place;\n    FX_FLOAT fPosY = 0;\n    FX_FLOAT fOldHeight;\n    FX_INT32 nSSecIndex = PlaceRange.BeginPos.nSecIndex;\n    FX_INT32 nESecIndex = PlaceRange.EndPos.nSecIndex;\n    CPVT_FloatRect rcRet;\n    for (FX_INT32 s = 0, sz = m_SectionArray.GetSize(); s < sz; s++) {\n        place.nSecIndex = s;\n        if (CSection * pSection = m_SectionArray.GetAt(s)) {\n            pSection->SecPlace = place;\n            CPVT_FloatRect rcSec = pSection->m_SecInfo.rcSection;\n            if (s >= nSSecIndex) {\n                if (s <= nESecIndex) {\n                    rcSec = pSection->Rearrange();\n                    rcSec.top += fPosY;\n                    rcSec.bottom += fPosY;\n                } else {\n                    fOldHeight = pSection->m_SecInfo.rcSection.bottom - pSection->m_SecInfo.rcSection.top;\n                    rcSec.top = fPosY;\n                    rcSec.bottom = fPosY + fOldHeight;\n                }\n                pSection->m_SecInfo.rcSection = rcSec;\n                pSection->ResetLinePlace();\n            }\n            if (s == 0) {\n                rcRet = rcSec;\n            } else {\n                rcRet.left = FPDF_MIN(rcSec.left, rcRet.left);\n                rcRet.top = FPDF_MIN(rcSec.top, rcRet.top);\n                rcRet.right = FPDF_MAX(rcSec.right, rcRet.right);\n                rcRet.bottom = FPDF_MAX(rcSec.bottom, rcRet.bottom);\n            }\n            fPosY += rcSec.Height();\n        }\n    }\n    return rcRet;\n}\nFX_INT32 CPDF_VariableText::GetCharWidth(FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord, FX_INT32 nWordStyle)\n{\n    if (m_pVTProvider) {\n        if (SubWord > 0) {\n            return m_pVTProvider->GetCharWidth(nFontIndex, SubWord, nWordStyle);\n        } else {\n            return m_pVTProvider->GetCharWidth(nFontIndex, Word, nWordStyle);\n        }\n    }\n    return 0;\n}\nFX_INT32 CPDF_VariableText::GetTypeAscent(FX_INT32 nFontIndex)\n{\n    return m_pVTProvider ? m_pVTProvider->GetTypeAscent(nFontIndex) : 0;\n}\nFX_INT32 CPDF_VariableText::GetTypeDescent(FX_INT32 nFontIndex)\n{\n    return m_pVTProvider ? m_pVTProvider->GetTypeDescent(nFontIndex) : 0;\n}\nFX_INT32 CPDF_VariableText::GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex)\n{\n    return m_pVTProvider ? m_pVTProvider->GetWordFontIndex(word, charset, nFontIndex) : -1;\n}\nFX_INT32 CPDF_VariableText::GetDefaultFontIndex()\n{\n    return m_pVTProvider ? m_pVTProvider->GetDefaultFontIndex() : -1;\n}\nFX_BOOL\tCPDF_VariableText::IsLatinWord(FX_WORD word)\n{\n    return m_pVTProvider ? m_pVTProvider->IsLatinWord(word) : FALSE;\n}\nIPDF_VariableText_Iterator * CPDF_VariableText::GetIterator()\n{\n    if (!m_pVTIterator) {\n        return m_pVTIterator = FX_NEW CPDF_VariableText_Iterator(this);\n    }\n    return m_pVTIterator;\n}\nIPDF_VariableText_Provider*\tCPDF_VariableText::SetProvider(IPDF_VariableText_Provider * pProvider)\n{\n    IPDF_VariableText_Provider* pOld = m_pVTProvider;\n    m_pVTProvider = pProvider;\n    return pOld;\n}\nCPDF_VariableText_Iterator::CPDF_VariableText_Iterator(CPDF_VariableText * pVT):\n    m_pVT(pVT),\n    m_CurPos(-1, -1, -1)\n{\n}\nCPDF_VariableText_Iterator::~CPDF_VariableText_Iterator()\n{\n}\nvoid CPDF_VariableText_Iterator::SetAt(FX_INT32 nWordIndex)\n{\n    ASSERT(m_pVT != NULL);\n    m_CurPos = m_pVT->WordIndexToWordPlace(nWordIndex);\n}\nvoid CPDF_VariableText_Iterator::SetAt(const CPVT_WordPlace & place)\n{\n    ASSERT(m_pVT != NULL);\n    m_CurPos = place;\n}\nFX_BOOL\tCPDF_VariableText_Iterator::NextWord()\n{\n    ASSERT(m_pVT != NULL);\n    if (m_CurPos == m_pVT->GetEndWordPlace()) {\n        return FALSE;\n    }\n    m_CurPos = m_pVT->GetNextWordPlace(m_CurPos);\n    return TRUE;\n}\nFX_BOOL\tCPDF_VariableText_Iterator::PrevWord()\n{\n    ASSERT(m_pVT != NULL);\n    if (m_CurPos == m_pVT->GetBeginWordPlace()) {\n        return FALSE;\n    }\n    m_CurPos = m_pVT->GetPrevWordPlace(m_CurPos);\n    return TRUE;\n}\nFX_BOOL\tCPDF_VariableText_Iterator::NextLine()\n{\n    ASSERT(m_pVT != NULL);\n    if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {\n        if (m_CurPos.nLineIndex < pSection->m_LineArray.GetSize() - 1) {\n            m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex, m_CurPos.nLineIndex + 1, -1);\n            return TRUE;\n        } else {\n            if (m_CurPos.nSecIndex < m_pVT->m_SectionArray.GetSize() - 1) {\n                m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex + 1, 0, -1);\n                return TRUE;\n            }\n        }\n    }\n    return FALSE;\n}\nFX_BOOL\tCPDF_VariableText_Iterator::PrevLine()\n{\n    ASSERT(m_pVT != NULL);\n    if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {\n        if (m_CurPos.nLineIndex > 0) {\n            m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex, m_CurPos.nLineIndex - 1, -1);\n            return TRUE;\n        } else {\n            if (m_CurPos.nSecIndex > 0) {\n                if (CSection * pLastSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex - 1)) {\n                    m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex - 1, pLastSection->m_LineArray.GetSize() - 1, -1);\n                    return TRUE;\n                }\n            }\n        }\n    }\n    return FALSE;\n}\nFX_BOOL\tCPDF_VariableText_Iterator::NextSection()\n{\n    ASSERT(m_pVT != NULL);\n    if (m_CurPos.nSecIndex < m_pVT->m_SectionArray.GetSize() - 1) {\n        m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex + 1, 0, -1);\n        return TRUE;\n    }\n    return FALSE;\n}\nFX_BOOL\tCPDF_VariableText_Iterator::PrevSection()\n{\n    ASSERT(m_pVT != NULL);\n    if (m_CurPos.nSecIndex > 0) {\n        m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex - 1, 0, -1);\n        return TRUE;\n    }\n    return FALSE;\n}\nFX_BOOL\tCPDF_VariableText_Iterator::GetWord(CPVT_Word & word) const\n{\n    ASSERT(m_pVT != NULL);\n    word.WordPlace = m_CurPos;\n    if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {\n        if (CLine * pLine = pSection->m_LineArray.GetAt(m_CurPos.nLineIndex)) {\n            if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(m_CurPos.nWordIndex)) {\n                word.Word = pWord->Word;\n                word.nCharset = pWord->nCharset;\n                word.fWidth = m_pVT->GetWordWidth(*pWord);\n                word.ptWord = m_pVT->InToOut(\n                                  CPDF_Point(pWord->fWordX + pSection->m_SecInfo.rcSection.left,\n                                             pWord->fWordY + pSection->m_SecInfo.rcSection.top) );\n                word.fAscent = m_pVT->GetWordAscent(*pWord);\n                word.fDescent = m_pVT->GetWordDescent(*pWord);\n                if (pWord->pWordProps) {\n                    word.WordProps = *pWord->pWordProps;\n                }\n                word.nFontIndex = m_pVT->GetWordFontIndex(*pWord);\n                word.fFontSize = m_pVT->GetWordFontSize(*pWord);\n                return TRUE;\n            }\n        }\n    }\n    return FALSE;\n}\nFX_BOOL\tCPDF_VariableText_Iterator::SetWord(const CPVT_Word & word)\n{\n    ASSERT(m_pVT != NULL);\n    if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {\n        if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(m_CurPos.nWordIndex)) {\n            if (pWord->pWordProps) {\n                *pWord->pWordProps = word.WordProps;\n            }\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nFX_BOOL\tCPDF_VariableText_Iterator::GetLine(CPVT_Line & line) const\n{\n    ASSERT(m_pVT != NULL);\n    line.lineplace = CPVT_WordPlace(m_CurPos.nSecIndex, m_CurPos.nLineIndex, -1);\n    if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {\n        if (CLine * pLine = pSection->m_LineArray.GetAt(m_CurPos.nLineIndex)) {\n            line.ptLine = m_pVT->InToOut(\n                              CPDF_Point(pLine->m_LineInfo.fLineX + pSection->m_SecInfo.rcSection.left,\n                                         pLine->m_LineInfo.fLineY + pSection->m_SecInfo.rcSection.top) );\n            line.fLineWidth = pLine->m_LineInfo.fLineWidth;\n            line.fLineAscent = pLine->m_LineInfo.fLineAscent;\n            line.fLineDescent = pLine->m_LineInfo.fLineDescent;\n            line.lineEnd = pLine->GetEndWordPlace();\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nFX_BOOL\tCPDF_VariableText_Iterator::GetSection(CPVT_Section & section) const\n{\n    ASSERT(m_pVT != NULL);\n    section.secplace = CPVT_WordPlace(m_CurPos.nSecIndex, 0, -1);\n    if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {\n        section.rcSection = m_pVT->InToOut(pSection->m_SecInfo.rcSection);\n        if (pSection->m_SecInfo.pSecProps) {\n            section.SecProps = *pSection->m_SecInfo.pSecProps;\n        }\n        if (pSection->m_SecInfo.pWordProps) {\n            section.WordProps = *pSection->m_SecInfo.pWordProps;\n        }\n        return TRUE;\n    }\n    return FALSE;\n}\nFX_BOOL\tCPDF_VariableText_Iterator::SetSection(const CPVT_Section & section)\n{\n    ASSERT(m_pVT != NULL);\n    if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {\n        if (pSection->m_SecInfo.pSecProps) {\n            *pSection->m_SecInfo.pSecProps = section.SecProps;\n        }\n        if (pSection->m_SecInfo.pWordProps) {\n            *pSection->m_SecInfo.pWordProps = section.WordProps;\n        }\n        return TRUE;\n    }\n    return FALSE;\n}\n"
  },
  {
    "path": "core/src/fpdfdoc/doc_vtmodule.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fpdfdoc/fpdf_doc.h\"\n#include \"../../include/fpdfdoc/fpdf_vt.h\"\n#include \"pdf_vt.h\"\nIPDF_VariableText* IPDF_VariableText::NewVariableText()\n{\n    return FX_NEW CPDF_VariableText();\n}\nvoid IPDF_VariableText::DelVariableText(IPDF_VariableText* pVT)\n{\n    delete (CPDF_VariableText*)pVT;\n}\n"
  },
  {
    "path": "core/src/fpdfdoc/pdf_vt.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#define _PDF_VT_H_\nclass CPVT_Size;\nclass CPVT_FloatRect;\nstruct CPVT_SectionInfo;\nstruct CPVT_LineInfo;\nstruct CPVT_WordInfo;\nclass CLine;\nclass CLines;\nclass CSection;\nclass CTypeset;\nclass CPDF_EditContainer;\nclass CPDF_VariableText;\nclass CPDF_VariableText_Iterator;\n#define IsFloatZero(f)\t\t\t\t\t\t((f) < 0.0001 && (f) > -0.0001)\n#define IsFloatBigger(fa,fb)\t\t\t\t((fa) > (fb) && !IsFloatZero((fa) - (fb)))\n#define IsFloatSmaller(fa,fb)\t\t\t\t((fa) < (fb) && !IsFloatZero((fa) - (fb)))\ntemplate<class T> T FPDF_MIN (const T & i, const T & j)\n{\n    return ((i < j) ? i : j);\n}\ntemplate<class T> T FPDF_MAX (const T & i, const T & j)\n{\n    return ((i > j) ? i : j);\n}\nclass CPVT_Size\n{\npublic:\n    CPVT_Size() : x(0.0f), y(0.0f)\n    {\n    }\n    CPVT_Size(FX_FLOAT x, FX_FLOAT y)\n    {\n        this->x = x;\n        this->y = y;\n    }\n    FX_FLOAT x, y;\n};\nclass CPVT_FloatRect : public CFX_FloatRect\n{\npublic:\n    CPVT_FloatRect()\n    {\n        left = top = right = bottom = 0.0f;\n    }\n    CPVT_FloatRect(FX_FLOAT left, FX_FLOAT top,\n                   FX_FLOAT right, FX_FLOAT bottom)\n    {\n        this->left = left;\n        this->top = top;\n        this->right = right;\n        this->bottom = bottom;\n    }\n    CPVT_FloatRect(const CPDF_Rect & rect)\n    {\n        this->left = rect.left;\n        this->top = rect.top;\n        this->right = rect.right;\n        this->bottom = rect.bottom;\n    }\n    void Default()\n    {\n        left = top = right = bottom = 0.0f;\n    }\n    FX_FLOAT Height() const\n    {\n        if(this->top > this->bottom) {\n            return this->top - this->bottom;\n        } else {\n            return this->bottom - this->top;\n        }\n    }\n};\nstruct CPVT_SectionInfo {\n    CPVT_SectionInfo() : rcSection(), nTotalLine(0), pSecProps(NULL), pWordProps(NULL)\n    {\n    }\n    virtual ~CPVT_SectionInfo()\n    {\n        if (pSecProps) {\n            delete pSecProps;\n        }\n        if (pWordProps) {\n            delete pWordProps;\n        }\n    }\n    CPVT_SectionInfo(const CPVT_SectionInfo & other): rcSection(), nTotalLine(0), pSecProps(NULL), pWordProps(NULL)\n    {\n        operator = (other);\n    }\n    void operator = (const CPVT_SectionInfo & other)\n    {\n        if (this == &other) {\n            return;\n        }\n        this->rcSection = other.rcSection;\n        this->nTotalLine = other.nTotalLine;\n        if (other.pSecProps) {\n            if (pSecProps) {\n                *pSecProps = *other.pSecProps;\n            } else {\n                pSecProps = FX_NEW CPVT_SecProps(*other.pSecProps);\n            }\n        }\n        if (other.pWordProps) {\n            if (pWordProps) {\n                *pWordProps = *other.pWordProps;\n            } else {\n                pWordProps = FX_NEW CPVT_WordProps(*other.pWordProps);\n            }\n        }\n    }\n    CPVT_FloatRect\t\t\t\trcSection;\n    FX_INT32\t\t\t\t\tnTotalLine;\n    CPVT_SecProps*\t\t\t\tpSecProps;\n    CPVT_WordProps*\t\t\t\tpWordProps;\n};\nstruct CPVT_LineInfo {\n    CPVT_LineInfo() : nTotalWord(0), nBeginWordIndex(-1), nEndWordIndex(-1),\n        fLineX(0.0f), fLineY(0.0f), fLineWidth(0.0f), fLineAscent(0.0f), fLineDescent(0.0f)\n    {\n    }\n    FX_INT32\t\t\t\t\tnTotalWord;\n    FX_INT32\t\t\t\t\tnBeginWordIndex;\n    FX_INT32\t\t\t\t\tnEndWordIndex;\n    FX_FLOAT\t\t\t\t\tfLineX;\n    FX_FLOAT\t\t\t\t\tfLineY;\n    FX_FLOAT\t\t\t\t\tfLineWidth;\n    FX_FLOAT\t\t\t\t\tfLineAscent;\n    FX_FLOAT\t\t\t\t\tfLineDescent;\n};\nstruct CPVT_WordInfo : public CFX_Object {\n    CPVT_WordInfo() : Word(0), nCharset(0),\n        fWordX(0.0f), fWordY(0.0f), fWordTail(0.0f), nFontIndex(-1), pWordProps(NULL)\n    {\n    }\n    CPVT_WordInfo(FX_WORD word, FX_INT32 charset, FX_INT32 fontIndex, CPVT_WordProps * pProps):\n        Word(word), nCharset(charset), fWordX(0.0f), fWordY(0.0f), fWordTail(0.0f),\n        nFontIndex(fontIndex), pWordProps(pProps)\n    {\n    }\n    virtual ~CPVT_WordInfo()\n    {\n        if (pWordProps) {\n            delete pWordProps;\n        }\n    }\n    CPVT_WordInfo(const CPVT_WordInfo & word): Word(0), nCharset(0),\n        fWordX(0.0f), fWordY(0.0f), fWordTail(0.0f), nFontIndex(-1), pWordProps(NULL)\n    {\n        operator = (word);\n    }\n    void operator = (const CPVT_WordInfo & word)\n    {\n        if (this == &word) {\n            return;\n        }\n        this->Word = word.Word;\n        this->nCharset = word.nCharset;\n        this->nFontIndex = word.nFontIndex;\n        if (word.pWordProps) {\n            if (pWordProps) {\n                *pWordProps = *word.pWordProps;\n            } else {\n                pWordProps = FX_NEW CPVT_WordProps(*word.pWordProps);\n            }\n        }\n    }\n    FX_WORD\t\t\t\t\t\tWord;\n    FX_INT32\t\t\t\t\tnCharset;\n    FX_FLOAT\t\t\t\t\tfWordX;\n    FX_FLOAT\t\t\t\t\tfWordY;\n    FX_FLOAT\t\t\t\t\tfWordTail;\n    FX_INT32\t\t\t\t\tnFontIndex;\n    CPVT_WordProps*\t\t\t\tpWordProps;\n};\nstruct CPVT_FloatRange {\n    CPVT_FloatRange() : fMin(0.0f), fMax(0.0f)\n    {\n    }\n    CPVT_FloatRange(FX_FLOAT min, FX_FLOAT max) : fMin(min), fMax(max)\n    {\n    }\n    FX_FLOAT Range() const\n    {\n        return fMax - fMin;\n    }\n    FX_FLOAT fMin, fMax;\n};\ntemplate<class TYPE> class CPVT_ArrayTemplate : public CFX_ArrayTemplate<TYPE>\n{\npublic:\n    FX_BOOL IsEmpty()\n    {\n        return CFX_ArrayTemplate<TYPE>::GetSize() <= 0;\n    }\n    TYPE GetAt(int nIndex) const\n    {\n        if (nIndex >= 0 && nIndex < CFX_ArrayTemplate<TYPE>::GetSize()) {\n            return CFX_ArrayTemplate<TYPE>::GetAt(nIndex);\n        }\n        return NULL;\n    }\n    void RemoveAt(int nIndex)\n    {\n        if (nIndex >= 0 && nIndex < CFX_ArrayTemplate<TYPE>::GetSize()) {\n            CFX_ArrayTemplate<TYPE>::RemoveAt(nIndex);\n        }\n    }\n};\nclass CLine : public CFX_Object\n{\npublic:\n    CLine();\n    virtual ~CLine();\n    CPVT_WordPlace\t\t\t\t\t\t\tGetBeginWordPlace() const;\n    CPVT_WordPlace\t\t\t\t\t\t\tGetEndWordPlace() const;\n    CPVT_WordPlace\t\t\t\t\t\t\tGetPrevWordPlace(const CPVT_WordPlace & place) const;\n    CPVT_WordPlace\t\t\t\t\t\t\tGetNextWordPlace(const CPVT_WordPlace & place) const;\n    CPVT_WordPlace\t\t\t\t\t\t\tLinePlace;\n    CPVT_LineInfo\t\t\t\t\t\t\tm_LineInfo;\n};\nclass CLines\n{\npublic:\n    CLines() : m_nTotal(0) {}\n    virtual ~CLines()\n    {\n        RemoveAll();\n    }\n    FX_INT32\t\t\t\t\t\t\t\tGetSize() const\n    {\n        return m_Lines.GetSize();\n    }\n    CLine *\t\t\t\t\t\t\t\t\tGetAt(FX_INT32 nIndex) const\n    {\n        return m_Lines.GetAt(nIndex);\n    }\n    void\t\t\t\t\t\t\t\t\tEmpty()\n    {\n        m_nTotal = 0;\n    }\n    void\t\t\t\t\t\t\t\t\tRemoveAll()\n    {\n        for (FX_INT32 i = 0, sz = GetSize(); i < sz; i++) {\n            delete GetAt(i);\n        }\n        m_Lines.RemoveAll();\n        m_nTotal = 0;\n    }\n    FX_INT32\t\t\t\t\t\t\t\tAdd(const CPVT_LineInfo & lineinfo)\n    {\n        if (m_nTotal >= GetSize()) {\n            if (CLine * pLine = FX_NEW CLine) {\n                pLine->m_LineInfo = lineinfo;\n                m_Lines.Add(pLine);\n                return m_nTotal++;\n            }\n            return m_nTotal;\n        } else {\n            if (CLine * pLine = GetAt(m_nTotal)) {\n                pLine->m_LineInfo = lineinfo;\n            }\n            return m_nTotal++;\n        }\n    }\n    void\t\t\t\t\t\t\t\t\tClear()\n    {\n        for (FX_INT32 i = GetSize() - 1; i >= m_nTotal; i--) {\n            delete GetAt(i);\n            m_Lines.RemoveAt(i);\n        }\n    }\nprivate:\n    CPVT_ArrayTemplate<CLine*>\t\t\t\tm_Lines;\n    FX_INT32\t\t\t\t\t\t\t\tm_nTotal;\n};\nclass CSection : public CFX_Object\n{\n    friend class CTypeset;\npublic:\n    CSection(CPDF_VariableText * pVT);\n    virtual ~CSection();\n    void\t\t\t\t\t\t\t\t\tResetAll();\n    void\t\t\t\t\t\t\t\t\tResetLineArray();\n    void\t\t\t\t\t\t\t\t\tResetWordArray();\n    void\t\t\t\t\t\t\t\t\tResetLinePlace();\n    CPVT_WordPlace\t\t\t\t\t\t\tAddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo);\n    CPVT_WordPlace\t\t\t\t\t\t\tAddLine(const CPVT_LineInfo & lineinfo);\n    void\t\t\t\t\t\t\t\t\tClearWords(const CPVT_WordRange & PlaceRange);\n    void\t\t\t\t\t\t\t\t\tClearWord(const CPVT_WordPlace & place);\n    CPVT_FloatRect\t\t\t\t\t\t\tRearrange();\n    CPVT_Size\t\t\t\t\t\t\t\tGetSectionSize(FX_FLOAT fFontSize);\n    CPVT_WordPlace\t\t\t\t\t\t\tGetBeginWordPlace() const;\n    CPVT_WordPlace\t\t\t\t\t\t\tGetEndWordPlace() const;\n    CPVT_WordPlace\t\t\t\t\t\t\tGetPrevWordPlace(const CPVT_WordPlace & place) const;\n    CPVT_WordPlace\t\t\t\t\t\t\tGetNextWordPlace(const CPVT_WordPlace & place) const;\n    void\t\t\t\t\t\t\t\t\tUpdateWordPlace(CPVT_WordPlace & place) const;\n    CPVT_WordPlace\t\t\t\t\t\t\tSearchWordPlace(const CPDF_Point & point) const;\n    CPVT_WordPlace\t\t\t\t\t\t\tSearchWordPlace(FX_FLOAT fx, const CPVT_WordPlace & lineplace) const;\n    CPVT_WordPlace\t\t\t\t\t\t\tSearchWordPlace(FX_FLOAT fx, const CPVT_WordRange & range) const;\npublic:\n    CPVT_WordPlace\t\t\t\t\t\t\tSecPlace;\n    CPVT_SectionInfo\t\t\t\t\t\tm_SecInfo;\n    CLines\t\t\t\t\t\t\t\t\tm_LineArray;\n    CPVT_ArrayTemplate<CPVT_WordInfo*>\t\tm_WordArray;\nprivate:\n    void\t\t\t\t\t\t\t\t\tClearLeftWords(FX_INT32 nWordIndex);\n    void\t\t\t\t\t\t\t\t\tClearRightWords(FX_INT32 nWordIndex);\n    void\t\t\t\t\t\t\t\t\tClearMidWords(FX_INT32 nBeginIndex, FX_INT32 nEndIndex);\n\n    CPDF_VariableText\t\t\t\t\t\t*m_pVT;\n};\nclass CTypeset\n{\npublic:\n    CTypeset(CSection * pSection);\n    virtual ~CTypeset();\n    CPVT_Size\t\t\t\t\t\t\t\tGetEditSize(FX_FLOAT fFontSize);\n    CPVT_FloatRect\t\t\t\t\t\t\tTypeset();\n    CPVT_FloatRect\t\t\t\t\t\t\tCharArray();\nprivate:\n    void\t\t\t\t\t\t\t\t\tSplitLines(FX_BOOL bTypeset, FX_FLOAT fFontSize);\n    void\t\t\t\t\t\t\t\t\tOutputLines();\n\n    CPVT_FloatRect\t\t\t\t\t\t\tm_rcRet;\n    CPDF_VariableText\t\t\t\t\t\t* m_pVT;\n    CSection\t\t\t\t\t\t\t\t* m_pSection;\n};\nclass CPDF_EditContainer\n{\npublic:\n    CPDF_EditContainer(): m_rcPlate(0, 0, 0, 0), m_rcContent(0, 0, 0, 0) {};\n    virtual ~CPDF_EditContainer() {};\n    virtual void\t\t\t\t\t\t\tSetPlateRect(const CPDF_Rect & rect)\n    {\n        m_rcPlate = rect;\n    };\n    virtual const CPDF_Rect &\t\t\t\tGetPlateRect() const\n    {\n        return m_rcPlate;\n    };\n    virtual void\t\t\t\t\t\t\tSetContentRect(const CPVT_FloatRect & rect)\n    {\n        m_rcContent = rect;\n    };\n    virtual CPDF_Rect \t\t\t\t\t\tGetContentRect() const\n    {\n        return m_rcContent;\n    };\n    FX_FLOAT\t\t\t\t\t\t\t\tGetPlateWidth() const\n    {\n        return m_rcPlate.right - m_rcPlate.left;\n    };\n    FX_FLOAT\t\t\t\t\t\t\t\tGetPlateHeight() const\n    {\n        return m_rcPlate.top - m_rcPlate.bottom;\n    };\n    CPVT_Size\t\t\t\t\t\t\t\tGetPlateSize() const\n    {\n        return CPVT_Size(GetPlateWidth(), GetPlateHeight());\n    };\n    CPDF_Point\t\t\t\t\t\t\t\tGetBTPoint() const\n    {\n        return CPDF_Point(m_rcPlate.left, m_rcPlate.top);\n    };\n    CPDF_Point\t\t\t\t\t\t\t\tGetETPoint() const\n    {\n        return CPDF_Point(m_rcPlate.right, m_rcPlate.bottom);\n    };\n    inline CPDF_Point\t\t\t\t\t\tInToOut(const CPDF_Point & point) const\n    {\n        return CPDF_Point(point.x + GetBTPoint().x, GetBTPoint().y - point.y);\n    };\n    inline CPDF_Point\t\t\t\t\t\tOutToIn(const CPDF_Point & point) const\n    {\n        return CPDF_Point(point.x - GetBTPoint().x, GetBTPoint().y - point.y);\n    };\n    inline CPDF_Rect\t\t\t\t\t\tInToOut(const CPVT_FloatRect & rect) const\n    {\n        CPDF_Point ptLeftTop = InToOut(CPDF_Point(rect.left, rect.top));\n        CPDF_Point ptRightBottom = InToOut(CPDF_Point(rect.right, rect.bottom));\n        return CPDF_Rect(ptLeftTop.x, ptRightBottom.y, ptRightBottom.x, ptLeftTop.y);\n    };\n    inline CPVT_FloatRect\t\t\t\t\tOutToIn(const CPDF_Rect & rect) const\n    {\n        CPDF_Point ptLeftTop = OutToIn(CPDF_Point(rect.left, rect.top));\n        CPDF_Point ptRightBottom = OutToIn(CPDF_Point(rect.right, rect.bottom));\n        return CPVT_FloatRect(ptLeftTop.x, ptLeftTop.y, ptRightBottom.x, ptRightBottom.y);\n    };\n\nprivate:\n    CPDF_Rect\t\t\t\t\t\t\t\tm_rcPlate;\n    CPVT_FloatRect\t\t\t\t\t\t\tm_rcContent;\n};\nclass CPDF_VariableText : public IPDF_VariableText, public CFX_Object, private CPDF_EditContainer\n{\n    friend class CTypeset;\n    friend class CSection;\n    friend class CPDF_VariableText_Iterator;\npublic:\n    CPDF_VariableText();\n    virtual ~CPDF_VariableText();\n    IPDF_VariableText_Provider*\t\t\t\tSetProvider(IPDF_VariableText_Provider * pProvider);\n    IPDF_VariableText_Iterator*\t\t\t\tGetIterator();\n    void\t\t\t\t\t\t\t\t\tSetPlateRect(const CPDF_Rect & rect)\n    {\n        CPDF_EditContainer::SetPlateRect(rect);\n    }\n    void\t\t\t\t\t\t\t\t\tSetAlignment(FX_INT32 nFormat = 0)\n    {\n        m_nAlignment = nFormat;\n    }\n    void\t\t\t\t\t\t\t\t\tSetPasswordChar(FX_WORD wSubWord = '*')\n    {\n        m_wSubWord = wSubWord;\n    }\n    void\t\t\t\t\t\t\t\t\tSetLimitChar(FX_INT32 nLimitChar = 0)\n    {\n        m_nLimitChar = nLimitChar;\n    }\n    void\t\t\t\t\t\t\t\t\tSetCharSpace(FX_FLOAT fCharSpace = 0.0f)\n    {\n        m_fCharSpace = fCharSpace;\n    }\n    void\t\t\t\t\t\t\t\t\tSetHorzScale(FX_INT32 nHorzScale = 100)\n    {\n        m_nHorzScale = nHorzScale;\n    }\n    void\t\t\t\t\t\t\t\t\tSetMultiLine(FX_BOOL bMultiLine = TRUE)\n    {\n        m_bMultiLine = bMultiLine;\n    }\n    void\t\t\t\t\t\t\t\t\tSetAutoReturn(FX_BOOL bAuto = TRUE)\n    {\n        m_bLimitWidth = bAuto;\n    }\n    void\t\t\t\t\t\t\t\t\tSetFontSize(FX_FLOAT fFontSize)\n    {\n        m_fFontSize = fFontSize;\n    }\n    void\t\t\t\t\t\t\t\t\tSetCharArray(FX_INT32 nCharArray = 0)\n    {\n        m_nCharArray = nCharArray;\n    }\n    void\t\t\t\t\t\t\t\t\tSetAutoFontSize(FX_BOOL bAuto = TRUE)\n    {\n        m_bAutoFontSize = bAuto;\n    }\n    void\t\t\t\t\t\t\t\t\tSetRichText(FX_BOOL bRichText)\n    {\n        m_bRichText = bRichText;\n    }\n    void\t\t\t\t\t\t\t\t\tSetLineLeading(FX_FLOAT fLineLeading)\n    {\n        m_fLineLeading = fLineLeading;\n    }\n    void\t\t\t\t\t\t\t\t\tInitialize();\n    FX_BOOL\t\t\t\t\t\t\t\t\tIsValid() const\n    {\n        return m_bInitial;\n    }\n    FX_BOOL\t\t\t\t\t\t\t\t\tIsRichText() const\n    {\n        return m_bRichText;\n    }\n    void\t\t\t\t\t\t\t\t\tRearrangeAll();\n    void\t\t\t\t\t\t\t\t\tRearrangePart(const CPVT_WordRange & PlaceRange);\n    void\t\t\t\t\t\t\t\t\tResetAll();\n    void\t\t\t\t\t\t\t\t\tSetText(FX_LPCWSTR text, FX_INT32 charset = 1, const CPVT_SecProps * pSecProps = NULL,\n            const CPVT_WordProps * pWordProps = NULL);\n    CPVT_WordPlace\t\t\t\t\t\t\tInsertWord(const CPVT_WordPlace & place, FX_WORD word, FX_INT32 charset = 1,\n            const CPVT_WordProps * pWordProps = NULL);\n    CPVT_WordPlace\t\t\t\t\t\t\tInsertSection(const CPVT_WordPlace & place, const CPVT_SecProps * pSecProps = NULL,\n            const CPVT_WordProps * pWordProps = NULL);\n    CPVT_WordPlace\t\t\t\t\t\t\tInsertText(const CPVT_WordPlace & place, FX_LPCWSTR text, FX_INT32 charset = 1,\n            const CPVT_SecProps * pSecProps = NULL,\tconst CPVT_WordProps * pWordProps = NULL);\n    CPVT_WordPlace\t\t\t\t\t\t\tDeleteWords(const CPVT_WordRange & PlaceRange);\n    CPVT_WordPlace\t\t\t\t\t\t\tDeleteWord(const CPVT_WordPlace & place);\n    CPVT_WordPlace\t\t\t\t\t\t\tBackSpaceWord(const CPVT_WordPlace & place);\n    const CPDF_Rect &\t\t\t\t\t\tGetPlateRect() const\n    {\n        return CPDF_EditContainer::GetPlateRect();\n    }\n    CPDF_Rect\t\t\t\t\t\t\t\tGetContentRect() const;\n    FX_INT32\t\t\t\t\t\t\t\tGetTotalWords() const;\n    FX_FLOAT\t\t\t\t\t\t\t\tGetFontSize() const\n    {\n        return m_fFontSize;\n    }\n    FX_INT32\t\t\t\t\t\t\t\tGetAlignment() const\n    {\n        return m_nAlignment;\n    }\n    FX_INT32\t\t\t\t\t\t\t\tGetCharArray() const\n    {\n        return m_nCharArray;\n    }\n    FX_INT32\t\t\t\t\t\t\t\tGetLimitChar() const\n    {\n        return m_nLimitChar;\n    }\n    FX_BOOL\t\t\t\t\t\t\t\t\tIsMultiLine() const\n    {\n        return m_bMultiLine;\n    }\n    FX_INT32\t\t\t\t\t\t\t\tGetHorzScale() const\n    {\n        return m_nHorzScale;\n    }\n    FX_FLOAT\t\t\t\t\t\t\t\tGetCharSpace() const\n    {\n        return m_fCharSpace;\n    }\n\n    inline CPVT_WordPlace\t\t\t\t\tGetBeginWordPlace() const;\n    inline CPVT_WordPlace\t\t\t\t\tGetEndWordPlace() const;\n    CPVT_WordPlace\t\t\t\t\t\t\tGetPrevWordPlace(const CPVT_WordPlace & place) const;\n    CPVT_WordPlace\t\t\t\t\t\t\tGetNextWordPlace(const CPVT_WordPlace & place) const;\n    CPVT_WordPlace\t\t\t\t\t\t\tSearchWordPlace(const CPDF_Point & point) const;\n    CPVT_WordPlace\t\t\t\t\t\t\tGetUpWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const;\n    CPVT_WordPlace\t\t\t\t\t\t\tGetDownWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const;\n    CPVT_WordPlace\t\t\t\t\t\t\tGetLineBeginPlace(const CPVT_WordPlace & place) const;\n    CPVT_WordPlace\t\t\t\t\t\t\tGetLineEndPlace(const CPVT_WordPlace & place) const;\n    CPVT_WordPlace\t\t\t\t\t\t\tGetSectionBeginPlace(const CPVT_WordPlace & place) const;\n    CPVT_WordPlace\t\t\t\t\t\t\tGetSectionEndPlace(const CPVT_WordPlace & place) const;\n    void\t\t\t\t\t\t\t\t\tUpdateWordPlace(CPVT_WordPlace & place) const;\n    FX_INT32\t\t\t\t\t\t\t\tWordPlaceToWordIndex(const CPVT_WordPlace & place) const;\n    CPVT_WordPlace\t\t\t\t\t\t\tWordIndexToWordPlace(FX_INT32 index) const;\n    FX_WORD\t\t\t\t\t\t\t\t\tGetPasswordChar() const\n    {\n        return GetSubWord();\n    }\n    FX_WORD\t\t\t\t\t\t\t\t\tGetSubWord() const\n    {\n        return m_wSubWord;\n    }\nprivate:\n    FX_INT32\t\t\t\t\t\t\t\tGetCharWidth(FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord, FX_INT32 nWordStyle);\n    FX_INT32\t\t\t\t\t\t\t\tGetTypeAscent(FX_INT32 nFontIndex);\n    FX_INT32\t\t\t\t\t\t\t\tGetTypeDescent(FX_INT32 nFontIndex);\n    FX_INT32\t\t\t\t\t\t\t\tGetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex);\n    FX_INT32\t\t\t\t\t\t\t\tGetDefaultFontIndex();\n    FX_BOOL\t\t\t\t\t\t\t\t\tIsLatinWord(FX_WORD word);\nprivate:\n\n    CPVT_WordPlace\t\t\t\t\t\t\tAddSection(const CPVT_WordPlace & place, const CPVT_SectionInfo & secinfo);\n    CPVT_WordPlace\t\t\t\t\t\t\tAddLine(const CPVT_WordPlace & place, const CPVT_LineInfo & lineinfo);\n    CPVT_WordPlace\t\t\t\t\t\t\tAddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo);\n    FX_BOOL\t\t\t\t\t\t\t\t\tGetWordInfo(const CPVT_WordPlace & place, CPVT_WordInfo & wordinfo);\n    FX_BOOL\t\t\t\t\t\t\t\t\tSetWordInfo(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo);\n    FX_BOOL\t\t\t\t\t\t\t\t\tGetLineInfo(const CPVT_WordPlace & place, CPVT_LineInfo & lineinfo);\n    FX_BOOL\t\t\t\t\t\t\t\t\tGetSectionInfo(const CPVT_WordPlace & place, CPVT_SectionInfo & secinfo);\n    FX_FLOAT\t\t\t\t\t\t\t\tGetWordFontSize(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize = FALSE);\n    FX_FLOAT\t\t\t\t\t\t\t\tGetWordWidth(FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord,\n            FX_FLOAT fCharSpace, FX_INT32 nHorzScale,\n            FX_FLOAT fFontSize, FX_FLOAT fWordTail, FX_INT32 nWordStyle);\n    FX_FLOAT\t\t\t\t\t\t\t\tGetWordWidth(const CPVT_WordInfo & WordInfo);\n    FX_FLOAT\t\t\t\t\t\t\t\tGetWordAscent(const CPVT_WordInfo & WordInfo, FX_FLOAT fFontSize);\n    FX_FLOAT\t\t\t\t\t\t\t\tGetWordDescent(const CPVT_WordInfo & WordInfo, FX_FLOAT fFontSize);\n    FX_FLOAT\t\t\t\t\t\t\t\tGetWordAscent(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize = FALSE);\n    FX_FLOAT\t\t\t\t\t\t\t\tGetWordDescent(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize = FALSE);\n    FX_FLOAT\t\t\t\t\t\t\t\tGetLineAscent(const CPVT_SectionInfo & SecInfo);\n    FX_FLOAT\t\t\t\t\t\t\t\tGetLineDescent(const CPVT_SectionInfo & SecInfo);\n    FX_FLOAT\t\t\t\t\t\t\t\tGetFontAscent(FX_INT32 nFontIndex, FX_FLOAT fFontSize);\n    FX_FLOAT\t\t\t\t\t\t\t\tGetFontDescent(FX_INT32 nFontIndex, FX_FLOAT fFontSize);\n    FX_INT32\t\t\t\t\t\t\t\tGetWordFontIndex(const CPVT_WordInfo & WordInfo);\n    FX_FLOAT\t\t\t\t\t\t\t\tGetCharSpace(const CPVT_WordInfo & WordInfo);\n    FX_INT32\t\t\t\t\t\t\t\tGetHorzScale(const CPVT_WordInfo & WordInfo);\n    FX_FLOAT\t\t\t\t\t\t\t\tGetLineLeading(const CPVT_SectionInfo & SecInfo);\n    FX_FLOAT\t\t\t\t\t\t\t\tGetLineIndent(const CPVT_SectionInfo & SecInfo);\n    FX_INT32\t\t\t\t\t\t\t\tGetAlignment(const CPVT_SectionInfo& SecInfo);\n\n    void\t\t\t\t\t\t\t\t\tClearSectionRightWords(const CPVT_WordPlace & place);\n    CPVT_WordPlace\t\t\t\t\t\t\tAjustLineHeader(const CPVT_WordPlace & place, FX_BOOL bPrevOrNext) const;\n    FX_BOOL\t\t\t\t\t\t\t\t\tClearEmptySection(const CPVT_WordPlace & place);\n    void\t\t\t\t\t\t\t\t\tClearEmptySections(const CPVT_WordRange & PlaceRange);\n    void\t\t\t\t\t\t\t\t\tLinkLatterSection(const CPVT_WordPlace & place);\n    void\t\t\t\t\t\t\t\t\tClearWords(const CPVT_WordRange & PlaceRange);\n    CPVT_WordPlace\t\t\t\t\t\t\tClearLeftWord(const CPVT_WordPlace & place);\n    CPVT_WordPlace\t\t\t\t\t\t\tClearRightWord(const CPVT_WordPlace & place);\nprivate:\n    CPVT_FloatRect\t\t\t\t\t\t\tRearrange(const CPVT_WordRange & PlaceRange);\n    FX_FLOAT\t\t\t\t\t\t\t\tGetAutoFontSize();\n    FX_BOOL\t\t\t\t\t\t\t\t\tIsBigger(FX_FLOAT fFontSize);\n    CPVT_FloatRect\t\t\t\t\t\t\tRearrangeSections(const CPVT_WordRange & PlaceRange);\nprivate:\n    void\t\t\t\t\t\t\t\t\tResetSectionArray();\nprivate:\n    CPVT_ArrayTemplate<CSection*>\t\t\tm_SectionArray;\n    FX_INT32\t\t\t\t\t\t\t\tm_nLimitChar;\n    FX_INT32\t\t\t\t\t\t\t\tm_nCharArray;\n    FX_BOOL\t\t\t\t\t\t\t\t\tm_bMultiLine;\n    FX_BOOL\t\t\t\t\t\t\t\t\tm_bLimitWidth;\n    FX_BOOL\t\t\t\t\t\t\t\t\tm_bAutoFontSize;\n    FX_INT32\t\t\t\t\t\t\t\tm_nAlignment;\n    FX_FLOAT\t\t\t\t\t\t\t\tm_fLineLeading;\n    FX_FLOAT\t\t\t\t\t\t\t\tm_fCharSpace;\n    FX_INT32\t\t\t\t\t\t\t\tm_nHorzScale;\n    FX_WORD\t\t\t\t\t\t\t\t\tm_wSubWord;\n    FX_FLOAT\t\t\t\t\t\t\t\tm_fWordSpace;\n    FX_FLOAT\t\t\t\t\t\t\t\tm_fFontSize;\n\nprivate:\n    FX_BOOL\t\t\t\t\t\t\t\t\tm_bInitial;\n    FX_BOOL\t\t\t\t\t\t\t\t\tm_bRichText;\n    FX_FLOAT\t\t\t\t\t\t\t\tm_fCaretOriginX;\n    FX_INT32\t\t\t\t\t\t\t\tm_nCurFontIndex;\n    IPDF_VariableText_Provider *\t\t\tm_pVTProvider;\n    CPDF_VariableText_Iterator *\t\t\tm_pVTIterator;\n};\nclass CPDF_VariableText_Iterator : public IPDF_VariableText_Iterator, public CFX_Object\n{\npublic:\n    CPDF_VariableText_Iterator(CPDF_VariableText * pVT);\n    virtual ~CPDF_VariableText_Iterator();\n    FX_BOOL\t\t\t\t\t\t\t\t\tNextWord();\n    FX_BOOL\t\t\t\t\t\t\t\t\tPrevWord();\n    FX_BOOL\t\t\t\t\t\t\t\t\tNextLine();\n    FX_BOOL\t\t\t\t\t\t\t\t\tPrevLine();\n    FX_BOOL\t\t\t\t\t\t\t\t\tNextSection();\n    FX_BOOL\t\t\t\t\t\t\t\t\tPrevSection();\n    FX_BOOL\t\t\t\t\t\t\t\t\tSetWord(const CPVT_Word & word);\n    FX_BOOL\t\t\t\t\t\t\t\t\tGetWord(CPVT_Word & word) const;\n    FX_BOOL\t\t\t\t\t\t\t\t\tGetLine(CPVT_Line & line) const;\n    FX_BOOL\t\t\t\t\t\t\t\t\tGetSection(CPVT_Section & section) const;\n    FX_BOOL\t\t\t\t\t\t\t\t\tSetSection(const CPVT_Section & section);\n    void\t\t\t\t\t\t\t\t\tSetAt(FX_INT32 nWordIndex);\n    void\t\t\t\t\t\t\t\t\tSetAt(const CPVT_WordPlace & place);\n    const CPVT_WordPlace &\t\t\t\t\tGetAt() const\n    {\n        return m_CurPos;\n    };\nprivate:\n    CPVT_WordPlace\t\t\t\t\t\t\tm_CurPos;\n    CPDF_VariableText *\t\t\t\t\t\tm_pVT;\n};\n"
  },
  {
    "path": "core/src/fpdfdoc/tagged_int.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDF_TAGGED_INT_H_\n#define _FPDF_TAGGED_INT_H_\nclass CPDF_StructTreeImpl;\nclass CPDF_StructElementImpl;\nclass CPDF_StructTreeImpl : public CPDF_StructTree\n{\npublic:\n    CPDF_StructTreeImpl(const CPDF_Document* pDoc);\n    ~CPDF_StructTreeImpl();\n    int\t\t\tCountTopElements() const\n    {\n        return m_Kids.GetSize();\n    }\n    CPDF_StructElement*\tGetTopElement(int i) const\n    {\n        return (CPDF_StructElement*)m_Kids.GetAt(i);\n    }\n    void\t\tLoadDocTree();\n    void\t\tLoadPageTree(const CPDF_Dictionary* pPageDict);\n    CPDF_StructElementImpl* AddPageNode(CPDF_Dictionary* pElement, CFX_MapPtrToPtr& map, int nLevel = 0);\n    FX_BOOL\t\tAddTopLevelNode(CPDF_Dictionary* pDict, CPDF_StructElementImpl* pElement);\nprotected:\n    const CPDF_Dictionary*\tm_pTreeRoot;\n    const CPDF_Dictionary*\tm_pRoleMap;\n    const CPDF_Dictionary*\tm_pPage;\n    CFX_ArrayTemplate<CPDF_StructElementImpl*>\tm_Kids;\n    friend class CPDF_StructElementImpl;\n};\nclass CPDF_StructElementImpl FX_FINAL : public CPDF_StructElement\n{\npublic:\n    CPDF_StructElementImpl(CPDF_StructTreeImpl* pTree, CPDF_StructElementImpl* pParent, CPDF_Dictionary* pDict);\n    ~CPDF_StructElementImpl();\n    CPDF_StructTree*\t\tGetTree() const\n    {\n        return m_pTree;\n    }\n    const CFX_ByteString&\tGetType() const\n    {\n        return m_Type;\n    }\n    CPDF_StructElement*\t\tGetParent() const\n    {\n        return m_pParent;\n    }\n    CPDF_Dictionary *\t\tGetDict() const\n    {\n        return m_pDict;\n    }\n    int\t\t\t\t\t\tCountKids() const\n    {\n        return m_Kids.GetSize();\n    }\n    const CPDF_StructKid&\tGetKid(int index) const\n    {\n        return m_Kids.GetData()[index];\n    }\n    CFX_PtrArray*\t\t\tGetObjectArray()\n    {\n        return &m_ObjectArray;\n    }\n\n    CPDF_Object*\t\t\tGetAttr(FX_BSTR owner, FX_BSTR name, FX_BOOL bInheritable = FALSE, FX_FLOAT fLevel = 0.0F);\n\n    CFX_ByteString\t\t\tGetName(FX_BSTR owner, FX_BSTR name, FX_BSTR default_value, FX_BOOL bInheritable = FALSE, int subindex = -1);\n    FX_ARGB\t\t\t\t\tGetColor(FX_BSTR owner, FX_BSTR name, FX_ARGB default_value, FX_BOOL bInheritable = FALSE, int subindex = -1);\n    FX_FLOAT\t\t\t\tGetNumber(FX_BSTR owner, FX_BSTR name, FX_FLOAT default_value, FX_BOOL bInheritable = FALSE, int subindex = -1);\n    int\t\t\t\t\t\tGetInteger(FX_BSTR owner, FX_BSTR name, int default_value, FX_BOOL bInheritable = FALSE, int subindex = -1);\n    CFX_PtrArray\t\t\tm_ObjectArray;\n    void\t\t\t\t\tLoadKids(CPDF_Dictionary* pDict);\n    void\t\t\t\t\tLoadKid(FX_DWORD PageObjNum, CPDF_Object* pObj, CPDF_StructKid* pKid);\n    CPDF_Object*\t\t\tGetAttr(FX_BSTR owner, FX_BSTR name, FX_BOOL bInheritable, int subindex);\n    CPDF_StructElementImpl*\tRetain();\n    void\t\t\t\t\tRelease();\nprotected:\n    CPDF_StructTreeImpl*\tm_pTree;\n    CFX_ByteString\t\t\tm_Type;\n    CPDF_StructElementImpl*\tm_pParent;\n    CPDF_Dictionary*\t\tm_pDict;\n    CFX_ArrayTemplate<CPDF_StructKid>\tm_Kids;\n\n    int\t\t\tm_RefCount;\n    friend class CPDF_StructTreeImpl;\n};\n#endif\n"
  },
  {
    "path": "core/src/fpdftext/fpdf_text.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fpdfapi/fpdf_page.h\"\n#include \"../../include/fpdfapi/fpdf_pageobj.h\"\n#include \"../../include/fpdftext/fpdf_text.h\"\n#include \"txtproc.h\"\n#include \"text_int.h\"\n#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)\nextern FX_LPCSTR FCS_GetAltStr(FX_WCHAR);\nCFX_ByteString CharFromUnicodeAlt(FX_WCHAR unicode, int destcp, FX_LPCSTR defchar)\n{\n    if (destcp == 0) {\n        if (unicode < 0x80) {\n            return CFX_ByteString((char)unicode);\n        }\n        FX_LPCSTR altstr = FCS_GetAltStr(unicode);\n        if (altstr) {\n            return CFX_ByteString(altstr, -1);\n        }\n        return CFX_ByteString(defchar, -1);\n    }\n    FX_BOOL bDef = FALSE;\n    char buf[10];\n    int ret = FXSYS_WideCharToMultiByte(destcp, 0, (wchar_t*)&unicode, 1, buf, 10, NULL, &bDef);\n    if (ret && !bDef) {\n        return CFX_ByteString(buf, ret);\n    }\n    FX_LPCSTR altstr = FCS_GetAltStr(unicode);\n    if (altstr) {\n        return CFX_ByteString(altstr, -1);\n    }\n    return CFX_ByteString(defchar, -1);\n}\nCTextPage::CTextPage()\n{\n}\nCTextPage::~CTextPage()\n{\n    int i;\n    for (i = 0; i < m_BaseLines.GetSize(); i ++) {\n        CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);\n        delete pBaseLine;\n    }\n    for (i = 0; i < m_TextColumns.GetSize(); i ++) {\n        CTextColumn* pTextColumn = (CTextColumn*)m_TextColumns.GetAt(i);\n        delete pTextColumn;\n    }\n}\nvoid CTextPage::ProcessObject(CPDF_PageObject* pObject)\n{\n    if (pObject->m_Type != PDFPAGE_TEXT) {\n        return;\n    }\n    CPDF_TextObject* pText = (CPDF_TextObject*)pObject;\n    CPDF_Font* pFont = pText->m_TextState.GetFont();\n    int count = pText->CountItems();\n    FX_FLOAT* pPosArray = FX_Alloc(FX_FLOAT, count * 2);\n    if (pPosArray) {\n        pText->CalcCharPos(pPosArray);\n    }\n    FX_FLOAT fontsize_h = pText->m_TextState.GetFontSizeH();\n    FX_FLOAT fontsize_v = pText->m_TextState.GetFontSizeV();\n    FX_DWORD space_charcode = pFont->CharCodeFromUnicode(' ');\n    FX_FLOAT spacew = 0;\n    if (space_charcode != -1) {\n        spacew = fontsize_h * pFont->GetCharWidthF(space_charcode) / 1000;\n    }\n    if (spacew == 0) {\n        spacew = fontsize_h / 4;\n    }\n    if (pText->m_TextState.GetBaselineAngle() != 0) {\n        int cc = 0;\n        CFX_AffineMatrix matrix;\n        pText->GetTextMatrix(&matrix);\n        for (int i = 0; i < pText->m_nChars; i ++) {\n            FX_DWORD charcode = pText->m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)pText->m_pCharCodes : pText->m_pCharCodes[i];\n            if (charcode == (FX_DWORD) - 1) {\n                continue;\n            }\n            FX_RECT char_box;\n            pFont->GetCharBBox(charcode, char_box);\n            FX_FLOAT char_left = pPosArray ? pPosArray[cc * 2] : char_box.left * pText->m_TextState.GetFontSize() / 1000;\n            FX_FLOAT char_right = pPosArray ? pPosArray[cc * 2 + 1] : char_box.right * pText->m_TextState.GetFontSize() / 1000;\n            FX_FLOAT char_top = char_box.top * pText->m_TextState.GetFontSize() / 1000;\n            FX_FLOAT char_bottom = char_box.bottom * pText->m_TextState.GetFontSize() / 1000;\n            cc ++;\n            FX_FLOAT char_origx, char_origy;\n            matrix.Transform(char_left, 0, char_origx, char_origy);\n            matrix.TransformRect(char_left, char_right, char_top, char_bottom);\n            CFX_ByteString str;\n            pFont->AppendChar(str, charcode);\n            InsertTextBox(NULL, char_origy, char_left, char_right, char_top,\n                          char_bottom, spacew, fontsize_v, str, pFont);\n        }\n        if (pPosArray) {\n            FX_Free(pPosArray);\n        }\n        return;\n    }\n    FX_FLOAT ratio_h = fontsize_h / pText->m_TextState.GetFontSize();\n    for (int ii = 0; ii < count * 2; ii ++) {\n        pPosArray[ii] *= ratio_h;\n    }\n    FX_FLOAT baseline = pText->m_PosY;\n    CTextBaseLine* pBaseLine = NULL;\n    FX_FLOAT topy = pText->m_Top;\n    FX_FLOAT bottomy = pText->m_Bottom;\n    FX_FLOAT leftx = pText->m_Left;\n    int cc = 0;\n    CFX_ByteString segment;\n    int space_count = 0;\n    FX_FLOAT last_left = 0, last_right = 0, segment_left = 0, segment_right = 0;\n    for (int i = 0; i < pText->m_nChars; i ++) {\n        FX_DWORD charcode = pText->m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)pText->m_pCharCodes : pText->m_pCharCodes[i];\n        if (charcode == (FX_DWORD) - 1) {\n            continue;\n        }\n        FX_FLOAT char_left = pPosArray[cc * 2];\n        FX_FLOAT char_right = pPosArray[cc * 2 + 1];\n        cc ++;\n        if (char_left < last_left || (char_left - last_right) > spacew / 2) {\n            pBaseLine = InsertTextBox(pBaseLine, baseline, leftx + segment_left, leftx + segment_right,\n                                      topy, bottomy, spacew, fontsize_v, segment, pFont);\n            segment_left = char_left;\n            segment = \"\";\n        }\n        CFX_WideString wCh = pText->GetFont()->UnicodeFromCharCode(charcode);\n        FX_DWORD ch = wCh.GetLength() > 0 ? wCh.GetAt(0) : charcode;\n        if (space_count > 1) {\n            pBaseLine = InsertTextBox(pBaseLine, baseline, leftx + segment_left, leftx + segment_right,\n                                      topy, bottomy, spacew, fontsize_v, segment, pFont);\n            segment = \"\";\n        } else if (space_count == 1) {\n            pFont->AppendChar(segment, ' ');\n        }\n        if (segment.GetLength() == 0) {\n            segment_left = char_left;\n        }\n        segment_right = char_right;\n        pFont->AppendChar(segment, charcode);\n        space_count = 0;\n        last_left = char_left;\n        last_right = char_right;\n    }\n    if (segment.GetLength())\n        pBaseLine = InsertTextBox(pBaseLine, baseline, leftx + segment_left, leftx + segment_right,\n                                  topy, bottomy, spacew, fontsize_v, segment, pFont);\n    FX_Free(pPosArray);\n}\nstatic void ConvertPDFString(CFX_ByteString& result, CFX_ByteString& src, CPDF_Font* pFont);\nCTextBaseLine* CTextPage::InsertTextBox(CTextBaseLine* pBaseLine, FX_FLOAT basey, FX_FLOAT leftx,\n                                        FX_FLOAT rightx, FX_FLOAT topy, FX_FLOAT bottomy, FX_FLOAT spacew, FX_FLOAT fontsize_v,\n                                        CFX_ByteString& str, CPDF_Font* pFont)\n{\n    if (str.GetLength() == 0) {\n        return NULL;\n    }\n    if (pBaseLine == NULL) {\n        int i;\n        for (i = 0; i < m_BaseLines.GetSize(); i ++) {\n            CTextBaseLine* pExistLine = (CTextBaseLine*)m_BaseLines.GetAt(i);\n            if (pExistLine->m_BaseLine == basey) {\n                pBaseLine = pExistLine;\n                break;\n            }\n            if (pExistLine->m_BaseLine < basey) {\n                break;\n            }\n        }\n        if (pBaseLine == NULL) {\n            pBaseLine = FX_NEW CTextBaseLine;\n            if (NULL == pBaseLine) {\n                return NULL;\n            }\n            pBaseLine->m_BaseLine = basey;\n            m_BaseLines.InsertAt(i, pBaseLine);\n        }\n    }\n    CFX_WideString text;\n    FX_LPCSTR pStr = str;\n    int len = str.GetLength(), offset = 0;\n    while (offset < len) {\n        FX_DWORD ch = pFont->GetNextChar(pStr, offset);\n        CFX_WideString unicode_str = pFont->UnicodeFromCharCode(ch);\n        text += unicode_str;\n    }\n    pBaseLine->InsertTextBox(leftx, rightx, topy, bottomy, spacew, fontsize_v, text);\n    return pBaseLine;\n}\nvoid CTextPage::WriteOutput(CFX_WideStringArray& lines, int iMinWidth)\n{\n    FX_FLOAT lastheight = -1;\n    FX_FLOAT lastbaseline = -1;\n    FX_FLOAT MinLeftX = 1000000;\n    FX_FLOAT MaxRightX = 0;\n    int i;\n    for (i = 0; i < m_BaseLines.GetSize(); i ++) {\n        CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);\n        FX_FLOAT leftx, rightx;\n        if (pBaseLine->GetWidth(leftx, rightx)) {\n            if (leftx < MinLeftX) {\n                MinLeftX = leftx;\n            }\n            if (rightx > MaxRightX) {\n                MaxRightX = rightx;\n            }\n        }\n    }\n    for (i = 0; i < m_BaseLines.GetSize(); i ++) {\n        CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);\n        pBaseLine->MergeBoxes();\n    }\n    for (i = 1; i < m_BaseLines.GetSize(); i ++) {\n        CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);\n        CTextBaseLine* pPrevLine = (CTextBaseLine*)m_BaseLines.GetAt(i - 1);\n        if (pBaseLine->CanMerge(pPrevLine)) {\n            pPrevLine->Merge(pBaseLine);\n            delete pBaseLine;\n            m_BaseLines.RemoveAt(i);\n            i --;\n        }\n    }\n    if (m_bAutoWidth) {\n        int* widths = FX_Alloc(int, m_BaseLines.GetSize());\n        if (widths) {\n            for (i = 0; i < m_BaseLines.GetSize(); i ++) {\n                widths[i] = 0;\n                CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);\n                int TotalChars = 0;\n                FX_FLOAT TotalWidth = 0;\n                int minchars;\n                pBaseLine->CountChars(TotalChars, TotalWidth, minchars);\n                if (TotalChars) {\n                    FX_FLOAT charwidth = TotalWidth / TotalChars;\n                    widths[i] = (int)((MaxRightX - MinLeftX) / charwidth);\n                }\n                if (widths[i] > 1000) {\n                    widths[i] = 1000;\n                }\n                if (widths[i] < minchars) {\n                    widths[i] = minchars;\n                }\n            }\n            int AvgWidth = 0, widthcount = 0;\n            for (i = 0; i < m_BaseLines.GetSize(); i ++)\n                if (widths[i]) {\n                    AvgWidth += widths[i];\n                    widthcount ++;\n                }\n            AvgWidth = int((FX_FLOAT)AvgWidth / widthcount + 0.5);\n            int MaxWidth = 0;\n            for (i = 0; i < m_BaseLines.GetSize(); i ++)\n                if (MaxWidth < widths[i]) {\n                    MaxWidth = widths[i];\n                }\n            if (MaxWidth > AvgWidth * 6 / 5) {\n                MaxWidth = AvgWidth * 6 / 5;\n            }\n            FX_Free(widths);\n            if (iMinWidth < MaxWidth) {\n                iMinWidth = MaxWidth;\n            }\n        }\n    }\n    for (i = 0; i < m_BaseLines.GetSize(); i ++) {\n        CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);\n        pBaseLine->MergeBoxes();\n    }\n    if (m_bKeepColumn) {\n        FindColumns();\n    }\n    for (i = 0; i < m_BaseLines.GetSize(); i ++) {\n        CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);\n        if (lastheight >= 0) {\n            FX_FLOAT dy = lastbaseline - pBaseLine->m_BaseLine;\n            if (dy >= (pBaseLine->m_MaxFontSizeV) * 1.5 || dy >= lastheight * 1.5) {\n                lines.Add(L\"\");\n            }\n        }\n        lastheight = pBaseLine->m_MaxFontSizeV;\n        lastbaseline = pBaseLine->m_BaseLine;\n        CFX_WideString str;\n        pBaseLine->WriteOutput(str, MinLeftX, MaxRightX - MinLeftX, iMinWidth);\n        lines.Add(str);\n    }\n}\nvoid NormalizeCompositeChar(FX_WCHAR wChar, CFX_WideString& sDest)\n{\n    wChar = FX_GetMirrorChar(wChar, TRUE, FALSE);\n    FX_LPWSTR pDst = NULL;\n    FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst);\n    if (nCount < 1 ) {\n        sDest += wChar;\n        return;\n    }\n    pDst = new FX_WCHAR[nCount];\n    FX_Unicode_GetNormalization(wChar, pDst);\n    for (int nIndex = 0; nIndex < nCount; nIndex++) {\n        sDest += pDst[nIndex];\n    }\n    delete[] pDst;\n}\nvoid NormalizeString(CFX_WideString& str)\n{\n    if (str.GetLength() <= 0) {\n        return;\n    }\n    CFX_WideString sBuffer;\n    IFX_BidiChar* BidiChar = IFX_BidiChar::Create();\n    if (NULL == BidiChar)\t{\n        return;\n    }\n    CFX_WordArray order;\n    FX_BOOL bR2L = FALSE;\n    FX_INT32 start = 0, count = 0, i = 0;\n    int nR2L = 0, nL2R = 0;\n    for (i = 0; i < str.GetLength(); i++) {\n        if(BidiChar->AppendChar(str.GetAt(i))) {\n            FX_INT32 ret = BidiChar->GetBidiInfo(start, count);\n            order.Add(start);\n            order.Add(count);\n            order.Add(ret);\n            if(!bR2L) {\n                if(ret == 2) {\n                    nR2L++;\n                } else if (ret == 1) {\n                    nL2R++;\n                }\n            }\n        }\n    }\n    if(BidiChar->EndChar()) {\n        FX_INT32 ret = BidiChar->GetBidiInfo(start, count);\n        order.Add(start);\n        order.Add(count);\n        order.Add(ret);\n        if(!bR2L) {\n            if(ret == 2) {\n                nR2L++;\n            } else if(ret == 1) {\n                nL2R++;\n            }\n        }\n    }\n    if(nR2L > 0 && nR2L >= nL2R) {\n        bR2L = TRUE;\n    }\n    if(bR2L) {\n        int count = order.GetSize();\n        for(int j = count - 1; j > 0; j -= 3) {\n            int ret = order.GetAt(j);\n            int start = order.GetAt(j - 2);\n            int count1 = order.GetAt(j - 1);\n            if(ret == 2 || ret == 0) {\n                for(int i = start + count1 - 1; i >= start; i--) {\n                    NormalizeCompositeChar(str[i], sBuffer);\n                }\n            } else {\n                i = j;\n                FX_BOOL bSymbol = FALSE;\n                while(i > 0 && order.GetAt(i) != 2) {\n                    bSymbol = !order.GetAt(i);\n                    i -= 3;\n                }\n                int end = start + count1 ;\n                int n = 0;\n                if(bSymbol) {\n                    n = i + 6;\n                } else {\n                    n = i + 3;\n                }\n                if(n >= j) {\n                    for(int m = start; m < end; m++) {\n                        sBuffer += str[m];\n                    }\n                } else {\n                    i = j;\n                    j = n;\n                    for(; n <= i; n += 3) {\n                        int ret = order.GetAt(n);\n                        int start = order.GetAt(n - 2);\n                        int count1 = order.GetAt(n - 1);\n                        int end = start + count1 ;\n                        for(int m = start; m < end; m++) {\n                            sBuffer += str[m];\n                        }\n                    }\n                }\n            }\n        }\n    } else {\n        int count = order.GetSize();\n        FX_BOOL bL2R = FALSE;\n        for(int j = 0; j < count; j += 3) {\n            int ret = order.GetAt(j + 2);\n            int start = order.GetAt(j);\n            int count1 = order.GetAt(j + 1);\n            if(ret == 2 || (j == 0 && ret == 0 && !bL2R)) {\n                int i = j + 3;\n                while(bR2L && i < count) {\n                    if(order.GetAt(i + 2) == 1) {\n                        break;\n                    } else {\n                        i += 3;\n                    }\n                }\n                if(i == 3) {\n                    j = -3;\n                    bL2R = TRUE;\n                    continue;\n                }\n                int end = str.GetLength() - 1;\n                if(i < count) {\n                    end = order.GetAt(i) - 1;\n                }\n                j = i - 3;\n                for(int n = end; n >= start; n--) {\n                    NormalizeCompositeChar(str[i], sBuffer);\n                }\n            } else {\n                int end = start + count1 ;\n                for(int i = start; i < end; i++) {\n                    sBuffer += str[i];\n                }\n            }\n        }\n    }\n    str.Empty();\n    str += sBuffer;\n    BidiChar->Release();\n}\nstatic FX_BOOL IsNumber(CFX_WideString& str)\n{\n    for (int i = 0; i < str.GetLength(); i ++) {\n        FX_WCHAR ch = str[i];\n        if ((ch < '0' || ch > '9') && ch != '-' && ch != '+' && ch != '.' && ch != ' ') {\n            return FALSE;\n        }\n    }\n    return TRUE;\n}\nvoid CTextPage::FindColumns()\n{\n    int i;\n    for (i = 0; i < m_BaseLines.GetSize(); i ++) {\n        CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);\n        for (int j = 0; j < pBaseLine->m_TextList.GetSize(); j ++) {\n            CTextBox* pTextBox = (CTextBox*)pBaseLine->m_TextList.GetAt(j);\n            CTextColumn* pColumn = FindColumn(pTextBox->m_Right);\n            if (pColumn == NULL) {\n                pColumn = FX_NEW CTextColumn;\n                if (pColumn) {\n                    pColumn->m_Count = 1;\n                    pColumn->m_AvgPos = pTextBox->m_Right;\n                    pColumn->m_TextPos = -1;\n                    m_TextColumns.Add(pColumn);\n                }\n            } else {\n                pColumn->m_AvgPos = (pColumn->m_Count * pColumn->m_AvgPos + pTextBox->m_Right) /\n                                    (pColumn->m_Count + 1);\n                pColumn->m_Count ++;\n            }\n        }\n    }\n    int mincount = m_BaseLines.GetSize() / 4;\n    for (i = 0; i < m_TextColumns.GetSize(); i ++) {\n        CTextColumn* pTextColumn = (CTextColumn*)m_TextColumns.GetAt(i);\n        if (pTextColumn->m_Count >= mincount) {\n            continue;\n        }\n        delete pTextColumn;\n        m_TextColumns.RemoveAt(i);\n        i --;\n    }\n    for (i = 0; i < m_BaseLines.GetSize(); i ++) {\n        CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);\n        for (int j = 0; j < pBaseLine->m_TextList.GetSize(); j ++) {\n            CTextBox* pTextBox = (CTextBox*)pBaseLine->m_TextList.GetAt(j);\n            if (IsNumber(pTextBox->m_Text)) {\n                pTextBox->m_pColumn = FindColumn(pTextBox->m_Right);\n            }\n        }\n    }\n}\nCTextColumn* CTextPage::FindColumn(FX_FLOAT xpos)\n{\n    for (int i = 0; i < m_TextColumns.GetSize(); i ++) {\n        CTextColumn* pColumn = (CTextColumn*)m_TextColumns.GetAt(i);\n        if (pColumn->m_AvgPos < xpos + 1 && pColumn->m_AvgPos > xpos - 1) {\n            return pColumn;\n        }\n    }\n    return NULL;\n}\nvoid CTextPage::BreakSpace(CPDF_TextObject* pTextObj)\n{\n}\nCTextBaseLine::CTextBaseLine()\n{\n    m_Top = -100000;\n    m_Bottom = 100000;\n    m_MaxFontSizeV = 0;\n}\nCTextBaseLine::~CTextBaseLine()\n{\n    for (int i = 0; i < m_TextList.GetSize(); i ++) {\n        CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);\n        delete pText;\n    }\n}\nvoid CTextBaseLine::InsertTextBox(FX_FLOAT leftx, FX_FLOAT rightx, FX_FLOAT topy, FX_FLOAT bottomy,\n                                  FX_FLOAT spacew, FX_FLOAT fontsize_v, const CFX_WideString& text)\n{\n    if (m_Top < topy) {\n        m_Top = topy;\n    }\n    if (m_Bottom > bottomy) {\n        m_Bottom = bottomy;\n    }\n    if (m_MaxFontSizeV < fontsize_v) {\n        m_MaxFontSizeV = fontsize_v;\n    }\n    int i;\n    for (i = 0; i < m_TextList.GetSize(); i ++) {\n        CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);\n        if (pText->m_Left > leftx) {\n            break;\n        }\n    }\n    CTextBox* pText = FX_NEW CTextBox;\n    if (NULL == pText) {\n        return;\n    }\n    pText->m_Text = text;\n    pText->m_Left = leftx;\n    pText->m_Right = rightx;\n    pText->m_Top = topy;\n    pText->m_Bottom = bottomy;\n    pText->m_SpaceWidth = spacew;\n    pText->m_FontSizeV = fontsize_v;\n    pText->m_pColumn = NULL;\n    m_TextList.InsertAt(i, pText);\n}\nFX_BOOL GetIntersection(FX_FLOAT low1, FX_FLOAT high1, FX_FLOAT low2, FX_FLOAT high2,\n                        FX_FLOAT& interlow, FX_FLOAT& interhigh);\nFX_BOOL CTextBaseLine::CanMerge(CTextBaseLine* pOther)\n{\n    FX_FLOAT inter_top, inter_bottom;\n    if (!GetIntersection(m_Bottom, m_Top, pOther->m_Bottom, pOther->m_Top,\n                         inter_bottom, inter_top)) {\n        return FALSE;\n    }\n    FX_FLOAT inter_h = inter_top - inter_bottom;\n    if (inter_h < (m_Top - m_Bottom) / 2 && inter_h < (pOther->m_Top - pOther->m_Bottom) / 2) {\n        return FALSE;\n    }\n    FX_FLOAT dy = (FX_FLOAT)FXSYS_fabs(m_BaseLine - pOther->m_BaseLine);\n    for (int i = 0; i < m_TextList.GetSize(); i ++) {\n        CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);\n        FX_FLOAT width = pText->m_Right - pText->m_Left;\n        for (int j = 0; j < pOther->m_TextList.GetSize(); j ++) {\n            CTextBox* pOtherText = (CTextBox*)pOther->m_TextList.GetAt(j);\n            FX_FLOAT inter_left, inter_right;\n            if (!GetIntersection(pText->m_Left, pText->m_Right,\n                                 pOtherText->m_Left, pOtherText->m_Right, inter_left, inter_right)) {\n                continue;\n            }\n            FX_FLOAT inter_w = inter_right - inter_left;\n            if (inter_w < pText->m_SpaceWidth / 2 && inter_w < pOtherText->m_SpaceWidth / 2) {\n                continue;\n            }\n            if (dy >= (pText->m_Bottom - pText->m_Top) / 2 ||\n                    dy >= (pOtherText->m_Bottom - pOtherText->m_Top) / 2) {\n                return FALSE;\n            }\n        }\n    }\n    return TRUE;\n}\nvoid CTextBaseLine::Merge(CTextBaseLine* pOther)\n{\n    for (int i = 0; i < pOther->m_TextList.GetSize(); i ++) {\n        CTextBox* pText = (CTextBox*)pOther->m_TextList.GetAt(i);\n        InsertTextBox(pText->m_Left, pText->m_Right, pText->m_Top, pText->m_Bottom,\n                      pText->m_SpaceWidth, pText->m_FontSizeV, pText->m_Text);\n    }\n}\nFX_BOOL CTextBaseLine::GetWidth(FX_FLOAT& leftx, FX_FLOAT& rightx)\n{\n    int i;\n    for (i = 0; i < m_TextList.GetSize(); i ++) {\n        CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);\n        if (pText->m_Text != L\" \") {\n            break;\n        }\n    }\n    if (i == m_TextList.GetSize()) {\n        return FALSE;\n    }\n    CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);\n    leftx = pText->m_Left;\n    for (i = m_TextList.GetSize() - 1; i >= 0; i --) {\n        CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);\n        if (pText->m_Text != L\" \") {\n            break;\n        }\n    }\n    pText = (CTextBox*)m_TextList.GetAt(i);\n    rightx = pText->m_Right;\n    return TRUE;\n}\nvoid CTextBaseLine::MergeBoxes()\n{\n    int i = 0;\n    while (1) {\n        if (i >= m_TextList.GetSize() - 1) {\n            break;\n        }\n        CTextBox* pThisText = (CTextBox*)m_TextList.GetAt(i);\n        CTextBox* pNextText = (CTextBox*)m_TextList.GetAt(i + 1);\n        FX_FLOAT dx = pNextText->m_Left - pThisText->m_Right;\n        FX_FLOAT spacew = (pThisText->m_SpaceWidth == 0.0) ?\n                          pNextText->m_SpaceWidth : pThisText->m_SpaceWidth;\n        if (spacew > 0.0 && dx < spacew * 2) {\n            pThisText->m_Right = pNextText->m_Right;\n            if (dx > spacew * 1.5) {\n                pThisText->m_Text += L\"  \";\n            } else if (dx > spacew / 3) {\n                pThisText->m_Text += L' ';\n            }\n            pThisText->m_Text += pNextText->m_Text;\n            pThisText->m_SpaceWidth = pNextText->m_SpaceWidth == 0.0 ?\n                                      spacew : pNextText->m_SpaceWidth;\n            m_TextList.RemoveAt(i + 1);\n            delete pNextText;\n        } else {\n            i ++;\n        }\n    }\n}\nvoid CTextBaseLine::WriteOutput(CFX_WideString& str, FX_FLOAT leftx, FX_FLOAT pagewidth,\n                                int iTextWidth)\n{\n    int lastpos = -1;\n    for (int i = 0; i < m_TextList.GetSize(); i ++) {\n        CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);\n        int xpos;\n        if (pText->m_pColumn) {\n            xpos = (int)((pText->m_pColumn->m_AvgPos - leftx) * iTextWidth / pagewidth + 0.5);\n            xpos -= pText->m_Text.GetLength();\n        } else {\n            xpos = (int)((pText->m_Left - leftx) * iTextWidth / pagewidth + 0.5);\n        }\n        if (xpos <= lastpos) {\n            xpos = lastpos + 1;\n        }\n        for (int j = lastpos + 1; j < xpos; j ++) {\n            str += ' ';\n        }\n        CFX_WideString sSrc(pText->m_Text);\n        NormalizeString(sSrc);\n        str += sSrc;\n        str += ' ';\n        lastpos = xpos + pText->m_Text.GetLength();\n    }\n}\nvoid CTextBaseLine::CountChars(int& count, FX_FLOAT& width, int& minchars)\n{\n    minchars = 0;\n    for (int i = 0; i < m_TextList.GetSize(); i ++) {\n        CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);\n        if (pText->m_Right - pText->m_Left < 0.002) {\n            continue;\n        }\n        count += pText->m_Text.GetLength();\n        width += pText->m_Right - pText->m_Left;\n        minchars += pText->m_Text.GetLength() + 1;\n    }\n}\n#define PI 3.1415926535897932384626433832795\nstatic void CheckRotate(CPDF_Page& page, CFX_FloatRect& page_bbox)\n{\n    int total_count = 0, rotated_count[3] = {0, 0, 0};\n    FX_POSITION pos = page.GetFirstObjectPosition();\n    while (pos) {\n        CPDF_PageObject* pObj = page.GetNextObject(pos);\n        if (pObj->m_Type != PDFPAGE_TEXT) {\n            continue;\n        }\n        total_count ++;\n        CPDF_TextObject* pText = (CPDF_TextObject*)pObj;\n        FX_FLOAT angle = pText->m_TextState.GetBaselineAngle();\n        if (angle == 0.0) {\n            continue;\n        }\n        int degree = (int)(angle * 180 / PI + 0.5);\n        if (degree % 90) {\n            continue;\n        }\n        if (degree < 0) {\n            degree += 360;\n        }\n        int index = degree / 90 % 3 - 1;\n        if (index < 0) {\n            continue;\n        }\n        rotated_count[index] ++;\n    }\n    if (total_count == 0) {\n        return;\n    }\n    CFX_AffineMatrix matrix;\n    if (rotated_count[0] > total_count * 2 / 3) {\n        matrix.Set(0, -1, 1, 0, 0, page.GetPageHeight());\n    } else if (rotated_count[1] > total_count * 2 / 3) {\n        matrix.Set(-1, 0, 0, -1, page.GetPageWidth(), page.GetPageHeight());\n    } else if (rotated_count[2] > total_count * 2 / 3) {\n        matrix.Set(0, 1, -1, 0, page.GetPageWidth(), 0);\n    } else {\n        return;\n    }\n    page.Transform(matrix);\n    page_bbox.Transform(&matrix);\n}\nvoid PDF_GetPageText_Unicode(CFX_WideStringArray& lines, CPDF_Document* pDoc, CPDF_Dictionary* pPage,\n                             int iMinWidth, FX_DWORD flags)\n{\n    lines.RemoveAll();\n    if (pPage == NULL) {\n        return;\n    }\n    CPDF_Page page;\n    page.Load(pDoc, pPage);\n    CPDF_ParseOptions options;\n    options.m_bTextOnly = TRUE;\n    options.m_bSeparateForm = FALSE;\n    page.ParseContent(&options);\n    CFX_FloatRect page_bbox = page.GetPageBBox();\n    if (flags & PDF2TXT_AUTO_ROTATE) {\n        CheckRotate(page, page_bbox);\n    }\n    CTextPage texts;\n    texts.m_bAutoWidth = flags & PDF2TXT_AUTO_WIDTH;\n    texts.m_bKeepColumn = flags & PDF2TXT_KEEP_COLUMN;\n    texts.m_bBreakSpace = TRUE;\n    FX_POSITION pos = page.GetFirstObjectPosition();\n    while (pos) {\n        CPDF_PageObject* pObject = page.GetNextObject(pos);\n        if (!(flags & PDF2TXT_INCLUDE_INVISIBLE)) {\n            CFX_FloatRect rect(pObject->m_Left, pObject->m_Bottom, pObject->m_Right, pObject->m_Top);\n            if (!page_bbox.Contains(rect)) {\n                continue;\n            }\n        }\n        texts.ProcessObject(pObject);\n    }\n    texts.WriteOutput(lines, iMinWidth);\n}\nvoid PDF_GetPageText(CFX_ByteStringArray& lines, CPDF_Document* pDoc, CPDF_Dictionary* pPage,\n                     int iMinWidth, FX_DWORD flags)\n{\n    lines.RemoveAll();\n    CFX_WideStringArray wlines;\n    PDF_GetPageText_Unicode(wlines, pDoc, pPage, iMinWidth, flags);\n    for (int i = 0; i < wlines.GetSize(); i ++) {\n        CFX_WideString wstr = wlines[i];\n        CFX_ByteString str;\n        for (int c = 0; c < wstr.GetLength(); c ++) {\n            str += CharFromUnicodeAlt(wstr[c], FXSYS_GetACP(), \"?\");\n        }\n        lines.Add(str);\n    }\n}\n#endif\nextern void _PDF_GetTextStream_Unicode(CFX_WideTextBuf& buffer, CPDF_PageObjects* pPage, FX_BOOL bUseLF,\n                                       CFX_PtrArray* pObjArray);\nvoid PDF_GetTextStream_Unicode(CFX_WideTextBuf& buffer, CPDF_Document* pDoc, CPDF_Dictionary* pPage, FX_DWORD flags)\n{\n    buffer.EstimateSize(0, 10240);\n    CPDF_Page page;\n    page.Load(pDoc, pPage);\n    CPDF_ParseOptions options;\n    options.m_bTextOnly = TRUE;\n    options.m_bSeparateForm = FALSE;\n    page.ParseContent(&options);\n    _PDF_GetTextStream_Unicode(buffer, &page, TRUE, NULL);\n}\n"
  },
  {
    "path": "core/src/fpdftext/fpdf_text_int.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fpdfapi/fpdf_resource.h\"\n#include \"../../include/fpdfapi/fpdf_pageobj.h\"\n#include \"../../include/fpdftext/fpdf_text.h\"\n#include \"../../include/fpdfapi/fpdf_page.h\"\n#include \"../../include/fpdfapi/fpdf_module.h\"\n#include <ctype.h>\n#include \"text_int.h\"\nFX_BOOL _IsIgnoreSpaceCharacter(FX_WCHAR curChar)\n{\n    if(curChar < 255 ) {\n        return FALSE;\n    }\n    if ( (curChar >= 0x0600 && curChar <= 0x06FF)\n            || (curChar >= 0xFE70 && curChar <= 0xFEFF)\n            || (curChar >= 0xFB50 && curChar <= 0xFDFF)\n            || (curChar >= 0x0400 && curChar <= 0x04FF)\n            || (curChar >= 0x0500 && curChar <= 0x052F)\n            || (curChar >= 0xA640 && curChar <= 0xA69F)\n            || (curChar >= 0x2DE0 && curChar <= 0x2DFF)\n            || curChar == 8467\n            || (curChar >= 0x2000 && curChar <= 0x206F)) {\n        return FALSE;\n    }\n    return TRUE;\n}\nCPDFText_ParseOptions::CPDFText_ParseOptions()\n    : m_bGetCharCodeOnly(FALSE), m_bNormalizeObjs(TRUE), m_bOutputHyphen(FALSE)\n{\n}\nIPDF_TextPage* IPDF_TextPage::CreateTextPage(const CPDF_Page* pPage, CPDFText_ParseOptions ParserOptions)\n{\n    CPDF_TextPage* pTextPageEx = FX_NEW CPDF_TextPage(pPage, ParserOptions);\n    return pTextPageEx;\n}\nIPDF_TextPage* IPDF_TextPage::CreateTextPage(const CPDF_Page* pPage, int flags)\n{\n    CPDF_TextPage* pTextPage = FX_NEW CPDF_TextPage(pPage, flags);\n    return\tpTextPage;\n}\nIPDF_TextPage*\tIPDF_TextPage::CreateTextPage(const CPDF_PageObjects* pObjs, int flags)\n{\n    CPDF_TextPage* pTextPage = FX_NEW CPDF_TextPage(pObjs, flags);\n    return\tpTextPage;\n}\nIPDF_TextPageFind*\tIPDF_TextPageFind::CreatePageFind(const IPDF_TextPage* pTextPage)\n{\n    if (!pTextPage) {\n        return NULL;\n    }\n    return FX_NEW CPDF_TextPageFind(pTextPage);\n}\nIPDF_LinkExtract* IPDF_LinkExtract::CreateLinkExtract()\n{\n    return FX_NEW CPDF_LinkExtract();\n}\n#define  TEXT_BLANK_CHAR\t\tL' '\n#define  TEXT_LINEFEED_CHAR\t\tL'\\n'\n#define\t TEXT_RETURN_CHAR\t\tL'\\r'\n#define  TEXT_EMPTY\t\t\t\tL\"\"\n#define  TEXT_BLANK\t\t\t\tL\" \"\n#define  TEXT_RETURN_LINEFEED\tL\"\\r\\n\"\n#define  TEXT_LINEFEED\t\t\tL\"\\n\"\n#define\t TEXT_CHARRATIO_GAPDELTA\t0.070\nCPDF_TextPage::CPDF_TextPage(const CPDF_Page* pPage, int flags)\n    : m_pPreTextObj(NULL),\n      m_IsParsered(FALSE),\n      m_charList(512),\n      m_TempCharList(50),\n      m_TextlineDir(-1),\n      m_CurlineRect(0, 0, 0, 0)\n{\n    m_pPage = pPage;\n    m_parserflag = flags;\n    m_TextBuf.EstimateSize(0, 10240);\n    pPage->GetDisplayMatrix(m_DisplayMatrix, 0, 0, (int) pPage->GetPageWidth(), (int)pPage->GetPageHeight(), 0);\n}\nCPDF_TextPage::CPDF_TextPage(const CPDF_Page* pPage, CPDFText_ParseOptions ParserOptions)\n    : m_pPreTextObj(NULL)\n    , m_IsParsered(FALSE)\n    , m_charList(512)\n    , m_TempCharList(50)\n    , m_TextlineDir(-1)\n    , m_CurlineRect(0, 0, 0, 0)\n    , m_ParseOptions(ParserOptions)\n{\n    m_pPage = pPage;\n    m_parserflag = 0;\n    m_TextBuf.EstimateSize(0, 10240);\n    pPage->GetDisplayMatrix(m_DisplayMatrix, 0, 0, (int) pPage->GetPageWidth(), (int)pPage->GetPageHeight(), 0);\n}\nCPDF_TextPage::CPDF_TextPage(const CPDF_PageObjects* pPage, int flags)\n    : m_pPreTextObj(NULL),\n      m_IsParsered(FALSE),\n      m_charList(512),\n      m_TempCharList(50),\n      m_TextlineDir(-1),\n      m_CurlineRect(0, 0, 0, 0)\n{\n    m_pPage = pPage;\n    m_parserflag = flags;\n    m_TextBuf.EstimateSize(0, 10240);\n    CFX_FloatRect pageRect = pPage->CalcBoundingBox();\n    m_DisplayMatrix = CFX_AffineMatrix(1, 0, 0, -1, pageRect.right, pageRect.top);\n}\nvoid CPDF_TextPage::NormalizeObjects(FX_BOOL bNormalize)\n{\n    m_ParseOptions.m_bNormalizeObjs = bNormalize;\n}\nFX_BOOL CPDF_TextPage::IsControlChar(PAGECHAR_INFO* pCharInfo)\n{\n    if(!pCharInfo) {\n        return FALSE;\n    }\n    switch(pCharInfo->m_Unicode) {\n        case 0x2:\n        case 0x3:\n        case 0x93:\n        case 0x94:\n        case 0x96:\n        case 0x97:\n        case 0x98:\n        case 0xfffe:\n            if(pCharInfo->m_Flag == FPDFTEXT_CHAR_HYPHEN) {\n                return FALSE;\n            } else {\n                return TRUE;\n            }\n        default:\n            return FALSE;\n    }\n}\nFX_BOOL CPDF_TextPage::ParseTextPage()\n{\n    if (!m_pPage) {\n        m_IsParsered = FALSE;\n        return FALSE;\n    }\n    m_IsParsered = FALSE;\n    m_TextBuf.Clear();\n    m_charList.RemoveAll();\n    m_pPreTextObj = NULL;\n    ProcessObject();\n    m_IsParsered = TRUE;\n    if(!m_ParseOptions.m_bGetCharCodeOnly) {\n        m_CharIndex.RemoveAll();\n        int nCount = m_charList.GetSize();\n        if(nCount) {\n            m_CharIndex.Add(0);\n        }\n        for(int i = 0; i < nCount; i++) {\n            int indexSize = m_CharIndex.GetSize();\n            FX_BOOL bNormal = FALSE;\n            PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(i);\n            if(charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED) {\n                bNormal = TRUE;\n            }\n#ifdef FOXIT_CHROME_BUILD\n            else if(charinfo.m_Unicode == 0 || IsControlChar(&charinfo))\n#else\n            else if(charinfo.m_Unicode == 0)\n#endif\n                bNormal = FALSE;\n            else {\n                bNormal = TRUE;\n            }\n            if(bNormal) {\n                if(indexSize % 2) {\n                    m_CharIndex.Add(1);\n                } else {\n                    if(indexSize <= 0) {\n                        continue;\n                    }\n                    m_CharIndex.SetAt(indexSize - 1, m_CharIndex.GetAt(indexSize - 1) + 1);\n                }\n            } else {\n                if(indexSize % 2) {\n                    if(indexSize <= 0) {\n                        continue;\n                    }\n                    m_CharIndex.SetAt(indexSize - 1, i + 1);\n                } else {\n                    m_CharIndex.Add(i + 1);\n                }\n            }\n        }\n        int indexSize = m_CharIndex.GetSize();\n        if(indexSize % 2) {\n            m_CharIndex.RemoveAt(indexSize - 1);\n        }\n    }\n    return TRUE;\n}\nint\tCPDF_TextPage::CountChars() const\n{\n    if(m_ParseOptions.m_bGetCharCodeOnly) {\n        return m_TextBuf.GetSize();\n    }\n    return m_charList.GetSize();\n}\nint CPDF_TextPage::CharIndexFromTextIndex(int TextIndex) const\n{\n    int indexSize = m_CharIndex.GetSize();\n    int count = 0;\n    for(int i = 0; i < indexSize; i += 2) {\n        count += m_CharIndex.GetAt(i + 1);\n        if(count > TextIndex) {\n            return \tTextIndex - count + m_CharIndex.GetAt(i + 1) + m_CharIndex.GetAt(i);\n        }\n    }\n    return -1;\n}\nint CPDF_TextPage::TextIndexFromCharIndex(int CharIndex) const\n{\n    int indexSize = m_CharIndex.GetSize();\n    int count = 0;\n    for(int i = 0; i < indexSize; i += 2) {\n        count += m_CharIndex.GetAt(i + 1);\n        if(m_CharIndex.GetAt(i + 1) + m_CharIndex.GetAt(i) > CharIndex) {\n            if(CharIndex - m_CharIndex.GetAt(i) < 0) {\n                return -1;\n            }\n            return \tCharIndex - m_CharIndex.GetAt(i) + count - m_CharIndex.GetAt(i + 1);\n        }\n    }\n    return -1;\n}\nvoid CPDF_TextPage::GetRectArray(int start, int nCount, CFX_RectArray& rectArray) const\n{\n    if(m_ParseOptions.m_bGetCharCodeOnly) {\n        return;\n    }\n    if(start < 0 || nCount == 0) {\n        return;\n    }\n    if (!m_IsParsered)\t{\n        return;\n    }\n    PAGECHAR_INFO\t\tinfo_curchar;\n    CPDF_TextObject*\tpCurObj = NULL;\n    CFX_FloatRect\t\trect;\n    int\t\t\t\t\tcurPos = start;\n    FX_BOOL\t\t\t\tflagNewRect = TRUE;\n    if (nCount + start > m_charList.GetSize() || nCount == -1) {\n        nCount = m_charList.GetSize() - start;\n    }\n    while (nCount--) {\n        info_curchar = *(PAGECHAR_INFO*)m_charList.GetAt(curPos++);\n        if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) {\n            continue;\n        }\n        if(info_curchar.m_CharBox.Width() < 0.01 || info_curchar.m_CharBox.Height() < 0.01) {\n            continue;\n        }\n        if(!pCurObj) {\n            pCurObj = info_curchar.m_pTextObj;\n        }\n        if (pCurObj != info_curchar.m_pTextObj) {\n            rectArray.Add(rect);\n            pCurObj = info_curchar.m_pTextObj;\n            flagNewRect = TRUE;\n        }\n        if (flagNewRect) {\n            FX_FLOAT orgX = info_curchar.m_OriginX, orgY = info_curchar.m_OriginY;\n            CFX_AffineMatrix matrix, matrix_reverse;\n            info_curchar.m_pTextObj->GetTextMatrix(&matrix);\n            matrix.Concat(info_curchar.m_Matrix);\n            matrix_reverse.SetReverse(matrix);\n            matrix_reverse.Transform(orgX, orgY);\n            rect.left = info_curchar.m_CharBox.left;\n            rect.right = info_curchar.m_CharBox.right;\n            if (pCurObj->GetFont()->GetTypeDescent()) {\n                rect.bottom = orgY + pCurObj->GetFont()->GetTypeDescent() * pCurObj->GetFontSize() / 1000;\n                FX_FLOAT xPosTemp = orgX;\n                matrix.Transform(xPosTemp, rect.bottom);\n            } else {\n                rect.bottom = info_curchar.m_CharBox.bottom;\n            }\n            if (pCurObj->GetFont()->GetTypeAscent()) {\n                rect.top = orgY + pCurObj->GetFont()->GetTypeAscent() * pCurObj->GetFontSize() / 1000;\n                FX_FLOAT xPosTemp = orgX + GetCharWidth(info_curchar.m_CharCode, pCurObj->GetFont()) * pCurObj->GetFontSize() / 1000;\n                matrix.Transform(xPosTemp, rect.top);\n            } else {\n                rect.top = info_curchar.m_CharBox.top;\n            }\n            flagNewRect = FALSE;\n            rect = info_curchar.m_CharBox;\n            rect.Normalize();\n        } else {\n            info_curchar.m_CharBox.Normalize();\n            if (rect.left > info_curchar.m_CharBox.left) {\n                rect.left = info_curchar.m_CharBox.left;\n            }\n            if (rect.right < info_curchar.m_CharBox.right) {\n                rect.right = info_curchar.m_CharBox.right;\n            }\n            if ( rect.top < info_curchar.m_CharBox.top) {\n                rect.top = info_curchar.m_CharBox.top;\n            }\n            if (rect.bottom > info_curchar.m_CharBox.bottom) {\n                rect.bottom = info_curchar.m_CharBox.bottom;\n            }\n        }\n    }\n    rectArray.Add(rect);\n    return;\n}\nint CPDF_TextPage::GetIndexAtPos(CPDF_Point point , FX_FLOAT xTorelance, FX_FLOAT yTorelance) const\n{\n    if(m_ParseOptions.m_bGetCharCodeOnly) {\n        return -3;\n    }\n    if (!m_IsParsered)\t{\n        return\t-3;\n    }\n    FX_FLOAT distance = 0;\n    int pos = 0;\n    int NearPos = -1;\n    double xdif = 5000, ydif = 5000;\n    while(pos < m_charList.GetSize()) {\n        PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)(m_charList.GetAt(pos));\n        CFX_FloatRect charrect = charinfo.m_CharBox;\n        if (charrect.Contains(point.x, point.y)) {\n            break;\n        }\n        if (xTorelance > 0 || yTorelance > 0) {\n            CFX_FloatRect charRectExt;\n            charrect.Normalize();\n            charRectExt.left = charrect.left - xTorelance / 2;\n            charRectExt.right = charrect.right + xTorelance / 2;\n            charRectExt.top = charrect.top + yTorelance / 2;\n            charRectExt.bottom = charrect.bottom - yTorelance / 2;\n            if (charRectExt.Contains(point.x, point.y)) {\n                double curXdif, curYdif;\n                curXdif = FXSYS_fabs(point.x - charrect.left) < FXSYS_fabs(point.x - charrect.right) ? FXSYS_fabs(point.x - charrect.left) : FXSYS_fabs(point.x - charrect.right);\n                curYdif = FXSYS_fabs(point.y - charrect.bottom) < FXSYS_fabs(point.y - charrect.top\t) ? FXSYS_fabs(point.y - charrect.bottom) : FXSYS_fabs(point.y - charrect.top);\n                if (curYdif + curXdif < xdif + ydif) {\n                    ydif = curYdif;\n                    xdif = curXdif;\n                    NearPos = pos;\n                }\n            }\n        }\n        ++pos;\n    }\n    if (pos >= m_charList.GetSize()) {\n        pos = NearPos;\n    }\n    return pos;\n}\nCFX_WideString CPDF_TextPage::GetTextByRect(CFX_FloatRect rect) const\n{\n    CFX_WideString strText;\n    if(m_ParseOptions.m_bGetCharCodeOnly || !m_IsParsered) {\n        return strText;\n    }\n    int nCount = m_charList.GetSize();\n    int pos = 0;\n    FX_FLOAT posy = 0;\n    FX_BOOL IsContainPreChar = FALSE;\n    FX_BOOL\tISAddLineFeed = FALSE;\n    while (pos < nCount) {\n        PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(pos++);\n        if (IsRectIntersect(rect, charinfo.m_CharBox)) {\n            if (FXSYS_fabs(posy - charinfo.m_OriginY) > 0 && !IsContainPreChar && ISAddLineFeed) {\n                posy = charinfo.m_OriginY;\n                if (strText.GetLength() > 0) {\n                    strText += L\"\\r\\n\";\n                }\n            }\n            IsContainPreChar = TRUE;\n            ISAddLineFeed = FALSE;\n            if (charinfo.m_Unicode) {\n                strText += charinfo.m_Unicode;\n            }\n        } else if (charinfo.m_Unicode == 32) {\n            if (IsContainPreChar && charinfo.m_Unicode) {\n                strText += charinfo.m_Unicode;\n                IsContainPreChar = FALSE;\n                ISAddLineFeed = FALSE;\n            }\n        } else {\n            IsContainPreChar = FALSE;\n            ISAddLineFeed = TRUE;\n        }\n    }\n    return strText;\n}\nvoid CPDF_TextPage::GetRectsArrayByRect(CFX_FloatRect rect, CFX_RectArray& resRectArray) const\n{\n    if(m_ParseOptions.m_bGetCharCodeOnly) {\n        return;\n    }\n    if (!m_IsParsered)\t{\n        return;\n    }\n    CFX_FloatRect\t\tcurRect;\n    FX_BOOL\t\t\t\tflagNewRect = TRUE;\n    CPDF_TextObject*\tpCurObj = NULL;\n    int nCount = m_charList.GetSize();\n    int pos = 0;\n    while (pos < nCount) {\n        PAGECHAR_INFO info_curchar = *(PAGECHAR_INFO*)m_charList.GetAt(pos++);\n        if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) {\n            continue;\n        }\n        if(pos == 494) {\n            int a = 0;\n        }\n        if (IsRectIntersect(rect, info_curchar.m_CharBox)) {\n            if(!pCurObj) {\n                pCurObj = info_curchar.m_pTextObj;\n            }\n            if (pCurObj != info_curchar.m_pTextObj) {\n                resRectArray.Add(curRect);\n                pCurObj = info_curchar.m_pTextObj;\n                flagNewRect = TRUE;\n            }\n            if (flagNewRect) {\n                curRect = info_curchar.m_CharBox;\n                flagNewRect = FALSE;\n                curRect.Normalize();\n            } else {\n                info_curchar.m_CharBox.Normalize();\n                if (curRect.left > info_curchar.m_CharBox.left) {\n                    curRect.left = info_curchar.m_CharBox.left;\n                }\n                if (curRect.right < info_curchar.m_CharBox.right) {\n                    curRect.right = info_curchar.m_CharBox.right;\n                }\n                if ( curRect.top < info_curchar.m_CharBox.top) {\n                    curRect.top = info_curchar.m_CharBox.top;\n                }\n                if (curRect.bottom > info_curchar.m_CharBox.bottom) {\n                    curRect.bottom = info_curchar.m_CharBox.bottom;\n                }\n            }\n        }\n    }\n    resRectArray.Add(curRect);\n    return;\n}\nint\tCPDF_TextPage::GetIndexAtPos(FX_FLOAT x, FX_FLOAT y, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const\n{\n    if(m_ParseOptions.m_bGetCharCodeOnly) {\n        return -3;\n    }\n    CPDF_Point point(x, y);\n    return GetIndexAtPos(point, xTorelance, yTorelance);\n}\nint CPDF_TextPage::GetOrderByDirection(int order, int direction) const\n{\n    if(m_ParseOptions.m_bGetCharCodeOnly) {\n        return -3;\n    }\n    if (!m_IsParsered) {\n        return -3;\n    }\n    if (direction == FPDFTEXT_RIGHT || direction == FPDFTEXT_LEFT) {\n        order += direction;\n        while(order >= 0 && order < m_charList.GetSize()) {\n            PAGECHAR_INFO cinfo = *(PAGECHAR_INFO*)m_charList.GetAt(order);\n            if (cinfo.m_Flag != FPDFTEXT_CHAR_GENERATED) {\n                break;\n            } else {\n                if (cinfo.m_Unicode == TEXT_LINEFEED_CHAR || cinfo.m_Unicode == TEXT_RETURN_CHAR) {\n                    order += direction;\n                } else {\n                    break;\n                }\n            }\n        }\n        if (order >= m_charList.GetSize()) {\n            order = -2;\n        }\n        return order;\n    }\n    PAGECHAR_INFO charinfo;\n    charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(order);\n    CPDF_Point curPos(charinfo.m_OriginX, charinfo.m_OriginY);\n    FX_FLOAT difPosY = 0.0, minXdif = 1000;\n    int\tminIndex = -2;\n    int index = order;\n    FX_FLOAT height = charinfo.m_CharBox.Height();\n    if (direction == FPDFTEXT_UP) {\n        minIndex = -1;\n        while (1) {\n            if (--index < 0)\t{\n                return -1;\n            }\n            charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);\n            if (FXSYS_fabs(charinfo.m_OriginY - curPos.y) > FX_MAX(height, charinfo.m_CharBox.Height()) / 2) {\n                difPosY = charinfo.m_OriginY;\n                minIndex = index;\n                break;\n            }\n        }\n        FX_FLOAT PreXdif = charinfo.m_OriginX - curPos.x;\n        minXdif = PreXdif;\n        if (PreXdif == 0)\t{\n            return index;\n        }\n        FX_FLOAT curXdif = 0;\n        while (--index >= 0) {\n            charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);\n            if (difPosY != charinfo.m_OriginY) {\n                break;\n            }\n            curXdif = charinfo.m_OriginX - curPos.x;\n            if (curXdif == 0) {\n                return index;\n            }\n            int signflag = 0;\n            if (curXdif > 0) {\n                signflag = 1;\n            } else {\n                signflag = -1;\n            }\n            if (signflag * PreXdif < 0) {\n                if (FXSYS_fabs(PreXdif) < FXSYS_fabs(curXdif)) {\n                    return index + 1;\n                } else {\n                    return index;\n                }\n            }\n            if (FXSYS_fabs(curXdif) < FXSYS_fabs(minXdif)) {\n                minIndex = index;\n                minXdif = curXdif;\n            }\n            PreXdif = curXdif;\n            if (difPosY != charinfo.m_OriginY) {\n                break;\n            }\n        }\n        return minIndex;\n    } else if(FPDFTEXT_DOWN) {\n        minIndex = -2;\n        while (1) {\n            if (++index > m_charList.GetSize() - 1)\t{\n                return minIndex;\n            }\n            charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);\n            if (FXSYS_fabs(charinfo.m_OriginY - curPos.y) > FX_MAX(height, charinfo.m_CharBox.Height()) / 2) {\n                difPosY = charinfo.m_OriginY;\n                minIndex = index;\n                break;\n            }\n        }\n        FX_FLOAT PreXdif = charinfo.m_OriginX - curPos.x;\n        minXdif = PreXdif;\n        if (PreXdif == 0)\t{\n            return index;\n        }\n        FX_FLOAT curXdif = 0;\n        while (++index < m_charList.GetSize()) {\n            charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);\n            if (difPosY != charinfo.m_OriginY) {\n                break;\n            }\n            curXdif = charinfo.m_OriginX - curPos.x;\n            if (curXdif == 0) {\n                return index;\n            }\n            int signflag = 0;\n            if (curXdif > 0) {\n                signflag = 1;\n            } else {\n                signflag = -1;\n            }\n            if (signflag * PreXdif < 0) {\n                if (FXSYS_fabs(PreXdif) < FXSYS_fabs(curXdif)) {\n                    return index - 1;\n                } else {\n                    return index;\n                }\n            }\n            if (FXSYS_fabs(curXdif) < FXSYS_fabs(minXdif)) {\n                minXdif = curXdif;\n                minIndex = index;\n            }\n            PreXdif = curXdif;\n        }\n        return minIndex;\n    }\n}\nvoid CPDF_TextPage::GetCharInfo(int index, FPDF_CHAR_INFO & info) const\n{\n    if(m_ParseOptions.m_bGetCharCodeOnly) {\n        return;\n    }\n    if (!m_IsParsered)\t{\n        return;\n    }\n    if (index < 0 || index >= m_charList.GetSize())\t{\n        return;\n    }\n    PAGECHAR_INFO charinfo;\n    charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);\n    info.m_Charcode = charinfo.m_CharCode;\n    info.m_OriginX = charinfo.m_OriginX;\n    info.m_OriginY = charinfo.m_OriginY;\n    info.m_Unicode = charinfo.m_Unicode;\n    info.m_Flag = charinfo.m_Flag;\n    info.m_CharBox = charinfo.m_CharBox;\n    info.m_pTextObj = charinfo.m_pTextObj;\n    if (charinfo.m_pTextObj && charinfo.m_pTextObj->GetFont()) {\n        info.m_FontSize = charinfo.m_pTextObj->GetFontSize();\n    }\n    info.m_Matrix.Copy(charinfo.m_Matrix);\n    return;\n}\nvoid CPDF_TextPage::CheckMarkedContentObject(FX_INT32& start, FX_INT32& nCount) const\n{\n    PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start);\n    PAGECHAR_INFO charinfo2 = *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - 1);\n    if (FPDFTEXT_CHAR_PIECE != charinfo.m_Flag && FPDFTEXT_CHAR_PIECE != charinfo2.m_Flag) {\n        return;\n    }\n    if (FPDFTEXT_CHAR_PIECE == charinfo.m_Flag) {\n        PAGECHAR_INFO charinfo1 = charinfo;\n        int startIndex = start;\n        while(FPDFTEXT_CHAR_PIECE == charinfo1.m_Flag && charinfo1.m_Index == charinfo.m_Index) {\n            startIndex--;\n            if (startIndex < 0)\t{\n                break;\n            }\n            charinfo1 = *(PAGECHAR_INFO*)m_charList.GetAt(startIndex);\n        }\n        startIndex++;\n        start = startIndex;\n    }\n    if (FPDFTEXT_CHAR_PIECE == charinfo2.m_Flag) {\n        PAGECHAR_INFO charinfo3 = charinfo2;\n        int endIndex = start + nCount - 1;\n        while(FPDFTEXT_CHAR_PIECE == charinfo3.m_Flag && charinfo3.m_Index == charinfo2.m_Index) {\n            endIndex++;\n            if (endIndex >= m_charList.GetSize())\t{\n                break;\n            }\n            charinfo3 = *(PAGECHAR_INFO*)m_charList.GetAt(endIndex);\n        }\n        endIndex--;\n        nCount = endIndex - start + 1;\n    }\n}\nCFX_WideString CPDF_TextPage::GetPageText(int start , int nCount) const\n{\n    if (!m_IsParsered || nCount == 0) {\n        return L\"\";\n    }\n    if (start < 0) {\n        start = 0;\n    }\n    if\t(nCount == -1) {\n        nCount = m_charList.GetSize() - start;\n        return m_TextBuf.GetWideString().Mid(start, m_TextBuf.GetWideString().GetLength());\n    }\n    if(nCount <= 0 || m_charList.GetSize() <= 0) {\n        return L\"\";\n    }\n    if(nCount + start > m_charList.GetSize() - 1) {\n        nCount = m_charList.GetSize() - start;\n    }\n    if (nCount <= 0) {\n        return L\"\";\n    }\n    CheckMarkedContentObject(start, nCount);\n    int startindex = 0;\n    PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start);\n    int startOffset = 0;\n    while(charinfo.m_Index == -1) {\n        startOffset++;\n        if (startOffset > nCount || start + startOffset >= m_charList.GetSize())\t{\n            return L\"\";\n        }\n        charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start + startOffset);\n    }\n    startindex = charinfo.m_Index;\n    charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - 1);\n    int nCountOffset = 0;\n    while (charinfo.m_Index == -1) {\n        nCountOffset++;\n        if (nCountOffset >= nCount) {\n            return L\"\";\n        }\n        charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - nCountOffset - 1);\n    }\n    nCount = start + nCount - nCountOffset - startindex;\n    if(nCount <= 0) {\n        return L\"\";\n    }\n    return m_TextBuf.GetWideString().Mid(startindex, nCount);\n}\nint CPDF_TextPage::CountRects(int start, int nCount)\n{\n    if(m_ParseOptions.m_bGetCharCodeOnly) {\n        return -1;\n    }\n    if (!m_IsParsered)\t{\n        return -1;\n    }\n    if (start < 0) {\n        return -1;\n    }\n    if (nCount == -1 || nCount + start > m_charList.GetSize() ) {\n        nCount = m_charList.GetSize() - start;\n    }\n    m_SelRects.RemoveAll();\n    GetRectArray(start, nCount, m_SelRects);\n    return m_SelRects.GetSize();\n}\nvoid CPDF_TextPage::GetRect(int rectIndex, FX_FLOAT& left, FX_FLOAT& top, FX_FLOAT& right, FX_FLOAT &bottom) const\n{\n    if(m_ParseOptions.m_bGetCharCodeOnly) {\n        return ;\n    }\n    if (!m_IsParsered || rectIndex < 0 || rectIndex >= m_SelRects.GetSize()) {\n        return;\n    }\n    left = m_SelRects.GetAt(rectIndex).left;\n    top = m_SelRects.GetAt(rectIndex).top;\n    right = m_SelRects.GetAt(rectIndex).right;\n    bottom = m_SelRects.GetAt(rectIndex).bottom;\n}\nFX_BOOL CPDF_TextPage::GetBaselineRotate(int start, int end, int& Rotate)\n{\n    if(m_ParseOptions.m_bGetCharCodeOnly) {\n        return FALSE;\n    }\n    if(end == start) {\n        return FALSE;\n    }\n    FX_FLOAT dx, dy;\n    FPDF_CHAR_INFO info1, info2;\n    GetCharInfo(start, info1);\n    GetCharInfo(end, info2);\n    while(info2.m_CharBox.Width() == 0 || info2.m_CharBox.Height() == 0) {\n        end--;\n        if(end <= start) {\n            return FALSE;\n        }\n        GetCharInfo(end, info2);\n    }\n    dx = (info2.m_OriginX - info1.m_OriginX);\n    dy = (info2.m_OriginY - info1.m_OriginY);\n    if(dx == 0) {\n        if(dy > 0) {\n            Rotate = 90;\n        } else if (dy < 0) {\n            Rotate = 270;\n        } else {\n            Rotate = 0;\n        }\n    } else {\n        float a = FXSYS_atan2(dy, dx);\n        Rotate = (int)(a * 180 / FX_PI + 0.5);\n    }\n    if(Rotate < 0) {\n        Rotate = -Rotate;\n    } else if(Rotate > 0) {\n        Rotate = 360 - Rotate;\n    }\n    return TRUE;\n}\nFX_BOOL\tCPDF_TextPage::GetBaselineRotate(CFX_FloatRect rect , int& Rotate)\n{\n    if(m_ParseOptions.m_bGetCharCodeOnly) {\n        return FALSE;\n    }\n    int start, end, count, n = CountBoundedSegments(rect.left, rect.top, rect.right, rect.bottom, TRUE);\n    if(n < 1) {\n        return FALSE;\n    }\n    if(n > 1) {\n        GetBoundedSegment(n - 1, start, count);\n        end = start + count - 1;\n        GetBoundedSegment(0, start, count);\n    } else {\n        GetBoundedSegment(0, start, count);\n        end = start + count - 1;\n    }\n    return GetBaselineRotate(start, end, Rotate);\n}\nFX_BOOL\tCPDF_TextPage::GetBaselineRotate(int rectIndex, int& Rotate)\n{\n    if(m_ParseOptions.m_bGetCharCodeOnly) {\n        return FALSE;\n    }\n    if (!m_IsParsered || rectIndex < 0 || rectIndex > m_SelRects.GetSize()) {\n        return FALSE;\n    }\n    CFX_FloatRect rect = m_SelRects.GetAt(rectIndex);\n    return GetBaselineRotate(rect , Rotate);\n}\nint\tCPDF_TextPage::CountBoundedSegments(FX_FLOAT left, FX_FLOAT top, FX_FLOAT right, FX_FLOAT bottom, FX_BOOL bContains )\n{\n    if(m_ParseOptions.m_bGetCharCodeOnly) {\n        return -1;\n    }\n    m_Segment.RemoveAll();\n    if (!m_IsParsered)\t{\n        return -1;\n    }\n    CFX_FloatRect rect(left, bottom, right, top);\n    rect.Normalize();\n    int nCount = m_charList.GetSize();\n    int pos = 0;\n    FPDF_SEGMENT\tsegment;\n    segment.m_Start = 0;\n    segment.m_nCount = 0;\n    FX_BOOL\t\tsegmentStatus = 0;\n    FX_BOOL\t\tIsContainPreChar = FALSE;\n    while (pos < nCount) {\n        if(pos == 493) {\n            int a = 0;\n        }\n        PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(pos);\n        if(bContains && rect.Contains(charinfo.m_CharBox)) {\n            if (segmentStatus == 0 || segmentStatus == 2) {\n                segment.m_Start = pos;\n                segment.m_nCount = 1;\n                segmentStatus = 1;\n            } else if (segmentStatus == 1) {\n                segment.m_nCount++;\n            }\n            IsContainPreChar = TRUE;\n        } else if (!bContains && (IsRectIntersect(rect, charinfo.m_CharBox) || rect.Contains(charinfo.m_OriginX, charinfo.m_OriginY))) {\n            if (segmentStatus == 0 || segmentStatus == 2) {\n                segment.m_Start = pos;\n                segment.m_nCount = 1;\n                segmentStatus = 1;\n            } else if (segmentStatus == 1) {\n                segment.m_nCount++;\n            }\n            IsContainPreChar = TRUE;\n        } else if (charinfo.m_Unicode == 32) {\n            if (IsContainPreChar == TRUE) {\n                if (segmentStatus == 0 || segmentStatus == 2) {\n                    segment.m_Start = pos;\n                    segment.m_nCount = 1;\n                    segmentStatus = 1;\n                } else if (segmentStatus == 1) {\n                    segment.m_nCount++;\n                }\n                IsContainPreChar = FALSE;\n            } else {\n                if (segmentStatus == 1) {\n                    segmentStatus = 2;\n                    m_Segment.Add(segment);\n                    segment.m_Start = 0;\n                    segment.m_nCount = 0;\n                }\n            }\n        } else {\n            if (segmentStatus == 1) {\n                segmentStatus = 2;\n                m_Segment.Add(segment);\n                segment.m_Start = 0;\n                segment.m_nCount = 0;\n            }\n            IsContainPreChar = FALSE;\n        }\n        pos++;\n    }\n    if (segmentStatus == 1) {\n        segmentStatus = 2;\n        m_Segment.Add(segment);\n        segment.m_Start = 0;\n        segment.m_nCount = 0;\n    }\n    return m_Segment.GetSize();\n}\nvoid CPDF_TextPage::GetBoundedSegment(int index, int& start, int& count) const\n{\n    if(m_ParseOptions.m_bGetCharCodeOnly) {\n        return ;\n    }\n    if (index < 0 || index >= m_Segment.GetSize()) {\n        return;\n    }\n    start = m_Segment.GetAt(index).m_Start;\n    count = m_Segment.GetAt(index).m_nCount;\n}\nint CPDF_TextPage::GetWordBreak(int index, int direction) const\n{\n    if(m_ParseOptions.m_bGetCharCodeOnly) {\n        return -1;\n    }\n    if (!m_IsParsered)\t{\n        return -1;\n    }\n    if (direction != FPDFTEXT_LEFT && direction != FPDFTEXT_RIGHT) {\n        return -1;\n    }\n    if (index < 0 || index >= m_charList.GetSize()) {\n        return -1;\n    }\n    PAGECHAR_INFO charinfo;\n    charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);\n    if (charinfo.m_Index == -1 || charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED)\t{\n        return index;\n    }\n    if (!IsLetter(charinfo.m_Unicode)) {\n        return index;\n    }\n    int breakPos = index;\n    if (direction == FPDFTEXT_LEFT) {\n        while (--breakPos > 0) {\n            charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(breakPos);\n            if (!IsLetter(charinfo.m_Unicode)) {\n                return breakPos;\n            }\n        }\n        return breakPos;\n    } else if (direction == FPDFTEXT_RIGHT) {\n        while (++breakPos < m_charList.GetSize()) {\n            charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(breakPos);\n            if (!IsLetter(charinfo.m_Unicode)) {\n                return breakPos;\n            }\n        }\n        return breakPos;\n    }\n    return breakPos;\n}\nFX_INT32 CPDF_TextPage::FindTextlineFlowDirection()\n{\n    if (!m_pPage)\t{\n        return -1;\n    }\n    const FX_INT32 nPageWidth = (FX_INT32)((CPDF_Page*)m_pPage)->GetPageWidth();\n    const FX_INT32 nPageHeight = (FX_INT32)((CPDF_Page*)m_pPage)->GetPageHeight();\n    CFX_ByteArray nHorizontalMask;\n    if (!nHorizontalMask.SetSize(nPageWidth)) {\n        return -1;\n    }\n    FX_BYTE* pDataH = nHorizontalMask.GetData();\n    CFX_ByteArray nVerticalMask;\n    if (!nVerticalMask.SetSize(nPageHeight)) {\n        return -1;\n    }\n    FX_BYTE* pDataV = nVerticalMask.GetData();\n    FX_INT32 index = 0;\n    FX_FLOAT fLineHeight = 0.0f;\n    CPDF_PageObject* pPageObj = NULL;\n    FX_POSITION\tpos = NULL;\n    pos = m_pPage->GetFirstObjectPosition();\n    if(!pos) {\n        return -1;\n    }\n    while(pos) {\n        pPageObj = m_pPage->GetNextObject(pos);\n        if(NULL == pPageObj) {\n            continue;\n        }\n        if(PDFPAGE_TEXT != pPageObj->m_Type) {\n            continue;\n        }\n        FX_INT32 minH = (FX_INT32)pPageObj->m_Left < 0 ? 0 : (FX_INT32)pPageObj->m_Left;\n        FX_INT32 maxH = (FX_INT32)pPageObj->m_Right > nPageWidth ? nPageWidth : (FX_INT32)pPageObj->m_Right;\n        FX_INT32 minV = (FX_INT32)pPageObj->m_Bottom < 0 ? 0 : (FX_INT32)pPageObj->m_Bottom;\n        FX_INT32 maxV = (FX_INT32)pPageObj->m_Top > nPageHeight ? nPageHeight : (FX_INT32)pPageObj->m_Top;\n        if (minH >= maxH || minV >= maxV) {\n            continue;\n        }\n        FXSYS_memset8(pDataH + minH, 1, maxH - minH);\n        FXSYS_memset8(pDataV + minV, 1, maxV - minV);\n        if (fLineHeight <= 0.0f) {\n            fLineHeight = pPageObj->m_Top - pPageObj->m_Bottom;\n        }\n        pPageObj = NULL;\n    }\n    FX_INT32 nStartH = 0;\n    FX_INT32 nEndH = 0;\n    FX_FLOAT nSumH = 0.0f;\n    for (index = 0; index < nPageWidth; index++)\n        if(1 == nHorizontalMask[index]) {\n            break;\n        }\n    nStartH = index;\n    for (index = nPageWidth; index > 0; index--)\n        if(1 == nHorizontalMask[index - 1]) {\n            break;\n        }\n    nEndH = index;\n    for (index = nStartH; index < nEndH; index++) {\n        nSumH += nHorizontalMask[index];\n    }\n    nSumH /= nEndH - nStartH;\n    FX_INT32 nStartV = 0;\n    FX_INT32 nEndV = 0;\n    FX_FLOAT nSumV = 0.0f;\n    for (index = 0; index < nPageHeight; index++)\n        if(1 == nVerticalMask[index]) {\n            break;\n        }\n    nStartV = index;\n    for (index = nPageHeight; index > 0; index--)\n        if(1 == nVerticalMask[index - 1]) {\n            break;\n        }\n    nEndV = index;\n    for (index = nStartV; index < nEndV; index++) {\n        nSumV += nVerticalMask[index];\n    }\n    nSumV /= nEndV - nStartV;\n    if ((nEndV - nStartV) < (FX_INT32)(2 * fLineHeight)) {\n        return 0;\n    }\n    if ((nEndH - nStartH) < (FX_INT32)(2 * fLineHeight)) {\n        return 1;\n    }\n    if (nSumH > 0.8f) {\n        return 0;\n    }\n    if (nSumH - nSumV > 0.0f) {\n        return 0;\n    }\n    if (nSumV - nSumH > 0.0f) {\n        return 1;\n    }\n    return -1;\n}\nvoid CPDF_TextPage::ProcessObject()\n{\n    CPDF_PageObject*\tpPageObj = NULL;\n    if (!m_pPage)\t{\n        return;\n    }\n    FX_POSITION\tpos;\n    pos = m_pPage->GetFirstObjectPosition();\n    if (!pos)\t{\n        return;\n    }\n    m_TextlineDir = FindTextlineFlowDirection();\n    int nCount = 0;\n    while (pos) {\n        pPageObj = m_pPage->GetNextObject(pos);\n        if(pPageObj) {\n            if(pPageObj->m_Type == PDFPAGE_TEXT) {\n                if (nCount == 3) {\n                    nCount = nCount;\n                }\n                CFX_AffineMatrix matrix;\n                ProcessTextObject((CPDF_TextObject*)pPageObj, matrix, pos);\n                nCount++;\n            } else if (pPageObj->m_Type == PDFPAGE_FORM) {\n                CFX_AffineMatrix formMatrix(1, 0, 0, 1, 0, 0);\n                ProcessFormObject((CPDF_FormObject*)pPageObj, formMatrix);\n            }\n        }\n        pPageObj = NULL;\n    }\n    int count = m_LineObj.GetSize();\n    for(int i = 0; i < count; i++) {\n        ProcessTextObject(m_LineObj.GetAt(i));\n    }\n    m_LineObj.RemoveAll();\n    CloseTempLine();\n}\nvoid CPDF_TextPage::ProcessFormObject(CPDF_FormObject* pFormObj, CFX_AffineMatrix formMatrix)\n{\n    CPDF_PageObject*\tpPageObj = NULL;\n    FX_POSITION\tpos;\n    if (!pFormObj)\t{\n        return;\n    }\n    pos = pFormObj->m_pForm->GetFirstObjectPosition();\n    if (!pos)\t{\n        return;\n    }\n    CFX_AffineMatrix curFormMatrix;\n    curFormMatrix.Copy(pFormObj->m_FormMatrix);\n    curFormMatrix.Concat(formMatrix);\n    while (pos) {\n        pPageObj = pFormObj->m_pForm->GetNextObject(pos);\n        if(pPageObj) {\n            if(pPageObj->m_Type == PDFPAGE_TEXT) {\n                ProcessTextObject((CPDF_TextObject*)pPageObj, curFormMatrix, pos);\n            } else if (pPageObj->m_Type == PDFPAGE_FORM) {\n                ProcessFormObject((CPDF_FormObject*)pPageObj, curFormMatrix);\n            }\n        }\n        pPageObj = NULL;\n    }\n}\nint CPDF_TextPage::GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const\n{\n    if(charCode == -1) {\n        return 0;\n    }\n    int w = pFont->GetCharWidthF(charCode);\n    if(w == 0) {\n        CFX_ByteString str;\n        pFont->AppendChar(str, charCode);\n        w = pFont->GetStringWidth(str, 1);\n        if(w == 0) {\n            FX_RECT BBox;\n            pFont->GetCharBBox(charCode, BBox);\n            w = BBox.right - BBox.left;\n        }\n    }\n    return w;\n}\nvoid CPDF_TextPage::OnPiece(IFX_BidiChar* pBidi, CFX_WideString& str)\n{\n    FX_INT32 start, count;\n    FX_INT32 ret = pBidi->GetBidiInfo(start, count);\n    if(ret == 2) {\n        for(int i = start + count - 1; i >= start; i--) {\n            m_TextBuf.AppendChar(str.GetAt(i));\n            m_charList.Add(*(PAGECHAR_INFO*)m_TempCharList.GetAt(i));\n        }\n    } else {\n        int end = start + count ;\n        for(int i = start; i < end; i++) {\n            m_TextBuf.AppendChar(str.GetAt(i));\n            m_charList.Add(*(PAGECHAR_INFO*)m_TempCharList.GetAt(i));\n        }\n    }\n}\nvoid CPDF_TextPage::AddCharInfoByLRDirection(CFX_WideString& str, int i)\n{\n    PAGECHAR_INFO Info = *(PAGECHAR_INFO*)m_TempCharList.GetAt(i);\n    FX_WCHAR wChar = str.GetAt(i);\n#ifdef FOXIT_CHROME_BUILD\n    if(!IsControlChar(&Info)) {\n#else\n    if(wChar != 0xfffe) {\n#endif\n        Info.m_Index = m_TextBuf.GetLength();\n        if (wChar >= 0xFB00 && wChar <= 0xFB06) {\n            FX_LPWSTR pDst = NULL;\n            FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst);\n            if (nCount >= 1) {\n                pDst = FX_Alloc(FX_WCHAR, nCount);\n                if (!pDst) {\n                    return;\n                }\n                FX_Unicode_GetNormalization(wChar, pDst);\n                for (int nIndex = 0; nIndex < nCount; nIndex++) {\n                    PAGECHAR_INFO Info2 = Info;\n                    Info2.m_Unicode = pDst[nIndex];\n                    Info2.m_Flag = FPDFTEXT_CHAR_PIECE;\n                    m_TextBuf.AppendChar(Info2.m_Unicode);\n                    if( !m_ParseOptions.m_bGetCharCodeOnly) {\n                        m_charList.Add(Info2);\n                    }\n                }\n                FX_Free(pDst);\n                return;\n            }\n        }\n        m_TextBuf.AppendChar(wChar);\n    } else {\n        Info.m_Index = -1;\n    }\n    if( !m_ParseOptions.m_bGetCharCodeOnly) {\n        m_charList.Add(Info);\n    }\n}\nvoid CPDF_TextPage::AddCharInfoByRLDirection(CFX_WideString& str, int i)\n{\n    PAGECHAR_INFO Info = *(PAGECHAR_INFO*)m_TempCharList.GetAt(i);\n#ifdef FOXIT_CHROME_BUILD\n    if(!IsControlChar(&Info)) {\n#else\n    if(str.GetAt(i) != 0xfffe) {\n#endif\n        Info.m_Index = m_TextBuf.GetLength();\n        FX_WCHAR wChar = FX_GetMirrorChar(str.GetAt(i), TRUE, FALSE);\n        FX_LPWSTR pDst = NULL;\n        FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst);\n        if (nCount >= 1) {\n            pDst = FX_Alloc(FX_WCHAR, nCount);\n            if (!pDst) {\n                return;\n            }\n            FX_Unicode_GetNormalization(wChar, pDst);\n            for (int nIndex = 0; nIndex < nCount; nIndex++) {\n                PAGECHAR_INFO Info2 = Info;\n                Info2.m_Unicode = pDst[nIndex];\n                Info2.m_Flag = FPDFTEXT_CHAR_PIECE;\n                m_TextBuf.AppendChar(Info2.m_Unicode);\n                if( !m_ParseOptions.m_bGetCharCodeOnly) {\n                    m_charList.Add(Info2);\n                }\n            }\n            FX_Free(pDst);\n            return;\n        } else {\n            Info.m_Unicode = wChar;\n        }\n        m_TextBuf.AppendChar(Info.m_Unicode);\n    } else {\n        Info.m_Index = -1;\n    }\n    if( !m_ParseOptions.m_bGetCharCodeOnly) {\n        m_charList.Add(Info);\n    }\n}\nvoid CPDF_TextPage::CloseTempLine()\n{\n    int count1 = m_TempCharList.GetSize();\n    if (count1 <= 0) {\n        return;\n    }\n    IFX_BidiChar* BidiChar = IFX_BidiChar::Create();\n    CFX_WideString str = m_TempTextBuf.GetWideString();\n    CFX_WordArray order;\n    FX_BOOL bR2L = FALSE;\n    FX_INT32 start = 0, count = 0, i = 0;\n    int nR2L = 0, nL2R = 0;\n    FX_BOOL bPrevSpace = FALSE;\n    for (i = 0; i < str.GetLength(); i++) {\n        if(str.GetAt(i) == 32) {\n            if(bPrevSpace) {\n                m_TempTextBuf.Delete(i, 1);\n                m_TempCharList.Delete(i);\n                str.Delete(i);\n                count1 --;\n                i--;\n                continue;\n            }\n            bPrevSpace = TRUE;\n        } else {\n            bPrevSpace = FALSE;\n        }\n        if(BidiChar && BidiChar->AppendChar(str.GetAt(i))) {\n            FX_INT32 ret = BidiChar->GetBidiInfo(start, count);\n            order.Add(start);\n            order.Add(count);\n            order.Add(ret);\n            if(!bR2L) {\n                if(ret == 2) {\n                    nR2L++;\n                } else if (ret == 1) {\n                    nL2R++;\n                }\n            }\n        }\n    }\n    if(BidiChar && BidiChar->EndChar()) {\n        FX_INT32 ret = BidiChar->GetBidiInfo(start, count);\n        order.Add(start);\n        order.Add(count);\n        order.Add(ret);\n        if(!bR2L) {\n            if(ret == 2) {\n                nR2L++;\n            } else if(ret == 1) {\n                nL2R++;\n            }\n        }\n    }\n    if(nR2L > 0 && nR2L >= nL2R) {\n        bR2L = TRUE;\n    }\n    if(this->m_parserflag == FPDFTEXT_RLTB || bR2L) {\n        int count = order.GetSize();\n        for(int j = count - 1; j > 0; j -= 3) {\n            int ret = order.GetAt(j);\n            int start = order.GetAt(j - 2);\n            int count1 = order.GetAt(j - 1);\n            if(ret == 2 || ret == 0) {\n                for(int i = start + count1 - 1; i >= start; i--) {\n                    AddCharInfoByRLDirection(str, i);\n                }\n            } else {\n                i = j;\n                FX_BOOL bSymbol = FALSE;\n                while(i > 0 && order.GetAt(i) != 2) {\n                    bSymbol = !order.GetAt(i);\n                    i -= 3;\n                }\n                int end = start + count1 ;\n                int n = 0;\n                if(bSymbol) {\n                    n = i + 6;\n                } else {\n                    n = i + 3;\n                }\n                if(n >= j) {\n                    for(int m = start; m < end; m++) {\n                        AddCharInfoByLRDirection(str, m);\n                    }\n                } else {\n                    i = j;\n                    j = n;\n                    for(; n <= i; n += 3) {\n                        int ret = order.GetAt(n);\n                        int start = order.GetAt(n - 2);\n                        int count1 = order.GetAt(n - 1);\n                        int end = start + count1 ;\n                        for(int m = start; m < end; m++) {\n                            AddCharInfoByLRDirection(str, m);\n                        }\n                    }\n                }\n            }\n        }\n    } else {\n        int count = order.GetSize();\n        FX_BOOL bL2R = FALSE;\n        for(int j = 0; j < count; j += 3) {\n            int ret = order.GetAt(j + 2);\n            int start = order.GetAt(j);\n            int count1 = order.GetAt(j + 1);\n            if(ret == 2 || (j == 0 && ret == 0 && !bL2R)) {\n                int i = j + 3;\n                while(bR2L && i < count) {\n                    if(order.GetAt(i + 2) == 1) {\n                        break;\n                    } else {\n                        i += 3;\n                    }\n                }\n                if(i == 3) {\n                    j = -3;\n                    bL2R = TRUE;\n                    continue;\n                }\n                int end = m_TempCharList.GetSize() - 1;\n                if(i < count) {\n                    end = order.GetAt(i) - 1;\n                }\n                j = i - 3;\n                for(int n = end; n >= start; n--) {\n                    AddCharInfoByRLDirection(str, n);\n                }\n            } else {\n                int end = start + count1 ;\n                for(int i = start; i < end; i++) {\n                    AddCharInfoByLRDirection(str, i);\n                }\n            }\n        }\n    }\n    int ntext = m_TextBuf.GetSize();\n    ntext = m_charList.GetSize();\n    order.RemoveAll();\n    m_TempCharList.RemoveAll();\n    m_TempTextBuf.Delete(0, m_TempTextBuf.GetLength());\n    BidiChar->Release();\n}\nvoid CPDF_TextPage::ProcessTextObject(CPDF_TextObject*\tpTextObj, CFX_AffineMatrix formMatrix, FX_POSITION ObjPos)\n{\n    CFX_FloatRect re(pTextObj->m_Left, pTextObj->m_Bottom, pTextObj->m_Right, pTextObj->m_Top);\n    if(FXSYS_fabs(pTextObj->m_Right - pTextObj->m_Left) < 0.01f ) {\n        return;\n    }\n    int count = m_LineObj.GetSize();\n    PDFTEXT_Obj Obj;\n    Obj.m_pTextObj = pTextObj;\n    Obj.m_formMatrix = formMatrix;\n    if(count == 0) {\n        m_LineObj.Add(Obj);\n        return;\n    }\n    if (IsSameAsPreTextObject(pTextObj, ObjPos)) {\n        return;\n    }\n    PDFTEXT_Obj prev_Obj = m_LineObj.GetAt(count - 1);\n    CPDF_TextObjectItem item;\n    int nItem = prev_Obj.m_pTextObj->CountItems();\n    prev_Obj.m_pTextObj->GetItemInfo(nItem - 1, &item);\n    FX_FLOAT prev_width = GetCharWidth(item.m_CharCode, prev_Obj.m_pTextObj->GetFont()) * prev_Obj.m_pTextObj->GetFontSize() / 1000;\n    CFX_AffineMatrix prev_matrix;\n    prev_Obj.m_pTextObj->GetTextMatrix(&prev_matrix);\n    prev_width = FXSYS_fabs(prev_width);\n    prev_matrix.Concat(prev_Obj.m_formMatrix);\n    prev_width = prev_matrix.TransformDistance(prev_width);\n    pTextObj->GetItemInfo(0, &item);\n    FX_FLOAT this_width = GetCharWidth(item.m_CharCode, pTextObj->GetFont()) * pTextObj->GetFontSize() / 1000;\n    this_width = FXSYS_fabs(this_width);\n    CFX_AffineMatrix this_matrix;\n    pTextObj->GetTextMatrix(&this_matrix);\n    this_width = FXSYS_fabs(this_width);\n    this_matrix.Concat(formMatrix);\n    this_width = this_matrix.TransformDistance(this_width);\n    FX_FLOAT threshold = prev_width > this_width ? prev_width / 4 : this_width / 4;\n    FX_FLOAT prev_x = prev_Obj.m_pTextObj->GetPosX(), prev_y = prev_Obj.m_pTextObj->GetPosY();\n    prev_Obj.m_formMatrix.Transform(prev_x, prev_y);\n    m_DisplayMatrix.Transform(prev_x, prev_y);\n    FX_FLOAT this_x = pTextObj->GetPosX(), this_y = pTextObj->GetPosY();\n    formMatrix.Transform(this_x, this_y);\n    m_DisplayMatrix.Transform(this_x, this_y);\n    if (FXSYS_fabs(this_y - prev_y) > threshold * 2) {\n        for(int i = 0; i < count; i++) {\n            ProcessTextObject(m_LineObj.GetAt(i));\n        }\n        m_LineObj.RemoveAll();\n        m_LineObj.Add(Obj);\n        return;\n    }\n    int i = 0;\n    if(m_ParseOptions.m_bNormalizeObjs) {\n        for(i = count - 1; i >= 0; i--) {\n            PDFTEXT_Obj prev_Obj = m_LineObj.GetAt(i);\n            CFX_AffineMatrix prev_matrix;\n            prev_Obj.m_pTextObj->GetTextMatrix(&prev_matrix);\n            FX_FLOAT Prev_x = prev_Obj.m_pTextObj->GetPosX(), Prev_y = prev_Obj.m_pTextObj->GetPosY();\n            prev_Obj.m_formMatrix.Transform(Prev_x, Prev_y);\n            m_DisplayMatrix.Transform(Prev_x, Prev_y);\n            if(this_x >= Prev_x) {\n                if(i == count - 1) {\n                    m_LineObj.Add(Obj);\n                } else {\n                    m_LineObj.InsertAt(i + 1, Obj);\n                }\n                break;\n            }\n        }\n        if(i < 0) {\n            m_LineObj.InsertAt(0, Obj);\n        }\n    } else {\n        m_LineObj.Add(Obj);\n    }\n}\nFX_INT32 CPDF_TextPage::PreMarkedContent(PDFTEXT_Obj Obj)\n{\n    CPDF_TextObject* pTextObj = Obj.m_pTextObj;\n    CPDF_ContentMarkData* pMarkData = (CPDF_ContentMarkData*)pTextObj->m_ContentMark.GetObject();\n    if(!pMarkData) {\n        return FPDFTEXT_MC_PASS;\n    }\n    int nContentMark = pMarkData->CountItems();\n    if (nContentMark < 1) {\n        return FPDFTEXT_MC_PASS;\n    }\n    CFX_WideString actText;\n    FX_BOOL bExist = FALSE;\n    CPDF_Dictionary* pDict = NULL;\n    int n = 0;\n    for (n = 0; n < nContentMark; n++) {\n        CPDF_ContentMarkItem& item = pMarkData->GetItem(n);\n        CFX_ByteString tagStr = (CFX_ByteString)item.GetName();\n        pDict = (CPDF_Dictionary*)item.GetParam();\n        CPDF_String* temp = (CPDF_String*)(pDict ? pDict->GetElement(FX_BSTRC(\"ActualText\")) : NULL);\n        if (temp) {\n            bExist = TRUE;\n            actText = temp->GetUnicodeText();\n        }\n    }\n    if (!bExist) {\n        return FPDFTEXT_MC_PASS;\n    }\n    if (m_pPreTextObj) {\n        if (CPDF_ContentMarkData* pPreMarkData = (CPDF_ContentMarkData*)m_pPreTextObj->m_ContentMark.GetObject()) {\n            if (pPreMarkData->CountItems() == n) {\n                CPDF_ContentMarkItem& item = pPreMarkData->GetItem(n - 1);\n                if (pDict == item.GetParam()) {\n                    return FPDFTEXT_MC_DONE;\n                }\n            }\n        }\n    }\n    CPDF_Font*\tpFont = pTextObj->GetFont();\n    FX_STRSIZE nItems = actText.GetLength();\n    if (nItems < 1) {\n        return FPDFTEXT_MC_PASS;\n    }\n    bExist = FALSE;\n    for (FX_STRSIZE i = 0; i < nItems; i++) {\n        FX_WCHAR wChar = actText.GetAt(i);\n        if (-1 == pFont->CharCodeFromUnicode(wChar)) {\n            continue;\n        } else {\n            bExist = TRUE;\n            break;\n        }\n    }\n    if (!bExist) {\n        return FPDFTEXT_MC_PASS;\n    }\n    bExist = FALSE;\n    for (FX_STRSIZE j = 0; j < nItems; j++) {\n        FX_WCHAR wChar = actText.GetAt(j);\n        if ((wChar > 0x80 && wChar < 0xFFFD) || (wChar <= 0x80 && isprint(wChar))) {\n            bExist = TRUE;\n            break;\n        }\n    }\n    if (!bExist) {\n        return FPDFTEXT_MC_DONE;\n    }\n    return FPDFTEXT_MC_DELAY;\n}\nvoid CPDF_TextPage::ProcessMarkedContent(PDFTEXT_Obj Obj)\n{\n    CPDF_TextObject* pTextObj = Obj.m_pTextObj;\n    CPDF_ContentMarkData* pMarkData = (CPDF_ContentMarkData*)pTextObj->m_ContentMark.GetObject();\n    if(!pMarkData) {\n        return;\n    }\n    int nContentMark = pMarkData->CountItems();\n    if (nContentMark < 1) {\n        return;\n    }\n    CFX_WideString actText;\n    CPDF_Dictionary* pDict = NULL;\n    int n = 0;\n    for (n = 0; n < nContentMark; n++) {\n        CPDF_ContentMarkItem& item = pMarkData->GetItem(n);\n        CFX_ByteString tagStr = (CFX_ByteString)item.GetName();\n        pDict = (CPDF_Dictionary*)item.GetParam();\n        CPDF_String* temp = (CPDF_String*)pDict->GetElement(FX_BSTRC(\"ActualText\"));\n        if (temp) {\n            actText = temp->GetUnicodeText();\n        }\n    }\n    FX_STRSIZE nItems = actText.GetLength();\n    if (nItems < 1) {\n        return;\n    }\n    CPDF_Font*\tpFont = pTextObj->GetFont();\n    CFX_AffineMatrix formMatrix = Obj.m_formMatrix;\n    CFX_AffineMatrix matrix;\n    pTextObj->GetTextMatrix(&matrix);\n    matrix.Concat(formMatrix);\n    FX_FLOAT fPosX = pTextObj->GetPosX();\n    FX_FLOAT fPosY = pTextObj->GetPosY();\n    int nCharInfoIndex = m_TextBuf.GetLength();\n    CFX_FloatRect charBox;\n    charBox.top = pTextObj->m_Top;\n    charBox.left = pTextObj->m_Left;\n    charBox.right = pTextObj->m_Right;\n    charBox.bottom = pTextObj->m_Bottom;\n    for (FX_STRSIZE k = 0; k < nItems; k++) {\n        FX_WCHAR wChar = actText.GetAt(k);\n        if (wChar <= 0x80 && !isprint(wChar)) {\n            wChar = 0x20;\n        }\n        if (wChar >= 0xFFFD) {\n            continue;\n        }\n        PAGECHAR_INFO charinfo;\n        charinfo.m_OriginX = fPosX;\n        charinfo.m_OriginY = fPosY;\n        charinfo.m_Index = nCharInfoIndex;\n        charinfo.m_Unicode = wChar;\n        charinfo.m_CharCode = pFont->CharCodeFromUnicode(wChar);\n        charinfo.m_Flag = FPDFTEXT_CHAR_PIECE;\n        charinfo.m_pTextObj = pTextObj;\n        charinfo.m_CharBox.top = charBox.top;\n        charinfo.m_CharBox.left = charBox.left;\n        charinfo.m_CharBox.right = charBox.right;\n        charinfo.m_CharBox.bottom = charBox.bottom;\n        charinfo.m_Matrix.Copy(matrix);\n        m_TempTextBuf.AppendChar(wChar);\n        m_TempCharList.Add(charinfo);\n    }\n}\nvoid CPDF_TextPage::FindPreviousTextObject(void)\n{\n    if (m_TempCharList.GetSize() < 1 && m_charList.GetSize() < 1) {\n        return;\n    }\n    PAGECHAR_INFO preChar;\n    if (m_TempCharList.GetSize() >= 1) {\n        preChar = *(PAGECHAR_INFO*)m_TempCharList.GetAt(m_TempCharList.GetSize() - 1);\n    } else {\n        preChar = *(PAGECHAR_INFO*)m_charList.GetAt(m_charList.GetSize() - 1);\n    }\n    if (preChar.m_pTextObj) {\n        m_pPreTextObj = preChar.m_pTextObj;\n    }\n}\nvoid CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj)\n{\n    CPDF_TextObject* pTextObj = Obj.m_pTextObj;\n    if(FXSYS_fabs(pTextObj->m_Right - pTextObj->m_Left) < 0.01f ) {\n        return;\n    }\n    CFX_AffineMatrix formMatrix = Obj.m_formMatrix;\n    CPDF_Font*\tpFont = pTextObj->GetFont();\n    CFX_AffineMatrix matrix;\n    pTextObj->GetTextMatrix(&matrix);\n    matrix.Concat(formMatrix);\n    FX_INT32 bPreMKC = PreMarkedContent(Obj);\n    if (FPDFTEXT_MC_DONE == bPreMKC) {\n        m_pPreTextObj = pTextObj;\n        m_perMatrix.Copy(formMatrix);\n        return;\n    }\n    int result = 0;\n    if (m_pPreTextObj) {\n        result = ProcessInsertObject(pTextObj, formMatrix);\n        if (2 == result) {\n            m_CurlineRect = CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top);\n        } else {\n            m_CurlineRect.Union(CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top));\n        }\n        PAGECHAR_INFO generateChar;\n        if (result == 1) {\n            if (GenerateCharInfo(TEXT_BLANK_CHAR, generateChar)) {\n                if (!formMatrix.IsIdentity()) {\n                    generateChar.m_Matrix.Copy(formMatrix);\n                }\n                m_TempTextBuf.AppendChar(TEXT_BLANK_CHAR);\n                m_TempCharList.Add(generateChar);\n            }\n        } else if(result == 2) {\n            CloseTempLine();\n            if(m_TextBuf.GetSize()) {\n                if(m_ParseOptions.m_bGetCharCodeOnly) {\n                    m_TextBuf.AppendChar(TEXT_RETURN_CHAR);\n                    m_TextBuf.AppendChar(TEXT_LINEFEED_CHAR);\n                } else {\n                    if(GenerateCharInfo(TEXT_RETURN_CHAR, generateChar)) {\n                        m_TextBuf.AppendChar(TEXT_RETURN_CHAR);\n                        if (!formMatrix.IsIdentity()) {\n                            generateChar.m_Matrix.Copy(formMatrix);\n                        }\n                        m_charList.Add(generateChar);\n                    }\n                    if(GenerateCharInfo(TEXT_LINEFEED_CHAR, generateChar)) {\n                        m_TextBuf.AppendChar(TEXT_LINEFEED_CHAR);\n                        if (!formMatrix.IsIdentity()) {\n                            generateChar.m_Matrix.Copy(formMatrix);\n                        }\n                        m_charList.Add(generateChar);\n                    }\n                }\n            }\n        } else if (result == 3 && !m_ParseOptions.m_bOutputHyphen) {\n            FX_INT32 nChars = pTextObj->CountChars();\n            if (nChars == 1) {\n                CPDF_TextObjectItem item;\n                pTextObj->GetCharInfo(0, &item);\n                CFX_WideString wstrItem = pTextObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);\n                if(wstrItem.IsEmpty()) {\n                    wstrItem += (FX_WCHAR)item.m_CharCode;\n                }\n                FX_WCHAR curChar = wstrItem.GetAt(0);\n                if (0x2D == curChar || 0xAD == curChar) {\n                    return;\n                }\n            }\n            while (m_TempTextBuf.GetSize() > 0 && m_TempTextBuf.GetWideString().GetAt(m_TempTextBuf.GetLength() - 1) == 0x20) {\n                m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1);\n                m_TempCharList.Delete(m_TempCharList.GetSize() - 1);\n            }\n            PAGECHAR_INFO* cha = (PAGECHAR_INFO*)m_TempCharList.GetAt(m_TempCharList.GetSize() - 1);\n            m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1);\n#ifdef FOXIT_CHROME_BUILD\n            cha->m_Unicode = 0x2;\n            cha->m_Flag = FPDFTEXT_CHAR_HYPHEN;\n            m_TempTextBuf.AppendChar(0xfffe);\n#else\n            cha->m_Unicode = 0;\n            m_TempTextBuf.AppendChar(0xfffe);\n#endif\n        }\n    } else {\n        m_CurlineRect = CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top);\n    }\n    if (FPDFTEXT_MC_DELAY == bPreMKC) {\n        ProcessMarkedContent(Obj);\n        m_pPreTextObj = pTextObj;\n        m_perMatrix.Copy(formMatrix);\n        return;\n    }\n    m_pPreTextObj = pTextObj;\n    m_perMatrix.Copy(formMatrix);\n    int nItems = pTextObj->CountItems();\n    FX_FLOAT spacing = 0;\n    FX_FLOAT baseSpace = 0.0;\n    FX_BOOL bAllChar = TRUE;\n    if (pTextObj->m_TextState.GetObject()->m_CharSpace && nItems >= 3) {\n        spacing = matrix.TransformDistance(pTextObj->m_TextState.GetObject()->m_CharSpace);\n        baseSpace = spacing;\n        for (int i = 0; i < nItems; i++) {\n            CPDF_TextObjectItem item;\n            pTextObj->GetItemInfo(i, &item);\n            if (item.m_CharCode == (FX_DWORD) - 1) {\n                FX_FLOAT fontsize_h = pTextObj->m_TextState.GetFontSizeH();\n                FX_FLOAT kerning = -fontsize_h * item.m_OriginX / 1000;\n                if(kerning + spacing < baseSpace) {\n                    baseSpace = kerning + spacing;\n                }\n                bAllChar = FALSE;\n            }\n        }\n        spacing = 0;\n        if(baseSpace < 0.0 || (nItems == 3 && !bAllChar)) {\n            baseSpace = 0.0;\n        }\n    }\n    for (int i = 0; i < nItems; i++) {\n        CPDF_TextObjectItem item;\n        PAGECHAR_INFO charinfo;\n        charinfo.m_OriginX = 0;\n        charinfo.m_OriginY = 0;\n        pTextObj->GetItemInfo(i, &item);\n        if (item.m_CharCode == (FX_DWORD) - 1) {\n            CFX_WideString str = m_TempTextBuf.GetWideString();\n            if(str.IsEmpty()) {\n                str = m_TextBuf.GetWideString();\n            }\n            if (str.IsEmpty() || str.GetAt(str.GetLength() - 1) == TEXT_BLANK_CHAR) {\n                continue;\n            }\n            FX_FLOAT fontsize_h = pTextObj->m_TextState.GetFontSizeH();\n            spacing = -fontsize_h * item.m_OriginX / 1000;\n            continue;\n        }\n        FX_FLOAT charSpace = pTextObj->m_TextState.GetObject()->m_CharSpace;\n        if (charSpace > 0.001) {\n            spacing += matrix.TransformDistance(charSpace);\n        } else if(charSpace < -0.001) {\n            spacing -= matrix.TransformDistance(FXSYS_fabs(charSpace));\n        }\n        spacing -= baseSpace;\n        if (spacing && i > 0) {\n            int last_width = 0;\n            FX_FLOAT fontsize_h = pTextObj->m_TextState.GetFontSizeH();\n            FX_DWORD space_charcode = pFont->CharCodeFromUnicode(' ');\n            FX_FLOAT threshold = 0;\n            if (space_charcode != -1) {\n                threshold = fontsize_h * pFont->GetCharWidthF(space_charcode) / 1000 ;\n            }\n            if (threshold > fontsize_h / 3) {\n                threshold = 0;\n            } else {\n                threshold /= 2;\n            }\n            if (threshold == 0) {\n                threshold = fontsize_h;\n                int this_width = FXSYS_abs(GetCharWidth(item.m_CharCode, pFont));\n                threshold = this_width > last_width ? (FX_FLOAT)this_width : (FX_FLOAT)last_width;\n                int nDivide = 6;\n                if (threshold < 300) {\n                    nDivide = 2;\n                } else if (threshold < 500) {\n                    nDivide = 4;\n                } else if (threshold < 700) {\n                    nDivide = 5;\n                }\n                threshold = threshold / nDivide;\n                threshold = fontsize_h * threshold / 1000;\n            }\n            if (threshold && (spacing && spacing >= threshold) ) {\n                charinfo.m_Unicode = TEXT_BLANK_CHAR;\n                charinfo.m_Flag = FPDFTEXT_CHAR_GENERATED;\n                charinfo.m_pTextObj = pTextObj;\n                charinfo.m_Index = m_TextBuf.GetLength();\n                m_TempTextBuf.AppendChar(TEXT_BLANK_CHAR);\n                charinfo.m_CharCode = -1;\n                charinfo.m_Matrix.Copy(formMatrix);\n                matrix.Transform(item.m_OriginX, item.m_OriginY, charinfo.m_OriginX, charinfo.m_OriginY);\n                charinfo.m_CharBox = CFX_FloatRect(charinfo.m_OriginX, charinfo.m_OriginY, charinfo.m_OriginX, charinfo.m_OriginY);\n                m_TempCharList.Add(charinfo);\n            }\n            if (item.m_CharCode == (FX_DWORD) - 1) {\n                continue;\n            }\n        }\n        spacing = 0;\n        CFX_WideString wstrItem = pFont->UnicodeFromCharCode(item.m_CharCode);\n        FX_BOOL bNoUnicode = FALSE;\n        FX_WCHAR wChar = wstrItem.GetAt(0);\n        if ((wstrItem.IsEmpty() || wChar == 0) && item.m_CharCode) {\n            if(wstrItem.IsEmpty()) {\n                wstrItem += (FX_WCHAR)item.m_CharCode;\n            } else {\n                wstrItem.SetAt(0, (FX_WCHAR)item.m_CharCode);\n            }\n            bNoUnicode = TRUE;\n        }\n        charinfo.m_Index = -1;\n        charinfo.m_CharCode = item.m_CharCode;\n        if(bNoUnicode) {\n            charinfo.m_Flag = FPDFTEXT_CHAR_UNUNICODE;\n        } else {\n            charinfo.m_Flag = FPDFTEXT_CHAR_NORMAL;\n        }\n        charinfo.m_pTextObj = pTextObj;\n        charinfo.m_OriginX = 0, charinfo.m_OriginY = 0;\n        matrix.Transform(item.m_OriginX, item.m_OriginY, charinfo.m_OriginX, charinfo.m_OriginY);\n        FX_RECT rect(0, 0, 0, 0);\n        rect.Intersect(0, 0, 0, 0);\n        charinfo.m_pTextObj->GetFont()->GetCharBBox(charinfo.m_CharCode, rect);\n        charinfo.m_CharBox.top = rect.top * pTextObj->GetFontSize() / 1000 + item.m_OriginY;\n        charinfo.m_CharBox.left = rect.left * pTextObj->GetFontSize() / 1000 + item.m_OriginX;\n        charinfo.m_CharBox.right = rect.right * pTextObj->GetFontSize() / 1000 + item.m_OriginX;\n        charinfo.m_CharBox.bottom = rect.bottom * pTextObj->GetFontSize() / 1000 + item.m_OriginY;\n        if (fabsf(charinfo.m_CharBox.top - charinfo.m_CharBox.bottom) < 0.01f) {\n            charinfo.m_CharBox.top = charinfo.m_CharBox.bottom + pTextObj->GetFontSize();\n        }\n        if (fabsf(charinfo.m_CharBox.right - charinfo.m_CharBox.left) < 0.01f) {\n            charinfo.m_CharBox.right = charinfo.m_CharBox.left + pTextObj->GetCharWidth(charinfo.m_CharCode);\n        }\n        matrix.TransformRect(charinfo.m_CharBox);\n        charinfo.m_Matrix.Copy(matrix);\n        if (wstrItem.IsEmpty()) {\n            charinfo.m_Unicode = 0;\n            m_TempCharList.Add(charinfo);\n            m_TempTextBuf.AppendChar(0xfffe);\n            continue;\n        } else {\n            int nTotal = wstrItem.GetLength();\n            int n = 0;\n            FX_BOOL bDel = FALSE;\n            while (n < m_TempCharList.GetSize() && n < 7) {\n                n++;\n                PAGECHAR_INFO* charinfo1 = (PAGECHAR_INFO*)m_TempCharList.GetAt(m_TempCharList.GetSize() - n);\n                if(charinfo1->m_CharCode == charinfo.m_CharCode &&\n                        charinfo1->m_pTextObj->GetFont() == charinfo.m_pTextObj->GetFont()  &&\n                        FXSYS_fabs(charinfo1->m_OriginX - charinfo.m_OriginX) < TEXT_CHARRATIO_GAPDELTA * pTextObj->GetFontSize()  &&\n                        FXSYS_fabs(charinfo1->m_OriginY - charinfo.m_OriginY) < TEXT_CHARRATIO_GAPDELTA * pTextObj->GetFontSize() ) {\n                    bDel = TRUE;\n                    break;\n                }\n            }\n            if(!bDel) {\n                for (int nIndex = 0; nIndex < nTotal; nIndex++) {\n                    charinfo.m_Unicode = wstrItem.GetAt(nIndex);\n                    if (charinfo.m_Unicode) {\n                        charinfo.m_Index = m_TextBuf.GetLength();\n                        m_TempTextBuf.AppendChar(charinfo.m_Unicode);\n                    } else {\n                        m_TempTextBuf.AppendChar(0xfffe);\n                    }\n                    m_TempCharList.Add(charinfo);\n                }\n            } else if(i == 0) {\n                CFX_WideString str = m_TempTextBuf.GetWideString();\n                if (!str.IsEmpty() && str.GetAt(str.GetLength() - 1) == TEXT_BLANK_CHAR) {\n                    m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1);\n                    m_TempCharList.Delete(m_TempCharList.GetSize() - 1);\n                }\n            }\n        }\n    }\n}\nFX_INT32 CPDF_TextPage::GetTextObjectWritingMode(const CPDF_TextObject* pTextObj)\n{\n    FX_INT32 nChars = pTextObj->CountChars();\n    if (nChars == 1) {\n        return m_TextlineDir;\n    }\n    CPDF_TextObjectItem first, last;\n    pTextObj->GetCharInfo(0, &first);\n    pTextObj->GetCharInfo(nChars - 1, &last);\n    CFX_Matrix textMatrix;\n    pTextObj->GetTextMatrix(&textMatrix);\n    textMatrix.TransformPoint(first.m_OriginX, first.m_OriginY);\n    textMatrix.TransformPoint(last.m_OriginX, last.m_OriginY);\n    FX_FLOAT dX = FXSYS_fabs(last.m_OriginX - first.m_OriginX);\n    FX_FLOAT dY = FXSYS_fabs(last.m_OriginY - first.m_OriginY);\n    if (dX <= 0.0001f && dY <= 0.0001f) {\n        return -1;\n    }\n    CFX_VectorF v;\n    v.Set(dX, dY);\n    v.Normalize();\n    if (v.y <= 0.0872f) {\n        if (v.x <= 0.0872f) {\n            return m_TextlineDir;\n        }\n        return 0;\n    } else if (v.x <= 0.0872f) {\n        return 1;\n    }\n    return m_TextlineDir;\n}\nFX_BOOL CPDF_TextPage::IsHyphen(FX_WCHAR curChar)\n{\n    CFX_WideString strCurText = m_TempTextBuf.GetWideString();\n    if(strCurText.GetLength() == 0) {\n        strCurText = m_TextBuf.GetWideString();\n    }\n    FX_STRSIZE nCount = strCurText.GetLength();\n    int nIndex = nCount - 1;\n    FX_WCHAR wcTmp = strCurText.GetAt(nIndex);\n    while(wcTmp == 0x20 && nIndex <= nCount - 1 && nIndex >= 0) {\n        wcTmp = strCurText.GetAt(--nIndex);\n    }\n    if (0x2D == wcTmp || 0xAD == wcTmp) {\n        if (--nIndex > 0) {\n            FX_WCHAR preChar = strCurText.GetAt((nIndex));\n            if (((preChar >= L'A' && preChar <= L'Z') || (preChar >= L'a' && preChar <= L'z'))\n                    && ((curChar >= L'A' && curChar <= L'Z') || (curChar >= L'a' && curChar <= L'z'))) {\n                return TRUE;\n            }\n        }\n        int size = m_TempCharList.GetSize();\n        PAGECHAR_INFO preChar;\n        if (size) {\n            preChar = (PAGECHAR_INFO)m_TempCharList[size - 1];\n        } else {\n            size = m_charList.GetSize();\n            if(size == 0) {\n                return FALSE;\n            }\n            preChar = (PAGECHAR_INFO)m_charList[size - 1];\n        }\n        if (FPDFTEXT_CHAR_PIECE == preChar.m_Flag)\n            if (0xAD == preChar.m_Unicode || 0x2D == preChar.m_Unicode) {\n                return TRUE;\n            }\n    }\n    return FALSE;\n}\nint CPDF_TextPage::ProcessInsertObject(const CPDF_TextObject* pObj, CFX_AffineMatrix formMatrix)\n{\n    FindPreviousTextObject();\n    FX_BOOL bNewline = FALSE;\n    int WritingMode = GetTextObjectWritingMode(pObj);\n    if(WritingMode == -1) {\n        WritingMode = GetTextObjectWritingMode(m_pPreTextObj);\n    }\n    CFX_FloatRect this_rect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);\n    CFX_FloatRect prev_rect(m_pPreTextObj->m_Left, m_pPreTextObj->m_Bottom, m_pPreTextObj->m_Right, m_pPreTextObj->m_Top);\n    CPDF_TextObjectItem PrevItem, item;\n    int nItem = m_pPreTextObj->CountItems();\n    m_pPreTextObj->GetItemInfo(nItem - 1, &PrevItem);\n    pObj->GetItemInfo(0, &item);\n    CFX_WideString wstrItem = pObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);\n    if(wstrItem.IsEmpty()) {\n        wstrItem += (FX_WCHAR)item.m_CharCode;\n    }\n    FX_WCHAR curChar = wstrItem.GetAt(0);\n    if(WritingMode == 0) {\n        if(this_rect.Height() > 4.5 && prev_rect.Height() > 4.5) {\n            FX_FLOAT top = this_rect.top < prev_rect.top ? this_rect.top : prev_rect.top;\n            FX_FLOAT bottom = this_rect.bottom > prev_rect.bottom ? this_rect.bottom : prev_rect.bottom;\n            if(bottom >= top) {\n                if(IsHyphen(curChar)) {\n                    return 3;\n                }\n                return 2;\n            }\n        }\n    } else if (WritingMode == 1) {\n        if(this_rect.Width() > pObj->GetFontSize() * 0.1f && prev_rect.Width() > m_pPreTextObj->GetFontSize() * 0.1f) {\n            FX_FLOAT left = this_rect.left > m_CurlineRect.left ? this_rect.left : m_CurlineRect.left;\n            FX_FLOAT right = this_rect.right < m_CurlineRect.right ? this_rect.right : m_CurlineRect.right;\n            if(right <= left) {\n                if(IsHyphen(curChar)) {\n                    return 3;\n                }\n                return 2;\n            }\n        }\n    }\n    FX_FLOAT last_pos = PrevItem.m_OriginX;\n    int nLastWidth = GetCharWidth(PrevItem.m_CharCode, m_pPreTextObj->GetFont());\n    FX_FLOAT last_width = nLastWidth * m_pPreTextObj->GetFontSize() / 1000;\n    last_width = FXSYS_fabs(last_width);\n    int nThisWidth = GetCharWidth(item.m_CharCode, pObj->GetFont());\n    FX_FLOAT this_width = nThisWidth * pObj->GetFontSize() / 1000;\n    this_width = FXSYS_fabs(this_width);\n    FX_FLOAT threshold = last_width > this_width ? last_width / 4 : this_width / 4;\n    CFX_AffineMatrix prev_matrix, prev_reverse;\n    m_pPreTextObj->GetTextMatrix(&prev_matrix);\n    prev_matrix.Concat(m_perMatrix);\n    prev_reverse.SetReverse(prev_matrix);\n    FX_FLOAT x = pObj->GetPosX();\n    FX_FLOAT y = pObj->GetPosY();\n    formMatrix.Transform(x, y);\n    prev_reverse.Transform(x, y);\n    if(last_width < this_width) {\n        threshold = prev_reverse.TransformDistance(threshold);\n    }\n    CFX_FloatRect rect1(m_pPreTextObj->m_Left, pObj->m_Bottom, m_pPreTextObj->m_Right, pObj->m_Top);\n    CFX_FloatRect rect2(m_pPreTextObj->m_Left, m_pPreTextObj->m_Bottom, m_pPreTextObj->m_Right, m_pPreTextObj->m_Top);\n    CFX_FloatRect rect3 = rect1;\n    rect1.Intersect(rect2);\n    if (WritingMode == 0) {\n        if ((rect1.IsEmpty() && rect2.Height() > 5 && rect3.Height() > 5)\n                || ((y > threshold * 2 || y < threshold * -3) && (FXSYS_fabs(y) < 1 ? FXSYS_fabs(x) < FXSYS_fabs(y) : TRUE))) {\n            bNewline = TRUE;\n            if(nItem > 1 ) {\n                CPDF_TextObjectItem tempItem;\n                m_pPreTextObj->GetItemInfo(0, &tempItem);\n                CFX_AffineMatrix m;\n                m_pPreTextObj->GetTextMatrix(&m);\n                if(PrevItem.m_OriginX > tempItem.m_OriginX &&\n                        m_DisplayMatrix.a > 0.9 && m_DisplayMatrix.b < 0.1 &&\n                        m_DisplayMatrix.c < 0.1 && m_DisplayMatrix.d < -0.9\n                        && m.b < 0.1 && m.c < 0.1 ) {\n                    CFX_FloatRect re(0, m_pPreTextObj->m_Bottom, 1000, m_pPreTextObj->m_Top);\n                    if(re.Contains(pObj->GetPosX(), pObj->GetPosY())) {\n                        bNewline = FALSE;\n                    } else {\n                        CFX_FloatRect re(0, pObj->m_Bottom, 1000, pObj->m_Top);\n                        if(re.Contains(m_pPreTextObj->GetPosX(), m_pPreTextObj->GetPosY())) {\n                            bNewline = FALSE;\n                        }\n                    }\n                }\n            }\n        }\n    }\n    if(bNewline) {\n        if(IsHyphen(curChar)) {\n            return 3;\n        }\n        return 2;\n    }\n    FX_INT32 nChars = pObj->CountChars();\n    if (nChars == 1 && ( 0x2D == curChar || 0xAD == curChar))\n        if (IsHyphen(curChar)) {\n            return 3;\n        }\n    CFX_WideString PrevStr = m_pPreTextObj->GetFont()->UnicodeFromCharCode(PrevItem.m_CharCode);\n    FX_WCHAR preChar = PrevStr.GetAt(PrevStr.GetLength() - 1);\n    CFX_AffineMatrix matrix;\n    pObj->GetTextMatrix(&matrix);\n    matrix.Concat(formMatrix);\n    threshold = (FX_FLOAT)(nLastWidth > nThisWidth ? nLastWidth : nThisWidth);\n    threshold = threshold > 400 ? (threshold < 700 ? threshold / 4 :  (threshold > 800 ? threshold / 6 : threshold / 5)) : (threshold / 2);\n    if(nLastWidth >= nThisWidth) {\n        threshold *= FXSYS_fabs(m_pPreTextObj->GetFontSize());\n    } else {\n        threshold *= FXSYS_fabs(pObj->GetFontSize());\n        threshold = matrix.TransformDistance(threshold);\n        threshold = prev_reverse.TransformDistance(threshold);\n    }\n    threshold /= 1000;\n    if((threshold < 1.4881 && threshold > 1.4879)\n            || (threshold < 1.39001 && threshold > 1.38999)) {\n        threshold *= 1.5;\n    }\n    if (FXSYS_fabs(last_pos + last_width - x) > threshold && curChar != L' ' && preChar != L' ')\n        if (curChar != L' ' && preChar != L' ') {\n            if((x - last_pos - last_width) > threshold || (last_pos - x - last_width) > threshold) {\n                return 1;\n            }\n            if(x < 0 && (last_pos - x - last_width) > threshold) {\n                return 1;\n            }\n            if((x - last_pos - last_width) > this_width || (x - last_pos - this_width) > last_width ) {\n                return 1;\n            }\n        }\n    return 0;\n}\nFX_BOOL CPDF_TextPage::IsSameTextObject(CPDF_TextObject* pTextObj1, CPDF_TextObject* pTextObj2)\n{\n    if (!pTextObj1 || !pTextObj2) {\n        return FALSE;\n    }\n    CFX_FloatRect rcPreObj(pTextObj2->m_Left, pTextObj2->m_Bottom, pTextObj2->m_Right, pTextObj2->m_Top);\n    CFX_FloatRect rcCurObj(pTextObj1->m_Left, pTextObj1->m_Bottom, pTextObj1->m_Right, pTextObj1->m_Top);\n    if (rcPreObj.IsEmpty() && rcCurObj.IsEmpty() && !m_ParseOptions.m_bGetCharCodeOnly) {\n        FX_FLOAT dbXdif = FXSYS_fabs(rcPreObj.left - rcCurObj.left);\n        int nCount = m_charList.GetSize();\n        if (nCount >= 2) {\n            PAGECHAR_INFO perCharTemp = (PAGECHAR_INFO)m_charList[nCount - 2];\n            FX_FLOAT dbSpace = perCharTemp.m_CharBox.Width();\n            if (dbXdif > dbSpace) {\n                return FALSE;\n            }\n        }\n    }\n    if (!rcPreObj.IsEmpty() || !rcCurObj.IsEmpty()) {\n        rcPreObj.Intersect(rcCurObj);\n        if (rcPreObj.IsEmpty()) {\n            return FALSE;\n        }\n        if (FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) > rcCurObj.Width() / 2) {\n            return FALSE;\n        }\n        if (pTextObj2->GetFontSize() != pTextObj1->GetFontSize()) {\n            return FALSE;\n        }\n    }\n    int nPreCount = pTextObj2->CountItems();\n    int nCurCount = pTextObj1->CountItems();\n    if (nPreCount != nCurCount) {\n        return FALSE;\n    }\n    CPDF_TextObjectItem itemPer, itemCur;\n    for (int i = 0; i < nPreCount; i++) {\n        pTextObj2->GetItemInfo(i, &itemPer);\n        pTextObj1->GetItemInfo(i, &itemCur);\n        if (itemCur.m_CharCode != itemPer.m_CharCode) {\n            return FALSE;\n        }\n    }\n    if(FXSYS_fabs(pTextObj1->GetPosX() - pTextObj2->GetPosX()) > GetCharWidth(itemPer.m_CharCode, pTextObj2->GetFont())*pTextObj2->GetFontSize() / 1000 * 0.9 ||\n            FXSYS_fabs(pTextObj1->GetPosY() - pTextObj2->GetPosY()) >\n            FX_MAX(FX_MAX(rcPreObj.Height() , rcPreObj.Width()), pTextObj2->GetFontSize()) / 8) {\n        return FALSE;\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_TextPage::IsSameAsPreTextObject(CPDF_TextObject* pTextObj, FX_POSITION ObjPos)\n{\n    if (!pTextObj) {\n        return FALSE;\n    }\n    int i = 0;\n    if (!ObjPos) {\n        ObjPos = m_pPage->GetLastObjectPosition();\n    }\n    CPDF_PageObject* pObj = m_pPage->GetPrevObject(ObjPos);\n    while (i < 5 && ObjPos) {\n        pObj = m_pPage->GetPrevObject(ObjPos);\n        if(pObj == pTextObj) {\n            continue;\n        }\n        if(pObj->m_Type != PDFPAGE_TEXT) {\n            continue;\n        }\n        if(IsSameTextObject((CPDF_TextObject*)pObj, pTextObj)) {\n            return TRUE;\n        }\n        i++;\n    }\n    return FALSE;\n}\nFX_BOOL CPDF_TextPage::GenerateCharInfo(FX_WCHAR unicode, PAGECHAR_INFO& info)\n{\n    int size = m_TempCharList.GetSize();\n    PAGECHAR_INFO preChar;\n    if (size) {\n        preChar = (PAGECHAR_INFO)m_TempCharList[size - 1];\n    } else {\n        size = m_charList.GetSize();\n        if(size == 0) {\n            return FALSE;\n        }\n        preChar = (PAGECHAR_INFO)m_charList[size - 1];\n    }\n    info.m_Index = m_TextBuf.GetLength();\n    info.m_Unicode = unicode;\n    info.m_pTextObj = NULL;\n    info.m_CharCode = -1;\n    info.m_Flag = FPDFTEXT_CHAR_GENERATED;\n    int preWidth = 0;\n    if (preChar.m_pTextObj && preChar.m_CharCode != (FX_DWORD) - 1) {\n        preWidth = GetCharWidth(preChar.m_CharCode, preChar.m_pTextObj->GetFont());\n    }\n    FX_FLOAT fs = 0;\n    if(preChar.m_pTextObj) {\n        fs = preChar.m_pTextObj->GetFontSize();\n    } else {\n        fs = preChar.m_CharBox.Height();\n    }\n    if(!fs) {\n        fs = 1;\n    }\n    info.m_OriginX = preChar.m_OriginX + preWidth * (fs) / 1000;\n    info.m_OriginY = preChar.m_OriginY;\n    info.m_CharBox = CFX_FloatRect(info.m_OriginX, info.m_OriginY, info.m_OriginX, info.m_OriginY);\n    return TRUE;\n}\nFX_BOOL CPDF_TextPage::IsRectIntersect(CFX_FloatRect rect1, CFX_FloatRect rect2)\n{\n    rect1.Intersect(rect2);\n    if(rect1.IsEmpty()) {\n        return FALSE;\n    }\n    return TRUE;\n}\nFX_BOOL\tCPDF_TextPage::IsLetter(FX_WCHAR unicode)\n{\n    if (unicode < L'A') {\n        return FALSE;\n    }\n    if (unicode > L'Z' && unicode < L'a') {\n        return FALSE;\n    }\n    if (unicode > L'z') {\n        return FALSE;\n    }\n    return TRUE;\n}\nCPDF_TextPageFind::CPDF_TextPageFind(const IPDF_TextPage* pTextPage)\n    : m_IsFind(FALSE),\n      m_pTextPage(NULL)\n{\n    if (!pTextPage) {\n        return;\n    }\n    CPDF_ModuleMgr* pPDFModule = CPDF_ModuleMgr::Get();\n    m_pTextPage = pTextPage;\n    m_strText = m_pTextPage->GetPageText();\n    int nCount = pTextPage->CountChars();\n    if(nCount) {\n        m_CharIndex.Add(0);\n    }\n    for(int i = 0; i < nCount; i++) {\n        FPDF_CHAR_INFO info;\n        pTextPage->GetCharInfo(i, info);\n        int indexSize = m_CharIndex.GetSize();\n        if(info.m_Flag == CHAR_NORMAL || info.m_Flag == CHAR_GENERATED) {\n            if(indexSize % 2) {\n                m_CharIndex.Add(1);\n            } else {\n                if(indexSize <= 0) {\n                    continue;\n                }\n                m_CharIndex.SetAt(indexSize - 1, m_CharIndex.GetAt(indexSize - 1) + 1);\n            }\n        } else {\n            if(indexSize % 2) {\n                if(indexSize <= 0) {\n                    continue;\n                }\n                m_CharIndex.SetAt(indexSize - 1, i + 1);\n            } else {\n                m_CharIndex.Add(i + 1);\n            }\n        }\n    }\n    int indexSize = m_CharIndex.GetSize();\n    if(indexSize % 2) {\n        m_CharIndex.RemoveAt(indexSize - 1);\n    }\n    m_resStart = 0;\n    m_resEnd = -1;\n}\nint CPDF_TextPageFind::GetCharIndex(int index) const\n{\n    return m_pTextPage->CharIndexFromTextIndex(index);\n    int indexSize = m_CharIndex.GetSize();\n    int count = 0;\n    for(int i = 0; i < indexSize; i += 2) {\n        count += m_CharIndex.GetAt(i + 1);\n        if(count > index) {\n            return \tindex - count + m_CharIndex.GetAt(i + 1) + m_CharIndex.GetAt(i);\n        }\n    }\n    return -1;\n}\nFX_BOOL\tCPDF_TextPageFind::FindFirst(CFX_WideString findwhat, int flags, int startPos)\n{\n    if (!m_pTextPage) {\n        return FALSE;\n    }\n    if (m_strText.IsEmpty() || m_bMatchCase != (flags & FPDFTEXT_MATCHCASE)) {\n        m_strText = m_pTextPage->GetPageText();\n    }\n    m_findWhat = findwhat;\n    m_flags = flags;\n    m_bMatchCase = flags & FPDFTEXT_MATCHCASE;\n    if (m_strText.IsEmpty()) {\n        m_IsFind = FALSE;\n        return TRUE;\n    }\n    FX_STRSIZE len = findwhat.GetLength();\n    if (!m_bMatchCase) {\n        findwhat.MakeLower();\n        m_strText.MakeLower();\n    }\n    m_bMatchWholeWord = flags & FPDFTEXT_MATCHWHOLEWORD;\n    m_findNextStart = startPos;\n    if (startPos == -1) {\n        m_findPreStart = m_strText.GetLength() - 1;\n    } else {\n        m_findPreStart = startPos;\n    }\n    m_csFindWhatArray.RemoveAll();\n    int i = 0;\n    while(i < len) {\n        if(findwhat.GetAt(i) != ' ') {\n            break;\n        }\n        i++;\n    }\n    if(i < len) {\n        ExtractFindWhat(findwhat);\n    } else {\n        m_csFindWhatArray.Add(findwhat);\n    }\n    if(m_csFindWhatArray.GetSize() <= 0) {\n        return FALSE;\n    }\n    m_IsFind = TRUE;\n    m_resStart = 0;\n    m_resEnd = -1;\n    return TRUE;\n}\nFX_BOOL CPDF_TextPageFind::FindNext()\n{\n    if (!m_pTextPage) {\n        return FALSE;\n    }\n    m_resArray.RemoveAll();\n    if(m_findNextStart == -1) {\n        return FALSE;\n    }\n    if(m_strText.IsEmpty()) {\n        m_IsFind = FALSE;\n        return m_IsFind;\n    }\n    int strLen = m_strText.GetLength();\n    if (m_findNextStart > strLen - 1) {\n        m_IsFind = FALSE;\n        return m_IsFind;\n    }\n    int nCount = m_csFindWhatArray.GetSize();\n    int nResultPos = 0;\n    int\tnStartPos = 0;\n    nStartPos = m_findNextStart;\n    FX_BOOL bSpaceStart = FALSE;\n    for(int iWord = 0; iWord < nCount; iWord++) {\n        CFX_WideString csWord = m_csFindWhatArray[iWord];\n        if(csWord.IsEmpty()) {\n            if(iWord == nCount - 1) {\n                FX_WCHAR strInsert = m_strText.GetAt(nStartPos);\n                if(strInsert == TEXT_LINEFEED_CHAR || strInsert == TEXT_BLANK_CHAR || strInsert == TEXT_RETURN_CHAR || strInsert == 160) {\n                    nResultPos = nStartPos + 1;\n                    break;\n                }\n                iWord = -1;\n            } else if(iWord == 0) {\n                bSpaceStart = TRUE;\n            }\n            continue;\n        }\n        int endIndex;\n        nResultPos = m_strText.Find(csWord, nStartPos);\n        if (nResultPos == -1) {\n            m_IsFind = FALSE;\n            return m_IsFind;\n        }\n        endIndex = nResultPos + csWord.GetLength() - 1;\n        if(iWord == 0) {\n            m_resStart = nResultPos;\n        }\n        FX_BOOL bMatch = TRUE;\n        if(iWord != 0 && !bSpaceStart) {\n            int PreResEndPos = nStartPos;\n            int curChar = csWord.GetAt(0);\n            CFX_WideString lastWord = m_csFindWhatArray[iWord - 1];\n            int lastChar = lastWord.GetAt(lastWord.GetLength() - 1);\n            if(nStartPos == nResultPos && !(_IsIgnoreSpaceCharacter(lastChar) || _IsIgnoreSpaceCharacter(curChar))) {\n                bMatch = FALSE;\n            }\n            for(int d = PreResEndPos; d < nResultPos; d++) {\n                FX_WCHAR strInsert = m_strText.GetAt(d);\n                if(strInsert != TEXT_LINEFEED_CHAR && strInsert != TEXT_BLANK_CHAR && strInsert != TEXT_RETURN_CHAR && strInsert != 160) {\n                    bMatch = FALSE;\n                    break;\n                }\n            }\n        } else if(bSpaceStart) {\n            if(nResultPos > 0) {\n                FX_WCHAR strInsert = m_strText.GetAt(nResultPos - 1);\n                if(strInsert != TEXT_LINEFEED_CHAR && strInsert != TEXT_BLANK_CHAR && strInsert != TEXT_RETURN_CHAR && strInsert != 160) {\n                    bMatch = FALSE;\n                    m_resStart = nResultPos;\n                } else {\n                    m_resStart = nResultPos - 1;\n                }\n            }\n        }\n        if(m_bMatchWholeWord && bMatch) {\n            bMatch = IsMatchWholeWord(m_strText, nResultPos, endIndex);\n        }\n        nStartPos = endIndex + 1;\n        if(!bMatch) {\n            iWord = -1;\n            if(bSpaceStart) {\n                nStartPos = m_resStart + m_csFindWhatArray[1].GetLength();\n            } else {\n                nStartPos = m_resStart + m_csFindWhatArray[0].GetLength();\n            }\n        }\n    }\n    m_resEnd = nResultPos + m_csFindWhatArray[m_csFindWhatArray.GetSize() - 1].GetLength() - 1;\n    m_IsFind = TRUE;\n    int resStart = GetCharIndex(m_resStart);\n    int resEnd = GetCharIndex(m_resEnd);\n    m_pTextPage->GetRectArray(resStart, resEnd - resStart + 1, m_resArray);\n    if(m_flags & FPDFTEXT_CONSECUTIVE) {\n        m_findNextStart = m_resStart + 1;\n        m_findPreStart = m_resEnd - 1;\n    } else {\n        m_findNextStart = m_resEnd + 1;\n        m_findPreStart = m_resStart - 1;\n    }\n    return m_IsFind;\n}\nFX_BOOL CPDF_TextPageFind::FindPrev()\n{\n    if (!m_pTextPage) {\n        return FALSE;\n    }\n    m_resArray.RemoveAll();\n    if(m_strText.IsEmpty() || m_findPreStart < 0) {\n        m_IsFind = FALSE;\n        return m_IsFind;\n    }\n    CPDF_TextPageFind findEngine(m_pTextPage);\n    FX_BOOL ret = findEngine.FindFirst(m_findWhat, m_flags);\n    if(!ret) {\n        m_IsFind = FALSE;\n        return m_IsFind;\n    }\n    int\torder = -1, MatchedCount = 0;\n    while(ret) {\n        ret = findEngine.FindNext();\n        if(ret) {\n            int order1 = findEngine.GetCurOrder() ;\n            int\tMatchedCount1 = findEngine.GetMatchedCount();\n            if(((order1 + MatchedCount1) - 1) > m_findPreStart) {\n                break;\n            }\n            order = order1;\n            MatchedCount = MatchedCount1;\n        }\n    }\n    if(order == -1) {\n        m_IsFind = FALSE;\n        return m_IsFind;\n    }\n    m_resStart = m_pTextPage->TextIndexFromCharIndex(order);\n    m_resEnd = m_pTextPage->TextIndexFromCharIndex(order + MatchedCount - 1);\n    m_IsFind = TRUE;\n    m_pTextPage->GetRectArray(order, MatchedCount, m_resArray);\n    if(m_flags & FPDFTEXT_CONSECUTIVE) {\n        m_findNextStart = m_resStart + 1;\n        m_findPreStart = m_resEnd - 1;\n    } else {\n        m_findNextStart = m_resEnd + 1;\n        m_findPreStart = m_resStart - 1;\n    }\n    return m_IsFind;\n}\nvoid CPDF_TextPageFind::ExtractFindWhat(CFX_WideString findwhat)\n{\n    if(findwhat.IsEmpty()) {\n        return ;\n    }\n    int index = 0;\n    while(1) {\n        CFX_WideString csWord = TEXT_EMPTY;\n        int ret = ExtractSubString(csWord, findwhat, index, TEXT_BLANK_CHAR);\n        if(csWord.IsEmpty()) {\n            if(ret) {\n                m_csFindWhatArray.Add(CFX_WideString(L\"\"));\n                index++;\n                continue;\n            } else {\n                break;\n            }\n        }\n        int pos = 0;\n        FX_BOOL bLastIgnore = FALSE;\n        while(pos < csWord.GetLength()) {\n            CFX_WideString curStr = csWord.Mid(pos, 1);\n            FX_WCHAR curChar = csWord.GetAt(pos);\n            if (_IsIgnoreSpaceCharacter(curChar)) {\n                if (pos > 0 && curChar == 0x2019) {\n                    pos++;\n                    continue;\n                }\n                if (pos > 0 ) {\n                    CFX_WideString preStr = csWord.Mid(0, pos);\n                    m_csFindWhatArray.Add(preStr);\n                }\n                m_csFindWhatArray.Add(curStr);\n                if (pos == csWord.GetLength() - 1) {\n                    csWord.Empty();\n                    break;\n                }\n                csWord = csWord.Right(csWord.GetLength() - pos - 1);\n                pos = 0;\n                bLastIgnore = TRUE;\n                continue;\n            } else {\n                bLastIgnore = FALSE;\n            }\n            pos++;\n        }\n        if (!csWord.IsEmpty()) {\n            m_csFindWhatArray.Add(csWord);\n        }\n        index++;\n    }\n    return;\n}\nFX_BOOL CPDF_TextPageFind::IsMatchWholeWord(CFX_WideString csPageText, int startPos, int endPos)\n{\n    int char_left = 0;\n    int char_right = 0;\n    int char_count = endPos - startPos + 1;\n    if(char_count < 1) {\n        return FALSE;\n    }\n    if (char_count == 1 && csPageText.GetAt(startPos) > 255) {\n        return TRUE;\n    }\n    if(startPos - 1 >= 0 ) {\n        char_left = csPageText.GetAt(startPos - 1);\n    }\n    if(startPos + char_count < csPageText.GetLength()) {\n        char_right = csPageText.GetAt(startPos + char_count);\n    }\n    if(char_left == 0x61) {\n        int a = 0;\n    }\n    if ((char_left > 'A' && char_left < 'a') || (char_left > 'a' && char_left < 'z') || (char_left > 0xfb00 && char_left < 0xfb06) || (char_left >= '0' && char_left <= '9') ||\n            (char_right > 'A' && char_right < 'a') || (char_right > 'a' && char_right < 'z') || (char_right > 0xfb00 && char_right < 0xfb06) || (char_right >= '0' && char_right <= '9')) {\n        return FALSE;\n    }\n    if(!(('A' > char_left || char_left > 'Z')  && ('a' > char_left || char_left > 'z')\n            && ('A' > char_right || char_right > 'Z')  && ('a' > char_right || char_right > 'z'))) {\n        return FALSE;\n    }\n    if (char_count > 0) {\n        if (csPageText.GetAt(startPos) >= L'0' && csPageText.GetAt(startPos) <= L'9' && char_left >= L'0' && char_left <= L'9') {\n            return FALSE;\n        }\n        if (csPageText.GetAt(endPos) >= L'0' && csPageText.GetAt(endPos) <= L'9' && char_right >= L'0' && char_right <= L'9') {\n            return FALSE;\n        }\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_TextPageFind::ExtractSubString(CFX_WideString& rString, FX_LPCWSTR lpszFullString,\n        int iSubString, FX_WCHAR chSep)\n{\n    if (lpszFullString == NULL) {\n        return FALSE;\n    }\n    while (iSubString--) {\n        lpszFullString = FXSYS_wcschr(lpszFullString, chSep);\n        if (lpszFullString == NULL) {\n            rString.Empty();\n            return FALSE;\n        }\n        lpszFullString++;\n        while(*lpszFullString == chSep) {\n            lpszFullString++;\n        }\n    }\n    FX_LPCWSTR lpchEnd = FXSYS_wcschr(lpszFullString, chSep);\n    int nLen = (lpchEnd == NULL) ?\n               (int)FXSYS_wcslen(lpszFullString) : (int)(lpchEnd - lpszFullString);\n    ASSERT(nLen >= 0);\n    FXSYS_memcpy32(rString.GetBuffer(nLen), lpszFullString, nLen * sizeof(FX_WCHAR));\n    rString.ReleaseBuffer();\n    return TRUE;\n}\nCFX_WideString CPDF_TextPageFind::MakeReverse(const CFX_WideString str)\n{\n    CFX_WideString str2;\n    str2.Empty();\n    int nlen = str.GetLength();\n    for(int i = nlen - 1; i >= 0; i--) {\n        str2 += str.GetAt(i);\n    }\n    return str2;\n}\nvoid CPDF_TextPageFind::GetRectArray(CFX_RectArray& rects) const\n{\n    rects.Copy(m_resArray);\n}\nint\tCPDF_TextPageFind::GetCurOrder() const\n{\n    return GetCharIndex(m_resStart);\n}\nint\tCPDF_TextPageFind::GetMatchedCount()const\n{\n    int resStart = GetCharIndex(m_resStart);\n    int resEnd = GetCharIndex(m_resEnd);\n    return resEnd - resStart + 1;\n}\nCPDF_LinkExtract::CPDF_LinkExtract()\n    : m_pTextPage(NULL),\n      m_IsParserd(FALSE)\n{\n}\nCPDF_LinkExtract::~CPDF_LinkExtract()\n{\n    DeleteLinkList();\n}\nFX_BOOL CPDF_LinkExtract::ExtractLinks(const IPDF_TextPage* pTextPage)\n{\n    if (!pTextPage || !pTextPage->IsParsered()) {\n        return FALSE;\n    }\n    m_pTextPage = (const CPDF_TextPage*)pTextPage;\n    m_strPageText = m_pTextPage->GetPageText(0, -1);\n    DeleteLinkList();\n    if (m_strPageText.IsEmpty()) {\n        return FALSE;\n    }\n    parserLink();\n    m_IsParserd = TRUE;\n    return TRUE;\n}\nvoid CPDF_LinkExtract::DeleteLinkList()\n{\n    while (m_LinkList.GetSize()) {\n        CPDF_LinkExt* linkinfo = NULL;\n        linkinfo = m_LinkList.GetAt(0);\n        m_LinkList.RemoveAt(0);\n        delete linkinfo;\n    }\n    m_LinkList.RemoveAll();\n}\nint CPDF_LinkExtract::CountLinks() const\n{\n    if (!m_IsParserd)\t{\n        return -1;\n    }\n    return m_LinkList.GetSize();\n}\nvoid CPDF_LinkExtract::parserLink()\n{\n    int start = 0, pos = 0;\n    int TotalChar = m_pTextPage->CountChars();\n    while (pos < TotalChar) {\n        FPDF_CHAR_INFO pageChar;\n        m_pTextPage->GetCharInfo(pos, pageChar);\n        if (pageChar.m_Flag == CHAR_GENERATED || pageChar.m_Unicode == 0x20 || pos == TotalChar - 1) {\n            int nCount = pos - start;\n            if(pos == TotalChar - 1) {\n                nCount++;\n            }\n            CFX_WideString strBeCheck;\n            strBeCheck = m_pTextPage->GetPageText(start, nCount);\n            if (strBeCheck.GetLength() > 5) {\n                while(strBeCheck.GetLength() > 0) {\n                    FX_WCHAR ch = strBeCheck.GetAt(strBeCheck.GetLength() - 1);\n                    if (ch == L')' || ch == L',' || ch == L'>' || ch == L'.') {\n                        strBeCheck = strBeCheck.Mid(0, strBeCheck.GetLength() - 1);\n                        nCount--;\n                    } else {\n                        break;\n                    }\n                }\n                if (nCount > 5 && (CheckWebLink(strBeCheck) || CheckMailLink(strBeCheck))) {\n                    if (!AppendToLinkList(start, nCount, strBeCheck)) {\n                        break;\n                    }\n                }\n            }\n            start = ++pos;\n        } else {\n            pos++;\n        }\n    }\n}\nFX_BOOL CPDF_LinkExtract::CheckWebLink(CFX_WideString& strBeCheck)\n{\n    CFX_WideString str = strBeCheck;\n    str.MakeLower();\n    if (str.Find(L\"http://www.\") != -1) {\n        strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L\"http://www.\"));\n        return TRUE;\n    } else if (str.Find(L\"http://\") != -1) {\n        strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L\"http://\"));\n        return TRUE;\n    } else if (str.Find(L\"https://www.\") != -1) {\n        strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L\"https://www.\"));\n        return TRUE;\n    } else if (str.Find(L\"https://\") != -1) {\n        strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L\"https://\"));\n        return TRUE;\n    } else if (str.Find(L\"www.\") != -1) {\n        strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L\"www.\"));\n        strBeCheck = L\"http://\" + strBeCheck;\n        return TRUE;\n    } else {\n        return FALSE;\n    }\n}\nFX_BOOL CPDF_LinkExtract::CheckMailLink(CFX_WideString& str)\n{\n    str.MakeLower();\n    int aPos = str.Find(L'@');\n    if (aPos < 1) {\n        return FALSE;\n    }\n    if (str.GetAt(aPos - 1) == L'.' || str.GetAt(aPos - 1) == L'_') {\n        return FALSE;\n    }\n    int i;\n    for (i = aPos - 1; i >= 0; i--) {\n        FX_WCHAR ch = str.GetAt(i);\n        if (ch == L'_' || ch == L'.' || (ch >= L'a' && ch <= L'z') || (ch >= L'0' && ch <= L'9')) {\n            continue;\n        } else {\n            if (i == aPos - 1) {\n                return FALSE;\n            }\n            str = str.Right(str.GetLength() - i - 1);\n            break;\n        }\n    }\n    aPos = str.Find(L'@');\n    if (aPos < 1) {\n        return FALSE;\n    }\n    CFX_WideString strtemp = L\"\";\n    for (i = 0; i < aPos; i++) {\n        FX_WCHAR wch = str.GetAt(i);\n        if (wch >= L'a' && wch <= L'z') {\n            break;\n        } else {\n            strtemp = str.Right(str.GetLength() - i + 1);\n        }\n    }\n    if (strtemp != L\"\") {\n        str = strtemp;\n    }\n    aPos = str.Find(L'@');\n    if (aPos < 1) {\n        return FALSE;\n    }\n    str.TrimRight(L'.');\n    strtemp = str;\n    int ePos = str.Find(L'.');\n    if (ePos == -1) {\n        return FALSE;\n    }\n    while (ePos != -1) {\n        strtemp = strtemp.Right(strtemp.GetLength() - ePos - 1);\n        ePos = strtemp.Find('.');\n    }\n    ePos = strtemp.GetLength();\n    for (i = 0; i < ePos; i++) {\n        FX_WCHAR wch = str.GetAt(i);\n        if ((wch >= L'a' && wch <= L'z') || (wch >= L'0' && wch <= L'9')) {\n            continue;\n        } else {\n            str = str.Left(str.GetLength() - ePos + i + 1);\n            ePos = ePos - i - 1;\n            break;\n        }\n    }\n    int nLen = str.GetLength();\n    for (i = aPos + 1; i < nLen - ePos; i++) {\n        FX_WCHAR wch = str.GetAt(i);\n        if (wch == L'-' || wch == L'.' || (wch >= L'a' && wch <= L'z') || (wch >= L'0' && wch <= L'9')) {\n            continue;\n        } else {\n            return FALSE;\n        }\n    }\n    if (str.Find(L\"mailto:\") == -1) {\n        str = L\"mailto:\" + str;\n    }\n    return TRUE;\n}\nFX_BOOL CPDF_LinkExtract::AppendToLinkList(int start, int count, CFX_WideString strUrl)\n{\n    CPDF_LinkExt* linkInfo = NULL;\n    linkInfo = FX_NEW CPDF_LinkExt;\n    if (!linkInfo) {\n        return FALSE;\n    }\n    linkInfo->m_strUrl = strUrl;\n    linkInfo->m_Start = start;\n    linkInfo->m_Count = count;\n    m_LinkList.Add(linkInfo);\n    return TRUE;\n}\nCFX_WideString CPDF_LinkExtract::GetURL(int index) const\n{\n    if (!m_IsParserd || index < 0 || index >= m_LinkList.GetSize()) {\n        return L\"\";\n    }\n    CPDF_LinkExt* link = NULL;\n    link = m_LinkList.GetAt(index);\n    if (!link) {\n        return L\"\";\n    }\n    return link->m_strUrl;\n}\nvoid CPDF_LinkExtract::GetBoundedSegment(int index, int& start, int& count) const\n{\n    if (!m_IsParserd || index < 0 || index >= m_LinkList.GetSize()) {\n        return ;\n    }\n    CPDF_LinkExt* link = NULL;\n    link = m_LinkList.GetAt(index);\n    if (!link) {\n        return ;\n    }\n    start = link->m_Start;\n    count = link->m_Count;\n}\nvoid CPDF_LinkExtract::GetRects(int index, CFX_RectArray& rects) const\n{\n    if (!m_IsParserd || index < 0 || index >= m_LinkList.GetSize()) {\n        return;\n    }\n    CPDF_LinkExt* link = NULL;\n    link = m_LinkList.GetAt(index);\n    if (!link) {\n        return ;\n    }\n    m_pTextPage->GetRectArray(link->m_Start, link->m_Count, rects);\n}\n"
  },
  {
    "path": "core/src/fpdftext/fpdf_text_search.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fpdfapi/fpdf_pageobj.h\"\n#include \"../../include/fpdftext/fpdf_text.h\"\n#include \"../../include/fpdfapi/fpdf_page.h\"\nclass CPDF_TextStream : public CFX_Object\n{\npublic:\n    CPDF_TextStream(CFX_WideTextBuf& buffer, FX_BOOL bUseLF, CFX_PtrArray* pObjArray);\n    ~CPDF_TextStream() {}\n    FX_BOOL ProcessObject(const CPDF_TextObject* pObj, FX_BOOL bFirstLine);\n    CFX_WideTextBuf&\tm_Buffer;\n    FX_BOOL\t\t\t\tm_bUseLF;\n    CFX_PtrArray*\t\tm_pObjArray;\n    const CPDF_TextObject*\tm_pLastObj;\n};\nCPDF_TextStream::CPDF_TextStream(CFX_WideTextBuf& buffer, FX_BOOL bUseLF, CFX_PtrArray* pObjArray) : m_Buffer(buffer)\n{\n    m_pLastObj = NULL;\n    m_bUseLF = bUseLF;\n    m_pObjArray = pObjArray;\n}\nFX_BOOL FPDFText_IsSameTextObject(const CPDF_TextObject* pTextObj1, const CPDF_TextObject* pTextObj2)\n{\n    if (!pTextObj1 || !pTextObj2) {\n        return FALSE;\n    }\n    CFX_FloatRect rcPreObj(pTextObj2->m_Left, pTextObj2->m_Bottom, pTextObj2->m_Right, pTextObj2->m_Top);\n    CFX_FloatRect rcCurObj(pTextObj1->m_Left, pTextObj1->m_Bottom, pTextObj1->m_Right, pTextObj1->m_Top);\n    if (rcPreObj.IsEmpty() && rcCurObj.IsEmpty()) {\n        return TRUE;\n    }\n    if (!rcPreObj.IsEmpty() || !rcCurObj.IsEmpty()) {\n        rcPreObj.Intersect(rcCurObj);\n        if (rcPreObj.IsEmpty()) {\n            return FALSE;\n        }\n        if (FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) > rcCurObj.Width() / 2) {\n            return FALSE;\n        }\n        if (pTextObj2->GetFontSize() != pTextObj1->GetFontSize()) {\n            return FALSE;\n        }\n    }\n    int nPreCount = pTextObj2->CountItems();\n    int nCurCount = pTextObj1->CountItems();\n    if (nPreCount != nCurCount) {\n        return FALSE;\n    }\n    for (int i = 0; i < nPreCount; i++) {\n        CPDF_TextObjectItem itemPer, itemCur;\n        pTextObj2->GetItemInfo(i, &itemPer);\n        pTextObj1->GetItemInfo(i, &itemCur);\n        if (itemCur.m_CharCode != itemPer.m_CharCode) {\n            return FALSE;\n        }\n    }\n    return TRUE;\n}\nint GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont)\n{\n    if(charCode == -1) {\n        return 0;\n    }\n    int w = pFont->GetCharWidthF(charCode);\n    if(w == 0) {\n        CFX_ByteString str;\n        pFont->AppendChar(str, charCode);\n        w = pFont->GetStringWidth(str, 1);\n        if(w == 0) {\n            FX_RECT BBox;\n            pFont->GetCharBBox(charCode, BBox);\n            w = BBox.right - BBox.left;\n        }\n    }\n    return w;\n}\nint FPDFText_ProcessInterObj(const CPDF_TextObject* pPrevObj, const CPDF_TextObject* pObj)\n{\n    if(FPDFText_IsSameTextObject(pPrevObj, pObj)) {\n        return -1;\n    }\n    CPDF_TextObjectItem item;\n    int nItem = pPrevObj->CountItems();\n    pPrevObj->GetItemInfo(nItem - 1, &item);\n    FX_WCHAR preChar = 0, curChar = 0;\n    CFX_WideString wstr = pPrevObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);\n    if(wstr.GetLength()) {\n        preChar = wstr.GetAt(0);\n    }\n    FX_FLOAT last_pos = item.m_OriginX;\n    int nLastWidth = GetCharWidth(item.m_CharCode, pPrevObj->GetFont());\n    FX_FLOAT last_width = nLastWidth * pPrevObj->GetFontSize() / 1000;\n    last_width = FXSYS_fabs(last_width);\n    pObj->GetItemInfo(0, &item);\n    wstr = pObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);\n    if(wstr.GetLength()) {\n        curChar = wstr.GetAt(0);\n    }\n    int nThisWidth = GetCharWidth(item.m_CharCode, pObj->GetFont());\n    FX_FLOAT this_width = nThisWidth * pObj->GetFontSize() / 1000;\n    this_width = FXSYS_fabs(this_width);\n    FX_FLOAT threshold = last_width > this_width ? last_width / 4 : this_width / 4;\n    CFX_AffineMatrix prev_matrix, prev_reverse;\n    pPrevObj->GetTextMatrix(&prev_matrix);\n    prev_reverse.SetReverse(prev_matrix);\n    FX_FLOAT x = pObj->GetPosX(), y = pObj->GetPosY();\n    prev_reverse.Transform(x, y);\n    if (FXSYS_fabs(y) > threshold * 2) {\n        return 2;\n    }\n    threshold = (FX_FLOAT)(nLastWidth > nThisWidth ? nLastWidth : nThisWidth);\n    threshold = threshold > 400 ? (threshold < 700 ? threshold / 4 :  threshold / 5) : (threshold / 2);\n    threshold *= nLastWidth > nThisWidth ? FXSYS_fabs(pPrevObj->GetFontSize()) : FXSYS_fabs(pObj->GetFontSize());\n    threshold /= 1000;\n    if (FXSYS_fabs(last_pos + last_width - x) > threshold && curChar != L' ' && preChar != L' ')\n        if(curChar != L' ' && preChar != L' ') {\n            if((x - last_pos - last_width) > threshold || (last_pos - x - last_width) > threshold) {\n                return 1;\n            }\n            if(x < 0 && (last_pos - x - last_width) > threshold) {\n                return 1;\n            }\n            if((x - last_pos - last_width) > this_width || (x - last_pos - this_width) > last_width ) {\n                return 1;\n            }\n        }\n    if(last_pos + last_width > x + this_width && curChar == L' ') {\n        return 3;\n    }\n    return 0;\n}\nFX_BOOL CPDF_TextStream::ProcessObject(const CPDF_TextObject* pObj, FX_BOOL bFirstLine)\n{\n    if(pObj->m_Bottom > 380 && pObj->m_Left < 45 && pObj->m_Top < 402) {\n        int i = 0;\n    }\n    CPDF_Font* pFont = pObj->GetFont();\n    CFX_AffineMatrix matrix;\n    pObj->GetTextMatrix(&matrix);\n    FX_FLOAT fs = pObj->GetFontSize();\n    int item_index = 0;\n    if (m_pLastObj) {\n        int result = FPDFText_ProcessInterObj(m_pLastObj, pObj);\n        if (result == 2) {\n            int len = m_Buffer.GetLength();\n            if (len && m_bUseLF && m_Buffer.GetBuffer()[len - 1] == L'-') {\n                m_Buffer.Delete(len - 1, 1);\n                if (m_pObjArray) {\n                    m_pObjArray->RemoveAt((len - 1) * 2, 2);\n                }\n            } else {\n                if (bFirstLine) {\n                    return TRUE;\n                }\n                if (m_bUseLF) {\n                    m_Buffer.AppendChar(L'\\r');\n                    m_Buffer.AppendChar(L'\\n');\n                    if (m_pObjArray) {\n                        for (int i = 0; i < 4; i ++) {\n                            m_pObjArray->Add(NULL);\n                        }\n                    }\n                } else {\n                    m_Buffer.AppendChar(' ');\n                    if (m_pObjArray) {\n                        m_pObjArray->Add(NULL);\n                        m_pObjArray->Add(NULL);\n                    }\n                }\n            }\n        } else if (result == 1) {\n            m_Buffer.AppendChar(L' ');\n            if (m_pObjArray) {\n                m_pObjArray->Add(NULL);\n                m_pObjArray->Add(NULL);\n            }\n        } else if (result == -1) {\n            m_pLastObj = pObj;\n            return FALSE;\n        } else if (result == 3) {\n            item_index = 1;\n        }\n    }\n    m_pLastObj = pObj;\n    int nItems = pObj->CountItems();\n    FX_FLOAT Ignorekerning = 0;\n    for(int i = 1; i < nItems - 1; i += 2) {\n        CPDF_TextObjectItem item;\n        pObj->GetItemInfo(i, &item);\n        if (item.m_CharCode == (FX_DWORD) - 1) {\n            if(i == 1) {\n                Ignorekerning = item.m_OriginX;\n            } else if(Ignorekerning > item.m_OriginX) {\n                Ignorekerning = item.m_OriginX;\n            }\n        } else {\n            Ignorekerning = 0;\n            break;\n        }\n    }\n    FX_FLOAT spacing = 0;\n    for (; item_index < nItems; item_index ++) {\n        CPDF_TextObjectItem item;\n        pObj->GetItemInfo(item_index, &item);\n        if (item.m_CharCode == (FX_DWORD) - 1) {\n            CFX_WideString wstr = m_Buffer.GetWideString();\n            if (wstr.IsEmpty() || wstr.GetAt(wstr.GetLength() - 1) == L' ') {\n                continue;\n            }\n            FX_FLOAT fontsize_h = pObj->m_TextState.GetFontSizeH();\n            spacing = -fontsize_h * (item.m_OriginX - Ignorekerning) / 1000;\n            continue;\n        }\n        FX_FLOAT charSpace = pObj->m_TextState.GetObject()->m_CharSpace;\n        if(nItems > 3 && !spacing) {\n            charSpace = 0;\n        }\n        if((spacing || charSpace) && item_index > 0) {\n            int last_width = 0;\n            FX_FLOAT fontsize_h = pObj->m_TextState.GetFontSizeH();\n            FX_DWORD space_charcode = pFont->CharCodeFromUnicode(' ');\n            FX_FLOAT threshold = 0;\n            if (space_charcode != -1) {\n                threshold = fontsize_h * pFont->GetCharWidthF(space_charcode) / 1000 ;\n            }\n            if(threshold > fontsize_h / 3) {\n                threshold = 0;\n            } else {\n                threshold /= 2;\n            }\n            if (threshold == 0) {\n                threshold = fontsize_h;\n                int this_width = FXSYS_abs(GetCharWidth(item.m_CharCode, pFont));\n                threshold = this_width > last_width ? (FX_FLOAT)this_width : (FX_FLOAT)last_width;\n                int nDivide = 6;\n                if (threshold < 300) {\n                    nDivide = 2;\n                } else if (threshold < 500) {\n                    nDivide = 4;\n                } else if (threshold < 700) {\n                    nDivide = 5;\n                }\n                threshold = threshold / nDivide;\n                threshold = fontsize_h * threshold / 1000;\n            }\n            if(charSpace > 0.001) {\n                spacing += matrix.TransformDistance(charSpace);\n            } else if(charSpace < -0.001) {\n                spacing -= matrix.TransformDistance(FXSYS_fabs(charSpace));\n            }\n            if (threshold && (spacing && spacing >= threshold) ) {\n                m_Buffer.AppendChar(L' ');\n                if (m_pObjArray) {\n                    m_pObjArray->Add(NULL);\n                    m_pObjArray->Add(NULL);\n                }\n            }\n            if (item.m_CharCode == (FX_DWORD) - 1) {\n                continue;\n            }\n            spacing = 0;\n        }\n        CFX_WideString unicode_str = pFont->UnicodeFromCharCode(item.m_CharCode);\n        if (unicode_str.IsEmpty()) {\n            m_Buffer.AppendChar((FX_WCHAR)item.m_CharCode);\n            if (m_pObjArray) {\n                m_pObjArray->Add((void*)pObj);\n                m_pObjArray->Add((void*)(FX_INTPTR)item_index);\n            }\n        } else {\n            m_Buffer << unicode_str;\n            if (m_pObjArray) {\n                for (int i = 0; i < unicode_str.GetLength(); i ++) {\n                    m_pObjArray->Add((void*)pObj);\n                    m_pObjArray->Add((void*)(FX_INTPTR)item_index);\n                }\n            }\n        }\n    }\n    return FALSE;\n}\nvoid _PDF_GetTextStream_Unicode(CFX_WideTextBuf& buffer, CPDF_PageObjects* pPage, FX_BOOL bUseLF,\n                                CFX_PtrArray* pObjArray)\n{\n    CPDF_TextStream textstream(buffer, bUseLF, pObjArray);\n    FX_POSITION pos = pPage->GetFirstObjectPosition();\n    while (pos) {\n        CPDF_PageObject* pObject = pPage->GetNextObject(pos);\n        if (pObject == NULL) {\n            continue;\n        }\n        if (pObject->m_Type != PDFPAGE_TEXT) {\n            continue;\n        }\n        textstream.ProcessObject((CPDF_TextObject*)pObject, FALSE);\n    }\n}\nCFX_WideString PDF_GetFirstTextLine_Unicode(CPDF_Document* pDoc, CPDF_Dictionary* pPage)\n{\n    CFX_WideTextBuf buffer;\n    buffer.EstimateSize(0, 1024);\n    CPDF_Page page;\n    page.Load(pDoc, pPage);\n    CPDF_ParseOptions options;\n    options.m_bTextOnly = TRUE;\n    options.m_bSeparateForm = FALSE;\n    page.ParseContent(&options);\n    CPDF_TextStream textstream(buffer, FALSE, NULL);\n    FX_POSITION pos = page.GetFirstObjectPosition();\n    while (pos) {\n        CPDF_PageObject* pObject = page.GetNextObject(pos);\n        if (pObject->m_Type != PDFPAGE_TEXT) {\n            continue;\n        }\n        if (textstream.ProcessObject((CPDF_TextObject*)pObject, TRUE)) {\n            break;\n        }\n    }\n    return buffer.GetWideString();\n}\n"
  },
  {
    "path": "core/src/fpdftext/text_int.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _PDF_TEXT_INT_H_\n#define _PDF_TEXT_INT_H_\nclass CPDF_TextParseOptions : public CFX_Object\n{\npublic:\n    CPDF_TextParseOptions();\n    FX_BOOL\t\t\tm_bCheckObjectOrder;\n    FX_BOOL\t\t\tm_bCheckDirection;\n    int\t\t\t\tm_nCheckSameObject;\n};\nclass CPDF_TextPage;\nclass CPDF_LinkExtract;\nclass CPDF_TextPageFind;\nclass CPDF_DocProgressiveSearch;\n#define FPDFTEXT_CHAR_ERROR\t\t\t-1\n#define FPDFTEXT_CHAR_NORMAL\t\t0\n#define FPDFTEXT_CHAR_GENERATED\t\t1\n#define FPDFTEXT_CHAR_UNUNICODE\t\t2\n#define FPDFTEXT_CHAR_HYPHEN\t\t3\n#define FPDFTEXT_CHAR_PIECE\t\t\t4\n#define FPDFTEXT_MC_PASS\t\t\t0\n#define FPDFTEXT_MC_DONE\t\t\t1\n#define FPDFTEXT_MC_DELAY\t\t\t2\ntypedef struct _PAGECHAR_INFO: public CFX_Object {\n    int\t\t\t\t\tm_CharCode;\n    FX_WCHAR\t\t\tm_Unicode;\n    FX_FLOAT\t\t\tm_OriginX;\n    FX_FLOAT\t\t\tm_OriginY;\n    FX_INT32\t\t\tm_Flag;\n    CFX_FloatRect\t\tm_CharBox;\n    CPDF_TextObject*\tm_pTextObj;\n    CFX_AffineMatrix\tm_Matrix;\n    int\t\t\t\t\tm_Index;\n} PAGECHAR_INFO;\ntypedef\tCFX_SegmentedArray<PAGECHAR_INFO> PAGECHAR_InfoArray;\ntypedef struct {\n    int\tm_Start;\n    int m_nCount;\n} FPDF_SEGMENT;\ntypedef CFX_ArrayTemplate<FPDF_SEGMENT> SEGMENT_Array;\ntypedef struct {\n    CPDF_TextObject*\tm_pTextObj;\n    CFX_AffineMatrix\tm_formMatrix;\n} PDFTEXT_Obj;\ntypedef CFX_ArrayTemplate<PDFTEXT_Obj> LINEOBJ;\nclass CPDF_TextPage: public IPDF_TextPage\n{\npublic:\n    CPDF_TextPage(const CPDF_Page* pPage, int flags = 0);\n    CPDF_TextPage(const CPDF_PageObjects* pPage, int flags = 0);\n    CPDF_TextPage(const CPDF_Page* pPage, CPDFText_ParseOptions ParserOptions);\n    virtual FX_BOOL\t\t\t\t\tParseTextPage();\n    virtual void\t\t\t\t\tNormalizeObjects(FX_BOOL bNormalize);\n    virtual\tFX_BOOL\t\t\t\t\tIsParsered() const\n    {\n        return m_IsParsered;\n    }\n    virtual ~CPDF_TextPage() {};\npublic:\n    virtual int CharIndexFromTextIndex(int TextIndex)const ;\n    virtual int TextIndexFromCharIndex(int CharIndex)const;\n    virtual int\t\t\t\t\t\tCountChars() const;\n    virtual\tvoid\t\t\t\t\tGetCharInfo(int index, FPDF_CHAR_INFO & info) const;\n    virtual void\t\t\t\t\tGetRectArray(int start, int nCount, CFX_RectArray& rectArray) const;\n    virtual int\t\t\t\t\t\tGetIndexAtPos(CPDF_Point point, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const;\n    virtual int\t\t\t\t\t\tGetIndexAtPos(FX_FLOAT x, FX_FLOAT y, FX_FLOAT xTorelance,\n            FX_FLOAT yTorelance) const;\n    virtual CFX_WideString\t\t\tGetTextByRect(CFX_FloatRect rect) const;\n    virtual void\t\t\t\t\tGetRectsArrayByRect(CFX_FloatRect rect, CFX_RectArray& resRectArray) const;\n    virtual\tint\t\t\t\t\t\tGetOrderByDirection(int order, int direction) const;\n    virtual\tCFX_WideString\t\t\tGetPageText(int start = 0, int nCount = -1) const;\n\n    virtual int\t\t\t\t\t\tCountRects(int start, int nCount);\n    virtual\tvoid\t\t\t\t\tGetRect(int rectIndex, FX_FLOAT& left, FX_FLOAT& top\n                                            , FX_FLOAT& right, FX_FLOAT &bottom) const;\n    virtual FX_BOOL\t\t\t\t\tGetBaselineRotate(int rectIndex, int& Rotate);\n    virtual FX_BOOL\t\t\t\t\tGetBaselineRotate(CFX_FloatRect rect, int& Rotate);\n    virtual\tint\t\t\t\t\t\tCountBoundedSegments(FX_FLOAT left, FX_FLOAT top,\n            FX_FLOAT right, FX_FLOAT bottom, FX_BOOL bContains = FALSE);\n    virtual\tvoid\t\t\t\t\tGetBoundedSegment(int index, int& start, int& count) const;\n    virtual int\t\t\t\t\t\tGetWordBreak(int index, int direction) const;\npublic:\n    const\tPAGECHAR_InfoArray*\t\tGetCharList() const\n    {\n        return &m_charList;\n    }\n    static\tFX_BOOL\t\t\t\t\tIsRectIntersect(CFX_FloatRect rect1, CFX_FloatRect rect2);\n    static\tFX_BOOL\t\t\t\t\tIsLetter(FX_WCHAR unicode);\nprivate:\n    FX_BOOL\t\t\t\t\t\t\tIsHyphen(FX_WCHAR curChar);\n    FX_BOOL\t\t\t\t\t\t\tIsControlChar(PAGECHAR_INFO* pCharInfo);\n    FX_BOOL\t\t\t\t\t\t\tGetBaselineRotate(int start, int end, int& Rotate);\n    void\t\t\t\t\t\t\tProcessObject();\n    void\t\t\t\t\t\t\tProcessFormObject(CPDF_FormObject*\tpFormObj, CFX_AffineMatrix formMatrix);\n    void\t\t\t\t\t\t\tProcessTextObject(PDFTEXT_Obj pObj);\n    void\t\t\t\t\t\t\tProcessTextObject(CPDF_TextObject*\tpTextObj, CFX_AffineMatrix formMatrix, FX_POSITION ObjPos);\n    int\t\t\t\t\t\t\t\tProcessInsertObject(const CPDF_TextObject* pObj, CFX_AffineMatrix formMatrix);\n    FX_BOOL\t\t\t\t\t\t\tGenerateCharInfo(FX_WCHAR unicode, PAGECHAR_INFO& info);\n    FX_BOOL\t\t\t\t\t\t\tIsSameAsPreTextObject(CPDF_TextObject* pTextObj, FX_POSITION ObjPos);\n    FX_BOOL\t\t\t\t\t\t\tIsSameTextObject(CPDF_TextObject* pTextObj1, CPDF_TextObject* pTextObj2);\n    int\t\t\t\t\t\t\t\tGetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const;\n    void\t\t\t\t\t\t\tCloseTempLine();\n    void\t\t\t\t\t\t\tOnPiece(IFX_BidiChar* pBidi, CFX_WideString& str);\n    FX_INT32\tPreMarkedContent(PDFTEXT_Obj pObj);\n    void\t\tProcessMarkedContent(PDFTEXT_Obj pObj);\n    void\t\tCheckMarkedContentObject(FX_INT32& start, FX_INT32& nCount) const;\n    void\t\tFindPreviousTextObject(void);\n    void\t\tAddCharInfoByLRDirection(CFX_WideString& str, int i);\n    void\t\tAddCharInfoByRLDirection(CFX_WideString& str, int i);\n    FX_INT32\tGetTextObjectWritingMode(const CPDF_TextObject* pTextObj);\n    FX_INT32\tFindTextlineFlowDirection();\nprotected:\n    CPDFText_ParseOptions\t\t\tm_ParseOptions;\n    CFX_WordArray\t\t\t\t\tm_CharIndex;\n    const CPDF_PageObjects*\t\t\tm_pPage;\n    PAGECHAR_InfoArray\t\t\t\tm_charList;\n    CFX_WideTextBuf\t\t\t\t\tm_TextBuf;\n    PAGECHAR_InfoArray\t\t\t\tm_TempCharList;\n    CFX_WideTextBuf\t\t\t\t\tm_TempTextBuf;\n    int\t\t\t\t\t\t\t\tm_parserflag;\n    CPDF_TextObject*\t\t\t\tm_pPreTextObj;\n    CFX_AffineMatrix\t\t\t\tm_perMatrix;\n    FX_BOOL\t\t\t\t\t\t\tm_IsParsered;\n    CFX_AffineMatrix\t\t\t\tm_DisplayMatrix;\n\n    SEGMENT_Array\t\t\t\t\tm_Segment;\n    CFX_RectArray\t\t\t\t\tm_SelRects;\n    LINEOBJ\t\t\t\t\t\t\tm_LineObj;\n    FX_BOOL\t\t\t\t\t\t\tm_TextlineDir;\n    CFX_FloatRect\t\t\t\t\tm_CurlineRect;\n};\nclass CPDF_TextPageFind: public IPDF_TextPageFind\n{\npublic:\n    CPDF_TextPageFind(const IPDF_TextPage* pTextPage);\n    virtual\t\t\t\t\t\t\t~CPDF_TextPageFind() {};\npublic:\n    virtual\tFX_BOOL\t\t\t\t\tFindFirst(CFX_WideString findwhat, int flags, int startPos = 0);\n    virtual\tFX_BOOL\t\t\t\t\tFindNext();\n    virtual\tFX_BOOL\t\t\t\t\tFindPrev();\n\n    virtual void\t\t\t\t\tGetRectArray(CFX_RectArray& rects) const;\n    virtual int\t\t\t\t\t\tGetCurOrder() const;\n    virtual int\t\t\t\t\t\tGetMatchedCount()const;\nprotected:\n    void\t\t\t\t\t\t\tExtractFindWhat(CFX_WideString findwhat);\n    FX_BOOL\t\t\t\t\t\t\tIsMatchWholeWord(CFX_WideString csPageText, int startPos, int endPos);\n    FX_BOOL\t\t\t\t\t\t\tExtractSubString(CFX_WideString& rString, FX_LPCWSTR lpszFullString,\n            int iSubString, FX_WCHAR chSep);\n    CFX_WideString\t\t\t\t\tMakeReverse(const CFX_WideString str);\n    int\t\t\t\t\t\t\t\tReverseFind(CFX_WideString csPageText, CFX_WideString csWord, int nStartPos, int& WordLength);\n    int\t\t\t\t\t\t\t\tGetCharIndex(int index) const;\nprivate:\n    CFX_WordArray\t\t\t\t\tm_CharIndex;\n    const IPDF_TextPage*\t\t\tm_pTextPage;\n    CFX_WideString\t\t\t\t\tm_strText;\n    CFX_WideString\t\t\t\t\tm_findWhat;\n    int\t\t\t\t\t\t\t\tm_flags;\n    CFX_WideStringArray\t\t\t\tm_csFindWhatArray;\n    int\t\t\t\t\t\t\t\tm_findNextStart;\n    int\t\t\t\t\t\t\t\tm_findPreStart;\n    FX_BOOL\t\t\t\t\t\t\tm_bMatchCase;\n    FX_BOOL\t\t\t\t\t\t\tm_bMatchWholeWord;\n    int\t\t\t\t\t\t\t\tm_resStart;\n    int\t\t\t\t\t\t\t\tm_resEnd;\n    CFX_RectArray\t\t\t\t\tm_resArray;\n    FX_BOOL\t\t\t\t\t\t\tm_IsFind;\n};\nclass CPDF_LinkExt: public CFX_Object\n{\npublic:\n    CPDF_LinkExt() {};\n    int\t\t\t\t\t\t\t\tm_Start;\n    int\t\t\t\t\t\t\t\tm_Count;\n    CFX_WideString\t\t\t\t\tm_strUrl;\n    virtual\t\t\t\t\t\t\t~CPDF_LinkExt() {};\n};\ntypedef CFX_ArrayTemplate<CPDF_LinkExt*> LINK_InfoArray;\nclass CPDF_LinkExtract: public IPDF_LinkExtract\n{\npublic:\n    CPDF_LinkExtract();\n    virtual\t\t\t\t\t\t\t~CPDF_LinkExtract();\n    virtual FX_BOOL\t\t\t\t\tExtractLinks(const IPDF_TextPage* pTextPage);\n    virtual\tFX_BOOL\t\t\t\t\tIsExtract() const\n    {\n        return m_IsParserd;\n    }\npublic:\n    virtual int\t\t\t\t\t\tCountLinks() const;\n    virtual\tCFX_WideString\t\t\tGetURL(int index) const;\n    virtual\tvoid\t\t\t\t\tGetBoundedSegment(int index, int& start, int& count) const;\n    virtual\tvoid\t\t\t\t\tGetRects(int index, CFX_RectArray& rects)const;\nprotected:\n    void\t\t\t\t\t\t\tparserLink();\n    void\t\t\t\t\t\t\tDeleteLinkList();\n    FX_BOOL\t\t\t\t\t\t\tCheckWebLink(CFX_WideString& strBeCheck);\n    FX_BOOL\t\t\t\t\t\t\tCheckMailLink(CFX_WideString& str);\n    FX_BOOL\t\t\t\t\t\t\tAppendToLinkList(int start, int count, CFX_WideString strUrl);\nprivate:\n    LINK_InfoArray\t\t\t\t\tm_LinkList;\n    const CPDF_TextPage*\t\t\tm_pTextPage;\n    CFX_WideString\t\t\t\t\tm_strPageText;\n    FX_BOOL\t\t\t\t\t\t\tm_IsParserd;\n};\nFX_STRSIZE FX_Unicode_GetNormalization(FX_WCHAR wch, FX_LPWSTR pDst);\nvoid NormalizeString(CFX_WideString& str);\nvoid NormalizeCompositeChar(FX_WCHAR wChar, CFX_WideString& sDest);\n#endif\n"
  },
  {
    "path": "core/src/fpdftext/txtproc.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _PDF_TXTPROC_H_\n#define _PDF_TXTPROC_H_\nclass CTextColumn : public CFX_Object\n{\npublic:\n    FX_FLOAT\tm_AvgPos;\n    int\t\tm_Count;\n    int\t\tm_TextPos;\n};\nclass CTextBox : public CFX_Object\n{\npublic:\n    CFX_WideString\tm_Text;\n    FX_FLOAT\tm_Left;\n    FX_FLOAT\tm_Right;\n    FX_FLOAT\tm_SpaceWidth;\n    FX_FLOAT\tm_Top;\n    FX_FLOAT\tm_Bottom;\n    FX_FLOAT\tm_FontSizeV;\n    CTextColumn* m_pColumn;\n};\nclass CTextBaseLine : public CFX_Object\n{\npublic:\n    CTextBaseLine();\n    ~CTextBaseLine();\n    void\tInsertTextBox(FX_FLOAT leftx, FX_FLOAT rightx, FX_FLOAT topy, FX_FLOAT bottomy,\n                          FX_FLOAT spacew, FX_FLOAT fontsize_v, const CFX_WideString& str);\n    FX_BOOL\tGetWidth(FX_FLOAT& leftx, FX_FLOAT& rightx);\n    FX_BOOL\tCanMerge(CTextBaseLine* pOther);\n    void\tMerge(CTextBaseLine* pOther);\n    void\tMergeBoxes();\n    void\tCountChars(int& count, FX_FLOAT& width, int& minchars);\n    void\tWriteOutput(CFX_WideString& str, FX_FLOAT leftx, FX_FLOAT width, int iWidth);\n    FX_FLOAT\tm_BaseLine;\n    FX_FLOAT\tm_Top;\n    FX_FLOAT\tm_Bottom;\n    FX_FLOAT\tm_MaxFontSizeV;\n    CFX_PtrArray\t\tm_TextList;\n};\nclass CPDF_PageObject;\nclass CPDF_TextObject;\nclass CTextPage : public CFX_Object\n{\npublic:\n    CTextPage();\n    ~CTextPage();\n    void\tProcessObject(CPDF_PageObject* pObj);\n    CTextBaseLine* InsertTextBox(CTextBaseLine* pBaseLine, FX_FLOAT basey, FX_FLOAT leftx,\n                                 FX_FLOAT rightx, FX_FLOAT topy, FX_FLOAT bottomy, FX_FLOAT spacew, FX_FLOAT fontsize_v,\n                                 CFX_ByteString& str, CPDF_Font* pFont);\n    void\tWriteOutput(CFX_WideStringArray& lines, int iMinWidth);\n    FX_BOOL\tm_bAutoWidth;\n    FX_BOOL\tm_bKeepColumn;\n    FX_BOOL\tm_bBreakSpace;\n    FX_BOOL\tm_bOCR;\nprivate:\n    CFX_PtrArray\tm_BaseLines;\n    CFX_PtrArray\tm_TextColumns;\n    void\tFindColumns();\n    CTextColumn*\tFindColumn(FX_FLOAT xpos);\n    void\tBreakSpace(CPDF_TextObject* pTextObj);\n};\n#endif\n"
  },
  {
    "path": "core/src/fpdftext/unicodenormalization.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fpdftext/fpdf_text.h\"\nextern const FX_WCHAR g_UnicodeData_Normalization[65536];\nextern const FX_WCHAR g_UnicodeData_Normalization_Map1[5376];\nextern const FX_WCHAR g_UnicodeData_Normalization_Map2[1734];\nextern const FX_WCHAR g_UnicodeData_Normalization_Map3[1164];\nextern const FX_WCHAR g_UnicodeData_Normalization_Map4[488];\nFX_LPCWSTR g_UnicodeData_Normalization_Maps[5] = {\n    NULL,\n    g_UnicodeData_Normalization_Map1,\n    g_UnicodeData_Normalization_Map2,\n    g_UnicodeData_Normalization_Map3,\n    g_UnicodeData_Normalization_Map4\n};\nFX_STRSIZE FX_Unicode_GetNormalization(FX_WCHAR wch, FX_LPWSTR pDst)\n{\n    wch = wch & 0xFFFF;\n    FX_WCHAR wFind = g_UnicodeData_Normalization[wch];\n    if (!wFind) {\n        if (pDst) {\n            *pDst = wch;\n        }\n        return 1;\n    }\n    if(wFind >= 0x8000) {\n        wch = wFind - 0x8000;\n        wFind = 1;\n    } else {\n        wch = wFind & 0x0FFF;\n        wFind >>= 12;\n    }\n    FX_LPCWSTR pMap = g_UnicodeData_Normalization_Maps[wFind];\n    if (pMap == g_UnicodeData_Normalization_Map4) {\n        pMap = g_UnicodeData_Normalization_Map4 + wch;\n        wFind = (FX_WCHAR)(*pMap ++);\n    } else {\n        pMap += wch;\n    }\n    if (pDst) {\n        FX_WCHAR n = wFind;\n        while (n --) {\n            *pDst ++ = *pMap ++;\n        }\n    }\n    return (FX_STRSIZE)wFind;\n}\nFX_STRSIZE FX_WideString_GetNormalization(FX_WSTR wsSrc, FX_LPWSTR pDst)\n{\n    FX_STRSIZE nCount = 0;\n    for (FX_STRSIZE len = 0; len < wsSrc.GetLength(); len ++) {\n        FX_WCHAR wch = wsSrc.GetAt(len);\n        if(pDst) {\n            nCount += FX_Unicode_GetNormalization(wch, pDst + nCount);\n        } else {\n            nCount += FX_Unicode_GetNormalization(wch, pDst);\n        }\n    }\n    return nCount;\n}\nFX_STRSIZE FX_WideString_GetNormalization(FX_WSTR wsSrc, CFX_WideString &wsDst)\n{\n    FX_STRSIZE nLen = FX_WideString_GetNormalization(wsSrc, (FX_LPWSTR)NULL);\n    if (!nLen) {\n        return 0;\n    }\n    FX_LPWSTR pBuf = wsDst.GetBuffer(nLen);\n    FX_WideString_GetNormalization(wsSrc, pBuf);\n    wsDst.ReleaseBuffer(nLen);\n    return nLen;\n}\n"
  },
  {
    "path": "core/src/fpdftext/unicodenormalizationdata.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxcrt/fx_system.h\"\nextern const FX_WCHAR g_UnicodeData_Normalization[65536] = {\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8001, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2002, 0x8002, 0x0000, 0x2004, 0x0000, 0x0000, 0x8003,\n    0x8004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8005, 0x0000, 0x8006, 0x0000, 0x0000, 0x0000, 0x8007, 0x8008,\n    0x0000, 0x0000, 0x8009, 0x800A, 0x800B, 0x800C, 0x0000, 0x0000, 0x800D, 0x800E, 0x800F, 0x0000, 0x3000, 0x3003, 0x3006, 0x0000,\n    0x8010, 0x8011, 0x8012, 0x8013, 0x8014, 0x8015, 0x0000, 0x8016, 0x8017, 0x8018, 0x8019, 0x801A, 0x801B, 0x801C, 0x801D, 0x801E,\n    0x801F, 0x8020, 0x8021, 0x8022, 0x8023, 0x8024, 0x8025, 0x0000, 0x8026, 0x8027, 0x8028, 0x8029, 0x802A, 0x802B, 0x0000, 0x0000,\n    0x802C, 0x802D, 0x802E, 0x802F, 0x8030, 0x8031, 0x0000, 0x8032, 0x8033, 0x8034, 0x8035, 0x8036, 0x8037, 0x8038, 0x8039, 0x803A,\n    0x0000, 0x803B, 0x803C, 0x803D, 0x803E, 0x803F, 0x8040, 0x0000, 0x8041, 0x8042, 0x8043, 0x8044, 0x8045, 0x8046, 0x0000, 0x8047,\n    0x8048, 0x8049, 0x804A, 0x804B, 0x804C, 0x804D, 0x804E, 0x804F, 0x8050, 0x8051, 0x8052, 0x8053, 0x8054, 0x8055, 0x8056, 0x8057,\n    0x8058, 0x8059, 0x805A, 0x805B, 0x805C, 0x805D, 0x805E, 0x805F, 0x8060, 0x8061, 0x8062, 0x8063, 0x8064, 0x8065, 0x8066, 0x8067,\n    0x8068, 0x8069, 0x806A, 0x806B, 0x806C, 0x806D, 0x806E, 0x806F, 0x8070, 0x8071, 0x8072, 0x8073, 0x8074, 0x8075, 0x8076, 0x8077,\n    0x8078, 0x0000, 0x2006, 0x2008, 0x8079, 0x807A, 0x807B, 0x807C, 0x807D, 0x807E, 0x807F, 0x8080, 0x8081, 0x8082, 0x8083, 0x8084,\n    0x8085, 0x8086, 0x8087, 0x8088, 0x8089, 0x808A, 0x808B, 0x808C, 0x808D, 0x808E, 0x0000, 0x0000, 0x808F, 0x8090, 0x8091, 0x8092,\n    0x8093, 0x8094, 0x200A, 0x200C, 0x8095, 0x8096, 0x8097, 0x8098, 0x8099, 0x809A, 0x809B, 0x809C, 0x809D, 0x809E, 0x809F, 0x80A0,\n    0x80A1, 0x80A2, 0x80A3, 0x80A4, 0x80A5, 0x80A6, 0x80A7, 0x80A8, 0x80A9, 0x80AA, 0x80AB, 0x80AC, 0x80AD, 0x80AE, 0x80AF, 0x80B0,\n    0x80B1, 0x80B2, 0x80B3, 0x80B4, 0x80B5, 0x80B6, 0x80B7, 0x80B8, 0x80B9, 0x80BA, 0x80BB, 0x80BC, 0x80BD, 0x80BE, 0x80BF, 0x80C0,\n    0x80C1, 0x80C2, 0x80C3, 0x80C4, 0x0000, 0x0000, 0x0000, 0x80C5, 0x80C6, 0x80C7, 0x80C8, 0x80C9, 0x80CA, 0x0000, 0x80CB, 0x0000,\n    0x80CC, 0x80CD, 0x80CE, 0x80CF, 0x0000, 0x0000, 0x0000, 0x80D0, 0x80D1, 0x80D2, 0x80D3, 0x0000, 0x80D4, 0x80D5, 0x80D6, 0x80D7,\n    0x80D8, 0x80D9, 0x0000, 0x0000, 0x80DA, 0x80DB, 0x0000, 0x0000, 0x0000, 0x0000, 0x80DC, 0x80DD, 0x80DE, 0x80DF, 0x80E0, 0x80E1,\n    0x80E2, 0x0000, 0x80E3, 0x80E4, 0x80E5, 0x80E6, 0x80E7, 0x0000, 0x80E8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x200E, 0x2010, 0x2012, 0x2014, 0x2016, 0x2018, 0x201A, 0x201C, 0x201E, 0x80E9, 0x80EA, 0x80EB,\n    0x80EC, 0x80ED, 0x80EE, 0x80EF, 0x80F0, 0x80F1, 0x80F2, 0x80F3, 0x80F4, 0x80F5, 0x80F6, 0x80F7, 0x80F8, 0x80F9, 0x80FA, 0x80FB,\n    0x80FC, 0x80FD, 0x80FE, 0x80FF, 0x8100, 0x8101, 0x8102, 0x8103, 0x8104, 0x8105, 0x8106, 0x8107, 0x8108, 0x8109, 0x810A, 0x810B,\n    0x810C, 0x2020, 0x2022, 0x2024, 0x810D, 0x810E, 0x0000, 0x0000, 0x810F, 0x8110, 0x8111, 0x8112, 0x8113, 0x8114, 0x8115, 0x8116,\n    0x8117, 0x8118, 0x8119, 0x811A, 0x811B, 0x811C, 0x811D, 0x811E, 0x811F, 0x8120, 0x8121, 0x8122, 0x8123, 0x8124, 0x8125, 0x8126,\n    0x8127, 0x8128, 0x8129, 0x812A, 0x812B, 0x812C, 0x812D, 0x812E, 0x812F, 0x8130, 0x8131, 0x8132, 0x0000, 0x0000, 0x8133, 0x8134,\n    0x8135, 0x8136, 0x0000, 0x0000, 0x8137, 0x8138, 0x8139, 0x813A, 0x813B, 0x813C, 0x813D, 0x813E, 0x813F, 0x8140, 0x8141, 0x8142,\n    0x8143, 0x8144, 0x8145, 0x8146, 0x8147, 0x8148, 0x8149, 0x814A, 0x2026, 0x2028, 0x814B, 0x814C, 0x814D, 0x814E, 0x814F, 0x8150,\n    0x8151, 0x0000, 0x0000, 0x8152, 0x8153, 0x8154, 0x8155, 0x8156, 0x8157, 0x8158, 0x8159, 0x815A, 0x815B, 0x815C, 0x815D, 0x815E,\n    0x815F, 0x0000, 0x8160, 0x8161, 0x8162, 0x8163, 0x8164, 0x8165, 0x8166, 0x0000, 0x8167, 0x8168, 0x8169, 0x816A, 0x816B, 0x816C,\n    0x816D, 0x816E, 0x816F, 0x0000, 0x0000, 0x8170, 0x8171, 0x0000, 0x8172, 0x0000, 0x8173, 0x8174, 0x8175, 0x8176, 0x0000, 0x8177,\n    0x8178, 0x8179, 0x817A, 0x817B, 0x817C, 0x817D, 0x202A, 0x0000, 0x0000, 0x817E, 0x817F, 0x8180, 0x8181, 0x8182, 0x8183, 0x8184,\n    0x8185, 0x8186, 0x8187, 0x0000, 0x8188, 0x8189, 0x818A, 0x818B, 0x818C, 0x818D, 0x0000, 0x818E, 0x818F, 0x8190, 0x8191, 0x8192,\n    0x8193, 0x8194, 0x0000, 0x8195, 0x0000, 0x0000, 0x0000, 0x8196, 0x0000, 0x8197, 0x8198, 0x8199, 0x819A, 0x819B, 0x819C, 0x819D,\n    0x819E, 0x0000, 0x0000, 0x202C, 0x202E, 0x2030, 0x2032, 0x2034, 0x2036, 0x2038, 0x203A, 0x203C, 0x0000, 0x0000, 0x819F, 0x81A0,\n    0x81A1, 0x81A2, 0x81A3, 0x81A4, 0x81A5, 0x81A6, 0x81A7, 0x81A8, 0x81A9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x81AA, 0x81AB, 0x81AC, 0x81AD, 0x81AE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x81AF, 0x81B0, 0x0000, 0x81B1, 0x81B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x81B3, 0x81B4, 0x81B5, 0x81B6, 0x81B7, 0x81B8, 0x81B9, 0x81BA, 0x81BB, 0x81BC, 0x81BD, 0x81BE, 0x81BF,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x81C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81C1, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x81C2, 0x81C3, 0x81C4, 0x81C5, 0x81C6, 0x81C7, 0x81C8, 0x0000, 0x81C9, 0x0000, 0x81CA, 0x81CB,\n    0x81CC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81CD, 0x81CE, 0x81CF, 0x81D0, 0x81D1, 0x81D2,\n    0x81D3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81D4, 0x81D5, 0x81D6, 0x81D7, 0x81D8, 0x0000,\n    0x81D9, 0x81DA, 0x81DB, 0x81DC, 0x81DD, 0x81DE, 0x81DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x81E0, 0x81E1, 0x81E2, 0x0000, 0x81E3, 0x81E4, 0x0000, 0x0000, 0x0000, 0x81E5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x81E6, 0x81E7, 0x0000, 0x81E8, 0x0000, 0x0000, 0x0000, 0x81E9, 0x0000, 0x0000, 0x0000, 0x0000, 0x81EA, 0x81EB, 0x81EC, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81ED, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81EE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x81EF, 0x81F0, 0x0000, 0x81F1, 0x0000, 0x0000, 0x0000, 0x81F2, 0x0000, 0x0000, 0x0000, 0x0000, 0x81F3, 0x81F4, 0x81F5, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81F6, 0x81F7, 0x0000, 0x0000, 0x81F8, 0x81F9, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81FA, 0x81FB, 0x0000, 0x0000, 0x0000, 0x0000, 0x81FC, 0x81FD, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81FE, 0x81FF, 0x0000, 0x0000, 0x8200, 0x8201,\n    0x8202, 0x8203, 0x8204, 0x8205, 0x8206, 0x8207, 0x8208, 0x8209, 0x820A, 0x820B, 0x820C, 0x820D, 0x820E, 0x820F, 0x8210, 0x8211,\n    0x8212, 0x8213, 0x8214, 0x8215, 0x203E, 0x2040, 0x8216, 0x8217, 0x0000, 0x0000, 0x8218, 0x8219, 0x821A, 0x821B, 0x0000, 0x0000,\n    0x821C, 0x821D, 0x821E, 0x821F, 0x2042, 0x2044, 0x8220, 0x8221, 0x8222, 0x8223, 0x0000, 0x0000, 0x8224, 0x8225, 0x8226, 0x8227,\n    0x0000, 0x8228, 0x8229, 0x822A, 0x822B, 0x822C, 0x822D, 0x822E, 0x822F, 0x8230, 0x8231, 0x0000, 0x0000, 0x8232, 0x8233, 0x0000,\n    0x8234, 0x8235, 0x8236, 0x8237, 0x2046, 0x2048, 0x8238, 0x8239, 0x0000, 0x0000, 0x823A, 0x823B, 0x823C, 0x823D, 0x823E, 0x823F,\n    0x0000, 0x0000, 0x8240, 0x8241, 0x8242, 0x8243, 0x8244, 0x8245, 0x0000, 0x0000, 0x8246, 0x8247, 0x8248, 0x8249, 0x824A, 0x824B,\n    0x824C, 0x824D, 0x824E, 0x824F, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8256, 0x8257, 0x8258, 0x8259, 0x825A, 0x825B,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x825C, 0x825D, 0x825E, 0x825F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x204A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x204C, 0x204E, 0x2050, 0x2052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x2054, 0x0000, 0x2056, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x2058, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x205A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x205C, 0x0000, 0x0000, 0x205E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2060, 0x2062, 0x2064, 0x2066, 0x2068, 0x206A, 0x206C, 0x206E,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2070, 0x2072, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2074, 0x2076, 0x0000, 0x2078,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x207A, 0x0000, 0x0000, 0x207C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x207E, 0x2080, 0x2082, 0x0000, 0x0000, 0x2084, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2086, 0x0000, 0x0000, 0x2088, 0x208A, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x208C, 0x208E, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x2090, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2092, 0x2094, 0x2096, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2098, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x209A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x209C, 0x209E, 0x0000, 0x20A0, 0x20A2, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20A4, 0x20A6, 0x20A8, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20AA, 0x0000, 0x20AC, 0x20AE, 0x20B0, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x20B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x20B4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20B6, 0x20B8, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8260, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x20BA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20BC, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x20BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x20C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x20C2, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20C4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x20C6, 0x0000, 0x20C8, 0x20CA, 0x20CC, 0x20CE, 0x20D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x20D2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x20D4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20D6, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x20D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x20DA, 0x0000, 0x0000, 0x0000, 0x0000, 0x20DC, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20DE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8261, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20E2, 0x0000, 0x20E4, 0x0000, 0x20E6, 0x0000, 0x20E8, 0x0000, 0x20EA, 0x0000,\n    0x0000, 0x0000, 0x20EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20EE, 0x0000, 0x20F0, 0x0000, 0x0000,\n    0x20F2, 0x20F4, 0x0000, 0x20F6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8262, 0x8263, 0x8264, 0x8265,\n    0x8266, 0x8267, 0x8268, 0x8269, 0x826A, 0x826B, 0x826C, 0x826D, 0x826E, 0x826F, 0x8270, 0x0000, 0x8271, 0x8272, 0x8273, 0x8274,\n    0x8275, 0x8276, 0x8277, 0x8278, 0x8279, 0x827A, 0x827B, 0x827C, 0x827D, 0x827E, 0x827F, 0x8280, 0x8281, 0x8282, 0x0000, 0x8283,\n    0x8284, 0x8285, 0x8286, 0x8287, 0x8288, 0x8289, 0x828A, 0x828B, 0x828C, 0x828D, 0x828E, 0x828F, 0x8290, 0x8291, 0x8292, 0x8293,\n    0x8294, 0x8295, 0x8296, 0x8297, 0x8298, 0x8299, 0x829A, 0x829B, 0x829C, 0x829D, 0x829E, 0x0000, 0x829F, 0x82A0, 0x82A1, 0x82A2,\n    0x82A3, 0x82A4, 0x82A5, 0x82A6, 0x82A7, 0x82A8, 0x82A9, 0x82AA, 0x82AB, 0x0000, 0x20F8, 0x82AC, 0x0000, 0x82AD, 0x82AE, 0x82AF,\n    0x82B0, 0x82B1, 0x82B2, 0x82B3, 0x82B4, 0x82B5, 0x82B6, 0x82B7, 0x82B8, 0x82B9, 0x82BA, 0x82BB, 0x82BC, 0x82BD, 0x82BE, 0x82BF,\n    0x82C0, 0x82C1, 0x82C2, 0x82C3, 0x82C4, 0x82C5, 0x82C6, 0x0000, 0x82C7, 0x0000, 0x0000, 0x82C8, 0x82C9, 0x82CA, 0x82CB, 0x82CC,\n    0x82CD, 0x82CE, 0x82CF, 0x82D0, 0x82D1, 0x82D2, 0x82D3, 0x82D4, 0x82D5, 0x82D6, 0x82D7, 0x82D8, 0x82D9, 0x82DA, 0x82DB, 0x82DC,\n    0x82DD, 0x82DE, 0x82DF, 0x82E0, 0x82E1, 0x82E2, 0x82E3, 0x82E4, 0x82E5, 0x82E6, 0x82E7, 0x82E8, 0x82E9, 0x82EA, 0x82EB, 0x82EC,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x82ED, 0x82EE, 0x82EF, 0x82F0, 0x82F1, 0x82F2, 0x82F3, 0x82F4, 0x82F5, 0x82F6, 0x82F7, 0x82F8, 0x82F9, 0x82FA, 0x82FB, 0x82FC,\n    0x82FD, 0x82FE, 0x82FF, 0x8300, 0x8301, 0x8302, 0x8303, 0x8304, 0x8305, 0x8306, 0x8307, 0x8308, 0x8309, 0x830A, 0x830B, 0x830C,\n    0x830D, 0x830E, 0x830F, 0x8310, 0x8311, 0x8312, 0x8313, 0x8314, 0x8315, 0x8316, 0x8317, 0x8318, 0x8319, 0x831A, 0x831B, 0x831C,\n    0x831D, 0x831E, 0x831F, 0x8320, 0x8321, 0x8322, 0x8323, 0x8324, 0x8325, 0x8326, 0x8327, 0x8328, 0x8329, 0x832A, 0x832B, 0x832C,\n    0x832D, 0x832E, 0x832F, 0x8330, 0x8331, 0x8332, 0x8333, 0x8334, 0x8335, 0x8336, 0x8337, 0x8338, 0x8339, 0x833A, 0x833B, 0x833C,\n    0x833D, 0x833E, 0x833F, 0x8340, 0x8341, 0x8342, 0x8343, 0x8344, 0x8345, 0x8346, 0x8347, 0x8348, 0x8349, 0x834A, 0x834B, 0x834C,\n    0x834D, 0x834E, 0x834F, 0x8350, 0x8351, 0x8352, 0x8353, 0x8354, 0x8355, 0x8356, 0x8357, 0x8358, 0x8359, 0x835A, 0x835B, 0x835C,\n    0x835D, 0x835E, 0x835F, 0x8360, 0x8361, 0x8362, 0x8363, 0x8364, 0x8365, 0x8366, 0x8367, 0x8368, 0x8369, 0x836A, 0x836B, 0x836C,\n    0x836D, 0x836E, 0x836F, 0x8370, 0x8371, 0x8372, 0x8373, 0x8374, 0x8375, 0x8376, 0x8377, 0x8378, 0x8379, 0x837A, 0x837B, 0x837C,\n    0x837D, 0x837E, 0x837F, 0x8380, 0x8381, 0x8382, 0x8383, 0x8384, 0x8385, 0x8386, 0x8387, 0x8388, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8389, 0x838A, 0x838B, 0x838C, 0x838D, 0x838E, 0x838F, 0x8390, 0x8391, 0x8392, 0x8393, 0x8394, 0x8395, 0x8396, 0x8397, 0x8398,\n    0x8399, 0x839A, 0x839B, 0x839C, 0x839D, 0x839E, 0x839F, 0x83A0, 0x83A1, 0x83A2, 0x83A3, 0x83A4, 0x83A5, 0x83A6, 0x83A7, 0x83A8,\n    0x83A9, 0x83AA, 0x83AB, 0x83AC, 0x83AD, 0x83AE, 0x83AF, 0x83B0, 0x83B1, 0x83B2, 0x83B3, 0x83B4, 0x83B5, 0x83B6, 0x83B7, 0x83B8,\n    0x83B9, 0x83BA, 0x83BB, 0x83BC, 0x83BD, 0x83BE, 0x83BF, 0x83C0, 0x83C1, 0x83C2, 0x83C3, 0x83C4, 0x83C5, 0x83C6, 0x83C7, 0x83C8,\n    0x83C9, 0x83CA, 0x83CB, 0x83CC, 0x83CD, 0x83CE, 0x83CF, 0x83D0, 0x83D1, 0x83D2, 0x83D3, 0x83D4, 0x83D5, 0x83D6, 0x83D7, 0x83D8,\n    0x83D9, 0x83DA, 0x83DB, 0x83DC, 0x83DD, 0x83DE, 0x83DF, 0x83E0, 0x83E1, 0x83E2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x83E3, 0x83E4, 0x83E5, 0x83E6, 0x83E7, 0x83E8, 0x83E9, 0x83EA, 0x83EB, 0x83EC, 0x83ED, 0x83EE, 0x83EF, 0x83F0, 0x83F1, 0x83F2,\n    0x83F3, 0x83F4, 0x83F5, 0x83F6, 0x83F7, 0x83F8, 0x0000, 0x0000, 0x83F9, 0x83FA, 0x83FB, 0x83FC, 0x83FD, 0x83FE, 0x0000, 0x0000,\n    0x83FF, 0x8400, 0x8401, 0x8402, 0x8403, 0x8404, 0x8405, 0x8406, 0x8407, 0x8408, 0x8409, 0x840A, 0x840B, 0x840C, 0x840D, 0x840E,\n    0x840F, 0x8410, 0x8411, 0x8412, 0x8413, 0x8414, 0x8415, 0x8416, 0x8417, 0x8418, 0x8419, 0x841A, 0x841B, 0x841C, 0x841D, 0x841E,\n    0x841F, 0x8420, 0x8421, 0x8422, 0x8423, 0x8424, 0x0000, 0x0000, 0x8425, 0x8426, 0x8427, 0x8428, 0x8429, 0x842A, 0x0000, 0x0000,\n    0x842B, 0x842C, 0x842D, 0x842E, 0x842F, 0x8430, 0x8431, 0x8432, 0x0000, 0x8433, 0x0000, 0x8434, 0x0000, 0x8435, 0x0000, 0x8436,\n    0x8437, 0x8438, 0x8439, 0x843A, 0x843B, 0x843C, 0x843D, 0x843E, 0x843F, 0x8440, 0x8441, 0x8442, 0x8443, 0x8444, 0x8445, 0x8446,\n    0x8447, 0x8448, 0x8449, 0x844A, 0x844B, 0x844C, 0x844D, 0x844E, 0x844F, 0x8450, 0x8451, 0x8452, 0x8453, 0x8454, 0x0000, 0x0000,\n    0x8455, 0x8456, 0x8457, 0x8458, 0x8459, 0x845A, 0x845B, 0x845C, 0x845D, 0x845E, 0x845F, 0x8460, 0x8461, 0x8462, 0x8463, 0x8464,\n    0x8465, 0x8466, 0x8467, 0x8468, 0x8469, 0x846A, 0x846B, 0x846C, 0x846D, 0x846E, 0x846F, 0x8470, 0x8471, 0x8472, 0x8473, 0x8474,\n    0x8475, 0x8476, 0x8477, 0x8478, 0x8479, 0x847A, 0x847B, 0x847C, 0x847D, 0x847E, 0x847F, 0x8480, 0x8481, 0x8482, 0x8483, 0x8484,\n    0x8485, 0x8486, 0x8487, 0x8488, 0x8489, 0x0000, 0x848A, 0x848B, 0x848C, 0x848D, 0x848E, 0x848F, 0x8490, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8491, 0x8492, 0x8493, 0x0000, 0x8494, 0x8495, 0x8496, 0x8497, 0x8498, 0x8499, 0x849A, 0x0000, 0x0000, 0x0000,\n    0x849B, 0x849C, 0x849D, 0x849E, 0x0000, 0x0000, 0x849F, 0x84A0, 0x84A1, 0x84A2, 0x84A3, 0x84A4, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x84A5, 0x84A6, 0x84A7, 0x84A8, 0x84A9, 0x84AA, 0x84AB, 0x84AC, 0x84AD, 0x84AE, 0x84AF, 0x84B0, 0x84B1, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x84B2, 0x84B3, 0x84B4, 0x0000, 0x84B5, 0x84B6, 0x84B7, 0x84B8, 0x84B9, 0x84BA, 0x84BB, 0x84BC, 0x84BD, 0x0000,\n    0x84BE, 0x84BF, 0x84C0, 0x84C1, 0x84C2, 0x84C3, 0x84C4, 0x84C5, 0x84C6, 0x84C7, 0x84C8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x84C9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x84CA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x84CB, 0x20FA, 0x3009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x84CC,\n    0x0000, 0x0000, 0x0000, 0x20FC, 0x300C, 0x0000, 0x20FE, 0x300F, 0x0000, 0x0000, 0x0000, 0x0000, 0x2100, 0x0000, 0x2102, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2104, 0x2106, 0x2108, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x84CD,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x84CE, 0x84CF, 0x0000, 0x0000, 0x84D0, 0x84D1, 0x84D2, 0x84D3, 0x84D4, 0x84D5, 0x84D6, 0x84D7, 0x84D8, 0x84D9, 0x84DA, 0x84DB,\n    0x84DC, 0x84DD, 0x84DE, 0x84DF, 0x84E0, 0x84E1, 0x84E2, 0x84E3, 0x84E4, 0x84E5, 0x84E6, 0x84E7, 0x84E8, 0x84E9, 0x84EA, 0x0000,\n    0x84EB, 0x84EC, 0x84ED, 0x84EE, 0x84EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x210A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x3012, 0x3015, 0x84F0, 0x210C, 0x0000, 0x3018, 0x301B, 0x84F1, 0x0000, 0x210E, 0x84F2, 0x84F3, 0x84F4, 0x84F5, 0x84F6, 0x84F7,\n    0x84F8, 0x84F9, 0x84FA, 0x84FB, 0x0000, 0x84FC, 0x2110, 0x0000, 0x0000, 0x84FD, 0x84FE, 0x84FF, 0x8500, 0x8501, 0x8502, 0x8503,\n    0x2112, 0x301E, 0x2114, 0x8504, 0x8505, 0x0000, 0x8506, 0x8507, 0x8508, 0x0000, 0x8509, 0x850A, 0x850B, 0x850C, 0x850D, 0x850E,\n    0x850F, 0x8510, 0x0000, 0x8511, 0x8512, 0x8513, 0x8514, 0x8515, 0x8516, 0x8517, 0x0000, 0x3021, 0x8518, 0x8519, 0x851A, 0x851B,\n    0x851C, 0x0000, 0x0000, 0x0000, 0x0000, 0x851D, 0x851E, 0x851F, 0x8520, 0x8521, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x3024, 0x3027, 0x4005, 0x302A, 0x302D, 0x3030, 0x3033, 0x3036, 0x3039, 0x303C, 0x303F, 0x3042, 0x3045, 0x3048, 0x304B, 0x2116,\n    0x8522, 0x2118, 0x304E, 0x211A, 0x8523, 0x211C, 0x3051, 0x400A, 0x211E, 0x8524, 0x2120, 0x3054, 0x8525, 0x8526, 0x8527, 0x8528,\n    0x8529, 0x2122, 0x3057, 0x2124, 0x852A, 0x2126, 0x305A, 0x400F, 0x2128, 0x852B, 0x212A, 0x305D, 0x852C, 0x852D, 0x852E, 0x852F,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x212C, 0x212E, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2130, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2132, 0x2134, 0x2136,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8530, 0x0000, 0x0000, 0x0000, 0x0000, 0x8531, 0x0000, 0x0000, 0x8532, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x2138, 0x0000, 0x213A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x213C, 0x3063, 0x0000, 0x213E,\n    0x3066, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x2140, 0x0000, 0x0000, 0x2142, 0x0000, 0x0000, 0x2144, 0x0000, 0x2146, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x2148, 0x0000, 0x214A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x214C, 0x214E, 0x2150,\n    0x2152, 0x2154, 0x0000, 0x0000, 0x2156, 0x2158, 0x0000, 0x0000, 0x215A, 0x215C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x215E, 0x2160, 0x0000, 0x0000, 0x2162, 0x2164, 0x0000, 0x0000, 0x2166, 0x2168, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x216A, 0x216C, 0x216E, 0x2170,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x2172, 0x2174, 0x2176, 0x2178, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x217A, 0x217C, 0x217E, 0x2180, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8533, 0x8534, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x3069, 0x306C, 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x2182, 0x2184, 0x2186, 0x2188, 0x218A, 0x218C, 0x218E, 0x2190,\n    0x3081, 0x3084, 0x3087, 0x308A, 0x308D, 0x3090, 0x3093, 0x3096, 0x3099, 0x2192, 0x309C, 0x309F, 0x2194, 0x2196, 0x2198, 0x219A,\n    0x219C, 0x30A2, 0x8535, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8536, 0x8537, 0x8538, 0x8539, 0x853A, 0x853B, 0x853C, 0x853D, 0x853E, 0x219E, 0x21A0, 0x21A2, 0x21A4, 0x21A6, 0x21A8, 0x21AA,\n    0x21AC, 0x21AE, 0x21B0, 0x21B2, 0x30A5, 0x30A8, 0x30AB, 0x30AE, 0x30B1, 0x30B4, 0x30B7, 0x30BA, 0x30BD, 0x4014, 0x4019, 0x401E,\n    0x4023, 0x4028, 0x402D, 0x4032, 0x4037, 0x403C, 0x4041, 0x4046, 0x21B4, 0x21B6, 0x21B8, 0x21BA, 0x21BC, 0x21BE, 0x21C0, 0x21C2,\n    0x21C4, 0x30C0, 0x30C3, 0x30C6, 0x30C9, 0x30CC, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30E1, 0x30E4, 0x30E7, 0x30EA,\n    0x30ED, 0x30F0, 0x30F3, 0x30F6, 0x30F9, 0x30FC, 0x30FF, 0x3102, 0x3105, 0x3108, 0x310B, 0x310E, 0x3111, 0x3114, 0x3117, 0x311A,\n    0x311D, 0x3120, 0x3123, 0x3126, 0x3129, 0x312C, 0x853F, 0x8540, 0x8541, 0x8542, 0x8543, 0x8544, 0x8545, 0x8546, 0x8547, 0x8548,\n    0x8549, 0x854A, 0x854B, 0x854C, 0x854D, 0x854E, 0x854F, 0x8550, 0x8551, 0x8552, 0x8553, 0x8554, 0x8555, 0x8556, 0x8557, 0x8558,\n    0x8559, 0x855A, 0x855B, 0x855C, 0x855D, 0x855E, 0x855F, 0x8560, 0x8561, 0x8562, 0x8563, 0x8564, 0x8565, 0x8566, 0x8567, 0x8568,\n    0x8569, 0x856A, 0x856B, 0x856C, 0x856D, 0x856E, 0x856F, 0x8570, 0x8571, 0x8572, 0x8573, 0x21C6, 0x21C8, 0x21CA, 0x21CC, 0x21CE,\n    0x21D0, 0x21D2, 0x21D4, 0x21D6, 0x21D8, 0x8574, 0x8575, 0x8576, 0x8577, 0x8578, 0x8579, 0x857A, 0x857B, 0x857C, 0x21DA, 0x857D,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x857E, 0x857F, 0x8580, 0x8581, 0x8582, 0x8583, 0x8584, 0x8585, 0x8586, 0x21DC,\n    0x8587, 0x8588, 0x8589, 0x858A, 0x858B, 0x858C, 0x858D, 0x858E, 0x858F, 0x21DE, 0x8590, 0x8591, 0x8592, 0x8593, 0x8594, 0x8595,\n    0x8596, 0x8597, 0x8598, 0x21E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x404B, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x312F, 0x21E2, 0x3132, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x21E4, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8599, 0x859A, 0x859B, 0x859C, 0x859D, 0x859E, 0x859F, 0x85A0, 0x85A1, 0x85A2, 0x85A3, 0x85A4, 0x85A5, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x85A6, 0x85A7, 0x85A8, 0x85A9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x85AA, 0x85AB, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x85AC,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x85AD,\n    0x85AE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x85AF, 0x0000, 0x0000, 0x85B0, 0x0000, 0x85B1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x85B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x85B3, 0x0000, 0x0000, 0x0000, 0x0000, 0x85B4, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x85B5, 0x85B6, 0x0000, 0x0000, 0x0000, 0x85B7, 0x85B8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x85B9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x85BA, 0x85BB, 0x85BC, 0x85BD, 0x85BE, 0x85BF, 0x85C0, 0x85C1, 0x85C2, 0x85C3, 0x85C4, 0x85C5, 0x85C6, 0x85C7, 0x85C8, 0x85C9,\n    0x85CA, 0x85CB, 0x85CC, 0x85CD, 0x85CE, 0x85CF, 0x85D0, 0x85D1, 0x85D2, 0x85D3, 0x85D4, 0x85D5, 0x85D6, 0x85D7, 0x85D8, 0x85D9,\n    0x85DA, 0x85DB, 0x85DC, 0x85DD, 0x85DE, 0x85DF, 0x85E0, 0x85E1, 0x85E2, 0x85E3, 0x85E4, 0x85E5, 0x85E6, 0x85E7, 0x85E8, 0x85E9,\n    0x85EA, 0x85EB, 0x85EC, 0x85ED, 0x85EE, 0x85EF, 0x85F0, 0x85F1, 0x85F2, 0x85F3, 0x85F4, 0x85F5, 0x85F6, 0x85F7, 0x85F8, 0x85F9,\n    0x85FA, 0x85FB, 0x85FC, 0x85FD, 0x85FE, 0x85FF, 0x8600, 0x8601, 0x8602, 0x8603, 0x8604, 0x8605, 0x8606, 0x8607, 0x8608, 0x8609,\n    0x860A, 0x860B, 0x860C, 0x860D, 0x860E, 0x860F, 0x8610, 0x8611, 0x8612, 0x8613, 0x8614, 0x8615, 0x8616, 0x8617, 0x8618, 0x8619,\n    0x861A, 0x861B, 0x861C, 0x861D, 0x861E, 0x861F, 0x8620, 0x8621, 0x8622, 0x8623, 0x8624, 0x8625, 0x8626, 0x8627, 0x8628, 0x8629,\n    0x862A, 0x862B, 0x862C, 0x862D, 0x862E, 0x862F, 0x8630, 0x8631, 0x8632, 0x8633, 0x8634, 0x8635, 0x8636, 0x8637, 0x8638, 0x8639,\n    0x863A, 0x863B, 0x863C, 0x863D, 0x863E, 0x863F, 0x8640, 0x8641, 0x8642, 0x8643, 0x8644, 0x8645, 0x8646, 0x8647, 0x8648, 0x8649,\n    0x864A, 0x864B, 0x864C, 0x864D, 0x864E, 0x864F, 0x8650, 0x8651, 0x8652, 0x8653, 0x8654, 0x8655, 0x8656, 0x8657, 0x8658, 0x8659,\n    0x865A, 0x865B, 0x865C, 0x865D, 0x865E, 0x865F, 0x8660, 0x8661, 0x8662, 0x8663, 0x8664, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669,\n    0x866A, 0x866B, 0x866C, 0x866D, 0x866E, 0x866F, 0x8670, 0x8671, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676, 0x8677, 0x8678, 0x8679,\n    0x867A, 0x867B, 0x867C, 0x867D, 0x867E, 0x867F, 0x8680, 0x8681, 0x8682, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688, 0x8689,\n    0x868A, 0x868B, 0x868C, 0x868D, 0x868E, 0x868F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8690, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8691, 0x0000, 0x8692, 0x8693, 0x8694, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x21E6, 0x0000, 0x21E8, 0x0000,\n    0x21EA, 0x0000, 0x21EC, 0x0000, 0x21EE, 0x0000, 0x21F0, 0x0000, 0x21F2, 0x0000, 0x21F4, 0x0000, 0x21F6, 0x0000, 0x21F8, 0x0000,\n    0x21FA, 0x0000, 0x21FC, 0x0000, 0x0000, 0x21FE, 0x0000, 0x2200, 0x0000, 0x2202, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x2204, 0x2206, 0x0000, 0x2208, 0x220A, 0x0000, 0x220C, 0x220E, 0x0000, 0x2210, 0x2212, 0x0000, 0x2214, 0x2216, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x2218, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x221A, 0x221C, 0x0000, 0x221E, 0x2220,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2222, 0x0000, 0x2224, 0x0000,\n    0x2226, 0x0000, 0x2228, 0x0000, 0x222A, 0x0000, 0x222C, 0x0000, 0x222E, 0x0000, 0x2230, 0x0000, 0x2232, 0x0000, 0x2234, 0x0000,\n    0x2236, 0x0000, 0x2238, 0x0000, 0x0000, 0x223A, 0x0000, 0x223C, 0x0000, 0x223E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x2240, 0x2242, 0x0000, 0x2244, 0x2246, 0x0000, 0x2248, 0x224A, 0x0000, 0x224C, 0x224E, 0x0000, 0x2250, 0x2252, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x2254, 0x0000, 0x0000, 0x2256, 0x2258, 0x225A, 0x225C, 0x0000, 0x0000, 0x0000, 0x225E, 0x2260,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8695, 0x8696, 0x8697, 0x8698, 0x8699, 0x869A, 0x869B, 0x869C, 0x869D, 0x869E, 0x869F, 0x86A0, 0x86A1, 0x86A2, 0x86A3,\n    0x86A4, 0x86A5, 0x86A6, 0x86A7, 0x86A8, 0x86A9, 0x86AA, 0x86AB, 0x86AC, 0x86AD, 0x86AE, 0x86AF, 0x86B0, 0x86B1, 0x86B2, 0x86B3,\n    0x86B4, 0x86B5, 0x86B6, 0x86B7, 0x86B8, 0x86B9, 0x86BA, 0x86BB, 0x86BC, 0x86BD, 0x86BE, 0x86BF, 0x86C0, 0x86C1, 0x86C2, 0x86C3,\n    0x86C4, 0x86C5, 0x86C6, 0x86C7, 0x86C8, 0x86C9, 0x86CA, 0x86CB, 0x86CC, 0x86CD, 0x86CE, 0x86CF, 0x86D0, 0x86D1, 0x86D2, 0x86D3,\n    0x86D4, 0x86D5, 0x86D6, 0x86D7, 0x86D8, 0x86D9, 0x86DA, 0x86DB, 0x86DC, 0x86DD, 0x86DE, 0x86DF, 0x86E0, 0x86E1, 0x86E2, 0x86E3,\n    0x86E4, 0x86E5, 0x86E6, 0x86E7, 0x86E8, 0x86E9, 0x86EA, 0x86EB, 0x86EC, 0x86ED, 0x86EE, 0x86EF, 0x86F0, 0x86F1, 0x86F2, 0x0000,\n    0x0000, 0x0000, 0x86F3, 0x86F4, 0x86F5, 0x86F6, 0x86F7, 0x86F8, 0x86F9, 0x86FA, 0x86FB, 0x86FC, 0x86FD, 0x86FE, 0x86FF, 0x8700,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x3135, 0x3138, 0x313B, 0x313E, 0x3141, 0x3144, 0x3147, 0x314A, 0x314D, 0x3150, 0x3153, 0x3156, 0x3159, 0x315C, 0x4050, 0x4055,\n    0x405A, 0x405F, 0x4064, 0x4069, 0x406E, 0x4073, 0x4078, 0x407D, 0x4082, 0x4087, 0x408C, 0x4091, 0x4096, 0x409B, 0x40A3, 0x0000,\n    0x315F, 0x3162, 0x3165, 0x3168, 0x316B, 0x316E, 0x3171, 0x3174, 0x3177, 0x317A, 0x317D, 0x3180, 0x3183, 0x3186, 0x3189, 0x318C,\n    0x318F, 0x3192, 0x3195, 0x3198, 0x319B, 0x319E, 0x31A1, 0x31A4, 0x31A7, 0x31AA, 0x31AD, 0x31B0, 0x31B3, 0x31B6, 0x31B9, 0x31BC,\n    0x31BF, 0x31C2, 0x31C5, 0x31C8, 0x8701, 0x8702, 0x8703, 0x8704, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x31CB, 0x2262, 0x2264, 0x2266, 0x2268, 0x226A, 0x226C, 0x226E, 0x2270, 0x2272, 0x2274, 0x2276, 0x2278, 0x227A, 0x227C, 0x227E,\n    0x8705, 0x8706, 0x8707, 0x8708, 0x8709, 0x870A, 0x870B, 0x870C, 0x870D, 0x870E, 0x870F, 0x8710, 0x8711, 0x8712, 0x2280, 0x2282,\n    0x2284, 0x2286, 0x2288, 0x228A, 0x228C, 0x228E, 0x2290, 0x2292, 0x2294, 0x2296, 0x2298, 0x229A, 0x40AA, 0x40B0, 0x229C, 0x0000,\n    0x8713, 0x8714, 0x8715, 0x8716, 0x8717, 0x8718, 0x8719, 0x871A, 0x871B, 0x871C, 0x871D, 0x871E, 0x871F, 0x8720, 0x8721, 0x8722,\n    0x8723, 0x8724, 0x8725, 0x8726, 0x8727, 0x8728, 0x8729, 0x872A, 0x872B, 0x872C, 0x872D, 0x872E, 0x872F, 0x8730, 0x8731, 0x8732,\n    0x8733, 0x8734, 0x8735, 0x8736, 0x8737, 0x8738, 0x8739, 0x873A, 0x873B, 0x873C, 0x873D, 0x873E, 0x873F, 0x8740, 0x8741, 0x8742,\n    0x8743, 0x229E, 0x22A0, 0x22A2, 0x22A4, 0x22A6, 0x22A8, 0x22AA, 0x22AC, 0x22AE, 0x22B0, 0x22B2, 0x22B4, 0x22B6, 0x22B8, 0x22BA,\n    0x22BC, 0x22BE, 0x22C0, 0x22C2, 0x22C4, 0x22C6, 0x22C8, 0x22CA, 0x22CC, 0x31CE, 0x31D1, 0x31D4, 0x22CE, 0x31D7, 0x22D0, 0x31DA,\n    0x8744, 0x8745, 0x8746, 0x8747, 0x8748, 0x8749, 0x874A, 0x874B, 0x874C, 0x874D, 0x874E, 0x874F, 0x8750, 0x8751, 0x8752, 0x8753,\n    0x8754, 0x8755, 0x8756, 0x8757, 0x8758, 0x8759, 0x875A, 0x875B, 0x875C, 0x875D, 0x875E, 0x875F, 0x8760, 0x8761, 0x8762, 0x8763,\n    0x8764, 0x8765, 0x8766, 0x8767, 0x8768, 0x8769, 0x876A, 0x876B, 0x876C, 0x876D, 0x876E, 0x876F, 0x8770, 0x8771, 0x8772, 0x0000,\n    0x40B5, 0x40BA, 0x40BF, 0x31DD, 0x40C4, 0x31E0, 0x31E3, 0x40C9, 0x40CF, 0x31E6, 0x31E9, 0x31EC, 0x40D4, 0x40D9, 0x31EF, 0x31F2,\n    0x22D2, 0x31F5, 0x40DE, 0x40E3, 0x22D4, 0x40E8, 0x40EE, 0x40F5, 0x31F8, 0x40FB, 0x4101, 0x4107, 0x31FB, 0x31FE, 0x3201, 0x410C,\n    0x4111, 0x4117, 0x3204, 0x3207, 0x320A, 0x22D6, 0x22D8, 0x22DA, 0x22DC, 0x320D, 0x3210, 0x411C, 0x3213, 0x4122, 0x4127, 0x3216,\n    0x22DE, 0x22E0, 0x412D, 0x4133, 0x4138, 0x3219, 0x413E, 0x22E2, 0x321C, 0x321F, 0x3222, 0x3225, 0x3228, 0x4144, 0x322B, 0x22E4,\n    0x322E, 0x3231, 0x3234, 0x4149, 0x3237, 0x323A, 0x323D, 0x414E, 0x4154, 0x22E6, 0x4159, 0x22E8, 0x415F, 0x4164, 0x3240, 0x3243,\n    0x3246, 0x4169, 0x22EA, 0x3249, 0x416E, 0x22EC, 0x4173, 0x324C, 0x22EE, 0x22F0, 0x22F2, 0x22F4, 0x22F6, 0x22F8, 0x22FA, 0x22FC,\n    0x22FE, 0x2300, 0x324F, 0x3252, 0x3255, 0x3258, 0x325B, 0x325E, 0x3261, 0x3264, 0x3267, 0x326A, 0x326D, 0x3270, 0x3273, 0x3276,\n    0x3279, 0x327C, 0x2302, 0x2304, 0x327F, 0x2306, 0x2308, 0x230A, 0x3282, 0x3285, 0x230C, 0x230E, 0x2310, 0x2312, 0x2314, 0x4179,\n    0x2316, 0x2318, 0x231A, 0x231C, 0x231E, 0x2320, 0x2322, 0x2324, 0x3288, 0x417E, 0x2326, 0x2328, 0x232A, 0x232C, 0x232E, 0x2330,\n    0x2332, 0x328B, 0x328E, 0x3291, 0x3294, 0x2334, 0x2336, 0x2338, 0x233A, 0x233C, 0x233E, 0x2340, 0x2342, 0x2344, 0x2346, 0x3297,\n    0x329A, 0x2348, 0x329D, 0x32A0, 0x32A3, 0x234A, 0x32A6, 0x32A9, 0x4183, 0x234C, 0x32AC, 0x32AF, 0x32B2, 0x32B5, 0x4188, 0x418E,\n    0x234E, 0x2350, 0x2352, 0x2354, 0x2356, 0x2358, 0x235A, 0x235C, 0x235E, 0x2360, 0x2362, 0x2364, 0x2366, 0x2368, 0x236A, 0x236C,\n    0x236E, 0x2370, 0x4195, 0x2372, 0x2374, 0x2376, 0x419A, 0x32B8, 0x2378, 0x237A, 0x237C, 0x237E, 0x2380, 0x2382, 0x2384, 0x2386,\n    0x2388, 0x238A, 0x32BB, 0x238C, 0x238E, 0x32BE, 0x32C1, 0x2390, 0x419F, 0x32C4, 0x2392, 0x2394, 0x2396, 0x2398, 0x32C7, 0x32CA,\n    0x239A, 0x239C, 0x239E, 0x23A0, 0x23A2, 0x23A4, 0x23A6, 0x23A8, 0x23AA, 0x32CD, 0x32D0, 0x32D3, 0x32D6, 0x32D9, 0x32DC, 0x32DF,\n    0x32E2, 0x32E5, 0x32E8, 0x32EB, 0x32EE, 0x32F1, 0x32F4, 0x32F7, 0x32FA, 0x32FD, 0x3300, 0x3303, 0x3306, 0x3309, 0x330C, 0x330F,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8773,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8774, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8775, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8776, 0x0000,\n    0x0000, 0x0000, 0x8777, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8778, 0x0000, 0x0000, 0x0000, 0x0000, 0x8779, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x877A, 0x877B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x877C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x877D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x877E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x877F, 0x8780, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8781, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8782, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8783, 0x0000, 0x0000, 0x8784, 0x0000, 0x8785, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8786, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8787, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8788, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8789, 0x878A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x878B, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x878C, 0x0000, 0x0000, 0x0000, 0x0000, 0x878D, 0x0000, 0x878E, 0x878F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8790, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8791, 0x0000, 0x8792,\n    0x0000, 0x0000, 0x0000, 0x8793, 0x8794, 0x8795, 0x0000, 0x8796, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8797, 0x0000,\n    0x0000, 0x0000, 0x8798, 0x0000, 0x0000, 0x8799, 0x0000, 0x0000, 0x0000, 0x879A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x879B, 0x0000, 0x0000, 0x0000, 0x879C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x879D, 0x0000, 0x0000, 0x879E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x879F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87A0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x87A1, 0x0000, 0x87A2, 0x0000, 0x87A3, 0x0000, 0x0000, 0x0000, 0x0000, 0x87A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x87A5, 0x0000, 0x0000, 0x0000, 0x87A6, 0x87A7, 0x0000, 0x0000, 0x87A8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87A9,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87AA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x87AB, 0x0000, 0x0000, 0x0000, 0x0000, 0x87AC, 0x0000, 0x0000, 0x87AD, 0x87AE, 0x87AF, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B0, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B1, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x87B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B4, 0x0000, 0x87B5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x87B7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B8, 0x87B9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87BA, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87BB, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x87BC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87BD, 0x0000, 0x0000, 0x0000, 0x0000, 0x87BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x87BF, 0x0000, 0x0000, 0x87C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87C1, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87C2, 0x0000, 0x87C3, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87C4, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x87C5, 0x87C6, 0x0000, 0x87C7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x87C8, 0x0000, 0x0000, 0x0000, 0x87C9, 0x0000, 0x87CA, 0x87CB, 0x0000, 0x87CC, 0x87CD, 0x0000, 0x0000,\n    0x0000, 0x87CE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x87CF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87D0, 0x0000, 0x87D1, 0x0000, 0x87D2, 0x0000, 0x0000, 0x0000, 0x87D3, 0x87D4, 0x0000,\n    0x0000, 0x0000, 0x87D5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x87D6, 0x0000, 0x87D7, 0x0000, 0x87D8, 0x0000, 0x0000, 0x87D9, 0x0000, 0x0000, 0x87DA, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87DB, 0x0000, 0x87DC,\n    0x0000, 0x87DD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x87DE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x87DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87E0, 0x0000, 0x87E1, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87E2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87E3, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x87E4, 0x0000, 0x87E5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x87E6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x87E7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x87E8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x87E9, 0x0000, 0x0000, 0x87EA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x87EB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x87EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87ED, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x87EE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F0,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F1, 0x87F2,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F4, 0x0000, 0x87F5, 0x0000, 0x87F6, 0x0000,\n    0x0000, 0x0000, 0x87F7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F8, 0x87F9, 0x0000, 0x0000, 0x87FA, 0x0000, 0x0000, 0x0000, 0x87FB, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87FD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8801, 0x0000, 0x8802, 0x8803, 0x0000, 0x0000, 0x0000, 0x0000, 0x8804, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8805, 0x0000, 0x0000, 0x0000, 0x0000, 0x8806, 0x8807,\n    0x8808, 0x0000, 0x0000, 0x0000, 0x0000, 0x8809, 0x0000, 0x0000, 0x880A, 0x0000, 0x0000, 0x0000, 0x0000, 0x880B, 0x0000, 0x0000,\n    0x0000, 0x880C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x880D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x880E, 0x0000, 0x0000,\n    0x880F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8810, 0x8811, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8812,\n    0x0000, 0x0000, 0x8813, 0x0000, 0x8814, 0x0000, 0x0000, 0x0000, 0x8815, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8816, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8817, 0x0000, 0x0000, 0x0000, 0x0000, 0x8818, 0x0000, 0x0000, 0x0000,\n    0x8819, 0x0000, 0x0000, 0x0000, 0x0000, 0x881A, 0x0000, 0x0000, 0x0000, 0x881B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x881C, 0x0000, 0x881D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x881E, 0x881F, 0x8820, 0x0000, 0x8821, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8822, 0x8823, 0x8824, 0x0000, 0x0000, 0x8825, 0x0000, 0x0000, 0x8826, 0x8827, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8828, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8829, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x882A, 0x0000, 0x0000, 0x0000, 0x882B, 0x0000, 0x882C, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x882D, 0x882E, 0x0000, 0x0000, 0x882F, 0x0000, 0x8830, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8831, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8832, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8833, 0x0000, 0x0000, 0x0000, 0x0000, 0x8834, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8835, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8836,\n    0x0000, 0x8837, 0x0000, 0x0000, 0x8838, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8839, 0x883A, 0x0000, 0x0000, 0x0000, 0x883B,\n    0x0000, 0x0000, 0x883C, 0x0000, 0x0000, 0x0000, 0x0000, 0x883D, 0x0000, 0x0000, 0x883E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x883F, 0x0000, 0x8840, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8841, 0x0000, 0x0000, 0x0000, 0x8842, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8843, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8844, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8845, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8846, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8847, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8848, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8849, 0x0000, 0x0000, 0x0000, 0x0000, 0x884A, 0x884B, 0x884C, 0x0000, 0x0000, 0x0000, 0x884D, 0x884E,\n    0x0000, 0x0000, 0x884F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8850, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8851,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8852, 0x0000, 0x8853, 0x8854, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8855, 0x0000, 0x8856, 0x0000, 0x0000, 0x8857, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8858, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8859, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x885A, 0x0000, 0x885B, 0x885C, 0x0000, 0x0000, 0x0000, 0x885D, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x885E, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x885F, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8860, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8861, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8862, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8863, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8864, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8865, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8866, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8867,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8868, 0x8869, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x886A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x886B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x886C, 0x0000, 0x0000, 0x0000, 0x886D,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x886E, 0x0000, 0x0000, 0x886F, 0x8870, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8871, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8872, 0x0000, 0x0000, 0x8873, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8874, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8875, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8876, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8877, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8878, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8879, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x887A,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x887B, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x887C, 0x0000, 0x0000, 0x0000, 0x887D, 0x887E, 0x0000, 0x887F, 0x0000, 0x8880, 0x8881, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8882, 0x8883, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8884, 0x8885, 0x0000, 0x0000, 0x8886, 0x0000, 0x8887, 0x8888, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8889, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x888A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x888B, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x888C, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x888D, 0x0000, 0x888E, 0x0000, 0x0000, 0x888F, 0x8890, 0x0000, 0x0000, 0x0000, 0x8891, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8892, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8893, 0x0000, 0x8894, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8895, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8896, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8897, 0x0000, 0x8898, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8899, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x889A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x889B, 0x0000, 0x0000, 0x889C, 0x0000, 0x0000, 0x889D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x889E, 0x0000, 0x0000, 0x889F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x88A0, 0x0000, 0x88A1, 0x0000, 0x0000, 0x0000, 0x0000, 0x88A2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88A3, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x88A4, 0x0000, 0x0000, 0x0000, 0x88A5, 0x0000, 0x88A6, 0x0000, 0x88A7, 0x88A8, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88A9, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x88AA, 0x0000, 0x88AB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x88AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88AD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88AE, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x88AF, 0x0000, 0x0000, 0x88B0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x88B1, 0x0000, 0x0000, 0x88B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88B3, 0x88B4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88B5,\n    0x0000, 0x0000, 0x0000, 0x88B6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88B7, 0x88B8, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88B9, 0x0000, 0x0000, 0x0000, 0x0000, 0x88BA, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88BB, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x88BC, 0x88BD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88BF, 0x0000, 0x0000, 0x88C0, 0x0000, 0x88C1,\n    0x88C2, 0x88C3, 0x88C4, 0x88C5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88C6, 0x0000, 0x0000, 0x88C7, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x88C8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x88C9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x88CA, 0x0000, 0x88CB, 0x0000, 0x88CC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88CD, 0x0000, 0x0000, 0x0000, 0x88CE, 0x0000, 0x88CF, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D1, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x88D2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D3, 0x0000,\n    0x88D4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D6, 0x0000, 0x0000, 0x0000, 0x88D7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88DA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88DB, 0x88DC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x88DD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x88DE, 0x88DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E0, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E1, 0x88E2, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x88E4, 0x0000, 0x0000, 0x88E5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E6, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E7, 0x0000, 0x88E8, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E9, 0x0000, 0x88EA, 0x0000, 0x0000, 0x0000, 0x0000, 0x88EB,\n    0x0000, 0x0000, 0x0000, 0x88EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88ED, 0x88EE, 0x0000, 0x0000, 0x88EF, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x88F0, 0x0000, 0x0000, 0x88F1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x88F2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88F3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x88F4, 0x88F5, 0x88F6, 0x0000, 0x0000, 0x0000, 0x88F7, 0x0000, 0x0000, 0x0000, 0x88F8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x88F9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88FA, 0x0000, 0x0000, 0x88FB, 0x0000,\n    0x0000, 0x0000, 0x88FC, 0x0000, 0x0000, 0x0000, 0x88FD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88FE, 0x0000, 0x88FF, 0x0000, 0x0000, 0x8900, 0x8901, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8902,\n    0x0000, 0x0000, 0x0000, 0x8903, 0x0000, 0x0000, 0x0000, 0x0000, 0x8904, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8905, 0x0000, 0x0000, 0x0000, 0x8906, 0x8907, 0x8908, 0x0000, 0x8909, 0x0000, 0x890A, 0x0000, 0x890B, 0x0000,\n    0x890C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x890D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x890E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x890F, 0x0000, 0x8910, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8911, 0x0000, 0x8912, 0x0000, 0x0000, 0x0000, 0x8913, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8914, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8915, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8916, 0x0000, 0x0000, 0x8917, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8918, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8919, 0x891A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x891B, 0x0000, 0x891C, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x891D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x891E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x891F, 0x8920, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8921, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8922, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8923, 0x8924, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8925, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8926, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8927, 0x0000, 0x0000, 0x8928,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8929,\n    0x0000, 0x0000, 0x0000, 0x892A, 0x0000, 0x0000, 0x892B, 0x0000, 0x0000, 0x0000, 0x0000, 0x892C, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x892D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x892E, 0x0000, 0x0000, 0x892F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8930,\n    0x0000, 0x0000, 0x0000, 0x8931, 0x0000, 0x8932, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8933, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8934, 0x8935, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8936, 0x0000, 0x0000, 0x8937, 0x8938,\n    0x0000, 0x8939, 0x0000, 0x0000, 0x893A, 0x0000, 0x0000, 0x893B, 0x0000, 0x0000, 0x893C, 0x893D, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x893E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x893F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8940, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8941, 0x0000, 0x0000, 0x8942,\n    0x8943, 0x8944, 0x8945, 0x0000, 0x8946, 0x0000, 0x0000, 0x8947, 0x0000, 0x0000, 0x8948, 0x8949, 0x894A, 0x0000, 0x894B, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x894C, 0x0000, 0x894D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x894E,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x894F, 0x0000, 0x8950, 0x0000, 0x0000, 0x8951, 0x0000, 0x8952, 0x8953, 0x8954, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8955, 0x8956, 0x8957, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8958, 0x0000, 0x8959, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x895A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x895B, 0x895C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x895D, 0x0000, 0x0000, 0x895E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x895F, 0x8960, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8961, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8962, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8963, 0x0000, 0x0000, 0x0000, 0x0000, 0x8964, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8965, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8966, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8967, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8968, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8969, 0x896A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x896B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x896C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x896D, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x896E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x896F, 0x0000, 0x8970, 0x8971, 0x0000, 0x8972, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8973, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8974, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8975, 0x0000, 0x0000, 0x0000, 0x8976, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8977, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8978, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8979, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x897A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x897B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x897C,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x897D, 0x0000, 0x0000, 0x0000, 0x897E, 0x0000, 0x0000, 0x0000, 0x0000, 0x897F, 0x0000, 0x8980,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8981, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8982, 0x8983, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8984,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8985, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8986, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8987,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8988, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8989, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x898A, 0x0000, 0x0000, 0x0000, 0x0000, 0x898B, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x898C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x898D, 0x0000, 0x0000, 0x0000, 0x898E, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x898F,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8990, 0x0000, 0x8991, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8992, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8993, 0x0000, 0x0000, 0x8994, 0x8995, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8996, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8997, 0x8998, 0x0000, 0x0000, 0x8999, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x899A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x899B, 0x0000, 0x0000, 0x0000, 0x0000, 0x899C, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x899D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x899E, 0x899F, 0x89A0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89A1, 0x0000, 0x0000, 0x89A2, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89A3,\n    0x0000, 0x0000, 0x89A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89A5, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x89A6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89A7, 0x0000, 0x89A8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x89A9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89AA, 0x0000, 0x0000, 0x89AB,\n    0x0000, 0x0000, 0x89AC, 0x89AD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89AE, 0x89AF,\n    0x0000, 0x0000, 0x0000, 0x89B0, 0x0000, 0x0000, 0x0000, 0x0000, 0x89B1, 0x0000, 0x0000, 0x89B2, 0x0000, 0x0000, 0x89B3, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x89B4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x89B5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89B6, 0x89B7, 0x0000, 0x89B8, 0x89B9, 0x89BA,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89BB, 0x0000, 0x89BC, 0x89BD, 0x0000, 0x89BE, 0x89BF, 0x89C0, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x89C1, 0x0000, 0x0000, 0x0000, 0x0000, 0x89C2, 0x0000, 0x89C3, 0x89C4, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x89C5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89C6, 0x0000, 0x0000, 0x0000, 0x0000, 0x89C7,\n    0x0000, 0x0000, 0x89C8, 0x0000, 0x0000, 0x0000, 0x89C9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89CA, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x89CB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89CC,\n    0x0000, 0x89CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x89CE, 0x0000, 0x0000, 0x0000, 0x0000, 0x89CF, 0x89D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D1,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D3, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x89D4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D5, 0x0000, 0x0000, 0x89D6, 0x89D7,\n    0x0000, 0x0000, 0x89D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D9, 0x0000, 0x89DA, 0x0000, 0x0000, 0x0000,\n    0x89DB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89DC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89DD,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89DE, 0x0000, 0x0000, 0x0000, 0x89DF, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x89E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E1, 0x89E2, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x89E3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E6, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x89E7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x89E8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89EA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89EB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89ED, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x89EE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89F0, 0x0000, 0x0000, 0x89F1, 0x0000, 0x89F2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89F3, 0x89F4, 0x0000, 0x0000, 0x0000, 0x89F5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89F6, 0x0000, 0x89F7, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x89F8, 0x0000, 0x0000, 0x0000, 0x89F9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FA, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FB, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FD, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FF, 0x8A00,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A01, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A02, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A03, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A04, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8A05, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A06, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8A07, 0x8A08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A09, 0x0000, 0x8A0A, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A0B, 0x0000, 0x0000, 0x8A0C,\n    0x0000, 0x0000, 0x8A0D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A0E, 0x0000, 0x0000, 0x8A0F, 0x0000, 0x0000, 0x8A10, 0x8A11,\n    0x0000, 0x8A12, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A13, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A14, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8A15, 0x8A16, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A17, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8A18, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A19, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A1A,\n    0x0000, 0x8A1B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8A1C, 0x0000, 0x0000, 0x8A1D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A1E, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8A1F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A20,\n    0x8A21, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A22,\n    0x8A23, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A24, 0x8A25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8A26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8A28, 0x0000, 0x0000, 0x0000, 0x8A29, 0x0000, 0x8A2A, 0x0000, 0x0000, 0x8A2B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A2C, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8A2D, 0x0000, 0x8A2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A2F, 0x0000, 0x0000, 0x8A30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A31,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8A32, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A33, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8A34, 0x8A35, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A36, 0x0000, 0x8A37, 0x0000, 0x8A38, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A39, 0x8A3A, 0x0000, 0x0000, 0x8A3B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A3C,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A3D, 0x0000, 0x0000, 0x8A3E, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A3F, 0x0000, 0x8A40,\n    0x8A41, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A42, 0x8A43, 0x8A44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8A45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A46, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8A47, 0x8A48, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8A49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A4A, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A4B, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8A4C, 0x8A4D, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A4E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A4F, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A50, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A51,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8A52, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8A53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A54, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8A55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A56, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8A57, 0x0000, 0x0000, 0x8A58, 0x0000, 0x0000, 0x0000, 0x8A59, 0x0000, 0x0000, 0x8A5A, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8A5B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A5C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8A5D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A5E, 0x0000,\n    0x0000, 0x8A5F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A60, 0x8A61, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8A62, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A63, 0x0000, 0x0000, 0x8A64, 0x0000, 0x0000, 0x8A65,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A67, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8A68, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A69, 0x0000, 0x8A6A, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A6B, 0x0000, 0x0000,\n    0x8A6C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A6D, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A6E, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8A6F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A70, 0x0000, 0x0000, 0x0000, 0x8A71, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A72, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A73, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A74, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A75, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A76, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8A77, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A78, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8A79, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A7A, 0x0000, 0x0000, 0x0000, 0x8A7B, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A7C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A7D, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A7E, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8A7F, 0x0000, 0x0000, 0x8A80, 0x8A81, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A82, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A83, 0x0000, 0x8A84, 0x8A85, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8A86, 0x0000, 0x8A87, 0x0000, 0x0000, 0x8A88, 0x0000, 0x8A89, 0x8A8A, 0x0000, 0x8A8B, 0x8A8C, 0x8A8D, 0x0000, 0x0000, 0x0000,\n    0x8A8E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A8F, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A90, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A91,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A92, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8A93, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8A94, 0x8A95, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A96, 0x8A97, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A98,\n    0x0000, 0x0000, 0x8A99, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A9A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8A9B, 0x0000, 0x8A9C, 0x0000, 0x0000, 0x8A9D, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A9E, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8A9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA1, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA2, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA3,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8AA4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA6, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8AA8, 0x8AA9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AAA, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8AAB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AAC, 0x8AAD, 0x0000, 0x0000, 0x0000,\n    0x8AAE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AAF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB0, 0x0000, 0x0000, 0x8AB1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8AB3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8AB5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB6, 0x0000, 0x8AB7, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8AB8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB9, 0x0000,\n    0x0000, 0x8ABA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ABB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8ABC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ABD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8ABE, 0x0000, 0x0000, 0x0000, 0x8ABF, 0x8AC0, 0x0000, 0x8AC1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AC2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AC3,\n    0x0000, 0x0000, 0x8AC4, 0x0000, 0x8AC5, 0x0000, 0x0000, 0x8AC6, 0x0000, 0x8AC7, 0x0000, 0x0000, 0x8AC8, 0x8AC9, 0x8ACA, 0x0000,\n    0x8ACB, 0x8ACC, 0x8ACD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ACE, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ACF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8AD0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AD1, 0x0000, 0x8AD2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8AD3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AD4, 0x0000, 0x8AD5, 0x0000,\n    0x0000, 0x8AD6, 0x0000, 0x8AD7, 0x8AD8, 0x0000, 0x0000, 0x8AD9, 0x0000, 0x0000, 0x8ADA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ADB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ADC, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ADD,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ADE, 0x0000, 0x8ADF, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE1, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE2, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE4, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8AE5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE7,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE8, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8AE9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AEA, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8AEB, 0x0000, 0x0000, 0x0000, 0x8AEC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AED,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AEE, 0x0000, 0x0000, 0x0000, 0x8AEF, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF0, 0x0000, 0x8AF1, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8AF2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8AF4, 0x0000, 0x0000, 0x0000, 0x8AF5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF6,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF7, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8AF8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF9, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AFA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AFB, 0x0000, 0x0000, 0x0000, 0x8AFC, 0x8AFD, 0x8AFE, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8AFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B00,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B01, 0x8B02, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B03, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B04, 0x0000, 0x0000, 0x0000, 0x8B05, 0x0000, 0x0000, 0x0000, 0x8B06, 0x0000,\n    0x0000, 0x8B07, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B08,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B09, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B0A, 0x0000, 0x0000, 0x8B0B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B0C, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B0D, 0x0000,\n    0x0000, 0x8B0E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B0F, 0x8B10, 0x8B11, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8B12, 0x8B13, 0x8B14, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B15, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B16, 0x8B17, 0x0000, 0x0000, 0x0000, 0x8B18, 0x8B19,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B1A, 0x8B1B, 0x0000, 0x0000, 0x0000, 0x8B1C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8B1D, 0x8B1E, 0x0000, 0x8B1F, 0x0000, 0x0000, 0x8B20, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B21, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B22, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B23, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B25, 0x0000, 0x0000, 0x0000, 0x8B26,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8B27, 0x0000, 0x0000, 0x0000, 0x8B28, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B29, 0x0000, 0x8B2A, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8B2B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8B2C, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B2D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8B2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8B2F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B30, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B31, 0x0000,\n    0x0000, 0x8B32, 0x0000, 0x8B33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B34, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B35, 0x0000, 0x8B36, 0x0000, 0x0000, 0x0000, 0x8B37, 0x8B38, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8B39, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B3A, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B3B, 0x0000, 0x8B3C, 0x8B3D, 0x0000, 0x0000, 0x8B3E,\n    0x8B3F, 0x0000, 0x0000, 0x0000, 0x8B40, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B41, 0x0000, 0x0000, 0x8B42, 0x0000, 0x8B43, 0x0000,\n    0x0000, 0x0000, 0x8B44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B47, 0x8B48, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8B4A, 0x8B4B, 0x0000, 0x8B4C, 0x0000, 0x8B4D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B4E, 0x0000,\n    0x8B4F, 0x0000, 0x8B50, 0x0000, 0x8B51, 0x8B52, 0x8B53, 0x8B54, 0x8B55, 0x8B56, 0x0000, 0x8B57, 0x0000, 0x8B58, 0x0000, 0x0000,\n    0x8B59, 0x0000, 0x0000, 0x8B5A, 0x8B5B, 0x8B5C, 0x0000, 0x8B5D, 0x0000, 0x8B5E, 0x8B5F, 0x8B60, 0x8B61, 0x8B62, 0x0000, 0x0000,\n    0x0000, 0x8B63, 0x0000, 0x0000, 0x0000, 0x8B64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B65, 0x0000,\n    0x8B66, 0x8B67, 0x8B68, 0x8B69, 0x0000, 0x8B6A, 0x0000, 0x0000, 0x0000, 0x8B6B, 0x8B6C, 0x0000, 0x8B6D, 0x0000, 0x0000, 0x8B6E,\n    0x8B6F, 0x0000, 0x8B70, 0x8B71, 0x8B72, 0x0000, 0x8B73, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B74, 0x0000,\n    0x8B75, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B76, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B77, 0x0000, 0x8B78, 0x8B79, 0x0000,\n    0x0000, 0x8B7A, 0x8B7B, 0x0000, 0x0000, 0x0000, 0x8B7C, 0x0000, 0x8B7D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8B7E, 0x8B7F, 0x8B80, 0x8B81, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B82, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8B83, 0x0000, 0x8B84, 0x0000, 0x0000, 0x8B85, 0x0000, 0x8B86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B87,\n    0x0000, 0x0000, 0x0000, 0x8B88, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B89, 0x0000, 0x8B8A, 0x0000,\n    0x8B8B, 0x0000, 0x8B8C, 0x8B8D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B8E, 0x8B8F, 0x0000, 0x0000,\n    0x8B90, 0x8B91, 0x8B92, 0x0000, 0x8B93, 0x0000, 0x0000, 0x0000, 0x8B94, 0x8B95, 0x8B96, 0x8B97, 0x0000, 0x8B98, 0x8B99, 0x8B9A,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8B9B, 0x0000, 0x0000, 0x8B9C, 0x0000, 0x0000, 0x8B9D, 0x8B9E, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8B9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BA0, 0x8BA1, 0x8BA2, 0x8BA3, 0x0000, 0x0000, 0x8BA4, 0x8BA5, 0x0000,\n    0x8BA6, 0x8BA7, 0x0000, 0x8BA8, 0x0000, 0x0000, 0x8BA9, 0x0000, 0x8BAA, 0x8BAB, 0x0000, 0x0000, 0x8BAC, 0x0000, 0x0000, 0x8BAD,\n    0x0000, 0x8BAE, 0x8BAF, 0x0000, 0x8BB0, 0x0000, 0x8BB1, 0x0000, 0x0000, 0x8BB2, 0x0000, 0x8BB3, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BB4, 0x8BB5, 0x8BB6, 0x8BB7, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8BB8, 0x8BB9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BBA, 0x0000, 0x0000, 0x0000, 0x8BBB, 0x0000, 0x8BBC, 0x8BBD, 0x8BBE,\n    0x0000, 0x0000, 0x0000, 0x8BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BC0, 0x0000, 0x0000, 0x8BC1, 0x0000,\n    0x0000, 0x8BC2, 0x8BC3, 0x0000, 0x0000, 0x8BC4, 0x8BC5, 0x8BC6, 0x0000, 0x8BC7, 0x0000, 0x0000, 0x0000, 0x8BC8, 0x8BC9, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8BCA, 0x0000, 0x8BCB, 0x8BCC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8BCD, 0x0000, 0x8BCE, 0x8BCF, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BD0, 0x0000, 0x0000, 0x0000, 0x8BD1, 0x0000,\n    0x0000, 0x8BD2, 0x8BD3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BD4, 0x8BD5, 0x8BD6, 0x0000, 0x8BD7, 0x0000, 0x8BD8,\n    0x8BD9, 0x0000, 0x0000, 0x8BDA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BDB, 0x0000, 0x0000, 0x8BDC, 0x8BDD, 0x8BDE, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BDF, 0x0000, 0x8BE0, 0x0000, 0x8BE1, 0x0000, 0x0000, 0x8BE2,\n    0x0000, 0x0000, 0x0000, 0x8BE3, 0x0000, 0x0000, 0x8BE4, 0x0000, 0x8BE5, 0x0000, 0x0000, 0x0000, 0x8BE6, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BE7, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BE8, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8BE9, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BEA, 0x0000, 0x8BEB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BEC, 0x8BED, 0x0000, 0x8BEE, 0x0000, 0x0000, 0x8BEF, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF0, 0x0000, 0x0000, 0x8BF1, 0x8BF2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8BF4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8BF5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF6, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF7, 0x0000, 0x0000, 0x0000, 0x8BF8, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF9, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BFA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BFB, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BFC,\n    0x8BFD, 0x0000, 0x8BFE, 0x8BFF, 0x0000, 0x8C00, 0x8C01, 0x8C02, 0x0000, 0x8C03, 0x0000, 0x0000, 0x0000, 0x8C04, 0x8C05, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C07, 0x0000, 0x0000, 0x8C08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C09, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0A, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0C, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8C0E, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C10, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8C11, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C12, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8C13, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C14, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C15, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8C16, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C18, 0x8C19, 0x8C1A,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C1B, 0x0000, 0x0000, 0x0000, 0x8C1C, 0x0000, 0x8C1D,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C1E, 0x0000, 0x8C1F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C20,\n    0x8C21, 0x0000, 0x8C22, 0x0000, 0x0000, 0x8C23, 0x0000, 0x0000, 0x8C24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C26, 0x8C27, 0x8C28, 0x8C29, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C2A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8C2B, 0x0000, 0x8C2C, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C2D, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8C2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C2F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8C30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C31, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C32, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8C33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C34, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8C35, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C36, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C37, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8C38, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C39, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3A,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3C, 0x0000, 0x0000, 0x8C3D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3E, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C40, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8C41, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C43, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8C45, 0x0000, 0x0000, 0x0000, 0x8C46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C47, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C48, 0x0000, 0x0000, 0x0000,\n    0x8C49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C4A, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C4B, 0x8C4C,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8C4D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C4E, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C4F, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8C50, 0x0000, 0x8C51, 0x8C52, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C53, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8C54, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C56, 0x0000,\n    0x0000, 0x0000, 0x8C57, 0x0000, 0x0000, 0x8C58, 0x0000, 0x0000, 0x8C59, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8C5A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C5B, 0x0000, 0x0000, 0x8C5C, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C5D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C5E, 0x0000, 0x8C5F, 0x0000, 0x8C60, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8C61, 0x0000, 0x0000, 0x8C62, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C63,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C64, 0x0000, 0x0000, 0x8C65, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C67, 0x0000, 0x0000, 0x0000, 0x8C68, 0x8C69, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C6A, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C6B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C6C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C6D, 0x0000, 0x0000, 0x8C6E, 0x8C6F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8C70, 0x0000, 0x0000, 0x0000, 0x8C71, 0x0000, 0x8C72, 0x8C73, 0x0000, 0x0000, 0x8C74, 0x8C75, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C76, 0x0000, 0x0000, 0x8C77, 0x0000, 0x0000, 0x0000, 0x8C78, 0x0000,\n    0x0000, 0x0000, 0x8C79, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7A, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7C,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7E, 0x8C7F, 0x0000, 0x0000, 0x8C80,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C81, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C82,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C83, 0x8C84, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C85, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C87,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C88, 0x0000, 0x8C89, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C8A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8C8B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C8C, 0x0000,\n    0x0000, 0x0000, 0x8C8D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C8E, 0x0000, 0x0000, 0x0000, 0x8C8F,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8C90, 0x0000, 0x0000, 0x0000, 0x8C91, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C92, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8C93, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C94, 0x0000, 0x0000, 0x8C95,\n    0x0000, 0x0000, 0x8C96, 0x0000, 0x0000, 0x0000, 0x8C97, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C98, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8C99, 0x0000, 0x0000, 0x0000, 0x8C9A, 0x8C9B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C9C, 0x0000, 0x0000,\n    0x8C9D, 0x8C9E, 0x0000, 0x0000, 0x8C9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA0,\n    0x0000, 0x0000, 0x0000, 0x8CA1, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8CA3, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA4, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA5, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8CA7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA8, 0x0000, 0x8CA9, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CAA, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CAB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CAC, 0x8CAD, 0x0000, 0x0000,\n    0x0000, 0x8CAE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CAF, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB0, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB1, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8CB3, 0x8CB4, 0x0000, 0x8CB5, 0x0000, 0x0000, 0x8CB6, 0x0000, 0x0000, 0x8CB7, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CBA, 0x0000, 0x0000,\n    0x8CBB, 0x0000, 0x0000, 0x0000, 0x8CBC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CBD, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CBE,\n    0x0000, 0x0000, 0x8CBF, 0x0000, 0x8CC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CC1, 0x0000, 0x0000, 0x0000, 0x8CC2,\n    0x0000, 0x0000, 0x0000, 0x8CC3, 0x0000, 0x0000, 0x8CC4, 0x0000, 0x8CC5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8CC6, 0x0000, 0x0000, 0x0000, 0x8CC7, 0x8CC8, 0x0000, 0x0000, 0x0000, 0x8CC9, 0x0000, 0x8CCA, 0x0000, 0x0000, 0x8CCB,\n    0x0000, 0x0000, 0x8CCC, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CCD, 0x0000, 0x0000, 0x8CCE, 0x0000, 0x0000, 0x8CCF, 0x0000, 0x8CD0,\n    0x8CD1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8CD2, 0x0000, 0x8CD3, 0x0000, 0x8CD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8CD5, 0x8CD6, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CD7, 0x0000, 0x8CD8, 0x0000, 0x8CD9, 0x0000, 0x8CDA, 0x0000,\n    0x8CDB, 0x0000, 0x0000, 0x8CDC, 0x0000, 0x8CDD, 0x8CDE, 0x8CDF, 0x8CE0, 0x0000, 0x0000, 0x8CE1, 0x0000, 0x8CE2, 0x0000, 0x8CE3,\n    0x0000, 0x0000, 0x0000, 0x8CE4, 0x0000, 0x8CE5, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CE6, 0x0000, 0x0000, 0x8CE7, 0x0000, 0x0000,\n    0x0000, 0x8CE8, 0x0000, 0x0000, 0x8CE9, 0x0000, 0x8CEA, 0x0000, 0x0000, 0x0000, 0x8CEB, 0x0000, 0x8CEC, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8CED, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CEE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CEF, 0x0000,\n    0x8CF0, 0x0000, 0x8CF1, 0x0000, 0x8CF2, 0x8CF3, 0x0000, 0x0000, 0x8CF4, 0x0000, 0x0000, 0x8CF5, 0x0000, 0x0000, 0x8CF6, 0x0000,\n    0x8CF7, 0x8CF8, 0x8CF9, 0x8CFA, 0x0000, 0x0000, 0x8CFB, 0x0000, 0x0000, 0x8CFC, 0x0000, 0x8CFD, 0x8CFE, 0x8CFF, 0x8D00, 0x0000,\n    0x8D01, 0x8D02, 0x8D03, 0x8D04, 0x0000, 0x8D05, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D06, 0x0000, 0x0000, 0x8D07,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8D08, 0x8D09, 0x8D0A, 0x8D0B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D0C, 0x8D0D, 0x0000, 0x0000,\n    0x0000, 0x8D0E, 0x8D0F, 0x0000, 0x0000, 0x8D10, 0x0000, 0x0000, 0x8D11, 0x0000, 0x8D12, 0x0000, 0x0000, 0x0000, 0x8D13, 0x0000,\n    0x8D14, 0x8D15, 0x0000, 0x8D16, 0x8D17, 0x8D18, 0x8D19, 0x0000, 0x8D1A, 0x0000, 0x8D1B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8D1C, 0x0000, 0x8D1D, 0x0000, 0x0000, 0x0000, 0x8D1E, 0x0000, 0x0000, 0x8D1F, 0x0000, 0x0000, 0x8D20, 0x0000, 0x0000, 0x8D21,\n    0x0000, 0x0000, 0x8D22, 0x0000, 0x8D23, 0x0000, 0x0000, 0x8D24, 0x0000, 0x8D25, 0x0000, 0x8D26, 0x0000, 0x8D27, 0x0000, 0x8D28,\n    0x0000, 0x8D29, 0x8D2A, 0x0000, 0x0000, 0x0000, 0x8D2B, 0x8D2C, 0x0000, 0x0000, 0x0000, 0x8D2D, 0x8D2E, 0x8D2F, 0x8D30, 0x0000,\n    0x0000, 0x8D31, 0x8D32, 0x0000, 0x8D33, 0x0000, 0x8D34, 0x8D35, 0x0000, 0x0000, 0x0000, 0x8D36, 0x0000, 0x8D37, 0x8D38, 0x0000,\n    0x0000, 0x8D39, 0x0000, 0x8D3A, 0x0000, 0x0000, 0x8D3B, 0x8D3C, 0x8D3D, 0x0000, 0x8D3E, 0x0000, 0x8D3F, 0x0000, 0x8D40, 0x0000,\n    0x8D41, 0x8D42, 0x8D43, 0x0000, 0x8D44, 0x8D45, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D46, 0x0000, 0x0000, 0x0000, 0x8D47, 0x0000,\n    0x8D48, 0x0000, 0x0000, 0x0000, 0x8D49, 0x0000, 0x8D4A, 0x8D4B, 0x0000, 0x8D4C, 0x0000, 0x8D4D, 0x0000, 0x8D4E, 0x0000, 0x0000,\n    0x8D4F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D50, 0x0000, 0x0000, 0x8D51, 0x8D52, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8D53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D54, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D55, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D56, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D57, 0x8D58,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D59, 0x0000, 0x8D5A, 0x8D5B, 0x8D5C, 0x0000, 0x8D5D, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D5E, 0x0000, 0x0000, 0x0000, 0x8D5F,\n    0x8D60, 0x0000, 0x0000, 0x0000, 0x8D61, 0x0000, 0x0000, 0x8D62, 0x8D63, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D64, 0x8D65, 0x0000,\n    0x8D66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D67, 0x8D68, 0x0000, 0x0000, 0x8D69, 0x0000,\n    0x0000, 0x0000, 0x8D6A, 0x8D6B, 0x0000, 0x8D6C, 0x8D6D, 0x0000, 0x0000, 0x0000, 0x8D6E, 0x0000, 0x8D6F, 0x0000, 0x8D70, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D71, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D72, 0x0000,\n    0x8D73, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D74, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8D76, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D77, 0x8D78, 0x0000,\n    0x8D79, 0x8D7A, 0x8D7B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D7C, 0x8D7D, 0x8D7E, 0x8D7F, 0x8D80, 0x8D81, 0x0000, 0x0000, 0x8D82,\n    0x8D83, 0x0000, 0x8D84, 0x8D85, 0x8D86, 0x0000, 0x8D87, 0x8D88, 0x8D89, 0x0000, 0x8D8A, 0x8D8B, 0x8D8C, 0x8D8D, 0x0000, 0x8D8E,\n    0x8D8F, 0x8D90, 0x8D91, 0x8D92, 0x8D93, 0x8D94, 0x0000, 0x8D95, 0x8D96, 0x0000, 0x8D97, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8D98, 0x8D99, 0x8D9A, 0x0000, 0x8D9B, 0x0000, 0x0000, 0x0000, 0x8D9C, 0x8D9D, 0x0000, 0x8D9E, 0x0000, 0x8D9F, 0x0000,\n    0x8DA0, 0x8DA1, 0x8DA2, 0x8DA3, 0x8DA4, 0x0000, 0x8DA5, 0x8DA6, 0x0000, 0x0000, 0x8DA7, 0x0000, 0x8DA8, 0x8DA9, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8DAA, 0x8DAB, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DAC, 0x8DAD, 0x8DAE, 0x8DAF, 0x8DB0, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8DB1, 0x8DB2, 0x0000, 0x8DB3, 0x8DB4, 0x0000, 0x8DB5, 0x0000, 0x0000, 0x8DB6, 0x0000, 0x8DB7,\n    0x8DB8, 0x0000, 0x0000, 0x8DB9, 0x8DBA, 0x0000, 0x8DBB, 0x8DBC, 0x0000, 0x0000, 0x0000, 0x8DBD, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DBE, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DBF, 0x0000, 0x0000, 0x0000, 0x8DC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DC1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8DC2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8DC3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8DC4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8DC5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DC6, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DC7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8DC8, 0x0000, 0x0000, 0x8DC9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DCA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8DCB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DCC, 0x8DCD, 0x8DCE, 0x0000, 0x8DCF, 0x0000, 0x0000,\n    0x0000, 0x8DD0, 0x8DD1, 0x8DD2, 0x0000, 0x8DD3, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8DD5, 0x0000, 0x0000, 0x0000, 0x8DD6, 0x8DD7, 0x0000, 0x0000, 0x0000, 0x8DD8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8DD9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DDA, 0x8DDB, 0x8DDC, 0x8DDD, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8DDE, 0x0000, 0x8DDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DE0, 0x0000, 0x0000, 0x0000, 0x8DE1,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DE2, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8DE3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DE4, 0x8DE5, 0x8DE6, 0x8DE7, 0x8DE8, 0x0000, 0x8DE9, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8DEA, 0x0000, 0x8DEB, 0x0000, 0x8DEC, 0x8DED, 0x8DEE, 0x8DEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8DF0, 0x0000, 0x8DF1, 0x8DF2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DF3, 0x8DF4, 0x8DF5, 0x8DF6, 0x8DF7,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DF8, 0x8DF9, 0x0000, 0x0000, 0x8DFA, 0x8DFB, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DFC,\n    0x0000, 0x0000, 0x0000, 0x8DFD, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DFE, 0x0000, 0x0000, 0x8DFF, 0x0000, 0x0000, 0x8E00, 0x8E01,\n    0x8E02, 0x0000, 0x8E03, 0x0000, 0x8E04, 0x8E05, 0x8E06, 0x0000, 0x0000, 0x8E07, 0x0000, 0x0000, 0x0000, 0x8E08, 0x8E09, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8E0A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E0B,\n    0x0000, 0x8E0C, 0x8E0D, 0x0000, 0x8E0E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E0F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E10, 0x8E11, 0x8E12,\n    0x0000, 0x0000, 0x8E13, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E14, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8E15, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8E16, 0x8E17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E18, 0x8E19, 0x0000, 0x0000, 0x8E1A, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8E1B, 0x8E1C, 0x0000, 0x0000, 0x0000, 0x8E1D, 0x0000, 0x0000, 0x8E1E, 0x0000, 0x8E1F, 0x0000,\n    0x8E20, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E21, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8E22, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E23, 0x8E24, 0x0000, 0x8E25, 0x0000, 0x8E26, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8E27, 0x0000, 0x0000, 0x8E28, 0x0000, 0x0000, 0x8E29, 0x0000, 0x0000, 0x8E2A, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E2B,\n    0x8E2C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E2D,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E2F, 0x0000, 0x0000, 0x8E30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8E31, 0x0000, 0x8E32, 0x0000, 0x8E33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E34, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E35, 0x0000, 0x0000,\n    0x8E36, 0x0000, 0x8E37, 0x0000, 0x8E38, 0x0000, 0x8E39, 0x0000, 0x0000, 0x0000, 0x8E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E3B, 0x8E3C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8E3D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E3E, 0x0000, 0x8E3F, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E40, 0x8E41, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8E42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8E43, 0x8E44, 0x0000, 0x8E45, 0x0000, 0x8E46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E47, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8E48, 0x8E49, 0x0000, 0x8E4A, 0x8E4B, 0x8E4C, 0x0000, 0x0000, 0x0000, 0x8E4D, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8E4E, 0x8E4F, 0x0000, 0x0000, 0x8E50, 0x0000, 0x8E51, 0x0000, 0x0000, 0x8E52, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E53, 0x0000, 0x8E54, 0x0000, 0x8E55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8E56, 0x8E57, 0x0000, 0x8E58, 0x8E59, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E5A, 0x0000, 0x0000, 0x0000, 0x8E5B, 0x0000, 0x0000,\n    0x8E5C, 0x8E5D, 0x0000, 0x0000, 0x8E5E, 0x8E5F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E60, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8E61, 0x0000, 0x0000, 0x8E62, 0x8E63, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E64, 0x0000,\n    0x8E65, 0x0000, 0x0000, 0x8E66, 0x8E67, 0x0000, 0x0000, 0x8E68, 0x8E69, 0x8E6A, 0x8E6B, 0x0000, 0x0000, 0x8E6C, 0x8E6D, 0x8E6E,\n    0x8E6F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E70, 0x0000, 0x0000, 0x8E71, 0x8E72, 0x0000, 0x8E73, 0x0000, 0x8E74, 0x0000, 0x0000,\n    0x0000, 0x8E75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E76, 0x0000, 0x0000, 0x8E77, 0x8E78, 0x0000, 0x0000, 0x8E79, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8E7A, 0x0000, 0x8E7B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E7C, 0x8E7D, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E7E, 0x0000, 0x8E7F, 0x0000, 0x8E80, 0x8E81, 0x0000, 0x0000, 0x0000, 0x8E82,\n    0x8E83, 0x0000, 0x0000, 0x8E84, 0x0000, 0x8E85, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E86, 0x0000, 0x0000,\n    0x0000, 0x8E87, 0x0000, 0x8E88, 0x0000, 0x0000, 0x8E89, 0x0000, 0x8E8A, 0x0000, 0x8E8B, 0x8E8C, 0x8E8D, 0x0000, 0x0000, 0x0000,\n    0x8E8E, 0x0000, 0x0000, 0x8E8F, 0x0000, 0x8E90, 0x8E91, 0x0000, 0x8E92, 0x0000, 0x8E93, 0x8E94, 0x8E95, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8E96, 0x0000, 0x0000, 0x0000, 0x8E97, 0x0000, 0x8E98, 0x0000, 0x8E99, 0x8E9A, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8E9B, 0x0000, 0x8E9C, 0x0000, 0x8E9D, 0x0000, 0x8E9E, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E9F, 0x0000, 0x0000, 0x8EA0,\n    0x0000, 0x0000, 0x8EA1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EA2, 0x0000, 0x8EA3,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8EA4, 0x8EA5, 0x8EA6, 0x0000, 0x8EA7, 0x8EA8, 0x8EA9, 0x0000, 0x0000, 0x0000, 0x8EAA, 0x8EAB,\n    0x8EAC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EAD, 0x0000, 0x0000, 0x0000, 0x8EAE, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8EAF, 0x0000, 0x0000, 0x8EB0, 0x0000, 0x8EB1, 0x0000, 0x8EB2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EB3,\n    0x8EB4, 0x0000, 0x8EB5, 0x0000, 0x0000, 0x8EB6, 0x0000, 0x0000, 0x8EB7, 0x8EB8, 0x8EB9, 0x8EBA, 0x0000, 0x0000, 0x0000, 0x8EBB,\n    0x8EBC, 0x8EBD, 0x8EBE, 0x0000, 0x0000, 0x0000, 0x8EBF, 0x0000, 0x8EC0, 0x8EC1, 0x0000, 0x8EC2, 0x0000, 0x0000, 0x8EC3, 0x8EC4,\n    0x0000, 0x0000, 0x0000, 0x8EC5, 0x0000, 0x0000, 0x8EC6, 0x0000, 0x8EC7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8EC8, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EC9, 0x8ECA, 0x0000, 0x0000, 0x8ECB, 0x8ECC, 0x0000, 0x8ECD, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8ECE, 0x0000, 0x0000, 0x0000, 0x8ECF, 0x0000, 0x8ED0, 0x8ED1, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8ED2, 0x0000, 0x0000, 0x0000, 0x8ED3, 0x8ED4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ED5, 0x0000, 0x0000, 0x0000,\n    0x8ED6, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ED7, 0x8ED8, 0x0000, 0x0000, 0x0000, 0x8ED9, 0x0000, 0x0000, 0x0000, 0x8EDA, 0x0000,\n    0x0000, 0x0000, 0x8EDB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EDC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8EDD, 0x0000, 0x8EDE, 0x0000, 0x8EDF, 0x0000, 0x0000, 0x8EE0, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8EE1, 0x8EE2, 0x8EE3, 0x0000, 0x0000, 0x8EE4, 0x8EE5, 0x0000, 0x8EE6, 0x8EE7, 0x0000, 0x8EE8, 0x0000, 0x8EE9, 0x0000,\n    0x8EEA, 0x0000, 0x0000, 0x8EEB, 0x0000, 0x8EEC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8EED, 0x0000, 0x0000, 0x0000, 0x8EEE, 0x8EEF, 0x0000, 0x0000, 0x0000, 0x8EF0, 0x8EF1, 0x0000, 0x0000,\n    0x8EF2, 0x8EF3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EF4, 0x8EF5, 0x0000, 0x0000, 0x0000, 0x8EF6, 0x8EF7, 0x8EF8, 0x8EF9,\n    0x0000, 0x8EFA, 0x8EFB, 0x0000, 0x8EFC, 0x0000, 0x0000, 0x0000, 0x8EFD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8EFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EFF, 0x0000, 0x0000, 0x0000, 0x8F00, 0x0000, 0x0000, 0x0000, 0x8F01, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8F02, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8F03, 0x0000, 0x0000, 0x8F04, 0x8F05, 0x0000, 0x0000, 0x0000, 0x8F06, 0x8F07, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F08, 0x8F09, 0x0000, 0x0000, 0x8F0A, 0x0000, 0x0000, 0x8F0B, 0x0000,\n    0x0000, 0x0000, 0x8F0C, 0x8F0D, 0x0000, 0x8F0E, 0x8F0F, 0x0000, 0x8F10, 0x0000, 0x8F11, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F12,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x8F13, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F14, 0x0000, 0x8F15, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8F16, 0x0000, 0x0000, 0x0000, 0x8F17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F18, 0x0000,\n    0x8F19, 0x0000, 0x0000, 0x8F1A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F1B, 0x0000, 0x0000,\n    0x8F1C, 0x8F1D, 0x8F1E, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F1F, 0x0000, 0x8F20, 0x0000, 0x0000, 0x8F21, 0x8F22, 0x8F23, 0x8F24,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8F26, 0x0000, 0x8F27, 0x8F28, 0x0000, 0x0000, 0x8F29, 0x0000, 0x8F2A, 0x8F2B, 0x0000, 0x8F2C, 0x8F2D, 0x0000, 0x8F2E, 0x8F2F,\n    0x0000, 0x0000, 0x8F30, 0x8F31, 0x8F32, 0x0000, 0x0000, 0x0000, 0x8F33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8F34, 0x0000, 0x8F35, 0x0000, 0x8F36, 0x0000, 0x0000, 0x8F37, 0x8F38, 0x0000, 0x8F39, 0x8F3A, 0x8F3B, 0x0000, 0x0000,\n    0x0000, 0x8F3C, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F3D, 0x0000, 0x0000, 0x8F3E, 0x0000, 0x8F3F, 0x8F40, 0x8F41, 0x8F42, 0x8F43,\n    0x0000, 0x0000, 0x0000, 0x8F44, 0x0000, 0x0000, 0x8F45, 0x8F46, 0x8F47, 0x0000, 0x8F48, 0x8F49, 0x8F4A, 0x0000, 0x0000, 0x0000,\n    0x8F4B, 0x0000, 0x8F4C, 0x8F4D, 0x8F4E, 0x8F4F, 0x8F50, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F51, 0x0000, 0x8F52, 0x0000,\n    0x8F53, 0x8F54, 0x8F55, 0x0000, 0x8F56, 0x8F57, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F58, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F59, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8F5A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8F5B, 0x0000, 0x0000, 0x8F5C, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F5D, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F5E, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F5F, 0x8F60, 0x0000, 0x0000, 0x0000, 0x8F61, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F62, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F63, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F64, 0x0000, 0x8F65, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8F66, 0x0000, 0x0000, 0x8F67, 0x0000, 0x0000, 0x0000, 0x8F68, 0x0000, 0x0000, 0x8F69, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F6A, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F6B, 0x0000, 0x0000, 0x8F6C, 0x0000, 0x8F6D, 0x8F6E, 0x0000, 0x8F6F, 0x0000,\n    0x0000, 0x0000, 0x8F70, 0x8F71, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8F72, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F73, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8F74, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F76, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8F77, 0x0000, 0x8F78, 0x0000, 0x8F79, 0x0000, 0x8F7A, 0x8F7B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F7C, 0x0000, 0x8F7D, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F7E, 0x0000, 0x8F7F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x8F80, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F81,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F82, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8F83, 0x0000, 0x8F84, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F85, 0x0000, 0x8F86, 0x8F87, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x8F88, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F89, 0x0000, 0x0000, 0x8F8A, 0x0000, 0x8F8B, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F8C, 0x0000, 0x0000, 0x0000, 0x8F8D,\n    0x0000, 0x8F8E, 0x8F8F, 0x8F90, 0x0000, 0x8F91, 0x8F92, 0x8F93, 0x8F94, 0x0000, 0x8F95, 0x0000, 0x8F96, 0x0000, 0x8F97, 0x8F98,\n    0x8F99, 0x8F9A, 0x8F9B, 0x8F9C, 0x0000, 0x0000, 0x0000, 0x8F9D, 0x8F9E, 0x0000, 0x0000, 0x0000, 0x8F9F, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8FA0, 0x0000, 0x0000, 0x8FA1, 0x0000, 0x8FA2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FA3, 0x0000, 0x0000,\n    0x8FA4, 0x0000, 0x8FA5, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FA6, 0x8FA7, 0x8FA8, 0x0000, 0x8FA9, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FAA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FAB, 0x8FAC, 0x8FAD, 0x8FAE,\n    0x0000, 0x0000, 0x8FAF, 0x8FB0, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FB1, 0x8FB2, 0x0000, 0x8FB3, 0x0000, 0x0000, 0x8FB4, 0x0000,\n    0x0000, 0x0000, 0x8FB5, 0x0000, 0x0000, 0x8FB6, 0x0000, 0x8FB7, 0x0000, 0x0000, 0x0000, 0x8FB8, 0x8FB9, 0x0000, 0x0000, 0x8FBA,\n    0x8FBB, 0x8FBC, 0x0000, 0x8FBD, 0x8FBE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FC0, 0x8FC1, 0x8FC2,\n    0x0000, 0x8FC3, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FC4, 0x0000, 0x8FC5, 0x0000, 0x8FC6, 0x8FC7, 0x8FC8, 0x0000, 0x0000, 0x0000,\n    0x8FC9, 0x0000, 0x0000, 0x0000, 0x8FCA, 0x0000, 0x8FCB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FCC, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8FCD, 0x8FCE, 0x0000, 0x8FCF, 0x0000, 0x0000, 0x0000, 0x8FD0, 0x8FD1, 0x8FD2, 0x0000, 0x8FD3, 0x0000, 0x8FD4,\n    0x0000, 0x0000, 0x8FD5, 0x0000, 0x8FD6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FD7, 0x8FD8, 0x8FD9, 0x8FDA,\n    0x0000, 0x0000, 0x0000, 0x8FDB, 0x8FDC, 0x8FDD, 0x0000, 0x0000, 0x0000, 0x8FDE, 0x8FDF, 0x0000, 0x8FE0, 0x0000, 0x8FE1, 0x0000,\n    0x0000, 0x8FE2, 0x8FE3, 0x8FE4, 0x0000, 0x0000, 0x8FE5, 0x0000, 0x8FE6, 0x0000, 0x8FE7, 0x8FE8, 0x8FE9, 0x0000, 0x8FEA, 0x0000,\n    0x0000, 0x8FEB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FEC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x8FED, 0x0000, 0x8FEE, 0x0000, 0x8FEF, 0x8FF0, 0x0000, 0x0000, 0x0000, 0x8FF1, 0x0000, 0x8FF2, 0x0000, 0x8FF3, 0x8FF4,\n    0x0000, 0x8FF5, 0x0000, 0x8FF6, 0x0000, 0x8FF7, 0x0000, 0x0000, 0x8FF8, 0x8FF9, 0x0000, 0x8FFA, 0x8FFB, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x8FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FFD, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FFE, 0x0000, 0x8FFF, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x9001, 0x9002, 0x0000,\n    0x0000, 0x9003, 0x0000, 0x9004, 0x9005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x9006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x9007, 0x9008, 0x9009, 0x0000, 0x900A, 0x900B, 0x0000, 0x0000, 0x900C, 0x900D, 0x0000, 0x900E, 0x0000, 0x900F, 0x0000, 0x9010,\n    0x0000, 0x0000, 0x9011, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9012, 0x0000, 0x0000,\n    0x9013, 0x9014, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9015, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9016,\n    0x0000, 0x9017, 0x9018, 0x0000, 0x0000, 0x9019, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x901A, 0x901B, 0x901C,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x901D, 0x0000, 0x0000, 0x901E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x901F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9020, 0x0000, 0x9021, 0x9022, 0x0000,\n    0x9023, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9024, 0x9025, 0x9026, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9027, 0x0000,\n    0x9028, 0x9029, 0x902A, 0x902B, 0x902C, 0x902D, 0x0000, 0x0000, 0x0000, 0x0000, 0x902E, 0x0000, 0x902F, 0x9030, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9031, 0x0000, 0x9032, 0x0000, 0x0000, 0x9033, 0x9034, 0x0000, 0x0000, 0x0000, 0x9035,\n    0x0000, 0x0000, 0x9036, 0x0000, 0x9037, 0x9038, 0x9039, 0x0000, 0x0000, 0x0000, 0x903A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x903B,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x903C,\n    0x0000, 0x0000, 0x903D, 0x0000, 0x903E, 0x903F, 0x9040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9041, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9043, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x9044, 0x0000, 0x0000, 0x9045, 0x0000, 0x9046, 0x0000, 0x9047, 0x0000, 0x0000, 0x0000, 0x0000, 0x9048, 0x0000,\n    0x0000, 0x9049, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x904A, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x904B, 0x0000, 0x904C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x904D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x904E,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x904F, 0x0000, 0x0000, 0x9050, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x9051, 0x0000, 0x9052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9053, 0x9054, 0x0000,\n    0x9055, 0x9056, 0x9057, 0x9058, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9059, 0x0000, 0x0000, 0x0000, 0x905A, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x905B, 0x0000, 0x0000, 0x0000, 0x905C, 0x905D, 0x0000, 0x905E, 0x905F, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x9060, 0x9061, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9062, 0x0000, 0x9063, 0x9064, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x9065, 0x9066, 0x9067, 0x9068, 0x0000, 0x0000, 0x0000, 0x9069, 0x0000, 0x906A, 0x0000, 0x0000,\n    0x0000, 0x906B, 0x906C, 0x0000, 0x906D, 0x0000, 0x0000, 0x906E, 0x906F, 0x0000, 0x9070, 0x9071, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x9072, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9073, 0x0000, 0x9074,\n    0x0000, 0x0000, 0x9075, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9076, 0x9077, 0x0000, 0x0000, 0x0000, 0x9078, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x9079, 0x907A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x907B, 0x0000, 0x0000, 0x907C,\n    0x0000, 0x0000, 0x0000, 0x907D, 0x0000, 0x907E, 0x0000, 0x0000, 0x907F, 0x9080, 0x0000, 0x0000, 0x0000, 0x9081, 0x9082, 0x0000,\n    0x0000, 0x9083, 0x9084, 0x0000, 0x0000, 0x0000, 0x0000, 0x9085, 0x0000, 0x9086, 0x9087, 0x9088, 0x0000, 0x0000, 0x9089, 0x0000,\n    0x0000, 0x0000, 0x908A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x908B, 0x908C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x908D, 0x0000, 0x908E, 0x0000, 0x908F, 0x9090, 0x9091, 0x0000, 0x0000, 0x0000, 0x0000, 0x9092, 0x0000, 0x9093,\n    0x9094, 0x0000, 0x0000, 0x9095, 0x0000, 0x0000, 0x0000, 0x9096, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9097, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9098, 0x9099, 0x0000, 0x909A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x909B, 0x0000, 0x909C, 0x0000, 0x909D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x909E, 0x909F, 0x90A0, 0x0000, 0x90A1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90A2, 0x90A3, 0x0000, 0x90A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x90A5, 0x0000, 0x0000, 0x90A6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90A7, 0x0000, 0x90A8, 0x90A9, 0x90AA,\n    0x0000, 0x0000, 0x0000, 0x90AB, 0x0000, 0x0000, 0x90AC, 0x0000, 0x90AD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90AE,\n    0x90AF, 0x0000, 0x0000, 0x0000, 0x90B0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90B1, 0x0000, 0x0000, 0x0000, 0x90B2,\n    0x0000, 0x0000, 0x90B3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x90B4, 0x90B5, 0x90B6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90B7, 0x90B8, 0x0000, 0x0000,\n    0x90B9, 0x90BA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90BB, 0x0000, 0x90BC, 0x0000, 0x0000, 0x90BD,\n    0x0000, 0x0000, 0x90BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x90BF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90C0, 0x0000, 0x90C1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x90C2, 0x0000, 0x0000, 0x90C3, 0x0000, 0x90C4, 0x0000, 0x90C5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x90C6, 0x0000, 0x0000, 0x90C7, 0x90C8, 0x0000, 0x0000, 0x0000, 0x90C9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90CA,\n    0x0000, 0x0000, 0x90CB, 0x0000, 0x90CC, 0x0000, 0x0000, 0x0000, 0x0000, 0x90CD, 0x90CE, 0x90CF, 0x90D0, 0x0000, 0x0000, 0x90D1,\n    0x0000, 0x90D2, 0x90D3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x90D4, 0x0000, 0x0000, 0x90D5, 0x90D6, 0x0000, 0x90D7, 0x90D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90D9, 0x90DA, 0x0000, 0x0000, 0x0000, 0x0000, 0x90DB, 0x0000, 0x0000, 0x0000, 0x90DC,\n    0x0000, 0x0000, 0x90DD, 0x0000, 0x90DE, 0x0000, 0x0000, 0x0000, 0x90DF, 0x90E0, 0x90E1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90E2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90E3, 0x0000, 0x0000, 0x90E4, 0x0000, 0x90E5, 0x90E6, 0x0000, 0x90E7, 0x90E8, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90E9, 0x0000, 0x0000, 0x0000, 0x0000, 0x90EA, 0x0000, 0x90EB, 0x90EC, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90ED, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90EE, 0x0000, 0x0000, 0x0000, 0x90EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x90F0, 0x90F1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90F2, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x90F3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90F4, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90F5, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90F6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x90F7, 0x0000, 0x90F8, 0x90F9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90FA, 0x0000, 0x90FB,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x90FD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90FE, 0x90FF, 0x0000, 0x0000, 0x9100, 0x9101,\n    0x0000, 0x0000, 0x9102, 0x0000, 0x9103, 0x9104, 0x0000, 0x0000, 0x0000, 0x9105, 0x0000, 0x0000, 0x9106, 0x0000, 0x0000, 0x9107,\n    0x9108, 0x9109, 0x0000, 0x0000, 0x0000, 0x0000, 0x910A, 0x0000, 0x0000, 0x0000, 0x910B, 0x0000, 0x910C, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x910D, 0x0000, 0x0000, 0x0000, 0x0000, 0x910E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x910F, 0x9110, 0x0000,\n    0x9111, 0x0000, 0x0000, 0x0000, 0x9112, 0x9113, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9114, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x9115, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x9116, 0x9117, 0x9118, 0x9119, 0x911A, 0x911B, 0x911C, 0x911D, 0x911E, 0x911F, 0x9120, 0x9121, 0x9122, 0x9123, 0x9124, 0x9125,\n    0x9126, 0x9127, 0x9128, 0x9129, 0x912A, 0x912B, 0x912C, 0x912D, 0x912E, 0x912F, 0x9130, 0x9131, 0x9132, 0x9133, 0x9134, 0x9135,\n    0x9136, 0x9137, 0x9138, 0x9139, 0x913A, 0x913B, 0x913C, 0x913D, 0x913E, 0x913F, 0x9140, 0x9141, 0x9142, 0x9143, 0x9144, 0x9145,\n    0x9146, 0x9147, 0x9148, 0x9149, 0x914A, 0x914B, 0x914C, 0x914D, 0x914E, 0x914F, 0x9150, 0x9151, 0x9152, 0x9153, 0x9154, 0x9155,\n    0x9156, 0x9157, 0x9158, 0x9159, 0x915A, 0x915B, 0x915C, 0x915D, 0x915E, 0x915F, 0x9160, 0x9161, 0x9162, 0x9163, 0x9164, 0x9165,\n    0x9166, 0x9167, 0x9168, 0x9169, 0x916A, 0x916B, 0x916C, 0x916D, 0x916E, 0x916F, 0x9170, 0x9171, 0x9172, 0x9173, 0x9174, 0x9175,\n    0x9176, 0x9177, 0x9178, 0x9179, 0x917A, 0x917B, 0x917C, 0x917D, 0x917E, 0x917F, 0x9180, 0x9181, 0x9182, 0x9183, 0x9184, 0x9185,\n    0x9186, 0x9187, 0x9188, 0x9189, 0x918A, 0x918B, 0x918C, 0x918D, 0x918E, 0x918F, 0x9190, 0x9191, 0x9192, 0x9193, 0x9194, 0x9195,\n    0x9196, 0x9197, 0x9198, 0x9199, 0x919A, 0x919B, 0x919C, 0x919D, 0x919E, 0x919F, 0x91A0, 0x91A1, 0x91A2, 0x91A3, 0x91A4, 0x91A5,\n    0x91A6, 0x91A7, 0x91A8, 0x91A9, 0x91AA, 0x91AB, 0x91AC, 0x91AD, 0x91AE, 0x91AF, 0x91B0, 0x91B1, 0x91B2, 0x91B3, 0x91B4, 0x91B5,\n    0x91B6, 0x91B7, 0x91B8, 0x91B9, 0x91BA, 0x91BB, 0x91BC, 0x91BD, 0x91BE, 0x91BF, 0x91C0, 0x91C1, 0x91C2, 0x91C3, 0x91C4, 0x91C5,\n    0x91C6, 0x91C7, 0x91C8, 0x91C9, 0x91CA, 0x91CB, 0x91CC, 0x91CD, 0x91CE, 0x91CF, 0x91D0, 0x91D1, 0x91D2, 0x91D3, 0x91D4, 0x91D5,\n    0x91D6, 0x91D7, 0x91D8, 0x91D9, 0x91DA, 0x91DB, 0x91DC, 0x91DD, 0x91DE, 0x91DF, 0x91E0, 0x91E1, 0x91E2, 0x91E3, 0x91E4, 0x91E5,\n    0x91E6, 0x91E7, 0x91E8, 0x91E9, 0x91EA, 0x91EB, 0x91EC, 0x91ED, 0x91EE, 0x91EF, 0x91F0, 0x91F1, 0x91F2, 0x91F3, 0x91F4, 0x91F5,\n    0x91F6, 0x91F7, 0x91F8, 0x91F9, 0x91FA, 0x91FB, 0x91FC, 0x91FD, 0x91FE, 0x91FF, 0x9200, 0x9201, 0x9202, 0x9203, 0x9204, 0x9205,\n    0x9206, 0x9207, 0x9208, 0x9209, 0x920A, 0x920B, 0x920C, 0x920D, 0x920E, 0x920F, 0x9210, 0x9211, 0x9212, 0x9213, 0x9214, 0x9215,\n    0x9216, 0x9217, 0x9218, 0x9219, 0x921A, 0x921B, 0x921C, 0x921D, 0x921E, 0x921F, 0x9220, 0x9221, 0x9222, 0x9223, 0x0000, 0x0000,\n    0x9224, 0x0000, 0x9225, 0x0000, 0x0000, 0x9226, 0x9227, 0x9228, 0x9229, 0x922A, 0x922B, 0x922C, 0x922D, 0x922E, 0x922F, 0x0000,\n    0x9230, 0x0000, 0x9231, 0x0000, 0x0000, 0x9232, 0x9233, 0x0000, 0x0000, 0x0000, 0x9234, 0x9235, 0x9236, 0x9237, 0x0000, 0x0000,\n    0x9238, 0x9239, 0x923A, 0x923B, 0x923C, 0x923D, 0x923E, 0x923F, 0x9240, 0x9241, 0x9242, 0x9243, 0x9244, 0x9245, 0x9246, 0x9247,\n    0x9248, 0x9249, 0x924A, 0x924B, 0x924C, 0x924D, 0x924E, 0x924F, 0x9250, 0x9251, 0x9252, 0x9253, 0x9254, 0x9255, 0x9256, 0x9257,\n    0x9258, 0x9259, 0x925A, 0x925B, 0x925C, 0x925D, 0x925E, 0x925F, 0x9260, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265, 0x9266, 0x9267,\n    0x9268, 0x9269, 0x926A, 0x926B, 0x926C, 0x926D, 0x926E, 0x926F, 0x9270, 0x9271, 0x9272, 0x9273, 0x0000, 0x9274, 0x0000, 0x0000,\n    0x9275, 0x9276, 0x9277, 0x9278, 0x9279, 0x927A, 0x927B, 0x927C, 0x927D, 0x927E, 0x927F, 0x9280, 0x9281, 0x9282, 0x9283, 0x9284,\n    0x9285, 0x9286, 0x9287, 0x9288, 0x9289, 0x928A, 0x928B, 0x928C, 0x928D, 0x928E, 0x928F, 0x9290, 0x9291, 0x9292, 0x9293, 0x9294,\n    0x9295, 0x9296, 0x9297, 0x9298, 0x9299, 0x929A, 0x929B, 0x929C, 0x929D, 0x929E, 0x929F, 0x92A0, 0x92A1, 0x92A2, 0x92A3, 0x92A4,\n    0x92A5, 0x92A6, 0x92A7, 0x92A8, 0x92A9, 0x92AA, 0x92AB, 0x92AC, 0x92AD, 0x92AE, 0x92AF, 0x92B0, 0x92B1, 0x92B2, 0x92B3, 0x92B4,\n    0x92B5, 0x92B6, 0x92B7, 0x92B8, 0x92B9, 0x92BA, 0x92BB, 0x92BC, 0x92BD, 0x92BE, 0x92BF, 0x92C0, 0x92C1, 0x92C2, 0x92C3, 0x92C4,\n    0x92C5, 0x92C6, 0x92C7, 0x92C8, 0x92C9, 0x92CA, 0x92CB, 0x92CC, 0x92CD, 0x92CE, 0x92CF, 0x92D0, 0x92D1, 0x92D2, 0x92D3, 0x0000,\n    0x0000, 0x0000, 0x92D4, 0x92D5, 0x92D6, 0x0000, 0x0000, 0x0000, 0x92D7, 0x92D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x23AC, 0x23AE, 0x23B0, 0x3312, 0x3315, 0x23B2, 0x23B4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x23B6, 0x23B8, 0x23BA, 0x23BC, 0x23BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x23C0, 0x0000, 0x23C2,\n    0x92D9, 0x92DA, 0x92DB, 0x92DC, 0x92DD, 0x92DE, 0x92DF, 0x92E0, 0x92E1, 0x92E2, 0x23C4, 0x23C6, 0x23C8, 0x23CA, 0x23CC, 0x23CE,\n    0x23D0, 0x23D2, 0x23D4, 0x23D6, 0x23D8, 0x23DA, 0x23DC, 0x0000, 0x23DE, 0x23E0, 0x23E2, 0x23E4, 0x23E6, 0x0000, 0x23E8, 0x0000,\n    0x23EA, 0x23EC, 0x0000, 0x23EE, 0x23F0, 0x0000, 0x23F2, 0x23F4, 0x23F6, 0x23F8, 0x23FA, 0x23FC, 0x23FE, 0x2400, 0x2402, 0x2404,\n    0x92E3, 0x92E4, 0x92E5, 0x92E6, 0x92E7, 0x92E8, 0x92E9, 0x92EA, 0x92EB, 0x92EC, 0x92ED, 0x92EE, 0x92EF, 0x92F0, 0x92F1, 0x92F2,\n    0x92F3, 0x92F4, 0x92F5, 0x92F6, 0x92F7, 0x92F8, 0x92F9, 0x92FA, 0x92FB, 0x92FC, 0x92FD, 0x92FE, 0x92FF, 0x9300, 0x9301, 0x9302,\n    0x9303, 0x9304, 0x9305, 0x9306, 0x9307, 0x9308, 0x9309, 0x930A, 0x930B, 0x930C, 0x930D, 0x930E, 0x930F, 0x9310, 0x9311, 0x9312,\n    0x9313, 0x9314, 0x9315, 0x9316, 0x9317, 0x9318, 0x9319, 0x931A, 0x931B, 0x931C, 0x931D, 0x931E, 0x931F, 0x9320, 0x9321, 0x9322,\n    0x9323, 0x9324, 0x9325, 0x9326, 0x9327, 0x9328, 0x9329, 0x932A, 0x932B, 0x932C, 0x932D, 0x932E, 0x932F, 0x9330, 0x9331, 0x9332,\n    0x9333, 0x9334, 0x9335, 0x9336, 0x9337, 0x9338, 0x9339, 0x933A, 0x933B, 0x933C, 0x933D, 0x933E, 0x933F, 0x9340, 0x9341, 0x9342,\n    0x9343, 0x9344, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x9345, 0x9346, 0x9347, 0x9348, 0x9349, 0x934A, 0x934B, 0x934C, 0x934D, 0x934E, 0x934F, 0x9350, 0x9351,\n    0x9352, 0x9353, 0x9354, 0x9355, 0x9356, 0x9357, 0x9358, 0x9359, 0x935A, 0x935B, 0x2406, 0x2408, 0x240A, 0x240C, 0x240E, 0x2410,\n    0x2412, 0x2414, 0x2416, 0x2418, 0x241A, 0x241C, 0x241E, 0x2420, 0x2422, 0x2424, 0x2426, 0x2428, 0x935C, 0x935D, 0x935E, 0x935F,\n    0x242A, 0x242C, 0x242E, 0x2430, 0x2432, 0x2434, 0x2436, 0x2438, 0x243A, 0x243C, 0x243E, 0x2440, 0x2442, 0x2444, 0x2446, 0x2448,\n    0x244A, 0x244C, 0x244E, 0x2450, 0x2452, 0x2454, 0x2456, 0x2458, 0x245A, 0x245C, 0x245E, 0x2460, 0x2462, 0x2464, 0x2466, 0x2468,\n    0x246A, 0x246C, 0x246E, 0x2470, 0x2472, 0x2474, 0x2476, 0x2478, 0x247A, 0x247C, 0x247E, 0x2480, 0x2482, 0x2484, 0x2486, 0x2488,\n    0x248A, 0x248C, 0x248E, 0x2490, 0x2492, 0x2494, 0x2496, 0x2498, 0x249A, 0x249C, 0x249E, 0x24A0, 0x24A2, 0x24A4, 0x24A6, 0x24A8,\n    0x24AA, 0x24AC, 0x24AE, 0x24B0, 0x24B2, 0x24B4, 0x24B6, 0x24B8, 0x24BA, 0x24BC, 0x24BE, 0x24C0, 0x24C2, 0x24C4, 0x24C6, 0x24C8,\n    0x24CA, 0x24CC, 0x24CE, 0x24D0, 0x24D2, 0x24D4, 0x24D6, 0x24D8, 0x24DA, 0x24DC, 0x24DE, 0x24E0, 0x24E2, 0x24E4, 0x24E6, 0x24E8,\n    0x24EA, 0x24EC, 0x24EE, 0x24F0, 0x24F2, 0x24F4, 0x24F6, 0x24F8, 0x24FA, 0x24FC, 0x24FE, 0x2500, 0x2502, 0x2504, 0x2506, 0x2508,\n    0x250A, 0x250C, 0x250E, 0x2510, 0x2512, 0x2514, 0x2516, 0x2518, 0x251A, 0x251C, 0x251E, 0x2520, 0x2522, 0x2524, 0x2526, 0x2528,\n    0x252A, 0x252C, 0x252E, 0x2530, 0x2532, 0x2534, 0x2536, 0x2538, 0x253A, 0x253C, 0x253E, 0x2540, 0x2542, 0x2544, 0x2546, 0x2548,\n    0x254A, 0x254C, 0x254E, 0x2550, 0x2552, 0x2554, 0x2556, 0x2558, 0x255A, 0x255C, 0x255E, 0x2560, 0x2562, 0x2564, 0x2566, 0x2568,\n    0x256A, 0x256C, 0x256E, 0x2570, 0x2572, 0x2574, 0x2576, 0x2578, 0x257A, 0x257C, 0x257E, 0x2580, 0x2582, 0x2584, 0x2586, 0x2588,\n    0x258A, 0x258C, 0x258E, 0x2590, 0x2592, 0x2594, 0x2596, 0x2598, 0x259A, 0x259C, 0x259E, 0x25A0, 0x25A2, 0x25A4, 0x25A6, 0x25A8,\n    0x25AA, 0x25AC, 0x25AE, 0x25B0, 0x25B2, 0x25B4, 0x25B6, 0x25B8, 0x25BA, 0x25BC, 0x25BE, 0x25C0, 0x25C2, 0x25C4, 0x25C6, 0x25C8,\n    0x25CA, 0x25CC, 0x25CE, 0x25D0, 0x25D2, 0x25D4, 0x25D6, 0x25D8, 0x25DA, 0x25DC, 0x25DE, 0x25E0, 0x25E2, 0x25E4, 0x25E6, 0x25E8,\n    0x25EA, 0x25EC, 0x25EE, 0x25F0, 0x25F2, 0x25F4, 0x25F6, 0x25F8, 0x25FA, 0x25FC, 0x25FE, 0x2600, 0x2602, 0x2604, 0x2606, 0x2608,\n    0x260A, 0x260C, 0x3318, 0x331B, 0x331E, 0x260E, 0x2610, 0x2612, 0x2614, 0x2616, 0x2618, 0x261A, 0x261C, 0x261E, 0x2620, 0x2622,\n    0x2624, 0x2626, 0x2628, 0x262A, 0x262C, 0x262E, 0x2630, 0x2632, 0x2634, 0x2636, 0x2638, 0x263A, 0x263C, 0x263E, 0x2640, 0x2642,\n    0x2644, 0x2646, 0x2648, 0x264A, 0x264C, 0x264E, 0x2650, 0x2652, 0x2654, 0x2656, 0x2658, 0x265A, 0x265C, 0x265E, 0x2660, 0x2662,\n    0x2664, 0x2666, 0x2668, 0x266A, 0x266C, 0x266E, 0x2670, 0x2672, 0x2674, 0x2676, 0x2678, 0x267A, 0x267C, 0x267E, 0x2680, 0x2682,\n    0x2684, 0x2686, 0x2688, 0x268A, 0x268C, 0x268E, 0x2690, 0x2692, 0x2694, 0x2696, 0x2698, 0x269A, 0x269C, 0x269E, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x3321, 0x3324, 0x3327, 0x332A, 0x332D, 0x3330, 0x3333, 0x3336, 0x3339, 0x333C, 0x333F, 0x3342, 0x3345, 0x3348, 0x334B, 0x334E,\n    0x3351, 0x3354, 0x3357, 0x335A, 0x335D, 0x3360, 0x3363, 0x3366, 0x3369, 0x336C, 0x336F, 0x3372, 0x3375, 0x3378, 0x337B, 0x337E,\n    0x3381, 0x3384, 0x3387, 0x338A, 0x338D, 0x3390, 0x3393, 0x3396, 0x3399, 0x339C, 0x339F, 0x33A2, 0x33A5, 0x33A8, 0x33AB, 0x33AE,\n    0x33B1, 0x33B4, 0x33B7, 0x33BA, 0x33BD, 0x33C0, 0x33C3, 0x33C6, 0x33C9, 0x33CC, 0x33CF, 0x33D2, 0x33D5, 0x33D8, 0x33DB, 0x33DE,\n    0x0000, 0x0000, 0x33E1, 0x33E4, 0x33E7, 0x33EA, 0x33ED, 0x33F0, 0x33F3, 0x33F6, 0x33F9, 0x33FC, 0x33FF, 0x3402, 0x3405, 0x3408,\n    0x340B, 0x340E, 0x3411, 0x3414, 0x3417, 0x341A, 0x341D, 0x3420, 0x3423, 0x3426, 0x3429, 0x342C, 0x342F, 0x3432, 0x3435, 0x3438,\n    0x343B, 0x343E, 0x3441, 0x3444, 0x3447, 0x344A, 0x344D, 0x3450, 0x3453, 0x3456, 0x3459, 0x345C, 0x345F, 0x3462, 0x3465, 0x3468,\n    0x346B, 0x346E, 0x3471, 0x3474, 0x3477, 0x347A, 0x347D, 0x3480, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x3483, 0x3486, 0x41A4, 0x41A9, 0x41AE, 0x41B3, 0x41B8, 0x41BD, 0x41C2, 0x3489, 0x41C7, 0x41DA, 0x41E3, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x9360, 0x9361, 0x9362, 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, 0x9369, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x936A, 0x936B, 0x936C, 0x936D, 0x936E, 0x936F, 0x9370, 0x9371, 0x9372, 0x9373, 0x9374, 0x9375, 0x9376, 0x9377, 0x9378, 0x9379,\n    0x937A, 0x937B, 0x937C, 0x937D, 0x937E, 0x0000, 0x0000, 0x937F, 0x9380, 0x9381, 0x9382, 0x9383, 0x9384, 0x9385, 0x9386, 0x9387,\n    0x9388, 0x9389, 0x938A, 0x0000, 0x938B, 0x938C, 0x938D, 0x938E, 0x938F, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394, 0x9395, 0x9396,\n    0x9397, 0x9398, 0x9399, 0x939A, 0x939B, 0x939C, 0x939D, 0x0000, 0x939E, 0x939F, 0x93A0, 0x93A1, 0x0000, 0x0000, 0x0000, 0x0000,\n    0x93A2, 0x26A0, 0x93A3, 0x0000, 0x93A4, 0x0000, 0x93A5, 0x26A2, 0x93A6, 0x26A4, 0x93A7, 0x26A6, 0x93A8, 0x26A8, 0x93A9, 0x26AA,\n    0x93AA, 0x93AB, 0x93AC, 0x93AD, 0x93AE, 0x93AF, 0x93B0, 0x93B1, 0x93B2, 0x93B3, 0x93B4, 0x93B5, 0x93B6, 0x93B7, 0x93B8, 0x93B9,\n    0x93BA, 0x93BB, 0x93BC, 0x93BD, 0x93BE, 0x93BF, 0x93C0, 0x93C1, 0x93C2, 0x93C3, 0x93C4, 0x93C5, 0x93C6, 0x93C7, 0x93C8, 0x93C9,\n    0x93CA, 0x93CB, 0x93CC, 0x93CD, 0x93CE, 0x93CF, 0x93D0, 0x93D1, 0x93D2, 0x93D3, 0x93D4, 0x93D5, 0x93D6, 0x93D7, 0x93D8, 0x93D9,\n    0x93DA, 0x93DB, 0x93DC, 0x93DD, 0x93DE, 0x93DF, 0x93E0, 0x93E1, 0x93E2, 0x93E3, 0x93E4, 0x93E5, 0x93E6, 0x93E7, 0x93E8, 0x93E9,\n    0x93EA, 0x93EB, 0x93EC, 0x93ED, 0x93EE, 0x93EF, 0x93F0, 0x93F1, 0x93F2, 0x93F3, 0x93F4, 0x93F5, 0x93F6, 0x93F7, 0x93F8, 0x93F9,\n    0x93FA, 0x93FB, 0x93FC, 0x93FD, 0x93FE, 0x93FF, 0x9400, 0x9401, 0x9402, 0x9403, 0x9404, 0x9405, 0x9406, 0x9407, 0x9408, 0x9409,\n    0x940A, 0x940B, 0x940C, 0x940D, 0x940E, 0x940F, 0x9410, 0x9411, 0x9412, 0x9413, 0x9414, 0x9415, 0x9416, 0x9417, 0x9418, 0x9419,\n    0x941A, 0x941B, 0x941C, 0x941D, 0x941E, 0x26AC, 0x26AE, 0x26B0, 0x26B2, 0x26B4, 0x26B6, 0x26B8, 0x26BA, 0x0000, 0x0000, 0x0000,\n    0x0000, 0x941F, 0x9420, 0x9421, 0x9422, 0x9423, 0x9424, 0x9425, 0x9426, 0x9427, 0x9428, 0x9429, 0x942A, 0x942B, 0x942C, 0x942D,\n    0x942E, 0x942F, 0x9430, 0x9431, 0x9432, 0x9433, 0x9434, 0x9435, 0x9436, 0x9437, 0x9438, 0x9439, 0x943A, 0x943B, 0x943C, 0x943D,\n    0x943E, 0x943F, 0x9440, 0x9441, 0x9442, 0x9443, 0x9444, 0x9445, 0x9446, 0x9447, 0x9448, 0x9449, 0x944A, 0x944B, 0x944C, 0x944D,\n    0x944E, 0x944F, 0x9450, 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457, 0x9458, 0x9459, 0x945A, 0x945B, 0x945C, 0x945D,\n    0x945E, 0x945F, 0x9460, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467, 0x9468, 0x9469, 0x946A, 0x946B, 0x946C, 0x946D,\n    0x946E, 0x946F, 0x9470, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, 0x9477, 0x9478, 0x9479, 0x947A, 0x947B, 0x947C, 0x947D,\n    0x947E, 0x947F, 0x9480, 0x9481, 0x9482, 0x9483, 0x9484, 0x9485, 0x9486, 0x9487, 0x9488, 0x9489, 0x948A, 0x948B, 0x948C, 0x948D,\n    0x948E, 0x948F, 0x9490, 0x9491, 0x9492, 0x9493, 0x9494, 0x9495, 0x9496, 0x9497, 0x9498, 0x9499, 0x949A, 0x949B, 0x949C, 0x949D,\n    0x949E, 0x949F, 0x94A0, 0x94A1, 0x94A2, 0x94A3, 0x94A4, 0x94A5, 0x94A6, 0x94A7, 0x94A8, 0x94A9, 0x94AA, 0x94AB, 0x94AC, 0x94AD,\n    0x94AE, 0x94AF, 0x94B0, 0x94B1, 0x94B2, 0x94B3, 0x94B4, 0x94B5, 0x94B6, 0x94B7, 0x94B8, 0x94B9, 0x94BA, 0x94BB, 0x94BC, 0x94BD,\n    0x94BE, 0x94BF, 0x94C0, 0x94C1, 0x94C2, 0x94C3, 0x94C4, 0x94C5, 0x94C6, 0x94C7, 0x94C8, 0x94C9, 0x94CA, 0x94CB, 0x94CC, 0x94CD,\n    0x94CE, 0x94CF, 0x94D0, 0x94D1, 0x94D2, 0x94D3, 0x94D4, 0x94D5, 0x94D6, 0x94D7, 0x94D8, 0x94D9, 0x94DA, 0x94DB, 0x94DC, 0x0000,\n    0x0000, 0x0000, 0x94DD, 0x94DE, 0x94DF, 0x94E0, 0x94E1, 0x94E2, 0x0000, 0x0000, 0x94E3, 0x94E4, 0x94E5, 0x94E6, 0x94E7, 0x94E8,\n    0x0000, 0x0000, 0x94E9, 0x94EA, 0x94EB, 0x94EC, 0x94ED, 0x94EE, 0x0000, 0x0000, 0x94EF, 0x94F0, 0x94F1, 0x0000, 0x0000, 0x0000,\n    0x94F2, 0x94F3, 0x94F4, 0x94F5, 0x94F6, 0x94F7, 0x94F8, 0x0000, 0x94F9, 0x94FA, 0x94FB, 0x94FC, 0x94FD, 0x94FE, 0x94FF, 0x0000,\n    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000\n};\nextern const FX_WCHAR g_UnicodeData_Normalization_Map1[5376] = {\n    0x0066, 0x0053, 0x0053, 0x0059, 0x0020, 0x0308, 0x0061, 0x0052, 0x0304, 0x0032, 0x0033, 0x0301, 0x03BC, 0x0327, 0x0031, 0x006F,\n    0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x0043, 0x0045, 0x0045, 0x0045, 0x0045, 0x0049, 0x0049, 0x0049, 0x0049, 0x0044,\n    0x004E, 0x004F, 0x004F, 0x004F, 0x004F, 0x004F, 0x004F, 0x0055, 0x0055, 0x0055, 0x0055, 0x0059, 0x0061, 0x0061, 0x0061, 0x0061,\n    0x0061, 0x0061, 0x0063, 0x0065, 0x0065, 0x0065, 0x0065, 0x0069, 0x0069, 0x0069, 0x0069, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F,\n    0x006F, 0x006F, 0x0075, 0x0075, 0x0075, 0x0075, 0x0079, 0x0079, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0043, 0x0063,\n    0x0043, 0x0063, 0x0043, 0x0063, 0x0043, 0x0063, 0x0044, 0x0064, 0x0044, 0x0064, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065,\n    0x0045, 0x0065, 0x0045, 0x0065, 0x0047, 0x0067, 0x0047, 0x0067, 0x0047, 0x0067, 0x0047, 0x0067, 0x0048, 0x0068, 0x0048, 0x0068,\n    0x0049, 0x0069, 0x0049, 0x0069, 0x0049, 0x0069, 0x0049, 0x0069, 0x0049, 0x004A, 0x006A, 0x004B, 0x006B, 0x004B, 0x004C, 0x006C,\n    0x004C, 0x006C, 0x004C, 0x006C, 0x004C, 0x006C, 0x004C, 0x006C, 0x004E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x006E, 0x004F,\n    0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x0052, 0x0072, 0x0052, 0x0072, 0x0052, 0x0072, 0x0053, 0x0073, 0x0053, 0x0073, 0x0053,\n    0x0073, 0x0053, 0x0073, 0x0054, 0x0074, 0x0054, 0x0074, 0x0054, 0x0074, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055,\n    0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0057, 0x0077, 0x0059, 0x0079, 0x0059, 0x005A, 0x007A, 0x005A, 0x007A, 0x005A, 0x007A,\n    0x0073, 0x0062, 0x0042, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044, 0x0044, 0x0044, 0x0064, 0x0045, 0x0045, 0x0046, 0x0066, 0x0047,\n    0x0049, 0x004B, 0x006B, 0x006C, 0x004D, 0x004E, 0x006E, 0x004F, 0x004F, 0x006F, 0x0050, 0x0070, 0x0283, 0x0074, 0x0054, 0x0074,\n    0x0054, 0x0055, 0x0075, 0x0056, 0x0059, 0x0079, 0x005A, 0x007A, 0x01B7, 0x0041, 0x0061, 0x0049, 0x0069, 0x004F, 0x006F, 0x0055,\n    0x0075, 0x00DC, 0x00FC, 0x00DC, 0x00FC, 0x00DC, 0x00FC, 0x00DC, 0x00FC, 0x0065, 0x0041, 0x0061, 0x0041, 0x0061, 0x00C6, 0x00E6,\n    0x0047, 0x0067, 0x0047, 0x0067, 0x004B, 0x006B, 0x004F, 0x006F, 0x01EA, 0x01EB, 0x01B7, 0x0292, 0x006A, 0x0047, 0x0067, 0x004E,\n    0x006E, 0x0041, 0x0061, 0x00C6, 0x00E6, 0x00D8, 0x00F8, 0x0041, 0x0061, 0x0041, 0x0061, 0x0045, 0x0065, 0x0045, 0x0065, 0x0049,\n    0x0069, 0x0049, 0x0069, 0x004F, 0x006F, 0x004F, 0x006F, 0x0052, 0x0072, 0x0052, 0x0072, 0x0055, 0x0075, 0x0055, 0x0075, 0x0053,\n    0x0073, 0x0054, 0x0074, 0x0048, 0x0068, 0x004E, 0x0064, 0x005A, 0x007A, 0x0041, 0x0061, 0x0045, 0x0065, 0x00D6, 0x00F6, 0x00D5,\n    0x00F5, 0x004F, 0x006F, 0x022E, 0x022F, 0x0059, 0x0079, 0x006C, 0x006E, 0x0074, 0x006A, 0x0041, 0x0043, 0x0063, 0x004C, 0x0054,\n    0x0053, 0x005A, 0x0042, 0x0055, 0x0056, 0x0045, 0x0065, 0x004A, 0x006A, 0x0051, 0x0071, 0x0052, 0x0072, 0x0059, 0x0079, 0x0061,\n    0x0251, 0x0062, 0x006F, 0x0063, 0x0064, 0x0064, 0x0065, 0x0259, 0x0065, 0x0065, 0x0065, 0x0065, 0x006A, 0x0067, 0x0067, 0x0047,\n    0x0068, 0x0068, 0x0069, 0x0049, 0x006C, 0x006C, 0x006C, 0x006D, 0x006D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006F, 0x0072, 0x0072,\n    0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0052, 0x0052, 0x0073, 0x006A, 0x0283, 0x0283, 0x0074, 0x0074, 0x0055, 0x0076, 0x0076,\n    0x0077, 0x0079, 0x0059, 0x007A, 0x007A, 0x0292, 0x0043, 0x0042, 0x0065, 0x0047, 0x0048, 0x006A, 0x006B, 0x004C, 0x0071, 0x0068,\n    0x0068, 0x0068, 0x0068, 0x006A, 0x0072, 0x0279, 0x027B, 0x0281, 0x0077, 0x0079, 0x0263, 0x006C, 0x0073, 0x0078, 0x0295, 0x0300,\n    0x0301, 0x0313, 0x0308, 0x0061, 0x0065, 0x0069, 0x006F, 0x0075, 0x0063, 0x0064, 0x0068, 0x006D, 0x0072, 0x0074, 0x0076, 0x0078,\n    0x02B9, 0x003B, 0x0020, 0x00A8, 0x0391, 0x00B7, 0x0395, 0x0397, 0x0399, 0x039F, 0x03A5, 0x03A9, 0x03CA, 0x0399, 0x03A5, 0x03B1,\n    0x03B5, 0x03B7, 0x03B9, 0x03CB, 0x03B9, 0x03C5, 0x03BF, 0x03C5, 0x03C9, 0x03B2, 0x03B8, 0x03A5, 0x03D2, 0x03D2, 0x03C6, 0x03C0,\n    0x03BA, 0x03C1, 0x03C2, 0x0398, 0x03B5, 0x03A3, 0x0415, 0x0415, 0x0413, 0x0406, 0x041A, 0x0418, 0x0423, 0x0418, 0x0438, 0x0435,\n    0x0435, 0x0433, 0x0456, 0x043A, 0x0438, 0x0443, 0x0466, 0x0467, 0x046A, 0x046B, 0x0474, 0x0475, 0x0460, 0x0461, 0x0419, 0x0439,\n    0x0420, 0x0440, 0x0413, 0x0433, 0x0413, 0x0433, 0x0413, 0x0433, 0x0416, 0x0436, 0x0417, 0x0437, 0x041A, 0x043A, 0x041A, 0x043A,\n    0x041A, 0x043A, 0x041A, 0x043A, 0x041D, 0x043D, 0x041F, 0x043F, 0x0421, 0x0441, 0x0422, 0x0442, 0x04AE, 0x04AF, 0x0425, 0x0445,\n    0x0427, 0x0447, 0x0427, 0x0447, 0x0416, 0x0436, 0x04BC, 0x04BD, 0x0416, 0x0436, 0x041A, 0x043A, 0x041B, 0x043B, 0x041D, 0x043D,\n    0x041D, 0x043D, 0x041C, 0x043C, 0x0410, 0x0430, 0x0410, 0x0430, 0x0415, 0x0435, 0x04D8, 0x04D9, 0x0416, 0x0436, 0x0417, 0x0437,\n    0x0418, 0x0438, 0x0418, 0x0438, 0x041E, 0x043E, 0x04E8, 0x04E9, 0x042D, 0x044D, 0x0423, 0x0443, 0x0423, 0x0443, 0x0423, 0x0443,\n    0x0427, 0x0447, 0x0413, 0x0433, 0x042B, 0x044B, 0x0413, 0x0433, 0x0425, 0x0445, 0x0425, 0x0445, 0x0417, 0x0437, 0x041B, 0x043B,\n    0x0F0B, 0x10DC, 0x0041, 0x00C6, 0x0042, 0x0042, 0x0044, 0x0045, 0x018E, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D,\n    0x004E, 0x004F, 0x0222, 0x0050, 0x0052, 0x0054, 0x0055, 0x0057, 0x0061, 0x0250, 0x0251, 0x1D02, 0x0062, 0x0064, 0x0065, 0x0259,\n    0x025B, 0x025C, 0x0067, 0x006B, 0x006D, 0x014B, 0x006F, 0x0254, 0x1D16, 0x1D17, 0x0070, 0x0074, 0x0075, 0x1D1D, 0x026F, 0x0076,\n    0x1D25, 0x03B2, 0x03B3, 0x03B4, 0x03C6, 0x03C7, 0x0069, 0x0072, 0x0075, 0x0076, 0x03B2, 0x03B3, 0x03C1, 0x03C6, 0x03C7, 0x0062,\n    0x0064, 0x0066, 0x006D, 0x006E, 0x0070, 0x0072, 0x0072, 0x0073, 0x0074, 0x007A, 0x0067, 0x043D, 0x004C, 0x0070, 0x0055, 0x028A,\n    0x0062, 0x0064, 0x0066, 0x0067, 0x006B, 0x006C, 0x006D, 0x006E, 0x0070, 0x0072, 0x0073, 0x0283, 0x0076, 0x0078, 0x007A, 0x0061,\n    0x0251, 0x0064, 0x0065, 0x0065, 0x0065, 0x0065, 0x0069, 0x0283, 0x0252, 0x0063, 0x0255, 0x00F0, 0x025C, 0x0066, 0x025F, 0x0261,\n    0x0265, 0x0268, 0x0269, 0x026A, 0x1D7B, 0x029D, 0x026D, 0x1D85, 0x029F, 0x0271, 0x0270, 0x0272, 0x0273, 0x0274, 0x0275, 0x0278,\n    0x0282, 0x0283, 0x01AB, 0x0289, 0x028A, 0x1D1C, 0x028B, 0x028C, 0x007A, 0x0290, 0x0291, 0x0292, 0x03B8, 0x0041, 0x0061, 0x0042,\n    0x0062, 0x0042, 0x0062, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044, 0x0064, 0x0044, 0x0064, 0x0044, 0x0064, 0x0044, 0x0064, 0x0044,\n    0x0064, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0228, 0x0229, 0x0046, 0x0066, 0x0047, 0x0067, 0x0048,\n    0x0068, 0x0048, 0x0068, 0x0048, 0x0068, 0x0048, 0x0068, 0x0048, 0x0068, 0x0049, 0x0069, 0x00CF, 0x00EF, 0x004B, 0x006B, 0x004B,\n    0x006B, 0x004B, 0x006B, 0x004C, 0x006C, 0x004C, 0x006C, 0x004C, 0x006C, 0x004C, 0x006C, 0x004D, 0x006D, 0x004D, 0x006D, 0x004D,\n    0x006D, 0x004E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x00D5, 0x00F5, 0x00D5, 0x00F5, 0x014C, 0x014D, 0x014C,\n    0x014D, 0x0050, 0x0070, 0x0050, 0x0070, 0x0052, 0x0072, 0x0052, 0x0072, 0x0052, 0x0072, 0x0052, 0x0072, 0x0053, 0x0073, 0x0053,\n    0x0073, 0x0053, 0x0073, 0x0053, 0x0073, 0x0053, 0x0073, 0x0054, 0x0074, 0x0054, 0x0074, 0x0054, 0x0074, 0x0054, 0x0074, 0x0055,\n    0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0168, 0x0169, 0x016A, 0x016B, 0x0056, 0x0076, 0x0056, 0x0076, 0x0057, 0x0077, 0x0057,\n    0x0077, 0x0057, 0x0077, 0x0057, 0x0077, 0x0057, 0x0077, 0x0058, 0x0078, 0x0058, 0x0078, 0x0059, 0x0079, 0x005A, 0x007A, 0x005A,\n    0x007A, 0x005A, 0x007A, 0x0068, 0x0074, 0x0077, 0x0079, 0x0061, 0x017F, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041,\n    0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041,\n    0x0061, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045,\n    0x0065, 0x0049, 0x0069, 0x0049, 0x0069, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F,\n    0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x0055, 0x0075, 0x0055,\n    0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0059, 0x0079, 0x0059, 0x0079, 0x0059,\n    0x0079, 0x0059, 0x0079, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x0391, 0x0391, 0x0391, 0x0391, 0x0391,\n    0x0391, 0x0391, 0x0391, 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0x0395, 0x0395, 0x0395, 0x0395, 0x0395, 0x0395, 0x03B7,\n    0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x03B9,\n    0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x0399, 0x0399, 0x0399, 0x0399, 0x0399, 0x0399, 0x0399, 0x0399, 0x03BF,\n    0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C5,\n    0x03C5, 0x03C5, 0x03C5, 0x03A5, 0x03A5, 0x03A5, 0x03A5, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03A9,\n    0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03B1, 0x03B1, 0x03B5, 0x03B5, 0x03B7, 0x03B7, 0x03B9, 0x03B9, 0x03BF,\n    0x03BF, 0x03C5, 0x03C5, 0x03C9, 0x03C9, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x0391, 0x0391, 0x0391,\n    0x0391, 0x0391, 0x0391, 0x0391, 0x0391, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, 0x0397, 0x0397,\n    0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03A9, 0x03A9, 0x03A9,\n    0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x0391, 0x0391, 0x0391, 0x0391,\n    0x0391, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0395, 0x0395, 0x0397, 0x0397, 0x0397, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9,\n    0x03B9, 0x0399, 0x0399, 0x0399, 0x0399, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C1, 0x03C1, 0x03C5, 0x03C5, 0x03A5, 0x03A5, 0x03A5,\n    0x03A5, 0x03A1, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x039F, 0x039F, 0x03A9, 0x03A9, 0x03A9, 0x00B4, 0x0314, 0x0020, 0x0020,\n    0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x2010, 0x0333, 0x002E, 0x0020, 0x0020, 0x0030, 0x0069,\n    0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x002B, 0x2212, 0x003D, 0x0028, 0x0029, 0x006E, 0x0030, 0x0031, 0x0032, 0x0033,\n    0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x002B, 0x2212, 0x003D, 0x0028, 0x0029, 0x0061, 0x0065, 0x006F, 0x0078, 0x0259,\n    0x0043, 0x0190, 0x0067, 0x0048, 0x0048, 0x0048, 0x0068, 0x0068, 0x0049, 0x0049, 0x004C, 0x006C, 0x004E, 0x0050, 0x0051, 0x0052,\n    0x0052, 0x0052, 0x0052, 0x0052, 0x0056, 0x005A, 0x03A9, 0x01B1, 0x005A, 0x004B, 0x00C5, 0x0042, 0x0043, 0x0065, 0x0065, 0x0045,\n    0x0046, 0x004D, 0x006F, 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x0069, 0x03C0, 0x03B3, 0x0393, 0x03A0, 0x2211, 0x0044, 0x0064, 0x0065,\n    0x0069, 0x006A, 0x0049, 0x0056, 0x0058, 0x004C, 0x0043, 0x0044, 0x004D, 0x0069, 0x0076, 0x0078, 0x006C, 0x0063, 0x0064, 0x006D,\n    0x2203, 0x2208, 0x220B, 0x3008, 0x3009, 0x0062, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x0041,\n    0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,\n    0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,\n    0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,\n    0x0078, 0x0079, 0x007A, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x0030, 0x0031, 0x0032,\n    0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,\n    0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x004C, 0x006C, 0x004C, 0x0050, 0x0052, 0x0061, 0x0074,\n    0x0048, 0x0068, 0x004B, 0x006B, 0x005A, 0x007A, 0x0076, 0x0057, 0x0058, 0x0076, 0x006A, 0x0056, 0x2D61, 0x6BCD, 0x6C11, 0x864E,\n    0x897F, 0x89D2, 0x957F, 0x9752, 0x98DF, 0x9AA8, 0x9B3C, 0x9EA6, 0x9EC4, 0x9F9F, 0x4E00, 0x4E28, 0x4E36, 0x4E3F, 0x4E59, 0x4E85,\n    0x4E8C, 0x4EA0, 0x4EBA, 0x513F, 0x5165, 0x516B, 0x5182, 0x5196, 0x51AB, 0x51E0, 0x51F5, 0x5200, 0x529B, 0x52F9, 0x5315, 0x531A,\n    0x5338, 0x5341, 0x535C, 0x5369, 0x5382, 0x53B6, 0x53C8, 0x53E3, 0x56D7, 0x571F, 0x58EB, 0x5902, 0x590A, 0x5915, 0x5927, 0x5973,\n    0x5B50, 0x5B80, 0x5BF8, 0x5C0F, 0x5C22, 0x5C38, 0x5C6E, 0x5C71, 0x5DDB, 0x5DE5, 0x5DF1, 0x5DFE, 0x5E72, 0x5E7A, 0x5E7F, 0x5EF4,\n    0x5EFE, 0x5F0B, 0x5F13, 0x5F50, 0x5F61, 0x5F73, 0x5FC3, 0x6208, 0x6236, 0x624B, 0x652F, 0x6534, 0x6587, 0x6597, 0x65A4, 0x65B9,\n    0x65E0, 0x65E5, 0x66F0, 0x6708, 0x6728, 0x6B20, 0x6B62, 0x6B79, 0x6BB3, 0x6BCB, 0x6BD4, 0x6BDB, 0x6C0F, 0x6C14, 0x6C34, 0x706B,\n    0x722A, 0x7236, 0x723B, 0x723F, 0x7247, 0x7259, 0x725B, 0x72AC, 0x7384, 0x7389, 0x74DC, 0x74E6, 0x7518, 0x751F, 0x7528, 0x7530,\n    0x758B, 0x7592, 0x7676, 0x767D, 0x76AE, 0x76BF, 0x76EE, 0x77DB, 0x77E2, 0x77F3, 0x793A, 0x79B8, 0x79BE, 0x7A74, 0x7ACB, 0x7AF9,\n    0x7C73, 0x7CF8, 0x7F36, 0x7F51, 0x7F8A, 0x7FBD, 0x8001, 0x800C, 0x8012, 0x8033, 0x807F, 0x8089, 0x81E3, 0x81EA, 0x81F3, 0x81FC,\n    0x820C, 0x821B, 0x821F, 0x826E, 0x8272, 0x8278, 0x864D, 0x866B, 0x8840, 0x884C, 0x8863, 0x897E, 0x898B, 0x89D2, 0x8A00, 0x8C37,\n    0x8C46, 0x8C55, 0x8C78, 0x8C9D, 0x8D64, 0x8D70, 0x8DB3, 0x8EAB, 0x8ECA, 0x8F9B, 0x8FB0, 0x8FB5, 0x9091, 0x9149, 0x91C6, 0x91CC,\n    0x91D1, 0x9577, 0x9580, 0x961C, 0x96B6, 0x96B9, 0x96E8, 0x9751, 0x975E, 0x9762, 0x9769, 0x97CB, 0x97ED, 0x97F3, 0x9801, 0x98A8,\n    0x98DB, 0x98DF, 0x9996, 0x9999, 0x99AC, 0x9AA8, 0x9AD8, 0x9ADF, 0x9B25, 0x9B2F, 0x9B32, 0x9B3C, 0x9B5A, 0x9CE5, 0x9E75, 0x9E7F,\n    0x9EA5, 0x9EBB, 0x9EC3, 0x9ECD, 0x9ED1, 0x9EF9, 0x9EFD, 0x9F0E, 0x9F13, 0x9F20, 0x9F3B, 0x9F4A, 0x9F52, 0x9F8D, 0x9F9C, 0x9FA0,\n    0x0020, 0x3012, 0x5341, 0x5344, 0x5345, 0x1100, 0x1101, 0x11AA, 0x1102, 0x11AC, 0x11AD, 0x1103, 0x1104, 0x1105, 0x11B0, 0x11B1,\n    0x11B2, 0x11B3, 0x11B4, 0x11B5, 0x111A, 0x1106, 0x1107, 0x1108, 0x1121, 0x1109, 0x110A, 0x110B, 0x110C, 0x110D, 0x110E, 0x110F,\n    0x1110, 0x1111, 0x1112, 0x1161, 0x1162, 0x1163, 0x1164, 0x1165, 0x1166, 0x1167, 0x1168, 0x1169, 0x116A, 0x116B, 0x116C, 0x116D,\n    0x116E, 0x116F, 0x1170, 0x1171, 0x1172, 0x1173, 0x1174, 0x1175, 0x1160, 0x1114, 0x1115, 0x11C7, 0x11C8, 0x11CC, 0x11CE, 0x11D3,\n    0x11D7, 0x11D9, 0x111C, 0x11DD, 0x11DF, 0x111D, 0x111E, 0x1120, 0x1122, 0x1123, 0x1127, 0x1129, 0x112B, 0x112C, 0x112D, 0x112E,\n    0x112F, 0x1132, 0x1136, 0x1140, 0x1147, 0x114C, 0x11F1, 0x11F2, 0x1157, 0x1158, 0x1159, 0x1184, 0x1185, 0x1188, 0x1191, 0x1192,\n    0x1194, 0x119E, 0x11A1, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E0A, 0x4E2D, 0x4E0B, 0x7532, 0x4E59, 0x4E19, 0x4E01, 0x5929, 0x5730,\n    0x4EBA, 0x554F, 0x5E7C, 0x6587, 0x7B8F, 0x1100, 0x1102, 0x1103, 0x1105, 0x1106, 0x1107, 0x1109, 0x110B, 0x110C, 0x110E, 0x110F,\n    0x1110, 0x1111, 0x1112, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D, 0x5341, 0x6708, 0x706B, 0x6C34,\n    0x6728, 0x91D1, 0x571F, 0x65E5, 0x682A, 0x6709, 0x793E, 0x540D, 0x7279, 0x8CA1, 0x795D, 0x52B4, 0x79D8, 0x7537, 0x5973, 0x9069,\n    0x512A, 0x5370, 0x6CE8, 0x9805, 0x4F11, 0x5199, 0x6B63, 0x4E0A, 0x4E2D, 0x4E0B, 0x5DE6, 0x53F3, 0x533B, 0x5B97, 0x5B66, 0x76E3,\n    0x4F01, 0x8CC7, 0x5354, 0x591C, 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7,\n    0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5,\n    0x30D8, 0x30DB, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF,\n    0x30F0, 0x30F1, 0x30F2, 0x4E22, 0x5E76, 0x5E7A, 0x5E72, 0x4E71, 0x4E98, 0x4E9A, 0x4F2B, 0x5E03, 0x5360, 0x6765, 0x4FA3, 0x4FE3,\n    0x7CFB, 0x4FA0, 0x4F25, 0x4FE9, 0x4ED3, 0x4E2A, 0x4EEC, 0x4F26, 0x4F1F, 0x4FA7, 0x4FA6, 0x4F2A, 0x6770, 0x4F27, 0x4F1E, 0x5907,\n    0x5BB6, 0x4F63, 0x506C, 0x4F20, 0x4F1B, 0x503A, 0x4F24, 0x503E, 0x507B, 0x4EC5, 0x4F65, 0x4FA8, 0x4EC6, 0x4FA5, 0x507E, 0x96C7,\n    0x4EF7, 0x4EEA, 0x4FAC, 0x4EBF, 0x4FED, 0x50A7, 0x4FE6, 0x4FAA, 0x5C3D, 0x507F, 0x4F18, 0x50A8, 0x4FEA, 0x50A9, 0x50A5, 0x4FE8,\n    0x51F6, 0x5151, 0x513F, 0x5156, 0x5185, 0x4E24, 0x518C, 0x80C4, 0x5199, 0x5E42, 0x51BB, 0x51DB, 0x51EF, 0x522B, 0x5220, 0x522D,\n    0x5219, 0x5239, 0x521A, 0x5265, 0x5250, 0x5240, 0x521B, 0x522C, 0x5212, 0x5267, 0x5218, 0x523D, 0x523F, 0x5251, 0x5242, 0x52B2,\n    0x52A8, 0x52D6, 0x52A1, 0x80DC, 0x52B3, 0x52BF, 0x52A2, 0x52CB, 0x52B1, 0x529D, 0x5300, 0x5326, 0x6C47, 0x532E, 0x533A, 0x534F,\n    0x6064, 0x5374, 0x538D, 0x538C, 0x5389, 0x53A3, 0x53C2, 0x4E1B, 0x54A4, 0x5434, 0x5450, 0x5415, 0x5458, 0x55B1, 0x5457, 0x5FF5,\n    0x95EE, 0x54D1, 0x542F, 0x5524, 0x4E27, 0x4E54, 0x5355, 0x54DF, 0x545B, 0x556C, 0x551D, 0x5417, 0x545C, 0x5522, 0x54D4, 0x53F9,\n    0x55BD, 0x5455, 0x5567, 0x5C1D, 0x551B, 0x54D7, 0x5520, 0x5578, 0x53FD, 0x54D3, 0x5452, 0x5574, 0x6076, 0x5618, 0x549D, 0x54D2,\n    0x54DD, 0x54D5, 0x55F3, 0x54D9, 0x55B7, 0x5428, 0x549B, 0x5413, 0x54DC, 0x5C1D, 0x565C, 0x556E, 0x5456, 0x5499, 0x4EB8, 0x55BE,\n    0x4E25, 0x5624, 0x556D, 0x55EB, 0x56A3, 0x5181, 0x5453, 0x5570, 0x5631, 0x56F1, 0x56F5, 0x56FD, 0x56F4, 0x56ED, 0x5706, 0x56FE,\n    0x56E2, 0x57AD, 0x6267, 0x575A, 0x57A9, 0x57DA, 0x5C27, 0x62A5, 0x573A, 0x5757, 0x8314, 0x57B2, 0x57D8, 0x6D82, 0x51A2, 0x575E,\n    0x57D9, 0x5C18, 0x5811, 0x57AB, 0x5760, 0x5815, 0x575F, 0x57A6, 0x575B, 0x538B, 0x5792, 0x5739, 0x5786, 0x574F, 0x5785, 0x575C,\n    0x575D, 0x58EE, 0x58F6, 0x58F8, 0x5BFF, 0x591F, 0x68A6, 0x4F19, 0x5939, 0x5942, 0x5965, 0x5941, 0x593A, 0x594B, 0x59F9, 0x5986,\n    0x59D7, 0x5978, 0x5A31, 0x5A04, 0x5987, 0x5A05, 0x5A32, 0x59AB, 0x5AAA, 0x5988, 0x59AA, 0x59A9, 0x5A34, 0x5A73, 0x5A06, 0x5A75,\n    0x5A07, 0x5AF1, 0x5AD2, 0x5B37, 0x5AD4, 0x5A74, 0x5A76, 0x5A08, 0x5B59, 0x5B66, 0x5B6A, 0x5BAB, 0x5BDD, 0x5B9E, 0x5B81, 0x5BA1,\n    0x5199, 0x5BBD, 0x5BA0, 0x5B9D, 0x5C06, 0x4E13, 0x5BFB, 0x5BF9, 0x5BFC, 0x5C34, 0x5C4A, 0x5C38, 0x5C49, 0x5C61, 0x5C42, 0x5C5F,\n    0x5C66, 0x5C5E, 0x5188, 0x5C98, 0x5C9B, 0x5CE1, 0x5D03, 0x5C97, 0x4ED1, 0x5CE5, 0x5C9A, 0x5D5D, 0x5D2D, 0x5C96, 0x5D5A, 0x5D02,\n    0x5CE4, 0x5CE3, 0x5CC4, 0x5D04, 0x5C99, 0x5D58, 0x5CAD, 0x5C7F, 0x5CB3, 0x5CBF, 0x5CE6, 0x5DC5, 0x5DEF, 0x5E05, 0x5E08, 0x5E10,\n    0x5E26, 0x5E27, 0x5E0F, 0x5E3C, 0x5E3B, 0x5E1C, 0x5E01, 0x5E2E, 0x5E31, 0x5E72, 0x51E0, 0x5E93, 0x5395, 0x53A2, 0x53A6, 0x53A8,\n    0x53AE, 0x5E99, 0x5382, 0x5E91, 0x5E9F, 0x5E7F, 0x5EEA, 0x5E90, 0x5385, 0x5F11, 0x5F2A, 0x5F20, 0x5F3A, 0x5F39, 0x5F25, 0x5F2F,\n    0x5F66, 0x540E, 0x5F84, 0x4ECE, 0x5F95, 0x590D, 0x5F81, 0x5F7B, 0x6052, 0x803B, 0x60A6, 0x6005, 0x95F7, 0x6076, 0x607C, 0x607D,\n    0x607B, 0x7231, 0x60EC, 0x60AB, 0x6006, 0x607A, 0x5FFE, 0x6001, 0x6120, 0x60E8, 0x60ED, 0x6078, 0x60EF, 0x6004, 0x6002, 0x8651,\n    0x60AD, 0x5E86, 0x5FE7, 0x60EB, 0x601C, 0x51ED, 0x6126, 0x616D, 0x60EE, 0x6124, 0x60AF, 0x6003, 0x5BAA, 0x5FC6, 0x6073, 0x5E94,\n    0x603F, 0x61D4, 0x603C, 0x61D1, 0x6079, 0x60E9, 0x61D2, 0x6000, 0x60AC, 0x5FCF, 0x60E7, 0x6151, 0x604B, 0x6206, 0x620B, 0x6217,\n    0x622C, 0x6218, 0x620F, 0x6237, 0x629B, 0x631F, 0x820D, 0x626A, 0x5377, 0x626B, 0x62A1, 0x6323, 0x6302, 0x91C7, 0x62E3, 0x626C,\n    0x6362, 0x6325, 0x635F, 0x6447, 0x6363, 0x62A2, 0x63B4, 0x63BC, 0x6402, 0x631A, 0x62A0, 0x629F, 0x63BA, 0x635E, 0x6491, 0x6320,\n    0x6322, 0x63B8, 0x62E8, 0x629A, 0x6251, 0x63FF, 0x631E, 0x631D, 0x6361, 0x62E5, 0x63B3, 0x62E9, 0x51FB, 0x6321, 0x62C5, 0x636E,\n    0x6324, 0x62DF, 0x6448, 0x62E7, 0x6401, 0x63B7, 0x6269, 0x64B7, 0x6446, 0x64DE, 0x64B8, 0x6270, 0x6445, 0x64B5, 0x62E2, 0x62E6,\n    0x6484, 0x6400, 0x64BA, 0x643A, 0x6444, 0x6512, 0x631B, 0x644A, 0x6405, 0x63FD, 0x668B, 0x8D25, 0x53D9, 0x654C, 0x6570, 0x655B,\n    0x6BD9, 0x6593, 0x65A9, 0x65AD, 0x4E8E, 0x5347, 0x65F6, 0x664B, 0x663C, 0x6655, 0x6656, 0x65F8, 0x7545, 0x6682, 0x6635, 0x6654,\n    0x5386, 0x6619, 0x6653, 0x66A7, 0x65F7, 0x663D, 0x6652, 0x4E66, 0x4F1A, 0x80E7, 0x4E1C, 0x6805, 0x6746, 0x6800, 0x67A7, 0x6761,\n    0x67AD, 0x5F03, 0x67A8, 0x67A3, 0x680B, 0x6808, 0x6816, 0x6860, 0x6768, 0x67AB, 0x6862, 0x4E1A, 0x6781, 0x6769, 0x8363, 0x6864,\n    0x6784, 0x67AA, 0x6760, 0x68BF, 0x6920, 0x6901, 0x6868, 0x6869, 0x4E50, 0x679E, 0x697C, 0x6807, 0x67A2, 0x6837, 0x6734, 0x6811,\n    0x6866, 0x6861, 0x6865, 0x673A, 0x692D, 0x6A2A, 0x6AA9, 0x69DC, 0x67FD, 0x6863, 0x6867, 0x69DA, 0x68C0, 0x6A2F, 0x68BC, 0x53F0,\n    0x69DF, 0x67E0, 0x69DB, 0x82D8, 0x67DC, 0x6A79, 0x6988, 0x6809, 0x691F, 0x6A7C, 0x680E, 0x6A71, 0x69E0, 0x680C, 0x67A5, 0x6A65,\n    0x6987, 0x680A, 0x6989, 0x68C2, 0x6A31, 0x680F, 0x6743, 0x6924, 0x683E, 0x6984, 0x94A6, 0x6B27, 0x6B24, 0x6B22, 0x5C81, 0x5386,\n    0x5F52, 0x6B81, 0x6B8B, 0x6B92, 0x6B87, 0x6B9A, 0x6B93, 0x6BA1, 0x6B7C, 0x6740, 0x58F3, 0x6BC1, 0x6BB4, 0x6BF5, 0x6BE1, 0x6C07,\n    0x6C14, 0x6C22, 0x6C29, 0x6C32, 0x51FC, 0x51B3, 0x51B1, 0x6CA1, 0x51B5, 0x6CC4, 0x6C79, 0x6D43, 0x6CFE, 0x51C9, 0x51C4, 0x6CEA,\n    0x6E0C, 0x51C0, 0x6CA6, 0x6E0A, 0x6D9E, 0x6D45, 0x6DA3, 0x51CF, 0x6CA8, 0x6DA1, 0x6D4B, 0x6D51, 0x51D1, 0x6D48, 0x6D8C, 0x6D07,\n    0x6C64, 0x6CA9, 0x51C6, 0x6C9F, 0x6E29, 0x6DA2, 0x6E7F, 0x6CA7, 0x706D, 0x6DA4, 0x8365, 0x6CAA, 0x6EDE, 0x6E17, 0x6D52, 0x6D50,\n    0x6EDA, 0x6EE1, 0x6E14, 0x6E87, 0x6CA4, 0x6C49, 0x6D9F, 0x6E0D, 0x6DA8, 0x6E10, 0x6D46, 0x988D, 0x6CFC, 0x6D01, 0x6F5C, 0x6DA6,\n    0x6D54, 0x6E83, 0x6DA0, 0x6DA9, 0x6D47, 0x6D9D, 0x6C84, 0x6DA7, 0x6E11, 0x6CFD, 0x6EEA, 0x6CF6, 0x6D4D, 0x6D4A, 0x6D53, 0x6E7F,\n    0x6CDE, 0x6D4E, 0x6D9B, 0x6EE5, 0x6F4D, 0x6EE8, 0x6E85, 0x6CFA, 0x6EE4, 0x6EE2, 0x6E0E, 0x6CFB, 0x6D4F, 0x6FD2, 0x6CF8, 0x6CA5,\n    0x6F47, 0x6F46, 0x6F74, 0x6CF7, 0x6FD1, 0x6F4B, 0x6F9C, 0x6CA3, 0x6EE0, 0x6D12, 0x6EE9, 0x704F, 0x6E7E, 0x6EE6, 0x6EDF, 0x707E,\n    0x4E3A, 0x4E4C, 0x70C3, 0x65E0, 0x70BC, 0x709C, 0x70DF, 0x8315, 0x7115, 0x70E6, 0x7080, 0x8367, 0x709D, 0x70ED, 0x70BD, 0x70E8,\n    0x706F, 0x7096, 0x70E7, 0x70EB, 0x7116, 0x8425, 0x707F, 0x70DB, 0x70E9, 0x70EC, 0x7118, 0x70C1, 0x7089, 0x70C2, 0x4E89, 0x4E3A,\n    0x7237, 0x5C14, 0x5899, 0x724D, 0x7275, 0x8366, 0x7266, 0x728A, 0x727A, 0x72B6, 0x72ED, 0x72C8, 0x72F0, 0x72B9, 0x72F2, 0x72B8,\n    0x72F1, 0x72EE, 0x5956, 0x72EC, 0x72EF, 0x7303, 0x72DE, 0x83B7, 0x730E, 0x72B7, 0x517D, 0x736D, 0x732E, 0x7315, 0x7321, 0x73B0,\n    0x73D0, 0x73F2, 0x73AE, 0x739A, 0x7410, 0x7476, 0x83B9, 0x739B, 0x7405, 0x73B1, 0x740F, 0x740E, 0x7391, 0x7477, 0x73F0, 0x73AF,\n    0x7399, 0x73BA, 0x743C, 0x73D1, 0x748E, 0x74D2, 0x74EF, 0x74EE, 0x4EA7, 0x4EA7, 0x4EA9, 0x6BD5, 0x753B, 0x7572, 0x5F02, 0x5F53,\n    0x7574, 0x53E0, 0x75C9, 0x9178, 0x75F9, 0x75D6, 0x75AF, 0x75A1, 0x75EA, 0x7617, 0x75AE, 0x759F, 0x75AD, 0x7618, 0x7597, 0x75E8,\n    0x75EB, 0x7605, 0x75A0, 0x762A, 0x75D2, 0x7596, 0x75AC, 0x765E, 0x7663, 0x763F, 0x763E, 0x75C8, 0x762B, 0x766B, 0x53D1, 0x7691,\n    0x75B1, 0x76B2, 0x76B1, 0x676F, 0x76D7, 0x76CF, 0x5C3D, 0x76D1, 0x76D8, 0x5362, 0x8361, 0x7726, 0x4F17, 0x56F0, 0x7741, 0x7750,\n    0x772F, 0x7792, 0x4E86, 0x7786, 0x7751, 0x772C, 0x77A9, 0x77EB, 0x7845, 0x70AE, 0x7841, 0x7856, 0x7817, 0x781A, 0x7855, 0x7800,\n    0x786E, 0x7801, 0x7859, 0x7816, 0x789C, 0x789B, 0x77F6, 0x7857, 0x785A, 0x7840, 0x788D, 0x77FF, 0x783A, 0x783E, 0x77FE, 0x783B,\n    0x7984, 0x7978, 0x796F, 0x794E, 0x5FA1, 0x7985, 0x793C, 0x7977, 0x79C3, 0x7C7C, 0x7A0E, 0x79C6, 0x68F1, 0x79CD, 0x79F0, 0x7A23,\n    0x79EF, 0x9896, 0x79FE, 0x7A51, 0x79FD, 0x7A33, 0x7A9D, 0x6D3C, 0x7A77, 0x7A91, 0x7A8E, 0x7AAD, 0x7AA5, 0x7A9C, 0x7A8D, 0x7AA6,\n    0x7A83, 0x7ADE, 0x7B14, 0x7B0B, 0x7B15, 0x7B3A, 0x7B5D, 0x8282, 0x8303, 0x7B51, 0x7BA7, 0x7B7C, 0x7B03, 0x7B5B, 0x7B5A, 0x7BA6,\n    0x7BD3, 0x7BAA, 0x7B80, 0x7BD1, 0x7BAB, 0x6A90, 0x7B5C, 0x7B7E, 0x5E18, 0x7BEE, 0x7B79, 0x7B93, 0x7BEF, 0x7BA8, 0x7C41, 0x7B3C,\n    0x7B7E, 0x7B3E, 0x7BF1, 0x7BA9, 0x5401, 0x5986, 0x7CA4, 0x7CC1, 0x7CAA, 0x7CAE, 0x7CF5, 0x7C9D, 0x7C74, 0x7C9C, 0x7EA0, 0x7EAA,\n    0x7EA3, 0x7EA6, 0x7EA2, 0x7EA1, 0x7EA5, 0x7EA8, 0x7EAB, 0x7EB9, 0x7EB3, 0x7EBD, 0x7EBE, 0x7EAF, 0x7EB0, 0x7EB1, 0x7EB8, 0x7EA7,\n    0x7EB7, 0x7EAD, 0x7EB4, 0x7EBA, 0x624E, 0x624E, 0x7EC6, 0x7EC2, 0x7EC1, 0x7EC5, 0x7EBB, 0x7ECD, 0x7EC0, 0x7ECB, 0x7ED0, 0x7ECC,\n    0x7EC8, 0x5F26, 0x7EC4, 0x7ECA, 0x7ED7, 0x7ED3, 0x7EDD, 0x7EE6, 0x7ED4, 0x7EDE, 0x7EDC, 0x7EDA, 0x7ED9, 0x7ED2, 0x7ED6, 0x7EDF,\n    0x4E1D, 0x7EDB, 0x7EE2, 0x7ED1, 0x7EE1, 0x7EE0, 0x7EE8, 0x7EE5, 0x7ECF, 0x7EFC, 0x7F0D, 0x7EFF, 0x7EF8, 0x7EFB, 0x7EF6, 0x7EF4,\n    0x7EFE, 0x7EB2, 0x7F51, 0x7F00, 0x7EB6, 0x7EFA, 0x7EEE, 0x7EFD, 0x7EF0, 0x7EEB, 0x7EF5, 0x7EF2, 0x7F01, 0x7D27, 0x7EEF, 0x7EEA,\n    0x7F03, 0x7F04, 0x7F02, 0x7EBF, 0x7F09, 0x7F0E, 0x7F14, 0x7F17, 0x7F18, 0x7F0C, 0x7F16, 0x7F13, 0x7F05, 0x7EAC, 0x7F11, 0x7F08,\n    0x7EC3, 0x7F0F, 0x7F07, 0x81F4, 0x8426, 0x7F19, 0x7F22, 0x7F12, 0x7EC9, 0x7F23, 0x7F1E, 0x7F1A, 0x7F1C, 0x7F1F, 0x7F1B, 0x53BF,\n    0x7F1D, 0x7F29, 0x7EB5, 0x7F27, 0x7F26, 0x7D77, 0x7F15, 0x7F25, 0x603B, 0x7EE9, 0x7EF7, 0x7F2B, 0x7F2A, 0x7F2F, 0x7EC7, 0x7F2E,\n    0x7F2D, 0x7ED5, 0x7EE3, 0x7F0B, 0x7EF3, 0x7ED8, 0x7CFB, 0x8327, 0x7F33, 0x7F32, 0x7F34, 0x7ECE, 0x7EE7, 0x7F24, 0x7F31, 0x7F2C,\n    0x7EA9, 0x7EED, 0x7F20, 0x7F28, 0x7EA4, 0x7F35, 0x7F06, 0x94B5, 0x7F42, 0x7F5A, 0x9A82, 0x7F62, 0x7F57, 0x7F74, 0x7F81, 0x8288,\n    0x7F9F, 0x7FA1, 0x4E49, 0x81BB, 0x4E60, 0x7FC6, 0x7FDA, 0x7FD8, 0x7FD9, 0x8027, 0x5723, 0x95FB, 0x8054, 0x806A, 0x58F0, 0x8038,\n    0x8069, 0x8042, 0x804C, 0x804D, 0x542C, 0x804B, 0x8083, 0x80C1, 0x8109, 0x80EB, 0x8131, 0x80C0, 0x80BE, 0x80E8, 0x8136, 0x8111,\n    0x80BF, 0x811A, 0x80A0, 0x817D, 0x8158, 0x80A4, 0x80F6, 0x817B, 0x80C6, 0x810D, 0x8113, 0x8138, 0x8110, 0x8191, 0x814A, 0x80EA,\n    0x810F, 0x8114, 0x81DC, 0x5367, 0x4E34, 0x53F0, 0x4E0E, 0x5174, 0x4E3E, 0x65E7, 0x8231, 0x8223, 0x8230, 0x823B, 0x8270, 0x8273,\n    0x82C4, 0x520D, 0x82CE, 0x5179, 0x8346, 0x8C46, 0x5E84, 0x830E, 0x835A, 0x82CB, 0x534E, 0x70DF, 0x82CC, 0x83B1, 0x4E07, 0x83B4,\n    0x53F6, 0x836D, 0x7740, 0x82C7, 0x8364, 0x641C, 0x83B3, 0x8385, 0x82CD, 0x836A, 0x76D6, 0x83B2, 0x82C1, 0x83BC, 0x835C, 0x848C,\n    0x848B, 0x8471, 0x8311, 0x836B, 0x8368, 0x8487, 0x835E, 0x836C, 0x83B8, 0x835B, 0x8489, 0x829C, 0x8427, 0x84E3, 0x835F, 0x84DF,\n    0x8297, 0x59DC, 0x8537, 0x83B6, 0x8350, 0x8428, 0x8360, 0x501F, 0x84DD, 0x8369, 0x827A, 0x836F, 0x85AE, 0x82C8, 0x853C, 0x853A,\n    0x841A, 0x8572, 0x82A6, 0x82CF, 0x8574, 0x82F9, 0x8616, 0x85D3, 0x8539, 0x830F, 0x5170, 0x84E0, 0x841D, 0x5904, 0x865A, 0x864F,\n    0x53F7, 0x4E8F, 0x866C, 0x86F1, 0x8715, 0x86AC, 0x8680, 0x732C, 0x867E, 0x8671, 0x8717, 0x86F3, 0x8682, 0x8424, 0x877C, 0x8780,\n    0x86F0, 0x8748, 0x87A8, 0x866E, 0x8749, 0x86F2, 0x866B, 0x86CF, 0x8681, 0x8683, 0x8747, 0x867F, 0x874E, 0x86F4, 0x877E, 0x869D,\n    0x8721, 0x86CE, 0x87CF, 0x86CA, 0x8695, 0x86EE, 0x4F17, 0x672F, 0x536B, 0x51B2, 0x886E, 0x8885, 0x8865, 0x88C5, 0x91CC, 0x5236,\n    0x590D, 0x88C8, 0x8886, 0x88E4, 0x88E2, 0x7F21, 0x891B, 0x4EB5, 0x88E5, 0x8884, 0x88E3, 0x88C6, 0x8934, 0x889C, 0x886C, 0x88AD,\n    0x8955, 0x89C1, 0x89C4, 0x89C5, 0x89C6, 0x89C7, 0x89CB, 0x89CD, 0x89CE, 0x4EB2, 0x89CA, 0x89CF, 0x89D0, 0x89D1, 0x89C9, 0x89C8,\n    0x89CC, 0x89C2, 0x89DE, 0x89EF, 0x89E6, 0x8BA2, 0x8BA3, 0x8BA1, 0x8BAF, 0x8BA7, 0x8BA8, 0x8BA6, 0x8BAD, 0x8BAA, 0x8BAB, 0x8BAC,\n    0x8BB0, 0x8BB9, 0x8BB6, 0x8BBC, 0x8BC0, 0x8BB7, 0x8BBF, 0x8BBE, 0x8BB8, 0x8BC9, 0x8BC3, 0x8BCA, 0x8BC1, 0x8BC2, 0x8BCB, 0x8BB5,\n    0x8BC8, 0x8BD2, 0x8BCF, 0x8BC4, 0x8BCE, 0x8BC5, 0x8BCD, 0x548F, 0x8BE9, 0x8BE2, 0x8BE3, 0x8BD5, 0x8BD7, 0x8BE7, 0x8BDF, 0x8BE1,\n    0x8BE0, 0x8BD8, 0x8BDD, 0x8BE5, 0x8BE6, 0x8BDC, 0x8BD9, 0x8BD6, 0x8BD4, 0x8BDB, 0x8BD3, 0x5938, 0x5FD7, 0x8BA4, 0x8BF3, 0x8BF6,\n    0x8BDE, 0x8BF1, 0x8BEE, 0x8BED, 0x8BDA, 0x8BEB, 0x8BEC, 0x8BEF, 0x8BF0, 0x8BF5, 0x8BF2, 0x8BF4, 0x8C01, 0x8BFE, 0x8C07, 0x8BFD,\n    0x8C0A, 0x8C03, 0x8C04, 0x8C06, 0x8C08, 0x8BFF, 0x8BF7, 0x8BE4, 0x8BF9, 0x8BFC, 0x8C05, 0x8BBA, 0x8C02, 0x8C00, 0x8C0D, 0x8C1E,\n    0x8C1D, 0x8C25, 0x8BE8, 0x8C14, 0x8C1B, 0x8C10, 0x8C0F, 0x8C15, 0x8C18, 0x8BB3, 0x8C19, 0x8C0C, 0x8BBD, 0x8BF8, 0x8C1A, 0x8C16,\n    0x8BFA, 0x8C0B, 0x8C12, 0x8C13, 0x8A8A, 0x8BCC, 0x8C0E, 0x8C1C, 0x8C27, 0x8C11, 0x8C21, 0x8C24, 0x8C26, 0x8BB2, 0x8C22, 0x8C23,\n    0x8C1F, 0x8C2A, 0x8C2C, 0x8BB4, 0x8C28, 0x8C29, 0x8BC1, 0x8C32, 0x8BA5, 0x8C2E, 0x8BC6, 0x8C2F, 0x8C2D, 0x8C31, 0x8C35, 0x8BD1,\n    0x8BAE, 0x8C34, 0x62A4, 0x8BEA, 0x8A89, 0x8C2B, 0x8BFB, 0x53D8, 0x8A5F, 0x96E0, 0x8C17, 0x8BA9, 0x8C30, 0x8C36, 0x8D5E, 0x8C20,\n    0x8C33, 0x5C82, 0x7AD6, 0x4E30, 0x732A, 0x8C6E, 0x732B, 0x8D1D, 0x8D1E, 0x8D1F, 0x8D22, 0x8D21, 0x8D2B, 0x8D27, 0x8D29, 0x8D2A,\n    0x8D2F, 0x8D23, 0x8D2E, 0x8D33, 0x8D40, 0x8D30, 0x8D35, 0x8D2C, 0x4E70, 0x8D37, 0x8D36, 0x8D39, 0x8D34, 0x8D3B, 0x8D38, 0x8D3A,\n    0x8D32, 0x8D42, 0x8D41, 0x8D3F, 0x8D45, 0x8D44, 0x8D3E, 0x8D3C, 0x8D48, 0x8D4A, 0x5BBE, 0x8D47, 0x8D52, 0x8D49, 0x8D50, 0x8D4F,\n    0x8D54, 0x8D53, 0x8D24, 0x5356, 0x8D31, 0x8D4B, 0x8D55, 0x8D28, 0x8D26, 0x8D4C, 0x8D56, 0x8D57, 0x8D5A, 0x8D59, 0x8D2D, 0x8D5B,\n    0x8D5C, 0x8D3D, 0x8D58, 0x8D5F, 0x8D60, 0x8D5E, 0x8D61, 0x8D62, 0x8D46, 0x8D43, 0x8D51, 0x8D4E, 0x8D5D, 0x8D63, 0x8D6A, 0x8D76,\n    0x8D75, 0x8D8B, 0x8DB1, 0x8FF9, 0x8DF5, 0x8E0A, 0x8DC4, 0x8DF8, 0x8DD6, 0x8E52, 0x8DF7, 0x8DF6, 0x8DB8, 0x8E0C, 0x8DFB, 0x8DC3,\n    0x8E2F, 0x8DDE, 0x8E2C, 0x8E70, 0x8DF9, 0x8E51, 0x8E7F, 0x8E9C, 0x8E8F, 0x8EAF, 0x8F66, 0x8F67, 0x8F68, 0x519B, 0x8F69, 0x8F6B,\n    0x8F6D, 0x8F6F, 0x8F78, 0x8F71, 0x8F74, 0x8F75, 0x8F7A, 0x8F72, 0x8F76, 0x8F7C, 0x8F83, 0x8F82, 0x8F81, 0x8F80, 0x8F7D, 0x8F7E,\n    0x8F84, 0x8F85, 0x8F7B, 0x8F86, 0x8F8E, 0x8F89, 0x8F8B, 0x8F8D, 0x8F8A, 0x8F87, 0x8F88, 0x8F6E, 0x8F91, 0x8F8F, 0x8F93, 0x8F90,\n    0x8F97, 0x8206, 0x8F92, 0x6BC2, 0x8F96, 0x8F95, 0x8F98, 0x8F6C, 0x8F99, 0x8F7F, 0x8F9A, 0x8F70, 0x8F94, 0x8F79, 0x8F73, 0x529E,\n    0x8F9E, 0x8FAB, 0x8FA9, 0x519C, 0x8FD9, 0x8FDE, 0x5468, 0x8FDB, 0x6E38, 0x8FD0, 0x8FC7, 0x8FBE, 0x8FDD, 0x9065, 0x900A, 0x9012,\n    0x8FDC, 0x9002, 0x8FDF, 0x8FC1, 0x9009, 0x9057, 0x8FBD, 0x8FC8, 0x8FD8, 0x8FE9, 0x8FB9, 0x903B, 0x9026, 0x90CF, 0x90AE, 0x90D3,\n    0x4E61, 0x90B9, 0x90AC, 0x90E7, 0x9093, 0x90D1, 0x90BB, 0x90F8, 0x90BA, 0x90D0, 0x909D, 0x9142, 0x90E6, 0x814C, 0x4E11, 0x915D,\n    0x533B, 0x9171, 0x9166, 0x917F, 0x8845, 0x917E, 0x917D, 0x91CA, 0x9487, 0x948C, 0x948A, 0x9489, 0x948B, 0x9488, 0x9493, 0x9490,\n    0x948F, 0x9492, 0x948E, 0x9497, 0x948D, 0x9495, 0x94AF, 0x94AB, 0x9498, 0x94AD, 0x94A0, 0x949D, 0x94A4, 0x94A3, 0x949E, 0x94AE,\n    0x94A7, 0x9499, 0x949B, 0x94AA, 0x94CC, 0x94C8, 0x94B6, 0x94C3, 0x94B4, 0x94B9, 0x94CD, 0x94B0, 0x94B8, 0x94C0, 0x94BF, 0x94BE,\n    0x949C, 0x94CA, 0x94C9, 0x94C7, 0x94CB, 0x94C2, 0x94B3, 0x94C6, 0x94C5, 0x94BA, 0x94A9, 0x94B2, 0x94BC, 0x94BD, 0x94CF, 0x94F0,\n    0x94D2, 0x94EC, 0x94EA, 0x94F6, 0x94F3, 0x94DC, 0x94DA, 0x94E3, 0x94E8, 0x94E2, 0x94ED, 0x94EB, 0x94E6, 0x8854, 0x94D1, 0x94F7,\n    0x94F1, 0x94DF, 0x94F5, 0x94D5, 0x94EF, 0x94D0, 0x9510, 0x9500, 0x9508, 0x9511, 0x9509, 0x94DD, 0x9512, 0x950C, 0x94A1, 0x94E4,\n    0x94D7, 0x950B, 0x950A, 0x9513, 0x9504, 0x9503, 0x9514, 0x9507, 0x94D3, 0x94FA, 0x94D6, 0x9506, 0x9502, 0x952F, 0x94A2, 0x951E,\n    0x5F55, 0x9516, 0x9529, 0x94D4, 0x9525, 0x9515, 0x951F, 0x9524, 0x9531, 0x94EE, 0x951B, 0x952C, 0x952D, 0x951C, 0x94B1, 0x9526,\n    0x951A, 0x9520, 0x9521, 0x9522, 0x9519, 0x9530, 0x8868, 0x94FC, 0x9528, 0x9494, 0x9534, 0x94FE, 0x9505, 0x9540, 0x9537, 0x94E1,\n    0x9496, 0x953B, 0x953D, 0x9538, 0x9532, 0x9539, 0x953E, 0x952E, 0x9536, 0x9517, 0x953A, 0x9541, 0x9551, 0x9555, 0x9501, 0x9549,\n    0x9548, 0x9543, 0x94A8, 0x84E5, 0x954F, 0x94E0, 0x94E9, 0x953C, 0x9550, 0x9547, 0x9552, 0x954D, 0x9553, 0x955E, 0x955F, 0x94FE,\n    0x9546, 0x9559, 0x9560, 0x955D, 0x94FF, 0x9535, 0x9557, 0x9558, 0x955B, 0x94F2, 0x955C, 0x9556, 0x9542, 0x933E, 0x955A, 0x94E7,\n    0x956A, 0x9508, 0x94D9, 0x9563, 0x9566, 0x9561, 0x949F, 0x956B, 0x950F, 0x9544, 0x954C, 0x9570, 0x956F, 0x956D, 0x94C1, 0x956E,\n    0x94CE, 0x94DB, 0x9571, 0x94F8, 0x956C, 0x9554, 0x9274, 0x9527, 0x9574, 0x94C4, 0x9573, 0x9567, 0x94A5, 0x9575, 0x9576, 0x954A,\n    0x9569, 0x9523, 0x94BB, 0x92AE, 0x51FF, 0x957F, 0x95E8, 0x95E9, 0x95EA, 0x95EB, 0x95EC, 0x95ED, 0x5F00, 0x95F6, 0x95F3, 0x95F0,\n    0x95F2, 0x95F4, 0x95F5, 0x95F8, 0x9602, 0x9601, 0x9600, 0x95FA, 0x95FD, 0x9603, 0x9606, 0x95FE, 0x9605, 0x960A, 0x9609, 0x960E,\n    0x960F, 0x960D, 0x9608, 0x960C, 0x9612, 0x677F, 0x6697, 0x95F1, 0x9614, 0x9615, 0x9611, 0x9617, 0x9618, 0x95FF, 0x9616, 0x9619,\n    0x95EF, 0x5173, 0x961A, 0x9613, 0x9610, 0x8F9F, 0x961B, 0x95FC, 0x9649, 0x9655, 0x9635, 0x9634, 0x9648, 0x9646, 0x9633, 0x9667,\n    0x961F, 0x9636, 0x9668, 0x9645, 0x968F, 0x9669, 0x9690, 0x9647, 0x96B6, 0x53EA, 0x96BD, 0x867D, 0x53CC, 0x96CF, 0x6742, 0x9E21,\n    0x79BB, 0x96BE, 0x4E91, 0x7535, 0x9721, 0x96FE, 0x9701, 0x96F3, 0x972D, 0x53C7, 0x7075, 0x53C6, 0x9753, 0x9759, 0x817C, 0x9765,\n    0x9F17, 0x5DE9, 0x979F, 0x7F30, 0x9791, 0x97AF, 0x97E6, 0x97E7, 0x97E9, 0x97EA, 0x97EC, 0x97EB, 0x97F5, 0x54CD, 0x9875, 0x9876,\n    0x9877, 0x9879, 0x987A, 0x9878, 0x987B, 0x987C, 0x9882, 0x9880, 0x9883, 0x9884, 0x987D, 0x9881, 0x987F, 0x9887, 0x9886, 0x988C,\n    0x9889, 0x9890, 0x988F, 0x5934, 0x988A, 0x988B, 0x9894, 0x9888, 0x9893, 0x9891, 0x9897, 0x9898, 0x989D, 0x989A, 0x989C, 0x9899,\n    0x989B, 0x613F, 0x98A1, 0x98A0, 0x7C7B, 0x989F, 0x98A2, 0x987E, 0x98A4, 0x98A5, 0x663E, 0x98A6, 0x9885, 0x989E, 0x98A7, 0x98CE,\n    0x98D0, 0x98D1, 0x98D2, 0x53F0, 0x98D3, 0x98D4, 0x98CF, 0x98D6, 0x98D5, 0x98D7, 0x98D8, 0x98D9, 0x98DE, 0x9965, 0x9964, 0x9966,\n    0x9968, 0x996A, 0x996B, 0x996C, 0x996D, 0x996E, 0x9974, 0x9972, 0x9971, 0x9970, 0x9973, 0x997A, 0x9978, 0x997C, 0x9977, 0x517B,\n    0x9975, 0x9979, 0x997D, 0x9981, 0x997F, 0x997E, 0x4F59, 0x80B4, 0x9984, 0x9983, 0x996F, 0x9985, 0x9986, 0x7CC7, 0x9967, 0x5582,\n    0x9989, 0x998E, 0x9969, 0x998F, 0x998A, 0x998C, 0x998D, 0x9992, 0x9990, 0x9991, 0x9988, 0x9994, 0x9976, 0x98E8, 0x990D, 0x998B,\n    0x9A6C, 0x9A6D, 0x51AF, 0x9A6E, 0x9A70, 0x9A6F, 0x9A73, 0x9A7B, 0x9A7D, 0x9A79, 0x9A75, 0x9A7E, 0x9A80, 0x9A78, 0x9A76, 0x9A7C,\n    0x9A77, 0x9A88, 0x9A87, 0x9A83, 0x9A86, 0x9A8E, 0x9A8F, 0x9A8B, 0x9A8D, 0x9A93, 0x9A92, 0x9A91, 0x9A90, 0x9A9B, 0x9A97, 0x9A99,\n    0x9A9E, 0x9A98, 0x9A9D, 0x817E, 0x9A7A, 0x9A9A, 0x9A9F, 0x9AA1, 0x84E6, 0x9A9C, 0x9A96, 0x9AA0, 0x9AA2, 0x9A71, 0x9A85, 0x9A95,\n    0x9A81, 0x9A84, 0x9A8C, 0x60CA, 0x9A7F, 0x9AA4, 0x9A74, 0x9AA7, 0x9AA5, 0x9AA6, 0x9A8A, 0x80AE, 0x9AC5, 0x810F, 0x4F53, 0x9ACC,\n    0x9ACB, 0x53D1, 0x677E, 0x80E1, 0x9B13, 0x6597, 0x95F9, 0x960B, 0x9604, 0x90C1, 0x9B49, 0x9B47, 0x9C7C, 0x9C80, 0x9C81, 0x9C82,\n    0x9C7F, 0x9C85, 0x9C86, 0x9C8F, 0x9C87, 0x9C90, 0x9C8D, 0x9C8B, 0x9C8A, 0x9C92, 0x9C95, 0x9C96, 0x9C94, 0x9C9B, 0x9C91, 0x9C9C,\n    0x9CA7, 0x9CA0, 0x9CA9, 0x9CA4, 0x9CA8, 0x9CBB, 0x9CAF, 0x9CAD, 0x9C9E, 0x9CB7, 0x9CB4, 0x9CB1, 0x9CB5, 0x9CB2, 0x9CB3, 0x9CB8,\n    0x9CAE, 0x9CB0, 0x9CB6, 0x9CAB, 0x9CCA, 0x9C97, 0x9CBD, 0x9CC7, 0x9CC5, 0x9CC6, 0x9CC3, 0x9CD2, 0x9CD1, 0x9CA5, 0x9CCF, 0x9CCE,\n    0x9CD0, 0x9CCD, 0x9CC1, 0x9CA2, 0x9CCC, 0x9CA6, 0x9CA3, 0x9CB9, 0x9CD7, 0x9CD4, 0x9CC9, 0x9CD5, 0x9CD6, 0x9CDF, 0x9CDD, 0x9CDC,\n    0x9CDE, 0x9C9F, 0x9CBC, 0x9C8E, 0x9C99, 0x9CE3, 0x9CE2, 0x9C9A, 0x9CC4, 0x9C88, 0x9CA1, 0x9E1F, 0x51EB, 0x9E20, 0x9E24, 0x51E4,\n    0x9E23, 0x9E22, 0x9E29, 0x9E28, 0x9E26, 0x9E30, 0x9E35, 0x9E33, 0x9E32, 0x9E2E, 0x9E31, 0x9E2A, 0x9E2F, 0x9E2D, 0x9E38, 0x9E39,\n    0x9E3B, 0x9E3F, 0x9E3D, 0x9E3A, 0x9E43, 0x9E46, 0x9E41, 0x9E48, 0x9E45, 0x9E44, 0x9E49, 0x9E4C, 0x9E4F, 0x9E4E, 0x9E4A, 0x9E53,\n    0x9E2B, 0x9E51, 0x9E4B, 0x9E59, 0x9E55, 0x9E57, 0x9E56, 0x9E4D, 0x9E5B, 0x9E5C, 0x83BA, 0x9E5F, 0x9E64, 0x9E60, 0x9E61, 0x9E58,\n    0x9E63, 0x9E5A, 0x9E62, 0x9E5E, 0x9E67, 0x9E65, 0x9E25, 0x9E37, 0x9E68, 0x9E36, 0x9E6A, 0x9E54, 0x9E69, 0x9E6B, 0x9E47, 0x9E6C,\n    0x9E70, 0x9E6D, 0x9E6F, 0x9E2C, 0x9E74, 0x9E66, 0x9E73, 0x9E42, 0x9E3E, 0x5364, 0x9E7E, 0x7877, 0x76D0, 0x4E3D, 0x9EA6, 0x9EB8,\n    0x9EB9, 0x9762, 0x4E48, 0x9EC4, 0x9EC9, 0x70B9, 0x515A, 0x9709, 0x9EE1, 0x9EE9, 0x9EFE, 0x9F0B, 0x9F0D, 0x9F39, 0x9F50, 0x658B,\n    0x8D4D, 0x9F51, 0x9F7F, 0x9F80, 0x9F81, 0x9F85, 0x9F87, 0x9F83, 0x9F86, 0x9F84, 0x9F88, 0x9F8A, 0x9F89, 0x9F8B, 0x9F8C, 0x9F99,\n    0x5390, 0x5E9E, 0x9F9A, 0x9F9B, 0x9F9F, 0xA76F, 0x8C48, 0x66F4, 0x8ECA, 0x8CC8, 0x6ED1, 0x4E32, 0x53E5, 0x9F9C, 0x9F9C, 0x5951,\n    0x91D1, 0x5587, 0x5948, 0x61F6, 0x7669, 0x7F85, 0x863F, 0x87BA, 0x88F8, 0x908F, 0x6A02, 0x6D1B, 0x70D9, 0x73DE, 0x843D, 0x916A,\n    0x99F1, 0x4E82, 0x5375, 0x6B04, 0x721B, 0x862D, 0x9E1E, 0x5D50, 0x6FEB, 0x85CD, 0x8964, 0x62C9, 0x81D8, 0x881F, 0x5ECA, 0x6717,\n    0x6D6A, 0x72FC, 0x90CE, 0x4F86, 0x51B7, 0x52DE, 0x64C4, 0x6AD3, 0x7210, 0x76E7, 0x8001, 0x8606, 0x865C, 0x8DEF, 0x9732, 0x9B6F,\n    0x9DFA, 0x788C, 0x797F, 0x7DA0, 0x83C9, 0x9304, 0x9E7F, 0x8AD6, 0x58DF, 0x5F04, 0x7C60, 0x807E, 0x7262, 0x78CA, 0x8CC2, 0x96F7,\n    0x58D8, 0x5C62, 0x6A13, 0x6DDA, 0x6F0F, 0x7D2F, 0x7E37, 0x964B, 0x52D2, 0x808B, 0x51DC, 0x51CC, 0x7A1C, 0x7DBE, 0x83F1, 0x9675,\n    0x8B80, 0x62CF, 0x6A02, 0x8AFE, 0x4E39, 0x5BE7, 0x6012, 0x7387, 0x7570, 0x5317, 0x78FB, 0x4FBF, 0x5FA9, 0x4E0D, 0x6CCC, 0x6578,\n    0x7D22, 0x53C3, 0x585E, 0x7701, 0x8449, 0x8AAA, 0x6BBA, 0x8FB0, 0x6C88, 0x62FE, 0x82E5, 0x63A0, 0x7565, 0x4EAE, 0x5169, 0x51C9,\n    0x6881, 0x7CE7, 0x826F, 0x8AD2, 0x91CF, 0x52F5, 0x5442, 0x5973, 0x5EEC, 0x65C5, 0x6FFE, 0x792A, 0x95AD, 0x9A6A, 0x9E97, 0x9ECE,\n    0x529B, 0x66C6, 0x6B77, 0x8F62, 0x5E74, 0x6190, 0x6200, 0x649A, 0x6F23, 0x7149, 0x7489, 0x79CA, 0x7DF4, 0x806F, 0x8F26, 0x84EE,\n    0x9023, 0x934A, 0x5217, 0x52A3, 0x54BD, 0x70C8, 0x88C2, 0x8AAA, 0x5EC9, 0x5FF5, 0x637B, 0x6BAE, 0x7C3E, 0x7375, 0x4EE4, 0x56F9,\n    0x5BE7, 0x5DBA, 0x601C, 0x73B2, 0x7469, 0x7F9A, 0x8046, 0x9234, 0x96F6, 0x9748, 0x9818, 0x4F8B, 0x79AE, 0x91B4, 0x96B8, 0x60E1,\n    0x4E86, 0x50DA, 0x5BEE, 0x5C3F, 0x6599, 0x6A02, 0x71CE, 0x7642, 0x84FC, 0x907C, 0x9F8D, 0x6688, 0x962E, 0x5289, 0x677B, 0x67F3,\n    0x6D41, 0x6E9C, 0x7409, 0x7559, 0x786B, 0x7D10, 0x985E, 0x516D, 0x622E, 0x9678, 0x502B, 0x5D19, 0x6DEA, 0x8F2A, 0x5F8B, 0x6144,\n    0x6817, 0x7387, 0x9686, 0x5229, 0x540F, 0x5C65, 0x6613, 0x674E, 0x68A8, 0x6CE5, 0x7406, 0x75E2, 0x7F79, 0x88CF, 0x88E1, 0x91CC,\n    0x96E2, 0x533F, 0x6EBA, 0x541D, 0x71D0, 0x7498, 0x85FA, 0x96A3, 0x9C57, 0x9E9F, 0x6797, 0x6DCB, 0x81E8, 0x7ACB, 0x7B20, 0x7C92,\n    0x72C0, 0x7099, 0x8B58, 0x4EC0, 0x8336, 0x523A, 0x5207, 0x5EA6, 0x62D3, 0x7CD6, 0x5B85, 0x6D1E, 0x66B4, 0x8F3B, 0x884C, 0x964D,\n    0x898B, 0x5ED3, 0x5140, 0x55C0, 0x585A, 0x6674, 0x51DE, 0x732A, 0x76CA, 0x793C, 0x795E, 0x7965, 0x798F, 0x9756, 0x7CBE, 0x7FBD,\n    0x8612, 0x8AF8, 0x9038, 0x90FD, 0x98EF, 0x98FC, 0x9928, 0x9DB4, 0x4FAE, 0x50E7, 0x514D, 0x52C9, 0x52E4, 0x5351, 0x559D, 0x5606,\n    0x5668, 0x5840, 0x58A8, 0x5C64, 0x5C6E, 0x6094, 0x6168, 0x618E, 0x61F2, 0x654F, 0x65E2, 0x6691, 0x6885, 0x6D77, 0x6E1A, 0x6F22,\n    0x716E, 0x722B, 0x7422, 0x7891, 0x793E, 0x7949, 0x7948, 0x7950, 0x7956, 0x795D, 0x798D, 0x798E, 0x7A40, 0x7A81, 0x7BC0, 0x7DF4,\n    0x7E09, 0x7E41, 0x7F72, 0x8005, 0x81ED, 0x8279, 0x8279, 0x8457, 0x8910, 0x8996, 0x8B01, 0x8B39, 0x8CD3, 0x8D08, 0x8FB6, 0x9038,\n    0x96E3, 0x97FF, 0x983B, 0x6075, 0x8218, 0x4E26, 0x51B5, 0x5168, 0x4F80, 0x5145, 0x5180, 0x52C7, 0x52FA, 0x559D, 0x5555, 0x5599,\n    0x55E2, 0x585A, 0x58B3, 0x5944, 0x5954, 0x5A62, 0x5B28, 0x5ED2, 0x5ED9, 0x5F69, 0x5FAD, 0x60D8, 0x614E, 0x6108, 0x618E, 0x6160,\n    0x61F2, 0x6234, 0x63C4, 0x641C, 0x6452, 0x6556, 0x6674, 0x6717, 0x671B, 0x6756, 0x6B79, 0x6BBA, 0x6D41, 0x6EDB, 0x6ECB, 0x6F22,\n    0x701E, 0x716E, 0x77A7, 0x7235, 0x72AF, 0x732A, 0x7471, 0x7506, 0x753B, 0x761D, 0x761F, 0x76CA, 0x76DB, 0x76F4, 0x774A, 0x7740,\n    0x78CC, 0x7AB1, 0x7BC0, 0x7C7B, 0x7D5B, 0x7DF4, 0x7F3E, 0x8005, 0x8352, 0x83EF, 0x8779, 0x8941, 0x8986, 0x8996, 0x8ABF, 0x8AF8,\n    0x8ACB, 0x8B01, 0x8AFE, 0x8AED, 0x8B39, 0x8B8A, 0x8D08, 0x8F38, 0x9072, 0x9199, 0x9276, 0x967C, 0x96E3, 0x9756, 0x97DB, 0x97FF,\n    0x980B, 0x983B, 0x9B12, 0x9F9C, 0x3B9D, 0x4018, 0x4039, 0x9F43, 0x9F8E, 0x05E2, 0x05D0, 0x05D3, 0x05D4, 0x05DB, 0x05DC, 0x05DD,\n    0x05E8, 0x05EA, 0x002B, 0x0671, 0x0671, 0x067B, 0x067B, 0x067B, 0x067B, 0x067E, 0x067E, 0x067E, 0x067E, 0x0680, 0x0680, 0x0680,\n    0x0680, 0x067A, 0x067A, 0x067A, 0x067A, 0x067F, 0x067F, 0x067F, 0x067F, 0x0679, 0x0679, 0x0679, 0x0679, 0x06A4, 0x06A4, 0x06A4,\n    0x06A4, 0x06A6, 0x06A6, 0x06A6, 0x06A6, 0x0684, 0x0684, 0x0684, 0x0684, 0x0683, 0x0683, 0x0683, 0x0683, 0x0686, 0x0686, 0x0686,\n    0x0686, 0x0687, 0x0687, 0x0687, 0x0687, 0x068D, 0x068D, 0x068C, 0x068C, 0x068E, 0x068E, 0x0688, 0x0688, 0x0698, 0x0698, 0x0691,\n    0x0691, 0x06A9, 0x06A9, 0x06A9, 0x06A9, 0x06AF, 0x06AF, 0x06AF, 0x06AF, 0x06B3, 0x06B3, 0x06B3, 0x06B3, 0x06B1, 0x06B1, 0x06B1,\n    0x06B1, 0x06BA, 0x06BA, 0x06BB, 0x06BB, 0x06BB, 0x06BB, 0x06C0, 0x06C0, 0x06C1, 0x06C1, 0x06C1, 0x06C1, 0x06BE, 0x06BE, 0x06BE,\n    0x06BE, 0x06D2, 0x06D2, 0x06D3, 0x06D3, 0x06AD, 0x06AD, 0x06AD, 0x06AD, 0x06C7, 0x06C7, 0x06C6, 0x06C6, 0x06C8, 0x06C8, 0x0677,\n    0x06CB, 0x06CB, 0x06C5, 0x06C5, 0x06C9, 0x06C9, 0x06D0, 0x06D0, 0x06D0, 0x06D0, 0x0649, 0x0649, 0x06CC, 0x06CC, 0x06CC, 0x06CC,\n    0x002C, 0x3001, 0x3002, 0x003A, 0x003B, 0x0021, 0x003F, 0x3016, 0x3017, 0x2026, 0x2025, 0x2014, 0x2013, 0x005F, 0x005F, 0x0028,\n    0x0029, 0x007B, 0x007D, 0x3014, 0x3015, 0x3010, 0x3011, 0x300A, 0x300B, 0x3008, 0x3009, 0x300C, 0x300D, 0x300E, 0x300F, 0x005B,\n    0x005D, 0x203E, 0x203E, 0x203E, 0x203E, 0x005F, 0x005F, 0x005F, 0x002C, 0x3001, 0x002E, 0x003B, 0x003A, 0x003F, 0x0021, 0x2014,\n    0x0028, 0x0029, 0x007B, 0x007D, 0x3014, 0x3015, 0x0023, 0x0026, 0x002A, 0x002B, 0x002D, 0x003C, 0x003E, 0x003D, 0x005C, 0x0024,\n    0x0025, 0x0040, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0x0650, 0x0651, 0x0652, 0x0621, 0x0622, 0x0622, 0x0623, 0x0623, 0x0624,\n    0x0624, 0x0625, 0x0625, 0x0626, 0x0626, 0x0626, 0x0626, 0x0627, 0x0627, 0x0628, 0x0628, 0x0628, 0x0628, 0x0629, 0x0629, 0x062A,\n    0x062A, 0x062A, 0x062A, 0x062B, 0x062B, 0x062B, 0x062B, 0x062C, 0x062C, 0x062C, 0x062C, 0x062D, 0x062D, 0x062D, 0x062D, 0x062E,\n    0x062E, 0x062E, 0x062E, 0x062F, 0x062F, 0x0630, 0x0630, 0x0631, 0x0631, 0x0632, 0x0632, 0x0633, 0x0633, 0x0633, 0x0633, 0x0634,\n    0x0634, 0x0634, 0x0634, 0x0635, 0x0635, 0x0635, 0x0635, 0x0636, 0x0636, 0x0636, 0x0636, 0x0637, 0x0637, 0x0637, 0x0637, 0x0638,\n    0x0638, 0x0638, 0x0638, 0x0639, 0x0639, 0x0639, 0x0639, 0x063A, 0x063A, 0x063A, 0x063A, 0x0641, 0x0641, 0x0641, 0x0641, 0x0642,\n    0x0642, 0x0642, 0x0642, 0x0643, 0x0643, 0x0643, 0x0643, 0x0644, 0x0644, 0x0644, 0x0644, 0x0645, 0x0645, 0x0645, 0x0645, 0x0646,\n    0x0646, 0x0646, 0x0646, 0x0647, 0x0647, 0x0647, 0x0647, 0x0648, 0x0648, 0x0649, 0x0649, 0x064A, 0x064A, 0x064A, 0x064A, 0x0021,\n    0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031,\n    0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041,\n    0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,\n    0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061,\n    0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071,\n    0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x2985, 0x2986, 0x3002,\n    0x300C, 0x300D, 0x3001, 0x30FB, 0x30F2, 0x30A1, 0x30A3, 0x30A5, 0x30A7, 0x30A9, 0x30E3, 0x30E5, 0x30E7, 0x30C3, 0x30FC, 0x30A2,\n    0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1,\n    0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF, 0x30E0,\n    0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F3, 0x3099, 0x309A, 0x3164, 0x3131,\n    0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3138, 0x3139, 0x313A, 0x313B, 0x313C, 0x313D, 0x313E, 0x313F, 0x3140, 0x3141,\n    0x3142, 0x3143, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x314A, 0x314B, 0x314C, 0x314D, 0x314E, 0x314F, 0x3150, 0x3151,\n    0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x315A, 0x315B, 0x315C, 0x315D, 0x315E, 0x315F, 0x3160, 0x3161,\n    0x3162, 0x3163, 0x00A2, 0x00A3, 0x00AC, 0x00AF, 0x00A6, 0x00A5, 0x20A9, 0x2502, 0x2190, 0x2191, 0x2192, 0x2193, 0x25A0, 0x25CB\n};\nextern const FX_WCHAR g_UnicodeData_Normalization_Map2[1724] = {\n    0x004F, 0x0045, 0x0054, 0x004D, 0x006F, 0x0065, 0x0049, 0x004A, 0x0069, 0x006A, 0x004F, 0x0045, 0x006F, 0x0065, 0x0044, 0x017D,\n    0x0044, 0x017E, 0x0064, 0x017E, 0x004C, 0x004A, 0x004C, 0x006A, 0x006C, 0x006A, 0x004E, 0x004A, 0x004E, 0x006A, 0x006E, 0x006A,\n    0x0044, 0x005A, 0x0044, 0x007A, 0x0064, 0x007A, 0x0064, 0x0062, 0x0071, 0x0070, 0x004F, 0x0045, 0x0064, 0x007A, 0x0064, 0x0292,\n    0x0064, 0x007A, 0x0074, 0x0073, 0x0074, 0x0283, 0x0074, 0x0063, 0x0066, 0x014B, 0x006C, 0x0073, 0x006C, 0x007A, 0x041D, 0x0413,\n    0x043D, 0x0433, 0x0422, 0x0426, 0x0442, 0x0446, 0x0410, 0x0415, 0x0430, 0x0435, 0x0565, 0x0582, 0x0627, 0x0674, 0x0648, 0x0674,\n    0x06C7, 0x0674, 0x064A, 0x0674, 0x06D5, 0x0654, 0x06C1, 0x0654, 0x06D2, 0x0654, 0x0928, 0x093C, 0x0930, 0x093C, 0x0933, 0x093C,\n    0x0915, 0x093C, 0x0916, 0x093C, 0x0917, 0x093C, 0x091C, 0x093C, 0x0921, 0x093C, 0x0922, 0x093C, 0x092B, 0x093C, 0x092F, 0x093C,\n    0x09C7, 0x09BE, 0x09C7, 0x09D7, 0x09A1, 0x09BC, 0x09A2, 0x09BC, 0x09AF, 0x09BC, 0x0A32, 0x0A3C, 0x0A38, 0x0A3C, 0x0A16, 0x0A3C,\n    0x0A17, 0x0A3C, 0x0A1C, 0x0A3C, 0x0A2B, 0x0A3C, 0x0B47, 0x0B56, 0x0B47, 0x0B3E, 0x0B47, 0x0B57, 0x0B21, 0x0B3C, 0x0B22, 0x0B3C,\n    0x0B92, 0x0BD7, 0x0BC6, 0x0BBE, 0x0BC7, 0x0BBE, 0x0BC6, 0x0BD7, 0x0C46, 0x0C56, 0x0CBF, 0x0CD5, 0x0CC6, 0x0CD5, 0x0CC6, 0x0CD6,\n    0x0CC6, 0x0CC2, 0x0CCA, 0x0CD5, 0x0D46, 0x0D3E, 0x0D47, 0x0D3E, 0x0D46, 0x0D57, 0x0DD9, 0x0DCA, 0x0DD9, 0x0DCF, 0x0DDC, 0x0DCA,\n    0x0DD9, 0x0DDF, 0x0E4D, 0x0E32, 0x0ECD, 0x0EB2, 0x0EAB, 0x0E99, 0x0EAB, 0x0EA1, 0x0F42, 0x0FB7, 0x0F4C, 0x0FB7, 0x0F51, 0x0FB7,\n    0x0F56, 0x0FB7, 0x0F5B, 0x0FB7, 0x0F40, 0x0FB5, 0x0F71, 0x0F72, 0x0F71, 0x0F74, 0x0FB2, 0x0F80, 0x0FB2, 0x0F81, 0x0FB3, 0x0F80,\n    0x0FB3, 0x0F81, 0x0F71, 0x0F80, 0x0F92, 0x0FB7, 0x0F9C, 0x0FB7, 0x0FA1, 0x0FB7, 0x0FA6, 0x0FB7, 0x0FAB, 0x0FB7, 0x0F90, 0x0FB5,\n    0x1025, 0x102E, 0x1B05, 0x1B35, 0x1B07, 0x1B35, 0x1B09, 0x1B35, 0x1B0B, 0x1B35, 0x1B0D, 0x1B35, 0x1B11, 0x1B35, 0x1B3A, 0x1B35,\n    0x1B3C, 0x1B35, 0x1B3E, 0x1B35, 0x1B3F, 0x1B35, 0x1B42, 0x1B35, 0x0074, 0x0068, 0x002E, 0x002E, 0x2032, 0x2032, 0x2035, 0x2035,\n    0x0021, 0x0021, 0x0020, 0x0305, 0x003F, 0x003F, 0x003F, 0x0021, 0x0021, 0x003F, 0x0052, 0x0073, 0x00B0, 0x0043, 0x00B0, 0x0046,\n    0x004E, 0x006F, 0x0053, 0x004D, 0x0054, 0x004D, 0x0031, 0x002F, 0x0049, 0x0049, 0x0049, 0x0056, 0x0056, 0x0049, 0x0049, 0x0058,\n    0x0058, 0x0049, 0x0069, 0x0069, 0x0069, 0x0076, 0x0076, 0x0069, 0x0069, 0x0078, 0x0078, 0x0069, 0x2190, 0x0338, 0x2192, 0x0338,\n    0x2194, 0x0338, 0x21D0, 0x0338, 0x21D4, 0x0338, 0x21D2, 0x0338, 0x2223, 0x0338, 0x2225, 0x0338, 0x222B, 0x222B, 0x222E, 0x222E,\n    0x223C, 0x0338, 0x2243, 0x0338, 0x2245, 0x0338, 0x2248, 0x0338, 0x003D, 0x002F, 0x2261, 0x002F, 0x224D, 0x002F, 0x003C, 0x002F,\n    0x003E, 0x002F, 0x2264, 0x002F, 0x2265, 0x002F, 0x2272, 0x002F, 0x2273, 0x002F, 0x2276, 0x002F, 0x2277, 0x002F, 0x227A, 0x002F,\n    0x227B, 0x002F, 0x2282, 0x002F, 0x2283, 0x002F, 0x2286, 0x002F, 0x2287, 0x002F, 0x22A2, 0x002F, 0x22A8, 0x002F, 0x22A9, 0x002F,\n    0x22AB, 0x002F, 0x227C, 0x002F, 0x227D, 0x002F, 0x2291, 0x002F, 0x2292, 0x002F, 0x22B2, 0x002F, 0x22B3, 0x002F, 0x22B4, 0x002F,\n    0x22B5, 0x002F, 0x0042, 0x0053, 0x0048, 0x0054, 0x004C, 0x0046, 0x0056, 0x0054, 0x0046, 0x0046, 0x0043, 0x0052, 0x0053, 0x0053,\n    0x0053, 0x0049, 0x0045, 0x004D, 0x0046, 0x0053, 0x0047, 0x0053, 0x0052, 0x0053, 0x0055, 0x0053, 0x0053, 0x0050, 0x0031, 0x0030,\n    0x0031, 0x0031, 0x0031, 0x0032, 0x0031, 0x0033, 0x0031, 0x0034, 0x0031, 0x0035, 0x0031, 0x0036, 0x0031, 0x0037, 0x0031, 0x0038,\n    0x0031, 0x0039, 0x0032, 0x0030, 0x0031, 0x002E, 0x0032, 0x002E, 0x0033, 0x002E, 0x0034, 0x002E, 0x0035, 0x002E, 0x0036, 0x002E,\n    0x0037, 0x002E, 0x0038, 0x002E, 0x0039, 0x002E, 0x0031, 0x0031, 0x0031, 0x0032, 0x0031, 0x0033, 0x0031, 0x0034, 0x0031, 0x0035,\n    0x0031, 0x0036, 0x0031, 0x0037, 0x0031, 0x0038, 0x0031, 0x0039, 0x0032, 0x0030, 0x0031, 0x0030, 0x0031, 0x0030, 0x0031, 0x0030,\n    0x0031, 0x0030, 0x003D, 0x003D, 0x2ADD, 0x002F, 0x304B, 0x3099, 0x304D, 0x3099, 0x304F, 0x3099, 0x3051, 0x3099, 0x3053, 0x3099,\n    0x3055, 0x3099, 0x3057, 0x3099, 0x3059, 0x3099, 0x305B, 0x3099, 0x305D, 0x3099, 0x305F, 0x3099, 0x3061, 0x3099, 0x3064, 0x3099,\n    0x3066, 0x3099, 0x3068, 0x3099, 0x306F, 0x3099, 0x306F, 0x309A, 0x3072, 0x3099, 0x3072, 0x309A, 0x3075, 0x3099, 0x3075, 0x309A,\n    0x3078, 0x3099, 0x3078, 0x309A, 0x307B, 0x3099, 0x307B, 0x309A, 0x3046, 0x3099, 0x0020, 0x3099, 0x0020, 0x309A, 0x309D, 0x3099,\n    0x3088, 0x308A, 0x30AB, 0x3099, 0x30AD, 0x3099, 0x30AF, 0x3099, 0x30B1, 0x3099, 0x30B3, 0x3099, 0x30B5, 0x3099, 0x30B7, 0x3099,\n    0x30B9, 0x3099, 0x30BB, 0x3099, 0x30BD, 0x3099, 0x30BF, 0x3099, 0x30C1, 0x3099, 0x30C4, 0x3099, 0x30C6, 0x3099, 0x30C8, 0x3099,\n    0x30CF, 0x3099, 0x30CF, 0x309A, 0x30D2, 0x3099, 0x30D2, 0x309A, 0x30D5, 0x3099, 0x30D5, 0x309A, 0x30D8, 0x3099, 0x30D8, 0x309A,\n    0x30DB, 0x3099, 0x30DB, 0x309A, 0x30A6, 0x3099, 0x30EF, 0x3099, 0x30F0, 0x3099, 0x30F1, 0x3099, 0x30F2, 0x3099, 0x30FD, 0x3099,\n    0x30B3, 0x30C8, 0x0032, 0x0031, 0x0032, 0x0032, 0x0032, 0x0033, 0x0032, 0x0034, 0x0032, 0x0035, 0x0032, 0x0036, 0x0032, 0x0037,\n    0x0032, 0x0038, 0x0032, 0x0039, 0x0033, 0x0030, 0x0033, 0x0031, 0x0033, 0x0032, 0x0033, 0x0033, 0x0033, 0x0034, 0x0033, 0x0035,\n    0x1100, 0x1161, 0x1102, 0x1161, 0x1103, 0x1161, 0x1105, 0x1161, 0x1106, 0x1161, 0x1107, 0x1161, 0x1109, 0x1161, 0x110B, 0x1161,\n    0x110C, 0x1161, 0x110E, 0x1161, 0x110F, 0x1161, 0x1110, 0x1161, 0x1111, 0x1161, 0x1112, 0x1161, 0x110B, 0x116E, 0x0033, 0x0036,\n    0x0033, 0x0037, 0x0033, 0x0038, 0x0033, 0x0039, 0x0034, 0x0030, 0x0034, 0x0031, 0x0034, 0x0032, 0x0034, 0x0033, 0x0034, 0x0034,\n    0x0034, 0x0035, 0x0034, 0x0036, 0x0034, 0x0037, 0x0034, 0x0038, 0x0034, 0x0039, 0x0035, 0x0030, 0x0031, 0x6708, 0x0032, 0x6708,\n    0x0033, 0x6708, 0x0034, 0x6708, 0x0035, 0x6708, 0x0036, 0x6708, 0x0037, 0x6708, 0x0038, 0x6708, 0x0039, 0x6708, 0x0048, 0x0067,\n    0x0065, 0x0056, 0x30AE, 0x30AC, 0x30AD, 0x30ED, 0x30C7, 0x30B7, 0x30C9, 0x30EB, 0x30C8, 0x30F3, 0x30CA, 0x30CE, 0x30D4, 0x30B3,\n    0x30D3, 0x30EB, 0x30DA, 0x30BD, 0x30DB, 0x30F3, 0x30DF, 0x30EA, 0x30E1, 0x30AC, 0x30EA, 0x30E9, 0x30EC, 0x30E0, 0x0030, 0x70B9,\n    0x0031, 0x70B9, 0x0032, 0x70B9, 0x0033, 0x70B9, 0x0034, 0x70B9, 0x0035, 0x70B9, 0x0036, 0x70B9, 0x0037, 0x70B9, 0x0038, 0x70B9,\n    0x0039, 0x70B9, 0x0064, 0x0061, 0x0041, 0x0055, 0x006F, 0x0056, 0x0070, 0x0063, 0x0064, 0x006D, 0x0049, 0x0055, 0x5E73, 0x6210,\n    0x662D, 0x548C, 0x5927, 0x6B63, 0x660E, 0x6CBB, 0x0070, 0x0041, 0x006E, 0x0041, 0x03BC, 0x0041, 0x006D, 0x0041, 0x006B, 0x0041,\n    0x004B, 0x0042, 0x004D, 0x0042, 0x0047, 0x0042, 0x0070, 0x0046, 0x006E, 0x0046, 0x03BC, 0x0046, 0x03BC, 0x0067, 0x006D, 0x0067,\n    0x006B, 0x0067, 0x0048, 0x007A, 0x03BC, 0x2113, 0x006D, 0x2113, 0x0064, 0x2113, 0x006B, 0x2113, 0x0066, 0x006D, 0x006E, 0x006D,\n    0x03BC, 0x006D, 0x006D, 0x006D, 0x0063, 0x006D, 0x006B, 0x006D, 0x006D, 0x00B2, 0x006D, 0x00B3, 0x0050, 0x0061, 0x0070, 0x0073,\n    0x006E, 0x0073, 0x03BC, 0x0073, 0x006D, 0x0073, 0x0070, 0x0056, 0x006E, 0x0056, 0x03BC, 0x0056, 0x006D, 0x0056, 0x006B, 0x0056,\n    0x004D, 0x0056, 0x0070, 0x0057, 0x006E, 0x0057, 0x03BC, 0x0057, 0x006D, 0x0057, 0x006B, 0x0057, 0x004D, 0x0057, 0x006B, 0x03A9,\n    0x004D, 0x03A9, 0x0042, 0x0071, 0x0063, 0x0063, 0x0063, 0x0064, 0x0064, 0x0042, 0x0047, 0x0079, 0x0068, 0x0061, 0x0048, 0x0050,\n    0x0069, 0x006E, 0x004B, 0x004B, 0x004B, 0x004D, 0x006B, 0x0074, 0x006C, 0x006D, 0x006C, 0x006E, 0x006C, 0x0078, 0x006D, 0x0062,\n    0x0050, 0x0048, 0x0050, 0x0052, 0x0073, 0x0072, 0x0053, 0x0076, 0x0057, 0x0062, 0x0031, 0x65E5, 0x0032, 0x65E5, 0x0033, 0x65E5,\n    0x0034, 0x65E5, 0x0035, 0x65E5, 0x0036, 0x65E5, 0x0037, 0x65E5, 0x0038, 0x65E5, 0x0039, 0x65E5, 0x0066, 0x0066, 0x0066, 0x0069,\n    0x0066, 0x006C, 0x017F, 0x0074, 0x0073, 0x0074, 0x0574, 0x0576, 0x0574, 0x0565, 0x0574, 0x056B, 0x057E, 0x0576, 0x0574, 0x056D,\n    0x05D9, 0x05B4, 0x05F2, 0x05B7, 0x05E9, 0x05C1, 0x05E9, 0x05C2, 0xFB49, 0x05C1, 0xFB49, 0x05C2, 0x05D0, 0x05B7, 0x05D0, 0x05B8,\n    0x05D0, 0x05BC, 0x05D1, 0x05BC, 0x05D2, 0x05BC, 0x05D3, 0x05BC, 0x05D4, 0x05BC, 0x05D5, 0x05BC, 0x05D6, 0x05BC, 0x05D8, 0x05BC,\n    0x05D9, 0x05BC, 0x05DA, 0x05BC, 0x05DB, 0x05BC, 0x05DC, 0x05BC, 0x05DE, 0x05BC, 0x05E0, 0x05BC, 0x05E1, 0x05BC, 0x05E3, 0x05BC,\n    0x05E4, 0x05BC, 0x05E6, 0x05BC, 0x05E7, 0x05BC, 0x05E8, 0x05BC, 0x05E9, 0x05BC, 0x05EA, 0x05BC, 0x05D5, 0x05B9, 0x05D1, 0x05BF,\n    0x05DB, 0x05BF, 0x05E4, 0x05BF, 0x05D0, 0x05DC, 0x0626, 0x0627, 0x0626, 0x0627, 0x0626, 0x06D5, 0x0626, 0x06D5, 0x0626, 0x0648,\n    0x0626, 0x0648, 0x0626, 0x06C7, 0x0626, 0x06C7, 0x0626, 0x06C6, 0x0626, 0x06C6, 0x0626, 0x06C8, 0x0626, 0x06C8, 0x0626, 0x06D0,\n    0x0626, 0x06D0, 0x0626, 0x06D0, 0x0626, 0x0649, 0x0626, 0x0649, 0x0626, 0x0649, 0x0626, 0x062C, 0x0626, 0x062D, 0x0626, 0x0645,\n    0x0626, 0x0649, 0x0626, 0x064A, 0x0628, 0x062C, 0x0628, 0x062D, 0x0628, 0x062E, 0x0628, 0x0645, 0x0628, 0x0649, 0x0628, 0x064A,\n    0x062A, 0x062C, 0x062A, 0x062D, 0x062A, 0x062E, 0x062A, 0x0645, 0x062A, 0x0649, 0x062A, 0x064A, 0x062B, 0x062C, 0x062B, 0x0645,\n    0x062B, 0x0649, 0x062B, 0x064A, 0x062C, 0x062D, 0x062C, 0x0645, 0x062D, 0x062C, 0x062D, 0x0645, 0x062E, 0x062C, 0x062E, 0x062D,\n    0x062E, 0x0645, 0x0633, 0x062C, 0x0633, 0x062D, 0x0633, 0x062E, 0x0633, 0x0645, 0x0635, 0x062D, 0x0635, 0x0645, 0x0636, 0x062C,\n    0x0636, 0x062D, 0x0636, 0x062E, 0x0636, 0x0645, 0x0637, 0x062D, 0x0637, 0x0645, 0x0638, 0x0645, 0x0639, 0x062C, 0x0639, 0x0645,\n    0x063A, 0x062C, 0x063A, 0x0645, 0x0641, 0x062C, 0x0641, 0x062D, 0x0641, 0x062E, 0x0641, 0x0645, 0x0641, 0x0649, 0x0641, 0x064A,\n    0x0642, 0x062D, 0x0642, 0x0645, 0x0642, 0x0649, 0x0642, 0x064A, 0x0643, 0x0627, 0x0643, 0x062C, 0x0643, 0x062D, 0x0643, 0x062E,\n    0x0643, 0x0644, 0x0643, 0x0645, 0x0643, 0x0649, 0x0643, 0x064A, 0x0644, 0x062C, 0x0644, 0x062D, 0x0644, 0x062E, 0x0644, 0x0645,\n    0x0644, 0x0649, 0x0644, 0x064A, 0x0645, 0x062C, 0x0645, 0x062D, 0x0645, 0x062E, 0x0645, 0x0645, 0x0645, 0x0649, 0x0645, 0x064A,\n    0x0646, 0x062C, 0x0646, 0x062D, 0x0646, 0x062E, 0x0646, 0x0645, 0x0646, 0x0649, 0x0646, 0x064A, 0x0647, 0x062C, 0x0647, 0x0645,\n    0x0647, 0x0649, 0x0647, 0x064A, 0x064A, 0x062C, 0x064A, 0x062D, 0x064A, 0x062E, 0x064A, 0x0645, 0x064A, 0x0649, 0x064A, 0x064A,\n    0x0630, 0x0670, 0x0631, 0x0670, 0x0649, 0x0670, 0x064C, 0x0651, 0x064D, 0x0651, 0x064E, 0x0651, 0x064F, 0x0651, 0x0650, 0x0651,\n    0x0651, 0x0670, 0x0626, 0x0631, 0x0626, 0x0632, 0x0626, 0x0645, 0x0626, 0x0646, 0x0626, 0x0649, 0x0626, 0x064A, 0x0628, 0x0631,\n    0x0628, 0x0632, 0x0628, 0x0645, 0x0628, 0x0646, 0x0628, 0x0649, 0x0628, 0x064A, 0x062A, 0x0631, 0x062A, 0x0632, 0x062A, 0x0645,\n    0x062A, 0x0646, 0x062A, 0x0649, 0x062A, 0x064A, 0x062B, 0x0631, 0x062B, 0x0632, 0x062B, 0x0645, 0x062B, 0x0646, 0x062B, 0x0649,\n    0x062B, 0x064A, 0x0641, 0x0649, 0x0641, 0x064A, 0x0642, 0x0649, 0x0642, 0x064A, 0x0643, 0x0627, 0x0643, 0x0644, 0x0643, 0x0645,\n    0x0643, 0x0649, 0x0643, 0x064A, 0x0644, 0x0645, 0x0644, 0x0649, 0x0644, 0x064A, 0x0645, 0x0627, 0x0645, 0x0645, 0x0646, 0x0631,\n    0x0646, 0x0632, 0x0646, 0x0645, 0x0646, 0x0646, 0x0646, 0x0649, 0x0646, 0x064A, 0x0649, 0x0670, 0x064A, 0x0631, 0x064A, 0x0632,\n    0x064A, 0x0645, 0x064A, 0x0646, 0x064A, 0x0649, 0x064A, 0x064A, 0x0626, 0x062C, 0x0626, 0x062D, 0x0626, 0x062E, 0x0626, 0x0645,\n    0x0626, 0x0647, 0x0628, 0x062C, 0x0628, 0x062D, 0x0628, 0x062E, 0x0628, 0x0645, 0x0628, 0x0647, 0x062A, 0x062C, 0x062A, 0x062D,\n    0x062A, 0x062E, 0x062A, 0x0645, 0x062A, 0x0647, 0x062B, 0x0645, 0x062C, 0x062D, 0x062C, 0x0645, 0x062D, 0x062C, 0x062D, 0x0645,\n    0x062E, 0x062C, 0x062E, 0x0645, 0x0633, 0x062C, 0x0633, 0x062D, 0x0633, 0x062E, 0x0633, 0x0645, 0x0635, 0x062D, 0x0635, 0x062E,\n    0x0635, 0x0645, 0x0636, 0x062C, 0x0636, 0x062D, 0x0636, 0x062E, 0x0636, 0x0645, 0x0637, 0x062D, 0x0638, 0x0645, 0x0639, 0x062C,\n    0x0639, 0x0645, 0x063A, 0x062C, 0x063A, 0x0645, 0x0641, 0x062C, 0x0641, 0x062D, 0x0641, 0x062E, 0x0641, 0x0645, 0x0642, 0x062D,\n    0x0642, 0x0645, 0x0643, 0x062C, 0x0643, 0x062D, 0x0643, 0x062E, 0x0643, 0x0644, 0x0643, 0x0645, 0x0644, 0x062C, 0x0644, 0x062D,\n    0x0644, 0x062E, 0x0644, 0x0645, 0x0644, 0x0647, 0x0645, 0x062C, 0x0645, 0x062D, 0x0645, 0x062E, 0x0645, 0x0645, 0x0646, 0x062C,\n    0x0646, 0x062D, 0x0646, 0x062E, 0x0646, 0x0645, 0x0646, 0x0647, 0x0647, 0x062C, 0x0647, 0x0645, 0x0647, 0x0670, 0x064A, 0x062C,\n    0x064A, 0x062D, 0x064A, 0x062E, 0x064A, 0x0645, 0x064A, 0x0647, 0x0626, 0x0645, 0x0626, 0x0647, 0x0628, 0x0645, 0x0628, 0x0647,\n    0x062A, 0x0645, 0x062A, 0x0647, 0x062B, 0x0645, 0x062B, 0x0647, 0x0633, 0x0645, 0x0633, 0x0647, 0x0634, 0x0645, 0x0634, 0x0647,\n    0x0643, 0x0644, 0x0643, 0x0645, 0x0644, 0x0645, 0x0646, 0x0645, 0x0646, 0x0647, 0x064A, 0x0645, 0x064A, 0x0647, 0x0637, 0x0649,\n    0x0637, 0x064A, 0x0639, 0x0649, 0x0639, 0x064A, 0x063A, 0x0649, 0x063A, 0x064A, 0x0633, 0x0649, 0x0633, 0x064A, 0x0634, 0x0649,\n    0x0634, 0x064A, 0x062D, 0x0649, 0x062D, 0x064A, 0x062C, 0x0649, 0x062C, 0x064A, 0x062E, 0x0649, 0x062E, 0x064A, 0x0635, 0x0649,\n    0x0635, 0x064A, 0x0636, 0x0649, 0x0636, 0x064A, 0x0634, 0x062C, 0x0634, 0x062D, 0x0634, 0x062E, 0x0634, 0x0645, 0x0634, 0x0631,\n    0x0633, 0x0631, 0x0635, 0x0631, 0x0636, 0x0631, 0x0637, 0x0649, 0x0637, 0x064A, 0x0639, 0x0649, 0x0639, 0x064A, 0x063A, 0x0649,\n    0x063A, 0x064A, 0x0633, 0x0649, 0x0633, 0x064A, 0x0634, 0x0649, 0x0634, 0x064A, 0x062D, 0x0649, 0x062D, 0x064A, 0x062C, 0x0649,\n    0x062C, 0x064A, 0x062E, 0x0649, 0x062E, 0x064A, 0x0635, 0x0649, 0x0635, 0x064A, 0x0636, 0x0649, 0x0636, 0x064A, 0x0634, 0x062C,\n    0x0634, 0x062D, 0x0634, 0x062E, 0x0634, 0x0645, 0x0634, 0x0631, 0x0633, 0x0631, 0x0635, 0x0631, 0x0636, 0x0631, 0x0634, 0x062C,\n    0x0634, 0x062D, 0x0634, 0x062E, 0x0634, 0x0645, 0x0633, 0x0647, 0x0634, 0x0647, 0x0637, 0x0645, 0x0633, 0x062C, 0x0633, 0x062D,\n    0x0633, 0x062E, 0x0634, 0x062C, 0x0634, 0x062D, 0x0634, 0x062E, 0x0637, 0x0645, 0x0638, 0x0645, 0x0627, 0x064B, 0x0627, 0x064B,\n    0x0640, 0x064B, 0x0640, 0x064E, 0x0640, 0x064F, 0x0640, 0x0650, 0x0640, 0x0651, 0x0640, 0x0652, 0x0644, 0x0622, 0x0644, 0x0622,\n    0x0644, 0x0623, 0x0644, 0x0623, 0x0644, 0x0625, 0x0644, 0x0625, 0x0644, 0x0627, 0x0644, 0x0627\n};\nextern const FX_WCHAR g_UnicodeData_Normalization_Map3[1164] = {\n    0x0031, 0x002F, 0x0034, 0x0031, 0x002F, 0x0032, 0x0033, 0x002F, 0x0034, 0x002E, 0x002E, 0x002E, 0x2032, 0x2032, 0x2032, 0x2035,\n    0x2035, 0x2035, 0x0061, 0x002F, 0x0063, 0x0061, 0x002F, 0x0073, 0x0063, 0x002F, 0x006F, 0x0063, 0x002F, 0x0075, 0x0054, 0x0045,\n    0x004C, 0x0046, 0x0041, 0x0058, 0x0031, 0x002F, 0x0037, 0x0031, 0x002F, 0x0039, 0x0031, 0x002F, 0x0033, 0x0032, 0x002F, 0x0033,\n    0x0031, 0x002F, 0x0035, 0x0032, 0x002F, 0x0035, 0x0033, 0x002F, 0x0035, 0x0034, 0x002F, 0x0035, 0x0031, 0x002F, 0x0036, 0x0035,\n    0x002F, 0x0036, 0x0031, 0x002F, 0x0038, 0x0033, 0x002F, 0x0038, 0x0035, 0x002F, 0x0038, 0x0037, 0x002F, 0x0038, 0x0049, 0x0049,\n    0x0049, 0x0056, 0x0049, 0x0049, 0x0058, 0x0049, 0x0049, 0x0069, 0x0069, 0x0069, 0x0076, 0x0069, 0x0069, 0x0078, 0x0069, 0x0069,\n    0x0030, 0x2044, 0x0033, 0x222B, 0x222B, 0x222B, 0x222E, 0x222E, 0x222E, 0x004E, 0x0055, 0x004C, 0x0053, 0x004F, 0x0048, 0x0053,\n    0x0054, 0x0058, 0x0045, 0x0054, 0x0058, 0x0045, 0x004F, 0x0054, 0x0045, 0x004E, 0x0051, 0x0041, 0x0043, 0x004B, 0x0042, 0x0045,\n    0x004C, 0x0044, 0x004C, 0x0045, 0x0044, 0x0043, 0x0031, 0x0044, 0x0043, 0x0032, 0x0044, 0x0043, 0x0033, 0x0044, 0x0043, 0x0034,\n    0x004E, 0x0041, 0x004B, 0x0053, 0x0059, 0x004E, 0x0045, 0x0054, 0x0042, 0x0043, 0x0041, 0x004E, 0x0053, 0x0055, 0x0042, 0x0045,\n    0x0053, 0x0043, 0x0044, 0x0045, 0x004C, 0x0028, 0x0031, 0x0029, 0x0028, 0x0032, 0x0029, 0x0028, 0x0033, 0x0029, 0x0028, 0x0034,\n    0x0029, 0x0028, 0x0035, 0x0029, 0x0028, 0x0036, 0x0029, 0x0028, 0x0037, 0x0029, 0x0028, 0x0038, 0x0029, 0x0028, 0x0039, 0x0029,\n    0x0031, 0x0030, 0x002E, 0x0031, 0x0031, 0x002E, 0x0031, 0x0032, 0x002E, 0x0031, 0x0033, 0x002E, 0x0031, 0x0034, 0x002E, 0x0031,\n    0x0035, 0x002E, 0x0031, 0x0036, 0x002E, 0x0031, 0x0037, 0x002E, 0x0031, 0x0038, 0x002E, 0x0031, 0x0039, 0x002E, 0x0032, 0x0030,\n    0x002E, 0x0028, 0x0061, 0x0029, 0x0028, 0x0062, 0x0029, 0x0028, 0x0063, 0x0029, 0x0028, 0x0064, 0x0029, 0x0028, 0x0065, 0x0029,\n    0x0028, 0x0066, 0x0029, 0x0028, 0x0067, 0x0029, 0x0028, 0x0068, 0x0029, 0x0028, 0x0069, 0x0029, 0x0028, 0x006A, 0x0029, 0x0028,\n    0x006B, 0x0029, 0x0028, 0x006C, 0x0029, 0x0028, 0x006D, 0x0029, 0x0028, 0x006E, 0x0029, 0x0028, 0x006F, 0x0029, 0x0028, 0x0070,\n    0x0029, 0x0028, 0x0071, 0x0029, 0x0028, 0x0072, 0x0029, 0x0028, 0x0073, 0x0029, 0x0028, 0x0074, 0x0029, 0x0028, 0x0075, 0x0029,\n    0x0028, 0x0076, 0x0029, 0x0028, 0x0077, 0x0029, 0x0028, 0x0078, 0x0029, 0x0028, 0x0079, 0x0029, 0x0028, 0x007A, 0x0029, 0x003A,\n    0x003A, 0x003D, 0x003D, 0x003D, 0x003D, 0x0028, 0x1100, 0x0029, 0x0028, 0x1102, 0x0029, 0x0028, 0x1103, 0x0029, 0x0028, 0x1105,\n    0x0029, 0x0028, 0x1106, 0x0029, 0x0028, 0x1107, 0x0029, 0x0028, 0x1109, 0x0029, 0x0028, 0x110B, 0x0029, 0x0028, 0x110C, 0x0029,\n    0x0028, 0x110E, 0x0029, 0x0028, 0x110F, 0x0029, 0x0028, 0x1110, 0x0029, 0x0028, 0x1111, 0x0029, 0x0028, 0x1112, 0x0029, 0x0028,\n    0x4E00, 0x0029, 0x0028, 0x4E8C, 0x0029, 0x0028, 0x4E09, 0x0029, 0x0028, 0x56DB, 0x0029, 0x0028, 0x4E94, 0x0029, 0x0028, 0x516D,\n    0x0029, 0x0028, 0x4E03, 0x0029, 0x0028, 0x516B, 0x0029, 0x0028, 0x4E5D, 0x0029, 0x0028, 0x5341, 0x0029, 0x0028, 0x6708, 0x0029,\n    0x0028, 0x706B, 0x0029, 0x0028, 0x6C34, 0x0029, 0x0028, 0x6728, 0x0029, 0x0028, 0x91D1, 0x0029, 0x0028, 0x571F, 0x0029, 0x0028,\n    0x65E5, 0x0029, 0x0028, 0x682A, 0x0029, 0x0028, 0x6709, 0x0029, 0x0028, 0x793E, 0x0029, 0x0028, 0x540D, 0x0029, 0x0028, 0x7279,\n    0x0029, 0x0028, 0x8CA1, 0x0029, 0x0028, 0x795D, 0x0029, 0x0028, 0x52B4, 0x0029, 0x0028, 0x4EE3, 0x0029, 0x0028, 0x547C, 0x0029,\n    0x0028, 0x5B66, 0x0029, 0x0028, 0x76E3, 0x0029, 0x0028, 0x4F01, 0x0029, 0x0028, 0x8CC7, 0x0029, 0x0028, 0x5354, 0x0029, 0x0028,\n    0x796D, 0x0029, 0x0028, 0x4F11, 0x0029, 0x0028, 0x81EA, 0x0029, 0x0028, 0x81F3, 0x0029, 0x0050, 0x0054, 0x0045, 0x0031, 0x0030,\n    0x6708, 0x0031, 0x0031, 0x6708, 0x0031, 0x0032, 0x6708, 0x0065, 0x0072, 0x0067, 0x004C, 0x0054, 0x0044, 0x30A2, 0x30FC, 0x30EB,\n    0x30A4, 0x30F3, 0x30C1, 0x30A6, 0x30A9, 0x30F3, 0x30AA, 0x30F3, 0x30B9, 0x30AA, 0x30FC, 0x30E0, 0x30AB, 0x30A4, 0x30EA, 0x30AC,\n    0x30ED, 0x30F3, 0x30AC, 0x30F3, 0x30DE, 0x30AE, 0x30CB, 0x30FC, 0x30B0, 0x30E9, 0x30E0, 0x30B1, 0x30FC, 0x30B9, 0x30B3, 0x30EB,\n    0x30CA, 0x30B3, 0x30FC, 0x30DD, 0x30BB, 0x30F3, 0x30C1, 0x30BB, 0x30F3, 0x30C8, 0x30C0, 0x30FC, 0x30B9, 0x30CE, 0x30C3, 0x30C8,\n    0x30CF, 0x30A4, 0x30C4, 0x30D1, 0x30FC, 0x30C4, 0x30D4, 0x30AF, 0x30EB, 0x30D5, 0x30E9, 0x30F3, 0x30DA, 0x30CB, 0x30D2, 0x30D8,\n    0x30EB, 0x30C4, 0x30DA, 0x30F3, 0x30B9, 0x30DA, 0x30FC, 0x30B8, 0x30D9, 0x30FC, 0x30BF, 0x30DC, 0x30EB, 0x30C8, 0x30DD, 0x30F3,\n    0x30C9, 0x30DB, 0x30FC, 0x30EB, 0x30DB, 0x30FC, 0x30F3, 0x30DE, 0x30A4, 0x30EB, 0x30DE, 0x30C3, 0x30CF, 0x30DE, 0x30EB, 0x30AF,\n    0x30E4, 0x30FC, 0x30C9, 0x30E4, 0x30FC, 0x30EB, 0x30E6, 0x30A2, 0x30F3, 0x30EB, 0x30D4, 0x30FC, 0x30EF, 0x30C3, 0x30C8, 0x0031,\n    0x0030, 0x70B9, 0x0031, 0x0031, 0x70B9, 0x0031, 0x0032, 0x70B9, 0x0031, 0x0033, 0x70B9, 0x0031, 0x0034, 0x70B9, 0x0031, 0x0035,\n    0x70B9, 0x0031, 0x0036, 0x70B9, 0x0031, 0x0037, 0x70B9, 0x0031, 0x0038, 0x70B9, 0x0031, 0x0039, 0x70B9, 0x0032, 0x0030, 0x70B9,\n    0x0032, 0x0031, 0x70B9, 0x0032, 0x0032, 0x70B9, 0x0032, 0x0033, 0x70B9, 0x0032, 0x0034, 0x70B9, 0x0068, 0x0050, 0x0061, 0x0062,\n    0x0061, 0x0072, 0x0064, 0x006D, 0x00B2, 0x0064, 0x006D, 0x00B3, 0x0063, 0x0061, 0x006C, 0x006B, 0x0048, 0x007A, 0x004D, 0x0048,\n    0x007A, 0x0047, 0x0048, 0x007A, 0x0054, 0x0048, 0x007A, 0x006D, 0x006D, 0x00B2, 0x0063, 0x006D, 0x00B2, 0x006B, 0x006D, 0x00B2,\n    0x006D, 0x006D, 0x00B3, 0x0063, 0x006D, 0x00B3, 0x006B, 0x006D, 0x00B3, 0x006D, 0x2215, 0x0073, 0x006B, 0x0050, 0x0061, 0x004D,\n    0x0050, 0x0061, 0x0047, 0x0050, 0x0061, 0x0072, 0x0061, 0x0064, 0x0043, 0x006F, 0x002E, 0x006C, 0x006F, 0x0067, 0x006D, 0x0069,\n    0x006C, 0x006D, 0x006F, 0x006C, 0x0050, 0x0050, 0x004D, 0x0056, 0x2215, 0x006D, 0x0041, 0x2215, 0x006D, 0x0031, 0x0030, 0x65E5,\n    0x0031, 0x0031, 0x65E5, 0x0031, 0x0032, 0x65E5, 0x0031, 0x0033, 0x65E5, 0x0031, 0x0034, 0x65E5, 0x0031, 0x0035, 0x65E5, 0x0031,\n    0x0036, 0x65E5, 0x0031, 0x0037, 0x65E5, 0x0031, 0x0038, 0x65E5, 0x0031, 0x0039, 0x65E5, 0x0032, 0x0030, 0x65E5, 0x0032, 0x0031,\n    0x65E5, 0x0032, 0x0032, 0x65E5, 0x0032, 0x0033, 0x65E5, 0x0032, 0x0034, 0x65E5, 0x0032, 0x0035, 0x65E5, 0x0032, 0x0036, 0x65E5,\n    0x0032, 0x0037, 0x65E5, 0x0032, 0x0038, 0x65E5, 0x0032, 0x0039, 0x65E5, 0x0033, 0x0030, 0x65E5, 0x0033, 0x0031, 0x65E5, 0x0067,\n    0x0061, 0x006C, 0x0066, 0x0066, 0x0069, 0x0066, 0x0066, 0x006C, 0x0640, 0x064E, 0x0651, 0x0640, 0x064F, 0x0651, 0x0640, 0x0650,\n    0x0651, 0x062A, 0x062C, 0x0645, 0x062A, 0x062D, 0x062C, 0x062A, 0x062D, 0x062C, 0x062A, 0x062D, 0x0645, 0x062A, 0x062E, 0x0645,\n    0x062A, 0x0645, 0x062C, 0x062A, 0x0645, 0x062D, 0x062A, 0x0645, 0x062E, 0x062C, 0x0645, 0x062D, 0x062C, 0x0645, 0x062D, 0x062D,\n    0x0645, 0x064A, 0x062D, 0x0645, 0x0649, 0x0633, 0x062D, 0x062C, 0x0633, 0x062C, 0x062D, 0x0633, 0x062C, 0x0649, 0x0633, 0x0645,\n    0x062D, 0x0633, 0x0645, 0x062D, 0x0633, 0x0645, 0x062C, 0x0633, 0x0645, 0x0645, 0x0633, 0x0645, 0x0645, 0x0635, 0x062D, 0x062D,\n    0x0635, 0x062D, 0x062D, 0x0635, 0x0645, 0x0645, 0x0634, 0x062D, 0x0645, 0x0634, 0x062D, 0x0645, 0x0634, 0x062C, 0x064A, 0x0634,\n    0x0645, 0x062E, 0x0634, 0x0645, 0x062E, 0x0634, 0x0645, 0x0645, 0x0634, 0x0645, 0x0645, 0x0636, 0x062D, 0x0649, 0x0636, 0x062E,\n    0x0645, 0x0636, 0x062E, 0x0645, 0x0637, 0x0645, 0x062D, 0x0637, 0x0645, 0x062D, 0x0637, 0x0645, 0x0645, 0x0637, 0x0645, 0x064A,\n    0x0639, 0x062C, 0x0645, 0x0639, 0x0645, 0x0645, 0x0639, 0x0645, 0x0645, 0x0639, 0x0645, 0x0649, 0x063A, 0x0645, 0x0645, 0x063A,\n    0x0645, 0x064A, 0x063A, 0x0645, 0x0649, 0x0641, 0x062E, 0x0645, 0x0641, 0x062E, 0x0645, 0x0642, 0x0645, 0x062D, 0x0642, 0x0645,\n    0x0645, 0x0644, 0x062D, 0x0645, 0x0644, 0x062D, 0x064A, 0x0644, 0x062D, 0x0649, 0x0644, 0x062C, 0x062C, 0x0644, 0x062C, 0x062C,\n    0x0644, 0x062E, 0x0645, 0x0644, 0x062E, 0x0645, 0x0644, 0x0645, 0x062D, 0x0644, 0x0645, 0x062D, 0x0645, 0x062D, 0x062C, 0x0645,\n    0x062D, 0x0645, 0x0645, 0x062D, 0x064A, 0x0645, 0x062C, 0x062D, 0x0645, 0x062C, 0x0645, 0x0645, 0x062E, 0x062C, 0x0645, 0x062E,\n    0x0645, 0x0645, 0x062C, 0x062E, 0x0647, 0x0645, 0x062C, 0x0647, 0x0645, 0x0645, 0x0646, 0x062D, 0x0645, 0x0646, 0x062D, 0x0649,\n    0x0646, 0x062C, 0x0645, 0x0646, 0x062C, 0x0645, 0x0646, 0x062C, 0x0649, 0x0646, 0x0645, 0x064A, 0x0646, 0x0645, 0x0649, 0x064A,\n    0x0645, 0x0645, 0x064A, 0x0645, 0x0645, 0x0628, 0x062E, 0x064A, 0x062A, 0x062C, 0x064A, 0x062A, 0x062C, 0x0649, 0x062A, 0x062E,\n    0x064A, 0x062A, 0x062E, 0x0649, 0x062A, 0x0645, 0x064A, 0x062A, 0x0645, 0x0649, 0x062C, 0x0645, 0x064A, 0x062C, 0x062D, 0x0649,\n    0x062C, 0x0645, 0x0649, 0x0633, 0x062E, 0x0649, 0x0635, 0x062D, 0x064A, 0x0634, 0x062D, 0x064A, 0x0636, 0x062D, 0x064A, 0x0644,\n    0x062C, 0x064A, 0x0644, 0x0645, 0x064A, 0x064A, 0x062D, 0x064A, 0x064A, 0x062C, 0x064A, 0x064A, 0x0645, 0x064A, 0x0645, 0x0645,\n    0x064A, 0x0642, 0x0645, 0x064A, 0x0646, 0x062D, 0x064A, 0x0642, 0x0645, 0x062D, 0x0644, 0x062D, 0x0645, 0x0639, 0x0645, 0x064A,\n    0x0643, 0x0645, 0x064A, 0x0646, 0x062C, 0x062D, 0x0645, 0x062E, 0x064A, 0x0644, 0x062C, 0x0645, 0x0643, 0x0645, 0x0645, 0x0644,\n    0x062C, 0x0645, 0x0646, 0x062C, 0x062D, 0x062C, 0x062D, 0x064A, 0x062D, 0x062C, 0x064A, 0x0645, 0x062C, 0x064A, 0x0641, 0x0645,\n    0x064A, 0x0628, 0x062D, 0x064A, 0x0643, 0x0645, 0x0645, 0x0639, 0x062C, 0x0645, 0x0635, 0x0645, 0x0645, 0x0633, 0x062E, 0x064A,\n    0x0646, 0x062C, 0x064A, 0x0635, 0x0644, 0x06D2, 0x0642, 0x0644, 0x06D2, 0x0635, 0x0644, 0x0649\n};\nextern const FX_WCHAR g_UnicodeData_Normalization_Map4[488] = {\n    0x0004, 0x2032, 0x2032, 0x2032, 0x2032, 0x0004, 0x0031, 0x002F, 0x0031, 0x0030, 0x0004, 0x0056, 0x0049, 0x0049, 0x0049, 0x0004,\n    0x0076, 0x0069, 0x0069, 0x0069, 0x0004, 0x0028, 0x0031, 0x0030, 0x0029, 0x0004, 0x0028, 0x0031, 0x0031, 0x0029, 0x0004, 0x0028,\n    0x0031, 0x0032, 0x0029, 0x0004, 0x0028, 0x0031, 0x0033, 0x0029, 0x0004, 0x0028, 0x0031, 0x0034, 0x0029, 0x0004, 0x0028, 0x0031,\n    0x0035, 0x0029, 0x0004, 0x0028, 0x0031, 0x0036, 0x0029, 0x0004, 0x0028, 0x0031, 0x0037, 0x0029, 0x0004, 0x0028, 0x0031, 0x0038,\n    0x0029, 0x0004, 0x0028, 0x0031, 0x0039, 0x0029, 0x0004, 0x0028, 0x0032, 0x0030, 0x0029, 0x0004, 0x222B, 0x222B, 0x222B, 0x222B,\n    0x0004, 0x0028, 0x1100, 0x1161, 0x0029, 0x0004, 0x0028, 0x1102, 0x1161, 0x0029, 0x0004, 0x0028, 0x1103, 0x1161, 0x0029, 0x0004,\n    0x0028, 0x1105, 0x1161, 0x0029, 0x0004, 0x0028, 0x1106, 0x1161, 0x0029, 0x0004, 0x0028, 0x1107, 0x1161, 0x0029, 0x0004, 0x0028,\n    0x1109, 0x1161, 0x0029, 0x0004, 0x0028, 0x110B, 0x1161, 0x0029, 0x0004, 0x0028, 0x110C, 0x1161, 0x0029, 0x0004, 0x0028, 0x110E,\n    0x1161, 0x0029, 0x0004, 0x0028, 0x110F, 0x1161, 0x0029, 0x0004, 0x0028, 0x1110, 0x1161, 0x0029, 0x0004, 0x0028, 0x1111, 0x1161,\n    0x0029, 0x0004, 0x0028, 0x1112, 0x1161, 0x0029, 0x0004, 0x0028, 0x110C, 0x116E, 0x0029, 0x0007, 0x0028, 0x110B, 0x1169, 0x110C,\n    0x1165, 0x11AB, 0x0029, 0x0006, 0x0028, 0x110B, 0x1169, 0x1112, 0x116E, 0x0029, 0x0005, 0x110E, 0x1161, 0x11B7, 0x1100, 0x1169,\n    0x0004, 0x110C, 0x116E, 0x110B, 0x1174, 0x0004, 0x30A2, 0x30D1, 0x30FC, 0x30C8, 0x0004, 0x30A2, 0x30EB, 0x30D5, 0x30A1, 0x0004,\n    0x30A2, 0x30F3, 0x30DA, 0x30A2, 0x0004, 0x30A4, 0x30CB, 0x30F3, 0x30B0, 0x0005, 0x30A8, 0x30B9, 0x30AF, 0x30FC, 0x30C9, 0x0004,\n    0x30A8, 0x30FC, 0x30AB, 0x30FC, 0x0004, 0x30AB, 0x30E9, 0x30C3, 0x30C8, 0x0004, 0x30AB, 0x30ED, 0x30EA, 0x30FC, 0x0004, 0x30AD,\n    0x30E5, 0x30EA, 0x30FC, 0x0004, 0x30AE, 0x30EB, 0x30C0, 0x30FC, 0x0005, 0x30AD, 0x30ED, 0x30B0, 0x30E9, 0x30E0, 0x0006, 0x30AD,\n    0x30ED, 0x30E1, 0x30FC, 0x30C8, 0x30EB, 0x0005, 0x30AD, 0x30ED, 0x30EF, 0x30C3, 0x30C8, 0x0005, 0x30B0, 0x30E9, 0x30E0, 0x30C8,\n    0x30F3, 0x0005, 0x30AF, 0x30EB, 0x30BC, 0x30A4, 0x30ED, 0x0004, 0x30AF, 0x30ED, 0x30FC, 0x30CD, 0x0004, 0x30B5, 0x30A4, 0x30AF,\n    0x30EB, 0x0005, 0x30B5, 0x30F3, 0x30C1, 0x30FC, 0x30E0, 0x0004, 0x30B7, 0x30EA, 0x30F3, 0x30B0, 0x0005, 0x30D1, 0x30FC, 0x30BB,\n    0x30F3, 0x30C8, 0x0004, 0x30D0, 0x30FC, 0x30EC, 0x30EB, 0x0005, 0x30D4, 0x30A2, 0x30B9, 0x30C8, 0x30EB, 0x0005, 0x30D5, 0x30A1,\n    0x30E9, 0x30C3, 0x30C9, 0x0004, 0x30D5, 0x30A3, 0x30FC, 0x30C8, 0x0005, 0x30D6, 0x30C3, 0x30B7, 0x30A7, 0x30EB, 0x0005, 0x30D8,\n    0x30AF, 0x30BF, 0x30FC, 0x30EB, 0x0004, 0x30DD, 0x30A4, 0x30F3, 0x30C8, 0x0004, 0x30DE, 0x30A4, 0x30AF, 0x30ED, 0x0005, 0x30DE,\n    0x30F3, 0x30B7, 0x30E7, 0x30F3, 0x0004, 0x30DF, 0x30AF, 0x30ED, 0x30F3, 0x0005, 0x30DF, 0x30EA, 0x30D0, 0x30FC, 0x30EB, 0x0004,\n    0x30E1, 0x30AC, 0x30C8, 0x30F3, 0x0004, 0x30E1, 0x30FC, 0x30C8, 0x30EB, 0x0004, 0x30EA, 0x30C3, 0x30C8, 0x30EB, 0x0004, 0x30EB,\n    0x30FC, 0x30D6, 0x30EB, 0x0005, 0x30EC, 0x30F3, 0x30C8, 0x30B2, 0x30F3, 0x0004, 0x682A, 0x5F0F, 0x4F1A, 0x793E, 0x0004, 0x006B,\n    0x0063, 0x0061, 0x006C, 0x0004, 0x006D, 0x2215, 0x0073, 0x00B2, 0x0005, 0x0072, 0x0061, 0x0064, 0x2215, 0x0073, 0x0006, 0x0072,\n    0x0061, 0x0064, 0x2215, 0x0073, 0x00B2, 0x0004, 0x0061, 0x002E, 0x006D, 0x002E, 0x0004, 0x0043, 0x2215, 0x006B, 0x0067, 0x0004,\n    0x0070, 0x002E, 0x006D, 0x002E, 0x0004, 0x0627, 0x0644, 0x0644, 0x0647, 0x0004, 0x0627, 0x0643, 0x0628, 0x0631, 0x0004, 0x0645,\n    0x062D, 0x0645, 0x062F, 0x0004, 0x0635, 0x0644, 0x0639, 0x0645, 0x0004, 0x0631, 0x0633, 0x0648, 0x0644, 0x0004, 0x0639, 0x0644,\n    0x064A, 0x0647, 0x0004, 0x0648, 0x0633, 0x0644, 0x0645, 0x0012, 0x0635, 0x0644, 0x0649, 0x0020, 0x0627, 0x0644, 0x0644, 0x0647,\n    0x0020, 0x0639, 0x0644, 0x064A, 0x0647, 0x0020, 0x0648, 0x0633, 0x0644, 0x0645, 0x0008, 0x062C, 0x0644, 0x0020, 0x062C, 0x0644,\n    0x0627, 0x0644, 0x0647, 0x0004, 0x0631, 0x06CC, 0x0627, 0x0644\n};\n"
  },
  {
    "path": "core/src/fx_freetype.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_SRC_FREETYPE_H_\n#define _FX_SRC_FREETYPE_H_\n#include \"./fxge/fx_freetype/fxft2.5.01/include/ft2build.h\"\n#include \"./fxge/fx_freetype/fxft2.5.01/include/freetype/freetype.h\"\n#include \"./fxge/fx_freetype/fxft2.5.01/include/freetype/ftoutln.h\"\n#include \"./fxge/fx_freetype/fxft2.5.01/include/freetype/ftmm.h\"\n#include \"./fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftobjs.h\"\n#include \"./fxge/fx_freetype/fxft2.5.01/include/freetype/tttables.h\"\n#endif\n"
  },
  {
    "path": "core/src/fx_jpeglib.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_SRC_JPEGLIB_H_\n#define _FX_SRC_JPEGLIB_H_\n#include \"./fxcodec/libjpeg/jpeglib.h\"\n#endif\n"
  },
  {
    "path": "core/src/fx_zlib.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_SRC_ZLIB_H_\n#define _FX_SRC_ZLIB_H_\n#include \"./fxcodec/fx_zlib/zlib_v128/zlib.h\"\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/codec/codec_int.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include <limits.h>\nclass CCodec_BasicModule : public ICodec_BasicModule\n{\npublic:\n    virtual FX_BOOL\tRunLengthEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,\n                                    FX_DWORD& dest_size);\n    virtual FX_BOOL\tA85Encode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,\n                              FX_DWORD& dest_size);\n    virtual ICodec_ScanlineDecoder*\tCreateRunLengthDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,\n            int nComps, int bpc);\n};\nstruct CCodec_ImageDataCache {\n    int\t\t\tm_Width, m_Height;\n    int\t\t\tm_nCachedLines;\n    FX_BYTE\t\tm_Data;\n};\nclass CCodec_ScanlineDecoder : public ICodec_ScanlineDecoder\n{\npublic:\n\n    CCodec_ScanlineDecoder();\n\n    virtual ~CCodec_ScanlineDecoder();\n\n    virtual FX_DWORD\tGetSrcOffset()\n    {\n        return -1;\n    }\n\n    virtual void\t\tDownScale(int dest_width, int dest_height);\n\n    FX_LPBYTE\t\t\tGetScanline(int line);\n\n    FX_BOOL\t\t\t\tSkipToScanline(int line, IFX_Pause* pPause);\n\n    int\t\t\t\t\tGetWidth()\n    {\n        return m_OutputWidth;\n    }\n\n    int\t\t\t\t\tGetHeight()\n    {\n        return m_OutputHeight;\n    }\n\n    int\t\t\t\t\tCountComps()\n    {\n        return m_nComps;\n    }\n\n    int\t\t\t\t\tGetBPC()\n    {\n        return m_bpc;\n    }\n\n    FX_BOOL\t\t\t\tIsColorTransformed()\n    {\n        return m_bColorTransformed;\n    }\n\n    void\t\t\t\tClearImageData()\n    {\n        if (m_pDataCache) {\n            FX_Free(m_pDataCache);\n        }\n        m_pDataCache = NULL;\n    }\nprotected:\n\n    int\t\t\t\t\tm_OrigWidth;\n\n    int\t\t\t\t\tm_OrigHeight;\n\n    int\t\t\t\t\tm_DownScale;\n\n    int\t\t\t\t\tm_OutputWidth;\n\n    int\t\t\t\t\tm_OutputHeight;\n\n    int\t\t\t\t\tm_nComps;\n\n    int\t\t\t\t\tm_bpc;\n\n    int\t\t\t\t\tm_Pitch;\n\n    FX_BOOL\t\t\t\tm_bColorTransformed;\n\n    FX_LPBYTE\t\t\tReadNextLine();\n\n    virtual FX_BOOL\t\tv_Rewind() = 0;\n\n    virtual FX_LPBYTE\tv_GetNextLine() = 0;\n\n    virtual void\t\tv_DownScale(int dest_width, int dest_height) = 0;\n\n    int\t\t\t\t\tm_NextLine;\n\n    FX_LPBYTE\t\t\tm_pLastScanline;\n\n    CCodec_ImageDataCache*\tm_pDataCache;\n};\nclass CCodec_FaxModule : public ICodec_FaxModule\n{\npublic:\n    virtual ICodec_ScanlineDecoder*\tCreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,\n            int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows);\n    FX_BOOL\t\tEncode(FX_LPCBYTE src_buf, int width, int height, int pitch, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);\n};\nclass CCodec_FlateModule : public ICodec_FlateModule\n{\npublic:\n    virtual ICodec_ScanlineDecoder*\tCreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,\n            int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, int Columns);\n    virtual FX_DWORD FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, FX_BOOL bEarlyChange,\n                                      int predictor, int Colors, int BitsPerComponent, int Columns,\n                                      FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);\n    virtual FX_BOOL Encode(const FX_BYTE* src_buf, FX_DWORD src_size,\n                           int predictor, int Colors, int BitsPerComponent, int Columns,\n                           FX_LPBYTE& dest_buf, FX_DWORD& dest_size);\n    virtual FX_BOOL\t\tEncode(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);\n};\nclass CCodec_JpegModule : public ICodec_JpegModule\n{\npublic:\n    CCodec_JpegModule() : m_pExtProvider(NULL) {}\n    void SetPovider(IFX_JpegProvider* pJP)\n    {\n        m_pExtProvider = pJP;\n    }\n    ICodec_ScanlineDecoder*\tCreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size,\n                                          int width, int height, int nComps, FX_BOOL ColorTransform);\n    FX_BOOL\t\tLoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,\n                         int& num_components, int& bits_per_components, FX_BOOL& color_transform,\n                         FX_LPBYTE* icc_buf_ptr, FX_DWORD* icc_length);\n    FX_BOOL\t\tEncode(const CFX_DIBSource* pSource, FX_LPBYTE& dest_buf, FX_STRSIZE& dest_size, int quality, FX_LPCBYTE icc_buf, FX_DWORD icc_length);\n    virtual void*\t\tStart();\n    virtual void\t\tFinish(void* pContext);\n    virtual void\t\tInput(void* pContext, FX_LPCBYTE src_buf, FX_DWORD src_size);\n    virtual int\t\t\tReadHeader(void* pContext, int* width, int* height, int* nComps);\n    virtual FX_BOOL\t\tStartScanline(void* pContext, int down_scale);\n    virtual FX_BOOL\t\tReadScanline(void* pContext, FX_LPBYTE dest_buf);\n    virtual FX_DWORD\tGetAvailInput(void* pContext, FX_LPBYTE* avail_buf_ptr);\nprotected:\n    IFX_JpegProvider* m_pExtProvider;\n};\nclass CCodec_IccModule : public ICodec_IccModule\n{\npublic:\n    virtual IccCS\t\t\tGetProfileCS(FX_LPCBYTE pProfileData, unsigned int dwProfileSize);\n    virtual IccCS\t\t\tGetProfileCS(IFX_FileRead* pFile);\n    virtual FX_LPVOID\t\tCreateTransform(ICodec_IccModule::IccParam* pInputParam,\n                                            ICodec_IccModule::IccParam* pOutputParam,\n                                            ICodec_IccModule::IccParam* pProofParam = NULL,\n                                            FX_DWORD dwIntent = Icc_INTENT_PERCEPTUAL,\n                                            FX_DWORD dwFlag = Icc_FLAGS_DEFAULT,\n                                            FX_DWORD dwPrfIntent = Icc_INTENT_ABSOLUTE_COLORIMETRIC,\n                                            FX_DWORD dwPrfFlag = Icc_FLAGS_SOFTPROOFING\n                                      );\n    virtual FX_LPVOID\t\tCreateTransform_sRGB(FX_LPCBYTE pProfileData, unsigned int dwProfileSize, int nComponents, int intent = 0,\n            FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT);\n    virtual FX_LPVOID\t\tCreateTransform_CMYK(FX_LPCBYTE pSrcProfileData, unsigned int dwSrcProfileSize, int nSrcComponents,\n            FX_LPCBYTE pDstProfileData, unsigned int dwDstProfileSize, int intent = 0,\n            FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT,\n            FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT\n                                           );\n    virtual void\t\t\tDestroyTransform(FX_LPVOID pTransform);\n    virtual void\t\t\tTranslate(FX_LPVOID pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues);\n    virtual void\t\t\tTranslateScanline(FX_LPVOID pTransform, FX_LPBYTE pDest, FX_LPCBYTE pSrc, int pixels);\n    virtual void                        SetComponents(FX_DWORD nComponents) {m_nComponents = nComponents;}\n    virtual ~CCodec_IccModule();\nprotected:\n    CFX_MapByteStringToPtr\t\tm_MapTranform;\n    CFX_MapByteStringToPtr\t\tm_MapProfile;\n    FX_DWORD                            m_nComponents;\n    typedef enum {\n        Icc_CLASS_INPUT = 0,\n        Icc_CLASS_OUTPUT,\n        Icc_CLASS_PROOF,\n        Icc_CLASS_MAX\n    } Icc_CLASS;\n    FX_LPVOID\t\tCreateProfile(ICodec_IccModule::IccParam* pIccParam, Icc_CLASS ic, CFX_BinaryBuf* pTransformKey);\n};\nclass CCodec_JpxModule : public ICodec_JpxModule\n{\npublic:\n    CCodec_JpxModule();\n    void*\t\tCreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_BOOL useColorSpace = FALSE);\n    void\t\tGetImageInfo(FX_LPVOID ctx, FX_DWORD& width, FX_DWORD& height,\n                             FX_DWORD& codestream_nComps, FX_DWORD& output_nComps);\n    FX_BOOL\t\tDecode(void* ctx, FX_LPBYTE dest_data, int pitch, FX_BOOL bTranslateColor, FX_LPBYTE offsets);\n    void\t\tDestroyDecoder(void* ctx);\n};\n#include \"../jbig2/JBig2_Context.h\"\nclass CPDF_Jbig2Interface : public CFX_Object, public CJBig2_Module\n{\npublic:\n    virtual void *JBig2_Malloc(FX_DWORD dwSize)\n    {\n        return FX_Alloc(FX_BYTE, dwSize);\n    }\n    virtual void *JBig2_Malloc2(FX_DWORD num, FX_DWORD dwSize)\n    {\n        if (dwSize && num >= UINT_MAX / dwSize) {\n            return NULL;\n        }\n        return FX_Alloc(FX_BYTE, num * dwSize);\n    }\n    virtual void *JBig2_Malloc3(FX_DWORD num, FX_DWORD dwSize, FX_DWORD dwSize2)\n    {\n        if (dwSize2 && dwSize >= UINT_MAX / dwSize2) {\n            return NULL;\n        }\n        FX_DWORD size = dwSize2 * dwSize;\n        if (size && num >= UINT_MAX / size) {\n            return NULL;\n        }\n        return FX_Alloc(FX_BYTE, num * size);\n    }\n    virtual void *JBig2_Realloc(FX_LPVOID pMem, FX_DWORD dwSize)\n    {\n        return FX_Realloc(FX_BYTE, pMem, dwSize);\n    }\n    virtual void JBig2_Free(FX_LPVOID pMem)\n    {\n        FX_Free(pMem);\n    }\n};\nclass CCodec_Jbig2Context : public CFX_Object\n{\npublic:\n    CCodec_Jbig2Context();\n    ~CCodec_Jbig2Context() {};\n    IFX_FileRead* m_file_ptr;\n    FX_DWORD m_width;\n    FX_DWORD m_height;\n    FX_LPBYTE m_src_buf;\n    FX_DWORD m_src_size;\n    FX_LPCBYTE m_global_data;\n    FX_DWORD m_global_size;\n    FX_LPBYTE m_dest_buf;\n    FX_DWORD m_dest_pitch;\n    FX_BOOL\tm_bFileReader;\n    IFX_Pause* m_pPause;\n    CJBig2_Context* m_pContext;\n    CJBig2_Image* m_dest_image;\n};\nclass CCodec_Jbig2Module : public ICodec_Jbig2Module\n{\npublic:\n    CCodec_Jbig2Module() {};\n    ~CCodec_Jbig2Module();\n    FX_BOOL\t\tDecode(FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,\n                       FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch);\n    FX_BOOL\t\tDecode(IFX_FileRead* file_ptr,\n                       FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf);\n    void*\t\t\t\tCreateJbig2Context();\n    FXCODEC_STATUS\t\tStartDecode(void* pJbig2Context, FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,\n                                    FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch, IFX_Pause* pPause);\n\n    FXCODEC_STATUS\t\tStartDecode(void* pJbig2Context, IFX_FileRead* file_ptr,\n                                    FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf, IFX_Pause* pPause);\n    FXCODEC_STATUS\t\tContinueDecode(void* pJbig2Context, IFX_Pause* pPause);\n    void\t\t\t\tDestroyJbig2Context(void* pJbig2Context);\n    CPDF_Jbig2Interface\tm_Module;\nprivate:\n};\n"
  },
  {
    "path": "core/src/fxcodec/codec/fx_codec.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxcodec/fx_codec.h\"\n#include \"codec_int.h\"\nCCodec_ModuleMgr::CCodec_ModuleMgr()\n{\n    m_pBasicModule = FX_NEW CCodec_BasicModule;\n    m_pFaxModule = FX_NEW CCodec_FaxModule;\n    m_pJpegModule = FX_NEW CCodec_JpegModule;\n    m_pJpxModule = FX_NEW CCodec_JpxModule;\n    m_pJbig2Module = FX_NEW CCodec_Jbig2Module;\n    m_pIccModule = FX_NEW CCodec_IccModule;\n    m_pFlateModule = FX_NEW CCodec_FlateModule;\n}\nCCodec_ModuleMgr::~CCodec_ModuleMgr()\n{\n    delete m_pBasicModule;\n    delete m_pFaxModule;\n    delete m_pJpegModule;\n    delete m_pFlateModule;\n    delete m_pJpxModule;\n    delete m_pJbig2Module;\n    delete m_pIccModule;\n}\nvoid CCodec_ModuleMgr::InitJbig2Decoder()\n{\n}\nvoid CCodec_ModuleMgr::InitJpxDecoder()\n{\n}\nvoid CCodec_ModuleMgr::InitIccDecoder()\n{\n}\nCCodec_ScanlineDecoder::CCodec_ScanlineDecoder()\n{\n    m_NextLine = -1;\n    m_pDataCache = NULL;\n    m_pLastScanline = NULL;\n}\nCCodec_ScanlineDecoder::~CCodec_ScanlineDecoder()\n{\n    if (m_pDataCache) {\n        FX_Free(m_pDataCache);\n    }\n}\nFX_LPBYTE CCodec_ScanlineDecoder::GetScanline(int line)\n{\n    if (m_pDataCache && line < m_pDataCache->m_nCachedLines) {\n        return &m_pDataCache->m_Data + line * m_Pitch;\n    }\n    if (m_NextLine == line + 1) {\n        return m_pLastScanline;\n    }\n    if (m_NextLine < 0 || m_NextLine > line) {\n        if (!v_Rewind()) {\n            return NULL;\n        }\n        m_NextLine = 0;\n    }\n    while (m_NextLine < line) {\n        ReadNextLine();\n        m_NextLine ++;\n    }\n    m_pLastScanline = ReadNextLine();\n    m_NextLine ++;\n    return m_pLastScanline;\n}\nFX_BOOL CCodec_ScanlineDecoder::SkipToScanline(int line, IFX_Pause* pPause)\n{\n    if (m_pDataCache && line < m_pDataCache->m_nCachedLines) {\n        return FALSE;\n    }\n    if (m_NextLine == line || m_NextLine == line + 1) {\n        return FALSE;\n    }\n    if (m_NextLine < 0 || m_NextLine > line) {\n        v_Rewind();\n        m_NextLine = 0;\n    }\n    m_pLastScanline = NULL;\n    while (m_NextLine < line) {\n        m_pLastScanline = ReadNextLine();\n        m_NextLine ++;\n        if (pPause && pPause->NeedToPauseNow()) {\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nFX_LPBYTE CCodec_ScanlineDecoder::ReadNextLine()\n{\n    FX_LPBYTE pLine = v_GetNextLine();\n    if (pLine == NULL) {\n        return NULL;\n    }\n    if (m_pDataCache && m_NextLine == m_pDataCache->m_nCachedLines) {\n        FXSYS_memcpy32(&m_pDataCache->m_Data + m_NextLine * m_Pitch, pLine, m_Pitch);\n        m_pDataCache->m_nCachedLines ++;\n    }\n    return pLine;\n}\nvoid CCodec_ScanlineDecoder::DownScale(int dest_width, int dest_height)\n{\n    if (dest_width < 0) {\n        dest_width = -dest_width;\n    }\n    if (dest_height < 0) {\n        dest_height = -dest_height;\n    }\n    v_DownScale(dest_width, dest_height);\n    if (m_pDataCache) {\n        if (m_pDataCache->m_Height == m_OutputHeight && m_pDataCache->m_Width == m_OutputWidth) {\n            return;\n        }\n        FX_Free(m_pDataCache);\n        m_pDataCache = NULL;\n    }\n    m_pDataCache = (CCodec_ImageDataCache*)FX_AllocNL(FX_BYTE, sizeof(CCodec_ImageDataCache) + m_Pitch * m_OutputHeight);\n    if (m_pDataCache == NULL) {\n        return;\n    }\n    m_pDataCache->m_Height = m_OutputHeight;\n    m_pDataCache->m_Width = m_OutputWidth;\n    m_pDataCache->m_nCachedLines = 0;\n}\nFX_BOOL CCodec_BasicModule::RunLengthEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,\n        FX_DWORD& dest_size)\n{\n    return FALSE;\n}\nextern \"C\" double FXstrtod(const char* nptr, char** endptr)\n{\n    double ret = 0.0;\n    const char* ptr = nptr;\n    const char* exp_ptr = NULL;\n    int\te_number = 0,\n        e_signal = 0,\n        e_point = 0,\n        is_negative = 0;\n    int exp_ret = 0, exp_sig = 1,\n        fra_ret = 0, fra_count = 0, fra_base = 1;\n    if(nptr == NULL) {\n        return 0.0;\n    }\n    for (;; ptr++) {\n        if(!e_number && !e_point && (*ptr == '\\t' || *ptr == ' ')) {\n            continue;\n        }\n        if(*ptr >= '0' && *ptr <= '9') {\n            if(!e_number) {\n                e_number = 1;\n            }\n            if(!e_point) {\n                ret *= 10;\n                ret += (*ptr - '0');\n            } else {\n                fra_count++;\n                fra_ret *= 10;\n                fra_ret += (*ptr - '0');\n            }\n            continue;\n        }\n        if(!e_point && *ptr == '.') {\n            e_point = 1;\n            continue;\n        }\n        if(!e_number && !e_point && !e_signal) {\n            switch(*ptr) {\n                case '-':\n                    is_negative = 1;\n                case '+':\n                    e_signal = 1;\n                    continue;\n            }\n        }\n        if(e_number && (*ptr == 'e' || *ptr == 'E')) {\n#define EXPONENT_DETECT(ptr)\t\\\n    for(;;ptr++){\t\t\\\n        if(*ptr < '0' || *ptr > '9'){\t\\\n            if(endptr)\t*endptr = (char*)ptr;\t\\\n            break;\t\\\n        }else{\t\t\\\n            exp_ret *= 10;\t\\\n            exp_ret += (*ptr - '0');\t\\\n            continue;\t\t\\\n        }\t\\\n    }\n            exp_ptr = ptr++;\n            if(*ptr == '+' || *ptr == '-') {\n                exp_sig = (*ptr++ == '+') ? 1 : -1;\n                if(*ptr < '0' || *ptr > '9') {\n                    if(endptr)\t{\n                        *endptr = (char*)exp_ptr;\n                    }\n                    break;\n                }\n                EXPONENT_DETECT(ptr);\n            } else if(*ptr >= '0' && *ptr <= '9') {\n                EXPONENT_DETECT(ptr);\n            } else {\n                if(endptr)\t{\n                    *endptr = (char*)exp_ptr;\n                }\n                break;\n            }\n#undef EXPONENT_DETECT\n            break;\n        }\n        if(ptr != nptr && !e_number) {\n            if(endptr)\t{\n                *endptr = (char*)nptr;\n            }\n            break;\n        }\n        if(endptr)\t{\n            *endptr = (char*)ptr;\n        }\n        break;\n    }\n    while(fra_count--) {\n        fra_base *= 10;\n    }\n    ret += (double)fra_ret / (double)fra_base;\n    if(exp_sig == 1) {\n        while(exp_ret--) {\n            ret *= 10.0;\n        }\n    } else {\n        while(exp_ret--) {\n            ret /= 10.0;\n        }\n    }\n    return is_negative ? -ret : ret;\n}\nFX_BOOL CCodec_BasicModule::A85Encode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,\n                                      FX_DWORD& dest_size)\n{\n    return FALSE;\n}\nCCodec_ModuleMgr* CCodec_ModuleMgr::Create()\n{\n    return FX_NEW CCodec_ModuleMgr;\n}\nvoid CCodec_ModuleMgr::Destroy()\n{\n    delete this;\n}\nclass CCodec_RLScanlineDecoder : public CCodec_ScanlineDecoder\n{\npublic:\n    CCodec_RLScanlineDecoder();\n    virtual ~CCodec_RLScanlineDecoder();\n    FX_BOOL\t\t\t\tCreate(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, int nComps, int bpc);\n    virtual void\t\tv_DownScale(int dest_width, int dest_height) {}\n    virtual FX_BOOL\t\tv_Rewind();\n    virtual FX_LPBYTE\tv_GetNextLine();\n    virtual FX_DWORD\tGetSrcOffset()\n    {\n        return m_SrcOffset;\n    }\nprotected:\n    FX_BOOL\t\t\t\tCheckDestSize();\n    void\t\t\t\tGetNextOperator();\n    void\t\t\t\tUpdateOperator(FX_BYTE used_bytes);\n\n    FX_LPBYTE\t\t\tm_pScanline;\n    FX_LPCBYTE\t\t\tm_pSrcBuf;\n    FX_DWORD\t\t\tm_SrcSize;\n    FX_DWORD\t\t\tm_dwLineBytes;\n    FX_DWORD\t\t\tm_SrcOffset;\n    FX_BOOL\t\t\t\tm_bEOD;\n    FX_BYTE\t\t\t\tm_Operator;\n};\nCCodec_RLScanlineDecoder::CCodec_RLScanlineDecoder()\n    : m_pScanline(NULL)\n    , m_pSrcBuf(NULL)\n    , m_SrcSize(0)\n    , m_dwLineBytes(0)\n    , m_SrcOffset(0)\n    , m_bEOD(FALSE)\n    , m_Operator(0)\n{\n}\nCCodec_RLScanlineDecoder::~CCodec_RLScanlineDecoder()\n{\n    if (m_pScanline) {\n        FX_Free(m_pScanline);\n    }\n}\nFX_BOOL CCodec_RLScanlineDecoder::CheckDestSize()\n{\n    FX_DWORD i = 0;\n    FX_DWORD old_size = 0;\n    FX_DWORD dest_size = 0;\n    while (i < m_SrcSize) {\n        if (m_pSrcBuf[i] < 128) {\n            old_size = dest_size;\n            dest_size += m_pSrcBuf[i] + 1;\n            if (dest_size < old_size) {\n                return FALSE;\n            }\n            i += m_pSrcBuf[i] + 2;\n        } else if (m_pSrcBuf[i] > 128) {\n            old_size = dest_size;\n            dest_size += 257 - m_pSrcBuf[i];\n            if (dest_size < old_size) {\n                return FALSE;\n            }\n            i += 2;\n        } else {\n            break;\n        }\n    }\n    if (((FX_DWORD)m_OrigWidth * m_nComps * m_bpc * m_OrigHeight + 7) / 8 > dest_size) {\n        return FALSE;\n    }\n    return TRUE;\n}\nFX_BOOL CCodec_RLScanlineDecoder::Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, int nComps, int bpc)\n{\n    m_pSrcBuf = src_buf;\n    m_SrcSize = src_size;\n    m_OutputWidth = m_OrigWidth = width;\n    m_OutputHeight = m_OrigHeight = height;\n    m_nComps = nComps;\n    m_bpc = bpc;\n    m_bColorTransformed = FALSE;\n    m_DownScale = 1;\n    m_Pitch = (width * nComps * bpc + 31) / 32 * 4;\n    m_dwLineBytes = (width * nComps * bpc + 7) / 8;\n    m_pScanline = FX_Alloc(FX_BYTE, m_Pitch);\n    if (m_pScanline == NULL) {\n        return FALSE;\n    }\n    return CheckDestSize();\n}\nFX_BOOL CCodec_RLScanlineDecoder::v_Rewind()\n{\n    FXSYS_memset32(m_pScanline, 0, m_Pitch);\n    m_SrcOffset = 0;\n    m_bEOD = FALSE;\n    m_Operator = 0;\n    return TRUE;\n}\nFX_LPBYTE CCodec_RLScanlineDecoder::v_GetNextLine()\n{\n    if (m_SrcOffset == 0) {\n        GetNextOperator();\n    } else {\n        if (m_bEOD) {\n            return NULL;\n        }\n    }\n    FXSYS_memset32(m_pScanline, 0, m_Pitch);\n    FX_DWORD col_pos = 0;\n    FX_BOOL\teol = FALSE;\n    while (m_SrcOffset < m_SrcSize && !eol) {\n        if (m_Operator < 128) {\n            FX_DWORD copy_len = m_Operator + 1;\n            if (col_pos + copy_len >= m_dwLineBytes) {\n                copy_len = m_dwLineBytes - col_pos;\n                eol = TRUE;\n            }\n            if (copy_len >= m_SrcSize - m_SrcOffset) {\n                copy_len = m_SrcSize - m_SrcOffset;\n                m_bEOD = TRUE;\n            }\n            FXSYS_memcpy32(m_pScanline + col_pos, m_pSrcBuf + m_SrcOffset, copy_len);\n            col_pos += copy_len;\n            UpdateOperator((FX_BYTE)copy_len);\n        } else if (m_Operator > 128) {\n            int fill = 0;\n            if (m_SrcOffset - 1 < m_SrcSize - 1) {\n                fill = m_pSrcBuf[m_SrcOffset];\n            }\n            FX_DWORD duplicate_len = 257 - m_Operator;\n            if (col_pos + duplicate_len >= m_dwLineBytes) {\n                duplicate_len = m_dwLineBytes - col_pos;\n                eol = TRUE;\n            }\n            FXSYS_memset8(m_pScanline + col_pos, fill, duplicate_len);\n            col_pos += duplicate_len;\n            UpdateOperator((FX_BYTE)duplicate_len);\n        } else {\n            m_bEOD = TRUE;\n            break;\n        }\n    }\n    return m_pScanline;\n}\nvoid CCodec_RLScanlineDecoder::GetNextOperator()\n{\n    if (m_SrcOffset >= m_SrcSize) {\n        m_Operator = 128;\n        return;\n    }\n    m_Operator = m_pSrcBuf[m_SrcOffset];\n    m_SrcOffset ++;\n}\nvoid CCodec_RLScanlineDecoder::UpdateOperator(FX_BYTE used_bytes)\n{\n    if (used_bytes == 0) {\n        return;\n    }\n    if (m_Operator < 128) {\n        FXSYS_assert((FX_DWORD)m_Operator + 1 >= used_bytes);\n        if (used_bytes == m_Operator + 1) {\n            m_SrcOffset += used_bytes;\n            GetNextOperator();\n            return;\n        }\n        m_Operator -= used_bytes;\n        m_SrcOffset += used_bytes;\n        if (m_SrcOffset >= m_SrcSize) {\n            m_Operator = 128;\n        }\n        return;\n    }\n    FX_BYTE count = 257 - m_Operator;\n    FXSYS_assert((FX_DWORD)count >= used_bytes);\n    if (used_bytes == count) {\n        m_SrcOffset ++;\n        GetNextOperator();\n        return;\n    }\n    count -= used_bytes;\n    m_Operator = 257 - count;\n}\nICodec_ScanlineDecoder* CCodec_BasicModule::CreateRunLengthDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,\n        int nComps, int bpc)\n{\n    CCodec_RLScanlineDecoder* pRLScanlineDecoder = FX_NEW CCodec_RLScanlineDecoder;\n    if (pRLScanlineDecoder == NULL) {\n        return NULL;\n    }\n    if (!pRLScanlineDecoder->Create(src_buf, src_size, width, height, nComps, bpc)) {\n        delete pRLScanlineDecoder;\n        return NULL;\n    }\n    return pRLScanlineDecoder;\n}\n"
  },
  {
    "path": "core/src/fxcodec/codec/fx_codec_fax.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxcodec/fx_codec.h\"\n#include \"codec_int.h\"\nconst FX_BYTE OneLeadPos[256] = {\n    8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n};\nconst FX_BYTE ZeroLeadPos[256] = {\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8,\n};\n\nint _FindBit(const FX_BYTE* data_buf, int max_pos, int start_pos, int bit)\n{\n    if (start_pos >= max_pos) {\n        return max_pos;\n    }\n    FX_LPCBYTE leading_pos = bit ? OneLeadPos : ZeroLeadPos;\n    if (start_pos % 8) {\n        FX_BYTE data = data_buf[start_pos / 8];\n        if (bit) {\n            data &= 0xff >> (start_pos % 8);\n        } else {\n            data |= 0xff << (8 - start_pos % 8);\n        }\n        if (leading_pos[data] < 8) {\n            return start_pos / 8 * 8 + leading_pos[data];\n        }\n        start_pos += 7;\n    }\n    FX_BYTE skip = bit ? 0x00 : 0xff;\n    int byte_pos = start_pos / 8;\n    int max_byte = (max_pos + 7) / 8;\n    while (byte_pos < max_byte) {\n        if (data_buf[byte_pos] != skip) {\n            break;\n        }\n        byte_pos ++;\n    }\n    if (byte_pos == max_byte) {\n        return max_pos;\n    }\n    int pos = leading_pos[data_buf[byte_pos]] + byte_pos * 8;\n    if (pos > max_pos) {\n        pos = max_pos;\n    }\n    return pos;\n}\nvoid _FaxG4FindB1B2(const FX_BYTE* ref_buf, int columns, int a0, FX_BOOL a0color, int& b1, int& b2)\n{\n    if (a0color) {\n        a0color = 1;\n    }\n    FX_BYTE first_bit = (a0 < 0) ? 1 : ((ref_buf[a0 / 8] & (1 << (7 - a0 % 8))) != 0);\n    b1 = _FindBit(ref_buf, columns, a0 + 1, !first_bit);\n    if (b1 >= columns) {\n        b1 = b2 = columns;\n        return;\n    }\n    if (first_bit == !a0color) {\n        b1 = _FindBit(ref_buf, columns, b1 + 1, first_bit);\n        first_bit = !first_bit;\n    }\n    if (b1 >= columns) {\n        b1 = b2 = columns;\n        return;\n    }\n    b2 = _FindBit(ref_buf, columns, b1 + 1, first_bit);\n}\nvoid _FaxFillBits(FX_LPBYTE dest_buf, int columns, int startpos, int endpos)\n{\n    if (startpos < 0) {\n        startpos = 0;\n    }\n    if (endpos < 0) {\n        endpos = 0;\n    }\n    if (endpos >= columns) {\n        endpos = columns;\n    }\n    if (startpos >= endpos) {\n        return;\n    }\n    int first_byte = startpos / 8;\n    int last_byte = (endpos - 1) / 8;\n    if (first_byte == last_byte) {\n        for (int i = startpos % 8; i <= (endpos - 1) % 8; i ++) {\n            dest_buf[first_byte] -= 1 << (7 - i);\n        }\n        return;\n    }\n    int i;\n    for (i = startpos % 8; i < 8; i ++) {\n        dest_buf[first_byte] -= 1 << (7 - i);\n    }\n    for (i = 0; i <= (endpos - 1) % 8; i ++) {\n        dest_buf[last_byte] -= 1 << (7 - i);\n    }\n    if (last_byte > first_byte + 1) {\n        FXSYS_memset32(dest_buf + first_byte + 1, 0, last_byte - first_byte - 1);\n    }\n}\n#define NEXTBIT src_buf[bitpos/8] & (1 << (7-bitpos%8)); bitpos ++;\n#define ADDBIT(code, bit) code = code << 1; if (bit) code ++;\n#define GETBIT(bitpos) src_buf[bitpos/8] & (1 << (7-bitpos%8))\nstatic const FX_BYTE FaxBlackRunIns[] = {\n    0,\n    2,\n    0x02, 3, 0,\n    0x03, 2, 0,\n    2,\n    0x02, 1, 0,\n    0x03, 4, 0,\n    2,\n    0x02, 6, 0,\n    0x03, 5, 0,\n    1,\n    0x03, 7, 0,\n    2,\n    0x04, 9, 0,\n    0x05, 8, 0,\n    3,\n    0x04, 10, 0,\n    0x05, 11, 0,\n    0x07, 12, 0,\n    2,\n    0x04, 13, 0,\n    0x07, 14, 0,\n    1,\n    0x18, 15, 0,\n    5,\n    0x08, 18, 0,\n    0x0f, 64, 0,\n    0x17, 16, 0,\n    0x18, 17, 0,\n    0x37, 0, 0,\n    10,\n    0x08, 0x00, 0x07,\n    0x0c, 0x40, 0x07,\n    0x0d, 0x80, 0x07,\n    0x17, 24, 0,\n    0x18, 25, 0,\n    0x28, 23, 0,\n    0x37, 22, 0,\n    0x67, 19, 0,\n    0x68, 20, 0,\n    0x6c, 21, 0,\n    54,\n    0x12, 1984 % 256, 1984 / 256,\n    0x13, 2048 % 256, 2048 / 256,\n    0x14, 2112 % 256, 2112 / 256,\n    0x15, 2176 % 256, 2176 / 256,\n    0x16, 2240 % 256, 2240 / 256,\n    0x17, 2304 % 256, 2304 / 256,\n    0x1c, 2368 % 256, 2368 / 256,\n    0x1d, 2432 % 256, 2432 / 256,\n    0x1e, 2496 % 256, 2496 / 256,\n    0x1f, 2560 % 256, 2560 / 256,\n    0x24, 52, 0,\n    0x27, 55, 0,\n    0x28, 56, 0,\n    0x2b, 59, 0,\n    0x2c, 60, 0,\n    0x33, 320 % 256, 320 / 256,\n    0x34, 384 % 256, 384 / 256,\n    0x35, 448 % 256, 448 / 256,\n    0x37, 53, 0,\n    0x38, 54, 0,\n    0x52, 50, 0,\n    0x53, 51, 0,\n    0x54, 44, 0,\n    0x55, 45, 0,\n    0x56, 46, 0,\n    0x57, 47, 0,\n    0x58, 57, 0,\n    0x59, 58, 0,\n    0x5a, 61, 0,\n    0x5b, 256 % 256, 256 / 256,\n    0x64, 48, 0,\n    0x65, 49, 0,\n    0x66, 62, 0,\n    0x67, 63, 0,\n    0x68, 30, 0,\n    0x69, 31, 0,\n    0x6a, 32, 0,\n    0x6b, 33, 0,\n    0x6c, 40, 0,\n    0x6d, 41, 0,\n    0xc8, 128, 0,\n    0xc9, 192, 0,\n    0xca, 26, 0,\n    0xcb, 27, 0,\n    0xcc, 28, 0,\n    0xcd, 29, 0,\n    0xd2, 34, 0,\n    0xd3, 35, 0,\n    0xd4, 36, 0,\n    0xd5, 37, 0,\n    0xd6, 38, 0,\n    0xd7, 39, 0,\n    0xda, 42, 0,\n    0xdb, 43, 0,\n    20,\n    0x4a, 640 % 256, 640 / 256,\n    0x4b, 704 % 256, 704 / 256,\n    0x4c, 768 % 256, 768 / 256,\n    0x4d, 832 % 256, 832 / 256,\n    0x52, 1280 % 256, 1280 / 256,\n    0x53, 1344 % 256, 1344 / 256,\n    0x54, 1408 % 256, 1408 / 256,\n    0x55, 1472 % 256, 1472 / 256,\n    0x5a, 1536 % 256, 1536 / 256,\n    0x5b, 1600 % 256, 1600 / 256,\n    0x64, 1664 % 256, 1664 / 256,\n    0x65, 1728 % 256, 1728 / 256,\n    0x6c, 512 % 256, 512 / 256,\n    0x6d, 576 % 256, 576 / 256,\n    0x72, 896 % 256, 896 / 256,\n    0x73, 960 % 256, 960 / 256,\n    0x74, 1024 % 256, 1024 / 256,\n    0x75, 1088 % 256, 1088 / 256,\n    0x76, 1152 % 256, 1152 / 256,\n    0x77, 1216 % 256, 1216 / 256,\n    0xff\n};\nstatic const FX_BYTE FaxWhiteRunIns[] = {\n    0,\n    0,\n    0,\n    6,\n    0x07, 2, 0,\n    0x08, 3, 0,\n    0x0B, 4, 0,\n    0x0C, 5, 0,\n    0x0E, 6, 0,\n    0x0F, 7, 0,\n    6,\n    0x07, 10, 0,\n    0x08, 11, 0,\n    0x12, 128, 0,\n    0x13, 8, 0,\n    0x14, 9, 0,\n    0x1b, 64, 0,\n    9,\n    0x03, 13, 0,\n    0x07, 1, 0,\n    0x08, 12, 0,\n    0x17, 192, 0,\n    0x18, 1664 % 256, 1664 / 256,\n    0x2a, 16, 0,\n    0x2B, 17, 0,\n    0x34, 14, 0,\n    0x35, 15, 0,\n    12,\n    0x03, 22, 0,\n    0x04, 23, 0,\n    0x08, 20, 0,\n    0x0c, 19, 0,\n    0x13, 26, 0,\n    0x17, 21, 0,\n    0x18, 28, 0,\n    0x24, 27, 0,\n    0x27, 18, 0,\n    0x28, 24, 0,\n    0x2B, 25, 0,\n    0x37, 256 % 256, 256 / 256,\n    42,\n    0x02, 29, 0,\n    0x03, 30, 0,\n    0x04, 45, 0,\n    0x05, 46, 0,\n    0x0a, 47, 0,\n    0x0b, 48, 0,\n    0x12, 33, 0,\n    0x13, 34, 0,\n    0x14, 35, 0,\n    0x15, 36, 0,\n    0x16, 37, 0,\n    0x17, 38, 0,\n    0x1a, 31, 0,\n    0x1b, 32, 0,\n    0x24, 53, 0,\n    0x25, 54, 0,\n    0x28, 39, 0,\n    0x29, 40, 0,\n    0x2a, 41, 0,\n    0x2b, 42, 0,\n    0x2c, 43, 0,\n    0x2d, 44, 0,\n    0x32, 61, 0,\n    0x33, 62, 0,\n    0x34, 63, 0,\n    0x35, 0, 0,\n    0x36, 320 % 256, 320 / 256,\n    0x37, 384 % 256, 384 / 256,\n    0x4a, 59, 0,\n    0x4b, 60, 0,\n    0x52, 49, 0,\n    0x53, 50, 0,\n    0x54, 51, 0,\n    0x55, 52, 0,\n    0x58, 55, 0,\n    0x59, 56, 0,\n    0x5a, 57, 0,\n    0x5b, 58, 0,\n    0x64, 448 % 256, 448 / 256,\n    0x65, 512 % 256, 512 / 256,\n    0x67, 640 % 256, 640 / 256,\n    0x68, 576 % 256, 576 / 256,\n    16,\n    0x98, 1472 % 256, 1472 / 256,\n    0x99, 1536 % 256, 1536 / 256,\n    0x9a, 1600 % 256, 1600 / 256,\n    0x9b, 1728 % 256, 1728 / 256,\n    0xcc, 704 % 256, 704 / 256,\n    0xcd, 768 % 256, 768 / 256,\n    0xd2, 832 % 256, 832 / 256,\n    0xd3, 896 % 256, 896 / 256,\n    0xd4, 960 % 256, 960 / 256,\n    0xd5, 1024 % 256, 1024 / 256,\n    0xd6, 1088 % 256, 1088 / 256,\n    0xd7, 1152 % 256, 1152 / 256,\n    0xd8, 1216 % 256, 1216 / 256,\n    0xd9, 1280 % 256, 1280 / 256,\n    0xda, 1344 % 256, 1344 / 256,\n    0xdb, 1408 % 256, 1408 / 256,\n    0,\n    3,\n    0x08, 1792 % 256, 1792 / 256,\n    0x0c, 1856 % 256, 1856 / 256,\n    0x0d, 1920 % 256, 1920 / 256,\n    10,\n    0x12, 1984 % 256, 1984 / 256,\n    0x13, 2048 % 256, 2048 / 256,\n    0x14, 2112 % 256, 2112 / 256,\n    0x15, 2176 % 256, 2176 / 256,\n    0x16, 2240 % 256, 2240 / 256,\n    0x17, 2304 % 256, 2304 / 256,\n    0x1c, 2368 % 256, 2368 / 256,\n    0x1d, 2432 % 256, 2432 / 256,\n    0x1e, 2496 % 256, 2496 / 256,\n    0x1f, 2560 % 256, 2560 / 256,\n    0xff,\n};\nint _FaxGetRun(FX_LPCBYTE ins_array, const FX_BYTE* src_buf, int& bitpos, int bitsize)\n{\n    FX_DWORD code = 0;\n    int ins_off = 0;\n    while (1) {\n        FX_BYTE ins = ins_array[ins_off++];\n        if (ins == 0xff) {\n            return -1;\n        }\n        if (bitpos >= bitsize) {\n            return -1;\n        }\n        code <<= 1;\n        if (src_buf[bitpos / 8] & (1 << (7 - bitpos % 8))) {\n            code ++;\n        }\n        bitpos ++;\n        int next_off = ins_off + ins * 3;\n        for (; ins_off < next_off; ins_off += 3) {\n            if (ins_array[ins_off] == code) {\n                return ins_array[ins_off + 1] + ins_array[ins_off + 2] * 256;\n            }\n        }\n    }\n}\nFX_BOOL _FaxG4GetRow(const FX_BYTE* src_buf, int bitsize, int& bitpos, FX_LPBYTE dest_buf, const FX_BYTE* ref_buf, int columns)\n{\n    int a0 = -1, a0color = 1;\n    while (1) {\n        if (bitpos >= bitsize) {\n            return FALSE;\n        }\n        int a1, a2, b1, b2;\n        _FaxG4FindB1B2(ref_buf, columns, a0, a0color, b1, b2);\n        FX_BOOL bit = NEXTBIT;\n        int v_delta = 0;\n        if (bit) {\n        } else {\n            if (bitpos >= bitsize) {\n                return FALSE;\n            }\n            FX_BOOL bit1 = NEXTBIT;\n            if (bitpos >= bitsize) {\n                return FALSE;\n            }\n            FX_BOOL bit2 = NEXTBIT;\n            if (bit1 && bit2) {\n                v_delta = 1;\n            } else if (bit1) {\n                v_delta = -1;\n            } else if (bit2) {\n                int run_len1 = 0;\n                while (1) {\n                    int run = _FaxGetRun(a0color ? FaxWhiteRunIns : FaxBlackRunIns, src_buf, bitpos, bitsize);\n                    run_len1 += run;\n                    if (run < 64) {\n                        break;\n                    }\n                }\n                if (a0 < 0) {\n                    run_len1 ++;\n                }\n                a1 = a0 + run_len1;\n                if (!a0color) {\n                    _FaxFillBits(dest_buf, columns, a0, a1);\n                }\n                int run_len2 = 0;\n                while (1) {\n                    int run = _FaxGetRun(a0color ? FaxBlackRunIns : FaxWhiteRunIns, src_buf, bitpos, bitsize);\n                    run_len2 += run;\n                    if (run < 64) {\n                        break;\n                    }\n                }\n                a2 = a1 + run_len2;\n                if (a0color) {\n                    _FaxFillBits(dest_buf, columns, a1, a2);\n                }\n                a0 = a2;\n                if (a0 < columns) {\n                    continue;\n                }\n                return TRUE;\n            } else {\n                if (bitpos >= bitsize) {\n                    return FALSE;\n                }\n                bit = NEXTBIT;\n                if (bit) {\n                    if (!a0color) {\n                        _FaxFillBits(dest_buf, columns, a0, b2);\n                    }\n                    if (b2 >= columns) {\n                        return TRUE;\n                    }\n                    a0 = b2;\n                    continue;\n                } else {\n                    if (bitpos >= bitsize) {\n                        return FALSE;\n                    }\n                    FX_BOOL bit1 = NEXTBIT;\n                    if (bitpos >= bitsize) {\n                        return FALSE;\n                    }\n                    FX_BOOL bit2 = NEXTBIT;\n                    if (bit1 && bit2) {\n                        v_delta = 2;\n                    } else if (bit1) {\n                        v_delta = -2;\n                    } else if (bit2) {\n                        if (bitpos >= bitsize) {\n                            return FALSE;\n                        }\n                        bit = NEXTBIT;\n                        if (bit) {\n                            v_delta = 3;\n                        } else {\n                            v_delta = -3;\n                        }\n                    } else {\n                        if (bitpos >= bitsize) {\n                            return FALSE;\n                        }\n                        bit = NEXTBIT;\n                        if (bit) {\n                            bitpos += 3;\n                            continue;\n                        } else {\n                            bitpos += 5;\n                            return TRUE;\n                        }\n                    }\n                }\n            }\n        }\n        a1 = b1 + v_delta;\n        if (!a0color) {\n            _FaxFillBits(dest_buf, columns, a0, a1);\n        }\n        if (a1 >= columns) {\n            return TRUE;\n        }\n        a0 = a1;\n        a0color = !a0color;\n    }\n}\nFX_BOOL _FaxSkipEOL(const FX_BYTE* src_buf, int bitsize, int& bitpos)\n{\n    int startbit = bitpos;\n    while (bitpos < bitsize) {\n        int bit = NEXTBIT;\n        if (bit) {\n            if (bitpos - startbit <= 11) {\n                bitpos = startbit;\n            }\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nFX_BOOL _FaxGet1DLine(const FX_BYTE* src_buf, int bitsize, int& bitpos, FX_LPBYTE dest_buf, int columns)\n{\n    int color = TRUE;\n    int startpos = 0;\n    while (1) {\n        if (bitpos >= bitsize) {\n            return FALSE;\n        }\n        int run_len = 0;\n        while (1) {\n            int run = _FaxGetRun(color ? FaxWhiteRunIns : FaxBlackRunIns, src_buf, bitpos, bitsize);\n            if (run < 0) {\n                while (bitpos < bitsize) {\n                    int bit = NEXTBIT;\n                    if (bit) {\n                        return TRUE;\n                    }\n                }\n                return FALSE;\n            }\n            run_len += run;\n            if (run < 64) {\n                break;\n            }\n        }\n        if (!color) {\n            _FaxFillBits(dest_buf, columns, startpos, startpos + run_len);\n        }\n        startpos += run_len;\n        if (startpos >= columns) {\n            break;\n        }\n        color = !color;\n    }\n    return TRUE;\n}\nclass CCodec_FaxDecoder : public CCodec_ScanlineDecoder\n{\npublic:\n    CCodec_FaxDecoder();\n    virtual ~CCodec_FaxDecoder();\n    FX_BOOL\t\t\t\tCreate(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,\n                               int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows);\n    virtual void\t\tv_DownScale(int dest_width, int dest_height) {}\n    virtual FX_BOOL\t\tv_Rewind();\n    virtual FX_LPBYTE\tv_GetNextLine();\n    virtual FX_DWORD\tGetSrcOffset();\n    int\t\t\tm_Encoding, m_bEndOfLine, m_bByteAlign, m_bBlack;\n    int\t\t\tbitpos;\n    FX_LPCBYTE\tm_pSrcBuf;\n    FX_DWORD\tm_SrcSize;\n    FX_LPBYTE\tm_pScanlineBuf, m_pRefBuf;\n};\nCCodec_FaxDecoder::CCodec_FaxDecoder()\n{\n    m_pScanlineBuf = NULL;\n    m_pRefBuf = NULL;\n}\nCCodec_FaxDecoder::~CCodec_FaxDecoder()\n{\n    if (m_pScanlineBuf) {\n        FX_Free(m_pScanlineBuf);\n    }\n    if (m_pRefBuf) {\n        FX_Free(m_pRefBuf);\n    }\n}\nFX_BOOL CCodec_FaxDecoder::Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,\n                                  int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows)\n{\n    m_Encoding = K;\n    m_bEndOfLine = EndOfLine;\n    m_bByteAlign = EncodedByteAlign;\n    m_bBlack = BlackIs1;\n    m_OrigWidth = Columns;\n    m_OrigHeight = Rows;\n    if (m_OrigWidth == 0) {\n        m_OrigWidth = width;\n    }\n    if (m_OrigHeight == 0) {\n        m_OrigHeight = height;\n    }\n    m_Pitch = (m_OrigWidth + 31) / 32 * 4;\n    m_OutputWidth = m_OrigWidth;\n    m_OutputHeight = m_OrigHeight;\n    m_pScanlineBuf = FX_Alloc(FX_BYTE, m_Pitch);\n    if (m_pScanlineBuf == NULL) {\n        return FALSE;\n    }\n    m_pRefBuf = FX_Alloc(FX_BYTE, m_Pitch);\n    if (m_pRefBuf == NULL) {\n        return FALSE;\n    }\n    m_pSrcBuf = src_buf;\n    m_SrcSize = src_size;\n    m_nComps = 1;\n    m_bpc = 1;\n    m_bColorTransformed = FALSE;\n    return TRUE;\n}\nFX_BOOL CCodec_FaxDecoder::v_Rewind()\n{\n    FXSYS_memset8(m_pRefBuf, 0xff, m_Pitch);\n    bitpos = 0;\n    return TRUE;\n}\nFX_LPBYTE CCodec_FaxDecoder::v_GetNextLine()\n{\n    int bitsize = m_SrcSize * 8;\n    _FaxSkipEOL(m_pSrcBuf, bitsize, bitpos);\n    if (bitpos >= bitsize) {\n        return NULL;\n    }\n    FXSYS_memset8(m_pScanlineBuf, 0xff, m_Pitch);\n    if (m_Encoding < 0) {\n        _FaxG4GetRow(m_pSrcBuf, bitsize, bitpos, m_pScanlineBuf, m_pRefBuf, m_OrigWidth);\n        FXSYS_memcpy32(m_pRefBuf, m_pScanlineBuf, m_Pitch);\n    } else if (m_Encoding == 0) {\n        _FaxGet1DLine(m_pSrcBuf, bitsize, bitpos, m_pScanlineBuf, m_OrigWidth);\n    } else {\n        FX_BOOL bNext1D = m_pSrcBuf[bitpos / 8] & (1 << (7 - bitpos % 8));\n        bitpos ++;\n        if (bNext1D) {\n            _FaxGet1DLine(m_pSrcBuf, bitsize, bitpos, m_pScanlineBuf, m_OrigWidth);\n        } else {\n            _FaxG4GetRow(m_pSrcBuf, bitsize, bitpos, m_pScanlineBuf, m_pRefBuf, m_OrigWidth);\n        }\n        FXSYS_memcpy32(m_pRefBuf, m_pScanlineBuf, m_Pitch);\n    }\n    if (m_bEndOfLine) {\n        _FaxSkipEOL(m_pSrcBuf, bitsize, bitpos);\n    }\n    if (m_bByteAlign && bitpos < bitsize) {\n        int bitpos0 = bitpos;\n        int bitpos1 = (bitpos + 7) / 8 * 8;\n        while (m_bByteAlign && bitpos0 < bitpos1) {\n            int bit = m_pSrcBuf[bitpos0 / 8] & (1 << (7 - bitpos0 % 8));\n            if (bit != 0) {\n                m_bByteAlign = FALSE;\n            } else {\n                bitpos0 ++;\n            }\n        }\n        if (m_bByteAlign) {\n            bitpos = bitpos1;\n        }\n    }\n    if (m_bBlack) {\n        for (int i = 0; i < m_Pitch; i ++) {\n            m_pScanlineBuf[i] = ~m_pScanlineBuf[i];\n        }\n    }\n    return m_pScanlineBuf;\n}\nFX_DWORD CCodec_FaxDecoder::GetSrcOffset()\n{\n    FX_DWORD ret = (bitpos + 7) / 8;\n    if (ret > m_SrcSize) {\n        ret = m_SrcSize;\n    }\n    return ret;\n}\nextern \"C\" {\n    void _FaxG4Decode(void*, FX_LPCBYTE src_buf, FX_DWORD src_size, int* pbitpos, FX_LPBYTE dest_buf, int width, int height, int pitch)\n    {\n        if (pitch == 0) {\n            pitch = (width + 7) / 8;\n        }\n        FX_LPBYTE ref_buf = FX_Alloc(FX_BYTE, pitch);\n        if (ref_buf == NULL) {\n            return;\n        }\n        FXSYS_memset8(ref_buf, 0xff, pitch);\n        int bitpos = *pbitpos;\n        for (int iRow = 0; iRow < height; iRow ++) {\n            FX_LPBYTE line_buf = dest_buf + iRow * pitch;\n            FXSYS_memset8(line_buf, 0xff, pitch);\n            _FaxG4GetRow(src_buf, src_size << 3, bitpos, line_buf, ref_buf, width);\n            FXSYS_memcpy32(ref_buf, line_buf, pitch);\n        }\n        FX_Free(ref_buf);\n        *pbitpos = bitpos;\n    }\n};\nstatic const FX_BYTE BlackRunTerminator[128] = {\n    0x37, 10, 0x02, 3, 0x03, 2, 0x02, 2, 0x03, 3, 0x03, 4, 0x02, 4, 0x03, 5,\n    0x05, 6, 0x04, 6, 0x04, 7, 0x05, 7, 0x07, 7, 0x04, 8, 0x07, 8, 0x18, 9,\n    0x17, 10, 0x18, 10, 0x08, 10, 0x67, 11, 0x68, 11, 0x6c, 11, 0x37, 11, 0x28, 11,\n    0x17, 11, 0x18, 11, 0xca, 12, 0xcb, 12, 0xcc, 12, 0xcd, 12, 0x68, 12, 0x69, 12,\n    0x6a, 12, 0x6b, 12, 0xd2, 12, 0xd3, 12, 0xd4, 12, 0xd5, 12, 0xd6, 12, 0xd7, 12,\n    0x6c, 12, 0x6d, 12, 0xda, 12, 0xdb, 12, 0x54, 12, 0x55, 12, 0x56, 12, 0x57, 12,\n    0x64, 12, 0x65, 12, 0x52, 12, 0x53, 12, 0x24, 12, 0x37, 12, 0x38, 12, 0x27, 12,\n    0x28, 12, 0x58, 12, 0x59, 12, 0x2b, 12, 0x2c, 12, 0x5a, 12, 0x66, 12, 0x67, 12,\n};\nstatic const FX_BYTE BlackRunMarkup[80] = {\n    0x0f, 10, 0xc8, 12, 0xc9, 12, 0x5b, 12, 0x33, 12, 0x34, 12, 0x35, 12, 0x6c, 13,\n    0x6d, 13, 0x4a, 13, 0x4b, 13, 0x4c, 13, 0x4d, 13, 0x72, 13, 0x73, 13, 0x74, 13,\n    0x75, 13, 0x76, 13, 0x77, 13, 0x52, 13, 0x53, 13, 0x54, 13, 0x55, 13, 0x5a, 13,\n    0x5b, 13, 0x64, 13, 0x65, 13, 0x08, 11, 0x0c, 11, 0x0d, 11, 0x12, 12, 0x13, 12,\n    0x14, 12, 0x15, 12, 0x16, 12, 0x17, 12, 0x1c, 12, 0x1d, 12, 0x1e, 12, 0x1f, 12,\n};\nstatic const FX_BYTE WhiteRunTerminator[128] = {\n    0x35, 8,\n    0x07, 6,\n    0x07, 4,\n    0x08, 4,\n    0x0B, 4,\n    0x0C, 4,\n    0x0E, 4,\n    0x0F, 4,\n    0x13, 5,\n    0x14, 5,\n    0x07, 5,\n    0x08, 5,\n    0x08, 6,\n    0x03, 6,\n    0x34, 6,\n    0x35, 6,\n    0x2a, 6,\n    0x2B, 6,\n    0x27, 7,\n    0x0c, 7,\n    0x08, 7,\n    0x17, 7,\n    0x03, 7,\n    0x04, 7,\n    0x28, 7,\n    0x2B, 7,\n    0x13, 7,\n    0x24, 7,\n    0x18, 7,\n    0x02, 8,\n    0x03, 8,\n    0x1a, 8,\n    0x1b, 8,\n    0x12, 8,\n    0x13, 8,\n    0x14, 8,\n    0x15, 8,\n    0x16, 8,\n    0x17, 8,\n    0x28, 8,\n    0x29, 8,\n    0x2a, 8,\n    0x2b, 8,\n    0x2c, 8,\n    0x2d, 8,\n    0x04, 8,\n    0x05, 8,\n    0x0a, 8,\n    0x0b, 8,\n    0x52, 8,\n    0x53, 8,\n    0x54, 8,\n    0x55, 8,\n    0x24, 8,\n    0x25, 8,\n    0x58, 8,\n    0x59, 8,\n    0x5a, 8,\n    0x5b, 8,\n    0x4a, 8,\n    0x4b, 8,\n    0x32, 8,\n    0x33, 8,\n    0x34, 8,\n};\nstatic const FX_BYTE WhiteRunMarkup[80] = {\n    0x1b, 5,\n    0x12, 5,\n    0x17, 6,\n    0x37, 7,\n    0x36, 8,\n    0x37, 8,\n    0x64, 8,\n    0x65, 8,\n    0x68, 8,\n    0x67, 8,\n    0xcc, 9,\n    0xcd, 9,\n    0xd2, 9,\n    0xd3, 9,\n    0xd4, 9,\n    0xd5, 9,\n    0xd6, 9,\n    0xd7, 9,\n    0xd8, 9,\n    0xd9, 9,\n    0xda, 9,\n    0xdb, 9,\n    0x98, 9,\n    0x99, 9,\n    0x9a, 9,\n    0x18, 6,\n    0x9b, 9,\n    0x08, 11,\n    0x0c, 11,\n    0x0d, 11,\n    0x12, 12,\n    0x13, 12,\n    0x14, 12,\n    0x15, 12,\n    0x16, 12,\n    0x17, 12,\n    0x1c, 12,\n    0x1d, 12,\n    0x1e, 12,\n    0x1f, 12,\n};\nstatic void _AddBitStream(FX_LPBYTE dest_buf, int& dest_bitpos, int data, int bitlen)\n{\n    for (int i = bitlen - 1; i >= 0; i --) {\n        if (data & (1 << i)) {\n            dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);\n        }\n        dest_bitpos ++;\n    }\n}\nstatic void _FaxEncodeRun(FX_LPBYTE dest_buf, int& dest_bitpos, int run, FX_BOOL bWhite)\n{\n    while (run >= 2560) {\n        _AddBitStream(dest_buf, dest_bitpos, 0x1f, 12);\n        run -= 2560;\n    }\n    if (run >= 64) {\n        int markup = run - run % 64;\n        FX_LPCBYTE p = bWhite ? WhiteRunMarkup : BlackRunMarkup;\n        p += (markup / 64 - 1) * 2;\n        _AddBitStream(dest_buf, dest_bitpos, *p, p[1]);\n    }\n    run %= 64;\n    FX_LPCBYTE p = bWhite ? WhiteRunTerminator : BlackRunTerminator;\n    p += run * 2;\n    _AddBitStream(dest_buf, dest_bitpos, *p, p[1]);\n}\nstatic void _FaxEncode2DLine(FX_LPBYTE dest_buf, int& dest_bitpos, FX_LPCBYTE src_buf, FX_LPCBYTE ref_buf, int cols)\n{\n    int a0 = -1, a0color = 1;\n    while (1) {\n        int a1 = _FindBit(src_buf, cols, a0 + 1, 1 - a0color);\n        int b1, b2;\n        _FaxG4FindB1B2(ref_buf, cols, a0, a0color, b1, b2);\n        if (b2 < a1) {\n            dest_bitpos += 3;\n            dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);\n            dest_bitpos ++;\n            a0 = b2;\n        } else if (a1 - b1 <= 3 && b1 - a1 <= 3) {\n            int delta = a1 - b1;\n            switch (delta) {\n                case 0:\n                    dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);\n                    break;\n                case 1:\n                case 2:\n                case 3:\n                    dest_bitpos += delta == 1 ? 1 : delta + 2;\n                    dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);\n                    dest_bitpos ++;\n                    dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);\n                    break;\n                case -1:\n                case -2:\n                case -3:\n                    dest_bitpos += delta == -1 ? 1 : -delta + 2;\n                    dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);\n                    dest_bitpos ++;\n                    break;\n            }\n            dest_bitpos ++;\n            a0 = a1;\n            a0color = 1 - a0color;\n        } else {\n            int a2 = _FindBit(src_buf, cols, a1 + 1, a0color);\n            dest_bitpos ++;\n            dest_bitpos ++;\n            dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);\n            dest_bitpos ++;\n            if (a0 < 0) {\n                a0 = 0;\n            }\n            _FaxEncodeRun(dest_buf, dest_bitpos, a1 - a0, a0color);\n            _FaxEncodeRun(dest_buf, dest_bitpos, a2 - a1, 1 - a0color);\n            a0 = a2;\n        }\n        if (a0 >= cols) {\n            return;\n        }\n    }\n}\nclass CCodec_FaxEncoder : public CFX_Object\n{\npublic:\n    CCodec_FaxEncoder(FX_LPCBYTE src_buf, int width, int height, int pitch);\n    ~CCodec_FaxEncoder();\n    void\t\t\tEncode(FX_LPBYTE& dest_buf, FX_DWORD& dest_size);\n    void\t\t\tEncode2DLine(FX_LPCBYTE scan_line);\n    CFX_BinaryBuf\tm_DestBuf;\n    FX_LPBYTE\t\tm_pRefLine, m_pLineBuf;\n    int\t\t\t\tm_Cols, m_Rows, m_Pitch;\n    FX_LPCBYTE\t\tm_pSrcBuf;\n};\nCCodec_FaxEncoder::CCodec_FaxEncoder(FX_LPCBYTE src_buf, int width, int height, int pitch)\n{\n    m_pSrcBuf = src_buf;\n    m_Cols = width;\n    m_Rows = height;\n    m_Pitch = pitch;\n    m_pRefLine = FX_Alloc(FX_BYTE, m_Pitch);\n    if (m_pRefLine == NULL) {\n        return;\n    }\n    FXSYS_memset8(m_pRefLine, 0xff, m_Pitch);\n    m_pLineBuf = FX_Alloc(FX_BYTE, m_Pitch * 8);\n    if (m_pLineBuf == NULL) {\n        return;\n    }\n    m_DestBuf.EstimateSize(0, 10240);\n}\nCCodec_FaxEncoder::~CCodec_FaxEncoder()\n{\n    if (m_pRefLine) {\n        FX_Free(m_pRefLine);\n    }\n    if (m_pLineBuf) {\n        FX_Free(m_pLineBuf);\n    }\n}\nvoid CCodec_FaxEncoder::Encode(FX_LPBYTE& dest_buf, FX_DWORD& dest_size)\n{\n    int dest_bitpos = 0;\n    FX_BYTE last_byte = 0;\n    for (int i = 0; i < m_Rows; i ++) {\n        FX_LPCBYTE scan_line = m_pSrcBuf + i * m_Pitch;\n        FXSYS_memset32(m_pLineBuf, 0, m_Pitch * 8);\n        m_pLineBuf[0] = last_byte;\n        _FaxEncode2DLine(m_pLineBuf, dest_bitpos, scan_line, m_pRefLine, m_Cols);\n        m_DestBuf.AppendBlock(m_pLineBuf, dest_bitpos / 8);\n        last_byte = m_pLineBuf[dest_bitpos / 8];\n        dest_bitpos %= 8;\n        FXSYS_memcpy32(m_pRefLine, scan_line, m_Pitch);\n    }\n    if (dest_bitpos) {\n        m_DestBuf.AppendByte(last_byte);\n    }\n    dest_buf = m_DestBuf.GetBuffer();\n    dest_size = m_DestBuf.GetSize();\n    m_DestBuf.DetachBuffer();\n}\nFX_BOOL\tCCodec_FaxModule::Encode(FX_LPCBYTE src_buf, int width, int height, int pitch, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)\n{\n    CCodec_FaxEncoder encoder(src_buf, width, height, pitch);\n    encoder.Encode(dest_buf, dest_size);\n    return TRUE;\n}\nICodec_ScanlineDecoder*\tCCodec_FaxModule::CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,\n        int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows)\n{\n    CCodec_FaxDecoder* pDecoder = FX_NEW CCodec_FaxDecoder;\n    if (pDecoder == NULL) {\n        return NULL;\n    }\n    pDecoder->Create(src_buf, src_size, width, height, K, EndOfLine, EncodedByteAlign, BlackIs1, Columns, Rows);\n    return pDecoder;\n}\n"
  },
  {
    "path": "core/src/fxcodec/codec/fx_codec_flate.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../fx_zlib.h\"\n#include \"../../../include/fxcodec/fx_codec.h\"\n#include \"codec_int.h\"\nextern \"C\"\n{\n    static void* my_alloc_func (void* opaque, unsigned int items, unsigned int size)\n    {\n        return FX_Alloc(FX_BYTE, items * size);\n    }\n    static void   my_free_func  (void* opaque, void* address)\n    {\n        FX_Free(address);\n    }\n    void* FPDFAPI_FlateInit(void* (*alloc_func)(void*, unsigned int, unsigned int),\n                            void (*free_func)(void*, void*))\n    {\n        z_stream* p = (z_stream*)alloc_func(0, 1, sizeof(z_stream));\n        if (p == NULL) {\n            return NULL;\n        }\n        FXSYS_memset32(p, 0, sizeof(z_stream));\n        p->zalloc = alloc_func;\n        p->zfree = free_func;\n        inflateInit(p);\n        return p;\n    }\n    void FPDFAPI_FlateInput(void* context, const unsigned char* src_buf, unsigned int src_size)\n    {\n        ((z_stream*)context)->next_in = (unsigned char*)src_buf;\n        ((z_stream*)context)->avail_in = src_size;\n    }\n    int FPDFAPI_FlateGetTotalOut(void* context)\n    {\n        return ((z_stream*)context)->total_out;\n    }\n    int FPDFAPI_FlateOutput(void* context, unsigned char* dest_buf, unsigned int dest_size)\n    {\n        ((z_stream*)context)->next_out = dest_buf;\n        ((z_stream*)context)->avail_out = dest_size;\n        unsigned int pre_pos = (unsigned int)FPDFAPI_FlateGetTotalOut(context);\n        int ret = inflate((z_stream*)context, Z_SYNC_FLUSH);\n        unsigned int post_pos = (unsigned int)FPDFAPI_FlateGetTotalOut(context);\n        unsigned int written = post_pos - pre_pos;\n        if (written < dest_size) {\n            FXSYS_memset8(dest_buf + written, '\\0', dest_size - written);\n        }\n        return ret;\n    }\n    int FPDFAPI_FlateGetTotalIn(void* context)\n    {\n        return ((z_stream*)context)->total_in;\n    }\n    int FPDFAPI_FlateGetAvailOut(void* context)\n    {\n        return ((z_stream*)context)->avail_out;\n    }\n    int FPDFAPI_FlateGetAvailIn(void* context)\n    {\n        return ((z_stream*)context)->avail_in;\n    }\n    void FPDFAPI_FlateEnd(void* context)\n    {\n        inflateEnd((z_stream*)context);\n        ((z_stream*)context)->zfree(0, context);\n    }\n    void FPDFAPI_FlateCompress(unsigned char* dest_buf, unsigned long* dest_size, const unsigned char* src_buf, unsigned long src_size)\n    {\n        compress(dest_buf, dest_size, src_buf, src_size);\n    }\n}\nclass CLZWDecoder : public CFX_Object\n{\npublic:\n    FX_BOOL Decode(FX_LPBYTE output, FX_DWORD& outlen, const FX_BYTE* input, FX_DWORD& size, FX_BOOL bEarlyChange);\nprivate:\n    FX_DWORD\tm_InPos;\n    FX_DWORD\tm_OutPos;\n    FX_LPBYTE\tm_pOutput;\n    const FX_BYTE*\tm_pInput;\n    FX_BOOL\t\tm_Early;\n    void\t\tAddCode(FX_DWORD prefix_code, FX_BYTE append_char);\n    FX_DWORD\tm_CodeArray[5021];\n    FX_DWORD\tm_nCodes;\n    FX_BYTE\t\tm_DecodeStack[4000];\n    FX_DWORD\tm_StackLen;\n    void\t\tDecodeString(FX_DWORD code);\n    int\t\t\tm_CodeLen;\n};\nvoid CLZWDecoder::AddCode(FX_DWORD prefix_code, FX_BYTE append_char)\n{\n    if (m_nCodes + m_Early == 4094) {\n        return;\n    }\n    m_CodeArray[m_nCodes ++] = (prefix_code << 16) | append_char;\n    if (m_nCodes + m_Early == 512 - 258) {\n        m_CodeLen = 10;\n    } else if (m_nCodes + m_Early == 1024 - 258) {\n        m_CodeLen = 11;\n    } else if (m_nCodes + m_Early == 2048 - 258) {\n        m_CodeLen = 12;\n    }\n}\nvoid CLZWDecoder::DecodeString(FX_DWORD code)\n{\n    while (1) {\n        int index = code - 258;\n        if (index < 0 || index >= (int)m_nCodes) {\n            break;\n        }\n        FX_DWORD data = m_CodeArray[index];\n        if (m_StackLen >= sizeof(m_DecodeStack)) {\n            return;\n        }\n        m_DecodeStack[m_StackLen++] = (FX_BYTE)data;\n        code = data >> 16;\n    }\n    if (m_StackLen >= sizeof(m_DecodeStack)) {\n        return;\n    }\n    m_DecodeStack[m_StackLen++] = (FX_BYTE)code;\n}\nint CLZWDecoder::Decode(FX_LPBYTE dest_buf, FX_DWORD& dest_size, const FX_BYTE* src_buf, FX_DWORD& src_size, FX_BOOL bEarlyChange)\n{\n    m_CodeLen = 9;\n    m_InPos = 0;\n    m_OutPos = 0;\n    m_pInput = src_buf;\n    m_pOutput = dest_buf;\n    m_Early = bEarlyChange ? 1 : 0;\n    m_nCodes = 0;\n    FX_DWORD old_code = (FX_DWORD) - 1;\n    FX_BYTE last_char;\n    while (1) {\n        if (m_InPos + m_CodeLen > src_size * 8) {\n            break;\n        }\n        int byte_pos = m_InPos / 8;\n        int bit_pos = m_InPos % 8, bit_left = m_CodeLen;\n        FX_DWORD code = 0;\n        if (bit_pos) {\n            bit_left -= 8 - bit_pos;\n            code = (m_pInput[byte_pos++] & ((1 << (8 - bit_pos)) - 1)) << bit_left;\n        }\n        if (bit_left < 8) {\n            code |= m_pInput[byte_pos] >> (8 - bit_left);\n        } else {\n            bit_left -= 8;\n            code |= m_pInput[byte_pos++] << bit_left;\n            if (bit_left) {\n                code |= m_pInput[byte_pos] >> (8 - bit_left);\n            }\n        }\n        m_InPos += m_CodeLen;\n        if (code < 256) {\n            if (m_OutPos == dest_size) {\n                return -5;\n            }\n            if (m_pOutput) {\n                m_pOutput[m_OutPos] = (FX_BYTE)code;\n            }\n            m_OutPos ++;\n            last_char = (FX_BYTE)code;\n            if (old_code != (FX_DWORD) - 1) {\n                AddCode(old_code, last_char);\n            }\n            old_code = code;\n        } else if (code == 256) {\n            m_CodeLen = 9;\n            m_nCodes = 0;\n            old_code = (FX_DWORD) - 1;\n        } else if (code == 257) {\n            break;\n        } else {\n            if (old_code == (FX_DWORD) - 1) {\n                return 2;\n            }\n            m_StackLen = 0;\n            if (code >= m_nCodes + 258) {\n                if (m_StackLen < sizeof(m_DecodeStack)) {\n                    m_DecodeStack[m_StackLen++] = last_char;\n                }\n                DecodeString(old_code);\n            } else {\n                DecodeString(code);\n            }\n            if (m_OutPos + m_StackLen > dest_size) {\n                return -5;\n            }\n            if (m_pOutput) {\n                for (FX_DWORD i = 0; i < m_StackLen; i ++) {\n                    m_pOutput[m_OutPos + i] = m_DecodeStack[m_StackLen - i - 1];\n                }\n            }\n            m_OutPos += m_StackLen;\n            last_char = m_DecodeStack[m_StackLen - 1];\n            if (old_code < 256) {\n                AddCode(old_code, last_char);\n            } else if (old_code - 258 >= m_nCodes) {\n                dest_size = m_OutPos;\n                src_size = (m_InPos + 7) / 8;\n                return 0;\n            } else {\n                AddCode(old_code, last_char);\n            }\n            old_code = code;\n        }\n    }\n    dest_size = m_OutPos;\n    src_size = (m_InPos + 7) / 8;\n    return 0;\n}\nstatic FX_BYTE PaethPredictor(int a, int b, int c)\n{\n    int p = a + b - c;\n    int pa = FXSYS_abs(p - a);\n    int pb = FXSYS_abs(p - b);\n    int pc = FXSYS_abs(p - c);\n    if (pa <= pb && pa <= pc) {\n        return (FX_BYTE)a;\n    }\n    if (pb <= pc) {\n        return (FX_BYTE)b;\n    }\n    return (FX_BYTE)c;\n}\nstatic void PNG_PredictorEncode(FX_LPBYTE& data_buf, FX_DWORD& data_size, int predictor, int Colors, int BitsPerComponent, int Columns)\n{\n    int BytesPerPixel = (Colors * BitsPerComponent + 7) / 8;\n    int row_size = (Colors * BitsPerComponent * Columns + 7) / 8;\n    int row_count = (data_size + row_size - 1) / row_size;\n    int last_row_size = data_size % row_size;\n    FX_LPBYTE dest_buf = FX_Alloc( FX_BYTE, (row_size + 1) * row_count);\n    if (dest_buf == NULL) {\n        return;\n    }\n    int byte_cnt = 0;\n    FX_LPBYTE pSrcData = data_buf;\n    FX_LPBYTE pDestData = dest_buf;\n    for (int row = 0; row < row_count; row++) {\n        if (predictor == 10) {\n            pDestData[0] = 0;\n            int move_size = row_size;\n            if (move_size * (row + 1) > (int)data_size) {\n                move_size = data_size - (move_size * row);\n            }\n            FXSYS_memmove32(pDestData + 1, pSrcData, move_size);\n            pDestData += (move_size + 1);\n            pSrcData += move_size;\n            byte_cnt += move_size;\n            continue;\n        }\n        for (int byte = 0; byte < row_size && byte_cnt < (int)data_size; byte++) {\n            switch (predictor) {\n                case 11: {\n                        pDestData[0] = 1;\n                        FX_BYTE left = 0;\n                        if (byte >= BytesPerPixel) {\n                            left = pSrcData[byte - BytesPerPixel];\n                        }\n                        pDestData[byte + 1] = pSrcData[byte] - left;\n                    }\n                    break;\n                case 12: {\n                        pDestData[0] = 2;\n                        FX_BYTE up = 0;\n                        if (row) {\n                            up = pSrcData[byte - row_size];\n                        }\n                        pDestData[byte + 1] = pSrcData[byte] - up;\n                    }\n                    break;\n                case 13: {\n                        pDestData[0] = 3;\n                        FX_BYTE left = 0;\n                        if (byte >= BytesPerPixel) {\n                            left = pSrcData[byte - BytesPerPixel];\n                        }\n                        FX_BYTE up = 0;\n                        if (row) {\n                            up = pSrcData[byte - row_size];\n                        }\n                        pDestData[byte + 1] = pSrcData[byte] - (left + up) / 2;\n                    }\n                    break;\n                case 14: {\n                        pDestData[0] = 4;\n                        FX_BYTE left = 0;\n                        if (byte >= BytesPerPixel) {\n                            left = pSrcData[byte - BytesPerPixel];\n                        }\n                        FX_BYTE up = 0;\n                        if (row) {\n                            up = pSrcData[byte - row_size];\n                        }\n                        FX_BYTE upper_left = 0;\n                        if (byte >= BytesPerPixel && row) {\n                            upper_left = pSrcData[byte - row_size - BytesPerPixel];\n                        }\n                        pDestData[byte + 1] = pSrcData[byte] - PaethPredictor(left, up, upper_left);\n                    }\n                    break;\n                default: {\n                        pDestData[byte + 1] = pSrcData[byte];\n                    }\n                    break;\n            }\n            byte_cnt++;\n        }\n        pDestData += (row_size + 1);\n        pSrcData += row_size;\n    }\n    FX_Free(data_buf);\n    data_buf = dest_buf;\n    data_size = (row_size + 1) * row_count - (last_row_size > 0 ? (row_size - last_row_size) : 0);\n}\nstatic void PNG_PredictLine(FX_LPBYTE pDestData, FX_LPCBYTE pSrcData, FX_LPCBYTE pLastLine,\n                            int bpc, int nColors, int nPixels)\n{\n    int row_size = (nPixels * bpc * nColors + 7) / 8;\n    int BytesPerPixel = (bpc * nColors + 7) / 8;\n    FX_BYTE tag = pSrcData[0];\n    if (tag == 0) {\n        FXSYS_memmove32(pDestData, pSrcData + 1, row_size);\n        return;\n    }\n    for (int byte = 0; byte < row_size; byte ++) {\n        FX_BYTE raw_byte = pSrcData[byte + 1];\n        switch (tag) {\n            case 1:\t{\n                    FX_BYTE left = 0;\n                    if (byte >= BytesPerPixel) {\n                        left = pDestData[byte - BytesPerPixel];\n                    }\n                    pDestData[byte] = raw_byte + left;\n                    break;\n                }\n            case 2: {\n                    FX_BYTE up = 0;\n                    if (pLastLine) {\n                        up = pLastLine[byte];\n                    }\n                    pDestData[byte] = raw_byte + up;\n                    break;\n                }\n            case 3: {\n                    FX_BYTE left = 0;\n                    if (byte >= BytesPerPixel) {\n                        left = pDestData[byte - BytesPerPixel];\n                    }\n                    FX_BYTE up = 0;\n                    if (pLastLine) {\n                        up = pLastLine[byte];\n                    }\n                    pDestData[byte] = raw_byte + (up + left) / 2;\n                    break;\n                }\n            case 4: {\n                    FX_BYTE left = 0;\n                    if (byte >= BytesPerPixel) {\n                        left = pDestData[byte - BytesPerPixel];\n                    }\n                    FX_BYTE up = 0;\n                    if (pLastLine) {\n                        up = pLastLine[byte];\n                    }\n                    FX_BYTE upper_left = 0;\n                    if (byte >= BytesPerPixel && pLastLine) {\n                        upper_left = pLastLine[byte - BytesPerPixel];\n                    }\n                    pDestData[byte] = raw_byte + PaethPredictor(left, up, upper_left);\n                    break;\n                }\n            default:\n                pDestData[byte] = raw_byte;\n                break;\n        }\n    }\n}\nstatic void PNG_Predictor(FX_LPBYTE& data_buf, FX_DWORD& data_size,\n                          int Colors, int BitsPerComponent, int Columns)\n{\n    int BytesPerPixel = (Colors * BitsPerComponent + 7) / 8;\n    int row_size = (Colors * BitsPerComponent * Columns + 7) / 8;\n    int row_count = (data_size + row_size) / (row_size + 1);\n    int last_row_size = data_size % (row_size + 1);\n    FX_LPBYTE dest_buf = FX_Alloc( FX_BYTE, row_size * row_count);\n    if (dest_buf == NULL) {\n        return;\n    }\n    int byte_cnt = 0;\n    FX_LPBYTE pSrcData = data_buf;\n    FX_LPBYTE pDestData = dest_buf;\n    for (int row = 0; row < row_count; row ++) {\n        FX_BYTE tag = pSrcData[0];\n        if (tag == 0) {\n            int move_size = row_size;\n            if ((row + 1) * (move_size + 1) > (int)data_size) {\n                move_size = last_row_size - 1;\n            }\n            FXSYS_memmove32(pDestData, pSrcData + 1, move_size);\n            pSrcData += move_size + 1;\n            pDestData += move_size;\n            byte_cnt += move_size + 1;\n            continue;\n        }\n        for (int byte = 0; byte < row_size && byte_cnt < (int)data_size; byte ++) {\n            FX_BYTE raw_byte = pSrcData[byte + 1];\n            switch (tag) {\n                case 1:\t{\n                        FX_BYTE left = 0;\n                        if (byte >= BytesPerPixel) {\n                            left = pDestData[byte - BytesPerPixel];\n                        }\n                        pDestData[byte] = raw_byte + left;\n                        break;\n                    }\n                case 2: {\n                        FX_BYTE up = 0;\n                        if (row) {\n                            up = pDestData[byte - row_size];\n                        }\n                        pDestData[byte] = raw_byte + up;\n                        break;\n                    }\n                case 3: {\n                        FX_BYTE left = 0;\n                        if (byte >= BytesPerPixel) {\n                            left = pDestData[byte - BytesPerPixel];\n                        }\n                        FX_BYTE up = 0;\n                        if (row) {\n                            up = pDestData[byte - row_size];\n                        }\n                        pDestData[byte] = raw_byte + (up + left) / 2;\n                        break;\n                    }\n                case 4: {\n                        FX_BYTE left = 0;\n                        if (byte >= BytesPerPixel) {\n                            left = pDestData[byte - BytesPerPixel];\n                        }\n                        FX_BYTE up = 0;\n                        if (row) {\n                            up = pDestData[byte - row_size];\n                        }\n                        FX_BYTE upper_left = 0;\n                        if (byte >= BytesPerPixel && row) {\n                            upper_left = pDestData[byte - row_size - BytesPerPixel];\n                        }\n                        pDestData[byte] = raw_byte + PaethPredictor(left, up, upper_left);\n                        break;\n                    }\n                default:\n                    pDestData[byte] = raw_byte;\n                    break;\n            }\n            byte_cnt++;\n        }\n        pSrcData += row_size + 1;\n        pDestData += row_size;\n        byte_cnt++;\n    }\n    FX_Free(data_buf);\n    data_buf = dest_buf;\n    data_size = row_size * row_count - (last_row_size > 0 ? (row_size + 1 - last_row_size) : 0);\n}\nstatic void TIFF_PredictorEncodeLine(FX_LPBYTE dest_buf, int row_size, int BitsPerComponent, int Colors, int Columns)\n{\n    int BytesPerPixel = BitsPerComponent * Colors / 8;\n    if (BitsPerComponent < 8) {\n        FX_BYTE mask = 0x01;\n        if (BitsPerComponent == 2) {\n            mask = 0x03;\n        } else if (BitsPerComponent == 4) {\n            mask = 0x0F;\n        }\n        int row_bits = Colors * BitsPerComponent * Columns;\n        for (int i = row_bits - BitsPerComponent; i >= BitsPerComponent; i -= BitsPerComponent) {\n            int col = i % 8;\n            int index = i / 8;\n            int col_pre = (col == 0) ? (8 - BitsPerComponent) : (col - BitsPerComponent);\n            int index_pre = (col == 0) ? (index - 1) : index;\n            FX_BYTE cur = (dest_buf[index] >> (8 - col - BitsPerComponent)) & mask;\n            FX_BYTE left = (dest_buf[index_pre] >> (8 - col_pre - BitsPerComponent)) & mask;\n            cur -= left;\n            cur &= mask;\n            cur <<= (8 - col - BitsPerComponent);\n            dest_buf[index] &= ~(mask << ((8 - col - BitsPerComponent)));\n            dest_buf[index] |= cur;\n        }\n    } else if (BitsPerComponent == 8) {\n        for (int i = row_size - 1; i >= BytesPerPixel; i--) {\n            dest_buf[i] -= dest_buf[i - BytesPerPixel];\n        }\n    } else {\n        for (int i = row_size - BytesPerPixel; i >= BytesPerPixel; i -= BytesPerPixel) {\n            FX_WORD pixel = (dest_buf[i] << 8) | dest_buf[i + 1];\n            pixel -= (dest_buf[i - BytesPerPixel] << 8) | dest_buf[i - BytesPerPixel + 1];\n            dest_buf[i] = pixel >> 8;\n            dest_buf[i + 1] = (FX_BYTE)pixel;\n        }\n    }\n}\nstatic void TIFF_PredictorEncode(FX_LPBYTE& data_buf, FX_DWORD& data_size,\n                                 int Colors, int BitsPerComponent, int Columns)\n{\n    int row_size = (Colors * BitsPerComponent * Columns + 7) / 8;\n    int row_count = (data_size + row_size - 1) / row_size;\n    int last_row_size = data_size % row_size;\n    for (int row = 0; row < row_count; row++) {\n        FX_LPBYTE scan_line = data_buf + row * row_size;\n        if ((row + 1) * row_size > (int)data_size) {\n            row_size = last_row_size;\n        }\n        TIFF_PredictorEncodeLine(scan_line, row_size, BitsPerComponent, Colors, Columns);\n    }\n}\nstatic void TIFF_PredictLine(FX_LPBYTE dest_buf, int row_size, int BitsPerComponent, int Colors, int Columns)\n{\n    if (BitsPerComponent == 1) {\n        int row_bits = BitsPerComponent * Colors * Columns;\n        for(int i = 1; i < row_bits; i ++) {\n            int col = i % 8;\n            int index = i / 8;\n            int index_pre = (col == 0) ? (index - 1) : index;\n            int col_pre = (col == 0) ? 8 : col;\n            if( ((dest_buf[index] >> (7 - col)) & 1) ^ ((dest_buf[index_pre] >> (8 - col_pre)) & 1) ) {\n                dest_buf[index] |= 1 << (7 - col);\n            } else {\n                dest_buf[index] &= ~(1 << (7 - col));\n            }\n        }\n        return;\n    }\n    int BytesPerPixel = BitsPerComponent * Colors / 8;\n    if (BitsPerComponent == 16) {\n        for (int i = BytesPerPixel; i < row_size; i += 2) {\n            FX_WORD pixel = (dest_buf[i - BytesPerPixel] << 8) | dest_buf[i - BytesPerPixel + 1];\n            pixel += (dest_buf[i] << 8) | dest_buf[i + 1];\n            dest_buf[i] = pixel >> 8;\n            dest_buf[i + 1] = (FX_BYTE)pixel;\n        }\n    } else {\n        for (int i = BytesPerPixel; i < row_size; i ++) {\n            dest_buf[i] += dest_buf[i - BytesPerPixel];\n        }\n    }\n}\nstatic void TIFF_Predictor(FX_LPBYTE& data_buf, FX_DWORD& data_size,\n                           int Colors, int BitsPerComponent, int Columns)\n{\n    int row_size = (Colors * BitsPerComponent * Columns + 7) / 8;\n    int row_count = (data_size + row_size - 1) / row_size;\n    int last_row_size = data_size % row_size;\n    for (int row = 0; row < row_count; row ++) {\n        FX_LPBYTE scan_line = data_buf + row * row_size;\n        if ((row + 1) * row_size > (int)data_size) {\n            row_size = last_row_size;\n        }\n        TIFF_PredictLine(scan_line, row_size, BitsPerComponent, Colors, Columns);\n    }\n}\nclass CCodec_FlateScanlineDecoder : public CCodec_ScanlineDecoder\n{\npublic:\n    CCodec_FlateScanlineDecoder();\n    ~CCodec_FlateScanlineDecoder();\n    FX_BOOL\t\tCreate(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, int nComps, int bpc,\n                       int predictor, int Colors, int BitsPerComponent, int Columns);\n    virtual void\t\tDestroy()\n    {\n        delete this;\n    }\n    virtual void\t\tv_DownScale(int dest_width, int dest_height) {}\n    virtual FX_BOOL\t\tv_Rewind();\n    virtual FX_LPBYTE\tv_GetNextLine();\n    virtual FX_DWORD\tGetSrcOffset();\n    void*\t\t\t\tm_pFlate;\n    FX_LPCBYTE\t\t\tm_SrcBuf;\n    FX_DWORD\t\t\tm_SrcSize;\n    FX_LPBYTE\t\t\tm_pScanline;\n    FX_LPBYTE\t\t\tm_pLastLine;\n    FX_LPBYTE\t\t\tm_pPredictBuffer;\n    FX_LPBYTE\t\t\tm_pPredictRaw;\n    int\t\t\t\t\tm_Predictor;\n    int\t\t\t\t\tm_Colors, m_BitsPerComponent, m_Columns, m_PredictPitch, m_LeftOver;\n};\nCCodec_FlateScanlineDecoder::CCodec_FlateScanlineDecoder()\n{\n    m_pFlate = NULL;\n    m_pScanline = NULL;\n    m_pLastLine = NULL;\n    m_pPredictBuffer = NULL;\n    m_pPredictRaw = NULL;\n    m_LeftOver = 0;\n}\nCCodec_FlateScanlineDecoder::~CCodec_FlateScanlineDecoder()\n{\n    if (m_pScanline) {\n        FX_Free(m_pScanline);\n    }\n    if (m_pLastLine) {\n        FX_Free(m_pLastLine);\n    }\n    if (m_pPredictBuffer) {\n        FX_Free(m_pPredictBuffer);\n    }\n    if (m_pPredictRaw) {\n        FX_Free(m_pPredictRaw);\n    }\n    if (m_pFlate) {\n        FPDFAPI_FlateEnd(m_pFlate);\n    }\n}\nFX_BOOL CCodec_FlateScanlineDecoder::Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,\n        int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, int Columns)\n{\n    m_SrcBuf = src_buf;\n    m_SrcSize = src_size;\n    m_OutputWidth = m_OrigWidth = width;\n    m_OutputHeight = m_OrigHeight = height;\n    m_nComps = nComps;\n    m_bpc = bpc;\n    m_bColorTransformed = FALSE;\n    m_Pitch = (width * nComps * bpc + 7) / 8;\n    m_pScanline = FX_Alloc(FX_BYTE, m_Pitch);\n    if (m_pScanline == NULL) {\n        return FALSE;\n    }\n    m_Predictor = 0;\n    if (predictor) {\n        if (predictor >= 10) {\n            m_Predictor = 2;\n        } else if (predictor == 2) {\n            m_Predictor = 1;\n        }\n        if (m_Predictor) {\n            if (BitsPerComponent * Colors * Columns == 0) {\n                BitsPerComponent = m_bpc;\n                Colors = m_nComps;\n                Columns = m_OrigWidth;\n            }\n            m_Colors = Colors;\n            m_BitsPerComponent = BitsPerComponent;\n            m_Columns = Columns;\n            m_PredictPitch = (m_BitsPerComponent * m_Colors * m_Columns + 7) / 8;\n            m_pLastLine = FX_Alloc(FX_BYTE, m_PredictPitch);\n            if (m_pLastLine == NULL) {\n                return FALSE;\n            }\n            m_pPredictRaw = FX_Alloc(FX_BYTE, m_PredictPitch + 1);\n            if (m_pPredictRaw == NULL) {\n                return FALSE;\n            }\n            m_pPredictBuffer = FX_Alloc(FX_BYTE, m_PredictPitch);\n            if (m_pPredictBuffer == NULL) {\n                return FALSE;\n            }\n        }\n    }\n    return TRUE;\n}\nFX_BOOL CCodec_FlateScanlineDecoder::v_Rewind()\n{\n    if (m_pFlate) {\n        FPDFAPI_FlateEnd(m_pFlate);\n    }\n    m_pFlate = FPDFAPI_FlateInit(my_alloc_func, my_free_func);\n    if (m_pFlate == NULL) {\n        return FALSE;\n    }\n    FPDFAPI_FlateInput(m_pFlate, m_SrcBuf, m_SrcSize);\n    m_LeftOver = 0;\n    return TRUE;\n}\nFX_LPBYTE CCodec_FlateScanlineDecoder::v_GetNextLine()\n{\n    if (m_Predictor) {\n        if (m_Pitch == m_PredictPitch) {\n            if (m_Predictor == 2) {\n                FPDFAPI_FlateOutput(m_pFlate, m_pPredictRaw, m_PredictPitch + 1);\n                PNG_PredictLine(m_pScanline, m_pPredictRaw, m_pLastLine, m_BitsPerComponent, m_Colors, m_Columns);\n                FXSYS_memcpy32(m_pLastLine, m_pScanline, m_PredictPitch);\n            } else {\n                FPDFAPI_FlateOutput(m_pFlate, m_pScanline, m_Pitch);\n                TIFF_PredictLine(m_pScanline, m_PredictPitch, m_bpc, m_nComps, m_OutputWidth);\n            }\n        } else {\n            int bytes_to_go = m_Pitch;\n            int read_leftover = m_LeftOver > bytes_to_go ? bytes_to_go : m_LeftOver;\n            if (read_leftover) {\n                FXSYS_memcpy32(m_pScanline, m_pPredictBuffer + m_PredictPitch - m_LeftOver, read_leftover);\n                m_LeftOver -= read_leftover;\n                bytes_to_go -= read_leftover;\n            }\n            while (bytes_to_go) {\n                if (m_Predictor == 2) {\n                    FPDFAPI_FlateOutput(m_pFlate, m_pPredictRaw, m_PredictPitch + 1);\n                    PNG_PredictLine(m_pPredictBuffer, m_pPredictRaw, m_pLastLine, m_BitsPerComponent, m_Colors, m_Columns);\n                    FXSYS_memcpy32(m_pLastLine, m_pPredictBuffer, m_PredictPitch);\n                } else {\n                    FPDFAPI_FlateOutput(m_pFlate, m_pPredictBuffer, m_PredictPitch);\n                    TIFF_PredictLine(m_pPredictBuffer, m_PredictPitch, m_BitsPerComponent, m_Colors, m_Columns);\n                }\n                int read_bytes = m_PredictPitch > bytes_to_go ? bytes_to_go : m_PredictPitch;\n                FXSYS_memcpy32(m_pScanline + m_Pitch - bytes_to_go, m_pPredictBuffer, read_bytes);\n                m_LeftOver += m_PredictPitch - read_bytes;\n                bytes_to_go -= read_bytes;\n            }\n        }\n    } else {\n        FPDFAPI_FlateOutput(m_pFlate, m_pScanline, m_Pitch);\n    }\n    return m_pScanline;\n}\nFX_DWORD CCodec_FlateScanlineDecoder::GetSrcOffset()\n{\n    return FPDFAPI_FlateGetTotalIn(m_pFlate);\n}\nstatic void FlateUncompress(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_DWORD orig_size,\n                            FX_LPBYTE& dest_buf, FX_DWORD& dest_size, FX_DWORD& offset)\n{\n    FX_DWORD guess_size = orig_size ? orig_size : src_size * 2;\n    FX_DWORD alloc_step = orig_size ? 10240 : (src_size < 10240 ? 10240 : src_size);\n    static const FX_DWORD kMaxInitialAllocSize = 10000000;\n    if (guess_size > kMaxInitialAllocSize) {\n        guess_size = kMaxInitialAllocSize;\n        alloc_step = kMaxInitialAllocSize;\n    }\n    FX_LPBYTE guess_buf = FX_Alloc(FX_BYTE, guess_size + 1);\n    if (!guess_buf) {\n        dest_buf = NULL;\n        dest_size = 0;\n        return;\n    }\n    guess_buf[guess_size] = '\\0';\n    FX_BOOL useOldImpl = src_size < 10240;\n    void* context = FPDFAPI_FlateInit(my_alloc_func, my_free_func);\n    if (context == NULL) {\n        dest_buf = NULL;\n        dest_size = 0;\n        return ;\n    }\n    FPDFAPI_FlateInput(context, src_buf, src_size);\n    CFX_ArrayTemplate<FX_LPBYTE> result_tmp_bufs;\n    FX_LPBYTE buf = guess_buf;\n    FX_DWORD buf_size = guess_size;\n    FX_DWORD last_buf_size = buf_size;\n    while (1) {\n        FX_INT32 ret = FPDFAPI_FlateOutput(context, buf, buf_size);\n        FX_INT32 avail_buf_size = FPDFAPI_FlateGetAvailOut(context);\n        if (!useOldImpl) {\n            if (ret != Z_OK) {\n                last_buf_size = buf_size - avail_buf_size;\n                result_tmp_bufs.Add(buf);\n                break;\n            }\n            if (avail_buf_size == 0) {\n                result_tmp_bufs.Add(buf);\n                buf = NULL;\n                buf = FX_Alloc(FX_BYTE, buf_size + 1);\n                if (!buf) {\n                    dest_buf = NULL;\n                    dest_size = 0;\n                    return;\n                }\n                buf[buf_size] = '\\0';\n            } else {\n                last_buf_size = buf_size - avail_buf_size;\n                result_tmp_bufs.Add(buf);\n                buf = NULL;\n                break;\n            }\n        } else {\n            if (ret != Z_OK) {\n                break;\n            }\n            if (avail_buf_size == 0) {\n                FX_DWORD old_size = guess_size;\n                guess_size += alloc_step;\n                if (guess_size < old_size || guess_size + 1 < guess_size) {\n                    dest_buf = NULL;\n                    dest_size = 0;\n                    return;\n                }\n                guess_buf = FX_Realloc(FX_BYTE, guess_buf, guess_size + 1);\n                if (!guess_buf) {\n                    dest_buf = NULL;\n                    dest_size = 0;\n                    return;\n                }\n                guess_buf[guess_size] = '\\0';\n                buf = guess_buf + old_size;\n                buf_size = guess_size - old_size;\n            } else {\n                break;\n            }\n        }\n    }\n    dest_size = FPDFAPI_FlateGetTotalOut(context);\n    offset = FPDFAPI_FlateGetTotalIn(context);\n    if (!useOldImpl) {\n        if (result_tmp_bufs.GetSize() == 1) {\n            dest_buf = result_tmp_bufs[0];\n        } else {\n            FX_LPBYTE result_buf = FX_Alloc(FX_BYTE, dest_size);\n            if (!result_buf) {\n                dest_buf = NULL;\n                dest_size = 0;\n                return;\n            }\n            FX_DWORD result_pos = 0;\n            for (FX_INT32 i = 0; i < result_tmp_bufs.GetSize(); i++) {\n                FX_LPBYTE tmp_buf = result_tmp_bufs[i];\n                FX_DWORD tmp_buf_size = buf_size;\n                if (i == result_tmp_bufs.GetSize() - 1) {\n                    tmp_buf_size = last_buf_size;\n                }\n                FXSYS_memcpy32(result_buf + result_pos, tmp_buf, tmp_buf_size);\n                result_pos += tmp_buf_size;\n                FX_Free(tmp_buf);\n                tmp_buf = NULL;\n                result_tmp_bufs[i] = NULL;\n            }\n            dest_buf = result_buf;\n        }\n    } else {\n        if (guess_size / 2 > dest_size) {\n            guess_buf = FX_Realloc(FX_BYTE, guess_buf, dest_size + 1);\n            if (!guess_buf) {\n                dest_buf = NULL;\n                dest_size = 0;\n                return;\n            }\n            guess_size = dest_size;\n            guess_buf[guess_size] = '\\0';\n        }\n        dest_buf = guess_buf;\n    }\n    FPDFAPI_FlateEnd(context);\n    context = NULL;\n}\nICodec_ScanlineDecoder*\tCCodec_FlateModule::CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,\n        int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, int Columns)\n{\n    CCodec_FlateScanlineDecoder* pDecoder = FX_NEW CCodec_FlateScanlineDecoder;\n    if (pDecoder == NULL) {\n        return NULL;\n    }\n    pDecoder->Create(src_buf, src_size, width, height, nComps, bpc, predictor, Colors, BitsPerComponent, Columns);\n    return pDecoder;\n}\nFX_DWORD CCodec_FlateModule::FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, FX_BOOL bEarlyChange,\n        int predictor, int Colors, int BitsPerComponent, int Columns,\n        FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)\n{\n    CLZWDecoder* pDecoder = NULL;\n    dest_buf = NULL;\n    FX_DWORD offset = 0;\n    int predictor_type = 0;\n    if (predictor) {\n        if (predictor >= 10) {\n            predictor_type = 2;\n        } else if (predictor == 2) {\n            predictor_type = 1;\n        }\n    }\n    if (bLZW) {\n        pDecoder = FX_NEW CLZWDecoder;\n        if (pDecoder == NULL) {\n            return -1;\n        }\n        dest_size = (FX_DWORD) - 1;\n        offset = src_size;\n        int err = pDecoder->Decode(NULL, dest_size, src_buf, offset, bEarlyChange);\n        delete pDecoder;\n        if (err || dest_size == 0 || dest_size + 1 < dest_size) {\n            return (FX_DWORD) - 1;\n        }\n        pDecoder = FX_NEW CLZWDecoder;\n        if (pDecoder == NULL) {\n            return -1;\n        }\n        dest_buf = FX_Alloc( FX_BYTE, dest_size + 1);\n        if (dest_buf == NULL) {\n            return -1;\n        }\n        dest_buf[dest_size] = '\\0';\n        pDecoder->Decode(dest_buf, dest_size, src_buf, offset, bEarlyChange);\n        delete pDecoder;\n    } else {\n        FlateUncompress(src_buf, src_size, estimated_size, dest_buf, dest_size, offset);\n    }\n    if (predictor_type == 0) {\n        return offset;\n    }\n    if (predictor_type == 2) {\n        PNG_Predictor(dest_buf, dest_size, Colors, BitsPerComponent, Columns);\n    } else if (predictor_type == 1) {\n        TIFF_Predictor(dest_buf, dest_size, Colors, BitsPerComponent, Columns);\n    }\n    return offset;\n}\nFX_BOOL CCodec_FlateModule::Encode(const FX_BYTE* src_buf, FX_DWORD src_size,\n                                   int predictor, int Colors, int BitsPerComponent, int Columns,\n                                   FX_LPBYTE& dest_buf, FX_DWORD& dest_size)\n{\n    if (predictor != 2 && predictor < 10) {\n        return Encode(src_buf, src_size, dest_buf, dest_size);\n    }\n    FX_BOOL ret = FALSE;\n    FX_LPBYTE pSrcBuf = NULL;\n    pSrcBuf = FX_Alloc(FX_BYTE, src_size);\n    if (pSrcBuf == NULL) {\n        return FALSE;\n    }\n    FXSYS_memcpy32(pSrcBuf, src_buf, src_size);\n    if (predictor == 2) {\n        TIFF_PredictorEncode(pSrcBuf, src_size, Colors, BitsPerComponent, Columns);\n    } else if (predictor >= 10) {\n        PNG_PredictorEncode(pSrcBuf, src_size, predictor, Colors, BitsPerComponent, Columns);\n    }\n    ret = Encode(pSrcBuf, src_size, dest_buf, dest_size);\n    FX_Free(pSrcBuf);\n    return ret;\n}\nFX_BOOL CCodec_FlateModule::Encode(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)\n{\n    dest_size = src_size + src_size / 1000 + 12;\n    dest_buf = FX_Alloc( FX_BYTE, dest_size);\n    if (dest_buf == NULL) {\n        return FALSE;\n    }\n    unsigned long temp_size = dest_size;\n    FPDFAPI_FlateCompress(dest_buf, &temp_size, src_buf, src_size);\n    dest_size = (FX_DWORD)temp_size;\n    return TRUE;\n}\n"
  },
  {
    "path": "core/src/fxcodec/codec/fx_codec_icc.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxcodec/fx_codec.h\"\n#include \"codec_int.h\"\n#include \"../lcms2/include/fx_lcms2.h\"\nFX_BOOL MD5ComputeID( FX_LPCVOID buf, FX_DWORD dwSize, FX_BYTE ID[16] )\n{\n    return cmsMD5computeIDExt(buf, dwSize, ID);\n}\nstruct CLcmsCmm : public CFX_Object {\n    cmsHTRANSFORM m_hTransform;\n    int\t\t\tm_nSrcComponents;\n    int\t\t\tm_nDstComponents;\n    FX_BOOL\t\tm_bLab;\n};\nextern \"C\" {\n    int ourHandler(int ErrorCode, const char *ErrorText)\n    {\n        return TRUE;\n    }\n};\nFX_BOOL CheckComponents(cmsColorSpaceSignature cs, int nComponents, FX_BOOL bDst)\n{\n    if (nComponents <= 0 || nComponents > 15) {\n        return FALSE;\n    }\n    switch(cs) {\n        case cmsSigLabData:\n            if (nComponents < 3) {\n                return FALSE;\n            }\n            break;\n        case cmsSigGrayData:\n            if (bDst && nComponents != 1) {\n                return FALSE;\n            } else if (!bDst && nComponents > 2) {\n                return FALSE;\n            }\n            break;\n        case cmsSigRgbData:\n            if (bDst && nComponents != 3) {\n                return FALSE;\n            }\n            break;\n        case cmsSigCmykData:\n            if (bDst && nComponents != 4) {\n                return FALSE;\n            }\n            break;\n        default:\n            if (nComponents != 3) {\n                return FALSE;\n            }\n            break;\n    }\n    return TRUE;\n}\nvoid* IccLib_CreateTransform(const unsigned char* pSrcProfileData, unsigned int dwSrcProfileSize, int nSrcComponents,\n                             const unsigned char* pDstProfileData, unsigned int dwDstProfileSize, int nDstComponents,\n                             int intent, FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT, FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT)\n{\n    cmsHPROFILE srcProfile = NULL;\n    cmsHPROFILE dstProfile = NULL;\n    cmsHTRANSFORM hTransform = NULL;\n    CLcmsCmm* pCmm = NULL;\n    srcProfile = cmsOpenProfileFromMem((void*)pSrcProfileData, dwSrcProfileSize);\n    if (srcProfile == NULL) {\n        return NULL;\n    }\n    if(pDstProfileData == NULL && dwDstProfileSize == 0 && nDstComponents == 3) {\n        dstProfile = cmsCreate_sRGBProfile();\n    } else {\n        dstProfile = cmsOpenProfileFromMem((void*)pDstProfileData, dwDstProfileSize);\n    }\n    if (dstProfile == NULL) {\n        cmsCloseProfile(srcProfile);\n        return NULL;\n    }\n    int srcFormat;\n    FX_BOOL bLab = FALSE;\n    cmsColorSpaceSignature srcCS = cmsGetColorSpace(srcProfile);\n    if (!CheckComponents(srcCS, nSrcComponents, FALSE)) {\n        cmsCloseProfile(srcProfile);\n        cmsCloseProfile(dstProfile);\n        return NULL;\n    }\n    if (srcCS == cmsSigLabData) {\n        srcFormat = COLORSPACE_SH(PT_Lab) | CHANNELS_SH(nSrcComponents) | BYTES_SH(0);\n        bLab = TRUE;\n    } else {\n        srcFormat = COLORSPACE_SH(PT_ANY) | CHANNELS_SH(nSrcComponents) | BYTES_SH(1);\n        if (srcCS == cmsSigRgbData && T_DOSWAP(dwSrcFormat)) {\n            srcFormat |= DOSWAP_SH(1);\n        }\n    }\n    cmsColorSpaceSignature dstCS = cmsGetColorSpace(dstProfile);\n    if (!CheckComponents(dstCS, nDstComponents, TRUE)) {\n        cmsCloseProfile(srcProfile);\n        cmsCloseProfile(dstProfile);\n        return NULL;\n    }\n    switch(dstCS) {\n        case cmsSigGrayData:\n            hTransform = cmsCreateTransform(srcProfile, srcFormat, dstProfile, TYPE_GRAY_8, intent, 0);\n            break;\n        case cmsSigRgbData:\n            hTransform = cmsCreateTransform(srcProfile, srcFormat, dstProfile, TYPE_BGR_8, intent, 0);\n            break;\n        case cmsSigCmykData:\n            hTransform = cmsCreateTransform(srcProfile, srcFormat, dstProfile,\n                                            T_DOSWAP(dwDstFormat) ? TYPE_KYMC_8 : TYPE_CMYK_8,\n                                            intent, 0);\n            break;\n        default:\n            break;\n    }\n    if (hTransform == NULL) {\n        cmsCloseProfile(srcProfile);\n        cmsCloseProfile(dstProfile);\n        return NULL;\n    }\n    pCmm = FX_NEW CLcmsCmm;\n    if (pCmm == NULL) {\n        return NULL;\n    }\n    pCmm->m_nSrcComponents = nSrcComponents;\n    pCmm->m_nDstComponents = nDstComponents;\n    pCmm->m_hTransform = hTransform;\n    pCmm->m_bLab = bLab;\n    cmsCloseProfile(srcProfile);\n    cmsCloseProfile(dstProfile);\n    return pCmm;\n}\nvoid* IccLib_CreateTransform_sRGB(const unsigned char* pProfileData, unsigned int dwProfileSize, int nComponents, int intent, FX_DWORD dwSrcFormat)\n{\n    return IccLib_CreateTransform(pProfileData, dwProfileSize, nComponents, NULL, 0, 3, intent, dwSrcFormat);\n}\nvoid IccLib_DestroyTransform(void* pTransform)\n{\n    if (pTransform == NULL) {\n        return;\n    }\n    cmsDeleteTransform(((CLcmsCmm*)pTransform)->m_hTransform);\n    delete (CLcmsCmm*)pTransform;\n}\nvoid IccLib_Translate(void* pTransform, FX_DWORD nSrcComponents, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues)\n{\n    if (pTransform == NULL) {\n        return;\n    }\n    CLcmsCmm* p = (CLcmsCmm*)pTransform;\n    FX_BYTE output[4];\n    if (p->m_bLab) {\n        CFX_FixedBufGrow<double, 16> inputs(nSrcComponents);\n        double* input = inputs;\n        for (FX_DWORD i = 0; i < nSrcComponents; i ++) {\n            input[i] = pSrcValues[i];\n        }\n        cmsDoTransform(p->m_hTransform, input, output, 1);\n    } else {\n        CFX_FixedBufGrow<FX_BYTE, 16> inputs(nSrcComponents);\n        FX_BYTE* input = inputs;\n        for (FX_DWORD i = 0; i < nSrcComponents; i ++) {\n            if (pSrcValues[i] > 1.0f) {\n                input[i] = 255;\n            } else if (pSrcValues[i] < 0) {\n                input[i] = 0;\n            } else {\n                input[i] = (int)(pSrcValues[i] * 255.0f);\n            }\n        }\n        cmsDoTransform(p->m_hTransform, input, output, 1);\n    }\n    switch(p->m_nDstComponents) {\n        case 1:\n            pDestValues[0] = output[0] / 255.0f;\n            break;\n        case 3:\n            pDestValues[0] = output[2] / 255.0f;\n            pDestValues[1] = output[1] / 255.0f;\n            pDestValues[2] = output[0] / 255.0f;\n            break;\n        case 4:\n            pDestValues[0] = output[0] / 255.0f;\n            pDestValues[1] = output[1] / 255.0f;\n            pDestValues[2] = output[2] / 255.0f;\n            pDestValues[3] = output[3] / 255.0f;\n            break;\n    }\n}\nvoid IccLib_TranslateImage(void* pTransform, unsigned char* pDest, const unsigned char* pSrc, int pixels)\n{\n    cmsDoTransform(((CLcmsCmm*)pTransform)->m_hTransform, (void*)pSrc, pDest, pixels);\n}\nFX_LPVOID CreateProfile_Gray(double gamma)\n{\n    cmsCIExyY* D50 = (cmsCIExyY*)cmsD50_xyY();\n    if (!cmsWhitePointFromTemp(D50, 6504)) {\n        return NULL;\n    }\n    cmsToneCurve* curve = cmsBuildGamma(NULL, gamma);\n    if (curve == NULL)\t{\n        return NULL;\n    }\n    FX_LPVOID profile = cmsCreateGrayProfile(D50, curve);\n    cmsFreeToneCurve(curve);\n    return profile;\n}\nICodec_IccModule::IccCS GetProfileCSFromHandle(FX_LPVOID pProfile)\n{\n    if (pProfile == NULL)\t{\n        return ICodec_IccModule::IccCS_Unknown;\n    }\n    switch (cmsGetColorSpace(pProfile)) {\n        case cmsSigXYZData:\n            return ICodec_IccModule::IccCS_XYZ;\n        case cmsSigLabData:\n            return ICodec_IccModule::IccCS_Lab;\n        case cmsSigLuvData:\n            return ICodec_IccModule::IccCS_Luv;\n        case cmsSigYCbCrData:\n            return ICodec_IccModule::IccCS_YCbCr;\n        case cmsSigYxyData:\n            return ICodec_IccModule::IccCS_Yxy;\n        case cmsSigRgbData:\n            return ICodec_IccModule::IccCS_Rgb;\n        case cmsSigGrayData:\n            return ICodec_IccModule::IccCS_Gray;\n        case cmsSigHsvData:\n            return ICodec_IccModule::IccCS_Hsv;\n        case cmsSigHlsData:\n            return ICodec_IccModule::IccCS_Hls;\n        case cmsSigCmykData:\n            return ICodec_IccModule::IccCS_Cmyk;\n        case cmsSigCmyData:\n            return ICodec_IccModule::IccCS_Cmy;\n        default:\n            return ICodec_IccModule::IccCS_Unknown;\n    }\n}\nICodec_IccModule::IccCS CCodec_IccModule::GetProfileCS(FX_LPCBYTE pProfileData, unsigned int dwProfileSize)\n{\n    ICodec_IccModule::IccCS cs;\n    cmsHPROFILE hProfile = cmsOpenProfileFromMem((void*)pProfileData, dwProfileSize);\n    if (hProfile == NULL) {\n        return IccCS_Unknown;\n    }\n    cs = GetProfileCSFromHandle(hProfile);\n    if (hProfile)\t{\n        cmsCloseProfile(hProfile);\n    }\n    return cs;\n}\nICodec_IccModule::IccCS CCodec_IccModule::GetProfileCS(IFX_FileRead* pFile)\n{\n    if (pFile == NULL) {\n        return IccCS_Unknown;\n    }\n    ICodec_IccModule::IccCS cs;\n    FX_DWORD dwSize = (FX_DWORD)pFile->GetSize();\n    FX_LPBYTE pBuf = FX_Alloc(FX_BYTE, dwSize);\n    if (pBuf == NULL) {\n        return IccCS_Unknown;\n    }\n    pFile->ReadBlock(pBuf, 0, dwSize);\n    cs = GetProfileCS(pBuf, dwSize);\n    FX_Free(pBuf);\n    return cs;\n}\nFX_DWORD TransferProfileType(FX_LPVOID pProfile, FX_DWORD dwFormat)\n{\n    cmsColorSpaceSignature cs = cmsGetColorSpace(pProfile);\n    switch (cs) {\n        case cmsSigXYZData:\n            return TYPE_XYZ_16;\n        case cmsSigLabData:\n            return TYPE_Lab_DBL;\n        case cmsSigLuvData:\n            return TYPE_YUV_8;\n        case cmsSigYCbCrData:\n            return TYPE_YCbCr_8;\n        case cmsSigYxyData:\n            return TYPE_Yxy_16;\n        case cmsSigRgbData:\n            return T_DOSWAP(dwFormat) ? TYPE_RGB_8 : TYPE_BGR_8;\n        case cmsSigGrayData:\n            return TYPE_GRAY_8;\n        case cmsSigHsvData:\n            return TYPE_HSV_8;\n        case cmsSigHlsData:\n            return TYPE_HLS_8;\n        case cmsSigCmykData:\n            return T_DOSWAP(dwFormat) ? TYPE_KYMC_8 : TYPE_CMYK_8;\n        case cmsSigCmyData:\n            return TYPE_CMY_8;\n        case cmsSigMCH5Data:\n            return T_DOSWAP(dwFormat) ? TYPE_KYMC5_8 : TYPE_CMYK5_8;\n        case cmsSigMCH6Data:\n            return TYPE_CMYK6_8;\n        case cmsSigMCH7Data:\n            return T_DOSWAP(dwFormat) ? TYPE_KYMC7_8 : TYPE_CMYK7_8;\n        case cmsSigMCH8Data:\n            return T_DOSWAP(dwFormat) ? TYPE_KYMC8_8 : TYPE_CMYK8_8;\n        case cmsSigMCH9Data:\n            return T_DOSWAP(dwFormat) ? TYPE_KYMC9_8 : TYPE_CMYK9_8;\n        case cmsSigMCHAData:\n            return T_DOSWAP(dwFormat) ? TYPE_KYMC10_8 : TYPE_CMYK10_8;\n        case cmsSigMCHBData:\n            return T_DOSWAP(dwFormat) ? TYPE_KYMC11_8 : TYPE_CMYK11_8;\n        case cmsSigMCHCData:\n            return T_DOSWAP(dwFormat) ? TYPE_KYMC12_8 : TYPE_CMYK12_8;\n        default:\n            return 0;\n    }\n}\nclass CFX_IccProfileCache : public CFX_Object\n{\npublic:\n    CFX_IccProfileCache();\n    ~CFX_IccProfileCache();\n    FX_LPVOID m_pProfile;\n    FX_DWORD\tm_dwRate;\nprotected:\n    void\tPurge();\n};\nCFX_IccProfileCache::CFX_IccProfileCache()\n{\n    m_pProfile = NULL;\n    m_dwRate = 1;\n}\nCFX_IccProfileCache::~CFX_IccProfileCache()\n{\n    if (m_pProfile) {\n        cmsCloseProfile(m_pProfile);\n    }\n}\nvoid CFX_IccProfileCache::Purge()\n{\n}\nclass CFX_IccTransformCache : public CFX_Object\n{\npublic:\n    CFX_IccTransformCache(CLcmsCmm* pCmm = NULL);\n    ~CFX_IccTransformCache();\n    FX_LPVOID\tm_pIccTransform;\n    FX_DWORD\t\tm_dwRate;\n    CLcmsCmm*\t\tm_pCmm;\nprotected:\n    void\t\t\tPurge();\n};\nCFX_IccTransformCache::CFX_IccTransformCache(CLcmsCmm* pCmm)\n{\n    m_pIccTransform = NULL;\n    m_dwRate = 1;\n    m_pCmm = pCmm;\n}\nCFX_IccTransformCache::~CFX_IccTransformCache()\n{\n    if (m_pIccTransform) {\n        cmsDeleteTransform(m_pIccTransform);\n    }\n    if (m_pCmm) {\n        FX_Free(m_pCmm);\n    }\n}\nvoid CFX_IccTransformCache::Purge()\n{\n}\nclass CFX_ByteStringKey : public CFX_BinaryBuf\n{\npublic:\n    CFX_ByteStringKey() : CFX_BinaryBuf() {}\n    CFX_ByteStringKey&\t\toperator << (FX_DWORD i);\n};\nCFX_ByteStringKey& CFX_ByteStringKey::operator << (FX_DWORD i)\n{\n    AppendBlock(&i, sizeof(FX_DWORD));\n    return *this;\n}\nFX_LPVOID CCodec_IccModule::CreateProfile(ICodec_IccModule::IccParam* pIccParam, Icc_CLASS ic, CFX_BinaryBuf* pTransformKey)\n{\n    CFX_IccProfileCache* pCache = NULL;\n    CFX_ByteStringKey key;\n    CFX_ByteString text;\n    key << pIccParam->ColorSpace << (pIccParam->dwProfileType | ic << 8);\n    FX_BYTE ID[16];\n    switch (pIccParam->dwProfileType) {\n        case Icc_PARAMTYPE_NONE:\n            return NULL;\n        case Icc_PARAMTYPE_BUFFER:\n            MD5ComputeID(pIccParam->pProfileData, pIccParam->dwProfileSize, ID);\n            break;\n        case Icc_PARAMTYPE_PARAM:\n            FXSYS_memset32(ID, 0, 16);\n            switch (pIccParam->ColorSpace) {\n                case IccCS_Gray:\n                    text.Format(\"%lf\", pIccParam->Gamma);\n                    break;\n                default:\n                    ;\n            }\n            MD5ComputeID(text.GetBuffer(0), text.GetLength(), ID);\n            break;\n        default:\n            ;\n    }\n    key.AppendBlock(ID, 16);\n    CFX_ByteString ProfileKey(key.GetBuffer(), key.GetSize());\n    ASSERT(pTransformKey);\n    pTransformKey->AppendBlock(ProfileKey.GetBuffer(0), ProfileKey.GetLength());\n    if (!m_MapProfile.Lookup(ProfileKey, (FX_LPVOID&)pCache)) {\n        pCache = FX_NEW CFX_IccProfileCache;\n        if (pCache == NULL) {\n            return NULL;\n        }\n        switch (pIccParam->dwProfileType) {\n            case Icc_PARAMTYPE_BUFFER:\n                pCache->m_pProfile = cmsOpenProfileFromMem(pIccParam->pProfileData, pIccParam->dwProfileSize);\n                break;\n            case Icc_PARAMTYPE_PARAM:\n                switch (pIccParam->ColorSpace) {\n                    case IccCS_Rgb:\n                        pCache->m_pProfile = cmsCreate_sRGBProfile();\n                        break;\n                    case IccCS_Gray:\n                        pCache->m_pProfile = CreateProfile_Gray(pIccParam->Gamma);\n                        break;\n                    default:\n                        break;\n                }\n                break;\n            default:\n                break;\n        }\n        m_MapProfile.SetAt(ProfileKey, pCache);\n    } else {\n        pCache->m_dwRate++;\n    }\n    return pCache->m_pProfile;\n}\nFX_LPVOID CCodec_IccModule::CreateTransform(ICodec_IccModule::IccParam* pInputParam,\n        ICodec_IccModule::IccParam* pOutputParam,\n        ICodec_IccModule::IccParam* pProofParam,\n        FX_DWORD dwIntent, FX_DWORD dwFlag, FX_DWORD dwPrfIntent, FX_DWORD dwPrfFlag)\n{\n    CLcmsCmm* pCmm = NULL;\n    ASSERT(pInputParam && pOutputParam);\n    CFX_ByteStringKey key;\n    FX_LPVOID pInputProfile = CreateProfile(pInputParam, Icc_CLASS_INPUT, &key);\n    if (pInputProfile == NULL)\t{\n        return NULL;\n    }\n    FX_LPVOID pOutputProfile = CreateProfile(pOutputParam, Icc_CLASS_OUTPUT, &key);\n    if (pOutputProfile == NULL)\t{\n        return NULL;\n    }\n    FX_DWORD dwInputProfileType = TransferProfileType(pInputProfile, pInputParam->dwFormat);\n    FX_DWORD dwOutputProfileType = TransferProfileType(pOutputProfile, pOutputParam->dwFormat);\n    if (dwInputProfileType == 0 || dwOutputProfileType == 0) {\n        return NULL;\n    }\n    FX_LPVOID pProofProfile = NULL;\n    if (pProofParam) {\n        pProofProfile = CreateProfile(pProofParam, Icc_CLASS_PROOF, &key);\n    }\n    key << dwInputProfileType << dwOutputProfileType << dwIntent << dwFlag << (pProofProfile != NULL) << dwPrfIntent << dwPrfFlag;\n    CFX_ByteStringC TransformKey(key.GetBuffer(), key.GetSize());\n    CFX_IccTransformCache* pTransformCache;\n    if (!m_MapTranform.Lookup(TransformKey, (FX_LPVOID&)pTransformCache)) {\n        pCmm = FX_Alloc(CLcmsCmm, 1);\n        if (pCmm == NULL) {\n            return NULL;\n        }\n        pCmm->m_nSrcComponents = T_CHANNELS(dwInputProfileType);\n        pCmm->m_nDstComponents = T_CHANNELS(dwOutputProfileType);\n        pCmm->m_bLab = T_COLORSPACE(pInputParam->dwFormat) == PT_Lab;\n        pTransformCache = FX_NEW CFX_IccTransformCache(pCmm);\n        if (pTransformCache == NULL) {\n            FX_Free(pCmm);\n            return NULL;\n        }\n        if (pProofProfile) {\n            pTransformCache->m_pIccTransform = cmsCreateProofingTransform(pInputProfile, dwInputProfileType, pOutputProfile, dwOutputProfileType,\n                                               pProofProfile, dwIntent, dwPrfIntent, dwPrfFlag);\n        } else {\n            pTransformCache->m_pIccTransform = cmsCreateTransform(pInputProfile, dwInputProfileType, pOutputProfile, dwOutputProfileType,\n                                               dwIntent, dwFlag);\n        }\n        pCmm->m_hTransform = pTransformCache->m_pIccTransform;\n        m_MapTranform.SetAt(TransformKey, pTransformCache);\n    } else {\n        pTransformCache->m_dwRate++;\n    }\n    return pTransformCache->m_pCmm;\n}\nCCodec_IccModule::~CCodec_IccModule()\n{\n    FX_POSITION pos = m_MapProfile.GetStartPosition();\n    CFX_ByteString key;\n    CFX_IccProfileCache* pProfileCache;\n    while (pos) {\n        m_MapProfile.GetNextAssoc(pos, key, (FX_LPVOID&)pProfileCache);\n        if (pProfileCache) {\n            delete pProfileCache;\n        }\n    }\n    pos = m_MapTranform.GetStartPosition();\n    CFX_IccTransformCache* pTransformCache;\n    while (pos) {\n        m_MapTranform.GetNextAssoc(pos, key, (FX_LPVOID&)pTransformCache);\n        if (pTransformCache) {\n            delete pTransformCache;\n        }\n    }\n}\nvoid* CCodec_IccModule::CreateTransform_sRGB(FX_LPCBYTE pProfileData, unsigned int dwProfileSize, int nComponents, int intent, FX_DWORD dwSrcFormat)\n{\n    return IccLib_CreateTransform_sRGB(pProfileData, dwProfileSize, nComponents, intent, dwSrcFormat);\n}\nvoid* CCodec_IccModule::CreateTransform_CMYK(FX_LPCBYTE pSrcProfileData, unsigned int dwSrcProfileSize, int nSrcComponents,\n        FX_LPCBYTE pDstProfileData, unsigned int dwDstProfileSize, int intent,\n        FX_DWORD dwSrcFormat , FX_DWORD dwDstFormat)\n{\n    return IccLib_CreateTransform(pSrcProfileData, dwSrcProfileSize, nSrcComponents,\n                                  pDstProfileData, dwDstProfileSize, 4, intent, dwSrcFormat, dwDstFormat);\n}\nvoid CCodec_IccModule::DestroyTransform(void* pTransform)\n{\n    IccLib_DestroyTransform(pTransform);\n}\nvoid CCodec_IccModule::Translate(void* pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues)\n{\n    IccLib_Translate(pTransform, m_nComponents, pSrcValues, pDestValues);\n}\nvoid CCodec_IccModule::TranslateScanline(void* pTransform, FX_LPBYTE pDest, FX_LPCBYTE pSrc, int pixels)\n{\n    IccLib_TranslateImage(pTransform, pDest, pSrc, pixels);\n}\nconst FX_BYTE g_CMYKSamples[81 * 81 * 3] = {\n    255, 255, 255, 225, 226, 228, 199, 200, 202, 173, 174, 178, 147, 149, 152, 123, 125, 128,  99, 99, 102,  69, 70, 71,  34, 30, 31,\n    255, 253, 229, 226, 224, 203, 200, 199, 182, 173, 173, 158, 149, 148, 135, 125, 124, 113,  99, 99, 90,  70, 69, 63,  33, 29, 24,\n    255, 251, 204, 228, 223, 182, 201, 198, 163, 174, 172, 142, 150, 147, 122, 125, 123, 101,  99, 98, 80,  70, 68, 54,  32, 28, 16,\n    255, 249, 179, 230, 222, 160, 203, 197, 144, 174, 170, 124, 150, 145, 105, 125, 122, 88,  99, 97, 69,  70, 68, 46,  31, 28,  6,\n    255, 247, 154, 229, 220, 138, 203, 195, 122, 176, 169, 107, 150, 145, 91, 125, 121, 74, 100, 96, 57,  70, 67, 35,  29, 26,  0,\n    255, 246, 128, 231, 217, 114, 205, 194, 101, 176, 167, 88, 150, 144, 75, 125, 120, 60, 100, 96, 44,  70, 66, 24,  28, 26,  0,\n    255, 244, 96, 231, 217, 87, 203, 192, 78, 175, 167, 66, 150, 143, 56, 125, 119, 43, 100, 95, 29,  69, 66,  7,  26, 26,  0,\n    255, 243, 51, 232, 215, 51, 204, 191, 43, 176, 165, 38, 150, 142, 28, 125, 118, 17,  99, 94,  0,  68, 65,  0,  24, 25,  0,\n    255, 241,  0, 231, 215,  0, 203, 190,  0, 176, 164,  0, 150, 141,  0, 126, 117,  0,  99, 93,  0,  68, 65,  0,  24, 25,  0,\n    252, 228, 238, 222, 201, 211, 197, 180, 190, 171, 156, 166, 147, 133, 143, 123, 111, 119,  99, 88, 94,  71, 61, 66,  34, 22, 26,\n    254, 226, 213, 224, 201, 191, 199, 179, 171, 172, 155, 148, 147, 133, 128, 123, 110, 106,  98, 87, 83,  70, 59, 57,  33, 21, 18,\n    254, 224, 191, 224, 199, 172, 200, 177, 153, 173, 154, 133, 147, 132, 115, 123, 109, 94,  98, 86, 74,  70, 59, 49,  32, 21,  9,\n    255, 222, 168, 227, 198, 150, 200, 175, 135, 173, 153, 118, 148, 130, 99, 123, 109, 82,  98, 86, 64,  69, 58, 40,  31, 19,  0,\n    255, 221, 145, 227, 196, 129, 201, 174, 115, 173, 151, 99, 148, 129, 85, 124, 108, 69,  98, 85, 52,  69, 58, 30,  30, 19,  0,\n    255, 219, 121, 227, 195, 109, 201, 174, 97, 174, 150, 83, 148, 129, 70, 124, 107, 55,  98, 84, 40,  69, 58, 19,  28, 18,  0,\n    255, 218, 92, 229, 194, 82, 202, 173, 75, 174, 150, 63, 149, 128, 51, 124, 106, 39,  98, 84, 24,  68, 57,  3,  26, 18,  0,\n    255, 217, 54, 228, 193, 52, 201, 172, 46, 174, 148, 36, 148, 127, 27, 123, 105, 14,  98, 83,  0,  68, 56,  0,  25, 18,  0,\n    255, 216,  0, 229, 192,  2, 202, 171,  4, 173, 148,  0, 148, 126,  0, 124, 105,  0,  98, 83,  0,  68, 56,  0,  24, 17,  0,\n    249, 204, 223, 219, 181, 199, 195, 160, 178, 170, 140, 156, 146, 119, 134, 123, 99, 112,  98, 77, 88,  70, 52, 61,  34, 11, 20,\n    250, 201, 200, 221, 180, 178, 197, 159, 161, 171, 139, 139, 147, 119, 120, 123, 98, 99,  98, 77, 78,  69, 51, 52,  34, 11, 10,\n    252, 201, 180, 223, 179, 162, 197, 159, 144, 170, 138, 125, 146, 117, 107, 122, 97, 89,  98, 76, 69,  69, 50, 44,  32, 11,  2,\n    252, 199, 158, 222, 177, 143, 199, 158, 127, 171, 137, 110, 147, 117, 93, 122, 96, 76,  97, 75, 58,  69, 50, 36,  32, 10,  0,\n    253, 198, 137, 223, 177, 123, 198, 156, 110, 171, 136, 95, 146, 116, 80, 122, 96, 65,  97, 75, 47,  69, 50, 25,  30, 10,  0,\n    254, 197, 115, 225, 175, 104, 198, 156, 92, 172, 135, 79, 147, 115, 66, 123, 95, 52,  98, 74, 37,  69, 49, 15,  29, 10,  0,\n    254, 196, 89, 224, 175, 80, 199, 154, 70, 172, 134, 59, 146, 114, 48, 122, 95, 36,  97, 74, 21,  68, 49,  0,  27,  9,  0,\n    255, 195, 57, 225, 173, 52, 198, 154, 44, 172, 133, 36, 147, 113, 26, 123, 94, 14,  98, 74,  0,  68, 49,  0,  26, 10,  0,\n    254, 194, 15, 225, 172, 12, 198, 153,  7, 172, 132,  3, 146, 113,  0, 123, 93,  0,  98, 73,  0,  68, 49,  0,  26,  9,  0,\n    246, 178, 209, 218, 159, 186, 194, 140, 166, 168, 122, 145, 144, 104, 125, 121, 85, 103,  97, 65, 81,  69, 41, 55,  34,  0, 12,\n    248, 176, 186, 219, 157, 166, 195, 139, 149, 168, 121, 130, 144, 103, 111, 121, 85, 91,  97, 65, 71,  69, 41, 46,  34,  0,  4,\n    249, 175, 168, 220, 156, 150, 196, 139, 135, 169, 121, 116, 144, 103, 100, 122, 84, 83,  98, 65, 63,  70, 41, 39,  33,  0,  0,\n    249, 175, 148, 220, 155, 133, 196, 138, 119, 169, 120, 103, 145, 101, 87, 121, 83, 71,  97, 65, 54,  69, 41, 31,  32,  0,  0,\n    249, 173, 128, 222, 154, 115, 195, 137, 102, 170, 119, 88, 145, 101, 74, 122, 83, 59,  97, 64, 43,  68, 40, 20,  30,  0,  0,\n    250, 172, 108, 221, 154, 98, 195, 136, 86, 170, 118, 73, 145, 100, 61, 122, 82, 48,  97, 63, 32,  69, 40, 11,  28,  0,  0,\n    250, 171, 85, 221, 153, 76, 196, 136, 67, 170, 117, 56, 145, 99, 44, 121, 82, 33,  97, 63, 17,  68, 40,  0,  28,  0,  0,\n    251, 171, 58, 222, 152, 50, 197, 135, 43, 169, 117, 34, 146, 99, 25, 121, 81, 10,  96, 63,  0,  68, 40,  0,  27,  0,  0,\n    250, 170, 26, 222, 151, 19, 196, 134, 13, 169, 116,  4, 145, 99,  0, 122, 81,  0,  97, 63,  0,  67, 40,  0,  26,  0,  0,\n    244, 153, 194, 215, 136, 173, 192, 121, 155, 167, 104, 135, 143, 89, 115, 121, 72, 96,  97, 54, 75,  70, 31, 49,  34,  0,  6,\n    245, 153, 173, 216, 136, 155, 192, 120, 138, 167, 104, 121, 144, 88, 103, 121, 71, 85,  97, 54, 66,  69, 31, 42,  34,  0,  0,\n    246, 152, 157, 217, 135, 140, 193, 120, 126, 167, 103, 109, 143, 88, 92, 121, 72, 76,  97, 54, 58,  69, 31, 35,  33,  0,  0,\n    245, 150, 139, 218, 134, 125, 193, 119, 111, 167, 103, 96, 144, 87, 80, 121, 71, 66,  96, 53, 49,  68, 31, 26,  32,  0,  0,\n    246, 151, 122, 218, 133, 108, 194, 118, 96, 168, 102, 81, 144, 86, 69, 120, 71, 55,  95, 53, 39,  68, 30, 17,  31,  0,  0,\n    248, 150, 103, 218, 133, 91, 193, 118, 81, 168, 102, 69, 143, 86, 56, 120, 70, 43,  96, 53, 28,  68, 31,  6,  29,  0,  0,\n    247, 149, 81, 218, 132, 72, 194, 117, 62, 168, 101, 52, 144, 86, 42, 121, 70, 29,  96, 52, 13,  68, 30,  0,  28,  0,  0,\n    247, 148, 55, 219, 131, 50, 194, 117, 43, 167, 101, 32, 144, 85, 22, 120, 69,  8,  96, 52,  0,  67, 30,  0,  27,  0,  0,\n    247, 147, 29, 218, 131, 24, 194, 116, 20, 168, 100, 11, 144, 85,  0, 120, 69,  0,  96, 52,  0,  67, 30,  0,  26,  0,  0,\n    242, 130, 179, 214, 114, 160, 190, 101, 143, 166, 87, 125, 143, 72, 107, 120, 58, 88,  96, 42, 68,  69, 17, 44,  35,  0,  0,\n    243, 129, 161, 215, 114, 143, 191, 101, 128, 166, 87, 113, 143, 73, 96, 120, 58, 79,  96, 41, 60,  69, 18, 37,  33,  0,  0,\n    243, 129, 146, 216, 114, 130, 192, 101, 117, 166, 87, 101, 143, 72, 86, 121, 58, 69,  96, 42, 52,  69, 18, 29,  31,  0,  0,\n    243, 128, 130, 216, 114, 115, 191, 101, 102, 165, 86, 88, 142, 72, 75, 120, 58, 60,  95, 42, 43,  68, 19, 21,  30,  0,  0,\n    244, 127, 112, 217, 113, 101, 192, 99, 89, 166, 85, 75, 142, 72, 63, 119, 57, 50,  96, 41, 35,  68, 19, 13,  30,  0,  0,\n    244, 127, 96, 216, 112, 86, 191, 99, 75, 166, 86, 64, 143, 72, 52, 120, 57, 40,  95, 41, 24,  67, 20,  1,  29,  0,  0,\n    245, 126, 77, 216, 113, 68, 191, 100, 59, 166, 85, 49, 142, 71, 38, 119, 57, 26,  95, 41, 10,  67, 20,  0,  28,  0,  0,\n    244, 126, 55, 216, 112, 48, 191, 99, 40, 166, 85, 31, 143, 71, 20, 119, 57,  6,  95, 42,  0,  67, 20,  0,  28,  0,  0,\n    245, 126, 33, 217, 112, 26, 192, 99, 22, 166, 84, 11, 142, 70,  0, 119, 57,  0,  95, 41,  0,  66, 20,  0,  27,  0,  0,\n    241, 102, 167, 213, 90, 149, 189, 79, 133, 165, 66, 115, 141, 54, 98, 119, 41, 81,  96, 25, 63,  69,  0, 38,  30,  0,  0,\n    241, 102, 149, 213, 90, 133, 189, 79, 119, 165, 66, 103, 142, 55, 88, 119, 41, 71,  96, 25, 53,  69,  0, 31,  28,  0,  0,\n    241, 102, 135, 214, 90, 121, 190, 79, 108, 165, 66, 92, 141, 55, 78, 119, 42, 63,  96, 26, 46,  69,  0, 24,  28,  0,  0,\n    241, 101, 120, 214, 90, 107, 189, 79, 95, 165, 67, 83, 141, 54, 68, 118, 41, 54,  95, 27, 39,  68,  0, 16,  27,  0,  0,\n    241, 102, 106, 213, 90, 93, 189, 78, 82, 164, 67, 70, 141, 55, 58, 118, 42, 45,  94, 27, 29,  67,  2,  6,  27,  0,  0,\n    242, 101, 90, 214, 89, 79, 190, 79, 69, 166, 67, 59, 141, 55, 47, 118, 41, 35,  95, 27, 19,  67,  3,  0,  26,  0,  0,\n    242, 102, 72, 213, 89, 63, 191, 79, 56, 164, 67, 45, 141, 55, 34, 118, 42, 22,  94, 28,  6,  67,  3,  0,  26,  0,  0,\n    242, 100, 51, 214, 89, 45, 190, 78, 38, 164, 67, 30, 141, 55, 18, 118, 42,  3,  95, 28,  0,  66,  4,  0,  26,  0,  0,\n    243, 100, 33, 214, 90, 27, 190, 78, 22, 165, 67, 13, 141, 55,  0, 118, 43,  0,  94, 29,  0,  66,  5,  0,  26,  0,  0,\n    237, 69, 153, 211, 58, 135, 187, 51, 121, 163, 41, 105, 141, 28, 90, 118, 15, 73,  96,  0, 56,  68,  0, 33,  25,  0,  0,\n    239, 67, 137, 212, 60, 123, 189, 50, 110, 163, 41, 94, 141, 29, 79, 118, 17, 65,  95,  0, 48,  69,  0, 26,  25,  0,  0,\n    240, 69, 124, 211, 60, 111, 188, 50, 98, 163, 42, 85, 141, 31, 72, 118, 18, 57,  94,  0, 41,  68,  0, 19,  25,  0,  0,\n    240, 70, 112, 212, 61, 99, 188, 52, 87, 163, 41, 74, 140, 31, 62, 118, 20, 48,  94,  2, 32,  68,  0, 11,  24,  0,  0,\n    239, 70, 98, 212, 62, 86, 188, 53, 77, 164, 42, 64, 140, 32, 52, 118, 20, 40,  94,  3, 24,  67,  0,  3,  23,  0,  0,\n    239, 71, 85, 212, 61, 74, 187, 53, 65, 163, 44, 54, 140, 34, 43, 118, 22, 30,  95,  3, 14,  67,  0,  0,  23,  0,  0,\n    239, 70, 67, 212, 62, 59, 188, 53, 51, 163, 45, 42, 141, 34, 31, 117, 22, 17,  94,  5,  2,  66,  0,  0,  23,  0,  0,\n    239, 71, 50, 213, 62, 43, 188, 54, 37, 164, 45, 28, 139, 34, 16, 117, 22,  2,  94,  7,  0,  65,  0,  0,  23,  0,  0,\n    240, 71, 34, 212, 63, 29, 189, 54, 24, 163, 46, 15, 139, 36,  2, 117, 25,  0,  94,  8,  0,  66,  0,  0,  23,  0,  0,\n    237,  0, 140, 209,  0, 124, 186,  0, 112, 162,  0, 97, 141,  0, 82, 118,  0, 67,  95,  0, 49,  68,  0, 27,  20,  0,  0,\n    237,  0, 126, 210,  0, 113, 187,  0, 99, 163,  0, 86, 139,  0, 72, 118,  0, 58,  95,  0, 42,  67,  0, 20,  20,  0,  0,\n    237,  1, 114, 209,  1, 102, 187,  0, 90, 163,  0, 78, 139,  0, 64, 118,  0, 50,  95,  0, 35,  67,  0, 13,  20,  0,  0,\n    236, 16, 102, 209,  7, 91, 186,  0, 80, 162,  0, 68, 139,  0, 56, 117,  0, 43,  94,  0, 27,  67,  0,  6,  20,  0,  0,\n    238, 15, 89, 209, 13, 79, 186,  6, 69, 162,  0, 58, 139,  0, 47, 117,  0, 34,  93,  0, 20,  66,  0,  2,  20,  0,  0,\n    237, 20, 78, 210, 12, 68, 187,  4, 59, 163,  0, 49, 139,  0, 38, 116,  0, 26,  94,  0, 11,  66,  0,  0,  20,  0,  0,\n    237, 25, 64, 210, 18, 56, 186, 11, 48, 162,  4, 39, 138,  0, 27, 117,  0, 14,  93,  0,  0,  66,  0,  0,  20,  0,  0,\n    238, 25, 48, 210, 22, 43, 186, 15, 35, 162,  8, 26, 140,  0, 14, 117,  0,  0,  93,  0,  0,  65,  0,  0,  20,  0,  0,\n    238, 28, 35, 210, 21, 30, 187, 15, 24, 162,  8, 16, 139,  1,  2, 117,  0,  0,  93,  0,  0,  65,  0,  0,  22,  0,  0,\n    219, 242, 252, 195, 214, 225, 172, 191, 201, 148, 165, 175, 127, 142, 150, 106, 119, 126,  84, 95, 101,  58, 66, 72,  24, 27, 32,\n    222, 239, 226, 196, 213, 202, 173, 189, 180, 150, 165, 158, 129, 141, 135, 107, 118, 113,  85, 94, 90,  58, 66, 63,  21, 26, 24,\n    223, 237, 203, 198, 211, 182, 175, 188, 163, 152, 164, 141, 129, 140, 121, 107, 117, 101,  85, 93, 80,  58, 64, 54,  21, 26, 18,\n    226, 236, 179, 201, 210, 160, 177, 187, 143, 153, 162, 125, 130, 139, 106, 108, 116, 89,  85, 92, 69,  58, 64, 45,  20, 25,  8,\n    227, 234, 153, 201, 208, 139, 178, 185, 124, 154, 161, 107, 131, 138, 91, 108, 115, 75,  85, 91, 58,  58, 63, 35,  17, 25,  0,\n    229, 233, 130, 203, 207, 116, 178, 184, 104, 154, 160, 90, 131, 137, 76, 109, 114, 62,  85, 90, 46,  58, 63, 25,  16, 24,  0,\n    230, 231, 100, 202, 205, 90, 179, 183, 80, 154, 159, 69, 131, 136, 57, 109, 113, 46,  86, 90, 32,  58, 63, 10,  14, 24,  0,\n    230, 230, 65, 204, 204, 58, 180, 182, 52, 155, 157, 44, 132, 135, 35, 110, 113, 24,  86, 89,  9,  57, 62,  0,  11, 24,  0,\n    232, 230, 19, 204, 204, 19, 180, 181, 17, 155, 157, 10, 131, 134,  2, 109, 112,  0,  85, 89,  0,  57, 62,  0,  10, 23,  0,\n    218, 216, 236, 194, 192, 211, 172, 171, 188, 149, 149, 164, 128, 127, 141, 106, 106, 119,  84, 84, 94,  59, 57, 66,  25, 18, 26,\n    221, 214, 211, 196, 191, 190, 174, 170, 170, 150, 148, 148, 128, 126, 127, 107, 105, 106,  85, 83, 84,  59, 56, 58,  23, 17, 18,\n    222, 213, 190, 197, 189, 170, 175, 169, 153, 151, 147, 133, 129, 126, 113, 108, 105, 94,  85, 82, 74,  59, 56, 49,  22, 17, 11,\n    224, 211, 168, 199, 188, 151, 175, 168, 135, 152, 146, 117, 129, 124, 99, 107, 103, 82,  84, 82, 64,  59, 55, 41,  21, 17,  1,\n    224, 210, 145, 199, 187, 130, 176, 166, 117, 152, 145, 101, 129, 123, 86, 107, 103, 70,  85, 81, 53,  58, 55, 31,  19, 17,  0,\n    227, 208, 123, 200, 186, 110, 177, 165, 98, 153, 143, 84, 130, 122, 70, 108, 102, 57,  85, 80, 41,  58, 54, 20,  18, 16,  0,\n    227, 208, 97, 202, 185, 86, 177, 164, 77, 153, 142, 65, 130, 122, 54, 108, 101, 42,  85, 80, 27,  58, 54,  7,  16, 16,  0,\n    228, 206, 66, 202, 184, 58, 178, 163, 50, 154, 141, 42, 131, 121, 33, 109, 101, 21,  86, 79,  5,  58, 54,  0,  13, 16,  0,\n    228, 206, 29, 202, 183, 25, 178, 163, 20, 154, 141, 15, 131, 121,  5, 108, 100,  0,  85, 79,  0,  58, 53,  0,  13, 16,  0,\n    217, 193, 221, 193, 172, 198, 172, 153, 178, 149, 133, 154, 128, 114, 132, 107, 94, 111,  85, 74, 89,  59, 49, 61,  25,  8, 22,\n    219, 191, 198, 195, 171, 178, 173, 153, 159, 149, 132, 139, 128, 113, 119, 107, 94, 100,  85, 73, 79,  59, 48, 52,  25,  7, 14,\n    221, 191, 180, 196, 170, 160, 174, 152, 144, 150, 132, 125, 129, 113, 107, 107, 93, 89,  85, 73, 69,  59, 48, 45,  23,  7,  4,\n    222, 189, 159, 197, 169, 142, 174, 151, 127, 151, 131, 110, 129, 112, 94, 108, 93, 78,  85, 72, 60,  58, 47, 37,  22,  7,  0,\n    223, 188, 138, 197, 168, 123, 175, 150, 109, 151, 130, 95, 130, 111, 81, 108, 92, 65,  85, 72, 49,  59, 47, 27,  21,  7,  0,\n    224, 187, 118, 198, 167, 105, 176, 149, 93, 152, 129, 79, 130, 110, 68, 108, 91, 54,  85, 71, 38,  59, 47, 17,  18,  7,  0,\n    224, 187, 93, 199, 166, 83, 176, 148, 73, 152, 128, 62, 129, 109, 51, 108, 90, 39,  85, 71, 25,  58, 46,  3,  16,  8,  0,\n    226, 186, 64, 200, 165, 57, 177, 147, 50, 153, 127, 40, 130, 108, 31, 108, 90, 19,  85, 70,  3,  58, 46,  0,  16,  8,  0,\n    227, 185, 35, 200, 165, 30, 176, 146, 25, 152, 127, 18, 130, 108,  7, 108, 89,  0,  85, 70,  0,  57, 46,  0,  14,  8,  0,\n    216, 169, 205, 192, 150, 184, 171, 134, 164, 149, 116, 144, 128, 99, 124, 107, 81, 103,  85, 63, 81,  60, 39, 55,  26,  0, 15,\n    217, 168, 186, 193, 150, 165, 172, 134, 149, 150, 116, 130, 128, 99, 111, 107, 81, 92,  85, 62, 72,  59, 39, 47,  25,  0,  6,\n    219, 168, 168, 194, 149, 150, 173, 133, 135, 150, 116, 117, 128, 98, 99, 107, 80, 82,  86, 62, 63,  59, 38, 39,  24,  0,  0,\n    219, 166, 148, 195, 149, 133, 173, 133, 119, 150, 115, 103, 128, 98, 88, 107, 80, 72,  85, 61, 54,  59, 38, 32,  23,  0,  0,\n    220, 166, 129, 196, 148, 116, 174, 132, 103, 151, 114, 89, 129, 97, 75, 107, 79, 60,  85, 61, 44,  59, 38, 22,  21,  0,  0,\n    222, 164, 110, 197, 147, 99, 175, 131, 87, 151, 113, 75, 129, 96, 63, 107, 79, 49,  85, 61, 33,  58, 38, 12,  19,  0,  0,\n    222, 164, 88, 197, 146, 79, 174, 130, 69, 151, 113, 58, 129, 95, 47, 107, 78, 35,  85, 60, 20,  58, 38,  0,  18,  0,  0,\n    223, 164, 63, 198, 145, 55, 175, 129, 48, 151, 112, 39, 129, 95, 29, 107, 78, 16,  85, 60,  1,  58, 38,  0,  17,  0,  0,\n    223, 163, 36, 198, 145, 32, 174, 129, 26, 151, 111, 17, 129, 95,  7, 107, 78,  0,  84, 60,  0,  57, 37,  0,  15,  0,  0,\n    215, 147, 192, 191, 130, 172, 170, 116, 153, 148, 100, 133, 127, 85, 115, 107, 69, 96,  85, 51, 75,  60, 28, 50,  25,  0,  8,\n    217, 146, 173, 192, 130, 154, 171, 115, 138, 149, 100, 121, 128, 84, 103, 107, 68, 85,  85, 51, 66,  60, 28, 42,  25,  0,  0,\n    217, 145, 157, 193, 129, 140, 173, 115, 125, 149, 100, 109, 128, 84, 92, 107, 68, 76,  85, 51, 58,  59, 28, 35,  23,  0,  0,\n    218, 145, 140, 193, 129, 125, 172, 114, 110, 149, 99, 96, 128, 83, 81, 107, 67, 65,  84, 51, 49,  59, 29, 27,  22,  0,  0,\n    219, 144, 121, 194, 128, 108, 172, 113, 96, 149, 98, 83, 128, 83, 69, 107, 68, 55,  85, 50, 40,  59, 28, 18,  20,  0,  0,\n    220, 143, 104, 195, 128, 93, 173, 114, 82, 150, 98, 69, 127, 82, 58, 107, 67, 45,  85, 50, 30,  59, 28,  7,  19,  0,  0,\n    220, 143, 84, 195, 127, 74, 173, 113, 65, 149, 97, 55, 128, 82, 44, 106, 67, 32,  84, 50, 16,  58, 28,  0,  18,  0,  0,\n    221, 142, 62, 196, 126, 53, 173, 112, 46, 150, 97, 37, 128, 82, 26, 107, 66, 14,  84, 50,  0,  58, 28,  0,  16,  0,  0,\n    222, 142, 38, 196, 126, 34, 174, 112, 27, 150, 96, 17, 128, 82,  6, 106, 66,  0,  84, 50,  0,  57, 29,  0,  16,  0,  0,\n    214, 123, 179, 191, 110, 159, 169, 98, 143, 147, 84, 124, 126, 70, 106, 107, 55, 88,  85, 39, 69,  60, 15, 45,  23,  0,  2,\n    216, 123, 161, 192, 110, 144, 170, 98, 129, 148, 84, 112, 127, 70, 95, 107, 55, 79,  85, 39, 61,  60, 15, 37,  20,  0,  0,\n    217, 122, 145, 192, 110, 130, 170, 97, 116, 149, 84, 101, 127, 70, 85, 106, 55, 70,  85, 39, 53,  59, 16, 30,  19,  0,  0,\n    217, 123, 131, 192, 109, 116, 171, 96, 103, 149, 83, 89, 127, 70, 75, 106, 55, 60,  85, 40, 45,  59, 16, 23,  17,  0,  0,\n    217, 122, 114, 193, 109, 101, 172, 96, 91, 149, 82, 77, 128, 69, 64, 106, 55, 50,  84, 39, 35,  59, 17, 14,  17,  0,  0,\n    218, 122, 98, 194, 108, 87, 171, 96, 77, 149, 82, 65, 127, 69, 52, 106, 55, 40,  84, 40, 25,  59, 18,  3,  15,  0,  0,\n    219, 122, 80, 193, 108, 70, 172, 95, 61, 149, 82, 51, 127, 69, 40, 106, 55, 28,  84, 39, 12,  58, 17,  0,  13,  0,  0,\n    219, 121, 59, 194, 108, 52, 172, 96, 44, 149, 82, 35, 127, 68, 24, 106, 55, 11,  84, 40,  0,  57, 18,  0,  13,  0,  0,\n    219, 121, 40, 193, 108, 33, 172, 95, 26, 149, 81, 19, 128, 68,  6, 106, 54,  0,  84, 39,  0,  57, 18,  0,  13,  0,  0,\n    213, 99, 165, 189, 87, 148, 169, 76, 132, 147, 64, 115, 126, 52, 98, 106, 39, 81,  85, 23, 63,  60,  0, 39,  16,  0,  0,\n    214, 98, 149, 191, 87, 133, 170, 76, 119, 148, 65, 103, 127, 53, 88, 106, 39, 72,  85, 24, 55,  60,  0, 32,  15,  0,  0,\n    215, 99, 136, 191, 87, 121, 170, 77, 108, 148, 65, 93, 126, 53, 79, 106, 40, 64,  85, 24, 47,  59,  0, 25,  14,  0,  0,\n    215, 99, 121, 192, 87, 108, 170, 77, 96, 148, 65, 82, 126, 53, 69, 106, 40, 55,  85, 25, 39,  59,  0, 18,  13,  0,  0,\n    216, 99, 106, 191, 87, 95, 170, 76, 83, 148, 65, 71, 126, 53, 58, 106, 41, 45,  85, 26, 30,  59,  0,  8,  11,  0,  0,\n    216, 98, 91, 192, 88, 82, 170, 77, 71, 148, 65, 60, 127, 53, 48, 105, 41, 36,  83, 26, 21,  58,  1,  2,  11,  0,  0,\n    217, 99, 75, 192, 87, 66, 170, 76, 57, 148, 65, 47, 126, 53, 36, 105, 41, 24,  83, 26,  8,  57,  2,  0,   9,  0,  0,\n    217, 98, 57, 192, 87, 49, 171, 77, 41, 147, 65, 32, 126, 53, 21, 105, 41,  8,  84, 27,  0,  57,  3,  0,   9,  0,  0,\n    217, 98, 40, 193, 87, 34, 171, 76, 27, 148, 65, 19, 126, 53,  6, 105, 41,  0,  83, 27,  0,  57,  4,  0,   9,  0,  0,\n    211, 67, 152, 189, 58, 136, 168, 50, 122, 147, 39, 105, 127, 28, 89, 106, 14, 74,  85,  0, 56,  59,  0, 33,   9,  0,  0,\n    213, 68, 138, 190, 59, 123, 169, 51, 109, 148, 40, 95, 126, 30, 80, 106, 16, 65,  85,  0, 48,  59,  0, 27,   9,  0,  0,\n    214, 69, 125, 190, 59, 111, 168, 51, 99, 148, 41, 86, 126, 31, 72, 106, 18, 58,  85,  0, 41,  59,  0, 20,   7,  0,  0,\n    215, 70, 112, 190, 61, 100, 169, 52, 88, 147, 42, 76, 126, 32, 63, 106, 19, 49,  84,  1, 34,  58,  0, 13,   7,  0,  0,\n    214, 70, 99, 190, 62, 88, 169, 53, 77, 147, 43, 65, 125, 32, 53, 106, 20, 40,  84,  3, 26,  58,  0,  4,   7,  0,  0,\n    214, 71, 86, 190, 61, 75, 169, 53, 65, 146, 43, 54, 126, 33, 44, 105, 21, 31,  83,  4, 17,  57,  0,  0,   7,  0,  0,\n    215, 71, 71, 191, 62, 62, 169, 53, 53, 147, 44, 44, 126, 34, 33, 105, 22, 20,  83,  5,  4,  57,  0,  0,   7,  0,  0,\n    215, 71, 54, 191, 62, 47, 169, 54, 39, 147, 44, 30, 126, 35, 20, 105, 23,  6,  83,  6,  0,  56,  0,  0,   5,  0,  0,\n    215, 71, 41, 191, 63, 34, 170, 54, 27, 147, 45, 17, 126, 35,  6, 105, 23,  0,  83,  8,  0,  56,  0,  0,   5,  0,  0,\n    210, 13, 140, 189,  1, 125, 167,  0, 110, 146,  0, 96, 126,  0, 81, 106,  0, 67,  85,  0, 51,  59,  0, 28,   4,  0,  0,\n    212, 18, 126, 190,  7, 113, 168,  0, 100, 146,  0, 86, 126,  0, 73, 106,  0, 59,  84,  0, 43,  59,  0, 22,   4,  0,  0,\n    212, 21, 115, 190, 13, 103, 168,  3, 91, 146,  0, 78, 125,  0, 65, 105,  0, 52,  84,  0, 36,  58,  0, 16,   4,  0,  0,\n    213, 24, 103, 189, 19, 91, 168,  9, 82, 146,  0, 69, 125,  0, 57, 105,  0, 44,  84,  0, 29,  58,  0,  7,   4,  0,  0,\n    213, 27, 92, 188, 21, 81, 168, 14, 71, 146,  1, 59, 125,  0, 48, 105,  0, 36,  84,  0, 21,  58,  0,  4,   4,  0,  0,\n    213, 30, 80, 189, 22, 69, 168, 17, 61, 146,  5, 50, 125,  0, 39, 104,  0, 27,  83,  0, 12,  57,  0,  0,   4,  0,  0,\n    214, 30, 67, 189, 25, 57, 168, 20, 50, 146,  9, 40, 125,  0, 29, 104,  0, 17,  83,  0,  2,  56,  0,  0,   4,  0,  0,\n    214, 32, 53, 189, 27, 44, 169, 20, 38, 146, 13, 28, 124,  2, 17, 104,  0,  4,  83,  0,  0,  56,  0,  0,   4,  0,  0,\n    214, 33, 41, 190, 27, 33, 168, 23, 27, 146, 13, 18, 125,  3,  5, 105,  0,  0,  83,  0,  0,  56,  0,  0,   4,  0,  0,\n    185, 229, 250, 164, 204, 223, 146, 182, 199, 127, 158, 174, 108, 136, 149,  89, 113, 125,  70, 90, 100,  46, 62, 71,  10, 25, 33,\n    189, 227, 225, 168, 202, 201, 148, 181, 179, 129, 157, 156, 109, 135, 134,  90, 113, 113,  70, 89, 90,  46, 62, 62,   8, 24, 25,\n    192, 226, 202, 170, 202, 182, 151, 179, 162, 130, 156, 141, 110, 133, 121,  91, 112, 101,  71, 89, 80,  46, 61, 54,   7, 24, 19,\n    194, 224, 179, 173, 200, 160, 153, 178, 144, 132, 155, 125, 112, 133, 107,  92, 111, 89,  71, 88, 69,  46, 61, 45,   6, 23, 10,\n    196, 223, 155, 174, 198, 139, 154, 176, 124, 132, 153, 107, 113, 131, 91,  92, 110, 75,  72, 87, 58,  47, 60, 37,   4, 23,  0,\n    198, 221, 131, 175, 197, 117, 155, 175, 105, 133, 152, 91, 113, 130, 76,  92, 109, 63,  72, 86, 47,  46, 60, 26,   3, 23,  0,\n    200, 220, 104, 176, 196, 94, 156, 175, 84, 134, 151, 72, 113, 129, 59,  93, 108, 47,  72, 85, 33,  46, 59, 13,   0, 23,  0,\n    201, 219, 73, 179, 195, 65, 157, 173, 57, 135, 150, 48, 114, 129, 39,  94, 108, 28,  72, 85, 15,  47, 59,  0,   0, 22,  0,\n    203, 219, 42, 178, 195, 37, 157, 173, 32, 135, 150, 26, 114, 128, 16,  94, 107,  6,  73, 85,  0,  46, 58,  0,   0, 22,  0,\n    186, 205, 233, 165, 183, 209, 148, 163, 187, 128, 142, 163, 109, 121, 140,  91, 101, 118,  71, 80, 94,  48, 54, 66,  12, 15, 27,\n    189, 204, 211, 169, 182, 189, 151, 163, 169, 131, 141, 147, 111, 121, 126,  92, 101, 105,  72, 79, 84,  48, 54, 58,  11, 15, 19,\n    192, 202, 190, 171, 181, 170, 152, 161, 152, 131, 141, 133, 112, 120, 113,  93, 100, 94,  72, 79, 74,  48, 53, 50,  10, 15, 11,\n    195, 201, 169, 172, 179, 151, 153, 160, 135, 132, 139, 117, 113, 119, 100,  93, 99, 82,  72, 78, 64,  48, 53, 41,   9, 14,  3,\n    195, 200, 146, 174, 179, 131, 154, 159, 117, 133, 138, 101, 113, 118, 86,  93, 98, 70,  73, 77, 53,  48, 52, 32,   8, 15,  0,\n    198, 199, 125, 175, 177, 111, 155, 158, 100, 133, 137, 85, 113, 117, 71,  93, 97, 57,  72, 77, 42,  47, 52, 22,   5, 14,  0,\n    199, 198, 101, 176, 177, 89, 155, 157, 79, 134, 136, 68, 113, 116, 56,  94, 97, 44,  73, 76, 30,  47, 52, 10,   2, 15,  0,\n    200, 197, 72, 178, 176, 63, 157, 156, 56, 135, 136, 46, 114, 116, 37,  94, 96, 26,  73, 76, 11,  47, 51,  0,   0, 14,  0,\n    201, 197, 45, 177, 175, 38, 156, 155, 31, 135, 135, 25, 114, 115, 17,  94, 96,  5,  73, 75,  0,  46, 51,  0,   0, 14,  0,\n    187, 183, 218, 167, 165, 197, 149, 147, 176, 129, 127, 153, 111, 109, 132,  92, 90, 111,  73, 70, 89,  49, 46, 62,  15,  4, 22,\n    190, 183, 197, 170, 164, 177, 151, 146, 159, 130, 127, 139, 112, 109, 119,  93, 90, 99,  72, 70, 78,  49, 45, 53,  14,  4, 15,\n    192, 182, 179, 171, 163, 161, 153, 145, 144, 132, 126, 125, 113, 108, 107,  93, 89, 88,  73, 70, 69,  49, 45, 45,  13,  5,  6,\n    195, 181, 159, 172, 162, 142, 152, 145, 127, 132, 125, 111, 113, 107, 94,  93, 88, 77,  73, 69, 59,  48, 45, 37,  11,  5,  0,\n    195, 180, 139, 173, 161, 124, 153, 143, 110, 133, 125, 96, 113, 106, 81,  94, 88, 66,  73, 68, 49,  49, 44, 28,   9,  6,  0,\n    196, 179, 118, 174, 160, 106, 154, 142, 94, 133, 124, 81, 113, 105, 68,  94, 87, 54,  73, 68, 39,  48, 44, 18,   5,  5,  0,\n    197, 178, 96, 176, 159, 86, 155, 141, 75, 134, 123, 64, 114, 105, 53,  94, 87, 40,  73, 68, 26,  48, 44,  5,   2,  6,  0,\n    199, 178, 70, 176, 158, 62, 156, 141, 54, 134, 122, 44, 114, 104, 35,  94, 86, 23,  73, 67,  8,  47, 44,  0,   2,  6,  0,\n    199, 177, 45, 178, 158, 40, 156, 140, 32, 135, 122, 26, 114, 104, 16,  94, 86,  4,  73, 67,  0,  47, 44,  0,   0,  7,  0,\n    188, 161, 204, 168, 144, 183, 149, 129, 164, 130, 112, 144, 112, 95, 123,  93, 78, 103,  74, 60, 81,  50, 36, 56,  16,  0, 16,\n    190, 160, 185, 170, 144, 165, 151, 128, 148, 132, 111, 130, 112, 95, 110,  93, 78, 92,  74, 59, 72,  50, 36, 48,  16,  0,  8,\n    192, 160, 167, 171, 143, 150, 153, 128, 134, 132, 111, 117, 112, 94, 100,  94, 77, 82,  74, 59, 63,  50, 36, 40,  14,  0,  0,\n    193, 159, 149, 172, 143, 134, 153, 127, 119, 133, 110, 103, 113, 94, 87,  93, 77, 72,  73, 59, 54,  50, 36, 32,  12,  0,  0,\n    195, 159, 131, 173, 142, 117, 153, 127, 104, 132, 110, 90, 113, 93, 76,  93, 76, 61,  74, 59, 45,  49, 36, 23,   9,  0,  0,\n    196, 158, 113, 174, 141, 101, 155, 126, 89, 133, 109, 76, 113, 93, 64,  94, 76, 51,  74, 58, 35,  49, 36, 14,   6,  0,  0,\n    197, 157, 92, 174, 141, 80, 154, 125, 71, 134, 108, 60, 114, 92, 50,  94, 75, 37,  73, 58, 22,  48, 36,  1,   5,  0,  0,\n    197, 157, 68, 175, 140, 59, 155, 124, 51, 134, 108, 41, 113, 91, 32,  94, 75, 21,  73, 57,  5,  48, 35,  0,   5,  0,  0,\n    198, 156, 46, 176, 140, 40, 155, 124, 32, 134, 107, 24, 114, 91, 14,  94, 75,  2,  73, 57,  0,  48, 36,  0,   3,  0,  0,\n    189, 140, 191, 168, 126, 172, 150, 112, 154, 131, 97, 134, 112, 82, 115,  94, 66, 96,  74, 49, 75,  51, 25, 50,  12,  0, 10,\n    191, 139, 173, 170, 125, 154, 152, 111, 138, 132, 96, 121, 113, 81, 103,  94, 66, 85,  74, 48, 66,  50, 26, 42,  12,  0,  1,\n    192, 139, 157, 171, 125, 140, 152, 111, 125, 132, 96, 109, 113, 81, 92,  94, 65, 76,  74, 48, 58,  50, 26, 35,   9,  0,  0,\n    193, 139, 140, 172, 124, 125, 153, 110, 112, 133, 95, 96, 113, 80, 82,  94, 65, 66,  74, 49, 50,  50, 26, 28,   7,  0,  0,\n    194, 138, 123, 172, 123, 109, 153, 110, 97, 133, 95, 84, 113, 80, 70,  94, 65, 56,  74, 48, 40,  50, 26, 20,   6,  0,  0,\n    194, 138, 105, 173, 123, 94, 153, 109, 83, 133, 94, 70, 112, 79, 59,  94, 64, 46,  74, 48, 31,  50, 26,  9,   4,  0,  0,\n    196, 138, 87, 174, 122, 77, 153, 109, 67, 133, 93, 56, 113, 79, 46,  94, 64, 34,  73, 48, 18,  49, 27,  0,   4,  0,  0,\n    196, 137, 65, 174, 122, 57, 154, 108, 49, 133, 93, 39, 113, 79, 29,  94, 64, 18,  74, 48,  3,  49, 27,  0,   2,  0,  0,\n    197, 137, 47, 175, 122, 40, 155, 108, 32, 133, 93, 23, 114, 79, 14,  94, 64,  1,  73, 48,  0,  48, 27,  0,   2,  0,  0,\n    189, 119, 177, 168, 106, 159, 150, 94, 142, 131, 81, 124, 113, 67, 107,  94, 53, 89,  74, 37, 69,  51, 11, 45,   6,  0,  3,\n    191, 119, 161, 170, 106, 144, 152, 94, 129, 132, 81, 112, 113, 67, 96,  94, 53, 79,  74, 37, 61,  51, 13, 38,   6,  0,  0,\n    192, 119, 146, 170, 106, 131, 152, 94, 117, 132, 80, 101, 112, 67, 85,  94, 53, 70,  74, 37, 53,  50, 14, 31,   4,  0,  0,\n    192, 119, 131, 171, 106, 117, 153, 94, 105, 132, 80, 89, 113, 67, 75,  94, 54, 61,  74, 38, 45,  51, 14, 23,   3,  0,  0,\n    193, 118, 114, 171, 106, 102, 153, 93, 90, 132, 80, 78, 113, 67, 65,  94, 53, 52,  74, 37, 36,  50, 15, 16,   1,  0,  0,\n    194, 118, 99, 172, 105, 89, 153, 93, 78, 132, 80, 66, 113, 67, 54,  94, 53, 42,  74, 38, 27,  50, 16,  5,   1,  0,  0,\n    194, 118, 82, 173, 105, 72, 153, 93, 63, 132, 79, 53, 113, 67, 42,  94, 53, 30,  74, 38, 15,  49, 16,  0,   0,  0,  0,\n    195, 117, 63, 173, 105, 55, 154, 93, 47, 133, 79, 37, 113, 66, 27,  94, 53, 15,  73, 38,  0,  48, 16,  0,   0,  0,  0,\n    195, 117, 46, 173, 104, 39, 154, 92, 32, 133, 79, 22, 113, 66, 13,  94, 53,  0,  73, 38,  0,  48, 17,  0,   0,  0,  0,\n    189, 96, 166, 168, 85, 147, 150, 74, 132, 131, 62, 115, 113, 51, 99,  94, 38, 82,  74, 21, 63,  51,  0, 40,   1,  0,  0,\n    190, 96, 150, 170, 85, 133, 152, 75, 119, 132, 63, 104, 113, 51, 88,  94, 38, 72,  75, 22, 55,  51,  0, 33,   1,  0,  0,\n    192, 96, 137, 170, 85, 121, 152, 74, 108, 132, 64, 94, 113, 52, 79,  94, 39, 64,  74, 23, 48,  50,  0, 26,   0,  0,  0,\n    192, 96, 122, 171, 86, 109, 152, 75, 96, 132, 63, 83, 113, 52, 69,  94, 39, 56,  74, 24, 41,  50,  0, 19,   0,  0,  0,\n    193, 96, 107, 171, 85, 96, 152, 75, 84, 132, 64, 72, 113, 52, 60,  94, 39, 47,  74, 24, 32,  50,  1, 10,   0,  0,  0,\n    193, 96, 93, 172, 85, 82, 152, 75, 72, 133, 63, 61, 113, 51, 49,  94, 39, 37,  73, 25, 23,  49,  2,  2,   0,  0,  0,\n    194, 96, 78, 172, 85, 68, 152, 75, 59, 132, 63, 49, 113, 52, 39,  94, 40, 26,  73, 25, 11,  48,  3,  0,   0,  0,  0,\n    194, 96, 60, 173, 85, 52, 153, 75, 44, 132, 64, 35, 112, 52, 25,  94, 40, 12,  73, 26,  0,  48,  4,  0,   0,  0,  0,\n    195, 96, 46, 173, 85, 38, 154, 74, 31, 133, 63, 22, 113, 52, 11,  93, 40,  0,  73, 26,  0,  47,  5,  0,   0,  0,  0,\n    188, 67, 153, 168, 58, 137, 151, 49, 122, 131, 39, 106, 113, 28, 90,  94, 13, 75,  75,  0, 57,  51,  0, 35,   0,  0,  0,\n    190, 68, 138, 170, 59, 123, 152, 50, 110, 132, 41, 96, 113, 29, 80,  94, 16, 66,  75,  0, 49,  50,  0, 27,   0,  0,  0,\n    191, 69, 126, 170, 59, 112, 151, 52, 100, 132, 42, 86, 113, 30, 73,  95, 17, 58,  75,  0, 42,  50,  0, 21,   0,  0,  0,\n    192, 70, 113, 170, 61, 100, 151, 52, 89, 132, 42, 77, 113, 31, 64,  94, 19, 50,  74,  1, 35,  50,  0, 14,   0,  0,  0,\n    192, 70, 100, 170, 62, 89, 151, 53, 77, 131, 43, 66, 112, 32, 54,  94, 20, 42,  74,  2, 27,  49,  0,  5,   0,  0,  0,\n    192, 71, 87, 171, 61, 77, 152, 53, 67, 131, 44, 57, 112, 33, 45,  94, 21, 33,  74,  4, 19,  49,  0,  1,   0,  0,  0,\n    193, 71, 74, 171, 62, 64, 152, 53, 55, 132, 44, 45, 113, 34, 34,  94, 22, 23,  73,  5,  7,  48,  0,  0,   0,  0,  0,\n    193, 70, 58, 172, 62, 50, 152, 54, 42, 132, 44, 32, 112, 35, 22,  93, 23, 10,  73,  6,  0,  47,  0,  0,   0,  0,  0,\n    193, 70, 45, 172, 62, 38, 153, 54, 31, 132, 44, 21, 112, 35,  9,  94, 23,  0,  73,  7,  0,  47,  0,  0,   0,  0,  0,\n    189, 26, 141, 169, 15, 126, 150,  2, 112, 131,  0, 97, 113,  0, 82,  94,  0, 67,  75,  0, 51,  50,  0, 29,   0,  0,  0,\n    190, 28, 128, 170, 18, 114, 151,  8, 101, 132,  0, 88, 113,  0, 74,  94,  0, 60,  75,  0, 44,  50,  0, 23,   0,  0,  0,\n    191, 30, 117, 170, 23, 104, 152, 11, 92, 132,  1, 79, 113,  0, 67,  95,  0, 53,  75,  0, 37,  50,  0, 17,   0,  0,  0,\n    191, 33, 105, 170, 26, 93, 151, 18, 83, 132,  6, 70, 112,  0, 58,  94,  0, 45,  75,  0, 30,  49,  0,  8,   0,  0,  0,\n    191, 34, 93, 170, 27, 82, 151, 20, 72, 131,  8, 61, 112,  0, 49,  94,  0, 38,  74,  0, 23,  49,  0,  4,   0,  0,  0,\n    191, 36, 82, 170, 29, 71, 151, 22, 63, 131, 11, 52, 112,  0, 41,  93,  0, 29,  74,  0, 14,  48,  0,  1,   0,  0,  0,\n    191, 38, 69, 170, 31, 60, 151, 24, 51, 131, 14, 41, 112,  1, 31,  93,  0, 19,  73,  0,  3,  48,  0,  0,   0,  0,  0,\n    192, 37, 56, 171, 31, 47, 152, 25, 40, 131, 17, 30, 112,  4, 19,  93,  0,  7,  73,  0,  0,  47,  0,  0,   0,  0,  0,\n    192, 38, 45, 171, 33, 36, 152, 26, 30, 131, 18, 21, 111,  7,  9,  93,  0,  0,  73,  0,  0,  47,  0,  0,   0,  0,  0,\n    149, 218, 248, 133, 194, 222, 119, 173, 198, 102, 151, 173,  86, 130, 148,  70, 108, 125,  53, 85, 100,  32, 59, 71,   0, 22, 33,\n    154, 216, 223, 137, 193, 200, 122, 172, 178, 106, 150, 156,  89, 128, 133,  73, 107, 112,  54, 85, 89,  31, 59, 63,   0, 22, 26,\n    159, 215, 202, 141, 192, 181, 126, 171, 161, 108, 149, 141,  90, 128, 121,  74, 107, 100,  55, 85, 80,  32, 58, 55,   0, 22, 19,\n    161, 213, 179, 144, 190, 160, 126, 170, 143, 109, 148, 125,  92, 127, 107,  74, 106, 89,  56, 84, 69,  32, 58, 46,   0, 21, 11,\n    163, 211, 156, 144, 189, 139, 129, 168, 125, 110, 147, 108,  93, 126, 92,  75, 105, 76,  57, 83, 58,  33, 58, 37,   0, 21,  1,\n    167, 211, 133, 147, 188, 120, 130, 167, 105, 110, 145, 92,  93, 125, 78,  76, 104, 64,  58, 83, 48,  33, 57, 27,   0, 21,  0,\n    169, 210, 108, 149, 187, 96, 131, 166, 86, 112, 144, 74,  94, 124, 62,  77, 103, 49,  58, 82, 35,  33, 57, 15,   0, 21,  0,\n    170, 209, 80, 151, 186, 71, 133, 165, 62, 114, 143, 52,  95, 123, 42,  77, 103, 32,  58, 81, 18,  33, 56,  0,   0, 21,  0,\n    173, 208, 55, 152, 186, 49, 134, 165, 41, 114, 143, 34,  95, 122, 25,  77, 102, 14,  58, 81,  0,  33, 56,  0,   0, 21,  0,\n    154, 195, 232, 137, 174, 207, 122, 156, 185, 105, 136, 163,  89, 116, 140,  73, 97, 117,  56, 76, 94,  35, 51, 66,   0, 13, 28,\n    158, 194, 209, 141, 174, 187, 125, 155, 167, 109, 135, 146,  91, 116, 125,  75, 96, 105,  57, 75, 83,  35, 50, 57,   0, 12, 21,\n    161, 193, 189, 144, 173, 169, 128, 154, 151, 110, 134, 132,  93, 115, 113,  77, 95, 94,  58, 75, 74,  35, 50, 50,   0, 12, 13,\n    164, 192, 168, 145, 171, 151, 129, 153, 134, 111, 133, 117,  94, 114, 100,  76, 95, 82,  58, 75, 64,  36, 50, 42,   0, 12,  5,\n    165, 191, 147, 147, 170, 131, 130, 152, 117, 113, 132, 102,  95, 113, 86,  77, 94, 71,  58, 74, 54,  35, 50, 33,   0, 13,  0,\n    167, 189, 126, 148, 169, 113, 132, 151, 100, 113, 131, 86,  96, 112, 73,  77, 93, 59,  59, 73, 43,  35, 49, 23,   0, 12,  0,\n    170, 189, 104, 150, 168, 91, 133, 150, 81, 114, 130, 69,  96, 111, 57,  78, 92, 46,  59, 73, 31,  35, 49, 11,   0, 13,  0,\n    171, 188, 78, 152, 168, 68, 134, 149, 60, 115, 130, 50,  96, 111, 41,  78, 92, 29,  60, 73, 15,  35, 49,  0,   0, 12,  0,\n    173, 187, 55, 153, 167, 47, 134, 149, 39, 115, 129, 33,  97, 110, 24,  79, 92, 13,  60, 72,  0,  35, 48,  0,   0, 12,  0,\n    157, 175, 217, 139, 157, 196, 125, 141, 175, 109, 122, 153,  92, 104, 132,  76, 86, 110,  59, 67, 88,  37, 43, 61,   1,  1, 23,\n    161, 174, 196, 144, 156, 176, 127, 140, 158, 110, 121, 137,  94, 104, 118,  77, 85, 98,  59, 67, 78,  37, 43, 53,   0,  2, 16,\n    163, 174, 178, 146, 156, 160, 130, 139, 143, 112, 121, 124,  95, 103, 106,  78, 85, 88,  60, 66, 69,  37, 42, 46,   0,  2,  7,\n    166, 173, 159, 147, 154, 142, 130, 138, 127, 113, 120, 111,  96, 103, 95,  78, 84, 77,  60, 66, 59,  37, 43, 37,   0,  2,  0,\n    166, 172, 139, 148, 154, 125, 131, 137, 112, 113, 120, 96,  96, 102, 81,  78, 84, 66,  60, 65, 50,  37, 42, 29,   0,  3,  0,\n    167, 171, 120, 149, 153, 107, 133, 137, 95, 114, 118, 81,  97, 101, 69,  79, 84, 56,  60, 65, 40,  37, 42, 19,   0,  3,  0,\n    170, 170, 99, 151, 152, 87, 134, 136, 77, 115, 118, 66,  97, 101, 55,  79, 83, 42,  61, 65, 28,  37, 42,  7,   0,  3,  0,\n    172, 170, 75, 152, 151, 65, 134, 135, 57, 115, 117, 48,  97, 100, 38,  79, 83, 27,  61, 64, 12,  36, 42,  0,   0,  3,  0,\n    172, 169, 55, 154, 151, 46, 135, 134, 40, 116, 116, 32,  97, 99, 21,  80, 82, 10,  61, 64,  0,  36, 41,  0,   0,  3,  0,\n    160, 154, 203, 143, 139, 182, 127, 124, 164, 111, 107, 143,  95, 91, 122,  78, 75, 103,  60, 57, 81,  39, 33, 56,   1,  0, 18,\n    163, 154, 184, 146, 138, 165, 130, 123, 148, 113, 107, 129,  96, 90, 110,  79, 74, 92,  61, 56, 72,  39, 34, 48,   2,  0,  9,\n    165, 154, 167, 147, 137, 149, 131, 122, 134, 114, 106, 117,  96, 90, 100,  79, 74, 82,  61, 56, 64,  39, 33, 40,   2,  0,  1,\n    166, 153, 150, 149, 137, 133, 132, 122, 119, 114, 106, 104,  97, 90, 88,  79, 74, 72,  61, 56, 55,  39, 34, 33,   0,  0,  0,\n    168, 152, 132, 149, 136, 117, 132, 121, 104, 114, 105, 90,  97, 89, 76,  79, 73, 62,  61, 56, 46,  38, 34, 25,   0,  0,  0,\n    169, 151, 114, 150, 135, 101, 133, 121, 90, 114, 104, 77,  97, 89, 65,  80, 73, 51,  61, 56, 36,  38, 34, 16,   0,  0,  0,\n    170, 150, 94, 151, 135, 83, 134, 120, 73, 115, 104, 62,  98, 88, 51,  80, 72, 39,  61, 56, 24,  38, 34,  3,   0,  0,  0,\n    172, 150, 72, 153, 134, 63, 135, 119, 55, 115, 103, 45,  98, 88, 36,  80, 72, 24,  61, 55,  9,  38, 34,  0,   0,  0,  0,\n    172, 150, 54, 153, 134, 47, 135, 119, 38, 116, 103, 30,  98, 87, 21,  80, 72,  8,  62, 55,  0,  37, 34,  0,   0,  0,  0,\n    162, 134, 190, 145, 120, 171, 129, 108, 153, 113, 93, 134,  97, 78, 115,  80, 63, 96,  62, 46, 75,  41, 23, 51,   0,  0, 11,\n    165, 134, 173, 147, 120, 154, 131, 107, 138, 114, 92, 120,  97, 78, 103,  80, 63, 85,  62, 46, 66,  40, 23, 43,   0,  0,  2,\n    166, 134, 157, 148, 120, 140, 132, 106, 125, 114, 92, 109,  97, 77, 93,  81, 63, 77,  62, 46, 58,  40, 24, 36,   0,  0,  0,\n    168, 133, 140, 149, 119, 125, 132, 106, 112, 115, 92, 97,  98, 77, 82,  81, 62, 67,  62, 46, 50,  40, 24, 29,   0,  0,  0,\n    168, 133, 123, 150, 119, 110, 133, 106, 97, 115, 91, 84,  98, 77, 70,  81, 62, 57,  62, 46, 41,  40, 24, 20,   0,  0,  0,\n    169, 132, 107, 150, 118, 94, 133, 105, 84, 115, 91, 72,  98, 76, 60,  80, 62, 47,  62, 46, 32,  39, 25, 11,   0,  0,  0,\n    171, 132, 89, 152, 118, 79, 135, 105, 69, 115, 90, 58,  98, 76, 47,  80, 62, 36,  62, 46, 21,  39, 25,  0,   0,  0,  0,\n    171, 132, 69, 153, 117, 60, 135, 104, 52, 116, 90, 42,  98, 76, 33,  81, 61, 21,  62, 46,  6,  38, 25,  0,   0,  0,  0,\n    172, 132, 54, 153, 118, 45, 135, 104, 38, 116, 90, 28,  98, 76, 18,  81, 61,  6,  62, 46,  0,  38, 25,  0,   0,  0,  0,\n    164, 115, 177, 146, 103, 159, 130, 91, 143, 114, 78, 125,  97, 65, 107,  81, 51, 89,  63, 34, 69,  41,  9, 46,   0,  0,  4,\n    166, 115, 161, 148, 103, 144, 132, 91, 129, 115, 78, 112,  98, 65, 96,  81, 51, 79,  63, 35, 61,  41, 11, 38,   0,  0,  0,\n    167, 115, 146, 150, 102, 131, 132, 91, 117, 115, 78, 101,  98, 65, 86,  81, 51, 71,  63, 35, 54,  41, 12, 32,   0,  0,  0,\n    168, 114, 132, 150, 103, 118, 133, 91, 105, 116, 78, 91,  98, 64, 76,  82, 51, 61,  63, 36, 46,  41, 13, 24,   0,  0,  0,\n    169, 114, 116, 150, 102, 103, 134, 90, 91, 116, 78, 79,  98, 65, 66,  81, 51, 53,  63, 36, 37,  40, 14, 17,   0,  0,  0,\n    169, 114, 101, 151, 101, 89, 134, 90, 79, 116, 77, 67,  98, 64, 56,  81, 51, 44,  63, 36, 29,  40, 15,  7,   0,  0,  0,\n    170, 114, 85, 152, 101, 75, 135, 90, 65, 116, 77, 54,  98, 64, 44,  81, 51, 32,  63, 36, 17,  39, 15,  0,   0,  0,  0,\n    172, 113, 66, 152, 101, 58, 135, 89, 49, 116, 77, 40,  99, 64, 30,  81, 51, 18,  62, 36,  3,  38, 16,  0,   0,  0,  0,\n    171, 113, 51, 153, 101, 44, 136, 89, 36, 116, 77, 28,  99, 64, 18,  81, 51,  5,  62, 36,  0,  38, 16,  0,   0,  0,  0,\n    165, 94, 166, 147, 82, 147, 132, 72, 132, 115, 61, 115,  98, 49, 99,  82, 36, 82,  64, 19, 64,  42,  0, 41,   0,  0,  0,\n    167, 93, 150, 150, 83, 134, 133, 73, 120, 116, 62, 104,  99, 49, 88,  82, 36, 72,  64, 20, 55,  41,  0, 33,   0,  0,  0,\n    169, 93, 137, 150, 83, 122, 134, 73, 109, 116, 61, 94,  99, 50, 80,  82, 37, 65,  64, 21, 49,  41,  0, 27,   0,  0,  0,\n    169, 94, 123, 150, 83, 110, 133, 73, 97, 116, 61, 83,  99, 50, 70,  82, 38, 57,  63, 23, 42,  41,  0, 20,   0,  0,  0,\n    169, 94, 109, 150, 84, 97, 134, 73, 85, 116, 62, 73,  99, 51, 61,  81, 38, 48,  63, 23, 33,  41,  1, 11,   0,  0,  0,\n    170, 94, 96, 150, 83, 84, 134, 73, 74, 116, 61, 62,  99, 50, 51,  82, 38, 39,  64, 23, 24,  40,  3,  4,   0,  0,  0,\n    171, 93, 79, 152, 82, 70, 135, 73, 61, 116, 62, 51,  98, 51, 40,  81, 38, 28,  63, 24, 14,  39,  4,  0,   0,  0,  0,\n    171, 94, 64, 152, 83, 55, 135, 73, 47, 116, 62, 37,  98, 50, 27,  81, 38, 15,  63, 24,  1,  39,  4,  0,   0,  0,  0,\n    172, 93, 51, 153, 82, 42, 135, 73, 35, 117, 62, 26,  99, 51, 16,  81, 39,  3,  63, 25,  0,  38,  5,  0,   0,  0,  0,\n    166, 68, 153, 148, 59, 137, 133, 49, 121, 115, 39, 106,  99, 28, 91,  82, 13, 75,  65,  0, 58,  42,  0, 36,   0,  0,  0,\n    168, 68, 139, 150, 59, 124, 134, 50, 110, 116, 40, 96,  99, 30, 81,  82, 16, 66,  64,  0, 50,  41,  0, 29,   0,  0,  0,\n    169, 69, 126, 150, 59, 113, 134, 51, 101, 117, 42, 87, 100, 30, 73,  82, 17, 59,  65,  0, 43,  41,  0, 23,   0,  0,  0,\n    169, 70, 115, 150, 61, 102, 134, 52, 89, 116, 42, 77,  99, 32, 65,  82, 19, 52,  64,  0, 36,  41,  0, 15,   0,  0,  0,\n    169, 70, 101, 150, 61, 90, 134, 52, 79, 116, 43, 68,  99, 32, 55,  82, 21, 43,  64,  2, 28,  41,  0,  6,   0,  0,  0,\n    170, 70, 89, 151, 62, 79, 134, 53, 69, 116, 44, 58,  99, 33, 46,  81, 21, 34,  64,  3, 20,  41,  0,  2,   0,  0,  0,\n    170, 71, 76, 152, 62, 66, 134, 53, 57, 116, 43, 46,  99, 33, 36,  82, 22, 24,  64,  5, 10,  40,  0,  0,   0,  0,  0,\n    171, 70, 61, 152, 62, 52, 135, 53, 44, 116, 44, 35,  99, 34, 24,  82, 22, 12,  63,  6,  0,  39,  0,  0,   0,  0,  0,\n    171, 71, 49, 153, 62, 41, 135, 54, 33, 117, 45, 25,  98, 34, 13,  81, 23,  0,  63,  7,  0,  39,  0,  0,   0,  0,  0,\n    167, 33, 142, 149, 24, 127, 134, 10, 113, 116,  0, 97, 100,  0, 83,  83,  0, 68,  65,  0, 52,  40,  0, 30,   0,  0,  0,\n    169, 33, 129, 150, 26, 115, 134, 17, 102, 116,  3, 89, 100,  0, 75,  83,  0, 60,  65,  0, 45,  40,  0, 24,   0,  0,  0,\n    169, 36, 118, 151, 27, 104, 134, 19, 93, 116,  7, 80, 100,  0, 67,  83,  0, 54,  65,  0, 38,  41,  0, 17,   0,  0,  0,\n    169, 39, 107, 150, 30, 94, 134, 22, 84, 116, 11, 71,  99,  0, 59,  83,  0, 46,  64,  0, 31,  40,  0,  9,   0,  0,  0,\n    169, 39, 95, 151, 31, 83, 134, 24, 73, 116, 15, 62, 100,  1, 51,  83,  0, 38,  64,  0, 24,  40,  0,  5,   0,  0,  0,\n    169, 41, 83, 151, 33, 73, 134, 26, 64, 117, 17, 54,  99,  4, 42,  82,  0, 30,  64,  0, 16,  40,  0,  1,   0,  0,  0,\n    170, 42, 71, 152, 34, 62, 134, 28, 53, 117, 19, 44,  99,  6, 33,  82,  0, 21,  63,  0,  4,  39,  0,  0,   0,  0,  0,\n    171, 42, 59, 152, 35, 50, 134, 29, 42, 117, 21, 32,  99,  9, 22,  82,  0,  9,  63,  0,  0,  38,  0,  0,   0,  0,  0,\n    172, 42, 48, 152, 36, 40, 135, 29, 32, 117, 21, 23,  99, 10, 12,  82,  0,  0,  63,  0,  0,  38,  0,  0,   0,  0,  0,\n    107, 207, 246,  96, 185, 220,  86, 165, 196,  73, 144, 171,  60, 123, 147,  46, 103, 125,  32, 82, 100,   9, 56, 71,   0, 20, 33,\n    115, 206, 221, 104, 184, 198,  92, 164, 178,  78, 143, 154,  64, 123, 133,  51, 102, 111,  34, 81, 89,  10, 56, 63,   0, 20, 27,\n    122, 204, 200, 108, 183, 180,  95, 163, 161,  82, 142, 140,  68, 122, 120,  54, 102, 101,  36, 81, 79,  11, 56, 55,   0, 20, 20,\n    125, 203, 179, 111, 181, 160,  97, 162, 143,  85, 141, 124,  70, 121, 107,  55, 101, 89,  38, 80, 69,  14, 55, 46,   0, 19, 10,\n    128, 202, 156, 113, 180, 140, 102, 161, 125,  87, 140, 108,  71, 120, 92,  56, 100, 76,  39, 79, 59,  14, 55, 38,   0, 20,  3,\n    132, 200, 135, 117, 179, 121, 103, 159, 106,  88, 139, 93,  73, 119, 79,  57, 100, 65,  41, 79, 49,  15, 54, 28,   0, 19,  0,\n    134, 200, 111, 119, 178, 98, 105, 158, 87,  89, 138, 76,  74, 118, 64,  58, 99, 51,  41, 78, 37,  16, 54, 17,   0, 19,  0,\n    137, 199, 85, 122, 177, 75, 108, 158, 66,  91, 137, 56,  75, 118, 46,  59, 98, 35,  42, 78, 22,  16, 54,  3,   0, 19,  0,\n    140, 198, 62, 125, 177, 55, 109, 158, 47,  92, 137, 40,  76, 117, 32,  59, 98, 21,  42, 78,  6,  16, 54,  0,   0, 18,  0,\n    118, 186, 231, 106, 167, 206,  93, 149, 184,  81, 130, 161,  67, 111, 139,  54, 92, 117,  39, 72, 93,  17, 48, 66,   0, 10, 29,\n    123, 185, 207, 110, 166, 186,  98, 148, 167,  85, 129, 145,  71, 111, 125,  56, 92, 104,  40, 72, 83,  18, 48, 57,   0, 10, 22,\n    128, 184, 188, 113, 165, 168, 102, 147, 151,  88, 128, 131,  73, 110, 113,  58, 91, 94,  42, 71, 74,  19, 48, 50,   0,  9, 15,\n    131, 183, 168, 116, 164, 151, 104, 146, 134,  89, 127, 117,  73, 109, 100,  58, 90, 83,  42, 71, 65,  20, 48, 42,   0,  9,  5,\n    134, 182, 148, 120, 163, 131, 105, 145, 118,  90, 126, 102,  75, 108, 86,  59, 90, 72,  43, 71, 55,  19, 47, 34,   0,  9,  0,\n    136, 181, 128, 122, 162, 115, 107, 144, 102,  92, 125, 87,  76, 107, 74,  61, 89, 60,  44, 70, 45,  20, 47, 24,   0,  8,  0,\n    139, 180, 106, 124, 161, 95, 109, 144, 83,  93, 124, 71,  77, 107, 60,  61, 89, 47,  44, 70, 33,  20, 47, 13,   0,  8,  0,\n    142, 179, 82, 125, 160, 72, 111, 143, 63,  94, 124, 54,  77, 106, 44,  61, 88, 32,  44, 69, 18,  20, 46,  0,   0,  8,  0,\n    143, 179, 62, 127, 160, 54, 111, 142, 47,  94, 124, 39,  78, 106, 29,  62, 88, 18,  45, 69,  3,  20, 46,  0,   0,  8,  0,\n    124, 167, 216, 112, 150, 194,  99, 134, 174,  87, 117, 153,  73, 100, 131,  58, 82, 110,  43, 64, 88,  23, 40, 61,   0,  0, 24,\n    129, 166, 195, 116, 150, 175, 103, 134, 158,  89, 116, 137,  75, 99, 118,  60, 82, 98,  44, 63, 78,  23, 40, 53,   0,  0, 17,\n    132, 166, 177, 119, 149, 160, 106, 133, 143,  90, 115, 124,  76, 99, 107,  61, 81, 88,  45, 63, 69,  24, 40, 46,   0,  0,  9,\n    136, 166, 159, 121, 148, 143, 107, 132, 126,  92, 115, 111,  77, 98, 94,  62, 81, 78,  46, 63, 60,  23, 40, 38,   0,  0,  0,\n    138, 164, 140, 122, 147, 125, 108, 131, 111,  93, 114, 97,  79, 98, 82,  63, 80, 67,  46, 62, 50,  24, 40, 29,   0,  0,  0,\n    139, 163, 122, 124, 146, 109, 110, 131, 96,  94, 114, 83,  79, 97, 70,  63, 81, 57,  46, 62, 41,  24, 40, 21,   0,  0,  0,\n    141, 163, 101, 126, 145, 90, 111, 130, 79,  95, 113, 68,  79, 96, 56,  63, 80, 44,  47, 62, 30,  23, 40, 10,   0,  0,  0,\n    144, 162, 79, 127, 145, 70, 112, 129, 60,  95, 112, 51,  79, 96, 41,  64, 79, 30,  47, 61, 15,  23, 40,  0,   0,  0,  0,\n    145, 162, 60, 129, 145, 52, 113, 129, 46,  96, 112, 37,  79, 95, 27,  64, 79, 16,  47, 61,  1,  23, 39,  0,   0,  0,  0,\n    131, 147, 202, 117, 133, 181, 105, 119, 162,  91, 103, 142,  77, 87, 122,  62, 71, 102,  47, 54, 81,  26, 31, 56,   0,  0, 18,\n    135, 147, 183, 120, 132, 164, 107, 118, 147,  93, 102, 128,  78, 87, 110,  63, 71, 92,  47, 54, 72,  26, 31, 48,   0,  0, 10,\n    138, 147, 166, 123, 131, 149, 108, 118, 133,  94, 102, 116,  79, 86, 100,  64, 71, 82,  48, 54, 64,  27, 31, 41,   0,  0,  2,\n    139, 146, 149, 124, 131, 134, 111, 117, 119,  94, 101, 103,  79, 86, 88,  64, 70, 72,  48, 53, 55,  27, 31, 33,   0,  0,  0,\n    141, 146, 132, 125, 131, 117, 111, 117, 104,  95, 101, 91,  80, 86, 77,  65, 70, 62,  48, 53, 46,  26, 31, 25,   0,  0,  0,\n    143, 145, 115, 126, 130, 101, 112, 116, 90,  96, 100, 78,  80, 85, 65,  65, 70, 52,  49, 53, 37,  27, 32, 17,   0,  0,  0,\n    144, 144, 96, 128, 129, 85, 112, 115, 75,  97, 100, 64,  81, 85, 52,  65, 69, 40,  49, 53, 26,  26, 31,  5,   0,  0,  0,\n    146, 144, 76, 129, 129, 67, 114, 115, 58,  97, 99, 48,  82, 84, 38,  66, 69, 27,  49, 53, 12,  26, 32,  0,   0,  0,  0,\n    146, 144, 59, 130, 128, 51, 114, 114, 43,  98, 99, 35,  82, 84, 25,  66, 69, 13,  49, 53,  0,  26, 32,  0,   0,  0,  0,\n    135, 129, 189, 122, 115, 170, 107, 103, 152,  94, 89, 133,  79, 74, 114,  64, 60, 95,  49, 43, 75,  29, 20, 51,   0,  0, 12,\n    138, 129, 171, 124, 115, 153, 110, 103, 138,  95, 89, 120,  81, 74, 103,  66, 60, 86,  50, 44, 67,  28, 21, 43,   0,  0,  3,\n    140, 129, 156, 125, 115, 140, 111, 103, 125,  96, 89, 109,  81, 74, 93,  67, 60, 76,  50, 44, 59,  29, 22, 36,   0,  0,  0,\n    142, 128, 140, 127, 115, 125, 112, 102, 112,  97, 88, 97,  82, 74, 83,  67, 60, 67,  50, 44, 51,  29, 22, 29,   0,  0,  0,\n    142, 128, 124, 127, 114, 111, 113, 102, 98,  98, 88, 85,  82, 74, 71,  66, 60, 58,  50, 44, 42,  29, 22, 21,   0,  0,  0,\n    144, 127, 108, 128, 114, 96, 113, 101, 85,  98, 87, 73,  82, 74, 61,  67, 60, 48,  50, 44, 33,  28, 23, 12,   0,  0,  0,\n    145, 127, 91, 129, 114, 81, 115, 101, 71,  98, 87, 60,  82, 73, 48,  67, 59, 37,  50, 44, 22,  29, 23,  1,   0,  0,  0,\n    147, 127, 73, 130, 113, 63, 115, 101, 55,  98, 87, 45,  83, 73, 35,  67, 59, 24,  50, 44, 10,  28, 24,  0,   0,  0,  0,\n    147, 127, 58, 131, 113, 49, 115, 100, 42,  99, 86, 33,  83, 73, 23,  67, 59, 10,  50, 44,  0,  27, 24,  0,   0,  0,  0,\n    138, 110, 177, 124, 99, 159, 110, 88, 142,  96, 75, 125,  82, 62, 107,  66, 48, 89,  51, 33, 70,  30,  8, 46,   0,  0,  5,\n    142, 111, 160, 127, 99, 144, 113, 88, 130,  98, 75, 112,  82, 62, 96,  68, 49, 80,  51, 33, 61,  30, 10, 39,   0,  0,  0,\n    143, 111, 146, 128, 99, 131, 114, 88, 118,  98, 75, 101,  83, 62, 86,  68, 49, 71,  52, 33, 54,  30, 11, 32,   0,  0,  0,\n    144, 111, 132, 128, 99, 118, 113, 88, 106,  99, 75, 91,  83, 62, 77,  68, 49, 62,  52, 34, 46,  30, 12, 25,   0,  0,  0,\n    144, 111, 117, 129, 98, 104, 114, 87, 92,  99, 75, 80,  83, 62, 67,  68, 49, 53,  51, 34, 38,  30, 13, 18,   0,  0,  0,\n    145, 111, 103, 130, 98, 91, 114, 87, 80,  99, 75, 68,  83, 63, 57,  68, 50, 45,  51, 34, 30,  30, 14,  8,   0,  0,  0,\n    146, 110, 87, 131, 98, 76, 115, 87, 67,  99, 75, 56,  83, 62, 45,  68, 49, 33,  52, 35, 19,  30, 15,  2,   0,  0,  0,\n    148, 110, 70, 131, 98, 60, 116, 86, 52,  99, 74, 43,  84, 62, 33,  69, 49, 21,  52, 35,  6,  29, 15,  0,   0,  0,  0,\n    148, 110, 56, 132, 97, 48, 117, 87, 40, 100, 75, 31,  84, 62, 22,  68, 49,  9,  51, 35,  0,  28, 15,  0,   0,  0,  0,\n    142, 91, 166, 126, 80, 148, 113, 71, 132,  98, 59, 115,  83, 47, 99,  69, 34, 82,  53, 17, 64,  32,  0, 41,   0,  0,  0,\n    143, 91, 150, 128, 81, 135, 114, 71, 120,  99, 60, 104,  85, 48, 89,  69, 35, 73,  53, 19, 56,  32,  0, 34,   0,  0,  0,\n    145, 91, 137, 129, 81, 122, 115, 71, 109, 100, 60, 94,  85, 48, 81,  69, 35, 65,  53, 19, 49,  32,  0, 28,   0,  0,  0,\n    146, 92, 124, 130, 81, 110, 115, 71, 98, 100, 60, 84,  85, 49, 71,  69, 36, 57,  53, 21, 42,  32,  0, 21,   0,  0,  0,\n    147, 91, 110, 130, 81, 97, 115, 71, 86, 100, 60, 74,  84, 49, 62,  69, 36, 48,  53, 22, 34,  32,  0, 13,   0,  0,  0,\n    147, 92, 97, 130, 81, 85, 116, 72, 76, 100, 60, 63,  85, 49, 52,  69, 37, 40,  53, 22, 26,  31,  1,  5,   0,  0,  0,\n    148, 92, 82, 131, 81, 71, 116, 71, 62, 100, 60, 53,  84, 49, 42,  69, 37, 30,  52, 23, 16,  31,  2,  0,   0,  0,  0,\n    148, 91, 67, 132, 81, 57, 117, 71, 49, 100, 60, 39,  84, 49, 30,  69, 37, 18,  52, 23,  2,  30,  2,  0,   0,  0,  0,\n    149, 91, 54, 132, 81, 46, 118, 71, 39, 101, 60, 29,  85, 49, 19,  69, 37,  6,  52, 23,  0,  29,  3,  0,   0,  0,  0,\n    143, 68, 153, 128, 59, 137, 115, 49, 122,  99, 39, 107,  85, 28, 91,  70, 13, 75,  54,  0, 58,  32,  0, 36,   0,  0,  0,\n    146, 68, 140, 131, 59, 125, 116, 51, 111, 100, 40, 97,  85, 29, 82,  70, 15, 67,  54,  0, 50,  32,  0, 29,   0,  0,  0,\n    147, 68, 127, 131, 59, 114, 117, 51, 102, 101, 41, 88,  86, 30, 74,  70, 17, 60,  54,  0, 44,  32,  0, 23,   0,  0,  0,\n    147, 70, 115, 131, 60, 103, 116, 52, 91, 100, 42, 78,  85, 32, 65,  70, 19, 53,  54,  1, 38,  32,  0, 17,   0,  0,  0,\n    147, 70, 103, 131, 61, 91, 117, 53, 81, 101, 43, 69,  86, 32, 57,  70, 20, 44,  54,  2, 30,  32,  0,  7,   0,  0,  0,\n    148, 70, 91, 132, 61, 80, 117, 52, 70, 101, 43, 59,  85, 33, 48,  70, 21, 36,  53,  4, 22,  32,  0,  3,   0,  0,  0,\n    148, 70, 78, 132, 62, 68, 117, 53, 58, 101, 43, 48,  85, 34, 38,  70, 22, 26,  53,  6, 12,  31,  0,  0,   0,  0,  0,\n    149, 71, 64, 132, 62, 54, 118, 54, 46, 101, 44, 37,  85, 34, 27,  69, 23, 15,  53,  7,  1,  30,  0,  0,   0,  0,  0,\n    150, 70, 53, 134, 61, 44, 118, 54, 36, 101, 44, 28,  85, 35, 17,  69, 23,  4,  52,  8,  0,  30,  0,  0,   0,  0,  0,\n    145, 38, 143, 130, 29, 128, 117, 18, 114, 101,  3, 98,  87,  0, 84,  72,  0, 69,  54,  0, 53,  30,  0, 31,   0,  0,  0,\n    147, 38, 130, 132, 30, 116, 117, 22, 103, 101,  8, 89,  87,  0, 76,  72,  0, 62,  54,  0, 46,  30,  0, 24,   0,  0,  0,\n    148, 40, 119, 132, 31, 105, 117, 23, 94, 101, 13, 81,  87,  0, 68,  71,  0, 55,  54,  0, 39,  30,  0, 18,   0,  0,  0,\n    148, 42, 108, 132, 34, 96, 117, 25, 85, 102, 15, 73,  86,  2, 60,  71,  0, 47,  54,  0, 33,  30,  0, 11,   0,  0,  0,\n    148, 43, 96, 133, 35, 85, 117, 28, 75, 102, 18, 64,  87,  5, 52,  71,  0, 40,  54,  0, 25,  30,  0,  5,   0,  0,  0,\n    149, 44, 85, 132, 36, 75, 118, 29, 66, 101, 20, 55,  86,  8, 44,  70,  0, 32,  53,  0, 18,  29,  0,  2,   0,  0,  0,\n    149, 45, 74, 133, 37, 64, 118, 31, 55, 102, 21, 45,  85, 10, 34,  70,  0, 22,  53,  0,  6,  28,  0,  0,   0,  0,  0,\n    150, 46, 61, 133, 39, 52, 118, 31, 44, 102, 23, 34,  85, 12, 24,  70,  0, 12,  52,  0,  0,  28,  0,  0,   0,  0,  0,\n    150, 46, 51, 133, 40, 42, 119, 32, 35, 102, 24, 25,  85, 13, 14,  70,  0,  1,  52,  0,  0,  27,  0,  0,   0,  0,  0,\n    53, 198, 244,  49, 177, 218,  41, 158, 195,  32, 138, 171,  22, 118, 147,  11, 98, 124,   0, 78, 100,   0, 54, 71,   0, 18, 34,\n    69, 196, 220,  64, 175, 196,  54, 157, 176,  45, 137, 154,  32, 117, 133,  19, 98, 111,   0, 78, 89,   0, 53, 63,   0, 17, 27,\n    80, 195, 198,  69, 175, 179,  60, 156, 159,  50, 136, 139,  38, 116, 120,  25, 98, 101,   4, 77, 80,   0, 53, 55,   0, 17, 21,\n    84, 193, 177,  75, 173, 159,  64, 155, 142,  55, 135, 124,  41, 116, 107,  27, 97, 89,   9, 76, 70,   0, 53, 47,   0, 17, 11,\n    89, 193, 157,  79, 172, 140,  70, 154, 125,  57, 134, 109,  44, 115, 92,  32, 96, 76,  13, 76, 59,   0, 52, 39,   0, 16,  4,\n    94, 191, 135,  85, 171, 121,  72, 152, 108,  60, 133, 94,  47, 114, 80,  32, 95, 65,  15, 76, 49,   0, 52, 29,   0, 16,  0,\n    98, 190, 113,  87, 170, 100,  76, 152, 89,  62, 132, 77,  49, 113, 65,  35, 95, 52,  18, 75, 37,   0, 52, 18,   0, 15,  0,\n    103, 190, 89,  90, 169, 80,  78, 151, 70,  64, 132, 60,  51, 113, 49,  37, 94, 38,  20, 75, 25,   0, 52,  5,   0, 15,  0,\n    106, 189, 69,  93, 169, 61,  80, 151, 53,  66, 131, 45,  52, 113, 36,  37, 94, 25,  19, 74, 11,   0, 51,  0,   0, 15,  0,\n    76, 178, 229,  68, 159, 205,  61, 142, 183,  50, 124, 160,  40, 106, 138,  28, 88, 116,  12, 69, 93,   0, 45, 66,   0,  5, 29,\n    86, 177, 207,  78, 158, 184,  67, 142, 166,  56, 123, 145,  45, 106, 125,  31, 88, 105,  16, 69, 83,   0, 45, 58,   0,  6, 22,\n    93, 176, 187,  81, 158, 168,  71, 141, 150,  61, 123, 131,  47, 105, 113,  35, 87, 94,  20, 68, 74,   0, 45, 51,   0,  5, 16,\n    98, 175, 168,  84, 157, 150,  75, 140, 134,  63, 122, 117,  50, 104, 100,  37, 87, 83,  21, 68, 65,   0, 45, 42,   0,  4,  7,\n    100, 174, 149,  89, 155, 132,  76, 139, 117,  65, 121, 102,  53, 104, 87,  39, 86, 72,  23, 67, 55,   0, 45, 34,   0,  3,  0,\n    103, 173, 130,  92, 155, 115,  80, 138, 102,  68, 120, 88,  53, 103, 75,  40, 86, 61,  24, 67, 45,   0, 45, 25,   0,  3,  0,\n    107, 172, 108,  95, 154, 96,  82, 137, 85,  70, 119, 73,  55, 102, 61,  42, 85, 49,  25, 67, 34,   0, 45, 14,   0,  3,  0,\n    110, 172, 86,  97, 153, 76,  85, 137, 67,  70, 119, 57,  56, 102, 46,  42, 84, 35,  26, 66, 21,   0, 44,  1,   0,  3,  0,\n    112, 171, 67,  98, 153, 59,  86, 137, 52,  71, 119, 44,  58, 102, 34,  44, 85, 22,  27, 66,  7,   0, 44,  0,   0,  3,  0,\n    90, 160, 215,  81, 144, 193,  70, 129, 173,  61, 112, 151,  49, 95, 131,  37, 79, 109,  22, 61, 87,   0, 38, 61,   0,  0, 25,\n    96, 160, 194,  86, 143, 174,  75, 128, 157,  65, 112, 137,  53, 95, 117,  40, 78, 98,  25, 60, 78,   0, 38, 53,   0,  0, 17,\n    100, 159, 177,  89, 143, 159,  79, 128, 143,  67, 111, 124,  55, 95, 107,  42, 78, 89,  27, 60, 70,   2, 38, 46,   0,  0,  9,\n    104, 158, 159,  92, 142, 143,  81, 127, 127,  69, 110, 110,  56, 94, 94,  43, 78, 78,  28, 60, 60,   2, 38, 38,   0,  0,  1,\n    107, 157, 140,  94, 141, 125,  82, 126, 112,  71, 110, 97,  59, 94, 82,  45, 77, 67,  29, 59, 51,   4, 37, 30,   0,  0,  0,\n    110, 156, 122,  97, 140, 109,  85, 125, 97,  72, 109, 83,  58, 93, 71,  45, 77, 57,  29, 60, 42,   5, 38, 22,   0,  0,  0,\n    111, 156, 103,  99, 139, 91,  87, 125, 81,  73, 108, 69,  60, 92, 58,  46, 77, 45,  30, 59, 31,   5, 38, 12,   0,  0,  0,\n    115, 156, 82, 101, 140, 73,  88, 124, 63,  74, 108, 53,  60, 92, 44,  46, 76, 32,  31, 59, 18,   6, 37,  0,   0,  0,  0,\n    116, 155, 65, 102, 139, 58,  89, 124, 49,  75, 108, 41,  61, 92, 32,  48, 76, 21,  31, 59,  6,   5, 37,  0,   0,  0,  0,\n    100, 141, 201,  88, 127, 181,  79, 114, 162,  69, 99, 142,  57, 83, 122,  44, 68, 102,  30, 51, 81,   7, 28, 56,   0,  0, 19,\n    105, 141, 182,  94, 127, 163,  83, 114, 146,  71, 98, 128,  59, 83, 110,  46, 68, 91,  31, 51, 72,  10, 28, 48,   0,  0, 11,\n    108, 141, 166,  96, 127, 149,  85, 113, 133,  73, 98, 116,  60, 83, 99,  46, 68, 82,  32, 51, 64,  11, 29, 41,   0,  0,  2,\n    111, 141, 149,  98, 126, 134,  88, 112, 119,  74, 97, 103,  61, 83, 88,  48, 67, 72,  33, 51, 56,  11, 29, 34,   0,  0,  0,\n    112, 140, 132, 100, 125, 118,  89, 112, 105,  75, 97, 91,  62, 82, 77,  49, 68, 62,  33, 51, 47,  12, 29, 26,   0,  0,  0,\n    115, 140, 116, 102, 125, 103,  90, 111, 91,  76, 96, 78,  62, 82, 65,  49, 67, 52,  34, 51, 38,  13, 29, 18,   0,  0,  0,\n    117, 139, 97, 103, 124, 87,  91, 111, 77,  78, 96, 65,  63, 81, 54,  49, 67, 41,  34, 51, 27,  12, 29,  7,   0,  0,  0,\n    119, 138, 78, 105, 124, 69,  92, 110, 60,  78, 95, 50,  65, 81, 40,  50, 67, 29,  34, 51, 15,  13, 30,  0,   0,  0,  0,\n    120, 138, 64, 106, 124, 54,  93, 110, 47,  78, 95, 38,  65, 81, 29,  50, 66, 17,  34, 50,  2,  13, 29,  0,   0,  0,  0,\n    107, 124, 189,  96, 111, 169,  85, 99, 152,  73, 85, 132,  61, 71, 114,  48, 57, 95,  34, 41, 75,  14, 18, 51,   0,  0, 13,\n    111, 124, 171, 100, 111, 153,  88, 99, 137,  75, 85, 120,  63, 72, 103,  50, 58, 85,  36, 41, 66,  15, 19, 43,   0,  0,  4,\n    113, 124, 156, 101, 111, 139,  90, 99, 125,  77, 85, 109,  64, 71, 93,  51, 57, 77,  36, 42, 59,  17, 20, 37,   0,  0,  0,\n    115, 124, 140, 103, 111, 125,  90, 99, 112,  78, 85, 97,  64, 71, 82,  52, 57, 67,  36, 42, 50,  16, 20, 30,   0,  0,  0,\n    117, 123, 125, 104, 110, 111,  92, 98, 99,  79, 85, 86,  65, 71, 72,  51, 58, 59,  37, 42, 43,  17, 21, 22,   0,  0,  0,\n    118, 123, 110, 105, 110, 97,  93, 98, 86,  78, 84, 74,  66, 71, 62,  52, 57, 49,  37, 42, 34,  17, 22, 14,   0,  0,  0,\n    120, 123, 93, 106, 109, 82,  94, 97, 72,  80, 84, 61,  66, 71, 50,  52, 57, 38,  37, 42, 24,  17, 22,  2,   0,  0,  0,\n    121, 122, 75, 108, 109, 66,  95, 97, 58,  80, 84, 48,  66, 71, 37,  52, 57, 26,  37, 42, 12,  16, 22,  0,   0,  0,  0,\n    122, 123, 62, 108, 109, 52,  95, 97, 45,  81, 84, 36,  67, 70, 26,  52, 57, 14,  37, 42,  0,  15, 22,  0,   0,  0,  0,\n    113, 107, 177, 102, 96, 159,  89, 85, 141,  78, 72, 124,  65, 60, 107,  52, 46, 89,  37, 30, 70,  18,  5, 46,   0,  0,  6,\n    116, 107, 160, 104, 96, 144,  92, 85, 129,  80, 72, 112,  67, 60, 96,  53, 47, 80,  38, 31, 62,  19,  7, 39,   0,  0,  0,\n    118, 107, 147, 105, 96, 131,  93, 85, 118,  80, 72, 101,  67, 60, 87,  54, 47, 71,  39, 31, 54,  19,  8, 32,   0,  0,  0,\n    119, 107, 132, 106, 96, 118,  94, 85, 106,  81, 73, 91,  67, 60, 77,  54, 47, 63,  39, 32, 47,  20,  9, 25,   0,  0,  0,\n    119, 107, 118, 106, 95, 105,  94, 85, 93,  81, 72, 80,  68, 60, 68,  54, 47, 54,  39, 32, 39,  20, 11, 18,   0,  0,  0,\n    121, 107, 104, 107, 96, 92,  95, 84, 80,  81, 72, 69,  68, 61, 58,  54, 48, 46,  39, 33, 31,  20, 12,  9,   0,  0,  0,\n    123, 107, 88, 108, 95, 77,  96, 84, 68,  82, 72, 57,  68, 60, 46,  54, 47, 35,  39, 33, 20,  19, 13,  2,   0,  0,  0,\n    123, 106, 72, 110, 95, 63,  96, 84, 54,  82, 72, 45,  69, 60, 35,  55, 48, 23,  39, 33,  9,  18, 14,  0,   0,  0,  0,\n    125, 106, 60, 110, 94, 50,  98, 84, 42,  83, 72, 34,  69, 60, 25,  55, 48, 12,  39, 33,  0,  17, 13,  0,   0,  0,  0,\n    118, 89, 165, 105, 79, 148,  93, 69, 132,  81, 57, 115,  68, 45, 99,  55, 32, 82,  41, 15, 64,  21,  0, 41,   0,  0,  0,\n    120, 89, 150, 107, 79, 135,  96, 69, 121,  82, 58, 105,  70, 46, 89,  56, 34, 73,  41, 17, 56,  21,  0, 34,   0,  0,  0,\n    121, 89, 137, 108, 79, 123,  96, 69, 109,  82, 58, 95,  70, 47, 81,  56, 34, 66,  41, 18, 49,  21,  0, 28,   0,  0,  0,\n    122, 90, 124, 109, 79, 110,  96, 69, 99,  83, 58, 85,  70, 47, 72,  56, 35, 58,  41, 19, 42,  21,  0, 22,   0,  0,  0,\n    123, 90, 111, 110, 79, 98,  97, 69, 87,  83, 59, 75,  70, 47, 63,  56, 35, 50,  41, 20, 35,  21,  0, 14,   0,  0,  0,\n    123, 90, 98, 110, 79, 87,  97, 70, 76,  84, 58, 64,  70, 48, 53,  56, 36, 41,  40, 21, 26,  21,  0,  5,   0,  0,  0,\n    125, 89, 84, 111, 79, 73,  97, 69, 64,  84, 59, 54,  70, 48, 43,  56, 36, 31,  40, 22, 17,  20,  1,  1,   0,  0,  0,\n    125, 89, 69, 112, 79, 60,  98, 70, 51,  84, 59, 42,  70, 48, 32,  56, 36, 20,  41, 22,  5,  19,  2,  0,   0,  0,  0,\n    126, 89, 57, 112, 79, 49,  99, 70, 41,  84, 59, 32,  70, 48, 22,  56, 36, 10,  40, 22,  0,  18,  2,  0,   0,  0,  0,\n    121, 67, 154, 108, 58, 138,  97, 50, 124,  84, 39, 107,  71, 28, 92,  58, 12, 76,  43,  0, 59,  20,  0, 37,   0,  0,  0,\n    124, 68, 140, 111, 59, 126,  98, 50, 112,  84, 40, 98,  71, 29, 83,  58, 15, 67,  42,  0, 51,  20,  0, 30,   0,  0,  0,\n    124, 68, 129, 111, 59, 114,  99, 51, 102,  86, 41, 88,  71, 30, 75,  58, 17, 60,  42,  0, 45,  20,  0, 24,   0,  0,  0,\n    125, 70, 116, 111, 60, 103,  99, 51, 92,  85, 41, 79,  71, 31, 66,  58, 19, 53,  42,  3, 38,  20,  0, 17,   0,  0,  0,\n    125, 70, 104, 111, 61, 93,  99, 52, 81,  85, 43, 69,  72, 32, 58,  58, 20, 45,  42,  4, 31,  20,  0,  8,   0,  0,  0,\n    126, 70, 92, 111, 61, 81,  99, 52, 71,  85, 42, 60,  71, 33, 49,  57, 21, 37,  42,  6, 23,  20,  0,  3,   0,  0,  0,\n    126, 70, 79, 112, 61, 70,  99, 53, 60,  85, 43, 50,  71, 33, 39,  57, 22, 28,  41,  7, 13,  19,  0,  0,   0,  0,  0,\n    127, 71, 66, 113, 62, 56, 100, 53, 48,  86, 44, 39,  71, 34, 29,  57, 23, 18,  41,  8,  2,  18,  0,  0,   0,  0,  0,\n    128, 70, 55, 114, 62, 46, 100, 54, 39,  86, 44, 30,  71, 34, 20,  57, 23,  7,  41,  9,  0,  18,  0,  0,   0,  0,  0,\n    124, 41, 145, 111, 32, 128,  99, 23, 114,  86, 10, 100,  73,  0, 85,  60,  0, 71,  43,  0, 54,  17,  0, 32,   0,  0,  0,\n    126, 42, 131, 113, 33, 117, 100, 25, 104,  86, 14, 90,  73,  0, 77,  60,  0, 63,  44,  0, 47,  18,  0, 25,   0,  0,  0,\n    127, 43, 120, 113, 34, 106, 101, 26, 95,  86, 17, 82,  73,  2, 69,  59,  0, 56,  43,  0, 41,  18,  0, 19,   0,  0,  0,\n    127, 45, 109, 113, 37, 97, 101, 28, 85,  86, 19, 74,  73,  5, 61,  59,  0, 48,  43,  0, 34,  19,  0, 11,   0,  0,  0,\n    127, 46, 98, 114, 38, 86, 100, 30, 76,  87, 21, 65,  73,  9, 54,  59,  0, 41,  43,  0, 26,  18,  0,  5,   0,  0,  0,\n    127, 47, 87, 113, 39, 76, 101, 31, 67,  86, 22, 56,  72, 11, 45,  59,  0, 33,  43,  0, 19,  18,  0,  2,   0,  0,  0,\n    128, 48, 75, 114, 39, 65, 101, 33, 56,  86, 23, 46,  72, 12, 36,  58,  0, 24,  42,  0,  9,  17,  0,  0,   0,  0,  0,\n    129, 48, 63, 114, 41, 54, 102, 33, 46,  87, 24, 36,  72, 14, 26,  58,  1, 14,  42,  0,  2,  16,  0,  0,   0,  0,  0,\n    128, 48, 53, 114, 41, 44, 102, 34, 37,  87, 25, 27,  72, 15, 17,  58,  1,  3,  41,  0,  0,  15,  0,  0,   0,  0,  0,\n    0, 189, 242,   0, 169, 217,   0, 151, 194,   0, 132, 170,   0, 113, 147,   0, 94, 123,   0, 74, 99,   0, 51, 71,   0, 15, 34,\n    1, 187, 219,   1, 167, 195,   0, 150, 175,   0, 131, 153,   0, 113, 132,   0, 94, 111,   0, 74, 89,   0, 50, 63,   0, 13, 28,\n    1, 186, 198,   1, 167, 178,   0, 149, 158,   0, 130, 139,   0, 111, 119,   0, 93, 100,   0, 74, 80,   0, 50, 55,   0, 13, 22,\n    1, 185, 176,   1, 165, 159,   1, 148, 142,   0, 129, 123,   0, 111, 106,   0, 93, 89,   0, 73, 70,   0, 50, 47,   0, 13, 13,\n    1, 184, 157,   1, 164, 141,   1, 147, 125,   0, 128, 110,   0, 110, 93,   0, 92, 77,   0, 73, 60,   0, 50, 39,   0, 12,  5,\n    25, 182, 137,  25, 163, 122,  17, 146, 109,   0, 128, 96,   0, 110, 81,   0, 92, 66,   0, 73, 51,   0, 50, 30,   0, 10,  0,\n    42, 181, 114,  35, 163, 102,  30, 145, 91,  14, 127, 80,   0, 109, 67,   0, 91, 53,   0, 72, 39,   0, 50, 19,   0, 10,  0,\n    52, 181, 92,  43, 162, 83,  32, 145, 73,  19, 126, 63,   0, 108, 52,   0, 90, 40,   0, 72, 27,   0, 50,  7,   0, 10,  0,\n    57, 181, 74,  48, 162, 66,  37, 144, 57,  24, 126, 49,   7, 108, 40,   0, 90, 29,   0, 72, 15,   0, 49,  0,   0, 10,  0,\n    1, 170, 227,   1, 152, 203,   0, 136, 182,   0, 119, 159,   0, 101, 137,   0, 84, 115,   0, 65, 92,   0, 43, 66,   0,  1, 29,\n    1, 169, 206,   1, 151, 184,   1, 136, 165,   0, 118, 144,   0, 102, 125,   0, 84, 105,   0, 65, 83,   0, 43, 58,   0,  0, 22,\n    29, 168, 186,  21, 151, 167,  14, 135, 150,   4, 118, 131,   0, 101, 112,   0, 83, 94,   0, 65, 75,   0, 43, 51,   0,  0, 16,\n    41, 167, 167,  33, 150, 150,  31, 134, 134,  19, 117, 117,   4, 100, 100,   0, 83, 83,   0, 65, 65,   0, 42, 43,   0,  0,  8,\n    48, 167, 149,  41, 149, 133,  33, 133, 118,  25, 116, 103,  13, 99, 88,   0, 83, 73,   0, 65, 56,   0, 42, 35,   0,  0,  0,\n    58, 165, 130,  49, 148, 115,  42, 132, 103,  31, 115, 89,  18, 99, 75,   0, 82, 61,   0, 64, 46,   0, 42, 26,   0,  0,  0,\n    62, 164, 110,  55, 147, 97,  45, 132, 87,  35, 115, 75,  22, 98, 63,   5, 82, 50,   0, 64, 36,   0, 42, 16,   0,  0,  0,\n    69, 164, 89,  60, 147, 78,  50, 131, 70,  37, 114, 59,  26, 98, 49,  10, 81, 37,   0, 64, 24,   0, 42,  4,   0,  0,  0,\n    71, 164, 71,  63, 147, 63,  53, 131, 55,  40, 114, 47,  28, 98, 38,  13, 81, 26,   0, 64, 12,   0, 42,  0,   0,  0,  0,\n    28, 153, 214,  24, 138, 193,  23, 123, 171,  16, 107, 150,   0, 91, 130,   0, 75, 109,   0, 58, 87,   0, 35, 61,   0,  0, 25,\n    48, 153, 194,  41, 138, 174,  34, 123, 156,  27, 107, 136,  16, 91, 117,   1, 75, 98,   0, 57, 78,   0, 35, 53,   0,  0, 17,\n    55, 153, 177,  47, 137, 158,  42, 122, 142,  33, 107, 124,  22, 91, 106,   6, 75, 88,   0, 57, 70,   0, 35, 46,   0,  0,  9,\n    61, 152, 158,  53, 136, 143,  45, 122, 127,  36, 106, 111,  24, 90, 94,  10, 74, 78,   0, 57, 61,   0, 35, 39,   0,  0,  2,\n    67, 151, 141,  59, 135, 126,  49, 121, 112,  39, 105, 98,  29, 90, 83,  14, 74, 68,   0, 57, 52,   0, 35, 31,   0,  0,  0,\n    71, 150, 123,  62, 135, 110,  54, 120, 98,  42, 105, 84,  31, 89, 71,  16, 74, 58,   0, 57, 43,   0, 35, 22,   0,  0,  0,\n    74, 150, 105,  64, 134, 92,  55, 120, 83,  45, 104, 71,  34, 89, 59,  20, 73, 47,   0, 57, 32,   0, 35, 13,   0,  0,  0,\n    78, 149, 84,  69, 134, 75,  59, 120, 66,  47, 103, 56,  34, 88, 46,  22, 73, 34,   1, 57, 20,   0, 35,  1,   0,  0,  0,\n    80, 149, 69,  70, 133, 61,  60, 119, 53,  49, 103, 44,  36, 88, 35,  23, 73, 24,   2, 56, 10,   0, 35,  0,   0,  0,  0,\n    58, 136, 200,  50, 122, 180,  45, 109, 162,  38, 94, 141,  27, 80, 121,  15, 65, 102,   0, 48, 81,   0, 26, 56,   0,  0, 19,\n    66, 136, 182,  59, 122, 163,  52, 109, 146,  42, 94, 128,  32, 80, 109,  20, 65, 91,   2, 48, 72,   0, 26, 49,   0,  0, 11,\n    70, 136, 165,  62, 122, 149,  55, 108, 133,  46, 94, 116,  35, 80, 99,  21, 65, 82,   4, 49, 64,   0, 26, 41,   0,  0,  3,\n    76, 135, 149,  66, 121, 133,  58, 108, 119,  48, 94, 103,  36, 79, 88,  23, 65, 73,   7, 49, 56,   0, 27, 34,   0,  0,  0,\n    78, 135, 133,  69, 120, 118,  60, 107, 106,  50, 93, 92,  39, 79, 77,  26, 65, 63,   8, 49, 47,   0, 27, 26,   0,  0,  0,\n    82, 134, 117,  71, 120, 104,  62, 107, 92,  51, 93, 79,  39, 78, 66,  27, 64, 53,  10, 48, 39,   0, 27, 18,   0,  0,  0,\n    84, 134, 99,  73, 119, 87,  64, 106, 77,  53, 92, 66,  42, 78, 55,  28, 64, 42,  11, 48, 29,   0, 28,  9,   0,  0,  0,\n    87, 133, 81,  76, 119, 72,  66, 106, 62,  55, 92, 52,  43, 78, 42,  29, 64, 31,  12, 48, 17,   0, 28,  0,   0,  0,  0,\n    88, 134, 67,  77, 119, 58,  68, 106, 51,  56, 92, 42,  44, 78, 32,  30, 64, 20,  12, 48,  6,   0, 28,  0,   0,  0,  0,\n    73, 120, 189,  64, 107, 168,  57, 96, 151,  47, 82, 133,  38, 69, 114,  26, 55, 95,  11, 39, 75,   0, 16, 51,   0,  0, 14,\n    78, 120, 171,  69, 107, 153,  62, 95, 137,  51, 82, 119,  40, 69, 102,  29, 55, 85,  15, 39, 66,   0, 17, 44,   0,  0,  4,\n    81, 120, 156,  71, 107, 140,  64, 95, 125,  53, 82, 109,  42, 69, 93,  31, 55, 77,  16, 39, 59,   0, 18, 37,   0,  0,  0,\n    85, 120, 141,  74, 107, 126,  65, 95, 112,  54, 82, 97,  43, 69, 82,  32, 55, 67,  17, 39, 51,   0, 19, 30,   0,  0,  0,\n    86, 119, 126,  76, 106, 112,  66, 95, 100,  56, 81, 85,  45, 69, 72,  33, 55, 59,  18, 40, 43,   0, 19, 22,   0,  0,  0,\n    89, 119, 110,  78, 106, 98,  69, 94, 87,  56, 81, 75,  46, 68, 62,  33, 55, 49,  18, 40, 35,   0, 20, 15,   0,  0,  0,\n    89, 119, 95,  80, 106, 83,  70, 94, 73,  58, 81, 63,  46, 68, 51,  34, 55, 39,  19, 40, 25,   0, 20,  4,   0,  0,  0,\n    92, 118, 78,  82, 106, 68,  70, 93, 59,  59, 81, 49,  47, 68, 39,  34, 55, 28,  19, 40, 14,   0, 20,  0,   0,  0,  0,\n    93, 118, 65,  82, 105, 55,  72, 93, 48,  60, 81, 39,  47, 68, 29,  34, 55, 18,  20, 40,  2,   0, 20,  0,   0,  0,  0,\n    83, 104, 177,  74, 93, 159,  65, 82, 142,  56, 70, 124,  45, 57, 106,  33, 44, 89,  20, 28, 70,   1,  4, 46,   0,  0,  8,\n    86, 104, 161,  78, 93, 145,  68, 82, 128,  58, 70, 112,  48, 58, 96,  35, 45, 80,  21, 29, 62,   1,  6, 40,   0,  0,  0,\n    89, 104, 147,  79, 93, 131,  69, 82, 118,  59, 70, 102,  47, 58, 87,  36, 45, 72,  23, 29, 55,   3,  7, 33,   0,  0,  0,\n    90, 104, 132,  80, 93, 119,  71, 82, 106,  60, 70, 91,  48, 58, 77,  37, 45, 62,  23, 30, 47,   4,  7, 26,   0,  0,  0,\n    92, 104, 118,  82, 93, 105,  72, 82, 93,  61, 69, 80,  50, 58, 68,  37, 45, 55,  23, 30, 39,   4,  8, 18,   0,  0,  0,\n    94, 104, 105,  82, 92, 93,  72, 82, 82,  61, 70, 70,  50, 58, 58,  38, 46, 46,  23, 31, 31,   6, 10, 11,   0,  0,  0,\n    95, 104, 90,  84, 92, 79,  74, 82, 70,  62, 70, 58,  50, 58, 48,  37, 46, 36,  23, 31, 22,   4, 11,  3,   0,  0,  0,\n    96, 103, 74,  85, 92, 65,  75, 81, 56,  63, 70, 47,  50, 58, 37,  38, 46, 25,  24, 31, 11,   3, 11,  0,   0,  0,  0,\n    97, 103, 62,  86, 92, 53,  76, 81, 45,  63, 69, 36,  51, 58, 27,  38, 46, 15,  23, 31,  0,   3, 11,  0,   0,  0,  0,\n    90, 87, 165,  81, 77, 148,  72, 67, 132,  62, 55, 116,  50, 44, 99,  39, 31, 82,  25, 14, 64,   1,  0, 42,   0,  0,  1,\n    93, 87, 150,  83, 77, 135,  74, 67, 121,  63, 56, 105,  52, 45, 90,  40, 32, 74,  25, 16, 57,   3,  0, 35,   0,  0,  0,\n    95, 87, 138,  85, 77, 123,  75, 67, 109,  63, 57, 95,  53, 45, 81,  41, 33, 66,  26, 17, 50,   4,  0, 28,   0,  0,  0,\n    95, 88, 124,  85, 77, 111,  75, 67, 99,  63, 57, 86,  53, 45, 72,  41, 33, 58,  26, 18, 43,   5,  1, 22,   0,  0,  0,\n    97, 88, 112,  87, 77, 100,  76, 68, 88,  64, 57, 76,  53, 46, 63,  41, 34, 50,  26, 19, 35,   5,  2, 14,   0,  0,  0,\n    99, 87, 99,  87, 78, 88,  76, 68, 77,  65, 57, 65,  53, 46, 54,  41, 35, 42,  27, 20, 27,   6,  2,  5,   0,  0,  0,\n    100, 87, 85,  88, 77, 75,  77, 68, 65,  65, 57, 54,  53, 46, 44,  41, 35, 32,  27, 21, 19,   5,  3,  2,   0,  0,  0,\n    100, 88, 71,  89, 77, 61,  78, 68, 53,  66, 57, 44,  53, 47, 33,  41, 35, 22,  27, 21,  7,   5,  3,  0,   0,  0,  0,\n    101, 87, 60,  90, 77, 52,  79, 68, 44,  66, 58, 34,  53, 47, 25,  41, 35, 13,  26, 22,  0,   5,  3,  0,   0,  0,  0,\n    97, 67, 155,  86, 58, 138,  77, 50, 125,  66, 39, 108,  55, 28, 92,  43, 12, 76,  29,  0, 59,   2,  0, 37,   0,  0,  0,\n    99, 67, 141,  88, 59, 127,  78, 50, 113,  68, 40, 98,  56, 29, 83,  44, 15, 68,  29,  0, 52,   3,  0, 30,   0,  0,  0,\n    100, 68, 129,  89, 59, 115,  80, 51, 103,  68, 41, 89,  56, 30, 75,  44, 16, 61,  30,  0, 45,   4,  0, 24,   0,  0,  0,\n    100, 69, 118,  90, 60, 104,  80, 51, 92,  67, 41, 79,  56, 31, 66,  44, 18, 53,  29,  2, 38,   4,  0, 18,   0,  0,  0,\n    101, 69, 104,  90, 61, 93,  79, 51, 82,  67, 42, 70,  56, 32, 59,  44, 20, 46,  29,  4, 31,   6,  0,  9,   0,  0,  0,\n    102, 69, 93,  90, 61, 83,  80, 52, 72,  68, 42, 61,  56, 33, 50,  43, 20, 38,  29,  5, 23,   7,  0,  4,   0,  0,  0,\n    102, 70, 80,  91, 61, 71,  80, 52, 61,  68, 43, 51,  56, 32, 40,  44, 21, 29,  30,  6, 14,   7,  0,  0,   0,  0,  0,\n    103, 70, 68,  92, 61, 58,  81, 53, 50,  69, 43, 41,  56, 34, 31,  43, 22, 19,  29,  7,  3,   7,  0,  0,   0,  0,  0,\n    104, 70, 57,  92, 61, 48,  82, 53, 40,  69, 43, 32,  56, 34, 22,  43, 23, 10,  29,  8,  0,   6,  0,  0,   0,  0,  0,\n    101, 45, 145,  91, 35, 129,  80, 26, 116,  69, 15, 101,  59,  0, 86,  46,  0, 71,  31,  0, 55,   0,  0, 33,   0,  0,  0,\n    104, 44, 132,  92, 36, 118,  82, 28, 105,  71, 17, 91,  58,  3, 77,  46,  0, 63,  31,  0, 48,   2,  0, 26,   0,  0,  0,\n    104, 46, 121,  93, 37, 107,  82, 30, 96,  70, 20, 83,  58,  6, 70,  46,  0, 57,  32,  0, 41,   4,  0, 20,   0,  0,  0,\n    104, 48, 110,  93, 40, 98,  82, 31, 87,  70, 22, 74,  59,  9, 62,  45,  0, 49,  31,  0, 35,   6,  0, 13,   0,  0,  0,\n    104, 48, 99,  92, 41, 88,  82, 32, 77,  70, 23, 65,  58, 11, 54,  46,  0, 42,  32,  0, 27,   7,  0,  5,   0,  0,  0,\n    105, 50, 88,  93, 41, 77,  82, 34, 68,  71, 24, 57,  58, 13, 46,  45,  1, 35,  31,  0, 21,   7,  0,  2,   0,  0,  0,\n    105, 50, 76,  94, 41, 66,  83, 34, 57,  71, 25, 47,  58, 15, 37,  45,  2, 25,  32,  0, 11,   7,  0,  0,   0,  0,  0,\n    106, 50, 64,  94, 42, 55,  83, 35, 47,  71, 26, 38,  58, 16, 27,  45,  4, 17,  31,  0,  4,   7,  0,  0,   0,  0,  0,\n    106, 51, 54,  95, 42, 45,  83, 35, 38,  71, 27, 30,  58, 16, 19,  45,  5,  7,  30,  0,  0,   6,  0,  0,   0,  0,  0,\n    0, 181, 240,   0, 162, 216,   0, 144, 193,   0, 126, 168,   0, 109, 146,   0, 91, 123,   0, 71, 98,   0, 48, 71,   0,  9, 34,\n    0, 179, 218,   0, 161, 195,   0, 144, 174,   0, 126, 153,   0, 108, 132,   0, 90, 110,   0, 71, 88,   0, 48, 63,   0,  8, 29,\n    0, 178, 197,   0, 159, 177,   0, 143, 159,   0, 125, 139,   0, 107, 119,   0, 90, 99,   0, 71, 79,   0, 48, 55,   0,  8, 22,\n    0, 177, 177,   0, 158, 158,   0, 142, 141,   0, 124, 123,   0, 107, 106,   0, 89, 88,   0, 71, 70,   0, 48, 47,   0,  8, 14,\n    0, 176, 157,   0, 158, 141,   0, 141, 126,   0, 123, 109,   0, 106, 93,   0, 89, 78,   0, 70, 60,   0, 47, 39,   0,  7,  5,\n    0, 175, 138,   0, 157, 123,   0, 141, 110,   0, 123, 96,   0, 105, 81,   0, 88, 67,   0, 70, 51,   0, 48, 30,   0,  6,  0,\n    0, 173, 115,   0, 155, 104,   0, 140, 92,   0, 122, 80,   0, 105, 67,   0, 88, 55,   0, 69, 40,   0, 47, 20,   0,  6,  0,\n    0, 173, 94,   0, 155, 85,   0, 139, 75,   0, 121, 64,   0, 104, 53,   0, 88, 42,   0, 70, 28,   0, 47,  9,   0,  6,  0,\n    0, 173, 76,   0, 155, 70,   0, 138, 61,   0, 122, 53,   0, 104, 44,   0, 87, 32,   0, 69, 18,   0, 47,  0,   0,  6,  0,\n    0, 164, 226,   0, 147, 203,   0, 131, 181,   0, 114, 158,   0, 97, 136,   0, 80, 115,   0, 63, 92,   0, 40, 65,   0,  0, 30,\n    0, 162, 205,   0, 145, 184,   0, 130, 164,   0, 114, 143,   0, 97, 124,   0, 81, 104,   0, 63, 83,   0, 40, 58,   0,  0, 23,\n    0, 162, 187,   0, 145, 167,   0, 130, 150,   0, 113, 131,   0, 96, 112,   0, 80, 93,   0, 62, 74,   0, 40, 50,   0,  0, 16,\n    0, 160, 167,   0, 144, 150,   0, 129, 134,   0, 112, 116,   0, 96, 100,   0, 80, 82,   0, 62, 65,   0, 40, 43,   0,  0,  7,\n    0, 160, 148,   0, 143, 133,   0, 128, 118,   0, 111, 103,   0, 96, 88,   0, 80, 73,   0, 62, 56,   0, 40, 35,   0,  0,  0,\n    0, 158, 130,   0, 142, 117,   0, 127, 104,   0, 111, 89,   0, 95, 76,   0, 79, 62,   0, 62, 46,   0, 40, 26,   0,  0,  0,\n    0, 158, 111,   0, 141, 99,   0, 127, 88,   0, 111, 76,   0, 95, 63,   0, 79, 51,   0, 62, 37,   0, 40, 18,   0,  0,  0,\n    0, 158, 91,   0, 141, 81,   0, 126, 72,   0, 110, 62,   0, 94, 50,   0, 79, 39,   0, 62, 25,   0, 40,  5,   0,  0,  0,\n    0, 157, 74,   0, 141, 66,   0, 126, 59,   0, 110, 49,   0, 94, 40,   0, 78, 29,   0, 61, 15,   0, 40,  0,   0,  0,  0,\n    0, 148, 214,   0, 133, 192,   0, 119, 171,   0, 103, 150,   0, 87, 129,   0, 72, 108,   0, 55, 86,   0, 32, 61,   0,  0, 25,\n    0, 147, 193,   0, 132, 173,   0, 118, 155,   0, 103, 136,   0, 87, 116,   0, 72, 98,   0, 55, 78,   0, 32, 53,   0,  0, 17,\n    0, 147, 176,   0, 132, 158,   0, 118, 142,   0, 102, 124,   0, 87, 106,   0, 72, 88,   0, 55, 69,   0, 33, 46,   0,  0,  9,\n    0, 146, 159,   0, 131, 142,   0, 117, 127,   0, 102, 111,   0, 87, 95,   0, 71, 79,   0, 55, 61,   0, 33, 39,   0,  0,  2,\n    0, 145, 140,   0, 130, 126,   0, 117, 112,   0, 101, 98,   0, 86, 83,   0, 71, 68,   0, 55, 52,   0, 33, 31,   0,  0,  0,\n    0, 144, 124,   0, 130, 111,   0, 116, 99,   0, 101, 84,   0, 86, 72,   0, 71, 59,   0, 55, 43,   0, 33, 23,   0,  0,  0,\n    0, 144, 106,   0, 129, 94,   0, 115, 83,   0, 101, 72,   0, 85, 60,   0, 71, 48,   0, 55, 34,   0, 33, 14,   0,  0,  0,\n    3, 143, 86,   0, 129, 77,   0, 115, 68,   0, 100, 58,   0, 85, 48,   0, 70, 36,   0, 54, 22,   0, 33,  3,   0,  0,  0,\n    18, 143, 72,  13, 128, 63,   0, 115, 57,   0, 100, 47,   0, 85, 37,   0, 70, 26,   0, 54, 13,   0, 33,  0,   0,  0,  0,\n    0, 132, 200,   0, 118, 179,   0, 105, 161,   0, 91, 140,   0, 76, 121,   0, 62, 101,   0, 46, 81,   0, 24, 56,   0,  0, 19,\n    0, 131, 182,   0, 118, 163,   0, 105, 146,   0, 91, 128,   0, 77, 110,   0, 62, 91,   0, 46, 72,   0, 25, 48,   0,  0, 11,\n    0, 131, 165,   0, 117, 149,   0, 104, 133,   0, 91, 116,   0, 77, 99,   0, 62, 82,   0, 46, 64,   0, 25, 41,   0,  0,  4,\n    0, 131, 149,   0, 116, 134,   0, 104, 119,   0, 91, 104,   0, 77, 89,   0, 62, 73,   0, 46, 56,   0, 25, 34,   0,  0,  0,\n    10, 130, 133,   2, 116, 119,   0, 104, 106,   0, 90, 91,   0, 76, 78,   0, 62, 64,   0, 46, 48,   0, 26, 27,   0,  0,  0,\n    23, 130, 118,  20, 116, 104,  13, 103, 93,   3, 89, 79,   0, 76, 67,   0, 62, 54,   0, 46, 39,   0, 26, 19,   0,  0,  0,\n    33, 129, 101,  27, 115, 89,  19, 103, 79,   9, 89, 67,   0, 75, 56,   0, 61, 43,   0, 46, 29,   0, 26, 10,   0,  0,  0,\n    41, 128, 83,  35, 115, 73,  27, 102, 64,  15, 89, 55,   0, 76, 45,   0, 62, 33,   0, 46, 18,   0, 26,  0,   0,  0,  0,\n    43, 129, 69,  38, 115, 61,  30, 102, 54,  17, 89, 45,   2, 75, 34,   0, 61, 23,   0, 46,  9,   0, 26,  0,   0,  0,  0,\n    1, 116, 188,   1, 104, 168,   0, 92, 151,   0, 79, 132,   0, 66, 113,   0, 52, 94,   0, 36, 75,   0, 14, 52,   0,  0, 14,\n    17, 116, 171,  16, 104, 153,  14, 92, 137,   8, 79, 119,   0, 67, 102,   0, 53, 85,   0, 37, 67,   0, 16, 44,   0,  0,  4,\n    31, 116, 155,  27, 104, 140,  21, 92, 125,  13, 79, 109,   3, 66, 93,   0, 53, 77,   0, 37, 59,   0, 16, 38,   0,  0,  0,\n    37, 115, 141,  30, 103, 126,  26, 92, 112,  16, 79, 98,   5, 66, 83,   0, 53, 67,   0, 38, 51,   0, 17, 31,   0,  0,  0,\n    41, 115, 126,  37, 103, 112,  31, 92, 100,  22, 79, 86,  10, 66, 72,   0, 53, 59,   0, 38, 44,   0, 17, 23,   0,  0,  0,\n    48, 115, 111,  41, 102, 99,  34, 91, 88,  24, 78, 76,  14, 66, 63,   0, 53, 50,   0, 38, 36,   0, 18, 15,   0,  0,  0,\n    51, 115, 95,  46, 102, 85,  37, 91, 74,  26, 78, 63,  16, 66, 52,   0, 53, 40,   0, 38, 26,   0, 18,  5,   0,  0,  0,\n    55, 114, 80,  47, 102, 69,  40, 90, 60,  30, 78, 51,  19, 66, 41,   3, 53, 29,   0, 38, 15,   0, 17,  0,   0,  0,  0,\n    56, 114, 66,  50, 102, 58,  40, 91, 50,  32, 78, 41,  18, 66, 32,   4, 53, 21,   0, 38,  5,   0, 17,  0,   0,  0,  0,\n    39, 102, 178,  37, 90, 159,  30, 79, 142,  21, 68, 124,  14, 55, 106,   0, 42, 89,   0, 26, 70,   0,  4, 46,   0,  0,  8,\n    48, 102, 161,  42, 90, 145,  35, 79, 128,  26, 68, 112,  19, 55, 96,   3, 43, 79,   0, 27, 62,   0,  6, 40,   0,  0,  0,\n    50, 102, 147,  44, 90, 132,  37, 79, 118,  30, 68, 102,  20, 56, 87,   7, 43, 72,   0, 28, 55,   0,  6, 34,   0,  0,  0,\n    53, 101, 133,  47, 90, 118,  41, 79, 106,  32, 68, 91,  21, 56, 78,   9, 43, 63,   0, 28, 47,   0,  6, 26,   0,  0,  0,\n    57, 101, 119,  50, 89, 106,  42, 79, 94,  34, 67, 81,  24, 56, 68,   9, 44, 55,   0, 29, 40,   0,  6, 19,   0,  0,  0,\n    60, 100, 105,  50, 90, 94,  45, 80, 83,  36, 68, 71,  24, 56, 59,  11, 44, 46,   0, 29, 32,   0,  7, 12,   0,  0,  0,\n    63, 101, 91,  55, 90, 80,  46, 79, 70,  37, 68, 59,  26, 56, 49,  12, 44, 37,   1, 29, 23,   0,  7,  3,   0,  0,  0,\n    64, 101, 75,  56, 89, 67,  48, 79, 57,  37, 68, 48,  27, 56, 37,  15, 44, 26,   0, 29, 12,   0,  7,  0,   0,  0,  0,\n    66, 101, 64,  58, 89, 55,  49, 79, 47,  39, 68, 38,  27, 56, 29,  14, 44, 18,   1, 30,  2,   0,  7,  0,   0,  0,  0,\n    57, 86, 165,  51, 75, 148,  45, 65, 133,  38, 54, 116,  28, 43, 100,  16, 29, 83,   0, 13, 64,   0,  0, 42,   0,  0,  3,\n    60, 86, 151,  55, 75, 135,  47, 66, 121,  39, 55, 105,  30, 44, 90,  18, 31, 74,   3, 16, 57,   0,  1, 35,   0,  0,  0,\n    62, 86, 139,  56, 75, 123,  49, 66, 110,  40, 55, 95,  30, 44, 81,  19, 31, 66,   4, 17, 51,   0,  1, 29,   0,  0,  0,\n    65, 86, 125,  56, 76, 112,  49, 66, 99,  39, 55, 86,  31, 44, 72,  19, 32, 59,   5, 18, 44,   0,  1, 23,   0,  0,  0,\n    67, 86, 113,  58, 75, 100,  51, 66, 88,  41, 56, 77,  31, 45, 64,  20, 32, 51,   6, 18, 35,   0,  1, 14,   0,  0,  0,\n    69, 86, 99,  61, 76, 88,  52, 66, 78,  43, 56, 66,  32, 45, 55,  20, 33, 42,   7, 19, 27,   0,  1,  6,   0,  0,  0,\n    69, 86, 86,  61, 76, 75,  53, 67, 66,  43, 56, 55,  33, 45, 45,  21, 34, 34,   8, 20, 20,   0,  2,  2,   0,  0,  0,\n    71, 86, 72,  63, 75, 62,  54, 66, 55,  45, 56, 45,  33, 45, 35,  22, 34, 23,   7, 20,  8,   0,  2,  0,   0,  0,  0,\n    71, 86, 62,  64, 75, 53,  55, 66, 46,  45, 56, 36,  33, 46, 27,  22, 34, 15,   8, 20,  0,   0,  2,  0,   0,  0,  0,\n    69, 67, 156,  61, 58, 140,  53, 50, 125,  45, 39, 108,  35, 28, 93,  25, 12, 77,  12,  0, 59,   0,  0, 37,   0,  0,  0,\n    71, 68, 142,  63, 59, 126,  56, 50, 114,  47, 40, 98,  37, 28, 84,  26, 15, 68,  12,  0, 53,   0,  0, 30,   0,  0,  0,\n    72, 68, 130,  63, 59, 116,  56, 50, 104,  47, 40, 90,  38, 30, 75,  27, 16, 61,  13,  0, 46,   0,  0, 24,   0,  0,  0,\n    73, 69, 118,  65, 59, 105,  57, 51, 92,  47, 41, 80,  37, 30, 67,  26, 18, 53,  14,  1, 39,   0,  0, 18,   0,  0,  0,\n    74, 69, 106,  65, 60, 93,  57, 51, 82,  48, 41, 70,  38, 31, 59,  26, 19, 46,  13,  2, 32,   0,  0, 10,   0,  0,  0,\n    76, 69, 95,  66, 61, 84,  58, 52, 73,  48, 42, 61,  37, 32, 50,  26, 20, 38,  14,  4, 24,   0,  0,  4,   0,  0,  0,\n    76, 69, 81,  68, 60, 72,  58, 52, 62,  48, 42, 51,  38, 32, 41,  27, 21, 30,  14,  4, 16,   0,  0,  1,   0,  0,  0,\n    76, 69, 68,  68, 61, 60,  60, 52, 51,  49, 43, 41,  38, 33, 32,  27, 21, 20,  14,  5,  5,   0,  0,  0,   0,  0,  0,\n    78, 70, 59,  69, 61, 50,  60, 52, 42,  49, 43, 34,  39, 33, 24,  27, 22, 13,  14,  7,  1,   0,  0,  0,   0,  0,  0,\n    75, 46, 146,  68, 38, 131,  60, 30, 117,  50, 19, 102,  41,  4, 87,  29,  0, 72,  13,  0, 55,   0,  0, 33,   0,  0,  0,\n    78, 47, 132,  70, 39, 119,  61, 30, 105,  53, 20, 92,  42,  5, 78,  30,  0, 64,  13,  0, 49,   0,  0, 27,   0,  0,  0,\n    79, 48, 122,  70, 40, 108,  62, 32, 96,  52, 22, 84,  42,  9, 71,  30,  0, 58,  14,  0, 42,   0,  0, 20,   0,  0,  0,\n    79, 50, 111,  70, 42, 99,  62, 33, 88,  52, 23, 74,  41, 11, 63,  29,  0, 50,  14,  0, 36,   0,  0, 14,   0,  0,  0,\n    80, 50, 99,  70, 42, 89,  61, 34, 78,  52, 25, 67,  41, 14, 55,  30,  0, 42,  15,  0, 28,   0,  0,  6,   0,  0,  0,\n    81, 51, 89,  71, 43, 78,  62, 35, 69,  52, 25, 58,  42, 15, 47,  30,  3, 36,  15,  0, 22,   0,  0,  3,   0,  0,  0,\n    81, 51, 77,  71, 44, 68,  63, 36, 59,  53, 26, 49,  41, 16, 38,  31,  4, 27,  16,  0, 12,   0,  0,  0,   0,  0,  0,\n    81, 52, 65,  72, 43, 56,  63, 36, 48,  53, 27, 39,  41, 17, 29,  30,  4, 18,  14,  0,  3,   0,  0,  0,   0,  0,  0,\n    81, 52, 55,  73, 44, 47,  64, 36, 39,  53, 28, 32,  42, 18, 21,  31,  6,  9,  14,  0,  0,   0,  0,  0,   0,  0,  0,\n    0, 174, 239,   0, 156, 214,   0, 139, 192,   0, 121, 168,   0, 105, 145,   0, 87, 123,   0, 68, 98,   0, 46, 70,   0,  3, 35,\n    0, 172, 217,   0, 155, 194,   0, 139, 173,   0, 121, 152,   0, 104, 130,   0, 87, 110,   0, 69, 88,   0, 46, 63,   0,  4, 28,\n    0, 171, 197,   0, 153, 175,   0, 138, 158,   0, 121, 139,   0, 103, 118,   0, 86, 100,   0, 68, 79,   0, 46, 55,   0,  4, 22,\n    0, 170, 177,   0, 152, 158,   0, 136, 141,   0, 119, 124,   0, 103, 106,   0, 86, 88,   0, 68, 70,   0, 45, 47,   0,  3, 14,\n    0, 169, 157,   0, 152, 141,   0, 136, 126,   0, 119, 109,   0, 102, 94,   0, 86, 78,   0, 68, 60,   0, 46, 39,   0,  3,  5,\n    0, 167, 138,   0, 150, 124,   0, 135, 111,   0, 118, 97,   0, 102, 82,   0, 85, 68,   0, 68, 52,   0, 46, 31,   0,  3,  0,\n    0, 167, 118,   0, 150, 104,   0, 135, 94,   0, 118, 81,   0, 101, 69,   0, 84, 56,   0, 67, 41,   0, 45, 21,   0,  3,  0,\n    0, 166, 97,   0, 149, 87,   0, 134, 77,   0, 117, 67,   0, 101, 56,   0, 85, 44,   0, 67, 30,   0, 45, 10,   0,  3,  0,\n    0, 165, 79,   0, 149, 73,   0, 133, 64,   0, 117, 56,   0, 101, 46,   0, 85, 34,   0, 68, 21,   0, 46,  1,   0,  3,  0,\n    0, 158, 225,   0, 141, 201,   0, 126, 180,   0, 109, 158,   0, 94, 136,   0, 78, 114,   0, 60, 91,   0, 38, 66,   0,  0, 30,\n    0, 156, 203,   0, 140, 183,   0, 125, 164,   0, 109, 143,   0, 94, 124,   0, 78, 104,   0, 61, 83,   0, 38, 57,   0,  0, 23,\n    0, 156, 186,   0, 140, 166,   0, 125, 150,   0, 109, 130,   0, 93, 111,   0, 77, 93,   0, 60, 74,   0, 38, 50,   0,  0, 17,\n    0, 155, 167,   0, 138, 149,   0, 124, 134,   0, 109, 117,   0, 93, 100,   0, 76, 83,   0, 60, 65,   0, 38, 43,   0,  0,  9,\n    0, 153, 147,   0, 138, 134,   0, 124, 120,   0, 107, 103,   0, 92, 88,   0, 77, 73,   0, 60, 56,   0, 38, 35,   0,  0,  0,\n    0, 153, 131,   0, 137, 118,   0, 122, 105,   0, 107, 90,   0, 91, 76,   0, 76, 63,   0, 60, 47,   0, 39, 28,   0,  0,  0,\n    0, 153, 111,   0, 136, 100,   0, 123, 90,   0, 107, 77,   0, 92, 65,   0, 76, 52,   0, 60, 37,   0, 38, 18,   0,  0,  0,\n    0, 152, 93,   0, 136, 82,   0, 122, 74,   0, 106, 63,   0, 91, 52,   0, 76, 40,   0, 59, 26,   0, 38,  6,   0,  0,  0,\n    0, 151, 78,   0, 136, 69,   0, 121, 61,   0, 106, 52,   0, 91, 43,   0, 76, 32,   0, 59, 17,   0, 38,  0,   0,  0,  0,\n    0, 143, 213,   0, 128, 191,   0, 115, 171,   0, 100, 149,   0, 84, 128,   0, 69, 108,   0, 52, 86,   0, 30, 61,   0,  0, 25,\n    0, 142, 193,   0, 127, 173,   0, 114, 154,   0, 99, 134,   0, 84, 116,   0, 69, 98,   0, 52, 77,   0, 31, 53,   0,  0, 18,\n    0, 141, 176,   0, 127, 158,   0, 114, 141,   0, 98, 122,   0, 84, 105,   0, 69, 88,   0, 53, 69,   0, 31, 46,   0,  0,  9,\n    0, 141, 159,   0, 126, 142,   0, 113, 127,   0, 98, 110,   0, 83, 95,   0, 69, 78,   0, 53, 60,   0, 32, 39,   0,  0,  2,\n    0, 140, 140,   0, 126, 126,   0, 112, 112,   0, 98, 98,   0, 83, 83,   0, 68, 69,   0, 52, 52,   0, 31, 31,   0,  0,  0,\n    0, 140, 124,   0, 125, 112,   0, 112, 100,   0, 97, 86,   0, 83, 72,   0, 68, 59,   0, 52, 44,   0, 31, 23,   0,  0,  0,\n    0, 139, 106,   0, 125, 96,   0, 111, 85,   0, 97, 72,   0, 83, 62,   0, 68, 49,   0, 52, 35,   0, 31, 15,   0,  0,  0,\n    0, 138, 88,   0, 124, 79,   0, 111, 70,   0, 96, 59,   0, 82, 48,   0, 68, 38,   0, 52, 24,   0, 31,  4,   0,  0,  0,\n    0, 139, 76,   0, 124, 66,   0, 111, 58,   0, 96, 50,   0, 82, 40,   0, 68, 29,   0, 52, 15,   0, 31,  0,   0,  0,  0,\n    0, 129, 200,   0, 114, 179,   0, 102, 160,   0, 87, 139,   0, 74, 120,   0, 60, 101,   0, 44, 81,   0, 22, 56,   0,  0, 19,\n    0, 127, 181,   0, 114, 163,   0, 102, 146,   0, 88, 127,   0, 74, 109,   0, 60, 91,   0, 44, 72,   0, 23, 48,   0,  0, 11,\n    0, 127, 166,   0, 113, 148,   0, 101, 133,   0, 87, 115,   0, 74, 99,   0, 60, 82,   0, 44, 64,   0, 23, 42,   0,  0,  4,\n    0, 127, 150,   0, 113, 134,   0, 101, 119,   0, 87, 104,   0, 74, 89,   0, 60, 73,   0, 44, 56,   0, 23, 35,   0,  0,  0,\n    0, 125, 134,   0, 112, 118,   0, 100, 106,   0, 87, 92,   0, 73, 78,   0, 60, 64,   0, 44, 48,   0, 23, 27,   0,  0,  0,\n    0, 125, 118,   0, 112, 105,   0, 100, 94,   0, 86, 80,   0, 73, 68,   0, 60, 54,   0, 44, 39,   0, 23, 20,   0,  0,  0,\n    0, 125, 101,   0, 111, 90,   0, 99, 80,   0, 86, 69,   0, 73, 58,   0, 59, 45,   0, 44, 30,   0, 23, 11,   0,  0,  0,\n    0, 124, 85,   0, 111, 75,   0, 99, 66,   0, 86, 56,   0, 73, 45,   0, 59, 34,   0, 44, 20,   0, 23,  1,   0,  0,  0,\n    0, 125, 72,   0, 111, 62,   0, 99, 56,   0, 86, 46,   0, 73, 36,   0, 60, 26,   0, 44, 12,   0, 23,  0,   0,  0,  0,\n    0, 114, 188,   0, 101, 167,   0, 89, 150,   0, 77, 131,   0, 64, 113,   0, 50, 95,   0, 34, 75,   0, 12, 52,   0,  0, 14,\n    0, 113, 170,   0, 101, 153,   0, 89, 137,   0, 77, 120,   0, 64, 102,   0, 50, 85,   0, 35, 67,   0, 12, 44,   0,  0,  4,\n    0, 113, 156,   0, 100, 139,   0, 89, 125,   0, 77, 109,   0, 64, 92,   0, 51, 77,   0, 35, 60,   0, 12, 38,   0,  0,  0,\n    0, 112, 141,   0, 100, 126,   0, 89, 113,   0, 77, 98,   0, 64, 83,   0, 51, 68,   0, 35, 51,   0, 12, 30,   0,  0,  0,\n    0, 112, 127,   0, 100, 112,   0, 89, 100,   0, 76, 87,   0, 64, 74,   0, 51, 59,   0, 35, 44,   0, 13, 24,   0,  0,  0,\n    0, 112, 111,   0, 100, 100,   0, 88, 88,   0, 76, 76,   0, 64, 64,   0, 51, 52,   0, 36, 37,   0, 13, 17,   0,  0,  0,\n    0, 111, 96,   0, 99, 85,   0, 88, 76,   0, 76, 64,   0, 64, 53,   0, 51, 41,   0, 36, 27,   0, 13,  6,   0,  0,  0,\n    0, 111, 81,   0, 99, 71,   0, 88, 62,   0, 76, 52,   0, 64, 43,   0, 51, 31,   0, 36, 17,   0, 13,  0,   0,  0,  0,\n    0, 111, 69,   0, 99, 60,   0, 88, 52,   0, 75, 43,   0, 63, 34,   0, 51, 21,   0, 36,  7,   0, 13,  0,   0,  0,  0,\n    0, 99, 177,   0, 88, 158,   0, 77, 141,   0, 66, 123,   0, 53, 106,   0, 40, 89,   0, 25, 71,   0,  5, 47,   0,  0,  8,\n    0, 99, 160,   0, 88, 144,   0, 77, 129,   0, 66, 112,   0, 54, 97,   0, 41, 80,   0, 26, 62,   0,  5, 40,   0,  0,  0,\n    0, 99, 147,   0, 87, 132,   0, 78, 117,   0, 66, 102,   0, 54, 87,   0, 42, 72,   0, 26, 55,   0,  5, 34,   0,  0,  0,\n    0, 99, 134,   0, 88, 119,   0, 77, 107,   0, 66, 92,   0, 54, 78,   0, 42, 64,   0, 27, 48,   0,  5, 27,   0,  0,  0,\n    0, 99, 120,   0, 87, 107,   0, 78, 94,   0, 66, 81,   0, 54, 68,   0, 42, 55,   0, 27, 40,   0,  6, 20,   0,  0,  0,\n    0, 98, 105,   0, 87, 94,   0, 77, 84,   0, 65, 71,   0, 55, 59,   0, 42, 47,   0, 28, 33,   0,  6, 12,   0,  0,  0,\n    0, 98, 93,   0, 87, 81,   0, 77, 72,   0, 66, 61,   0, 54, 49,   0, 42, 37,   0, 28, 24,   0,  6,  4,   0,  0,  0,\n    0, 98, 77,   0, 87, 68,   0, 77, 59,   0, 65, 49,   0, 54, 39,   0, 42, 27,   0, 29, 14,   0,  6,  0,   0,  0,  0,\n    1, 98, 65,   7, 87, 56,   0, 77, 49,   0, 66, 41,   0, 54, 30,   0, 42, 19,   0, 29,  3,   0,  6,  0,   0,  0,  0,\n    0, 84, 166,   0, 74, 149,   0, 64, 134,   0, 53, 117,   0, 41, 100,   0, 28, 83,   0, 11, 64,   0,  0, 42,   0,  0,  3,\n    0, 84, 151,   0, 74, 135,   0, 64, 121,   0, 53, 105,   0, 42, 90,   0, 30, 75,   0, 14, 58,   0,  0, 36,   0,  0,  0,\n    0, 84, 138,   0, 74, 124,   1, 64, 110,   0, 54, 95,   0, 43, 81,   0, 30, 67,   0, 15, 51,   0,  1, 29,   0,  0,  0,\n    14, 84, 126,  12, 74, 112,   2, 65, 99,   0, 54, 85,   0, 44, 73,   0, 31, 59,   0, 16, 44,   0,  1, 23,   0,  0,  0,\n    16, 84, 113,  13, 74, 100,   6, 65, 89,   0, 54, 77,   0, 44, 65,   0, 31, 51,   0, 17, 36,   0,  1, 16,   0,  0,  0,\n    24, 84, 100,  18, 74, 88,  13, 65, 78,   2, 55, 68,   0, 44, 55,   0, 32, 43,   0, 18, 28,   0,  1,  6,   0,  0,  0,\n    26, 84, 87,  24, 74, 76,  17, 65, 67,   7, 54, 57,   0, 44, 46,   0, 32, 35,   0, 19, 21,   0,  2,  3,   0,  0,  0,\n    30, 84, 74,  28, 74, 64,  20, 65, 55,  12, 55, 46,   0, 44, 35,   0, 32, 24,   0, 18,  9,   0,  1,  0,   0,  0,  0,\n    32, 84, 63,  28, 74, 54,  21, 65, 47,  13, 54, 38,   0, 44, 28,   0, 32, 16,   0, 18,  1,   0,  1,  0,   0,  0,  0,\n    30, 67, 155,  20, 58, 139,  20, 49, 126,  12, 39, 110,   0, 27, 94,   0, 13, 77,   0,  0, 60,   0,  0, 37,   0,  0,  0,\n    35, 67, 142,  30, 58, 126,  23, 50, 114,  16, 40, 99,   7, 29, 85,   0, 15, 69,   0,  0, 52,   0,  0, 30,   0,  0,  0,\n    35, 68, 131,  30, 59, 116,  27, 50, 104,  18, 40, 90,   9, 29, 76,   0, 17, 62,   0,  2, 46,   0,  0, 24,   0,  0,  0,\n    37, 69, 119,  33, 59, 106,  27, 51, 94,  21, 41, 80,   9, 30, 67,   0, 18, 54,   0,  3, 39,   0,  0, 18,   0,  0,  0,\n    40, 69, 107,  36, 59, 94,  28, 51, 84,  18, 41, 72,  10, 31, 60,   0, 19, 47,   0,  4, 32,   0,  0, 10,   0,  0,  0,\n    42, 69, 95,  36, 59, 84,  29, 51, 74,  19, 41, 63,  10, 31, 52,   0, 20, 39,   0,  4, 25,   0,  0,  4,   0,  0,  0,\n    43, 69, 83,  38, 60, 73,  32, 51, 62,  23, 42, 53,  11, 31, 42,   0, 20, 31,   0,  5, 17,   0,  0,  1,   0,  0,  0,\n    45, 69, 70,  39, 60, 60,  33, 51, 52,  24, 42, 43,  13, 32, 33,   0, 21, 21,   0,  5,  6,   0,  0,  0,   0,  0,  0,\n    47, 69, 59,  41, 60, 51,  34, 51, 43,  24, 42, 35,  12, 33, 26,   1, 22, 14,   0,  5,  1,   0,  0,  0,   0,  0,  0,\n    46, 48, 146,  42, 40, 131,  36, 32, 118,  27, 22, 103,  17,  6, 88,   5,  0, 73,   0,  0, 55,   0,  0, 33,   0,  0,  0,\n    48, 48, 133,  44, 40, 119,  37, 32, 107,  28, 22, 93,  20,  8, 79,   7,  0, 65,   0,  0, 49,   0,  0, 27,   0,  0,  0,\n    48, 50, 123,  44, 41, 109,  37, 33, 97,  30, 23, 83,  21, 11, 71,   8,  0, 58,   0,  0, 42,   0,  0, 21,   0,  0,  0,\n    49, 51, 111,  45, 42, 99,  38, 34, 87,  29, 25, 75,  20, 13, 63,   8,  0, 51,   0,  0, 36,   0,  0, 14,   0,  0,  0,\n    52, 52, 100,  44, 43, 89,  38, 35, 79,  29, 26, 68,  19, 15, 56,  10,  1, 43,   0,  0, 28,   0,  0,  6,   0,  0,  0,\n    52, 52, 90,  47, 44, 79,  39, 36, 70,  30, 27, 59,  20, 16, 47,   9,  2, 36,   0,  0, 22,   0,  0,  2,   0,  0,  0,\n    52, 53, 78,  46, 44, 68,  39, 37, 60,  32, 27, 49,  22, 17, 39,  10,  3, 28,   0,  0, 12,   0,  0,  0,   0,  0,  0,\n    53, 53, 66,  47, 44, 57,  40, 36, 48,  32, 27, 39,  22, 18, 30,   9,  4, 18,   0,  0,  3,   0,  0,  0,   0,  0,  0,\n    54, 53, 57,  48, 45, 49,  41, 37, 41,  33, 28, 32,  22, 19, 23,  11,  6, 10,   1,  0,  0,   0,  0,  0,   0,  0,  0,\n};\nvoid AdobeCMYK_to_sRGB1(FX_BYTE c, FX_BYTE m, FX_BYTE y, FX_BYTE k, FX_BYTE& R, FX_BYTE& G, FX_BYTE& B)\n{\n    int fix_c = c << 8;\n    int fix_m = m << 8;\n    int fix_y = y << 8;\n    int fix_k = k << 8;\n    int c_index = (fix_c + 4096) >> 13;\n    int m_index = (fix_m + 4096) >> 13;\n    int y_index = (fix_y + 4096) >> 13;\n    int k_index = (fix_k + 4096) >> 13;\n    int pos = (c_index * 9 * 9 * 9 + m_index * 9 * 9 + y_index * 9 + k_index) * 3;\n    int fix_r = g_CMYKSamples[pos] << 8;\n    int fix_g = g_CMYKSamples[pos + 1] << 8;\n    int fix_b = g_CMYKSamples[pos + 2] << 8;\n    int c1_index = fix_c >> 13;\n    if (c1_index == c_index) {\n        c1_index = c1_index == 8 ? c1_index - 1 : c1_index + 1;\n    }\n    int m1_index = fix_m >> 13;\n    if (m1_index == m_index) {\n        m1_index = m1_index == 8 ? m1_index - 1 : m1_index + 1;\n    }\n    int y1_index = fix_y >> 13;\n    if (y1_index == y_index) {\n        y1_index = y1_index == 8 ? y1_index - 1 : y1_index + 1;\n    }\n    int k1_index = fix_k >> 13;\n    if (k1_index == k_index) {\n        k1_index = k1_index == 8 ? k1_index - 1 : k1_index + 1;\n    }\n    int c1_pos = pos + (c1_index - c_index) * 9 * 9 * 9 * 3;\n    int m1_pos = pos + (m1_index - m_index) * 9 * 9 * 3;\n    int y1_pos = pos + (y1_index - y_index) * 9 * 3;\n    int k1_pos = pos + (k1_index - k_index) * 3;\n    int c_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[c1_pos];\n    int c_g_delta = g_CMYKSamples[pos + 1] - g_CMYKSamples[c1_pos + 1];\n    int c_b_delta = g_CMYKSamples[pos + 2] - g_CMYKSamples[c1_pos + 2];\n    int m_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[m1_pos];\n    int m_g_delta = g_CMYKSamples[pos + 1] - g_CMYKSamples[m1_pos + 1];\n    int m_b_delta = g_CMYKSamples[pos + 2] - g_CMYKSamples[m1_pos + 2];\n    int y_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[y1_pos];\n    int y_g_delta = g_CMYKSamples[pos + 1] - g_CMYKSamples[y1_pos + 1];\n    int y_b_delta = g_CMYKSamples[pos + 2] - g_CMYKSamples[y1_pos + 2];\n    int k_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[k1_pos];\n    int k_g_delta = g_CMYKSamples[pos + 1] - g_CMYKSamples[k1_pos + 1];\n    int k_b_delta = g_CMYKSamples[pos + 2] - g_CMYKSamples[k1_pos + 2];\n    int c_rate = (fix_c - (c_index << 13)) * (c_index - c1_index);\n    fix_r += c_r_delta * c_rate / 32;\n    fix_g += c_g_delta * c_rate / 32;\n    fix_b += c_b_delta * c_rate / 32;\n    int m_rate = (fix_m - (m_index << 13)) * (m_index - m1_index);\n    fix_r += m_r_delta * m_rate / 32;\n    fix_g += m_g_delta * m_rate / 32;\n    fix_b += m_b_delta * m_rate / 32;\n    int y_rate = (fix_y - (y_index << 13)) * (y_index - y1_index);\n    fix_r += y_r_delta * y_rate / 32;\n    fix_g += y_g_delta * y_rate / 32;\n    fix_b += y_b_delta * y_rate / 32;\n    int k_rate = (fix_k - (k_index << 13)) * (k_index - k1_index);\n    fix_r += k_r_delta * k_rate / 32;\n    fix_g += k_g_delta * k_rate / 32;\n    fix_b += k_b_delta * k_rate / 32;\n    if (fix_r < 0) {\n        fix_r = 0;\n    }\n    if (fix_g < 0) {\n        fix_g = 0;\n    }\n    if (fix_b < 0) {\n        fix_b = 0;\n    }\n    R = fix_r >> 8;\n    G = fix_g >> 8;\n    B = fix_b >> 8;\n}\nvoid AdobeCMYK_to_sRGB(FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B)\n{\n    FX_BYTE c1 = FXSYS_round(c * 255);\n    FX_BYTE m1 = FXSYS_round(m * 255);\n    FX_BYTE y1 = FXSYS_round(y * 255);\n    FX_BYTE k1 = FXSYS_round(k * 255);\n    FX_BYTE r, g, b;\n    AdobeCMYK_to_sRGB1(c1, m1, y1, k1, r, g, b);\n    R = 1.0f * r / 255;\n    G = 1.0f * g / 255;\n    B = 1.0f * b / 255;\n}\n"
  },
  {
    "path": "core/src/fxcodec/codec/fx_codec_jbig.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxcodec/fx_codec.h\"\n#include \"codec_int.h\"\nCCodec_Jbig2Context::CCodec_Jbig2Context()\n{\n    FXSYS_memset32(this, 0, sizeof(CCodec_Jbig2Context));\n}\nCCodec_Jbig2Module::~CCodec_Jbig2Module()\n{\n}\nvoid* CCodec_Jbig2Module::CreateJbig2Context()\n{\n    return FX_NEW CCodec_Jbig2Context();\n}\nvoid CCodec_Jbig2Module::DestroyJbig2Context(void* pJbig2Content)\n{\n    if(pJbig2Content) {\n        CJBig2_Context::DestroyContext(((CCodec_Jbig2Context*)pJbig2Content)->m_pContext);\n        delete (CCodec_Jbig2Context*)pJbig2Content;\n    }\n    pJbig2Content = NULL;\n}\nFX_BOOL CCodec_Jbig2Module::Decode(FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,\n                                   FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch)\n{\n    FXSYS_memset32(dest_buf, 0, height * dest_pitch);\n    CJBig2_Context* pContext = CJBig2_Context::CreateContext(&m_Module,\n                               (FX_LPBYTE)global_data, global_size, (FX_LPBYTE)src_buf, src_size, JBIG2_EMBED_STREAM);\n    if (pContext == NULL) {\n        return FALSE;\n    }\n    int ret = pContext->getFirstPage(dest_buf, width, height, dest_pitch, NULL);\n    CJBig2_Context::DestroyContext(pContext);\n    if (ret != JBIG2_SUCCESS) {\n        return FALSE;\n    }\n    int dword_size = height * dest_pitch / 4;\n    FX_DWORD* dword_buf = (FX_DWORD*)dest_buf;\n    for (int i = 0; i < dword_size; i ++) {\n        dword_buf[i] = ~dword_buf[i];\n    }\n    return TRUE;\n}\nFX_BOOL CCodec_Jbig2Module::Decode(IFX_FileRead* file_ptr,\n                                   FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf)\n{\n    CJBig2_Context* pContext = NULL;\n    CJBig2_Image* dest_image = NULL;\n    FX_DWORD src_size = (FX_DWORD)file_ptr->GetSize();\n    FX_LPBYTE src_buf = FX_Alloc(FX_BYTE, src_size);\n    if (src_buf == NULL) {\n        return FALSE;\n    }\n    int ret = 0;\n    if(!file_ptr->ReadBlock(src_buf, 0, src_size)) {\n        goto failed;\n    }\n    pContext = CJBig2_Context::CreateContext(&m_Module, NULL, 0, src_buf, src_size, JBIG2_FILE_STREAM);\n    if(pContext == NULL) {\n        goto failed;\n    }\n    ret = pContext->getFirstPage(&dest_image, NULL);\n    CJBig2_Context::DestroyContext(pContext);\n    if (ret != JBIG2_SUCCESS) {\n        goto failed;\n    }\n    width = (FX_DWORD)dest_image->m_nWidth;\n    height = (FX_DWORD)dest_image->m_nHeight;\n    pitch = (FX_DWORD)dest_image->m_nStride;\n    dest_buf = dest_image->m_pData;\n    dest_image->m_bNeedFree = FALSE;\n    delete dest_image;\n    FX_Free(src_buf);\n    return TRUE;\nfailed:\n    if(src_buf) {\n        FX_Free(src_buf);\n    }\n    return FALSE;\n}\nFXCODEC_STATUS CCodec_Jbig2Module::StartDecode(void* pJbig2Context, FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,\n        FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch, IFX_Pause* pPause)\n{\n    if(!pJbig2Context) {\n        return FXCODEC_STATUS_ERR_PARAMS;\n    }\n    CCodec_Jbig2Context* m_pJbig2Context = (CCodec_Jbig2Context*)pJbig2Context;\n    m_pJbig2Context->m_width = width;\n    m_pJbig2Context->m_height = height;\n    m_pJbig2Context->m_src_buf = (unsigned char *)src_buf;\n    m_pJbig2Context->m_src_size = src_size;\n    m_pJbig2Context->m_global_data = global_data;\n    m_pJbig2Context->m_global_size = global_size;\n    m_pJbig2Context->m_dest_buf = dest_buf;\n    m_pJbig2Context->m_dest_pitch = dest_pitch;\n    m_pJbig2Context->m_pPause = pPause;\n    m_pJbig2Context->m_bFileReader = FALSE;\n    FXSYS_memset32(dest_buf, 0, height * dest_pitch);\n    m_pJbig2Context->m_pContext = CJBig2_Context::CreateContext(&m_Module,\n                                  (FX_LPBYTE)global_data, global_size, (FX_LPBYTE)src_buf, src_size, JBIG2_EMBED_STREAM, pPause);\n    if(!m_pJbig2Context->m_pContext) {\n        return FXCODEC_STATUS_ERROR;\n    }\n    int ret = m_pJbig2Context->m_pContext->getFirstPage(dest_buf, width, height, dest_pitch, pPause);\n    if(m_pJbig2Context->m_pContext->GetProcessiveStatus() == FXCODEC_STATUS_DECODE_FINISH) {\n        CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);\n        m_pJbig2Context->m_pContext = NULL;\n        if (ret != JBIG2_SUCCESS) {\n            return FXCODEC_STATUS_ERROR;\n        }\n        int dword_size = height * dest_pitch / 4;\n        FX_DWORD* dword_buf = (FX_DWORD*)dest_buf;\n        for (int i = 0; i < dword_size; i ++) {\n            dword_buf[i] = ~dword_buf[i];\n        }\n        return FXCODEC_STATUS_DECODE_FINISH;\n    }\n    return m_pJbig2Context->m_pContext->GetProcessiveStatus();\n}\nFXCODEC_STATUS CCodec_Jbig2Module::StartDecode(void* pJbig2Context, IFX_FileRead* file_ptr,\n        FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf, IFX_Pause* pPause)\n{\n    if(!pJbig2Context) {\n        return FXCODEC_STATUS_ERR_PARAMS;\n    }\n    CCodec_Jbig2Context* m_pJbig2Context = (CCodec_Jbig2Context*)pJbig2Context;\n    m_pJbig2Context->m_bFileReader = TRUE;\n    m_pJbig2Context->m_dest_image = NULL;\n    m_pJbig2Context->m_src_size = (FX_DWORD)file_ptr->GetSize();\n    m_pJbig2Context->m_src_buf = FX_Alloc(FX_BYTE, m_pJbig2Context->m_src_size);\n    if (m_pJbig2Context->m_src_buf == NULL) {\n        return FXCODEC_STATUS_ERR_MEMORY;\n    }\n    int ret = 0;\n    if(!file_ptr->ReadBlock((void*)m_pJbig2Context->m_src_buf, 0, m_pJbig2Context->m_src_size)) {\n        goto failed;\n    }\n    m_pJbig2Context->m_pContext = CJBig2_Context::CreateContext(&m_Module, NULL, 0, m_pJbig2Context->m_src_buf, m_pJbig2Context->m_src_size, JBIG2_FILE_STREAM, pPause);\n    if(m_pJbig2Context->m_pContext == NULL) {\n        goto failed;\n    }\n    ret = m_pJbig2Context->m_pContext->getFirstPage(&m_pJbig2Context->m_dest_image, pPause);\n    if(m_pJbig2Context->m_pContext->GetProcessiveStatus() == FXCODEC_STATUS_DECODE_TOBECONTINUE) {\n        width = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nWidth;\n        height = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nHeight;\n        pitch = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nStride;\n        dest_buf = m_pJbig2Context->m_dest_image->m_pData;\n        m_pJbig2Context->m_dest_image->m_bNeedFree = FALSE;\n        return FXCODEC_STATUS_DECODE_TOBECONTINUE;\n    }\n    CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);\n    m_pJbig2Context->m_pContext = NULL;\n    if (ret != JBIG2_SUCCESS) {\n        goto failed;\n    }\n    width = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nWidth;\n    height = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nHeight;\n    pitch = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nStride;\n    dest_buf = m_pJbig2Context->m_dest_image->m_pData;\n    m_pJbig2Context->m_dest_image->m_bNeedFree = FALSE;\n    delete m_pJbig2Context->m_dest_image;\n    FX_Free(m_pJbig2Context->m_src_buf);\n    return FXCODEC_STATUS_DECODE_FINISH;\nfailed:\n    if(m_pJbig2Context->m_src_buf) {\n        FX_Free(m_pJbig2Context->m_src_buf);\n    }\n    m_pJbig2Context->m_src_buf = NULL;\n    return FXCODEC_STATUS_ERROR;\n}\nFXCODEC_STATUS CCodec_Jbig2Module::ContinueDecode(void* pJbig2Context, IFX_Pause* pPause)\n{\n    CCodec_Jbig2Context* m_pJbig2Context = (CCodec_Jbig2Context*)pJbig2Context;\n    int ret = m_pJbig2Context->m_pContext->Continue(pPause);\n    if(m_pJbig2Context->m_pContext->GetProcessiveStatus() == FXCODEC_STATUS_DECODE_FINISH) {\n        if(m_pJbig2Context->m_bFileReader) {\n            CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);\n            m_pJbig2Context->m_pContext = NULL;\n            if (ret != JBIG2_SUCCESS) {\n                if(m_pJbig2Context->m_src_buf) {\n                    FX_Free(m_pJbig2Context->m_src_buf);\n                }\n                m_pJbig2Context->m_src_buf = NULL;\n                return FXCODEC_STATUS_ERROR;\n            }\n            delete m_pJbig2Context->m_dest_image;\n            FX_Free(m_pJbig2Context->m_src_buf);\n            return FXCODEC_STATUS_DECODE_FINISH;\n        } else {\n            CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);\n            m_pJbig2Context->m_pContext = NULL;\n            if (ret != JBIG2_SUCCESS) {\n                return FXCODEC_STATUS_ERROR;\n            }\n            int dword_size = m_pJbig2Context->m_height * m_pJbig2Context->m_dest_pitch / 4;\n            FX_DWORD* dword_buf = (FX_DWORD*)m_pJbig2Context->m_dest_buf;\n            for (int i = 0; i < dword_size; i ++) {\n                dword_buf[i] = ~dword_buf[i];\n            }\n            return FXCODEC_STATUS_DECODE_FINISH;\n        }\n    }\n    return m_pJbig2Context->m_pContext->GetProcessiveStatus();\n}\n\n\n\n"
  },
  {
    "path": "core/src/fxcodec/codec/fx_codec_jbig_enc.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxcodec/fx_codec.h\"\nICodec_Jbig2Encoder* CCodec_ModuleMgr::CreateJbig2Encoder()\n{\n    return NULL;\n}\n"
  },
  {
    "path": "core/src/fxcodec/codec/fx_codec_jpeg.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxcodec/fx_codec.h\"\n#include \"../../../include/fxge/fx_dib.h\"\n#include \"codec_int.h\"\nextern \"C\" {\n    static void _JpegScanSOI(const FX_BYTE*& src_buf, FX_DWORD& src_size)\n    {\n        if (src_size == 0) {\n            return;\n        }\n        FX_DWORD offset = 0;\n        while (offset < src_size - 1) {\n            if (src_buf[offset] == 0xff && src_buf[offset + 1] == 0xd8) {\n                src_buf += offset;\n                src_size -= offset;\n                return;\n            }\n            offset ++;\n        }\n    }\n};\nextern \"C\" {\n#undef FAR\n#include \"../../fx_jpeglib.h\"\n}\nextern \"C\" {\n    static void _src_do_nothing(struct jpeg_decompress_struct* cinfo) {}\n};\nextern \"C\" {\n    static void _error_fatal(j_common_ptr cinfo)\n    {\n        longjmp(*(jmp_buf*)cinfo->client_data, -1);\n    }\n};\nextern \"C\" {\n    static void _src_skip_data(struct jpeg_decompress_struct* cinfo, long num)\n    {\n        if (num > (long)cinfo->src->bytes_in_buffer) {\n            _error_fatal((j_common_ptr)cinfo);\n        }\n        cinfo->src->next_input_byte += num;\n        cinfo->src->bytes_in_buffer -= num;\n    }\n};\nextern \"C\" {\n    static boolean _src_fill_buffer(j_decompress_ptr cinfo)\n    {\n        return 0;\n    }\n};\nextern \"C\" {\n    static boolean _src_resync(j_decompress_ptr cinfo, int desired)\n    {\n        return 0;\n    }\n};\nextern \"C\" {\n    static void _error_do_nothing(j_common_ptr cinfo) {}\n};\nextern \"C\" {\n    static void _error_do_nothing1(j_common_ptr cinfo, int) {}\n};\nextern \"C\" {\n    static void _error_do_nothing2(j_common_ptr cinfo, char*) {}\n};\n#define JPEG_MARKER_EXIF\t\t(JPEG_APP0 + 1)\n#define\tJPEG_MARKER_ICC\t\t\t(JPEG_APP0 + 2)\n#define\tJPEG_MARKER_AUTHORTIME\t(JPEG_APP0 + 3)\n#define\tJPEG_MARKER_MAXSIZE\t0xFFFF\n#define\tJPEG_OVERHEAD_LEN\t14\nstatic FX_BOOL _JpegIsIccMarker(jpeg_saved_marker_ptr marker)\n{\n    if (marker->marker == JPEG_MARKER_ICC &&\n            marker->data_length >= JPEG_OVERHEAD_LEN &&\n            (FXSYS_memcmp32(marker->data, \"\\x49\\x43\\x43\\x5f\\x50\\x52\\x4f\\x46\\x49\\x4c\\x45\\x00\", 12) == 0)) {\n        return TRUE;\n    }\n    return FALSE;\n}\nstatic\tFX_BOOL _JpegLoadIccProfile(j_decompress_ptr cinfo, FX_LPBYTE* icc_buf_ptr, FX_DWORD* icc_length)\n{\n    if(icc_buf_ptr == NULL || icc_length == NULL) {\n        return FALSE;\n    }\n    *icc_buf_ptr = NULL;\n    *icc_length = 0;\n    FX_LPBYTE icc_data_ptr = NULL;\n    FX_DWORD icc_data_len = 0;\n    FX_BYTE count_icc_marker = 0;\n    FX_BYTE num_icc_marker = 0;\n    jpeg_saved_marker_ptr marker_list[256] = {NULL};\n    for (jpeg_saved_marker_ptr cur_marker = cinfo->marker_list;\n            cur_marker != NULL;\n            cur_marker = cur_marker->next) {\n        if(_JpegIsIccMarker(cur_marker)) {\n            if(count_icc_marker == 0) {\n                num_icc_marker = cur_marker->data[13];\n            } else if(num_icc_marker != cur_marker->data[13]) {\n                return FALSE;\n            }\n            int sn = cur_marker->data[12] - 1;\n            if(sn < 0 || sn >= num_icc_marker) {\n                return FALSE;\n            }\n            if(marker_list[sn] == NULL) {\n                marker_list[sn] = cur_marker;\n            } else {\n                return FALSE;\n            }\n            count_icc_marker ++;\n            icc_data_len +=\t(cur_marker->data_length - JPEG_OVERHEAD_LEN);\n        }\n    }\n    if(count_icc_marker != num_icc_marker) {\n        return FALSE;\n    }\n    if(num_icc_marker == 0) {\n        return TRUE;\n    }\n    icc_data_ptr = FX_Alloc(FX_BYTE, icc_data_len);\n    if(icc_buf_ptr == NULL)\t{\n        return FALSE;\n    }\n    *icc_buf_ptr = icc_data_ptr;\n    *icc_length = icc_data_len;\n    for (int idx = 0; idx < num_icc_marker; idx++) {\n        icc_data_len = marker_list[idx]->data_length - JPEG_OVERHEAD_LEN;\n        FXSYS_memcpy32(icc_data_ptr, marker_list[idx]->data + JPEG_OVERHEAD_LEN, icc_data_len);\n        icc_data_ptr += icc_data_len;\n    }\n    return TRUE;\n}\nstatic\tFX_BOOL _JpegEmbedIccProfile(j_compress_ptr cinfo, FX_LPCBYTE icc_buf_ptr, FX_DWORD icc_length)\n{\n    if(icc_buf_ptr == NULL || icc_length == 0) {\n        return FALSE;\n    }\n    FX_DWORD icc_segment_size = (JPEG_MARKER_MAXSIZE - 2 - JPEG_OVERHEAD_LEN);\n    FX_DWORD icc_segment_num = (icc_length / icc_segment_size) + 1;\n    if (icc_segment_num > 255)\t{\n        return FALSE;\n    }\n    FX_DWORD icc_data_length = JPEG_OVERHEAD_LEN + (icc_segment_num > 1 ? icc_segment_size : icc_length);\n    FX_LPBYTE icc_data = FX_Alloc(FX_BYTE, icc_data_length);\n    if (icc_data == NULL) {\n        return FALSE;\n    }\n    FXSYS_memcpy32(icc_data, \"\\x49\\x43\\x43\\x5f\\x50\\x52\\x4f\\x46\\x49\\x4c\\x45\\x00\", 12);\n    icc_data[13] = (FX_BYTE)icc_segment_num;\n    for (FX_BYTE i = 0; i < (icc_segment_num - 1); i++) {\n        icc_data[12] = i + 1;\n        FXSYS_memcpy32(icc_data + JPEG_OVERHEAD_LEN, icc_buf_ptr + i * icc_segment_size, icc_segment_size);\n        jpeg_write_marker(cinfo, JPEG_MARKER_ICC, icc_data, icc_data_length);\n    }\n    icc_data[12] = (FX_BYTE)icc_segment_num;\n    FX_DWORD icc_size = (icc_segment_num - 1) * icc_segment_size;\n    FXSYS_memcpy32(icc_data + JPEG_OVERHEAD_LEN, icc_buf_ptr + icc_size, icc_length - icc_size);\n    jpeg_write_marker(cinfo, JPEG_MARKER_ICC, icc_data, JPEG_OVERHEAD_LEN + icc_length - icc_size);\n    FX_Free(icc_data);\n    return TRUE;\n}\nextern \"C\" {\n    static void _dest_do_nothing(j_compress_ptr cinfo) {}\n};\nextern \"C\" {\n    static boolean _dest_empty(j_compress_ptr cinfo)\n    {\n        return FALSE;\n    }\n};\n#define\tJPEG_BLOCK_SIZE\t1048576\nstatic void _JpegEncode(const CFX_DIBSource* pSource, FX_LPBYTE& dest_buf, FX_STRSIZE& dest_size, int quality, FX_LPCBYTE icc_buf, FX_DWORD icc_length)\n{\n    struct jpeg_compress_struct cinfo;\n    struct jpeg_error_mgr jerr;\n    jerr.error_exit = _error_do_nothing;\n    jerr.emit_message = _error_do_nothing1;\n    jerr.output_message = _error_do_nothing;\n    jerr.format_message = _error_do_nothing2;\n    jerr.reset_error_mgr = _error_do_nothing;\n    cinfo.err = &jerr;\n    jpeg_create_compress(&cinfo);\n    int Bpp = pSource->GetBPP() / 8;\n    int nComponents = Bpp >= 3 ? (pSource->IsCmykImage() ? 4 : 3) : 1;\n    int pitch = pSource->GetPitch();\n    int width = pSource->GetWidth();\n    int height = pSource->GetHeight();\n    FX_DWORD dest_buf_length = width * height * nComponents + 1024 + (icc_length ? (icc_length + 255 * 18) : 0);\n    dest_buf = FX_Alloc(FX_BYTE, dest_buf_length);\n    while (dest_buf == NULL) {\n        dest_buf_length >>= 1;\n        dest_buf = FX_Alloc(FX_BYTE, dest_buf_length);\n    }\n    struct jpeg_destination_mgr dest;\n    dest.init_destination = _dest_do_nothing;\n    dest.term_destination = _dest_do_nothing;\n    dest.empty_output_buffer = _dest_empty;\n    dest.next_output_byte = dest_buf;\n    dest.free_in_buffer = dest_buf_length;\n    cinfo.dest = &dest;\n    cinfo.image_width = width;\n    cinfo.image_height = height;\n    cinfo.input_components = nComponents;\n    if (nComponents == 1) {\n        cinfo.in_color_space = JCS_GRAYSCALE;\n    } else if (nComponents == 3) {\n        cinfo.in_color_space = JCS_RGB;\n    } else {\n        cinfo.in_color_space = JCS_CMYK;\n    }\n    FX_LPBYTE line_buf = NULL;\n    if (nComponents > 1) {\n        line_buf = FX_Alloc(FX_BYTE, width * nComponents);\n        if (line_buf == NULL) {\n            return;\n        }\n    }\n    jpeg_set_defaults(&cinfo);\n    if(quality != 75) {\n        jpeg_set_quality(&cinfo, quality, TRUE);\n    }\n    jpeg_start_compress(&cinfo, TRUE);\n    _JpegEmbedIccProfile(&cinfo, icc_buf, icc_length);\n    JSAMPROW row_pointer[1];\n    JDIMENSION row;\n    while (cinfo.next_scanline < cinfo.image_height) {\n        FX_LPCBYTE src_scan = pSource->GetScanline(cinfo.next_scanline);\n        if (nComponents > 1) {\n            FX_LPBYTE dest_scan = line_buf;\n            if (nComponents == 3) {\n                for (int i = 0; i < width; i ++) {\n                    dest_scan[0] = src_scan[2];\n                    dest_scan[1] = src_scan[1];\n                    dest_scan[2] = src_scan[0];\n                    dest_scan += 3;\n                    src_scan += Bpp;\n                }\n            } else {\n                for (int i = 0; i < pitch; i ++) {\n                    *dest_scan++ = ~*src_scan++;\n                }\n            }\n            row_pointer[0] = line_buf;\n        } else {\n            row_pointer[0] = (FX_LPBYTE)src_scan;\n        }\n        row = cinfo.next_scanline;\n        jpeg_write_scanlines(&cinfo, row_pointer, 1);\n        if (cinfo.next_scanline == row) {\n            dest_buf = FX_Realloc(FX_BYTE, dest_buf, dest_buf_length + JPEG_BLOCK_SIZE);\n            if (dest_buf == NULL) {\n                FX_Free(line_buf);\n                return;\n            }\n            dest.next_output_byte = dest_buf + dest_buf_length - dest.free_in_buffer;\n            dest_buf_length += JPEG_BLOCK_SIZE;\n            dest.free_in_buffer += JPEG_BLOCK_SIZE;\n        }\n    }\n    jpeg_finish_compress(&cinfo);\n    jpeg_destroy_compress(&cinfo);\n    if (line_buf) {\n        FX_Free(line_buf);\n    }\n    dest_size = dest_buf_length - (FX_STRSIZE)dest.free_in_buffer;\n}\nstatic FX_BOOL _JpegLoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,\n                             int& num_components, int& bits_per_components, FX_BOOL& color_transform,\n                             FX_LPBYTE* icc_buf_ptr, FX_DWORD* icc_length)\n{\n    _JpegScanSOI(src_buf, src_size);\n    struct jpeg_decompress_struct cinfo;\n    struct jpeg_error_mgr jerr;\n    jerr.error_exit = _error_fatal;\n    jerr.emit_message = _error_do_nothing1;\n    jerr.output_message = _error_do_nothing;\n    jerr.format_message = _error_do_nothing2;\n    jerr.reset_error_mgr = _error_do_nothing;\n    jerr.trace_level = 0;\n    cinfo.err = &jerr;\n    jmp_buf mark;\n    cinfo.client_data = &mark;\n    if (setjmp(mark) == -1) {\n        return FALSE;\n    }\n    jpeg_create_decompress(&cinfo);\n    struct jpeg_source_mgr src;\n    src.init_source = _src_do_nothing;\n    src.term_source = _src_do_nothing;\n    src.skip_input_data = _src_skip_data;\n    src.fill_input_buffer = _src_fill_buffer;\n    src.resync_to_restart = _src_resync;\n    src.bytes_in_buffer = src_size;\n    src.next_input_byte = src_buf;\n    cinfo.src = &src;\n    if (setjmp(mark) == -1) {\n        jpeg_destroy_decompress(&cinfo);\n        return FALSE;\n    }\n    if(icc_buf_ptr && icc_length) {\n        jpeg_save_markers(&cinfo, JPEG_MARKER_ICC, JPEG_MARKER_MAXSIZE);\n    }\n    int ret = jpeg_read_header(&cinfo, TRUE);\n    if (ret != JPEG_HEADER_OK) {\n        jpeg_destroy_decompress(&cinfo);\n        return FALSE;\n    }\n    width = cinfo.image_width;\n    height = cinfo.image_height;\n    num_components = cinfo.num_components;\n    color_transform = cinfo.jpeg_color_space == JCS_YCbCr || cinfo.jpeg_color_space == JCS_YCCK;\n    bits_per_components = cinfo.data_precision;\n    if(icc_buf_ptr != NULL) {\n        *icc_buf_ptr = NULL;\n    }\n    if(icc_length != NULL) {\n        *icc_length = 0;\n    }\n    jpeg_destroy_decompress(&cinfo);\n    return TRUE;\n}\nclass CCodec_JpegDecoder : public CCodec_ScanlineDecoder\n{\npublic:\n    CCodec_JpegDecoder();\n    ~CCodec_JpegDecoder();\n    FX_BOOL\t\t\t\tCreate(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, int nComps,\n                               FX_BOOL ColorTransform, IFX_JpegProvider* pJP);\n    virtual void\t\tDestroy()\n    {\n        delete this;\n    }\n    virtual void\t\tv_DownScale(int dest_width, int dest_height);\n    virtual FX_BOOL\t\tv_Rewind();\n    virtual FX_LPBYTE\tv_GetNextLine();\n    virtual FX_DWORD\tGetSrcOffset();\n    jmp_buf\t\tm_JmpBuf;\n    struct jpeg_decompress_struct cinfo;\n    struct jpeg_error_mgr jerr;\n    struct jpeg_source_mgr src;\n    FX_LPCBYTE\tm_SrcBuf;\n    FX_DWORD\tm_SrcSize;\n    FX_LPBYTE\tm_pScanlineBuf;\n    FX_BOOL\t\tInitDecode();\n    FX_BOOL\t\tm_bInited, m_bStarted, m_bJpegTransform;\nprotected:\n    IFX_JpegProvider*\tm_pExtProvider;\n    void*\t\t\t\tm_pExtContext;\n    FX_DWORD\t\t\tm_nDefaultScaleDenom;\n};\nCCodec_JpegDecoder::CCodec_JpegDecoder()\n{\n    m_pScanlineBuf = NULL;\n    m_DownScale = 1;\n    m_bStarted = FALSE;\n    m_bInited = FALSE;\n    m_pExtProvider = NULL;\n    m_pExtContext = NULL;\n    FXSYS_memset32(&cinfo, 0, sizeof(cinfo));\n    FXSYS_memset32(&jerr, 0, sizeof(jerr));\n    FXSYS_memset32(&src, 0, sizeof(src));\n    m_nDefaultScaleDenom = 1;\n}\nCCodec_JpegDecoder::~CCodec_JpegDecoder()\n{\n    if (m_pExtProvider) {\n        m_pExtProvider->DestroyDecoder(m_pExtContext);\n        return;\n    }\n    if (m_pScanlineBuf) {\n        FX_Free(m_pScanlineBuf);\n    }\n    if (m_bInited) {\n        jpeg_destroy_decompress(&cinfo);\n    }\n}\nFX_BOOL CCodec_JpegDecoder::InitDecode()\n{\n    cinfo.err = &jerr;\n    cinfo.client_data = &m_JmpBuf;\n    if (setjmp(m_JmpBuf) == -1) {\n        return FALSE;\n    }\n    jpeg_create_decompress(&cinfo);\n    m_bInited = TRUE;\n    cinfo.src = &src;\n    src.bytes_in_buffer = m_SrcSize;\n    src.next_input_byte = m_SrcBuf;\n    if (setjmp(m_JmpBuf) == -1) {\n        jpeg_destroy_decompress(&cinfo);\n        m_bInited = FALSE;\n        return FALSE;\n    }\n    cinfo.image_width = m_OrigWidth;\n    cinfo.image_height = m_OrigHeight;\n    int ret = jpeg_read_header(&cinfo, TRUE);\n    if (ret != JPEG_HEADER_OK) {\n        return FALSE;\n    }\n    if (cinfo.saw_Adobe_marker) {\n        m_bJpegTransform = TRUE;\n    }\n    if (cinfo.num_components == 3 && !m_bJpegTransform) {\n        cinfo.out_color_space = cinfo.jpeg_color_space;\n    }\n    m_OrigWidth = cinfo.image_width;\n    m_OrigHeight = cinfo.image_height;\n    m_OutputWidth = m_OrigWidth;\n    m_OutputHeight = m_OrigHeight;\n    m_nDefaultScaleDenom = cinfo.scale_denom;\n    return TRUE;\n}\nFX_BOOL CCodec_JpegDecoder::Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,\n                                   int nComps, FX_BOOL ColorTransform, IFX_JpegProvider* pJP)\n{\n    if (pJP) {\n        m_pExtProvider = pJP;\n        m_pExtContext = m_pExtProvider->CreateDecoder(src_buf, src_size, width, height, nComps, ColorTransform);\n        return m_pExtContext != NULL;\n    }\n    _JpegScanSOI(src_buf, src_size);\n    m_SrcBuf = src_buf;\n    m_SrcSize = src_size;\n    jerr.error_exit = _error_fatal;\n    jerr.emit_message = _error_do_nothing1;\n    jerr.output_message = _error_do_nothing;\n    jerr.format_message = _error_do_nothing2;\n    jerr.reset_error_mgr = _error_do_nothing;\n    src.init_source = _src_do_nothing;\n    src.term_source = _src_do_nothing;\n    src.skip_input_data = _src_skip_data;\n    src.fill_input_buffer = _src_fill_buffer;\n    src.resync_to_restart = _src_resync;\n    m_bJpegTransform = ColorTransform;\n    if(src_size > 1 && FXSYS_memcmp32(src_buf + src_size - 2, \"\\xFF\\xD9\", 2) != 0) {\n        ((FX_LPBYTE)src_buf)[src_size - 2] = 0xFF;\n        ((FX_LPBYTE)src_buf)[src_size - 1] = 0xD9;\n    }\n    m_OutputWidth = m_OrigWidth = width;\n    m_OutputHeight = m_OrigHeight = height;\n    if (!InitDecode()) {\n        return FALSE;\n    }\n    if (cinfo.num_components < nComps) {\n        return FALSE;\n    }\n    if ((int)cinfo.image_width < width) {\n        return FALSE;\n    }\n    m_Pitch = (cinfo.image_width * cinfo.num_components + 3) / 4 * 4;\n    m_pScanlineBuf = FX_Alloc(FX_BYTE, m_Pitch);\n    if (m_pScanlineBuf == NULL) {\n        return FALSE;\n    }\n    m_nComps = cinfo.num_components;\n    m_bpc = 8;\n    m_bColorTransformed = FALSE;\n    m_bStarted = FALSE;\n    return TRUE;\n}\nextern \"C\" {\n    FX_INT32 FX_GetDownsampleRatio(FX_INT32 originWidth, FX_INT32 originHeight, FX_INT32 downsampleWidth, FX_INT32 downsampleHeight)\n    {\n        int iratio_w = originWidth / downsampleWidth;\n        int iratio_h = originHeight / downsampleHeight;\n        int ratio = (iratio_w > iratio_h) ? iratio_h : iratio_w;\n        if (ratio >= 8) {\n            return 8;\n        } else if (ratio >= 4) {\n            return 4;\n        } else if (ratio >= 2) {\n            return 2;\n        }\n        return 1;\n    }\n}\nvoid CCodec_JpegDecoder::v_DownScale(int dest_width, int dest_height)\n{\n    if (m_pExtProvider) {\n        m_pExtProvider->DownScale(m_pExtContext, dest_width, dest_height);\n        return;\n    }\n    int old_scale = m_DownScale;\n    m_DownScale = FX_GetDownsampleRatio(m_OrigWidth, m_OrigHeight, dest_width, dest_height);\n    m_OutputWidth = (m_OrigWidth + m_DownScale - 1) / m_DownScale;\n    m_OutputHeight = (m_OrigHeight + m_DownScale - 1) / m_DownScale;\n    m_Pitch = (m_OutputWidth * m_nComps + 3) / 4 * 4;\n    if (old_scale != m_DownScale) {\n        m_NextLine = -1;\n    }\n}\nFX_BOOL CCodec_JpegDecoder::v_Rewind()\n{\n    if (m_pExtProvider) {\n        return m_pExtProvider->Rewind(m_pExtContext);\n    }\n    if (m_bStarted) {\n        jpeg_destroy_decompress(&cinfo);\n        if (!InitDecode()) {\n            return FALSE;\n        }\n    }\n    if (setjmp(m_JmpBuf) == -1) {\n        return FALSE;\n    }\n    cinfo.scale_denom = m_nDefaultScaleDenom * m_DownScale;\n    m_OutputWidth = (m_OrigWidth + m_DownScale - 1) / m_DownScale;\n    m_OutputHeight = (m_OrigHeight + m_DownScale - 1) / m_DownScale;\n    if (!jpeg_start_decompress(&cinfo)) {\n        jpeg_destroy_decompress(&cinfo);\n        return FALSE;\n    }\n    if ((int)cinfo.output_width > m_OrigWidth) {\n        FXSYS_assert(FALSE);\n        return FALSE;\n    }\n    m_bStarted = TRUE;\n    return TRUE;\n}\nFX_LPBYTE CCodec_JpegDecoder::v_GetNextLine()\n{\n    if (m_pExtProvider) {\n        return m_pExtProvider->GetNextLine(m_pExtContext);\n    }\n    int nlines = jpeg_read_scanlines(&cinfo, &m_pScanlineBuf, 1);\n    if (nlines < 1) {\n        return NULL;\n    }\n    return m_pScanlineBuf;\n}\nFX_DWORD CCodec_JpegDecoder::GetSrcOffset()\n{\n    if (m_pExtProvider) {\n        return m_pExtProvider->GetSrcOffset(m_pExtContext);\n    }\n    return (FX_DWORD)(m_SrcSize - src.bytes_in_buffer);\n}\nICodec_ScanlineDecoder*\tCCodec_JpegModule::CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size,\n        int width, int height, int nComps, FX_BOOL ColorTransform)\n{\n    if (src_buf == NULL || src_size == 0) {\n        return NULL;\n    }\n    CCodec_JpegDecoder* pDecoder = FX_NEW CCodec_JpegDecoder;\n    if (pDecoder == NULL) {\n        return NULL;\n    }\n    if (!pDecoder->Create(src_buf, src_size, width, height, nComps, ColorTransform, m_pExtProvider)) {\n        delete pDecoder;\n        return NULL;\n    }\n    return pDecoder;\n}\nFX_BOOL CCodec_JpegModule::LoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,\n                                    int& num_components, int& bits_per_components, FX_BOOL& color_transform,\n                                    FX_LPBYTE* icc_buf_ptr, FX_DWORD* icc_length)\n{\n    if (m_pExtProvider) {\n        return m_pExtProvider->LoadInfo(src_buf, src_size, width, height,\n                                        num_components, bits_per_components, color_transform,\n                                        icc_buf_ptr, icc_length);\n    }\n    return _JpegLoadInfo(src_buf, src_size, width, height, num_components, bits_per_components, color_transform, icc_buf_ptr, icc_length);\n}\nFX_BOOL CCodec_JpegModule::Encode(const CFX_DIBSource* pSource, FX_LPBYTE& dest_buf, FX_STRSIZE& dest_size, int quality, FX_LPCBYTE icc_buf, FX_DWORD icc_length)\n{\n    if (m_pExtProvider) {\n        return m_pExtProvider->Encode(pSource, dest_buf, dest_size, quality, icc_buf, icc_length);\n    }\n    if(pSource->GetBPP() < 8 || pSource->GetPalette() != NULL) {\n        ASSERT(pSource->GetBPP() >= 8 && pSource->GetPalette() == NULL);\n        return FALSE;\n    }\n    _JpegEncode(pSource, dest_buf, dest_size, quality, icc_buf, icc_length);\n    return TRUE;\n}\nstruct FXJPEG_Context {\n    jmp_buf\t\t\tm_JumpMark;\n    jpeg_decompress_struct m_Info;\n    jpeg_error_mgr\tm_ErrMgr;\n    jpeg_source_mgr\tm_SrcMgr;\n    unsigned int\tm_SkipSize;\n    void*\t\t(*m_AllocFunc)(unsigned int);\n    void\t\t(*m_FreeFunc)(void*);\n};\nextern \"C\" {\n    static void _error_fatal1(j_common_ptr cinfo)\n    {\n        longjmp(((FXJPEG_Context*)cinfo->client_data)->m_JumpMark, -1);\n    }\n};\nextern \"C\" {\n    static void _src_skip_data1(struct jpeg_decompress_struct* cinfo, long num)\n    {\n        if (cinfo->src->bytes_in_buffer < (size_t)num) {\n            ((FXJPEG_Context*)cinfo->client_data)->m_SkipSize = (unsigned int)(num - cinfo->src->bytes_in_buffer);\n            cinfo->src->bytes_in_buffer = 0;\n        } else {\n            cinfo->src->next_input_byte += num;\n            cinfo->src->bytes_in_buffer -= num;\n        }\n    }\n};\nstatic void* jpeg_alloc_func(unsigned int size)\n{\n    return FX_Alloc(char, size);\n}\nstatic void jpeg_free_func(void* p)\n{\n    FX_Free(p);\n}\nvoid* CCodec_JpegModule::Start()\n{\n    if (m_pExtProvider) {\n        return m_pExtProvider->Start();\n    }\n    FXJPEG_Context* p = (FXJPEG_Context*)FX_Alloc(FX_BYTE, sizeof(FXJPEG_Context));\n    if (p == NULL) {\n        return NULL;\n    }\n    p->m_AllocFunc = jpeg_alloc_func;\n    p->m_FreeFunc = jpeg_free_func;\n    p->m_ErrMgr.error_exit = _error_fatal1;\n    p->m_ErrMgr.emit_message = _error_do_nothing1;\n    p->m_ErrMgr.output_message = _error_do_nothing;\n    p->m_ErrMgr.format_message = _error_do_nothing2;\n    p->m_ErrMgr.reset_error_mgr = _error_do_nothing;\n    p->m_SrcMgr.init_source = _src_do_nothing;\n    p->m_SrcMgr.term_source = _src_do_nothing;\n    p->m_SrcMgr.skip_input_data = _src_skip_data1;\n    p->m_SrcMgr.fill_input_buffer = _src_fill_buffer;\n    p->m_SrcMgr.resync_to_restart = _src_resync;\n    p->m_Info.client_data = p;\n    p->m_Info.err = &p->m_ErrMgr;\n    if (setjmp(p->m_JumpMark) == -1) {\n        return 0;\n    }\n    jpeg_create_decompress(&p->m_Info);\n    p->m_Info.src = &p->m_SrcMgr;\n    p->m_SkipSize = 0;\n    return p;\n}\nvoid CCodec_JpegModule::Finish(void* pContext)\n{\n    if (m_pExtProvider) {\n        m_pExtProvider->Finish(pContext);\n        return;\n    }\n    FXJPEG_Context* p = (FXJPEG_Context*)pContext;\n    jpeg_destroy_decompress(&p->m_Info);\n    p->m_FreeFunc(p);\n}\nvoid CCodec_JpegModule::Input(void* pContext, const unsigned char* src_buf, FX_DWORD src_size)\n{\n    if (m_pExtProvider) {\n        m_pExtProvider->Input(pContext, src_buf, src_size);\n        return;\n    }\n    FXJPEG_Context* p = (FXJPEG_Context*)pContext;\n    if (p->m_SkipSize) {\n        if (p->m_SkipSize > src_size) {\n            p->m_SrcMgr.bytes_in_buffer = 0;\n            p->m_SkipSize -= src_size;\n            return;\n        }\n        src_size -= p->m_SkipSize;\n        src_buf += p->m_SkipSize;\n        p->m_SkipSize = 0;\n    }\n    p->m_SrcMgr.next_input_byte = src_buf;\n    p->m_SrcMgr.bytes_in_buffer = src_size;\n}\nint CCodec_JpegModule::ReadHeader(void* pContext, int* width, int* height, int* nComps)\n{\n    if (m_pExtProvider) {\n        return m_pExtProvider->ReadHeader(pContext, width, height, nComps);\n    }\n    FXJPEG_Context* p = (FXJPEG_Context*)pContext;\n    if (setjmp(p->m_JumpMark) == -1) {\n        return 1;\n    }\n    int ret = jpeg_read_header(&p->m_Info, true);\n    if (ret == JPEG_SUSPENDED) {\n        return 2;\n    }\n    if (ret != JPEG_HEADER_OK) {\n        return 1;\n    }\n    *width = p->m_Info.image_width;\n    *height = p->m_Info.image_height;\n    *nComps = p->m_Info.num_components;\n    return 0;\n}\nFX_BOOL CCodec_JpegModule::StartScanline(void* pContext, int down_scale)\n{\n    if (m_pExtProvider) {\n        return m_pExtProvider->StartScanline(pContext, down_scale);\n    }\n    FXJPEG_Context* p = (FXJPEG_Context*)pContext;\n    if (setjmp(p->m_JumpMark) == -1) {\n        return FALSE;\n    }\n    p->m_Info.scale_denom = down_scale;\n    return jpeg_start_decompress(&p->m_Info);\n}\nFX_BOOL CCodec_JpegModule::ReadScanline(void* pContext, unsigned char* dest_buf)\n{\n    if (m_pExtProvider) {\n        return m_pExtProvider->ReadScanline(pContext, dest_buf);\n    }\n    FXJPEG_Context* p = (FXJPEG_Context*)pContext;\n    if (setjmp(p->m_JumpMark) == -1) {\n        return FALSE;\n    }\n    int nlines = jpeg_read_scanlines(&p->m_Info, &dest_buf, 1);\n    return nlines == 1;\n}\nFX_DWORD CCodec_JpegModule::GetAvailInput(void* pContext, FX_LPBYTE* avail_buf_ptr)\n{\n    if (m_pExtProvider) {\n        return m_pExtProvider->GetAvailInput(pContext, avail_buf_ptr);\n    }\n    if(avail_buf_ptr != NULL) {\n        *avail_buf_ptr = NULL;\n        if(((FXJPEG_Context*)pContext)->m_SrcMgr.bytes_in_buffer > 0) {\n            *avail_buf_ptr = (FX_LPBYTE)((FXJPEG_Context*)pContext)->m_SrcMgr.next_input_byte;\n        }\n    }\n    return (FX_DWORD)((FXJPEG_Context*)pContext)->m_SrcMgr.bytes_in_buffer;\n}\n"
  },
  {
    "path": "core/src/fxcodec/codec/fx_codec_jpx_opj.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxcodec/fx_codec.h\"\n#include \"codec_int.h\"\n#include \"../fx_libopenjpeg/libopenjpeg20/openjpeg.h\"\n#include \"../lcms2/include/fx_lcms2.h\"\nstatic void fx_error_callback(const char *msg, void *client_data)\n{\n    (void)client_data;\n}\nstatic void fx_warning_callback(const char *msg, void *client_data)\n{\n    (void)client_data;\n}\nstatic void fx_info_callback(const char *msg, void *client_data)\n{\n    (void)client_data;\n}\ntypedef struct {\n    const unsigned char* src_data;\n    int\t\t\t\t\t src_size;\n    int\t\t\t\t\t offset;\n} decodeData;\nstatic OPJ_SIZE_T opj_read_from_memory (void * p_buffer, OPJ_SIZE_T p_nb_bytes,  decodeData* srcData)\n{\n    if(srcData == NULL || srcData->src_size == 0 || srcData->src_data == NULL || srcData->offset >= srcData->src_size) {\n        return -1;\n    }\n    OPJ_SIZE_T readlength = p_nb_bytes;\n    OPJ_SIZE_T bufferLength = (OPJ_SIZE_T)(srcData->src_size - srcData->offset);\n    if(bufferLength <= 0) {\n        return 0;\n    }\n    if(bufferLength <= p_nb_bytes) {\n        readlength = bufferLength;\n    }\n    memcpy(p_buffer, &(srcData->src_data[srcData->offset]), readlength);\n    srcData->offset += (int)readlength;\n    return readlength;\n}\nstatic OPJ_SIZE_T opj_write_from_memory (void * p_buffer, OPJ_SIZE_T p_nb_bytes, decodeData* srcData)\n{\n    if(srcData == NULL || srcData->src_size == 0 || srcData->src_data == NULL || srcData->offset >= srcData->src_size) {\n        return -1;\n    }\n    OPJ_SIZE_T writeLength = p_nb_bytes;\n    OPJ_SIZE_T bufferLength = (OPJ_SIZE_T)(srcData->src_size - srcData->offset);\n    if(bufferLength <= p_nb_bytes) {\n        writeLength = bufferLength;\n    }\n    memcpy((void*&)(srcData->src_data[srcData->offset]), p_buffer, writeLength);\n    srcData->offset += (int)writeLength;\n    return writeLength;\n}\nstatic OPJ_OFF_T opj_skip_from_memory (OPJ_OFF_T p_nb_bytes, decodeData* srcData)\n{\n    if(srcData == NULL || srcData->src_size == 0 || srcData->src_data == NULL || srcData->offset >= srcData->src_size) {\n        return -1;\n    }\n    OPJ_OFF_T postion = srcData->offset + p_nb_bytes;\n    if(postion < 0 ) {\n        postion = 0;\n    } else if (postion > srcData->src_size) {\n    }\n    srcData->offset = (int)postion;\n    return p_nb_bytes;\n}\nstatic OPJ_BOOL opj_seek_from_memory (OPJ_OFF_T p_nb_bytes, decodeData * srcData)\n{\n    if(srcData == NULL || srcData->src_size == 0 || srcData->src_data == NULL || srcData->offset >= srcData->src_size) {\n        return -1;\n    }\n    srcData->offset = (int)p_nb_bytes;\n    if(srcData->offset < 0) {\n        srcData->offset = 0;\n    } else if(srcData->offset > srcData->src_size) {\n        srcData->offset = srcData->src_size;\n    }\n    return OPJ_TRUE;\n}\nopj_stream_t* fx_opj_stream_create_memory_stream (decodeData* data,\tOPJ_SIZE_T p_size, \tOPJ_BOOL p_is_read_stream)\n{\n    opj_stream_t* l_stream = 00;\n    if (!data || ! data->src_data || data->src_size <= 0 ) {\n        return NULL;\n    }\n    l_stream = opj_stream_create(p_size, p_is_read_stream);\n    if (! l_stream) {\n        return NULL;\n    }\n    opj_stream_set_user_data_v3(l_stream, data, NULL);\n    opj_stream_set_user_data_length(l_stream, data->src_size);\n    opj_stream_set_read_function(l_stream, (opj_stream_read_fn) opj_read_from_memory);\n    opj_stream_set_write_function(l_stream, (opj_stream_write_fn) opj_write_from_memory);\n    opj_stream_set_skip_function(l_stream, (opj_stream_skip_fn) opj_skip_from_memory);\n    opj_stream_set_seek_function(l_stream, (opj_stream_seek_fn) opj_seek_from_memory);\n    return l_stream;\n}\nstatic void sycc_to_rgb(int offset, int upb, int y, int cb, int cr,\n                        int *out_r, int *out_g, int *out_b)\n{\n    int r, g, b;\n    cb -= offset;\n    cr -= offset;\n    r = y + (int)(1.402 * (float)cr);\n    if(r < 0) {\n        r = 0;\n    } else if(r > upb) {\n        r = upb;\n    } *out_r = r;\n    g = y - (int)(0.344 * (float)cb + 0.714 * (float)cr);\n    if(g < 0) {\n        g = 0;\n    } else if(g > upb) {\n        g = upb;\n    } *out_g = g;\n    b = y + (int)(1.772 * (float)cb);\n    if(b < 0) {\n        b = 0;\n    } else if(b > upb) {\n        b = upb;\n    } *out_b = b;\n}\nstatic void sycc444_to_rgb(opj_image_t *img)\n{\n    int *d0, *d1, *d2, *r, *g, *b;\n    const int *y, *cb, *cr;\n    int maxw, maxh, max, i, offset, upb;\n    i = (int)img->comps[0].prec;\n    offset = 1 << (i - 1);\n    upb = (1 << i) - 1;\n    maxw = (int)img->comps[0].w;\n    maxh = (int)img->comps[0].h;\n    max = maxw * maxh;\n    y = img->comps[0].data;\n    cb = img->comps[1].data;\n    cr = img->comps[2].data;\n    d0 = r = FX_Alloc(int, (size_t)max);\n    d1 = g = FX_Alloc(int, (size_t)max);\n    d2 = b = FX_Alloc(int, (size_t)max);\n    for(i = 0; i < max; ++i) {\n        sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);\n        ++y;\n        ++cb;\n        ++cr;\n        ++r;\n        ++g;\n        ++b;\n    }\n    FX_Free(img->comps[0].data);\n    img->comps[0].data = d0;\n    FX_Free(img->comps[1].data);\n    img->comps[1].data = d1;\n    FX_Free(img->comps[2].data);\n    img->comps[2].data = d2;\n}\nstatic void sycc422_to_rgb(opj_image_t *img)\n{\n    int *d0, *d1, *d2, *r, *g, *b;\n    const int *y, *cb, *cr;\n    int maxw, maxh, max, offset, upb;\n    int i, j;\n    i = (int)img->comps[0].prec;\n    offset = 1 << (i - 1);\n    upb = (1 << i) - 1;\n    maxw = (int)img->comps[0].w;\n    maxh = (int)img->comps[0].h;\n    max = maxw * maxh;\n    y = img->comps[0].data;\n    cb = img->comps[1].data;\n    cr = img->comps[2].data;\n    d0 = r = FX_Alloc(int, (size_t)max);\n    d1 = g = FX_Alloc(int, (size_t)max);\n    d2 = b = FX_Alloc(int, (size_t)max);\n    for(i = 0; i < maxh; ++i) {\n        for(j = 0; j < maxw; j += 2) {\n            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);\n            ++y;\n            ++r;\n            ++g;\n            ++b;\n            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);\n            ++y;\n            ++r;\n            ++g;\n            ++b;\n            ++cb;\n            ++cr;\n        }\n    }\n    FX_Free(img->comps[0].data);\n    img->comps[0].data = d0;\n    FX_Free(img->comps[1].data);\n    img->comps[1].data = d1;\n    FX_Free(img->comps[2].data);\n    img->comps[2].data = d2;\n    img->comps[1].w = maxw;\n    img->comps[1].h = maxh;\n    img->comps[2].w = maxw;\n    img->comps[2].h = maxh;\n    img->comps[1].w = (OPJ_UINT32)maxw;\n    img->comps[1].h = (OPJ_UINT32)maxh;\n    img->comps[2].w = (OPJ_UINT32)maxw;\n    img->comps[2].h = (OPJ_UINT32)maxh;\n    img->comps[1].dx = img->comps[0].dx;\n    img->comps[2].dx = img->comps[0].dx;\n    img->comps[1].dy = img->comps[0].dy;\n    img->comps[2].dy = img->comps[0].dy;\n}\nstatic void sycc420_to_rgb(opj_image_t *img)\n{\n    int *d0, *d1, *d2, *r, *g, *b, *nr, *ng, *nb;\n    const int *y, *cb, *cr, *ny;\n    int maxw, maxh, max, offset, upb;\n    int i, j;\n    i = (int)img->comps[0].prec;\n    offset = 1 << (i - 1);\n    upb = (1 << i) - 1;\n    maxw = (int)img->comps[0].w;\n    maxh = (int)img->comps[0].h;\n    max = maxw * maxh;\n    y = img->comps[0].data;\n    cb = img->comps[1].data;\n    cr = img->comps[2].data;\n    d0 = r = FX_Alloc(int, (size_t)max);\n    d1 = g = FX_Alloc(int, (size_t)max);\n    d2 = b = FX_Alloc(int, (size_t)max);\n    for(i = 0; i < maxh; i += 2) {\n        ny = y + maxw;\n        nr = r + maxw;\n        ng = g + maxw;\n        nb = b + maxw;\n        for(j = 0; j < maxw;  j += 2) {\n            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);\n            ++y;\n            ++r;\n            ++g;\n            ++b;\n            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);\n            ++y;\n            ++r;\n            ++g;\n            ++b;\n            sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);\n            ++ny;\n            ++nr;\n            ++ng;\n            ++nb;\n            sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);\n            ++ny;\n            ++nr;\n            ++ng;\n            ++nb;\n            ++cb;\n            ++cr;\n        }\n        y += maxw;\n        r += maxw;\n        g += maxw;\n        b += maxw;\n    }\n    FX_Free(img->comps[0].data);\n    img->comps[0].data = d0;\n    FX_Free(img->comps[1].data);\n    img->comps[1].data = d1;\n    FX_Free(img->comps[2].data);\n    img->comps[2].data = d2;\n    img->comps[1].w = maxw;\n    img->comps[1].h = maxh;\n    img->comps[2].w = maxw;\n    img->comps[2].h = maxh;\n    img->comps[1].w = (OPJ_UINT32)maxw;\n    img->comps[1].h = (OPJ_UINT32)maxh;\n    img->comps[2].w = (OPJ_UINT32)maxw;\n    img->comps[2].h = (OPJ_UINT32)maxh;\n    img->comps[1].dx = img->comps[0].dx;\n    img->comps[2].dx = img->comps[0].dx;\n    img->comps[1].dy = img->comps[0].dy;\n    img->comps[2].dy = img->comps[0].dy;\n}\nvoid color_sycc_to_rgb(opj_image_t *img)\n{\n    if(img->numcomps < 3) {\n        img->color_space = OPJ_CLRSPC_GRAY;\n        return;\n    }\n    if((img->comps[0].dx == 1)\n            && (img->comps[1].dx == 2)\n            && (img->comps[2].dx == 2)\n            && (img->comps[0].dy == 1)\n            && (img->comps[1].dy == 2)\n            && (img->comps[2].dy == 2)) {\n        sycc420_to_rgb(img);\n    } else if((img->comps[0].dx == 1)\n              && (img->comps[1].dx == 2)\n              && (img->comps[2].dx == 2)\n              && (img->comps[0].dy == 1)\n              && (img->comps[1].dy == 1)\n              && (img->comps[2].dy == 1)) {\n        sycc422_to_rgb(img);\n    } else if((img->comps[0].dx == 1)\n              && (img->comps[1].dx == 1)\n              && (img->comps[2].dx == 1)\n              && (img->comps[0].dy == 1)\n              && (img->comps[1].dy == 1)\n              && (img->comps[2].dy == 1)) {\n        sycc444_to_rgb(img);\n    } else {\n        return;\n    }\n    img->color_space = OPJ_CLRSPC_SRGB;\n}\nvoid color_apply_icc_profile(opj_image_t *image)\n{\n    cmsHPROFILE in_prof, out_prof;\n    cmsHTRANSFORM transform;\n    cmsColorSpaceSignature in_space, out_space;\n    cmsUInt32Number intent, in_type, out_type, nr_samples;\n    int *r, *g, *b;\n    int prec, i, max, max_w, max_h;\n    OPJ_COLOR_SPACE oldspace;\n    in_prof =\n        cmsOpenProfileFromMem(image->icc_profile_buf, image->icc_profile_len);\n    if(in_prof == NULL) {\n        return;\n    }\n    in_space = cmsGetPCS(in_prof);\n    out_space = cmsGetColorSpace(in_prof);\n    intent = cmsGetHeaderRenderingIntent(in_prof);\n    max_w = (int)image->comps[0].w;\n    max_h = (int)image->comps[0].h;\n    prec = (int)image->comps[0].prec;\n    oldspace = image->color_space;\n    if(out_space == cmsSigRgbData) {\n        if( prec <= 8 ) {\n            in_type = TYPE_RGB_8;\n            out_type = TYPE_RGB_8;\n        } else {\n            in_type = TYPE_RGB_16;\n            out_type = TYPE_RGB_16;\n        }\n        out_prof = cmsCreate_sRGBProfile();\n        image->color_space = OPJ_CLRSPC_SRGB;\n    } else if(out_space == cmsSigGrayData) {\n        if( prec <= 8 ) {\n            in_type = TYPE_GRAY_8;\n            out_type = TYPE_RGB_8;\n        } else {\n            in_type = TYPE_GRAY_16;\n            out_type = TYPE_RGB_16;\n        }\n        out_prof = cmsCreate_sRGBProfile();\n        image->color_space = OPJ_CLRSPC_SRGB;\n    } else if(out_space == cmsSigYCbCrData) {\n        in_type = TYPE_YCbCr_16;\n        out_type = TYPE_RGB_16;\n        out_prof = cmsCreate_sRGBProfile();\n        image->color_space = OPJ_CLRSPC_SRGB;\n    } else {\n        return;\n    }\n    transform = cmsCreateTransform(in_prof, in_type,\n                                   out_prof, out_type, intent, 0);\n    cmsCloseProfile(in_prof);\n    cmsCloseProfile(out_prof);\n    if(transform == NULL) {\n        image->color_space = oldspace;\n        return;\n    }\n    if(image->numcomps > 2) {\n        if( prec <= 8 ) {\n            unsigned char *inbuf, *outbuf, *in, *out;\n            max = max_w * max_h;\n            nr_samples = (cmsUInt32Number)max * 3 * (cmsUInt32Number)sizeof(unsigned char);\n            in = inbuf = FX_Alloc(unsigned char, nr_samples);\n            out = outbuf = FX_Alloc(unsigned char, nr_samples);\n            r = image->comps[0].data;\n            g = image->comps[1].data;\n            b = image->comps[2].data;\n            for(i = 0; i < max; ++i) {\n                *in++ = (unsigned char) * r++;\n                *in++ = (unsigned char) * g++;\n                *in++ = (unsigned char) * b++;\n            }\n            cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max);\n            r = image->comps[0].data;\n            g = image->comps[1].data;\n            b = image->comps[2].data;\n            for(i = 0; i < max; ++i) {\n                *r++ = (int) * out++;\n                *g++ = (int) * out++;\n                *b++ = (int) * out++;\n            }\n            FX_Free(inbuf);\n            FX_Free(outbuf);\n        } else {\n            unsigned short *inbuf, *outbuf, *in, *out;\n            max = max_w * max_h;\n            nr_samples = (cmsUInt32Number)max * 3 * (cmsUInt32Number)sizeof(unsigned short);\n            in = inbuf = FX_Alloc(unsigned short, nr_samples);\n            out = outbuf = FX_Alloc(unsigned short, nr_samples);\n            r = image->comps[0].data;\n            g = image->comps[1].data;\n            b = image->comps[2].data;\n            for(i = 0; i < max; ++i) {\n                *in++ = (unsigned short) * r++;\n                *in++ = (unsigned short) * g++;\n                *in++ = (unsigned short) * b++;\n            }\n            cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max);\n            r = image->comps[0].data;\n            g = image->comps[1].data;\n            b = image->comps[2].data;\n            for(i = 0; i < max; ++i) {\n                *r++ = (int) * out++;\n                *g++ = (int) * out++;\n                *b++ = (int) * out++;\n            }\n            FX_Free(inbuf);\n            FX_Free(outbuf);\n        }\n    } else {\n        unsigned char *in, *inbuf, *out, *outbuf;\n        max = max_w * max_h;\n        nr_samples = (cmsUInt32Number)max * 3 * sizeof(unsigned char);\n        in = inbuf = FX_Alloc(unsigned char, nr_samples);\n        out = outbuf = FX_Alloc(unsigned char, nr_samples);\n        image->comps = (opj_image_comp_t*)\n                       realloc(image->comps, (image->numcomps + 2) * sizeof(opj_image_comp_t));\n        if(image->numcomps == 2) {\n            image->comps[3] = image->comps[1];\n        }\n        image->comps[1] = image->comps[0];\n        image->comps[2] = image->comps[0];\n        image->comps[1].data = FX_Alloc(int, (size_t)max);\n        FXSYS_memset8(image->comps[1].data, 0, sizeof(int) * (size_t)max);\n        image->comps[2].data = FX_Alloc(int, (size_t)max);\n        FXSYS_memset8(image->comps[2].data, 0, sizeof(int) * (size_t)max);\n        image->numcomps += 2;\n        r = image->comps[0].data;\n        for(i = 0; i < max; ++i) {\n            *in++ = (unsigned char) * r++;\n        }\n        cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max);\n        r = image->comps[0].data;\n        g = image->comps[1].data;\n        b = image->comps[2].data;\n        for(i = 0; i < max; ++i) {\n            *r++ = (int) * out++;\n            *g++ = (int) * out++;\n            *b++ = (int) * out++;\n        }\n        FX_Free(inbuf);\n        FX_Free(outbuf);\n    }\n    cmsDeleteTransform(transform);\n}\nvoid color_apply_conversion(opj_image_t *image)\n{\n    int *row;\n    int enumcs, numcomps;\n    numcomps = image->numcomps;\n    if(numcomps < 3) {\n        return;\n    }\n    row = (int*)image->icc_profile_buf;\n    enumcs = row[0];\n    if(enumcs == 14) {\n        int *L, *a, *b, *red, *green, *blue, *src0, *src1, *src2;\n        double rl, ol, ra, oa, rb, ob, prec0, prec1, prec2;\n        double minL, maxL, mina, maxa, minb, maxb;\n        unsigned int default_type, il;\n        unsigned int i, max, illu;\n        cmsHPROFILE in, out;\n        cmsHTRANSFORM transform;\n        cmsUInt16Number RGB[3];\n        cmsCIELab Lab;\n        illu = 0;\n        il = 0;\n        in = cmsCreateLab4Profile(NULL);\n        out = cmsCreate_sRGBProfile();\n        transform =\n            cmsCreateTransform(in, TYPE_Lab_DBL, out, TYPE_RGB_16,\n                               INTENT_PERCEPTUAL, 0);\n        cmsCloseProfile(in);\n        cmsCloseProfile(out);\n        if(transform == NULL) {\n            return;\n        }\n        prec0 = (double)image->comps[0].prec;\n        prec1 = (double)image->comps[1].prec;\n        prec2 = (double)image->comps[2].prec;\n        default_type = row[1];\n        if(default_type == 0x44454600) {\n            rl = 100;\n            ra = 170;\n            rb = 200;\n            ol = 0;\n            oa = pow(2, prec1 - 1);\n            ob = pow(2, prec2 - 2)  + pow(2, prec2 - 3);\n        } else {\n            rl = row[2];\n            ra = row[4];\n            rb = row[6];\n            ol = row[3];\n            oa = row[5];\n            ob = row[7];\n        }\n        L = src0 = image->comps[0].data;\n        a = src1 = image->comps[1].data;\n        b = src2 = image->comps[2].data;\n        max = image->comps[0].w * image->comps[0].h;\n        red = FX_Alloc(int, max);\n        image->comps[0].data = red;\n        green = FX_Alloc(int, max);\n        image->comps[1].data = green;\n        blue = FX_Alloc(int, max);\n        image->comps[2].data = blue;\n        minL = -(rl * ol) / (pow(2, prec0) - 1);\n        maxL = minL + rl;\n        mina = -(ra * oa) / (pow(2, prec1) - 1);\n        maxa = mina + ra;\n        minb = -(rb * ob) / (pow(2, prec2) - 1);\n        maxb = minb + rb;\n        for(i = 0; i < max; ++i) {\n            Lab.L = minL + (double)(*L) * (maxL - minL) / (pow(2, prec0) - 1);\n            ++L;\n            Lab.a = mina + (double)(*a) * (maxa - mina) / (pow(2, prec1) - 1);\n            ++a;\n            Lab.b = minb + (double)(*b) * (maxb - minb) / (pow(2, prec2) - 1);\n            ++b;\n            cmsDoTransform(transform, &Lab, RGB, 1);\n            *red++ = RGB[0];\n            *green++ = RGB[1];\n            *blue++ = RGB[2];\n        }\n        cmsDeleteTransform(transform);\n        FX_Free(src0);\n        FX_Free(src1);\n        FX_Free(src2);\n        image->color_space = OPJ_CLRSPC_SRGB;\n        image->comps[0].prec = 16;\n        image->comps[1].prec = 16;\n        image->comps[2].prec = 16;\n        return;\n    }\n}\nclass CJPX_Decoder : public CFX_Object\n{\npublic:\n    CJPX_Decoder();\n    ~CJPX_Decoder();\n    FX_BOOL\tInit(const unsigned char* src_data, int src_size);\n    void\tGetInfo(FX_DWORD& width, FX_DWORD& height, FX_DWORD& codestream_nComps, FX_DWORD& output_nComps);\n    FX_BOOL\tDecode(FX_LPBYTE dest_buf, int pitch, FX_BOOL bTranslateColor, FX_LPBYTE offsets);\n    FX_LPCBYTE m_SrcData;\n    int m_SrcSize;\n    opj_image_t *image;\n    opj_codec_t* l_codec;\n    opj_stream_t *l_stream;\n    FX_BOOL m_useColorSpace;\n};\nCJPX_Decoder::CJPX_Decoder(): image(NULL), l_codec(NULL), l_stream(NULL), m_useColorSpace(FALSE)\n{\n}\nCJPX_Decoder::~CJPX_Decoder()\n{\n    if(l_codec) {\n        opj_destroy_codec(l_codec);\n    }\n    if(l_stream) {\n        opj_stream_destroy(l_stream);\n    }\n    if(image) {\n        opj_image_destroy(image);\n    }\n}\nFX_BOOL CJPX_Decoder::Init(const unsigned char* src_data, int src_size)\n{\n    opj_dparameters_t parameters;\n    try {\n        image = NULL;\n        m_SrcData = src_data;\n        m_SrcSize = src_size;\n        decodeData srcData;\n        srcData.offset  = 0;\n        srcData.src_size = src_size;\n        srcData.src_data = src_data;\n        l_stream = fx_opj_stream_create_memory_stream(&srcData, OPJ_J2K_STREAM_CHUNK_SIZE, 1);\n        if (l_stream == NULL) {\n            return FALSE;\n        }\n        opj_set_default_decoder_parameters(&parameters);\n        parameters.decod_format = 0;\n        parameters.cod_format = 3;\n        if(FXSYS_memcmp32(m_SrcData, \"\\x00\\x00\\x00\\x0c\\x6a\\x50\\x20\\x20\\x0d\\x0a\\x87\\x0a\", 12) == 0) {\n            l_codec = opj_create_decompress(OPJ_CODEC_JP2);\n            parameters.decod_format = 1;\n        } else {\n            l_codec = opj_create_decompress(OPJ_CODEC_J2K);\n        }\n        if(!l_codec) {\n            return FALSE;\n        }\n        opj_set_info_handler(l_codec, fx_info_callback, 00);\n        opj_set_warning_handler(l_codec, fx_warning_callback, 00);\n        opj_set_error_handler(l_codec, fx_error_callback, 00);\n        if ( !opj_setup_decoder(l_codec, &parameters) ) {\n            return FALSE;\n        }\n        if(! opj_read_header(l_stream, l_codec, &image)) {\n            image = NULL;\n            return FALSE;\n        }\n        if(this->m_useColorSpace) {\n            image->useColorSpace = 1;\n        } else {\n            image->useColorSpace = 0;\n        }\n        if (!parameters.nb_tile_to_decode) {\n            if (!opj_set_decode_area(l_codec, image, parameters.DA_x0,\n                                     parameters.DA_y0, parameters.DA_x1, parameters.DA_y1)) {\n                opj_image_destroy(image);\n                image = NULL;\n                return FALSE;\n            }\n            if (!(opj_decode(l_codec, l_stream, image) && opj_end_decompress(l_codec,\tl_stream))) {\n                opj_image_destroy(image);\n                image = NULL;\n                return FALSE;\n            }\n        } else {\n            if (!opj_get_decoded_tile(l_codec, l_stream, image, parameters.tile_index)) {\n                return FALSE;\n            }\n        }\n        opj_stream_destroy(l_stream);\n        l_stream = NULL;\n        if( image->color_space != OPJ_CLRSPC_SYCC\n                && image->numcomps == 3 && image->comps[0].dx == image->comps[0].dy\n                && image->comps[1].dx != 1 ) {\n            image->color_space = OPJ_CLRSPC_SYCC;\n        } else if (image->numcomps <= 2) {\n            image->color_space = OPJ_CLRSPC_GRAY;\n        }\n        if(image->color_space == OPJ_CLRSPC_SYCC) {\n            color_sycc_to_rgb(image);\n        }\n        if(image->icc_profile_buf && !image->useColorSpace) {\n            FX_Free(image->icc_profile_buf);\n            image->icc_profile_buf = NULL;\n            image->icc_profile_len = 0;\n        }\n        if(!image) {\n            return FALSE;\n        }\n    } catch (...) {\n        return FALSE;\n    }\n    return TRUE;\n}\nvoid CJPX_Decoder::GetInfo(FX_DWORD& width, FX_DWORD& height, FX_DWORD& codestream_nComps, FX_DWORD& output_nComps)\n{\n    width = (FX_DWORD)image->x1;\n    height = (FX_DWORD)image->y1;\n    output_nComps = codestream_nComps = (FX_DWORD)image->numcomps;\n}\nFX_BOOL CJPX_Decoder::Decode(FX_LPBYTE dest_buf, int pitch, FX_BOOL bTranslateColor, FX_LPBYTE offsets)\n{\n    FX_BYTE** channel_bufs;\n    int* adjust_comps;\n    int i, wid, hei, row, col, channel, src;\n    FX_BOOL flag;\n    FX_LPBYTE pChannel, pScanline, pPixel;\n    try {\n        if(image->comps[0].w != image->x1 || image->comps[0].h != image->y1) {\n            return FALSE;\n        }\n        if(pitch < (int)(image->comps[0].w * 8 * image->numcomps + 31) >> 5 << 2) {\n            return FALSE;\n        }\n        FXSYS_memset8(dest_buf, 0xff, image->y1 * pitch);\n        channel_bufs = FX_Alloc(FX_BYTE*, image->numcomps);\n        if (channel_bufs == NULL) {\n            return FALSE;\n        }\n        adjust_comps = FX_Alloc(int, image->numcomps);\n        if (adjust_comps == NULL) {\n            FX_Free(channel_bufs);\n            return FALSE;\n        }\n        flag = TRUE;\n        for (i = 0; i < (int)image->numcomps; i ++) {\n            channel_bufs[i] = dest_buf + offsets[i];\n            adjust_comps[i] = image->comps[i].prec - 8;\n            if(i > 0) {\n                if(image->comps[i].dx != image->comps[i - 1].dx\n                        || image->comps[i].dy != image->comps[i - 1].dy\n                        || image->comps[i].prec != image->comps[i - 1].prec) {\n                    flag = FALSE;\n                    goto failed;\n                }\n            }\n        }\n        wid = image->comps[0].w;\n        hei = image->comps[0].h;\n        for (channel = 0; channel < (int)image->numcomps; channel++) {\n            pChannel = channel_bufs[channel];\n            if(adjust_comps[channel] < 0) {\n                for(row = 0; row < hei; row++) {\n                    pScanline = pChannel + row * pitch;\n                    for (col = 0; col < wid; col++) {\n                        pPixel = pScanline + col * image->numcomps;\n                        src = image->comps[channel].data[row * wid + col];\n                        src += image->comps[channel].sgnd ? 1 << (image->comps[channel].prec - 1) : 0;\n                        if (adjust_comps[channel] > 0) {\n                            *pPixel = 0;\n                        } else {\n                            *pPixel = (FX_BYTE)(src << -adjust_comps[channel]);\n                        }\n                    }\n                }\n            } else {\n                for(row = 0; row < hei; row++) {\n                    pScanline = pChannel + row * pitch;\n                    for (col = 0; col < wid; col++) {\n                        pPixel = pScanline + col * image->numcomps;\n                        if (!image->comps[channel].data) {\n                            continue;\n                        }\n                        src = image->comps[channel].data[row * wid + col];\n                        src += image->comps[channel].sgnd ? 1 << (image->comps[channel].prec - 1) : 0;\n                        if (adjust_comps[channel] - 1 < 0) {\n                            *pPixel = (FX_BYTE)((src >> adjust_comps[channel]));\n                        } else {\n                            int tmpPixel = (src >> adjust_comps[channel]) + ((src >> (adjust_comps[channel] - 1)) % 2);\n                            if (tmpPixel > 255) {\n                                tmpPixel = 255;\n                            } else if (tmpPixel < 0) {\n                                tmpPixel = 0;\n                            }\n                            *pPixel = (FX_BYTE)tmpPixel;\n                        }\n                    }\n                }\n            }\n        }\n    } catch (...) {\n        if (channel_bufs) {\n            FX_Free(channel_bufs);\n        }\n        FX_Free(adjust_comps);\n        return FALSE;\n    }\n    FX_Free(channel_bufs);\n    FX_Free(adjust_comps);\n    return TRUE;\nfailed:\n    FX_Free(channel_bufs);\n    FX_Free(adjust_comps);\n    return FALSE;\n}\nvoid initialize_transition_table();\nvoid initialize_significance_luts();\nvoid initialize_sign_lut();\nCCodec_JpxModule::CCodec_JpxModule()\n{\n}\nvoid* CCodec_JpxModule::CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size , FX_BOOL useColorSpace)\n{\n    CJPX_Decoder* pDecoder = FX_NEW CJPX_Decoder;\n    if (pDecoder == NULL) {\n        return NULL;\n    }\n    pDecoder->m_useColorSpace = useColorSpace;\n    if (!pDecoder->Init(src_buf, src_size)) {\n        delete pDecoder;\n        return NULL;\n    }\n    return pDecoder;\n}\nvoid CCodec_JpxModule::GetImageInfo(FX_LPVOID ctx, FX_DWORD& width, FX_DWORD& height,\n                                    FX_DWORD& codestream_nComps, FX_DWORD& output_nComps)\n{\n    CJPX_Decoder* pDecoder = (CJPX_Decoder*)ctx;\n    pDecoder->GetInfo(width, height, codestream_nComps, output_nComps);\n}\nFX_BOOL CCodec_JpxModule::Decode(void* ctx, FX_LPBYTE dest_data, int pitch, FX_BOOL bTranslateColor, FX_LPBYTE offsets)\n{\n    CJPX_Decoder* pDecoder = (CJPX_Decoder*)ctx;\n    return pDecoder->Decode(dest_data, pitch, bTranslateColor, offsets);\n}\nvoid CCodec_JpxModule::DestroyDecoder(void* ctx)\n{\n    CJPX_Decoder* pDecoder = (CJPX_Decoder*)ctx;\n    delete pDecoder;\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/include/fx_openjpeg.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_OPENJPEG_H_\n#define _FX_OPENJPEG_H_\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../libopenjpeg20/openjpeg.h\"\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/CMakeLists.txt",
    "content": "include_regular_expression(\"^.*$\")\n\n#\ninstall( FILES  ${CMAKE_CURRENT_BINARY_DIR}/opj_config.h\n DESTINATION ${OPENJPEG_INSTALL_INCLUDE_DIR} COMPONENT Headers)\n\ninclude_directories(\n  ${OPENJPEG_BINARY_DIR}/src/lib/openjp2 # opj_config.h and opj_config_private.h\n)\n# Defines the source code for the library\nset(OPENJPEG_SRCS\n  ${CMAKE_CURRENT_SOURCE_DIR}/bio.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/cio.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/dwt.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/event.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/image.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/invert.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/j2k.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/jp2.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/mct.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/mqc.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/openjpeg.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/opj_clock.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/pi.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/raw.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/t1.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/t2.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/tcd.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/tgt.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/function_list.c\n)\nif(BUILD_JPIP)\n  add_definitions(-DUSE_JPIP)\n  set(OPENJPEG_SRCS\n    ${OPENJPEG_SRCS}\n    ${CMAKE_CURRENT_SOURCE_DIR}/cidx_manager.c\n    ${CMAKE_CURRENT_SOURCE_DIR}/phix_manager.c\n    ${CMAKE_CURRENT_SOURCE_DIR}/ppix_manager.c\n    ${CMAKE_CURRENT_SOURCE_DIR}/thix_manager.c\n    ${CMAKE_CURRENT_SOURCE_DIR}/tpix_manager.c\n  )\nendif()\n\n# Build the library\nif(WIN32)\n  if(BUILD_SHARED_LIBS)\n    add_definitions(-DOPJ_EXPORTS)\n  else()\n    add_definitions(-DOPJ_STATIC)\n  endif()\nendif()\nadd_library(${OPENJPEG_LIBRARY_NAME} ${OPENJPEG_SRCS})\nif(UNIX)\n  target_link_libraries(${OPENJPEG_LIBRARY_NAME} m)\nendif()\nset_target_properties(${OPENJPEG_LIBRARY_NAME} PROPERTIES ${OPENJPEG_LIBRARY_PROPERTIES})\n\n# Install library\ninstall(TARGETS ${OPENJPEG_LIBRARY_NAME}\n  EXPORT OpenJPEGTargets\n  RUNTIME DESTINATION ${OPENJPEG_INSTALL_BIN_DIR} COMPONENT Applications\n  LIBRARY DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries\n  ARCHIVE DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries\n)\n\n# Install includes files\ninstall(FILES openjpeg.h opj_stdint.h\n  DESTINATION ${OPENJPEG_INSTALL_INCLUDE_DIR} COMPONENT Headers\n)\n\n# install man page of the library\ninstall(\n  FILES       ${OPENJPEG_SOURCE_DIR}/doc/man/man3/libopenjp2.3\n  DESTINATION ${OPENJPEG_INSTALL_MAN_DIR}/man3)\n\n# internal utilities to generate t1_luts.h (part of the jp2 lib)\n# no need to install:\nadd_executable(t1_generate_luts t1_generate_luts.c)\nif(UNIX)\n  target_link_libraries(t1_generate_luts m)\nendif()\n\n# Experimental option; let's how cppcheck performs\n# Implementation details:\n# I could not figure out how to easily upload a file to CDash. Instead simply\n# pretend cppcheck is part of the Build step. Technically cppcheck can even\n# output gcc formatted error/warning report\n# Another implementation detail: I could not redirect error to the error\n# catching mechanism something is busted in cmake 2.8.5, I had to use the\n# warning regex to catch them.\nif(OPENJPEG_CPPCHECK)\n  find_package(CPPCHECK REQUIRED)\n  foreach(f ${OPENJPEG_SRCS})\n    # cppcheck complains about too many configuration, pretend to be WIN32:\n    add_custom_command(TARGET ${OPENJPEG_LIBRARY_NAME}\n      COMMAND ${CPPCHECK_EXECUTABLE} -DWIN32 ${f})\n  endforeach()\nendif()\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/bio.c",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2001-2003, David Janssens\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"opj_includes.h\"\n\n/** @defgroup BIO BIO - Individual bit input-output stream */\n/*@{*/\n\n/** @name Local static functions */\n/*@{*/\n\n/**\nWrite a bit\n@param bio BIO handle\n@param b Bit to write (0 or 1)\n*/\nstatic void opj_bio_putbit(opj_bio_t *bio, OPJ_UINT32 b);\n/**\nRead a bit\n@param bio BIO handle\n@return Returns the read bit\n*/\nstatic OPJ_UINT32 opj_bio_getbit(opj_bio_t *bio);\n/**\nWrite a byte\n@param bio BIO handle\n@return Returns OPJ_TRUE if successful, returns OPJ_FALSE otherwise\n*/\nstatic OPJ_BOOL opj_bio_byteout(opj_bio_t *bio);\n/**\nRead a byte\n@param bio BIO handle\n@return Returns OPJ_TRUE if successful, returns OPJ_FALSE otherwise\n*/\nstatic OPJ_BOOL opj_bio_bytein(opj_bio_t *bio);\n\n/*@}*/\n\n/*@}*/\n\n/* \n==========================================================\n   local functions\n==========================================================\n*/\n\nOPJ_BOOL opj_bio_byteout(opj_bio_t *bio) {\n\tbio->buf = (bio->buf << 8) & 0xffff;\n\tbio->ct = bio->buf == 0xff00 ? 7 : 8;\n\tif (bio->bp >= bio->end) {\n\t\treturn OPJ_FALSE;\n\t}\n\t*bio->bp++ = (OPJ_BYTE)(bio->buf >> 8);\n\treturn OPJ_TRUE;\n}\n\nOPJ_BOOL opj_bio_bytein(opj_bio_t *bio) {\n\tbio->buf = (bio->buf << 8) & 0xffff;\n\tbio->ct = bio->buf == 0xff00 ? 7 : 8;\n\tif (bio->bp >= bio->end) {\n\t\treturn OPJ_FALSE;\n\t}\n\tbio->buf |= *bio->bp++;\n\treturn OPJ_TRUE;\n}\n\nvoid opj_bio_putbit(opj_bio_t *bio, OPJ_UINT32 b) {\n\tif (bio->ct == 0) {\n\t\topj_bio_byteout(bio); /* MSD: why not check the return value of this function ? */\n\t}\n\tbio->ct--;\n\tbio->buf |= b << bio->ct;\n}\n\nOPJ_UINT32 opj_bio_getbit(opj_bio_t *bio) {\n\tif (bio->ct == 0) {\n\t\topj_bio_bytein(bio); /* MSD: why not check the return value of this function ? */\n\t}\n\tbio->ct--;\n\treturn (bio->buf >> bio->ct) & 1;\n}\n\n/* \n==========================================================\n   Bit Input/Output interface\n==========================================================\n*/\n\nopj_bio_t* opj_bio_create(void) {\n\topj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t));\n\treturn bio;\n}\n\nvoid opj_bio_destroy(opj_bio_t *bio) {\n\tif(bio) {\n\t\topj_free(bio);\n\t}\n}\n\nptrdiff_t opj_bio_numbytes(opj_bio_t *bio) {\n\treturn (bio->bp - bio->start);\n}\n\nvoid opj_bio_init_enc(opj_bio_t *bio, OPJ_BYTE *bp, OPJ_UINT32 len) {\n\tbio->start = bp;\n\tbio->end = bp + len;\n\tbio->bp = bp;\n\tbio->buf = 0;\n\tbio->ct = 8;\n}\n\nvoid opj_bio_init_dec(opj_bio_t *bio, OPJ_BYTE *bp, OPJ_UINT32 len) {\n\tbio->start = bp;\n\tbio->end = bp + len;\n\tbio->bp = bp;\n\tbio->buf = 0;\n\tbio->ct = 0;\n}\n\nvoid opj_bio_write(opj_bio_t *bio, OPJ_UINT32 v, OPJ_UINT32 n) {\n\tOPJ_UINT32 i;\n\tfor (i = n - 1; i < n; i--) {\n\t\topj_bio_putbit(bio, (v >> i) & 1);\n\t}\n}\n\nOPJ_UINT32 opj_bio_read(opj_bio_t *bio, OPJ_UINT32 n) {\n\tOPJ_UINT32 i;\n    OPJ_UINT32 v;\n\tv = 0;\n\tfor (i = n - 1; i < n; i--) {\n\t\tv += opj_bio_getbit(bio) << i;\n\t}\n\treturn v;\n}\n\nOPJ_BOOL opj_bio_flush(opj_bio_t *bio) {\n\tbio->ct = 0;\n\tif (! opj_bio_byteout(bio)) {\n\t\treturn OPJ_FALSE;\n\t}\n\tif (bio->ct == 7) {\n\t\tbio->ct = 0;\n\t\tif (! opj_bio_byteout(bio)) {\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\t}\n\treturn OPJ_TRUE;\n}\n\nOPJ_BOOL opj_bio_inalign(opj_bio_t *bio) {\n\tbio->ct = 0;\n\tif ((bio->buf & 0xff) == 0xff) {\n\t\tif (! opj_bio_bytein(bio)) {\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\t\tbio->ct = 0;\n\t}\n\treturn OPJ_TRUE;\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/bio.h",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2001-2003, David Janssens\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifndef __BIO_H\n#define __BIO_H\n\n#include <stddef.h> /* ptrdiff_t */\n\n/** \n@file bio.h\n@brief Implementation of an individual bit input-output (BIO)\n\nThe functions in BIO.C have for goal to realize an individual bit input - output.\n*/\n\n/** @defgroup BIO BIO - Individual bit input-output stream */\n/*@{*/\n\n/**\nIndividual bit input-output stream (BIO)\n*/\ntypedef struct opj_bio {\n\t/** pointer to the start of the buffer */\n\tOPJ_BYTE *start;\n\t/** pointer to the end of the buffer */\n\tOPJ_BYTE *end;\n\t/** pointer to the present position in the buffer */\n\tOPJ_BYTE *bp;\n\t/** temporary place where each byte is read or written */\n\tOPJ_UINT32 buf;\n\t/** coder : number of bits free to write. decoder : number of bits read */\n\tOPJ_UINT32 ct;\n} opj_bio_t;\n\n/** @name Exported functions */\n/*@{*/\n/* ----------------------------------------------------------------------- */\n/**\nCreate a new BIO handle \n@return Returns a new BIO handle if successful, returns NULL otherwise\n*/\nopj_bio_t* opj_bio_create(void);\n/**\nDestroy a previously created BIO handle\n@param bio BIO handle to destroy\n*/\nvoid opj_bio_destroy(opj_bio_t *bio);\n/**\nNumber of bytes written.\n@param bio BIO handle\n@return Returns the number of bytes written\n*/\nptrdiff_t opj_bio_numbytes(opj_bio_t *bio);\n/**\nInit encoder\n@param bio BIO handle\n@param bp Output buffer\n@param len Output buffer length \n*/\nvoid opj_bio_init_enc(opj_bio_t *bio, OPJ_BYTE *bp, OPJ_UINT32 len);\n/**\nInit decoder\n@param bio BIO handle\n@param bp Input buffer\n@param len Input buffer length \n*/\nvoid opj_bio_init_dec(opj_bio_t *bio, OPJ_BYTE *bp, OPJ_UINT32 len);\n/**\nWrite bits\n@param bio BIO handle\n@param v Value of bits\n@param n Number of bits to write\n*/\nvoid opj_bio_write(opj_bio_t *bio, OPJ_UINT32 v, OPJ_UINT32 n);\n/**\nRead bits\n@param bio BIO handle\n@param n Number of bits to read \n@return Returns the corresponding read number\n*/\nOPJ_UINT32 opj_bio_read(opj_bio_t *bio, OPJ_UINT32 n);\n/**\nFlush bits\n@param bio BIO handle\n@return Returns OPJ_TRUE if successful, returns OPJ_FALSE otherwise\n*/\nOPJ_BOOL opj_bio_flush(opj_bio_t *bio);\n/**\nPasses the ending bits (coming from flushing)\n@param bio BIO handle\n@return Returns OPJ_TRUE if successful, returns OPJ_FALSE otherwise\n*/\nOPJ_BOOL opj_bio_inalign(opj_bio_t *bio);\n/* ----------------------------------------------------------------------- */\n/*@}*/\n\n/*@}*/\n\n#endif /* __BIO_H */\n\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/cio.c",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2001-2003, David Janssens\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR \n * Copyright (c) 2012, CS Systemes d'Information, France\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"opj_includes.h\"\n\n/* ----------------------------------------------------------------------- */\n\n\n/* ----------------------------------------------------------------------- */\n\nvoid opj_write_bytes_BE (OPJ_BYTE * p_buffer, OPJ_UINT32 p_value, OPJ_UINT32 p_nb_bytes)\n{\n\tconst OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value) + p_nb_bytes;\n\n\tassert(p_nb_bytes > 0 && p_nb_bytes <=  sizeof(OPJ_UINT32));\n\n\tmemcpy(p_buffer,l_data_ptr,p_nb_bytes);\n}\n\nvoid opj_write_bytes_LE (OPJ_BYTE * p_buffer, OPJ_UINT32 p_value, OPJ_UINT32 p_nb_bytes)\n{\n\tconst OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value) + p_nb_bytes - 1;\n\tOPJ_UINT32 i;\n\n\tassert(p_nb_bytes > 0 && p_nb_bytes <= sizeof(OPJ_UINT32));\n\n\tfor\t(i=0;i<p_nb_bytes;++i) {\n\t\t*(p_buffer++) = *(l_data_ptr--);\n\t}\n}\n\nvoid opj_read_bytes_BE(const OPJ_BYTE * p_buffer, OPJ_UINT32 * p_value, OPJ_UINT32 p_nb_bytes)\n{\n\tOPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value);\n\n\tassert(p_nb_bytes > 0 && p_nb_bytes <= sizeof(OPJ_UINT32));\n\n\t*p_value = 0;\n\tmemcpy(l_data_ptr+4-p_nb_bytes,p_buffer,p_nb_bytes);\n}\n\nvoid opj_read_bytes_LE(const OPJ_BYTE * p_buffer, OPJ_UINT32 * p_value, OPJ_UINT32 p_nb_bytes)\n{\n\tOPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value) + p_nb_bytes-1;\n\tOPJ_UINT32 i;\n\n\tassert(p_nb_bytes > 0 && p_nb_bytes <= sizeof(OPJ_UINT32));\n\n\t*p_value = 0;\n\tfor (i=0;i<p_nb_bytes;++i) {\n\t\t*(l_data_ptr--) = *(p_buffer++);\n\t}\n}\n\nvoid opj_write_double_BE(OPJ_BYTE * p_buffer, OPJ_FLOAT64 p_value)\n{\n\tconst OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value);\n\tmemcpy(p_buffer,l_data_ptr,sizeof(OPJ_FLOAT64));\n}\n\nvoid opj_write_double_LE(OPJ_BYTE * p_buffer, OPJ_FLOAT64 p_value)\n{\n\tconst OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value) + sizeof(OPJ_FLOAT64) - 1;\n\tOPJ_UINT32 i;\n\tfor\t(i=0;i<sizeof(OPJ_FLOAT64);++i) {\n\t\t*(p_buffer++) = *(l_data_ptr--);\n\t}\n}\n\nvoid opj_read_double_BE(const OPJ_BYTE * p_buffer, OPJ_FLOAT64 * p_value)\n{\n\tOPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value);\n\tmemcpy(l_data_ptr,p_buffer,sizeof(OPJ_FLOAT64));\n}\n\nvoid opj_read_double_LE(const OPJ_BYTE * p_buffer, OPJ_FLOAT64 * p_value)\n{\n\tOPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value) + sizeof(OPJ_FLOAT64)-1;\n\tOPJ_UINT32 i;\n\tfor (i=0;i<sizeof(OPJ_FLOAT64);++i) {\n\t\t*(l_data_ptr--) = *(p_buffer++);\n\t}\n}\n\nvoid opj_write_float_BE(OPJ_BYTE * p_buffer, OPJ_FLOAT32 p_value)\n{\n\tconst OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value);\n\tmemcpy(p_buffer,l_data_ptr,sizeof(OPJ_FLOAT32));\n}\n\nvoid opj_write_float_LE(OPJ_BYTE * p_buffer, OPJ_FLOAT32 p_value)\n{\n\tconst OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value) + sizeof(OPJ_FLOAT32) - 1;\n\tOPJ_UINT32 i;\n\tfor\t(i=0;i<sizeof(OPJ_FLOAT32);++i) {\n\t\t*(p_buffer++) = *(l_data_ptr--);\n\t}\n}\n\nvoid opj_read_float_BE(const OPJ_BYTE * p_buffer, OPJ_FLOAT32 * p_value)\n{\n\tOPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value);\n\tmemcpy(l_data_ptr,p_buffer,sizeof(OPJ_FLOAT32));\n}\n\nvoid opj_read_float_LE(const OPJ_BYTE * p_buffer, OPJ_FLOAT32 * p_value)\n{\n\tOPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value) + sizeof(OPJ_FLOAT32)-1;\n\tOPJ_UINT32 i;\n\tfor\t(i=0;i<sizeof(OPJ_FLOAT32);++i) {\n\t\t*(l_data_ptr--) = *(p_buffer++);\n\t}\n}\n\nopj_stream_t* OPJ_CALLCONV opj_stream_create(OPJ_SIZE_T p_buffer_size,OPJ_BOOL l_is_input)\n{\n\topj_stream_private_t * l_stream = 00;\n\tl_stream = (opj_stream_private_t*) opj_malloc(sizeof(opj_stream_private_t));\n\tif (! l_stream) {\n\t\treturn 00;\n\t}\n\n\tmemset(l_stream,0,sizeof(opj_stream_private_t));\n\tl_stream->m_buffer_size = p_buffer_size;\n\tl_stream->m_stored_data = (OPJ_BYTE *) opj_malloc(p_buffer_size);\n\tif (! l_stream->m_stored_data) {\n\t\topj_free(l_stream);\n\t\treturn 00;\n\t}\n\n\tl_stream->m_current_data = l_stream->m_stored_data;\n\n\tif (l_is_input) {\n\t\tl_stream->m_status |= opj_stream_e_input;\n\t\tl_stream->m_opj_skip = opj_stream_read_skip;\n\t\tl_stream->m_opj_seek = opj_stream_read_seek;\n\t}\n\telse {\n\t\tl_stream->m_status |= opj_stream_e_output;\n\t\tl_stream->m_opj_skip = opj_stream_write_skip;\n\t\tl_stream->m_opj_seek = opj_stream_write_seek;\n\t}\n\n\tl_stream->m_read_fn = opj_stream_default_read;\n\tl_stream->m_write_fn = opj_stream_default_write;\n\tl_stream->m_skip_fn = opj_stream_default_skip;\n\tl_stream->m_seek_fn = opj_stream_default_seek;\n\n\treturn (opj_stream_t *) l_stream;\n}\n\nopj_stream_t* OPJ_CALLCONV opj_stream_default_create(OPJ_BOOL l_is_input)\n{\n\treturn opj_stream_create(OPJ_J2K_STREAM_CHUNK_SIZE,l_is_input);\n}\n\nvoid OPJ_CALLCONV opj_stream_destroy(opj_stream_t* p_stream)\n{\n\topj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;\n\t\n\tif (l_stream) {\n\t\tif (l_stream->m_free_user_data_fn) {\n\t\t\tl_stream->m_free_user_data_fn(l_stream->m_user_data);\n\t\t}\n\t\topj_free(l_stream->m_stored_data);\n\t\tl_stream->m_stored_data = 00;\n\t\topj_free(l_stream);\n\t}\n}\n\nvoid OPJ_CALLCONV opj_stream_destroy_v3(opj_stream_t* p_stream)\n{\n\topj_stream_destroy(p_stream);\n}\n\nvoid OPJ_CALLCONV opj_stream_set_read_function(opj_stream_t* p_stream, opj_stream_read_fn p_function)\n{\n\topj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;\n\n\tif ((!l_stream) || (! (l_stream->m_status & opj_stream_e_input))) {\n\t\treturn;\n\t}\n\n\tl_stream->m_read_fn = p_function;\n}\n\nvoid OPJ_CALLCONV opj_stream_set_seek_function(opj_stream_t* p_stream, opj_stream_seek_fn p_function)\n{\n\topj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;\n\t\n\tif (!l_stream) {\n\t\treturn;\n\t}\n\tl_stream->m_seek_fn = p_function;\n}\n\nvoid OPJ_CALLCONV opj_stream_set_write_function(opj_stream_t* p_stream, opj_stream_write_fn p_function)\n{\n\topj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;\n\t\n\tif ((!l_stream )|| (! (l_stream->m_status & opj_stream_e_output))) {\n\t\treturn;\n\t}\n\n\tl_stream->m_write_fn = p_function;\n}\n\nvoid OPJ_CALLCONV opj_stream_set_skip_function(opj_stream_t* p_stream, opj_stream_skip_fn p_function)\n{\n\topj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;\n\t\n\tif (! l_stream) {\n\t\treturn;\n\t}\n\n\tl_stream->m_skip_fn = p_function;\n}\n\nvoid OPJ_CALLCONV opj_stream_set_user_data(opj_stream_t* p_stream, void * p_data)\n{\n\topj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;\n\tif (!l_stream)\n\t\treturn;\n\tl_stream->m_user_data = p_data;\n}\n\nvoid OPJ_CALLCONV opj_stream_set_user_data_v3(opj_stream_t* p_stream, void * p_data, opj_stream_free_user_data_fn p_function)\n{\n\topj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;\n\tif (!l_stream)\n\t\treturn;\n\tl_stream->m_user_data = p_data;\n  l_stream->m_free_user_data_fn = p_function;\n}\n\nvoid OPJ_CALLCONV opj_stream_set_user_data_length(opj_stream_t* p_stream, OPJ_UINT64 data_length)\n{\n\topj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;\n\tif (!l_stream)\n\t\treturn;\n\tl_stream->m_user_data_length = data_length;\n}\n\nOPJ_SIZE_T opj_stream_read_data (opj_stream_private_t * p_stream,OPJ_BYTE * p_buffer, OPJ_SIZE_T p_size, opj_event_mgr_t * p_event_mgr)\n{\n\tOPJ_SIZE_T l_read_nb_bytes = 0;\n\tif (p_stream->m_bytes_in_buffer >= p_size) {\n\t\tmemcpy(p_buffer,p_stream->m_current_data,p_size);\n\t\tp_stream->m_current_data += p_size;\n\t\tp_stream->m_bytes_in_buffer -= p_size;\n\t\tl_read_nb_bytes += p_size;\n\t\tp_stream->m_byte_offset += (OPJ_OFF_T)p_size;\n\t\treturn l_read_nb_bytes;\n\t}\n\n\t/* we are now in the case when the remaining data if not sufficient */\n\tif (p_stream->m_status & opj_stream_e_end) {\n\t\tl_read_nb_bytes += p_stream->m_bytes_in_buffer;\n\t\tmemcpy(p_buffer,p_stream->m_current_data,p_stream->m_bytes_in_buffer);\n\t\tp_stream->m_current_data += p_stream->m_bytes_in_buffer;\n\t\tp_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;\n\t\tp_stream->m_bytes_in_buffer = 0;\n\t\treturn l_read_nb_bytes ? l_read_nb_bytes : (OPJ_SIZE_T)-1;\n\t}\n\n\t/* the flag is not set, we copy data and then do an actual read on the stream */\n\tif (p_stream->m_bytes_in_buffer) {\n\t\tl_read_nb_bytes += p_stream->m_bytes_in_buffer;\n\t\tmemcpy(p_buffer,p_stream->m_current_data,p_stream->m_bytes_in_buffer);\n\t\tp_stream->m_current_data = p_stream->m_stored_data;\n\t\tp_buffer += p_stream->m_bytes_in_buffer;\n\t\tp_size -= p_stream->m_bytes_in_buffer;\n\t\tp_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;\n\t\tp_stream->m_bytes_in_buffer = 0;\n\t}\n\telse {\n    /* case where we are already at the end of the buffer\n       so reset the m_current_data to point to the start of the\n       stored buffer to get ready to read from disk*/\n\t\tp_stream->m_current_data = p_stream->m_stored_data;\n\t}\n\n\twhile(1){\n\t\t/* we should read less than a chunk -> read a chunk */\n\t\tif (p_size < p_stream->m_buffer_size) {\n\t\t\t/* we should do an actual read on the media */\n\t\t\tp_stream->m_bytes_in_buffer = p_stream->m_read_fn(p_stream->m_stored_data,p_stream->m_buffer_size,p_stream->m_user_data);\n\n\t\t\tif (p_stream->m_bytes_in_buffer == (OPJ_SIZE_T)-1) {\n\t\t\t\t/* end of stream */\n\t\t\t\topj_event_msg(p_event_mgr, EVT_INFO, \"Stream reached its end !\\n\");\n\n\t\t\t\tp_stream->m_bytes_in_buffer = 0;\n\t\t\t\tp_stream->m_status |= opj_stream_e_end;\n\t\t\t\t/* end of stream */\n\t\t\t\treturn l_read_nb_bytes ? l_read_nb_bytes : (OPJ_SIZE_T)-1;\n\t\t\t}\n\t\t\telse if\t(p_stream->m_bytes_in_buffer < p_size) {\n\t\t\t\t/* not enough data */\n\t\t\t\tl_read_nb_bytes += p_stream->m_bytes_in_buffer;\n\t\t\t\tmemcpy(p_buffer,p_stream->m_current_data,p_stream->m_bytes_in_buffer);\n\t\t\t\tp_stream->m_current_data = p_stream->m_stored_data;\n\t\t\t\tp_buffer += p_stream->m_bytes_in_buffer;\n\t\t\t\tp_size -= p_stream->m_bytes_in_buffer;\n\t\t\t\tp_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;\n\t\t\t\tp_stream->m_bytes_in_buffer = 0;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tl_read_nb_bytes += p_size;\n\t\t\t\tmemcpy(p_buffer,p_stream->m_current_data,p_size);\n\t\t\t\tp_stream->m_current_data += p_size;\n\t\t\t\tp_stream->m_bytes_in_buffer -= p_size;\n\t\t\t\tp_stream->m_byte_offset += (OPJ_OFF_T)p_size;\n\t\t\t\treturn l_read_nb_bytes;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t/* direct read on the dest buffer */\n\t\t\tp_stream->m_bytes_in_buffer = p_stream->m_read_fn(p_buffer,p_size,p_stream->m_user_data);\n\n\t\t\tif (p_stream->m_bytes_in_buffer == (OPJ_SIZE_T)-1) {\n\t\t\t\t/*  end of stream */\n\t\t\t\topj_event_msg(p_event_mgr, EVT_INFO, \"Stream reached its end !\\n\");\n\n\t\t\t\tp_stream->m_bytes_in_buffer = 0;\n\t\t\t\tp_stream->m_status |= opj_stream_e_end;\n\t\t\t\t/* end of stream */\n\t\t\t\treturn l_read_nb_bytes ? l_read_nb_bytes : (OPJ_SIZE_T)-1;\n\t\t\t}\n\t\t\telse if (p_stream->m_bytes_in_buffer < p_size) {\n\t\t\t\t/* not enough data */\n\t\t\t\tl_read_nb_bytes += p_stream->m_bytes_in_buffer;\n\t\t\t\tp_stream->m_current_data = p_stream->m_stored_data;\n\t\t\t\tp_buffer += p_stream->m_bytes_in_buffer;\n\t\t\t\tp_size -= p_stream->m_bytes_in_buffer;\n\t\t\t\tp_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;\n\t\t\t\tp_stream->m_bytes_in_buffer = 0;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t/* we have read the exact size */\n\t\t\t\tl_read_nb_bytes += p_stream->m_bytes_in_buffer;\n\t\t\t\tp_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;\n\t\t\t\tp_stream->m_current_data = p_stream->m_stored_data;\n\t\t\t\tp_stream->m_bytes_in_buffer = 0;\n\t\t\t\treturn l_read_nb_bytes;\n\t\t\t}\n\t\t}\n\t}\n}\n\nOPJ_SIZE_T opj_stream_write_data (opj_stream_private_t * p_stream,\n\t\t\t\t\t\t\t\t  const OPJ_BYTE * p_buffer,\n\t\t\t\t\t\t\t\t  OPJ_SIZE_T p_size, \n\t\t\t\t\t\t\t\t  opj_event_mgr_t * p_event_mgr)\n{\n\tOPJ_SIZE_T l_remaining_bytes = 0;\n\tOPJ_SIZE_T l_write_nb_bytes = 0;\n\n\tif (p_stream->m_status & opj_stream_e_error) {\n\t\treturn (OPJ_SIZE_T)-1;\n\t}\n\n\twhile(1) {\n\t\tl_remaining_bytes = p_stream->m_buffer_size - p_stream->m_bytes_in_buffer;\n\t\t\n\t\t/* we have more memory than required */\n\t\tif (l_remaining_bytes >= p_size) {\n\t\t\tmemcpy(p_stream->m_current_data, p_buffer, p_size);\n\t\t\t\n\t\t\tp_stream->m_current_data += p_size;\n\t\t\tp_stream->m_bytes_in_buffer += p_size;\n\t\t\tl_write_nb_bytes += p_size;\n\t\t\tp_stream->m_byte_offset += (OPJ_OFF_T)p_size;\n\t\t\t\n\t\t\treturn l_write_nb_bytes;\n\t\t}\n\n\t\t/* we copy data and then do an actual read on the stream */\n\t\tif (l_remaining_bytes) {\n\t\t\tl_write_nb_bytes += l_remaining_bytes;\n\t\t\t\n\t\t\tmemcpy(p_stream->m_current_data,p_buffer,l_remaining_bytes);\n\t\t\t\n\t\t\tp_stream->m_current_data = p_stream->m_stored_data;\n\t\t\t\n\t\t\tp_buffer += l_remaining_bytes;\n\t\t\tp_size -= l_remaining_bytes;\n\t\t\tp_stream->m_bytes_in_buffer += l_remaining_bytes;\n\t\t\tp_stream->m_byte_offset += (OPJ_OFF_T)l_remaining_bytes;\n\t\t}\n\n\t\tif (! opj_stream_flush(p_stream, p_event_mgr)) {\n\t\t\treturn (OPJ_SIZE_T)-1;\n\t\t}\n\t}\n\n}\n\nOPJ_BOOL opj_stream_flush (opj_stream_private_t * p_stream, opj_event_mgr_t * p_event_mgr)\n{\n\t/* the number of bytes written on the media. */\n\tOPJ_SIZE_T l_current_write_nb_bytes = 0;\n\n\tp_stream->m_current_data = p_stream->m_stored_data;\n\n\twhile (p_stream->m_bytes_in_buffer) {\n\t\t/* we should do an actual write on the media */\n\t\tl_current_write_nb_bytes = p_stream->m_write_fn(p_stream->m_current_data,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tp_stream->m_bytes_in_buffer,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tp_stream->m_user_data);\n\t\t\n\t\tif (l_current_write_nb_bytes == (OPJ_SIZE_T)-1) {\n\t\t\tp_stream->m_status |= opj_stream_e_error;\n\t\t\topj_event_msg(p_event_mgr, EVT_INFO, \"Error on writing stream!\\n\");\n\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\n\t\tp_stream->m_current_data += l_current_write_nb_bytes;\n\t\tp_stream->m_bytes_in_buffer -= l_current_write_nb_bytes;\n\t}\n\n\tp_stream->m_current_data = p_stream->m_stored_data;\n\t\n\treturn OPJ_TRUE;\n}\n\nOPJ_OFF_T opj_stream_read_skip (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)\n{\n\tOPJ_OFF_T l_skip_nb_bytes = 0;\n\tOPJ_OFF_T l_current_skip_nb_bytes = 0;\n\t\n\tassert( p_size >= 0 );\n\t\n\tif (p_stream->m_bytes_in_buffer >= (OPJ_SIZE_T)p_size) {\n\t\tp_stream->m_current_data += p_size;\n\t\t/* it is safe to cast p_size to OPJ_SIZE_T since it is <= m_bytes_in_buffer\n\t\twhich is of type OPJ_SIZE_T */\n\t\tp_stream->m_bytes_in_buffer -= (OPJ_SIZE_T)p_size;\n\t\tl_skip_nb_bytes += p_size;\n\t\tp_stream->m_byte_offset += l_skip_nb_bytes;\n\t\treturn l_skip_nb_bytes;\n\t}\n\n\t/* we are now in the case when the remaining data if not sufficient */\n\tif (p_stream->m_status & opj_stream_e_end) {\n\t\tl_skip_nb_bytes += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;\n\t\tp_stream->m_current_data += p_stream->m_bytes_in_buffer;\n\t\tp_stream->m_bytes_in_buffer = 0;\n\t\tp_stream->m_byte_offset += l_skip_nb_bytes;\n\t\treturn l_skip_nb_bytes ? l_skip_nb_bytes : (OPJ_OFF_T) -1;\n\t}\n\n\t/* the flag is not set, we copy data and then do an actual skip on the stream */\n\tif (p_stream->m_bytes_in_buffer) {\n\t\tl_skip_nb_bytes += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;\n\t\tp_stream->m_current_data = p_stream->m_stored_data;\n\t\tp_size -= (OPJ_OFF_T)p_stream->m_bytes_in_buffer;\n\t\tp_stream->m_bytes_in_buffer = 0;\n\t}\n\n\twhile (p_size > 0) {\n\t\t/* we should do an actual skip on the media */\n\t\tl_current_skip_nb_bytes = p_stream->m_skip_fn(p_size, p_stream->m_user_data);\n\t\tif (l_current_skip_nb_bytes == (OPJ_OFF_T) -1) {\n\t\t\topj_event_msg(p_event_mgr, EVT_INFO, \"Stream reached its end !\\n\");\n\n\t\t\tp_stream->m_status |= opj_stream_e_end;\n\t\t\tp_stream->m_byte_offset += l_skip_nb_bytes;\n\t\t\t/* end if stream */\n\t\t\treturn l_skip_nb_bytes ? l_skip_nb_bytes : (OPJ_OFF_T) -1;\n\t\t}\n\t\tp_size -= l_current_skip_nb_bytes;\n\t\tl_skip_nb_bytes += l_current_skip_nb_bytes;\n\t}\n\n\tp_stream->m_byte_offset += l_skip_nb_bytes;\n\t\n\treturn l_skip_nb_bytes;\n}\n\nOPJ_OFF_T opj_stream_write_skip (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)\n{\n\tOPJ_BOOL l_is_written = 0;\n\tOPJ_OFF_T l_current_skip_nb_bytes = 0;\n\tOPJ_OFF_T l_skip_nb_bytes = 0;\n\n\tif (p_stream->m_status & opj_stream_e_error) {\n\t\treturn (OPJ_OFF_T) -1;\n\t}\n\n\t/* we should flush data */\n\tl_is_written = opj_stream_flush (p_stream, p_event_mgr);\n\tif (! l_is_written) {\n\t\tp_stream->m_status |= opj_stream_e_error;\n\t\tp_stream->m_bytes_in_buffer = 0;\n\t\treturn (OPJ_OFF_T) -1;\n\t}\n\t/* then skip */\n\n\twhile (p_size > 0) {\n\t\t/* we should do an actual skip on the media */\n\t\tl_current_skip_nb_bytes = p_stream->m_skip_fn(p_size, p_stream->m_user_data);\n\t\t\n\t\tif (l_current_skip_nb_bytes == (OPJ_OFF_T)-1) {\n\t\t\topj_event_msg(p_event_mgr, EVT_INFO, \"Stream error!\\n\");\n\n\t\t\tp_stream->m_status |= opj_stream_e_error;\n\t\t\tp_stream->m_byte_offset += l_skip_nb_bytes;\n\t\t\t/* end if stream */\n\t\t\treturn l_skip_nb_bytes ? l_skip_nb_bytes : (OPJ_OFF_T)-1;\n\t\t}\n\t\tp_size -= l_current_skip_nb_bytes;\n\t\tl_skip_nb_bytes += l_current_skip_nb_bytes;\n\t}\n\n\tp_stream->m_byte_offset += l_skip_nb_bytes;\n\t\n\treturn l_skip_nb_bytes;\n}\n\nOPJ_OFF_T opj_stream_tell (const opj_stream_private_t * p_stream)\n{\n\treturn p_stream->m_byte_offset;\n}\n\nOPJ_OFF_T opj_stream_get_number_byte_left (const opj_stream_private_t * p_stream)\n{\n  assert( p_stream->m_byte_offset >= 0 );\n  assert( p_stream->m_user_data_length >= (OPJ_UINT64)p_stream->m_byte_offset);\n  return p_stream->m_user_data_length ?\n\t\t\t\t(OPJ_OFF_T)(p_stream->m_user_data_length) - p_stream->m_byte_offset :\n\t\t\t\t0;\n}\n\nOPJ_OFF_T opj_stream_skip (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)\n{\n\tassert(p_size >= 0);\n\treturn p_stream->m_opj_skip(p_stream,p_size,p_event_mgr);\n}\n\nOPJ_BOOL opj_stream_read_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)\n{\n\tOPJ_ARG_NOT_USED(p_event_mgr);\n\tp_stream->m_current_data = p_stream->m_stored_data;\n\tp_stream->m_bytes_in_buffer = 0;\n\n\tif( !(p_stream->m_seek_fn(p_size,p_stream->m_user_data)) ) {\n\t\tp_stream->m_status |= opj_stream_e_end;\n\t\treturn OPJ_FALSE;\n\t}\n\telse {\n\t\t/* reset stream status */\n\t\tp_stream->m_status &= (~opj_stream_e_end);\n\t\tp_stream->m_byte_offset = p_size;\n\n\t}\n\n\treturn OPJ_TRUE;\n}\n\nOPJ_BOOL opj_stream_write_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)\n{\n\tif (! opj_stream_flush(p_stream,p_event_mgr)) {\n\t\tp_stream->m_status |= opj_stream_e_error;\n\t\treturn OPJ_FALSE;\n\t}\n\n\tp_stream->m_current_data = p_stream->m_stored_data;\n\tp_stream->m_bytes_in_buffer = 0;\n\n\tif (! p_stream->m_seek_fn(p_size,p_stream->m_user_data)) {\n\t\tp_stream->m_status |= opj_stream_e_error;\n\t\treturn OPJ_FALSE;\n\t}\n\telse {\n\t\tp_stream->m_byte_offset = p_size;\n\t}\n\n\treturn OPJ_TRUE;\n}\n\nOPJ_BOOL opj_stream_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr)\n{\n\tassert(p_size >= 0);\n\treturn p_stream->m_opj_seek(p_stream,p_size,p_event_mgr);\n}\n\nOPJ_BOOL opj_stream_has_seek (const opj_stream_private_t * p_stream)\n{\n\treturn p_stream->m_seek_fn != opj_stream_default_seek;\n}\n\nOPJ_SIZE_T opj_stream_default_read (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data)\n{\n\tOPJ_ARG_NOT_USED(p_buffer);\n\tOPJ_ARG_NOT_USED(p_nb_bytes);\n\tOPJ_ARG_NOT_USED(p_user_data);\n\treturn (OPJ_SIZE_T) -1;\n}\n\nOPJ_SIZE_T opj_stream_default_write (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data)\n{\n\tOPJ_ARG_NOT_USED(p_buffer);\n\tOPJ_ARG_NOT_USED(p_nb_bytes);\n\tOPJ_ARG_NOT_USED(p_user_data);\n\treturn (OPJ_SIZE_T) -1;\n}\n\nOPJ_OFF_T opj_stream_default_skip (OPJ_OFF_T p_nb_bytes, void * p_user_data)\n{\n\tOPJ_ARG_NOT_USED(p_nb_bytes);\n\tOPJ_ARG_NOT_USED(p_user_data);\n\treturn (OPJ_OFF_T) -1;\n}\n\nOPJ_BOOL opj_stream_default_seek (OPJ_OFF_T p_nb_bytes, void * p_user_data)\n{\n\tOPJ_ARG_NOT_USED(p_nb_bytes);\n\tOPJ_ARG_NOT_USED(p_user_data);\n\treturn OPJ_FALSE;\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/cio.h",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2001-2003, David Janssens\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR \n * Copyright (c) 2012, CS Systemes d'Information, France\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifndef __CIO_H\n#define __CIO_H\n/**\n@file cio.h\n@brief Implementation of a byte input-output process (CIO)\n\nThe functions in CIO.C have for goal to realize a byte input / output process.\n*/\n\n/** @defgroup CIO CIO - byte input-output stream */\n/*@{*/\n\n#include \"opj_config.h\"\n\n/* ----------------------------------------------------------------------- */\n\n#if defined(OPJ_BIG_ENDIAN)\n\t#define opj_write_bytes\t\topj_write_bytes_BE\n\t#define opj_read_bytes\t\topj_read_bytes_BE\n\t#define opj_write_double\topj_write_double_BE\n\t#define opj_read_double\t\topj_read_double_BE\n\t#define opj_write_float\t\topj_write_float_BE\n\t#define opj_read_float\t\topj_read_float_BE\n#else\n\t#define opj_write_bytes\t\topj_write_bytes_LE\n\t#define opj_read_bytes\t\topj_read_bytes_LE\n\t#define opj_write_double\topj_write_double_LE\n\t#define opj_read_double\t\topj_read_double_LE\n\t#define opj_write_float\t\topj_write_float_LE\n\t#define opj_read_float\t\topj_read_float_LE\n#endif\n\n\n\ntypedef enum\n{\n\topj_signed_sentinel\t\t= -1, /* do not use in code */\n\topj_stream_e_output\t\t= 0x1,\n\topj_stream_e_input\t\t= 0x2,\n\topj_stream_e_end\t\t= 0x4,\n\topj_stream_e_error\t\t= 0x8\n}\nopj_stream_flag ;\n\n/**\nByte input-output stream.\n*/\ntypedef struct opj_stream_private\n{\n\t/**\n\t * User data, be it files, ... The actual data depends on the type of the stream.\n\t */\n\tvoid *\t\t\t\t\tm_user_data;\n\n\t/**\n\t * Pointer to function to free m_user_data (NULL at initialization)\n\t * when destroying the stream. If pointer is NULL the function is not\n\t * called and the m_user_data is not freed (even if non-NULL).\n\t */\n\topj_stream_free_user_data_fn\t\tm_free_user_data_fn;\n\n\t/**\n\t * User data length\n\t */\n\tOPJ_UINT64 \t\t\t\tm_user_data_length;\n\n\t/**\n\t * Pointer to actual read function (NULL at the initialization of the cio.\n\t */\n\topj_stream_read_fn\t\tm_read_fn;\n\n\t/**\n\t * Pointer to actual write function (NULL at the initialization of the cio.\n\t */\n\topj_stream_write_fn\t\tm_write_fn;\n\n\t/**\n\t * Pointer to actual skip function (NULL at the initialization of the cio.\n\t * There is no seek function to prevent from back and forth slow procedures.\n\t */\n\topj_stream_skip_fn\t\tm_skip_fn;\n\n\t/**\n\t * Pointer to actual seek function (if available).\n\t */\n\topj_stream_seek_fn\t\tm_seek_fn;\n\n\t/**\n\t * Actual data stored into the stream if readed from. Data is read by chunk of fixed size.\n\t * you should never access this data directly.\n\t */\n\tOPJ_BYTE *\t\t\t\t\tm_stored_data;\n\n\t/**\n\t * Pointer to the current read data.\n\t */\n\tOPJ_BYTE *\t\t\t\t\tm_current_data;\n\n    /**\n    * FIXME DOC.\n    */\n\tOPJ_OFF_T (* m_opj_skip)(struct opj_stream_private * ,OPJ_OFF_T , struct opj_event_mgr *);\n\n    /**\n    * FIXME DOC.\n    */\n\tOPJ_BOOL (* m_opj_seek) (struct opj_stream_private * , OPJ_OFF_T , struct opj_event_mgr *);\n\n\t/**\n\t * number of bytes containing in the buffer.\n\t */\n\tOPJ_SIZE_T\t\t\tm_bytes_in_buffer;\n\n\t/**\n\t * The number of bytes read/written from the beginning of the stream\n\t */\n\tOPJ_OFF_T\t\t\tm_byte_offset;\n\n\t/**\n\t * The size of the buffer.\n\t */\n\tOPJ_SIZE_T\t\t\tm_buffer_size;\n\n\t/**\n\t * Flags to tell the status of the stream.\n\t */\n\topj_stream_flag m_status;\n\n}\nopj_stream_private_t;\n\n/** @name Exported functions (see also openjpeg.h) */\n/*@{*/\n/* ----------------------------------------------------------------------- */\n/**\n * Write some bytes to the given data buffer, this function is used in Big Endian cpus.\n * @param p_buffer\t\tpointer the data buffer to write data to.\n * @param p_value\t\tthe value to write\n * @param p_nb_bytes\tthe number of bytes to write\n*/\nvoid opj_write_bytes_BE (OPJ_BYTE * p_buffer, OPJ_UINT32 p_value, OPJ_UINT32 p_nb_bytes);\n\n/**\n * Reads some bytes from the given data buffer, this function is used in Big Endian cpus.\n * @param p_buffer\t\tpointer the data buffer to read data from.\n * @param p_value\t\tpointer to the value that will store the data.\n * @param p_nb_bytes\tthe nb bytes to read.\n * @return\t\t\t\tthe number of bytes read or -1 if an error occured.\n */\nvoid opj_read_bytes_BE(const OPJ_BYTE * p_buffer, OPJ_UINT32 * p_value, OPJ_UINT32 p_nb_bytes);\n\n/**\n * Write some bytes to the given data buffer, this function is used in Little Endian cpus.\n * @param p_buffer\t\tpointer the data buffer to write data to.\n * @param p_value\t\tthe value to write\n * @param p_nb_bytes\tthe number of bytes to write\n * @return\t\t\t\tthe number of bytes written or -1 if an error occured\n*/\nvoid opj_write_bytes_LE (OPJ_BYTE * p_buffer, OPJ_UINT32 p_value, OPJ_UINT32 p_nb_bytes);\n\n/**\n * Reads some bytes from the given data buffer, this function is used in Little Endian cpus.\n * @param p_buffer\t\tpointer the data buffer to read data from.\n * @param p_value\t\tpointer to the value that will store the data.\n * @param p_nb_bytes\tthe nb bytes to read.\n * @return\t\t\t\tthe number of bytes read or -1 if an error occured.\n */\nvoid opj_read_bytes_LE(const OPJ_BYTE * p_buffer, OPJ_UINT32 * p_value, OPJ_UINT32 p_nb_bytes);\n\n\n/**\n * Write some bytes to the given data buffer, this function is used in Little Endian cpus.\n * @param p_buffer\t\tpointer the data buffer to write data to.\n * @param p_value\t\tthe value to write\n */\nvoid opj_write_double_LE(OPJ_BYTE * p_buffer, OPJ_FLOAT64 p_value);\n\n/***\n * Write some bytes to the given data buffer, this function is used in Big Endian cpus.\n * @param p_buffer\t\tpointer the data buffer to write data to.\n * @param p_value\t\tthe value to write\n */\nvoid opj_write_double_BE(OPJ_BYTE * p_buffer, OPJ_FLOAT64 p_value);\n\n/**\n * Reads some bytes from the given data buffer, this function is used in Little Endian cpus.\n * @param p_buffer\t\tpointer the data buffer to read data from.\n * @param p_value\t\tpointer to the value that will store the data.\n */\nvoid opj_read_double_LE(const OPJ_BYTE * p_buffer, OPJ_FLOAT64 * p_value);\n\n/**\n * Reads some bytes from the given data buffer, this function is used in Big Endian cpus.\n * @param p_buffer\t\tpointer the data buffer to read data from.\n * @param p_value\t\tpointer to the value that will store the data.\n */\nvoid opj_read_double_BE(const OPJ_BYTE * p_buffer, OPJ_FLOAT64 * p_value);\n\n/**\n * Reads some bytes from the given data buffer, this function is used in Little Endian cpus.\n * @param p_buffer\t\tpointer the data buffer to read data from.\n * @param p_value\t\tpointer to the value that will store the data.\n */\nvoid opj_read_float_LE(const OPJ_BYTE * p_buffer, OPJ_FLOAT32 * p_value);\n\n/**\n * Reads some bytes from the given data buffer, this function is used in Big Endian cpus.\n * @param p_buffer\t\tpointer the data buffer to read data from.\n * @param p_value\t\tpointer to the value that will store the data.\n */\nvoid opj_read_float_BE(const OPJ_BYTE * p_buffer, OPJ_FLOAT32 * p_value);\n\n/**\n * Write some bytes to the given data buffer, this function is used in Little Endian cpus.\n * @param p_buffer\t\tpointer the data buffer to write data to.\n * @param p_value\t\tthe value to write\n */\nvoid opj_write_float_LE(OPJ_BYTE * p_buffer, OPJ_FLOAT32 p_value);\n\n/***\n * Write some bytes to the given data buffer, this function is used in Big Endian cpus.\n * @param p_buffer\t\tpointer the data buffer to write data to.\n * @param p_value\t\tthe value to write\n */\nvoid opj_write_float_BE(OPJ_BYTE * p_buffer, OPJ_FLOAT32 p_value);\n\n/**\n * Reads some bytes from the stream.\n * @param\t\tp_stream\tthe stream to read data from.\n * @param\t\tp_buffer\tpointer to the data buffer that will receive the data.\n * @param\t\tp_size\t\tnumber of bytes to read.\n * @param\t\tp_event_mgr\tthe user event manager to be notified of special events.\n * @return\t\tthe number of bytes read, or -1 if an error occured or if the stream is at the end.\n */\nOPJ_SIZE_T opj_stream_read_data (opj_stream_private_t * p_stream,OPJ_BYTE * p_buffer, OPJ_SIZE_T p_size, struct opj_event_mgr * p_event_mgr);\n\n/**\n * Writes some bytes to the stream.\n * @param\t\tp_stream\tthe stream to write data to.\n * @param\t\tp_buffer\tpointer to the data buffer holds the data to be writtent.\n * @param\t\tp_size\t\tnumber of bytes to write.\n * @param\t\tp_event_mgr\tthe user event manager to be notified of special events.\n * @return\t\tthe number of bytes writtent, or -1 if an error occured.\n */\nOPJ_SIZE_T opj_stream_write_data (opj_stream_private_t * p_stream,const OPJ_BYTE * p_buffer, OPJ_SIZE_T p_size, struct opj_event_mgr * p_event_mgr);\n\n/**\n * Writes the content of the stream buffer to the stream.\n * @param\t\tp_stream\tthe stream to write data to.\n * @param\t\tp_event_mgr\tthe user event manager to be notified of special events.\n * @return\t\ttrue if the data could be flushed, false else.\n */\nOPJ_BOOL opj_stream_flush (opj_stream_private_t * p_stream, struct opj_event_mgr * p_event_mgr);\n\n/**\n * Skips a number of bytes from the stream.\n * @param\t\tp_stream\tthe stream to skip data from.\n * @param\t\tp_size\t\tthe number of bytes to skip.\n * @param\t\tp_event_mgr\tthe user event manager to be notified of special events.\n * @return\t\tthe number of bytes skipped, or -1 if an error occured.\n */\nOPJ_OFF_T opj_stream_skip (opj_stream_private_t * p_stream,OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);\n\n/**\n * Tells the byte offset on the stream (similar to ftell).\n *\n * @param\t\tp_stream\tthe stream to get the information from.\n *\n * @return\t\tthe current position o fthe stream.\n */\nOPJ_OFF_T opj_stream_tell (const opj_stream_private_t * p_stream);\n\n\n/**\n * Get the number of bytes left before the end of the stream (similar to cio_numbytesleft).\n *\n * @param\t\tp_stream\tthe stream to get the information from.\n *\n * @return\t\tNumber of bytes left before the end of the stream.\n */\nOPJ_OFF_T opj_stream_get_number_byte_left (const opj_stream_private_t * p_stream);\n\n/**\n * Skips a number of bytes from the stream.\n * @param\t\tp_stream\tthe stream to skip data from.\n * @param\t\tp_size\t\tthe number of bytes to skip.\n * @param\t\tp_event_mgr\tthe user event manager to be notified of special events.\n * @return\t\tthe number of bytes skipped, or -1 if an error occured.\n */\nOPJ_OFF_T opj_stream_write_skip (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);\n\n/**\n * Skips a number of bytes from the stream.\n * @param\t\tp_stream\tthe stream to skip data from.\n * @param\t\tp_size\t\tthe number of bytes to skip.\n * @param\t\tp_event_mgr\tthe user event manager to be notified of special events.\n * @return\t\tthe number of bytes skipped, or -1 if an error occured.\n */\nOPJ_OFF_T opj_stream_read_skip (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);\n\n/**\n * Skips a number of bytes from the stream.\n * @param\t\tp_stream\tthe stream to skip data from.\n * @param\t\tp_size\t\tthe number of bytes to skip.\n * @param\t\tp_event_mgr\tthe user event manager to be notified of special events.\n * @return\t\tOPJ_TRUE if success, or OPJ_FALSE if an error occured.\n */\nOPJ_BOOL opj_stream_read_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);\n\n/**\n * Skips a number of bytes from the stream.\n * @param\t\tp_stream\tthe stream to skip data from.\n * @param\t\tp_size\t\tthe number of bytes to skip.\n * @param\t\tp_event_mgr\tthe user event manager to be notified of special events.\n * @return\t\tthe number of bytes skipped, or -1 if an error occured.\n */\nOPJ_BOOL opj_stream_write_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);\n\n/**\n * Seeks a number of bytes from the stream.\n * @param\t\tp_stream\tthe stream to skip data from.\n * @param\t\tp_size\t\tthe number of bytes to skip.\n * @param\t\tp_event_mgr\tthe user event manager to be notified of special events.\n * @return\t\ttrue if the stream is seekable.\n */\nOPJ_BOOL opj_stream_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);\n\n/**\n * Tells if the given stream is seekable.\n */\nOPJ_BOOL opj_stream_has_seek (const opj_stream_private_t * p_stream);\n\n/**\n * FIXME DOC.\n */\nOPJ_SIZE_T opj_stream_default_read (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data);\n\n/**\n * FIXME DOC.\n */\nOPJ_SIZE_T opj_stream_default_write (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data);\n\n/**\n * FIXME DOC.\n */\nOPJ_OFF_T opj_stream_default_skip (OPJ_OFF_T p_nb_bytes, void * p_user_data);\n\n/**\n * FIXME DOC.\n */\nOPJ_BOOL opj_stream_default_seek (OPJ_OFF_T p_nb_bytes, void * p_user_data);\n\n/* ----------------------------------------------------------------------- */\n/*@}*/\n\n/*@}*/\n\n\n#endif /* __CIO_H */\n\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/dwt.c",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2001-2003, David Janssens\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * Copyright (c) 2007, Jonathan Ballard <dzonatas@dzonux.net>\n * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifdef __SSE__\n#include <xmmintrin.h>\n#endif\n\n#include \"opj_includes.h\"\n\n/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */\n/*@{*/\n\n#define OPJ_WS(i) v->mem[(i)*2]\n#define OPJ_WD(i) v->mem[(1+(i)*2)]\n\n/** @name Local data structures */\n/*@{*/\n\ntypedef struct dwt_local {\n\tOPJ_INT32* mem;\n\tOPJ_INT32 dn;\n\tOPJ_INT32 sn;\n\tOPJ_INT32 cas;\n} opj_dwt_t;\n\ntypedef union {\n\tOPJ_FLOAT32\tf[4];\n} opj_v4_t;\n\ntypedef struct v4dwt_local {\n\topj_v4_t*\twavelet ;\n\tOPJ_INT32\t\tdn ;\n\tOPJ_INT32\t\tsn ;\n\tOPJ_INT32\t\tcas ;\n} opj_v4dwt_t ;\n\nstatic const OPJ_FLOAT32 opj_dwt_alpha =  1.586134342f; /*  12994 */\nstatic const OPJ_FLOAT32 opj_dwt_beta  =  0.052980118f; /*    434 */\nstatic const OPJ_FLOAT32 opj_dwt_gamma = -0.882911075f; /*  -7233 */\nstatic const OPJ_FLOAT32 opj_dwt_delta = -0.443506852f; /*  -3633 */\n\nstatic const OPJ_FLOAT32 opj_K      = 1.230174105f; /*  10078 */\nstatic const OPJ_FLOAT32 opj_c13318 = 1.625732422f;\n\n/*@}*/\n\n/**\nVirtual function type for wavelet transform in 1-D \n*/\ntypedef void (*DWT1DFN)(opj_dwt_t* v);\n\n/** @name Local static functions */\n/*@{*/\n\n/**\nForward lazy transform (horizontal)\n*/\nstatic void opj_dwt_deinterleave_h(OPJ_INT32 *a, OPJ_INT32 *b, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas);\n/**\nForward lazy transform (vertical)\n*/\nstatic void opj_dwt_deinterleave_v(OPJ_INT32 *a, OPJ_INT32 *b, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 x, OPJ_INT32 cas);\n/**\nInverse lazy transform (horizontal)\n*/\nstatic void opj_dwt_interleave_h(opj_dwt_t* h, OPJ_INT32 *a);\n/**\nInverse lazy transform (vertical)\n*/\nstatic void opj_dwt_interleave_v(opj_dwt_t* v, OPJ_INT32 *a, OPJ_INT32 x);\n/**\nForward 5-3 wavelet transform in 1-D\n*/\nstatic void opj_dwt_encode_1(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas);\n/**\nInverse 5-3 wavelet transform in 1-D\n*/\nstatic void opj_dwt_decode_1(opj_dwt_t *v);\nstatic void opj_dwt_decode_1_(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas);\n/**\nForward 9-7 wavelet transform in 1-D\n*/\nstatic void opj_dwt_encode_1_real(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas);\n/**\nExplicit calculation of the Quantization Stepsizes \n*/\nstatic void opj_dwt_encode_stepsize(OPJ_INT32 stepsize, OPJ_INT32 numbps, opj_stepsize_t *bandno_stepsize);\n/**\nInverse wavelet transform in 2-D.\n*/\nstatic OPJ_BOOL opj_dwt_decode_tile(opj_tcd_tilecomp_t* tilec, OPJ_UINT32 i, DWT1DFN fn);\n\nstatic OPJ_BOOL opj_dwt_encode_procedure(\topj_tcd_tilecomp_t * tilec,\n\t\t\t\t\t\t\t\t\t\t    void (*p_function)(OPJ_INT32 *, OPJ_INT32,OPJ_INT32,OPJ_INT32) );\n\nstatic OPJ_UINT32 opj_dwt_max_resolution(opj_tcd_resolution_t* restrict r, OPJ_UINT32 i);\n\n/* <summary>                             */\n/* Inverse 9-7 wavelet transform in 1-D. */\n/* </summary>                            */\nstatic void opj_v4dwt_decode(opj_v4dwt_t* restrict dwt);\n\nstatic void opj_v4dwt_interleave_h(opj_v4dwt_t* restrict w, OPJ_FLOAT32* restrict a, OPJ_INT32 x, OPJ_INT32 size);\n\nstatic void opj_v4dwt_interleave_v(opj_v4dwt_t* restrict v , OPJ_FLOAT32* restrict a , OPJ_INT32 x, OPJ_INT32 nb_elts_read);\n\n#ifdef __SSE__\nstatic void opj_v4dwt_decode_step1_sse(opj_v4_t* w, OPJ_INT32 count, const __m128 c);\n\nstatic void opj_v4dwt_decode_step2_sse(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k, OPJ_INT32 m, __m128 c);\n\n#else\nstatic void opj_v4dwt_decode_step1(opj_v4_t* w, OPJ_INT32 count, const OPJ_FLOAT32 c);\n\nstatic void opj_v4dwt_decode_step2(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k, OPJ_INT32 m, OPJ_FLOAT32 c);\n\n#endif\n\n/*@}*/\n\n/*@}*/\n\n#define OPJ_S(i) a[(i)*2]\n#define OPJ_D(i) a[(1+(i)*2)]\n#define OPJ_S_(i) ((i)<0?OPJ_S(0):((i)>=sn?OPJ_S(sn-1):OPJ_S(i)))\n#define OPJ_D_(i) ((i)<0?OPJ_D(0):((i)>=dn?OPJ_D(dn-1):OPJ_D(i)))\n/* new */\n#define OPJ_SS_(i) ((i)<0?OPJ_S(0):((i)>=dn?OPJ_S(dn-1):OPJ_S(i)))\n#define OPJ_DD_(i) ((i)<0?OPJ_D(0):((i)>=sn?OPJ_D(sn-1):OPJ_D(i)))\n\n/* <summary>                                                              */\n/* This table contains the norms of the 5-3 wavelets for different bands. */\n/* </summary>                                                             */\nstatic const OPJ_FLOAT64 opj_dwt_norms[4][10] = {\n\t{1.000, 1.500, 2.750, 5.375, 10.68, 21.34, 42.67, 85.33, 170.7, 341.3},\n\t{1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9},\n\t{1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9},\n\t{.7186, .9218, 1.586, 3.043, 6.019, 12.01, 24.00, 47.97, 95.93}\n};\n\n/* <summary>                                                              */\n/* This table contains the norms of the 9-7 wavelets for different bands. */\n/* </summary>                                                             */\nstatic const OPJ_FLOAT64 opj_dwt_norms_real[4][10] = {\n\t{1.000, 1.965, 4.177, 8.403, 16.90, 33.84, 67.69, 135.3, 270.6, 540.9},\n\t{2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0},\n\t{2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0},\n\t{2.080, 3.865, 8.307, 17.18, 34.71, 69.59, 139.3, 278.6, 557.2}\n};\n\n/* \n==========================================================\n   local functions\n==========================================================\n*/\n\n/* <summary>\t\t\t                 */\n/* Forward lazy transform (horizontal).  */\n/* </summary>                            */ \nvoid opj_dwt_deinterleave_h(OPJ_INT32 *a, OPJ_INT32 *b, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas) {\n\tOPJ_INT32 i;\n\tOPJ_INT32 * l_dest = b;\n\tOPJ_INT32 * l_src = a+cas;\n\n    for (i=0; i<sn; ++i) {\n\t\t*l_dest++ = *l_src;\n\t\tl_src += 2;\n\t}\n\t\n    l_dest = b + sn;\n\tl_src = a + 1 - cas;\n\n    for\t(i=0; i<dn; ++i)  {\n\t\t*l_dest++=*l_src;\n\t\tl_src += 2;\n\t}\n}\n\n/* <summary>                             */  \n/* Forward lazy transform (vertical).    */\n/* </summary>                            */ \nvoid opj_dwt_deinterleave_v(OPJ_INT32 *a, OPJ_INT32 *b, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 x, OPJ_INT32 cas) {\n    OPJ_INT32 i = sn;\n\tOPJ_INT32 * l_dest = b;\n\tOPJ_INT32 * l_src = a+cas;\n\n    while (i--) {\n\t\t*l_dest = *l_src;\n\t\tl_dest += x;\n\t\tl_src += 2;\n\t\t} /* b[i*x]=a[2*i+cas]; */\n\n\tl_dest = b + sn * x;\n\tl_src = a + 1 - cas;\n\t\n\ti = dn;\n    while (i--) {\n\t\t*l_dest = *l_src;\n\t\tl_dest += x;\n\t\tl_src += 2;\n        } /*b[(sn+i)*x]=a[(2*i+1-cas)];*/\n}\n\n/* <summary>                             */\n/* Inverse lazy transform (horizontal).  */\n/* </summary>                            */\nvoid opj_dwt_interleave_h(opj_dwt_t* h, OPJ_INT32 *a) {\n    OPJ_INT32 *ai = a;\n    OPJ_INT32 *bi = h->mem + h->cas;\n    OPJ_INT32  i\t= h->sn;\n    while( i-- ) {\n      *bi = *(ai++);\n\t  bi += 2;\n    }\n    ai\t= a + h->sn;\n    bi\t= h->mem + 1 - h->cas;\n    i\t= h->dn ;\n    while( i-- ) {\n      *bi = *(ai++);\n\t  bi += 2;\n    }\n}\n\n/* <summary>                             */  \n/* Inverse lazy transform (vertical).    */\n/* </summary>                            */ \nvoid opj_dwt_interleave_v(opj_dwt_t* v, OPJ_INT32 *a, OPJ_INT32 x) {\n    OPJ_INT32 *ai = a;\n    OPJ_INT32 *bi = v->mem + v->cas;\n    OPJ_INT32  i = v->sn;\n    while( i-- ) {\n      *bi = *ai;\n\t  bi += 2;\n\t  ai += x;\n    }\n    ai = a + (v->sn * x);\n    bi = v->mem + 1 - v->cas;\n    i = v->dn ;\n    while( i-- ) {\n      *bi = *ai;\n\t  bi += 2;  \n\t  ai += x;\n    }\n}\n\n\n/* <summary>                            */\n/* Forward 5-3 wavelet transform in 1-D. */\n/* </summary>                           */\nvoid opj_dwt_encode_1(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas) {\n\tOPJ_INT32 i;\n\t\n\tif (!cas) {\n\t\tif ((dn > 0) || (sn > 1)) {\t/* NEW :  CASE ONE ELEMENT */\n\t\t\tfor (i = 0; i < dn; i++) OPJ_D(i) -= (OPJ_S_(i) + OPJ_S_(i + 1)) >> 1;\n\t\t\tfor (i = 0; i < sn; i++) OPJ_S(i) += (OPJ_D_(i - 1) + OPJ_D_(i) + 2) >> 2;\n\t\t}\n\t} else {\n\t\tif (!sn && dn == 1)\t\t    /* NEW :  CASE ONE ELEMENT */\n\t\t\tOPJ_S(0) *= 2;\n\t\telse {\n\t\t\tfor (i = 0; i < dn; i++) OPJ_S(i) -= (OPJ_DD_(i) + OPJ_DD_(i - 1)) >> 1;\n\t\t\tfor (i = 0; i < sn; i++) OPJ_D(i) += (OPJ_SS_(i) + OPJ_SS_(i + 1) + 2) >> 2;\n\t\t}\n\t}\n}\n\n/* <summary>                            */\n/* Inverse 5-3 wavelet transform in 1-D. */\n/* </summary>                           */ \nvoid opj_dwt_decode_1_(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas) {\n\tOPJ_INT32 i;\n\t\n\tif (!cas) {\n\t\tif ((dn > 0) || (sn > 1)) { /* NEW :  CASE ONE ELEMENT */\n\t\t\tfor (i = 0; i < sn; i++) OPJ_S(i) -= (OPJ_D_(i - 1) + OPJ_D_(i) + 2) >> 2;\n\t\t\tfor (i = 0; i < dn; i++) OPJ_D(i) += (OPJ_S_(i) + OPJ_S_(i + 1)) >> 1;\n\t\t}\n\t} else {\n\t\tif (!sn  && dn == 1)          /* NEW :  CASE ONE ELEMENT */\n\t\t\tOPJ_S(0) /= 2;\n\t\telse {\n\t\t\tfor (i = 0; i < sn; i++) OPJ_D(i) -= (OPJ_SS_(i) + OPJ_SS_(i + 1) + 2) >> 2;\n\t\t\tfor (i = 0; i < dn; i++) OPJ_S(i) += (OPJ_DD_(i) + OPJ_DD_(i - 1)) >> 1;\n\t\t}\n\t}\n}\n\n/* <summary>                            */\n/* Inverse 5-3 wavelet transform in 1-D. */\n/* </summary>                           */ \nvoid opj_dwt_decode_1(opj_dwt_t *v) {\n\topj_dwt_decode_1_(v->mem, v->dn, v->sn, v->cas);\n}\n\n/* <summary>                             */\n/* Forward 9-7 wavelet transform in 1-D. */\n/* </summary>                            */\nvoid opj_dwt_encode_1_real(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas) {\n\tOPJ_INT32 i;\n\tif (!cas) {\n\t\tif ((dn > 0) || (sn > 1)) {\t/* NEW :  CASE ONE ELEMENT */\n\t\t\tfor (i = 0; i < dn; i++)\n\t\t\t\tOPJ_D(i) -= opj_int_fix_mul(OPJ_S_(i) + OPJ_S_(i + 1), 12993);\n\t\t\tfor (i = 0; i < sn; i++)\n\t\t\t\tOPJ_S(i) -= opj_int_fix_mul(OPJ_D_(i - 1) + OPJ_D_(i), 434);\n\t\t\tfor (i = 0; i < dn; i++)\n\t\t\t\tOPJ_D(i) += opj_int_fix_mul(OPJ_S_(i) + OPJ_S_(i + 1), 7233);\n\t\t\tfor (i = 0; i < sn; i++)\n\t\t\t\tOPJ_S(i) += opj_int_fix_mul(OPJ_D_(i - 1) + OPJ_D_(i), 3633);\n\t\t\tfor (i = 0; i < dn; i++)\n\t\t\t\tOPJ_D(i) = opj_int_fix_mul(OPJ_D(i), 5038);\t/*5038 */\n\t\t\tfor (i = 0; i < sn; i++)\n\t\t\t\tOPJ_S(i) = opj_int_fix_mul(OPJ_S(i), 6659);\t/*6660 */\n\t\t}\n\t} else {\n\t\tif ((sn > 0) || (dn > 1)) {\t/* NEW :  CASE ONE ELEMENT */\n\t\t\tfor (i = 0; i < dn; i++)\n\t\t\t\tOPJ_S(i) -= opj_int_fix_mul(OPJ_DD_(i) + OPJ_DD_(i - 1), 12993);\n\t\t\tfor (i = 0; i < sn; i++)\n\t\t\t\tOPJ_D(i) -= opj_int_fix_mul(OPJ_SS_(i) + OPJ_SS_(i + 1), 434);\n\t\t\tfor (i = 0; i < dn; i++)\n\t\t\t\tOPJ_S(i) += opj_int_fix_mul(OPJ_DD_(i) + OPJ_DD_(i - 1), 7233);\n\t\t\tfor (i = 0; i < sn; i++)\n\t\t\t\tOPJ_D(i) += opj_int_fix_mul(OPJ_SS_(i) + OPJ_SS_(i + 1), 3633);\n\t\t\tfor (i = 0; i < dn; i++)\n\t\t\t\tOPJ_S(i) = opj_int_fix_mul(OPJ_S(i), 5038);\t/*5038 */\n\t\t\tfor (i = 0; i < sn; i++)\n\t\t\t\tOPJ_D(i) = opj_int_fix_mul(OPJ_D(i), 6659);\t/*6660 */\n\t\t}\n\t}\n}\n\nvoid opj_dwt_encode_stepsize(OPJ_INT32 stepsize, OPJ_INT32 numbps, opj_stepsize_t *bandno_stepsize) {\n\tOPJ_INT32 p, n;\n\tp = opj_int_floorlog2(stepsize) - 13;\n\tn = 11 - opj_int_floorlog2(stepsize);\n\tbandno_stepsize->mant = (n < 0 ? stepsize >> -n : stepsize << n) & 0x7ff;\n\tbandno_stepsize->expn = numbps - p;\n}\n\n/* \n==========================================================\n   DWT interface\n==========================================================\n*/\n\n\n/* <summary>                            */\n/* Forward 5-3 wavelet transform in 2-D. */\n/* </summary>                           */\nINLINE OPJ_BOOL opj_dwt_encode_procedure(opj_tcd_tilecomp_t * tilec,void (*p_function)(OPJ_INT32 *, OPJ_INT32,OPJ_INT32,OPJ_INT32) )\n{\n\tOPJ_INT32 i, j, k;\n\tOPJ_INT32 *a = 00;\n\tOPJ_INT32 *aj = 00;\n\tOPJ_INT32 *bj = 00;\n\tOPJ_INT32 w, l;\n\n\tOPJ_INT32 rw;\t\t\t/* width of the resolution level computed   */\n\tOPJ_INT32 rh;\t\t\t/* height of the resolution level computed  */\n\tOPJ_UINT32 l_data_size;\n\n\topj_tcd_resolution_t * l_cur_res = 0;\n\topj_tcd_resolution_t * l_last_res = 0;\n\n\tw = tilec->x1-tilec->x0;\n\tl = (OPJ_INT32)tilec->numresolutions-1;\n\ta = tilec->data;\n\n\tl_cur_res = tilec->resolutions + l;\n\tl_last_res = l_cur_res - 1;\n\n\tl_data_size = opj_dwt_max_resolution( tilec->resolutions,tilec->numresolutions) * (OPJ_UINT32)sizeof(OPJ_INT32);\n\tbj = (OPJ_INT32*)opj_malloc((size_t)l_data_size);\n\tif (! bj) {\n\t\treturn OPJ_FALSE;\n\t}\n\ti = l;\n\n\twhile (i--) {\n\t\tOPJ_INT32 rw1;\t\t/* width of the resolution level once lower than computed one                                       */\n\t\tOPJ_INT32 rh1;\t\t/* height of the resolution level once lower than computed one                                      */\n\t\tOPJ_INT32 cas_col;\t/* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */\n\t\tOPJ_INT32 cas_row;\t/* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering   */\n\t\tOPJ_INT32 dn, sn;\n\n\t\trw  = l_cur_res->x1 - l_cur_res->x0;\n\t\trh  = l_cur_res->y1 - l_cur_res->y0;\n\t\trw1 = l_last_res->x1 - l_last_res->x0;\n\t\trh1 = l_last_res->y1 - l_last_res->y0;\n\n\t\tcas_row = l_cur_res->x0 & 1;\n\t\tcas_col = l_cur_res->y0 & 1;\n\n\t\tsn = rh1;\n\t\tdn = rh - rh1;\n\t\tfor (j = 0; j < rw; ++j) {\n\t\t\taj = a + j;\n\t\t\tfor (k = 0; k < rh; ++k) {\n\t\t\t\tbj[k] = aj[k*w];\n\t\t\t}\n\n\t\t\t(*p_function) (bj, dn, sn, cas_col);\n\n\t\t\topj_dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col);\n\t\t}\n\n\t\tsn = rw1;\n\t\tdn = rw - rw1;\n\n\t\tfor (j = 0; j < rh; j++) {\n\t\t\taj = a + j * w;\n\t\t\tfor (k = 0; k < rw; k++)  bj[k] = aj[k];\n\t\t\t(*p_function) (bj, dn, sn, cas_row);\n\t\t\topj_dwt_deinterleave_h(bj, aj, dn, sn, cas_row);\n\t\t}\n\n\t\tl_cur_res = l_last_res;\n\n\t\t--l_last_res;\n\t}\n\n\topj_free(bj);\n\treturn OPJ_TRUE;\n}\n\n/* Forward 5-3 wavelet transform in 2-D. */\n/* </summary>                           */\nOPJ_BOOL opj_dwt_encode(opj_tcd_tilecomp_t * tilec)\n{\n\treturn opj_dwt_encode_procedure(tilec,opj_dwt_encode_1);\n}\n\n/* <summary>                            */\n/* Inverse 5-3 wavelet transform in 2-D. */\n/* </summary>                           */\nOPJ_BOOL opj_dwt_decode(opj_tcd_tilecomp_t* tilec, OPJ_UINT32 numres) {\n\treturn opj_dwt_decode_tile(tilec, numres, &opj_dwt_decode_1);\n}\n\n\n/* <summary>                          */\n/* Get gain of 5-3 wavelet transform. */\n/* </summary>                         */\nOPJ_UINT32 opj_dwt_getgain(OPJ_UINT32 orient) {\n\tif (orient == 0)\n\t\treturn 0;\n\tif (orient == 1 || orient == 2)\n\t\treturn 1;\n\treturn 2;\n}\n\n/* <summary>                */\n/* Get norm of 5-3 wavelet. */\n/* </summary>               */\nOPJ_FLOAT64 opj_dwt_getnorm(OPJ_UINT32 level, OPJ_UINT32 orient) {\n\treturn opj_dwt_norms[orient][level];\n}\n\n/* <summary>                             */\n/* Forward 9-7 wavelet transform in 2-D. */\n/* </summary>                            */\nOPJ_BOOL opj_dwt_encode_real(opj_tcd_tilecomp_t * tilec)\n{\n\treturn opj_dwt_encode_procedure(tilec,opj_dwt_encode_1_real);\n}\n\n/* <summary>                          */\n/* Get gain of 9-7 wavelet transform. */\n/* </summary>                         */\nOPJ_UINT32 opj_dwt_getgain_real(OPJ_UINT32 orient) {\n\t(void)orient;\n\treturn 0;\n}\n\n/* <summary>                */\n/* Get norm of 9-7 wavelet. */\n/* </summary>               */\nOPJ_FLOAT64 opj_dwt_getnorm_real(OPJ_UINT32 level, OPJ_UINT32 orient) {\n\treturn opj_dwt_norms_real[orient][level];\n}\n\nvoid opj_dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, OPJ_UINT32 prec) {\n\tOPJ_UINT32 numbands, bandno;\n\tnumbands = 3 * tccp->numresolutions - 2;\n\tfor (bandno = 0; bandno < numbands; bandno++) {\n\t\tOPJ_FLOAT64 stepsize;\n\t\tOPJ_UINT32 resno, level, orient, gain;\n\n\t\tresno = (bandno == 0) ? 0 : ((bandno - 1) / 3 + 1);\n\t\torient = (bandno == 0) ? 0 : ((bandno - 1) % 3 + 1);\n\t\tlevel = tccp->numresolutions - 1 - resno;\n\t\tgain = (tccp->qmfbid == 0) ? 0 : ((orient == 0) ? 0 : (((orient == 1) || (orient == 2)) ? 1 : 2));\n\t\tif (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {\n\t\t\tstepsize = 1.0;\n\t\t} else {\n\t\t\tOPJ_FLOAT64 norm = opj_dwt_norms_real[orient][level];\n\t\t\tstepsize = (1 << (gain)) / norm;\n\t\t}\n\t\topj_dwt_encode_stepsize((OPJ_INT32) floor(stepsize * 8192.0), (OPJ_INT32)(prec + gain), &tccp->stepsizes[bandno]);\n\t}\n}\n\n/* <summary>                             */\n/* Determine maximum computed resolution level for inverse wavelet transform */\n/* </summary>                            */\nOPJ_UINT32 opj_dwt_max_resolution(opj_tcd_resolution_t* restrict r, OPJ_UINT32 i) {\n\tOPJ_UINT32 mr\t= 0;\n\tOPJ_UINT32 w;\n\twhile( --i ) {\n\t\t++r;\n\t\tif( mr < ( w = (OPJ_UINT32)(r->x1 - r->x0) ) )\n\t\t\tmr = w ;\n\t\tif( mr < ( w = (OPJ_UINT32)(r->y1 - r->y0) ) )\n\t\t\tmr = w ;\n\t}\n\treturn mr ;\n}\n\n/* <summary>                            */\n/* Inverse wavelet transform in 2-D.     */\n/* </summary>                           */\nOPJ_BOOL opj_dwt_decode_tile(opj_tcd_tilecomp_t* tilec, OPJ_UINT32 numres, DWT1DFN dwt_1D) {\n\topj_dwt_t h;\n\topj_dwt_t v;\n\n\topj_tcd_resolution_t* tr = tilec->resolutions;\n\n\tOPJ_UINT32 rw = (OPJ_UINT32)(tr->x1 - tr->x0);\t/* width of the resolution level computed */\n\tOPJ_UINT32 rh = (OPJ_UINT32)(tr->y1 - tr->y0);\t/* height of the resolution level computed */\n\n\tOPJ_UINT32 w = (OPJ_UINT32)(tilec->x1 - tilec->x0);\n\n\th.mem = (OPJ_INT32*)\n\topj_aligned_malloc(opj_dwt_max_resolution(tr, numres) * sizeof(OPJ_INT32));\n\tif (! h.mem){\n\t\treturn OPJ_FALSE;\n\t}\n\n\tv.mem = h.mem;\n\n\twhile( --numres) {\n\t\tOPJ_INT32 * restrict tiledp = tilec->data;\n\t\tOPJ_UINT32 j;\n\n\t\t++tr;\n\t\th.sn = (OPJ_INT32)rw;\n\t\tv.sn = (OPJ_INT32)rh;\n\n\t\trw = (OPJ_UINT32)(tr->x1 - tr->x0);\n\t\trh = (OPJ_UINT32)(tr->y1 - tr->y0);\n\n\t\th.dn = (OPJ_INT32)(rw - (OPJ_UINT32)h.sn);\n\t\th.cas = tr->x0 % 2;\n\n\t\tfor(j = 0; j < rh; ++j) {\n\t\t\topj_dwt_interleave_h(&h, &tiledp[j*w]);\n\t\t\t(dwt_1D)(&h);\n\t\t\tmemcpy(&tiledp[j*w], h.mem, rw * sizeof(OPJ_INT32));\n\t\t}\n\n\t\tv.dn = (OPJ_INT32)(rh - (OPJ_UINT32)v.sn);\n\t\tv.cas = tr->y0 % 2;\n\n\t\tfor(j = 0; j < rw; ++j){\n\t\t\tOPJ_UINT32 k;\n\t\t\topj_dwt_interleave_v(&v, &tiledp[j], (OPJ_INT32)w);\n\t\t\t(dwt_1D)(&v);\n\t\t\tfor(k = 0; k < rh; ++k) {\n\t\t\t\ttiledp[k * w + j] = v.mem[k];\n\t\t\t}\n\t\t}\n\t}\n\topj_aligned_free(h.mem);\n\treturn OPJ_TRUE;\n}\n\nvoid opj_v4dwt_interleave_h(opj_v4dwt_t* restrict w, OPJ_FLOAT32* restrict a, OPJ_INT32 x, OPJ_INT32 size){\n\tOPJ_FLOAT32* restrict bi = (OPJ_FLOAT32*) (w->wavelet + w->cas);\n\tOPJ_INT32 count = w->sn;\n\tOPJ_INT32 i, k;\n\n\tfor(k = 0; k < 2; ++k){\n\t\tif ( count + 3 * x < size && ((size_t) a & 0x0f) == 0 && ((size_t) bi & 0x0f) == 0 && (x & 0x0f) == 0 ) {\n\t\t\t/* Fast code path */\n\t\t\tfor(i = 0; i < count; ++i){\n\t\t\t\tOPJ_INT32 j = i;\n\t\t\t\tbi[i*8    ] = a[j];\n\t\t\t\tj += x;\n\t\t\t\tbi[i*8 + 1] = a[j];\n\t\t\t\tj += x;\n\t\t\t\tbi[i*8 + 2] = a[j];\n\t\t\t\tj += x;\n\t\t\t\tbi[i*8 + 3] = a[j];\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t/* Slow code path */\n\t\t\tfor(i = 0; i < count; ++i){\n\t\t\t\tOPJ_INT32 j = i;\n\t\t\t\tbi[i*8    ] = a[j];\n\t\t\t\tj += x;\n\t\t\t\tif(j >= size) continue;\n\t\t\t\tbi[i*8 + 1] = a[j];\n\t\t\t\tj += x;\n\t\t\t\tif(j >= size) continue;\n\t\t\t\tbi[i*8 + 2] = a[j];\n\t\t\t\tj += x;\n\t\t\t\tif(j >= size) continue;\n\t\t\t\tbi[i*8 + 3] = a[j]; /* This one*/\n\t\t\t}\n\t\t}\n\n\t\tbi = (OPJ_FLOAT32*) (w->wavelet + 1 - w->cas);\n\t\ta += w->sn;\n\t\tsize -= w->sn;\n\t\tcount = w->dn;\n\t}\n}\n\nvoid opj_v4dwt_interleave_v(opj_v4dwt_t* restrict v , OPJ_FLOAT32* restrict a , OPJ_INT32 x, OPJ_INT32 nb_elts_read){\n\topj_v4_t* restrict bi = v->wavelet + v->cas;\n\tOPJ_INT32 i;\n\n\tfor(i = 0; i < v->sn; ++i){\n\t\tmemcpy(&bi[i*2], &a[i*x], (size_t)nb_elts_read * sizeof(OPJ_FLOAT32));\n\t}\n\n\ta += v->sn * x;\n\tbi = v->wavelet + 1 - v->cas;\n\n\tfor(i = 0; i < v->dn; ++i){\n\t\tmemcpy(&bi[i*2], &a[i*x], (size_t)nb_elts_read * sizeof(OPJ_FLOAT32));\n\t}\n}\n\n#ifdef __SSE__\n\nvoid opj_v4dwt_decode_step1_sse(opj_v4_t* w, OPJ_INT32 count, const __m128 c){\n\t__m128* restrict vw = (__m128*) w;\n\tOPJ_INT32 i;\n\t/* 4x unrolled loop */\n\tfor(i = 0; i < count >> 2; ++i){\n\t\t*vw = _mm_mul_ps(*vw, c);\n\t\tvw += 2;\n\t\t*vw = _mm_mul_ps(*vw, c);\n\t\tvw += 2;\n\t\t*vw = _mm_mul_ps(*vw, c);\n\t\tvw += 2;\n\t\t*vw = _mm_mul_ps(*vw, c);\n\t\tvw += 2;\n\t}\n\tcount &= 3;\n\tfor(i = 0; i < count; ++i){\n\t\t*vw = _mm_mul_ps(*vw, c);\n\t\tvw += 2;\n\t}\n}\n\nvoid opj_v4dwt_decode_step2_sse(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k, OPJ_INT32 m, __m128 c){\n\t__m128* restrict vl = (__m128*) l;\n\t__m128* restrict vw = (__m128*) w;\n\tOPJ_INT32 i;\n\t__m128 tmp1, tmp2, tmp3;\n\ttmp1 = vl[0];\n\tfor(i = 0; i < m; ++i){\n\t\ttmp2 = vw[-1];\n\t\ttmp3 = vw[ 0];\n\t\tvw[-1] = _mm_add_ps(tmp2, _mm_mul_ps(_mm_add_ps(tmp1, tmp3), c));\n\t\ttmp1 = tmp3;\n\t\tvw += 2;\n\t}\n\tvl = vw - 2;\n\tif(m >= k){\n\t\treturn;\n\t}\n\tc = _mm_add_ps(c, c);\n\tc = _mm_mul_ps(c, vl[0]);\n\tfor(; m < k; ++m){\n\t\t__m128 tmp = vw[-1];\n\t\tvw[-1] = _mm_add_ps(tmp, c);\n\t\tvw += 2;\n\t}\n}\n\n#else\n\nvoid opj_v4dwt_decode_step1(opj_v4_t* w, OPJ_INT32 count, const OPJ_FLOAT32 c)\n{\n\tOPJ_FLOAT32* restrict fw = (OPJ_FLOAT32*) w;\n\tOPJ_INT32 i;\n\tfor(i = 0; i < count; ++i){\n\t\tOPJ_FLOAT32 tmp1 = fw[i*8    ];\n\t\tOPJ_FLOAT32 tmp2 = fw[i*8 + 1];\n\t\tOPJ_FLOAT32 tmp3 = fw[i*8 + 2];\n\t\tOPJ_FLOAT32 tmp4 = fw[i*8 + 3];\n\t\tfw[i*8    ] = tmp1 * c;\n\t\tfw[i*8 + 1] = tmp2 * c;\n\t\tfw[i*8 + 2] = tmp3 * c;\n\t\tfw[i*8 + 3] = tmp4 * c;\n\t}\n}\n\nvoid opj_v4dwt_decode_step2(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k, OPJ_INT32 m, OPJ_FLOAT32 c)\n{\n\tOPJ_FLOAT32* restrict fl = (OPJ_FLOAT32*) l;\n\tOPJ_FLOAT32* restrict fw = (OPJ_FLOAT32*) w;\n\tOPJ_INT32 i;\n\tfor(i = 0; i < m; ++i){\n\t\tOPJ_FLOAT32 tmp1_1 = fl[0];\n\t\tOPJ_FLOAT32 tmp1_2 = fl[1];\n\t\tOPJ_FLOAT32 tmp1_3 = fl[2];\n\t\tOPJ_FLOAT32 tmp1_4 = fl[3];\n\t\tOPJ_FLOAT32 tmp2_1 = fw[-4];\n\t\tOPJ_FLOAT32 tmp2_2 = fw[-3];\n\t\tOPJ_FLOAT32 tmp2_3 = fw[-2];\n\t\tOPJ_FLOAT32 tmp2_4 = fw[-1];\n\t\tOPJ_FLOAT32 tmp3_1 = fw[0];\n\t\tOPJ_FLOAT32 tmp3_2 = fw[1];\n\t\tOPJ_FLOAT32 tmp3_3 = fw[2];\n\t\tOPJ_FLOAT32 tmp3_4 = fw[3];\n\t\tfw[-4] = tmp2_1 + ((tmp1_1 + tmp3_1) * c);\n\t\tfw[-3] = tmp2_2 + ((tmp1_2 + tmp3_2) * c);\n\t\tfw[-2] = tmp2_3 + ((tmp1_3 + tmp3_3) * c);\n\t\tfw[-1] = tmp2_4 + ((tmp1_4 + tmp3_4) * c);\n\t\tfl = fw;\n\t\tfw += 8;\n\t}\n\tif(m < k){\n\t\tOPJ_FLOAT32 c1;\n\t\tOPJ_FLOAT32 c2;\n\t\tOPJ_FLOAT32 c3;\n\t\tOPJ_FLOAT32 c4;\n\t\tc += c;\n\t\tc1 = fl[0] * c;\n\t\tc2 = fl[1] * c;\n\t\tc3 = fl[2] * c;\n\t\tc4 = fl[3] * c;\n\t\tfor(; m < k; ++m){\n\t\t\tOPJ_FLOAT32 tmp1 = fw[-4];\n\t\t\tOPJ_FLOAT32 tmp2 = fw[-3];\n\t\t\tOPJ_FLOAT32 tmp3 = fw[-2];\n\t\t\tOPJ_FLOAT32 tmp4 = fw[-1];\n\t\t\tfw[-4] = tmp1 + c1;\n\t\t\tfw[-3] = tmp2 + c2;\n\t\t\tfw[-2] = tmp3 + c3;\n\t\t\tfw[-1] = tmp4 + c4;\n\t\t\tfw += 8;\n\t\t}\n\t}\n}\n\n#endif\n\n/* <summary>                             */\n/* Inverse 9-7 wavelet transform in 1-D. */\n/* </summary>                            */\nvoid opj_v4dwt_decode(opj_v4dwt_t* restrict dwt)\n{\n\tOPJ_INT32 a, b;\n\tif(dwt->cas == 0) {\n\t\tif(!((dwt->dn > 0) || (dwt->sn > 1))){\n\t\t\treturn;\n\t\t}\n\t\ta = 0;\n\t\tb = 1;\n\t}else{\n\t\tif(!((dwt->sn > 0) || (dwt->dn > 1))) {\n\t\t\treturn;\n\t\t}\n\t\ta = 1;\n\t\tb = 0;\n\t}\n\n#ifdef __SSE__\n\topj_v4dwt_decode_step1_sse(dwt->wavelet+a, dwt->sn, _mm_set1_ps(opj_K));\n\topj_v4dwt_decode_step1_sse(dwt->wavelet+b, dwt->dn, _mm_set1_ps(opj_c13318));\n\topj_v4dwt_decode_step2_sse(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, opj_int_min(dwt->sn, dwt->dn-a), _mm_set1_ps(opj_dwt_delta));\n\topj_v4dwt_decode_step2_sse(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, opj_int_min(dwt->dn, dwt->sn-b), _mm_set1_ps(opj_dwt_gamma));\n\topj_v4dwt_decode_step2_sse(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, opj_int_min(dwt->sn, dwt->dn-a), _mm_set1_ps(opj_dwt_beta));\n\topj_v4dwt_decode_step2_sse(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, opj_int_min(dwt->dn, dwt->sn-b), _mm_set1_ps(opj_dwt_alpha));\n#else\n\topj_v4dwt_decode_step1(dwt->wavelet+a, dwt->sn, opj_K);\n\topj_v4dwt_decode_step1(dwt->wavelet+b, dwt->dn, opj_c13318);\n\topj_v4dwt_decode_step2(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, opj_int_min(dwt->sn, dwt->dn-a), opj_dwt_delta);\n\topj_v4dwt_decode_step2(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, opj_int_min(dwt->dn, dwt->sn-b), opj_dwt_gamma);\n\topj_v4dwt_decode_step2(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, opj_int_min(dwt->sn, dwt->dn-a), opj_dwt_beta);\n\topj_v4dwt_decode_step2(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, opj_int_min(dwt->dn, dwt->sn-b), opj_dwt_alpha);\n#endif\n}\n\n\n/* <summary>                             */\n/* Inverse 9-7 wavelet transform in 2-D. */\n/* </summary>                            */\nOPJ_BOOL opj_dwt_decode_real(opj_tcd_tilecomp_t* restrict tilec, OPJ_UINT32 numres)\n{\n\topj_v4dwt_t h;\n\topj_v4dwt_t v;\n\n\topj_tcd_resolution_t* res = tilec->resolutions;\n\n\tOPJ_UINT32 rw = (OPJ_UINT32)(res->x1 - res->x0);\t/* width of the resolution level computed */\n\tOPJ_UINT32 rh = (OPJ_UINT32)(res->y1 - res->y0);\t/* height of the resolution level computed */\n\n\tOPJ_UINT32 w = (OPJ_UINT32)(tilec->x1 - tilec->x0);\n\n\th.wavelet = (opj_v4_t*) opj_aligned_malloc((opj_dwt_max_resolution(res, numres)+5) * sizeof(opj_v4_t));\n\tv.wavelet = h.wavelet;\n\n\twhile( --numres) {\n\t\tOPJ_FLOAT32 * restrict aj = (OPJ_FLOAT32*) tilec->data;\n\t\tOPJ_UINT32 bufsize = (OPJ_UINT32)((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0));\n\t\tOPJ_INT32 j;\n\n\t\th.sn = (OPJ_INT32)rw;\n\t\tv.sn = (OPJ_INT32)rh;\n\n\t\t++res;\n\n\t\trw = (OPJ_UINT32)(res->x1 - res->x0);\t/* width of the resolution level computed */\n\t\trh = (OPJ_UINT32)(res->y1 - res->y0);\t/* height of the resolution level computed */\n\n\t\th.dn = (OPJ_INT32)(rw - (OPJ_UINT32)h.sn);\n\t\th.cas = res->x0 % 2;\n\n\t\tfor(j = (OPJ_INT32)rh; j > 3; j -= 4) {\n\t\t\tOPJ_INT32 k;\n\t\t\topj_v4dwt_interleave_h(&h, aj, (OPJ_INT32)w, (OPJ_INT32)bufsize);\n\t\t\topj_v4dwt_decode(&h);\n\n\t\t\tfor(k = (OPJ_INT32)rw; --k >= 0;){\n\t\t\t\taj[k               ] = h.wavelet[k].f[0];\n\t\t\t\taj[k+(OPJ_INT32)w  ] = h.wavelet[k].f[1];\n\t\t\t\taj[k+(OPJ_INT32)w*2] = h.wavelet[k].f[2];\n\t\t\t\taj[k+(OPJ_INT32)w*3] = h.wavelet[k].f[3];\n\t\t\t}\n\n\t\t\taj += w*4;\n\t\t\tbufsize -= w*4;\n\t\t}\n\n\t\tif (rh & 0x03) {\n\t\t\tOPJ_INT32 k;\n\t\t\tj = rh & 0x03;\n\t\t\topj_v4dwt_interleave_h(&h, aj, (OPJ_INT32)w, (OPJ_INT32)bufsize);\n\t\t\topj_v4dwt_decode(&h);\n\t\t\tfor(k = (OPJ_INT32)rw; --k >= 0;){\n\t\t\t\tswitch(j) {\n\t\t\t\t\tcase 3: aj[k+(OPJ_INT32)w*2] = h.wavelet[k].f[2];\n\t\t\t\t\tcase 2: aj[k+(OPJ_INT32)w  ] = h.wavelet[k].f[1];\n\t\t\t\t\tcase 1: aj[k               ] = h.wavelet[k].f[0];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tv.dn = (OPJ_INT32)(rh - (OPJ_UINT32)v.sn);\n\t\tv.cas = res->y0 % 2;\n\n\t\taj = (OPJ_FLOAT32*) tilec->data;\n\t\tfor(j = (OPJ_INT32)rw; j > 3; j -= 4){\n\t\t\tOPJ_UINT32 k;\n\n\t\t\topj_v4dwt_interleave_v(&v, aj, (OPJ_INT32)w, 4);\n\t\t\topj_v4dwt_decode(&v);\n\n\t\t\tfor(k = 0; k < rh; ++k){\n\t\t\t\tmemcpy(&aj[k*w], &v.wavelet[k], 4 * sizeof(OPJ_FLOAT32));\n\t\t\t}\n\t\t\taj += 4;\n\t\t}\n\n\t\tif (rw & 0x03){\n\t\t\tOPJ_UINT32 k;\n\n\t\t\tj = rw & 0x03;\n\n\t\t\topj_v4dwt_interleave_v(&v, aj, (OPJ_INT32)w, j);\n\t\t\topj_v4dwt_decode(&v);\n\n\t\t\tfor(k = 0; k < rh; ++k){\n\t\t\t\tmemcpy(&aj[k*w], &v.wavelet[k], (size_t)j * sizeof(OPJ_FLOAT32));\n\t\t\t}\n\t\t}\n\t}\n\n\topj_aligned_free(h.wavelet);\n\treturn OPJ_TRUE;\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/dwt.h",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2001-2003, David Janssens\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifndef __DWT_H\n#define __DWT_H\n/**\n@file dwt.h\n@brief Implementation of a discrete wavelet transform (DWT)\n\nThe functions in DWT.C have for goal to realize forward and inverse discret wavelet\ntransform with filter 5-3 (reversible) and filter 9-7 (irreversible). The functions in\nDWT.C are used by some function in TCD.C.\n*/\n\n/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */\n/*@{*/\n\n\n/** @name Exported functions */\n/*@{*/\n/* ----------------------------------------------------------------------- */\n/**\nForward 5-3 wavelet tranform in 2-D. \nApply a reversible DWT transform to a component of an image.\n@param tilec Tile component information (current tile)\n*/\nOPJ_BOOL opj_dwt_encode(opj_tcd_tilecomp_t * tilec);\n\n/**\nInverse 5-3 wavelet tranform in 2-D.\nApply a reversible inverse DWT transform to a component of an image.\n@param tilec Tile component information (current tile)\n@param numres Number of resolution levels to decode\n*/\nOPJ_BOOL opj_dwt_decode(opj_tcd_tilecomp_t* tilec, OPJ_UINT32 numres);\n\n/**\nGet the gain of a subband for the reversible 5-3 DWT.\n@param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH)\n@return Returns 0 if orient = 0, returns 1 if orient = 1 or 2, returns 2 otherwise\n*/\nOPJ_UINT32 opj_dwt_getgain(OPJ_UINT32 orient) ;\n/**\nGet the norm of a wavelet function of a subband at a specified level for the reversible 5-3 DWT.\n@param level Level of the wavelet function\n@param orient Band of the wavelet function\n@return Returns the norm of the wavelet function\n*/\nOPJ_FLOAT64 opj_dwt_getnorm(OPJ_UINT32 level, OPJ_UINT32 orient);\n/**\nForward 9-7 wavelet transform in 2-D. \nApply an irreversible DWT transform to a component of an image.\n@param tilec Tile component information (current tile)\n*/\nOPJ_BOOL opj_dwt_encode_real(opj_tcd_tilecomp_t * tilec);\n/**\nInverse 9-7 wavelet transform in 2-D. \nApply an irreversible inverse DWT transform to a component of an image.\n@param tilec Tile component information (current tile)\n@param numres Number of resolution levels to decode\n*/\nOPJ_BOOL opj_dwt_decode_real(opj_tcd_tilecomp_t* restrict tilec, OPJ_UINT32 numres);\n\n/**\nGet the gain of a subband for the irreversible 9-7 DWT.\n@param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH)\n@return Returns the gain of the 9-7 wavelet transform\n*/\nOPJ_UINT32 opj_dwt_getgain_real(OPJ_UINT32 orient);\n/**\nGet the norm of a wavelet function of a subband at a specified level for the irreversible 9-7 DWT\n@param level Level of the wavelet function\n@param orient Band of the wavelet function\n@return Returns the norm of the 9-7 wavelet\n*/\nOPJ_FLOAT64 opj_dwt_getnorm_real(OPJ_UINT32 level, OPJ_UINT32 orient);\n/**\nExplicit calculation of the Quantization Stepsizes \n@param tccp Tile-component coding parameters\n@param prec Precint analyzed\n*/\nvoid opj_dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, OPJ_UINT32 prec);\n/* ----------------------------------------------------------------------- */\n/*@}*/\n\n/*@}*/\n\n#endif /* __DWT_H */\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/event.c",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR \n * Copyright (c) 2012, CS Systemes d'Information, France\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"opj_includes.h\"\n\n/* ==========================================================\n     Utility functions\n   ==========================================================*/\n\n#ifdef OPJ_CODE_NOT_USED\n#ifndef _WIN32\nstatic char*\ni2a(unsigned i, char *a, unsigned r) {\n\tif (i/r > 0) a = i2a(i/r,a,r);\n\t*a = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\"[i%r];\n\treturn a+1;\n}\n\n/** \n Transforms integer i into an ascii string and stores the result in a; \n string is encoded in the base indicated by r.\n @param i Number to be converted\n @param a String result\n @param r Base of value; must be in the range 2 - 36\n @return Returns a\n*/\nstatic char *\n_itoa(int i, char *a, int r) {\n\tr = ((r < 2) || (r > 36)) ? 10 : r;\n\tif(i < 0) {\n\t\t*a = '-';\n\t\t*i2a(-i, a+1, r) = 0;\n\t}\n\telse *i2a(i, a, r) = 0;\n\treturn a;\n}\n\n#endif /* !_WIN32 */\n#endif\n\n/* ----------------------------------------------------------------------- */\n/**\n * Default callback function.\n * Do nothing.\n */\nstatic void opj_default_callback (const char *msg, void *client_data)\n{\n    OPJ_ARG_NOT_USED(msg);\n    OPJ_ARG_NOT_USED(client_data);\n}\n\n/* ----------------------------------------------------------------------- */\n\n\n/* ----------------------------------------------------------------------- */\nOPJ_BOOL opj_event_msg(opj_event_mgr_t* p_event_mgr, OPJ_INT32 event_type, const char *fmt, ...) {\n#define OPJ_MSG_SIZE 512 /* 512 bytes should be more than enough for a short message */\n\topj_msg_callback msg_handler = 00;\n\tvoid * l_data = 00;\n\n\tif(p_event_mgr != 00) {\n\t\tswitch(event_type) {\n\t\t\tcase EVT_ERROR:\n\t\t\t\tmsg_handler = p_event_mgr->error_handler;\n\t\t\t\tl_data = p_event_mgr->m_error_data;\n\t\t\t\tbreak;\n\t\t\tcase EVT_WARNING:\n\t\t\t\tmsg_handler = p_event_mgr->warning_handler;\n\t\t\t\tl_data = p_event_mgr->m_warning_data;\n\t\t\t\tbreak;\n\t\t\tcase EVT_INFO:\n\t\t\t\tmsg_handler = p_event_mgr->info_handler;\n\t\t\t\tl_data = p_event_mgr->m_info_data;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tif(msg_handler == 00) {\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\t} else {\n\t\treturn OPJ_FALSE;\n\t}\n\n\tif ((fmt != 00) && (p_event_mgr != 00)) {\n\t\tva_list arg;\n\t\tsize_t str_length/*, i, j*/; /* UniPG */\n\t\tchar message[OPJ_MSG_SIZE];\n\t\tmemset(message, 0, OPJ_MSG_SIZE);\n\t\t/* initialize the optional parameter list */\n\t\tva_start(arg, fmt);\n\t\t/* check the length of the format string */\n\t\tstr_length = (strlen(fmt) > OPJ_MSG_SIZE) ? OPJ_MSG_SIZE : strlen(fmt);\n        (void)str_length;\n\t\t/* parse the format string and put the result in 'message' */\n\t\tvsnprintf(message, OPJ_MSG_SIZE, fmt, arg); /* UniPG */\n\t\t/* deinitialize the optional parameter list */\n\t\tva_end(arg);\n\n\t\t/* output the message to the user program */\n\t\tmsg_handler(message, l_data);\n\t}\n\n\treturn OPJ_TRUE;\n}\n\nvoid opj_set_default_event_handler(opj_event_mgr_t * p_manager)\n{\n\tp_manager->m_error_data = 00;\n\tp_manager->m_warning_data = 00;\n\tp_manager->m_info_data = 00;\n\tp_manager->error_handler = opj_default_callback;\n\tp_manager->info_handler = opj_default_callback;\n\tp_manager->warning_handler = opj_default_callback;\n}\n\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/event.h",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR \n * Copyright (c) 2012, CS Systemes d'Information, France\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef __EVENT_H\n#define __EVENT_H\n/**\n@file event.h\n@brief Implementation of a event callback system\n\nThe functions in EVENT.C have for goal to send output messages (errors, warnings, debug) to the user.\n*/\n/**\nMessage handler object\nused for \n<ul>\n<li>Error messages\n<li>Warning messages\n<li>Debugging messages\n</ul>\n*/\ntypedef struct opj_event_mgr \n{\n\t/** Data to call the event manager upon */\n\tvoid *\t\t\tm_error_data;\n\t/** Data to call the event manager upon */\n\tvoid *\t\t\tm_warning_data;\n\t/** Data to call the event manager upon */\n\tvoid *\t\t\tm_info_data;\n\t/** Error message callback if available, NULL otherwise */\n\topj_msg_callback error_handler;\n\t/** Warning message callback if available, NULL otherwise */\n\topj_msg_callback warning_handler;\n\t/** Debug message callback if available, NULL otherwise */\n\topj_msg_callback info_handler;\n} opj_event_mgr_t;\n\n\n#define EVT_ERROR\t1\t/**< Error event type */\n#define EVT_WARNING\t2\t/**< Warning event type */\n#define EVT_INFO\t4\t/**< Debug event type */\n\n/** @defgroup EVENT EVENT - Implementation of a event callback system */\n/*@{*/\n\n/** @name Exported functions (see also openjpeg.h) */\n/*@{*/\n/* ----------------------------------------------------------------------- */\n\n\n/* ----------------------------------------------------------------------- */\n\n/**\n * Write formatted data to a string and send the string to a user callback.\n *\n * @param event_mgr\t\t\tEvent handler\n * @param event_type \t\tEvent type or callback to use to send the message\n * @param fmt \t\t\t\tFormat-control string (plus optional arguments)\n *\n * @return Returns true if successful, returns false otherwise\n */\nOPJ_BOOL opj_event_msg(opj_event_mgr_t* event_mgr, OPJ_INT32 event_type, const char *fmt, ...);\n/* ----------------------------------------------------------------------- */\n\n/**\n * Set the event manager with the default callback function for the 3 levels.\n */\nvoid opj_set_default_event_handler(opj_event_mgr_t * p_manager);\n\n/*@}*/\n\n/*@}*/\n\n#endif /* __EVENT_H */\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/function_list.c",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"opj_includes.h\"\n\n/**\n * Default size of the validation list, if not sufficient, data will be reallocated with a double size.\n */\n#define OPJ_VALIDATION_SIZE 10\n\nopj_procedure_list_t *  opj_procedure_list_create()\n{\n        /* memory allocation */\n        opj_procedure_list_t * l_validation = (opj_procedure_list_t *) opj_malloc(sizeof(opj_procedure_list_t));\n        if (! l_validation)\n        {\n                return 00;\n        }\n        /* initialization */\n        memset(l_validation,0,sizeof(opj_procedure_list_t));\n        l_validation->m_nb_max_procedures = OPJ_VALIDATION_SIZE;\n        l_validation->m_procedures = (opj_procedure*)opj_malloc(\n                OPJ_VALIDATION_SIZE * sizeof(opj_procedure));\n        if (! l_validation->m_procedures)\n        {\n                opj_free(l_validation);\n                return 00;\n        }\n        memset(l_validation->m_procedures,0,OPJ_VALIDATION_SIZE * sizeof(opj_procedure));\n        return l_validation;\n}\n\nvoid  opj_procedure_list_destroy(opj_procedure_list_t * p_list)\n{\n        if (! p_list)\n        {\n                return;\n        }\n        /* initialization */\n        if (p_list->m_procedures)\n        {\n                opj_free(p_list->m_procedures);\n        }\n        opj_free(p_list);\n}\n\nOPJ_BOOL opj_procedure_list_add_procedure (opj_procedure_list_t * p_validation_list, opj_procedure p_procedure)\n{\n        if (p_validation_list->m_nb_max_procedures == p_validation_list->m_nb_procedures)\n        {\n                opj_procedure * new_procedures;\n\n                p_validation_list->m_nb_max_procedures += OPJ_VALIDATION_SIZE;\n                new_procedures = (opj_procedure*)opj_realloc(\n                        p_validation_list->m_procedures,\n                        p_validation_list->m_nb_max_procedures * sizeof(opj_procedure));\n                if (! new_procedures)\n                {\n                        opj_free(p_validation_list->m_procedures);\n                        p_validation_list->m_nb_max_procedures = 0;\n                        p_validation_list->m_nb_procedures = 0;\n                        /* opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to add a new validation procedure\\n\"); */\n                        fprintf(stderr, \"Not enough memory to add a new validation procedure\\n\");\n                        \n                        return OPJ_FALSE;\n                }\n                else\n                {\n                        p_validation_list->m_procedures = new_procedures;\n                }\n        }\n        p_validation_list->m_procedures[p_validation_list->m_nb_procedures] = p_procedure;\n        ++p_validation_list->m_nb_procedures;\n\n        return OPJ_TRUE;\n}\n\nOPJ_UINT32 opj_procedure_list_get_nb_procedures (opj_procedure_list_t * p_validation_list)\n{\n        return p_validation_list->m_nb_procedures;\n}\n\nopj_procedure* opj_procedure_list_get_first_procedure (opj_procedure_list_t * p_validation_list)\n{\n        return p_validation_list->m_procedures;\n}\n\nvoid opj_procedure_list_clear (opj_procedure_list_t * p_validation_list)\n{\n        p_validation_list->m_nb_procedures = 0;\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/function_list.h",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifndef __FUNCTION_LIST_H\n#define __FUNCTION_LIST_H\n\n/** \n * @file function_list.h\n * @brief Implementation of a list of procedures.\n\n * The functions in validation.c aims to have access to a list of procedures.\n*/\n\n/** @defgroup VAL VAL - validation procedure*/\n/*@{*/\n\n/**************************************************************************************************\n ***************************************** FORWARD DECLARATION ************************************\n **************************************************************************************************/\n\n/**\n * declare a function pointer\n */\ntypedef void (*opj_procedure)(void);\n\n/**\n * A list of procedures.\n*/\ntypedef struct opj_procedure_list \n{\n\t/**\n\t * The number of validation procedures.\n\t */\n\tOPJ_UINT32 m_nb_procedures;\n\t/**\n\t * The number of the array of validation procedures.\n\t */\n\tOPJ_UINT32 m_nb_max_procedures;\n\t/**\n\t * The array of procedures.\n\t */\n\topj_procedure * m_procedures;\n\n} opj_procedure_list_t;\n\n/* ----------------------------------------------------------------------- */\n\n/**\n * Creates a validation list.\n *\n * @return\tthe newly created validation list.\n */\nopj_procedure_list_t *  opj_procedure_list_create(void);\n\n/**\n * Destroys a validation list.\n *\n * @param p_list the list to destroy.\n */\nvoid  opj_procedure_list_destroy(opj_procedure_list_t * p_list);\n\n/**\n * Adds a new validation procedure.\n *\n * @param\tp_validation_list the list of procedure to modify.\n * @param\tp_procedure\t\tthe procedure to add.\n *\n * @return\tOPJ_TRUE if the procedure could be added.\n */\nOPJ_BOOL opj_procedure_list_add_procedure (opj_procedure_list_t * p_validation_list, opj_procedure p_procedure);\n\n/**\n * Gets the number of validation procedures.\n *\n * @param\tp_validation_list the list of procedure to modify.\n *\n * @return the number of validation procedures.\n */\nOPJ_UINT32 opj_procedure_list_get_nb_procedures (opj_procedure_list_t * p_validation_list);\n\n/**\n * Gets the pointer on the first validation procedure. This function is similar to the C++\n * iterator class to iterate through all the procedures inside the validation list.\n * the caller does not take ownership of the pointer.\n *\n * @param\tp_validation_list the list of procedure to get the first procedure from.\n *\n * @return\ta pointer to the first procedure.\n */\nopj_procedure* opj_procedure_list_get_first_procedure (opj_procedure_list_t * p_validation_list);\n\n\n/**\n * Clears the list of validation procedures.\n *\n * @param\tp_validation_list the list of procedure to clear.\n *\n */\nvoid opj_procedure_list_clear (opj_procedure_list_t * p_validation_list);\n/*@}*/\n\n#endif /* __FUNCTION_LIST_H */\n\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/image.c",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"opj_includes.h\"\n\nopj_image_t* opj_image_create0(void) {\n\topj_image_t *image = (opj_image_t*)opj_calloc(1, sizeof(opj_image_t));\n\treturn image;\n}\n\nopj_image_t* OPJ_CALLCONV opj_image_create(OPJ_UINT32 numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc) {\n\tOPJ_UINT32 compno;\n\topj_image_t *image = NULL;\n\n\timage = (opj_image_t*) opj_calloc(1, sizeof(opj_image_t));\n\tif(image) {\n\t\timage->color_space = clrspc;\n\t\timage->numcomps = numcmpts;\n\t\t/* allocate memory for the per-component information */\n\t\timage->comps = (opj_image_comp_t*)opj_calloc(1,image->numcomps * sizeof(opj_image_comp_t));\n\t\tif(!image->comps) {\n\t\t\tfprintf(stderr,\"Unable to allocate memory for image.\\n\");\n\t\t\topj_image_destroy(image);\n\t\t\treturn NULL;\n\t\t}\n\t\t/* create the individual image components */\n\t\tfor(compno = 0; compno < numcmpts; compno++) {\n\t\t\topj_image_comp_t *comp = &image->comps[compno];\n\t\t\tcomp->dx = cmptparms[compno].dx;\n\t\t\tcomp->dy = cmptparms[compno].dy;\n\t\t\tcomp->w = cmptparms[compno].w;\n\t\t\tcomp->h = cmptparms[compno].h;\n\t\t\tcomp->x0 = cmptparms[compno].x0;\n\t\t\tcomp->y0 = cmptparms[compno].y0;\n\t\t\tcomp->prec = cmptparms[compno].prec;\n\t\t\tcomp->bpp = cmptparms[compno].bpp;\n\t\t\tcomp->sgnd = cmptparms[compno].sgnd;\n\t\t\tcomp->data = (OPJ_INT32*) opj_calloc(comp->w * comp->h, sizeof(OPJ_INT32));\n\t\t\tif(!comp->data) {\n\t\t\t\tfprintf(stderr,\"Unable to allocate memory for image.\\n\");\n\t\t\t\topj_image_destroy(image);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn image;\n}\n\nvoid OPJ_CALLCONV opj_image_destroy(opj_image_t *image) {\n\tif(image) {\n\t\tif(image->comps) {\n\t\t\tOPJ_UINT32 compno;\n\n\t\t\t/* image components */\n\t\t\tfor(compno = 0; compno < image->numcomps; compno++) {\n\t\t\t\topj_image_comp_t *image_comp = &(image->comps[compno]);\n\t\t\t\tif(image_comp->data) {\n\t\t\t\t\topj_free(image_comp->data);\n\t\t\t\t}\n\t\t\t}\n\t\t\topj_free(image->comps);\n\t\t}\n\n\t\tif(image->icc_profile_buf) {\n\t\t\topj_free(image->icc_profile_buf);\n\t\t}\n\n\t\topj_free(image);\n\t}\n}\n\n/**\n * Updates the components characteristics of the image from the coding parameters.\n *\n * @param p_image_header\tthe image header to update.\n * @param p_cp\t\t\t\tthe coding parameters from which to update the image.\n */\nvoid opj_image_comp_header_update(opj_image_t * p_image_header, const struct opj_cp * p_cp)\n{\n\tOPJ_UINT32 i, l_width, l_height;\n\tOPJ_INT32 l_x0, l_y0, l_x1, l_y1;\n\tOPJ_INT32 l_comp_x0, l_comp_y0, l_comp_x1, l_comp_y1;\n\topj_image_comp_t* l_img_comp = NULL;\n\n\tl_x0 = opj_int_max((OPJ_INT32)p_cp->tx0 , (OPJ_INT32)p_image_header->x0);\n\tl_y0 = opj_int_max((OPJ_INT32)p_cp->ty0 , (OPJ_INT32)p_image_header->y0);\n\tl_x1 = opj_int_min((OPJ_INT32)(p_cp->tx0 + p_cp->tw * p_cp->tdx), (OPJ_INT32)p_image_header->x1);\n\tl_y1 = opj_int_min((OPJ_INT32)(p_cp->ty0 + p_cp->th * p_cp->tdy), (OPJ_INT32)p_image_header->y1);\n\n\tl_img_comp = p_image_header->comps;\n\tfor\t(i = 0; i < p_image_header->numcomps; ++i) {\n\t\tl_comp_x0 = opj_int_ceildiv(l_x0, (OPJ_INT32)l_img_comp->dx);\n\t\tl_comp_y0 = opj_int_ceildiv(l_y0, (OPJ_INT32)l_img_comp->dy);\n\t\tl_comp_x1 = opj_int_ceildiv(l_x1, (OPJ_INT32)l_img_comp->dx);\n\t\tl_comp_y1 = opj_int_ceildiv(l_y1, (OPJ_INT32)l_img_comp->dy);\n\t\tl_width = (OPJ_UINT32)opj_int_ceildivpow2(l_comp_x1 - l_comp_x0, (OPJ_INT32)l_img_comp->factor);\n\t\tl_height = (OPJ_UINT32)opj_int_ceildivpow2(l_comp_y1 - l_comp_y0, (OPJ_INT32)l_img_comp->factor);\n\t\tl_img_comp->w = l_width;\n\t\tl_img_comp->h = l_height;\n\t\tl_img_comp->x0 = (OPJ_UINT32)l_comp_x0/*l_x0*/;\n\t\tl_img_comp->y0 = (OPJ_UINT32)l_comp_y0/*l_y0*/;\n\t\t++l_img_comp;\n\t}\n}\n\n\n/**\n * Copy only header of image and its component header (no data are copied)\n * if dest image have data, they will be freed\n *\n * @param\tp_image_src\t\tthe src image\n * @param\tp_image_dest\tthe dest image\n *\n */\nvoid opj_copy_image_header(const opj_image_t* p_image_src, opj_image_t* p_image_dest)\n{\n\tOPJ_UINT32 compno;\n\n\t/* preconditions */\n\tassert(p_image_src != 00);\n\tassert(p_image_dest != 00);\n\n\tp_image_dest->x0 = p_image_src->x0;\n\tp_image_dest->y0 = p_image_src->y0;\n\tp_image_dest->x1 = p_image_src->x1;\n\tp_image_dest->y1 = p_image_src->y1;\n\n\tif (p_image_dest->comps){\n\t\tfor(compno = 0; compno < p_image_dest->numcomps; compno++) {\n\t\t\topj_image_comp_t *image_comp = &(p_image_dest->comps[compno]);\n\t\t\tif(image_comp->data) {\n\t\t\t\topj_free(image_comp->data);\n\t\t\t}\n\t\t}\n\t\topj_free(p_image_dest->comps);\n\t\tp_image_dest->comps = NULL;\n\t}\n\n\tp_image_dest->numcomps = p_image_src->numcomps;\n\n\tp_image_dest->comps = (opj_image_comp_t*) opj_malloc(p_image_dest->numcomps * sizeof(opj_image_comp_t));\n\tif (!p_image_dest->comps){\n\t\tp_image_dest->comps = NULL;\n\t\tp_image_dest->numcomps = 0;\n\t\treturn;\n\t}\n\n\tfor (compno=0; compno < p_image_dest->numcomps; compno++){\n\t\tmemcpy( &(p_image_dest->comps[compno]),\n\t\t\t\t&(p_image_src->comps[compno]),\n\t\t\t\tsizeof(opj_image_comp_t));\n\t\tp_image_dest->comps[compno].data = NULL;\n\t}\n\n\tp_image_dest->color_space = p_image_src->color_space;\n\tp_image_dest->icc_profile_len = p_image_src->icc_profile_len;\n\n\tif (p_image_dest->icc_profile_len) {\n\t\tp_image_dest->icc_profile_buf = (OPJ_BYTE*)opj_malloc(p_image_dest->icc_profile_len);\n\t\tif (!p_image_dest->icc_profile_buf){\n\t\t\tp_image_dest->icc_profile_buf = NULL;\n\t\t\tp_image_dest->icc_profile_len = 0;\n\t\t\treturn;\n\t\t}\n\t\tmemcpy( p_image_dest->icc_profile_buf,\n\t\t\t\tp_image_src->icc_profile_buf,\n\t\t\t\tp_image_src->icc_profile_len);\n\t\t}\n\t\telse\n\t\t\tp_image_dest->icc_profile_buf = NULL;\n\n\treturn;\n}\n\nopj_image_t* OPJ_CALLCONV opj_image_tile_create(OPJ_UINT32 numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc) {\n\tOPJ_UINT32 compno;\n\topj_image_t *image = 00;\n\n\timage = (opj_image_t*) opj_malloc(sizeof(opj_image_t));\n\tif (image)\n\t{\n\t\tmemset(image,0,sizeof(opj_image_t));\n\t\t\n\t\timage->color_space = clrspc;\n\t\timage->numcomps = numcmpts;\n\t\t\n\t\t/* allocate memory for the per-component information */\n\t\timage->comps = (opj_image_comp_t*)opj_malloc(image->numcomps * sizeof(opj_image_comp_t));\n\t\tif (!image->comps) {\n\t\t\topj_image_destroy(image);\n\t\t\treturn 00;\n\t\t}\n\t\tmemset(image->comps,0,image->numcomps * sizeof(opj_image_comp_t));\n\t\t\n\t\t/* create the individual image components */\n\t\tfor(compno = 0; compno < numcmpts; compno++) {\n\t\t\topj_image_comp_t *comp = &image->comps[compno];\n\t\t\tcomp->dx = cmptparms[compno].dx;\n\t\t\tcomp->dy = cmptparms[compno].dy;\n\t\t\tcomp->w = cmptparms[compno].w;\n\t\t\tcomp->h = cmptparms[compno].h;\n\t\t\tcomp->x0 = cmptparms[compno].x0;\n\t\t\tcomp->y0 = cmptparms[compno].y0;\n\t\t\tcomp->prec = cmptparms[compno].prec;\n\t\t\tcomp->sgnd = cmptparms[compno].sgnd;\n\t\t\tcomp->data = 0;\n\t\t}\n\t}\n\n\treturn image;\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/image.h",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef __IMAGE_H\n#define __IMAGE_H\n/**\n@file image.h\n@brief Implementation of operations on images (IMAGE)\n\nThe functions in IMAGE.C have for goal to realize operations on images.\n*/\n\nstruct opj_image;\nstruct opj_cp;\n\n/** @defgroup IMAGE IMAGE - Implementation of operations on images */\n/*@{*/\n\n/**\n * Create an empty image\n *\n * @return returns an empty image if successful, returns NULL otherwise\n */\nopj_image_t* opj_image_create0(void);\n\n\n\n/**\n * Updates the components characteristics of the image from the coding parameters.\n *\n * @param p_image_header\t\tthe image header to update.\n * @param p_cp\t\t\t\t\tthe coding parameters from which to update the image.\n */\nvoid opj_image_comp_header_update(opj_image_t * p_image, const struct opj_cp* p_cp);\n\nvoid opj_copy_image_header(const opj_image_t* p_image_src, opj_image_t* p_image_dest);\n\n/*@}*/\n\n#endif /* __IMAGE_H */\n\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/indexbox_manager.h",
    "content": "/*\n * $Id: indexbox_manager.h 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2003-2004, Yannick Verschueren\n * Copyright (c) 2010-2011, Kaori Hagihara\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/*! \\file\n *  \\brief Modification of jpip.c from 2KAN indexer\n */\n\n#ifndef  INDEXBOX_MANAGER_H_\n# define INDEXBOX_MANAGER_H_\n\n#include \"openjpeg.h\"\n#include \"j2k.h\" /* needed to use jp2.h */\n#include \"jp2.h\"\n\n#define JPIP_CIDX 0x63696478   /* Codestream index                */\n#define JPIP_CPTR 0x63707472   /* Codestream Finder Box           */\n#define JPIP_MANF 0x6d616e66   /* Manifest Box                    */\n#define JPIP_FAIX 0x66616978   /* Fragment array Index box        */\n#define JPIP_MHIX 0x6d686978   /* Main Header Index Table         */\n#define JPIP_TPIX 0x74706978   /* Tile-part Index Table box       */\n#define JPIP_THIX 0x74686978   /* Tile header Index Table box     */\n#define JPIP_PPIX 0x70706978   /* Precinct Packet Index Table box */\n#define JPIP_PHIX 0x70686978   /* Packet Header index Table       */\n#define JPIP_FIDX 0x66696478   /* File Index                      */\n#define JPIP_FPTR 0x66707472   /* File Finder                     */\n#define JPIP_PRXY 0x70727879   /* Proxy boxes                     */\n#define JPIP_IPTR 0x69707472   /* Index finder box                */\n#define JPIP_PHLD 0x70686c64   /* Place holder                    */\n\n\n/* \n * Write tile-part Index table box (superbox)\n *\n * @param[in] coff      offset of j2k codestream\n * @param[in] cstr_info codestream information\n * @param[in] j2klen    length of j2k codestream\n * @param[in] cio       file output handle\n * @return              length of tpix box\n */\nint opj_write_tpix( int coff, opj_codestream_info_t cstr_info, int j2klen, opj_stream_private_t *cio,\n              opj_event_mgr_t * p_manager );\n\n\n/* \n * Write tile header index table box (superbox)\n *\n * @param[in] coff      offset of j2k codestream\n * @param[in] cstr_info codestream information pointer\n * @param[in] cio       file output handle\n * @return              length of thix box\n */\nint opj_write_thix( int coff, opj_codestream_info_t cstr_info, opj_stream_private_t *cio, opj_event_mgr_t * p_manager );\n\n\n/* \n * Write precinct packet index table box (superbox)\n *\n * @param[in] coff      offset of j2k codestream\n * @param[in] cstr_info codestream information\n * @param[in] EPHused   true if EPH option used\n * @param[in] j2klen    length of j2k codestream\n * @param[in] cio       file output handle\n * @return              length of ppix box\n */\nint opj_write_ppix( int coff, opj_codestream_info_t cstr_info, OPJ_BOOL EPHused, int j2klen, opj_stream_private_t *cio,\n              opj_event_mgr_t * p_manager );\n\n\n/* \n * Write packet header index table box (superbox)\n *\n * @param[in] coff      offset of j2k codestream\n * @param[in] cstr_info codestream information\n * @param[in] EPHused   true if EPH option used\n * @param[in] j2klen    length of j2k codestream\n * @param[in] cio       file output handle\n * @return              length of ppix box\n */\nint opj_write_phix( int coff, opj_codestream_info_t cstr_info, OPJ_BOOL EPHused, int j2klen, opj_stream_private_t *cio,\n              opj_event_mgr_t * p_manager );\n\n/* \n * Wriet manifest box (box)\n *\n * @param[in] second number to be visited\n * @param[in] v      number of boxes\n * @param[in] box    box to be manifested\n * @param[in] cio    file output handle\n */\n\nvoid opj_write_manf(int second, \n                    int v, \n                    opj_jp2_box_t *box, \n                    opj_stream_private_t *cio,\n                    opj_event_mgr_t * p_manager );\n\n/* \n * Write main header index table (box)\n *\n * @param[in] coff offset of j2k codestream\n * @param[in] cstr_info codestream information\n * @param[in] cio  file output handle\n * @return         length of mainmhix box\n */\nint opj_write_mainmhix( int coff, opj_codestream_info_t cstr_info, opj_stream_private_t *cio,\n              opj_event_mgr_t * p_manager );\n\nint opj_write_phixfaix( int coff, int compno, opj_codestream_info_t cstr_info, OPJ_BOOL EPHused, int j2klen, opj_stream_private_t *cio,\n              opj_event_mgr_t * p_manager );\n\nint opj_write_ppixfaix( int coff, int compno, opj_codestream_info_t cstr_info, OPJ_BOOL EPHused, int j2klen, opj_stream_private_t *cio,\n              opj_event_mgr_t * p_manager );\n\nint opj_write_tilemhix( int coff, opj_codestream_info_t cstr_info, int tileno, opj_stream_private_t *cio,\n              opj_event_mgr_t * p_manager );\n\nint opj_write_tpixfaix( int coff, int compno, opj_codestream_info_t cstr_info, int j2klen, opj_stream_private_t *cio,\n              opj_event_mgr_t * p_manager );\n\n#endif      /* !INDEXBOX_MANAGER_H_ */\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/invert.c",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"opj_includes.h\"\n\n/** \n * LUP decomposition\n */\nstatic OPJ_BOOL opj_lupDecompose(OPJ_FLOAT32 * matrix,\n                                 OPJ_UINT32 * permutations, \n                                 OPJ_FLOAT32 * p_swap_area,\n                                 OPJ_UINT32 nb_compo);\n/** \n * LUP solving\n */\nstatic void opj_lupSolve(OPJ_FLOAT32 * pResult, \n                         OPJ_FLOAT32* pMatrix, \n                         OPJ_FLOAT32* pVector, \n                         OPJ_UINT32* pPermutations, \n                         OPJ_UINT32 nb_compo,\n                         OPJ_FLOAT32 * p_intermediate_data);\n\n/** \n *LUP inversion (call with the result of lupDecompose)\n */\nstatic void opj_lupInvert ( OPJ_FLOAT32 * pSrcMatrix,\n                            OPJ_FLOAT32 * pDestMatrix,\n                            OPJ_UINT32 nb_compo,\n                            OPJ_UINT32 * pPermutations,\n                            OPJ_FLOAT32 * p_src_temp,\n                            OPJ_FLOAT32 * p_dest_temp,\n                            OPJ_FLOAT32 * p_swap_area);\n\n/*\n==========================================================\n   Matric inversion interface\n==========================================================\n*/\n/**\n * Matrix inversion.\n */\nOPJ_BOOL opj_matrix_inversion_f(OPJ_FLOAT32 * pSrcMatrix,\n                                OPJ_FLOAT32 * pDestMatrix, \n                                OPJ_UINT32 nb_compo)\n{\n\tOPJ_BYTE * l_data = 00;\n\tOPJ_UINT32 l_permutation_size = nb_compo * (OPJ_UINT32)sizeof(OPJ_UINT32);\n\tOPJ_UINT32 l_swap_size = nb_compo * (OPJ_UINT32)sizeof(OPJ_FLOAT32);\n\tOPJ_UINT32 l_total_size = l_permutation_size + 3 * l_swap_size;\n\tOPJ_UINT32 * lPermutations = 00;\n\tOPJ_FLOAT32 * l_double_data = 00;\n\n\tl_data = (OPJ_BYTE *) opj_malloc(l_total_size);\n\tif (l_data == 0) {\n\t\treturn OPJ_FALSE;\n\t}\n\tlPermutations = (OPJ_UINT32 *) l_data;\n\tl_double_data = (OPJ_FLOAT32 *) (l_data + l_permutation_size);\n\tmemset(lPermutations,0,l_permutation_size);\n\n\tif(! opj_lupDecompose(pSrcMatrix,lPermutations,l_double_data,nb_compo)) {\n\t\topj_free(l_data);\n\t\treturn OPJ_FALSE;\n\t}\n\t\n    opj_lupInvert(pSrcMatrix,pDestMatrix,nb_compo,lPermutations,l_double_data,l_double_data + nb_compo,l_double_data + 2*nb_compo);\n\topj_free(l_data);\n\t\n    return OPJ_TRUE;\n}\n\n\n/*\n==========================================================\n   Local functions\n==========================================================\n*/\nOPJ_BOOL opj_lupDecompose(OPJ_FLOAT32 * matrix,OPJ_UINT32 * permutations, \n                          OPJ_FLOAT32 * p_swap_area,\n                          OPJ_UINT32 nb_compo) \n{\n\tOPJ_UINT32 * tmpPermutations = permutations;\n\tOPJ_UINT32 * dstPermutations;\n\tOPJ_UINT32 k2=0,t;\n\tOPJ_FLOAT32 temp;\n\tOPJ_UINT32 i,j,k;\n\tOPJ_FLOAT32 p;\n\tOPJ_UINT32 lLastColum = nb_compo - 1;\n\tOPJ_UINT32 lSwapSize = nb_compo * (OPJ_UINT32)sizeof(OPJ_FLOAT32);\n\tOPJ_FLOAT32 * lTmpMatrix = matrix;\n\tOPJ_FLOAT32 * lColumnMatrix,* lDestMatrix;\n\tOPJ_UINT32 offset = 1;\n\tOPJ_UINT32 lStride = nb_compo-1;\n\n\t/*initialize permutations */\n\tfor (i = 0; i < nb_compo; ++i) \n\t{\n    \t*tmpPermutations++ = i;\n\t}\n\t/* now make a pivot with colum switch */\n\ttmpPermutations = permutations;\n\tfor (k = 0; k < lLastColum; ++k) {\n\t\tp = 0.0;\n\n\t\t/* take the middle element */\n\t\tlColumnMatrix = lTmpMatrix + k;\n\t\t\n\t\t/* make permutation with the biggest value in the column */\n        for (i = k; i < nb_compo; ++i) {\n\t\t\ttemp = ((*lColumnMatrix > 0) ? *lColumnMatrix : -(*lColumnMatrix));\n     \t\tif (temp > p) {\n     \t\t\tp = temp;\n     \t\t\tk2 = i;\n     \t\t}\n\t\t\t/* next line */\n\t\t\tlColumnMatrix += nb_compo;\n     \t}\n\n     \t/* a whole rest of 0 -> non singular */\n     \tif (p == 0.0) {\n    \t\treturn OPJ_FALSE;\n\t\t}\n\n\t\t/* should we permute ? */\n\t\tif (k2 != k) {\n\t\t\t/*exchange of line */\n     \t\t/* k2 > k */\n\t\t\tdstPermutations = tmpPermutations + k2 - k;\n\t\t\t/* swap indices */\n\t\t\tt = *tmpPermutations;\n     \t\t*tmpPermutations = *dstPermutations;\n     \t\t*dstPermutations = t;\n\n\t\t\t/* and swap entire line. */\n\t\t\tlColumnMatrix = lTmpMatrix + (k2 - k) * nb_compo;\n\t\t\tmemcpy(p_swap_area,lColumnMatrix,lSwapSize);\n\t\t\tmemcpy(lColumnMatrix,lTmpMatrix,lSwapSize);\n\t\t\tmemcpy(lTmpMatrix,p_swap_area,lSwapSize);\n\t\t}\n\n\t\t/* now update data in the rest of the line and line after */\n\t\tlDestMatrix = lTmpMatrix + k;\n\t\tlColumnMatrix = lDestMatrix + nb_compo;\n\t\t/* take the middle element */\n\t\ttemp = *(lDestMatrix++);\n\n\t\t/* now compute up data (i.e. coeff up of the diagonal). */\n     \tfor (i = offset; i < nb_compo; ++i)  {\n\t\t\t/*lColumnMatrix; */\n\t\t\t/* divide the lower column elements by the diagonal value */\n\n\t\t\t/* matrix[i][k] /= matrix[k][k]; */\n     \t\t/* p = matrix[i][k] */\n\t\t\tp = *lColumnMatrix / temp;\n\t\t\t*(lColumnMatrix++) = p;\n     \t\t\n            for (j = /* k + 1 */ offset; j < nb_compo; ++j) {\n\t\t\t\t/* matrix[i][j] -= matrix[i][k] * matrix[k][j]; */\n     \t\t\t*(lColumnMatrix++) -= p * (*(lDestMatrix++));\n\t\t\t}\n\t\t\t/* come back to the k+1th element */\n\t\t\tlDestMatrix -= lStride;\n\t\t\t/* go to kth element of the next line */\n\t\t\tlColumnMatrix += k;\n     \t}\n\n\t\t/* offset is now k+2 */\n\t\t++offset;\n\t\t/* 1 element less for stride */\n\t\t--lStride;\n\t\t/* next line */\n\t\tlTmpMatrix+=nb_compo;\n\t\t/* next permutation element */\n\t\t++tmpPermutations;\n\t}\n    return OPJ_TRUE;\n}\n   \t\t\nvoid opj_lupSolve (OPJ_FLOAT32 * pResult, \n                   OPJ_FLOAT32 * pMatrix, \n                   OPJ_FLOAT32 * pVector, \n                   OPJ_UINT32* pPermutations, \n                   OPJ_UINT32 nb_compo,OPJ_FLOAT32 * p_intermediate_data) \n{\n\tOPJ_INT32 k;\n    OPJ_UINT32 i,j;\n\tOPJ_FLOAT32 sum;\n\tOPJ_FLOAT32 u;\n    OPJ_UINT32 lStride = nb_compo+1;\n\tOPJ_FLOAT32 * lCurrentPtr;\n\tOPJ_FLOAT32 * lIntermediatePtr;\n\tOPJ_FLOAT32 * lDestPtr;\n\tOPJ_FLOAT32 * lTmpMatrix;\n\tOPJ_FLOAT32 * lLineMatrix = pMatrix;\n\tOPJ_FLOAT32 * lBeginPtr = pResult + nb_compo - 1;\n\tOPJ_FLOAT32 * lGeneratedData;\n\tOPJ_UINT32 * lCurrentPermutationPtr = pPermutations;\n\n\t\n\tlIntermediatePtr = p_intermediate_data;\n\tlGeneratedData = p_intermediate_data + nb_compo - 1;\n\t\n    for (i = 0; i < nb_compo; ++i) {\n       \tsum = 0.0;\n\t\tlCurrentPtr = p_intermediate_data;\n\t\tlTmpMatrix = lLineMatrix;\n        for (j = 1; j <= i; ++j) \n\t\t{\n\t\t\t/* sum += matrix[i][j-1] * y[j-1]; */\n        \tsum += (*(lTmpMatrix++)) * (*(lCurrentPtr++));\n        }\n\t\t/*y[i] = pVector[pPermutations[i]] - sum; */\n        *(lIntermediatePtr++) = pVector[*(lCurrentPermutationPtr++)] - sum;\n\t\tlLineMatrix += nb_compo;\n\t}\n\n\t/* we take the last point of the matrix */\n\tlLineMatrix = pMatrix + nb_compo*nb_compo - 1;\n\n\t/* and we take after the last point of the destination vector */\n\tlDestPtr = pResult + nb_compo;\n\n\n    assert(nb_compo != 0);\n\tfor (k = (OPJ_INT32)nb_compo - 1; k != -1 ; --k) {\n\t\tsum = 0.0;\n\t\tlTmpMatrix = lLineMatrix;\n        u = *(lTmpMatrix++);\n\t\tlCurrentPtr = lDestPtr--;\n        for (j = (OPJ_UINT32)(k + 1); j < nb_compo; ++j) {\n\t\t\t/* sum += matrix[k][j] * x[j] */\n        \tsum += (*(lTmpMatrix++)) * (*(lCurrentPtr++));\n\t\t}\n\t\t/*x[k] = (y[k] - sum) / u; */\n        *(lBeginPtr--) = (*(lGeneratedData--) - sum) / u;\n\t\tlLineMatrix -= lStride;\n\t}\n}\n    \n\nvoid opj_lupInvert (OPJ_FLOAT32 * pSrcMatrix,\n                    OPJ_FLOAT32 * pDestMatrix,\n                    OPJ_UINT32 nb_compo,\n                    OPJ_UINT32 * pPermutations,\n                    OPJ_FLOAT32 * p_src_temp,\n                    OPJ_FLOAT32 * p_dest_temp,\n                    OPJ_FLOAT32 * p_swap_area )\n{\n\tOPJ_UINT32 j,i;\n\tOPJ_FLOAT32 * lCurrentPtr;\n\tOPJ_FLOAT32 * lLineMatrix = pDestMatrix;\n\tOPJ_UINT32 lSwapSize = nb_compo * (OPJ_UINT32)sizeof(OPJ_FLOAT32);\n\n\tfor (j = 0; j < nb_compo; ++j) {\n\t\tlCurrentPtr = lLineMatrix++;\n        memset(p_src_temp,0,lSwapSize);\n    \tp_src_temp[j] = 1.0;\n\t\topj_lupSolve(p_dest_temp,pSrcMatrix,p_src_temp, pPermutations, nb_compo , p_swap_area);\n\n\t\tfor (i = 0; i < nb_compo; ++i) {\n    \t\t*(lCurrentPtr) = p_dest_temp[i];\n\t\t\tlCurrentPtr+=nb_compo;\n    \t}\n    }\n}\n\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/invert.h",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifndef __INVERT_H\n#define __INVERT_H\n/**\n@file invert.h\n@brief Implementation of the matrix inversion\n\nThe function in INVERT.H compute a matrix inversion with a LUP method\n*/\n\n/** @defgroup INVERT INVERT - Implementation of a matrix inversion */\n/*@{*/\n/** @name Exported functions */\n/*@{*/\n/* ----------------------------------------------------------------------- */\n\n/**\n * Calculates a n x n double matrix inversion with a LUP method. Data is aligned, rows after rows (or columns after columns).\n * The function does not take ownership of any memory block, data must be fred by the user.\n *\n * @param pSrcMatrix\tthe matrix to invert.\n * @param pDestMatrix\tdata to store the inverted matrix. \n * @param n size of the matrix\n * @return OPJ_TRUE if the inversion is successful, OPJ_FALSE if the matrix is singular.\n */\nOPJ_BOOL opj_matrix_inversion_f(OPJ_FLOAT32 * pSrcMatrix,\n                                OPJ_FLOAT32 * pDestMatrix, \n                                OPJ_UINT32 nb_compo);\n/* ----------------------------------------------------------------------- */\n/*@}*/\n\n/*@}*/\n\n#endif /* __INVERT_H */ \n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/j2k.c",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2001-2003, David Janssens\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>\n * Copyright (c) 2006-2007, Parvatha Elangovan\n * Copyright (c) 2010-2011, Kaori Hagihara\n * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France \n * Copyright (c) 2012, CS Systemes d'Information, France\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"opj_includes.h\"\n\n#define CINEMA_24_CS 1302083\t/*Codestream length for 24fps*/\n#define CINEMA_48_CS 651041\t\t/*Codestream length for 48fps*/\n#define COMP_24_CS 1041666\t\t/*Maximum size per color component for 2K & 4K @ 24fps*/\n#define COMP_48_CS 520833\t\t/*Maximum size per color component for 2K @ 48fps*/\n\n/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */\n/*@{*/\n\n/** @name Local static functions */\n/*@{*/\n\n/**\n * Sets up the procedures to do on reading header. Developpers wanting to extend the library can add their own reading procedures.\n */\nstatic void opj_j2k_setup_header_reading (opj_j2k_t *p_j2k);\n\n/**\n * The read header procedure.\n */\nstatic OPJ_BOOL opj_j2k_read_header_procedure(  opj_j2k_t *p_j2k,\n                                                opj_stream_private_t *p_stream,\n                                                opj_event_mgr_t * p_manager);\n\n/**\n * The default encoding validation procedure without any extension.\n *\n * @param       p_j2k                   the jpeg2000 codec to validate.\n * @param       p_stream                the input stream to validate.\n * @param       p_manager               the user event manager.\n *\n * @return true if the parameters are correct.\n */\nstatic OPJ_BOOL opj_j2k_encoding_validation (   opj_j2k_t * p_j2k,\n                                                opj_stream_private_t *p_stream,\n                                                opj_event_mgr_t * p_manager );\n\n/**\n * The default decoding validation procedure without any extension.\n *\n * @param       p_j2k                   the jpeg2000 codec to validate.\n * @param       p_stream                                the input stream to validate.\n * @param       p_manager               the user event manager.\n *\n * @return true if the parameters are correct.\n */\nstatic OPJ_BOOL opj_j2k_decoding_validation (   opj_j2k_t * p_j2k,\n                                                opj_stream_private_t *p_stream,\n                                                opj_event_mgr_t * p_manager );\n\n/**\n * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters\n * are valid. Developpers wanting to extend the library can add their own validation procedures.\n */\nstatic void opj_j2k_setup_encoding_validation (opj_j2k_t *p_j2k);\n\n/**\n * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters\n * are valid. Developpers wanting to extend the library can add their own validation procedures.\n */\nstatic void opj_j2k_setup_decoding_validation (opj_j2k_t *p_j2k);\n\n/**\n * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters\n * are valid. Developpers wanting to extend the library can add their own validation procedures.\n */\nstatic void opj_j2k_setup_end_compress (opj_j2k_t *p_j2k);\n\n/**\n * The mct encoding validation procedure.\n *\n * @param       p_j2k                   the jpeg2000 codec to validate.\n * @param       p_stream                                the input stream to validate.\n * @param       p_manager               the user event manager.\n *\n * @return true if the parameters are correct.\n */\nstatic OPJ_BOOL opj_j2k_mct_validation (opj_j2k_t * p_j2k,\n                                        opj_stream_private_t *p_stream,\n                                        opj_event_mgr_t * p_manager );\n\n/**\n * Builds the tcd decoder to use to decode tile.\n */\nstatic OPJ_BOOL opj_j2k_build_decoder ( opj_j2k_t * p_j2k,\n                                        opj_stream_private_t *p_stream,\n                                        opj_event_mgr_t * p_manager );\n/**\n * Builds the tcd encoder to use to encode tile.\n */\nstatic OPJ_BOOL opj_j2k_build_encoder ( opj_j2k_t * p_j2k,\n                                        opj_stream_private_t *p_stream,\n                                        opj_event_mgr_t * p_manager );\n\n/**\n * Creates a tile-coder decoder.\n *\n * @param       p_stream                        the stream to write data to.\n * @param       p_j2k                           J2K codec.\n * @param       p_manager                   the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_create_tcd(     opj_j2k_t *p_j2k,\n                                                                    opj_stream_private_t *p_stream,\n                                                                    opj_event_mgr_t * p_manager );\n\n/**\n * Excutes the given procedures on the given codec.\n *\n * @param       p_procedure_list        the list of procedures to execute\n * @param       p_j2k                           the jpeg2000 codec to execute the procedures on.\n * @param       p_stream                        the stream to execute the procedures on.\n * @param       p_manager                       the user manager.\n *\n * @return      true                            if all the procedures were successfully executed.\n */\nstatic OPJ_BOOL opj_j2k_exec (  opj_j2k_t * p_j2k,\n                            opj_procedure_list_t * p_procedure_list,\n                            opj_stream_private_t *p_stream,\n                            opj_event_mgr_t * p_manager);\n\n/**\n * Updates the rates of the tcp.\n *\n * @param       p_stream                                the stream to write data to.\n * @param       p_j2k                           J2K codec.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_update_rates(   opj_j2k_t *p_j2k,\n                                                                            opj_stream_private_t *p_stream,\n                                                                            opj_event_mgr_t * p_manager );\n\n/**\n * Copies the decoding tile parameters onto all the tile parameters.\n * Creates also the tile decoder.\n */\nstatic OPJ_BOOL opj_j2k_copy_default_tcp_and_create_tcd (       opj_j2k_t * p_j2k,\n                                                            opj_stream_private_t *p_stream,\n                                                            opj_event_mgr_t * p_manager );\n\n/**\n * Destroys the memory associated with the decoding of headers.\n */\nstatic OPJ_BOOL opj_j2k_destroy_header_memory ( opj_j2k_t * p_j2k,\n                                                opj_stream_private_t *p_stream,\n                                                opj_event_mgr_t * p_manager );\n\n/**\n * Reads the lookup table containing all the marker, status and action, and returns the handler associated\n * with the marker value.\n * @param       p_id            Marker value to look up\n *\n * @return      the handler associated with the id.\n*/\nstatic const struct opj_dec_memory_marker_handler * opj_j2k_get_marker_handler (OPJ_UINT32 p_id);\n\n/**\n * Destroys a tile coding parameter structure.\n *\n * @param       p_tcp           the tile coding parameter to destroy.\n */\nstatic void opj_j2k_tcp_destroy (opj_tcp_t *p_tcp);\n\n/**\n * Destroys the data inside a tile coding parameter structure.\n *\n * @param       p_tcp           the tile coding parameter which contain data to destroy.\n */\nstatic void opj_j2k_tcp_data_destroy (opj_tcp_t *p_tcp);\n\n/**\n * Destroys a coding parameter structure.\n *\n * @param       p_cp            the coding parameter to destroy.\n */\nstatic void opj_j2k_cp_destroy (opj_cp_t *p_cp);\n\n/**\n * Writes a SPCod or SPCoc element, i.e. the coding style of a given component of a tile.\n *\n * @param       p_j2k           J2K codec.\n * @param       p_tile_no       FIXME DOC\n * @param       p_comp_no       the component number to output.\n * @param       p_data          FIXME DOC\n * @param       p_header_size   FIXME DOC\n * @param       p_manager       the user event manager.\n *\n * @return FIXME DOC\n*/\nstatic OPJ_BOOL opj_j2k_write_SPCod_SPCoc(      opj_j2k_t *p_j2k,\n                                                                                    OPJ_UINT32 p_tile_no,\n                                                                                    OPJ_UINT32 p_comp_no,\n                                                                                    OPJ_BYTE * p_data,\n                                                                                    OPJ_UINT32 * p_header_size,\n                                                                                    opj_event_mgr_t * p_manager );\n\n/**\n * Gets the size taken by writing a SPCod or SPCoc for the given tile and component.\n *\n * @param       p_j2k                   the J2K codec.\n * @param       p_tile_no               the tile index.\n * @param       p_comp_no               the component being outputted.\n *\n * @return      the number of bytes taken by the SPCod element.\n */\nstatic OPJ_UINT32 opj_j2k_get_SPCod_SPCoc_size (opj_j2k_t *p_j2k,\n                                                                                            OPJ_UINT32 p_tile_no,\n                                                                                            OPJ_UINT32 p_comp_no );\n\n/**\n * Reads a SPCod or SPCoc element, i.e. the coding style of a given component of a tile.\n * @param       p_j2k           the jpeg2000 codec.\n * @param       compno          FIXME DOC\n * @param       p_header_data   the data contained in the COM box.\n * @param       p_header_size   the size of the data contained in the COM marker.\n * @param       p_manager       the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_SPCod_SPCoc(   opj_j2k_t *p_j2k,\n                                            OPJ_UINT32 compno,\n                                            OPJ_BYTE * p_header_data,\n                                            OPJ_UINT32 * p_header_size,\n                                            opj_event_mgr_t * p_manager );\n\n/**\n * Gets the size taken by writing SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.\n *\n * @param       p_tile_no               the tile index.\n * @param       p_comp_no               the component being outputted.\n * @param       p_j2k                   the J2K codec.\n *\n * @return      the number of bytes taken by the SPCod element.\n */\nstatic OPJ_UINT32 opj_j2k_get_SQcd_SQcc_size (  opj_j2k_t *p_j2k,\n                                                                                    OPJ_UINT32 p_tile_no,\n                                                                                    OPJ_UINT32 p_comp_no );\n\n/**\n * Writes a SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.\n *\n * @param       p_tile_no               the tile to output.\n * @param       p_comp_no               the component number to output.\n * @param       p_data                  the data buffer.\n * @param       p_header_size   pointer to the size of the data buffer, it is changed by the function.\n * @param       p_j2k                   J2K codec.\n * @param       p_manager               the user event manager.\n *\n*/\nstatic OPJ_BOOL opj_j2k_write_SQcd_SQcc(opj_j2k_t *p_j2k,\n                                                                            OPJ_UINT32 p_tile_no,\n                                                                            OPJ_UINT32 p_comp_no,\n                                                                            OPJ_BYTE * p_data,\n                                                                            OPJ_UINT32 * p_header_size,\n                                                                            opj_event_mgr_t * p_manager);\n\n/**\n * Updates the Tile Length Marker.\n */\nstatic void opj_j2k_update_tlm ( opj_j2k_t * p_j2k, OPJ_UINT32 p_tile_part_size);\n\n/**\n * Reads a SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.\n *\n * @param       p_j2k           J2K codec.\n * @param       compno          the component number to output.\n * @param       p_header_data   the data buffer.\n * @param       p_header_size   pointer to the size of the data buffer, it is changed by the function.\n * @param       p_manager       the user event manager.\n *\n*/\nstatic OPJ_BOOL opj_j2k_read_SQcd_SQcc( opj_j2k_t *p_j2k,\n                                        OPJ_UINT32 compno,\n                                        OPJ_BYTE * p_header_data,\n                                        OPJ_UINT32 * p_header_size,\n                                        opj_event_mgr_t * p_manager );\n\n/**\n * Copies the tile component parameters of all the component from the first tile component.\n *\n * @param               p_j2k           the J2k codec.\n */\nstatic void opj_j2k_copy_tile_component_parameters( opj_j2k_t *p_j2k );\n\n/**\n * Copies the tile quantization parameters of all the component from the first tile component.\n *\n * @param               p_j2k           the J2k codec.\n */\nstatic void opj_j2k_copy_tile_quantization_parameters( opj_j2k_t *p_j2k );\n\n/**\n * Reads the tiles.\n */\nstatic OPJ_BOOL opj_j2k_decode_tiles (  opj_j2k_t *p_j2k,\n                                        opj_stream_private_t *p_stream,\n                                        opj_event_mgr_t * p_manager);\n\nstatic OPJ_BOOL opj_j2k_pre_write_tile ( opj_j2k_t * p_j2k,\n                                                                             OPJ_UINT32 p_tile_index,\n                                                                             opj_stream_private_t *p_stream,\n                                                                             opj_event_mgr_t * p_manager );\n\nstatic OPJ_BOOL opj_j2k_update_image_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data, opj_image_t* p_output_image);\n\nstatic void opj_j2k_get_tile_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data);\n\nstatic OPJ_BOOL opj_j2k_post_write_tile (opj_j2k_t * p_j2k,\n                                                                             OPJ_BYTE * p_data,\n                                                                             OPJ_UINT32 p_data_size,\n                                                                             opj_stream_private_t *p_stream,\n                                                                             opj_event_mgr_t * p_manager );\n\n/**\n * Sets up the procedures to do on writing header.\n * Developers wanting to extend the library can add their own writing procedures.\n */\nstatic void opj_j2k_setup_header_writing (opj_j2k_t *p_j2k);\n\nstatic OPJ_BOOL opj_j2k_write_first_tile_part(  opj_j2k_t *p_j2k,\n                                                                                            OPJ_BYTE * p_data,\n                                                                                            OPJ_UINT32 * p_data_written,\n                                                                                            OPJ_UINT32 p_total_data_size,\n                                                                                            opj_stream_private_t *p_stream,\n                                                                                            struct opj_event_mgr * p_manager );\n\nstatic OPJ_BOOL opj_j2k_write_all_tile_parts(   opj_j2k_t *p_j2k,\n                                                                                            OPJ_BYTE * p_data,\n                                                                                            OPJ_UINT32 * p_data_written,\n                                                                                            OPJ_UINT32 p_total_data_size,\n                                                                                            opj_stream_private_t *p_stream,\n                                                                                            struct opj_event_mgr * p_manager );\n\n/**\n * Gets the offset of the header.\n *\n * @param       p_stream                the stream to write data to.\n * @param       p_j2k                   J2K codec.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_get_end_header( opj_j2k_t *p_j2k,\n                                        opj_stream_private_t *p_stream,\n                                        opj_event_mgr_t * p_manager );\n\nstatic OPJ_BOOL opj_j2k_allocate_tile_element_cstr_index(opj_j2k_t *p_j2k);\n\n/*\n * -----------------------------------------------------------------------\n * -----------------------------------------------------------------------\n * -----------------------------------------------------------------------\n */\n\n/**\n * Writes the SOC marker (Start Of Codestream)\n *\n * @param       p_stream                        the stream to write data to.\n * @param       p_j2k                   J2K codec.\n * @param       p_manager       the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_write_soc(      opj_j2k_t *p_j2k,\n                                                        opj_stream_private_t *p_stream,\n                                                            opj_event_mgr_t * p_manager );\n\n/**\n * Reads a SOC marker (Start of Codestream)\n * @param       p_j2k           the jpeg2000 file codec.\n * @param       p_stream        XXX needs data\n * @param       p_manager       the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_soc(   opj_j2k_t *p_j2k,\n                                    opj_stream_private_t *p_stream,\n                                    opj_event_mgr_t * p_manager );\n\n/**\n * Writes the SIZ marker (image and tile size)\n *\n * @param       p_j2k           J2K codec.\n * @param       p_stream        the stream to write data to.\n * @param       p_manager       the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_write_siz(      opj_j2k_t *p_j2k,\n                                                                opj_stream_private_t *p_stream,\n                                                                opj_event_mgr_t * p_manager );\n\n/**\n * Reads a SIZ marker (image and tile size)\n * @param       p_j2k           the jpeg2000 file codec.\n * @param       p_header_data   the data contained in the SIZ box.\n * @param       p_header_size   the size of the data contained in the SIZ marker.\n * @param       p_manager       the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_siz(opj_j2k_t *p_j2k,\n                                 OPJ_BYTE * p_header_data,\n                                 OPJ_UINT32 p_header_size,\n                                 opj_event_mgr_t * p_manager);\n\n/**\n * Writes the COM marker (comment)\n *\n * @param       p_stream                        the stream to write data to.\n * @param       p_j2k                   J2K codec.\n * @param       p_manager       the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_write_com(      opj_j2k_t *p_j2k,\n                                                                        opj_stream_private_t *p_stream,\n                                                                        opj_event_mgr_t * p_manager );\n\n/**\n * Reads a COM marker (comments)\n * @param       p_j2k           the jpeg2000 file codec.\n * @param       p_header_data   the data contained in the COM box.\n * @param       p_header_size   the size of the data contained in the COM marker.\n * @param       p_manager       the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_com (  opj_j2k_t *p_j2k,\n                                    OPJ_BYTE * p_header_data,\n                                    OPJ_UINT32 p_header_size,\n                                    opj_event_mgr_t * p_manager );\n/**\n * Writes the COD marker (Coding style default)\n *\n * @param       p_stream                        the stream to write data to.\n * @param       p_j2k                   J2K codec.\n * @param       p_manager       the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_write_cod(      opj_j2k_t *p_j2k,\n                                                                        opj_stream_private_t *p_stream,\n                                                                        opj_event_mgr_t * p_manager );\n\n/**\n * Reads a COD marker (Coding Styke defaults)\n * @param       p_header_data   the data contained in the COD box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the COD marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_cod (  opj_j2k_t *p_j2k,\n                                    OPJ_BYTE * p_header_data,\n                                    OPJ_UINT32 p_header_size,\n                                    opj_event_mgr_t * p_manager);\n\n#if 0\n/**\n * Writes the COC marker (Coding style component)\n *\n * @param       p_j2k       J2K codec.\n * @param       p_comp_no   the index of the component to output.\n * @param       p_stream    the stream to write data to.\n * @param       p_manager   the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_write_coc(  opj_j2k_t *p_j2k,\n                                                                OPJ_UINT32 p_comp_no,\n                                                                opj_stream_private_t *p_stream,\n                                                                opj_event_mgr_t * p_manager );\n#endif\n\n#if 0\n/**\n * Writes the COC marker (Coding style component)\n *\n * @param       p_j2k                   J2K codec.\n * @param       p_comp_no               the index of the component to output.\n * @param       p_data          FIXME DOC\n * @param       p_data_written  FIXME DOC\n * @param       p_manager               the user event manager.\n*/\nstatic void opj_j2k_write_coc_in_memory(opj_j2k_t *p_j2k,\n                                                                            OPJ_UINT32 p_comp_no,\n                                                                            OPJ_BYTE * p_data,\n                                                                            OPJ_UINT32 * p_data_written,\n                                                                            opj_event_mgr_t * p_manager );\n#endif\n\n/**\n * Gets the maximum size taken by a coc.\n *\n * @param       p_j2k   the jpeg2000 codec to use.\n */\nstatic OPJ_UINT32 opj_j2k_get_max_coc_size(opj_j2k_t *p_j2k);\n\n/**\n * Reads a COC marker (Coding Style Component)\n * @param       p_header_data   the data contained in the COC box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the COC marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_coc (  opj_j2k_t *p_j2k,\n                                    OPJ_BYTE * p_header_data,\n                                    OPJ_UINT32 p_header_size,\n                                    opj_event_mgr_t * p_manager );\n\n/**\n * Writes the QCD marker (quantization default)\n *\n * @param       p_j2k                   J2K codec.\n * @param       p_stream                the stream to write data to.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_write_qcd(      opj_j2k_t *p_j2k,\n                                                                        opj_stream_private_t *p_stream,\n                                                                        opj_event_mgr_t * p_manager );\n\n/**\n * Reads a QCD marker (Quantization defaults)\n * @param       p_header_data   the data contained in the QCD box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the QCD marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_qcd (  opj_j2k_t *p_j2k,\n                                    OPJ_BYTE * p_header_data,\n                                    OPJ_UINT32 p_header_size,\n                                    opj_event_mgr_t * p_manager );\n#if 0\n/**\n * Writes the QCC marker (quantization component)\n *\n * @param       p_comp_no       the index of the component to output.\n * @param       p_stream                the stream to write data to.\n * @param       p_j2k                   J2K codec.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_write_qcc(      opj_j2k_t *p_j2k,\n                                                                        OPJ_UINT32 p_comp_no,\n                                                                        opj_stream_private_t *p_stream,\n                                                                        opj_event_mgr_t * p_manager );\n#endif\n\n#if 0\n/**\n * Writes the QCC marker (quantization component)\n *\n * @param       p_j2k           J2K codec.\n * @param       p_comp_no       the index of the component to output.\n * @param       p_data          FIXME DOC\n * @param       p_data_written  the stream to write data to.\n * @param       p_manager       the user event manager.\n*/\nstatic void opj_j2k_write_qcc_in_memory(opj_j2k_t *p_j2k,\n                                                                            OPJ_UINT32 p_comp_no,\n                                                                            OPJ_BYTE * p_data,\n                                                                            OPJ_UINT32 * p_data_written,\n                                                                            opj_event_mgr_t * p_manager );\n#endif\n\n/**\n * Gets the maximum size taken by a qcc.\n */\nstatic OPJ_UINT32 opj_j2k_get_max_qcc_size (opj_j2k_t *p_j2k);\n\n/**\n * Reads a QCC marker (Quantization component)\n * @param       p_header_data   the data contained in the QCC box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the QCC marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_qcc(   opj_j2k_t *p_j2k,\n                                    OPJ_BYTE * p_header_data,\n                                    OPJ_UINT32 p_header_size,\n                                    opj_event_mgr_t * p_manager);\n/**\n * Writes the POC marker (Progression Order Change)\n *\n * @param       p_stream                                the stream to write data to.\n * @param       p_j2k                           J2K codec.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_write_poc(      opj_j2k_t *p_j2k,\n                                                                        opj_stream_private_t *p_stream,\n                                                                        opj_event_mgr_t * p_manager );\n/**\n * Writes the POC marker (Progression Order Change)\n *\n * @param       p_j2k          J2K codec.\n * @param       p_data         FIXME DOC\n * @param       p_data_written the stream to write data to.\n * @param       p_manager      the user event manager.\n */\nstatic void opj_j2k_write_poc_in_memory(opj_j2k_t *p_j2k,\n                                                                            OPJ_BYTE * p_data,\n                                                                            OPJ_UINT32 * p_data_written,\n                                                                            opj_event_mgr_t * p_manager );\n/**\n * Gets the maximum size taken by the writing of a POC.\n */\nstatic OPJ_UINT32 opj_j2k_get_max_poc_size(opj_j2k_t *p_j2k);\n\n/**\n * Reads a POC marker (Progression Order Change)\n *\n * @param       p_header_data   the data contained in the POC box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the POC marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_poc (  opj_j2k_t *p_j2k,\n                                    OPJ_BYTE * p_header_data,\n                                    OPJ_UINT32 p_header_size,\n                                    opj_event_mgr_t * p_manager );\n\n/**\n * Gets the maximum size taken by the toc headers of all the tile parts of any given tile.\n */\nstatic OPJ_UINT32 opj_j2k_get_max_toc_size (opj_j2k_t *p_j2k);\n\n/**\n * Gets the maximum size taken by the headers of the SOT.\n *\n * @param       p_j2k   the jpeg2000 codec to use.\n */\nstatic OPJ_UINT32 opj_j2k_get_specific_header_sizes(opj_j2k_t *p_j2k);\n\n/**\n * Reads a CRG marker (Component registration)\n *\n * @param       p_header_data   the data contained in the TLM box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the TLM marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_crg (  opj_j2k_t *p_j2k,\n                                    OPJ_BYTE * p_header_data,\n                                    OPJ_UINT32 p_header_size,\n                                    opj_event_mgr_t * p_manager );\n/**\n * Reads a TLM marker (Tile Length Marker)\n *\n * @param       p_header_data   the data contained in the TLM box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the TLM marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_tlm (  opj_j2k_t *p_j2k,\n                                    OPJ_BYTE * p_header_data,\n                                    OPJ_UINT32 p_header_size,\n                                    opj_event_mgr_t * p_manager);\n\n/**\n * Writes the updated tlm.\n *\n * @param       p_stream                the stream to write data to.\n * @param       p_j2k                   J2K codec.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_write_updated_tlm(      opj_j2k_t *p_j2k,\n                                            opj_stream_private_t *p_stream,\n                                            opj_event_mgr_t * p_manager );\n\n/**\n * Reads a PLM marker (Packet length, main header marker)\n *\n * @param       p_header_data   the data contained in the TLM box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the TLM marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_plm (  opj_j2k_t *p_j2k,\n                                    OPJ_BYTE * p_header_data,\n                                    OPJ_UINT32 p_header_size,\n                                    opj_event_mgr_t * p_manager);\n/**\n * Reads a PLT marker (Packet length, tile-part header)\n *\n * @param       p_header_data   the data contained in the PLT box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the PLT marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_plt (  opj_j2k_t *p_j2k,\n                                    OPJ_BYTE * p_header_data,\n                                    OPJ_UINT32 p_header_size,\n                                    opj_event_mgr_t * p_manager );\n\n#if 0\n/**\n * Reads a PPM marker (Packed packet headers, main header)\n *\n * @param       p_header_data   the data contained in the POC box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the POC marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL j2k_read_ppm_v2 (\n                                                opj_j2k_t *p_j2k,\n                                                OPJ_BYTE * p_header_data,\n                                                OPJ_UINT32 p_header_size,\n                                                struct opj_event_mgr * p_manager\n                                        );\n#endif\n\nstatic OPJ_BOOL j2k_read_ppm_v3 (\n                                                opj_j2k_t *p_j2k,\n                                                OPJ_BYTE * p_header_data,\n                                                OPJ_UINT32 p_header_size,\n                                                opj_event_mgr_t * p_manager );\n\n/**\n * Reads a PPT marker (Packed packet headers, tile-part header)\n *\n * @param       p_header_data   the data contained in the PPT box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the PPT marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_ppt (  opj_j2k_t *p_j2k,\n                                    OPJ_BYTE * p_header_data,\n                                    OPJ_UINT32 p_header_size,\n                                    opj_event_mgr_t * p_manager );\n/**\n * Writes the TLM marker (Tile Length Marker)\n *\n * @param       p_stream                                the stream to write data to.\n * @param       p_j2k                           J2K codec.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_write_tlm(      opj_j2k_t *p_j2k,\n                                                                        opj_stream_private_t *p_stream,\n                                                                        opj_event_mgr_t * p_manager );\n\n/**\n * Writes the SOT marker (Start of tile-part)\n *\n * @param       p_j2k            J2K codec.\n * @param       p_data           FIXME DOC\n * @param       p_data_written   FIXME DOC\n * @param       p_stream         the stream to write data to.\n * @param       p_manager        the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_write_sot(      opj_j2k_t *p_j2k,\n                                                                        OPJ_BYTE * p_data,\n                                                                        OPJ_UINT32 * p_data_written,\n                                                                        const opj_stream_private_t *p_stream,\n                                                                        opj_event_mgr_t * p_manager );\n\n/**\n * Reads a PPT marker (Packed packet headers, tile-part header)\n *\n * @param       p_header_data   the data contained in the PPT box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the PPT marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_sot (  opj_j2k_t *p_j2k,\n                                    OPJ_BYTE * p_header_data,\n                                    OPJ_UINT32 p_header_size,\n                                    opj_event_mgr_t * p_manager );\n/**\n * Writes the SOD marker (Start of data)\n *\n * @param       p_j2k               J2K codec.\n * @param       p_tile_coder        FIXME DOC\n * @param       p_data              FIXME DOC\n * @param       p_data_written      FIXME DOC\n * @param       p_total_data_size   FIXME DOC\n * @param       p_stream            the stream to write data to.\n * @param       p_manager           the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_write_sod(      opj_j2k_t *p_j2k,\n                                                                        opj_tcd_t * p_tile_coder,\n                                                                        OPJ_BYTE * p_data,\n                                                                        OPJ_UINT32 * p_data_written,\n                                                                        OPJ_UINT32 p_total_data_size,\n                                                                        const opj_stream_private_t *p_stream,\n                                                                        opj_event_mgr_t * p_manager );\n\n/**\n * Reads a SOD marker (Start Of Data)\n *\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_stream                FIXME DOC\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_sod(   opj_j2k_t *p_j2k,\n                                    opj_stream_private_t *p_stream,\n                                    opj_event_mgr_t * p_manager );\n\nvoid opj_j2k_update_tlm (opj_j2k_t * p_j2k, OPJ_UINT32 p_tile_part_size )\n{\n        opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,p_j2k->m_current_tile_number,1);            /* PSOT */\n        ++p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current;\n\n        opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,p_tile_part_size,4);                                        /* PSOT */\n        p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current += 4;\n}\n\n/**\n * Writes the RGN marker (Region Of Interest)\n *\n * @param       p_tile_no               the tile to output\n * @param       p_comp_no               the component to output\n * @param       nb_comps                the number of components\n * @param       p_stream                the stream to write data to.\n * @param       p_j2k                   J2K codec.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_write_rgn(  opj_j2k_t *p_j2k,\n                                    OPJ_UINT32 p_tile_no,\n                                    OPJ_UINT32 p_comp_no,\n                                    OPJ_UINT32 nb_comps,\n                                    opj_stream_private_t *p_stream,\n                                    opj_event_mgr_t * p_manager );\n\n/**\n * Reads a RGN marker (Region Of Interest)\n *\n * @param       p_header_data   the data contained in the POC box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the POC marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_rgn (opj_j2k_t *p_j2k,\n                                  OPJ_BYTE * p_header_data,\n                                  OPJ_UINT32 p_header_size,\n                                  opj_event_mgr_t * p_manager );\n\n/**\n * Writes the EOC marker (End of Codestream)\n *\n * @param       p_stream                the stream to write data to.\n * @param       p_j2k                   J2K codec.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_write_eoc(      opj_j2k_t *p_j2k,\n                                    opj_stream_private_t *p_stream,\n                                    opj_event_mgr_t * p_manager );\n\n#if 0\n/**\n * Reads a EOC marker (End Of Codestream)\n *\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_stream                FIXME DOC\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_eoc (      opj_j2k_t *p_j2k,\n                                                                opj_stream_private_t *p_stream,\n                                                                opj_event_mgr_t * p_manager );\n#endif\n\n/**\n * Writes the CBD-MCT-MCC-MCO markers (Multi components transform)\n *\n * @param       p_stream                        the stream to write data to.\n * @param       p_j2k                   J2K codec.\n * @param       p_manager       the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_write_mct_data_group(   opj_j2k_t *p_j2k,\n                                                opj_stream_private_t *p_stream,\n                                                opj_event_mgr_t * p_manager );\n\n/**\n * Inits the Info\n *\n * @param       p_stream                the stream to write data to.\n * @param       p_j2k                   J2K codec.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_init_info(      opj_j2k_t *p_j2k,\n                                    opj_stream_private_t *p_stream,\n                                    opj_event_mgr_t * p_manager );\n\n/**\nAdd main header marker information\n@param cstr_index    Codestream information structure\n@param type         marker type\n@param pos          byte offset of marker segment\n@param len          length of marker segment\n */\nstatic OPJ_BOOL opj_j2k_add_mhmarker(opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len) ;\n/**\nAdd tile header marker information\n@param tileno       tile index number\n@param cstr_index   Codestream information structure\n@param type         marker type\n@param pos          byte offset of marker segment\n@param len          length of marker segment\n */\nstatic OPJ_BOOL opj_j2k_add_tlmarker(OPJ_UINT32 tileno, opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len);\n\n/**\n * Reads an unknown marker\n *\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_stream                the stream object to read from.\n * @param       output_marker           FIXME DOC\n * @param       p_manager               the user event manager.\n *\n * @return      true                    if the marker could be deduced.\n*/\nstatic OPJ_BOOL opj_j2k_read_unk( opj_j2k_t *p_j2k,\n                                  opj_stream_private_t *p_stream,\n                                  OPJ_UINT32 *output_marker,\n                                  opj_event_mgr_t * p_manager );\n\n/**\n * Writes the MCT marker (Multiple Component Transform)\n *\n * @param       p_j2k           J2K codec.\n * @param       p_mct_record    FIXME DOC\n * @param       p_stream        the stream to write data to.\n * @param       p_manager       the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_write_mct_record(       opj_j2k_t *p_j2k,\n                                                                                    opj_mct_data_t * p_mct_record,\n                                            opj_stream_private_t *p_stream,\n                                            opj_event_mgr_t * p_manager );\n\n/**\n * Reads a MCT marker (Multiple Component Transform)\n *\n * @param       p_header_data   the data contained in the MCT box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the MCT marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_mct (      opj_j2k_t *p_j2k,\n                                                                    OPJ_BYTE * p_header_data,\n                                                                    OPJ_UINT32 p_header_size,\n                                                                    opj_event_mgr_t * p_manager );\n\n/**\n * Writes the MCC marker (Multiple Component Collection)\n *\n * @param       p_j2k                   J2K codec.\n * @param       p_mcc_record            FIXME DOC\n * @param       p_stream                the stream to write data to.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_write_mcc_record(   opj_j2k_t *p_j2k,\n                                            opj_simple_mcc_decorrelation_data_t * p_mcc_record,\n                                            opj_stream_private_t *p_stream,\n                                            opj_event_mgr_t * p_manager );\n\n/**\n * Reads a MCC marker (Multiple Component Collection)\n *\n * @param       p_header_data   the data contained in the MCC box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the MCC marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_mcc (      opj_j2k_t *p_j2k,\n                                                                    OPJ_BYTE * p_header_data,\n                                                                    OPJ_UINT32 p_header_size,\n                                                                    opj_event_mgr_t * p_manager );\n\n/**\n * Writes the MCO marker (Multiple component transformation ordering)\n *\n * @param       p_stream                                the stream to write data to.\n * @param       p_j2k                           J2K codec.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_write_mco(      opj_j2k_t *p_j2k,\n                                    opj_stream_private_t *p_stream,\n                                    opj_event_mgr_t * p_manager );\n\n/**\n * Reads a MCO marker (Multiple Component Transform Ordering)\n *\n * @param       p_header_data   the data contained in the MCO box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the MCO marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_mco (      opj_j2k_t *p_j2k,\n                                                                    OPJ_BYTE * p_header_data,\n                                                                    OPJ_UINT32 p_header_size,\n                                                                    opj_event_mgr_t * p_manager );\n\nstatic OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image, OPJ_UINT32 p_index);\n\nstatic void  opj_j2k_read_int16_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);\nstatic void  opj_j2k_read_int32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);\nstatic void  opj_j2k_read_float32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);\nstatic void  opj_j2k_read_float64_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);\n\nstatic void  opj_j2k_read_int16_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);\nstatic void  opj_j2k_read_int32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);\nstatic void  opj_j2k_read_float32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);\nstatic void  opj_j2k_read_float64_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);\n\nstatic void  opj_j2k_write_float_to_int16 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);\nstatic void  opj_j2k_write_float_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);\nstatic void  opj_j2k_write_float_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);\nstatic void  opj_j2k_write_float_to_float64 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);\n\n/**\n * Ends the encoding, i.e. frees memory.\n *\n * @param       p_stream                the stream to write data to.\n * @param       p_j2k                   J2K codec.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_end_encoding(   opj_j2k_t *p_j2k,\n                                                                            opj_stream_private_t *p_stream,\n                                                                            opj_event_mgr_t * p_manager );\n\n/**\n * Writes the CBD marker (Component bit depth definition)\n *\n * @param       p_stream                                the stream to write data to.\n * @param       p_j2k                           J2K codec.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_write_cbd(      opj_j2k_t *p_j2k,\n                                                                    opj_stream_private_t *p_stream,\n                                                                        opj_event_mgr_t * p_manager );\n\n/**\n * Reads a CBD marker (Component bit depth definition)\n * @param       p_header_data   the data contained in the CBD box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the CBD marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_cbd (      opj_j2k_t *p_j2k,\n                                                                OPJ_BYTE * p_header_data,\n                                                                OPJ_UINT32 p_header_size,\n                                                                opj_event_mgr_t * p_manager);\n\n#if 0\n/**\n * Writes COC marker for each component.\n *\n * @param       p_stream                the stream to write data to.\n * @param       p_j2k                   J2K codec.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_write_all_coc( opj_j2k_t *p_j2k,\n                                                                        opj_stream_private_t *p_stream,\n                                                                        opj_event_mgr_t * p_manager );\n#endif\n\n#if 0\n/**\n * Writes QCC marker for each component.\n *\n * @param       p_stream                the stream to write data to.\n * @param       p_j2k                   J2K codec.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_write_all_qcc( opj_j2k_t *p_j2k,\n                                                                        opj_stream_private_t *p_stream,\n                                                                        opj_event_mgr_t * p_manager );\n#endif\n\n/**\n * Writes regions of interests.\n *\n * @param       p_stream                the stream to write data to.\n * @param       p_j2k                   J2K codec.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_write_regions(  opj_j2k_t *p_j2k,\n                                                                        opj_stream_private_t *p_stream,\n                                                                        opj_event_mgr_t * p_manager );\n\n/**\n * Writes EPC ????\n *\n * @param       p_stream                the stream to write data to.\n * @param       p_j2k                   J2K codec.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_write_epc(      opj_j2k_t *p_j2k,\n                                                                    opj_stream_private_t *p_stream,\n                                                                    opj_event_mgr_t * p_manager );\n\n/**\n * Checks the progression order changes values. Tells of the poc given as input are valid.\n * A nice message is outputted at errors.\n *\n * @param       p_pocs                  the progression order changes.\n * @param       p_nb_pocs               the number of progression order changes.\n * @param       p_nb_resolutions        the number of resolutions.\n * @param       numcomps                the number of components\n * @param       numlayers               the number of layers.\n * @param       p_manager               the user event manager.\n *\n * @return      true if the pocs are valid.\n */\nstatic OPJ_BOOL opj_j2k_check_poc_val(  const opj_poc_t *p_pocs,\n                                                                            OPJ_UINT32 p_nb_pocs,\n                                                                            OPJ_UINT32 p_nb_resolutions,\n                                                                            OPJ_UINT32 numcomps,\n                                                                            OPJ_UINT32 numlayers,\n                                                                            opj_event_mgr_t * p_manager);\n\n/**\n * Gets the number of tile parts used for the given change of progression (if any) and the given tile.\n *\n * @param               cp                      the coding parameters.\n * @param               pino            the offset of the given poc (i.e. its position in the coding parameter).\n * @param               tileno          the given tile.\n *\n * @return              the number of tile parts.\n */\nstatic OPJ_UINT32 opj_j2k_get_num_tp( opj_cp_t *cp, OPJ_UINT32 pino, OPJ_UINT32 tileno);\n\n/**\n * Calculates the total number of tile parts needed by the encoder to\n * encode such an image. If not enough memory is available, then the function return false.\n *\n * @param       p_nb_tiles      pointer that will hold the number of tile parts.\n * @param       cp                      the coding parameters for the image.\n * @param       image           the image to encode.\n * @param       p_j2k                   the p_j2k encoder.\n * @param       p_manager       the user event manager.\n *\n * @return true if the function was successful, false else.\n */\nstatic OPJ_BOOL opj_j2k_calculate_tp(   opj_j2k_t *p_j2k,\n                                                                            opj_cp_t *cp,\n                                                                            OPJ_UINT32 * p_nb_tiles,\n                                                                            opj_image_t *image,\n                                                                            opj_event_mgr_t * p_manager);\n\nstatic void opj_j2k_dump_MH_info(opj_j2k_t* p_j2k, FILE* out_stream);\n\nstatic void opj_j2k_dump_MH_index(opj_j2k_t* p_j2k, FILE* out_stream);\n\nstatic opj_codestream_index_t* opj_j2k_create_cstr_index(void);\n\nstatic OPJ_FLOAT32 opj_j2k_get_tp_stride (opj_tcp_t * p_tcp);\n\nstatic OPJ_FLOAT32 opj_j2k_get_default_stride (opj_tcp_t * p_tcp);\n\nstatic int opj_j2k_initialise_4K_poc(opj_poc_t *POC, int numres);\n\nstatic void opj_j2k_set_cinema_parameters(opj_cparameters_t *parameters, opj_image_t *image, opj_event_mgr_t *p_manager);\n\nstatic OPJ_BOOL opj_j2k_is_cinema_compliant(opj_image_t *image, OPJ_CINEMA_MODE cinema_mode, opj_event_mgr_t *p_manager);\n\n/*@}*/\n\n/*@}*/\n\n/* ----------------------------------------------------------------------- */\ntypedef struct j2k_prog_order{\n        OPJ_PROG_ORDER enum_prog;\n        char str_prog[5];\n}j2k_prog_order_t;\n\nj2k_prog_order_t j2k_prog_order_list[] = {\n        {OPJ_CPRL, \"CPRL\"},\n        {OPJ_LRCP, \"LRCP\"},\n        {OPJ_PCRL, \"PCRL\"},\n        {OPJ_RLCP, \"RLCP\"},\n        {OPJ_RPCL, \"RPCL\"},\n        {(OPJ_PROG_ORDER)-1, \"\"}\n};\n\n/**\n * FIXME DOC\n */\nstatic const OPJ_UINT32 MCT_ELEMENT_SIZE [] =\n{\n        2,\n        4,\n        4,\n        8\n};\n\ntypedef void (* opj_j2k_mct_function) (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);\n\nconst opj_j2k_mct_function j2k_mct_read_functions_to_float [] =\n{\n        opj_j2k_read_int16_to_float,\n        opj_j2k_read_int32_to_float,\n        opj_j2k_read_float32_to_float,\n        opj_j2k_read_float64_to_float\n};\n\nconst opj_j2k_mct_function j2k_mct_read_functions_to_int32 [] =\n{\n        opj_j2k_read_int16_to_int32,\n        opj_j2k_read_int32_to_int32,\n        opj_j2k_read_float32_to_int32,\n        opj_j2k_read_float64_to_int32\n};\n\nconst opj_j2k_mct_function j2k_mct_write_functions_from_float [] =\n{\n        opj_j2k_write_float_to_int16,\n        opj_j2k_write_float_to_int32,\n        opj_j2k_write_float_to_float,\n        opj_j2k_write_float_to_float64\n};\n\ntypedef struct opj_dec_memory_marker_handler\n{\n        /** marker value */\n        OPJ_UINT32 id;\n        /** value of the state when the marker can appear */\n        OPJ_UINT32 states;\n        /** action linked to the marker */\n        OPJ_BOOL (*handler) (   opj_j2k_t *p_j2k,\n                            OPJ_BYTE * p_header_data,\n                            OPJ_UINT32 p_header_size,\n                            opj_event_mgr_t * p_manager );\n}\nopj_dec_memory_marker_handler_t;\n\nconst opj_dec_memory_marker_handler_t j2k_memory_marker_handler_tab [] =\n{\n  {J2K_MS_SOT, J2K_STATE_MH | J2K_STATE_TPHSOT, opj_j2k_read_sot},\n  {J2K_MS_COD, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_cod},\n  {J2K_MS_COC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_coc},\n  {J2K_MS_RGN, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_rgn},\n  {J2K_MS_QCD, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_qcd},\n  {J2K_MS_QCC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_qcc},\n  {J2K_MS_POC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_poc},\n  {J2K_MS_SIZ, J2K_STATE_MHSIZ, opj_j2k_read_siz},\n  {J2K_MS_TLM, J2K_STATE_MH, opj_j2k_read_tlm},\n  {J2K_MS_PLM, J2K_STATE_MH, opj_j2k_read_plm},\n  {J2K_MS_PLT, J2K_STATE_TPH, opj_j2k_read_plt},\n  {J2K_MS_PPM, J2K_STATE_MH, j2k_read_ppm_v3},\n  {J2K_MS_PPT, J2K_STATE_TPH, opj_j2k_read_ppt},\n  {J2K_MS_SOP, 0, 0},\n  {J2K_MS_CRG, J2K_STATE_MH, opj_j2k_read_crg},\n  {J2K_MS_COM, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_com},\n  {J2K_MS_MCT, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mct},\n  {J2K_MS_CBD, J2K_STATE_MH , opj_j2k_read_cbd},\n  {J2K_MS_MCC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mcc},\n  {J2K_MS_MCO, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mco},\n#ifdef USE_JPWL\n#ifdef TODO_MS /* remove these functions which are not commpatible with the v2 API */\n  {J2K_MS_EPC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epc},\n  {J2K_MS_EPB, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epb},\n  {J2K_MS_ESD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_esd},\n  {J2K_MS_RED, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_red},\n#endif\n#endif /* USE_JPWL */\n#ifdef USE_JPSEC\n  {J2K_MS_SEC, J2K_DEC_STATE_MH, j2k_read_sec},\n  {J2K_MS_INSEC, 0, j2k_read_insec}\n#endif /* USE_JPSEC */\n  {J2K_MS_UNK, J2K_STATE_MH | J2K_STATE_TPH, 0}/*opj_j2k_read_unk is directly used*/\n};\n\nvoid  opj_j2k_read_int16_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)\n{\n        OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;\n        OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;\n        OPJ_UINT32 i;\n        OPJ_UINT32 l_temp;\n\n        for (i=0;i<p_nb_elem;++i) {\n                opj_read_bytes(l_src_data,&l_temp,2);\n\n                l_src_data+=sizeof(OPJ_INT16);\n\n                *(l_dest_data++) = (OPJ_FLOAT32) l_temp;\n        }\n}\n\nvoid  opj_j2k_read_int32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)\n{\n        OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;\n        OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;\n        OPJ_UINT32 i;\n        OPJ_UINT32 l_temp;\n\n        for (i=0;i<p_nb_elem;++i) {\n                opj_read_bytes(l_src_data,&l_temp,4);\n\n                l_src_data+=sizeof(OPJ_INT32);\n\n                *(l_dest_data++) = (OPJ_FLOAT32) l_temp;\n        }\n}\n\nvoid  opj_j2k_read_float32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)\n{\n        OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;\n        OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;\n        OPJ_UINT32 i;\n        OPJ_FLOAT32 l_temp;\n\n        for (i=0;i<p_nb_elem;++i) {\n                opj_read_float(l_src_data,&l_temp);\n\n                l_src_data+=sizeof(OPJ_FLOAT32);\n\n                *(l_dest_data++) = l_temp;\n        }\n}\n\nvoid  opj_j2k_read_float64_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)\n{\n        OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;\n        OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;\n        OPJ_UINT32 i;\n        OPJ_FLOAT64 l_temp;\n\n        for (i=0;i<p_nb_elem;++i) {\n                opj_read_double(l_src_data,&l_temp);\n\n                l_src_data+=sizeof(OPJ_FLOAT64);\n\n                *(l_dest_data++) = (OPJ_FLOAT32) l_temp;\n        }\n}\n\nvoid  opj_j2k_read_int16_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)\n{\n        OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;\n        OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;\n        OPJ_UINT32 i;\n        OPJ_UINT32 l_temp;\n\n        for (i=0;i<p_nb_elem;++i) {\n                opj_read_bytes(l_src_data,&l_temp,2);\n\n                l_src_data+=sizeof(OPJ_INT16);\n\n                *(l_dest_data++) = (OPJ_INT32) l_temp;\n        }\n}\n\nvoid  opj_j2k_read_int32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)\n{\n        OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;\n        OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;\n        OPJ_UINT32 i;\n        OPJ_UINT32 l_temp;\n\n        for (i=0;i<p_nb_elem;++i) {\n                opj_read_bytes(l_src_data,&l_temp,4);\n\n                l_src_data+=sizeof(OPJ_INT32);\n\n                *(l_dest_data++) = (OPJ_INT32) l_temp;\n        }\n}\n\nvoid  opj_j2k_read_float32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)\n{\n        OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;\n        OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;\n        OPJ_UINT32 i;\n        OPJ_FLOAT32 l_temp;\n\n        for (i=0;i<p_nb_elem;++i) {\n                opj_read_float(l_src_data,&l_temp);\n\n                l_src_data+=sizeof(OPJ_FLOAT32);\n\n                *(l_dest_data++) = (OPJ_INT32) l_temp;\n        }\n}\n\nvoid  opj_j2k_read_float64_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)\n{\n        OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;\n        OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;\n        OPJ_UINT32 i;\n        OPJ_FLOAT64 l_temp;\n\n        for (i=0;i<p_nb_elem;++i) {\n                opj_read_double(l_src_data,&l_temp);\n\n                l_src_data+=sizeof(OPJ_FLOAT64);\n\n                *(l_dest_data++) = (OPJ_INT32) l_temp;\n        }\n}\n\nvoid  opj_j2k_write_float_to_int16 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)\n{\n        OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;\n        OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;\n        OPJ_UINT32 i;\n        OPJ_UINT32 l_temp;\n\n        for (i=0;i<p_nb_elem;++i) {\n                l_temp = (OPJ_UINT32) *(l_src_data++);\n\n                opj_write_bytes(l_dest_data,l_temp,sizeof(OPJ_INT16));\n\n                l_dest_data+=sizeof(OPJ_INT16);\n        }\n}\n\nvoid opj_j2k_write_float_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)\n{\n        OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;\n        OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;\n        OPJ_UINT32 i;\n        OPJ_UINT32 l_temp;\n\n        for (i=0;i<p_nb_elem;++i) {\n                l_temp = (OPJ_UINT32) *(l_src_data++);\n\n                opj_write_bytes(l_dest_data,l_temp,sizeof(OPJ_INT32));\n\n                l_dest_data+=sizeof(OPJ_INT32);\n        }\n}\n\nvoid  opj_j2k_write_float_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)\n{\n        OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;\n        OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;\n        OPJ_UINT32 i;\n        OPJ_FLOAT32 l_temp;\n\n        for (i=0;i<p_nb_elem;++i) {\n                l_temp = (OPJ_FLOAT32) *(l_src_data++);\n\n                opj_write_float(l_dest_data,l_temp);\n\n                l_dest_data+=sizeof(OPJ_FLOAT32);\n        }\n}\n\nvoid  opj_j2k_write_float_to_float64 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)\n{\n        OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;\n        OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;\n        OPJ_UINT32 i;\n        OPJ_FLOAT64 l_temp;\n\n        for (i=0;i<p_nb_elem;++i) {\n                l_temp = (OPJ_FLOAT64) *(l_src_data++);\n\n                opj_write_double(l_dest_data,l_temp);\n\n                l_dest_data+=sizeof(OPJ_FLOAT64);\n        }\n}\n\nchar *opj_j2k_convert_progression_order(OPJ_PROG_ORDER prg_order){\n        j2k_prog_order_t *po;\n        for(po = j2k_prog_order_list; po->enum_prog != -1; po++ ){\n                if(po->enum_prog == prg_order){\n                        return po->str_prog;\n                }\n        }\n        return po->str_prog;\n}\n\nOPJ_BOOL opj_j2k_check_poc_val( const opj_poc_t *p_pocs,\n                                                        OPJ_UINT32 p_nb_pocs,\n                                                        OPJ_UINT32 p_nb_resolutions,\n                                                        OPJ_UINT32 p_num_comps,\n                                                        OPJ_UINT32 p_num_layers,\n                                                        opj_event_mgr_t * p_manager)\n{\n        OPJ_UINT32* packet_array;\n        OPJ_UINT32 index , resno, compno, layno;\n        OPJ_UINT32 i;\n        OPJ_UINT32 step_c = 1;\n        OPJ_UINT32 step_r = p_num_comps * step_c;\n        OPJ_UINT32 step_l = p_nb_resolutions * step_r;\n        OPJ_BOOL loss = OPJ_FALSE;\n        OPJ_UINT32 layno0 = 0;\n\n        packet_array = (OPJ_UINT32*) opj_calloc(step_l * p_num_layers, sizeof(OPJ_UINT32));\n        if (packet_array == 00) {\n                opj_event_msg(p_manager , EVT_ERROR, \"Not enough memory for checking the poc values.\\n\");\n                return OPJ_FALSE;\n        }\n        memset(packet_array,0,step_l * p_num_layers* sizeof(OPJ_UINT32));\n\n        if (p_nb_pocs == 0) {\n        opj_free(packet_array);\n                return OPJ_TRUE;\n        }\n\n        index = step_r * p_pocs->resno0;\n        /* take each resolution for each poc */\n        for (resno = p_pocs->resno0 ; resno < p_pocs->resno1 ; ++resno)\n        {\n                OPJ_UINT32 res_index = index + p_pocs->compno0 * step_c;\n\n                /* take each comp of each resolution for each poc */\n                for (compno = p_pocs->compno0 ; compno < p_pocs->compno1 ; ++compno) {\n                        OPJ_UINT32 comp_index = res_index + layno0 * step_l;\n\n                        /* and finally take each layer of each res of ... */\n                        for (layno = layno0; layno < p_pocs->layno1 ; ++layno) {\n                                /*index = step_r * resno + step_c * compno + step_l * layno;*/\n                                packet_array[comp_index] = 1;\n                                comp_index += step_l;\n                        }\n\n                        res_index += step_c;\n                }\n\n                index += step_r;\n        }\n        ++p_pocs;\n\n        /* iterate through all the pocs */\n        for (i = 1; i < p_nb_pocs ; ++i) {\n                OPJ_UINT32 l_last_layno1 = (p_pocs-1)->layno1 ;\n\n                layno0 = (p_pocs->layno1 > l_last_layno1)? l_last_layno1 : 0;\n                index = step_r * p_pocs->resno0;\n\n                /* take each resolution for each poc */\n                for (resno = p_pocs->resno0 ; resno < p_pocs->resno1 ; ++resno) {\n                        OPJ_UINT32 res_index = index + p_pocs->compno0 * step_c;\n\n                        /* take each comp of each resolution for each poc */\n                        for (compno = p_pocs->compno0 ; compno < p_pocs->compno1 ; ++compno) {\n                                OPJ_UINT32 comp_index = res_index + layno0 * step_l;\n\n                                /* and finally take each layer of each res of ... */\n                                for (layno = layno0; layno < p_pocs->layno1 ; ++layno) {\n                                        /*index = step_r * resno + step_c * compno + step_l * layno;*/\n                                        packet_array[comp_index] = 1;\n                                        comp_index += step_l;\n                                }\n\n                                res_index += step_c;\n                        }\n\n                        index += step_r;\n                }\n\n                ++p_pocs;\n        }\n\n        index = 0;\n        for (layno = 0; layno < p_num_layers ; ++layno) {\n                for (resno = 0; resno < p_nb_resolutions; ++resno) {\n                        for (compno = 0; compno < p_num_comps; ++compno) {\n                                loss |= (packet_array[index]!=1);\n                                /*index = step_r * resno + step_c * compno + step_l * layno;*/\n                                index += step_c;\n                        }\n                }\n        }\n\n        if (loss) {\n                opj_event_msg(p_manager , EVT_ERROR, \"Missing packets possible loss of data\\n\");\n        }\n\n        opj_free(packet_array);\n\n        return !loss;\n}\n\n/* ----------------------------------------------------------------------- */\n\nOPJ_UINT32 opj_j2k_get_num_tp(opj_cp_t *cp, OPJ_UINT32 pino, OPJ_UINT32 tileno)\n{\n        const OPJ_CHAR *prog = 00;\n        OPJ_INT32 i;\n        OPJ_UINT32 tpnum = 1;\n        opj_tcp_t *tcp = 00;\n        opj_poc_t * l_current_poc = 00;\n\n        /*  preconditions */\n        assert(tileno < (cp->tw * cp->th));\n        assert(pino < (cp->tcps[tileno].numpocs + 1));\n\n        /* get the given tile coding parameter */\n        tcp = &cp->tcps[tileno];\n        assert(tcp != 00);\n\n        l_current_poc = &(tcp->pocs[pino]);\n        assert(l_current_poc != 0);\n\n        /* get the progression order as a character string */\n        prog = opj_j2k_convert_progression_order(tcp->prg);\n        assert(strlen(prog) > 0);\n\n        if (cp->m_specific_param.m_enc.m_tp_on == 1) {\n                for (i=0;i<4;++i) {\n                        switch (prog[i])\n                        {\n                                /* component wise */\n                                case 'C':\n                                        tpnum *= l_current_poc->compE;\n                                        break;\n                                /* resolution wise */\n                                case 'R':\n                                        tpnum *= l_current_poc->resE;\n                                        break;\n                                /* precinct wise */\n                                case 'P':\n                                        tpnum *= l_current_poc->prcE;\n                                        break;\n                                /* layer wise */\n                                case 'L':\n                                        tpnum *= l_current_poc->layE;\n                                        break;\n                        }\n                        /* whould we split here ? */\n                        if ( cp->m_specific_param.m_enc.m_tp_flag == prog[i] ) {\n                                cp->m_specific_param.m_enc.m_tp_pos=i;\n                                break;\n                        }\n                }\n        }\n        else {\n                tpnum=1;\n        }\n\n        return tpnum;\n}\n\nOPJ_BOOL opj_j2k_calculate_tp(  opj_j2k_t *p_j2k,\n                                                        opj_cp_t *cp,\n                                                        OPJ_UINT32 * p_nb_tiles,\n                                                        opj_image_t *image,\n                                                        opj_event_mgr_t * p_manager\n                                )\n{\n        OPJ_UINT32 pino,tileno;\n        OPJ_UINT32 l_nb_tiles;\n        opj_tcp_t *tcp;\n\n        /* preconditions */\n        assert(p_nb_tiles != 00);\n        assert(cp != 00);\n        assert(image != 00);\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n\n        l_nb_tiles = cp->tw * cp->th;\n        * p_nb_tiles = 0;\n        tcp = cp->tcps;\n\n        /* INDEX >> */\n        /* TODO mergeV2: check this part which use cstr_info */\n        /*if (p_j2k->cstr_info) {\n                opj_tile_info_t * l_info_tile_ptr = p_j2k->cstr_info->tile;\n\n                for (tileno = 0; tileno < l_nb_tiles; ++tileno) {\n                        OPJ_UINT32 cur_totnum_tp = 0;\n\n                        opj_pi_update_encoding_parameters(image,cp,tileno);\n\n                        for (pino = 0; pino <= tcp->numpocs; ++pino)\n                        {\n                                OPJ_UINT32 tp_num = opj_j2k_get_num_tp(cp,pino,tileno);\n\n                                *p_nb_tiles = *p_nb_tiles + tp_num;\n\n                                cur_totnum_tp += tp_num;\n                        }\n\n                        tcp->m_nb_tile_parts = cur_totnum_tp;\n\n                        l_info_tile_ptr->tp = (opj_tp_info_t *) opj_malloc(cur_totnum_tp * sizeof(opj_tp_info_t));\n                        if (l_info_tile_ptr->tp == 00) {\n                                return OPJ_FALSE;\n                        }\n\n                        memset(l_info_tile_ptr->tp,0,cur_totnum_tp * sizeof(opj_tp_info_t));\n\n                        l_info_tile_ptr->num_tps = cur_totnum_tp;\n\n                        ++l_info_tile_ptr;\n                        ++tcp;\n                }\n        }\n        else */{\n                for (tileno = 0; tileno < l_nb_tiles; ++tileno) {\n                        OPJ_UINT32 cur_totnum_tp = 0;\n\n                        opj_pi_update_encoding_parameters(image,cp,tileno);\n\n                        for (pino = 0; pino <= tcp->numpocs; ++pino) {\n                                OPJ_UINT32 tp_num = opj_j2k_get_num_tp(cp,pino,tileno);\n\n                                *p_nb_tiles = *p_nb_tiles + tp_num;\n\n                                cur_totnum_tp += tp_num;\n                        }\n                        tcp->m_nb_tile_parts = cur_totnum_tp;\n\n                        ++tcp;\n                }\n        }\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_write_soc(     opj_j2k_t *p_j2k,\n                                                opj_stream_private_t *p_stream,\n                                                    opj_event_mgr_t * p_manager )\n{\n        /* 2 bytes will be written */\n        OPJ_BYTE * l_start_stream = 00;\n\n        /* preconditions */\n        assert(p_stream != 00);\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n\n        l_start_stream = p_j2k->m_specific_param.m_encoder.m_header_tile_data;\n\n        /* write SOC identifier */\n        opj_write_bytes(l_start_stream,J2K_MS_SOC,2);\n\n        if (opj_stream_write_data(p_stream,l_start_stream,2,p_manager) != 2) {\n                return OPJ_FALSE;\n        }\n\n/* UniPG>> */\n#ifdef USE_JPWL\n        /* update markers struct */\n/*\n        OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOC, p_stream_tell(p_stream) - 2, 2);\n*/\n  assert( 0 && \"TODO\" );\n#endif /* USE_JPWL */\n/* <<UniPG */\n\n        return OPJ_TRUE;\n}\n\n/**\n * Reads a SOC marker (Start of Codestream)\n * @param       p_j2k           the jpeg2000 file codec.\n * @param       p_stream        FIXME DOC\n * @param       p_manager       the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_soc(   opj_j2k_t *p_j2k,\n                                    opj_stream_private_t *p_stream,\n                                    opj_event_mgr_t * p_manager\n                                    )\n{\n        OPJ_BYTE l_data [2];\n        OPJ_UINT32 l_marker;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        if (opj_stream_read_data(p_stream,l_data,2,p_manager) != 2) {\n                return OPJ_FALSE;\n        }\n\n        opj_read_bytes(l_data,&l_marker,2);\n        if (l_marker != J2K_MS_SOC) {\n                return OPJ_FALSE;\n        }\n\n        /* Next marker should be a SIZ marker in the main header */\n        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MHSIZ;\n\n        /* FIXME move it in a index structure included in p_j2k*/\n        p_j2k->cstr_index->main_head_start = opj_stream_tell(p_stream) - 2;\n\n        opj_event_msg(p_manager, EVT_INFO, \"Start to read j2k main header (%d).\\n\", p_j2k->cstr_index->main_head_start);\n\n        /* Add the marker to the codestream index*/\n        if (OPJ_FALSE == opj_j2k_add_mhmarker(p_j2k->cstr_index, J2K_MS_SOC, p_j2k->cstr_index->main_head_start, 2)) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to add mh marker\\n\");\n                return OPJ_FALSE;\n        }\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_write_siz(     opj_j2k_t *p_j2k,\n                                                        opj_stream_private_t *p_stream,\n                                                        opj_event_mgr_t * p_manager )\n{\n        OPJ_UINT32 i;\n        OPJ_UINT32 l_size_len;\n        OPJ_BYTE * l_current_ptr;\n        opj_image_t * l_image = 00;\n        opj_cp_t *cp = 00;\n        opj_image_comp_t * l_img_comp = 00;\n\n        /* preconditions */\n        assert(p_stream != 00);\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n\n        l_image = p_j2k->m_private_image;\n        cp = &(p_j2k->m_cp);\n        l_size_len = 40 + 3 * l_image->numcomps;\n        l_img_comp = l_image->comps;\n\n        if (l_size_len > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {\n\n                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_size_len);\n                if (! new_header_tile_data) {\n                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);\n                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;\n                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;\n                        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory for the SIZ marker\\n\");\n                        return OPJ_FALSE;\n                }\n                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;\n                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_size_len;\n        }\n\n        l_current_ptr = p_j2k->m_specific_param.m_encoder.m_header_tile_data;\n\n        /* write SOC identifier */\n        opj_write_bytes(l_current_ptr,J2K_MS_SIZ,2);    /* SIZ */\n        l_current_ptr+=2;\n\n        opj_write_bytes(l_current_ptr,l_size_len-2,2); /* L_SIZ */\n        l_current_ptr+=2;\n\n        opj_write_bytes(l_current_ptr, cp->rsiz, 2);    /* Rsiz (capabilities) */\n        l_current_ptr+=2;\n\n        opj_write_bytes(l_current_ptr, l_image->x1, 4); /* Xsiz */\n        l_current_ptr+=4;\n\n        opj_write_bytes(l_current_ptr, l_image->y1, 4); /* Ysiz */\n        l_current_ptr+=4;\n\n        opj_write_bytes(l_current_ptr, l_image->x0, 4); /* X0siz */\n        l_current_ptr+=4;\n\n        opj_write_bytes(l_current_ptr, l_image->y0, 4); /* Y0siz */\n        l_current_ptr+=4;\n\n        opj_write_bytes(l_current_ptr, cp->tdx, 4);             /* XTsiz */\n        l_current_ptr+=4;\n\n        opj_write_bytes(l_current_ptr, cp->tdy, 4);             /* YTsiz */\n        l_current_ptr+=4;\n\n        opj_write_bytes(l_current_ptr, cp->tx0, 4);             /* XT0siz */\n        l_current_ptr+=4;\n\n        opj_write_bytes(l_current_ptr, cp->ty0, 4);             /* YT0siz */\n        l_current_ptr+=4;\n\n        opj_write_bytes(l_current_ptr, l_image->numcomps, 2);   /* Csiz */\n        l_current_ptr+=2;\n\n        for (i = 0; i < l_image->numcomps; ++i) {\n                /* TODO here with MCT ? */\n                opj_write_bytes(l_current_ptr, l_img_comp->prec - 1 + (l_img_comp->sgnd << 7), 1);      /* Ssiz_i */\n                ++l_current_ptr;\n\n                opj_write_bytes(l_current_ptr, l_img_comp->dx, 1);      /* XRsiz_i */\n                ++l_current_ptr;\n\n                opj_write_bytes(l_current_ptr, l_img_comp->dy, 1);      /* YRsiz_i */\n                ++l_current_ptr;\n\n                ++l_img_comp;\n        }\n\n        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_size_len,p_manager) != l_size_len) {\n                return OPJ_FALSE;\n        }\n\n        return OPJ_TRUE;\n}\n\n/**\n * Reads a SIZ marker (image and tile size)\n * @param       p_j2k           the jpeg2000 file codec.\n * @param       p_header_data   the data contained in the SIZ box.\n * @param       p_header_size   the size of the data contained in the SIZ marker.\n * @param       p_manager       the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_siz(opj_j2k_t *p_j2k,\n                                 OPJ_BYTE * p_header_data,\n                                 OPJ_UINT32 p_header_size,\n                                 opj_event_mgr_t * p_manager\n                                 )\n{\n        OPJ_UINT32 i;\n        OPJ_UINT32 l_nb_comp;\n        OPJ_UINT32 l_nb_comp_remain;\n        OPJ_UINT32 l_remaining_size;\n        OPJ_UINT32 l_nb_tiles;\n        OPJ_UINT32 l_tmp;\n        opj_image_t *l_image = 00;\n        opj_cp_t *l_cp = 00;\n        opj_image_comp_t * l_img_comp = 00;\n        opj_tcp_t * l_current_tile_param = 00;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_header_data != 00);\n\n        l_image = p_j2k->m_private_image;\n        l_cp = &(p_j2k->m_cp);\n\n        /* minimum size == 39 - 3 (= minimum component parameter) */\n        if (p_header_size < 36) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error with SIZ marker size\\n\");\n                return OPJ_FALSE;\n        }\n\n        l_remaining_size = p_header_size - 36;\n        l_nb_comp = l_remaining_size / 3;\n        l_nb_comp_remain = l_remaining_size % 3;\n        if (l_nb_comp_remain != 0){\n                opj_event_msg(p_manager, EVT_ERROR, \"Error with SIZ marker size\\n\");\n                return OPJ_FALSE;\n        }\n\n        opj_read_bytes(p_header_data,&l_tmp ,2);                                                /* Rsiz (capabilities) */\n        p_header_data+=2;\n        l_cp->rsiz = (OPJ_RSIZ_CAPABILITIES) l_tmp;\n        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->x1, 4);   /* Xsiz */\n        p_header_data+=4;\n        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->y1, 4);   /* Ysiz */\n        p_header_data+=4;\n        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->x0, 4);   /* X0siz */\n        p_header_data+=4;\n        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->y0, 4);   /* Y0siz */\n        p_header_data+=4;\n        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tdx, 4);             /* XTsiz */\n        p_header_data+=4;\n        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tdy, 4);             /* YTsiz */\n        p_header_data+=4;\n        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tx0, 4);             /* XT0siz */\n        p_header_data+=4;\n        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->ty0, 4);             /* YT0siz */\n        p_header_data+=4;\n        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_tmp, 2);                 /* Csiz */\n        p_header_data+=2;\n        if (l_tmp < 16385)\n                l_image->numcomps = (OPJ_UINT16) l_tmp;\n        else {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error with SIZ marker: number of component is illegal -> %d\\n\", l_tmp);\n                return OPJ_FALSE;\n        }\n\n        if (l_image->numcomps != l_nb_comp) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error with SIZ marker: number of component is not compatible with the remaining number of parameters ( %d vs %d)\\n\", l_image->numcomps, l_nb_comp);\n                return OPJ_FALSE;\n        }\n\n        /* testcase 4035.pdf.SIGSEGV.d8b.3375 */\n        if (l_image->x0 > l_image->x1 || l_image->y0 > l_image->y1) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error with SIZ marker: negative image size (%d x %d)\\n\", l_image->x1 - l_image->x0, l_image->y1 - l_image->y0);\n                return OPJ_FALSE;\n        }\n        /* testcase 2539.pdf.SIGFPE.706.1712 (also 3622.pdf.SIGFPE.706.2916 and 4008.pdf.SIGFPE.706.3345 and maybe more) */\n        if (!(l_cp->tdx * l_cp->tdy)) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error with SIZ marker: invalid tile size (tdx: %d, tdy: %d)\\n\", l_cp->tdx, l_cp->tdy);\n                return OPJ_FALSE;\n        }\n\n        /* testcase 1610.pdf.SIGSEGV.59c.681 */\n        if (((OPJ_UINT64)l_image->x1) * ((OPJ_UINT64)l_image->y1) != (l_image->x1 * l_image->y1)) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Prevent buffer overflow (x1: %d, y1: %d)\\n\", l_image->x1, l_image->y1);\n                return OPJ_FALSE;\n        }\n\n#ifdef USE_JPWL\n        if (l_cp->correct) {\n                /* if JPWL is on, we check whether TX errors have damaged\n                  too much the SIZ parameters */\n                if (!(l_image->x1 * l_image->y1)) {\n                        opj_event_msg(p_manager, EVT_ERROR,\n                                \"JPWL: bad image size (%d x %d)\\n\",\n                                l_image->x1, l_image->y1);\n                        if (!JPWL_ASSUME || JPWL_ASSUME) {\n                                opj_event_msg(p_manager, EVT_ERROR, \"JPWL: giving up\\n\");\n                                return OPJ_FALSE;\n                        }\n                }\n\n        /* FIXME check previously in the function so why keep this piece of code ? Need by the norm ?\n                if (l_image->numcomps != ((len - 38) / 3)) {\n                        opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,\n                                \"JPWL: Csiz is %d => space in SIZ only for %d comps.!!!\\n\",\n                                l_image->numcomps, ((len - 38) / 3));\n                        if (!JPWL_ASSUME) {\n                                opj_event_msg(p_manager, EVT_ERROR, \"JPWL: giving up\\n\");\n                                return OPJ_FALSE;\n                        }\n        */              /* we try to correct */\n        /*              opj_event_msg(p_manager, EVT_WARNING, \"- trying to adjust this\\n\");\n                        if (l_image->numcomps < ((len - 38) / 3)) {\n                                len = 38 + 3 * l_image->numcomps;\n                                opj_event_msg(p_manager, EVT_WARNING, \"- setting Lsiz to %d => HYPOTHESIS!!!\\n\",\n                                        len);\n                        } else {\n                                l_image->numcomps = ((len - 38) / 3);\n                                opj_event_msg(p_manager, EVT_WARNING, \"- setting Csiz to %d => HYPOTHESIS!!!\\n\",\n                                        l_image->numcomps);\n                        }\n                }\n        */\n\n                /* update components number in the jpwl_exp_comps filed */\n                l_cp->exp_comps = l_image->numcomps;\n        }\n#endif /* USE_JPWL */\n\n        /* Allocate the resulting image components */\n        l_image->comps = (opj_image_comp_t*) opj_calloc(l_image->numcomps, sizeof(opj_image_comp_t));\n        if (l_image->comps == 00){\n                l_image->numcomps = 0;\n                opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to take in charge SIZ marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        memset(l_image->comps,0,l_image->numcomps * sizeof(opj_image_comp_t));\n        l_img_comp = l_image->comps;\n\n        /* Read the component information */\n        for (i = 0; i < l_image->numcomps; ++i){\n                OPJ_UINT32 tmp;\n                opj_read_bytes(p_header_data,&tmp,1);   /* Ssiz_i */\n                ++p_header_data;\n                l_img_comp->prec = (tmp & 0x7f) + 1;\n                l_img_comp->sgnd = tmp >> 7;\n                opj_read_bytes(p_header_data,&tmp,1);   /* XRsiz_i */\n                ++p_header_data;\n                l_img_comp->dx = (OPJ_UINT32)tmp; /* should be between 1 and 255 */\n                opj_read_bytes(p_header_data,&tmp,1);   /* YRsiz_i */\n                ++p_header_data;\n                l_img_comp->dy = (OPJ_UINT32)tmp; /* should be between 1 and 255 */\n                if( l_img_comp->dx < 1 || l_img_comp->dx > 255 ||\n                    l_img_comp->dy < 1 || l_img_comp->dy > 255 ) {\n                    opj_event_msg(p_manager, EVT_ERROR,\n                                  \"Invalid values for comp = %d : dx=%u dy=%u\\n (should be between 1 and 255 according the JPEG2000 norm)\",\n                                  i, l_img_comp->dx, l_img_comp->dy);\n                    return OPJ_FALSE;\n                }\n\n#ifdef USE_JPWL\n                if (l_cp->correct) {\n                /* if JPWL is on, we check whether TX errors have damaged\n                        too much the SIZ parameters, again */\n                        if (!(l_image->comps[i].dx * l_image->comps[i].dy)) {\n                                opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,\n                                        \"JPWL: bad XRsiz_%d/YRsiz_%d (%d x %d)\\n\",\n                                        i, i, l_image->comps[i].dx, l_image->comps[i].dy);\n                                if (!JPWL_ASSUME) {\n                                        opj_event_msg(p_manager, EVT_ERROR, \"JPWL: giving up\\n\");\n                                        return OPJ_FALSE;\n                                }\n                                /* we try to correct */\n                                opj_event_msg(p_manager, EVT_WARNING, \"- trying to adjust them\\n\");\n                                if (!l_image->comps[i].dx) {\n                                        l_image->comps[i].dx = 1;\n                                        opj_event_msg(p_manager, EVT_WARNING, \"- setting XRsiz_%d to %d => HYPOTHESIS!!!\\n\",\n                                                i, l_image->comps[i].dx);\n                                }\n                                if (!l_image->comps[i].dy) {\n                                        l_image->comps[i].dy = 1;\n                                        opj_event_msg(p_manager, EVT_WARNING, \"- setting YRsiz_%d to %d => HYPOTHESIS!!!\\n\",\n                                                i, l_image->comps[i].dy);\n                                }\n                        }\n                }\n#endif /* USE_JPWL */\n                l_img_comp->resno_decoded = 0;                                                          /* number of resolution decoded */\n                l_img_comp->factor = l_cp->m_specific_param.m_dec.m_reduce; /* reducing factor per component */\n                ++l_img_comp;\n        }\n\n        /* Compute the number of tiles */\n        l_cp->tw = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(l_image->x1 - l_cp->tx0), (OPJ_INT32)l_cp->tdx);\n        l_cp->th = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(l_image->y1 - l_cp->ty0), (OPJ_INT32)l_cp->tdy);\n\n        /* Check that the number of tiles is valid */\n        if (l_cp->tw == 0 || l_cp->th == 0 || l_cp->tw > 65535 / l_cp->th) {\n            opj_event_msg(  p_manager, EVT_ERROR, \n                            \"Invalid number of tiles : %u x %u (maximum fixed by jpeg2000 norm is 65535 tiles)\\n\",\n                            l_cp->tw, l_cp->th);\n            return OPJ_FALSE;\n        }\n        l_nb_tiles = l_cp->tw * l_cp->th;\n\n        /* Define the tiles which will be decoded */\n        if (p_j2k->m_specific_param.m_decoder.m_discard_tiles) {\n                p_j2k->m_specific_param.m_decoder.m_start_tile_x = (p_j2k->m_specific_param.m_decoder.m_start_tile_x - l_cp->tx0) / l_cp->tdx;\n                p_j2k->m_specific_param.m_decoder.m_start_tile_y = (p_j2k->m_specific_param.m_decoder.m_start_tile_y - l_cp->ty0) / l_cp->tdy;\n                p_j2k->m_specific_param.m_decoder.m_end_tile_x = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(p_j2k->m_specific_param.m_decoder.m_end_tile_x - l_cp->tx0), (OPJ_INT32)l_cp->tdx);\n                p_j2k->m_specific_param.m_decoder.m_end_tile_y = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(p_j2k->m_specific_param.m_decoder.m_end_tile_y - l_cp->ty0), (OPJ_INT32)l_cp->tdy);\n        }\n        else {\n                p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;\n                p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;\n                p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;\n                p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;\n        }\n\n#ifdef USE_JPWL\n        if (l_cp->correct) {\n                /* if JPWL is on, we check whether TX errors have damaged\n                  too much the SIZ parameters */\n                if ((l_cp->tw < 1) || (l_cp->th < 1) || (l_cp->tw > l_cp->max_tiles) || (l_cp->th > l_cp->max_tiles)) {\n                        opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,\n                                \"JPWL: bad number of tiles (%d x %d)\\n\",\n                                l_cp->tw, l_cp->th);\n                        if (!JPWL_ASSUME) {\n                                opj_event_msg(p_manager, EVT_ERROR, \"JPWL: giving up\\n\");\n                                return OPJ_FALSE;\n                        }\n                        /* we try to correct */\n                        opj_event_msg(p_manager, EVT_WARNING, \"- trying to adjust them\\n\");\n                        if (l_cp->tw < 1) {\n                                l_cp->tw= 1;\n                                opj_event_msg(p_manager, EVT_WARNING, \"- setting %d tiles in x => HYPOTHESIS!!!\\n\",\n                                                l_cp->tw);\n                        }\n                        if (l_cp->tw > l_cp->max_tiles) {\n                                l_cp->tw= 1;\n                                opj_event_msg(p_manager, EVT_WARNING, \"- too large x, increase expectance of %d\\n\"\n                                        \"- setting %d tiles in x => HYPOTHESIS!!!\\n\",\n                                        l_cp->max_tiles, l_cp->tw);\n                        }\n                        if (l_cp->th < 1) {\n                                l_cp->th= 1;\n                                opj_event_msg(p_manager, EVT_WARNING, \"- setting %d tiles in y => HYPOTHESIS!!!\\n\",\n                                                l_cp->th);\n                        }\n                        if (l_cp->th > l_cp->max_tiles) {\n                                l_cp->th= 1;\n                                opj_event_msg(p_manager, EVT_WARNING, \"- too large y, increase expectance of %d to continue\\n\",\n                                        \"- setting %d tiles in y => HYPOTHESIS!!!\\n\",\n                                        l_cp->max_tiles, l_cp->th);\n                        }\n                }\n        }\n#endif /* USE_JPWL */\n\n        /* memory allocations */\n        l_cp->tcps = (opj_tcp_t*) opj_calloc(l_nb_tiles, sizeof(opj_tcp_t));\n        if (l_cp->tcps == 00) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to take in charge SIZ marker\\n\");\n                return OPJ_FALSE;\n        }\n        memset(l_cp->tcps,0,l_nb_tiles*sizeof(opj_tcp_t));\n\n#ifdef USE_JPWL\n        if (l_cp->correct) {\n                if (!l_cp->tcps) {\n                        opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,\n                                \"JPWL: could not alloc tcps field of cp\\n\");\n                        if (!JPWL_ASSUME || JPWL_ASSUME) {\n                                opj_event_msg(p_manager, EVT_ERROR, \"JPWL: giving up\\n\");\n                                return OPJ_FALSE;\n                        }\n                }\n        }\n#endif /* USE_JPWL */\n\n        p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps =\n                        (opj_tccp_t*) opj_calloc(l_image->numcomps, sizeof(opj_tccp_t));\n        if(p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps  == 00) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to take in charge SIZ marker\\n\");\n                return OPJ_FALSE;\n        }\n        memset(p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps ,0,l_image->numcomps*sizeof(opj_tccp_t));\n\n        p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records =\n                        (opj_mct_data_t*)opj_malloc(OPJ_J2K_MCT_DEFAULT_NB_RECORDS * sizeof(opj_mct_data_t));\n\n        if (! p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to take in charge SIZ marker\\n\");\n                return OPJ_FALSE;\n        }\n        memset(p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records,0,OPJ_J2K_MCT_DEFAULT_NB_RECORDS * sizeof(opj_mct_data_t));\n        p_j2k->m_specific_param.m_decoder.m_default_tcp->m_nb_max_mct_records = OPJ_J2K_MCT_DEFAULT_NB_RECORDS;\n\n        p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records =\n                        (opj_simple_mcc_decorrelation_data_t*)\n                        opj_malloc(OPJ_J2K_MCC_DEFAULT_NB_RECORDS * sizeof(opj_simple_mcc_decorrelation_data_t));\n\n        if (! p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to take in charge SIZ marker\\n\");\n                return OPJ_FALSE;\n        }\n        memset(p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records,0,OPJ_J2K_MCC_DEFAULT_NB_RECORDS * sizeof(opj_simple_mcc_decorrelation_data_t));\n        p_j2k->m_specific_param.m_decoder.m_default_tcp->m_nb_max_mcc_records = OPJ_J2K_MCC_DEFAULT_NB_RECORDS;\n\n        /* set up default dc level shift */\n        for (i=0;i<l_image->numcomps;++i) {\n                if (! l_image->comps[i].sgnd) {\n                        p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[i].m_dc_level_shift = 1 << (l_image->comps[i].prec - 1);\n                }\n        }\n\n        l_current_tile_param = l_cp->tcps;\n        for     (i = 0; i < l_nb_tiles; ++i) {\n                l_current_tile_param->tccps = (opj_tccp_t*) opj_malloc(l_image->numcomps * sizeof(opj_tccp_t));\n                if (l_current_tile_param->tccps == 00) {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to take in charge SIZ marker\\n\");\n                        return OPJ_FALSE;\n                }\n                memset(l_current_tile_param->tccps,0,l_image->numcomps * sizeof(opj_tccp_t));\n\n                ++l_current_tile_param;\n        }\n\n        p_j2k->m_specific_param.m_decoder.m_state =  J2K_STATE_MH; /* FIXME J2K_DEC_STATE_MH; */\n        opj_image_comp_header_update(l_image,l_cp);\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_write_com(     opj_j2k_t *p_j2k,\n                                                        opj_stream_private_t *p_stream,\n                                                        opj_event_mgr_t * p_manager\n                            )\n{\n        OPJ_UINT32 l_comment_size;\n        OPJ_UINT32 l_total_com_size;\n        const OPJ_CHAR *l_comment;\n        OPJ_BYTE * l_current_ptr = 00;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_stream != 00);\n        assert(p_manager != 00);\n\n        l_comment = p_j2k->m_cp.comment;\n        l_comment_size = (OPJ_UINT32)strlen(l_comment);\n        l_total_com_size = l_comment_size + 6;\n\n        if (l_total_com_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {\n                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_total_com_size);\n                if (! new_header_tile_data) {\n                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);\n                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;\n                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;\n                        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to write the COM marker\\n\");\n                        return OPJ_FALSE;\n                }\n                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;\n                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_total_com_size;\n        }\n\n        l_current_ptr = p_j2k->m_specific_param.m_encoder.m_header_tile_data;\n\n        opj_write_bytes(l_current_ptr,J2K_MS_COM , 2);  /* COM */\n        l_current_ptr+=2;\n\n        opj_write_bytes(l_current_ptr,l_total_com_size - 2 , 2);        /* L_COM */\n        l_current_ptr+=2;\n\n        opj_write_bytes(l_current_ptr,1 , 2);   /* General use (IS 8859-15:1999 (Latin) values) */\n        l_current_ptr+=2;\n\n        memcpy( l_current_ptr,l_comment,l_comment_size);\n\n        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_total_com_size,p_manager) != l_total_com_size) {\n                return OPJ_FALSE;\n        }\n\n        return OPJ_TRUE;\n}\n\n/**\n * Reads a COM marker (comments)\n * @param       p_j2k           the jpeg2000 file codec.\n * @param       p_header_data   the data contained in the COM box.\n * @param       p_header_size   the size of the data contained in the COM marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_com (  opj_j2k_t *p_j2k,\n                                    OPJ_BYTE * p_header_data,\n                                    OPJ_UINT32 p_header_size,\n                                    opj_event_mgr_t * p_manager\n                                    )\n{\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_header_data != 00);\n  (void)p_header_size;\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_write_cod(     opj_j2k_t *p_j2k,\n                                                        opj_stream_private_t *p_stream,\n                                                        opj_event_mgr_t * p_manager )\n{\n        opj_cp_t *l_cp = 00;\n        opj_tcp_t *l_tcp = 00;\n        OPJ_UINT32 l_code_size,l_remaining_size;\n        OPJ_BYTE * l_current_data = 00;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        l_cp = &(p_j2k->m_cp);\n        l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];\n        l_code_size = 9 + opj_j2k_get_SPCod_SPCoc_size(p_j2k,p_j2k->m_current_tile_number,0);\n        l_remaining_size = l_code_size;\n\n        if (l_code_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {\n                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_code_size);\n                if (! new_header_tile_data) {\n                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);\n                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;\n                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;\n                        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to write COD marker\\n\");\n                        return OPJ_FALSE;\n                }\n                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;\n                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_code_size;\n        }\n\n        l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;\n\n        opj_write_bytes(l_current_data,J2K_MS_COD,2);           /* COD */\n        l_current_data += 2;\n\n        opj_write_bytes(l_current_data,l_code_size-2,2);        /* L_COD */\n        l_current_data += 2;\n\n        opj_write_bytes(l_current_data,l_tcp->csty,1);          /* Scod */\n        ++l_current_data;\n\n        opj_write_bytes(l_current_data,l_tcp->prg,1);           /* SGcod (A) */\n        ++l_current_data;\n\n        opj_write_bytes(l_current_data,l_tcp->numlayers,2);     /* SGcod (B) */\n        l_current_data+=2;\n\n        opj_write_bytes(l_current_data,l_tcp->mct,1);           /* SGcod (C) */\n        ++l_current_data;\n\n        l_remaining_size -= 9;\n\n        if (! opj_j2k_write_SPCod_SPCoc(p_j2k,p_j2k->m_current_tile_number,0,l_current_data,&l_remaining_size,p_manager)) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error writing COD marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        if (l_remaining_size != 0) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error writing COD marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_code_size,p_manager) != l_code_size) {\n                return OPJ_FALSE;\n        }\n\n        return OPJ_TRUE;\n}\n\n/**\n * Reads a COD marker (Coding Styke defaults)\n * @param       p_header_data   the data contained in the COD box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the COD marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_cod (  opj_j2k_t *p_j2k,\n                                    OPJ_BYTE * p_header_data,\n                                    OPJ_UINT32 p_header_size,\n                                    opj_event_mgr_t * p_manager\n                                    )\n{\n        /* loop */\n        OPJ_UINT32 i;\n        OPJ_UINT32 l_tmp;\n        opj_cp_t *l_cp = 00;\n        opj_tcp_t *l_tcp = 00;\n        opj_image_t *l_image = 00;\n\n        /* preconditions */\n        assert(p_header_data != 00);\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n\n        l_image = p_j2k->m_private_image;\n        l_cp = &(p_j2k->m_cp);\n\n        /* If we are in the first tile-part header of the current tile */\n        l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?\n                                &l_cp->tcps[p_j2k->m_current_tile_number] :\n                                p_j2k->m_specific_param.m_decoder.m_default_tcp;\n\n        /* Make sure room is sufficient */\n        if (p_header_size < 5) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading COD marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        opj_read_bytes(p_header_data,&l_tcp->csty,1);           /* Scod */\n        ++p_header_data;\n        opj_read_bytes(p_header_data,&l_tmp,1);                         /* SGcod (A) */\n        ++p_header_data;\n        l_tcp->prg = (OPJ_PROG_ORDER) l_tmp;\n        opj_read_bytes(p_header_data,&l_tcp->numlayers,2);      /* SGcod (B) */\n        p_header_data+=2;\n\n        /* If user didn't set a number layer to decode take the max specify in the codestream. */\n        if      (l_cp->m_specific_param.m_dec.m_layer) {\n                l_tcp->num_layers_to_decode = l_cp->m_specific_param.m_dec.m_layer;\n        }\n        else {\n                l_tcp->num_layers_to_decode = l_tcp->numlayers;\n        }\n\n        opj_read_bytes(p_header_data,&l_tcp->mct,1);            /* SGcod (C) */\n        ++p_header_data;\n\n        p_header_size -= 5;\n        for     (i = 0; i < l_image->numcomps; ++i) {\n                l_tcp->tccps[i].csty = l_tcp->csty & J2K_CCP_CSTY_PRT;\n        }\n\n        if (! opj_j2k_read_SPCod_SPCoc(p_j2k,0,p_header_data,&p_header_size,p_manager)) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading COD marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        if (p_header_size != 0) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading COD marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        /* Apply the coding style to other components of the current tile or the m_default_tcp*/\n        opj_j2k_copy_tile_component_parameters(p_j2k);\n\n        /* Index */\n#ifdef WIP_REMOVE_MSD\n        if (p_j2k->cstr_info) {\n                /*opj_codestream_info_t *l_cstr_info = p_j2k->cstr_info;*/\n                p_j2k->cstr_info->prog = l_tcp->prg;\n                p_j2k->cstr_info->numlayers = l_tcp->numlayers;\n                p_j2k->cstr_info->numdecompos = (OPJ_INT32*) opj_malloc(l_image->numcomps * sizeof(OPJ_UINT32));\n                for     (i = 0; i < l_image->numcomps; ++i) {\n                        p_j2k->cstr_info->numdecompos[i] = l_tcp->tccps[i].numresolutions - 1;\n                }\n        }\n#endif\n\n        return OPJ_TRUE;\n}\n\n#if 0\nOPJ_BOOL opj_j2k_write_coc( opj_j2k_t *p_j2k,\n                                                OPJ_UINT32 p_comp_no,\n                                                opj_stream_private_t *p_stream,\n                                                opj_event_mgr_t * p_manager )\n{\n        OPJ_UINT32 l_coc_size,l_remaining_size;\n        OPJ_UINT32 l_comp_room;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        l_comp_room = (p_j2k->m_private_image->numcomps <= 256) ? 1 : 2;\n\n        l_coc_size = 5 + l_comp_room + opj_j2k_get_SPCod_SPCoc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no);\n\n        if (l_coc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {\n                OPJ_BYTE *new_header_tile_data;\n                /*p_j2k->m_specific_param.m_encoder.m_header_tile_data\n                        = (OPJ_BYTE*)opj_realloc(\n                                p_j2k->m_specific_param.m_encoder.m_header_tile_data,\n                                l_coc_size);*/\n\n                new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_coc_size);\n                if (! new_header_tile_data) {\n                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);\n                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;\n                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;\n                        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to write COC marker\\n\");\n                        return OPJ_FALSE;\n                }\n                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;\n                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_coc_size;\n        }\n\n        opj_j2k_write_coc_in_memory(p_j2k,p_comp_no,p_j2k->m_specific_param.m_encoder.m_header_tile_data,&l_remaining_size,p_manager);\n\n        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_coc_size,p_manager) != l_coc_size) {\n                return OPJ_FALSE;\n        }\n\n        return OPJ_TRUE;\n}\n#endif\n\n#if 0\nvoid opj_j2k_write_coc_in_memory(   opj_j2k_t *p_j2k,\n                                                OPJ_UINT32 p_comp_no,\n                                                OPJ_BYTE * p_data,\n                                                OPJ_UINT32 * p_data_written,\n                                                opj_event_mgr_t * p_manager\n                                    )\n{\n        opj_cp_t *l_cp = 00;\n        opj_tcp_t *l_tcp = 00;\n        OPJ_UINT32 l_coc_size,l_remaining_size;\n        OPJ_BYTE * l_current_data = 00;\n        opj_image_t *l_image = 00;\n        OPJ_UINT32 l_comp_room;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n\n        l_cp = &(p_j2k->m_cp);\n        l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];\n        l_image = p_j2k->m_private_image;\n        l_comp_room = (l_image->numcomps <= 256) ? 1 : 2;\n\n        l_coc_size = 5 + l_comp_room + opj_j2k_get_SPCod_SPCoc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no);\n        l_remaining_size = l_coc_size;\n\n        l_current_data = p_data;\n\n        opj_write_bytes(l_current_data,J2K_MS_COC,2);                           /* COC */\n        l_current_data += 2;\n\n        opj_write_bytes(l_current_data,l_coc_size-2,2);                         /* L_COC */\n        l_current_data += 2;\n\n        opj_write_bytes(l_current_data,p_comp_no, l_comp_room);         /* Ccoc */\n        l_current_data+=l_comp_room;\n\n        opj_write_bytes(l_current_data, l_tcp->tccps[p_comp_no].csty, 1);               /* Scoc */\n        ++l_current_data;\n\n        l_remaining_size -= (5 + l_comp_room);\n        opj_j2k_write_SPCod_SPCoc(p_j2k,p_j2k->m_current_tile_number,0,l_current_data,&l_remaining_size,p_manager);\n        * p_data_written = l_coc_size;\n}\n#endif\n\nOPJ_UINT32 opj_j2k_get_max_coc_size(opj_j2k_t *p_j2k)\n{\n        OPJ_UINT32 i,j;\n        OPJ_UINT32 l_nb_comp;\n        OPJ_UINT32 l_nb_tiles;\n        OPJ_UINT32 l_max = 0;\n\n        /* preconditions */\n\n        l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th ;\n        l_nb_comp = p_j2k->m_private_image->numcomps;\n\n        for (i=0;i<l_nb_tiles;++i) {\n                for (j=0;j<l_nb_comp;++j) {\n                        l_max = opj_uint_max(l_max,opj_j2k_get_SPCod_SPCoc_size(p_j2k,i,j));\n                }\n        }\n\n        return 6 + l_max;\n}\n\n/**\n * Reads a COC marker (Coding Style Component)\n * @param       p_header_data   the data contained in the COC box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the COC marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_coc (  opj_j2k_t *p_j2k,\n                                    OPJ_BYTE * p_header_data,\n                                    OPJ_UINT32 p_header_size,\n                                    opj_event_mgr_t * p_manager\n                                    )\n{\n        opj_cp_t *l_cp = NULL;\n        opj_tcp_t *l_tcp = NULL;\n        opj_image_t *l_image = NULL;\n        OPJ_UINT32 l_comp_room;\n        OPJ_UINT32 l_comp_no;\n\n        /* preconditions */\n        assert(p_header_data != 00);\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n\n        l_cp = &(p_j2k->m_cp);\n        l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ) ? /*FIXME J2K_DEC_STATE_TPH*/\n                                &l_cp->tcps[p_j2k->m_current_tile_number] :\n                                p_j2k->m_specific_param.m_decoder.m_default_tcp;\n        l_image = p_j2k->m_private_image;\n\n        l_comp_room = l_image->numcomps <= 256 ? 1 : 2;\n\n        /* make sure room is sufficient*/\n        if (p_header_size < l_comp_room + 1) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading COC marker\\n\");\n                return OPJ_FALSE;\n        }\n        p_header_size -= l_comp_room + 1;\n\n        opj_read_bytes(p_header_data,&l_comp_no,l_comp_room);                   /* Ccoc */\n        p_header_data += l_comp_room;\n        if (l_comp_no >= l_image->numcomps) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading COC marker (bad number of components)\\n\");\n                return OPJ_FALSE;\n        }\n\n        opj_read_bytes(p_header_data,&l_tcp->tccps[l_comp_no].csty,1);                  /* Scoc */\n        ++p_header_data ;\n\n        if (! opj_j2k_read_SPCod_SPCoc(p_j2k,l_comp_no,p_header_data,&p_header_size,p_manager)) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading COC marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        if (p_header_size != 0) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading COC marker\\n\");\n                return OPJ_FALSE;\n        }\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_write_qcd(     opj_j2k_t *p_j2k,\n                                                        opj_stream_private_t *p_stream,\n                                                        opj_event_mgr_t * p_manager\n                            )\n{\n        OPJ_UINT32 l_qcd_size,l_remaining_size;\n        OPJ_BYTE * l_current_data = 00;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        l_qcd_size = 4 + opj_j2k_get_SQcd_SQcc_size(p_j2k,p_j2k->m_current_tile_number,0);\n        l_remaining_size = l_qcd_size;\n\n        if (l_qcd_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {\n                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcd_size);\n                if (! new_header_tile_data) {\n                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);\n                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;\n                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;\n                        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to write QCD marker\\n\");\n                        return OPJ_FALSE;\n                }\n                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;\n                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_qcd_size;\n        }\n\n        l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;\n\n        opj_write_bytes(l_current_data,J2K_MS_QCD,2);           /* QCD */\n        l_current_data += 2;\n\n        opj_write_bytes(l_current_data,l_qcd_size-2,2);         /* L_QCD */\n        l_current_data += 2;\n\n        l_remaining_size -= 4;\n\n        if (! opj_j2k_write_SQcd_SQcc(p_j2k,p_j2k->m_current_tile_number,0,l_current_data,&l_remaining_size,p_manager)) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error writing QCD marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        if (l_remaining_size != 0) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error writing QCD marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        if (opj_stream_write_data(p_stream, p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_qcd_size,p_manager) != l_qcd_size) {\n                return OPJ_FALSE;\n        }\n\n        return OPJ_TRUE;\n}\n\n/**\n * Reads a QCD marker (Quantization defaults)\n * @param       p_header_data   the data contained in the QCD box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the QCD marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_qcd (  opj_j2k_t *p_j2k,\n                                    OPJ_BYTE * p_header_data,\n                                    OPJ_UINT32 p_header_size,\n                                    opj_event_mgr_t * p_manager\n                                    )\n{\n        /* preconditions */\n        assert(p_header_data != 00);\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n\n        if (! opj_j2k_read_SQcd_SQcc(p_j2k,0,p_header_data,&p_header_size,p_manager)) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading QCD marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        if (p_header_size != 0) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading QCD marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        /* Apply the quantization parameters to other components of the current tile or the m_default_tcp */\n        opj_j2k_copy_tile_quantization_parameters(p_j2k);\n\n        return OPJ_TRUE;\n}\n\n#if 0\nOPJ_BOOL opj_j2k_write_qcc(     opj_j2k_t *p_j2k,\n                                                OPJ_UINT32 p_comp_no,\n                                                opj_stream_private_t *p_stream,\n                                                opj_event_mgr_t * p_manager\n                            )\n{\n        OPJ_UINT32 l_qcc_size,l_remaining_size;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        l_qcc_size = 5 + opj_j2k_get_SQcd_SQcc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no);\n        l_qcc_size += p_j2k->m_private_image->numcomps <= 256 ? 0:1;\n        l_remaining_size = l_qcc_size;\n\n        if (l_qcc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {\n                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcc_size);\n                if (! new_header_tile_data) {\n                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);\n                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;\n                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;\n                        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to write QCC marker\\n\");\n                        return OPJ_FALSE;\n                }\n                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;\n                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_qcc_size;\n        }\n\n        opj_j2k_write_qcc_in_memory(p_j2k,p_comp_no,p_j2k->m_specific_param.m_encoder.m_header_tile_data,&l_remaining_size,p_manager);\n\n        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_qcc_size,p_manager) != l_qcc_size) {\n                return OPJ_FALSE;\n        }\n\n        return OPJ_TRUE;\n}\n#endif\n\n#if 0\nvoid opj_j2k_write_qcc_in_memory(   opj_j2k_t *p_j2k,\n                                                                OPJ_UINT32 p_comp_no,\n                                                                OPJ_BYTE * p_data,\n                                                                OPJ_UINT32 * p_data_written,\n                                                                opj_event_mgr_t * p_manager\n                                    )\n{\n        OPJ_UINT32 l_qcc_size,l_remaining_size;\n        OPJ_BYTE * l_current_data = 00;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n\n        l_qcc_size = 6 + opj_j2k_get_SQcd_SQcc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no);\n        l_remaining_size = l_qcc_size;\n\n        l_current_data = p_data;\n\n        opj_write_bytes(l_current_data,J2K_MS_QCC,2);           /* QCC */\n        l_current_data += 2;\n\n        if (p_j2k->m_private_image->numcomps <= 256) {\n                --l_qcc_size;\n\n                opj_write_bytes(l_current_data,l_qcc_size-2,2);         /* L_QCC */\n                l_current_data += 2;\n\n                opj_write_bytes(l_current_data, p_comp_no, 1);  /* Cqcc */\n                ++l_current_data;\n\n                /* in the case only one byte is sufficient the last byte allocated is useless -> still do -6 for available */\n                l_remaining_size -= 6;\n        }\n        else {\n                opj_write_bytes(l_current_data,l_qcc_size-2,2);         /* L_QCC */\n                l_current_data += 2;\n\n                opj_write_bytes(l_current_data, p_comp_no, 2);  /* Cqcc */\n                l_current_data+=2;\n\n                l_remaining_size -= 6;\n        }\n\n        opj_j2k_write_SQcd_SQcc(p_j2k,p_j2k->m_current_tile_number,p_comp_no,l_current_data,&l_remaining_size,p_manager);\n\n        *p_data_written = l_qcc_size;\n}\n#endif\n\nOPJ_UINT32 opj_j2k_get_max_qcc_size (opj_j2k_t *p_j2k)\n{\n        return opj_j2k_get_max_coc_size(p_j2k);\n}\n\n/**\n * Reads a QCC marker (Quantization component)\n * @param       p_header_data   the data contained in the QCC box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the QCC marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_qcc(   opj_j2k_t *p_j2k,\n                                    OPJ_BYTE * p_header_data,\n                                    OPJ_UINT32 p_header_size,\n                                    opj_event_mgr_t * p_manager\n                                    )\n{\n        OPJ_UINT32 l_num_comp,l_comp_no;\n\n        /* preconditions */\n        assert(p_header_data != 00);\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n\n        l_num_comp = p_j2k->m_private_image->numcomps;\n\n        if (l_num_comp <= 256) {\n                if (p_header_size < 1) {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Error reading QCC marker\\n\");\n                        return OPJ_FALSE;\n                }\n                opj_read_bytes(p_header_data,&l_comp_no,1);\n                ++p_header_data;\n                --p_header_size;\n        }\n        else {\n                if (p_header_size < 2) {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Error reading QCC marker\\n\");\n                        return OPJ_FALSE;\n                }\n                opj_read_bytes(p_header_data,&l_comp_no,2);\n                p_header_data+=2;\n                p_header_size-=2;\n        }\n\n#ifdef USE_JPWL\n        if (p_j2k->m_cp.correct) {\n\n                static OPJ_UINT32 backup_compno = 0;\n\n                /* compno is negative or larger than the number of components!!! */\n                if (/*(l_comp_no < 0) ||*/ (l_comp_no >= l_num_comp)) {\n                        opj_event_msg(p_manager, EVT_ERROR,\n                                \"JPWL: bad component number in QCC (%d out of a maximum of %d)\\n\",\n                                l_comp_no, l_num_comp);\n                        if (!JPWL_ASSUME) {\n                                opj_event_msg(p_manager, EVT_ERROR, \"JPWL: giving up\\n\");\n                                return OPJ_FALSE;\n                        }\n                        /* we try to correct */\n                        l_comp_no = backup_compno % l_num_comp;\n                        opj_event_msg(p_manager, EVT_WARNING, \"- trying to adjust this\\n\"\n                                \"- setting component number to %d\\n\",\n                                l_comp_no);\n                }\n\n                /* keep your private count of tiles */\n                backup_compno++;\n        };\n#endif /* USE_JPWL */\n\n        if (l_comp_no >= p_j2k->m_private_image->numcomps) {\n                opj_event_msg(p_manager, EVT_ERROR,\n                              \"Invalid component number: %d, regarding the number of components %d\\n\",\n                              l_comp_no, p_j2k->m_private_image->numcomps);\n                return OPJ_FALSE;\n        }\n\n        if (! opj_j2k_read_SQcd_SQcc(p_j2k,l_comp_no,p_header_data,&p_header_size,p_manager)) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading QCC marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        if (p_header_size != 0) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading QCC marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_write_poc(     opj_j2k_t *p_j2k,\n                                                        opj_stream_private_t *p_stream,\n                                                        opj_event_mgr_t * p_manager\n                            )\n{\n        OPJ_UINT32 l_nb_comp;\n        OPJ_UINT32 l_nb_poc;\n        OPJ_UINT32 l_poc_size;\n        OPJ_UINT32 l_written_size = 0;\n        opj_tcp_t *l_tcp = 00;\n        OPJ_UINT32 l_poc_room;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        l_tcp = &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number];\n        l_nb_comp = p_j2k->m_private_image->numcomps;\n        l_nb_poc = 1 + l_tcp->numpocs;\n\n        if (l_nb_comp <= 256) {\n                l_poc_room = 1;\n        }\n        else {\n                l_poc_room = 2;\n        }\n        l_poc_size = 4 + (5 + 2 * l_poc_room) * l_nb_poc;\n\n        if (l_poc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {\n                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_poc_size);\n                if (! new_header_tile_data) {\n                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);\n                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;\n                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;\n                        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to write POC marker\\n\");\n                        return OPJ_FALSE;\n                }\n                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;\n                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_poc_size;\n        }\n\n        opj_j2k_write_poc_in_memory(p_j2k,p_j2k->m_specific_param.m_encoder.m_header_tile_data,&l_written_size,p_manager);\n\n        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_poc_size,p_manager) != l_poc_size) {\n                return OPJ_FALSE;\n        }\n\n        return OPJ_TRUE;\n}\n\nvoid opj_j2k_write_poc_in_memory(   opj_j2k_t *p_j2k,\n                                                                OPJ_BYTE * p_data,\n                                                                OPJ_UINT32 * p_data_written,\n                                                                opj_event_mgr_t * p_manager\n                                    )\n{\n        OPJ_UINT32 i;\n        OPJ_BYTE * l_current_data = 00;\n        OPJ_UINT32 l_nb_comp;\n        OPJ_UINT32 l_nb_poc;\n        OPJ_UINT32 l_poc_size;\n        opj_image_t *l_image = 00;\n        opj_tcp_t *l_tcp = 00;\n        opj_tccp_t *l_tccp = 00;\n        opj_poc_t *l_current_poc = 00;\n        OPJ_UINT32 l_poc_room;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n\n        l_tcp = &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number];\n        l_tccp = &l_tcp->tccps[0];\n        l_image = p_j2k->m_private_image;\n        l_nb_comp = l_image->numcomps;\n        l_nb_poc = 1 + l_tcp->numpocs;\n\n        if (l_nb_comp <= 256) {\n                l_poc_room = 1;\n        }\n        else {\n                l_poc_room = 2;\n        }\n\n        l_poc_size = 4 + (5 + 2 * l_poc_room) * l_nb_poc;\n\n        l_current_data = p_data;\n\n        opj_write_bytes(l_current_data,J2K_MS_POC,2);                                   /* POC  */\n        l_current_data += 2;\n\n        opj_write_bytes(l_current_data,l_poc_size-2,2);                                 /* Lpoc */\n        l_current_data += 2;\n\n        l_current_poc =  l_tcp->pocs;\n        for (i = 0; i < l_nb_poc; ++i) {\n                opj_write_bytes(l_current_data,l_current_poc->resno0,1);                                /* RSpoc_i */\n                ++l_current_data;\n\n                opj_write_bytes(l_current_data,l_current_poc->compno0,l_poc_room);              /* CSpoc_i */\n                l_current_data+=l_poc_room;\n\n                opj_write_bytes(l_current_data,l_current_poc->layno1,2);                                /* LYEpoc_i */\n                l_current_data+=2;\n\n                opj_write_bytes(l_current_data,l_current_poc->resno1,1);                                /* REpoc_i */\n                ++l_current_data;\n\n                opj_write_bytes(l_current_data,l_current_poc->compno1,l_poc_room);              /* CEpoc_i */\n                l_current_data+=l_poc_room;\n\n                opj_write_bytes(l_current_data,l_current_poc->prg,1);                                   /* Ppoc_i */\n                ++l_current_data;\n\n                /* change the value of the max layer according to the actual number of layers in the file, components and resolutions*/\n                l_current_poc->layno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)l_current_poc->layno1, (OPJ_INT32)l_tcp->numlayers);\n                l_current_poc->resno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)l_current_poc->resno1, (OPJ_INT32)l_tccp->numresolutions);\n                l_current_poc->compno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)l_current_poc->compno1, (OPJ_INT32)l_nb_comp);\n\n                ++l_current_poc;\n        }\n\n        *p_data_written = l_poc_size;\n}\n\nOPJ_UINT32 opj_j2k_get_max_poc_size(opj_j2k_t *p_j2k)\n{\n        opj_tcp_t * l_tcp = 00;\n        OPJ_UINT32 l_nb_tiles = 0;\n        OPJ_UINT32 l_max_poc = 0;\n        OPJ_UINT32 i;\n\n        l_tcp = p_j2k->m_cp.tcps;\n        l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;\n\n        for (i=0;i<l_nb_tiles;++i) {\n                l_max_poc = opj_uint_max(l_max_poc,l_tcp->numpocs);\n                ++l_tcp;\n        }\n\n        ++l_max_poc;\n\n        return 4 + 9 * l_max_poc;\n}\n\nOPJ_UINT32 opj_j2k_get_max_toc_size (opj_j2k_t *p_j2k)\n{\n        OPJ_UINT32 i;\n        OPJ_UINT32 l_nb_tiles;\n        OPJ_UINT32 l_max = 0;\n        opj_tcp_t * l_tcp = 00;\n\n        l_tcp = p_j2k->m_cp.tcps;\n        l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th ;\n\n        for (i=0;i<l_nb_tiles;++i) {\n                l_max = opj_uint_max(l_max,l_tcp->m_nb_tile_parts);\n\n                ++l_tcp;\n        }\n\n        return 12 * l_max;\n}\n\nOPJ_UINT32 opj_j2k_get_specific_header_sizes(opj_j2k_t *p_j2k)\n{\n        OPJ_UINT32 l_nb_bytes = 0;\n        OPJ_UINT32 l_nb_comps;\n        OPJ_UINT32 l_coc_bytes,l_qcc_bytes;\n\n        l_nb_comps = p_j2k->m_private_image->numcomps - 1;\n        l_nb_bytes += opj_j2k_get_max_toc_size(p_j2k);\n\n        if (p_j2k->m_cp.m_specific_param.m_enc.m_cinema == 0) {\n                l_coc_bytes = opj_j2k_get_max_coc_size(p_j2k);\n                l_nb_bytes += l_nb_comps * l_coc_bytes;\n\n                l_qcc_bytes = opj_j2k_get_max_qcc_size(p_j2k);\n                l_nb_bytes += l_nb_comps * l_qcc_bytes;\n        }\n\n        l_nb_bytes += opj_j2k_get_max_poc_size(p_j2k);\n\n        /*** DEVELOPER CORNER, Add room for your headers ***/\n\n        return l_nb_bytes;\n}\n\n/**\n * Reads a POC marker (Progression Order Change)\n *\n * @param       p_header_data   the data contained in the POC box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the POC marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_poc (  opj_j2k_t *p_j2k,\n                                    OPJ_BYTE * p_header_data,\n                                    OPJ_UINT32 p_header_size,\n                                    opj_event_mgr_t * p_manager\n                                    )\n{\n        OPJ_UINT32 i, l_nb_comp, l_tmp;\n        opj_image_t * l_image = 00;\n        OPJ_UINT32 l_old_poc_nb, l_current_poc_nb, l_current_poc_remaining;\n        OPJ_UINT32 l_chunk_size, l_comp_room;\n\n        opj_cp_t *l_cp = 00;\n        opj_tcp_t *l_tcp = 00;\n        opj_poc_t *l_current_poc = 00;\n\n        /* preconditions */\n        assert(p_header_data != 00);\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n\n        l_image = p_j2k->m_private_image;\n        l_nb_comp = l_image->numcomps;\n        if (l_nb_comp <= 256) {\n                l_comp_room = 1;\n        }\n        else {\n                l_comp_room = 2;\n        }\n        l_chunk_size = 5 + 2 * l_comp_room;\n        l_current_poc_nb = p_header_size / l_chunk_size;\n        l_current_poc_remaining = p_header_size % l_chunk_size;\n\n        if ((l_current_poc_nb <= 0) || (l_current_poc_remaining != 0)) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading POC marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        l_cp = &(p_j2k->m_cp);\n        l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?\n                                &l_cp->tcps[p_j2k->m_current_tile_number] :\n                                p_j2k->m_specific_param.m_decoder.m_default_tcp;\n        l_old_poc_nb = l_tcp->POC ? l_tcp->numpocs + 1 : 0;\n        l_current_poc_nb += l_old_poc_nb;\n\n        if(l_current_poc_nb >= 32)\n          {\n          opj_event_msg(p_manager, EVT_ERROR, \"Too many POCs %d\\n\", l_current_poc_nb);\n          return OPJ_FALSE;\n          }\n        assert(l_current_poc_nb < 32);\n\n        /* now poc is in use.*/\n        l_tcp->POC = 1;\n\n        l_current_poc = &l_tcp->pocs[l_old_poc_nb];\n        for     (i = l_old_poc_nb; i < l_current_poc_nb; ++i) {\n                opj_read_bytes(p_header_data,&(l_current_poc->resno0),1);                               /* RSpoc_i */\n                ++p_header_data;\n                opj_read_bytes(p_header_data,&(l_current_poc->compno0),l_comp_room);    /* CSpoc_i */\n                p_header_data+=l_comp_room;\n                opj_read_bytes(p_header_data,&(l_current_poc->layno1),2);                               /* LYEpoc_i */\n                /* make sure layer end is in acceptable bounds */\n                l_current_poc->layno1 = opj_uint_min(l_current_poc->layno1, l_tcp->numlayers);\n                p_header_data+=2;\n                opj_read_bytes(p_header_data,&(l_current_poc->resno1),1);                               /* REpoc_i */\n                ++p_header_data;\n                opj_read_bytes(p_header_data,&(l_current_poc->compno1),l_comp_room);    /* CEpoc_i */\n                p_header_data+=l_comp_room;\n                opj_read_bytes(p_header_data,&l_tmp,1);                                                                 /* Ppoc_i */\n                ++p_header_data;\n                l_current_poc->prg = (OPJ_PROG_ORDER) l_tmp;\n                /* make sure comp is in acceptable bounds */\n                l_current_poc->compno1 = opj_uint_min(l_current_poc->compno1, l_nb_comp);\n                ++l_current_poc;\n        }\n\n        l_tcp->numpocs = l_current_poc_nb - 1;\n        return OPJ_TRUE;\n}\n\n/**\n * Reads a CRG marker (Component registration)\n *\n * @param       p_header_data   the data contained in the TLM box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the TLM marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_crg (  opj_j2k_t *p_j2k,\n                                    OPJ_BYTE * p_header_data,\n                                    OPJ_UINT32 p_header_size,\n                                    opj_event_mgr_t * p_manager\n                                    )\n{\n        OPJ_UINT32 l_nb_comp;\n        /* preconditions */\n        assert(p_header_data != 00);\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n\n        l_nb_comp = p_j2k->m_private_image->numcomps;\n\n        if (p_header_size != l_nb_comp *4) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading CRG marker\\n\");\n                return OPJ_FALSE;\n        }\n        /* Do not care of this at the moment since only local variables are set here */\n        /*\n        for\n                (i = 0; i < l_nb_comp; ++i)\n        {\n                opj_read_bytes(p_header_data,&l_Xcrg_i,2);                              // Xcrg_i\n                p_header_data+=2;\n                opj_read_bytes(p_header_data,&l_Ycrg_i,2);                              // Xcrg_i\n                p_header_data+=2;\n        }\n        */\n        return OPJ_TRUE;\n}\n\n/**\n * Reads a TLM marker (Tile Length Marker)\n *\n * @param       p_header_data   the data contained in the TLM box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the TLM marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_tlm (  opj_j2k_t *p_j2k,\n                                    OPJ_BYTE * p_header_data,\n                                    OPJ_UINT32 p_header_size,\n                                    opj_event_mgr_t * p_manager\n                                    )\n{\n        OPJ_UINT32 l_Ztlm, l_Stlm, l_ST, l_SP, l_tot_num_tp_remaining, l_quotient, l_Ptlm_size;\n        /* preconditions */\n        assert(p_header_data != 00);\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n\n        if (p_header_size < 2) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading TLM marker\\n\");\n                return OPJ_FALSE;\n        }\n        p_header_size -= 2;\n\n        opj_read_bytes(p_header_data,&l_Ztlm,1);                                /* Ztlm */\n        ++p_header_data;\n        opj_read_bytes(p_header_data,&l_Stlm,1);                                /* Stlm */\n        ++p_header_data;\n\n        l_ST = ((l_Stlm >> 4) & 0x3);\n        l_SP = (l_Stlm >> 6) & 0x1;\n\n        l_Ptlm_size = (l_SP + 1) * 2;\n        l_quotient = l_Ptlm_size + l_ST;\n\n        l_tot_num_tp_remaining = p_header_size % l_quotient;\n\n        if (l_tot_num_tp_remaining != 0) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading TLM marker\\n\");\n                return OPJ_FALSE;\n        }\n        /* FIXME Do not care of this at the moment since only local variables are set here */\n        /*\n        for\n                (i = 0; i < l_tot_num_tp; ++i)\n        {\n                opj_read_bytes(p_header_data,&l_Ttlm_i,l_ST);                           // Ttlm_i\n                p_header_data += l_ST;\n                opj_read_bytes(p_header_data,&l_Ptlm_i,l_Ptlm_size);            // Ptlm_i\n                p_header_data += l_Ptlm_size;\n        }*/\n        return OPJ_TRUE;\n}\n\n/**\n * Reads a PLM marker (Packet length, main header marker)\n *\n * @param       p_header_data   the data contained in the TLM box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the TLM marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_plm (  opj_j2k_t *p_j2k,\n                                    OPJ_BYTE * p_header_data,\n                                    OPJ_UINT32 p_header_size,\n                                    opj_event_mgr_t * p_manager\n                                    )\n{\n        /* preconditions */\n        assert(p_header_data != 00);\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n\n        if (p_header_size < 1) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading PLM marker\\n\");\n                return OPJ_FALSE;\n        }\n        /* Do not care of this at the moment since only local variables are set here */\n        /*\n        opj_read_bytes(p_header_data,&l_Zplm,1);                                        // Zplm\n        ++p_header_data;\n        --p_header_size;\n\n        while\n                (p_header_size > 0)\n        {\n                opj_read_bytes(p_header_data,&l_Nplm,1);                                // Nplm\n                ++p_header_data;\n                p_header_size -= (1+l_Nplm);\n                if\n                        (p_header_size < 0)\n                {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Error reading PLM marker\\n\");\n                        return false;\n                }\n                for\n                        (i = 0; i < l_Nplm; ++i)\n                {\n                        opj_read_bytes(p_header_data,&l_tmp,1);                         // Iplm_ij\n                        ++p_header_data;\n                        // take only the last seven bytes\n                        l_packet_len |= (l_tmp & 0x7f);\n                        if\n                                (l_tmp & 0x80)\n                        {\n                                l_packet_len <<= 7;\n                        }\n                        else\n                        {\n                // store packet length and proceed to next packet\n                                l_packet_len = 0;\n                        }\n                }\n                if\n                        (l_packet_len != 0)\n                {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Error reading PLM marker\\n\");\n                        return false;\n                }\n        }\n        */\n        return OPJ_TRUE;\n}\n\n/**\n * Reads a PLT marker (Packet length, tile-part header)\n *\n * @param       p_header_data   the data contained in the PLT box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the PLT marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_plt (  opj_j2k_t *p_j2k,\n                                    OPJ_BYTE * p_header_data,\n                                    OPJ_UINT32 p_header_size,\n                                    opj_event_mgr_t * p_manager\n                                    )\n{\n        OPJ_UINT32 l_Zplt, l_tmp, l_packet_len = 0, i;\n\n        /* preconditions */\n        assert(p_header_data != 00);\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n\n        if (p_header_size < 1) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading PLT marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        opj_read_bytes(p_header_data,&l_Zplt,1);                /* Zplt */\n        ++p_header_data;\n        --p_header_size;\n\n        for (i = 0; i < p_header_size; ++i) {\n                opj_read_bytes(p_header_data,&l_tmp,1);         /* Iplt_ij */\n                ++p_header_data;\n                /* take only the last seven bytes */\n                l_packet_len |= (l_tmp & 0x7f);\n                if (l_tmp & 0x80) {\n                        l_packet_len <<= 7;\n                }\n                else {\n            /* store packet length and proceed to next packet */\n                        l_packet_len = 0;\n                }\n        }\n\n        if (l_packet_len != 0) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading PLT marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        return OPJ_TRUE;\n}\n\n#if 0\nOPJ_BOOL j2k_read_ppm_v2 (\n                                                opj_j2k_t *p_j2k,\n                                                OPJ_BYTE * p_header_data,\n                                                OPJ_UINT32 p_header_size,\n                                                struct opj_event_mgr * p_manager\n                                        )\n{\n\n        opj_cp_t *l_cp = 00;\n        OPJ_UINT32 l_remaining_data, l_Z_ppm, l_N_ppm;\n\n        /* preconditions */\n        assert(p_header_data != 00);\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n\n        if (p_header_size < 1) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading PPM marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        l_cp = &(p_j2k->m_cp);\n        l_cp->ppm = 1;\n\n        opj_read_bytes(p_header_data,&l_Z_ppm,1);               /* Z_ppm */\n        ++p_header_data;\n        --p_header_size;\n\n        /* First PPM marker */\n        if (l_Z_ppm == 0) {\n                if (p_header_size < 4) {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Error reading PPM marker\\n\");\n                        return OPJ_FALSE;\n                }\n\n                opj_read_bytes(p_header_data,&l_N_ppm,4);               /* N_ppm */\n                p_header_data+=4;\n                p_header_size-=4;\n\n                /* First PPM marker: Initialization */\n                l_cp->ppm_len = l_N_ppm;\n                l_cp->ppm_data_size = 0;\n\n                l_cp->ppm_buffer = (OPJ_BYTE *) opj_malloc(l_cp->ppm_len);\n                if (l_cp->ppm_buffer == 00) {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory reading ppm marker\\n\");\n                        return OPJ_FALSE;\n                }\n                memset(l_cp->ppm_buffer,0,l_cp->ppm_len);\n\n                l_cp->ppm_data = l_cp->ppm_buffer;\n        }\n\n        while (1) {\n                if (l_cp->ppm_data_size == l_cp->ppm_len) {\n                        if (p_header_size >= 4) {\n                                /* read a N_ppm */\n                                opj_read_bytes(p_header_data,&l_N_ppm,4);               /* N_ppm */\n                                p_header_data+=4;\n                                p_header_size-=4;\n                                l_cp->ppm_len += l_N_ppm ;\n\n                                OPJ_BYTE *new_ppm_buffer = (OPJ_BYTE *) opj_realloc(l_cp->ppm_buffer, l_cp->ppm_len);\n                                if (! new_ppm_buffer) {\n                                        opj_free(l_cp->ppm_buffer);\n                                        l_cp->ppm_buffer = NULL;\n                                        l_cp->ppm_len = 0;\n                                        l_cp->ppm_data = NULL;\n                                        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory reading ppm marker\\n\");\n                                        return OPJ_FALSE;\n                                }\n                                l_cp->ppm_buffer = new_ppm_buffer;\n                                memset(l_cp->ppm_buffer+l_cp->ppm_data_size,0,l_N_ppm);\n                                l_cp->ppm_data = l_cp->ppm_buffer;\n                        }\n                        else {\n                                return OPJ_FALSE;\n                        }\n                }\n\n                l_remaining_data = l_cp->ppm_len - l_cp->ppm_data_size;\n\n                if (l_remaining_data <= p_header_size) {\n                        /* we must store less information than available in the packet */\n                        memcpy(l_cp->ppm_buffer + l_cp->ppm_data_size , p_header_data , l_remaining_data);\n                        l_cp->ppm_data_size = l_cp->ppm_len;\n                        p_header_size -= l_remaining_data;\n                        p_header_data += l_remaining_data;\n                }\n                else {\n                        memcpy(l_cp->ppm_buffer + l_cp->ppm_data_size , p_header_data , p_header_size);\n                        l_cp->ppm_data_size += p_header_size;\n                        p_header_data += p_header_size;\n                        p_header_size = 0;\n                        break;\n                }\n        }\n\n        return OPJ_TRUE;\n}\n#endif\n\nOPJ_BOOL j2k_read_ppm_v3 (\n                                                opj_j2k_t *p_j2k,\n                                                OPJ_BYTE * p_header_data,\n                                                OPJ_UINT32 p_header_size,\n                                                struct opj_event_mgr * p_manager\n                                        )\n{\n        opj_cp_t *l_cp = 00;\n        OPJ_UINT32 l_remaining_data, l_Z_ppm, l_N_ppm;\n\n        /* preconditions */\n        assert(p_header_data != 00);\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n\n        /* Minimum size of PPM marker is equal to the size of Zppm element */\n        if (p_header_size < 1) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading PPM marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        l_cp = &(p_j2k->m_cp);\n        l_cp->ppm = 1;\n\n        opj_read_bytes(p_header_data,&l_Z_ppm,1);               /* Z_ppm */\n        ++p_header_data;\n        --p_header_size;\n\n        /* First PPM marker */\n        if (l_Z_ppm == 0) {\n                /* We need now at least the Nppm^0 element */\n                if (p_header_size < 4) {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Error reading PPM marker\\n\");\n                        return OPJ_FALSE;\n                }\n\n                opj_read_bytes(p_header_data,&l_N_ppm,4);               /* First N_ppm */\n                p_header_data+=4;\n                p_header_size-=4;\n\n                /* sanity check: how much bytes is left for Ippm */\n                if( p_header_size < l_N_ppm )\n                  {\n                  opj_event_msg(p_manager, EVT_ERROR, \"Not enough bytes (%u) to hold Ippm series (%u), Index (%d)\\n\", p_header_size, l_N_ppm, l_Z_ppm );\n                  opj_free(l_cp->ppm_data);\n                  l_cp->ppm_data = NULL;\n                  l_cp->ppm_buffer = NULL;\n                  l_cp->ppm = 0; /* do not use PPM */\n                  return OPJ_FALSE;\n                  }\n\n                /* First PPM marker: Initialization */\n                l_cp->ppm_len = l_N_ppm;\n                l_cp->ppm_data_read = 0;\n\n                l_cp->ppm_data = (OPJ_BYTE *) opj_malloc(l_cp->ppm_len);\n                l_cp->ppm_buffer = l_cp->ppm_data;\n                if (l_cp->ppm_data == 00) {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to read ppm marker\\n\");\n                        return OPJ_FALSE;\n                }\n                memset(l_cp->ppm_data,0,l_cp->ppm_len);\n\n                l_cp->ppm_data_current = l_cp->ppm_data;\n\n                /*l_cp->ppm_data = l_cp->ppm_buffer;*/\n        }\n        else {\n                if (p_header_size < 4) {\n                        opj_event_msg(p_manager, EVT_WARNING, \"Empty PPM marker\\n\");\n                        return OPJ_TRUE;\n                }\n                else {\n                        /* Uncompleted Ippm series in the previous PPM marker?*/\n                        if (l_cp->ppm_data_read < l_cp->ppm_len) {\n                                /* Get the place where add the remaining Ippm series*/\n                                l_cp->ppm_data_current = &(l_cp->ppm_data[l_cp->ppm_data_read]);\n                                l_N_ppm = l_cp->ppm_len - l_cp->ppm_data_read;\n                        }\n                        else {\n                                OPJ_BYTE *new_ppm_data;\n                                opj_read_bytes(p_header_data,&l_N_ppm,4);               /* First N_ppm */\n                                p_header_data+=4;\n                                p_header_size-=4;\n\n                                /* sanity check: how much bytes is left for Ippm */\n                                if( p_header_size < l_N_ppm )\n                                  {\n                                  opj_event_msg(p_manager, EVT_ERROR, \"Not enough bytes (%u) to hold Ippm series (%u), Index (%d)\\n\", p_header_size, l_N_ppm, l_Z_ppm );\n                                  opj_free(l_cp->ppm_data);\n                                  l_cp->ppm_data = NULL;\n                                  l_cp->ppm_buffer = NULL;\n                                  l_cp->ppm = 0; /* do not use PPM */\n                                  return OPJ_FALSE;\n                                  }\n                                /* Increase the size of ppm_data to add the new Ippm series*/\n                                assert(l_cp->ppm_data == l_cp->ppm_buffer && \"We need ppm_data and ppm_buffer to be the same when reallocating\");\n                                new_ppm_data = (OPJ_BYTE *) opj_realloc(l_cp->ppm_data, l_cp->ppm_len + l_N_ppm);\n                                if (! new_ppm_data) {\n                                        opj_free(l_cp->ppm_data);\n                                        l_cp->ppm_data = NULL;\n                                        l_cp->ppm_buffer = NULL;  /* TODO: no need for a new local variable: ppm_buffer and ppm_data are enough */\n                                        l_cp->ppm_len = 0;\n                                        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to increase the size of ppm_data to add the new Ippm series\\n\");\n                                        return OPJ_FALSE;\n                                }\n                                l_cp->ppm_data = new_ppm_data;\n                                l_cp->ppm_buffer = l_cp->ppm_data;\n\n                                /* Keep the position of the place where concatenate the new series*/\n                                l_cp->ppm_data_current = &(l_cp->ppm_data[l_cp->ppm_len]);\n                                l_cp->ppm_len += l_N_ppm;\n                        }\n                }\n        }\n\n        l_remaining_data = p_header_size;\n\n        while (l_remaining_data >= l_N_ppm) {\n                /* read a complete Ippm series*/\n                memcpy(l_cp->ppm_data_current, p_header_data, l_N_ppm);\n                p_header_size -= l_N_ppm;\n                p_header_data += l_N_ppm;\n\n                l_cp->ppm_data_read += l_N_ppm; /* Increase the number of data read*/\n\n                if (p_header_size)\n                {\n\t\t\t\t\t\tif (p_header_size < 4) return OPJ_FALSE;\n                        opj_read_bytes(p_header_data,&l_N_ppm,4);               /* N_ppm^i */\n                        p_header_data+=4;\n                        p_header_size-=4;\n                }\n                else {\n                        l_remaining_data = p_header_size;\n                        break;\n                }\n\n                l_remaining_data = p_header_size;\n\n                /* Next Ippm series is a complete series ?*/\n                if (l_remaining_data >= l_N_ppm) {\n                        OPJ_BYTE *new_ppm_data;\n                        /* Increase the size of ppm_data to add the new Ippm series*/\n                        assert(l_cp->ppm_data == l_cp->ppm_buffer && \"We need ppm_data and ppm_buffer to be the same when reallocating\");\n                        new_ppm_data = (OPJ_BYTE *) opj_realloc(l_cp->ppm_data, l_cp->ppm_len + l_N_ppm);\n                        if (! new_ppm_data) {\n                                opj_free(l_cp->ppm_data);\n                                l_cp->ppm_data = NULL;\n                                l_cp->ppm_buffer = NULL;  /* TODO: no need for a new local variable: ppm_buffer and ppm_data are enough */\n                                l_cp->ppm_len = 0;\n                                opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to increase the size of ppm_data to add the new (complete) Ippm series\\n\");\n                                return OPJ_FALSE;\n                        }\n                        l_cp->ppm_data = new_ppm_data;\n                        l_cp->ppm_buffer = l_cp->ppm_data;\n\n                        /* Keep the position of the place where concatenate the new series */\n                        l_cp->ppm_data_current = &(l_cp->ppm_data[l_cp->ppm_len]);\n                        l_cp->ppm_len += l_N_ppm;\n                }\n\n        }\n\n        /* Need to read an incomplete Ippm series*/\n        if (l_remaining_data) {\n                OPJ_BYTE *new_ppm_data;\n                assert(l_cp->ppm_data == l_cp->ppm_buffer && \"We need ppm_data and ppm_buffer to be the same when reallocating\");\n                new_ppm_data = (OPJ_BYTE *) opj_realloc(l_cp->ppm_data, l_cp->ppm_len + l_N_ppm);\n                if (! new_ppm_data) {\n                        opj_free(l_cp->ppm_data);\n                        l_cp->ppm_data = NULL;\n                        l_cp->ppm_buffer = NULL;  /* TODO: no need for a new local variable: ppm_buffer and ppm_data are enough */\n                        l_cp->ppm_len = 0;\n                        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to increase the size of ppm_data to add the new (incomplete) Ippm series\\n\");\n                        return OPJ_FALSE;\n                }\n                l_cp->ppm_data = new_ppm_data;\n                l_cp->ppm_buffer = l_cp->ppm_data;\n\n                /* Keep the position of the place where concatenate the new series*/\n                l_cp->ppm_data_current = &(l_cp->ppm_data[l_cp->ppm_len]);\n                l_cp->ppm_len += l_N_ppm;\n\n                /* Read incomplete Ippm series*/\n                memcpy(l_cp->ppm_data_current, p_header_data, l_remaining_data);\n                p_header_size -= l_remaining_data;\n                p_header_data += l_remaining_data;\n\n                l_cp->ppm_data_read += l_remaining_data; /* Increase the number of data read*/\n        }\n\n#ifdef CLEAN_MSD\n\n                if (l_cp->ppm_data_size == l_cp->ppm_len) {\n                        if (p_header_size >= 4) {\n                                /* read a N_ppm*/\n                                opj_read_bytes(p_header_data,&l_N_ppm,4);               /* N_ppm */\n                                p_header_data+=4;\n                                p_header_size-=4;\n                                l_cp->ppm_len += l_N_ppm ;\n\n                                OPJ_BYTE *new_ppm_buffer = (OPJ_BYTE *) opj_realloc(l_cp->ppm_buffer, l_cp->ppm_len);\n                                if (! new_ppm_buffer) {\n                                        opj_free(l_cp->ppm_buffer);\n                                        l_cp->ppm_buffer = NULL;\n                                        l_cp->ppm_len = 0;\n                                        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to read ppm marker\\n\");\n                                        return OPJ_FALSE;\n                                }\n                                l_cp->ppm_buffer = new_ppm_buffer;\n                                memset(l_cp->ppm_buffer+l_cp->ppm_data_size,0,l_N_ppm);\n\n                                l_cp->ppm_data = l_cp->ppm_buffer;\n                        }\n                        else {\n                                return OPJ_FALSE;\n                        }\n                }\n\n                l_remaining_data = l_cp->ppm_len - l_cp->ppm_data_size;\n\n                if (l_remaining_data <= p_header_size) {\n                        /* we must store less information than available in the packet */\n                        memcpy(l_cp->ppm_buffer + l_cp->ppm_data_size , p_header_data , l_remaining_data);\n                        l_cp->ppm_data_size = l_cp->ppm_len;\n                        p_header_size -= l_remaining_data;\n                        p_header_data += l_remaining_data;\n                }\n                else {\n                        memcpy(l_cp->ppm_buffer + l_cp->ppm_data_size , p_header_data , p_header_size);\n                        l_cp->ppm_data_size += p_header_size;\n                        p_header_data += p_header_size;\n                        p_header_size = 0;\n                        break;\n                }\n        }\n#endif\n        return OPJ_TRUE;\n}\n\n/**\n * Reads a PPT marker (Packed packet headers, tile-part header)\n *\n * @param       p_header_data   the data contained in the PPT box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the PPT marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_ppt (  opj_j2k_t *p_j2k,\n                                    OPJ_BYTE * p_header_data,\n                                    OPJ_UINT32 p_header_size,\n                                    opj_event_mgr_t * p_manager\n                                    )\n{\n        opj_cp_t *l_cp = 00;\n        opj_tcp_t *l_tcp = 00;\n        OPJ_UINT32 l_Z_ppt;\n\n        /* preconditions */\n        assert(p_header_data != 00);\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n\n        /* We need to have the Z_ppt element at minimum */\n        if (p_header_size < 1) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading PPT marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        l_cp = &(p_j2k->m_cp);\n        if (l_cp->ppm){\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading PPT marker: packet header have been previously found in the main header (PPM marker).\\n\");\n                return OPJ_FALSE;\n        }\n\n        l_tcp = &(l_cp->tcps[p_j2k->m_current_tile_number]);\n        l_tcp->ppt = 1;\n\n        opj_read_bytes(p_header_data,&l_Z_ppt,1);               /* Z_ppt */\n        ++p_header_data;\n        --p_header_size;\n\n        /* Allocate buffer to read the packet header */\n        if (l_Z_ppt == 0) {\n                /* First PPT marker */\n                l_tcp->ppt_data_size = 0;\n                l_tcp->ppt_len = p_header_size;\n\n                opj_free(l_tcp->ppt_buffer);\n                l_tcp->ppt_buffer = (OPJ_BYTE *) opj_calloc(l_tcp->ppt_len, sizeof(OPJ_BYTE) );\n                if (l_tcp->ppt_buffer == 00) {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to read PPT marker\\n\");\n                        return OPJ_FALSE;\n                }\n                l_tcp->ppt_data = l_tcp->ppt_buffer;\n\n                /* memset(l_tcp->ppt_buffer,0,l_tcp->ppt_len); */\n        }\n        else {\n                OPJ_BYTE *new_ppt_buffer;\n                l_tcp->ppt_len += p_header_size;\n\n                new_ppt_buffer = (OPJ_BYTE *) opj_realloc(l_tcp->ppt_buffer, l_tcp->ppt_len);\n                if (! new_ppt_buffer) {\n                        opj_free(l_tcp->ppt_buffer);\n                        l_tcp->ppt_buffer = NULL;\n                        l_tcp->ppt_len = 0;\n                        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to read PPT marker\\n\");\n                        return OPJ_FALSE;\n                }\n                l_tcp->ppt_buffer = new_ppt_buffer;\n                l_tcp->ppt_data = l_tcp->ppt_buffer;\n\n                memset(l_tcp->ppt_buffer+l_tcp->ppt_data_size,0,p_header_size);\n        }\n\n        /* Read packet header from buffer */\n        memcpy(l_tcp->ppt_buffer+l_tcp->ppt_data_size,p_header_data,p_header_size);\n\n        l_tcp->ppt_data_size += p_header_size;\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_write_tlm(     opj_j2k_t *p_j2k,\n                                                        opj_stream_private_t *p_stream,\n                                                        opj_event_mgr_t * p_manager\n                            )\n{\n        OPJ_BYTE * l_current_data = 00;\n        OPJ_UINT32 l_tlm_size;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        l_tlm_size = 6 + (5*p_j2k->m_specific_param.m_encoder.m_total_tile_parts);\n\n        if (l_tlm_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {\n                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_tlm_size);\n                if (! new_header_tile_data) {\n                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);\n                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;\n                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;\n                        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to write TLM marker\\n\");\n                        return OPJ_FALSE;\n                }\n                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;\n                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_tlm_size;\n        }\n\n        l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;\n\n        /* change the way data is written to avoid seeking if possible */\n        /* TODO */\n        p_j2k->m_specific_param.m_encoder.m_tlm_start = opj_stream_tell(p_stream);\n\n        opj_write_bytes(l_current_data,J2K_MS_TLM,2);                                   /* TLM */\n        l_current_data += 2;\n\n        opj_write_bytes(l_current_data,l_tlm_size-2,2);                                 /* Lpoc */\n        l_current_data += 2;\n\n        opj_write_bytes(l_current_data,0,1);                                                    /* Ztlm=0*/\n        ++l_current_data;\n\n        opj_write_bytes(l_current_data,0x50,1);                                                 /* Stlm ST=1(8bits-255 tiles max),SP=1(Ptlm=32bits) */\n        ++l_current_data;\n\n        /* do nothing on the 5 * l_j2k->m_specific_param.m_encoder.m_total_tile_parts remaining data */\n        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_tlm_size,p_manager) != l_tlm_size) {\n                return OPJ_FALSE;\n        }\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_write_sot(     opj_j2k_t *p_j2k,\n                                                        OPJ_BYTE * p_data,\n                                                        OPJ_UINT32 * p_data_written,\n                                                        const opj_stream_private_t *p_stream,\n                                                        opj_event_mgr_t * p_manager\n                            )\n{\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        opj_write_bytes(p_data,J2K_MS_SOT,2);                                   /* SOT */\n        p_data += 2;\n\n        opj_write_bytes(p_data,10,2);                                                   /* Lsot */\n        p_data += 2;\n\n        opj_write_bytes(p_data, p_j2k->m_current_tile_number,2);                        /* Isot */\n        p_data += 2;\n\n        /* Psot  */\n        p_data += 4;\n\n        opj_write_bytes(p_data, p_j2k->m_specific_param.m_encoder.m_current_tile_part_number,1);                        /* TPsot */\n        ++p_data;\n\n        opj_write_bytes(p_data, p_j2k->m_cp.tcps[p_j2k->m_current_tile_number].m_nb_tile_parts,1);                      /* TNsot */\n        ++p_data;\n\n        /* UniPG>> */\n#ifdef USE_JPWL\n        /* update markers struct */\n/*\n        OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOT, p_j2k->sot_start, len + 2);\n*/\n  assert( 0 && \"TODO\" );\n#endif /* USE_JPWL */\n\n        * p_data_written = 12;\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_read_sot ( opj_j2k_t *p_j2k,\n                            OPJ_BYTE * p_header_data,\n                            OPJ_UINT32 p_header_size,\n                            opj_event_mgr_t * p_manager )\n{\n        opj_cp_t *l_cp = 00;\n        opj_tcp_t *l_tcp = 00;\n        OPJ_UINT32 l_tot_len, l_num_parts = 0;\n        OPJ_UINT32 l_current_part;\n        OPJ_UINT32 l_tile_x,l_tile_y;\n\n        /* preconditions */\n        assert(p_header_data != 00);\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n\n        /* Size of this marker is fixed = 12 (we have already read marker and its size)*/\n        if (p_header_size != 8) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading SOT marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        l_cp = &(p_j2k->m_cp);\n        opj_read_bytes(p_header_data,&(p_j2k->m_current_tile_number),2);                /* Isot */\n        p_header_data+=2;\n\n        /* testcase 2.pdf.SIGFPE.706.1112 */\n        if (p_j2k->m_current_tile_number >= l_cp->tw * l_cp->th) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Invalid tile number %d\\n\", p_j2k->m_current_tile_number);\n                return OPJ_FALSE;\n        }\n\n        l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];\n        l_tile_x = p_j2k->m_current_tile_number % l_cp->tw;\n        l_tile_y = p_j2k->m_current_tile_number / l_cp->tw;\n\n#ifdef USE_JPWL\n        if (l_cp->correct) {\n\n                OPJ_UINT32 tileno = p_j2k->m_current_tile_number;\n                static OPJ_UINT32 backup_tileno = 0;\n\n                /* tileno is negative or larger than the number of tiles!!! */\n                if (tileno > (l_cp->tw * l_cp->th)) {\n                        opj_event_msg(p_manager, EVT_ERROR,\n                                        \"JPWL: bad tile number (%d out of a maximum of %d)\\n\",\n                                        tileno, (l_cp->tw * l_cp->th));\n                        if (!JPWL_ASSUME) {\n                                opj_event_msg(p_manager, EVT_ERROR, \"JPWL: giving up\\n\");\n                                return OPJ_FALSE;\n                        }\n                        /* we try to correct */\n                        tileno = backup_tileno;\n                        opj_event_msg(p_manager, EVT_WARNING, \"- trying to adjust this\\n\"\n                                        \"- setting tile number to %d\\n\",\n                                        tileno);\n                }\n\n                /* keep your private count of tiles */\n                backup_tileno++;\n        };\n#endif /* USE_JPWL */\n\n        /* look for the tile in the list of already processed tile (in parts). */\n        /* Optimization possible here with a more complex data structure and with the removing of tiles */\n        /* since the time taken by this function can only grow at the time */\n\n        opj_read_bytes(p_header_data,&l_tot_len,4);             /* Psot */\n        p_header_data+=4;\n\n        /* PSot should be equal to zero or >=14 or <= 2^32-1 */\n        if ((l_tot_len !=0 ) && (l_tot_len < 14) )\n        {\n            if (l_tot_len == 12 ) /* MSD: Special case for the PHR data which are read by kakadu*/\n            {\n                opj_event_msg(p_manager, EVT_WARNING, \"Empty SOT marker detected: Psot=%d.\\n\", l_tot_len);\n            }\n            else\n            {\n                opj_event_msg(p_manager, EVT_ERROR, \"Psot value is not correct regards to the JPEG2000 norm: %d.\\n\", l_tot_len);\n                return OPJ_FALSE;\n            }\n        }\n\n#ifdef USE_JPWL\n        if (l_cp->correct) {\n\n                /* totlen is negative or larger than the bytes left!!! */\n                if (/*(l_tot_len < 0) ||*/ (l_tot_len > p_header_size ) ) { /* FIXME it seems correct; for info in V1 -> (p_stream_numbytesleft(p_stream) + 8))) { */\n                        opj_event_msg(p_manager, EVT_ERROR,\n                                        \"JPWL: bad tile byte size (%d bytes against %d bytes left)\\n\",\n                                        l_tot_len, p_header_size ); /* FIXME it seems correct; for info in V1 -> p_stream_numbytesleft(p_stream) + 8); */\n                        if (!JPWL_ASSUME) {\n                                opj_event_msg(p_manager, EVT_ERROR, \"JPWL: giving up\\n\");\n                                return OPJ_FALSE;\n                        }\n                        /* we try to correct */\n                        l_tot_len = 0;\n                        opj_event_msg(p_manager, EVT_WARNING, \"- trying to adjust this\\n\"\n                                        \"- setting Psot to %d => assuming it is the last tile\\n\",\n                                        l_tot_len);\n                }\n                };\n#endif /* USE_JPWL */\n\n                /* Ref A.4.2: Psot could be equal zero if it is the last tile-part of the codestream.*/\n                if (!l_tot_len) {\n                        opj_event_msg(p_manager, EVT_INFO, \"Psot value of the current tile-part is equal to zero, \"\n                                        \"we assuming it is the last tile-part of the codestream.\\n\");\n                        p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;\n                }\n\n                opj_read_bytes(p_header_data,&l_current_part ,1);       /* TPsot */\n                ++p_header_data;\n\n                opj_read_bytes(p_header_data,&l_num_parts ,1);          /* TNsot */\n                ++p_header_data;\n\n                if (l_num_parts != 0) { /* Number of tile-part header is provided by this tile-part header */\n                        /* Useful to manage the case of textGBR.jp2 file because two values of TNSot are allowed: the correct numbers of\n                         * tile-parts for that tile and zero (A.4.2 of 15444-1 : 2002). */\n                        if (l_tcp->m_nb_tile_parts) {\n                                if (l_current_part >= l_tcp->m_nb_tile_parts){\n                                        opj_event_msg(p_manager, EVT_ERROR, \"In SOT marker, TPSot (%d) is not valid regards to the current \"\n                                                        \"number of tile-part (%d), giving up\\n\", l_current_part, l_tcp->m_nb_tile_parts );\n                                      //  p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;\n                                     //   return OPJ_FALSE;\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tl_num_parts++; \n                                }\n                        }\n                        if( l_current_part >= l_num_parts ) {\n                          /* testcase 451.pdf.SIGSEGV.ce9.3723 */\n                          opj_event_msg(p_manager, EVT_ERROR, \"In SOT marker, TPSot (%d) is not valid regards to the current \"\n                            \"number of tile-part (header) (%d), giving up\\n\", l_current_part, l_num_parts );\n                          p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;\n                          return OPJ_FALSE;\n                        }\n                        l_tcp->m_nb_tile_parts = l_num_parts;\n                }\n\n                /* If know the number of tile part header we will check if we didn't read the last*/\n                if (l_tcp->m_nb_tile_parts) {\n                        if (l_tcp->m_nb_tile_parts == (l_current_part+1)) {\n                                p_j2k->m_specific_param.m_decoder.m_can_decode = 0; /* Process the last tile-part header*/\n                        }\n                }\n\n                if (!p_j2k->m_specific_param.m_decoder.m_last_tile_part){\n                        /* Keep the size of data to skip after this marker */\n                        p_j2k->m_specific_param.m_decoder.m_sot_length = l_tot_len - 12; /* SOT_marker_size = 12 */\n                }\n                else {\n                        /* FIXME: need to be computed from the number of bytes remaining in the codestream */\n                        p_j2k->m_specific_param.m_decoder.m_sot_length = 0;\n                }\n\n                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPH;\n\n                /* Check if the current tile is outside the area we want decode or not corresponding to the tile index*/\n                if (p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec == -1) {\n                        p_j2k->m_specific_param.m_decoder.m_skip_data =\n                                (l_tile_x < p_j2k->m_specific_param.m_decoder.m_start_tile_x)\n                                ||      (l_tile_x >= p_j2k->m_specific_param.m_decoder.m_end_tile_x)\n                                ||  (l_tile_y < p_j2k->m_specific_param.m_decoder.m_start_tile_y)\n                                ||      (l_tile_y >= p_j2k->m_specific_param.m_decoder.m_end_tile_y);\n                }\n                else {\n                        assert( p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec >= 0 );\n                        p_j2k->m_specific_param.m_decoder.m_skip_data =\n                                (p_j2k->m_current_tile_number != (OPJ_UINT32)p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec);\n                }\n\n                /* Index */\n                if (p_j2k->cstr_index)\n                {\n                        assert(p_j2k->cstr_index->tile_index != 00);\n                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tileno = p_j2k->m_current_tile_number;\n                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_tpsno = l_current_part;\n\n                        if (l_num_parts != 0){\n                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].nb_tps = l_num_parts;\n                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = l_num_parts;\n\n                                if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {\n                                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =\n                                                (opj_tp_index_t*)opj_calloc(l_num_parts, sizeof(opj_tp_index_t));\n                                }\n                                else {\n                                        opj_tp_index_t *new_tp_index = (opj_tp_index_t *) opj_realloc(\n                                                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index, l_num_parts* sizeof(opj_tp_index_t));\n                                        if (! new_tp_index) {\n                                                opj_free(p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index);\n                                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = NULL;\n                                                opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to read PPT marker\\n\");\n                                                return OPJ_FALSE;\n                                        }\n                                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = new_tp_index;\n                                }\n                        }\n                        else{\n                                /*if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index)*/ {\n\n                                        if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {\n                                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 10;\n                                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =\n                                                        (opj_tp_index_t*)opj_calloc( p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps,\n                                                                        sizeof(opj_tp_index_t));\n                                        }\n\n                                        if ( l_current_part >= p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps ){\n                                                opj_tp_index_t *new_tp_index;\n                                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = l_current_part + 1;\n                                                new_tp_index = (opj_tp_index_t *) opj_realloc(\n                                                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index,\n                                                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps * sizeof(opj_tp_index_t));\n                                                if (! new_tp_index) {\n                                                        opj_free(p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index);\n                                                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = NULL;\n                                                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 0;\n                                                        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to read PPT marker\\n\");\n                                                        return OPJ_FALSE;\n                                                }\n                                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = new_tp_index;\n                                        }\n                                }\n\n                        }\n\n                }\n\n                /* FIXME move this onto a separate method to call before reading any SOT, remove part about main_end header, use a index struct inside p_j2k */\n                /* if (p_j2k->cstr_info) {\n                   if (l_tcp->first) {\n                   if (tileno == 0) {\n                   p_j2k->cstr_info->main_head_end = p_stream_tell(p_stream) - 13;\n                   }\n\n                   p_j2k->cstr_info->tile[tileno].tileno = tileno;\n                   p_j2k->cstr_info->tile[tileno].start_pos = p_stream_tell(p_stream) - 12;\n                   p_j2k->cstr_info->tile[tileno].end_pos = p_j2k->cstr_info->tile[tileno].start_pos + totlen - 1;\n                   p_j2k->cstr_info->tile[tileno].num_tps = numparts;\n\n                   if (numparts) {\n                   p_j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(numparts * sizeof(opj_tp_info_t));\n                   }\n                   else {\n                   p_j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(10 * sizeof(opj_tp_info_t)); // Fixme (10)\n                   }\n                   }\n                   else {\n                   p_j2k->cstr_info->tile[tileno].end_pos += totlen;\n                   }\n\n                   p_j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos = p_stream_tell(p_stream) - 12;\n                   p_j2k->cstr_info->tile[tileno].tp[partno].tp_end_pos =\n                   p_j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos + totlen - 1;\n                   }*/\n                return OPJ_TRUE;\n        }\n\nOPJ_BOOL opj_j2k_write_sod(     opj_j2k_t *p_j2k,\n                                                        opj_tcd_t * p_tile_coder,\n                                                        OPJ_BYTE * p_data,\n                                                        OPJ_UINT32 * p_data_written,\n                                                        OPJ_UINT32 p_total_data_size,\n                                                        const opj_stream_private_t *p_stream,\n                                                        opj_event_mgr_t * p_manager\n                            )\n{\n        opj_codestream_info_t *l_cstr_info = 00;\n        OPJ_UINT32 l_remaining_data;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        opj_write_bytes(p_data,J2K_MS_SOD,2);                                   /* SOD */\n        p_data += 2;\n\n        /* make room for the EOF marker */\n        l_remaining_data =  p_total_data_size - 4;\n\n        /* update tile coder */\n        p_tile_coder->tp_num = p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number ;\n        p_tile_coder->cur_tp_num = p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;\n\n         /* INDEX >> */\n        /* TODO mergeV2: check this part which use cstr_info */\n        /*l_cstr_info = p_j2k->cstr_info;\n        if (l_cstr_info) {\n                if (!p_j2k->m_specific_param.m_encoder.m_current_tile_part_number ) {\n                        //TODO cstr_info->tile[p_j2k->m_current_tile_number].end_header = p_stream_tell(p_stream) + p_j2k->pos_correction - 1;\n                        l_cstr_info->tile[p_j2k->m_current_tile_number].tileno = p_j2k->m_current_tile_number;\n                }\n                else {*/\n                        /*\n                        TODO\n                        if\n                                (cstr_info->tile[p_j2k->m_current_tile_number].packet[cstr_info->packno - 1].end_pos < p_stream_tell(p_stream))\n                        {\n                                cstr_info->tile[p_j2k->m_current_tile_number].packet[cstr_info->packno].start_pos = p_stream_tell(p_stream);\n                        }*/\n                /*}*/\n                /* UniPG>> */\n#ifdef USE_JPWL\n                /* update markers struct */\n                /*OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOD, p_j2k->sod_start, 2);\n*/\n  assert( 0 && \"TODO\" );\n#endif /* USE_JPWL */\n                /* <<UniPG */\n        /*}*/\n        /* << INDEX */\n\n        if (p_j2k->m_specific_param.m_encoder.m_current_tile_part_number == 0) {\n                p_tile_coder->tcd_image->tiles->packno = 0;\n                if (l_cstr_info) {\n                        l_cstr_info->packno = 0;\n                }\n        }\n\n        *p_data_written = 0;\n\n        if (! opj_tcd_encode_tile(p_tile_coder, p_j2k->m_current_tile_number, p_data, p_data_written, l_remaining_data , l_cstr_info)) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Cannot encode tile\\n\");\n                return OPJ_FALSE;\n        }\n\n        *p_data_written += 2;\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_read_sod (opj_j2k_t *p_j2k,\n                           opj_stream_private_t *p_stream,\n                                                   opj_event_mgr_t * p_manager\n                           )\n{\n        OPJ_SIZE_T l_current_read_size;\n        opj_codestream_index_t * l_cstr_index = 00;\n        OPJ_BYTE ** l_current_data = 00;\n        opj_tcp_t * l_tcp = 00;\n        OPJ_UINT32 * l_tile_len = 00;\n        OPJ_BOOL l_sot_length_pb_detected = OPJ_FALSE;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);\n\n        if (p_j2k->m_specific_param.m_decoder.m_last_tile_part) {\n                /* opj_stream_get_number_byte_left returns OPJ_OFF_T\n                // but we are in the last tile part,\n                // so its result will fit on OPJ_UINT32 unless we find\n                // a file with a single tile part of more than 4 GB...*/\n                p_j2k->m_specific_param.m_decoder.m_sot_length = (OPJ_UINT32)(opj_stream_get_number_byte_left(p_stream) - 2);\n        }\n        else {\n            /* Check to avoid pass the limit of OPJ_UINT32 */\n            if (p_j2k->m_specific_param.m_decoder.m_sot_length >= 2 )\n                p_j2k->m_specific_param.m_decoder.m_sot_length -= 2;\n            else {\n                /* MSD: case commented to support empty SOT marker (PHR data) */\n            }\n        }\n\n        l_current_data = &(l_tcp->m_data);\n        l_tile_len = &l_tcp->m_data_size;\n\n        /* Patch to support new PHR data */\n        if (p_j2k->m_specific_param.m_decoder.m_sot_length) {\n            if (! *l_current_data) {\n                /* LH: oddly enough, in this path, l_tile_len!=0.\n                 * TODO: If this was consistant, we could simplify the code to only use realloc(), as realloc(0,...) default to malloc(0,...).\n                 */\n                *l_current_data = (OPJ_BYTE*) opj_malloc(p_j2k->m_specific_param.m_decoder.m_sot_length);\n            }\n            else {\n\t\t\t\tOPJ_BYTE *l_new_current_data = NULL;\n\t\t\t\t//BUGID: 0056005 and 0056022.\n\t\t\t\t//test file: 366683_fuzz-asan_heap-oob_6bae99_3155_5245.pdf and fuzz-12.pdf.\n\t\t\t\tif ((OPJ_UINT32)-1 - p_j2k->m_specific_param.m_decoder.m_sot_length >= *l_tile_len)\n\t\t\t\t\tl_new_current_data = (OPJ_BYTE *) opj_realloc(*l_current_data, *l_tile_len + p_j2k->m_specific_param.m_decoder.m_sot_length);\n                if (! l_new_current_data) {\n                        opj_free(*l_current_data);\n                        /*nothing more is done as l_current_data will be set to null, and just\n                          afterward we enter in the error path\n                          and the actual tile_len is updated (committed) at the end of the\n                          function. */\n                }\n                *l_current_data = l_new_current_data;\n            }\n            \n            if (*l_current_data == 00) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to decode tile\\n\");\n                return OPJ_FALSE;\n            }\n        }\n        else {\n            l_sot_length_pb_detected = OPJ_TRUE;\n        }\n\n        /* Index */\n        l_cstr_index = p_j2k->cstr_index;\n        if (l_cstr_index) {\n                OPJ_OFF_T l_current_pos = opj_stream_tell(p_stream) - 2;\n\n                OPJ_UINT32 l_current_tile_part = l_cstr_index->tile_index[p_j2k->m_current_tile_number].current_tpsno;\n                l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index[l_current_tile_part].end_header =\n                                l_current_pos;\n                l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index[l_current_tile_part].end_pos =\n                                l_current_pos + p_j2k->m_specific_param.m_decoder.m_sot_length + 2;\n\n                if (OPJ_FALSE == opj_j2k_add_tlmarker(p_j2k->m_current_tile_number,\n                                        l_cstr_index,\n                                        J2K_MS_SOD,\n                                        l_current_pos,\n                                        p_j2k->m_specific_param.m_decoder.m_sot_length + 2)) {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to add tl marker\\n\");\n                        return OPJ_FALSE;\n                }\n\n                /*l_cstr_index->packno = 0;*/\n        }\n\n        /* Patch to support new PHR data */\n        if (!l_sot_length_pb_detected) {\n            l_current_read_size = opj_stream_read_data(\n                        p_stream,\n                        *l_current_data + *l_tile_len,\n                        p_j2k->m_specific_param.m_decoder.m_sot_length,\n                        p_manager);\n        }\n        else\n        {\n            l_current_read_size = 0;\n        }\n\n        if (l_current_read_size != p_j2k->m_specific_param.m_decoder.m_sot_length) {\n                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;\n        }\n        else {\n                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;\n        }\n\n        *l_tile_len += (OPJ_UINT32)l_current_read_size;\n\n        return OPJ_TRUE;\n}\n\n OPJ_BOOL opj_j2k_write_rgn(opj_j2k_t *p_j2k,\n                            OPJ_UINT32 p_tile_no,\n                            OPJ_UINT32 p_comp_no,\n                            OPJ_UINT32 nb_comps,\n                            opj_stream_private_t *p_stream,\n                            opj_event_mgr_t * p_manager\n                            )\n{\n        OPJ_BYTE * l_current_data = 00;\n        OPJ_UINT32 l_rgn_size;\n        opj_cp_t *l_cp = 00;\n        opj_tcp_t *l_tcp = 00;\n        opj_tccp_t *l_tccp = 00;\n        OPJ_UINT32 l_comp_room;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        l_cp = &(p_j2k->m_cp);\n        l_tcp = &l_cp->tcps[p_tile_no];\n        l_tccp = &l_tcp->tccps[p_comp_no];\n\n        if (nb_comps <= 256) {\n                l_comp_room = 1;\n        }\n        else {\n                l_comp_room = 2;\n        }\n\n        l_rgn_size = 6 + l_comp_room;\n\n        l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;\n\n        opj_write_bytes(l_current_data,J2K_MS_RGN,2);                                   /* RGN  */\n        l_current_data += 2;\n\n        opj_write_bytes(l_current_data,l_rgn_size-2,2);                                 /* Lrgn */\n        l_current_data += 2;\n\n        opj_write_bytes(l_current_data,p_comp_no,l_comp_room);                          /* Crgn */\n        l_current_data+=l_comp_room;\n\n        opj_write_bytes(l_current_data, 0,1);                                           /* Srgn */\n        ++l_current_data;\n\n        opj_write_bytes(l_current_data, (OPJ_UINT32)l_tccp->roishift,1);                            /* SPrgn */\n        ++l_current_data;\n\n        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_rgn_size,p_manager) != l_rgn_size) {\n                return OPJ_FALSE;\n        }\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_write_eoc(     opj_j2k_t *p_j2k,\n                            opj_stream_private_t *p_stream,\n                            opj_event_mgr_t * p_manager\n                            )\n{\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_header_tile_data,J2K_MS_EOC,2);                                     /* EOC */\n\n/* UniPG>> */\n#ifdef USE_JPWL\n        /* update markers struct */\n        /*\n        OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_EOC, p_stream_tell(p_stream) - 2, 2);\n*/\n#endif /* USE_JPWL */\n\n        if ( opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,2,p_manager) != 2) {\n                return OPJ_FALSE;\n        }\n\n        if ( ! opj_stream_flush(p_stream,p_manager) ) {\n                return OPJ_FALSE;\n        }\n\n        return OPJ_TRUE;\n}\n\n/**\n * Reads a RGN marker (Region Of Interest)\n *\n * @param       p_header_data   the data contained in the POC box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the POC marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_rgn (opj_j2k_t *p_j2k,\n                                  OPJ_BYTE * p_header_data,\n                                  OPJ_UINT32 p_header_size,\n                                  opj_event_mgr_t * p_manager\n                                  )\n{\n        OPJ_UINT32 l_nb_comp;\n        opj_image_t * l_image = 00;\n\n        opj_cp_t *l_cp = 00;\n        opj_tcp_t *l_tcp = 00;\n        OPJ_UINT32 l_comp_room, l_comp_no, l_roi_sty;\n\n        /* preconditions*/\n        assert(p_header_data != 00);\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n\n        l_image = p_j2k->m_private_image;\n        l_nb_comp = l_image->numcomps;\n\n        if (l_nb_comp <= 256) {\n                l_comp_room = 1; }\n        else {\n                l_comp_room = 2; }\n\n        if (p_header_size != 2 + l_comp_room) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading RGN marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        l_cp = &(p_j2k->m_cp);\n        l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?\n                                &l_cp->tcps[p_j2k->m_current_tile_number] :\n                                p_j2k->m_specific_param.m_decoder.m_default_tcp;\n\n        opj_read_bytes(p_header_data,&l_comp_no,l_comp_room);           /* Crgn */\n        p_header_data+=l_comp_room;\n        opj_read_bytes(p_header_data,&l_roi_sty,1);                                     /* Srgn */\n        ++p_header_data;\n\n#ifdef USE_JPWL\n        if (l_cp->correct) {\n                /* totlen is negative or larger than the bytes left!!! */\n                if (l_comp_room >= l_nb_comp) {\n                        opj_event_msg(p_manager, EVT_ERROR,\n                                \"JPWL: bad component number in RGN (%d when there are only %d)\\n\",\n                                l_comp_room, l_nb_comp);\n                        if (!JPWL_ASSUME || JPWL_ASSUME) {\n                                opj_event_msg(p_manager, EVT_ERROR, \"JPWL: giving up\\n\");\n                                return OPJ_FALSE;\n                        }\n                }\n        };\n#endif /* USE_JPWL */\n\n        /* testcase 3635.pdf.asan.77.2930 */\n        if (l_comp_no >= l_nb_comp) {\n                opj_event_msg(p_manager, EVT_ERROR,\n                        \"bad component number in RGN (%d when there are only %d)\\n\",\n                        l_comp_no, l_nb_comp);\n                return OPJ_FALSE;\n        }\n\n        opj_read_bytes(p_header_data,(OPJ_UINT32 *) (&(l_tcp->tccps[l_comp_no].roishift)),1);   /* SPrgn */\n        ++p_header_data;\n\n        return OPJ_TRUE;\n\n}\n\nOPJ_FLOAT32 opj_j2k_get_tp_stride (opj_tcp_t * p_tcp)\n{\n        return (OPJ_FLOAT32) ((p_tcp->m_nb_tile_parts - 1) * 14);\n}\n\nOPJ_FLOAT32 opj_j2k_get_default_stride (opj_tcp_t * p_tcp)\n{\n    (void)p_tcp;\n    return 0;\n}\n\nOPJ_BOOL opj_j2k_update_rates(  opj_j2k_t *p_j2k,\n                                                            opj_stream_private_t *p_stream,\n                                                            opj_event_mgr_t * p_manager )\n{\n        opj_cp_t * l_cp = 00;\n        opj_image_t * l_image = 00;\n        opj_tcp_t * l_tcp = 00;\n        opj_image_comp_t * l_img_comp = 00;\n\n        OPJ_UINT32 i,j,k;\n        OPJ_INT32 l_x0,l_y0,l_x1,l_y1;\n        OPJ_FLOAT32 * l_rates = 0;\n        OPJ_FLOAT32 l_sot_remove;\n        OPJ_UINT32 l_bits_empty, l_size_pixel;\n        OPJ_UINT32 l_tile_size = 0;\n        OPJ_UINT32 l_last_res;\n        OPJ_FLOAT32 (* l_tp_stride_func)(opj_tcp_t *) = 00;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        l_cp = &(p_j2k->m_cp);\n        l_image = p_j2k->m_private_image;\n        l_tcp = l_cp->tcps;\n\n        l_bits_empty = 8 * l_image->comps->dx * l_image->comps->dy;\n        l_size_pixel = l_image->numcomps * l_image->comps->prec;\n        l_sot_remove = (OPJ_FLOAT32) opj_stream_tell(p_stream) / (OPJ_FLOAT32)(l_cp->th * l_cp->tw);\n\n        if (l_cp->m_specific_param.m_enc.m_tp_on) {\n                l_tp_stride_func = opj_j2k_get_tp_stride;\n        }\n        else {\n                l_tp_stride_func = opj_j2k_get_default_stride;\n        }\n\n        for (i=0;i<l_cp->th;++i) {\n                for (j=0;j<l_cp->tw;++j) {\n                        OPJ_FLOAT32 l_offset = (OPJ_FLOAT32)(*l_tp_stride_func)(l_tcp) / (OPJ_FLOAT32)l_tcp->numlayers;\n\n                        /* 4 borders of the tile rescale on the image if necessary */\n                        l_x0 = opj_int_max((OPJ_INT32)(l_cp->tx0 + j * l_cp->tdx), (OPJ_INT32)l_image->x0);\n                        l_y0 = opj_int_max((OPJ_INT32)(l_cp->ty0 + i * l_cp->tdy), (OPJ_INT32)l_image->y0);\n                        l_x1 = opj_int_min((OPJ_INT32)(l_cp->tx0 + (j + 1) * l_cp->tdx), (OPJ_INT32)l_image->x1);\n                        l_y1 = opj_int_min((OPJ_INT32)(l_cp->ty0 + (i + 1) * l_cp->tdy), (OPJ_INT32)l_image->y1);\n\n                        l_rates = l_tcp->rates;\n\n                        /* Modification of the RATE >> */\n                        if (*l_rates) {\n                                *l_rates =              (( (OPJ_FLOAT32) (l_size_pixel * (OPJ_UINT32)(l_x1 - l_x0) * (OPJ_UINT32)(l_y1 - l_y0)))\n                                                                /\n                                                                ((*l_rates) * (OPJ_FLOAT32)l_bits_empty)\n                                                                )\n                                                                -\n                                                                l_offset;\n                        }\n\n                        ++l_rates;\n\n                        for (k = 1; k < l_tcp->numlayers; ++k) {\n                                if (*l_rates) {\n                                        *l_rates =              (( (OPJ_FLOAT32) (l_size_pixel * (OPJ_UINT32)(l_x1 - l_x0) * (OPJ_UINT32)(l_y1 - l_y0)))\n                                                                        /\n                                                                                ((*l_rates) * (OPJ_FLOAT32)l_bits_empty)\n                                                                        )\n                                                                        -\n                                                                        l_offset;\n                                }\n\n                                ++l_rates;\n                        }\n\n                        ++l_tcp;\n\n                }\n        }\n\n        l_tcp = l_cp->tcps;\n\n        for (i=0;i<l_cp->th;++i) {\n                for     (j=0;j<l_cp->tw;++j) {\n                        l_rates = l_tcp->rates;\n\n                        if (*l_rates) {\n                                *l_rates -= l_sot_remove;\n\n                                if (*l_rates < 30) {\n                                        *l_rates = 30;\n                                }\n                        }\n\n                        ++l_rates;\n\n                        l_last_res = l_tcp->numlayers - 1;\n\n                        for (k = 1; k < l_last_res; ++k) {\n\n                                if (*l_rates) {\n                                        *l_rates -= l_sot_remove;\n\n                                        if (*l_rates < *(l_rates - 1) + 10) {\n                                                *l_rates  = (*(l_rates - 1)) + 20;\n                                        }\n                                }\n\n                                ++l_rates;\n                        }\n\n                        if (*l_rates) {\n                                *l_rates -= (l_sot_remove + 2.f);\n\n                                if (*l_rates < *(l_rates - 1) + 10) {\n                                        *l_rates  = (*(l_rates - 1)) + 20;\n                                }\n                        }\n\n                        ++l_tcp;\n                }\n        }\n\n        l_img_comp = l_image->comps;\n        l_tile_size = 0;\n\n        for (i=0;i<l_image->numcomps;++i) {\n                l_tile_size += (        opj_uint_ceildiv(l_cp->tdx,l_img_comp->dx)\n                                                        *\n                                                        opj_uint_ceildiv(l_cp->tdy,l_img_comp->dy)\n                                                        *\n                                                        l_img_comp->prec\n                                                );\n\n                ++l_img_comp;\n        }\n\n        l_tile_size = (OPJ_UINT32) (l_tile_size * 0.1625); /* 1.3/8 = 0.1625 */\n\n        l_tile_size += opj_j2k_get_specific_header_sizes(p_j2k);\n\n        p_j2k->m_specific_param.m_encoder.m_encoded_tile_size = l_tile_size;\n        p_j2k->m_specific_param.m_encoder.m_encoded_tile_data =\n                        (OPJ_BYTE *) opj_malloc(p_j2k->m_specific_param.m_encoder.m_encoded_tile_size);\n        if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data == 00) {\n                return OPJ_FALSE;\n        }\n\n        if (l_cp->m_specific_param.m_enc.m_cinema) {\n                p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer =\n                                (OPJ_BYTE *) opj_malloc(5*p_j2k->m_specific_param.m_encoder.m_total_tile_parts);\n                if (! p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {\n                        return OPJ_FALSE;\n                }\n\n                p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current =\n                                p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer;\n        }\n\n        return OPJ_TRUE;\n}\n\n#if 0\nOPJ_BOOL opj_j2k_read_eoc (     opj_j2k_t *p_j2k,\n                                                        opj_stream_private_t *p_stream,\n                                                        opj_event_mgr_t * p_manager )\n{\n        OPJ_UINT32 i;\n        opj_tcd_t * l_tcd = 00;\n        OPJ_UINT32 l_nb_tiles;\n        opj_tcp_t * l_tcp = 00;\n        OPJ_BOOL l_success;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;\n        l_tcp = p_j2k->m_cp.tcps;\n\n        l_tcd = opj_tcd_create(OPJ_TRUE);\n        if (l_tcd == 00) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Cannot decode tile, memory error\\n\");\n                return OPJ_FALSE;\n        }\n\n        for (i = 0; i < l_nb_tiles; ++i) {\n                if (l_tcp->m_data) {\n                        if (! opj_tcd_init_decode_tile(l_tcd, i)) {\n                                opj_tcd_destroy(l_tcd);\n                                opj_event_msg(p_manager, EVT_ERROR, \"Cannot decode tile, memory error\\n\");\n                                return OPJ_FALSE;\n                        }\n\n                        l_success = opj_tcd_decode_tile(l_tcd, l_tcp->m_data, l_tcp->m_data_size, i, p_j2k->cstr_index);\n                        /* cleanup */\n\n                        if (! l_success) {\n                                p_j2k->m_specific_param.m_decoder.m_state |= J2K_STATE_ERR;\n                                break;\n                        }\n                }\n\n                opj_j2k_tcp_destroy(l_tcp);\n                ++l_tcp;\n        }\n\n        opj_tcd_destroy(l_tcd);\n        return OPJ_TRUE;\n}\n#endif\n\nOPJ_BOOL opj_j2k_get_end_header(opj_j2k_t *p_j2k,\n                                                        struct opj_stream_private *p_stream,\n                                                        struct opj_event_mgr * p_manager )\n{\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        p_j2k->cstr_index->main_head_end = opj_stream_tell(p_stream);\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_write_mct_data_group(  opj_j2k_t *p_j2k,\n                                                                        struct opj_stream_private *p_stream,\n                                                                        struct opj_event_mgr * p_manager )\n{\n        OPJ_UINT32 i;\n        opj_simple_mcc_decorrelation_data_t * l_mcc_record;\n        opj_mct_data_t * l_mct_record;\n        opj_tcp_t * l_tcp;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_stream != 00);\n        assert(p_manager != 00);\n\n        if (! opj_j2k_write_cbd(p_j2k,p_stream,p_manager)) {\n                return OPJ_FALSE;\n        }\n\n        l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);\n        l_mct_record = l_tcp->m_mct_records;\n\n        for (i=0;i<l_tcp->m_nb_mct_records;++i) {\n\n                if (! opj_j2k_write_mct_record(p_j2k,l_mct_record,p_stream,p_manager)) {\n                        return OPJ_FALSE;\n                }\n\n                ++l_mct_record;\n        }\n\n        l_mcc_record = l_tcp->m_mcc_records;\n\n        for     (i=0;i<l_tcp->m_nb_mcc_records;++i) {\n\n                if (! opj_j2k_write_mcc_record(p_j2k,l_mcc_record,p_stream,p_manager)) {\n                        return OPJ_FALSE;\n                }\n\n                ++l_mcc_record;\n        }\n\n        if (! opj_j2k_write_mco(p_j2k,p_stream,p_manager)) {\n                return OPJ_FALSE;\n        }\n\n        return OPJ_TRUE;\n}\n\n#if 0\nOPJ_BOOL opj_j2k_write_all_coc(opj_j2k_t *p_j2k,\n                                                                        struct opj_stream_private *p_stream,\n                                                                        struct opj_event_mgr * p_manager )\n{\n        OPJ_UINT32 compno;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno)\n        {\n                if (! opj_j2k_write_coc(p_j2k,compno,p_stream, p_manager)) {\n                        return OPJ_FALSE;\n                }\n        }\n\n        return OPJ_TRUE;\n}\n#endif\n\n#if 0\nOPJ_BOOL opj_j2k_write_all_qcc(opj_j2k_t *p_j2k,\n                                                                        struct opj_stream_private *p_stream,\n                                                                        struct opj_event_mgr * p_manager )\n{\n        OPJ_UINT32 compno;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno)\n        {\n                if (! opj_j2k_write_qcc(p_j2k,compno,p_stream, p_manager)) {\n                        return OPJ_FALSE;\n                }\n        }\n\n        return OPJ_TRUE;\n}\n#endif\n\n\nOPJ_BOOL opj_j2k_write_regions( opj_j2k_t *p_j2k,\n                                                        struct opj_stream_private *p_stream,\n                                                        struct opj_event_mgr * p_manager )\n{\n        OPJ_UINT32 compno;\n        const opj_tccp_t *l_tccp = 00;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        l_tccp = p_j2k->m_cp.tcps->tccps;\n\n        for     (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno)  {\n                if (l_tccp->roishift) {\n\n                        if (! opj_j2k_write_rgn(p_j2k,0,compno,p_j2k->m_private_image->numcomps,p_stream,p_manager)) {\n                                return OPJ_FALSE;\n                        }\n                }\n\n                ++l_tccp;\n        }\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_write_epc(     opj_j2k_t *p_j2k,\n                                                struct opj_stream_private *p_stream,\n                                                struct opj_event_mgr * p_manager )\n{\n        opj_codestream_index_t * l_cstr_index = 00;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        l_cstr_index = p_j2k->cstr_index;\n        if (l_cstr_index) {\n                l_cstr_index->codestream_size = (OPJ_UINT64)opj_stream_tell(p_stream);\n                /* UniPG>> */\n                /* The following adjustment is done to adjust the codestream size */\n                /* if SOD is not at 0 in the buffer. Useful in case of JP2, where */\n                /* the first bunch of bytes is not in the codestream              */\n                l_cstr_index->codestream_size -= (OPJ_UINT64)l_cstr_index->main_head_start;\n                /* <<UniPG */\n        }\n\n#ifdef USE_JPWL\n        /* preparation of JPWL marker segments */\n#if 0\n        if(cp->epc_on) {\n\n                /* encode according to JPWL */\n                jpwl_encode(p_j2k, p_stream, image);\n\n        }\n#endif\n  assert( 0 && \"TODO\" );\n#endif /* USE_JPWL */\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_read_unk (     opj_j2k_t *p_j2k,\n                                                        opj_stream_private_t *p_stream,\n                                                        OPJ_UINT32 *output_marker,\n                                                        opj_event_mgr_t * p_manager\n                                                        )\n{\n        OPJ_UINT32 l_unknown_marker;\n        const opj_dec_memory_marker_handler_t * l_marker_handler;\n        OPJ_UINT32 l_size_unk = 2;\n\n        /* preconditions*/\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        opj_event_msg(p_manager, EVT_WARNING, \"Unknown marker\\n\");\n\n        while(1) {\n                /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer*/\n                if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Stream too short\\n\");\n                        return OPJ_FALSE;\n                }\n\n                /* read 2 bytes as the new marker ID*/\n                opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_unknown_marker,2);\n\n                if (!(l_unknown_marker < 0xff00)) {\n\n                        /* Get the marker handler from the marker ID*/\n                        l_marker_handler = opj_j2k_get_marker_handler(l_unknown_marker);\n\n                        if (!(p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states)) {\n                                opj_event_msg(p_manager, EVT_ERROR, \"Marker is not compliant with its position\\n\");\n                                return OPJ_FALSE;\n                        }\n                        else {\n                                if (l_marker_handler->id != J2K_MS_UNK) {\n                                        /* Add the marker to the codestream index*/\n                                        if (l_marker_handler->id != J2K_MS_SOT)\n                                        {\n                                                OPJ_BOOL res = opj_j2k_add_mhmarker(p_j2k->cstr_index, J2K_MS_UNK,\n                                                                (OPJ_UINT32) opj_stream_tell(p_stream) - l_size_unk,\n                                                                l_size_unk);\n                                                if (res == OPJ_FALSE) {\n                                                        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to add mh marker\\n\");\n                                                        return OPJ_FALSE;\n                                                }\n                                        }\n                                        break; /* next marker is known and well located */\n                                }\n                                else\n                                        l_size_unk += 2;\n                        }\n                }\n        }\n\n        *output_marker = l_marker_handler->id ;\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_write_mct_record(      opj_j2k_t *p_j2k,\n                                                                opj_mct_data_t * p_mct_record,\n                                                                struct opj_stream_private *p_stream,\n                                                                struct opj_event_mgr * p_manager )\n{\n        OPJ_UINT32 l_mct_size;\n        OPJ_BYTE * l_current_data = 00;\n        OPJ_UINT32 l_tmp;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        l_mct_size = 10 + p_mct_record->m_data_size;\n\n        if (l_mct_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {\n                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mct_size);\n                if (! new_header_tile_data) {\n                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);\n                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;\n                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;\n                        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to write MCT marker\\n\");\n                        return OPJ_FALSE;\n                }\n                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;\n                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mct_size;\n        }\n\n        l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;\n\n        opj_write_bytes(l_current_data,J2K_MS_MCT,2);                                   /* MCT */\n        l_current_data += 2;\n\n        opj_write_bytes(l_current_data,l_mct_size-2,2);                                 /* Lmct */\n        l_current_data += 2;\n\n        opj_write_bytes(l_current_data,0,2);                                                    /* Zmct */\n        l_current_data += 2;\n\n        /* only one marker atm */\n        l_tmp = (p_mct_record->m_index & 0xff) | (p_mct_record->m_array_type << 8) | (p_mct_record->m_element_type << 10);\n\n        opj_write_bytes(l_current_data,l_tmp,2);\n        l_current_data += 2;\n\n        opj_write_bytes(l_current_data,0,2);                                                    /* Ymct */\n        l_current_data+=2;\n\n        memcpy(l_current_data,p_mct_record->m_data,p_mct_record->m_data_size);\n\n        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_mct_size,p_manager) != l_mct_size) {\n                return OPJ_FALSE;\n        }\n\n        return OPJ_TRUE;\n}\n\n/**\n * Reads a MCT marker (Multiple Component Transform)\n *\n * @param       p_header_data   the data contained in the MCT box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the MCT marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_mct (      opj_j2k_t *p_j2k,\n                                                                    OPJ_BYTE * p_header_data,\n                                                                    OPJ_UINT32 p_header_size,\n                                                                    opj_event_mgr_t * p_manager\n                                    )\n{\n        OPJ_UINT32 i;\n        opj_tcp_t *l_tcp = 00;\n        OPJ_UINT32 l_tmp;\n        OPJ_UINT32 l_indix;\n        opj_mct_data_t * l_mct_data;\n\n        /* preconditions */\n        assert(p_header_data != 00);\n        assert(p_j2k != 00);\n\n        l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?\n                        &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :\n                        p_j2k->m_specific_param.m_decoder.m_default_tcp;\n\n        if (p_header_size < 2) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading MCT marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        /* first marker */\n        opj_read_bytes(p_header_data,&l_tmp,2);                         /* Zmct */\n        p_header_data += 2;\n        if (l_tmp != 0) {\n                opj_event_msg(p_manager, EVT_WARNING, \"Cannot take in charge mct data within multiple MCT records\\n\");\n                return OPJ_TRUE;\n        }\n\n        if(p_header_size <= 6) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading MCT marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        /* Imct -> no need for other values, take the first, type is double with decorrelation x0000 1101 0000 0000*/\n        opj_read_bytes(p_header_data,&l_tmp,2);                         /* Imct */\n        p_header_data += 2;\n\n        l_indix = l_tmp & 0xff;\n        l_mct_data = l_tcp->m_mct_records;\n\n        for (i=0;i<l_tcp->m_nb_mct_records;++i) {\n                if (l_mct_data->m_index == l_indix) {\n                        break;\n                }\n                ++l_mct_data;\n        }\n\n        /* NOT FOUND */\n        if (i == l_tcp->m_nb_mct_records) {\n                if (l_tcp->m_nb_mct_records == l_tcp->m_nb_max_mct_records) {\n                        opj_mct_data_t *new_mct_records;\n                        l_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;\n\n                        new_mct_records = (opj_mct_data_t *) opj_realloc(l_tcp->m_mct_records, l_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));\n                        if (! new_mct_records) {\n                                opj_free(l_tcp->m_mct_records);\n                                l_tcp->m_mct_records = NULL;\n                                l_tcp->m_nb_max_mct_records = 0;\n                                l_tcp->m_nb_mct_records = 0;\n                                opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to read MCT marker\\n\");\n                                return OPJ_FALSE;\n                        }\n                        l_tcp->m_mct_records = new_mct_records;\n                        l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;\n                        memset(l_mct_data ,0,(l_tcp->m_nb_max_mct_records - l_tcp->m_nb_mct_records) * sizeof(opj_mct_data_t));\n                }\n\n                l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;\n        }\n\n        if (l_mct_data->m_data) {\n                opj_free(l_mct_data->m_data);\n                l_mct_data->m_data = 00;\n        }\n\n        l_mct_data->m_index = l_indix;\n        l_mct_data->m_array_type = (J2K_MCT_ARRAY_TYPE)((l_tmp  >> 8) & 3);\n        l_mct_data->m_element_type = (J2K_MCT_ELEMENT_TYPE)((l_tmp  >> 10) & 3);\n\n        opj_read_bytes(p_header_data,&l_tmp,2);                         /* Ymct */\n        p_header_data+=2;\n        if (l_tmp != 0) {\n                opj_event_msg(p_manager, EVT_WARNING, \"Cannot take in charge multiple MCT markers\\n\");\n                return OPJ_TRUE;\n        }\n\n        p_header_size -= 6;\n\n        l_mct_data->m_data = (OPJ_BYTE*)opj_malloc(p_header_size);\n        if (! l_mct_data->m_data) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading MCT marker\\n\");\n                return OPJ_FALSE;\n        }\n        memcpy(l_mct_data->m_data,p_header_data,p_header_size);\n\n        l_mct_data->m_data_size = p_header_size;\n        ++l_tcp->m_nb_mct_records;\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_write_mcc_record(      opj_j2k_t *p_j2k,\n                                                                struct opj_simple_mcc_decorrelation_data * p_mcc_record,\n                                                                struct opj_stream_private *p_stream,\n                                                                struct opj_event_mgr * p_manager )\n{\n        OPJ_UINT32 i;\n        OPJ_UINT32 l_mcc_size;\n        OPJ_BYTE * l_current_data = 00;\n        OPJ_UINT32 l_nb_bytes_for_comp;\n        OPJ_UINT32 l_mask;\n        OPJ_UINT32 l_tmcc;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        if (p_mcc_record->m_nb_comps > 255 ) {\n        l_nb_bytes_for_comp = 2;\n                l_mask = 0x8000;\n        }\n        else {\n                l_nb_bytes_for_comp = 1;\n                l_mask = 0;\n        }\n\n        l_mcc_size = p_mcc_record->m_nb_comps * 2 * l_nb_bytes_for_comp + 19;\n        if (l_mcc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size)\n        {\n                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mcc_size);\n                if (! new_header_tile_data) {\n                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);\n                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;\n                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;\n                        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to write MCC marker\\n\");\n                        return OPJ_FALSE;\n                }\n                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;\n                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mcc_size;\n        }\n\n        l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;\n\n        opj_write_bytes(l_current_data,J2K_MS_MCC,2);                                   /* MCC */\n        l_current_data += 2;\n\n        opj_write_bytes(l_current_data,l_mcc_size-2,2);                                 /* Lmcc */\n        l_current_data += 2;\n\n        /* first marker */\n        opj_write_bytes(l_current_data,0,2);                                    /* Zmcc */\n        l_current_data += 2;\n\n        opj_write_bytes(l_current_data,p_mcc_record->m_index,1);                                        /* Imcc -> no need for other values, take the first */\n        ++l_current_data;\n\n        /* only one marker atm */\n        opj_write_bytes(l_current_data,0,2);                                    /* Ymcc */\n        l_current_data+=2;\n\n        opj_write_bytes(l_current_data,1,2);                                    /* Qmcc -> number of collections -> 1 */\n        l_current_data+=2;\n\n        opj_write_bytes(l_current_data,0x1,1);                                  /* Xmcci type of component transformation -> array based decorrelation */\n        ++l_current_data;\n\n        opj_write_bytes(l_current_data,p_mcc_record->m_nb_comps | l_mask,2);    /* Nmcci number of input components involved and size for each component offset = 8 bits */\n        l_current_data+=2;\n\n        for (i=0;i<p_mcc_record->m_nb_comps;++i) {\n                opj_write_bytes(l_current_data,i,l_nb_bytes_for_comp);                          /* Cmccij Component offset*/\n                l_current_data+=l_nb_bytes_for_comp;\n        }\n\n        opj_write_bytes(l_current_data,p_mcc_record->m_nb_comps|l_mask,2);      /* Mmcci number of output components involved and size for each component offset = 8 bits */\n        l_current_data+=2;\n\n        for (i=0;i<p_mcc_record->m_nb_comps;++i)\n        {\n                opj_write_bytes(l_current_data,i,l_nb_bytes_for_comp);                          /* Wmccij Component offset*/\n                l_current_data+=l_nb_bytes_for_comp;\n        }\n\n        l_tmcc = ((!p_mcc_record->m_is_irreversible)&1)<<16;\n\n        if (p_mcc_record->m_decorrelation_array) {\n                l_tmcc |= p_mcc_record->m_decorrelation_array->m_index;\n        }\n\n        if (p_mcc_record->m_offset_array) {\n                l_tmcc |= ((p_mcc_record->m_offset_array->m_index)<<8);\n        }\n\n        opj_write_bytes(l_current_data,l_tmcc,3);       /* Tmcci : use MCT defined as number 1 and irreversible array based. */\n        l_current_data+=3;\n\n        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_mcc_size,p_manager) != l_mcc_size) {\n                return OPJ_FALSE;\n        }\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_read_mcc (     opj_j2k_t *p_j2k,\n                                                OPJ_BYTE * p_header_data,\n                                                OPJ_UINT32 p_header_size,\n                                                opj_event_mgr_t * p_manager )\n{\n        OPJ_UINT32 i,j;\n        OPJ_UINT32 l_tmp;\n        OPJ_UINT32 l_indix;\n        opj_tcp_t * l_tcp;\n        opj_simple_mcc_decorrelation_data_t * l_mcc_record;\n        opj_mct_data_t * l_mct_data;\n        OPJ_UINT32 l_nb_collections;\n        OPJ_UINT32 l_nb_comps;\n        OPJ_UINT32 l_nb_bytes_by_comp;\n\n        /* preconditions */\n        assert(p_header_data != 00);\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n\n        l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?\n                        &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :\n                        p_j2k->m_specific_param.m_decoder.m_default_tcp;\n\n        if (p_header_size < 2) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading MCC marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        /* first marker */\n        opj_read_bytes(p_header_data,&l_tmp,2);                         /* Zmcc */\n        p_header_data += 2;\n        if (l_tmp != 0) {\n                opj_event_msg(p_manager, EVT_WARNING, \"Cannot take in charge multiple data spanning\\n\");\n                return OPJ_TRUE;\n        }\n\n        if (p_header_size < 7) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading MCC marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        opj_read_bytes(p_header_data,&l_indix,1); /* Imcc -> no need for other values, take the first */\n        ++p_header_data;\n\n        l_mcc_record = l_tcp->m_mcc_records;\n\n        for(i=0;i<l_tcp->m_nb_mcc_records;++i) {\n                if (l_mcc_record->m_index == l_indix) {\n                        break;\n                }\n                ++l_mcc_record;\n        }\n\n        /** NOT FOUND */\n        if (i == l_tcp->m_nb_mcc_records) {\n                if (l_tcp->m_nb_mcc_records == l_tcp->m_nb_max_mcc_records) {\n                        opj_simple_mcc_decorrelation_data_t *new_mcc_records;\n                        l_tcp->m_nb_max_mcc_records += OPJ_J2K_MCC_DEFAULT_NB_RECORDS;\n\n                        new_mcc_records = (opj_simple_mcc_decorrelation_data_t *) opj_realloc(\n                                        l_tcp->m_mcc_records, l_tcp->m_nb_max_mcc_records * sizeof(opj_simple_mcc_decorrelation_data_t));\n                        if (! new_mcc_records) {\n                                opj_free(l_tcp->m_mcc_records);\n                                l_tcp->m_mcc_records = NULL;\n                                l_tcp->m_nb_max_mcc_records = 0;\n                                l_tcp->m_nb_mcc_records = 0;\n                                opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to read MCC marker\\n\");\n                                return OPJ_FALSE;\n                        }\n                        l_tcp->m_mcc_records = new_mcc_records;\n                        l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records;\n                        memset(l_mcc_record,0,(l_tcp->m_nb_max_mcc_records-l_tcp->m_nb_mcc_records) * sizeof(opj_simple_mcc_decorrelation_data_t));\n                }\n                l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records;\n        }\n        l_mcc_record->m_index = l_indix;\n\n        /* only one marker atm */\n        opj_read_bytes(p_header_data,&l_tmp,2);                         /* Ymcc */\n        p_header_data+=2;\n        if (l_tmp != 0) {\n                opj_event_msg(p_manager, EVT_WARNING, \"Cannot take in charge multiple data spanning\\n\");\n                return OPJ_TRUE;\n        }\n\n        opj_read_bytes(p_header_data,&l_nb_collections,2);                              /* Qmcc -> number of collections -> 1 */\n        p_header_data+=2;\n\n        if (l_nb_collections > 1) {\n                opj_event_msg(p_manager, EVT_WARNING, \"Cannot take in charge multiple collections\\n\");\n                return OPJ_TRUE;\n        }\n\n        p_header_size -= 7;\n\n        for (i=0;i<l_nb_collections;++i) {\n                if (p_header_size < 3) {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Error reading MCC marker\\n\");\n                        return OPJ_FALSE;\n                }\n\n                opj_read_bytes(p_header_data,&l_tmp,1); /* Xmcci type of component transformation -> array based decorrelation */\n                ++p_header_data;\n\n                if (l_tmp != 1) {\n                        opj_event_msg(p_manager, EVT_WARNING, \"Cannot take in charge collections other than array decorrelation\\n\");\n                        return OPJ_TRUE;\n                }\n\n                opj_read_bytes(p_header_data,&l_nb_comps,2);\n\n                p_header_data+=2;\n                p_header_size-=3;\n\n                l_nb_bytes_by_comp = 1 + (l_nb_comps>>15);\n                l_mcc_record->m_nb_comps = l_nb_comps & 0x7fff;\n\n                if (p_header_size < (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 2)) {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Error reading MCC marker\\n\");\n                        return OPJ_FALSE;\n                }\n\n                p_header_size -= (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 2);\n\n                for (j=0;j<l_mcc_record->m_nb_comps;++j) {\n                        opj_read_bytes(p_header_data,&l_tmp,l_nb_bytes_by_comp);        /* Cmccij Component offset*/\n                        p_header_data+=l_nb_bytes_by_comp;\n\n                        if (l_tmp != j) {\n                                opj_event_msg(p_manager, EVT_WARNING, \"Cannot take in charge collections with indix shuffle\\n\");\n                                return OPJ_TRUE;\n                        }\n                }\n\n                opj_read_bytes(p_header_data,&l_nb_comps,2);\n                p_header_data+=2;\n\n                l_nb_bytes_by_comp = 1 + (l_nb_comps>>15);\n                l_nb_comps &= 0x7fff;\n\n                if (l_nb_comps != l_mcc_record->m_nb_comps) {\n                        opj_event_msg(p_manager, EVT_WARNING, \"Cannot take in charge collections without same number of indixes\\n\");\n                        return OPJ_TRUE;\n                }\n\n                if (p_header_size < (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 3)) {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Error reading MCC marker\\n\");\n                        return OPJ_FALSE;\n                }\n\n                p_header_size -= (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 3);\n\n                for (j=0;j<l_mcc_record->m_nb_comps;++j) {\n                        opj_read_bytes(p_header_data,&l_tmp,l_nb_bytes_by_comp);        /* Wmccij Component offset*/\n                        p_header_data+=l_nb_bytes_by_comp;\n\n                        if (l_tmp != j) {\n                                opj_event_msg(p_manager, EVT_WARNING, \"Cannot take in charge collections with indix shuffle\\n\");\n                                return OPJ_TRUE;\n                        }\n                }\n\n                opj_read_bytes(p_header_data,&l_tmp,3); /* Wmccij Component offset*/\n                p_header_data += 3;\n\n                l_mcc_record->m_is_irreversible = ! ((l_tmp>>16) & 1);\n                l_mcc_record->m_decorrelation_array = 00;\n                l_mcc_record->m_offset_array = 00;\n\n                l_indix = l_tmp & 0xff;\n                if (l_indix != 0) {\n                        l_mct_data = l_tcp->m_mct_records;\n                        for (j=0;j<l_tcp->m_nb_mct_records;++j) {\n                                if (l_mct_data->m_index == l_indix) {\n                                        l_mcc_record->m_decorrelation_array = l_mct_data;\n                                        break;\n                                }\n                                ++l_mct_data;\n                        }\n\n                        if (l_mcc_record->m_decorrelation_array == 00) {\n                                opj_event_msg(p_manager, EVT_ERROR, \"Error reading MCC marker\\n\");\n                                return OPJ_FALSE;\n                        }\n                }\n\n                l_indix = (l_tmp >> 8) & 0xff;\n                if (l_indix != 0) {\n                        l_mct_data = l_tcp->m_mct_records;\n                        for (j=0;j<l_tcp->m_nb_mct_records;++j) {\n                                if (l_mct_data->m_index == l_indix) {\n                                        l_mcc_record->m_offset_array = l_mct_data;\n                                        break;\n                                }\n                                ++l_mct_data;\n                        }\n\n                        if (l_mcc_record->m_offset_array == 00) {\n                                opj_event_msg(p_manager, EVT_ERROR, \"Error reading MCC marker\\n\");\n                                return OPJ_FALSE;\n                        }\n                }\n        }\n\n        if (p_header_size != 0) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading MCC marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        ++l_tcp->m_nb_mcc_records;\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_write_mco(     opj_j2k_t *p_j2k,\n                                                struct opj_stream_private *p_stream,\n                                                struct opj_event_mgr * p_manager\n                                  )\n{\n        OPJ_BYTE * l_current_data = 00;\n        OPJ_UINT32 l_mco_size;\n        opj_tcp_t * l_tcp = 00;\n        opj_simple_mcc_decorrelation_data_t * l_mcc_record;\n        OPJ_UINT32 i;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        l_tcp =&(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);\n        l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;\n\n        l_mco_size = 5 + l_tcp->m_nb_mcc_records;\n        if (l_mco_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {\n\n                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mco_size);\n                if (! new_header_tile_data) {\n                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);\n                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;\n                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;\n                        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to write MCO marker\\n\");\n                        return OPJ_FALSE;\n                }\n                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;\n                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mco_size;\n        }\n\n        opj_write_bytes(l_current_data,J2K_MS_MCO,2);                   /* MCO */\n        l_current_data += 2;\n\n        opj_write_bytes(l_current_data,l_mco_size-2,2);                 /* Lmco */\n        l_current_data += 2;\n\n        opj_write_bytes(l_current_data,l_tcp->m_nb_mcc_records,1);      /* Nmco : only one tranform stage*/\n        ++l_current_data;\n\n        l_mcc_record = l_tcp->m_mcc_records;\n        for     (i=0;i<l_tcp->m_nb_mcc_records;++i) {\n                opj_write_bytes(l_current_data,l_mcc_record->m_index,1);/* Imco -> use the mcc indicated by 1*/\n                ++l_current_data;\n\n                ++l_mcc_record;\n        }\n\n        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_mco_size,p_manager) != l_mco_size) {\n                return OPJ_FALSE;\n        }\n\n        return OPJ_TRUE;\n}\n\n/**\n * Reads a MCO marker (Multiple Component Transform Ordering)\n *\n * @param       p_header_data   the data contained in the MCO box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the MCO marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_mco (      opj_j2k_t *p_j2k,\n                                                                    OPJ_BYTE * p_header_data,\n                                                                    OPJ_UINT32 p_header_size,\n                                                                    opj_event_mgr_t * p_manager\n                                    )\n{\n        OPJ_UINT32 l_tmp, i;\n        OPJ_UINT32 l_nb_stages;\n        opj_tcp_t * l_tcp;\n        opj_tccp_t * l_tccp;\n        opj_image_t * l_image;\n\n        /* preconditions */\n        assert(p_header_data != 00);\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n\n        l_image = p_j2k->m_private_image;\n        l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?\n                        &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :\n                        p_j2k->m_specific_param.m_decoder.m_default_tcp;\n\n        if (p_header_size < 1) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading MCO marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        opj_read_bytes(p_header_data,&l_nb_stages,1);                           /* Nmco : only one tranform stage*/\n        ++p_header_data;\n\n        if (l_nb_stages > 1) {\n                opj_event_msg(p_manager, EVT_WARNING, \"Cannot take in charge multiple transformation stages.\\n\");\n                return OPJ_TRUE;\n        }\n\n        if (p_header_size != l_nb_stages + 1) {\n                opj_event_msg(p_manager, EVT_WARNING, \"Error reading MCO marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        l_tccp = l_tcp->tccps;\n\n        for (i=0;i<l_image->numcomps;++i) {\n                l_tccp->m_dc_level_shift = 0;\n                ++l_tccp;\n        }\n\n        if (l_tcp->m_mct_decoding_matrix) {\n                opj_free(l_tcp->m_mct_decoding_matrix);\n                l_tcp->m_mct_decoding_matrix = 00;\n        }\n\n        for (i=0;i<l_nb_stages;++i) {\n                opj_read_bytes(p_header_data,&l_tmp,1);\n                ++p_header_data;\n\n                if (! opj_j2k_add_mct(l_tcp,p_j2k->m_private_image,l_tmp)) {\n                        return OPJ_FALSE;\n                }\n        }\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image, OPJ_UINT32 p_index)\n{\n        OPJ_UINT32 i;\n        opj_simple_mcc_decorrelation_data_t * l_mcc_record;\n        opj_mct_data_t * l_deco_array, * l_offset_array;\n        OPJ_UINT32 l_data_size,l_mct_size, l_offset_size;\n        OPJ_UINT32 l_nb_elem;\n        OPJ_UINT32 * l_offset_data, * l_current_offset_data;\n        opj_tccp_t * l_tccp;\n\n        /* preconditions */\n        assert(p_tcp != 00);\n\n        l_mcc_record = p_tcp->m_mcc_records;\n\n        for (i=0;i<p_tcp->m_nb_mcc_records;++i) {\n                if (l_mcc_record->m_index == p_index) {\n                        break;\n                }\n        }\n\n        if (i==p_tcp->m_nb_mcc_records) {\n                /** element discarded **/\n                return OPJ_TRUE;\n        }\n\n        if (l_mcc_record->m_nb_comps != p_image->numcomps) {\n                /** do not support number of comps != image */\n                return OPJ_TRUE;\n        }\n\n        l_deco_array = l_mcc_record->m_decorrelation_array;\n\n        if (l_deco_array) {\n                l_data_size = MCT_ELEMENT_SIZE[l_deco_array->m_element_type] * p_image->numcomps * p_image->numcomps;\n                if (l_deco_array->m_data_size != l_data_size) {\n                        return OPJ_FALSE;\n                }\n\n                l_nb_elem = p_image->numcomps * p_image->numcomps;\n                l_mct_size = l_nb_elem * (OPJ_UINT32)sizeof(OPJ_FLOAT32);\n                p_tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(l_mct_size);\n\n                if (! p_tcp->m_mct_decoding_matrix ) {\n                        return OPJ_FALSE;\n                }\n\n                j2k_mct_read_functions_to_float[l_deco_array->m_element_type](l_deco_array->m_data,p_tcp->m_mct_decoding_matrix,l_nb_elem);\n        }\n\n        l_offset_array = l_mcc_record->m_offset_array;\n\n        if (l_offset_array) {\n                l_data_size = MCT_ELEMENT_SIZE[l_offset_array->m_element_type] * p_image->numcomps;\n                if (l_offset_array->m_data_size != l_data_size) {\n                        return OPJ_FALSE;\n                }\n\n                l_nb_elem = p_image->numcomps;\n                l_offset_size = l_nb_elem * (OPJ_UINT32)sizeof(OPJ_UINT32);\n                l_offset_data = (OPJ_UINT32*)opj_malloc(l_offset_size);\n\n                if (! l_offset_data ) {\n                        return OPJ_FALSE;\n                }\n\n                j2k_mct_read_functions_to_int32[l_offset_array->m_element_type](l_offset_array->m_data,l_offset_data,l_nb_elem);\n\n                l_tccp = p_tcp->tccps;\n                l_current_offset_data = l_offset_data;\n\n                for (i=0;i<p_image->numcomps;++i) {\n                        l_tccp->m_dc_level_shift = (OPJ_INT32)*(l_current_offset_data++);\n                        ++l_tccp;\n                }\n\n                opj_free(l_offset_data);\n        }\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_write_cbd( opj_j2k_t *p_j2k,\n                                                struct opj_stream_private *p_stream,\n                                                struct opj_event_mgr * p_manager )\n{\n        OPJ_UINT32 i;\n        OPJ_UINT32 l_cbd_size;\n        OPJ_BYTE * l_current_data = 00;\n        opj_image_t *l_image = 00;\n        opj_image_comp_t * l_comp = 00;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        l_image = p_j2k->m_private_image;\n        l_cbd_size = 6 + p_j2k->m_private_image->numcomps;\n\n        if (l_cbd_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {\n                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_cbd_size);\n                if (! new_header_tile_data) {\n                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);\n                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;\n                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;\n                        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to write CBD marker\\n\");\n                        return OPJ_FALSE;\n                }\n                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;\n                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_cbd_size;\n        }\n\n        l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;\n\n        opj_write_bytes(l_current_data,J2K_MS_CBD,2);                   /* CBD */\n        l_current_data += 2;\n\n        opj_write_bytes(l_current_data,l_cbd_size-2,2);                 /* L_CBD */\n        l_current_data += 2;\n\n        opj_write_bytes(l_current_data,l_image->numcomps, 2);           /* Ncbd */\n        l_current_data+=2;\n\n        l_comp = l_image->comps;\n\n        for (i=0;i<l_image->numcomps;++i) {\n                opj_write_bytes(l_current_data, (l_comp->sgnd << 7) | (l_comp->prec - 1), 1);           /* Component bit depth */\n                ++l_current_data;\n\n                ++l_comp;\n        }\n\n        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_cbd_size,p_manager) != l_cbd_size) {\n                return OPJ_FALSE;\n        }\n\n        return OPJ_TRUE;\n}\n\n/**\n * Reads a CBD marker (Component bit depth definition)\n * @param       p_header_data   the data contained in the CBD box.\n * @param       p_j2k                   the jpeg2000 codec.\n * @param       p_header_size   the size of the data contained in the CBD marker.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_read_cbd (      opj_j2k_t *p_j2k,\n                                                                OPJ_BYTE * p_header_data,\n                                                                OPJ_UINT32 p_header_size,\n                                                                opj_event_mgr_t * p_manager\n                                    )\n{\n        OPJ_UINT32 l_nb_comp,l_num_comp;\n        OPJ_UINT32 l_comp_def;\n        OPJ_UINT32 i;\n        opj_image_comp_t * l_comp = 00;\n\n        /* preconditions */\n        assert(p_header_data != 00);\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n\n        l_num_comp = p_j2k->m_private_image->numcomps;\n\n        if (p_header_size != (p_j2k->m_private_image->numcomps + 2)) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Crror reading CBD marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        opj_read_bytes(p_header_data,&l_nb_comp,2);                             /* Ncbd */\n        p_header_data+=2;\n\n        if (l_nb_comp != l_num_comp) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Crror reading CBD marker\\n\");\n                return OPJ_FALSE;\n        }\n\n        l_comp = p_j2k->m_private_image->comps;\n        for (i=0;i<l_num_comp;++i) {\n                opj_read_bytes(p_header_data,&l_comp_def,1);                    /* Component bit depth */\n                ++p_header_data;\n        l_comp->sgnd = (l_comp_def>>7) & 1;\n                l_comp->prec = (l_comp_def&0x7f) + 1;\n                ++l_comp;\n        }\n\n        return OPJ_TRUE;\n}\n\n/* ----------------------------------------------------------------------- */\n/* J2K / JPT decoder interface                                             */\n/* ----------------------------------------------------------------------- */\n\nvoid opj_j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters)\n{\n        if(j2k && parameters) {\n                j2k->m_cp.m_specific_param.m_dec.m_layer = parameters->cp_layer;\n                j2k->m_cp.m_specific_param.m_dec.m_reduce = parameters->cp_reduce;\n\n#ifdef USE_JPWL\n                j2k->m_cp.correct = parameters->jpwl_correct;\n                j2k->m_cp.exp_comps = parameters->jpwl_exp_comps;\n                j2k->m_cp.max_tiles = parameters->jpwl_max_tiles;\n#endif /* USE_JPWL */\n        }\n}\n\n/* ----------------------------------------------------------------------- */\n/* J2K encoder interface                                                       */\n/* ----------------------------------------------------------------------- */\n\nopj_j2k_t* opj_j2k_create_compress(void)\n{\n        opj_j2k_t *l_j2k = (opj_j2k_t*) opj_malloc(sizeof(opj_j2k_t));\n        if (!l_j2k) {\n                return NULL;\n        }\n\n        memset(l_j2k,0,sizeof(opj_j2k_t));\n\n        l_j2k->m_is_decoder = 0;\n        l_j2k->m_cp.m_is_decoder = 0;\n\n        l_j2k->m_specific_param.m_encoder.m_header_tile_data = (OPJ_BYTE *) opj_malloc(OPJ_J2K_DEFAULT_HEADER_SIZE);\n        if (! l_j2k->m_specific_param.m_encoder.m_header_tile_data) {\n                opj_j2k_destroy(l_j2k);\n                return NULL;\n        }\n\n        l_j2k->m_specific_param.m_encoder.m_header_tile_data_size = OPJ_J2K_DEFAULT_HEADER_SIZE;\n\n        /* validation list creation*/\n        l_j2k->m_validation_list = opj_procedure_list_create();\n        if (! l_j2k->m_validation_list) {\n                opj_j2k_destroy(l_j2k);\n                return NULL;\n        }\n\n        /* execution list creation*/\n        l_j2k->m_procedure_list = opj_procedure_list_create();\n        if (! l_j2k->m_procedure_list) {\n                opj_j2k_destroy(l_j2k);\n                return NULL;\n        }\n\n        return l_j2k;\n}\n\nint opj_j2k_initialise_4K_poc(opj_poc_t *POC, int numres){\n    POC[0].tile  = 1;\n    POC[0].resno0  = 0;\n    POC[0].compno0 = 0;\n    POC[0].layno1  = 1;\n    POC[0].resno1  = (OPJ_UINT32)(numres-1);\n    POC[0].compno1 = 3;\n    POC[0].prg1 = OPJ_CPRL;\n    POC[1].tile  = 1;\n    POC[1].resno0  = (OPJ_UINT32)(numres-1);\n    POC[1].compno0 = 0;\n    POC[1].layno1  = 1;\n    POC[1].resno1  = (OPJ_UINT32)numres;\n    POC[1].compno1 = 3;\n    POC[1].prg1 = OPJ_CPRL;\n    return 2;\n}\n\nvoid opj_j2k_set_cinema_parameters(opj_cparameters_t *parameters, opj_image_t *image, opj_event_mgr_t *p_manager)\n{\n    /* Configure cinema parameters */\n    OPJ_FLOAT32 max_rate = 0;\n    OPJ_FLOAT32 temp_rate = 0;\n    int i;\n\n    /* profile (Rsiz) */\n    switch (parameters->cp_cinema){\n    case OPJ_CINEMA2K_24:\n    case OPJ_CINEMA2K_48:\n        parameters->cp_rsiz = OPJ_CINEMA2K;\n        break;\n    case OPJ_CINEMA4K_24:\n        parameters->cp_rsiz = OPJ_CINEMA4K;\n        break;\n    case OPJ_OFF:\n        assert(0);\n        break;\n    }\n\n    /* No tiling */\n    parameters->tile_size_on = OPJ_FALSE;\n    parameters->cp_tdx=1;\n    parameters->cp_tdy=1;\n\n    /* One tile part for each component */\n    parameters->tp_flag = 'C';\n    parameters->tp_on = 1;\n\n    /* Tile and Image shall be at (0,0) */\n    parameters->cp_tx0 = 0;\n    parameters->cp_ty0 = 0;\n    parameters->image_offset_x0 = 0;\n    parameters->image_offset_y0 = 0;\n\n    /* Codeblock size= 32*32 */\n    parameters->cblockw_init = 32;\n    parameters->cblockh_init = 32;\n\n    /* Codeblock style: no mode switch enabled */\n    parameters->mode = 0;\n\n    /* No ROI */\n    parameters->roi_compno = -1;\n\n    /* No subsampling */\n    parameters->subsampling_dx = 1;\n    parameters->subsampling_dy = 1;\n\n    /* 9-7 transform */\n    parameters->irreversible = 1;\n\n    /* Number of layers */\n    if (parameters->tcp_numlayers > 1){\n        opj_event_msg(p_manager, EVT_WARNING,\n                \"JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\\n\"\n                \"1 single quality layer\"\n                \"-> Number of layers forced to 1 (rather than %d)\\n\",\n                parameters->tcp_numlayers);\n        parameters->tcp_numlayers = 1;\n    }\n\n    /* Resolution levels */\n    switch (parameters->cp_cinema){\n    case OPJ_CINEMA2K_24:\n    case OPJ_CINEMA2K_48:\n        if(parameters->numresolution > 6){\n            opj_event_msg(p_manager, EVT_WARNING,\n                    \"JPEG 2000 Profile-3 (2k dc profile) requires:\\n\"\n                    \"Number of decomposition levels <= 5\\n\"\n                    \"-> Number of decomposition levels forced to 5 (rather than %d)\\n\",\n                    parameters->numresolution+1);\n            parameters->numresolution = 6;\n        }\n        break;\n    case OPJ_CINEMA4K_24:\n        if(parameters->numresolution < 2){\n            opj_event_msg(p_manager, EVT_WARNING,\n                    \"JPEG 2000 Profile-4 (4k dc profile) requires:\\n\"\n                    \"Number of decomposition levels >= 1 && <= 6\\n\"\n                    \"-> Number of decomposition levels forced to 1 (rather than %d)\\n\",\n                    parameters->numresolution+1);\n            parameters->numresolution = 1;\n        }else if(parameters->numresolution > 7){\n            opj_event_msg(p_manager, EVT_WARNING,\n                    \"JPEG 2000 Profile-4 (4k dc profile) requires:\\n\"\n                    \"Number of decomposition levels >= 1 && <= 6\\n\"\n                    \"-> Number of decomposition levels forced to 6 (rather than %d)\\n\",\n                    parameters->numresolution+1);\n            parameters->numresolution = 7;\n        }\n        break;\n    default :\n        break;\n    }\n\n    /* Precincts */\n    parameters->csty |= 0x01;\n    parameters->res_spec = parameters->numresolution-1;\n    for (i = 0; i<parameters->res_spec; i++) {\n        parameters->prcw_init[i] = 256;\n        parameters->prch_init[i] = 256;\n    }\n\n    /* The progression order shall be CPRL */\n    parameters->prog_order = OPJ_CPRL;\n\n    /* Progression order changes for 4K, disallowed for 2K */\n    if (parameters->cp_cinema == OPJ_CINEMA4K_24) {\n        parameters->numpocs = (OPJ_UINT32)opj_j2k_initialise_4K_poc(parameters->POC,parameters->numresolution);\n    } else {\n        parameters->numpocs = 0;\n    }\n\n    /* Limited bit-rate */\n    parameters->cp_disto_alloc = 1;\n    switch (parameters->cp_cinema){\n    case OPJ_CINEMA2K_24:\n    case OPJ_CINEMA4K_24:\n        max_rate = (OPJ_FLOAT32) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec)/\n                (OPJ_FLOAT32)(CINEMA_24_CS * 8 * image->comps[0].dx * image->comps[0].dy);\n        if (parameters->tcp_rates[0] == 0){\n            parameters->tcp_rates[0] = max_rate;\n        }else{\n            temp_rate =(OPJ_FLOAT32)(image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec)/\n                    (parameters->tcp_rates[0] * 8 * (OPJ_FLOAT32)image->comps[0].dx * (OPJ_FLOAT32)image->comps[0].dy);\n            if (temp_rate > CINEMA_24_CS ){\n                opj_event_msg(p_manager, EVT_WARNING,\n                        \"JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\\n\"\n                        \"Maximum 1302083 compressed bytes @ 24fps\\n\"\n                        \"-> Specified rate (%3.1f) exceeds this limit. Rate will be forced to %3.1f.\\n\",\n                        parameters->tcp_rates[0], max_rate);\n                parameters->tcp_rates[0]= max_rate;\n            }else{\n                opj_event_msg(p_manager, EVT_WARNING,\n                        \"JPEG 2000 Profile-3 and 4 (2k/4k dc profile):\\n\"\n                        \"INFO : Specified rate (%3.1f) is below the 2k/4k limit @ 24fps.\\n\",\n                        parameters->tcp_rates[0]);\n            }\n        }\n        parameters->max_comp_size = COMP_24_CS;\n        break;\n    case OPJ_CINEMA2K_48:\n        max_rate = ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/\n                (float)(CINEMA_48_CS * 8 * image->comps[0].dx * image->comps[0].dy);\n        if (parameters->tcp_rates[0] == 0){\n            parameters->tcp_rates[0] = max_rate;\n        }else{\n            temp_rate =((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/\n                    (parameters->tcp_rates[0] * 8 * (float)image->comps[0].dx * (float)image->comps[0].dy);\n            if (temp_rate > CINEMA_48_CS ){\n                opj_event_msg(p_manager, EVT_WARNING,\n                        \"JPEG 2000 Profile-3 (2k dc profile) requires:\\n\"\n                        \"Maximum 651041 compressed bytes @ 48fps\\n\"\n                        \"-> Specified rate (%3.1f) exceeds this limit. Rate will be forced to %3.1f.\\n\",\n                        parameters->tcp_rates[0], max_rate);\n                parameters->tcp_rates[0]= max_rate;\n            }else{\n                opj_event_msg(p_manager, EVT_WARNING,\n                        \"JPEG 2000 Profile-3 (2k dc profile):\\n\"\n                        \"INFO : Specified rate (%3.1f) is below the 2k limit @ 48 fps.\\n\",\n                        parameters->tcp_rates[0]);\n            }\n        }\n        parameters->max_comp_size = COMP_48_CS;\n        break;\n    default:\n        break;\n    }\n}\n\nOPJ_BOOL opj_j2k_is_cinema_compliant(opj_image_t *image, OPJ_CINEMA_MODE cinema_mode, opj_event_mgr_t *p_manager)\n{\n    OPJ_UINT32 i;\n\n    /* Number of components */\n    if (image->numcomps != 3){\n        opj_event_msg(p_manager, EVT_WARNING,\n                \"JPEG 2000 Profile-3 (2k dc profile) requires:\\n\"\n                \"3 components\"\n                \"-> Number of components of input image (%d) is not compliant\\n\"\n                \"-> Non-profile-3 codestream will be generated\\n\",\n                image->numcomps);\n        return OPJ_FALSE;\n    }\n\n    /* Bitdepth */\n    for (i = 0; i < image->numcomps; i++) {\n        if ((image->comps[i].bpp != 12) | (image->comps[i].sgnd)){\n            char signed_str[] = \"signed\";\n            char unsigned_str[] = \"unsigned\";\n            char *tmp_str = image->comps[i].sgnd?signed_str:unsigned_str;\n            opj_event_msg(p_manager, EVT_WARNING,\n                    \"JPEG 2000 Profile-3 (2k dc profile) requires:\\n\"\n                    \"Precision of each component shall be 12 bits unsigned\"\n                    \"-> At least component %d of input image (%d bits, %s) is not compliant\\n\"\n                    \"-> Non-profile-3 codestream will be generated\\n\",\n                    i,image->comps[i].bpp, tmp_str);\n            return OPJ_FALSE;\n        }\n    }\n\n    /* Image size */\n    switch (cinema_mode){\n    case OPJ_CINEMA2K_24:\n    case OPJ_CINEMA2K_48:\n        if (((image->comps[0].w > 2048) | (image->comps[0].h > 1080))){\n            opj_event_msg(p_manager, EVT_WARNING,\n                    \"JPEG 2000 Profile-3 (2k dc profile) requires:\\n\"\n                    \"width <= 2048 and height <= 1080\\n\"\n                    \"-> Input image size %d x %d is not compliant\\n\"\n                    \"-> Non-profile-3 codestream will be generated\\n\",\n                    image->comps[0].w,image->comps[0].h);\n            return OPJ_FALSE;\n        }\n        break;\n    case OPJ_CINEMA4K_24:\n        if (((image->comps[0].w > 4096) | (image->comps[0].h > 2160))){\n            opj_event_msg(p_manager, EVT_WARNING,\n                    \"JPEG 2000 Profile-4 (4k dc profile) requires:\\n\"\n                    \"width <= 4096 and height <= 2160\\n\"\n                    \"-> Image size %d x %d is not compliant\\n\"\n                    \"-> Non-profile-4 codestream will be generated\\n\",\n                    image->comps[0].w,image->comps[0].h);\n            return OPJ_FALSE;\n        }\n        break;\n    default :\n        break;\n    }\n\n    return OPJ_TRUE;\n}\n\nvoid opj_j2k_setup_encoder(     opj_j2k_t *p_j2k,\n                                                    opj_cparameters_t *parameters,\n                                                    opj_image_t *image,\n                                                    opj_event_mgr_t * p_manager)\n{\n        OPJ_UINT32 i, j, tileno, numpocs_tile;\n        opj_cp_t *cp = 00;\n\n        if(!p_j2k || !parameters || ! image) {\n                return;\n        }\n\n        /* keep a link to cp so that we can destroy it later in j2k_destroy_compress */\n        cp = &(p_j2k->m_cp);\n\n        /* set default values for cp */\n        cp->tw = 1;\n        cp->th = 1;\n\n        /* set cinema parameters if required */\n        if (parameters->cp_cinema){\n            opj_j2k_set_cinema_parameters(parameters,image,p_manager);\n            if (!opj_j2k_is_cinema_compliant(image,parameters->cp_cinema,p_manager)) {\n                parameters->cp_rsiz = OPJ_STD_RSIZ;\n            }\n        }\n\n        /*\n        copy user encoding parameters\n        */\n        cp->m_specific_param.m_enc.m_cinema = parameters->cp_cinema;\n        cp->m_specific_param.m_enc.m_max_comp_size = (OPJ_UINT32)parameters->max_comp_size;\n        cp->rsiz   = parameters->cp_rsiz;\n        cp->m_specific_param.m_enc.m_disto_alloc = (OPJ_UINT32)parameters->cp_disto_alloc & 1u;\n        cp->m_specific_param.m_enc.m_fixed_alloc = (OPJ_UINT32)parameters->cp_fixed_alloc & 1u;\n        cp->m_specific_param.m_enc.m_fixed_quality = (OPJ_UINT32)parameters->cp_fixed_quality & 1u;\n\n        /* mod fixed_quality */\n        if (parameters->cp_fixed_alloc && parameters->cp_matrice) {\n                size_t array_size = (size_t)parameters->tcp_numlayers * (size_t)parameters->numresolution * 3 * sizeof(OPJ_INT32);\n                cp->m_specific_param.m_enc.m_matrice = (OPJ_INT32 *) opj_malloc(array_size);\n                memcpy(cp->m_specific_param.m_enc.m_matrice, parameters->cp_matrice, array_size);\n        }\n\n        /* tiles */\n        cp->tdx = (OPJ_UINT32)parameters->cp_tdx;\n        cp->tdy = (OPJ_UINT32)parameters->cp_tdy;\n\n        /* tile offset */\n        cp->tx0 = (OPJ_UINT32)parameters->cp_tx0;\n        cp->ty0 = (OPJ_UINT32)parameters->cp_ty0;\n\n        /* comment string */\n        if(parameters->cp_comment) {\n                cp->comment = (char*)opj_malloc(strlen(parameters->cp_comment) + 1);\n                if(cp->comment) {\n                        strcpy(cp->comment, parameters->cp_comment);\n                }\n        }\n\n        /*\n        calculate other encoding parameters\n        */\n\n        if (parameters->tile_size_on) {\n                cp->tw = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(image->x1 - cp->tx0), (OPJ_INT32)cp->tdx);\n                cp->th = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(image->y1 - cp->ty0), (OPJ_INT32)cp->tdy);\n        } else {\n                cp->tdx = image->x1 - cp->tx0;\n                cp->tdy = image->y1 - cp->ty0;\n        }\n\n        if (parameters->tp_on) {\n                cp->m_specific_param.m_enc.m_tp_flag = (OPJ_BYTE)parameters->tp_flag;\n                cp->m_specific_param.m_enc.m_tp_on = 1;\n        }\n\n#ifdef USE_JPWL\n        /*\n        calculate JPWL encoding parameters\n        */\n\n        if (parameters->jpwl_epc_on) {\n                OPJ_INT32 i;\n\n                /* set JPWL on */\n                cp->epc_on = OPJ_TRUE;\n                cp->info_on = OPJ_FALSE; /* no informative technique */\n\n                /* set EPB on */\n                if ((parameters->jpwl_hprot_MH > 0) || (parameters->jpwl_hprot_TPH[0] > 0)) {\n                        cp->epb_on = OPJ_TRUE;\n\n                        cp->hprot_MH = parameters->jpwl_hprot_MH;\n                        for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {\n                                cp->hprot_TPH_tileno[i] = parameters->jpwl_hprot_TPH_tileno[i];\n                                cp->hprot_TPH[i] = parameters->jpwl_hprot_TPH[i];\n                        }\n                        /* if tile specs are not specified, copy MH specs */\n                        if (cp->hprot_TPH[0] == -1) {\n                                cp->hprot_TPH_tileno[0] = 0;\n                                cp->hprot_TPH[0] = parameters->jpwl_hprot_MH;\n                        }\n                        for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) {\n                                cp->pprot_tileno[i] = parameters->jpwl_pprot_tileno[i];\n                                cp->pprot_packno[i] = parameters->jpwl_pprot_packno[i];\n                                cp->pprot[i] = parameters->jpwl_pprot[i];\n                        }\n                }\n\n                /* set ESD writing */\n                if ((parameters->jpwl_sens_size == 1) || (parameters->jpwl_sens_size == 2)) {\n                        cp->esd_on = OPJ_TRUE;\n\n                        cp->sens_size = parameters->jpwl_sens_size;\n                        cp->sens_addr = parameters->jpwl_sens_addr;\n                        cp->sens_range = parameters->jpwl_sens_range;\n\n                        cp->sens_MH = parameters->jpwl_sens_MH;\n                        for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {\n                                cp->sens_TPH_tileno[i] = parameters->jpwl_sens_TPH_tileno[i];\n                                cp->sens_TPH[i] = parameters->jpwl_sens_TPH[i];\n                        }\n                }\n\n                /* always set RED writing to false: we are at the encoder */\n                cp->red_on = OPJ_FALSE;\n\n        } else {\n                cp->epc_on = OPJ_FALSE;\n        }\n#endif /* USE_JPWL */\n\n        /* initialize the mutiple tiles */\n        /* ---------------------------- */\n        cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t));\n        if (parameters->numpocs) {\n                /* initialisation of POC */\n                opj_j2k_check_poc_val(parameters->POC,parameters->numpocs, (OPJ_UINT32)parameters->numresolution, image->numcomps, (OPJ_UINT32)parameters->tcp_numlayers, p_manager);\n                /* TODO MSD use the return value*/\n        }\n\n        for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {\n                opj_tcp_t *tcp = &cp->tcps[tileno];\n                tcp->numlayers = (OPJ_UINT32)parameters->tcp_numlayers;\n\n                for (j = 0; j < tcp->numlayers; j++) {\n                        if(cp->m_specific_param.m_enc.m_cinema){\n                                if (cp->m_specific_param.m_enc.m_fixed_quality) {\n                                        tcp->distoratio[j] = parameters->tcp_distoratio[j];\n                                }\n                                tcp->rates[j] = parameters->tcp_rates[j];\n                        }else{\n                                if (cp->m_specific_param.m_enc.m_fixed_quality) {       /* add fixed_quality */\n                                        tcp->distoratio[j] = parameters->tcp_distoratio[j];\n                                } else {\n                                        tcp->rates[j] = parameters->tcp_rates[j];\n                                }\n                        }\n                }\n\n                tcp->csty = (OPJ_UINT32)parameters->csty;\n                tcp->prg = parameters->prog_order;\n                tcp->mct = (OPJ_UINT32)parameters->tcp_mct;\n\n                numpocs_tile = 0;\n                tcp->POC = 0;\n\n                if (parameters->numpocs) {\n                        /* initialisation of POC */\n                        tcp->POC = 1;\n                        for (i = 0; i < parameters->numpocs; i++) {\n                                if (tileno + 1 == parameters->POC[i].tile )  {\n                                        opj_poc_t *tcp_poc = &tcp->pocs[numpocs_tile];\n\n                                        tcp_poc->resno0         = parameters->POC[numpocs_tile].resno0;\n                                        tcp_poc->compno0        = parameters->POC[numpocs_tile].compno0;\n                                        tcp_poc->layno1         = parameters->POC[numpocs_tile].layno1;\n                                        tcp_poc->resno1         = parameters->POC[numpocs_tile].resno1;\n                                        tcp_poc->compno1        = parameters->POC[numpocs_tile].compno1;\n                                        tcp_poc->prg1           = parameters->POC[numpocs_tile].prg1;\n                                        tcp_poc->tile           = parameters->POC[numpocs_tile].tile;\n\n                                        numpocs_tile++;\n                                }\n                        }\n\n                        tcp->numpocs = numpocs_tile -1 ;\n                }else{\n                        tcp->numpocs = 0;\n                }\n\n                tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t));\n\n                if (parameters->mct_data) {\n                      \n                    OPJ_UINT32 lMctSize = image->numcomps * image->numcomps * (OPJ_UINT32)sizeof(OPJ_FLOAT32);\n                    OPJ_FLOAT32 * lTmpBuf = (OPJ_FLOAT32*)opj_malloc(lMctSize);\n                    OPJ_INT32 * l_dc_shift = (OPJ_INT32 *) ((OPJ_BYTE *) parameters->mct_data + lMctSize);\n\n                    tcp->mct = 2;\n                    tcp->m_mct_coding_matrix = (OPJ_FLOAT32*)opj_malloc(lMctSize);\n                    memcpy(tcp->m_mct_coding_matrix,parameters->mct_data,lMctSize);\n                    memcpy(lTmpBuf,parameters->mct_data,lMctSize);\n\n                    tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(lMctSize);\n                    assert(opj_matrix_inversion_f(lTmpBuf,(tcp->m_mct_decoding_matrix),image->numcomps));\n\n                    tcp->mct_norms = (OPJ_FLOAT64*)\n                                    opj_malloc(image->numcomps * sizeof(OPJ_FLOAT64));\n\n                    opj_calculate_norms(tcp->mct_norms,image->numcomps,tcp->m_mct_decoding_matrix);\n                    opj_free(lTmpBuf);\n\n                    for (i = 0; i < image->numcomps; i++) {\n                            opj_tccp_t *tccp = &tcp->tccps[i];\n                            tccp->m_dc_level_shift = l_dc_shift[i];\n                    }\n\n                    opj_j2k_setup_mct_encoding(tcp,image);                        \n                }\n                else {\n                        for (i = 0; i < image->numcomps; i++) {\n                                opj_tccp_t *tccp = &tcp->tccps[i];\n                                opj_image_comp_t * l_comp = &(image->comps[i]);\n\n                                if (! l_comp->sgnd) {\n                                        tccp->m_dc_level_shift = 1 << (l_comp->prec - 1);\n                                }\n                        }\n                }\n\n                for (i = 0; i < image->numcomps; i++) {\n                        opj_tccp_t *tccp = &tcp->tccps[i];\n\n                        tccp->csty = parameters->csty & 0x01;   /* 0 => one precinct || 1 => custom precinct  */\n                        tccp->numresolutions = (OPJ_UINT32)parameters->numresolution;\n                        tccp->cblkw = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockw_init);\n                        tccp->cblkh = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockh_init);\n                        tccp->cblksty = (OPJ_UINT32)parameters->mode;\n                        tccp->qmfbid = parameters->irreversible ? 0 : 1;\n                        tccp->qntsty = parameters->irreversible ? J2K_CCP_QNTSTY_SEQNT : J2K_CCP_QNTSTY_NOQNT;\n                        tccp->numgbits = 2;\n\n                        if ((OPJ_INT32)i == parameters->roi_compno) {\n                                tccp->roishift = parameters->roi_shift;\n                        } else {\n                                tccp->roishift = 0;\n                        }\n\n                                if (parameters->csty & J2K_CCP_CSTY_PRT) {\n                                        OPJ_INT32 p = 0, it_res;\n                                        assert( tccp->numresolutions > 0 );\n                                        for (it_res = (OPJ_INT32)tccp->numresolutions - 1; it_res >= 0; it_res--) {\n                                                if (p < parameters->res_spec) {\n\n                                                        if (parameters->prcw_init[p] < 1) {\n                                                                tccp->prcw[it_res] = 1;\n                                                        } else {\n                                                                tccp->prcw[it_res] = (OPJ_UINT32)opj_int_floorlog2(parameters->prcw_init[p]);\n                                                        }\n\n                                                        if (parameters->prch_init[p] < 1) {\n                                                                tccp->prch[it_res] = 1;\n                                                        }else {\n                                                                tccp->prch[it_res] = (OPJ_UINT32)opj_int_floorlog2(parameters->prch_init[p]);\n                                                        }\n\n                                                } else {\n                                                        OPJ_INT32 res_spec = parameters->res_spec;\n                                                        OPJ_INT32 size_prcw = 0;\n                                                        OPJ_INT32 size_prch = 0;\n\n                                                        assert(res_spec>0); /* issue 189 */\n                                                        size_prcw = parameters->prcw_init[res_spec - 1] >> (p - (res_spec - 1));\n                                                        size_prch = parameters->prch_init[res_spec - 1] >> (p - (res_spec - 1));\n\n\n                                                        if (size_prcw < 1) {\n                                                                tccp->prcw[it_res] = 1;\n                                                        } else {\n                                                                tccp->prcw[it_res] = (OPJ_UINT32)opj_int_floorlog2(size_prcw);\n                                                        }\n\n                                                        if (size_prch < 1) {\n                                                                tccp->prch[it_res] = 1;\n                                                        } else {\n                                                                tccp->prch[it_res] = (OPJ_UINT32)opj_int_floorlog2(size_prch);\n                                                        }\n                                                }\n                                                p++;\n                                                /*printf(\"\\nsize precinct for level %d : %d,%d\\n\", it_res,tccp->prcw[it_res], tccp->prch[it_res]); */\n                                        }       /*end for*/\n                                } else {\n                                        for (j = 0; j < tccp->numresolutions; j++) {\n                                                tccp->prcw[j] = 15;\n                                                tccp->prch[j] = 15;\n                                        }\n                                }\n\n                        opj_dwt_calc_explicit_stepsizes(tccp, image->comps[i].prec);\n                }\n        }\n\n        if (parameters->mct_data) {\n                opj_free(parameters->mct_data);\n                parameters->mct_data = 00;\n        }\n}\n\nstatic OPJ_BOOL opj_j2k_add_mhmarker(opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len)\n{\n        assert(cstr_index != 00);\n\n        /* expand the list? */\n        if ((cstr_index->marknum + 1) > cstr_index->maxmarknum) {\n                opj_marker_info_t *new_marker;\n                cstr_index->maxmarknum = (OPJ_UINT32)(100 + (OPJ_FLOAT32) cstr_index->maxmarknum);\n                new_marker = (opj_marker_info_t *) opj_realloc(cstr_index->marker, cstr_index->maxmarknum *sizeof(opj_marker_info_t));\n                if (! new_marker) {\n                        opj_free(cstr_index->marker);\n                        cstr_index->marker = NULL;\n                        cstr_index->maxmarknum = 0;\n                        cstr_index->marknum = 0;\n                        /* opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to add mh marker\\n\"); */\n                        return OPJ_FALSE;\n                }\n                cstr_index->marker = new_marker;\n        }\n\n        /* add the marker */\n        cstr_index->marker[cstr_index->marknum].type = (OPJ_UINT16)type;\n        cstr_index->marker[cstr_index->marknum].pos = (OPJ_INT32)pos;\n        cstr_index->marker[cstr_index->marknum].len = (OPJ_INT32)len;\n        cstr_index->marknum++;\n        return OPJ_TRUE;\n}\n\nstatic OPJ_BOOL opj_j2k_add_tlmarker(OPJ_UINT32 tileno, opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len)\n{\n        assert(cstr_index != 00);\n        assert(cstr_index->tile_index != 00);\n\n        /* expand the list? */\n        if ((cstr_index->tile_index[tileno].marknum + 1) > cstr_index->tile_index[tileno].maxmarknum) {\n                opj_marker_info_t *new_marker;\n                cstr_index->tile_index[tileno].maxmarknum = (OPJ_UINT32)(100 + (OPJ_FLOAT32) cstr_index->tile_index[tileno].maxmarknum);\n                new_marker = (opj_marker_info_t *) opj_realloc(\n                                cstr_index->tile_index[tileno].marker,\n                                cstr_index->tile_index[tileno].maxmarknum *sizeof(opj_marker_info_t));\n                if (! new_marker) {\n                        opj_free(cstr_index->tile_index[tileno].marker);\n                        cstr_index->tile_index[tileno].marker = NULL;\n                        cstr_index->tile_index[tileno].maxmarknum = 0;\n                        cstr_index->tile_index[tileno].marknum = 0;\n                        /* opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to add tl marker\\n\"); */\n                        return OPJ_FALSE;\n                }\n                cstr_index->tile_index[tileno].marker = new_marker;\n        }\n\n        /* add the marker */\n        cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].type = (OPJ_UINT16)type;\n        cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].pos = (OPJ_INT32)pos;\n        cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].len = (OPJ_INT32)len;\n        cstr_index->tile_index[tileno].marknum++;\n\n        if (type == J2K_MS_SOT) {\n                OPJ_UINT32 l_current_tile_part = cstr_index->tile_index[tileno].current_tpsno;\n\n                if (cstr_index->tile_index[tileno].tp_index)\n                        cstr_index->tile_index[tileno].tp_index[l_current_tile_part].start_pos = pos;\n\n        }\n        return OPJ_TRUE;\n}\n\n/*\n * -----------------------------------------------------------------------\n * -----------------------------------------------------------------------\n * -----------------------------------------------------------------------\n */\n\nOPJ_BOOL opj_j2k_end_decompress(opj_j2k_t *p_j2k,\n                                opj_stream_private_t *p_stream,\n                                opj_event_mgr_t * p_manager\n                                )\n{\n    (void)p_j2k;\n    (void)p_stream;\n    (void)p_manager;\n    return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_read_header(   opj_stream_private_t *p_stream,\n                                                            opj_j2k_t* p_j2k,\n                                                            opj_image_t** p_image,\n                                                            opj_event_mgr_t* p_manager )\n{\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_stream != 00);\n        assert(p_manager != 00);\n\n        /* create an empty image header */\n        p_j2k->m_private_image = opj_image_create0();\n        if (! p_j2k->m_private_image) {\n                return OPJ_FALSE;\n        }\n\n        /* customization of the validation */\n        opj_j2k_setup_decoding_validation(p_j2k);\n\n        /* validation of the parameters codec */\n        if (! opj_j2k_exec(p_j2k, p_j2k->m_validation_list, p_stream,p_manager)) {\n                opj_image_destroy(p_j2k->m_private_image);\n                p_j2k->m_private_image = NULL;\n                return OPJ_FALSE;\n        }\n\n        /* customization of the encoding */\n        opj_j2k_setup_header_reading(p_j2k);\n\n        /* read header */\n        if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) {\n                opj_image_destroy(p_j2k->m_private_image);\n                p_j2k->m_private_image = NULL;\n                return OPJ_FALSE;\n        }\n\n        *p_image = opj_image_create0();\n        if (! (*p_image)) {\n                return OPJ_FALSE;\n        }\n\n        /* Copy codestream image information to the output image */\n        opj_copy_image_header(p_j2k->m_private_image, *p_image);\n\n    /*Allocate and initialize some elements of codestrem index*/\n        if (!opj_j2k_allocate_tile_element_cstr_index(p_j2k)){\n                return OPJ_FALSE;\n        }\n\n        return OPJ_TRUE;\n}\n\nvoid opj_j2k_setup_header_reading (opj_j2k_t *p_j2k)\n{\n        /* preconditions*/\n        assert(p_j2k != 00);\n\n        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_read_header_procedure);\n\n        /* DEVELOPER CORNER, add your custom procedures */\n        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_copy_default_tcp_and_create_tcd);\n\n}\n\nvoid opj_j2k_setup_decoding_validation (opj_j2k_t *p_j2k)\n{\n        /* preconditions*/\n        assert(p_j2k != 00);\n\n        opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_build_decoder);\n        opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_decoding_validation);\n        /* DEVELOPER CORNER, add your custom validation procedure */\n\n}\n\nOPJ_BOOL opj_j2k_mct_validation (       opj_j2k_t * p_j2k,\n                                                                opj_stream_private_t *p_stream,\n                                                                opj_event_mgr_t * p_manager )\n{\n        OPJ_BOOL l_is_valid = OPJ_TRUE;\n        OPJ_UINT32 i,j;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_stream != 00);\n        assert(p_manager != 00);\n\n        if ((p_j2k->m_cp.rsiz & 0x8200) == 0x8200) {\n                OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;\n                opj_tcp_t * l_tcp = p_j2k->m_cp.tcps;\n\n                for (i=0;i<l_nb_tiles;++i) {\n                        if (l_tcp->mct == 2) {\n                                opj_tccp_t * l_tccp = l_tcp->tccps;\n                                l_is_valid &= (l_tcp->m_mct_coding_matrix != 00);\n\n                                for (j=0;j<p_j2k->m_private_image->numcomps;++j) {\n                                        l_is_valid &= ! (l_tccp->qmfbid & 1);\n                                        ++l_tccp;\n                                }\n                        }\n                        ++l_tcp;\n                }\n        }\n\n        return l_is_valid;\n}\n\nOPJ_BOOL opj_j2k_setup_mct_encoding(opj_tcp_t * p_tcp, opj_image_t * p_image)\n{\n        OPJ_UINT32 i;\n        OPJ_UINT32 l_indix = 1;\n        opj_mct_data_t * l_mct_deco_data = 00,* l_mct_offset_data = 00;\n        opj_simple_mcc_decorrelation_data_t * l_mcc_data;\n        OPJ_UINT32 l_mct_size,l_nb_elem;\n        OPJ_FLOAT32 * l_data, * l_current_data;\n        opj_tccp_t * l_tccp;\n\n        /* preconditions */\n        assert(p_tcp != 00);\n\n        if (p_tcp->mct != 2) {\n                return OPJ_TRUE;\n        }\n\n        if (p_tcp->m_mct_decoding_matrix) {\n                if (p_tcp->m_nb_mct_records == p_tcp->m_nb_max_mct_records) {\n                        opj_mct_data_t *new_mct_records;\n                        p_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;\n\n                        new_mct_records = (opj_mct_data_t *) opj_realloc(p_tcp->m_mct_records, p_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));\n                        if (! new_mct_records) {\n                                opj_free(p_tcp->m_mct_records);\n                                p_tcp->m_mct_records = NULL;\n                                p_tcp->m_nb_max_mct_records = 0;\n                                p_tcp->m_nb_mct_records = 0;\n                                /* opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to setup mct encoding\\n\"); */\n                                return OPJ_FALSE;\n                        }\n                        p_tcp->m_mct_records = new_mct_records;\n                        l_mct_deco_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;\n\n                        memset(l_mct_deco_data ,0,(p_tcp->m_nb_max_mct_records - p_tcp->m_nb_mct_records) * sizeof(opj_mct_data_t));\n                }\n                l_mct_deco_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;\n\n                if (l_mct_deco_data->m_data) {\n                        opj_free(l_mct_deco_data->m_data);\n                        l_mct_deco_data->m_data = 00;\n                }\n\n                l_mct_deco_data->m_index = l_indix++;\n                l_mct_deco_data->m_array_type = MCT_TYPE_DECORRELATION;\n                l_mct_deco_data->m_element_type = MCT_TYPE_FLOAT;\n                l_nb_elem = p_image->numcomps * p_image->numcomps;\n                l_mct_size = l_nb_elem * MCT_ELEMENT_SIZE[l_mct_deco_data->m_element_type];\n                l_mct_deco_data->m_data = (OPJ_BYTE*)opj_malloc(l_mct_size );\n\n                if (! l_mct_deco_data->m_data) {\n                        return OPJ_FALSE;\n                }\n\n                j2k_mct_write_functions_from_float[l_mct_deco_data->m_element_type](p_tcp->m_mct_decoding_matrix,l_mct_deco_data->m_data,l_nb_elem);\n\n                l_mct_deco_data->m_data_size = l_mct_size;\n                ++p_tcp->m_nb_mct_records;\n        }\n\n        if (p_tcp->m_nb_mct_records == p_tcp->m_nb_max_mct_records) {\n                opj_mct_data_t *new_mct_records;\n                p_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;\n                new_mct_records = (opj_mct_data_t *) opj_realloc(p_tcp->m_mct_records, p_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));\n                if (! new_mct_records) {\n                        opj_free(p_tcp->m_mct_records);\n                        p_tcp->m_mct_records = NULL;\n                        p_tcp->m_nb_max_mct_records = 0;\n                        p_tcp->m_nb_mct_records = 0;\n                        /* opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to setup mct encoding\\n\"); */\n                        return OPJ_FALSE;\n                }\n                p_tcp->m_mct_records = new_mct_records;\n                l_mct_offset_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;\n\n                memset(l_mct_offset_data ,0,(p_tcp->m_nb_max_mct_records - p_tcp->m_nb_mct_records) * sizeof(opj_mct_data_t));\n\n                if (l_mct_deco_data) {\n                        l_mct_deco_data = l_mct_offset_data - 1;\n                }\n        }\n\n        l_mct_offset_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;\n\n        if (l_mct_offset_data->m_data) {\n                opj_free(l_mct_offset_data->m_data);\n                l_mct_offset_data->m_data = 00;\n        }\n\n        l_mct_offset_data->m_index = l_indix++;\n        l_mct_offset_data->m_array_type = MCT_TYPE_OFFSET;\n        l_mct_offset_data->m_element_type = MCT_TYPE_FLOAT;\n        l_nb_elem = p_image->numcomps;\n        l_mct_size = l_nb_elem * MCT_ELEMENT_SIZE[l_mct_offset_data->m_element_type];\n        l_mct_offset_data->m_data = (OPJ_BYTE*)opj_malloc(l_mct_size );\n\n        if (! l_mct_offset_data->m_data) {\n                return OPJ_FALSE;\n        }\n\n        l_data = (OPJ_FLOAT32*)opj_malloc(l_nb_elem * sizeof(OPJ_FLOAT32));\n        if (! l_data) {\n                opj_free(l_mct_offset_data->m_data);\n                l_mct_offset_data->m_data = 00;\n                return OPJ_FALSE;\n        }\n\n        l_tccp = p_tcp->tccps;\n        l_current_data = l_data;\n\n        for (i=0;i<l_nb_elem;++i) {\n                *(l_current_data++) = (OPJ_FLOAT32) (l_tccp->m_dc_level_shift);\n                ++l_tccp;\n        }\n\n        j2k_mct_write_functions_from_float[l_mct_offset_data->m_element_type](l_data,l_mct_offset_data->m_data,l_nb_elem);\n\n        opj_free(l_data);\n\n        l_mct_offset_data->m_data_size = l_mct_size;\n\n        ++p_tcp->m_nb_mct_records;\n\n        if (p_tcp->m_nb_mcc_records == p_tcp->m_nb_max_mcc_records) {\n                opj_simple_mcc_decorrelation_data_t *new_mcc_records;\n                p_tcp->m_nb_max_mcc_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;\n                new_mcc_records = (opj_simple_mcc_decorrelation_data_t *) opj_realloc(\n                                p_tcp->m_mcc_records, p_tcp->m_nb_max_mcc_records * sizeof(opj_simple_mcc_decorrelation_data_t));\n                if (! new_mcc_records) {\n                        opj_free(p_tcp->m_mcc_records);\n                        p_tcp->m_mcc_records = NULL;\n                        p_tcp->m_nb_max_mcc_records = 0;\n                        p_tcp->m_nb_mcc_records = 0;\n                        /* opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to setup mct encoding\\n\"); */\n                        return OPJ_FALSE;\n                }\n                p_tcp->m_mcc_records = new_mcc_records;\n                l_mcc_data = p_tcp->m_mcc_records + p_tcp->m_nb_mcc_records;\n                memset(l_mcc_data ,0,(p_tcp->m_nb_max_mcc_records - p_tcp->m_nb_mcc_records) * sizeof(opj_simple_mcc_decorrelation_data_t));\n\n        }\n\n        l_mcc_data = p_tcp->m_mcc_records + p_tcp->m_nb_mcc_records;\n        l_mcc_data->m_decorrelation_array = l_mct_deco_data;\n        l_mcc_data->m_is_irreversible = 1;\n        l_mcc_data->m_nb_comps = p_image->numcomps;\n        l_mcc_data->m_index = l_indix++;\n        l_mcc_data->m_offset_array = l_mct_offset_data;\n        ++p_tcp->m_nb_mcc_records;\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_build_decoder (opj_j2k_t * p_j2k,\n                                                            opj_stream_private_t *p_stream,\n                                                            opj_event_mgr_t * p_manager )\n{\n        /* add here initialization of cp\n           copy paste of setup_decoder */\n  (void)p_j2k;\n  (void)p_stream;\n  (void)p_manager;\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_build_encoder (opj_j2k_t * p_j2k,\n                                                        opj_stream_private_t *p_stream,\n                                                        opj_event_mgr_t * p_manager )\n{\n        /* add here initialization of cp\n           copy paste of setup_encoder */\n  (void)p_j2k;\n  (void)p_stream;\n  (void)p_manager;\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_encoding_validation (  opj_j2k_t * p_j2k,\n                                                                            opj_stream_private_t *p_stream,\n                                                                            opj_event_mgr_t * p_manager )\n{\n        OPJ_BOOL l_is_valid = OPJ_TRUE;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_stream != 00);\n        assert(p_manager != 00);\n\n        /* STATE checking */\n        /* make sure the state is at 0 */\n        l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NONE);\n\n        /* POINTER validation */\n        /* make sure a p_j2k codec is present */\n        l_is_valid &= (p_j2k->m_procedure_list != 00);\n        /* make sure a validation list is present */\n        l_is_valid &= (p_j2k->m_validation_list != 00);\n\n        if ((p_j2k->m_cp.tdx) < (OPJ_UINT32) (1 << p_j2k->m_cp.tcps->tccps->numresolutions)) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Number of resolutions is too high in comparison to the size of tiles\\n\");\n                return OPJ_FALSE;\n        }\n\n        if ((p_j2k->m_cp.tdy) < (OPJ_UINT32) (1 << p_j2k->m_cp.tcps->tccps->numresolutions)) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Number of resolutions is too high in comparison to the size of tiles\\n\");\n                return OPJ_FALSE;\n        }\n\n        /* PARAMETER VALIDATION */\n        return l_is_valid;\n}\n\nOPJ_BOOL opj_j2k_decoding_validation (  opj_j2k_t *p_j2k,\n                                        opj_stream_private_t *p_stream,\n                                        opj_event_mgr_t * p_manager\n                                        )\n{\n        OPJ_BOOL l_is_valid = OPJ_TRUE;\n\n        /* preconditions*/\n        assert(p_j2k != 00);\n        assert(p_stream != 00);\n        assert(p_manager != 00);\n\n        /* STATE checking */\n        /* make sure the state is at 0 */\n#ifdef TODO_MSD\n        l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == J2K_DEC_STATE_NONE);\n#endif\n        l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == 0x0000);\n\n        /* POINTER validation */\n        /* make sure a p_j2k codec is present */\n        /* make sure a procedure list is present */\n        l_is_valid &= (p_j2k->m_procedure_list != 00);\n        /* make sure a validation list is present */\n        l_is_valid &= (p_j2k->m_validation_list != 00);\n\n        /* PARAMETER VALIDATION */\n        return l_is_valid;\n}\n\nOPJ_BOOL opj_j2k_read_header_procedure( opj_j2k_t *p_j2k,\n                                                                            opj_stream_private_t *p_stream,\n                                                                            opj_event_mgr_t * p_manager)\n{\n        OPJ_UINT32 l_current_marker;\n        OPJ_UINT32 l_marker_size;\n        const opj_dec_memory_marker_handler_t * l_marker_handler = 00;\n\n        /* preconditions */\n        assert(p_stream != 00);\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n\n        /*  We enter in the main header */\n        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MHSOC;\n\n        /* Try to read the SOC marker, the codestream must begin with SOC marker */\n        if (! opj_j2k_read_soc(p_j2k,p_stream,p_manager)) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Expected a SOC marker \\n\");\n                return OPJ_FALSE;\n        }\n\n        /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */\n        if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Stream too short\\n\");\n                return OPJ_FALSE;\n        }\n\n        /* Read 2 bytes as the new marker ID */\n        opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);\n\n        /* Try to read until the SOT is detected */\n        while (l_current_marker != J2K_MS_SOT) {\n\n                /* Check if the current marker ID is valid */\n                if (l_current_marker < 0xff00) {\n                        opj_event_msg(p_manager, EVT_ERROR, \"We expected read a marker ID (0xff--) instead of %.8x\\n\", l_current_marker);\n                        return OPJ_FALSE;\n                }\n\n                /* Get the marker handler from the marker ID */\n                l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);\n\n                /* Manage case where marker is unknown */\n                if (l_marker_handler->id == J2K_MS_UNK) {\n                        if (! opj_j2k_read_unk(p_j2k, p_stream, &l_current_marker, p_manager)){\n                                opj_event_msg(p_manager, EVT_ERROR, \"Unknow marker have been detected and generated error.\\n\");\n                                return OPJ_FALSE;\n                        }\n\n                        if (l_current_marker == J2K_MS_SOT)\n                                break; /* SOT marker is detected main header is completely read */\n                        else    /* Get the marker handler from the marker ID */\n                                l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);\n                }\n\n                /* Check if the marker is known and if it is the right place to find it */\n                if (! (p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states) ) {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Marker is not compliant with its position\\n\");\n                        return OPJ_FALSE;\n                }\n\n                /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */\n                if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Stream too short\\n\");\n                        return OPJ_FALSE;\n                }\n\n                /* read 2 bytes as the marker size */\n                opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_marker_size,2);\n                l_marker_size -= 2; /* Subtract the size of the marker ID already read */\n\n                /* Check if the marker size is compatible with the header data size */\n                if (l_marker_size > p_j2k->m_specific_param.m_decoder.m_header_data_size) {\n                        OPJ_BYTE *new_header_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size);\n                        if (! new_header_data) {\n                                opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);\n                                p_j2k->m_specific_param.m_decoder.m_header_data = NULL;\n                                p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;\n                                opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to read header\\n\");\n                                return OPJ_FALSE;\n                        }\n                        p_j2k->m_specific_param.m_decoder.m_header_data = new_header_data;\n                        p_j2k->m_specific_param.m_decoder.m_header_data_size = l_marker_size;\n                }\n\n                /* Try to read the rest of the marker segment from stream and copy them into the buffer */\n                if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size,p_manager) != l_marker_size) {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Stream too short\\n\");\n                        return OPJ_FALSE;\n                }\n\n                /* Read the marker segment with the correct marker handler */\n                if (! (*(l_marker_handler->handler))(p_j2k,p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size,p_manager)) {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Marker handler function failed to read the marker segment\\n\");\n                        return OPJ_FALSE;\n                }\n\n                /* Add the marker to the codestream index*/\n                if (OPJ_FALSE == opj_j2k_add_mhmarker(\n                                        p_j2k->cstr_index,\n                                        l_marker_handler->id,\n                                        (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4,\n                                        l_marker_size + 4 )) {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to add mh marker\\n\");\n                        return OPJ_FALSE;\n                }\n\n                /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */\n                if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Stream too short\\n\");\n                        return OPJ_FALSE;\n                }\n\n                /* read 2 bytes as the new marker ID */\n                opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);\n        }\n\n        opj_event_msg(p_manager, EVT_INFO, \"Main header has been correctly decoded.\\n\");\n\n        /* Position of the last element if the main header */\n        p_j2k->cstr_index->main_head_end = (OPJ_UINT32) opj_stream_tell(p_stream) - 2;\n\n        /* Next step: read a tile-part header */\n        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_exec ( opj_j2k_t * p_j2k,\n                                        opj_procedure_list_t * p_procedure_list,\n                                        opj_stream_private_t *p_stream,\n                                        opj_event_mgr_t * p_manager )\n{\n        OPJ_BOOL (** l_procedure) (opj_j2k_t * ,opj_stream_private_t *,opj_event_mgr_t *) = 00;\n        OPJ_BOOL l_result = OPJ_TRUE;\n        OPJ_UINT32 l_nb_proc, i;\n\n        /* preconditions*/\n        assert(p_procedure_list != 00);\n        assert(p_j2k != 00);\n        assert(p_stream != 00);\n        assert(p_manager != 00);\n\n        l_nb_proc = opj_procedure_list_get_nb_procedures(p_procedure_list);\n        l_procedure = (OPJ_BOOL (**) (opj_j2k_t * ,opj_stream_private_t *,opj_event_mgr_t *)) opj_procedure_list_get_first_procedure(p_procedure_list);\n\n        for     (i=0;i<l_nb_proc;++i) {\n                l_result = l_result && ((*l_procedure) (p_j2k,p_stream,p_manager));\n                ++l_procedure;\n        }\n\n        /* and clear the procedure list at the end.*/\n        opj_procedure_list_clear(p_procedure_list);\n        return l_result;\n}\n\n/* FIXME DOC*/\nstatic OPJ_BOOL opj_j2k_copy_default_tcp_and_create_tcd (       opj_j2k_t * p_j2k,\n                                                            opj_stream_private_t *p_stream,\n                                                            opj_event_mgr_t * p_manager\n                                                            )\n{\n        opj_tcp_t * l_tcp = 00;\n        opj_tcp_t * l_default_tcp = 00;\n        OPJ_UINT32 l_nb_tiles;\n        OPJ_UINT32 i,j;\n        opj_tccp_t *l_current_tccp = 00;\n        OPJ_UINT32 l_tccp_size;\n        OPJ_UINT32 l_mct_size;\n        opj_image_t * l_image;\n        OPJ_UINT32 l_mcc_records_size,l_mct_records_size;\n        opj_mct_data_t * l_src_mct_rec, *l_dest_mct_rec;\n        opj_simple_mcc_decorrelation_data_t * l_src_mcc_rec, *l_dest_mcc_rec;\n        OPJ_UINT32 l_offset;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_stream != 00);\n        assert(p_manager != 00);\n\n        l_image = p_j2k->m_private_image;\n        l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;\n        l_tcp = p_j2k->m_cp.tcps;\n        l_tccp_size = l_image->numcomps * (OPJ_UINT32)sizeof(opj_tccp_t);\n        l_default_tcp = p_j2k->m_specific_param.m_decoder.m_default_tcp;\n        l_mct_size = l_image->numcomps * l_image->numcomps * (OPJ_UINT32)sizeof(OPJ_FLOAT32);\n\n        /* For each tile */\n        for (i=0; i<l_nb_tiles; ++i) {\n                /* keep the tile-compo coding parameters pointer of the current tile coding parameters*/\n                l_current_tccp = l_tcp->tccps;\n                /*Copy default coding parameters into the current tile coding parameters*/\n                memcpy(l_tcp, l_default_tcp, sizeof(opj_tcp_t));\n                /* Initialize some values of the current tile coding parameters*/\n                l_tcp->ppt = 0;\n                l_tcp->ppt_data = 00;\n                /* Reconnect the tile-compo coding parameters pointer to the current tile coding parameters*/\n                l_tcp->tccps = l_current_tccp;\n\n                /* Get the mct_decoding_matrix of the dflt_tile_cp and copy them into the current tile cp*/\n                if (l_default_tcp->m_mct_decoding_matrix) {\n                        l_tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(l_mct_size);\n                        if (! l_tcp->m_mct_decoding_matrix ) {\n                                return OPJ_FALSE;\n                        }\n                        memcpy(l_tcp->m_mct_decoding_matrix,l_default_tcp->m_mct_decoding_matrix,l_mct_size);\n                }\n\n                /* Get the mct_record of the dflt_tile_cp and copy them into the current tile cp*/\n                l_mct_records_size = l_default_tcp->m_nb_max_mct_records * (OPJ_UINT32)sizeof(opj_mct_data_t);\n                l_tcp->m_mct_records = (opj_mct_data_t*)opj_malloc(l_mct_records_size);\n                if (! l_tcp->m_mct_records) {\n                        return OPJ_FALSE;\n                }\n                memcpy(l_tcp->m_mct_records, l_default_tcp->m_mct_records,l_mct_records_size);\n\n                /* Copy the mct record data from dflt_tile_cp to the current tile*/\n                l_src_mct_rec = l_default_tcp->m_mct_records;\n                l_dest_mct_rec = l_tcp->m_mct_records;\n\n                for (j=0;j<l_default_tcp->m_nb_mct_records;++j) {\n\n                        if (l_src_mct_rec->m_data) {\n\n                                l_dest_mct_rec->m_data = (OPJ_BYTE*) opj_malloc(l_src_mct_rec->m_data_size);\n                                if(! l_dest_mct_rec->m_data) {\n                                        return OPJ_FALSE;\n                                }\n                                memcpy(l_dest_mct_rec->m_data,l_src_mct_rec->m_data,l_src_mct_rec->m_data_size);\n                        }\n\n                        ++l_src_mct_rec;\n                        ++l_dest_mct_rec;\n                }\n\n                /* Get the mcc_record of the dflt_tile_cp and copy them into the current tile cp*/\n                l_mcc_records_size = l_default_tcp->m_nb_max_mcc_records * (OPJ_UINT32)sizeof(opj_simple_mcc_decorrelation_data_t);\n                l_tcp->m_mcc_records = (opj_simple_mcc_decorrelation_data_t*) opj_malloc(l_mcc_records_size);\n                if (! l_tcp->m_mcc_records) {\n                        return OPJ_FALSE;\n                }\n                memcpy(l_tcp->m_mcc_records,l_default_tcp->m_mcc_records,l_mcc_records_size);\n\n                /* Copy the mcc record data from dflt_tile_cp to the current tile*/\n                l_src_mcc_rec = l_default_tcp->m_mcc_records;\n                l_dest_mcc_rec = l_tcp->m_mcc_records;\n\n                for (j=0;j<l_default_tcp->m_nb_max_mcc_records;++j) {\n\n                        if (l_src_mcc_rec->m_decorrelation_array) {\n                                l_offset = (OPJ_UINT32)(l_src_mcc_rec->m_decorrelation_array - l_default_tcp->m_mct_records);\n                                l_dest_mcc_rec->m_decorrelation_array = l_tcp->m_mct_records + l_offset;\n                        }\n\n                        if (l_src_mcc_rec->m_offset_array) {\n                                l_offset = (OPJ_UINT32)(l_src_mcc_rec->m_offset_array - l_default_tcp->m_mct_records);\n                                l_dest_mcc_rec->m_offset_array = l_tcp->m_mct_records + l_offset;\n                        }\n\n                        ++l_src_mcc_rec;\n                        ++l_dest_mcc_rec;\n                }\n\n                /* Copy all the dflt_tile_compo_cp to the current tile cp */\n                memcpy(l_current_tccp,l_default_tcp->tccps,l_tccp_size);\n\n                /* Move to next tile cp*/\n                ++l_tcp;\n        }\n\n        /* Create the current tile decoder*/\n        p_j2k->m_tcd = (opj_tcd_t*)opj_tcd_create(OPJ_TRUE); /* FIXME why a cast ? */\n        if (! p_j2k->m_tcd ) {\n                return OPJ_FALSE;\n        }\n\n        if ( !opj_tcd_init(p_j2k->m_tcd, l_image, &(p_j2k->m_cp)) ) {\n                opj_tcd_destroy(p_j2k->m_tcd);\n                p_j2k->m_tcd = 00;\n                opj_event_msg(p_manager, EVT_ERROR, \"Cannot decode tile, memory error\\n\");\n                return OPJ_FALSE;\n        }\n\n        return OPJ_TRUE;\n}\n\nconst opj_dec_memory_marker_handler_t * opj_j2k_get_marker_handler (OPJ_UINT32 p_id)\n{\n        const opj_dec_memory_marker_handler_t *e;\n        for (e = j2k_memory_marker_handler_tab; e->id != 0; ++e) {\n                if (e->id == p_id) {\n                        break; /* we find a handler corresponding to the marker ID*/\n                }\n        }\n        return e;\n}\n\nvoid opj_j2k_destroy (opj_j2k_t *p_j2k)\n{\n        if (p_j2k == 00) {\n                return;\n        }\n\n        if (p_j2k->m_is_decoder) {\n\n                if (p_j2k->m_specific_param.m_decoder.m_default_tcp != 00) {\n                        opj_j2k_tcp_destroy(p_j2k->m_specific_param.m_decoder.m_default_tcp);\n                        opj_free(p_j2k->m_specific_param.m_decoder.m_default_tcp);\n                        p_j2k->m_specific_param.m_decoder.m_default_tcp = 00;\n                }\n\n                if (p_j2k->m_specific_param.m_decoder.m_header_data != 00) {\n                        opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);\n                        p_j2k->m_specific_param.m_decoder.m_header_data = 00;\n                        p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;\n                }\n        }\n        else {\n\n                if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data) {\n                        opj_free(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);\n                        p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 00;\n                }\n\n                if (p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {\n                        opj_free(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer);\n                        p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = 00;\n                        p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = 00;\n                }\n\n                if (p_j2k->m_specific_param.m_encoder.m_header_tile_data) {\n                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);\n                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = 00;\n                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;\n                }\n        }\n\n        opj_tcd_destroy(p_j2k->m_tcd);\n\n        opj_j2k_cp_destroy(&(p_j2k->m_cp));\n        memset(&(p_j2k->m_cp),0,sizeof(opj_cp_t));\n\n        opj_procedure_list_destroy(p_j2k->m_procedure_list);\n        p_j2k->m_procedure_list = 00;\n\n        opj_procedure_list_destroy(p_j2k->m_validation_list);\n        p_j2k->m_procedure_list = 00;\n\n        j2k_destroy_cstr_index(p_j2k->cstr_index);\n        p_j2k->cstr_index = NULL;\n\n        opj_image_destroy(p_j2k->m_private_image);\n        p_j2k->m_private_image = NULL;\n\n        opj_image_destroy(p_j2k->m_output_image);\n        p_j2k->m_output_image = NULL;\n\n        opj_free(p_j2k);\n}\n\nvoid j2k_destroy_cstr_index (opj_codestream_index_t *p_cstr_ind)\n{\n        if (p_cstr_ind) {\n\n                if (p_cstr_ind->marker) {\n                        opj_free(p_cstr_ind->marker);\n                        p_cstr_ind->marker = NULL;\n                }\n\n                if (p_cstr_ind->tile_index) {\n                        OPJ_UINT32 it_tile = 0;\n\n                        for (it_tile=0; it_tile < p_cstr_ind->nb_of_tiles; it_tile++) {\n\n                                if(p_cstr_ind->tile_index[it_tile].packet_index) {\n                                        opj_free(p_cstr_ind->tile_index[it_tile].packet_index);\n                                        p_cstr_ind->tile_index[it_tile].packet_index = NULL;\n                                }\n\n                                if(p_cstr_ind->tile_index[it_tile].tp_index){\n                                        opj_free(p_cstr_ind->tile_index[it_tile].tp_index);\n                                        p_cstr_ind->tile_index[it_tile].tp_index = NULL;\n                                }\n\n                                if(p_cstr_ind->tile_index[it_tile].marker){\n                                        opj_free(p_cstr_ind->tile_index[it_tile].marker);\n                                        p_cstr_ind->tile_index[it_tile].marker = NULL;\n\n                                }\n                        }\n\n                        opj_free( p_cstr_ind->tile_index);\n                        p_cstr_ind->tile_index = NULL;\n                }\n\n                opj_free(p_cstr_ind);\n        }\n}\n\nvoid opj_j2k_tcp_destroy (opj_tcp_t *p_tcp)\n{\n        if (p_tcp == 00) {\n                return;\n        }\n\n        if (p_tcp->ppt_buffer != 00) {\n                opj_free(p_tcp->ppt_buffer);\n                p_tcp->ppt_buffer = 00;\n        }\n\n        if (p_tcp->tccps != 00) {\n                opj_free(p_tcp->tccps);\n                p_tcp->tccps = 00;\n        }\n\n        if (p_tcp->m_mct_coding_matrix != 00) {\n                opj_free(p_tcp->m_mct_coding_matrix);\n                p_tcp->m_mct_coding_matrix = 00;\n        }\n\n        if (p_tcp->m_mct_decoding_matrix != 00) {\n                opj_free(p_tcp->m_mct_decoding_matrix);\n                p_tcp->m_mct_decoding_matrix = 00;\n        }\n\n        if (p_tcp->m_mcc_records) {\n                opj_free(p_tcp->m_mcc_records);\n                p_tcp->m_mcc_records = 00;\n                p_tcp->m_nb_max_mcc_records = 0;\n                p_tcp->m_nb_mcc_records = 0;\n        }\n\n        if (p_tcp->m_mct_records) {\n                opj_mct_data_t * l_mct_data = p_tcp->m_mct_records;\n                OPJ_UINT32 i;\n\n                for (i=0;i<p_tcp->m_nb_mct_records;++i) {\n                        if (l_mct_data->m_data) {\n                                opj_free(l_mct_data->m_data);\n                                l_mct_data->m_data = 00;\n                        }\n\n                        ++l_mct_data;\n                }\n\n                opj_free(p_tcp->m_mct_records);\n                p_tcp->m_mct_records = 00;\n        }\n\n        if (p_tcp->mct_norms != 00) {\n                opj_free(p_tcp->mct_norms);\n                p_tcp->mct_norms = 00;\n        }\n\n        opj_j2k_tcp_data_destroy(p_tcp);\n\n}\n\nvoid opj_j2k_tcp_data_destroy (opj_tcp_t *p_tcp)\n{\n        if (p_tcp->m_data) {\n                opj_free(p_tcp->m_data);\n                p_tcp->m_data = NULL;\n                p_tcp->m_data_size = 0;\n        }\n}\n\nvoid opj_j2k_cp_destroy (opj_cp_t *p_cp)\n{\n        OPJ_UINT32 l_nb_tiles;\n        opj_tcp_t * l_current_tile = 00;\n        OPJ_UINT32 i;\n\n        if (p_cp == 00)\n        {\n                return;\n        }\n        if (p_cp->tcps != 00)\n        {\n                l_current_tile = p_cp->tcps;\n                l_nb_tiles = p_cp->th * p_cp->tw;\n\n                for (i = 0; i < l_nb_tiles; ++i)\n                {\n                        opj_j2k_tcp_destroy(l_current_tile);\n                        ++l_current_tile;\n                }\n                opj_free(p_cp->tcps);\n                p_cp->tcps = 00;\n        }\n        opj_free(p_cp->ppm_buffer);\n        p_cp->ppm_buffer = 00;\n        p_cp->ppm_data = NULL; /* ppm_data belongs to the allocated buffer pointed by ppm_buffer */\n        opj_free(p_cp->comment);\n        p_cp->comment = 00;\n        if (! p_cp->m_is_decoder)\n        {\n                opj_free(p_cp->m_specific_param.m_enc.m_matrice);\n                p_cp->m_specific_param.m_enc.m_matrice = 00;\n        }\n}\n\nOPJ_BOOL opj_j2k_read_tile_header(      opj_j2k_t * p_j2k,\n                                                                    OPJ_UINT32 * p_tile_index,\n                                                                    OPJ_UINT32 * p_data_size,\n                                                                    OPJ_INT32 * p_tile_x0, OPJ_INT32 * p_tile_y0,\n                                                                    OPJ_INT32 * p_tile_x1, OPJ_INT32 * p_tile_y1,\n                                                                    OPJ_UINT32 * p_nb_comps,\n                                                                    OPJ_BOOL * p_go_on,\n                                                                    opj_stream_private_t *p_stream,\n                                                                    opj_event_mgr_t * p_manager )\n{\n        OPJ_UINT32 l_current_marker = J2K_MS_SOT;\n        OPJ_UINT32 l_marker_size;\n        const opj_dec_memory_marker_handler_t * l_marker_handler = 00;\n        opj_tcp_t * l_tcp = NULL;\n        OPJ_UINT32 l_nb_tiles;\n\n        /* preconditions */\n        assert(p_stream != 00);\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n\n        /* Reach the End Of Codestream ?*/\n        if (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_EOC){\n                l_current_marker = J2K_MS_EOC;\n        }\n        /* We need to encounter a SOT marker (a new tile-part header) */\n        else if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_TPHSOT){\n                return OPJ_FALSE;\n        }\n\n        /* Read into the codestream until reach the EOC or ! can_decode ??? FIXME */\n        while ( (!p_j2k->m_specific_param.m_decoder.m_can_decode) && (l_current_marker != J2K_MS_EOC) ) {\n\n                /* Try to read until the Start Of Data is detected */\n                while (l_current_marker != J2K_MS_SOD) {\n                    \n                    if(opj_stream_get_number_byte_left(p_stream) == 0)\n                    {\n                        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;\n                        break;\n                    }\n\n                        /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */\n                        if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {\n                                opj_event_msg(p_manager, EVT_ERROR, \"Stream too short\\n\");\n                                return OPJ_FALSE;\n                        }\n\n                        /* Read 2 bytes from the buffer as the marker size */\n                        opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_marker_size,2);\n\n                        /* cf. https://code.google.com/p/openjpeg/issues/detail?id=226 */\n                        if (l_current_marker == 0x8080 && opj_stream_get_number_byte_left(p_stream) == 0) {\n                                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;\n                                break;\n                        }\n\n                        /* Why this condition? FIXME */\n                        if (p_j2k->m_specific_param.m_decoder.m_state & J2K_STATE_TPH){\n                                p_j2k->m_specific_param.m_decoder.m_sot_length -= (l_marker_size + 2);\n                        }\n                        l_marker_size -= 2; /* Subtract the size of the marker ID already read */\n\n                        /* Get the marker handler from the marker ID */\n                        l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);\n\n                        /* Check if the marker is known and if it is the right place to find it */\n                        if (! (p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states) ) {\n                                opj_event_msg(p_manager, EVT_ERROR, \"Marker is not compliant with its position\\n\");\n                                return OPJ_FALSE;\n                        }\n/* FIXME manage case of unknown marker as in the main header ? */\n\n                        /* Check if the marker size is compatible with the header data size */\n                        if (l_marker_size > p_j2k->m_specific_param.m_decoder.m_header_data_size) {\n                                OPJ_BYTE *new_header_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size);\n                                if (! new_header_data) {\n                                        opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);\n                                        p_j2k->m_specific_param.m_decoder.m_header_data = NULL;\n                                        p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;\n                                        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to read header\\n\");\n                                        return OPJ_FALSE;\n                                }\n                                p_j2k->m_specific_param.m_decoder.m_header_data = new_header_data;\n                                p_j2k->m_specific_param.m_decoder.m_header_data_size = l_marker_size;\n                        }\n\n                        /* Try to read the rest of the marker segment from stream and copy them into the buffer */\n                        if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size,p_manager) != l_marker_size) {\n                                opj_event_msg(p_manager, EVT_ERROR, \"Stream too short\\n\");\n                                return OPJ_FALSE;\n                        }\n\n                        if (!l_marker_handler->handler) {\n                                /* See issue #175 */\n                                opj_event_msg(p_manager, EVT_ERROR, \"Not sure how that happened.\\n\");\n                                return OPJ_FALSE;\n                        }\n                        /* Read the marker segment with the correct marker handler */\n                        if (! (*(l_marker_handler->handler))(p_j2k,p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size,p_manager)) {\n                                opj_event_msg(p_manager, EVT_ERROR, \"Fail to read the current marker segment (%#x)\\n\", l_current_marker);\n                                return OPJ_FALSE;\n                        }\n\n                        /* Add the marker to the codestream index*/\n                        if (OPJ_FALSE == opj_j2k_add_tlmarker(p_j2k->m_current_tile_number,\n                                                p_j2k->cstr_index,\n                                                l_marker_handler->id,\n                                                (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4,\n                                                l_marker_size + 4 )) {\n                                opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to add tl marker\\n\");\n                                return OPJ_FALSE;\n                        }\n\n                        /* Keep the position of the last SOT marker read */\n                        if ( l_marker_handler->id == J2K_MS_SOT ) {\n                                OPJ_UINT32 sot_pos = (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4 ;\n                                if (sot_pos > p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos)\n                                {\n                                        p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos = sot_pos;\n                                }\n                        }\n\n                        if (p_j2k->m_specific_param.m_decoder.m_skip_data) {\n                                /* Skip the rest of the tile part header*/\n                                if (opj_stream_skip(p_stream,p_j2k->m_specific_param.m_decoder.m_sot_length,p_manager) != p_j2k->m_specific_param.m_decoder.m_sot_length) {\n                                        opj_event_msg(p_manager, EVT_ERROR, \"Stream too short\\n\");\n                                        return OPJ_FALSE;\n                                }\n                                l_current_marker = J2K_MS_SOD; /* Normally we reached a SOD */\n                        }\n                        else {\n                                /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer*/\n                                if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {\n                                        opj_event_msg(p_manager, EVT_ERROR, \"Stream too short\\n\");\n                                        return OPJ_FALSE;\n                                }\n                                /* Read 2 bytes from the buffer as the new marker ID */\n                                opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);\n                        }\n                }\n                if(opj_stream_get_number_byte_left(p_stream) == 0\n                    && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC)\n                    break;\n\n                /* If we didn't skip data before, we need to read the SOD marker*/\n                if (! p_j2k->m_specific_param.m_decoder.m_skip_data) {\n                        /* Try to read the SOD marker and skip data ? FIXME */\n                        if (! opj_j2k_read_sod(p_j2k, p_stream, p_manager)) {\n                                return OPJ_FALSE;\n                        }\n\n                        if (! p_j2k->m_specific_param.m_decoder.m_can_decode){\n                                /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */\n\t\t\t\t\t\t\twhile(1)  //liang\n\t\t\t\t\t\t\t{\n                                if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {\n                                        opj_event_msg(p_manager, EVT_ERROR, \"Stream too short\\n\");\n                                        return OPJ_FALSE;\n                                }\n\n                                /* Read 2 bytes from buffer as the new marker ID */\n                                opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);\n\t\t\t\t\t\t\t\tif((l_current_marker & 0xff00) == 0xff00) break;\n\t\t\t\t\t\t\t}\n                        }\n                }\n                else {\n                        /* Indicate we will try to read a new tile-part header*/\n                        p_j2k->m_specific_param.m_decoder.m_skip_data = 0;\n                        p_j2k->m_specific_param.m_decoder.m_can_decode = 0;\n                        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;\n\n                        /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */\n                        if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {\n                                opj_event_msg(p_manager, EVT_ERROR, \"Stream too short\\n\");\n                                return OPJ_FALSE;\n                        }\n\n                        /* Read 2 bytes from buffer as the new marker ID */\n                        opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);\n                }\n        }\n\n        /* Current marker is the EOC marker ?*/\n        if (l_current_marker == J2K_MS_EOC) {\n                if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_EOC ){\n                        p_j2k->m_current_tile_number = 0;\n                        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_EOC;\n                }\n        }\n\n        /* FIXME DOC ???*/\n        if ( ! p_j2k->m_specific_param.m_decoder.m_can_decode) {\n                l_tcp = p_j2k->m_cp.tcps + p_j2k->m_current_tile_number;\n                l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;\n\n                while( (p_j2k->m_current_tile_number < l_nb_tiles) && (l_tcp->m_data == 00) ) {\n                        ++p_j2k->m_current_tile_number;\n                        ++l_tcp;\n                }\n\n                if (p_j2k->m_current_tile_number == l_nb_tiles) {\n                        *p_go_on = OPJ_FALSE;\n                        return OPJ_TRUE;\n                }\n        }\n\n        /*FIXME ???*/\n        if (! opj_tcd_init_decode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number)) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Cannot decode tile, memory error\\n\");\n                return OPJ_FALSE;\n        }\n\n        opj_event_msg(p_manager, EVT_INFO, \"Header of tile %d / %d has been read.\\n\",\n                        p_j2k->m_current_tile_number, (p_j2k->m_cp.th * p_j2k->m_cp.tw) - 1);\n\n        *p_tile_index = p_j2k->m_current_tile_number;\n        *p_go_on = OPJ_TRUE;\n        *p_data_size = opj_tcd_get_decoded_tile_size(p_j2k->m_tcd);\n        *p_tile_x0 = p_j2k->m_tcd->tcd_image->tiles->x0;\n        *p_tile_y0 = p_j2k->m_tcd->tcd_image->tiles->y0;\n        *p_tile_x1 = p_j2k->m_tcd->tcd_image->tiles->x1;\n        *p_tile_y1 = p_j2k->m_tcd->tcd_image->tiles->y1;\n        *p_nb_comps = p_j2k->m_tcd->tcd_image->tiles->numcomps;\n\n         p_j2k->m_specific_param.m_decoder.m_state |= 0x0080;/* FIXME J2K_DEC_STATE_DATA;*/\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_decode_tile (  opj_j2k_t * p_j2k,\n                                                        OPJ_UINT32 p_tile_index,\n                                                        OPJ_BYTE * p_data,\n                                                        OPJ_UINT32 p_data_size,\n                                                        opj_stream_private_t *p_stream,\n                                                        opj_event_mgr_t * p_manager )\n{\n        OPJ_UINT32 l_current_marker;\n        OPJ_BYTE l_data [2];\n        opj_tcp_t * l_tcp;\n\n        /* preconditions */\n        assert(p_stream != 00);\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n\n        if ( !(p_j2k->m_specific_param.m_decoder.m_state & 0x0080/*FIXME J2K_DEC_STATE_DATA*/)\n                || (p_tile_index != p_j2k->m_current_tile_number) ) {\n                return OPJ_FALSE;\n        }\n\n        l_tcp = &(p_j2k->m_cp.tcps[p_tile_index]);\n        if (! l_tcp->m_data) {\n                opj_j2k_tcp_destroy(l_tcp);\n                return OPJ_FALSE;\n        }\n\n        if (! opj_tcd_decode_tile(      p_j2k->m_tcd,\n                                                                l_tcp->m_data,\n                                                                l_tcp->m_data_size,\n                                                                p_tile_index,\n                                                                p_j2k->cstr_index) ) {\n                opj_j2k_tcp_destroy(l_tcp);\n                p_j2k->m_specific_param.m_decoder.m_state |= 0x8000;/*FIXME J2K_DEC_STATE_ERR;*/\n                opj_event_msg(p_manager, EVT_ERROR, \"Failed to decode.\\n\");\n                return OPJ_FALSE;\n        }\n\n        if (! opj_tcd_update_tile_data(p_j2k->m_tcd,p_data,p_data_size)) {\n                return OPJ_FALSE;\n        }\n\n        /* To avoid to destroy the tcp which can be useful when we try to decode a tile decoded before (cf j2k_random_tile_access)\n         * we destroy just the data which will be re-read in read_tile_header*/\n        /*opj_j2k_tcp_destroy(l_tcp);\n        p_j2k->m_tcd->tcp = 0;*/\n        opj_j2k_tcp_data_destroy(l_tcp);\n\n        p_j2k->m_specific_param.m_decoder.m_can_decode = 0;\n        p_j2k->m_specific_param.m_decoder.m_state &= (~ (0x0080u));/* FIXME J2K_DEC_STATE_DATA);*/\n\n        if(opj_stream_get_number_byte_left(p_stream) == 0 \n            && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC){\n            return OPJ_TRUE;\n        }\n\n        if (p_j2k->m_specific_param.m_decoder.m_state != 0x0100){ /*FIXME J2K_DEC_STATE_EOC)*/\n                if (opj_stream_read_data(p_stream,l_data,2,p_manager) != 2) {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Stream too short\\n\");\n                        return OPJ_FALSE;\n                }\n\n                opj_read_bytes(l_data,&l_current_marker,2);\n\n                if (l_current_marker == J2K_MS_EOC) {\n                        p_j2k->m_current_tile_number = 0;\n                        p_j2k->m_specific_param.m_decoder.m_state =  0x0100;/*FIXME J2K_DEC_STATE_EOC;*/\n                }\n                else if (l_current_marker != J2K_MS_SOT)\n                {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Stream too short, expected SOT\\n\");\n                        \n                        if(opj_stream_get_number_byte_left(p_stream) == 0) {\n                            p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;\n                            return OPJ_TRUE;\n                        }\n                        return OPJ_FALSE;\n                }\n        }\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_update_image_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data, opj_image_t* p_output_image)\n{\n        OPJ_UINT32 i,j,k = 0;\n        OPJ_UINT32 l_width_src,l_height_src;\n        OPJ_UINT32 l_width_dest,l_height_dest;\n        OPJ_INT32 l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src;\n        OPJ_INT32 l_start_offset_src, l_line_offset_src, l_end_offset_src ;\n        OPJ_UINT32 l_start_x_dest , l_start_y_dest;\n        OPJ_UINT32 l_x0_dest, l_y0_dest, l_x1_dest, l_y1_dest;\n        OPJ_INT32 l_start_offset_dest, l_line_offset_dest;\n\n        opj_image_comp_t * l_img_comp_src = 00;\n        opj_image_comp_t * l_img_comp_dest = 00;\n\n        opj_tcd_tilecomp_t * l_tilec = 00;\n        opj_image_t * l_image_src = 00;\n        OPJ_UINT32 l_size_comp, l_remaining;\n        OPJ_INT32 * l_dest_ptr;\n        opj_tcd_resolution_t* l_res= 00;\n\n        l_tilec = p_tcd->tcd_image->tiles->comps;\n        l_image_src = p_tcd->image;\n        l_img_comp_src = l_image_src->comps;\n\n        l_img_comp_dest = p_output_image->comps;\n\n        for (i=0; i<l_image_src->numcomps; i++) {\n\n                /* Allocate output component buffer if necessary */\n                if (!l_img_comp_dest->data) {\n\n                        l_img_comp_dest->data = (OPJ_INT32*) opj_calloc(l_img_comp_dest->w * l_img_comp_dest->h, sizeof(OPJ_INT32));\n                        if (! l_img_comp_dest->data) {\n                                return OPJ_FALSE;\n                        }\n                }\n\n                /* Copy info from decoded comp image to output image */\n                l_img_comp_dest->resno_decoded = l_img_comp_src->resno_decoded;\n\n                /*-----*/\n                /* Compute the precision of the output buffer */\n                l_size_comp = l_img_comp_src->prec >> 3; /*(/ 8)*/\n                l_remaining = l_img_comp_src->prec & 7;  /* (%8) */\n                l_res = l_tilec->resolutions + l_img_comp_src->resno_decoded;\n\n                if (l_remaining) {\n                        ++l_size_comp;\n                }\n\n                if (l_size_comp == 3) {\n                        l_size_comp = 4;\n                }\n                /*-----*/\n\n                /* Current tile component size*/\n                /*if (i == 0) {\n                fprintf(stdout, \"SRC: l_res_x0=%d, l_res_x1=%d, l_res_y0=%d, l_res_y1=%d\\n\",\n                                l_res->x0, l_res->x1, l_res->y0, l_res->y1);\n                }*/\n\n                l_width_src = (OPJ_UINT32)(l_res->x1 - l_res->x0);\n                l_height_src = (OPJ_UINT32)(l_res->y1 - l_res->y0);\n\n                /* Border of the current output component*/\n                l_x0_dest = (OPJ_UINT32)opj_int_ceildivpow2((OPJ_INT32)l_img_comp_dest->x0, (OPJ_INT32)l_img_comp_dest->factor);\n                l_y0_dest = (OPJ_UINT32)opj_int_ceildivpow2((OPJ_INT32)l_img_comp_dest->y0, (OPJ_INT32)l_img_comp_dest->factor);\n                l_x1_dest = l_x0_dest + l_img_comp_dest->w;\n                l_y1_dest = l_y0_dest + l_img_comp_dest->h;\n\n                /*if (i == 0) {\n                fprintf(stdout, \"DEST: l_x0_dest=%d, l_x1_dest=%d, l_y0_dest=%d, l_y1_dest=%d (%d)\\n\",\n                                l_x0_dest, l_x1_dest, l_y0_dest, l_y1_dest, l_img_comp_dest->factor );\n                }*/\n\n                /*-----*/\n                /* Compute the area (l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src)\n                 * of the input buffer (decoded tile component) which will be move\n                 * in the output buffer. Compute the area of the output buffer (l_start_x_dest,\n                 * l_start_y_dest, l_width_dest, l_height_dest)  which will be modified\n                 * by this input area.\n                 * */\n                assert( l_res->x0 >= 0);\n                assert( l_res->x1 >= 0);\n                if ( l_x0_dest < (OPJ_UINT32)l_res->x0 ) {\n                        l_start_x_dest = (OPJ_UINT32)l_res->x0 - l_x0_dest;\n                        l_offset_x0_src = 0;\n\n                        if ( l_x1_dest >= (OPJ_UINT32)l_res->x1 ) {\n                                l_width_dest = l_width_src;\n                                l_offset_x1_src = 0;\n                        }\n                        else {\n                                l_width_dest = l_x1_dest - (OPJ_UINT32)l_res->x0 ;\n                                l_offset_x1_src = (OPJ_INT32)(l_width_src - l_width_dest);\n                        }\n                }\n                else {\n                        l_start_x_dest = 0 ;\n                        l_offset_x0_src = (OPJ_INT32)l_x0_dest - l_res->x0;\n\n                        if ( l_x1_dest >= (OPJ_UINT32)l_res->x1 ) {\n                                l_width_dest = l_width_src - (OPJ_UINT32)l_offset_x0_src;\n                                l_offset_x1_src = 0;\n                        }\n                        else {\n                                l_width_dest = l_img_comp_dest->w ;\n                                l_offset_x1_src = l_res->x1 - (OPJ_INT32)l_x1_dest;\n                        }\n                }\n\n                if ( l_y0_dest < (OPJ_UINT32)l_res->y0 ) {\n                        l_start_y_dest = (OPJ_UINT32)l_res->y0 - l_y0_dest;\n                        l_offset_y0_src = 0;\n\n                        if ( l_y1_dest >= (OPJ_UINT32)l_res->y1 ) {\n                                l_height_dest = l_height_src;\n                                l_offset_y1_src = 0;\n                        }\n                        else {\n                                l_height_dest = l_y1_dest - (OPJ_UINT32)l_res->y0 ;\n                                l_offset_y1_src =  (OPJ_INT32)(l_height_src - l_height_dest);\n                        }\n                }\n                else {\n                        l_start_y_dest = 0 ;\n                        l_offset_y0_src = (OPJ_INT32)l_y0_dest - l_res->y0;\n\n                        if ( l_y1_dest >= (OPJ_UINT32)l_res->y1 ) {\n                                l_height_dest = l_height_src - (OPJ_UINT32)l_offset_y0_src;\n                                l_offset_y1_src = 0;\n                        }\n                        else {\n                                l_height_dest = l_img_comp_dest->h ;\n                                l_offset_y1_src = l_res->y1 - (OPJ_INT32)l_y1_dest;\n                        }\n                }\n\n                if( (l_offset_x0_src < 0 ) || (l_offset_y0_src < 0 ) || (l_offset_x1_src < 0 ) || (l_offset_y1_src < 0 ) ){\n                        return OPJ_FALSE;\n                }\n                /* testcase 2977.pdf.asan.67.2198 */\n                if ((OPJ_INT32)l_width_dest < 0 || (OPJ_INT32)l_height_dest < 0) {\n                        return OPJ_FALSE;\n                }\n                /*-----*/\n\n                /* Compute the input buffer offset */\n                l_start_offset_src = l_offset_x0_src + l_offset_y0_src * (OPJ_INT32)l_width_src;\n                l_line_offset_src = l_offset_x1_src + l_offset_x0_src;\n                l_end_offset_src = l_offset_y1_src * (OPJ_INT32)l_width_src - l_offset_x0_src;\n\n                /* Compute the output buffer offset */\n                l_start_offset_dest = (OPJ_INT32)(l_start_x_dest + l_start_y_dest * l_img_comp_dest->w);\n                l_line_offset_dest = (OPJ_INT32)(l_img_comp_dest->w - l_width_dest);\n\n                /* Move the output buffer to the first place where we will write*/\n                l_dest_ptr = l_img_comp_dest->data + l_start_offset_dest;\n\n                /*if (i == 0) {\n                        fprintf(stdout, \"COMPO[%d]:\\n\",i);\n                        fprintf(stdout, \"SRC: l_start_x_src=%d, l_start_y_src=%d, l_width_src=%d, l_height_src=%d\\n\"\n                                        \"\\t tile offset:%d, %d, %d, %d\\n\"\n                                        \"\\t buffer offset: %d; %d, %d\\n\",\n                                        l_res->x0, l_res->y0, l_width_src, l_height_src,\n                                        l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src,\n                                        l_start_offset_src, l_line_offset_src, l_end_offset_src);\n\n                        fprintf(stdout, \"DEST: l_start_x_dest=%d, l_start_y_dest=%d, l_width_dest=%d, l_height_dest=%d\\n\"\n                                        \"\\t start offset: %d, line offset= %d\\n\",\n                                        l_start_x_dest, l_start_y_dest, l_width_dest, l_height_dest, l_start_offset_dest, l_line_offset_dest);\n                }*/\n\n                switch (l_size_comp) {\n                        case 1:\n                                {\n                                        OPJ_CHAR * l_src_ptr = (OPJ_CHAR*) p_data;\n                                        l_src_ptr += l_start_offset_src; /* Move to the first place where we will read*/\n\n                                        if (l_img_comp_src->sgnd) {\n                                                for (j = 0 ; j < l_height_dest ; ++j) {\n                                                        for ( k = 0 ; k < l_width_dest ; ++k) {\n                                                                *(l_dest_ptr++) = (OPJ_INT32) (*(l_src_ptr++)); /* Copy only the data needed for the output image */\n                                                        }\n\n                                                        l_dest_ptr+= l_line_offset_dest; /* Move to the next place where we will write */\n                                                        l_src_ptr += l_line_offset_src ; /* Move to the next place where we will read */\n                                                }\n                                        }\n                                        else {\n                                                for ( j = 0 ; j < l_height_dest ; ++j ) {\n                                                        for ( k = 0 ; k < l_width_dest ; ++k) {\n                                                                *(l_dest_ptr++) = (OPJ_INT32) ((*(l_src_ptr++))&0xff);\n                                                        }\n\n                                                        l_dest_ptr+= l_line_offset_dest;\n                                                        l_src_ptr += l_line_offset_src;\n                                                }\n                                        }\n\n                                        l_src_ptr += l_end_offset_src; /* Move to the end of this component-part of the input buffer */\n                                        p_data = (OPJ_BYTE*) l_src_ptr; /* Keep the current position for the next component-part */\n                                }\n                                break;\n                        case 2:\n                                {\n                                        OPJ_INT16 * l_src_ptr = (OPJ_INT16 *) p_data;\n                                        l_src_ptr += l_start_offset_src;\n\n                                        if (l_img_comp_src->sgnd) {\n                                                for (j=0;j<l_height_dest;++j) {\n                                                        for (k=0;k<l_width_dest;++k) {\n                                                                *(l_dest_ptr++) = *(l_src_ptr++);\n                                                        }\n\n                                                        l_dest_ptr+= l_line_offset_dest;\n                                                        l_src_ptr += l_line_offset_src ;\n                                                }\n                                        }\n                                        else {\n                                                for (j=0;j<l_height_dest;++j) {\n                                                        for (k=0;k<l_width_dest;++k) {\n                                                                *(l_dest_ptr++) = (*(l_src_ptr++))&0xffff;\n                                                        }\n\n                                                        l_dest_ptr+= l_line_offset_dest;\n                                                        l_src_ptr += l_line_offset_src ;\n                                                }\n                                        }\n\n                                        l_src_ptr += l_end_offset_src;\n                                        p_data = (OPJ_BYTE*) l_src_ptr;\n                                }\n                                break;\n                        case 4:\n                                {\n                                        OPJ_INT32 * l_src_ptr = (OPJ_INT32 *) p_data;\n                                        l_src_ptr += l_start_offset_src;\n\n                                        for (j=0;j<l_height_dest;++j) {\n                                                for (k=0;k<l_width_dest;++k) {\n                                                        *(l_dest_ptr++) = (*(l_src_ptr++));\n                                                }\n\n                                                l_dest_ptr+= l_line_offset_dest;\n                                                l_src_ptr += l_line_offset_src ;\n                                        }\n\n                                        l_src_ptr += l_end_offset_src;\n                                        p_data = (OPJ_BYTE*) l_src_ptr;\n                                }\n                                break;\n                }\n\n                ++l_img_comp_dest;\n                ++l_img_comp_src;\n                ++l_tilec;\n        }\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_set_decode_area(       opj_j2k_t *p_j2k,\n                                                                    opj_image_t* p_image,\n                                                                    OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,\n                                                                    OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,\n                                                                    opj_event_mgr_t * p_manager )\n{\n        opj_cp_t * l_cp = &(p_j2k->m_cp);\n        opj_image_t * l_image = p_j2k->m_private_image;\n\n        OPJ_UINT32 it_comp;\n        OPJ_INT32 l_comp_x1, l_comp_y1;\n        opj_image_comp_t* l_img_comp = NULL;\n\n        /* Check if we are read the main header */\n        if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_TPHSOT) { /* FIXME J2K_DEC_STATE_TPHSOT)*/\n                opj_event_msg(p_manager, EVT_ERROR, \"Need to decode the main header before begin to decode the remaining codestream\");\n                return OPJ_FALSE;\n        }\n\n        if ( !p_start_x && !p_start_y && !p_end_x && !p_end_y){\n                opj_event_msg(p_manager, EVT_INFO, \"No decoded area parameters, set the decoded area to the whole image\\n\");\n\n                p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;\n                p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;\n                p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;\n                p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;\n\n                return OPJ_TRUE;\n        }\n\n        /* ----- */\n        /* Check if the positions provided by the user are correct */\n\n        /* Left */\n        assert(p_start_x >= 0 );\n        assert(p_start_y >= 0 );\n\n        if ((OPJ_UINT32)p_start_x > l_image->x1 ) {\n                opj_event_msg(p_manager, EVT_ERROR,\n                        \"Left position of the decoded area (region_x0=%d) is outside the image area (Xsiz=%d).\\n\",\n                        p_start_x, l_image->x1);\n                return OPJ_FALSE;\n        }\n        else if ((OPJ_UINT32)p_start_x < l_image->x0){\n                opj_event_msg(p_manager, EVT_WARNING,\n                                \"Left position of the decoded area (region_x0=%d) is outside the image area (XOsiz=%d).\\n\",\n                                p_start_x, l_image->x0);\n                p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;\n                p_image->x0 = l_image->x0;\n        }\n        else {\n                p_j2k->m_specific_param.m_decoder.m_start_tile_x = ((OPJ_UINT32)p_start_x - l_cp->tx0) / l_cp->tdx;\n                p_image->x0 = (OPJ_UINT32)p_start_x;\n        }\n\n        /* Up */\n        if ((OPJ_UINT32)p_start_y > l_image->y1){\n                opj_event_msg(p_manager, EVT_ERROR,\n                                \"Up position of the decoded area (region_y0=%d) is outside the image area (Ysiz=%d).\\n\",\n                                p_start_y, l_image->y1);\n                return OPJ_FALSE;\n        }\n        else if ((OPJ_UINT32)p_start_y < l_image->y0){\n                opj_event_msg(p_manager, EVT_WARNING,\n                                \"Up position of the decoded area (region_y0=%d) is outside the image area (YOsiz=%d).\\n\",\n                                p_start_y, l_image->y0);\n                p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;\n                p_image->y0 = l_image->y0;\n        }\n        else {\n                p_j2k->m_specific_param.m_decoder.m_start_tile_y = ((OPJ_UINT32)p_start_y - l_cp->ty0) / l_cp->tdy;\n                p_image->y0 = (OPJ_UINT32)p_start_y;\n        }\n\n        /* Right */\n        assert((OPJ_UINT32)p_end_x > 0);\n        assert((OPJ_UINT32)p_end_y > 0);\n        if ((OPJ_UINT32)p_end_x < l_image->x0) {\n                opj_event_msg(p_manager, EVT_ERROR,\n                        \"Right position of the decoded area (region_x1=%d) is outside the image area (XOsiz=%d).\\n\",\n                        p_end_x, l_image->x0);\n                return OPJ_FALSE;\n        }\n        else if ((OPJ_UINT32)p_end_x > l_image->x1) {\n                opj_event_msg(p_manager, EVT_WARNING,\n                        \"Right position of the decoded area (region_x1=%d) is outside the image area (Xsiz=%d).\\n\",\n                        p_end_x, l_image->x1);\n                p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;\n                p_image->x1 = l_image->x1;\n        }\n        else {\n                p_j2k->m_specific_param.m_decoder.m_end_tile_x = (OPJ_UINT32)opj_int_ceildiv(p_end_x - (OPJ_INT32)l_cp->tx0, (OPJ_INT32)l_cp->tdx);\n                p_image->x1 = (OPJ_UINT32)p_end_x;\n        }\n\n        /* Bottom */\n        if ((OPJ_UINT32)p_end_y < l_image->y0) {\n                opj_event_msg(p_manager, EVT_ERROR,\n                        \"Bottom position of the decoded area (region_y1=%d) is outside the image area (YOsiz=%d).\\n\",\n                        p_end_y, l_image->y0);\n                return OPJ_FALSE;\n        }\n        if ((OPJ_UINT32)p_end_y > l_image->y1){\n                opj_event_msg(p_manager, EVT_WARNING,\n                        \"Bottom position of the decoded area (region_y1=%d) is outside the image area (Ysiz=%d).\\n\",\n                        p_end_y, l_image->y1);\n                p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;\n                p_image->y1 = l_image->y1;\n        }\n        else{\n                p_j2k->m_specific_param.m_decoder.m_end_tile_y = (OPJ_UINT32)opj_int_ceildiv(p_end_y - (OPJ_INT32)l_cp->ty0, (OPJ_INT32)l_cp->tdy);\n                p_image->y1 = (OPJ_UINT32)p_end_y;\n        }\n        /* ----- */\n\n        p_j2k->m_specific_param.m_decoder.m_discard_tiles = 1;\n\n        l_img_comp = p_image->comps;\n        for (it_comp=0; it_comp < p_image->numcomps; ++it_comp)\n        {\n                OPJ_INT32 l_h,l_w;\n\n                l_img_comp->x0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->x0, (OPJ_INT32)l_img_comp->dx);\n                l_img_comp->y0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->y0, (OPJ_INT32)l_img_comp->dy);\n                l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx);\n                l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy);\n\n                l_w = opj_int_ceildivpow2(l_comp_x1, (OPJ_INT32)l_img_comp->factor)\n                                - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->x0, (OPJ_INT32)l_img_comp->factor);\n                if (l_w < 0){\n                        opj_event_msg(p_manager, EVT_ERROR,\n                                \"Size x of the decoded component image is incorrect (comp[%d].w=%d).\\n\",\n                                it_comp, l_w);\n                        return OPJ_FALSE;\n                }\n                l_img_comp->w = (OPJ_UINT32)l_w;\n\n                l_h = opj_int_ceildivpow2(l_comp_y1, (OPJ_INT32)l_img_comp->factor)\n                                - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->y0, (OPJ_INT32)l_img_comp->factor);\n                if (l_h < 0){\n                        opj_event_msg(p_manager, EVT_ERROR,\n                                \"Size y of the decoded component image is incorrect (comp[%d].h=%d).\\n\",\n                                it_comp, l_h);\n                        return OPJ_FALSE;\n                }\n                l_img_comp->h = (OPJ_UINT32)l_h;\n\n                l_img_comp++;\n        }\n\n        opj_event_msg( p_manager, EVT_INFO,\"Setting decoding area to %d,%d,%d,%d\\n\",\n                        p_image->x0, p_image->y0, p_image->x1, p_image->y1);\n\n        return OPJ_TRUE;\n}\n\nopj_j2k_t* opj_j2k_create_decompress(void)\n{\n        opj_j2k_t *l_j2k = (opj_j2k_t*) opj_malloc(sizeof(opj_j2k_t));\n        if (!l_j2k) {\n                return 00;\n        }\n        memset(l_j2k,0,sizeof(opj_j2k_t));\n\n        l_j2k->m_is_decoder = 1;\n        l_j2k->m_cp.m_is_decoder = 1;\n\n        l_j2k->m_specific_param.m_decoder.m_default_tcp = (opj_tcp_t*) opj_malloc(sizeof(opj_tcp_t));\n        if (!l_j2k->m_specific_param.m_decoder.m_default_tcp) {\n                opj_j2k_destroy(l_j2k);\n                return 00;\n        }\n        memset(l_j2k->m_specific_param.m_decoder.m_default_tcp,0,sizeof(opj_tcp_t));\n\n        l_j2k->m_specific_param.m_decoder.m_header_data = (OPJ_BYTE *) opj_malloc(OPJ_J2K_DEFAULT_HEADER_SIZE);\n        if (! l_j2k->m_specific_param.m_decoder.m_header_data) {\n                opj_j2k_destroy(l_j2k);\n                return 00;\n        }\n\n        l_j2k->m_specific_param.m_decoder.m_header_data_size = OPJ_J2K_DEFAULT_HEADER_SIZE;\n\n        l_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec = -1 ;\n\n        l_j2k->m_specific_param.m_decoder.m_last_sot_read_pos = 0 ;\n\n        /* codestream index creation */\n        l_j2k->cstr_index = opj_j2k_create_cstr_index();\n\n                        /*(opj_codestream_index_t*) opj_malloc(sizeof(opj_codestream_index_t));\n        if (!l_j2k->cstr_index){\n                opj_j2k_destroy(l_j2k);\n                return NULL;\n        }\n\n        l_j2k->cstr_index->marker = (opj_marker_info_t*) opj_malloc(100 * sizeof(opj_marker_info_t));\n*/\n\n        /* validation list creation */\n        l_j2k->m_validation_list = opj_procedure_list_create();\n        if (! l_j2k->m_validation_list) {\n                opj_j2k_destroy(l_j2k);\n                return 00;\n        }\n\n        /* execution list creation */\n        l_j2k->m_procedure_list = opj_procedure_list_create();\n        if (! l_j2k->m_procedure_list) {\n                opj_j2k_destroy(l_j2k);\n                return 00;\n        }\n\n        return l_j2k;\n}\n\nopj_codestream_index_t* opj_j2k_create_cstr_index(void)\n{\n        opj_codestream_index_t* cstr_index = (opj_codestream_index_t*)\n                        opj_calloc(1,sizeof(opj_codestream_index_t));\n        if (!cstr_index)\n                return NULL;\n\n        cstr_index->maxmarknum = 100;\n        cstr_index->marknum = 0;\n        cstr_index->marker = (opj_marker_info_t*)\n                        opj_calloc(cstr_index->maxmarknum, sizeof(opj_marker_info_t));\n        if (!cstr_index-> marker)\n                return NULL;\n\n        cstr_index->tile_index = NULL;\n\n        return cstr_index;\n}\n\nOPJ_UINT32 opj_j2k_get_SPCod_SPCoc_size (       opj_j2k_t *p_j2k,\n                                                                                OPJ_UINT32 p_tile_no,\n                                                                                OPJ_UINT32 p_comp_no )\n{\n        opj_cp_t *l_cp = 00;\n        opj_tcp_t *l_tcp = 00;\n        opj_tccp_t *l_tccp = 00;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n\n        l_cp = &(p_j2k->m_cp);\n        l_tcp = &l_cp->tcps[p_tile_no];\n        l_tccp = &l_tcp->tccps[p_comp_no];\n\n        /* preconditions again */\n        assert(p_tile_no < (l_cp->tw * l_cp->th));\n        assert(p_comp_no < p_j2k->m_private_image->numcomps);\n\n        if (l_tccp->csty & J2K_CCP_CSTY_PRT) {\n                return 5 + l_tccp->numresolutions;\n        }\n        else {\n                return 5;\n        }\n}\n\nOPJ_BOOL opj_j2k_write_SPCod_SPCoc(     opj_j2k_t *p_j2k,\n                                                                    OPJ_UINT32 p_tile_no,\n                                                                    OPJ_UINT32 p_comp_no,\n                                                                    OPJ_BYTE * p_data,\n                                                                    OPJ_UINT32 * p_header_size,\n                                                                    struct opj_event_mgr * p_manager )\n{\n        OPJ_UINT32 i;\n        opj_cp_t *l_cp = 00;\n        opj_tcp_t *l_tcp = 00;\n        opj_tccp_t *l_tccp = 00;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_header_size != 00);\n        assert(p_manager != 00);\n        assert(p_data != 00);\n\n        l_cp = &(p_j2k->m_cp);\n        l_tcp = &l_cp->tcps[p_tile_no];\n        l_tccp = &l_tcp->tccps[p_comp_no];\n\n        /* preconditions again */\n        assert(p_tile_no < (l_cp->tw * l_cp->th));\n        assert(p_comp_no <(p_j2k->m_private_image->numcomps));\n\n        if (*p_header_size < 5) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error writing SPCod SPCoc element\\n\");\n                return OPJ_FALSE;\n        }\n\n        opj_write_bytes(p_data,l_tccp->numresolutions - 1, 1);  /* SPcoc (D) */\n        ++p_data;\n\n        opj_write_bytes(p_data,l_tccp->cblkw - 2, 1);                   /* SPcoc (E) */\n        ++p_data;\n\n        opj_write_bytes(p_data,l_tccp->cblkh - 2, 1);                   /* SPcoc (F) */\n        ++p_data;\n\n        opj_write_bytes(p_data,l_tccp->cblksty, 1);                             /* SPcoc (G) */\n        ++p_data;\n\n        opj_write_bytes(p_data,l_tccp->qmfbid, 1);                              /* SPcoc (H) */\n        ++p_data;\n\n        *p_header_size = *p_header_size - 5;\n\n        if (l_tccp->csty & J2K_CCP_CSTY_PRT) {\n\n                if (*p_header_size < l_tccp->numresolutions) {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Error writing SPCod SPCoc element\\n\");\n                        return OPJ_FALSE;\n                }\n\n                for (i = 0; i < l_tccp->numresolutions; ++i) {\n                        opj_write_bytes(p_data,l_tccp->prcw[i] + (l_tccp->prch[i] << 4), 1);    /* SPcoc (I_i) */\n                        ++p_data;\n                }\n\n                *p_header_size = *p_header_size - l_tccp->numresolutions;\n        }\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_read_SPCod_SPCoc(  opj_j2k_t *p_j2k,\n                                                                OPJ_UINT32 compno,\n                                                                OPJ_BYTE * p_header_data,\n                                                                OPJ_UINT32 * p_header_size,\n                                                                opj_event_mgr_t * p_manager)\n{\n        OPJ_UINT32 i, l_tmp;\n        opj_cp_t *l_cp = NULL;\n        opj_tcp_t *l_tcp = NULL;\n        opj_tccp_t *l_tccp = NULL;\n        OPJ_BYTE * l_current_ptr = NULL;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_header_data != 00);\n\n        l_cp = &(p_j2k->m_cp);\n        l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?\n                                &l_cp->tcps[p_j2k->m_current_tile_number] :\n                                p_j2k->m_specific_param.m_decoder.m_default_tcp;\n\n        /* precondition again */\n        assert(compno < p_j2k->m_private_image->numcomps);\n\n        l_tccp = &l_tcp->tccps[compno];\n        l_current_ptr = p_header_data;\n\n        /* make sure room is sufficient */\n        if (*p_header_size < 5) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading SPCod SPCoc element\\n\");\n                return OPJ_FALSE;\n        }\n\n        opj_read_bytes(l_current_ptr, &l_tccp->numresolutions ,1);              /* SPcox (D) */\n        ++l_tccp->numresolutions;                                                                               /* tccp->numresolutions = read() + 1 */\n        if (l_tccp->numresolutions > OPJ_J2K_MAXRLVLS) {\n                opj_event_msg(p_manager, EVT_ERROR,\n                              \"Invalid value for numresolutions : %d, max value is set in openjpeg.h at %d\\n\",\n                              l_tccp->numresolutions, OPJ_J2K_MAXRLVLS);\n                return OPJ_FALSE;\n        }\n        ++l_current_ptr;\n\n        /* If user wants to remove more resolutions than the codestream contains, return error */\n        if (l_cp->m_specific_param.m_dec.m_reduce >= l_tccp->numresolutions) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error decoding component %d.\\nThe number of resolutions to remove is higher than the number \"\n                                        \"of resolutions of this component\\nModify the cp_reduce parameter.\\n\\n\", compno);\n                p_j2k->m_specific_param.m_decoder.m_state |= 0x8000;/* FIXME J2K_DEC_STATE_ERR;*/\n                return OPJ_FALSE;\n        }\n\n        opj_read_bytes(l_current_ptr,&l_tccp->cblkw ,1);                /* SPcoc (E) */\n        ++l_current_ptr;\n        l_tccp->cblkw += 2;\n\n        opj_read_bytes(l_current_ptr,&l_tccp->cblkh ,1);                /* SPcoc (F) */\n        ++l_current_ptr;\n        l_tccp->cblkh += 2;\n\n        opj_read_bytes(l_current_ptr,&l_tccp->cblksty ,1);              /* SPcoc (G) */\n        ++l_current_ptr;\n\n        opj_read_bytes(l_current_ptr,&l_tccp->qmfbid ,1);               /* SPcoc (H) */\n        ++l_current_ptr;\n\n        *p_header_size = *p_header_size - 5;\n\n        /* use custom precinct size ? */\n        if (l_tccp->csty & J2K_CCP_CSTY_PRT) {\n                if (*p_header_size < l_tccp->numresolutions) {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Error reading SPCod SPCoc element\\n\");\n                        return OPJ_FALSE;\n                }\n\n                for     (i = 0; i < l_tccp->numresolutions; ++i) {\n                        opj_read_bytes(l_current_ptr,&l_tmp ,1);                /* SPcoc (I_i) */\n                        ++l_current_ptr;\n                        l_tccp->prcw[i] = l_tmp & 0xf;\n                        l_tccp->prch[i] = l_tmp >> 4;\n                }\n\n                *p_header_size = *p_header_size - l_tccp->numresolutions;\n        }\n        else {\n                /* set default size for the precinct width and height */\n                for     (i = 0; i < l_tccp->numresolutions; ++i) {\n                        l_tccp->prcw[i] = 15;\n                        l_tccp->prch[i] = 15;\n                }\n        }\n\n#ifdef WIP_REMOVE_MSD\n        /* INDEX >> */\n        if (p_j2k->cstr_info && compno == 0) {\n                OPJ_UINT32 l_data_size = l_tccp->numresolutions * sizeof(OPJ_UINT32);\n\n                p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblkh = l_tccp->cblkh;\n                p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblkw = l_tccp->cblkw;\n                p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].numresolutions = l_tccp->numresolutions;\n                p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblksty = l_tccp->cblksty;\n                p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].qmfbid = l_tccp->qmfbid;\n\n                memcpy(p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].pdx,l_tccp->prcw, l_data_size);\n                memcpy(p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].pdy,l_tccp->prch, l_data_size);\n        }\n        /* << INDEX */\n#endif\n\n        return OPJ_TRUE;\n}\n\nvoid opj_j2k_copy_tile_component_parameters( opj_j2k_t *p_j2k )\n{\n        /* loop */\n        OPJ_UINT32 i;\n        opj_cp_t *l_cp = NULL;\n        opj_tcp_t *l_tcp = NULL;\n        opj_tccp_t *l_ref_tccp = NULL, *l_copied_tccp = NULL;\n        OPJ_UINT32 l_prc_size;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n\n        l_cp = &(p_j2k->m_cp);\n        l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ? /* FIXME J2K_DEC_STATE_TPH*/\n                                &l_cp->tcps[p_j2k->m_current_tile_number] :\n                                p_j2k->m_specific_param.m_decoder.m_default_tcp;\n\n        l_ref_tccp = &l_tcp->tccps[0];\n        l_copied_tccp = l_ref_tccp + 1;\n        l_prc_size = l_ref_tccp->numresolutions * (OPJ_UINT32)sizeof(OPJ_UINT32);\n\n        for     (i=1; i<p_j2k->m_private_image->numcomps; ++i) {\n                l_copied_tccp->numresolutions = l_ref_tccp->numresolutions;\n                l_copied_tccp->cblkw = l_ref_tccp->cblkw;\n                l_copied_tccp->cblkh = l_ref_tccp->cblkh;\n                l_copied_tccp->cblksty = l_ref_tccp->cblksty;\n                l_copied_tccp->qmfbid = l_ref_tccp->qmfbid;\n                memcpy(l_copied_tccp->prcw,l_ref_tccp->prcw,l_prc_size);\n                memcpy(l_copied_tccp->prch,l_ref_tccp->prch,l_prc_size);\n                ++l_copied_tccp;\n        }\n}\n\nOPJ_UINT32 opj_j2k_get_SQcd_SQcc_size ( opj_j2k_t *p_j2k,\n                                                                        OPJ_UINT32 p_tile_no,\n                                                                        OPJ_UINT32 p_comp_no )\n{\n        OPJ_UINT32 l_num_bands;\n\n        opj_cp_t *l_cp = 00;\n        opj_tcp_t *l_tcp = 00;\n        opj_tccp_t *l_tccp = 00;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n\n        l_cp = &(p_j2k->m_cp);\n        l_tcp = &l_cp->tcps[p_tile_no];\n        l_tccp = &l_tcp->tccps[p_comp_no];\n\n        /* preconditions again */\n        assert(p_tile_no < l_cp->tw * l_cp->th);\n        assert(p_comp_no < p_j2k->m_private_image->numcomps);\n\n        l_num_bands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 : (l_tccp->numresolutions * 3 - 2);\n\n        if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT)  {\n                return 1 + l_num_bands;\n        }\n        else {\n                return 1 + 2*l_num_bands;\n        }\n}\n\nOPJ_BOOL opj_j2k_write_SQcd_SQcc(       opj_j2k_t *p_j2k,\n                                                                OPJ_UINT32 p_tile_no,\n                                                                OPJ_UINT32 p_comp_no,\n                                                                OPJ_BYTE * p_data,\n                                                                OPJ_UINT32 * p_header_size,\n                                                                struct opj_event_mgr * p_manager )\n{\n        OPJ_UINT32 l_header_size;\n        OPJ_UINT32 l_band_no, l_num_bands;\n        OPJ_UINT32 l_expn,l_mant;\n\n        opj_cp_t *l_cp = 00;\n        opj_tcp_t *l_tcp = 00;\n        opj_tccp_t *l_tccp = 00;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_header_size != 00);\n        assert(p_manager != 00);\n        assert(p_data != 00);\n\n        l_cp = &(p_j2k->m_cp);\n        l_tcp = &l_cp->tcps[p_tile_no];\n        l_tccp = &l_tcp->tccps[p_comp_no];\n\n        /* preconditions again */\n        assert(p_tile_no < l_cp->tw * l_cp->th);\n        assert(p_comp_no <p_j2k->m_private_image->numcomps);\n\n        l_num_bands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 : (l_tccp->numresolutions * 3 - 2);\n\n        if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT)  {\n                l_header_size = 1 + l_num_bands;\n\n                if (*p_header_size < l_header_size) {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Error writing SQcd SQcc element\\n\");\n                        return OPJ_FALSE;\n                }\n\n                opj_write_bytes(p_data,l_tccp->qntsty + (l_tccp->numgbits << 5), 1);    /* Sqcx */\n                ++p_data;\n\n                for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {\n                        l_expn = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].expn;\n                        opj_write_bytes(p_data, l_expn << 3, 1);        /* SPqcx_i */\n                        ++p_data;\n                }\n        }\n        else {\n                l_header_size = 1 + 2*l_num_bands;\n\n                if (*p_header_size < l_header_size) {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Error writing SQcd SQcc element\\n\");\n                        return OPJ_FALSE;\n                }\n\n                opj_write_bytes(p_data,l_tccp->qntsty + (l_tccp->numgbits << 5), 1);    /* Sqcx */\n                ++p_data;\n\n                for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {\n                        l_expn = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].expn;\n                        l_mant = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].mant;\n\n                        opj_write_bytes(p_data, (l_expn << 11) + l_mant, 2);    /* SPqcx_i */\n                        p_data += 2;\n                }\n        }\n\n        *p_header_size = *p_header_size - l_header_size;\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_read_SQcd_SQcc(opj_j2k_t *p_j2k,\n                                                            OPJ_UINT32 p_comp_no,\n                                                            OPJ_BYTE* p_header_data,\n                                                            OPJ_UINT32 * p_header_size,\n                                                            opj_event_mgr_t * p_manager\n                                                            )\n{\n        /* loop*/\n        OPJ_UINT32 l_band_no;\n        opj_cp_t *l_cp = 00;\n        opj_tcp_t *l_tcp = 00;\n        opj_tccp_t *l_tccp = 00;\n        OPJ_BYTE * l_current_ptr = 00;\n        OPJ_UINT32 l_tmp, l_num_band;\n\n        /* preconditions*/\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_header_data != 00);\n\n        l_cp = &(p_j2k->m_cp);\n        /* come from tile part header or main header ?*/\n        l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ? /*FIXME J2K_DEC_STATE_TPH*/\n                                &l_cp->tcps[p_j2k->m_current_tile_number] :\n                                p_j2k->m_specific_param.m_decoder.m_default_tcp;\n\n        /* precondition again*/\n        assert(p_comp_no <  p_j2k->m_private_image->numcomps);\n\n        l_tccp = &l_tcp->tccps[p_comp_no];\n        l_current_ptr = p_header_data;\n\n        if (*p_header_size < 1) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error reading SQcd or SQcc element\\n\");\n                return OPJ_FALSE;\n        }\n        *p_header_size -= 1;\n\n        opj_read_bytes(l_current_ptr, &l_tmp ,1);                       /* Sqcx */\n        ++l_current_ptr;\n\n        l_tccp->qntsty = l_tmp & 0x1f;\n        l_tccp->numgbits = l_tmp >> 5;\n        if (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) {\n        l_num_band = 1;\n        }\n        else {\n                l_num_band = (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) ?\n                        (*p_header_size) :\n                        (*p_header_size) / 2;\n\n                if( l_num_band > OPJ_J2K_MAXBANDS ) {\n                        opj_event_msg(p_manager, EVT_WARNING, \"While reading CCP_QNTSTY element inside QCD or QCC marker segment, \"\n                                \"number of subbands (%d) is greater to OPJ_J2K_MAXBANDS (%d). So we limit the number of elements stored to \"\n                                \"OPJ_J2K_MAXBANDS (%d) and skip the rest. \\n\", l_num_band, OPJ_J2K_MAXBANDS, OPJ_J2K_MAXBANDS);\n                        /*return OPJ_FALSE;*/\n                }\n        }\n\n#ifdef USE_JPWL\n        if (l_cp->correct) {\n\n                /* if JPWL is on, we check whether there are too many subbands */\n                if (/*(l_num_band < 0) ||*/ (l_num_band >= OPJ_J2K_MAXBANDS)) {\n                        opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,\n                                \"JPWL: bad number of subbands in Sqcx (%d)\\n\",\n                                l_num_band);\n                        if (!JPWL_ASSUME) {\n                                opj_event_msg(p_manager, EVT_ERROR, \"JPWL: giving up\\n\");\n                                return OPJ_FALSE;\n                        }\n                        /* we try to correct */\n                        l_num_band = 1;\n                        opj_event_msg(p_manager, EVT_WARNING, \"- trying to adjust them\\n\"\n                                \"- setting number of bands to %d => HYPOTHESIS!!!\\n\",\n                                l_num_band);\n                };\n\n        };\n#endif /* USE_JPWL */\n\n        if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {\n                for     (l_band_no = 0; l_band_no < l_num_band; l_band_no++) {\n                        opj_read_bytes(l_current_ptr, &l_tmp ,1);                       /* SPqcx_i */\n                        ++l_current_ptr;\n                        if (l_band_no < OPJ_J2K_MAXBANDS){\n                                l_tccp->stepsizes[l_band_no].expn = (OPJ_INT32)(l_tmp >> 3);\n                                l_tccp->stepsizes[l_band_no].mant = 0;\n                        }\n                }\n                *p_header_size = *p_header_size - l_num_band;\n        }\n        else {\n                for     (l_band_no = 0; l_band_no < l_num_band; l_band_no++) {\n                        opj_read_bytes(l_current_ptr, &l_tmp ,2);                       /* SPqcx_i */\n                        l_current_ptr+=2;\n                        if (l_band_no < OPJ_J2K_MAXBANDS){\n                                l_tccp->stepsizes[l_band_no].expn = (OPJ_INT32)(l_tmp >> 11);\n                                l_tccp->stepsizes[l_band_no].mant = l_tmp & 0x7ff;\n                        }\n                }\n                *p_header_size = *p_header_size - 2*l_num_band;\n        }\n\n        /* Add Antonin : if scalar_derived -> compute other stepsizes */\n        if (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) {\n                for (l_band_no = 1; l_band_no < OPJ_J2K_MAXBANDS; l_band_no++) {\n                        l_tccp->stepsizes[l_band_no].expn =\n                                ((OPJ_INT32)(l_tccp->stepsizes[0].expn) - (OPJ_INT32)((l_band_no - 1) / 3) > 0) ?\n                                        (OPJ_INT32)(l_tccp->stepsizes[0].expn) - (OPJ_INT32)((l_band_no - 1) / 3) : 0;\n                        l_tccp->stepsizes[l_band_no].mant = l_tccp->stepsizes[0].mant;\n                }\n        }\n\n        return OPJ_TRUE;\n}\n\nvoid opj_j2k_copy_tile_quantization_parameters( opj_j2k_t *p_j2k )\n{\n        OPJ_UINT32 i;\n        opj_cp_t *l_cp = NULL;\n        opj_tcp_t *l_tcp = NULL;\n        opj_tccp_t *l_ref_tccp = NULL;\n        opj_tccp_t *l_copied_tccp = NULL;\n        OPJ_UINT32 l_size;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n\n        l_cp = &(p_j2k->m_cp);\n        l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?\n                        &l_cp->tcps[p_j2k->m_current_tile_number] :\n                        p_j2k->m_specific_param.m_decoder.m_default_tcp;\n\n        l_ref_tccp = &l_tcp->tccps[0];\n        l_copied_tccp = l_ref_tccp + 1;\n        l_size = OPJ_J2K_MAXBANDS * sizeof(opj_stepsize_t);\n\n        for     (i=1;i<p_j2k->m_private_image->numcomps;++i) {\n                l_copied_tccp->qntsty = l_ref_tccp->qntsty;\n                l_copied_tccp->numgbits = l_ref_tccp->numgbits;\n                memcpy(l_copied_tccp->stepsizes,l_ref_tccp->stepsizes,l_size);\n                ++l_copied_tccp;\n        }\n}\n\nstatic void opj_j2k_dump_tile_info( opj_tcp_t * l_default_tile,OPJ_INT32 numcomps,FILE* out_stream)\n{\n        if (l_default_tile)\n        {\n                OPJ_INT32 compno;\n\n                fprintf(out_stream, \"\\t default tile {\\n\");\n                fprintf(out_stream, \"\\t\\t csty=%#x\\n\", l_default_tile->csty);\n                fprintf(out_stream, \"\\t\\t prg=%#x\\n\", l_default_tile->prg);\n                fprintf(out_stream, \"\\t\\t numlayers=%d\\n\", l_default_tile->numlayers);\n                fprintf(out_stream, \"\\t\\t mct=%x\\n\", l_default_tile->mct);\n\n                for (compno = 0; compno < numcomps; compno++) {\n                        opj_tccp_t *l_tccp = &(l_default_tile->tccps[compno]);\n                        OPJ_UINT32 resno;\n      OPJ_INT32 bandno, numbands;\n\n                        /* coding style*/\n                        fprintf(out_stream, \"\\t\\t comp %d {\\n\", compno);\n                        fprintf(out_stream, \"\\t\\t\\t csty=%#x\\n\", l_tccp->csty);\n                        fprintf(out_stream, \"\\t\\t\\t numresolutions=%d\\n\", l_tccp->numresolutions);\n                        fprintf(out_stream, \"\\t\\t\\t cblkw=2^%d\\n\", l_tccp->cblkw);\n                        fprintf(out_stream, \"\\t\\t\\t cblkh=2^%d\\n\", l_tccp->cblkh);\n                        fprintf(out_stream, \"\\t\\t\\t cblksty=%#x\\n\", l_tccp->cblksty);\n                        fprintf(out_stream, \"\\t\\t\\t qmfbid=%d\\n\", l_tccp->qmfbid);\n\n                        fprintf(out_stream, \"\\t\\t\\t preccintsize (w,h)=\");\n                        for (resno = 0; resno < l_tccp->numresolutions; resno++) {\n                                fprintf(out_stream, \"(%d,%d) \", l_tccp->prcw[resno], l_tccp->prch[resno]);\n                        }\n                        fprintf(out_stream, \"\\n\");\n\n                        /* quantization style*/\n                        fprintf(out_stream, \"\\t\\t\\t qntsty=%d\\n\", l_tccp->qntsty);\n                        fprintf(out_stream, \"\\t\\t\\t numgbits=%d\\n\", l_tccp->numgbits);\n                        fprintf(out_stream, \"\\t\\t\\t stepsizes (m,e)=\");\n                        numbands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 : (OPJ_INT32)l_tccp->numresolutions * 3 - 2;\n                        for (bandno = 0; bandno < numbands; bandno++) {\n                                fprintf(out_stream, \"(%d,%d) \", l_tccp->stepsizes[bandno].mant,\n                                        l_tccp->stepsizes[bandno].expn);\n                        }\n                        fprintf(out_stream, \"\\n\");\n\n                        /* RGN value*/\n                        fprintf(out_stream, \"\\t\\t\\t roishift=%d\\n\", l_tccp->roishift);\n\n                        fprintf(out_stream, \"\\t\\t }\\n\");\n                } /*end of component of default tile*/\n                fprintf(out_stream, \"\\t }\\n\"); /*end of default tile*/\n            }\n}\n\nvoid j2k_dump (opj_j2k_t* p_j2k, OPJ_INT32 flag, FILE* out_stream)\n{\n        /* Check if the flag is compatible with j2k file*/\n        if ( (flag & OPJ_JP2_INFO) || (flag & OPJ_JP2_IND)){\n                fprintf(out_stream, \"Wrong flag\\n\");\n                return;\n        }\n\n        /* Dump the image_header */\n        if (flag & OPJ_IMG_INFO){\n                if (p_j2k->m_private_image)\n                        j2k_dump_image_header(p_j2k->m_private_image, 0, out_stream);\n        }\n\n        /* Dump the codestream info from main header */\n        if (flag & OPJ_J2K_MH_INFO){\n                opj_j2k_dump_MH_info(p_j2k, out_stream);\n        }\n        /* Dump all tile/codestream info */\n        if (flag & OPJ_J2K_TCH_INFO){\n          OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;\n          OPJ_UINT32 i;\n          opj_tcp_t * l_tcp = p_j2k->m_cp.tcps;\n          for (i=0;i<l_nb_tiles;++i) {\n            opj_j2k_dump_tile_info( l_tcp,(OPJ_INT32)p_j2k->m_private_image->numcomps, out_stream);\n            ++l_tcp;\n          }\n        }\n\n        /* Dump the codestream info of the current tile */\n        if (flag & OPJ_J2K_TH_INFO){\n\n        }\n\n        /* Dump the codestream index from main header */\n        if (flag & OPJ_J2K_MH_IND){\n                opj_j2k_dump_MH_index(p_j2k, out_stream);\n        }\n\n        /* Dump the codestream index of the current tile */\n        if (flag & OPJ_J2K_TH_IND){\n\n        }\n\n}\n\nvoid opj_j2k_dump_MH_index(opj_j2k_t* p_j2k, FILE* out_stream)\n{\n        opj_codestream_index_t* cstr_index = p_j2k->cstr_index;\n        OPJ_UINT32 it_marker, it_tile, it_tile_part;\n\n        fprintf(out_stream, \"Codestream index from main header: {\\n\");\n\n        fprintf(out_stream, \"\\t Main header start position=%\" PRIi64 \"\\n\"\n                                    \"\\t Main header end position=%\" PRIi64 \"\\n\",\n                        cstr_index->main_head_start, cstr_index->main_head_end);\n\n        fprintf(out_stream, \"\\t Marker list: {\\n\");\n\n        if (cstr_index->marker){\n                for (it_marker=0; it_marker < cstr_index->marknum ; it_marker++){\n                        fprintf(out_stream, \"\\t\\t type=%#x, pos=%\" PRIi64 \", len=%d\\n\",\n                                        cstr_index->marker[it_marker].type,\n                                        cstr_index->marker[it_marker].pos,\n                                        cstr_index->marker[it_marker].len );\n                }\n        }\n\n        fprintf(out_stream, \"\\t }\\n\");\n\n        if (cstr_index->tile_index){\n\n        /* Simple test to avoid to write empty information*/\n        OPJ_UINT32 l_acc_nb_of_tile_part = 0;\n        for (it_tile=0; it_tile < cstr_index->nb_of_tiles ; it_tile++){\n                        l_acc_nb_of_tile_part += cstr_index->tile_index[it_tile].nb_tps;\n        }\n\n        if (l_acc_nb_of_tile_part)\n        {\n            fprintf(out_stream, \"\\t Tile index: {\\n\");\n\n                    for (it_tile=0; it_tile < cstr_index->nb_of_tiles ; it_tile++){\n                            OPJ_UINT32 nb_of_tile_part = cstr_index->tile_index[it_tile].nb_tps;\n\n                            fprintf(out_stream, \"\\t\\t nb of tile-part in tile [%d]=%d\\n\", it_tile, nb_of_tile_part);\n\n                            if (cstr_index->tile_index[it_tile].tp_index){\n                                    for (it_tile_part =0; it_tile_part < nb_of_tile_part; it_tile_part++){\n                                            fprintf(out_stream, \"\\t\\t\\t tile-part[%d]: star_pos=%\" PRIi64 \", end_header=%\" PRIi64 \", end_pos=%\" PRIi64 \".\\n\",\n                                                            it_tile_part,\n                                                            cstr_index->tile_index[it_tile].tp_index[it_tile_part].start_pos,\n                                                            cstr_index->tile_index[it_tile].tp_index[it_tile_part].end_header,\n                                                            cstr_index->tile_index[it_tile].tp_index[it_tile_part].end_pos);\n                                    }\n                            }\n\n                            if (cstr_index->tile_index[it_tile].marker){\n                                    for (it_marker=0; it_marker < cstr_index->tile_index[it_tile].marknum ; it_marker++){\n                                            fprintf(out_stream, \"\\t\\t type=%#x, pos=%\" PRIi64 \", len=%d\\n\",\n                                                            cstr_index->tile_index[it_tile].marker[it_marker].type,\n                                                            cstr_index->tile_index[it_tile].marker[it_marker].pos,\n                                                            cstr_index->tile_index[it_tile].marker[it_marker].len );\n                                    }\n                            }\n                    }\n                    fprintf(out_stream,\"\\t }\\n\");\n        }\n        }\n\n        fprintf(out_stream,\"}\\n\");\n\n}\n\n\nvoid opj_j2k_dump_MH_info(opj_j2k_t* p_j2k, FILE* out_stream)\n{\n\n        fprintf(out_stream, \"Codestream info from main header: {\\n\");\n\n        fprintf(out_stream, \"\\t tx0=%d, ty0=%d\\n\", p_j2k->m_cp.tx0, p_j2k->m_cp.ty0);\n        fprintf(out_stream, \"\\t tdx=%d, tdy=%d\\n\", p_j2k->m_cp.tdx, p_j2k->m_cp.tdy);\n        fprintf(out_stream, \"\\t tw=%d, th=%d\\n\", p_j2k->m_cp.tw, p_j2k->m_cp.th);\n        opj_j2k_dump_tile_info(p_j2k->m_specific_param.m_decoder.m_default_tcp,(OPJ_INT32)p_j2k->m_private_image->numcomps, out_stream);\n        fprintf(out_stream, \"}\\n\");\n}\n\nvoid j2k_dump_image_header(opj_image_t* img_header, OPJ_BOOL dev_dump_flag, FILE* out_stream)\n{\n        char tab[2];\n\n        if (dev_dump_flag){\n                fprintf(stdout, \"[DEV] Dump an image_header struct {\\n\");\n                tab[0] = '\\0';\n        }\n        else {\n                fprintf(out_stream, \"Image info {\\n\");\n                tab[0] = '\\t';tab[1] = '\\0';\n        }\n\n        fprintf(out_stream, \"%s x0=%d, y0=%d\\n\", tab, img_header->x0, img_header->y0);\n        fprintf(out_stream,     \"%s x1=%d, y1=%d\\n\", tab, img_header->x1, img_header->y1);\n        fprintf(out_stream, \"%s numcomps=%d\\n\", tab, img_header->numcomps);\n\n        if (img_header->comps){\n                OPJ_UINT32 compno;\n                for (compno = 0; compno < img_header->numcomps; compno++) {\n                        fprintf(out_stream, \"%s\\t component %d {\\n\", tab, compno);\n                        j2k_dump_image_comp_header(&(img_header->comps[compno]), dev_dump_flag, out_stream);\n                        fprintf(out_stream,\"%s}\\n\",tab);\n                }\n        }\n\n        fprintf(out_stream, \"}\\n\");\n}\n\nvoid j2k_dump_image_comp_header(opj_image_comp_t* comp_header, OPJ_BOOL dev_dump_flag, FILE* out_stream)\n{\n        char tab[3];\n\n        if (dev_dump_flag){\n                fprintf(stdout, \"[DEV] Dump an image_comp_header struct {\\n\");\n                tab[0] = '\\0';\n        }       else {\n                tab[0] = '\\t';tab[1] = '\\t';tab[2] = '\\0';\n        }\n\n        fprintf(out_stream, \"%s dx=%d, dy=%d\\n\", tab, comp_header->dx, comp_header->dy);\n        fprintf(out_stream, \"%s prec=%d\\n\", tab, comp_header->prec);\n        fprintf(out_stream, \"%s sgnd=%d\\n\", tab, comp_header->sgnd);\n\n        if (dev_dump_flag)\n                fprintf(out_stream, \"}\\n\");\n}\n\nopj_codestream_info_v2_t* j2k_get_cstr_info(opj_j2k_t* p_j2k)\n{\n        OPJ_UINT32 compno;\n        OPJ_UINT32 numcomps = p_j2k->m_private_image->numcomps;\n        opj_tcp_t *l_default_tile;\n        opj_codestream_info_v2_t* cstr_info = (opj_codestream_info_v2_t*) opj_calloc(1,sizeof(opj_codestream_info_v2_t));\n\t\tif (!cstr_info)\n\t\t\treturn NULL;\n\n        cstr_info->nbcomps = p_j2k->m_private_image->numcomps;\n\n        cstr_info->tx0 = p_j2k->m_cp.tx0;\n        cstr_info->ty0 = p_j2k->m_cp.ty0;\n        cstr_info->tdx = p_j2k->m_cp.tdx;\n        cstr_info->tdy = p_j2k->m_cp.tdy;\n        cstr_info->tw = p_j2k->m_cp.tw;\n        cstr_info->th = p_j2k->m_cp.th;\n\n        cstr_info->tile_info = NULL; /* Not fill from the main header*/\n\n        l_default_tile = p_j2k->m_specific_param.m_decoder.m_default_tcp;\n\n        cstr_info->m_default_tile_info.csty = l_default_tile->csty;\n        cstr_info->m_default_tile_info.prg = l_default_tile->prg;\n        cstr_info->m_default_tile_info.numlayers = l_default_tile->numlayers;\n        cstr_info->m_default_tile_info.mct = l_default_tile->mct;\n\n        cstr_info->m_default_tile_info.tccp_info = (opj_tccp_info_t*) opj_calloc(cstr_info->nbcomps, sizeof(opj_tccp_info_t));\n\t\tif (!cstr_info->m_default_tile_info.tccp_info)\n\t\t{\n\t\t\topj_destroy_cstr_info(&cstr_info);\n\t\t\treturn NULL;\n\t\t}\n\n        for (compno = 0; compno < numcomps; compno++) {\n                opj_tccp_t *l_tccp = &(l_default_tile->tccps[compno]);\n                opj_tccp_info_t *l_tccp_info = &(cstr_info->m_default_tile_info.tccp_info[compno]);\n                OPJ_INT32 bandno, numbands;\n\n                /* coding style*/\n                l_tccp_info->csty = l_tccp->csty;\n                l_tccp_info->numresolutions = l_tccp->numresolutions;\n                l_tccp_info->cblkw = l_tccp->cblkw;\n                l_tccp_info->cblkh = l_tccp->cblkh;\n                l_tccp_info->cblksty = l_tccp->cblksty;\n                l_tccp_info->qmfbid = l_tccp->qmfbid;\n                if (l_tccp->numresolutions < OPJ_J2K_MAXRLVLS)\n                {\n                        memcpy(l_tccp_info->prch, l_tccp->prch, l_tccp->numresolutions);\n                        memcpy(l_tccp_info->prcw, l_tccp->prcw, l_tccp->numresolutions);\n                }\n\n                /* quantization style*/\n                l_tccp_info->qntsty = l_tccp->qntsty;\n                l_tccp_info->numgbits = l_tccp->numgbits;\n\n                numbands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 : (OPJ_INT32)l_tccp->numresolutions * 3 - 2;\n                if (numbands < OPJ_J2K_MAXBANDS) {\n                        for (bandno = 0; bandno < numbands; bandno++) {\n                                l_tccp_info->stepsizes_mant[bandno] = (OPJ_UINT32)l_tccp->stepsizes[bandno].mant;\n                                l_tccp_info->stepsizes_expn[bandno] = (OPJ_UINT32)l_tccp->stepsizes[bandno].expn;\n                        }\n                }\n\n                /* RGN value*/\n                l_tccp_info->roishift = l_tccp->roishift;\n        }\n\n        return cstr_info;\n}\n\nopj_codestream_index_t* j2k_get_cstr_index(opj_j2k_t* p_j2k)\n{\n        opj_codestream_index_t* l_cstr_index = (opj_codestream_index_t*)\n                        opj_calloc(1,sizeof(opj_codestream_index_t));\n        if (!l_cstr_index)\n                return NULL;\n\n        l_cstr_index->main_head_start = p_j2k->cstr_index->main_head_start;\n        l_cstr_index->main_head_end = p_j2k->cstr_index->main_head_end;\n        l_cstr_index->codestream_size = p_j2k->cstr_index->codestream_size;\n\n        l_cstr_index->marknum = p_j2k->cstr_index->marknum;\n        l_cstr_index->marker = (opj_marker_info_t*)opj_malloc(l_cstr_index->marknum*sizeof(opj_marker_info_t));\n        if (!l_cstr_index->marker){\n                opj_free( l_cstr_index);\n                return NULL;\n        }\n\n        if (p_j2k->cstr_index->marker)\n                memcpy(l_cstr_index->marker, p_j2k->cstr_index->marker, l_cstr_index->marknum * sizeof(opj_marker_info_t) );\n        else{\n                opj_free(l_cstr_index->marker);\n                l_cstr_index->marker = NULL;\n        }\n\n        l_cstr_index->nb_of_tiles = p_j2k->cstr_index->nb_of_tiles;\n        l_cstr_index->tile_index = (opj_tile_index_t*)opj_calloc(l_cstr_index->nb_of_tiles, sizeof(opj_tile_index_t) );\n        if (!l_cstr_index->tile_index){\n                opj_free( l_cstr_index->marker);\n                opj_free( l_cstr_index);\n                return NULL;\n        }\n\n        if (!p_j2k->cstr_index->tile_index){\n                opj_free(l_cstr_index->tile_index);\n                l_cstr_index->tile_index = NULL;\n        }\n        else {\n                OPJ_UINT32 it_tile = 0;\n                for (it_tile = 0; it_tile < l_cstr_index->nb_of_tiles; it_tile++ ){\n\n                        /* Tile Marker*/\n                        l_cstr_index->tile_index[it_tile].marknum = p_j2k->cstr_index->tile_index[it_tile].marknum;\n\n                        l_cstr_index->tile_index[it_tile].marker =\n                                (opj_marker_info_t*)opj_malloc(l_cstr_index->tile_index[it_tile].marknum*sizeof(opj_marker_info_t));\n\n                        if (!l_cstr_index->tile_index[it_tile].marker) {\n                                OPJ_UINT32 it_tile_free;\n\n                                for (it_tile_free=0; it_tile_free < it_tile; it_tile_free++){\n                                        opj_free(l_cstr_index->tile_index[it_tile_free].marker);\n                                }\n\n                                opj_free( l_cstr_index->tile_index);\n                                opj_free( l_cstr_index->marker);\n                                opj_free( l_cstr_index);\n                                return NULL;\n                        }\n\n                        if (p_j2k->cstr_index->tile_index[it_tile].marker)\n                                memcpy( l_cstr_index->tile_index[it_tile].marker,\n                                                p_j2k->cstr_index->tile_index[it_tile].marker,\n                                                l_cstr_index->tile_index[it_tile].marknum * sizeof(opj_marker_info_t) );\n                        else{\n                                opj_free(l_cstr_index->tile_index[it_tile].marker);\n                                l_cstr_index->tile_index[it_tile].marker = NULL;\n                        }\n\n                        /* Tile part index*/\n                        l_cstr_index->tile_index[it_tile].nb_tps = p_j2k->cstr_index->tile_index[it_tile].nb_tps;\n\n                        l_cstr_index->tile_index[it_tile].tp_index =\n                                (opj_tp_index_t*)opj_malloc(l_cstr_index->tile_index[it_tile].nb_tps*sizeof(opj_tp_index_t));\n\n                        if(!l_cstr_index->tile_index[it_tile].tp_index){\n                                OPJ_UINT32 it_tile_free;\n\n                                for (it_tile_free=0; it_tile_free < it_tile; it_tile_free++){\n                                        opj_free(l_cstr_index->tile_index[it_tile_free].marker);\n                                        opj_free(l_cstr_index->tile_index[it_tile_free].tp_index);\n                                }\n\n                                opj_free( l_cstr_index->tile_index);\n                                opj_free( l_cstr_index->marker);\n                                opj_free( l_cstr_index);\n                                return NULL;\n                        }\n\n                        if (p_j2k->cstr_index->tile_index[it_tile].tp_index){\n                                memcpy( l_cstr_index->tile_index[it_tile].tp_index,\n                                                p_j2k->cstr_index->tile_index[it_tile].tp_index,\n                                                l_cstr_index->tile_index[it_tile].nb_tps * sizeof(opj_tp_index_t) );\n                        }\n                        else{\n                                opj_free(l_cstr_index->tile_index[it_tile].tp_index);\n                                l_cstr_index->tile_index[it_tile].tp_index = NULL;\n                        }\n\n                        /* Packet index (NOT USED)*/\n                        l_cstr_index->tile_index[it_tile].nb_packet = 0;\n                        l_cstr_index->tile_index[it_tile].packet_index = NULL;\n\n                }\n        }\n\n        return l_cstr_index;\n}\n\nOPJ_BOOL opj_j2k_allocate_tile_element_cstr_index(opj_j2k_t *p_j2k)\n{\n        OPJ_UINT32 it_tile=0;\n\n        p_j2k->cstr_index->nb_of_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th;\n        p_j2k->cstr_index->tile_index = (opj_tile_index_t*)opj_calloc(p_j2k->cstr_index->nb_of_tiles, sizeof(opj_tile_index_t));\n        if (!p_j2k->cstr_index->tile_index)\n                return OPJ_FALSE;\n\n        for (it_tile=0; it_tile < p_j2k->cstr_index->nb_of_tiles; it_tile++){\n                p_j2k->cstr_index->tile_index[it_tile].maxmarknum = 100;\n                p_j2k->cstr_index->tile_index[it_tile].marknum = 0;\n                p_j2k->cstr_index->tile_index[it_tile].marker = (opj_marker_info_t*)\n                                opj_calloc(p_j2k->cstr_index->tile_index[it_tile].maxmarknum, sizeof(opj_marker_info_t));\n                if (!p_j2k->cstr_index->tile_index[it_tile].marker)\n                        return OPJ_FALSE;\n        }\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_decode_tiles ( opj_j2k_t *p_j2k,\n                                                            opj_stream_private_t *p_stream,\n                                                            opj_event_mgr_t * p_manager)\n{\n        OPJ_BOOL l_go_on = OPJ_TRUE;\n        OPJ_UINT32 l_current_tile_no;\n        OPJ_UINT32 l_data_size,l_max_data_size;\n        OPJ_INT32 l_tile_x0,l_tile_y0,l_tile_x1,l_tile_y1;\n        OPJ_UINT32 l_nb_comps;\n        OPJ_BYTE * l_current_data;\n        OPJ_UINT32 nr_tiles = 0;\n\n        l_current_data = (OPJ_BYTE*)opj_malloc(1000);\n        if (! l_current_data) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to decode tiles\\n\");\n                return OPJ_FALSE;\n        }\n        l_max_data_size = 1000;\n\n        while (OPJ_TRUE) {\n                if (! opj_j2k_read_tile_header( p_j2k,\n                                        &l_current_tile_no,\n                                        &l_data_size,\n                                        &l_tile_x0, &l_tile_y0,\n                                        &l_tile_x1, &l_tile_y1,\n                                        &l_nb_comps,\n                                        &l_go_on,\n                                        p_stream,\n                                        p_manager)) {\n                        opj_free(l_current_data);\n                        return OPJ_FALSE;\n                }\n\n                if (! l_go_on) {\n                        break;\n                }\n\n                if (l_data_size > l_max_data_size) {\n                        OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(l_current_data, l_data_size);\n                        if (! l_new_current_data) {\n                                opj_free(l_current_data);\n                                opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to decode tile %d/%d\\n\", l_current_tile_no +1, p_j2k->m_cp.th * p_j2k->m_cp.tw);\n                                return OPJ_FALSE;\n                        }\n                        l_current_data = l_new_current_data;\n                        l_max_data_size = l_data_size;\n                }\n\n                if (! opj_j2k_decode_tile(p_j2k,l_current_tile_no,l_current_data,l_data_size,p_stream,p_manager)) {\n                        opj_free(l_current_data);\n                        opj_event_msg(p_manager, EVT_ERROR, \"Failed to decode tile %d/%d\\n\", l_current_tile_no +1, p_j2k->m_cp.th * p_j2k->m_cp.tw);\n                        return OPJ_FALSE;\n                }\n                opj_event_msg(p_manager, EVT_INFO, \"Tile %d/%d has been decoded.\\n\", l_current_tile_no +1, p_j2k->m_cp.th * p_j2k->m_cp.tw);\n\n                if (! opj_j2k_update_image_data(p_j2k->m_tcd,l_current_data, p_j2k->m_output_image)) {\n                        opj_free(l_current_data);\n                        return OPJ_FALSE;\n                }\n                opj_event_msg(p_manager, EVT_INFO, \"Image data has been updated with tile %d.\\n\\n\", l_current_tile_no + 1);\n                \n                if(opj_stream_get_number_byte_left(p_stream) == 0  \n                    && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC)\n                    break;\n                if(++nr_tiles ==  p_j2k->m_cp.th * p_j2k->m_cp.tw) \n                    break;\n        }\n\n        opj_free(l_current_data);\n\n        return OPJ_TRUE;\n}\n\n/**\n * Sets up the procedures to do on decoding data. Developpers wanting to extend the library can add their own reading procedures.\n */\nstatic void opj_j2k_setup_decoding (opj_j2k_t *p_j2k)\n{\n        /* preconditions*/\n        assert(p_j2k != 00);\n\n        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_decode_tiles);\n        /* DEVELOPER CORNER, add your custom procedures */\n\n}\n\n/*\n * Read and decode one tile.\n */\nstatic OPJ_BOOL opj_j2k_decode_one_tile (       opj_j2k_t *p_j2k,\n                                                                            opj_stream_private_t *p_stream,\n                                                                            opj_event_mgr_t * p_manager)\n{\n        OPJ_BOOL l_go_on = OPJ_TRUE;\n        OPJ_UINT32 l_current_tile_no;\n        OPJ_UINT32 l_tile_no_to_dec;\n        OPJ_UINT32 l_data_size,l_max_data_size;\n        OPJ_INT32 l_tile_x0,l_tile_y0,l_tile_x1,l_tile_y1;\n        OPJ_UINT32 l_nb_comps;\n        OPJ_BYTE * l_current_data;\n\n        l_current_data = (OPJ_BYTE*)opj_malloc(1000);\n        if (! l_current_data) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to decode one tile\\n\");\n                return OPJ_FALSE;\n        }\n        l_max_data_size = 1000;\n\n        /*Allocate and initialize some elements of codestrem index if not already done*/\n        if( !p_j2k->cstr_index->tile_index)\n        {\n                if (!opj_j2k_allocate_tile_element_cstr_index(p_j2k)){\n                        opj_free(l_current_data);\n                        return OPJ_FALSE;\n                }\n        }\n        /* Move into the codestream to the first SOT used to decode the desired tile */\n        l_tile_no_to_dec = (OPJ_UINT32)p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec;\n        if (p_j2k->cstr_index->tile_index)\n                if(p_j2k->cstr_index->tile_index->tp_index)\n                {\n                        if ( ! p_j2k->cstr_index->tile_index[l_tile_no_to_dec].nb_tps) {\n                                /* the index for this tile has not been built,\n                                 *  so move to the last SOT read */\n                                if ( !(opj_stream_read_seek(p_stream, p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos+2, p_manager)) ){\n                                        opj_event_msg(p_manager, EVT_ERROR, \"Problem with seek function\\n\");\n                        opj_free(l_current_data);\n                                        return OPJ_FALSE;\n                                }\n                        }\n                        else{\n                                if ( !(opj_stream_read_seek(p_stream, p_j2k->cstr_index->tile_index[l_tile_no_to_dec].tp_index[0].start_pos+2, p_manager)) ) {\n                                        opj_event_msg(p_manager, EVT_ERROR, \"Problem with seek function\\n\");\n                        opj_free(l_current_data);\n                                        return OPJ_FALSE;\n                                }\n                        }\n                        /* Special case if we have previously read the EOC marker (if the previous tile getted is the last ) */\n                        if(p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_EOC)\n                                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;\n                }\n\n        while (OPJ_TRUE) {\n                if (! opj_j2k_read_tile_header( p_j2k,\n                                        &l_current_tile_no,\n                                        &l_data_size,\n                                        &l_tile_x0, &l_tile_y0,\n                                        &l_tile_x1, &l_tile_y1,\n                                        &l_nb_comps,\n                                        &l_go_on,\n                                        p_stream,\n                                        p_manager)) {\n                        opj_free(l_current_data);\n                        return OPJ_FALSE;\n                }\n\n                if (! l_go_on) {\n                        break;\n                }\n\n                if (l_data_size > l_max_data_size) {\n                        OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(l_current_data, l_data_size);\n                        if (! l_new_current_data) {\n                                opj_free(l_current_data);\n                                l_current_data = NULL;\n                                /* TODO: LH: why tile numbering policy used in messages differs from\n                                   the one used in opj_j2k_decode_tiles() ? */\n                                opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to decode tile %d/%d\\n\", l_current_tile_no, (p_j2k->m_cp.th * p_j2k->m_cp.tw) - 1);\n                                return OPJ_FALSE;\n                        }\n                        l_current_data = l_new_current_data;\n                        l_max_data_size = l_data_size;\n                }\n\n                if (! opj_j2k_decode_tile(p_j2k,l_current_tile_no,l_current_data,l_data_size,p_stream,p_manager)) {\n                        opj_free(l_current_data);\n                        return OPJ_FALSE;\n                }\n                opj_event_msg(p_manager, EVT_INFO, \"Tile %d/%d has been decoded.\\n\", l_current_tile_no, (p_j2k->m_cp.th * p_j2k->m_cp.tw) - 1);\n\n                if (! opj_j2k_update_image_data(p_j2k->m_tcd,l_current_data, p_j2k->m_output_image)) {\n                        opj_free(l_current_data);\n                        return OPJ_FALSE;\n                }\n                opj_event_msg(p_manager, EVT_INFO, \"Image data has been updated with tile %d.\\n\\n\", l_current_tile_no);\n\n                if(l_current_tile_no == l_tile_no_to_dec)\n                {\n                        /* move into the codestream to the the first SOT (FIXME or not move?)*/\n                        if (!(opj_stream_read_seek(p_stream, p_j2k->cstr_index->main_head_end + 2, p_manager) ) ) {\n                                opj_event_msg(p_manager, EVT_ERROR, \"Problem with seek function\\n\");\n                                return OPJ_FALSE;\n                        }\n                        break;\n                }\n                else {\n                        opj_event_msg(p_manager, EVT_WARNING, \"Tile read, decode and updated is not the desired (%d vs %d).\\n\", l_current_tile_no, l_tile_no_to_dec);\n                }\n\n        }\n\n        opj_free(l_current_data);\n\n        return OPJ_TRUE;\n}\n\n/**\n * Sets up the procedures to do on decoding one tile. Developpers wanting to extend the library can add their own reading procedures.\n */\nstatic void opj_j2k_setup_decoding_tile (opj_j2k_t *p_j2k)\n{\n        /* preconditions*/\n        assert(p_j2k != 00);\n\n        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_decode_one_tile);\n        /* DEVELOPER CORNER, add your custom procedures */\n\n}\n\nOPJ_BOOL opj_j2k_decode(opj_j2k_t * p_j2k,\n                                                opj_stream_private_t * p_stream,\n                                                opj_image_t * p_image,\n                                                opj_event_mgr_t * p_manager)\n{\n        OPJ_UINT32 compno;\n\n        if (!p_image)\n                return OPJ_FALSE;\n\n        p_j2k->m_output_image = opj_image_create0();\n        if (! (p_j2k->m_output_image)) {\n                return OPJ_FALSE;\n        }\n        opj_copy_image_header(p_image, p_j2k->m_output_image);\n\n        /* customization of the decoding */\n        opj_j2k_setup_decoding(p_j2k);\n\n        /* Decode the codestream */\n        if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) {\n                opj_image_destroy(p_j2k->m_private_image);\n                p_j2k->m_private_image = NULL;\n                return OPJ_FALSE;\n        }\n\n        /* Move data and copy one information from codec to output image*/\n        for (compno = 0; compno < p_image->numcomps; compno++) {\n                p_image->comps[compno].resno_decoded = p_j2k->m_output_image->comps[compno].resno_decoded;\n                p_image->comps[compno].data = p_j2k->m_output_image->comps[compno].data;\n#if 0\n                char fn[256];\n                sprintf( fn, \"/tmp/%d.raw\", compno );\n                FILE *debug = fopen( fn, \"wb\" );\n                fwrite( p_image->comps[compno].data, sizeof(OPJ_INT32), p_image->comps[compno].w * p_image->comps[compno].h, debug );\n                fclose( debug );\n#endif\n                p_j2k->m_output_image->comps[compno].data = NULL;\n        }\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_get_tile(      opj_j2k_t *p_j2k,\n                                                    opj_stream_private_t *p_stream,\n                                                    opj_image_t* p_image,\n                                                    opj_event_mgr_t * p_manager,\n                                                    OPJ_UINT32 tile_index )\n{\n        OPJ_UINT32 compno;\n        OPJ_UINT32 l_tile_x, l_tile_y;\n        opj_image_comp_t* l_img_comp;\n\n        if (!p_image) {\n                opj_event_msg(p_manager, EVT_ERROR, \"We need an image previously created.\\n\");\n                return OPJ_FALSE;\n        }\n\n        if ( /*(tile_index < 0) &&*/ (tile_index >= p_j2k->m_cp.tw * p_j2k->m_cp.th) ){\n                opj_event_msg(p_manager, EVT_ERROR, \"Tile index provided by the user is incorrect %d (max = %d) \\n\", tile_index, (p_j2k->m_cp.tw * p_j2k->m_cp.th) - 1);\n                return OPJ_FALSE;\n        }\n\n        /* Compute the dimension of the desired tile*/\n        l_tile_x = tile_index % p_j2k->m_cp.tw;\n        l_tile_y = tile_index / p_j2k->m_cp.tw;\n\n        p_image->x0 = l_tile_x * p_j2k->m_cp.tdx + p_j2k->m_cp.tx0;\n        if (p_image->x0 < p_j2k->m_private_image->x0)\n                p_image->x0 = p_j2k->m_private_image->x0;\n        p_image->x1 = (l_tile_x + 1) * p_j2k->m_cp.tdx + p_j2k->m_cp.tx0;\n        if (p_image->x1 > p_j2k->m_private_image->x1)\n                p_image->x1 = p_j2k->m_private_image->x1;\n\n        p_image->y0 = l_tile_y * p_j2k->m_cp.tdy + p_j2k->m_cp.ty0;\n        if (p_image->y0 < p_j2k->m_private_image->y0)\n                p_image->y0 = p_j2k->m_private_image->y0;\n        p_image->y1 = (l_tile_y + 1) * p_j2k->m_cp.tdy + p_j2k->m_cp.ty0;\n        if (p_image->y1 > p_j2k->m_private_image->y1)\n                p_image->y1 = p_j2k->m_private_image->y1;\n\n        l_img_comp = p_image->comps;\n        for (compno=0; compno < p_image->numcomps; ++compno)\n        {\n                OPJ_INT32 l_comp_x1, l_comp_y1;\n\n                l_img_comp->factor = p_j2k->m_private_image->comps[compno].factor;\n\n                l_img_comp->x0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->x0, (OPJ_INT32)l_img_comp->dx);\n                l_img_comp->y0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->y0, (OPJ_INT32)l_img_comp->dy);\n                l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx);\n                l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy);\n\n                l_img_comp->w = (OPJ_UINT32)(opj_int_ceildivpow2(l_comp_x1, (OPJ_INT32)l_img_comp->factor) - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->x0, (OPJ_INT32)l_img_comp->factor));\n                l_img_comp->h = (OPJ_UINT32)(opj_int_ceildivpow2(l_comp_y1, (OPJ_INT32)l_img_comp->factor) - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->y0, (OPJ_INT32)l_img_comp->factor));\n\n                l_img_comp++;\n        }\n\n        /* Destroy the previous output image*/\n        if (p_j2k->m_output_image)\n                opj_image_destroy(p_j2k->m_output_image);\n\n        /* Create the ouput image from the information previously computed*/\n        p_j2k->m_output_image = opj_image_create0();\n        if (! (p_j2k->m_output_image)) {\n                return OPJ_FALSE;\n        }\n        opj_copy_image_header(p_image, p_j2k->m_output_image);\n\n        p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec = (OPJ_INT32)tile_index;\n\n        /* customization of the decoding */\n        opj_j2k_setup_decoding_tile(p_j2k);\n\n        /* Decode the codestream */\n        if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) {\n                opj_image_destroy(p_j2k->m_private_image);\n                p_j2k->m_private_image = NULL;\n                return OPJ_FALSE;\n        }\n\n        /* Move data and copy one information from codec to output image*/\n        for (compno = 0; compno < p_image->numcomps; compno++) {\n                p_image->comps[compno].resno_decoded = p_j2k->m_output_image->comps[compno].resno_decoded;\n\n                if (p_image->comps[compno].data)\n                        opj_free(p_image->comps[compno].data);\n\n                p_image->comps[compno].data = p_j2k->m_output_image->comps[compno].data;\n\n                p_j2k->m_output_image->comps[compno].data = NULL;\n        }\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_set_decoded_resolution_factor(opj_j2k_t *p_j2k,\n                                               OPJ_UINT32 res_factor,\n                                               opj_event_mgr_t * p_manager)\n{\n        OPJ_UINT32 it_comp;\n\n        p_j2k->m_cp.m_specific_param.m_dec.m_reduce = res_factor;\n\n        if (p_j2k->m_private_image) {\n                if (p_j2k->m_private_image->comps) {\n                        if (p_j2k->m_specific_param.m_decoder.m_default_tcp) {\n                                if (p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps) {\n                                        for (it_comp = 0 ; it_comp < p_j2k->m_private_image->numcomps; it_comp++) {\n                                                OPJ_UINT32 max_res = p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[it_comp].numresolutions;\n                                                if ( res_factor >= max_res){\n                                                        opj_event_msg(p_manager, EVT_ERROR, \"Resolution factor is greater than the maximum resolution in the component.\\n\");\n                                                        return OPJ_FALSE;\n                                                }\n                                                p_j2k->m_private_image->comps[it_comp].factor = res_factor;\n                                        }\n                                        return OPJ_TRUE;\n                                }\n                        }\n                }\n        }\n\n        return OPJ_FALSE;\n}\n\nOPJ_BOOL opj_j2k_encode(opj_j2k_t * p_j2k,\n                        opj_stream_private_t *p_stream,\n                        opj_event_mgr_t * p_manager )\n{\n        OPJ_UINT32 i;\n        OPJ_UINT32 l_nb_tiles;\n        OPJ_UINT32 l_max_tile_size, l_current_tile_size;\n        OPJ_BYTE * l_current_data;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_stream != 00);\n        assert(p_manager != 00);\n\n        l_current_data = (OPJ_BYTE*)opj_malloc(1000);\n        if (! l_current_data) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to encode all tiles\\n\");\n                return OPJ_FALSE;\n        }\n        l_max_tile_size = 1000;\n\n        l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;\n        for (i=0;i<l_nb_tiles;++i) {\n                if (! opj_j2k_pre_write_tile(p_j2k,i,p_stream,p_manager)) {\n                        opj_free(l_current_data);\n                        return OPJ_FALSE;\n                }\n\n                l_current_tile_size = opj_tcd_get_encoded_tile_size(p_j2k->m_tcd);\n                if (l_current_tile_size > l_max_tile_size) {\n                        OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(l_current_data, l_current_tile_size);\n                        if (! l_new_current_data) {\n                                opj_free(l_current_data);\n                                opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to encode all tiles\\n\");\n                                return OPJ_FALSE;\n                        }\n                        l_current_data = l_new_current_data;\n                        l_max_tile_size = l_current_tile_size;\n                }\n\n                opj_j2k_get_tile_data(p_j2k->m_tcd,l_current_data);\n\n                if (! opj_j2k_post_write_tile (p_j2k,l_current_data,l_current_tile_size,p_stream,p_manager)) {\n                        return OPJ_FALSE;\n                }\n        }\n\n        opj_free(l_current_data);\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_end_compress(  opj_j2k_t *p_j2k,\n                                                        opj_stream_private_t *p_stream,\n                                                        opj_event_mgr_t * p_manager)\n{\n        /* customization of the encoding */\n        opj_j2k_setup_end_compress(p_j2k);\n\n        if (! opj_j2k_exec (p_j2k, p_j2k->m_procedure_list, p_stream, p_manager))\n        {\n                return OPJ_FALSE;\n        }\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_start_compress(opj_j2k_t *p_j2k,\n                                                            opj_stream_private_t *p_stream,\n                                                            opj_image_t * p_image,\n                                                            opj_event_mgr_t * p_manager)\n{\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_stream != 00);\n        assert(p_manager != 00);\n\n        p_j2k->m_private_image = opj_image_create0();\n        opj_copy_image_header(p_image, p_j2k->m_private_image);\n\n        /* TODO_MSD: Find a better way */\n        if (p_image->comps) {\n                OPJ_UINT32 it_comp;\n                for (it_comp = 0 ; it_comp < p_image->numcomps; it_comp++) {\n                        if (p_image->comps[it_comp].data) {\n                                p_j2k->m_private_image->comps[it_comp].data =p_image->comps[it_comp].data;\n                                p_image->comps[it_comp].data = NULL;\n\n                        }\n                }\n        }\n\n        /* customization of the validation */\n        opj_j2k_setup_encoding_validation (p_j2k);\n\n        /* validation of the parameters codec */\n        if (! opj_j2k_exec(p_j2k,p_j2k->m_validation_list,p_stream,p_manager)) {\n                return OPJ_FALSE;\n        }\n\n        /* customization of the encoding */\n        opj_j2k_setup_header_writing(p_j2k);\n\n        /* write header */\n        if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) {\n                return OPJ_FALSE;\n        }\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_pre_write_tile (       opj_j2k_t * p_j2k,\n                                                                OPJ_UINT32 p_tile_index,\n                                                                opj_stream_private_t *p_stream,\n                                                                opj_event_mgr_t * p_manager )\n{\n  (void)p_stream;\n        if (p_tile_index != p_j2k->m_current_tile_number) {\n                opj_event_msg(p_manager, EVT_ERROR, \"The given tile index does not match.\" );\n                return OPJ_FALSE;\n        }\n\n        opj_event_msg(p_manager, EVT_INFO, \"tile number %d / %d\\n\", p_j2k->m_current_tile_number + 1, p_j2k->m_cp.tw * p_j2k->m_cp.th);\n\n        p_j2k->m_specific_param.m_encoder.m_current_tile_part_number = 0;\n        p_j2k->m_tcd->cur_totnum_tp = p_j2k->m_cp.tcps[p_tile_index].m_nb_tile_parts;\n        p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0;\n\n        /* initialisation before tile encoding  */\n        if (! opj_tcd_init_encode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number)) {\n                return OPJ_FALSE;\n        }\n\n        return OPJ_TRUE;\n}\n\nvoid opj_j2k_get_tile_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data)\n{\n        OPJ_UINT32 i,j,k = 0;\n        OPJ_UINT32 l_width,l_height,l_stride, l_offset_x,l_offset_y, l_image_width;\n        opj_image_comp_t * l_img_comp = 00;\n        opj_tcd_tilecomp_t * l_tilec = 00;\n        opj_image_t * l_image = 00;\n        OPJ_UINT32 l_size_comp, l_remaining;\n        OPJ_INT32 * l_src_ptr;\n        l_tilec = p_tcd->tcd_image->tiles->comps;\n        l_image = p_tcd->image;\n        l_img_comp = l_image->comps;\n\n        for (i=0;i<p_tcd->image->numcomps;++i) {\n                l_size_comp = l_img_comp->prec >> 3; /* (/8) */\n                l_remaining = l_img_comp->prec & 7;  /* (%8) */\n                if (l_remaining) {\n                        ++l_size_comp;\n                }\n\n                if (l_size_comp == 3) {\n                        l_size_comp = 4;\n                }\n\n                l_width  = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0);\n                l_height = (OPJ_UINT32)(l_tilec->y1 - l_tilec->y0);\n                l_offset_x = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)l_image->x0, (OPJ_INT32)l_img_comp->dx);\n                l_offset_y = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)l_image->y0, (OPJ_INT32)l_img_comp->dy);\n                l_image_width = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)l_image->x1 - (OPJ_INT32)l_image->x0, (OPJ_INT32)l_img_comp->dx);\n                l_stride = l_image_width - l_width;\n                l_src_ptr = l_img_comp->data + ((OPJ_UINT32)l_tilec->x0 - l_offset_x) + ((OPJ_UINT32)l_tilec->y0 - l_offset_y) * l_image_width;\n\n                switch (l_size_comp) {\n                        case 1:\n                                {\n                                        OPJ_CHAR * l_dest_ptr = (OPJ_CHAR*) p_data;\n                                        if (l_img_comp->sgnd) {\n                                                for     (j=0;j<l_height;++j) {\n                                                        for (k=0;k<l_width;++k) {\n                                                                *(l_dest_ptr) = (OPJ_CHAR) (*l_src_ptr);\n                                                                ++l_dest_ptr;\n                                                                ++l_src_ptr;\n                                                        }\n                                                        l_src_ptr += l_stride;\n                                                }\n                                        }\n                                        else {\n                                                for (j=0;j<l_height;++j) {\n                                                        for (k=0;k<l_width;++k) {\n                                                                *(l_dest_ptr) = (OPJ_CHAR)((*l_src_ptr)&0xff);\n                                                                ++l_dest_ptr;\n                                                                ++l_src_ptr;\n                                                        }\n                                                        l_src_ptr += l_stride;\n                                                }\n                                        }\n\n                                        p_data = (OPJ_BYTE*) l_dest_ptr;\n                                }\n                                break;\n                        case 2:\n                                {\n                                        OPJ_INT16 * l_dest_ptr = (OPJ_INT16 *) p_data;\n                                        if (l_img_comp->sgnd) {\n                                                for (j=0;j<l_height;++j) {\n                                                        for (k=0;k<l_width;++k) {\n                                                                *(l_dest_ptr++) = (OPJ_INT16) (*(l_src_ptr++));\n                                                        }\n                                                        l_src_ptr += l_stride;\n                                                }\n                                        }\n                                        else {\n                                                for (j=0;j<l_height;++j) {\n                                                        for (k=0;k<l_width;++k) {\n                                                                *(l_dest_ptr++) = (OPJ_INT16)((*(l_src_ptr++)) & 0xffff);\n                                                        }\n                                                        l_src_ptr += l_stride;\n                                                }\n                                        }\n\n                                        p_data = (OPJ_BYTE*) l_dest_ptr;\n                                }\n                                break;\n                        case 4:\n                                {\n                                        OPJ_INT32 * l_dest_ptr = (OPJ_INT32 *) p_data;\n                                        for (j=0;j<l_height;++j) {\n                                                for (k=0;k<l_width;++k) {\n                                                        *(l_dest_ptr++) = *(l_src_ptr++);\n                                                }\n                                                l_src_ptr += l_stride;\n                                        }\n\n                                        p_data = (OPJ_BYTE*) l_dest_ptr;\n                                }\n                                break;\n                }\n\n                ++l_img_comp;\n                ++l_tilec;\n        }\n}\n\nOPJ_BOOL opj_j2k_post_write_tile (      opj_j2k_t * p_j2k,\n                                                                OPJ_BYTE * p_data,\n                                                                OPJ_UINT32 p_data_size,\n                                                                opj_stream_private_t *p_stream,\n                                                                opj_event_mgr_t * p_manager )\n{\n        opj_tcd_t * l_tcd = 00;\n        OPJ_UINT32 l_nb_bytes_written;\n        OPJ_BYTE * l_current_data = 00;\n        OPJ_UINT32 l_tile_size = 0;\n        OPJ_UINT32 l_available_data;\n\n        /* preconditions */\n        assert(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);\n\n        l_tcd = p_j2k->m_tcd;\n        \n        l_tile_size = p_j2k->m_specific_param.m_encoder.m_encoded_tile_size;\n        l_available_data = l_tile_size;\n        l_current_data = p_j2k->m_specific_param.m_encoder.m_encoded_tile_data;\n\n        if (! opj_tcd_copy_tile_data(l_tcd,p_data,p_data_size)) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Size mismatch between tile data and sent data.\" );\n                return OPJ_FALSE;\n        }\n\n        l_nb_bytes_written = 0;\n        if (! opj_j2k_write_first_tile_part(p_j2k,l_current_data,&l_nb_bytes_written,l_available_data,p_stream,p_manager)) {\n                return OPJ_FALSE;\n        }\n        l_current_data += l_nb_bytes_written;\n        l_available_data -= l_nb_bytes_written;\n\n        l_nb_bytes_written = 0;\n        if (! opj_j2k_write_all_tile_parts(p_j2k,l_current_data,&l_nb_bytes_written,l_available_data,p_stream,p_manager)) {\n                return OPJ_FALSE;\n        }\n\n        l_available_data -= l_nb_bytes_written;\n        l_nb_bytes_written = l_tile_size - l_available_data;\n\n        if ( opj_stream_write_data(     p_stream,\n                                                                p_j2k->m_specific_param.m_encoder.m_encoded_tile_data,\n                                                                l_nb_bytes_written,p_manager) != l_nb_bytes_written) {\n                return OPJ_FALSE;\n        }\n\n        ++p_j2k->m_current_tile_number;\n\n        return OPJ_TRUE;\n}\n\nvoid opj_j2k_setup_end_compress (opj_j2k_t *p_j2k)\n{\n        /* preconditions */\n        assert(p_j2k != 00);\n\n        /* DEVELOPER CORNER, insert your custom procedures */\n        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_eoc );\n\n        if (p_j2k->m_cp.m_specific_param.m_enc.m_cinema) {\n                opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_updated_tlm);\n        }\n\n        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_epc );\n        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_end_encoding );\n        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_destroy_header_memory);\n}\n\nvoid opj_j2k_setup_encoding_validation (opj_j2k_t *p_j2k)\n{\n        /* preconditions */\n        assert(p_j2k != 00);\n\n        opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_build_encoder);\n        opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_encoding_validation);\n\n        /* DEVELOPER CORNER, add your custom validation procedure */\n        opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_mct_validation);\n}\n\nvoid opj_j2k_setup_header_writing (opj_j2k_t *p_j2k)\n{\n        /* preconditions */\n        assert(p_j2k != 00);\n\n        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_init_info );\n        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_soc );\n        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_siz );\n        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_cod );\n        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_qcd );\n\n        if (p_j2k->m_cp.m_specific_param.m_enc.m_cinema) {\n                /* No need for COC or QCC, QCD and COD are used\n                opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_all_coc );\n                opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_all_qcc );\n                */\n                opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_tlm );\n\n                if (p_j2k->m_cp.m_specific_param.m_enc.m_cinema == OPJ_CINEMA4K_24) {\n                        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_poc );\n                }\n        }\n\n        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_regions);\n\n        if (p_j2k->m_cp.comment != 00)  {\n                opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_com);\n        }\n\n        /* DEVELOPER CORNER, insert your custom procedures */\n        if (p_j2k->m_cp.rsiz & OPJ_MCT) {\n                opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_mct_data_group );\n        }\n        /* End of Developer Corner */\n\n        if (p_j2k->cstr_index) {\n                opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_get_end_header );\n        }\n\n        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_create_tcd);\n        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_update_rates);\n}\n\nOPJ_BOOL opj_j2k_write_first_tile_part (opj_j2k_t *p_j2k,\n                                                                        OPJ_BYTE * p_data,\n                                                                        OPJ_UINT32 * p_data_written,\n                                                                        OPJ_UINT32 p_total_data_size,\n                                                                        opj_stream_private_t *p_stream,\n                                                                        struct opj_event_mgr * p_manager )\n{\n        OPJ_UINT32 l_nb_bytes_written = 0;\n        OPJ_UINT32 l_current_nb_bytes_written;\n        OPJ_BYTE * l_begin_data = 00;\n\n        opj_tcd_t * l_tcd = 00;\n        opj_cp_t * l_cp = 00;\n\n        l_tcd = p_j2k->m_tcd;\n        l_cp = &(p_j2k->m_cp);\n\n        l_tcd->cur_pino = 0;\n\n        /*Get number of tile parts*/\n        p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0;\n\n        /* INDEX >> */\n        /* << INDEX */\n\n        l_current_nb_bytes_written = 0;\n        l_begin_data = p_data;\n        if (! opj_j2k_write_sot(p_j2k,p_data,&l_current_nb_bytes_written,p_stream,p_manager))\n        {\n                return OPJ_FALSE;\n        }\n\n        l_nb_bytes_written += l_current_nb_bytes_written;\n        p_data += l_current_nb_bytes_written;\n        p_total_data_size -= l_current_nb_bytes_written;\n\n        if (l_cp->m_specific_param.m_enc.m_cinema == 0) {\n#if 0\n                for (compno = 1; compno < p_j2k->m_private_image->numcomps; compno++) {\n                        l_current_nb_bytes_written = 0;\n                        opj_j2k_write_coc_in_memory(p_j2k,compno,p_data,&l_current_nb_bytes_written,p_manager);\n                        l_nb_bytes_written += l_current_nb_bytes_written;\n                        p_data += l_current_nb_bytes_written;\n                        p_total_data_size -= l_current_nb_bytes_written;\n\n                        l_current_nb_bytes_written = 0;\n                        opj_j2k_write_qcc_in_memory(p_j2k,compno,p_data,&l_current_nb_bytes_written,p_manager);\n                        l_nb_bytes_written += l_current_nb_bytes_written;\n                        p_data += l_current_nb_bytes_written;\n                        p_total_data_size -= l_current_nb_bytes_written;\n                }\n#endif\n\n                if (l_cp->tcps[p_j2k->m_current_tile_number].numpocs) {\n                        l_current_nb_bytes_written = 0;\n                        opj_j2k_write_poc_in_memory(p_j2k,p_data,&l_current_nb_bytes_written,p_manager);\n                        l_nb_bytes_written += l_current_nb_bytes_written;\n                        p_data += l_current_nb_bytes_written;\n                        p_total_data_size -= l_current_nb_bytes_written;\n                }\n        }\n\n        l_current_nb_bytes_written = 0;\n        if (! opj_j2k_write_sod(p_j2k,l_tcd,p_data,&l_current_nb_bytes_written,p_total_data_size,p_stream,p_manager)) {\n                return OPJ_FALSE;\n        }\n\n        l_nb_bytes_written += l_current_nb_bytes_written;\n        * p_data_written = l_nb_bytes_written;\n\n        /* Writing Psot in SOT marker */\n        opj_write_bytes(l_begin_data + 6,l_nb_bytes_written,4);                                 /* PSOT */\n\n        if (l_cp->m_specific_param.m_enc.m_cinema){\n                opj_j2k_update_tlm(p_j2k,l_nb_bytes_written);\n        }\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_write_all_tile_parts(  opj_j2k_t *p_j2k,\n                                                                        OPJ_BYTE * p_data,\n                                                                        OPJ_UINT32 * p_data_written,\n                                                                        OPJ_UINT32 p_total_data_size,\n                                                                        opj_stream_private_t *p_stream,\n                                                                        struct opj_event_mgr * p_manager\n                                                                )\n{\n        OPJ_UINT32 tilepartno=0;\n        OPJ_UINT32 l_nb_bytes_written = 0;\n        OPJ_UINT32 l_current_nb_bytes_written;\n        OPJ_UINT32 l_part_tile_size;\n        OPJ_UINT32 tot_num_tp;\n        OPJ_UINT32 pino;\n\n        OPJ_BYTE * l_begin_data;\n        opj_tcp_t *l_tcp = 00;\n        opj_tcd_t * l_tcd = 00;\n        opj_cp_t * l_cp = 00;\n\n        l_tcd = p_j2k->m_tcd;\n        l_cp = &(p_j2k->m_cp);\n        l_tcp = l_cp->tcps + p_j2k->m_current_tile_number;\n\n        /*Get number of tile parts*/\n        tot_num_tp = opj_j2k_get_num_tp(l_cp,0,p_j2k->m_current_tile_number);\n\n        /* start writing remaining tile parts */\n        ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;\n        for (tilepartno = 1; tilepartno < tot_num_tp ; ++tilepartno) {\n                p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = tilepartno;\n                l_current_nb_bytes_written = 0;\n                l_part_tile_size = 0;\n                l_begin_data = p_data;\n\n                if (! opj_j2k_write_sot(p_j2k,p_data,&l_current_nb_bytes_written,p_stream,p_manager)) {\n                        return OPJ_FALSE;\n                }\n\n                l_nb_bytes_written += l_current_nb_bytes_written;\n                p_data += l_current_nb_bytes_written;\n                p_total_data_size -= l_current_nb_bytes_written;\n                l_part_tile_size += l_current_nb_bytes_written;\n\n                l_current_nb_bytes_written = 0;\n                if (! opj_j2k_write_sod(p_j2k,l_tcd,p_data,&l_current_nb_bytes_written,p_total_data_size,p_stream,p_manager)) {\n                        return OPJ_FALSE;\n                }\n\n                p_data += l_current_nb_bytes_written;\n                l_nb_bytes_written += l_current_nb_bytes_written;\n                p_total_data_size -= l_current_nb_bytes_written;\n                l_part_tile_size += l_current_nb_bytes_written;\n\n                /* Writing Psot in SOT marker */\n                opj_write_bytes(l_begin_data + 6,l_part_tile_size,4);                                   /* PSOT */\n\n                if (l_cp->m_specific_param.m_enc.m_cinema) {\n                        opj_j2k_update_tlm(p_j2k,l_part_tile_size);\n                }\n\n                ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;\n        }\n\n        for (pino = 1; pino <= l_tcp->numpocs; ++pino) {\n                l_tcd->cur_pino = pino;\n\n                /*Get number of tile parts*/\n                tot_num_tp = opj_j2k_get_num_tp(l_cp,pino,p_j2k->m_current_tile_number);\n                for (tilepartno = 0; tilepartno < tot_num_tp ; ++tilepartno) {\n                        p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = tilepartno;\n                        l_current_nb_bytes_written = 0;\n                        l_part_tile_size = 0;\n                        l_begin_data = p_data;\n\n                        if (! opj_j2k_write_sot(p_j2k,p_data,&l_current_nb_bytes_written,p_stream,p_manager)) {\n                                return OPJ_FALSE;\n                        }\n\n                        l_nb_bytes_written += l_current_nb_bytes_written;\n                        p_data += l_current_nb_bytes_written;\n                        p_total_data_size -= l_current_nb_bytes_written;\n                        l_part_tile_size += l_current_nb_bytes_written;\n\n                        l_current_nb_bytes_written = 0;\n\n                        if (! opj_j2k_write_sod(p_j2k,l_tcd,p_data,&l_current_nb_bytes_written,p_total_data_size,p_stream,p_manager)) {\n                                return OPJ_FALSE;\n                        }\n\n                        l_nb_bytes_written += l_current_nb_bytes_written;\n                        p_data += l_current_nb_bytes_written;\n                        p_total_data_size -= l_current_nb_bytes_written;\n                        l_part_tile_size += l_current_nb_bytes_written;\n\n                        /* Writing Psot in SOT marker */\n                        opj_write_bytes(l_begin_data + 6,l_part_tile_size,4);                                   /* PSOT */\n\n                        if (l_cp->m_specific_param.m_enc.m_cinema) {\n                                opj_j2k_update_tlm(p_j2k,l_part_tile_size);\n                        }\n\n                        ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;\n                }\n        }\n\n        *p_data_written = l_nb_bytes_written;\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_write_updated_tlm( opj_j2k_t *p_j2k,\n                                                                    struct opj_stream_private *p_stream,\n                                                                    struct opj_event_mgr * p_manager )\n{\n        OPJ_UINT32 l_tlm_size;\n        OPJ_OFF_T l_tlm_position, l_current_position;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        l_tlm_size = 5 * p_j2k->m_specific_param.m_encoder.m_total_tile_parts;\n        l_tlm_position = 6 + p_j2k->m_specific_param.m_encoder.m_tlm_start;\n        l_current_position = opj_stream_tell(p_stream);\n\n        if (! opj_stream_seek(p_stream,l_tlm_position,p_manager)) {\n                return OPJ_FALSE;\n        }\n\n        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer,l_tlm_size,p_manager) != l_tlm_size) {\n                return OPJ_FALSE;\n        }\n\n        if (! opj_stream_seek(p_stream,l_current_position,p_manager)) {\n                return OPJ_FALSE;\n        }\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_end_encoding(  opj_j2k_t *p_j2k,\n                                                        struct opj_stream_private *p_stream,\n                                                        struct opj_event_mgr * p_manager )\n{\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        opj_tcd_destroy(p_j2k->m_tcd);\n        p_j2k->m_tcd = 00;\n\n        if (p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {\n                opj_free(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer);\n                p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = 0;\n                p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = 0;\n        }\n\n        if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data) {\n                opj_free(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);\n                p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 0;\n        }\n\n        p_j2k->m_specific_param.m_encoder.m_encoded_tile_size = 0;\n\n        return OPJ_TRUE;\n}\n\n/**\n * Destroys the memory associated with the decoding of headers.\n */\nstatic OPJ_BOOL opj_j2k_destroy_header_memory ( opj_j2k_t * p_j2k,\n                                                opj_stream_private_t *p_stream,\n                                                opj_event_mgr_t * p_manager\n                                                )\n{\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_stream != 00);\n        assert(p_manager != 00);\n\n        if (p_j2k->m_specific_param.m_encoder.m_header_tile_data) {\n                opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);\n                p_j2k->m_specific_param.m_encoder.m_header_tile_data = 0;\n        }\n\n        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_init_info(     opj_j2k_t *p_j2k,\n                                                struct opj_stream_private *p_stream,\n                                                struct opj_event_mgr * p_manager )\n{\n        opj_codestream_info_t * l_cstr_info = 00;\n\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n  (void)l_cstr_info;\n\n        /* TODO mergeV2: check this part which use cstr_info */\n        /*l_cstr_info = p_j2k->cstr_info;\n\n        if (l_cstr_info)  {\n                OPJ_UINT32 compno;\n                l_cstr_info->tile = (opj_tile_info_t *) opj_malloc(p_j2k->m_cp.tw * p_j2k->m_cp.th * sizeof(opj_tile_info_t));\n\n                l_cstr_info->image_w = p_j2k->m_image->x1 - p_j2k->m_image->x0;\n                l_cstr_info->image_h = p_j2k->m_image->y1 - p_j2k->m_image->y0;\n\n                l_cstr_info->prog = (&p_j2k->m_cp.tcps[0])->prg;\n\n                l_cstr_info->tw = p_j2k->m_cp.tw;\n                l_cstr_info->th = p_j2k->m_cp.th;\n\n                l_cstr_info->tile_x = p_j2k->m_cp.tdx;*/        /* new version parser */\n                /*l_cstr_info->tile_y = p_j2k->m_cp.tdy;*/      /* new version parser */\n                /*l_cstr_info->tile_Ox = p_j2k->m_cp.tx0;*/     /* new version parser */\n                /*l_cstr_info->tile_Oy = p_j2k->m_cp.ty0;*/     /* new version parser */\n\n                /*l_cstr_info->numcomps = p_j2k->m_image->numcomps;\n\n                l_cstr_info->numlayers = (&p_j2k->m_cp.tcps[0])->numlayers;\n\n                l_cstr_info->numdecompos = (OPJ_INT32*) opj_malloc(p_j2k->m_image->numcomps * sizeof(OPJ_INT32));\n\n                for (compno=0; compno < p_j2k->m_image->numcomps; compno++) {\n                        l_cstr_info->numdecompos[compno] = (&p_j2k->m_cp.tcps[0])->tccps->numresolutions - 1;\n                }\n\n                l_cstr_info->D_max = 0.0;       */      /* ADD Marcela */\n\n                /*l_cstr_info->main_head_start = opj_stream_tell(p_stream);*/ /* position of SOC */\n\n                /*l_cstr_info->maxmarknum = 100;\n                l_cstr_info->marker = (opj_marker_info_t *) opj_malloc(l_cstr_info->maxmarknum * sizeof(opj_marker_info_t));\n                l_cstr_info->marknum = 0;\n        }*/\n\n        return opj_j2k_calculate_tp(p_j2k,&(p_j2k->m_cp),&p_j2k->m_specific_param.m_encoder.m_total_tile_parts,p_j2k->m_private_image,p_manager);\n}\n\n/**\n * Creates a tile-coder decoder.\n *\n * @param       p_stream                the stream to write data to.\n * @param       p_j2k                   J2K codec.\n * @param       p_manager               the user event manager.\n*/\nstatic OPJ_BOOL opj_j2k_create_tcd(     opj_j2k_t *p_j2k,\n                                                                    opj_stream_private_t *p_stream,\n                                                                    opj_event_mgr_t * p_manager\n                                    )\n{\n        /* preconditions */\n        assert(p_j2k != 00);\n        assert(p_manager != 00);\n        assert(p_stream != 00);\n\n        p_j2k->m_tcd = opj_tcd_create(OPJ_FALSE);\n\n        if (! p_j2k->m_tcd) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to create Tile Coder\\n\");\n                return OPJ_FALSE;\n        }\n\n        if (!opj_tcd_init(p_j2k->m_tcd,p_j2k->m_private_image,&p_j2k->m_cp)) {\n                opj_tcd_destroy(p_j2k->m_tcd);\n                p_j2k->m_tcd = 00;\n                return OPJ_FALSE;\n        }\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_j2k_write_tile (opj_j2k_t * p_j2k,\n                                                 OPJ_UINT32 p_tile_index,\n                                                 OPJ_BYTE * p_data,\n                                                 OPJ_UINT32 p_data_size,\n                                                 opj_stream_private_t *p_stream,\n                                                 opj_event_mgr_t * p_manager )\n{\n        if (! opj_j2k_pre_write_tile(p_j2k,p_tile_index,p_stream,p_manager)) {\n                opj_event_msg(p_manager, EVT_ERROR, \"Error while opj_j2k_pre_write_tile with tile index = %d\\n\", p_tile_index);\n                return OPJ_FALSE;\n        }\n        else {\n                if (! opj_j2k_post_write_tile(p_j2k,p_data,p_data_size,p_stream,p_manager)) {\n                        opj_event_msg(p_manager, EVT_ERROR, \"Error while opj_j2k_post_write_tile with tile index = %d\\n\", p_tile_index);\n                        return OPJ_FALSE;\n                }\n        }\n\n        return OPJ_TRUE;\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/j2k.h",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2001-2003, David Janssens\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * Copyright (c) 2006-2007, Parvatha Elangovan\n * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>\n * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France \n * Copyright (c) 2012, CS Systemes d'Information, France\n *\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef __J2K_H\n#define __J2K_H\n/**\n@file j2k.h\n@brief The JPEG-2000 Codestream Reader/Writer (J2K)\n\nThe functions in J2K.C have for goal to read/write the several parts of the codestream: markers and data.\n*/\n\n/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */\n/*@{*/\n\n#define J2K_CP_CSTY_PRT 0x01\n#define J2K_CP_CSTY_SOP 0x02\n#define J2K_CP_CSTY_EPH 0x04\n#define J2K_CCP_CSTY_PRT 0x01\n#define J2K_CCP_CBLKSTY_LAZY 0x01     /**< Selective arithmetic coding bypass */\n#define J2K_CCP_CBLKSTY_RESET 0x02    /**< Reset context probabilities on coding pass boundaries */\n#define J2K_CCP_CBLKSTY_TERMALL 0x04  /**< Termination on each coding pass */\n#define J2K_CCP_CBLKSTY_VSC 0x08      /**< Vertically stripe causal context */\n#define J2K_CCP_CBLKSTY_PTERM 0x10    /**< Predictable termination */\n#define J2K_CCP_CBLKSTY_SEGSYM 0x20   /**< Segmentation symbols are used */\n#define J2K_CCP_QNTSTY_NOQNT 0\n#define J2K_CCP_QNTSTY_SIQNT 1\n#define J2K_CCP_QNTSTY_SEQNT 2\n\n#define OPJ_J2K_DEFAULT_CBLK_DATA_SIZE 8192\n\n/* ----------------------------------------------------------------------- */\n\n#define J2K_MS_SOC 0xff4f\t/**< SOC marker value */\n#define J2K_MS_SOT 0xff90\t/**< SOT marker value */\n#define J2K_MS_SOD 0xff93\t/**< SOD marker value */\n#define J2K_MS_EOC 0xffd9\t/**< EOC marker value */\n#define J2K_MS_SIZ 0xff51\t/**< SIZ marker value */\n#define J2K_MS_COD 0xff52\t/**< COD marker value */\n#define J2K_MS_COC 0xff53\t/**< COC marker value */\n#define J2K_MS_RGN 0xff5e\t/**< RGN marker value */\n#define J2K_MS_QCD 0xff5c\t/**< QCD marker value */\n#define J2K_MS_QCC 0xff5d\t/**< QCC marker value */\n#define J2K_MS_POC 0xff5f\t/**< POC marker value */\n#define J2K_MS_TLM 0xff55\t/**< TLM marker value */\n#define J2K_MS_PLM 0xff57\t/**< PLM marker value */\n#define J2K_MS_PLT 0xff58\t/**< PLT marker value */\n#define J2K_MS_PPM 0xff60\t/**< PPM marker value */\n#define J2K_MS_PPT 0xff61\t/**< PPT marker value */\n#define J2K_MS_SOP 0xff91\t/**< SOP marker value */\n#define J2K_MS_EPH 0xff92\t/**< EPH marker value */\n#define J2K_MS_CRG 0xff63\t/**< CRG marker value */\n#define J2K_MS_COM 0xff64\t/**< COM marker value */\n#define J2K_MS_CBD 0xff78\t/**< CBD marker value */\n#define J2K_MS_MCC 0xff75\t/**< MCC marker value */\n#define J2K_MS_MCT 0xff74\t/**< MCT marker value */\n#define J2K_MS_MCO 0xff77\t/**< MCO marker value */\n\n#define J2K_MS_UNK 0\t\t/**< UNKNOWN marker value */\n\n/* UniPG>> */\n#ifdef USE_JPWL\n#define J2K_MS_EPC 0xff68\t/**< EPC marker value (Part 11: JPEG 2000 for Wireless) */\n#define J2K_MS_EPB 0xff66\t/**< EPB marker value (Part 11: JPEG 2000 for Wireless) */ \n#define J2K_MS_ESD 0xff67\t/**< ESD marker value (Part 11: JPEG 2000 for Wireless) */ \n#define J2K_MS_RED 0xff69\t/**< RED marker value (Part 11: JPEG 2000 for Wireless) */\n#endif /* USE_JPWL */\n#ifdef USE_JPSEC\n#define J2K_MS_SEC 0xff65    /**< SEC marker value (Part 8: Secure JPEG 2000) */\n#define J2K_MS_INSEC 0xff94  /**< INSEC marker value (Part 8: Secure JPEG 2000) */\n#endif /* USE_JPSEC */\n/* <<UniPG */\n\n/* ----------------------------------------------------------------------- */\n\n/**\n * Values that specify the status of the decoding process when decoding the main header.\n * These values may be combined with a | operator.\n * */\ntypedef enum J2K_STATUS {\n\tJ2K_STATE_NONE  =  0x0000, /**< a SOC marker is expected */\n\tJ2K_STATE_MHSOC  = 0x0001, /**< a SOC marker is expected */\n\tJ2K_STATE_MHSIZ  = 0x0002, /**< a SIZ marker is expected */\n\tJ2K_STATE_MH     = 0x0004, /**< the decoding process is in the main header */\n\tJ2K_STATE_TPHSOT = 0x0008, /**< the decoding process is in a tile part header and expects a SOT marker */\n\tJ2K_STATE_TPH    = 0x0010, /**< the decoding process is in a tile part header */\n\tJ2K_STATE_MT     = 0x0020, /**< the EOC marker has just been read */\n\tJ2K_STATE_NEOC   = 0x0040, /**< the decoding process must not expect a EOC marker because the codestream is truncated */\n\n\tJ2K_STATE_EOC\t = 0x0100, /**< the decoding process has encountered the EOC marker */\n\tJ2K_STATE_ERR    = 0x8000  /**< the decoding process has encountered an error (FIXME warning V1 = 0x0080)*/\n} J2K_STATUS;\n\n/**\n * Type of elements storing in the MCT data\n */\ntypedef enum MCT_ELEMENT_TYPE\n{\n\tMCT_TYPE_INT16 = 0,\t\t/** MCT data is stored as signed shorts*/\n\tMCT_TYPE_INT32 = 1,\t\t/** MCT data is stored as signed integers*/\n\tMCT_TYPE_FLOAT = 2,\t\t/** MCT data is stored as floats*/\n\tMCT_TYPE_DOUBLE = 3\t\t/** MCT data is stored as doubles*/\n} J2K_MCT_ELEMENT_TYPE;\n\n/**\n * Type of MCT array\n */\ntypedef enum MCT_ARRAY_TYPE\n{\n\tMCT_TYPE_DEPENDENCY = 0,\n\tMCT_TYPE_DECORRELATION = 1,\n\tMCT_TYPE_OFFSET = 2\n} J2K_MCT_ARRAY_TYPE;\n\n/* ----------------------------------------------------------------------- */\n\n/** \nT2 encoding mode \n*/\ntypedef enum T2_MODE {\n\tTHRESH_CALC = 0,\t/** Function called in Rate allocation process*/\n\tFINAL_PASS = 1\t\t/** Function called in Tier 2 process*/\n}J2K_T2_MODE;\n\n/**\n * Quantization stepsize\n */\ntypedef struct opj_stepsize {\n\t/** exponent */\n\tOPJ_INT32 expn;\n\t/** mantissa */\n\tOPJ_INT32 mant;\n} opj_stepsize_t;\n\n/**\nTile-component coding parameters\n*/\ntypedef struct opj_tccp\n{\n\t/** coding style */\n\tOPJ_UINT32 csty;\n\t/** number of resolutions */\n\tOPJ_UINT32 numresolutions;\n\t/** code-blocks width */\n\tOPJ_UINT32 cblkw;\n\t/** code-blocks height */\n\tOPJ_UINT32 cblkh;\n\t/** code-block coding style */\n\tOPJ_UINT32 cblksty;\n\t/** discrete wavelet transform identifier */\n\tOPJ_UINT32 qmfbid;\n\t/** quantisation style */\n\tOPJ_UINT32 qntsty;\n\t/** stepsizes used for quantization */\n\topj_stepsize_t stepsizes[OPJ_J2K_MAXBANDS];\n\t/** number of guard bits */\n\tOPJ_UINT32 numgbits;\n\t/** Region Of Interest shift */\n\tOPJ_INT32 roishift;\n\t/** precinct width */\n\tOPJ_UINT32 prcw[OPJ_J2K_MAXRLVLS];\n\t/** precinct height */\n\tOPJ_UINT32 prch[OPJ_J2K_MAXRLVLS];\n\t/** the dc_level_shift **/\n\tOPJ_INT32 m_dc_level_shift;\n}\nopj_tccp_t;\n\n\n\n/**\n * FIXME DOC\n */\ntypedef struct opj_mct_data\n{\n\tJ2K_MCT_ELEMENT_TYPE m_element_type;\n\tJ2K_MCT_ARRAY_TYPE\t m_array_type;\n\tOPJ_UINT32\t\t\t m_index;\n\tOPJ_BYTE *\t\t\t m_data;\n\tOPJ_UINT32\t\t\t m_data_size;\n}\nopj_mct_data_t;\n\n/**\n * FIXME DOC\n */\ntypedef struct opj_simple_mcc_decorrelation_data\n{\n\tOPJ_UINT32\t\t\t m_index;\n\tOPJ_UINT32\t\t\t m_nb_comps;\n\topj_mct_data_t *\t m_decorrelation_array;\n\topj_mct_data_t *\t m_offset_array;\n\tOPJ_UINT32\t\t\t m_is_irreversible : 1;\n}\nopj_simple_mcc_decorrelation_data_t;\n\n/**\nTile coding parameters :\nthis structure is used to store coding/decoding parameters common to all\ntiles (information like COD, COC in main header)\n*/\ntypedef struct opj_tcp\n{\n\t/** coding style */\n\tOPJ_UINT32 csty;\n\t/** progression order */\n\tOPJ_PROG_ORDER prg;\n\t/** number of layers */\n\tOPJ_UINT32 numlayers;\n\tOPJ_UINT32 num_layers_to_decode;\n\t/** multi-component transform identifier */\n\tOPJ_UINT32 mct;\n\t/** rates of layers */\n\tOPJ_FLOAT32 rates[100];\n\t/** number of progression order changes */\n\tOPJ_UINT32 numpocs;\n\t/** progression order changes */\n\topj_poc_t pocs[32];\n\t/** packet header store there for futur use in t2_decode_packet */\n\tOPJ_BYTE *ppt_data;\n\t/** used to keep a track of the allocated memory */\n\tOPJ_BYTE *ppt_buffer;\n\t/** Number of bytes stored inside ppt_data*/\n\tOPJ_UINT32 ppt_data_size;\n\t/** size of ppt_data*/\n\tOPJ_UINT32 ppt_len;\n\t/** add fixed_quality */\n\tOPJ_FLOAT32 distoratio[100];\n\t/** tile-component coding parameters */\n\topj_tccp_t *tccps;\n\t/** number of tile parts for the tile. */\n\tOPJ_UINT32 m_nb_tile_parts;\n\t/** data for the tile */\n\tOPJ_BYTE *\t\tm_data;\n\t/** size of data */\n\tOPJ_UINT32\t\tm_data_size;\n\t/** encoding norms */\n\tOPJ_FLOAT64 *\tmct_norms;\n\t/** the mct decoding matrix */\n\tOPJ_FLOAT32 *\tm_mct_decoding_matrix;\n\t/** the mct coding matrix */\n\tOPJ_FLOAT32 *\tm_mct_coding_matrix;\n\t/** mct records */\n\topj_mct_data_t * m_mct_records;\n\t/** the number of mct records. */\n\tOPJ_UINT32 m_nb_mct_records;\n\t/** the max number of mct records. */\n\tOPJ_UINT32 m_nb_max_mct_records;\n\t/** mcc records */\n\topj_simple_mcc_decorrelation_data_t * m_mcc_records;\n\t/** the number of mct records. */\n\tOPJ_UINT32 m_nb_mcc_records;\n\t/** the max number of mct records. */\n\tOPJ_UINT32 m_nb_max_mcc_records;\n\n\n\t/***** FLAGS *******/\n\t/** If ppt == 1 --> there was a PPT marker for the present tile */\n\tOPJ_UINT32 ppt : 1;\n\t/** indicates if a POC marker has been used O:NO, 1:YES */\n\tOPJ_UINT32 POC : 1;\n} opj_tcp_t;\n\n\n\n\ntypedef struct opj_encoding_param\n{\n\t/** Digital cinema profile*/\n\tOPJ_CINEMA_MODE m_cinema;\n\t/** Maximum rate for each component. If == 0, component size limitation is not considered */\n\tOPJ_UINT32 m_max_comp_size;\n\t/** Position of tile part flag in progression order*/\n\tOPJ_INT32 m_tp_pos;\n\t/** fixed layer */\n\tOPJ_INT32 *m_matrice;\n\t/** Flag determining tile part generation*/\n\tOPJ_BYTE m_tp_flag;\n\t/** allocation by rate/distortion */\n\tOPJ_UINT32 m_disto_alloc : 1;\n\t/** allocation by fixed layer */\n\tOPJ_UINT32 m_fixed_alloc : 1;\n\t/** add fixed_quality */\n\tOPJ_UINT32 m_fixed_quality : 1;\n\t/** Enabling Tile part generation*/\n\tOPJ_UINT32 m_tp_on : 1;\n}\nopj_encoding_param_t;\n\ntypedef struct opj_decoding_param\n{\n\t/** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */\n\tOPJ_UINT32 m_reduce;\n\t/** if != 0, then only the first \"layer\" layers are decoded; if == 0 or not used, all the quality layers are decoded */\n\tOPJ_UINT32 m_layer;\n}\nopj_decoding_param_t;\n\n\n/**\n * Coding parameters\n */\ntypedef struct opj_cp\n{\n\t/** Size of the image in bits*/\n\t/*int img_size;*/\n\t/** Rsiz*/\n\tOPJ_RSIZ_CAPABILITIES rsiz;\n\t/** XTOsiz */\n\tOPJ_UINT32 tx0; /* MSD see norm */\n\t/** YTOsiz */\n\tOPJ_UINT32 ty0; /* MSD see norm */\n\t/** XTsiz */\n\tOPJ_UINT32 tdx;\n\t/** YTsiz */\n\tOPJ_UINT32 tdy;\n\t/** comment */\n\tOPJ_CHAR *comment;\n\t/** number of tiles in width */\n\tOPJ_UINT32 tw;\n\t/** number of tiles in heigth */\n\tOPJ_UINT32 th;\n\n\t/** packet header store there for futur use in t2_decode_packet */\n\tOPJ_BYTE *ppm_data;\n\t/** size of the ppm_data*/\n\tOPJ_UINT32 ppm_len;\n\t/** size of the ppm_data*/\n\tOPJ_UINT32 ppm_data_read;\n\n\tOPJ_BYTE *ppm_data_current;\n\n\t/** packet header storage original buffer */\n\tOPJ_BYTE *ppm_buffer;\n\t/** pointer remaining on the first byte of the first header if ppm is used */\n\tOPJ_BYTE *ppm_data_first;\n\t/** Number of bytes actually stored inside the ppm_data */\n\tOPJ_UINT32 ppm_data_size;\n\t/** use in case of multiple marker PPM (number of info already store) */\n\tOPJ_INT32 ppm_store;\n\t/** use in case of multiple marker PPM (case on non-finished previous info) */\n\tOPJ_INT32 ppm_previous;\n\n\t/** tile coding parameters */\n\topj_tcp_t *tcps;\n\n\tunion\n\t{\n\t\topj_decoding_param_t m_dec;\n\t\topj_encoding_param_t m_enc;\n\t}\n\tm_specific_param;\n\n\n/* UniPG>> */\n#ifdef USE_JPWL\n\t/** enables writing of EPC in MH, thus activating JPWL */\n\tOPJ_BOOL epc_on;\n\t/** enables writing of EPB, in case of activated JPWL */\n\tOPJ_BOOL epb_on;\n\t/** enables writing of ESD, in case of activated JPWL */\n\tOPJ_BOOL esd_on;\n\t/** enables writing of informative techniques of ESD, in case of activated JPWL */\n\tOPJ_BOOL info_on;\n\t/** enables writing of RED, in case of activated JPWL */\n\tOPJ_BOOL red_on;\n\t/** error protection method for MH (0,1,16,32,37-128) */\n\tint hprot_MH;\n\t/** tile number of header protection specification (>=0) */\n\tint hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS];\n\t/** error protection methods for TPHs (0,1,16,32,37-128) */\n\tint hprot_TPH[JPWL_MAX_NO_TILESPECS];\n\t/** tile number of packet protection specification (>=0) */\n\tint pprot_tileno[JPWL_MAX_NO_PACKSPECS];\n\t/** packet number of packet protection specification (>=0) */\n\tint pprot_packno[JPWL_MAX_NO_PACKSPECS];\n\t/** error protection methods for packets (0,1,16,32,37-128) */\n\tint pprot[JPWL_MAX_NO_PACKSPECS];\n\t/** enables writing of ESD, (0/2/4 bytes) */\n\tint sens_size;\n\t/** sensitivity addressing size (0=auto/2/4 bytes) */\n\tint sens_addr;\n\t/** sensitivity range (0-3) */\n\tint sens_range;\n\t/** sensitivity method for MH (-1,0-7) */\n\tint sens_MH;\n\t/** tile number of sensitivity specification (>=0) */\n\tint sens_TPH_tileno[JPWL_MAX_NO_TILESPECS];\n\t/** sensitivity methods for TPHs (-1,0-7) */\n\tint sens_TPH[JPWL_MAX_NO_TILESPECS];\n\t/** enables JPWL correction at the decoder */\n\tOPJ_BOOL correct;\n\t/** expected number of components at the decoder */\n\tint exp_comps;\n\t/** maximum number of tiles at the decoder */\n\tOPJ_UINT32 max_tiles;\n#endif /* USE_JPWL */\n\n\t/******** FLAGS *********/\n\t/** if ppm == 1 --> there was a PPM marker*/\n\tOPJ_UINT32 ppm : 1;\n\t/** tells if the parameter is a coding or decoding one */\n\tOPJ_UINT32 m_is_decoder : 1;\n/* <<UniPG */\n} opj_cp_t;\n\n\ntypedef struct opj_j2k_dec\n{\n\t/** locate in which part of the codestream the decoder is (main header, tile header, end) */\n\tOPJ_UINT32 m_state;\n\t/**\n\t * store decoding parameters common to all tiles (information like COD, COC in main header)\n\t */\n\topj_tcp_t *m_default_tcp;\n\tOPJ_BYTE  *m_header_data;\n\tOPJ_UINT32 m_header_data_size;\n\t/** to tell the tile part length */\n\tOPJ_UINT32 m_sot_length;\n\t/** Only tiles index in the correct range will be decoded.*/\n\tOPJ_UINT32 m_start_tile_x;\n\tOPJ_UINT32 m_start_tile_y;\n\tOPJ_UINT32 m_end_tile_x;\n\tOPJ_UINT32 m_end_tile_y;\n\t/**\n\t * Decoded area set by the user\n\t */\n\tOPJ_UINT32 m_DA_x0;\n\tOPJ_UINT32 m_DA_y0;\n\tOPJ_UINT32 m_DA_x1;\n\tOPJ_UINT32 m_DA_y1;\n\n\t/** Index of the tile to decode (used in get_tile) */\n\tOPJ_INT32 m_tile_ind_to_dec;\n\t/** Position of the last SOT marker read */\n\tOPJ_OFF_T m_last_sot_read_pos;\n\n\t/**\n\t * Indicate that the current tile-part is assume as the last tile part of the codestream.\n\t * It is useful in the case of PSot is equal to zero. The sot length will be compute in the\n\t * SOD reader function. FIXME NOT USED for the moment\n\t */\n\tOPJ_BOOL   m_last_tile_part;\n\t/** to tell that a tile can be decoded. */\n\tOPJ_UINT32 m_can_decode\t\t\t: 1;\n\tOPJ_UINT32 m_discard_tiles\t\t: 1;\n\tOPJ_UINT32 m_skip_data\t\t\t: 1;\n\n} opj_j2k_dec_t;\n\ntypedef struct opj_j2k_enc\n{\n\t/** Tile part number, regardless of poc, for each new poc, tp is reset to 1*/\n\tOPJ_UINT32 m_current_poc_tile_part_number; /* tp_num */\n\n\t/** Tile part number currently coding, taking into account POC. m_current_tile_part_number holds the total number of tile parts while encoding the last tile part.*/\n\tOPJ_UINT32 m_current_tile_part_number; /*cur_tp_num */\n\n\t/**\n\tlocate the start position of the TLM marker\n\tafter encoding the tilepart, a jump (in j2k_write_sod) is done to the TLM marker to store the value of its length.\n\t*/\n    OPJ_OFF_T m_tlm_start;\n\t/**\n\t * Stores the sizes of the tlm.\n\t */\n\tOPJ_BYTE * m_tlm_sot_offsets_buffer;\n\t/**\n\t * The current offset of the tlm buffer.\n\t */\n\tOPJ_BYTE * m_tlm_sot_offsets_current;\n\n\t/** Total num of tile parts in whole image = num tiles* num tileparts in each tile*/\n\t/** used in TLMmarker*/\n\tOPJ_UINT32 m_total_tile_parts;\t /* totnum_tp */\n\n\t/* encoded data for a tile */\n\tOPJ_BYTE * m_encoded_tile_data;\n\n\t/* size of the encoded_data */\n\tOPJ_UINT32 m_encoded_tile_size;\n\n\t/* encoded data for a tile */\n\tOPJ_BYTE * m_header_tile_data;\n\n\t/* size of the encoded_data */\n\tOPJ_UINT32 m_header_tile_data_size;\n\n\n} opj_j2k_enc_t;\n\n\n\nstruct opj_tcd;\n/**\nJPEG-2000 codestream reader/writer\n*/\ntypedef struct opj_j2k\n{\n\t/* J2K codestream is decoded*/\n\tOPJ_BOOL m_is_decoder;\n\n\t/* FIXME DOC*/\n\tunion\n\t{\n\t\topj_j2k_dec_t m_decoder;\n\t\topj_j2k_enc_t m_encoder;\n\t}\n\tm_specific_param;\n\n\t/** pointer to the internal/private encoded / decoded image */\n\topj_image_t* m_private_image;\n\n\t/* pointer to the output image (decoded)*/\n\topj_image_t* m_output_image;\n\n\t/** Coding parameters */\n\topj_cp_t m_cp;\n\n\t/** the list of procedures to exec **/\n\topj_procedure_list_t *\tm_procedure_list;\n\n\t/** the list of validation procedures to follow to make sure the code is valid **/\n\topj_procedure_list_t *\tm_validation_list;\n\n\t/** helper used to write the index file */\n\topj_codestream_index_t *cstr_index;\n\n\t/** number of the tile curently concern by coding/decoding */\n\tOPJ_UINT32 m_current_tile_number;\n\n\t/** the current tile coder/decoder **/\n\tstruct opj_tcd *\tm_tcd;\n\n}\nopj_j2k_t;\n\n\n\n\n/** @name Exported functions */\n/*@{*/\n/* ----------------------------------------------------------------------- */\n\n/**\nSetup the decoder decoding parameters using user parameters.\nDecoding parameters are returned in j2k->cp. \n@param j2k J2K decompressor handle\n@param parameters decompression parameters\n*/\nvoid opj_j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters);\n\n/**\n * Creates a J2K compression structure\n *\n * @return Returns a handle to a J2K compressor if successful, returns NULL otherwise\n*/\nopj_j2k_t* opj_j2k_create_compress(void);\n\n\nvoid opj_j2k_setup_encoder(\topj_j2k_t *p_j2k,\n\t\t\t\t\t\t    opj_cparameters_t *parameters,\n\t\t\t\t\t\t    opj_image_t *image,\n\t\t\t\t\t\t    opj_event_mgr_t * p_manager);\n\n/**\nConverts an enum type progression order to string type\n*/\nchar *opj_j2k_convert_progression_order(OPJ_PROG_ORDER prg_order);\n\n/* ----------------------------------------------------------------------- */\n/*@}*/\n\n/*@}*/\n\n/**\n * Ends the decompression procedures and possibiliy add data to be read after the\n * codestream.\n */\nOPJ_BOOL opj_j2k_end_decompress(opj_j2k_t *j2k,\n                                opj_stream_private_t *p_stream,\n                                opj_event_mgr_t * p_manager);\n\n/**\n * Reads a jpeg2000 codestream header structure.\n *\n * @param p_stream the stream to read data from.\n * @param p_j2k the jpeg2000 codec.\n * @param p_image FIXME DOC\n * @param p_manager the user event manager.\n *\n * @return true if the box is valid.\n */\nOPJ_BOOL opj_j2k_read_header(\topj_stream_private_t *p_stream,\n                                opj_j2k_t* p_j2k,\n                                opj_image_t** p_image,\n                                opj_event_mgr_t* p_manager );\n\n\n/**\n * Destroys a jpeg2000 codec.\n *\n * @param\tp_j2k\tthe jpeg20000 structure to destroy.\n */\nvoid opj_j2k_destroy (opj_j2k_t *p_j2k);\n\n/**\n * Destroys a codestream index structure.\n *\n * @param\tp_cstr_ind\tthe codestream index parameter to destroy.\n */\nvoid j2k_destroy_cstr_index (opj_codestream_index_t *p_cstr_ind);\n\n/**\n * Decode tile data.\n * @param\tp_j2k\t\tthe jpeg2000 codec.\n * @param\tp_tile_index\n * @param p_data       FIXME DOC\n * @param p_data_size  FIXME DOC\n * @param\tp_stream\t\t\tthe stream to write data to.\n * @param\tp_manager\tthe user event manager.\n */\nOPJ_BOOL opj_j2k_decode_tile (  opj_j2k_t * p_j2k,\n                                OPJ_UINT32 p_tile_index,\n                                OPJ_BYTE * p_data,\n                                OPJ_UINT32 p_data_size,\n                                opj_stream_private_t *p_stream,\n                                opj_event_mgr_t * p_manager );\n\n/**\n * Reads a tile header.\n * @param\tp_j2k\t\tthe jpeg2000 codec.\n * @param\tp_tile_index FIXME DOC\n * @param\tp_data_size FIXME DOC\n * @param\tp_tile_x0 FIXME DOC\n * @param\tp_tile_y0 FIXME DOC\n * @param\tp_tile_x1 FIXME DOC\n * @param\tp_tile_y1 FIXME DOC\n * @param\tp_nb_comps FIXME DOC\n * @param\tp_go_on FIXME DOC\n * @param\tp_stream\t\t\tthe stream to write data to.\n * @param\tp_manager\tthe user event manager.\n */\nOPJ_BOOL opj_j2k_read_tile_header ( opj_j2k_t * p_j2k,\n                                    OPJ_UINT32 * p_tile_index,\n                                    OPJ_UINT32 * p_data_size,\n                                    OPJ_INT32 * p_tile_x0,\n                                    OPJ_INT32 * p_tile_y0,\n                                    OPJ_INT32 * p_tile_x1,\n                                    OPJ_INT32 * p_tile_y1,\n                                    OPJ_UINT32 * p_nb_comps,\n                                    OPJ_BOOL * p_go_on,\n                                    opj_stream_private_t *p_stream,\n                                    opj_event_mgr_t * p_manager );\n\n\n/**\n * Sets the given area to be decoded. This function should be called right after opj_read_header and before any tile header reading.\n *\n * @param\tp_j2k\t\t\tthe jpeg2000 codec.\n * @param\tp_image     FIXME DOC\n * @param\tp_start_x\t\tthe left position of the rectangle to decode (in image coordinates).\n * @param\tp_start_y\t\tthe up position of the rectangle to decode (in image coordinates).\n * @param\tp_end_x\t\t\tthe right position of the rectangle to decode (in image coordinates).\n * @param\tp_end_y\t\t\tthe bottom position of the rectangle to decode (in image coordinates).\n * @param\tp_manager\t\tthe user event manager\n *\n * @return\ttrue\t\t\tif the area could be set.\n */\nOPJ_BOOL opj_j2k_set_decode_area(\topj_j2k_t *p_j2k,\n\t\t\t\t\t\t\t\t    opj_image_t* p_image,\n\t\t\t\t\t\t\t\t    OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,\n\t\t\t\t\t\t\t\t    OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,\n\t\t\t\t\t\t\t\t    opj_event_mgr_t * p_manager );\n\n/**\n * Creates a J2K decompression structure.\n *\n * @return a handle to a J2K decompressor if successful, NULL otherwise.\n */\nopj_j2k_t* opj_j2k_create_decompress(void);\n\n\n/**\n * Dump some elements from the J2K decompression structure .\n *\n *@param p_j2k\t\t\t\tthe jpeg2000 codec.\n *@param flag\t\t\t\tflag to describe what elments are dump.\n *@param out_stream\t\t\toutput stream where dump the elements.\n *\n*/\nvoid j2k_dump (opj_j2k_t* p_j2k, OPJ_INT32 flag, FILE* out_stream);\n\n\n\n/**\n * Dump an image header structure.\n *\n *@param image\t\t\tthe image header to dump.\n *@param dev_dump_flag\t\tflag to describe if we are in the case of this function is use outside j2k_dump function\n *@param out_stream\t\t\toutput stream where dump the elements.\n */\nvoid j2k_dump_image_header(opj_image_t* image, OPJ_BOOL dev_dump_flag, FILE* out_stream);\n\n/**\n * Dump a component image header structure.\n *\n *@param comp\t\tthe component image header to dump.\n *@param dev_dump_flag\t\tflag to describe if we are in the case of this function is use outside j2k_dump function\n *@param out_stream\t\t\toutput stream where dump the elements.\n */\nvoid j2k_dump_image_comp_header(opj_image_comp_t* comp, OPJ_BOOL dev_dump_flag, FILE* out_stream);\n\n/**\n * Get the codestream info from a JPEG2000 codec.\n *\n *@param\tp_j2k\t\t\t\tthe component image header to dump.\n *\n *@return\tthe codestream information extract from the jpg2000 codec\n */\nopj_codestream_info_v2_t* j2k_get_cstr_info(opj_j2k_t* p_j2k);\n\n/**\n * Get the codestream index from a JPEG2000 codec.\n *\n *@param\tp_j2k\t\t\t\tthe component image header to dump.\n *\n *@return\tthe codestream index extract from the jpg2000 codec\n */\nopj_codestream_index_t* j2k_get_cstr_index(opj_j2k_t* p_j2k);\n\n/**\n * Decode an image from a JPEG-2000 codestream\n * @param j2k J2K decompressor handle\n * @param p_stream  FIXME DOC\n * @param p_image   FIXME DOC\n * @param p_manager FIXME DOC\n * @return FIXME DOC\n*/\nOPJ_BOOL opj_j2k_decode(opj_j2k_t *j2k,\n                        opj_stream_private_t *p_stream,\n                        opj_image_t *p_image,\n                        opj_event_mgr_t *p_manager);\n\n\nOPJ_BOOL opj_j2k_get_tile(\topj_j2k_t *p_j2k,\n\t\t\t    \t\t\topj_stream_private_t *p_stream,\n\t\t\t\t    \t\topj_image_t* p_image,\n\t\t\t\t\t    \topj_event_mgr_t * p_manager,\n\t\t\t\t\t\t    OPJ_UINT32 tile_index );\n\nOPJ_BOOL opj_j2k_set_decoded_resolution_factor(opj_j2k_t *p_j2k, \n                                               OPJ_UINT32 res_factor,\n                                               opj_event_mgr_t * p_manager);\n\n\n/**\n * Writes a tile.\n * @param\tp_j2k\t\tthe jpeg2000 codec.\n * @param p_tile_index FIXME DOC\n * @param p_data FIXME DOC\n * @param p_data_size FIXME DOC\n * @param\tp_stream\t\t\tthe stream to write data to.\n * @param\tp_manager\tthe user event manager.\n */\nOPJ_BOOL opj_j2k_write_tile (\topj_j2k_t * p_j2k,\n\t\t\t\t\t\t\t    OPJ_UINT32 p_tile_index,\n\t\t\t\t\t\t\t    OPJ_BYTE * p_data,\n\t\t\t\t\t\t\t    OPJ_UINT32 p_data_size,\n\t\t\t\t\t\t\t    opj_stream_private_t *p_stream,\n\t\t\t\t\t\t\t    opj_event_mgr_t * p_manager );\n\n/**\n * Encodes an image into a JPEG-2000 codestream\n */\nOPJ_BOOL opj_j2k_encode(\topj_j2k_t * p_j2k,\n\t\t\t    \t\t\topj_stream_private_t *cio,\n\t\t\t\t    \t\topj_event_mgr_t * p_manager );\n\n/**\n * Starts a compression scheme, i.e. validates the codec parameters, writes the header.\n *\n * @param\tp_j2k\t\tthe jpeg2000 codec.\n * @param\tp_stream\t\t\tthe stream object.\n * @param\tp_image FIXME DOC\n * @param\tp_manager\tthe user event manager.\n *\n * @return true if the codec is valid.\n */\nOPJ_BOOL opj_j2k_start_compress(opj_j2k_t *p_j2k,\n\t\t\t\t\t\t\t    opj_stream_private_t *p_stream,\n\t\t\t\t\t\t\t    opj_image_t * p_image,\n\t\t\t\t\t\t\t    opj_event_mgr_t * p_manager);\n\n/**\n * Ends the compression procedures and possibiliy add data to be read after the\n * codestream.\n */\nOPJ_BOOL opj_j2k_end_compress( \topj_j2k_t *p_j2k,\n\t\t\t\t\t\t\t    opj_stream_private_t *cio,\n\t\t\t\t\t\t\t    opj_event_mgr_t * p_manager);\n\nOPJ_BOOL opj_j2k_setup_mct_encoding (opj_tcp_t * p_tcp, opj_image_t * p_image);\n\n\n#endif /* __J2K_H */\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/jp2.c",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2001-2003, David Janssens\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * Copyright (c) 2010-2011, Kaori Hagihara\n * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR \n * Copyright (c) 2012, CS Systemes d'Information, France\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#include \"opj_includes.h\"\n\n/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */\n/*@{*/\n\n#define OPJ_BOX_SIZE\t1024\n\n/** @name Local static functions */\n/*@{*/\n\n/*static void jp2_write_url(opj_cio_t *cio, char *Idx_file);*/\n\n/**\n * Reads a IHDR box - Image Header box\n *\n * @param\tp_image_header_data\t\t\tpointer to actual data (already read from file)\n * @param\tjp2\t\t\t\t\t\t\tthe jpeg2000 file codec.\n * @param\tp_image_header_size\t\t\tthe size of the image header\n * @param\tp_manager\t\t\t\t\tthe user event manager.\n *\n * @return\ttrue if the image header is valid, false else.\n */\nstatic OPJ_BOOL opj_jp2_read_ihdr(  opj_jp2_t *jp2,\n                                    OPJ_BYTE *p_image_header_data,\n                                    OPJ_UINT32 p_image_header_size,\n                                    opj_event_mgr_t * p_manager );\n\n/**\n * Writes the Image Header box - Image Header box.\n *\n * @param jp2\t\t\t\t\tjpeg2000 file codec.\n * @param p_nb_bytes_written\tpointer to store the nb of bytes written by the function.\n *\n * @return\tthe data being copied.\n*/\nstatic OPJ_BYTE * opj_jp2_write_ihdr(opj_jp2_t *jp2,\n                                     OPJ_UINT32 * p_nb_bytes_written );\n\n/**\n * Writes the Bit per Component box.\n *\n * @param\tjp2\t\t\t\t\t\tjpeg2000 file codec.\n * @param\tp_nb_bytes_written\t\tpointer to store the nb of bytes written by the function.\n *\n * @return\tthe data being copied.\n*/\nstatic OPJ_BYTE * opj_jp2_write_bpcc(\topj_jp2_t *jp2,\n\t\t\t\t\t\t\t\t        OPJ_UINT32 * p_nb_bytes_written );\n\n/**\n * Reads a Bit per Component box.\n *\n * @param\tp_bpc_header_data\t\t\tpointer to actual data (already read from file)\n * @param\tjp2\t\t\t\t\t\t\tthe jpeg2000 file codec.\n * @param\tp_bpc_header_size\t\t\tthe size of the bpc header\n * @param\tp_manager\t\t\t\t\tthe user event manager.\n *\n * @return\ttrue if the bpc header is valid, fale else.\n */\nstatic OPJ_BOOL opj_jp2_read_bpcc(  opj_jp2_t *jp2,\n                                    OPJ_BYTE * p_bpc_header_data,\n                                    OPJ_UINT32 p_bpc_header_size,\n                                    opj_event_mgr_t * p_manager );\n\nstatic OPJ_BOOL opj_jp2_read_cdef(\topj_jp2_t * jp2,\n                                    OPJ_BYTE * p_cdef_header_data,\n\t\t\t\t\t\t\t\t\tOPJ_UINT32 p_cdef_header_size,\n\t\t\t\t\t\t\t\t\topj_event_mgr_t * p_manager );\n\nstatic void opj_jp2_apply_cdef(opj_image_t *image, opj_jp2_color_t *color);\n\n/**\n * Writes the Colour Specification box.\n *\n * @param jp2\t\t\t\t\tjpeg2000 file codec.\n * @param p_nb_bytes_written\tpointer to store the nb of bytes written by the function.\n *\n * @return\tthe data being copied.\n*/\nstatic OPJ_BYTE * opj_jp2_write_colr(   opj_jp2_t *jp2,\n\t\t\t\t\t\t\t\t\t    OPJ_UINT32 * p_nb_bytes_written );\n\n/**\n * Writes a FTYP box - File type box\n *\n * @param\tcio\t\t\tthe stream to write data to.\n * @param\tjp2\t\t\tthe jpeg2000 file codec.\n * @param\tp_manager\tthe user event manager.\n *\n * @return\ttrue if writing was successful.\n */\nstatic OPJ_BOOL opj_jp2_write_ftyp(\topj_jp2_t *jp2,\n\t\t\t\t\t\t\t\t\topj_stream_private_t *cio,\n\t\t\t\t\t\t\t\t\topj_event_mgr_t * p_manager );\n\n/**\n * Reads a a FTYP box - File type box\n *\n * @param\tp_header_data\tthe data contained in the FTYP box.\n * @param\tjp2\t\t\t\tthe jpeg2000 file codec.\n * @param\tp_header_size\tthe size of the data contained in the FTYP box.\n * @param\tp_manager\t\tthe user event manager.\n *\n * @return true if the FTYP box is valid.\n */\nstatic OPJ_BOOL opj_jp2_read_ftyp(\topj_jp2_t *jp2,\n\t\t\t\t\t\t\t\t\tOPJ_BYTE * p_header_data,\n\t\t\t\t\t\t\t\t\tOPJ_UINT32 p_header_size,\n\t\t\t\t\t\t\t\t\topj_event_mgr_t * p_manager );\n\nOPJ_BOOL opj_jp2_skip_jp2c(\topj_jp2_t *jp2,\n\t\t\t\t\t\t    opj_stream_private_t *cio,\n\t\t\t\t\t\t    opj_event_mgr_t * p_manager );\n\n/**\n * Reads the Jpeg2000 file Header box - JP2 Header box (warning, this is a super box).\n *\n * @param\tp_header_data\tthe data contained in the file header box.\n * @param\tjp2\t\t\t\tthe jpeg2000 file codec.\n * @param\tp_header_size\tthe size of the data contained in the file header box.\n * @param\tp_manager\t\tthe user event manager.\n *\n * @return true if the JP2 Header box was successfully reconized.\n*/\nstatic OPJ_BOOL opj_jp2_read_jp2h(  opj_jp2_t *jp2,\n                                    OPJ_BYTE *p_header_data,\n                                    OPJ_UINT32 p_header_size,\n                                    opj_event_mgr_t * p_manager );\n\n/**\n * Writes the Jpeg2000 codestream Header box - JP2C Header box. This function must be called AFTER the coding has been done.\n *\n * @param\tcio\t\t\tthe stream to write data to.\n * @param\tjp2\t\t\tthe jpeg2000 file codec.\n * @param\tp_manager\tuser event manager.\n *\n * @return true if writing was successful.\n*/\nstatic OPJ_BOOL opj_jp2_write_jp2c(\topj_jp2_t *jp2,\n\t\t\t\t\t\t\t\t    opj_stream_private_t *cio,\n\t\t\t\t\t\t\t\t    opj_event_mgr_t * p_manager );\n\n#ifdef USE_JPIP\n/**\n * Write index Finder box\n * @param cio     the stream to write to.\n * @param\tjp2\t\t\tthe jpeg2000 file codec.\n * @param\tp_manager\tuser event manager.\n*/\nstatic OPJ_BOOL opj_jpip_write_iptr(\topj_jp2_t *jp2,\n\t\t\t\t\t\t\t\t    opj_stream_private_t *cio,\n\t\t\t\t\t\t\t\t    opj_event_mgr_t * p_manager );\n\n/**\n * Write index Finder box\n * @param cio     the stream to write to.\n * @param\tjp2\t\t\tthe jpeg2000 file codec.\n * @param\tp_manager\tuser event manager.\n */\nstatic OPJ_BOOL opj_jpip_write_cidx(opj_jp2_t *jp2,\n  opj_stream_private_t *cio,\n  opj_event_mgr_t * p_manager );\n\n/**\n * Write file Index (superbox)\n * @param cio     the stream to write to.\n * @param\tjp2\t\t\tthe jpeg2000 file codec.\n * @param\tp_manager\tuser event manager.\n */\nstatic OPJ_BOOL opj_jpip_write_fidx(opj_jp2_t *jp2,\n  opj_stream_private_t *cio,\n  opj_event_mgr_t * p_manager );\n#endif /* USE_JPIP */\n\n/**\n * Reads a jpeg2000 file signature box.\n *\n * @param\tp_header_data\tthe data contained in the signature box.\n * @param\tjp2\t\t\t\tthe jpeg2000 file codec.\n * @param\tp_header_size\tthe size of the data contained in the signature box.\n * @param\tp_manager\t\tthe user event manager.\n *\n * @return true if the file signature box is valid.\n */\nstatic OPJ_BOOL opj_jp2_read_jp(opj_jp2_t *jp2,\n                                OPJ_BYTE * p_header_data,\n                                OPJ_UINT32 p_header_size,\n                                opj_event_mgr_t * p_manager);\n\n/**\n * Writes a jpeg2000 file signature box.\n *\n * @param cio the stream to write data to.\n * @param\tjp2\t\t\tthe jpeg2000 file codec.\n * @param p_manager the user event manager.\n *\n * @return true if writing was successful.\n */\nstatic OPJ_BOOL opj_jp2_write_jp(\topj_jp2_t *jp2,\n\t\t\t    \t        \t    opj_stream_private_t *cio,\n\t\t\t\t            \t\topj_event_mgr_t * p_manager );\n\n/**\nApply collected palette data\n@param color Collector for profile, cdef and pclr data\n@param image\n*/\nstatic void opj_jp2_apply_pclr(opj_image_t *image, opj_jp2_color_t *color);\n\nstatic void opj_jp2_free_pclr(opj_jp2_color_t *color);\n\n/**\n * Collect palette data\n *\n * @param jp2 JP2 handle\n * @param p_pclr_header_data    FIXME DOC\n * @param p_pclr_header_size    FIXME DOC\n * @param p_manager\n *\n * @return Returns true if successful, returns false otherwise\n*/\nstatic OPJ_BOOL opj_jp2_read_pclr(\topj_jp2_t *jp2,\n                                    OPJ_BYTE * p_pclr_header_data,\n                                    OPJ_UINT32 p_pclr_header_size,\n                                    opj_event_mgr_t * p_manager );\n\n/**\n * Collect component mapping data\n *\n * @param jp2                 JP2 handle\n * @param p_cmap_header_data  FIXME DOC\n * @param p_cmap_header_size  FIXME DOC\n * @param p_manager           FIXME DOC\n *\n * @return Returns true if successful, returns false otherwise\n*/\n\nstatic OPJ_BOOL opj_jp2_read_cmap(\topj_jp2_t * jp2,\n                                    OPJ_BYTE * p_cmap_header_data,\n                                    OPJ_UINT32 p_cmap_header_size,\n                                    opj_event_mgr_t * p_manager );\n\n/**\n * Reads the Color Specification box.\n *\n * @param\tp_colr_header_data\t\t\tpointer to actual data (already read from file)\n * @param\tjp2\t\t\t\t\t\t\tthe jpeg2000 file codec.\n * @param\tp_colr_header_size\t\t\tthe size of the color header\n * @param\tp_manager\t\t\t\t\tthe user event manager.\n *\n * @return\ttrue if the bpc header is valid, fale else.\n*/\nstatic OPJ_BOOL opj_jp2_read_colr(  opj_jp2_t *jp2,\n                                    OPJ_BYTE * p_colr_header_data,\n                                    OPJ_UINT32 p_colr_header_size,\n                                    opj_event_mgr_t * p_manager );\n\n/*@}*/\n\n/*@}*/\n\n/**\n * Sets up the procedures to do on writing header after the codestream.\n * Developpers wanting to extend the library can add their own writing procedures.\n */\nstatic void opj_jp2_setup_end_header_writing (opj_jp2_t *jp2);\n\n/**\n * Sets up the procedures to do on reading header after the codestream.\n * Developpers wanting to extend the library can add their own writing procedures.\n */\nstatic void opj_jp2_setup_end_header_reading (opj_jp2_t *jp2);\n\n/**\n * Reads a jpeg2000 file header structure.\n *\n * @param jp2 the jpeg2000 file header structure.\n * @param stream the stream to read data from.\n * @param p_manager the user event manager.\n *\n * @return true if the box is valid.\n */\nstatic OPJ_BOOL opj_jp2_read_header_procedure(  opj_jp2_t *jp2,\n                                                opj_stream_private_t *stream,\n                                                opj_event_mgr_t * p_manager );\n\n/**\n * Excutes the given procedures on the given codec.\n *\n * @param\tp_procedure_list\tthe list of procedures to execute\n * @param\tjp2\t\t\t\t\tthe jpeg2000 file codec to execute the procedures on.\n * @param\tstream\t\t\t\t\tthe stream to execute the procedures on.\n * @param\tp_manager\t\t\tthe user manager.\n *\n * @return\ttrue\t\t\t\tif all the procedures were successfully executed.\n */\nstatic OPJ_BOOL opj_jp2_exec (  opj_jp2_t * jp2,\n                                opj_procedure_list_t * p_procedure_list,\n                                opj_stream_private_t *stream,\n                                opj_event_mgr_t * p_manager );\n\n/**\n * Reads a box header. The box is the way data is packed inside a jpeg2000 file structure.\n *\n * @param\tcio\t\t\t\t\t\tthe input stream to read data from.\n * @param\tbox\t\t\t\t\t\tthe box structure to fill.\n * @param\tp_number_bytes_read\t\tpointer to an int that will store the number of bytes read from the stream (shoul usually be 2).\n * @param\tp_manager\t\t\t\tuser event manager.\n *\n * @return\ttrue if the box is reconized, false otherwise\n*/\nstatic OPJ_BOOL opj_jp2_read_boxhdr(opj_jp2_box_t *box,\n                                    OPJ_UINT32 * p_number_bytes_read,\n                                    opj_stream_private_t *cio,\n                                    opj_event_mgr_t * p_manager);\n\n/**\n * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters\n * are valid. Developpers wanting to extend the library can add their own validation procedures.\n */\nstatic void opj_jp2_setup_encoding_validation (opj_jp2_t *jp2);\n\n/**\n * Sets up the procedures to do on writing header. Developpers wanting to extend the library can add their own writing procedures.\n */\nstatic void opj_jp2_setup_header_writing (opj_jp2_t *jp2);\n\nOPJ_BOOL opj_jp2_default_validation (\topj_jp2_t * jp2,\n                                        opj_stream_private_t *cio,\n                                        opj_event_mgr_t * p_manager );\n\n/**\n * Finds the image execution function related to the given box id.\n *\n * @param\tp_id\tthe id of the handler to fetch.\n *\n * @return\tthe given handler or NULL if it could not be found.\n */\nstatic const opj_jp2_header_handler_t * opj_jp2_img_find_handler (OPJ_UINT32 p_id);\n\n/**\n * Finds the execution function related to the given box id.\n *\n * @param\tp_id\tthe id of the handler to fetch.\n *\n * @return\tthe given handler or NULL if it could not be found.\n */\nstatic const opj_jp2_header_handler_t * opj_jp2_find_handler (OPJ_UINT32 p_id );\n\nconst opj_jp2_header_handler_t jp2_header [] =\n{\n\t{JP2_JP,opj_jp2_read_jp},\n\t{JP2_FTYP,opj_jp2_read_ftyp},\n\t{JP2_JP2H,opj_jp2_read_jp2h}\n};\n\nconst opj_jp2_header_handler_t jp2_img_header [] =\n{\n\t{JP2_IHDR,opj_jp2_read_ihdr},\n\t{JP2_COLR,opj_jp2_read_colr},\n\t{JP2_BPCC,opj_jp2_read_bpcc},\n\t{JP2_PCLR,opj_jp2_read_pclr},\n\t{JP2_CMAP,opj_jp2_read_cmap},\n\t{JP2_CDEF,opj_jp2_read_cdef}\n\n};\n\n/**\n * Reads a box header. The box is the way data is packed inside a jpeg2000 file structure. Data is read from a character string\n *\n * @param\tbox\t\t\t\t\t\tthe box structure to fill.\n * @param\tp_data\t\t\t\t\tthe character string to read data from.\n * @param\tp_number_bytes_read\t\tpointer to an int that will store the number of bytes read from the stream (shoul usually be 2).\n * @param\tp_box_max_size\t\t\tthe maximum number of bytes in the box.\n * @param\tp_manager         FIXME DOC\n *\n * @return\ttrue if the box is reconized, false otherwise\n*/\nstatic OPJ_BOOL opj_jp2_read_boxhdr_char(   opj_jp2_box_t *box,\n                                            OPJ_BYTE * p_data,\n                                            OPJ_UINT32 * p_number_bytes_read,\n                                            OPJ_UINT32 p_box_max_size,\n                                            opj_event_mgr_t * p_manager );\n\n/**\n * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters\n * are valid. Developpers wanting to extend the library can add their own validation procedures.\n */\nstatic void opj_jp2_setup_decoding_validation (opj_jp2_t *jp2);\n\n/**\n * Sets up the procedures to do on reading header.\n * Developpers wanting to extend the library can add their own writing procedures.\n */\nstatic void opj_jp2_setup_header_reading (opj_jp2_t *jp2);\n\n/* ----------------------------------------------------------------------- */\n OPJ_BOOL opj_jp2_read_boxhdr(opj_jp2_box_t *box,\n                              OPJ_UINT32 * p_number_bytes_read,\n                              opj_stream_private_t *cio,\n                              opj_event_mgr_t * p_manager )\n{\n\t/* read header from file */\n\tOPJ_BYTE l_data_header [8];\n\n\t/* preconditions */\n\tassert(cio != 00);\n\tassert(box != 00);\n\tassert(p_number_bytes_read != 00);\n\tassert(p_manager != 00);\n\n\t*p_number_bytes_read = (OPJ_UINT32)opj_stream_read_data(cio,l_data_header,8,p_manager);\n\tif (*p_number_bytes_read != 8) {\n\t\treturn OPJ_FALSE;\n\t}\n\n\t/* process read data */\n\topj_read_bytes(l_data_header,&(box->length), 4);\n\topj_read_bytes(l_data_header+4,&(box->type), 4);\n    \n  if(box->length == 0)/* last box */\n    {\n    const OPJ_OFF_T bleft = opj_stream_get_number_byte_left(cio);\n    box->length = (OPJ_UINT32)bleft;\n    assert( (OPJ_OFF_T)box->length == bleft );\n    return OPJ_TRUE;\n    }\n\n\t/* do we have a \"special very large box ?\" */\n\t/* read then the XLBox */\n\tif (box->length == 1) {\n\t\tOPJ_UINT32 l_xl_part_size;\n\n\t\tOPJ_UINT32 l_nb_bytes_read = (OPJ_UINT32)opj_stream_read_data(cio,l_data_header,8,p_manager);\n\t\tif (l_nb_bytes_read != 8) {\n\t\t\tif (l_nb_bytes_read > 0) {\n\t\t\t\t*p_number_bytes_read += l_nb_bytes_read;\n\t\t\t}\n\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\n        *p_number_bytes_read = 16;\n\t\topj_read_bytes(l_data_header,&l_xl_part_size, 4);\n\t\tif (l_xl_part_size != 0) {\n\t\t\topj_event_msg(p_manager, EVT_ERROR, \"Cannot handle box sizes higher than 2^32\\n\");\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\t\topj_read_bytes(l_data_header+4,&(box->length), 4);\n\t}\n    return OPJ_TRUE;\n}\n\n#if 0\nstatic void jp2_write_url(opj_cio_t *cio, char *Idx_file) {\n\tOPJ_UINT32 i;\n\topj_jp2_box_t box;\n\n\tbox.init_pos = cio_tell(cio);\n\tcio_skip(cio, 4);\n\tcio_write(cio, JP2_URL, 4);\t/* DBTL */\n\tcio_write(cio, 0, 1);\t\t/* VERS */\n\tcio_write(cio, 0, 3);\t\t/* FLAG */\n\n\tif(Idx_file) {\n\t\tfor (i = 0; i < strlen(Idx_file); i++) {\n\t\t\tcio_write(cio, Idx_file[i], 1);\n\t\t}\n\t}\n\n\tbox.length = cio_tell(cio) - box.init_pos;\n\tcio_seek(cio, box.init_pos);\n\tcio_write(cio, box.length, 4);\t/* L */\n\tcio_seek(cio, box.init_pos + box.length);\n}\n#endif\n\nOPJ_BOOL opj_jp2_read_ihdr( opj_jp2_t *jp2,\n                            OPJ_BYTE *p_image_header_data,\n                            OPJ_UINT32 p_image_header_size,\n                            opj_event_mgr_t * p_manager )\n{\n\t/* preconditions */\n\tassert(p_image_header_data != 00);\n\tassert(jp2 != 00);\n\tassert(p_manager != 00);\n\n\tif (p_image_header_size != 14) {\n\t\topj_event_msg(p_manager, EVT_ERROR, \"Bad image header box (bad size)\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\n\topj_read_bytes(p_image_header_data,&(jp2->h),4);\t\t\t/* HEIGHT */\n\tp_image_header_data += 4;\n\topj_read_bytes(p_image_header_data,&(jp2->w),4);\t\t\t/* WIDTH */\n\tp_image_header_data += 4;\n\topj_read_bytes(p_image_header_data,&(jp2->numcomps),2);\t\t/* NC */\n\tp_image_header_data += 2;\n\n\t/* allocate memory for components */\n\tjp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t));\n\tif (jp2->comps == 0) {\n\t\topj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to handle image header (ihdr)\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\tmemset(jp2->comps,0,jp2->numcomps * sizeof(opj_jp2_comps_t));\n\n\topj_read_bytes(p_image_header_data,&(jp2->bpc),1);\t\t\t/* BPC */\n\t++ p_image_header_data;\n\n\topj_read_bytes(p_image_header_data,&(jp2->C),1);\t\t\t/* C */\n\t++ p_image_header_data;\n\n\t/* Should be equal to 7 cf. chapter about image header box of the norm */\n\tif (jp2->C != 7){\n\t\topj_event_msg(p_manager, EVT_INFO, \"JP2 IHDR box: compression type indicate that the file is not a conforming JP2 file (%d) \\n\", jp2->C);\n\t}\n\n\topj_read_bytes(p_image_header_data,&(jp2->UnkC),1);\t\t\t/* UnkC */\n\t++ p_image_header_data;\n\topj_read_bytes(p_image_header_data,&(jp2->IPR),1);\t\t\t/* IPR */\n\t++ p_image_header_data;\n\n\treturn OPJ_TRUE;\n}\n\nOPJ_BYTE * opj_jp2_write_ihdr(opj_jp2_t *jp2,\n                              OPJ_UINT32 * p_nb_bytes_written\n                              )\n{\n\tOPJ_BYTE * l_ihdr_data,* l_current_ihdr_ptr;\n\t\n\t/* preconditions */\n\tassert(jp2 != 00);\n\tassert(p_nb_bytes_written != 00);\n\n\t/* default image header is 22 bytes wide */\n\tl_ihdr_data = (OPJ_BYTE *) opj_malloc(22);\n\tif (l_ihdr_data == 00) {\n\t\treturn 00;\n\t}\n\tmemset(l_ihdr_data,0,22);\n\n\tl_current_ihdr_ptr = l_ihdr_data;\n\t\n\topj_write_bytes(l_current_ihdr_ptr,22,4);\t\t\t\t/* write box size */\n\tl_current_ihdr_ptr+=4;\n\n\topj_write_bytes(l_current_ihdr_ptr,JP2_IHDR, 4);\t\t/* IHDR */\n\tl_current_ihdr_ptr+=4;\n\t\n\topj_write_bytes(l_current_ihdr_ptr,jp2->h, 4);\t\t/* HEIGHT */\n\tl_current_ihdr_ptr+=4;\n\t\n\topj_write_bytes(l_current_ihdr_ptr, jp2->w, 4);\t\t/* WIDTH */\n\tl_current_ihdr_ptr+=4;\n\t\n\topj_write_bytes(l_current_ihdr_ptr, jp2->numcomps, 2);\t\t/* NC */\n\tl_current_ihdr_ptr+=2;\n\t\n\topj_write_bytes(l_current_ihdr_ptr, jp2->bpc, 1);\t\t/* BPC */\n\t++l_current_ihdr_ptr;\n\t\n\topj_write_bytes(l_current_ihdr_ptr, jp2->C, 1);\t\t/* C : Always 7 */\n\t++l_current_ihdr_ptr;\n\t\n\topj_write_bytes(l_current_ihdr_ptr, jp2->UnkC, 1);\t\t/* UnkC, colorspace unknown */\n\t++l_current_ihdr_ptr;\n\t\n\topj_write_bytes(l_current_ihdr_ptr, jp2->IPR, 1);\t\t/* IPR, no intellectual property */\n\t++l_current_ihdr_ptr;\n\t\n\t*p_nb_bytes_written = 22;\n\t\n\treturn l_ihdr_data;\n}\n\nOPJ_BYTE * opj_jp2_write_bpcc(\topj_jp2_t *jp2,\n\t\t\t\t\t\t        OPJ_UINT32 * p_nb_bytes_written\n                                )\n{\n\tOPJ_UINT32 i;\n\t/* room for 8 bytes for box and 1 byte for each component */\n\tOPJ_UINT32 l_bpcc_size = 8 + jp2->numcomps;\n\tOPJ_BYTE * l_bpcc_data,* l_current_bpcc_ptr;\n\t\n\t/* preconditions */\n\tassert(jp2 != 00);\n\tassert(p_nb_bytes_written != 00);\n\n\tl_bpcc_data = (OPJ_BYTE *) opj_malloc(l_bpcc_size);\n\tif (l_bpcc_data == 00) {\n\t\treturn 00;\n\t}\n\tmemset(l_bpcc_data,0,l_bpcc_size);\n\n\tl_current_bpcc_ptr = l_bpcc_data;\n\n\topj_write_bytes(l_current_bpcc_ptr,l_bpcc_size,4);\t\t\t\t/* write box size */\n\tl_current_bpcc_ptr += 4;\n\t\n\topj_write_bytes(l_current_bpcc_ptr,JP2_BPCC,4);\t\t\t\t\t/* BPCC */\n\tl_current_bpcc_ptr += 4;\n\n\tfor (i = 0; i < jp2->numcomps; ++i)  {\n\t\topj_write_bytes(l_current_bpcc_ptr, jp2->comps[i].bpcc, 1); /* write each component information */\n\t\t++l_current_bpcc_ptr;\n\t}\n\n\t*p_nb_bytes_written = l_bpcc_size;\n\t\n\treturn l_bpcc_data;\n}\n\nOPJ_BOOL opj_jp2_read_bpcc( opj_jp2_t *jp2,\n                            OPJ_BYTE * p_bpc_header_data,\n                            OPJ_UINT32 p_bpc_header_size,\n                            opj_event_mgr_t * p_manager\n                            )\n{\n\tOPJ_UINT32 i;\n\n\t/* preconditions */\n\tassert(p_bpc_header_data != 00);\n\tassert(jp2 != 00);\n\tassert(p_manager != 00);\n\n\t\n\tif (jp2->bpc != 255 ){\n\t\topj_event_msg(p_manager, EVT_WARNING, \"A BPCC header box is available although BPC given by the IHDR box (%d) indicate components bit depth is constant\\n\",jp2->bpc);\n\t}\n\n\t/* and length is relevant */\n\tif (p_bpc_header_size != jp2->numcomps) {\n\t\topj_event_msg(p_manager, EVT_ERROR, \"Bad BPCC header box (bad size)\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\n\t/* read info for each component */\n\tfor (i = 0; i < jp2->numcomps; ++i) {\n\t\topj_read_bytes(p_bpc_header_data,&jp2->comps[i].bpcc ,1);\t/* read each BPCC component */\n\t\t++p_bpc_header_data;\n\t}\n\n\treturn OPJ_TRUE;\n}\n\nOPJ_BYTE * opj_jp2_write_colr(  opj_jp2_t *jp2,\n\t\t\t\t\t\t\t    OPJ_UINT32 * p_nb_bytes_written\n                                )\n{\n\t/* room for 8 bytes for box 3 for common data and variable upon profile*/\n\tOPJ_UINT32 l_colr_size = 11;\n\tOPJ_BYTE * l_colr_data,* l_current_colr_ptr;\n\t\n\t/* preconditions */\n\tassert(jp2 != 00);\n\tassert(p_nb_bytes_written != 00);\n    assert(jp2->meth == 1 || jp2->meth == 2);\n\n\tswitch (jp2->meth) { \n\t\tcase 1 :\n\t\t\tl_colr_size += 4; /* EnumCS */\n\t\t\tbreak;\n\t\tcase 2 :\n            assert(jp2->color.icc_profile_len);\t/* ICC profile */\n            l_colr_size += jp2->color.icc_profile_len;\n\t\t\tbreak;\n\t\tdefault :\n\t\t\treturn 00;\n\t}\n\n\tl_colr_data = (OPJ_BYTE *) opj_malloc(l_colr_size);\n\tif (l_colr_data == 00) {\n\t\treturn 00;\n\t}\n\tmemset(l_colr_data,0,l_colr_size);\n\t\n\tl_current_colr_ptr = l_colr_data;\n\n\topj_write_bytes(l_current_colr_ptr,l_colr_size,4);\t\t\t\t/* write box size */\n\tl_current_colr_ptr += 4;\n\t\n\topj_write_bytes(l_current_colr_ptr,JP2_COLR,4);\t\t\t\t\t/* BPCC */\n\tl_current_colr_ptr += 4;\n\t\n\topj_write_bytes(l_current_colr_ptr, jp2->meth,1);\t\t\t\t/* METH */\n\t++l_current_colr_ptr;\n\t\n\topj_write_bytes(l_current_colr_ptr, jp2->precedence,1);\t\t\t/* PRECEDENCE */\n\t++l_current_colr_ptr;\n\t\n\topj_write_bytes(l_current_colr_ptr, jp2->approx,1);\t\t\t\t/* APPROX */\n\t++l_current_colr_ptr;\n\t\n\tif (jp2->meth == 1) { /* Meth value is restricted to 1 or 2 (Table I.9 of part 1) */\n        opj_write_bytes(l_current_colr_ptr, jp2->enumcs,4); }       /* EnumCS */\n    else {\n        if (jp2->meth == 2) {                                      /* ICC profile */\n            OPJ_UINT32 i;\n            for(i = 0; i < jp2->color.icc_profile_len; ++i) {\n                opj_write_bytes(l_current_colr_ptr, jp2->color.icc_profile_buf[i], 1);\n                ++l_current_colr_ptr;\n            }\n        }\n\t}\n\n\t*p_nb_bytes_written = l_colr_size;\n\t\n\treturn l_colr_data;\n}\n\nvoid opj_jp2_free_pclr(opj_jp2_color_t *color)\n{\n    opj_free(color->jp2_pclr->channel_sign);\n    opj_free(color->jp2_pclr->channel_size);\n    opj_free(color->jp2_pclr->entries);\n\n\tif(color->jp2_pclr->cmap) opj_free(color->jp2_pclr->cmap);\n\n    opj_free(color->jp2_pclr); color->jp2_pclr = NULL;\n}\n\nstatic OPJ_BOOL opj_jp2_check_color(opj_image_t *image, opj_jp2_color_t *color, opj_event_mgr_t *p_manager)\n{\n\tOPJ_UINT16 i;\n\n\t/* testcase 4149.pdf.SIGSEGV.cf7.3501 */\n\tif (color->jp2_cdef) {\n\t\topj_jp2_cdef_info_t *info = color->jp2_cdef->info;\n\t\tOPJ_UINT16 n = color->jp2_cdef->n;\n\n\t\tfor (i = 0; i < n; i++) {\n\t\t\tif (info[i].cn >= image->numcomps) {\n\t\t\t\topj_event_msg(p_manager, EVT_ERROR, \"Invalid component index %d (>= %d).\\n\", info[i].cn, image->numcomps);\n\t\t\t\treturn OPJ_FALSE;\n\t\t\t}\n\t\t\tif (info[i].asoc > 0 && (OPJ_UINT32)(info[i].asoc - 1) >= image->numcomps) {\n\t\t\t\topj_event_msg(p_manager, EVT_ERROR, \"Invalid component index %d (>= %d).\\n\", info[i].asoc - 1, image->numcomps);\n\t\t\t\treturn OPJ_FALSE;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* testcases 451.pdf.SIGSEGV.f4c.3723, 451.pdf.SIGSEGV.5b5.3723 and\n\t   66ea31acbb0f23a2bbc91f64d69a03f5_signal_sigsegv_13937c0_7030_5725.pdf */\n\tif (color->jp2_pclr && color->jp2_pclr->cmap) {\n\t\tOPJ_UINT16 nr_channels = color->jp2_pclr->nr_channels;\n\t\topj_jp2_cmap_comp_t *cmap = color->jp2_pclr->cmap;\n\t\tOPJ_BOOL *pcol_usage, is_sane = OPJ_TRUE;\n\n\t\t/* verify that all original components match an existing one */\n\t\tfor (i = 0; i < nr_channels; i++) {\n\t\t\tif (cmap[i].cmp >= image->numcomps) {\n\t\t\t\topj_event_msg(p_manager, EVT_ERROR, \"Invalid component index %d (>= %d).\\n\", cmap[i].cmp, image->numcomps);\n\t\t\t\tis_sane = OPJ_FALSE;\n\t\t\t}\n\t\t}\n\n\t\tpcol_usage = opj_calloc(nr_channels, sizeof(OPJ_BOOL));\n\t\tif (!pcol_usage) {\n\t\t\topj_event_msg(p_manager, EVT_ERROR, \"Unexpected OOM.\\n\");\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\t\t/* verify that no component is targeted more than once */\n\t\tfor (i = 0; i < nr_channels; i++) {\n      OPJ_UINT16 pcol = cmap[i].pcol;\n      assert(cmap[i].mtyp == 0 || cmap[i].mtyp == 1);\n\t\t\tif (pcol >= nr_channels) {\n\t\t\t\topj_event_msg(p_manager, EVT_ERROR, \"Invalid component/palette index for direct mapping %d.\\n\", pcol);\n\t\t\t\tis_sane = OPJ_FALSE;\n\t\t\t}\n\t\t\telse if (pcol_usage[pcol] && cmap[i].mtyp == 1) {\n\t\t\t\topj_event_msg(p_manager, EVT_ERROR, \"Component %d is mapped twice.\\n\", pcol);\n\t\t\t\tis_sane = OPJ_FALSE;\n\t\t\t}\n      else if (cmap[i].mtyp == 0 && cmap[i].pcol != 0) {\n        /* I.5.3.5 PCOL: If the value of the MTYP field for this channel is 0, then\n         * the value of this field shall be 0. */\n\t\t\t\topj_event_msg(p_manager, EVT_ERROR, \"Direct use at #%d however pcol=%d.\\n\", i, pcol);\n\t\t\t\tis_sane = OPJ_FALSE;\n      }\n\t\t\telse\n\t\t\t\tpcol_usage[pcol] = OPJ_TRUE;\n\t\t}\n\t\t/* verify that all components are targeted at least once */\n\t\tfor (i = 0; i < nr_channels; i++) {\n\t\t\tif (!pcol_usage[i] && cmap[i].mtyp != 0) {\n\t\t\t\topj_event_msg(p_manager, EVT_ERROR, \"Component %d doesn't have a mapping.\\n\", i);\n\t\t\t\tis_sane = OPJ_FALSE;\n\t\t\t}\n\t\t}\n\t\topj_free(pcol_usage);\n\t\tif (!is_sane) {\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\t}\n\n\treturn OPJ_TRUE;\n}\n\n/* file9.jp2 */\nvoid opj_jp2_apply_pclr(opj_image_t *image, opj_jp2_color_t *color)\n{\n\topj_image_comp_t *old_comps, *new_comps;\n\tOPJ_BYTE *channel_size, *channel_sign;\n\tOPJ_UINT32 *entries;\n\topj_jp2_cmap_comp_t *cmap;\n\tOPJ_INT32 *src, *dst;\n\tOPJ_UINT32 j, max;\n\tOPJ_UINT16 i, nr_channels, cmp, pcol;\n\tOPJ_INT32 k, top_k;\n\n\tchannel_size = color->jp2_pclr->channel_size;\n\tchannel_sign = color->jp2_pclr->channel_sign;\n\tentries = color->jp2_pclr->entries;\n\tcmap = color->jp2_pclr->cmap;\n\tnr_channels = color->jp2_pclr->nr_channels;\n\n\told_comps = image->comps;\n\tnew_comps = (opj_image_comp_t*)\n\t\t\topj_malloc(nr_channels * sizeof(opj_image_comp_t));\n\n\tfor(i = 0; i < nr_channels; ++i) {\n\t\tpcol = cmap[i].pcol; cmp = cmap[i].cmp;\n\n\t\t/* Direct use */\n    if(cmap[i].mtyp == 0){\n      assert( pcol == 0 );\n      new_comps[i] = old_comps[cmp];\n    } else {\n      assert( i == pcol );\n      new_comps[pcol] = old_comps[cmp];\n    }\n\n\t\t/* Palette mapping: */\n\t\tnew_comps[i].data = (OPJ_INT32*)\n\t\t\t\topj_malloc(old_comps[cmp].w * old_comps[cmp].h * sizeof(OPJ_INT32));\n\t\tnew_comps[i].prec = channel_size[i];\n\t\tnew_comps[i].sgnd = channel_sign[i];\n\t}\n\n\ttop_k = color->jp2_pclr->nr_entries - 1;\n\n\tfor(i = 0; i < nr_channels; ++i) {\n\t\t/* Palette mapping: */\n\t\tcmp = cmap[i].cmp; pcol = cmap[i].pcol;\n\t\tsrc = old_comps[cmp].data;\n    assert( src );\n\t\tmax = new_comps[pcol].w * new_comps[pcol].h;\n\n\t\t/* Direct use: */\n    if(cmap[i].mtyp == 0) {\n      assert( cmp == 0 );\n      dst = new_comps[i].data;\n      assert( dst );\n      for(j = 0; j < max; ++j) {\n        dst[j] = src[j];\n      }\n    }\n    else {\n      assert( i == pcol );\n      dst = new_comps[pcol].data;\n      assert( dst );\n      for(j = 0; j < max; ++j) {\n        /* The index */\n        if((k = src[j]) < 0) k = 0; else if(k > top_k) k = top_k;\n\n        /* The colour */\n        dst[j] = (OPJ_INT32)entries[k * nr_channels + pcol];\n        }\n    }\n\t}\n\n\tmax = image->numcomps;\n\tfor(i = 0; i < max; ++i) {\n\t\tif(old_comps[i].data) opj_free(old_comps[i].data);\n\t}\n\n\topj_free(old_comps);\n\timage->comps = new_comps;\n\timage->numcomps = nr_channels;\n\n\topj_jp2_free_pclr(color);\n\n}/* apply_pclr() */\n\nOPJ_BOOL opj_jp2_read_pclr(\topj_jp2_t *jp2,\n                            OPJ_BYTE * p_pclr_header_data,\n                            OPJ_UINT32 p_pclr_header_size,\n                            opj_event_mgr_t * p_manager\n                            )\n{\n\topj_jp2_pclr_t *jp2_pclr;\n\tOPJ_BYTE *channel_size, *channel_sign;\n\tOPJ_UINT32 *entries;\n\tOPJ_UINT16 nr_entries,nr_channels;\n\tOPJ_UINT16 i, j;\n\tOPJ_UINT32 l_value;\n\tOPJ_BYTE *orig_header_data = p_pclr_header_data;\n\n\t/* preconditions */\n\tassert(p_pclr_header_data != 00);\n\tassert(jp2 != 00);\n\tassert(p_manager != 00);\n    (void)p_pclr_header_size;\n\n\tif(jp2->color.jp2_pclr)\n\t\treturn OPJ_FALSE;\n\n\tif (p_pclr_header_size < 3)\n\t\treturn OPJ_FALSE;\n\n\topj_read_bytes(p_pclr_header_data, &l_value , 2);\t/* NE */\n\tp_pclr_header_data += 2;\n\tnr_entries = (OPJ_UINT16) l_value;\n\n\topj_read_bytes(p_pclr_header_data, &l_value , 1);\t/* NPC */\n\t++p_pclr_header_data;\n\tnr_channels = (OPJ_UINT16) l_value;\n\n\tif (p_pclr_header_size < 3 + (OPJ_UINT32)nr_channels || nr_channels == 0 || nr_entries >= (OPJ_UINT32)-1 / nr_channels)\n\t\treturn OPJ_FALSE;\n\n\tentries = (OPJ_UINT32*) opj_malloc((size_t)nr_channels * nr_entries * sizeof(OPJ_UINT32));\n    if (!entries)\n        return OPJ_FALSE;\n\tchannel_size = (OPJ_BYTE*) opj_malloc(nr_channels);\n    if (!channel_size)\n    {\n        opj_free(entries);\n        return OPJ_FALSE;\n    }\n\tchannel_sign = (OPJ_BYTE*) opj_malloc(nr_channels);\n\tif (!channel_sign)\n\t{\n        opj_free(entries);\n        opj_free(channel_size);\n        return OPJ_FALSE;\n\t}\n\n\tjp2_pclr = (opj_jp2_pclr_t*)opj_malloc(sizeof(opj_jp2_pclr_t));\n    if (!jp2_pclr)\n    {\n        opj_free(entries);\n        opj_free(channel_size);\n        opj_free(channel_sign);\n        return OPJ_FALSE;\n    }\n\n\tjp2_pclr->channel_sign = channel_sign;\n\tjp2_pclr->channel_size = channel_size;\n\tjp2_pclr->entries = entries;\n\tjp2_pclr->nr_entries = nr_entries;\n\tjp2_pclr->nr_channels = (OPJ_BYTE) l_value;\n\tjp2_pclr->cmap = NULL;\n\n\tjp2->color.jp2_pclr = jp2_pclr;\n\n\tfor(i = 0; i < nr_channels; ++i) {\n\t\topj_read_bytes(p_pclr_header_data, &l_value , 1);\t/* Bi */\n\t\t++p_pclr_header_data;\n\n\t\tchannel_size[i] = (OPJ_BYTE)((l_value & 0x7f) + 1);\n\t\tchannel_sign[i] = (l_value & 0x80) ? 1 : 0;\n\t}\n\n\tfor(j = 0; j < nr_entries; ++j) {\n\t\tfor(i = 0; i < nr_channels; ++i) {\n\t\t\tOPJ_UINT32 bytes_to_read = (OPJ_UINT32)((channel_size[i]+7)>>3);\n\n\t\t\tif (bytes_to_read > sizeof(OPJ_UINT32))\n\t\t\t\tbytes_to_read = sizeof(OPJ_UINT32);\n\t\t\tif ((ptrdiff_t)p_pclr_header_size < p_pclr_header_data - orig_header_data + (ptrdiff_t)bytes_to_read)\n\t\t\t\treturn OPJ_FALSE;\n\n\t\t\topj_read_bytes(p_pclr_header_data, &l_value , bytes_to_read);\t/* Cji */\n\t\t\tp_pclr_header_data += bytes_to_read;\n\t\t\t*entries = (OPJ_UINT32) l_value;\n\t\t\tentries++;\n\t\t}\n\t}\n\n\treturn OPJ_TRUE;\n}\n\nOPJ_BOOL opj_jp2_read_cmap(\topj_jp2_t * jp2,\n                            OPJ_BYTE * p_cmap_header_data,\n                            OPJ_UINT32 p_cmap_header_size,\n                            opj_event_mgr_t * p_manager\n                            )\n{\n\topj_jp2_cmap_comp_t *cmap;\n\tOPJ_BYTE i, nr_channels;\n\tOPJ_UINT32 l_value;\n\n\t/* preconditions */\n\tassert(jp2 != 00);\n\tassert(p_cmap_header_data != 00);\n\tassert(p_manager != 00);\n    (void)p_cmap_header_size;\n\n\t/* Need nr_channels: */\n\tif(jp2->color.jp2_pclr == NULL) {\n\t\topj_event_msg(p_manager, EVT_ERROR, \"Need to read a PCLR box before the CMAP box.\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\n\t/* Part 1, I.5.3.5: 'There shall be at most one Component Mapping box\n\t * inside a JP2 Header box' :\n\t*/\n\tif(jp2->color.jp2_pclr->cmap) {\n\t\topj_event_msg(p_manager, EVT_ERROR, \"Only one CMAP box is allowed.\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\n\tnr_channels = jp2->color.jp2_pclr->nr_channels;\n\tif (p_cmap_header_size < (OPJ_UINT32)nr_channels * 4) {\n\t\topj_event_msg(p_manager, EVT_ERROR, \"Insufficient data for CMAP box.\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\n\tcmap = (opj_jp2_cmap_comp_t*) opj_malloc(nr_channels * sizeof(opj_jp2_cmap_comp_t));\n    if (!cmap)\n        return OPJ_FALSE;\n\n\n\tfor(i = 0; i < nr_channels; ++i) {\n\t\topj_read_bytes(p_cmap_header_data, &l_value, 2);\t\t\t/* CMP^i */\n\t\tp_cmap_header_data +=2;\n\t\tcmap[i].cmp = (OPJ_UINT16) l_value;\n\n\t\topj_read_bytes(p_cmap_header_data, &l_value, 1);\t\t\t/* MTYP^i */\n\t\t++p_cmap_header_data;\n\t\tcmap[i].mtyp = (OPJ_BYTE) l_value;\n\n\t\topj_read_bytes(p_cmap_header_data, &l_value, 1);\t\t\t/* PCOL^i */\n\t\t++p_cmap_header_data;\n\t\tcmap[i].pcol = (OPJ_BYTE) l_value;\n\t}\n\n\tjp2->color.jp2_pclr->cmap = cmap;\n\n\treturn OPJ_TRUE;\n}\n\nvoid opj_jp2_apply_cdef(opj_image_t *image, opj_jp2_color_t *color)\n{\n\topj_jp2_cdef_info_t *info;\n\tOPJ_UINT16 i, n, cn, asoc, acn;\n\n\tinfo = color->jp2_cdef->info;\n\tn = color->jp2_cdef->n;\n\n  for(i = 0; i < n; ++i)\n    {\n    /* WATCH: acn = asoc - 1 ! */\n    asoc = info[i].asoc;\n    if(asoc == 0 || asoc == 65535)\n      {\n      if (i < image->numcomps)\n        image->comps[i].alpha = info[i].typ;\n      continue;\n      }\n\n    cn = info[i].cn; \n    acn = (OPJ_UINT16)(asoc - 1);\n    if( cn >= image->numcomps || acn >= image->numcomps )\n      {\n      fprintf(stderr, \"cn=%d, acn=%d, numcomps=%d\\n\", cn, acn, image->numcomps);\n      continue;\n      }\n\n\t\tif(cn != acn)\n\t\t{\n\t\t\topj_image_comp_t saved;\n\n\t\t\tmemcpy(&saved, &image->comps[cn], sizeof(opj_image_comp_t));\n\t\t\tmemcpy(&image->comps[cn], &image->comps[acn], sizeof(opj_image_comp_t));\n\t\t\tmemcpy(&image->comps[acn], &saved, sizeof(opj_image_comp_t));\n\n\t\t\tinfo[i].asoc = (OPJ_UINT16)(cn + 1);\n\t\t\tinfo[acn].asoc = (OPJ_UINT16)(info[acn].cn + 1);\n\t\t}\n\n\t\timage->comps[cn].alpha = info[i].typ;\n\t}\n\n\tif(color->jp2_cdef->info) opj_free(color->jp2_cdef->info);\n\n\topj_free(color->jp2_cdef); color->jp2_cdef = NULL;\n\n}/* jp2_apply_cdef() */\n\nOPJ_BOOL opj_jp2_read_cdef(\topj_jp2_t * jp2,\n                            OPJ_BYTE * p_cdef_header_data,\n\t\t\t\t\t\t\tOPJ_UINT32 p_cdef_header_size,\n\t\t\t\t\t\t\topj_event_mgr_t * p_manager\n                            )\n{\n\topj_jp2_cdef_info_t *cdef_info;\n\tOPJ_UINT16 i;\n\tOPJ_UINT32 l_value;\n\n\t/* preconditions */\n\tassert(jp2 != 00);\n\tassert(p_cdef_header_data != 00);\n\tassert(p_manager != 00);\n    (void)p_cdef_header_size;\n\n\t/* Part 1, I.5.3.6: 'The shall be at most one Channel Definition box\n\t * inside a JP2 Header box.'*/\n\tif(jp2->color.jp2_cdef) return OPJ_FALSE;\n\n\tif (p_cdef_header_size < 2) {\n\t\topj_event_msg(p_manager, EVT_ERROR, \"Insufficient data for CDEF box.\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\n\topj_read_bytes(p_cdef_header_data,&l_value ,2);\t\t\t/* N */\n\tp_cdef_header_data+= 2;\n\n\tif ( (OPJ_UINT16)l_value == 0){ /* szukw000: FIXME */\n\t\topj_event_msg(p_manager, EVT_ERROR, \"Number of channel description is equal to zero in CDEF box.\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\n\tif (p_cdef_header_size < 2 + (OPJ_UINT32)(OPJ_UINT16)l_value * 6) {\n\t\topj_event_msg(p_manager, EVT_ERROR, \"Insufficient data for CDEF box.\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\n\tcdef_info = (opj_jp2_cdef_info_t*) opj_malloc(l_value * sizeof(opj_jp2_cdef_info_t));\n    if (!cdef_info)\n        return OPJ_FALSE;\n\n\tjp2->color.jp2_cdef = (opj_jp2_cdef_t*)opj_malloc(sizeof(opj_jp2_cdef_t));\n    if(!jp2->color.jp2_cdef)\n    {\n        opj_free(cdef_info);\n        return OPJ_FALSE;\n    }\n\tjp2->color.jp2_cdef->info = cdef_info;\n\tjp2->color.jp2_cdef->n = (OPJ_UINT16) l_value;\n\n\tfor(i = 0; i < jp2->color.jp2_cdef->n; ++i) {\n\t\topj_read_bytes(p_cdef_header_data, &l_value, 2);\t\t\t/* Cn^i */\n\t\tp_cdef_header_data +=2;\n\t\tcdef_info[i].cn = (OPJ_UINT16) l_value;\n\n\t\topj_read_bytes(p_cdef_header_data, &l_value, 2);\t\t\t/* Typ^i */\n\t\tp_cdef_header_data +=2;\n\t\tcdef_info[i].typ = (OPJ_UINT16) l_value;\n\n\t\topj_read_bytes(p_cdef_header_data, &l_value, 2);\t\t\t/* Asoc^i */\n\t\tp_cdef_header_data +=2;\n\t\tcdef_info[i].asoc = (OPJ_UINT16) l_value;\n   }\n\n\treturn OPJ_TRUE;\n}\n\nOPJ_BOOL opj_jp2_read_colr( opj_jp2_t *jp2,\n                            OPJ_BYTE * p_colr_header_data,\n                            OPJ_UINT32 p_colr_header_size,\n                            opj_event_mgr_t * p_manager\n                            )\n{\n\tOPJ_UINT32 l_value;\n\n\t/* preconditions */\n\tassert(jp2 != 00);\n\tassert(p_colr_header_data != 00);\n\tassert(p_manager != 00);\n\n\tif (p_colr_header_size < 3) {\n\t\topj_event_msg(p_manager, EVT_ERROR, \"Bad COLR header box (bad size)\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\n\t/* Part 1, I.5.3.3 : 'A conforming JP2 reader shall ignore all Colour\n\t * Specification boxes after the first.'\n\t*/\n\tif(jp2->color.jp2_has_colr) {\n\t\topj_event_msg(p_manager, EVT_INFO, \"A conforming JP2 reader shall ignore all Colour Specification boxes after the first, so we ignore this one.\\n\");\n\t\tp_colr_header_data += p_colr_header_size;\n\t\treturn OPJ_TRUE;\n\t}\n\n\topj_read_bytes(p_colr_header_data,&jp2->meth ,1);\t\t\t/* METH */\n\t++p_colr_header_data;\n\n\topj_read_bytes(p_colr_header_data,&jp2->precedence ,1);\t\t/* PRECEDENCE */\n\t++p_colr_header_data;\n\n\topj_read_bytes(p_colr_header_data,&jp2->approx ,1);\t\t\t/* APPROX */\n\t++p_colr_header_data;\n\n\tif (jp2->meth == 1) {\n\t\tif (p_colr_header_size > 7) {\n\t\t\t/* testcase Altona_Technical_v20_x4.pdf */\n\t\t\topj_event_msg(p_manager, EVT_WARNING, \"Bad COLR header box (bad size: %d)\\n\", p_colr_header_size);\n\t\t}\n\n\t\topj_read_bytes(p_colr_header_data,&jp2->enumcs ,4);\t\t\t/* EnumCS */\n        \n\t\tp_colr_header_data += 4;\n\n\t\tif(jp2->enumcs == 14)/* CIELab */\n\t\t{\n\t\t\tOPJ_UINT32 *cielab;\n\t\t\tOPJ_UINT32 rl, ol, ra, oa, rb, ob, il;\n\n\t\t\tcielab = (OPJ_UINT32*)opj_malloc(9 * sizeof(OPJ_UINT32));\n\t\t\tcielab[0] = 14; /* enumcs */\n\n\t\t\tif(p_colr_header_size == 7)/* default values */\n\t\t\t{\n\t\t\t\trl = ra = rb = ol = oa = ob = 0;\n\t\t\t\til = 0x00443530; /* D50 */\n\t\t\t\tcielab[1] = 0x44454600;/* DEF */\n\t\t\t}\n\t\t\telse if(p_colr_header_size == 35)\n\t\t\t{\n\t\t\t\topj_read_bytes(p_colr_header_data, &rl, 4);\n\t\t\t\tp_colr_header_data += 4;\n\t\t\t\topj_read_bytes(p_colr_header_data, &ol, 4);\n\t\t\t\tp_colr_header_data += 4;\n\t\t\t\topj_read_bytes(p_colr_header_data, &ra, 4);\n\t\t\t\tp_colr_header_data += 4;\n\t\t\t\topj_read_bytes(p_colr_header_data, &oa, 4);\n\t\t\t\tp_colr_header_data += 4;\n\t\t\t\topj_read_bytes(p_colr_header_data, &rb, 4);\n\t\t\t\tp_colr_header_data += 4;\n\t\t\t\topj_read_bytes(p_colr_header_data, &ob, 4);\n\t\t\t\tp_colr_header_data += 4;\n\t\t\t\topj_read_bytes(p_colr_header_data, &il, 4);\n\t\t\t\tp_colr_header_data += 4;\n\t\t\t\tcielab[1] = 0;\n\t\t\t}\n\t\t\tcielab[2] = rl; cielab[4] = ra; cielab[6] = rb;\n\t\t\tcielab[3] = ol; cielab[5] = oa; cielab[7] = ob;\n\t\t\tcielab[8] = il;\n\n\t\t\tjp2->color.icc_profile_buf = (unsigned char*)cielab;\n\t\t\tjp2->color.icc_profile_len = 0;\n\t\t}\n\n        jp2->color.jp2_has_colr = 1;\n\t}\n\telse if (jp2->meth == 2) {\n\t\t/* ICC profile */\n\t\tOPJ_INT32 it_icc_value = 0;\n\t\tOPJ_INT32 icc_len = (OPJ_INT32)p_colr_header_size - 3;\n\n\t\tjp2->color.icc_profile_len = (OPJ_UINT32)icc_len;\n\t\tjp2->color.icc_profile_buf = (OPJ_BYTE*) opj_malloc((size_t)icc_len);\n        if (!jp2->color.icc_profile_buf)\n        {\n            jp2->color.icc_profile_len = 0;\n            return OPJ_FALSE;\n        }\n\t\tmemset(jp2->color.icc_profile_buf, 0, (size_t)icc_len * sizeof(OPJ_BYTE));\n\n\t\tfor (it_icc_value = 0; it_icc_value < icc_len; ++it_icc_value)\n\t\t{\n\t\t\topj_read_bytes(p_colr_header_data,&l_value,1);\t\t/* icc values */\n\t\t\t++p_colr_header_data;\n\t\t\tjp2->color.icc_profile_buf[it_icc_value] = (OPJ_BYTE) l_value;\n\t\t}\n\t    \n        jp2->color.jp2_has_colr = 1;\n\t}\n\telse if (jp2->meth > 2)\n    {\n        /*\tISO/IEC 15444-1:2004 (E), Table I.9 ?Legal METH values:\n        conforming JP2 reader shall ignore the entire Colour Specification box.*/\n        opj_event_msg(p_manager, EVT_INFO, \"COLR BOX meth value is not a regular value (%d), \" \n            \"so we will ignore the entire Colour Specification box. \\n\", jp2->meth);\n    }\n    return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_jp2_decode(opj_jp2_t *jp2,\n                        opj_stream_private_t *p_stream,\n                        opj_image_t* p_image,\n                        opj_event_mgr_t * p_manager)\n{\n\tif (!p_image)\n\t\treturn OPJ_FALSE;\n\n\t/* J2K decoding */\n\tif( ! opj_j2k_decode(jp2->j2k, p_stream, p_image, p_manager) ) {\n\t\topj_event_msg(p_manager, EVT_ERROR, \"Failed to decode the codestream in the JP2 file\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\n    if (!jp2->ignore_pclr_cmap_cdef){\n\t    if (!opj_jp2_check_color(p_image, &(jp2->color), p_manager)) {\n\t\t    return OPJ_FALSE;\n\t    }\n\n\t    /* Set Image Color Space */\n\t    if (jp2->enumcs == 16)\n\t\t    p_image->color_space = OPJ_CLRSPC_SRGB;\n\t    else if (jp2->enumcs == 17)\n\t\t    p_image->color_space = OPJ_CLRSPC_GRAY;\n\t    else if (jp2->enumcs == 18)\n\t\t    p_image->color_space = OPJ_CLRSPC_SYCC;\n            else if (jp2->enumcs == 24)\n                    p_image->color_space = OPJ_CLRSPC_EYCC;\n\t    else\n\t\t    p_image->color_space = OPJ_CLRSPC_UNKNOWN;\n\n\t    /* Apply the color space if needed */\n\t    if(jp2->color.jp2_cdef) {\n\t\t    opj_jp2_apply_cdef(p_image, &(jp2->color));\n\t    }\n\n\t    if(jp2->color.jp2_pclr) {\n\t\t    /* Part 1, I.5.3.4: Either both or none : */\n\t\t    if( !jp2->color.jp2_pclr->cmap)\n\t\t\t    opj_jp2_free_pclr(&(jp2->color));\n\t\t    else\n\t\t\t\tif(!p_image->useColorSpace)\n\t\t\t    opj_jp2_apply_pclr(p_image, &(jp2->color));\n\t    }\n\n\t    if(jp2->color.icc_profile_buf) {\n\t\t    p_image->icc_profile_buf = jp2->color.icc_profile_buf;\n\t\t    p_image->icc_profile_len = jp2->color.icc_profile_len;\n\t\t    jp2->color.icc_profile_buf = NULL;\n\t    }\n    }\n\n\treturn OPJ_TRUE;\n}\n\nOPJ_BOOL opj_jp2_write_jp2h(opj_jp2_t *jp2,\n                            opj_stream_private_t *stream,\n                            opj_event_mgr_t * p_manager\n                            )\n{\n\topj_jp2_img_header_writer_handler_t l_writers [3];\n\topj_jp2_img_header_writer_handler_t * l_current_writer;\n\n\tOPJ_INT32 i, l_nb_pass;\n\t/* size of data for super box*/\n\tOPJ_UINT32 l_jp2h_size = 8;\n\tOPJ_BOOL l_result = OPJ_TRUE;\n\n\t/* to store the data of the super box */\n\tOPJ_BYTE l_jp2h_data [8];\n\t\n\t/* preconditions */\n\tassert(stream != 00);\n\tassert(jp2 != 00);\n\tassert(p_manager != 00);\n\n\tmemset(l_writers,0,sizeof(l_writers));\n\n\tif (jp2->bpc == 255) {\n\t\tl_nb_pass = 3;\n\t\tl_writers[0].handler = opj_jp2_write_ihdr;\n\t\tl_writers[1].handler = opj_jp2_write_bpcc;\n\t\tl_writers[2].handler = opj_jp2_write_colr;\n\t}\n\telse {\n\t\tl_nb_pass = 2;\n\t\tl_writers[0].handler = opj_jp2_write_ihdr;\n\t\tl_writers[1].handler = opj_jp2_write_colr;\n\t}\n\t\n\t/* write box header */\n\t/* write JP2H type */\n\topj_write_bytes(l_jp2h_data+4,JP2_JP2H,4);\n\n\tl_current_writer = l_writers;\n\tfor (i=0;i<l_nb_pass;++i) {\n\t\tl_current_writer->m_data = l_current_writer->handler(jp2,&(l_current_writer->m_size));\n\t\tif (l_current_writer->m_data == 00) {\n\t\t\topj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to hold JP2 Header data\\n\");\n\t\t\tl_result = OPJ_FALSE;\n\t\t\tbreak;\n\t\t}\n\n\t\tl_jp2h_size += l_current_writer->m_size;\n\t\t++l_current_writer;\n\t}\n\n\tif (! l_result) {\n\t\tl_current_writer = l_writers;\n\t\tfor (i=0;i<l_nb_pass;++i) {\n\t\t\tif (l_current_writer->m_data != 00) {\n\t\t\t\topj_free(l_current_writer->m_data );\n\t\t\t}\n\t\t\t++l_current_writer;\n\t\t}\n\n\t\treturn OPJ_FALSE;\n\t}\n\n\t/* write super box size */\n\topj_write_bytes(l_jp2h_data,l_jp2h_size,4);\n\t\n\t/* write super box data on stream */\n\tif (opj_stream_write_data(stream,l_jp2h_data,8,p_manager) != 8) {\n\t\topj_event_msg(p_manager, EVT_ERROR, \"Stream error while writing JP2 Header box\\n\");\n\t\tl_result = OPJ_FALSE;\n\t}\n\t\n\tif (l_result) {\n\t\tl_current_writer = l_writers;\n\t\tfor (i=0;i<l_nb_pass;++i) {\n\t\t\tif (opj_stream_write_data(stream,l_current_writer->m_data,l_current_writer->m_size,p_manager) != l_current_writer->m_size) {\n\t\t\t\topj_event_msg(p_manager, EVT_ERROR, \"Stream error while writing JP2 Header box\\n\");\n\t\t\t\tl_result = OPJ_FALSE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t++l_current_writer;\n\t\t}\n\t}\n\n\tl_current_writer = l_writers;\n\t\n\t/* cleanup */\n\tfor (i=0;i<l_nb_pass;++i) {\n\t\tif (l_current_writer->m_data != 00) {\n\t\t\topj_free(l_current_writer->m_data );\n\t\t}\n\t\t++l_current_writer;\n\t}\n\n\treturn l_result;\n}\n\nOPJ_BOOL opj_jp2_write_ftyp(opj_jp2_t *jp2,\n\t\t\t\t\t\t\topj_stream_private_t *cio,\n\t\t\t\t\t\t\topj_event_mgr_t * p_manager )\n{\n\tOPJ_UINT32 i;\n\tOPJ_UINT32 l_ftyp_size = 16 + 4 * jp2->numcl;\n\tOPJ_BYTE * l_ftyp_data, * l_current_data_ptr;\n\tOPJ_BOOL l_result;\n\n\t/* preconditions */\n\tassert(cio != 00);\n\tassert(jp2 != 00);\n\tassert(p_manager != 00);\n\n\tl_ftyp_data = (OPJ_BYTE *) opj_malloc(l_ftyp_size);\n\t\n\tif (l_ftyp_data == 00) {\n\t\topj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to handle ftyp data\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\n\tmemset(l_ftyp_data,0,l_ftyp_size);\n\n\tl_current_data_ptr = l_ftyp_data;\n\n\topj_write_bytes(l_current_data_ptr, l_ftyp_size,4); /* box size */\n\tl_current_data_ptr += 4;\n\n\topj_write_bytes(l_current_data_ptr, JP2_FTYP,4); /* FTYP */\n\tl_current_data_ptr += 4;\n\n\topj_write_bytes(l_current_data_ptr, jp2->brand,4); /* BR */\n\tl_current_data_ptr += 4;\n\n\topj_write_bytes(l_current_data_ptr, jp2->minversion,4); /* MinV */\n\tl_current_data_ptr += 4;\n\n\tfor (i = 0; i < jp2->numcl; i++)  {\n\t\topj_write_bytes(l_current_data_ptr, jp2->cl[i],4);\t/* CL */\n\t}\n\t\n\tl_result = (opj_stream_write_data(cio,l_ftyp_data,l_ftyp_size,p_manager) == l_ftyp_size);\n\tif (! l_result)\n\t{\n\t\topj_event_msg(p_manager, EVT_ERROR, \"Error while writing ftyp data to stream\\n\");\n\t}\n\n\topj_free(l_ftyp_data);\n\t\n\treturn l_result;\n}\n\nOPJ_BOOL opj_jp2_write_jp2c(opj_jp2_t *jp2,\n\t\t\t\t\t\t\topj_stream_private_t *cio,\n\t\t\t\t\t\t\topj_event_mgr_t * p_manager )\n{\n\tOPJ_OFF_T j2k_codestream_exit;\n\tOPJ_BYTE l_data_header [8];\n\t\n\t/* preconditions */\n\tassert(jp2 != 00);\n\tassert(cio != 00);\n\tassert(p_manager != 00);\n\tassert(opj_stream_has_seek(cio));\n\t\n\tj2k_codestream_exit = opj_stream_tell(cio);\n\topj_write_bytes(l_data_header,\n                    (OPJ_UINT32) (j2k_codestream_exit - jp2->j2k_codestream_offset),\n                    4); /* size of codestream */\n\topj_write_bytes(l_data_header + 4,JP2_JP2C,4);\t\t\t\t\t\t\t\t\t   /* JP2C */\n\n\tif (! opj_stream_seek(cio,jp2->j2k_codestream_offset,p_manager)) {\n\t\topj_event_msg(p_manager, EVT_ERROR, \"Failed to seek in the stream.\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\t\n\tif (opj_stream_write_data(cio,l_data_header,8,p_manager) != 8) {\n\t\topj_event_msg(p_manager, EVT_ERROR, \"Failed to seek in the stream.\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\n\tif (! opj_stream_seek(cio,j2k_codestream_exit,p_manager)) {\n\t\topj_event_msg(p_manager, EVT_ERROR, \"Failed to seek in the stream.\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\n\treturn OPJ_TRUE;\n}\n\nOPJ_BOOL opj_jp2_write_jp(\topj_jp2_t *jp2,\n\t\t\t    \t\t    opj_stream_private_t *cio,\n\t\t\t\t    \t\topj_event_mgr_t * p_manager )\n{\n\t/* 12 bytes will be read */\n\tOPJ_BYTE l_signature_data [12];\n\n\t/* preconditions */\n\tassert(cio != 00);\n\tassert(jp2 != 00);\n\tassert(p_manager != 00);\n\n\t/* write box length */\n\topj_write_bytes(l_signature_data,12,4);\n\t/* writes box type */\n\topj_write_bytes(l_signature_data+4,JP2_JP,4);\n\t/* writes magic number*/\n\topj_write_bytes(l_signature_data+8,0x0d0a870a,4);\n\t\n\tif (opj_stream_write_data(cio,l_signature_data,12,p_manager) != 12) {\n\t\treturn OPJ_FALSE;\n\t}\n\n\treturn OPJ_TRUE;\n}\n\n/* ----------------------------------------------------------------------- */\n/* JP2 decoder interface                                             */\n/* ----------------------------------------------------------------------- */\n\nvoid opj_jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters)\n{\n\t/* setup the J2K codec */\n\topj_j2k_setup_decoder(jp2->j2k, parameters);\n\n\t/* further JP2 initializations go here */\n\tjp2->color.jp2_has_colr = 0;\n    jp2->ignore_pclr_cmap_cdef = parameters->flags & OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG;\n}\n\n/* ----------------------------------------------------------------------- */\n/* JP2 encoder interface                                             */\n/* ----------------------------------------------------------------------- */\n\nvoid opj_jp2_setup_encoder(\topj_jp2_t *jp2,\n                            opj_cparameters_t *parameters,\n                            opj_image_t *image,\n                            opj_event_mgr_t * p_manager)\n{\n    OPJ_UINT32 i;\n\tOPJ_UINT32 depth_0;\n  OPJ_UINT32 sign;\n\n\tif(!jp2 || !parameters || !image)\n\t\treturn;\n\n\t/* setup the J2K codec */\n\t/* ------------------- */\n\n\t/* Check if number of components respects standard */\n\tif (image->numcomps < 1 || image->numcomps > 16384) {\n\t\topj_event_msg(p_manager, EVT_ERROR, \"Invalid number of components specified while setting up JP2 encoder\\n\");\n\t\treturn;\n\t}\n\n\topj_j2k_setup_encoder(jp2->j2k, parameters, image, p_manager );\n\n\t/* setup the JP2 codec */\n\t/* ------------------- */\n\t\n\t/* Profile box */\n\n\tjp2->brand = JP2_JP2;\t/* BR */\n\tjp2->minversion = 0;\t/* MinV */\n\tjp2->numcl = 1;\n\tjp2->cl = (OPJ_UINT32*) opj_malloc(jp2->numcl * sizeof(OPJ_UINT32));\n    if (!jp2->cl){\n        jp2->cl = NULL;\n        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory when setup the JP2 encoder\\n\");\n        return;\n    }\n\tjp2->cl[0] = JP2_JP2;\t/* CL0 : JP2 */\n\n\t/* Image Header box */\n\n\tjp2->numcomps = image->numcomps;\t/* NC */\n\tjp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t));\n    if (!jp2->comps) {\n        jp2->comps = NULL;\n        opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory when setup the JP2 encoder\\n\");\n        return;\n    }\n\n\tjp2->h = image->y1 - image->y0;\t\t/* HEIGHT */\n\tjp2->w = image->x1 - image->x0;\t\t/* WIDTH */\n\t/* BPC */\n\tdepth_0 = image->comps[0].prec - 1;\n\tsign = image->comps[0].sgnd;\n\tjp2->bpc = depth_0 + (sign << 7);\n\tfor (i = 1; i < image->numcomps; i++) {\n\t\tOPJ_UINT32 depth = image->comps[i].prec - 1;\n\t\tsign = image->comps[i].sgnd;\n\t\tif (depth_0 != depth)\n\t\t\tjp2->bpc = 255;\n\t}\n\tjp2->C = 7;\t\t\t/* C : Always 7 */\n\tjp2->UnkC = 0;\t\t/* UnkC, colorspace specified in colr box */\n\tjp2->IPR = 0;\t\t/* IPR, no intellectual property */\n\t\n\t/* BitsPerComponent box */\n\tfor (i = 0; i < image->numcomps; i++) {\n\t\tjp2->comps[i].bpcc = image->comps[i].prec - 1 + (image->comps[i].sgnd << 7);\n\t}\n\n\t/* Colour Specification box */\n    if(image->icc_profile_len) {\n        jp2->meth = 2;\n        jp2->enumcs = 0;\n    } \n    else {\n        jp2->meth = 1;\n        if (image->color_space == 1)\n            jp2->enumcs = 16;\t/* sRGB as defined by IEC 61966-2-1 */\n        else if (image->color_space == 2)\n            jp2->enumcs = 17;\t/* greyscale */\n        else if (image->color_space == 3)\n            jp2->enumcs = 18;\t/* YUV */\n    }\n\n\n\tjp2->precedence = 0;\t/* PRECEDENCE */\n\tjp2->approx = 0;\t\t/* APPROX */\n\n\tjp2->jpip_on = parameters->jpip_on;\n}\n\nOPJ_BOOL opj_jp2_encode(opj_jp2_t *jp2,\n\t\t\t\t\t\topj_stream_private_t *stream,\n\t\t\t\t\t\topj_event_mgr_t * p_manager)\n{\n\treturn opj_j2k_encode(jp2->j2k, stream, p_manager);\n}\n\nOPJ_BOOL opj_jp2_end_decompress(opj_jp2_t *jp2,\n                                opj_stream_private_t *cio,\n                                opj_event_mgr_t * p_manager\n                                )\n{\n\t/* preconditions */\n\tassert(jp2 != 00);\n\tassert(cio != 00);\n\tassert(p_manager != 00);\n\n\t/* customization of the end encoding */\n\topj_jp2_setup_end_header_reading(jp2);\n\n\t/* write header */\n\tif (! opj_jp2_exec (jp2,jp2->m_procedure_list,cio,p_manager)) {\n\t\treturn OPJ_FALSE;\n\t}\n\n\treturn opj_j2k_end_decompress(jp2->j2k, cio, p_manager);\n}\n\nOPJ_BOOL opj_jp2_end_compress(\topj_jp2_t *jp2,\n\t\t\t\t\t\t\t    opj_stream_private_t *cio,\n\t\t\t\t\t\t\t    opj_event_mgr_t * p_manager\n                                )\n{\n\t/* preconditions */\n\tassert(jp2 != 00);\n\tassert(cio != 00);\n\tassert(p_manager != 00);\n\n\t/* customization of the end encoding */\n\topj_jp2_setup_end_header_writing(jp2);\n\n\tif (! opj_j2k_end_compress(jp2->j2k,cio,p_manager)) {\n\t\treturn OPJ_FALSE;\n\t}\n\n\t/* write header */\n\treturn opj_jp2_exec(jp2,jp2->m_procedure_list,cio,p_manager);\n}\n\nvoid opj_jp2_setup_end_header_writing (opj_jp2_t *jp2)\n{\n\t/* preconditions */\n\tassert(jp2 != 00);\n\n#ifdef USE_JPIP\n  if( jp2->jpip_on )\n    opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jpip_write_iptr );\n#endif\n\topj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_write_jp2c );\n\t/* DEVELOPER CORNER, add your custom procedures */\n#ifdef USE_JPIP\n  if( jp2->jpip_on )\n    {\n    opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jpip_write_cidx );\n    opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jpip_write_fidx );\n    }\n#endif\n}\n\nvoid opj_jp2_setup_end_header_reading (opj_jp2_t *jp2)\n{\n\t/* preconditions */\n\tassert(jp2 != 00);\n\topj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_read_header_procedure );\n\t/* DEVELOPER CORNER, add your custom procedures */\n}\n\nOPJ_BOOL opj_jp2_default_validation (\topj_jp2_t * jp2,\n                                        opj_stream_private_t *cio,\n                                        opj_event_mgr_t * p_manager\n                                        )\n{\n\tOPJ_BOOL l_is_valid = OPJ_TRUE;\n\tOPJ_UINT32 i;\n\n\t/* preconditions */\n\tassert(jp2 != 00);\n\tassert(cio != 00);\n\tassert(p_manager != 00);\n\n\t/* JPEG2000 codec validation */\n\n\t/* STATE checking */\n\t/* make sure the state is at 0 */\n\tl_is_valid &= (jp2->jp2_state == JP2_STATE_NONE);\n\n\t/* make sure not reading a jp2h ???? WEIRD */\n\tl_is_valid &= (jp2->jp2_img_state == JP2_IMG_STATE_NONE);\n\n\t/* POINTER validation */\n\t/* make sure a j2k codec is present */\n\tl_is_valid &= (jp2->j2k != 00);\n\n\t/* make sure a procedure list is present */\n\tl_is_valid &= (jp2->m_procedure_list != 00);\n\n\t/* make sure a validation list is present */\n\tl_is_valid &= (jp2->m_validation_list != 00);\n\n\t/* PARAMETER VALIDATION */\n\t/* number of components */\n\tl_is_valid &= (jp2->numcl > 0);\n\t/* width */\n\tl_is_valid &= (jp2->h > 0);\n\t/* height */\n\tl_is_valid &= (jp2->w > 0);\n\t/* precision */\n\tfor (i = 0; i < jp2->numcomps; ++i)\t{\n\t\tl_is_valid &= (jp2->comps[i].bpcc > 0);\n\t}\n\n\t/* METH */\n\tl_is_valid &= ((jp2->meth > 0) && (jp2->meth < 3));\n\n\t/* stream validation */\n\t/* back and forth is needed */\n\tl_is_valid &= opj_stream_has_seek(cio);\n\n\treturn l_is_valid;\n}\n\nOPJ_BOOL opj_jp2_read_header_procedure(  opj_jp2_t *jp2,\n                                                opj_stream_private_t *stream,\n                                                opj_event_mgr_t * p_manager\n                                                )\n{\n\topj_jp2_box_t box;\n\tOPJ_UINT32 l_nb_bytes_read;\n\tconst opj_jp2_header_handler_t * l_current_handler;\n\tOPJ_UINT32 l_last_data_size = OPJ_BOX_SIZE;\n\tOPJ_UINT32 l_current_data_size;\n\tOPJ_BYTE * l_current_data = 00;\n\n\t/* preconditions */\n\tassert(stream != 00);\n\tassert(jp2 != 00);\n\tassert(p_manager != 00);\n\n\tl_current_data = (OPJ_BYTE*)opj_malloc(l_last_data_size);\n\n\tif (l_current_data == 00) {\n\t\topj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to handle jpeg2000 file header\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\tmemset(l_current_data, 0 , l_last_data_size);\n\n\twhile (opj_jp2_read_boxhdr(&box,&l_nb_bytes_read,stream,p_manager)) {\n\t\t/* is it the codestream box ? */\n\t\tif (box.type == JP2_JP2C) {\n\t\t\tif (jp2->jp2_state & JP2_STATE_HEADER) {\n\t\t\t\tjp2->jp2_state |= JP2_STATE_CODESTREAM;\n                                opj_free(l_current_data);\n\t\t\t\treturn OPJ_TRUE;\n\t\t\t}\n\t\t\telse {\n\t\t\t\topj_event_msg(p_manager, EVT_ERROR, \"bad placed jpeg codestream\\n\");\n\t\t\t\topj_free(l_current_data);\n\t\t\t\treturn OPJ_FALSE;\n\t\t\t}\n\t\t}\n\t\telse if\t(box.length == 0) {\n\t\t\topj_event_msg(p_manager, EVT_ERROR, \"Cannot handle box of undefined sizes\\n\");\n\t\t\topj_free(l_current_data);\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\t\t/* testcase 1851.pdf.SIGSEGV.ce9.948 */\n\t\t/* testcase K-5787457125613568 */\n\t\telse if\t(box.length < l_nb_bytes_read || box.length > opj_stream_get_number_byte_left(stream)) {\n\t\t\topj_event_msg(p_manager, EVT_ERROR, \"invalid box size %d (%x)\\n\", box.length, box.type);\n\t\t\topj_free(l_current_data);\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\n\t\tl_current_handler = opj_jp2_find_handler(box.type);\n\t\tl_current_data_size = box.length - l_nb_bytes_read;\n\n\t\tif (l_current_handler != 00) {\n\t\t\tif (l_current_data_size > l_last_data_size) {\n\t\t\t\tOPJ_BYTE* new_current_data = (OPJ_BYTE*)opj_realloc(l_current_data,l_current_data_size);\n\t\t\t\tif (!new_current_data) {\n\t\t\t\t\topj_free(l_current_data);\n                    opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to handle jpeg2000 box\\n\");\n\t\t\t\t\treturn OPJ_FALSE;\n\t\t\t\t}\n                l_current_data = new_current_data;\n\t\t\t\tl_last_data_size = l_current_data_size;\n\t\t\t}\n\n\t\t\tl_nb_bytes_read = (OPJ_UINT32)opj_stream_read_data(stream,l_current_data,l_current_data_size,p_manager);\n\t\t\tif (l_nb_bytes_read != l_current_data_size) {\n\t\t\t\topj_event_msg(p_manager, EVT_ERROR, \"Problem with reading JPEG2000 box, stream error\\n\");\n                opj_free(l_current_data);                \n\t\t\t\treturn OPJ_FALSE;\n\t\t\t}\n\n\t\t\tif (! l_current_handler->handler(jp2,l_current_data,l_current_data_size,p_manager)) {\n\t\t\t\topj_free(l_current_data);\n\t\t\t\treturn OPJ_FALSE;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tjp2->jp2_state |= JP2_STATE_UNKNOWN;\n\t\t\tif (opj_stream_skip(stream,l_current_data_size,p_manager) != l_current_data_size) {\n\t\t\t\topj_event_msg(p_manager, EVT_ERROR, \"Problem with skipping JPEG2000 box, stream error\\n\");\n\t\t\t\topj_free(l_current_data);\n\t\t\t\treturn OPJ_FALSE;\n\t\t\t}\n\t\t}\n\t}\n\n\topj_free(l_current_data);\n\n\treturn OPJ_TRUE;\n}\n\n/**\n * Excutes the given procedures on the given codec.\n *\n * @param\tp_procedure_list\tthe list of procedures to execute\n * @param\tjp2\t\t\t\t\tthe jpeg2000 file codec to execute the procedures on.\n * @param\tstream\t\t\t\t\tthe stream to execute the procedures on.\n * @param\tp_manager\t\t\tthe user manager.\n *\n * @return\ttrue\t\t\t\tif all the procedures were successfully executed.\n */\nstatic OPJ_BOOL opj_jp2_exec (  opj_jp2_t * jp2,\n                                opj_procedure_list_t * p_procedure_list,\n                                opj_stream_private_t *stream,\n                                opj_event_mgr_t * p_manager\n                                )\n\n{\n\tOPJ_BOOL (** l_procedure) (opj_jp2_t * jp2, opj_stream_private_t *, opj_event_mgr_t *) = 00;\n\tOPJ_BOOL l_result = OPJ_TRUE;\n\tOPJ_UINT32 l_nb_proc, i;\n\n\t/* preconditions */\n\tassert(p_procedure_list != 00);\n\tassert(jp2 != 00);\n\tassert(stream != 00);\n\tassert(p_manager != 00);\n\n\tl_nb_proc = opj_procedure_list_get_nb_procedures(p_procedure_list);\n\tl_procedure = (OPJ_BOOL (**) (opj_jp2_t * jp2, opj_stream_private_t *, opj_event_mgr_t *)) opj_procedure_list_get_first_procedure(p_procedure_list);\n\n\tfor\t(i=0;i<l_nb_proc;++i) {\n\t\tl_result = l_result && (*l_procedure) (jp2,stream,p_manager);\n\t\t++l_procedure;\n\t}\n\n\t/* and clear the procedure list at the end. */\n\topj_procedure_list_clear(p_procedure_list);\n\treturn l_result;\n}\n\nOPJ_BOOL opj_jp2_start_compress(opj_jp2_t *jp2,\n                                opj_stream_private_t *stream,\n                                opj_image_t * p_image,\n                                opj_event_mgr_t * p_manager\n                                )\n{\n\t/* preconditions */\n\tassert(jp2 != 00);\n\tassert(stream != 00);\n\tassert(p_manager != 00);\n\n\t/* customization of the validation */\n\topj_jp2_setup_encoding_validation (jp2);\n\n\t/* validation of the parameters codec */\n\tif (! opj_jp2_exec(jp2,jp2->m_validation_list,stream,p_manager)) {\n\t\treturn OPJ_FALSE;\n\t}\n\n\t/* customization of the encoding */\n\topj_jp2_setup_header_writing(jp2);\n\n\t/* write header */\n\tif (! opj_jp2_exec (jp2,jp2->m_procedure_list,stream,p_manager)) {\n\t\treturn OPJ_FALSE;\n\t}\n\n\treturn opj_j2k_start_compress(jp2->j2k,stream,p_image,p_manager);\n}\n\nconst opj_jp2_header_handler_t * opj_jp2_find_handler (OPJ_UINT32 p_id)\n{\n\tOPJ_UINT32 i, l_handler_size = sizeof(jp2_header) / sizeof(opj_jp2_header_handler_t);\n\n\tfor (i=0;i<l_handler_size;++i) {\n\t\tif (jp2_header[i].id == p_id) {\n\t\t\treturn &jp2_header[i];\n\t\t}\n\t}\n\treturn NULL;\n}\n\n/**\n * Finds the image execution function related to the given box id.\n *\n * @param\tp_id\tthe id of the handler to fetch.\n *\n * @return\tthe given handler or 00 if it could not be found.\n */\nstatic const opj_jp2_header_handler_t * opj_jp2_img_find_handler (OPJ_UINT32 p_id)\n{\n\tOPJ_UINT32 i, l_handler_size = sizeof(jp2_img_header) / sizeof(opj_jp2_header_handler_t);\n\tfor (i=0;i<l_handler_size;++i)\n\t{\n\t\tif (jp2_img_header[i].id == p_id) {\n\t\t\treturn &jp2_img_header[i];\n\t\t}\n\t}\n\n\treturn NULL;\n}\n\n/**\n * Reads a jpeg2000 file signature box.\n *\n * @param\tp_header_data\tthe data contained in the signature box.\n * @param\tjp2\t\t\t\tthe jpeg2000 file codec.\n * @param\tp_header_size\tthe size of the data contained in the signature box.\n * @param\tp_manager\t\tthe user event manager.\n *\n * @return true if the file signature box is valid.\n */\nstatic OPJ_BOOL opj_jp2_read_jp(opj_jp2_t *jp2,\n                                OPJ_BYTE * p_header_data,\n                                OPJ_UINT32 p_header_size,\n                                opj_event_mgr_t * p_manager\n                                )\n\n{\n\tOPJ_UINT32 l_magic_number;\n\n\t/* preconditions */\n\tassert(p_header_data != 00);\n\tassert(jp2 != 00);\n\tassert(p_manager != 00);\n\n\tif (jp2->jp2_state != JP2_STATE_NONE) {\n\t\topj_event_msg(p_manager, EVT_ERROR, \"The signature box must be the first box in the file.\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\n\t/* assure length of data is correct (4 -> magic number) */\n\tif (p_header_size != 4) {\n\t\topj_event_msg(p_manager, EVT_ERROR, \"Error with JP signature Box size\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\n\t/* rearrange data */\n\topj_read_bytes(p_header_data,&l_magic_number,4);\n\tif (l_magic_number != 0x0d0a870a ) {\n\t\topj_event_msg(p_manager, EVT_ERROR, \"Error with JP Signature : bad magic number\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\n\tjp2->jp2_state |= JP2_STATE_SIGNATURE;\n\n\treturn OPJ_TRUE;\n}\n\n/**\n * Reads a a FTYP box - File type box\n *\n * @param\tp_header_data\tthe data contained in the FTYP box.\n * @param\tjp2\t\t\t\tthe jpeg2000 file codec.\n * @param\tp_header_size\tthe size of the data contained in the FTYP box.\n * @param\tp_manager\t\tthe user event manager.\n *\n * @return true if the FTYP box is valid.\n */\nstatic OPJ_BOOL opj_jp2_read_ftyp(\topj_jp2_t *jp2,\n\t\t\t\t\t\t\t\t\tOPJ_BYTE * p_header_data,\n\t\t\t\t\t\t\t\t\tOPJ_UINT32 p_header_size,\n\t\t\t\t\t\t\t\t\topj_event_mgr_t * p_manager\n                                    )\n{\n\tOPJ_UINT32 i, l_remaining_bytes;\n\n\t/* preconditions */\n\tassert(p_header_data != 00);\n\tassert(jp2 != 00);\n\tassert(p_manager != 00);\n\n\tif (jp2->jp2_state != JP2_STATE_SIGNATURE) {\n\t\topj_event_msg(p_manager, EVT_ERROR, \"The ftyp box must be the second box in the file.\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\n\t/* assure length of data is correct */\n\tif (p_header_size < 8) {\n\t\topj_event_msg(p_manager, EVT_ERROR, \"Error with FTYP signature Box size\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\n\topj_read_bytes(p_header_data,&jp2->brand,4);\t\t/* BR */\n\tp_header_data += 4;\n\n\topj_read_bytes(p_header_data,&jp2->minversion,4);\t\t/* MinV */\n\tp_header_data += 4;\n\n\tl_remaining_bytes = p_header_size - 8;\n\n\t/* the number of remaining bytes should be a multiple of 4 */\n\tif ((l_remaining_bytes & 0x3) != 0) {\n\t\topj_event_msg(p_manager, EVT_ERROR, \"Error with FTYP signature Box size\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\n\t/* div by 4 */\n\tjp2->numcl = l_remaining_bytes >> 2;\n\tif (jp2->numcl) {\n\t\tjp2->cl = (OPJ_UINT32 *) opj_malloc(jp2->numcl * sizeof(OPJ_UINT32));\n\t\tif (jp2->cl == 00) {\n\t\t\topj_event_msg(p_manager, EVT_ERROR, \"Not enough memory with FTYP Box\\n\");\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\t\tmemset(jp2->cl,0,jp2->numcl * sizeof(OPJ_UINT32));\n\t}\n\n\tfor (i = 0; i < jp2->numcl; ++i)\n\t{\n\t\topj_read_bytes(p_header_data,&jp2->cl[i],4);\t\t/* CLi */\n\t\tp_header_data += 4;\n\t}\n\n\tjp2->jp2_state |= JP2_STATE_FILE_TYPE;\n\n\treturn OPJ_TRUE;\n}\n\nOPJ_BOOL opj_jp2_skip_jp2c(\topj_jp2_t *jp2,\n\t\t\t\t\t    \topj_stream_private_t *stream,\n\t\t\t\t\t    \topj_event_mgr_t * p_manager )\n{\n\t/* preconditions */\n\tassert(jp2 != 00);\n\tassert(stream != 00);\n\tassert(p_manager != 00);\n\n\tjp2->j2k_codestream_offset = opj_stream_tell(stream);\n\n\tif (opj_stream_skip(stream,8,p_manager) != 8) {\n\t\treturn OPJ_FALSE;\n\t}\n\n\treturn OPJ_TRUE;\n}\n\nstatic OPJ_BOOL opj_jpip_skip_iptr(\topj_jp2_t *jp2,\n  opj_stream_private_t *stream,\n  opj_event_mgr_t * p_manager )\n{\n  /* preconditions */\n  assert(jp2 != 00);\n  assert(stream != 00);\n  assert(p_manager != 00);\n\n  jp2->jpip_iptr_offset = opj_stream_tell(stream);\n\n  if (opj_stream_skip(stream,24,p_manager) != 24) {\n    return OPJ_FALSE;\n  }\n\n  return OPJ_TRUE;\n}\n\n/**\n * Reads the Jpeg2000 file Header box - JP2 Header box (warning, this is a super box).\n *\n * @param\tp_header_data\tthe data contained in the file header box.\n * @param\tjp2\t\t\t\tthe jpeg2000 file codec.\n * @param\tp_header_size\tthe size of the data contained in the file header box.\n * @param\tp_manager\t\tthe user event manager.\n *\n * @return true if the JP2 Header box was successfully reconized.\n*/\nstatic OPJ_BOOL opj_jp2_read_jp2h(  opj_jp2_t *jp2,\n                                    OPJ_BYTE *p_header_data,\n                                    OPJ_UINT32 p_header_size,\n                                    opj_event_mgr_t * p_manager\n                                    )\n{\n\tOPJ_UINT32 l_box_size=0, l_current_data_size = 0;\n\topj_jp2_box_t box;\n\tconst opj_jp2_header_handler_t * l_current_handler;\n\n\t/* preconditions */\n\tassert(p_header_data != 00);\n\tassert(jp2 != 00);\n\tassert(p_manager != 00);\n\n\t/* make sure the box is well placed */\n\tif ((jp2->jp2_state & JP2_STATE_FILE_TYPE) != JP2_STATE_FILE_TYPE ) {\n\t\topj_event_msg(p_manager, EVT_ERROR, \"The  box must be the first box in the file.\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\n\tjp2->jp2_img_state = JP2_IMG_STATE_NONE;\n\n\t/* iterate while remaining data */\n\twhile (p_header_size > 0) {\n\n\t\tif (! opj_jp2_read_boxhdr_char(&box,p_header_data,&l_box_size,p_header_size, p_manager)) {\n\t\t\topj_event_msg(p_manager, EVT_ERROR, \"Stream error while reading JP2 Header box\\n\");\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\n\t\tif (box.length > p_header_size) {\n\t\t\topj_event_msg(p_manager, EVT_ERROR, \"Stream error while reading JP2 Header box: box length is inconsistent.\\n\");\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\n\t\tl_current_handler = opj_jp2_img_find_handler(box.type);\n\t\t//BUGID:0055999\n\t\t//test file: fuzz-signal_sigsegv_6b88de_1123_2509.pdf\n\t\tif (box.length < l_box_size) return OPJ_FALSE;\n\t\tl_current_data_size = box.length - l_box_size;\n\t\tp_header_data += l_box_size;\n\n\t\tif (l_current_handler != 00) {\n\t\t\tif (! l_current_handler->handler(jp2,p_header_data,l_current_data_size,p_manager)) {\n\t\t\t\treturn OPJ_FALSE;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tjp2->jp2_img_state |= JP2_IMG_STATE_UNKNOWN;\n\t\t}\n\n\t\tp_header_data += l_current_data_size;\n\t\tp_header_size -= box.length;\n\t}\n\n\tjp2->jp2_state |= JP2_STATE_HEADER;\n\n\treturn OPJ_TRUE;\n}\n\nOPJ_BOOL opj_jp2_read_boxhdr_char(   opj_jp2_box_t *box,\n                                     OPJ_BYTE * p_data,\n                                     OPJ_UINT32 * p_number_bytes_read,\n                                     OPJ_UINT32 p_box_max_size,\n                                     opj_event_mgr_t * p_manager\n                                     )\n{\n\tOPJ_UINT32 l_value;\n\n\t/* preconditions */\n\tassert(p_data != 00);\n\tassert(box != 00);\n\tassert(p_number_bytes_read != 00);\n\tassert(p_manager != 00);\n\n\tif (p_box_max_size < 8) {\n\t\topj_event_msg(p_manager, EVT_ERROR, \"Cannot handle box of less than 8 bytes\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\n\t/* process read data */\n\topj_read_bytes(p_data, &l_value, 4);\n\tp_data += 4;\n\tbox->length = (OPJ_UINT32)(l_value);\n\n\topj_read_bytes(p_data, &l_value, 4);\n\tp_data += 4;\n\tbox->type = (OPJ_UINT32)(l_value);\n\n\t*p_number_bytes_read = 8;\n\n\t/* do we have a \"special very large box ?\" */\n\t/* read then the XLBox */\n\tif (box->length == 1) {\n\t\tOPJ_UINT32 l_xl_part_size;\n\n\t\tif (p_box_max_size < 16) {\n\t\t\topj_event_msg(p_manager, EVT_ERROR, \"Cannot handle XL box of less than 16 bytes\\n\");\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\n\t\topj_read_bytes(p_data,&l_xl_part_size, 4);\n\t\tp_data += 4;\n\t\t*p_number_bytes_read += 4;\n\n\t\tif (l_xl_part_size != 0) {\n\t\t\topj_event_msg(p_manager, EVT_ERROR, \"Cannot handle box sizes higher than 2^32\\n\");\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\n\t\topj_read_bytes(p_data, &l_value, 4);\n\t\t*p_number_bytes_read += 4;\n\t\tbox->length = (OPJ_UINT32)(l_value);\n\n\t\tif (box->length == 0) {\n\t\t\topj_event_msg(p_manager, EVT_ERROR, \"Cannot handle box of undefined sizes\\n\");\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\t}\n\telse if (box->length == 0) {\n\t\topj_event_msg(p_manager, EVT_ERROR, \"Cannot handle box of undefined sizes\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\n\treturn OPJ_TRUE;\n}\n\nOPJ_BOOL opj_jp2_read_header(\topj_stream_private_t *p_stream,\n                                opj_jp2_t *jp2,\n                                opj_image_t ** p_image,\n                                opj_event_mgr_t * p_manager\n                                )\n{\n\t/* preconditions */\n\tassert(jp2 != 00);\n\tassert(p_stream != 00);\n\tassert(p_manager != 00);\n\n\t/* customization of the validation */\n\topj_jp2_setup_decoding_validation (jp2);\n\n\t/* customization of the encoding */\n\topj_jp2_setup_header_reading(jp2);\n\n\t/* validation of the parameters codec */\n\tif (! opj_jp2_exec(jp2,jp2->m_validation_list,p_stream,p_manager)) {\n\t\treturn OPJ_FALSE;\n\t}\n\n\t/* read header */\n\tif (! opj_jp2_exec (jp2,jp2->m_procedure_list,p_stream,p_manager)) {\n\t\treturn OPJ_FALSE;\n\t}\n\n\treturn opj_j2k_read_header(\tp_stream,\n\t\t\t\t\t\t\tjp2->j2k,\n\t\t\t\t\t\t\tp_image,\n\t\t\t\t\t\t\tp_manager);\n}\n\nvoid opj_jp2_setup_encoding_validation (opj_jp2_t *jp2)\n{\n\t/* preconditions */\n\tassert(jp2 != 00);\n\n\topj_procedure_list_add_procedure(jp2->m_validation_list, (opj_procedure)opj_jp2_default_validation);\n\t/* DEVELOPER CORNER, add your custom validation procedure */\n}\n\nvoid opj_jp2_setup_decoding_validation (opj_jp2_t *jp2)\n{\n\t/* preconditions */\n\tassert(jp2 != 00);\n\t/* DEVELOPER CORNER, add your custom validation procedure */\n}\n\nvoid opj_jp2_setup_header_writing (opj_jp2_t *jp2)\n{\n\t/* preconditions */\n\tassert(jp2 != 00);\n\n\topj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_write_jp );\n\topj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_write_ftyp );\n\topj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_write_jp2h );\n  if( jp2->jpip_on )\n    opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jpip_skip_iptr );\n\topj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_skip_jp2c );\n\n\t/* DEVELOPER CORNER, insert your custom procedures */\n\n}\n\nvoid opj_jp2_setup_header_reading (opj_jp2_t *jp2)\n{\n\t/* preconditions */\n\tassert(jp2 != 00);\n\n\topj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_read_header_procedure );\n\t/* DEVELOPER CORNER, add your custom procedures */\n}\n\nOPJ_BOOL opj_jp2_read_tile_header ( opj_jp2_t * p_jp2,\n                                    OPJ_UINT32 * p_tile_index,\n                                    OPJ_UINT32 * p_data_size,\n                                    OPJ_INT32 * p_tile_x0,\n                                    OPJ_INT32 * p_tile_y0,\n                                    OPJ_INT32 * p_tile_x1,\n                                    OPJ_INT32 * p_tile_y1,\n                                    OPJ_UINT32 * p_nb_comps,\n                                    OPJ_BOOL * p_go_on,\n                                    opj_stream_private_t *p_stream,\n                                    opj_event_mgr_t * p_manager\n                                    )\n{\n\treturn opj_j2k_read_tile_header(p_jp2->j2k,\n\t\t\t\t\t\t\t\tp_tile_index,\n\t\t\t\t\t\t\t\tp_data_size,\n\t\t\t\t\t\t\t\tp_tile_x0, p_tile_y0,\n\t\t\t\t\t\t\t\tp_tile_x1, p_tile_y1,\n\t\t\t\t\t\t\t\tp_nb_comps,\n\t\t\t\t\t\t\t\tp_go_on,\n\t\t\t\t\t\t\t\tp_stream,\n\t\t\t\t\t\t\t\tp_manager);\n}\n\nOPJ_BOOL opj_jp2_write_tile (\topj_jp2_t *p_jp2,\n\t\t\t\t\t \t \t    OPJ_UINT32 p_tile_index,\n\t\t\t\t\t \t \t    OPJ_BYTE * p_data,\n\t\t\t\t\t \t \t    OPJ_UINT32 p_data_size,\n\t\t\t\t\t \t \t    opj_stream_private_t *p_stream,\n\t\t\t\t\t \t \t    opj_event_mgr_t * p_manager\n                                )\n\n{\n\treturn opj_j2k_write_tile (p_jp2->j2k,p_tile_index,p_data,p_data_size,p_stream,p_manager);\n}\n\nOPJ_BOOL opj_jp2_decode_tile (  opj_jp2_t * p_jp2,\n                                OPJ_UINT32 p_tile_index,\n                                OPJ_BYTE * p_data,\n                                OPJ_UINT32 p_data_size,\n                                opj_stream_private_t *p_stream,\n                                opj_event_mgr_t * p_manager\n                                )\n{\n\treturn opj_j2k_decode_tile (p_jp2->j2k,p_tile_index,p_data,p_data_size,p_stream,p_manager);\n}\n\nvoid opj_jp2_destroy(opj_jp2_t *jp2)\n{\n\tif (jp2) {\n\t\t/* destroy the J2K codec */\n\t\topj_j2k_destroy(jp2->j2k);\n\t\tjp2->j2k = 00;\n\n\t\tif (jp2->comps) {\n\t\t\topj_free(jp2->comps);\n\t\t\tjp2->comps = 00;\n\t\t}\n\n\t\tif (jp2->cl) {\n\t\t\topj_free(jp2->cl);\n\t\t\tjp2->cl = 00;\n\t\t}\n\n\t\tif (jp2->color.icc_profile_buf) {\n\t\t\topj_free(jp2->color.icc_profile_buf);\n\t\t\tjp2->color.icc_profile_buf = 00;\n\t\t}\n\n\t\tif (jp2->color.jp2_cdef) {\n\t\t\tif (jp2->color.jp2_cdef->info) {\n\t\t\t\topj_free(jp2->color.jp2_cdef->info);\n\t\t\t\tjp2->color.jp2_cdef->info = NULL;\n\t\t\t}\n\n\t\t\topj_free(jp2->color.jp2_cdef);\n\t\t\tjp2->color.jp2_cdef = 00;\n\t\t}\n\n\t\tif (jp2->color.jp2_pclr) {\n\t\t\tif (jp2->color.jp2_pclr->cmap) {\n\t\t\t\topj_free(jp2->color.jp2_pclr->cmap);\n\t\t\t\tjp2->color.jp2_pclr->cmap = NULL;\n\t\t\t}\n\t\t\tif (jp2->color.jp2_pclr->channel_sign) {\n\t\t\t\topj_free(jp2->color.jp2_pclr->channel_sign);\n\t\t\t\tjp2->color.jp2_pclr->channel_sign = NULL;\n\t\t\t}\n\t\t\tif (jp2->color.jp2_pclr->channel_size) {\n\t\t\t\topj_free(jp2->color.jp2_pclr->channel_size);\n\t\t\t\tjp2->color.jp2_pclr->channel_size = NULL;\n\t\t\t}\n\t\t\tif (jp2->color.jp2_pclr->entries) {\n\t\t\t\topj_free(jp2->color.jp2_pclr->entries);\n\t\t\t\tjp2->color.jp2_pclr->entries = NULL;\n\t\t\t}\n\n\t\t\topj_free(jp2->color.jp2_pclr);\n\t\t\tjp2->color.jp2_pclr = 00;\n\t\t}\n\n\t\tif (jp2->m_validation_list) {\n\t\t\topj_procedure_list_destroy(jp2->m_validation_list);\n\t\t\tjp2->m_validation_list = 00;\n\t\t}\n\n\t\tif (jp2->m_procedure_list) {\n\t\t\topj_procedure_list_destroy(jp2->m_procedure_list);\n\t\t\tjp2->m_procedure_list = 00;\n\t\t}\n\n\t\topj_free(jp2);\n\t}\n}\n\nOPJ_BOOL opj_jp2_set_decode_area(\topj_jp2_t *p_jp2,\n\t\t\t\t\t\t\t\t    opj_image_t* p_image,\n\t\t\t\t\t\t\t\t    OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,\n\t\t\t\t\t\t\t\t    OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,\n\t\t\t\t\t\t\t\t    opj_event_mgr_t * p_manager\n                                    )\n{\n\treturn opj_j2k_set_decode_area(p_jp2->j2k, p_image, p_start_x, p_start_y, p_end_x, p_end_y, p_manager);\n}\n\nOPJ_BOOL opj_jp2_get_tile(\topj_jp2_t *p_jp2,\n                            opj_stream_private_t *p_stream,\n                            opj_image_t* p_image,\n                            opj_event_mgr_t * p_manager,\n                            OPJ_UINT32 tile_index\n                            )\n{\n\tif (!p_image)\n\t\treturn OPJ_FALSE;\n\n\topj_event_msg(p_manager, EVT_WARNING, \"JP2 box which are after the codestream will not be read by this function.\\n\");\n\n\tif (! opj_j2k_get_tile(p_jp2->j2k, p_stream, p_image, p_manager, tile_index) ){\n\t\topj_event_msg(p_manager, EVT_ERROR, \"Failed to decode the codestream in the JP2 file\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\n\tif (!opj_jp2_check_color(p_image, &(p_jp2->color), p_manager)) {\n\t\treturn OPJ_FALSE;\n\t}\n\n\t/* Set Image Color Space */\n\tif (p_jp2->enumcs == 16)\n\t\tp_image->color_space = OPJ_CLRSPC_SRGB;\n\telse if (p_jp2->enumcs == 17)\n\t\tp_image->color_space = OPJ_CLRSPC_GRAY;\n\telse if (p_jp2->enumcs == 18)\n\t\tp_image->color_space = OPJ_CLRSPC_SYCC;\n\telse\n\t\tp_image->color_space = OPJ_CLRSPC_UNKNOWN;\n\n\t/* Apply the color space if needed */\n\tif(p_jp2->color.jp2_cdef) {\n\t\topj_jp2_apply_cdef(p_image, &(p_jp2->color));\n\t}\n\n\tif(p_jp2->color.jp2_pclr) {\n\t\t/* Part 1, I.5.3.4: Either both or none : */\n\t\tif( !p_jp2->color.jp2_pclr->cmap)\n\t\t\topj_jp2_free_pclr(&(p_jp2->color));\n\t\telse\n\t\t\topj_jp2_apply_pclr(p_image, &(p_jp2->color));\n\t}\n\n\tif(p_jp2->color.icc_profile_buf) {\n\t\tp_image->icc_profile_buf = p_jp2->color.icc_profile_buf;\n\t\tp_image->icc_profile_len = p_jp2->color.icc_profile_len;\n\t\tp_jp2->color.icc_profile_buf = NULL;\n\t}\n\n\treturn OPJ_TRUE;\n}\n\n/* ----------------------------------------------------------------------- */\n/* JP2 encoder interface                                             */\n/* ----------------------------------------------------------------------- */\n\nopj_jp2_t* opj_jp2_create(OPJ_BOOL p_is_decoder)\n{\n\topj_jp2_t *jp2 = (opj_jp2_t*)opj_malloc(sizeof(opj_jp2_t));\n\tif (jp2) {\n\t\tmemset(jp2,0,sizeof(opj_jp2_t));\n\n\t\t/* create the J2K codec */\n\t\tif (! p_is_decoder) {\n\t\t\tjp2->j2k = opj_j2k_create_compress();\n\t\t}\n\t\telse {\n\t\t\tjp2->j2k = opj_j2k_create_decompress();\n\t\t}\n\n\t\tif (jp2->j2k == 00) {\n\t\t\topj_jp2_destroy(jp2);\n\t\t\treturn 00;\n\t\t}\n\n\t\t/* Color structure */\n\t\tjp2->color.icc_profile_buf = NULL;\n\t\tjp2->color.icc_profile_len = 0;\n\t\tjp2->color.jp2_cdef = NULL;\n\t\tjp2->color.jp2_pclr = NULL;\n\t\tjp2->color.jp2_has_colr = 0;\n\n\t\t/* validation list creation */\n\t\tjp2->m_validation_list = opj_procedure_list_create();\n\t\tif (! jp2->m_validation_list) {\n\t\t\topj_jp2_destroy(jp2);\n\t\t\treturn 00;\n\t\t}\n\n\t\t/* execution list creation */\n\t\tjp2->m_procedure_list = opj_procedure_list_create();\n\t\tif (! jp2->m_procedure_list) {\n\t\t\topj_jp2_destroy(jp2);\n\t\t\treturn 00;\n\t\t}\n\t}\n\n\treturn jp2;\n}\n\nvoid jp2_dump(opj_jp2_t* p_jp2, OPJ_INT32 flag, FILE* out_stream)\n{\n\t/* preconditions */\n\tassert(p_jp2 != 00);\n\n\tj2k_dump(p_jp2->j2k,\n\t\t\t\t\tflag,\n\t\t\t\t\tout_stream);\n}\n\nopj_codestream_index_t* jp2_get_cstr_index(opj_jp2_t* p_jp2)\n{\n\treturn j2k_get_cstr_index(p_jp2->j2k);\n}\n\nopj_codestream_info_v2_t* jp2_get_cstr_info(opj_jp2_t* p_jp2)\n{\n\treturn j2k_get_cstr_info(p_jp2->j2k);\n}\n\nOPJ_BOOL opj_jp2_set_decoded_resolution_factor(opj_jp2_t *p_jp2,\n                                               OPJ_UINT32 res_factor,\n                                               opj_event_mgr_t * p_manager)\n{\n\treturn opj_j2k_set_decoded_resolution_factor(p_jp2->j2k, res_factor, p_manager);\n}\n\n/* JPIP specific */\n\n#ifdef USE_JPIP\nstatic OPJ_BOOL opj_jpip_write_iptr(opj_jp2_t *jp2,\n  opj_stream_private_t *cio,\n  opj_event_mgr_t * p_manager )\n{\n  OPJ_OFF_T j2k_codestream_exit;\n  OPJ_BYTE l_data_header [24];\n\n  /* preconditions */\n  assert(jp2 != 00);\n  assert(cio != 00);\n  assert(p_manager != 00);\n  assert(opj_stream_has_seek(cio));\n\n  j2k_codestream_exit = opj_stream_tell(cio);\n  opj_write_bytes(l_data_header, 24, 4); /* size of iptr */\n  opj_write_bytes(l_data_header + 4,JPIP_IPTR,4);\t\t\t\t\t\t\t\t\t   /* IPTR */\n#if 0\n  opj_write_bytes(l_data_header + 4 + 4, 0, 8); /* offset */\n  opj_write_bytes(l_data_header + 8 + 8, 0, 8); /* length */\n#else\n  opj_write_double(l_data_header + 4 + 4, 0); /* offset */\n  opj_write_double(l_data_header + 8 + 8, 0); /* length */\n#endif\n\n  if (! opj_stream_seek(cio,jp2->jpip_iptr_offset,p_manager)) {\n    opj_event_msg(p_manager, EVT_ERROR, \"Failed to seek in the stream.\\n\");\n    return OPJ_FALSE;\n  }\n\n  if (opj_stream_write_data(cio,l_data_header,24,p_manager) != 24) {\n    opj_event_msg(p_manager, EVT_ERROR, \"Failed to seek in the stream.\\n\");\n    return OPJ_FALSE;\n  }\n\n  if (! opj_stream_seek(cio,j2k_codestream_exit,p_manager)) {\n    opj_event_msg(p_manager, EVT_ERROR, \"Failed to seek in the stream.\\n\");\n    return OPJ_FALSE;\n  }\n\n  return OPJ_TRUE;\n}\n\nstatic OPJ_BOOL opj_jpip_write_fidx(opj_jp2_t *jp2,\n  opj_stream_private_t *cio,\n  opj_event_mgr_t * p_manager )\n{\n  OPJ_OFF_T j2k_codestream_exit;\n  OPJ_BYTE l_data_header [24];\n\n  /* preconditions */\n  assert(jp2 != 00);\n  assert(cio != 00);\n  assert(p_manager != 00);\n  assert(opj_stream_has_seek(cio));\n\n  opj_write_bytes(l_data_header, 24, 4); /* size of iptr */\n  opj_write_bytes(l_data_header + 4,JPIP_FIDX,4);\t\t\t\t\t\t\t\t\t   /* IPTR */\n  opj_write_double(l_data_header + 4 + 4, 0); /* offset */\n  opj_write_double(l_data_header + 8 + 8, 0); /* length */\n\n  if (opj_stream_write_data(cio,l_data_header,24,p_manager) != 24) {\n    opj_event_msg(p_manager, EVT_ERROR, \"Failed to seek in the stream.\\n\");\n    return OPJ_FALSE;\n  }\n\n  j2k_codestream_exit = opj_stream_tell(cio);\n  if (! opj_stream_seek(cio,j2k_codestream_exit,p_manager)) {\n    opj_event_msg(p_manager, EVT_ERROR, \"Failed to seek in the stream.\\n\");\n    return OPJ_FALSE;\n  }\n\n  return OPJ_TRUE;\n}\n\nstatic OPJ_BOOL opj_jpip_write_cidx(opj_jp2_t *jp2,\n  opj_stream_private_t *cio,\n  opj_event_mgr_t * p_manager )\n{\n  OPJ_OFF_T j2k_codestream_exit;\n  OPJ_BYTE l_data_header [24];\n\n  /* preconditions */\n  assert(jp2 != 00);\n  assert(cio != 00);\n  assert(p_manager != 00);\n  assert(opj_stream_has_seek(cio));\n\n  j2k_codestream_exit = opj_stream_tell(cio);\n  opj_write_bytes(l_data_header, 24, 4); /* size of iptr */\n  opj_write_bytes(l_data_header + 4,JPIP_CIDX,4);\t\t\t\t\t\t\t\t\t   /* IPTR */\n#if 0\n  opj_write_bytes(l_data_header + 4 + 4, 0, 8); /* offset */\n  opj_write_bytes(l_data_header + 8 + 8, 0, 8); /* length */\n#else\n  opj_write_double(l_data_header + 4 + 4, 0); /* offset */\n  opj_write_double(l_data_header + 8 + 8, 0); /* length */\n#endif\n\n  if (! opj_stream_seek(cio,j2k_codestream_exit,p_manager)) {\n    opj_event_msg(p_manager, EVT_ERROR, \"Failed to seek in the stream.\\n\");\n    return OPJ_FALSE;\n  }\n\n  if (opj_stream_write_data(cio,l_data_header,24,p_manager) != 24) {\n    opj_event_msg(p_manager, EVT_ERROR, \"Failed to seek in the stream.\\n\");\n    return OPJ_FALSE;\n  }\n\n  j2k_codestream_exit = opj_stream_tell(cio);\n  if (! opj_stream_seek(cio,j2k_codestream_exit,p_manager)) {\n    opj_event_msg(p_manager, EVT_ERROR, \"Failed to seek in the stream.\\n\");\n    return OPJ_FALSE;\n  }\n\n  return OPJ_TRUE;\n}\n\n#if 0\nstatic void write_prxy( int offset_jp2c, int length_jp2c, int offset_idx, int length_idx, opj_stream_private_t *cio,\n  opj_event_mgr_t * p_manager )\n{\n  OPJ_BYTE l_data_header [8];\n  OPJ_OFF_T len, lenp;\n\n  lenp = opj_stream_tell(cio);\n  opj_stream_skip(cio, 4, p_manager);         /* L [at the end] */\n  opj_write_bytes(l_data_header,JPIP_PRXY,4); /* IPTR           */\n  opj_stream_write_data(cio,l_data_header,4,p_manager);\n\n  opj_write_bytes( l_data_header, offset_jp2c, 8); /* OOFF           */\n  opj_stream_write_data(cio,l_data_header,8,p_manager);\n  opj_write_bytes( l_data_header, length_jp2c, 4); /* OBH part 1     */\n  opj_write_bytes( l_data_header+4, JP2_JP2C, 4);  /* OBH part 2     */\n  opj_stream_write_data(cio,l_data_header,8,p_manager);\n\n  opj_write_bytes( l_data_header, 1, 1);/* NI             */\n  opj_stream_write_data(cio,l_data_header,1,p_manager);\n\n  opj_write_bytes( l_data_header, offset_idx, 8);  /* IOFF           */\n  opj_stream_write_data(cio,l_data_header,8,p_manager);\n  opj_write_bytes( l_data_header, length_idx, 4);  /* IBH part 1     */\n  opj_write_bytes( l_data_header+4, JPIP_CIDX, 4);   /* IBH part 2     */\n  opj_stream_write_data(cio,l_data_header,8,p_manager);\n\n  len = opj_stream_tell(cio)-lenp;\n  opj_stream_skip(cio, lenp, p_manager);\n  opj_write_bytes(l_data_header,len,4);/* L              */\n  opj_stream_write_data(cio,l_data_header,4,p_manager);\n  opj_stream_seek(cio, lenp+len,p_manager);\n}\n#endif\n\n\n#if 0\nstatic int write_fidx( int offset_jp2c, int length_jp2c, int offset_idx, int length_idx, opj_stream_private_t *cio,\n  opj_event_mgr_t * p_manager )\n{\n  OPJ_BYTE l_data_header [4];\n  OPJ_OFF_T len, lenp;\n\n  lenp = opj_stream_tell(cio);\n  opj_stream_skip(cio, 4, p_manager);\n  opj_write_bytes(l_data_header,JPIP_FIDX,4); /* FIDX */\n  opj_stream_write_data(cio,l_data_header,4,p_manager);\n\n  write_prxy( offset_jp2c, length_jp2c, offset_idx, length_idx, cio,p_manager);\n\n  len = opj_stream_tell(cio)-lenp;\n  opj_stream_skip(cio, lenp, p_manager);\n  opj_write_bytes(l_data_header,len,4);/* L              */\n  opj_stream_write_data(cio,l_data_header,4,p_manager);\n  opj_stream_seek(cio, lenp+len,p_manager);\n\n  return len;\n}\n#endif\n#endif /* USE_JPIP */\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/jp2.h",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR \n * Copyright (c) 2012, CS Systemes d'Information, France\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef __JP2_H\n#define __JP2_H\n/**\n@file jp2.h\n@brief The JPEG-2000 file format Reader/Writer (JP2)\n\n*/\n\n/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */\n/*@{*/\n\n/*#define JPIP_JPIP 0x6a706970*/\n\n#define     JP2_JP   0x6a502020    /**< JPEG 2000 signature box */\n#define     JP2_FTYP 0x66747970    /**< File type box */\n#define     JP2_JP2H 0x6a703268    /**< JP2 header box (super-box) */\n#define     JP2_IHDR 0x69686472    /**< Image header box */\n#define     JP2_COLR 0x636f6c72    /**< Colour specification box */\n#define     JP2_JP2C 0x6a703263    /**< Contiguous codestream box */\n#define     JP2_URL  0x75726c20    /**< Data entry URL box */\n#define     JP2_PCLR 0x70636c72    /**< Palette box */\n#define     JP2_CMAP 0x636d6170    /**< Component Mapping box */\n#define     JP2_CDEF 0x63646566    /**< Channel Definition box */\n#define     JP2_DTBL 0x6474626c    /**< Data Reference box */\n#define     JP2_BPCC 0x62706363    /**< Bits per component box */\n#define     JP2_JP2  0x6a703220    /**< File type fields */\n\n/* For the future */\n/* #define JP2_RES 0x72657320 */  /**< Resolution box (super-box) */\n/* #define JP2_JP2I 0x6a703269 */  /**< Intellectual property box */\n/* #define JP2_XML  0x786d6c20 */  /**< XML box */\n/* #define JP2_UUID 0x75756994 */  /**< UUID box */\n/* #define JP2_UINF 0x75696e66 */  /**< UUID info box (super-box) */\n/* #define JP2_ULST 0x756c7374 */  /**< UUID list box */\n\n/* ----------------------------------------------------------------------- */\n\ntypedef enum\n{\n  JP2_STATE_NONE            = 0x0,\n  JP2_STATE_SIGNATURE       = 0x1,\n  JP2_STATE_FILE_TYPE       = 0x2,\n  JP2_STATE_HEADER          = 0x4,\n  JP2_STATE_CODESTREAM      = 0x8,\n  JP2_STATE_END_CODESTREAM  = 0x10,\n  JP2_STATE_UNKNOWN         = 0x7fffffff /* ISO C restricts enumerator values to range of 'int' */\n}\nJP2_STATE;\n\ntypedef enum\n{\n  JP2_IMG_STATE_NONE        = 0x0,\n  JP2_IMG_STATE_UNKNOWN     = 0x7fffffff\n}\nJP2_IMG_STATE;\n\n/** \nChannel description: channel index, type, assocation\n*/\ntypedef struct opj_jp2_cdef_info\n{\n    OPJ_UINT16 cn, typ, asoc;\n} opj_jp2_cdef_info_t;\n\n/** \nChannel descriptions and number of descriptions\n*/\ntypedef struct opj_jp2_cdef\n{\n    opj_jp2_cdef_info_t *info;\n    OPJ_UINT16 n;\n} opj_jp2_cdef_t;\n\n/** \nComponent mappings: channel index, mapping type, palette index\n*/\ntypedef struct opj_jp2_cmap_comp\n{\n    OPJ_UINT16 cmp;\n    OPJ_BYTE mtyp, pcol;\n} opj_jp2_cmap_comp_t;\n\n/** \nPalette data: table entries, palette columns\n*/\ntypedef struct opj_jp2_pclr\n{\n    OPJ_UINT32 *entries;\n    OPJ_BYTE *channel_sign;\n    OPJ_BYTE *channel_size;\n    opj_jp2_cmap_comp_t *cmap;\n    OPJ_UINT16 nr_entries;\n    OPJ_BYTE nr_channels;\n} opj_jp2_pclr_t;\n\n/** \nCollector for ICC profile, palette, component mapping, channel description \n*/\ntypedef struct opj_jp2_color\n{\n    OPJ_BYTE *icc_profile_buf;\n    OPJ_UINT32 icc_profile_len;\n\n    opj_jp2_cdef_t *jp2_cdef;\n    opj_jp2_pclr_t *jp2_pclr;\n    OPJ_BYTE jp2_has_colr;\n} opj_jp2_color_t;\n\n/** \nJP2 component\n*/\ntypedef struct opj_jp2_comps {\n  OPJ_UINT32 depth;      \n  OPJ_UINT32 sgnd;       \n  OPJ_UINT32 bpcc;\n} opj_jp2_comps_t;\n\n/**\nJPEG-2000 file format reader/writer\n*/\ntypedef struct opj_jp2\n{\n  /** handle to the J2K codec  */\n  opj_j2k_t *j2k;\n  /** list of validation procedures */\n  struct opj_procedure_list * m_validation_list;\n  /** list of execution procedures */\n  struct opj_procedure_list * m_procedure_list;\n\n  /* width of image */\n  OPJ_UINT32 w;\n  /* height of image */\n  OPJ_UINT32 h;\n  /* number of components in the image */\n  OPJ_UINT32 numcomps;\n  OPJ_UINT32 bpc;\n  OPJ_UINT32 C;\n  OPJ_UINT32 UnkC;\n  OPJ_UINT32 IPR;\n  OPJ_UINT32 meth;\n  OPJ_UINT32 approx;\n  OPJ_UINT32 enumcs;\n  OPJ_UINT32 precedence;\n  OPJ_UINT32 brand;\n  OPJ_UINT32 minversion;\n  OPJ_UINT32 numcl;\n  OPJ_UINT32 *cl;\n  opj_jp2_comps_t *comps;\n  /* FIXME: The following two variables are used to save offset\n    as we write out a JP2 file to disk. This mecanism is not flexible\n    as codec writers will need to extand those fields as new part\n    of the standard are implemented.\n  */\n    OPJ_OFF_T j2k_codestream_offset;\n    OPJ_OFF_T jpip_iptr_offset;\n\tOPJ_BOOL jpip_on;\n  OPJ_UINT32 jp2_state;\n  OPJ_UINT32 jp2_img_state;\n\n  opj_jp2_color_t color;\n    \n    OPJ_BOOL ignore_pclr_cmap_cdef;\n}\nopj_jp2_t;\n\n/**\nJP2 Box\n*/\ntypedef struct opj_jp2_box {\n    OPJ_UINT32 length;\n    OPJ_UINT32 type;\n    OPJ_INT32 init_pos;\n} opj_jp2_box_t;\n\ntypedef struct opj_jp2_header_handler\n{\n  /* marker value */\n  OPJ_UINT32 id;\n  /* action linked to the marker */\n  OPJ_BOOL (*handler) (     opj_jp2_t *jp2, \n                            OPJ_BYTE *p_header_data, \n                            OPJ_UINT32 p_header_size, \n                            opj_event_mgr_t * p_manager);\n}\nopj_jp2_header_handler_t;\n\n\ntypedef struct opj_jp2_img_header_writer_handler \n{\n  /* action to perform */\n  OPJ_BYTE*   (*handler) (opj_jp2_t *jp2, OPJ_UINT32 * p_data_size);\n  /* result of the action : data */\n  OPJ_BYTE*   m_data;\n  /* size of data */\n  OPJ_UINT32  m_size;\n} \nopj_jp2_img_header_writer_handler_t;\n\n/** @name Exported functions */\n/*@{*/\n/* ----------------------------------------------------------------------- */\n\n/**\n * Writes the Jpeg2000 file Header box - JP2 Header box (warning, this is a super box).\n *\n * @param  jp2      the jpeg2000 file codec.\n * @param  stream      the stream to write data to.\n * @param  p_manager  user event manager.\n *\n * @return true if writing was successful.\n*/\nOPJ_BOOL opj_jp2_write_jp2h(opj_jp2_t *jp2,\n                            opj_stream_private_t *stream,\n                            opj_event_mgr_t * p_manager );\n\n/**\nSetup the decoder decoding parameters using user parameters.\nDecoding parameters are returned in jp2->j2k->cp.\n@param jp2 JP2 decompressor handle\n@param parameters decompression parameters\n*/\nvoid opj_jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters);\n\n/**\n * Decode an image from a JPEG-2000 file stream\n * @param jp2 JP2 decompressor handle\n * @param p_stream  FIXME DOC\n * @param p_image   FIXME DOC\n * @param p_manager FIXME DOC\n *\n * @return Returns a decoded image if successful, returns NULL otherwise\n*/\nOPJ_BOOL opj_jp2_decode(opj_jp2_t *jp2,\n                        opj_stream_private_t *p_stream,\n            opj_image_t* p_image,\n            opj_event_mgr_t * p_manager);\n\n/**\n * Setup the encoder parameters using the current image and using user parameters. \n * Coding parameters are returned in jp2->j2k->cp. \n *\n * @param jp2 JP2 compressor handle\n * @param parameters compression parameters\n * @param image input filled image\n * @param p_manager  FIXME DOC\n*/\nvoid opj_jp2_setup_encoder(  opj_jp2_t *jp2, \n                            opj_cparameters_t *parameters, \n                            opj_image_t *image, \n                            opj_event_mgr_t * p_manager);\n\n/**\nEncode an image into a JPEG-2000 file stream\n@param jp2      JP2 compressor handle\n@param stream    Output buffer stream\n@param p_manager  event manager\n@return Returns true if successful, returns false otherwise\n*/\nOPJ_BOOL opj_jp2_encode(  opj_jp2_t *jp2, \n              opj_stream_private_t *stream, \n              opj_event_mgr_t * p_manager);\n\n\n/**\n * Starts a compression scheme, i.e. validates the codec parameters, writes the header.\n *\n * @param  jp2    the jpeg2000 file codec.\n * @param  stream    the stream object.\n * @param  p_image   FIXME DOC\n * @param p_manager FIXME DOC\n *\n * @return true if the codec is valid.\n */\nOPJ_BOOL opj_jp2_start_compress(opj_jp2_t *jp2,\n                                opj_stream_private_t *stream,\n                                opj_image_t * p_image,\n                                opj_event_mgr_t * p_manager);\n\n\n/**\n * Ends the compression procedures and possibiliy add data to be read after the\n * codestream.\n */\nOPJ_BOOL opj_jp2_end_compress(  opj_jp2_t *jp2,\n                  opj_stream_private_t *cio,\n                  opj_event_mgr_t * p_manager);\n\n/* ----------------------------------------------------------------------- */\n\n/**\n * Ends the decompression procedures and possibiliy add data to be read after the\n * codestream.\n */\nOPJ_BOOL opj_jp2_end_decompress(opj_jp2_t *jp2, \n                                opj_stream_private_t *cio,\n                                opj_event_mgr_t * p_manager);\n\n/**\n * Reads a jpeg2000 file header structure.\n *\n * @param p_stream the stream to read data from.\n * @param jp2 the jpeg2000 file header structure.\n * @param p_image   FIXME DOC\n * @param p_manager the user event manager.\n *\n * @return true if the box is valid.\n */\nOPJ_BOOL opj_jp2_read_header(  opj_stream_private_t *p_stream,\n                                opj_jp2_t *jp2,\n                                opj_image_t ** p_image,\n                                opj_event_mgr_t * p_manager );\n\n/**\n * Reads a tile header.\n * @param  p_jp2         the jpeg2000 codec.\n * @param  p_tile_index  FIXME DOC\n * @param  p_data_size   FIXME DOC\n * @param  p_tile_x0     FIXME DOC\n * @param  p_tile_y0     FIXME DOC\n * @param  p_tile_x1     FIXME DOC\n * @param  p_tile_y1     FIXME DOC\n * @param  p_nb_comps    FIXME DOC\n * @param  p_go_on       FIXME DOC\n * @param  p_stream      the stream to write data to.\n * @param  p_manager     the user event manager.\n */\nOPJ_BOOL opj_jp2_read_tile_header ( opj_jp2_t * p_jp2,\n                                    OPJ_UINT32 * p_tile_index,\n                                    OPJ_UINT32 * p_data_size,\n                                    OPJ_INT32 * p_tile_x0,\n                                    OPJ_INT32 * p_tile_y0,\n                                    OPJ_INT32 * p_tile_x1,\n                                    OPJ_INT32 * p_tile_y1,\n                                    OPJ_UINT32 * p_nb_comps,\n                                    OPJ_BOOL * p_go_on,\n                                    opj_stream_private_t *p_stream,\n                                    opj_event_mgr_t * p_manager );\n\n/**\n * Writes a tile.\n *\n * @param  p_jp2    the jpeg2000 codec.\n * @param p_tile_index  FIXME DOC\n * @param p_data        FIXME DOC\n * @param p_data_size   FIXME DOC\n * @param  p_stream      the stream to write data to.\n * @param  p_manager  the user event manager.\n */\nOPJ_BOOL opj_jp2_write_tile (  opj_jp2_t *p_jp2,\n                    OPJ_UINT32 p_tile_index,\n                    OPJ_BYTE * p_data,\n                    OPJ_UINT32 p_data_size,\n                    opj_stream_private_t *p_stream,\n                    opj_event_mgr_t * p_manager );\n\n/**\n * Decode tile data.\n * @param  p_jp2    the jpeg2000 codec.\n * @param  p_tile_index FIXME DOC\n * @param  p_data       FIXME DOC\n * @param  p_data_size  FIXME DOC\n * @param  p_stream      the stream to write data to.\n * @param  p_manager  the user event manager.\n *\n * @return FIXME DOC\n */\nOPJ_BOOL opj_jp2_decode_tile (  opj_jp2_t * p_jp2,\n                                OPJ_UINT32 p_tile_index,\n                                OPJ_BYTE * p_data,\n                                OPJ_UINT32 p_data_size,\n                                opj_stream_private_t *p_stream,\n                                opj_event_mgr_t * p_manager );\n\n/**\n * Creates a jpeg2000 file decompressor.\n *\n * @return  an empty jpeg2000 file codec.\n */\nopj_jp2_t* opj_jp2_create (OPJ_BOOL p_is_decoder);\n\n/**\nDestroy a JP2 decompressor handle\n@param jp2 JP2 decompressor handle to destroy\n*/\nvoid opj_jp2_destroy(opj_jp2_t *jp2);\n\n\n/**\n * Sets the given area to be decoded. This function should be called right after opj_read_header and before any tile header reading.\n *\n * @param  p_jp2      the jpeg2000 codec.\n * @param  p_image     FIXME DOC\n * @param  p_start_x   the left position of the rectangle to decode (in image coordinates).\n * @param  p_start_y    the up position of the rectangle to decode (in image coordinates).\n * @param  p_end_x      the right position of the rectangle to decode (in image coordinates).\n * @param  p_end_y      the bottom position of the rectangle to decode (in image coordinates).\n * @param  p_manager    the user event manager\n *\n * @return  true      if the area could be set.\n */\nOPJ_BOOL opj_jp2_set_decode_area(  opj_jp2_t *p_jp2,\n                    opj_image_t* p_image,\n                    OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,\n                    OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,\n                    opj_event_mgr_t * p_manager );\n\n /**\n * \n */\nOPJ_BOOL opj_jp2_get_tile(  opj_jp2_t *p_jp2,\n                            opj_stream_private_t *p_stream,\n                            opj_image_t* p_image,\n                            opj_event_mgr_t * p_manager,\n                            OPJ_UINT32 tile_index );\n\n\n/**\n * \n */\nOPJ_BOOL opj_jp2_set_decoded_resolution_factor(opj_jp2_t *p_jp2, \n                                               OPJ_UINT32 res_factor, \n                                               opj_event_mgr_t * p_manager);\n\n\n/* TODO MSD: clean these 3 functions */\n/**\n * Dump some elements from the JP2 decompression structure .\n *\n *@param p_jp2        the jp2 codec.\n *@param flag        flag to describe what elments are dump.\n *@param out_stream      output stream where dump the elements.\n *\n*/\nvoid jp2_dump (opj_jp2_t* p_jp2, OPJ_INT32 flag, FILE* out_stream);\n\n/**\n * Get the codestream info from a JPEG2000 codec.\n *\n *@param  p_jp2        jp2 codec.\n *\n *@return  the codestream information extract from the jpg2000 codec\n */\nopj_codestream_info_v2_t* jp2_get_cstr_info(opj_jp2_t* p_jp2);\n\n/**\n * Get the codestream index from a JPEG2000 codec.\n *\n *@param  p_jp2        jp2 codec.\n *\n *@return  the codestream index extract from the jpg2000 codec\n */\nopj_codestream_index_t* jp2_get_cstr_index(opj_jp2_t* p_jp2);\n\n\n/*@}*/\n\n/*@}*/\n\n#endif /* __JP2_H */\n\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mct.c",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2001-2003, David Janssens\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR \n * Copyright (c) 2012, CS Systemes d'Information, France\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifdef __SSE__\n#include <xmmintrin.h>\n#endif\n\n#include \"opj_includes.h\"\n\n/* <summary> */\n/* This table contains the norms of the basis function of the reversible MCT. */\n/* </summary> */\nstatic const OPJ_FLOAT64 opj_mct_norms[3] = { 1.732, .8292, .8292 };\n\n/* <summary> */\n/* This table contains the norms of the basis function of the irreversible MCT. */\n/* </summary> */\nstatic const OPJ_FLOAT64 opj_mct_norms_real[3] = { 1.732, 1.805, 1.573 };\n\nconst OPJ_FLOAT64 * opj_mct_get_mct_norms ()\n{\n\treturn opj_mct_norms;\n}\n\nconst OPJ_FLOAT64 * opj_mct_get_mct_norms_real ()\n{\n\treturn opj_mct_norms_real;\n}\n\n/* <summary> */\n/* Foward reversible MCT. */\n/* </summary> */\nvoid opj_mct_encode(\n\t\tOPJ_INT32* restrict c0,\n\t\tOPJ_INT32* restrict c1,\n\t\tOPJ_INT32* restrict c2,\n\t\tOPJ_UINT32 n)\n{\n\tOPJ_UINT32 i;\n\tfor(i = 0; i < n; ++i) {\n\t\tOPJ_INT32 r = c0[i];\n\t\tOPJ_INT32 g = c1[i];\n\t\tOPJ_INT32 b = c2[i];\n\t\tOPJ_INT32 y = (r + (g * 2) + b) >> 2;\n\t\tOPJ_INT32 u = b - g;\n\t\tOPJ_INT32 v = r - g;\n\t\tc0[i] = y;\n\t\tc1[i] = u;\n\t\tc2[i] = v;\n\t}\n}\n\n/* <summary> */\n/* Inverse reversible MCT. */\n/* </summary> */\nvoid opj_mct_decode(\n\t\tOPJ_INT32* restrict c0,\n\t\tOPJ_INT32* restrict c1, \n\t\tOPJ_INT32* restrict c2, \n\t\tOPJ_UINT32 n)\n{\n\tOPJ_UINT32 i;\n\tfor (i = 0; i < n; ++i) {\n\t\tOPJ_INT32 y = c0[i];\n\t\tOPJ_INT32 u = c1[i];\n\t\tOPJ_INT32 v = c2[i];\n\t\tOPJ_INT32 g = y - ((u + v) >> 2);\n\t\tOPJ_INT32 r = v + g;\n\t\tOPJ_INT32 b = u + g;\n\t\tc0[i] = r;\n\t\tc1[i] = g;\n\t\tc2[i] = b;\n\t}\n}\n\n/* <summary> */\n/* Get norm of basis function of reversible MCT. */\n/* </summary> */\nOPJ_FLOAT64 opj_mct_getnorm(OPJ_UINT32 compno) {\n\treturn opj_mct_norms[compno];\n}\n\n/* <summary> */\n/* Foward irreversible MCT. */\n/* </summary> */\nvoid opj_mct_encode_real(\n\t\tOPJ_INT32* restrict c0,\n\t\tOPJ_INT32* restrict c1,\n\t\tOPJ_INT32* restrict c2,\n\t\tOPJ_UINT32 n)\n{\n\tOPJ_UINT32 i;\n\tfor(i = 0; i < n; ++i) {\n\t\tOPJ_INT32 r = c0[i];\n\t\tOPJ_INT32 g = c1[i];\n\t\tOPJ_INT32 b = c2[i];\n\t\tOPJ_INT32 y =  opj_int_fix_mul(r, 2449) + opj_int_fix_mul(g, 4809) + opj_int_fix_mul(b, 934);\n\t\tOPJ_INT32 u = -opj_int_fix_mul(r, 1382) - opj_int_fix_mul(g, 2714) + opj_int_fix_mul(b, 4096);\n\t\tOPJ_INT32 v =  opj_int_fix_mul(r, 4096) - opj_int_fix_mul(g, 3430) - opj_int_fix_mul(b, 666);\n\t\tc0[i] = y;\n\t\tc1[i] = u;\n\t\tc2[i] = v;\n\t}\n}\n\n/* <summary> */\n/* Inverse irreversible MCT. */\n/* </summary> */\nvoid opj_mct_decode_real(\n\t\tOPJ_FLOAT32* restrict c0,\n\t\tOPJ_FLOAT32* restrict c1,\n\t\tOPJ_FLOAT32* restrict c2,\n\t\tOPJ_UINT32 n)\n{\n\tOPJ_UINT32 i;\n#ifdef __SSE__\n    __m128 vrv, vgu, vgv, vbu;\n    vrv = _mm_set1_ps(1.402f);\n    vgu = _mm_set1_ps(0.34413f);\n    vgv = _mm_set1_ps(0.71414f);\n    vbu = _mm_set1_ps(1.772f);\n    for (i = 0; i < (n >> 3); ++i) {\n        __m128 vy, vu, vv;\n        __m128 vr, vg, vb;\n\n        vy = _mm_load_ps(c0);\n        vu = _mm_load_ps(c1);\n        vv = _mm_load_ps(c2);\n        vr = _mm_add_ps(vy, _mm_mul_ps(vv, vrv));\n        vg = _mm_sub_ps(_mm_sub_ps(vy, _mm_mul_ps(vu, vgu)), _mm_mul_ps(vv, vgv));\n        vb = _mm_add_ps(vy, _mm_mul_ps(vu, vbu));\n        _mm_store_ps(c0, vr);\n        _mm_store_ps(c1, vg);\n        _mm_store_ps(c2, vb);\n        c0 += 4;\n        c1 += 4;\n        c2 += 4;\n\n        vy = _mm_load_ps(c0);\n        vu = _mm_load_ps(c1);\n        vv = _mm_load_ps(c2);\n        vr = _mm_add_ps(vy, _mm_mul_ps(vv, vrv));\n        vg = _mm_sub_ps(_mm_sub_ps(vy, _mm_mul_ps(vu, vgu)), _mm_mul_ps(vv, vgv));\n        vb = _mm_add_ps(vy, _mm_mul_ps(vu, vbu));\n        _mm_store_ps(c0, vr);\n        _mm_store_ps(c1, vg);\n        _mm_store_ps(c2, vb);\n        c0 += 4;\n        c1 += 4;\n        c2 += 4;\n    }\n    n &= 7;\n\n#endif\n\tfor(i = 0; i < n; ++i) {\n\t\tOPJ_FLOAT32 y = c0[i];\n\t\tOPJ_FLOAT32 u = c1[i];\n\t\tOPJ_FLOAT32 v = c2[i];\n\t\tOPJ_FLOAT32 r = y + (v * 1.402f);\n\t\tOPJ_FLOAT32 g = y - (u * 0.34413f) - (v * (0.71414f));\n\t\tOPJ_FLOAT32 b = y + (u * 1.772f);\n\t\tc0[i] = r;\n\t\tc1[i] = g;\n\t\tc2[i] = b;\n\t}\n}\n\n/* <summary> */\n/* Get norm of basis function of irreversible MCT. */\n/* </summary> */\nOPJ_FLOAT64 opj_mct_getnorm_real(OPJ_UINT32 compno) {\n\treturn opj_mct_norms_real[compno];\n}\n\n\nOPJ_BOOL opj_mct_encode_custom(\n\t\t\t\t\t   OPJ_BYTE * pCodingdata,\n\t\t\t\t\t   OPJ_UINT32 n,\n\t\t\t\t\t   OPJ_BYTE ** pData,\n\t\t\t\t\t   OPJ_UINT32 pNbComp,\n\t\t\t\t\t   OPJ_UINT32 isSigned)\n{\n\tOPJ_FLOAT32 * lMct = (OPJ_FLOAT32 *) pCodingdata;\n\tOPJ_UINT32 i;\n\tOPJ_UINT32 j;\n\tOPJ_UINT32 k;\n\tOPJ_UINT32 lNbMatCoeff = pNbComp * pNbComp;\n\tOPJ_INT32 * lCurrentData = 00;\n\tOPJ_INT32 * lCurrentMatrix = 00;\n\tOPJ_INT32 ** lData = (OPJ_INT32 **) pData;\n\tOPJ_UINT32 lMultiplicator = 1 << 13;\n\tOPJ_INT32 * lMctPtr;\n\n    OPJ_ARG_NOT_USED(isSigned);\n\n\tlCurrentData = (OPJ_INT32 *) opj_malloc((pNbComp + lNbMatCoeff) * sizeof(OPJ_INT32));\n\tif (! lCurrentData) {\n\t\treturn OPJ_FALSE;\n\t}\n\n\tlCurrentMatrix = lCurrentData + pNbComp;\n\n\tfor (i =0;i<lNbMatCoeff;++i) {\n\t\tlCurrentMatrix[i] = (OPJ_INT32) (*(lMct++) * (OPJ_FLOAT32)lMultiplicator);\n\t}\n\n\tfor (i = 0; i < n; ++i)  {\n\t\tlMctPtr = lCurrentMatrix;\n\t\tfor (j=0;j<pNbComp;++j) {\n\t\t\tlCurrentData[j] = (*(lData[j]));\n\t\t}\n\n\t\tfor (j=0;j<pNbComp;++j) {\n\t\t\t*(lData[j]) = 0;\n\t\t\tfor (k=0;k<pNbComp;++k) {\n\t\t\t\t*(lData[j]) += opj_int_fix_mul(*lMctPtr, lCurrentData[k]);\n\t\t\t\t++lMctPtr;\n\t\t\t}\n\n\t\t\t++lData[j];\n\t\t}\n\t}\n\n\topj_free(lCurrentData);\n\n\treturn OPJ_TRUE;\n}\n\nOPJ_BOOL opj_mct_decode_custom(\n\t\t\t\t\t   OPJ_BYTE * pDecodingData,\n\t\t\t\t\t   OPJ_UINT32 n,\n\t\t\t\t\t   OPJ_BYTE ** pData,\n\t\t\t\t\t   OPJ_UINT32 pNbComp,\n\t\t\t\t\t   OPJ_UINT32 isSigned)\n{\n\tOPJ_FLOAT32 * lMct;\n\tOPJ_UINT32 i;\n\tOPJ_UINT32 j;\n\tOPJ_UINT32 k;\n\n\tOPJ_FLOAT32 * lCurrentData = 00;\n\tOPJ_FLOAT32 * lCurrentResult = 00;\n\tOPJ_FLOAT32 ** lData = (OPJ_FLOAT32 **) pData;\n\n    OPJ_ARG_NOT_USED(isSigned);\n\n\tlCurrentData = (OPJ_FLOAT32 *) opj_malloc (2 * pNbComp * sizeof(OPJ_FLOAT32));\n\tif (! lCurrentData) {\n\t\treturn OPJ_FALSE;\n\t}\n\tlCurrentResult = lCurrentData + pNbComp;\n\n\tfor (i = 0; i < n; ++i) {\n\t\tlMct = (OPJ_FLOAT32 *) pDecodingData;\n\t\tfor (j=0;j<pNbComp;++j) {\n\t\t\tlCurrentData[j] = (OPJ_FLOAT32) (*(lData[j]));\n\t\t}\n\t\tfor (j=0;j<pNbComp;++j) {\n\t\t\tlCurrentResult[j] = 0;\n\t\t\tfor\t(k=0;k<pNbComp;++k)\t{\n\t\t\t\tlCurrentResult[j] += *(lMct++) * lCurrentData[k];\n\t\t\t}\n\t\t\t*(lData[j]++) = (OPJ_FLOAT32) (lCurrentResult[j]);\n\t\t}\n\t}\n\topj_free(lCurrentData);\n\treturn OPJ_TRUE;\n}\n\nvoid opj_calculate_norms(\tOPJ_FLOAT64 * pNorms,\n\t\t\t\t\t\t\tOPJ_UINT32 pNbComps,\n\t\t\t\t\t\t\tOPJ_FLOAT32 * pMatrix)\n{\n\tOPJ_UINT32 i,j,lIndex;\n\tOPJ_FLOAT32 lCurrentValue;\n\tOPJ_FLOAT64 * lNorms = (OPJ_FLOAT64 *) pNorms;\n\tOPJ_FLOAT32 * lMatrix = (OPJ_FLOAT32 *) pMatrix;\n\n\tfor\t(i=0;i<pNbComps;++i) {\n\t\tlNorms[i] = 0;\n\t\tlIndex = i;\n\n\t\tfor\t(j=0;j<pNbComps;++j) {\n\t\t\tlCurrentValue = lMatrix[lIndex];\n\t\t\tlIndex += pNbComps;\n\t\t\tlNorms[i] += lCurrentValue * lCurrentValue;\n\t\t}\n\t\tlNorms[i] = sqrt(lNorms[i]);\n\t}\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mct.h",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2001-2003, David Janssens\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR \n * Copyright (c) 2012, CS Systemes d'Information, France\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifndef __MCT_H\n#define __MCT_H\n/**\n@file mct.h\n@brief Implementation of a multi-component transforms (MCT)\n\nThe functions in MCT.C have for goal to realize reversible and irreversible multicomponent\ntransform. The functions in MCT.C are used by some function in TCD.C.\n*/\n\n/** @defgroup MCT MCT - Implementation of a multi-component transform */\n/*@{*/\n\n/** @name Exported functions */\n/*@{*/\n/* ----------------------------------------------------------------------- */\n/**\nApply a reversible multi-component transform to an image\n@param c0 Samples for red component\n@param c1 Samples for green component\n@param c2 Samples blue component\n@param n Number of samples for each component\n*/\nvoid opj_mct_encode(OPJ_INT32 *c0, OPJ_INT32 *c1, OPJ_INT32 *c2, OPJ_UINT32 n);\n/**\nApply a reversible multi-component inverse transform to an image\n@param c0 Samples for luminance component\n@param c1 Samples for red chrominance component\n@param c2 Samples for blue chrominance component\n@param n Number of samples for each component\n*/\nvoid opj_mct_decode(OPJ_INT32 *c0, OPJ_INT32 *c1, OPJ_INT32 *c2, OPJ_UINT32 n);\n/**\nGet norm of the basis function used for the reversible multi-component transform\n@param compno Number of the component (0->Y, 1->U, 2->V)\n@return \n*/\nOPJ_FLOAT64 opj_mct_getnorm(OPJ_UINT32 compno);\n\n/**\nApply an irreversible multi-component transform to an image\n@param c0 Samples for red component\n@param c1 Samples for green component\n@param c2 Samples blue component\n@param n Number of samples for each component\n*/\nvoid opj_mct_encode_real(OPJ_INT32 *c0, OPJ_INT32 *c1, OPJ_INT32 *c2, OPJ_UINT32 n);\n/**\nApply an irreversible multi-component inverse transform to an image\n@param c0 Samples for luminance component\n@param c1 Samples for red chrominance component\n@param c2 Samples for blue chrominance component\n@param n Number of samples for each component\n*/\nvoid opj_mct_decode_real(OPJ_FLOAT32* c0, OPJ_FLOAT32* c1, OPJ_FLOAT32* c2, OPJ_UINT32 n);\n/**\nGet norm of the basis function used for the irreversible multi-component transform\n@param compno Number of the component (0->Y, 1->U, 2->V)\n@return \n*/\nOPJ_FLOAT64 opj_mct_getnorm_real(OPJ_UINT32 compno);\n\n/**\nFIXME DOC\n@param p_coding_data    MCT data\n@param n                size of components\n@param p_data           components\n@param p_nb_comp        nb of components (i.e. size of p_data)\n@param is_signed        tells if the data is signed\n@return OPJ_FALSE if function encounter a problem, OPJ_TRUE otherwise\n*/\nOPJ_BOOL opj_mct_encode_custom(\n\t\t\t\t\t   OPJ_BYTE * p_coding_data,\n\t\t\t\t\t   OPJ_UINT32 n,\n\t\t\t\t\t   OPJ_BYTE ** p_data,\n\t\t\t\t\t   OPJ_UINT32 p_nb_comp,\n\t\t\t\t\t   OPJ_UINT32 is_signed);\n/**\nFIXME DOC\n@param pDecodingData    MCT data\n@param n                size of components\n@param pData            components\n@param pNbComp          nb of components (i.e. size of p_data)\n@param isSigned         tells if the data is signed\n@return OPJ_FALSE if function encounter a problem, OPJ_TRUE otherwise\n*/\nOPJ_BOOL opj_mct_decode_custom(\n\t\t\t\t\t   OPJ_BYTE * pDecodingData,\n\t\t\t\t\t   OPJ_UINT32 n,\n\t\t\t\t\t   OPJ_BYTE ** pData,\n\t\t\t\t\t   OPJ_UINT32 pNbComp,\n\t\t\t\t\t   OPJ_UINT32 isSigned);\n/**\nFIXME DOC\n@param pNorms           MCT data\n@param p_nb_comps       size of components\n@param pMatrix          components\n@return \n*/\nvoid opj_calculate_norms(   OPJ_FLOAT64 * pNorms,\n                            OPJ_UINT32 p_nb_comps,\n                            OPJ_FLOAT32 * pMatrix);\n/**\nFIXME DOC \n*/\nconst OPJ_FLOAT64 * opj_mct_get_mct_norms (void);\n/**\nFIXME DOC \n*/\nconst OPJ_FLOAT64 * opj_mct_get_mct_norms_real (void);\n/* ----------------------------------------------------------------------- */\n/*@}*/\n\n/*@}*/\n\n#endif /* __MCT_H */\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mqc.c",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2001-2003, David Janssens\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"opj_includes.h\"\n\n/** @defgroup MQC MQC - Implementation of an MQ-Coder */\n/*@{*/\n\n/** @name Local static functions */\n/*@{*/\n\n/**\nOutput a byte, doing bit-stuffing if necessary.\nAfter a 0xff byte, the next byte must be smaller than 0x90.\n@param mqc MQC handle\n*/\nstatic void opj_mqc_byteout(opj_mqc_t *mqc);\n/**\nRenormalize mqc->a and mqc->c while encoding, so that mqc->a stays between 0x8000 and 0x10000\n@param mqc MQC handle\n*/\nstatic void opj_mqc_renorme(opj_mqc_t *mqc);\n/**\nEncode the most probable symbol\n@param mqc MQC handle\n*/\nstatic void opj_mqc_codemps(opj_mqc_t *mqc);\n/**\nEncode the most least symbol\n@param mqc MQC handle\n*/\nstatic void opj_mqc_codelps(opj_mqc_t *mqc);\n/**\nFill mqc->c with 1's for flushing\n@param mqc MQC handle\n*/\nstatic void opj_mqc_setbits(opj_mqc_t *mqc);\n/**\nFIXME DOC\n@param mqc MQC handle\n@return \n*/\nstatic INLINE OPJ_INT32 opj_mqc_mpsexchange(opj_mqc_t *const mqc);\n/**\nFIXME DOC\n@param mqc MQC handle\n@return \n*/\nstatic INLINE OPJ_INT32 opj_mqc_lpsexchange(opj_mqc_t *const mqc);\n/**\nInput a byte\n@param mqc MQC handle\n*/\nstatic INLINE void opj_mqc_bytein(opj_mqc_t *const mqc);\n/**\nRenormalize mqc->a and mqc->c while decoding\n@param mqc MQC handle\n*/\nstatic INLINE void opj_mqc_renormd(opj_mqc_t *const mqc);\n/*@}*/\n\n/*@}*/\n\n/* <summary> */\n/* This array defines all the possible states for a context. */\n/* </summary> */\nstatic opj_mqc_state_t mqc_states[47 * 2] = {\n\t{0x5601, 0, &mqc_states[2], &mqc_states[3]},\n\t{0x5601, 1, &mqc_states[3], &mqc_states[2]},\n\t{0x3401, 0, &mqc_states[4], &mqc_states[12]},\n\t{0x3401, 1, &mqc_states[5], &mqc_states[13]},\n\t{0x1801, 0, &mqc_states[6], &mqc_states[18]},\n\t{0x1801, 1, &mqc_states[7], &mqc_states[19]},\n\t{0x0ac1, 0, &mqc_states[8], &mqc_states[24]},\n\t{0x0ac1, 1, &mqc_states[9], &mqc_states[25]},\n\t{0x0521, 0, &mqc_states[10], &mqc_states[58]},\n\t{0x0521, 1, &mqc_states[11], &mqc_states[59]},\n\t{0x0221, 0, &mqc_states[76], &mqc_states[66]},\n\t{0x0221, 1, &mqc_states[77], &mqc_states[67]},\n\t{0x5601, 0, &mqc_states[14], &mqc_states[13]},\n\t{0x5601, 1, &mqc_states[15], &mqc_states[12]},\n\t{0x5401, 0, &mqc_states[16], &mqc_states[28]},\n\t{0x5401, 1, &mqc_states[17], &mqc_states[29]},\n\t{0x4801, 0, &mqc_states[18], &mqc_states[28]},\n\t{0x4801, 1, &mqc_states[19], &mqc_states[29]},\n\t{0x3801, 0, &mqc_states[20], &mqc_states[28]},\n\t{0x3801, 1, &mqc_states[21], &mqc_states[29]},\n\t{0x3001, 0, &mqc_states[22], &mqc_states[34]},\n\t{0x3001, 1, &mqc_states[23], &mqc_states[35]},\n\t{0x2401, 0, &mqc_states[24], &mqc_states[36]},\n\t{0x2401, 1, &mqc_states[25], &mqc_states[37]},\n\t{0x1c01, 0, &mqc_states[26], &mqc_states[40]},\n\t{0x1c01, 1, &mqc_states[27], &mqc_states[41]},\n\t{0x1601, 0, &mqc_states[58], &mqc_states[42]},\n\t{0x1601, 1, &mqc_states[59], &mqc_states[43]},\n\t{0x5601, 0, &mqc_states[30], &mqc_states[29]},\n\t{0x5601, 1, &mqc_states[31], &mqc_states[28]},\n\t{0x5401, 0, &mqc_states[32], &mqc_states[28]},\n\t{0x5401, 1, &mqc_states[33], &mqc_states[29]},\n\t{0x5101, 0, &mqc_states[34], &mqc_states[30]},\n\t{0x5101, 1, &mqc_states[35], &mqc_states[31]},\n\t{0x4801, 0, &mqc_states[36], &mqc_states[32]},\n\t{0x4801, 1, &mqc_states[37], &mqc_states[33]},\n\t{0x3801, 0, &mqc_states[38], &mqc_states[34]},\n\t{0x3801, 1, &mqc_states[39], &mqc_states[35]},\n\t{0x3401, 0, &mqc_states[40], &mqc_states[36]},\n\t{0x3401, 1, &mqc_states[41], &mqc_states[37]},\n\t{0x3001, 0, &mqc_states[42], &mqc_states[38]},\n\t{0x3001, 1, &mqc_states[43], &mqc_states[39]},\n\t{0x2801, 0, &mqc_states[44], &mqc_states[38]},\n\t{0x2801, 1, &mqc_states[45], &mqc_states[39]},\n\t{0x2401, 0, &mqc_states[46], &mqc_states[40]},\n\t{0x2401, 1, &mqc_states[47], &mqc_states[41]},\n\t{0x2201, 0, &mqc_states[48], &mqc_states[42]},\n\t{0x2201, 1, &mqc_states[49], &mqc_states[43]},\n\t{0x1c01, 0, &mqc_states[50], &mqc_states[44]},\n\t{0x1c01, 1, &mqc_states[51], &mqc_states[45]},\n\t{0x1801, 0, &mqc_states[52], &mqc_states[46]},\n\t{0x1801, 1, &mqc_states[53], &mqc_states[47]},\n\t{0x1601, 0, &mqc_states[54], &mqc_states[48]},\n\t{0x1601, 1, &mqc_states[55], &mqc_states[49]},\n\t{0x1401, 0, &mqc_states[56], &mqc_states[50]},\n\t{0x1401, 1, &mqc_states[57], &mqc_states[51]},\n\t{0x1201, 0, &mqc_states[58], &mqc_states[52]},\n\t{0x1201, 1, &mqc_states[59], &mqc_states[53]},\n\t{0x1101, 0, &mqc_states[60], &mqc_states[54]},\n\t{0x1101, 1, &mqc_states[61], &mqc_states[55]},\n\t{0x0ac1, 0, &mqc_states[62], &mqc_states[56]},\n\t{0x0ac1, 1, &mqc_states[63], &mqc_states[57]},\n\t{0x09c1, 0, &mqc_states[64], &mqc_states[58]},\n\t{0x09c1, 1, &mqc_states[65], &mqc_states[59]},\n\t{0x08a1, 0, &mqc_states[66], &mqc_states[60]},\n\t{0x08a1, 1, &mqc_states[67], &mqc_states[61]},\n\t{0x0521, 0, &mqc_states[68], &mqc_states[62]},\n\t{0x0521, 1, &mqc_states[69], &mqc_states[63]},\n\t{0x0441, 0, &mqc_states[70], &mqc_states[64]},\n\t{0x0441, 1, &mqc_states[71], &mqc_states[65]},\n\t{0x02a1, 0, &mqc_states[72], &mqc_states[66]},\n\t{0x02a1, 1, &mqc_states[73], &mqc_states[67]},\n\t{0x0221, 0, &mqc_states[74], &mqc_states[68]},\n\t{0x0221, 1, &mqc_states[75], &mqc_states[69]},\n\t{0x0141, 0, &mqc_states[76], &mqc_states[70]},\n\t{0x0141, 1, &mqc_states[77], &mqc_states[71]},\n\t{0x0111, 0, &mqc_states[78], &mqc_states[72]},\n\t{0x0111, 1, &mqc_states[79], &mqc_states[73]},\n\t{0x0085, 0, &mqc_states[80], &mqc_states[74]},\n\t{0x0085, 1, &mqc_states[81], &mqc_states[75]},\n\t{0x0049, 0, &mqc_states[82], &mqc_states[76]},\n\t{0x0049, 1, &mqc_states[83], &mqc_states[77]},\n\t{0x0025, 0, &mqc_states[84], &mqc_states[78]},\n\t{0x0025, 1, &mqc_states[85], &mqc_states[79]},\n\t{0x0015, 0, &mqc_states[86], &mqc_states[80]},\n\t{0x0015, 1, &mqc_states[87], &mqc_states[81]},\n\t{0x0009, 0, &mqc_states[88], &mqc_states[82]},\n\t{0x0009, 1, &mqc_states[89], &mqc_states[83]},\n\t{0x0005, 0, &mqc_states[90], &mqc_states[84]},\n\t{0x0005, 1, &mqc_states[91], &mqc_states[85]},\n\t{0x0001, 0, &mqc_states[90], &mqc_states[86]},\n\t{0x0001, 1, &mqc_states[91], &mqc_states[87]},\n\t{0x5601, 0, &mqc_states[92], &mqc_states[92]},\n\t{0x5601, 1, &mqc_states[93], &mqc_states[93]},\n};\n\n/* \n==========================================================\n   local functions\n==========================================================\n*/\n\nvoid opj_mqc_byteout(opj_mqc_t *mqc) {\n\tif (*mqc->bp == 0xff) {\n\t\tmqc->bp++;\n\t\t*mqc->bp = (OPJ_BYTE)(mqc->c >> 20);\n\t\tmqc->c &= 0xfffff;\n\t\tmqc->ct = 7;\n\t} else {\n\t\tif ((mqc->c & 0x8000000) == 0) {\t/* ((mqc->c&0x8000000)==0) CHANGE */\n\t\t\tmqc->bp++;\n\t\t\t*mqc->bp = (OPJ_BYTE)(mqc->c >> 19);\n\t\t\tmqc->c &= 0x7ffff;\n\t\t\tmqc->ct = 8;\n\t\t} else {\n\t\t\t(*mqc->bp)++;\n\t\t\tif (*mqc->bp == 0xff) {\n\t\t\t\tmqc->c &= 0x7ffffff;\n\t\t\t\tmqc->bp++;\n\t\t\t\t*mqc->bp = (OPJ_BYTE)(mqc->c >> 20);\n\t\t\t\tmqc->c &= 0xfffff;\n\t\t\t\tmqc->ct = 7;\n\t\t\t} else {\n\t\t\t\tmqc->bp++;\n\t\t\t\t*mqc->bp = (OPJ_BYTE)(mqc->c >> 19);\n\t\t\t\tmqc->c &= 0x7ffff;\n\t\t\t\tmqc->ct = 8;\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid opj_mqc_renorme(opj_mqc_t *mqc) {\n\tdo {\n\t\tmqc->a <<= 1;\n\t\tmqc->c <<= 1;\n\t\tmqc->ct--;\n\t\tif (mqc->ct == 0) {\n\t\t\topj_mqc_byteout(mqc);\n\t\t}\n\t} while ((mqc->a & 0x8000) == 0);\n}\n\nvoid opj_mqc_codemps(opj_mqc_t *mqc) {\n\tmqc->a -= (*mqc->curctx)->qeval;\n\tif ((mqc->a & 0x8000) == 0) {\n\t\tif (mqc->a < (*mqc->curctx)->qeval) {\n\t\t\tmqc->a = (*mqc->curctx)->qeval;\n\t\t} else {\n\t\t\tmqc->c += (*mqc->curctx)->qeval;\n\t\t}\n\t\t*mqc->curctx = (*mqc->curctx)->nmps;\n\t\topj_mqc_renorme(mqc);\n\t} else {\n\t\tmqc->c += (*mqc->curctx)->qeval;\n\t}\n}\n\nvoid opj_mqc_codelps(opj_mqc_t *mqc) {\n\tmqc->a -= (*mqc->curctx)->qeval;\n\tif (mqc->a < (*mqc->curctx)->qeval) {\n\t\tmqc->c += (*mqc->curctx)->qeval;\n\t} else {\n\t\tmqc->a = (*mqc->curctx)->qeval;\n\t}\n\t*mqc->curctx = (*mqc->curctx)->nlps;\n\topj_mqc_renorme(mqc);\n}\n\nvoid opj_mqc_setbits(opj_mqc_t *mqc) {\n\tOPJ_UINT32 tempc = mqc->c + mqc->a;\n\tmqc->c |= 0xffff;\n\tif (mqc->c >= tempc) {\n\t\tmqc->c -= 0x8000;\n\t}\n}\n\nstatic INLINE OPJ_INT32 opj_mqc_mpsexchange(opj_mqc_t *const mqc) {\n\tOPJ_INT32 d;\n\tif (mqc->a < (*mqc->curctx)->qeval) {\n\t\td = (OPJ_INT32)(1 - (*mqc->curctx)->mps);\n\t\t*mqc->curctx = (*mqc->curctx)->nlps;\n\t} else {\n\t\td = (OPJ_INT32)(*mqc->curctx)->mps;\n\t\t*mqc->curctx = (*mqc->curctx)->nmps;\n\t}\n\t\n\treturn d;\n}\n\nstatic INLINE OPJ_INT32 opj_mqc_lpsexchange(opj_mqc_t *const mqc) {\n\tOPJ_INT32 d;\n\tif (mqc->a < (*mqc->curctx)->qeval) {\n\t\tmqc->a = (*mqc->curctx)->qeval;\n\t\td = (OPJ_INT32)(*mqc->curctx)->mps;\n\t\t*mqc->curctx = (*mqc->curctx)->nmps;\n\t} else {\n\t\tmqc->a = (*mqc->curctx)->qeval;\n\t\td = (OPJ_INT32)(1 - (*mqc->curctx)->mps);\n\t\t*mqc->curctx = (*mqc->curctx)->nlps;\n\t}\n\t\n\treturn d;\n}\n\n#ifdef MQC_PERF_OPT\nstatic INLINE void opj_mqc_bytein(opj_mqc_t *const mqc) {\n\tunsigned int i = *((unsigned int *) mqc->bp);\n\tmqc->c += i & 0xffff00;\n\tmqc->ct = i & 0x0f;\n\tmqc->bp += (i >> 2) & 0x04;\n}\n#else\nstatic void opj_mqc_bytein(opj_mqc_t *const mqc) {\n\tif (mqc->bp != mqc->end) {\n\t\tOPJ_UINT32 c;\n\t\tif (mqc->bp + 1 != mqc->end) {\n\t\t\tc = *(mqc->bp + 1);\n\t\t} else {\n\t\t\tc = 0xff;\n\t\t}\n\t\tif (*mqc->bp == 0xff) {\n\t\t\tif (c > 0x8f) {\n\t\t\t\tmqc->c += 0xff00;\n\t\t\t\tmqc->ct = 8;\n\t\t\t} else {\n\t\t\t\tmqc->bp++;\n\t\t\t\tmqc->c += c << 9;\n\t\t\t\tmqc->ct = 7;\n\t\t\t}\n\t\t} else {\n\t\t\tmqc->bp++;\n\t\t\tmqc->c += c << 8;\n\t\t\tmqc->ct = 8;\n\t\t}\n\t} else {\n\t\tmqc->c += 0xff00;\n\t\tmqc->ct = 8;\n\t}\n}\n#endif\n\nstatic INLINE void opj_mqc_renormd(opj_mqc_t *const mqc) {\n\tdo {\n\t\tif (mqc->ct == 0) {\n\t\t\topj_mqc_bytein(mqc);\n\t\t}\n\t\tmqc->a <<= 1;\n\t\tmqc->c <<= 1;\n\t\tmqc->ct--;\n\t} while (mqc->a < 0x8000);\n}\n\n/* \n==========================================================\n   MQ-Coder interface\n==========================================================\n*/\n\nopj_mqc_t* opj_mqc_create(void) {\n\topj_mqc_t *mqc = (opj_mqc_t*)opj_malloc(sizeof(opj_mqc_t));\n#ifdef MQC_PERF_OPT\n\tmqc->buffer = NULL;\n#endif\n\treturn mqc;\n}\n\nvoid opj_mqc_destroy(opj_mqc_t *mqc) {\n\tif(mqc) {\n#ifdef MQC_PERF_OPT\n\t\topj_free(mqc->buffer);\n#endif\n\t\topj_free(mqc);\n\t}\n}\n\nOPJ_UINT32 opj_mqc_numbytes(opj_mqc_t *mqc) {\n\tconst ptrdiff_t diff = mqc->bp - mqc->start;\n#if 0\n  assert( diff <= 0xffffffff && diff >= 0 ); /* UINT32_MAX */\n#endif\n\treturn (OPJ_UINT32)diff;\n}\n\nvoid opj_mqc_init_enc(opj_mqc_t *mqc, OPJ_BYTE *bp) {\n    /* TODO MSD: need to take a look to the v2 version */\n\topj_mqc_setcurctx(mqc, 0);\n\tmqc->a = 0x8000;\n\tmqc->c = 0;\n\tmqc->bp = bp - 1;\n\tmqc->ct = 12;\n\tif (*mqc->bp == 0xff) {\n\t\tmqc->ct = 13;\n\t}\n\tmqc->start = bp;\n}\n\nvoid opj_mqc_encode(opj_mqc_t *mqc, OPJ_UINT32 d) {\n\tif ((*mqc->curctx)->mps == d) {\n\t\topj_mqc_codemps(mqc);\n\t} else {\n\t\topj_mqc_codelps(mqc);\n\t}\n}\n\nvoid opj_mqc_flush(opj_mqc_t *mqc) {\n\topj_mqc_setbits(mqc);\n\tmqc->c <<= mqc->ct;\n\topj_mqc_byteout(mqc);\n\tmqc->c <<= mqc->ct;\n\topj_mqc_byteout(mqc);\n\t\n\tif (*mqc->bp != 0xff) {\n\t\tmqc->bp++;\n\t}\n}\n\nvoid opj_mqc_bypass_init_enc(opj_mqc_t *mqc) {\n\tmqc->c = 0;\n\tmqc->ct = 8;\n\t/*if (*mqc->bp == 0xff) {\n\tmqc->ct = 7;\n     } */\n}\n\nvoid opj_mqc_bypass_enc(opj_mqc_t *mqc, OPJ_UINT32 d) {\n\tmqc->ct--;\n\tmqc->c = mqc->c + (d << mqc->ct);\n\tif (mqc->ct == 0) {\n\t\tmqc->bp++;\n\t\t*mqc->bp = (OPJ_BYTE)mqc->c;\n\t\tmqc->ct = 8;\n\t\tif (*mqc->bp == 0xff) {\n\t\t\tmqc->ct = 7;\n\t\t}\n\t\tmqc->c = 0;\n\t}\n}\n\nOPJ_UINT32 opj_mqc_bypass_flush_enc(opj_mqc_t *mqc) {\n\tOPJ_BYTE bit_padding;\n\t\n\tbit_padding = 0;\n\t\n\tif (mqc->ct != 0) {\n\t\twhile (mqc->ct > 0) {\n\t\t\tmqc->ct--;\n\t\t\tmqc->c += (OPJ_UINT32)(bit_padding << mqc->ct);\n\t\t\tbit_padding = (bit_padding + 1) & 0x01;\n\t\t}\n\t\tmqc->bp++;\n\t\t*mqc->bp = (OPJ_BYTE)mqc->c;\n\t\tmqc->ct = 8;\n\t\tmqc->c = 0;\n\t}\n\t\n\treturn 1;\n}\n\nvoid opj_mqc_reset_enc(opj_mqc_t *mqc) {\n\topj_mqc_resetstates(mqc);\n\topj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);\n\topj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);\n\topj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);\n}\n\nOPJ_UINT32 opj_mqc_restart_enc(opj_mqc_t *mqc) {\n\tOPJ_UINT32 correction = 1;\n\t\n\t/* <flush part> */\n\tOPJ_INT32 n = (OPJ_INT32)(27 - 15 - mqc->ct);\n\tmqc->c <<= mqc->ct;\n\twhile (n > 0) {\n\t\topj_mqc_byteout(mqc);\n\t\tn -= (OPJ_INT32)mqc->ct;\n\t\tmqc->c <<= mqc->ct;\n\t}\n\topj_mqc_byteout(mqc);\n\t\n\treturn correction;\n}\n\nvoid opj_mqc_restart_init_enc(opj_mqc_t *mqc) {\n\t/* <Re-init part> */\n\topj_mqc_setcurctx(mqc, 0);\n\tmqc->a = 0x8000;\n\tmqc->c = 0;\n\tmqc->ct = 12;\n\tmqc->bp--;\n\tif (*mqc->bp == 0xff) {\n\t\tmqc->ct = 13;\n\t}\n}\n\nvoid opj_mqc_erterm_enc(opj_mqc_t *mqc) {\n\tOPJ_INT32 k = (OPJ_INT32)(11 - mqc->ct + 1);\n\t\n\twhile (k > 0) {\n\t\tmqc->c <<= mqc->ct;\n\t\tmqc->ct = 0;\n\t\topj_mqc_byteout(mqc);\n\t\tk -= (OPJ_INT32)mqc->ct;\n\t}\n\t\n\tif (*mqc->bp != 0xff) {\n\t\topj_mqc_byteout(mqc);\n\t}\n}\n\nvoid opj_mqc_segmark_enc(opj_mqc_t *mqc) {\n\tOPJ_UINT32 i;\n\topj_mqc_setcurctx(mqc, 18);\n\t\n\tfor (i = 1; i < 5; i++) {\n\t\topj_mqc_encode(mqc, i % 2);\n\t}\n}\n\nOPJ_BOOL opj_mqc_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len) {\n\topj_mqc_setcurctx(mqc, 0);\n\tmqc->start = bp;\n\tmqc->end = bp + len;\n\tmqc->bp = bp;\n\tif (len==0) mqc->c = 0xff << 16;\n\telse mqc->c = (OPJ_UINT32)(*mqc->bp << 16);\n\n#ifdef MQC_PERF_OPT /* TODO_MSD: check this option and put in experimental */\n\t{\n        OPJ_UINT32 c;\n\t\tOPJ_UINT32 *ip;\n\t\tOPJ_BYTE *end = mqc->end - 1;\n        void* new_buffer = opj_realloc(mqc->buffer, (len + 1) * sizeof(OPJ_UINT32));\n        if (! new_buffer) {\n            opj_free(mqc->buffer);\n            mqc->buffer = NULL;\n            return OPJ_FALSE;\n        }\n        mqc->buffer = new_buffer;\n\t\t\n        ip = (OPJ_UINT32 *) mqc->buffer;\n\n\t\twhile (bp < end) {\n\t\t\tc = *(bp + 1);\n\t\t\tif (*bp == 0xff) {\n\t\t\t\tif (c > 0x8f) {\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\t*ip = 0x00000017 | (c << 9);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t*ip = 0x00000018 | (c << 8);\n\t\t\t}\n\t\t\tbp++;\n\t\t\tip++;\n\t\t}\n\n\t\t/* Handle last byte of data */\n\t\tc = 0xff;\n\t\tif (*bp == 0xff) {\n\t\t\t*ip = 0x0000ff18;\n\t\t} else {\n\t\t\tbp++;\n\t\t\t*ip = 0x00000018 | (c << 8);\n\t\t}\n\t\tip++;\n\n\t\t*ip = 0x0000ff08;\n\t\tmqc->bp = mqc->buffer;\n\t}\n#endif\n\topj_mqc_bytein(mqc);\n\tmqc->c <<= 7;\n\tmqc->ct -= 7;\n\tmqc->a = 0x8000;\n        return OPJ_TRUE;\n}\n\nOPJ_INT32 opj_mqc_decode(opj_mqc_t *const mqc) {\n\tOPJ_INT32 d;\n\tmqc->a -= (*mqc->curctx)->qeval;\n\tif ((mqc->c >> 16) < (*mqc->curctx)->qeval) {\n\t\td = opj_mqc_lpsexchange(mqc);\n\t\topj_mqc_renormd(mqc);\n\t} else {\n\t\tmqc->c -= (*mqc->curctx)->qeval << 16;\n\t\tif ((mqc->a & 0x8000) == 0) {\n\t\t\td = opj_mqc_mpsexchange(mqc);\n\t\t\topj_mqc_renormd(mqc);\n\t\t} else {\n\t\t\td = (OPJ_INT32)(*mqc->curctx)->mps;\n\t\t}\n\t}\n\n\treturn d;\n}\n\nvoid opj_mqc_resetstates(opj_mqc_t *mqc) {\n\tOPJ_UINT32 i;\n\tfor (i = 0; i < MQC_NUMCTXS; i++) {\n\t\tmqc->ctxs[i] = mqc_states;\n\t}\n}\n\nvoid opj_mqc_setstate(opj_mqc_t *mqc, OPJ_UINT32 ctxno, OPJ_UINT32 msb, OPJ_INT32 prob) {\n\tmqc->ctxs[ctxno] = &mqc_states[msb + (OPJ_UINT32)(prob << 1)];\n}\n\n\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mqc.h",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2001-2003, David Janssens\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifndef __MQC_H\n#define __MQC_H\n/**\n@file mqc.h\n@brief Implementation of an MQ-Coder (MQC)\n\nThe functions in MQC.C have for goal to realize the MQ-coder operations. The functions\nin MQC.C are used by some function in T1.C.\n*/\n\n/** @defgroup MQC MQC - Implementation of an MQ-Coder */\n/*@{*/\n\n/**\nThis struct defines the state of a context.\n*/\ntypedef struct opj_mqc_state {\n\t/** the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */\n\tOPJ_UINT32 qeval;\n\t/** the Most Probable Symbol (0 or 1) */\n\tOPJ_UINT32 mps;\n\t/** next state if the next encoded symbol is the MPS */\n\tstruct opj_mqc_state *nmps;\n\t/** next state if the next encoded symbol is the LPS */\n\tstruct opj_mqc_state *nlps;\n} opj_mqc_state_t;\n\n#define MQC_NUMCTXS 19\n\n/**\nMQ coder\n*/\ntypedef struct opj_mqc {\n\tOPJ_UINT32 c;\n\tOPJ_UINT32 a;\n\tOPJ_UINT32 ct;\n\tOPJ_BYTE *bp;\n\tOPJ_BYTE *start;\n\tOPJ_BYTE *end;\n\topj_mqc_state_t *ctxs[MQC_NUMCTXS];\n\topj_mqc_state_t **curctx;\n#ifdef MQC_PERF_OPT\n\tunsigned char *buffer;\n#endif\n} opj_mqc_t;\n\n/** @name Exported functions */\n/*@{*/\n/* ----------------------------------------------------------------------- */\n/**\nCreate a new MQC handle \n@return Returns a new MQC handle if successful, returns NULL otherwise\n*/\nopj_mqc_t* opj_mqc_create(void);\n/**\nDestroy a previously created MQC handle\n@param mqc MQC handle to destroy\n*/\nvoid opj_mqc_destroy(opj_mqc_t *mqc);\n/**\nReturn the number of bytes written/read since initialisation\n@param mqc MQC handle\n@return Returns the number of bytes already encoded\n*/\nOPJ_UINT32 opj_mqc_numbytes(opj_mqc_t *mqc);\n/**\nReset the states of all the context of the coder/decoder \n(each context is set to a state where 0 and 1 are more or less equiprobable)\n@param mqc MQC handle\n*/\nvoid opj_mqc_resetstates(opj_mqc_t *mqc);\n/**\nSet the state of a particular context\n@param mqc MQC handle\n@param ctxno Number that identifies the context\n@param msb The MSB of the new state of the context\n@param prob Number that identifies the probability of the symbols for the new state of the context\n*/\nvoid opj_mqc_setstate(opj_mqc_t *mqc, OPJ_UINT32 ctxno, OPJ_UINT32 msb, OPJ_INT32 prob);\n/**\nInitialize the encoder\n@param mqc MQC handle\n@param bp Pointer to the start of the buffer where the bytes will be written\n*/\nvoid opj_mqc_init_enc(opj_mqc_t *mqc, OPJ_BYTE *bp);\n/**\nSet the current context used for coding/decoding\n@param mqc MQC handle\n@param ctxno Number that identifies the context\n*/\n#define opj_mqc_setcurctx(mqc, ctxno)\t(mqc)->curctx = &(mqc)->ctxs[(OPJ_UINT32)(ctxno)]\n/**\nEncode a symbol using the MQ-coder\n@param mqc MQC handle\n@param d The symbol to be encoded (0 or 1)\n*/\nvoid opj_mqc_encode(opj_mqc_t *mqc, OPJ_UINT32 d);\n/**\nFlush the encoder, so that all remaining data is written\n@param mqc MQC handle\n*/\nvoid opj_mqc_flush(opj_mqc_t *mqc);\n/**\nBYPASS mode switch, initialization operation. \nJPEG 2000 p 505. \n<h2>Not fully implemented and tested !!</h2>\n@param mqc MQC handle\n*/\nvoid opj_mqc_bypass_init_enc(opj_mqc_t *mqc);\n/**\nBYPASS mode switch, coding operation. \nJPEG 2000 p 505. \n<h2>Not fully implemented and tested !!</h2>\n@param mqc MQC handle\n@param d The symbol to be encoded (0 or 1)\n*/\nvoid opj_mqc_bypass_enc(opj_mqc_t *mqc, OPJ_UINT32 d);\n/**\nBYPASS mode switch, flush operation\n<h2>Not fully implemented and tested !!</h2>\n@param mqc MQC handle\n@return Returns 1 (always)\n*/\nOPJ_UINT32 opj_mqc_bypass_flush_enc(opj_mqc_t *mqc);\n/**\nRESET mode switch\n@param mqc MQC handle\n*/\nvoid opj_mqc_reset_enc(opj_mqc_t *mqc);\n/**\nRESTART mode switch (TERMALL)\n@param mqc MQC handle\n@return Returns 1 (always)\n*/\nOPJ_UINT32 opj_mqc_restart_enc(opj_mqc_t *mqc);\n/**\nRESTART mode switch (TERMALL) reinitialisation\n@param mqc MQC handle\n*/\nvoid opj_mqc_restart_init_enc(opj_mqc_t *mqc);\n/**\nERTERM mode switch (PTERM)\n@param mqc MQC handle\n*/\nvoid opj_mqc_erterm_enc(opj_mqc_t *mqc);\n/**\nSEGMARK mode switch (SEGSYM)\n@param mqc MQC handle\n*/\nvoid opj_mqc_segmark_enc(opj_mqc_t *mqc);\n/**\nInitialize the decoder\n@param mqc MQC handle\n@param bp Pointer to the start of the buffer from which the bytes will be read\n@param len Length of the input buffer\n*/\nOPJ_BOOL opj_mqc_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len);\n/**\nDecode a symbol\n@param mqc MQC handle\n@return Returns the decoded symbol (0 or 1)\n*/\nOPJ_INT32 opj_mqc_decode(opj_mqc_t * const mqc);\n/* ----------------------------------------------------------------------- */\n/*@}*/\n\n/*@}*/\n\n#endif /* __MQC_H */\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/openjpeg.c",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR \n * Copyright (c) 2012, CS Systemes d'Information, France\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifdef _WIN32\n#include <windows.h>\n#endif /* _WIN32 */\n\n#include \"opj_includes.h\"\n\n\n/* ---------------------------------------------------------------------- */\n/* Functions to set the message handlers */\n\nOPJ_BOOL OPJ_CALLCONV opj_set_info_handler(\topj_codec_t * p_codec, \n\t\t\t\t\t\t\t\t\t\t\topj_msg_callback p_callback,\n\t\t\t\t\t\t\t\t\t\t\tvoid * p_user_data)\n{\n\topj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;\n\tif(! l_codec){\n\t\treturn OPJ_FALSE;\n\t}\n\t\n\tl_codec->m_event_mgr.info_handler = p_callback;\n\tl_codec->m_event_mgr.m_info_data = p_user_data;\n\t\n\treturn OPJ_TRUE;\n}\n\nOPJ_BOOL OPJ_CALLCONV opj_set_warning_handler(\topj_codec_t * p_codec, \n\t\t\t\t\t\t\t\t\t\t\t\topj_msg_callback p_callback,\n\t\t\t\t\t\t\t\t\t\t\t\tvoid * p_user_data)\n{\n\topj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;\n\tif (! l_codec) {\n\t\treturn OPJ_FALSE;\n\t}\n\t\n\tl_codec->m_event_mgr.warning_handler = p_callback;\n\tl_codec->m_event_mgr.m_warning_data = p_user_data;\n\t\n\treturn OPJ_TRUE;\n}\n\nOPJ_BOOL OPJ_CALLCONV opj_set_error_handler(opj_codec_t * p_codec, \n\t\t\t\t\t\t\t\t\t\t\topj_msg_callback p_callback,\n\t\t\t\t\t\t\t\t\t\t\tvoid * p_user_data)\n{\n\topj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;\n\tif (! l_codec) {\n\t\treturn OPJ_FALSE;\n\t}\n\t\n\tl_codec->m_event_mgr.error_handler = p_callback;\n\tl_codec->m_event_mgr.m_error_data = p_user_data;\n\t\n\treturn OPJ_TRUE;\n}\n\n/* ---------------------------------------------------------------------- */\n\nstatic OPJ_SIZE_T opj_read_from_file (void * p_buffer, OPJ_SIZE_T p_nb_bytes, FILE * p_file)\n{\n\tOPJ_SIZE_T l_nb_read = fread(p_buffer,1,p_nb_bytes,p_file);\n\treturn l_nb_read ? l_nb_read : (OPJ_SIZE_T)-1;\n}\n\nstatic OPJ_UINT64 opj_get_data_length_from_file (FILE * p_file)\n{\n\tOPJ_OFF_T file_length = 0;\n\n\tOPJ_FSEEK(p_file, 0, SEEK_END);\n\tfile_length = (OPJ_OFF_T)OPJ_FTELL(p_file);\n\tOPJ_FSEEK(p_file, 0, SEEK_SET);\n\n\treturn (OPJ_UINT64)file_length;\n}\n\nstatic OPJ_SIZE_T opj_write_from_file (void * p_buffer, OPJ_SIZE_T p_nb_bytes, FILE * p_file)\n{\n\treturn fwrite(p_buffer,1,p_nb_bytes,p_file);\n}\n\nstatic OPJ_OFF_T opj_skip_from_file (OPJ_OFF_T p_nb_bytes, FILE * p_user_data)\n{\n\tif (OPJ_FSEEK(p_user_data,p_nb_bytes,SEEK_CUR)) {\n\t\treturn -1;\n\t}\n\n\treturn p_nb_bytes;\n}\n\nstatic OPJ_BOOL opj_seek_from_file (OPJ_OFF_T p_nb_bytes, FILE * p_user_data)\n{\n\tif (OPJ_FSEEK(p_user_data,p_nb_bytes,SEEK_SET)) {\n\t\treturn OPJ_FALSE;\n\t}\n\n\treturn OPJ_TRUE;\n}\n\n/* ---------------------------------------------------------------------- */\n#ifdef _WIN32\n#ifndef OPJ_STATIC\nBOOL APIENTRY\nDllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {\n\n\tOPJ_ARG_NOT_USED(lpReserved);\n\tOPJ_ARG_NOT_USED(hModule);\n\n\tswitch (ul_reason_for_call) {\n\t\tcase DLL_PROCESS_ATTACH :\n\t\t\tbreak;\n\t\tcase DLL_PROCESS_DETACH :\n\t\t\tbreak;\n\t\tcase DLL_THREAD_ATTACH :\n\t\tcase DLL_THREAD_DETACH :\n\t\t\tbreak;\n    }\n\n    return TRUE;\n}\n#endif /* OPJ_STATIC */\n#endif /* _WIN32 */\n\n/* ---------------------------------------------------------------------- */\n\nconst char* OPJ_CALLCONV opj_version(void) {\n    return OPJ_PACKAGE_VERSION;\n}\n\n/* ---------------------------------------------------------------------- */\n/* DECOMPRESSION FUNCTIONS*/\n\nopj_codec_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT p_format)\n{\n\topj_codec_private_t *l_codec = 00;\n\n\tl_codec = (opj_codec_private_t*) opj_calloc(1, sizeof(opj_codec_private_t));\n\tif (!l_codec){\n\t\treturn 00;\n\t}\n\tmemset(l_codec, 0, sizeof(opj_codec_private_t));\n\n\tl_codec->is_decompressor = 1;\n\n\tswitch (p_format) {\n\t\tcase OPJ_CODEC_J2K:\n\t\t\tl_codec->opj_dump_codec = (void (*) (void*, OPJ_INT32, FILE*)) j2k_dump;\n\n\t\t\tl_codec->opj_get_codec_info = (opj_codestream_info_v2_t* (*) (void*) ) j2k_get_cstr_info;\n\n\t\t\tl_codec->opj_get_codec_index = (opj_codestream_index_t* (*) (void*) ) j2k_get_cstr_index;\n\n\t\t\tl_codec->m_codec_data.m_decompression.opj_decode =\n\t\t\t\t\t(OPJ_BOOL (*) (\tvoid *,\n\t\t\t\t\t\t\t\t\tstruct opj_stream_private *,\n\t\t\t\t\t\t\t\t\topj_image_t*, struct opj_event_mgr * )) opj_j2k_decode;\n\n\t\t\tl_codec->m_codec_data.m_decompression.opj_end_decompress =\n\t\t\t\t\t(OPJ_BOOL (*) (\tvoid *,\n\t\t\t\t\t\t\t\t\tstruct opj_stream_private *,\n\t\t\t\t\t\t\t\t\tstruct opj_event_mgr *)) opj_j2k_end_decompress;\n\n\t\t\tl_codec->m_codec_data.m_decompression.opj_read_header =\n\t\t\t\t\t(OPJ_BOOL (*) (\tstruct opj_stream_private *,\n\t\t\t\t\t\t\t\t\tvoid *,\n\t\t\t\t\t\t\t\t\topj_image_t **,\n\t\t\t\t\t\t\t\t\tstruct opj_event_mgr * )) opj_j2k_read_header;\n\n\t\t\tl_codec->m_codec_data.m_decompression.opj_destroy =\n\t\t\t\t\t(void (*) (void *))opj_j2k_destroy;\n\n\t\t\tl_codec->m_codec_data.m_decompression.opj_setup_decoder =\n\t\t\t\t\t(void (*) (void * , opj_dparameters_t * )) opj_j2k_setup_decoder;\n\n\t\t\tl_codec->m_codec_data.m_decompression.opj_read_tile_header =\n\t\t\t\t\t(OPJ_BOOL (*) (\tvoid *,\n\t\t\t\t\t\t\t\t\tOPJ_UINT32*,\n\t\t\t\t\t\t\t\t\tOPJ_UINT32*,\n\t\t\t\t\t\t\t\t\tOPJ_INT32*, OPJ_INT32*,\n\t\t\t\t\t\t\t\t\tOPJ_INT32*, OPJ_INT32*,\n\t\t\t\t\t\t\t\t\tOPJ_UINT32*,\n\t\t\t\t\t\t\t\t\tOPJ_BOOL*,\n\t\t\t\t\t\t\t\t\tstruct opj_stream_private *,\n\t\t\t\t\t\t\t\t\tstruct opj_event_mgr * )) opj_j2k_read_tile_header;\n\n\t\t\tl_codec->m_codec_data.m_decompression.opj_decode_tile_data =\n\t\t\t\t\t(OPJ_BOOL (*) ( void *, \n                                    OPJ_UINT32, \n                                    OPJ_BYTE*, \n                                    OPJ_UINT32, \n                                    struct opj_stream_private *,\n                                    struct opj_event_mgr *)) opj_j2k_decode_tile;\n\n\t\t\tl_codec->m_codec_data.m_decompression.opj_set_decode_area =\n\t\t\t\t\t(OPJ_BOOL (*) ( void *, \n                                    opj_image_t*, \n                                    OPJ_INT32, OPJ_INT32, OPJ_INT32, OPJ_INT32, \n                                    struct opj_event_mgr *)) opj_j2k_set_decode_area;\n\n\t\t\tl_codec->m_codec_data.m_decompression.opj_get_decoded_tile = \n                    (OPJ_BOOL (*) ( void *p_codec,\n\t\t\t\t\t\t\t\t    opj_stream_private_t *p_cio,\n\t\t\t\t\t\t\t\t    opj_image_t *p_image,\n\t\t\t\t\t\t\t\t    struct opj_event_mgr * p_manager,\n\t\t\t\t\t\t\t\t    OPJ_UINT32 tile_index)) opj_j2k_get_tile;\n\n\t\t\tl_codec->m_codec_data.m_decompression.opj_set_decoded_resolution_factor = \n                    (OPJ_BOOL (*) ( void * p_codec,\n\t\t\t\t\t\t\t\t\tOPJ_UINT32 res_factor,\n\t\t\t\t\t\t\t\t\tstruct opj_event_mgr * p_manager)) opj_j2k_set_decoded_resolution_factor;\n\n\t\t\tl_codec->m_codec = opj_j2k_create_decompress();\n\n\t\t\tif (! l_codec->m_codec) {\n\t\t\t\topj_free(l_codec);\n\t\t\t\treturn NULL;\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase OPJ_CODEC_JP2:\n\t\t\t/* get a JP2 decoder handle */\n\t\t\tl_codec->opj_dump_codec = (void (*) (void*, OPJ_INT32, FILE*)) jp2_dump;\n\n\t\t\tl_codec->opj_get_codec_info = (opj_codestream_info_v2_t* (*) (void*) ) jp2_get_cstr_info;\n\n\t\t\tl_codec->opj_get_codec_index = (opj_codestream_index_t* (*) (void*) ) jp2_get_cstr_index;\n\n\t\t\tl_codec->m_codec_data.m_decompression.opj_decode =\n\t\t\t\t\t(OPJ_BOOL (*) (\tvoid *,\n\t\t\t\t\t\t\t\t\tstruct opj_stream_private *,\n\t\t\t\t\t\t\t\t\topj_image_t*,\n\t\t\t\t\t\t\t\t\tstruct opj_event_mgr * )) opj_jp2_decode;\n\n\t\t\tl_codec->m_codec_data.m_decompression.opj_end_decompress =  \n                    (OPJ_BOOL (*) ( void *,\n                                    struct opj_stream_private *,\n                                    struct opj_event_mgr *)) opj_jp2_end_decompress;\n\n\t\t\tl_codec->m_codec_data.m_decompression.opj_read_header =  \n                    (OPJ_BOOL (*) ( struct opj_stream_private *,\n\t\t\t\t\t                void *,\n\t\t\t\t\t                opj_image_t **,\n\t\t\t\t\t                struct opj_event_mgr * )) opj_jp2_read_header;\n\n\t\t\tl_codec->m_codec_data.m_decompression.opj_read_tile_header = \n                    (OPJ_BOOL (*) ( void *,\n\t\t\t\t\t                OPJ_UINT32*,\n\t\t\t\t\t                OPJ_UINT32*,\n\t\t\t\t\t                OPJ_INT32*,\n\t\t\t\t\t                OPJ_INT32*,\n\t\t\t\t\t                OPJ_INT32 * ,\n\t\t\t\t\t                OPJ_INT32 * ,\n\t\t\t\t\t                OPJ_UINT32 * ,\n\t\t\t\t\t                OPJ_BOOL *,\n\t\t\t\t\t                struct opj_stream_private *,\n\t\t\t\t\t                struct opj_event_mgr * )) opj_jp2_read_tile_header;\n\n\t\t\tl_codec->m_codec_data.m_decompression.opj_decode_tile_data = \n                    (OPJ_BOOL (*) ( void *,\n                                    OPJ_UINT32,OPJ_BYTE*,OPJ_UINT32,\n                                    struct opj_stream_private *,\n                                    struct opj_event_mgr * )) opj_jp2_decode_tile;\n\n\t\t\tl_codec->m_codec_data.m_decompression.opj_destroy = (void (*) (void *))opj_jp2_destroy;\n\n\t\t\tl_codec->m_codec_data.m_decompression.opj_setup_decoder = \n                    (void (*) (void * ,opj_dparameters_t * )) opj_jp2_setup_decoder;\n\n\t\t\tl_codec->m_codec_data.m_decompression.opj_set_decode_area = \n                    (OPJ_BOOL (*) ( void *,\n                                    opj_image_t*, \n                                    OPJ_INT32,OPJ_INT32,OPJ_INT32,OPJ_INT32,\n                                    struct opj_event_mgr * )) opj_jp2_set_decode_area;\n\n\t\t\tl_codec->m_codec_data.m_decompression.opj_get_decoded_tile = \n                    (OPJ_BOOL (*) ( void *p_codec,\n\t\t\t\t\t\t\t\t\topj_stream_private_t *p_cio,\n\t\t\t\t\t\t\t\t\topj_image_t *p_image,\n\t\t\t\t\t\t\t\t\tstruct opj_event_mgr * p_manager,\n\t\t\t\t\t\t\t\t\tOPJ_UINT32 tile_index)) opj_jp2_get_tile;\n\n\t\t\tl_codec->m_codec_data.m_decompression.opj_set_decoded_resolution_factor = \n                    (OPJ_BOOL (*) ( void * p_codec,\n\t\t\t\t\t\t    \t\tOPJ_UINT32 res_factor,\n\t\t\t\t\t\t\t    \topj_event_mgr_t * p_manager)) opj_jp2_set_decoded_resolution_factor;\n\n\t\t\tl_codec->m_codec = opj_jp2_create(OPJ_TRUE);\n\n\t\t\tif (! l_codec->m_codec) {\n\t\t\t\topj_free(l_codec);\n\t\t\t\treturn 00;\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase OPJ_CODEC_UNKNOWN:\n\t\tcase OPJ_CODEC_JPT:\n\t\tdefault:\n\t\t\topj_free(l_codec);\n\t\t\treturn 00;\n\t}\n\n\topj_set_default_event_handler(&(l_codec->m_event_mgr));\n\treturn (opj_codec_t*) l_codec;\n}\n\nvoid OPJ_CALLCONV opj_set_default_decoder_parameters(opj_dparameters_t *parameters) {\n\tif(parameters) {\n\t\tmemset(parameters, 0, sizeof(opj_dparameters_t));\n\t\t/* default decoding parameters */\n\t\tparameters->cp_layer = 0;\n\t\tparameters->cp_reduce = 0;\n\n\t\tparameters->decod_format = -1;\n\t\tparameters->cod_format = -1;\n\t\tparameters->flags = 0;\t\t\n/* UniPG>> */\n#ifdef USE_JPWL\n\t\tparameters->jpwl_correct = OPJ_FALSE;\n\t\tparameters->jpwl_exp_comps = JPWL_EXPECTED_COMPONENTS;\n\t\tparameters->jpwl_max_tiles = JPWL_MAXIMUM_TILES;\n#endif /* USE_JPWL */\n/* <<UniPG */\n\t}\n}\n\nOPJ_BOOL OPJ_CALLCONV opj_setup_decoder(opj_codec_t *p_codec,\n                                        opj_dparameters_t *parameters \n\t\t\t\t\t\t\t\t\t\t)\n{\n\tif (p_codec && parameters) { \n\t\topj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;\n\n\t\tif (! l_codec->is_decompressor) {\n\t\t\topj_event_msg(&(l_codec->m_event_mgr), EVT_ERROR, \n                \"Codec provided to the opj_setup_decoder function is not a decompressor handler.\\n\");\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\n\t\tl_codec->m_codec_data.m_decompression.opj_setup_decoder(l_codec->m_codec,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tparameters);\n\t\treturn OPJ_TRUE;\n\t}\n\treturn OPJ_FALSE;\n}\n\nOPJ_BOOL OPJ_CALLCONV opj_read_header (\topj_stream_t *p_stream,\n\t\t\t\t\t\t\t\t\t\topj_codec_t *p_codec,\n\t\t\t\t\t\t\t\t\t\topj_image_t **p_image )\n{\n\tif (p_codec && p_stream) {\n\t\topj_codec_private_t* l_codec = (opj_codec_private_t*) p_codec;\n\t\topj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;\n\n\t\tif(! l_codec->is_decompressor) {\n\t\t\topj_event_msg(&(l_codec->m_event_mgr), EVT_ERROR, \n                \"Codec provided to the opj_read_header function is not a decompressor handler.\\n\");\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\n\t\treturn l_codec->m_codec_data.m_decompression.opj_read_header(\tl_stream,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tl_codec->m_codec,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tp_image,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t&(l_codec->m_event_mgr) );\n\t}\n\n\treturn OPJ_FALSE;\n}\n\nOPJ_BOOL OPJ_CALLCONV opj_decode(   opj_codec_t *p_codec,\n                                    opj_stream_t *p_stream,\n                                    opj_image_t* p_image)\n{\n\tif (p_codec && p_stream) {\n\t\topj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;\n\t\topj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;\n\n\t\tif (! l_codec->is_decompressor) {\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\n\t\treturn l_codec->m_codec_data.m_decompression.opj_decode(l_codec->m_codec,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tl_stream,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tp_image,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t&(l_codec->m_event_mgr) );\n\t}\n\n\treturn OPJ_FALSE;\n}\n\nOPJ_BOOL OPJ_CALLCONV opj_set_decode_area(\topj_codec_t *p_codec,\n\t\t\t\t\t\t\t\t\t\t\topj_image_t* p_image,\n\t\t\t\t\t\t\t\t\t\t\tOPJ_INT32 p_start_x, OPJ_INT32 p_start_y,\n\t\t\t\t\t\t\t\t\t\t\tOPJ_INT32 p_end_x, OPJ_INT32 p_end_y\n\t\t\t\t\t\t\t\t\t\t\t)\n{\n\tif (p_codec) {\n\t\topj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;\n\t\t\n\t\tif (! l_codec->is_decompressor) {\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\n\t\treturn  l_codec->m_codec_data.m_decompression.opj_set_decode_area(\tl_codec->m_codec,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tp_image,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tp_start_x, p_start_y,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tp_end_x, p_end_y,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t&(l_codec->m_event_mgr) );\n\t}\n\treturn OPJ_FALSE;\n}\n\nOPJ_BOOL OPJ_CALLCONV opj_read_tile_header(\topj_codec_t *p_codec,\n\t\t\t\t\t\t\t\t\t\t\topj_stream_t * p_stream,\n\t\t\t\t\t\t\t\t\t\t\tOPJ_UINT32 * p_tile_index,\n\t\t\t\t\t\t\t\t\t\t\tOPJ_UINT32 * p_data_size,\n\t\t\t\t\t\t\t\t\t\t\tOPJ_INT32 * p_tile_x0, OPJ_INT32 * p_tile_y0,\n\t\t\t\t\t\t\t\t\t\t\tOPJ_INT32 * p_tile_x1, OPJ_INT32 * p_tile_y1,\n\t\t\t\t\t\t\t\t\t\t\tOPJ_UINT32 * p_nb_comps,\n\t\t\t\t\t\t\t\t\t\t\tOPJ_BOOL * p_should_go_on)\n{\n\tif (p_codec && p_stream && p_data_size && p_tile_index) {\n\t\topj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;\n\t\topj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;\n\n\t\tif (! l_codec->is_decompressor) {\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\n\t\treturn l_codec->m_codec_data.m_decompression.opj_read_tile_header(\tl_codec->m_codec,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tp_tile_index,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tp_data_size,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tp_tile_x0, p_tile_y0,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tp_tile_x1, p_tile_y1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tp_nb_comps,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tp_should_go_on,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tl_stream,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t&(l_codec->m_event_mgr));\n\t}\n\treturn OPJ_FALSE;\n}\n\nOPJ_BOOL OPJ_CALLCONV opj_decode_tile_data(\topj_codec_t *p_codec,\n\t\t\t\t\t\t\t\t\t\t\tOPJ_UINT32 p_tile_index,\n\t\t\t\t\t\t\t\t\t\t\tOPJ_BYTE * p_data,\n\t\t\t\t\t\t\t\t\t\t\tOPJ_UINT32 p_data_size,\n\t\t\t\t\t\t\t\t\t\t\topj_stream_t *p_stream\n\t\t\t\t\t\t\t\t\t\t\t)\n{\n\tif (p_codec && p_data && p_stream) {\n\t\topj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;\n\t\topj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;\n\n\t\tif (! l_codec->is_decompressor) {\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\n\t\treturn l_codec->m_codec_data.m_decompression.opj_decode_tile_data(\tl_codec->m_codec,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tp_tile_index,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tp_data,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tp_data_size,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tl_stream,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t&(l_codec->m_event_mgr) );\n\t}\n\treturn OPJ_FALSE;\n}\n\nOPJ_BOOL OPJ_CALLCONV opj_get_decoded_tile(\topj_codec_t *p_codec,\n\t\t\t\t\t\t\t\t\t\t\topj_stream_t *p_stream,\n\t\t\t\t\t\t\t\t\t\t\topj_image_t *p_image,\n\t\t\t\t\t\t\t\t\t\t\tOPJ_UINT32 tile_index)\n{\n\tif (p_codec && p_stream) {\n\t\topj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;\n\t\topj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;\n\n\t\tif (! l_codec->is_decompressor) {\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\t\t\n\t\treturn l_codec->m_codec_data.m_decompression.opj_get_decoded_tile(\tl_codec->m_codec,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tl_stream,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tp_image,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t&(l_codec->m_event_mgr),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttile_index);\n\t}\n\n\treturn OPJ_FALSE;\n}\n\nOPJ_BOOL OPJ_CALLCONV opj_set_decoded_resolution_factor(opj_codec_t *p_codec, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tOPJ_UINT32 res_factor )\n{\n\topj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;\n\n\tif ( !l_codec ){\n\t\tfprintf(stderr, \"[ERROR] Input parameters of the setup_decoder function are incorrect.\\n\");\n\t\treturn OPJ_FALSE;\n\t}\n\n\tl_codec->m_codec_data.m_decompression.opj_set_decoded_resolution_factor(l_codec->m_codec, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tres_factor,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t&(l_codec->m_event_mgr) );\n\treturn OPJ_TRUE;\n}\n\n/* ---------------------------------------------------------------------- */\n/* COMPRESSION FUNCTIONS*/\n\nopj_codec_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT p_format)\n{\n\topj_codec_private_t *l_codec = 00;\n\n\tl_codec = (opj_codec_private_t*)opj_calloc(1, sizeof(opj_codec_private_t));\n\tif (!l_codec) {\n\t\treturn 00;\n\t}\n\tmemset(l_codec, 0, sizeof(opj_codec_private_t));\n\t\n\tl_codec->is_decompressor = 0;\n\n\tswitch(p_format) {\n\t\tcase OPJ_CODEC_J2K:\n\t\t\tl_codec->m_codec_data.m_compression.opj_encode = (OPJ_BOOL (*) (void *,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstruct opj_stream_private *,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstruct opj_event_mgr * )) opj_j2k_encode;\n\n\t\t\tl_codec->m_codec_data.m_compression.opj_end_compress = (OPJ_BOOL (*) (\tvoid *,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstruct opj_stream_private *,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstruct opj_event_mgr *)) opj_j2k_end_compress;\n\n\t\t\tl_codec->m_codec_data.m_compression.opj_start_compress = (OPJ_BOOL (*) (void *,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstruct opj_stream_private *,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstruct opj_image * ,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstruct opj_event_mgr *)) opj_j2k_start_compress;\n\n\t\t\tl_codec->m_codec_data.m_compression.opj_write_tile = (OPJ_BOOL (*) (void *,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tOPJ_UINT32,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tOPJ_BYTE*,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tOPJ_UINT32,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstruct opj_stream_private *,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstruct opj_event_mgr *) ) opj_j2k_write_tile;\n\n\t\t\tl_codec->m_codec_data.m_compression.opj_destroy = (void (*) (void *)) opj_j2k_destroy;\n\n\t\t\tl_codec->m_codec_data.m_compression.opj_setup_encoder = (void (*) (\tvoid *,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\topj_cparameters_t *,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstruct opj_image *,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstruct opj_event_mgr * )) opj_j2k_setup_encoder;\n\n\t\t\tl_codec->m_codec = opj_j2k_create_compress();\n\t\t\tif (! l_codec->m_codec) {\n\t\t\t\topj_free(l_codec);\n\t\t\t\treturn 00;\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase OPJ_CODEC_JP2:\n\t\t\t/* get a JP2 decoder handle */\n\t\t\tl_codec->m_codec_data.m_compression.opj_encode = (OPJ_BOOL (*) (void *,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstruct opj_stream_private *,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstruct opj_event_mgr * )) opj_jp2_encode;\n\n\t\t\tl_codec->m_codec_data.m_compression.opj_end_compress = (OPJ_BOOL (*) (\tvoid *,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstruct opj_stream_private *,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstruct opj_event_mgr *)) opj_jp2_end_compress;\n\n\t\t\tl_codec->m_codec_data.m_compression.opj_start_compress = (OPJ_BOOL (*) (void *,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstruct opj_stream_private *,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstruct opj_image * ,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstruct opj_event_mgr *))  opj_jp2_start_compress;\n\n\t\t\tl_codec->m_codec_data.m_compression.opj_write_tile = (OPJ_BOOL (*) (void *,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tOPJ_UINT32,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tOPJ_BYTE*,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tOPJ_UINT32,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstruct opj_stream_private *,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstruct opj_event_mgr *)) opj_jp2_write_tile;\n\n\t\t\tl_codec->m_codec_data.m_compression.opj_destroy = (void (*) (void *)) opj_jp2_destroy;\n\n\t\t\tl_codec->m_codec_data.m_compression.opj_setup_encoder = (void (*) (\tvoid *,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\topj_cparameters_t *,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstruct opj_image *,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstruct opj_event_mgr * )) opj_jp2_setup_encoder;\n\n\t\t\tl_codec->m_codec = opj_jp2_create(OPJ_FALSE);\n\t\t\tif (! l_codec->m_codec) {\n\t\t\t\topj_free(l_codec);\n\t\t\t\treturn 00;\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase OPJ_CODEC_UNKNOWN:\n\t\tcase OPJ_CODEC_JPT:\n\t\tdefault:\n\t\t\topj_free(l_codec);\n\t\t\treturn 00;\n\t}\n\n\topj_set_default_event_handler(&(l_codec->m_event_mgr));\n\treturn (opj_codec_t*) l_codec;\n}\n\nvoid OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *parameters) {\n\tif(parameters) {\n\t\tmemset(parameters, 0, sizeof(opj_cparameters_t));\n\t\t/* default coding parameters */\n\t\tparameters->cp_cinema = OPJ_OFF; \n\t\tparameters->max_comp_size = 0;\n\t\tparameters->numresolution = 6;\n\t\tparameters->cp_rsiz = OPJ_STD_RSIZ;\n\t\tparameters->cblockw_init = 64;\n\t\tparameters->cblockh_init = 64;\n\t\tparameters->prog_order = OPJ_LRCP;\n\t\tparameters->roi_compno = -1;\t\t/* no ROI */\n\t\tparameters->subsampling_dx = 1;\n\t\tparameters->subsampling_dy = 1;\n\t\tparameters->tp_on = 0;\n\t\tparameters->decod_format = -1;\n\t\tparameters->cod_format = -1;\n\t\tparameters->tcp_rates[0] = 0;   \n\t\tparameters->tcp_numlayers = 0;\n\t\tparameters->cp_disto_alloc = 0;\n\t\tparameters->cp_fixed_alloc = 0;\n\t\tparameters->cp_fixed_quality = 0;\n\t\tparameters->jpip_on = OPJ_FALSE;\n/* UniPG>> */\n#ifdef USE_JPWL\n\t\tparameters->jpwl_epc_on = OPJ_FALSE;\n\t\tparameters->jpwl_hprot_MH = -1; /* -1 means unassigned */\n\t\t{\n\t\t\tint i;\n\t\t\tfor (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {\n\t\t\t\tparameters->jpwl_hprot_TPH_tileno[i] = -1; /* unassigned */\n\t\t\t\tparameters->jpwl_hprot_TPH[i] = 0; /* absent */\n\t\t\t}\n\t\t};\n\t\t{\n\t\t\tint i;\n\t\t\tfor (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) {\n\t\t\t\tparameters->jpwl_pprot_tileno[i] = -1; /* unassigned */\n\t\t\t\tparameters->jpwl_pprot_packno[i] = -1; /* unassigned */\n\t\t\t\tparameters->jpwl_pprot[i] = 0; /* absent */\n\t\t\t}\n\t\t};\n\t\tparameters->jpwl_sens_size = 0; /* 0 means no ESD */\n\t\tparameters->jpwl_sens_addr = 0; /* 0 means auto */\n\t\tparameters->jpwl_sens_range = 0; /* 0 means packet */\n\t\tparameters->jpwl_sens_MH = -1; /* -1 means unassigned */\n\t\t{\n\t\t\tint i;\n\t\t\tfor (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {\n\t\t\t\tparameters->jpwl_sens_TPH_tileno[i] = -1; /* unassigned */\n\t\t\t\tparameters->jpwl_sens_TPH[i] = -1; /* absent */\n\t\t\t}\n\t\t};\n#endif /* USE_JPWL */\n/* <<UniPG */\n\t}\n}\n\nOPJ_BOOL OPJ_CALLCONV opj_setup_encoder(opj_codec_t *p_codec, \n\t\t\t\t\t\t\t\t\t\topj_cparameters_t *parameters, \n\t\t\t\t\t\t\t\t\t\topj_image_t *p_image)\n{\n\tif (p_codec && parameters && p_image) {\n\t\topj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;\n\n\t\tif (! l_codec->is_decompressor) {\n\t\t\tl_codec->m_codec_data.m_compression.opj_setup_encoder(\tl_codec->m_codec,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tparameters,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tp_image,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t&(l_codec->m_event_mgr) );\n\t\t\treturn OPJ_TRUE;\n\t\t}\n\t}\n\n\treturn OPJ_FALSE;\n}\n\nOPJ_BOOL OPJ_CALLCONV opj_start_compress (\topj_codec_t *p_codec,\n\t\t\t\t\t\t\t\t\t\t\topj_image_t * p_image,\n\t\t\t\t\t\t\t\t\t\t\topj_stream_t *p_stream)\n{\n\tif (p_codec && p_stream) {\n\t\topj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;\n\t\topj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;\n\n\t\tif (! l_codec->is_decompressor) {\n\t\t\treturn l_codec->m_codec_data.m_compression.opj_start_compress(\tl_codec->m_codec,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tl_stream,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tp_image,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t&(l_codec->m_event_mgr));\n\t\t}\n\t}\n\n\treturn OPJ_FALSE;\n}\n\nOPJ_BOOL OPJ_CALLCONV opj_encode(opj_codec_t *p_info, opj_stream_t *p_stream)\n{\n\tif (p_info && p_stream) {\n\t\topj_codec_private_t * l_codec = (opj_codec_private_t *) p_info;\n\t\topj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;\n\n\t\tif (! l_codec->is_decompressor) {\n\t\t\treturn l_codec->m_codec_data.m_compression.opj_encode(\tl_codec->m_codec,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tl_stream,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t&(l_codec->m_event_mgr));\n\t\t}\n\t}\n\n\treturn OPJ_FALSE;\n\n}\n\nOPJ_BOOL OPJ_CALLCONV opj_end_compress (opj_codec_t *p_codec,\n\t\t\t\t\t\t\t\t\t\topj_stream_t *p_stream)\n{\n\tif (p_codec && p_stream) {\n\t\topj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;\n\t\topj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;\n\n\t\tif (! l_codec->is_decompressor) {\n\t\t\treturn l_codec->m_codec_data.m_compression.opj_end_compress(l_codec->m_codec,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tl_stream,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t&(l_codec->m_event_mgr));\n\t\t}\n\t}\n\treturn OPJ_FALSE;\n\n}\n\nOPJ_BOOL OPJ_CALLCONV opj_end_decompress (\topj_codec_t *p_codec,\n\t\t\t\t\t\t\t\t\t\t\topj_stream_t *p_stream)\n{\n\tif (p_codec && p_stream) {\n\t\topj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;\n\t\topj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;\n\n\t\tif (! l_codec->is_decompressor) {\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\t\t\n\t\treturn l_codec->m_codec_data.m_decompression.opj_end_decompress(l_codec->m_codec,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tl_stream,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t&(l_codec->m_event_mgr) );\n\t}\n\n\treturn OPJ_FALSE;\n}\n\nOPJ_BOOL OPJ_CALLCONV opj_set_MCT(opj_cparameters_t *parameters,\n                                  OPJ_FLOAT32 * pEncodingMatrix,\n                                  OPJ_INT32 * p_dc_shift,OPJ_UINT32 pNbComp)\n{\n\tOPJ_UINT32 l_matrix_size = pNbComp * pNbComp * (OPJ_UINT32)sizeof(OPJ_FLOAT32);\n\tOPJ_UINT32 l_dc_shift_size = pNbComp * (OPJ_UINT32)sizeof(OPJ_INT32);\n\tOPJ_UINT32 l_mct_total_size = l_matrix_size + l_dc_shift_size;\n\n\t/* add MCT capability */\n\tOPJ_INT32 rsiz = (OPJ_INT32)parameters->cp_rsiz | (OPJ_INT32)OPJ_MCT;\n\tparameters->cp_rsiz = (OPJ_RSIZ_CAPABILITIES)rsiz;\n\tparameters->irreversible = 1;\n\n\t/* use array based MCT */\n\tparameters->tcp_mct = 2;\n\tparameters->mct_data = opj_malloc(l_mct_total_size);\n\tif (! parameters->mct_data) {\n\t\treturn OPJ_FALSE;\n\t}\n\n\tmemcpy(parameters->mct_data,pEncodingMatrix,l_matrix_size);\n\tmemcpy(((OPJ_BYTE *) parameters->mct_data) +  l_matrix_size,p_dc_shift,l_dc_shift_size);\n\n\treturn OPJ_TRUE;\n}\n\nOPJ_BOOL OPJ_CALLCONV opj_write_tile (\topj_codec_t *p_codec,\n\t\t\t\t\t\t\t\t\t\tOPJ_UINT32 p_tile_index,\n\t\t\t\t\t\t\t\t\t\tOPJ_BYTE * p_data,\n\t\t\t\t\t\t\t\t\t\tOPJ_UINT32 p_data_size,\n\t\t\t\t\t\t\t\t\t\topj_stream_t *p_stream )\n{\n\tif (p_codec && p_stream && p_data) {\n\t\topj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;\n\t\topj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;\n\n\t\tif (l_codec->is_decompressor) {\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\n\t\treturn l_codec->m_codec_data.m_compression.opj_write_tile(\tl_codec->m_codec,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tp_tile_index,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tp_data,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tp_data_size,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tl_stream,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t&(l_codec->m_event_mgr) );\n\t}\n\n\treturn OPJ_FALSE;\n}\n\n/* ---------------------------------------------------------------------- */\n\nvoid OPJ_CALLCONV opj_destroy_codec(opj_codec_t *p_codec)\n{\n\tif (p_codec) {\n\t\topj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;\n\n\t\tif (l_codec->is_decompressor) {\n\t\t\tl_codec->m_codec_data.m_decompression.opj_destroy(l_codec->m_codec);\n\t\t}\n\t\telse {\n\t\t\tl_codec->m_codec_data.m_compression.opj_destroy(l_codec->m_codec);\n\t\t}\n\n\t\tl_codec->m_codec = 00;\n\t\topj_free(l_codec);\n\t}\n}\n\n/* ---------------------------------------------------------------------- */\n\nvoid OPJ_CALLCONV opj_dump_codec(\topj_codec_t *p_codec,\n\t\t\t\t\t\t\t\t\tOPJ_INT32 info_flag,\n\t\t\t\t\t\t\t\t\tFILE* output_stream)\n{\n\tif (p_codec) {\n\t\topj_codec_private_t* l_codec = (opj_codec_private_t*) p_codec;\n\n\t\tl_codec->opj_dump_codec(l_codec->m_codec, info_flag, output_stream);\n\t\treturn;\n\t}\n\n\tfprintf(stderr, \"[ERROR] Input parameter of the dump_codec function are incorrect.\\n\");\n\treturn;\n}\n\nopj_codestream_info_v2_t* OPJ_CALLCONV opj_get_cstr_info(opj_codec_t *p_codec)\n{\n\tif (p_codec) {\n\t\topj_codec_private_t* l_codec = (opj_codec_private_t*) p_codec;\n\n\t\treturn l_codec->opj_get_codec_info(l_codec->m_codec);\n\t}\n\n\treturn NULL;\n}\n\nvoid OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_v2_t **cstr_info) {\n\tif (cstr_info) {\n\n\t\tif ((*cstr_info)->m_default_tile_info.tccp_info){\n\t\t\topj_free((*cstr_info)->m_default_tile_info.tccp_info);\n\t\t}\n\n\t\tif ((*cstr_info)->tile_info){\n\t\t\t/* FIXME not used for the moment*/\n\t\t}\n\n\t\topj_free((*cstr_info));\n\t\t(*cstr_info) = NULL;\n\t}\n}\n\nopj_codestream_index_t * OPJ_CALLCONV opj_get_cstr_index(opj_codec_t *p_codec)\n{\n\tif (p_codec) {\n\t\topj_codec_private_t* l_codec = (opj_codec_private_t*) p_codec;\n\n\t\treturn l_codec->opj_get_codec_index(l_codec->m_codec);\n\t}\n\n\treturn NULL;\n}\n\nvoid OPJ_CALLCONV opj_destroy_cstr_index(opj_codestream_index_t **p_cstr_index)\n{\n\tif (*p_cstr_index){\n\t\tj2k_destroy_cstr_index(*p_cstr_index);\n\t\t(*p_cstr_index) = NULL;\n\t}\n}\n\nopj_stream_t* OPJ_CALLCONV opj_stream_create_default_file_stream_v3 (const char *fname, OPJ_BOOL p_is_read_stream)\n{\n    return opj_stream_create_file_stream_v3(fname, OPJ_J2K_STREAM_CHUNK_SIZE, p_is_read_stream);\n}\n\nopj_stream_t* OPJ_CALLCONV opj_stream_create_file_stream_v3 (\n        const char *fname, \n\t\tOPJ_SIZE_T p_size, \n        OPJ_BOOL p_is_read_stream)\n{\n    opj_stream_t* l_stream = 00;\n    FILE *p_file;\n    const char *mode;\n\n    if (! fname) {\n        return NULL;\n    }\n    \n    if(p_is_read_stream) mode = \"rb\"; else mode = \"wb\";\n\n    p_file = fopen(fname, mode);\n\n    if (! p_file) {\n\t    return NULL;\n    }\n\n    l_stream = opj_stream_create(p_size,p_is_read_stream);\n    if (! l_stream) {\n        fclose(p_file);\n        return NULL;\n    }\n\n    opj_stream_set_user_data_v3(l_stream, p_file, (opj_stream_free_user_data_fn) fclose);\n    opj_stream_set_user_data_length(l_stream, opj_get_data_length_from_file(p_file));\n    opj_stream_set_read_function(l_stream, (opj_stream_read_fn) opj_read_from_file);\n    opj_stream_set_write_function(l_stream, (opj_stream_write_fn) opj_write_from_file);\n    opj_stream_set_skip_function(l_stream, (opj_stream_skip_fn) opj_skip_from_file);\n    opj_stream_set_seek_function(l_stream, (opj_stream_seek_fn) opj_seek_from_file);\n\n    return l_stream;\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/openjpeg.h",
    "content": " /*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2001-2003, David Janssens\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * Copyright (c) 2006-2007, Parvatha Elangovan\n * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>\n * Copyright (c) 2010-2011, Kaori Hagihara\n * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France \n * Copyright (c) 2012, CS Systemes d'Information, France\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef OPENJPEG_H\n#define OPENJPEG_H\n\n#ifndef OPJ_STATIC\n#define OPJ_STATIC\n#endif\n\n\n\n/* \n==========================================================\n   Compiler directives\n==========================================================\n*/\n\n/*\nThe inline keyword is supported by C99 but not by C90. \nMost compilers implement their own version of this keyword ... \n*/\n#ifndef INLINE\n\t#if defined(_MSC_VER)\n\t\t#define INLINE __forceinline\n\t#elif defined(__GNUC__)\n\t\t#define INLINE __inline__\n\t#elif defined(__MWERKS__)\n\t\t#define INLINE inline\n\t#else \n\t\t/* add other compilers here ... */\n\t\t#define INLINE \n\t#endif /* defined(<Compiler>) */\n#endif /* INLINE */\n\n/* deprecated attribute */\n#ifdef __GNUC__\n\t#define OPJ_DEPRECATED(func) func __attribute__ ((deprecated))\n#elif defined(_MSC_VER)\n\t#define OPJ_DEPRECATED(func) __declspec(deprecated) func\n#else\n\t#pragma message(\"WARNING: You need to implement DEPRECATED for this compiler\")\n\t#define OPJ_DEPRECATED(func) func\n#endif\n\n#if defined(OPJ_STATIC) || !defined(_WIN32)\n/* http://gcc.gnu.org/wiki/Visibility */\n#if __GNUC__ >= 4\n#define OPJ_API    __attribute__ ((visibility (\"default\")))\n#define OPJ_LOCAL  __attribute__ ((visibility (\"hidden\")))\n#else\n#define OPJ_API\n#define OPJ_LOCAL\n#endif\n#define OPJ_CALLCONV\n#else\n#define OPJ_CALLCONV __stdcall\n/*\nThe following ifdef block is the standard way of creating macros which make exporting \nfrom a DLL simpler. All files within this DLL are compiled with the OPJ_EXPORTS\nsymbol defined on the command line. this symbol should not be defined on any project\nthat uses this DLL. This way any other project whose source files include this file see \nOPJ_API functions as being imported from a DLL, wheras this DLL sees symbols\ndefined with this macro as being exported.\n*/\n#if defined(OPJ_EXPORTS) || defined(DLL_EXPORT)\n#define OPJ_API __declspec(dllexport)\n#else\n#define OPJ_API __declspec(dllimport)\n#endif /* OPJ_EXPORTS */\n#endif /* !OPJ_STATIC || !_WIN32 */\n\ntypedef int OPJ_BOOL;\n#define OPJ_TRUE 1\n#define OPJ_FALSE 0\n\ntypedef char          OPJ_CHAR;\ntypedef float         OPJ_FLOAT32;\ntypedef double        OPJ_FLOAT64;\ntypedef unsigned char OPJ_BYTE;\n#include \"opj_stdint.h\"\n\ntypedef int8_t   OPJ_INT8;\ntypedef uint8_t  OPJ_UINT8;\ntypedef int16_t  OPJ_INT16;\ntypedef uint16_t OPJ_UINT16;\ntypedef int32_t  OPJ_INT32;\ntypedef uint32_t OPJ_UINT32;\ntypedef int64_t  OPJ_INT64;\ntypedef uint64_t OPJ_UINT64;\n\ntypedef int64_t  OPJ_OFF_T; /* 64-bit file offset type */\n\n#include <stdio.h>\ntypedef size_t   OPJ_SIZE_T;\n\n/* Avoid compile-time warning because parameter is not used */\n#define OPJ_ARG_NOT_USED(x) (void)(x)\n\n/* \n==========================================================\n   Useful constant definitions\n==========================================================\n*/\n\n#define OPJ_PATH_LEN 4096 /**< Maximum allowed size for filenames */\n\n#define OPJ_J2K_MAXRLVLS 33\t\t\t\t\t/**< Number of maximum resolution level authorized */\n#define OPJ_J2K_MAXBANDS (3*OPJ_J2K_MAXRLVLS-2)\t/**< Number of maximum sub-band linked to number of resolution level */\n\n#define OPJ_J2K_DEFAULT_NB_SEGS\t\t\t\t10\n#define OPJ_J2K_STREAM_CHUNK_SIZE\t\t\t0x100000 /** 1 mega by default */\n#define OPJ_J2K_DEFAULT_HEADER_SIZE\t\t\t1000\n#define OPJ_J2K_MCC_DEFAULT_NB_RECORDS\t\t10\n#define OPJ_J2K_MCT_DEFAULT_NB_RECORDS\t\t10\n\n/* UniPG>> */ /* NOT YET USED IN THE V2 VERSION OF OPENJPEG */\n#define JPWL_MAX_NO_TILESPECS\t16 /**< Maximum number of tile parts expected by JPWL: increase at your will */\n#define JPWL_MAX_NO_PACKSPECS\t16 /**< Maximum number of packet parts expected by JPWL: increase at your will */\n#define JPWL_MAX_NO_MARKERS\t512 /**< Maximum number of JPWL markers: increase at your will */\n#define JPWL_PRIVATEINDEX_NAME \"jpwl_index_privatefilename\" /**< index file name used when JPWL is on */\n#define JPWL_EXPECTED_COMPONENTS 3 /**< Expect this number of components, so you'll find better the first EPB */\n#define JPWL_MAXIMUM_TILES 8192 /**< Expect this maximum number of tiles, to avoid some crashes */\n#define JPWL_MAXIMUM_HAMMING 2 /**< Expect this maximum number of bit errors in marker id's */\n#define JPWL_MAXIMUM_EPB_ROOM 65450 /**< Expect this maximum number of bytes for composition of EPBs */\n/* <<UniPG */\n\n/**\n * EXPERIMENTAL FOR THE MOMENT\n * Supported options about file information used only in j2k_dump\n*/\n#define OPJ_IMG_INFO\t\t1\t/**< Basic image information provided to the user */\n#define OPJ_J2K_MH_INFO\t\t2\t/**< Codestream information based only on the main header */\n#define OPJ_J2K_TH_INFO\t\t4\t/**< Tile information based on the current tile header */\n#define OPJ_J2K_TCH_INFO\t8\t/**< Tile/Component information of all tiles */\n#define OPJ_J2K_MH_IND\t\t16\t/**< Codestream index based only on the main header */\n#define OPJ_J2K_TH_IND\t\t32\t/**< Tile index based on the current tile */\n/*FIXME #define OPJ_J2K_CSTR_IND\t48*/\t/**<  */\n#define OPJ_JP2_INFO\t\t128\t/**< JP2 file information */\n#define OPJ_JP2_IND\t\t\t256\t/**< JP2 file index */\n\n\n/* \n==========================================================\n   enum definitions\n==========================================================\n*/\n/** \n * Rsiz Capabilities\n * */\ntypedef enum RSIZ_CAPABILITIES {\n\tOPJ_STD_RSIZ = 0,\t\t/** Standard JPEG2000 profile*/\n\tOPJ_CINEMA2K = 3,\t\t/** Profile name for a 2K image*/\n\tOPJ_CINEMA4K = 4,\t\t/** Profile name for a 4K image*/\n\tOPJ_MCT = 0x8100\n} OPJ_RSIZ_CAPABILITIES;\n\n/** \n * Digital cinema operation mode\n * */\ntypedef enum CINEMA_MODE {\n\tOPJ_OFF = 0,\t\t\t/** Not Digital Cinema*/\n\tOPJ_CINEMA2K_24 = 1,\t/** 2K Digital Cinema at 24 fps*/\n\tOPJ_CINEMA2K_48 = 2,\t/** 2K Digital Cinema at 48 fps*/\n\tOPJ_CINEMA4K_24 = 3\t\t/** 4K Digital Cinema at 24 fps*/\n}OPJ_CINEMA_MODE;\n\n/** \n * Progression order\n * */\ntypedef enum PROG_ORDER {\n\tOPJ_PROG_UNKNOWN = -1,\t/**< place-holder */\n\tOPJ_LRCP = 0,\t\t\t/**< layer-resolution-component-precinct order */\n\tOPJ_RLCP = 1,\t\t\t/**< resolution-layer-component-precinct order */\n\tOPJ_RPCL = 2,\t\t\t/**< resolution-precinct-component-layer order */\n\tOPJ_PCRL = 3,\t\t\t/**< precinct-component-resolution-layer order */\n\tOPJ_CPRL = 4\t\t\t/**< component-precinct-resolution-layer order */\n} OPJ_PROG_ORDER;\n\n/**\n * Supported image color spaces\n*/\ntypedef enum COLOR_SPACE {\n\tOPJ_CLRSPC_UNKNOWN = -1,\t/**< not supported by the library */\n\tOPJ_CLRSPC_UNSPECIFIED = 0,\t/**< not specified in the codestream */ \n\tOPJ_CLRSPC_SRGB = 1,\t\t/**< sRGB */\n\tOPJ_CLRSPC_GRAY = 2,\t\t/**< grayscale */\n\tOPJ_CLRSPC_SYCC = 3,\t\t/**< YUV */\n  OPJ_CLRSPC_EYCC = 4\t\t/**< e-YCC */\n} OPJ_COLOR_SPACE;\n\n/**\n * Supported codec\n*/\ntypedef enum CODEC_FORMAT {\n\tOPJ_CODEC_UNKNOWN = -1,\t/**< place-holder */\n\tOPJ_CODEC_J2K  = 0,\t\t/**< JPEG-2000 codestream : read/write */\n\tOPJ_CODEC_JPT  = 1,\t\t/**< JPT-stream (JPEG 2000, JPIP) : read only */\n\tOPJ_CODEC_JP2  = 2 \t\t/**< JPEG-2000 file format : read/write */\n} OPJ_CODEC_FORMAT;\n\n\n/* \n==========================================================\n   event manager typedef definitions\n==========================================================\n*/\n\n/**\n * Callback function prototype for events\n * @param msg               Event message\n * @param client_data       Client object where will be return the event message \n * */\ntypedef void (*opj_msg_callback) (const char *msg, void *client_data);\n\n/* \n==========================================================\n   codec typedef definitions\n==========================================================\n*/\n\n/**\n * Progression order changes\n * \n */\ntypedef struct opj_poc {\n\t/** Resolution num start, Component num start, given by POC */\n\tOPJ_UINT32 resno0, compno0;\n\t/** Layer num end,Resolution num end, Component num end, given by POC */\n\tOPJ_UINT32 layno1, resno1, compno1;\n\t/** Layer num start,Precinct num start, Precinct num end */\n\tOPJ_UINT32 layno0, precno0, precno1;\n\t/** Progression order enum*/\n\tOPJ_PROG_ORDER prg1,prg;\n\t/** Progression order string*/\n\tOPJ_CHAR progorder[5];\n\t/** Tile number */\n\tOPJ_UINT32 tile;\n\t/** Start and end values for Tile width and height*/\n\tOPJ_INT32 tx0,tx1,ty0,ty1;\n\t/** Start value, initialised in pi_initialise_encode*/\n\tOPJ_UINT32 layS, resS, compS, prcS;\n\t/** End value, initialised in pi_initialise_encode */\n\tOPJ_UINT32 layE, resE, compE, prcE;\n\t/** Start and end values of Tile width and height, initialised in pi_initialise_encode*/\n\tOPJ_UINT32 txS,txE,tyS,tyE,dx,dy;\n\t/** Temporary values for Tile parts, initialised in pi_create_encode */\n\tOPJ_UINT32 lay_t, res_t, comp_t, prc_t,tx0_t,ty0_t;\n} opj_poc_t;\n\n/**\n * Compression parameters\n * */\ntypedef struct opj_cparameters {\n\t/** size of tile: tile_size_on = false (not in argument) or = true (in argument) */\n\tOPJ_BOOL tile_size_on;\n\t/** XTOsiz */\n\tint cp_tx0;\n\t/** YTOsiz */\n\tint cp_ty0;\n\t/** XTsiz */\n\tint cp_tdx;\n\t/** YTsiz */\n\tint cp_tdy;\n\t/** allocation by rate/distortion */\n\tint cp_disto_alloc;\n\t/** allocation by fixed layer */\n\tint cp_fixed_alloc;\n\t/** add fixed_quality */\n\tint cp_fixed_quality;\n\t/** fixed layer */\n\tint *cp_matrice;\n\t/** comment for coding */\n\tchar *cp_comment;\n\t/** csty : coding style */\n\tint csty;\n\t/** progression order (default OPJ_LRCP) */\n\tOPJ_PROG_ORDER prog_order;\n\t/** progression order changes */\n\topj_poc_t POC[32];\n\t/** number of progression order changes (POC), default to 0 */\n\tOPJ_UINT32 numpocs;\n\t/** number of layers */\n\tint tcp_numlayers;\n\t/** rates of layers */\n\tfloat tcp_rates[100];\n\t/** different psnr for successive layers */\n\tfloat tcp_distoratio[100];\n\t/** number of resolutions */\n\tint numresolution;\n\t/** initial code block width, default to 64 */\n \tint cblockw_init;\n\t/** initial code block height, default to 64 */\n\tint cblockh_init;\n\t/** mode switch (cblk_style) */\n\tint mode;\n\t/** 1 : use the irreversible DWT 9-7, 0 : use lossless compression (default) */\n\tint irreversible;\n\t/** region of interest: affected component in [0..3], -1 means no ROI */\n\tint roi_compno;\n\t/** region of interest: upshift value */\n\tint roi_shift;\n\t/* number of precinct size specifications */\n\tint res_spec;\n\t/** initial precinct width */\n\tint prcw_init[OPJ_J2K_MAXRLVLS];\n\t/** initial precinct height */\n\tint prch_init[OPJ_J2K_MAXRLVLS];\n\n\t/**@name command line encoder parameters (not used inside the library) */\n\t/*@{*/\n\t/** input file name */\n\tchar infile[OPJ_PATH_LEN];\n\t/** output file name */\n\tchar outfile[OPJ_PATH_LEN];\n\t/** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */\n\tint index_on;\n\t/** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */\n\tchar index[OPJ_PATH_LEN];\n\t/** subimage encoding: origin image offset in x direction */\n\tint image_offset_x0;\n\t/** subimage encoding: origin image offset in y direction */\n\tint image_offset_y0;\n\t/** subsampling value for dx */\n\tint subsampling_dx;\n\t/** subsampling value for dy */\n\tint subsampling_dy;\n\t/** input file format 0: PGX, 1: PxM, 2: BMP 3:TIF*/\n\tint decod_format;\n\t/** output file format 0: J2K, 1: JP2, 2: JPT */\n\tint cod_format;\n\t/*@}*/\n\n/* UniPG>> */ /* NOT YET USED IN THE V2 VERSION OF OPENJPEG */\n\t/**@name JPWL encoding parameters */\n\t/*@{*/\n\t/** enables writing of EPC in MH, thus activating JPWL */\n\tOPJ_BOOL jpwl_epc_on;\n\t/** error protection method for MH (0,1,16,32,37-128) */\n\tint jpwl_hprot_MH;\n\t/** tile number of header protection specification (>=0) */\n\tint jpwl_hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS];\n\t/** error protection methods for TPHs (0,1,16,32,37-128) */\n\tint jpwl_hprot_TPH[JPWL_MAX_NO_TILESPECS];\n\t/** tile number of packet protection specification (>=0) */\n\tint jpwl_pprot_tileno[JPWL_MAX_NO_PACKSPECS];\n\t/** packet number of packet protection specification (>=0) */\n\tint jpwl_pprot_packno[JPWL_MAX_NO_PACKSPECS];\n\t/** error protection methods for packets (0,1,16,32,37-128) */\n\tint jpwl_pprot[JPWL_MAX_NO_PACKSPECS];\n\t/** enables writing of ESD, (0=no/1/2 bytes) */\n\tint jpwl_sens_size;\n\t/** sensitivity addressing size (0=auto/2/4 bytes) */\n\tint jpwl_sens_addr;\n\t/** sensitivity range (0-3) */\n\tint jpwl_sens_range;\n\t/** sensitivity method for MH (-1=no,0-7) */\n\tint jpwl_sens_MH;\n\t/** tile number of sensitivity specification (>=0) */\n\tint jpwl_sens_TPH_tileno[JPWL_MAX_NO_TILESPECS];\n\t/** sensitivity methods for TPHs (-1=no,0-7) */\n\tint jpwl_sens_TPH[JPWL_MAX_NO_TILESPECS];\n\t/*@}*/\n/* <<UniPG */\n\n\t/** Digital Cinema compliance 0-not compliant, 1-compliant*/\n\tOPJ_CINEMA_MODE cp_cinema;\n\t/** Maximum rate for each component. If == 0, component size limitation is not considered */\n\tint max_comp_size;\n\t/** Profile name*/\n\tOPJ_RSIZ_CAPABILITIES cp_rsiz;\n\t/** Tile part generation*/\n\tchar tp_on;\n\t/** Flag for Tile part generation*/\n\tchar tp_flag;\n\t/** MCT (multiple component transform) */\n\tchar tcp_mct;\n\t/** Enable JPIP indexing*/\n\tOPJ_BOOL jpip_on;\n\t/** Naive implementation of MCT restricted to a single reversible array based \n        encoding without offset concerning all the components. */\n\tvoid * mct_data;\n} opj_cparameters_t;  \n\n#define OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG\t0x0001\n\n/**\n * Decompression parameters\n * */\ntypedef struct opj_dparameters {\n\t/** \n\tSet the number of highest resolution levels to be discarded. \n\tThe image resolution is effectively divided by 2 to the power of the number of discarded levels. \n\tThe reduce factor is limited by the smallest total number of decomposition levels among tiles.\n\tif != 0, then original dimension divided by 2^(reduce); \n\tif == 0 or not used, image is decoded to the full resolution \n\t*/\n\tOPJ_UINT32 cp_reduce;\n\t/** \n\tSet the maximum number of quality layers to decode. \n\tIf there are less quality layers than the specified number, all the quality layers are decoded.\n\tif != 0, then only the first \"layer\" layers are decoded; \n\tif == 0 or not used, all the quality layers are decoded \n\t*/\n\tOPJ_UINT32 cp_layer;\n\n\t/**@name command line decoder parameters (not used inside the library) */\n\t/*@{*/\n\t/** input file name */\n\tchar infile[OPJ_PATH_LEN];\n\t/** output file name */\n\tchar outfile[OPJ_PATH_LEN];\n\t/** input file format 0: J2K, 1: JP2, 2: JPT */\n\tint decod_format;\n\t/** output file format 0: PGX, 1: PxM, 2: BMP */\n\tint cod_format;\n\n\t/** Decoding area left boundary */\n\tOPJ_UINT32 DA_x0;\n\t/** Decoding area right boundary */\n\tOPJ_UINT32 DA_x1;\n\t/** Decoding area up boundary */\n\tOPJ_UINT32 DA_y0;\n\t/** Decoding area bottom boundary */\n\tOPJ_UINT32 DA_y1;\n\t/** Verbose mode */\n\tOPJ_BOOL m_verbose;\n\n\t/** tile number ot the decoded tile*/\n\tOPJ_UINT32 tile_index;\n\t/** Nb of tile to decode */\n\tOPJ_UINT32 nb_tile_to_decode;\n\n\t/*@}*/\n\n/* UniPG>> */ /* NOT YET USED IN THE V2 VERSION OF OPENJPEG */\n\t/**@name JPWL decoding parameters */\n\t/*@{*/\n\t/** activates the JPWL correction capabilities */\n\tOPJ_BOOL jpwl_correct;\n\t/** expected number of components */\n\tint jpwl_exp_comps;\n\t/** maximum number of tiles */\n\tint jpwl_max_tiles;\n\t/*@}*/\n/* <<UniPG */\n\n\tunsigned int flags;\n\n} opj_dparameters_t;\n\n\n/**\n * JPEG2000 codec V2.\n * */\ntypedef void * opj_codec_t;\n\n/* \n==========================================================\n   I/O stream typedef definitions\n==========================================================\n*/\n\n/**\n * Stream open flags.\n * */\n/** The stream was opened for reading. */\n#define OPJ_STREAM_READ\tOPJ_TRUE\n/** The stream was opened for writing. */\n#define OPJ_STREAM_WRITE OPJ_FALSE\n\n/*\n * Callback function prototype for read function\n */\ntypedef OPJ_SIZE_T (* opj_stream_read_fn) (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data) ;\n\n/*\n * Callback function prototype for write function\n */\ntypedef OPJ_SIZE_T (* opj_stream_write_fn) (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data) ;\n\n/*\n * Callback function prototype for skip function\n */\ntypedef OPJ_OFF_T (* opj_stream_skip_fn) (OPJ_OFF_T p_nb_bytes, void * p_user_data) ;\n\n/*\n * Callback function prototype for seek function\n */\ntypedef OPJ_BOOL (* opj_stream_seek_fn) (OPJ_OFF_T p_nb_bytes, void * p_user_data) ;\n\n/*\n * Callback function prototype for free user data function\n */\ntypedef void (* opj_stream_free_user_data_fn) (void * p_user_data) ;\n\n/*\n * JPEG2000 Stream.\n */\ntypedef void * opj_stream_t;\n\n/* \n==========================================================\n   image typedef definitions\n==========================================================\n*/\n\n/**\n * Defines a single image component\n * */\ntypedef struct opj_image_comp {\n\t/** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */\n\tOPJ_UINT32 dx;\n\t/** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */\n\tOPJ_UINT32 dy;\n\t/** data width */\n\tOPJ_UINT32 w;\n\t/** data height */\n\tOPJ_UINT32 h;\n\t/** x component offset compared to the whole image */\n\tOPJ_UINT32 x0;\n\t/** y component offset compared to the whole image */\n\tOPJ_UINT32 y0;\n\t/** precision */\n\tOPJ_UINT32 prec;\n\t/** image depth in bits */\n\tOPJ_UINT32 bpp;\n\t/** signed (1) / unsigned (0) */\n\tOPJ_UINT32 sgnd;\n\t/** number of decoded resolution */\n\tOPJ_UINT32 resno_decoded;\n\t/** number of division by 2 of the out image compared to the original size of image */\n\tOPJ_UINT32 factor;\n\t/** image component data */\n\tOPJ_INT32 *data;\n  /** alpha channel */\n  OPJ_UINT16 alpha;\n} opj_image_comp_t;\n\n/** \n * Defines image data and characteristics\n * */\ntypedef struct opj_image {\n\t/** XOsiz: horizontal offset from the origin of the reference grid to the left side of the image area */\n\tOPJ_UINT32 x0;\n\t/** YOsiz: vertical offset from the origin of the reference grid to the top side of the image area */\n\tOPJ_UINT32 y0;\n\t/** Xsiz: width of the reference grid */\n\tOPJ_UINT32 x1;\n\t/** Ysiz: height of the reference grid */\n\tOPJ_UINT32 y1;\n\t/** number of components in the image */\n\tOPJ_UINT32 numcomps;\n\t/** color space: sRGB, Greyscale or YUV */\n\tOPJ_COLOR_SPACE color_space;\n\t/** image components */\n\topj_image_comp_t *comps;\n\t/** 'restricted' ICC profile */\n\tOPJ_BYTE *icc_profile_buf;\n\t/** size of ICC profile */\n\tOPJ_UINT32 icc_profile_len;\n\n\tOPJ_INT8  useColorSpace;  //liang\n} opj_image_t;\n\n\n/**\n * Component parameters structure used by the opj_image_create function\n * */\ntypedef struct opj_image_comptparm {\n\t/** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */\n\tOPJ_UINT32 dx;\n\t/** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */\n\tOPJ_UINT32 dy;\n\t/** data width */\n\tOPJ_UINT32 w;\n\t/** data height */\n\tOPJ_UINT32 h;\n\t/** x component offset compared to the whole image */\n\tOPJ_UINT32 x0;\n\t/** y component offset compared to the whole image */\n\tOPJ_UINT32 y0;\n\t/** precision */\n\tOPJ_UINT32 prec;\n\t/** image depth in bits */\n\tOPJ_UINT32 bpp;\n\t/** signed (1) / unsigned (0) */\n\tOPJ_UINT32 sgnd;\n} opj_image_cmptparm_t;\n\n\n/* \n==========================================================\n   Information on the JPEG 2000 codestream\n==========================================================\n*/\n/* QUITE EXPERIMENTAL FOR THE MOMENT */\n\n/**\n * Index structure : Information concerning a packet inside tile\n * */\ntypedef struct opj_packet_info {\n\t/** packet start position (including SOP marker if it exists) */\n\tOPJ_OFF_T start_pos;\n\t/** end of packet header position (including EPH marker if it exists)*/\n\tOPJ_OFF_T end_ph_pos;\n\t/** packet end position */\n\tOPJ_OFF_T end_pos;\n\t/** packet distorsion */\n\tdouble disto;\n} opj_packet_info_t;\n\n\n/* UniPG>> */\n/**\n * Marker structure\n * */\ntypedef struct opj_marker_info {\n\t/** marker type */\n\tunsigned short int type;\n\t/** position in codestream */\n\tOPJ_OFF_T pos;\n\t/** length, marker val included */\n\tint len;\n} opj_marker_info_t;\n/* <<UniPG */\n\n/**\n * Index structure : Information concerning tile-parts\n*/\ntypedef struct opj_tp_info {\n\t/** start position of tile part */\n\tint tp_start_pos;\n\t/** end position of tile part header */\n\tint tp_end_header;\n\t/** end position of tile part */\n\tint tp_end_pos;\n\t/** start packet of tile part */\n\tint tp_start_pack;\n\t/** number of packets of tile part */\n\tint tp_numpacks;\n} opj_tp_info_t;\n\n/**\n * Index structure : information regarding tiles\n*/\ntypedef struct opj_tile_info {\n\t/** value of thresh for each layer by tile cfr. Marcela   */\n\tdouble *thresh;\n\t/** number of tile */\n\tint tileno;\n\t/** start position */\n\tint start_pos;\n\t/** end position of the header */\n\tint end_header;\n\t/** end position */\n\tint end_pos;\n\t/** precinct number for each resolution level (width) */\n\tint pw[33];\n\t/** precinct number for each resolution level (height) */\n\tint ph[33];\n\t/** precinct size (in power of 2), in X for each resolution level */\n\tint pdx[33];\n\t/** precinct size (in power of 2), in Y for each resolution level */\n\tint pdy[33];\n\t/** information concerning packets inside tile */\n\topj_packet_info_t *packet;\n\t/** add fixed_quality */\n\tint numpix;\n\t/** add fixed_quality */\n\tdouble distotile;\n  \t/** number of markers */\n\tint marknum;\n\t/** list of markers */\n\topj_marker_info_t *marker;\n\t/** actual size of markers array */\n\tint maxmarknum;\n\t/** number of tile parts */\n\tint num_tps;\n\t/** information concerning tile parts */\n\topj_tp_info_t *tp;\n} opj_tile_info_t;\n\n/**\n * Index structure of the codestream\n*/\ntypedef struct opj_codestream_info {\n\t/** maximum distortion reduction on the whole image (add for Marcela) */\n\tdouble D_max;\n\t/** packet number */\n\tint packno;\n\t/** writing the packet in the index with t2_encode_packets */\n\tint index_write;\n\t/** image width */\n\tint image_w;\n\t/** image height */\n\tint image_h;\n\t/** progression order */\n\tOPJ_PROG_ORDER prog;\n\t/** tile size in x */\n\tint tile_x;\n\t/** tile size in y */\n\tint tile_y;\n\t/** */\n\tint tile_Ox;\n\t/** */\n\tint tile_Oy;\n\t/** number of tiles in X */\n\tint tw;\n\t/** number of tiles in Y */\n\tint th;\n\t/** component numbers */\n\tint numcomps;\n\t/** number of layer */\n\tint numlayers;\n\t/** number of decomposition for each component */\n\tint *numdecompos;\n/* UniPG>> */\n\t/** number of markers */\n\tint marknum;\n\t/** list of markers */\n\topj_marker_info_t *marker;\n\t/** actual size of markers array */\n\tint maxmarknum;\n/* <<UniPG */\n\t/** main header position */\n\tint main_head_start;\n\t/** main header position */\n\tint main_head_end;\n\t/** codestream's size */\n\tint codestream_size;\n\t/** information regarding tiles inside image */\n\topj_tile_info_t *tile;\n} opj_codestream_info_t;\n\n/* <----------------------------------------------------------- */\n/* new output managment of the codestream information and index */\n\n/**\n * Tile-component coding parameters information\n */\ntypedef struct opj_tccp_info\n{\n\t/** component index */\n\tOPJ_UINT32 compno;\n\t/** coding style */\n\tOPJ_UINT32 csty;\n\t/** number of resolutions */\n\tOPJ_UINT32 numresolutions;\n\t/** code-blocks width */\n\tOPJ_UINT32 cblkw;\n\t/** code-blocks height */\n\tOPJ_UINT32 cblkh;\n\t/** code-block coding style */\n\tOPJ_UINT32 cblksty;\n\t/** discrete wavelet transform identifier */\n\tOPJ_UINT32 qmfbid;\n\t/** quantisation style */\n\tOPJ_UINT32 qntsty;\n\t/** stepsizes used for quantization */\n\tOPJ_UINT32 stepsizes_mant[OPJ_J2K_MAXBANDS];\n\t/** stepsizes used for quantization */\n\tOPJ_UINT32 stepsizes_expn[OPJ_J2K_MAXBANDS];\n\t/** number of guard bits */\n\tOPJ_UINT32 numgbits;\n\t/** Region Of Interest shift */\n\tOPJ_INT32 roishift;\n\t/** precinct width */\n\tOPJ_UINT32 prcw[OPJ_J2K_MAXRLVLS];\n\t/** precinct height */\n\tOPJ_UINT32 prch[OPJ_J2K_MAXRLVLS];\n}\nopj_tccp_info_t;\n\n/**\n * Tile coding parameters information\n */\ntypedef struct opj_tile_v2_info {\n\n\t/** number (index) of tile */\n\tint tileno;\n\t/** coding style */\n\tOPJ_UINT32 csty;\n\t/** progression order */\n\tOPJ_PROG_ORDER prg;\n\t/** number of layers */\n\tOPJ_UINT32 numlayers;\n\t/** multi-component transform identifier */\n\tOPJ_UINT32 mct;\n\n\t/** information concerning tile component parameters*/\n\topj_tccp_info_t *tccp_info;\n\n} opj_tile_info_v2_t;\n\n/**\n * Information structure about the codestream (FIXME should be expand and enhance)\n */\ntypedef struct opj_codestream_info_v2 {\n\t/* Tile info */\n\t/** tile origin in x = XTOsiz */\n\tOPJ_UINT32 tx0;\n\t/** tile origin in y = YTOsiz */\n\tOPJ_UINT32 ty0;\n\t/** tile size in x = XTsiz */\n\tOPJ_UINT32 tdx;\n\t/** tile size in y = YTsiz */\n\tOPJ_UINT32 tdy;\n\t/** number of tiles in X */\n\tOPJ_UINT32 tw;\n\t/** number of tiles in Y */\n\tOPJ_UINT32 th;\n\n\t/** number of components*/\n\tOPJ_UINT32 nbcomps;\n\n\t/** Default information regarding tiles inside image */\n\topj_tile_info_v2_t m_default_tile_info;\n\n\t/** information regarding tiles inside image */\n\topj_tile_info_v2_t *tile_info; /* FIXME not used for the moment */\n\n} opj_codestream_info_v2_t;\n\n\n/**\n * Index structure about a tile part\n */\ntypedef struct opj_tp_index {\n\t/** start position */\n\tOPJ_OFF_T start_pos;\n\t/** end position of the header */\n\tOPJ_OFF_T end_header;\n\t/** end position */\n\tOPJ_OFF_T end_pos;\n\n} opj_tp_index_t;\n\n/**\n * Index structure about a tile\n */\ntypedef struct opj_tile_index {\n\t/** tile index */\n\tOPJ_UINT32 tileno;\n\n\t/** number of tile parts */\n\tOPJ_UINT32 nb_tps;\n\t/** current nb of tile part (allocated)*/\n\tOPJ_UINT32 current_nb_tps;\n\t/** current tile-part index */\n\tOPJ_UINT32 current_tpsno;\n\t/** information concerning tile parts */\n\topj_tp_index_t *tp_index;\n\n\t/* UniPG>> */ /* NOT USED FOR THE MOMENT IN THE V2 VERSION */\n\t\t/** number of markers */\n\t\tOPJ_UINT32 marknum;\n\t\t/** list of markers */\n\t\topj_marker_info_t *marker;\n\t\t/** actual size of markers array */\n\t\tOPJ_UINT32 maxmarknum;\n\t/* <<UniPG */\n\n\t/** packet number */\n\tOPJ_UINT32 nb_packet;\n\t/** information concerning packets inside tile */\n\topj_packet_info_t *packet_index;\n\n} opj_tile_index_t;\n\n/**\n * Index structure of the codestream (FIXME should be expand and enhance)\n */\ntypedef struct opj_codestream_index {\n\t/** main header start position (SOC position) */\n\tOPJ_OFF_T main_head_start;\n\t/** main header end position (first SOT position) */\n\tOPJ_OFF_T main_head_end;\n\n\t/** codestream's size */\n\tOPJ_UINT64 codestream_size;\n\n/* UniPG>> */ /* NOT USED FOR THE MOMENT IN THE V2 VERSION */\n\t/** number of markers */\n\tOPJ_UINT32 marknum;\n\t/** list of markers */\n\topj_marker_info_t *marker;\n\t/** actual size of markers array */\n\tOPJ_UINT32 maxmarknum;\n/* <<UniPG */\n\n\t/** */\n\tOPJ_UINT32 nb_of_tiles;\n\t/** */\n\topj_tile_index_t *tile_index; /* FIXME not used for the moment */\n\n}opj_codestream_index_t;\n/* -----------------------------------------------------------> */\n\n/*\n==========================================================\n   Metadata from the JP2file\n==========================================================\n*/\n\n/**\n * Info structure of the JP2 file\n * EXPERIMENTAL FOR THE MOMENT\n */\ntypedef struct opj_jp2_metadata {\n\t/** */\n\tOPJ_INT32\tnot_used;\n\n} opj_jp2_metadata_t;\n\n/**\n * Index structure of the JP2 file\n * EXPERIMENTAL FOR THE MOMENT\n */\ntypedef struct opj_jp2_index {\n\t/** */\n\tOPJ_INT32\tnot_used;\n\n} opj_jp2_index_t;\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n/* \n==========================================================\n   openjpeg version\n==========================================================\n*/\n\n/* Get the version of the openjpeg library*/\nOPJ_API const char * OPJ_CALLCONV opj_version(void);\n\n/* \n==========================================================\n   image functions definitions\n==========================================================\n*/\n\n/**\n * Create an image\n *\n * @param numcmpts      number of components\n * @param cmptparms     components parameters\n * @param clrspc        image color space\n * @return returns      a new image structure if successful, returns NULL otherwise\n * */\nOPJ_API opj_image_t* OPJ_CALLCONV opj_image_create(OPJ_UINT32 numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc);\n\n/**\n * Deallocate any resources associated with an image\n *\n * @param image         image to be destroyed\n */\nOPJ_API void OPJ_CALLCONV opj_image_destroy(opj_image_t *image);\n\n/**\n * Creates an image without allocating memory for the image (used in the new version of the library).\n *\n * @param\tnumcmpts    the number of components\n * @param\tcmptparms   the components parameters\n * @param\tclrspc      the image color space\n *\n * @return\ta new image structure if successful, NULL otherwise.\n*/\nOPJ_API opj_image_t* OPJ_CALLCONV opj_image_tile_create(OPJ_UINT32 numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc);\n\n/* \n==========================================================\n   stream functions definitions\n==========================================================\n*/\n\n/**\n * Creates an abstract stream. This function does nothing except allocating memory and initializing the abstract stream.\n *\n * @param\tp_is_input\t\tif set to true then the stream will be an input stream, an output stream else.\n *\n * @return\ta stream object.\n*/\nOPJ_API opj_stream_t* OPJ_CALLCONV opj_stream_default_create(OPJ_BOOL p_is_input);\n\n/**\n * Creates an abstract stream. This function does nothing except allocating memory and initializing the abstract stream.\n *\n * @param\tp_buffer_size  FIXME DOC\n * @param\tp_is_input\t\tif set to true then the stream will be an input stream, an output stream else.\n *\n * @return\ta stream object.\n*/\nOPJ_API opj_stream_t* OPJ_CALLCONV opj_stream_create(OPJ_SIZE_T p_buffer_size, OPJ_BOOL p_is_input);\n\n/**\n * Destroys a stream created by opj_create_stream. This function does NOT close the abstract stream. If needed the user must\n * close its own implementation of the stream.\n *\n * @param\tp_stream\tthe stream to destroy.\n */\nOPJ_API void OPJ_CALLCONV opj_stream_destroy(opj_stream_t* p_stream);\n\n/**\n * Destroys a stream created by opj_create_stream. This function does NOT close the abstract stream. \n * If needed the user must close its own implementation of the stream.\n *\n * @param\tp_stream\tthe stream to destroy.\n */\nOPJ_API void OPJ_CALLCONV opj_stream_destroy_v3(opj_stream_t* p_stream);\n \n/**\n * Sets the given function to be used as a read function.\n * @param\t\tp_stream\tthe stream to modify\n * @param\t\tp_function\tthe function to use a read function.\n*/\nOPJ_API void OPJ_CALLCONV opj_stream_set_read_function(opj_stream_t* p_stream, opj_stream_read_fn p_function);\n\n/**\n * Sets the given function to be used as a write function.\n * @param\t\tp_stream\tthe stream to modify\n * @param\t\tp_function\tthe function to use a write function.\n*/\nOPJ_API void OPJ_CALLCONV opj_stream_set_write_function(opj_stream_t* p_stream, opj_stream_write_fn p_function);\n\n/**\n * Sets the given function to be used as a skip function.\n * @param\t\tp_stream\tthe stream to modify\n * @param\t\tp_function\tthe function to use a skip function.\n*/\nOPJ_API void OPJ_CALLCONV opj_stream_set_skip_function(opj_stream_t* p_stream, opj_stream_skip_fn p_function);\n\n/**\n * Sets the given function to be used as a seek function, the stream is then seekable.\n * @param\t\tp_stream\tthe stream to modify\n * @param\t\tp_function\tthe function to use a skip function.\n*/\nOPJ_API void OPJ_CALLCONV opj_stream_set_seek_function(opj_stream_t* p_stream, opj_stream_seek_fn p_function);\n\n/**\n * Sets the given data to be used as a user data for the stream.\n * @param\t\tp_stream\tthe stream to modify\n * @param\t\tp_data\t\tthe data to set.\n * @warning depending on your source object p_stream this function may leak, use opj_stream_set_user_data_v3\n*/\nOPJ_DEPRECATED(OPJ_API void OPJ_CALLCONV opj_stream_set_user_data (opj_stream_t* p_stream, void * p_data));\n\n/**\n * Sets the given data to be used as a user data for the stream.\n * @param\t\tp_stream\tthe stream to modify\n * @param\t\tp_data\t\tthe data to set.\n * @param\t\tp_function\tthe function to free p_data when opj_stream_destroy() is called.\n*/\nOPJ_API void OPJ_CALLCONV opj_stream_set_user_data_v3 (opj_stream_t* p_stream, void * p_data, opj_stream_free_user_data_fn p_function);\n\n/**\n * Sets the length of the user data for the stream.\n *\n * @param p_stream    the stream to modify\n * @param data_length length of the user_data.\n*/\nOPJ_API void OPJ_CALLCONV opj_stream_set_user_data_length(opj_stream_t* p_stream, OPJ_UINT64 data_length);\n\n/**\n * Create a stream from a file identified with its filename with default parameters (helper function)\n * @param fname             the filename of the file to stream\n * @param p_is_read_stream  whether the stream is a read stream (true) or not (false)\n*/\nOPJ_API opj_stream_t* OPJ_CALLCONV opj_stream_create_default_file_stream_v3 (const char *fname, OPJ_BOOL p_is_read_stream);\n \n/** Create a stream from a file identified with its filename with a specific buffer size\n * @param fname             the filename of the file to stream\n * @param p_buffer_size     size of the chunk used to stream\n * @param p_is_read_stream  whether the stream is a read stream (true) or not (false)\n*/\nOPJ_API opj_stream_t* OPJ_CALLCONV opj_stream_create_file_stream_v3 (const char *fname, \n                                                                     OPJ_SIZE_T p_buffer_size,\n                                                                     OPJ_BOOL p_is_read_stream);\n \n/* \n==========================================================\n   event manager functions definitions\n==========================================================\n*/\n/**\n * Set the info handler use by openjpeg.\n * @param p_codec       the codec previously initialise\n * @param p_callback    the callback function which will be used\n * @param p_user_data   client object where will be returned the message\n*/\nOPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_info_handler(opj_codec_t * p_codec, \n                                                   opj_msg_callback p_callback,\n                                                   void * p_user_data);\n/**\n * Set the warning handler use by openjpeg.\n * @param p_codec       the codec previously initialise\n * @param p_callback    the callback function which will be used\n * @param p_user_data   client object where will be returned the message\n*/\nOPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_warning_handler(opj_codec_t * p_codec,\n                                                      opj_msg_callback p_callback,\n                                                      void * p_user_data);\n/**\n * Set the error handler use by openjpeg.\n * @param p_codec       the codec previously initialise\n * @param p_callback    the callback function which will be used\n * @param p_user_data   client object where will be returned the message\n*/\nOPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_error_handler(opj_codec_t * p_codec, \n                                                    opj_msg_callback p_callback,\n                                                    void * p_user_data);\n\n/* \n==========================================================\n   codec functions definitions\n==========================================================\n*/\n\n/**\n * Creates a J2K/JP2 decompression structure\n * @param format \t\tDecoder to select\n *\n * @return Returns a handle to a decompressor if successful, returns NULL otherwise\n * */\nOPJ_API opj_codec_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT format);\n\n/**\n * Destroy a decompressor handle\n *\n * @param\tp_codec\t\t\tdecompressor handle to destroy\n */\nOPJ_API void OPJ_CALLCONV opj_destroy_codec(opj_codec_t * p_codec);\n\n/**\n * Read after the codestream if necessary\n * @param\tp_codec\t\t\tthe JPEG2000 codec to read.\n * @param\tp_stream\t\tthe JPEG2000 stream.\n */\nOPJ_API OPJ_BOOL OPJ_CALLCONV opj_end_decompress (\topj_codec_t *p_codec,\n\t\t\t\t\t\t\t\t\t\t\t\t\topj_stream_t *p_stream);\n\n\n/**\n * Set decoding parameters to default values\n * @param parameters Decompression parameters\n */\nOPJ_API void OPJ_CALLCONV opj_set_default_decoder_parameters(opj_dparameters_t *parameters);\n\n/**\n * Setup the decoder with decompression parameters provided by the user and with the message handler\n * provided by the user.\n *\n * @param p_codec \t\tdecompressor handler\n * @param parameters \tdecompression parameters\n *\n * @return true\t\t\tif the decoder is correctly set\n */\nOPJ_API OPJ_BOOL OPJ_CALLCONV opj_setup_decoder(opj_codec_t *p_codec,\n\t\t\t\t\t\t\t\t\t\t\t\topj_dparameters_t *parameters );\n\n/**\n * Decodes an image header.\n *\n * @param\tp_stream\t\tthe jpeg2000 stream.\n * @param\tp_codec\t\t\tthe jpeg2000 codec to read.\n * @param\tp_image\t\t\tthe image structure initialized with the characteristics of encoded image.\n *\n * @return true\t\t\t\tif the main header of the codestream and the JP2 header is correctly read.\n */\nOPJ_API OPJ_BOOL OPJ_CALLCONV opj_read_header (\topj_stream_t *p_stream,\n\t\t\t\t\t\t\t\t\t\t\t\topj_codec_t *p_codec,\n\t\t\t\t\t\t\t\t\t\t\t\topj_image_t **p_image);\n\n/**\n * Sets the given area to be decoded. This function should be called right after opj_read_header and before any tile header reading.\n *\n * @param\tp_codec\t\t\tthe jpeg2000 codec.\n * @param\tp_image         the decoded image previously setted by opj_read_header\n * @param\tp_start_x\t\tthe left position of the rectangle to decode (in image coordinates).\n * @param\tp_end_x\t\t\tthe right position of the rectangle to decode (in image coordinates).\n * @param\tp_start_y\t\tthe up position of the rectangle to decode (in image coordinates).\n * @param\tp_end_y\t\t\tthe bottom position of the rectangle to decode (in image coordinates).\n *\n * @return\ttrue\t\t\tif the area could be set.\n */\nOPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_decode_area(\topj_codec_t *p_codec,\n\t\t\t\t\t\t\t\t\t\t\t\t\topj_image_t* p_image,\n\t\t\t\t\t\t\t\t\t\t\t\t\tOPJ_INT32 p_start_x, OPJ_INT32 p_start_y,\n\t\t\t\t\t\t\t\t\t\t\t\t\tOPJ_INT32 p_end_x, OPJ_INT32 p_end_y );\n\n/**\n * Decode an image from a JPEG-2000 codestream\n *\n * @param p_decompressor \tdecompressor handle\n * @param p_stream\t\t\tInput buffer stream\n * @param p_image \t\t\tthe decoded image\n * @return \t\t\t\t\ttrue if success, otherwise false\n * */\nOPJ_API OPJ_BOOL OPJ_CALLCONV opj_decode(   opj_codec_t *p_decompressor,\n                                            opj_stream_t *p_stream,\n                                            opj_image_t *p_image);\n\n/**\n * Get the decoded tile from the codec\n *\n * @param\tp_codec\t\t\tthe jpeg2000 codec.\n * @param\tp_stream\t\tinput streamm\n * @param\tp_image\t\t\toutput image\n * @param\ttile_index\t\tindex of the tile which will be decode\n *\n * @return\t\t\t\t\ttrue if success, otherwise false\n */\nOPJ_API OPJ_BOOL OPJ_CALLCONV opj_get_decoded_tile(\topj_codec_t *p_codec,\n\t\t\t\t\t\t\t\t\t\t\t\t\topj_stream_t *p_stream,\n\t\t\t\t\t\t\t\t\t\t\t\t\topj_image_t *p_image,\n\t\t\t\t\t\t\t\t\t\t\t\t\tOPJ_UINT32 tile_index);\n\n/**\n * Set the resolution factor of the decoded image\n * @param\tp_codec\t\t\tthe jpeg2000 codec.\n * @param\tres_factor\t\tresolution factor to set\n *\n * @return\t\t\t\t\ttrue if success, otherwise false\n */\nOPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_decoded_resolution_factor(opj_codec_t *p_codec, OPJ_UINT32 res_factor);\n\n/**\n * Writes a tile with the given data.\n *\n * @param\tp_codec\t\t        the jpeg2000 codec.\n * @param\tp_tile_index\t\tthe index of the tile to write. At the moment, the tiles must be written from 0 to n-1 in sequence.\n * @param\tp_data\t\t\t\tpointer to the data to write. Data is arranged in sequence, data_comp0, then data_comp1, then ... NO INTERLEAVING should be set.\n * @param\tp_data_size\t\t\tthis value os used to make sure the data being written is correct. The size must be equal to the sum for each component of \n *                              tile_width * tile_height * component_size. component_size can be 1,2 or 4 bytes, depending on the precision of the given component.\n * @param\tp_stream\t\t\tthe stream to write data to.\n *\n * @return\ttrue if the data could be written.\n */\nOPJ_API OPJ_BOOL OPJ_CALLCONV opj_write_tile (\topj_codec_t *p_codec,\n\t\t\t\t\t\t\t\t\t\t\t\tOPJ_UINT32 p_tile_index,\n\t\t\t\t\t\t\t\t\t\t\t\tOPJ_BYTE * p_data,\n\t\t\t\t\t\t\t\t\t\t\t\tOPJ_UINT32 p_data_size,\n\t\t\t\t\t\t\t\t\t\t\t\topj_stream_t *p_stream );\n\n/**\n * Reads a tile header. This function is compulsory and allows one to know the size of the tile thta will be decoded.\n * The user may need to refer to the image got by opj_read_header to understand the size being taken by the tile.\n *\n * @param\tp_codec\t\t\tthe jpeg2000 codec.\n * @param\tp_tile_index\tpointer to a value that will hold the index of the tile being decoded, in case of success.\n * @param\tp_data_size\t\tpointer to a value that will hold the maximum size of the decoded data, in case of success. In case\n *\t\t\t\t\t\t\tof truncated codestreams, the actual number of bytes decoded may be lower. The computation of the size is the same\n *\t\t\t\t\t\t\tas depicted in opj_write_tile.\n * @param\tp_tile_x0\t\tpointer to a value that will hold the x0 pos of the tile (in the image).\n * @param\tp_tile_y0\t\tpointer to a value that will hold the y0 pos of the tile (in the image).\n * @param\tp_tile_x1\t\tpointer to a value that will hold the x1 pos of the tile (in the image).\n * @param\tp_tile_y1\t\tpointer to a value that will hold the y1 pos of the tile (in the image).\n * @param\tp_nb_comps\t\tpointer to a value that will hold the number of components in the tile.\n * @param\tp_should_go_on\tpointer to a boolean that will hold the fact that the decoding should go on. In case the\n *\t\t\t\t\t\t\tcodestream is over at the time of the call, the value will be set to false. The user should then stop\n *\t\t\t\t\t\t\tthe decoding.\n * @param\tp_stream\t\tthe stream to decode.\n * @return\ttrue\t\t\tif the tile header could be decoded. In case the decoding should end, the returned value is still true.\n *\t\t\t\t\t\t\treturning false may be the result of a shortage of memory or an internal error.\n */\nOPJ_API OPJ_BOOL OPJ_CALLCONV opj_read_tile_header(\topj_codec_t *p_codec,\n\t\t\t\t\t\t\t\t\t\t\t\topj_stream_t * p_stream,\n\t\t\t\t\t\t\t\t\t\t\t\tOPJ_UINT32 * p_tile_index,\n\t\t\t\t\t\t\t\t\t\t\t\tOPJ_UINT32 * p_data_size,\n\t\t\t\t\t\t\t\t\t\t\t\tOPJ_INT32 * p_tile_x0, OPJ_INT32 * p_tile_y0,\n\t\t\t\t\t\t\t\t\t\t\t\tOPJ_INT32 * p_tile_x1, OPJ_INT32 * p_tile_y1,\n\t\t\t\t\t\t\t\t\t\t\t\tOPJ_UINT32 * p_nb_comps,\n\t\t\t\t\t\t\t\t\t\t\t\tOPJ_BOOL * p_should_go_on );\n\n/**\n * Reads a tile data. This function is compulsory and allows one to decode tile data. opj_read_tile_header should be called before.\n * The user may need to refer to the image got by opj_read_header to understand the size being taken by the tile.\n *\n * @param\tp_codec\t\t\tthe jpeg2000 codec.\n * @param\tp_tile_index\tthe index of the tile being decoded, this should be the value set by opj_read_tile_header.\n * @param\tp_data\t\t\tpointer to a memory block that will hold the decoded data.\n * @param\tp_data_size\t\tsize of p_data. p_data_size should be bigger or equal to the value set by opj_read_tile_header.\n * @param\tp_stream\t\tthe stream to decode.\n *\n * @return\ttrue\t\t\tif the data could be decoded.\n */\nOPJ_API OPJ_BOOL OPJ_CALLCONV opj_decode_tile_data(\topj_codec_t *p_codec,\n\t\t\t\t\t\t\t\t\t\t\t\t\tOPJ_UINT32 p_tile_index,\n\t\t\t\t\t\t\t\t\t\t\t\t\tOPJ_BYTE * p_data,\n\t\t\t\t\t\t\t\t\t\t\t\t\tOPJ_UINT32 p_data_size,\n\t\t\t\t\t\t\t\t\t\t\t\t\topj_stream_t *p_stream );\n\n/* COMPRESSION FUNCTIONS*/\n\n/**\n * Creates a J2K/JP2 compression structure\n * @param \tformat \t\tCoder to select\n * @return \t\t\t\tReturns a handle to a compressor if successful, returns NULL otherwise\n */\nOPJ_API opj_codec_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format);\n\n/**\nSet encoding parameters to default values, that means : \n<ul>\n<li>Lossless\n<li>1 tile\n<li>Size of precinct : 2^15 x 2^15 (means 1 precinct)\n<li>Size of code-block : 64 x 64\n<li>Number of resolutions: 6\n<li>No SOP marker in the codestream\n<li>No EPH marker in the codestream\n<li>No sub-sampling in x or y direction\n<li>No mode switch activated\n<li>Progression order: LRCP\n<li>No index file\n<li>No ROI upshifted\n<li>No offset of the origin of the image\n<li>No offset of the origin of the tiles\n<li>Reversible DWT 5-3\n</ul>\n@param parameters Compression parameters\n*/\nOPJ_API void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *parameters);\n\n/**\n * Setup the encoder parameters using the current image and using user parameters.\n * @param p_codec \t\tCompressor handle\n * @param parameters \tCompression parameters\n * @param image \t\tInput filled image\n */\nOPJ_API OPJ_BOOL OPJ_CALLCONV opj_setup_encoder(opj_codec_t *p_codec, \n\t\t\t\t\t\t\t\t\t\t\t\topj_cparameters_t *parameters, \n\t\t\t\t\t\t\t\t\t\t\t\topj_image_t *image);\n\n/**\n * Start to compress the current image.\n * @param p_codec \t\tCompressor handle\n * @param image \t    Input filled image\n * @param p_stream \t\tInput stgream\n */\nOPJ_API OPJ_BOOL OPJ_CALLCONV opj_start_compress (\topj_codec_t *p_codec,\n\t\t\t\t\t\t\t\t\t\t\t\t\topj_image_t * p_image,\n\t\t\t\t\t\t\t\t\t\t\t\t\topj_stream_t *p_stream);\n\n/**\n * End to compress the current image.\n * @param p_codec \t\tCompressor handle\n * @param p_stream \t\tInput stgream\n */\nOPJ_API OPJ_BOOL OPJ_CALLCONV opj_end_compress (opj_codec_t *p_codec,\n\t\t\t\t\t\t\t\t\t\t\t\topj_stream_t *p_stream);\n\n/**\n * Encode an image into a JPEG-2000 codestream\n * @param p_codec \t\tcompressor handle\n * @param p_stream \t\tOutput buffer stream\n *\n * @return \t\t\t\tReturns true if successful, returns false otherwise\n */\nOPJ_API OPJ_BOOL OPJ_CALLCONV opj_encode(opj_codec_t *p_codec,\n                                         opj_stream_t *p_stream);\n/*\n==========================================================\n   codec output functions definitions\n==========================================================\n*/\n/* EXPERIMENTAL FUNCTIONS FOR NOW, USED ONLY IN J2K_DUMP*/\n\n/**\nDestroy Codestream information after compression or decompression\n@param cstr_info Codestream information structure\n*/\nOPJ_API void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_v2_t **cstr_info);\n\n\n/**\n * Dump the codec information into the output stream\n *\n * @param\tp_codec\t\t\tthe jpeg2000 codec.\n * @param\tinfo_flag\t\ttype of information dump.\n * @param\toutput_stream\toutput stream where dump the informations get from the codec.\n *\n */\nOPJ_API void OPJ_CALLCONV opj_dump_codec(\topj_codec_t *p_codec,\n\t\t\t\t\t\t\t\t\t\t\tOPJ_INT32 info_flag,\n\t\t\t\t\t\t\t\t\t\t\tFILE* output_stream);\n\n/**\n * Get the codestream information from the codec\n *\n * @param\tp_codec\t\t\tthe jpeg2000 codec.\n *\n * @return\t\t\t\t\ta pointer to a codestream information structure.\n *\n */\nOPJ_API opj_codestream_info_v2_t* OPJ_CALLCONV opj_get_cstr_info(opj_codec_t *p_codec);\n\n/**\n * Get the codestream index from the codec\n *\n * @param\tp_codec\t\t\tthe jpeg2000 codec.\n *\n * @return\t\t\t\t\ta pointer to a codestream index structure.\n *\n */\nOPJ_API opj_codestream_index_t * OPJ_CALLCONV opj_get_cstr_index(opj_codec_t *p_codec);\n\nOPJ_API void OPJ_CALLCONV opj_destroy_cstr_index(opj_codestream_index_t **p_cstr_index);\n\n\n/**\n * Get the JP2 file information from the codec FIXME\n *\n * @param\tp_codec\t\t\tthe jpeg2000 codec.\n *\n * @return\t\t\t\t\ta pointer to a JP2 metadata structure.\n *\n */\nOPJ_API opj_jp2_metadata_t* OPJ_CALLCONV opj_get_jp2_metadata(opj_codec_t *p_codec);\n\n/**\n * Get the JP2 file index from the codec FIXME\n *\n * @param\tp_codec\t\t\tthe jpeg2000 codec.\n *\n * @return\t\t\t\t\ta pointer to a JP2 index structure.\n *\n */\nOPJ_API opj_jp2_index_t* OPJ_CALLCONV opj_get_jp2_index(opj_codec_t *p_codec);\n\n\n/*\n==========================================================\n   MCT functions\n==========================================================\n*/\n\n/**\n * Sets the MCT matrix to use.\n *\n * @param\tparameters\t\tthe parameters to change.\n * @param\tpEncodingMatrix\tthe encoding matrix.\n * @param\tp_dc_shift\t\tthe dc shift coefficients to use.\n * @param\tpNbComp\t\t\tthe number of components of the image.\n *\n * @return\ttrue if the parameters could be set.\n */\nOPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_MCT( opj_cparameters_t *parameters,\n\t\t                               \t   OPJ_FLOAT32 * pEncodingMatrix,\n\t\t                               \t   OPJ_INT32 * p_dc_shift,\n\t\t                               \t   OPJ_UINT32 pNbComp);\n\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* OPENJPEG_H */\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_clock.c",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifdef _WIN32\n#include <windows.h>\n#else\n#include <sys/time.h>\n#include <sys/resource.h>\n#include <sys/times.h>\n#endif /* _WIN32 */\n#include \"opj_includes.h\"\n\nOPJ_FLOAT64 opj_clock(void) {\n#ifdef _WIN32\n\t/* _WIN32: use QueryPerformance (very accurate) */\n    LARGE_INTEGER freq , t ;\n    /* freq is the clock speed of the CPU */\n    QueryPerformanceFrequency(&freq) ;\n\t/* cout << \"freq = \" << ((double) freq.QuadPart) << endl; */\n    /* t is the high resolution performance counter (see MSDN) */\n    QueryPerformanceCounter ( & t ) ;\n    return ( t.QuadPart /(OPJ_FLOAT64) freq.QuadPart ) ;\n#else\n\t/* Unix or Linux: use resource usage */\n    struct rusage t;\n    OPJ_FLOAT64 procTime;\n    /* (1) Get the rusage data structure at this moment (man getrusage) */\n    getrusage(0,&t);\n    /* (2) What is the elapsed time ? - CPU time = User time + System time */\n\t/* (2a) Get the seconds */\n    procTime = (OPJ_FLOAT64)(t.ru_utime.tv_sec + t.ru_stime.tv_sec);\n    /* (2b) More precisely! Get the microseconds part ! */\n    return ( procTime + (OPJ_FLOAT64)(t.ru_utime.tv_usec + t.ru_stime.tv_usec) * 1e-6 ) ;\n#endif\n}\n\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_clock.h",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef __OPJ_CLOCK_H\n#define __OPJ_CLOCK_H\n/**\n@file opj_clock.h\n@brief Internal function for timing\n\nThe functions in OPJ_CLOCK.C are internal utilities mainly used for timing.\n*/\n\n/** @defgroup MISC MISC - Miscellaneous internal functions */\n/*@{*/\n\n/** @name Exported functions */\n/*@{*/\n/* ----------------------------------------------------------------------- */\n\n/**\nDifference in successive opj_clock() calls tells you the elapsed time\n@return Returns time in seconds\n*/\nOPJ_FLOAT64 opj_clock(void);\n\n/* ----------------------------------------------------------------------- */\n/*@}*/\n\n/*@}*/\n\n#endif /* __OPJ_CLOCK_H */\n\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_codec.h",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef __OPJ_CODEC_H\n#define __OPJ_CODEC_H\n/**\n@file opj_codec.h\n*/\n\n\n/**\n * Main codec handler used for compression or decompression.\n */\ntypedef struct opj_codec_private\n{\n    /** FIXME DOC */\n    union\n    {\n        /**\n         * Decompression handler.\n         */\n        struct opj_decompression\n        {\n            /** Main header reading function handler */\n            OPJ_BOOL (*opj_read_header) ( struct opj_stream_private * cio,\n                                          void * p_codec,\n                                          opj_image_t **p_image,\n                                          struct opj_event_mgr * p_manager);\n\n            /** Decoding function */\n            OPJ_BOOL (*opj_decode) ( void * p_codec,\n                                     struct opj_stream_private * p_cio,\n                                     opj_image_t * p_image,\n                                     struct opj_event_mgr * p_manager);\n\n            /** FIXME DOC */\n            OPJ_BOOL (*opj_read_tile_header)( void * p_codec,\n                                              OPJ_UINT32 * p_tile_index,\n                                              OPJ_UINT32 * p_data_size,\n                                              OPJ_INT32 * p_tile_x0,\n                                              OPJ_INT32 * p_tile_y0,\n                                              OPJ_INT32 * p_tile_x1,\n                                              OPJ_INT32 * p_tile_y1,\n                                              OPJ_UINT32 * p_nb_comps,\n                                              OPJ_BOOL * p_should_go_on,\n                                              struct opj_stream_private * p_cio,\n                                              struct opj_event_mgr * p_manager);\n\n            /** FIXME DOC */\n            OPJ_BOOL (*opj_decode_tile_data)( void * p_codec,\n                                              OPJ_UINT32 p_tile_index,\n                                              OPJ_BYTE * p_data,\n                                              OPJ_UINT32 p_data_size,\n                                              struct opj_stream_private * p_cio,\n                                              struct opj_event_mgr * p_manager);\n\n            /** Reading function used after codestream if necessary */\n            OPJ_BOOL (* opj_end_decompress) ( void *p_codec,\n                                              struct opj_stream_private * cio,\n                                              struct opj_event_mgr * p_manager);\n\n            /** Codec destroy function handler */\n            void (*opj_destroy) (void * p_codec);\n\n            /** Setup decoder function handler */\n            void (*opj_setup_decoder) ( void * p_codec, opj_dparameters_t * p_param);\n\n            /** Set decode area function handler */\n            OPJ_BOOL (*opj_set_decode_area) ( void * p_codec,\n                                              opj_image_t * p_image,\n                                              OPJ_INT32 p_start_x,\n                                              OPJ_INT32 p_end_x,\n                                              OPJ_INT32 p_start_y,\n                                              OPJ_INT32 p_end_y,\n                                              struct opj_event_mgr * p_manager);\n\n            /** Get tile function */\n            OPJ_BOOL (*opj_get_decoded_tile) ( void *p_codec,\n                                               opj_stream_private_t * p_cio,\n                                               opj_image_t *p_image,\n                                               struct opj_event_mgr * p_manager,\n                                               OPJ_UINT32 tile_index);\n\n            /** Set the decoded resolution factor */\n            OPJ_BOOL (*opj_set_decoded_resolution_factor) ( void * p_codec,\n                                                            OPJ_UINT32 res_factor,\n                                                            opj_event_mgr_t * p_manager);\n        } m_decompression;\n\n        /**\n         * Compression handler. FIXME DOC\n         */\n        struct opj_compression\n        {\n            OPJ_BOOL (* opj_start_compress) ( void *p_codec,\n                                              struct opj_stream_private * cio,\n                                              struct opj_image * p_image,\n                                              struct opj_event_mgr * p_manager);\n\n            OPJ_BOOL (* opj_encode) ( void * p_codec,\n                                      struct opj_stream_private *p_cio,\n                                      struct opj_event_mgr * p_manager);\n\n            OPJ_BOOL (* opj_write_tile) ( void * p_codec,\n                                          OPJ_UINT32 p_tile_index,\n                                          OPJ_BYTE * p_data,\n                                          OPJ_UINT32 p_data_size,\n                                          struct opj_stream_private * p_cio,\n                                          struct opj_event_mgr * p_manager);\n\n            OPJ_BOOL (* opj_end_compress) (\tvoid * p_codec,\n                                            struct opj_stream_private * p_cio,\n                                            struct opj_event_mgr * p_manager);\n\n            void (* opj_destroy) (void * p_codec);\n\n            void (* opj_setup_encoder) ( void * p_codec,\n                                         opj_cparameters_t * p_param,\n                                         struct opj_image * p_image,\n                                         struct opj_event_mgr * p_manager);\n        } m_compression;\n    } m_codec_data;\n    /** FIXME DOC*/\n    void * m_codec;\n    /** Event handler */\n    opj_event_mgr_t m_event_mgr;\n    /** Flag to indicate if the codec is used to decode or encode*/\n    OPJ_BOOL is_decompressor;\n    void (*opj_dump_codec) (void * p_codec, OPJ_INT32 info_flag, FILE* output_stream);\n    opj_codestream_info_v2_t* (*opj_get_codec_info)(void* p_codec);\n    opj_codestream_index_t* (*opj_get_codec_index)(void* p_codec);\n}\nopj_codec_private_t;\n\n\n#endif /* __OPJ_CODEC_H */\n\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_config.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n/* create opj_config.h for CMake */\n#define OPJ_HAVE_STDINT_H \t\t1\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_config.h.cmake.in",
    "content": "/* create opj_config.h for CMake */\n#cmakedefine OPJ_HAVE_STDINT_H \t\t@OPJ_HAVE_STDINT_H@\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_config_private.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n/* create opj_config_private.h for CMake */\n/* #undef OPJ_HAVE_INTTYPES_H */\n\n#ifndef _WIN32\n#ifndef OPJ_HAVE_INTTYPES_H\n#define OPJ_HAVE_INTTYPES_H\n#endif\n#endif\n\n#define OPJ_PACKAGE_VERSION \"2.1.0\"\n\n/* Not used by openjp2*/\n/*#define HAVE_MEMORY_H 1*/\n/*#define HAVE_STDLIB_H 1*/\n/* #undef HAVE_STRINGS_H */\n/*#define HAVE_STRING_H 1*/\n/*#define HAVE_SYS_STAT_H 1*/\n/*#define HAVE_SYS_TYPES_H 1 */\n/* #undef HAVE_UNISTD_H */\n\n/* #undef _LARGEFILE_SOURCE */\n/* #undef _LARGE_FILES */\n/* #undef _FILE_OFFSET_BITS */\n/* #undef OPJ_HAVE_FSEEKO */\n\n#ifndef _WIN32\n#ifndef OPJ_HAVE_FSEEKO\n#define OPJ_HAVE_FSEEKO\n#endif\n#endif\n\n/* Byte order.  */\n/* All compilers that support Mac OS X define either __BIG_ENDIAN__ or\n__LITTLE_ENDIAN__ to match the endianness of the architecture being\ncompiled for. This is not necessarily the same as the architecture of the\nmachine doing the building. In order to support Universal Binaries on\nMac OS X, we prefer those defines to decide the endianness.\nOn other platforms we use the result of the TRY_RUN. */\n#if !defined(__APPLE__)\n/* #undef OPJ_BIG_ENDIAN */\n#elif defined(__BIG_ENDIAN__)\n# define OPJ_BIG_ENDIAN\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_includes.h",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR \n * Copyright (c) 2012, CS Systemes d'Information, France\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef OPJ_INCLUDES_H\n#define OPJ_INCLUDES_H\n\n/*\n * This must be included before any system headers,\n * since they can react to macro defined there\n */\n#include \"opj_config_private.h\"\n\n/*\n ==========================================================\n   Standard includes used by the library\n ==========================================================\n*/\n#include <memory.h>\n#include <stdlib.h>\n#include <string.h>\n#include <math.h>\n#include <float.h>\n#include <time.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <ctype.h>\n#include <assert.h>\n\n/*\n  Use fseeko() and ftello() if they are available since they use\n  'off_t' rather than 'long'.  It is wrong to use fseeko() and\n  ftello() only on systems with special LFS support since some systems\n  (e.g. FreeBSD) support a 64-bit off_t by default.\n*/\n#if defined(OPJ_HAVE_FSEEKO) && !defined(fseek)\n#  define fseek  fseeko\n#  define ftell  ftello\n#endif\n\n\n#if defined(WIN32) && !defined(Windows95) && !defined(__BORLANDC__) && \\\n  !(defined(_MSC_VER) && _MSC_VER < 1400) && \\\n  !(defined(__MINGW32__) && __MSVCRT_VERSION__ < 0x800)\n  /*\n    Windows '95 and Borland C do not support _lseeki64\n    Visual Studio does not support _fseeki64 and _ftelli64 until the 2005 release.\n    Without these interfaces, files over 2GB in size are not supported for Windows.\n  */\n#  define OPJ_FSEEK(stream,offset,whence) _fseeki64(stream,/* __int64 */ offset,whence)\n#  define OPJ_FSTAT(fildes,stat_buff) _fstati64(fildes,/* struct _stati64 */ stat_buff)\n#  define OPJ_FTELL(stream) /* __int64 */ _ftelli64(stream)\n#  define OPJ_STAT_STRUCT_T struct _stati64\n#  define OPJ_STAT(path,stat_buff) _stati64(path,/* struct _stati64 */ stat_buff)\n#else\n#  define OPJ_FSEEK(stream,offset,whence) fseek(stream,offset,whence)\n#  define OPJ_FSTAT(fildes,stat_buff) fstat(fildes,stat_buff)\n#  define OPJ_FTELL(stream) ftell(stream)\n#  define OPJ_STAT_STRUCT_T struct stat\n#  define OPJ_STAT(path,stat_buff) stat(path,stat_buff)\n#endif\n\n\n/*\n ==========================================================\n   OpenJPEG interface\n ==========================================================\n */\n#include \"openjpeg.h\"\n\n/*\n ==========================================================\n   OpenJPEG modules\n ==========================================================\n*/\n\n/* Ignore GCC attributes if this is not GCC */\n#ifndef __GNUC__\n\t#define __attribute__(x) /* __attribute__(x) */\n#endif\n\n\n/* Are restricted pointers available? (C99) */\n#if (__STDC_VERSION__ != 199901L)\n\t/* Not a C99 compiler */\n\t#ifdef __GNUC__\n\t\t#define restrict __restrict__\n\t#else\n\t\t#define restrict /* restrict */\n\t#endif\n#endif\n\n/* MSVC before 2013 and Borland C do not have lrintf */\n#if defined(_MSC_VER) && (_MSC_VER < 1800) || defined(__BORLANDC__)\nstatic INLINE long lrintf(float f){\n#ifdef _M_X64\n    return (long)((f>0.0f) ? (f + 0.5f):(f -0.5f));\n#else\n    int i;\n \n    _asm{\n        fld f\n        fistp i\n    };\n \n    return i;\n#endif\n}\n#endif\n\n#include \"opj_inttypes.h\"\n#include \"opj_clock.h\"\n#include \"opj_malloc.h\"\n#include \"function_list.h\"\n#include \"event.h\"\n#include \"bio.h\"\n#include \"cio.h\"\n\n#include \"image.h\"\n#include \"invert.h\"\n#include \"j2k.h\"\n#include \"jp2.h\"\n\n#include \"mqc.h\"\n#include \"raw.h\"\n#include \"bio.h\"\n\n#include \"pi.h\"\n#include \"tgt.h\"\n#include \"tcd.h\"\n#include \"t1.h\"\n#include \"dwt.h\"\n#include \"t2.h\"\n#include \"mct.h\"\n#include \"opj_intmath.h\"\n\n#ifdef USE_JPIP\n#include \"cidx_manager.h\"\n#include \"indexbox_manager.h\"\n#endif\n\n/* JPWL>> */\n#ifdef USE_JPWL\n#include \"openjpwl/jpwl.h\"\n#endif /* USE_JPWL */\n/* <<JPWL */\n\n/* V2 */\n#include \"opj_codec.h\"\n\n\n#endif /* OPJ_INCLUDES_H */\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_intmath.h",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2001-2003, David Janssens\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef __INT_H\n#define __INT_H\n/**\n@file opj_intmath.h\n@brief Implementation of operations on integers (INT)\n\nThe functions in OPJ_INTMATH.H have for goal to realize operations on integers.\n*/\n\n/** @defgroup OPJ_INTMATH OPJ_INTMATH - Implementation of operations on integers */\n/*@{*/\n\n/** @name Exported functions (see also openjpeg.h) */\n/*@{*/\n/* ----------------------------------------------------------------------- */\n/**\nGet the minimum of two integers\n@return Returns a if a < b else b\n*/\nstatic INLINE OPJ_INT32 opj_int_min(OPJ_INT32 a, OPJ_INT32 b) {\n\treturn a < b ? a : b;\n}\n\n/**\nGet the minimum of two integers\n@return Returns a if a < b else b\n*/\nstatic INLINE OPJ_UINT32 opj_uint_min(OPJ_UINT32 a, OPJ_UINT32 b) {\n\treturn a < b ? a : b;\n}\n\n/**\nGet the maximum of two integers\n@return Returns a if a > b else b\n*/\nstatic INLINE OPJ_INT32 opj_int_max(OPJ_INT32 a, OPJ_INT32 b) {\n\treturn (a > b) ? a : b;\n}\n\n/**\nGet the maximum of two integers\n@return Returns a if a > b else b\n*/\nstatic INLINE OPJ_UINT32 opj_uint_max(OPJ_UINT32  a, OPJ_UINT32  b) {\n\treturn (a > b) ? a : b;\n}\n\n/**\nClamp an integer inside an interval\n@return\n<ul>\n<li>Returns a if (min < a < max)\n<li>Returns max if (a > max)\n<li>Returns min if (a < min) \n</ul>\n*/\nstatic INLINE OPJ_INT32 opj_int_clamp(OPJ_INT32 a, OPJ_INT32 min, OPJ_INT32 max) {\n\tif (a < min)\n\t\treturn min;\n\tif (a > max)\n\t\treturn max;\n\treturn a;\n}\n/**\n@return Get absolute value of integer\n*/\nstatic INLINE OPJ_INT32 opj_int_abs(OPJ_INT32 a) {\n\treturn a < 0 ? -a : a;\n}\n/**\nDivide an integer and round upwards\n@return Returns a divided by b\n*/\nstatic INLINE OPJ_INT32 opj_int_ceildiv(OPJ_INT32 a, OPJ_INT32 b) {\n  assert(b);\n\treturn (a + b - 1) / b;\n}\n\n/**\nDivide an integer and round upwards\n@return Returns a divided by b\n*/\nstatic INLINE OPJ_UINT32  opj_uint_ceildiv(OPJ_UINT32  a, OPJ_UINT32  b) {\n\treturn (a + b - 1) / b;\n}\n\n/**\nDivide an integer by a power of 2 and round upwards\n@return Returns a divided by 2^b\n*/\nstatic INLINE OPJ_INT32 opj_int_ceildivpow2(OPJ_INT32 a, OPJ_INT32 b) {\n\treturn (OPJ_INT32)((a + (OPJ_INT64)(1 << b) - 1) >> b);\n}\n/**\nDivide an integer by a power of 2 and round downwards\n@return Returns a divided by 2^b\n*/\nstatic INLINE OPJ_INT32 opj_int_floordivpow2(OPJ_INT32 a, OPJ_INT32 b) {\n\treturn a >> b;\n}\n/**\nGet logarithm of an integer and round downwards\n@return Returns log2(a)\n*/\nstatic INLINE OPJ_INT32 opj_int_floorlog2(OPJ_INT32 a) {\n\tOPJ_INT32 l;\n\tfor (l = 0; a > 1; l++) {\n\t\ta >>= 1;\n\t}\n\treturn l;\n}\n/**\nGet logarithm of an integer and round downwards\n@return Returns log2(a)\n*/\nstatic INLINE OPJ_UINT32  opj_uint_floorlog2(OPJ_UINT32  a) {\n\tOPJ_UINT32  l;\n\tfor (l = 0; a > 1; ++l)\n\t{\n\t\ta >>= 1;\n\t}\n\treturn l;\n}\n\n/**\nMultiply two fixed-precision rational numbers.\n@param a\n@param b\n@return Returns a * b\n*/\nstatic INLINE OPJ_INT32 opj_int_fix_mul(OPJ_INT32 a, OPJ_INT32 b) {\n    OPJ_INT64 temp = (OPJ_INT64) a * (OPJ_INT64) b ;\n    temp += temp & 4096;\n    return (OPJ_INT32) (temp >> 13) ;\n}\n\n/* ----------------------------------------------------------------------- */\n/*@}*/\n\n/*@}*/\n\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_inttypes.h",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2012, Mathieu Malaterre <mathieu.malaterre@gmail.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef OPJ_INTTYPES_H\n#define OPJ_INTTYPES_H\n\n#include \"opj_config_private.h\"\n#ifdef OPJ_HAVE_INTTYPES_H\n#include <inttypes.h>\n#else\n#if defined(_WIN32)\n#define PRId64 \"I64d\"\n#define PRIi64 \"I64i\"\n#define PRIu64 \"I64u\"\n#define PRIx64 \"I64x\"\n#else\n#error unsupported platform\n#endif\n#endif\n\n#endif /* OPJ_INTTYPES_H */\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_malloc.h",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef __OPJ_MALLOC_H\n#define __OPJ_MALLOC_H\n/**\n@file opj_malloc.h\n@brief Internal functions\n\nThe functions in opj_malloc.h are internal utilities used for memory management.\n*/\n\n/** @defgroup MISC MISC - Miscellaneous internal functions */\n/*@{*/\n\n/** @name Exported functions */\n/*@{*/\n/* ----------------------------------------------------------------------- */\n\n/**\nAllocate an uninitialized memory block\n@param size Bytes to allocate\n@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available\n*/\n\n#ifdef ALLOC_PERF_OPT\nvoid * OPJ_CALLCONV opj_malloc(size_t size);\n#else\n/* prevent assertion on overflow for MSVC */\n#ifdef _MSC_VER\n#define opj_malloc(size) ((size_t)(size) >= (size_t)-0x100 ? NULL : malloc(size))\n#else\n#define opj_malloc(size) malloc(size)\n#endif\n#endif\n\n/**\nAllocate a memory block with elements initialized to 0\n@param num Blocks to allocate\n@param size Bytes per block to allocate\n@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available\n*/\n#ifdef ALLOC_PERF_OPT\nvoid * OPJ_CALLCONV opj_calloc(size_t _NumOfElements, size_t _SizeOfElements);\n#else\n/* prevent assertion on overflow for MSVC */\n#ifdef _MSC_VER\n#define opj_calloc(num, size) ((size_t)(num) != 0 && (size_t)(num) >= (size_t)-0x100 / (size_t)(size) ? NULL : calloc(num, size))\n#else\n#define opj_calloc(num, size) calloc(num, size)\n#endif\n#endif\n\n/**\nAllocate memory aligned to a 16 byte boundry\n@param size Bytes to allocate\n@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available\n*/\n/* FIXME: These should be set with cmake tests, but we're currently not requiring use of cmake */\n#ifdef _WIN32\n\t/* Someone should tell the mingw people that their malloc.h ought to provide _mm_malloc() */\n\t#ifdef __GNUC__\n\t\t#include <mm_malloc.h>\n\t\t#define HAVE_MM_MALLOC\n\t#else /* MSVC, Intel C++ */\n\t\t#include <malloc.h>\n\t\t#ifdef _mm_malloc\n\t\t\t#define HAVE_MM_MALLOC\n\t\t#endif\n\t#endif\n#else /* Not _WIN32 */\n\t#if defined(__sun)\n\t\t#define HAVE_MEMALIGN\n  #elif defined(__FreeBSD__)\n    #define HAVE_POSIX_MEMALIGN\n\t/* Linux x86_64 and OSX always align allocations to 16 bytes */\n\t#elif !defined(__amd64__) && !defined(__APPLE__) && !defined(_AIX)\n\t\t#define HAVE_MEMALIGN\n\t\t#include <malloc.h>\t\t\t\n\t#endif\n#endif\n\n#define opj_aligned_malloc(size) malloc(size)\n#define opj_aligned_free(m) free(m)\n\n#ifdef HAVE_MM_MALLOC\n\t#undef opj_aligned_malloc\n\t#define opj_aligned_malloc(size) _mm_malloc(size, 16)\n\t#undef opj_aligned_free\n\t#define opj_aligned_free(m) _mm_free(m)\n#endif\n\n#ifdef HAVE_MEMALIGN\n\textern void* memalign(size_t, size_t);\n\t#undef opj_aligned_malloc\n\t#define opj_aligned_malloc(size) memalign(16, (size))\n\t#undef opj_aligned_free\n\t#define opj_aligned_free(m) free(m)\n#endif\n\n#ifdef HAVE_POSIX_MEMALIGN\n\t#undef opj_aligned_malloc\n\textern int posix_memalign(void**, size_t, size_t);\n\n\tstatic INLINE void* __attribute__ ((malloc)) opj_aligned_malloc(size_t size){\n\t\tvoid* mem = NULL;\n\t\tposix_memalign(&mem, 16, size);\n\t\treturn mem;\n\t}\n\t#undef opj_aligned_free\n\t#define opj_aligned_free(m) free(m)\n#endif\n\n#ifdef ALLOC_PERF_OPT\n\t#undef opj_aligned_malloc\n\t#define opj_aligned_malloc(size) opj_malloc(size)\n\t#undef opj_aligned_free\n\t#define opj_aligned_free(m) opj_free(m)\n#endif\n\n/**\nReallocate memory blocks.\n@param m Pointer to previously allocated memory block\n@param s New size in bytes\n@return Returns a void pointer to the reallocated (and possibly moved) memory block\n*/\n#ifdef ALLOC_PERF_OPT\nvoid * OPJ_CALLCONV opj_realloc(void * m, size_t s);\n#else\n/* prevent assertion on overflow for MSVC */\n#ifdef _MSC_VER\n#define opj_realloc(m, s) ((size_t)(s) >= (size_t)-0x100 ? NULL : realloc(m, s))\n#else\n#define opj_realloc(m, s) realloc(m, s)\n#endif\n\n/**\nDeallocates or frees a memory block.\n@param m Previously allocated memory block to be freed\n*/\n#ifdef ALLOC_PERF_OPT\nvoid OPJ_CALLCONV opj_free(void * m);\n#else\n#define opj_free(m) free(m)\n#endif\n\n#ifdef __GNUC__\n#pragma GCC poison malloc calloc realloc free\n#endif\n#endif\n/* ----------------------------------------------------------------------- */\n/*@}*/\n\n/*@}*/\n\n#endif /* __OPJ_MALLOC_H */\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_stdint.h",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2012, Mathieu Malaterre <mathieu.malaterre@gmail.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef OPJ_STDINT_H\n#define OPJ_STDINT_H\n\n#include \"opj_config.h\"\n#ifdef OPJ_HAVE_STDINT_H\n#include <stdint.h>\n#else\n#if defined(_WIN32)\ntypedef   signed __int8   int8_t;\ntypedef unsigned __int8   uint8_t;\ntypedef   signed __int16  int16_t;\ntypedef unsigned __int16  uint16_t;\ntypedef   signed __int32  int32_t;\ntypedef unsigned __int32  uint32_t;\ntypedef   signed __int64  int64_t;\ntypedef unsigned __int64  uint64_t;\n#else\n#error unsupported platform\n#endif\n#endif\n\n#endif /* OPJ_STDINT_H */\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/pi.c",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2001-2003, David Janssens\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * Copyright (c) 2006-2007, Parvatha Elangovan\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"opj_includes.h\"\n\n/** @defgroup PI PI - Implementation of a packet iterator */\n/*@{*/\n\n/** @name Local static functions */\n/*@{*/\n\n/**\nGet next packet in layer-resolution-component-precinct order.\n@param pi packet iterator to modify\n@return returns false if pi pointed to the last packet or else returns true\n*/\nstatic OPJ_BOOL opj_pi_next_lrcp(opj_pi_iterator_t * pi);\n/**\nGet next packet in resolution-layer-component-precinct order.\n@param pi packet iterator to modify\n@return returns false if pi pointed to the last packet or else returns true\n*/\nstatic OPJ_BOOL opj_pi_next_rlcp(opj_pi_iterator_t * pi);\n/**\nGet next packet in resolution-precinct-component-layer order.\n@param pi packet iterator to modify\n@return returns false if pi pointed to the last packet or else returns true\n*/\nstatic OPJ_BOOL opj_pi_next_rpcl(opj_pi_iterator_t * pi);\n/**\nGet next packet in precinct-component-resolution-layer order.\n@param pi packet iterator to modify\n@return returns false if pi pointed to the last packet or else returns true\n*/\nstatic OPJ_BOOL opj_pi_next_pcrl(opj_pi_iterator_t * pi);\n/**\nGet next packet in component-precinct-resolution-layer order.\n@param pi packet iterator to modify\n@return returns false if pi pointed to the last packet or else returns true\n*/\nstatic OPJ_BOOL opj_pi_next_cprl(opj_pi_iterator_t * pi);\n\n/**\n * Updates the coding parameters if the encoding is used with Progression order changes and final (or cinema parameters are used).\n *\n * @param\tp_cp\t\tthe coding parameters to modify\n * @param\tp_tileno\tthe tile index being concerned.\n * @param\tp_tx0\t\tX0 parameter for the tile\n * @param\tp_tx1\t\tX1 parameter for the tile\n * @param\tp_ty0\t\tY0 parameter for the tile\n * @param\tp_ty1\t\tY1 parameter for the tile\n * @param\tp_max_prec\tthe maximum precision for all the bands of the tile\n * @param\tp_max_res\tthe maximum number of resolutions for all the poc inside the tile.\n * @param\tp_dx_min\t\tthe minimum dx of all the components of all the resolutions for the tile.\n * @param\tp_dy_min\t\tthe minimum dy of all the components of all the resolutions for the tile.\n */\nstatic void opj_pi_update_encode_poc_and_final ( opj_cp_t *p_cp,\n                                                 OPJ_UINT32 p_tileno,\n                                                 OPJ_INT32 p_tx0,\n                                                 OPJ_INT32 p_tx1,\n                                                 OPJ_INT32 p_ty0,\n                                                 OPJ_INT32 p_ty1,\n                                                 OPJ_UINT32 p_max_prec,\n                                                 OPJ_UINT32 p_max_res,\n                                                 OPJ_UINT32 p_dx_min,\n                                                 OPJ_UINT32 p_dy_min);\n\n/**\n * Updates the coding parameters if the encoding is not used with Progression order changes and final (and cinema parameters are used).\n *\n * @param\tp_cp\t\tthe coding parameters to modify\n * @param\tp_num_comps\t\tthe number of components\n * @param\tp_tileno\tthe tile index being concerned.\n * @param\tp_tx0\t\tX0 parameter for the tile\n * @param\tp_tx1\t\tX1 parameter for the tile\n * @param\tp_ty0\t\tY0 parameter for the tile\n * @param\tp_ty1\t\tY1 parameter for the tile\n * @param\tp_max_prec\tthe maximum precision for all the bands of the tile\n * @param\tp_max_res\tthe maximum number of resolutions for all the poc inside the tile.\n * @param\tp_dx_min\t\tthe minimum dx of all the components of all the resolutions for the tile.\n * @param\tp_dy_min\t\tthe minimum dy of all the components of all the resolutions for the tile.\n */\nstatic void opj_pi_update_encode_not_poc (  opj_cp_t *p_cp,\n                                            OPJ_UINT32 p_num_comps,\n                                            OPJ_UINT32 p_tileno,\n                                            OPJ_INT32 p_tx0,\n                                            OPJ_INT32 p_tx1,\n                                            OPJ_INT32 p_ty0,\n                                            OPJ_INT32 p_ty1,\n                                            OPJ_UINT32 p_max_prec,\n                                            OPJ_UINT32 p_max_res,\n                                            OPJ_UINT32 p_dx_min,\n                                            OPJ_UINT32 p_dy_min);\n/**\n * Gets the encoding parameters needed to update the coding parameters and all the pocs.\n * \n * @param\tp_image\t\t\tthe image being encoded.\n * @param\tp_cp\t\t\tthe coding parameters.\n * @param\ttileno\t\t\tthe tile index of the tile being encoded.\n * @param\tp_tx0\t\t\tpointer that will hold the X0 parameter for the tile\n * @param\tp_tx1\t\t\tpointer that will hold the X1 parameter for the tile\n * @param\tp_ty0\t\t\tpointer that will hold the Y0 parameter for the tile\n * @param\tp_ty1\t\t\tpointer that will hold the Y1 parameter for the tile\n * @param\tp_max_prec\t\tpointer that will hold the the maximum precision for all the bands of the tile\n * @param\tp_max_res\t\tpointer that will hold the the maximum number of resolutions for all the poc inside the tile.\n * @param\tp_dx_min\t\t\tpointer that will hold the the minimum dx of all the components of all the resolutions for the tile.\n * @param\tp_dy_min\t\t\tpointer that will hold the the minimum dy of all the components of all the resolutions for the tile.\n */\nstatic void opj_get_encoding_parameters(const opj_image_t *p_image,\n                                        const opj_cp_t *p_cp,\n                                        OPJ_UINT32  tileno,\n                                        OPJ_INT32  * p_tx0,\n                                        OPJ_INT32 * p_tx1,\n                                        OPJ_INT32 * p_ty0,\n                                        OPJ_INT32 * p_ty1,\n                                        OPJ_UINT32 * p_dx_min,\n                                        OPJ_UINT32 * p_dy_min,\n                                        OPJ_UINT32 * p_max_prec,\n                                        OPJ_UINT32 * p_max_res );\n\n/**\n * Gets the encoding parameters needed to update the coding parameters and all the pocs.\n * The precinct widths, heights, dx and dy for each component at each resolution will be stored as well.\n * the last parameter of the function should be an array of pointers of size nb components, each pointer leading\n * to an area of size 4 * max_res. The data is stored inside this area with the following pattern :\n * dx_compi_res0 , dy_compi_res0 , w_compi_res0, h_compi_res0 , dx_compi_res1 , dy_compi_res1 , w_compi_res1, h_compi_res1 , ...\n *\n * @param\tp_image\t\t\tthe image being encoded.\n * @param\tp_cp\t\t\tthe coding parameters.\n * @param\ttileno\t\t\tthe tile index of the tile being encoded.\n * @param\tp_tx0\t\t\tpointer that will hold the X0 parameter for the tile\n * @param\tp_tx1\t\t\tpointer that will hold the X1 parameter for the tile\n * @param\tp_ty0\t\t\tpointer that will hold the Y0 parameter for the tile\n * @param\tp_ty1\t\t\tpointer that will hold the Y1 parameter for the tile\n * @param\tp_max_prec\t\tpointer that will hold the the maximum precision for all the bands of the tile\n * @param\tp_max_res\t\tpointer that will hold the the maximum number of resolutions for all the poc inside the tile.\n * @param\tp_dx_min\t\tpointer that will hold the the minimum dx of all the components of all the resolutions for the tile.\n * @param\tp_dy_min\t\tpointer that will hold the the minimum dy of all the components of all the resolutions for the tile.\n * @param\tp_resolutions\tpointer to an area corresponding to the one described above.\n */\nstatic void opj_get_all_encoding_parameters(const opj_image_t *p_image,\n                                            const opj_cp_t *p_cp,\n                                            OPJ_UINT32 tileno,\n                                            OPJ_INT32 * p_tx0,\n                                            OPJ_INT32 * p_tx1,\n                                            OPJ_INT32 * p_ty0,\n                                            OPJ_INT32 * p_ty1,\n                                            OPJ_UINT32 * p_dx_min,\n                                            OPJ_UINT32 * p_dy_min,\n                                            OPJ_UINT32 * p_max_prec,\n                                            OPJ_UINT32 * p_max_res,\n                                            OPJ_UINT32 ** p_resolutions );\n/**\n * Allocates memory for a packet iterator. Data and data sizes are set by this operation.\n * No other data is set. The include section of the packet  iterator is not allocated.\n * \n * @param\tp_image\t\tthe image used to initialize the packet iterator (in fact only the number of components is relevant.\n * @param\tp_cp\t\tthe coding parameters.\n * @param\ttileno\tthe index of the tile from which creating the packet iterator.\n */\nstatic opj_pi_iterator_t * opj_pi_create(\tconst opj_image_t *p_image,\n                                            const opj_cp_t *p_cp,\n                                            OPJ_UINT32 tileno );\n/**\n * FIXME DOC\n */\nstatic void opj_pi_update_decode_not_poc (opj_pi_iterator_t * p_pi,\n                                          opj_tcp_t * p_tcp,\n                                          OPJ_UINT32 p_max_precision,\n                                          OPJ_UINT32 p_max_res);\n/**\n * FIXME DOC\n */\nstatic void opj_pi_update_decode_poc (  opj_pi_iterator_t * p_pi,\n                                        opj_tcp_t * p_tcp,\n                                        OPJ_UINT32 p_max_precision,\n                                        OPJ_UINT32 p_max_res);\n\n/**\n * FIXME DOC\n */\nOPJ_BOOL opj_pi_check_next_level(\tOPJ_INT32 pos,\n\t\t\t\t\t\t\t\topj_cp_t *cp,\n\t\t\t\t\t\t\t\tOPJ_UINT32 tileno,\n\t\t\t\t\t\t\t\tOPJ_UINT32 pino,\n\t\t\t\t\t\t\t\tconst OPJ_CHAR *prog);\n\n/*@}*/\n\n/*@}*/\n\n/*\n==========================================================\n   local functions\n==========================================================\n*/\n\nOPJ_BOOL opj_pi_next_lrcp(opj_pi_iterator_t * pi) {\n\topj_pi_comp_t *comp = NULL;\n\topj_pi_resolution_t *res = NULL;\n\tOPJ_UINT32 index = 0;\n\t\n\tif (!pi->first) {\n\t\tcomp = &pi->comps[pi->compno];\n\t\tres = &comp->resolutions[pi->resno];\n\t\tgoto LABEL_SKIP;\n\t} else {\n\t\tpi->first = 0;\n\t}\n\n\tfor (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {\n\t\tfor (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1;\n\t\tpi->resno++) {\n\t\t\tfor (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {\n\t\t\t\tcomp = &pi->comps[pi->compno];\n\t\t\t\tif (pi->resno >= comp->numresolutions) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tres = &comp->resolutions[pi->resno];\n\t\t\t\tif (!pi->tp_on){\n\t\t\t\t\tpi->poc.precno1 = res->pw * res->ph;\n\t\t\t\t}\n\t\t\t\tfor (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) {\n\t\t\t\t\tindex = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;\n\t\t\t\t\tif (!pi->include[index]) {\n\t\t\t\t\t\tpi->include[index] = 1;\n\t\t\t\t\t\treturn OPJ_TRUE;\n\t\t\t\t\t}\nLABEL_SKIP:;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn OPJ_FALSE;\n}\n\nOPJ_BOOL opj_pi_next_rlcp(opj_pi_iterator_t * pi) {\n\topj_pi_comp_t *comp = NULL;\n\topj_pi_resolution_t *res = NULL;\n\tOPJ_UINT32 index = 0;\n\n\tif (!pi->first) {\n\t\tcomp = &pi->comps[pi->compno];\n\t\tres = &comp->resolutions[pi->resno];\n\t\tgoto LABEL_SKIP;\n\t} else {\n\t\tpi->first = 0;\n\t}\n\n\tfor (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {\n\t\tfor (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {\n\t\t\tfor (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {\n\t\t\t\tcomp = &pi->comps[pi->compno];\n\t\t\t\tif (pi->resno >= comp->numresolutions) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tres = &comp->resolutions[pi->resno];\n\t\t\t\tif(!pi->tp_on){\n\t\t\t\t\tpi->poc.precno1 = res->pw * res->ph;\n\t\t\t\t}\n\t\t\t\tfor (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) {\n\t\t\t\t\tindex = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;\n\t\t\t\t\tif (!pi->include[index]) {\n\t\t\t\t\t\tpi->include[index] = 1;\n\t\t\t\t\t\treturn OPJ_TRUE;\n\t\t\t\t\t}\nLABEL_SKIP:;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn OPJ_FALSE;\n}\n\nOPJ_BOOL opj_pi_next_rpcl(opj_pi_iterator_t * pi) {\n\topj_pi_comp_t *comp = NULL;\n\topj_pi_resolution_t *res = NULL;\n\tOPJ_UINT32 index = 0;\n\n\tif (!pi->first) {\n\t\tgoto LABEL_SKIP;\n\t} else {\n\t\tOPJ_UINT32 compno, resno;\n\t\tpi->first = 0;\n\t\tpi->dx = 0;\n\t\tpi->dy = 0;\n\t\tfor (compno = 0; compno < pi->numcomps; compno++) {\n\t\t\tcomp = &pi->comps[compno];\n\t\t\tfor (resno = 0; resno < comp->numresolutions; resno++) {\n\t\t\t\tOPJ_UINT32 dx, dy;\n\t\t\t\tres = &comp->resolutions[resno];\n\t\t\t\tdx = comp->dx * (1u << (res->pdx + comp->numresolutions - 1 - resno));\n\t\t\t\tdy = comp->dy * (1u << (res->pdy + comp->numresolutions - 1 - resno));\n\t\t\t\tpi->dx = !pi->dx ? dx : opj_uint_min(pi->dx, dx);\n\t\t\t\tpi->dy = !pi->dy ? dy : opj_uint_min(pi->dy, dy);\n\t\t\t}\n\t\t}\n\t}\nif (!pi->tp_on){\n\t\t\tpi->poc.ty0 = pi->ty0;\n\t\t\tpi->poc.tx0 = pi->tx0;\n\t\t\tpi->poc.ty1 = pi->ty1;\n\t\t\tpi->poc.tx1 = pi->tx1;\n\t\t}\n\tfor (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {\n\t\tfor (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += (OPJ_INT32)(pi->dy - (OPJ_UINT32)(pi->y % (OPJ_INT32)pi->dy))) {\n\t\t\tfor (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += (OPJ_INT32)(pi->dx - (OPJ_UINT32)(pi->x % (OPJ_INT32)pi->dx))) {\n\t\t\t\tfor (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {\n\t\t\t\t\tOPJ_UINT32 levelno;\n\t\t\t\t\tOPJ_INT32 trx0, try0;\n\t\t\t\t\tOPJ_INT32  trx1, try1;\n\t\t\t\t\tOPJ_UINT32  rpx, rpy;\n\t\t\t\t\tOPJ_INT32  prci, prcj;\n\t\t\t\t\tcomp = &pi->comps[pi->compno];\n\t\t\t\t\tif (pi->resno >= comp->numresolutions) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tres = &comp->resolutions[pi->resno];\n\t\t\t\t\tlevelno = comp->numresolutions - 1 - pi->resno;\n\t\t\t\t\ttrx0 = opj_int_ceildiv(pi->tx0, (OPJ_INT32)(comp->dx << levelno));\n\t\t\t\t\ttry0 = opj_int_ceildiv(pi->ty0, (OPJ_INT32)(comp->dy << levelno));\n\t\t\t\t\ttrx1 = opj_int_ceildiv(pi->tx1, (OPJ_INT32)(comp->dx << levelno));\n\t\t\t\t\ttry1 = opj_int_ceildiv(pi->ty1, (OPJ_INT32)(comp->dy << levelno));\n\t\t\t\t\trpx = res->pdx + levelno;\n\t\t\t\t\trpy = res->pdy + levelno;\n\t\t\t\t\tif (!((pi->y % (OPJ_INT32)(comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){\n\t\t\t\t\t\tcontinue;\t\n\t\t\t\t\t}\n\t\t\t\t\tif (!((pi->x % (OPJ_INT32)(comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif ((res->pw==0)||(res->ph==0)) continue;\n\t\t\t\t\t\n\t\t\t\t\tif ((trx0==trx1)||(try0==try1)) continue;\n\t\t\t\t\t\n\t\t\t\t\tprci = opj_int_floordivpow2(opj_int_ceildiv(pi->x, (OPJ_INT32)(comp->dx << levelno)), (OPJ_INT32)res->pdx)\n\t\t\t\t\t\t - opj_int_floordivpow2(trx0, (OPJ_INT32)res->pdx);\n\t\t\t\t\tprcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y, (OPJ_INT32)(comp->dy << levelno)), (OPJ_INT32)res->pdy)\n\t\t\t\t\t\t - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);\n\t\t\t\t\tpi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);\n\t\t\t\t\tfor (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {\n\t\t\t\t\t\tindex = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;\n\t\t\t\t\t\tif (!pi->include[index]) {\n\t\t\t\t\t\t\tpi->include[index] = 1;\n\t\t\t\t\t\t\treturn OPJ_TRUE;\n\t\t\t\t\t\t}\nLABEL_SKIP:;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn OPJ_FALSE;\n}\n\nOPJ_BOOL opj_pi_next_pcrl(opj_pi_iterator_t * pi) {\n\topj_pi_comp_t *comp = NULL;\n\topj_pi_resolution_t *res = NULL;\n\tOPJ_UINT32 index = 0;\n\n\tif (!pi->first) {\n\t\tcomp = &pi->comps[pi->compno];\n\t\tgoto LABEL_SKIP;\n\t} else {\n\t\tOPJ_UINT32 compno, resno;\n\t\tpi->first = 0;\n\t\tpi->dx = 0;\n\t\tpi->dy = 0;\n\t\tfor (compno = 0; compno < pi->numcomps; compno++) {\n\t\t\tcomp = &pi->comps[compno];\n\t\t\tfor (resno = 0; resno < comp->numresolutions; resno++) {\n\t\t\t\tOPJ_UINT32 dx, dy;\n\t\t\t\tres = &comp->resolutions[resno];\n\t\t\t\tdx = comp->dx * (1u << (res->pdx + comp->numresolutions - 1 - resno));\n\t\t\t\tdy = comp->dy * (1u << (res->pdy + comp->numresolutions - 1 - resno));\n\t\t\t\tpi->dx = !pi->dx ? dx : opj_uint_min(pi->dx, dx);\n\t\t\t\tpi->dy = !pi->dy ? dy : opj_uint_min(pi->dy, dy);\n\t\t\t}\n\t\t}\n\t}\n\tif (!pi->tp_on){\n\t\t\tpi->poc.ty0 = pi->ty0;\n\t\t\tpi->poc.tx0 = pi->tx0;\n\t\t\tpi->poc.ty1 = pi->ty1;\n\t\t\tpi->poc.tx1 = pi->tx1;\n\t\t}\n\tfor (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += (OPJ_INT32)(pi->dy - (OPJ_UINT32)(pi->y % (OPJ_INT32)pi->dy))) {\n\t\tfor (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += (OPJ_INT32)(pi->dx - (OPJ_UINT32)(pi->x % (OPJ_INT32)pi->dx))) {\n\t\t\tfor (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {\n\t\t\t\tcomp = &pi->comps[pi->compno];\n\t\t\t\tfor (pi->resno = pi->poc.resno0; pi->resno < opj_uint_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {\n\t\t\t\t\tOPJ_UINT32 levelno;\n\t\t\t\t\tOPJ_INT32 trx0, try0;\n\t\t\t\t\tOPJ_INT32 trx1, try1;\n\t\t\t\t\tOPJ_UINT32 rpx, rpy;\n\t\t\t\t\tOPJ_INT32 prci, prcj;\n\t\t\t\t\tres = &comp->resolutions[pi->resno];\n\t\t\t\t\tlevelno = comp->numresolutions - 1 - pi->resno;\n\t\t\t\t\ttrx0 = opj_int_ceildiv(pi->tx0, (OPJ_INT32)(comp->dx << levelno));\n\t\t\t\t\ttry0 = opj_int_ceildiv(pi->ty0, (OPJ_INT32)(comp->dy << levelno));\n\t\t\t\t\ttrx1 = opj_int_ceildiv(pi->tx1, (OPJ_INT32)(comp->dx << levelno));\n\t\t\t\t\ttry1 = opj_int_ceildiv(pi->ty1, (OPJ_INT32)(comp->dy << levelno));\n\t\t\t\t\trpx = res->pdx + levelno;\n\t\t\t\t\trpy = res->pdy + levelno;\n\t\t\t\t\tif (!((pi->y % (OPJ_INT32)(comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){\n\t\t\t\t\t\tcontinue;\t\n\t\t\t\t\t}\n\t\t\t\t\tif (!((pi->x % (OPJ_INT32)(comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif ((res->pw==0)||(res->ph==0)) continue;\n\t\t\t\t\t\n\t\t\t\t\tif ((trx0==trx1)||(try0==try1)) continue;\n\t\t\t\t\t\n\t\t\t\t\tprci = opj_int_floordivpow2(opj_int_ceildiv(pi->x, (OPJ_INT32)(comp->dx << levelno)), (OPJ_INT32)res->pdx)\n\t\t\t\t\t\t - opj_int_floordivpow2(trx0, (OPJ_INT32)res->pdx);\n\t\t\t\t\tprcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y, (OPJ_INT32)(comp->dy << levelno)), (OPJ_INT32)res->pdy)\n\t\t\t\t\t\t - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);\n\t\t\t\t\tpi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);\n\t\t\t\t\tfor (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {\n\t\t\t\t\t\tindex = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;\n\t\t\t\t\t\tif (!pi->include[index]) {\n\t\t\t\t\t\t\tpi->include[index] = 1;\n\t\t\t\t\t\t\treturn OPJ_TRUE;\n\t\t\t\t\t\t}\t\nLABEL_SKIP:;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn OPJ_FALSE;\n}\n\nOPJ_BOOL opj_pi_next_cprl(opj_pi_iterator_t * pi) {\n\topj_pi_comp_t *comp = NULL;\n\topj_pi_resolution_t *res = NULL;\n\tOPJ_UINT32 index = 0;\n\n\tif (!pi->first) {\n\t\tcomp = &pi->comps[pi->compno];\n\t\tgoto LABEL_SKIP;\n\t} else {\n\t\tpi->first = 0;\n\t}\n\n\tfor (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {\n\t\tOPJ_UINT32 resno;\n\t\tcomp = &pi->comps[pi->compno];\n\t\tpi->dx = 0;\n\t\tpi->dy = 0;\n\t\tfor (resno = 0; resno < comp->numresolutions; resno++) {\n\t\t\tOPJ_UINT32 dx, dy;\n\t\t\tres = &comp->resolutions[resno];\n\t\t\tdx = comp->dx * (1u << (res->pdx + comp->numresolutions - 1 - resno));\n\t\t\tdy = comp->dy * (1u << (res->pdy + comp->numresolutions - 1 - resno));\n\t\t\tpi->dx = !pi->dx ? dx : opj_uint_min(pi->dx, dx);\n\t\t\tpi->dy = !pi->dy ? dy : opj_uint_min(pi->dy, dy);\n\t\t}\n\t\tif (!pi->tp_on){\n\t\t\tpi->poc.ty0 = pi->ty0;\n\t\t\tpi->poc.tx0 = pi->tx0;\n\t\t\tpi->poc.ty1 = pi->ty1;\n\t\t\tpi->poc.tx1 = pi->tx1;\n\t\t}\n\t\tfor (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += (OPJ_INT32)(pi->dy - (OPJ_UINT32)(pi->y % (OPJ_INT32)pi->dy))) {\n\t\t\tfor (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += (OPJ_INT32)(pi->dx - (OPJ_UINT32)(pi->x % (OPJ_INT32)pi->dx))) {\n\t\t\t\tfor (pi->resno = pi->poc.resno0; pi->resno < opj_uint_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {\n\t\t\t\t\tOPJ_UINT32 levelno;\n\t\t\t\t\tOPJ_INT32 trx0, try0;\n\t\t\t\t\tOPJ_INT32 trx1, try1;\n\t\t\t\t\tOPJ_UINT32 rpx, rpy;\n\t\t\t\t\tOPJ_INT32 prci, prcj;\n\t\t\t\t\tres = &comp->resolutions[pi->resno];\n\t\t\t\t\tlevelno = comp->numresolutions - 1 - pi->resno;\n\t\t\t\t\ttrx0 = opj_int_ceildiv(pi->tx0, (OPJ_INT32)(comp->dx << levelno));\n\t\t\t\t\ttry0 = opj_int_ceildiv(pi->ty0, (OPJ_INT32)(comp->dy << levelno));\n\t\t\t\t\ttrx1 = opj_int_ceildiv(pi->tx1, (OPJ_INT32)(comp->dx << levelno));\n\t\t\t\t\ttry1 = opj_int_ceildiv(pi->ty1, (OPJ_INT32)(comp->dy << levelno));\n\t\t\t\t\trpx = res->pdx + levelno;\n\t\t\t\t\trpy = res->pdy + levelno;\n\t\t\t\t\tif (!((pi->y % (OPJ_INT32)(comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){\n\t\t\t\t\t\tcontinue;\t\n\t\t\t\t\t}\n\t\t\t\t\tif (!((pi->x % (OPJ_INT32)(comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif ((res->pw==0)||(res->ph==0)) continue;\n\t\t\t\t\t\n\t\t\t\t\tif ((trx0==trx1)||(try0==try1)) continue;\n\t\t\t\t\t\n\t\t\t\t\tprci = opj_int_floordivpow2(opj_int_ceildiv(pi->x, (OPJ_INT32)(comp->dx << levelno)), (OPJ_INT32)res->pdx)\n\t\t\t\t\t\t - opj_int_floordivpow2(trx0, (OPJ_INT32)res->pdx);\n\t\t\t\t\tprcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y, (OPJ_INT32)(comp->dy << levelno)), (OPJ_INT32)res->pdy)\n\t\t\t\t\t\t - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);\n\t\t\t\t\tpi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);\n\t\t\t\t\tfor (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {\n\t\t\t\t\t\tindex = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;\n\t\t\t\t\t\tif (!pi->include[index]) {\n\t\t\t\t\t\t\tpi->include[index] = 1;\n\t\t\t\t\t\t\treturn OPJ_TRUE;\n\t\t\t\t\t\t}\nLABEL_SKIP:;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn OPJ_FALSE;\n}\n\nvoid opj_get_encoding_parameters(\tconst opj_image_t *p_image,\n                                    const opj_cp_t *p_cp,\n                                    OPJ_UINT32 p_tileno,\n                                    OPJ_INT32 * p_tx0,\n                                    OPJ_INT32  * p_tx1,\n                                    OPJ_INT32  * p_ty0,\n                                    OPJ_INT32  * p_ty1,\n                                    OPJ_UINT32 * p_dx_min,\n                                    OPJ_UINT32 * p_dy_min,\n                                    OPJ_UINT32 * p_max_prec,\n                                    OPJ_UINT32 * p_max_res )\n{\n\t/* loop */\n\tOPJ_UINT32  compno, resno;\n\t/* pointers */\n\tconst opj_tcp_t *l_tcp = 00;\n\tconst opj_tccp_t * l_tccp = 00;\n\tconst opj_image_comp_t * l_img_comp = 00;\n\n\t/* position in x and y of tile */\n\tOPJ_UINT32 p, q;\n\n\t/* preconditions */\n\tassert(p_cp != 00);\n\tassert(p_image != 00);\n\tassert(p_tileno < p_cp->tw * p_cp->th);\n\n\t/* initializations */\n\tl_tcp = &p_cp->tcps [p_tileno];\n\tl_img_comp = p_image->comps;\n\tl_tccp = l_tcp->tccps;\n\n\t/* here calculation of tx0, tx1, ty0, ty1, maxprec, dx and dy */\n\tp = p_tileno % p_cp->tw;\n\tq = p_tileno / p_cp->tw;\n\n\t/* find extent of tile */\n\t*p_tx0 = opj_int_max((OPJ_INT32)(p_cp->tx0 + p * p_cp->tdx), (OPJ_INT32)p_image->x0);\n\t*p_tx1 = opj_int_min((OPJ_INT32)(p_cp->tx0 + (p + 1) * p_cp->tdx), (OPJ_INT32)p_image->x1);\n\t*p_ty0 = opj_int_max((OPJ_INT32)(p_cp->ty0 + q * p_cp->tdy), (OPJ_INT32)p_image->y0);\n\t*p_ty1 = opj_int_min((OPJ_INT32)(p_cp->ty0 + (q + 1) * p_cp->tdy), (OPJ_INT32)p_image->y1);\n\n\t/* max precision is 0 (can only grow) */\n\t*p_max_prec = 0;\n\t*p_max_res = 0;\n\n\t/* take the largest value for dx_min and dy_min */\n\t*p_dx_min = 0x7fffffff;\n\t*p_dy_min  = 0x7fffffff;\n\n\tfor (compno = 0; compno < p_image->numcomps; ++compno) {\n\t\t/* arithmetic variables to calculate */\n\t\tOPJ_UINT32 l_level_no;\n\t\tOPJ_INT32 l_rx0, l_ry0, l_rx1, l_ry1;\n\t\tOPJ_INT32 l_px0, l_py0, l_px1, py1;\n\t\tOPJ_UINT32 l_pdx, l_pdy;\n\t\tOPJ_UINT32 l_pw, l_ph;\n\t\tOPJ_UINT32 l_product;\n\t\tOPJ_INT32 l_tcx0, l_tcy0, l_tcx1, l_tcy1;\n\n\t\tl_tcx0 = opj_int_ceildiv(*p_tx0, (OPJ_INT32)l_img_comp->dx);\n\t\tl_tcy0 = opj_int_ceildiv(*p_ty0, (OPJ_INT32)l_img_comp->dy);\n\t\tl_tcx1 = opj_int_ceildiv(*p_tx1, (OPJ_INT32)l_img_comp->dx);\n\t\tl_tcy1 = opj_int_ceildiv(*p_ty1, (OPJ_INT32)l_img_comp->dy);\n\n\t\tif (l_tccp->numresolutions > *p_max_res) {\n\t\t\t*p_max_res = l_tccp->numresolutions;\n\t\t}\n\n\t\t/* use custom size for precincts */\n\t\tfor (resno = 0; resno < l_tccp->numresolutions; ++resno) {\n\t\t\tOPJ_UINT32 l_dx, l_dy;\n\n\t\t\t/* precinct width and height */\n\t\t\tl_pdx = l_tccp->prcw[resno];\n\t\t\tl_pdy = l_tccp->prch[resno];\n\n\t\t\tl_dx = l_img_comp->dx * (1u << (l_pdx + l_tccp->numresolutions - 1 - resno));\n\t\t\tl_dy = l_img_comp->dy * (1u << (l_pdy + l_tccp->numresolutions - 1 - resno));\n\n\t\t\t/* take the minimum size for dx for each comp and resolution */\n\t\t\t*p_dx_min = opj_uint_min(*p_dx_min, l_dx);\n\t\t\t*p_dy_min = opj_uint_min(*p_dy_min, l_dy);\n\n\t\t\t/* various calculations of extents */\n\t\t\tl_level_no = l_tccp->numresolutions - 1 - resno;\n\n\t\t\tl_rx0 = opj_int_ceildivpow2(l_tcx0, (OPJ_INT32)l_level_no);\n\t\t\tl_ry0 = opj_int_ceildivpow2(l_tcy0, (OPJ_INT32)l_level_no);\n\t\t\tl_rx1 = opj_int_ceildivpow2(l_tcx1, (OPJ_INT32)l_level_no);\n\t\t\tl_ry1 = opj_int_ceildivpow2(l_tcy1, (OPJ_INT32)l_level_no);\n\n\t\t\tl_px0 = opj_int_floordivpow2(l_rx0, (OPJ_INT32)l_pdx) << l_pdx;\n\t\t\tl_py0 = opj_int_floordivpow2(l_ry0, (OPJ_INT32)l_pdy) << l_pdy;\n\t\t\tl_px1 = opj_int_ceildivpow2(l_rx1, (OPJ_INT32)l_pdx) << l_pdx;\n\n\t\t\tpy1 = opj_int_ceildivpow2(l_ry1, (OPJ_INT32)l_pdy) << l_pdy;\n\n\t\t\tl_pw = (l_rx0==l_rx1)?0:(OPJ_UINT32)((l_px1 - l_px0) >> l_pdx);\n\t\t\tl_ph = (l_ry0==l_ry1)?0:(OPJ_UINT32)((py1 - l_py0) >> l_pdy);\n\n\t\t\tl_product = l_pw * l_ph;\n\n\t\t\t/* update precision */\n\t\t\tif (l_product > *p_max_prec) {\n\t\t\t\t*p_max_prec = l_product;\n\t\t\t}\n\t\t}\n\t\t++l_img_comp;\n\t\t++l_tccp;\n\t}\n}\n\n\nvoid opj_get_all_encoding_parameters(   const opj_image_t *p_image,\n                                        const opj_cp_t *p_cp,\n                                        OPJ_UINT32 tileno,\n                                        OPJ_INT32 * p_tx0,\n                                        OPJ_INT32 * p_tx1,\n                                        OPJ_INT32 * p_ty0,\n                                        OPJ_INT32 * p_ty1,\n                                        OPJ_UINT32 * p_dx_min,\n                                        OPJ_UINT32 * p_dy_min,\n                                        OPJ_UINT32 * p_max_prec,\n                                        OPJ_UINT32 * p_max_res,\n                                        OPJ_UINT32 ** p_resolutions )\n{\n\t/* loop*/\n\tOPJ_UINT32 compno, resno;\n\n\t/* pointers*/\n\tconst opj_tcp_t *tcp = 00;\n\tconst opj_tccp_t * l_tccp = 00;\n\tconst opj_image_comp_t * l_img_comp = 00;\n\n\t/* to store l_dx, l_dy, w and h for each resolution and component.*/\n\tOPJ_UINT32 * lResolutionPtr;\n\n\t/* position in x and y of tile*/\n\tOPJ_UINT32 p, q;\n\n\t/* preconditions in debug*/\n\tassert(p_cp != 00);\n\tassert(p_image != 00);\n\tassert(tileno < p_cp->tw * p_cp->th);\n\n\t/* initializations*/\n\ttcp = &p_cp->tcps [tileno];\n\tl_tccp = tcp->tccps;\n\tl_img_comp = p_image->comps;\n\n\t/* position in x and y of tile*/\n\tp = tileno % p_cp->tw;\n\tq = tileno / p_cp->tw;\n\n\t/* here calculation of tx0, tx1, ty0, ty1, maxprec, l_dx and l_dy */\n\t*p_tx0 = opj_int_max((OPJ_INT32)(p_cp->tx0 + p * p_cp->tdx), (OPJ_INT32)p_image->x0);\n\t*p_tx1 = opj_int_min((OPJ_INT32)(p_cp->tx0 + (p + 1) * p_cp->tdx), (OPJ_INT32)p_image->x1);\n\t*p_ty0 = opj_int_max((OPJ_INT32)(p_cp->ty0 + q * p_cp->tdy), (OPJ_INT32)p_image->y0);\n\t*p_ty1 = opj_int_min((OPJ_INT32)(p_cp->ty0 + (q + 1) * p_cp->tdy), (OPJ_INT32)p_image->y1);\n\n\t/* max precision and resolution is 0 (can only grow)*/\n\t*p_max_prec = 0;\n\t*p_max_res = 0;\n\n\t/* take the largest value for dx_min and dy_min*/\n\t*p_dx_min = 0x7fffffff;\n\t*p_dy_min = 0x7fffffff;\n\n\tfor (compno = 0; compno < p_image->numcomps; ++compno) {\n\t\t/* aritmetic variables to calculate*/\n\t\tOPJ_UINT32 l_level_no;\n\t\tOPJ_INT32 l_rx0, l_ry0, l_rx1, l_ry1;\n\t\tOPJ_INT32 l_px0, l_py0, l_px1, py1;\n\t\tOPJ_UINT32 l_product;\n\t\tOPJ_INT32 l_tcx0, l_tcy0, l_tcx1, l_tcy1;\n\t\tOPJ_UINT32 l_pdx, l_pdy , l_pw , l_ph;\n\n\t\tlResolutionPtr = p_resolutions[compno];\n\n\t\tl_tcx0 = opj_int_ceildiv(*p_tx0, (OPJ_INT32)l_img_comp->dx);\n\t\tl_tcy0 = opj_int_ceildiv(*p_ty0, (OPJ_INT32)l_img_comp->dy);\n\t\tl_tcx1 = opj_int_ceildiv(*p_tx1, (OPJ_INT32)l_img_comp->dx);\n\t\tl_tcy1 = opj_int_ceildiv(*p_ty1, (OPJ_INT32)l_img_comp->dy);\n\n\t\tif (l_tccp->numresolutions > *p_max_res) {\n\t\t\t*p_max_res = l_tccp->numresolutions;\n\t\t}\n\n\t\t/* use custom size for precincts*/\n\t\tl_level_no = l_tccp->numresolutions - 1;\n\t\tfor (resno = 0; resno < l_tccp->numresolutions; ++resno) {\n\t\t\tOPJ_UINT32 l_dx, l_dy;\n\n\t\t\t/* precinct width and height*/\n\t\t\tl_pdx = l_tccp->prcw[resno];\n\t\t\tl_pdy = l_tccp->prch[resno];\n\t\t\t*lResolutionPtr++ = l_pdx;\n\t\t\t*lResolutionPtr++ = l_pdy;\n\t\t\tl_dx = l_img_comp->dx * (1u << (l_pdx + l_level_no));\n\t\t\tl_dy = l_img_comp->dy * (1u << (l_pdy + l_level_no));\n\t\t\t/* take the minimum size for l_dx for each comp and resolution*/\n\t\t\t*p_dx_min = (OPJ_UINT32)opj_int_min((OPJ_INT32)*p_dx_min, (OPJ_INT32)l_dx);\n\t\t\t*p_dy_min = (OPJ_UINT32)opj_int_min((OPJ_INT32)*p_dy_min, (OPJ_INT32)l_dy);\n\n\t\t\t/* various calculations of extents*/\n\t\t\tl_rx0 = opj_int_ceildivpow2(l_tcx0, (OPJ_INT32)l_level_no);\n\t\t\tl_ry0 = opj_int_ceildivpow2(l_tcy0, (OPJ_INT32)l_level_no);\n\t\t\tl_rx1 = opj_int_ceildivpow2(l_tcx1, (OPJ_INT32)l_level_no);\n\t\t\tl_ry1 = opj_int_ceildivpow2(l_tcy1, (OPJ_INT32)l_level_no);\n\t\t\tl_px0 = opj_int_floordivpow2(l_rx0, (OPJ_INT32)l_pdx) << l_pdx;\n\t\t\tl_py0 = opj_int_floordivpow2(l_ry0, (OPJ_INT32)l_pdy) << l_pdy;\n\t\t\tl_px1 = opj_int_ceildivpow2(l_rx1, (OPJ_INT32)l_pdx) << l_pdx;\n\t\t\tpy1 = opj_int_ceildivpow2(l_ry1, (OPJ_INT32)l_pdy) << l_pdy;\n\t\t\tl_pw = (l_rx0==l_rx1)?0:(OPJ_UINT32)((l_px1 - l_px0) >> l_pdx);\n\t\t\tl_ph = (l_ry0==l_ry1)?0:(OPJ_UINT32)((py1 - l_py0) >> l_pdy);\n\t\t\t*lResolutionPtr++ = l_pw;\n\t\t\t*lResolutionPtr++ = l_ph;\n\t\t\tl_product = l_pw * l_ph;\n\t\t\t\n            /* update precision*/\n\t\t\tif (l_product > *p_max_prec) {\n\t\t\t\t*p_max_prec = l_product;\n\t\t\t}\n\n\t\t\t--l_level_no;\n\t\t}\n\t\t++l_tccp;\n\t\t++l_img_comp;\n\t}\n}\n\nopj_pi_iterator_t * opj_pi_create(\tconst opj_image_t *image,\n                                    const opj_cp_t *cp,\n                                    OPJ_UINT32 tileno )\n{\n\t/* loop*/\n\tOPJ_UINT32 pino, compno;\n\t/* number of poc in the p_pi*/\n\tOPJ_UINT32 l_poc_bound;\n\n\t/* pointers to tile coding parameters and components.*/\n\topj_pi_iterator_t *l_pi = 00;\n\topj_tcp_t *tcp = 00;\n\tconst opj_tccp_t *tccp = 00;\n\n\t/* current packet iterator being allocated*/\n\topj_pi_iterator_t *l_current_pi = 00;\n\n\t/* preconditions in debug*/\n\tassert(cp != 00);\n\tassert(image != 00);\n\tassert(tileno < cp->tw * cp->th);\n\n\t/* initializations*/\n\ttcp = &cp->tcps[tileno];\n\tl_poc_bound = tcp->numpocs+1;\n\n\t/* memory allocations*/\n\tl_pi = (opj_pi_iterator_t*) opj_calloc((l_poc_bound), sizeof(opj_pi_iterator_t));\n\tif (!l_pi) {\n\t\treturn NULL;\n\t}\n\tmemset(l_pi,0,l_poc_bound * sizeof(opj_pi_iterator_t));\n\n\tl_current_pi = l_pi;\n\tfor (pino = 0; pino < l_poc_bound ; ++pino) {\n\n\t\tl_current_pi->comps = (opj_pi_comp_t*) opj_calloc(image->numcomps, sizeof(opj_pi_comp_t));\n\t\tif (! l_current_pi->comps) {\n\t\t\topj_pi_destroy(l_pi, l_poc_bound);\n\t\t\treturn NULL;\n\t\t}\n\n\t\tl_current_pi->numcomps = image->numcomps;\n\t\tmemset(l_current_pi->comps,0,image->numcomps * sizeof(opj_pi_comp_t));\n\n\t\tfor (compno = 0; compno < image->numcomps; ++compno) {\n\t\t\topj_pi_comp_t *comp = &l_current_pi->comps[compno];\n\n\t\t\ttccp = &tcp->tccps[compno];\n\n\t\t\tcomp->resolutions = (opj_pi_resolution_t*) opj_malloc(tccp->numresolutions * sizeof(opj_pi_resolution_t));\n\t\t\tif (!comp->resolutions) {\n\t\t\t\topj_pi_destroy(l_pi, l_poc_bound);\n\t\t\t\treturn 00;\n\t\t\t}\n\n\t\t\tcomp->numresolutions = tccp->numresolutions;\n\t\t\tmemset(comp->resolutions,0,tccp->numresolutions * sizeof(opj_pi_resolution_t));\n\t\t}\n\t\t++l_current_pi;\n\t}\n\treturn l_pi;\n}\n\nvoid opj_pi_update_encode_poc_and_final (   opj_cp_t *p_cp,\n                                            OPJ_UINT32 p_tileno,\n                                            OPJ_INT32 p_tx0,\n                                            OPJ_INT32 p_tx1,\n                                            OPJ_INT32 p_ty0,\n                                            OPJ_INT32 p_ty1,\n                                            OPJ_UINT32 p_max_prec,\n                                            OPJ_UINT32 p_max_res,\n                                            OPJ_UINT32 p_dx_min,\n                                            OPJ_UINT32 p_dy_min)\n{\n\t/* loop*/\n\tOPJ_UINT32 pino;\n\t/* tile coding parameter*/\n\topj_tcp_t *l_tcp = 00;\n\t/* current poc being updated*/\n\topj_poc_t * l_current_poc = 00;\n\n\t/* number of pocs*/\n\tOPJ_UINT32 l_poc_bound;\n\n    OPJ_ARG_NOT_USED(p_max_res);\n\n\t/* preconditions in debug*/\n\tassert(p_cp != 00);\n\tassert(p_tileno < p_cp->tw * p_cp->th);\n\n\t/* initializations*/\n\tl_tcp = &p_cp->tcps [p_tileno];\n\t/* number of iterations in the loop */\n\tl_poc_bound = l_tcp->numpocs+1;\n\n\t/* start at first element, and to make sure the compiler will not make a calculation each time in the loop\n\t   store a pointer to the current element to modify rather than l_tcp->pocs[i]*/\n\tl_current_poc = l_tcp->pocs;\n\n\tl_current_poc->compS = l_current_poc->compno0;\n\tl_current_poc->compE = l_current_poc->compno1;\n\tl_current_poc->resS = l_current_poc->resno0;\n\tl_current_poc->resE = l_current_poc->resno1;\n\tl_current_poc->layE = l_current_poc->layno1;\n\n\t/* special treatment for the first element*/\n\tl_current_poc->layS = 0;\n\tl_current_poc->prg  = l_current_poc->prg1;\n\tl_current_poc->prcS = 0;\n\n\tl_current_poc->prcE = p_max_prec;\n\tl_current_poc->txS = (OPJ_UINT32)p_tx0;\n\tl_current_poc->txE = (OPJ_UINT32)p_tx1;\n\tl_current_poc->tyS = (OPJ_UINT32)p_ty0;\n\tl_current_poc->tyE = (OPJ_UINT32)p_ty1;\n\tl_current_poc->dx = p_dx_min;\n\tl_current_poc->dy = p_dy_min;\n\n\t++ l_current_poc;\n\tfor (pino = 1;pino < l_poc_bound ; ++pino) {\n\t\tl_current_poc->compS = l_current_poc->compno0;\n\t\tl_current_poc->compE= l_current_poc->compno1;\n\t\tl_current_poc->resS = l_current_poc->resno0;\n\t\tl_current_poc->resE = l_current_poc->resno1;\n\t\tl_current_poc->layE = l_current_poc->layno1;\n\t\tl_current_poc->prg  = l_current_poc->prg1;\n\t\tl_current_poc->prcS = 0;\n\t\t/* special treatment here different from the first element*/\n\t\tl_current_poc->layS = (l_current_poc->layE > (l_current_poc-1)->layE) ? l_current_poc->layE : 0;\n\n\t\tl_current_poc->prcE = p_max_prec;\n\t\tl_current_poc->txS = (OPJ_UINT32)p_tx0;\n\t\tl_current_poc->txE = (OPJ_UINT32)p_tx1;\n\t\tl_current_poc->tyS = (OPJ_UINT32)p_ty0;\n\t\tl_current_poc->tyE = (OPJ_UINT32)p_ty1;\n\t\tl_current_poc->dx = p_dx_min;\n\t\tl_current_poc->dy = p_dy_min;\n\t\t++ l_current_poc;\n\t}\n}\n\nvoid opj_pi_update_encode_not_poc (\topj_cp_t *p_cp,\n                                    OPJ_UINT32 p_num_comps,\n                                    OPJ_UINT32 p_tileno,\n                                    OPJ_INT32 p_tx0,\n                                    OPJ_INT32 p_tx1,\n                                    OPJ_INT32 p_ty0,\n                                    OPJ_INT32 p_ty1,\n                                    OPJ_UINT32 p_max_prec,\n                                    OPJ_UINT32 p_max_res,\n                                    OPJ_UINT32 p_dx_min,\n                                    OPJ_UINT32 p_dy_min)\n{\n\t/* loop*/\n\tOPJ_UINT32 pino;\n\t/* tile coding parameter*/\n\topj_tcp_t *l_tcp = 00;\n\t/* current poc being updated*/\n\topj_poc_t * l_current_poc = 00;\n\t/* number of pocs*/\n\tOPJ_UINT32 l_poc_bound;\n\n\t/* preconditions in debug*/\n\tassert(p_cp != 00);\n\tassert(p_tileno < p_cp->tw * p_cp->th);\n\n\t/* initializations*/\n\tl_tcp = &p_cp->tcps [p_tileno];\n\n\t/* number of iterations in the loop */\n\tl_poc_bound = l_tcp->numpocs+1;\n\n\t/* start at first element, and to make sure the compiler will not make a calculation each time in the loop\n\t   store a pointer to the current element to modify rather than l_tcp->pocs[i]*/\n\tl_current_poc = l_tcp->pocs;\n\n\tfor (pino = 0; pino < l_poc_bound ; ++pino) {\n\t\tl_current_poc->compS = 0;\n\t\tl_current_poc->compE = p_num_comps;/*p_image->numcomps;*/\n\t\tl_current_poc->resS = 0;\n\t\tl_current_poc->resE = p_max_res;\n\t\tl_current_poc->layS = 0;\n\t\tl_current_poc->layE = l_tcp->numlayers;\n\t\tl_current_poc->prg  = l_tcp->prg;\n\t\tl_current_poc->prcS = 0;\n\t\tl_current_poc->prcE = p_max_prec;\n\t\tl_current_poc->txS = (OPJ_UINT32)p_tx0;\n\t\tl_current_poc->txE = (OPJ_UINT32)p_tx1;\n\t\tl_current_poc->tyS = (OPJ_UINT32)p_ty0;\n\t\tl_current_poc->tyE = (OPJ_UINT32)p_ty1;\n\t\tl_current_poc->dx = p_dx_min;\n\t\tl_current_poc->dy = p_dy_min;\n\t\t++ l_current_poc;\n\t}\n}\n\nvoid opj_pi_update_decode_poc (opj_pi_iterator_t * p_pi,\n                               opj_tcp_t * p_tcp,\n                               OPJ_UINT32 p_max_precision,\n                               OPJ_UINT32 p_max_res)\n{\n\t/* loop*/\n\tOPJ_UINT32 pino;\n\n\t/* encoding prameters to set*/\n\tOPJ_UINT32 l_bound;\n\n\topj_pi_iterator_t * l_current_pi = 00;\n\topj_poc_t* l_current_poc = 0;\n\n    OPJ_ARG_NOT_USED(p_max_res);\n\n\t/* preconditions in debug*/\n\tassert(p_pi != 00);\n\tassert(p_tcp != 00);\n\n\t/* initializations*/\n\tl_bound = p_tcp->numpocs+1;\n\tl_current_pi = p_pi;\n\tl_current_poc = p_tcp->pocs;\n\n\tfor\t(pino = 0;pino<l_bound;++pino) {\n\t\tl_current_pi->poc.prg = l_current_poc->prg; /* Progression Order #0 */\n\t\tl_current_pi->first = 1;\n\n\t\tl_current_pi->poc.resno0 = l_current_poc->resno0; /* Resolution Level Index #0 (Start) */\n\t\tl_current_pi->poc.compno0 = l_current_poc->compno0; /* Component Index #0 (Start) */\n\t\tl_current_pi->poc.layno0 = 0;\n\t\tl_current_pi->poc.precno0 = 0;\n\t\tl_current_pi->poc.resno1 = l_current_poc->resno1; /* Resolution Level Index #0 (End) */\n\t\tl_current_pi->poc.compno1 = l_current_poc->compno1; /* Component Index #0 (End) */\n\t\tl_current_pi->poc.layno1 = l_current_poc->layno1; /* Layer Index #0 (End) */\n\t\tl_current_pi->poc.precno1 = p_max_precision;\n\t\t++l_current_pi;\n\t\t++l_current_poc;\n\t}\n}\n\nvoid opj_pi_update_decode_not_poc (opj_pi_iterator_t * p_pi,\n                                   opj_tcp_t * p_tcp,\n                                   OPJ_UINT32 p_max_precision,\n                                   OPJ_UINT32 p_max_res)\n{\n\t/* loop*/\n\tOPJ_UINT32 pino;\n\n\t/* encoding prameters to set*/\n\tOPJ_UINT32 l_bound;\n\n\topj_pi_iterator_t * l_current_pi = 00;\n\t/* preconditions in debug*/\n\tassert(p_tcp != 00);\n\tassert(p_pi != 00);\n\n\t/* initializations*/\n\tl_bound = p_tcp->numpocs+1;\n\tl_current_pi = p_pi;\n\n\tfor (pino = 0;pino<l_bound;++pino) {\n\t\tl_current_pi->poc.prg = p_tcp->prg;\n\t\tl_current_pi->first = 1;\n\t\tl_current_pi->poc.resno0 = 0;\n\t\tl_current_pi->poc.compno0 = 0;\n\t\tl_current_pi->poc.layno0 = 0;\n\t\tl_current_pi->poc.precno0 = 0;\n\t\tl_current_pi->poc.resno1 = p_max_res;\n\t\tl_current_pi->poc.compno1 = l_current_pi->numcomps;\n\t\tl_current_pi->poc.layno1 = p_tcp->numlayers;\n\t\tl_current_pi->poc.precno1 = p_max_precision;\n\t\t++l_current_pi;\n\t}\n}\n\n\n\nOPJ_BOOL opj_pi_check_next_level(\tOPJ_INT32 pos,\n\t\t\t\t\t\t\t\topj_cp_t *cp,\n\t\t\t\t\t\t\t\tOPJ_UINT32 tileno,\n\t\t\t\t\t\t\t\tOPJ_UINT32 pino,\n\t\t\t\t\t\t\t\tconst OPJ_CHAR *prog)\n{\n\tOPJ_INT32 i;\n\topj_tcp_t *tcps =&cp->tcps[tileno];\n\topj_poc_t *tcp = &tcps->pocs[pino];\n\n\tif(pos>=0){\n\t\tfor(i=pos;pos>=0;i--){\n\t\t\tswitch(prog[i]){\n\t\t    case 'R':\n\t\t\t    if(tcp->res_t==tcp->resE){\n\t\t\t\t    if(opj_pi_check_next_level(pos-1,cp,tileno,pino,prog)){\n\t\t\t\t\t    return OPJ_TRUE;\n\t\t\t\t    }else{\n\t\t\t\t\t    return OPJ_FALSE;\n\t\t\t\t    }\n\t\t\t    }else{\n\t\t\t\t    return OPJ_TRUE;\n\t\t\t    }\n\t\t\t    break;\n\t\t    case 'C':\n\t\t\t    if(tcp->comp_t==tcp->compE){\n\t\t\t\t    if(opj_pi_check_next_level(pos-1,cp,tileno,pino,prog)){\n\t\t\t\t\t    return OPJ_TRUE;\n\t\t\t\t    }else{\n\t\t\t\t\t    return OPJ_FALSE;\n\t\t\t\t    }\n\t\t\t    }else{\n\t\t\t\t    return OPJ_TRUE;\n\t\t\t    }\n\t\t\t    break;\n\t\t    case 'L':\n\t\t\t    if(tcp->lay_t==tcp->layE){\n\t\t\t\t    if(opj_pi_check_next_level(pos-1,cp,tileno,pino,prog)){\n\t\t\t\t\t    return OPJ_TRUE;\n\t\t\t\t    }else{\n\t\t\t\t\t    return OPJ_FALSE;\n\t\t\t\t    }\n\t\t\t    }else{\n\t\t\t\t    return OPJ_TRUE;\n\t\t\t    }\n\t\t\t    break;\n\t\t    case 'P':\n\t\t\t    switch(tcp->prg){\n\t\t\t\t    case OPJ_LRCP||OPJ_RLCP:\n\t\t\t\t\t    if(tcp->prc_t == tcp->prcE){\n\t\t\t\t\t\t    if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){\n\t\t\t\t\t\t\t    return OPJ_TRUE;\n\t\t\t\t\t\t    }else{\n\t\t\t\t\t\t\t    return OPJ_FALSE;\n\t\t\t\t\t\t    }\n\t\t\t\t\t    }else{\n\t\t\t\t\t\t    return OPJ_TRUE;\n\t\t\t\t\t    }\n\t\t\t\t\t    break;\n\t\t\t    default:\n\t\t\t\t    if(tcp->tx0_t == tcp->txE){\n\t\t\t\t\t    /*TY*/\n\t\t\t\t\t    if(tcp->ty0_t == tcp->tyE){\n\t\t\t\t\t\t    if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){\n\t\t\t\t\t\t\t    return OPJ_TRUE;\n\t\t\t\t\t\t    }else{\n\t\t\t\t\t\t\t    return OPJ_FALSE;\n\t\t\t\t\t\t    }\n\t\t\t\t\t    }else{\n\t\t\t\t\t\t    return OPJ_TRUE;\n\t\t\t\t\t    }/*TY*/\n\t\t\t\t    }else{\n\t\t\t\t\t    return OPJ_TRUE;\n\t\t\t\t    }\n\t\t\t\t    break;\n\t\t\t    }/*end case P*/\n\t\t    }/*end switch*/\n\t\t}/*end for*/\n\t}/*end if*/\n\treturn OPJ_FALSE;\n}\n\n\n/*\n==========================================================\n   Packet iterator interface\n==========================================================\n*/\nopj_pi_iterator_t *opj_pi_create_decode(opj_image_t *p_image,\n\t\t\t\t\t\t\t\t\t\topj_cp_t *p_cp,\n\t\t\t\t\t\t\t\t\t\tOPJ_UINT32 p_tile_no)\n{\n\t/* loop */\n\tOPJ_UINT32 pino;\n\tOPJ_UINT32 compno, resno;\n\n\t/* to store w, h, dx and dy fro all components and resolutions */\n\tOPJ_UINT32 * l_tmp_data;\n\tOPJ_UINT32 ** l_tmp_ptr;\n\n\t/* encoding prameters to set */\n\tOPJ_UINT32 l_max_res;\n\tOPJ_UINT32 l_max_prec;\n\tOPJ_INT32 l_tx0,l_tx1,l_ty0,l_ty1;\n\tOPJ_UINT32 l_dx_min,l_dy_min;\n\tOPJ_UINT32 l_bound;\n\tOPJ_UINT32 l_step_p , l_step_c , l_step_r , l_step_l ;\n\tOPJ_UINT32 l_data_stride;\n\n\t/* pointers */\n\topj_pi_iterator_t *l_pi = 00;\n\topj_tcp_t *l_tcp = 00;\n\tconst opj_tccp_t *l_tccp = 00;\n\topj_pi_comp_t *l_current_comp = 00;\n\topj_image_comp_t * l_img_comp = 00;\n\topj_pi_iterator_t * l_current_pi = 00;\n\tOPJ_UINT32 * l_encoding_value_ptr = 00;\n\n\t/* preconditions in debug */\n\tassert(p_cp != 00);\n\tassert(p_image != 00);\n\tassert(p_tile_no < p_cp->tw * p_cp->th);\n\n\t/* initializations */\n\tl_tcp = &p_cp->tcps[p_tile_no];\n\tl_bound = l_tcp->numpocs+1;\n\n\tl_data_stride = 4 * OPJ_J2K_MAXRLVLS;\n\tl_tmp_data = (OPJ_UINT32*)opj_malloc(\n\t\tl_data_stride * p_image->numcomps * sizeof(OPJ_UINT32));\n\tif\n\t\t(! l_tmp_data)\n\t{\n\t\treturn 00;\n\t}\n\tl_tmp_ptr = (OPJ_UINT32**)opj_malloc(\n\t\tp_image->numcomps * sizeof(OPJ_UINT32 *));\n\tif\n\t\t(! l_tmp_ptr)\n\t{\n\t\topj_free(l_tmp_data);\n\t\treturn 00;\n\t}\n\n\t/* memory allocation for pi */\n\tl_pi = opj_pi_create(p_image, p_cp, p_tile_no);\n\tif (!l_pi) {\n\t\topj_free(l_tmp_data);\n\t\topj_free(l_tmp_ptr);\n\t\treturn 00;\n\t}\n\n\tl_encoding_value_ptr = l_tmp_data;\n\t/* update pointer array */\n\tfor\n\t\t(compno = 0; compno < p_image->numcomps; ++compno)\n\t{\n\t\tl_tmp_ptr[compno] = l_encoding_value_ptr;\n\t\tl_encoding_value_ptr += l_data_stride;\n\t}\n\t/* get encoding parameters */\n\topj_get_all_encoding_parameters(p_image,p_cp,p_tile_no,&l_tx0,&l_tx1,&l_ty0,&l_ty1,&l_dx_min,&l_dy_min,&l_max_prec,&l_max_res,l_tmp_ptr);\n\n\t/* step calculations */\n\tl_step_p = 1;\n\tl_step_c = l_max_prec * l_step_p;\n\tl_step_r = p_image->numcomps * l_step_c;\n\tl_step_l = l_max_res * l_step_r;\n\n\t/* set values for first packet iterator */\n\tl_current_pi = l_pi;\n\n\t/* memory allocation for include */\n\tl_current_pi->include = (OPJ_INT16*) opj_calloc((l_tcp->numlayers +1) * l_step_l, sizeof(OPJ_INT16));\n\tif\n\t\t(!l_current_pi->include)\n\t{\n\t\topj_free(l_tmp_data);\n\t\topj_free(l_tmp_ptr);\n\t\topj_pi_destroy(l_pi, l_bound);\n\t\treturn 00;\n\t}\n\tmemset(l_current_pi->include,0, (l_tcp->numlayers + 1) * l_step_l* sizeof(OPJ_INT16));\n\n\t/* special treatment for the first packet iterator */\n\tl_current_comp = l_current_pi->comps;\n\tl_img_comp = p_image->comps;\n\tl_tccp = l_tcp->tccps;\n\n\tl_current_pi->tx0 = l_tx0;\n\tl_current_pi->ty0 = l_ty0;\n\tl_current_pi->tx1 = l_tx1;\n\tl_current_pi->ty1 = l_ty1;\n\n\t/*l_current_pi->dx = l_img_comp->dx;*/\n\t/*l_current_pi->dy = l_img_comp->dy;*/\n\n\tl_current_pi->step_p = l_step_p;\n\tl_current_pi->step_c = l_step_c;\n\tl_current_pi->step_r = l_step_r;\n\tl_current_pi->step_l = l_step_l;\n\n\t/* allocation for components and number of components has already been calculated by opj_pi_create */\n\tfor\n\t\t(compno = 0; compno < l_current_pi->numcomps; ++compno)\n\t{\n\t\topj_pi_resolution_t *l_res = l_current_comp->resolutions;\n\t\tl_encoding_value_ptr = l_tmp_ptr[compno];\n\n\t\tl_current_comp->dx = l_img_comp->dx;\n\t\tl_current_comp->dy = l_img_comp->dy;\n\t\t/* resolutions have already been initialized */\n\t\tfor\n\t\t\t(resno = 0; resno < l_current_comp->numresolutions; resno++)\n\t\t{\n\t\t\tl_res->pdx = *(l_encoding_value_ptr++);\n\t\t\tl_res->pdy = *(l_encoding_value_ptr++);\n\t\t\tl_res->pw =  *(l_encoding_value_ptr++);\n\t\t\tl_res->ph =  *(l_encoding_value_ptr++);\n\t\t\t++l_res;\n\t\t}\n\t\t++l_current_comp;\n\t\t++l_img_comp;\n\t\t++l_tccp;\n\t}\n\t++l_current_pi;\n\n\tfor (pino = 1 ; pino<l_bound ; ++pino )\n\t{\n\t\tl_current_comp = l_current_pi->comps;\n\t\tl_img_comp = p_image->comps;\n\t\tl_tccp = l_tcp->tccps;\n\n\t\tl_current_pi->tx0 = l_tx0;\n\t\tl_current_pi->ty0 = l_ty0;\n\t\tl_current_pi->tx1 = l_tx1;\n\t\tl_current_pi->ty1 = l_ty1;\n\t\t/*l_current_pi->dx = l_dx_min;*/\n\t\t/*l_current_pi->dy = l_dy_min;*/\n\t\tl_current_pi->step_p = l_step_p;\n\t\tl_current_pi->step_c = l_step_c;\n\t\tl_current_pi->step_r = l_step_r;\n\t\tl_current_pi->step_l = l_step_l;\n\n\t\t/* allocation for components and number of components has already been calculated by opj_pi_create */\n\t\tfor\n\t\t\t(compno = 0; compno < l_current_pi->numcomps; ++compno)\n\t\t{\n\t\t\topj_pi_resolution_t *l_res = l_current_comp->resolutions;\n\t\t\tl_encoding_value_ptr = l_tmp_ptr[compno];\n\n\t\t\tl_current_comp->dx = l_img_comp->dx;\n\t\t\tl_current_comp->dy = l_img_comp->dy;\n\t\t\t/* resolutions have already been initialized */\n\t\t\tfor\n\t\t\t\t(resno = 0; resno < l_current_comp->numresolutions; resno++)\n\t\t\t{\n\t\t\t\tl_res->pdx = *(l_encoding_value_ptr++);\n\t\t\t\tl_res->pdy = *(l_encoding_value_ptr++);\n\t\t\t\tl_res->pw =  *(l_encoding_value_ptr++);\n\t\t\t\tl_res->ph =  *(l_encoding_value_ptr++);\n\t\t\t\t++l_res;\n\t\t\t}\n\t\t\t++l_current_comp;\n\t\t\t++l_img_comp;\n\t\t\t++l_tccp;\n\t\t}\n\t\t/* special treatment*/\n\t\tl_current_pi->include = (l_current_pi-1)->include;\n\t\t++l_current_pi;\n\t}\n\topj_free(l_tmp_data);\n\tl_tmp_data = 00;\n\topj_free(l_tmp_ptr);\n\tl_tmp_ptr = 00;\n\tif\n\t\t(l_tcp->POC)\n\t{\n\t\topj_pi_update_decode_poc (l_pi,l_tcp,l_max_prec,l_max_res);\n\t}\n\telse\n\t{\n\t\topj_pi_update_decode_not_poc(l_pi,l_tcp,l_max_prec,l_max_res);\n\t}\n\treturn l_pi;\n}\n\n\n\nopj_pi_iterator_t *opj_pi_initialise_encode(const opj_image_t *p_image,\n                                            opj_cp_t *p_cp,\n                                            OPJ_UINT32 p_tile_no,\n                                            J2K_T2_MODE p_t2_mode )\n{\n\t/* loop*/\n\tOPJ_UINT32 pino;\n\tOPJ_UINT32 compno, resno;\n\n\t/* to store w, h, dx and dy fro all components and resolutions*/\n\tOPJ_UINT32 * l_tmp_data;\n\tOPJ_UINT32 ** l_tmp_ptr;\n\n\t/* encoding prameters to set*/\n\tOPJ_UINT32 l_max_res;\n\tOPJ_UINT32 l_max_prec;\n\tOPJ_INT32 l_tx0,l_tx1,l_ty0,l_ty1;\n\tOPJ_UINT32 l_dx_min,l_dy_min;\n\tOPJ_UINT32 l_bound;\n\tOPJ_UINT32 l_step_p , l_step_c , l_step_r , l_step_l ;\n\tOPJ_UINT32 l_data_stride;\n\n\t/* pointers*/\n\topj_pi_iterator_t *l_pi = 00;\n\topj_tcp_t *l_tcp = 00;\n\tconst opj_tccp_t *l_tccp = 00;\n\topj_pi_comp_t *l_current_comp = 00;\n\topj_image_comp_t * l_img_comp = 00;\n\topj_pi_iterator_t * l_current_pi = 00;\n\tOPJ_UINT32 * l_encoding_value_ptr = 00;\n\n\t/* preconditions in debug*/\n\tassert(p_cp != 00);\n\tassert(p_image != 00);\n\tassert(p_tile_no < p_cp->tw * p_cp->th);\n\n\t/* initializations*/\n\tl_tcp = &p_cp->tcps[p_tile_no];\n\tl_bound = l_tcp->numpocs+1;\n\n\tl_data_stride = 4 * OPJ_J2K_MAXRLVLS;\n\tl_tmp_data = (OPJ_UINT32*)opj_malloc(\n\t\tl_data_stride * p_image->numcomps * sizeof(OPJ_UINT32));\n\tif (! l_tmp_data) {\n\t\treturn 00;\n\t}\n\n\tl_tmp_ptr = (OPJ_UINT32**)opj_malloc(\n\t\tp_image->numcomps * sizeof(OPJ_UINT32 *));\n\tif (! l_tmp_ptr) {\n\t\topj_free(l_tmp_data);\n\t\treturn 00;\n\t}\n\n\t/* memory allocation for pi*/\n\tl_pi = opj_pi_create(p_image,p_cp,p_tile_no);\n\tif (!l_pi) {\n\t\topj_free(l_tmp_data);\n\t\topj_free(l_tmp_ptr);\n\t\treturn 00;\n\t}\n\n\tl_encoding_value_ptr = l_tmp_data;\n\t/* update pointer array*/\n\tfor (compno = 0; compno < p_image->numcomps; ++compno) {\n\t\tl_tmp_ptr[compno] = l_encoding_value_ptr;\n\t\tl_encoding_value_ptr += l_data_stride;\n\t}\n\n\t/* get encoding parameters*/\n\topj_get_all_encoding_parameters(p_image,p_cp,p_tile_no,&l_tx0,&l_tx1,&l_ty0,&l_ty1,&l_dx_min,&l_dy_min,&l_max_prec,&l_max_res,l_tmp_ptr);\n\n\t/* step calculations*/\n\tl_step_p = 1;\n\tl_step_c = l_max_prec * l_step_p;\n\tl_step_r = p_image->numcomps * l_step_c;\n\tl_step_l = l_max_res * l_step_r;\n\n\t/* set values for first packet iterator*/\n\tl_pi->tp_on = p_cp->m_specific_param.m_enc.m_tp_on;\n\tl_current_pi = l_pi;\n\n\t/* memory allocation for include*/\n\tl_current_pi->include = (OPJ_INT16*) opj_calloc(l_tcp->numlayers * l_step_l, sizeof(OPJ_INT16));\n\tif (!l_current_pi->include) {\n\t\topj_free(l_tmp_data);\n\t\topj_free(l_tmp_ptr);\n\t\topj_pi_destroy(l_pi, l_bound);\n\t\treturn 00;\n\t}\n\tmemset(l_current_pi->include,0,l_tcp->numlayers * l_step_l* sizeof(OPJ_INT16));\n\n\t/* special treatment for the first packet iterator*/\n\tl_current_comp = l_current_pi->comps;\n\tl_img_comp = p_image->comps;\n\tl_tccp = l_tcp->tccps;\n\tl_current_pi->tx0 = l_tx0;\n\tl_current_pi->ty0 = l_ty0;\n\tl_current_pi->tx1 = l_tx1;\n\tl_current_pi->ty1 = l_ty1;\n\tl_current_pi->dx = l_dx_min;\n\tl_current_pi->dy = l_dy_min;\n\tl_current_pi->step_p = l_step_p;\n\tl_current_pi->step_c = l_step_c;\n\tl_current_pi->step_r = l_step_r;\n\tl_current_pi->step_l = l_step_l;\n\n\t/* allocation for components and number of components has already been calculated by opj_pi_create */\n\tfor (compno = 0; compno < l_current_pi->numcomps; ++compno) {\n\t\topj_pi_resolution_t *l_res = l_current_comp->resolutions;\n\t\tl_encoding_value_ptr = l_tmp_ptr[compno];\n\n\t\tl_current_comp->dx = l_img_comp->dx;\n\t\tl_current_comp->dy = l_img_comp->dy;\n\n\t\t/* resolutions have already been initialized */\n\t\tfor (resno = 0; resno < l_current_comp->numresolutions; resno++) {\n\t\t\tl_res->pdx = *(l_encoding_value_ptr++);\n\t\t\tl_res->pdy = *(l_encoding_value_ptr++);\n\t\t\tl_res->pw =  *(l_encoding_value_ptr++);\n\t\t\tl_res->ph =  *(l_encoding_value_ptr++);\n\t\t\t++l_res;\n\t\t}\n\n\t\t++l_current_comp;\n\t\t++l_img_comp;\n\t\t++l_tccp;\n\t}\n\t++l_current_pi;\n\n\tfor (pino = 1 ; pino<l_bound ; ++pino ) {\n\t\tl_current_comp = l_current_pi->comps;\n\t\tl_img_comp = p_image->comps;\n\t\tl_tccp = l_tcp->tccps;\n\n\t\tl_current_pi->tx0 = l_tx0;\n\t\tl_current_pi->ty0 = l_ty0;\n\t\tl_current_pi->tx1 = l_tx1;\n\t\tl_current_pi->ty1 = l_ty1;\n\t\tl_current_pi->dx = l_dx_min;\n\t\tl_current_pi->dy = l_dy_min;\n\t\tl_current_pi->step_p = l_step_p;\n\t\tl_current_pi->step_c = l_step_c;\n\t\tl_current_pi->step_r = l_step_r;\n\t\tl_current_pi->step_l = l_step_l;\n\n\t\t/* allocation for components and number of components has already been calculated by opj_pi_create */\n\t\tfor (compno = 0; compno < l_current_pi->numcomps; ++compno) {\n\t\t\topj_pi_resolution_t *l_res = l_current_comp->resolutions;\n\t\t\tl_encoding_value_ptr = l_tmp_ptr[compno];\n\n\t\t\tl_current_comp->dx = l_img_comp->dx;\n\t\t\tl_current_comp->dy = l_img_comp->dy;\n\t\t\t/* resolutions have already been initialized */\n\t\t\tfor (resno = 0; resno < l_current_comp->numresolutions; resno++) {\n\t\t\t\tl_res->pdx = *(l_encoding_value_ptr++);\n\t\t\t\tl_res->pdy = *(l_encoding_value_ptr++);\n\t\t\t\tl_res->pw =  *(l_encoding_value_ptr++);\n\t\t\t\tl_res->ph =  *(l_encoding_value_ptr++);\n\t\t\t\t++l_res;\n\t\t\t}\n\t\t\t++l_current_comp;\n\t\t\t++l_img_comp;\n\t\t\t++l_tccp;\n\t\t}\n\n\t\t/* special treatment*/\n\t\tl_current_pi->include = (l_current_pi-1)->include;\n\t\t++l_current_pi;\n\t}\n\n\topj_free(l_tmp_data);\n\tl_tmp_data = 00;\n\topj_free(l_tmp_ptr);\n\tl_tmp_ptr = 00;\n\n\tif (l_tcp->POC && ( p_cp->m_specific_param.m_enc.m_cinema || p_t2_mode == FINAL_PASS)) {\n\t\topj_pi_update_encode_poc_and_final(p_cp,p_tile_no,l_tx0,l_tx1,l_ty0,l_ty1,l_max_prec,l_max_res,l_dx_min,l_dy_min);\n\t}\n\telse {\n\t\topj_pi_update_encode_not_poc(p_cp,p_image->numcomps,p_tile_no,l_tx0,l_tx1,l_ty0,l_ty1,l_max_prec,l_max_res,l_dx_min,l_dy_min);\n\t}\n\n\treturn l_pi;\n}\n\nvoid opj_pi_create_encode( \topj_pi_iterator_t *pi,\n\t\t\t\t\t\t\topj_cp_t *cp,\n\t\t\t\t\t\t\tOPJ_UINT32 tileno,\n\t\t\t\t\t\t\tOPJ_UINT32 pino,\n\t\t\t\t\t\t\tOPJ_UINT32 tpnum,\n\t\t\t\t\t\t\tOPJ_INT32 tppos,\n\t\t\t\t\t\t\tJ2K_T2_MODE t2_mode)\n{\n\tconst OPJ_CHAR *prog;\n\tOPJ_INT32 i;\n\tOPJ_UINT32 incr_top=1,resetX=0;\n\topj_tcp_t *tcps =&cp->tcps[tileno];\n\topj_poc_t *tcp= &tcps->pocs[pino];\n\n\tprog = opj_j2k_convert_progression_order(tcp->prg);\n\n\tpi[pino].first = 1;\n\tpi[pino].poc.prg = tcp->prg;\n\n\tif(!(cp->m_specific_param.m_enc.m_tp_on && ((!cp->m_specific_param.m_enc.m_cinema && (t2_mode == FINAL_PASS)) || cp->m_specific_param.m_enc.m_cinema))){\n\t\tpi[pino].poc.resno0 = tcp->resS;\n\t\tpi[pino].poc.resno1 = tcp->resE;\n\t\tpi[pino].poc.compno0 = tcp->compS;\n\t\tpi[pino].poc.compno1 = tcp->compE;\n\t\tpi[pino].poc.layno0 = tcp->layS;\n\t\tpi[pino].poc.layno1 = tcp->layE;\n\t\tpi[pino].poc.precno0 = tcp->prcS;\n\t\tpi[pino].poc.precno1 = tcp->prcE;\n\t\tpi[pino].poc.tx0 = (OPJ_INT32)tcp->txS;\n\t\tpi[pino].poc.ty0 = (OPJ_INT32)tcp->tyS;\n\t\tpi[pino].poc.tx1 = (OPJ_INT32)tcp->txE;\n\t\tpi[pino].poc.ty1 = (OPJ_INT32)tcp->tyE;\n\t}else {\n\t\tfor(i=tppos+1;i<4;i++){\n\t\t\tswitch(prog[i]){\n\t\t\tcase 'R':\n\t\t\t\tpi[pino].poc.resno0 = tcp->resS;\n\t\t\t\tpi[pino].poc.resno1 = tcp->resE;\n\t\t\t\tbreak;\n\t\t\tcase 'C':\n\t\t\t\tpi[pino].poc.compno0 = tcp->compS;\n\t\t\t\tpi[pino].poc.compno1 = tcp->compE;\n\t\t\t\tbreak;\n\t\t\tcase 'L':\n\t\t\t\tpi[pino].poc.layno0 = tcp->layS;\n\t\t\t\tpi[pino].poc.layno1 = tcp->layE;\n\t\t\t\tbreak;\n\t\t\tcase 'P':\n\t\t\t\tswitch(tcp->prg){\n\t\t\t\tcase OPJ_LRCP:\n\t\t\t\tcase OPJ_RLCP:\n\t\t\t\t\tpi[pino].poc.precno0 = tcp->prcS;\n\t\t\t\t\tpi[pino].poc.precno1 = tcp->prcE;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tpi[pino].poc.tx0 = (OPJ_INT32)tcp->txS;\n\t\t\t\t\tpi[pino].poc.ty0 = (OPJ_INT32)tcp->tyS;\n\t\t\t\t\tpi[pino].poc.tx1 = (OPJ_INT32)tcp->txE;\n\t\t\t\t\tpi[pino].poc.ty1 = (OPJ_INT32)tcp->tyE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif(tpnum==0){\n\t\t\tfor(i=tppos;i>=0;i--){\n\t\t\t\tswitch(prog[i]){\n\t\t\t\tcase 'C':\n\t\t\t\t\ttcp->comp_t = tcp->compS;\n\t\t\t\t\tpi[pino].poc.compno0 = tcp->comp_t;\n\t\t\t\t\tpi[pino].poc.compno1 = tcp->comp_t+1;\n\t\t\t\t\ttcp->comp_t+=1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'R':\n\t\t\t\t\ttcp->res_t = tcp->resS;\n\t\t\t\t\tpi[pino].poc.resno0 = tcp->res_t;\n\t\t\t\t\tpi[pino].poc.resno1 = tcp->res_t+1;\n\t\t\t\t\ttcp->res_t+=1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'L':\n\t\t\t\t\ttcp->lay_t = tcp->layS;\n\t\t\t\t\tpi[pino].poc.layno0 = tcp->lay_t;\n\t\t\t\t\tpi[pino].poc.layno1 = tcp->lay_t+1;\n\t\t\t\t\ttcp->lay_t+=1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'P':\n\t\t\t\t\tswitch(tcp->prg){\n\t\t\t\t\tcase OPJ_LRCP:\n\t\t\t\t\tcase OPJ_RLCP:\n\t\t\t\t\t\ttcp->prc_t = tcp->prcS;\n\t\t\t\t\t\tpi[pino].poc.precno0 = tcp->prc_t;\n\t\t\t\t\t\tpi[pino].poc.precno1 = tcp->prc_t+1;\n\t\t\t\t\t\ttcp->prc_t+=1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\ttcp->tx0_t = tcp->txS;\n\t\t\t\t\t\ttcp->ty0_t = tcp->tyS;\n\t\t\t\t\t\tpi[pino].poc.tx0 = (OPJ_INT32)tcp->tx0_t;\n\t\t\t\t\t\tpi[pino].poc.tx1 = (OPJ_INT32)(tcp->tx0_t + tcp->dx - (tcp->tx0_t % tcp->dx));\n\t\t\t\t\t\tpi[pino].poc.ty0 = (OPJ_INT32)tcp->ty0_t;\n\t\t\t\t\t\tpi[pino].poc.ty1 = (OPJ_INT32)(tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy));\n\t\t\t\t\t\ttcp->tx0_t = (OPJ_UINT32)pi[pino].poc.tx1;\n\t\t\t\t\t\ttcp->ty0_t = (OPJ_UINT32)pi[pino].poc.ty1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tincr_top=1;\n\t\t}else{\n\t\t\tfor(i=tppos;i>=0;i--){\n\t\t\t\tswitch(prog[i]){\n\t\t\t\tcase 'C':\n\t\t\t\t\tpi[pino].poc.compno0 = tcp->comp_t-1;\n\t\t\t\t\tpi[pino].poc.compno1 = tcp->comp_t;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'R':\n\t\t\t\t\tpi[pino].poc.resno0 = tcp->res_t-1;\n\t\t\t\t\tpi[pino].poc.resno1 = tcp->res_t;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'L':\n\t\t\t\t\tpi[pino].poc.layno0 = tcp->lay_t-1;\n\t\t\t\t\tpi[pino].poc.layno1 = tcp->lay_t;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'P':\n\t\t\t\t\tswitch(tcp->prg){\n\t\t\t\t\tcase OPJ_LRCP:\n\t\t\t\t\tcase OPJ_RLCP:\n\t\t\t\t\t\tpi[pino].poc.precno0 = tcp->prc_t-1;\n\t\t\t\t\t\tpi[pino].poc.precno1 = tcp->prc_t;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tpi[pino].poc.tx0 = (OPJ_INT32)(tcp->tx0_t - tcp->dx - (tcp->tx0_t % tcp->dx));\n\t\t\t\t\t\tpi[pino].poc.tx1 = (OPJ_INT32)tcp->tx0_t ;\n\t\t\t\t\t\tpi[pino].poc.ty0 = (OPJ_INT32)(tcp->ty0_t - tcp->dy - (tcp->ty0_t % tcp->dy));\n\t\t\t\t\t\tpi[pino].poc.ty1 = (OPJ_INT32)tcp->ty0_t ;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(incr_top==1){\n\t\t\t\t\tswitch(prog[i]){\n\t\t\t\t\tcase 'R':\n\t\t\t\t\t\tif(tcp->res_t==tcp->resE){\n\t\t\t\t\t\t\tif(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){\n\t\t\t\t\t\t\t\ttcp->res_t = tcp->resS;\n\t\t\t\t\t\t\t\tpi[pino].poc.resno0 = tcp->res_t;\n\t\t\t\t\t\t\t\tpi[pino].poc.resno1 = tcp->res_t+1;\n\t\t\t\t\t\t\t\ttcp->res_t+=1;\n\t\t\t\t\t\t\t\tincr_top=1;\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\tincr_top=0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tpi[pino].poc.resno0 = tcp->res_t;\n\t\t\t\t\t\t\tpi[pino].poc.resno1 = tcp->res_t+1;\n\t\t\t\t\t\t\ttcp->res_t+=1;\n\t\t\t\t\t\t\tincr_top=0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'C':\n\t\t\t\t\t\tif(tcp->comp_t ==tcp->compE){\n\t\t\t\t\t\t\tif(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){\n\t\t\t\t\t\t\t\ttcp->comp_t = tcp->compS;\n\t\t\t\t\t\t\t\tpi[pino].poc.compno0 = tcp->comp_t;\n\t\t\t\t\t\t\t\tpi[pino].poc.compno1 = tcp->comp_t+1;\n\t\t\t\t\t\t\t\ttcp->comp_t+=1;\n\t\t\t\t\t\t\t\tincr_top=1;\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\tincr_top=0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tpi[pino].poc.compno0 = tcp->comp_t;\n\t\t\t\t\t\t\tpi[pino].poc.compno1 = tcp->comp_t+1;\n\t\t\t\t\t\t\ttcp->comp_t+=1;\n\t\t\t\t\t\t\tincr_top=0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'L':\n\t\t\t\t\t\tif(tcp->lay_t == tcp->layE){\n\t\t\t\t\t\t\tif(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){\n\t\t\t\t\t\t\t\ttcp->lay_t = tcp->layS;\n\t\t\t\t\t\t\t\tpi[pino].poc.layno0 = tcp->lay_t;\n\t\t\t\t\t\t\t\tpi[pino].poc.layno1 = tcp->lay_t+1;\n\t\t\t\t\t\t\t\ttcp->lay_t+=1;\n\t\t\t\t\t\t\t\tincr_top=1;\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\tincr_top=0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tpi[pino].poc.layno0 = tcp->lay_t;\n\t\t\t\t\t\t\tpi[pino].poc.layno1 = tcp->lay_t+1;\n\t\t\t\t\t\t\ttcp->lay_t+=1;\n\t\t\t\t\t\t\tincr_top=0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'P':\n\t\t\t\t\t\tswitch(tcp->prg){\n\t\t\t\t\t\tcase OPJ_LRCP:\n\t\t\t\t\t\tcase OPJ_RLCP:\n\t\t\t\t\t\t\tif(tcp->prc_t == tcp->prcE){\n\t\t\t\t\t\t\t\tif(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){\n\t\t\t\t\t\t\t\t\ttcp->prc_t = tcp->prcS;\n\t\t\t\t\t\t\t\t\tpi[pino].poc.precno0 = tcp->prc_t;\n\t\t\t\t\t\t\t\t\tpi[pino].poc.precno1 = tcp->prc_t+1;\n\t\t\t\t\t\t\t\t\ttcp->prc_t+=1;\n\t\t\t\t\t\t\t\t\tincr_top=1;\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\tincr_top=0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\tpi[pino].poc.precno0 = tcp->prc_t;\n\t\t\t\t\t\t\t\tpi[pino].poc.precno1 = tcp->prc_t+1;\n\t\t\t\t\t\t\t\ttcp->prc_t+=1;\n\t\t\t\t\t\t\t\tincr_top=0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tif(tcp->tx0_t >= tcp->txE){\n\t\t\t\t\t\t\t\tif(tcp->ty0_t >= tcp->tyE){\n\t\t\t\t\t\t\t\t\tif(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){\n\t\t\t\t\t\t\t\t\t\ttcp->ty0_t = tcp->tyS;\n\t\t\t\t\t\t\t\t\t\tpi[pino].poc.ty0 = (OPJ_INT32)tcp->ty0_t;\n\t\t\t\t\t\t\t\t\t\tpi[pino].poc.ty1 = (OPJ_INT32)(tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy));\n\t\t\t\t\t\t\t\t\t\ttcp->ty0_t = (OPJ_UINT32)pi[pino].poc.ty1;\n\t\t\t\t\t\t\t\t\t\tincr_top=1;resetX=1;\n\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\tincr_top=0;resetX=0;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\tpi[pino].poc.ty0 = (OPJ_INT32)tcp->ty0_t;\n\t\t\t\t\t\t\t\t\tpi[pino].poc.ty1 = (OPJ_INT32)(tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy));\n\t\t\t\t\t\t\t\t\ttcp->ty0_t = (OPJ_UINT32)pi[pino].poc.ty1;\n\t\t\t\t\t\t\t\t\tincr_top=0;resetX=1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif(resetX==1){\n\t\t\t\t\t\t\t\t\ttcp->tx0_t = tcp->txS;\n\t\t\t\t\t\t\t\t\tpi[pino].poc.tx0 = (OPJ_INT32)tcp->tx0_t;\n\t\t\t\t\t\t\t\t\tpi[pino].poc.tx1 = (OPJ_INT32)(tcp->tx0_t + tcp->dx- (tcp->tx0_t % tcp->dx));\n\t\t\t\t\t\t\t\t\ttcp->tx0_t = (OPJ_UINT32)pi[pino].poc.tx1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\tpi[pino].poc.tx0 = (OPJ_INT32)tcp->tx0_t;\n\t\t\t\t\t\t\t\tpi[pino].poc.tx1 = (OPJ_INT32)(tcp->tx0_t + tcp->dx- (tcp->tx0_t % tcp->dx));\n\t\t\t\t\t\t\t\ttcp->tx0_t = (OPJ_UINT32)pi[pino].poc.tx1;\n\t\t\t\t\t\t\t\tincr_top=0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid opj_pi_destroy(opj_pi_iterator_t *p_pi,\n                    OPJ_UINT32 p_nb_elements)\n{\n\tOPJ_UINT32 compno, pino;\n\topj_pi_iterator_t *l_current_pi = p_pi;\n    if (p_pi) {\n\t\tif (p_pi->include) {\n\t\t\topj_free(p_pi->include);\n\t\t\tp_pi->include = 00;\n\t\t}\n\t\tfor (pino = 0; pino < p_nb_elements; ++pino){\n\t\t\tif(l_current_pi->comps) {\n\t\t\t\topj_pi_comp_t *l_current_component = l_current_pi->comps;\n                for (compno = 0; compno < l_current_pi->numcomps; compno++){\n                    if(l_current_component->resolutions) {\n\t\t\t\t\t\topj_free(l_current_component->resolutions);\n\t\t\t\t\t\tl_current_component->resolutions = 00;\n\t\t\t\t\t}\n\n\t\t\t\t\t++l_current_component;\n\t\t\t\t}\n\t\t\t\topj_free(l_current_pi->comps);\n\t\t\t\tl_current_pi->comps = 0;\n\t\t\t}\n\t\t\t++l_current_pi;\n\t\t}\n\t\topj_free(p_pi);\n\t}\n}\n\n\n\nvoid opj_pi_update_encoding_parameters(\tconst opj_image_t *p_image,\n                                        opj_cp_t *p_cp,\n                                        OPJ_UINT32 p_tile_no )\n{\n\t/* encoding parameters to set */\n\tOPJ_UINT32 l_max_res;\n\tOPJ_UINT32 l_max_prec;\n\tOPJ_INT32 l_tx0,l_tx1,l_ty0,l_ty1;\n\tOPJ_UINT32 l_dx_min,l_dy_min;\n\n\t/* pointers */\n\topj_tcp_t *l_tcp = 00;\n\n\t/* preconditions */\n\tassert(p_cp != 00);\n\tassert(p_image != 00);\n\tassert(p_tile_no < p_cp->tw * p_cp->th);\n\n\tl_tcp = &(p_cp->tcps[p_tile_no]);\n\n\t/* get encoding parameters */\n\topj_get_encoding_parameters(p_image,p_cp,p_tile_no,&l_tx0,&l_tx1,&l_ty0,&l_ty1,&l_dx_min,&l_dy_min,&l_max_prec,&l_max_res);\n\n\tif (l_tcp->POC) {\n\t\topj_pi_update_encode_poc_and_final(p_cp,p_tile_no,l_tx0,l_tx1,l_ty0,l_ty1,l_max_prec,l_max_res,l_dx_min,l_dy_min);\n\t}\n\telse {\n\t\topj_pi_update_encode_not_poc(p_cp,p_image->numcomps,p_tile_no,l_tx0,l_tx1,l_ty0,l_ty1,l_max_prec,l_max_res,l_dx_min,l_dy_min);\n\t}\n}\n\nOPJ_BOOL opj_pi_next(opj_pi_iterator_t * pi) {\n\tswitch (pi->poc.prg) {\n\t\tcase OPJ_LRCP:\n\t\t\treturn opj_pi_next_lrcp(pi);\n\t\tcase OPJ_RLCP:\n\t\t\treturn opj_pi_next_rlcp(pi);\n\t\tcase OPJ_RPCL:\n\t\t\treturn opj_pi_next_rpcl(pi);\n\t\tcase OPJ_PCRL:\n\t\t\treturn opj_pi_next_pcrl(pi);\n\t\tcase OPJ_CPRL:\n\t\t\treturn opj_pi_next_cprl(pi);\n\t\tcase OPJ_PROG_UNKNOWN:\n\t\t\treturn OPJ_FALSE;\n\t}\n\t\n\treturn OPJ_FALSE;\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/pi.h",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2001-2003, David Janssens\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifndef __PI_H\n#define __PI_H\n/**\n@file pi.h\n@brief Implementation of a packet iterator (PI)\n\nThe functions in PI.C have for goal to realize a packet iterator that permits to get the next\npacket following the progression order and change of it. The functions in PI.C are used\nby some function in T2.C.\n*/\n\n/** @defgroup PI PI - Implementation of a packet iterator */\n/*@{*/\n\n/**\nFIXME DOC\n*/\ntypedef struct opj_pi_resolution {\n  OPJ_UINT32 pdx, pdy;\n  OPJ_UINT32 pw, ph;\n} opj_pi_resolution_t;\n\n/**\nFIXME DOC\n*/\ntypedef struct opj_pi_comp {\n  OPJ_UINT32 dx, dy;\n  /** number of resolution levels */\n  OPJ_UINT32 numresolutions;\n  opj_pi_resolution_t *resolutions;\n} opj_pi_comp_t;\n\n/**\nPacket iterator\n*/\ntypedef struct opj_pi_iterator {\n  /** Enabling Tile part generation*/\n  OPJ_BYTE tp_on;\n  /** precise if the packet has been already used (usefull for progression order change) */\n  OPJ_INT16 *include;\n  /** layer step used to localize the packet in the include vector */\n  OPJ_UINT32 step_l;\n  /** resolution step used to localize the packet in the include vector */\n  OPJ_UINT32 step_r;\n  /** component step used to localize the packet in the include vector */\n  OPJ_UINT32 step_c;\n  /** precinct step used to localize the packet in the include vector */\n  OPJ_UINT32 step_p;\n  /** component that identify the packet */\n  OPJ_UINT32 compno;\n  /** resolution that identify the packet */\n  OPJ_UINT32 resno;\n  /** precinct that identify the packet */\n  OPJ_UINT32 precno;\n  /** layer that identify the packet */\n  OPJ_UINT32 layno;\n  /** 0 if the first packet */\n  OPJ_BOOL first;\n  /** progression order change information */\n  opj_poc_t poc;\n  /** number of components in the image */\n  OPJ_UINT32 numcomps;\n  /** Components*/\n  opj_pi_comp_t *comps;\n  /** FIXME DOC*/\n  OPJ_INT32 tx0, ty0, tx1, ty1;\n  /** FIXME DOC*/\n  OPJ_INT32 x, y;\n  /** FIXME DOC*/\n  OPJ_UINT32 dx, dy;\n} opj_pi_iterator_t;\n\n/** @name Exported functions */\n/*@{*/\n/* ----------------------------------------------------------------------- */\n/**\n * Creates a packet iterator for encoding.\n *\n * @param\timage\t\tthe image being encoded.\n * @param\tcp\t\tthe coding parameters.\n * @param\ttileno\tindex of the tile being encoded.\n * @param\tt2_mode\tthe type of pass for generating the packet iterator\n *\n * @return\ta list of packet iterator that points to the first packet of the tile (not true).\n*/\nopj_pi_iterator_t *opj_pi_initialise_encode(const opj_image_t *image,\n                                            opj_cp_t *cp,\n                                            OPJ_UINT32 tileno,\n                                            J2K_T2_MODE t2_mode);\n\n/**\n * Updates the encoding parameters of the codec.\n *\n * @param\tp_image\t\tthe image being encoded.\n * @param\tp_cp\t\tthe coding parameters.\n * @param\tp_tile_no\tindex of the tile being encoded.\n*/\nvoid opj_pi_update_encoding_parameters(\tconst opj_image_t *p_image,\n                                        opj_cp_t *p_cp,\n                                        OPJ_UINT32 p_tile_no );\n\n/**\nModify the packet iterator for enabling tile part generation\n@param pi Handle to the packet iterator generated in pi_initialise_encode\n@param cp Coding parameters\n@param tileno Number that identifies the tile for which to list the packets\n@param pino   FIXME DOC\n@param tpnum Tile part number of the current tile\n@param tppos The position of the tile part flag in the progression order\n@param t2_mode FIXME DOC\n*/\nvoid opj_pi_create_encode(  opj_pi_iterator_t *pi, \n                            opj_cp_t *cp,\n                            OPJ_UINT32 tileno, \n                            OPJ_UINT32 pino,\n                            OPJ_UINT32 tpnum, \n                            OPJ_INT32 tppos, \n                            J2K_T2_MODE t2_mode);\n\n/**\nCreate a packet iterator for Decoder\n@param image Raw image for which the packets will be listed\n@param cp Coding parameters\n@param tileno Number that identifies the tile for which to list the packets\n@return Returns a packet iterator that points to the first packet of the tile\n@see opj_pi_destroy\n*/\nopj_pi_iterator_t *opj_pi_create_decode(opj_image_t * image, \n                                        opj_cp_t * cp,\n                                        OPJ_UINT32 tileno);\n/**\n * Destroys a packet iterator array.\n *\n * @param\tp_pi\t\t\tthe packet iterator array to destroy.\n * @param\tp_nb_elements\tthe number of elements in the array.\n */\nvoid opj_pi_destroy(opj_pi_iterator_t *p_pi,\n                    OPJ_UINT32 p_nb_elements);\n\n/**\nModify the packet iterator to point to the next packet\n@param pi Packet iterator to modify\n@return Returns false if pi pointed to the last packet or else returns true\n*/\nOPJ_BOOL opj_pi_next(opj_pi_iterator_t * pi);\n/* ----------------------------------------------------------------------- */\n/*@}*/\n\n/*@}*/\n\n#endif /* __PI_H */\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/raw.c",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"opj_includes.h\"\n\n/* \n==========================================================\n   local functions\n==========================================================\n*/\n\n\n/* \n==========================================================\n   RAW encoding interface\n==========================================================\n*/\n\nopj_raw_t* opj_raw_create(void) {\n\topj_raw_t *raw = (opj_raw_t*)opj_malloc(sizeof(opj_raw_t));\n\treturn raw;\n}\n\nvoid opj_raw_destroy(opj_raw_t *raw) {\n\tif(raw) {\n\t\topj_free(raw);\n\t}\n}\n\nOPJ_UINT32 opj_raw_numbytes(opj_raw_t *raw) {\n\tconst ptrdiff_t diff = raw->bp - raw->start;\n  assert( diff <= (ptrdiff_t)0xffffffff && diff >= 0 ); /* UINT32_MAX */\n\treturn (OPJ_UINT32)diff;\n}\n\nvoid opj_raw_init_dec(opj_raw_t *raw, OPJ_BYTE *bp, OPJ_UINT32 len) {\n\traw->start = bp;\n\traw->lenmax = len;\n\traw->len = 0;\n\traw->c = 0;\n\traw->ct = 0;\n}\n\nOPJ_UINT32 opj_raw_decode(opj_raw_t *raw) {\n\tOPJ_UINT32 d;\n\tif (raw->ct == 0) {\n\t\traw->ct = 8;\n\t\tif (raw->len == raw->lenmax) {\n\t\t\traw->c = 0xff;\n\t\t} else {\n\t\t\tif (raw->c == 0xff) {\n\t\t\t\traw->ct = 7;\n\t\t\t}\n\t\t\traw->c = *(raw->start + raw->len);\n\t\t\traw->len++;\n\t\t}\n\t}\n\traw->ct--;\n\td = (raw->c >> raw->ct) & 0x01;\n\t\n\treturn d;\n}\n\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/raw.h",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifndef __RAW_H\n#define __RAW_H\n/**\n@file raw.h\n@brief Implementation of operations for raw encoding (RAW)\n\nThe functions in RAW.C have for goal to realize the operation of raw encoding linked\nwith the corresponding mode switch.\n*/\n\n/** @defgroup RAW RAW - Implementation of operations for raw encoding */\n/*@{*/\n\n/**\nRAW encoding operations\n*/\ntypedef struct opj_raw {\n\t/** temporary buffer where bits are coded or decoded */\n\tOPJ_BYTE c;\n\t/** number of bits already read or free to write */\n\tOPJ_UINT32 ct;\n\t/** maximum length to decode */\n\tOPJ_UINT32 lenmax;\n\t/** length decoded */\n\tOPJ_UINT32 len;\n\t/** pointer to the current position in the buffer */\n\tOPJ_BYTE *bp;\n\t/** pointer to the start of the buffer */\n\tOPJ_BYTE *start;\n\t/** pointer to the end of the buffer */\n\tOPJ_BYTE *end;\n} opj_raw_t;\n\n/** @name Exported functions */\n/*@{*/\n/* ----------------------------------------------------------------------- */\n/**\nCreate a new RAW handle \n@return Returns a new RAW handle if successful, returns NULL otherwise\n*/\nopj_raw_t* opj_raw_create(void);\n/**\nDestroy a previously created RAW handle\n@param raw RAW handle to destroy\n*/\nvoid opj_raw_destroy(opj_raw_t *raw);\n/**\nReturn the number of bytes written/read since initialisation\n@param raw RAW handle to destroy\n@return Returns the number of bytes already encoded\n*/\nOPJ_UINT32 opj_raw_numbytes(opj_raw_t *raw);\n/**\nInitialize the decoder\n@param raw RAW handle\n@param bp Pointer to the start of the buffer from which the bytes will be read\n@param len Length of the input buffer\n*/\nvoid opj_raw_init_dec(opj_raw_t *raw, OPJ_BYTE *bp, OPJ_UINT32 len);\n/**\nDecode a symbol using raw-decoder. Cfr p.506 TAUBMAN\n@param raw RAW handle\n@return Returns the decoded symbol (0 or 1)\n*/\nOPJ_UINT32 opj_raw_decode(opj_raw_t *raw);\n/* ----------------------------------------------------------------------- */\n/*@}*/\n\n/*@}*/\n\n#endif /* __RAW_H */\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1.c",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2001-2003, David Janssens\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"opj_includes.h\"\n#include \"t1_luts.h\"\n\n/** @defgroup T1 T1 - Implementation of the tier-1 coding */\n/*@{*/\n\n/** @name Local static functions */\n/*@{*/\n\nstatic INLINE OPJ_BYTE opj_t1_getctxno_zc(OPJ_UINT32 f, OPJ_UINT32 orient);\nstatic OPJ_BYTE opj_t1_getctxno_sc(OPJ_UINT32 f);\nstatic INLINE OPJ_UINT32 opj_t1_getctxno_mag(OPJ_UINT32 f);\nstatic OPJ_BYTE opj_t1_getspb(OPJ_UINT32 f);\nstatic OPJ_INT16 opj_t1_getnmsedec_sig(OPJ_UINT32 x, OPJ_UINT32 bitpos);\nstatic OPJ_INT16 opj_t1_getnmsedec_ref(OPJ_UINT32 x, OPJ_UINT32 bitpos);\nstatic void opj_t1_updateflags(opj_flag_t *flagsp, OPJ_UINT32 s, OPJ_UINT32 stride);\n/**\nEncode significant pass\n*/\nstatic void opj_t1_enc_sigpass_step(opj_t1_t *t1,\n                                    opj_flag_t *flagsp,\n                                    OPJ_INT32 *datap,\n                                    OPJ_UINT32 orient,\n                                    OPJ_INT32 bpno,\n                                    OPJ_INT32 one,\n                                    OPJ_INT32 *nmsedec,\n                                    OPJ_BYTE type,\n                                    OPJ_UINT32 vsc);\n\n/**\nDecode significant pass\n*/\n#if 0\nstatic void opj_t1_dec_sigpass_step(opj_t1_t *t1,\n                                    opj_flag_t *flagsp,\n                                    OPJ_INT32 *datap,\n                                    OPJ_UINT32 orient,\n                                    OPJ_INT32 oneplushalf,\n                                    OPJ_BYTE type,\n                                    OPJ_UINT32 vsc);\n#endif\n\nstatic INLINE void opj_t1_dec_sigpass_step_raw(\n                opj_t1_t *t1,\n                opj_flag_t *flagsp,\n                OPJ_INT32 *datap,\n                OPJ_INT32 orient,\n                OPJ_INT32 oneplushalf,\n                OPJ_INT32 vsc);\nstatic INLINE void opj_t1_dec_sigpass_step_mqc(\n                opj_t1_t *t1,\n                opj_flag_t *flagsp,\n                OPJ_INT32 *datap,\n                OPJ_INT32 orient,\n                OPJ_INT32 oneplushalf);\nstatic INLINE void opj_t1_dec_sigpass_step_mqc_vsc(\n                opj_t1_t *t1,\n                opj_flag_t *flagsp,\n                OPJ_INT32 *datap,\n                OPJ_INT32 orient,\n                OPJ_INT32 oneplushalf,\n                OPJ_INT32 vsc);\n\n\n/**\nEncode significant pass\n*/\nstatic void opj_t1_enc_sigpass( opj_t1_t *t1,\n                                OPJ_INT32 bpno,\n                                OPJ_UINT32 orient,\n                                OPJ_INT32 *nmsedec,\n                                OPJ_BYTE type,\n                                OPJ_UINT32 cblksty);\n\n/**\nDecode significant pass\n*/\nstatic void opj_t1_dec_sigpass_raw(\n                opj_t1_t *t1,\n                OPJ_INT32 bpno,\n                OPJ_INT32 orient,\n                OPJ_INT32 cblksty);\nstatic void opj_t1_dec_sigpass_mqc(\n                opj_t1_t *t1,\n                OPJ_INT32 bpno,\n                OPJ_INT32 orient);\nstatic void opj_t1_dec_sigpass_mqc_vsc(\n                opj_t1_t *t1,\n                OPJ_INT32 bpno,\n                OPJ_INT32 orient);\n\n\n\n/**\nEncode refinement pass\n*/\nstatic void opj_t1_enc_refpass_step(opj_t1_t *t1,\n                                    opj_flag_t *flagsp,\n                                    OPJ_INT32 *datap,\n                                    OPJ_INT32 bpno,\n                                    OPJ_INT32 one,\n                                    OPJ_INT32 *nmsedec,\n                                    OPJ_BYTE type,\n                                    OPJ_UINT32 vsc);\n\n\n/**\nEncode refinement pass\n*/\nstatic void opj_t1_enc_refpass( opj_t1_t *t1,\n                                OPJ_INT32 bpno,\n                                OPJ_INT32 *nmsedec,\n                                OPJ_BYTE type,\n                                OPJ_UINT32 cblksty);\n\n/**\nDecode refinement pass\n*/\nstatic void opj_t1_dec_refpass_raw(\n                opj_t1_t *t1,\n                OPJ_INT32 bpno,\n                OPJ_INT32 cblksty);\nstatic void opj_t1_dec_refpass_mqc(\n                opj_t1_t *t1,\n                OPJ_INT32 bpno);\nstatic void opj_t1_dec_refpass_mqc_vsc(\n                opj_t1_t *t1,\n                OPJ_INT32 bpno);\n\n\n/**\nDecode refinement pass\n*/\n#if 0\nstatic void opj_t1_dec_refpass_step(opj_t1_t *t1,\n                                    opj_flag_t *flagsp,\n                                    OPJ_INT32 *datap,\n                                    OPJ_INT32 poshalf,\n                                    OPJ_INT32 neghalf,\n                                    OPJ_BYTE type,\n                                    OPJ_UINT32 vsc);\n#endif\n\nstatic INLINE void  opj_t1_dec_refpass_step_raw(\n                opj_t1_t *t1,\n                opj_flag_t *flagsp,\n                OPJ_INT32 *datap,\n                OPJ_INT32 poshalf,\n                OPJ_INT32 neghalf,\n                OPJ_INT32 vsc);\nstatic INLINE void opj_t1_dec_refpass_step_mqc(\n                opj_t1_t *t1,\n                opj_flag_t *flagsp,\n                OPJ_INT32 *datap,\n                OPJ_INT32 poshalf,\n                OPJ_INT32 neghalf);\nstatic INLINE void opj_t1_dec_refpass_step_mqc_vsc(\n                opj_t1_t *t1,\n                opj_flag_t *flagsp,\n                OPJ_INT32 *datap,\n                OPJ_INT32 poshalf,\n                OPJ_INT32 neghalf,\n                OPJ_INT32 vsc);\n\n\n\n/**\nEncode clean-up pass\n*/\nstatic void opj_t1_enc_clnpass_step(\n\t\topj_t1_t *t1,\n\t\topj_flag_t *flagsp,\n\t\tOPJ_INT32 *datap,\n\t\tOPJ_UINT32 orient,\n\t\tOPJ_INT32 bpno,\n\t\tOPJ_INT32 one,\n\t\tOPJ_INT32 *nmsedec,\n\t\tOPJ_UINT32 partial,\n\t\tOPJ_UINT32 vsc);\n/**\nDecode clean-up pass\n*/\nstatic void opj_t1_dec_clnpass_step_partial(\n\t\topj_t1_t *t1,\n\t\topj_flag_t *flagsp,\n\t\tOPJ_INT32 *datap,\n\t\tOPJ_INT32 orient,\n\t\tOPJ_INT32 oneplushalf);\nstatic void opj_t1_dec_clnpass_step(\n\t\topj_t1_t *t1,\n\t\topj_flag_t *flagsp,\n\t\tOPJ_INT32 *datap,\n\t\tOPJ_INT32 orient,\n\t\tOPJ_INT32 oneplushalf);\nstatic void opj_t1_dec_clnpass_step_vsc(\n\t\topj_t1_t *t1,\n\t\topj_flag_t *flagsp,\n\t\tOPJ_INT32 *datap,\n\t\tOPJ_INT32 orient,\n\t\tOPJ_INT32 oneplushalf,\n\t\tOPJ_INT32 partial,\n\t\tOPJ_INT32 vsc);\n/**\nEncode clean-up pass\n*/\nstatic void opj_t1_enc_clnpass(\n\t\topj_t1_t *t1,\n\t\tOPJ_INT32 bpno,\n\t\tOPJ_UINT32 orient,\n\t\tOPJ_INT32 *nmsedec,\n\t\tOPJ_UINT32 cblksty);\n/**\nDecode clean-up pass\n*/\nstatic void opj_t1_dec_clnpass(\n\t\topj_t1_t *t1,\n\t\tOPJ_INT32 bpno,\n\t\tOPJ_INT32 orient,\n\t\tOPJ_INT32 cblksty);\n\nstatic OPJ_FLOAT64 opj_t1_getwmsedec(\n\t\tOPJ_INT32 nmsedec,\n\t\tOPJ_UINT32 compno,\n\t\tOPJ_UINT32 level,\n\t\tOPJ_UINT32 orient,\n\t\tOPJ_INT32 bpno,\n\t\tOPJ_UINT32 qmfbid,\n\t\tOPJ_FLOAT64 stepsize,\n\t\tOPJ_UINT32 numcomps,\n\t\tconst OPJ_FLOAT64 * mct_norms);\n\nstatic void opj_t1_encode_cblk( opj_t1_t *t1,\n                                opj_tcd_cblk_enc_t* cblk,\n                                OPJ_UINT32 orient,\n                                OPJ_UINT32 compno,\n                                OPJ_UINT32 level,\n                                OPJ_UINT32 qmfbid,\n                                OPJ_FLOAT64 stepsize,\n                                OPJ_UINT32 cblksty,\n                                OPJ_UINT32 numcomps,\n                                opj_tcd_tile_t * tile,\n                                const OPJ_FLOAT64 * mct_norms);\n\n/**\nDecode 1 code-block\n@param t1 T1 handle\n@param cblk Code-block coding parameters\n@param orient\n@param roishift Region of interest shifting value\n@param cblksty Code-block style\n*/\nstatic OPJ_BOOL opj_t1_decode_cblk( opj_t1_t *t1,\n                                    opj_tcd_cblk_dec_t* cblk,\n                                    OPJ_UINT32 orient,\n                                    OPJ_UINT32 roishift,\n                                    OPJ_UINT32 cblksty);\n\nOPJ_BOOL opj_t1_allocate_buffers(   opj_t1_t *t1,\n                                    OPJ_UINT32 w,\n                                    OPJ_UINT32 h);\n\n/*@}*/\n\n/*@}*/\n\n/* ----------------------------------------------------------------------- */\n\nOPJ_BYTE opj_t1_getctxno_zc(OPJ_UINT32 f, OPJ_UINT32 orient) {\n\treturn lut_ctxno_zc[(orient << 8) | (f & T1_SIG_OTH)];\n}\n\nOPJ_BYTE opj_t1_getctxno_sc(OPJ_UINT32 f) {\n\treturn lut_ctxno_sc[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];\n}\n\nOPJ_UINT32 opj_t1_getctxno_mag(OPJ_UINT32 f) {\n\tOPJ_UINT32 tmp1 = (f & T1_SIG_OTH) ? T1_CTXNO_MAG + 1 : T1_CTXNO_MAG;\n\tOPJ_UINT32 tmp2 = (f & T1_REFINE) ? T1_CTXNO_MAG + 2 : tmp1;\n\treturn (tmp2);\n}\n\nOPJ_BYTE opj_t1_getspb(OPJ_UINT32 f) {\n\treturn lut_spb[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];\n}\n\nOPJ_INT16 opj_t1_getnmsedec_sig(OPJ_UINT32 x, OPJ_UINT32 bitpos) {\n\tif (bitpos > T1_NMSEDEC_FRACBITS) {\n\t\treturn lut_nmsedec_sig[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)];\n\t}\n\t\n\treturn lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)];\n}\n\nOPJ_INT16 opj_t1_getnmsedec_ref(OPJ_UINT32 x, OPJ_UINT32 bitpos) {\n\tif (bitpos > T1_NMSEDEC_FRACBITS) {\n\t\treturn lut_nmsedec_ref[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)];\n\t}\n\n    return lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)];\n}\n\nvoid opj_t1_updateflags(opj_flag_t *flagsp, OPJ_UINT32 s, OPJ_UINT32 stride) {\n\topj_flag_t *np = flagsp - stride;\n\topj_flag_t *sp = flagsp + stride;\n\n\tstatic const opj_flag_t mod[] = {\n\t\tT1_SIG_S, T1_SIG_S|T1_SGN_S,\n\t\tT1_SIG_E, T1_SIG_E|T1_SGN_E,\n\t\tT1_SIG_W, T1_SIG_W|T1_SGN_W,\n\t\tT1_SIG_N, T1_SIG_N|T1_SGN_N\n\t};\n\n\tnp[-1] |= T1_SIG_SE;\n\tnp[0]  |= mod[s];\n\tnp[1]  |= T1_SIG_SW;\n\n\tflagsp[-1] |= mod[s+2];\n\tflagsp[0]  |= T1_SIG;\n\tflagsp[1]  |= mod[s+4];\n\n\tsp[-1] |= T1_SIG_NE;\n\tsp[0]  |= mod[s+6];\n\tsp[1]  |= T1_SIG_NW;\n}\n\nvoid opj_t1_enc_sigpass_step(   opj_t1_t *t1,\n                                opj_flag_t *flagsp,\n                                OPJ_INT32 *datap,\n                                OPJ_UINT32 orient,\n                                OPJ_INT32 bpno,\n                                OPJ_INT32 one,\n                                OPJ_INT32 *nmsedec,\n                                OPJ_BYTE type,\n                                OPJ_UINT32 vsc\n                                )\n{\n\tOPJ_INT32 v;\n    OPJ_UINT32 flag;\n\t\n\topj_mqc_t *mqc = t1->mqc;\t/* MQC component */\n\t\n\tflag = vsc ? (OPJ_UINT32)((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (OPJ_UINT32)(*flagsp);\n\tif ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {\n\t\tv = opj_int_abs(*datap) & one ? 1 : 0;\n\t\topj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(flag, orient));\t/* ESSAI */\n\t\tif (type == T1_TYPE_RAW) {\t/* BYPASS/LAZY MODE */\n\t\t\topj_mqc_bypass_enc(mqc, (OPJ_UINT32)v);\n\t\t} else {\n\t\t\topj_mqc_encode(mqc, (OPJ_UINT32)v);\n\t\t}\n\t\tif (v) {\n\t\t\tv = *datap < 0 ? 1 : 0;\n\t\t\t*nmsedec +=\topj_t1_getnmsedec_sig((OPJ_UINT32)opj_int_abs(*datap), (OPJ_UINT32)(bpno + T1_NMSEDEC_FRACBITS));\n\t\t\topj_mqc_setcurctx(mqc, opj_t1_getctxno_sc(flag));\t/* ESSAI */\n\t\t\tif (type == T1_TYPE_RAW) {\t/* BYPASS/LAZY MODE */\n\t\t\t\topj_mqc_bypass_enc(mqc, (OPJ_UINT32)v);\n\t\t\t} else {\n\t\t\t\topj_mqc_encode(mqc, (OPJ_UINT32)(v ^ opj_t1_getspb((OPJ_UINT32)flag)));\n\t\t\t}\n\t\t\topj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);\n\t\t}\n\t\t*flagsp |= T1_VISIT;\n\t}\n}\n\n\nstatic INLINE void opj_t1_dec_sigpass_step_raw(\n                opj_t1_t *t1,\n                opj_flag_t *flagsp,\n                OPJ_INT32 *datap,\n                OPJ_INT32 orient,\n                OPJ_INT32 oneplushalf,\n                OPJ_INT32 vsc)\n{\n        OPJ_INT32 v, flag;\n        opj_raw_t *raw = t1->raw;       /* RAW component */\n        OPJ_ARG_NOT_USED(orient);\n       \n        flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);\n        if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {\n                        if (opj_raw_decode(raw)) {\n                                v = (OPJ_INT32)opj_raw_decode(raw);    /* ESSAI */\n                                *datap = v ? -oneplushalf : oneplushalf;\n                                opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);\n                        }\n                *flagsp |= T1_VISIT;\n        }\n}      \n\nINLINE void opj_t1_dec_sigpass_step_mqc(\n                opj_t1_t *t1,\n                opj_flag_t *flagsp,\n                OPJ_INT32 *datap,\n                OPJ_INT32 orient,\n                OPJ_INT32 oneplushalf)\n{\n        OPJ_INT32 v, flag;\n       \n        opj_mqc_t *mqc = t1->mqc;       /* MQC component */\n       \n        flag = *flagsp;\n        if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {\n                        opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient));\n                        if (opj_mqc_decode(mqc)) {\n                                opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));\n                                v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);\n                                *datap = v ? -oneplushalf : oneplushalf;\n                                opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);\n                        }\n                *flagsp |= T1_VISIT;\n        }\n}                               /* VSC and  BYPASS by Antonin */\n\nINLINE void opj_t1_dec_sigpass_step_mqc_vsc(\n                opj_t1_t *t1,\n                opj_flag_t *flagsp,\n                OPJ_INT32 *datap,\n                OPJ_INT32 orient,\n                OPJ_INT32 oneplushalf,\n                OPJ_INT32 vsc)\n{\n        OPJ_INT32 v, flag;\n       \n        opj_mqc_t *mqc = t1->mqc;       /* MQC component */\n       \n        flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);\n        if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {\n                opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient));\n                if (opj_mqc_decode(mqc)) {\n                        opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));\n                        v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);\n                        *datap = v ? -oneplushalf : oneplushalf;\n                        opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);\n                }\n                *flagsp |= T1_VISIT;\n        }\n}                               /* VSC and  BYPASS by Antonin */\n\n\n\nvoid opj_t1_enc_sigpass(opj_t1_t *t1,\n                        OPJ_INT32 bpno,\n                        OPJ_UINT32 orient,\n                        OPJ_INT32 *nmsedec,\n                        OPJ_BYTE type,\n                        OPJ_UINT32 cblksty\n                        )\n{\n\tOPJ_UINT32 i, j, k, vsc; \n    OPJ_INT32 one;\n\n\t*nmsedec = 0;\n\tone = 1 << (bpno + T1_NMSEDEC_FRACBITS);\n\tfor (k = 0; k < t1->h; k += 4) {\n\t\tfor (i = 0; i < t1->w; ++i) {\n\t\t\tfor (j = k; j < k + 4 && j < t1->h; ++j) {\n\t\t\t\tvsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;\n\t\t\t\topj_t1_enc_sigpass_step(\n\t\t\t\t\t\tt1,\n\t\t\t\t\t\t&t1->flags[((j+1) * t1->flags_stride) + i + 1],\n\t\t\t\t\t\t&t1->data[(j * t1->w) + i],\n\t\t\t\t\t\torient,\n\t\t\t\t\t\tbpno,\n\t\t\t\t\t\tone,\n\t\t\t\t\t\tnmsedec,\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\tvsc);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid opj_t1_dec_sigpass_raw(\n                opj_t1_t *t1,\n                OPJ_INT32 bpno,\n                OPJ_INT32 orient,\n                OPJ_INT32 cblksty)\n{\n        OPJ_INT32 one, half, oneplushalf, vsc;\n        OPJ_UINT32 i, j, k; \n        one = 1 << bpno;\n        half = one >> 1;\n        oneplushalf = one | half;\n        for (k = 0; k < t1->h; k += 4) {\n                for (i = 0; i < t1->w; ++i) {\n                        for (j = k; j < k + 4 && j < t1->h; ++j) {\n                                vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;\n                                opj_t1_dec_sigpass_step_raw(\n                                                t1,\n                                                &t1->flags[((j+1) * t1->flags_stride) + i + 1],\n                                                &t1->data[(j * t1->w) + i],\n                                                orient,\n                                                oneplushalf,\n                                                vsc);\n                        }\n                }\n        }\n}                               /* VSC and  BYPASS by Antonin */\n\nvoid opj_t1_dec_sigpass_mqc(\n                opj_t1_t *t1,\n                OPJ_INT32 bpno,\n                OPJ_INT32 orient)\n{\n        OPJ_INT32 one, half, oneplushalf;\n        OPJ_UINT32 i, j, k;\n        OPJ_INT32 *data1 = t1->data;\n        opj_flag_t *flags1 = &t1->flags[1];\n        one = 1 << bpno;\n        half = one >> 1;\n        oneplushalf = one | half;\n        for (k = 0; k < (t1->h & ~3u); k += 4) {\n                for (i = 0; i < t1->w; ++i) {\n                        OPJ_INT32 *data2 = data1 + i;\n                        opj_flag_t *flags2 = flags1 + i;\n                        flags2 += t1->flags_stride;\n                        opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);\n                        data2 += t1->w;\n                        flags2 += t1->flags_stride;\n                        opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);\n                        data2 += t1->w;\n                        flags2 += t1->flags_stride;\n                        opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);\n                        data2 += t1->w;\n                        flags2 += t1->flags_stride;\n                        opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);\n                        data2 += t1->w;\n                }\n                data1 += t1->w << 2;\n                flags1 += t1->flags_stride << 2;\n        }\n        for (i = 0; i < t1->w; ++i) {\n                OPJ_INT32 *data2 = data1 + i;\n                opj_flag_t *flags2 = flags1 + i;\n                for (j = k; j < t1->h; ++j) {\n                        flags2 += t1->flags_stride;\n                        opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);\n                        data2 += t1->w;\n                }\n        }\n}                               /* VSC and  BYPASS by Antonin */\n\nvoid opj_t1_dec_sigpass_mqc_vsc(\n                opj_t1_t *t1,\n                OPJ_INT32 bpno,\n                OPJ_INT32 orient)\n{\n        OPJ_INT32 one, half, oneplushalf, vsc;\n        OPJ_UINT32 i, j, k;\n        one = 1 << bpno;\n        half = one >> 1;\n        oneplushalf = one | half;\n        for (k = 0; k < t1->h; k += 4) {\n                for (i = 0; i < t1->w; ++i) {\n                        for (j = k; j < k + 4 && j < t1->h; ++j) {\n                                vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0;\n                                opj_t1_dec_sigpass_step_mqc_vsc(\n                                                t1,\n                                                &t1->flags[((j+1) * t1->flags_stride) + i + 1],\n                                                &t1->data[(j * t1->w) + i],\n                                                orient,\n                                                oneplushalf,\n                                                vsc);\n                        }\n                }\n        }\n}                               /* VSC and  BYPASS by Antonin */\n\n\n\nvoid opj_t1_enc_refpass_step(   opj_t1_t *t1,\n                                opj_flag_t *flagsp,\n                                OPJ_INT32 *datap,\n                                OPJ_INT32 bpno,\n                                OPJ_INT32 one,\n                                OPJ_INT32 *nmsedec,\n                                OPJ_BYTE type,\n                                OPJ_UINT32 vsc)\n{\n\tOPJ_INT32 v;\n\tOPJ_UINT32 flag;\n\t\n\topj_mqc_t *mqc = t1->mqc;\t/* MQC component */\n\t\n\tflag = vsc ? (OPJ_UINT32)((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (OPJ_UINT32)(*flagsp);\n\tif ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {\n\t\t*nmsedec += opj_t1_getnmsedec_ref((OPJ_UINT32)opj_int_abs(*datap), (OPJ_UINT32)(bpno + T1_NMSEDEC_FRACBITS));\n\t\tv = opj_int_abs(*datap) & one ? 1 : 0;\n\t\topj_mqc_setcurctx(mqc, opj_t1_getctxno_mag(flag));\t/* ESSAI */\n\t\tif (type == T1_TYPE_RAW) {\t/* BYPASS/LAZY MODE */\n\t\t\topj_mqc_bypass_enc(mqc, (OPJ_UINT32)v);\n\t\t} else {\n\t\t\topj_mqc_encode(mqc, (OPJ_UINT32)v);\n\t\t}\n\t\t*flagsp |= T1_REFINE;\n\t}\n}\n\nINLINE void opj_t1_dec_refpass_step_raw(\n                opj_t1_t *t1,\n                opj_flag_t *flagsp,\n                OPJ_INT32 *datap,\n                OPJ_INT32 poshalf,\n                OPJ_INT32 neghalf,\n                OPJ_INT32 vsc)\n{\n        OPJ_INT32 v, t, flag;\n       \n        opj_raw_t *raw = t1->raw;       /* RAW component */\n       \n        flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);\n        if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {\n                        v = (OPJ_INT32)opj_raw_decode(raw);\n                t = v ? poshalf : neghalf;\n                *datap += *datap < 0 ? -t : t;\n                *flagsp |= T1_REFINE;\n        }\n}                               /* VSC and  BYPASS by Antonin  */\n\nINLINE void opj_t1_dec_refpass_step_mqc(\n                opj_t1_t *t1,\n                opj_flag_t *flagsp,\n                OPJ_INT32 *datap,\n                OPJ_INT32 poshalf,\n                OPJ_INT32 neghalf)\n{\n        OPJ_INT32 v, t, flag;\n       \n        opj_mqc_t *mqc = t1->mqc;       /* MQC component */\n       \n        flag = *flagsp;\n        if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {\n                opj_mqc_setcurctx(mqc, opj_t1_getctxno_mag((OPJ_UINT32)flag));      /* ESSAI */\n                        v = opj_mqc_decode(mqc);\n                t = v ? poshalf : neghalf;\n                *datap += *datap < 0 ? -t : t;\n                *flagsp |= T1_REFINE;\n                }\n}                               /* VSC and  BYPASS by Antonin  */\n\nINLINE void opj_t1_dec_refpass_step_mqc_vsc(\n                opj_t1_t *t1,\n                opj_flag_t *flagsp,\n                OPJ_INT32 *datap,\n                OPJ_INT32 poshalf,\n                OPJ_INT32 neghalf,\n                OPJ_INT32 vsc)\n{\n        OPJ_INT32 v, t, flag;\n       \n        opj_mqc_t *mqc = t1->mqc;       /* MQC component */\n       \n        flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);\n        if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {\n                opj_mqc_setcurctx(mqc, opj_t1_getctxno_mag((OPJ_UINT32)flag));      /* ESSAI */\n                v = opj_mqc_decode(mqc);\n                t = v ? poshalf : neghalf;\n                *datap += *datap < 0 ? -t : t;\n                *flagsp |= T1_REFINE;\n        }\n}                               /* VSC and  BYPASS by Antonin  */\n\n\nvoid opj_t1_enc_refpass(\n\t\topj_t1_t *t1,\n\t\tOPJ_INT32 bpno,\n\t\tOPJ_INT32 *nmsedec,\n\t\tOPJ_BYTE type,\n\t\tOPJ_UINT32 cblksty)\n{\n\tOPJ_UINT32 i, j, k, vsc;\n    OPJ_INT32 one;\n\n\t*nmsedec = 0;\n\tone = 1 << (bpno + T1_NMSEDEC_FRACBITS);\n\tfor (k = 0; k < t1->h; k += 4) {\n\t\tfor (i = 0; i < t1->w; ++i) {\n\t\t\tfor (j = k; j < k + 4 && j < t1->h; ++j) {\n\t\t\t\tvsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;\n\t\t\t\topj_t1_enc_refpass_step(\n\t\t\t\t\t\tt1,\n\t\t\t\t\t\t&t1->flags[((j+1) * t1->flags_stride) + i + 1],\n\t\t\t\t\t\t&t1->data[(j * t1->w) + i],\n\t\t\t\t\t\tbpno,\n\t\t\t\t\t\tone,\n\t\t\t\t\t\tnmsedec,\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\tvsc);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid opj_t1_dec_refpass_raw(\n                opj_t1_t *t1,\n                OPJ_INT32 bpno,\n                OPJ_INT32 cblksty)\n{\n        OPJ_INT32 one, poshalf, neghalf;\n        OPJ_UINT32 i, j, k;\n        OPJ_INT32 vsc;\n        one = 1 << bpno;\n        poshalf = one >> 1;\n        neghalf = bpno > 0 ? -poshalf : -1;\n        for (k = 0; k < t1->h; k += 4) {\n                for (i = 0; i < t1->w; ++i) {\n                        for (j = k; j < k + 4 && j < t1->h; ++j) {\n                                vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;\n                                opj_t1_dec_refpass_step_raw(\n                                                t1,\n                                                &t1->flags[((j+1) * t1->flags_stride) + i + 1],\n                                                &t1->data[(j * t1->w) + i],\n                                                poshalf,\n                                                neghalf,\n                                                vsc);\n                        }\n                }\n        }\n}                               /* VSC and  BYPASS by Antonin */\n\nvoid opj_t1_dec_refpass_mqc(\n                opj_t1_t *t1,\n                OPJ_INT32 bpno)\n{\n        OPJ_INT32 one, poshalf, neghalf;\n        OPJ_UINT32 i, j, k;\n        OPJ_INT32 *data1 = t1->data;\n        opj_flag_t *flags1 = &t1->flags[1];\n        one = 1 << bpno;\n        poshalf = one >> 1;\n        neghalf = bpno > 0 ? -poshalf : -1;\n        for (k = 0; k < (t1->h & ~3u); k += 4) {\n                for (i = 0; i < t1->w; ++i) {\n                        OPJ_INT32 *data2 = data1 + i;\n                        opj_flag_t *flags2 = flags1 + i;\n                        flags2 += t1->flags_stride;\n                        opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);\n                        data2 += t1->w;\n                        flags2 += t1->flags_stride;\n                        opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);\n                        data2 += t1->w;\n                        flags2 += t1->flags_stride;\n                        opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);\n                        data2 += t1->w;\n                        flags2 += t1->flags_stride;\n                        opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);\n                        data2 += t1->w;\n                }\n                data1 += t1->w << 2;\n                flags1 += t1->flags_stride << 2;\n        }\n        for (i = 0; i < t1->w; ++i) {\n                OPJ_INT32 *data2 = data1 + i;\n                opj_flag_t *flags2 = flags1 + i;\n                for (j = k; j < t1->h; ++j) {\n                        flags2 += t1->flags_stride;\n                        opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);\n                        data2 += t1->w;\n                }\n        }\n}                               /* VSC and  BYPASS by Antonin */\n\nvoid opj_t1_dec_refpass_mqc_vsc(\n                opj_t1_t *t1,\n                OPJ_INT32 bpno)\n{\n        OPJ_INT32 one, poshalf, neghalf;\n        OPJ_UINT32 i, j, k;\n        OPJ_INT32 vsc;\n        one = 1 << bpno;\n        poshalf = one >> 1;\n        neghalf = bpno > 0 ? -poshalf : -1;\n        for (k = 0; k < t1->h; k += 4) {\n                for (i = 0; i < t1->w; ++i) {\n                        for (j = k; j < k + 4 && j < t1->h; ++j) {\n                                vsc = ((j == k + 3 || j == t1->h - 1)) ? 1 : 0;\n                                opj_t1_dec_refpass_step_mqc_vsc(\n                                                t1,\n                                                &t1->flags[((j+1) * t1->flags_stride) + i + 1],\n                                                &t1->data[(j * t1->w) + i],\n                                                poshalf,\n                                                neghalf,\n                                                vsc);\n                        }\n                }\n        }\n}                               /* VSC and  BYPASS by Antonin */\n\n\nvoid opj_t1_enc_clnpass_step(\n\t\topj_t1_t *t1,\n\t\topj_flag_t *flagsp,\n\t\tOPJ_INT32 *datap,\n\t\tOPJ_UINT32 orient,\n\t\tOPJ_INT32 bpno,\n\t\tOPJ_INT32 one,\n\t\tOPJ_INT32 *nmsedec,\n\t\tOPJ_UINT32 partial,\n\t\tOPJ_UINT32 vsc)\n{\n\tOPJ_INT32 v;\n\tOPJ_UINT32 flag;\n\t\n\topj_mqc_t *mqc = t1->mqc;\t/* MQC component */\n\t\n\tflag = vsc ? (OPJ_UINT32)((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (OPJ_UINT32)(*flagsp);\n\tif (partial) {\n\t\tgoto LABEL_PARTIAL;\n\t}\n\tif (!(*flagsp & (T1_SIG | T1_VISIT))) {\n\t\topj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(flag, orient));\n\t\tv = opj_int_abs(*datap) & one ? 1 : 0;\n\t\topj_mqc_encode(mqc, (OPJ_UINT32)v);\n\t\tif (v) {\nLABEL_PARTIAL:\n\t\t\t*nmsedec += opj_t1_getnmsedec_sig((OPJ_UINT32)opj_int_abs(*datap), (OPJ_UINT32)(bpno + T1_NMSEDEC_FRACBITS));\n\t\t\topj_mqc_setcurctx(mqc, opj_t1_getctxno_sc(flag));\n\t\t\tv = *datap < 0 ? 1 : 0;\n\t\t\topj_mqc_encode(mqc, (OPJ_UINT32)(v ^ opj_t1_getspb((OPJ_UINT32)flag)));\n\t\t\topj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);\n\t\t}\n\t}\n\t*flagsp &= ~T1_VISIT;\n}\n\nstatic void opj_t1_dec_clnpass_step_partial(\n\t\topj_t1_t *t1,\n\t\topj_flag_t *flagsp,\n\t\tOPJ_INT32 *datap,\n\t\tOPJ_INT32 orient,\n\t\tOPJ_INT32 oneplushalf)\n{\n\tOPJ_INT32 v, flag;\n\topj_mqc_t *mqc = t1->mqc;\t/* MQC component */\n\t\n\tOPJ_ARG_NOT_USED(orient);\n\t\n\tflag = *flagsp;\n\topj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));\n\tv = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);\n\t*datap = v ? -oneplushalf : oneplushalf;\n\topj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);\n\t*flagsp &= ~T1_VISIT;\n}\t\t\t\t/* VSC and  BYPASS by Antonin */\n\nstatic void opj_t1_dec_clnpass_step(\n\t\topj_t1_t *t1,\n\t\topj_flag_t *flagsp,\n\t\tOPJ_INT32 *datap,\n\t\tOPJ_INT32 orient,\n\t\tOPJ_INT32 oneplushalf)\n{\n\tOPJ_INT32 v, flag;\n\t\n\topj_mqc_t *mqc = t1->mqc;\t/* MQC component */\n\t\n\tflag = *flagsp;\n\tif (!(flag & (T1_SIG | T1_VISIT))) {\n\t\topj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient));\n\t\tif (opj_mqc_decode(mqc)) {\n\t\t\topj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));\n\t\t\tv = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);\n\t\t\t*datap = v ? -oneplushalf : oneplushalf;\n\t\t\topj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);\n\t\t}\n\t}\n\t*flagsp &= ~T1_VISIT;\n}\t\t\t\t/* VSC and  BYPASS by Antonin */\n\nstatic void opj_t1_dec_clnpass_step_vsc(\n\t\topj_t1_t *t1,\n\t\topj_flag_t *flagsp,\n\t\tOPJ_INT32 *datap,\n\t\tOPJ_INT32 orient,\n\t\tOPJ_INT32 oneplushalf,\n\t\tOPJ_INT32 partial,\n\t\tOPJ_INT32 vsc)\n{\n\tOPJ_INT32 v, flag;\n\t\n\topj_mqc_t *mqc = t1->mqc;\t/* MQC component */\n\t\n\tflag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);\n\tif (partial) {\n\t\tgoto LABEL_PARTIAL;\n\t}\n\tif (!(flag & (T1_SIG | T1_VISIT))) {\n\t\topj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient));\n\t\tif (opj_mqc_decode(mqc)) {\nLABEL_PARTIAL:\n\t\t\topj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));\n\t\t\tv = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);\n\t\t\t*datap = v ? -oneplushalf : oneplushalf;\n\t\t\topj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);\n\t\t}\n\t}\n\t*flagsp &= ~T1_VISIT;\n}\n\nvoid opj_t1_enc_clnpass(\n\t\topj_t1_t *t1,\n\t\tOPJ_INT32 bpno,\n\t\tOPJ_UINT32 orient,\n\t\tOPJ_INT32 *nmsedec,\n\t\tOPJ_UINT32 cblksty)\n{\n\tOPJ_UINT32 i, j, k;\n\tOPJ_INT32 one;\n\tOPJ_UINT32 agg, runlen, vsc;\n\t\n\topj_mqc_t *mqc = t1->mqc;\t/* MQC component */\n\t\n\t*nmsedec = 0;\n\tone = 1 << (bpno + T1_NMSEDEC_FRACBITS);\n\tfor (k = 0; k < t1->h; k += 4) {\n\t\tfor (i = 0; i < t1->w; ++i) {\n\t\t\tif (k + 3 < t1->h) {\n\t\t\t\tif (cblksty & J2K_CCP_CBLKSTY_VSC) {\n\t\t\t\t\tagg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)\n\t\t\t\t\t\t|| MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)\n\t\t\t\t\t\t|| MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)\n\t\t\t\t\t\t|| (MACRO_t1_flags(1 + k + 3,1 + i) \n\t\t\t\t\t\t& (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW |\tT1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH));\n\t\t\t\t} else {\n\t\t\t\t\tagg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)\n\t\t\t\t\t\t|| MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)\n\t\t\t\t\t\t|| MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)\n\t\t\t\t\t\t|| MACRO_t1_flags(1 + k + 3,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tagg = 0;\n\t\t\t}\n\t\t\tif (agg) {\n\t\t\t\tfor (runlen = 0; runlen < 4; ++runlen) {\n\t\t\t\t\tif (opj_int_abs(t1->data[((k + runlen)*t1->w) + i]) & one)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\topj_mqc_setcurctx(mqc, T1_CTXNO_AGG);\n\t\t\t\topj_mqc_encode(mqc, runlen != 4);\n\t\t\t\tif (runlen == 4) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\topj_mqc_setcurctx(mqc, T1_CTXNO_UNI);\n\t\t\t\topj_mqc_encode(mqc, runlen >> 1);\n\t\t\t\topj_mqc_encode(mqc, runlen & 1);\n\t\t\t} else {\n\t\t\t\trunlen = 0;\n\t\t\t}\n\t\t\tfor (j = k + runlen; j < k + 4 && j < t1->h; ++j) {\n\t\t\t\tvsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;\n\t\t\t\topj_t1_enc_clnpass_step(\n\t\t\t\t\t\tt1,\n\t\t\t\t\t\t&t1->flags[((j+1) * t1->flags_stride) + i + 1],\n\t\t\t\t\t\t&t1->data[(j * t1->w) + i],\n\t\t\t\t\t\torient,\n\t\t\t\t\t\tbpno,\n\t\t\t\t\t\tone,\n\t\t\t\t\t\tnmsedec,\n\t\t\t\t\t\tagg && (j == k + runlen),\n\t\t\t\t\t\tvsc);\n\t\t\t}\n\t\t}\n\t}\n}\n\nstatic void opj_t1_dec_clnpass(\n\t\topj_t1_t *t1,\n\t\tOPJ_INT32 bpno,\n\t\tOPJ_INT32 orient,\n\t\tOPJ_INT32 cblksty)\n{\n\tOPJ_INT32 one, half, oneplushalf, agg, runlen, vsc;\n    OPJ_UINT32 i, j, k;\n\tOPJ_INT32 segsym = cblksty & J2K_CCP_CBLKSTY_SEGSYM;\n\t\n\topj_mqc_t *mqc = t1->mqc;\t/* MQC component */\n\t\n\tone = 1 << bpno;\n\thalf = one >> 1;\n\toneplushalf = one | half;\n\tif (cblksty & J2K_CCP_CBLKSTY_VSC) {\n\tfor (k = 0; k < t1->h; k += 4) {\n\t\tfor (i = 0; i < t1->w; ++i) {\n\t\t\tif (k + 3 < t1->h) {\n\t\t\t\t\tagg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)\n\t\t\t\t\t\t|| MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)\n\t\t\t\t\t\t|| MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)\n\t\t\t\t\t\t|| (MACRO_t1_flags(1 + k + 3,1 + i) \n\t\t\t\t\t\t& (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW |\tT1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH));\n\t\t\t\t} else {\n\t\t\t\tagg = 0;\n\t\t\t}\n\t\t\tif (agg) {\n\t\t\t\topj_mqc_setcurctx(mqc, T1_CTXNO_AGG);\n\t\t\t\tif (!opj_mqc_decode(mqc)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\topj_mqc_setcurctx(mqc, T1_CTXNO_UNI);\n\t\t\t\trunlen = opj_mqc_decode(mqc);\n\t\t\t\trunlen = (runlen << 1) | opj_mqc_decode(mqc);\n\t\t\t} else {\n\t\t\t\trunlen = 0;\n\t\t\t}\n\t\t\tfor (j = k + (OPJ_UINT32)runlen; j < k + 4 && j < t1->h; ++j) {\n\t\t\t\t\tvsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0;\n\t\t\t\t\topj_t1_dec_clnpass_step_vsc(\n\t\t\t\t\t\tt1,\n\t\t\t\t\t\t&t1->flags[((j+1) * t1->flags_stride) + i + 1],\n\t\t\t\t\t\t&t1->data[(j * t1->w) + i],\n\t\t\t\t\t\torient,\n\t\t\t\t\t\toneplushalf,\n\t\t\t\t\t\tagg && (j == k + (OPJ_UINT32)runlen),\n\t\t\t\t\t\tvsc);\n\t\t\t}\n\t\t}\n\t}\n\t} else {\n\t\tOPJ_INT32 *data1 = t1->data;\n\t\topj_flag_t *flags1 = &t1->flags[1];\n\t\tfor (k = 0; k < (t1->h & ~3u); k += 4) {\n\t\t\tfor (i = 0; i < t1->w; ++i) {\n\t\t\t\tOPJ_INT32 *data2 = data1 + i;\n\t\t\t\topj_flag_t *flags2 = flags1 + i;\n\t\t\t\tagg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)\n\t\t\t\t\t|| MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)\n\t\t\t\t\t|| MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)\n\t\t\t\t\t|| MACRO_t1_flags(1 + k + 3,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH));\n\t\t\t\tif (agg) {\n\t\t\t\t\topj_mqc_setcurctx(mqc, T1_CTXNO_AGG);\n\t\t\t\t\tif (!opj_mqc_decode(mqc)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\topj_mqc_setcurctx(mqc, T1_CTXNO_UNI);\n\t\t\t\t\trunlen = opj_mqc_decode(mqc);\n\t\t\t\t\trunlen = (runlen << 1) | opj_mqc_decode(mqc);\n\t\t\t\t\tflags2 += (OPJ_UINT32)runlen * t1->flags_stride;\n\t\t\t\t\tdata2 += (OPJ_UINT32)runlen * t1->w;\n\t\t\t\t\tfor (j = k + (OPJ_UINT32)runlen; j < k + 4 && j < t1->h; ++j) {\n\t\t\t\t\t\tflags2 += t1->flags_stride;\n\t\t\t\t\t\tif (agg && (j == k + (OPJ_UINT32)runlen)) {\n\t\t\t\t\t\t\topj_t1_dec_clnpass_step_partial(t1, flags2, data2, orient, oneplushalf);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\topj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdata2 += t1->w;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tflags2 += t1->flags_stride;\n\t\t\t\t\topj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);\n\t\t\t\t\tdata2 += t1->w;\n\t\t\t\t\tflags2 += t1->flags_stride;\n\t\t\t\t\topj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);\n\t\t\t\t\tdata2 += t1->w;\n\t\t\t\t\tflags2 += t1->flags_stride;\n\t\t\t\t\topj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);\n\t\t\t\t\tdata2 += t1->w;\n\t\t\t\t\tflags2 += t1->flags_stride;\n\t\t\t\t\topj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);\n\t\t\t\t\tdata2 += t1->w;\n\t\t\t\t}\n\t\t\t}\n\t\t\tdata1 += t1->w << 2;\n\t\t\tflags1 += t1->flags_stride << 2;\n\t\t}\n\t\tfor (i = 0; i < t1->w; ++i) {\n\t\t\tOPJ_INT32 *data2 = data1 + i;\n\t\t\topj_flag_t *flags2 = flags1 + i;\n\t\t\tfor (j = k; j < t1->h; ++j) {\n\t\t\t\tflags2 += t1->flags_stride;\n\t\t\t\topj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);\n\t\t\t\tdata2 += t1->w;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (segsym) {\n\t\tOPJ_INT32 v = 0;\n\t\topj_mqc_setcurctx(mqc, T1_CTXNO_UNI);\n\t\tv = opj_mqc_decode(mqc);\n\t\tv = (v << 1) | opj_mqc_decode(mqc);\n\t\tv = (v << 1) | opj_mqc_decode(mqc);\n\t\tv = (v << 1) | opj_mqc_decode(mqc);\n\t\t/*\n\t\tif (v!=0xa) {\n\t\t\topj_event_msg(t1->cinfo, EVT_WARNING, \"Bad segmentation symbol %x\\n\", v);\n\t\t} \n\t\t*/\n\t}\n}\t\t\t\t/* VSC and  BYPASS by Antonin */\n\n\n/** mod fixed_quality */\nstatic OPJ_FLOAT64 opj_t1_getwmsedec(\n\t\tOPJ_INT32 nmsedec,\n\t\tOPJ_UINT32 compno,\n\t\tOPJ_UINT32 level,\n\t\tOPJ_UINT32 orient,\n\t\tOPJ_INT32 bpno,\n\t\tOPJ_UINT32 qmfbid,\n\t\tOPJ_FLOAT64 stepsize,\n\t\tOPJ_UINT32 numcomps,\n\t\tconst OPJ_FLOAT64 * mct_norms)\n{\n\tOPJ_FLOAT64 w1 = 1, w2, wmsedec;\n    OPJ_ARG_NOT_USED(numcomps);\n\n\tif (mct_norms) {\n\t\tw1 = mct_norms[compno];\n\t}\n\n\tif (qmfbid == 1) {\n\t\tw2 = opj_dwt_getnorm(level, orient);\n\t} else {\t/* if (qmfbid == 0) */\n\t\tw2 = opj_dwt_getnorm_real(level, orient);\n\t}\n\n\twmsedec = w1 * w2 * stepsize * (1 << bpno);\n\twmsedec *= wmsedec * nmsedec / 8192.0;\n\n\treturn wmsedec;\n}\n\nOPJ_BOOL opj_t1_allocate_buffers(\n\t\topj_t1_t *t1,\n\t\tOPJ_UINT32 w,\n\t\tOPJ_UINT32 h)\n{\n\tOPJ_UINT32 datasize=w * h;\n\tOPJ_UINT32 flagssize;\n\n\tif(datasize > t1->datasize){\n\t\topj_aligned_free(t1->data);\n\t\tt1->data = (OPJ_INT32*) opj_aligned_malloc(datasize * sizeof(OPJ_INT32));\n\t\tif(!t1->data){\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\t\tt1->datasize=datasize;\n\t}\n\tmemset(t1->data,0,datasize * sizeof(OPJ_INT32));\n\n\tt1->flags_stride=w+2;\n\tflagssize=t1->flags_stride * (h+2);\n\n\tif(flagssize > t1->flagssize){\n\t\topj_aligned_free(t1->flags);\n\t\tt1->flags = (opj_flag_t*) opj_aligned_malloc(flagssize * sizeof(opj_flag_t));\n\t\tif(!t1->flags){\n\t\t\treturn OPJ_FALSE;\n\t\t}\n\t\tt1->flagssize=flagssize;\n\t}\n\tmemset(t1->flags,0,flagssize * sizeof(opj_flag_t));\n\n\tt1->w=w;\n\tt1->h=h;\n\n\treturn OPJ_TRUE;\n}\n\n/* ----------------------------------------------------------------------- */\n\n/* ----------------------------------------------------------------------- */\n/**\n * Creates a new Tier 1 handle\n * and initializes the look-up tables of the Tier-1 coder/decoder\n * @return a new T1 handle if successful, returns NULL otherwise\n*/\nopj_t1_t* opj_t1_create()\n{\n\topj_t1_t *l_t1 = 00;\n\n\tl_t1 = (opj_t1_t*) opj_malloc(sizeof(opj_t1_t));\n\tif (!l_t1) {\n\t\treturn 00;\n\t}\n\tmemset(l_t1,0,sizeof(opj_t1_t));\n\n\t/* create MQC and RAW handles */\n\tl_t1->mqc = opj_mqc_create();\n\tif (! l_t1->mqc) {\n\t\topj_t1_destroy(l_t1);\n\t\treturn 00;\n\t}\n\n\tl_t1->raw = opj_raw_create();\n\tif (! l_t1->raw) {\n\t\topj_t1_destroy(l_t1);\n\t\treturn 00;\n\t}\n\n\treturn l_t1;\n}\n\n\n/**\n * Destroys a previously created T1 handle\n *\n * @param p_t1 Tier 1 handle to destroy\n*/\nvoid opj_t1_destroy(opj_t1_t *p_t1)\n{\n\tif (! p_t1) {\n\t\treturn;\n\t}\n\n\t/* destroy MQC and RAW handles */\n\topj_mqc_destroy(p_t1->mqc);\n\tp_t1->mqc = 00;\n\topj_raw_destroy(p_t1->raw);\n\tp_t1->raw = 00;\n\t\n    if (p_t1->data) {\n\t\topj_aligned_free(p_t1->data);\n\t\tp_t1->data = 00;\n\t}\n\n\tif (p_t1->flags) {\n\t\topj_aligned_free(p_t1->flags);\n\t\tp_t1->flags = 00;\n\t}\n\n\topj_free(p_t1);\n}\n\nOPJ_BOOL opj_t1_decode_cblks(   opj_t1_t* t1,\n                            opj_tcd_tilecomp_t* tilec,\n                            opj_tccp_t* tccp\n                            )\n{\n\tOPJ_UINT32 resno, bandno, precno, cblkno;\n\tOPJ_UINT32 tile_w = (OPJ_UINT32)(tilec->x1 - tilec->x0);\n\n\tfor (resno = 0; resno < tilec->minimum_num_resolutions; ++resno) {\n\t\topj_tcd_resolution_t* res = &tilec->resolutions[resno];\n\n\t\tfor (bandno = 0; bandno < res->numbands; ++bandno) {\n\t\t\topj_tcd_band_t* restrict band = &res->bands[bandno];\n\n\t\t\tfor (precno = 0; precno < res->pw * res->ph; ++precno) {\n\t\t\t\topj_tcd_precinct_t* precinct = &band->precincts[precno];\n\n\t\t\t\tfor (cblkno = 0; cblkno < precinct->cw * precinct->ch; ++cblkno) {\n\t\t\t\t\topj_tcd_cblk_dec_t* cblk = &precinct->cblks.dec[cblkno];\n\t\t\t\t\tOPJ_INT32* restrict datap;\n\t\t\t\t\t/*void* restrict tiledp;*/\n\t\t\t\t\tOPJ_UINT32 cblk_w, cblk_h;\n\t\t\t\t\tOPJ_INT32 x, y;\n\t\t\t\t\tOPJ_UINT32 i, j;\n\n                    if (OPJ_FALSE == opj_t1_decode_cblk(\n                                            t1,\n                                            cblk,\n                                            band->bandno,\n                                            (OPJ_UINT32)tccp->roishift,\n                                            tccp->cblksty)) {\n                            return OPJ_FALSE;\n                    }\n\n\t\t\t\t\tx = cblk->x0 - band->x0;\n\t\t\t\t\ty = cblk->y0 - band->y0;\n\t\t\t\t\tif (band->bandno & 1) {\n\t\t\t\t\t\topj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1];\n\t\t\t\t\t\tx += pres->x1 - pres->x0;\n\t\t\t\t\t}\n\t\t\t\t\tif (band->bandno & 2) {\n\t\t\t\t\t\topj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1];\n\t\t\t\t\t\ty += pres->y1 - pres->y0;\n\t\t\t\t\t}\n\n\t\t\t\t\tdatap=t1->data;\n\t\t\t\t\tcblk_w = t1->w;\n\t\t\t\t\tcblk_h = t1->h;\n\n\t\t\t\t\tif (tccp->roishift) {\n\t\t\t\t\t\tOPJ_INT32 thresh = 1 << tccp->roishift;\n\t\t\t\t\t\tfor (j = 0; j < cblk_h; ++j) {\n\t\t\t\t\t\t\tfor (i = 0; i < cblk_w; ++i) {\n\t\t\t\t\t\t\t\tOPJ_INT32 val = datap[(j * cblk_w) + i];\n\t\t\t\t\t\t\t\tOPJ_INT32 mag = abs(val);\n\t\t\t\t\t\t\t\tif (mag >= thresh) {\n\t\t\t\t\t\t\t\t\tmag >>= tccp->roishift;\n\t\t\t\t\t\t\t\t\tdatap[(j * cblk_w) + i] = val < 0 ? -mag : mag;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/*tiledp=(void*)&tilec->data[(y * tile_w) + x];*/\n\t\t\t\t\tif (tccp->qmfbid == 1) {\n                        OPJ_INT32* restrict tiledp = &tilec->data[(OPJ_UINT32)y * tile_w + (OPJ_UINT32)x];\n\t\t\t\t\t\tfor (j = 0; j < cblk_h; ++j) {\n\t\t\t\t\t\t\tfor (i = 0; i < cblk_w; ++i) {\n\t\t\t\t\t\t\t\tOPJ_INT32 tmp = datap[(j * cblk_w) + i];\n\t\t\t\t\t\t\t\t((OPJ_INT32*)tiledp)[(j * tile_w) + i] = tmp / 2;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\t\t/* if (tccp->qmfbid == 0) */\n                        OPJ_FLOAT32* restrict tiledp = (OPJ_FLOAT32*) &tilec->data[(OPJ_UINT32)y * tile_w + (OPJ_UINT32)x];\n\t\t\t\t\t\tfor (j = 0; j < cblk_h; ++j) {\n                            OPJ_FLOAT32* restrict tiledp2 = tiledp;\n\t\t\t\t\t\t\tfor (i = 0; i < cblk_w; ++i) {\n                                OPJ_FLOAT32 tmp = (OPJ_FLOAT32)*datap * band->stepsize;\n                                *tiledp2 = tmp;\n                                datap++;\n                                tiledp2++;\n\t\t\t\t\t\t\t\t/*float tmp = datap[(j * cblk_w) + i] * band->stepsize;\n\t\t\t\t\t\t\t\t((float*)tiledp)[(j * tile_w) + i] = tmp;*/\n\n\t\t\t\t\t\t\t}\n                            tiledp += tile_w;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n                    /*opj_free(cblk->data);\n\t\t\t\t\topj_free(cblk->segs);*/\n\t\t\t\t\t/*cblk->segs = 00;*/\n\t\t\t\t} /* cblkno */\n                /*opj_free(precinct->cblks.dec);*/\n\t\t\t} /* precno */\n\t\t} /* bandno */\n\t} /* resno */\n        return OPJ_TRUE;\n}\n\n\nOPJ_BOOL opj_t1_decode_cblk(opj_t1_t *t1,\n                            opj_tcd_cblk_dec_t* cblk,\n                            OPJ_UINT32 orient,\n                            OPJ_UINT32 roishift,\n                            OPJ_UINT32 cblksty)\n{\n\topj_raw_t *raw = t1->raw;\t/* RAW component */\n\topj_mqc_t *mqc = t1->mqc;\t/* MQC component */\n\n\tOPJ_INT32 bpno;\n\tOPJ_UINT32 passtype;\n\tOPJ_UINT32 segno, passno;\n\tOPJ_BYTE type = T1_TYPE_MQ; /* BYPASS mode */\n\n\tif(!opj_t1_allocate_buffers(\n\t\t\t\tt1,\n\t\t\t\t(OPJ_UINT32)(cblk->x1 - cblk->x0),\n\t\t\t\t(OPJ_UINT32)(cblk->y1 - cblk->y0)))\n\t{\n\t\treturn OPJ_FALSE;\n\t}\n\n\tbpno = (OPJ_INT32)(roishift + cblk->numbps - 1);\n\tpasstype = 2;\n\n\topj_mqc_resetstates(mqc);\n\topj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);\n\topj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);\n\topj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);\n\n\tfor (segno = 0; segno < cblk->real_num_segs; ++segno) {\n\t\topj_tcd_seg_t *seg = &cblk->segs[segno];\n\n\t\t/* BYPASS mode */\n\t\ttype = ((bpno <= ((OPJ_INT32) (cblk->numbps) - 1) - 4) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;\n\t\t/* FIXME: slviewer gets here with a null pointer. Why? Partially downloaded and/or corrupt textures? */\n\t\tif(seg->data == 00){\n\t\t\tcontinue;\n\t\t}\n\t\tif (type == T1_TYPE_RAW) {\n\t\t\topj_raw_init_dec(raw, (*seg->data) + seg->dataindex, seg->len);\n\t\t} else {\n            if (OPJ_FALSE == opj_mqc_init_dec(mqc, (*seg->data) + seg->dataindex, seg->len)) {\n                    return OPJ_FALSE;\n            }\n\t\t}\n\n\t\tfor (passno = 0; passno < seg->real_num_passes; ++passno) {\n            switch (passtype) {\n                case 0:\n                    if (type == T1_TYPE_RAW) {\n                        opj_t1_dec_sigpass_raw(t1, bpno+1, (OPJ_INT32)orient, (OPJ_INT32)cblksty);\n                    } else {\n                        if (cblksty & J2K_CCP_CBLKSTY_VSC) {\n                            opj_t1_dec_sigpass_mqc_vsc(t1, bpno+1, (OPJ_INT32)orient);\n                        } else {\n                            opj_t1_dec_sigpass_mqc(t1, bpno+1, (OPJ_INT32)orient);\n                        }\n                    }\n                    break;\n                case 1:\n                    if (type == T1_TYPE_RAW) {\n                            opj_t1_dec_refpass_raw(t1, bpno+1, (OPJ_INT32)cblksty);\n                    } else {\n                        if (cblksty & J2K_CCP_CBLKSTY_VSC) {\n                            opj_t1_dec_refpass_mqc_vsc(t1, bpno+1);\n                        } else {\n                            opj_t1_dec_refpass_mqc(t1, bpno+1);\n                        }\n                    }\n                    break;\n                case 2:\n                    opj_t1_dec_clnpass(t1, bpno+1, (OPJ_INT32)orient, (OPJ_INT32)cblksty);\n                    break;\n            }\n\n\t\t\tif ((cblksty & J2K_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) {\n\t\t\t\topj_mqc_resetstates(mqc);\n\t\t\t\topj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);\n\t\t\t\topj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);\n\t\t\t\topj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);\n\t\t\t}\n\t\t\tif (++passtype == 3) {\n\t\t\t\tpasstype = 0;\n\t\t\t\tbpno--;\n\t\t\t}\n\t\t}\n\t}\n        return OPJ_TRUE;\n}\n\n\n\n\nOPJ_BOOL opj_t1_encode_cblks(   opj_t1_t *t1,\n                                opj_tcd_tile_t *tile,\n                                opj_tcp_t *tcp,\n                                const OPJ_FLOAT64 * mct_norms\n                                )\n{\n\tOPJ_UINT32 compno, resno, bandno, precno, cblkno;\n\n\ttile->distotile = 0;\t\t/* fixed_quality */\n\n\tfor (compno = 0; compno < tile->numcomps; ++compno) {\n\t\topj_tcd_tilecomp_t* tilec = &tile->comps[compno];\n\t\topj_tccp_t* tccp = &tcp->tccps[compno];\n\t\tOPJ_UINT32 tile_w = (OPJ_UINT32)(tilec->x1 - tilec->x0);\n\n\t\tfor (resno = 0; resno < tilec->numresolutions; ++resno) {\n\t\t\topj_tcd_resolution_t *res = &tilec->resolutions[resno];\n\n\t\t\tfor (bandno = 0; bandno < res->numbands; ++bandno) {\n\t\t\t\topj_tcd_band_t* restrict band = &res->bands[bandno];\n                OPJ_INT32 bandconst = 8192 * 8192 / ((OPJ_INT32) floor(band->stepsize * 8192));\n\n\t\t\t\tfor (precno = 0; precno < res->pw * res->ph; ++precno) {\n\t\t\t\t\topj_tcd_precinct_t *prc = &band->precincts[precno];\n\n\t\t\t\t\tfor (cblkno = 0; cblkno < prc->cw * prc->ch; ++cblkno) {\n\t\t\t\t\t\topj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];\n\t\t\t\t\t\tOPJ_INT32 * restrict datap;\n\t\t\t\t\t\tOPJ_INT32* restrict tiledp;\n\t\t\t\t\t\tOPJ_UINT32 cblk_w;\n\t\t\t\t\t\tOPJ_UINT32 cblk_h;\n\t\t\t\t\t\tOPJ_UINT32 i, j;\n\n\t\t\t\t\t\tOPJ_INT32 x = cblk->x0 - band->x0;\n\t\t\t\t\t\tOPJ_INT32 y = cblk->y0 - band->y0;\n\t\t\t\t\t\tif (band->bandno & 1) {\n\t\t\t\t\t\t\topj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];\n\t\t\t\t\t\t\tx += pres->x1 - pres->x0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (band->bandno & 2) {\n\t\t\t\t\t\t\topj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];\n\t\t\t\t\t\t\ty += pres->y1 - pres->y0;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(!opj_t1_allocate_buffers(\n\t\t\t\t\t\t\t\t\tt1,\n\t\t\t\t\t\t\t\t\t(OPJ_UINT32)(cblk->x1 - cblk->x0),\n\t\t\t\t\t\t\t\t\t(OPJ_UINT32)(cblk->y1 - cblk->y0)))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn OPJ_FALSE;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdatap=t1->data;\n\t\t\t\t\t\tcblk_w = t1->w;\n\t\t\t\t\t\tcblk_h = t1->h;\n\n\t\t\t\t\t\ttiledp=&tilec->data[(OPJ_UINT32)y * tile_w + (OPJ_UINT32)x];\n\t\t\t\t\t\tif (tccp->qmfbid == 1) {\n\t\t\t\t\t\t\tfor (j = 0; j < cblk_h; ++j) {\n\t\t\t\t\t\t\t\tfor (i = 0; i < cblk_w; ++i) {\n\t\t\t\t\t\t\t\t\tOPJ_INT32 tmp = tiledp[(j * tile_w) + i];\n\t\t\t\t\t\t\t\t\tdatap[(j * cblk_w) + i] = tmp << T1_NMSEDEC_FRACBITS;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\t\t/* if (tccp->qmfbid == 0) */\n\t\t\t\t\t\t\tfor (j = 0; j < cblk_h; ++j) {\n\t\t\t\t\t\t\t\tfor (i = 0; i < cblk_w; ++i) {\n\t\t\t\t\t\t\t\t\tOPJ_INT32 tmp = tiledp[(j * tile_w) + i];\n\t\t\t\t\t\t\t\t\tdatap[(j * cblk_w) + i] =\n\t\t\t\t\t\t\t\t\t\topj_int_fix_mul(\n\t\t\t\t\t\t\t\t\t\ttmp,\n\t\t\t\t\t\t\t\t\t\tbandconst) >> (11 - T1_NMSEDEC_FRACBITS);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\topj_t1_encode_cblk(\n\t\t\t\t\t\t\t\tt1,\n\t\t\t\t\t\t\t\tcblk,\n\t\t\t\t\t\t\t\tband->bandno,\n\t\t\t\t\t\t\t\tcompno,\n\t\t\t\t\t\t\t\ttilec->numresolutions - 1 - resno,\n\t\t\t\t\t\t\t\ttccp->qmfbid,\n\t\t\t\t\t\t\t\tband->stepsize,\n\t\t\t\t\t\t\t\ttccp->cblksty,\n\t\t\t\t\t\t\t\ttile->numcomps,\n\t\t\t\t\t\t\t\ttile,\n\t\t\t\t\t\t\t\tmct_norms);\n\n\t\t\t\t\t} /* cblkno */\n\t\t\t\t} /* precno */\n\t\t\t} /* bandno */\n\t\t} /* resno  */\n\t} /* compno  */\n\treturn OPJ_TRUE;\n}\n\n/** mod fixed_quality */\nvoid opj_t1_encode_cblk(opj_t1_t *t1,\n                        opj_tcd_cblk_enc_t* cblk,\n                        OPJ_UINT32 orient,\n                        OPJ_UINT32 compno,\n                        OPJ_UINT32 level,\n                        OPJ_UINT32 qmfbid,\n                        OPJ_FLOAT64 stepsize,\n                        OPJ_UINT32 cblksty,\n                        OPJ_UINT32 numcomps,\n                        opj_tcd_tile_t * tile,\n                        const OPJ_FLOAT64 * mct_norms)\n{\n\tOPJ_FLOAT64 cumwmsedec = 0.0;\n\n\topj_mqc_t *mqc = t1->mqc;\t/* MQC component */\n\n\tOPJ_UINT32 passno;\n\tOPJ_INT32 bpno;\n\tOPJ_UINT32 passtype;\n\tOPJ_INT32 nmsedec = 0;\n\tOPJ_INT32 max;\n\tOPJ_UINT32 i;\n\tOPJ_BYTE type = T1_TYPE_MQ;\n\tOPJ_FLOAT64 tempwmsedec;\n\n\tmax = 0;\n\tfor (i = 0; i < t1->w * t1->h; ++i) {\n\t\tOPJ_INT32 tmp = abs(t1->data[i]);\n\t\tmax = opj_int_max(max, tmp);\n\t}\n\n\tcblk->numbps = max ? (OPJ_UINT32)((opj_int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS) : 0;\n\n\tbpno = (OPJ_INT32)(cblk->numbps - 1);\n\tpasstype = 2;\n\n\topj_mqc_resetstates(mqc);\n\topj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);\n\topj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);\n\topj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);\n\topj_mqc_init_enc(mqc, cblk->data);\n\n\tfor (passno = 0; bpno >= 0; ++passno) {\n\t\topj_tcd_pass_t *pass = &cblk->passes[passno];\n\t\tOPJ_UINT32 correction = 3;\n\t\ttype = ((bpno < ((OPJ_INT32) (cblk->numbps) - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;\n\n\t\tswitch (passtype) {\n\t\t\tcase 0:\n\t\t\t\topj_t1_enc_sigpass(t1, bpno, orient, &nmsedec, type, cblksty);\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\topj_t1_enc_refpass(t1, bpno, &nmsedec, type, cblksty);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\topj_t1_enc_clnpass(t1, bpno, orient, &nmsedec, cblksty);\n\t\t\t\t/* code switch SEGMARK (i.e. SEGSYM) */\n\t\t\t\tif (cblksty & J2K_CCP_CBLKSTY_SEGSYM)\n\t\t\t\t\topj_mqc_segmark_enc(mqc);\n\t\t\t\tbreak;\n\t\t}\n\n\t\t/* fixed_quality */\n\t\ttempwmsedec = opj_t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps,mct_norms) ;\n\t\tcumwmsedec += tempwmsedec;\n\t\ttile->distotile += tempwmsedec;\n\n\t\t/* Code switch \"RESTART\" (i.e. TERMALL) */\n\t\tif ((cblksty & J2K_CCP_CBLKSTY_TERMALL)\t&& !((passtype == 2) && (bpno - 1 < 0))) {\n\t\t\tif (type == T1_TYPE_RAW) {\n\t\t\t\topj_mqc_flush(mqc);\n\t\t\t\tcorrection = 1;\n\t\t\t\t/* correction = mqc_bypass_flush_enc(); */\n\t\t\t} else {\t\t\t/* correction = mqc_restart_enc(); */\n\t\t\t\topj_mqc_flush(mqc);\n\t\t\t\tcorrection = 1;\n\t\t\t}\n\t\t\tpass->term = 1;\n\t\t} else {\n\t\t\tif (((bpno < ((OPJ_INT32) (cblk->numbps) - 4) && (passtype > 0))\n\t\t\t\t|| ((bpno == ((OPJ_INT32)cblk->numbps - 4)) && (passtype == 2))) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) {\n\t\t\t\tif (type == T1_TYPE_RAW) {\n\t\t\t\t\topj_mqc_flush(mqc);\n\t\t\t\t\tcorrection = 1;\n\t\t\t\t\t/* correction = mqc_bypass_flush_enc(); */\n\t\t\t\t} else {\t\t/* correction = mqc_restart_enc(); */\n\t\t\t\t\topj_mqc_flush(mqc);\n\t\t\t\t\tcorrection = 1;\n\t\t\t\t}\n\t\t\t\tpass->term = 1;\n\t\t\t} else {\n\t\t\t\tpass->term = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (++passtype == 3) {\n\t\t\tpasstype = 0;\n\t\t\tbpno--;\n\t\t}\n\n\t\tif (pass->term && bpno > 0) {\n\t\t\ttype = ((bpno < ((OPJ_INT32) (cblk->numbps) - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;\n\t\t\tif (type == T1_TYPE_RAW)\n\t\t\t\topj_mqc_bypass_init_enc(mqc);\n\t\t\telse\n\t\t\t\topj_mqc_restart_init_enc(mqc);\n\t\t}\n\n\t\tpass->distortiondec = cumwmsedec;\n\t\tpass->rate = opj_mqc_numbytes(mqc) + correction;\t/* FIXME */\n\n\t\t/* Code-switch \"RESET\" */\n\t\tif (cblksty & J2K_CCP_CBLKSTY_RESET)\n\t\t\topj_mqc_reset_enc(mqc);\n\t}\n\n\t/* Code switch \"ERTERM\" (i.e. PTERM) */\n\tif (cblksty & J2K_CCP_CBLKSTY_PTERM)\n\t\topj_mqc_erterm_enc(mqc);\n\telse /* Default coding */ if (!(cblksty & J2K_CCP_CBLKSTY_LAZY))\n\t\topj_mqc_flush(mqc);\n\n\tcblk->totalpasses = passno;\n\n\tfor (passno = 0; passno<cblk->totalpasses; passno++) {\n\t\topj_tcd_pass_t *pass = &cblk->passes[passno];\n\t\tif (pass->rate > opj_mqc_numbytes(mqc))\n\t\t\tpass->rate = opj_mqc_numbytes(mqc);\n\t\t/*Preventing generation of FF as last data byte of a pass*/\n\t\tif((pass->rate>1) && (cblk->data[pass->rate - 1] == 0xFF)){\n\t\t\tpass->rate--;\n\t\t}\n\t\tpass->len = pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate);\n\t}\n}\n\n#if 0\nvoid opj_t1_dec_refpass_step(   opj_t1_t *t1,\n                                opj_flag_t *flagsp,\n                                OPJ_INT32 *datap,\n                                OPJ_INT32 poshalf,\n                                OPJ_INT32 neghalf,\n                                OPJ_BYTE type,\n                                OPJ_UINT32 vsc)\n{\n\tOPJ_INT32  t;\n\tOPJ_UINT32 v,flag;\n\n\topj_mqc_t *mqc = t1->mqc;\t/* MQC component */\n\topj_raw_t *raw = t1->raw;\t/* RAW component */\n\n\tflag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);\n\tif ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {\n\t\topj_mqc_setcurctx(mqc, opj_t1_getctxno_mag(flag));\t/* ESSAI */\n\t\tif (type == T1_TYPE_RAW) {\n\t\t\tv = opj_raw_decode(raw);\n\t\t} else {\n\t\t\tv = opj_mqc_decode(mqc);\n\t\t}\n\t\tt = v ? poshalf : neghalf;\n\t\t*datap += *datap < 0 ? -t : t;\n\t\t*flagsp |= T1_REFINE;\n\t}\n}\t\t\t\t/* VSC and  BYPASS by Antonin  */\n#endif\n\n\n\n#if 0\nvoid opj_t1_dec_sigpass_step(   opj_t1_t *t1,\n                                opj_flag_t *flagsp,\n                                OPJ_INT32 *datap,\n                                OPJ_UINT32 orient,\n                                OPJ_INT32 oneplushalf,\n                                OPJ_BYTE type,\n                                OPJ_UINT32 vsc)\n{\n\tOPJ_UINT32 v, flag;\n\n\topj_raw_t *raw = t1->raw;\t/* RAW component */\n\topj_mqc_t *mqc = t1->mqc;\t/* MQC component */\n\n\tflag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);\n\tif ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {\n\t\tif (type == T1_TYPE_RAW) {\n\t\t\tif (opj_raw_decode(raw)) {\n\t\t\t\tv = opj_raw_decode(raw);\t/* ESSAI */\n\t\t\t\t*datap = v ? -oneplushalf : oneplushalf;\n\t\t\t\topj_t1_updateflags(flagsp, v, t1->flags_stride);\n\t\t\t}\n\t\t} else {\n\t\t\topj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(flag, orient));\n\t\t\tif (opj_mqc_decode(mqc)) {\n\t\t\t\topj_mqc_setcurctx(mqc, opj_t1_getctxno_sc(flag));\n\t\t\t\tv = opj_mqc_decode(mqc) ^ opj_t1_getspb(flag);\n\t\t\t\t*datap = v ? -oneplushalf : oneplushalf;\n\t\t\t\topj_t1_updateflags(flagsp, v, t1->flags_stride);\n\t\t\t}\n\t\t}\n\t\t*flagsp |= T1_VISIT;\n\t}\n}\t\t\t\t/* VSC and  BYPASS by Antonin */\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1.h",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2001-2003, David Janssens\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef __T1_H\n#define __T1_H\n/**\n@file t1.h\n@brief Implementation of the tier-1 coding (coding of code-block coefficients) (T1)\n\nThe functions in T1.C have for goal to realize the tier-1 coding operation. The functions\nin T1.C are used by some function in TCD.C.\n*/\n\n/** @defgroup T1 T1 - Implementation of the tier-1 coding */\n/*@{*/\n\n/* ----------------------------------------------------------------------- */\n#define T1_NMSEDEC_BITS 7\n\n#define T1_SIG_NE 0x0001\t/**< Context orientation : North-East direction */\n#define T1_SIG_SE 0x0002\t/**< Context orientation : South-East direction */\n#define T1_SIG_SW 0x0004\t/**< Context orientation : South-West direction */\n#define T1_SIG_NW 0x0008\t/**< Context orientation : North-West direction */\n#define T1_SIG_N 0x0010\t\t/**< Context orientation : North direction */\n#define T1_SIG_E 0x0020\t\t/**< Context orientation : East direction */\n#define T1_SIG_S 0x0040\t\t/**< Context orientation : South direction */\n#define T1_SIG_W 0x0080\t\t/**< Context orientation : West direction */\n#define T1_SIG_OTH (T1_SIG_N|T1_SIG_NE|T1_SIG_E|T1_SIG_SE|T1_SIG_S|T1_SIG_SW|T1_SIG_W|T1_SIG_NW)\n#define T1_SIG_PRIM (T1_SIG_N|T1_SIG_E|T1_SIG_S|T1_SIG_W)\n\n#define T1_SGN_N 0x0100\n#define T1_SGN_E 0x0200\n#define T1_SGN_S 0x0400\n#define T1_SGN_W 0x0800\n#define T1_SGN (T1_SGN_N|T1_SGN_E|T1_SGN_S|T1_SGN_W)\n\n#define T1_SIG 0x1000\n#define T1_REFINE 0x2000\n#define T1_VISIT 0x4000\n\n#define T1_NUMCTXS_ZC 9\n#define T1_NUMCTXS_SC 5\n#define T1_NUMCTXS_MAG 3\n#define T1_NUMCTXS_AGG 1\n#define T1_NUMCTXS_UNI 1\n\n#define T1_CTXNO_ZC 0\n#define T1_CTXNO_SC (T1_CTXNO_ZC+T1_NUMCTXS_ZC)\n#define T1_CTXNO_MAG (T1_CTXNO_SC+T1_NUMCTXS_SC)\n#define T1_CTXNO_AGG (T1_CTXNO_MAG+T1_NUMCTXS_MAG)\n#define T1_CTXNO_UNI (T1_CTXNO_AGG+T1_NUMCTXS_AGG)\n#define T1_NUMCTXS (T1_CTXNO_UNI+T1_NUMCTXS_UNI)\n\n#define T1_NMSEDEC_FRACBITS (T1_NMSEDEC_BITS-1)\n\n#define T1_TYPE_MQ 0\t/**< Normal coding using entropy coder */\n#define T1_TYPE_RAW 1\t/**< No encoding the information is store under raw format in codestream (mode switch RAW)*/\n\n/* ----------------------------------------------------------------------- */\n\ntypedef OPJ_INT16 opj_flag_t;\n\n/**\nTier-1 coding (coding of code-block coefficients)\n*/\ntypedef struct opj_t1 {\n\n\t/** MQC component */\n\topj_mqc_t *mqc;\n\t/** RAW component */\n\topj_raw_t *raw;\n\n    OPJ_INT32 *data;\n\topj_flag_t *flags;\n\tOPJ_UINT32 w;\n\tOPJ_UINT32 h;\n\tOPJ_UINT32 datasize;\n\tOPJ_UINT32 flagssize;\n\tOPJ_UINT32 flags_stride;\n} opj_t1_t;\n\n#define MACRO_t1_flags(x,y) t1->flags[((x)*(t1->flags_stride))+(y)]\n\n/** @name Exported functions */\n/*@{*/\n/* ----------------------------------------------------------------------- */\n\n/**\nEncode the code-blocks of a tile\n@param t1 T1 handle\n@param tile The tile to encode\n@param tcp Tile coding parameters\n@param mct_norms  FIXME DOC\n*/\nOPJ_BOOL opj_t1_encode_cblks(   opj_t1_t *t1,\n                                opj_tcd_tile_t *tile,\n                                opj_tcp_t *tcp,\n                                const OPJ_FLOAT64 * mct_norms);\n\n/**\nDecode the code-blocks of a tile\n@param t1 T1 handle\n@param tilec The tile to decode\n@param tccp Tile coding parameters\n*/\nOPJ_BOOL opj_t1_decode_cblks(   opj_t1_t* t1,\n                                opj_tcd_tilecomp_t* tilec,\n                                opj_tccp_t* tccp);\n\n\n\n/**\n * Creates a new Tier 1 handle\n * and initializes the look-up tables of the Tier-1 coder/decoder\n * @return a new T1 handle if successful, returns NULL otherwise\n*/\nopj_t1_t* opj_t1_create(void);\n\n/**\n * Destroys a previously created T1 handle\n *\n * @param p_t1 Tier 1 handle to destroy\n*/\nvoid opj_t1_destroy(opj_t1_t *p_t1);\n/* ----------------------------------------------------------------------- */\n/*@}*/\n\n/*@}*/\n\n#endif /* __T1_H */\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1_generate_luts.c",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2001-2003, David Janssens\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"opj_includes.h\"\n\nstatic int t1_init_ctxno_zc(int f, int orient) {\n\tint h, v, d, n, t, hv;\n\tn = 0;\n\th = ((f & T1_SIG_W) != 0) + ((f & T1_SIG_E) != 0);\n\tv = ((f & T1_SIG_N) != 0) + ((f & T1_SIG_S) != 0);\n\td = ((f & T1_SIG_NW) != 0) + ((f & T1_SIG_NE) != 0) + ((f & T1_SIG_SE) != 0) + ((f & T1_SIG_SW) != 0);\n\n\tswitch (orient) {\n\t\tcase 2:\n\t\t\tt = h;\n\t\t\th = v;\n\t\t\tv = t;\n\t\tcase 0:\n\t\tcase 1:\n\t\t\tif (!h) {\n\t\t\t\tif (!v) {\n\t\t\t\t\tif (!d)\n\t\t\t\t\t\tn = 0;\n\t\t\t\t\telse if (d == 1)\n\t\t\t\t\t\tn = 1;\n\t\t\t\t\telse\n\t\t\t\t\t\tn = 2;\n\t\t\t\t} else if (v == 1) {\n\t\t\t\t\tn = 3;\n\t\t\t\t} else {\n\t\t\t\t\tn = 4;\n\t\t\t\t}\n\t\t\t} else if (h == 1) {\n\t\t\t\tif (!v) {\n\t\t\t\t\tif (!d)\n\t\t\t\t\t\tn = 5;\n\t\t\t\t\telse\n\t\t\t\t\t\tn = 6;\n\t\t\t\t} else {\n\t\t\t\t\tn = 7;\n\t\t\t\t}\n\t\t\t} else\n\t\t\t\tn = 8;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\thv = h + v;\n\t\t\tif (!d) {\n\t\t\t\tif (!hv) {\n\t\t\t\t\tn = 0;\n\t\t\t\t} else if (hv == 1) {\n\t\t\t\t\tn = 1;\n\t\t\t\t} else {\n\t\t\t\t\tn = 2;\n\t\t\t\t}\n\t\t\t} else if (d == 1) {\n\t\t\t\tif (!hv) {\n\t\t\t\t\tn = 3;\n\t\t\t\t} else if (hv == 1) {\n\t\t\t\t\tn = 4;\n\t\t\t\t} else {\n\t\t\t\t\tn = 5;\n\t\t\t\t}\n\t\t\t} else if (d == 2) {\n\t\t\t\tif (!hv) {\n\t\t\t\t\tn = 6;\n\t\t\t\t} else {\n\t\t\t\t\tn = 7;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tn = 8;\n\t\t\t}\n\t\t\tbreak;\n\t}\n\n\treturn (T1_CTXNO_ZC + n);\n}\n\nstatic int t1_init_ctxno_sc(int f) {\n\tint hc, vc, n;\n\tn = 0;\n\n\thc = opj_int_min(((f & (T1_SIG_E | T1_SGN_E)) ==\n\t\t\t\tT1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W),\n\t\t\t1) - opj_int_min(((f & (T1_SIG_E | T1_SGN_E)) ==\n\t\t\t\t\t(T1_SIG_E | T1_SGN_E)) +\n\t\t\t\t((f & (T1_SIG_W | T1_SGN_W)) ==\n\t\t\t\t (T1_SIG_W | T1_SGN_W)), 1);\n\n\tvc = opj_int_min(((f & (T1_SIG_N | T1_SGN_N)) ==\n\t\t\t\tT1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S),\n\t\t\t1) - opj_int_min(((f & (T1_SIG_N | T1_SGN_N)) ==\n\t\t\t\t\t(T1_SIG_N | T1_SGN_N)) +\n\t\t\t\t((f & (T1_SIG_S | T1_SGN_S)) ==\n\t\t\t\t (T1_SIG_S | T1_SGN_S)), 1);\n\n\tif (hc < 0) {\n\t\thc = -hc;\n\t\tvc = -vc;\n\t}\n\tif (!hc) {\n\t\tif (vc == -1)\n\t\t\tn = 1;\n\t\telse if (!vc)\n\t\t\tn = 0;\n\t\telse\n\t\t\tn = 1;\n\t} else if (hc == 1) {\n\t\tif (vc == -1)\n\t\t\tn = 2;\n\t\telse if (!vc)\n\t\t\tn = 3;\n\t\telse\n\t\t\tn = 4;\n\t}\n\n\treturn (T1_CTXNO_SC + n);\n}\n\nstatic int t1_init_spb(int f) {\n\tint hc, vc, n;\n\n\thc = opj_int_min(((f & (T1_SIG_E | T1_SGN_E)) ==\n\t\t\t\tT1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W),\n\t\t\t1) - opj_int_min(((f & (T1_SIG_E | T1_SGN_E)) ==\n\t\t\t\t\t(T1_SIG_E | T1_SGN_E)) +\n\t\t\t\t((f & (T1_SIG_W | T1_SGN_W)) ==\n\t\t\t\t (T1_SIG_W | T1_SGN_W)), 1);\n\n\tvc = opj_int_min(((f & (T1_SIG_N | T1_SGN_N)) ==\n\t\t\t\tT1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S),\n\t\t\t1) - opj_int_min(((f & (T1_SIG_N | T1_SGN_N)) ==\n\t\t\t\t\t(T1_SIG_N | T1_SGN_N)) +\n\t\t\t\t((f & (T1_SIG_S | T1_SGN_S)) ==\n\t\t\t\t (T1_SIG_S | T1_SGN_S)), 1);\n\n\tif (!hc && !vc)\n\t\tn = 0;\n\telse\n\t\tn = (!(hc > 0 || (!hc && vc > 0)));\n\n\treturn n;\n}\n\nstatic void dump_array16(int array[],int size){\n\tint i;\n\t--size;\n\tfor (i = 0; i < size; ++i) {\n\t\tprintf(\"0x%04x, \", array[i]);\n\t\tif(!((i+1)&0x7))\n\t\t\tprintf(\"\\n  \");\n\t}\n\tprintf(\"0x%04x\\n};\\n\\n\", array[size]);\n}\n\nint main(int argc, char **argv)\n{\n\tint i, j;\n\tdouble u, v, t;\n\n\tint lut_ctxno_zc[1024];\n\tint lut_nmsedec_sig[1 << T1_NMSEDEC_BITS];\n\tint lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS];\n\tint lut_nmsedec_ref[1 << T1_NMSEDEC_BITS];\n\tint lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS];\n  (void)argc; (void)argv;\n\n\tprintf(\"/* This file was automatically generated by t1_generate_luts.c */\\n\\n\");\n\n\t/* lut_ctxno_zc */\n\tfor (j = 0; j < 4; ++j) {\n\t\tfor (i = 0; i < 256; ++i) {\n\t\t\tint orient = j;\n\t\t\tif (orient == 2) {\n\t\t\t\torient = 1;\n\t\t\t} else if (orient == 1) {\n\t\t\t\torient = 2;\n\t\t\t}\n\t\t\tlut_ctxno_zc[(orient << 8) | i] = t1_init_ctxno_zc(i, j);\n\t\t}\n\t}\n\n\tprintf(\"static OPJ_BYTE lut_ctxno_zc[1024] = {\\n  \");\n\tfor (i = 0; i < 1023; ++i) {\n\t\tprintf(\"%i, \", lut_ctxno_zc[i]);\n\t\tif(!((i+1)&0x1f))\n\t\t\tprintf(\"\\n  \");\n\t}\n\tprintf(\"%i\\n};\\n\\n\", lut_ctxno_zc[1023]);\n\n\t/* lut_ctxno_sc */\n\tprintf(\"static OPJ_BYTE lut_ctxno_sc[256] = {\\n  \");\n\tfor (i = 0; i < 255; ++i) {\n\t\tprintf(\"0x%x, \", t1_init_ctxno_sc(i << 4));\n\t\tif(!((i+1)&0xf))\n\t\t\tprintf(\"\\n  \");\n\t}\n\tprintf(\"0x%x\\n};\\n\\n\", t1_init_ctxno_sc(255 << 4));\n\n\t/* lut_spb */\n\tprintf(\"static OPJ_BYTE lut_spb[256] = {\\n  \");\n\tfor (i = 0; i < 255; ++i) {\n\t\tprintf(\"%i, \", t1_init_spb(i << 4));\n\t\tif(!((i+1)&0x1f))\n\t\t\tprintf(\"\\n  \");\n\t}\n\tprintf(\"%i\\n};\\n\\n\", t1_init_spb(255 << 4));\n\n\t/* FIXME FIXME FIXME */\n\t/* fprintf(stdout,\"nmsedec luts:\\n\"); */\n\tfor (i = 0; i < (1 << T1_NMSEDEC_BITS); ++i) {\n\t\tt = i / pow(2, T1_NMSEDEC_FRACBITS);\n\t\tu = t;\n\t\tv = t - 1.5;\n\t\tlut_nmsedec_sig[i] = \n\t\t\topj_int_max(0, \n\t\t\t\t\t(int) (floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));\n\t\tlut_nmsedec_sig0[i] =\n\t\t\topj_int_max(0,\n\t\t\t\t\t(int) (floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));\n\t\tu = t - 1.0;\n\t\tif (i & (1 << (T1_NMSEDEC_BITS - 1))) {\n\t\t\tv = t - 1.5;\n\t\t} else {\n\t\t\tv = t - 0.5;\n\t\t}\n\t\tlut_nmsedec_ref[i] =\n\t\t\topj_int_max(0,\n\t\t\t\t\t(int) (floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));\n\t\tlut_nmsedec_ref0[i] =\n\t\t\topj_int_max(0,\n\t\t\t\t\t(int) (floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));\n\t}\n\n\tprintf(\"static OPJ_INT16 lut_nmsedec_sig[1 << T1_NMSEDEC_BITS] = {\\n  \");\n\tdump_array16(lut_nmsedec_sig, 1 << T1_NMSEDEC_BITS);\n\n\tprintf(\"static OPJ_INT16 lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS] = {\\n  \");\n\tdump_array16(lut_nmsedec_sig0, 1 << T1_NMSEDEC_BITS);\n\n\tprintf(\"static OPJ_INT16 lut_nmsedec_ref[1 << T1_NMSEDEC_BITS] = {\\n  \");\n\tdump_array16(lut_nmsedec_ref, 1 << T1_NMSEDEC_BITS);\n\n\tprintf(\"static OPJ_INT16 lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS] = {\\n  \");\n\tdump_array16(lut_nmsedec_ref0, 1 << T1_NMSEDEC_BITS);\n\n\treturn 0;\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1_luts.h",
    "content": "/* This file was automatically generated by t1_generate_luts.c */\n\nstatic OPJ_BYTE lut_ctxno_zc[1024] = {\n  0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, \n  5, 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, \n  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, \n  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, \n  5, 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, \n  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, \n  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, \n  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, \n  0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, \n  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \n  5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, \n  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, \n  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \n  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \n  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, \n  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, \n  0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, \n  5, 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, \n  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, \n  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, \n  5, 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, \n  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, \n  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, \n  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, \n  0, 3, 3, 6, 3, 6, 6, 8, 3, 6, 6, 8, 6, 8, 8, 8, 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, \n  1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, \n  1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, \n  2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, \n  1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, \n  2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, \n  2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, \n  2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8\n};\n\nstatic OPJ_BYTE lut_ctxno_sc[256] = {\n  0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd, \n  0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xb, 0xc, 0xb, 0xd, 0xc, 0xd, 0xc, \n  0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0x9, 0xa, 0xd, 0xd, 0xa, 0xa, \n  0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xb, 0x9, 0xa, 0xd, 0xc, 0xa, 0x9, \n  0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xd, 0xc, 0xd, 0xb, 0xc, 0xb, 0xc, \n  0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xb, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb, \n  0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xd, 0x9, 0xa, 0xb, 0xc, 0xa, 0x9, \n  0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xb, 0x9, 0xa, 0xb, 0xb, 0xa, 0xa, \n  0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xb, 0x9, 0xa, 0xb, 0xb, 0xa, 0xa, \n  0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xd, 0x9, 0xa, 0xb, 0xc, 0xa, 0x9, \n  0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xb, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb, \n  0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xd, 0xc, 0xd, 0xb, 0xc, 0xb, 0xc, \n  0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xb, 0x9, 0xa, 0xd, 0xc, 0xa, 0x9, \n  0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0x9, 0xa, 0xd, 0xd, 0xa, 0xa, \n  0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xb, 0xc, 0xb, 0xd, 0xc, 0xd, 0xc, \n  0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd\n};\n\nstatic OPJ_BYTE lut_spb[256] = {\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \n  0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, \n  0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \n  0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, \n  0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, \n  0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \n  0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, \n  0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1\n};\n\nstatic OPJ_INT16 lut_nmsedec_sig[1 << T1_NMSEDEC_BITS] = {\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \n  0x0000, 0x0180, 0x0300, 0x0480, 0x0600, 0x0780, 0x0900, 0x0a80, \n  0x0c00, 0x0d80, 0x0f00, 0x1080, 0x1200, 0x1380, 0x1500, 0x1680, \n  0x1800, 0x1980, 0x1b00, 0x1c80, 0x1e00, 0x1f80, 0x2100, 0x2280, \n  0x2400, 0x2580, 0x2700, 0x2880, 0x2a00, 0x2b80, 0x2d00, 0x2e80, \n  0x3000, 0x3180, 0x3300, 0x3480, 0x3600, 0x3780, 0x3900, 0x3a80, \n  0x3c00, 0x3d80, 0x3f00, 0x4080, 0x4200, 0x4380, 0x4500, 0x4680, \n  0x4800, 0x4980, 0x4b00, 0x4c80, 0x4e00, 0x4f80, 0x5100, 0x5280, \n  0x5400, 0x5580, 0x5700, 0x5880, 0x5a00, 0x5b80, 0x5d00, 0x5e80, \n  0x6000, 0x6180, 0x6300, 0x6480, 0x6600, 0x6780, 0x6900, 0x6a80, \n  0x6c00, 0x6d80, 0x6f00, 0x7080, 0x7200, 0x7380, 0x7500, 0x7680\n};\n\nstatic OPJ_INT16 lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS] = {\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0080, \n  0x0080, 0x0080, 0x0100, 0x0100, 0x0100, 0x0180, 0x0180, 0x0200, \n  0x0200, 0x0280, 0x0280, 0x0300, 0x0300, 0x0380, 0x0400, 0x0400, \n  0x0480, 0x0500, 0x0580, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780, \n  0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b80, 0x0c00, \n  0x0c80, 0x0d00, 0x0e00, 0x0e80, 0x0f00, 0x1000, 0x1080, 0x1180, \n  0x1200, 0x1300, 0x1380, 0x1480, 0x1500, 0x1600, 0x1700, 0x1780, \n  0x1880, 0x1980, 0x1a80, 0x1b00, 0x1c00, 0x1d00, 0x1e00, 0x1f00, \n  0x2000, 0x2100, 0x2200, 0x2300, 0x2400, 0x2500, 0x2680, 0x2780, \n  0x2880, 0x2980, 0x2b00, 0x2c00, 0x2d00, 0x2e80, 0x2f80, 0x3100, \n  0x3200, 0x3380, 0x3480, 0x3600, 0x3700, 0x3880, 0x3a00, 0x3b00, \n  0x3c80, 0x3e00, 0x3f80, 0x4080, 0x4200, 0x4380, 0x4500, 0x4680, \n  0x4800, 0x4980, 0x4b00, 0x4c80, 0x4e00, 0x4f80, 0x5180, 0x5300, \n  0x5480, 0x5600, 0x5800, 0x5980, 0x5b00, 0x5d00, 0x5e80, 0x6080, \n  0x6200, 0x6400, 0x6580, 0x6780, 0x6900, 0x6b00, 0x6d00, 0x6e80, \n  0x7080, 0x7280, 0x7480, 0x7600, 0x7800, 0x7a00, 0x7c00, 0x7e00\n};\n\nstatic OPJ_INT16 lut_nmsedec_ref[1 << T1_NMSEDEC_BITS] = {\n  0x1800, 0x1780, 0x1700, 0x1680, 0x1600, 0x1580, 0x1500, 0x1480, \n  0x1400, 0x1380, 0x1300, 0x1280, 0x1200, 0x1180, 0x1100, 0x1080, \n  0x1000, 0x0f80, 0x0f00, 0x0e80, 0x0e00, 0x0d80, 0x0d00, 0x0c80, \n  0x0c00, 0x0b80, 0x0b00, 0x0a80, 0x0a00, 0x0980, 0x0900, 0x0880, \n  0x0800, 0x0780, 0x0700, 0x0680, 0x0600, 0x0580, 0x0500, 0x0480, \n  0x0400, 0x0380, 0x0300, 0x0280, 0x0200, 0x0180, 0x0100, 0x0080, \n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \n  0x0000, 0x0080, 0x0100, 0x0180, 0x0200, 0x0280, 0x0300, 0x0380, \n  0x0400, 0x0480, 0x0500, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780, \n  0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b00, 0x0b80, \n  0x0c00, 0x0c80, 0x0d00, 0x0d80, 0x0e00, 0x0e80, 0x0f00, 0x0f80, \n  0x1000, 0x1080, 0x1100, 0x1180, 0x1200, 0x1280, 0x1300, 0x1380, \n  0x1400, 0x1480, 0x1500, 0x1580, 0x1600, 0x1680, 0x1700, 0x1780\n};\n\nstatic OPJ_INT16 lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS] = {\n  0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x1b00, 0x1a80, 0x1980, \n  0x1880, 0x1780, 0x1700, 0x1600, 0x1500, 0x1480, 0x1380, 0x1300, \n  0x1200, 0x1180, 0x1080, 0x1000, 0x0f00, 0x0e80, 0x0e00, 0x0d00, \n  0x0c80, 0x0c00, 0x0b80, 0x0a80, 0x0a00, 0x0980, 0x0900, 0x0880, \n  0x0800, 0x0780, 0x0700, 0x0680, 0x0600, 0x0580, 0x0580, 0x0500, \n  0x0480, 0x0400, 0x0400, 0x0380, 0x0300, 0x0300, 0x0280, 0x0280, \n  0x0200, 0x0200, 0x0180, 0x0180, 0x0100, 0x0100, 0x0100, 0x0080, \n  0x0080, 0x0080, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0080, \n  0x0080, 0x0080, 0x0100, 0x0100, 0x0100, 0x0180, 0x0180, 0x0200, \n  0x0200, 0x0280, 0x0280, 0x0300, 0x0300, 0x0380, 0x0400, 0x0400, \n  0x0480, 0x0500, 0x0580, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780, \n  0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b80, 0x0c00, \n  0x0c80, 0x0d00, 0x0e00, 0x0e80, 0x0f00, 0x1000, 0x1080, 0x1180, \n  0x1200, 0x1300, 0x1380, 0x1480, 0x1500, 0x1600, 0x1700, 0x1780, \n  0x1880, 0x1980, 0x1a80, 0x1b00, 0x1c00, 0x1d00, 0x1e00, 0x1f00\n};\n\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t2.c",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2001-2003, David Janssens\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR \n * Copyright (c) 2012, CS Systemes d'Information, France\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"opj_includes.h\"\n\n/** @defgroup T2 T2 - Implementation of a tier-2 coding */\n/*@{*/\n\n/** @name Local static functions */\n/*@{*/\n\nstatic void opj_t2_putcommacode(opj_bio_t *bio, OPJ_INT32 n);\n\nstatic OPJ_UINT32 opj_t2_getcommacode(opj_bio_t *bio); \n/**\nVariable length code for signalling delta Zil (truncation point)\n@param bio  Bit Input/Output component\n@param n    delta Zil\n*/\nstatic void opj_t2_putnumpasses(opj_bio_t *bio, OPJ_UINT32 n);\nstatic OPJ_UINT32 opj_t2_getnumpasses(opj_bio_t *bio);\n\n/**\nEncode a packet of a tile to a destination buffer\n@param tileno Number of the tile encoded\n@param tile Tile for which to write the packets\n@param tcp Tile coding parameters\n@param pi Packet identity\n@param dest Destination buffer\n@param p_data_written   FIXME DOC\n@param len Length of the destination buffer\n@param cstr_info Codestream information structure\n@return\n*/\nstatic OPJ_BOOL opj_t2_encode_packet(   OPJ_UINT32 tileno,\n                                        opj_tcd_tile_t *tile,\n                                        opj_tcp_t *tcp,\n                                        opj_pi_iterator_t *pi,\n                                        OPJ_BYTE *dest,\n                                        OPJ_UINT32 * p_data_written,\n                                        OPJ_UINT32 len,\n                                        opj_codestream_info_t *cstr_info);\n\n/**\nDecode a packet of a tile from a source buffer\n@param t2 T2 handle\n@param tile Tile for which to write the packets\n@param tcp Tile coding parameters\n@param pi Packet identity\n@param src Source buffer\n@param data_read   FIXME DOC\n@param max_length  FIXME DOC\n@param pack_info Packet information\n\n@return  FIXME DOC\n*/\nstatic OPJ_BOOL opj_t2_decode_packet(   opj_t2_t* t2,\n                                        opj_tcd_tile_t *tile,\n                                        opj_tcp_t *tcp,\n                                        opj_pi_iterator_t *pi,\n                                        OPJ_BYTE *src,\n                                        OPJ_UINT32 * data_read,\n                                        OPJ_UINT32 max_length,\n                                        opj_packet_info_t *pack_info);\n\nstatic OPJ_BOOL opj_t2_skip_packet( opj_t2_t* p_t2,\n                                    opj_tcd_tile_t *p_tile,\n                                    opj_tcp_t *p_tcp,\n                                    opj_pi_iterator_t *p_pi,\n                                    OPJ_BYTE *p_src,\n                                    OPJ_UINT32 * p_data_read,\n                                    OPJ_UINT32 p_max_length,\n                                    opj_packet_info_t *p_pack_info);\n\nstatic OPJ_BOOL opj_t2_read_packet_header(  opj_t2_t* p_t2,\n                                            opj_tcd_tile_t *p_tile,\n                                            opj_tcp_t *p_tcp,\n                                            opj_pi_iterator_t *p_pi,\n                                            OPJ_BOOL * p_is_data_present,\n                                            OPJ_BYTE *p_src_data,\n                                            OPJ_UINT32 * p_data_read,\n                                            OPJ_UINT32 p_max_length,\n                                            opj_packet_info_t *p_pack_info);\n\nstatic OPJ_BOOL opj_t2_read_packet_data(opj_t2_t* p_t2,\n                                        opj_tcd_tile_t *p_tile,\n                                        opj_pi_iterator_t *p_pi,\n                                        OPJ_BYTE *p_src_data,\n                                        OPJ_UINT32 * p_data_read,\n                                        OPJ_UINT32 p_max_length,\n                                        opj_packet_info_t *pack_info);\n\nstatic OPJ_BOOL opj_t2_skip_packet_data(opj_t2_t* p_t2,\n                                        opj_tcd_tile_t *p_tile,\n                                        opj_pi_iterator_t *p_pi,\n                                        OPJ_UINT32 * p_data_read,\n                                        OPJ_UINT32 p_max_length,\n                                        opj_packet_info_t *pack_info);\n\n/**\n@param cblk\n@param index\n@param cblksty\n@param first\n*/\nstatic OPJ_BOOL opj_t2_init_seg(    opj_tcd_cblk_dec_t* cblk,\n                                    OPJ_UINT32 index,\n                                    OPJ_UINT32 cblksty,\n                                    OPJ_UINT32 first);\n\n/*@}*/\n\n/*@}*/\n\n/* ----------------------------------------------------------------------- */\n\n/* #define RESTART 0x04 */\nstatic void opj_t2_putcommacode(opj_bio_t *bio, OPJ_INT32 n) {\n        while (--n >= 0) {\n                opj_bio_write(bio, 1, 1);\n        }\n        opj_bio_write(bio, 0, 1);\n}\n\nOPJ_UINT32 opj_t2_getcommacode(opj_bio_t *bio) \n{\n    OPJ_UINT32 n = 0;\n    while (opj_bio_read(bio, 1)) {\n\t    ++n;\n    }\n    return n;\n}\n\nvoid opj_t2_putnumpasses(opj_bio_t *bio, OPJ_UINT32 n) {\n        if (n == 1) {\n                opj_bio_write(bio, 0, 1);\n        } else if (n == 2) {\n                opj_bio_write(bio, 2, 2);\n        } else if (n <= 5) {\n                opj_bio_write(bio, 0xc | (n - 3), 4);\n        } else if (n <= 36) {\n                opj_bio_write(bio, 0x1e0 | (n - 6), 9);\n        } else if (n <= 164) {\n                opj_bio_write(bio, 0xff80 | (n - 37), 16);\n        }\n}\n\nOPJ_UINT32 opj_t2_getnumpasses(opj_bio_t *bio) {\n        OPJ_UINT32 n;\n        if (!opj_bio_read(bio, 1))\n                return 1;\n        if (!opj_bio_read(bio, 1))\n                return 2;\n        if ((n = opj_bio_read(bio, 2)) != 3)\n                return (3 + n);\n        if ((n = opj_bio_read(bio, 5)) != 31)\n                return (6 + n);\n        return (37 + opj_bio_read(bio, 7));\n}\n\n/* ----------------------------------------------------------------------- */\n\nOPJ_BOOL opj_t2_encode_packets( opj_t2_t* p_t2,\n                                OPJ_UINT32 p_tile_no,\n                                opj_tcd_tile_t *p_tile,\n                                OPJ_UINT32 p_maxlayers,\n                                OPJ_BYTE *p_dest,\n                                OPJ_UINT32 * p_data_written,\n                                OPJ_UINT32 p_max_len,\n                                opj_codestream_info_t *cstr_info,\n                                OPJ_UINT32 p_tp_num,\n                                OPJ_INT32 p_tp_pos,\n                                OPJ_UINT32 p_pino,\n                                J2K_T2_MODE p_t2_mode)\n{\n        OPJ_BYTE *l_current_data = p_dest;\n        OPJ_UINT32 l_nb_bytes = 0;\n        OPJ_UINT32 compno;\n        OPJ_UINT32 poc;\n        opj_pi_iterator_t *l_pi = 00;\n        opj_pi_iterator_t *l_current_pi = 00;\n        opj_image_t *l_image = p_t2->image;\n        opj_cp_t *l_cp = p_t2->cp;\n        opj_tcp_t *l_tcp = &l_cp->tcps[p_tile_no];\n        OPJ_UINT32 pocno = l_cp->m_specific_param.m_enc.m_cinema == OPJ_CINEMA4K_24? 2: 1;\n        OPJ_UINT32 l_max_comp = l_cp->m_specific_param.m_enc.m_max_comp_size > 0 ? l_image->numcomps : 1;\n        OPJ_UINT32 l_nb_pocs = l_tcp->numpocs + 1;\n\n        l_pi = opj_pi_initialise_encode(l_image, l_cp, p_tile_no, p_t2_mode);\n        if (!l_pi) {\n                return OPJ_FALSE;\n        }\n\n        * p_data_written = 0;\n\n        if (p_t2_mode == THRESH_CALC ){ /* Calculating threshold */\n                l_current_pi = l_pi;\n\n                for     (compno = 0; compno < l_max_comp; ++compno) {\n                        OPJ_UINT32 l_comp_len = 0;\n                        l_current_pi = l_pi;\n\n                        for (poc = 0; poc < pocno ; ++poc) {\n                                OPJ_UINT32 l_tp_num = compno;\n\n                                /* TODO MSD : check why this function cannot fail (cf. v1) */\n                                opj_pi_create_encode(l_pi, l_cp,p_tile_no,poc,l_tp_num,p_tp_pos,p_t2_mode);\n\n                                while (opj_pi_next(l_current_pi)) {\n                                        if (l_current_pi->layno < p_maxlayers) {\n                                                l_nb_bytes = 0;\n\n                                                if (! opj_t2_encode_packet(p_tile_no,p_tile, l_tcp, l_current_pi, l_current_data, &l_nb_bytes, p_max_len, cstr_info)) {\n                                                        opj_pi_destroy(l_pi, l_nb_pocs);\n                                                        return OPJ_FALSE;\n                                                }\n\n                                                l_comp_len += l_nb_bytes;\n                                                l_current_data += l_nb_bytes;\n                                                p_max_len -= l_nb_bytes;\n\n                                                * p_data_written += l_nb_bytes;\n                                        }\n                                }\n\n                                if (l_cp->m_specific_param.m_enc.m_max_comp_size) {\n                                        if (l_comp_len > l_cp->m_specific_param.m_enc.m_max_comp_size) {\n                                                opj_pi_destroy(l_pi, l_nb_pocs);\n                                                return OPJ_FALSE;\n                                        }\n                                }\n\n                                ++l_current_pi;\n                        }\n                }\n        }\n        else {  /* t2_mode == FINAL_PASS  */\n                opj_pi_create_encode(l_pi, l_cp,p_tile_no,p_pino,p_tp_num,p_tp_pos,p_t2_mode);\n\n                l_current_pi = &l_pi[p_pino];\n\n                while (opj_pi_next(l_current_pi)) {\n                        if (l_current_pi->layno < p_maxlayers) {\n                                l_nb_bytes=0;\n\n                                if (! opj_t2_encode_packet(p_tile_no,p_tile, l_tcp, l_current_pi, l_current_data, &l_nb_bytes, p_max_len, cstr_info)) {\n                                        opj_pi_destroy(l_pi, l_nb_pocs);\n                                        return OPJ_FALSE;\n                                }\n\n                                l_current_data += l_nb_bytes;\n                                p_max_len -= l_nb_bytes;\n\n                                * p_data_written += l_nb_bytes;\n\n                                /* INDEX >> */\n                                if(cstr_info) {\n                                        if(cstr_info->index_write) {\n                                                opj_tile_info_t *info_TL = &cstr_info->tile[p_tile_no];\n                                                opj_packet_info_t *info_PK = &info_TL->packet[cstr_info->packno];\n                                                if (!cstr_info->packno) {\n                                                        info_PK->start_pos = info_TL->end_header + 1;\n                                                } else {\n                                                        info_PK->start_pos = ((l_cp->m_specific_param.m_enc.m_tp_on | l_tcp->POC)&& info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[cstr_info->packno - 1].end_pos + 1;\n                                                }\n                                                info_PK->end_pos = info_PK->start_pos + l_nb_bytes - 1;\n                                                info_PK->end_ph_pos += info_PK->start_pos - 1;  /* End of packet header which now only represents the distance\n                                                                                                                                                                                                                                                   to start of packet is incremented by value of start of packet*/\n                                        }\n\n                                        cstr_info->packno++;\n                                }\n                                /* << INDEX */\n                                ++p_tile->packno;\n                        }\n                }\n        }\n\n        opj_pi_destroy(l_pi, l_nb_pocs);\n\n        return OPJ_TRUE;\n}\n\n/* see issue 80 */\n#if 0\n#define JAS_FPRINTF fprintf\n#else\n/* issue 290 */\nstatic void opj_null_jas_fprintf(FILE* file, const char * format, ...)\n{\n  (void)file;\n  (void)format;\n}\n#define JAS_FPRINTF opj_null_jas_fprintf\n#endif\n\nOPJ_BOOL opj_t2_decode_packets( opj_t2_t *p_t2,\n                                OPJ_UINT32 p_tile_no,\n                                opj_tcd_tile_t *p_tile,\n                                OPJ_BYTE *p_src,\n                                OPJ_UINT32 * p_data_read,\n                                OPJ_UINT32 p_max_len,\n                                opj_codestream_index_t *p_cstr_index)\n{\n        OPJ_BYTE *l_current_data = p_src;\n        opj_pi_iterator_t *l_pi = 00;\n        OPJ_UINT32 pino;\n        opj_image_t *l_image = p_t2->image;\n        opj_cp_t *l_cp = p_t2->cp;\n        opj_tcp_t *l_tcp = &(p_t2->cp->tcps[p_tile_no]);\n        OPJ_UINT32 l_nb_bytes_read;\n        OPJ_UINT32 l_nb_pocs = l_tcp->numpocs + 1;\n        opj_pi_iterator_t *l_current_pi = 00;\n#ifdef TODO_MSD\n        OPJ_UINT32 curtp = 0;\n        OPJ_UINT32 tp_start_packno;\n#endif \n        opj_packet_info_t *l_pack_info = 00;\n        opj_image_comp_t* l_img_comp = 00;\n\n        OPJ_ARG_NOT_USED(p_cstr_index);\n\n#ifdef TODO_MSD\n        if (p_cstr_index) {\n                l_pack_info = p_cstr_index->tile_index[p_tile_no].packet;\n        }\n#endif\n\n        /* create a packet iterator */\n        l_pi = opj_pi_create_decode(l_image, l_cp, p_tile_no);\n        if (!l_pi) {\n                return OPJ_FALSE;\n        }\n\n\n        l_current_pi = l_pi;\n\n        for     (pino = 0; pino <= l_tcp->numpocs; ++pino) {\n\n                /* if the resolution needed is too low, one dim of the tilec could be equal to zero\n                 * and no packets are used to decode this resolution and\n                 * l_current_pi->resno is always >= p_tile->comps[l_current_pi->compno].minimum_num_resolutions\n                 * and no l_img_comp->resno_decoded are computed\n                 */\n                OPJ_BOOL* first_pass_failed = (OPJ_BOOL*)opj_malloc(l_image->numcomps * sizeof(OPJ_BOOL));\n                if (!first_pass_failed)\n                {\n                    opj_pi_destroy(l_pi,l_nb_pocs);\n                    return OPJ_FALSE;\n                }\n                memset(first_pass_failed, OPJ_TRUE, l_image->numcomps * sizeof(OPJ_BOOL));\n\n                while (opj_pi_next(l_current_pi)) {\n                  JAS_FPRINTF( stderr, \"packet offset=00000166 prg=%d cmptno=%02d rlvlno=%02d prcno=%03d lyrno=%02d\\n\\n\",\n                    l_current_pi->poc.prg1, l_current_pi->compno, l_current_pi->resno, l_current_pi->precno, l_current_pi->layno );\n\n                        if (l_tcp->num_layers_to_decode > l_current_pi->layno\n                                        && l_current_pi->resno < p_tile->comps[l_current_pi->compno].minimum_num_resolutions) {\n                                l_nb_bytes_read = 0;\n\n                                first_pass_failed[l_current_pi->compno] = OPJ_FALSE;\n\n                                if (! opj_t2_decode_packet(p_t2,p_tile,l_tcp,l_current_pi,l_current_data,&l_nb_bytes_read,p_max_len,l_pack_info)) {\n                                        opj_pi_destroy(l_pi,l_nb_pocs);\n                                        opj_free(first_pass_failed);\n                                        return OPJ_FALSE;\n                                }\n\n                                l_img_comp = &(l_image->comps[l_current_pi->compno]);\n                                l_img_comp->resno_decoded = opj_uint_max(l_current_pi->resno, l_img_comp->resno_decoded);\n                        }\n                        else {\n                                l_nb_bytes_read = 0;\n                                if (! opj_t2_skip_packet(p_t2,p_tile,l_tcp,l_current_pi,l_current_data,&l_nb_bytes_read,p_max_len,l_pack_info)) {\n                                        opj_pi_destroy(l_pi,l_nb_pocs);\n                                        opj_free(first_pass_failed);\n                                        return OPJ_FALSE;\n                                }\n                        }\n\n                        if (first_pass_failed[l_current_pi->compno]) {\n                                l_img_comp = &(l_image->comps[l_current_pi->compno]);\n                                if (l_img_comp->resno_decoded == 0)\n                                        l_img_comp->resno_decoded = p_tile->comps[l_current_pi->compno].minimum_num_resolutions - 1;\n                        }\n\n                        l_current_data += l_nb_bytes_read;\n                        p_max_len -= l_nb_bytes_read;\n\n                        /* INDEX >> */\n#ifdef TODO_MSD\n                        if(p_cstr_info) {\n                                opj_tile_info_v2_t *info_TL = &p_cstr_info->tile[p_tile_no];\n                                opj_packet_info_t *info_PK = &info_TL->packet[p_cstr_info->packno];\n                                tp_start_packno = 0;\n                                if (!p_cstr_info->packno) {\n                                        info_PK->start_pos = info_TL->end_header + 1;\n                                } else if (info_TL->packet[p_cstr_info->packno-1].end_pos >= (OPJ_INT32)p_cstr_info->tile[p_tile_no].tp[curtp].tp_end_pos){ /* New tile part */\n                                        info_TL->tp[curtp].tp_numpacks = p_cstr_info->packno - tp_start_packno; /* Number of packets in previous tile-part */\n                                        tp_start_packno = p_cstr_info->packno;\n                                        curtp++;\n                                        info_PK->start_pos = p_cstr_info->tile[p_tile_no].tp[curtp].tp_end_header+1;\n                                } else {\n                                        info_PK->start_pos = (l_cp->m_specific_param.m_enc.m_tp_on && info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[p_cstr_info->packno - 1].end_pos + 1;\n                                }\n                                info_PK->end_pos = info_PK->start_pos + l_nb_bytes_read - 1;\n                                info_PK->end_ph_pos += info_PK->start_pos - 1;  /* End of packet header which now only represents the distance */\n                                ++p_cstr_info->packno;\n                        }\n#endif\n                        /* << INDEX */\n                }\n                ++l_current_pi;\n\n                opj_free(first_pass_failed);\n        }\n        /* INDEX >> */\n#ifdef TODO_MSD\n        if\n                (p_cstr_info) {\n                p_cstr_info->tile[p_tile_no].tp[curtp].tp_numpacks = p_cstr_info->packno - tp_start_packno; /* Number of packets in last tile-part */\n        }\n#endif\n        /* << INDEX */\n\n        /* don't forget to release pi */\n        opj_pi_destroy(l_pi,l_nb_pocs);\n        *p_data_read = (OPJ_UINT32)(l_current_data - p_src);\n        return OPJ_TRUE;\n}\n\n/* ----------------------------------------------------------------------- */\n\n/**\n * Creates a Tier 2 handle\n *\n * @param       p_image         Source or destination image\n * @param       p_cp            Image coding parameters.\n * @return              a new T2 handle if successful, NULL otherwise.\n*/\nopj_t2_t* opj_t2_create(opj_image_t *p_image, opj_cp_t *p_cp)\n{\n        /* create the t2 structure */\n        opj_t2_t *l_t2 = (opj_t2_t*)opj_malloc(sizeof(opj_t2_t));\n        if (!l_t2) {\n                return NULL;\n        }\n        memset(l_t2,0,sizeof(opj_t2_t));\n\n        l_t2->image = p_image;\n        l_t2->cp = p_cp;\n\n        return l_t2;\n}\n\nvoid opj_t2_destroy(opj_t2_t *t2) {\n        if(t2) {\n                opj_free(t2);\n        }\n}\n\nOPJ_BOOL opj_t2_decode_packet(  opj_t2_t* p_t2,\n                                opj_tcd_tile_t *p_tile,\n                                opj_tcp_t *p_tcp,\n                                opj_pi_iterator_t *p_pi,\n                                OPJ_BYTE *p_src,\n                                OPJ_UINT32 * p_data_read,\n                                OPJ_UINT32 p_max_length,\n                                opj_packet_info_t *p_pack_info)\n{\n        OPJ_BOOL l_read_data;\n        OPJ_UINT32 l_nb_bytes_read = 0;\n        OPJ_UINT32 l_nb_total_bytes_read = 0;\n\n        *p_data_read = 0;\n\n        if (! opj_t2_read_packet_header(p_t2,p_tile,p_tcp,p_pi,&l_read_data,p_src,&l_nb_bytes_read,p_max_length,p_pack_info)) {\n                return OPJ_FALSE;\n        }\n\n        p_src += l_nb_bytes_read;\n        l_nb_total_bytes_read += l_nb_bytes_read;\n        p_max_length -= l_nb_bytes_read;\n\n        /* we should read data for the packet */\n        if (l_read_data) {\n                l_nb_bytes_read = 0;\n\n                if (! opj_t2_read_packet_data(p_t2,p_tile,p_pi,p_src,&l_nb_bytes_read,p_max_length,p_pack_info)) {\n                        return OPJ_FALSE;\n                }\n\n                l_nb_total_bytes_read += l_nb_bytes_read;\n        }\n\n        *p_data_read = l_nb_total_bytes_read;\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_t2_encode_packet(  OPJ_UINT32 tileno,\n                                opj_tcd_tile_t * tile,\n                                opj_tcp_t * tcp,\n                                opj_pi_iterator_t *pi,\n                                OPJ_BYTE *dest,\n                                OPJ_UINT32 * p_data_written,\n                                OPJ_UINT32 length,\n                                opj_codestream_info_t *cstr_info)\n{\n        OPJ_UINT32 bandno, cblkno;\n        OPJ_BYTE* c = dest;\n        OPJ_UINT32 l_nb_bytes;\n        OPJ_UINT32 compno = pi->compno;     /* component value */\n        OPJ_UINT32 resno  = pi->resno;      /* resolution level value */\n        OPJ_UINT32 precno = pi->precno;     /* precinct value */\n        OPJ_UINT32 layno  = pi->layno;      /* quality layer value */\n        OPJ_UINT32 l_nb_blocks;\n        opj_tcd_band_t *band = 00;\n        opj_tcd_cblk_enc_t* cblk = 00;\n        opj_tcd_pass_t *pass = 00;\n\n        opj_tcd_tilecomp_t *tilec = &tile->comps[compno];\n        opj_tcd_resolution_t *res = &tilec->resolutions[resno];\n\n        opj_bio_t *bio = 00;    /* BIO component */\n\n        /* <SOP 0xff91> */\n        if (tcp->csty & J2K_CP_CSTY_SOP) {\n                c[0] = 255;\n                c[1] = 145;\n                c[2] = 0;\n                c[3] = 4;\n#if 0\n                c[4] = (tile->packno % 65536) / 256;\n                c[5] = (tile->packno % 65536) % 256;\n#else\n                c[4] = (tile->packno >> 8) & 0xff; /* packno is uint32_t */\n                c[5] = tile->packno & 0xff;\n#endif\n                c += 6;\n                length -= 6;\n        }\n        /* </SOP> */\n\n        if (!layno) {\n                band = res->bands;\n\n                for(bandno = 0; bandno < res->numbands; ++bandno) {\n                        opj_tcd_precinct_t *prc = &band->precincts[precno];\n\n                        opj_tgt_reset(prc->incltree);\n                        opj_tgt_reset(prc->imsbtree);\n\n                        l_nb_blocks = prc->cw * prc->ch;\n                        for     (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {\n                                cblk = &prc->cblks.enc[cblkno];\n\n                                cblk->numpasses = 0;\n                                opj_tgt_setvalue(prc->imsbtree, cblkno, band->numbps - (OPJ_INT32)cblk->numbps);\n                        }\n                        ++band;\n                }\n        }\n\n        bio = opj_bio_create();\n        opj_bio_init_enc(bio, c, length);\n        opj_bio_write(bio, 1, 1);           /* Empty header bit */\n\n        /* Writing Packet header */\n        band = res->bands;\n        for (bandno = 0; bandno < res->numbands; ++bandno)      {\n                opj_tcd_precinct_t *prc = &band->precincts[precno];\n\n                l_nb_blocks = prc->cw * prc->ch;\n                cblk = prc->cblks.enc;\n\n                for (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {\n                        opj_tcd_layer_t *layer = &cblk->layers[layno];\n\n                        if (!cblk->numpasses && layer->numpasses) {\n                                opj_tgt_setvalue(prc->incltree, cblkno, (OPJ_INT32)layno);\n                        }\n\n                        ++cblk;\n                }\n\n                cblk = prc->cblks.enc;\n                for (cblkno = 0; cblkno < l_nb_blocks; cblkno++) {\n                        opj_tcd_layer_t *layer = &cblk->layers[layno];\n                        OPJ_UINT32 increment = 0;\n                        OPJ_UINT32 nump = 0;\n                        OPJ_UINT32 len = 0, passno;\n                        OPJ_UINT32 l_nb_passes;\n\n                        /* cblk inclusion bits */\n                        if (!cblk->numpasses) {\n                                opj_tgt_encode(bio, prc->incltree, cblkno, (OPJ_INT32)(layno + 1));\n                        } else {\n                                opj_bio_write(bio, layer->numpasses != 0, 1);\n                        }\n\n                        /* if cblk not included, go to the next cblk  */\n                        if (!layer->numpasses) {\n                                ++cblk;\n                                continue;\n                        }\n\n                        /* if first instance of cblk --> zero bit-planes information */\n                        if (!cblk->numpasses) {\n                                cblk->numlenbits = 3;\n                                opj_tgt_encode(bio, prc->imsbtree, cblkno, 999);\n                        }\n\n                        /* number of coding passes included */\n                        opj_t2_putnumpasses(bio, layer->numpasses);\n                        l_nb_passes = cblk->numpasses + layer->numpasses;\n                        pass = cblk->passes +  cblk->numpasses;\n\n                        /* computation of the increase of the length indicator and insertion in the header     */\n                        for (passno = cblk->numpasses; passno < l_nb_passes; ++passno) {\n                                ++nump;\n                                len += pass->len;\n\n                                if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {\n                                  increment = (OPJ_UINT32)opj_int_max((OPJ_INT32)increment, opj_int_floorlog2((OPJ_INT32)len) + 1\n                                    - ((OPJ_INT32)cblk->numlenbits + opj_int_floorlog2((OPJ_INT32)nump)));\n                                        len = 0;\n                                        nump = 0;\n                                }\n\n                                ++pass;\n                        }\n                        opj_t2_putcommacode(bio, (OPJ_INT32)increment);\n\n                        /* computation of the new Length indicator */\n                        cblk->numlenbits += increment;\n\n                        pass = cblk->passes +  cblk->numpasses;\n                        /* insertion of the codeword segment length */\n                        for (passno = cblk->numpasses; passno < l_nb_passes; ++passno) {\n                                nump++;\n                                len += pass->len;\n\n                                if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {\n                                        opj_bio_write(bio, (OPJ_UINT32)len, cblk->numlenbits + (OPJ_UINT32)opj_int_floorlog2((OPJ_INT32)nump));\n                                        len = 0;\n                                        nump = 0;\n                                }\n                                ++pass;\n                        }\n\n                        ++cblk;\n                }\n\n                ++band;\n        }\n\n        if (!opj_bio_flush(bio)) {\n                opj_bio_destroy(bio);\n                return OPJ_FALSE;               /* modified to eliminate longjmp !! */\n        }\n\n        l_nb_bytes = (OPJ_UINT32)opj_bio_numbytes(bio);\n        c += l_nb_bytes;\n        length -= l_nb_bytes;\n\n        opj_bio_destroy(bio);\n\n        /* <EPH 0xff92> */\n        if (tcp->csty & J2K_CP_CSTY_EPH) {\n                c[0] = 255;\n                c[1] = 146;\n                c += 2;\n                length -= 2;\n        }\n        /* </EPH> */\n\n        /* << INDEX */\n        /* End of packet header position. Currently only represents the distance to start of packet\n           Will be updated later by incrementing with packet start value*/\n        if(cstr_info && cstr_info->index_write) {\n                opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];\n                info_PK->end_ph_pos = (OPJ_INT32)(c - dest);\n        }\n        /* INDEX >> */\n\n        /* Writing the packet body */\n        band = res->bands;\n        for (bandno = 0; bandno < res->numbands; bandno++) {\n                opj_tcd_precinct_t *prc = &band->precincts[precno];\n\n                l_nb_blocks = prc->cw * prc->ch;\n                cblk = prc->cblks.enc;\n\n                for (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {\n                        opj_tcd_layer_t *layer = &cblk->layers[layno];\n\n                        if (!layer->numpasses) {\n                                ++cblk;\n                                continue;\n                        }\n\n                        if (layer->len > length) {\n                                return OPJ_FALSE;\n                        }\n\n                        memcpy(c, layer->data, layer->len);\n                        cblk->numpasses += layer->numpasses;\n                        c += layer->len;\n                        length -= layer->len;\n\n                        /* << INDEX */\n                        if(cstr_info && cstr_info->index_write) {\n                                opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];\n                                info_PK->disto += layer->disto;\n                                if (cstr_info->D_max < info_PK->disto) {\n                                        cstr_info->D_max = info_PK->disto;\n                                }\n                        }\n\n                        ++cblk;\n                        /* INDEX >> */\n                }\n                ++band;\n        }\n\n        assert( c >= dest );\n        * p_data_written += (OPJ_UINT32)(c - dest);\n\n        return OPJ_TRUE;\n}\n\nstatic OPJ_BOOL opj_t2_skip_packet( opj_t2_t* p_t2,\n                                    opj_tcd_tile_t *p_tile,\n                                    opj_tcp_t *p_tcp,\n                                    opj_pi_iterator_t *p_pi,\n                                    OPJ_BYTE *p_src,\n                                    OPJ_UINT32 * p_data_read,\n                                    OPJ_UINT32 p_max_length,\n                                    opj_packet_info_t *p_pack_info)\n{\n        OPJ_BOOL l_read_data;\n        OPJ_UINT32 l_nb_bytes_read = 0;\n        OPJ_UINT32 l_nb_total_bytes_read = 0;\n\n        *p_data_read = 0;\n\n        if (! opj_t2_read_packet_header(p_t2,p_tile,p_tcp,p_pi,&l_read_data,p_src,&l_nb_bytes_read,p_max_length,p_pack_info)) {\n                return OPJ_FALSE;\n        }\n\n        p_src += l_nb_bytes_read;\n        l_nb_total_bytes_read += l_nb_bytes_read;\n        p_max_length -= l_nb_bytes_read;\n\n        /* we should read data for the packet */\n        if (l_read_data) {\n                l_nb_bytes_read = 0;\n\n                if (! opj_t2_skip_packet_data(p_t2,p_tile,p_pi,&l_nb_bytes_read,p_max_length,p_pack_info)) {\n                        return OPJ_FALSE;\n                }\n\n                l_nb_total_bytes_read += l_nb_bytes_read;\n        }\n        *p_data_read = l_nb_total_bytes_read;\n\n        return OPJ_TRUE;\n}\n\n\nOPJ_BOOL opj_t2_read_packet_header( opj_t2_t* p_t2,\n                                    opj_tcd_tile_t *p_tile,\n                                    opj_tcp_t *p_tcp,\n                                    opj_pi_iterator_t *p_pi,\n                                    OPJ_BOOL * p_is_data_present,\n                                    OPJ_BYTE *p_src_data,\n                                    OPJ_UINT32 * p_data_read,\n                                    OPJ_UINT32 p_max_length,\n                                    opj_packet_info_t *p_pack_info)\n\n{\n        /* loop */\n        OPJ_UINT32 bandno, cblkno;\n        OPJ_UINT32 l_nb_code_blocks;\n        OPJ_UINT32 l_remaining_length;\n        OPJ_UINT32 l_header_length;\n        OPJ_UINT32 * l_modified_length_ptr = 00;\n        OPJ_BYTE *l_current_data = p_src_data;\n        opj_cp_t *l_cp = p_t2->cp;\n        opj_bio_t *l_bio = 00;  /* BIO component */\n        opj_tcd_band_t *l_band = 00;\n        opj_tcd_cblk_dec_t* l_cblk = 00;\n        opj_tcd_resolution_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];\n\n        OPJ_BYTE *l_header_data = 00;\n        OPJ_BYTE **l_header_data_start = 00;\n\n        OPJ_UINT32 l_present;\n\n        if (p_pi->layno == 0) {\n                l_band = l_res->bands;\n\n                /* reset tagtrees */\n                for (bandno = 0; bandno < l_res->numbands; ++bandno) {\n                        opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];\n\n                        if ( ! ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) ) {\n                                opj_tgt_reset(l_prc->incltree);\n                                opj_tgt_reset(l_prc->imsbtree);\n                                l_cblk = l_prc->cblks.dec;\n\n                                l_nb_code_blocks = l_prc->cw * l_prc->ch;\n                                for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {\n                                        l_cblk->numsegs = 0;\n                                        l_cblk->real_num_segs = 0;\n                                        ++l_cblk;\n                                }\n                        }\n\n                        ++l_band;\n                }\n        }\n\n        /* SOP markers */\n\n        if (p_tcp->csty & J2K_CP_CSTY_SOP) {\n                if (p_max_length < 6) {\n                        /* TODO opj_event_msg(p_t2->cinfo->event_mgr, EVT_WARNING, \"Not enough space for expected SOP marker\\n\"); */\n                        printf(\"Not enough space for expected SOP marker\\n\");\n                } else if ((*l_current_data) != 0xff || (*(l_current_data + 1) != 0x91)) {\n                        /* TODO opj_event_msg(p_t2->cinfo->event_mgr, EVT_WARNING, \"Expected SOP marker\\n\"); */\n                        printf(\"Expected SOP marker\\n\");\n                        fprintf(stderr, \"Error : expected SOP marker\\n\");\n                } else {\n                        l_current_data += 6;\n                }\n\n                /** TODO : check the Nsop value */\n        }\n\n        /*\n        When the marker PPT/PPM is used the packet header are store in PPT/PPM marker\n        This part deal with this caracteristic\n        step 1: Read packet header in the saved structure\n        step 2: Return to codestream for decoding\n        */\n\n        l_bio = opj_bio_create();\n        if (! l_bio) {\n                return OPJ_FALSE;\n        }\n\n        if (l_cp->ppm == 1) { /* PPM */\n                l_header_data_start = &l_cp->ppm_data;\n                l_header_data = *l_header_data_start;\n                l_modified_length_ptr = &(l_cp->ppm_len);\n\n        }\n        else if (p_tcp->ppt == 1) { /* PPT */\n                l_header_data_start = &(p_tcp->ppt_data);\n                l_header_data = *l_header_data_start;\n                l_modified_length_ptr = &(p_tcp->ppt_len);\n        }\n        else {  /* Normal Case */\n                l_header_data_start = &(l_current_data);\n                l_header_data = *l_header_data_start;\n                l_remaining_length = (OPJ_UINT32)(p_src_data+p_max_length-l_header_data);\n                l_modified_length_ptr = &(l_remaining_length);\n        }\n\n        opj_bio_init_dec(l_bio, l_header_data,*l_modified_length_ptr);\n\n        l_present = opj_bio_read(l_bio, 1);\n        JAS_FPRINTF(stderr, \"present=%d \\n\", l_present );\n        if (!l_present) {\n            /* TODO MSD: no test to control the output of this function*/\n                opj_bio_inalign(l_bio);\n                l_header_data += opj_bio_numbytes(l_bio);\n                opj_bio_destroy(l_bio);\n\n                /* EPH markers */\n                if (p_tcp->csty & J2K_CP_CSTY_EPH) {\n                        if (p_max_length < 2) {\n                                fprintf(stderr, \"Not enough space for expected EPH marker\\n\");\n                        } else if ((*l_header_data) != 0xff || (*(l_header_data + 1) != 0x92)) {\n                                fprintf(stderr, \"Error : expected EPH marker\\n\");\n                        } else {\n                                l_header_data += 2;\n                        }\n                }\n\n                l_header_length = (OPJ_UINT32)(l_header_data - *l_header_data_start);\n                *l_modified_length_ptr -= l_header_length;\n                *l_header_data_start += l_header_length;\n\n                /* << INDEX */\n                /* End of packet header position. Currently only represents the distance to start of packet\n                   Will be updated later by incrementing with packet start value */\n                if (p_pack_info) {\n                        p_pack_info->end_ph_pos = (OPJ_INT32)(l_current_data - p_src_data);\n                }\n                /* INDEX >> */\n\n                * p_is_data_present = OPJ_FALSE;\n                *p_data_read = (OPJ_UINT32)(l_current_data - p_src_data);\n                return OPJ_TRUE;\n        }\n\n        l_band = l_res->bands;\n        for (bandno = 0; bandno < l_res->numbands; ++bandno) {\n                opj_tcd_precinct_t *l_prc = &(l_band->precincts[p_pi->precno]);\n\n                if ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) {\n                        ++l_band;\n                        continue;\n                }\n\n                l_nb_code_blocks = l_prc->cw * l_prc->ch;\n                l_cblk = l_prc->cblks.dec;\n                for (cblkno = 0; cblkno < l_nb_code_blocks; cblkno++) {\n                        OPJ_UINT32 l_included,l_increment, l_segno;\n                        OPJ_INT32 n;\n\n                        /* if cblk not yet included before --> inclusion tagtree */\n                        if (!l_cblk->numsegs) {\n                                l_included = opj_tgt_decode(l_bio, l_prc->incltree, cblkno, (OPJ_INT32)(p_pi->layno + 1));\n                                /* else one bit */\n                        }\n                        else {\n                                l_included = opj_bio_read(l_bio, 1);\n                        }\n\n                        /* if cblk not included */\n                        if (!l_included) {\n                                l_cblk->numnewpasses = 0;\n                                ++l_cblk;\n        JAS_FPRINTF(stderr, \"included=%d \\n\", l_included);\n                                continue;\n                        }\n\n                        /* if cblk not yet included --> zero-bitplane tagtree */\n                        if (!l_cblk->numsegs) {\n                                OPJ_UINT32 i = 0;\n\n                                while (!opj_tgt_decode(l_bio, l_prc->imsbtree, cblkno, (OPJ_INT32)i)) {\n                                        ++i;\n                                }\n\n                                l_cblk->numbps = (OPJ_UINT32)l_band->numbps + 1 - i;\n                                l_cblk->numlenbits = 3;\n                        }\n\n                        /* number of coding passes */\n                        l_cblk->numnewpasses = opj_t2_getnumpasses(l_bio);\n                        l_increment = opj_t2_getcommacode(l_bio);\n\n                        /* length indicator increment */\n                        l_cblk->numlenbits += l_increment;\n                        l_segno = 0;\n\n                        if (!l_cblk->numsegs) {\n                                if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 1)) {\n                                        opj_bio_destroy(l_bio);\n                                        return OPJ_FALSE;\n                                }\n                        }\n                        else {\n                                l_segno = l_cblk->numsegs - 1;\n                                if (l_cblk->segs[l_segno].numpasses == l_cblk->segs[l_segno].maxpasses) {\n                                        ++l_segno;\n                                        if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 0)) {\n                                                opj_bio_destroy(l_bio);\n                                                return OPJ_FALSE;\n                                        }\n                                }\n                        }\n                        n = (OPJ_INT32)l_cblk->numnewpasses;\n\n                        do {\n                                l_cblk->segs[l_segno].numnewpasses = (OPJ_UINT32)opj_int_min((OPJ_INT32)(l_cblk->segs[l_segno].maxpasses - l_cblk->segs[l_segno].numpasses), n);\n                                l_cblk->segs[l_segno].newlen = opj_bio_read(l_bio, l_cblk->numlenbits + opj_uint_floorlog2(l_cblk->segs[l_segno].numnewpasses));\n                                        JAS_FPRINTF(stderr, \"included=%d numnewpasses=%d increment=%d len=%d \\n\", l_included, l_cblk->segs[l_segno].numnewpasses, l_increment, l_cblk->segs[l_segno].newlen );\n\n                                n -= (OPJ_INT32)l_cblk->segs[l_segno].numnewpasses;\n                                if (n > 0) {\n                                        ++l_segno;\n\n                                        if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 0)) {\n                                                opj_bio_destroy(l_bio);\n                                                return OPJ_FALSE;\n                                        }\n                                }\n                        } while (n > 0);\n\n                        ++l_cblk;\n                }\n\n                ++l_band;\n        }\n\n        if (!opj_bio_inalign(l_bio)) {\n                opj_bio_destroy(l_bio);\n                return OPJ_FALSE;\n        }\n\n        l_header_data += opj_bio_numbytes(l_bio);\n        opj_bio_destroy(l_bio);\n\n        /* EPH markers */\n        if (p_tcp->csty & J2K_CP_CSTY_EPH) {\n                if (p_max_length < 2) {\n                        fprintf(stderr, \"Not enough space for expected EPH marker\\n\");\n                } else if ((*l_header_data) != 0xff || (*(l_header_data + 1) != 0x92)) {\n                        /* TODO opj_event_msg(t2->cinfo->event_mgr, EVT_ERROR, \"Expected EPH marker\\n\"); */\n                        fprintf(stderr, \"Error : expected EPH marker\\n\");\n                } else {\n                        l_header_data += 2;\n                }\n        }\n\n        l_header_length = (OPJ_UINT32)(l_header_data - *l_header_data_start);\n        JAS_FPRINTF( stderr, \"hdrlen=%d \\n\", l_header_length );\n        JAS_FPRINTF( stderr, \"packet body\\n\");\n        *l_modified_length_ptr -= l_header_length;\n        *l_header_data_start += l_header_length;\n\n        /* << INDEX */\n        /* End of packet header position. Currently only represents the distance to start of packet\n         Will be updated later by incrementing with packet start value */\n        if (p_pack_info) {\n                p_pack_info->end_ph_pos = (OPJ_INT32)(l_current_data - p_src_data);\n        }\n        /* INDEX >> */\n\n        *p_is_data_present = OPJ_TRUE;\n        *p_data_read = (OPJ_UINT32)(l_current_data - p_src_data);\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_t2_read_packet_data(   opj_t2_t* p_t2,\n                                    opj_tcd_tile_t *p_tile,\n                                    opj_pi_iterator_t *p_pi,\n                                    OPJ_BYTE *p_src_data,\n                                    OPJ_UINT32 * p_data_read,\n                                    OPJ_UINT32 p_max_length,\n                                    opj_packet_info_t *pack_info)\n{\n        OPJ_UINT32 bandno, cblkno;\n        OPJ_UINT32 l_nb_code_blocks;\n        OPJ_BYTE *l_current_data = p_src_data;\n        opj_tcd_band_t *l_band = 00;\n        opj_tcd_cblk_dec_t* l_cblk = 00;\n        opj_tcd_resolution_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];\n\n        OPJ_ARG_NOT_USED(p_t2);\n        OPJ_ARG_NOT_USED(pack_info);\n\n        l_band = l_res->bands;\n        for (bandno = 0; bandno < l_res->numbands; ++bandno) {\n                opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];\n\n                if ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) {\n                        ++l_band;\n                        continue;\n                }\n\n                l_nb_code_blocks = l_prc->cw * l_prc->ch;\n                l_cblk = l_prc->cblks.dec;\n\n                for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {\n                        opj_tcd_seg_t *l_seg = 00;\n\n                        if (!l_cblk->numnewpasses) {\n                                /* nothing to do */\n                                ++l_cblk;\n                                continue;\n                        }\n\n                        if (!l_cblk->numsegs) {\n                                l_seg = l_cblk->segs;\n                                ++l_cblk->numsegs;\n                                l_cblk->data_current_size = 0;\n                        }\n                        else {\n                                l_seg = &l_cblk->segs[l_cblk->numsegs - 1];\n\n                                if (l_seg->numpasses == l_seg->maxpasses) {\n                                        ++l_seg;\n                                        ++l_cblk->numsegs;\n                                }\n                        }\n\n                        do {\n                                if (l_current_data + l_seg->newlen > p_src_data + p_max_length) {\n                                        fprintf(stderr, \"read: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\\n\",\n                                                l_seg->newlen, p_max_length, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);\n                                        return OPJ_FALSE;\n                                }\n\n#ifdef USE_JPWL\n                        /* we need here a j2k handle to verify if making a check to\n                        the validity of cblocks parameters is selected from user (-W) */\n\n                                /* let's check that we are not exceeding */\n                                if ((l_cblk->len + l_seg->newlen) > 8192) {\n                                        opj_event_msg(p_t2->cinfo, EVT_WARNING,\n                                                \"JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\\n\",\n                                                l_seg->newlen, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);\n                                        if (!JPWL_ASSUME) {\n                                                opj_event_msg(p_t2->cinfo, EVT_ERROR, \"JPWL: giving up\\n\");\n                                                return OPJ_FALSE;\n                                        }\n                                        l_seg->newlen = 8192 - l_cblk->len;\n                                        opj_event_msg(p_t2->cinfo, EVT_WARNING, \"      - truncating segment to %d\\n\", l_seg->newlen);\n                                        break;\n                                };\n\n#endif /* USE_JPWL */\n                                /* Check if the cblk->data have allocated enough memory */\n                                if ((l_cblk->data_current_size + l_seg->newlen) > l_cblk->data_max_size) {\n                                    OPJ_BYTE* new_cblk_data = (OPJ_BYTE*) opj_realloc(l_cblk->data, l_cblk->data_current_size + l_seg->newlen);\n                                    if(! new_cblk_data) {\n                                        opj_free(l_cblk->data);\n                                        l_cblk->data_max_size = 0;\n                                        /* opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to realloc code block cata!\\n\"); */\n                                        return OPJ_FALSE;\n                                    }\n                                    l_cblk->data_max_size = l_cblk->data_current_size + l_seg->newlen;\n                                    l_cblk->data = new_cblk_data;\n                                }\n                               \n                                memcpy(l_cblk->data + l_cblk->data_current_size, l_current_data, l_seg->newlen);\n\n                                if (l_seg->numpasses == 0) {\n                                        l_seg->data = &l_cblk->data;\n                                        l_seg->dataindex = l_cblk->data_current_size;\n                                }\n\n                                l_current_data += l_seg->newlen;\n                                l_seg->numpasses += l_seg->numnewpasses;\n                                l_cblk->numnewpasses -= l_seg->numnewpasses;\n\n                                l_seg->real_num_passes = l_seg->numpasses;\n                                l_cblk->data_current_size += l_seg->newlen;\n                                l_seg->len += l_seg->newlen;\n\n                                if (l_cblk->numnewpasses > 0) {\n                                        ++l_seg;\n                                        ++l_cblk->numsegs;\n                                }\n                        } while (l_cblk->numnewpasses > 0);\n\n                        l_cblk->real_num_segs = l_cblk->numsegs;\n                        ++l_cblk;\n                } /* next code_block */\n\n                ++l_band;\n        }\n\n        *(p_data_read) = (OPJ_UINT32)(l_current_data - p_src_data);\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_t2_skip_packet_data(   opj_t2_t* p_t2,\n                                    opj_tcd_tile_t *p_tile,\n                                    opj_pi_iterator_t *p_pi,\n                                    OPJ_UINT32 * p_data_read,\n                                    OPJ_UINT32 p_max_length,\n                                    opj_packet_info_t *pack_info)\n{\n        OPJ_UINT32 bandno, cblkno;\n        OPJ_UINT32 l_nb_code_blocks;\n        opj_tcd_band_t *l_band = 00;\n        opj_tcd_cblk_dec_t* l_cblk = 00;\n        opj_tcd_resolution_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];\n\n        OPJ_ARG_NOT_USED(p_t2);\n        OPJ_ARG_NOT_USED(pack_info);\n\n        *p_data_read = 0;\n        l_band = l_res->bands;\n\n        for (bandno = 0; bandno < l_res->numbands; ++bandno) {\n                opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];\n\n                if ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) {\n                        ++l_band;\n                        continue;\n                }\n\n                l_nb_code_blocks = l_prc->cw * l_prc->ch;\n                l_cblk = l_prc->cblks.dec;\n\n                for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {\n                        opj_tcd_seg_t *l_seg = 00;\n\n                        if (!l_cblk->numnewpasses) {\n                                /* nothing to do */\n                                ++l_cblk;\n                                continue;\n                        }\n\n                        if (!l_cblk->numsegs) {\n                                l_seg = l_cblk->segs;\n                                ++l_cblk->numsegs;\n                                l_cblk->data_current_size = 0;\n                        }\n                        else {\n                                l_seg = &l_cblk->segs[l_cblk->numsegs - 1];\n\n                                if (l_seg->numpasses == l_seg->maxpasses) {\n                                        ++l_seg;\n                                        ++l_cblk->numsegs;\n                                }\n                        }\n\n                        do {\n                                if (* p_data_read + l_seg->newlen > p_max_length) {\n                                        fprintf(stderr, \"skip: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\\n\",\n                                                l_seg->newlen, p_max_length, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);\n                                        return OPJ_FALSE;\n                                }\n\n#ifdef USE_JPWL\n                        /* we need here a j2k handle to verify if making a check to\n                        the validity of cblocks parameters is selected from user (-W) */\n\n                                /* let's check that we are not exceeding */\n                                if ((l_cblk->len + l_seg->newlen) > 8192) {\n                                        opj_event_msg(p_t2->cinfo, EVT_WARNING,\n                                                \"JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\\n\",\n                                                l_seg->newlen, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);\n                                        if (!JPWL_ASSUME) {\n                                                opj_event_msg(p_t2->cinfo, EVT_ERROR, \"JPWL: giving up\\n\");\n                                                return -999;\n                                        }\n                                        l_seg->newlen = 8192 - l_cblk->len;\n                                        opj_event_msg(p_t2->cinfo, EVT_WARNING, \"      - truncating segment to %d\\n\", l_seg->newlen);\n                                        break;\n                                };\n\n#endif /* USE_JPWL */\n                                        JAS_FPRINTF(stderr, \"p_data_read (%d) newlen (%d) \\n\", *p_data_read, l_seg->newlen );\n                                *(p_data_read) += l_seg->newlen;\n\n                                l_seg->numpasses += l_seg->numnewpasses;\n                                l_cblk->numnewpasses -= l_seg->numnewpasses;\n                                if (l_cblk->numnewpasses > 0)\n                                {\n                                        ++l_seg;\n                                        ++l_cblk->numsegs;\n                                }\n                        } while (l_cblk->numnewpasses > 0);\n\n                        ++l_cblk;\n                }\n\n                ++l_band;\n        }\n\n        return OPJ_TRUE;\n}\n\n\nOPJ_BOOL opj_t2_init_seg(   opj_tcd_cblk_dec_t* cblk,\n                            OPJ_UINT32 index, \n                            OPJ_UINT32 cblksty, \n                            OPJ_UINT32 first)\n{\n        opj_tcd_seg_t* seg = 00;\n        OPJ_UINT32 l_nb_segs = index + 1;\n\n        if (l_nb_segs > cblk->m_current_max_segs) {\n                opj_tcd_seg_t* new_segs;\n                cblk->m_current_max_segs += OPJ_J2K_DEFAULT_NB_SEGS;\n\n                new_segs = (opj_tcd_seg_t*) opj_realloc(cblk->segs, cblk->m_current_max_segs * sizeof(opj_tcd_seg_t));\n                if(! new_segs) {\n                        opj_free(cblk->segs);\n                        cblk->segs = NULL;\n                        cblk->m_current_max_segs = 0;\n                        /* opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to initialize segment %d\\n\", l_nb_segs); */\n                        return OPJ_FALSE;\n                }\n                cblk->segs = new_segs;\n        }\n\n        seg = &cblk->segs[index];\n        memset(seg,0,sizeof(opj_tcd_seg_t));\n\n        if (cblksty & J2K_CCP_CBLKSTY_TERMALL) {\n                seg->maxpasses = 1;\n        }\n        else if (cblksty & J2K_CCP_CBLKSTY_LAZY) {\n                if (first) {\n                        seg->maxpasses = 10;\n                } else {\n                        seg->maxpasses = (((seg - 1)->maxpasses == 1) || ((seg - 1)->maxpasses == 10)) ? 2 : 1;\n                }\n        } else {\n                seg->maxpasses = 109;\n        }\n\n        return OPJ_TRUE;\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t2.h",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2001-2003, David Janssens\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR \n * Copyright (c) 2012, CS Systemes d'Information, France\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef __T2_H\n#define __T2_H\n/**\n@file t2.h\n@brief Implementation of a tier-2 coding (packetization of code-block data) (T2)\n\n*/\n\n/** @defgroup T2 T2 - Implementation of a tier-2 coding */\n/*@{*/\n\n/**\nTier-2 coding\n*/\ntypedef struct opj_t2 {\n\n\t/** Encoding: pointer to the src image. Decoding: pointer to the dst image. */\n\topj_image_t *image;\n\t/** pointer to the image coding parameters */\n\topj_cp_t *cp;\n} opj_t2_t;\n\n/** @name Exported functions */\n/*@{*/\n/* ----------------------------------------------------------------------- */\n\n/**\nEncode the packets of a tile to a destination buffer\n@param t2               T2 handle\n@param tileno           number of the tile encoded\n@param tile             the tile for which to write the packets\n@param maxlayers        maximum number of layers\n@param dest             the destination buffer\n@param p_data_written   FIXME DOC\n@param len              the length of the destination buffer\n@param cstr_info        Codestream information structure\n@param tpnum            Tile part number of the current tile\n@param tppos            The position of the tile part flag in the progression order\n@param pino             FIXME DOC\n@param t2_mode          If == 0 In Threshold calculation ,If == 1 Final pass\n*/\nOPJ_BOOL opj_t2_encode_packets(\topj_t2_t* t2,\n\t\t\t\t\t\t\t\tOPJ_UINT32 tileno,\n\t\t\t\t\t\t\t\topj_tcd_tile_t *tile,\n\t\t\t\t\t\t\t\tOPJ_UINT32 maxlayers,\n\t\t\t\t\t\t\t\tOPJ_BYTE *dest,\n\t\t\t\t\t\t\t\tOPJ_UINT32 * p_data_written,\n\t\t\t\t\t\t\t\tOPJ_UINT32 len,\n\t\t\t\t\t\t\t\topj_codestream_info_t *cstr_info,\n\t\t\t\t\t\t\t\tOPJ_UINT32 tpnum,\n\t\t\t\t\t\t\t\tOPJ_INT32 tppos,\n\t\t\t\t\t\t\t\tOPJ_UINT32 pino,\n\t\t\t\t\t\t\t\tJ2K_T2_MODE t2_mode);\n\n/**\nDecode the packets of a tile from a source buffer\n@param t2 T2 handle\n@param tileno number that identifies the tile for which to decode the packets\n@param tile tile for which to decode the packets\n@param src         FIXME DOC\n@param p_data_read the source buffer\n@param len length of the source buffer\n@param cstr_info   FIXME DOC\n\n@return FIXME DOC\n */\nOPJ_BOOL opj_t2_decode_packets(\topj_t2_t *t2,\n                                OPJ_UINT32 tileno,\n                                opj_tcd_tile_t *tile,\n                                OPJ_BYTE *src,\n                                OPJ_UINT32 * p_data_read,\n                                OPJ_UINT32 len,\n                                opj_codestream_index_t *cstr_info);\n\n/**\n * Creates a Tier 2 handle\n *\n * @param\tp_image\t\tSource or destination image\n * @param\tp_cp\t\tImage coding parameters.\n * @return\t\ta new T2 handle if successful, NULL otherwise.\n*/\nopj_t2_t* opj_t2_create(opj_image_t *p_image, opj_cp_t *p_cp);\n\n/**\nDestroy a T2 handle\n@param t2 T2 handle to destroy\n*/\nvoid opj_t2_destroy(opj_t2_t *t2);\n\n/* ----------------------------------------------------------------------- */\n/*@}*/\n\n/*@}*/\n\n#endif /* __T2_H */\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tcd.c",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2001-2003, David Janssens\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * Copyright (c) 2006-2007, Parvatha Elangovan\n * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR \n * Copyright (c) 2012, CS Systemes d'Information, France\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"opj_includes.h\"\n\n/* ----------------------------------------------------------------------- */\n\n/* TODO MSD: */\n#ifdef TODO_MSD \nvoid tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t * img) {\n        int tileno, compno, resno, bandno, precno;/*, cblkno;*/\n\n        fprintf(fd, \"image {\\n\");\n        fprintf(fd, \"  tw=%d, th=%d x0=%d x1=%d y0=%d y1=%d\\n\", \n                img->tw, img->th, tcd->image->x0, tcd->image->x1, tcd->image->y0, tcd->image->y1);\n\n        for (tileno = 0; tileno < img->th * img->tw; tileno++) {\n                opj_tcd_tile_t *tile = &tcd->tcd_image->tiles[tileno];\n                fprintf(fd, \"  tile {\\n\");\n                fprintf(fd, \"    x0=%d, y0=%d, x1=%d, y1=%d, numcomps=%d\\n\",\n                        tile->x0, tile->y0, tile->x1, tile->y1, tile->numcomps);\n                for (compno = 0; compno < tile->numcomps; compno++) {\n                        opj_tcd_tilecomp_t *tilec = &tile->comps[compno];\n                        fprintf(fd, \"    tilec {\\n\");\n                        fprintf(fd,\n                                \"      x0=%d, y0=%d, x1=%d, y1=%d, numresolutions=%d\\n\",\n                                tilec->x0, tilec->y0, tilec->x1, tilec->y1, tilec->numresolutions);\n                        for (resno = 0; resno < tilec->numresolutions; resno++) {\n                                opj_tcd_resolution_t *res = &tilec->resolutions[resno];\n                                fprintf(fd, \"\\n   res {\\n\");\n                                fprintf(fd,\n                                        \"          x0=%d, y0=%d, x1=%d, y1=%d, pw=%d, ph=%d, numbands=%d\\n\",\n                                        res->x0, res->y0, res->x1, res->y1, res->pw, res->ph, res->numbands);\n                                for (bandno = 0; bandno < res->numbands; bandno++) {\n                                        opj_tcd_band_t *band = &res->bands[bandno];\n                                        fprintf(fd, \"        band {\\n\");\n                                        fprintf(fd,\n                                                \"          x0=%d, y0=%d, x1=%d, y1=%d, stepsize=%f, numbps=%d\\n\",\n                                                band->x0, band->y0, band->x1, band->y1, band->stepsize, band->numbps);\n                                        for (precno = 0; precno < res->pw * res->ph; precno++) {\n                                                opj_tcd_precinct_t *prec = &band->precincts[precno];\n                                                fprintf(fd, \"          prec {\\n\");\n                                                fprintf(fd,\n                                                        \"            x0=%d, y0=%d, x1=%d, y1=%d, cw=%d, ch=%d\\n\",\n                                                        prec->x0, prec->y0, prec->x1, prec->y1, prec->cw, prec->ch);\n                                                /*\n                                                for (cblkno = 0; cblkno < prec->cw * prec->ch; cblkno++) {\n                                                        opj_tcd_cblk_t *cblk = &prec->cblks[cblkno];\n                                                        fprintf(fd, \"            cblk {\\n\");\n                                                        fprintf(fd,\n                                                                \"              x0=%d, y0=%d, x1=%d, y1=%d\\n\",\n                                                                cblk->x0, cblk->y0, cblk->x1, cblk->y1);\n                                                        fprintf(fd, \"            }\\n\");\n                                                }\n                                                */\n                                                fprintf(fd, \"          }\\n\");\n                                        }\n                                        fprintf(fd, \"        }\\n\");\n                                }\n                                fprintf(fd, \"      }\\n\");\n                        }\n                        fprintf(fd, \"    }\\n\");\n                }\n                fprintf(fd, \"  }\\n\");\n        }\n        fprintf(fd, \"}\\n\");\n}\n#endif\n/**\n* Allocates memory for a decoding code block.\n*/\nstatic OPJ_BOOL opj_tcd_code_block_dec_allocate (opj_tcd_cblk_dec_t * p_code_block);\n\n/**\n * Deallocates the decoding data of the given precinct.\n */\nstatic void opj_tcd_code_block_dec_deallocate (opj_tcd_precinct_t * p_precinct);\n\n/**\n * Allocates memory for an encoding code block.\n */\nstatic OPJ_BOOL opj_tcd_code_block_enc_allocate (opj_tcd_cblk_enc_t * p_code_block);\n\n/**\n * Deallocates the encoding data of the given precinct.\n */\nstatic void opj_tcd_code_block_enc_deallocate (opj_tcd_precinct_t * p_precinct);\n\n\n/**\nFree the memory allocated for encoding\n@param tcd TCD handle\n*/\nstatic void opj_tcd_free_tile(opj_tcd_t *tcd);\n\n\nstatic OPJ_BOOL opj_tcd_t2_decode ( opj_tcd_t *p_tcd,\n                                    OPJ_BYTE * p_src_data,\n                                    OPJ_UINT32 * p_data_read,\n                                    OPJ_UINT32 p_max_src_size,\n                                    opj_codestream_index_t *p_cstr_index );\n\nstatic OPJ_BOOL opj_tcd_t1_decode (opj_tcd_t *p_tcd);\n\nstatic OPJ_BOOL opj_tcd_dwt_decode (opj_tcd_t *p_tcd);\n\nstatic OPJ_BOOL opj_tcd_mct_decode (opj_tcd_t *p_tcd);\n\nstatic OPJ_BOOL opj_tcd_dc_level_shift_decode (opj_tcd_t *p_tcd);\n\n\nstatic OPJ_BOOL opj_tcd_dc_level_shift_encode ( opj_tcd_t *p_tcd );\n\nstatic OPJ_BOOL opj_tcd_mct_encode ( opj_tcd_t *p_tcd );\n\nstatic OPJ_BOOL opj_tcd_dwt_encode ( opj_tcd_t *p_tcd );\n\nstatic OPJ_BOOL opj_tcd_t1_encode ( opj_tcd_t *p_tcd );\n\nstatic OPJ_BOOL opj_tcd_t2_encode (     opj_tcd_t *p_tcd,\n                                                                    OPJ_BYTE * p_dest_data,\n                                                                    OPJ_UINT32 * p_data_written,\n                                                                    OPJ_UINT32 p_max_dest_size,\n                                                                    opj_codestream_info_t *p_cstr_info );\n\nstatic OPJ_BOOL opj_tcd_rate_allocate_encode(   opj_tcd_t *p_tcd,\n                                                                                        OPJ_BYTE * p_dest_data,\n                                                                                        OPJ_UINT32 p_max_dest_size,\n                                                                                        opj_codestream_info_t *p_cstr_info );\n\n/* ----------------------------------------------------------------------- */\n\n/**\nCreate a new TCD handle\n*/\nopj_tcd_t* opj_tcd_create(OPJ_BOOL p_is_decoder)\n{\n        opj_tcd_t *l_tcd = 00;\n\n        /* create the tcd structure */\n        l_tcd = (opj_tcd_t*) opj_malloc(sizeof(opj_tcd_t));\n        if (!l_tcd) {\n                return 00;\n        }\n        memset(l_tcd,0,sizeof(opj_tcd_t));\n\n        l_tcd->m_is_decoder = p_is_decoder ? 1 : 0;\n\n        l_tcd->tcd_image = (opj_tcd_image_t*)opj_malloc(sizeof(opj_tcd_image_t));\n        if (!l_tcd->tcd_image) {\n                opj_free(l_tcd);\n                return 00;\n        }\n        memset(l_tcd->tcd_image,0,sizeof(opj_tcd_image_t));\n\n        return l_tcd;\n}\n\n\n/* ----------------------------------------------------------------------- */\n\nvoid opj_tcd_rateallocate_fixed(opj_tcd_t *tcd) {\n        OPJ_UINT32 layno;\n\n        for (layno = 0; layno < tcd->tcp->numlayers; layno++) {\n                opj_tcd_makelayer_fixed(tcd, layno, 1);\n        }\n}\n\n\nvoid opj_tcd_makelayer( opj_tcd_t *tcd,\n                                                OPJ_UINT32 layno,\n                                                OPJ_FLOAT64 thresh,\n                                                OPJ_UINT32 final)\n{\n        OPJ_UINT32 compno, resno, bandno, precno, cblkno;\n        OPJ_UINT32 passno;\n\n        opj_tcd_tile_t *tcd_tile = tcd->tcd_image->tiles;\n\n        tcd_tile->distolayer[layno] = 0;        /* fixed_quality */\n\n        for (compno = 0; compno < tcd_tile->numcomps; compno++) {\n                opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];\n\n                for (resno = 0; resno < tilec->numresolutions; resno++) {\n                        opj_tcd_resolution_t *res = &tilec->resolutions[resno];\n\n                        for (bandno = 0; bandno < res->numbands; bandno++) {\n                                opj_tcd_band_t *band = &res->bands[bandno];\n\n                                for (precno = 0; precno < res->pw * res->ph; precno++) {\n                                        opj_tcd_precinct_t *prc = &band->precincts[precno];\n\n                                        for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {\n                                                opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno];\n                                                opj_tcd_layer_t *layer = &cblk->layers[layno];\n                                                OPJ_UINT32 n;\n\n                                                if (layno == 0) {\n                                                        cblk->numpassesinlayers = 0;\n                                                }\n\n                                                n = cblk->numpassesinlayers;\n\n                                                for (passno = cblk->numpassesinlayers; passno < cblk->totalpasses; passno++) {\n                                                        OPJ_UINT32 dr;\n                                                        OPJ_FLOAT64 dd;\n                                                        opj_tcd_pass_t *pass = &cblk->passes[passno];\n\n                                                        if (n == 0) {\n                                                                dr = pass->rate;\n                                                                dd = pass->distortiondec;\n                                                        } else {\n                                                                dr = pass->rate - cblk->passes[n - 1].rate;\n                                                                dd = pass->distortiondec - cblk->passes[n - 1].distortiondec;\n                                                        }\n\n                                                        if (!dr) {\n                                                                if (dd != 0)\n                                                                        n = passno + 1;\n                                                                continue;\n                                                        }\n                                                        if (dd / dr >= thresh)\n                                                                n = passno + 1;\n                                                }\n\n                                                layer->numpasses = n - cblk->numpassesinlayers;\n\n                                                if (!layer->numpasses) {\n                                                        layer->disto = 0;\n                                                        continue;\n                                                }\n\n                                                if (cblk->numpassesinlayers == 0) {\n                                                        layer->len = cblk->passes[n - 1].rate;\n                                                        layer->data = cblk->data;\n                                                        layer->disto = cblk->passes[n - 1].distortiondec;\n                                                } else {\n                                                        layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - 1].rate;\n                                                        layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate;\n                                                        layer->disto = cblk->passes[n - 1].distortiondec - cblk->passes[cblk->numpassesinlayers - 1].distortiondec;\n                                                }\n\n                                                tcd_tile->distolayer[layno] += layer->disto;    /* fixed_quality */\n\n                                                if (final)\n                                                        cblk->numpassesinlayers = n;\n                                        }\n                                }\n                        }\n                }\n        }\n}\n\nvoid opj_tcd_makelayer_fixed(opj_tcd_t *tcd, OPJ_UINT32 layno, OPJ_UINT32 final) {\n        OPJ_UINT32 compno, resno, bandno, precno, cblkno;\n        OPJ_INT32 value;                        /*, matrice[tcd_tcp->numlayers][tcd_tile->comps[0].numresolutions][3]; */\n        OPJ_INT32 matrice[10][10][3];\n        OPJ_UINT32 i, j, k;\n\n        opj_cp_t *cp = tcd->cp;\n        opj_tcd_tile_t *tcd_tile = tcd->tcd_image->tiles;\n        opj_tcp_t *tcd_tcp = tcd->tcp;\n\n        for (compno = 0; compno < tcd_tile->numcomps; compno++) {\n                opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];\n\n                for (i = 0; i < tcd_tcp->numlayers; i++) {\n                        for (j = 0; j < tilec->numresolutions; j++) {\n                                for (k = 0; k < 3; k++) {\n                                        matrice[i][j][k] =\n                                                (OPJ_INT32) ((OPJ_FLOAT32)cp->m_specific_param.m_enc.m_matrice[i * tilec->numresolutions * 3 + j * 3 + k]\n                                                * (OPJ_FLOAT32) (tcd->image->comps[compno].prec / 16.0));\n                                }\n                        }\n                }\n\n                for (resno = 0; resno < tilec->numresolutions; resno++) {\n                        opj_tcd_resolution_t *res = &tilec->resolutions[resno];\n\n                        for (bandno = 0; bandno < res->numbands; bandno++) {\n                                opj_tcd_band_t *band = &res->bands[bandno];\n\n                                for (precno = 0; precno < res->pw * res->ph; precno++) {\n                                        opj_tcd_precinct_t *prc = &band->precincts[precno];\n\n                                        for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {\n                                                opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno];\n                                                opj_tcd_layer_t *layer = &cblk->layers[layno];\n                                                OPJ_UINT32 n;\n                                                OPJ_INT32 imsb = (OPJ_INT32)(tcd->image->comps[compno].prec - cblk->numbps); /* number of bit-plan equal to zero */\n\n                                                /* Correction of the matrix of coefficient to include the IMSB information */\n                                                if (layno == 0) {\n                                                        value = matrice[layno][resno][bandno];\n                                                        if (imsb >= value) {\n                                                                value = 0;\n                                                        } else {\n                                                                value -= imsb;\n                                                        }\n                                                } else {\n                                                        value = matrice[layno][resno][bandno] - matrice[layno - 1][resno][bandno];\n                                                        if (imsb >= matrice[layno - 1][resno][bandno]) {\n                                                                value -= (imsb - matrice[layno - 1][resno][bandno]);\n                                                                if (value < 0) {\n                                                                        value = 0;\n                                                                }\n                                                        }\n                                                }\n\n                                                if (layno == 0) {\n                                                        cblk->numpassesinlayers = 0;\n                                                }\n\n                                                n = cblk->numpassesinlayers;\n                                                if (cblk->numpassesinlayers == 0) {\n                                                        if (value != 0) {\n                                                                n = 3 * (OPJ_UINT32)value - 2 + cblk->numpassesinlayers;\n                                                        } else {\n                                                                n = cblk->numpassesinlayers;\n                                                        }\n                                                } else {\n                                                        n = 3 * (OPJ_UINT32)value + cblk->numpassesinlayers;\n                                                }\n\n                                                layer->numpasses = n - cblk->numpassesinlayers;\n\n                                                if (!layer->numpasses)\n                                                        continue;\n\n                                                if (cblk->numpassesinlayers == 0) {\n                                                        layer->len = cblk->passes[n - 1].rate;\n                                                        layer->data = cblk->data;\n                                                } else {\n                                                        layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - 1].rate;\n                                                        layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate;\n                                                }\n\n                                                if (final)\n                                                        cblk->numpassesinlayers = n;\n                                        }\n                                }\n                        }\n                }\n        }\n}\n\nOPJ_BOOL opj_tcd_rateallocate(  opj_tcd_t *tcd,\n                                                                OPJ_BYTE *dest,\n                                                                OPJ_UINT32 * p_data_written,\n                                                                OPJ_UINT32 len,\n                                                                opj_codestream_info_t *cstr_info)\n{\n        OPJ_UINT32 compno, resno, bandno, precno, cblkno, layno;\n        OPJ_UINT32 passno;\n        OPJ_FLOAT64 min, max;\n        OPJ_FLOAT64 cumdisto[100];      /* fixed_quality */\n        const OPJ_FLOAT64 K = 1;                /* 1.1; fixed_quality */\n        OPJ_FLOAT64 maxSE = 0;\n\n        opj_cp_t *cp = tcd->cp;\n        opj_tcd_tile_t *tcd_tile = tcd->tcd_image->tiles;\n        opj_tcp_t *tcd_tcp = tcd->tcp;\n\n        min = DBL_MAX;\n        max = 0;\n\n        tcd_tile->numpix = 0;           /* fixed_quality */\n\n        for (compno = 0; compno < tcd_tile->numcomps; compno++) {\n                opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];\n                tilec->numpix = 0;\n\n                for (resno = 0; resno < tilec->numresolutions; resno++) {\n                        opj_tcd_resolution_t *res = &tilec->resolutions[resno];\n\n                        for (bandno = 0; bandno < res->numbands; bandno++) {\n                                opj_tcd_band_t *band = &res->bands[bandno];\n\n                                for (precno = 0; precno < res->pw * res->ph; precno++) {\n                                        opj_tcd_precinct_t *prc = &band->precincts[precno];\n\n                                        for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {\n                                                opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno];\n\n                                                for (passno = 0; passno < cblk->totalpasses; passno++) {\n                                                        opj_tcd_pass_t *pass = &cblk->passes[passno];\n                                                        OPJ_INT32 dr;\n                                                        OPJ_FLOAT64 dd, rdslope;\n\n                                                        if (passno == 0) {\n                                                                dr = (OPJ_INT32)pass->rate;\n                                                                dd = pass->distortiondec;\n                                                        } else {\n                                                                dr = (OPJ_INT32)(pass->rate - cblk->passes[passno - 1].rate);\n                                                                dd = pass->distortiondec - cblk->passes[passno - 1].distortiondec;\n                                                        }\n\n                                                        if (dr == 0) {\n                                                                continue;\n                                                        }\n\n                                                        rdslope = dd / dr;\n                                                        if (rdslope < min) {\n                                                                min = rdslope;\n                                                        }\n\n                                                        if (rdslope > max) {\n                                                                max = rdslope;\n                                                        }\n                                                } /* passno */\n\n                                                /* fixed_quality */\n                                                tcd_tile->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0));\n                                                tilec->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0));\n                                        } /* cbklno */\n                                } /* precno */\n                        } /* bandno */\n                } /* resno */\n\n                maxSE += (((OPJ_FLOAT64)(1 << tcd->image->comps[compno].prec) - 1.0)\n                        * ((OPJ_FLOAT64)(1 << tcd->image->comps[compno].prec) -1.0))\n                        * ((OPJ_FLOAT64)(tilec->numpix));\n        } /* compno */\n\n        /* index file */\n        if(cstr_info) {\n                opj_tile_info_t *tile_info = &cstr_info->tile[tcd->tcd_tileno];\n                tile_info->numpix = tcd_tile->numpix;\n                tile_info->distotile = tcd_tile->distotile;\n                tile_info->thresh = (OPJ_FLOAT64 *) opj_malloc(tcd_tcp->numlayers * sizeof(OPJ_FLOAT64));\n        }\n\n        for (layno = 0; layno < tcd_tcp->numlayers; layno++) {\n                OPJ_FLOAT64 lo = min;\n                OPJ_FLOAT64 hi = max;\n                OPJ_BOOL success = OPJ_FALSE;\n                OPJ_UINT32 maxlen = tcd_tcp->rates[layno] ? opj_uint_min(((OPJ_UINT32) ceil(tcd_tcp->rates[layno])), len) : len;\n                OPJ_FLOAT64 goodthresh = 0;\n                OPJ_FLOAT64 stable_thresh = 0;\n                OPJ_UINT32 i;\n                OPJ_FLOAT64 distotarget;                /* fixed_quality */\n\n                /* fixed_quality */\n                distotarget = tcd_tile->distotile - ((K * maxSE) / pow((OPJ_FLOAT32)10, tcd_tcp->distoratio[layno] / 10));\n\n                /* Don't try to find an optimal threshold but rather take everything not included yet, if\n                  -r xx,yy,zz,0   (disto_alloc == 1 and rates == 0)\n                  -q xx,yy,zz,0   (fixed_quality == 1 and distoratio == 0)\n                  ==> possible to have some lossy layers and the last layer for sure lossless */\n                if ( ((cp->m_specific_param.m_enc.m_disto_alloc==1) && (tcd_tcp->rates[layno]>0)) || ((cp->m_specific_param.m_enc.m_fixed_quality==1) && (tcd_tcp->distoratio[layno]>0))) {\n                        opj_t2_t*t2 = opj_t2_create(tcd->image, cp);\n                        OPJ_FLOAT64 thresh = 0;\n\n                        if (t2 == 00) {\n                                return OPJ_FALSE;\n                        }\n\n                        for     (i = 0; i < 128; ++i) {\n                                OPJ_FLOAT64 distoachieved = 0;  /* fixed_quality */\n\n                                thresh = (lo + hi) / 2;\n\n                                opj_tcd_makelayer(tcd, layno, thresh, 0);\n\n                                if (cp->m_specific_param.m_enc.m_fixed_quality) {       /* fixed_quality */\n                                        if(cp->m_specific_param.m_enc.m_cinema){\n                                                if (! opj_t2_encode_packets(t2,tcd->tcd_tileno, tcd_tile, layno + 1, dest, p_data_written, maxlen, cstr_info,tcd->cur_tp_num,tcd->tp_pos,tcd->cur_pino,THRESH_CALC)) {\n\n                                                        lo = thresh;\n                                                        continue;\n                                                }\n                                                else {\n                                                        distoachieved = layno == 0 ?\n                                                                        tcd_tile->distolayer[0] : cumdisto[layno - 1] + tcd_tile->distolayer[layno];\n\n                                                        if (distoachieved < distotarget) {\n                                                                hi=thresh;\n                                                                stable_thresh = thresh;\n                                                                continue;\n                                                        }else{\n                                                                lo=thresh;\n                                                        }\n                                                }\n                                        }else{\n                                                distoachieved = (layno == 0) ?\n                                                                tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]);\n\n                                                if (distoachieved < distotarget) {\n                                                        hi = thresh;\n                                                        stable_thresh = thresh;\n                                                        continue;\n                                                }\n                                                lo = thresh;\n                                        }\n                                } else {\n                                        if (! opj_t2_encode_packets(t2, tcd->tcd_tileno, tcd_tile, layno + 1, dest,p_data_written, maxlen, cstr_info,tcd->cur_tp_num,tcd->tp_pos,tcd->cur_pino,THRESH_CALC))\n                                        {\n                                                /* TODO: what to do with l ??? seek / tell ??? */\n                                                /* opj_event_msg(tcd->cinfo, EVT_INFO, \"rate alloc: len=%d, max=%d\\n\", l, maxlen); */\n                                                lo = thresh;\n                                                continue;\n                                        }\n\n                                        hi = thresh;\n                                        stable_thresh = thresh;\n                                }\n                        }\n\n                        success = OPJ_TRUE;\n                        goodthresh = stable_thresh == 0? thresh : stable_thresh;\n\n                        opj_t2_destroy(t2);\n                } else {\n                        success = OPJ_TRUE;\n                        goodthresh = min;\n                }\n\n                if (!success) {\n                        return OPJ_FALSE;\n                }\n\n                if(cstr_info) { /* Threshold for Marcela Index */\n                        cstr_info->tile[tcd->tcd_tileno].thresh[layno] = goodthresh;\n                }\n\n                opj_tcd_makelayer(tcd, layno, goodthresh, 1);\n\n                /* fixed_quality */\n                cumdisto[layno] = (layno == 0) ? tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]);\n        }\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_tcd_init( opj_tcd_t *p_tcd,\n                                           opj_image_t * p_image,\n                                           opj_cp_t * p_cp )\n{\n        OPJ_UINT32 l_tile_comp_size;\n\n        p_tcd->image = p_image;\n        p_tcd->cp = p_cp;\n\n        p_tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_malloc(sizeof(opj_tcd_tile_t));\n        if (! p_tcd->tcd_image->tiles) {\n                return OPJ_FALSE;\n        }\n        memset(p_tcd->tcd_image->tiles,0, sizeof(opj_tcd_tile_t));\n\n        l_tile_comp_size = p_image->numcomps * (OPJ_UINT32)sizeof(opj_tcd_tilecomp_t);\n        p_tcd->tcd_image->tiles->comps = (opj_tcd_tilecomp_t *) opj_malloc(l_tile_comp_size);\n        if (! p_tcd->tcd_image->tiles->comps ) {\n                return OPJ_FALSE;\n        }\n        memset( p_tcd->tcd_image->tiles->comps , 0 , l_tile_comp_size);\n\n        p_tcd->tcd_image->tiles->numcomps = p_image->numcomps;\n        p_tcd->tp_pos = p_cp->m_specific_param.m_enc.m_tp_pos;\n\n        return OPJ_TRUE;\n}\n\n/**\nDestroy a previously created TCD handle\n*/\nvoid opj_tcd_destroy(opj_tcd_t *tcd) {\n        if (tcd) {\n                opj_tcd_free_tile(tcd);\n\n                if (tcd->tcd_image) {\n                        opj_free(tcd->tcd_image);\n                        tcd->tcd_image = 00;\n                }\n                opj_free(tcd);\n        }\n}\n\n/* ----------------------------------------------------------------------- */\n#define OPJ_MACRO_TCD_ALLOCATE(FUNCTION,TYPE,FRACTION,ELEMENT,FUNCTION_ELEMENT)                                                                                                                                       \\\nOPJ_BOOL FUNCTION (     opj_tcd_t *p_tcd,                        \\\n                        OPJ_UINT32 p_tile_no                        \\\n                        )                                           \\\n{                                                                   \\\n        OPJ_UINT32 (*l_gain_ptr)(OPJ_UINT32) = 00;                  \\\n        OPJ_UINT32 compno, resno, bandno, precno, cblkno;           \\\n        opj_tcp_t * l_tcp = 00;                                  \\\n        opj_cp_t * l_cp = 00;                                    \\\n        opj_tcd_tile_t * l_tile = 00;                            \\\n        opj_tccp_t *l_tccp = 00;                                    \\\n        opj_tcd_tilecomp_t *l_tilec = 00;                        \\\n        opj_image_comp_t * l_image_comp = 00;                       \\\n        opj_tcd_resolution_t *l_res = 00;                        \\\n        opj_tcd_band_t *l_band = 00;                             \\\n        opj_stepsize_t * l_step_size = 00;                          \\\n        opj_tcd_precinct_t *l_current_precinct = 00;             \\\n        TYPE* l_code_block = 00;                                    \\\n        opj_image_t *l_image = 00;                                  \\\n        OPJ_UINT32 p,q;                                             \\\n        OPJ_UINT32 l_level_no;                                      \\\n        OPJ_UINT32 l_pdx, l_pdy;                                    \\\n        OPJ_UINT32 l_gain;                                          \\\n        OPJ_INT32 l_x0b, l_y0b;                                     \\\n        /* extent of precincts , top left, bottom right**/          \\\n        OPJ_INT32 l_tl_prc_x_start, l_tl_prc_y_start, l_br_prc_x_end, l_br_prc_y_end;                                                                                                                             \\\n        /* number of precinct for a resolution */                   \\\n        OPJ_UINT32 l_nb_precincts;                                  \\\n        /* room needed to store l_nb_precinct precinct for a resolution */                                                                                                                                        \\\n        OPJ_UINT32 l_nb_precinct_size;                              \\\n        /* number of code blocks for a precinct*/                   \\\n        OPJ_UINT32 l_nb_code_blocks;                                \\\n        /* room needed to store l_nb_code_blocks code blocks for a precinct*/                                                                                                                                     \\\n        OPJ_UINT32 l_nb_code_blocks_size;                           \\\n        /* size of data for a tile */                               \\\n        OPJ_UINT32 l_data_size;                                     \\\n                                                                    \\\n        l_cp = p_tcd->cp;                                           \\\n        l_tcp = &(l_cp->tcps[p_tile_no]);                           \\\n        l_tile = p_tcd->tcd_image->tiles;                           \\\n        l_tccp = l_tcp->tccps;                                      \\\n        l_tilec = l_tile->comps;                                    \\\n        l_image = p_tcd->image;                                     \\\n        l_image_comp = p_tcd->image->comps;                         \\\n                                                                    \\\n        p = p_tile_no % l_cp->tw;       /* tile coordinates */      \\\n        q = p_tile_no / l_cp->tw;                                   \\\n        /*fprintf(stderr, \"Tile coordinate = %d,%d\\n\", p, q);*/     \\\n                                                                    \\\n        /* 4 borders of the tile rescale on the image if necessary */                                                                                                                                             \\\n        l_tile->x0 = opj_int_max((OPJ_INT32)(l_cp->tx0 + p * l_cp->tdx), (OPJ_INT32)l_image->x0);                                                                                                                                             \\\n        l_tile->y0 = opj_int_max((OPJ_INT32)(l_cp->ty0 + q * l_cp->tdy), (OPJ_INT32)l_image->y0);                                                                                                                                             \\\n        l_tile->x1 = opj_int_min((OPJ_INT32)(l_cp->tx0 + (p + 1) * l_cp->tdx), (OPJ_INT32)l_image->x1);                                                                                                                                       \\\n        l_tile->y1 = opj_int_min((OPJ_INT32)(l_cp->ty0 + (q + 1) * l_cp->tdy), (OPJ_INT32)l_image->y1);                                                                                                                                       \\\n        /* testcase 1888.pdf.asan.35.988 */ \\\n        if (l_tccp->numresolutions == 0) { \\\n            fprintf(stderr, \"tiles require at least one resolution\\n\"); \\\n            return OPJ_FALSE; \\\n        } \\\n        /*fprintf(stderr, \"Tile border = %d,%d,%d,%d\\n\", l_tile->x0, l_tile->y0,l_tile->x1,l_tile->y1);*/                                                                                                         \\\n                                                                    \\\n        /*tile->numcomps = image->numcomps; */                      \\\n        for(compno = 0; compno < l_tile->numcomps; ++compno) {      \\\n                /*fprintf(stderr, \"compno = %d/%d\\n\", compno, l_tile->numcomps);*/                                                                                                                                \\\n                                                                    \\\n                /* border of each l_tile component (global) */      \\\n                l_tilec->x0 = opj_int_ceildiv(l_tile->x0, (OPJ_INT32)l_image_comp->dx);                                                                                                                                          \\\n                l_tilec->y0 = opj_int_ceildiv(l_tile->y0, (OPJ_INT32)l_image_comp->dy);                                                                                                                                          \\\n                l_tilec->x1 = opj_int_ceildiv(l_tile->x1, (OPJ_INT32)l_image_comp->dx);                                                                                                                                          \\\n                l_tilec->y1 = opj_int_ceildiv(l_tile->y1, (OPJ_INT32)l_image_comp->dy);                                                                                                                                          \\\n                /*fprintf(stderr, \"\\tTile compo border = %d,%d,%d,%d\\n\", l_tilec->x0, l_tilec->y0,l_tilec->x1,l_tilec->y1);*/                                                                                     \\\n                if (l_tilec->x1 < 0 || l_tilec->x0 < 0 || l_tilec->y1 < 0 || l_tilec->y0 < 0) return OPJ_FALSE;\\\n                l_data_size = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0)           \\\n                * (OPJ_UINT32)(l_tilec->y1 - l_tilec->y0) * (OPJ_UINT32)sizeof(OPJ_UINT32 );\\\n                l_tilec->numresolutions = l_tccp->numresolutions;   \\\n                if (l_tccp->numresolutions < l_cp->m_specific_param.m_dec.m_reduce) {                                                                                                                             \\\n                        l_tilec->minimum_num_resolutions = 1;       \\\n                }                                                   \\\n                else {                                              \\\n                        l_tilec->minimum_num_resolutions = l_tccp->numresolutions                                                                                                                                 \\\n                        - l_cp->m_specific_param.m_dec.m_reduce;    \\\n                }                                                   \\\n                                                                    \\\n                if (l_tilec->data == 00) {                          \\\n                        l_tilec->data = (OPJ_INT32 *) opj_malloc(l_data_size);                                                                                                                                    \\\n                        if (! l_tilec->data ) {                     \\\n                                return OPJ_FALSE;                   \\\n                        }                                           \\\n                        /*fprintf(stderr, \"\\tAllocate data of tilec (int): %d x OPJ_UINT32\\n\",l_data_size);*/                                                                                                     \\\n                                                                    \\\n                        l_tilec->data_size = l_data_size;           \\\n                }                                                   \\\n                else if (l_data_size > l_tilec->data_size) {        \\\n                        OPJ_INT32 * new_data = (OPJ_INT32 *) opj_realloc(l_tilec->data, l_data_size);                                                                                                             \\\n                        /* opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to handle tile data\\n\");                                                                                                 */  \\\n                        fprintf(stderr, \"Not enough memory to handle tile data\\n\");                                                                                                                               \\\n                        if (! new_data) {                           \\\n                                opj_free(l_tilec->data);            \\\n                                l_tilec->data = NULL;               \\\n                                l_tilec->data_size = 0;             \\\n                                return OPJ_FALSE;                   \\\n                        }                                           \\\n                        l_tilec->data = new_data;                   \\\n                        /*fprintf(stderr, \"\\tReallocate data of tilec (int): from %d to %d x OPJ_UINT32\\n\", l_tilec->data_size, l_data_size);*/                                                                   \\\n                        l_tilec->data_size = l_data_size;           \\\n                }                                                   \\\n                                                                    \\\n                l_data_size = l_tilec->numresolutions * (OPJ_UINT32)sizeof(opj_tcd_resolution_t);                                                                                                                          \\\n                                                                    \\\n                if (l_tilec->resolutions == 00) {                   \\\n                        l_tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(l_data_size);                                                                                                               \\\n                        if (! l_tilec->resolutions ) {              \\\n                                return OPJ_FALSE;                   \\\n                        }                                           \\\n                        /*fprintf(stderr, \"\\tAllocate resolutions of tilec (opj_tcd_resolution_t): %d\\n\",l_data_size);*/                                                                                       \\\n                        l_tilec->resolutions_size = l_data_size;    \\\n                        memset(l_tilec->resolutions,0,l_data_size); \\\n                }                                                   \\\n                else if (l_data_size > l_tilec->resolutions_size) { \\\n                        opj_tcd_resolution_t* new_resolutions = (opj_tcd_resolution_t *) opj_realloc(l_tilec->resolutions, l_data_size);                                                                    \\\n                        if (! new_resolutions) {                    \\\n                                /* opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to tile resolutions\\n\");                                                                                         */  \\\n                                fprintf(stderr, \"Not enough memory to tile resolutions\\n\");                                                                                                                       \\\n                                opj_free(l_tilec->resolutions);     \\\n                                l_tilec->resolutions = NULL;        \\\n                                l_tilec->resolutions_size = 0;      \\\n                                return OPJ_FALSE;                   \\\n                        }                                           \\\n                        l_tilec->resolutions = new_resolutions;     \\\n                        /*fprintf(stderr, \"\\tReallocate data of tilec (int): from %d to %d x OPJ_UINT32\\n\", l_tilec->resolutions_size, l_data_size);*/                                                            \\\n                        memset(((OPJ_BYTE*) l_tilec->resolutions)+l_tilec->resolutions_size,0,l_data_size - l_tilec->resolutions_size);                                                                           \\\n                        l_tilec->resolutions_size = l_data_size;    \\\n                }                                                   \\\n                                                                    \\\n                l_level_no = l_tilec->numresolutions - 1;           \\\n                l_res = l_tilec->resolutions;                       \\\n                l_step_size = l_tccp->stepsizes;                    \\\n                if (l_tccp->qmfbid == 0) {                          \\\n                        l_gain_ptr = &opj_dwt_getgain_real;         \\\n                }                                                   \\\n                else {                                              \\\n                        l_gain_ptr  = &opj_dwt_getgain;             \\\n                }                                                   \\\n                /*fprintf(stderr, \"\\tlevel_no=%d\\n\",l_level_no);*/  \\\n                                                                                                                                                                                                                  \\\n                for(resno = 0; resno < l_tilec->numresolutions; ++resno) {                                                                                                                                        \\\n                        /*fprintf(stderr, \"\\t\\tresno = %d/%d\\n\", resno, l_tilec->numresolutions);*/                                                                                                               \\\n                        OPJ_INT32 tlcbgxstart, tlcbgystart /*, brcbgxend, brcbgyend*/;                                                                                                                                 \\\n                        OPJ_UINT32 cbgwidthexpn, cbgheightexpn;                                                                                                                                                   \\\n                        OPJ_UINT32 cblkwidthexpn, cblkheightexpn;                                                                                                                                                 \\\n                                                                                                                                                                                                                  \\\n                        /* border for each resolution level (global) */                                                                                                                                           \\\n                        l_res->x0 = opj_int_ceildivpow2(l_tilec->x0, (OPJ_INT32)l_level_no);                                                                                                                                     \\\n                        l_res->y0 = opj_int_ceildivpow2(l_tilec->y0, (OPJ_INT32)l_level_no);                                                                                                                                     \\\n                        l_res->x1 = opj_int_ceildivpow2(l_tilec->x1, (OPJ_INT32)l_level_no);                                                                                                                                     \\\n                        l_res->y1 = opj_int_ceildivpow2(l_tilec->y1, (OPJ_INT32)l_level_no);                                                                                                                                     \\\n                        /*fprintf(stderr, \"\\t\\t\\tres_x0= %d, res_y0 =%d, res_x1=%d, res_y1=%d\\n\", l_res->x0, l_res->y0, l_res->x1, l_res->y1);*/                                                                  \\\n                        /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */                                                                                                                     \\\n                        l_pdx = l_tccp->prcw[resno];                                                                                                                                                              \\\n                        l_pdy = l_tccp->prch[resno];                                                                                                                                                              \\\n                        if (l_pdx == 0 || l_pdy == 0)                                                                                                                                                                \\\n                            return OPJ_FALSE;                                                                                                                                                                     \\\n                        /*fprintf(stderr, \"\\t\\t\\tpdx=%d, pdy=%d\\n\", l_pdx, l_pdy);*/                                                                                                                              \\\n                        /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000)  */                                                                                                                            \\\n                        l_tl_prc_x_start = opj_int_floordivpow2(l_res->x0, (OPJ_INT32)l_pdx) << l_pdx;                                                                                                                           \\\n                        l_tl_prc_y_start = opj_int_floordivpow2(l_res->y0, (OPJ_INT32)l_pdy) << l_pdy;                                                                                                                           \\\n                        l_br_prc_x_end = opj_int_ceildivpow2(l_res->x1, (OPJ_INT32)l_pdx) << l_pdx;                                                                                                                              \\\n                        l_br_prc_y_end = opj_int_ceildivpow2(l_res->y1, (OPJ_INT32)l_pdy) << l_pdy;                                                                                                                              \\\n                        /*fprintf(stderr, \"\\t\\t\\tprc_x_start=%d, prc_y_start=%d, br_prc_x_end=%d, br_prc_y_end=%d \\n\", l_tl_prc_x_start, l_tl_prc_y_start, l_br_prc_x_end ,l_br_prc_y_end );*/                    \\\n                                                                                                                                                                                                                  \\\n                        l_res->pw = (l_res->x0 == l_res->x1) ? 0 : (OPJ_UINT32)((l_br_prc_x_end - l_tl_prc_x_start) >> l_pdx);                                                                                                \\\n                        l_res->ph = (l_res->y0 == l_res->y1) ? 0 : (OPJ_UINT32)((l_br_prc_y_end - l_tl_prc_y_start) >> l_pdy);                                                                                                \\\n                        /*fprintf(stderr, \"\\t\\t\\tres_pw=%d, res_ph=%d\\n\", l_res->pw, l_res->ph );*/                                                                                                               \\\n                                                                                                                                                                                                                  \\\n                        l_nb_precincts = l_res->pw * l_res->ph;                                                                                                                                                   \\\n                        l_nb_precinct_size = l_nb_precincts * (OPJ_UINT32)sizeof(opj_tcd_precinct_t);                                                                                                                      \\\n                        if (resno == 0) {                                                                                                                                                                         \\\n                                tlcbgxstart = l_tl_prc_x_start;                                                                                                                                                   \\\n                                tlcbgystart = l_tl_prc_y_start;                                                                                                                                                   \\\n                                /*brcbgxend = l_br_prc_x_end;*/                                                                                                                                                       \\\n                               /* brcbgyend = l_br_prc_y_end;*/                                                                                                                                                       \\\n                                cbgwidthexpn = l_pdx;                                                                                                                                                             \\\n                                cbgheightexpn = l_pdy;                                                                                                                                                            \\\n                                l_res->numbands = 1;                                                                                                                                                              \\\n                        }                                                                                                                                                                                         \\\n                        else {                                                                                                                                                                                    \\\n                                tlcbgxstart = opj_int_ceildivpow2(l_tl_prc_x_start, 1);                                                                                                                               \\\n                                tlcbgystart = opj_int_ceildivpow2(l_tl_prc_y_start, 1);                                                                                                                               \\\n                                /*brcbgxend = opj_int_ceildivpow2(l_br_prc_x_end, 1);*/                                                                                                                            \\\n                                /*brcbgyend = opj_int_ceildivpow2(l_br_prc_y_end, 1);*/                                                                                                                            \\\n                                cbgwidthexpn = l_pdx - 1;                                                                                                                                                         \\\n                                cbgheightexpn = l_pdy - 1;                                                                                                                                                        \\\n                                l_res->numbands = 3;                                                                                                                                                              \\\n                        }                                                                                                                                                                                         \\\n                                                                                                                                                                                                                  \\\n                        cblkwidthexpn = opj_uint_min(l_tccp->cblkw, cbgwidthexpn);                                                                                                                                    \\\n                        cblkheightexpn = opj_uint_min(l_tccp->cblkh, cbgheightexpn);                                                                                                                                  \\\n                        l_band = l_res->bands;                                                                                                                                                                    \\\n                                                                                                                                                                                                                  \\\n                        for (bandno = 0; bandno < l_res->numbands; ++bandno) {                                                                                                                                    \\\n                                OPJ_INT32 numbps;                                                                                                                                                                 \\\n                                /*fprintf(stderr, \"\\t\\t\\tband_no=%d/%d\\n\", bandno, l_res->numbands );*/                                                                                                           \\\n                                                                                                                                                                                                                  \\\n                                if (resno == 0) {                                                                                                                                                                 \\\n                                        l_band->bandno = 0 ;                                                                                                                                                      \\\n                                        l_band->x0 = opj_int_ceildivpow2(l_tilec->x0, (OPJ_INT32)l_level_no);                                                                                                                    \\\n                                        l_band->y0 = opj_int_ceildivpow2(l_tilec->y0, (OPJ_INT32)l_level_no);                                                                                                                    \\\n                                        l_band->x1 = opj_int_ceildivpow2(l_tilec->x1, (OPJ_INT32)l_level_no);                                                                                                                    \\\n                                        l_band->y1 = opj_int_ceildivpow2(l_tilec->y1, (OPJ_INT32)l_level_no);                                                                                                                    \\\n                                }                                                                                                                                                                                 \\\n                                else {                                                                                                                                                                            \\\n                                        l_band->bandno = bandno + 1;                                                                                                                                              \\\n                                        /* x0b = 1 if bandno = 1 or 3 */                                                                                                                                          \\\n                                        l_x0b = l_band->bandno&1;                                                                                                                                                 \\\n                                        /* y0b = 1 if bandno = 2 or 3 */                                                                                                                                          \\\n                                        l_y0b = (OPJ_INT32)((l_band->bandno)>>1);                                                                                                                                              \\\n                                        /* l_band border (global) */                                                                                                                                              \\\n                                        l_band->x0 = opj_int_ceildivpow2(l_tilec->x0 - (1 << l_level_no) * l_x0b, (OPJ_INT32)(l_level_no + 1));                                                                                    \\\n                                        l_band->y0 = opj_int_ceildivpow2(l_tilec->y0 - (1 << l_level_no) * l_y0b, (OPJ_INT32)(l_level_no + 1));                                                                                    \\\n                                        l_band->x1 = opj_int_ceildivpow2(l_tilec->x1 - (1 << l_level_no) * l_x0b, (OPJ_INT32)(l_level_no + 1));                                                                                    \\\n                                        l_band->y1 = opj_int_ceildivpow2(l_tilec->y1 - (1 << l_level_no) * l_y0b, (OPJ_INT32)(l_level_no + 1));                                                                                    \\\n                                }                                                                                                                                                                                 \\\n                                                                                                                                                                                                                  \\\n                                /** avoid an if with storing function pointer */                                                                                                                                  \\\n                                l_gain = (*l_gain_ptr) (l_band->bandno);                                                                                                                                          \\\n                                numbps = (OPJ_INT32)(l_image_comp->prec + l_gain);                                                                                                                                             \\\n                                l_band->stepsize = (OPJ_FLOAT32)(((1.0 + l_step_size->mant / 2048.0) * pow(2.0, (OPJ_INT32) (numbps - l_step_size->expn)))) * FRACTION;                                           \\\n                                l_band->numbps = l_step_size->expn + (OPJ_INT32)l_tccp->numgbits - 1;      /* WHY -1 ? */                                                                                                    \\\n                                                                                                                                                                                                                  \\\n                                if (! l_band->precincts) {                                                                                                                                                        \\\n                                        l_band->precincts = (opj_tcd_precinct_t *) opj_malloc( /*3 * */ l_nb_precinct_size);                                                                                   \\\n                                        if (! l_band->precincts) {                                                                                                                                                \\\n                                                return OPJ_FALSE;                                                                                                                                                 \\\n                                        }                                                                                                                                                                         \\\n                                        /*fprintf(stderr, \"\\t\\t\\t\\tAllocate precincts of a band (opj_tcd_precinct_t): %d\\n\",l_nb_precinct_size);     */                                                        \\\n                                        memset(l_band->precincts,0,l_nb_precinct_size);                                                                                                                           \\\n                                        l_band->precincts_data_size = l_nb_precinct_size;                                                                                                                         \\\n                                }                                                                                                                                                                                 \\\n                                else if (l_band->precincts_data_size < l_nb_precinct_size) {                                                                                                                      \\\n                                                                                                                                                                                                                  \\\n                                        opj_tcd_precinct_t * new_precincts = (opj_tcd_precinct_t *) opj_realloc(l_band->precincts,/*3 * */ l_nb_precinct_size);                                             \\\n                                        if (! new_precincts) {                                                                                                                                                    \\\n                                                /* opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory to handle band precints\\n\");                                                                    */   \\\n                                                fprintf(stderr, \"Not enough memory to handle band precints\\n\");                                                                                                   \\\n                                                opj_free(l_band->precincts);                                                                                                                                      \\\n                                                l_band->precincts = NULL;                                                                                                                                         \\\n                                                l_band->precincts_data_size = 0;                                                                                                                                  \\\n                                                return OPJ_FALSE;                                                                                                                                                 \\\n                                        }                                                                                                                                                                         \\\n                                        l_band->precincts = new_precincts;                                                                                                                                        \\\n                                        /*fprintf(stderr, \"\\t\\t\\t\\tReallocate precincts of a band (opj_tcd_precinct_t): from %d to %d\\n\",l_band->precincts_data_size, l_nb_precinct_size);*/                   \\\n                                        memset(((OPJ_BYTE *) l_band->precincts) + l_band->precincts_data_size,0,l_nb_precinct_size - l_band->precincts_data_size);                                                \\\n                                        l_band->precincts_data_size = l_nb_precinct_size;                                                                                                                         \\\n                                }                                                                                                                                                                                 \\\n                                                                                                                                                                                                                  \\\n                                l_current_precinct = l_band->precincts;                                                                                                                                           \\\n                                for     (precno = 0; precno < l_nb_precincts; ++precno) {                                                                                                                         \\\n                                        OPJ_INT32 tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend;                                                                                                             \\\n                                        OPJ_INT32 cbgxstart = tlcbgxstart + (OPJ_INT32)(precno % l_res->pw) * (1 << cbgwidthexpn);                                                                                           \\\n                                        OPJ_INT32 cbgystart = tlcbgystart + (OPJ_INT32)(precno / l_res->pw) * (1 << cbgheightexpn);                                                                                          \\\n                                        OPJ_INT32 cbgxend = cbgxstart + (1 << cbgwidthexpn);                                                                                                                      \\\n                                        OPJ_INT32 cbgyend = cbgystart + (1 << cbgheightexpn);                                                                                                                     \\\n                                        /*fprintf(stderr, \"\\t precno=%d; bandno=%d, resno=%d; compno=%d\\n\", precno, bandno , resno, compno);*/                                                                    \\\n                                        /*fprintf(stderr, \"\\t tlcbgxstart(=%d) + (precno(=%d) percent res->pw(=%d)) * (1 << cbgwidthexpn(=%d)) \\n\",tlcbgxstart,precno,l_res->pw,cbgwidthexpn);*/                  \\\n                                                                                                                                                                                                                  \\\n                                        /* precinct size (global) */                                                                                                                                              \\\n                                        /*fprintf(stderr, \"\\t cbgxstart=%d, l_band->x0 = %d \\n\",cbgxstart, l_band->x0);*/                                                                                         \\\n                                                                                                                                                                                                                  \\\n                                        l_current_precinct->x0 = opj_int_max(cbgxstart, l_band->x0);                                                                                                                  \\\n                                        l_current_precinct->y0 = opj_int_max(cbgystart, l_band->y0);                                                                                                                  \\\n                                        l_current_precinct->x1 = opj_int_min(cbgxend, l_band->x1);                                                                                                                    \\\n                                        l_current_precinct->y1 = opj_int_min(cbgyend, l_band->y1);                                                                                                                    \\\n                                        /*fprintf(stderr, \"\\t prc_x0=%d; prc_y0=%d, prc_x1=%d; prc_y1=%d\\n\",l_current_precinct->x0, l_current_precinct->y0 ,l_current_precinct->x1, l_current_precinct->y1);*/    \\\n                                                                                                                                                                                                                  \\\n                                        tlcblkxstart = opj_int_floordivpow2(l_current_precinct->x0, (OPJ_INT32)cblkwidthexpn) << cblkwidthexpn;                                                                                  \\\n                                        /*fprintf(stderr, \"\\t tlcblkxstart =%d\\n\",tlcblkxstart );*/                                                                                                               \\\n                                        tlcblkystart = opj_int_floordivpow2(l_current_precinct->y0, (OPJ_INT32)cblkheightexpn) << cblkheightexpn;                                                                                \\\n                                        /*fprintf(stderr, \"\\t tlcblkystart =%d\\n\",tlcblkystart );*/                                                                                                               \\\n                                        brcblkxend = opj_int_ceildivpow2(l_current_precinct->x1, (OPJ_INT32)cblkwidthexpn) << cblkwidthexpn;                                                                                     \\\n                                        /*fprintf(stderr, \"\\t brcblkxend =%d\\n\",brcblkxend );*/                                                                                                                   \\\n                                        brcblkyend = opj_int_ceildivpow2(l_current_precinct->y1, (OPJ_INT32)cblkheightexpn) << cblkheightexpn;                                                                                   \\\n                                        /*fprintf(stderr, \"\\t brcblkyend =%d\\n\",brcblkyend );*/                                                                                                                   \\\n                                        l_current_precinct->cw = (OPJ_UINT32)((brcblkxend - tlcblkxstart) >> cblkwidthexpn);                                                                                                    \\\n                                        l_current_precinct->ch = (OPJ_UINT32)((brcblkyend - tlcblkystart) >> cblkheightexpn);                                                                                                   \\\n                                                                                                                                                                                                                  \\\n                                        l_nb_code_blocks = l_current_precinct->cw * l_current_precinct->ch;                                                                                                       \\\n                                        /*fprintf(stderr, \"\\t\\t\\t\\t precinct_cw = %d x recinct_ch = %d\\n\",l_current_precinct->cw, l_current_precinct->ch);      */                                                \\\n                                        l_nb_code_blocks_size = l_nb_code_blocks * (OPJ_UINT32)sizeof(TYPE);                                                                                                                  \\\n                                                                                                                                                                                                                  \\\n                                        if (! l_current_precinct->cblks.ELEMENT) {                                                                                                                                \\\n                                                l_current_precinct->cblks.ELEMENT = (TYPE*) opj_malloc(l_nb_code_blocks_size);                                                                                    \\\n                                                if (! l_current_precinct->cblks.ELEMENT ) {                                                                                                                       \\\n                                                        return OPJ_FALSE;                                                                                                                                         \\\n                                                }                                                                                                                                                                 \\\n                                                /*fprintf(stderr, \"\\t\\t\\t\\tAllocate cblks of a precinct (opj_tcd_cblk_dec_t): %d\\n\",l_nb_code_blocks_size);*/                                                  \\\n                                                                                                                                                                                                                  \\\n                                                memset(l_current_precinct->cblks.ELEMENT,0,l_nb_code_blocks_size);                                                                                                \\\n                                                                                                                                                                                                                  \\\n                                                l_current_precinct->block_size = l_nb_code_blocks_size;                                                                                                           \\\n                                        }                                                                                                                                                                         \\\n                                        else if (l_nb_code_blocks_size > l_current_precinct->block_size) {                                                                                                        \\\n                                                TYPE *new_ELEMENT = (TYPE*) opj_realloc(l_current_precinct->cblks.ELEMENT, l_nb_code_blocks_size);                                                                \\\n                                                if (! new_ELEMENT) {                                                                                                                                              \\\n                                                        opj_free(l_current_precinct->cblks.ELEMENT);                                                                                                              \\\n                                                        l_current_precinct->cblks.ELEMENT = NULL;                                                                                                                 \\\n                                                        l_current_precinct->block_size = 0;                                                                                                                       \\\n                                                        /* opj_event_msg(p_manager, EVT_ERROR, \"Not enough memory for current precinct codeblock element\\n\");                                              */  \\\n                                                        fprintf(stderr, \"Not enough memory for current precinct codeblock element\\n\");                                                                            \\\n                                                        return OPJ_FALSE;                                                                                                                                         \\\n                                                }                                                                                                                                                                 \\\n                                                l_current_precinct->cblks.ELEMENT = new_ELEMENT;                                                                                                                  \\\n                                                /*fprintf(stderr, \"\\t\\t\\t\\tReallocate cblks of a precinct (opj_tcd_cblk_dec_t): from %d to %d\\n\",l_current_precinct->block_size, l_nb_code_blocks_size);     */\\\n                                                                                                                                                                                                                  \\\n                                                memset(((OPJ_BYTE *) l_current_precinct->cblks.ELEMENT) + l_current_precinct->block_size                                                                          \\\n                                                                ,0                                                                                                                                                \\\n                                                                ,l_nb_code_blocks_size - l_current_precinct->block_size);                                                                                         \\\n                                                                                                                                                                                                                  \\\n                                                l_current_precinct->block_size = l_nb_code_blocks_size;                                                                                                           \\\n                                        }                                                                                                                                                                         \\\n                                                                                                                                                                                                                  \\\n                                        if (! l_current_precinct->incltree) {                                                                                                                                     \\\n                                                l_current_precinct->incltree = opj_tgt_create(l_current_precinct->cw,                                                                                              \\\n                                                                l_current_precinct->ch);                                                                                                                          \\\n                                        }                                                                                                                                                                         \\\n                                        else{                                                                                                                                                                     \\\n                                                l_current_precinct->incltree = opj_tgt_init(l_current_precinct->incltree,                                                                                             \\\n                                                                l_current_precinct->cw,                                                                                                                           \\\n                                                                l_current_precinct->ch);                                                                                                                          \\\n                                        }                                                                                                                                                                         \\\n                                                                                                                                                                                                                  \\\n                                        if (! l_current_precinct->incltree)     {                                                                                                                                 \\\n                                                fprintf(stderr, \"WARNING: No incltree created.\\n\");                                                                                                               \\\n                                                /*return OPJ_FALSE;*/                                                                                                                                             \\\n                                        }                                                                                                                                                                         \\\n                                                                                                                                                                                                                  \\\n                                        if (! l_current_precinct->imsbtree) {                                                                                                                                     \\\n                                                l_current_precinct->imsbtree = opj_tgt_create(                                                                                                                     \\\n                                                                l_current_precinct->cw,                                                                                                                           \\\n                                                                l_current_precinct->ch);                                                                                                                          \\\n                                        }                                                                                                                                                                         \\\n                                        else {                                                                                                                                                                    \\\n                                                l_current_precinct->imsbtree = opj_tgt_init(                                                                                                                          \\\n                                                                l_current_precinct->imsbtree,                                                                                                                     \\\n                                                                l_current_precinct->cw,                                                                                                                           \\\n                                                                l_current_precinct->ch);                                                                                                                          \\\n                                        }                                                                                                                                                                         \\\n                                                                                                                                                                                                                  \\\n                                        if (! l_current_precinct->imsbtree) {                                                                                                                                     \\\n                                                fprintf(stderr, \"WARNING: No imsbtree created.\\n\");                                                                                                               \\\n                                                /*return OPJ_FALSE;*/                                                                                                                                             \\\n                                        }                                                                                                                                                                         \\\n                                                                                                                                                                                                                  \\\n                                        l_code_block = l_current_precinct->cblks.ELEMENT;                                                                                                                         \\\n                                                                                                                                                                                                                  \\\n                                        for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {                                                                                                                   \\\n                                                OPJ_INT32 cblkxstart = tlcblkxstart + (OPJ_INT32)(cblkno % l_current_precinct->cw) * (1 << cblkwidthexpn);                                                                   \\\n                                                OPJ_INT32 cblkystart = tlcblkystart + (OPJ_INT32)(cblkno / l_current_precinct->cw) * (1 << cblkheightexpn);                                                                  \\\n                                                OPJ_INT32 cblkxend = cblkxstart + (1 << cblkwidthexpn);                                                                                                           \\\n                                                OPJ_INT32 cblkyend = cblkystart + (1 << cblkheightexpn);                                                                                                          \\\n                                                                                                                                                                                                                  \\\n                                                /* code-block size (global) */                                                                                                                                    \\\n                                                l_code_block->x0 = opj_int_max(cblkxstart, l_current_precinct->x0);                                                                                                   \\\n                                                l_code_block->y0 = opj_int_max(cblkystart, l_current_precinct->y0);                                                                                                   \\\n                                                l_code_block->x1 = opj_int_min(cblkxend, l_current_precinct->x1);                                                                                                     \\\n                                                l_code_block->y1 = opj_int_min(cblkyend, l_current_precinct->y1);                                                                                                     \\\n                                                                                                                                                                                                                  \\\n                                                if (! FUNCTION_ELEMENT(l_code_block)) {                                                                                                                           \\\n                                                        return OPJ_FALSE;                                                                                                                                         \\\n                                                }                                                                                                                                                                 \\\n                                                ++l_code_block;                                                                                                                                                   \\\n                                        }                                                                                                                                                                         \\\n                                        ++l_current_precinct;                                                                                                                                                     \\\n                                } /* precno */                                                                                                                                                                    \\\n                                ++l_band;                                                                                                                                                                         \\\n                                ++l_step_size;                                                                                                                                                                    \\\n                        } /* bandno */                                                                                                                                                                            \\\n                        ++l_res;                                                                                                                                                                                  \\\n                        --l_level_no;                                                                                                                                                                             \\\n                } /* resno */                                                                                                                                                                                     \\\n                ++l_tccp;                                                                                                                                                                                         \\\n                ++l_tilec;                                                                                                                                                                                        \\\n                ++l_image_comp;                                                                                                                                                                                   \\\n        } /* compno */                                                                                                                                                                                            \\\n        return OPJ_TRUE;                                                                                                                                                                                          \\\n}                                                                                                                                                                                                                 \\\n\n\nOPJ_MACRO_TCD_ALLOCATE(opj_tcd_init_encode_tile, opj_tcd_cblk_enc_t, 1.f, enc, opj_tcd_code_block_enc_allocate)\nOPJ_MACRO_TCD_ALLOCATE(opj_tcd_init_decode_tile, opj_tcd_cblk_dec_t, 0.5f, dec, opj_tcd_code_block_dec_allocate)\n\n#undef OPJ_MACRO_TCD_ALLOCATE\n\n/**\n * Allocates memory for an encoding code block.\n */\nOPJ_BOOL opj_tcd_code_block_enc_allocate (opj_tcd_cblk_enc_t * p_code_block)\n{\n        if (! p_code_block->data) {\n\n                p_code_block->data = (OPJ_BYTE*) opj_malloc(OPJ_J2K_DEFAULT_CBLK_DATA_SIZE*2); /*why +1 ?*/\n                if(! p_code_block->data) {\n                        return OPJ_FALSE;\n                }\n\n                p_code_block->data[0] = 0;\n                p_code_block->data+=1;\n\n                /* no memset since data */\n                p_code_block->layers = (opj_tcd_layer_t*) opj_malloc(100 * sizeof(opj_tcd_layer_t));\n                if (! p_code_block->layers) {\n                        return OPJ_FALSE;\n                }\n\n                p_code_block->passes = (opj_tcd_pass_t*) opj_malloc(100 * sizeof(opj_tcd_pass_t));\n                if (! p_code_block->passes) {\n                        return OPJ_FALSE;\n                }\n        }\n\n        memset(p_code_block->layers,0,100 * sizeof(opj_tcd_layer_t));\n        memset(p_code_block->passes,0,100 * sizeof(opj_tcd_pass_t));\n\n        return OPJ_TRUE;\n}\n\n/**\n * Allocates memory for a decoding code block.\n */\nOPJ_BOOL opj_tcd_code_block_dec_allocate (opj_tcd_cblk_dec_t * p_code_block)\n{\n        OPJ_UINT32 l_seg_size;\n\n        if (! p_code_block->data) {\n\n                p_code_block->data = (OPJ_BYTE*) opj_malloc(OPJ_J2K_DEFAULT_CBLK_DATA_SIZE);\n                if (! p_code_block->data) {\n                        return OPJ_FALSE;\n                }\n                p_code_block->data_max_size = OPJ_J2K_DEFAULT_CBLK_DATA_SIZE;\n                /*fprintf(stderr, \"Allocate 8192 elements of code_block->data\\n\");*/\n\n                l_seg_size = OPJ_J2K_DEFAULT_NB_SEGS * sizeof(opj_tcd_seg_t);\n                p_code_block->segs = (opj_tcd_seg_t *) opj_malloc(l_seg_size);\n                if (! p_code_block->segs) {\n                        return OPJ_FALSE;\n                }\n                memset(p_code_block->segs,0,l_seg_size);\n                /*fprintf(stderr, \"Allocate %d elements of code_block->data\\n\", OPJ_J2K_DEFAULT_NB_SEGS * sizeof(opj_tcd_seg_t));*/\n\n                p_code_block->m_current_max_segs = OPJ_J2K_DEFAULT_NB_SEGS;\n                /*fprintf(stderr, \"m_current_max_segs of code_block->data = %d\\n\", p_code_block->m_current_max_segs);*/\n        }\n        /* TODO */\n        /*p_code_block->numsegs = 0; */\n\n        return OPJ_TRUE;\n}\n\nOPJ_UINT32 opj_tcd_get_decoded_tile_size ( opj_tcd_t *p_tcd )\n{\n        OPJ_UINT32 i;\n        OPJ_UINT32 l_data_size = 0;\n        opj_image_comp_t * l_img_comp = 00;\n        opj_tcd_tilecomp_t * l_tile_comp = 00;\n        opj_tcd_resolution_t * l_res = 00;\n        OPJ_UINT32 l_size_comp, l_remaining;\n\n        l_tile_comp = p_tcd->tcd_image->tiles->comps;\n        l_img_comp = p_tcd->image->comps;\n\n        for (i=0;i<p_tcd->image->numcomps;++i) {\n                l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/\n                l_remaining = l_img_comp->prec & 7;  /* (%8) */\n\n                if(l_remaining) {\n                        ++l_size_comp;\n                }\n\n                if (l_size_comp == 3) {\n                        l_size_comp = 4;\n                }\n\n                l_res = l_tile_comp->resolutions + l_tile_comp->minimum_num_resolutions - 1;\n                l_data_size += l_size_comp * (OPJ_UINT32)((l_res->x1 - l_res->x0) * (l_res->y1 - l_res->y0));\n                ++l_img_comp;\n                ++l_tile_comp;\n        }\n\n        return l_data_size;\n}\n\nOPJ_BOOL opj_tcd_encode_tile(   opj_tcd_t *p_tcd,\n                                                        OPJ_UINT32 p_tile_no,\n                                                        OPJ_BYTE *p_dest,\n                                                        OPJ_UINT32 * p_data_written,\n                                                        OPJ_UINT32 p_max_length,\n                                                        opj_codestream_info_t *p_cstr_info)\n{\n\n        if (p_tcd->cur_tp_num == 0) {\n\n                p_tcd->tcd_tileno = p_tile_no;\n                p_tcd->tcp = &p_tcd->cp->tcps[p_tile_no];\n\n                /* INDEX >> \"Precinct_nb_X et Precinct_nb_Y\" */\n                if(p_cstr_info)  {\n                        OPJ_UINT32 l_num_packs = 0;\n                        OPJ_UINT32 i;\n                        opj_tcd_tilecomp_t *l_tilec_idx = &p_tcd->tcd_image->tiles->comps[0];        /* based on component 0 */\n                        opj_tccp_t *l_tccp = p_tcd->tcp->tccps; /* based on component 0 */\n\n                        for (i = 0; i < l_tilec_idx->numresolutions; i++) {\n                                opj_tcd_resolution_t *l_res_idx = &l_tilec_idx->resolutions[i];\n\n                                p_cstr_info->tile[p_tile_no].pw[i] = (int)l_res_idx->pw;\n                                p_cstr_info->tile[p_tile_no].ph[i] = (int)l_res_idx->ph;\n\n                                l_num_packs += l_res_idx->pw * l_res_idx->ph;\n                                p_cstr_info->tile[p_tile_no].pdx[i] = (int)l_tccp->prcw[i];\n                                p_cstr_info->tile[p_tile_no].pdy[i] = (int)l_tccp->prch[i];\n                        }\n                        p_cstr_info->tile[p_tile_no].packet = (opj_packet_info_t*) opj_calloc((size_t)p_cstr_info->numcomps * (size_t)p_cstr_info->numlayers * l_num_packs, sizeof(opj_packet_info_t));\n                }\n                /* << INDEX */\n\n                /* FIXME _ProfStart(PGROUP_DC_SHIFT); */\n                /*---------------TILE-------------------*/\n                if (! opj_tcd_dc_level_shift_encode(p_tcd)) {\n                        return OPJ_FALSE;\n                }\n                /* FIXME _ProfStop(PGROUP_DC_SHIFT); */\n\n                /* FIXME _ProfStart(PGROUP_MCT); */\n                if (! opj_tcd_mct_encode(p_tcd)) {\n                        return OPJ_FALSE;\n                }\n                /* FIXME _ProfStop(PGROUP_MCT); */\n\n                /* FIXME _ProfStart(PGROUP_DWT); */\n                if (! opj_tcd_dwt_encode(p_tcd)) {\n                        return OPJ_FALSE;\n                }\n                /* FIXME  _ProfStop(PGROUP_DWT); */\n\n                /* FIXME  _ProfStart(PGROUP_T1); */\n                if (! opj_tcd_t1_encode(p_tcd)) {\n                        return OPJ_FALSE;\n                }\n                /* FIXME _ProfStop(PGROUP_T1); */\n\n                /* FIXME _ProfStart(PGROUP_RATE); */\n                if (! opj_tcd_rate_allocate_encode(p_tcd,p_dest,p_max_length,p_cstr_info)) {\n                        return OPJ_FALSE;\n                }\n                /* FIXME _ProfStop(PGROUP_RATE); */\n\n        }\n        /*--------------TIER2------------------*/\n\n        /* INDEX */\n        if (p_cstr_info) {\n                p_cstr_info->index_write = 1;\n        }\n        /* FIXME _ProfStart(PGROUP_T2); */\n\n        if (! opj_tcd_t2_encode(p_tcd,p_dest,p_data_written,p_max_length,p_cstr_info)) {\n                return OPJ_FALSE;\n        }\n        /* FIXME _ProfStop(PGROUP_T2); */\n\n        /*---------------CLEAN-------------------*/\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_tcd_decode_tile(   opj_tcd_t *p_tcd,\n                                OPJ_BYTE *p_src,\n                                OPJ_UINT32 p_max_length,\n                                OPJ_UINT32 p_tile_no,\n                                opj_codestream_index_t *p_cstr_index\n                                )\n{\n        OPJ_UINT32 l_data_read;\n        p_tcd->tcd_tileno = p_tile_no;\n        p_tcd->tcp = &(p_tcd->cp->tcps[p_tile_no]);\n\n#ifdef TODO_MSD /* FIXME */\n        /* INDEX >>  */\n        if(p_cstr_info) {\n                OPJ_UINT32 resno, compno, numprec = 0;\n                for (compno = 0; compno < (OPJ_UINT32) p_cstr_info->numcomps; compno++) {\n                        opj_tcp_t *tcp = &p_tcd->cp->tcps[0];\n                        opj_tccp_t *tccp = &tcp->tccps[compno];\n                        opj_tcd_tilecomp_t *tilec_idx = &p_tcd->tcd_image->tiles->comps[compno];\n                        for (resno = 0; resno < tilec_idx->numresolutions; resno++) {\n                                opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[resno];\n                                p_cstr_info->tile[p_tile_no].pw[resno] = res_idx->pw;\n                                p_cstr_info->tile[p_tile_no].ph[resno] = res_idx->ph;\n                                numprec += res_idx->pw * res_idx->ph;\n                                p_cstr_info->tile[p_tile_no].pdx[resno] = tccp->prcw[resno];\n                                p_cstr_info->tile[p_tile_no].pdy[resno] = tccp->prch[resno];\n                        }\n                }\n                p_cstr_info->tile[p_tile_no].packet = (opj_packet_info_t *) opj_malloc(p_cstr_info->numlayers * numprec * sizeof(opj_packet_info_t));\n                p_cstr_info->packno = 0;\n        }\n        /* << INDEX */\n#endif\n\n        /*--------------TIER2------------------*/\n        /* FIXME _ProfStart(PGROUP_T2); */\n        l_data_read = 0;\n        if (! opj_tcd_t2_decode(p_tcd, p_src, &l_data_read, p_max_length, p_cstr_index))\n        {\n                return OPJ_FALSE;\n        }\n        /* FIXME _ProfStop(PGROUP_T2); */\n\n        /*------------------TIER1-----------------*/\n\n        /* FIXME _ProfStart(PGROUP_T1); */\n        if\n                (! opj_tcd_t1_decode(p_tcd))\n        {\n                return OPJ_FALSE;\n        }\n        /* FIXME _ProfStop(PGROUP_T1); */\n\n        /*----------------DWT---------------------*/\n\n        /* FIXME _ProfStart(PGROUP_DWT); */\n        if\n                (! opj_tcd_dwt_decode(p_tcd))\n        {\n                return OPJ_FALSE;\n        }\n        /* FIXME _ProfStop(PGROUP_DWT); */\n\n        /*----------------MCT-------------------*/\n        /* FIXME _ProfStart(PGROUP_MCT); */\n        if\n                (! opj_tcd_mct_decode(p_tcd))\n        {\n                return OPJ_FALSE;\n        }\n        /* FIXME _ProfStop(PGROUP_MCT); */\n\n        /* FIXME _ProfStart(PGROUP_DC_SHIFT); */\n        if\n                (! opj_tcd_dc_level_shift_decode(p_tcd))\n        {\n                return OPJ_FALSE;\n        }\n        /* FIXME _ProfStop(PGROUP_DC_SHIFT); */\n\n\n        /*---------------TILE-------------------*/\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_tcd_update_tile_data ( opj_tcd_t *p_tcd,\n                                    OPJ_BYTE * p_dest,\n                                    OPJ_UINT32 p_dest_length\n                                    )\n{\n        OPJ_UINT32 i,j,k,l_data_size = 0;\n        opj_image_comp_t * l_img_comp = 00;\n        opj_tcd_tilecomp_t * l_tilec = 00;\n        opj_tcd_resolution_t * l_res;\n        OPJ_UINT32 l_size_comp, l_remaining;\n        OPJ_UINT32 l_stride, l_width,l_height;\n\n        l_data_size = opj_tcd_get_decoded_tile_size(p_tcd);\n        if (l_data_size > p_dest_length) {\n                return OPJ_FALSE;\n        }\n\n        l_tilec = p_tcd->tcd_image->tiles->comps;\n        l_img_comp = p_tcd->image->comps;\n\n        for (i=0;i<p_tcd->image->numcomps;++i) {\n                l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/\n                l_remaining = l_img_comp->prec & 7;  /* (%8) */\n                l_res = l_tilec->resolutions + l_img_comp->resno_decoded;\n                l_width = (OPJ_UINT32)(l_res->x1 - l_res->x0);\n                l_height = (OPJ_UINT32)(l_res->y1 - l_res->y0);\n                l_stride = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0) - l_width;\n\n                if (l_remaining) {\n                        ++l_size_comp;\n                }\n\n                if (l_size_comp == 3) {\n                        l_size_comp = 4;\n                }\n\n                switch (l_size_comp)\n                        {\n                        case 1:\n                                {\n                                        OPJ_CHAR * l_dest_ptr = (OPJ_CHAR *) p_dest;\n                                        const OPJ_INT32 * l_src_ptr = l_tilec->data;\n\n                                        if (l_img_comp->sgnd) {\n                                                for (j=0;j<l_height;++j) {\n                                                        for (k=0;k<l_width;++k) {\n                                                                *(l_dest_ptr++) = (OPJ_CHAR) (*(l_src_ptr++));\n                                                        }\n                                                        l_src_ptr += l_stride;\n                                                }\n                                        }\n                                        else {\n                                                for (j=0;j<l_height;++j) {\n                                                        for     (k=0;k<l_width;++k) {\n                                                                *(l_dest_ptr++) = (OPJ_CHAR) ((*(l_src_ptr++))&0xff);\n                                                        }\n                                                        l_src_ptr += l_stride;\n                                                }\n                                        }\n\n                                        p_dest = (OPJ_BYTE *)l_dest_ptr;\n                                }\n                                break;\n                        case 2:\n                                {\n                                        const OPJ_INT32 * l_src_ptr = l_tilec->data;\n                                        OPJ_INT16 * l_dest_ptr = (OPJ_INT16 *) p_dest;\n\n                                        if (l_img_comp->sgnd) {\n                                                for (j=0;j<l_height;++j) {\n                                                        for (k=0;k<l_width;++k) {\n                                                                *(l_dest_ptr++) = (OPJ_INT16) (*(l_src_ptr++));\n                                                        }\n                                                        l_src_ptr += l_stride;\n                                                }\n                                        }\n                                        else {\n                                                for (j=0;j<l_height;++j) {\n                                                        for (k=0;k<l_width;++k) {\n                                                                *(l_dest_ptr++) = (OPJ_INT16) ((*(l_src_ptr++))&0xffff);\n                                                        }\n                                                        l_src_ptr += l_stride;\n                                                }\n                                        }\n\n                                        p_dest = (OPJ_BYTE*) l_dest_ptr;\n                                }\n                                break;\n                        case 4:\n                                {\n                                        OPJ_INT32 * l_dest_ptr = (OPJ_INT32 *) p_dest;\n                                        OPJ_INT32 * l_src_ptr = l_tilec->data;\n\n                                        for (j=0;j<l_height;++j) {\n                                                for (k=0;k<l_width;++k) {\n                                                        *(l_dest_ptr++) = (*(l_src_ptr++));\n                                                }\n                                                l_src_ptr += l_stride;\n                                        }\n\n                                        p_dest = (OPJ_BYTE*) l_dest_ptr;\n                                }\n                                break;\n                }\n\n                ++l_img_comp;\n                ++l_tilec;\n        }\n\n        return OPJ_TRUE;\n}\n\n\n\n\nvoid opj_tcd_free_tile(opj_tcd_t *p_tcd)\n{\n        OPJ_UINT32 compno, resno, bandno, precno;\n        opj_tcd_tile_t *l_tile = 00;\n        opj_tcd_tilecomp_t *l_tile_comp = 00;\n        opj_tcd_resolution_t *l_res = 00;\n        opj_tcd_band_t *l_band = 00;\n        opj_tcd_precinct_t *l_precinct = 00;\n        OPJ_UINT32 l_nb_resolutions, l_nb_precincts;\n        void (* l_tcd_code_block_deallocate) (opj_tcd_precinct_t *) = 00;\n\n        if (! p_tcd) {\n                return;\n        }\n\n        if (! p_tcd->tcd_image) {\n                return;\n        }\n\n        if (p_tcd->m_is_decoder) {\n                l_tcd_code_block_deallocate = opj_tcd_code_block_dec_deallocate;\n        }\n        else {\n                l_tcd_code_block_deallocate = opj_tcd_code_block_enc_deallocate;\n        }\n\n        l_tile = p_tcd->tcd_image->tiles;\n        if (! l_tile) {\n                return;\n        }\n\n        l_tile_comp = l_tile->comps;\n\n        for (compno = 0; compno < l_tile->numcomps; ++compno) {\n                l_res = l_tile_comp->resolutions;\n                if (l_res) {\n\n                        l_nb_resolutions = l_tile_comp->resolutions_size / sizeof(opj_tcd_resolution_t);\n                        for (resno = 0; resno < l_nb_resolutions; ++resno) {\n                                l_band = l_res->bands;\n                                for     (bandno = 0; bandno < 3; ++bandno) {\n                                        l_precinct = l_band->precincts;\n                                        if (l_precinct) {\n\n                                                l_nb_precincts = l_band->precincts_data_size / sizeof(opj_tcd_precinct_t);\n                                                for (precno = 0; precno < l_nb_precincts; ++precno) {\n                                                        opj_tgt_destroy(l_precinct->incltree);\n                                                        l_precinct->incltree = 00;\n                                                        opj_tgt_destroy(l_precinct->imsbtree);\n                                                        l_precinct->imsbtree = 00;\n                                                        (*l_tcd_code_block_deallocate) (l_precinct);\n                                                        ++l_precinct;\n                                                }\n\n                                                opj_free(l_band->precincts);\n                                                l_band->precincts = 00;\n                                        }\n                                        ++l_band;\n                                } /* for (resno */\n                                ++l_res;\n                        }\n\n                        opj_free(l_tile_comp->resolutions);\n                        l_tile_comp->resolutions = 00;\n                }\n\n                if (l_tile_comp->data) {\n                        opj_free(l_tile_comp->data);\n                        l_tile_comp->data = 00;\n                }\n                ++l_tile_comp;\n        }\n\n        opj_free(l_tile->comps);\n        l_tile->comps = 00;\n        opj_free(p_tcd->tcd_image->tiles);\n        p_tcd->tcd_image->tiles = 00;\n}\n\n\nOPJ_BOOL opj_tcd_t2_decode (opj_tcd_t *p_tcd,\n                            OPJ_BYTE * p_src_data,\n                            OPJ_UINT32 * p_data_read,\n                            OPJ_UINT32 p_max_src_size,\n                            opj_codestream_index_t *p_cstr_index\n                            )\n{\n        opj_t2_t * l_t2;\n\n        l_t2 = opj_t2_create(p_tcd->image, p_tcd->cp);\n        if (l_t2 == 00) {\n                return OPJ_FALSE;\n        }\n\n        if (! opj_t2_decode_packets(\n                                        l_t2,\n                                        p_tcd->tcd_tileno,\n                                        p_tcd->tcd_image->tiles,\n                                        p_src_data,\n                                        p_data_read,\n                                        p_max_src_size,\n                                        p_cstr_index)) {\n                opj_t2_destroy(l_t2);\n                return OPJ_FALSE;\n        }\n\n        opj_t2_destroy(l_t2);\n\n        /*---------------CLEAN-------------------*/\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_tcd_t1_decode ( opj_tcd_t *p_tcd )\n{\n        OPJ_UINT32 compno;\n        opj_t1_t * l_t1;\n        opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;\n        opj_tcd_tilecomp_t* l_tile_comp = l_tile->comps;\n        opj_tccp_t * l_tccp = p_tcd->tcp->tccps;\n\n\n        l_t1 = opj_t1_create();\n        if (l_t1 == 00) {\n                return OPJ_FALSE;\n        }\n\n        for (compno = 0; compno < l_tile->numcomps; ++compno) {\n                /* The +3 is headroom required by the vectorized DWT */\n                if (OPJ_FALSE == opj_t1_decode_cblks(l_t1, l_tile_comp, l_tccp)) {\n                        opj_t1_destroy(l_t1);\n                        return OPJ_FALSE;\n                }\n                ++l_tile_comp;\n                ++l_tccp;\n        }\n\n        opj_t1_destroy(l_t1);\n\n        return OPJ_TRUE;\n}\n\n\nOPJ_BOOL opj_tcd_dwt_decode ( opj_tcd_t *p_tcd )\n{\n        OPJ_UINT32 compno;\n        opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;\n        opj_tcd_tilecomp_t * l_tile_comp = l_tile->comps;\n        opj_tccp_t * l_tccp = p_tcd->tcp->tccps;\n        opj_image_comp_t * l_img_comp = p_tcd->image->comps;\n\n        for (compno = 0; compno < l_tile->numcomps; compno++) {\n                /*\n                if (tcd->cp->reduce != 0) {\n                        tcd->image->comps[compno].resno_decoded =\n                                tile->comps[compno].numresolutions - tcd->cp->reduce - 1;\n                        if (tcd->image->comps[compno].resno_decoded < 0)\n                        {\n                                return false;\n                        }\n                }\n                numres2decode = tcd->image->comps[compno].resno_decoded + 1;\n                if(numres2decode > 0){\n                */\n\n                if (l_tccp->qmfbid == 1) {\n                        if (! opj_dwt_decode(l_tile_comp, l_img_comp->resno_decoded+1)) {\n                                return OPJ_FALSE;\n                        }\n                }\n                else {\n                        if (! opj_dwt_decode_real(l_tile_comp, l_img_comp->resno_decoded+1)) {\n                                return OPJ_FALSE;\n                        }\n                }\n\n                ++l_tile_comp;\n                ++l_img_comp;\n                ++l_tccp;\n        }\n\n        return OPJ_TRUE;\n}\nOPJ_BOOL opj_tcd_mct_decode ( opj_tcd_t *p_tcd )\n{\n        opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;\n        opj_tcp_t * l_tcp = p_tcd->tcp;\n        opj_tcd_tilecomp_t * l_tile_comp = l_tile->comps;\n        OPJ_UINT32 l_samples,i;\n\n        if (! l_tcp->mct) {\n                return OPJ_TRUE;\n        }\n\n        l_samples = (OPJ_UINT32)((l_tile_comp->x1 - l_tile_comp->x0) * (l_tile_comp->y1 - l_tile_comp->y0));\n\n        if (l_tile->numcomps >= 3 ){\n                /* testcase 1336.pdf.asan.47.376 */\n                if ((l_tile->comps[0].x1 - l_tile->comps[0].x0) * (l_tile->comps[0].y1 - l_tile->comps[0].y0) < (OPJ_INT32)l_samples ||\n                    (l_tile->comps[1].x1 - l_tile->comps[1].x0) * (l_tile->comps[1].y1 - l_tile->comps[1].y0) < (OPJ_INT32)l_samples ||\n                    (l_tile->comps[2].x1 - l_tile->comps[2].x0) * (l_tile->comps[2].y1 - l_tile->comps[2].y0) < (OPJ_INT32)l_samples) {\n                        fprintf(stderr, \"Tiles don't all have the same dimension. Skip the MCT step.\\n\");\n                        return OPJ_FALSE;\n                }\n                else if (l_tcp->mct == 2) {\n                        OPJ_BYTE ** l_data;\n\n                        if (! l_tcp->m_mct_decoding_matrix) {\n                                return OPJ_TRUE;\n                        }\n\n                        l_data = (OPJ_BYTE **) opj_malloc(l_tile->numcomps*sizeof(OPJ_BYTE*));\n                        if (! l_data) {\n                                return OPJ_FALSE;\n                        }\n\n                        for (i=0;i<l_tile->numcomps;++i) {\n                                l_data[i] = (OPJ_BYTE*) l_tile_comp->data;\n                                ++l_tile_comp;\n                        }\n\n                        if (! opj_mct_decode_custom(/* MCT data */\n                                                                        (OPJ_BYTE*) l_tcp->m_mct_decoding_matrix,\n                                                                        /* size of components */\n                                                                        l_samples,\n                                                                        /* components */\n                                                                        l_data,\n                                                                        /* nb of components (i.e. size of pData) */\n                                                                        l_tile->numcomps,\n                                                                        /* tells if the data is signed */\n                                                                        p_tcd->image->comps->sgnd)) {\n                                opj_free(l_data);\n                                return OPJ_FALSE;\n                        }\n\n                        opj_free(l_data);\n                }\n                else {\n                        if (l_tcp->tccps->qmfbid == 1) {\n                                opj_mct_decode(     l_tile->comps[0].data,\n                                                        l_tile->comps[1].data,\n                                                        l_tile->comps[2].data,\n                                                        l_samples);\n                        }\n                        else {\n                            opj_mct_decode_real((OPJ_FLOAT32*)l_tile->comps[0].data,\n                                                (OPJ_FLOAT32*)l_tile->comps[1].data,\n                                                (OPJ_FLOAT32*)l_tile->comps[2].data,\n                                                l_samples);\n                        }\n                }\n        }\n        else {\n                /* FIXME need to use opj_event_msg function */\n                fprintf(stderr,\"Number of components (%d) is inconsistent with a MCT. Skip the MCT step.\\n\",l_tile->numcomps);\n        }\n\n        return OPJ_TRUE;\n}\n\n\nOPJ_BOOL opj_tcd_dc_level_shift_decode ( opj_tcd_t *p_tcd )\n{\n        OPJ_UINT32 compno;\n        opj_tcd_tilecomp_t * l_tile_comp = 00;\n        opj_tccp_t * l_tccp = 00;\n        opj_image_comp_t * l_img_comp = 00;\n        opj_tcd_resolution_t* l_res = 00;\n        opj_tcd_tile_t * l_tile;\n        OPJ_UINT32 l_width,l_height,i,j;\n        OPJ_INT32 * l_current_ptr;\n        OPJ_INT32 l_min, l_max;\n        OPJ_UINT32 l_stride;\n\n        l_tile = p_tcd->tcd_image->tiles;\n        l_tile_comp = l_tile->comps;\n        l_tccp = p_tcd->tcp->tccps;\n        l_img_comp = p_tcd->image->comps;\n\n        for (compno = 0; compno < l_tile->numcomps; compno++) {\n                l_res = l_tile_comp->resolutions + l_img_comp->resno_decoded;\n                l_width = (OPJ_UINT32)(l_res->x1 - l_res->x0);\n                l_height = (OPJ_UINT32)(l_res->y1 - l_res->y0);\n                l_stride = (OPJ_UINT32)(l_tile_comp->x1 - l_tile_comp->x0) - l_width;\n\n                assert(l_height == 0 || l_width + l_stride <= l_tile_comp->data_size / l_height); /*MUPDF*/\n\n                if (l_img_comp->sgnd) {\n                        l_min = -(1 << (l_img_comp->prec - 1));\n                        l_max = (1 << (l_img_comp->prec - 1)) - 1;\n                }\n                else {\n            l_min = 0;\n                        l_max = (1 << l_img_comp->prec) - 1;\n                }\n\n                l_current_ptr = l_tile_comp->data;\n\n                if (l_tccp->qmfbid == 1) {\n                        for (j=0;j<l_height;++j) {\n                                for (i = 0; i < l_width; ++i) {\n                                        *l_current_ptr = opj_int_clamp(*l_current_ptr + l_tccp->m_dc_level_shift, l_min, l_max);\n                                        ++l_current_ptr;\n                                }\n                                l_current_ptr += l_stride;\n                        }\n                }\n                else {\n                        for (j=0;j<l_height;++j) {\n                                for (i = 0; i < l_width; ++i) {\n                                        OPJ_FLOAT32 l_value = *((OPJ_FLOAT32 *) l_current_ptr);\n                                        *l_current_ptr = opj_int_clamp((OPJ_INT32)lrintf(l_value) + l_tccp->m_dc_level_shift, l_min, l_max); ;\n                                        ++l_current_ptr;\n                                }\n                                l_current_ptr += l_stride;\n                        }\n                }\n\n                ++l_img_comp;\n                ++l_tccp;\n                ++l_tile_comp;\n        }\n\n        return OPJ_TRUE;\n}\n\n\n\n/**\n * Deallocates the encoding data of the given precinct.\n */\nvoid opj_tcd_code_block_dec_deallocate (opj_tcd_precinct_t * p_precinct)\n{\n        OPJ_UINT32 cblkno , l_nb_code_blocks;\n\n        opj_tcd_cblk_dec_t * l_code_block = p_precinct->cblks.dec;\n        if (l_code_block) {\n                /*fprintf(stderr,\"deallocate codeblock:{\\n\");*/\n                /*fprintf(stderr,\"\\t x0=%d, y0=%d, x1=%d, y1=%d\\n\",l_code_block->x0, l_code_block->y0, l_code_block->x1, l_code_block->y1);*/\n                /*fprintf(stderr,\"\\t numbps=%d, numlenbits=%d, len=%d, numnewpasses=%d, real_num_segs=%d, m_current_max_segs=%d\\n \",\n                                l_code_block->numbps, l_code_block->numlenbits, l_code_block->len, l_code_block->numnewpasses, l_code_block->real_num_segs, l_code_block->m_current_max_segs );*/\n\n\n                l_nb_code_blocks = p_precinct->block_size / sizeof(opj_tcd_cblk_dec_t);\n                /*fprintf(stderr,\"nb_code_blocks =%d\\t}\\n\", l_nb_code_blocks);*/\n\n                for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {\n\n                        if (l_code_block->data) {\n                                opj_free(l_code_block->data);\n                                l_code_block->data = 00;\n                        }\n\n                        if (l_code_block->segs) {\n                                opj_free(l_code_block->segs );\n                                l_code_block->segs = 00;\n                        }\n\n                        ++l_code_block;\n                }\n\n                opj_free(p_precinct->cblks.dec);\n                p_precinct->cblks.dec = 00;\n        }\n}\n\n/**\n * Deallocates the encoding data of the given precinct.\n */\nvoid opj_tcd_code_block_enc_deallocate (opj_tcd_precinct_t * p_precinct)\n{       \n        OPJ_UINT32 cblkno , l_nb_code_blocks;\n\n        opj_tcd_cblk_enc_t * l_code_block = p_precinct->cblks.enc;\n        if (l_code_block) {\n                l_nb_code_blocks = p_precinct->block_size / sizeof(opj_tcd_cblk_enc_t);\n                \n                for     (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno)  {\n                        if (l_code_block->data) {\n                                opj_free(l_code_block->data - 1);\n                                l_code_block->data = 00;\n                        }\n\n                        if (l_code_block->layers) {\n                                opj_free(l_code_block->layers );\n                                l_code_block->layers = 00;\n                        }\n\n                        if (l_code_block->passes) {\n                                opj_free(l_code_block->passes );\n                                l_code_block->passes = 00;\n                        }\n                        ++l_code_block;\n                }\n\n                opj_free(p_precinct->cblks.enc);\n                \n                p_precinct->cblks.enc = 00;\n        }\n}\n\nOPJ_UINT32 opj_tcd_get_encoded_tile_size ( opj_tcd_t *p_tcd )\n{\n        OPJ_UINT32 i,l_data_size = 0;\n        opj_image_comp_t * l_img_comp = 00;\n        opj_tcd_tilecomp_t * l_tilec = 00;\n        OPJ_UINT32 l_size_comp, l_remaining;\n\n        l_tilec = p_tcd->tcd_image->tiles->comps;\n        l_img_comp = p_tcd->image->comps;\n        for (i=0;i<p_tcd->image->numcomps;++i) {\n                l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/\n                l_remaining = l_img_comp->prec & 7;  /* (%8) */\n\n                if (l_remaining) {\n                        ++l_size_comp;\n                }\n\n                if (l_size_comp == 3) {\n                        l_size_comp = 4;\n                }\n\n                l_data_size += l_size_comp * (OPJ_UINT32)((l_tilec->x1 - l_tilec->x0) * (l_tilec->y1 - l_tilec->y0));\n                ++l_img_comp;\n                ++l_tilec;\n        }\n\n        return l_data_size;\n}\n                \nOPJ_BOOL opj_tcd_dc_level_shift_encode ( opj_tcd_t *p_tcd )\n{\n        OPJ_UINT32 compno;\n        opj_tcd_tilecomp_t * l_tile_comp = 00;\n        opj_tccp_t * l_tccp = 00;\n        opj_image_comp_t * l_img_comp = 00;\n        opj_tcd_tile_t * l_tile;\n        OPJ_UINT32 l_nb_elem,i;\n        OPJ_INT32 * l_current_ptr;\n\n        l_tile = p_tcd->tcd_image->tiles;\n        l_tile_comp = l_tile->comps;\n        l_tccp = p_tcd->tcp->tccps;\n        l_img_comp = p_tcd->image->comps;\n\n        for (compno = 0; compno < l_tile->numcomps; compno++) {\n                l_current_ptr = l_tile_comp->data;\n                l_nb_elem = (OPJ_UINT32)((l_tile_comp->x1 - l_tile_comp->x0) * (l_tile_comp->y1 - l_tile_comp->y0));\n\n                if (l_tccp->qmfbid == 1) {\n                        for     (i = 0; i < l_nb_elem; ++i) {\n                                *l_current_ptr -= l_tccp->m_dc_level_shift ;\n                                ++l_current_ptr;\n                        }\n                }\n                else {\n                        for (i = 0; i < l_nb_elem; ++i) {\n                                *l_current_ptr = (*l_current_ptr - l_tccp->m_dc_level_shift) << 11 ;\n                                ++l_current_ptr;\n                        }\n                }\n\n                ++l_img_comp;\n                ++l_tccp;\n                ++l_tile_comp;\n        }\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_tcd_mct_encode ( opj_tcd_t *p_tcd )\n{\n        opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;\n        opj_tcd_tilecomp_t * l_tile_comp = p_tcd->tcd_image->tiles->comps;\n        OPJ_UINT32 samples = (OPJ_UINT32)((l_tile_comp->x1 - l_tile_comp->x0) * (l_tile_comp->y1 - l_tile_comp->y0));\n        OPJ_UINT32 i;\n        OPJ_BYTE ** l_data = 00;\n        opj_tcp_t * l_tcp = p_tcd->tcp;\n\n        if(!p_tcd->tcp->mct) {\n                return OPJ_TRUE;\n        }\n\n        if (p_tcd->tcp->mct == 2) {\n                if (! p_tcd->tcp->m_mct_coding_matrix) {\n                        return OPJ_TRUE;\n                }\n\n        l_data = (OPJ_BYTE **) opj_malloc(l_tile->numcomps*sizeof(OPJ_BYTE*));\n                if (! l_data) {\n                        return OPJ_FALSE;\n                }\n\n                for (i=0;i<l_tile->numcomps;++i) {\n                        l_data[i] = (OPJ_BYTE*) l_tile_comp->data;\n                        ++l_tile_comp;\n                }\n\n                if (! opj_mct_encode_custom(/* MCT data */\n                                        (OPJ_BYTE*) p_tcd->tcp->m_mct_coding_matrix,\n                                        /* size of components */\n                                        samples,\n                                        /* components */\n                                        l_data,\n                                        /* nb of components (i.e. size of pData) */\n                                        l_tile->numcomps,\n                                        /* tells if the data is signed */\n                                        p_tcd->image->comps->sgnd) )\n                {\n            opj_free(l_data);\n                        return OPJ_FALSE;\n                }\n\n                opj_free(l_data);\n        }\n        else if (l_tcp->tccps->qmfbid == 0) {\n                opj_mct_encode_real(l_tile->comps[0].data, l_tile->comps[1].data, l_tile->comps[2].data, samples);\n        }\n        else {\n                opj_mct_encode(l_tile->comps[0].data, l_tile->comps[1].data, l_tile->comps[2].data, samples);\n        }\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_tcd_dwt_encode ( opj_tcd_t *p_tcd )\n{\n        opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;\n        opj_tcd_tilecomp_t * l_tile_comp = p_tcd->tcd_image->tiles->comps;\n        opj_tccp_t * l_tccp = p_tcd->tcp->tccps;\n        OPJ_UINT32 compno;\n\n        for (compno = 0; compno < l_tile->numcomps; ++compno) {\n                if (l_tccp->qmfbid == 1) {\n                        if (! opj_dwt_encode(l_tile_comp)) {\n                                return OPJ_FALSE;\n                        }\n                }\n                else if (l_tccp->qmfbid == 0) {\n                        if (! opj_dwt_encode_real(l_tile_comp)) {\n                                return OPJ_FALSE;\n                        }\n                }\n\n                ++l_tile_comp;\n                ++l_tccp;\n        }\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_tcd_t1_encode ( opj_tcd_t *p_tcd )\n{\n        opj_t1_t * l_t1;\n        const OPJ_FLOAT64 * l_mct_norms;\n        opj_tcp_t * l_tcp = p_tcd->tcp;\n\n        l_t1 = opj_t1_create();\n        if (l_t1 == 00) {\n                return OPJ_FALSE;\n        }\n\n        if (l_tcp->mct == 1) {\n                /* irreversible encoding */\n                if (l_tcp->tccps->qmfbid == 0) {\n                        l_mct_norms = opj_mct_get_mct_norms_real();\n                }\n                else {\n                        l_mct_norms = opj_mct_get_mct_norms();\n                }\n        }\n        else {\n                l_mct_norms = (const OPJ_FLOAT64 *) (l_tcp->mct_norms);\n        }\n\n        if (! opj_t1_encode_cblks(l_t1, p_tcd->tcd_image->tiles , l_tcp, l_mct_norms)) {\n        opj_t1_destroy(l_t1);\n                return OPJ_FALSE;\n        }\n\n        opj_t1_destroy(l_t1);\n\n        return OPJ_TRUE;\n}\n\nOPJ_BOOL opj_tcd_t2_encode (opj_tcd_t *p_tcd,\n                                                OPJ_BYTE * p_dest_data,\n                                                OPJ_UINT32 * p_data_written,\n                                                OPJ_UINT32 p_max_dest_size,\n                                                opj_codestream_info_t *p_cstr_info )\n{\n        opj_t2_t * l_t2;\n\n        l_t2 = opj_t2_create(p_tcd->image, p_tcd->cp);\n        if (l_t2 == 00) {\n                return OPJ_FALSE;\n        }\n\n        if (! opj_t2_encode_packets(\n                                        l_t2,\n                                        p_tcd->tcd_tileno,\n                                        p_tcd->tcd_image->tiles,\n                                        p_tcd->tcp->numlayers,\n                                        p_dest_data,\n                                        p_data_written,\n                                        p_max_dest_size,\n                                        p_cstr_info,\n                                        p_tcd->tp_num,\n                                        p_tcd->tp_pos,\n                                        p_tcd->cur_pino,\n                                        FINAL_PASS))\n        {\n                opj_t2_destroy(l_t2);\n                return OPJ_FALSE;\n        }\n\n        opj_t2_destroy(l_t2);\n\n        /*---------------CLEAN-------------------*/\n        return OPJ_TRUE;\n}\n\n\nOPJ_BOOL opj_tcd_rate_allocate_encode(  opj_tcd_t *p_tcd,\n                                                                            OPJ_BYTE * p_dest_data,\n                                                                            OPJ_UINT32 p_max_dest_size,\n                                                                            opj_codestream_info_t *p_cstr_info )\n{\n        opj_cp_t * l_cp = p_tcd->cp;\n        OPJ_UINT32 l_nb_written = 0;\n\n        if (p_cstr_info)  {\n                p_cstr_info->index_write = 0;\n        }\n\n        if (l_cp->m_specific_param.m_enc.m_disto_alloc|| l_cp->m_specific_param.m_enc.m_fixed_quality)  {\n                /* fixed_quality */\n                /* Normal Rate/distortion allocation */\n                if (! opj_tcd_rateallocate(p_tcd, p_dest_data,&l_nb_written, p_max_dest_size, p_cstr_info)) {\n                        return OPJ_FALSE;\n                }\n        }\n        else {\n                /* Fixed layer allocation */\n                opj_tcd_rateallocate_fixed(p_tcd);\n        }\n\n        return OPJ_TRUE;\n}\n\n\nOPJ_BOOL opj_tcd_copy_tile_data (       opj_tcd_t *p_tcd,\n                                                                    OPJ_BYTE * p_src,\n                                                                    OPJ_UINT32 p_src_length )\n{\n        OPJ_UINT32 i,j,l_data_size = 0;\n        opj_image_comp_t * l_img_comp = 00;\n        opj_tcd_tilecomp_t * l_tilec = 00;\n        OPJ_UINT32 l_size_comp, l_remaining;\n        OPJ_UINT32 l_nb_elem;\n\n        l_data_size = opj_tcd_get_encoded_tile_size(p_tcd);\n        if (l_data_size != p_src_length) {\n                return OPJ_FALSE;\n        }\n\n        l_tilec = p_tcd->tcd_image->tiles->comps;\n        l_img_comp = p_tcd->image->comps;\n        for (i=0;i<p_tcd->image->numcomps;++i) {\n                l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/\n                l_remaining = l_img_comp->prec & 7;  /* (%8) */\n                l_nb_elem = (OPJ_UINT32)((l_tilec->x1 - l_tilec->x0) * (l_tilec->y1 - l_tilec->y0));\n\n                if (l_remaining) {\n                        ++l_size_comp;\n                }\n\n                if (l_size_comp == 3) {\n                        l_size_comp = 4;\n                }\n\n                switch (l_size_comp) {\n                        case 1:\n                                {\n                                        OPJ_CHAR * l_src_ptr = (OPJ_CHAR *) p_src;\n                                        OPJ_INT32 * l_dest_ptr = l_tilec->data;\n\n                                        if (l_img_comp->sgnd) {\n                                                for (j=0;j<l_nb_elem;++j) {\n                                                        *(l_dest_ptr++) = (OPJ_INT32) (*(l_src_ptr++));\n                                                }\n                                        }\n                                        else {\n                                                for (j=0;j<l_nb_elem;++j) {\n                                                        *(l_dest_ptr++) = (*(l_src_ptr++))&0xff;\n                                                }\n                                        }\n\n                                        p_src = (OPJ_BYTE*) l_src_ptr;\n                                }\n                                break;\n                        case 2:\n                                {\n                                        OPJ_INT32 * l_dest_ptr = l_tilec->data;\n                                        OPJ_INT16 * l_src_ptr = (OPJ_INT16 *) p_src;\n\n                                        if (l_img_comp->sgnd) {\n                                                for (j=0;j<l_nb_elem;++j) {\n                                                        *(l_dest_ptr++) = (OPJ_INT32) (*(l_src_ptr++));\n                                                }\n                                        }\n                                        else {\n                                                for (j=0;j<l_nb_elem;++j) {\n                                                        *(l_dest_ptr++) = (*(l_src_ptr++))&0xffff;\n                                                }\n                                        }\n\n                                        p_src = (OPJ_BYTE*) l_src_ptr;\n                                }\n                                break;\n                        case 4:\n                                {\n                                        OPJ_INT32 * l_src_ptr = (OPJ_INT32 *) p_src;\n                                        OPJ_INT32 * l_dest_ptr = l_tilec->data;\n\n                                        for (j=0;j<l_nb_elem;++j) {\n                                                *(l_dest_ptr++) = (OPJ_INT32) (*(l_src_ptr++));\n                                        }\n\n                                        p_src = (OPJ_BYTE*) l_src_ptr;\n                                }\n                                break;\n                }\n\n                ++l_img_comp;\n                ++l_tilec;\n        }\n\n        return OPJ_TRUE;\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tcd.h",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2001-2003, David Janssens\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR \n * Copyright (c) 2012, CS Systemes d'Information, France\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef __TCD_H\n#define __TCD_H\n/**\n@file tcd.h\n@brief Implementation of a tile coder/decoder (TCD)\n\nThe functions in TCD.C encode or decode each tile independently from\neach other. The functions in TCD.C are used by other functions in J2K.C.\n*/\n\n/** @defgroup TCD TCD - Implementation of a tile coder/decoder */\n/*@{*/\n\n/**\nFIXME DOC\n*/\ntypedef struct opj_tcd_seg {\n\tOPJ_BYTE ** data;\n\tOPJ_UINT32 dataindex;\n\tOPJ_UINT32 numpasses;\n\tOPJ_UINT32 real_num_passes;\n\tOPJ_UINT32 len;\n\tOPJ_UINT32 maxpasses;\n\tOPJ_UINT32 numnewpasses;\n\tOPJ_UINT32 newlen;\n} opj_tcd_seg_t;\n\n/**\nFIXME DOC\n*/\ntypedef struct opj_tcd_pass {\n\tOPJ_UINT32 rate;\n\tOPJ_FLOAT64 distortiondec;\n\tOPJ_UINT32 len;\n\tOPJ_UINT32 term : 1;\n} opj_tcd_pass_t;\n\n/**\nFIXME DOC\n*/\ntypedef struct opj_tcd_layer {\n\tOPJ_UINT32 numpasses;\t\t/* Number of passes in the layer */\n\tOPJ_UINT32 len;\t\t\t\t/* len of information */\n\tOPJ_FLOAT64 disto;\t\t\t/* add for index (Cfr. Marcela) */\n\tOPJ_BYTE *data;\t\t\t\t/* data */\n} opj_tcd_layer_t;\n\n/**\nFIXME DOC\n*/\ntypedef struct opj_tcd_cblk_enc {\n\tOPJ_BYTE* data;\t\t\t\t\t/* Data */\n\topj_tcd_layer_t* layers;\t\t/* layer information */\n\topj_tcd_pass_t* passes;\t\t/* information about the passes */\n\tOPJ_INT32 x0, y0, x1, y1;\t\t/* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */\n\tOPJ_UINT32 numbps;\n\tOPJ_UINT32 numlenbits;\n\tOPJ_UINT32 numpasses;\t\t\t/* number of pass already done for the code-blocks */\n\tOPJ_UINT32 numpassesinlayers;\t/* number of passes in the layer */\n\tOPJ_UINT32 totalpasses;\t\t\t/* total number of passes */\n} opj_tcd_cblk_enc_t;\n\n\ntypedef struct opj_tcd_cblk_dec {\n\tOPJ_BYTE * data;\t\t\t\t/* Data */\n\topj_tcd_seg_t* segs;\t\t\t/* segments information */\n\tOPJ_INT32 x0, y0, x1, y1;\t\t/* position of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */\n\tOPJ_UINT32 numbps;\n\tOPJ_UINT32 numlenbits;\n    OPJ_UINT32 data_max_size;\t\t/* Size of allocated data buffer */\n\tOPJ_UINT32 data_current_size;\t/* Size of used data buffer */\n\tOPJ_UINT32 numnewpasses;\t\t/* number of pass added to the code-blocks */\n\tOPJ_UINT32 numsegs;\t\t\t\t/* number of segments */\n\tOPJ_UINT32 real_num_segs;\n\tOPJ_UINT32 m_current_max_segs;\n} opj_tcd_cblk_dec_t;\n\n/**\nFIXME DOC\n*/\ntypedef struct opj_tcd_precinct {\n\tOPJ_INT32 x0, y0, x1, y1;\t\t/* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */\n\tOPJ_UINT32 cw, ch;\t\t\t\t/* number of precinct in width and height */\n\tunion{\t\t\t\t\t\t\t/* code-blocks information */\n\t\topj_tcd_cblk_enc_t* enc;\n\t\topj_tcd_cblk_dec_t* dec;\n\t} cblks;\n\tOPJ_UINT32 block_size;\t\t\t/* size taken by cblks (in bytes) */\n\topj_tgt_tree_t *incltree;\t    /* inclusion tree */\n\topj_tgt_tree_t *imsbtree;\t    /* IMSB tree */\n} opj_tcd_precinct_t;\n\n/**\nFIXME DOC\n*/\ntypedef struct opj_tcd_band {\n\tOPJ_INT32 x0, y0, x1, y1;\t\t/* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */\n\tOPJ_UINT32 bandno;\n\topj_tcd_precinct_t *precincts;\t/* precinct information */\n\tOPJ_UINT32 precincts_data_size;\t/* size of data taken by precincts */\n\tOPJ_INT32 numbps;\n\tOPJ_FLOAT32 stepsize;\n} opj_tcd_band_t;\n\n/**\nFIXME DOC\n*/\ntypedef struct opj_tcd_resolution {\n\tOPJ_INT32 x0, y0, x1, y1;\t\t/* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */\n\tOPJ_UINT32 pw, ph;\n\tOPJ_UINT32 numbands;\t\t\t/* number sub-band for the resolution level */\n\topj_tcd_band_t bands[3];\t\t/* subband information */\n} opj_tcd_resolution_t;\n\n/**\nFIXME DOC\n*/\ntypedef struct opj_tcd_tilecomp\n{\n\tOPJ_INT32 x0, y0, x1, y1;\t\t\t\t/* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */\n\tOPJ_UINT32 numresolutions;\t\t\t\t/* number of resolutions level */\n\tOPJ_UINT32 minimum_num_resolutions;\t\t/* number of resolutions level to decode (at max)*/\n\topj_tcd_resolution_t *resolutions;\t/* resolutions information */\n\tOPJ_UINT32 resolutions_size;\t\t\t/* size of data for resolutions (in bytes) */\n\tOPJ_INT32 *data;\t\t\t\t\t\t/* data of the component */\n\tOPJ_UINT32 data_size;\t\t\t\t\t/* size of the data of the component */\n\tOPJ_INT32 numpix;\t\t\t\t\t\t/* add fixed_quality */\n} opj_tcd_tilecomp_t;\n\n\n/**\nFIXME DOC\n*/\ntypedef struct opj_tcd_tile {\n\tOPJ_INT32 x0, y0, x1, y1;\t\t/* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */\n\tOPJ_UINT32 numcomps;\t\t\t/* number of components in tile */\n\topj_tcd_tilecomp_t *comps;\t/* Components information */\n\tOPJ_INT32 numpix;\t\t\t\t/* add fixed_quality */\n\tOPJ_FLOAT64 distotile;\t\t\t/* add fixed_quality */\n\tOPJ_FLOAT64 distolayer[100];\t/* add fixed_quality */\n\tOPJ_UINT32 packno;              /* packet number */\n} opj_tcd_tile_t;\n\n/**\nFIXME DOC\n*/\ntypedef struct opj_tcd_image\n{\n\topj_tcd_tile_t *tiles;\t\t/* Tiles information */\n}\nopj_tcd_image_t;\n\n\n/**\nTile coder/decoder\n*/\ntypedef struct opj_tcd\n{\n\t/** Position of the tilepart flag in Progression order*/\n\tOPJ_INT32 tp_pos;\n\t/** Tile part number*/\n\tOPJ_UINT32 tp_num;\n\t/** Current tile part number*/\n\tOPJ_UINT32 cur_tp_num;\n\t/** Total number of tileparts of the current tile*/\n\tOPJ_UINT32 cur_totnum_tp;\n\t/** Current Packet iterator number */\n\tOPJ_UINT32 cur_pino;\n\t/** info on each image tile */\n\topj_tcd_image_t *tcd_image;\n\t/** image header */\n\topj_image_t *image;\n\t/** coding parameters */\n\topj_cp_t *cp;\n\t/** coding/decoding parameters common to all tiles */\n\topj_tcp_t *tcp;\n\t/** current encoded/decoded tile */\n\tOPJ_UINT32 tcd_tileno;\n\t/** tell if the tcd is a decoder. */\n\tOPJ_UINT32 m_is_decoder : 1;\n} opj_tcd_t;\n\n/** @name Exported functions */\n/*@{*/\n/* ----------------------------------------------------------------------- */\n\n/**\nDump the content of a tcd structure\n*/\n/*void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t *img);*/ /* TODO MSD shoul use the new v2 structures */ \n\n/**\nCreate a new TCD handle\n@param p_is_decoder FIXME DOC\n@return Returns a new TCD handle if successful returns NULL otherwise\n*/\nopj_tcd_t* opj_tcd_create(OPJ_BOOL p_is_decoder);\n\n/**\nDestroy a previously created TCD handle\n@param tcd TCD handle to destroy\n*/\nvoid opj_tcd_destroy(opj_tcd_t *tcd);\n\n/**\n * Initialize the tile coder and may reuse some memory.\n * @param\tp_tcd\t\tTCD handle.\n * @param\tp_image\t\traw image.\n * @param\tp_cp\t\tcoding parameters.\n *\n * @return true if the encoding values could be set (false otherwise).\n*/\nOPJ_BOOL opj_tcd_init(\topj_tcd_t *p_tcd,\n\t\t\t\t\t\topj_image_t * p_image,\n\t\t\t\t\t\topj_cp_t * p_cp );\n\n/**\n * Allocates memory for decoding a specific tile.\n *\n * @param\tp_tcd\t\tthe tile decoder.\n * @param\tp_tile_no\tthe index of the tile received in sequence. This not necessarily lead to the\n * tile at index p_tile_no.\n *\n * @return\ttrue if the remaining data is sufficient.\n */\nOPJ_BOOL opj_tcd_init_decode_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no);\n\nvoid opj_tcd_makelayer_fixed(opj_tcd_t *tcd, OPJ_UINT32 layno, OPJ_UINT32 final);\n\nvoid opj_tcd_rateallocate_fixed(opj_tcd_t *tcd);\n\nvoid opj_tcd_makelayer(\topj_tcd_t *tcd,\n\t\t\t\t\t\tOPJ_UINT32 layno,\n\t\t\t\t\t\tOPJ_FLOAT64 thresh,\n\t\t\t\t\t\tOPJ_UINT32 final);\n\nOPJ_BOOL opj_tcd_rateallocate(\topj_tcd_t *tcd,\n\t\t\t\t\t\t\t\tOPJ_BYTE *dest,\n\t\t\t\t\t\t\t\tOPJ_UINT32 * p_data_written,\n\t\t\t\t\t\t\t\tOPJ_UINT32 len,\n\t\t\t\t\t\t\t\topj_codestream_info_t *cstr_info);\n\n/**\n * Gets the maximum tile size that will be taken by the tile once decoded.\n */\nOPJ_UINT32 opj_tcd_get_decoded_tile_size (opj_tcd_t *p_tcd );\n\n/**\n * Encodes a tile from the raw image into the given buffer.\n * @param\tp_tcd\t\t\tTile Coder handle\n * @param\tp_tile_no\t\tIndex of the tile to encode.\n * @param\tp_dest\t\t\tDestination buffer\n * @param\tp_data_written\tpointer to an int that is incremented by the number of bytes really written on p_dest\n * @param\tp_len\t\t\tMaximum length of the destination buffer\n * @param\tp_cstr_info\t\tCodestream information structure\n * @return  true if the coding is successfull.\n*/\nOPJ_BOOL opj_tcd_encode_tile(   opj_tcd_t *p_tcd,\n\t\t\t\t\t\t\t    OPJ_UINT32 p_tile_no,\n\t\t\t\t\t\t\t    OPJ_BYTE *p_dest,\n\t\t\t\t\t\t\t    OPJ_UINT32 * p_data_written,\n\t\t\t\t\t\t\t    OPJ_UINT32 p_len,\n\t\t\t\t\t\t\t    struct opj_codestream_info *p_cstr_info);\n\n\n/**\nDecode a tile from a buffer into a raw image\n@param tcd TCD handle\n@param src Source buffer\n@param len Length of source buffer\n@param tileno Number that identifies one of the tiles to be decoded\n@param cstr_info  FIXME DOC\n*/\nOPJ_BOOL opj_tcd_decode_tile(   opj_tcd_t *tcd,\n\t\t\t\t\t\t\t    OPJ_BYTE *src,\n\t\t\t\t\t\t\t    OPJ_UINT32 len,\n\t\t\t\t\t\t\t    OPJ_UINT32 tileno,\n\t\t\t\t\t\t\t    opj_codestream_index_t *cstr_info);\n\n\n/**\n * Copies tile data from the system onto the given memory block.\n */\nOPJ_BOOL opj_tcd_update_tile_data (\topj_tcd_t *p_tcd,\n\t\t\t\t\t\t\t\t    OPJ_BYTE * p_dest,\n\t\t\t\t\t\t\t\t    OPJ_UINT32 p_dest_length );\n\n/**\n *\n */\nOPJ_UINT32 opj_tcd_get_encoded_tile_size ( opj_tcd_t *p_tcd );\n\n/**\n * Initialize the tile coder and may reuse some meory.\n *\n * @param\tp_tcd\t\tTCD handle.\n * @param\tp_tile_no\tcurrent tile index to encode.\n *\n * @return true if the encoding values could be set (false otherwise).\n*/\nOPJ_BOOL opj_tcd_init_encode_tile (\topj_tcd_t *p_tcd,\n\t\t\t\t\t\t\t\t    OPJ_UINT32 p_tile_no );\n\n/**\n * Copies tile data from the given memory block onto the system.\n */\nOPJ_BOOL opj_tcd_copy_tile_data (opj_tcd_t *p_tcd,\n                                 OPJ_BYTE * p_src,\n                                 OPJ_UINT32 p_src_length );\n\n/* ----------------------------------------------------------------------- */\n/*@}*/\n\n/*@}*/\n\n#endif /* __TCD_H */\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tgt.c",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2001-2003, David Janssens\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR \n * Copyright (c) 2012, CS Systemes d'Information, France\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"opj_includes.h\"\n\n/* \n==========================================================\n   Tag-tree coder interface\n==========================================================\n*/\n\nopj_tgt_tree_t *opj_tgt_create(OPJ_UINT32 numleafsh, OPJ_UINT32 numleafsv) {\n        OPJ_INT32 nplh[32];\n        OPJ_INT32 nplv[32];\n        opj_tgt_node_t *node = 00;\n        opj_tgt_node_t *l_parent_node = 00;\n        opj_tgt_node_t *l_parent_node0 = 00;\n        opj_tgt_tree_t *tree = 00;\n        OPJ_UINT32 i;\n        OPJ_INT32  j,k;\n        OPJ_UINT32 numlvls;\n        OPJ_UINT32 n;\n\n        tree = (opj_tgt_tree_t *) opj_malloc(sizeof(opj_tgt_tree_t));\n        if(!tree) {\n                fprintf(stderr, \"ERROR in tgt_create while allocating tree\\n\");\n                return 00;\n        }\n        memset(tree,0,sizeof(opj_tgt_tree_t));\n\n        tree->numleafsh = numleafsh;\n        tree->numleafsv = numleafsv;\n\n        numlvls = 0;\n        nplh[0] = (OPJ_INT32)numleafsh;\n        nplv[0] = (OPJ_INT32)numleafsv;\n        tree->numnodes = 0;\n        do {\n                n = (OPJ_UINT32)(nplh[numlvls] * nplv[numlvls]);\n                nplh[numlvls + 1] = (nplh[numlvls] + 1) / 2;\n                nplv[numlvls + 1] = (nplv[numlvls] + 1) / 2;\n                tree->numnodes += n;\n                ++numlvls;\n        } while (n > 1);\n\n        /* ADD */\n        if (tree->numnodes == 0) {\n                opj_free(tree);\n                fprintf(stderr, \"WARNING in tgt_create tree->numnodes == 0, no tree created.\\n\");\n                return 00;\n        }\n\n        tree->nodes = (opj_tgt_node_t*) opj_calloc(tree->numnodes, sizeof(opj_tgt_node_t));\n        if(!tree->nodes) {\n                fprintf(stderr, \"ERROR in tgt_create while allocating node of the tree\\n\");\n                opj_free(tree);\n                return 00;\n        }\n        memset(tree->nodes,0,tree->numnodes * sizeof(opj_tgt_node_t));\n        tree->nodes_size = tree->numnodes * (OPJ_UINT32)sizeof(opj_tgt_node_t);\n\n        node = tree->nodes;\n        l_parent_node = &tree->nodes[tree->numleafsh * tree->numleafsv];\n        l_parent_node0 = l_parent_node;\n\n        for (i = 0; i < numlvls - 1; ++i) {\n                for (j = 0; j < nplv[i]; ++j) {\n                        k = nplh[i];\n                        while (--k >= 0) {\n                                node->parent = l_parent_node;\n                                ++node;\n                                if (--k >= 0) {\n                                        node->parent = l_parent_node;\n                                        ++node;\n                                }\n                                ++l_parent_node;\n                        }\n                        if ((j & 1) || j == nplv[i] - 1) {\n                                l_parent_node0 = l_parent_node;\n                        } else {\n                                l_parent_node = l_parent_node0;\n                                l_parent_node0 += nplh[i];\n                        }\n                }\n        }\n        node->parent = 0;\n        opj_tgt_reset(tree);\n        return tree;\n}\n\n/**\n * Reinitialises a tag-tree from an existing one.\n *\n * @param       p_tree                          the tree to reinitialize.\n * @param       p_num_leafs_h           the width of the array of leafs of the tree\n * @param       p_num_leafs_v           the height of the array of leafs of the tree\n * @return      a new tag-tree if successful, NULL otherwise\n*/\nopj_tgt_tree_t *opj_tgt_init(opj_tgt_tree_t * p_tree,OPJ_UINT32 p_num_leafs_h, OPJ_UINT32 p_num_leafs_v)\n{\n        OPJ_INT32 l_nplh[32];\n        OPJ_INT32 l_nplv[32];\n        opj_tgt_node_t *l_node = 00;\n        opj_tgt_node_t *l_parent_node = 00;\n        opj_tgt_node_t *l_parent_node0 = 00;\n        OPJ_UINT32 i;\n        OPJ_INT32 j,k;\n        OPJ_UINT32 l_num_levels;\n        OPJ_UINT32 n;\n        OPJ_UINT32 l_node_size;\n\n        if (! p_tree){\n                return 00;\n        }\n\n        if ((p_tree->numleafsh != p_num_leafs_h) || (p_tree->numleafsv != p_num_leafs_v)) {\n                p_tree->numleafsh = p_num_leafs_h;\n                p_tree->numleafsv = p_num_leafs_v;\n\n                l_num_levels = 0;\n                l_nplh[0] = (OPJ_INT32)p_num_leafs_h;\n                l_nplv[0] = (OPJ_INT32)p_num_leafs_v;\n                p_tree->numnodes = 0;\n                do\n                {\n                        n = (OPJ_UINT32)(l_nplh[l_num_levels] * l_nplv[l_num_levels]);\n                        l_nplh[l_num_levels + 1] = (l_nplh[l_num_levels] + 1) / 2;\n                        l_nplv[l_num_levels + 1] = (l_nplv[l_num_levels] + 1) / 2;\n                        p_tree->numnodes += n;\n                        ++l_num_levels;\n                }\n                while (n > 1);\n\n                /* ADD */\n                if (p_tree->numnodes == 0) {\n                        opj_tgt_destroy(p_tree);\n                        return 00;\n                }\n                l_node_size = p_tree->numnodes * (OPJ_UINT32)sizeof(opj_tgt_node_t);\n                \n                if (l_node_size > p_tree->nodes_size) {\n                        opj_tgt_node_t* new_nodes = (opj_tgt_node_t*) opj_realloc(p_tree->nodes, l_node_size);\n                        if (! new_nodes) {\n                                fprintf(stderr, \"ERROR Not enough memory to reinitialize the tag tree\\n\");\n                                opj_tgt_destroy(p_tree);\n                                return 00;\n                        }\n                        p_tree->nodes = new_nodes;\n                        memset(((char *) p_tree->nodes) + p_tree->nodes_size, 0 , l_node_size - p_tree->nodes_size);\n                        p_tree->nodes_size = l_node_size;\n                }\n                l_node = p_tree->nodes;\n                l_parent_node = &p_tree->nodes[p_tree->numleafsh * p_tree->numleafsv];\n                l_parent_node0 = l_parent_node;\n\n                for (i = 0; i < l_num_levels - 1; ++i) {\n                        for (j = 0; j < l_nplv[i]; ++j) {\n                                k = l_nplh[i];\n                                while (--k >= 0) {\n                                        l_node->parent = l_parent_node;\n                                        ++l_node;\n                                        if (--k >= 0) {\n                                                l_node->parent = l_parent_node;\n                                                ++l_node;\n                                        }\n                                        ++l_parent_node;\n                                        }\n                                if ((j & 1) || j == l_nplv[i] - 1)\n                                {\n                                        l_parent_node0 = l_parent_node;\n                                }\n                                else\n                                {\n                                        l_parent_node = l_parent_node0;\n                                        l_parent_node0 += l_nplh[i];\n                                }\n                        }\n                }\n                l_node->parent = 0;\n        }\n        opj_tgt_reset(p_tree);\n\n        return p_tree;\n}\n\nvoid opj_tgt_destroy(opj_tgt_tree_t *p_tree)\n{\n        if (! p_tree) {\n                return;\n        }\n\n        if (p_tree->nodes) {\n                opj_free(p_tree->nodes);\n                p_tree->nodes = 00;\n        }\n        opj_free(p_tree);\n}\n\nvoid opj_tgt_reset(opj_tgt_tree_t *p_tree) {\n        OPJ_UINT32 i;\n        opj_tgt_node_t * l_current_node = 00;;\n\n        if (! p_tree) {\n                return;\n        }\n\n        l_current_node = p_tree->nodes;\n        for     (i = 0; i < p_tree->numnodes; ++i)\n        {\n                l_current_node->value = 999;\n                l_current_node->low = 0;\n                l_current_node->known = 0;\n                ++l_current_node;\n        }\n}\n\nvoid opj_tgt_setvalue(opj_tgt_tree_t *tree, OPJ_UINT32 leafno, OPJ_INT32 value) {\n        opj_tgt_node_t *node;\n        node = &tree->nodes[leafno];\n        while (node && node->value > value) {\n                node->value = value;\n                node = node->parent;\n        }\n}\n\nvoid opj_tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, OPJ_UINT32 leafno, OPJ_INT32 threshold) {\n        opj_tgt_node_t *stk[31];\n        opj_tgt_node_t **stkptr;\n        opj_tgt_node_t *node;\n        OPJ_INT32 low;\n\n        stkptr = stk;\n        node = &tree->nodes[leafno];\n        while (node->parent) {\n                *stkptr++ = node;\n                node = node->parent;\n        }\n        \n        low = 0;\n        for (;;) {\n                if (low > node->low) {\n                        node->low = low;\n                } else {\n                        low = node->low;\n                }\n                \n                while (low < threshold) {\n                        if (low >= node->value) {\n                                if (!node->known) {\n                                        opj_bio_write(bio, 1, 1);\n                                        node->known = 1;\n                                }\n                                break;\n                        }\n                        opj_bio_write(bio, 0, 1);\n                        ++low;\n                }\n                \n                node->low = low;\n                if (stkptr == stk)\n                        break;\n                node = *--stkptr;\n        }\n}\n\nOPJ_UINT32 opj_tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, OPJ_UINT32 leafno, OPJ_INT32 threshold) {\n        opj_tgt_node_t *stk[31];\n        opj_tgt_node_t **stkptr;\n        opj_tgt_node_t *node;\n        OPJ_INT32 low;\n\n        stkptr = stk;\n        node = &tree->nodes[leafno];\n        while (node->parent) {\n                *stkptr++ = node;\n                node = node->parent;\n        }\n        \n        low = 0;\n        for (;;) {\n                if (low > node->low) {\n                        node->low = low;\n                } else {\n                        low = node->low;\n                }\n                while (low < threshold && low < node->value) {\n                        if (opj_bio_read(bio, 1)) {\n                                node->value = low;\n                        } else {\n                                ++low;\n                        }\n                }\n                node->low = low;\n                if (stkptr == stk) {\n                        break;\n                }\n                node = *--stkptr;\n        }\n        \n        return (node->value < threshold) ? 1 : 0;\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tgt.h",
    "content": "/*\n * The copyright in this software is being made available under the 2-clauses \n * BSD License, included below. This software may be subject to other third \n * party and contributor rights, including patent rights, and no such rights\n * are granted under this license.\n *\n * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium\n * Copyright (c) 2002-2014, Professor Benoit Macq\n * Copyright (c) 2001-2003, David Janssens\n * Copyright (c) 2002-2003, Yannick Verschueren\n * Copyright (c) 2003-2007, Francois-Olivier Devaux \n * Copyright (c) 2003-2014, Antonin Descampe\n * Copyright (c) 2005, Herve Drolon, FreeImage Team\n * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>\n * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France \n * Copyright (c) 2012, CS Systemes d'Information, France\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifndef __TGT_H\n#define __TGT_H\n/**\n@file tgt.h\n@brief Implementation of a tag-tree coder (TGT)\n\nThe functions in TGT.C have for goal to realize a tag-tree coder. The functions in TGT.C\nare used by some function in T2.C.\n*/\n\n/** @defgroup TGT TGT - Implementation of a tag-tree coder */\n/*@{*/\n\n/**\nTag node\n*/\ntypedef struct opj_tgt_node {\n    struct opj_tgt_node *parent;\n    OPJ_INT32 value;\n    OPJ_INT32 low;\n    OPJ_UINT32 known;\n} opj_tgt_node_t;\n\n/**\nTag tree\n*/\ntypedef struct opj_tgt_tree\n{\n\tOPJ_UINT32  numleafsh;\n\tOPJ_UINT32  numleafsv;\n\tOPJ_UINT32 numnodes;\n\topj_tgt_node_t *nodes;\n\tOPJ_UINT32  nodes_size;\t\t/* maximum size taken by nodes */\n} opj_tgt_tree_t;\n\n\n/** @name Exported functions */\n/*@{*/\n/* ----------------------------------------------------------------------- */\n/**\nCreate a tag-tree\n@param numleafsh Width of the array of leafs of the tree\n@param numleafsv Height of the array of leafs of the tree\n@return Returns a new tag-tree if successful, returns NULL otherwise\n*/\nopj_tgt_tree_t *opj_tgt_create(OPJ_UINT32 numleafsh, OPJ_UINT32 numleafsv);\n\n/**\n * Reinitialises a tag-tree from an exixting one.\n *\n * @param\tp_tree\t\t\t\tthe tree to reinitialize.\n * @param\tp_num_leafs_h\t\tthe width of the array of leafs of the tree\n * @param\tp_num_leafs_v\t\tthe height of the array of leafs of the tree\n * @return\ta new tag-tree if successful, NULL otherwise\n*/\nopj_tgt_tree_t *opj_tgt_init(opj_tgt_tree_t * p_tree, \n                             OPJ_UINT32  p_num_leafs_h, \n                             OPJ_UINT32  p_num_leafs_v);\n/**\nDestroy a tag-tree, liberating memory\n@param tree Tag-tree to destroy\n*/\nvoid opj_tgt_destroy(opj_tgt_tree_t *tree);\n/**\nReset a tag-tree (set all leaves to 0)\n@param tree Tag-tree to reset\n*/\nvoid opj_tgt_reset(opj_tgt_tree_t *tree);\n/**\nSet the value of a leaf of a tag-tree\n@param tree Tag-tree to modify\n@param leafno Number that identifies the leaf to modify\n@param value New value of the leaf\n*/\nvoid opj_tgt_setvalue(opj_tgt_tree_t *tree, \n                      OPJ_UINT32 leafno, \n                      OPJ_INT32 value);\n/**\nEncode the value of a leaf of the tag-tree up to a given threshold\n@param bio Pointer to a BIO handle\n@param tree Tag-tree to modify\n@param leafno Number that identifies the leaf to encode\n@param threshold Threshold to use when encoding value of the leaf\n*/\nvoid opj_tgt_encode(opj_bio_t *bio, \n                    opj_tgt_tree_t *tree, \n                    OPJ_UINT32 leafno, \n                    OPJ_INT32 threshold);\n/**\nDecode the value of a leaf of the tag-tree up to a given threshold\n@param bio Pointer to a BIO handle\n@param tree Tag-tree to decode\n@param leafno Number that identifies the leaf to decode\n@param threshold Threshold to use when decoding value of the leaf\n@return Returns 1 if the node's value < threshold, returns 0 otherwise\n*/\nOPJ_UINT32 opj_tgt_decode(opj_bio_t *bio, \n                          opj_tgt_tree_t *tree, \n                          OPJ_UINT32 leafno, \n                          OPJ_INT32 threshold);\n/* ----------------------------------------------------------------------- */\n/*@}*/\n\n/*@}*/\n\n#endif /* __TGT_H */\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/src/fx_bio.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../libopenjpeg20/bio.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/src/fx_cio.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../libopenjpeg20/cio.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/src/fx_dwt.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../libopenjpeg20/dwt.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/src/fx_event.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../libopenjpeg20/event.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/src/fx_function_list.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../libopenjpeg20/function_list.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/src/fx_image.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../libopenjpeg20/image.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/src/fx_invert.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../libopenjpeg20/invert.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/src/fx_j2k.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../libopenjpeg20/j2k.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/src/fx_j2k_lib.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/src/fx_jpt.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/src/fx_mct.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../libopenjpeg20/mct.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/src/fx_mqc.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../libopenjpeg20/mqc.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/src/fx_openjpeg.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../libopenjpeg20/openjpeg.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/src/fx_openjpeg_jp2.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../libopenjpeg20/jp2.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/src/fx_opj_clock.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../libopenjpeg20/opj_clock.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/src/fx_pi.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../libopenjpeg20/pi.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/src/fx_raw.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../libopenjpeg20/raw.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/src/fx_t1.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../libopenjpeg20/t1.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/src/fx_t1_generate_luts.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../libopenjpeg20/t1_generate_luts.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/src/fx_t2.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../libopenjpeg20/t2.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/src/fx_tcd.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../libopenjpeg20/tcd.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_libopenjpeg/src/fx_tgt.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../libopenjpeg20/tgt.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/include/fx_zlib.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../zlib_v128/zlib.h\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/src/fx_zlib_adler32.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../zlib_v128/fx_zlib_adler32.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/src/fx_zlib_compress.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../zlib_v128/fx_zlib_compress.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/src/fx_zlib_crc32.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../zlib_v128/fx_zlib_crc32.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/src/fx_zlib_deflate.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../zlib_v128/fx_zlib_deflate.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/src/fx_zlib_gzclose.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../zlib_v128/gzclose.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/src/fx_zlib_gzlib.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../zlib_v128/gzlib.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/src/fx_zlib_gzread.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../zlib_v128/gzread.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/src/fx_zlib_gzwrite.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../zlib_v128/gzwrite.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/src/fx_zlib_infback.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../zlib_v128/fx_zlib_infback.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/src/fx_zlib_inffast.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../zlib_v128/fx_zlib_inffast.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/src/fx_zlib_inflate.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../zlib_v128/fx_zlib_inflate.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/src/fx_zlib_inftrees.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../zlib_v128/fx_zlib_inftrees.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/src/fx_zlib_trees.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../zlib_v128/fx_zlib_trees.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/src/fx_zlib_uncompr.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../zlib_v128/fx_zlib_uncompr.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/src/fx_zlib_zutil.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#include \"../zlib_v128/fx_zlib_zutil.c\"\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/zlib_v128/crc32.h",
    "content": "/* crc32.h -- tables for rapid CRC calculation\n * Generated automatically by crc32.c\n */\n\nlocal const z_crc_t FAR crc_table[TBLS][256] =\n{\n  {\n    0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL,\n    0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL,\n    0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL,\n    0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL,\n    0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL,\n    0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL,\n    0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL,\n    0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL,\n    0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL,\n    0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL,\n    0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL,\n    0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL,\n    0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL,\n    0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL,\n    0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL,\n    0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL,\n    0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL,\n    0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL,\n    0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL,\n    0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL,\n    0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL,\n    0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL,\n    0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL,\n    0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL,\n    0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL,\n    0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL,\n    0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL,\n    0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL,\n    0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL,\n    0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL,\n    0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL,\n    0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL,\n    0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL,\n    0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL,\n    0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL,\n    0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL,\n    0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL,\n    0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL,\n    0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL,\n    0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL,\n    0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL,\n    0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL,\n    0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL,\n    0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL,\n    0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL,\n    0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL,\n    0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL,\n    0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL,\n    0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL,\n    0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL,\n    0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL,\n    0x2d02ef8dUL\n#ifdef BYFOUR\n  },\n  {\n    0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL,\n    0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL,\n    0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL,\n    0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL,\n    0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL,\n    0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL,\n    0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL,\n    0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL,\n    0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL,\n    0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL,\n    0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL,\n    0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL,\n    0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL,\n    0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL,\n    0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL,\n    0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL,\n    0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL,\n    0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL,\n    0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL,\n    0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL,\n    0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL,\n    0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL,\n    0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL,\n    0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL,\n    0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL,\n    0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL,\n    0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL,\n    0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL,\n    0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL,\n    0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL,\n    0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL,\n    0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL,\n    0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL,\n    0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL,\n    0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL,\n    0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL,\n    0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL,\n    0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL,\n    0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL,\n    0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL,\n    0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL,\n    0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL,\n    0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL,\n    0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL,\n    0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL,\n    0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL,\n    0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL,\n    0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL,\n    0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL,\n    0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL,\n    0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL,\n    0x9324fd72UL\n  },\n  {\n    0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL,\n    0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL,\n    0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL,\n    0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL,\n    0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL,\n    0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL,\n    0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL,\n    0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL,\n    0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL,\n    0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL,\n    0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL,\n    0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL,\n    0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL,\n    0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL,\n    0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL,\n    0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL,\n    0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL,\n    0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL,\n    0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL,\n    0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL,\n    0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL,\n    0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL,\n    0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL,\n    0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL,\n    0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL,\n    0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL,\n    0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL,\n    0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL,\n    0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL,\n    0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL,\n    0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL,\n    0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL,\n    0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL,\n    0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL,\n    0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL,\n    0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL,\n    0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL,\n    0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL,\n    0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL,\n    0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL,\n    0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL,\n    0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL,\n    0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL,\n    0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL,\n    0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL,\n    0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL,\n    0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL,\n    0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL,\n    0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL,\n    0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL,\n    0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL,\n    0xbe9834edUL\n  },\n  {\n    0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL,\n    0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL,\n    0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL,\n    0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL,\n    0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL,\n    0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL,\n    0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL,\n    0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL,\n    0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL,\n    0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL,\n    0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL,\n    0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL,\n    0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL,\n    0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL,\n    0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL,\n    0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL,\n    0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL,\n    0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL,\n    0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL,\n    0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL,\n    0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL,\n    0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL,\n    0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL,\n    0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL,\n    0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL,\n    0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL,\n    0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL,\n    0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL,\n    0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL,\n    0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL,\n    0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL,\n    0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL,\n    0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL,\n    0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL,\n    0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL,\n    0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL,\n    0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL,\n    0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL,\n    0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL,\n    0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL,\n    0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL,\n    0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL,\n    0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL,\n    0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL,\n    0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL,\n    0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL,\n    0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL,\n    0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL,\n    0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL,\n    0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL,\n    0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL,\n    0xde0506f1UL\n  },\n  {\n    0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL,\n    0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL,\n    0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL,\n    0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL,\n    0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL,\n    0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL,\n    0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL,\n    0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL,\n    0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL,\n    0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL,\n    0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL,\n    0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL,\n    0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL,\n    0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL,\n    0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL,\n    0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL,\n    0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL,\n    0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL,\n    0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL,\n    0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL,\n    0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL,\n    0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL,\n    0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL,\n    0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL,\n    0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL,\n    0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL,\n    0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL,\n    0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL,\n    0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL,\n    0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL,\n    0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL,\n    0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL,\n    0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL,\n    0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL,\n    0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL,\n    0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL,\n    0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL,\n    0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL,\n    0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL,\n    0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL,\n    0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL,\n    0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL,\n    0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL,\n    0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL,\n    0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL,\n    0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL,\n    0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL,\n    0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL,\n    0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL,\n    0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL,\n    0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL,\n    0x8def022dUL\n  },\n  {\n    0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL,\n    0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL,\n    0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL,\n    0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL,\n    0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL,\n    0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL,\n    0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL,\n    0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL,\n    0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL,\n    0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL,\n    0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL,\n    0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL,\n    0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL,\n    0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL,\n    0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL,\n    0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL,\n    0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL,\n    0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL,\n    0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL,\n    0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL,\n    0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL,\n    0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL,\n    0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL,\n    0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL,\n    0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL,\n    0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL,\n    0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL,\n    0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL,\n    0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL,\n    0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL,\n    0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL,\n    0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL,\n    0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL,\n    0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL,\n    0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL,\n    0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL,\n    0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL,\n    0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL,\n    0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL,\n    0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL,\n    0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL,\n    0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL,\n    0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL,\n    0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL,\n    0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL,\n    0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL,\n    0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL,\n    0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL,\n    0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL,\n    0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL,\n    0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL,\n    0x72fd2493UL\n  },\n  {\n    0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL,\n    0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL,\n    0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL,\n    0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL,\n    0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL,\n    0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL,\n    0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL,\n    0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL,\n    0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL,\n    0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL,\n    0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL,\n    0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL,\n    0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL,\n    0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL,\n    0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL,\n    0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL,\n    0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL,\n    0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL,\n    0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL,\n    0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL,\n    0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL,\n    0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL,\n    0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL,\n    0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL,\n    0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL,\n    0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL,\n    0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL,\n    0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL,\n    0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL,\n    0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL,\n    0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL,\n    0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL,\n    0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL,\n    0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL,\n    0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL,\n    0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL,\n    0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL,\n    0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL,\n    0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL,\n    0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL,\n    0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL,\n    0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL,\n    0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL,\n    0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL,\n    0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL,\n    0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL,\n    0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL,\n    0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL,\n    0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL,\n    0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL,\n    0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL,\n    0xed3498beUL\n  },\n  {\n    0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL,\n    0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL,\n    0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL,\n    0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL,\n    0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL,\n    0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL,\n    0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL,\n    0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL,\n    0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL,\n    0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL,\n    0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL,\n    0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL,\n    0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL,\n    0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL,\n    0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL,\n    0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL,\n    0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL,\n    0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL,\n    0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL,\n    0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL,\n    0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL,\n    0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL,\n    0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL,\n    0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL,\n    0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL,\n    0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL,\n    0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL,\n    0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL,\n    0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL,\n    0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL,\n    0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL,\n    0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL,\n    0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL,\n    0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL,\n    0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL,\n    0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL,\n    0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL,\n    0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL,\n    0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL,\n    0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL,\n    0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL,\n    0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL,\n    0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL,\n    0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL,\n    0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL,\n    0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL,\n    0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL,\n    0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL,\n    0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL,\n    0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL,\n    0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL,\n    0xf10605deUL\n#endif\n  }\n};\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/zlib_v128/deflate.h",
    "content": "/* deflate.h -- internal compression state\n * Copyright (C) 1995-2012 Jean-loup Gailly\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* WARNING: this file should *not* be used by applications. It is\n   part of the implementation of the compression library and is\n   subject to change. Applications should only use zlib.h.\n */\n\n/* @(#) $Id$ */\n\n#ifndef DEFLATE_H\n#define DEFLATE_H\n\n#include \"zutil.h\"\n\n/* define NO_GZIP when compiling if you want to disable gzip header and\n   trailer creation by deflate().  NO_GZIP would be used to avoid linking in\n   the crc code when it is not needed.  For shared libraries, gzip encoding\n   should be left enabled. */\n#ifndef NO_GZIP\n#  define GZIP\n#endif\n\n/* ===========================================================================\n * Internal compression state.\n */\n\n#define LENGTH_CODES 29\n/* number of length codes, not counting the special END_BLOCK code */\n\n#define LITERALS  256\n/* number of literal bytes 0..255 */\n\n#define L_CODES (LITERALS+1+LENGTH_CODES)\n/* number of Literal or Length codes, including the END_BLOCK code */\n\n#define D_CODES   30\n/* number of distance codes */\n\n#define BL_CODES  19\n/* number of codes used to transfer the bit lengths */\n\n#define HEAP_SIZE (2*L_CODES+1)\n/* maximum heap size */\n\n#define MAX_BITS 15\n/* All codes must not exceed MAX_BITS bits */\n\n#define Buf_size 16\n/* size of bit buffer in bi_buf */\n\n#define INIT_STATE    42\n#define EXTRA_STATE   69\n#define NAME_STATE    73\n#define COMMENT_STATE 91\n#define HCRC_STATE   103\n#define BUSY_STATE   113\n#define FINISH_STATE 666\n/* Stream status */\n\n\n/* Data structure describing a single value and its code string. */\ntypedef struct ct_data_s {\n    union {\n        ush  freq;       /* frequency count */\n        ush  code;       /* bit string */\n    } fc;\n    union {\n        ush  dad;        /* father node in Huffman tree */\n        ush  len;        /* length of bit string */\n    } dl;\n} FAR ct_data;\n\n#define Freq fc.freq\n#define Code fc.code\n#define Dad  dl.dad\n#define Len  dl.len\n\ntypedef struct static_tree_desc_s  static_tree_desc;\n\ntypedef struct tree_desc_s {\n    ct_data *dyn_tree;           /* the dynamic tree */\n    int     max_code;            /* largest code with non zero frequency */\n    static_tree_desc *stat_desc; /* the corresponding static tree */\n} FAR tree_desc;\n\ntypedef ush Pos;\ntypedef Pos FAR Posf;\ntypedef unsigned IPos;\n\n/* A Pos is an index in the character window. We use short instead of int to\n * save space in the various tables. IPos is used only for parameter passing.\n */\n\ntypedef struct internal_state {\n    z_streamp strm;      /* pointer back to this zlib stream */\n    int   status;        /* as the name implies */\n    Bytef *pending_buf;  /* output still pending */\n    ulg   pending_buf_size; /* size of pending_buf */\n    Bytef *pending_out;  /* next pending byte to output to the stream */\n    uInt   pending;      /* nb of bytes in the pending buffer */\n    int   wrap;          /* bit 0 true for zlib, bit 1 true for gzip */\n    gz_headerp  gzhead;  /* gzip header information to write */\n    uInt   gzindex;      /* where in extra, name, or comment */\n    Byte  method;        /* can only be DEFLATED */\n    int   last_flush;    /* value of flush param for previous deflate call */\n\n                /* used by deflate.c: */\n\n    uInt  w_size;        /* LZ77 window size (32K by default) */\n    uInt  w_bits;        /* log2(w_size)  (8..16) */\n    uInt  w_mask;        /* w_size - 1 */\n\n    Bytef *window;\n    /* Sliding window. Input bytes are read into the second half of the window,\n     * and move to the first half later to keep a dictionary of at least wSize\n     * bytes. With this organization, matches are limited to a distance of\n     * wSize-MAX_MATCH bytes, but this ensures that IO is always\n     * performed with a length multiple of the block size. Also, it limits\n     * the window size to 64K, which is quite useful on MSDOS.\n     * To do: use the user input buffer as sliding window.\n     */\n\n    ulg window_size;\n    /* Actual size of window: 2*wSize, except when the user input buffer\n     * is directly used as sliding window.\n     */\n\n    Posf *prev;\n    /* Link to older string with same hash index. To limit the size of this\n     * array to 64K, this link is maintained only for the last 32K strings.\n     * An index in this array is thus a window index modulo 32K.\n     */\n\n    Posf *head; /* Heads of the hash chains or NIL. */\n\n    uInt  ins_h;          /* hash index of string to be inserted */\n    uInt  hash_size;      /* number of elements in hash table */\n    uInt  hash_bits;      /* log2(hash_size) */\n    uInt  hash_mask;      /* hash_size-1 */\n\n    uInt  hash_shift;\n    /* Number of bits by which ins_h must be shifted at each input\n     * step. It must be such that after MIN_MATCH steps, the oldest\n     * byte no longer takes part in the hash key, that is:\n     *   hash_shift * MIN_MATCH >= hash_bits\n     */\n\n    long block_start;\n    /* Window position at the beginning of the current output block. Gets\n     * negative when the window is moved backwards.\n     */\n\n    uInt match_length;           /* length of best match */\n    IPos prev_match;             /* previous match */\n    int match_available;         /* set if previous match exists */\n    uInt strstart;               /* start of string to insert */\n    uInt match_start;            /* start of matching string */\n    uInt lookahead;              /* number of valid bytes ahead in window */\n\n    uInt prev_length;\n    /* Length of the best match at previous step. Matches not greater than this\n     * are discarded. This is used in the lazy match evaluation.\n     */\n\n    uInt max_chain_length;\n    /* To speed up deflation, hash chains are never searched beyond this\n     * length.  A higher limit improves compression ratio but degrades the\n     * speed.\n     */\n\n    uInt max_lazy_match;\n    /* Attempt to find a better match only when the current match is strictly\n     * smaller than this value. This mechanism is used only for compression\n     * levels >= 4.\n     */\n#   define max_insert_length  max_lazy_match\n    /* Insert new strings in the hash table only if the match length is not\n     * greater than this length. This saves time but degrades compression.\n     * max_insert_length is used only for compression levels <= 3.\n     */\n\n    int level;    /* compression level (1..9) */\n    int strategy; /* favor or force Huffman coding*/\n\n    uInt good_match;\n    /* Use a faster search when the previous match is longer than this */\n\n    int nice_match; /* Stop searching when current match exceeds this */\n\n                /* used by trees.c: */\n    /* Didn't use ct_data typedef below to suppress compiler warning */\n    struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */\n    struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n    struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */\n\n    struct tree_desc_s l_desc;               /* desc. for literal tree */\n    struct tree_desc_s d_desc;               /* desc. for distance tree */\n    struct tree_desc_s bl_desc;              /* desc. for bit length tree */\n\n    ush bl_count[MAX_BITS+1];\n    /* number of codes at each bit length for an optimal tree */\n\n    int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */\n    int heap_len;               /* number of elements in the heap */\n    int heap_max;               /* element of largest frequency */\n    /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n     * The same heap array is used to build all trees.\n     */\n\n    uch depth[2*L_CODES+1];\n    /* Depth of each subtree used as tie breaker for trees of equal frequency\n     */\n\n    uchf *l_buf;          /* buffer for literals or lengths */\n\n    uInt  lit_bufsize;\n    /* Size of match buffer for literals/lengths.  There are 4 reasons for\n     * limiting lit_bufsize to 64K:\n     *   - frequencies can be kept in 16 bit counters\n     *   - if compression is not successful for the first block, all input\n     *     data is still in the window so we can still emit a stored block even\n     *     when input comes from standard input.  (This can also be done for\n     *     all blocks if lit_bufsize is not greater than 32K.)\n     *   - if compression is not successful for a file smaller than 64K, we can\n     *     even emit a stored file instead of a stored block (saving 5 bytes).\n     *     This is applicable only for zip (not gzip or zlib).\n     *   - creating new Huffman trees less frequently may not provide fast\n     *     adaptation to changes in the input data statistics. (Take for\n     *     example a binary file with poorly compressible code followed by\n     *     a highly compressible string table.) Smaller buffer sizes give\n     *     fast adaptation but have of course the overhead of transmitting\n     *     trees more frequently.\n     *   - I can't count above 4\n     */\n\n    uInt last_lit;      /* running index in l_buf */\n\n    ushf *d_buf;\n    /* Buffer for distances. To simplify the code, d_buf and l_buf have\n     * the same number of elements. To use different lengths, an extra flag\n     * array would be necessary.\n     */\n\n    ulg opt_len;        /* bit length of current block with optimal trees */\n    ulg static_len;     /* bit length of current block with static trees */\n    uInt matches;       /* number of string matches in current block */\n    uInt insert;        /* bytes at end of window left to insert */\n\n#ifdef DEBUG\n    ulg compressed_len; /* total bit length of compressed file mod 2^32 */\n    ulg bits_sent;      /* bit length of compressed data sent mod 2^32 */\n#endif\n\n    ush bi_buf;\n    /* Output buffer. bits are inserted starting at the bottom (least\n     * significant bits).\n     */\n    int bi_valid;\n    /* Number of valid bits in bi_buf.  All bits above the last valid bit\n     * are always zero.\n     */\n\n    ulg high_water;\n    /* High water mark offset in window for initialized bytes -- bytes above\n     * this are set to zero in order to avoid memory check warnings when\n     * longest match routines access bytes past the input.  This is then\n     * updated to the new high water mark.\n     */\n\n} FAR deflate_state;\n\n/* Output a byte on the stream.\n * IN assertion: there is enough room in pending_buf.\n */\n#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);}\n\n\n#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)\n/* Minimum amount of lookahead, except at the end of the input file.\n * See deflate.c for comments about the MIN_MATCH+1.\n */\n\n#define MAX_DIST(s)  ((s)->w_size-MIN_LOOKAHEAD)\n/* In order to simplify the code, particularly on 16 bit machines, match\n * distances are limited to MAX_DIST instead of WSIZE.\n */\n\n#define WIN_INIT MAX_MATCH\n/* Number of bytes after end of data in window to initialize in order to avoid\n   memory checker errors from longest match routines */\n\n        /* in trees.c */\nvoid ZLIB_INTERNAL _tr_init OF((deflate_state *s));\nint ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc));\nvoid ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf,\n                        ulg stored_len, int last));\nvoid ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s));\nvoid ZLIB_INTERNAL _tr_align OF((deflate_state *s));\nvoid ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf,\n                        ulg stored_len, int last));\n\n#define d_code(dist) \\\n   ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)])\n/* Mapping from a distance to a distance code. dist is the distance - 1 and\n * must not have side effects. _dist_code[256] and _dist_code[257] are never\n * used.\n */\n\n#ifndef DEBUG\n/* Inline versions of _tr_tally for speed: */\n\n#if defined(GEN_TREES_H) || !defined(STDC)\n  extern uch ZLIB_INTERNAL _length_code[];\n  extern uch ZLIB_INTERNAL _dist_code[];\n#else\n  extern const uch ZLIB_INTERNAL _length_code[];\n  extern const uch ZLIB_INTERNAL _dist_code[];\n#endif\n\n# define _tr_tally_lit(s, c, flush) \\\n  { uch cc = (c); \\\n    s->d_buf[s->last_lit] = 0; \\\n    s->l_buf[s->last_lit++] = cc; \\\n    s->dyn_ltree[cc].Freq++; \\\n    flush = (s->last_lit == s->lit_bufsize-1); \\\n   }\n# define _tr_tally_dist(s, distance, length, flush) \\\n  { uch len = (length); \\\n    ush dist = (distance); \\\n    s->d_buf[s->last_lit] = dist; \\\n    s->l_buf[s->last_lit++] = len; \\\n    dist--; \\\n    s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \\\n    s->dyn_dtree[d_code(dist)].Freq++; \\\n    flush = (s->last_lit == s->lit_bufsize-1); \\\n  }\n#else\n# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c)\n# define _tr_tally_dist(s, distance, length, flush) \\\n              flush = _tr_tally(s, distance, length)\n#endif\n\n#endif /* DEFLATE_H */\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_adler32.c",
    "content": "/* adler32.c -- compute the Adler-32 checksum of a data stream\n * Copyright (C) 1995-2011 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* @(#) $Id$ */\n\n#include \"zutil.h\"\n\n#define local static\n\nlocal uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2));\n\n#define BASE 65521      /* largest prime smaller than 65536 */\n#define NMAX 5552\n/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */\n\n#define DO1(buf,i)  {adler += (buf)[i]; sum2 += adler;}\n#define DO2(buf,i)  DO1(buf,i); DO1(buf,i+1);\n#define DO4(buf,i)  DO2(buf,i); DO2(buf,i+2);\n#define DO8(buf,i)  DO4(buf,i); DO4(buf,i+4);\n#define DO16(buf)   DO8(buf,0); DO8(buf,8);\n\n/* use NO_DIVIDE if your processor does not do division in hardware --\n   try it both ways to see which is faster */\n#ifdef NO_DIVIDE\n/* note that this assumes BASE is 65521, where 65536 % 65521 == 15\n   (thank you to John Reiser for pointing this out) */\n#  define CHOP(a) \\\n    do { \\\n        unsigned long tmp = a >> 16; \\\n        a &= 0xffffUL; \\\n        a += (tmp << 4) - tmp; \\\n    } while (0)\n#  define MOD28(a) \\\n    do { \\\n        CHOP(a); \\\n        if (a >= BASE) a -= BASE; \\\n    } while (0)\n#  define MOD(a) \\\n    do { \\\n        CHOP(a); \\\n        MOD28(a); \\\n    } while (0)\n#  define MOD63(a) \\\n    do { /* this assumes a is not negative */ \\\n        z_off64_t tmp = a >> 32; \\\n        a &= 0xffffffffL; \\\n        a += (tmp << 8) - (tmp << 5) + tmp; \\\n        tmp = a >> 16; \\\n        a &= 0xffffL; \\\n        a += (tmp << 4) - tmp; \\\n        tmp = a >> 16; \\\n        a &= 0xffffL; \\\n        a += (tmp << 4) - tmp; \\\n        if (a >= BASE) a -= BASE; \\\n    } while (0)\n#else\n#  define MOD(a) a %= BASE\n#  define MOD28(a) a %= BASE\n#  define MOD63(a) a %= BASE\n#endif\n\n/* ========================================================================= */\nuLong ZEXPORT adler32(\n    uLong adler,\n    const Bytef *buf,\n    uInt len)\n{\n    unsigned long sum2;\n    unsigned n;\n\n    /* split Adler-32 into component sums */\n    sum2 = (adler >> 16) & 0xffff;\n    adler &= 0xffff;\n\n    /* in case user likes doing a byte at a time, keep it fast */\n    if (len == 1) {\n        adler += buf[0];\n        if (adler >= BASE)\n            adler -= BASE;\n        sum2 += adler;\n        if (sum2 >= BASE)\n            sum2 -= BASE;\n        return adler | (sum2 << 16);\n    }\n\n    /* initial Adler-32 value (deferred check for len == 1 speed) */\n    if (buf == Z_NULL)\n        return 1L;\n\n    /* in case short lengths are provided, keep it somewhat fast */\n    if (len < 16) {\n        while (len--) {\n            adler += *buf++;\n            sum2 += adler;\n        }\n        if (adler >= BASE)\n            adler -= BASE;\n        MOD28(sum2);            /* only added so many BASE's */\n        return adler | (sum2 << 16);\n    }\n\n    /* do length NMAX blocks -- requires just one modulo operation */\n    while (len >= NMAX) {\n        len -= NMAX;\n        n = NMAX / 16;          /* NMAX is divisible by 16 */\n        do {\n            DO16(buf);          /* 16 sums unrolled */\n            buf += 16;\n        } while (--n);\n        MOD(adler);\n        MOD(sum2);\n    }\n\n    /* do remaining bytes (less than NMAX, still just one modulo) */\n    if (len) {                  /* avoid modulos if none remaining */\n        while (len >= 16) {\n            len -= 16;\n            DO16(buf);\n            buf += 16;\n        }\n        while (len--) {\n            adler += *buf++;\n            sum2 += adler;\n        }\n        MOD(adler);\n        MOD(sum2);\n    }\n\n    /* return recombined sums */\n    return adler | (sum2 << 16);\n}\n\n/* ========================================================================= */\nlocal uLong adler32_combine_(\n    uLong adler1,\n    uLong adler2,\n    z_off64_t len2)\n{\n    unsigned long sum1;\n    unsigned long sum2;\n    unsigned rem;\n\n    /* for negative len, return invalid adler32 as a clue for debugging */\n    if (len2 < 0)\n        return 0xffffffffUL;\n\n    /* the derivation of this formula is left as an exercise for the reader */\n    MOD63(len2);                /* assumes len2 >= 0 */\n    rem = (unsigned)len2;\n    sum1 = adler1 & 0xffff;\n    sum2 = rem * sum1;\n    MOD(sum2);\n    sum1 += (adler2 & 0xffff) + BASE - 1;\n    sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;\n    if (sum1 >= BASE) sum1 -= BASE;\n    if (sum1 >= BASE) sum1 -= BASE;\n    if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1);\n    if (sum2 >= BASE) sum2 -= BASE;\n    return sum1 | (sum2 << 16);\n}\n\n/* ========================================================================= */\nuLong ZEXPORT adler32_combine(\n    uLong adler1,\n    uLong adler2,\n    z_off_t len2)\n{\n    return adler32_combine_(adler1, adler2, len2);\n}\n\nuLong ZEXPORT adler32_combine64(\n    uLong adler1,\n    uLong adler2,\n    z_off64_t len2)\n{\n    return adler32_combine_(adler1, adler2, len2);\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_compress.c",
    "content": "/* compress.c -- compress a memory buffer\n * Copyright (C) 1995-2005 Jean-loup Gailly.\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* @(#) $Id$ */\n\n#define ZLIB_INTERNAL\n#include \"zlib.h\"\n\n/* ===========================================================================\n     Compresses the source buffer into the destination buffer. The level\n   parameter has the same meaning as in deflateInit.  sourceLen is the byte\n   length of the source buffer. Upon entry, destLen is the total size of the\n   destination buffer, which must be at least 0.1% larger than sourceLen plus\n   12 bytes. Upon exit, destLen is the actual size of the compressed buffer.\n\n     compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough\n   memory, Z_BUF_ERROR if there was not enough room in the output buffer,\n   Z_STREAM_ERROR if the level parameter is invalid.\n*/\nint ZEXPORT compress2 (\n    Bytef *dest,\n    uLongf *destLen,\n    const Bytef *source,\n    uLong sourceLen,\n    int level)\n{\n    z_stream stream;\n    int err;\n\n    stream.next_in = (z_const Bytef *)source;\n    stream.avail_in = (uInt)sourceLen;\n#ifdef MAXSEG_64K\n    /* Check for source > 64K on 16-bit machine: */\n    if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;\n#endif\n    stream.next_out = dest;\n    stream.avail_out = (uInt)*destLen;\n    if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;\n\n    stream.zalloc = (alloc_func)0;\n    stream.zfree = (free_func)0;\n    stream.opaque = (voidpf)0;\n\n    err = deflateInit(&stream, level);\n    if (err != Z_OK) return err;\n\n    err = deflate(&stream, Z_FINISH);\n    if (err != Z_STREAM_END) {\n        deflateEnd(&stream);\n        return err == Z_OK ? Z_BUF_ERROR : err;\n    }\n    *destLen = stream.total_out;\n\n    err = deflateEnd(&stream);\n    return err;\n}\n\n/* ===========================================================================\n */\nint ZEXPORT compress (\n    Bytef *dest,\n    uLongf *destLen,\n    const Bytef *source,\n    uLong sourceLen)\n{\n    return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);\n}\n\n/* ===========================================================================\n     If the default memLevel or windowBits for deflateInit() is changed, then\n   this function needs to be updated.\n */\nuLong ZEXPORT compressBound (\n    uLong sourceLen)\n{\n    return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +\n           (sourceLen >> 25) + 13;\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_crc32.c",
    "content": "/* crc32.c -- compute the CRC-32 of a data stream\n * Copyright (C) 1995-2006, 2010, 2011, 2012 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n *\n * Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster\n * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing\n * tables for updating the shift register in one step with three exclusive-ors\n * instead of four steps with four exclusive-ors.  This results in about a\n * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3.\n */\n\n/* @(#) $Id$ */\n\n/*\n  Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore\n  protection on the static variables used to control the first-use generation\n  of the crc tables.  Therefore, if you #define DYNAMIC_CRC_TABLE, you should\n  first call get_crc_table() to initialize the tables before allowing more than\n  one thread to use crc32().\n\n  DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h.\n */\n\n#ifdef MAKECRCH\n#  include <stdio.h>\n#  ifndef DYNAMIC_CRC_TABLE\n#    define DYNAMIC_CRC_TABLE\n#  endif /* !DYNAMIC_CRC_TABLE */\n#endif /* MAKECRCH */\n\n#include \"zutil.h\"      /* for STDC and FAR definitions */\n\n#define local static\n\n/* Definitions for doing the crc four data bytes at a time. */\n#if !defined(NOBYFOUR) && defined(Z_U4)\n#  define BYFOUR\n#endif\n#ifdef BYFOUR\n   local unsigned long crc32_little OF((unsigned long,\n                        const unsigned char FAR *, unsigned));\n   local unsigned long crc32_big OF((unsigned long,\n                        const unsigned char FAR *, unsigned));\n#  define TBLS 8\n#else\n#  define TBLS 1\n#endif /* BYFOUR */\n\n/* Local functions for crc concatenation */\nlocal unsigned long gf2_matrix_times OF((unsigned long *mat,\n                                         unsigned long vec));\nlocal void gf2_matrix_square OF((unsigned long *square, unsigned long *mat));\nlocal uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2));\n\n\n#ifdef DYNAMIC_CRC_TABLE\n\nlocal volatile int crc_table_empty = 1;\nlocal z_crc_t FAR crc_table[TBLS][256];\nlocal void make_crc_table OF((void));\n#ifdef MAKECRCH\n   local void write_table OF((FILE *, const z_crc_t FAR *));\n#endif /* MAKECRCH */\n/*\n  Generate tables for a byte-wise 32-bit CRC calculation on the polynomial:\n  x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.\n\n  Polynomials over GF(2) are represented in binary, one bit per coefficient,\n  with the lowest powers in the most significant bit.  Then adding polynomials\n  is just exclusive-or, and multiplying a polynomial by x is a right shift by\n  one.  If we call the above polynomial p, and represent a byte as the\n  polynomial q, also with the lowest power in the most significant bit (so the\n  byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,\n  where a mod b means the remainder after dividing a by b.\n\n  This calculation is done using the shift-register method of multiplying and\n  taking the remainder.  The register is initialized to zero, and for each\n  incoming bit, x^32 is added mod p to the register if the bit is a one (where\n  x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by\n  x (which is shifting right by one and adding x^32 mod p if the bit shifted\n  out is a one).  We start with the highest power (least significant bit) of\n  q and repeat for all eight bits of q.\n\n  The first table is simply the CRC of all possible eight bit values.  This is\n  all the information needed to generate CRCs on data a byte at a time for all\n  combinations of CRC register values and incoming bytes.  The remaining tables\n  allow for word-at-a-time CRC calculation for both big-endian and little-\n  endian machines, where a word is four bytes.\n*/\nlocal void make_crc_table()\n{\n    z_crc_t c;\n    int n, k;\n    z_crc_t poly;                       /* polynomial exclusive-or pattern */\n    /* terms of polynomial defining this crc (except x^32): */\n    static volatile int first = 1;      /* flag to limit concurrent making */\n    static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};\n\n    /* See if another task is already doing this (not thread-safe, but better\n       than nothing -- significantly reduces duration of vulnerability in\n       case the advice about DYNAMIC_CRC_TABLE is ignored) */\n    if (first) {\n        first = 0;\n\n        /* make exclusive-or pattern from polynomial (0xedb88320UL) */\n        poly = 0;\n        for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++)\n            poly |= (z_crc_t)1 << (31 - p[n]);\n\n        /* generate a crc for every 8-bit value */\n        for (n = 0; n < 256; n++) {\n            c = (z_crc_t)n;\n            for (k = 0; k < 8; k++)\n                c = c & 1 ? poly ^ (c >> 1) : c >> 1;\n            crc_table[0][n] = c;\n        }\n\n#ifdef BYFOUR\n        /* generate crc for each value followed by one, two, and three zeros,\n           and then the byte reversal of those as well as the first table */\n        for (n = 0; n < 256; n++) {\n            c = crc_table[0][n];\n            crc_table[4][n] = ZSWAP32(c);\n            for (k = 1; k < 4; k++) {\n                c = crc_table[0][c & 0xff] ^ (c >> 8);\n                crc_table[k][n] = c;\n                crc_table[k + 4][n] = ZSWAP32(c);\n            }\n        }\n#endif /* BYFOUR */\n\n        crc_table_empty = 0;\n    }\n    else {      /* not first */\n        /* wait for the other guy to finish (not efficient, but rare) */\n        while (crc_table_empty)\n            ;\n    }\n\n#ifdef MAKECRCH\n    /* write out CRC tables to crc32.h */\n    {\n        FILE *out;\n\n        out = fopen(\"crc32.h\", \"w\");\n        if (out == NULL) return;\n        fprintf(out, \"/* crc32.h -- tables for rapid CRC calculation\\n\");\n        fprintf(out, \" * Generated automatically by crc32.c\\n */\\n\\n\");\n        fprintf(out, \"local const z_crc_t FAR \");\n        fprintf(out, \"crc_table[TBLS][256] =\\n{\\n  {\\n\");\n        write_table(out, crc_table[0]);\n#  ifdef BYFOUR\n        fprintf(out, \"#ifdef BYFOUR\\n\");\n        for (k = 1; k < 8; k++) {\n            fprintf(out, \"  },\\n  {\\n\");\n            write_table(out, crc_table[k]);\n        }\n        fprintf(out, \"#endif\\n\");\n#  endif /* BYFOUR */\n        fprintf(out, \"  }\\n};\\n\");\n        fclose(out);\n    }\n#endif /* MAKECRCH */\n}\n\n#ifdef MAKECRCH\nlocal void write_table(\n    FILE *out,\n    const z_crc_t FAR *table)\n{\n    int n;\n\n    for (n = 0; n < 256; n++)\n        fprintf(out, \"%s0x%08lxUL%s\", n % 5 ? \"\" : \"    \",\n                (unsigned long)(table[n]),\n                n == 255 ? \"\\n\" : (n % 5 == 4 ? \",\\n\" : \", \"));\n}\n#endif /* MAKECRCH */\n\n#else /* !DYNAMIC_CRC_TABLE */\n/* ========================================================================\n * Tables of CRC-32s of all single-byte values, made by make_crc_table().\n */\n#include \"crc32.h\"\n#endif /* DYNAMIC_CRC_TABLE */\n\n/* =========================================================================\n * This function can be used by asm versions of crc32()\n */\nconst z_crc_t FAR * ZEXPORT get_crc_table()\n{\n#ifdef DYNAMIC_CRC_TABLE\n    if (crc_table_empty)\n        make_crc_table();\n#endif /* DYNAMIC_CRC_TABLE */\n    return (const z_crc_t FAR *)crc_table;\n}\n\n/* ========================================================================= */\n#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8)\n#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1\n\n/* ========================================================================= */\nunsigned long ZEXPORT crc32(\n    unsigned long crc,\n    const unsigned char FAR *buf,\n    uInt len)\n{\n    if (buf == Z_NULL) return 0UL;\n\n#ifdef DYNAMIC_CRC_TABLE\n    if (crc_table_empty)\n        make_crc_table();\n#endif /* DYNAMIC_CRC_TABLE */\n\n#ifdef BYFOUR\n    if (sizeof(void *) == sizeof(ptrdiff_t)) {\n        z_crc_t endian;\n\n        endian = 1;\n        if (*((unsigned char *)(&endian)))\n            return crc32_little(crc, buf, len);\n        else\n            return crc32_big(crc, buf, len);\n    }\n#endif /* BYFOUR */\n    crc = crc ^ 0xffffffffUL;\n    while (len >= 8) {\n        DO8;\n        len -= 8;\n    }\n    if (len) do {\n        DO1;\n    } while (--len);\n    return crc ^ 0xffffffffUL;\n}\n\n#ifdef BYFOUR\n\n/* ========================================================================= */\n#define DOLIT4 c ^= *buf4++; \\\n        c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \\\n            crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24]\n#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4\n\n/* ========================================================================= */\nlocal unsigned long crc32_little(\n    unsigned long crc,\n    const unsigned char FAR *buf,\n    unsigned len)\n{\n    register z_crc_t c;\n    register const z_crc_t FAR *buf4;\n\n    c = (z_crc_t)crc;\n    c = ~c;\n    while (len && ((ptrdiff_t)buf & 3)) {\n        c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);\n        len--;\n    }\n\n    buf4 = (const z_crc_t FAR *)(const void FAR *)buf;\n    while (len >= 32) {\n        DOLIT32;\n        len -= 32;\n    }\n    while (len >= 4) {\n        DOLIT4;\n        len -= 4;\n    }\n    buf = (const unsigned char FAR *)buf4;\n\n    if (len) do {\n        c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);\n    } while (--len);\n    c = ~c;\n    return (unsigned long)c;\n}\n\n/* ========================================================================= */\n#define DOBIG4 c ^= *++buf4; \\\n        c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \\\n            crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24]\n#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4\n\n/* ========================================================================= */\nlocal unsigned long crc32_big(\n    unsigned long crc,\n    const unsigned char FAR *buf,\n    unsigned len)\n{\n    register z_crc_t c;\n    register const z_crc_t FAR *buf4;\n\n    c = ZSWAP32((z_crc_t)crc);\n    c = ~c;\n    while (len && ((ptrdiff_t)buf & 3)) {\n        c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);\n        len--;\n    }\n\n    buf4 = (const z_crc_t FAR *)(const void FAR *)buf;\n    buf4--;\n    while (len >= 32) {\n        DOBIG32;\n        len -= 32;\n    }\n    while (len >= 4) {\n        DOBIG4;\n        len -= 4;\n    }\n    buf4++;\n    buf = (const unsigned char FAR *)buf4;\n\n    if (len) do {\n        c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);\n    } while (--len);\n    c = ~c;\n    return (unsigned long)(ZSWAP32(c));\n}\n\n#endif /* BYFOUR */\n\n#define GF2_DIM 32      /* dimension of GF(2) vectors (length of CRC) */\n\n/* ========================================================================= */\nlocal unsigned long gf2_matrix_times(\n    unsigned long *mat,\n    unsigned long vec)\n{\n    unsigned long sum;\n\n    sum = 0;\n    while (vec) {\n        if (vec & 1)\n            sum ^= *mat;\n        vec >>= 1;\n        mat++;\n    }\n    return sum;\n}\n\n/* ========================================================================= */\nlocal void gf2_matrix_square(\n    unsigned long *square,\n    unsigned long *mat)\n{\n    int n;\n\n    for (n = 0; n < GF2_DIM; n++)\n        square[n] = gf2_matrix_times(mat, mat[n]);\n}\n\n/* ========================================================================= */\nlocal uLong crc32_combine_(\n    uLong crc1,\n    uLong crc2,\n    z_off64_t len2)\n{\n    int n;\n    unsigned long row;\n    unsigned long even[GF2_DIM];    /* even-power-of-two zeros operator */\n    unsigned long odd[GF2_DIM];     /* odd-power-of-two zeros operator */\n\n    /* degenerate case (also disallow negative lengths) */\n    if (len2 <= 0)\n        return crc1;\n\n    /* put operator for one zero bit in odd */\n    odd[0] = 0xedb88320UL;          /* CRC-32 polynomial */\n    row = 1;\n    for (n = 1; n < GF2_DIM; n++) {\n        odd[n] = row;\n        row <<= 1;\n    }\n\n    /* put operator for two zero bits in even */\n    gf2_matrix_square(even, odd);\n\n    /* put operator for four zero bits in odd */\n    gf2_matrix_square(odd, even);\n\n    /* apply len2 zeros to crc1 (first square will put the operator for one\n       zero byte, eight zero bits, in even) */\n    do {\n        /* apply zeros operator for this bit of len2 */\n        gf2_matrix_square(even, odd);\n        if (len2 & 1)\n            crc1 = gf2_matrix_times(even, crc1);\n        len2 >>= 1;\n\n        /* if no more bits set, then done */\n        if (len2 == 0)\n            break;\n\n        /* another iteration of the loop with odd and even swapped */\n        gf2_matrix_square(odd, even);\n        if (len2 & 1)\n            crc1 = gf2_matrix_times(odd, crc1);\n        len2 >>= 1;\n\n        /* if no more bits set, then done */\n    } while (len2 != 0);\n\n    /* return combined crc */\n    crc1 ^= crc2;\n    return crc1;\n}\n\n/* ========================================================================= */\nuLong ZEXPORT crc32_combine(\n    uLong crc1,\n    uLong crc2,\n    z_off_t len2)\n{\n    return crc32_combine_(crc1, crc2, len2);\n}\n\nuLong ZEXPORT crc32_combine64(\n    uLong crc1,\n    uLong crc2,\n    z_off64_t len2)\n{\n    return crc32_combine_(crc1, crc2, len2);\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_deflate.c",
    "content": "/* deflate.c -- compress data using the deflation algorithm\n * Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/*\n *  ALGORITHM\n *\n *      The \"deflation\" process depends on being able to identify portions\n *      of the input text which are identical to earlier input (within a\n *      sliding window trailing behind the input currently being processed).\n *\n *      The most straightforward technique turns out to be the fastest for\n *      most input files: try all possible matches and select the longest.\n *      The key feature of this algorithm is that insertions into the string\n *      dictionary are very simple and thus fast, and deletions are avoided\n *      completely. Insertions are performed at each input character, whereas\n *      string matches are performed only when the previous match ends. So it\n *      is preferable to spend more time in matches to allow very fast string\n *      insertions and avoid deletions. The matching algorithm for small\n *      strings is inspired from that of Rabin & Karp. A brute force approach\n *      is used to find longer strings when a small match has been found.\n *      A similar algorithm is used in comic (by Jan-Mark Wams) and freeze\n *      (by Leonid Broukhis).\n *         A previous version of this file used a more sophisticated algorithm\n *      (by Fiala and Greene) which is guaranteed to run in linear amortized\n *      time, but has a larger average cost, uses more memory and is patented.\n *      However the F&G algorithm may be faster for some highly redundant\n *      files if the parameter max_chain_length (described below) is too large.\n *\n *  ACKNOWLEDGEMENTS\n *\n *      The idea of lazy evaluation of matches is due to Jan-Mark Wams, and\n *      I found it in 'freeze' written by Leonid Broukhis.\n *      Thanks to many people for bug reports and testing.\n *\n *  REFERENCES\n *\n *      Deutsch, L.P.,\"DEFLATE Compressed Data Format Specification\".\n *      Available in http://tools.ietf.org/html/rfc1951\n *\n *      A description of the Rabin and Karp algorithm is given in the book\n *         \"Algorithms\" by R. Sedgewick, Addison-Wesley, p252.\n *\n *      Fiala,E.R., and Greene,D.H.\n *         Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595\n *\n */\n\n/* @(#) $Id$ */\n\n#include \"deflate.h\"\n\nconst char deflate_copyright[] =\n   \" deflate 1.2.8 Copyright 1995-2013 Jean-loup Gailly and Mark Adler \";\n/*\n  If you use the zlib library in a product, an acknowledgment is welcome\n  in the documentation of your product. If for some reason you cannot\n  include such an acknowledgment, I would appreciate that you keep this\n  copyright string in the executable of your product.\n */\n\n/* ===========================================================================\n *  Function prototypes.\n */\ntypedef enum {\n    need_more,      /* block not completed, need more input or more output */\n    block_done,     /* block flush performed */\n    finish_started, /* finish started, need only more output at next deflate */\n    finish_done     /* finish done, accept no more input or output */\n} block_state;\n\ntypedef block_state (*compress_func) OF((deflate_state *s, int flush));\n/* Compression function. Returns the block state after the call. */\n\nlocal void fill_window    OF((deflate_state *s));\nlocal block_state deflate_stored OF((deflate_state *s, int flush));\nlocal block_state deflate_fast   OF((deflate_state *s, int flush));\n#ifndef FASTEST\nlocal block_state deflate_slow   OF((deflate_state *s, int flush));\n#endif\nlocal block_state deflate_rle    OF((deflate_state *s, int flush));\nlocal block_state deflate_huff   OF((deflate_state *s, int flush));\nlocal void lm_init        OF((deflate_state *s));\nlocal void putShortMSB    OF((deflate_state *s, uInt b));\nlocal void flush_pending  OF((z_streamp strm));\nlocal int read_buf        OF((z_streamp strm, Bytef *buf, unsigned size));\n#ifdef ASMV\n      void match_init OF((void)); /* asm code initialization */\n      uInt longest_match  OF((deflate_state *s, IPos cur_match));\n#else\nlocal uInt longest_match  OF((deflate_state *s, IPos cur_match));\n#endif\n\n#ifdef DEBUG\nlocal  void check_match OF((deflate_state *s, IPos start, IPos match,\n                            int length));\n#endif\n\n/* ===========================================================================\n * Local data\n */\n\n#define NIL 0\n/* Tail of hash chains */\n\n#ifndef TOO_FAR\n#  define TOO_FAR 4096\n#endif\n/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\ntypedef struct config_s {\n   ush good_length; /* reduce lazy search above this match length */\n   ush max_lazy;    /* do not perform lazy search above this match length */\n   ush nice_length; /* quit search above this match length */\n   ush max_chain;\n   compress_func func;\n} config;\n\n#ifdef FASTEST\nlocal const config configuration_table[2] = {\n/*      good lazy nice chain */\n/* 0 */ {0,    0,  0,    0, deflate_stored},  /* store only */\n/* 1 */ {4,    4,  8,    4, deflate_fast}}; /* max speed, no lazy matches */\n#else\nlocal const config configuration_table[10] = {\n/*      good lazy nice chain */\n/* 0 */ {0,    0,  0,    0, deflate_stored},  /* store only */\n/* 1 */ {4,    4,  8,    4, deflate_fast}, /* max speed, no lazy matches */\n/* 2 */ {4,    5, 16,    8, deflate_fast},\n/* 3 */ {4,    6, 32,   32, deflate_fast},\n\n/* 4 */ {4,    4, 16,   16, deflate_slow},  /* lazy matches */\n/* 5 */ {8,   16, 32,   32, deflate_slow},\n/* 6 */ {8,   16, 128, 128, deflate_slow},\n/* 7 */ {8,   32, 128, 256, deflate_slow},\n/* 8 */ {32, 128, 258, 1024, deflate_slow},\n/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */\n#endif\n\n/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4\n * For deflate_fast() (levels <= 3) good is ignored and lazy has a different\n * meaning.\n */\n\n#define EQUAL 0\n/* result of memcmp for equal strings */\n\n#ifndef NO_DUMMY_DECL\nstruct static_tree_desc_s {int dummy;}; /* for buggy compilers */\n#endif\n\n/* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */\n#define RANK(f) (((f) << 1) - ((f) > 4 ? 9 : 0))\n\n/* ===========================================================================\n * Update a hash value with the given input byte\n * IN  assertion: all calls to to UPDATE_HASH are made with consecutive\n *    input characters, so that a running hash key can be computed from the\n *    previous key instead of complete recalculation each time.\n */\n#define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask)\n\n\n/* ===========================================================================\n * Insert string str in the dictionary and set match_head to the previous head\n * of the hash chain (the most recent string with same hash key). Return\n * the previous length of the hash chain.\n * If this file is compiled with -DFASTEST, the compression level is forced\n * to 1, and no hash chains are maintained.\n * IN  assertion: all calls to to INSERT_STRING are made with consecutive\n *    input characters and the first MIN_MATCH bytes of str are valid\n *    (except for the last MIN_MATCH-1 bytes of the input file).\n */\n#ifdef FASTEST\n#define INSERT_STRING(s, str, match_head) \\\n   (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \\\n    match_head = s->head[s->ins_h], \\\n    s->head[s->ins_h] = (Pos)(str))\n#else\n#define INSERT_STRING(s, str, match_head) \\\n   (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \\\n    match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \\\n    s->head[s->ins_h] = (Pos)(str))\n#endif\n\n/* ===========================================================================\n * Initialize the hash table (avoiding 64K overflow for 16 bit systems).\n * prev[] will be initialized on the fly.\n */\n#define CLEAR_HASH(s) \\\n    s->head[s->hash_size-1] = NIL; \\\n    zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head));\n\n/* ========================================================================= */\nint ZEXPORT deflateInit_(\n    z_streamp strm,\n    int level,\n    const char *version,\n    int stream_size)\n{\n    return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL,\n                         Z_DEFAULT_STRATEGY, version, stream_size);\n    /* To do: ignore strm->next_in if we use it as window */\n}\n\n/* ========================================================================= */\nint ZEXPORT deflateInit2_(\n    z_streamp strm,\n    int  level,\n    int  method,\n    int  windowBits,\n    int  memLevel,\n    int  strategy,\n    const char *version,\n    int stream_size)\n{\n    deflate_state *s;\n    int wrap = 1;\n    static const char my_version[] = ZLIB_VERSION;\n\n    ushf *overlay;\n    /* We overlay pending_buf and d_buf+l_buf. This works since the average\n     * output size for (length,distance) codes is <= 24 bits.\n     */\n\n    if (version == Z_NULL || version[0] != my_version[0] ||\n        stream_size != sizeof(z_stream)) {\n        return Z_VERSION_ERROR;\n    }\n    if (strm == Z_NULL) return Z_STREAM_ERROR;\n\n    strm->msg = Z_NULL;\n    if (strm->zalloc == (alloc_func)0) {\n#ifdef Z_SOLO\n        return Z_STREAM_ERROR;\n#else\n        strm->zalloc = zcalloc;\n        strm->opaque = (voidpf)0;\n#endif\n    }\n    if (strm->zfree == (free_func)0)\n#ifdef Z_SOLO\n        return Z_STREAM_ERROR;\n#else\n        strm->zfree = zcfree;\n#endif\n\n#ifdef FASTEST\n    if (level != 0) level = 1;\n#else\n    if (level == Z_DEFAULT_COMPRESSION) level = 6;\n#endif\n\n    if (windowBits < 0) { /* suppress zlib wrapper */\n        wrap = 0;\n        windowBits = -windowBits;\n    }\n#ifdef GZIP\n    else if (windowBits > 15) {\n        wrap = 2;       /* write gzip wrapper instead */\n        windowBits -= 16;\n    }\n#endif\n    if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED ||\n        windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\n        strategy < 0 || strategy > Z_FIXED) {\n        return Z_STREAM_ERROR;\n    }\n    if (windowBits == 8) windowBits = 9;  /* until 256-byte window bug fixed */\n    s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state));\n    if (s == Z_NULL) return Z_MEM_ERROR;\n    strm->state = (struct internal_state FAR *)s;\n    s->strm = strm;\n\n    s->wrap = wrap;\n    s->gzhead = Z_NULL;\n    s->w_bits = windowBits;\n    s->w_size = 1 << s->w_bits;\n    s->w_mask = s->w_size - 1;\n\n    s->hash_bits = memLevel + 7;\n    s->hash_size = 1 << s->hash_bits;\n    s->hash_mask = s->hash_size - 1;\n    s->hash_shift =  ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH);\n\n    s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte));\n    s->prev   = (Posf *)  ZALLOC(strm, s->w_size, sizeof(Pos));\n    s->head   = (Posf *)  ZALLOC(strm, s->hash_size, sizeof(Pos));\n\n    s->high_water = 0;      /* nothing written to s->window yet */\n\n    s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\n\n    overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);\n    s->pending_buf = (uchf *) overlay;\n    s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L);\n\n    if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||\n        s->pending_buf == Z_NULL) {\n        s->status = FINISH_STATE;\n        strm->msg = ERR_MSG(Z_MEM_ERROR);\n        deflateEnd (strm);\n        return Z_MEM_ERROR;\n    }\n    s->d_buf = overlay + s->lit_bufsize/sizeof(ush);\n    s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;\n\n    s->level = level;\n    s->strategy = strategy;\n    s->method = (Byte)method;\n\n    return deflateReset(strm);\n}\n\n/* ========================================================================= */\nint ZEXPORT deflateSetDictionary (\n    z_streamp strm,\n    const Bytef *dictionary,\n    uInt  dictLength)\n{\n    deflate_state *s;\n    uInt str, n;\n    int wrap;\n    unsigned avail;\n    z_const unsigned char *next;\n\n    if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL)\n        return Z_STREAM_ERROR;\n    s = strm->state;\n    wrap = s->wrap;\n    if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead)\n        return Z_STREAM_ERROR;\n\n    /* when using zlib wrappers, compute Adler-32 for provided dictionary */\n    if (wrap == 1)\n        strm->adler = adler32(strm->adler, dictionary, dictLength);\n    s->wrap = 0;                    /* avoid computing Adler-32 in read_buf */\n\n    /* if dictionary would fill window, just replace the history */\n    if (dictLength >= s->w_size) {\n        if (wrap == 0) {            /* already empty otherwise */\n            CLEAR_HASH(s);\n            s->strstart = 0;\n            s->block_start = 0L;\n            s->insert = 0;\n        }\n        dictionary += dictLength - s->w_size;  /* use the tail */\n        dictLength = s->w_size;\n    }\n\n    /* insert dictionary into window and hash */\n    avail = strm->avail_in;\n    next = strm->next_in;\n    strm->avail_in = dictLength;\n    strm->next_in = (z_const Bytef *)dictionary;\n    fill_window(s);\n    while (s->lookahead >= MIN_MATCH) {\n        str = s->strstart;\n        n = s->lookahead - (MIN_MATCH-1);\n        do {\n            UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);\n#ifndef FASTEST\n            s->prev[str & s->w_mask] = s->head[s->ins_h];\n#endif\n            s->head[s->ins_h] = (Pos)str;\n            str++;\n        } while (--n);\n        s->strstart = str;\n        s->lookahead = MIN_MATCH-1;\n        fill_window(s);\n    }\n    s->strstart += s->lookahead;\n    s->block_start = (long)s->strstart;\n    s->insert = s->lookahead;\n    s->lookahead = 0;\n    s->match_length = s->prev_length = MIN_MATCH-1;\n    s->match_available = 0;\n    strm->next_in = next;\n    strm->avail_in = avail;\n    s->wrap = wrap;\n    return Z_OK;\n}\n\n/* ========================================================================= */\nint ZEXPORT deflateResetKeep (\n    z_streamp strm)\n{\n    deflate_state *s;\n\n    if (strm == Z_NULL || strm->state == Z_NULL ||\n        strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) {\n        return Z_STREAM_ERROR;\n    }\n\n    strm->total_in = strm->total_out = 0;\n    strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */\n    strm->data_type = Z_UNKNOWN;\n\n    s = (deflate_state *)strm->state;\n    s->pending = 0;\n    s->pending_out = s->pending_buf;\n\n    if (s->wrap < 0) {\n        s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */\n    }\n    s->status = s->wrap ? INIT_STATE : BUSY_STATE;\n    strm->adler =\n#ifdef GZIP\n        s->wrap == 2 ? crc32(0L, Z_NULL, 0) :\n#endif\n        adler32(0L, Z_NULL, 0);\n    s->last_flush = Z_NO_FLUSH;\n\n    _tr_init(s);\n\n    return Z_OK;\n}\n\n/* ========================================================================= */\nint ZEXPORT deflateReset (\n    z_streamp strm)\n{\n    int ret;\n\n    ret = deflateResetKeep(strm);\n    if (ret == Z_OK)\n        lm_init(strm->state);\n    return ret;\n}\n\n/* ========================================================================= */\nint ZEXPORT deflateSetHeader (strm, head)\n    z_streamp strm;\n    gz_headerp head;\n{\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n    if (strm->state->wrap != 2) return Z_STREAM_ERROR;\n    strm->state->gzhead = head;\n    return Z_OK;\n}\n\n/* ========================================================================= */\nint ZEXPORT deflatePending (\n\tz_streamp strm,\n    unsigned *pending,\n    int *bits)\n{\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n    if (pending != Z_NULL)\n        *pending = strm->state->pending;\n    if (bits != Z_NULL)\n        *bits = strm->state->bi_valid;\n    return Z_OK;\n}\n\n/* ========================================================================= */\nint ZEXPORT deflatePrime (strm, bits, value)\n    z_streamp strm;\n    int bits;\n    int value;\n{\n    deflate_state *s;\n    int put;\n\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n    s = strm->state;\n    if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3))\n        return Z_BUF_ERROR;\n    do {\n        put = Buf_size - s->bi_valid;\n        if (put > bits)\n            put = bits;\n        s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid);\n        s->bi_valid += put;\n        _tr_flush_bits(s);\n        value >>= put;\n        bits -= put;\n    } while (bits);\n    return Z_OK;\n}\n\n/* ========================================================================= */\nint ZEXPORT deflateParams(\n    z_streamp strm,\n    int level,\n    int strategy)\n{\n    deflate_state *s;\n    compress_func func;\n    int err = Z_OK;\n\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n    s = strm->state;\n\n#ifdef FASTEST\n    if (level != 0) level = 1;\n#else\n    if (level == Z_DEFAULT_COMPRESSION) level = 6;\n#endif\n    if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) {\n        return Z_STREAM_ERROR;\n    }\n    func = configuration_table[s->level].func;\n\n    if ((strategy != s->strategy || func != configuration_table[level].func) &&\n        strm->total_in != 0) {\n        /* Flush the last buffer: */\n        err = deflate(strm, Z_BLOCK);\n        if (err == Z_BUF_ERROR && s->pending == 0)\n            err = Z_OK;\n    }\n    if (s->level != level) {\n        s->level = level;\n        s->max_lazy_match   = configuration_table[level].max_lazy;\n        s->good_match       = configuration_table[level].good_length;\n        s->nice_match       = configuration_table[level].nice_length;\n        s->max_chain_length = configuration_table[level].max_chain;\n    }\n    s->strategy = strategy;\n    return err;\n}\n\n/* ========================================================================= */\nint ZEXPORT deflateTune(\n    z_streamp strm,\n    int good_length,\n    int max_lazy,\n    int nice_length,\n    int max_chain)\n{\n    deflate_state *s;\n\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n    s = strm->state;\n    s->good_match = good_length;\n    s->max_lazy_match = max_lazy;\n    s->nice_match = nice_length;\n    s->max_chain_length = max_chain;\n    return Z_OK;\n}\n\n/* =========================================================================\n * For the default windowBits of 15 and memLevel of 8, this function returns\n * a close to exact, as well as small, upper bound on the compressed size.\n * They are coded as constants here for a reason--if the #define's are\n * changed, then this function needs to be changed as well.  The return\n * value for 15 and 8 only works for those exact settings.\n *\n * For any setting other than those defaults for windowBits and memLevel,\n * the value returned is a conservative worst case for the maximum expansion\n * resulting from using fixed blocks instead of stored blocks, which deflate\n * can emit on compressed data for some combinations of the parameters.\n *\n * This function could be more sophisticated to provide closer upper bounds for\n * every combination of windowBits and memLevel.  But even the conservative\n * upper bound of about 14% expansion does not seem onerous for output buffer\n * allocation.\n */\nuLong ZEXPORT deflateBound(\n    z_streamp strm,\n    uLong sourceLen)\n{\n    deflate_state *s;\n    uLong complen, wraplen;\n    Bytef *str;\n\n    /* conservative upper bound for compressed data */\n    complen = sourceLen +\n              ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;\n\n    /* if can't get parameters, return conservative bound plus zlib wrapper */\n    if (strm == Z_NULL || strm->state == Z_NULL)\n        return complen + 6;\n\n    /* compute wrapper length */\n    s = strm->state;\n    switch (s->wrap) {\n    case 0:                                 /* raw deflate */\n        wraplen = 0;\n        break;\n    case 1:                                 /* zlib wrapper */\n        wraplen = 6 + (s->strstart ? 4 : 0);\n        break;\n    case 2:                                 /* gzip wrapper */\n        wraplen = 18;\n        if (s->gzhead != Z_NULL) {          /* user-supplied gzip header */\n            if (s->gzhead->extra != Z_NULL)\n                wraplen += 2 + s->gzhead->extra_len;\n            str = s->gzhead->name;\n            if (str != Z_NULL)\n                do {\n                    wraplen++;\n                } while (*str++);\n            str = s->gzhead->comment;\n            if (str != Z_NULL)\n                do {\n                    wraplen++;\n                } while (*str++);\n            if (s->gzhead->hcrc)\n                wraplen += 2;\n        }\n        break;\n    default:                                /* for compiler happiness */\n        wraplen = 6;\n    }\n\n    /* if not default parameters, return conservative bound */\n    if (s->w_bits != 15 || s->hash_bits != 8 + 7)\n        return complen + wraplen;\n\n    /* default settings: return tight bound for that case */\n    return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +\n           (sourceLen >> 25) + 13 - 6 + wraplen;\n}\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nlocal void putShortMSB (\n    deflate_state *s,\n    uInt b)\n{\n    put_byte(s, (Byte)(b >> 8));\n    put_byte(s, (Byte)(b & 0xff));\n}\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output goes\n * through this function so some applications may wish to modify it\n * to avoid allocating a large strm->next_out buffer and copying into it.\n * (See also read_buf()).\n */\nlocal void flush_pending(\n    z_streamp strm)\n{\n    unsigned len;\n    deflate_state *s = strm->state;\n\n    _tr_flush_bits(s);\n    len = s->pending;\n    if (len > strm->avail_out) len = strm->avail_out;\n    if (len == 0) return;\n\n    zmemcpy(strm->next_out, s->pending_out, len);\n    strm->next_out  += len;\n    s->pending_out  += len;\n    strm->total_out += len;\n    strm->avail_out  -= len;\n    s->pending -= len;\n    if (s->pending == 0) {\n        s->pending_out = s->pending_buf;\n    }\n}\n\n/* ========================================================================= */\nint ZEXPORT deflate (\n    z_streamp strm,\n    int flush)\n{\n    int old_flush; /* value of flush param for previous deflate call */\n    deflate_state *s;\n\n    if (strm == Z_NULL || strm->state == Z_NULL ||\n        flush > Z_BLOCK || flush < 0) {\n        return Z_STREAM_ERROR;\n    }\n    s = strm->state;\n\n    if (strm->next_out == Z_NULL ||\n        (strm->next_in == Z_NULL && strm->avail_in != 0) ||\n        (s->status == FINISH_STATE && flush != Z_FINISH)) {\n        ERR_RETURN(strm, Z_STREAM_ERROR);\n    }\n    if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR);\n\n    s->strm = strm; /* just in case */\n    old_flush = s->last_flush;\n    s->last_flush = flush;\n\n    /* Write the header */\n    if (s->status == INIT_STATE) {\n#ifdef GZIP\n        if (s->wrap == 2) {\n            strm->adler = crc32(0L, Z_NULL, 0);\n            put_byte(s, 31);\n            put_byte(s, 139);\n            put_byte(s, 8);\n            if (s->gzhead == Z_NULL) {\n                put_byte(s, 0);\n                put_byte(s, 0);\n                put_byte(s, 0);\n                put_byte(s, 0);\n                put_byte(s, 0);\n                put_byte(s, s->level == 9 ? 2 :\n                            (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?\n                             4 : 0));\n                put_byte(s, OS_CODE);\n                s->status = BUSY_STATE;\n            }\n            else {\n                put_byte(s, (s->gzhead->text ? 1 : 0) +\n                            (s->gzhead->hcrc ? 2 : 0) +\n                            (s->gzhead->extra == Z_NULL ? 0 : 4) +\n                            (s->gzhead->name == Z_NULL ? 0 : 8) +\n                            (s->gzhead->comment == Z_NULL ? 0 : 16)\n                        );\n                put_byte(s, (Byte)(s->gzhead->time & 0xff));\n                put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff));\n                put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff));\n                put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff));\n                put_byte(s, s->level == 9 ? 2 :\n                            (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?\n                             4 : 0));\n                put_byte(s, s->gzhead->os & 0xff);\n                if (s->gzhead->extra != Z_NULL) {\n                    put_byte(s, s->gzhead->extra_len & 0xff);\n                    put_byte(s, (s->gzhead->extra_len >> 8) & 0xff);\n                }\n                if (s->gzhead->hcrc)\n                    strm->adler = crc32(strm->adler, s->pending_buf,\n                                        s->pending);\n                s->gzindex = 0;\n                s->status = EXTRA_STATE;\n            }\n        }\n        else\n#endif\n        {\n            uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8;\n            uInt level_flags;\n\n            if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2)\n                level_flags = 0;\n            else if (s->level < 6)\n                level_flags = 1;\n            else if (s->level == 6)\n                level_flags = 2;\n            else\n                level_flags = 3;\n            header |= (level_flags << 6);\n            if (s->strstart != 0) header |= PRESET_DICT;\n            header += 31 - (header % 31);\n\n            s->status = BUSY_STATE;\n            putShortMSB(s, header);\n\n            /* Save the adler32 of the preset dictionary: */\n            if (s->strstart != 0) {\n                putShortMSB(s, (uInt)(strm->adler >> 16));\n                putShortMSB(s, (uInt)(strm->adler & 0xffff));\n            }\n            strm->adler = adler32(0L, Z_NULL, 0);\n        }\n    }\n#ifdef GZIP\n    if (s->status == EXTRA_STATE) {\n        if (s->gzhead->extra != Z_NULL) {\n            uInt beg = s->pending;  /* start of bytes to update crc */\n\n            while (s->gzindex < (s->gzhead->extra_len & 0xffff)) {\n                if (s->pending == s->pending_buf_size) {\n                    if (s->gzhead->hcrc && s->pending > beg)\n                        strm->adler = crc32(strm->adler, s->pending_buf + beg,\n                                            s->pending - beg);\n                    flush_pending(strm);\n                    beg = s->pending;\n                    if (s->pending == s->pending_buf_size)\n                        break;\n                }\n                put_byte(s, s->gzhead->extra[s->gzindex]);\n                s->gzindex++;\n            }\n            if (s->gzhead->hcrc && s->pending > beg)\n                strm->adler = crc32(strm->adler, s->pending_buf + beg,\n                                    s->pending - beg);\n            if (s->gzindex == s->gzhead->extra_len) {\n                s->gzindex = 0;\n                s->status = NAME_STATE;\n            }\n        }\n        else\n            s->status = NAME_STATE;\n    }\n    if (s->status == NAME_STATE) {\n        if (s->gzhead->name != Z_NULL) {\n            uInt beg = s->pending;  /* start of bytes to update crc */\n            int val;\n\n            do {\n                if (s->pending == s->pending_buf_size) {\n                    if (s->gzhead->hcrc && s->pending > beg)\n                        strm->adler = crc32(strm->adler, s->pending_buf + beg,\n                                            s->pending - beg);\n                    flush_pending(strm);\n                    beg = s->pending;\n                    if (s->pending == s->pending_buf_size) {\n                        val = 1;\n                        break;\n                    }\n                }\n                val = s->gzhead->name[s->gzindex++];\n                put_byte(s, val);\n            } while (val != 0);\n            if (s->gzhead->hcrc && s->pending > beg)\n                strm->adler = crc32(strm->adler, s->pending_buf + beg,\n                                    s->pending - beg);\n            if (val == 0) {\n                s->gzindex = 0;\n                s->status = COMMENT_STATE;\n            }\n        }\n        else\n            s->status = COMMENT_STATE;\n    }\n    if (s->status == COMMENT_STATE) {\n        if (s->gzhead->comment != Z_NULL) {\n            uInt beg = s->pending;  /* start of bytes to update crc */\n            int val;\n\n            do {\n                if (s->pending == s->pending_buf_size) {\n                    if (s->gzhead->hcrc && s->pending > beg)\n                        strm->adler = crc32(strm->adler, s->pending_buf + beg,\n                                            s->pending - beg);\n                    flush_pending(strm);\n                    beg = s->pending;\n                    if (s->pending == s->pending_buf_size) {\n                        val = 1;\n                        break;\n                    }\n                }\n                val = s->gzhead->comment[s->gzindex++];\n                put_byte(s, val);\n            } while (val != 0);\n            if (s->gzhead->hcrc && s->pending > beg)\n                strm->adler = crc32(strm->adler, s->pending_buf + beg,\n                                    s->pending - beg);\n            if (val == 0)\n                s->status = HCRC_STATE;\n        }\n        else\n            s->status = HCRC_STATE;\n    }\n    if (s->status == HCRC_STATE) {\n        if (s->gzhead->hcrc) {\n            if (s->pending + 2 > s->pending_buf_size)\n                flush_pending(strm);\n            if (s->pending + 2 <= s->pending_buf_size) {\n                put_byte(s, (Byte)(strm->adler & 0xff));\n                put_byte(s, (Byte)((strm->adler >> 8) & 0xff));\n                strm->adler = crc32(0L, Z_NULL, 0);\n                s->status = BUSY_STATE;\n            }\n        }\n        else\n            s->status = BUSY_STATE;\n    }\n#endif\n\n    /* Flush as much pending output as possible */\n    if (s->pending != 0) {\n        flush_pending(strm);\n        if (strm->avail_out == 0) {\n            /* Since avail_out is 0, deflate will be called again with\n             * more output space, but possibly with both pending and\n             * avail_in equal to zero. There won't be anything to do,\n             * but this is not an error situation so make sure we\n             * return OK instead of BUF_ERROR at next call of deflate:\n             */\n            s->last_flush = -1;\n            return Z_OK;\n        }\n\n    /* Make sure there is something to do and avoid duplicate consecutive\n     * flushes. For repeated and useless calls with Z_FINISH, we keep\n     * returning Z_STREAM_END instead of Z_BUF_ERROR.\n     */\n    } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) &&\n               flush != Z_FINISH) {\n        ERR_RETURN(strm, Z_BUF_ERROR);\n    }\n\n    /* User must not provide more input after the first FINISH: */\n    if (s->status == FINISH_STATE && strm->avail_in != 0) {\n        ERR_RETURN(strm, Z_BUF_ERROR);\n    }\n\n    /* Start a new block or continue the current one.\n     */\n    if (strm->avail_in != 0 || s->lookahead != 0 ||\n        (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) {\n        block_state bstate;\n\n        bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) :\n                    (s->strategy == Z_RLE ? deflate_rle(s, flush) :\n                        (*(configuration_table[s->level].func))(s, flush));\n\n        if (bstate == finish_started || bstate == finish_done) {\n            s->status = FINISH_STATE;\n        }\n        if (bstate == need_more || bstate == finish_started) {\n            if (strm->avail_out == 0) {\n                s->last_flush = -1; /* avoid BUF_ERROR next call, see above */\n            }\n            return Z_OK;\n            /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n             * of deflate should use the same flush parameter to make sure\n             * that the flush is complete. So we don't have to output an\n             * empty block here, this will be done at next call. This also\n             * ensures that for a very small output buffer, we emit at most\n             * one empty block.\n             */\n        }\n        if (bstate == block_done) {\n            if (flush == Z_PARTIAL_FLUSH) {\n                _tr_align(s);\n            } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */\n                _tr_stored_block(s, (char*)0, 0L, 0);\n                /* For a full flush, this empty block will be recognized\n                 * as a special marker by inflate_sync().\n                 */\n                if (flush == Z_FULL_FLUSH) {\n                    CLEAR_HASH(s);             /* forget history */\n                    if (s->lookahead == 0) {\n                        s->strstart = 0;\n                        s->block_start = 0L;\n                        s->insert = 0;\n                    }\n                }\n            }\n            flush_pending(strm);\n            if (strm->avail_out == 0) {\n              s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n              return Z_OK;\n            }\n        }\n    }\n    Assert(strm->avail_out > 0, \"bug2\");\n\n    if (flush != Z_FINISH) return Z_OK;\n    if (s->wrap <= 0) return Z_STREAM_END;\n\n    /* Write the trailer */\n#ifdef GZIP\n    if (s->wrap == 2) {\n        put_byte(s, (Byte)(strm->adler & 0xff));\n        put_byte(s, (Byte)((strm->adler >> 8) & 0xff));\n        put_byte(s, (Byte)((strm->adler >> 16) & 0xff));\n        put_byte(s, (Byte)((strm->adler >> 24) & 0xff));\n        put_byte(s, (Byte)(strm->total_in & 0xff));\n        put_byte(s, (Byte)((strm->total_in >> 8) & 0xff));\n        put_byte(s, (Byte)((strm->total_in >> 16) & 0xff));\n        put_byte(s, (Byte)((strm->total_in >> 24) & 0xff));\n    }\n    else\n#endif\n    {\n        putShortMSB(s, (uInt)(strm->adler >> 16));\n        putShortMSB(s, (uInt)(strm->adler & 0xffff));\n    }\n    flush_pending(strm);\n    /* If avail_out is zero, the application will call deflate again\n     * to flush the rest.\n     */\n    if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */\n    return s->pending != 0 ? Z_OK : Z_STREAM_END;\n}\n\n/* ========================================================================= */\nint ZEXPORT deflateEnd (\n    z_streamp strm)\n{\n    int status;\n\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n\n    status = strm->state->status;\n    if (status != INIT_STATE &&\n        status != EXTRA_STATE &&\n        status != NAME_STATE &&\n        status != COMMENT_STATE &&\n        status != HCRC_STATE &&\n        status != BUSY_STATE &&\n        status != FINISH_STATE) {\n      return Z_STREAM_ERROR;\n    }\n\n    /* Deallocate in reverse order of allocations: */\n    TRY_FREE(strm, strm->state->pending_buf);\n    TRY_FREE(strm, strm->state->head);\n    TRY_FREE(strm, strm->state->prev);\n    TRY_FREE(strm, strm->state->window);\n\n    ZFREE(strm, strm->state);\n    strm->state = Z_NULL;\n\n    return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;\n}\n\n/* =========================================================================\n * Copy the source state to the destination state.\n * To simplify the source, this is not supported for 16-bit MSDOS (which\n * doesn't have enough memory anyway to duplicate compression states).\n */\nint ZEXPORT deflateCopy (\n    z_streamp dest,\n    z_streamp source)\n{\n#ifdef MAXSEG_64K\n    return Z_STREAM_ERROR;\n#else\n    deflate_state *ds;\n    deflate_state *ss;\n    ushf *overlay;\n\n\n    if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) {\n        return Z_STREAM_ERROR;\n    }\n\n    ss = source->state;\n\n    zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));\n\n    ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state));\n    if (ds == Z_NULL) return Z_MEM_ERROR;\n    dest->state = (struct internal_state FAR *) ds;\n    zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state));\n    ds->strm = dest;\n\n    ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));\n    ds->prev   = (Posf *)  ZALLOC(dest, ds->w_size, sizeof(Pos));\n    ds->head   = (Posf *)  ZALLOC(dest, ds->hash_size, sizeof(Pos));\n    overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2);\n    ds->pending_buf = (uchf *) overlay;\n\n    if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL ||\n        ds->pending_buf == Z_NULL) {\n        deflateEnd (dest);\n        return Z_MEM_ERROR;\n    }\n    /* following zmemcpy do not work for 16-bit MSDOS */\n    zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));\n    zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos));\n    zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos));\n    zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);\n\n    ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);\n    ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush);\n    ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize;\n\n    ds->l_desc.dyn_tree = ds->dyn_ltree;\n    ds->d_desc.dyn_tree = ds->dyn_dtree;\n    ds->bl_desc.dyn_tree = ds->bl_tree;\n\n    return Z_OK;\n#endif /* MAXSEG_64K */\n}\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read.  All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->next_in buffer and copying from it.\n * (See also flush_pending()).\n */\nlocal int read_buf(\n    z_streamp strm,\n    Bytef *buf,\n    unsigned size)\n{\n    unsigned len = strm->avail_in;\n\n    if (len > size) len = size;\n    if (len == 0) return 0;\n\n    strm->avail_in  -= len;\n\n    zmemcpy(buf, strm->next_in, len);\n    if (strm->state->wrap == 1) {\n        strm->adler = adler32(strm->adler, buf, len);\n    }\n#ifdef GZIP\n    else if (strm->state->wrap == 2) {\n        strm->adler = crc32(strm->adler, buf, len);\n    }\n#endif\n    strm->next_in  += len;\n    strm->total_in += len;\n\n    return (int)len;\n}\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nlocal void lm_init (\n    deflate_state *s)\n{\n    s->window_size = (ulg)2L*s->w_size;\n\n    CLEAR_HASH(s);\n\n    /* Set the default configuration parameters:\n     */\n    s->max_lazy_match   = configuration_table[s->level].max_lazy;\n    s->good_match       = configuration_table[s->level].good_length;\n    s->nice_match       = configuration_table[s->level].nice_length;\n    s->max_chain_length = configuration_table[s->level].max_chain;\n\n    s->strstart = 0;\n    s->block_start = 0L;\n    s->lookahead = 0;\n    s->insert = 0;\n    s->match_length = s->prev_length = MIN_MATCH-1;\n    s->match_available = 0;\n    s->ins_h = 0;\n#ifndef FASTEST\n#ifdef ASMV\n    match_init(); /* initialize the asm code */\n#endif\n#endif\n}\n\n#ifndef FASTEST\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\n#ifndef ASMV\n/* For 80x86 and 680x0, an optimized version will be provided in match.asm or\n * match.S. The code will be functionally equivalent.\n */\nlocal uInt longest_match(\n    deflate_state *s,\n    IPos cur_match)                             /* current match */\n{\n    unsigned chain_length = s->max_chain_length;/* max hash chain length */\n    register Bytef *scan = s->window + s->strstart; /* current string */\n    register Bytef *match;                       /* matched string */\n    register int len;                           /* length of current match */\n    int best_len = s->prev_length;              /* best match length so far */\n    int nice_match = s->nice_match;             /* stop if match long enough */\n    IPos limit = s->strstart > (IPos)MAX_DIST(s) ?\n        s->strstart - (IPos)MAX_DIST(s) : NIL;\n    /* Stop when cur_match becomes <= limit. To simplify the code,\n     * we prevent matches with the string of window index 0.\n     */\n    Posf *prev = s->prev;\n    uInt wmask = s->w_mask;\n\n#ifdef UNALIGNED_OK\n    /* Compare two bytes at a time. Note: this is not always beneficial.\n     * Try with and without -DUNALIGNED_OK to check.\n     */\n    register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;\n    register ush scan_start = *(ushf*)scan;\n    register ush scan_end   = *(ushf*)(scan+best_len-1);\n#else\n    register Bytef *strend = s->window + s->strstart + MAX_MATCH;\n    register Byte scan_end1  = scan[best_len-1];\n    register Byte scan_end   = scan[best_len];\n#endif\n\n    /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n     * It is easy to get rid of this optimization if necessary.\n     */\n    Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n    /* Do not waste too much time if we already have a good match: */\n    if (s->prev_length >= s->good_match) {\n        chain_length >>= 2;\n    }\n    /* Do not look for matches beyond the end of the input. This is necessary\n     * to make deflate deterministic.\n     */\n    if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;\n\n    Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n    do {\n        Assert(cur_match < s->strstart, \"no future\");\n        match = s->window + cur_match;\n\n        /* Skip to next match if the match length cannot increase\n         * or if the match length is less than 2.  Note that the checks below\n         * for insufficient lookahead only occur occasionally for performance\n         * reasons.  Therefore uninitialized memory will be accessed, and\n         * conditional jumps will be made that depend on those values.\n         * However the length of the match is limited to the lookahead, so\n         * the output of deflate is not affected by the uninitialized values.\n         */\n#if (defined(UNALIGNED_OK) && MAX_MATCH == 258)\n        /* This code assumes sizeof(unsigned short) == 2. Do not use\n         * UNALIGNED_OK if your compiler uses a different size.\n         */\n        if (*(ushf*)(match+best_len-1) != scan_end ||\n            *(ushf*)match != scan_start) continue;\n\n        /* It is not necessary to compare scan[2] and match[2] since they are\n         * always equal when the other bytes match, given that the hash keys\n         * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at\n         * strstart+3, +5, ... up to strstart+257. We check for insufficient\n         * lookahead only every 4th comparison; the 128th check will be made\n         * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is\n         * necessary to put more guard bytes at the end of the window, or\n         * to check more often for insufficient lookahead.\n         */\n        Assert(scan[2] == match[2], \"scan[2]?\");\n        scan++, match++;\n        do {\n        } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&\n                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&\n                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&\n                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&\n                 scan < strend);\n        /* The funny \"do {}\" generates better code on most compilers */\n\n        /* Here, scan <= window+strstart+257 */\n        Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n        if (*scan == *match) scan++;\n\n        len = (MAX_MATCH - 1) - (int)(strend-scan);\n        scan = strend - (MAX_MATCH-1);\n\n#else /* UNALIGNED_OK */\n\n        if (match[best_len]   != scan_end  ||\n            match[best_len-1] != scan_end1 ||\n            *match            != *scan     ||\n            *++match          != scan[1])      continue;\n\n        /* The check at best_len-1 can be removed because it will be made\n         * again later. (This heuristic is not always a win.)\n         * It is not necessary to compare scan[2] and match[2] since they\n         * are always equal when the other bytes match, given that\n         * the hash keys are equal and that HASH_BITS >= 8.\n         */\n        scan += 2, match++;\n        Assert(*scan == *match, \"match[2]?\");\n\n        /* We check for insufficient lookahead only every 8th comparison;\n         * the 256th check will be made at strstart+258.\n         */\n        do {\n        } while (*++scan == *++match && *++scan == *++match &&\n                 *++scan == *++match && *++scan == *++match &&\n                 *++scan == *++match && *++scan == *++match &&\n                 *++scan == *++match && *++scan == *++match &&\n                 scan < strend);\n\n        Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n        len = MAX_MATCH - (int)(strend - scan);\n        scan = strend - MAX_MATCH;\n\n#endif /* UNALIGNED_OK */\n\n        if (len > best_len) {\n            s->match_start = cur_match;\n            best_len = len;\n            if (len >= nice_match) break;\n#ifdef UNALIGNED_OK\n            scan_end = *(ushf*)(scan+best_len-1);\n#else\n            scan_end1  = scan[best_len-1];\n            scan_end   = scan[best_len];\n#endif\n        }\n    } while ((cur_match = prev[cur_match & wmask]) > limit\n             && --chain_length != 0);\n\n    if ((uInt)best_len <= s->lookahead) return (uInt)best_len;\n    return s->lookahead;\n}\n#endif /* ASMV */\n\n#else /* FASTEST */\n\n/* ---------------------------------------------------------------------------\n * Optimized version for FASTEST only\n */\nlocal uInt longest_match(\n    deflate_state *s,\n    IPos cur_match)                             /* current match */\n{\n    register Bytef *scan = s->window + s->strstart; /* current string */\n    register Bytef *match;                       /* matched string */\n    register int len;                           /* length of current match */\n    register Bytef *strend = s->window + s->strstart + MAX_MATCH;\n\n    /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n     * It is easy to get rid of this optimization if necessary.\n     */\n    Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n    Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n    Assert(cur_match < s->strstart, \"no future\");\n\n    match = s->window + cur_match;\n\n    /* Return failure if the match length is less than 2:\n     */\n    if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1;\n\n    /* The check at best_len-1 can be removed because it will be made\n     * again later. (This heuristic is not always a win.)\n     * It is not necessary to compare scan[2] and match[2] since they\n     * are always equal when the other bytes match, given that\n     * the hash keys are equal and that HASH_BITS >= 8.\n     */\n    scan += 2, match += 2;\n    Assert(*scan == *match, \"match[2]?\");\n\n    /* We check for insufficient lookahead only every 8th comparison;\n     * the 256th check will be made at strstart+258.\n     */\n    do {\n    } while (*++scan == *++match && *++scan == *++match &&\n             *++scan == *++match && *++scan == *++match &&\n             *++scan == *++match && *++scan == *++match &&\n             *++scan == *++match && *++scan == *++match &&\n             scan < strend);\n\n    Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n    len = MAX_MATCH - (int)(strend - scan);\n\n    if (len < MIN_MATCH) return MIN_MATCH - 1;\n\n    s->match_start = cur_match;\n    return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead;\n}\n\n#endif /* FASTEST */\n\n#ifdef DEBUG\n/* ===========================================================================\n * Check that the match at match_start is indeed a match.\n */\nlocal void check_match(\n    deflate_state *s,\n    IPos start, IPos match,\n    int length)\n{\n    /* check that the match is indeed a match */\n    if (zmemcmp(s->window + match,\n                s->window + start, length) != EQUAL) {\n        fprintf(stderr, \" start %u, match %u, length %d\\n\",\n                start, match, length);\n        do {\n            fprintf(stderr, \"%c%c\", s->window[match++], s->window[start++]);\n        } while (--length != 0);\n        z_error(\"invalid match\");\n    }\n    if (z_verbose > 1) {\n        fprintf(stderr,\"\\\\[%d,%d]\", start-match, length);\n        do { putc(s->window[start++], stderr); } while (--length != 0);\n    }\n}\n#else\n#  define check_match(s, start, match, length)\n#endif /* DEBUG */\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n *    At least one byte has been read, or avail_in == 0; reads are\n *    performed for at least two bytes (required for the zip translate_eol\n *    option -- not supported here).\n */\nlocal void fill_window(\n    deflate_state *s)\n{\n    register unsigned n, m;\n    register Posf *p;\n    unsigned more;    /* Amount of free space at the end of the window. */\n    uInt wsize = s->w_size;\n\n    Assert(s->lookahead < MIN_LOOKAHEAD, \"already enough lookahead\");\n\n    do {\n        more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);\n\n        /* Deal with !@#$% 64K limit: */\n        if (sizeof(int) <= 2) {\n            if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n                more = wsize;\n\n            } else if (more == (unsigned)(-1)) {\n                /* Very unlikely, but possible on 16 bit machine if\n                 * strstart == 0 && lookahead == 1 (input done a byte at time)\n                 */\n                more--;\n            }\n        }\n\n        /* If the window is almost full and there is insufficient lookahead,\n         * move the upper half to the lower one to make room in the upper half.\n         */\n        if (s->strstart >= wsize+MAX_DIST(s)) {\n\n            zmemcpy(s->window, s->window+wsize, (unsigned)wsize);\n            s->match_start -= wsize;\n            s->strstart    -= wsize; /* we now have strstart >= MAX_DIST */\n            s->block_start -= (long) wsize;\n\n            /* Slide the hash table (could be avoided with 32 bit values\n               at the expense of memory usage). We slide even when level == 0\n               to keep the hash table consistent if we switch back to level > 0\n               later. (Using level 0 permanently is not an optimal usage of\n               zlib, so we don't care about this pathological case.)\n             */\n            n = s->hash_size;\n            p = &s->head[n];\n            do {\n                m = *--p;\n                *p = (Pos)(m >= wsize ? m-wsize : NIL);\n            } while (--n);\n\n            n = wsize;\n#ifndef FASTEST\n            p = &s->prev[n];\n            do {\n                m = *--p;\n                *p = (Pos)(m >= wsize ? m-wsize : NIL);\n                /* If n is not on any hash chain, prev[n] is garbage but\n                 * its value will never be used.\n                 */\n            } while (--n);\n#endif\n            more += wsize;\n        }\n        if (s->strm->avail_in == 0) break;\n\n        /* If there was no sliding:\n         *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n         *    more == window_size - lookahead - strstart\n         * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n         * => more >= window_size - 2*WSIZE + 2\n         * In the BIG_MEM or MMAP case (not yet supported),\n         *   window_size == input_size + MIN_LOOKAHEAD  &&\n         *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n         * Otherwise, window_size == 2*WSIZE so more >= 2.\n         * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n         */\n        Assert(more >= 2, \"more < 2\");\n\n        n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);\n        s->lookahead += n;\n\n        /* Initialize the hash value now that we have some input: */\n        if (s->lookahead + s->insert >= MIN_MATCH) {\n            uInt str = s->strstart - s->insert;\n            s->ins_h = s->window[str];\n            UPDATE_HASH(s, s->ins_h, s->window[str + 1]);\n#if MIN_MATCH != 3\n            Call UPDATE_HASH() MIN_MATCH-3 more times\n#endif\n            while (s->insert) {\n                UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);\n#ifndef FASTEST\n                s->prev[str & s->w_mask] = s->head[s->ins_h];\n#endif\n                s->head[s->ins_h] = (Pos)str;\n                str++;\n                s->insert--;\n                if (s->lookahead + s->insert < MIN_MATCH)\n                    break;\n            }\n        }\n        /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n         * but this is not important since only literal bytes will be emitted.\n         */\n\n    } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);\n\n    /* If the WIN_INIT bytes after the end of the current data have never been\n     * written, then zero those bytes in order to avoid memory check reports of\n     * the use of uninitialized (or uninitialised as Julian writes) bytes by\n     * the longest match routines.  Update the high water mark for the next\n     * time through here.  WIN_INIT is set to MAX_MATCH since the longest match\n     * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\n     */\n    if (s->high_water < s->window_size) {\n        ulg curr = s->strstart + (ulg)(s->lookahead);\n        ulg init;\n\n        if (s->high_water < curr) {\n            /* Previous high water mark below current data -- zero WIN_INIT\n             * bytes or up to end of window, whichever is less.\n             */\n            init = s->window_size - curr;\n            if (init > WIN_INIT)\n                init = WIN_INIT;\n            zmemzero(s->window + curr, (unsigned)init);\n            s->high_water = curr + init;\n        }\n        else if (s->high_water < (ulg)curr + WIN_INIT) {\n            /* High water mark at or above current data, but below current data\n             * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\n             * to end of window, whichever is less.\n             */\n            init = (ulg)curr + WIN_INIT - s->high_water;\n            if (init > s->window_size - s->high_water)\n                init = s->window_size - s->high_water;\n            zmemzero(s->window + s->high_water, (unsigned)init);\n            s->high_water += init;\n        }\n    }\n\n    Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\n           \"not enough room for search\");\n}\n\n/* ===========================================================================\n * Flush the current block, with given end-of-file flag.\n * IN assertion: strstart is set to the end of the current match.\n */\n#define FLUSH_BLOCK_ONLY(s, last) { \\\n   _tr_flush_block(s, (s->block_start >= 0L ? \\\n                   (charf *)&s->window[(unsigned)s->block_start] : \\\n                   (charf *)Z_NULL), \\\n                (ulg)((long)s->strstart - s->block_start), \\\n                (last)); \\\n   s->block_start = s->strstart; \\\n   flush_pending(s->strm); \\\n   Tracev((stderr,\"[FLUSH]\")); \\\n}\n\n/* Same but force premature exit if necessary. */\n#define FLUSH_BLOCK(s, last) { \\\n   FLUSH_BLOCK_ONLY(s, last); \\\n   if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \\\n}\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n * This function does not insert new strings in the dictionary since\n * uncompressible data is probably not useful. This function is used\n * only for the level=0 compression option.\n * NOTE: this function should be optimized to avoid extra copying from\n * window to pending_buf.\n */\nlocal block_state deflate_stored(\n    deflate_state *s,\n    int flush)\n{\n    /* Stored blocks are limited to 0xffff bytes, pending_buf is limited\n     * to pending_buf_size, and each stored block has a 5 byte header:\n     */\n    ulg max_block_size = 0xffff;\n    ulg max_start;\n\n    if (max_block_size > s->pending_buf_size - 5) {\n        max_block_size = s->pending_buf_size - 5;\n    }\n\n    /* Copy as much as possible from input to output: */\n    for (;;) {\n        /* Fill the window as much as possible: */\n        if (s->lookahead <= 1) {\n\n            Assert(s->strstart < s->w_size+MAX_DIST(s) ||\n                   s->block_start >= (long)s->w_size, \"slide too late\");\n\n            fill_window(s);\n            if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more;\n\n            if (s->lookahead == 0) break; /* flush the current block */\n        }\n        Assert(s->block_start >= 0L, \"block gone\");\n\n        s->strstart += s->lookahead;\n        s->lookahead = 0;\n\n        /* Emit a stored block if pending_buf will be full: */\n        max_start = s->block_start + max_block_size;\n        if (s->strstart == 0 || (ulg)s->strstart >= max_start) {\n            /* strstart == 0 is possible when wraparound on 16-bit machine */\n            s->lookahead = (uInt)(s->strstart - max_start);\n            s->strstart = (uInt)max_start;\n            FLUSH_BLOCK(s, 0);\n        }\n        /* Flush if we may have to slide, otherwise block_start may become\n         * negative and the data will be gone:\n         */\n        if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) {\n            FLUSH_BLOCK(s, 0);\n        }\n    }\n    s->insert = 0;\n    if (flush == Z_FINISH) {\n        FLUSH_BLOCK(s, 1);\n        return finish_done;\n    }\n    if ((long)s->strstart > s->block_start)\n        FLUSH_BLOCK(s, 0);\n    return block_done;\n}\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nlocal block_state deflate_fast(\n    deflate_state *s,\n    int flush)\n{\n    IPos hash_head;       /* head of the hash chain */\n    int bflush;           /* set if current block must be flushed */\n\n    for (;;) {\n        /* Make sure that we always have enough lookahead, except\n         * at the end of the input file. We need MAX_MATCH bytes\n         * for the next match, plus MIN_MATCH bytes to insert the\n         * string following the next match.\n         */\n        if (s->lookahead < MIN_LOOKAHEAD) {\n            fill_window(s);\n            if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {\n                return need_more;\n            }\n            if (s->lookahead == 0) break; /* flush the current block */\n        }\n\n        /* Insert the string window[strstart .. strstart+2] in the\n         * dictionary, and set hash_head to the head of the hash chain:\n         */\n        hash_head = NIL;\n        if (s->lookahead >= MIN_MATCH) {\n            INSERT_STRING(s, s->strstart, hash_head);\n        }\n\n        /* Find the longest match, discarding those <= prev_length.\n         * At this point we have always match_length < MIN_MATCH\n         */\n        if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) {\n            /* To simplify the code, we prevent matches with the string\n             * of window index 0 (in particular we have to avoid a match\n             * of the string with itself at the start of the input file).\n             */\n            s->match_length = longest_match (s, hash_head);\n            /* longest_match() sets match_start */\n        }\n        if (s->match_length >= MIN_MATCH) {\n            check_match(s, s->strstart, s->match_start, s->match_length);\n\n            _tr_tally_dist(s, s->strstart - s->match_start,\n                           s->match_length - MIN_MATCH, bflush);\n\n            s->lookahead -= s->match_length;\n\n            /* Insert new strings in the hash table only if the match length\n             * is not too large. This saves time but degrades compression.\n             */\n#ifndef FASTEST\n            if (s->match_length <= s->max_insert_length &&\n                s->lookahead >= MIN_MATCH) {\n                s->match_length--; /* string at strstart already in table */\n                do {\n                    s->strstart++;\n                    INSERT_STRING(s, s->strstart, hash_head);\n                    /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n                     * always MIN_MATCH bytes ahead.\n                     */\n                } while (--s->match_length != 0);\n                s->strstart++;\n            } else\n#endif\n            {\n                s->strstart += s->match_length;\n                s->match_length = 0;\n                s->ins_h = s->window[s->strstart];\n                UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);\n#if MIN_MATCH != 3\n                Call UPDATE_HASH() MIN_MATCH-3 more times\n#endif\n                /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n                 * matter since it will be recomputed at next deflate call.\n                 */\n            }\n        } else {\n            /* No match, output a literal byte */\n            Tracevv((stderr,\"%c\", s->window[s->strstart]));\n            _tr_tally_lit (s, s->window[s->strstart], bflush);\n            s->lookahead--;\n            s->strstart++;\n        }\n        if (bflush) FLUSH_BLOCK(s, 0);\n    }\n    s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1;\n    if (flush == Z_FINISH) {\n        FLUSH_BLOCK(s, 1);\n        return finish_done;\n    }\n    if (s->last_lit)\n        FLUSH_BLOCK(s, 0);\n    return block_done;\n}\n\n#ifndef FASTEST\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nlocal block_state deflate_slow(\n    deflate_state *s,\n    int flush)\n{\n    IPos hash_head;          /* head of hash chain */\n    int bflush;              /* set if current block must be flushed */\n\n    /* Process the input block. */\n    for (;;) {\n        /* Make sure that we always have enough lookahead, except\n         * at the end of the input file. We need MAX_MATCH bytes\n         * for the next match, plus MIN_MATCH bytes to insert the\n         * string following the next match.\n         */\n        if (s->lookahead < MIN_LOOKAHEAD) {\n            fill_window(s);\n            if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {\n                return need_more;\n            }\n            if (s->lookahead == 0) break; /* flush the current block */\n        }\n\n        /* Insert the string window[strstart .. strstart+2] in the\n         * dictionary, and set hash_head to the head of the hash chain:\n         */\n        hash_head = NIL;\n        if (s->lookahead >= MIN_MATCH) {\n            INSERT_STRING(s, s->strstart, hash_head);\n        }\n\n        /* Find the longest match, discarding those <= prev_length.\n         */\n        s->prev_length = s->match_length, s->prev_match = s->match_start;\n        s->match_length = MIN_MATCH-1;\n\n        if (hash_head != NIL && s->prev_length < s->max_lazy_match &&\n            s->strstart - hash_head <= MAX_DIST(s)) {\n            /* To simplify the code, we prevent matches with the string\n             * of window index 0 (in particular we have to avoid a match\n             * of the string with itself at the start of the input file).\n             */\n            s->match_length = longest_match (s, hash_head);\n            /* longest_match() sets match_start */\n\n            if (s->match_length <= 5 && (s->strategy == Z_FILTERED\n#if TOO_FAR <= 32767\n                || (s->match_length == MIN_MATCH &&\n                    s->strstart - s->match_start > TOO_FAR)\n#endif\n                )) {\n\n                /* If prev_match is also MIN_MATCH, match_start is garbage\n                 * but we will ignore the current match anyway.\n                 */\n                s->match_length = MIN_MATCH-1;\n            }\n        }\n        /* If there was a match at the previous step and the current\n         * match is not better, output the previous match:\n         */\n        if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) {\n            uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;\n            /* Do not insert strings in hash table beyond this. */\n\n            check_match(s, s->strstart-1, s->prev_match, s->prev_length);\n\n            _tr_tally_dist(s, s->strstart -1 - s->prev_match,\n                           s->prev_length - MIN_MATCH, bflush);\n\n            /* Insert in hash table all strings up to the end of the match.\n             * strstart-1 and strstart are already inserted. If there is not\n             * enough lookahead, the last two strings are not inserted in\n             * the hash table.\n             */\n            s->lookahead -= s->prev_length-1;\n            s->prev_length -= 2;\n            do {\n                if (++s->strstart <= max_insert) {\n                    INSERT_STRING(s, s->strstart, hash_head);\n                }\n            } while (--s->prev_length != 0);\n            s->match_available = 0;\n            s->match_length = MIN_MATCH-1;\n            s->strstart++;\n\n            if (bflush) FLUSH_BLOCK(s, 0);\n\n        } else if (s->match_available) {\n            /* If there was no match at the previous position, output a\n             * single literal. If there was a match but the current match\n             * is longer, truncate the previous match to a single literal.\n             */\n            Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n            _tr_tally_lit(s, s->window[s->strstart-1], bflush);\n            if (bflush) {\n                FLUSH_BLOCK_ONLY(s, 0);\n            }\n            s->strstart++;\n            s->lookahead--;\n            if (s->strm->avail_out == 0) return need_more;\n        } else {\n            /* There is no previous match to compare with, wait for\n             * the next step to decide.\n             */\n            s->match_available = 1;\n            s->strstart++;\n            s->lookahead--;\n        }\n    }\n    Assert (flush != Z_NO_FLUSH, \"no flush?\");\n    if (s->match_available) {\n        Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n        _tr_tally_lit(s, s->window[s->strstart-1], bflush);\n        s->match_available = 0;\n    }\n    s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1;\n    if (flush == Z_FINISH) {\n        FLUSH_BLOCK(s, 1);\n        return finish_done;\n    }\n    if (s->last_lit)\n        FLUSH_BLOCK(s, 0);\n    return block_done;\n}\n#endif /* FASTEST */\n\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one.  Do not maintain a hash table.  (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nlocal block_state deflate_rle(\n    deflate_state *s,\n    int flush)\n{\n    int bflush;             /* set if current block must be flushed */\n    uInt prev;              /* byte at distance one to match */\n    Bytef *scan, *strend;   /* scan goes up to strend for length of run */\n\n    for (;;) {\n        /* Make sure that we always have enough lookahead, except\n         * at the end of the input file. We need MAX_MATCH bytes\n         * for the longest run, plus one for the unrolled loop.\n         */\n        if (s->lookahead <= MAX_MATCH) {\n            fill_window(s);\n            if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) {\n                return need_more;\n            }\n            if (s->lookahead == 0) break; /* flush the current block */\n        }\n\n        /* See how many times the previous byte repeats */\n        s->match_length = 0;\n        if (s->lookahead >= MIN_MATCH && s->strstart > 0) {\n            scan = s->window + s->strstart - 1;\n            prev = *scan;\n            if (prev == *++scan && prev == *++scan && prev == *++scan) {\n                strend = s->window + s->strstart + MAX_MATCH;\n                do {\n                } while (prev == *++scan && prev == *++scan &&\n                         prev == *++scan && prev == *++scan &&\n                         prev == *++scan && prev == *++scan &&\n                         prev == *++scan && prev == *++scan &&\n                         scan < strend);\n                s->match_length = MAX_MATCH - (int)(strend - scan);\n                if (s->match_length > s->lookahead)\n                    s->match_length = s->lookahead;\n            }\n            Assert(scan <= s->window+(uInt)(s->window_size-1), \"wild scan\");\n        }\n\n        /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n        if (s->match_length >= MIN_MATCH) {\n            check_match(s, s->strstart, s->strstart - 1, s->match_length);\n\n            _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush);\n\n            s->lookahead -= s->match_length;\n            s->strstart += s->match_length;\n            s->match_length = 0;\n        } else {\n            /* No match, output a literal byte */\n            Tracevv((stderr,\"%c\", s->window[s->strstart]));\n            _tr_tally_lit (s, s->window[s->strstart], bflush);\n            s->lookahead--;\n            s->strstart++;\n        }\n        if (bflush) FLUSH_BLOCK(s, 0);\n    }\n    s->insert = 0;\n    if (flush == Z_FINISH) {\n        FLUSH_BLOCK(s, 1);\n        return finish_done;\n    }\n    if (s->last_lit)\n        FLUSH_BLOCK(s, 0);\n    return block_done;\n}\n\n/* ===========================================================================\n * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.\n * (It will be regenerated if this run of deflate switches away from Huffman.)\n */\nlocal block_state deflate_huff(\n    deflate_state *s,\n    int flush)\n{\n    int bflush;             /* set if current block must be flushed */\n\n    for (;;) {\n        /* Make sure that we have a literal to write. */\n        if (s->lookahead == 0) {\n            fill_window(s);\n            if (s->lookahead == 0) {\n                if (flush == Z_NO_FLUSH)\n                    return need_more;\n                break;      /* flush the current block */\n            }\n        }\n\n        /* Output a literal byte */\n        s->match_length = 0;\n        Tracevv((stderr,\"%c\", s->window[s->strstart]));\n        _tr_tally_lit (s, s->window[s->strstart], bflush);\n        s->lookahead--;\n        s->strstart++;\n        if (bflush) FLUSH_BLOCK(s, 0);\n    }\n    s->insert = 0;\n    if (flush == Z_FINISH) {\n        FLUSH_BLOCK(s, 1);\n        return finish_done;\n    }\n    if (s->last_lit)\n        FLUSH_BLOCK(s, 0);\n    return block_done;\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_infback.c",
    "content": "/* infback.c -- inflate using a call-back interface\n * Copyright (C) 1995-2011 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/*\n   This code is largely copied from inflate.c.  Normally either infback.o or\n   inflate.o would be linked into an application--not both.  The interface\n   with inffast.c is retained so that optimized assembler-coded versions of\n   inflate_fast() can be used with either inflate.c or infback.c.\n */\n\n#include \"zutil.h\"\n#include \"inftrees.h\"\n#include \"inflate.h\"\n#include \"inffast.h\"\n\n/* function prototypes */\nlocal void fixedtables OF((struct inflate_state FAR *state));\n\n/*\n   strm provides memory allocation functions in zalloc and zfree, or\n   Z_NULL to use the library memory allocation functions.\n\n   windowBits is in the range 8..15, and window is a user-supplied\n   window and output buffer that is 2**windowBits bytes.\n */\nint ZEXPORT inflateBackInit_(\nz_streamp strm,\nint windowBits,\nunsigned char FAR *window,\nconst char *version,\nint stream_size)\n{\n    struct inflate_state FAR *state;\n\n    if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||\n        stream_size != (int)(sizeof(z_stream)))\n        return Z_VERSION_ERROR;\n    if (strm == Z_NULL || window == Z_NULL ||\n        windowBits < 8 || windowBits > 15)\n        return Z_STREAM_ERROR;\n    strm->msg = Z_NULL;                 /* in case we return an error */\n    if (strm->zalloc == (alloc_func)0) {\n#ifdef Z_SOLO\n        return Z_STREAM_ERROR;\n#else\n        strm->zalloc = zcalloc;\n        strm->opaque = (voidpf)0;\n#endif\n    }\n    if (strm->zfree == (free_func)0)\n#ifdef Z_SOLO\n        return Z_STREAM_ERROR;\n#else\n    strm->zfree = zcfree;\n#endif\n    state = (struct inflate_state FAR *)ZALLOC(strm, 1,\n                                               sizeof(struct inflate_state));\n    if (state == Z_NULL) return Z_MEM_ERROR;\n    Tracev((stderr, \"inflate: allocated\\n\"));\n    strm->state = (struct internal_state FAR *)state;\n    state->dmax = 32768U;\n    state->wbits = windowBits;\n    state->wsize = 1U << windowBits;\n    state->window = window;\n    state->wnext = 0;\n    state->whave = 0;\n    return Z_OK;\n}\n\n/*\n   Return state with length and distance decoding tables and index sizes set to\n   fixed code decoding.  Normally this returns fixed tables from inffixed.h.\n   If BUILDFIXED is defined, then instead this routine builds the tables the\n   first time it's called, and returns those tables the first time and\n   thereafter.  This reduces the size of the code by about 2K bytes, in\n   exchange for a little execution time.  However, BUILDFIXED should not be\n   used for threaded applications, since the rewriting of the tables and virgin\n   may not be thread-safe.\n */\nlocal void fixedtables(\nstruct inflate_state FAR *state)\n{\n#ifdef BUILDFIXED\n    static int virgin = 1;\n    static code *lenfix, *distfix;\n    static code fixed[544];\n\n    /* build fixed huffman tables if first call (may not be thread safe) */\n    if (virgin) {\n        unsigned sym, bits;\n        static code *next;\n\n        /* literal/length table */\n        sym = 0;\n        while (sym < 144) state->lens[sym++] = 8;\n        while (sym < 256) state->lens[sym++] = 9;\n        while (sym < 280) state->lens[sym++] = 7;\n        while (sym < 288) state->lens[sym++] = 8;\n        next = fixed;\n        lenfix = next;\n        bits = 9;\n        inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);\n\n        /* distance table */\n        sym = 0;\n        while (sym < 32) state->lens[sym++] = 5;\n        distfix = next;\n        bits = 5;\n        inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);\n\n        /* do this just once */\n        virgin = 0;\n    }\n#else /* !BUILDFIXED */\n#   include \"inffixed.h\"\n#endif /* BUILDFIXED */\n    state->lencode = lenfix;\n    state->lenbits = 9;\n    state->distcode = distfix;\n    state->distbits = 5;\n}\n\n/* Macros for inflateBack(): */\n\n/* Load returned state from inflate_fast() */\n#define LOAD() \\\n    do { \\\n        put = strm->next_out; \\\n        left = strm->avail_out; \\\n        next = strm->next_in; \\\n        have = strm->avail_in; \\\n        hold = state->hold; \\\n        bits = state->bits; \\\n    } while (0)\n\n/* Set state from registers for inflate_fast() */\n#define RESTORE() \\\n    do { \\\n        strm->next_out = put; \\\n        strm->avail_out = left; \\\n        strm->next_in = next; \\\n        strm->avail_in = have; \\\n        state->hold = hold; \\\n        state->bits = bits; \\\n    } while (0)\n\n/* Clear the input bit accumulator */\n#define INITBITS() \\\n    do { \\\n        hold = 0; \\\n        bits = 0; \\\n    } while (0)\n\n/* Assure that some input is available.  If input is requested, but denied,\n   then return a Z_BUF_ERROR from inflateBack(). */\n#define PULL() \\\n    do { \\\n        if (have == 0) { \\\n            have = in(in_desc, &next); \\\n            if (have == 0) { \\\n                next = Z_NULL; \\\n                ret = Z_BUF_ERROR; \\\n                goto inf_leave; \\\n            } \\\n        } \\\n    } while (0)\n\n/* Get a byte of input into the bit accumulator, or return from inflateBack()\n   with an error if there is no input available. */\n#define PULLBYTE() \\\n    do { \\\n        PULL(); \\\n        have--; \\\n        hold += (unsigned long)(*next++) << bits; \\\n        bits += 8; \\\n    } while (0)\n\n/* Assure that there are at least n bits in the bit accumulator.  If there is\n   not enough available input to do that, then return from inflateBack() with\n   an error. */\n#define NEEDBITS(n) \\\n    do { \\\n        while (bits < (unsigned)(n)) \\\n            PULLBYTE(); \\\n    } while (0)\n\n/* Return the low n bits of the bit accumulator (n < 16) */\n#define BITS(n) \\\n    ((unsigned)hold & ((1U << (n)) - 1))\n\n/* Remove n bits from the bit accumulator */\n#define DROPBITS(n) \\\n    do { \\\n        hold >>= (n); \\\n        bits -= (unsigned)(n); \\\n    } while (0)\n\n/* Remove zero to seven bits as needed to go to a byte boundary */\n#define BYTEBITS() \\\n    do { \\\n        hold >>= bits & 7; \\\n        bits -= bits & 7; \\\n    } while (0)\n\n/* Assure that some output space is available, by writing out the window\n   if it's full.  If the write fails, return from inflateBack() with a\n   Z_BUF_ERROR. */\n#define ROOM() \\\n    do { \\\n        if (left == 0) { \\\n            put = state->window; \\\n            left = state->wsize; \\\n            state->whave = left; \\\n            if (out(out_desc, put, left)) { \\\n                ret = Z_BUF_ERROR; \\\n                goto inf_leave; \\\n            } \\\n        } \\\n    } while (0)\n\n/*\n   strm provides the memory allocation functions and window buffer on input,\n   and provides information on the unused input on return.  For Z_DATA_ERROR\n   returns, strm will also provide an error message.\n\n   in() and out() are the call-back input and output functions.  When\n   inflateBack() needs more input, it calls in().  When inflateBack() has\n   filled the window with output, or when it completes with data in the\n   window, it calls out() to write out the data.  The application must not\n   change the provided input until in() is called again or inflateBack()\n   returns.  The application must not change the window/output buffer until\n   inflateBack() returns.\n\n   in() and out() are called with a descriptor parameter provided in the\n   inflateBack() call.  This parameter can be a structure that provides the\n   information required to do the read or write, as well as accumulated\n   information on the input and output such as totals and check values.\n\n   in() should return zero on failure.  out() should return non-zero on\n   failure.  If either in() or out() fails, than inflateBack() returns a\n   Z_BUF_ERROR.  strm->next_in can be checked for Z_NULL to see whether it\n   was in() or out() that caused in the error.  Otherwise,  inflateBack()\n   returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format\n   error, or Z_MEM_ERROR if it could not allocate memory for the state.\n   inflateBack() can also return Z_STREAM_ERROR if the input parameters\n   are not correct, i.e. strm is Z_NULL or the state was not initialized.\n */\nint ZEXPORT inflateBack(\nz_streamp strm,\nin_func in,\nvoid FAR *in_desc,\nout_func out,\nvoid FAR *out_desc)\n{\n    struct inflate_state FAR *state;\n    z_const unsigned char FAR *next;    /* next input */\n    unsigned char FAR *put;     /* next output */\n    unsigned have, left;        /* available input and output */\n    unsigned long hold;         /* bit buffer */\n    unsigned bits;              /* bits in bit buffer */\n    unsigned copy;              /* number of stored or match bytes to copy */\n    unsigned char FAR *from;    /* where to copy match bytes from */\n    code here;                  /* current decoding table entry */\n    code last;                  /* parent table entry */\n    unsigned len;               /* length to copy for repeats, bits to drop */\n    int ret;                    /* return code */\n    static const unsigned short order[19] = /* permutation of code lengths */\n        {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};\n\n    /* Check that the strm exists and that the state was initialized */\n    if (strm == Z_NULL || strm->state == Z_NULL)\n        return Z_STREAM_ERROR;\n    state = (struct inflate_state FAR *)strm->state;\n\n    /* Reset the state */\n    strm->msg = Z_NULL;\n    state->mode = TYPE;\n    state->last = 0;\n    state->whave = 0;\n    next = strm->next_in;\n    have = next != Z_NULL ? strm->avail_in : 0;\n    hold = 0;\n    bits = 0;\n    put = state->window;\n    left = state->wsize;\n\n    /* Inflate until end of block marked as last */\n    for (;;)\n        switch (state->mode) {\n        case TYPE:\n            /* determine and dispatch block type */\n            if (state->last) {\n                BYTEBITS();\n                state->mode = DONE;\n                break;\n            }\n            NEEDBITS(3);\n            state->last = BITS(1);\n            DROPBITS(1);\n            switch (BITS(2)) {\n            case 0:                             /* stored block */\n                Tracev((stderr, \"inflate:     stored block%s\\n\",\n                        state->last ? \" (last)\" : \"\"));\n                state->mode = STORED;\n                break;\n            case 1:                             /* fixed block */\n                fixedtables(state);\n                Tracev((stderr, \"inflate:     fixed codes block%s\\n\",\n                        state->last ? \" (last)\" : \"\"));\n                state->mode = LEN;              /* decode codes */\n                break;\n            case 2:                             /* dynamic block */\n                Tracev((stderr, \"inflate:     dynamic codes block%s\\n\",\n                        state->last ? \" (last)\" : \"\"));\n                state->mode = TABLE;\n                break;\n            case 3:\n                strm->msg = (char *)\"invalid block type\";\n                state->mode = BAD;\n            }\n            DROPBITS(2);\n            break;\n\n        case STORED:\n            /* get and verify stored block length */\n            BYTEBITS();                         /* go to byte boundary */\n            NEEDBITS(32);\n            if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {\n                strm->msg = (char *)\"invalid stored block lengths\";\n                state->mode = BAD;\n                break;\n            }\n            state->length = (unsigned)hold & 0xffff;\n            Tracev((stderr, \"inflate:       stored length %u\\n\",\n                    state->length));\n            INITBITS();\n\n            /* copy stored block from input to output */\n            while (state->length != 0) {\n                copy = state->length;\n                PULL();\n                ROOM();\n                if (copy > have) copy = have;\n                if (copy > left) copy = left;\n                zmemcpy(put, next, copy);\n                have -= copy;\n                next += copy;\n                left -= copy;\n                put += copy;\n                state->length -= copy;\n            }\n            Tracev((stderr, \"inflate:       stored end\\n\"));\n            state->mode = TYPE;\n            break;\n\n        case TABLE:\n            /* get dynamic table entries descriptor */\n            NEEDBITS(14);\n            state->nlen = BITS(5) + 257;\n            DROPBITS(5);\n            state->ndist = BITS(5) + 1;\n            DROPBITS(5);\n            state->ncode = BITS(4) + 4;\n            DROPBITS(4);\n#ifndef PKZIP_BUG_WORKAROUND\n            if (state->nlen > 286 || state->ndist > 30) {\n                strm->msg = (char *)\"too many length or distance symbols\";\n                state->mode = BAD;\n                break;\n            }\n#endif\n            Tracev((stderr, \"inflate:       table sizes ok\\n\"));\n\n            /* get code length code lengths (not a typo) */\n            state->have = 0;\n            while (state->have < state->ncode) {\n                NEEDBITS(3);\n                state->lens[order[state->have++]] = (unsigned short)BITS(3);\n                DROPBITS(3);\n            }\n            while (state->have < 19)\n                state->lens[order[state->have++]] = 0;\n            state->next = state->codes;\n            state->lencode = (code const FAR *)(state->next);\n            state->lenbits = 7;\n            ret = inflate_table(CODES, state->lens, 19, &(state->next),\n                                &(state->lenbits), state->work);\n            if (ret) {\n                strm->msg = (char *)\"invalid code lengths set\";\n                state->mode = BAD;\n                break;\n            }\n            Tracev((stderr, \"inflate:       code lengths ok\\n\"));\n\n            /* get length and distance code code lengths */\n            state->have = 0;\n            while (state->have < state->nlen + state->ndist) {\n                for (;;) {\n                    here = state->lencode[BITS(state->lenbits)];\n                    if ((unsigned)(here.bits) <= bits) break;\n                    PULLBYTE();\n                }\n                if (here.val < 16) {\n                    DROPBITS(here.bits);\n                    state->lens[state->have++] = here.val;\n                }\n                else {\n                    if (here.val == 16) {\n                        NEEDBITS(here.bits + 2);\n                        DROPBITS(here.bits);\n                        if (state->have == 0) {\n                            strm->msg = (char *)\"invalid bit length repeat\";\n                            state->mode = BAD;\n                            break;\n                        }\n                        len = (unsigned)(state->lens[state->have - 1]);\n                        copy = 3 + BITS(2);\n                        DROPBITS(2);\n                    }\n                    else if (here.val == 17) {\n                        NEEDBITS(here.bits + 3);\n                        DROPBITS(here.bits);\n                        len = 0;\n                        copy = 3 + BITS(3);\n                        DROPBITS(3);\n                    }\n                    else {\n                        NEEDBITS(here.bits + 7);\n                        DROPBITS(here.bits);\n                        len = 0;\n                        copy = 11 + BITS(7);\n                        DROPBITS(7);\n                    }\n                    if (state->have + copy > state->nlen + state->ndist) {\n                        strm->msg = (char *)\"invalid bit length repeat\";\n                        state->mode = BAD;\n                        break;\n                    }\n                    while (copy--)\n                        state->lens[state->have++] = (unsigned short)len;\n                }\n            }\n\n            /* handle error breaks in while */\n            if (state->mode == BAD) break;\n\n            /* check for end-of-block code (better have one) */\n            if (state->lens[256] == 0) {\n                strm->msg = (char *)\"invalid code -- missing end-of-block\";\n                state->mode = BAD;\n                break;\n            }\n\n            /* build code tables -- note: do not change the lenbits or distbits\n               values here (9 and 6) without reading the comments in inftrees.h\n               concerning the ENOUGH constants, which depend on those values */\n            state->next = state->codes;\n            state->lencode = (code const FAR *)(state->next);\n            state->lenbits = 9;\n            ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),\n                                &(state->lenbits), state->work);\n            if (ret) {\n                strm->msg = (char *)\"invalid literal/lengths set\";\n                state->mode = BAD;\n                break;\n            }\n            state->distcode = (code const FAR *)(state->next);\n            state->distbits = 6;\n            ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,\n                            &(state->next), &(state->distbits), state->work);\n            if (ret) {\n                strm->msg = (char *)\"invalid distances set\";\n                state->mode = BAD;\n                break;\n            }\n            Tracev((stderr, \"inflate:       codes ok\\n\"));\n            state->mode = LEN;\n\n        case LEN:\n            /* use inflate_fast() if we have enough input and output */\n            if (have >= 6 && left >= 258) {\n                RESTORE();\n                if (state->whave < state->wsize)\n                    state->whave = state->wsize - left;\n                inflate_fast(strm, state->wsize);\n                LOAD();\n                break;\n            }\n\n            /* get a literal, length, or end-of-block code */\n            for (;;) {\n                here = state->lencode[BITS(state->lenbits)];\n                if ((unsigned)(here.bits) <= bits) break;\n                PULLBYTE();\n            }\n            if (here.op && (here.op & 0xf0) == 0) {\n                last = here;\n                for (;;) {\n                    here = state->lencode[last.val +\n                            (BITS(last.bits + last.op) >> last.bits)];\n                    if ((unsigned)(last.bits + here.bits) <= bits) break;\n                    PULLBYTE();\n                }\n                DROPBITS(last.bits);\n            }\n            DROPBITS(here.bits);\n            state->length = (unsigned)here.val;\n\n            /* process literal */\n            if (here.op == 0) {\n                Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n                        \"inflate:         literal '%c'\\n\" :\n                        \"inflate:         literal 0x%02x\\n\", here.val));\n                ROOM();\n                *put++ = (unsigned char)(state->length);\n                left--;\n                state->mode = LEN;\n                break;\n            }\n\n            /* process end of block */\n            if (here.op & 32) {\n                Tracevv((stderr, \"inflate:         end of block\\n\"));\n                state->mode = TYPE;\n                break;\n            }\n\n            /* invalid code */\n            if (here.op & 64) {\n                strm->msg = (char *)\"invalid literal/length code\";\n                state->mode = BAD;\n                break;\n            }\n\n            /* length code -- get extra bits, if any */\n            state->extra = (unsigned)(here.op) & 15;\n            if (state->extra != 0) {\n                NEEDBITS(state->extra);\n                state->length += BITS(state->extra);\n                DROPBITS(state->extra);\n            }\n            Tracevv((stderr, \"inflate:         length %u\\n\", state->length));\n\n            /* get distance code */\n            for (;;) {\n                here = state->distcode[BITS(state->distbits)];\n                if ((unsigned)(here.bits) <= bits) break;\n                PULLBYTE();\n            }\n            if ((here.op & 0xf0) == 0) {\n                last = here;\n                for (;;) {\n                    here = state->distcode[last.val +\n                            (BITS(last.bits + last.op) >> last.bits)];\n                    if ((unsigned)(last.bits + here.bits) <= bits) break;\n                    PULLBYTE();\n                }\n                DROPBITS(last.bits);\n            }\n            DROPBITS(here.bits);\n            if (here.op & 64) {\n                strm->msg = (char *)\"invalid distance code\";\n                state->mode = BAD;\n                break;\n            }\n            state->offset = (unsigned)here.val;\n\n            /* get distance extra bits, if any */\n            state->extra = (unsigned)(here.op) & 15;\n            if (state->extra != 0) {\n                NEEDBITS(state->extra);\n                state->offset += BITS(state->extra);\n                DROPBITS(state->extra);\n            }\n            if (state->offset > state->wsize - (state->whave < state->wsize ?\n                                                left : 0)) {\n                strm->msg = (char *)\"invalid distance too far back\";\n                state->mode = BAD;\n                break;\n            }\n            Tracevv((stderr, \"inflate:         distance %u\\n\", state->offset));\n\n            /* copy match from window to output */\n            do {\n                ROOM();\n                copy = state->wsize - state->offset;\n                if (copy < left) {\n                    from = put + copy;\n                    copy = left - copy;\n                }\n                else {\n                    from = put - state->offset;\n                    copy = left;\n                }\n                if (copy > state->length) copy = state->length;\n                state->length -= copy;\n                left -= copy;\n                do {\n                    *put++ = *from++;\n                } while (--copy);\n            } while (state->length != 0);\n            break;\n\n        case DONE:\n            /* inflate stream terminated properly -- write leftover output */\n            ret = Z_STREAM_END;\n            if (left < state->wsize) {\n                if (out(out_desc, state->window, state->wsize - left))\n                    ret = Z_BUF_ERROR;\n            }\n            goto inf_leave;\n\n        case BAD:\n            ret = Z_DATA_ERROR;\n            goto inf_leave;\n\n        default:                /* can't happen, but makes compilers happy */\n            ret = Z_STREAM_ERROR;\n            goto inf_leave;\n        }\n\n    /* Return unused input */\n  inf_leave:\n    strm->next_in = next;\n    strm->avail_in = have;\n    return ret;\n}\n\nint ZEXPORT inflateBackEnd(\nz_streamp strm)\n{\n    if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)\n        return Z_STREAM_ERROR;\n    ZFREE(strm, strm->state);\n    strm->state = Z_NULL;\n    Tracev((stderr, \"inflate: end\\n\"));\n    return Z_OK;\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_inffast.c",
    "content": "/* inffast.c -- fast decoding\n * Copyright (C) 1995-2008, 2010, 2013 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n#include \"zutil.h\"\n#include \"inftrees.h\"\n#include \"inflate.h\"\n#include \"inffast.h\"\n\n#ifndef ASMINF\n\n/* Allow machine dependent optimization for post-increment or pre-increment.\n   Based on testing to date,\n   Pre-increment preferred for:\n   - PowerPC G3 (Adler)\n   - MIPS R5000 (Randers-Pehrson)\n   Post-increment preferred for:\n   - none\n   No measurable difference:\n   - Pentium III (Anderson)\n   - M68060 (Nikl)\n */\n#ifdef POSTINC\n#  define OFF 0\n#  define PUP(a) *(a)++\n#else\n#  define OFF 1\n#  define PUP(a) *++(a)\n#endif\n\n/*\n   Decode literal, length, and distance codes and write out the resulting\n   literal and match bytes until either not enough input or output is\n   available, an end-of-block is encountered, or a data error is encountered.\n   When large enough input and output buffers are supplied to inflate(), for\n   example, a 16K input buffer and a 64K output buffer, more than 95% of the\n   inflate execution time is spent in this routine.\n\n   Entry assumptions:\n\n        state->mode == LEN\n        strm->avail_in >= 6\n        strm->avail_out >= 258\n        start >= strm->avail_out\n        state->bits < 8\n\n   On return, state->mode is one of:\n\n        LEN -- ran out of enough output space or enough available input\n        TYPE -- reached end of block code, inflate() to interpret next block\n        BAD -- error in block data\n\n   Notes:\n\n    - The maximum input bits used by a length/distance pair is 15 bits for the\n      length code, 5 bits for the length extra, 15 bits for the distance code,\n      and 13 bits for the distance extra.  This totals 48 bits, or six bytes.\n      Therefore if strm->avail_in >= 6, then there is enough input to avoid\n      checking for available input while decoding.\n\n    - The maximum bytes that a single length/distance pair can output is 258\n      bytes, which is the maximum length that can be coded.  inflate_fast()\n      requires strm->avail_out >= 258 for each loop to avoid checking for\n      output space.\n */\nvoid ZLIB_INTERNAL inflate_fast(\nz_streamp strm,\nunsigned start)         /* inflate()'s starting value for strm->avail_out */\n{\n    struct inflate_state FAR *state;\n    z_const unsigned char FAR *in;      /* local strm->next_in */\n    z_const unsigned char FAR *last;    /* have enough input while in < last */\n    unsigned char FAR *out;     /* local strm->next_out */\n    unsigned char FAR *beg;     /* inflate()'s initial strm->next_out */\n    unsigned char FAR *end;     /* while out < end, enough space available */\n#ifdef INFLATE_STRICT\n    unsigned dmax;              /* maximum distance from zlib header */\n#endif\n    unsigned wsize;             /* window size or zero if not using window */\n    unsigned whave;             /* valid bytes in the window */\n    unsigned wnext;             /* window write index */\n    unsigned char FAR *window;  /* allocated sliding window, if wsize != 0 */\n    unsigned long hold;         /* local strm->hold */\n    unsigned bits;              /* local strm->bits */\n    code const FAR *lcode;      /* local strm->lencode */\n    code const FAR *dcode;      /* local strm->distcode */\n    unsigned lmask;             /* mask for first level of length codes */\n    unsigned dmask;             /* mask for first level of distance codes */\n    code here;                  /* retrieved table entry */\n    unsigned op;                /* code bits, operation, extra bits, or */\n                                /*  window position, window bytes to copy */\n    unsigned len;               /* match length, unused bytes */\n    unsigned dist;              /* match distance */\n    unsigned char FAR *from;    /* where to copy match from */\n\n    /* copy state to local variables */\n    state = (struct inflate_state FAR *)strm->state;\n    in = strm->next_in - OFF;\n    last = in + (strm->avail_in - 5);\n    out = strm->next_out - OFF;\n    beg = out - (start - strm->avail_out);\n    end = out + (strm->avail_out - 257);\n#ifdef INFLATE_STRICT\n    dmax = state->dmax;\n#endif\n    wsize = state->wsize;\n    whave = state->whave;\n    wnext = state->wnext;\n    window = state->window;\n    hold = state->hold;\n    bits = state->bits;\n    lcode = state->lencode;\n    dcode = state->distcode;\n    lmask = (1U << state->lenbits) - 1;\n    dmask = (1U << state->distbits) - 1;\n\n    /* decode literals and length/distances until end-of-block or not enough\n       input data or output space */\n    do {\n        if (bits < 15) {\n            hold += (unsigned long)(PUP(in)) << bits;\n            bits += 8;\n            hold += (unsigned long)(PUP(in)) << bits;\n            bits += 8;\n        }\n        here = lcode[hold & lmask];\n      dolen:\n        op = (unsigned)(here.bits);\n        hold >>= op;\n        bits -= op;\n        op = (unsigned)(here.op);\n        if (op == 0) {                          /* literal */\n            Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n                    \"inflate:         literal '%c'\\n\" :\n                    \"inflate:         literal 0x%02x\\n\", here.val));\n            PUP(out) = (unsigned char)(here.val);\n        }\n        else if (op & 16) {                     /* length base */\n            len = (unsigned)(here.val);\n            op &= 15;                           /* number of extra bits */\n            if (op) {\n                if (bits < op) {\n                    hold += (unsigned long)(PUP(in)) << bits;\n                    bits += 8;\n                }\n                len += (unsigned)hold & ((1U << op) - 1);\n                hold >>= op;\n                bits -= op;\n            }\n            Tracevv((stderr, \"inflate:         length %u\\n\", len));\n            if (bits < 15) {\n                hold += (unsigned long)(PUP(in)) << bits;\n                bits += 8;\n                hold += (unsigned long)(PUP(in)) << bits;\n                bits += 8;\n            }\n            here = dcode[hold & dmask];\n          dodist:\n            op = (unsigned)(here.bits);\n            hold >>= op;\n            bits -= op;\n            op = (unsigned)(here.op);\n            if (op & 16) {                      /* distance base */\n                dist = (unsigned)(here.val);\n                op &= 15;                       /* number of extra bits */\n                if (bits < op) {\n                    hold += (unsigned long)(PUP(in)) << bits;\n                    bits += 8;\n                    if (bits < op) {\n                        hold += (unsigned long)(PUP(in)) << bits;\n                        bits += 8;\n                    }\n                }\n                dist += (unsigned)hold & ((1U << op) - 1);\n#ifdef INFLATE_STRICT\n                if (dist > dmax) {\n                    strm->msg = (char *)\"invalid distance too far back\";\n                    state->mode = BAD;\n                    break;\n                }\n#endif\n                hold >>= op;\n                bits -= op;\n                Tracevv((stderr, \"inflate:         distance %u\\n\", dist));\n                op = (unsigned)(out - beg);     /* max distance in output */\n                if (dist > op) {                /* see if copy from window */\n                    op = dist - op;             /* distance back in window */\n                    if (op > whave) {\n                        if (state->sane) {\n                            strm->msg =\n                                (char *)\"invalid distance too far back\";\n                            state->mode = BAD;\n                            break;\n                        }\n#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n                        if (len <= op - whave) {\n                            do {\n                                PUP(out) = 0;\n                            } while (--len);\n                            continue;\n                        }\n                        len -= op - whave;\n                        do {\n                            PUP(out) = 0;\n                        } while (--op > whave);\n                        if (op == 0) {\n                            from = out - dist;\n                            do {\n                                PUP(out) = PUP(from);\n                            } while (--len);\n                            continue;\n                        }\n#endif\n                    }\n                    from = window - OFF;\n                    if (wnext == 0) {           /* very common case */\n                        from += wsize - op;\n                        if (op < len) {         /* some from window */\n                            len -= op;\n                            do {\n                                PUP(out) = PUP(from);\n                            } while (--op);\n                            from = out - dist;  /* rest from output */\n                        }\n                    }\n                    else if (wnext < op) {      /* wrap around window */\n                        from += wsize + wnext - op;\n                        op -= wnext;\n                        if (op < len) {         /* some from end of window */\n                            len -= op;\n                            do {\n                                PUP(out) = PUP(from);\n                            } while (--op);\n                            from = window - OFF;\n                            if (wnext < len) {  /* some from start of window */\n                                op = wnext;\n                                len -= op;\n                                do {\n                                    PUP(out) = PUP(from);\n                                } while (--op);\n                                from = out - dist;      /* rest from output */\n                            }\n                        }\n                    }\n                    else {                      /* contiguous in window */\n                        from += wnext - op;\n                        if (op < len) {         /* some from window */\n                            len -= op;\n                            do {\n                                PUP(out) = PUP(from);\n                            } while (--op);\n                            from = out - dist;  /* rest from output */\n                        }\n                    }\n                    while (len > 2) {\n                        PUP(out) = PUP(from);\n                        PUP(out) = PUP(from);\n                        PUP(out) = PUP(from);\n                        len -= 3;\n                    }\n                    if (len) {\n                        PUP(out) = PUP(from);\n                        if (len > 1)\n                            PUP(out) = PUP(from);\n                    }\n                }\n                else {\n                    from = out - dist;          /* copy direct from output */\n                    do {                        /* minimum length is three */\n                        PUP(out) = PUP(from);\n                        PUP(out) = PUP(from);\n                        PUP(out) = PUP(from);\n                        len -= 3;\n                    } while (len > 2);\n                    if (len) {\n                        PUP(out) = PUP(from);\n                        if (len > 1)\n                            PUP(out) = PUP(from);\n                    }\n                }\n            }\n            else if ((op & 64) == 0) {          /* 2nd level distance code */\n                here = dcode[here.val + (hold & ((1U << op) - 1))];\n                goto dodist;\n            }\n            else {\n                strm->msg = (char *)\"invalid distance code\";\n                state->mode = BAD;\n                break;\n            }\n        }\n        else if ((op & 64) == 0) {              /* 2nd level length code */\n            here = lcode[here.val + (hold & ((1U << op) - 1))];\n            goto dolen;\n        }\n        else if (op & 32) {                     /* end-of-block */\n            Tracevv((stderr, \"inflate:         end of block\\n\"));\n            state->mode = TYPE;\n            break;\n        }\n        else {\n            strm->msg = (char *)\"invalid literal/length code\";\n            state->mode = BAD;\n            break;\n        }\n    } while (in < last && out < end);\n\n    /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n    len = bits >> 3;\n    in -= len;\n    bits -= len << 3;\n    hold &= (1U << bits) - 1;\n\n    /* update state and return */\n    strm->next_in = in + OFF;\n    strm->next_out = out + OFF;\n    strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last));\n    strm->avail_out = (unsigned)(out < end ?\n                                 257 + (end - out) : 257 - (out - end));\n    state->hold = hold;\n    state->bits = bits;\n    return;\n}\n\n/*\n   inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe):\n   - Using bit fields for code structure\n   - Different op definition to avoid & for extra bits (do & for table bits)\n   - Three separate decoding do-loops for direct, window, and wnext == 0\n   - Special case for distance > 1 copies to do overlapped load and store copy\n   - Explicit branch predictions (based on measured branch probabilities)\n   - Deferring match copy and interspersed it with decoding subsequent codes\n   - Swapping literal/length else\n   - Swapping window/direct else\n   - Larger unrolled copy loops (three is about right)\n   - Moving len -= 3 statement into middle of loop\n */\n\n#endif /* !ASMINF */\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_inflate.c",
    "content": "/* inflate.c -- zlib decompression\n * Copyright (C) 1995-2012 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/*\n * Change history:\n *\n * 1.2.beta0    24 Nov 2002\n * - First version -- complete rewrite of inflate to simplify code, avoid\n *   creation of window when not needed, minimize use of window when it is\n *   needed, make inffast.c even faster, implement gzip decoding, and to\n *   improve code readability and style over the previous zlib inflate code\n *\n * 1.2.beta1    25 Nov 2002\n * - Use pointers for available input and output checking in inffast.c\n * - Remove input and output counters in inffast.c\n * - Change inffast.c entry and loop from avail_in >= 7 to >= 6\n * - Remove unnecessary second byte pull from length extra in inffast.c\n * - Unroll direct copy to three copies per loop in inffast.c\n *\n * 1.2.beta2    4 Dec 2002\n * - Change external routine names to reduce potential conflicts\n * - Correct filename to inffixed.h for fixed tables in inflate.c\n * - Make hbuf[] unsigned char to match parameter type in inflate.c\n * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset)\n *   to avoid negation problem on Alphas (64 bit) in inflate.c\n *\n * 1.2.beta3    22 Dec 2002\n * - Add comments on state->bits assertion in inffast.c\n * - Add comments on op field in inftrees.h\n * - Fix bug in reuse of allocated window after inflateReset()\n * - Remove bit fields--back to byte structure for speed\n * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths\n * - Change post-increments to pre-increments in inflate_fast(), PPC biased?\n * - Add compile time option, POSTINC, to use post-increments instead (Intel?)\n * - Make MATCH copy in inflate() much faster for when inflate_fast() not used\n * - Use local copies of stream next and avail values, as well as local bit\n *   buffer and bit count in inflate()--for speed when inflate_fast() not used\n *\n * 1.2.beta4    1 Jan 2003\n * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings\n * - Move a comment on output buffer sizes from inffast.c to inflate.c\n * - Add comments in inffast.c to introduce the inflate_fast() routine\n * - Rearrange window copies in inflate_fast() for speed and simplification\n * - Unroll last copy for window match in inflate_fast()\n * - Use local copies of window variables in inflate_fast() for speed\n * - Pull out common wnext == 0 case for speed in inflate_fast()\n * - Make op and len in inflate_fast() unsigned for consistency\n * - Add FAR to lcode and dcode declarations in inflate_fast()\n * - Simplified bad distance check in inflate_fast()\n * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new\n *   source file infback.c to provide a call-back interface to inflate for\n *   programs like gzip and unzip -- uses window as output buffer to avoid\n *   window copying\n *\n * 1.2.beta5    1 Jan 2003\n * - Improved inflateBack() interface to allow the caller to provide initial\n *   input in strm.\n * - Fixed stored blocks bug in inflateBack()\n *\n * 1.2.beta6    4 Jan 2003\n * - Added comments in inffast.c on effectiveness of POSTINC\n * - Typecasting all around to reduce compiler warnings\n * - Changed loops from while (1) or do {} while (1) to for (;;), again to\n *   make compilers happy\n * - Changed type of window in inflateBackInit() to unsigned char *\n *\n * 1.2.beta7    27 Jan 2003\n * - Changed many types to unsigned or unsigned short to avoid warnings\n * - Added inflateCopy() function\n *\n * 1.2.0        9 Mar 2003\n * - Changed inflateBack() interface to provide separate opaque descriptors\n *   for the in() and out() functions\n * - Changed inflateBack() argument and in_func typedef to swap the length\n *   and buffer address return values for the input function\n * - Check next_in and next_out for Z_NULL on entry to inflate()\n *\n * The history for versions after 1.2.0 are in ChangeLog in zlib distribution.\n */\n\n#include \"zutil.h\"\n#include \"inftrees.h\"\n#include \"inflate.h\"\n#include \"inffast.h\"\n\n#ifdef MAKEFIXED\n#  ifndef BUILDFIXED\n#    define BUILDFIXED\n#  endif\n#endif\n\n/* function prototypes */\nlocal void fixedtables OF((struct inflate_state FAR *state));\nlocal int updatewindow OF((z_streamp strm, const unsigned char FAR *end,\n                           unsigned copy));\n#ifdef BUILDFIXED\n   void makefixed OF((void));\n#endif\nlocal unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf,\n                              unsigned len));\n\nint ZEXPORT inflateResetKeep(\nz_streamp strm)\n{\n    struct inflate_state FAR *state;\n\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n    state = (struct inflate_state FAR *)strm->state;\n    strm->total_in = strm->total_out = state->total = 0;\n    strm->msg = Z_NULL;\n    if (state->wrap)        /* to support ill-conceived Java test suite */\n        strm->adler = state->wrap & 1;\n    state->mode = HEAD;\n    state->last = 0;\n    state->havedict = 0;\n    state->dmax = 32768U;\n    state->head = Z_NULL;\n    state->hold = 0;\n    state->bits = 0;\n    state->lencode = state->distcode = state->next = state->codes;\n    state->sane = 1;\n    state->back = -1;\n    Tracev((stderr, \"inflate: reset\\n\"));\n    return Z_OK;\n}\n\nint ZEXPORT inflateReset(\nz_streamp strm)\n{\n    struct inflate_state FAR *state;\n\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n    state = (struct inflate_state FAR *)strm->state;\n    state->wsize = 0;\n    state->whave = 0;\n    state->wnext = 0;\n    return inflateResetKeep(strm);\n}\n\nint ZEXPORT inflateReset2(\nz_streamp strm,\nint windowBits)\n{\n    int wrap;\n    struct inflate_state FAR *state;\n\n    /* get the state */\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n    state = (struct inflate_state FAR *)strm->state;\n\n    /* extract wrap request from windowBits parameter */\n    if (windowBits < 0) {\n        wrap = 0;\n        windowBits = -windowBits;\n    }\n    else {\n        wrap = (windowBits >> 4) + 1;\n#ifdef GUNZIP\n        if (windowBits < 48)\n            windowBits &= 15;\n#endif\n    }\n\n    /* set number of window bits, free window if different */\n    if (windowBits && (windowBits < 8 || windowBits > 15))\n        return Z_STREAM_ERROR;\n    if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) {\n        ZFREE(strm, state->window);\n        state->window = Z_NULL;\n    }\n\n    /* update state and reset the rest of it */\n    state->wrap = wrap;\n    state->wbits = (unsigned)windowBits;\n    return inflateReset(strm);\n}\n\nint ZEXPORT inflateInit2_(\nz_streamp strm,\nint windowBits,\nconst char *version,\nint stream_size)\n{\n    int ret;\n    struct inflate_state FAR *state;\n\n    if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||\n        stream_size != (int)(sizeof(z_stream)))\n        return Z_VERSION_ERROR;\n    if (strm == Z_NULL) return Z_STREAM_ERROR;\n    strm->msg = Z_NULL;                 /* in case we return an error */\n    if (strm->zalloc == (alloc_func)0) {\n#ifdef Z_SOLO\n        return Z_STREAM_ERROR;\n#else\n        strm->zalloc = zcalloc;\n        strm->opaque = (voidpf)0;\n#endif\n    }\n    if (strm->zfree == (free_func)0)\n#ifdef Z_SOLO\n        return Z_STREAM_ERROR;\n#else\n        strm->zfree = zcfree;\n#endif\n    state = (struct inflate_state FAR *)\n            ZALLOC(strm, 1, sizeof(struct inflate_state));\n    if (state == Z_NULL) return Z_MEM_ERROR;\n    Tracev((stderr, \"inflate: allocated\\n\"));\n    strm->state = (struct internal_state FAR *)state;\n    state->window = Z_NULL;\n    ret = inflateReset2(strm, windowBits);\n    if (ret != Z_OK) {\n        ZFREE(strm, state);\n        strm->state = Z_NULL;\n    }\n    return ret;\n}\n\nint ZEXPORT inflateInit_(\nz_streamp strm,\nconst char *version,\nint stream_size)\n{\n    return inflateInit2_(strm, DEF_WBITS, version, stream_size);\n}\n\nint ZEXPORT inflatePrime(\nz_streamp strm,\nint bits,\nint value)\n{\n    struct inflate_state FAR *state;\n\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n    state = (struct inflate_state FAR *)strm->state;\n    if (bits < 0) {\n        state->hold = 0;\n        state->bits = 0;\n        return Z_OK;\n    }\n    if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR;\n    value &= (1L << bits) - 1;\n    state->hold += value << state->bits;\n    state->bits += bits;\n    return Z_OK;\n}\n\n/*\n   Return state with length and distance decoding tables and index sizes set to\n   fixed code decoding.  Normally this returns fixed tables from inffixed.h.\n   If BUILDFIXED is defined, then instead this routine builds the tables the\n   first time it's called, and returns those tables the first time and\n   thereafter.  This reduces the size of the code by about 2K bytes, in\n   exchange for a little execution time.  However, BUILDFIXED should not be\n   used for threaded applications, since the rewriting of the tables and virgin\n   may not be thread-safe.\n */\nlocal void fixedtables(\nstruct inflate_state FAR *state)\n{\n#ifdef BUILDFIXED\n    static int virgin = 1;\n    static code *lenfix, *distfix;\n    static code fixed[544];\n\n    /* build fixed huffman tables if first call (may not be thread safe) */\n    if (virgin) {\n        unsigned sym, bits;\n        static code *next;\n\n        /* literal/length table */\n        sym = 0;\n        while (sym < 144) state->lens[sym++] = 8;\n        while (sym < 256) state->lens[sym++] = 9;\n        while (sym < 280) state->lens[sym++] = 7;\n        while (sym < 288) state->lens[sym++] = 8;\n        next = fixed;\n        lenfix = next;\n        bits = 9;\n        inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);\n\n        /* distance table */\n        sym = 0;\n        while (sym < 32) state->lens[sym++] = 5;\n        distfix = next;\n        bits = 5;\n        inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);\n\n        /* do this just once */\n        virgin = 0;\n    }\n#else /* !BUILDFIXED */\n#   include \"inffixed.h\"\n#endif /* BUILDFIXED */\n    state->lencode = lenfix;\n    state->lenbits = 9;\n    state->distcode = distfix;\n    state->distbits = 5;\n}\n\n#ifdef MAKEFIXED\n#include <stdio.h>\n\n/*\n   Write out the inffixed.h that is #include'd above.  Defining MAKEFIXED also\n   defines BUILDFIXED, so the tables are built on the fly.  makefixed() writes\n   those tables to stdout, which would be piped to inffixed.h.  A small program\n   can simply call makefixed to do this:\n\n    void makefixed(void);\n\n    int main(void)\n    {\n        makefixed();\n        return 0;\n    }\n\n   Then that can be linked with zlib built with MAKEFIXED defined and run:\n\n    a.out > inffixed.h\n */\nvoid makefixed()\n{\n    unsigned low, size;\n    struct inflate_state state;\n\n    fixedtables(&state);\n    puts(\"    /* inffixed.h -- table for decoding fixed codes\");\n    puts(\"     * Generated automatically by makefixed().\");\n    puts(\"     */\");\n    puts(\"\");\n    puts(\"    /* WARNING: this file should *not* be used by applications.\");\n    puts(\"       It is part of the implementation of this library and is\");\n    puts(\"       subject to change. Applications should only use zlib.h.\");\n    puts(\"     */\");\n    puts(\"\");\n    size = 1U << 9;\n    printf(\"    static const code lenfix[%u] = {\", size);\n    low = 0;\n    for (;;) {\n        if ((low % 7) == 0) printf(\"\\n        \");\n        printf(\"{%u,%u,%d}\", (low & 127) == 99 ? 64 : state.lencode[low].op,\n               state.lencode[low].bits, state.lencode[low].val);\n        if (++low == size) break;\n        putchar(',');\n    }\n    puts(\"\\n    };\");\n    size = 1U << 5;\n    printf(\"\\n    static const code distfix[%u] = {\", size);\n    low = 0;\n    for (;;) {\n        if ((low % 6) == 0) printf(\"\\n        \");\n        printf(\"{%u,%u,%d}\", state.distcode[low].op, state.distcode[low].bits,\n               state.distcode[low].val);\n        if (++low == size) break;\n        putchar(',');\n    }\n    puts(\"\\n    };\");\n}\n#endif /* MAKEFIXED */\n\n/*\n   Update the window with the last wsize (normally 32K) bytes written before\n   returning.  If window does not exist yet, create it.  This is only called\n   when a window is already in use, or when output has been written during this\n   inflate call, but the end of the deflate stream has not been reached yet.\n   It is also called to create a window for dictionary data when a dictionary\n   is loaded.\n\n   Providing output buffers larger than 32K to inflate() should provide a speed\n   advantage, since only the last 32K of output is copied to the sliding window\n   upon return from inflate(), and since all distances after the first 32K of\n   output will fall in the output data, making match copies simpler and faster.\n   The advantage may be dependent on the size of the processor's data caches.\n */\nlocal int updatewindow(\nz_streamp strm,\nconst Bytef *end,\nunsigned copy)\n{\n    struct inflate_state FAR *state;\n    unsigned dist;\n\n    state = (struct inflate_state FAR *)strm->state;\n\n    /* if it hasn't been done already, allocate space for the window */\n    if (state->window == Z_NULL) {\n        state->window = (unsigned char FAR *)\n                        ZALLOC(strm, 1U << state->wbits,\n                               sizeof(unsigned char));\n        if (state->window == Z_NULL) return 1;\n    }\n\n    /* if window not in use yet, initialize */\n    if (state->wsize == 0) {\n        state->wsize = 1U << state->wbits;\n        state->wnext = 0;\n        state->whave = 0;\n    }\n\n    /* copy state->wsize or less output bytes into the circular window */\n    if (copy >= state->wsize) {\n        zmemcpy(state->window, end - state->wsize, state->wsize);\n        state->wnext = 0;\n        state->whave = state->wsize;\n    }\n    else {\n        dist = state->wsize - state->wnext;\n        if (dist > copy) dist = copy;\n        zmemcpy(state->window + state->wnext, end - copy, dist);\n        copy -= dist;\n        if (copy) {\n            zmemcpy(state->window, end - copy, copy);\n            state->wnext = copy;\n            state->whave = state->wsize;\n        }\n        else {\n            state->wnext += dist;\n            if (state->wnext == state->wsize) state->wnext = 0;\n            if (state->whave < state->wsize) state->whave += dist;\n        }\n    }\n    return 0;\n}\n\n/* Macros for inflate(): */\n\n/* check function to use adler32() for zlib or crc32() for gzip */\n#ifdef GUNZIP\n#  define UPDATE(check, buf, len) \\\n    (state->flags ? crc32(check, buf, len) : adler32(check, buf, len))\n#else\n#  define UPDATE(check, buf, len) adler32(check, buf, len)\n#endif\n\n/* check macros for header crc */\n#ifdef GUNZIP\n#  define CRC2(check, word) \\\n    do { \\\n        hbuf[0] = (unsigned char)(word); \\\n        hbuf[1] = (unsigned char)((word) >> 8); \\\n        check = crc32(check, hbuf, 2); \\\n    } while (0)\n\n#  define CRC4(check, word) \\\n    do { \\\n        hbuf[0] = (unsigned char)(word); \\\n        hbuf[1] = (unsigned char)((word) >> 8); \\\n        hbuf[2] = (unsigned char)((word) >> 16); \\\n        hbuf[3] = (unsigned char)((word) >> 24); \\\n        check = crc32(check, hbuf, 4); \\\n    } while (0)\n#endif\n\n/* Load registers with state in inflate() for speed */\n#define LOAD() \\\n    do { \\\n        put = strm->next_out; \\\n        left = strm->avail_out; \\\n        next = strm->next_in; \\\n        have = strm->avail_in; \\\n        hold = state->hold; \\\n        bits = state->bits; \\\n    } while (0)\n\n/* Restore state from registers in inflate() */\n#define RESTORE() \\\n    do { \\\n        strm->next_out = put; \\\n        strm->avail_out = left; \\\n        strm->next_in = next; \\\n        strm->avail_in = have; \\\n        state->hold = hold; \\\n        state->bits = bits; \\\n    } while (0)\n\n/* Clear the input bit accumulator */\n#define INITBITS() \\\n    do { \\\n        hold = 0; \\\n        bits = 0; \\\n    } while (0)\n\n/* Get a byte of input into the bit accumulator, or return from inflate()\n   if there is no input available. */\n#define PULLBYTE() \\\n    do { \\\n        if (have == 0) goto inf_leave; \\\n        have--; \\\n        hold += (unsigned long)(*next++) << bits; \\\n        bits += 8; \\\n    } while (0)\n\n/* Assure that there are at least n bits in the bit accumulator.  If there is\n   not enough available input to do that, then return from inflate(). */\n#define NEEDBITS(n) \\\n    do { \\\n        while (bits < (unsigned)(n)) \\\n            PULLBYTE(); \\\n    } while (0)\n\n/* Return the low n bits of the bit accumulator (n < 16) */\n#define BITS(n) \\\n    ((unsigned)hold & ((1U << (n)) - 1))\n\n/* Remove n bits from the bit accumulator */\n#define DROPBITS(n) \\\n    do { \\\n        hold >>= (n); \\\n        bits -= (unsigned)(n); \\\n    } while (0)\n\n/* Remove zero to seven bits as needed to go to a byte boundary */\n#define BYTEBITS() \\\n    do { \\\n        hold >>= bits & 7; \\\n        bits -= bits & 7; \\\n    } while (0)\n\n/*\n   inflate() uses a state machine to process as much input data and generate as\n   much output data as possible before returning.  The state machine is\n   structured roughly as follows:\n\n    for (;;) switch (state) {\n    ...\n    case STATEn:\n        if (not enough input data or output space to make progress)\n            return;\n        ... make progress ...\n        state = STATEm;\n        break;\n    ...\n    }\n\n   so when inflate() is called again, the same case is attempted again, and\n   if the appropriate resources are provided, the machine proceeds to the\n   next state.  The NEEDBITS() macro is usually the way the state evaluates\n   whether it can proceed or should return.  NEEDBITS() does the return if\n   the requested bits are not available.  The typical use of the BITS macros\n   is:\n\n        NEEDBITS(n);\n        ... do something with BITS(n) ...\n        DROPBITS(n);\n\n   where NEEDBITS(n) either returns from inflate() if there isn't enough\n   input left to load n bits into the accumulator, or it continues.  BITS(n)\n   gives the low n bits in the accumulator.  When done, DROPBITS(n) drops\n   the low n bits off the accumulator.  INITBITS() clears the accumulator\n   and sets the number of available bits to zero.  BYTEBITS() discards just\n   enough bits to put the accumulator on a byte boundary.  After BYTEBITS()\n   and a NEEDBITS(8), then BITS(8) would return the next byte in the stream.\n\n   NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return\n   if there is no input available.  The decoding of variable length codes uses\n   PULLBYTE() directly in order to pull just enough bytes to decode the next\n   code, and no more.\n\n   Some states loop until they get enough input, making sure that enough\n   state information is maintained to continue the loop where it left off\n   if NEEDBITS() returns in the loop.  For example, want, need, and keep\n   would all have to actually be part of the saved state in case NEEDBITS()\n   returns:\n\n    case STATEw:\n        while (want < need) {\n            NEEDBITS(n);\n            keep[want++] = BITS(n);\n            DROPBITS(n);\n        }\n        state = STATEx;\n    case STATEx:\n\n   As shown above, if the next state is also the next case, then the break\n   is omitted.\n\n   A state may also return if there is not enough output space available to\n   complete that state.  Those states are copying stored data, writing a\n   literal byte, and copying a matching string.\n\n   When returning, a \"goto inf_leave\" is used to update the total counters,\n   update the check value, and determine whether any progress has been made\n   during that inflate() call in order to return the proper return code.\n   Progress is defined as a change in either strm->avail_in or strm->avail_out.\n   When there is a window, goto inf_leave will update the window with the last\n   output written.  If a goto inf_leave occurs in the middle of decompression\n   and there is no window currently, goto inf_leave will create one and copy\n   output to the window for the next call of inflate().\n\n   In this implementation, the flush parameter of inflate() only affects the\n   return code (per zlib.h).  inflate() always writes as much as possible to\n   strm->next_out, given the space available and the provided input--the effect\n   documented in zlib.h of Z_SYNC_FLUSH.  Furthermore, inflate() always defers\n   the allocation of and copying into a sliding window until necessary, which\n   provides the effect documented in zlib.h for Z_FINISH when the entire input\n   stream available.  So the only thing the flush parameter actually does is:\n   when flush is set to Z_FINISH, inflate() cannot return Z_OK.  Instead it\n   will return Z_BUF_ERROR if it has not reached the end of the stream.\n */\n\nint ZEXPORT inflate(\nz_streamp strm,\nint flush)\n{\n    struct inflate_state FAR *state;\n    z_const unsigned char FAR *next;    /* next input */\n    unsigned char FAR *put;     /* next output */\n    unsigned have, left;        /* available input and output */\n    unsigned long hold;         /* bit buffer */\n    unsigned bits;              /* bits in bit buffer */\n    unsigned in, out;           /* save starting available input and output */\n    unsigned copy;              /* number of stored or match bytes to copy */\n    unsigned char FAR *from;    /* where to copy match bytes from */\n    code here;                  /* current decoding table entry */\n    code last;                  /* parent table entry */\n    unsigned len;               /* length to copy for repeats, bits to drop */\n    int ret;                    /* return code */\n#ifdef GUNZIP\n    unsigned char hbuf[4];      /* buffer for gzip header crc calculation */\n#endif\n    static const unsigned short order[19] = /* permutation of code lengths */\n        {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};\n\n    if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL ||\n        (strm->next_in == Z_NULL && strm->avail_in != 0))\n        return Z_STREAM_ERROR;\n\n    state = (struct inflate_state FAR *)strm->state;\n    if (state->mode == TYPE) state->mode = TYPEDO;      /* skip check */\n    LOAD();\n    in = have;\n    out = left;\n    ret = Z_OK;\n    for (;;)\n        switch (state->mode) {\n        case HEAD:\n            if (state->wrap == 0) {\n                state->mode = TYPEDO;\n                break;\n            }\n            NEEDBITS(16);\n#ifdef GUNZIP\n            if ((state->wrap & 2) && hold == 0x8b1f) {  /* gzip header */\n                state->check = crc32(0L, Z_NULL, 0);\n                CRC2(state->check, hold);\n                INITBITS();\n                state->mode = FLAGS;\n                break;\n            }\n            state->flags = 0;           /* expect zlib header */\n            if (state->head != Z_NULL)\n                state->head->done = -1;\n            if (!(state->wrap & 1) ||   /* check if zlib header allowed */\n#else\n            if (\n#endif\n                ((BITS(8) << 8) + (hold >> 8)) % 31) {\n                strm->msg = (char *)\"incorrect header check\";\n                state->mode = BAD;\n                break;\n            }\n            if (BITS(4) != Z_DEFLATED) {\n                strm->msg = (char *)\"unknown compression method\";\n                state->mode = BAD;\n                break;\n            }\n            DROPBITS(4);\n            len = BITS(4) + 8;\n            if (state->wbits == 0)\n                state->wbits = len;\n            else if (len > state->wbits) {\n                strm->msg = (char *)\"invalid window size\";\n                state->mode = BAD;\n                break;\n            }\n            state->dmax = 1U << len;\n            Tracev((stderr, \"inflate:   zlib header ok\\n\"));\n            strm->adler = state->check = adler32(0L, Z_NULL, 0);\n            state->mode = hold & 0x200 ? DICTID : TYPE;\n            INITBITS();\n            break;\n#ifdef GUNZIP\n        case FLAGS:\n            NEEDBITS(16);\n            state->flags = (int)(hold);\n            if ((state->flags & 0xff) != Z_DEFLATED) {\n                strm->msg = (char *)\"unknown compression method\";\n                state->mode = BAD;\n                break;\n            }\n            if (state->flags & 0xe000) {\n                strm->msg = (char *)\"unknown header flags set\";\n                state->mode = BAD;\n                break;\n            }\n            if (state->head != Z_NULL)\n                state->head->text = (int)((hold >> 8) & 1);\n            if (state->flags & 0x0200) CRC2(state->check, hold);\n            INITBITS();\n            state->mode = TIME;\n        case TIME:\n            NEEDBITS(32);\n            if (state->head != Z_NULL)\n                state->head->time = hold;\n            if (state->flags & 0x0200) CRC4(state->check, hold);\n            INITBITS();\n            state->mode = OS;\n        case OS:\n            NEEDBITS(16);\n            if (state->head != Z_NULL) {\n                state->head->xflags = (int)(hold & 0xff);\n                state->head->os = (int)(hold >> 8);\n            }\n            if (state->flags & 0x0200) CRC2(state->check, hold);\n            INITBITS();\n            state->mode = EXLEN;\n        case EXLEN:\n            if (state->flags & 0x0400) {\n                NEEDBITS(16);\n                state->length = (unsigned)(hold);\n                if (state->head != Z_NULL)\n                    state->head->extra_len = (unsigned)hold;\n                if (state->flags & 0x0200) CRC2(state->check, hold);\n                INITBITS();\n            }\n            else if (state->head != Z_NULL)\n                state->head->extra = Z_NULL;\n            state->mode = EXTRA;\n        case EXTRA:\n            if (state->flags & 0x0400) {\n                copy = state->length;\n                if (copy > have) copy = have;\n                if (copy) {\n                    if (state->head != Z_NULL &&\n                        state->head->extra != Z_NULL) {\n                        len = state->head->extra_len - state->length;\n                        zmemcpy(state->head->extra + len, next,\n                                len + copy > state->head->extra_max ?\n                                state->head->extra_max - len : copy);\n                    }\n                    if (state->flags & 0x0200)\n                        state->check = crc32(state->check, next, copy);\n                    have -= copy;\n                    next += copy;\n                    state->length -= copy;\n                }\n                if (state->length) goto inf_leave;\n            }\n            state->length = 0;\n            state->mode = NAME;\n        case NAME:\n            if (state->flags & 0x0800) {\n                if (have == 0) goto inf_leave;\n                copy = 0;\n                do {\n                    len = (unsigned)(next[copy++]);\n                    if (state->head != Z_NULL &&\n                            state->head->name != Z_NULL &&\n                            state->length < state->head->name_max)\n                        state->head->name[state->length++] = len;\n                } while (len && copy < have);\n                if (state->flags & 0x0200)\n                    state->check = crc32(state->check, next, copy);\n                have -= copy;\n                next += copy;\n                if (len) goto inf_leave;\n            }\n            else if (state->head != Z_NULL)\n                state->head->name = Z_NULL;\n            state->length = 0;\n            state->mode = COMMENT;\n        case COMMENT:\n            if (state->flags & 0x1000) {\n                if (have == 0) goto inf_leave;\n                copy = 0;\n                do {\n                    len = (unsigned)(next[copy++]);\n                    if (state->head != Z_NULL &&\n                            state->head->comment != Z_NULL &&\n                            state->length < state->head->comm_max)\n                        state->head->comment[state->length++] = len;\n                } while (len && copy < have);\n                if (state->flags & 0x0200)\n                    state->check = crc32(state->check, next, copy);\n                have -= copy;\n                next += copy;\n                if (len) goto inf_leave;\n            }\n            else if (state->head != Z_NULL)\n                state->head->comment = Z_NULL;\n            state->mode = HCRC;\n        case HCRC:\n            if (state->flags & 0x0200) {\n                NEEDBITS(16);\n                if (hold != (state->check & 0xffff)) {\n                    strm->msg = (char *)\"header crc mismatch\";\n                    state->mode = BAD;\n                    break;\n                }\n                INITBITS();\n            }\n            if (state->head != Z_NULL) {\n                state->head->hcrc = (int)((state->flags >> 9) & 1);\n                state->head->done = 1;\n            }\n            strm->adler = state->check = crc32(0L, Z_NULL, 0);\n            state->mode = TYPE;\n            break;\n#endif\n        case DICTID:\n            NEEDBITS(32);\n            strm->adler = state->check = ZSWAP32(hold);\n            INITBITS();\n            state->mode = DICT;\n        case DICT:\n            if (state->havedict == 0) {\n                RESTORE();\n                return Z_NEED_DICT;\n            }\n            strm->adler = state->check = adler32(0L, Z_NULL, 0);\n            state->mode = TYPE;\n        case TYPE:\n            if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave;\n        case TYPEDO:\n            if (state->last) {\n                BYTEBITS();\n                state->mode = CHECK;\n                break;\n            }\n            NEEDBITS(3);\n            state->last = BITS(1);\n            DROPBITS(1);\n            switch (BITS(2)) {\n            case 0:                             /* stored block */\n                Tracev((stderr, \"inflate:     stored block%s\\n\",\n                        state->last ? \" (last)\" : \"\"));\n                state->mode = STORED;\n                break;\n            case 1:                             /* fixed block */\n                fixedtables(state);\n                Tracev((stderr, \"inflate:     fixed codes block%s\\n\",\n                        state->last ? \" (last)\" : \"\"));\n                state->mode = LEN_;             /* decode codes */\n                if (flush == Z_TREES) {\n                    DROPBITS(2);\n                    goto inf_leave;\n                }\n                break;\n            case 2:                             /* dynamic block */\n                Tracev((stderr, \"inflate:     dynamic codes block%s\\n\",\n                        state->last ? \" (last)\" : \"\"));\n                state->mode = TABLE;\n                break;\n            case 3:\n                strm->msg = (char *)\"invalid block type\";\n                state->mode = BAD;\n            }\n            DROPBITS(2);\n            break;\n        case STORED:\n            BYTEBITS();                         /* go to byte boundary */\n            NEEDBITS(32);\n            if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {\n                strm->msg = (char *)\"invalid stored block lengths\";\n                state->mode = BAD;\n                break;\n            }\n            state->length = (unsigned)hold & 0xffff;\n            Tracev((stderr, \"inflate:       stored length %u\\n\",\n                    state->length));\n            INITBITS();\n            state->mode = COPY_;\n            if (flush == Z_TREES) goto inf_leave;\n        case COPY_:\n            state->mode = COPY;\n        case COPY:\n            copy = state->length;\n            if (copy) {\n                if (copy > have) copy = have;\n                if (copy > left) copy = left;\n                if (copy == 0) goto inf_leave;\n                zmemcpy(put, next, copy);\n                have -= copy;\n                next += copy;\n                left -= copy;\n                put += copy;\n                state->length -= copy;\n                break;\n            }\n            Tracev((stderr, \"inflate:       stored end\\n\"));\n            state->mode = TYPE;\n            break;\n        case TABLE:\n            NEEDBITS(14);\n            state->nlen = BITS(5) + 257;\n            DROPBITS(5);\n            state->ndist = BITS(5) + 1;\n            DROPBITS(5);\n            state->ncode = BITS(4) + 4;\n            DROPBITS(4);\n#ifndef PKZIP_BUG_WORKAROUND\n            if (state->nlen > 286 || state->ndist > 30) {\n                strm->msg = (char *)\"too many length or distance symbols\";\n                state->mode = BAD;\n                break;\n            }\n#endif\n            Tracev((stderr, \"inflate:       table sizes ok\\n\"));\n            state->have = 0;\n            state->mode = LENLENS;\n        case LENLENS:\n            while (state->have < state->ncode) {\n                NEEDBITS(3);\n                state->lens[order[state->have++]] = (unsigned short)BITS(3);\n                DROPBITS(3);\n            }\n            while (state->have < 19)\n                state->lens[order[state->have++]] = 0;\n            state->next = state->codes;\n            state->lencode = (const code FAR *)(state->next);\n            state->lenbits = 7;\n            ret = inflate_table(CODES, state->lens, 19, &(state->next),\n                                &(state->lenbits), state->work);\n            if (ret) {\n                strm->msg = (char *)\"invalid code lengths set\";\n                state->mode = BAD;\n                break;\n            }\n            Tracev((stderr, \"inflate:       code lengths ok\\n\"));\n            state->have = 0;\n            state->mode = CODELENS;\n        case CODELENS:\n            while (state->have < state->nlen + state->ndist) {\n                for (;;) {\n                    here = state->lencode[BITS(state->lenbits)];\n                    if ((unsigned)(here.bits) <= bits) break;\n                    PULLBYTE();\n                }\n                if (here.val < 16) {\n                    DROPBITS(here.bits);\n                    state->lens[state->have++] = here.val;\n                }\n                else {\n                    if (here.val == 16) {\n                        NEEDBITS(here.bits + 2);\n                        DROPBITS(here.bits);\n                        if (state->have == 0) {\n                            strm->msg = (char *)\"invalid bit length repeat\";\n                            state->mode = BAD;\n                            break;\n                        }\n                        len = state->lens[state->have - 1];\n                        copy = 3 + BITS(2);\n                        DROPBITS(2);\n                    }\n                    else if (here.val == 17) {\n                        NEEDBITS(here.bits + 3);\n                        DROPBITS(here.bits);\n                        len = 0;\n                        copy = 3 + BITS(3);\n                        DROPBITS(3);\n                    }\n                    else {\n                        NEEDBITS(here.bits + 7);\n                        DROPBITS(here.bits);\n                        len = 0;\n                        copy = 11 + BITS(7);\n                        DROPBITS(7);\n                    }\n                    if (state->have + copy > state->nlen + state->ndist) {\n                        strm->msg = (char *)\"invalid bit length repeat\";\n                        state->mode = BAD;\n                        break;\n                    }\n                    while (copy--)\n                        state->lens[state->have++] = (unsigned short)len;\n                }\n            }\n\n            /* handle error breaks in while */\n            if (state->mode == BAD) break;\n\n            /* check for end-of-block code (better have one) */\n            if (state->lens[256] == 0) {\n                strm->msg = (char *)\"invalid code -- missing end-of-block\";\n                state->mode = BAD;\n                break;\n            }\n\n            /* build code tables -- note: do not change the lenbits or distbits\n               values here (9 and 6) without reading the comments in inftrees.h\n               concerning the ENOUGH constants, which depend on those values */\n            state->next = state->codes;\n            state->lencode = (const code FAR *)(state->next);\n            state->lenbits = 9;\n            ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),\n                                &(state->lenbits), state->work);\n            if (ret) {\n                strm->msg = (char *)\"invalid literal/lengths set\";\n                state->mode = BAD;\n                break;\n            }\n            state->distcode = (const code FAR *)(state->next);\n            state->distbits = 6;\n            ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,\n                            &(state->next), &(state->distbits), state->work);\n            if (ret) {\n                strm->msg = (char *)\"invalid distances set\";\n                state->mode = BAD;\n                break;\n            }\n            Tracev((stderr, \"inflate:       codes ok\\n\"));\n            state->mode = LEN_;\n            if (flush == Z_TREES) goto inf_leave;\n        case LEN_:\n            state->mode = LEN;\n        case LEN:\n            if (have >= 6 && left >= 258) {\n                RESTORE();\n                inflate_fast(strm, out);\n                LOAD();\n                if (state->mode == TYPE)\n                    state->back = -1;\n                break;\n            }\n            state->back = 0;\n            for (;;) {\n                here = state->lencode[BITS(state->lenbits)];\n                if ((unsigned)(here.bits) <= bits) break;\n                PULLBYTE();\n            }\n            if (here.op && (here.op & 0xf0) == 0) {\n                last = here;\n                for (;;) {\n                    here = state->lencode[last.val +\n                            (BITS(last.bits + last.op) >> last.bits)];\n                    if ((unsigned)(last.bits + here.bits) <= bits) break;\n                    PULLBYTE();\n                }\n                DROPBITS(last.bits);\n                state->back += last.bits;\n            }\n            DROPBITS(here.bits);\n            state->back += here.bits;\n            state->length = (unsigned)here.val;\n            if ((int)(here.op) == 0) {\n                Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n                        \"inflate:         literal '%c'\\n\" :\n                        \"inflate:         literal 0x%02x\\n\", here.val));\n                state->mode = LIT;\n                break;\n            }\n            if (here.op & 32) {\n                Tracevv((stderr, \"inflate:         end of block\\n\"));\n                state->back = -1;\n                state->mode = TYPE;\n                break;\n            }\n            if (here.op & 64) {\n                strm->msg = (char *)\"invalid literal/length code\";\n                state->mode = BAD;\n                break;\n            }\n            state->extra = (unsigned)(here.op) & 15;\n            state->mode = LENEXT;\n        case LENEXT:\n            if (state->extra) {\n                NEEDBITS(state->extra);\n                state->length += BITS(state->extra);\n                DROPBITS(state->extra);\n                state->back += state->extra;\n            }\n            Tracevv((stderr, \"inflate:         length %u\\n\", state->length));\n            state->was = state->length;\n            state->mode = DIST;\n        case DIST:\n            for (;;) {\n                here = state->distcode[BITS(state->distbits)];\n                if ((unsigned)(here.bits) <= bits) break;\n                PULLBYTE();\n            }\n            if ((here.op & 0xf0) == 0) {\n                last = here;\n                for (;;) {\n                    here = state->distcode[last.val +\n                            (BITS(last.bits + last.op) >> last.bits)];\n                    if ((unsigned)(last.bits + here.bits) <= bits) break;\n                    PULLBYTE();\n                }\n                DROPBITS(last.bits);\n                state->back += last.bits;\n            }\n            DROPBITS(here.bits);\n            state->back += here.bits;\n            if (here.op & 64) {\n                strm->msg = (char *)\"invalid distance code\";\n                state->mode = BAD;\n                break;\n            }\n            state->offset = (unsigned)here.val;\n            state->extra = (unsigned)(here.op) & 15;\n            state->mode = DISTEXT;\n        case DISTEXT:\n            if (state->extra) {\n                NEEDBITS(state->extra);\n                state->offset += BITS(state->extra);\n                DROPBITS(state->extra);\n                state->back += state->extra;\n            }\n#ifdef INFLATE_STRICT\n            if (state->offset > state->dmax) {\n                strm->msg = (char *)\"invalid distance too far back\";\n                state->mode = BAD;\n                break;\n            }\n#endif\n            Tracevv((stderr, \"inflate:         distance %u\\n\", state->offset));\n            state->mode = MATCH;\n        case MATCH:\n            if (left == 0) goto inf_leave;\n            copy = out - left;\n            if (state->offset > copy) {         /* copy from window */\n                copy = state->offset - copy;\n                if (copy > state->whave) {\n                    if (state->sane) {\n                        strm->msg = (char *)\"invalid distance too far back\";\n                        state->mode = BAD;\n                        break;\n                    }\n#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n                    Trace((stderr, \"inflate.c too far\\n\"));\n                    copy -= state->whave;\n                    if (copy > state->length) copy = state->length;\n                    if (copy > left) copy = left;\n                    left -= copy;\n                    state->length -= copy;\n                    do {\n                        *put++ = 0;\n                    } while (--copy);\n                    if (state->length == 0) state->mode = LEN;\n                    break;\n#endif\n                }\n                if (copy > state->wnext) {\n                    copy -= state->wnext;\n                    from = state->window + (state->wsize - copy);\n                }\n                else\n                    from = state->window + (state->wnext - copy);\n                if (copy > state->length) copy = state->length;\n            }\n            else {                              /* copy from output */\n                from = put - state->offset;\n                copy = state->length;\n            }\n            if (copy > left) copy = left;\n            left -= copy;\n            state->length -= copy;\n            do {\n                *put++ = *from++;\n            } while (--copy);\n            if (state->length == 0) state->mode = LEN;\n            break;\n        case LIT:\n            if (left == 0) goto inf_leave;\n            *put++ = (unsigned char)(state->length);\n            left--;\n            state->mode = LEN;\n            break;\n        case CHECK:\n            if (state->wrap) {\n                NEEDBITS(32);\n                out -= left;\n                strm->total_out += out;\n                state->total += out;\n                if (out)\n                    strm->adler = state->check =\n                        UPDATE(state->check, put - out, out);\n                out = left;\n                if ((\n#ifdef GUNZIP\n                     state->flags ? hold :\n#endif\n                     ZSWAP32(hold)) != state->check) {\n                    strm->msg = (char *)\"incorrect data check\";\n                    state->mode = BAD;\n                    break;\n                }\n                INITBITS();\n                Tracev((stderr, \"inflate:   check matches trailer\\n\"));\n            }\n#ifdef GUNZIP\n            state->mode = LENGTH;\n        case LENGTH:\n            if (state->wrap && state->flags) {\n                NEEDBITS(32);\n                if (hold != (state->total & 0xffffffffUL)) {\n                    strm->msg = (char *)\"incorrect length check\";\n                    state->mode = BAD;\n                    break;\n                }\n                INITBITS();\n                Tracev((stderr, \"inflate:   length matches trailer\\n\"));\n            }\n#endif\n            state->mode = DONE;\n        case DONE:\n            ret = Z_STREAM_END;\n            goto inf_leave;\n        case BAD:\n            ret = Z_DATA_ERROR;\n            goto inf_leave;\n        case MEM:\n            return Z_MEM_ERROR;\n        case SYNC:\n        default:\n            return Z_STREAM_ERROR;\n        }\n\n    /*\n       Return from inflate(), updating the total counts and the check value.\n       If there was no progress during the inflate() call, return a buffer\n       error.  Call updatewindow() to create and/or update the window state.\n       Note: a memory error from inflate() is non-recoverable.\n     */\n  inf_leave:\n    RESTORE();\n    if (state->wsize || (out != strm->avail_out && state->mode < BAD &&\n            (state->mode < CHECK || flush != Z_FINISH)))\n        if (updatewindow(strm, strm->next_out, out - strm->avail_out)) {\n            state->mode = MEM;\n            return Z_MEM_ERROR;\n        }\n    in -= strm->avail_in;\n    out -= strm->avail_out;\n    strm->total_in += in;\n    strm->total_out += out;\n    state->total += out;\n    if (state->wrap && out)\n        strm->adler = state->check =\n            UPDATE(state->check, strm->next_out - out, out);\n    strm->data_type = state->bits + (state->last ? 64 : 0) +\n                      (state->mode == TYPE ? 128 : 0) +\n                      (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0);\n    if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)\n        ret = Z_BUF_ERROR;\n    return ret;\n}\n\nint ZEXPORT inflateEnd(\nz_streamp strm)\n{\n    struct inflate_state FAR *state;\n    if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)\n        return Z_STREAM_ERROR;\n    state = (struct inflate_state FAR *)strm->state;\n    if (state->window != Z_NULL) ZFREE(strm, state->window);\n    ZFREE(strm, strm->state);\n    strm->state = Z_NULL;\n    Tracev((stderr, \"inflate: end\\n\"));\n    return Z_OK;\n}\n\nint ZEXPORT inflateGetDictionary(\nz_streamp strm,\nBytef *dictionary,\nuInt *dictLength)\n{\n    struct inflate_state FAR *state;\n\n    /* check state */\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n    state = (struct inflate_state FAR *)strm->state;\n\n    /* copy dictionary */\n    if (state->whave && dictionary != Z_NULL) {\n        zmemcpy(dictionary, state->window + state->wnext,\n                state->whave - state->wnext);\n        zmemcpy(dictionary + state->whave - state->wnext,\n                state->window, state->wnext);\n    }\n    if (dictLength != Z_NULL)\n        *dictLength = state->whave;\n    return Z_OK;\n}\n\nint ZEXPORT inflateSetDictionary(\nz_streamp strm,\nconst Bytef *dictionary,\nuInt dictLength)\n{\n    struct inflate_state FAR *state;\n    unsigned long dictid;\n    int ret;\n\n    dictid = 0;\n    /* check state */\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n    state = (struct inflate_state FAR *)strm->state;\n    if (state->wrap != 0 && state->mode != DICT)\n        return Z_STREAM_ERROR;\n\n    /* check for correct dictionary identifier */\n    if (state->mode == DICT) {\n        dictid = adler32(0L, Z_NULL, 0);\n        dictid = adler32(dictid, dictionary, dictLength);\n        if (dictid != state->check)\n            return Z_DATA_ERROR;\n    }\n\n    /* copy dictionary to window using updatewindow(), which will amend the\n       existing dictionary if appropriate */\n    ret = updatewindow(strm, dictionary + dictLength, dictLength);\n    if (ret) {\n        state->mode = MEM;\n        return Z_MEM_ERROR;\n    }\n    state->havedict = 1;\n    Tracev((stderr, \"inflate:   dictionary set\\n\"));\n    return Z_OK;\n}\n\nint ZEXPORT inflateGetHeader(\nz_streamp strm,\ngz_headerp head)\n{\n    struct inflate_state FAR *state;\n\n    /* check state */\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n    state = (struct inflate_state FAR *)strm->state;\n    if ((state->wrap & 2) == 0) return Z_STREAM_ERROR;\n\n    /* save header structure */\n    state->head = head;\n    head->done = 0;\n    return Z_OK;\n}\n\n/*\n   Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff.  Return when found\n   or when out of input.  When called, *have is the number of pattern bytes\n   found in order so far, in 0..3.  On return *have is updated to the new\n   state.  If on return *have equals four, then the pattern was found and the\n   return value is how many bytes were read including the last byte of the\n   pattern.  If *have is less than four, then the pattern has not been found\n   yet and the return value is len.  In the latter case, syncsearch() can be\n   called again with more data and the *have state.  *have is initialized to\n   zero for the first call.\n */\nlocal unsigned syncsearch(\nunsigned FAR *have,\nconst unsigned char FAR *buf,\nunsigned len)\n{\n    unsigned got;\n    unsigned next;\n\n    got = *have;\n    next = 0;\n    while (next < len && got < 4) {\n        if ((int)(buf[next]) == (got < 2 ? 0 : 0xff))\n            got++;\n        else if (buf[next])\n            got = 0;\n        else\n            got = 4 - got;\n        next++;\n    }\n    *have = got;\n    return next;\n}\n\nint ZEXPORT inflateSync(\nz_streamp strm)\n{\n    unsigned len;               /* number of bytes to look at or looked at */\n    unsigned long in, out;      /* temporary to save total_in and total_out */\n    unsigned char buf[4];       /* to restore bit buffer to byte string */\n    struct inflate_state FAR *state;\n\n    /* check parameters */\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n    state = (struct inflate_state FAR *)strm->state;\n    if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR;\n\n    /* if first time, start search in bit buffer */\n    if (state->mode != SYNC) {\n        state->mode = SYNC;\n        state->hold <<= state->bits & 7;\n        state->bits -= state->bits & 7;\n        len = 0;\n        while (state->bits >= 8) {\n            buf[len++] = (unsigned char)(state->hold);\n            state->hold >>= 8;\n            state->bits -= 8;\n        }\n        state->have = 0;\n        syncsearch(&(state->have), buf, len);\n    }\n\n    /* search available input */\n    len = syncsearch(&(state->have), strm->next_in, strm->avail_in);\n    strm->avail_in -= len;\n    strm->next_in += len;\n    strm->total_in += len;\n\n    /* return no joy or set up to restart inflate() on a new block */\n    if (state->have != 4) return Z_DATA_ERROR;\n    in = strm->total_in;  out = strm->total_out;\n    inflateReset(strm);\n    strm->total_in = in;  strm->total_out = out;\n    state->mode = TYPE;\n    return Z_OK;\n}\n\n/*\n   Returns true if inflate is currently at the end of a block generated by\n   Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP\n   implementation to provide an additional safety check. PPP uses\n   Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored\n   block. When decompressing, PPP checks that at the end of input packet,\n   inflate is waiting for these length bytes.\n */\nint ZEXPORT inflateSyncPoint(\nz_streamp strm)\n{\n    struct inflate_state FAR *state;\n\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n    state = (struct inflate_state FAR *)strm->state;\n    return state->mode == STORED && state->bits == 0;\n}\n\nint ZEXPORT inflateCopy(\nz_streamp dest,\nz_streamp source)\n{\n    struct inflate_state FAR *state;\n    struct inflate_state FAR *copy;\n    unsigned char FAR *window;\n    unsigned wsize;\n\n    /* check input */\n    if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL ||\n        source->zalloc == (alloc_func)0 || source->zfree == (free_func)0)\n        return Z_STREAM_ERROR;\n    state = (struct inflate_state FAR *)source->state;\n\n    /* allocate space */\n    copy = (struct inflate_state FAR *)\n           ZALLOC(source, 1, sizeof(struct inflate_state));\n    if (copy == Z_NULL) return Z_MEM_ERROR;\n    window = Z_NULL;\n    if (state->window != Z_NULL) {\n        window = (unsigned char FAR *)\n                 ZALLOC(source, 1U << state->wbits, sizeof(unsigned char));\n        if (window == Z_NULL) {\n            ZFREE(source, copy);\n            return Z_MEM_ERROR;\n        }\n    }\n\n    /* copy state */\n    zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));\n    zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state));\n    if (state->lencode >= state->codes &&\n        state->lencode <= state->codes + ENOUGH - 1) {\n        copy->lencode = copy->codes + (state->lencode - state->codes);\n        copy->distcode = copy->codes + (state->distcode - state->codes);\n    }\n    copy->next = copy->codes + (state->next - state->codes);\n    if (window != Z_NULL) {\n        wsize = 1U << state->wbits;\n        zmemcpy(window, state->window, wsize);\n    }\n    copy->window = window;\n    dest->state = (struct internal_state FAR *)copy;\n    return Z_OK;\n}\n\nint ZEXPORT inflateUndermine(\nz_streamp strm,\nint subvert)\n{\n    struct inflate_state FAR *state;\n\n    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\n    state = (struct inflate_state FAR *)strm->state;\n    state->sane = !subvert;\n#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n    return Z_OK;\n#else\n    state->sane = 1;\n    return Z_DATA_ERROR;\n#endif\n}\n\nlong ZEXPORT inflateMark(\nz_streamp strm)\n{\n    struct inflate_state FAR *state;\n\n    if (strm == Z_NULL || strm->state == Z_NULL) return -1L << 16;\n    state = (struct inflate_state FAR *)strm->state;\n    return ((long)(state->back) << 16) +\n        (state->mode == COPY ? state->length :\n            (state->mode == MATCH ? state->was - state->length : 0));\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_inftrees.c",
    "content": "/* inftrees.c -- generate Huffman trees for efficient decoding\n * Copyright (C) 1995-2013 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n#include \"zutil.h\"\n#include \"inftrees.h\"\n\n#define MAXBITS 15\n\nconst char inflate_copyright[] =\n   \" inflate 1.2.8 Copyright 1995-2013 Mark Adler \";\n/*\n  If you use the zlib library in a product, an acknowledgment is welcome\n  in the documentation of your product. If for some reason you cannot\n  include such an acknowledgment, I would appreciate that you keep this\n  copyright string in the executable of your product.\n */\n\n/*\n   Build a set of tables to decode the provided canonical Huffman code.\n   The code lengths are lens[0..codes-1].  The result starts at *table,\n   whose indices are 0..2^bits-1.  work is a writable array of at least\n   lens shorts, which is used as a work area.  type is the type of code\n   to be generated, CODES, LENS, or DISTS.  On return, zero is success,\n   -1 is an invalid code, and +1 means that ENOUGH isn't enough.  table\n   on return points to the next available entry's address.  bits is the\n   requested root table index bits, and on return it is the actual root\n   table index bits.  It will differ if the request is greater than the\n   longest code or if it is less than the shortest code.\n */\nint ZLIB_INTERNAL inflate_table(\ncodetype type,\nunsigned short FAR *lens,\nunsigned codes,\ncode FAR * FAR *table,\nunsigned FAR *bits,\nunsigned short FAR *work)\n{\n    unsigned len;               /* a code's length in bits */\n    unsigned sym;               /* index of code symbols */\n    unsigned min, max;          /* minimum and maximum code lengths */\n    unsigned root;              /* number of index bits for root table */\n    unsigned curr;              /* number of index bits for current table */\n    unsigned drop;              /* code bits to drop for sub-table */\n    int left;                   /* number of prefix codes available */\n    unsigned used;              /* code entries in table used */\n    unsigned huff;              /* Huffman code */\n    unsigned incr;              /* for incrementing code, index */\n    unsigned fill;              /* index for replicating entries */\n    unsigned low;               /* low bits for current root entry */\n    unsigned mask;              /* mask for low root bits */\n    code here;                  /* table entry for duplication */\n    code FAR *next;             /* next available space in table */\n    const unsigned short FAR *base;     /* base value table to use */\n    const unsigned short FAR *extra;    /* extra bits table to use */\n    int end;                    /* use base and extra for symbol > end */\n    unsigned short count[MAXBITS+1];    /* number of codes of each length */\n    unsigned short offs[MAXBITS+1];     /* offsets in table for each length */\n    static const unsigned short lbase[31] = { /* Length codes 257..285 base */\n        3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n        35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};\n    static const unsigned short lext[31] = { /* Length codes 257..285 extra */\n        16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n        19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78};\n    static const unsigned short dbase[32] = { /* Distance codes 0..29 base */\n        1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n        257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n        8193, 12289, 16385, 24577, 0, 0};\n    static const unsigned short dext[32] = { /* Distance codes 0..29 extra */\n        16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n        23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n        28, 28, 29, 29, 64, 64};\n\n    /*\n       Process a set of code lengths to create a canonical Huffman code.  The\n       code lengths are lens[0..codes-1].  Each length corresponds to the\n       symbols 0..codes-1.  The Huffman code is generated by first sorting the\n       symbols by length from short to long, and retaining the symbol order\n       for codes with equal lengths.  Then the code starts with all zero bits\n       for the first code of the shortest length, and the codes are integer\n       increments for the same length, and zeros are appended as the length\n       increases.  For the deflate format, these bits are stored backwards\n       from their more natural integer increment ordering, and so when the\n       decoding tables are built in the large loop below, the integer codes\n       are incremented backwards.\n\n       This routine assumes, but does not check, that all of the entries in\n       lens[] are in the range 0..MAXBITS.  The caller must assure this.\n       1..MAXBITS is interpreted as that code length.  zero means that that\n       symbol does not occur in this code.\n\n       The codes are sorted by computing a count of codes for each length,\n       creating from that a table of starting indices for each length in the\n       sorted table, and then entering the symbols in order in the sorted\n       table.  The sorted table is work[], with that space being provided by\n       the caller.\n\n       The length counts are used for other purposes as well, i.e. finding\n       the minimum and maximum length codes, determining if there are any\n       codes at all, checking for a valid set of lengths, and looking ahead\n       at length counts to determine sub-table sizes when building the\n       decoding tables.\n     */\n\n    /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n    for (len = 0; len <= MAXBITS; len++)\n        count[len] = 0;\n    for (sym = 0; sym < codes; sym++)\n        count[lens[sym]]++;\n\n    /* bound code lengths, force root to be within code lengths */\n    root = *bits;\n    for (max = MAXBITS; max >= 1; max--)\n        if (count[max] != 0) break;\n    if (root > max) root = max;\n    if (max == 0) {                     /* no symbols to code at all */\n        here.op = (unsigned char)64;    /* invalid code marker */\n        here.bits = (unsigned char)1;\n        here.val = (unsigned short)0;\n        *(*table)++ = here;             /* make a table to force an error */\n        *(*table)++ = here;\n        *bits = 1;\n        return 0;     /* no symbols, but wait for decoding to report error */\n    }\n    for (min = 1; min < max; min++)\n        if (count[min] != 0) break;\n    if (root < min) root = min;\n\n    /* check for an over-subscribed or incomplete set of lengths */\n    left = 1;\n    for (len = 1; len <= MAXBITS; len++) {\n        left <<= 1;\n        left -= count[len];\n        if (left < 0) return -1;        /* over-subscribed */\n    }\n    if (left > 0 && (type == CODES || max != 1))\n        return -1;                      /* incomplete set */\n\n    /* generate offsets into symbol table for each length for sorting */\n    offs[1] = 0;\n    for (len = 1; len < MAXBITS; len++)\n        offs[len + 1] = offs[len] + count[len];\n\n    /* sort symbols by length, by symbol order within each length */\n    for (sym = 0; sym < codes; sym++)\n        if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym;\n\n    /*\n       Create and fill in decoding tables.  In this loop, the table being\n       filled is at next and has curr index bits.  The code being used is huff\n       with length len.  That code is converted to an index by dropping drop\n       bits off of the bottom.  For codes where len is less than drop + curr,\n       those top drop + curr - len bits are incremented through all values to\n       fill the table with replicated entries.\n\n       root is the number of index bits for the root table.  When len exceeds\n       root, sub-tables are created pointed to by the root entry with an index\n       of the low root bits of huff.  This is saved in low to check for when a\n       new sub-table should be started.  drop is zero when the root table is\n       being filled, and drop is root when sub-tables are being filled.\n\n       When a new sub-table is needed, it is necessary to look ahead in the\n       code lengths to determine what size sub-table is needed.  The length\n       counts are used for this, and so count[] is decremented as codes are\n       entered in the tables.\n\n       used keeps track of how many table entries have been allocated from the\n       provided *table space.  It is checked for LENS and DIST tables against\n       the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n       the initial root table size constants.  See the comments in inftrees.h\n       for more information.\n\n       sym increments through all symbols, and the loop terminates when\n       all codes of length max, i.e. all codes, have been processed.  This\n       routine permits incomplete codes, so another loop after this one fills\n       in the rest of the decoding tables with invalid code markers.\n     */\n\n    /* set up for code type */\n    switch (type) {\n    case CODES:\n        base = extra = work;    /* dummy value--not used */\n        end = 19;\n        break;\n    case LENS:\n        base = lbase;\n        base -= 257;\n        extra = lext;\n        extra -= 257;\n        end = 256;\n        break;\n    default:            /* DISTS */\n        base = dbase;\n        extra = dext;\n        end = -1;\n    }\n\n    /* initialize state for loop */\n    huff = 0;                   /* starting code */\n    sym = 0;                    /* starting code symbol */\n    len = min;                  /* starting code length */\n    next = *table;              /* current table to fill in */\n    curr = root;                /* current table index bits */\n    drop = 0;                   /* current bits to drop from code for index */\n    low = (unsigned)(-1);       /* trigger new sub-table when len > root */\n    used = 1U << root;          /* use root table entries */\n    mask = used - 1;            /* mask for comparing low */\n\n    /* check available table space */\n    if ((type == LENS && used > ENOUGH_LENS) ||\n        (type == DISTS && used > ENOUGH_DISTS))\n        return 1;\n\n    /* process all codes and make table entries */\n    for (;;) {\n        /* create table entry */\n        here.bits = (unsigned char)(len - drop);\n        if ((int)(work[sym]) < end) {\n            here.op = (unsigned char)0;\n            here.val = work[sym];\n        }\n        else if ((int)(work[sym]) > end) {\n            here.op = (unsigned char)(extra[work[sym]]);\n            here.val = base[work[sym]];\n        }\n        else {\n            here.op = (unsigned char)(32 + 64);         /* end of block */\n            here.val = 0;\n        }\n\n        /* replicate for those indices with low len bits equal to huff */\n        incr = 1U << (len - drop);\n        fill = 1U << curr;\n        min = fill;                 /* save offset to next table */\n        do {\n            fill -= incr;\n            next[(huff >> drop) + fill] = here;\n        } while (fill != 0);\n\n        /* backwards increment the len-bit code huff */\n        incr = 1U << (len - 1);\n        while (huff & incr)\n            incr >>= 1;\n        if (incr != 0) {\n            huff &= incr - 1;\n            huff += incr;\n        }\n        else\n            huff = 0;\n\n        /* go to next symbol, update count, len */\n        sym++;\n        if (--(count[len]) == 0) {\n            if (len == max) break;\n            len = lens[work[sym]];\n        }\n\n        /* create new sub-table if needed */\n        if (len > root && (huff & mask) != low) {\n            /* if first time, transition to sub-tables */\n            if (drop == 0)\n                drop = root;\n\n            /* increment past last table */\n            next += min;            /* here min is 1 << curr */\n\n            /* determine length of next table */\n            curr = len - drop;\n            left = (int)(1 << curr);\n            while (curr + drop < max) {\n                left -= count[curr + drop];\n                if (left <= 0) break;\n                curr++;\n                left <<= 1;\n            }\n\n            /* check for enough space */\n            used += 1U << curr;\n            if ((type == LENS && used > ENOUGH_LENS) ||\n                (type == DISTS && used > ENOUGH_DISTS))\n                return 1;\n\n            /* point entry in root table to sub-table */\n            low = huff & mask;\n            (*table)[low].op = (unsigned char)curr;\n            (*table)[low].bits = (unsigned char)root;\n            (*table)[low].val = (unsigned short)(next - *table);\n        }\n    }\n\n    /* fill in remaining table entry if code is incomplete (guaranteed to have\n       at most one remaining entry, since if the code is incomplete, the\n       maximum code length that was allowed to get this far is one bit) */\n    if (huff != 0) {\n        here.op = (unsigned char)64;            /* invalid code marker */\n        here.bits = (unsigned char)(len - drop);\n        here.val = (unsigned short)0;\n        next[huff] = here;\n    }\n\n    /* set return parameters */\n    *table += used;\n    *bits = root;\n    return 0;\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_trees.c",
    "content": "/* trees.c -- output deflated data using Huffman coding\n * Copyright (C) 1995-2012 Jean-loup Gailly\n * detect_data_type() function provided freely by Cosmin Truta, 2006\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/*\n *  ALGORITHM\n *\n *      The \"deflation\" process uses several Huffman trees. The more\n *      common source values are represented by shorter bit sequences.\n *\n *      Each code tree is stored in a compressed form which is itself\n * a Huffman encoding of the lengths of all the code strings (in\n * ascending order by source values).  The actual code strings are\n * reconstructed from the lengths in the inflate process, as described\n * in the deflate specification.\n *\n *  REFERENCES\n *\n *      Deutsch, L.P.,\"'Deflate' Compressed Data Format Specification\".\n *      Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc\n *\n *      Storer, James A.\n *          Data Compression:  Methods and Theory, pp. 49-50.\n *          Computer Science Press, 1988.  ISBN 0-7167-8156-5.\n *\n *      Sedgewick, R.\n *          Algorithms, p290.\n *          Addison-Wesley, 1983. ISBN 0-201-06672-6.\n */\n\n/* @(#) $Id$ */\n\n/* #define GEN_TREES_H */\n\n#include \"deflate.h\"\n\n#ifdef DEBUG\n#  include <ctype.h>\n#endif\n\n/* ===========================================================================\n * Constants\n */\n\n#define MAX_BL_BITS 7\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\n#define END_BLOCK 256\n/* end of block literal code */\n\n#define REP_3_6      16\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\n#define REPZ_3_10    17\n/* repeat a zero length 3-10 times  (3 bits of repeat count) */\n\n#define REPZ_11_138  18\n/* repeat a zero length 11-138 times  (7 bits of repeat count) */\n\nlocal const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */\n   = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0};\n\nlocal const int extra_dbits[D_CODES] /* extra bits for each distance code */\n   = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};\n\nlocal const int extra_blbits[BL_CODES]/* extra bits for each bit length code */\n   = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7};\n\nlocal const uch bl_order[BL_CODES]\n   = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15};\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n#define DIST_CODE_LEN  512 /* see definition of array dist_code below */\n\n#if defined(GEN_TREES_H) || !defined(STDC)\n/* non ANSI compilers may not accept trees.h */\n\nlocal ct_data static_ltree[L_CODES+2];\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nlocal ct_data static_dtree[D_CODES];\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nuch _dist_code[DIST_CODE_LEN];\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nuch _length_code[MAX_MATCH-MIN_MATCH+1];\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nlocal int base_length[LENGTH_CODES];\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nlocal int base_dist[D_CODES];\n/* First normalized distance for each code (0 = distance of 1) */\n\n#else\n#  include \"trees.h\"\n#endif /* GEN_TREES_H */\n\nstruct static_tree_desc_s {\n    const ct_data *static_tree;  /* static tree or NULL */\n    const intf *extra_bits;      /* extra bits for each code or NULL */\n    int     extra_base;          /* base index for extra_bits */\n    int     elems;               /* max number of elements in the tree */\n    int     max_length;          /* max bit length for the codes */\n};\n\nlocal static_tree_desc  static_l_desc =\n{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS};\n\nlocal static_tree_desc  static_d_desc =\n{static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS};\n\nlocal static_tree_desc  static_bl_desc =\n{(const ct_data *)0, extra_blbits, 0,   BL_CODES, MAX_BL_BITS};\n\n/* ===========================================================================\n * Local (static) routines in this file.\n */\n\nlocal void tr_static_init OF((void));\nlocal void init_block     OF((deflate_state *s));\nlocal void pqdownheap     OF((deflate_state *s, ct_data *tree, int k));\nlocal void gen_bitlen     OF((deflate_state *s, tree_desc *desc));\nlocal void gen_codes      OF((ct_data *tree, int max_code, ushf *bl_count));\nlocal void build_tree     OF((deflate_state *s, tree_desc *desc));\nlocal void scan_tree      OF((deflate_state *s, ct_data *tree, int max_code));\nlocal void send_tree      OF((deflate_state *s, ct_data *tree, int max_code));\nlocal int  build_bl_tree  OF((deflate_state *s));\nlocal void send_all_trees OF((deflate_state *s, int lcodes, int dcodes,\n                              int blcodes));\nlocal void compress_block OF((deflate_state *s, const ct_data *ltree,\n                              const ct_data *dtree));\nlocal int  detect_data_type OF((deflate_state *s));\nlocal unsigned bi_reverse OF((unsigned value, int length));\nlocal void bi_windup      OF((deflate_state *s));\nlocal void bi_flush       OF((deflate_state *s));\nlocal void copy_block     OF((deflate_state *s, charf *buf, unsigned len,\n                              int header));\n\n#ifdef GEN_TREES_H\nlocal void gen_trees_header OF((void));\n#endif\n\n#ifndef DEBUG\n#  define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len)\n   /* Send a code of the given tree. c and tree must not have side effects */\n\n#else /* DEBUG */\n#  define send_code(s, c, tree) \\\n     { if (z_verbose>2) fprintf(stderr,\"\\ncd %3d \",(c)); \\\n       send_bits(s, tree[c].Code, tree[c].Len); }\n#endif\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\n#define put_short(s, w) { \\\n    put_byte(s, (uch)((w) & 0xff)); \\\n    put_byte(s, (uch)((ush)(w) >> 8)); \\\n}\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\n#ifdef DEBUG\nlocal void send_bits      OF((deflate_state *s, int value, int length));\n\nlocal void send_bits(\n    deflate_state *s,\n    int value,  /* value to send */\n    int length) /* number of bits */\n{\n    Tracevv((stderr,\" l %2d v %4x \", length, value));\n    Assert(length > 0 && length <= 15, \"invalid length\");\n    s->bits_sent += (ulg)length;\n\n    /* If not enough room in bi_buf, use (valid) bits from bi_buf and\n     * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid))\n     * unused bits in value.\n     */\n    if (s->bi_valid > (int)Buf_size - length) {\n        s->bi_buf |= (ush)value << s->bi_valid;\n        put_short(s, s->bi_buf);\n        s->bi_buf = (ush)value >> (Buf_size - s->bi_valid);\n        s->bi_valid += length - Buf_size;\n    } else {\n        s->bi_buf |= (ush)value << s->bi_valid;\n        s->bi_valid += length;\n    }\n}\n#else /* !DEBUG */\n\n#define send_bits(s, value, length) \\\n{ int len = length;\\\n  if (s->bi_valid > (int)Buf_size - len) {\\\n    int val = value;\\\n    s->bi_buf |= (ush)val << s->bi_valid;\\\n    put_short(s, s->bi_buf);\\\n    s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\\\n    s->bi_valid += len - Buf_size;\\\n  } else {\\\n    s->bi_buf |= (ush)(value) << s->bi_valid;\\\n    s->bi_valid += len;\\\n  }\\\n}\n#endif /* DEBUG */\n\n\n/* the arguments must not have side effects */\n\n/* ===========================================================================\n * Initialize the various 'constant' tables.\n */\nlocal void tr_static_init()\n{\n#if defined(GEN_TREES_H) || !defined(STDC)\n    static int static_init_done = 0;\n    int n;        /* iterates over tree elements */\n    int bits;     /* bit counter */\n    int length;   /* length value */\n    int code;     /* code value */\n    int dist;     /* distance index */\n    ush bl_count[MAX_BITS+1];\n    /* number of codes at each bit length for an optimal tree */\n\n    if (static_init_done) return;\n\n    /* For some embedded targets, global variables are not initialized: */\n#ifdef NO_INIT_GLOBAL_POINTERS\n    static_l_desc.static_tree = static_ltree;\n    static_l_desc.extra_bits = extra_lbits;\n    static_d_desc.static_tree = static_dtree;\n    static_d_desc.extra_bits = extra_dbits;\n    static_bl_desc.extra_bits = extra_blbits;\n#endif\n\n    /* Initialize the mapping length (0..255) -> length code (0..28) */\n    length = 0;\n    for (code = 0; code < LENGTH_CODES-1; code++) {\n        base_length[code] = length;\n        for (n = 0; n < (1<<extra_lbits[code]); n++) {\n            _length_code[length++] = (uch)code;\n        }\n    }\n    Assert (length == 256, \"tr_static_init: length != 256\");\n    /* Note that the length 255 (match length 258) can be represented\n     * in two different ways: code 284 + 5 bits or code 285, so we\n     * overwrite length_code[255] to use the best encoding:\n     */\n    _length_code[length-1] = (uch)code;\n\n    /* Initialize the mapping dist (0..32K) -> dist code (0..29) */\n    dist = 0;\n    for (code = 0 ; code < 16; code++) {\n        base_dist[code] = dist;\n        for (n = 0; n < (1<<extra_dbits[code]); n++) {\n            _dist_code[dist++] = (uch)code;\n        }\n    }\n    Assert (dist == 256, \"tr_static_init: dist != 256\");\n    dist >>= 7; /* from now on, all distances are divided by 128 */\n    for ( ; code < D_CODES; code++) {\n        base_dist[code] = dist << 7;\n        for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {\n            _dist_code[256 + dist++] = (uch)code;\n        }\n    }\n    Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n    /* Construct the codes of the static literal tree */\n    for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0;\n    n = 0;\n    while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++;\n    while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++;\n    while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++;\n    while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++;\n    /* Codes 286 and 287 do not exist, but we must include them in the\n     * tree construction to get a canonical Huffman tree (longest code\n     * all ones)\n     */\n    gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count);\n\n    /* The static distance tree is trivial: */\n    for (n = 0; n < D_CODES; n++) {\n        static_dtree[n].Len = 5;\n        static_dtree[n].Code = bi_reverse((unsigned)n, 5);\n    }\n    static_init_done = 1;\n\n#  ifdef GEN_TREES_H\n    gen_trees_header();\n#  endif\n#endif /* defined(GEN_TREES_H) || !defined(STDC) */\n}\n\n/* ===========================================================================\n * Genererate the file trees.h describing the static trees.\n */\n#ifdef GEN_TREES_H\n#  ifndef DEBUG\n#    include <stdio.h>\n#  endif\n\n#  define SEPARATOR(i, last, width) \\\n      ((i) == (last)? \"\\n};\\n\\n\" :    \\\n       ((i) % (width) == (width)-1 ? \",\\n\" : \", \"))\n\nvoid gen_trees_header()\n{\n    FILE *header = fopen(\"trees.h\", \"w\");\n    int i;\n\n    Assert (header != NULL, \"Can't open trees.h\");\n    fprintf(header,\n            \"/* header created automatically with -DGEN_TREES_H */\\n\\n\");\n\n    fprintf(header, \"local const ct_data static_ltree[L_CODES+2] = {\\n\");\n    for (i = 0; i < L_CODES+2; i++) {\n        fprintf(header, \"{{%3u},{%3u}}%s\", static_ltree[i].Code,\n                static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5));\n    }\n\n    fprintf(header, \"local const ct_data static_dtree[D_CODES] = {\\n\");\n    for (i = 0; i < D_CODES; i++) {\n        fprintf(header, \"{{%2u},{%2u}}%s\", static_dtree[i].Code,\n                static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5));\n    }\n\n    fprintf(header, \"const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\\n\");\n    for (i = 0; i < DIST_CODE_LEN; i++) {\n        fprintf(header, \"%2u%s\", _dist_code[i],\n                SEPARATOR(i, DIST_CODE_LEN-1, 20));\n    }\n\n    fprintf(header,\n        \"const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\\n\");\n    for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) {\n        fprintf(header, \"%2u%s\", _length_code[i],\n                SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20));\n    }\n\n    fprintf(header, \"local const int base_length[LENGTH_CODES] = {\\n\");\n    for (i = 0; i < LENGTH_CODES; i++) {\n        fprintf(header, \"%1u%s\", base_length[i],\n                SEPARATOR(i, LENGTH_CODES-1, 20));\n    }\n\n    fprintf(header, \"local const int base_dist[D_CODES] = {\\n\");\n    for (i = 0; i < D_CODES; i++) {\n        fprintf(header, \"%5u%s\", base_dist[i],\n                SEPARATOR(i, D_CODES-1, 10));\n    }\n\n    fclose(header);\n}\n#endif /* GEN_TREES_H */\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nvoid ZLIB_INTERNAL _tr_init(\n    deflate_state *s)\n{\n    tr_static_init();\n\n    s->l_desc.dyn_tree = s->dyn_ltree;\n    s->l_desc.stat_desc = &static_l_desc;\n\n    s->d_desc.dyn_tree = s->dyn_dtree;\n    s->d_desc.stat_desc = &static_d_desc;\n\n    s->bl_desc.dyn_tree = s->bl_tree;\n    s->bl_desc.stat_desc = &static_bl_desc;\n\n    s->bi_buf = 0;\n    s->bi_valid = 0;\n#ifdef DEBUG\n    s->compressed_len = 0L;\n    s->bits_sent = 0L;\n#endif\n\n    /* Initialize the first block of the first file: */\n    init_block(s);\n}\n\n/* ===========================================================================\n * Initialize a new block.\n */\nlocal void init_block(\n    deflate_state *s)\n{\n    int n; /* iterates over tree elements */\n\n    /* Initialize the trees. */\n    for (n = 0; n < L_CODES;  n++) s->dyn_ltree[n].Freq = 0;\n    for (n = 0; n < D_CODES;  n++) s->dyn_dtree[n].Freq = 0;\n    for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0;\n\n    s->dyn_ltree[END_BLOCK].Freq = 1;\n    s->opt_len = s->static_len = 0L;\n    s->last_lit = s->matches = 0;\n}\n\n#define SMALLEST 1\n/* Index within the heap array of least frequent node in the Huffman tree */\n\n\n/* ===========================================================================\n * Remove the smallest element from the heap and recreate the heap with\n * one less element. Updates heap and heap_len.\n */\n#define pqremove(s, tree, top) \\\n{\\\n    top = s->heap[SMALLEST]; \\\n    s->heap[SMALLEST] = s->heap[s->heap_len--]; \\\n    pqdownheap(s, tree, SMALLEST); \\\n}\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\n#define smaller(tree, n, m, depth) \\\n   (tree[n].Freq < tree[m].Freq || \\\n   (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m]))\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nlocal void pqdownheap(\n    deflate_state *s,\n    ct_data *tree,  /* the tree to restore */\n    int k)               /* node to move down */\n{\n    int v = s->heap[k];\n    int j = k << 1;  /* left son of k */\n    while (j <= s->heap_len) {\n        /* Set j to the smallest of the two sons: */\n        if (j < s->heap_len &&\n            smaller(tree, s->heap[j+1], s->heap[j], s->depth)) {\n            j++;\n        }\n        /* Exit if v is smaller than both sons */\n        if (smaller(tree, v, s->heap[j], s->depth)) break;\n\n        /* Exchange v with the smallest son */\n        s->heap[k] = s->heap[j];  k = j;\n\n        /* And continue down the tree, setting j to the left son of k */\n        j <<= 1;\n    }\n    s->heap[k] = v;\n}\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n *    above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n *     array bl_count contains the frequencies for each bit length.\n *     The length opt_len is updated; static_len is also updated if stree is\n *     not null.\n */\nlocal void gen_bitlen(\n    deflate_state *s,\n    tree_desc *desc)    /* the tree descriptor */\n{\n    ct_data *tree        = desc->dyn_tree;\n    int max_code         = desc->max_code;\n    const ct_data *stree = desc->stat_desc->static_tree;\n    const intf *extra    = desc->stat_desc->extra_bits;\n    int base             = desc->stat_desc->extra_base;\n    int max_length       = desc->stat_desc->max_length;\n    int h;              /* heap index */\n    int n, m;           /* iterate over the tree elements */\n    int bits;           /* bit length */\n    int xbits;          /* extra bits */\n    ush f;              /* frequency */\n    int overflow = 0;   /* number of elements with bit length too large */\n\n    for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0;\n\n    /* In a first pass, compute the optimal bit lengths (which may\n     * overflow in the case of the bit length tree).\n     */\n    tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */\n\n    for (h = s->heap_max+1; h < HEAP_SIZE; h++) {\n        n = s->heap[h];\n        bits = tree[tree[n].Dad].Len + 1;\n        if (bits > max_length) bits = max_length, overflow++;\n        tree[n].Len = (ush)bits;\n        /* We overwrite tree[n].Dad which is no longer needed */\n\n        if (n > max_code) continue; /* not a leaf node */\n\n        s->bl_count[bits]++;\n        xbits = 0;\n        if (n >= base) xbits = extra[n-base];\n        f = tree[n].Freq;\n        s->opt_len += (ulg)f * (bits + xbits);\n        if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits);\n    }\n    if (overflow == 0) return;\n\n    Trace((stderr,\"\\nbit length overflow\\n\"));\n    /* This happens for example on obj2 and pic of the Calgary corpus */\n\n    /* Find the first bit length which could increase: */\n    do {\n        bits = max_length-1;\n        while (s->bl_count[bits] == 0) bits--;\n        s->bl_count[bits]--;      /* move one leaf down the tree */\n        s->bl_count[bits+1] += 2; /* move one overflow item as its brother */\n        s->bl_count[max_length]--;\n        /* The brother of the overflow item also moves one step up,\n         * but this does not affect bl_count[max_length]\n         */\n        overflow -= 2;\n    } while (overflow > 0);\n\n    /* Now recompute all bit lengths, scanning in increasing frequency.\n     * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n     * lengths instead of fixing only the wrong ones. This idea is taken\n     * from 'ar' written by Haruhiko Okumura.)\n     */\n    for (bits = max_length; bits != 0; bits--) {\n        n = s->bl_count[bits];\n        while (n != 0) {\n            m = s->heap[--h];\n            if (m > max_code) continue;\n            if ((unsigned) tree[m].Len != (unsigned) bits) {\n                Trace((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n                s->opt_len += ((long)bits - (long)tree[m].Len)\n                              *(long)tree[m].Freq;\n                tree[m].Len = (ush)bits;\n            }\n            n--;\n        }\n    }\n}\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n *     zero code length.\n */\nlocal void gen_codes (\n    ct_data *tree,             /* the tree to decorate */\n    int max_code,              /* largest code with non zero frequency */\n    ushf *bl_count)            /* number of codes at each bit length */\n{\n    ush next_code[MAX_BITS+1]; /* next code value for each bit length */\n    ush code = 0;              /* running code value */\n    int bits;                  /* bit index */\n    int n;                     /* code index */\n\n    /* The distribution counts are first used to generate the code values\n     * without bit reversal.\n     */\n    for (bits = 1; bits <= MAX_BITS; bits++) {\n        next_code[bits] = code = (code + bl_count[bits-1]) << 1;\n    }\n    /* Check that the bit counts in bl_count are consistent. The last code\n     * must be all ones.\n     */\n    Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,\n            \"inconsistent bit counts\");\n    Tracev((stderr,\"\\ngen_codes: max_code %d \", max_code));\n\n    for (n = 0;  n <= max_code; n++) {\n        int len = tree[n].Len;\n        if (len == 0) continue;\n        /* Now reverse the bits */\n        tree[n].Code = bi_reverse(next_code[len]++, len);\n\n        Tracecv(tree != static_ltree, (stderr,\"\\nn %3d %c l %2d c %4x (%x) \",\n             n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));\n    }\n}\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n *     and corresponding code. The length opt_len is updated; static_len is\n *     also updated if stree is not null. The field max_code is set.\n */\nlocal void build_tree(\n    deflate_state *s,\n    tree_desc *desc) /* the tree descriptor */\n{\n    ct_data *tree         = desc->dyn_tree;\n    const ct_data *stree  = desc->stat_desc->static_tree;\n    int elems             = desc->stat_desc->elems;\n    int n, m;          /* iterate over heap elements */\n    int max_code = -1; /* largest code with non zero frequency */\n    int node;          /* new node being created */\n\n    /* Construct the initial heap, with least frequent element in\n     * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n     * heap[0] is not used.\n     */\n    s->heap_len = 0, s->heap_max = HEAP_SIZE;\n\n    for (n = 0; n < elems; n++) {\n        if (tree[n].Freq != 0) {\n            s->heap[++(s->heap_len)] = max_code = n;\n            s->depth[n] = 0;\n        } else {\n            tree[n].Len = 0;\n        }\n    }\n\n    /* The pkzip format requires that at least one distance code exists,\n     * and that at least one bit should be sent even if there is only one\n     * possible code. So to avoid special checks later on we force at least\n     * two codes of non zero frequency.\n     */\n    while (s->heap_len < 2) {\n        node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0);\n        tree[node].Freq = 1;\n        s->depth[node] = 0;\n        s->opt_len--; if (stree) s->static_len -= stree[node].Len;\n        /* node is 0 or 1 so it does not have extra bits */\n    }\n    desc->max_code = max_code;\n\n    /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n     * establish sub-heaps of increasing lengths:\n     */\n    for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n);\n\n    /* Construct the Huffman tree by repeatedly combining the least two\n     * frequent nodes.\n     */\n    node = elems;              /* next internal node of the tree */\n    do {\n        pqremove(s, tree, n);  /* n = node of least frequency */\n        m = s->heap[SMALLEST]; /* m = node of next least frequency */\n\n        s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */\n        s->heap[--(s->heap_max)] = m;\n\n        /* Create a new node father of n and m */\n        tree[node].Freq = tree[n].Freq + tree[m].Freq;\n        s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ?\n                                s->depth[n] : s->depth[m]) + 1);\n        tree[n].Dad = tree[m].Dad = (ush)node;\n#ifdef DUMP_BL_TREE\n        if (tree == s->bl_tree) {\n            fprintf(stderr,\"\\nnode %d(%d), sons %d(%d) %d(%d)\",\n                    node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq);\n        }\n#endif\n        /* and insert the new node in the heap */\n        s->heap[SMALLEST] = node++;\n        pqdownheap(s, tree, SMALLEST);\n\n    } while (s->heap_len >= 2);\n\n    s->heap[--(s->heap_max)] = s->heap[SMALLEST];\n\n    /* At this point, the fields freq and dad are set. We can now\n     * generate the bit lengths.\n     */\n    gen_bitlen(s, (tree_desc *)desc);\n\n    /* The field len is now set, we can generate the bit codes */\n    gen_codes ((ct_data *)tree, max_code, s->bl_count);\n}\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nlocal void scan_tree (\n    deflate_state *s,\n    ct_data *tree,   /* the tree to be scanned */\n    int max_code)    /* and its largest code of non zero frequency */\n{\n    int n;                     /* iterates over all tree elements */\n    int prevlen = -1;          /* last emitted length */\n    int curlen;                /* length of current code */\n    int nextlen = tree[0].Len; /* length of next code */\n    int count = 0;             /* repeat count of the current code */\n    int max_count = 7;         /* max repeat count */\n    int min_count = 4;         /* min repeat count */\n\n    if (nextlen == 0) max_count = 138, min_count = 3;\n    tree[max_code+1].Len = (ush)0xffff; /* guard */\n\n    for (n = 0; n <= max_code; n++) {\n        curlen = nextlen; nextlen = tree[n+1].Len;\n        if (++count < max_count && curlen == nextlen) {\n            continue;\n        } else if (count < min_count) {\n            s->bl_tree[curlen].Freq += count;\n        } else if (curlen != 0) {\n            if (curlen != prevlen) s->bl_tree[curlen].Freq++;\n            s->bl_tree[REP_3_6].Freq++;\n        } else if (count <= 10) {\n            s->bl_tree[REPZ_3_10].Freq++;\n        } else {\n            s->bl_tree[REPZ_11_138].Freq++;\n        }\n        count = 0; prevlen = curlen;\n        if (nextlen == 0) {\n            max_count = 138, min_count = 3;\n        } else if (curlen == nextlen) {\n            max_count = 6, min_count = 3;\n        } else {\n            max_count = 7, min_count = 4;\n        }\n    }\n}\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nlocal void send_tree (\n    deflate_state *s,\n    ct_data *tree, /* the tree to be scanned */\n    int max_code)       /* and its largest code of non zero frequency */\n{\n    int n;                     /* iterates over all tree elements */\n    int prevlen = -1;          /* last emitted length */\n    int curlen;                /* length of current code */\n    int nextlen = tree[0].Len; /* length of next code */\n    int count = 0;             /* repeat count of the current code */\n    int max_count = 7;         /* max repeat count */\n    int min_count = 4;         /* min repeat count */\n\n    /* tree[max_code+1].Len = -1; */  /* guard already set */\n    if (nextlen == 0) max_count = 138, min_count = 3;\n\n    for (n = 0; n <= max_code; n++) {\n        curlen = nextlen; nextlen = tree[n+1].Len;\n        if (++count < max_count && curlen == nextlen) {\n            continue;\n        } else if (count < min_count) {\n            do { send_code(s, curlen, s->bl_tree); } while (--count != 0);\n\n        } else if (curlen != 0) {\n            if (curlen != prevlen) {\n                send_code(s, curlen, s->bl_tree); count--;\n            }\n            Assert(count >= 3 && count <= 6, \" 3_6?\");\n            send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2);\n\n        } else if (count <= 10) {\n            send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3);\n\n        } else {\n            send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7);\n        }\n        count = 0; prevlen = curlen;\n        if (nextlen == 0) {\n            max_count = 138, min_count = 3;\n        } else if (curlen == nextlen) {\n            max_count = 6, min_count = 3;\n        } else {\n            max_count = 7, min_count = 4;\n        }\n    }\n}\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nlocal int build_bl_tree(\n    deflate_state *s)\n{\n    int max_blindex;  /* index of last bit length code of non zero freq */\n\n    /* Determine the bit length frequencies for literal and distance trees */\n    scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code);\n    scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code);\n\n    /* Build the bit length tree: */\n    build_tree(s, (tree_desc *)(&(s->bl_desc)));\n    /* opt_len now includes the length of the tree representations, except\n     * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n     */\n\n    /* Determine the number of bit length codes to send. The pkzip format\n     * requires that at least 4 bit length codes be sent. (appnote.txt says\n     * 3 but the actual value used is 4.)\n     */\n    for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {\n        if (s->bl_tree[bl_order[max_blindex]].Len != 0) break;\n    }\n    /* Update opt_len to include the bit length tree and counts */\n    s->opt_len += 3*(max_blindex+1) + 5+5+4;\n    Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n            s->opt_len, s->static_len));\n\n    return max_blindex;\n}\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nlocal void send_all_trees(\n    deflate_state *s,\n    int lcodes, int dcodes, int blcodes) /* number of codes for each tree */\n{\n    int rank;                    /* index in bl_order */\n\n    Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n    Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n            \"too many codes\");\n    Tracev((stderr, \"\\nbl counts: \"));\n    send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */\n    send_bits(s, dcodes-1,   5);\n    send_bits(s, blcodes-4,  4); /* not -3 as stated in appnote.txt */\n    for (rank = 0; rank < blcodes; rank++) {\n        Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n        send_bits(s, s->bl_tree[bl_order[rank]].Len, 3);\n    }\n    Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n    send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */\n    Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n    send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */\n    Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n}\n\n/* ===========================================================================\n * Send a stored block\n */\nvoid ZLIB_INTERNAL _tr_stored_block(\n    deflate_state *s,\n    charf *buf,       /* input block */\n    ulg stored_len,   /* length of input block */\n    int last)         /* one if this is the last block for a file */\n{\n    send_bits(s, (STORED_BLOCK<<1)+last, 3);    /* send block type */\n#ifdef DEBUG\n    s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L;\n    s->compressed_len += (stored_len + 4) << 3;\n#endif\n    copy_block(s, buf, (unsigned)stored_len, 1); /* with header */\n}\n\n/* ===========================================================================\n * Flush the bits in the bit buffer to pending output (leaves at most 7 bits)\n */\nvoid ZLIB_INTERNAL _tr_flush_bits(\n    deflate_state *s)\n{\n    bi_flush(s);\n}\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n */\nvoid ZLIB_INTERNAL _tr_align(\n    deflate_state *s)\n{\n    send_bits(s, STATIC_TREES<<1, 3);\n    send_code(s, END_BLOCK, static_ltree);\n#ifdef DEBUG\n    s->compressed_len += 10L; /* 3 for block type, 7 for EOB */\n#endif\n    bi_flush(s);\n}\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and output the encoded block to the zip file.\n */\nvoid ZLIB_INTERNAL _tr_flush_block(\n    deflate_state *s,\n    charf *buf,       /* input block, or NULL if too old */\n    ulg stored_len,   /* length of input block */\n    int last)         /* one if this is the last block for a file */\n{\n    ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */\n    int max_blindex = 0;  /* index of last bit length code of non zero freq */\n\n    /* Build the Huffman trees unless a stored block is forced */\n    if (s->level > 0) {\n\n        /* Check if the file is binary or text */\n        if (s->strm->data_type == Z_UNKNOWN)\n            s->strm->data_type = detect_data_type(s);\n\n        /* Construct the literal and distance trees */\n        build_tree(s, (tree_desc *)(&(s->l_desc)));\n        Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n                s->static_len));\n\n        build_tree(s, (tree_desc *)(&(s->d_desc)));\n        Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n                s->static_len));\n        /* At this point, opt_len and static_len are the total bit lengths of\n         * the compressed block data, excluding the tree representations.\n         */\n\n        /* Build the bit length tree for the above two trees, and get the index\n         * in bl_order of the last bit length code to send.\n         */\n        max_blindex = build_bl_tree(s);\n\n        /* Determine the best encoding. Compute the block lengths in bytes. */\n        opt_lenb = (s->opt_len+3+7)>>3;\n        static_lenb = (s->static_len+3+7)>>3;\n\n        Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n                opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n                s->last_lit));\n\n        if (static_lenb <= opt_lenb) opt_lenb = static_lenb;\n\n    } else {\n        Assert(buf != (char*)0, \"lost buf\");\n        opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n    }\n\n#ifdef FORCE_STORED\n    if (buf != (char*)0) { /* force stored block */\n#else\n    if (stored_len+4 <= opt_lenb && buf != (char*)0) {\n                       /* 4: two words for the lengths */\n#endif\n        /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n         * Otherwise we can't have processed more than WSIZE input bytes since\n         * the last block flush, because compression would have been\n         * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n         * transform a block into a stored block.\n         */\n        _tr_stored_block(s, buf, stored_len, last);\n\n#ifdef FORCE_STATIC\n    } else if (static_lenb >= 0) { /* force static trees */\n#else\n    } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) {\n#endif\n        send_bits(s, (STATIC_TREES<<1)+last, 3);\n        compress_block(s, (const ct_data *)static_ltree,\n                       (const ct_data *)static_dtree);\n#ifdef DEBUG\n        s->compressed_len += 3 + s->static_len;\n#endif\n    } else {\n        send_bits(s, (DYN_TREES<<1)+last, 3);\n        send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1,\n                       max_blindex+1);\n        compress_block(s, (const ct_data *)s->dyn_ltree,\n                       (const ct_data *)s->dyn_dtree);\n#ifdef DEBUG\n        s->compressed_len += 3 + s->opt_len;\n#endif\n    }\n    Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n    /* The above check is made mod 2^32, for files larger than 512 MB\n     * and uLong implemented on 32 bits.\n     */\n    init_block(s);\n\n    if (last) {\n        bi_windup(s);\n#ifdef DEBUG\n        s->compressed_len += 7;  /* align on byte boundary */\n#endif\n    }\n    Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n           s->compressed_len-7*last));\n}\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nint ZLIB_INTERNAL _tr_tally (\n    deflate_state *s,\n    unsigned dist,  /* distance of matched string */\n    unsigned lc)    /* match length-MIN_MATCH or unmatched char (if dist==0) */\n{\n    s->d_buf[s->last_lit] = (ush)dist;\n    s->l_buf[s->last_lit++] = (uch)lc;\n    if (dist == 0) {\n        /* lc is the unmatched char */\n        s->dyn_ltree[lc].Freq++;\n    } else {\n        s->matches++;\n        /* Here, lc is the match length - MIN_MATCH */\n        dist--;             /* dist = match distance - 1 */\n        Assert((ush)dist < (ush)MAX_DIST(s) &&\n               (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n               (ush)d_code(dist) < (ush)D_CODES,  \"_tr_tally: bad match\");\n\n        s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++;\n        s->dyn_dtree[d_code(dist)].Freq++;\n    }\n\n#ifdef TRUNCATE_BLOCK\n    /* Try to guess if it is profitable to stop the current block here */\n    if ((s->last_lit & 0x1fff) == 0 && s->level > 2) {\n        /* Compute an upper bound for the compressed length */\n        ulg out_length = (ulg)s->last_lit*8L;\n        ulg in_length = (ulg)((long)s->strstart - s->block_start);\n        int dcode;\n        for (dcode = 0; dcode < D_CODES; dcode++) {\n            out_length += (ulg)s->dyn_dtree[dcode].Freq *\n                (5L+extra_dbits[dcode]);\n        }\n        out_length >>= 3;\n        Tracev((stderr,\"\\nlast_lit %u, in %ld, out ~%ld(%ld%%) \",\n               s->last_lit, in_length, out_length,\n               100L - out_length*100L/in_length));\n        if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1;\n    }\n#endif\n    return (s->last_lit == s->lit_bufsize-1);\n    /* We avoid equality with lit_bufsize because of wraparound at 64K\n     * on 16 bit machines and because stored blocks are restricted to\n     * 64K-1 bytes.\n     */\n}\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nlocal void compress_block(\n    deflate_state *s,\n    const ct_data *ltree, /* literal tree */\n    const ct_data *dtree) /* distance tree */\n{\n    unsigned dist;      /* distance of matched string */\n    int lc;             /* match length or unmatched char (if dist == 0) */\n    unsigned lx = 0;    /* running index in l_buf */\n    unsigned code;      /* the code to send */\n    int extra;          /* number of extra bits to send */\n\n    if (s->last_lit != 0) do {\n        dist = s->d_buf[lx];\n        lc = s->l_buf[lx++];\n        if (dist == 0) {\n            send_code(s, lc, ltree); /* send a literal byte */\n            Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n        } else {\n            /* Here, lc is the match length - MIN_MATCH */\n            code = _length_code[lc];\n            send_code(s, code+LITERALS+1, ltree); /* send the length code */\n            extra = extra_lbits[code];\n            if (extra != 0) {\n                lc -= base_length[code];\n                send_bits(s, lc, extra);       /* send the extra length bits */\n            }\n            dist--; /* dist is now the match distance - 1 */\n            code = d_code(dist);\n            Assert (code < D_CODES, \"bad d_code\");\n\n            send_code(s, code, dtree);       /* send the distance code */\n            extra = extra_dbits[code];\n            if (extra != 0) {\n                dist -= base_dist[code];\n                send_bits(s, dist, extra);   /* send the extra distance bits */\n            }\n        } /* literal or match pair ? */\n\n        /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */\n        Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,\n               \"pendingBuf overflow\");\n\n    } while (lx < s->last_lit);\n\n    send_code(s, END_BLOCK, ltree);\n}\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n *    a) There are no non-portable control characters belonging to the\n *       \"black list\" (0..6, 14..25, 28..31).\n *    b) There is at least one printable character belonging to the\n *       \"white list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n *   \"gray list\" that is ignored in this detection algorithm:\n *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nlocal int detect_data_type(\n    deflate_state *s)\n{\n    /* black_mask is the bit mask of black-listed bytes\n     * set bits 0..6, 14..25, and 28..31\n     * 0xf3ffc07f = binary 11110011111111111100000001111111\n     */\n    unsigned long black_mask = 0xf3ffc07fUL;\n    int n;\n\n    /* Check for non-textual (\"black-listed\") bytes. */\n    for (n = 0; n <= 31; n++, black_mask >>= 1)\n        if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0))\n            return Z_BINARY;\n\n    /* Check for textual (\"white-listed\") bytes. */\n    if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0\n            || s->dyn_ltree[13].Freq != 0)\n        return Z_TEXT;\n    for (n = 32; n < LITERALS; n++)\n        if (s->dyn_ltree[n].Freq != 0)\n            return Z_TEXT;\n\n    /* There are no \"black-listed\" or \"white-listed\" bytes:\n     * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n     */\n    return Z_BINARY;\n}\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nlocal unsigned bi_reverse(\n    unsigned code, /* the value to invert */\n    int len)       /* its bit length */\n{\n    register unsigned res = 0;\n    do {\n        res |= code & 1;\n        code >>= 1, res <<= 1;\n    } while (--len > 0);\n    return res >> 1;\n}\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nlocal void bi_flush(\n    deflate_state *s)\n{\n    if (s->bi_valid == 16) {\n        put_short(s, s->bi_buf);\n        s->bi_buf = 0;\n        s->bi_valid = 0;\n    } else if (s->bi_valid >= 8) {\n        put_byte(s, (Byte)s->bi_buf);\n        s->bi_buf >>= 8;\n        s->bi_valid -= 8;\n    }\n}\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nlocal void bi_windup(\n    deflate_state *s)\n{\n    if (s->bi_valid > 8) {\n        put_short(s, s->bi_buf);\n    } else if (s->bi_valid > 0) {\n        put_byte(s, (Byte)s->bi_buf);\n    }\n    s->bi_buf = 0;\n    s->bi_valid = 0;\n#ifdef DEBUG\n    s->bits_sent = (s->bits_sent+7) & ~7;\n#endif\n}\n\n/* ===========================================================================\n * Copy a stored block, storing first the length and its\n * one's complement if requested.\n */\nlocal void copy_block(\n    deflate_state *s,\n    charf    *buf,    /* the input data */\n    unsigned len,     /* its length */\n    int      header)  /* true if block header must be written */\n{\n    bi_windup(s);        /* align on byte boundary */\n\n    if (header) {\n        put_short(s, (ush)len);\n        put_short(s, (ush)~len);\n#ifdef DEBUG\n        s->bits_sent += 2*16;\n#endif\n    }\n#ifdef DEBUG\n    s->bits_sent += (ulg)len<<3;\n#endif\n    while (len--) {\n        put_byte(s, *buf++);\n    }\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_uncompr.c",
    "content": "/* uncompr.c -- decompress a memory buffer\n * Copyright (C) 1995-2003, 2010 Jean-loup Gailly.\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* @(#) $Id$ */\n\n#define ZLIB_INTERNAL\n#include \"zlib.h\"\n\n/* ===========================================================================\n     Decompresses the source buffer into the destination buffer.  sourceLen is\n   the byte length of the source buffer. Upon entry, destLen is the total\n   size of the destination buffer, which must be large enough to hold the\n   entire uncompressed data. (The size of the uncompressed data must have\n   been saved previously by the compressor and transmitted to the decompressor\n   by some mechanism outside the scope of this compression library.)\n   Upon exit, destLen is the actual size of the compressed buffer.\n\n     uncompress returns Z_OK if success, Z_MEM_ERROR if there was not\n   enough memory, Z_BUF_ERROR if there was not enough room in the output\n   buffer, or Z_DATA_ERROR if the input data was corrupted.\n*/\nint ZEXPORT uncompress (\n    Bytef *dest,\n    uLongf *destLen,\n    const Bytef *source,\n    uLong sourceLen)\n{\n    z_stream stream;\n    int err;\n\n    stream.next_in = (z_const Bytef *)source;\n    stream.avail_in = (uInt)sourceLen;\n    /* Check for source > 64K on 16-bit machine: */\n    if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;\n\n    stream.next_out = dest;\n    stream.avail_out = (uInt)*destLen;\n    if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;\n\n    stream.zalloc = (alloc_func)0;\n    stream.zfree = (free_func)0;\n\n    err = inflateInit(&stream);\n    if (err != Z_OK) return err;\n\n    err = inflate(&stream, Z_FINISH);\n    if (err != Z_STREAM_END) {\n        inflateEnd(&stream);\n        if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0))\n            return Z_DATA_ERROR;\n        return err;\n    }\n    *destLen = stream.total_out;\n\n    err = inflateEnd(&stream);\n    return err;\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_zutil.c",
    "content": "/* zutil.c -- target dependent utility functions for the compression library\n * Copyright (C) 1995-2005, 2010, 2011, 2012 Jean-loup Gailly.\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* @(#) $Id$ */\n\n#include \"zutil.h\"\n#ifndef Z_SOLO\n#  include \"gzguts.h\"\n#endif\n\n#ifndef NO_DUMMY_DECL\nstruct internal_state      {int dummy;}; /* for buggy compilers */\n#endif\n\nz_const char * const z_errmsg[10] = {\n\"need dictionary\",     /* Z_NEED_DICT       2  */\n\"stream end\",          /* Z_STREAM_END      1  */\n\"\",                    /* Z_OK              0  */\n\"file error\",          /* Z_ERRNO         (-1) */\n\"stream error\",        /* Z_STREAM_ERROR  (-2) */\n\"data error\",          /* Z_DATA_ERROR    (-3) */\n\"insufficient memory\", /* Z_MEM_ERROR     (-4) */\n\"buffer error\",        /* Z_BUF_ERROR     (-5) */\n\"incompatible version\",/* Z_VERSION_ERROR (-6) */\n\"\"};\n\n\nconst char * ZEXPORT zlibVersion()\n{\n    return ZLIB_VERSION;\n}\n\nuLong ZEXPORT zlibCompileFlags()\n{\n    uLong flags;\n\n    flags = 0;\n    switch ((int)(sizeof(uInt))) {\n    case 2:     break;\n    case 4:     flags += 1;     break;\n    case 8:     flags += 2;     break;\n    default:    flags += 3;\n    }\n    switch ((int)(sizeof(uLong))) {\n    case 2:     break;\n    case 4:     flags += 1 << 2;        break;\n    case 8:     flags += 2 << 2;        break;\n    default:    flags += 3 << 2;\n    }\n    switch ((int)(sizeof(voidpf))) {\n    case 2:     break;\n    case 4:     flags += 1 << 4;        break;\n    case 8:     flags += 2 << 4;        break;\n    default:    flags += 3 << 4;\n    }\n    switch ((int)(sizeof(z_off_t))) {\n    case 2:     break;\n    case 4:     flags += 1 << 6;        break;\n    case 8:     flags += 2 << 6;        break;\n    default:    flags += 3 << 6;\n    }\n#ifdef DEBUG\n    flags += 1 << 8;\n#endif\n#if defined(ASMV) || defined(ASMINF)\n    flags += 1 << 9;\n#endif\n#ifdef ZLIB_WINAPI\n    flags += 1 << 10;\n#endif\n#ifdef BUILDFIXED\n    flags += 1 << 12;\n#endif\n#ifdef DYNAMIC_CRC_TABLE\n    flags += 1 << 13;\n#endif\n#ifdef NO_GZCOMPRESS\n    flags += 1L << 16;\n#endif\n#ifdef NO_GZIP\n    flags += 1L << 17;\n#endif\n#ifdef PKZIP_BUG_WORKAROUND\n    flags += 1L << 20;\n#endif\n#ifdef FASTEST\n    flags += 1L << 21;\n#endif\n#if defined(STDC) || defined(Z_HAVE_STDARG_H)\n#  ifdef NO_vsnprintf\n    flags += 1L << 25;\n#    ifdef HAS_vsprintf_void\n    flags += 1L << 26;\n#    endif\n#  else\n#    ifdef HAS_vsnprintf_void\n    flags += 1L << 26;\n#    endif\n#  endif\n#else\n    flags += 1L << 24;\n#  ifdef NO_snprintf\n    flags += 1L << 25;\n#    ifdef HAS_sprintf_void\n    flags += 1L << 26;\n#    endif\n#  else\n#    ifdef HAS_snprintf_void\n    flags += 1L << 26;\n#    endif\n#  endif\n#endif\n    return flags;\n}\n\n#ifdef DEBUG\n\n#  ifndef verbose\n#    define verbose 0\n#  endif\nint ZLIB_INTERNAL z_verbose = verbose;\n\nvoid ZLIB_INTERNAL z_error (\n    char *m)\n{\n    fprintf(stderr, \"%s\\n\", m);\n    exit(1);\n}\n#endif\n\n/* exported to allow conversion of error code to string for compress() and\n * uncompress()\n */\nconst char * ZEXPORT zError(\n    int err)\n{\n    return ERR_MSG(err);\n}\n\n#if defined(_WIN32_WCE)\n    /* The Microsoft C Run-Time Library for Windows CE doesn't have\n     * errno.  We define it as a global variable to simplify porting.\n     * Its value is always 0 and should not be used.\n     */\n\t/* does not exist on WCE. XYQ: and we don't need it! */\n    /*int errno = 0;*/\n#endif\n\n#ifndef HAVE_MEMCPY\n\nvoid ZLIB_INTERNAL zmemcpy(\n    Bytef* dest,\n    const Bytef* source,\n    uInt  len)\n{\n    if (len == 0) return;\n    do {\n        *dest++ = *source++; /* ??? to be unrolled */\n    } while (--len != 0);\n}\n\nint ZLIB_INTERNAL zmemcmp(\n    const Bytef* s1,\n    const Bytef* s2,\n    uInt  len)\n{\n    uInt j;\n\n    for (j = 0; j < len; j++) {\n        if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;\n    }\n    return 0;\n}\n\nvoid ZLIB_INTERNAL zmemzero(\n    Bytef* dest,\n    uInt  len)\n{\n    if (len == 0) return;\n    do {\n        *dest++ = 0;  /* ??? to be unrolled */\n    } while (--len != 0);\n}\n#endif\n\n#if 0\n#ifndef Z_SOLO\n\n#ifdef SYS16BIT\n\n#ifdef __TURBOC__\n/* Turbo C in 16-bit mode */\n\n#  define MY_ZCALLOC\n\n/* Turbo C malloc() does not allow dynamic allocation of 64K bytes\n * and farmalloc(64K) returns a pointer with an offset of 8, so we\n * must fix the pointer. Warning: the pointer must be put back to its\n * original form in order to free it, use zcfree().\n */\n\n#define MAX_PTR 10\n/* 10*64K = 640K */\n\nlocal int next_ptr = 0;\n\ntypedef struct ptr_table_s {\n    voidpf org_ptr;\n    voidpf new_ptr;\n} ptr_table;\n\nlocal ptr_table table[MAX_PTR];\n/* This table is used to remember the original form of pointers\n * to large buffers (64K). Such pointers are normalized with a zero offset.\n * Since MSDOS is not a preemptive multitasking OS, this table is not\n * protected from concurrent access. This hack doesn't work anyway on\n * a protected system like OS/2. Use Microsoft C instead.\n */\n\nvoidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size)\n{\n    voidpf buf = opaque; /* just to make some compilers happy */\n    ulg bsize = (ulg)items*size;\n\n    /* If we allocate less than 65520 bytes, we assume that farmalloc\n     * will return a usable pointer which doesn't have to be normalized.\n     */\n    if (bsize < 65520L) {\n        buf = farmalloc(bsize);\n        if (*(ush*)&buf != 0) return buf;\n    } else {\n        buf = farmalloc(bsize + 16L);\n    }\n    if (buf == NULL || next_ptr >= MAX_PTR) return NULL;\n    table[next_ptr].org_ptr = buf;\n\n    /* Normalize the pointer to seg:0 */\n    *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4;\n    *(ush*)&buf = 0;\n    table[next_ptr++].new_ptr = buf;\n    return buf;\n}\n\nvoid ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)\n{\n    int n;\n    if (*(ush*)&ptr != 0) { /* object < 64K */\n        farfree(ptr);\n        return;\n    }\n    /* Find the original pointer */\n    for (n = 0; n < next_ptr; n++) {\n        if (ptr != table[n].new_ptr) continue;\n\n        farfree(table[n].org_ptr);\n        while (++n < next_ptr) {\n            table[n-1] = table[n];\n        }\n        next_ptr--;\n        return;\n    }\n    ptr = opaque; /* just to make some compilers happy */\n    Assert(0, \"zcfree: ptr not found\");\n}\n\n#endif /* __TURBOC__ */\n\n\n#ifdef M_I86\n/* Microsoft C in 16-bit mode */\n\n#  define MY_ZCALLOC\n\n#if (!defined(_MSC_VER) || (_MSC_VER <= 600))\n#  define _halloc  halloc\n#  define _hfree   hfree\n#endif\n\nvoidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size)\n{\n    if (opaque) opaque = 0; /* to make compiler happy */\n    return _halloc((long)items, size);\n}\n\nvoid ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)\n{\n    if (opaque) opaque = 0; /* to make compiler happy */\n    _hfree(ptr);\n}\n\n#endif /* M_I86 */\n\n#endif /* SYS16BIT */\n\n\n#ifndef MY_ZCALLOC /* Any system without a special alloc function */\n\n#ifndef STDC\nextern voidp  malloc OF((uInt size));\nextern voidp  calloc OF((uInt items, uInt size));\nextern void   free   OF((voidpf ptr));\n#endif\n\nvoidpf ZLIB_INTERNAL zcalloc (opaque, items, size)\n    voidpf opaque;\n    unsigned items;\n    unsigned size;\n{\n    if (opaque) items += size - size; /* make compiler happy */\n    return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) :\n                              (voidpf)calloc(items, size);\n}\n\nvoid ZLIB_INTERNAL zcfree (opaque, ptr)\n    voidpf opaque;\n    voidpf ptr;\n{\n    free(ptr);\n    if (opaque) return; /* make compiler happy */\n}\n\n#endif /* MY_ZCALLOC */\n\n#endif /* !Z_SOLO */\n#endif\t/* 0 */\n\n#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)\nextern \"C\" {\n#endif\n\nextern void* FXMEM_DefaultAlloc(size_t, int);\nextern void FXMEM_DefaultFree(void*, int);\n\n#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)\n}\n#endif\n\n/* XYQ 2007-1-19 */\nvoidpf zcalloc(voidpf opaque, unsigned items, unsigned size)\n{\n\treturn FXMEM_DefaultAlloc(items * size, 0);\n}\n\nvoid zcfree(voidpf opaque, voidpf ptr)\n{\n\tFXMEM_DefaultFree(ptr, 0);\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/zlib_v128/gzclose.c",
    "content": "/* gzclose.c -- zlib gzclose() function\n * Copyright (C) 2004, 2010 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n#include \"gzguts.h\"\n\n/* gzclose() is in a separate file so that it is linked in only if it is used.\n   That way the other gzclose functions can be used instead to avoid linking in\n   unneeded compression or decompression routines. */\nint ZEXPORT gzclose(\n    gzFile file)\n{\n#ifndef NO_GZCOMPRESS\n    gz_statep state;\n\n    if (file == NULL)\n        return Z_STREAM_ERROR;\n    state = (gz_statep)file;\n\n    return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file);\n#else\n    return gzclose_r(file);\n#endif\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/zlib_v128/gzguts.h",
    "content": "/* gzguts.h -- zlib internal header definitions for gz* operations\n * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n#ifdef _LARGEFILE64_SOURCE\n#  ifndef _LARGEFILE_SOURCE\n#    define _LARGEFILE_SOURCE 1\n#  endif\n#  ifdef _FILE_OFFSET_BITS\n#    undef _FILE_OFFSET_BITS\n#  endif\n#endif\n\n#ifdef HAVE_HIDDEN\n#  define ZLIB_INTERNAL __attribute__((visibility (\"hidden\")))\n#else\n#  define ZLIB_INTERNAL\n#endif\n\n#include <stdio.h>\n#include \"zlib.h\"\n#ifdef STDC\n#  include <string.h>\n#  include <stdlib.h>\n#  include <limits.h>\n#endif\n#include <fcntl.h>\n\n#ifdef _WIN32\n#  include <stddef.h>\n#else\n#  include <unistd.h>\n#endif\n\n#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32)\n#  include <io.h>\n#endif\n\n#ifdef WINAPI_FAMILY\n#  define open _open\n#  define read _read\n#  define write _write\n#  define close _close\n#endif\n\n#ifdef NO_DEFLATE       /* for compatibility with old definition */\n#  define NO_GZCOMPRESS\n#endif\n\n#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550)\n#  ifndef HAVE_VSNPRINTF\n#    define HAVE_VSNPRINTF\n#  endif\n#endif\n\n#if defined(__CYGWIN__)\n#  ifndef HAVE_VSNPRINTF\n#    define HAVE_VSNPRINTF\n#  endif\n#endif\n\n#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410)\n#  ifndef HAVE_VSNPRINTF\n#    define HAVE_VSNPRINTF\n#  endif\n#endif\n\n#ifndef HAVE_VSNPRINTF\n#  ifdef MSDOS\n/* vsnprintf may exist on some MS-DOS compilers (DJGPP?),\n   but for now we just assume it doesn't. */\n#    define NO_vsnprintf\n#  endif\n#  ifdef __TURBOC__\n#    define NO_vsnprintf\n#  endif\n#  ifdef WIN32\n/* In Win32, vsnprintf is available as the \"non-ANSI\" _vsnprintf. */\n#    if !defined(vsnprintf) && !defined(NO_vsnprintf)\n#      if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 )\n#         define vsnprintf _vsnprintf\n#      endif\n#    endif\n#  endif\n#  ifdef __SASC\n#    define NO_vsnprintf\n#  endif\n#  ifdef VMS\n#    define NO_vsnprintf\n#  endif\n#  ifdef __OS400__\n#    define NO_vsnprintf\n#  endif\n#  ifdef __MVS__\n#    define NO_vsnprintf\n#  endif\n#endif\n\n/* unlike snprintf (which is required in C99, yet still not supported by\n   Microsoft more than a decade later!), _snprintf does not guarantee null\n   termination of the result -- however this is only used in gzlib.c where\n   the result is assured to fit in the space provided */\n#ifdef _MSC_VER\n#  define snprintf _snprintf\n#endif\n\n#ifndef local\n#  define local static\n#endif\n/* compile with -Dlocal if your debugger can't find static symbols */\n\n/* gz* functions always use library allocation functions */\n#ifndef STDC\n  extern voidp  malloc OF((uInt size));\n  extern void   free   OF((voidpf ptr));\n#endif\n\n#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)\nextern \"C\" {\n#endif\n\nextern void* FXMEM_DefaultAlloc(size_t, int);\nextern void FXMEM_DefaultFree(void*, int);\n\n#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)\n}\n#endif\n\n#define malloc(size) FXMEM_DefaultAlloc(size, 0)\n#define free(ptr) FXMEM_DefaultFree(ptr, 0)\n\n/* get errno and strerror definition */\n#if defined UNDER_CE\n#  include <windows.h>\n#  define zstrerror() gz_strwinerror((DWORD)GetLastError())\n#else\n#  ifndef NO_STRERROR\n#    include <errno.h>\n#    define zstrerror() strerror(errno)\n#  else\n#    define zstrerror() \"stdio error (consult errno)\"\n#  endif\n#endif\n\n/* provide prototypes for these when building zlib without LFS */\n#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0\n    ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));\n    ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));\n    ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));\n    ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));\n#endif\n\n/* default memLevel */\n#if MAX_MEM_LEVEL >= 8\n#  define DEF_MEM_LEVEL 8\n#else\n#  define DEF_MEM_LEVEL  MAX_MEM_LEVEL\n#endif\n\n/* default i/o buffer size -- double this for output when reading (this and\n   twice this must be able to fit in an unsigned type) */\n#define GZBUFSIZE 8192\n\n/* gzip modes, also provide a little integrity check on the passed structure */\n#define GZ_NONE 0\n#define GZ_READ 7247\n#define GZ_WRITE 31153\n#define GZ_APPEND 1     /* mode set to GZ_WRITE after the file is opened */\n\n/* values for gz_state how */\n#define LOOK 0      /* look for a gzip header */\n#define COPY 1      /* copy input directly */\n#define GZIP 2      /* decompress a gzip stream */\n\n/* internal gzip file state data structure */\ntypedef struct {\n        /* exposed contents for gzgetc() macro */\n    struct gzFile_s x;      /* \"x\" for exposed */\n                            /* x.have: number of bytes available at x.next */\n                            /* x.next: next output data to deliver or write */\n                            /* x.pos: current position in uncompressed data */\n        /* used for both reading and writing */\n    int mode;               /* see gzip modes above */\n    int fd;                 /* file descriptor */\n    char *path;             /* path or fd for error messages */\n    unsigned size;          /* buffer size, zero if not allocated yet */\n    unsigned want;          /* requested buffer size, default is GZBUFSIZE */\n    unsigned char *in;      /* input buffer */\n    unsigned char *out;     /* output buffer (double-sized when reading) */\n    int direct;             /* 0 if processing gzip, 1 if transparent */\n        /* just for reading */\n    int how;                /* 0: get header, 1: copy, 2: decompress */\n    z_off64_t start;        /* where the gzip data started, for rewinding */\n    int eof;                /* true if end of input file reached */\n    int past;               /* true if read requested past end */\n        /* just for writing */\n    int level;              /* compression level */\n    int strategy;           /* compression strategy */\n        /* seek request */\n    z_off64_t skip;         /* amount to skip (already rewound if backwards) */\n    int seek;               /* true if seek request pending */\n        /* error information */\n    int err;                /* error code */\n    char *msg;              /* error message */\n        /* zlib inflate or deflate stream */\n    z_stream strm;          /* stream structure in-place (not a pointer) */\n} gz_state;\ntypedef gz_state FAR *gz_statep;\n\n/* shared functions */\nvoid ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *));\n#if defined UNDER_CE\nchar ZLIB_INTERNAL *gz_strwinerror OF((DWORD error));\n#endif\n\n/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t\n   value -- needed when comparing unsigned to z_off64_t, which is signed\n   (possible z_off64_t types off_t, off64_t, and long are all signed) */\n#ifdef INT_MAX\n#  define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX)\n#else\nunsigned ZLIB_INTERNAL gz_intmax OF((void));\n#  define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax())\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/zlib_v128/gzlib.c",
    "content": "/* gzlib.c -- zlib functions common to reading and writing gzip files\n * Copyright (C) 2004, 2010, 2011, 2012, 2013 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n#include \"gzguts.h\"\n\n#if defined(_WIN32) && !defined(__BORLANDC__)\n#  define LSEEK _lseeki64\n#else\n#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0\n#  define LSEEK lseek64\n#else\n#  define LSEEK lseek\n#endif\n#endif\n\n/* Local functions */\nlocal void gz_reset OF((gz_statep));\nlocal gzFile gz_open OF((const void *, int, const char *));\n\n#if defined UNDER_CE\n\n/* Map the Windows error number in ERROR to a locale-dependent error message\n   string and return a pointer to it.  Typically, the values for ERROR come\n   from GetLastError.\n\n   The string pointed to shall not be modified by the application, but may be\n   overwritten by a subsequent call to gz_strwinerror\n\n   The gz_strwinerror function does not change the current setting of\n   GetLastError. */\nchar ZLIB_INTERNAL *gz_strwinerror (\n     DWORD error)\n{\n    static char buf[1024];\n\n    wchar_t *msgbuf;\n    DWORD lasterr = GetLastError();\n    DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM\n        | FORMAT_MESSAGE_ALLOCATE_BUFFER,\n        NULL,\n        error,\n        0, /* Default language */\n        (LPVOID)&msgbuf,\n        0,\n        NULL);\n    if (chars != 0) {\n        /* If there is an \\r\\n appended, zap it.  */\n        if (chars >= 2\n            && msgbuf[chars - 2] == '\\r' && msgbuf[chars - 1] == '\\n') {\n            chars -= 2;\n            msgbuf[chars] = 0;\n        }\n\n        if (chars > sizeof (buf) - 1) {\n            chars = sizeof (buf) - 1;\n            msgbuf[chars] = 0;\n        }\n\n        wcstombs(buf, msgbuf, chars + 1);\n        LocalFree(msgbuf);\n    }\n    else {\n        sprintf(buf, \"unknown win32 error (%ld)\", error);\n    }\n\n    SetLastError(lasterr);\n    return buf;\n}\n\n#endif /* UNDER_CE */\n\n/* Reset gzip file state */\nlocal void gz_reset(\n    gz_statep state)\n{\n    state->x.have = 0;              /* no output data available */\n    if (state->mode == GZ_READ) {   /* for reading ... */\n        state->eof = 0;             /* not at end of file */\n        state->past = 0;            /* have not read past end yet */\n        state->how = LOOK;          /* look for gzip header */\n    }\n    state->seek = 0;                /* no seek request pending */\n    gz_error(state, Z_OK, NULL);    /* clear error */\n    state->x.pos = 0;               /* no uncompressed data yet */\n    state->strm.avail_in = 0;       /* no input data yet */\n}\n\n/* Open a gzip file either by name or file descriptor. */\nlocal gzFile gz_open(\n    const void *path,\n    int fd,\n    const char *mode)\n{\n    gz_statep state;\n    size_t len;\n    int oflag;\n#ifdef O_CLOEXEC\n    int cloexec = 0;\n#endif\n#ifdef O_EXCL\n    int exclusive = 0;\n#endif\n\n    /* check input */\n    if (path == NULL)\n        return NULL;\n\n    /* allocate gzFile structure to return */\n    state = (gz_statep)malloc(sizeof(gz_state));\n    if (state == NULL)\n        return NULL;\n    state->size = 0;            /* no buffers allocated yet */\n    state->want = GZBUFSIZE;    /* requested buffer size */\n    state->msg = NULL;          /* no error message yet */\n\n    /* interpret mode */\n    state->mode = GZ_NONE;\n    state->level = Z_DEFAULT_COMPRESSION;\n    state->strategy = Z_DEFAULT_STRATEGY;\n    state->direct = 0;\n    while (*mode) {\n        if (*mode >= '0' && *mode <= '9')\n            state->level = *mode - '0';\n        else\n            switch (*mode) {\n            case 'r':\n                state->mode = GZ_READ;\n                break;\n#ifndef NO_GZCOMPRESS\n            case 'w':\n                state->mode = GZ_WRITE;\n                break;\n            case 'a':\n                state->mode = GZ_APPEND;\n                break;\n#endif\n            case '+':       /* can't read and write at the same time */\n                free(state);\n                return NULL;\n            case 'b':       /* ignore -- will request binary anyway */\n                break;\n#ifdef O_CLOEXEC\n            case 'e':\n                cloexec = 1;\n                break;\n#endif\n#ifdef O_EXCL\n            case 'x':\n                exclusive = 1;\n                break;\n#endif\n            case 'f':\n                state->strategy = Z_FILTERED;\n                break;\n            case 'h':\n                state->strategy = Z_HUFFMAN_ONLY;\n                break;\n            case 'R':\n                state->strategy = Z_RLE;\n                break;\n            case 'F':\n                state->strategy = Z_FIXED;\n                break;\n            case 'T':\n                state->direct = 1;\n                break;\n            default:        /* could consider as an error, but just ignore */\n                ;\n            }\n        mode++;\n    }\n\n    /* must provide an \"r\", \"w\", or \"a\" */\n    if (state->mode == GZ_NONE) {\n        free(state);\n        return NULL;\n    }\n\n    /* can't force transparent read */\n    if (state->mode == GZ_READ) {\n        if (state->direct) {\n            free(state);\n            return NULL;\n        }\n        state->direct = 1;      /* for empty file */\n    }\n\n    /* save the path name for error messages */\n#ifdef _WIN32\n    if (fd == -2) {\n        len = wcstombs(NULL, path, 0);\n        if (len == (size_t)-1)\n            len = 0;\n    }\n    else\n#endif\n        len = strlen((const char *)path);\n    state->path = (char *)malloc(len + 1);\n    if (state->path == NULL) {\n        free(state);\n        return NULL;\n    }\n#ifdef _WIN32\n    if (fd == -2)\n        if (len)\n            wcstombs(state->path, path, len + 1);\n        else\n            *(state->path) = 0;\n    else\n#endif\n#if !defined(NO_snprintf) && !defined(NO_vsnprintf)\n        snprintf(state->path, len + 1, \"%s\", (const char *)path);\n#else\n        strcpy(state->path, path);\n#endif\n\n    /* compute the flags for open() */\n    oflag =\n#ifdef O_LARGEFILE\n        O_LARGEFILE |\n#endif\n#ifdef O_BINARY\n        O_BINARY |\n#endif\n#ifdef O_CLOEXEC\n        (cloexec ? O_CLOEXEC : 0) |\n#endif\n        (state->mode == GZ_READ ?\n         O_RDONLY :\n         (O_WRONLY | O_CREAT |\n#ifdef O_EXCL\n          (exclusive ? O_EXCL : 0) |\n#endif\n          (state->mode == GZ_WRITE ?\n           O_TRUNC :\n           O_APPEND)));\n\n    /* open the file with the appropriate flags (or just use fd) */\n    state->fd = fd > -1 ? fd : (\n#ifdef _WIN32\n        fd == -2 ? _wopen(path, oflag, 0666) :\n#endif\n        open((const char *)path, oflag, 0666));\n    if (state->fd == -1) {\n        free(state->path);\n        free(state);\n        return NULL;\n    }\n    if (state->mode == GZ_APPEND)\n        state->mode = GZ_WRITE;         /* simplify later checks */\n\n    /* save the current position for rewinding (only if reading) */\n    if (state->mode == GZ_READ) {\n        state->start = LSEEK(state->fd, 0, SEEK_CUR);\n        if (state->start == -1) state->start = 0;\n    }\n\n    /* initialize stream */\n    gz_reset(state);\n\n    /* return stream */\n    return (gzFile)state;\n}\n\n/* -- see zlib.h -- */\ngzFile ZEXPORT gzopen(\n    const char *path,\n    const char *mode)\n{\n    return gz_open(path, -1, mode);\n}\n\n/* -- see zlib.h -- */\ngzFile ZEXPORT gzopen64(\n    const char *path,\n    const char *mode)\n{\n    return gz_open(path, -1, mode);\n}\n\n/* -- see zlib.h -- */\ngzFile ZEXPORT gzdopen(\n    int fd,\n    const char *mode)\n{\n    char *path;         /* identifier for error messages */\n    gzFile gz;\n\n    if (fd == -1 || (path = (char *)malloc(7 + 3 * sizeof(int))) == NULL)\n        return NULL;\n#if !defined(NO_snprintf) && !defined(NO_vsnprintf)\n    snprintf(path, 7 + 3 * sizeof(int), \"<fd:%d>\", fd); /* for debugging */\n#else\n    sprintf(path, \"<fd:%d>\", fd);   /* for debugging */\n#endif\n    gz = gz_open(path, fd, mode);\n    free(path);\n    return gz;\n}\n\n/* -- see zlib.h -- */\n#ifdef _WIN32\ngzFile ZEXPORT gzopen_w(\n    const wchar_t *path,\n    const char *mode)\n{\n    return gz_open(path, -2, mode);\n}\n#endif\n\n/* -- see zlib.h -- */\nint ZEXPORT gzbuffer(\n    gzFile file,\n    unsigned size)\n{\n    gz_statep state;\n\n    /* get internal structure and check integrity */\n    if (file == NULL)\n        return -1;\n    state = (gz_statep)file;\n    if (state->mode != GZ_READ && state->mode != GZ_WRITE)\n        return -1;\n\n    /* make sure we haven't already allocated memory */\n    if (state->size != 0)\n        return -1;\n\n    /* check and set requested size */\n    if (size < 2)\n        size = 2;               /* need two bytes to check magic header */\n    state->want = size;\n    return 0;\n}\n\n/* -- see zlib.h -- */\nint ZEXPORT gzrewind(\n    gzFile file)\n{\n    gz_statep state;\n\n    /* get internal structure */\n    if (file == NULL)\n        return -1;\n    state = (gz_statep)file;\n\n    /* check that we're reading and that there's no error */\n    if (state->mode != GZ_READ ||\n            (state->err != Z_OK && state->err != Z_BUF_ERROR))\n        return -1;\n\n    /* back up and start over */\n    if (LSEEK(state->fd, state->start, SEEK_SET) == -1)\n        return -1;\n    gz_reset(state);\n    return 0;\n}\n\n/* -- see zlib.h -- */\nz_off64_t ZEXPORT gzseek64(\n    gzFile file,\n    z_off64_t offset,\n    int whence)\n{\n    unsigned n;\n    z_off64_t ret;\n    gz_statep state;\n\n    /* get internal structure and check integrity */\n    if (file == NULL)\n        return -1;\n    state = (gz_statep)file;\n    if (state->mode != GZ_READ && state->mode != GZ_WRITE)\n        return -1;\n\n    /* check that there's no error */\n    if (state->err != Z_OK && state->err != Z_BUF_ERROR)\n        return -1;\n\n    /* can only seek from start or relative to current position */\n    if (whence != SEEK_SET && whence != SEEK_CUR)\n        return -1;\n\n    /* normalize offset to a SEEK_CUR specification */\n    if (whence == SEEK_SET)\n        offset -= state->x.pos;\n    else if (state->seek)\n        offset += state->skip;\n    state->seek = 0;\n\n    /* if within raw area while reading, just go there */\n    if (state->mode == GZ_READ && state->how == COPY &&\n            state->x.pos + offset >= 0) {\n        ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR);\n        if (ret == -1)\n            return -1;\n        state->x.have = 0;\n        state->eof = 0;\n        state->past = 0;\n        state->seek = 0;\n        gz_error(state, Z_OK, NULL);\n        state->strm.avail_in = 0;\n        state->x.pos += offset;\n        return state->x.pos;\n    }\n\n    /* calculate skip amount, rewinding if needed for back seek when reading */\n    if (offset < 0) {\n        if (state->mode != GZ_READ)         /* writing -- can't go backwards */\n            return -1;\n        offset += state->x.pos;\n        if (offset < 0)                     /* before start of file! */\n            return -1;\n        if (gzrewind(file) == -1)           /* rewind, then skip to offset */\n            return -1;\n    }\n\n    /* if reading, skip what's in output buffer (one less gzgetc() check) */\n    if (state->mode == GZ_READ) {\n        n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ?\n            (unsigned)offset : state->x.have;\n        state->x.have -= n;\n        state->x.next += n;\n        state->x.pos += n;\n        offset -= n;\n    }\n\n    /* request skip (if not zero) */\n    if (offset) {\n        state->seek = 1;\n        state->skip = offset;\n    }\n    return state->x.pos + offset;\n}\n\n/* -- see zlib.h -- */\nz_off_t ZEXPORT gzseek(\n    gzFile file,\n    z_off_t offset,\n    int whence)\n{\n    z_off64_t ret;\n\n    ret = gzseek64(file, (z_off64_t)offset, whence);\n    return ret == (z_off_t)ret ? (z_off_t)ret : -1;\n}\n\n/* -- see zlib.h -- */\nz_off64_t ZEXPORT gztell64(\n    gzFile file)\n{\n    gz_statep state;\n\n    /* get internal structure and check integrity */\n    if (file == NULL)\n        return -1;\n    state = (gz_statep)file;\n    if (state->mode != GZ_READ && state->mode != GZ_WRITE)\n        return -1;\n\n    /* return position */\n    return state->x.pos + (state->seek ? state->skip : 0);\n}\n\n/* -- see zlib.h -- */\nz_off_t ZEXPORT gztell(\n    gzFile file)\n{\n    z_off64_t ret;\n\n    ret = gztell64(file);\n    return ret == (z_off_t)ret ? (z_off_t)ret : -1;\n}\n\n/* -- see zlib.h -- */\nz_off64_t ZEXPORT gzoffset64(\n    gzFile file)\n{\n    z_off64_t offset;\n    gz_statep state;\n\n    /* get internal structure and check integrity */\n    if (file == NULL)\n        return -1;\n    state = (gz_statep)file;\n    if (state->mode != GZ_READ && state->mode != GZ_WRITE)\n        return -1;\n\n    /* compute and return effective offset in file */\n    offset = LSEEK(state->fd, 0, SEEK_CUR);\n    if (offset == -1)\n        return -1;\n    if (state->mode == GZ_READ)             /* reading */\n        offset -= state->strm.avail_in;     /* don't count buffered input */\n    return offset;\n}\n\n/* -- see zlib.h -- */\nz_off_t ZEXPORT gzoffset(\n    gzFile file)\n{\n    z_off64_t ret;\n\n    ret = gzoffset64(file);\n    return ret == (z_off_t)ret ? (z_off_t)ret : -1;\n}\n\n/* -- see zlib.h -- */\nint ZEXPORT gzeof(\n    gzFile file)\n{\n    gz_statep state;\n\n    /* get internal structure and check integrity */\n    if (file == NULL)\n        return 0;\n    state = (gz_statep)file;\n    if (state->mode != GZ_READ && state->mode != GZ_WRITE)\n        return 0;\n\n    /* return end-of-file state */\n    return state->mode == GZ_READ ? state->past : 0;\n}\n\n/* -- see zlib.h -- */\nconst char * ZEXPORT gzerror(\n    gzFile file,\n    int *errnum)\n{\n    gz_statep state;\n\n    /* get internal structure and check integrity */\n    if (file == NULL)\n        return NULL;\n    state = (gz_statep)file;\n    if (state->mode != GZ_READ && state->mode != GZ_WRITE)\n        return NULL;\n\n    /* return error information */\n    if (errnum != NULL)\n        *errnum = state->err;\n    return state->err == Z_MEM_ERROR ? \"out of memory\" :\n                                       (state->msg == NULL ? \"\" : state->msg);\n}\n\n/* -- see zlib.h -- */\nvoid ZEXPORT gzclearerr(\n    gzFile file)\n{\n    gz_statep state;\n\n    /* get internal structure and check integrity */\n    if (file == NULL)\n        return;\n    state = (gz_statep)file;\n    if (state->mode != GZ_READ && state->mode != GZ_WRITE)\n        return;\n\n    /* clear error and end-of-file */\n    if (state->mode == GZ_READ) {\n        state->eof = 0;\n        state->past = 0;\n    }\n    gz_error(state, Z_OK, NULL);\n}\n\n/* Create an error message in allocated memory and set state->err and\n   state->msg accordingly.  Free any previous error message already there.  Do\n   not try to free or allocate space if the error is Z_MEM_ERROR (out of\n   memory).  Simply save the error message as a static string.  If there is an\n   allocation failure constructing the error message, then convert the error to\n   out of memory. */\nvoid ZLIB_INTERNAL gz_error(\n    gz_statep state,\n    int err,\n    const char *msg)\n{\n    /* free previously allocated message and clear */\n    if (state->msg != NULL) {\n        if (state->err != Z_MEM_ERROR)\n            free(state->msg);\n        state->msg = NULL;\n    }\n\n    /* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */\n    if (err != Z_OK && err != Z_BUF_ERROR)\n        state->x.have = 0;\n\n    /* set error code, and if no message, then done */\n    state->err = err;\n    if (msg == NULL)\n        return;\n\n    /* for an out of memory error, return literal string when requested */\n    if (err == Z_MEM_ERROR)\n        return;\n\n    /* construct error message with path */\n    if ((state->msg = (char *)malloc(strlen(state->path) + strlen(msg) + 3)) ==\n            NULL) {\n        state->err = Z_MEM_ERROR;\n        return;\n    }\n#if !defined(NO_snprintf) && !defined(NO_vsnprintf)\n    snprintf(state->msg, strlen(state->path) + strlen(msg) + 3,\n             \"%s%s%s\", state->path, \": \", msg);\n#else\n    strcpy(state->msg, state->path);\n    strcat(state->msg, \": \");\n    strcat(state->msg, msg);\n#endif\n    return;\n}\n\n#ifndef INT_MAX\n/* portably return maximum value for an int (when limits.h presumed not\n   available) -- we need to do this to cover cases where 2's complement not\n   used, since C standard permits 1's complement and sign-bit representations,\n   otherwise we could just use ((unsigned)-1) >> 1 */\nunsigned ZLIB_INTERNAL gz_intmax()\n{\n    unsigned p, q;\n\n    p = 1;\n    do {\n        q = p;\n        p <<= 1;\n        p++;\n    } while (p > q);\n    return q >> 1;\n}\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/zlib_v128/gzread.c",
    "content": "/* gzread.c -- zlib functions for reading gzip files\n * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n#include \"gzguts.h\"\n\n/* Local functions */\nlocal int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *));\nlocal int gz_avail OF((gz_statep));\nlocal int gz_look OF((gz_statep));\nlocal int gz_decomp OF((gz_statep));\nlocal int gz_fetch OF((gz_statep));\nlocal int gz_skip OF((gz_statep, z_off64_t));\n\n/* Use read() to load a buffer -- return -1 on error, otherwise 0.  Read from\n   state->fd, and update state->eof, state->err, and state->msg as appropriate.\n   This function needs to loop on read(), since read() is not guaranteed to\n   read the number of bytes requested, depending on the type of descriptor. */\nlocal int gz_load(\n    gz_statep state,\n    unsigned char *buf,\n    unsigned len,\n    unsigned *have)\n{\n    int ret;\n\n    *have = 0;\n    do {\n        ret = read(state->fd, buf + *have, len - *have);\n        if (ret <= 0)\n            break;\n        *have += ret;\n    } while (*have < len);\n    if (ret < 0) {\n        gz_error(state, Z_ERRNO, zstrerror());\n        return -1;\n    }\n    if (ret == 0)\n        state->eof = 1;\n    return 0;\n}\n\n/* Load up input buffer and set eof flag if last data loaded -- return -1 on\n   error, 0 otherwise.  Note that the eof flag is set when the end of the input\n   file is reached, even though there may be unused data in the buffer.  Once\n   that data has been used, no more attempts will be made to read the file.\n   If strm->avail_in != 0, then the current data is moved to the beginning of\n   the input buffer, and then the remainder of the buffer is loaded with the\n   available data from the input file. */\nlocal int gz_avail(\n    gz_statep state)\n{\n    unsigned got;\n    z_streamp strm = &(state->strm);\n\n    if (state->err != Z_OK && state->err != Z_BUF_ERROR)\n        return -1;\n    if (state->eof == 0) {\n        if (strm->avail_in) {       /* copy what's there to the start */\n            unsigned char *p = state->in;\n            unsigned const char *q = strm->next_in;\n            unsigned n = strm->avail_in;\n            do {\n                *p++ = *q++;\n            } while (--n);\n        }\n        if (gz_load(state, state->in + strm->avail_in,\n                    state->size - strm->avail_in, &got) == -1)\n            return -1;\n        strm->avail_in += got;\n        strm->next_in = state->in;\n    }\n    return 0;\n}\n\n/* Look for gzip header, set up for inflate or copy.  state->x.have must be 0.\n   If this is the first time in, allocate required memory.  state->how will be\n   left unchanged if there is no more input data available, will be set to COPY\n   if there is no gzip header and direct copying will be performed, or it will\n   be set to GZIP for decompression.  If direct copying, then leftover input\n   data from the input buffer will be copied to the output buffer.  In that\n   case, all further file reads will be directly to either the output buffer or\n   a user buffer.  If decompressing, the inflate state will be initialized.\n   gz_look() will return 0 on success or -1 on failure. */\nlocal int gz_look(\n    gz_statep state)\n{\n    z_streamp strm = &(state->strm);\n\n    /* allocate read buffers and inflate memory */\n    if (state->size == 0) {\n        /* allocate buffers */\n        state->in = (unsigned char *)malloc(state->want);\n        state->out = (unsigned char *)malloc(state->want << 1);\n        if (state->in == NULL || state->out == NULL) {\n            if (state->out != NULL)\n                free(state->out);\n            if (state->in != NULL)\n                free(state->in);\n            gz_error(state, Z_MEM_ERROR, \"out of memory\");\n            return -1;\n        }\n        state->size = state->want;\n\n        /* allocate inflate memory */\n        state->strm.zalloc = Z_NULL;\n        state->strm.zfree = Z_NULL;\n        state->strm.opaque = Z_NULL;\n        state->strm.avail_in = 0;\n        state->strm.next_in = Z_NULL;\n        if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) {    /* gunzip */\n            free(state->out);\n            free(state->in);\n            state->size = 0;\n            gz_error(state, Z_MEM_ERROR, \"out of memory\");\n            return -1;\n        }\n    }\n\n    /* get at least the magic bytes in the input buffer */\n    if (strm->avail_in < 2) {\n        if (gz_avail(state) == -1)\n            return -1;\n        if (strm->avail_in == 0)\n            return 0;\n    }\n\n    /* look for gzip magic bytes -- if there, do gzip decoding (note: there is\n       a logical dilemma here when considering the case of a partially written\n       gzip file, to wit, if a single 31 byte is written, then we cannot tell\n       whether this is a single-byte file, or just a partially written gzip\n       file -- for here we assume that if a gzip file is being written, then\n       the header will be written in a single operation, so that reading a\n       single byte is sufficient indication that it is not a gzip file) */\n    if (strm->avail_in > 1 &&\n            strm->next_in[0] == 31 && strm->next_in[1] == 139) {\n        inflateReset(strm);\n        state->how = GZIP;\n        state->direct = 0;\n        return 0;\n    }\n\n    /* no gzip header -- if we were decoding gzip before, then this is trailing\n       garbage.  Ignore the trailing garbage and finish. */\n    if (state->direct == 0) {\n        strm->avail_in = 0;\n        state->eof = 1;\n        state->x.have = 0;\n        return 0;\n    }\n\n    /* doing raw i/o, copy any leftover input to output -- this assumes that\n       the output buffer is larger than the input buffer, which also assures\n       space for gzungetc() */\n    state->x.next = state->out;\n    if (strm->avail_in) {\n        memcpy(state->x.next, strm->next_in, strm->avail_in);\n        state->x.have = strm->avail_in;\n        strm->avail_in = 0;\n    }\n    state->how = COPY;\n    state->direct = 1;\n    return 0;\n}\n\n/* Decompress from input to the provided next_out and avail_out in the state.\n   On return, state->x.have and state->x.next point to the just decompressed\n   data.  If the gzip stream completes, state->how is reset to LOOK to look for\n   the next gzip stream or raw data, once state->x.have is depleted.  Returns 0\n   on success, -1 on failure. */\nlocal int gz_decomp(\n    gz_statep state)\n{\n    int ret = Z_OK;\n    unsigned had;\n    z_streamp strm = &(state->strm);\n\n    /* fill output buffer up to end of deflate stream */\n    had = strm->avail_out;\n    do {\n        /* get more input for inflate() */\n        if (strm->avail_in == 0 && gz_avail(state) == -1)\n            return -1;\n        if (strm->avail_in == 0) {\n            gz_error(state, Z_BUF_ERROR, \"unexpected end of file\");\n            break;\n        }\n\n        /* decompress and handle errors */\n        ret = inflate(strm, Z_NO_FLUSH);\n        if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) {\n            gz_error(state, Z_STREAM_ERROR,\n                     \"internal error: inflate stream corrupt\");\n            return -1;\n        }\n        if (ret == Z_MEM_ERROR) {\n            gz_error(state, Z_MEM_ERROR, \"out of memory\");\n            return -1;\n        }\n        if (ret == Z_DATA_ERROR) {              /* deflate stream invalid */\n            gz_error(state, Z_DATA_ERROR,\n                     strm->msg == NULL ? \"compressed data error\" : strm->msg);\n            return -1;\n        }\n    } while (strm->avail_out && ret != Z_STREAM_END);\n\n    /* update available output */\n    state->x.have = had - strm->avail_out;\n    state->x.next = strm->next_out - state->x.have;\n\n    /* if the gzip stream completed successfully, look for another */\n    if (ret == Z_STREAM_END)\n        state->how = LOOK;\n\n    /* good decompression */\n    return 0;\n}\n\n/* Fetch data and put it in the output buffer.  Assumes state->x.have is 0.\n   Data is either copied from the input file or decompressed from the input\n   file depending on state->how.  If state->how is LOOK, then a gzip header is\n   looked for to determine whether to copy or decompress.  Returns -1 on error,\n   otherwise 0.  gz_fetch() will leave state->how as COPY or GZIP unless the\n   end of the input file has been reached and all data has been processed.  */\nlocal int gz_fetch(\n    gz_statep state)\n{\n    z_streamp strm = &(state->strm);\n\n    do {\n        switch(state->how) {\n        case LOOK:      /* -> LOOK, COPY (only if never GZIP), or GZIP */\n            if (gz_look(state) == -1)\n                return -1;\n            if (state->how == LOOK)\n                return 0;\n            break;\n        case COPY:      /* -> COPY */\n            if (gz_load(state, state->out, state->size << 1, &(state->x.have))\n                    == -1)\n                return -1;\n            state->x.next = state->out;\n            return 0;\n        case GZIP:      /* -> GZIP or LOOK (if end of gzip stream) */\n            strm->avail_out = state->size << 1;\n            strm->next_out = state->out;\n            if (gz_decomp(state) == -1)\n                return -1;\n        }\n    } while (state->x.have == 0 && (!state->eof || strm->avail_in));\n    return 0;\n}\n\n/* Skip len uncompressed bytes of output.  Return -1 on error, 0 on success. */\nlocal int gz_skip(\n    gz_statep state,\n    z_off64_t len)\n{\n    unsigned n;\n\n    /* skip over len bytes or reach end-of-file, whichever comes first */\n    while (len)\n        /* skip over whatever is in output buffer */\n        if (state->x.have) {\n            n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ?\n                (unsigned)len : state->x.have;\n            state->x.have -= n;\n            state->x.next += n;\n            state->x.pos += n;\n            len -= n;\n        }\n\n        /* output buffer empty -- return if we're at the end of the input */\n        else if (state->eof && state->strm.avail_in == 0)\n            break;\n\n        /* need more data to skip -- load up output buffer */\n        else {\n            /* get more output, looking for header if required */\n            if (gz_fetch(state) == -1)\n                return -1;\n        }\n    return 0;\n}\n\n/* -- see zlib.h -- */\nint ZEXPORT gzread(\n    gzFile file,\n    voidp buf,\n    unsigned len)\n{\n    unsigned got, n;\n    gz_statep state;\n    z_streamp strm;\n\n    /* get internal structure */\n    if (file == NULL)\n        return -1;\n    state = (gz_statep)file;\n    strm = &(state->strm);\n\n    /* check that we're reading and that there's no (serious) error */\n    if (state->mode != GZ_READ ||\n            (state->err != Z_OK && state->err != Z_BUF_ERROR))\n        return -1;\n\n    /* since an int is returned, make sure len fits in one, otherwise return\n       with an error (this avoids the flaw in the interface) */\n    if ((int)len < 0) {\n        gz_error(state, Z_DATA_ERROR, \"requested length does not fit in int\");\n        return -1;\n    }\n\n    /* if len is zero, avoid unnecessary operations */\n    if (len == 0)\n        return 0;\n\n    /* process a skip request */\n    if (state->seek) {\n        state->seek = 0;\n        if (gz_skip(state, state->skip) == -1)\n            return -1;\n    }\n\n    /* get len bytes to buf, or less than len if at the end */\n    got = 0;\n    do {\n        /* first just try copying data from the output buffer */\n        if (state->x.have) {\n            n = state->x.have > len ? len : state->x.have;\n            memcpy(buf, state->x.next, n);\n            state->x.next += n;\n            state->x.have -= n;\n        }\n\n        /* output buffer empty -- return if we're at the end of the input */\n        else if (state->eof && strm->avail_in == 0) {\n            state->past = 1;        /* tried to read past end */\n            break;\n        }\n\n        /* need output data -- for small len or new stream load up our output\n           buffer */\n        else if (state->how == LOOK || len < (state->size << 1)) {\n            /* get more output, looking for header if required */\n            if (gz_fetch(state) == -1)\n                return -1;\n            continue;       /* no progress yet -- go back to copy above */\n            /* the copy above assures that we will leave with space in the\n               output buffer, allowing at least one gzungetc() to succeed */\n        }\n\n        /* large len -- read directly into user buffer */\n        else if (state->how == COPY) {      /* read directly */\n            if (gz_load(state, (unsigned char *)buf, len, &n) == -1)\n                return -1;\n        }\n\n        /* large len -- decompress directly into user buffer */\n        else {  /* state->how == GZIP */\n            strm->avail_out = len;\n            strm->next_out = (unsigned char *)buf;\n            if (gz_decomp(state) == -1)\n                return -1;\n            n = state->x.have;\n            state->x.have = 0;\n        }\n\n        /* update progress */\n        len -= n;\n        buf = (char *)buf + n;\n        got += n;\n        state->x.pos += n;\n    } while (len);\n\n    /* return number of bytes read into user buffer (will fit in int) */\n    return (int)got;\n}\n\n/* -- see zlib.h -- */\n#ifdef Z_PREFIX_SET\n#  undef z_gzgetc\n#else\n#  undef gzgetc\n#endif\nint ZEXPORT gzgetc(\n    gzFile file)\n{\n    int ret;\n    unsigned char buf[1];\n    gz_statep state;\n\n    /* get internal structure */\n    if (file == NULL)\n        return -1;\n    state = (gz_statep)file;\n\n    /* check that we're reading and that there's no (serious) error */\n    if (state->mode != GZ_READ ||\n        (state->err != Z_OK && state->err != Z_BUF_ERROR))\n        return -1;\n\n    /* try output buffer (no need to check for skip request) */\n    if (state->x.have) {\n        state->x.have--;\n        state->x.pos++;\n        return *(state->x.next)++;\n    }\n\n    /* nothing there -- try gzread() */\n    ret = gzread(file, buf, 1);\n    return ret < 1 ? -1 : buf[0];\n}\n\nint ZEXPORT gzgetc_(\ngzFile file)\n{\n    return gzgetc(file);\n}\n\n/* -- see zlib.h -- */\nint ZEXPORT gzungetc(\n    int c,\n    gzFile file)\n{\n    gz_statep state;\n\n    /* get internal structure */\n    if (file == NULL)\n        return -1;\n    state = (gz_statep)file;\n\n    /* check that we're reading and that there's no (serious) error */\n    if (state->mode != GZ_READ ||\n        (state->err != Z_OK && state->err != Z_BUF_ERROR))\n        return -1;\n\n    /* process a skip request */\n    if (state->seek) {\n        state->seek = 0;\n        if (gz_skip(state, state->skip) == -1)\n            return -1;\n    }\n\n    /* can't push EOF */\n    if (c < 0)\n        return -1;\n\n    /* if output buffer empty, put byte at end (allows more pushing) */\n    if (state->x.have == 0) {\n        state->x.have = 1;\n        state->x.next = state->out + (state->size << 1) - 1;\n        state->x.next[0] = c;\n        state->x.pos--;\n        state->past = 0;\n        return c;\n    }\n\n    /* if no room, give up (must have already done a gzungetc()) */\n    if (state->x.have == (state->size << 1)) {\n        gz_error(state, Z_DATA_ERROR, \"out of room to push characters\");\n        return -1;\n    }\n\n    /* slide output data if needed and insert byte before existing data */\n    if (state->x.next == state->out) {\n        unsigned char *src = state->out + state->x.have;\n        unsigned char *dest = state->out + (state->size << 1);\n        while (src > state->out)\n            *--dest = *--src;\n        state->x.next = dest;\n    }\n    state->x.have++;\n    state->x.next--;\n    state->x.next[0] = c;\n    state->x.pos--;\n    state->past = 0;\n    return c;\n}\n\n/* -- see zlib.h -- */\nchar * ZEXPORT gzgets(\n    gzFile file,\n    char *buf,\n    int len)\n{\n    unsigned left, n;\n    char *str;\n    unsigned char *eol;\n    gz_statep state;\n\n    /* check parameters and get internal structure */\n    if (file == NULL || buf == NULL || len < 1)\n        return NULL;\n    state = (gz_statep)file;\n\n    /* check that we're reading and that there's no (serious) error */\n    if (state->mode != GZ_READ ||\n        (state->err != Z_OK && state->err != Z_BUF_ERROR))\n        return NULL;\n\n    /* process a skip request */\n    if (state->seek) {\n        state->seek = 0;\n        if (gz_skip(state, state->skip) == -1)\n            return NULL;\n    }\n\n    /* copy output bytes up to new line or len - 1, whichever comes first --\n       append a terminating zero to the string (we don't check for a zero in\n       the contents, let the user worry about that) */\n    str = buf;\n    left = (unsigned)len - 1;\n    if (left) do {\n        /* assure that something is in the output buffer */\n        if (state->x.have == 0 && gz_fetch(state) == -1)\n            return NULL;                /* error */\n        if (state->x.have == 0) {       /* end of file */\n            state->past = 1;            /* read past end */\n            break;                      /* return what we have */\n        }\n\n        /* look for end-of-line in current output buffer */\n        n = state->x.have > left ? left : state->x.have;\n        eol = (unsigned char *)memchr(state->x.next, '\\n', n);\n        if (eol != NULL)\n            n = (unsigned)(eol - state->x.next) + 1;\n\n        /* copy through end-of-line, or remainder if not found */\n        memcpy(buf, state->x.next, n);\n        state->x.have -= n;\n        state->x.next += n;\n        state->x.pos += n;\n        left -= n;\n        buf += n;\n    } while (left && eol == NULL);\n\n    /* return terminated string, or if nothing, end of file */\n    if (buf == str)\n        return NULL;\n    buf[0] = 0;\n    return str;\n}\n\n/* -- see zlib.h -- */\nint ZEXPORT gzdirect(\n    gzFile file)\n{\n    gz_statep state;\n\n    /* get internal structure */\n    if (file == NULL)\n        return 0;\n    state = (gz_statep)file;\n\n    /* if the state is not known, but we can find out, then do so (this is\n       mainly for right after a gzopen() or gzdopen()) */\n    if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0)\n        (void)gz_look(state);\n\n    /* return 1 if transparent, 0 if processing a gzip stream */\n    return state->direct;\n}\n\n/* -- see zlib.h -- */\nint ZEXPORT gzclose_r(\n    gzFile file)\n{\n    int ret, err;\n    gz_statep state;\n\n    /* get internal structure */\n    if (file == NULL)\n        return Z_STREAM_ERROR;\n    state = (gz_statep)file;\n\n    /* check that we're reading */\n    if (state->mode != GZ_READ)\n        return Z_STREAM_ERROR;\n\n    /* free memory and close file */\n    if (state->size) {\n        inflateEnd(&(state->strm));\n        free(state->out);\n        free(state->in);\n    }\n    err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK;\n    gz_error(state, Z_OK, NULL);\n    free(state->path);\n    ret = close(state->fd);\n    free(state);\n    return ret ? Z_ERRNO : err;\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/zlib_v128/gzwrite.c",
    "content": "/* gzwrite.c -- zlib functions for writing gzip files\n * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n#include \"gzguts.h\"\n\n/* Local functions */\nlocal int gz_init OF((gz_statep));\nlocal int gz_comp OF((gz_statep, int));\nlocal int gz_zero OF((gz_statep, z_off64_t));\n\n/* Initialize state for writing a gzip file.  Mark initialization by setting\n   state->size to non-zero.  Return -1 on failure or 0 on success. */\nlocal int gz_init(\n    gz_statep state)\n{\n    int ret;\n    z_streamp strm = &(state->strm);\n\n    /* allocate input buffer */\n    state->in = (unsigned char *)malloc(state->want);\n    if (state->in == NULL) {\n        gz_error(state, Z_MEM_ERROR, \"out of memory\");\n        return -1;\n    }\n\n    /* only need output buffer and deflate state if compressing */\n    if (!state->direct) {\n        /* allocate output buffer */\n        state->out = (unsigned char *)malloc(state->want);\n        if (state->out == NULL) {\n            free(state->in);\n            gz_error(state, Z_MEM_ERROR, \"out of memory\");\n            return -1;\n        }\n\n        /* allocate deflate memory, set up for gzip compression */\n        strm->zalloc = Z_NULL;\n        strm->zfree = Z_NULL;\n        strm->opaque = Z_NULL;\n        ret = deflateInit2(strm, state->level, Z_DEFLATED,\n                           MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy);\n        if (ret != Z_OK) {\n            free(state->out);\n            free(state->in);\n            gz_error(state, Z_MEM_ERROR, \"out of memory\");\n            return -1;\n        }\n    }\n\n    /* mark state as initialized */\n    state->size = state->want;\n\n    /* initialize write buffer if compressing */\n    if (!state->direct) {\n        strm->avail_out = state->size;\n        strm->next_out = state->out;\n        state->x.next = strm->next_out;\n    }\n    return 0;\n}\n\n/* Compress whatever is at avail_in and next_in and write to the output file.\n   Return -1 if there is an error writing to the output file, otherwise 0.\n   flush is assumed to be a valid deflate() flush value.  If flush is Z_FINISH,\n   then the deflate() state is reset to start a new gzip stream.  If gz->direct\n   is true, then simply write to the output file without compressing, and\n   ignore flush. */\nlocal int gz_comp(\n    gz_statep state,\n    int flush)\n{\n    int ret, got;\n    unsigned have;\n    z_streamp strm = &(state->strm);\n\n    /* allocate memory if this is the first time through */\n    if (state->size == 0 && gz_init(state) == -1)\n        return -1;\n\n    /* write directly if requested */\n    if (state->direct) {\n        got = write(state->fd, strm->next_in, strm->avail_in);\n        if (got < 0 || (unsigned)got != strm->avail_in) {\n            gz_error(state, Z_ERRNO, zstrerror());\n            return -1;\n        }\n        strm->avail_in = 0;\n        return 0;\n    }\n\n    /* run deflate() on provided input until it produces no more output */\n    ret = Z_OK;\n    do {\n        /* write out current buffer contents if full, or if flushing, but if\n           doing Z_FINISH then don't write until we get to Z_STREAM_END */\n        if (strm->avail_out == 0 || (flush != Z_NO_FLUSH &&\n            (flush != Z_FINISH || ret == Z_STREAM_END))) {\n            have = (unsigned)(strm->next_out - state->x.next);\n            if (have && ((got = write(state->fd, state->x.next, have)) < 0 ||\n                         (unsigned)got != have)) {\n                gz_error(state, Z_ERRNO, zstrerror());\n                return -1;\n            }\n            if (strm->avail_out == 0) {\n                strm->avail_out = state->size;\n                strm->next_out = state->out;\n            }\n            state->x.next = strm->next_out;\n        }\n\n        /* compress */\n        have = strm->avail_out;\n        ret = deflate(strm, flush);\n        if (ret == Z_STREAM_ERROR) {\n            gz_error(state, Z_STREAM_ERROR,\n                      \"internal error: deflate stream corrupt\");\n            return -1;\n        }\n        have -= strm->avail_out;\n    } while (have);\n\n    /* if that completed a deflate stream, allow another to start */\n    if (flush == Z_FINISH)\n        deflateReset(strm);\n\n    /* all done, no errors */\n    return 0;\n}\n\n/* Compress len zeros to output.  Return -1 on error, 0 on success. */\nlocal int gz_zero(\n    gz_statep state,\n    z_off64_t len)\n{\n    int first;\n    unsigned n;\n    z_streamp strm = &(state->strm);\n\n    /* consume whatever's left in the input buffer */\n    if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)\n        return -1;\n\n    /* compress len zeros (len guaranteed > 0) */\n    first = 1;\n    while (len) {\n        n = GT_OFF(state->size) || (z_off64_t)state->size > len ?\n            (unsigned)len : state->size;\n        if (first) {\n            memset(state->in, 0, n);\n            first = 0;\n        }\n        strm->avail_in = n;\n        strm->next_in = state->in;\n        state->x.pos += n;\n        if (gz_comp(state, Z_NO_FLUSH) == -1)\n            return -1;\n        len -= n;\n    }\n    return 0;\n}\n\n/* -- see zlib.h -- */\nint ZEXPORT gzwrite(\n    gzFile file,\n    voidpc buf,\n    unsigned len)\n{\n    unsigned put = len;\n    gz_statep state;\n    z_streamp strm;\n\n    /* get internal structure */\n    if (file == NULL)\n        return 0;\n    state = (gz_statep)file;\n    strm = &(state->strm);\n\n    /* check that we're writing and that there's no error */\n    if (state->mode != GZ_WRITE || state->err != Z_OK)\n        return 0;\n\n    /* since an int is returned, make sure len fits in one, otherwise return\n       with an error (this avoids the flaw in the interface) */\n    if ((int)len < 0) {\n        gz_error(state, Z_DATA_ERROR, \"requested length does not fit in int\");\n        return 0;\n    }\n\n    /* if len is zero, avoid unnecessary operations */\n    if (len == 0)\n        return 0;\n\n    /* allocate memory if this is the first time through */\n    if (state->size == 0 && gz_init(state) == -1)\n        return 0;\n\n    /* check for seek request */\n    if (state->seek) {\n        state->seek = 0;\n        if (gz_zero(state, state->skip) == -1)\n            return 0;\n    }\n\n    /* for small len, copy to input buffer, otherwise compress directly */\n    if (len < state->size) {\n        /* copy to input buffer, compress when full */\n        do {\n            unsigned have, copy;\n\n            if (strm->avail_in == 0)\n                strm->next_in = state->in;\n            have = (unsigned)((strm->next_in + strm->avail_in) - state->in);\n            copy = state->size - have;\n            if (copy > len)\n                copy = len;\n            memcpy(state->in + have, buf, copy);\n            strm->avail_in += copy;\n            state->x.pos += copy;\n            buf = (const char *)buf + copy;\n            len -= copy;\n            if (len && gz_comp(state, Z_NO_FLUSH) == -1)\n                return 0;\n        } while (len);\n    }\n    else {\n        /* consume whatever's left in the input buffer */\n        if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)\n            return 0;\n\n        /* directly compress user buffer to file */\n        strm->avail_in = len;\n        strm->next_in = (z_const Bytef *)buf;\n        state->x.pos += len;\n        if (gz_comp(state, Z_NO_FLUSH) == -1)\n            return 0;\n    }\n\n    /* input was all buffered or compressed (put will fit in int) */\n    return (int)put;\n}\n\n/* -- see zlib.h -- */\nint ZEXPORT gzputc(\n    gzFile file,\n    int c)\n{\n    unsigned have;\n    unsigned char buf[1];\n    gz_statep state;\n    z_streamp strm;\n\n    /* get internal structure */\n    if (file == NULL)\n        return -1;\n    state = (gz_statep)file;\n    strm = &(state->strm);\n\n    /* check that we're writing and that there's no error */\n    if (state->mode != GZ_WRITE || state->err != Z_OK)\n        return -1;\n\n    /* check for seek request */\n    if (state->seek) {\n        state->seek = 0;\n        if (gz_zero(state, state->skip) == -1)\n            return -1;\n    }\n\n    /* try writing to input buffer for speed (state->size == 0 if buffer not\n       initialized) */\n    if (state->size) {\n        if (strm->avail_in == 0)\n            strm->next_in = state->in;\n        have = (unsigned)((strm->next_in + strm->avail_in) - state->in);\n        if (have < state->size) {\n            state->in[have] = c;\n            strm->avail_in++;\n            state->x.pos++;\n            return c & 0xff;\n        }\n    }\n\n    /* no room in buffer or not initialized, use gz_write() */\n    buf[0] = c;\n    if (gzwrite(file, buf, 1) != 1)\n        return -1;\n    return c & 0xff;\n}\n\n/* -- see zlib.h -- */\nint ZEXPORT gzputs(\n    gzFile file,\n    const char *str)\n{\n    int ret;\n    unsigned len;\n\n    /* write string */\n    len = (unsigned)strlen(str);\n    ret = gzwrite(file, str, len);\n    return ret == 0 && len != 0 ? -1 : ret;\n}\n\n#if defined(STDC) || defined(Z_HAVE_STDARG_H)\n#include <stdarg.h>\n\n/* -- see zlib.h -- */\nint ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va)\n{\n    int size, len;\n    gz_statep state;\n    z_streamp strm;\n\n    /* get internal structure */\n    if (file == NULL)\n        return -1;\n    state = (gz_statep)file;\n    strm = &(state->strm);\n\n    /* check that we're writing and that there's no error */\n    if (state->mode != GZ_WRITE || state->err != Z_OK)\n        return 0;\n\n    /* make sure we have some buffer space */\n    if (state->size == 0 && gz_init(state) == -1)\n        return 0;\n\n    /* check for seek request */\n    if (state->seek) {\n        state->seek = 0;\n        if (gz_zero(state, state->skip) == -1)\n            return 0;\n    }\n\n    /* consume whatever's left in the input buffer */\n    if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)\n        return 0;\n\n    /* do the printf() into the input buffer, put length in len */\n    size = (int)(state->size);\n    state->in[size - 1] = 0;\n#ifdef NO_vsnprintf\n#  ifdef HAS_vsprintf_void\n    (void)vsprintf((char *)(state->in), format, va);\n    for (len = 0; len < size; len++)\n        if (state->in[len] == 0) break;\n#  else\n    len = vsprintf((char *)(state->in), format, va);\n#  endif\n#else\n#  ifdef HAS_vsnprintf_void\n    (void)vsnprintf((char *)(state->in), size, format, va);\n    len = strlen((char *)(state->in));\n#  else\n    len = vsnprintf((char *)(state->in), size, format, va);\n#  endif\n#endif\n\n    /* check that printf() results fit in buffer */\n    if (len <= 0 || len >= (int)size || state->in[size - 1] != 0)\n        return 0;\n\n    /* update buffer and position, defer compression until needed */\n    strm->avail_in = (unsigned)len;\n    strm->next_in = state->in;\n    state->x.pos += len;\n    return len;\n}\n\nint ZEXPORTVA gzprintf(gzFile file, const char *format, ...)\n{\n    va_list va;\n    int ret;\n\n    va_start(va, format);\n    ret = gzvprintf(file, format, va);\n    va_end(va);\n    return ret;\n}\n\n#else /* !STDC && !Z_HAVE_STDARG_H */\n\n/* -- see zlib.h -- */\nint ZEXPORTVA gzprintf (\n    gzFile file,\n    const char *format,\n    int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10,\n        int a11, int a12, int a13, int a14, int a15, int a16, int a17, int a18, int a19, int a20)\n{\n    int size, len;\n    gz_statep state;\n    z_streamp strm;\n\n    /* get internal structure */\n    if (file == NULL)\n        return -1;\n    state = (gz_statep)file;\n    strm = &(state->strm);\n\n    /* check that can really pass pointer in ints */\n    if (sizeof(int) != sizeof(void *))\n        return 0;\n\n    /* check that we're writing and that there's no error */\n    if (state->mode != GZ_WRITE || state->err != Z_OK)\n        return 0;\n\n    /* make sure we have some buffer space */\n    if (state->size == 0 && gz_init(state) == -1)\n        return 0;\n\n    /* check for seek request */\n    if (state->seek) {\n        state->seek = 0;\n        if (gz_zero(state, state->skip) == -1)\n            return 0;\n    }\n\n    /* consume whatever's left in the input buffer */\n    if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)\n        return 0;\n\n    /* do the printf() into the input buffer, put length in len */\n    size = (int)(state->size);\n    state->in[size - 1] = 0;\n#ifdef NO_snprintf\n#  ifdef HAS_sprintf_void\n    sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8,\n            a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);\n    for (len = 0; len < size; len++)\n        if (state->in[len] == 0) break;\n#  else\n    len = sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8,\n                  a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);\n#  endif\n#else\n#  ifdef HAS_snprintf_void\n    snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, a7, a8,\n             a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);\n    len = strlen((char *)(state->in));\n#  else\n    len = snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6,\n                   a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18,\n                   a19, a20);\n#  endif\n#endif\n\n    /* check that printf() results fit in buffer */\n    if (len <= 0 || len >= (int)size || state->in[size - 1] != 0)\n        return 0;\n\n    /* update buffer and position, defer compression until needed */\n    strm->avail_in = (unsigned)len;\n    strm->next_in = state->in;\n    state->x.pos += len;\n    return len;\n}\n\n#endif\n\n/* -- see zlib.h -- */\nint ZEXPORT gzflush(\n    gzFile file,\n    int flush)\n{\n    gz_statep state;\n\n    /* get internal structure */\n    if (file == NULL)\n        return -1;\n    state = (gz_statep)file;\n\n    /* check that we're writing and that there's no error */\n    if (state->mode != GZ_WRITE || state->err != Z_OK)\n        return Z_STREAM_ERROR;\n\n    /* check flush parameter */\n    if (flush < 0 || flush > Z_FINISH)\n        return Z_STREAM_ERROR;\n\n    /* check for seek request */\n    if (state->seek) {\n        state->seek = 0;\n        if (gz_zero(state, state->skip) == -1)\n            return -1;\n    }\n\n    /* compress remaining data with requested flush */\n    gz_comp(state, flush);\n    return state->err;\n}\n\n/* -- see zlib.h -- */\nint ZEXPORT gzsetparams(\n    gzFile file,\n    int level,\n    int strategy)\n{\n    gz_statep state;\n    z_streamp strm;\n\n    /* get internal structure */\n    if (file == NULL)\n        return Z_STREAM_ERROR;\n    state = (gz_statep)file;\n    strm = &(state->strm);\n\n    /* check that we're writing and that there's no error */\n    if (state->mode != GZ_WRITE || state->err != Z_OK)\n        return Z_STREAM_ERROR;\n\n    /* if no change is requested, then do nothing */\n    if (level == state->level && strategy == state->strategy)\n        return Z_OK;\n\n    /* check for seek request */\n    if (state->seek) {\n        state->seek = 0;\n        if (gz_zero(state, state->skip) == -1)\n            return -1;\n    }\n\n    /* change compression parameters for subsequent input */\n    if (state->size) {\n        /* flush previous input with previous parameters before changing */\n        if (strm->avail_in && gz_comp(state, Z_PARTIAL_FLUSH) == -1)\n            return state->err;\n        deflateParams(strm, level, strategy);\n    }\n    state->level = level;\n    state->strategy = strategy;\n    return Z_OK;\n}\n\n/* -- see zlib.h -- */\nint ZEXPORT gzclose_w(\n    gzFile file)\n{\n    int ret = Z_OK;\n    gz_statep state;\n\n    /* get internal structure */\n    if (file == NULL)\n        return Z_STREAM_ERROR;\n    state = (gz_statep)file;\n\n    /* check that we're writing */\n    if (state->mode != GZ_WRITE)\n        return Z_STREAM_ERROR;\n\n    /* check for seek request */\n    if (state->seek) {\n        state->seek = 0;\n        if (gz_zero(state, state->skip) == -1)\n            ret = state->err;\n    }\n\n    /* flush, free memory, and close file */\n    if (gz_comp(state, Z_FINISH) == -1)\n        ret = state->err;\n    if (state->size) {\n        if (!state->direct) {\n            (void)deflateEnd(&(state->strm));\n            free(state->out);\n        }\n        free(state->in);\n    }\n    gz_error(state, Z_OK, NULL);\n    free(state->path);\n    if (close(state->fd) == -1)\n        ret = Z_ERRNO;\n    free(state);\n    return ret;\n}\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/zlib_v128/inffast.h",
    "content": "/* inffast.h -- header to use inffast.c\n * Copyright (C) 1995-2003, 2010 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* WARNING: this file should *not* be used by applications. It is\n   part of the implementation of the compression library and is\n   subject to change. Applications should only use zlib.h.\n */\n\nvoid ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start));\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/zlib_v128/inffixed.h",
    "content": "    /* inffixed.h -- table for decoding fixed codes\n     * Generated automatically by makefixed().\n     */\n\n    /* WARNING: this file should *not* be used by applications.\n       It is part of the implementation of this library and is\n       subject to change. Applications should only use zlib.h.\n     */\n\n    static const code lenfix[512] = {\n        {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48},\n        {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128},\n        {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59},\n        {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176},\n        {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20},\n        {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100},\n        {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8},\n        {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216},\n        {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76},\n        {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114},\n        {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2},\n        {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148},\n        {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42},\n        {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86},\n        {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15},\n        {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236},\n        {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62},\n        {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142},\n        {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31},\n        {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162},\n        {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25},\n        {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105},\n        {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4},\n        {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202},\n        {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69},\n        {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125},\n        {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13},\n        {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195},\n        {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35},\n        {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91},\n        {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19},\n        {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246},\n        {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55},\n        {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135},\n        {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99},\n        {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190},\n        {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16},\n        {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96},\n        {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6},\n        {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209},\n        {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72},\n        {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116},\n        {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4},\n        {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153},\n        {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44},\n        {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82},\n        {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11},\n        {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229},\n        {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58},\n        {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138},\n        {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51},\n        {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173},\n        {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30},\n        {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110},\n        {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0},\n        {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195},\n        {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65},\n        {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121},\n        {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9},\n        {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258},\n        {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37},\n        {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93},\n        {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23},\n        {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251},\n        {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51},\n        {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131},\n        {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67},\n        {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183},\n        {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23},\n        {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103},\n        {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9},\n        {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223},\n        {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79},\n        {0,9,255}\n    };\n\n    static const code distfix[32] = {\n        {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025},\n        {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193},\n        {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385},\n        {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577},\n        {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073},\n        {22,5,193},{64,5,0}\n    };\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/zlib_v128/inflate.h",
    "content": "/* inflate.h -- internal inflate state definition\n * Copyright (C) 1995-2009 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* WARNING: this file should *not* be used by applications. It is\n   part of the implementation of the compression library and is\n   subject to change. Applications should only use zlib.h.\n */\n\n/* define NO_GZIP when compiling if you want to disable gzip header and\n   trailer decoding by inflate().  NO_GZIP would be used to avoid linking in\n   the crc code when it is not needed.  For shared libraries, gzip decoding\n   should be left enabled. */\n#ifndef NO_GZIP\n#  define GUNZIP\n#endif\n\n/* Possible inflate modes between inflate() calls */\ntypedef enum {\n    HEAD,       /* i: waiting for magic header */\n    FLAGS,      /* i: waiting for method and flags (gzip) */\n    TIME,       /* i: waiting for modification time (gzip) */\n    OS,         /* i: waiting for extra flags and operating system (gzip) */\n    EXLEN,      /* i: waiting for extra length (gzip) */\n    EXTRA,      /* i: waiting for extra bytes (gzip) */\n    NAME,       /* i: waiting for end of file name (gzip) */\n    COMMENT,    /* i: waiting for end of comment (gzip) */\n    HCRC,       /* i: waiting for header crc (gzip) */\n    DICTID,     /* i: waiting for dictionary check value */\n    DICT,       /* waiting for inflateSetDictionary() call */\n        TYPE,       /* i: waiting for type bits, including last-flag bit */\n        TYPEDO,     /* i: same, but skip check to exit inflate on new block */\n        STORED,     /* i: waiting for stored size (length and complement) */\n        COPY_,      /* i/o: same as COPY below, but only first time in */\n        COPY,       /* i/o: waiting for input or output to copy stored block */\n        TABLE,      /* i: waiting for dynamic block table lengths */\n        LENLENS,    /* i: waiting for code length code lengths */\n        CODELENS,   /* i: waiting for length/lit and distance code lengths */\n            LEN_,       /* i: same as LEN below, but only first time in */\n            LEN,        /* i: waiting for length/lit/eob code */\n            LENEXT,     /* i: waiting for length extra bits */\n            DIST,       /* i: waiting for distance code */\n            DISTEXT,    /* i: waiting for distance extra bits */\n            MATCH,      /* o: waiting for output space to copy string */\n            LIT,        /* o: waiting for output space to write literal */\n    CHECK,      /* i: waiting for 32-bit check value */\n    LENGTH,     /* i: waiting for 32-bit length (gzip) */\n    DONE,       /* finished check, done -- remain here until reset */\n    BAD,        /* got a data error -- remain here until reset */\n    MEM,        /* got an inflate() memory error -- remain here until reset */\n    SYNC        /* looking for synchronization bytes to restart inflate() */\n} inflate_mode;\n\n/*\n    State transitions between above modes -\n\n    (most modes can go to BAD or MEM on error -- not shown for clarity)\n\n    Process header:\n        HEAD -> (gzip) or (zlib) or (raw)\n        (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT ->\n                  HCRC -> TYPE\n        (zlib) -> DICTID or TYPE\n        DICTID -> DICT -> TYPE\n        (raw) -> TYPEDO\n    Read deflate blocks:\n            TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK\n            STORED -> COPY_ -> COPY -> TYPE\n            TABLE -> LENLENS -> CODELENS -> LEN_\n            LEN_ -> LEN\n    Read deflate codes in fixed or dynamic block:\n                LEN -> LENEXT or LIT or TYPE\n                LENEXT -> DIST -> DISTEXT -> MATCH -> LEN\n                LIT -> LEN\n    Process trailer:\n        CHECK -> LENGTH -> DONE\n */\n\n/* state maintained between inflate() calls.  Approximately 10K bytes. */\nstruct inflate_state {\n    inflate_mode mode;          /* current inflate mode */\n    int last;                   /* true if processing last block */\n    int wrap;                   /* bit 0 true for zlib, bit 1 true for gzip */\n    int havedict;               /* true if dictionary provided */\n    int flags;                  /* gzip header method and flags (0 if zlib) */\n    unsigned dmax;              /* zlib header max distance (INFLATE_STRICT) */\n    unsigned long check;        /* protected copy of check value */\n    unsigned long total;        /* protected copy of output count */\n    gz_headerp head;            /* where to save gzip header information */\n        /* sliding window */\n    unsigned wbits;             /* log base 2 of requested window size */\n    unsigned wsize;             /* window size or zero if not using window */\n    unsigned whave;             /* valid bytes in the window */\n    unsigned wnext;             /* window write index */\n    unsigned char FAR *window;  /* allocated sliding window, if needed */\n        /* bit accumulator */\n    unsigned long hold;         /* input bit accumulator */\n    unsigned bits;              /* number of bits in \"in\" */\n        /* for string and stored block copying */\n    unsigned length;            /* literal or length of data to copy */\n    unsigned offset;            /* distance back to copy string from */\n        /* for table and code decoding */\n    unsigned extra;             /* extra bits needed */\n        /* fixed and dynamic code tables */\n    code const FAR *lencode;    /* starting table for length/literal codes */\n    code const FAR *distcode;   /* starting table for distance codes */\n    unsigned lenbits;           /* index bits for lencode */\n    unsigned distbits;          /* index bits for distcode */\n        /* dynamic table building */\n    unsigned ncode;             /* number of code length code lengths */\n    unsigned nlen;              /* number of length code lengths */\n    unsigned ndist;             /* number of distance code lengths */\n    unsigned have;              /* number of code lengths in lens[] */\n    code FAR *next;             /* next available space in codes[] */\n    unsigned short lens[320];   /* temporary storage for code lengths */\n    unsigned short work[288];   /* work area for code table building */\n    code codes[ENOUGH];         /* space for code tables */\n    int sane;                   /* if false, allow invalid distance too far */\n    int back;                   /* bits back of last unprocessed length/lit */\n    unsigned was;               /* initial length of match */\n};\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/zlib_v128/inftrees.h",
    "content": "/* inftrees.h -- header to use inftrees.c\n * Copyright (C) 1995-2005, 2010 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* WARNING: this file should *not* be used by applications. It is\n   part of the implementation of the compression library and is\n   subject to change. Applications should only use zlib.h.\n */\n\n/* Structure for decoding tables.  Each entry provides either the\n   information needed to do the operation requested by the code that\n   indexed that table entry, or it provides a pointer to another\n   table that indexes more bits of the code.  op indicates whether\n   the entry is a pointer to another table, a literal, a length or\n   distance, an end-of-block, or an invalid code.  For a table\n   pointer, the low four bits of op is the number of index bits of\n   that table.  For a length or distance, the low four bits of op\n   is the number of extra bits to get after the code.  bits is\n   the number of bits in this code or part of the code to drop off\n   of the bit buffer.  val is the actual byte to output in the case\n   of a literal, the base length or distance, or the offset from\n   the current table to the next table.  Each entry is four bytes. */\ntypedef struct {\n    unsigned char op;           /* operation, extra bits, table bits */\n    unsigned char bits;         /* bits in this part of the code */\n    unsigned short val;         /* offset in table or code value */\n} code;\n\n/* op values as set by inflate_table():\n    00000000 - literal\n    0000tttt - table link, tttt != 0 is the number of table index bits\n    0001eeee - length or distance, eeee is the number of extra bits\n    01100000 - end of block\n    01000000 - invalid code\n */\n\n/* Maximum size of the dynamic table.  The maximum number of code structures is\n   1444, which is the sum of 852 for literal/length codes and 592 for distance\n   codes.  These values were found by exhaustive searches using the program\n   examples/enough.c found in the zlib distribtution.  The arguments to that\n   program are the number of symbols, the initial root table size, and the\n   maximum bit length of a code.  \"enough 286 9 15\" for literal/length codes\n   returns returns 852, and \"enough 30 6 15\" for distance codes returns 592.\n   The initial root table size (9 or 6) is found in the fifth argument of the\n   inflate_table() calls in inflate.c and infback.c.  If the root table size is\n   changed, then these maximum sizes would be need to be recalculated and\n   updated. */\n#define ENOUGH_LENS 852\n#define ENOUGH_DISTS 592\n#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS)\n\n/* Type of code to build for inflate_table() */\ntypedef enum {\n    CODES,\n    LENS,\n    DISTS\n} codetype;\n\nint ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens,\n                             unsigned codes, code FAR * FAR *table,\n                             unsigned FAR *bits, unsigned short FAR *work));\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/zlib_v128/trees.h",
    "content": "/* GENERATED FILE */\n/* header created automatically with -DGEN_TREES_H */\n\nlocal const ct_data static_ltree[L_CODES+2] = {\n{{ 12},{  8}}, {{140},{  8}}, {{ 76},{  8}}, {{204},{  8}}, {{ 44},{  8}},\n{{172},{  8}}, {{108},{  8}}, {{236},{  8}}, {{ 28},{  8}}, {{156},{  8}},\n{{ 92},{  8}}, {{220},{  8}}, {{ 60},{  8}}, {{188},{  8}}, {{124},{  8}},\n{{252},{  8}}, {{  2},{  8}}, {{130},{  8}}, {{ 66},{  8}}, {{194},{  8}},\n{{ 34},{  8}}, {{162},{  8}}, {{ 98},{  8}}, {{226},{  8}}, {{ 18},{  8}},\n{{146},{  8}}, {{ 82},{  8}}, {{210},{  8}}, {{ 50},{  8}}, {{178},{  8}},\n{{114},{  8}}, {{242},{  8}}, {{ 10},{  8}}, {{138},{  8}}, {{ 74},{  8}},\n{{202},{  8}}, {{ 42},{  8}}, {{170},{  8}}, {{106},{  8}}, {{234},{  8}},\n{{ 26},{  8}}, {{154},{  8}}, {{ 90},{  8}}, {{218},{  8}}, {{ 58},{  8}},\n{{186},{  8}}, {{122},{  8}}, {{250},{  8}}, {{  6},{  8}}, {{134},{  8}},\n{{ 70},{  8}}, {{198},{  8}}, {{ 38},{  8}}, {{166},{  8}}, {{102},{  8}},\n{{230},{  8}}, {{ 22},{  8}}, {{150},{  8}}, {{ 86},{  8}}, {{214},{  8}},\n{{ 54},{  8}}, {{182},{  8}}, {{118},{  8}}, {{246},{  8}}, {{ 14},{  8}},\n{{142},{  8}}, {{ 78},{  8}}, {{206},{  8}}, {{ 46},{  8}}, {{174},{  8}},\n{{110},{  8}}, {{238},{  8}}, {{ 30},{  8}}, {{158},{  8}}, {{ 94},{  8}},\n{{222},{  8}}, {{ 62},{  8}}, {{190},{  8}}, {{126},{  8}}, {{254},{  8}},\n{{  1},{  8}}, {{129},{  8}}, {{ 65},{  8}}, {{193},{  8}}, {{ 33},{  8}},\n{{161},{  8}}, {{ 97},{  8}}, {{225},{  8}}, {{ 17},{  8}}, {{145},{  8}},\n{{ 81},{  8}}, {{209},{  8}}, {{ 49},{  8}}, {{177},{  8}}, {{113},{  8}},\n{{241},{  8}}, {{  9},{  8}}, {{137},{  8}}, {{ 73},{  8}}, {{201},{  8}},\n{{ 41},{  8}}, {{169},{  8}}, {{105},{  8}}, {{233},{  8}}, {{ 25},{  8}},\n{{153},{  8}}, {{ 89},{  8}}, {{217},{  8}}, {{ 57},{  8}}, {{185},{  8}},\n{{121},{  8}}, {{249},{  8}}, {{  5},{  8}}, {{133},{  8}}, {{ 69},{  8}},\n{{197},{  8}}, {{ 37},{  8}}, {{165},{  8}}, {{101},{  8}}, {{229},{  8}},\n{{ 21},{  8}}, {{149},{  8}}, {{ 85},{  8}}, {{213},{  8}}, {{ 53},{  8}},\n{{181},{  8}}, {{117},{  8}}, {{245},{  8}}, {{ 13},{  8}}, {{141},{  8}},\n{{ 77},{  8}}, {{205},{  8}}, {{ 45},{  8}}, {{173},{  8}}, {{109},{  8}},\n{{237},{  8}}, {{ 29},{  8}}, {{157},{  8}}, {{ 93},{  8}}, {{221},{  8}},\n{{ 61},{  8}}, {{189},{  8}}, {{125},{  8}}, {{253},{  8}}, {{ 19},{  9}},\n{{275},{  9}}, {{147},{  9}}, {{403},{  9}}, {{ 83},{  9}}, {{339},{  9}},\n{{211},{  9}}, {{467},{  9}}, {{ 51},{  9}}, {{307},{  9}}, {{179},{  9}},\n{{435},{  9}}, {{115},{  9}}, {{371},{  9}}, {{243},{  9}}, {{499},{  9}},\n{{ 11},{  9}}, {{267},{  9}}, {{139},{  9}}, {{395},{  9}}, {{ 75},{  9}},\n{{331},{  9}}, {{203},{  9}}, {{459},{  9}}, {{ 43},{  9}}, {{299},{  9}},\n{{171},{  9}}, {{427},{  9}}, {{107},{  9}}, {{363},{  9}}, {{235},{  9}},\n{{491},{  9}}, {{ 27},{  9}}, {{283},{  9}}, {{155},{  9}}, {{411},{  9}},\n{{ 91},{  9}}, {{347},{  9}}, {{219},{  9}}, {{475},{  9}}, {{ 59},{  9}},\n{{315},{  9}}, {{187},{  9}}, {{443},{  9}}, {{123},{  9}}, {{379},{  9}},\n{{251},{  9}}, {{507},{  9}}, {{  7},{  9}}, {{263},{  9}}, {{135},{  9}},\n{{391},{  9}}, {{ 71},{  9}}, {{327},{  9}}, {{199},{  9}}, {{455},{  9}},\n{{ 39},{  9}}, {{295},{  9}}, {{167},{  9}}, {{423},{  9}}, {{103},{  9}},\n{{359},{  9}}, {{231},{  9}}, {{487},{  9}}, {{ 23},{  9}}, {{279},{  9}},\n{{151},{  9}}, {{407},{  9}}, {{ 87},{  9}}, {{343},{  9}}, {{215},{  9}},\n{{471},{  9}}, {{ 55},{  9}}, {{311},{  9}}, {{183},{  9}}, {{439},{  9}},\n{{119},{  9}}, {{375},{  9}}, {{247},{  9}}, {{503},{  9}}, {{ 15},{  9}},\n{{271},{  9}}, {{143},{  9}}, {{399},{  9}}, {{ 79},{  9}}, {{335},{  9}},\n{{207},{  9}}, {{463},{  9}}, {{ 47},{  9}}, {{303},{  9}}, {{175},{  9}},\n{{431},{  9}}, {{111},{  9}}, {{367},{  9}}, {{239},{  9}}, {{495},{  9}},\n{{ 31},{  9}}, {{287},{  9}}, {{159},{  9}}, {{415},{  9}}, {{ 95},{  9}},\n{{351},{  9}}, {{223},{  9}}, {{479},{  9}}, {{ 63},{  9}}, {{319},{  9}},\n{{191},{  9}}, {{447},{  9}}, {{127},{  9}}, {{383},{  9}}, {{255},{  9}},\n{{511},{  9}}, {{  0},{  7}}, {{ 64},{  7}}, {{ 32},{  7}}, {{ 96},{  7}},\n{{ 16},{  7}}, {{ 80},{  7}}, {{ 48},{  7}}, {{112},{  7}}, {{  8},{  7}},\n{{ 72},{  7}}, {{ 40},{  7}}, {{104},{  7}}, {{ 24},{  7}}, {{ 88},{  7}},\n{{ 56},{  7}}, {{120},{  7}}, {{  4},{  7}}, {{ 68},{  7}}, {{ 36},{  7}},\n{{100},{  7}}, {{ 20},{  7}}, {{ 84},{  7}}, {{ 52},{  7}}, {{116},{  7}},\n{{  3},{  8}}, {{131},{  8}}, {{ 67},{  8}}, {{195},{  8}}, {{ 35},{  8}},\n{{163},{  8}}, {{ 99},{  8}}, {{227},{  8}}\n};\n\nlocal const ct_data static_dtree[D_CODES] = {\n{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}},\n{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}},\n{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}},\n{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}},\n{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}},\n{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}}\n};\n\nconst uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n 0,  1,  2,  3,  4,  4,  5,  5,  6,  6,  6,  6,  7,  7,  7,  7,  8,  8,  8,  8,\n 8,  8,  8,  8,  9,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10, 10, 10,\n10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,\n11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,\n12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13,\n13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,\n13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,\n14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,\n14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,\n14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15,\n15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,\n15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,\n15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0, 16, 17,\n18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22,\n23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\n24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,\n26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27,\n27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,\n27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29\n};\n\nconst uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n 0,  1,  2,  3,  4,  5,  6,  7,  8,  8,  9,  9, 10, 10, 11, 11, 12, 12, 12, 12,\n13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16,\n17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19,\n19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,\n21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22,\n22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23,\n23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\n24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\n25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26,\n26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,\n26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,\n27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28\n};\n\nlocal const int base_length[LENGTH_CODES] = {\n0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56,\n64, 80, 96, 112, 128, 160, 192, 224, 0\n};\n\nlocal const int base_dist[D_CODES] = {\n    0,     1,     2,     3,     4,     6,     8,    12,    16,    24,\n   32,    48,    64,    96,   128,   192,   256,   384,   512,   768,\n 1024,  1536,  2048,  3072,  4096,  6144,  8192, 12288, 16384, 24576\n};\n\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/zlib_v128/zconf.h",
    "content": "/* zconf.h -- configuration of the zlib compression library\n * Copyright (C) 1995-2013 Jean-loup Gailly.\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* @(#) $Id$ */\n\n#ifndef ZCONF_H\n#define ZCONF_H\n\n/*\n * If you *really* need a unique prefix for all types and library functions,\n * compile with -DZ_PREFIX. The \"standard\" zlib should be compiled without it.\n * Even better than compiling with -DZ_PREFIX would be to use configure to set\n * this permanently in zconf.h using \"./configure --zprefix\".\n */\n#ifdef Z_PREFIX     /* may be set to #if 1 by ./configure */\n#  define Z_PREFIX_SET\n\n/* all linked symbols */\n#  define _dist_code            z__dist_code\n#  define _length_code          z__length_code\n#  define _tr_align             z__tr_align\n#  define _tr_flush_bits        z__tr_flush_bits\n#  define _tr_flush_block       z__tr_flush_block\n#  define _tr_init              z__tr_init\n#  define _tr_stored_block      z__tr_stored_block\n#  define _tr_tally             z__tr_tally\n#  define adler32               z_adler32\n#  define adler32_combine       z_adler32_combine\n#  define adler32_combine64     z_adler32_combine64\n#  ifndef Z_SOLO\n#    define compress              z_compress\n#    define compress2             z_compress2\n#    define compressBound         z_compressBound\n#  endif\n#  define crc32                 z_crc32\n#  define crc32_combine         z_crc32_combine\n#  define crc32_combine64       z_crc32_combine64\n#  define deflate               z_deflate\n#  define deflateBound          z_deflateBound\n#  define deflateCopy           z_deflateCopy\n#  define deflateEnd            z_deflateEnd\n#  define deflateInit2_         z_deflateInit2_\n#  define deflateInit_          z_deflateInit_\n#  define deflateParams         z_deflateParams\n#  define deflatePending        z_deflatePending\n#  define deflatePrime          z_deflatePrime\n#  define deflateReset          z_deflateReset\n#  define deflateResetKeep      z_deflateResetKeep\n#  define deflateSetDictionary  z_deflateSetDictionary\n#  define deflateSetHeader      z_deflateSetHeader\n#  define deflateTune           z_deflateTune\n#  define deflate_copyright     z_deflate_copyright\n#  define get_crc_table         z_get_crc_table\n#  ifndef Z_SOLO\n#    define gz_error              z_gz_error\n#    define gz_intmax             z_gz_intmax\n#    define gz_strwinerror        z_gz_strwinerror\n#    define gzbuffer              z_gzbuffer\n#    define gzclearerr            z_gzclearerr\n#    define gzclose               z_gzclose\n#    define gzclose_r             z_gzclose_r\n#    define gzclose_w             z_gzclose_w\n#    define gzdirect              z_gzdirect\n#    define gzdopen               z_gzdopen\n#    define gzeof                 z_gzeof\n#    define gzerror               z_gzerror\n#    define gzflush               z_gzflush\n#    define gzgetc                z_gzgetc\n#    define gzgetc_               z_gzgetc_\n#    define gzgets                z_gzgets\n#    define gzoffset              z_gzoffset\n#    define gzoffset64            z_gzoffset64\n#    define gzopen                z_gzopen\n#    define gzopen64              z_gzopen64\n#    ifdef _WIN32\n#      define gzopen_w              z_gzopen_w\n#    endif\n#    define gzprintf              z_gzprintf\n#    define gzvprintf             z_gzvprintf\n#    define gzputc                z_gzputc\n#    define gzputs                z_gzputs\n#    define gzread                z_gzread\n#    define gzrewind              z_gzrewind\n#    define gzseek                z_gzseek\n#    define gzseek64              z_gzseek64\n#    define gzsetparams           z_gzsetparams\n#    define gztell                z_gztell\n#    define gztell64              z_gztell64\n#    define gzungetc              z_gzungetc\n#    define gzwrite               z_gzwrite\n#  endif\n#  define inflate               z_inflate\n#  define inflateBack           z_inflateBack\n#  define inflateBackEnd        z_inflateBackEnd\n#  define inflateBackInit_      z_inflateBackInit_\n#  define inflateCopy           z_inflateCopy\n#  define inflateEnd            z_inflateEnd\n#  define inflateGetHeader      z_inflateGetHeader\n#  define inflateInit2_         z_inflateInit2_\n#  define inflateInit_          z_inflateInit_\n#  define inflateMark           z_inflateMark\n#  define inflatePrime          z_inflatePrime\n#  define inflateReset          z_inflateReset\n#  define inflateReset2         z_inflateReset2\n#  define inflateSetDictionary  z_inflateSetDictionary\n#  define inflateGetDictionary  z_inflateGetDictionary\n#  define inflateSync           z_inflateSync\n#  define inflateSyncPoint      z_inflateSyncPoint\n#  define inflateUndermine      z_inflateUndermine\n#  define inflateResetKeep      z_inflateResetKeep\n#  define inflate_copyright     z_inflate_copyright\n#  define inflate_fast          z_inflate_fast\n#  define inflate_table         z_inflate_table\n#  ifndef Z_SOLO\n#    define uncompress            z_uncompress\n#  endif\n#  define zError                z_zError\n#  ifndef Z_SOLO\n#    define zcalloc               z_zcalloc\n#    define zcfree                z_zcfree\n#  endif\n#  define zlibCompileFlags      z_zlibCompileFlags\n#  define zlibVersion           z_zlibVersion\n\n/* all zlib typedefs in zlib.h and zconf.h */\n#  define Byte                  z_Byte\n#  define Bytef                 z_Bytef\n#  define alloc_func            z_alloc_func\n#  define charf                 z_charf\n#  define free_func             z_free_func\n#  ifndef Z_SOLO\n#    define gzFile                z_gzFile\n#  endif\n#  define gz_header             z_gz_header\n#  define gz_headerp            z_gz_headerp\n#  define in_func               z_in_func\n#  define intf                  z_intf\n#  define out_func              z_out_func\n#  define uInt                  z_uInt\n#  define uIntf                 z_uIntf\n#  define uLong                 z_uLong\n#  define uLongf                z_uLongf\n#  define voidp                 z_voidp\n#  define voidpc                z_voidpc\n#  define voidpf                z_voidpf\n\n/* all zlib structs in zlib.h and zconf.h */\n#  define gz_header_s           z_gz_header_s\n#  define internal_state        z_internal_state\n\n#endif\n\n#if defined(__MSDOS__) && !defined(MSDOS)\n#  define MSDOS\n#endif\n#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)\n#  define OS2\n#endif\n#if defined(_WINDOWS) && !defined(WINDOWS)\n#  define WINDOWS\n#endif\n#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__)\n#  ifndef WIN32\n#    define WIN32\n#  endif\n#endif\n#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)\n#  if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)\n#    ifndef SYS16BIT\n#      define SYS16BIT\n#    endif\n#  endif\n#endif\n\n/*\n * Compile with -DMAXSEG_64K if the alloc function cannot allocate more\n * than 64k bytes at a time (needed on systems with 16-bit int).\n */\n#ifdef SYS16BIT\n#  define MAXSEG_64K\n#endif\n#ifdef MSDOS\n#  define UNALIGNED_OK\n#endif\n\n#ifdef __STDC_VERSION__\n#  ifndef STDC\n#    define STDC\n#  endif\n#  if __STDC_VERSION__ >= 199901L\n#    ifndef STDC99\n#      define STDC99\n#    endif\n#  endif\n#endif\n#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))\n#  define STDC\n#endif\n#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))\n#  define STDC\n#endif\n#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))\n#  define STDC\n#endif\n#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))\n#  define STDC\n#endif\n\n#if defined(__OS400__) && !defined(STDC)    /* iSeries (formerly AS/400). */\n#  define STDC\n#endif\n\n#ifndef STDC\n#  ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */\n#    define const       /* note: need a more gentle solution here */\n#  endif\n#endif\n\n#if defined(ZLIB_CONST) && !defined(z_const)\n#  define z_const const\n#else\n#  define z_const\n#endif\n\n/* Some Mac compilers merge all .h files incorrectly: */\n#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__)\n#  define NO_DUMMY_DECL\n#endif\n\n/* Maximum value for memLevel in deflateInit2 */\n#ifndef MAX_MEM_LEVEL\n#  ifdef MAXSEG_64K\n#    define MAX_MEM_LEVEL 8\n#  else\n#    define MAX_MEM_LEVEL 9\n#  endif\n#endif\n\n/* Maximum value for windowBits in deflateInit2 and inflateInit2.\n * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files\n * created by gzip. (Files created by minigzip can still be extracted by\n * gzip.)\n */\n#ifndef MAX_WBITS\n#  define MAX_WBITS   15 /* 32K LZ77 window */\n#endif\n\n/* The memory requirements for deflate are (in bytes):\n            (1 << (windowBits+2)) +  (1 << (memLevel+9))\n that is: 128K for windowBits=15  +  128K for memLevel = 8  (default values)\n plus a few kilobytes for small objects. For example, if you want to reduce\n the default memory requirements from 256K to 128K, compile with\n     make CFLAGS=\"-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7\"\n Of course this will generally degrade compression (there's no free lunch).\n\n   The memory requirements for inflate are (in bytes) 1 << windowBits\n that is, 32K for windowBits=15 (default value) plus a few kilobytes\n for small objects.\n*/\n\n                        /* Type declarations */\n\n#ifndef OF /* function prototypes */\n#  ifdef STDC\n#    define OF(args)  args\n#  else\n#    define OF(args)  ()\n#  endif\n#endif\n\n#ifndef Z_ARG /* function prototypes for stdarg */\n#  if defined(STDC) || defined(Z_HAVE_STDARG_H)\n#    define Z_ARG(args)  args\n#  else\n#    define Z_ARG(args)  ()\n#  endif\n#endif\n\n/* The following definitions for FAR are needed only for MSDOS mixed\n * model programming (small or medium model with some far allocations).\n * This was tested only with MSC; for other MSDOS compilers you may have\n * to define NO_MEMCPY in zutil.h.  If you don't need the mixed model,\n * just define FAR to be empty.\n */\n#ifdef SYS16BIT\n#  if defined(M_I86SM) || defined(M_I86MM)\n     /* MSC small or medium model */\n#    define SMALL_MEDIUM\n#    ifdef _MSC_VER\n#      define FAR _far\n#    else\n#      define FAR far\n#    endif\n#  endif\n#  if (defined(__SMALL__) || defined(__MEDIUM__))\n     /* Turbo C small or medium model */\n#    define SMALL_MEDIUM\n#    ifdef __BORLANDC__\n#      define FAR _far\n#    else\n#      define FAR far\n#    endif\n#  endif\n#endif\n\n#if defined(WINDOWS) || defined(WIN32)\n   /* If building or using zlib as a DLL, define ZLIB_DLL.\n    * This is not mandatory, but it offers a little performance increase.\n    */\n#  ifdef ZLIB_DLL\n#    if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))\n#      ifdef ZLIB_INTERNAL\n#        define ZEXTERN extern __declspec(dllexport)\n#      else\n#        define ZEXTERN extern __declspec(dllimport)\n#      endif\n#    endif\n#  endif  /* ZLIB_DLL */\n   /* If building or using zlib with the WINAPI/WINAPIV calling convention,\n    * define ZLIB_WINAPI.\n    * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.\n    */\n#  ifdef ZLIB_WINAPI\n#    ifdef FAR\n#      undef FAR\n#    endif\n#    include <windows.h>\n     /* No need for _export, use ZLIB.DEF instead. */\n     /* For complete Windows compatibility, use WINAPI, not __stdcall. */\n#    define ZEXPORT WINAPI\n#    ifdef WIN32\n#      define ZEXPORTVA WINAPIV\n#    else\n#      define ZEXPORTVA FAR CDECL\n#    endif\n#  endif\n#endif\n\n#if defined (__BEOS__)\n#  ifdef ZLIB_DLL\n#    ifdef ZLIB_INTERNAL\n#      define ZEXPORT   __declspec(dllexport)\n#      define ZEXPORTVA __declspec(dllexport)\n#    else\n#      define ZEXPORT   __declspec(dllimport)\n#      define ZEXPORTVA __declspec(dllimport)\n#    endif\n#  endif\n#endif\n\n#ifndef ZEXTERN\n#  define ZEXTERN extern\n#endif\n#ifndef ZEXPORT\n#  define ZEXPORT\n#endif\n#ifndef ZEXPORTVA\n#  define ZEXPORTVA\n#endif\n\n#ifndef FAR\n#  define FAR\n#endif\n\n#if !defined(__MACTYPES__)\ntypedef unsigned char  Byte;  /* 8 bits */\n#endif\ntypedef unsigned int   uInt;  /* 16 bits or more */\ntypedef unsigned long  uLong; /* 32 bits or more */\n\n#ifdef SMALL_MEDIUM\n   /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */\n#  define Bytef Byte FAR\n#else\n   typedef Byte  FAR Bytef;\n#endif\ntypedef char  FAR charf;\ntypedef int   FAR intf;\ntypedef uInt  FAR uIntf;\ntypedef uLong FAR uLongf;\n\n#ifdef STDC\n   typedef void const *voidpc;\n   typedef void FAR   *voidpf;\n   typedef void       *voidp;\n#else\n   typedef Byte const *voidpc;\n   typedef Byte FAR   *voidpf;\n   typedef Byte       *voidp;\n#endif\n\n#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC)\n#  include <limits.h>\n#  if (UINT_MAX == 0xffffffffUL)\n#    define Z_U4 unsigned\n#  elif (ULONG_MAX == 0xffffffffUL)\n#    define Z_U4 unsigned long\n#  elif (USHRT_MAX == 0xffffffffUL)\n#    define Z_U4 unsigned short\n#  endif\n#endif\n\n#ifdef Z_U4\n   typedef Z_U4 z_crc_t;\n#else\n   typedef unsigned long z_crc_t;\n#endif\n\n#if 0\t\t\t\t/* Sunliang.Liu 20100908 sync the config to the old revision, otherwise, evc compile failed. */\n#ifdef HAVE_UNISTD_H    /* may be set to #if 1 by ./configure */\n#  define Z_HAVE_UNISTD_H\n#endif\n#endif /* 0 */\n\n#ifdef HAVE_STDARG_H    /* may be set to #if 1 by ./configure */\n#  define Z_HAVE_STDARG_H\n#endif\n\n#if 0\t\t\t\t/* Sunliang.Liu 20100908 sync the config to the old revision, otherwise, evc compile failed. */\n#ifdef STDC\n#  ifndef Z_SOLO\n#    include <sys/types.h>      /* for off_t */\n#  endif\n#endif\n#endif /* 0 */\n\n#if defined(STDC) || defined(Z_HAVE_STDARG_H)\n#  ifndef Z_SOLO\n#    include <stdarg.h>         /* for va_list */\n#  endif\n#endif\n\n#ifdef _WIN32\n#  ifndef Z_SOLO\n#    include <stddef.h>         /* for wchar_t */\n#  endif\n#endif\n\n#if 0\t\t\t\t/* Sunliang.Liu 20100908 sync the config to the old revision, otherwise, evc compile failed. */\n/* a little trick to accommodate both \"#define _LARGEFILE64_SOURCE\" and\n * \"#define _LARGEFILE64_SOURCE 1\" as requesting 64-bit operations, (even\n * though the former does not conform to the LFS document), but considering\n * both \"#undef _LARGEFILE64_SOURCE\" and \"#define _LARGEFILE64_SOURCE 0\" as\n * equivalently requesting no 64-bit operations\n */\n#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1\n#  undef _LARGEFILE64_SOURCE\n#endif\n#endif /* 0 */\n\n#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H)\n#  define Z_HAVE_UNISTD_H\n#endif\n#ifndef Z_SOLO\n#if 0\t\t\t\t/* Sunliang.Liu 20100908 sync the config to the old revision, otherwise, evc compile failed. */\n#  if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE)\n#    include <unistd.h>         /* for SEEK_*, off_t, and _LFS64_LARGEFILE */\n#    ifdef VMS\n#      include <unixio.h>       /* for off_t */\n#    endif\n#    ifndef z_off_t\n#      define z_off_t off_t\n#    endif\n#  endif\n#endif /* 0 */\n#endif\n\n#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0\n#  define Z_LFS64\n#endif\n\n#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64)\n#  define Z_LARGE64\n#endif\n\n#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64)\n#  define Z_WANT64\n#endif\n\n#if !defined(SEEK_SET) && !defined(Z_SOLO)\n#  define SEEK_SET        0       /* Seek from beginning of file.  */\n#  define SEEK_CUR        1       /* Seek from current position.  */\n#  define SEEK_END        2       /* Set file pointer to EOF plus \"offset\" */\n#endif\n\n#ifndef z_off_t\n#  define z_off_t long\n#endif\n\n#if !defined(_WIN32) && defined(Z_LARGE64)\n#  define z_off64_t off64_t\n#else\n#  if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO)\n#    define z_off64_t __int64\n#  else\n#    define z_off64_t z_off_t\n#  endif\n#endif\n\n/* MVS linker does not support external names larger than 8 bytes */\n#if defined(__MVS__)\n  #pragma map(deflateInit_,\"DEIN\")\n  #pragma map(deflateInit2_,\"DEIN2\")\n  #pragma map(deflateEnd,\"DEEND\")\n  #pragma map(deflateBound,\"DEBND\")\n  #pragma map(inflateInit_,\"ININ\")\n  #pragma map(inflateInit2_,\"ININ2\")\n  #pragma map(inflateEnd,\"INEND\")\n  #pragma map(inflateSync,\"INSY\")\n  #pragma map(inflateSetDictionary,\"INSEDI\")\n  #pragma map(compressBound,\"CMBND\")\n  #pragma map(inflate_table,\"INTABL\")\n  #pragma map(inflate_fast,\"INFA\")\n  #pragma map(inflate_copyright,\"INCOPY\")\n#endif\n\n#endif /* ZCONF_H */\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/zlib_v128/zlib.h",
    "content": "/* zlib.h -- interface of the 'zlib' general purpose compression library\n  version 1.2.8, April 28th, 2013\n\n  Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n\n  Jean-loup Gailly        Mark Adler\n  jloup@gzip.org          madler@alumni.caltech.edu\n\n\n  The data format used by the zlib library is described by RFCs (Request for\n  Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950\n  (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format).\n*/\n\n#ifndef ZLIB_H\n#define ZLIB_H\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n\n#define deflate_copyright FPDFAPI_deflate_copyright\n#define adler32 FPDFAPI_adler32\n#define compress2 FPDFAPI_compress2\n#define compress FPDFAPI_compress\n#define compressBound FPDFAPI_compressBound\n#define get_crc_table FPDFAPI_get_crc_table\n#define crc32 FPDFAPI_crc32\n#define deflateInit_ FPDFAPI_deflateInit_\n#define deflateInit2_ FPDFAPI_deflateInit2_\n#define deflateSetDictionary FPDFAPI_deflateSetDictionary\n#define deflateReset FPDFAPI_deflateReset\n#define deflatePending FPDFAPI_deflatePending\n#define deflatePrime FPDFAPI_deflatePrime\n#define deflateParams FPDFAPI_deflateParams\n#define deflateBound FPDFAPI_deflateBound\n#define deflateSetHeader FPDFAPI_deflateSetHeader\n#define deflateTune FPDFAPI_deflateTune\n#define deflate FPDFAPI_deflate\n#define deflateEnd FPDFAPI_deflateEnd\n#define deflateCopy FPDFAPI_deflateCopy\n#define inflateBackInit_ FPDFAPI_inflateBackInit_\n#define inflateBack FPDFAPI_inflateBack\n#define inflateBackEnd FPDFAPI_inflateBackEnd\n#define inflateReset FPDFAPI_inflateReset\n#define inflateInit2_ FPDFAPI_inflateInit2_\n#define inflateInit_ FPDFAPI_inflateInit_\n#define inflate FPDFAPI_inflate\n#define inflateEnd FPDFAPI_inflateEnd\n#define inflateSetDictionary FPDFAPI_inflateSetDictionary\n#define inflateSync FPDFAPI_inflateSync\n#define inflateSyncPoint FPDFAPI_inflateSyncPoint\n#define inflateCopy FPDFAPI_inflateCopy\n#define uncompress FPDFAPI_uncompress\n#define zlibVersion FPDFAPI_zlibVersion\n#define zlibCompileFlags FPDFAPI_zlibCompileFlags\n#define zError FPDFAPI_zError\n#define z_errmsg FPDFAPI_z_errmsg\n#define zcfree FPDFAPI_zcfree\n#define zcalloc FPDFAPI_zcalloc\n#define inflate_fast FPDFAPI_inflate_fast\n#define inflate_table FPDFAPI_inflate_table\n#define inflate_copyright FPDFAPI_inflate_copyright\n#define _length_code FPDFAPI_length_code\n#define _tr_flush_block FPDFAPI_tr_flush_block\n#define _dist_code FPDFAPI_dist_code\n#define _tr_stored_block FPDFAPI_tr_stored_block\n#define _tr_init FPDFAPI_tr_init\n#define _tr_align FPDFAPI_tr_align\n#define _tr_tally FPDFAPI_tr_tally\n#define _tr_flush_bits FPDFAPI_tr_flush_bits\n#define adler32_combine FPDFAPI_adler32_combine\n#define inflatePrime FPDFAPI_inflatePrime\n#define inflateGetDictionary FPDFAPI_inflateGetDictionary\n#define inflateGetHeader FPDFAPI_inflateGetHeader\n#define crc32_combine FPDFAPI_crc32_combine\n#define inflateReset2 FPDFAPI_inflateReset2\n#define inflateUndermine FPDFAPI_inflateUndermine\n#define inflateMark FPDFAPI_inflateMark\n#define adler32_combine64 FPDFAPI_adler32_combine64\n#define inflateResetKeep FPDFAPI_inflateResetKeep\n#define deflateResetKeep FPDFAPI_deflateResetKeep\n\n#include \"zconf.h\"\n\n/* Sunliang.Liu 20100908 sync the config to the old revision. NO_GZIP */\n#define NO_GZIP\t\t/* XYQ */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define ZLIB_VERSION \"1.2.8\"\n#define ZLIB_VERNUM 0x1280\n#define ZLIB_VER_MAJOR 1\n#define ZLIB_VER_MINOR 2\n#define ZLIB_VER_REVISION 8\n#define ZLIB_VER_SUBREVISION 0\n\n/*\n    The 'zlib' compression library provides in-memory compression and\n  decompression functions, including integrity checks of the uncompressed data.\n  This version of the library supports only one compression method (deflation)\n  but other algorithms will be added later and will have the same stream\n  interface.\n\n    Compression can be done in a single step if the buffers are large enough,\n  or can be done by repeated calls of the compression function.  In the latter\n  case, the application must provide more input and/or consume the output\n  (providing more output space) before each call.\n\n    The compressed data format used by default by the in-memory functions is\n  the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped\n  around a deflate stream, which is itself documented in RFC 1951.\n\n    The library also supports reading and writing files in gzip (.gz) format\n  with an interface similar to that of stdio using the functions that start\n  with \"gz\".  The gzip format is different from the zlib format.  gzip is a\n  gzip wrapper, documented in RFC 1952, wrapped around a deflate stream.\n\n    This library can optionally read and write gzip streams in memory as well.\n\n    The zlib format was designed to be compact and fast for use in memory\n  and on communications channels.  The gzip format was designed for single-\n  file compression on file systems, has a larger header than zlib to maintain\n  directory information, and uses a different, slower check method than zlib.\n\n    The library does not install any signal handler.  The decoder checks\n  the consistency of the compressed data, so the library should never crash\n  even in case of corrupted input.\n*/\n\ntypedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));\ntypedef void   (*free_func)  OF((voidpf opaque, voidpf address));\n\nstruct internal_state;\n\ntypedef struct z_stream_s {\n    z_const Bytef *next_in;     /* next input byte */\n    uInt     avail_in;  /* number of bytes available at next_in */\n    uLong    total_in;  /* total number of input bytes read so far */\n\n    Bytef    *next_out; /* next output byte should be put there */\n    uInt     avail_out; /* remaining free space at next_out */\n    uLong    total_out; /* total number of bytes output so far */\n\n    z_const char *msg;  /* last error message, NULL if no error */\n    struct internal_state FAR *state; /* not visible by applications */\n\n    alloc_func zalloc;  /* used to allocate the internal state */\n    free_func  zfree;   /* used to free the internal state */\n    voidpf     opaque;  /* private data object passed to zalloc and zfree */\n\n    int     data_type;  /* best guess about the data type: binary or text */\n    uLong   adler;      /* adler32 value of the uncompressed data */\n    uLong   reserved;   /* reserved for future use */\n} z_stream;\n\ntypedef z_stream FAR *z_streamp;\n\n/*\n     gzip header information passed to and from zlib routines.  See RFC 1952\n  for more details on the meanings of these fields.\n*/\ntypedef struct gz_header_s {\n    int     text;       /* true if compressed data believed to be text */\n    uLong   time;       /* modification time */\n    int     xflags;     /* extra flags (not used when writing a gzip file) */\n    int     os;         /* operating system */\n    Bytef   *extra;     /* pointer to extra field or Z_NULL if none */\n    uInt    extra_len;  /* extra field length (valid if extra != Z_NULL) */\n    uInt    extra_max;  /* space at extra (only when reading header) */\n    Bytef   *name;      /* pointer to zero-terminated file name or Z_NULL */\n    uInt    name_max;   /* space at name (only when reading header) */\n    Bytef   *comment;   /* pointer to zero-terminated comment or Z_NULL */\n    uInt    comm_max;   /* space at comment (only when reading header) */\n    int     hcrc;       /* true if there was or will be a header crc */\n    int     done;       /* true when done reading gzip header (not used\n                           when writing a gzip file) */\n} gz_header;\n\ntypedef gz_header FAR *gz_headerp;\n\n/*\n     The application must update next_in and avail_in when avail_in has dropped\n   to zero.  It must update next_out and avail_out when avail_out has dropped\n   to zero.  The application must initialize zalloc, zfree and opaque before\n   calling the init function.  All other fields are set by the compression\n   library and must not be updated by the application.\n\n     The opaque value provided by the application will be passed as the first\n   parameter for calls of zalloc and zfree.  This can be useful for custom\n   memory management.  The compression library attaches no meaning to the\n   opaque value.\n\n     zalloc must return Z_NULL if there is not enough memory for the object.\n   If zlib is used in a multi-threaded application, zalloc and zfree must be\n   thread safe.\n\n     On 16-bit systems, the functions zalloc and zfree must be able to allocate\n   exactly 65536 bytes, but will not be required to allocate more than this if\n   the symbol MAXSEG_64K is defined (see zconf.h).  WARNING: On MSDOS, pointers\n   returned by zalloc for objects of exactly 65536 bytes *must* have their\n   offset normalized to zero.  The default allocation function provided by this\n   library ensures this (see zutil.c).  To reduce memory requirements and avoid\n   any allocation of 64K objects, at the expense of compression ratio, compile\n   the library with -DMAX_WBITS=14 (see zconf.h).\n\n     The fields total_in and total_out can be used for statistics or progress\n   reports.  After compression, total_in holds the total size of the\n   uncompressed data and may be saved for use in the decompressor (particularly\n   if the decompressor wants to decompress everything in a single step).\n*/\n\n                        /* constants */\n\n#define Z_NO_FLUSH      0\n#define Z_PARTIAL_FLUSH 1\n#define Z_SYNC_FLUSH    2\n#define Z_FULL_FLUSH    3\n#define Z_FINISH        4\n#define Z_BLOCK         5\n#define Z_TREES         6\n/* Allowed flush values; see deflate() and inflate() below for details */\n\n#define Z_OK            0\n#define Z_STREAM_END    1\n#define Z_NEED_DICT     2\n#define Z_ERRNO        (-1)\n#define Z_STREAM_ERROR (-2)\n#define Z_DATA_ERROR   (-3)\n#define Z_MEM_ERROR    (-4)\n#define Z_BUF_ERROR    (-5)\n#define Z_VERSION_ERROR (-6)\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\n\n#define Z_NO_COMPRESSION         0\n#define Z_BEST_SPEED             1\n#define Z_BEST_COMPRESSION       9\n#define Z_DEFAULT_COMPRESSION  (-1)\n/* compression levels */\n\n#define Z_FILTERED            1\n#define Z_HUFFMAN_ONLY        2\n#define Z_RLE                 3\n#define Z_FIXED               4\n#define Z_DEFAULT_STRATEGY    0\n/* compression strategy; see deflateInit2() below for details */\n\n#define Z_BINARY   0\n#define Z_TEXT     1\n#define Z_ASCII    Z_TEXT   /* for compatibility with 1.2.2 and earlier */\n#define Z_UNKNOWN  2\n/* Possible values of the data_type field (though see inflate()) */\n\n#define Z_DEFLATED   8\n/* The deflate compression method (the only one supported in this version) */\n\n#define Z_NULL  0  /* for initializing zalloc, zfree, opaque */\n\n#define zlib_version zlibVersion()\n/* for compatibility with versions < 1.0.2 */\n\n\n                        /* basic functions */\n\nZEXTERN const char * ZEXPORT zlibVersion OF((void));\n/* The application can compare zlibVersion and ZLIB_VERSION for consistency.\n   If the first character differs, the library code actually used is not\n   compatible with the zlib.h header file used by the application.  This check\n   is automatically made by deflateInit and inflateInit.\n */\n\n/*\nZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));\n\n     Initializes the internal stream state for compression.  The fields\n   zalloc, zfree and opaque must be initialized before by the caller.  If\n   zalloc and zfree are set to Z_NULL, deflateInit updates them to use default\n   allocation functions.\n\n     The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:\n   1 gives best speed, 9 gives best compression, 0 gives no compression at all\n   (the input data is simply copied a block at a time).  Z_DEFAULT_COMPRESSION\n   requests a default compromise between speed and compression (currently\n   equivalent to level 6).\n\n     deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough\n   memory, Z_STREAM_ERROR if level is not a valid compression level, or\n   Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible\n   with the version assumed by the caller (ZLIB_VERSION).  msg is set to null\n   if there is no error message.  deflateInit does not perform any compression:\n   this will be done by deflate().\n*/\n\n\nZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));\n/*\n    deflate compresses as much data as possible, and stops when the input\n  buffer becomes empty or the output buffer becomes full.  It may introduce\n  some output latency (reading input without producing any output) except when\n  forced to flush.\n\n    The detailed semantics are as follows.  deflate performs one or both of the\n  following actions:\n\n  - Compress more input starting at next_in and update next_in and avail_in\n    accordingly.  If not all input can be processed (because there is not\n    enough room in the output buffer), next_in and avail_in are updated and\n    processing will resume at this point for the next call of deflate().\n\n  - Provide more output starting at next_out and update next_out and avail_out\n    accordingly.  This action is forced if the parameter flush is non zero.\n    Forcing flush frequently degrades the compression ratio, so this parameter\n    should be set only when necessary (in interactive applications).  Some\n    output may be provided even if flush is not set.\n\n    Before the call of deflate(), the application should ensure that at least\n  one of the actions is possible, by providing more input and/or consuming more\n  output, and updating avail_in or avail_out accordingly; avail_out should\n  never be zero before the call.  The application can consume the compressed\n  output when it wants, for example when the output buffer is full (avail_out\n  == 0), or after each call of deflate().  If deflate returns Z_OK and with\n  zero avail_out, it must be called again after making room in the output\n  buffer because there might be more output pending.\n\n    Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to\n  decide how much data to accumulate before producing output, in order to\n  maximize compression.\n\n    If the parameter flush is set to Z_SYNC_FLUSH, all pending output is\n  flushed to the output buffer and the output is aligned on a byte boundary, so\n  that the decompressor can get all input data available so far.  (In\n  particular avail_in is zero after the call if enough output space has been\n  provided before the call.) Flushing may degrade compression for some\n  compression algorithms and so it should be used only when necessary.  This\n  completes the current deflate block and follows it with an empty stored block\n  that is three bits plus filler bits to the next byte, followed by four bytes\n  (00 00 ff ff).\n\n    If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the\n  output buffer, but the output is not aligned to a byte boundary.  All of the\n  input data so far will be available to the decompressor, as for Z_SYNC_FLUSH.\n  This completes the current deflate block and follows it with an empty fixed\n  codes block that is 10 bits long.  This assures that enough bytes are output\n  in order for the decompressor to finish the block before the empty fixed code\n  block.\n\n    If flush is set to Z_BLOCK, a deflate block is completed and emitted, as\n  for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to\n  seven bits of the current block are held to be written as the next byte after\n  the next deflate block is completed.  In this case, the decompressor may not\n  be provided enough bits at this point in order to complete decompression of\n  the data provided so far to the compressor.  It may need to wait for the next\n  block to be emitted.  This is for advanced applications that need to control\n  the emission of deflate blocks.\n\n    If flush is set to Z_FULL_FLUSH, all output is flushed as with\n  Z_SYNC_FLUSH, and the compression state is reset so that decompression can\n  restart from this point if previous compressed data has been damaged or if\n  random access is desired.  Using Z_FULL_FLUSH too often can seriously degrade\n  compression.\n\n    If deflate returns with avail_out == 0, this function must be called again\n  with the same value of the flush parameter and more output space (updated\n  avail_out), until the flush is complete (deflate returns with non-zero\n  avail_out).  In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that\n  avail_out is greater than six to avoid repeated flush markers due to\n  avail_out == 0 on return.\n\n    If the parameter flush is set to Z_FINISH, pending input is processed,\n  pending output is flushed and deflate returns with Z_STREAM_END if there was\n  enough output space; if deflate returns with Z_OK, this function must be\n  called again with Z_FINISH and more output space (updated avail_out) but no\n  more input data, until it returns with Z_STREAM_END or an error.  After\n  deflate has returned Z_STREAM_END, the only possible operations on the stream\n  are deflateReset or deflateEnd.\n\n    Z_FINISH can be used immediately after deflateInit if all the compression\n  is to be done in a single step.  In this case, avail_out must be at least the\n  value returned by deflateBound (see below).  Then deflate is guaranteed to\n  return Z_STREAM_END.  If not enough output space is provided, deflate will\n  not return Z_STREAM_END, and it must be called again as described above.\n\n    deflate() sets strm->adler to the adler32 checksum of all input read\n  so far (that is, total_in bytes).\n\n    deflate() may update strm->data_type if it can make a good guess about\n  the input data type (Z_BINARY or Z_TEXT).  In doubt, the data is considered\n  binary.  This field is only for information purposes and does not affect the\n  compression algorithm in any manner.\n\n    deflate() returns Z_OK if some progress has been made (more input\n  processed or more output produced), Z_STREAM_END if all input has been\n  consumed and all output has been produced (only when flush is set to\n  Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example\n  if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible\n  (for example avail_in or avail_out was zero).  Note that Z_BUF_ERROR is not\n  fatal, and deflate() can be called again with more input and more output\n  space to continue compressing.\n*/\n\n\nZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));\n/*\n     All dynamically allocated data structures for this stream are freed.\n   This function discards any unprocessed input and does not flush any pending\n   output.\n\n     deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the\n   stream state was inconsistent, Z_DATA_ERROR if the stream was freed\n   prematurely (some input or output was discarded).  In the error case, msg\n   may be set but then points to a static string (which must not be\n   deallocated).\n*/\n\n\n/*\nZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));\n\n     Initializes the internal stream state for decompression.  The fields\n   next_in, avail_in, zalloc, zfree and opaque must be initialized before by\n   the caller.  If next_in is not Z_NULL and avail_in is large enough (the\n   exact value depends on the compression method), inflateInit determines the\n   compression method from the zlib header and allocates all data structures\n   accordingly; otherwise the allocation will be deferred to the first call of\n   inflate.  If zalloc and zfree are set to Z_NULL, inflateInit updates them to\n   use default allocation functions.\n\n     inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough\n   memory, Z_VERSION_ERROR if the zlib library version is incompatible with the\n   version assumed by the caller, or Z_STREAM_ERROR if the parameters are\n   invalid, such as a null pointer to the structure.  msg is set to null if\n   there is no error message.  inflateInit does not perform any decompression\n   apart from possibly reading the zlib header if present: actual decompression\n   will be done by inflate().  (So next_in and avail_in may be modified, but\n   next_out and avail_out are unused and unchanged.) The current implementation\n   of inflateInit() does not process any header information -- that is deferred\n   until inflate() is called.\n*/\n\n\nZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));\n/*\n    inflate decompresses as much data as possible, and stops when the input\n  buffer becomes empty or the output buffer becomes full.  It may introduce\n  some output latency (reading input without producing any output) except when\n  forced to flush.\n\n  The detailed semantics are as follows.  inflate performs one or both of the\n  following actions:\n\n  - Decompress more input starting at next_in and update next_in and avail_in\n    accordingly.  If not all input can be processed (because there is not\n    enough room in the output buffer), next_in is updated and processing will\n    resume at this point for the next call of inflate().\n\n  - Provide more output starting at next_out and update next_out and avail_out\n    accordingly.  inflate() provides as much output as possible, until there is\n    no more input data or no more space in the output buffer (see below about\n    the flush parameter).\n\n    Before the call of inflate(), the application should ensure that at least\n  one of the actions is possible, by providing more input and/or consuming more\n  output, and updating the next_* and avail_* values accordingly.  The\n  application can consume the uncompressed output when it wants, for example\n  when the output buffer is full (avail_out == 0), or after each call of\n  inflate().  If inflate returns Z_OK and with zero avail_out, it must be\n  called again after making room in the output buffer because there might be\n  more output pending.\n\n    The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH,\n  Z_BLOCK, or Z_TREES.  Z_SYNC_FLUSH requests that inflate() flush as much\n  output as possible to the output buffer.  Z_BLOCK requests that inflate()\n  stop if and when it gets to the next deflate block boundary.  When decoding\n  the zlib or gzip format, this will cause inflate() to return immediately\n  after the header and before the first block.  When doing a raw inflate,\n  inflate() will go ahead and process the first block, and will return when it\n  gets to the end of that block, or when it runs out of data.\n\n    The Z_BLOCK option assists in appending to or combining deflate streams.\n  Also to assist in this, on return inflate() will set strm->data_type to the\n  number of unused bits in the last byte taken from strm->next_in, plus 64 if\n  inflate() is currently decoding the last block in the deflate stream, plus\n  128 if inflate() returned immediately after decoding an end-of-block code or\n  decoding the complete header up to just before the first byte of the deflate\n  stream.  The end-of-block will not be indicated until all of the uncompressed\n  data from that block has been written to strm->next_out.  The number of\n  unused bits may in general be greater than seven, except when bit 7 of\n  data_type is set, in which case the number of unused bits will be less than\n  eight.  data_type is set as noted here every time inflate() returns for all\n  flush options, and so can be used to determine the amount of currently\n  consumed input in bits.\n\n    The Z_TREES option behaves as Z_BLOCK does, but it also returns when the\n  end of each deflate block header is reached, before any actual data in that\n  block is decoded.  This allows the caller to determine the length of the\n  deflate block header for later use in random access within a deflate block.\n  256 is added to the value of strm->data_type when inflate() returns\n  immediately after reaching the end of the deflate block header.\n\n    inflate() should normally be called until it returns Z_STREAM_END or an\n  error.  However if all decompression is to be performed in a single step (a\n  single call of inflate), the parameter flush should be set to Z_FINISH.  In\n  this case all pending input is processed and all pending output is flushed;\n  avail_out must be large enough to hold all of the uncompressed data for the\n  operation to complete.  (The size of the uncompressed data may have been\n  saved by the compressor for this purpose.) The use of Z_FINISH is not\n  required to perform an inflation in one step.  However it may be used to\n  inform inflate that a faster approach can be used for the single inflate()\n  call.  Z_FINISH also informs inflate to not maintain a sliding window if the\n  stream completes, which reduces inflate's memory footprint.  If the stream\n  does not complete, either because not all of the stream is provided or not\n  enough output space is provided, then a sliding window will be allocated and\n  inflate() can be called again to continue the operation as if Z_NO_FLUSH had\n  been used.\n\n     In this implementation, inflate() always flushes as much output as\n  possible to the output buffer, and always uses the faster approach on the\n  first call.  So the effects of the flush parameter in this implementation are\n  on the return value of inflate() as noted below, when inflate() returns early\n  when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of\n  memory for a sliding window when Z_FINISH is used.\n\n     If a preset dictionary is needed after this call (see inflateSetDictionary\n  below), inflate sets strm->adler to the Adler-32 checksum of the dictionary\n  chosen by the compressor and returns Z_NEED_DICT; otherwise it sets\n  strm->adler to the Adler-32 checksum of all output produced so far (that is,\n  total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described\n  below.  At the end of the stream, inflate() checks that its computed adler32\n  checksum is equal to that saved by the compressor and returns Z_STREAM_END\n  only if the checksum is correct.\n\n    inflate() can decompress and check either zlib-wrapped or gzip-wrapped\n  deflate data.  The header type is detected automatically, if requested when\n  initializing with inflateInit2().  Any information contained in the gzip\n  header is not retained, so applications that need that information should\n  instead use raw inflate, see inflateInit2() below, or inflateBack() and\n  perform their own processing of the gzip header and trailer.  When processing\n  gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output\n  producted so far.  The CRC-32 is checked against the gzip trailer.\n\n    inflate() returns Z_OK if some progress has been made (more input processed\n  or more output produced), Z_STREAM_END if the end of the compressed data has\n  been reached and all uncompressed output has been produced, Z_NEED_DICT if a\n  preset dictionary is needed at this point, Z_DATA_ERROR if the input data was\n  corrupted (input stream not conforming to the zlib format or incorrect check\n  value), Z_STREAM_ERROR if the stream structure was inconsistent (for example\n  next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory,\n  Z_BUF_ERROR if no progress is possible or if there was not enough room in the\n  output buffer when Z_FINISH is used.  Note that Z_BUF_ERROR is not fatal, and\n  inflate() can be called again with more input and more output space to\n  continue decompressing.  If Z_DATA_ERROR is returned, the application may\n  then call inflateSync() to look for a good compression block if a partial\n  recovery of the data is desired.\n*/\n\n\nZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));\n/*\n     All dynamically allocated data structures for this stream are freed.\n   This function discards any unprocessed input and does not flush any pending\n   output.\n\n     inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state\n   was inconsistent.  In the error case, msg may be set but then points to a\n   static string (which must not be deallocated).\n*/\n\n\n                        /* Advanced functions */\n\n/*\n    The following functions are needed only in some special applications.\n*/\n\n/*\nZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,\n                                     int  level,\n                                     int  method,\n                                     int  windowBits,\n                                     int  memLevel,\n                                     int  strategy));\n\n     This is another version of deflateInit with more compression options.  The\n   fields next_in, zalloc, zfree and opaque must be initialized before by the\n   caller.\n\n     The method parameter is the compression method.  It must be Z_DEFLATED in\n   this version of the library.\n\n     The windowBits parameter is the base two logarithm of the window size\n   (the size of the history buffer).  It should be in the range 8..15 for this\n   version of the library.  Larger values of this parameter result in better\n   compression at the expense of memory usage.  The default value is 15 if\n   deflateInit is used instead.\n\n     windowBits can also be -8..-15 for raw deflate.  In this case, -windowBits\n   determines the window size.  deflate() will then generate raw deflate data\n   with no zlib header or trailer, and will not compute an adler32 check value.\n\n     windowBits can also be greater than 15 for optional gzip encoding.  Add\n   16 to windowBits to write a simple gzip header and trailer around the\n   compressed data instead of a zlib wrapper.  The gzip header will have no\n   file name, no extra data, no comment, no modification time (set to zero), no\n   header crc, and the operating system will be set to 255 (unknown).  If a\n   gzip stream is being written, strm->adler is a crc32 instead of an adler32.\n\n     The memLevel parameter specifies how much memory should be allocated\n   for the internal compression state.  memLevel=1 uses minimum memory but is\n   slow and reduces compression ratio; memLevel=9 uses maximum memory for\n   optimal speed.  The default value is 8.  See zconf.h for total memory usage\n   as a function of windowBits and memLevel.\n\n     The strategy parameter is used to tune the compression algorithm.  Use the\n   value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a\n   filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no\n   string match), or Z_RLE to limit match distances to one (run-length\n   encoding).  Filtered data consists mostly of small values with a somewhat\n   random distribution.  In this case, the compression algorithm is tuned to\n   compress them better.  The effect of Z_FILTERED is to force more Huffman\n   coding and less string matching; it is somewhat intermediate between\n   Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY.  Z_RLE is designed to be almost as\n   fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data.  The\n   strategy parameter only affects the compression ratio but not the\n   correctness of the compressed output even if it is not set appropriately.\n   Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler\n   decoder for special applications.\n\n     deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough\n   memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid\n   method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is\n   incompatible with the version assumed by the caller (ZLIB_VERSION).  msg is\n   set to null if there is no error message.  deflateInit2 does not perform any\n   compression: this will be done by deflate().\n*/\n\nZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,\n                                             const Bytef *dictionary,\n                                             uInt  dictLength));\n/*\n     Initializes the compression dictionary from the given byte sequence\n   without producing any compressed output.  When using the zlib format, this\n   function must be called immediately after deflateInit, deflateInit2 or\n   deflateReset, and before any call of deflate.  When doing raw deflate, this\n   function must be called either before any call of deflate, or immediately\n   after the completion of a deflate block, i.e. after all input has been\n   consumed and all output has been delivered when using any of the flush\n   options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH.  The\n   compressor and decompressor must use exactly the same dictionary (see\n   inflateSetDictionary).\n\n     The dictionary should consist of strings (byte sequences) that are likely\n   to be encountered later in the data to be compressed, with the most commonly\n   used strings preferably put towards the end of the dictionary.  Using a\n   dictionary is most useful when the data to be compressed is short and can be\n   predicted with good accuracy; the data can then be compressed better than\n   with the default empty dictionary.\n\n     Depending on the size of the compression data structures selected by\n   deflateInit or deflateInit2, a part of the dictionary may in effect be\n   discarded, for example if the dictionary is larger than the window size\n   provided in deflateInit or deflateInit2.  Thus the strings most likely to be\n   useful should be put at the end of the dictionary, not at the front.  In\n   addition, the current implementation of deflate will use at most the window\n   size minus 262 bytes of the provided dictionary.\n\n     Upon return of this function, strm->adler is set to the adler32 value\n   of the dictionary; the decompressor may later use this value to determine\n   which dictionary has been used by the compressor.  (The adler32 value\n   applies to the whole dictionary even if only a subset of the dictionary is\n   actually used by the compressor.) If a raw deflate was requested, then the\n   adler32 value is not computed and strm->adler is not set.\n\n     deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a\n   parameter is invalid (e.g.  dictionary being Z_NULL) or the stream state is\n   inconsistent (for example if deflate has already been called for this stream\n   or if not at a block boundary for raw deflate).  deflateSetDictionary does\n   not perform any compression: this will be done by deflate().\n*/\n\nZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,\n                                    z_streamp source));\n/*\n     Sets the destination stream as a complete copy of the source stream.\n\n     This function can be useful when several compression strategies will be\n   tried, for example when there are several ways of pre-processing the input\n   data with a filter.  The streams that will be discarded should then be freed\n   by calling deflateEnd.  Note that deflateCopy duplicates the internal\n   compression state which can be quite large, so this strategy is slow and can\n   consume lots of memory.\n\n     deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not\n   enough memory, Z_STREAM_ERROR if the source stream state was inconsistent\n   (such as zalloc being Z_NULL).  msg is left unchanged in both source and\n   destination.\n*/\n\nZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));\n/*\n     This function is equivalent to deflateEnd followed by deflateInit,\n   but does not free and reallocate all the internal compression state.  The\n   stream will keep the same compression level and any other attributes that\n   may have been set by deflateInit2.\n\n     deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source\n   stream state was inconsistent (such as zalloc or state being Z_NULL).\n*/\n\nZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,\n                                      int level,\n                                      int strategy));\n/*\n     Dynamically update the compression level and compression strategy.  The\n   interpretation of level and strategy is as in deflateInit2.  This can be\n   used to switch between compression and straight copy of the input data, or\n   to switch to a different kind of input data requiring a different strategy.\n   If the compression level is changed, the input available so far is\n   compressed with the old level (and may be flushed); the new level will take\n   effect only at the next call of deflate().\n\n     Before the call of deflateParams, the stream state must be set as for\n   a call of deflate(), since the currently available input may have to be\n   compressed and flushed.  In particular, strm->avail_out must be non-zero.\n\n     deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source\n   stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if\n   strm->avail_out was zero.\n*/\n\nZEXTERN int ZEXPORT deflateTune OF((z_streamp strm,\n                                    int good_length,\n                                    int max_lazy,\n                                    int nice_length,\n                                    int max_chain));\n/*\n     Fine tune deflate's internal compression parameters.  This should only be\n   used by someone who understands the algorithm used by zlib's deflate for\n   searching for the best matching string, and even then only by the most\n   fanatic optimizer trying to squeeze out the last compressed bit for their\n   specific input data.  Read the deflate.c source code for the meaning of the\n   max_lazy, good_length, nice_length, and max_chain parameters.\n\n     deflateTune() can be called after deflateInit() or deflateInit2(), and\n   returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream.\n */\n\nZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm,\n                                       uLong sourceLen));\n/*\n     deflateBound() returns an upper bound on the compressed size after\n   deflation of sourceLen bytes.  It must be called after deflateInit() or\n   deflateInit2(), and after deflateSetHeader(), if used.  This would be used\n   to allocate an output buffer for deflation in a single pass, and so would be\n   called before deflate().  If that first deflate() call is provided the\n   sourceLen input bytes, an output buffer allocated to the size returned by\n   deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed\n   to return Z_STREAM_END.  Note that it is possible for the compressed size to\n   be larger than the value returned by deflateBound() if flush options other\n   than Z_FINISH or Z_NO_FLUSH are used.\n*/\n\nZEXTERN int ZEXPORT deflatePending OF((z_streamp strm,\n                                       unsigned *pending,\n                                       int *bits));\n/*\n     deflatePending() returns the number of bytes and bits of output that have\n   been generated, but not yet provided in the available output.  The bytes not\n   provided would be due to the available output space having being consumed.\n   The number of bits of output not provided are between 0 and 7, where they\n   await more bits to join them in order to fill out a full byte.  If pending\n   or bits are Z_NULL, then those values are not set.\n\n     deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source\n   stream state was inconsistent.\n */\n\nZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm,\n                                     int bits,\n                                     int value));\n/*\n     deflatePrime() inserts bits in the deflate output stream.  The intent\n   is that this function is used to start off the deflate output with the bits\n   leftover from a previous deflate stream when appending to it.  As such, this\n   function can only be used for raw deflate, and must be used before the first\n   deflate() call after a deflateInit2() or deflateReset().  bits must be less\n   than or equal to 16, and that many of the least significant bits of value\n   will be inserted in the output.\n\n     deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough\n   room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the\n   source stream state was inconsistent.\n*/\n\nZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm,\n                                         gz_headerp head));\n/*\n     deflateSetHeader() provides gzip header information for when a gzip\n   stream is requested by deflateInit2().  deflateSetHeader() may be called\n   after deflateInit2() or deflateReset() and before the first call of\n   deflate().  The text, time, os, extra field, name, and comment information\n   in the provided gz_header structure are written to the gzip header (xflag is\n   ignored -- the extra flags are set according to the compression level).  The\n   caller must assure that, if not Z_NULL, name and comment are terminated with\n   a zero byte, and that if extra is not Z_NULL, that extra_len bytes are\n   available there.  If hcrc is true, a gzip header crc is included.  Note that\n   the current versions of the command-line version of gzip (up through version\n   1.3.x) do not support header crc's, and will report that it is a \"multi-part\n   gzip file\" and give up.\n\n     If deflateSetHeader is not used, the default gzip header has text false,\n   the time set to zero, and os set to 255, with no extra, name, or comment\n   fields.  The gzip header is returned to the default state by deflateReset().\n\n     deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source\n   stream state was inconsistent.\n*/\n\n/*\nZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,\n                                     int  windowBits));\n\n     This is another version of inflateInit with an extra parameter.  The\n   fields next_in, avail_in, zalloc, zfree and opaque must be initialized\n   before by the caller.\n\n     The windowBits parameter is the base two logarithm of the maximum window\n   size (the size of the history buffer).  It should be in the range 8..15 for\n   this version of the library.  The default value is 15 if inflateInit is used\n   instead.  windowBits must be greater than or equal to the windowBits value\n   provided to deflateInit2() while compressing, or it must be equal to 15 if\n   deflateInit2() was not used.  If a compressed stream with a larger window\n   size is given as input, inflate() will return with the error code\n   Z_DATA_ERROR instead of trying to allocate a larger window.\n\n     windowBits can also be zero to request that inflate use the window size in\n   the zlib header of the compressed stream.\n\n     windowBits can also be -8..-15 for raw inflate.  In this case, -windowBits\n   determines the window size.  inflate() will then process raw deflate data,\n   not looking for a zlib or gzip header, not generating a check value, and not\n   looking for any check values for comparison at the end of the stream.  This\n   is for use with other formats that use the deflate compressed data format\n   such as zip.  Those formats provide their own check values.  If a custom\n   format is developed using the raw deflate format for compressed data, it is\n   recommended that a check value such as an adler32 or a crc32 be applied to\n   the uncompressed data as is done in the zlib, gzip, and zip formats.  For\n   most applications, the zlib format should be used as is.  Note that comments\n   above on the use in deflateInit2() applies to the magnitude of windowBits.\n\n     windowBits can also be greater than 15 for optional gzip decoding.  Add\n   32 to windowBits to enable zlib and gzip decoding with automatic header\n   detection, or add 16 to decode only the gzip format (the zlib format will\n   return a Z_DATA_ERROR).  If a gzip stream is being decoded, strm->adler is a\n   crc32 instead of an adler32.\n\n     inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough\n   memory, Z_VERSION_ERROR if the zlib library version is incompatible with the\n   version assumed by the caller, or Z_STREAM_ERROR if the parameters are\n   invalid, such as a null pointer to the structure.  msg is set to null if\n   there is no error message.  inflateInit2 does not perform any decompression\n   apart from possibly reading the zlib header if present: actual decompression\n   will be done by inflate().  (So next_in and avail_in may be modified, but\n   next_out and avail_out are unused and unchanged.) The current implementation\n   of inflateInit2() does not process any header information -- that is\n   deferred until inflate() is called.\n*/\n\nZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,\n                                             const Bytef *dictionary,\n                                             uInt  dictLength));\n/*\n     Initializes the decompression dictionary from the given uncompressed byte\n   sequence.  This function must be called immediately after a call of inflate,\n   if that call returned Z_NEED_DICT.  The dictionary chosen by the compressor\n   can be determined from the adler32 value returned by that call of inflate.\n   The compressor and decompressor must use exactly the same dictionary (see\n   deflateSetDictionary).  For raw inflate, this function can be called at any\n   time to set the dictionary.  If the provided dictionary is smaller than the\n   window and there is already data in the window, then the provided dictionary\n   will amend what's there.  The application must insure that the dictionary\n   that was used for compression is provided.\n\n     inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a\n   parameter is invalid (e.g.  dictionary being Z_NULL) or the stream state is\n   inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the\n   expected one (incorrect adler32 value).  inflateSetDictionary does not\n   perform any decompression: this will be done by subsequent calls of\n   inflate().\n*/\n\nZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm,\n                                             Bytef *dictionary,\n                                             uInt  *dictLength));\n/*\n     Returns the sliding dictionary being maintained by inflate.  dictLength is\n   set to the number of bytes in the dictionary, and that many bytes are copied\n   to dictionary.  dictionary must have enough space, where 32768 bytes is\n   always enough.  If inflateGetDictionary() is called with dictionary equal to\n   Z_NULL, then only the dictionary length is returned, and nothing is copied.\n   Similary, if dictLength is Z_NULL, then it is not set.\n\n     inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the\n   stream state is inconsistent.\n*/\n\nZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));\n/*\n     Skips invalid compressed data until a possible full flush point (see above\n   for the description of deflate with Z_FULL_FLUSH) can be found, or until all\n   available input is skipped.  No output is provided.\n\n     inflateSync searches for a 00 00 FF FF pattern in the compressed data.\n   All full flush points have this pattern, but not all occurrences of this\n   pattern are full flush points.\n\n     inflateSync returns Z_OK if a possible full flush point has been found,\n   Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point\n   has been found, or Z_STREAM_ERROR if the stream structure was inconsistent.\n   In the success case, the application may save the current current value of\n   total_in which indicates where valid compressed data was found.  In the\n   error case, the application may repeatedly call inflateSync, providing more\n   input each time, until success or end of the input data.\n*/\n\nZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,\n                                    z_streamp source));\n/*\n     Sets the destination stream as a complete copy of the source stream.\n\n     This function can be useful when randomly accessing a large stream.  The\n   first pass through the stream can periodically record the inflate state,\n   allowing restarting inflate at those points when randomly accessing the\n   stream.\n\n     inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not\n   enough memory, Z_STREAM_ERROR if the source stream state was inconsistent\n   (such as zalloc being Z_NULL).  msg is left unchanged in both source and\n   destination.\n*/\n\nZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));\n/*\n     This function is equivalent to inflateEnd followed by inflateInit,\n   but does not free and reallocate all the internal decompression state.  The\n   stream will keep attributes that may have been set by inflateInit2.\n\n     inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source\n   stream state was inconsistent (such as zalloc or state being Z_NULL).\n*/\n\nZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm,\n                                      int windowBits));\n/*\n     This function is the same as inflateReset, but it also permits changing\n   the wrap and window size requests.  The windowBits parameter is interpreted\n   the same as it is for inflateInit2.\n\n     inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source\n   stream state was inconsistent (such as zalloc or state being Z_NULL), or if\n   the windowBits parameter is invalid.\n*/\n\nZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm,\n                                     int bits,\n                                     int value));\n/*\n     This function inserts bits in the inflate input stream.  The intent is\n   that this function is used to start inflating at a bit position in the\n   middle of a byte.  The provided bits will be used before any bytes are used\n   from next_in.  This function should only be used with raw inflate, and\n   should be used before the first inflate() call after inflateInit2() or\n   inflateReset().  bits must be less than or equal to 16, and that many of the\n   least significant bits of value will be inserted in the input.\n\n     If bits is negative, then the input stream bit buffer is emptied.  Then\n   inflatePrime() can be called again to put bits in the buffer.  This is used\n   to clear out bits leftover after feeding inflate a block description prior\n   to feeding inflate codes.\n\n     inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source\n   stream state was inconsistent.\n*/\n\nZEXTERN long ZEXPORT inflateMark OF((z_streamp strm));\n/*\n     This function returns two values, one in the lower 16 bits of the return\n   value, and the other in the remaining upper bits, obtained by shifting the\n   return value down 16 bits.  If the upper value is -1 and the lower value is\n   zero, then inflate() is currently decoding information outside of a block.\n   If the upper value is -1 and the lower value is non-zero, then inflate is in\n   the middle of a stored block, with the lower value equaling the number of\n   bytes from the input remaining to copy.  If the upper value is not -1, then\n   it is the number of bits back from the current bit position in the input of\n   the code (literal or length/distance pair) currently being processed.  In\n   that case the lower value is the number of bytes already emitted for that\n   code.\n\n     A code is being processed if inflate is waiting for more input to complete\n   decoding of the code, or if it has completed decoding but is waiting for\n   more output space to write the literal or match data.\n\n     inflateMark() is used to mark locations in the input data for random\n   access, which may be at bit positions, and to note those cases where the\n   output of a code may span boundaries of random access blocks.  The current\n   location in the input stream can be determined from avail_in and data_type\n   as noted in the description for the Z_BLOCK flush parameter for inflate.\n\n     inflateMark returns the value noted above or -1 << 16 if the provided\n   source stream state was inconsistent.\n*/\n\nZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm,\n                                         gz_headerp head));\n/*\n     inflateGetHeader() requests that gzip header information be stored in the\n   provided gz_header structure.  inflateGetHeader() may be called after\n   inflateInit2() or inflateReset(), and before the first call of inflate().\n   As inflate() processes the gzip stream, head->done is zero until the header\n   is completed, at which time head->done is set to one.  If a zlib stream is\n   being decoded, then head->done is set to -1 to indicate that there will be\n   no gzip header information forthcoming.  Note that Z_BLOCK or Z_TREES can be\n   used to force inflate() to return immediately after header processing is\n   complete and before any actual data is decompressed.\n\n     The text, time, xflags, and os fields are filled in with the gzip header\n   contents.  hcrc is set to true if there is a header CRC.  (The header CRC\n   was valid if done is set to one.) If extra is not Z_NULL, then extra_max\n   contains the maximum number of bytes to write to extra.  Once done is true,\n   extra_len contains the actual extra field length, and extra contains the\n   extra field, or that field truncated if extra_max is less than extra_len.\n   If name is not Z_NULL, then up to name_max characters are written there,\n   terminated with a zero unless the length is greater than name_max.  If\n   comment is not Z_NULL, then up to comm_max characters are written there,\n   terminated with a zero unless the length is greater than comm_max.  When any\n   of extra, name, or comment are not Z_NULL and the respective field is not\n   present in the header, then that field is set to Z_NULL to signal its\n   absence.  This allows the use of deflateSetHeader() with the returned\n   structure to duplicate the header.  However if those fields are set to\n   allocated memory, then the application will need to save those pointers\n   elsewhere so that they can be eventually freed.\n\n     If inflateGetHeader is not used, then the header information is simply\n   discarded.  The header is always checked for validity, including the header\n   CRC if present.  inflateReset() will reset the process to discard the header\n   information.  The application would need to call inflateGetHeader() again to\n   retrieve the header from the next gzip stream.\n\n     inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source\n   stream state was inconsistent.\n*/\n\n/*\nZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,\n                                        unsigned char FAR *window));\n\n     Initialize the internal stream state for decompression using inflateBack()\n   calls.  The fields zalloc, zfree and opaque in strm must be initialized\n   before the call.  If zalloc and zfree are Z_NULL, then the default library-\n   derived memory allocation routines are used.  windowBits is the base two\n   logarithm of the window size, in the range 8..15.  window is a caller\n   supplied buffer of that size.  Except for special applications where it is\n   assured that deflate was used with small window sizes, windowBits must be 15\n   and a 32K byte window must be supplied to be able to decompress general\n   deflate streams.\n\n     See inflateBack() for the usage of these routines.\n\n     inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of\n   the parameters are invalid, Z_MEM_ERROR if the internal state could not be\n   allocated, or Z_VERSION_ERROR if the version of the library does not match\n   the version of the header file.\n*/\n\ntypedef unsigned (*in_func) OF((void FAR *,\n                                z_const unsigned char FAR * FAR *));\ntypedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));\n\nZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,\n                                    in_func in, void FAR *in_desc,\n                                    out_func out, void FAR *out_desc));\n/*\n     inflateBack() does a raw inflate with a single call using a call-back\n   interface for input and output.  This is potentially more efficient than\n   inflate() for file i/o applications, in that it avoids copying between the\n   output and the sliding window by simply making the window itself the output\n   buffer.  inflate() can be faster on modern CPUs when used with large\n   buffers.  inflateBack() trusts the application to not change the output\n   buffer passed by the output function, at least until inflateBack() returns.\n\n     inflateBackInit() must be called first to allocate the internal state\n   and to initialize the state with the user-provided window buffer.\n   inflateBack() may then be used multiple times to inflate a complete, raw\n   deflate stream with each call.  inflateBackEnd() is then called to free the\n   allocated state.\n\n     A raw deflate stream is one with no zlib or gzip header or trailer.\n   This routine would normally be used in a utility that reads zip or gzip\n   files and writes out uncompressed files.  The utility would decode the\n   header and process the trailer on its own, hence this routine expects only\n   the raw deflate stream to decompress.  This is different from the normal\n   behavior of inflate(), which expects either a zlib or gzip header and\n   trailer around the deflate stream.\n\n     inflateBack() uses two subroutines supplied by the caller that are then\n   called by inflateBack() for input and output.  inflateBack() calls those\n   routines until it reads a complete deflate stream and writes out all of the\n   uncompressed data, or until it encounters an error.  The function's\n   parameters and return types are defined above in the in_func and out_func\n   typedefs.  inflateBack() will call in(in_desc, &buf) which should return the\n   number of bytes of provided input, and a pointer to that input in buf.  If\n   there is no input available, in() must return zero--buf is ignored in that\n   case--and inflateBack() will return a buffer error.  inflateBack() will call\n   out(out_desc, buf, len) to write the uncompressed data buf[0..len-1].  out()\n   should return zero on success, or non-zero on failure.  If out() returns\n   non-zero, inflateBack() will return with an error.  Neither in() nor out()\n   are permitted to change the contents of the window provided to\n   inflateBackInit(), which is also the buffer that out() uses to write from.\n   The length written by out() will be at most the window size.  Any non-zero\n   amount of input may be provided by in().\n\n     For convenience, inflateBack() can be provided input on the first call by\n   setting strm->next_in and strm->avail_in.  If that input is exhausted, then\n   in() will be called.  Therefore strm->next_in must be initialized before\n   calling inflateBack().  If strm->next_in is Z_NULL, then in() will be called\n   immediately for input.  If strm->next_in is not Z_NULL, then strm->avail_in\n   must also be initialized, and then if strm->avail_in is not zero, input will\n   initially be taken from strm->next_in[0 ..  strm->avail_in - 1].\n\n     The in_desc and out_desc parameters of inflateBack() is passed as the\n   first parameter of in() and out() respectively when they are called.  These\n   descriptors can be optionally used to pass any information that the caller-\n   supplied in() and out() functions need to do their job.\n\n     On return, inflateBack() will set strm->next_in and strm->avail_in to\n   pass back any unused input that was provided by the last in() call.  The\n   return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR\n   if in() or out() returned an error, Z_DATA_ERROR if there was a format error\n   in the deflate stream (in which case strm->msg is set to indicate the nature\n   of the error), or Z_STREAM_ERROR if the stream was not properly initialized.\n   In the case of Z_BUF_ERROR, an input or output error can be distinguished\n   using strm->next_in which will be Z_NULL only if in() returned an error.  If\n   strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning\n   non-zero.  (in() will always be called before out(), so strm->next_in is\n   assured to be defined if out() returns non-zero.) Note that inflateBack()\n   cannot return Z_OK.\n*/\n\nZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm));\n/*\n     All memory allocated by inflateBackInit() is freed.\n\n     inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream\n   state was inconsistent.\n*/\n\nZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));\n/* Return flags indicating compile-time options.\n\n    Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other:\n     1.0: size of uInt\n     3.2: size of uLong\n     5.4: size of voidpf (pointer)\n     7.6: size of z_off_t\n\n    Compiler, assembler, and debug options:\n     8: DEBUG\n     9: ASMV or ASMINF -- use ASM code\n     10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention\n     11: 0 (reserved)\n\n    One-time table building (smaller code, but not thread-safe if true):\n     12: BUILDFIXED -- build static block decoding tables when needed\n     13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed\n     14,15: 0 (reserved)\n\n    Library content (indicates missing functionality):\n     16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking\n                          deflate code when not needed)\n     17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect\n                    and decode gzip streams (to avoid linking crc code)\n     18-19: 0 (reserved)\n\n    Operation variations (changes in library functionality):\n     20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate\n     21: FASTEST -- deflate algorithm with only one, lowest compression level\n     22,23: 0 (reserved)\n\n    The sprintf variant used by gzprintf (zero is best):\n     24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format\n     25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure!\n     26: 0 = returns value, 1 = void -- 1 means inferred string length returned\n\n    Remainder:\n     27-31: 0 (reserved)\n */\n\n#ifndef Z_SOLO\n\n                        /* utility functions */\n\n/*\n     The following utility functions are implemented on top of the basic\n   stream-oriented functions.  To simplify the interface, some default options\n   are assumed (compression level and memory usage, standard memory allocation\n   functions).  The source code of these utility functions can be modified if\n   you need special options.\n*/\n\nZEXTERN int ZEXPORT compress OF((Bytef *dest,   uLongf *destLen,\n                                 const Bytef *source, uLong sourceLen));\n/*\n     Compresses the source buffer into the destination buffer.  sourceLen is\n   the byte length of the source buffer.  Upon entry, destLen is the total size\n   of the destination buffer, which must be at least the value returned by\n   compressBound(sourceLen).  Upon exit, destLen is the actual size of the\n   compressed buffer.\n\n     compress returns Z_OK if success, Z_MEM_ERROR if there was not\n   enough memory, Z_BUF_ERROR if there was not enough room in the output\n   buffer.\n*/\n\nZEXTERN int ZEXPORT compress2 OF((Bytef *dest,   uLongf *destLen,\n                                  const Bytef *source, uLong sourceLen,\n                                  int level));\n/*\n     Compresses the source buffer into the destination buffer.  The level\n   parameter has the same meaning as in deflateInit.  sourceLen is the byte\n   length of the source buffer.  Upon entry, destLen is the total size of the\n   destination buffer, which must be at least the value returned by\n   compressBound(sourceLen).  Upon exit, destLen is the actual size of the\n   compressed buffer.\n\n     compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough\n   memory, Z_BUF_ERROR if there was not enough room in the output buffer,\n   Z_STREAM_ERROR if the level parameter is invalid.\n*/\n\nZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen));\n/*\n     compressBound() returns an upper bound on the compressed size after\n   compress() or compress2() on sourceLen bytes.  It would be used before a\n   compress() or compress2() call to allocate the destination buffer.\n*/\n\nZEXTERN int ZEXPORT uncompress OF((Bytef *dest,   uLongf *destLen,\n                                   const Bytef *source, uLong sourceLen));\n/*\n     Decompresses the source buffer into the destination buffer.  sourceLen is\n   the byte length of the source buffer.  Upon entry, destLen is the total size\n   of the destination buffer, which must be large enough to hold the entire\n   uncompressed data.  (The size of the uncompressed data must have been saved\n   previously by the compressor and transmitted to the decompressor by some\n   mechanism outside the scope of this compression library.) Upon exit, destLen\n   is the actual size of the uncompressed buffer.\n\n     uncompress returns Z_OK if success, Z_MEM_ERROR if there was not\n   enough memory, Z_BUF_ERROR if there was not enough room in the output\n   buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete.  In\n   the case where there is not enough room, uncompress() will fill the output\n   buffer with the uncompressed data up to that point.\n*/\n\n                        /* gzip file access functions */\n\n/*\n     This library supports reading and writing files in gzip (.gz) format with\n   an interface similar to that of stdio, using the functions that start with\n   \"gz\".  The gzip format is different from the zlib format.  gzip is a gzip\n   wrapper, documented in RFC 1952, wrapped around a deflate stream.\n*/\n\ntypedef struct gzFile_s *gzFile;    /* semi-opaque gzip file descriptor */\n\n/*\nZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));\n\n     Opens a gzip (.gz) file for reading or writing.  The mode parameter is as\n   in fopen (\"rb\" or \"wb\") but can also include a compression level (\"wb9\") or\n   a strategy: 'f' for filtered data as in \"wb6f\", 'h' for Huffman-only\n   compression as in \"wb1h\", 'R' for run-length encoding as in \"wb1R\", or 'F'\n   for fixed code compression as in \"wb9F\".  (See the description of\n   deflateInit2 for more information about the strategy parameter.)  'T' will\n   request transparent writing or appending with no compression and not using\n   the gzip format.\n\n     \"a\" can be used instead of \"w\" to request that the gzip stream that will\n   be written be appended to the file.  \"+\" will result in an error, since\n   reading and writing to the same gzip file is not supported.  The addition of\n   \"x\" when writing will create the file exclusively, which fails if the file\n   already exists.  On systems that support it, the addition of \"e\" when\n   reading or writing will set the flag to close the file on an execve() call.\n\n     These functions, as well as gzip, will read and decode a sequence of gzip\n   streams in a file.  The append function of gzopen() can be used to create\n   such a file.  (Also see gzflush() for another way to do this.)  When\n   appending, gzopen does not test whether the file begins with a gzip stream,\n   nor does it look for the end of the gzip streams to begin appending.  gzopen\n   will simply append a gzip stream to the existing file.\n\n     gzopen can be used to read a file which is not in gzip format; in this\n   case gzread will directly read from the file without decompression.  When\n   reading, this will be detected automatically by looking for the magic two-\n   byte gzip header.\n\n     gzopen returns NULL if the file could not be opened, if there was\n   insufficient memory to allocate the gzFile state, or if an invalid mode was\n   specified (an 'r', 'w', or 'a' was not provided, or '+' was provided).\n   errno can be checked to determine if the reason gzopen failed was that the\n   file could not be opened.\n*/\n\nZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));\n/*\n     gzdopen associates a gzFile with the file descriptor fd.  File descriptors\n   are obtained from calls like open, dup, creat, pipe or fileno (if the file\n   has been previously opened with fopen).  The mode parameter is as in gzopen.\n\n     The next call of gzclose on the returned gzFile will also close the file\n   descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor\n   fd.  If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd,\n   mode);.  The duplicated descriptor should be saved to avoid a leak, since\n   gzdopen does not close fd if it fails.  If you are using fileno() to get the\n   file descriptor from a FILE *, then you will have to use dup() to avoid\n   double-close()ing the file descriptor.  Both gzclose() and fclose() will\n   close the associated file descriptor, so they need to have different file\n   descriptors.\n\n     gzdopen returns NULL if there was insufficient memory to allocate the\n   gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not\n   provided, or '+' was provided), or if fd is -1.  The file descriptor is not\n   used until the next gz* read, write, seek, or close operation, so gzdopen\n   will not detect if fd is invalid (unless fd is -1).\n*/\n\nZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size));\n/*\n     Set the internal buffer size used by this library's functions.  The\n   default buffer size is 8192 bytes.  This function must be called after\n   gzopen() or gzdopen(), and before any other calls that read or write the\n   file.  The buffer memory allocation is always deferred to the first read or\n   write.  Two buffers are allocated, either both of the specified size when\n   writing, or one of the specified size and the other twice that size when\n   reading.  A larger buffer size of, for example, 64K or 128K bytes will\n   noticeably increase the speed of decompression (reading).\n\n     The new buffer size also affects the maximum length for gzprintf().\n\n     gzbuffer() returns 0 on success, or -1 on failure, such as being called\n   too late.\n*/\n\nZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));\n/*\n     Dynamically update the compression level or strategy.  See the description\n   of deflateInit2 for the meaning of these parameters.\n\n     gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not\n   opened for writing.\n*/\n\nZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));\n/*\n     Reads the given number of uncompressed bytes from the compressed file.  If\n   the input file is not in gzip format, gzread copies the given number of\n   bytes into the buffer directly from the file.\n\n     After reaching the end of a gzip stream in the input, gzread will continue\n   to read, looking for another gzip stream.  Any number of gzip streams may be\n   concatenated in the input file, and will all be decompressed by gzread().\n   If something other than a gzip stream is encountered after a gzip stream,\n   that remaining trailing garbage is ignored (and no error is returned).\n\n     gzread can be used to read a gzip file that is being concurrently written.\n   Upon reaching the end of the input, gzread will return with the available\n   data.  If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then\n   gzclearerr can be used to clear the end of file indicator in order to permit\n   gzread to be tried again.  Z_OK indicates that a gzip stream was completed\n   on the last gzread.  Z_BUF_ERROR indicates that the input file ended in the\n   middle of a gzip stream.  Note that gzread does not return -1 in the event\n   of an incomplete gzip stream.  This error is deferred until gzclose(), which\n   will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip\n   stream.  Alternatively, gzerror can be used before gzclose to detect this\n   case.\n\n     gzread returns the number of uncompressed bytes actually read, less than\n   len for end of file, or -1 for error.\n*/\n\nZEXTERN int ZEXPORT gzwrite OF((gzFile file,\n                                voidpc buf, unsigned len));\n/*\n     Writes the given number of uncompressed bytes into the compressed file.\n   gzwrite returns the number of uncompressed bytes written or 0 in case of\n   error.\n*/\n\nZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...));\n/*\n     Converts, formats, and writes the arguments to the compressed file under\n   control of the format string, as in fprintf.  gzprintf returns the number of\n   uncompressed bytes actually written, or 0 in case of error.  The number of\n   uncompressed bytes written is limited to 8191, or one less than the buffer\n   size given to gzbuffer().  The caller should assure that this limit is not\n   exceeded.  If it is exceeded, then gzprintf() will return an error (0) with\n   nothing written.  In this case, there may also be a buffer overflow with\n   unpredictable consequences, which is possible only if zlib was compiled with\n   the insecure functions sprintf() or vsprintf() because the secure snprintf()\n   or vsnprintf() functions were not available.  This can be determined using\n   zlibCompileFlags().\n*/\n\nZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));\n/*\n     Writes the given null-terminated string to the compressed file, excluding\n   the terminating null character.\n\n     gzputs returns the number of characters written, or -1 in case of error.\n*/\n\nZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));\n/*\n     Reads bytes from the compressed file until len-1 characters are read, or a\n   newline character is read and transferred to buf, or an end-of-file\n   condition is encountered.  If any characters are read or if len == 1, the\n   string is terminated with a null character.  If no characters are read due\n   to an end-of-file or len < 1, then the buffer is left untouched.\n\n     gzgets returns buf which is a null-terminated string, or it returns NULL\n   for end-of-file or in case of error.  If there was an error, the contents at\n   buf are indeterminate.\n*/\n\nZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));\n/*\n     Writes c, converted to an unsigned char, into the compressed file.  gzputc\n   returns the value that was written, or -1 in case of error.\n*/\n\nZEXTERN int ZEXPORT gzgetc OF((gzFile file));\n/*\n     Reads one byte from the compressed file.  gzgetc returns this byte or -1\n   in case of end of file or error.  This is implemented as a macro for speed.\n   As such, it does not do all of the checking the other functions do.  I.e.\n   it does not check to see if file is NULL, nor whether the structure file\n   points to has been clobbered or not.\n*/\n\nZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));\n/*\n     Push one character back onto the stream to be read as the first character\n   on the next read.  At least one character of push-back is allowed.\n   gzungetc() returns the character pushed, or -1 on failure.  gzungetc() will\n   fail if c is -1, and may fail if a character has been pushed but not read\n   yet.  If gzungetc is used immediately after gzopen or gzdopen, at least the\n   output buffer size of pushed characters is allowed.  (See gzbuffer above.)\n   The pushed character will be discarded if the stream is repositioned with\n   gzseek() or gzrewind().\n*/\n\nZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));\n/*\n     Flushes all pending output into the compressed file.  The parameter flush\n   is as in the deflate() function.  The return value is the zlib error number\n   (see function gzerror below).  gzflush is only permitted when writing.\n\n     If the flush parameter is Z_FINISH, the remaining data is written and the\n   gzip stream is completed in the output.  If gzwrite() is called again, a new\n   gzip stream will be started in the output.  gzread() is able to read such\n   concatented gzip streams.\n\n     gzflush should be called only when strictly necessary because it will\n   degrade compression if called too often.\n*/\n\n/*\nZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,\n                                   z_off_t offset, int whence));\n\n     Sets the starting position for the next gzread or gzwrite on the given\n   compressed file.  The offset represents a number of bytes in the\n   uncompressed data stream.  The whence parameter is defined as in lseek(2);\n   the value SEEK_END is not supported.\n\n     If the file is opened for reading, this function is emulated but can be\n   extremely slow.  If the file is opened for writing, only forward seeks are\n   supported; gzseek then compresses a sequence of zeroes up to the new\n   starting position.\n\n     gzseek returns the resulting offset location as measured in bytes from\n   the beginning of the uncompressed stream, or -1 in case of error, in\n   particular if the file is opened for writing and the new starting position\n   would be before the current position.\n*/\n\nZEXTERN int ZEXPORT    gzrewind OF((gzFile file));\n/*\n     Rewinds the given file. This function is supported only for reading.\n\n     gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)\n*/\n\n/*\nZEXTERN z_off_t ZEXPORT    gztell OF((gzFile file));\n\n     Returns the starting position for the next gzread or gzwrite on the given\n   compressed file.  This position represents a number of bytes in the\n   uncompressed data stream, and is zero when starting, even if appending or\n   reading a gzip stream from the middle of a file using gzdopen().\n\n     gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)\n*/\n\n/*\nZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file));\n\n     Returns the current offset in the file being read or written.  This offset\n   includes the count of bytes that precede the gzip stream, for example when\n   appending or when using gzdopen() for reading.  When reading, the offset\n   does not include as yet unused buffered input.  This information can be used\n   for a progress indicator.  On error, gzoffset() returns -1.\n*/\n\nZEXTERN int ZEXPORT gzeof OF((gzFile file));\n/*\n     Returns true (1) if the end-of-file indicator has been set while reading,\n   false (0) otherwise.  Note that the end-of-file indicator is set only if the\n   read tried to go past the end of the input, but came up short.  Therefore,\n   just like feof(), gzeof() may return false even if there is no more data to\n   read, in the event that the last read request was for the exact number of\n   bytes remaining in the input file.  This will happen if the input file size\n   is an exact multiple of the buffer size.\n\n     If gzeof() returns true, then the read functions will return no more data,\n   unless the end-of-file indicator is reset by gzclearerr() and the input file\n   has grown since the previous end of file was detected.\n*/\n\nZEXTERN int ZEXPORT gzdirect OF((gzFile file));\n/*\n     Returns true (1) if file is being copied directly while reading, or false\n   (0) if file is a gzip stream being decompressed.\n\n     If the input file is empty, gzdirect() will return true, since the input\n   does not contain a gzip stream.\n\n     If gzdirect() is used immediately after gzopen() or gzdopen() it will\n   cause buffers to be allocated to allow reading the file to determine if it\n   is a gzip file.  Therefore if gzbuffer() is used, it should be called before\n   gzdirect().\n\n     When writing, gzdirect() returns true (1) if transparent writing was\n   requested (\"wT\" for the gzopen() mode), or false (0) otherwise.  (Note:\n   gzdirect() is not needed when writing.  Transparent writing must be\n   explicitly requested, so the application already knows the answer.  When\n   linking statically, using gzdirect() will include all of the zlib code for\n   gzip file reading and decompression, which may not be desired.)\n*/\n\nZEXTERN int ZEXPORT    gzclose OF((gzFile file));\n/*\n     Flushes all pending output if necessary, closes the compressed file and\n   deallocates the (de)compression state.  Note that once file is closed, you\n   cannot call gzerror with file, since its structures have been deallocated.\n   gzclose must not be called more than once on the same file, just as free\n   must not be called more than once on the same allocation.\n\n     gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a\n   file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the\n   last read ended in the middle of a gzip stream, or Z_OK on success.\n*/\n\nZEXTERN int ZEXPORT gzclose_r OF((gzFile file));\nZEXTERN int ZEXPORT gzclose_w OF((gzFile file));\n/*\n     Same as gzclose(), but gzclose_r() is only for use when reading, and\n   gzclose_w() is only for use when writing or appending.  The advantage to\n   using these instead of gzclose() is that they avoid linking in zlib\n   compression or decompression code that is not used when only reading or only\n   writing respectively.  If gzclose() is used, then both compression and\n   decompression code will be included the application when linking to a static\n   zlib library.\n*/\n\nZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));\n/*\n     Returns the error message for the last error which occurred on the given\n   compressed file.  errnum is set to zlib error number.  If an error occurred\n   in the file system and not in the compression library, errnum is set to\n   Z_ERRNO and the application may consult errno to get the exact error code.\n\n     The application must not modify the returned string.  Future calls to\n   this function may invalidate the previously returned string.  If file is\n   closed, then the string previously returned by gzerror will no longer be\n   available.\n\n     gzerror() should be used to distinguish errors from end-of-file for those\n   functions above that do not distinguish those cases in their return values.\n*/\n\nZEXTERN void ZEXPORT gzclearerr OF((gzFile file));\n/*\n     Clears the error and end-of-file flags for file.  This is analogous to the\n   clearerr() function in stdio.  This is useful for continuing to read a gzip\n   file that is being written concurrently.\n*/\n\n#endif /* !Z_SOLO */\n\n                        /* checksum functions */\n\n/*\n     These functions are not related to compression but are exported\n   anyway because they might be useful in applications using the compression\n   library.\n*/\n\nZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));\n/*\n     Update a running Adler-32 checksum with the bytes buf[0..len-1] and\n   return the updated checksum.  If buf is Z_NULL, this function returns the\n   required initial value for the checksum.\n\n     An Adler-32 checksum is almost as reliable as a CRC32 but can be computed\n   much faster.\n\n   Usage example:\n\n     uLong adler = adler32(0L, Z_NULL, 0);\n\n     while (read_buffer(buffer, length) != EOF) {\n       adler = adler32(adler, buffer, length);\n     }\n     if (adler != original_adler) error();\n*/\n\n/*\nZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,\n                                          z_off_t len2));\n\n     Combine two Adler-32 checksums into one.  For two sequences of bytes, seq1\n   and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for\n   each, adler1 and adler2.  adler32_combine() returns the Adler-32 checksum of\n   seq1 and seq2 concatenated, requiring only adler1, adler2, and len2.  Note\n   that the z_off_t type (like off_t) is a signed integer.  If len2 is\n   negative, the result has no meaning or utility.\n*/\n\nZEXTERN uLong ZEXPORT crc32   OF((uLong crc, const Bytef *buf, uInt len));\n/*\n     Update a running CRC-32 with the bytes buf[0..len-1] and return the\n   updated CRC-32.  If buf is Z_NULL, this function returns the required\n   initial value for the crc.  Pre- and post-conditioning (one's complement) is\n   performed within this function so it shouldn't be done by the application.\n\n   Usage example:\n\n     uLong crc = crc32(0L, Z_NULL, 0);\n\n     while (read_buffer(buffer, length) != EOF) {\n       crc = crc32(crc, buffer, length);\n     }\n     if (crc != original_crc) error();\n*/\n\n/*\nZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2));\n\n     Combine two CRC-32 check values into one.  For two sequences of bytes,\n   seq1 and seq2 with lengths len1 and len2, CRC-32 check values were\n   calculated for each, crc1 and crc2.  crc32_combine() returns the CRC-32\n   check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and\n   len2.\n*/\n\n\n                        /* various hacks, don't look :) */\n\n/* deflateInit and inflateInit are macros to allow checking the zlib version\n * and the compiler's view of z_stream:\n */\nZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,\n                                     const char *version, int stream_size));\nZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,\n                                     const char *version, int stream_size));\nZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int  level, int  method,\n                                      int windowBits, int memLevel,\n                                      int strategy, const char *version,\n                                      int stream_size));\nZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int  windowBits,\n                                      const char *version, int stream_size));\nZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,\n                                         unsigned char FAR *window,\n                                         const char *version,\n                                         int stream_size));\n#define deflateInit(strm, level) \\\n        deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream))\n#define inflateInit(strm) \\\n        inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream))\n#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \\\n        deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\\\n                      (strategy), ZLIB_VERSION, (int)sizeof(z_stream))\n#define inflateInit2(strm, windowBits) \\\n        inflateInit2_((strm), (windowBits), ZLIB_VERSION, \\\n                      (int)sizeof(z_stream))\n#define inflateBackInit(strm, windowBits, window) \\\n        inflateBackInit_((strm), (windowBits), (window), \\\n                      ZLIB_VERSION, (int)sizeof(z_stream))\n\n#ifndef Z_SOLO\n\n/* gzgetc() macro and its supporting function and exposed data structure.  Note\n * that the real internal state is much larger than the exposed structure.\n * This abbreviated structure exposes just enough for the gzgetc() macro.  The\n * user should not mess with these exposed elements, since their names or\n * behavior could change in the future, perhaps even capriciously.  They can\n * only be used by the gzgetc() macro.  You have been warned.\n */\nstruct gzFile_s {\n    unsigned have;\n    unsigned char *next;\n    z_off64_t pos;\n};\nZEXTERN int ZEXPORT gzgetc_ OF((gzFile file));  /* backward compatibility */\n#ifdef Z_PREFIX_SET\n#  undef z_gzgetc\n#  define z_gzgetc(g) \\\n          ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g))\n#else\n#  define gzgetc(g) \\\n          ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g))\n#endif\n\n/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or\n * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if\n * both are true, the application gets the *64 functions, and the regular\n * functions are changed to 64 bits) -- in case these are set on systems\n * without large file support, _LFS64_LARGEFILE must also be true\n */\n#ifdef Z_LARGE64\n   ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));\n   ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));\n   ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));\n   ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));\n   ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t));\n   ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t));\n#endif\n\n#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64)\n#  ifdef Z_PREFIX_SET\n#    define z_gzopen z_gzopen64\n#    define z_gzseek z_gzseek64\n#    define z_gztell z_gztell64\n#    define z_gzoffset z_gzoffset64\n#    define z_adler32_combine z_adler32_combine64\n#    define z_crc32_combine z_crc32_combine64\n#  else\n#    define gzopen gzopen64\n#    define gzseek gzseek64\n#    define gztell gztell64\n#    define gzoffset gzoffset64\n#    define adler32_combine adler32_combine64\n#    define crc32_combine crc32_combine64\n#  endif\n#  ifndef Z_LARGE64\n     ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));\n     ZEXTERN off64_t ZEXPORT gzseek64 OF((gzFile, off64_t, int));\n     ZEXTERN off64_t ZEXPORT gztell64 OF((gzFile));\n     ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));\n     ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, off64_t));\n     ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, off64_t));\n#  endif\n#else\n   ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *));\n   ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int));\n   ZEXTERN z_off_t ZEXPORT gztell OF((gzFile));\n   ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile));\n   ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));\n   ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));\n#endif\n\n#else /* Z_SOLO */\n\n   ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));\n   ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));\n\n#endif /* !Z_SOLO */\n\n/* hack for buggy compilers */\n#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL)\n    struct internal_state {int dummy;};\n#endif\n\n/* undocumented functions */\nZEXTERN const char   * ZEXPORT zError           OF((int));\nZEXTERN int            ZEXPORT inflateSyncPoint OF((z_streamp));\nZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table    OF((void));\nZEXTERN int            ZEXPORT inflateUndermine OF((z_streamp, int));\nZEXTERN int            ZEXPORT inflateResetKeep OF((z_streamp));\nZEXTERN int            ZEXPORT deflateResetKeep OF((z_streamp));\n#if defined(_WIN32) && !defined(Z_SOLO)\nZEXTERN gzFile         ZEXPORT gzopen_w OF((const wchar_t *path,\n                                            const char *mode));\n#endif\n#if defined(STDC) || defined(Z_HAVE_STDARG_H)\n#  ifndef Z_SOLO\nZEXTERN int            ZEXPORTVA gzvprintf Z_ARG((gzFile file,\n                                                  const char *format,\n                                                  va_list va));\n#  endif\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ZLIB_H */\n"
  },
  {
    "path": "core/src/fxcodec/fx_zlib/zlib_v128/zutil.h",
    "content": "/* zutil.h -- internal interface and configuration of the compression library\n * Copyright (C) 1995-2013 Jean-loup Gailly.\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* WARNING: this file should *not* be used by applications. It is\n   part of the implementation of the compression library and is\n   subject to change. Applications should only use zlib.h.\n */\n\n/* @(#) $Id$ */\n\n#ifndef ZUTIL_H\n#define ZUTIL_H\n\n#include \"../../../../include/fxcrt/fx_system.h\"\t\t/* XYQ 2007-5-22 */\n\n#ifdef HAVE_HIDDEN\n#  define ZLIB_INTERNAL __attribute__((visibility (\"hidden\")))\n#else\n#  define ZLIB_INTERNAL\n#endif\n\n#include \"zlib.h\"\n\n#if defined(STDC) && !defined(Z_SOLO)\n#  if !(defined(_WIN32_WCE) && defined(_MSC_VER))\n#    include <stddef.h>\n#  endif\n#  include <string.h>\n#  include <stdlib.h>\n#endif\n\n#ifdef Z_SOLO\n   typedef long ptrdiff_t;  /* guess -- will be caught if guess is wrong */\n#endif\n\n#ifndef local\n#  define local static\n#endif\n/* compile with -Dlocal if your debugger can't find static symbols */\n\ntypedef unsigned char  uch;\ntypedef uch FAR uchf;\ntypedef unsigned short ush;\ntypedef ush FAR ushf;\ntypedef unsigned long  ulg;\n\nextern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */\n/* (size given to avoid silly warnings with Visual C++) */\n\n#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]\n\n#define ERR_RETURN(strm,err) \\\n  return (strm->msg = ERR_MSG(err), (err))\n/* To be used only when the state is known to be valid */\n\n        /* common constants */\n\n#ifndef DEF_WBITS\n#  define DEF_WBITS MAX_WBITS\n#endif\n/* default windowBits for decompression. MAX_WBITS is for compression only */\n\n#if MAX_MEM_LEVEL >= 8\n#  define DEF_MEM_LEVEL 8\n#else\n#  define DEF_MEM_LEVEL  MAX_MEM_LEVEL\n#endif\n/* default memLevel */\n\n#define STORED_BLOCK 0\n#define STATIC_TREES 1\n#define DYN_TREES    2\n/* The three kinds of block type */\n\n#define MIN_MATCH  3\n#define MAX_MATCH  258\n/* The minimum and maximum match lengths */\n\n#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */\n\n        /* target dependencies */\n\n#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32))\n#  define OS_CODE  0x00\n#  ifndef Z_SOLO\n#    if defined(__TURBOC__) || defined(__BORLANDC__)\n#      if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__))\n         /* Allow compilation with ANSI keywords only enabled */\n         void _Cdecl farfree( void *block );\n         void *_Cdecl farmalloc( unsigned long nbytes );\n#      else\n#        include <alloc.h>\n#      endif\n#    else /* MSC or DJGPP */\n#      include <malloc.h>\n#    endif\n#  endif\n#endif\n\n#ifdef AMIGA\n#  define OS_CODE  0x01\n#endif\n\n#if defined(VAXC) || defined(VMS)\n#  define OS_CODE  0x02\n#  define F_OPEN(name, mode) \\\n     FXSYS_fopen((name), (mode), \"mbc=60\", \"ctx=stm\", \"rfm=fix\", \"mrs=512\")\n#endif\n\n#if defined(ATARI) || defined(atarist)\n#  define OS_CODE  0x05\n#endif\n\n#ifdef OS2\n#  define OS_CODE  0x06\n#  if defined(M_I86) && !defined(Z_SOLO)\n#    include <malloc.h>\n#  endif\n#endif\n\n#if defined(MACOS) || defined(TARGET_OS_MAC)\n#  define OS_CODE  0x07\n#  ifndef Z_SOLO\n#    if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os\n#      include <unix.h> /* for fdopen */\n#    else\n#      ifndef fdopen\n#        define fdopen(fd,mode) NULL /* No fdopen() */\n#      endif\n#    endif\n#  endif\n#endif\n\n#ifdef TOPS20\n#  define OS_CODE  0x0a\n#endif\n\n#ifdef WIN32\n#  ifndef __CYGWIN__  /* Cygwin is Unix, not Win32 */\n#    define OS_CODE  0x0b\n#  endif\n#endif\n\n#ifdef __50SERIES /* Prime/PRIMOS */\n#  define OS_CODE  0x0f\n#endif\n\n#if defined(_BEOS_) || defined(RISCOS)\n#  define fdopen(fd,mode) NULL /* No fdopen() */\n#endif\n\n#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX\n#  if defined(_WIN32_WCE)\n#    define fdopen(fd,mode) NULL /* No fdopen() */\n#    ifndef _PTRDIFF_T_DEFINED\n       typedef int ptrdiff_t;\n#      define _PTRDIFF_T_DEFINED\n#    endif\n#  else\n#    define fdopen(fd,type)  _fdopen(fd,type)\n#  endif\n#endif\n\n#if defined(__BORLANDC__) && !defined(MSDOS)\n  #pragma warn -8004\n  #pragma warn -8008\n  #pragma warn -8066\n#endif\n\n/* provide prototypes for these when building zlib without LFS */\n#if !defined(_WIN32) && \\\n    (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0)\n    ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));\n    ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));\n#endif\n\n        /* common defaults */\n\n#ifndef OS_CODE\n#  define OS_CODE  0x03  /* assume Unix */\n#endif\n\n#ifndef F_OPEN\n#  define F_OPEN(name, mode) FXSYS_fopen((name), (mode))\n#endif\n\n         /* functions */\n\n#if defined(pyr) || defined(Z_SOLO)\n#  define NO_MEMCPY\n#endif\n#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__)\n /* Use our own functions for small and medium model with MSC <= 5.0.\n  * You may have to use the same strategy for Borland C (untested).\n  * The __SC__ check is for Symantec.\n  */\n#  define NO_MEMCPY\n#endif\n#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY)\n#  define HAVE_MEMCPY\n#endif\n#ifdef HAVE_MEMCPY\n#  ifdef SMALL_MEDIUM /* MSDOS small or medium model */\n#    define zmemcpy _fmemcpy\n#    define zmemcmp _fmemcmp\n#    define zmemzero(dest, len) _fmemset(dest, 0, len)\n#  else\n#    define zmemcpy FXSYS_memcpy32\n#    define zmemcmp FXSYS_memcmp32\n#    define zmemzero(dest, len) FXSYS_memset32(dest, 0, len)\n#  endif\n#else\n   void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len));\n   int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len));\n   void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len));\n#endif\n\n/* Diagnostic functions */\n#ifdef DEBUG\n#  include <stdio.h>\n   extern int ZLIB_INTERNAL z_verbose;\n   extern void ZLIB_INTERNAL z_error OF((char *m));\n#  define Assert(cond,msg) {if(!(cond)) z_error(msg);}\n#  define Trace(x) {if (z_verbose>=0) FXSYS_fprintf x ;}\n#  define Tracev(x) {if (z_verbose>0) FXSYS_fprintf x ;}\n#  define Tracevv(x) {if (z_verbose>1) FXSYS_fprintf x ;}\n#  define Tracec(c,x) {if (z_verbose>0 && (c)) FXSYS_fprintf x ;}\n#  define Tracecv(c,x) {if (z_verbose>1 && (c)) FXSYS_fprintf x ;}\n#else\n#  define Assert(cond,msg)\n#  define Trace(x)\n#  define Tracev(x)\n#  define Tracevv(x)\n#  define Tracec(c,x)\n#  define Tracecv(c,x)\n#endif\n\n#ifndef Z_SOLO\n   voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items,\n                                    unsigned size));\n   void ZLIB_INTERNAL zcfree  OF((voidpf opaque, voidpf ptr));\n#endif\n\n#define ZALLOC(strm, items, size) \\\n           (*((strm)->zalloc))((strm)->opaque, (items), (size))\n#define ZFREE(strm, addr)  (*((strm)->zfree))((strm)->opaque, (voidpf)(addr))\n#define TRY_FREE(s, p) {if (p) ZFREE(s, p);}\n\n/* Reverse the bytes in a 32-bit value */\n#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \\\n                    (((q) & 0xff00) << 8) + (((q) & 0xff) << 24))\n\n#endif /* ZUTIL_H */\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_ArithDecoder.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JBIG2_ARITHMETIC_DECODER_H_\n#define _JBIG2_ARITHMETIC_DECODER_H_\n#include \"JBig2_Define.h\"\n#include \"JBig2_BitStream.h\"\n#include \"JBig2_ArithQe.h\"\ntypedef struct {\n    unsigned int MPS;\n    unsigned int I;\n} JBig2ArithCtx;\nclass CJBig2_ArithDecoder : public CJBig2_Object\n{\npublic:\n\n    CJBig2_ArithDecoder(CJBig2_BitStream *pStream);\n\n    ~CJBig2_ArithDecoder();\n\n    int DECODE(JBig2ArithCtx *pCX);\nprivate:\n\n    void INITDEC();\n\n    void BYTEIN();\n    unsigned char B;\n    unsigned int C;\n    unsigned int A;\n    unsigned int CT;\n    CJBig2_BitStream *m_pStream;\n};\ninline CJBig2_ArithDecoder::CJBig2_ArithDecoder(CJBig2_BitStream *pStream)\n{\n    m_pStream = pStream;\n    INITDEC();\n}\ninline CJBig2_ArithDecoder::~CJBig2_ArithDecoder()\n{\n}\ninline void CJBig2_ArithDecoder::INITDEC()\n{\n    B = m_pStream->getCurByte_arith();\n    C = (B ^ 0xff) << 16;;\n    BYTEIN();\n    C = C << 7;\n    CT = CT - 7;\n    A = 0x8000;\n}\ninline void CJBig2_ArithDecoder::BYTEIN()\n{\n    unsigned char B1;\n    if(B == 0xff) {\n        B1 = m_pStream->getNextByte_arith();\n        if(B1 > 0x8f) {\n            CT = 8;\n        } else {\n            m_pStream->incByteIdx();\n            B = B1;\n            C = C + 0xfe00 - (B << 9);\n            CT = 7;\n        }\n    } else {\n        m_pStream->incByteIdx();\n        B = m_pStream->getCurByte_arith();\n        C = C + 0xff00 - (B << 8);\n        CT = 8;\n    }\n}\ninline int CJBig2_ArithDecoder::DECODE(JBig2ArithCtx *pCX)\n{\n    int D;\n    const JBig2ArithQe * qe = &QeTable[pCX->I];\n    A = A - qe->Qe;\n    if((C >> 16) < A) {\n        if(A & 0x8000) {\n            D = pCX->MPS;\n        } else {\n            if(A < qe->Qe) {\n                D = 1 - pCX->MPS;\n                if(qe->nSwitch == 1) {\n                    pCX->MPS = 1 - pCX->MPS;\n                }\n                pCX->I = qe->NLPS;\n            } else {\n                D = pCX->MPS;\n                pCX->I = qe->NMPS;\n            }\n            do {\n                if (CT == 0) {\n                    BYTEIN();\n                }\n                A <<= 1;\n                C <<= 1;\n                CT--;\n            } while ((A & 0x8000) == 0);\n        }\n    } else {\n        C -= A << 16;\n        if(A < qe->Qe) {\n            A = qe->Qe;\n            D = pCX->MPS;\n            pCX->I = qe->NMPS;\n        } else {\n            A = qe->Qe;\n            D = 1 - pCX->MPS;\n            if(qe->nSwitch == 1) {\n                pCX->MPS = 1 - pCX->MPS;\n            }\n            pCX->I = qe->NLPS;\n        }\n        do {\n            if (CT == 0) {\n                BYTEIN();\n            }\n            A <<= 1;\n            C <<= 1;\n            CT--;\n        } while ((A & 0x8000) == 0);\n    }\n    return D;\n}\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"JBig2_ArithIntDecoder.h\"\nCJBig2_ArithIntDecoder::CJBig2_ArithIntDecoder()\n{\n    IAx = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), 512);\n    JBIG2_memset(IAx, 0, sizeof(JBig2ArithCtx) * 512);\n}\nCJBig2_ArithIntDecoder::~CJBig2_ArithIntDecoder()\n{\n    m_pModule->JBig2_Free(IAx);\n}\nint CJBig2_ArithIntDecoder::decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult)\n{\n    int PREV, V;\n    int S, D;\n    int nNeedBits, nTemp, i;\n    PREV = 1;\n    S = pArithDecoder->DECODE(IAx + PREV);\n    PREV = (PREV << 1) | S;\n    D = pArithDecoder->DECODE(IAx + PREV);\n    PREV = (PREV << 1) | D;\n    if(D) {\n        D = pArithDecoder->DECODE(IAx + PREV);\n        PREV = (PREV << 1) | D;\n        if(D) {\n            D = pArithDecoder->DECODE(IAx + PREV);\n            PREV = (PREV << 1) | D;\n            if(D) {\n                D = pArithDecoder->DECODE(IAx + PREV);\n                PREV = (PREV << 1) | D;\n                if(D) {\n                    D = pArithDecoder->DECODE(IAx + PREV);\n                    PREV = (PREV << 1) | D;\n                    if(D) {\n                        nNeedBits = 32;\n                        V = 4436;\n                    } else {\n                        nNeedBits = 12;\n                        V = 340;\n                    }\n                } else {\n                    nNeedBits = 8;\n                    V = 84;\n                }\n            } else {\n                nNeedBits = 6;\n                V = 20;\n            }\n        } else {\n            nNeedBits = 4;\n            V = 4;\n        }\n    } else {\n        nNeedBits = 2;\n        V = 0;\n    }\n    nTemp = 0;\n    for(i = 0; i < nNeedBits; i++) {\n        D = pArithDecoder->DECODE(IAx + PREV);\n        if(PREV < 256) {\n            PREV = (PREV << 1) | D;\n        } else {\n            PREV = (((PREV << 1) | D) & 511) | 256;\n        }\n        nTemp = (nTemp << 1) | D;\n    }\n    V += nTemp;\n    if(S == 1 && V > 0) {\n        V = -V;\n    }\n    *nResult = V;\n    if(S == 1 && V == 0) {\n        return JBIG2_OOB;\n    }\n    return 0;\n}\nCJBig2_ArithIaidDecoder::CJBig2_ArithIaidDecoder(unsigned char SBSYMCODELENA)\n{\n    SBSYMCODELEN = SBSYMCODELENA;\n    IAID = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), (1 << SBSYMCODELEN));\n    JBIG2_memset(IAID, 0, sizeof(JBig2ArithCtx) * (int)(1 << SBSYMCODELEN));\n}\nCJBig2_ArithIaidDecoder::~CJBig2_ArithIaidDecoder()\n{\n    m_pModule->JBig2_Free(IAID);\n}\nint CJBig2_ArithIaidDecoder::decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult)\n{\n    int PREV;\n    int D;\n    int i;\n    PREV = 1;\n    for(i = 0; i < SBSYMCODELEN; i++) {\n        D = pArithDecoder->DECODE(IAID + PREV);\n        PREV = (PREV << 1) | D;\n    }\n    PREV = PREV - (1 << SBSYMCODELEN);\n    *nResult = PREV;\n    return 0;\n}\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JBIG2_ARITH_INT_DECODER_H_\n#define _JBIG2_ARITH_INT_DECODER_H_\n#include \"JBig2_Module.h\"\n#include \"JBig2_ArithDecoder.h\"\nclass CJBig2_ArithIntDecoder : public CJBig2_Object\n{\npublic:\n\n    CJBig2_ArithIntDecoder();\n\n    ~CJBig2_ArithIntDecoder();\n\n    int decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult);\nprivate:\n\n    JBig2ArithCtx *IAx;\n};\nclass CJBig2_ArithIaidDecoder : public CJBig2_Object\n{\npublic:\n\n    CJBig2_ArithIaidDecoder(unsigned char SBSYMCODELENA);\n\n    ~CJBig2_ArithIaidDecoder();\n\n    int decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult);\nprivate:\n\n    JBig2ArithCtx *IAID;\n\n    unsigned char SBSYMCODELEN;\n};\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_ArithQe.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JBIG2_ARITH_QE_H_\n#define _JBIG2_ARITH_QE_H_\ntypedef struct {\n    unsigned int Qe;\n    unsigned int NMPS;\n    unsigned int NLPS;\n    unsigned int nSwitch;\n} JBig2ArithQe;\nconst JBig2ArithQe QeTable[] = {\n    { 0x5601,  1,  1, 1 },\n    { 0x3401,  2,  6, 0 },\n    { 0x1801,  3,  9, 0 },\n    { 0x0AC1,  4, 12, 0 },\n    { 0x0521,  5, 29, 0 },\n    { 0x0221, 38, 33, 0 },\n    { 0x5601,  7,  6, 1 },\n    { 0x5401,  8, 14, 0 },\n    { 0x4801,  9, 14, 0 },\n    { 0x3801, 10, 14, 0 },\n    { 0x3001, 11, 17, 0 },\n    { 0x2401, 12, 18, 0 },\n    { 0x1C01, 13, 20, 0 },\n    { 0x1601, 29, 21, 0 },\n    { 0x5601, 15, 14, 1 },\n    { 0x5401, 16, 14, 0 },\n    { 0x5101, 17, 15, 0 },\n    { 0x4801, 18, 16, 0 },\n    { 0x3801, 19, 17, 0 },\n    { 0x3401, 20, 18, 0 },\n    { 0x3001, 21, 19, 0 },\n    { 0x2801, 22, 19, 0 },\n    { 0x2401, 23, 20, 0 },\n    { 0x2201, 24, 21, 0 },\n    { 0x1C01, 25, 22, 0 },\n    { 0x1801, 26, 23, 0 },\n    { 0x1601, 27, 24, 0 },\n    { 0x1401, 28, 25, 0 },\n    { 0x1201, 29, 26, 0 },\n    { 0x1101, 30, 27, 0 },\n    { 0x0AC1, 31, 28, 0 },\n    { 0x09C1, 32, 29, 0 },\n    { 0x08A1, 33, 30, 0 },\n    { 0x0521, 34, 31, 0 },\n    { 0x0441, 35, 32, 0 },\n    { 0x02A1, 36, 33, 0 },\n    { 0x0221, 37, 34, 0 },\n    { 0x0141, 38, 35, 0 },\n    { 0x0111, 39, 36, 0 },\n    { 0x0085, 40, 37, 0 },\n    { 0x0049, 41, 38, 0 },\n    { 0x0025, 42, 39, 0 },\n    { 0x0015, 43, 40, 0 },\n    { 0x0009, 44, 41, 0 },\n    { 0x0005, 45, 42, 0 },\n    { 0x0001, 45, 43, 0 },\n    { 0x5601, 46, 46, 0 }\n};\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_BitStream.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JBIG2_BIT_STREAM_H_\n#define _JBIG2_BIT_STREAM_H_\n#include \"JBig2_Define.h\"\nclass CJBig2_BitStream : public CJBig2_Object\n{\npublic:\n\n    CJBig2_BitStream(FX_BYTE *pBuffer, FX_DWORD dwLength);\n\n    CJBig2_BitStream(CJBig2_BitStream &bs);\n\n    ~CJBig2_BitStream();\n\n    FX_INT32 readNBits(FX_DWORD nBits, FX_DWORD *dwResult);\n\n    FX_INT32 readNBits(FX_DWORD nBits, FX_INT32 *nResult);\n\n    FX_INT32 read1Bit(FX_DWORD *dwResult);\n\n    FX_INT32 read1Bit(FX_BOOL  *bResult);\n\n    FX_INT32 read1Byte(FX_BYTE *cResult);\n\n    FX_INT32 readInteger(FX_DWORD *dwResult);\n\n    FX_INT32 readShortInteger(FX_WORD *wResult);\n\n    void alignByte();\n\n    void align4Byte();\n\n    FX_BYTE getAt(FX_DWORD dwOffset);\n\n    FX_BYTE getCurByte();\n\n    FX_BYTE getNextByte();\n\n    FX_INT32 incByteIdx();\n\n    FX_BYTE getCurByte_arith();\n\n    FX_BYTE getNextByte_arith();\n\n    FX_DWORD getOffset();\n\n    void setOffset(FX_DWORD dwOffset);\n\n    FX_DWORD getBitPos();\n\n    void setBitPos(FX_DWORD dwBitPos);\n\n    FX_BYTE *getBuf();\n\n    FX_DWORD getLength()\n    {\n        return m_dwLength;\n    }\n\n    FX_BYTE *getPointer();\n\n    void offset(FX_DWORD dwOffset);\n\n    FX_DWORD getByteLeft();\nprivate:\n\n    FX_BYTE *m_pBuf;\n\n    FX_DWORD m_dwLength;\n\n    FX_DWORD m_dwByteIdx;\n\n    FX_DWORD m_dwBitIdx;\n};\ninline CJBig2_BitStream::CJBig2_BitStream(FX_BYTE *pBuffer, FX_DWORD dwLength)\n{\n    m_pBuf = pBuffer;\n    m_dwLength = dwLength;\n    m_dwByteIdx = 0;\n    m_dwBitIdx  = 0;\n    if (m_dwLength > 256 * 1024 * 1024) {\n        m_dwLength = 0;\n        m_pBuf = NULL;\n    }\n}\ninline CJBig2_BitStream::CJBig2_BitStream(CJBig2_BitStream &bs)\n{\n    m_pBuf = bs.m_pBuf;\n    m_dwLength = bs.m_dwLength;\n    m_dwByteIdx = bs.m_dwByteIdx;\n    m_dwBitIdx = bs.m_dwBitIdx;\n}\ninline CJBig2_BitStream::~CJBig2_BitStream()\n{\n}\ninline FX_INT32 CJBig2_BitStream::readNBits(FX_DWORD dwBits, FX_DWORD *dwResult)\n{\n    FX_DWORD dwTemp = (m_dwByteIdx << 3) + m_dwBitIdx;\n    if(dwTemp <= (m_dwLength << 3)) {\n        *dwResult = 0;\n        if(dwTemp + dwBits <= (m_dwLength << 3)) {\n            dwTemp = dwBits;\n        } else {\n            dwTemp = (m_dwLength << 3) - dwTemp;\n        }\n        while(dwTemp > 0) {\n            *dwResult = (*dwResult << 1) | ((m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01);\n            if(m_dwBitIdx == 7) {\n                m_dwByteIdx ++;\n                m_dwBitIdx = 0;\n            } else {\n                m_dwBitIdx ++;\n            }\n            dwTemp --;\n        }\n        return 0;\n    } else {\n        return -1;\n    }\n}\ninline FX_INT32 CJBig2_BitStream::readNBits(FX_DWORD dwBits, FX_INT32 *nResult)\n{\n    FX_DWORD dwTemp = (m_dwByteIdx << 3) + m_dwBitIdx;\n    if(dwTemp <= (m_dwLength << 3)) {\n        *nResult = 0;\n        if(dwTemp + dwBits <= (m_dwLength << 3)) {\n            dwTemp = dwBits;\n        } else {\n            dwTemp = (m_dwLength << 3) - dwTemp;\n        }\n        while(dwTemp > 0) {\n            *nResult = (*nResult << 1) | ((m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01);\n            if(m_dwBitIdx == 7) {\n                m_dwByteIdx ++;\n                m_dwBitIdx = 0;\n            } else {\n                m_dwBitIdx ++;\n            }\n            dwTemp --;\n        }\n        return 0;\n    } else {\n        return -1;\n    }\n}\n\ninline FX_INT32 CJBig2_BitStream::read1Bit(FX_DWORD *dwResult)\n{\n    if(m_dwByteIdx < m_dwLength) {\n        *dwResult = (m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01;\n        if(m_dwBitIdx == 7) {\n            m_dwByteIdx ++;\n            m_dwBitIdx = 0;\n        } else {\n            m_dwBitIdx ++;\n        }\n        return 0;\n    } else {\n        return -1;\n    }\n}\n\ninline FX_INT32 CJBig2_BitStream::read1Bit(FX_BOOL *bResult)\n{\n    if(m_dwByteIdx < m_dwLength) {\n        *bResult = (m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01;\n        if(m_dwBitIdx == 7) {\n            m_dwByteIdx ++;\n            m_dwBitIdx = 0;\n        } else {\n            m_dwBitIdx ++;\n        }\n        return 0;\n    } else {\n        return -1;\n    }\n}\ninline FX_INT32 CJBig2_BitStream::read1Byte(FX_BYTE *cResult)\n{\n    if(m_dwByteIdx < m_dwLength) {\n        *cResult = m_pBuf[m_dwByteIdx];\n        m_dwByteIdx ++;\n        return 0;\n    } else {\n        return -1;\n    }\n}\n\ninline FX_INT32 CJBig2_BitStream::readInteger(FX_DWORD *dwResult)\n{\n    if(m_dwByteIdx + 3 < m_dwLength) {\n        *dwResult = (m_pBuf[m_dwByteIdx] << 24) | (m_pBuf[m_dwByteIdx + 1] << 16)\n                    | (m_pBuf[m_dwByteIdx + 2] << 8) | m_pBuf[m_dwByteIdx + 3];\n        m_dwByteIdx += 4;\n        return 0;\n    } else {\n        return -1;\n    }\n}\n\ninline FX_INT32 CJBig2_BitStream::readShortInteger(FX_WORD *dwResult)\n{\n    if(m_dwByteIdx + 1 < m_dwLength) {\n        *dwResult = (m_pBuf[m_dwByteIdx] << 8) | m_pBuf[m_dwByteIdx + 1];\n        m_dwByteIdx += 2;\n        return 0;\n    } else {\n        return -1;\n    }\n}\ninline void CJBig2_BitStream::alignByte()\n{\n    if(m_dwBitIdx != 0) {\n        m_dwByteIdx ++;\n        m_dwBitIdx = 0;\n    }\n}\ninline void CJBig2_BitStream::align4Byte()\n{\n    if(m_dwBitIdx != 0) {\n        m_dwByteIdx ++;\n        m_dwBitIdx = 0;\n    }\n    m_dwByteIdx = (m_dwByteIdx + 3) & -4;\n}\ninline FX_BYTE CJBig2_BitStream::getAt(FX_DWORD dwOffset)\n{\n    if(dwOffset < m_dwLength) {\n        return m_pBuf[dwOffset];\n    } else {\n        return 0;\n    }\n}\ninline FX_BYTE CJBig2_BitStream::getCurByte()\n{\n    if(m_dwByteIdx < m_dwLength) {\n        return m_pBuf[m_dwByteIdx];\n    } else {\n        return 0;\n    }\n}\ninline FX_BYTE CJBig2_BitStream::getNextByte()\n{\n    if(m_dwByteIdx + 1 < m_dwLength) {\n        return m_pBuf[m_dwByteIdx + 1];\n    } else {\n        return 0;\n    }\n}\ninline FX_INT32 CJBig2_BitStream::incByteIdx()\n{\n    if(m_dwByteIdx < m_dwLength) {\n        m_dwByteIdx ++;\n        return 0;\n    } else {\n        return -1;\n    }\n}\ninline FX_BYTE CJBig2_BitStream::getCurByte_arith()\n{\n    if(m_dwByteIdx < m_dwLength) {\n        return m_pBuf[m_dwByteIdx];\n    } else {\n        return 0xff;\n    }\n}\ninline FX_BYTE CJBig2_BitStream::getNextByte_arith()\n{\n    if(m_dwByteIdx + 1 < m_dwLength) {\n        return m_pBuf[m_dwByteIdx + 1];\n    } else {\n        return 0xff;\n    }\n}\ninline FX_DWORD CJBig2_BitStream::getOffset()\n{\n    return m_dwByteIdx;\n}\ninline void CJBig2_BitStream::setOffset(FX_DWORD dwOffset)\n{\n    if (dwOffset > m_dwLength) {\n        dwOffset = m_dwLength;\n    }\n    m_dwByteIdx = dwOffset;\n}\ninline FX_DWORD CJBig2_BitStream::getBitPos()\n{\n    return (m_dwByteIdx << 3) + m_dwBitIdx;\n}\ninline void CJBig2_BitStream::setBitPos(FX_DWORD dwBitPos)\n{\n    m_dwByteIdx = dwBitPos >> 3;\n    m_dwBitIdx = dwBitPos & 7;\n}\ninline FX_BYTE *CJBig2_BitStream::getBuf()\n{\n    return m_pBuf;\n}\ninline FX_BYTE *CJBig2_BitStream::getPointer()\n{\n    return m_pBuf + m_dwByteIdx;\n}\ninline void CJBig2_BitStream::offset(FX_DWORD dwOffset)\n{\n    m_dwByteIdx += dwOffset;\n}\ninline FX_DWORD CJBig2_BitStream::getByteLeft()\n{\n    return m_dwLength - m_dwByteIdx;\n}\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_Context.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"JBig2_Context.h\"\nvoid OutputBitmap(CJBig2_Image* pImage)\n{\n    if(!pImage) {\n        return;\n    }\n}\nCJBig2_Context *CJBig2_Context::CreateContext(CJBig2_Module *pModule, FX_BYTE *pGlobalData, FX_DWORD dwGlobalLength,\n        FX_BYTE *pData, FX_DWORD dwLength, FX_INT32 nStreamType, IFX_Pause* pPause)\n{\n    return new(pModule) CJBig2_Context(pGlobalData, dwGlobalLength, pData, dwLength, nStreamType, pPause);\n}\nvoid CJBig2_Context::DestroyContext(CJBig2_Context *pContext)\n{\n    if(pContext) {\n        delete pContext;\n    }\n}\nCJBig2_Context::CJBig2_Context(FX_BYTE *pGlobalData, FX_DWORD dwGlobalLength,\n                               FX_BYTE *pData, FX_DWORD dwLength, FX_INT32 nStreamType, IFX_Pause* pPause)\n{\n    if(pGlobalData && (dwGlobalLength > 0)) {\n        JBIG2_ALLOC(m_pGlobalContext, CJBig2_Context(NULL, 0, pGlobalData, dwGlobalLength,\n                    JBIG2_EMBED_STREAM, pPause));\n    } else {\n        m_pGlobalContext = NULL;\n    }\n    JBIG2_ALLOC(m_pStream, CJBig2_BitStream(pData, dwLength));\n    m_nStreamType = nStreamType;\n    m_nState = JBIG2_OUT_OF_PAGE;\n    JBIG2_ALLOC(m_pSegmentList, CJBig2_List<CJBig2_Segment>);\n    JBIG2_ALLOC(m_pPageInfoList, CJBig2_List<JBig2PageInfo>(1));\n    m_pPage = NULL;\n    m_bBufSpecified = FALSE;\n    m_pPause = pPause;\n    m_nSegmentDecoded = 0;\n    m_PauseStep = 10;\n    m_pArithDecoder = NULL;\n    m_pGRD = NULL;\n    m_gbContext = NULL;\n    m_pSegment = NULL;\n    m_dwOffset = 0;\n    m_ProcessiveStatus = FXCODEC_STATUS_FRAME_READY;\n}\nCJBig2_Context::~CJBig2_Context()\n{\n    if(m_pArithDecoder) {\n        delete m_pArithDecoder;\n    }\n    m_pArithDecoder = NULL;\n    if(m_pGRD) {\n        delete m_pGRD;\n    }\n    m_pGRD = NULL;\n    if(m_gbContext) {\n        m_pModule->JBig2_Free(m_gbContext);\n    }\n    m_gbContext = NULL;\n    if(m_pGlobalContext) {\n        delete m_pGlobalContext;\n    }\n    m_pGlobalContext = NULL;\n    if(m_pPageInfoList) {\n        delete m_pPageInfoList;\n    }\n    m_pPageInfoList = NULL;\n    if(m_bBufSpecified && m_pPage) {\n        delete m_pPage;\n    }\n    m_pPage = NULL;\n    if(m_pStream) {\n        delete m_pStream;\n    }\n    m_pStream = NULL;\n    if(m_pSegmentList) {\n        delete m_pSegmentList;\n    }\n    m_pSegmentList = NULL;\n}\nFX_INT32 CJBig2_Context::decodeFile(IFX_Pause* pPause)\n{\n    FX_BYTE cFlags;\n    FX_DWORD dwTemp;\n    const FX_BYTE fileID[] = {0x97, 0x4A, 0x42, 0x32, 0x0D, 0x0A, 0x1A, 0x0A};\n    FX_INT32 nRet;\n    if(m_pStream->getByteLeft() < 8) {\n        m_pModule->JBig2_Error(\"file header too short.\");\n        nRet = JBIG2_ERROR_TOO_SHORT;\n        goto failed;\n    }\n    if(JBIG2_memcmp(m_pStream->getPointer(), fileID, 8) != 0) {\n        m_pModule->JBig2_Error(\"not jbig2 file\");\n        nRet = JBIG2_ERROR_FILE_FORMAT;\n        goto failed;\n    }\n    m_pStream->offset(8);\n    if(m_pStream->read1Byte(&cFlags) != 0) {\n        m_pModule->JBig2_Error(\"file header too short.\");\n        nRet = JBIG2_ERROR_TOO_SHORT;\n        goto failed;\n    }\n    if(!(cFlags & 0x02)) {\n        if(m_pStream->readInteger(&dwTemp) != 0) {\n            m_pModule->JBig2_Error(\"file header too short.\");\n            nRet = JBIG2_ERROR_TOO_SHORT;\n            goto failed;\n        }\n        if(dwTemp > 0) {\n            delete m_pPageInfoList;\n            JBIG2_ALLOC(m_pPageInfoList, CJBig2_List<JBig2PageInfo>(dwTemp));\n        }\n    }\n    if(cFlags & 0x01) {\n        m_nStreamType = JBIG2_SQUENTIAL_STREAM;\n        return decode_SquentialOrgnazation(pPause);\n    } else {\n        m_nStreamType = JBIG2_RANDOM_STREAM;\n        return decode_RandomOrgnazation_FirstPage(pPause);\n    }\nfailed:\n    return nRet;\n}\nFX_INT32 CJBig2_Context::decode_SquentialOrgnazation(IFX_Pause* pPause)\n{\n    FX_INT32 nRet;\n    if(m_pStream->getByteLeft() > 0) {\n        while(m_pStream->getByteLeft() >= JBIG2_MIN_SEGMENT_SIZE) {\n            if(m_pSegment == NULL) {\n                JBIG2_ALLOC(m_pSegment, CJBig2_Segment());\n                nRet = parseSegmentHeader(m_pSegment);\n                if(nRet != JBIG2_SUCCESS) {\n                    delete m_pSegment;\n                    m_pSegment = NULL;\n                    return nRet;\n                }\n                m_dwOffset = m_pStream->getOffset();\n            }\n            nRet = parseSegmentData(m_pSegment, pPause);\n            if(m_ProcessiveStatus  == FXCODEC_STATUS_DECODE_TOBECONTINUE) {\n                m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;\n                m_PauseStep = 2;\n                return JBIG2_SUCCESS;\n            }\n            if((nRet == JBIG2_END_OF_PAGE) || (nRet == JBIG2_END_OF_FILE)) {\n                delete m_pSegment;\n                m_pSegment = NULL;\n                break;\n            } else if(nRet != JBIG2_SUCCESS) {\n                delete m_pSegment;\n                m_pSegment = NULL;\n                return nRet;\n            }\n            m_pSegmentList->addItem(m_pSegment);\n            if(m_pSegment->m_dwData_length != 0xffffffff) {\n                m_dwOffset = m_dwOffset + m_pSegment->m_dwData_length;\n                m_pStream->setOffset(m_dwOffset);\n            } else {\n                m_pStream->offset(4);\n            }\n            OutputBitmap(m_pPage);\n            m_pSegment = NULL;\n            if(m_pStream->getByteLeft() > 0 && m_pPage && pPause && pPause->NeedToPauseNow()) {\n                m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;\n                m_PauseStep = 2;\n                return JBIG2_SUCCESS;\n            }\n        }\n    } else {\n        return JBIG2_END_OF_FILE;\n    }\n    return JBIG2_SUCCESS;\n}\nFX_INT32 CJBig2_Context::decode_EmbedOrgnazation(IFX_Pause* pPause)\n{\n    return decode_SquentialOrgnazation(pPause);\n}\nFX_INT32 CJBig2_Context::decode_RandomOrgnazation_FirstPage(IFX_Pause* pPause)\n{\n    CJBig2_Segment *pSegment;\n    FX_INT32 nRet;\n    while(m_pStream->getByteLeft() > JBIG2_MIN_SEGMENT_SIZE) {\n        JBIG2_ALLOC(pSegment, CJBig2_Segment());\n        nRet = parseSegmentHeader(pSegment);\n        if(nRet != JBIG2_SUCCESS) {\n            delete pSegment;\n            return nRet;\n        } else if(pSegment->m_cFlags.s.type == 51) {\n            delete pSegment;\n            break;\n        }\n        m_pSegmentList->addItem(pSegment);\n        if(pPause && m_pPause && pPause->NeedToPauseNow()) {\n            m_PauseStep = 3;\n            m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;\n            return JBIG2_SUCCESS;\n        }\n    }\n    m_nSegmentDecoded = 0;\n    return decode_RandomOrgnazation(pPause);\n}\nFX_INT32 CJBig2_Context::decode_RandomOrgnazation(IFX_Pause* pPause)\n{\n    FX_INT32 nRet;\n    for(; m_nSegmentDecoded < m_pSegmentList->getLength(); m_nSegmentDecoded++) {\n        nRet = parseSegmentData(m_pSegmentList->getAt(m_nSegmentDecoded), pPause);\n        if((nRet == JBIG2_END_OF_PAGE) || (nRet == JBIG2_END_OF_FILE)) {\n            break;\n        } else if(nRet != JBIG2_SUCCESS) {\n            return nRet;\n        }\n        if(m_pPage && pPause && pPause->NeedToPauseNow()) {\n            m_PauseStep = 4;\n            m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;\n            return JBIG2_SUCCESS;\n        }\n    }\n    return JBIG2_SUCCESS;\n}\nFX_INT32 CJBig2_Context::getFirstPage(FX_BYTE *pBuf, FX_INT32 width, FX_INT32 height, FX_INT32 stride, IFX_Pause* pPause)\n{\n    FX_INT32 nRet = 0;\n    if(m_pGlobalContext) {\n        nRet = m_pGlobalContext->decode_EmbedOrgnazation(pPause);\n        if(nRet != JBIG2_SUCCESS) {\n            m_ProcessiveStatus = FXCODEC_STATUS_ERROR;\n            return nRet;\n        }\n    }\n    m_bFirstPage = TRUE;\n    m_PauseStep = 0;\n    if(m_pPage) {\n        delete m_pPage;\n    }\n    JBIG2_ALLOC(m_pPage, CJBig2_Image(width, height, stride, pBuf));\n    m_bBufSpecified = TRUE;\n    if(m_pPage && pPause && pPause->NeedToPauseNow()) {\n        m_PauseStep = 1;\n        m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;\n        return nRet;\n    }\n    int ret = Continue(pPause);\n    return ret;\n}\nFX_INT32 CJBig2_Context::Continue(IFX_Pause* pPause)\n{\n    m_ProcessiveStatus = FXCODEC_STATUS_DECODE_READY;\n    FX_INT32 nRet;\n    if(m_PauseStep <= 1) {\n        switch(m_nStreamType) {\n            case JBIG2_FILE_STREAM:\n                nRet = decodeFile(pPause);\n                break;\n            case JBIG2_SQUENTIAL_STREAM:\n                nRet = decode_SquentialOrgnazation(pPause);\n                break;\n            case JBIG2_RANDOM_STREAM:\n                if(m_bFirstPage) {\n                    nRet = decode_RandomOrgnazation_FirstPage(pPause);\n                } else {\n                    nRet = decode_RandomOrgnazation(pPause);\n                }\n                break;\n            case JBIG2_EMBED_STREAM:\n                nRet = decode_EmbedOrgnazation(pPause);\n                break;\n            default:\n                m_ProcessiveStatus = FXCODEC_STATUS_ERROR;\n                return JBIG2_ERROR_STREAM_TYPE;\n        }\n    } else if(m_PauseStep == 2) {\n        nRet = decode_SquentialOrgnazation(pPause);\n    } else if(m_PauseStep == 3) {\n        nRet = decode_RandomOrgnazation_FirstPage(pPause);\n    } else if(m_PauseStep == 4) {\n        nRet = decode_RandomOrgnazation(pPause);\n    } else if(m_PauseStep == 5) {\n        m_ProcessiveStatus = FXCODEC_STATUS_DECODE_FINISH;\n        return JBIG2_SUCCESS;\n    }\n    if(m_ProcessiveStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) {\n        return nRet;\n    }\n    m_PauseStep = 5;\n    if(!m_bBufSpecified && nRet == JBIG2_SUCCESS) {\n        m_ProcessiveStatus = FXCODEC_STATUS_DECODE_FINISH;\n        return JBIG2_SUCCESS;\n    }\n    if(nRet == JBIG2_SUCCESS) {\n        m_ProcessiveStatus = FXCODEC_STATUS_DECODE_FINISH;\n    } else {\n        m_ProcessiveStatus = FXCODEC_STATUS_ERROR;\n    }\n    return nRet;\n}\nFX_INT32 CJBig2_Context::getNextPage(FX_BYTE *pBuf, FX_INT32 width, FX_INT32 height, FX_INT32 stride, IFX_Pause* pPause)\n{\n    FX_INT32 nRet = JBIG2_ERROR_STREAM_TYPE;\n    m_bFirstPage = FALSE;\n    m_PauseStep = 0;\n    if(m_pPage) {\n        delete m_pPage;\n    }\n    JBIG2_ALLOC(m_pPage, CJBig2_Image(width, height, stride, pBuf));\n    m_bBufSpecified = TRUE;\n    if(m_pPage && pPause && pPause->NeedToPauseNow()) {\n        m_PauseStep = 1;\n        m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;\n        return nRet;\n    }\n    return Continue(pPause);\n    switch(m_nStreamType) {\n        case JBIG2_FILE_STREAM:\n            nRet = decodeFile(pPause);\n            break;\n        case JBIG2_SQUENTIAL_STREAM:\n            nRet = decode_SquentialOrgnazation(pPause);\n            break;\n        case JBIG2_RANDOM_STREAM:\n            nRet = decode_RandomOrgnazation(pPause);\n            break;\n        case JBIG2_EMBED_STREAM:\n            nRet = decode_EmbedOrgnazation(pPause);\n            break;\n        default:\n            return JBIG2_ERROR_STREAM_TYPE;\n    }\n    return nRet;\n}\nFX_INT32 CJBig2_Context::getFirstPage(CJBig2_Image **image, IFX_Pause* pPause)\n{\n    FX_INT32 nRet;\n    m_bFirstPage = TRUE;\n    m_PauseStep = 0;\n    if(m_pGlobalContext) {\n        nRet = m_pGlobalContext->decode_EmbedOrgnazation(pPause);\n        if(nRet != JBIG2_SUCCESS) {\n            return nRet;\n        }\n    }\n    m_bBufSpecified = FALSE;\n    return Continue(pPause);\n}\nFX_INT32 CJBig2_Context::getNextPage(CJBig2_Image **image, IFX_Pause* pPause)\n{\n    FX_INT32 nRet;\n    m_bBufSpecified = FALSE;\n    m_bFirstPage = FALSE;\n    m_PauseStep = 0;\n    switch(m_nStreamType) {\n        case JBIG2_FILE_STREAM:\n            nRet = decodeFile(pPause);\n            break;\n        case JBIG2_SQUENTIAL_STREAM:\n            nRet = decode_SquentialOrgnazation(pPause);\n            break;\n        case JBIG2_RANDOM_STREAM:\n            nRet = decode_RandomOrgnazation(pPause);\n            break;\n        case JBIG2_EMBED_STREAM:\n            nRet = decode_EmbedOrgnazation(pPause);\n            break;\n        default:\n            return JBIG2_ERROR_STREAM_TYPE;\n    }\n    if(nRet == JBIG2_SUCCESS) {\n        *image = m_pPage;\n        m_pPage = NULL;\n        return JBIG2_SUCCESS;\n    }\n    return nRet;\n}\nCJBig2_Segment *CJBig2_Context::findSegmentByNumber(FX_DWORD dwNumber)\n{\n    CJBig2_Segment *pSeg;\n    FX_INT32 i;\n    if(m_pGlobalContext) {\n        pSeg = m_pGlobalContext->findSegmentByNumber(dwNumber);\n        if(pSeg) {\n            return pSeg;\n        }\n    }\n    for(i = 0; i < m_pSegmentList->getLength(); i++) {\n        pSeg = m_pSegmentList->getAt(i);\n        if(pSeg->m_dwNumber == dwNumber) {\n            return pSeg;\n        }\n    }\n    return NULL;\n}\nCJBig2_Segment *CJBig2_Context::findReferredSegmentByTypeAndIndex(CJBig2_Segment *pSegment,\n        FX_BYTE cType, FX_INT32 nIndex)\n{\n    CJBig2_Segment *pSeg;\n    FX_INT32 i, count;\n    count = 0;\n    for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {\n        pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);\n        if(pSeg && pSeg->m_cFlags.s.type == cType) {\n            if(count == nIndex) {\n                return pSeg;\n            } else {\n                count ++;\n            }\n        }\n    }\n    return NULL;\n}\nFX_INT32 CJBig2_Context::parseSegmentHeader(CJBig2_Segment *pSegment)\n{\n    FX_BYTE  cSSize, cPSize;\n    FX_BYTE cTemp;\n    FX_WORD wTemp;\n    FX_DWORD dwTemp;\n    if((m_pStream->readInteger(&pSegment->m_dwNumber) != 0)\n            || (m_pStream->read1Byte(&pSegment->m_cFlags.c) != 0)) {\n        goto failed;\n    }\n    cTemp = m_pStream->getCurByte();\n    if((cTemp >> 5) == 7) {\n        if(m_pStream->readInteger((FX_DWORD*)&pSegment->m_nReferred_to_segment_count) != 0) {\n            goto failed;\n        }\n        pSegment->m_nReferred_to_segment_count &= 0x1fffffff;\n        if (pSegment->m_nReferred_to_segment_count > JBIG2_MAX_REFERRED_SEGMENT_COUNT) {\n            m_pModule->JBig2_Error(\"Too many referred segments.\");\n            return JBIG2_ERROR_LIMIT;\n        }\n        dwTemp = 5 + 4 + (pSegment->m_nReferred_to_segment_count + 1) / 8;\n    } else {\n        if(m_pStream->read1Byte(&cTemp) != 0) {\n            goto failed;\n        }\n        pSegment->m_nReferred_to_segment_count = cTemp >> 5;\n        dwTemp = 5 + 1;\n    }\n    cSSize = pSegment->m_dwNumber > 65536 ? 4 : pSegment->m_dwNumber > 256 ? 2 : 1;\n    cPSize = pSegment->m_cFlags.s.page_association_size ? 4 : 1;\n    if(pSegment->m_nReferred_to_segment_count) {\n        pSegment->m_pReferred_to_segment_numbers = (FX_DWORD*)m_pModule->JBig2_Malloc2(\n                    sizeof(FX_DWORD), pSegment->m_nReferred_to_segment_count);\n        for(FX_INT32 i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {\n            switch(cSSize) {\n                case 1:\n                    if(m_pStream->read1Byte(&cTemp) != 0) {\n                        goto failed;\n                    }\n                    pSegment->m_pReferred_to_segment_numbers[i] = cTemp;\n                    break;\n                case 2:\n                    if(m_pStream->readShortInteger(&wTemp) != 0) {\n                        goto failed;\n                    }\n                    pSegment->m_pReferred_to_segment_numbers[i] = wTemp;\n                    break;\n                case 4:\n                    if(m_pStream->readInteger(&dwTemp) != 0) {\n                        goto failed;\n                    }\n                    pSegment->m_pReferred_to_segment_numbers[i] = dwTemp;\n                    break;\n            }\n            if (pSegment->m_pReferred_to_segment_numbers[i] >= pSegment->m_dwNumber) {\n                m_pModule->JBig2_Error(\"The referred segment number is greater than this segment number.\");\n                goto failed;\n            }\n        }\n    }\n    if(cPSize == 1) {\n        if(m_pStream->read1Byte(&cTemp) != 0) {\n            goto failed;\n        }\n        pSegment->m_dwPage_association = cTemp;\n    } else {\n        if(m_pStream->readInteger(&pSegment->m_dwPage_association) != 0) {\n            goto failed;\n        }\n    }\n    if(m_pStream->readInteger(&pSegment->m_dwData_length) != 0) {\n        goto failed;\n    }\n    pSegment->m_pData = m_pStream->getPointer();\n    pSegment->m_State = JBIG2_SEGMENT_DATA_UNPARSED;\n    return JBIG2_SUCCESS;\nfailed:\n    m_pModule->JBig2_Error(\"header too short.\");\n    return JBIG2_ERROR_TOO_SHORT;\n}\nFX_INT32 CJBig2_Context::parseSegmentData(CJBig2_Segment *pSegment, IFX_Pause* pPause)\n{\n    FX_INT32 ret = ProcessiveParseSegmentData(pSegment, pPause);\n    while(m_ProcessiveStatus  == FXCODEC_STATUS_DECODE_TOBECONTINUE && m_pStream->getByteLeft() > 0) {\n        ret = ProcessiveParseSegmentData(pSegment, pPause);\n    }\n    return ret;\n}\nFX_INT32 CJBig2_Context::ProcessiveParseSegmentData(CJBig2_Segment *pSegment, IFX_Pause* pPause)\n{\n    switch(pSegment->m_cFlags.s.type) {\n        case 0:\n            return parseSymbolDict(pSegment, pPause);\n        case 4:\n        case 6:\n        case 7:\n            if(m_nState == JBIG2_OUT_OF_PAGE) {\n                goto failed2;\n            } else {\n                return parseTextRegion(pSegment);\n            }\n        case 16:\n            return parsePatternDict(pSegment, pPause);\n        case 20:\n        case 22:\n        case 23:\n            if(m_nState == JBIG2_OUT_OF_PAGE) {\n                goto failed2;\n            } else {\n                return parseHalftoneRegion(pSegment, pPause);\n            }\n        case 36:\n        case 38:\n        case 39:\n            if(m_nState == JBIG2_OUT_OF_PAGE) {\n                goto failed2;\n            } else {\n                return parseGenericRegion(pSegment, pPause);\n            }\n        case 40:\n        case 42:\n        case 43:\n            if(m_nState == JBIG2_OUT_OF_PAGE) {\n                goto failed2;\n            } else {\n                return parseGenericRefinementRegion(pSegment);\n            }\n        case 48: {\n                FX_WORD wTemp;\n                JBig2PageInfo *pPageInfo;\n                JBIG2_ALLOC(pPageInfo, JBig2PageInfo);\n                if((m_pStream->readInteger(&pPageInfo->m_dwWidth) != 0)\n                        || (m_pStream->readInteger(&pPageInfo->m_dwHeight) != 0)\n                        || (m_pStream->readInteger(&pPageInfo->m_dwResolutionX) != 0)\n                        || (m_pStream->readInteger(&pPageInfo->m_dwResolutionY) != 0)\n                        || (m_pStream->read1Byte(&pPageInfo->m_cFlags) != 0)\n                        || (m_pStream->readShortInteger(&wTemp) != 0)) {\n                    delete pPageInfo;\n                    goto failed1;\n                }\n                pPageInfo->m_bIsStriped = ((wTemp >> 15) & 1) ? 1 : 0;\n                pPageInfo->m_wMaxStripeSize = wTemp & 0x7fff;\n                if((pPageInfo->m_dwHeight == 0xffffffff) && (pPageInfo->m_bIsStriped != 1)) {\n                    m_pModule->JBig2_Warn(\"page height = 0xffffffff buf stripe field is 0\");\n                    pPageInfo->m_bIsStriped = 1;\n                }\n                if(!m_bBufSpecified) {\n                    if(m_pPage) {\n                        delete m_pPage;\n                    }\n                    if(pPageInfo->m_dwHeight == 0xffffffff) {\n                        JBIG2_ALLOC(m_pPage, CJBig2_Image(pPageInfo->m_dwWidth, pPageInfo->m_wMaxStripeSize));\n                    } else {\n                        JBIG2_ALLOC(m_pPage, CJBig2_Image(pPageInfo->m_dwWidth, pPageInfo->m_dwHeight));\n                    }\n                }\n                m_pPage->fill((pPageInfo->m_cFlags & 4) ? 1 : 0);\n                m_pPageInfoList->addItem(pPageInfo);\n                m_nState = JBIG2_IN_PAGE;\n            }\n            break;\n        case 49:\n            m_nState = JBIG2_OUT_OF_PAGE;\n            return JBIG2_END_OF_PAGE;\n            break;\n        case 50:\n            m_pStream->offset(pSegment->m_dwData_length);\n            break;\n        case 51:\n            return JBIG2_END_OF_FILE;\n        case 52:\n            m_pStream->offset(pSegment->m_dwData_length);\n            break;\n        case 53:\n            return parseTable(pSegment);\n        case 62:\n            m_pStream->offset(pSegment->m_dwData_length);\n            break;\n        default:\n            break;\n    }\n    return JBIG2_SUCCESS;\nfailed1:\n    m_pModule->JBig2_Error(\"segment data too short.\");\n    return JBIG2_ERROR_TOO_SHORT;\nfailed2:\n    m_pModule->JBig2_Error(\"segment syntax error.\");\n    return JBIG2_ERROR_FETAL;\n}\nFX_INT32 CJBig2_Context::parseSymbolDict(CJBig2_Segment *pSegment, IFX_Pause* pPause)\n{\n    FX_DWORD dwTemp;\n    FX_WORD wFlags;\n    FX_BYTE cSDHUFFDH, cSDHUFFDW, cSDHUFFBMSIZE, cSDHUFFAGGINST;\n    CJBig2_HuffmanTable *Table_B1 = NULL, *Table_B2 = NULL, *Table_B3 = NULL, *Table_B4 = NULL, *Table_B5 = NULL;\n    FX_INT32 i, nIndex, nRet;\n    CJBig2_Segment *pSeg = NULL, *pLRSeg = NULL;\n    FX_BOOL bUsed;\n    CJBig2_Image ** SDINSYMS = NULL;\n    CJBig2_SDDProc *pSymbolDictDecoder;\n    JBig2ArithCtx *gbContext = NULL, *grContext = NULL;\n    CJBig2_ArithDecoder *pArithDecoder;\n    JBIG2_ALLOC(pSymbolDictDecoder, CJBig2_SDDProc());\n    if(m_pStream->readShortInteger(&wFlags) != 0) {\n        m_pModule->JBig2_Error(\"symbol dictionary segment : data header too short.\");\n        nRet = JBIG2_ERROR_TOO_SHORT;\n        goto failed;\n    }\n    pSymbolDictDecoder->SDHUFF = wFlags & 0x0001;\n    pSymbolDictDecoder->SDREFAGG = (wFlags >> 1) & 0x0001;\n    pSymbolDictDecoder->SDTEMPLATE = (wFlags >> 10) & 0x0003;\n    pSymbolDictDecoder->SDRTEMPLATE = (wFlags >> 12) & 0x0003;\n    cSDHUFFDH = (wFlags >> 2) & 0x0003;\n    cSDHUFFDW = (wFlags >> 4) & 0x0003;\n    cSDHUFFBMSIZE = (wFlags >> 6) & 0x0001;\n    cSDHUFFAGGINST = (wFlags >> 7) & 0x0001;\n    if(pSymbolDictDecoder->SDHUFF == 0) {\n        if(pSymbolDictDecoder->SDTEMPLATE == 0) {\n            dwTemp = 8;\n        } else {\n            dwTemp = 2;\n        }\n        for(i = 0; i < (FX_INT32)dwTemp; i++) {\n            if(m_pStream->read1Byte((FX_BYTE*)&pSymbolDictDecoder->SDAT[i]) != 0) {\n                m_pModule->JBig2_Error(\"symbol dictionary segment : data header too short.\");\n                nRet = JBIG2_ERROR_TOO_SHORT;\n                goto failed;\n            }\n        }\n    }\n    if((pSymbolDictDecoder->SDREFAGG == 1) && (pSymbolDictDecoder->SDRTEMPLATE == 0)) {\n        for(i = 0; i < 4; i++) {\n            if(m_pStream->read1Byte((FX_BYTE*)&pSymbolDictDecoder->SDRAT[i]) != 0) {\n                m_pModule->JBig2_Error(\"symbol dictionary segment : data header too short.\");\n                nRet = JBIG2_ERROR_TOO_SHORT;\n                goto failed;\n            }\n        }\n    }\n    if((m_pStream->readInteger(&pSymbolDictDecoder->SDNUMEXSYMS) != 0)\n            || (m_pStream->readInteger(&pSymbolDictDecoder->SDNUMNEWSYMS) != 0)) {\n        m_pModule->JBig2_Error(\"symbol dictionary segment : data header too short.\");\n        nRet = JBIG2_ERROR_TOO_SHORT;\n        goto failed;\n    }\n    if (pSymbolDictDecoder->SDNUMEXSYMS > JBIG2_MAX_EXPORT_SYSMBOLS\n            || pSymbolDictDecoder->SDNUMNEWSYMS > JBIG2_MAX_NEW_SYSMBOLS) {\n        m_pModule->JBig2_Error(\"symbol dictionary segment : too many export/new symbols.\");\n        nRet = JBIG2_ERROR_LIMIT;\n        goto failed;\n    }\n    for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {\n        if(!findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i])) {\n            m_pModule->JBig2_Error(\"symbol dictionary segment : can't find refered to segments\");\n            nRet = JBIG2_ERROR_FETAL;\n            goto failed;\n        }\n    }\n    pSymbolDictDecoder->SDNUMINSYMS = 0;\n    for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {\n        pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);\n        if(pSeg->m_cFlags.s.type == 0) {\n            pSymbolDictDecoder->SDNUMINSYMS += pSeg->m_Result.sd->SDNUMEXSYMS;\n            pLRSeg = pSeg;\n        }\n    }\n    if(pSymbolDictDecoder->SDNUMINSYMS == 0) {\n        SDINSYMS = NULL;\n    } else {\n        SDINSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(\n                       sizeof(CJBig2_Image*), pSymbolDictDecoder->SDNUMINSYMS);\n        dwTemp = 0;\n        for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {\n            pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);\n            if(pSeg->m_cFlags.s.type == 0) {\n                JBIG2_memcpy(SDINSYMS + dwTemp, pSeg->m_Result.sd->SDEXSYMS,\n                             pSeg->m_Result.sd->SDNUMEXSYMS * sizeof(CJBig2_Image*));\n                dwTemp += pSeg->m_Result.sd->SDNUMEXSYMS;\n            }\n        }\n    }\n    pSymbolDictDecoder->SDINSYMS = SDINSYMS;\n    if(pSymbolDictDecoder->SDHUFF == 1) {\n        if((cSDHUFFDH == 2) || (cSDHUFFDW == 2)) {\n            m_pModule->JBig2_Error(\"symbol dictionary segment : SDHUFFDH=2 or SDHUFFDW=2 is not permitted.\");\n            nRet = JBIG2_ERROR_FETAL;\n            goto failed;\n        }\n        nIndex = 0;\n        if(cSDHUFFDH == 0) {\n            JBIG2_ALLOC(Table_B4, CJBig2_HuffmanTable(HuffmanTable_B4,\n                        sizeof(HuffmanTable_B4) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B4));\n            pSymbolDictDecoder->SDHUFFDH = Table_B4;\n        } else if(cSDHUFFDH == 1) {\n            JBIG2_ALLOC(Table_B5, CJBig2_HuffmanTable(HuffmanTable_B5,\n                        sizeof(HuffmanTable_B5) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B5));\n            pSymbolDictDecoder->SDHUFFDH = Table_B5;\n        } else {\n            pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);\n            if(!pSeg) {\n                m_pModule->JBig2_Error(\"symbol dictionary segment : SDHUFFDH can't find user supplied table.\");\n                nRet = JBIG2_ERROR_FETAL;\n                goto failed;\n            }\n            pSymbolDictDecoder->SDHUFFDH = pSeg->m_Result.ht;\n        }\n        if(cSDHUFFDW == 0) {\n            JBIG2_ALLOC(Table_B2, CJBig2_HuffmanTable(HuffmanTable_B2,\n                        sizeof(HuffmanTable_B2) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B2));\n            pSymbolDictDecoder->SDHUFFDW = Table_B2;\n        } else if(cSDHUFFDW == 1) {\n            JBIG2_ALLOC(Table_B3, CJBig2_HuffmanTable(HuffmanTable_B3,\n                        sizeof(HuffmanTable_B3) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B3));\n            pSymbolDictDecoder->SDHUFFDW = Table_B3;\n        } else {\n            pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);\n            if(!pSeg) {\n                m_pModule->JBig2_Error(\"symbol dictionary segment : SDHUFFDW can't find user supplied table.\");\n                nRet = JBIG2_ERROR_FETAL;\n                goto failed;\n            }\n            pSymbolDictDecoder->SDHUFFDW = pSeg->m_Result.ht;\n        }\n        if(cSDHUFFBMSIZE == 0) {\n            JBIG2_ALLOC(Table_B1, CJBig2_HuffmanTable(HuffmanTable_B1,\n                        sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));\n            pSymbolDictDecoder->SDHUFFBMSIZE = Table_B1;\n        } else {\n            pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);\n            if(!pSeg) {\n                m_pModule->JBig2_Error(\"symbol dictionary segment : SDHUFFBMSIZE can't find user supplied table.\");\n                nRet = JBIG2_ERROR_FETAL;\n                goto failed;\n            }\n            pSymbolDictDecoder->SDHUFFBMSIZE = pSeg->m_Result.ht;\n        }\n        if(pSymbolDictDecoder->SDREFAGG == 1) {\n            if(cSDHUFFAGGINST == 0) {\n                if(!Table_B1) {\n                    JBIG2_ALLOC(Table_B1, CJBig2_HuffmanTable(HuffmanTable_B1,\n                                sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));\n                }\n                pSymbolDictDecoder->SDHUFFAGGINST = Table_B1;\n            } else {\n                pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);\n                if(!pSeg) {\n                    m_pModule->JBig2_Error(\"symbol dictionary segment : SDHUFFAGGINST can't find user supplied table.\");\n                    nRet = JBIG2_ERROR_FETAL;\n                    goto failed;\n                }\n                pSymbolDictDecoder->SDHUFFAGGINST = pSeg->m_Result.ht;\n            }\n        }\n    }\n    if((wFlags & 0x0100) && pLRSeg && pLRSeg->m_Result.sd->m_bContextRetained) {\n        if (pSymbolDictDecoder->SDHUFF == 0) {\n            dwTemp = pSymbolDictDecoder->SDTEMPLATE == 0 ? 65536 : pSymbolDictDecoder->SDTEMPLATE == 1 ?\n                     8192 : 1024;\n            gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);\n            JBIG2_memcpy(gbContext, pLRSeg->m_Result.sd->m_gbContext, sizeof(JBig2ArithCtx)*dwTemp);\n        }\n        if (pSymbolDictDecoder->SDREFAGG == 1) {\n            dwTemp = pSymbolDictDecoder->SDRTEMPLATE ? 1 << 10 : 1 << 13;\n            grContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);\n            JBIG2_memcpy(grContext, pLRSeg->m_Result.sd->m_grContext, sizeof(JBig2ArithCtx)*dwTemp);\n        }\n    } else {\n        if (pSymbolDictDecoder->SDHUFF == 0) {\n            dwTemp = pSymbolDictDecoder->SDTEMPLATE == 0 ? 65536 : pSymbolDictDecoder->SDTEMPLATE == 1 ?\n                     8192 : 1024;\n            gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);\n            JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx)*dwTemp);\n        }\n        if (pSymbolDictDecoder->SDREFAGG == 1) {\n            dwTemp = pSymbolDictDecoder->SDRTEMPLATE ? 1 << 10 : 1 << 13;\n            grContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);\n            JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx)*dwTemp);\n        }\n    }\n    pSegment->m_nResultType = JBIG2_SYMBOL_DICT_POINTER;\n    if(pSymbolDictDecoder->SDHUFF == 0) {\n        JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream));\n        pSegment->m_Result.sd = pSymbolDictDecoder->decode_Arith(pArithDecoder, gbContext, grContext);\n        delete pArithDecoder;\n        if(pSegment->m_Result.sd == NULL) {\n            nRet = JBIG2_ERROR_FETAL;\n            goto failed;\n        }\n        m_pStream->alignByte();\n        m_pStream->offset(2);\n    } else {\n        pSegment->m_Result.sd = pSymbolDictDecoder->decode_Huffman(m_pStream, gbContext, grContext, pPause);\n        if(pSegment->m_Result.sd == NULL) {\n            nRet = JBIG2_ERROR_FETAL;\n            goto failed;\n        }\n        m_pStream->alignByte();\n    }\n    if(wFlags & 0x0200) {\n        pSegment->m_Result.sd->m_bContextRetained = TRUE;\n        if(pSymbolDictDecoder->SDHUFF == 0) {\n            pSegment->m_Result.sd->m_gbContext = gbContext;\n        }\n        if(pSymbolDictDecoder->SDREFAGG == 1) {\n            pSegment->m_Result.sd->m_grContext = grContext;\n        }\n        bUsed = TRUE;\n    } else {\n        bUsed = FALSE;\n    }\n    delete pSymbolDictDecoder;\n    if(SDINSYMS) {\n        m_pModule->JBig2_Free(SDINSYMS);\n    }\n    if(Table_B1) {\n        delete Table_B1;\n    }\n    if(Table_B2) {\n        delete Table_B2;\n    }\n    if(Table_B3) {\n        delete Table_B3;\n    }\n    if(Table_B4) {\n        delete Table_B4;\n    }\n    if(Table_B5) {\n        delete Table_B5;\n    }\n    if(bUsed == FALSE) {\n        if(gbContext) {\n            m_pModule->JBig2_Free(gbContext);\n        }\n        if(grContext) {\n            m_pModule->JBig2_Free(grContext);\n        }\n    }\n    return JBIG2_SUCCESS;\nfailed:\n    delete pSymbolDictDecoder;\n    if(SDINSYMS) {\n        m_pModule->JBig2_Free(SDINSYMS);\n    }\n    if(Table_B1) {\n        delete Table_B1;\n    }\n    if(Table_B2) {\n        delete Table_B2;\n    }\n    if(Table_B3) {\n        delete Table_B3;\n    }\n    if(Table_B4) {\n        delete Table_B4;\n    }\n    if(Table_B5) {\n        delete Table_B5;\n    }\n    if(gbContext) {\n        m_pModule->JBig2_Free(gbContext);\n    }\n    if(grContext) {\n        m_pModule->JBig2_Free(grContext);\n    }\n    return nRet;\n}\n\nFX_BOOL CJBig2_Context::parseTextRegion(CJBig2_Segment *pSegment)\n{\n    FX_DWORD dwTemp;\n    FX_WORD wFlags;\n    FX_INT32 i, nIndex, nRet;\n    JBig2RegionInfo ri;\n    CJBig2_Segment *pSeg;\n    CJBig2_Image **SBSYMS = NULL;\n    JBig2HuffmanCode *SBSYMCODES = NULL;\n    FX_BYTE cSBHUFFFS, cSBHUFFDS, cSBHUFFDT, cSBHUFFRDW, cSBHUFFRDH, cSBHUFFRDX, cSBHUFFRDY, cSBHUFFRSIZE;\n    CJBig2_HuffmanTable *Table_B1 = NULL,\n                         *Table_B6 = NULL,\n                          *Table_B7 = NULL,\n                           *Table_B8 = NULL,\n                            *Table_B9 = NULL,\n                             *Table_B10 = NULL,\n                              *Table_B11 = NULL,\n                               *Table_B12 = NULL,\n                                *Table_B13 = NULL,\n                                 *Table_B14 = NULL,\n                                  *Table_B15 = NULL;\n    JBig2ArithCtx *grContext = NULL;\n    CJBig2_ArithDecoder *pArithDecoder;\n    CJBig2_TRDProc *pTRD;\n    JBIG2_ALLOC(pTRD, CJBig2_TRDProc());\n    if((parseRegionInfo(&ri) != JBIG2_SUCCESS)\n            || (m_pStream->readShortInteger(&wFlags) != 0)) {\n        m_pModule->JBig2_Error(\"text region segment : data header too short.\");\n        nRet = JBIG2_ERROR_TOO_SHORT;\n        goto failed;\n    }\n    pTRD->SBW = ri.width;\n    pTRD->SBH = ri.height;\n    pTRD->SBHUFF = wFlags & 0x0001;\n    pTRD->SBREFINE = (wFlags >> 1) & 0x0001;\n    dwTemp = (wFlags >> 2) & 0x0003;\n    pTRD->SBSTRIPS = 1 << dwTemp;\n    pTRD->REFCORNER = (JBig2Corner)((wFlags >> 4) & 0x0003);\n    pTRD->TRANSPOSED = (wFlags >> 6) & 0x0001;\n    pTRD->SBCOMBOP = (JBig2ComposeOp)((wFlags >> 7) & 0x0003);\n    pTRD->SBDEFPIXEL = (wFlags >> 9) & 0x0001;\n    pTRD->SBDSOFFSET = (wFlags >> 10) & 0x001f;\n    if(pTRD->SBDSOFFSET >= 0x0010) {\n        pTRD->SBDSOFFSET = pTRD->SBDSOFFSET - 0x0020;\n    }\n    pTRD->SBRTEMPLATE = (wFlags >> 15) & 0x0001;\n    if(pTRD->SBHUFF == 1) {\n        if(m_pStream->readShortInteger(&wFlags) != 0) {\n            m_pModule->JBig2_Error(\"text region segment : data header too short.\");\n            nRet = JBIG2_ERROR_TOO_SHORT;\n            goto failed;\n        }\n        cSBHUFFFS = wFlags & 0x0003;\n        cSBHUFFDS = (wFlags >> 2) & 0x0003;\n        cSBHUFFDT = (wFlags >> 4) & 0x0003;\n        cSBHUFFRDW = (wFlags >> 6) & 0x0003;\n        cSBHUFFRDH = (wFlags >> 8) & 0x0003;\n        cSBHUFFRDX = (wFlags >> 10) & 0x0003;\n        cSBHUFFRDY = (wFlags >> 12) & 0x0003;\n        cSBHUFFRSIZE = (wFlags >> 14) & 0x0001;\n    }\n    if((pTRD->SBREFINE == 1) && (pTRD->SBRTEMPLATE == 0)) {\n        for(i = 0; i < 4; i++) {\n            if(m_pStream->read1Byte((FX_BYTE*)&pTRD->SBRAT[i]) != 0) {\n                m_pModule->JBig2_Error(\"text region segment : data header too short.\");\n                nRet = JBIG2_ERROR_TOO_SHORT;\n                goto failed;\n            }\n        }\n    }\n    if(m_pStream->readInteger(&pTRD->SBNUMINSTANCES) != 0) {\n        m_pModule->JBig2_Error(\"text region segment : data header too short.\");\n        nRet = JBIG2_ERROR_TOO_SHORT;\n        goto failed;\n    }\n    for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {\n        if(!findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i])) {\n            m_pModule->JBig2_Error(\"text region segment : can't find refered to segments\");\n            nRet = JBIG2_ERROR_FETAL;\n            goto failed;\n        }\n    }\n    pTRD->SBNUMSYMS = 0;\n    for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {\n        pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);\n        if(pSeg->m_cFlags.s.type == 0) {\n            pTRD->SBNUMSYMS += pSeg->m_Result.sd->SDNUMEXSYMS;\n        }\n    }\n    if (pTRD->SBNUMSYMS > 0) {\n        SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(\n                     sizeof(CJBig2_Image*), pTRD->SBNUMSYMS);\n        dwTemp = 0;\n        for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {\n            pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);\n            if(pSeg->m_cFlags.s.type == 0) {\n                JBIG2_memcpy(SBSYMS + dwTemp, pSeg->m_Result.sd->SDEXSYMS,\n                             pSeg->m_Result.sd->SDNUMEXSYMS * sizeof(CJBig2_Image*));\n                dwTemp += pSeg->m_Result.sd->SDNUMEXSYMS;\n            }\n        }\n        pTRD->SBSYMS = SBSYMS;\n    } else {\n        pTRD->SBSYMS = NULL;\n    }\n    if(pTRD->SBHUFF == 1) {\n        SBSYMCODES = decodeSymbolIDHuffmanTable(m_pStream, pTRD->SBNUMSYMS);\n        if(SBSYMCODES == NULL) {\n            m_pModule->JBig2_Error(\"text region segment: symbol ID huffman table decode failure!\");\n            nRet = JBIG2_ERROR_FETAL;\n            goto failed;\n        }\n        m_pStream->alignByte();\n        pTRD->SBSYMCODES = SBSYMCODES;\n    } else {\n        dwTemp = 0;\n        while((FX_DWORD)(1 << dwTemp) < pTRD->SBNUMSYMS) {\n            dwTemp ++;\n        }\n        pTRD->SBSYMCODELEN = (FX_BYTE)dwTemp;\n    }\n    if(pTRD->SBHUFF == 1) {\n        if((cSBHUFFFS == 2) || (cSBHUFFRDW == 2) || (cSBHUFFRDH == 2)\n                || (cSBHUFFRDX == 2) || (cSBHUFFRDY == 2)) {\n            m_pModule->JBig2_Error(\"text region segment : SBHUFFFS=2 or SBHUFFRDW=2 or \"\n                                   \"SBHUFFRDH=2 or SBHUFFRDX=2 or SBHUFFRDY=2 is not permitted\");\n            nRet = JBIG2_ERROR_FETAL;\n            goto failed;\n        }\n        nIndex = 0;\n        if(cSBHUFFFS == 0) {\n            JBIG2_ALLOC(Table_B6, CJBig2_HuffmanTable(HuffmanTable_B6,\n                        sizeof(HuffmanTable_B6) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B6));\n            pTRD->SBHUFFFS = Table_B6;\n        } else if(cSBHUFFFS == 1) {\n            JBIG2_ALLOC(Table_B7, CJBig2_HuffmanTable(HuffmanTable_B7,\n                        sizeof(HuffmanTable_B7) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B7));\n            pTRD->SBHUFFFS = Table_B7;\n        } else {\n            pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);\n            if(!pSeg) {\n                m_pModule->JBig2_Error(\"text region segment : SBHUFFFS can't find user supplied table\");\n                nRet = JBIG2_ERROR_FETAL;\n                goto failed;\n            }\n            pTRD->SBHUFFFS = pSeg->m_Result.ht;\n        }\n        if(cSBHUFFDS == 0) {\n            JBIG2_ALLOC(Table_B8, CJBig2_HuffmanTable(HuffmanTable_B8,\n                        sizeof(HuffmanTable_B8) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B8));\n            pTRD->SBHUFFDS = Table_B8;\n        } else if(cSBHUFFDS == 1) {\n            JBIG2_ALLOC(Table_B9, CJBig2_HuffmanTable(HuffmanTable_B9,\n                        sizeof(HuffmanTable_B9) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B9));\n            pTRD->SBHUFFDS = Table_B9;\n        } else if(cSBHUFFDS == 2) {\n            JBIG2_ALLOC(Table_B10, CJBig2_HuffmanTable(HuffmanTable_B10,\n                        sizeof(HuffmanTable_B10) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B10));\n            pTRD->SBHUFFDS = Table_B10;\n        } else {\n            pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);\n            if(!pSeg) {\n                m_pModule->JBig2_Error(\"text region segment : SBHUFFDS can't find user supplied table\");\n                nRet = JBIG2_ERROR_FETAL;\n                goto failed;\n            }\n            pTRD->SBHUFFDS = pSeg->m_Result.ht;\n        }\n        if(cSBHUFFDT == 0) {\n            JBIG2_ALLOC(Table_B11, CJBig2_HuffmanTable(HuffmanTable_B11,\n                        sizeof(HuffmanTable_B11) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B11));\n            pTRD->SBHUFFDT = Table_B11;\n        } else if(cSBHUFFDT == 1) {\n            JBIG2_ALLOC(Table_B12, CJBig2_HuffmanTable(HuffmanTable_B12,\n                        sizeof(HuffmanTable_B12) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B12));\n            pTRD->SBHUFFDT = Table_B12;\n        } else if(cSBHUFFDT == 2) {\n            JBIG2_ALLOC(Table_B13, CJBig2_HuffmanTable(HuffmanTable_B13,\n                        sizeof(HuffmanTable_B13) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B13));\n            pTRD->SBHUFFDT = Table_B13;\n        } else {\n            pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);\n            if(!pSeg) {\n                m_pModule->JBig2_Error(\"text region segment : SBHUFFDT can't find user supplied table\");\n                nRet = JBIG2_ERROR_FETAL;\n                goto failed;\n            }\n            pTRD->SBHUFFDT = pSeg->m_Result.ht;\n        }\n        if(cSBHUFFRDW == 0) {\n            JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14,\n                        sizeof(HuffmanTable_B14) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B14));\n            pTRD->SBHUFFRDW = Table_B14;\n        } else if(cSBHUFFRDW == 1) {\n            JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15,\n                        sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));\n            pTRD->SBHUFFRDW = Table_B15;\n        } else {\n            pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);\n            if(!pSeg) {\n                m_pModule->JBig2_Error(\"text region segment : SBHUFFRDW can't find user supplied table\");\n                nRet = JBIG2_ERROR_FETAL;\n                goto failed;\n            }\n            pTRD->SBHUFFRDW = pSeg->m_Result.ht;\n        }\n        if(cSBHUFFRDH == 0) {\n            if(!Table_B14) {\n                JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14,\n                            sizeof(HuffmanTable_B14) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B14));\n            }\n            pTRD->SBHUFFRDH = Table_B14;\n        } else if(cSBHUFFRDH == 1) {\n            if(!Table_B15) {\n                JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15,\n                            sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));\n            }\n            pTRD->SBHUFFRDH = Table_B15;\n        } else {\n            pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);\n            if(!pSeg) {\n                m_pModule->JBig2_Error(\"text region segment : SBHUFFRDH can't find user supplied table\");\n                nRet = JBIG2_ERROR_FETAL;\n                goto failed;\n            }\n            pTRD->SBHUFFRDH = pSeg->m_Result.ht;\n        }\n        if(cSBHUFFRDX == 0) {\n            if(!Table_B14) {\n                JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14,\n                            sizeof(HuffmanTable_B14) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B14));\n            }\n            pTRD->SBHUFFRDX = Table_B14;\n        } else if(cSBHUFFRDX == 1) {\n            if(!Table_B15) {\n                JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15,\n                            sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));\n            }\n            pTRD->SBHUFFRDX = Table_B15;\n        } else {\n            pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);\n            if(!pSeg) {\n                m_pModule->JBig2_Error(\"text region segment : SBHUFFRDX can't find user supplied table\");\n                nRet = JBIG2_ERROR_FETAL;\n                goto failed;\n            }\n            pTRD->SBHUFFRDX = pSeg->m_Result.ht;\n        }\n        if(cSBHUFFRDY == 0) {\n            if(!Table_B14) {\n                JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14,\n                            sizeof(HuffmanTable_B14) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B14));\n            }\n            pTRD->SBHUFFRDY = Table_B14;\n        } else if(cSBHUFFRDY == 1) {\n            if(!Table_B15) {\n                JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15,\n                            sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));\n            }\n            pTRD->SBHUFFRDY = Table_B15;\n        } else {\n            pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);\n            if(!pSeg) {\n                m_pModule->JBig2_Error(\"text region segment : SBHUFFRDY can't find user supplied table\");\n                nRet = JBIG2_ERROR_FETAL;\n                goto failed;\n            }\n            pTRD->SBHUFFRDY = pSeg->m_Result.ht;\n        }\n        if(cSBHUFFRSIZE == 0) {\n            JBIG2_ALLOC(Table_B1, CJBig2_HuffmanTable(HuffmanTable_B1,\n                        sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));\n            pTRD->SBHUFFRSIZE = Table_B1;\n        } else {\n            pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);\n            if(!pSeg) {\n                m_pModule->JBig2_Error(\"text region segment : SBHUFFRSIZE can't find user supplied table\");\n                nRet = JBIG2_ERROR_FETAL;\n                goto failed;\n            }\n            pTRD->SBHUFFRSIZE = pSeg->m_Result.ht;\n        }\n    }\n    if(pTRD->SBREFINE == 1) {\n        dwTemp = pTRD->SBRTEMPLATE ? 1 << 10 : 1 << 13;\n        grContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);\n        JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx)*dwTemp);\n    }\n    if(pTRD->SBHUFF == 0) {\n        JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream));\n        pSegment->m_nResultType = JBIG2_IMAGE_POINTER;\n        pSegment->m_Result.im = pTRD->decode_Arith(pArithDecoder, grContext);\n        delete pArithDecoder;\n        if(pSegment->m_Result.im == NULL) {\n            nRet = JBIG2_ERROR_FETAL;\n            goto failed;\n        }\n        m_pStream->alignByte();\n        m_pStream->offset(2);\n    } else {\n        pSegment->m_nResultType = JBIG2_IMAGE_POINTER;\n        pSegment->m_Result.im = pTRD->decode_Huffman(m_pStream, grContext);\n        if(pSegment->m_Result.im == NULL) {\n            nRet = JBIG2_ERROR_FETAL;\n            goto failed;\n        }\n        m_pStream->alignByte();\n    }\n    if(pSegment->m_cFlags.s.type != 4) {\n        if(!m_bBufSpecified) {\n            JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast();\n            if ((pPageInfo->m_bIsStriped == 1) && (ri.y + ri.height > m_pPage->m_nHeight)) {\n                m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);\n            }\n        }\n        m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, (JBig2ComposeOp)(ri.flags & 0x03));\n        delete pSegment->m_Result.im;\n        pSegment->m_Result.im = NULL;\n    }\n    delete pTRD;\n    if(SBSYMS) {\n        m_pModule->JBig2_Free(SBSYMS);\n    }\n    if(SBSYMCODES) {\n        m_pModule->JBig2_Free(SBSYMCODES);\n    }\n    if(grContext) {\n        m_pModule->JBig2_Free(grContext);\n    }\n    if(Table_B1) {\n        delete Table_B1;\n    }\n    if(Table_B6) {\n        delete Table_B6;\n    }\n    if(Table_B7) {\n        delete Table_B7;\n    }\n    if(Table_B8) {\n        delete Table_B8;\n    }\n    if(Table_B9) {\n        delete Table_B9;\n    }\n    if(Table_B10) {\n        delete Table_B10;\n    }\n    if(Table_B11) {\n        delete Table_B11;\n    }\n    if(Table_B12) {\n        delete Table_B12;\n    }\n    if(Table_B13) {\n        delete Table_B13;\n    }\n    if(Table_B14) {\n        delete Table_B14;\n    }\n    if(Table_B15) {\n        delete Table_B15;\n    }\n    return JBIG2_SUCCESS;\nfailed:\n    delete pTRD;\n    if(SBSYMS) {\n        m_pModule->JBig2_Free(SBSYMS);\n    }\n    if(SBSYMCODES) {\n        m_pModule->JBig2_Free(SBSYMCODES);\n    }\n    if(grContext) {\n        m_pModule->JBig2_Free(grContext);\n    }\n    if(Table_B1) {\n        delete Table_B1;\n    }\n    if(Table_B6) {\n        delete Table_B6;\n    }\n    if(Table_B7) {\n        delete Table_B7;\n    }\n    if(Table_B8) {\n        delete Table_B8;\n    }\n    if(Table_B9) {\n        delete Table_B9;\n    }\n    if(Table_B10) {\n        delete Table_B10;\n    }\n    if(Table_B11) {\n        delete Table_B11;\n    }\n    if(Table_B12) {\n        delete Table_B12;\n    }\n    if(Table_B13) {\n        delete Table_B13;\n    }\n    if(Table_B14) {\n        delete Table_B14;\n    }\n    if(Table_B15) {\n        delete Table_B15;\n    }\n    return nRet;\n}\n\nFX_BOOL CJBig2_Context::parsePatternDict(CJBig2_Segment *pSegment, IFX_Pause* pPause)\n{\n    FX_DWORD dwTemp;\n    FX_BYTE cFlags;\n    JBig2ArithCtx *gbContext;\n    CJBig2_ArithDecoder *pArithDecoder;\n    CJBig2_PDDProc *pPDD;\n    FX_INT32 nRet;\n    JBIG2_ALLOC(pPDD, CJBig2_PDDProc());\n    if((m_pStream->read1Byte(&cFlags) != 0)\n            || (m_pStream->read1Byte(&pPDD->HDPW) != 0)\n            || (m_pStream->read1Byte(&pPDD->HDPH) != 0)\n            || (m_pStream->readInteger(&pPDD->GRAYMAX) != 0)) {\n        m_pModule->JBig2_Error(\"pattern dictionary segment : data header too short.\");\n        nRet = JBIG2_ERROR_TOO_SHORT;\n        goto failed;\n    }\n    if (pPDD->GRAYMAX > JBIG2_MAX_PATTERN_INDEX) {\n        m_pModule->JBig2_Error(\"pattern dictionary segment : too max gray max.\");\n        nRet = JBIG2_ERROR_LIMIT;\n        goto failed;\n    }\n    pPDD->HDMMR = cFlags & 0x01;\n    pPDD->HDTEMPLATE = (cFlags >> 1) & 0x03;\n    pSegment->m_nResultType = JBIG2_PATTERN_DICT_POINTER;\n    if(pPDD->HDMMR == 0) {\n        dwTemp = pPDD->HDTEMPLATE == 0 ? 65536 : pPDD->HDTEMPLATE == 1 ? 8192 : 1024;\n        gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);\n        JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx)*dwTemp);\n        JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream));\n        pSegment->m_Result.pd = pPDD->decode_Arith(pArithDecoder, gbContext, pPause);\n        delete pArithDecoder;\n        if(pSegment->m_Result.pd == NULL) {\n            m_pModule->JBig2_Free(gbContext);\n            nRet = JBIG2_ERROR_FETAL;\n            goto failed;\n        }\n        m_pModule->JBig2_Free(gbContext);\n        m_pStream->alignByte();\n        m_pStream->offset(2);\n    } else {\n        pSegment->m_Result.pd = pPDD->decode_MMR(m_pStream, pPause);\n        if(pSegment->m_Result.pd == NULL) {\n            nRet = JBIG2_ERROR_FETAL;\n            goto failed;\n        }\n        m_pStream->alignByte();\n    }\n    delete pPDD;\n    return JBIG2_SUCCESS;\nfailed:\n    delete pPDD;\n    return nRet;\n}\nFX_BOOL CJBig2_Context::parseHalftoneRegion(CJBig2_Segment *pSegment, IFX_Pause* pPause)\n{\n    FX_DWORD dwTemp;\n    FX_BYTE cFlags;\n    JBig2RegionInfo ri;\n    CJBig2_Segment *pSeg;\n    CJBig2_PatternDict *pPatternDict;\n    JBig2ArithCtx *gbContext;\n    CJBig2_ArithDecoder *pArithDecoder;\n    CJBig2_HTRDProc *pHRD;\n    FX_INT32 nRet;\n    JBIG2_ALLOC(pHRD, CJBig2_HTRDProc());\n    if((parseRegionInfo(&ri) != JBIG2_SUCCESS)\n            || (m_pStream->read1Byte(&cFlags) != 0)\n            || (m_pStream->readInteger(&pHRD->HGW) != 0)\n            || (m_pStream->readInteger(&pHRD->HGH) != 0)\n            || (m_pStream->readInteger((FX_DWORD*)&pHRD->HGX) != 0)\n            || (m_pStream->readInteger((FX_DWORD*)&pHRD->HGY) != 0)\n            || (m_pStream->readShortInteger(&pHRD->HRX) != 0)\n            || (m_pStream->readShortInteger(&pHRD->HRY) != 0)) {\n        m_pModule->JBig2_Error(\"halftone region segment : data header too short.\");\n        nRet = JBIG2_ERROR_TOO_SHORT;\n        goto failed;\n    }\n    pHRD->HBW = ri.width;\n    pHRD->HBH = ri.height;\n    pHRD->HMMR = cFlags & 0x01;\n    pHRD->HTEMPLATE = (cFlags >> 1) & 0x03;\n    pHRD->HENABLESKIP = (cFlags >> 3) & 0x01;\n    pHRD->HCOMBOP = (JBig2ComposeOp)((cFlags >> 4) & 0x07);\n    pHRD->HDEFPIXEL = (cFlags >> 7) & 0x01;\n    if(pSegment->m_nReferred_to_segment_count != 1) {\n        m_pModule->JBig2_Error(\"halftone region segment : refered to segment count not equals 1\");\n        nRet = JBIG2_ERROR_FETAL;\n        goto failed;\n    }\n    pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[0]);\n    if( (pSeg == NULL) || (pSeg->m_cFlags.s.type != 16)) {\n        m_pModule->JBig2_Error(\"halftone region segment : refered to segment is not pattern dict\");\n        nRet = JBIG2_ERROR_FETAL;\n        goto failed;\n    }\n    pPatternDict = pSeg->m_Result.pd;\n    if((pPatternDict == NULL) || (pPatternDict->NUMPATS == 0)) {\n        m_pModule->JBig2_Error(\"halftone region segment : has no patterns input\");\n        nRet = JBIG2_ERROR_FETAL;\n        goto failed;\n    }\n    pHRD->HNUMPATS = pPatternDict->NUMPATS;\n    pHRD->HPATS = pPatternDict->HDPATS;\n    pHRD->HPW = pPatternDict->HDPATS[0]->m_nWidth;\n    pHRD->HPH = pPatternDict->HDPATS[0]->m_nHeight;\n    pSegment->m_nResultType = JBIG2_IMAGE_POINTER;\n    if(pHRD->HMMR == 0) {\n        dwTemp = pHRD->HTEMPLATE == 0 ? 65536 : pHRD->HTEMPLATE == 1 ? 8192 : 1024;\n        gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);\n        JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx)*dwTemp);\n        JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream));\n        pSegment->m_Result.im = pHRD->decode_Arith(pArithDecoder, gbContext, pPause);\n        delete pArithDecoder;\n        if(pSegment->m_Result.im == NULL) {\n            m_pModule->JBig2_Free(gbContext);\n            nRet = JBIG2_ERROR_FETAL;\n            goto failed;\n        }\n        m_pModule->JBig2_Free(gbContext);\n        m_pStream->alignByte();\n        m_pStream->offset(2);\n    } else {\n        pSegment->m_Result.im = pHRD->decode_MMR(m_pStream, pPause);\n        if(pSegment->m_Result.im == NULL) {\n            nRet = JBIG2_ERROR_FETAL;\n            goto failed;\n        }\n        m_pStream->alignByte();\n    }\n    if(pSegment->m_cFlags.s.type != 20) {\n        if(!m_bBufSpecified) {\n            JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast();\n            if ((pPageInfo->m_bIsStriped == 1) && (ri.y + ri.height > m_pPage->m_nHeight)) {\n                m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);\n            }\n        }\n        m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, (JBig2ComposeOp)(ri.flags & 0x03));\n        delete pSegment->m_Result.im;\n        pSegment->m_Result.im = NULL;\n    }\n    delete pHRD;\n    return JBIG2_SUCCESS;\nfailed:\n    delete pHRD;\n    return nRet;\n}\n\nFX_BOOL CJBig2_Context::parseGenericRegion(CJBig2_Segment *pSegment, IFX_Pause* pPause)\n{\n    FX_DWORD dwTemp;\n    FX_BYTE cFlags;\n    FX_INT32 i, nRet;\n    if(m_pGRD == NULL) {\n        JBIG2_ALLOC(m_pGRD, CJBig2_GRDProc());\n        if((parseRegionInfo(&m_ri) != JBIG2_SUCCESS)\n                || (m_pStream->read1Byte(&cFlags) != 0)) {\n            m_pModule->JBig2_Error(\"generic region segment : data header too short.\");\n            nRet = JBIG2_ERROR_TOO_SHORT;\n            goto failed;\n        }\n        if (m_ri.height < 0 || m_ri.width < 0) {\n            m_pModule->JBig2_Error(\"generic region segment : wrong data.\");\n            nRet = JBIG2_FAILED;\n            goto failed;\n        }\n        m_pGRD->GBW = m_ri.width;\n        m_pGRD->GBH = m_ri.height;\n        m_pGRD->MMR = cFlags & 0x01;\n        m_pGRD->GBTEMPLATE = (cFlags >> 1) & 0x03;\n        m_pGRD->TPGDON = (cFlags >> 3) & 0x01;\n        if(m_pGRD->MMR == 0) {\n            if(m_pGRD->GBTEMPLATE == 0) {\n                for(i = 0; i < 8; i++) {\n                    if(m_pStream->read1Byte((FX_BYTE*)&m_pGRD->GBAT[i]) != 0) {\n                        m_pModule->JBig2_Error(\"generic region segment : data header too short.\");\n                        nRet = JBIG2_ERROR_TOO_SHORT;\n                        goto failed;\n                    }\n                }\n            } else {\n                for(i = 0; i < 2; i++) {\n                    if(m_pStream->read1Byte((FX_BYTE*)&m_pGRD->GBAT[i]) != 0) {\n                        m_pModule->JBig2_Error(\"generic region segment : data header too short.\");\n                        nRet = JBIG2_ERROR_TOO_SHORT;\n                        goto failed;\n                    }\n                }\n            }\n        }\n        m_pGRD->USESKIP = 0;\n    }\n    pSegment->m_nResultType = JBIG2_IMAGE_POINTER;\n    if(m_pGRD->MMR == 0) {\n        dwTemp = m_pGRD->GBTEMPLATE == 0 ? 65536 : m_pGRD->GBTEMPLATE == 1 ? 8192 : 1024;\n        if(m_gbContext == NULL) {\n            m_gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc(sizeof(JBig2ArithCtx) * dwTemp);\n            JBIG2_memset(m_gbContext, 0, sizeof(JBig2ArithCtx)*dwTemp);\n        }\n        if(m_pArithDecoder == NULL) {\n            JBIG2_ALLOC(m_pArithDecoder, CJBig2_ArithDecoder(m_pStream));\n            m_ProcessiveStatus = m_pGRD->Start_decode_Arith(&pSegment->m_Result.im, m_pArithDecoder, m_gbContext, pPause);\n        } else {\n            m_ProcessiveStatus = m_pGRD->Continue_decode(pPause);\n        }\n        OutputBitmap(pSegment->m_Result.im);\n        if(m_ProcessiveStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) {\n            if(pSegment->m_cFlags.s.type != 36) {\n                if(!m_bBufSpecified) {\n                    JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast();\n                    if ((pPageInfo->m_bIsStriped == 1) && (m_ri.y + m_ri.height > m_pPage->m_nHeight)) {\n                        m_pPage->expand(m_ri.y + m_ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);\n                    }\n                }\n                FX_RECT Rect = m_pGRD->GetReplaceRect();\n                m_pPage->composeFrom(m_ri.x + Rect.left, m_ri.y + Rect.top, pSegment->m_Result.im, (JBig2ComposeOp)(m_ri.flags & 0x03), &Rect);\n            }\n            return JBIG2_SUCCESS;\n        } else {\n            delete m_pArithDecoder;\n            m_pArithDecoder = NULL;\n            if(pSegment->m_Result.im == NULL) {\n                m_pModule->JBig2_Free(m_gbContext);\n                nRet = JBIG2_ERROR_FETAL;\n                m_gbContext = NULL;\n                m_ProcessiveStatus = FXCODEC_STATUS_ERROR;\n                goto failed;\n            }\n            m_pModule->JBig2_Free(m_gbContext);\n            m_gbContext = NULL;\n            m_pStream->alignByte();\n            m_pStream->offset(2);\n        }\n    } else {\n        FXCODEC_STATUS status = m_pGRD->Start_decode_MMR(&pSegment->m_Result.im, m_pStream, pPause);\n        while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {\n            m_pGRD->Continue_decode(pPause);\n        }\n        if(pSegment->m_Result.im == NULL) {\n            nRet = JBIG2_ERROR_FETAL;\n            goto failed;\n        }\n        m_pStream->alignByte();\n    }\n    if(pSegment->m_cFlags.s.type != 36) {\n        if(!m_bBufSpecified) {\n            JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast();\n            if ((pPageInfo->m_bIsStriped == 1) && (m_ri.y + m_ri.height > m_pPage->m_nHeight)) {\n                m_pPage->expand(m_ri.y + m_ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);\n            }\n        }\n        FX_RECT Rect = m_pGRD->GetReplaceRect();\n        m_pPage->composeFrom(m_ri.x + Rect.left, m_ri.y + Rect.top, pSegment->m_Result.im, (JBig2ComposeOp)(m_ri.flags & 0x03), &Rect);\n        delete pSegment->m_Result.im;\n        pSegment->m_Result.im = NULL;\n    }\n    delete m_pGRD;\n    m_pGRD = NULL;\n    return JBIG2_SUCCESS;\nfailed:\n    delete m_pGRD;\n    m_pGRD = NULL;\n    return nRet;\n}\n\nFX_BOOL CJBig2_Context::parseGenericRefinementRegion(CJBig2_Segment *pSegment)\n{\n    FX_DWORD dwTemp;\n    JBig2RegionInfo ri;\n    CJBig2_Segment *pSeg;\n    FX_INT32 i, nRet;\n    FX_BYTE cFlags;\n    JBig2ArithCtx *grContext;\n    CJBig2_GRRDProc *pGRRD;\n    CJBig2_ArithDecoder *pArithDecoder;\n    JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());\n    if((parseRegionInfo(&ri) != JBIG2_SUCCESS)\n            || (m_pStream->read1Byte(&cFlags) != 0)) {\n        m_pModule->JBig2_Error(\"generic refinement region segment : data header too short.\");\n        nRet = JBIG2_ERROR_TOO_SHORT;\n        goto failed;\n    }\n    pGRRD->GRW = ri.width;\n    pGRRD->GRH = ri.height;\n    pGRRD->GRTEMPLATE = cFlags & 0x01;\n    pGRRD->TPGRON = (cFlags >> 1) & 0x01;\n    if(pGRRD->GRTEMPLATE == 0) {\n        for(i = 0; i < 4; i++) {\n            if(m_pStream->read1Byte((FX_BYTE*)&pGRRD->GRAT[i]) != 0) {\n                m_pModule->JBig2_Error(\"generic refinement region segment : data header too short.\");\n                nRet = JBIG2_ERROR_TOO_SHORT;\n                goto failed;\n            }\n        }\n    }\n    pSeg = NULL;\n    if(pSegment->m_nReferred_to_segment_count > 0) {\n        for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {\n            pSeg = this->findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[0]);\n            if(pSeg == NULL) {\n                m_pModule->JBig2_Error(\"generic refinement region segment : can't find refered to segments\");\n                nRet = JBIG2_ERROR_FETAL;\n                goto failed;\n            }\n            if((pSeg->m_cFlags.s.type == 4) || (pSeg->m_cFlags.s.type == 20)\n                    || (pSeg->m_cFlags.s.type == 36) || (pSeg->m_cFlags.s.type == 40)) {\n                break;\n            }\n        }\n        if(i >= pSegment->m_nReferred_to_segment_count) {\n            m_pModule->JBig2_Error(\"generic refinement region segment : can't find refered to intermediate region\");\n            nRet = JBIG2_ERROR_FETAL;\n            goto failed;\n        }\n        pGRRD->GRREFERENCE = pSeg->m_Result.im;\n    } else {\n        pGRRD->GRREFERENCE = m_pPage;\n    }\n    pGRRD->GRREFERENCEDX = 0;\n    pGRRD->GRREFERENCEDY = 0;\n    dwTemp = pGRRD->GRTEMPLATE ? 1 << 10 : 1 << 13;\n    grContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);\n    JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx)*dwTemp);\n    JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream));\n    pSegment->m_nResultType = JBIG2_IMAGE_POINTER;\n    pSegment->m_Result.im = pGRRD->decode(pArithDecoder, grContext);\n    delete pArithDecoder;\n    if(pSegment->m_Result.im == NULL) {\n        m_pModule->JBig2_Free(grContext);\n        nRet = JBIG2_ERROR_FETAL;\n        goto failed;\n    }\n    m_pModule->JBig2_Free(grContext);\n    m_pStream->alignByte();\n    m_pStream->offset(2);\n    if(pSegment->m_cFlags.s.type != 40) {\n        if(!m_bBufSpecified) {\n            JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast();\n            if ((pPageInfo->m_bIsStriped == 1) && (ri.y + ri.height > m_pPage->m_nHeight)) {\n                m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);\n            }\n        }\n        m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, (JBig2ComposeOp)(ri.flags & 0x03));\n        delete pSegment->m_Result.im;\n        pSegment->m_Result.im = NULL;\n    }\n    delete pGRRD;\n    return JBIG2_SUCCESS;\nfailed:\n    delete pGRRD;\n    return nRet;\n}\nFX_BOOL CJBig2_Context::parseTable(CJBig2_Segment *pSegment)\n{\n    pSegment->m_nResultType = JBIG2_HUFFMAN_TABLE_POINTER;\n    JBIG2_ALLOC(pSegment->m_Result.ht, CJBig2_HuffmanTable(m_pStream));\n    if(!pSegment->m_Result.ht->isOK()) {\n        delete pSegment->m_Result.ht;\n        pSegment->m_Result.ht = NULL;\n        return JBIG2_ERROR_FETAL;\n    }\n    m_pStream->alignByte();\n    return JBIG2_SUCCESS;\n}\nFX_INT32 CJBig2_Context::parseRegionInfo(JBig2RegionInfo *pRI)\n{\n    if((m_pStream->readInteger((FX_DWORD*)&pRI->width) != 0)\n            || (m_pStream->readInteger((FX_DWORD*)&pRI->height) != 0)\n            || (m_pStream->readInteger((FX_DWORD*)&pRI->x) != 0)\n            || (m_pStream->readInteger((FX_DWORD*)&pRI->y) != 0)\n            || (m_pStream->read1Byte(&pRI->flags) != 0)) {\n        return JBIG2_ERROR_TOO_SHORT;\n    }\n    return JBIG2_SUCCESS;\n}\nJBig2HuffmanCode *CJBig2_Context::decodeSymbolIDHuffmanTable(CJBig2_BitStream *pStream,\n        FX_DWORD SBNUMSYMS)\n{\n    JBig2HuffmanCode *SBSYMCODES;\n    FX_INT32 runcodes[35], runcodes_len[35], runcode;\n    FX_INT32 i, j, nTemp, nVal, nBits;\n    FX_INT32 run;\n    SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2(sizeof(JBig2HuffmanCode), SBNUMSYMS);\n    for (i = 0; i < 35; i ++) {\n        if(pStream->readNBits(4, &runcodes_len[i]) != 0) {\n            goto failed;\n        }\n    }\n    huffman_assign_code(runcodes, runcodes_len, 35);\n    i = 0;\n    while(i < (int)SBNUMSYMS) {\n        nVal = 0;\n        nBits = 0;\n        for(;;) {\n            if(pStream->read1Bit(&nTemp) != 0) {\n                goto failed;\n            }\n            nVal = (nVal << 1) | nTemp;\n            nBits ++;\n            for(j = 0; j < 35; j++) {\n                if((nBits == runcodes_len[j]) && (nVal == runcodes[j])) {\n                    break;\n                }\n            }\n            if(j < 35) {\n                break;\n            }\n        }\n        runcode = j;\n        if(runcode < 32) {\n            SBSYMCODES[i].codelen = runcode;\n            run = 0;\n        } else if(runcode == 32) {\n            if(pStream->readNBits(2, &nTemp) != 0) {\n                goto failed;\n            }\n            run = nTemp + 3;\n        } else if(runcode == 33) {\n            if(pStream->readNBits(3, &nTemp) != 0) {\n                goto failed;\n            }\n            run = nTemp + 3;\n        } else if(runcode == 34) {\n            if(pStream->readNBits(7, &nTemp) != 0) {\n                goto failed;\n            }\n            run = nTemp + 11;\n        }\n        if(run > 0) {\n            if (i + run > (int)SBNUMSYMS) {\n                goto failed;\n            }\n            for(j = 0; j < run; j++) {\n                if(runcode == 32 && i > 0) {\n                    SBSYMCODES[i + j].codelen = SBSYMCODES[i - 1].codelen;\n                } else {\n                    SBSYMCODES[i + j].codelen = 0;\n                }\n            }\n            i += run;\n        } else {\n            i ++;\n        }\n    }\n    huffman_assign_code(SBSYMCODES, SBNUMSYMS);\n    return SBSYMCODES;\nfailed:\n    m_pModule->JBig2_Free(SBSYMCODES);\n    return NULL;\n}\nvoid CJBig2_Context::huffman_assign_code(int* CODES, int* PREFLEN, int NTEMP)\n{\n    int CURLEN, LENMAX, CURCODE, CURTEMP, i;\n    int *LENCOUNT;\n    int *FIRSTCODE;\n    LENMAX = 0;\n    for(i = 0; i < NTEMP; i++) {\n        if(PREFLEN[i] > LENMAX) {\n            LENMAX = PREFLEN[i];\n        }\n    }\n    LENCOUNT = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));\n    JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));\n    FIRSTCODE = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));\n    for(i = 0; i < NTEMP; i++) {\n        LENCOUNT[PREFLEN[i]] ++;\n    }\n    CURLEN = 1;\n    FIRSTCODE[0] = 0;\n    LENCOUNT[0]  = 0;\n    while(CURLEN <= LENMAX) {\n        FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1;\n        CURCODE = FIRSTCODE[CURLEN];\n        CURTEMP = 0;\n        while(CURTEMP < NTEMP) {\n            if(PREFLEN[CURTEMP] == CURLEN) {\n                CODES[CURTEMP] = CURCODE;\n                CURCODE = CURCODE + 1;\n            }\n            CURTEMP = CURTEMP + 1;\n        }\n        CURLEN = CURLEN + 1;\n    }\n    m_pModule->JBig2_Free(LENCOUNT);\n    m_pModule->JBig2_Free(FIRSTCODE);\n}\nvoid CJBig2_Context::huffman_assign_code(JBig2HuffmanCode *SBSYMCODES, int NTEMP)\n{\n    int CURLEN, LENMAX, CURCODE, CURTEMP, i;\n    int *LENCOUNT;\n    int *FIRSTCODE;\n    LENMAX = 0;\n    for(i = 0; i < NTEMP; i++) {\n        if(SBSYMCODES[i].codelen > LENMAX) {\n            LENMAX = SBSYMCODES[i].codelen;\n        }\n    }\n    LENCOUNT = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));\n    JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));\n    FIRSTCODE = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));\n    for(i = 0; i < NTEMP; i++) {\n        LENCOUNT[SBSYMCODES[i].codelen] ++;\n    }\n    CURLEN = 1;\n    FIRSTCODE[0] = 0;\n    LENCOUNT[0]  = 0;\n    while(CURLEN <= LENMAX) {\n        FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1;\n        CURCODE = FIRSTCODE[CURLEN];\n        CURTEMP = 0;\n        while(CURTEMP < NTEMP) {\n            if(SBSYMCODES[CURTEMP].codelen == CURLEN) {\n                SBSYMCODES[CURTEMP].code = CURCODE;\n                CURCODE = CURCODE + 1;\n            }\n            CURTEMP = CURTEMP + 1;\n        }\n        CURLEN = CURLEN + 1;\n    }\n    m_pModule->JBig2_Free(LENCOUNT);\n    m_pModule->JBig2_Free(FIRSTCODE);\n}\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_Context.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JBIG2_CONTEXT_H_\n#define _JBIG2_CONTEXT_H_\n#include \"JBig2_Module.h\"\n#include \"JBig2_List.h\"\n#include \"JBig2_Segment.h\"\n#include \"JBig2_Page.h\"\n#include \"JBig2_GeneralDecoder.h\"\n#include \"../../../include/fxcodec/fx_codec_def.h\"\n#include \"../../../include/fxcrt/fx_basic.h\"\ntypedef enum {\n    JBIG2_OUT_OF_PAGE = 0,\n    JBIG2_IN_PAGE,\n} JBig2State;\n#define JBIG2_SUCCESS\t\t\t 0\n#define JBIG2_FAILED\t\t\t-1\n#define JBIG2_ERROR_TOO_SHORT\t-2\n#define JBIG2_ERROR_FETAL\t\t-3\n#define JBIG2_END_OF_PAGE\t\t 2\n#define JBIG2_END_OF_FILE\t\t 3\n#define JBIG2_ERROR_FILE_FORMAT -4\n#define JBIG2_ERROR_STREAM_TYPE -5\n#define JBIG2_ERROR_LIMIT\t\t-6\n#define JBIG2_FILE_STREAM\t\t\t0\n#define JBIG2_SQUENTIAL_STREAM\t\t1\n#define JBIG2_RANDOM_STREAM\t\t\t2\n#define JBIG2_EMBED_STREAM\t\t\t3\n#define JBIG2_MIN_SEGMENT_SIZE\t\t\t\t\t11\nclass CJBig2_Context : public CJBig2_Object\n{\npublic:\n\n    static CJBig2_Context *CreateContext(CJBig2_Module *pModule, FX_BYTE *pGlobalData, FX_DWORD dwGlobalLength,\n                                         FX_BYTE *pData, FX_DWORD dwLength, FX_INT32 nStreamType, IFX_Pause* pPause = NULL);\n\n    static void DestroyContext(CJBig2_Context *pContext);\n\n    FX_INT32 getFirstPage(FX_BYTE *pBuf, FX_INT32 width, FX_INT32 height, FX_INT32 stride, IFX_Pause* pPause);\n\n    FX_INT32 getNextPage(FX_BYTE *pBuf, FX_INT32 width, FX_INT32 height, FX_INT32 stride, IFX_Pause* pPause);\n\n    FX_INT32 getFirstPage(CJBig2_Image **image, IFX_Pause* pPause);\n\n    FX_INT32 getNextPage(CJBig2_Image **image, IFX_Pause* pPause);\n    FX_INT32 Continue(IFX_Pause* pPause);\n    FXCODEC_STATUS GetProcessiveStatus()\n    {\n        return m_ProcessiveStatus;\n    };\nprivate:\n\n    CJBig2_Context(FX_BYTE *pGlobalData, FX_DWORD dwGlobalLength,\n                   FX_BYTE *pData, FX_DWORD dwLength, FX_INT32 nStreamType, IFX_Pause* pPause);\n\n    ~CJBig2_Context();\n\n    FX_INT32 decodeFile(IFX_Pause* pPause);\n\n    FX_INT32 decode_SquentialOrgnazation(IFX_Pause* pPause);\n\n    FX_INT32 decode_EmbedOrgnazation(IFX_Pause* pPause);\n\n    FX_INT32 decode_RandomOrgnazation_FirstPage(IFX_Pause* pPause);\n\n    FX_INT32 decode_RandomOrgnazation(IFX_Pause* pPause);\n\n    CJBig2_Segment *findSegmentByNumber(FX_DWORD dwNumber);\n\n    CJBig2_Segment *findReferredSegmentByTypeAndIndex(CJBig2_Segment *pSegment, FX_BYTE cType, FX_INT32 nIndex);\n\n    FX_INT32 parseSegmentHeader(CJBig2_Segment *pSegment);\n\n    FX_INT32 parseSegmentData(CJBig2_Segment *pSegment, IFX_Pause* pPause);\n    FX_INT32 ProcessiveParseSegmentData(CJBig2_Segment *pSegment, IFX_Pause* pPause);\n\n    FX_INT32 parseSymbolDict(CJBig2_Segment *pSegment, IFX_Pause* pPause);\n\n    FX_INT32 parseTextRegion(CJBig2_Segment *pSegment);\n\n    FX_INT32 parsePatternDict(CJBig2_Segment *pSegment, IFX_Pause* pPause);\n\n    FX_INT32 parseHalftoneRegion(CJBig2_Segment *pSegment, IFX_Pause* pPause);\n\n    FX_INT32 parseGenericRegion(CJBig2_Segment *pSegment, IFX_Pause* pPause);\n\n    FX_INT32 parseGenericRefinementRegion(CJBig2_Segment *pSegment);\n\n    FX_INT32 parseTable(CJBig2_Segment *pSegment);\n\n    FX_INT32 parseRegionInfo(JBig2RegionInfo *pRI);\n\n\n\n    JBig2HuffmanCode *decodeSymbolIDHuffmanTable(CJBig2_BitStream *pStream, FX_DWORD SBNUMSYMS);\n\n    void huffman_assign_code(int* CODES, int* PREFLEN, int NTEMP);\n\n    void huffman_assign_code(JBig2HuffmanCode *SBSYMCODES, int NTEMP);\n\nprivate:\n\n    CJBig2_Context *m_pGlobalContext;\n\n    FX_INT32 m_nStreamType;\n\n    CJBig2_BitStream *m_pStream;\n\n    FX_INT32 m_nState;\n\n    CJBig2_List<CJBig2_Segment> *m_pSegmentList;\n\n    CJBig2_List<JBig2PageInfo> *m_pPageInfoList;\n\n    CJBig2_Image *m_pPage;\n\n    FX_BOOL m_bBufSpecified;\n\n    FX_INT32 m_nSegmentDecoded;\n    IFX_Pause*\tm_pPause;\n    FX_INT32\tm_PauseStep;\n    FXCODEC_STATUS m_ProcessiveStatus;\n    FX_BOOL\tm_bFirstPage;\n    CJBig2_ArithDecoder *m_pArithDecoder;\n    CJBig2_GRDProc *m_pGRD;\n    JBig2ArithCtx *m_gbContext;\n    CJBig2_Segment *m_pSegment;\n    FX_DWORD m_dwOffset;\n    JBig2RegionInfo m_ri;\n};\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_Define.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JBIG2_DEFINE_H_\n#define _JBIG2_DEFINE_H_\n#include \"../../../include/fxcrt/fx_system.h\"\n#define JBIG2_memset\tFXSYS_memset8\n#define JBIG2_memcmp\tFXSYS_memcmp32\n#define JBIG2_memcpy\tFXSYS_memcpy32\n#include \"JBig2_Object.h\"\n#define JBIG2_OOB\t\t\t1\ntypedef struct {\n    FX_INT32 width,\n             height;\n    FX_INT32 x,\n             y;\n    FX_BYTE flags;\n} JBig2RegionInfo;\ntypedef struct {\n    FX_INT32 codelen;\n    FX_INT32 code;\n} JBig2HuffmanCode;\nextern \"C\" {\n    void _FaxG4Decode(void *pModule, FX_LPCBYTE src_buf, FX_DWORD src_size, int* pbitpos, FX_LPBYTE dest_buf, int width, int height, int pitch = 0);\n};\n#define JBIG2_MAX_REFERRED_SEGMENT_COUNT\t\t64\n#define JBIG2_MAX_EXPORT_SYSMBOLS\t\t\t\t65535\n#define JBIG2_MAX_NEW_SYSMBOLS\t\t\t\t\t65535\n#define JBIG2_MAX_PATTERN_INDEX\t\t\t\t\t65535\n#define JBIG2_MAX_IMAGE_SIZE\t\t\t\t\t65535\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_GeneralDecoder.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"JBig2_GeneralDecoder.h\"\n#include \"JBig2_ArithDecoder.h\"\n#include \"JBig2_ArithIntDecoder.h\"\n#include \"JBig2_HuffmanDecoder.h\"\n#include \"JBig2_HuffmanTable.h\"\n#include \"JBig2_PatternDict.h\"\nCJBig2_Image *CJBig2_GRDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)\n{\n    if (GBW == 0 || GBH == 0) {\n        CJBig2_Image* pImage;\n        JBIG2_ALLOC(pImage, CJBig2_Image(GBW, GBH));\n        return pImage;\n    }\n    if(GBTEMPLATE == 0) {\n        if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)\n                && (GBAT[2] == (signed char) - 3) && (GBAT[3] == (signed char) - 1)\n                && (GBAT[4] == 2) && (GBAT[5] == (signed char) - 2)\n                && (GBAT[6] == (signed char) - 2) && (GBAT[7] == (signed char) - 2)) {\n            return decode_Arith_Template0_opt3(pArithDecoder, gbContext);\n        } else {\n            return decode_Arith_Template0_unopt(pArithDecoder, gbContext);\n        }\n    } else if(GBTEMPLATE == 1) {\n        if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)) {\n            return decode_Arith_Template1_opt3(pArithDecoder, gbContext);\n        } else {\n            return decode_Arith_Template1_unopt(pArithDecoder, gbContext);\n        }\n    } else if(GBTEMPLATE == 2) {\n        if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) {\n            return decode_Arith_Template2_opt3(pArithDecoder, gbContext);\n        } else {\n            return decode_Arith_Template2_unopt(pArithDecoder, gbContext);\n        }\n    } else {\n        if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) {\n            return decode_Arith_Template3_opt3(pArithDecoder, gbContext);\n        } else {\n            return decode_Arith_Template3_unopt(pArithDecoder, gbContext);\n        }\n    }\n}\nCJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)\n{\n    FX_BOOL LTP, SLTP, bVal;\n    FX_DWORD CONTEXT;\n    CJBig2_Image *GBREG;\n    FX_DWORD line1, line2, line3;\n    LTP = 0;\n    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));\n    GBREG->fill(0);\n    for(FX_DWORD h = 0; h < GBH; h++) {\n        if(TPGDON) {\n            SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            GBREG->copyLine(h, h - 1);\n        } else {\n            line1 = GBREG->getPixel(2, h - 2);\n            line1 |= GBREG->getPixel(1, h - 2) << 1;\n            line1 |= GBREG->getPixel(0, h - 2) << 2;\n            line2 = GBREG->getPixel(3, h - 1);\n            line2 |= GBREG->getPixel(2, h - 1) << 1;\n            line2 |= GBREG->getPixel(1, h - 1) << 2;\n            line2 |= GBREG->getPixel(0, h - 1) << 3;\n            line3 = 0;\n            for(FX_DWORD w = 0; w < GBW; w++) {\n                if(USESKIP && SKIP->getPixel(w, h)) {\n                    bVal = 0;\n                } else {\n                    CONTEXT = line3;\n                    CONTEXT |= line2 << 4;\n                    CONTEXT |= line1 << 11;\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                }\n                if(bVal) {\n                    GBREG->setPixel(w, h, bVal);\n                }\n                line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x1f;\n                line2 = ((line2 << 1) | GBREG->getPixel(w + 4, h - 1)) & 0x7f;\n                line3 = ((line3 << 1) | bVal) & 0x0f;\n            }\n        }\n    }\n    return GBREG;\n}\nCJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)\n{\n    FX_BOOL LTP, SLTP, bVal;\n    FX_DWORD CONTEXT;\n    CJBig2_Image *GBREG;\n    FX_DWORD line1, line2;\n    FX_BYTE *pLine, cVal;\n    FX_INTPTR nStride, nStride2;\n    FX_INT32 nBits, k;\n    LTP = 0;\n    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));\n    if (GBREG->m_pData == NULL) {\n        delete GBREG;\n        m_pModule->JBig2_Error(\"Generic region decoding procedure: Create Image Failed with width = %d, height = %d\\n\", GBW, GBH);\n        return NULL;\n    }\n    pLine = GBREG->m_pData;\n    nStride = GBREG->m_nStride;\n    nStride2 = nStride << 1;\n    for(FX_DWORD h = 0; h < GBH; h++) {\n        if(TPGDON) {\n            SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            GBREG->copyLine(h, h - 1);\n        } else {\n            line1 = (h > 1) ? pLine[-nStride2] << 6 : 0;\n            line2 = (h > 0) ? pLine[-nStride] : 0;\n            CONTEXT = (line1 & 0xf800) | (line2 & 0x07f0);\n            for(FX_DWORD w = 0; w < GBW; w += 8) {\n                if(w + 8 < GBW) {\n                    nBits = 8;\n                    if(h > 1) {\n                        line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 6);\n                    }\n                    if(h > 0) {\n                        line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]);\n                    }\n                } else {\n                    nBits = GBW - w;\n                    if(h > 1) {\n                        line1 <<= 8;\n                    }\n                    if(h > 0) {\n                        line2 <<= 8;\n                    }\n                }\n                cVal = 0;\n                for(k = 0; k < nBits; k++) {\n                    if(USESKIP && SKIP->getPixel(w, h)) {\n                        bVal = 0;\n                    } else {\n                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                    }\n                    cVal |= bVal << (7 - k);\n                    CONTEXT = ((CONTEXT & 0x7bf7) << 1) | bVal\n                              | ((line1 >> (7 - k)) & 0x0800)\n                              | ((line2 >> (7 - k)) & 0x0010);\n                }\n                pLine[w >> 3] = cVal;\n            }\n        }\n        pLine += nStride;\n    }\n    return GBREG;\n}\nCJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)\n{\n    FX_BOOL LTP, SLTP, bVal;\n    FX_DWORD CONTEXT;\n    CJBig2_Image *GBREG;\n    FX_DWORD line1, line2;\n    FX_BYTE *pLine, *pLine1, *pLine2, cVal;\n    FX_INT32 nStride, nStride2, k;\n    FX_INT32 nLineBytes, nBitsLeft, cc;\n    LTP = 0;\n    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));\n    if (GBREG->m_pData == NULL) {\n        delete GBREG;\n        m_pModule->JBig2_Error(\"Generic region decoding procedure: Create Image Failed with width = %d, height = %d\\n\", GBW, GBH);\n        return NULL;\n    }\n    pLine = GBREG->m_pData;\n    nStride = GBREG->m_nStride;\n    nStride2 = nStride << 1;\n    nLineBytes = ((GBW + 7) >> 3) - 1;\n    nBitsLeft = GBW - (nLineBytes << 3);\n    FX_DWORD height = GBH & 0x7fffffff;\n    for(FX_DWORD h = 0; h < height; h++) {\n        if(TPGDON) {\n            SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            GBREG->copyLine(h, h - 1);\n        } else {\n            if(h > 1) {\n                pLine1 = pLine - nStride2;\n                pLine2 = pLine - nStride;\n                line1 = (*pLine1++) << 6;\n                line2 = *pLine2++;\n                CONTEXT = ((line1 & 0xf800) | (line2 & 0x07f0));\n                for(cc = 0; cc < nLineBytes; cc++) {\n                    line1 = (line1 << 8) | ((*pLine1++) << 6);\n                    line2 = (line2 << 8) | (*pLine2++);\n                    cVal = 0;\n                    for(k = 7; k >= 0; k--) {\n                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                        cVal |= bVal << k;\n                        CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal\n                                   | ((line1 >> k) & 0x0800)\n                                   | ((line2 >> k) & 0x0010));\n                    }\n                    pLine[cc] = cVal;\n                }\n                line1 <<= 8;\n                line2 <<= 8;\n                cVal = 0;\n                for(k = 0; k < nBitsLeft; k++) {\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                    cVal |= bVal << (7 - k);\n                    CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal\n                               | ((line1 >> (7 - k)) & 0x0800)\n                               | ((line2 >> (7 - k)) & 0x0010));\n                }\n                pLine[nLineBytes] = cVal;\n            } else {\n                pLine2 = pLine - nStride;\n                line2 = (h & 1) ? (*pLine2++) : 0;\n                CONTEXT = (line2 & 0x07f0);\n                for(cc = 0; cc < nLineBytes; cc++) {\n                    if(h & 1) {\n                        line2 = (line2 << 8) | (*pLine2++);\n                    }\n                    cVal = 0;\n                    for(k = 7; k >= 0; k--) {\n                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                        cVal |= bVal << k;\n                        CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal\n                                   | ((line2 >> k) & 0x0010));\n                    }\n                    pLine[cc] = cVal;\n                }\n                line2 <<= 8;\n                cVal = 0;\n                for(k = 0; k < nBitsLeft; k++) {\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                    cVal |= bVal << (7 - k);\n                    CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal\n                               | (((line2 >> (7 - k))) & 0x0010));\n                }\n                pLine[nLineBytes] = cVal;\n            }\n        }\n        pLine += nStride;\n    }\n    return GBREG;\n}\nCJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)\n{\n    FX_BOOL LTP, SLTP, bVal;\n    FX_DWORD CONTEXT;\n    CJBig2_Image *GBREG;\n    FX_DWORD line1, line2, line3;\n    LTP = 0;\n    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));\n    GBREG->fill(0);\n    for(FX_DWORD h = 0; h < GBH; h++) {\n        if(TPGDON) {\n            SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            GBREG->copyLine(h, h - 1);\n        } else {\n            line1 = GBREG->getPixel(1, h - 2);\n            line1 |= GBREG->getPixel(0, h - 2) << 1;\n            line2 = GBREG->getPixel(2, h - 1);\n            line2 |= GBREG->getPixel(1, h - 1) << 1;\n            line2 |= GBREG->getPixel(0, h - 1) << 2;\n            line3 = 0;\n            for(FX_DWORD w = 0; w < GBW; w++) {\n                if(USESKIP && SKIP->getPixel(w, h)) {\n                    bVal = 0;\n                } else {\n                    CONTEXT = line3;\n                    CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;\n                    CONTEXT |= line2 << 5;\n                    CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10;\n                    CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11;\n                    CONTEXT |= line1 << 12;\n                    CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15;\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                }\n                if(bVal) {\n                    GBREG->setPixel(w, h, bVal);\n                }\n                line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;\n                line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;\n                line3 = ((line3 << 1) | bVal) & 0x0f;\n            }\n        }\n    }\n    return GBREG;\n}\nCJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)\n{\n    FX_BOOL LTP, SLTP, bVal;\n    FX_DWORD CONTEXT;\n    CJBig2_Image *GBREG;\n    FX_DWORD line1, line2, line3;\n    LTP = 0;\n    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));\n    GBREG->fill(0);\n    for(FX_DWORD h = 0; h < GBH; h++) {\n        if(TPGDON) {\n            SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            GBREG->copyLine(h, h - 1);\n        } else {\n            line1 = GBREG->getPixel(2, h - 2);\n            line1 |= GBREG->getPixel(1, h - 2) << 1;\n            line1 |= GBREG->getPixel(0, h - 2) << 2;\n            line2 = GBREG->getPixel(3, h - 1);\n            line2 |= GBREG->getPixel(2, h - 1) << 1;\n            line2 |= GBREG->getPixel(1, h - 1) << 2;\n            line2 |= GBREG->getPixel(0, h - 1) << 3;\n            line3 = 0;\n            for(FX_DWORD w = 0; w < GBW; w++) {\n                if(USESKIP && SKIP->getPixel(w, h)) {\n                    bVal = 0;\n                } else {\n                    CONTEXT = line3;\n                    CONTEXT |= line2 << 3;\n                    CONTEXT |= line1 << 9;\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                }\n                if(bVal) {\n                    GBREG->setPixel(w, h, bVal);\n                }\n                line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f;\n                line2 = ((line2 << 1) | GBREG->getPixel(w + 4, h - 1)) & 0x3f;\n                line3 = ((line3 << 1) | bVal) & 0x07;\n            }\n        }\n    }\n    return GBREG;\n}\nCJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)\n{\n    FX_BOOL LTP, SLTP, bVal;\n    FX_DWORD CONTEXT;\n    CJBig2_Image *GBREG;\n    FX_DWORD line1, line2;\n    FX_BYTE *pLine, cVal;\n    FX_INTPTR nStride, nStride2;\n    FX_INT32 nBits, k;\n    LTP = 0;\n    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));\n    if (GBREG->m_pData == NULL) {\n        delete GBREG;\n        m_pModule->JBig2_Error(\"Generic region decoding procedure: Create Image Failed with width = %d, height = %d\\n\", GBW, GBH);\n        return NULL;\n    }\n    pLine = GBREG->m_pData;\n    nStride = GBREG->m_nStride;\n    nStride2 = nStride << 1;\n    for(FX_DWORD h = 0; h < GBH; h++) {\n        if(TPGDON) {\n            SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            GBREG->copyLine(h, h - 1);\n        } else {\n            line1 = (h > 1) ? pLine[-nStride2] << 4 : 0;\n            line2 = (h > 0) ? pLine[-nStride] : 0;\n            CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8);\n            for(FX_DWORD w = 0; w < GBW; w += 8) {\n                if(w + 8 < GBW) {\n                    nBits = 8;\n                    if(h > 1) {\n                        line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 4);\n                    }\n                    if(h > 0) {\n                        line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]);\n                    }\n                } else {\n                    nBits = GBW - w;\n                    if(h > 1) {\n                        line1 <<= 8;\n                    }\n                    if(h > 0) {\n                        line2 <<= 8;\n                    }\n                }\n                cVal = 0;\n                for(k = 0; k < nBits; k++) {\n                    if(USESKIP && SKIP->getPixel(w, h)) {\n                        bVal = 0;\n                    } else {\n                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                    }\n                    cVal |= bVal << (7 - k);\n                    CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal\n                              | ((line1 >> (7 - k)) & 0x0200)\n                              | ((line2 >> (8 - k)) & 0x0008);\n                }\n                pLine[w >> 3] = cVal;\n            }\n        }\n        pLine += nStride;\n    }\n    return GBREG;\n}\nCJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)\n{\n    FX_BOOL LTP, SLTP, bVal;\n    FX_DWORD CONTEXT;\n    CJBig2_Image *GBREG;\n    FX_DWORD line1, line2;\n    FX_BYTE *pLine, *pLine1, *pLine2, cVal;\n    FX_INT32 nStride, nStride2, k;\n    FX_INT32 nLineBytes, nBitsLeft, cc;\n    LTP = 0;\n    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));\n    if (GBREG->m_pData == NULL) {\n        delete GBREG;\n        m_pModule->JBig2_Error(\"Generic region decoding procedure: Create Image Failed with width = %d, height = %d\\n\", GBW, GBH);\n        return NULL;\n    }\n    pLine = GBREG->m_pData;\n    nStride = GBREG->m_nStride;\n    nStride2 = nStride << 1;\n    nLineBytes = ((GBW + 7) >> 3) - 1;\n    nBitsLeft = GBW - (nLineBytes << 3);\n    for(FX_DWORD h = 0; h < GBH; h++) {\n        if(TPGDON) {\n            SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            GBREG->copyLine(h, h - 1);\n        } else {\n            if(h > 1) {\n                pLine1 = pLine - nStride2;\n                pLine2 = pLine - nStride;\n                line1 = (*pLine1++) << 4;\n                line2 = *pLine2++;\n                CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8);\n                for(cc = 0; cc < nLineBytes; cc++) {\n                    line1 = (line1 << 8) | ((*pLine1++) << 4);\n                    line2 = (line2 << 8) | (*pLine2++);\n                    cVal = 0;\n                    for(k = 7; k >= 0; k--) {\n                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                        cVal |= bVal << k;\n                        CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal\n                                  | ((line1 >> k) & 0x0200)\n                                  | ((line2 >> (k + 1)) & 0x0008);\n                    }\n                    pLine[cc] = cVal;\n                }\n                line1 <<= 8;\n                line2 <<= 8;\n                cVal = 0;\n                for(k = 0; k < nBitsLeft; k++) {\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                    cVal |= bVal << (7 - k);\n                    CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal\n                              | ((line1 >> (7 - k)) & 0x0200)\n                              | ((line2 >> (8 - k)) & 0x0008);\n                }\n                pLine[nLineBytes] = cVal;\n            } else {\n                pLine2 = pLine - nStride;\n                line2 = (h & 1) ? (*pLine2++) : 0;\n                CONTEXT = (line2 >> 1) & 0x01f8;\n                for(cc = 0; cc < nLineBytes; cc++) {\n                    if(h & 1) {\n                        line2 = (line2 << 8) | (*pLine2++);\n                    }\n                    cVal = 0;\n                    for(k = 7; k >= 0; k--) {\n                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                        cVal |= bVal << k;\n                        CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal\n                                  | ((line2 >> (k + 1)) & 0x0008);\n                    }\n                    pLine[cc] = cVal;\n                }\n                line2 <<= 8;\n                cVal = 0;\n                for(k = 0; k < nBitsLeft; k++) {\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                    cVal |= bVal << (7 - k);\n                    CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal\n                              | ((line2 >> (8 - k)) & 0x0008);\n                }\n                pLine[nLineBytes] = cVal;\n            }\n        }\n        pLine += nStride;\n    }\n    return GBREG;\n}\nCJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)\n{\n    FX_BOOL LTP, SLTP, bVal;\n    FX_DWORD CONTEXT;\n    CJBig2_Image *GBREG;\n    FX_DWORD line1, line2, line3;\n    LTP = 0;\n    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));\n    GBREG->fill(0);\n    for(FX_DWORD h = 0; h < GBH; h++) {\n        if(TPGDON) {\n            SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            GBREG->copyLine(h, h - 1);\n        } else {\n            line1 = GBREG->getPixel(2, h - 2);\n            line1 |= GBREG->getPixel(1, h - 2) << 1;\n            line1 |= GBREG->getPixel(0, h - 2) << 2;\n            line2 = GBREG->getPixel(2, h - 1);\n            line2 |= GBREG->getPixel(1, h - 1) << 1;\n            line2 |= GBREG->getPixel(0, h - 1) << 2;\n            line3 = 0;\n            for(FX_DWORD w = 0; w < GBW; w++) {\n                if(USESKIP && SKIP->getPixel(w, h)) {\n                    bVal = 0;\n                } else {\n                    CONTEXT = line3;\n                    CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3;\n                    CONTEXT |= line2 << 4;\n                    CONTEXT |= line1 << 9;\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                }\n                if(bVal) {\n                    GBREG->setPixel(w, h, bVal);\n                }\n                line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f;\n                line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;\n                line3 = ((line3 << 1) | bVal) & 0x07;\n            }\n        }\n    }\n    return GBREG;\n}\nCJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)\n{\n    FX_BOOL LTP, SLTP, bVal;\n    FX_DWORD CONTEXT;\n    CJBig2_Image *GBREG;\n    FX_DWORD line1, line2, line3;\n    LTP = 0;\n    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));\n    GBREG->fill(0);\n    for(FX_DWORD h = 0; h < GBH; h++) {\n        if(TPGDON) {\n            SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            GBREG->copyLine(h, h - 1);\n        } else {\n            line1 = GBREG->getPixel(1, h - 2);\n            line1 |= GBREG->getPixel(0, h - 2) << 1;\n            line2 = GBREG->getPixel(2, h - 1);\n            line2 |= GBREG->getPixel(1, h - 1) << 1;\n            line2 |= GBREG->getPixel(0, h - 1) << 2;\n            line3 = 0;\n            for(FX_DWORD w = 0; w < GBW; w++) {\n                if(USESKIP && SKIP->getPixel(w, h)) {\n                    bVal = 0;\n                } else {\n                    CONTEXT = line3;\n                    CONTEXT |= line2 << 2;\n                    CONTEXT |= line1 << 7;\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                }\n                if(bVal) {\n                    GBREG->setPixel(w, h, bVal);\n                }\n                line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;\n                line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;\n                line3 = ((line3 << 1) | bVal) & 0x03;\n            }\n        }\n    }\n    return GBREG;\n}\nCJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)\n{\n    FX_BOOL LTP, SLTP, bVal;\n    FX_DWORD CONTEXT;\n    CJBig2_Image *GBREG;\n    FX_DWORD line1, line2;\n    FX_BYTE *pLine, cVal;\n    FX_INTPTR nStride, nStride2;\n    FX_INT32 nBits, k;\n    LTP = 0;\n    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));\n    if (GBREG->m_pData == NULL) {\n        delete GBREG;\n        m_pModule->JBig2_Error(\"Generic region decoding procedure: Create Image Failed with width = %d, height = %d\\n\", GBW, GBH);\n        return NULL;\n    }\n    pLine = GBREG->m_pData;\n    nStride = GBREG->m_nStride;\n    nStride2 = nStride << 1;\n    for(FX_DWORD h = 0; h < GBH; h++) {\n        if(TPGDON) {\n            SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            GBREG->copyLine(h, h - 1);\n        } else {\n            line1 = (h > 1) ? pLine[-nStride2] << 1 : 0;\n            line2 = (h > 0) ? pLine[-nStride] : 0;\n            CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c);\n            for(FX_DWORD w = 0; w < GBW; w += 8) {\n                if(w + 8 < GBW) {\n                    nBits = 8;\n                    if(h > 1) {\n                        line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 1);\n                    }\n                    if(h > 0) {\n                        line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]);\n                    }\n                } else {\n                    nBits = GBW - w;\n                    if(h > 1) {\n                        line1 <<= 8;\n                    }\n                    if(h > 0) {\n                        line2 <<= 8;\n                    }\n                }\n                cVal = 0;\n                for(k = 0; k < nBits; k++) {\n                    if(USESKIP && SKIP->getPixel(w, h)) {\n                        bVal = 0;\n                    } else {\n                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                    }\n                    cVal |= bVal << (7 - k);\n                    CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal\n                              | ((line1 >> (7 - k)) & 0x0080)\n                              | ((line2 >> (10 - k)) & 0x0004);\n                }\n                pLine[w >> 3] = cVal;\n            }\n        }\n        pLine += nStride;\n    }\n    return GBREG;\n}\nCJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)\n{\n    FX_BOOL LTP, SLTP, bVal;\n    FX_DWORD CONTEXT;\n    CJBig2_Image *GBREG;\n    FX_DWORD line1, line2;\n    FX_BYTE *pLine, *pLine1, *pLine2, cVal;\n    FX_INT32 nStride, nStride2, k;\n    FX_INT32 nLineBytes, nBitsLeft, cc;\n    LTP = 0;\n    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));\n    if (GBREG->m_pData == NULL) {\n        delete GBREG;\n        m_pModule->JBig2_Error(\"Generic region decoding procedure: Create Image Failed with width = %d, height = %d\\n\", GBW, GBH);\n        return NULL;\n    }\n    pLine = GBREG->m_pData;\n    nStride = GBREG->m_nStride;\n    nStride2 = nStride << 1;\n    nLineBytes = ((GBW + 7) >> 3) - 1;\n    nBitsLeft = GBW - (nLineBytes << 3);\n    for(FX_DWORD h = 0; h < GBH; h++) {\n        if(TPGDON) {\n            SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            GBREG->copyLine(h, h - 1);\n        } else {\n            if(h > 1) {\n                pLine1 = pLine - nStride2;\n                pLine2 = pLine - nStride;\n                line1 = (*pLine1++) << 1;\n                line2 = *pLine2++;\n                CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c);\n                for(cc = 0; cc < nLineBytes; cc++) {\n                    line1 = (line1 << 8) | ((*pLine1++) << 1);\n                    line2 = (line2 << 8) | (*pLine2++);\n                    cVal = 0;\n                    for(k = 7; k >= 0; k--) {\n                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                        cVal |= bVal << k;\n                        CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal\n                                  | ((line1 >> k) & 0x0080)\n                                  | ((line2 >> (k + 3)) & 0x0004);\n                    }\n                    pLine[cc] = cVal;\n                }\n                line1 <<= 8;\n                line2 <<= 8;\n                cVal = 0;\n                for(k = 0; k < nBitsLeft; k++) {\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                    cVal |= bVal << (7 - k);\n                    CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal\n                              | ((line1 >> (7 - k)) & 0x0080)\n                              | ((line2 >> (10 - k)) & 0x0004);\n                }\n                pLine[nLineBytes] = cVal;\n            } else {\n                pLine2 = pLine - nStride;\n                line2 = (h & 1) ? (*pLine2++) : 0;\n                CONTEXT = (line2 >> 3) & 0x007c;\n                for(cc = 0; cc < nLineBytes; cc++) {\n                    if(h & 1) {\n                        line2 = (line2 << 8) | (*pLine2++);\n                    }\n                    cVal = 0;\n                    for(k = 7; k >= 0; k--) {\n                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                        cVal |= bVal << k;\n                        CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal\n                                  | ((line2 >> (k + 3)) & 0x0004);\n                    }\n                    pLine[cc] = cVal;\n                }\n                line2 <<= 8;\n                cVal = 0;\n                for(k = 0; k < nBitsLeft; k++) {\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                    cVal |= bVal << (7 - k);\n                    CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal\n                              | (((line2 >> (10 - k))) & 0x0004);\n                }\n                pLine[nLineBytes] = cVal;\n            }\n        }\n        pLine += nStride;\n    }\n    return GBREG;\n}\nCJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)\n{\n    FX_BOOL LTP, SLTP, bVal;\n    FX_DWORD CONTEXT;\n    CJBig2_Image *GBREG;\n    FX_DWORD line1, line2, line3;\n    LTP = 0;\n    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));\n    GBREG->fill(0);\n    for(FX_DWORD h = 0; h < GBH; h++) {\n        if(TPGDON) {\n            SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            GBREG->copyLine(h, h - 1);\n        } else {\n            line1 = GBREG->getPixel(1, h - 2);\n            line1 |= GBREG->getPixel(0, h - 2) << 1;\n            line2 = GBREG->getPixel(1, h - 1);\n            line2 |= GBREG->getPixel(0, h - 1) << 1;\n            line3 = 0;\n            for(FX_DWORD w = 0; w < GBW; w++) {\n                if(USESKIP && SKIP->getPixel(w, h)) {\n                    bVal = 0;\n                } else {\n                    CONTEXT = line3;\n                    CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2;\n                    CONTEXT |= line2 << 3;\n                    CONTEXT |= line1 << 7;\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                }\n                if(bVal) {\n                    GBREG->setPixel(w, h, bVal);\n                }\n                line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;\n                line2 = ((line2 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x0f;\n                line3 = ((line3 << 1) | bVal) & 0x03;\n            }\n        }\n    }\n    return GBREG;\n}\nCJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)\n{\n    FX_BOOL LTP, SLTP, bVal;\n    FX_DWORD CONTEXT;\n    CJBig2_Image *GBREG;\n    FX_DWORD line1, line2;\n    LTP = 0;\n    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));\n    GBREG->fill(0);\n    for(FX_DWORD h = 0; h < GBH; h++) {\n        if(TPGDON) {\n            SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            GBREG->copyLine(h, h - 1);\n        } else {\n            line1 = GBREG->getPixel(2, h - 1);\n            line1 |= GBREG->getPixel(1, h - 1) << 1;\n            line1 |= GBREG->getPixel(0, h - 1) << 2;\n            line2 = 0;\n            for(FX_DWORD w = 0; w < GBW; w++) {\n                if(USESKIP && SKIP->getPixel(w, h)) {\n                    bVal = 0;\n                } else {\n                    CONTEXT = line2;\n                    CONTEXT |= line1 << 4;\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                }\n                if(bVal) {\n                    GBREG->setPixel(w, h, bVal);\n                }\n                line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x3f;\n                line2 = ((line2 << 1) | bVal) & 0x0f;\n            }\n        }\n    }\n    return GBREG;\n}\nCJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)\n{\n    FX_BOOL LTP, SLTP, bVal;\n    FX_DWORD CONTEXT;\n    CJBig2_Image *GBREG;\n    FX_DWORD line1;\n    FX_BYTE *pLine, cVal;\n    FX_INTPTR nStride, nStride2;\n    FX_INT32 nBits, k;\n    LTP = 0;\n    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));\n    if (GBREG->m_pData == NULL) {\n        delete GBREG;\n        m_pModule->JBig2_Error(\"Generic region decoding procedure: Create Image Failed with width = %d, height = %d\\n\", GBW, GBH);\n        return NULL;\n    }\n    pLine = GBREG->m_pData;\n    nStride = GBREG->m_nStride;\n    nStride2 = nStride << 1;\n    for(FX_DWORD h = 0; h < GBH; h++) {\n        if(TPGDON) {\n            SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            GBREG->copyLine(h, h - 1);\n        } else {\n            line1 = (h > 0) ? pLine[-nStride] : 0;\n            CONTEXT = (line1 >> 1) & 0x03f0;\n            for(FX_DWORD w = 0; w < GBW; w += 8) {\n                if(w + 8 < GBW) {\n                    nBits = 8;\n                    if(h > 0) {\n                        line1 = (line1 << 8) | (pLine[-nStride + (w >> 3) + 1]);\n                    }\n                } else {\n                    nBits = GBW - w;\n                    if(h > 0) {\n                        line1 <<= 8;\n                    }\n                }\n                cVal = 0;\n                for(k = 0; k < nBits; k++) {\n                    if(USESKIP && SKIP->getPixel(w, h)) {\n                        bVal = 0;\n                    } else {\n                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                    }\n                    cVal |= bVal << (7 - k);\n                    CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal\n                              | ((line1 >> (8 - k)) & 0x0010);\n                }\n                pLine[w >> 3] = cVal;\n            }\n        }\n        pLine += nStride;\n    }\n    return GBREG;\n}\nCJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)\n{\n    FX_BOOL LTP, SLTP, bVal;\n    FX_DWORD CONTEXT;\n    CJBig2_Image *GBREG;\n    FX_DWORD line1;\n    FX_BYTE *pLine, *pLine1, cVal;\n    FX_INT32 nStride, k;\n    FX_INT32 nLineBytes, nBitsLeft, cc;\n    LTP = 0;\n    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));\n    if (GBREG->m_pData == NULL) {\n        delete GBREG;\n        m_pModule->JBig2_Error(\"Generic region decoding procedure: Create Image Failed with width = %d, height = %d\\n\", GBW, GBH);\n        return NULL;\n    }\n    pLine = GBREG->m_pData;\n    nStride = GBREG->m_nStride;\n    nLineBytes = ((GBW + 7) >> 3) - 1;\n    nBitsLeft = GBW - (nLineBytes << 3);\n    for(FX_DWORD h = 0; h < GBH; h++) {\n        if(TPGDON) {\n            SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            GBREG->copyLine(h, h - 1);\n        } else {\n            if(h > 0) {\n                pLine1 = pLine - nStride;\n                line1 = *pLine1++;\n                CONTEXT = (line1 >> 1) & 0x03f0;\n                for(cc = 0; cc < nLineBytes; cc++) {\n                    line1 = (line1 << 8) | (*pLine1++);\n                    cVal = 0;\n                    for(k = 7; k >= 0; k--) {\n                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                        cVal |= bVal << k;\n                        CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal\n                                  | ((line1 >> (k + 1)) & 0x0010);\n                    }\n                    pLine[cc] = cVal;\n                }\n                line1 <<= 8;\n                cVal = 0;\n                for(k = 0; k < nBitsLeft; k++) {\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                    cVal |= bVal << (7 - k);\n                    CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal\n                              | ((line1 >> (8 - k)) & 0x0010);\n                }\n                pLine[nLineBytes] = cVal;\n            } else {\n                CONTEXT = 0;\n                for(cc = 0; cc < nLineBytes; cc++) {\n                    cVal = 0;\n                    for(k = 7; k >= 0; k--) {\n                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                        cVal |= bVal << k;\n                        CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;\n                    }\n                    pLine[cc] = cVal;\n                }\n                cVal = 0;\n                for(k = 0; k < nBitsLeft; k++) {\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                    cVal |= bVal << (7 - k);\n                    CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;\n                }\n                pLine[nLineBytes] = cVal;\n            }\n        }\n        pLine += nStride;\n    }\n    return GBREG;\n}\nCJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)\n{\n    FX_BOOL LTP, SLTP, bVal;\n    FX_DWORD CONTEXT;\n    CJBig2_Image *GBREG;\n    FX_DWORD line1, line2;\n    LTP = 0;\n    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));\n    GBREG->fill(0);\n    for(FX_DWORD h = 0; h < GBH; h++) {\n        if(TPGDON) {\n            SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            GBREG->copyLine(h, h - 1);\n        } else {\n            line1 = GBREG->getPixel(1, h - 1);\n            line1 |= GBREG->getPixel(0, h - 1) << 1;\n            line2 = 0;\n            for(FX_DWORD w = 0; w < GBW; w++) {\n                if(USESKIP && SKIP->getPixel(w, h)) {\n                    bVal = 0;\n                } else {\n                    CONTEXT = line2;\n                    CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;\n                    CONTEXT |= line1 << 5;\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                }\n                if(bVal) {\n                    GBREG->setPixel(w, h, bVal);\n                }\n                line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x1f;\n                line2 = ((line2 << 1) | bVal) & 0x0f;\n            }\n        }\n    }\n    return GBREG;\n}\nCJBig2_Image *CJBig2_GRDProc::decode_Arith_V2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)\n{\n    FX_BOOL LTP, SLTP, bVal;\n    FX_DWORD CONTEXT;\n    CJBig2_Image *GBREG;\n    FX_DWORD line1, line2, line3;\n    LTP = 0;\n    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));\n    GBREG->fill(0);\n    for(FX_DWORD h = 0; h < GBH; h++) {\n        if(TPGDON) {\n            switch(GBTEMPLATE) {\n                case 0:\n                    CONTEXT = 0x9b25;\n                    break;\n                case 1:\n                    CONTEXT = 0x0795;\n                    break;\n                case 2:\n                    CONTEXT = 0x00e5;\n                    break;\n                case 3:\n                    CONTEXT = 0x0195;\n                    break;\n            }\n            SLTP = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            GBREG->copyLine(h, h - 1);\n        } else {\n            switch(GBTEMPLATE) {\n                case 0: {\n                        line1 = GBREG->getPixel(1, h - 2);\n                        line1 |= GBREG->getPixel(0, h - 2) << 1;\n                        line2 = GBREG->getPixel(2, h - 1);\n                        line2 |= GBREG->getPixel(1, h - 1) << 1;\n                        line2 |= GBREG->getPixel(0, h - 1) << 2;\n                        line3 = 0;\n                        for(FX_DWORD w = 0; w < GBW; w++) {\n                            if(USESKIP && SKIP->getPixel(w, h)) {\n                                bVal = 0;\n                            } else {\n                                CONTEXT = line3;\n                                CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;\n                                CONTEXT |= line2 << 5;\n                                CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10;\n                                CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11;\n                                CONTEXT |= line1 << 12;\n                                CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15;\n                                bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                            }\n                            if(bVal) {\n                                GBREG->setPixel(w, h, bVal);\n                            }\n                            line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;\n                            line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;\n                            line3 = ((line3 << 1) | bVal) & 0x0f;\n                        }\n                    }\n                    break;\n                case 1: {\n                        line1 = GBREG->getPixel(2, h - 2);\n                        line1 |= GBREG->getPixel(1, h - 2) << 1;\n                        line1 |= GBREG->getPixel(0, h - 2) << 2;\n                        line2 = GBREG->getPixel(2, h - 1);\n                        line2 |= GBREG->getPixel(1, h - 1) << 1;\n                        line2 |= GBREG->getPixel(0, h - 1) << 2;\n                        line3 = 0;\n                        for(FX_DWORD w = 0; w < GBW; w++) {\n                            if(USESKIP && SKIP->getPixel(w, h)) {\n                                bVal = 0;\n                            } else {\n                                CONTEXT = line3;\n                                CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3;\n                                CONTEXT |= line2 << 4;\n                                CONTEXT |= line1 << 9;\n                                bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                            }\n                            if(bVal) {\n                                GBREG->setPixel(w, h, bVal);\n                            }\n                            line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f;\n                            line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;\n                            line3 = ((line3 << 1) | bVal) & 0x07;\n                        }\n                    }\n                    break;\n                case 2: {\n                        line1 = GBREG->getPixel(1, h - 2);\n                        line1 |= GBREG->getPixel(0, h - 2) << 1;\n                        line2 = GBREG->getPixel(1, h - 1);\n                        line2 |= GBREG->getPixel(0, h - 1) << 1;\n                        line3 = 0;\n                        for(FX_DWORD w = 0; w < GBW; w++) {\n                            if(USESKIP && SKIP->getPixel(w, h)) {\n                                bVal = 0;\n                            } else {\n                                CONTEXT = line3;\n                                CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2;\n                                CONTEXT |= line2 << 3;\n                                CONTEXT |= line1 << 7;\n                                bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                            }\n                            if(bVal) {\n                                GBREG->setPixel(w, h, bVal);\n                            }\n                            line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;\n                            line2 = ((line2 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x0f;\n                            line3 = ((line3 << 1) | bVal) & 0x03;\n                        }\n                    }\n                    break;\n                case 3: {\n                        line1 = GBREG->getPixel(1, h - 1);\n                        line1 |= GBREG->getPixel(0, h - 1) << 1;\n                        line2 = 0;\n                        for(FX_DWORD w = 0; w < GBW; w++) {\n                            if(USESKIP && SKIP->getPixel(w, h)) {\n                                bVal = 0;\n                            } else {\n                                CONTEXT = line2;\n                                CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;\n                                CONTEXT |= line1 << 5;\n                                bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                            }\n                            if(bVal) {\n                                GBREG->setPixel(w, h, bVal);\n                            }\n                            line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x1f;\n                            line2 = ((line2 << 1) | bVal) & 0x0f;\n                        }\n                    }\n                    break;\n            }\n        }\n    }\n    return GBREG;\n}\nCJBig2_Image *CJBig2_GRDProc::decode_Arith_V1(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)\n{\n    FX_BOOL LTP, SLTP, bVal;\n    FX_DWORD CONTEXT = 0;\n    CJBig2_Image *GBREG;\n    LTP = 0;\n    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));\n    GBREG->fill(0);\n    for(FX_DWORD h = 0; h < GBH; h++) {\n        if(TPGDON) {\n            switch(GBTEMPLATE) {\n                case 0:\n                    CONTEXT = 0x9b25;\n                    break;\n                case 1:\n                    CONTEXT = 0x0795;\n                    break;\n                case 2:\n                    CONTEXT = 0x00e5;\n                    break;\n                case 3:\n                    CONTEXT = 0x0195;\n                    break;\n            }\n            SLTP = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            for(FX_DWORD w = 0; w < GBW; w++) {\n                GBREG->setPixel(w, h, GBREG->getPixel(w, h - 1));\n            }\n        } else {\n            for(FX_DWORD w = 0; w < GBW; w++) {\n                if(USESKIP && SKIP->getPixel(w, h)) {\n                    GBREG->setPixel(w, h, 0);\n                } else {\n                    CONTEXT = 0;\n                    switch(GBTEMPLATE) {\n                        case 0:\n                            CONTEXT |= GBREG->getPixel(w - 1, h);\n                            CONTEXT |= GBREG->getPixel(w - 2, h) << 1;\n                            CONTEXT |= GBREG->getPixel(w - 3, h) << 2;\n                            CONTEXT |= GBREG->getPixel(w - 4, h) << 3;\n                            CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;\n                            CONTEXT |= GBREG->getPixel(w + 2, h - 1) << 5;\n                            CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 6;\n                            CONTEXT |= GBREG->getPixel(w, h - 1) << 7;\n                            CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 8;\n                            CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 9;\n                            CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10;\n                            CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11;\n                            CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 12;\n                            CONTEXT |= GBREG->getPixel(w, h - 2) << 13;\n                            CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 14;\n                            CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15;\n                            break;\n                        case 1:\n                            CONTEXT |= GBREG->getPixel(w - 1, h);\n                            CONTEXT |= GBREG->getPixel(w - 2, h) << 1;\n                            CONTEXT |= GBREG->getPixel(w - 3, h) << 2;\n                            CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3;\n                            CONTEXT |= GBREG->getPixel(w + 2, h - 1) << 4;\n                            CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 5;\n                            CONTEXT |= GBREG->getPixel(w, h - 1) << 6;\n                            CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 7;\n                            CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 8;\n                            CONTEXT |= GBREG->getPixel(w + 2, h - 2) << 9;\n                            CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 10;\n                            CONTEXT |= GBREG->getPixel(w, h - 2) << 11;\n                            CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 12;\n                            break;\n                        case 2:\n                            CONTEXT |= GBREG->getPixel(w - 1, h);\n                            CONTEXT |= GBREG->getPixel(w - 2, h) << 1;\n                            CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2;\n                            CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 3;\n                            CONTEXT |= GBREG->getPixel(w, h - 1) << 4;\n                            CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 5;\n                            CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 6;\n                            CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 7;\n                            CONTEXT |= GBREG->getPixel(w, h - 2) << 8;\n                            CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 9;\n                            break;\n                        case 3:\n                            CONTEXT |= GBREG->getPixel(w - 1, h);\n                            CONTEXT |= GBREG->getPixel(w - 2, h) << 1;\n                            CONTEXT |= GBREG->getPixel(w - 3, h) << 2;\n                            CONTEXT |= GBREG->getPixel(w - 4, h) << 3;\n                            CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;\n                            CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 5;\n                            CONTEXT |= GBREG->getPixel(w, h - 1) << 6;\n                            CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 7;\n                            CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 8;\n                            CONTEXT |= GBREG->getPixel(w - 3, h - 1) << 9;\n                            break;\n                    }\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                    GBREG->setPixel(w, h, bVal);\n                }\n            }\n        }\n    }\n    return GBREG;\n}\nCJBig2_Image *CJBig2_GRDProc::decode_MMR(CJBig2_BitStream *pStream)\n{\n    int bitpos, i;\n    CJBig2_Image *pImage;\n    JBIG2_ALLOC(pImage, CJBig2_Image(GBW, GBH));\n    if (pImage->m_pData == NULL) {\n        delete pImage;\n        m_pModule->JBig2_Error(\"Generic region decoding procedure: Create Image Failed with width = %d, height = %d\\n\", GBW, GBH);\n        return NULL;\n    }\n    bitpos = (int)pStream->getBitPos();\n    _FaxG4Decode(m_pModule, pStream->getBuf(), pStream->getLength(), &bitpos, pImage->m_pData, GBW, GBH, pImage->m_nStride);\n    pStream->setBitPos(bitpos);\n    for(i = 0; (FX_DWORD)i < pImage->m_nStride * GBH; i++) {\n        pImage->m_pData[i] = ~pImage->m_pData[i];\n    }\n    return pImage;\n}\nCJBig2_Image *CJBig2_GRRDProc::decode(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)\n{\n    if (GRW == 0 || GRH == 0) {\n        CJBig2_Image* pImage;\n        JBIG2_ALLOC(pImage, CJBig2_Image(GRW, GRH));\n        return pImage;\n    }\n    if(GRTEMPLATE == 0) {\n        if((GRAT[0] == (signed char) - 1) && (GRAT[1] == (signed char) - 1)\n                && (GRAT[2] == (signed char) - 1) && (GRAT[3] == (signed char) - 1)\n                && (GRREFERENCEDX == 0) && (GRW == (FX_DWORD)GRREFERENCE->m_nWidth)) {\n            return decode_Template0_opt(pArithDecoder, grContext);\n        } else {\n            return decode_Template0_unopt(pArithDecoder, grContext);\n        }\n    } else {\n        if((GRREFERENCEDX == 0) && (GRW == (FX_DWORD)GRREFERENCE->m_nWidth)) {\n            return decode_Template1_opt(pArithDecoder, grContext);\n        } else {\n            return decode_Template1_unopt(pArithDecoder, grContext);\n        }\n    }\n}\nCJBig2_Image *CJBig2_GRRDProc::decode_Template0_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)\n{\n    FX_BOOL LTP, SLTP, bVal;\n    FX_DWORD CONTEXT;\n    CJBig2_Image *GRREG;\n    FX_DWORD line1, line2, line3, line4, line5;\n    LTP = 0;\n    JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));\n    GRREG->fill(0);\n    for(FX_DWORD h = 0; h < GRH; h++) {\n        if(TPGRON) {\n            SLTP = pArithDecoder->DECODE(&grContext[0x0010]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 0) {\n            line1 = GRREG->getPixel(1, h - 1);\n            line1 |= GRREG->getPixel(0, h - 1) << 1;\n            line2 = 0;\n            line3 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY - 1);\n            line3 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1) << 1;\n            line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY);\n            line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;\n            line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) << 2;\n            line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);\n            line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;\n            line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2;\n            for(FX_DWORD w = 0; w < GRW; w++) {\n                CONTEXT = line5;\n                CONTEXT |= line4 << 3;\n                CONTEXT |= line3 << 6;\n                CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8;\n                CONTEXT |= line2 << 9;\n                CONTEXT |= line1 << 10;\n                CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;\n                bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);\n                GRREG->setPixel(w, h, bVal);\n                line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x03;\n                line2 = ((line2 << 1) | bVal) & 0x01;\n                line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY - 1)) & 0x03;\n                line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07;\n                line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x07;\n            }\n        } else {\n            line1 = GRREG->getPixel(1, h - 1);\n            line1 |= GRREG->getPixel(0, h - 1) << 1;\n            line2 = 0;\n            line3 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY - 1);\n            line3 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1) << 1;\n            line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY);\n            line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;\n            line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) << 2;\n            line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);\n            line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;\n            line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2;\n            for(FX_DWORD w = 0; w < GRW; w++) {\n                bVal = GRREFERENCE->getPixel(w, h);\n                if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1))\n                        && (bVal == GRREFERENCE->getPixel(w, h - 1))\n                        && (bVal == GRREFERENCE->getPixel(w + 1, h - 1))\n                        && (bVal == GRREFERENCE->getPixel(w - 1, h))\n                        && (bVal == GRREFERENCE->getPixel(w + 1, h))\n                        && (bVal == GRREFERENCE->getPixel(w - 1, h + 1))\n                        && (bVal == GRREFERENCE->getPixel(w, h + 1))\n                        && (bVal == GRREFERENCE->getPixel(w + 1, h + 1)))) {\n                    CONTEXT = line5;\n                    CONTEXT |= line4 << 3;\n                    CONTEXT |= line3 << 6;\n                    CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8;\n                    CONTEXT |= line2 << 9;\n                    CONTEXT |= line1 << 10;\n                    CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;\n                    bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);\n                }\n                GRREG->setPixel(w, h, bVal);\n                line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x03;\n                line2 = ((line2 << 1) | bVal) & 0x01;\n                line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY - 1)) & 0x03;\n                line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07;\n                line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x07;\n            }\n        }\n    }\n    return GRREG;\n}\nCJBig2_Image *CJBig2_GRRDProc::decode_Template0_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)\n{\n    FX_BOOL LTP, SLTP, bVal;\n    FX_DWORD CONTEXT;\n    CJBig2_Image *GRREG;\n    FX_DWORD line1, line1_r, line2_r, line3_r;\n    FX_BYTE *pLine, *pLineR, cVal;\n    FX_INTPTR nStride, nStrideR, nOffset;\n    FX_INT32 k, nBits;\n    FX_INT32 GRWR, GRHR;\n    FX_INT32 GRW, GRH;\n    GRW = (FX_INT32)CJBig2_GRRDProc::GRW;\n    GRH = (FX_INT32)CJBig2_GRRDProc::GRH;\n    LTP = 0;\n    JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));\n    if (GRREG->m_pData == NULL) {\n        delete GRREG;\n        m_pModule->JBig2_Error(\"Generic refinement region decoding procedure: Create Image Failed with width = %d, height = %d\\n\", GRW, GRH);\n        return NULL;\n    }\n    pLine = GRREG->m_pData;\n    pLineR = GRREFERENCE->m_pData;\n    nStride = GRREG->m_nStride;\n    nStrideR = GRREFERENCE->m_nStride;\n    GRWR = (FX_INT32)GRREFERENCE->m_nWidth;\n    GRHR = (FX_INT32)GRREFERENCE->m_nHeight;\n    if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) {\n        GRREFERENCEDY = 0;\n    }\n    nOffset = -GRREFERENCEDY * nStrideR;\n    for (FX_INT32 h = 0; h < GRH; h++) {\n        if(TPGRON) {\n            SLTP = pArithDecoder->DECODE(&grContext[0x0010]);\n            LTP = LTP ^ SLTP;\n        }\n        line1 = (h > 0) ? pLine[-nStride] << 4 : 0;\n        FX_INT32 reference_h = h - GRREFERENCEDY;\n        FX_BOOL line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1);\n        FX_BOOL line2_r_ok = (reference_h > -1 && reference_h < GRHR);\n        FX_BOOL line3_r_ok = (reference_h > -2 && reference_h < GRHR - 1);\n        line1_r = line1_r_ok ? pLineR[nOffset - nStrideR] : 0;\n        line2_r = line2_r_ok ? pLineR[nOffset] : 0;\n        line3_r = line3_r_ok ? pLineR[nOffset + nStrideR] : 0;\n        if(LTP == 0) {\n            CONTEXT = (line1 & 0x1c00) | (line1_r & 0x01c0)\n                      | ((line2_r >> 3) & 0x0038) | ((line3_r >> 6) & 0x0007);\n            for (FX_INT32 w = 0; w < GRW; w += 8) {\n                nBits = GRW - w > 8 ? 8 : GRW - w;\n                if (h > 0)\n                    line1 = (line1 << 8) |\n                            (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 4 : 0);\n                if (h > GRHR + GRREFERENCEDY + 1) {\n                    line1_r = 0;\n                    line2_r  = 0;\n                    line3_r = 0;\n                } else {\n                    if(line1_r_ok)\n                        line1_r = (line1_r << 8) |\n                                  (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);\n                    if(line2_r_ok)\n                        line2_r = (line2_r << 8) |\n                                  (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0);\n                    if(line3_r_ok)\n                        line3_r = (line3_r << 8) |\n                                  (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);\n                    else {\n                        line3_r = 0;\n                    }\n                }\n                cVal = 0;\n                for (k = 0; k < nBits; k++) {\n                    bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);\n                    cVal |= bVal << (7 - k);\n                    CONTEXT = ((CONTEXT & 0x0cdb) << 1) | (bVal << 9) |\n                              ((line1 >> (7 - k)) & 0x0400) |\n                              ((line1_r >> (7 - k)) & 0x0040) |\n                              ((line2_r >> (10 - k)) & 0x0008) |\n                              ((line3_r >> (13 - k)) & 0x0001);\n                }\n                pLine[w >> 3] = cVal;\n            }\n        } else {\n            CONTEXT = (line1 & 0x1c00) | (line1_r & 0x01c0)\n                      | ((line2_r >> 3) & 0x0038) | ((line3_r >> 6) & 0x0007);\n            for (FX_INT32 w = 0; w < GRW; w += 8) {\n                nBits = GRW - w > 8 ? 8 : GRW - w;\n                if (h > 0)\n                    line1 = (line1 << 8) |\n                            (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 4 : 0);\n                if(line1_r_ok)\n                    line1_r = (line1_r << 8) |\n                              (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);\n                if(line2_r_ok)\n                    line2_r = (line2_r << 8) |\n                              (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0);\n                if(line3_r_ok)\n                    line3_r = (line3_r << 8) |\n                              (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);\n                else {\n                    line3_r = 0;\n                }\n                cVal = 0;\n                for (k = 0; k < nBits; k++) {\n                    bVal = GRREFERENCE->getPixel(w + k, h);\n                    if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w + k - 1, h - 1))\n                            && (bVal == GRREFERENCE->getPixel(w + k, h - 1))\n                            && (bVal == GRREFERENCE->getPixel(w + k + 1, h - 1))\n                            && (bVal == GRREFERENCE->getPixel(w + k - 1, h))\n                            && (bVal == GRREFERENCE->getPixel(w + k + 1, h))\n                            && (bVal == GRREFERENCE->getPixel(w + k - 1, h + 1))\n                            && (bVal == GRREFERENCE->getPixel(w + k, h + 1))\n                            && (bVal == GRREFERENCE->getPixel(w + k + 1, h + 1)))) {\n                        bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);\n                    }\n                    cVal |= bVal << (7 - k);\n                    CONTEXT = ((CONTEXT & 0x0cdb) << 1) | (bVal << 9) |\n                              ((line1 >> (7 - k)) & 0x0400) |\n                              ((line1_r >> (7 - k)) & 0x0040) |\n                              ((line2_r >> (10 - k)) & 0x0008) |\n                              ((line3_r >> (13 - k)) & 0x0001);\n                }\n                pLine[w >> 3] = cVal;\n            }\n        }\n        pLine += nStride;\n        if (h < GRHR + GRREFERENCEDY) {\n            pLineR += nStrideR;\n        }\n    }\n    return GRREG;\n}\nCJBig2_Image *CJBig2_GRRDProc::decode_Template1_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)\n{\n    FX_BOOL LTP, SLTP, bVal;\n    FX_DWORD CONTEXT;\n    CJBig2_Image *GRREG;\n    FX_DWORD line1, line2, line3, line4, line5;\n    LTP = 0;\n    JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));\n    GRREG->fill(0);\n    for(FX_DWORD h = 0; h < GRH; h++) {\n        if(TPGRON) {\n            SLTP = pArithDecoder->DECODE(&grContext[0x0008]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 0) {\n            line1 = GRREG->getPixel(1, h - 1);\n            line1 |= GRREG->getPixel(0, h - 1) << 1;\n            line1 |= GRREG->getPixel(-1, h - 1) << 2;\n            line2 = 0;\n            line3 = GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1);\n            line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY);\n            line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;\n            line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) << 2;\n            line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);\n            line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;\n            for(FX_DWORD w = 0; w < GRW; w++) {\n                CONTEXT = line5;\n                CONTEXT |= line4 << 2;\n                CONTEXT |= line3 << 5;\n                CONTEXT |= line2 << 6;\n                CONTEXT |= line1 << 7;\n                bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);\n                GRREG->setPixel(w, h, bVal);\n                line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x07;\n                line2 = ((line2 << 1) | bVal) & 0x01;\n                line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1)) & 0x01;\n                line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07;\n                line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x03;\n            }\n        } else {\n            line1 = GRREG->getPixel(1, h - 1);\n            line1 |= GRREG->getPixel(0, h - 1) << 1;\n            line1 |= GRREG->getPixel(-1, h - 1) << 2;\n            line2 = 0;\n            line3 = GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1);\n            line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY);\n            line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;\n            line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) << 2;\n            line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);\n            line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;\n            for(FX_DWORD w = 0; w < GRW; w++) {\n                bVal = GRREFERENCE->getPixel(w, h);\n                if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1))\n                        && (bVal == GRREFERENCE->getPixel(w, h - 1))\n                        && (bVal == GRREFERENCE->getPixel(w + 1, h - 1))\n                        && (bVal == GRREFERENCE->getPixel(w - 1, h))\n                        && (bVal == GRREFERENCE->getPixel(w + 1, h))\n                        && (bVal == GRREFERENCE->getPixel(w - 1, h + 1))\n                        && (bVal == GRREFERENCE->getPixel(w, h + 1))\n                        && (bVal == GRREFERENCE->getPixel(w + 1, h + 1)))) {\n                    CONTEXT = line5;\n                    CONTEXT |= line4 << 2;\n                    CONTEXT |= line3 << 5;\n                    CONTEXT |= line2 << 6;\n                    CONTEXT |= line1 << 7;\n                    bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);\n                }\n                GRREG->setPixel(w, h, bVal);\n                line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x07;\n                line2 = ((line2 << 1) | bVal) & 0x01;\n                line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1)) & 0x01;\n                line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07;\n                line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x03;\n            }\n        }\n    }\n    return GRREG;\n}\nCJBig2_Image *CJBig2_GRRDProc::decode_Template1_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)\n{\n    FX_BOOL LTP, SLTP, bVal;\n    FX_DWORD CONTEXT;\n    CJBig2_Image *GRREG;\n    FX_DWORD line1, line1_r, line2_r, line3_r;\n    FX_BYTE *pLine, *pLineR, cVal;\n    FX_INTPTR nStride, nStrideR, nOffset;\n    FX_INT32 k, nBits;\n    FX_INT32 GRWR, GRHR;\n    FX_INT32 GRW, GRH;\n    GRW = (FX_INT32)CJBig2_GRRDProc::GRW;\n    GRH = (FX_INT32)CJBig2_GRRDProc::GRH;\n    LTP = 0;\n    JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));\n    if (GRREG->m_pData == NULL) {\n        delete GRREG;\n        m_pModule->JBig2_Error(\"Generic refinement region decoding procedure: Create Image Failed with width = %d, height = %d\\n\", GRW, GRH);\n        return NULL;\n    }\n    pLine = GRREG->m_pData;\n    pLineR = GRREFERENCE->m_pData;\n    nStride = GRREG->m_nStride;\n    nStrideR = GRREFERENCE->m_nStride;\n    GRWR = (FX_INT32)GRREFERENCE->m_nWidth;\n    GRHR = (FX_INT32)GRREFERENCE->m_nHeight;\n    if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) {\n        GRREFERENCEDY = 0;\n    }\n    nOffset = -GRREFERENCEDY * nStrideR;\n    for (FX_INT32 h = 0; h < GRH; h++) {\n        if(TPGRON) {\n            SLTP = pArithDecoder->DECODE(&grContext[0x0008]);\n            LTP = LTP ^ SLTP;\n        }\n        line1 = (h > 0) ? pLine[-nStride] << 1 : 0;\n        FX_INT32 reference_h = h - GRREFERENCEDY;\n        FX_BOOL line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1);\n        FX_BOOL line2_r_ok = (reference_h > -1 && reference_h < GRHR);\n        FX_BOOL line3_r_ok = (reference_h > -2 && reference_h < GRHR - 1);\n        line1_r = line1_r_ok ? pLineR[nOffset - nStrideR] : 0;\n        line2_r = line2_r_ok ? pLineR[nOffset] : 0;\n        line3_r = line3_r_ok ? pLineR[nOffset + nStrideR] : 0;\n        if(LTP == 0) {\n            CONTEXT = (line1 & 0x0380) | ((line1_r >> 2) & 0x0020)\n                      | ((line2_r >> 4) & 0x001c) | ((line3_r >> 6) & 0x0003);\n            for (FX_INT32 w = 0; w < GRW; w += 8) {\n                nBits = GRW - w > 8 ? 8 : GRW - w;\n                if (h > 0)\n                    line1 = (line1 << 8) |\n                            (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 1 : 0);\n                if(line1_r_ok)\n                    line1_r = (line1_r << 8) |\n                              (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);\n                if(line2_r_ok)\n                    line2_r = (line2_r << 8) |\n                              (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0);\n                if(line3_r_ok)\n                    line3_r = (line3_r << 8) |\n                              (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);\n                else {\n                    line3_r = 0;\n                }\n                cVal = 0;\n                for (k = 0; k < nBits; k++) {\n                    bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);\n                    cVal |= bVal << (7 - k);\n                    CONTEXT = ((CONTEXT & 0x018d) << 1) | (bVal << 6) |\n                              ((line1 >> (7 - k)) & 0x0080) |\n                              ((line1_r >> (9 - k)) & 0x0020) |\n                              ((line2_r >> (11 - k)) & 0x0004) |\n                              ((line3_r >> (13 - k)) & 0x0001);\n                }\n                pLine[w >> 3] = cVal;\n            }\n        } else {\n            CONTEXT = (line1 & 0x0380) | ((line1_r >> 2) & 0x0020)\n                      | ((line2_r >> 4) & 0x001c) | ((line3_r >> 6) & 0x0003);\n            for (FX_INT32 w = 0; w < GRW; w += 8) {\n                nBits = GRW - w > 8 ? 8 : GRW - w;\n                if (h > 0)\n                    line1 = (line1 << 8) |\n                            (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 1 : 0);\n                if(line1_r_ok)\n                    line1_r = (line1_r << 8) |\n                              (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);\n                if(line2_r_ok)\n                    line2_r = (line2_r << 8) |\n                              (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0);\n                if(line3_r_ok)\n                    line3_r = (line3_r << 8) |\n                              (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);\n                else {\n                    line3_r = 0;\n                }\n                cVal = 0;\n                for (k = 0; k < nBits; k++) {\n                    bVal = GRREFERENCE->getPixel(w + k, h);\n                    if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w + k - 1, h - 1))\n                            && (bVal == GRREFERENCE->getPixel(w + k, h - 1))\n                            && (bVal == GRREFERENCE->getPixel(w + k + 1, h - 1))\n                            && (bVal == GRREFERENCE->getPixel(w + k - 1, h))\n                            && (bVal == GRREFERENCE->getPixel(w + k + 1, h))\n                            && (bVal == GRREFERENCE->getPixel(w + k - 1, h + 1))\n                            && (bVal == GRREFERENCE->getPixel(w + k, h + 1))\n                            && (bVal == GRREFERENCE->getPixel(w + k + 1, h + 1)))) {\n                        bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);\n                    }\n                    cVal |= bVal << (7 - k);\n                    CONTEXT = ((CONTEXT & 0x018d) << 1) | (bVal << 6) |\n                              ((line1 >> (7 - k)) & 0x0080) |\n                              ((line1_r >> (9 - k)) & 0x0020) |\n                              ((line2_r >> (11 - k)) & 0x0004) |\n                              ((line3_r >> (13 - k)) & 0x0001);\n                }\n                pLine[w >> 3] = cVal;\n            }\n        }\n        pLine += nStride;\n        if (h < GRHR + GRREFERENCEDY) {\n            pLineR += nStrideR;\n        }\n    }\n    return GRREG;\n}\nCJBig2_Image *CJBig2_GRRDProc::decode_V1(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)\n{\n    FX_BOOL LTP, SLTP, bVal;\n    FX_BOOL TPGRPIX, TPGRVAL;\n    FX_DWORD CONTEXT;\n    CJBig2_Image *GRREG;\n    LTP = 0;\n    JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));\n    GRREG->fill(0);\n    for(FX_DWORD h = 0; h < GRH; h++) {\n        if(TPGRON) {\n            switch(GRTEMPLATE) {\n                case 0:\n                    CONTEXT = 0x0010;\n                    break;\n                case 1:\n                    CONTEXT = 0x0008;\n                    break;\n            }\n            SLTP = pArithDecoder->DECODE(&grContext[CONTEXT]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 0) {\n            for(FX_DWORD w = 0; w < GRW; w++) {\n                CONTEXT = 0;\n                switch(GRTEMPLATE) {\n                    case 0:\n                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);\n                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;\n                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2;\n                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 3;\n                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 4;\n                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 5;\n                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1) << 6;\n                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 7;\n                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8;\n                        CONTEXT |= GRREG->getPixel(w - 1, h) << 9;\n                        CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 10;\n                        CONTEXT |= GRREG->getPixel(w, h - 1) << 11;\n                        CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;\n                        break;\n                    case 1:\n                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);\n                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;\n                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 2;\n                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 3;\n                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 4;\n                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 5;\n                        CONTEXT |= GRREG->getPixel(w - 1, h) << 6;\n                        CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 7;\n                        CONTEXT |= GRREG->getPixel(w, h - 1) << 8;\n                        CONTEXT |= GRREG->getPixel(w - 1, h - 1) << 9;\n                        break;\n                }\n                bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);\n                GRREG->setPixel(w, h, bVal);\n            }\n        } else {\n            for(FX_DWORD w = 0; w < GRW; w++) {\n                bVal = GRREFERENCE->getPixel(w, h);\n                if(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1))\n                        && (bVal == GRREFERENCE->getPixel(w, h - 1))\n                        && (bVal == GRREFERENCE->getPixel(w + 1, h - 1))\n                        && (bVal == GRREFERENCE->getPixel(w - 1, h))\n                        && (bVal == GRREFERENCE->getPixel(w + 1, h))\n                        && (bVal == GRREFERENCE->getPixel(w - 1, h + 1))\n                        && (bVal == GRREFERENCE->getPixel(w, h + 1))\n                        && (bVal == GRREFERENCE->getPixel(w + 1, h + 1))) {\n                    TPGRPIX = 1;\n                    TPGRVAL = bVal;\n                } else {\n                    TPGRPIX = 0;\n                }\n                if(TPGRPIX) {\n                    GRREG->setPixel(w, h, TPGRVAL);\n                } else {\n                    CONTEXT = 0;\n                    switch(GRTEMPLATE) {\n                        case 0:\n                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);\n                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;\n                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2;\n                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 3;\n                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 4;\n                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 5;\n                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1) << 6;\n                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 7;\n                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8;\n                            CONTEXT |= GRREG->getPixel(w - 1, h) << 9;\n                            CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 10;\n                            CONTEXT |= GRREG->getPixel(w, h - 1) << 11;\n                            CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;\n                            break;\n                        case 1:\n                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);\n                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;\n                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 2;\n                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 3;\n                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 4;\n                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 5;\n                            CONTEXT |= GRREG->getPixel(w - 1, h) << 6;\n                            CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 7;\n                            CONTEXT |= GRREG->getPixel(w, h - 1) << 8;\n                            CONTEXT |= GRREG->getPixel(w - 1, h - 1) << 9;\n                            break;\n                    }\n                    bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);\n                    GRREG->setPixel(w, h, bVal);\n                }\n            }\n        }\n    }\n    return GRREG;\n}\nCJBig2_Image *CJBig2_TRDProc::decode_Huffman(CJBig2_BitStream *pStream, JBig2ArithCtx *grContext)\n{\n    FX_INT32 STRIPT, FIRSTS;\n    FX_DWORD NINSTANCES;\n    FX_INT32 DT, DFS, CURS;\n    FX_BYTE CURT;\n    FX_INT32 SI, TI;\n    FX_DWORD IDI;\n    CJBig2_Image *IBI;\n    FX_DWORD WI, HI;\n    FX_INT32 IDS;\n    FX_BOOL RI;\n    FX_INT32 RDWI, RDHI, RDXI, RDYI;\n    CJBig2_Image *IBOI;\n    FX_DWORD WOI, HOI;\n    CJBig2_Image *SBREG;\n    FX_BOOL bFirst;\n    FX_DWORD nTmp;\n    FX_INT32 nVal, nBits;\n    CJBig2_HuffmanDecoder *pHuffmanDecoder;\n    CJBig2_GRRDProc *pGRRD;\n    CJBig2_ArithDecoder *pArithDecoder;\n    JBIG2_ALLOC(pHuffmanDecoder, CJBig2_HuffmanDecoder(pStream));\n    JBIG2_ALLOC(SBREG, CJBig2_Image(SBW, SBH));\n    SBREG->fill(SBDEFPIXEL);\n    if(pHuffmanDecoder->decodeAValue(SBHUFFDT, &STRIPT) != 0) {\n        m_pModule->JBig2_Error(\"text region decoding procedure (huffman): too short.\");\n        goto failed;\n    }\n    STRIPT *= SBSTRIPS;\n    STRIPT = -STRIPT;\n    FIRSTS = 0;\n    NINSTANCES = 0;\n    while(NINSTANCES < SBNUMINSTANCES) {\n        if(pHuffmanDecoder->decodeAValue(SBHUFFDT, &DT) != 0) {\n            m_pModule->JBig2_Error(\"text region decoding procedure (huffman): too short.\");\n            goto failed;\n        }\n        DT *= SBSTRIPS;\n        STRIPT = STRIPT + DT;\n        bFirst = TRUE;\n        for(;;) {\n            if(bFirst) {\n                if(pHuffmanDecoder->decodeAValue(SBHUFFFS, &DFS) != 0) {\n                    m_pModule->JBig2_Error(\"text region decoding procedure (huffman): too short.\");\n                    goto failed;\n                }\n                FIRSTS = FIRSTS + DFS;\n                CURS = FIRSTS;\n                bFirst = FALSE;\n            } else {\n                nVal = pHuffmanDecoder->decodeAValue(SBHUFFDS, &IDS);\n                if(nVal == JBIG2_OOB) {\n                    break;\n                } else if(nVal != 0) {\n                    m_pModule->JBig2_Error(\"text region decoding procedure (huffman): too short.\");\n                    goto failed;\n                } else {\n                    CURS = CURS + IDS + SBDSOFFSET;\n                }\n            }\n            if(SBSTRIPS == 1) {\n                CURT = 0;\n            } else {\n                nTmp = 1;\n                while((FX_DWORD)(1 << nTmp) < SBSTRIPS) {\n                    nTmp ++;\n                }\n                if(pStream->readNBits(nTmp, &nVal) != 0) {\n                    m_pModule->JBig2_Error(\"text region decoding procedure (huffman): too short.\");\n                    goto failed;\n                }\n                CURT = nVal;\n            }\n            TI = STRIPT + CURT;\n            nVal = 0;\n            nBits = 0;\n            for(;;) {\n                if(pStream->read1Bit(&nTmp) != 0) {\n                    m_pModule->JBig2_Error(\"text region decoding procedure (huffman): too short.\");\n                    goto failed;\n                }\n                nVal = (nVal << 1) | nTmp;\n                nBits ++;\n                for(IDI = 0; IDI < SBNUMSYMS; IDI++) {\n                    if((nBits == SBSYMCODES[IDI].codelen) && (nVal == SBSYMCODES[IDI].code)) {\n                        break;\n                    }\n                }\n                if(IDI < SBNUMSYMS) {\n                    break;\n                }\n            }\n            if(SBREFINE == 0) {\n                RI = 0;\n            } else {\n                if(pStream->read1Bit(&RI) != 0) {\n                    m_pModule->JBig2_Error(\"text region decoding procedure (huffman): too short.\");\n                    goto failed;\n                }\n            }\n            if(RI == 0) {\n                IBI = SBSYMS[IDI];\n            } else {\n                if((pHuffmanDecoder->decodeAValue(SBHUFFRDW, &RDWI) != 0)\n                        || (pHuffmanDecoder->decodeAValue(SBHUFFRDH, &RDHI) != 0)\n                        || (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0)\n                        || (pHuffmanDecoder->decodeAValue(SBHUFFRDY, &RDYI) != 0)\n                        || (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE, &nVal) != 0)) {\n                    m_pModule->JBig2_Error(\"text region decoding procedure (huffman): too short.\");\n                    goto failed;\n                }\n                pStream->alignByte();\n                nTmp = pStream->getOffset();\n                IBOI = SBSYMS[IDI];\n                if (!IBOI) {\n                    goto failed;\n                }\n                WOI = IBOI->m_nWidth;\n                HOI = IBOI->m_nHeight;\n                if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) {\n                    m_pModule->JBig2_Error(\"text region decoding procedure (huffman): Invalid RDWI or RDHI value.\");\n                    goto failed;\n                }\n                JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());\n                pGRRD->GRW = WOI + RDWI;\n                pGRRD->GRH = HOI + RDHI;\n                pGRRD->GRTEMPLATE = SBRTEMPLATE;\n                pGRRD->GRREFERENCE = IBOI;\n                pGRRD->GRREFERENCEDX = (RDWI >> 2) + RDXI;\n                pGRRD->GRREFERENCEDY = (RDHI >> 2) + RDYI;\n                pGRRD->TPGRON = 0;\n                pGRRD->GRAT[0] = SBRAT[0];\n                pGRRD->GRAT[1] = SBRAT[1];\n                pGRRD->GRAT[2] = SBRAT[2];\n                pGRRD->GRAT[3] = SBRAT[3];\n                JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(pStream));\n                IBI = pGRRD->decode(pArithDecoder, grContext);\n                if(IBI == NULL) {\n                    delete pGRRD;\n                    delete pArithDecoder;\n                    goto failed;\n                }\n                delete pArithDecoder;\n                pStream->alignByte();\n                pStream->offset(2);\n                if((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) {\n                    delete IBI;\n                    delete pGRRD;\n                    m_pModule->JBig2_Error(\"text region decoding procedure (huffman):\"\n                                           \"bytes processed by generic refinement region decoding procedure doesn't equal SBHUFFRSIZE.\");\n                    goto failed;\n                }\n                delete pGRRD;\n            }\n            if (!IBI) {\n                continue;\n            }\n            WI = IBI->m_nWidth;\n            HI = IBI->m_nHeight;\n            if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT)\n                                   || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {\n                CURS = CURS + WI - 1;\n            } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT)\n                                          || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {\n                CURS = CURS + HI - 1;\n            }\n            SI = CURS;\n            if(TRANSPOSED == 0) {\n                switch(REFCORNER) {\n                    case JBIG2_CORNER_TOPLEFT:\n                        SBREG->composeFrom(SI, TI, IBI, SBCOMBOP);\n                        break;\n                    case JBIG2_CORNER_TOPRIGHT:\n                        SBREG->composeFrom(SI - WI + 1, TI, IBI, SBCOMBOP);\n                        break;\n                    case JBIG2_CORNER_BOTTOMLEFT:\n                        SBREG->composeFrom(SI, TI - HI + 1, IBI, SBCOMBOP);\n                        break;\n                    case JBIG2_CORNER_BOTTOMRIGHT:\n                        SBREG->composeFrom(SI - WI + 1, TI - HI + 1, IBI, SBCOMBOP);\n                        break;\n                }\n            } else {\n                switch(REFCORNER) {\n                    case JBIG2_CORNER_TOPLEFT:\n                        SBREG->composeFrom(TI, SI, IBI, SBCOMBOP);\n                        break;\n                    case JBIG2_CORNER_TOPRIGHT:\n                        SBREG->composeFrom(TI - WI + 1, SI, IBI, SBCOMBOP);\n                        break;\n                    case JBIG2_CORNER_BOTTOMLEFT:\n                        SBREG->composeFrom(TI, SI - HI + 1, IBI, SBCOMBOP);\n                        break;\n                    case JBIG2_CORNER_BOTTOMRIGHT:\n                        SBREG->composeFrom(TI - WI + 1, SI - HI + 1, IBI, SBCOMBOP);\n                        break;\n                }\n            }\n            if(RI != 0) {\n                delete IBI;\n            }\n            if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPLEFT)\n                                   || (REFCORNER == JBIG2_CORNER_BOTTOMLEFT))) {\n                CURS = CURS + WI - 1;\n            } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_TOPLEFT)\n                                          || (REFCORNER == JBIG2_CORNER_TOPRIGHT))) {\n                CURS = CURS + HI - 1;\n            }\n            NINSTANCES = NINSTANCES + 1;\n        }\n    }\n    delete pHuffmanDecoder;\n    return SBREG;\nfailed:\n    delete pHuffmanDecoder;\n    delete SBREG;\n    return NULL;\n}\nCJBig2_Image *CJBig2_TRDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext,\n        JBig2IntDecoderState *pIDS)\n{\n    FX_INT32 STRIPT, FIRSTS;\n    FX_DWORD NINSTANCES;\n    FX_INT32 DT, DFS, CURS;\n    FX_INT32 CURT;\n    FX_INT32 SI, TI;\n    FX_DWORD IDI;\n    CJBig2_Image *IBI;\n    FX_DWORD WI, HI;\n    FX_INT32 IDS;\n    FX_BOOL RI;\n    FX_INT32 RDWI, RDHI, RDXI, RDYI;\n    CJBig2_Image *IBOI;\n    FX_DWORD WOI, HOI;\n    CJBig2_Image *SBREG;\n    FX_BOOL bFirst;\n    FX_INT32 nRet, nVal;\n    FX_INT32 bRetained;\n    CJBig2_ArithIntDecoder *IADT, *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH, *IARDX, *IARDY;\n    CJBig2_ArithIaidDecoder *IAID;\n    CJBig2_GRRDProc *pGRRD;\n    if(pIDS) {\n        IADT = pIDS->IADT;\n        IAFS = pIDS->IAFS;\n        IADS = pIDS->IADS;\n        IAIT = pIDS->IAIT;\n        IARI = pIDS->IARI;\n        IARDW = pIDS->IARDW;\n        IARDH = pIDS->IARDH;\n        IARDX = pIDS->IARDX;\n        IARDY = pIDS->IARDY;\n        IAID = pIDS->IAID;\n        bRetained = TRUE;\n    } else {\n        JBIG2_ALLOC(IADT, CJBig2_ArithIntDecoder());\n        JBIG2_ALLOC(IAFS, CJBig2_ArithIntDecoder());\n        JBIG2_ALLOC(IADS, CJBig2_ArithIntDecoder());\n        JBIG2_ALLOC(IAIT, CJBig2_ArithIntDecoder());\n        JBIG2_ALLOC(IARI, CJBig2_ArithIntDecoder());\n        JBIG2_ALLOC(IARDW, CJBig2_ArithIntDecoder());\n        JBIG2_ALLOC(IARDH, CJBig2_ArithIntDecoder());\n        JBIG2_ALLOC(IARDX, CJBig2_ArithIntDecoder());\n        JBIG2_ALLOC(IARDY, CJBig2_ArithIntDecoder());\n        JBIG2_ALLOC(IAID , CJBig2_ArithIaidDecoder(SBSYMCODELEN));\n        bRetained = FALSE;\n    }\n    JBIG2_ALLOC(SBREG, CJBig2_Image(SBW, SBH));\n    SBREG->fill(SBDEFPIXEL);\n    if(IADT->decode(pArithDecoder, &STRIPT) == -1) {\n        m_pModule->JBig2_Error(\"text region decoding procedure (arith): too short.\");\n        goto failed;\n    }\n    STRIPT *= SBSTRIPS;\n    STRIPT = -STRIPT;\n    FIRSTS = 0;\n    NINSTANCES = 0;\n    while(NINSTANCES < SBNUMINSTANCES) {\n        if(IADT->decode(pArithDecoder, &DT) == -1) {\n            m_pModule->JBig2_Error(\"text region decoding procedure (arith): too short.\");\n            goto failed;\n        }\n        DT *= SBSTRIPS;\n        STRIPT = STRIPT + DT;\n        bFirst = TRUE;\n        for(;;) {\n            if(bFirst) {\n                if(IAFS->decode(pArithDecoder, &DFS) == -1) {\n                    m_pModule->JBig2_Error(\"text region decoding procedure (arith): too short.\");\n                    goto failed;\n                }\n                FIRSTS = FIRSTS + DFS;\n                CURS = FIRSTS;\n                bFirst = FALSE;\n            } else {\n                nRet = IADS->decode(pArithDecoder, &IDS);\n                if(nRet == JBIG2_OOB) {\n                    break;\n                } else if(nRet != 0) {\n                    m_pModule->JBig2_Error(\"text region decoding procedure (arith): too short.\");\n                    goto failed;\n                } else {\n                    CURS = CURS + IDS + SBDSOFFSET;\n                }\n            }\n            if (NINSTANCES >= SBNUMINSTANCES) {\n                break;\n            }\n            if(SBSTRIPS == 1) {\n                CURT = 0;\n            } else {\n                if(IAIT->decode(pArithDecoder, &nVal) == -1) {\n                    m_pModule->JBig2_Error(\"text region decoding procedure (arith): too short.\");\n                    goto failed;\n                }\n                CURT = nVal;\n            }\n            TI = STRIPT + CURT;\n            if(IAID->decode(pArithDecoder, &nVal) == -1) {\n                m_pModule->JBig2_Error(\"text region decoding procedure (arith): too short.\");\n                goto failed;\n            }\n            IDI = nVal;\n            if(IDI >= SBNUMSYMS) {\n                m_pModule->JBig2_Error(\"text region decoding procedure (arith): symbol id out of range.(%d/%d)\",\n                                       IDI, SBNUMSYMS);\n                goto failed;\n            }\n            if(SBREFINE == 0) {\n                RI = 0;\n            } else {\n                if(IARI->decode(pArithDecoder, &RI) == -1) {\n                    m_pModule->JBig2_Error(\"text region decoding procedure (arith): too short.\");\n                    goto failed;\n                }\n            }\n            if (!SBSYMS[IDI]) {\n                goto failed;\n            }\n            if(RI == 0) {\n                IBI = SBSYMS[IDI];\n            } else {\n                if((IARDW->decode(pArithDecoder, &RDWI) == -1)\n                        || (IARDH->decode(pArithDecoder, &RDHI) == -1)\n                        || (IARDX->decode(pArithDecoder, &RDXI) == -1)\n                        || (IARDY->decode(pArithDecoder, &RDYI) == -1)) {\n                    m_pModule->JBig2_Error(\"text region decoding procedure (arith): too short.\");\n                    goto failed;\n                }\n                IBOI = SBSYMS[IDI];\n                WOI = IBOI->m_nWidth;\n                HOI = IBOI->m_nHeight;\n                if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) {\n                    m_pModule->JBig2_Error(\"text region decoding procedure (arith): Invalid RDWI or RDHI value.\");\n                    goto failed;\n                }\n                JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());\n                pGRRD->GRW = WOI + RDWI;\n                pGRRD->GRH = HOI + RDHI;\n                pGRRD->GRTEMPLATE = SBRTEMPLATE;\n                pGRRD->GRREFERENCE = IBOI;\n                pGRRD->GRREFERENCEDX = (RDWI >> 1) + RDXI;\n                pGRRD->GRREFERENCEDY = (RDHI >> 1) + RDYI;\n                pGRRD->TPGRON = 0;\n                pGRRD->GRAT[0] = SBRAT[0];\n                pGRRD->GRAT[1] = SBRAT[1];\n                pGRRD->GRAT[2] = SBRAT[2];\n                pGRRD->GRAT[3] = SBRAT[3];\n                IBI = pGRRD->decode(pArithDecoder, grContext);\n                if(IBI == NULL) {\n                    delete pGRRD;\n                    goto failed;\n                }\n                delete pGRRD;\n            }\n            WI = IBI->m_nWidth;\n            HI = IBI->m_nHeight;\n            if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT)\n                                   || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {\n                CURS = CURS + WI - 1;\n            } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT)\n                                          || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {\n                CURS = CURS + HI - 1;\n            }\n            SI = CURS;\n            if(TRANSPOSED == 0) {\n                switch(REFCORNER) {\n                    case JBIG2_CORNER_TOPLEFT:\n                        SBREG->composeFrom(SI, TI, IBI, SBCOMBOP);\n                        break;\n                    case JBIG2_CORNER_TOPRIGHT:\n                        SBREG->composeFrom(SI - WI + 1, TI, IBI, SBCOMBOP);\n                        break;\n                    case JBIG2_CORNER_BOTTOMLEFT:\n                        SBREG->composeFrom(SI, TI - HI + 1, IBI, SBCOMBOP);\n                        break;\n                    case JBIG2_CORNER_BOTTOMRIGHT:\n                        SBREG->composeFrom(SI - WI + 1, TI - HI + 1, IBI, SBCOMBOP);\n                        break;\n                }\n            } else {\n                switch(REFCORNER) {\n                    case JBIG2_CORNER_TOPLEFT:\n                        SBREG->composeFrom(TI, SI, IBI, SBCOMBOP);\n                        break;\n                    case JBIG2_CORNER_TOPRIGHT:\n                        SBREG->composeFrom(TI - WI + 1, SI, IBI, SBCOMBOP);\n                        break;\n                    case JBIG2_CORNER_BOTTOMLEFT:\n                        SBREG->composeFrom(TI, SI - HI + 1, IBI, SBCOMBOP);\n                        break;\n                    case JBIG2_CORNER_BOTTOMRIGHT:\n                        SBREG->composeFrom(TI - WI + 1, SI - HI + 1, IBI, SBCOMBOP);\n                        break;\n                }\n            }\n            if(RI != 0) {\n                delete IBI;\n            }\n            if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPLEFT)\n                                   || (REFCORNER == JBIG2_CORNER_BOTTOMLEFT))) {\n                CURS = CURS + WI - 1;\n            } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_TOPLEFT)\n                                          || (REFCORNER == JBIG2_CORNER_TOPRIGHT))) {\n                CURS = CURS + HI - 1;\n            }\n            NINSTANCES = NINSTANCES + 1;\n        }\n    }\n    if(bRetained == FALSE) {\n        delete IADT;\n        delete IAFS;\n        delete IADS;\n        delete IAIT;\n        delete IARI;\n        delete IARDW;\n        delete IARDH;\n        delete IARDX;\n        delete IARDY;\n        delete IAID;\n    }\n    return SBREG;\nfailed:\n    if(bRetained == FALSE) {\n        delete IADT;\n        delete IAFS;\n        delete IADS;\n        delete IAIT;\n        delete IARI;\n        delete IARDW;\n        delete IARDH;\n        delete IARDX;\n        delete IARDY;\n        delete IAID;\n    }\n    delete SBREG;\n    return NULL;\n}\nCJBig2_SymbolDict *CJBig2_SDDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder,\n        JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext)\n{\n    CJBig2_Image **SDNEWSYMS;\n    FX_DWORD HCHEIGHT, NSYMSDECODED;\n    FX_INT32 HCDH;\n    FX_DWORD SYMWIDTH, TOTWIDTH, HCFIRSTSYM;\n    FX_INT32 DW;\n    CJBig2_Image *BS;\n    FX_DWORD I, J, REFAGGNINST;\n    FX_BOOL *EXFLAGS;\n    FX_DWORD EXINDEX;\n    FX_BOOL CUREXFLAG;\n    FX_DWORD EXRUNLENGTH;\n    FX_INT32 nVal;\n    FX_DWORD nTmp;\n    FX_BOOL SBHUFF;\n    FX_DWORD SBNUMSYMS;\n    FX_BYTE SBSYMCODELEN;\n    FX_DWORD IDI;\n    FX_INT32 RDXI, RDYI;\n    CJBig2_Image **SBSYMS;\n    CJBig2_HuffmanTable *SBHUFFFS, *SBHUFFDS, *SBHUFFDT, *SBHUFFRDW, *SBHUFFRDH, *SBHUFFRDX, *SBHUFFRDY,\n                        *SBHUFFRSIZE;\n    CJBig2_GRRDProc *pGRRD;\n    CJBig2_GRDProc *pGRD;\n    CJBig2_ArithIntDecoder *IADH, *IADW, *IAAI, *IARDX, *IARDY, *IAEX,\n                           *IADT, *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH;\n    CJBig2_ArithIaidDecoder *IAID;\n    CJBig2_SymbolDict *pDict;\n    JBIG2_ALLOC(IADH, CJBig2_ArithIntDecoder());\n    JBIG2_ALLOC(IADW, CJBig2_ArithIntDecoder());\n    JBIG2_ALLOC(IAAI, CJBig2_ArithIntDecoder());\n    JBIG2_ALLOC(IARDX, CJBig2_ArithIntDecoder());\n    JBIG2_ALLOC(IARDY, CJBig2_ArithIntDecoder());\n    JBIG2_ALLOC(IAEX, CJBig2_ArithIntDecoder());\n    JBIG2_ALLOC(IADT, CJBig2_ArithIntDecoder());\n    JBIG2_ALLOC(IAFS, CJBig2_ArithIntDecoder());\n    JBIG2_ALLOC(IADS, CJBig2_ArithIntDecoder());\n    JBIG2_ALLOC(IAIT, CJBig2_ArithIntDecoder());\n    JBIG2_ALLOC(IARI, CJBig2_ArithIntDecoder());\n    JBIG2_ALLOC(IARDW, CJBig2_ArithIntDecoder());\n    JBIG2_ALLOC(IARDH, CJBig2_ArithIntDecoder());\n    nTmp = 0;\n    while((FX_DWORD)(1 << nTmp) < (SDNUMINSYMS + SDNUMNEWSYMS)) {\n        nTmp ++;\n    }\n    JBIG2_ALLOC(IAID, CJBig2_ArithIaidDecoder((FX_BYTE)nTmp));\n    SDNEWSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, sizeof(CJBig2_Image*));\n    FXSYS_memset32(SDNEWSYMS, 0 , SDNUMNEWSYMS * sizeof(CJBig2_Image*));\n    HCHEIGHT = 0;\n    NSYMSDECODED = 0;\n    while(NSYMSDECODED < SDNUMNEWSYMS) {\n        BS = NULL;\n        if(IADH->decode(pArithDecoder, &HCDH) == -1) {\n            m_pModule->JBig2_Error(\"symbol dictionary decoding procedure (arith): too short.\");\n            goto failed;\n        }\n        HCHEIGHT = HCHEIGHT + HCDH;\n        if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) {\n            m_pModule->JBig2_Error(\"symbol dictionary decoding procedure (arith): invalid HCHEIGHT value.\");\n            goto failed;\n        }\n        SYMWIDTH = 0;\n        TOTWIDTH = 0;\n        HCFIRSTSYM = NSYMSDECODED;\n        for(;;) {\n            nVal = IADW->decode(pArithDecoder, &DW);\n            if(nVal == JBIG2_OOB) {\n                break;\n            } else if(nVal != 0) {\n                m_pModule->JBig2_Error(\"symbol dictionary decoding procedure (arith): too short.\");\n                goto failed;\n            } else {\n                if (NSYMSDECODED >= SDNUMNEWSYMS) {\n                    m_pModule->JBig2_Error(\"symbol dictionary decoding procedure (arith): NSYMSDECODED >= SDNUMNEWSYMS.\");\n                    goto failed;\n                }\n                SYMWIDTH = SYMWIDTH + DW;\n                if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) {\n                    m_pModule->JBig2_Error(\"symbol dictionary decoding procedure (arith): invalid SYMWIDTH value.\");\n                    goto failed;\n                } else if (HCHEIGHT == 0 || SYMWIDTH == 0) {\n                    TOTWIDTH = TOTWIDTH + SYMWIDTH;\n                    SDNEWSYMS[NSYMSDECODED] = NULL;\n                    NSYMSDECODED = NSYMSDECODED + 1;\n                    continue;\n                }\n                TOTWIDTH = TOTWIDTH + SYMWIDTH;\n            }\n            if(SDREFAGG == 0) {\n                JBIG2_ALLOC(pGRD, CJBig2_GRDProc());\n                pGRD->MMR = 0;\n                pGRD->GBW = SYMWIDTH;\n                pGRD->GBH = HCHEIGHT;\n                pGRD->GBTEMPLATE = SDTEMPLATE;\n                pGRD->TPGDON = 0;\n                pGRD->USESKIP = 0;\n                pGRD->GBAT[0] = SDAT[0];\n                pGRD->GBAT[1] = SDAT[1];\n                pGRD->GBAT[2] = SDAT[2];\n                pGRD->GBAT[3] = SDAT[3];\n                pGRD->GBAT[4] = SDAT[4];\n                pGRD->GBAT[5] = SDAT[5];\n                pGRD->GBAT[6] = SDAT[6];\n                pGRD->GBAT[7] = SDAT[7];\n                BS = pGRD->decode_Arith(pArithDecoder, gbContext);\n                if(BS == NULL) {\n                    delete pGRD;\n                    goto failed;\n                }\n                delete pGRD;\n            } else {\n                if(IAAI->decode(pArithDecoder, (int*)&REFAGGNINST) == -1) {\n                    m_pModule->JBig2_Error(\"symbol dictionary decoding procedure (arith): too short.\");\n                    goto failed;\n                }\n                if(REFAGGNINST > 1) {\n                    CJBig2_TRDProc *pDecoder;\n                    JBIG2_ALLOC(pDecoder, CJBig2_TRDProc());\n                    pDecoder->SBHUFF = SDHUFF;\n                    pDecoder->SBREFINE = 1;\n                    pDecoder->SBW = SYMWIDTH;\n                    pDecoder->SBH = HCHEIGHT;\n                    pDecoder->SBNUMINSTANCES = REFAGGNINST;\n                    pDecoder->SBSTRIPS = 1;\n                    pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED;\n                    SBNUMSYMS = pDecoder->SBNUMSYMS;\n                    nTmp = 0;\n                    while((FX_DWORD)(1 << nTmp) < SBNUMSYMS) {\n                        nTmp ++;\n                    }\n                    SBSYMCODELEN = (FX_BYTE)nTmp;\n                    pDecoder->SBSYMCODELEN = SBSYMCODELEN;\n                    SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*));\n                    JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));\n                    JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*));\n                    pDecoder->SBSYMS = SBSYMS;\n                    pDecoder->SBDEFPIXEL = 0;\n                    pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR;\n                    pDecoder->TRANSPOSED = 0;\n                    pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT;\n                    pDecoder->SBDSOFFSET = 0;\n                    JBIG2_ALLOC(SBHUFFFS, CJBig2_HuffmanTable(HuffmanTable_B6,\n                                sizeof(HuffmanTable_B6) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B6));\n                    JBIG2_ALLOC(SBHUFFDS, CJBig2_HuffmanTable(HuffmanTable_B8,\n                                sizeof(HuffmanTable_B8) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B8));\n                    JBIG2_ALLOC(SBHUFFDT, CJBig2_HuffmanTable(HuffmanTable_B11,\n                                sizeof(HuffmanTable_B11) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B11));\n                    JBIG2_ALLOC(SBHUFFRDW, CJBig2_HuffmanTable(HuffmanTable_B15,\n                                sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));\n                    JBIG2_ALLOC(SBHUFFRDH, CJBig2_HuffmanTable(HuffmanTable_B15,\n                                sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));\n                    JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15,\n                                sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));\n                    JBIG2_ALLOC(SBHUFFRDY, CJBig2_HuffmanTable(HuffmanTable_B15,\n                                sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));\n                    JBIG2_ALLOC(SBHUFFRSIZE, CJBig2_HuffmanTable(HuffmanTable_B1,\n                                sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));\n                    pDecoder->SBHUFFFS = SBHUFFFS;\n                    pDecoder->SBHUFFDS = SBHUFFDS;\n                    pDecoder->SBHUFFDT = SBHUFFDT;\n                    pDecoder->SBHUFFRDW = SBHUFFRDW;\n                    pDecoder->SBHUFFRDH = SBHUFFRDH;\n                    pDecoder->SBHUFFRDX = SBHUFFRDX;\n                    pDecoder->SBHUFFRDY = SBHUFFRDY;\n                    pDecoder->SBHUFFRSIZE = SBHUFFRSIZE;\n                    pDecoder->SBRTEMPLATE = SDRTEMPLATE;\n                    pDecoder->SBRAT[0] = SDRAT[0];\n                    pDecoder->SBRAT[1] = SDRAT[1];\n                    pDecoder->SBRAT[2] = SDRAT[2];\n                    pDecoder->SBRAT[3] = SDRAT[3];\n                    JBig2IntDecoderState ids;\n                    ids.IADT = IADT;\n                    ids.IAFS = IAFS;\n                    ids.IADS = IADS;\n                    ids.IAIT = IAIT;\n                    ids.IARI = IARI;\n                    ids.IARDW = IARDW;\n                    ids.IARDH = IARDH;\n                    ids.IARDX = IARDX;\n                    ids.IARDY = IARDY;\n                    ids.IAID = IAID;\n                    BS = pDecoder->decode_Arith(pArithDecoder, grContext, &ids);\n                    if(BS == NULL) {\n                        m_pModule->JBig2_Free(SBSYMS);\n                        delete SBHUFFFS;\n                        delete SBHUFFDS;\n                        delete SBHUFFDT;\n                        delete SBHUFFRDW;\n                        delete SBHUFFRDH;\n                        delete SBHUFFRDX;\n                        delete SBHUFFRDY;\n                        delete SBHUFFRSIZE;\n                        delete pDecoder;\n                        goto failed;\n                    }\n                    m_pModule->JBig2_Free(SBSYMS);\n                    delete SBHUFFFS;\n                    delete SBHUFFDS;\n                    delete SBHUFFDT;\n                    delete SBHUFFRDW;\n                    delete SBHUFFRDH;\n                    delete SBHUFFRDX;\n                    delete SBHUFFRDY;\n                    delete SBHUFFRSIZE;\n                    delete pDecoder;\n                } else if(REFAGGNINST == 1) {\n                    SBHUFF = SDHUFF;\n                    SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED;\n                    if(IAID->decode(pArithDecoder, (int*)&IDI) == -1) {\n                        m_pModule->JBig2_Error(\"symbol dictionary decoding procedure (arith): too short.\");\n                        goto failed;\n                    }\n                    if((IARDX->decode(pArithDecoder, &RDXI) == -1)\n                            || (IARDY->decode(pArithDecoder, &RDYI) == -1)) {\n                        m_pModule->JBig2_Error(\"symbol dictionary decoding procedure (arith): too short.\");\n                        goto failed;\n                    }\n                    if (IDI >= SBNUMSYMS) {\n                        m_pModule->JBig2_Error(\"symbol dictionary decoding procedure (arith):\"\n                                               \" refinement references unknown symbol %d\", IDI);\n                        goto failed;\n                    }\n                    SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*));\n                    JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));\n                    JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*));\n                    if (!SBSYMS[IDI]) {\n                        m_pModule->JBig2_Free(SBSYMS);\n                        goto failed;\n                    }\n                    JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());\n                    pGRRD->GRW = SYMWIDTH;\n                    pGRRD->GRH = HCHEIGHT;\n                    pGRRD->GRTEMPLATE = SDRTEMPLATE;\n                    pGRRD->GRREFERENCE = SBSYMS[IDI];\n                    pGRRD->GRREFERENCEDX = RDXI;\n                    pGRRD->GRREFERENCEDY = RDYI;\n                    pGRRD->TPGRON = 0;\n                    pGRRD->GRAT[0] = SDRAT[0];\n                    pGRRD->GRAT[1] = SDRAT[1];\n                    pGRRD->GRAT[2] = SDRAT[2];\n                    pGRRD->GRAT[3] = SDRAT[3];\n                    BS = pGRRD->decode(pArithDecoder, grContext);\n                    if(BS == NULL) {\n                        m_pModule->JBig2_Free(SBSYMS);\n                        delete pGRRD;\n                        goto failed;\n                    }\n                    m_pModule->JBig2_Free(SBSYMS);\n                    delete pGRRD;\n                }\n            }\n            SDNEWSYMS[NSYMSDECODED] = BS;\n            BS = NULL;\n            NSYMSDECODED = NSYMSDECODED + 1;\n        }\n    }\n    EXINDEX = 0;\n    CUREXFLAG = 0;\n    EXFLAGS = (FX_BOOL*)m_pModule->JBig2_Malloc2(sizeof(FX_BOOL), (SDNUMINSYMS + SDNUMNEWSYMS));\n    while(EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) {\n        if(IAEX->decode(pArithDecoder, (int*)&EXRUNLENGTH) == -1) {\n            m_pModule->JBig2_Free(EXFLAGS);\n            m_pModule->JBig2_Error(\"symbol dictionary decoding procedure (arith): too short.\");\n            goto failed;\n        }\n        if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) {\n            m_pModule->JBig2_Free(EXFLAGS);\n            m_pModule->JBig2_Error(\"symbol dictionary decoding procedure (arith): Invalid EXRUNLENGTH value.\");\n            goto failed;\n        }\n        if(EXRUNLENGTH != 0) {\n            for(I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) {\n                EXFLAGS[I] = CUREXFLAG;\n            }\n        }\n        EXINDEX = EXINDEX + EXRUNLENGTH;\n        CUREXFLAG = !CUREXFLAG;\n    }\n    JBIG2_ALLOC(pDict, CJBig2_SymbolDict());\n    pDict->SDNUMEXSYMS = SDNUMEXSYMS;\n    pDict->SDEXSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), SDNUMEXSYMS);\n    I = J = 0;\n    for(I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) {\n        if(EXFLAGS[I] && J < SDNUMEXSYMS) {\n            if(I < SDNUMINSYMS) {\n                JBIG2_ALLOC(pDict->SDEXSYMS[J], CJBig2_Image(*SDINSYMS[I]));\n            } else {\n                pDict->SDEXSYMS[J] = SDNEWSYMS[I - SDNUMINSYMS];\n            }\n            J = J + 1;\n        } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) {\n            delete SDNEWSYMS[I - SDNUMINSYMS];\n        }\n    }\n    if (J < SDNUMEXSYMS) {\n        pDict->SDNUMEXSYMS = J;\n    }\n    m_pModule->JBig2_Free(EXFLAGS);\n    m_pModule->JBig2_Free(SDNEWSYMS);\n    delete IADH;\n    delete IADW;\n    delete IAAI;\n    delete IARDX;\n    delete IARDY;\n    delete IAEX;\n    delete IAID;\n    delete IADT;\n    delete IAFS;\n    delete IADS;\n    delete IAIT;\n    delete IARI;\n    delete IARDW;\n    delete IARDH;\n    return pDict;\nfailed:\n    for(I = 0; I < NSYMSDECODED; I++) {\n        if (SDNEWSYMS[I]) {\n            delete SDNEWSYMS[I];\n            SDNEWSYMS[I] = NULL;\n        }\n    }\n    m_pModule->JBig2_Free(SDNEWSYMS);\n    delete IADH;\n    delete IADW;\n    delete IAAI;\n    delete IARDX;\n    delete IARDY;\n    delete IAEX;\n    delete IAID;\n    delete IADT;\n    delete IAFS;\n    delete IADS;\n    delete IAIT;\n    delete IARI;\n    delete IARDW;\n    delete IARDH;\n    return NULL;\n}\nCJBig2_SymbolDict *CJBig2_SDDProc::decode_Huffman(CJBig2_BitStream *pStream,\n        JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext, IFX_Pause* pPause)\n{\n    CJBig2_Image **SDNEWSYMS;\n    FX_DWORD *SDNEWSYMWIDTHS;\n    FX_DWORD HCHEIGHT, NSYMSDECODED;\n    FX_INT32 HCDH;\n    FX_DWORD SYMWIDTH, TOTWIDTH, HCFIRSTSYM;\n    FX_INT32 DW;\n    CJBig2_Image *BS, *BHC;\n    FX_DWORD I, J, REFAGGNINST;\n    FX_BOOL *EXFLAGS;\n    FX_DWORD EXINDEX;\n    FX_BOOL CUREXFLAG;\n    FX_DWORD EXRUNLENGTH;\n    FX_INT32 nVal, nBits;\n    FX_DWORD nTmp;\n    FX_BOOL SBHUFF;\n    FX_DWORD SBNUMSYMS;\n    FX_BYTE SBSYMCODELEN;\n    JBig2HuffmanCode *SBSYMCODES;\n    FX_DWORD IDI;\n    FX_INT32 RDXI, RDYI;\n    FX_DWORD BMSIZE;\n    FX_DWORD stride;\n    CJBig2_Image **SBSYMS;\n    CJBig2_HuffmanTable *SBHUFFFS, *SBHUFFDS, *SBHUFFDT, *SBHUFFRDW, *SBHUFFRDH, *SBHUFFRDX, *SBHUFFRDY,\n                        *SBHUFFRSIZE, *pTable;\n    CJBig2_HuffmanDecoder *pHuffmanDecoder;\n    CJBig2_GRRDProc *pGRRD;\n    CJBig2_ArithDecoder *pArithDecoder;\n    CJBig2_GRDProc *pGRD;\n    CJBig2_SymbolDict *pDict;\n    JBIG2_ALLOC(pHuffmanDecoder, CJBig2_HuffmanDecoder(pStream));\n    SDNEWSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, sizeof(CJBig2_Image*));\n    FXSYS_memset32(SDNEWSYMS, 0 , SDNUMNEWSYMS * sizeof(CJBig2_Image*));\n    SDNEWSYMWIDTHS = NULL;\n    BHC = NULL;\n    if(SDREFAGG == 0) {\n        SDNEWSYMWIDTHS = (FX_DWORD *)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, sizeof(FX_DWORD));\n        FXSYS_memset32(SDNEWSYMWIDTHS, 0 , SDNUMNEWSYMS * sizeof(FX_DWORD));\n    }\n    HCHEIGHT = 0;\n    NSYMSDECODED = 0;\n    BS = NULL;\n    while(NSYMSDECODED < SDNUMNEWSYMS) {\n        if(pHuffmanDecoder->decodeAValue(SDHUFFDH, &HCDH) != 0) {\n            m_pModule->JBig2_Error(\"symbol dictionary decoding procedure (huffman): too short.\");\n            goto failed;\n        }\n        HCHEIGHT = HCHEIGHT + HCDH;\n        if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) {\n            m_pModule->JBig2_Error(\"symbol dictionary decoding procedure (huffman): invalid HCHEIGHT value.\");\n            goto failed;\n        }\n        SYMWIDTH = 0;\n        TOTWIDTH = 0;\n        HCFIRSTSYM = NSYMSDECODED;\n        for(;;) {\n            nVal = pHuffmanDecoder->decodeAValue(SDHUFFDW, &DW);\n            if(nVal == JBIG2_OOB) {\n                break;\n            } else if(nVal != 0) {\n                m_pModule->JBig2_Error(\"symbol dictionary decoding procedure (huffman): too short.\");\n                goto failed;\n            } else {\n                if (NSYMSDECODED >= SDNUMNEWSYMS) {\n                    m_pModule->JBig2_Error(\"symbol dictionary decoding procedure (huffman): NSYMSDECODED >= SDNUMNEWSYMS.\");\n                    goto failed;\n                }\n                SYMWIDTH = SYMWIDTH + DW;\n                if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) {\n                    m_pModule->JBig2_Error(\"symbol dictionary decoding procedure (huffman): invalid SYMWIDTH value.\");\n                    goto failed;\n                } else if (HCHEIGHT == 0 || SYMWIDTH == 0) {\n                    TOTWIDTH = TOTWIDTH + SYMWIDTH;\n                    SDNEWSYMS[NSYMSDECODED] = NULL;\n                    NSYMSDECODED = NSYMSDECODED + 1;\n                    continue;\n                }\n                TOTWIDTH = TOTWIDTH + SYMWIDTH;\n            }\n            if(SDREFAGG == 1) {\n                if(pHuffmanDecoder->decodeAValue(SDHUFFAGGINST, (int*)&REFAGGNINST) != 0) {\n                    m_pModule->JBig2_Error(\"symbol dictionary decoding procedure (huffman): too short.\");\n                    goto failed;\n                }\n                BS = NULL;\n                if(REFAGGNINST > 1) {\n                    CJBig2_TRDProc *pDecoder;\n                    JBIG2_ALLOC(pDecoder, CJBig2_TRDProc());\n                    pDecoder->SBHUFF = SDHUFF;\n                    pDecoder->SBREFINE = 1;\n                    pDecoder->SBW = SYMWIDTH;\n                    pDecoder->SBH = HCHEIGHT;\n                    pDecoder->SBNUMINSTANCES = REFAGGNINST;\n                    pDecoder->SBSTRIPS = 1;\n                    pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED;\n                    SBNUMSYMS = pDecoder->SBNUMSYMS;\n                    SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(JBig2HuffmanCode));\n                    nTmp = 1;\n                    while((FX_DWORD)(1 << nTmp) < SBNUMSYMS) {\n                        nTmp ++;\n                    }\n                    for(I = 0; I < SBNUMSYMS; I++) {\n                        SBSYMCODES[I].codelen = nTmp;\n                        SBSYMCODES[I].code = I;\n                    }\n                    pDecoder->SBSYMCODES = SBSYMCODES;\n                    SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*));\n                    JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));\n                    JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*));\n                    pDecoder->SBSYMS = SBSYMS;\n                    pDecoder->SBDEFPIXEL = 0;\n                    pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR;\n                    pDecoder->TRANSPOSED = 0;\n                    pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT;\n                    pDecoder->SBDSOFFSET = 0;\n                    JBIG2_ALLOC(SBHUFFFS, CJBig2_HuffmanTable(HuffmanTable_B6,\n                                sizeof(HuffmanTable_B6) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B6));\n                    JBIG2_ALLOC(SBHUFFDS, CJBig2_HuffmanTable(HuffmanTable_B8,\n                                sizeof(HuffmanTable_B8) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B8));\n                    JBIG2_ALLOC(SBHUFFDT, CJBig2_HuffmanTable(HuffmanTable_B11,\n                                sizeof(HuffmanTable_B11) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B11));\n                    JBIG2_ALLOC(SBHUFFRDW, CJBig2_HuffmanTable(HuffmanTable_B15,\n                                sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));\n                    JBIG2_ALLOC(SBHUFFRDH, CJBig2_HuffmanTable(HuffmanTable_B15,\n                                sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));\n                    JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15,\n                                sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));\n                    JBIG2_ALLOC(SBHUFFRDY, CJBig2_HuffmanTable(HuffmanTable_B15,\n                                sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));\n                    JBIG2_ALLOC(SBHUFFRSIZE, CJBig2_HuffmanTable(HuffmanTable_B1,\n                                sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));\n                    pDecoder->SBHUFFFS = SBHUFFFS;\n                    pDecoder->SBHUFFDS = SBHUFFDS;\n                    pDecoder->SBHUFFDT = SBHUFFDT;\n                    pDecoder->SBHUFFRDW = SBHUFFRDW;\n                    pDecoder->SBHUFFRDH = SBHUFFRDH;\n                    pDecoder->SBHUFFRDX = SBHUFFRDX;\n                    pDecoder->SBHUFFRDY = SBHUFFRDY;\n                    pDecoder->SBHUFFRSIZE = SBHUFFRSIZE;\n                    pDecoder->SBRTEMPLATE = SDRTEMPLATE;\n                    pDecoder->SBRAT[0] = SDRAT[0];\n                    pDecoder->SBRAT[1] = SDRAT[1];\n                    pDecoder->SBRAT[2] = SDRAT[2];\n                    pDecoder->SBRAT[3] = SDRAT[3];\n                    BS = pDecoder->decode_Huffman(pStream, grContext);\n                    if(BS == NULL) {\n                        m_pModule->JBig2_Free(SBSYMCODES);\n                        m_pModule->JBig2_Free(SBSYMS);\n                        delete SBHUFFFS;\n                        delete SBHUFFDS;\n                        delete SBHUFFDT;\n                        delete SBHUFFRDW;\n                        delete SBHUFFRDH;\n                        delete SBHUFFRDX;\n                        delete SBHUFFRDY;\n                        delete SBHUFFRSIZE;\n                        delete pDecoder;\n                        goto failed;\n                    }\n                    m_pModule->JBig2_Free(SBSYMCODES);\n                    m_pModule->JBig2_Free(SBSYMS);\n                    delete SBHUFFFS;\n                    delete SBHUFFDS;\n                    delete SBHUFFDT;\n                    delete SBHUFFRDW;\n                    delete SBHUFFRDH;\n                    delete SBHUFFRDX;\n                    delete SBHUFFRDY;\n                    delete SBHUFFRSIZE;\n                    delete pDecoder;\n                } else if(REFAGGNINST == 1) {\n                    SBHUFF = SDHUFF;\n                    SBNUMSYMS = SDNUMINSYMS + SDNUMNEWSYMS;\n                    nTmp = 1;\n                    while((FX_DWORD)(1 << nTmp) < SBNUMSYMS) {\n                        nTmp ++;\n                    }\n                    SBSYMCODELEN = (FX_BYTE)nTmp;\n                    SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(JBig2HuffmanCode));\n                    for(I = 0; I < SBNUMSYMS; I++) {\n                        SBSYMCODES[I].codelen = SBSYMCODELEN;\n                        SBSYMCODES[I].code = I;\n                    }\n                    nVal = 0;\n                    nBits = 0;\n                    for(;;) {\n                        if(pStream->read1Bit(&nTmp) != 0) {\n                            m_pModule->JBig2_Free(SBSYMCODES);\n                            m_pModule->JBig2_Error(\"symbol dictionary decoding procedure (huffman): too short.\");\n                            goto failed;\n                        }\n                        nVal = (nVal << 1) | nTmp;\n                        for(IDI = 0; IDI < SBNUMSYMS; IDI++) {\n                            if((nVal == SBSYMCODES[IDI].code)\n                                    && (nBits == SBSYMCODES[IDI].codelen)) {\n                                break;\n                            }\n                        }\n                        if(IDI < SBNUMSYMS) {\n                            break;\n                        }\n                    }\n                    m_pModule->JBig2_Free(SBSYMCODES);\n                    JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15,\n                                sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));\n                    JBIG2_ALLOC(SBHUFFRSIZE, CJBig2_HuffmanTable(HuffmanTable_B1,\n                                sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));\n                    if((pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0)\n                            || (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDYI) != 0)\n                            || (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE, &nVal) != 0)) {\n                        delete SBHUFFRDX;\n                        delete SBHUFFRSIZE;\n                        m_pModule->JBig2_Error(\"symbol dictionary decoding procedure (huffman): too short.\");\n                        goto failed;\n                    }\n                    delete SBHUFFRDX;\n                    delete SBHUFFRSIZE;\n                    pStream->alignByte();\n                    nTmp = pStream->getOffset();\n                    SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*));\n                    JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));\n                    JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*));\n                    JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());\n                    pGRRD->GRW = SYMWIDTH;\n                    pGRRD->GRH = HCHEIGHT;\n                    pGRRD->GRTEMPLATE = SDRTEMPLATE;\n                    pGRRD->GRREFERENCE = SBSYMS[IDI];\n                    pGRRD->GRREFERENCEDX = RDXI;\n                    pGRRD->GRREFERENCEDY = RDYI;\n                    pGRRD->TPGRON = 0;\n                    pGRRD->GRAT[0] = SDRAT[0];\n                    pGRRD->GRAT[1] = SDRAT[1];\n                    pGRRD->GRAT[2] = SDRAT[2];\n                    pGRRD->GRAT[3] = SDRAT[3];\n                    JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(pStream));\n                    BS = pGRRD->decode(pArithDecoder, grContext);\n                    if(BS == NULL) {\n                        m_pModule->JBig2_Free(SBSYMS);\n                        delete pGRRD;\n                        delete pArithDecoder;\n                        goto failed;\n                    }\n                    pStream->alignByte();\n                    pStream->offset(2);\n                    if((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) {\n                        delete BS;\n                        m_pModule->JBig2_Free(SBSYMS);\n                        delete pGRRD;\n                        delete pArithDecoder;\n                        m_pModule->JBig2_Error(\"symbol dictionary decoding procedure (huffman):\"\n                                               \"bytes processed by generic refinement region decoding procedure doesn't equal SBHUFFRSIZE.\");\n                        goto failed;\n                    }\n                    m_pModule->JBig2_Free(SBSYMS);\n                    delete pGRRD;\n                    delete pArithDecoder;\n                }\n                SDNEWSYMS[NSYMSDECODED] = BS;\n            }\n            if(SDREFAGG == 0) {\n                SDNEWSYMWIDTHS[NSYMSDECODED] = SYMWIDTH;\n            }\n            NSYMSDECODED = NSYMSDECODED + 1;\n        }\n        if(SDREFAGG == 0) {\n            if(pHuffmanDecoder->decodeAValue(SDHUFFBMSIZE, (FX_INT32*)&BMSIZE) != 0) {\n                m_pModule->JBig2_Error(\"symbol dictionary decoding procedure (huffman): too short.\");\n                goto failed;\n            }\n            pStream->alignByte();\n            if(BMSIZE == 0) {\n                stride = (TOTWIDTH + 7) >> 3;\n                if(pStream->getByteLeft() >= stride * HCHEIGHT) {\n                    JBIG2_ALLOC(BHC, CJBig2_Image(TOTWIDTH, HCHEIGHT));\n                    for(I = 0; I < HCHEIGHT; I ++) {\n                        JBIG2_memcpy(BHC->m_pData + I * BHC->m_nStride, pStream->getPointer(), stride);\n                        pStream->offset(stride);\n                    }\n                } else {\n                    m_pModule->JBig2_Error(\"symbol dictionary decoding procedure (huffman): too short.\");\n                    goto failed;\n                }\n            } else {\n                JBIG2_ALLOC(pGRD, CJBig2_GRDProc());\n                pGRD->MMR = 1;\n                pGRD->GBW = TOTWIDTH;\n                pGRD->GBH = HCHEIGHT;\n                FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHC, pStream);\n                while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {\n                    pGRD->Continue_decode(pPause);\n                }\n                delete pGRD;\n                pStream->alignByte();\n            }\n            nTmp = 0;\n            if (!BHC) {\n                continue;\n            }\n            for(I = HCFIRSTSYM; I < NSYMSDECODED; I++) {\n                SDNEWSYMS[I] = BHC->subImage(nTmp, 0, SDNEWSYMWIDTHS[I], HCHEIGHT);\n                nTmp += SDNEWSYMWIDTHS[I];\n            }\n            delete BHC;\n            BHC = NULL;\n        }\n    }\n    EXINDEX = 0;\n    CUREXFLAG = 0;\n    JBIG2_ALLOC(pTable, CJBig2_HuffmanTable(HuffmanTable_B1,\n                                            sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));\n    EXFLAGS = (FX_BOOL*)m_pModule->JBig2_Malloc2(sizeof(FX_BOOL), (SDNUMINSYMS + SDNUMNEWSYMS));\n    while(EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) {\n        if(pHuffmanDecoder->decodeAValue(pTable, (int*)&EXRUNLENGTH) != 0) {\n            delete pTable;\n            m_pModule->JBig2_Free(EXFLAGS);\n            m_pModule->JBig2_Error(\"symbol dictionary decoding procedure (huffman): too short.\");\n            goto failed;\n        }\n        if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) {\n            delete pTable;\n            m_pModule->JBig2_Free(EXFLAGS);\n            m_pModule->JBig2_Error(\"symbol dictionary decoding procedure (arith): Invalid EXRUNLENGTH value.\");\n            goto failed;\n        }\n        if(EXRUNLENGTH != 0) {\n            for(I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) {\n                EXFLAGS[I] = CUREXFLAG;\n            }\n        }\n        EXINDEX = EXINDEX + EXRUNLENGTH;\n        CUREXFLAG = !CUREXFLAG;\n    }\n    delete pTable;\n    JBIG2_ALLOC(pDict, CJBig2_SymbolDict());\n    pDict->SDNUMEXSYMS = SDNUMEXSYMS;\n    pDict->SDEXSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), SDNUMEXSYMS);\n    I = J = 0;\n    for(I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) {\n        if(EXFLAGS[I] && J < SDNUMEXSYMS) {\n            if(I < SDNUMINSYMS) {\n                JBIG2_ALLOC(pDict->SDEXSYMS[J], CJBig2_Image(*SDINSYMS[I]));\n            } else {\n                pDict->SDEXSYMS[J] = SDNEWSYMS[I - SDNUMINSYMS];\n            }\n            J = J + 1;\n        } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) {\n            delete SDNEWSYMS[I - SDNUMINSYMS];\n        }\n    }\n    if (J < SDNUMEXSYMS) {\n        pDict->SDNUMEXSYMS = J;\n    }\n    m_pModule->JBig2_Free(EXFLAGS);\n    m_pModule->JBig2_Free(SDNEWSYMS);\n    if(SDREFAGG == 0) {\n        m_pModule->JBig2_Free(SDNEWSYMWIDTHS);\n    }\n    delete pHuffmanDecoder;\n    return pDict;\nfailed:\n    for(I = 0; I < NSYMSDECODED; I++) {\n        if (SDNEWSYMS[I]) {\n            delete SDNEWSYMS[I];\n        }\n    }\n    m_pModule->JBig2_Free(SDNEWSYMS);\n    if(SDREFAGG == 0) {\n        m_pModule->JBig2_Free(SDNEWSYMWIDTHS);\n    }\n    delete pHuffmanDecoder;\n    return NULL;\n}\nCJBig2_Image *CJBig2_HTRDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder,\n        JBig2ArithCtx *gbContext, IFX_Pause* pPause)\n{\n    FX_DWORD ng, mg;\n    FX_INT32 x, y;\n    CJBig2_Image *HSKIP;\n    FX_DWORD HBPP;\n    FX_DWORD *GI;\n    CJBig2_Image *HTREG;\n    CJBig2_GSIDProc *pGID;\n    JBIG2_ALLOC(HTREG, CJBig2_Image(HBW, HBH));\n    HTREG->fill(HDEFPIXEL);\n    HSKIP = NULL;\n    if(HENABLESKIP == 1) {\n        JBIG2_ALLOC(HSKIP, CJBig2_Image(HGW, HGH));\n        for(mg = 0; mg < HGH; mg++) {\n            for(ng = 0; ng < HGW; ng++) {\n                x = (HGX + mg * HRY + ng * HRX) >> 8;\n                y = (HGY + mg * HRX - ng * HRY) >> 8;\n                if((x + HPW <= 0) | (x >= (FX_INT32)HBW)\n                        | (y + HPH <= 0) | (y >= (FX_INT32)HPH)) {\n                    HSKIP->setPixel(ng, mg, 1);\n                } else {\n                    HSKIP->setPixel(ng, mg, 0);\n                }\n            }\n        }\n    }\n    HBPP = 1;\n    while((FX_DWORD)(1 << HBPP) < HNUMPATS) {\n        HBPP ++;\n    }\n    JBIG2_ALLOC(pGID, CJBig2_GSIDProc());\n    pGID->GSMMR = HMMR;\n    pGID->GSW = HGW;\n    pGID->GSH = HGH;\n    pGID->GSBPP = (FX_BYTE)HBPP;\n    pGID->GSUSESKIP = HENABLESKIP;\n    pGID->GSKIP = HSKIP;\n    pGID->GSTEMPLATE = HTEMPLATE;\n    GI = pGID->decode_Arith(pArithDecoder, gbContext, pPause);\n    if(GI == NULL) {\n        goto failed;\n    }\n    for(mg = 0; mg < HGH; mg++) {\n        for(ng = 0; ng < HGW; ng++) {\n            x = (HGX + mg * HRY + ng * HRX) >> 8;\n            y = (HGY + mg * HRX - ng * HRY) >> 8;\n            FX_DWORD pat_index = GI[mg * HGW + ng];\n            if (pat_index >= HNUMPATS) {\n                pat_index = HNUMPATS - 1;\n            }\n            HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP);\n        }\n    }\n    m_pModule->JBig2_Free(GI);\n    if(HSKIP) {\n        delete HSKIP;\n    }\n    delete pGID;\n    return HTREG;\nfailed:\n    if(HSKIP) {\n        delete HSKIP;\n    }\n    delete pGID;\n    delete HTREG;\n    return NULL;\n}\nCJBig2_Image *CJBig2_HTRDProc::decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause)\n{\n    FX_DWORD ng, mg;\n    FX_INT32 x, y;\n    FX_DWORD HBPP;\n    FX_DWORD *GI;\n    CJBig2_Image *HTREG;\n    CJBig2_GSIDProc *pGID;\n    JBIG2_ALLOC(HTREG, CJBig2_Image(HBW, HBH));\n    HTREG->fill(HDEFPIXEL);\n    HBPP = 1;\n    while((FX_DWORD)(1 << HBPP) < HNUMPATS) {\n        HBPP ++;\n    }\n    JBIG2_ALLOC(pGID, CJBig2_GSIDProc());\n    pGID->GSMMR = HMMR;\n    pGID->GSW = HGW;\n    pGID->GSH = HGH;\n    pGID->GSBPP = (FX_BYTE)HBPP;\n    pGID->GSUSESKIP = 0;\n    GI = pGID->decode_MMR(pStream, pPause);\n    if(GI == NULL) {\n        goto failed;\n    }\n    for(mg = 0; mg < HGH; mg++) {\n        for(ng = 0; ng < HGW; ng++) {\n            x = (HGX + mg * HRY + ng * HRX) >> 8;\n            y = (HGY + mg * HRX - ng * HRY) >> 8;\n            FX_DWORD pat_index = GI[mg * HGW + ng];\n            if (pat_index >= HNUMPATS) {\n                pat_index = HNUMPATS - 1;\n            }\n            HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP);\n        }\n    }\n    m_pModule->JBig2_Free(GI);\n    delete pGID;\n    return HTREG;\nfailed:\n    delete pGID;\n    delete HTREG;\n    return NULL;\n}\nCJBig2_PatternDict *CJBig2_PDDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder,\n        JBig2ArithCtx *gbContext, IFX_Pause* pPause)\n{\n    FX_DWORD GRAY;\n    CJBig2_Image *BHDC = NULL;\n    CJBig2_PatternDict *pDict;\n    CJBig2_GRDProc *pGRD;\n    JBIG2_ALLOC(pDict, CJBig2_PatternDict());\n    pDict->NUMPATS = GRAYMAX + 1;\n    pDict->HDPATS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), pDict->NUMPATS);\n    JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*)*pDict->NUMPATS);\n    JBIG2_ALLOC(pGRD, CJBig2_GRDProc());\n    pGRD->MMR = HDMMR;\n    pGRD->GBW = (GRAYMAX + 1) * HDPW;\n    pGRD->GBH = HDPH;\n    pGRD->GBTEMPLATE = HDTEMPLATE;\n    pGRD->TPGDON = 0;\n    pGRD->USESKIP = 0;\n    pGRD->GBAT[0] = -(FX_INT32)HDPW;\n    pGRD->GBAT[1] = 0;\n    if(pGRD->GBTEMPLATE == 0) {\n        pGRD->GBAT[2] = -3;\n        pGRD->GBAT[3] = -1;\n        pGRD->GBAT[4] = 2;\n        pGRD->GBAT[5] = -2;\n        pGRD->GBAT[6] = -2;\n        pGRD->GBAT[7] = -2;\n    }\n    FXCODEC_STATUS status = pGRD->Start_decode_Arith(&BHDC, pArithDecoder, gbContext);\n    while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {\n        pGRD->Continue_decode(pPause);\n    }\n    if(BHDC == NULL) {\n        delete pGRD;\n        goto failed;\n    }\n    delete pGRD;\n    GRAY = 0;\n    while(GRAY <= GRAYMAX) {\n        pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH);\n        GRAY = GRAY + 1;\n    }\n    delete BHDC;\n    return pDict;\nfailed:\n    delete pDict;\n    return NULL;\n}\n\nCJBig2_PatternDict *CJBig2_PDDProc::decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause)\n{\n    FX_DWORD GRAY;\n    CJBig2_Image *BHDC = NULL;\n    CJBig2_PatternDict *pDict;\n    CJBig2_GRDProc *pGRD;\n    JBIG2_ALLOC(pDict, CJBig2_PatternDict());\n    pDict->NUMPATS = GRAYMAX + 1;\n    pDict->HDPATS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), pDict->NUMPATS);\n    JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*)*pDict->NUMPATS);\n    JBIG2_ALLOC(pGRD, CJBig2_GRDProc());\n    pGRD->MMR = HDMMR;\n    pGRD->GBW = (GRAYMAX + 1) * HDPW;\n    pGRD->GBH = HDPH;\n    FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHDC, pStream);\n    while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {\n        pGRD->Continue_decode(pPause);\n    }\n    if(BHDC == NULL) {\n        delete pGRD;\n        goto failed;\n    }\n    delete pGRD;\n    GRAY = 0;\n    while(GRAY <= GRAYMAX) {\n        pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH);\n        GRAY = GRAY + 1;\n    }\n    delete BHDC;\n    return pDict;\nfailed:\n    delete pDict;\n    return NULL;\n}\nFX_DWORD *CJBig2_GSIDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder,\n                                        JBig2ArithCtx *gbContext, IFX_Pause* pPause)\n{\n    CJBig2_Image **GSPLANES;\n    FX_INT32 J, K;\n    FX_DWORD x, y;\n    FX_DWORD *GSVALS;\n    CJBig2_GRDProc *pGRD;\n    GSPLANES = (CJBig2_Image **)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), GSBPP);\n    if (!GSPLANES) {\n        return NULL;\n    }\n    GSVALS = (FX_DWORD*)m_pModule->JBig2_Malloc3(sizeof(FX_DWORD), GSW, GSH);\n    if (!GSVALS) {\n        m_pModule->JBig2_Free(GSPLANES);\n        return NULL;\n    }\n    JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*)*GSBPP);\n    JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD)*GSW * GSH);\n    JBIG2_ALLOC(pGRD, CJBig2_GRDProc());\n    pGRD->MMR = GSMMR;\n    pGRD->GBW = GSW;\n    pGRD->GBH = GSH;\n    pGRD->GBTEMPLATE = GSTEMPLATE;\n    pGRD->TPGDON = 0;\n    pGRD->USESKIP = GSUSESKIP;\n    pGRD->SKIP = GSKIP;\n    if(GSTEMPLATE <= 1) {\n        pGRD->GBAT[0] = 3;\n    } else {\n        pGRD->GBAT[0] = 2;\n    }\n    pGRD->GBAT[1] = -1;\n    if(pGRD->GBTEMPLATE == 0) {\n        pGRD->GBAT[2] = -3;\n        pGRD->GBAT[3] = -1;\n        pGRD->GBAT[4] = 2;\n        pGRD->GBAT[5] = -2;\n        pGRD->GBAT[6] = -2;\n        pGRD->GBAT[7] = -2;\n    }\n    FXCODEC_STATUS status = pGRD->Start_decode_Arith(&GSPLANES[GSBPP - 1], pArithDecoder, gbContext);\n    while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {\n        pGRD->Continue_decode(pPause);\n    }\n    if(GSPLANES[GSBPP - 1] == NULL) {\n        goto failed;\n    }\n    J = GSBPP - 2;\n    while(J >= 0) {\n        FXCODEC_STATUS status = pGRD->Start_decode_Arith(&GSPLANES[J], pArithDecoder, gbContext);\n        while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {\n            pGRD->Continue_decode(pPause);\n        }\n        if(GSPLANES[J] == NULL) {\n            for(K = GSBPP - 1; K > J; K--) {\n                delete GSPLANES[K];\n                goto failed;\n            }\n        }\n        GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR);\n        J = J - 1;\n    }\n    for(y = 0; y < GSH; y++) {\n        for(x = 0; x < GSW; x++) {\n            for(J = 0; J < GSBPP; J++) {\n                GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J;\n            }\n        }\n    }\n    for(J = 0; J < GSBPP; J++) {\n        delete GSPLANES[J];\n    }\n    m_pModule->JBig2_Free(GSPLANES);\n    delete pGRD;\n    return GSVALS;\nfailed:\n    m_pModule->JBig2_Free(GSPLANES);\n    delete pGRD;\n    m_pModule->JBig2_Free(GSVALS);\n    return NULL;\n}\nFX_DWORD *CJBig2_GSIDProc::decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause)\n{\n    CJBig2_Image **GSPLANES;\n    FX_INT32 J, K;\n    FX_DWORD x, y;\n    FX_DWORD *GSVALS;\n    CJBig2_GRDProc *pGRD;\n    GSPLANES = (CJBig2_Image **)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), GSBPP);\n    if (!GSPLANES) {\n        return NULL;\n    }\n    GSVALS = (FX_DWORD*)m_pModule->JBig2_Malloc3(sizeof(FX_DWORD), GSW, GSH);\n    if (!GSVALS) {\n        if (GSPLANES) {\n            m_pModule->JBig2_Free(GSPLANES);\n        }\n        return NULL;\n    }\n    JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*)*GSBPP);\n    JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD)*GSW * GSH);\n    JBIG2_ALLOC(pGRD, CJBig2_GRDProc());\n    pGRD->MMR = GSMMR;\n    pGRD->GBW = GSW;\n    pGRD->GBH = GSH;\n    FXCODEC_STATUS status = pGRD->Start_decode_MMR(&GSPLANES[GSBPP - 1], pStream);\n    while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {\n        pGRD->Continue_decode(pPause);\n    }\n    if(GSPLANES[GSBPP - 1] == NULL) {\n        goto failed;\n    }\n    pStream->alignByte();\n    pStream->offset(3);\n    J = GSBPP - 2;\n    while(J >= 0) {\n        FXCODEC_STATUS status = pGRD->Start_decode_MMR(&GSPLANES[J], pStream);\n        while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {\n            pGRD->Continue_decode(pPause);\n        }\n        if(GSPLANES[J] == NULL) {\n            for(K = GSBPP - 1; K > J; K--) {\n                delete GSPLANES[K];\n                goto failed;\n            }\n        }\n        pStream->alignByte();\n        pStream->offset(3);\n        GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR);\n        J = J - 1;\n    }\n    for(y = 0; y < GSH; y++) {\n        for(x = 0; x < GSW; x++) {\n            for(J = 0; J < GSBPP; J++) {\n                GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J;\n            }\n        }\n    }\n    for(J = 0; J < GSBPP; J++) {\n        delete GSPLANES[J];\n    }\n    m_pModule->JBig2_Free(GSPLANES);\n    delete pGRD;\n    return GSVALS;\nfailed:\n    m_pModule->JBig2_Free(GSPLANES);\n    delete pGRD;\n    m_pModule->JBig2_Free(GSVALS);\n    return NULL;\n}\nFXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)\n{\n    if (GBW == 0 || GBH == 0) {\n        m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;\n        return FXCODEC_STATUS_DECODE_FINISH;\n    }\n    m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY;\n    m_pPause = pPause;\n    if(*pImage == NULL) {\n        JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH));\n    }\n    if ((*pImage)->m_pData == NULL) {\n        delete *pImage;\n        *pImage = NULL;\n        m_pModule->JBig2_Error(\"Generic region decoding procedure: Create Image Failed with width = %d, height = %d\\n\", GBW, GBH);\n        m_ProssiveStatus = FXCODEC_STATUS_ERROR;\n        return FXCODEC_STATUS_ERROR;\n    }\n    m_DecodeType = 1;\n    m_pImage = pImage;\n    (*m_pImage)->fill(0);\n    m_pArithDecoder = pArithDecoder;\n    m_gbContext = gbContext;\n    LTP = 0;\n    m_pLine = NULL;\n    m_loopIndex = 0;\n    return decode_Arith(pPause);\n}\nFXCODEC_STATUS CJBig2_GRDProc::decode_Arith(IFX_Pause* pPause)\n{\n    int iline = m_loopIndex;\n    CJBig2_Image* pImage = *m_pImage;\n    if(GBTEMPLATE == 0) {\n        if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)\n                && (GBAT[2] == (signed char) - 3) && (GBAT[3] == (signed char) - 1)\n                && (GBAT[4] == 2) && (GBAT[5] == (signed char) - 2)\n                && (GBAT[6] == (signed char) - 2) && (GBAT[7] == (signed char) - 2)) {\n            m_ProssiveStatus = decode_Arith_Template0_opt3(pImage, m_pArithDecoder, m_gbContext, pPause);\n        } else {\n            m_ProssiveStatus = decode_Arith_Template0_unopt(pImage, m_pArithDecoder, m_gbContext, pPause);\n        }\n    } else if(GBTEMPLATE == 1) {\n        if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)) {\n            m_ProssiveStatus = decode_Arith_Template1_opt3(pImage, m_pArithDecoder, m_gbContext, pPause);\n        } else {\n            m_ProssiveStatus = decode_Arith_Template1_unopt(pImage, m_pArithDecoder, m_gbContext, pPause);\n        }\n    } else if(GBTEMPLATE == 2) {\n        if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) {\n            m_ProssiveStatus =  decode_Arith_Template2_opt3(pImage, m_pArithDecoder, m_gbContext, pPause);\n        } else {\n            m_ProssiveStatus =  decode_Arith_Template2_unopt(pImage, m_pArithDecoder, m_gbContext, pPause);\n        }\n    } else {\n        if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) {\n            m_ProssiveStatus = decode_Arith_Template3_opt3(pImage, m_pArithDecoder, m_gbContext, pPause);\n        } else {\n            m_ProssiveStatus = decode_Arith_Template3_unopt(pImage, m_pArithDecoder, m_gbContext, pPause);\n        }\n    }\n    m_ReplaceRect.left = 0;\n    m_ReplaceRect.right = pImage->m_nWidth;\n    m_ReplaceRect.top = iline;\n    m_ReplaceRect.bottom = m_loopIndex;\n    if(m_ProssiveStatus == FXCODEC_STATUS_DECODE_FINISH) {\n        m_loopIndex = 0;\n    }\n    return m_ProssiveStatus;\n}\nFXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith_V2(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)\n{\n    if(GBW == 0 || GBH == 0) {\n        * pImage = NULL;\n        m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;\n        return FXCODEC_STATUS_DECODE_FINISH;\n    }\n    if(*pImage == NULL) {\n        JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH));\n    }\n    if ((*pImage)->m_pData == NULL) {\n        delete *pImage;\n        *pImage = NULL;\n        m_pModule->JBig2_Error(\"Generic region decoding procedure: Create Image Failed with width = %d, height = %d\\n\", GBW, GBH);\n        m_ProssiveStatus = FXCODEC_STATUS_ERROR;\n        return FXCODEC_STATUS_ERROR;\n    }\n    m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY;\n    m_DecodeType = 2;\n    m_pPause = pPause;\n    m_pImage = pImage;\n    (*m_pImage)->fill(0);\n    LTP = 0;\n    m_loopIndex = 0;\n    m_pArithDecoder = pArithDecoder;\n    m_gbContext = gbContext;\n    return decode_Arith_V2(pPause);\n}\nFXCODEC_STATUS CJBig2_GRDProc::decode_Arith_V2(IFX_Pause* pPause)\n{\n    FX_BOOL SLTP, bVal;\n    FX_DWORD CONTEXT;\n    CJBig2_Image *GBREG = *m_pImage;\n    FX_DWORD line1, line2, line3;\n    LTP = 0;\n    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));\n    GBREG->fill(0);\n    for(; m_loopIndex < GBH; m_loopIndex++) {\n        if(TPGDON) {\n            switch(GBTEMPLATE) {\n                case 0:\n                    CONTEXT = 0x9b25;\n                    break;\n                case 1:\n                    CONTEXT = 0x0795;\n                    break;\n                case 2:\n                    CONTEXT = 0x00e5;\n                    break;\n                case 3:\n                    CONTEXT = 0x0195;\n                    break;\n            }\n            SLTP = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            GBREG->copyLine(m_loopIndex, m_loopIndex - 1);\n        } else {\n            switch(GBTEMPLATE) {\n                case 0: {\n                        line1 = GBREG->getPixel(1, m_loopIndex - 2);\n                        line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 1;\n                        line2 = GBREG->getPixel(2, m_loopIndex - 1);\n                        line2 |= GBREG->getPixel(1, m_loopIndex - 1) << 1;\n                        line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 2;\n                        line3 = 0;\n                        for(FX_DWORD w = 0; w < GBW; w++) {\n                            if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {\n                                bVal = 0;\n                            } else {\n                                CONTEXT = line3;\n                                CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;\n                                CONTEXT |= line2 << 5;\n                                CONTEXT |= GBREG->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) << 10;\n                                CONTEXT |= GBREG->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) << 11;\n                                CONTEXT |= line1 << 12;\n                                CONTEXT |= GBREG->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) << 15;\n                                bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);\n                            }\n                            if(bVal) {\n                                GBREG->setPixel(w, m_loopIndex, bVal);\n                            }\n                            line1 = ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 2)) & 0x07;\n                            line2 = ((line2 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 1)) & 0x1f;\n                            line3 = ((line3 << 1) | bVal) & 0x0f;\n                        }\n                    }\n                    break;\n                case 1: {\n                        line1 = GBREG->getPixel(2, m_loopIndex - 2);\n                        line1 |= GBREG->getPixel(1, m_loopIndex - 2) << 1;\n                        line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 2;\n                        line2 = GBREG->getPixel(2, m_loopIndex - 1);\n                        line2 |= GBREG->getPixel(1, m_loopIndex - 1) << 1;\n                        line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 2;\n                        line3 = 0;\n                        for(FX_DWORD w = 0; w < GBW; w++) {\n                            if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {\n                                bVal = 0;\n                            } else {\n                                CONTEXT = line3;\n                                CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 3;\n                                CONTEXT |= line2 << 4;\n                                CONTEXT |= line1 << 9;\n                                bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);\n                            }\n                            if(bVal) {\n                                GBREG->setPixel(w, m_loopIndex, bVal);\n                            }\n                            line1 = ((line1 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 2)) & 0x0f;\n                            line2 = ((line2 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 1)) & 0x1f;\n                            line3 = ((line3 << 1) | bVal) & 0x07;\n                        }\n                    }\n                    break;\n                case 2: {\n                        line1 = GBREG->getPixel(1, m_loopIndex - 2);\n                        line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 1;\n                        line2 = GBREG->getPixel(1, m_loopIndex - 1);\n                        line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 1;\n                        line3 = 0;\n                        for(FX_DWORD w = 0; w < GBW; w++) {\n                            if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {\n                                bVal = 0;\n                            } else {\n                                CONTEXT = line3;\n                                CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 2;\n                                CONTEXT |= line2 << 3;\n                                CONTEXT |= line1 << 7;\n                                bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);\n                            }\n                            if(bVal) {\n                                GBREG->setPixel(w, m_loopIndex, bVal);\n                            }\n                            line1 = ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 2)) & 0x07;\n                            line2 = ((line2 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 1)) & 0x0f;\n                            line3 = ((line3 << 1) | bVal) & 0x03;\n                        }\n                    }\n                    break;\n                case 3: {\n                        line1 = GBREG->getPixel(1, m_loopIndex - 1);\n                        line1 |= GBREG->getPixel(0, m_loopIndex - 1) << 1;\n                        line2 = 0;\n                        for(FX_DWORD w = 0; w < GBW; w++) {\n                            if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {\n                                bVal = 0;\n                            } else {\n                                CONTEXT = line2;\n                                CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;\n                                CONTEXT |= line1 << 5;\n                                bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);\n                            }\n                            if(bVal) {\n                                GBREG->setPixel(w, m_loopIndex, bVal);\n                            }\n                            line1 = ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 1)) & 0x1f;\n                            line2 = ((line2 << 1) | bVal) & 0x0f;\n                        }\n                    }\n                    break;\n            }\n        }\n        if(pPause && pPause->NeedToPauseNow()) {\n            m_loopIndex ++;\n            m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;\n            return FXCODEC_STATUS_DECODE_TOBECONTINUE;\n        }\n    }\n    m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;\n    return FXCODEC_STATUS_DECODE_FINISH;\n}\nFXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith_V1(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)\n{\n    if(GBW == 0 || GBH == 0) {\n        * pImage = NULL;\n        m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;\n        return FXCODEC_STATUS_DECODE_FINISH;\n    }\n    if(*pImage == NULL) {\n        JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH));\n    }\n    if ((*pImage)->m_pData == NULL) {\n        delete *pImage;\n        *pImage = NULL;\n        m_pModule->JBig2_Error(\"Generic region decoding procedure: Create Image Failed with width = %d, height = %d\\n\", GBW, GBH);\n        m_ProssiveStatus = FXCODEC_STATUS_ERROR;\n        return FXCODEC_STATUS_ERROR;\n    }\n    m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY;\n    m_pPause = pPause;\n    m_pImage = pImage;\n    m_DecodeType = 3;\n    (*m_pImage)->fill(0);\n    LTP = 0;\n    m_loopIndex = 0;\n    m_pArithDecoder = pArithDecoder;\n    m_gbContext = gbContext;\n    return decode_Arith_V1(pPause);\n}\nFXCODEC_STATUS CJBig2_GRDProc::decode_Arith_V1(IFX_Pause* pPause)\n{\n    FX_BOOL SLTP, bVal;\n    FX_DWORD CONTEXT = 0;\n    CJBig2_Image *GBREG = (*m_pImage);\n    for(; m_loopIndex < GBH; m_loopIndex++) {\n        if(TPGDON) {\n            switch(GBTEMPLATE) {\n                case 0:\n                    CONTEXT = 0x9b25;\n                    break;\n                case 1:\n                    CONTEXT = 0x0795;\n                    break;\n                case 2:\n                    CONTEXT = 0x00e5;\n                    break;\n                case 3:\n                    CONTEXT = 0x0195;\n                    break;\n            }\n            SLTP = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            for(FX_DWORD w = 0; w < GBW; w++) {\n                GBREG->setPixel(w, m_loopIndex, GBREG->getPixel(w, m_loopIndex - 1));\n            }\n        } else {\n            for(FX_DWORD w = 0; w < GBW; w++) {\n                if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {\n                    GBREG->setPixel(w, m_loopIndex, 0);\n                } else {\n                    CONTEXT = 0;\n                    switch(GBTEMPLATE) {\n                        case 0:\n                            CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);\n                            CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;\n                            CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2;\n                            CONTEXT |= GBREG->getPixel(w - 4, m_loopIndex) << 3;\n                            CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;\n                            CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 1) << 5;\n                            CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 6;\n                            CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 7;\n                            CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 8;\n                            CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 9;\n                            CONTEXT |= GBREG->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) << 10;\n                            CONTEXT |= GBREG->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) << 11;\n                            CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 12;\n                            CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 13;\n                            CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 14;\n                            CONTEXT |= GBREG->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) << 15;\n                            break;\n                        case 1:\n                            CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);\n                            CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;\n                            CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2;\n                            CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 3;\n                            CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 1) << 4;\n                            CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 5;\n                            CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 6;\n                            CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 7;\n                            CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 8;\n                            CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 2) << 9;\n                            CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 10;\n                            CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 11;\n                            CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 12;\n                            break;\n                        case 2:\n                            CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);\n                            CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;\n                            CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 2;\n                            CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 3;\n                            CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 4;\n                            CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 5;\n                            CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 6;\n                            CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 7;\n                            CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 8;\n                            CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 9;\n                            break;\n                        case 3:\n                            CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);\n                            CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;\n                            CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2;\n                            CONTEXT |= GBREG->getPixel(w - 4, m_loopIndex) << 3;\n                            CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;\n                            CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 5;\n                            CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 6;\n                            CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 7;\n                            CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 8;\n                            CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex - 1) << 9;\n                            break;\n                    }\n                    bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);\n                    GBREG->setPixel(w, m_loopIndex, bVal);\n                }\n            }\n        }\n        if(pPause && pPause->NeedToPauseNow()) {\n            m_loopIndex ++;\n            m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;\n            return FXCODEC_STATUS_DECODE_TOBECONTINUE;\n        }\n    }\n    m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;\n    return FXCODEC_STATUS_DECODE_FINISH;\n}\nFXCODEC_STATUS CJBig2_GRDProc::Start_decode_MMR(CJBig2_Image** pImage, CJBig2_BitStream *pStream, IFX_Pause* pPause)\n{\n    int bitpos, i;\n    JBIG2_ALLOC((* pImage), CJBig2_Image(GBW, GBH));\n    if ((* pImage)->m_pData == NULL) {\n        delete (* pImage);\n        (* pImage) = NULL;\n        m_pModule->JBig2_Error(\"Generic region decoding procedure: Create Image Failed with width = %d, height = %d\\n\", GBW, GBH);\n        m_ProssiveStatus = FXCODEC_STATUS_ERROR;\n        return m_ProssiveStatus;\n    }\n    bitpos = (int)pStream->getBitPos();\n    _FaxG4Decode(m_pModule, pStream->getBuf(), pStream->getLength(), &bitpos, (* pImage)->m_pData, GBW, GBH, (* pImage)->m_nStride);\n    pStream->setBitPos(bitpos);\n    for(i = 0; (FX_DWORD)i < (* pImage)->m_nStride * GBH; i++) {\n        (* pImage)->m_pData[i] = ~(* pImage)->m_pData[i];\n    }\n    m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;\n    return m_ProssiveStatus;\n}\nFXCODEC_STATUS CJBig2_GRDProc::decode_MMR()\n{\n    return m_ProssiveStatus;\n}\nFXCODEC_STATUS CJBig2_GRDProc::Continue_decode(IFX_Pause* pPause)\n{\n    if(m_ProssiveStatus != FXCODEC_STATUS_DECODE_TOBECONTINUE) {\n        return m_ProssiveStatus;\n    }\n    switch (m_DecodeType) {\n        case 1:\n            return decode_Arith(pPause);\n        case 2:\n            return decode_Arith_V2(pPause);\n        case 3:\n            return decode_Arith_V1(pPause);\n        case 4:\n            return decode_MMR();\n    }\n    m_ProssiveStatus = FXCODEC_STATUS_ERROR;\n    return m_ProssiveStatus;\n}\nFXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template0_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)\n{\n    FX_BOOL SLTP, bVal;\n    FX_DWORD CONTEXT;\n    FX_DWORD line1, line2;\n    FX_BYTE *pLine1, *pLine2, cVal;\n    FX_INT32 nStride, nStride2, k;\n    FX_INT32 nLineBytes, nBitsLeft, cc;\n    if(m_pLine == NULL) {\n        m_pLine = pImage->m_pData;\n    }\n    nStride = pImage->m_nStride;\n    nStride2 = nStride << 1;\n    nLineBytes = ((GBW + 7) >> 3) - 1;\n    nBitsLeft = GBW - (nLineBytes << 3);\n    FX_DWORD height = GBH & 0x7fffffff;\n    for(; m_loopIndex < height; m_loopIndex++) {\n        if(TPGDON) {\n            SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            pImage->copyLine(m_loopIndex, m_loopIndex - 1);\n        } else {\n            if(m_loopIndex > 1) {\n                pLine1 = m_pLine - nStride2;\n                pLine2 = m_pLine - nStride;\n                line1 = (*pLine1++) << 6;\n                line2 = *pLine2++;\n                CONTEXT = ((line1 & 0xf800) | (line2 & 0x07f0));\n                for(cc = 0; cc < nLineBytes; cc++) {\n                    line1 = (line1 << 8) | ((*pLine1++) << 6);\n                    line2 = (line2 << 8) | (*pLine2++);\n                    cVal = 0;\n                    for(k = 7; k >= 0; k--) {\n                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                        cVal |= bVal << k;\n                        CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal\n                                   | ((line1 >> k) & 0x0800)\n                                   | ((line2 >> k) & 0x0010));\n                    }\n                    m_pLine[cc] = cVal;\n                }\n                line1 <<= 8;\n                line2 <<= 8;\n                cVal = 0;\n                for(k = 0; k < nBitsLeft; k++) {\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                    cVal |= bVal << (7 - k);\n                    CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal\n                               | ((line1 >> (7 - k)) & 0x0800)\n                               | ((line2 >> (7 - k)) & 0x0010));\n                }\n                m_pLine[nLineBytes] = cVal;\n            } else {\n                pLine2 = m_pLine - nStride;\n                line2 = (m_loopIndex & 1) ? (*pLine2++) : 0;\n                CONTEXT = (line2 & 0x07f0);\n                for(cc = 0; cc < nLineBytes; cc++) {\n                    if(m_loopIndex & 1) {\n                        line2 = (line2 << 8) | (*pLine2++);\n                    }\n                    cVal = 0;\n                    for(k = 7; k >= 0; k--) {\n                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                        cVal |= bVal << k;\n                        CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal\n                                   | ((line2 >> k) & 0x0010));\n                    }\n                    m_pLine[cc] = cVal;\n                }\n                line2 <<= 8;\n                cVal = 0;\n                for(k = 0; k < nBitsLeft; k++) {\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                    cVal |= bVal << (7 - k);\n                    CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal\n                               | ((line2 >> (7 - k)) & 0x0010));\n                }\n                m_pLine[nLineBytes] = cVal;\n            }\n        }\n        m_pLine += nStride;\n        if(pPause && pPause->NeedToPauseNow()) {\n            m_loopIndex++;\n            m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;\n            return FXCODEC_STATUS_DECODE_TOBECONTINUE;\n        }\n    }\n    m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;\n    return FXCODEC_STATUS_DECODE_FINISH;\n}\nFXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template0_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)\n{\n    FX_BOOL SLTP, bVal;\n    FX_DWORD CONTEXT;\n    FX_DWORD line1, line2, line3;\n    for(; m_loopIndex < GBH; m_loopIndex++) {\n        if(TPGDON) {\n            SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            pImage->copyLine(m_loopIndex, m_loopIndex - 1);\n        } else {\n            line1 = pImage->getPixel(1, m_loopIndex - 2);\n            line1 |= pImage->getPixel(0, m_loopIndex - 2) << 1;\n            line2 = pImage->getPixel(2, m_loopIndex - 1);\n            line2 |= pImage->getPixel(1, m_loopIndex - 1) << 1;\n            line2 |= pImage->getPixel(0, m_loopIndex - 1) << 2;\n            line3 = 0;\n            for(FX_DWORD w = 0; w < GBW; w++) {\n                if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {\n                    bVal = 0;\n                } else {\n                    CONTEXT = line3;\n                    CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;\n                    CONTEXT |= line2 << 5;\n                    CONTEXT |= pImage->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) << 10;\n                    CONTEXT |= pImage->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) << 11;\n                    CONTEXT |= line1 << 12;\n                    CONTEXT |= pImage->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) << 15;\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                }\n                if(bVal) {\n                    pImage->setPixel(w, m_loopIndex, bVal);\n                }\n                line1 = ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 2)) & 0x07;\n                line2 = ((line2 << 1) | pImage->getPixel(w + 3, m_loopIndex - 1)) & 0x1f;\n                line3 = ((line3 << 1) | bVal) & 0x0f;\n            }\n        }\n        if(pPause && pPause->NeedToPauseNow()) {\n            m_loopIndex++;\n            m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;\n            return FXCODEC_STATUS_DECODE_TOBECONTINUE;\n        }\n    }\n    m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;\n    return FXCODEC_STATUS_DECODE_FINISH;\n}\nFXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)\n{\n    FX_BOOL SLTP, bVal;\n    FX_DWORD CONTEXT;\n    FX_DWORD line1, line2;\n    FX_BYTE *pLine1, *pLine2, cVal;\n    FX_INT32 nStride, nStride2, k;\n    FX_INT32 nLineBytes, nBitsLeft, cc;\n    if (!m_pLine) {\n        m_pLine = pImage->m_pData;\n    }\n    nStride = pImage->m_nStride;\n    nStride2 = nStride << 1;\n    nLineBytes = ((GBW + 7) >> 3) - 1;\n    nBitsLeft = GBW - (nLineBytes << 3);\n    for(; m_loopIndex < GBH; m_loopIndex++) {\n        if(TPGDON) {\n            SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            pImage->copyLine(m_loopIndex, m_loopIndex - 1);\n        } else {\n            if(m_loopIndex > 1) {\n                pLine1 = m_pLine - nStride2;\n                pLine2 = m_pLine - nStride;\n                line1 = (*pLine1++) << 4;\n                line2 = *pLine2++;\n                CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8);\n                for(cc = 0; cc < nLineBytes; cc++) {\n                    line1 = (line1 << 8) | ((*pLine1++) << 4);\n                    line2 = (line2 << 8) | (*pLine2++);\n                    cVal = 0;\n                    for(k = 7; k >= 0; k--) {\n                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                        cVal |= bVal << k;\n                        CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal\n                                  | ((line1 >> k) & 0x0200)\n                                  | ((line2 >> (k + 1)) & 0x0008);\n                    }\n                    m_pLine[cc] = cVal;\n                }\n                line1 <<= 8;\n                line2 <<= 8;\n                cVal = 0;\n                for(k = 0; k < nBitsLeft; k++) {\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                    cVal |= bVal << (7 - k);\n                    CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal\n                              | ((line1 >> (7 - k)) & 0x0200)\n                              | ((line2 >> (8 - k)) & 0x0008);\n                }\n                m_pLine[nLineBytes] = cVal;\n            } else {\n                pLine2 = m_pLine - nStride;\n                line2 = (m_loopIndex & 1) ? (*pLine2++) : 0;\n                CONTEXT = (line2 >> 1) & 0x01f8;\n                for(cc = 0; cc < nLineBytes; cc++) {\n                    if(m_loopIndex & 1) {\n                        line2 = (line2 << 8) | (*pLine2++);\n                    }\n                    cVal = 0;\n                    for(k = 7; k >= 0; k--) {\n                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                        cVal |= bVal << k;\n                        CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal\n                                  | ((line2 >> (k + 1)) & 0x0008);\n                    }\n                    m_pLine[cc] = cVal;\n                }\n                line2 <<= 8;\n                cVal = 0;\n                for(k = 0; k < nBitsLeft; k++) {\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                    cVal |= bVal << (7 - k);\n                    CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal\n                              | ((line2 >> (8 - k)) & 0x0008);\n                }\n                m_pLine[nLineBytes] = cVal;\n            }\n        }\n        m_pLine += nStride;\n        if(pPause && pPause->NeedToPauseNow()) {\n            m_loopIndex++;\n            m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;\n            return FXCODEC_STATUS_DECODE_TOBECONTINUE;\n        }\n    }\n    m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;\n    return FXCODEC_STATUS_DECODE_FINISH;\n}\nFXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)\n{\n    FX_BOOL SLTP, bVal;\n    FX_DWORD CONTEXT;\n    FX_DWORD line1, line2, line3;\n    for(FX_DWORD h = 0; h < GBH; h++) {\n        if(TPGDON) {\n            SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            pImage->copyLine(h, h - 1);\n        } else {\n            line1 = pImage->getPixel(2, h - 2);\n            line1 |= pImage->getPixel(1, h - 2) << 1;\n            line1 |= pImage->getPixel(0, h - 2) << 2;\n            line2 = pImage->getPixel(2, h - 1);\n            line2 |= pImage->getPixel(1, h - 1) << 1;\n            line2 |= pImage->getPixel(0, h - 1) << 2;\n            line3 = 0;\n            for(FX_DWORD w = 0; w < GBW; w++) {\n                if(USESKIP && SKIP->getPixel(w, h)) {\n                    bVal = 0;\n                } else {\n                    CONTEXT = line3;\n                    CONTEXT |= pImage->getPixel(w + GBAT[0], h + GBAT[1]) << 3;\n                    CONTEXT |= line2 << 4;\n                    CONTEXT |= line1 << 9;\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                }\n                if(bVal) {\n                    pImage->setPixel(w, h, bVal);\n                }\n                line1 = ((line1 << 1) | pImage->getPixel(w + 3, h - 2)) & 0x0f;\n                line2 = ((line2 << 1) | pImage->getPixel(w + 3, h - 1)) & 0x1f;\n                line3 = ((line3 << 1) | bVal) & 0x07;\n            }\n        }\n        if(pPause && pPause->NeedToPauseNow()) {\n            m_loopIndex++;\n            m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;\n            return FXCODEC_STATUS_DECODE_TOBECONTINUE;\n        }\n    }\n    m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;\n    return FXCODEC_STATUS_DECODE_FINISH;\n}\nFXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)\n{\n    FX_BOOL SLTP, bVal;\n    FX_DWORD CONTEXT;\n    FX_DWORD line1, line2;\n    FX_BYTE *pLine1, *pLine2, cVal;\n    FX_INT32 nStride, nStride2, k;\n    FX_INT32 nLineBytes, nBitsLeft, cc;\n    if(!m_pLine) {\n        m_pLine = pImage->m_pData;\n    }\n    nStride = pImage->m_nStride;\n    nStride2 = nStride << 1;\n    nLineBytes = ((GBW + 7) >> 3) - 1;\n    nBitsLeft = GBW - (nLineBytes << 3);\n    for(; m_loopIndex < GBH; m_loopIndex++) {\n        if(TPGDON) {\n            SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            pImage->copyLine(m_loopIndex, m_loopIndex - 1);\n        } else {\n            if(m_loopIndex > 1) {\n                pLine1 = m_pLine - nStride2;\n                pLine2 = m_pLine - nStride;\n                line1 = (*pLine1++) << 1;\n                line2 = *pLine2++;\n                CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c);\n                for(cc = 0; cc < nLineBytes; cc++) {\n                    line1 = (line1 << 8) | ((*pLine1++) << 1);\n                    line2 = (line2 << 8) | (*pLine2++);\n                    cVal = 0;\n                    for(k = 7; k >= 0; k--) {\n                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                        cVal |= bVal << k;\n                        CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal\n                                  | ((line1 >> k) & 0x0080)\n                                  | ((line2 >> (k + 3)) & 0x0004);\n                    }\n                    m_pLine[cc] = cVal;\n                }\n                line1 <<= 8;\n                line2 <<= 8;\n                cVal = 0;\n                for(k = 0; k < nBitsLeft; k++) {\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                    cVal |= bVal << (7 - k);\n                    CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal\n                              | ((line1 >> (7 - k)) & 0x0080)\n                              | ((line2 >> (10 - k)) & 0x0004);\n                }\n                m_pLine[nLineBytes] = cVal;\n            } else {\n                pLine2 = m_pLine - nStride;\n                line2 = (m_loopIndex & 1) ? (*pLine2++) : 0;\n                CONTEXT = (line2 >> 3) & 0x007c;\n                for(cc = 0; cc < nLineBytes; cc++) {\n                    if(m_loopIndex & 1) {\n                        line2 = (line2 << 8) | (*pLine2++);\n                    }\n                    cVal = 0;\n                    for(k = 7; k >= 0; k--) {\n                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                        cVal |= bVal << k;\n                        CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal\n                                  | ((line2 >> (k + 3)) & 0x0004);\n                    }\n                    m_pLine[cc] = cVal;\n                }\n                line2 <<= 8;\n                cVal = 0;\n                for(k = 0; k < nBitsLeft; k++) {\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                    cVal |= bVal << (7 - k);\n                    CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal\n                              | (((line2 >> (10 - k))) & 0x0004);\n                }\n                m_pLine[nLineBytes] = cVal;\n            }\n        }\n        m_pLine += nStride;\n        if(pPause && m_loopIndex % 50 == 0 && pPause->NeedToPauseNow()) {\n            m_loopIndex++;\n            m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;\n            return FXCODEC_STATUS_DECODE_TOBECONTINUE;\n        }\n    }\n    m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;\n    return FXCODEC_STATUS_DECODE_FINISH;\n}\nFXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)\n{\n    FX_BOOL SLTP, bVal;\n    FX_DWORD CONTEXT;\n    FX_DWORD line1, line2, line3;\n    for(; m_loopIndex < GBH; m_loopIndex++) {\n        if(TPGDON) {\n            SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            pImage->copyLine(m_loopIndex, m_loopIndex - 1);\n        } else {\n            line1 = pImage->getPixel(1, m_loopIndex - 2);\n            line1 |= pImage->getPixel(0, m_loopIndex - 2) << 1;\n            line2 = pImage->getPixel(1, m_loopIndex - 1);\n            line2 |= pImage->getPixel(0, m_loopIndex - 1) << 1;\n            line3 = 0;\n            for(FX_DWORD w = 0; w < GBW; w++) {\n                if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {\n                    bVal = 0;\n                } else {\n                    CONTEXT = line3;\n                    CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 2;\n                    CONTEXT |= line2 << 3;\n                    CONTEXT |= line1 << 7;\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                }\n                if(bVal) {\n                    pImage->setPixel(w, m_loopIndex, bVal);\n                }\n                line1 = ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 2)) & 0x07;\n                line2 = ((line2 << 1) | pImage->getPixel(w + 2, m_loopIndex - 1)) & 0x0f;\n                line3 = ((line3 << 1) | bVal) & 0x03;\n            }\n        }\n        if(pPause && pPause->NeedToPauseNow()) {\n            m_loopIndex++;\n            m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;\n            return FXCODEC_STATUS_DECODE_TOBECONTINUE;\n        }\n    }\n    m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;\n    return FXCODEC_STATUS_DECODE_FINISH;\n}\nFXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)\n{\n    FX_BOOL SLTP, bVal;\n    FX_DWORD CONTEXT;\n    FX_DWORD line1;\n    FX_BYTE *pLine1, cVal;\n    FX_INT32 nStride, k;\n    FX_INT32 nLineBytes, nBitsLeft, cc;\n    if (!m_pLine) {\n        m_pLine = pImage->m_pData;\n    }\n    nStride = pImage->m_nStride;\n    nLineBytes = ((GBW + 7) >> 3) - 1;\n    nBitsLeft = GBW - (nLineBytes << 3);\n    for(; m_loopIndex < GBH; m_loopIndex++) {\n        if(TPGDON) {\n            SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            pImage->copyLine(m_loopIndex, m_loopIndex - 1);\n        } else {\n            if(m_loopIndex > 0) {\n                pLine1 = m_pLine - nStride;\n                line1 = *pLine1++;\n                CONTEXT = (line1 >> 1) & 0x03f0;\n                for(cc = 0; cc < nLineBytes; cc++) {\n                    line1 = (line1 << 8) | (*pLine1++);\n                    cVal = 0;\n                    for(k = 7; k >= 0; k--) {\n                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                        cVal |= bVal << k;\n                        CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal\n                                  | ((line1 >> (k + 1)) & 0x0010);\n                    }\n                    m_pLine[cc] = cVal;\n                }\n                line1 <<= 8;\n                cVal = 0;\n                for(k = 0; k < nBitsLeft; k++) {\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                    cVal |= bVal << (7 - k);\n                    CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal\n                              | ((line1 >> (8 - k)) & 0x0010);\n                }\n                m_pLine[nLineBytes] = cVal;\n            } else {\n                CONTEXT = 0;\n                for(cc = 0; cc < nLineBytes; cc++) {\n                    cVal = 0;\n                    for(k = 7; k >= 0; k--) {\n                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                        cVal |= bVal << k;\n                        CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;\n                    }\n                    m_pLine[cc] = cVal;\n                }\n                cVal = 0;\n                for(k = 0; k < nBitsLeft; k++) {\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                    cVal |= bVal << (7 - k);\n                    CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;\n                }\n                m_pLine[nLineBytes] = cVal;\n            }\n        }\n        m_pLine += nStride;\n        if(pPause && pPause->NeedToPauseNow()) {\n            m_loopIndex++;\n            m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;\n            return FXCODEC_STATUS_DECODE_TOBECONTINUE;\n        }\n    }\n    m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;\n    return FXCODEC_STATUS_DECODE_FINISH;\n}\nFXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)\n{\n    FX_BOOL SLTP, bVal;\n    FX_DWORD CONTEXT;\n    FX_DWORD line1, line2;\n    for(; m_loopIndex < GBH; m_loopIndex++) {\n        if(TPGDON) {\n            SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);\n            LTP = LTP ^ SLTP;\n        }\n        if(LTP == 1) {\n            pImage->copyLine(m_loopIndex, m_loopIndex - 1);\n        } else {\n            line1 = pImage->getPixel(1, m_loopIndex - 1);\n            line1 |= pImage->getPixel(0, m_loopIndex - 1) << 1;\n            line2 = 0;\n            for(FX_DWORD w = 0; w < GBW; w++) {\n                if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {\n                    bVal = 0;\n                } else {\n                    CONTEXT = line2;\n                    CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;\n                    CONTEXT |= line1 << 5;\n                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);\n                }\n                if(bVal) {\n                    pImage->setPixel(w, m_loopIndex, bVal);\n                }\n                line1 = ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 1)) & 0x1f;\n                line2 = ((line2 << 1) | bVal) & 0x0f;\n            }\n        }\n        if(pPause && pPause->NeedToPauseNow()) {\n            m_loopIndex++;\n            m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;\n            return FXCODEC_STATUS_DECODE_TOBECONTINUE;\n        }\n    }\n    m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;\n    return FXCODEC_STATUS_DECODE_FINISH;\n}\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_GeneralDecoder.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JBIG2_GENERAL_DECODER_H_\n#define _JBIG2_GENERAL_DECODER_H_\n#include \"../../../include/fxcodec/fx_codec_def.h\"\n#include \"../../../include/fxcrt/fx_basic.h\"\n#include \"JBig2_Define.h\"\n#include \"JBig2_SymbolDict.h\"\n#include \"JBig2_ArithDecoder.h\"\n#include \"JBig2_ArithIntDecoder.h\"\n#include \"../../../include/fxcrt/fx_coordinates.h\"\nclass CJBig2_HuffmanTable;\nclass CJBig2_Image;\nclass CJBig2_PatternDict;\ntypedef enum {\n    JBIG2_CORNER_BOTTOMLEFT = 0,\n    JBIG2_CORNER_TOPLEFT\t= 1,\n    JBIG2_CORNER_BOTTOMRIGHT = 2,\n    JBIG2_CORNER_TOPRIGHT\t= 3\n} JBig2Corner;\nclass CJBig2_GRDProc : public CJBig2_Object\n{\npublic:\n    CJBig2_GRDProc()\n    {\n        m_loopIndex = 0;\n        m_pLine = NULL;\n        m_pPause = NULL;\n        m_DecodeType = 0;\n        LTP = 0;\n        m_ReplaceRect.left = 0;\n        m_ReplaceRect.bottom = 0;\n        m_ReplaceRect.top = 0;\n        m_ReplaceRect.right = 0;\n    }\n\n    CJBig2_Image *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);\n\n    CJBig2_Image *decode_Arith_V2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);\n\n    CJBig2_Image *decode_Arith_V1(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);\n\n    CJBig2_Image *decode_MMR(CJBig2_BitStream *pStream);\n    FXCODEC_STATUS Start_decode_Arith(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause = NULL);\n    FXCODEC_STATUS Start_decode_Arith_V2(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause = NULL);\n    FXCODEC_STATUS Start_decode_Arith_V1(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause = NULL);\n    FXCODEC_STATUS Start_decode_MMR(CJBig2_Image** pImage, CJBig2_BitStream *pStream, IFX_Pause* pPause = NULL);\n    FXCODEC_STATUS Continue_decode(IFX_Pause* pPause);\n    FX_RECT\t\t   GetReplaceRect()\n    {\n        return m_ReplaceRect;\n    };\nprivate:\n    FXCODEC_STATUS decode_Arith(IFX_Pause* pPause);\n    FXCODEC_STATUS decode_Arith_V2(IFX_Pause* pPause);\n    FXCODEC_STATUS decode_Arith_V1(IFX_Pause* pPause);\n    FXCODEC_STATUS decode_MMR();\n    FXCODEC_STATUS decode_Arith_Template0_opt3(CJBig2_Image*pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);\n    FXCODEC_STATUS decode_Arith_Template0_unopt(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);\n    FXCODEC_STATUS decode_Arith_Template1_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);\n    FXCODEC_STATUS decode_Arith_Template1_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);\n    FXCODEC_STATUS decode_Arith_Template2_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);\n    FXCODEC_STATUS decode_Arith_Template2_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);\n    FXCODEC_STATUS decode_Arith_Template3_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);\n    FXCODEC_STATUS decode_Arith_Template3_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);\n    FX_DWORD\tm_loopIndex;\n    FX_BYTE *\tm_pLine;\n    IFX_Pause*\tm_pPause;\n    FXCODEC_STATUS\tm_ProssiveStatus;\n    CJBig2_Image** m_pImage;\n    CJBig2_ArithDecoder *m_pArithDecoder;\n    JBig2ArithCtx *m_gbContext;\n    FX_WORD\t\tm_DecodeType;\n    FX_BOOL LTP;\n    FX_RECT m_ReplaceRect;\nprivate:\n\n    CJBig2_Image *decode_Arith_Template0_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);\n\n    CJBig2_Image *decode_Arith_Template0_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);\n\n    CJBig2_Image *decode_Arith_Template0_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);\n\n    CJBig2_Image *decode_Arith_Template0_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);\n\n    CJBig2_Image *decode_Arith_Template1_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);\n\n    CJBig2_Image *decode_Arith_Template1_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);\n\n    CJBig2_Image *decode_Arith_Template1_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);\n\n    CJBig2_Image *decode_Arith_Template1_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);\n\n    CJBig2_Image *decode_Arith_Template2_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);\n\n    CJBig2_Image *decode_Arith_Template2_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);\n\n    CJBig2_Image *decode_Arith_Template2_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);\n\n    CJBig2_Image *decode_Arith_Template2_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);\n\n    CJBig2_Image *decode_Arith_Template3_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);\n\n    CJBig2_Image *decode_Arith_Template3_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);\n\n    CJBig2_Image *decode_Arith_Template3_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);\n\n    CJBig2_Image *decode_Arith_Template3_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);\npublic:\n    FX_BOOL MMR;\n    FX_DWORD GBW;\n    FX_DWORD GBH;\n    FX_BYTE GBTEMPLATE;\n    FX_BOOL TPGDON;\n    FX_BOOL USESKIP;\n    CJBig2_Image * SKIP;\n    signed char GBAT[8];\n};\nclass CJBig2_GRRDProc : public CJBig2_Object\n{\npublic:\n\n    CJBig2_Image *decode(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);\n\n    CJBig2_Image *decode_Template0_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);\n\n    CJBig2_Image *decode_Template0_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);\n\n    CJBig2_Image *decode_Template1_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);\n\n    CJBig2_Image *decode_Template1_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);\n\n    CJBig2_Image *decode_V1(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);\npublic:\n    FX_DWORD GRW;\n    FX_DWORD GRH;\n    FX_BOOL GRTEMPLATE;\n    CJBig2_Image *GRREFERENCE;\n    FX_INT32 GRREFERENCEDX;\n    FX_INT32 GRREFERENCEDY;\n    FX_BOOL TPGRON;\n    signed char\tGRAT[4];\n};\ntypedef struct {\n    CJBig2_ArithIntDecoder *IADT,\n                           *IAFS,\n                           *IADS,\n                           *IAIT,\n                           *IARI,\n                           *IARDW,\n                           *IARDH,\n                           *IARDX,\n                           *IARDY;\n    CJBig2_ArithIaidDecoder *IAID;\n} JBig2IntDecoderState;\nclass CJBig2_TRDProc : public CJBig2_Object\n{\npublic:\n\n    CJBig2_Image *decode_Huffman(CJBig2_BitStream *pStream, JBig2ArithCtx *grContext);\n\n    CJBig2_Image *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext,\n                               JBig2IntDecoderState *pIDS = NULL);\npublic:\n    FX_BOOL SBHUFF;\n    FX_BOOL SBREFINE;\n    FX_DWORD SBW;\n    FX_DWORD SBH;\n    FX_DWORD SBNUMINSTANCES;\n    FX_DWORD SBSTRIPS;\n    FX_DWORD SBNUMSYMS;\n\n    JBig2HuffmanCode *SBSYMCODES;\n    FX_BYTE SBSYMCODELEN;\n\n    CJBig2_Image **SBSYMS;\n    FX_BOOL SBDEFPIXEL;\n\n    JBig2ComposeOp SBCOMBOP;\n    FX_BOOL TRANSPOSED;\n\n    JBig2Corner REFCORNER;\n    signed char SBDSOFFSET;\n    CJBig2_HuffmanTable *SBHUFFFS,\n                        *SBHUFFDS,\n                        *SBHUFFDT,\n                        *SBHUFFRDW,\n                        *SBHUFFRDH,\n                        *SBHUFFRDX,\n                        *SBHUFFRDY,\n                        *SBHUFFRSIZE;\n    FX_BOOL SBRTEMPLATE;\n    signed char SBRAT[4];\n};\nclass CJBig2_SDDProc : public CJBig2_Object\n{\npublic:\n\n    CJBig2_SymbolDict *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext);\n\n    CJBig2_SymbolDict *decode_Huffman(CJBig2_BitStream *pStream, JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext, IFX_Pause* pPause);\npublic:\n    FX_BOOL SDHUFF;\n    FX_BOOL SDREFAGG;\n    FX_DWORD SDNUMINSYMS;\n    CJBig2_Image ** SDINSYMS;\n    FX_DWORD SDNUMNEWSYMS;\n    FX_DWORD SDNUMEXSYMS;\n    CJBig2_HuffmanTable *SDHUFFDH,\n                        *SDHUFFDW,\n                        *SDHUFFBMSIZE,\n                        *SDHUFFAGGINST;\n    FX_BYTE SDTEMPLATE;\n    signed char SDAT[8];\n    FX_BOOL SDRTEMPLATE;\n    signed char SDRAT[4];\n};\nclass CJBig2_HTRDProc : public CJBig2_Object\n{\npublic:\n\n    CJBig2_Image *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);\n\n    CJBig2_Image *decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause);\npublic:\n    FX_DWORD HBW,\n             HBH;\n    FX_BOOL HMMR;\n    FX_BYTE HTEMPLATE;\n    FX_DWORD HNUMPATS;\n    CJBig2_Image **HPATS;\n    FX_BOOL HDEFPIXEL;\n    JBig2ComposeOp HCOMBOP;\n    FX_BOOL HENABLESKIP;\n    FX_DWORD HGW,\n             HGH;\n    FX_INT32 HGX,\n             HGY;\n    FX_WORD HRX,\n            HRY;\n    FX_BYTE HPW,\n            HPH;\n};\nclass CJBig2_PDDProc : public CJBig2_Object\n{\npublic:\n\n    CJBig2_PatternDict *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);\n\n    CJBig2_PatternDict *decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause);\npublic:\n    FX_BOOL HDMMR;\n    FX_BYTE HDPW,\n            HDPH;\n    FX_DWORD GRAYMAX;\n    FX_BYTE HDTEMPLATE;\n};\nclass CJBig2_GSIDProc : public CJBig2_Object\n{\npublic:\n\n    FX_DWORD *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);\n\n    FX_DWORD *decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause);\npublic:\n    FX_BOOL GSMMR;\n    FX_BOOL GSUSESKIP;\n    FX_BYTE GSBPP;\n    FX_DWORD GSW,\n             GSH;\n    FX_BYTE GSTEMPLATE;\n    CJBig2_Image *GSKIP;\n};\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"JBig2_HuffmanDecoder.h\"\nCJBig2_HuffmanDecoder::CJBig2_HuffmanDecoder(CJBig2_BitStream *pStream)\n{\n    m_pStream = pStream;\n}\nCJBig2_HuffmanDecoder::~CJBig2_HuffmanDecoder()\n{\n}\nint CJBig2_HuffmanDecoder::decodeAValue(CJBig2_HuffmanTable *pTable, int *nResult)\n{\n    int nVal, nTmp, i, nBits;\n    nVal = 0;\n    nBits = 0;\n    while(1) {\n        if(m_pStream->read1Bit(&nTmp) == -1) {\n            return -1;\n        }\n        nVal = (nVal << 1) | nTmp;\n        nBits ++;\n        for(i = 0; i < pTable->NTEMP; i++) {\n            if((pTable->PREFLEN[i] == nBits) && (pTable->CODES[i] == nVal)) {\n                if((pTable->HTOOB == 1) && (i == pTable->NTEMP - 1)) {\n                    return JBIG2_OOB;\n                }\n                if(m_pStream->readNBits(pTable->RANGELEN[i], &nTmp) == -1) {\n                    return -1;\n                }\n                if(pTable->HTOOB) {\n                    if(i == pTable->NTEMP - 3) {\n                        *nResult = pTable->RANGELOW[i] - nTmp;\n                        return 0;\n                    } else {\n                        *nResult = pTable->RANGELOW[i] + nTmp;\n                        return 0;\n                    }\n                } else {\n                    if(i == pTable->NTEMP - 2) {\n                        *nResult = pTable->RANGELOW[i] - nTmp;\n                        return 0;\n                    } else {\n                        *nResult = pTable->RANGELOW[i] + nTmp;\n                        return 0;\n                    }\n                }\n            }\n        }\n    }\n    return -2;\n}\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JBIG2_HUFFMAN_DECODER_H_\n#define _JBIG2_HUFFMAN_DECODER_H_\n#include \"JBig2_BitStream.h\"\n#include \"JBig2_HuffmanTable.h\"\nclass CJBig2_HuffmanDecoder : public CJBig2_Object\n{\npublic:\n\n    CJBig2_HuffmanDecoder(CJBig2_BitStream *pStream);\n\n    ~CJBig2_HuffmanDecoder();\n\n    int decodeAValue(CJBig2_HuffmanTable *pTable, int *nResult);\nprivate:\n\n    CJBig2_BitStream *m_pStream;\n};\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"JBig2_HuffmanTable.h\"\n#include \"JBig2_BitStream.h\"\n#include <string.h>\n\nCJBig2_HuffmanTable::CJBig2_HuffmanTable(const JBig2TableLine *pTable, int nLines,\n        FX_BOOL bHTOOB)\n{\n    init();\n    m_bOK = parseFromStandardTable(pTable, nLines, bHTOOB);\n}\n\nCJBig2_HuffmanTable::CJBig2_HuffmanTable(CJBig2_BitStream *pStream)\n{\n    init();\n    m_bOK = parseFromCodedBuffer(pStream);\n}\n\nCJBig2_HuffmanTable::~CJBig2_HuffmanTable()\n{\n    if(CODES) {\n        m_pModule->JBig2_Free(CODES);\n    }\n    if(PREFLEN) {\n        m_pModule->JBig2_Free(PREFLEN);\n    }\n    if(RANGELEN) {\n        m_pModule->JBig2_Free(RANGELEN);\n    }\n    if(RANGELOW) {\n        m_pModule->JBig2_Free(RANGELOW);\n    }\n}\nvoid CJBig2_HuffmanTable::init()\n{\n    HTOOB = FALSE;\n    NTEMP = 0;\n    CODES = NULL;\n    PREFLEN = NULL;\n    RANGELEN = NULL;\n    RANGELOW = NULL;\n}\nint CJBig2_HuffmanTable::parseFromStandardTable(const JBig2TableLine *pTable, int nLines, FX_BOOL bHTOOB)\n{\n    int CURLEN, LENMAX, CURCODE, CURTEMP, i;\n    int *LENCOUNT;\n    int *FIRSTCODE;\n    HTOOB = bHTOOB;\n    NTEMP = nLines;\n    CODES = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);\n    PREFLEN = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);\n    RANGELEN = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);\n    RANGELOW = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);\n    LENMAX = 0;\n    for(i = 0; i < NTEMP; i++) {\n        PREFLEN[i] = pTable[i].PREFLEN;\n        RANGELEN[i] = pTable[i].RANDELEN;\n        RANGELOW[i] = pTable[i].RANGELOW;\n        if(PREFLEN[i] > LENMAX) {\n            LENMAX = PREFLEN[i];\n        }\n    }\n    LENCOUNT = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));\n    JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));\n    FIRSTCODE = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));\n    for(i = 0; i < NTEMP; i++) {\n        LENCOUNT[PREFLEN[i]] ++;\n    }\n    CURLEN = 1;\n    FIRSTCODE[0] = 0;\n    LENCOUNT[0]  = 0;\n    while(CURLEN <= LENMAX) {\n        FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1;\n        CURCODE = FIRSTCODE[CURLEN];\n        CURTEMP = 0;\n        while(CURTEMP < NTEMP) {\n            if(PREFLEN[CURTEMP] == CURLEN) {\n                CODES[CURTEMP] = CURCODE;\n                CURCODE = CURCODE + 1;\n            }\n            CURTEMP = CURTEMP + 1;\n        }\n        CURLEN = CURLEN + 1;\n    }\n    m_pModule->JBig2_Free(LENCOUNT);\n    m_pModule->JBig2_Free(FIRSTCODE);\n    return 1;\n}\n\n#define HT_CHECK_MEMORY_ADJUST\t\t\t\\\n    if(NTEMP >= nSize)\t\\\n    {\t\\\n        nSize += 16;\t\\\n        PREFLEN  = (int*)m_pModule->JBig2_Realloc(PREFLEN,sizeof(int)*nSize);\t\\\n        RANGELEN = (int*)m_pModule->JBig2_Realloc(RANGELEN,sizeof(int)*nSize);\t\\\n        RANGELOW = (int*)m_pModule->JBig2_Realloc(RANGELOW,sizeof(int)*nSize);\t\\\n    }\nint CJBig2_HuffmanTable::parseFromCodedBuffer(CJBig2_BitStream *pStream)\n{\n    unsigned char HTPS, HTRS;\n    int HTLOW, HTHIGH;\n    int CURRANGELOW;\n    int nSize = 16;\n    int CURLEN, LENMAX, CURCODE, CURTEMP, i;\n    int *LENCOUNT;\n    int *FIRSTCODE;\n    unsigned char cTemp;\n    if(pStream->read1Byte(&cTemp) == -1) {\n        goto failed;\n    }\n    HTOOB = cTemp & 0x01;\n    HTPS  = ((cTemp >> 1) & 0x07) + 1;\n    HTRS  = ((cTemp >> 4) & 0x07) + 1;\n    if(pStream->readInteger((FX_DWORD*)&HTLOW) == -1 ||\n            pStream->readInteger((FX_DWORD*)&HTHIGH) == -1) {\n        goto failed;\n    }\n    PREFLEN  = (int*)m_pModule->JBig2_Malloc2(sizeof(int), nSize);\n    RANGELEN = (int*)m_pModule->JBig2_Malloc2(sizeof(int), nSize);\n    RANGELOW = (int*)m_pModule->JBig2_Malloc2(sizeof(int), nSize);\n    CURRANGELOW = HTLOW;\n    NTEMP = 0;\n    do {\n        HT_CHECK_MEMORY_ADJUST\n        if((pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1)\n                || (pStream->readNBits(HTRS, &RANGELEN[NTEMP]) == -1)) {\n            goto failed;\n        }\n        RANGELOW[NTEMP] = CURRANGELOW;\n        CURRANGELOW = CURRANGELOW + (1 << RANGELEN[NTEMP]);\n        NTEMP = NTEMP + 1;\n    } while(CURRANGELOW < HTHIGH);\n    HT_CHECK_MEMORY_ADJUST\n    if(pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) {\n        goto failed;\n    }\n    RANGELEN[NTEMP] = 32;\n    RANGELOW[NTEMP] = HTLOW - 1;\n    NTEMP = NTEMP + 1;\n    HT_CHECK_MEMORY_ADJUST\n    if(pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) {\n        goto failed;\n    }\n    RANGELEN[NTEMP] = 32;\n    RANGELOW[NTEMP] = HTHIGH;\n    NTEMP = NTEMP + 1;\n    if(HTOOB) {\n        HT_CHECK_MEMORY_ADJUST\n        if(pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) {\n            goto failed;\n        }\n        NTEMP = NTEMP + 1;\n    }\n    CODES = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);\n    LENMAX = 0;\n    for(i = 0; i < NTEMP; i++) {\n        if(PREFLEN[i] > LENMAX) {\n            LENMAX = PREFLEN[i];\n        }\n    }\n    LENCOUNT = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));\n    JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));\n    FIRSTCODE = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));\n    for(i = 0; i < NTEMP; i++) {\n        LENCOUNT[PREFLEN[i]] ++;\n    }\n    CURLEN = 1;\n    FIRSTCODE[0] = 0;\n    LENCOUNT[0]  = 0;\n    while(CURLEN <= LENMAX) {\n        FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1;\n        CURCODE = FIRSTCODE[CURLEN];\n        CURTEMP = 0;\n        while(CURTEMP < NTEMP) {\n            if(PREFLEN[CURTEMP] == CURLEN) {\n                CODES[CURTEMP] = CURCODE;\n                CURCODE = CURCODE + 1;\n            }\n            CURTEMP = CURTEMP + 1;\n        }\n        CURLEN = CURLEN + 1;\n    }\n    m_pModule->JBig2_Free(LENCOUNT);\n    m_pModule->JBig2_Free(FIRSTCODE);\n    return TRUE;\nfailed:\n    return FALSE;\n}\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_HuffmanTable.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JBIG2_HUFFMAN_TABLE_H_\n#define _JBIG2_HUFFMAN_TABLE_H_\n#include \"JBig2_Module.h\"\n#include \"JBig2_HuffmanTable_Standard.h\"\n#include \"JBig2_BitStream.h\"\nclass CJBig2_HuffmanTable : public CJBig2_Object\n{\npublic:\n\n    CJBig2_HuffmanTable(const JBig2TableLine *pTable, int nLines, FX_BOOL bHTOOB);\n\n    CJBig2_HuffmanTable(CJBig2_BitStream *pStream);\n\n    ~CJBig2_HuffmanTable();\n\n    void init();\n\n    int parseFromStandardTable(const JBig2TableLine *pTable, int nLines, FX_BOOL bHTOOB);\n\n    int parseFromCodedBuffer(CJBig2_BitStream *pStream);\n\n    FX_BOOL isOK()\n    {\n        return m_bOK;\n    }\nprivate:\n    FX_BOOL HTOOB;\n    int NTEMP;\n    int *CODES;\n    int *PREFLEN;\n    int *RANGELEN;\n    int *RANGELOW;\n    FX_BOOL m_bOK;\n    friend class CJBig2_HuffmanDecoder;\n};\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JBIG2_HUFFMAN_TABLE_STANDARD_H_\n#define _JBIG2_HUFFMAN_TABLE_STANDARD_H_\ntypedef struct {\n    int PREFLEN;\n    int RANDELEN;\n    int RANGELOW;\n} JBig2TableLine;\nconst FX_BOOL HuffmanTable_HTOOB_B1 = FALSE;\nconst JBig2TableLine HuffmanTable_B1[] = {\n    { 1,\t4,\t\t0 },\n    { 2,\t8,\t   16 },\n    { 3,   16,\t  272 },\n    { 0,   32,\t   -1 },\n    { 3,   32,\t65808 }\n};\nconst FX_BOOL HuffmanTable_HTOOB_B2 = TRUE;\nconst JBig2TableLine HuffmanTable_B2[] = {\n    { 1,\t0,\t\t0 },\n    { 2,\t0,\t\t1 },\n    { 3,\t0,\t\t2 },\n    { 4,\t3,\t\t3 },\n    { 5,\t6,\t   11 },\n    { 0,   32,\t   -1 },\n    { 6,   32,     75 },\n    { 6,\t0,      0 }\n};\nconst FX_BOOL HuffmanTable_HTOOB_B3 = TRUE;\nconst JBig2TableLine HuffmanTable_B3[] = {\n    { 8,\t8,   -256 },\n    { 1,\t0,\t\t0 },\n    { 2,\t0,\t\t1 },\n    { 3,\t0,\t\t2 },\n    { 4,\t3,\t\t3 },\n    { 5,\t6,\t   11 },\n    { 8,   32,   -257 },\n    { 7,   32,     75 },\n    { 6,\t0,\t\t0 }\n};\nconst FX_BOOL HuffmanTable_HTOOB_B4 = FALSE;\nconst JBig2TableLine HuffmanTable_B4[] = {\n    { 1,\t0,\t\t1 },\n    { 2,\t0,\t\t2 },\n    { 3,\t0,\t\t3 },\n    { 4,\t3,\t\t4 },\n    { 5,\t6,\t   12 },\n    { 0,   32,     -1 },\n    { 5,   32,\t   76 },\n};\nconst FX_BOOL HuffmanTable_HTOOB_B5 = FALSE;\nconst JBig2TableLine HuffmanTable_B5[] = {\n    { 7,\t8,\t -255 },\n    { 1,\t0,\t    1 },\n    { 2,\t0,\t    2 },\n    { 3,    0,      3 },\n    { 4,\t3,\t    4 },\n    { 5,\t6,\t   12 },\n    { 7,   32,   -256 },\n    { 6,   32,     76 }\n};\nconst FX_BOOL HuffmanTable_HTOOB_B6 = FALSE;\nconst JBig2TableLine HuffmanTable_B6[] = {\n    { 5,   10,\t-2048 },\n    { 4,    9,\t-1024 },\n    { 4,\t8,\t -512 },\n    { 4,\t7,\t -256 },\n    { 5,\t6,\t -128 },\n    { 5,\t5,\t  -64 },\n    { 4,\t5,\t  -32 },\n    { 2,\t7,\t\t0 },\n    { 3,\t7,\t  128 },\n    { 3,\t8,\t  256 },\n    { 4,\t9,\t  512 },\n    { 4,   10,\t 1024 },\n    { 6,   32,\t-2049 },\n    { 6,   32,\t 2048 }\n};\nconst FX_BOOL HuffmanTable_HTOOB_B7 = FALSE;\nconst JBig2TableLine HuffmanTable_B7[] = {\n    { 4,\t9,\t-1024 },\n    { 3,\t8,\t -512 },\n    { 4,\t7,\t -256 },\n    { 5,\t6,\t -128 },\n    { 5,\t5,\t  -64 },\n    { 4,\t5,\t  -32 },\n    { 4,\t5,\t\t0 },\n    { 5,\t5,\t   32 },\n    { 5,\t6,\t   64 },\n    { 4,\t7,\t  128 },\n    { 3,\t8,\t  256 },\n    { 3,\t9,\t  512 },\n    { 3,   10,\t 1024 },\n    { 5,   32,\t-1025 },\n    { 5,   32,\t 2048 },\n};\nconst FX_BOOL HuffmanTable_HTOOB_B8 = TRUE;\nconst JBig2TableLine HuffmanTable_B8[] = {\n    { 8,\t3,\t  -15 },\n    { 9,\t1,\t   -7 },\n    { 8,\t1,\t   -5 },\n    { 9,\t0,\t   -3 },\n    { 7,\t0,\t   -2 },\n    { 4,\t0,\t   -1 },\n    { 2,\t1,\t\t0 },\n    { 5,\t0,\t\t2 },\n    { 6,\t0,\t\t3 },\n    { 3,\t4,\t\t4 },\n    { 6,\t1,\t   20 },\n    { 4,\t4,\t   22 },\n    { 4,\t5,\t   38 },\n    { 5,\t6,\t   70 },\n    { 5,\t7,\t  134 },\n    { 6,\t7,\t  262 },\n    { 7,\t8,\t  390 },\n    { 6,   10,\t  646 },\n    { 9,   32,\t  -16 },\n    { 9,   32,\t 1670 },\n    { 2,\t0,\t\t0 }\n};\nconst FX_BOOL HuffmanTable_HTOOB_B9 = TRUE;\nconst JBig2TableLine HuffmanTable_B9[] = {\n    { 8,\t4,\t  -31 },\n    { 9,\t2,\t  -15 },\n    { 8,\t2,\t  -11 },\n    { 9,\t1,\t   -7 },\n    { 7,\t1,\t   -5 },\n    { 4,\t1,\t   -3 },\n    { 3,\t1,\t   -1 },\n    { 3,\t1,\t\t1 },\n    { 5,\t1,\t\t3 },\n    { 6,\t1,\t\t5 },\n    { 3,\t5,\t\t7 },\n    { 6,\t2,\t   39 },\n    { 4,\t5,\t   43 },\n    { 4,\t6,\t   75 },\n    { 5,\t7,\t  139 },\n    { 5,\t8,\t  267 },\n    { 6,\t8,\t  523 },\n    { 7,\t9,\t  779 },\n    { 6,   11,\t 1291 },\n    { 9,   32,\t  -32 },\n    { 9,   32,\t 3339 },\n    { 2,\t0,\t\t0 }\n};\nconst FX_BOOL HuffmanTable_HTOOB_B10 = TRUE;\nconst JBig2TableLine HuffmanTable_B10[] = {\n    { 7,\t4,\t  -21 },\n    { 8,\t0,\t   -5 },\n    { 7,\t0,\t   -4 },\n    { 5,\t0,\t   -3 },\n    { 2,\t2,\t   -2 },\n    { 5,\t0,\t\t2 },\n    { 6,\t0,\t\t3 },\n    { 7,\t0,\t\t4 },\n    { 8,\t0,\t\t5 },\n    { 2,\t6,\t\t6 },\n    { 5,\t5,\t   70 },\n    { 6,\t5,\t  102 },\n    { 6,\t6,\t  134 },\n    { 6,\t7,\t  198 },\n    { 6,\t8,\t  326 },\n    { 6,\t9,\t  582 },\n    { 6,   10,\t 1094 },\n    { 7,   11,\t 2118 },\n    { 8,   32,\t  -22 },\n    { 8,   32,\t 4166 },\n    { 2,\t0,\t\t0 }\n};\nconst FX_BOOL HuffmanTable_HTOOB_B11 = FALSE;\nconst JBig2TableLine HuffmanTable_B11[] = {\n    { 1,\t0,\t\t1 },\n    { 2,\t1,\t\t2 },\n    { 4,\t0,\t\t4 },\n    { 4,\t1,\t\t5 },\n    { 5,\t1,\t\t7 },\n    { 5,\t2,\t\t9 },\n    { 6,\t2,\t   13 },\n    { 7,\t2,\t   17 },\n    { 7,\t3,\t   21 },\n    { 7,\t4,\t   29 },\n    { 7,\t5,\t   45 },\n    { 7,\t6,\t   77 },\n    { 0,   32,\t\t0 },\n    { 7,   32,\t  141 }\n};\nconst FX_BOOL HuffmanTable_HTOOB_B12 = FALSE;\nconst JBig2TableLine HuffmanTable_B12[] = {\n    { 1,\t0,\t\t1 },\n    { 2,\t0,\t\t2 },\n    { 3,\t1,\t\t3 },\n    { 5,\t0,\t\t5 },\n    { 5,\t1,\t\t6 },\n    { 6,\t1,\t\t8 },\n    { 7,\t0,\t   10 },\n    { 7,\t1,\t   11 },\n    { 7,\t2,\t   13 },\n    { 7,\t3,\t   17 },\n    { 7,\t4,\t   25 },\n    { 8,\t5,\t   41 },\n    { 0,   32,\t\t0 },\n    { 8,   32,\t   73 }\n};\nconst FX_BOOL HuffmanTable_HTOOB_B13 = FALSE;\nconst JBig2TableLine HuffmanTable_B13[] = {\n    { 1,\t0,\t\t1 },\n    { 3,\t0,\t\t2 },\n    { 4,\t0,\t\t3 },\n    { 5,\t0,\t\t4 },\n    { 4,\t1,\t\t5 },\n    { 3,\t3,\t\t7 },\n    { 6,\t1,\t   15 },\n    { 6,\t2,\t   17 },\n    { 6,\t3,\t   21 },\n    { 6,\t4,\t   29 },\n    { 6,\t5,\t   45 },\n    { 7,\t6,\t   77 },\n    { 0,   32,\t\t0 },\n    { 7,   32,\t  141 }\n};\nconst FX_BOOL HuffmanTable_HTOOB_B14 = FALSE;\nconst JBig2TableLine HuffmanTable_B14[] = {\n    { 3,\t0,\t   -2 },\n    { 3,\t0,\t   -1 },\n    { 1,\t0,\t\t0 },\n    { 3,\t0,\t\t1 },\n    { 3,\t0,\t\t2 },\n    { 0,   32,\t   -3 },\n    { 0,   32,\t\t3 }\n};\nconst FX_BOOL HuffmanTable_HTOOB_B15 = FALSE;\nconst JBig2TableLine HuffmanTable_B15[] = {\n    { 7,\t4,\t  -24 },\n    { 6,\t2,\t   -8 },\n    { 5,\t1,\t   -4 },\n    { 4,\t0,\t   -2 },\n    { 3,\t0,\t   -1 },\n    { 1,\t0,\t\t0 },\n    { 3,\t0,\t\t1 },\n    { 4,\t0,\t\t2 },\n    { 5,\t1,\t\t3 },\n    { 6,\t2,\t\t5 },\n    { 7,\t4,\t\t9 },\n    { 7,   32,\t  -25 },\n    { 7,   32,\t   25 }\n};\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_Image.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"JBig2_Image.h\"\n#include \"../../../include/fxcrt/fx_basic.h\"\n#include \"../../../include/fxcrt/fx_coordinates.h\"\n#include <limits.h>\nCJBig2_Image::CJBig2_Image(FX_INT32 w, FX_INT32 h)\n{\n    m_nWidth\t= w;\n    m_nHeight\t= h;\n    if (m_nWidth <= 0 || m_nHeight <= 0 || m_nWidth > INT_MAX - 31) {\n        m_pData = NULL;\n        m_bNeedFree = FALSE;\n        return;\n    }\n    m_nStride  = ((w + 31) >> 5) << 2;\n    if (m_nStride * m_nHeight > 0 && 104857600 / (int)m_nStride > m_nHeight) {\n        m_pData = (FX_BYTE *)m_pModule->JBig2_Malloc2(m_nStride, m_nHeight);\n    } else {\n        m_pData = NULL;\n    }\n    m_bNeedFree = TRUE;\n}\nCJBig2_Image::CJBig2_Image(FX_INT32 w, FX_INT32 h, FX_INT32 stride, FX_BYTE*pBuf)\n{\n    m_nWidth = w;\n    m_nHeight = h;\n    m_nStride = stride;\n    m_pData = pBuf;\n    m_bNeedFree = FALSE;\n}\nCJBig2_Image::CJBig2_Image(CJBig2_Image &im)\n{\n    m_pModule = im.m_pModule;\n    m_nWidth\t= im.m_nWidth;\n    m_nHeight\t= im.m_nHeight;\n    m_nStride\t= im.m_nStride;\n    if (im.m_pData) {\n        m_pData = (FX_BYTE*)m_pModule->JBig2_Malloc2(m_nStride, m_nHeight);\n        JBIG2_memcpy(m_pData, im.m_pData, m_nStride * m_nHeight);\n    } else {\n        m_pData = NULL;\n    }\n    m_bNeedFree = TRUE;\n}\nCJBig2_Image::~CJBig2_Image()\n{\n    if(m_bNeedFree && m_pData) {\n        m_pModule->JBig2_Free(m_pData);\n    }\n}\nFX_BOOL CJBig2_Image::getPixel(FX_INT32 x, FX_INT32 y)\n{\n    if (!m_pData) {\n        return 0;\n    }\n    FX_INT32 m, n;\n    if(x < 0 || x >= m_nWidth) {\n        return 0;\n    }\n    if(y < 0 || y >= m_nHeight) {\n        return 0;\n    }\n    m = y * m_nStride + (x >> 3);\n    n = x & 7;\n    return ((m_pData[m] >> (7 - n)) & 1);\n}\n\nFX_INT32 CJBig2_Image::setPixel(FX_INT32 x, FX_INT32 y, FX_BOOL v)\n{\n    if (!m_pData) {\n        return 0;\n    }\n    FX_INT32 m, n;\n    if(x < 0 || x >= m_nWidth) {\n        return 0;\n    }\n    if(y < 0 || y >= m_nHeight) {\n        return 0;\n    }\n    m = y * m_nStride + (x >> 3);\n    n = x & 7;\n    if(v) {\n        m_pData[m] |= 1 << (7 - n);\n    } else {\n        m_pData[m] &= ~(1 << (7 - n));\n    }\n    return 1;\n}\nvoid CJBig2_Image::copyLine(FX_INT32 hTo, FX_INT32 hFrom)\n{\n    if (!m_pData) {\n        return;\n    }\n    if(hFrom < 0 || hFrom >= m_nHeight) {\n        JBIG2_memset(m_pData + hTo * m_nStride, 0, m_nStride);\n    } else {\n        JBIG2_memcpy(m_pData + hTo * m_nStride, m_pData + hFrom * m_nStride, m_nStride);\n    }\n}\nvoid CJBig2_Image::fill(FX_BOOL v)\n{\n    if (!m_pData) {\n        return;\n    }\n    JBIG2_memset(m_pData, v ? 0xff : 0, m_nStride * m_nHeight);\n}\nFX_BOOL CJBig2_Image::composeTo(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)\n{\n    if (!m_pData) {\n        return FALSE;\n    }\n    return composeTo_opt2(pDst, x, y, op);\n}\nFX_BOOL CJBig2_Image::composeTo(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op, const FX_RECT* pSrcRect)\n{\n    if (!m_pData) {\n        return FALSE;\n    }\n    if (NULL == pSrcRect || *pSrcRect == FX_RECT(0, 0, m_nWidth, m_nHeight)) {\n        return composeTo_opt2(pDst, x, y, op);\n    }\n    return composeTo_opt2(pDst, x, y, op, pSrcRect);\n}\nFX_BOOL CJBig2_Image::composeTo_unopt(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)\n{\n    FX_INT32 w, h, dx, dy;\n    FX_INT32 i, j;\n    w = m_nWidth;\n    h = m_nHeight;\n    dx = dy = 0;\n    if(x < 0) {\n        dx += -x;\n        w  -= -x;\n        x = 0;\n    }\n    if(y < 0) {\n        dy += -y;\n        h  -= -y;\n        y = 0;\n    }\n    if(x + w > pDst->m_nWidth) {\n        w = pDst->m_nWidth - x;\n    }\n    if(y + h > pDst->m_nHeight) {\n        h = pDst->m_nHeight - y;\n    }\n    switch(op) {\n        case JBIG2_COMPOSE_OR:\n            for(j = 0; j < h; j++) {\n                for(i = 0; i < w; i++) {\n                    pDst->setPixel(x + i, y + j,\n                                   (getPixel(i + dx, j + dy) | pDst->getPixel(x + i, y + j)) & 1);\n                }\n            }\n            break;\n        case JBIG2_COMPOSE_AND:\n            for(j = 0; j < h; j++) {\n                for(i = 0; i < w; i++) {\n                    pDst->setPixel(x + i, y + j,\n                                   (getPixel(i + dx, j + dy) & pDst->getPixel(x + i, y + j)) & 1);\n                }\n            }\n            break;\n        case JBIG2_COMPOSE_XOR:\n            for(j = 0; j < h; j++) {\n                for(i = 0; i < w; i++) {\n                    pDst->setPixel(x + i, y + j,\n                                   (getPixel(i + dx, j + dy) ^ pDst->getPixel(x + i, y + j)) & 1);\n                }\n            }\n            break;\n        case JBIG2_COMPOSE_XNOR:\n            for(j = 0; j < h; j++) {\n                for(i = 0; i < w; i++) {\n                    pDst->setPixel(x + i, y + j,\n                                   (~(getPixel(i + dx, j + dy) ^ pDst->getPixel(x + i, y + j))) & 1);\n                }\n            }\n            break;\n        case JBIG2_COMPOSE_REPLACE:\n            for(j = 0; j < h; j++) {\n                for(i = 0; i < w; i++) {\n                    pDst->setPixel(x + i, y + j, getPixel(i + dx, j + dy));\n                }\n            }\n            break;\n    }\n    return TRUE;\n}\n\nFX_BOOL CJBig2_Image::composeTo_opt(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)\n{\n    FX_INT32 x0, x1, y0, y1, xx, yy;\n    FX_BYTE *pLineSrc, *pLineDst, *srcPtr, *destPtr;\n    FX_DWORD src0, src1, src, dest, s1, s2, m1, m2, m3;\n    FX_BOOL oneByte;\n    if (!m_pData) {\n        return FALSE;\n    }\n    if (y < 0) {\n        y0 = -y;\n    } else {\n        y0 = 0;\n    }\n    if (y + m_nHeight > pDst->m_nHeight) {\n        y1 = pDst->m_nHeight - y;\n    } else {\n        y1 = m_nHeight;\n    }\n    if (y0 >= y1) {\n        return FALSE;\n    }\n    if (x >= 0) {\n        x0 = x & ~7;\n    } else {\n        x0 = 0;\n    }\n    x1 = x + m_nWidth;\n    if (x1 > pDst->m_nWidth) {\n        x1 = pDst->m_nWidth;\n    }\n    if (x0 >= x1) {\n        return FALSE;\n    }\n    s1 = x & 7;\n    s2 = 8 - s1;\n    m1 = 0xff >> (x1 & 7);\n    m2 = 0xff << (((x1 & 7) == 0) ? 0 : 8 - (x1 & 7));\n    m3 = (0xff >> s1) & m2;\n    oneByte = x0 == ((x1 - 1) & ~7);\n    pLineDst = pDst->m_pData + y * pDst->m_nStride;\n    pLineSrc = m_pData + y0 * m_nStride;\n    if(oneByte) {\n        if(x >= 0) {\n            switch(op) {\n                case JBIG2_COMPOSE_OR: {\n                        for (yy = y0; yy < y1; ++yy) {\n                            destPtr = pLineDst + (x >> 3);\n                            srcPtr = pLineSrc;\n                            dest = *destPtr;\n                            dest |= (*srcPtr >> s1) & m2;\n                            *destPtr = (FX_BYTE)dest;\n                            pLineDst += pDst->m_nStride;\n                            pLineSrc += m_nStride;\n                        }\n                    }\n                    break;\n                case JBIG2_COMPOSE_AND: {\n                        for (yy = y0; yy < y1; ++yy) {\n                            destPtr = pLineDst + (x >> 3);\n                            srcPtr = pLineSrc;\n                            dest = *destPtr;\n                            dest &= ((0xff00 | *srcPtr) >> s1) | m1;\n                            *destPtr = (FX_BYTE)dest;\n                            pLineDst += pDst->m_nStride;\n                            pLineSrc += m_nStride;\n                        }\n                    }\n                    break;\n                case JBIG2_COMPOSE_XOR: {\n                        for (yy = y0; yy < y1; ++yy) {\n                            destPtr = pLineDst + (x >> 3);\n                            srcPtr = pLineSrc;\n                            dest = *destPtr;\n                            dest ^= (*srcPtr >> s1) & m2;\n                            *destPtr = (FX_BYTE)dest;\n                            pLineDst += pDst->m_nStride;\n                            pLineSrc += m_nStride;\n                        }\n                    }\n                    break;\n                case JBIG2_COMPOSE_XNOR: {\n                        for (yy = y0; yy < y1; ++yy) {\n                            destPtr = pLineDst + (x >> 3);\n                            srcPtr = pLineSrc;\n                            dest = *destPtr;\n                            dest ^= ((*srcPtr ^ 0xff) >> s1) & m2;\n                            *destPtr = (FX_BYTE)dest;\n                            pLineDst += pDst->m_nStride;\n                            pLineSrc += m_nStride;\n                        }\n                    }\n                    break;\n                case JBIG2_COMPOSE_REPLACE: {\n                        for (yy = y0; yy < y1; ++yy) {\n                            destPtr = pLineDst + (x >> 3);\n                            srcPtr = pLineSrc;\n                            dest = *destPtr;\n                            dest = (dest & ~m3) | ((*srcPtr >> s1) & m3);\n                            *destPtr = (FX_BYTE)dest;\n                            pLineDst += pDst->m_nStride;\n                            pLineSrc += m_nStride;\n                        }\n                    }\n                    break;\n            }\n        } else {\n            switch(op) {\n                case JBIG2_COMPOSE_OR: {\n                        for(yy = y0; yy < y1; ++yy) {\n                            destPtr = pLineDst;\n                            srcPtr = pLineSrc + (-x >> 3);\n                            dest = *destPtr;\n                            dest |= *srcPtr & m2;\n                            *destPtr = (FX_BYTE)dest;\n                            pLineDst += pDst->m_nStride;\n                            pLineSrc += m_nStride;\n                        }\n                    }\n                    break;\n                case JBIG2_COMPOSE_AND: {\n                        for(yy = y0; yy < y1; ++yy) {\n                            destPtr = pLineDst;\n                            srcPtr = pLineSrc + (-x >> 3);\n                            dest = *destPtr;\n                            dest &= *srcPtr | m1;\n                            *destPtr = (FX_BYTE)dest;\n                            pLineDst += pDst->m_nStride;\n                            pLineSrc += m_nStride;\n                        }\n                    }\n                    break;\n                case JBIG2_COMPOSE_XOR: {\n                        for(yy = y0; yy < y1; ++yy) {\n                            destPtr = pLineDst;\n                            srcPtr = pLineSrc + (-x >> 3);\n                            dest = *destPtr;\n                            dest ^= *srcPtr & m2;\n                            *destPtr = (FX_BYTE)dest;\n                            pLineDst += pDst->m_nStride;\n                            pLineSrc += m_nStride;\n                        }\n                    }\n                    break;\n                case JBIG2_COMPOSE_XNOR: {\n                        for(yy = y0; yy < y1; ++yy) {\n                            destPtr = pLineDst;\n                            srcPtr = pLineSrc + (-x >> 3);\n                            dest = *destPtr;\n                            dest ^= (*srcPtr ^ 0xff) & m2;\n                            *destPtr = (FX_BYTE)dest;\n                            pLineDst += pDst->m_nStride;\n                            pLineSrc += m_nStride;\n                        }\n                    }\n                    break;\n                case JBIG2_COMPOSE_REPLACE: {\n                        for(yy = y0; yy < y1; ++yy) {\n                            destPtr = pLineDst;\n                            srcPtr = pLineSrc + (-x >> 3);\n                            dest = *destPtr;\n                            dest = (*srcPtr & m2) | (dest & m1);\n                            *destPtr = (FX_BYTE)dest;\n                            pLineDst += pDst->m_nStride;\n                            pLineSrc += m_nStride;\n                        }\n                    }\n                    break;\n            }\n        }\n    } else {\n        if(x >= 0) {\n            switch(op) {\n                case JBIG2_COMPOSE_OR: {\n                        for(yy = y0; yy < y1; ++yy) {\n                            destPtr = pLineDst + (x >> 3);\n                            srcPtr = pLineSrc;\n                            src1 = *srcPtr++;\n                            dest = *destPtr;\n                            dest |= src1 >> s1;\n                            *destPtr++ = (FX_BYTE)dest;\n                            xx = x0 + 8;\n                            for (; xx < x1 - 8; xx += 8) {\n                                dest = *destPtr;\n                                src0 = src1;\n                                src1 = *srcPtr++;\n                                src = (((src0 << 8) | src1) >> s1) & 0xff;\n                                dest |= src;\n                                *destPtr++ = (FX_BYTE)dest;\n                            }\n                            dest = *destPtr;\n                            src0 = src1;\n                            if(srcPtr - pLineSrc < m_nStride) {\n                                src1 = *srcPtr++;\n                            } else {\n                                src1 = 0;\n                            }\n                            src = (((src0 << 8) | src1) >> s1) & 0xff;\n                            dest |= src & m2;\n                            *destPtr = (FX_BYTE)dest;\n                            pLineDst += pDst->m_nStride;\n                            pLineSrc += m_nStride;\n                        }\n                    }\n                    break;\n                case JBIG2_COMPOSE_AND: {\n                        for(yy = y0; yy < y1; ++yy) {\n                            destPtr = pLineDst + (x >> 3);\n                            srcPtr = pLineSrc;\n                            src1 = *srcPtr++;\n                            dest = *destPtr;\n                            dest &= (0xff00 | src1) >> s1;\n                            *destPtr++ = (FX_BYTE)dest;\n                            xx = x0 + 8;\n                            for (; xx < x1 - 8; xx += 8) {\n                                dest = *destPtr;\n                                src0 = src1;\n                                src1 = *srcPtr++;\n                                src = (((src0 << 8) | src1) >> s1) & 0xff;\n                                dest &= src;\n                                *destPtr++ = (FX_BYTE)dest;\n                            }\n                            dest = *destPtr;\n                            src0 = src1;\n                            if(srcPtr - pLineSrc < m_nStride) {\n                                src1 = *srcPtr++;\n                            } else {\n                                src1 = 0;\n                            }\n                            src = (((src0 << 8) | src1) >> s1) & 0xff;\n                            dest &= src | m1;\n                            *destPtr = (FX_BYTE)dest;\n                            pLineDst += pDst->m_nStride;\n                            pLineSrc += m_nStride;\n                        }\n                    }\n                    break;\n                case JBIG2_COMPOSE_XOR: {\n                        for(yy = y0; yy < y1; ++yy) {\n                            destPtr = pLineDst + (x >> 3);\n                            srcPtr = pLineSrc;\n                            src1 = *srcPtr++;\n                            dest = *destPtr;\n                            dest ^= src1 >> s1;\n                            *destPtr++ = (FX_BYTE)dest;\n                            xx = x0 + 8;\n                            for (; xx < x1 - 8; xx += 8) {\n                                dest = *destPtr;\n                                src0 = src1;\n                                src1 = *srcPtr++;\n                                src = (((src0 << 8) | src1) >> s1) & 0xff;\n                                dest ^= src;\n                                *destPtr++ = (FX_BYTE)dest;\n                            }\n                            dest = *destPtr;\n                            src0 = src1;\n                            if(srcPtr - pLineSrc < m_nStride) {\n                                src1 = *srcPtr++;\n                            } else {\n                                src1 = 0;\n                            }\n                            src = (((src0 << 8) | src1) >> s1) & 0xff;\n                            dest ^= src & m2;\n                            *destPtr = (FX_BYTE)dest;\n                            pLineDst += pDst->m_nStride;\n                            pLineSrc += m_nStride;\n                        }\n                    }\n                    break;\n                case JBIG2_COMPOSE_XNOR: {\n                        for(yy = y0; yy < y1; ++yy) {\n                            destPtr = pLineDst + (x >> 3);\n                            srcPtr = pLineSrc;\n                            src1 = *srcPtr++;\n                            dest = *destPtr;\n                            dest ^= (src1 ^ 0xff) >> s1;\n                            *destPtr++ = (FX_BYTE)dest;\n                            xx = x0 + 8;\n                            for (; xx < x1 - 8; xx += 8) {\n                                dest = *destPtr;\n                                src0 = src1;\n                                src1 = *srcPtr++;\n                                src = (((src0 << 8) | src1) >> s1) & 0xff;\n                                dest ^= src ^ 0xff;\n                                *destPtr++ = (FX_BYTE)dest;\n                            }\n                            dest = *destPtr;\n                            src0 = src1;\n                            if(srcPtr - pLineSrc < m_nStride) {\n                                src1 = *srcPtr++;\n                            } else {\n                                src1 = 0;\n                            }\n                            src = (((src0 << 8) | src1) >> s1) & 0xff;\n                            dest ^= (src ^ 0xff) & m2;\n                            *destPtr = (FX_BYTE)dest;\n                            pLineDst += pDst->m_nStride;\n                            pLineSrc += m_nStride;\n                        }\n                    }\n                    break;\n                case JBIG2_COMPOSE_REPLACE: {\n                        for(yy = y0; yy < y1; ++yy) {\n                            destPtr = pLineDst + (x >> 3);\n                            srcPtr = pLineSrc;\n                            src1 = *srcPtr++;\n                            dest = *destPtr;\n                            dest = (dest & (0xff << s2)) | (src1 >> s1);\n                            *destPtr++ = (FX_BYTE)dest;\n                            xx = x0 + 8;\n                            for (; xx < x1 - 8; xx += 8) {\n                                dest = *destPtr;\n                                src0 = src1;\n                                src1 = *srcPtr++;\n                                src = (((src0 << 8) | src1) >> s1) & 0xff;\n                                dest = src;\n                                *destPtr++ = (FX_BYTE)dest;\n                            }\n                            dest = *destPtr;\n                            src0 = src1;\n                            if(srcPtr - pLineSrc < m_nStride) {\n                                src1 = *srcPtr++;\n                            } else {\n                                src1 = 0;\n                            }\n                            src = (((src0 << 8) | src1) >> s1) & 0xff;\n                            dest = (src & m2) | (dest & m1);\n                            *destPtr = (FX_BYTE)dest;\n                            pLineDst += pDst->m_nStride;\n                            pLineSrc += m_nStride;\n                        }\n                    }\n                    break;\n            }\n        } else {\n            switch(op) {\n                case JBIG2_COMPOSE_OR: {\n                        for(yy = y0; yy < y1; ++yy) {\n                            destPtr = pLineDst;\n                            srcPtr = pLineSrc + (-x >> 3);\n                            src1 = *srcPtr++;\n                            xx = x0;\n                            for (; xx < x1 - 8; xx += 8) {\n                                dest = *destPtr;\n                                src0 = src1;\n                                src1 = *srcPtr++;\n                                src = (((src0 << 8) | src1) >> s1) & 0xff;\n                                dest |= src;\n                                *destPtr++ = (FX_BYTE)dest;\n                            }\n                            dest = *destPtr;\n                            src0 = src1;\n                            if(srcPtr - pLineSrc < m_nStride) {\n                                src1 = *srcPtr++;\n                            } else {\n                                src1 = 0;\n                            }\n                            src = (((src0 << 8) | src1) >> s1) & 0xff;\n                            dest |= src & m2;\n                            *destPtr = (FX_BYTE)dest;\n                            pLineDst += pDst->m_nStride;\n                            pLineSrc += m_nStride;\n                        }\n                    }\n                    break;\n                case JBIG2_COMPOSE_AND: {\n                        for(yy = y0; yy < y1; ++yy) {\n                            destPtr = pLineDst;\n                            srcPtr = pLineSrc + (-x >> 3);\n                            src1 = *srcPtr++;\n                            xx = x0;\n                            for (; xx < x1 - 8; xx += 8) {\n                                dest = *destPtr;\n                                src0 = src1;\n                                src1 = *srcPtr++;\n                                src = (((src0 << 8) | src1) >> s1) & 0xff;\n                                dest &= src;\n                                *destPtr++ = (FX_BYTE)dest;\n                            }\n                            dest = *destPtr;\n                            src0 = src1;\n                            if(srcPtr - pLineSrc < m_nStride) {\n                                src1 = *srcPtr++;\n                            } else {\n                                src1 = 0;\n                            }\n                            src = (((src0 << 8) | src1) >> s1) & 0xff;\n                            dest &= src | m1;\n                            *destPtr = (FX_BYTE)dest;\n                            pLineDst += pDst->m_nStride;\n                            pLineSrc += m_nStride;\n                        }\n                    }\n                    break;\n                case JBIG2_COMPOSE_XOR: {\n                        for(yy = y0; yy < y1; ++yy) {\n                            destPtr = pLineDst;\n                            srcPtr = pLineSrc + (-x >> 3);\n                            src1 = *srcPtr++;\n                            xx = x0;\n                            for (; xx < x1 - 8; xx += 8) {\n                                dest = *destPtr;\n                                src0 = src1;\n                                src1 = *srcPtr++;\n                                src = (((src0 << 8) | src1) >> s1) & 0xff;\n                                dest ^= src;\n                                *destPtr++ = (FX_BYTE)dest;\n                            }\n                            dest = *destPtr;\n                            src0 = src1;\n                            if(srcPtr - pLineSrc < m_nStride) {\n                                src1 = *srcPtr++;\n                            } else {\n                                src1 = 0;\n                            }\n                            src = (((src0 << 8) | src1) >> s1) & 0xff;\n                            dest ^= src & m2;\n                            *destPtr = (FX_BYTE)dest;\n                            pLineDst += pDst->m_nStride;\n                            pLineSrc += m_nStride;\n                        }\n                    }\n                    break;\n                case JBIG2_COMPOSE_XNOR: {\n                        for(yy = y0; yy < y1; ++yy) {\n                            destPtr = pLineDst;\n                            srcPtr = pLineSrc + (-x >> 3);\n                            src1 = *srcPtr++;\n                            xx = x0;\n                            for (; xx < x1 - 8; xx += 8) {\n                                dest = *destPtr;\n                                src0 = src1;\n                                src1 = *srcPtr++;\n                                src = (((src0 << 8) | src1) >> s1) & 0xff;\n                                dest ^= src ^ 0xff;\n                                *destPtr++ = (FX_BYTE)dest;\n                            }\n                            dest = *destPtr;\n                            src0 = src1;\n                            if(srcPtr - pLineSrc < m_nStride) {\n                                src1 = *srcPtr++;\n                            } else {\n                                src1 = 0;\n                            }\n                            src = (((src0 << 8) | src1) >> s1) & 0xff;\n                            dest ^= (src ^ 0xff) & m2;\n                            *destPtr = (FX_BYTE)dest;\n                            pLineDst += pDst->m_nStride;\n                            pLineSrc += m_nStride;\n                        }\n                    }\n                    break;\n                case JBIG2_COMPOSE_REPLACE: {\n                        for(yy = y0; yy < y1; ++yy) {\n                            destPtr = pLineDst;\n                            srcPtr = pLineSrc + (-x >> 3);\n                            src1 = *srcPtr++;\n                            xx = x0;\n                            for (; xx < x1 - 8; xx += 8) {\n                                dest = *destPtr;\n                                src0 = src1;\n                                src1 = *srcPtr++;\n                                src = (((src0 << 8) | src1) >> s1) & 0xff;\n                                dest = src;\n                                *destPtr++ = (FX_BYTE)dest;\n                            }\n                            dest = *destPtr;\n                            src0 = src1;\n                            if(srcPtr - pLineSrc < m_nStride) {\n                                src1 = *srcPtr++;\n                            } else {\n                                src1 = 0;\n                            }\n                            src = (((src0 << 8) | src1) >> s1) & 0xff;\n                            dest = (src & m2) | (dest & m1);\n                            *destPtr = (FX_BYTE)dest;\n                            pLineDst += pDst->m_nStride;\n                            pLineSrc += m_nStride;\n                        }\n                    }\n                    break;\n            }\n        }\n    }\n    return TRUE;\n}\nFX_BOOL CJBig2_Image::composeFrom(FX_INT32 x, FX_INT32 y, CJBig2_Image *pSrc, JBig2ComposeOp op)\n{\n    if (!m_pData) {\n        return FALSE;\n    }\n    return pSrc->composeTo(this, x, y, op);\n}\nFX_BOOL CJBig2_Image::composeFrom(FX_INT32 x, FX_INT32 y, CJBig2_Image *pSrc, JBig2ComposeOp op, const FX_RECT* pSrcRect)\n{\n    if (!m_pData) {\n        return FALSE;\n    }\n    return pSrc->composeTo(this, x, y, op, pSrcRect);\n}\nCJBig2_Image *CJBig2_Image::subImage_unopt(FX_INT32 x, FX_INT32 y, FX_INT32 w, FX_INT32 h)\n{\n    CJBig2_Image *pImage;\n    FX_INT32 i, j;\n    JBIG2_ALLOC(pImage, CJBig2_Image(w, h));\n    for(j = 0; j < h; j++) {\n        for(i = 0; i < w; i++) {\n            pImage->setPixel(i, j, getPixel(x + i, y + j));\n        }\n    }\n    return pImage;\n}\n#define JBIG2_GETDWORD(buf)\t((FX_DWORD)(((buf)[0] << 24) | ((buf)[1] << 16) | ((buf)[2] << 8) | (buf)[3]))\nCJBig2_Image *CJBig2_Image::subImage(FX_INT32 x, FX_INT32 y, FX_INT32 w, FX_INT32 h)\n{\n    CJBig2_Image *pImage;\n    FX_INT32 m, n, j;\n    FX_BYTE *pLineSrc, *pLineDst;\n    FX_DWORD wTmp;\n    FX_BYTE *pSrc, *pSrcEnd, *pDst, *pDstEnd;\n    if (w == 0 || h == 0) {\n        return NULL;\n    }\n    JBIG2_ALLOC(pImage, CJBig2_Image(w, h));\n    if (!m_pData) {\n        pImage->fill(0);\n        return pImage;\n    }\n    if (!pImage->m_pData) {\n        return pImage;\n    }\n    pLineSrc = m_pData + m_nStride * y;\n    pLineDst = pImage->m_pData;\n    m = (x >> 5) << 2;\n    n = x & 31;\n    if(n == 0) {\n        for(j = 0; j < h; j++) {\n            pSrc = pLineSrc + m;\n            pSrcEnd = pLineSrc + m_nStride;\n            pDst = pLineDst;\n            pDstEnd = pLineDst + pImage->m_nStride;\n            for(; pDst < pDstEnd; pSrc += 4, pDst += 4) {\n                *((FX_DWORD *)pDst) = *((FX_DWORD *)pSrc);\n            }\n            pLineSrc += m_nStride;\n            pLineDst += pImage->m_nStride;\n        }\n    } else {\n        for(j = 0; j < h; j++) {\n            pSrc = pLineSrc + m;\n            pSrcEnd = pLineSrc + m_nStride;\n            pDst = pLineDst;\n            pDstEnd = pLineDst + pImage->m_nStride;\n            for(; pDst < pDstEnd; pSrc += 4, pDst += 4) {\n                if(pSrc + 4 < pSrcEnd) {\n                    wTmp = (JBIG2_GETDWORD(pSrc) << n) | (JBIG2_GETDWORD(pSrc + 4) >> (32 - n));\n                } else {\n                    wTmp = JBIG2_GETDWORD(pSrc) << n;\n                }\n                pDst[0] = (FX_BYTE)(wTmp >> 24);\n                pDst[1] = (FX_BYTE)(wTmp >> 16);\n                pDst[2] = (FX_BYTE)(wTmp >> 8);\n                pDst[3] = (FX_BYTE)wTmp;\n            }\n            pLineSrc += m_nStride;\n            pLineDst += pImage->m_nStride;\n        }\n    }\n    return pImage;\n}\nvoid CJBig2_Image::expand(FX_INT32 h, FX_BOOL v)\n{\n    if (!m_pData) {\n        return;\n    }\n    m_pData = (FX_BYTE*)m_pModule->JBig2_Realloc(m_pData, h * m_nStride);\n    if(h > m_nHeight) {\n        JBIG2_memset(m_pData + m_nHeight * m_nStride, v ? 0xff : 0, (h - m_nHeight)*m_nStride);\n    }\n    m_nHeight = h;\n}\nFX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)\n{\n    FX_INT32 xs0, ys0, xs1, ys1, xd0, yd0, xd1, yd1, xx, yy, w, h, middleDwords, lineLeft;\n    FX_DWORD s1, d1, d2, shift, shift1, shift2, tmp, tmp1, tmp2, maskL, maskR, maskM;\n    FX_BYTE *lineSrc, *lineDst, *sp, *dp;\n    if (!m_pData) {\n        return FALSE;\n    }\n    if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) {\n        return FALSE;\n    }\n    if(y < 0) {\n        ys0 = -y;\n    } else {\n        ys0 = 0;\n    }\n    if(y + m_nHeight > pDst->m_nHeight) {\n        ys1 = pDst->m_nHeight - y;\n    } else {\n        ys1 = m_nHeight;\n    }\n    if(x < 0) {\n        xs0 = -x;\n    } else {\n        xs0 = 0;\n    }\n    if(x + m_nWidth > pDst->m_nWidth) {\n        xs1 = pDst->m_nWidth - x;\n    } else {\n        xs1 = m_nWidth;\n    }\n    if((ys0 >= ys1) || (xs0 >= xs1)) {\n        return 0;\n    }\n    w = xs1 - xs0;\n    h = ys1 - ys0;\n    if(y < 0) {\n        yd0 = 0;\n    } else {\n        yd0 = y;\n    }\n    if(x < 0) {\n        xd0 = 0;\n    } else {\n        xd0 = x;\n    }\n    xd1 = xd0 + w;\n    yd1 = yd0 + h;\n    d1 = xd0 & 31;\n    d2 = xd1 & 31;\n    s1 = xs0 & 31;\n    maskL = 0xffffffff >> d1;\n    maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32);\n    maskM = maskL & maskR;\n    lineSrc = m_pData + ys0 * m_nStride + ((xs0 >> 5) << 2);\n    lineLeft = m_nStride - ((xs0 >> 5) << 2);\n    lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2);\n    if((xd0 & ~31) == ((xd1 - 1) & ~31)) {\n        if((xs0 & ~31) == ((xs1 - 1) & ~31)) {\n            if(s1 > d1) {\n                shift = s1 - d1;\n                for(yy = yd0; yy < yd1; yy++) {\n                    tmp1 = JBIG2_GETDWORD(lineSrc) << shift;\n                    tmp2 = JBIG2_GETDWORD(lineDst);\n                    switch(op) {\n                        case JBIG2_COMPOSE_OR:\n                            tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);\n                            break;\n                        case JBIG2_COMPOSE_AND:\n                            tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);\n                            break;\n                        case JBIG2_COMPOSE_XOR:\n                            tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);\n                            break;\n                        case JBIG2_COMPOSE_XNOR:\n                            tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);\n                            break;\n                        case JBIG2_COMPOSE_REPLACE:\n                            tmp = (tmp2 & ~maskM) | (tmp1 & maskM);\n                            break;\n                    }\n                    lineDst[0] = (FX_BYTE)(tmp >> 24);\n                    lineDst[1] = (FX_BYTE)(tmp >> 16);\n                    lineDst[2] = (FX_BYTE)(tmp >> 8);\n                    lineDst[3] = (FX_BYTE)tmp;\n                    lineSrc += m_nStride;\n                    lineDst += pDst->m_nStride;\n                }\n            } else {\n                shift = d1 - s1;\n                for(yy = yd0; yy < yd1; yy++) {\n                    tmp1 = JBIG2_GETDWORD(lineSrc) >> shift;\n                    tmp2 = JBIG2_GETDWORD(lineDst);\n                    switch(op) {\n                        case JBIG2_COMPOSE_OR:\n                            tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);\n                            break;\n                        case JBIG2_COMPOSE_AND:\n                            tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);\n                            break;\n                        case JBIG2_COMPOSE_XOR:\n                            tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);\n                            break;\n                        case JBIG2_COMPOSE_XNOR:\n                            tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);\n                            break;\n                        case JBIG2_COMPOSE_REPLACE:\n                            tmp = (tmp2 & ~maskM) | (tmp1 & maskM);\n                            break;\n                    }\n                    lineDst[0] = (FX_BYTE)(tmp >> 24);\n                    lineDst[1] = (FX_BYTE)(tmp >> 16);\n                    lineDst[2] = (FX_BYTE)(tmp >> 8);\n                    lineDst[3] = (FX_BYTE)tmp;\n                    lineSrc += m_nStride;\n                    lineDst += pDst->m_nStride;\n                }\n            }\n        } else {\n            shift1 = s1 - d1;\n            shift2 = 32 - shift1;\n            for(yy = yd0; yy < yd1; yy++) {\n                tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) | (JBIG2_GETDWORD(lineSrc + 4) >> shift2);\n                tmp2 = JBIG2_GETDWORD(lineDst);\n                switch(op) {\n                    case JBIG2_COMPOSE_OR:\n                        tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);\n                        break;\n                    case JBIG2_COMPOSE_AND:\n                        tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);\n                        break;\n                    case JBIG2_COMPOSE_XOR:\n                        tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);\n                        break;\n                    case JBIG2_COMPOSE_XNOR:\n                        tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);\n                        break;\n                    case JBIG2_COMPOSE_REPLACE:\n                        tmp = (tmp2 & ~maskM) | (tmp1 & maskM);\n                        break;\n                }\n                lineDst[0] = (FX_BYTE)(tmp >> 24);\n                lineDst[1] = (FX_BYTE)(tmp >> 16);\n                lineDst[2] = (FX_BYTE)(tmp >> 8);\n                lineDst[3] = (FX_BYTE)tmp;\n                lineSrc += m_nStride;\n                lineDst += pDst->m_nStride;\n            }\n        }\n    } else {\n        if(s1 > d1) {\n            shift1 = s1 - d1;\n            shift2 = 32 - shift1;\n            middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);\n            for(yy = yd0; yy < yd1; yy++) {\n                sp = lineSrc;\n                dp = lineDst;\n                if(d1 != 0) {\n                    tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);\n                    tmp2 = JBIG2_GETDWORD(dp);\n                    switch(op) {\n                        case JBIG2_COMPOSE_OR:\n                            tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);\n                            break;\n                        case JBIG2_COMPOSE_AND:\n                            tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);\n                            break;\n                        case JBIG2_COMPOSE_XOR:\n                            tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);\n                            break;\n                        case JBIG2_COMPOSE_XNOR:\n                            tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);\n                            break;\n                        case JBIG2_COMPOSE_REPLACE:\n                            tmp = (tmp2 & ~maskL) | (tmp1 & maskL);\n                            break;\n                    }\n                    dp[0] = (FX_BYTE)(tmp >> 24);\n                    dp[1] = (FX_BYTE)(tmp >> 16);\n                    dp[2] = (FX_BYTE)(tmp >> 8);\n                    dp[3] = (FX_BYTE)tmp;\n                    sp += 4;\n                    dp += 4;\n                }\n                for(xx = 0; xx < middleDwords; xx++) {\n                    tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);\n                    tmp2 = JBIG2_GETDWORD(dp);\n                    switch(op) {\n                        case JBIG2_COMPOSE_OR:\n                            tmp = tmp1 | tmp2;\n                            break;\n                        case JBIG2_COMPOSE_AND:\n                            tmp = tmp1 & tmp2;\n                            break;\n                        case JBIG2_COMPOSE_XOR:\n                            tmp = tmp1 ^ tmp2;\n                            break;\n                        case JBIG2_COMPOSE_XNOR:\n                            tmp = ~(tmp1 ^ tmp2);\n                            break;\n                        case JBIG2_COMPOSE_REPLACE:\n                            tmp = tmp1;\n                            break;\n                    }\n                    dp[0] = (FX_BYTE)(tmp >> 24);\n                    dp[1] = (FX_BYTE)(tmp >> 16);\n                    dp[2] = (FX_BYTE)(tmp >> 8);\n                    dp[3] = (FX_BYTE)tmp;\n                    sp += 4;\n                    dp += 4;\n                }\n                if(d2 != 0) {\n                    tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (\n                               ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift2);\n                    tmp2 = JBIG2_GETDWORD(dp);\n                    switch(op) {\n                        case JBIG2_COMPOSE_OR:\n                            tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);\n                            break;\n                        case JBIG2_COMPOSE_AND:\n                            tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);\n                            break;\n                        case JBIG2_COMPOSE_XOR:\n                            tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);\n                            break;\n                        case JBIG2_COMPOSE_XNOR:\n                            tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);\n                            break;\n                        case JBIG2_COMPOSE_REPLACE:\n                            tmp = (tmp2 & ~maskR) | (tmp1 & maskR);\n                            break;\n                    }\n                    dp[0] = (FX_BYTE)(tmp >> 24);\n                    dp[1] = (FX_BYTE)(tmp >> 16);\n                    dp[2] = (FX_BYTE)(tmp >> 8);\n                    dp[3] = (FX_BYTE)tmp;\n                }\n                lineSrc += m_nStride;\n                lineDst += pDst->m_nStride;\n            }\n        } else if(s1 == d1) {\n            middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);\n            for(yy = yd0; yy < yd1; yy++) {\n                sp = lineSrc;\n                dp = lineDst;\n                if(d1 != 0) {\n                    tmp1 = JBIG2_GETDWORD(sp);\n                    tmp2 = JBIG2_GETDWORD(dp);\n                    switch(op) {\n                        case JBIG2_COMPOSE_OR:\n                            tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);\n                            break;\n                        case JBIG2_COMPOSE_AND:\n                            tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);\n                            break;\n                        case JBIG2_COMPOSE_XOR:\n                            tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);\n                            break;\n                        case JBIG2_COMPOSE_XNOR:\n                            tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);\n                            break;\n                        case JBIG2_COMPOSE_REPLACE:\n                            tmp = (tmp2 & ~maskL) | (tmp1 & maskL);\n                            break;\n                    }\n                    dp[0] = (FX_BYTE)(tmp >> 24);\n                    dp[1] = (FX_BYTE)(tmp >> 16);\n                    dp[2] = (FX_BYTE)(tmp >> 8);\n                    dp[3] = (FX_BYTE)tmp;\n                    sp += 4;\n                    dp += 4;\n                }\n                for(xx = 0; xx < middleDwords; xx++) {\n                    tmp1 = JBIG2_GETDWORD(sp);\n                    tmp2 = JBIG2_GETDWORD(dp);\n                    switch(op) {\n                        case JBIG2_COMPOSE_OR:\n                            tmp = tmp1 | tmp2;\n                            break;\n                        case JBIG2_COMPOSE_AND:\n                            tmp = tmp1 & tmp2;\n                            break;\n                        case JBIG2_COMPOSE_XOR:\n                            tmp = tmp1 ^ tmp2;\n                            break;\n                        case JBIG2_COMPOSE_XNOR:\n                            tmp = ~(tmp1 ^ tmp2);\n                            break;\n                        case JBIG2_COMPOSE_REPLACE:\n                            tmp = tmp1;\n                            break;\n                    }\n                    dp[0] = (FX_BYTE)(tmp >> 24);\n                    dp[1] = (FX_BYTE)(tmp >> 16);\n                    dp[2] = (FX_BYTE)(tmp >> 8);\n                    dp[3] = (FX_BYTE)tmp;\n                    sp += 4;\n                    dp += 4;\n                }\n                if(d2 != 0) {\n                    tmp1 = JBIG2_GETDWORD(sp);\n                    tmp2 = JBIG2_GETDWORD(dp);\n                    switch(op) {\n                        case JBIG2_COMPOSE_OR:\n                            tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);\n                            break;\n                        case JBIG2_COMPOSE_AND:\n                            tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);\n                            break;\n                        case JBIG2_COMPOSE_XOR:\n                            tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);\n                            break;\n                        case JBIG2_COMPOSE_XNOR:\n                            tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);\n                            break;\n                        case JBIG2_COMPOSE_REPLACE:\n                            tmp = (tmp2 & ~maskR) | (tmp1 & maskR);\n                            break;\n                    }\n                    dp[0] = (FX_BYTE)(tmp >> 24);\n                    dp[1] = (FX_BYTE)(tmp >> 16);\n                    dp[2] = (FX_BYTE)(tmp >> 8);\n                    dp[3] = (FX_BYTE)tmp;\n                }\n                lineSrc += m_nStride;\n                lineDst += pDst->m_nStride;\n            }\n        } else {\n            shift1 = d1 - s1;\n            shift2 = 32 - shift1;\n            middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);\n            for(yy = yd0; yy < yd1; yy++) {\n                sp = lineSrc;\n                dp = lineDst;\n                if(d1 != 0) {\n                    tmp1 = JBIG2_GETDWORD(sp) >> shift1;\n                    tmp2 = JBIG2_GETDWORD(dp);\n                    switch(op) {\n                        case JBIG2_COMPOSE_OR:\n                            tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);\n                            break;\n                        case JBIG2_COMPOSE_AND:\n                            tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);\n                            break;\n                        case JBIG2_COMPOSE_XOR:\n                            tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);\n                            break;\n                        case JBIG2_COMPOSE_XNOR:\n                            tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);\n                            break;\n                        case JBIG2_COMPOSE_REPLACE:\n                            tmp = (tmp2 & ~maskL) | (tmp1 & maskL);\n                            break;\n                    }\n                    dp[0] = (FX_BYTE)(tmp >> 24);\n                    dp[1] = (FX_BYTE)(tmp >> 16);\n                    dp[2] = (FX_BYTE)(tmp >> 8);\n                    dp[3] = (FX_BYTE)tmp;\n                    dp += 4;\n                }\n                for(xx = 0; xx < middleDwords; xx++) {\n                    tmp1 = (JBIG2_GETDWORD(sp) << shift2) | ((JBIG2_GETDWORD(sp + 4)) >> shift1);\n                    tmp2 = JBIG2_GETDWORD(dp);\n                    switch(op) {\n                        case JBIG2_COMPOSE_OR:\n                            tmp = tmp1 | tmp2;\n                            break;\n                        case JBIG2_COMPOSE_AND:\n                            tmp = tmp1 & tmp2;\n                            break;\n                        case JBIG2_COMPOSE_XOR:\n                            tmp = tmp1 ^ tmp2;\n                            break;\n                        case JBIG2_COMPOSE_XNOR:\n                            tmp = ~(tmp1 ^ tmp2);\n                            break;\n                        case JBIG2_COMPOSE_REPLACE:\n                            tmp = tmp1;\n                            break;\n                    }\n                    dp[0] = (FX_BYTE)(tmp >> 24);\n                    dp[1] = (FX_BYTE)(tmp >> 16);\n                    dp[2] = (FX_BYTE)(tmp >> 8);\n                    dp[3] = (FX_BYTE)tmp;\n                    sp += 4;\n                    dp += 4;\n                }\n                if(d2 != 0) {\n                    tmp1 = (JBIG2_GETDWORD(sp) << shift2) | (\n                               ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift1);\n                    tmp2 = JBIG2_GETDWORD(dp);\n                    switch(op) {\n                        case JBIG2_COMPOSE_OR:\n                            tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);\n                            break;\n                        case JBIG2_COMPOSE_AND:\n                            tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);\n                            break;\n                        case JBIG2_COMPOSE_XOR:\n                            tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);\n                            break;\n                        case JBIG2_COMPOSE_XNOR:\n                            tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);\n                            break;\n                        case JBIG2_COMPOSE_REPLACE:\n                            tmp = (tmp2 & ~maskR) | (tmp1 & maskR);\n                            break;\n                    }\n                    dp[0] = (FX_BYTE)(tmp >> 24);\n                    dp[1] = (FX_BYTE)(tmp >> 16);\n                    dp[2] = (FX_BYTE)(tmp >> 8);\n                    dp[3] = (FX_BYTE)tmp;\n                }\n                lineSrc += m_nStride;\n                lineDst += pDst->m_nStride;\n            }\n        }\n    }\n    return 1;\n}\nFX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op, const FX_RECT* pSrcRect)\n{\n    FX_INT32 xs0, ys0, xs1, ys1, xd0, yd0, xd1, yd1, xx, yy, w, h, middleDwords, lineLeft;\n    FX_DWORD s1, d1, d2, shift, shift1, shift2, tmp, tmp1, tmp2, maskL, maskR, maskM;\n    FX_BYTE *lineSrc, *lineDst, *sp, *dp;\n    FX_INT32 sw, sh;\n    if (!m_pData) {\n        return FALSE;\n    }\n    if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) {\n        return FALSE;\n    }\n    sw = pSrcRect->Width();\n    sh = pSrcRect->Height();\n    if(y < 0) {\n        ys0 = -y;\n    } else {\n        ys0 = 0;\n    }\n    if(y + sh > pDst->m_nHeight) {\n        ys1 = pDst->m_nHeight - y;\n    } else {\n        ys1 = sh;\n    }\n    if(x < 0) {\n        xs0 = -x;\n    } else {\n        xs0 = 0;\n    }\n    if(x + sw > pDst->m_nWidth) {\n        xs1 = pDst->m_nWidth - x;\n    } else {\n        xs1 = sw;\n    }\n    if((ys0 >= ys1) || (xs0 >= xs1)) {\n        return 0;\n    }\n    w = xs1 - xs0;\n    h = ys1 - ys0;\n    if(y < 0) {\n        yd0 = 0;\n    } else {\n        yd0 = y;\n    }\n    if(x < 0) {\n        xd0 = 0;\n    } else {\n        xd0 = x;\n    }\n    xd1 = xd0 + w;\n    yd1 = yd0 + h;\n    d1 = xd0 & 31;\n    d2 = xd1 & 31;\n    s1 = xs0 & 31;\n    maskL = 0xffffffff >> d1;\n    maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32);\n    maskM = maskL & maskR;\n    lineSrc = m_pData + (pSrcRect->top + ys0) * m_nStride + (((xs0 + pSrcRect->left) >> 5) << 2);\n    lineLeft = m_nStride - ((xs0 >> 5) << 2);\n    lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2);\n    if((xd0 & ~31) == ((xd1 - 1) & ~31)) {\n        if((xs0 & ~31) == ((xs1 - 1) & ~31)) {\n            if(s1 > d1) {\n                shift = s1 - d1;\n                for(yy = yd0; yy < yd1; yy++) {\n                    tmp1 = JBIG2_GETDWORD(lineSrc) << shift;\n                    tmp2 = JBIG2_GETDWORD(lineDst);\n                    switch(op) {\n                        case JBIG2_COMPOSE_OR:\n                            tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);\n                            break;\n                        case JBIG2_COMPOSE_AND:\n                            tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);\n                            break;\n                        case JBIG2_COMPOSE_XOR:\n                            tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);\n                            break;\n                        case JBIG2_COMPOSE_XNOR:\n                            tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);\n                            break;\n                        case JBIG2_COMPOSE_REPLACE:\n                            tmp = (tmp2 & ~maskM) | (tmp1 & maskM);\n                            break;\n                    }\n                    lineDst[0] = (FX_BYTE)(tmp >> 24);\n                    lineDst[1] = (FX_BYTE)(tmp >> 16);\n                    lineDst[2] = (FX_BYTE)(tmp >> 8);\n                    lineDst[3] = (FX_BYTE)tmp;\n                    lineSrc += m_nStride;\n                    lineDst += pDst->m_nStride;\n                }\n            } else {\n                shift = d1 - s1;\n                for(yy = yd0; yy < yd1; yy++) {\n                    tmp1 = JBIG2_GETDWORD(lineSrc) >> shift;\n                    tmp2 = JBIG2_GETDWORD(lineDst);\n                    switch(op) {\n                        case JBIG2_COMPOSE_OR:\n                            tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);\n                            break;\n                        case JBIG2_COMPOSE_AND:\n                            tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);\n                            break;\n                        case JBIG2_COMPOSE_XOR:\n                            tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);\n                            break;\n                        case JBIG2_COMPOSE_XNOR:\n                            tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);\n                            break;\n                        case JBIG2_COMPOSE_REPLACE:\n                            tmp = (tmp2 & ~maskM) | (tmp1 & maskM);\n                            break;\n                    }\n                    lineDst[0] = (FX_BYTE)(tmp >> 24);\n                    lineDst[1] = (FX_BYTE)(tmp >> 16);\n                    lineDst[2] = (FX_BYTE)(tmp >> 8);\n                    lineDst[3] = (FX_BYTE)tmp;\n                    lineSrc += m_nStride;\n                    lineDst += pDst->m_nStride;\n                }\n            }\n        } else {\n            shift1 = s1 - d1;\n            shift2 = 32 - shift1;\n            for(yy = yd0; yy < yd1; yy++) {\n                tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) | (JBIG2_GETDWORD(lineSrc + 4) >> shift2);\n                tmp2 = JBIG2_GETDWORD(lineDst);\n                switch(op) {\n                    case JBIG2_COMPOSE_OR:\n                        tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);\n                        break;\n                    case JBIG2_COMPOSE_AND:\n                        tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);\n                        break;\n                    case JBIG2_COMPOSE_XOR:\n                        tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);\n                        break;\n                    case JBIG2_COMPOSE_XNOR:\n                        tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);\n                        break;\n                    case JBIG2_COMPOSE_REPLACE:\n                        tmp = (tmp2 & ~maskM) | (tmp1 & maskM);\n                        break;\n                }\n                lineDst[0] = (FX_BYTE)(tmp >> 24);\n                lineDst[1] = (FX_BYTE)(tmp >> 16);\n                lineDst[2] = (FX_BYTE)(tmp >> 8);\n                lineDst[3] = (FX_BYTE)tmp;\n                lineSrc += m_nStride;\n                lineDst += pDst->m_nStride;\n            }\n        }\n    } else {\n        if(s1 > d1) {\n            shift1 = s1 - d1;\n            shift2 = 32 - shift1;\n            middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);\n            for(yy = yd0; yy < yd1; yy++) {\n                sp = lineSrc;\n                dp = lineDst;\n                if(d1 != 0) {\n                    tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);\n                    tmp2 = JBIG2_GETDWORD(dp);\n                    switch(op) {\n                        case JBIG2_COMPOSE_OR:\n                            tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);\n                            break;\n                        case JBIG2_COMPOSE_AND:\n                            tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);\n                            break;\n                        case JBIG2_COMPOSE_XOR:\n                            tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);\n                            break;\n                        case JBIG2_COMPOSE_XNOR:\n                            tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);\n                            break;\n                        case JBIG2_COMPOSE_REPLACE:\n                            tmp = (tmp2 & ~maskL) | (tmp1 & maskL);\n                            break;\n                    }\n                    dp[0] = (FX_BYTE)(tmp >> 24);\n                    dp[1] = (FX_BYTE)(tmp >> 16);\n                    dp[2] = (FX_BYTE)(tmp >> 8);\n                    dp[3] = (FX_BYTE)tmp;\n                    sp += 4;\n                    dp += 4;\n                }\n                for(xx = 0; xx < middleDwords; xx++) {\n                    tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);\n                    tmp2 = JBIG2_GETDWORD(dp);\n                    switch(op) {\n                        case JBIG2_COMPOSE_OR:\n                            tmp = tmp1 | tmp2;\n                            break;\n                        case JBIG2_COMPOSE_AND:\n                            tmp = tmp1 & tmp2;\n                            break;\n                        case JBIG2_COMPOSE_XOR:\n                            tmp = tmp1 ^ tmp2;\n                            break;\n                        case JBIG2_COMPOSE_XNOR:\n                            tmp = ~(tmp1 ^ tmp2);\n                            break;\n                        case JBIG2_COMPOSE_REPLACE:\n                            tmp = tmp1;\n                            break;\n                    }\n                    dp[0] = (FX_BYTE)(tmp >> 24);\n                    dp[1] = (FX_BYTE)(tmp >> 16);\n                    dp[2] = (FX_BYTE)(tmp >> 8);\n                    dp[3] = (FX_BYTE)tmp;\n                    sp += 4;\n                    dp += 4;\n                }\n                if(d2 != 0) {\n                    tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (\n                               ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift2);\n                    tmp2 = JBIG2_GETDWORD(dp);\n                    switch(op) {\n                        case JBIG2_COMPOSE_OR:\n                            tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);\n                            break;\n                        case JBIG2_COMPOSE_AND:\n                            tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);\n                            break;\n                        case JBIG2_COMPOSE_XOR:\n                            tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);\n                            break;\n                        case JBIG2_COMPOSE_XNOR:\n                            tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);\n                            break;\n                        case JBIG2_COMPOSE_REPLACE:\n                            tmp = (tmp2 & ~maskR) | (tmp1 & maskR);\n                            break;\n                    }\n                    dp[0] = (FX_BYTE)(tmp >> 24);\n                    dp[1] = (FX_BYTE)(tmp >> 16);\n                    dp[2] = (FX_BYTE)(tmp >> 8);\n                    dp[3] = (FX_BYTE)tmp;\n                }\n                lineSrc += m_nStride;\n                lineDst += pDst->m_nStride;\n            }\n        } else if(s1 == d1) {\n            middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);\n            for(yy = yd0; yy < yd1; yy++) {\n                sp = lineSrc;\n                dp = lineDst;\n                if(d1 != 0) {\n                    tmp1 = JBIG2_GETDWORD(sp);\n                    tmp2 = JBIG2_GETDWORD(dp);\n                    switch(op) {\n                        case JBIG2_COMPOSE_OR:\n                            tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);\n                            break;\n                        case JBIG2_COMPOSE_AND:\n                            tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);\n                            break;\n                        case JBIG2_COMPOSE_XOR:\n                            tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);\n                            break;\n                        case JBIG2_COMPOSE_XNOR:\n                            tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);\n                            break;\n                        case JBIG2_COMPOSE_REPLACE:\n                            tmp = (tmp2 & ~maskL) | (tmp1 & maskL);\n                            break;\n                    }\n                    dp[0] = (FX_BYTE)(tmp >> 24);\n                    dp[1] = (FX_BYTE)(tmp >> 16);\n                    dp[2] = (FX_BYTE)(tmp >> 8);\n                    dp[3] = (FX_BYTE)tmp;\n                    sp += 4;\n                    dp += 4;\n                }\n                for(xx = 0; xx < middleDwords; xx++) {\n                    tmp1 = JBIG2_GETDWORD(sp);\n                    tmp2 = JBIG2_GETDWORD(dp);\n                    switch(op) {\n                        case JBIG2_COMPOSE_OR:\n                            tmp = tmp1 | tmp2;\n                            break;\n                        case JBIG2_COMPOSE_AND:\n                            tmp = tmp1 & tmp2;\n                            break;\n                        case JBIG2_COMPOSE_XOR:\n                            tmp = tmp1 ^ tmp2;\n                            break;\n                        case JBIG2_COMPOSE_XNOR:\n                            tmp = ~(tmp1 ^ tmp2);\n                            break;\n                        case JBIG2_COMPOSE_REPLACE:\n                            tmp = tmp1;\n                            break;\n                    }\n                    dp[0] = (FX_BYTE)(tmp >> 24);\n                    dp[1] = (FX_BYTE)(tmp >> 16);\n                    dp[2] = (FX_BYTE)(tmp >> 8);\n                    dp[3] = (FX_BYTE)tmp;\n                    sp += 4;\n                    dp += 4;\n                }\n                if(d2 != 0) {\n                    tmp1 = JBIG2_GETDWORD(sp);\n                    tmp2 = JBIG2_GETDWORD(dp);\n                    switch(op) {\n                        case JBIG2_COMPOSE_OR:\n                            tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);\n                            break;\n                        case JBIG2_COMPOSE_AND:\n                            tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);\n                            break;\n                        case JBIG2_COMPOSE_XOR:\n                            tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);\n                            break;\n                        case JBIG2_COMPOSE_XNOR:\n                            tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);\n                            break;\n                        case JBIG2_COMPOSE_REPLACE:\n                            tmp = (tmp2 & ~maskR) | (tmp1 & maskR);\n                            break;\n                    }\n                    dp[0] = (FX_BYTE)(tmp >> 24);\n                    dp[1] = (FX_BYTE)(tmp >> 16);\n                    dp[2] = (FX_BYTE)(tmp >> 8);\n                    dp[3] = (FX_BYTE)tmp;\n                }\n                lineSrc += m_nStride;\n                lineDst += pDst->m_nStride;\n            }\n        } else {\n            shift1 = d1 - s1;\n            shift2 = 32 - shift1;\n            middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);\n            for(yy = yd0; yy < yd1; yy++) {\n                sp = lineSrc;\n                dp = lineDst;\n                if(d1 != 0) {\n                    tmp1 = JBIG2_GETDWORD(sp) >> shift1;\n                    tmp2 = JBIG2_GETDWORD(dp);\n                    switch(op) {\n                        case JBIG2_COMPOSE_OR:\n                            tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);\n                            break;\n                        case JBIG2_COMPOSE_AND:\n                            tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);\n                            break;\n                        case JBIG2_COMPOSE_XOR:\n                            tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);\n                            break;\n                        case JBIG2_COMPOSE_XNOR:\n                            tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);\n                            break;\n                        case JBIG2_COMPOSE_REPLACE:\n                            tmp = (tmp2 & ~maskL) | (tmp1 & maskL);\n                            break;\n                    }\n                    dp[0] = (FX_BYTE)(tmp >> 24);\n                    dp[1] = (FX_BYTE)(tmp >> 16);\n                    dp[2] = (FX_BYTE)(tmp >> 8);\n                    dp[3] = (FX_BYTE)tmp;\n                    dp += 4;\n                }\n                for(xx = 0; xx < middleDwords; xx++) {\n                    tmp1 = (JBIG2_GETDWORD(sp) << shift2) | ((JBIG2_GETDWORD(sp + 4)) >> shift1);\n                    tmp2 = JBIG2_GETDWORD(dp);\n                    switch(op) {\n                        case JBIG2_COMPOSE_OR:\n                            tmp = tmp1 | tmp2;\n                            break;\n                        case JBIG2_COMPOSE_AND:\n                            tmp = tmp1 & tmp2;\n                            break;\n                        case JBIG2_COMPOSE_XOR:\n                            tmp = tmp1 ^ tmp2;\n                            break;\n                        case JBIG2_COMPOSE_XNOR:\n                            tmp = ~(tmp1 ^ tmp2);\n                            break;\n                        case JBIG2_COMPOSE_REPLACE:\n                            tmp = tmp1;\n                            break;\n                    }\n                    dp[0] = (FX_BYTE)(tmp >> 24);\n                    dp[1] = (FX_BYTE)(tmp >> 16);\n                    dp[2] = (FX_BYTE)(tmp >> 8);\n                    dp[3] = (FX_BYTE)tmp;\n                    sp += 4;\n                    dp += 4;\n                }\n                if(d2 != 0) {\n                    tmp1 = (JBIG2_GETDWORD(sp) << shift2) | (\n                               ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift1);\n                    tmp2 = JBIG2_GETDWORD(dp);\n                    switch(op) {\n                        case JBIG2_COMPOSE_OR:\n                            tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);\n                            break;\n                        case JBIG2_COMPOSE_AND:\n                            tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);\n                            break;\n                        case JBIG2_COMPOSE_XOR:\n                            tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);\n                            break;\n                        case JBIG2_COMPOSE_XNOR:\n                            tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);\n                            break;\n                        case JBIG2_COMPOSE_REPLACE:\n                            tmp = (tmp2 & ~maskR) | (tmp1 & maskR);\n                            break;\n                    }\n                    dp[0] = (FX_BYTE)(tmp >> 24);\n                    dp[1] = (FX_BYTE)(tmp >> 16);\n                    dp[2] = (FX_BYTE)(tmp >> 8);\n                    dp[3] = (FX_BYTE)tmp;\n                }\n                lineSrc += m_nStride;\n                lineDst += pDst->m_nStride;\n            }\n        }\n    }\n    return 1;\n}\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_Image.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JBIG2_IMAGE_H_\n#define _JBIG2_IMAGE_H_\n#include \"JBig2_Define.h\"\n#include \"JBig2_Module.h\"\ntypedef enum {\n    JBIG2_COMPOSE_OR\t\t= 0,\n    JBIG2_COMPOSE_AND\t\t= 1,\n    JBIG2_COMPOSE_XOR\t\t= 2,\n    JBIG2_COMPOSE_XNOR\t\t= 3,\n    JBIG2_COMPOSE_REPLACE\t= 4\n} JBig2ComposeOp;\nstruct FX_RECT;\nclass CJBig2_Image : public CJBig2_Object\n{\npublic:\n\n    CJBig2_Image(FX_INT32 w, FX_INT32 h);\n\n    CJBig2_Image(FX_INT32 w, FX_INT32 h, FX_INT32 stride, FX_BYTE*pBuf);\n\n    CJBig2_Image(CJBig2_Image &im);\n\n    ~CJBig2_Image();\n\n    FX_BOOL getPixel(FX_INT32 x, FX_INT32 y);\n\n    FX_INT32 setPixel(FX_INT32 x, FX_INT32 y, FX_BOOL v);\n\n    void copyLine(FX_INT32 hTo, FX_INT32 hFrom);\n\n    void fill(FX_BOOL v);\n\n    FX_BOOL composeTo(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op);\n    FX_BOOL composeTo(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op, const FX_RECT* pSrcRect);\n\n    FX_BOOL composeTo_unopt(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op);\n\n    FX_BOOL composeTo_opt(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op);\n\n    FX_BOOL composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op);\n    FX_BOOL composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op, const FX_RECT* pSrcRect);\n\n    FX_BOOL composeFrom(FX_INT32 x, FX_INT32 y, CJBig2_Image *pSrc, JBig2ComposeOp op);\n    FX_BOOL composeFrom(FX_INT32 x, FX_INT32 y, CJBig2_Image *pSrc, JBig2ComposeOp op, const FX_RECT* pSrcRect);\n    CJBig2_Image *subImage_unopt(FX_INT32 x, FX_INT32 y, FX_INT32 w, FX_INT32 h);\n\n    CJBig2_Image *subImage(FX_INT32 x, FX_INT32 y, FX_INT32 w, FX_INT32 h);\n\n    void expand(FX_INT32 h, FX_BOOL v);\npublic:\n\n    FX_INT32 m_nWidth;\n\n    FX_INT32 m_nHeight;\n\n    FX_INT32 m_nStride;\n\n    FX_BYTE *m_pData;\n\n    FX_BOOL m_bNeedFree;\n};\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_List.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JBIG2_LIST_H_\n#define _JBIG2_LIST_H_\n#include \"JBig2_Define.h\"\n#include \"JBig2_Object.h\"\ntemplate <class TYPE>\nclass CJBig2_List : public CJBig2_Object\n{\npublic:\n\n    CJBig2_List(FX_INT32 nSize = 8)\n    {\n        m_nSize = nSize;\n        m_pArray = (TYPE**)m_pModule->JBig2_Malloc2(sizeof(TYPE*), nSize);\n        m_nLength = 0;\n    }\n\n    ~CJBig2_List()\n    {\n        clear();\n        m_pModule->JBig2_Free(m_pArray);\n    }\n\n    void clear()\n    {\n        FX_INT32 i;\n        for(i = 0; i < m_nLength; i++) {\n            delete m_pArray[i];\n        }\n        m_nLength = 0;\n    }\n\n    void addItem(TYPE *pItem)\n    {\n        if(m_nLength >= m_nSize) {\n            m_nSize += 8;\n            m_pArray = (TYPE**)m_pModule->JBig2_Realloc(m_pArray, sizeof(TYPE*)*m_nSize);\n        }\n        m_pArray[m_nLength++] = pItem;\n    }\n\n\n    FX_INT32 getLength()\n    {\n        return m_nLength;\n    }\n\n    TYPE *getAt(FX_INT32 nIndex)\n    {\n        return m_pArray[nIndex];\n    }\n\n    TYPE *getLast()\n    {\n        return m_pArray[m_nLength - 1];\n    }\nprivate:\n    FX_INT32 m_nSize;\n    TYPE **m_pArray;\n    FX_INT32 m_nLength;\n};\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_Module.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JBIG2_MODULE_H_\n#define _JBIG2_MODULE_H_\n#include \"JBig2_Define.h\"\nclass CJBig2_Module\n{\npublic:\n\n    virtual void *JBig2_Malloc(FX_DWORD dwSize) = 0;\n\n    virtual void *JBig2_Malloc2(FX_DWORD num, FX_DWORD dwSize) = 0;\n\n    virtual void *JBig2_Malloc3(FX_DWORD num, FX_DWORD dwSize, FX_DWORD dwSize2) = 0;\n\n    virtual void *JBig2_Realloc(FX_LPVOID pMem, FX_DWORD dwSize) = 0;\n\n    virtual void JBig2_Free(FX_LPVOID pMem) = 0;\n\n    virtual void JBig2_Assert(FX_INT32 nExpression) {};\n\n    virtual\tvoid JBig2_Error(FX_LPCSTR format, ...) {};\n\n    virtual void JBig2_Warn(FX_LPCSTR format, ...) {};\n\n    virtual void JBig2_Log(FX_LPCSTR format, ...) {};\n};\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_Object.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"JBig2_Object.h\"\n#include \"JBig2_Module.h\"\nvoid *CJBig2_Object::operator new(size_t size, CJBig2_Module *pModule, FX_LPCSTR filename, int line)\n{\n    CJBig2_Object *p;\n    p = (CJBig2_Object *)pModule->JBig2_Malloc((FX_DWORD)size);\n    p->m_pModule = pModule;\n    return p;\n}\nvoid CJBig2_Object::operator delete(void *p, CJBig2_Module *pModule, FX_LPCSTR filename, int line)\n{\n    pModule->JBig2_Free(p);\n}\nvoid *CJBig2_Object::operator new(size_t size, CJBig2_Module *pModule)\n{\n    CJBig2_Object *p;\n    p = (CJBig2_Object *)pModule->JBig2_Malloc((FX_DWORD)size);\n    p->m_pModule = pModule;\n    return p;\n}\nvoid CJBig2_Object::operator delete(void *p)\n{\n    ((CJBig2_Object *)p)->m_pModule->JBig2_Free(p);\n}\nvoid CJBig2_Object::operator delete(void *p, CJBig2_Module *pModule)\n{\n    pModule->JBig2_Free(p);\n}\nvoid *CJBig2_Object::operator new[](size_t size, CJBig2_Module *pModule, size_t unit_size,\n                                    FX_LPCSTR filename, int line)\n{\n    void *p;\n    FX_BYTE *pCur, *pEnd;\n    p = (FX_BYTE *)pModule->JBig2_Malloc((FX_DWORD)size);\n    pCur = (FX_BYTE *)p;\n    pEnd = pCur + size;\n    for(; pCur < pEnd; pCur += unit_size) {\n        ((CJBig2_Object *)pCur)->m_pModule = pModule;\n    }\n    return p;\n}\nvoid CJBig2_Object::operator delete[](void *p, CJBig2_Module *pModule, size_t unit_size,\n                                      FX_LPCSTR filename, int line)\n{\n    pModule->JBig2_Free(p);\n}\nvoid *CJBig2_Object::operator new[](size_t size, CJBig2_Module *pModule, size_t unit_size)\n{\n    void *p;\n    FX_BYTE *pCur, *pEnd;\n    p = (FX_BYTE *)pModule->JBig2_Malloc((FX_DWORD)size);\n    pCur = (FX_BYTE *)p;\n    pEnd = pCur + size;\n    for(; pCur < pEnd; pCur += unit_size) {\n        ((CJBig2_Object *)pCur)->m_pModule = pModule;\n    }\n    return p;\n}\nvoid CJBig2_Object::operator delete[](void* p)\n{\n    ((CJBig2_Object *)p)->m_pModule->JBig2_Free(p);\n}\nvoid CJBig2_Object::operator delete[](void *p, CJBig2_Module *pModule, size_t unit_size)\n{\n    pModule->JBig2_Free(p);\n}\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_Object.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JBIG2_OBJECT_H_\n#define _JBIG2_OBJECT_H_\n#include \"JBig2_Define.h\"\nclass CJBig2_Module;\n#define _JBIG2_NO_EXPECTION_\nclass CJBig2_Object\n{\npublic:\n\n    void *operator new(size_t size, CJBig2_Module *pModule, FX_LPCSTR filename, int line);\n\n    void operator delete(void *p, CJBig2_Module *pModule, FX_LPCSTR filename, int line);\n\n    void *operator new(size_t size, CJBig2_Module *pModule);\n\n    void operator delete(void *p);\n\n    void operator delete(void *p, CJBig2_Module *pModule);\n\n    void *operator new[](size_t size, CJBig2_Module *pModule, size_t unit_size,\n                         FX_LPCSTR filename, int line);\n\n    void operator delete[](void *p, CJBig2_Module *pModule, size_t unit_size,\n                           FX_LPCSTR filename, int line);\n\n    void *operator new[](size_t size, CJBig2_Module *pModule, size_t unit_size);\n\n    void operator delete[](void* p);\n\n    void operator delete[](void *p, CJBig2_Module *pModule, size_t unit_size);\npublic:\n\n    CJBig2_Module *m_pModule;\n};\n#define JBIG2_NEW new(m_pModule)\n#define JBIG2_ALLOC(p, a) p = JBIG2_NEW a; p->m_pModule = m_pModule;\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_Page.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JBIG2_PAGE_H_\n#define _JBIG2_PAGE_H_\n#include \"JBig2_Image.h\"\nstruct JBig2PageInfo : public CJBig2_Object {\n    FX_DWORD m_dwWidth,\n             m_dwHeight;\n    FX_DWORD m_dwResolutionX,\n             m_dwResolutionY;\n    FX_BYTE m_cFlags;\n    FX_BOOL m_bIsStriped;\n    FX_WORD m_wMaxStripeSize;\n};\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_PatternDict.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"JBig2_PatternDict.h\"\nCJBig2_PatternDict::CJBig2_PatternDict()\n{\n    NUMPATS = 0;\n    HDPATS = NULL;\n}\n\nCJBig2_PatternDict::~CJBig2_PatternDict()\n{\n    if(HDPATS) {\n        for(FX_DWORD i = 0; i < NUMPATS; i++) {\n            if(HDPATS[i]) {\n                delete HDPATS[i];\n            }\n        }\n        m_pModule->JBig2_Free(HDPATS);\n    }\n}\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_PatternDict.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JBIG2_PATTERN_DICT_H_\n#define _JBIG2_PATTERN_DICT_H_\n#include \"JBig2_Define.h\"\n#include \"JBig2_Image.h\"\nclass CJBig2_PatternDict : public CJBig2_Object\n{\npublic:\n\n    CJBig2_PatternDict();\n\n    ~CJBig2_PatternDict();\npublic:\n    FX_DWORD NUMPATS;\n    CJBig2_Image **HDPATS;\n};\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_Segment.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"JBig2_Segment.h\"\nCJBig2_Segment::CJBig2_Segment()\n{\n    init();\n}\nCJBig2_Segment::~CJBig2_Segment()\n{\n    clean();\n}\nvoid CJBig2_Segment::init()\n{\n    m_dwNumber = 0;\n    m_cFlags.c = 0;\n    m_nReferred_to_segment_count = 0;\n    m_pReferred_to_segment_numbers = NULL;\n    m_dwPage_association = 0;\n    m_dwData_length = 0;\n    m_dwHeader_Length = 0;\n    m_pData = NULL;\n    m_State = JBIG2_SEGMENT_HEADER_UNPARSED;\n    m_nResultType = JBIG2_VOID_POINTER;\n    m_Result.vd = NULL;\n}\nvoid CJBig2_Segment::clean()\n{\n    if(m_pReferred_to_segment_numbers) {\n        m_pModule->JBig2_Free(m_pReferred_to_segment_numbers);\n    }\n    if(m_Result.vd) {\n        switch(m_nResultType) {\n            case JBIG2_IMAGE_POINTER:\n                delete m_Result.im;\n                break;\n            case JBIG2_SYMBOL_DICT_POINTER:\n                delete m_Result.sd;\n                break;\n            case JBIG2_PATTERN_DICT_POINTER:\n                delete m_Result.pd;\n                break;\n            case JBIG2_HUFFMAN_TABLE_POINTER:\n                delete m_Result.ht;\n                break;\n            default:\n                m_pModule->JBig2_Free(m_Result.vd);\n        }\n    }\n}\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_Segment.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JBIG2_SEGMENT_H_\n#define _JBIG2_SEGMENT_H_\n#include \"JBig2_Define.h\"\n#include \"JBig2_SymbolDict.h\"\n#include \"JBig2_PatternDict.h\"\n#include \"JBig2_Module.h\"\n#include \"JBig2_HuffmanTable.h\"\n#define JBIG2_GET_INT32(buf) (((buf)[0]<<24) | ((buf)[1]<<16) | ((buf)[2]<<8) | (buf)[3])\n#define JBIG2_GET_INT16(buf) (((buf)[0]<<8) | (buf)[1])\ntypedef enum {\n    JBIG2_SEGMENT_HEADER_UNPARSED,\n    JBIG2_SEGMENT_DATA_UNPARSED,\n    JBIG2_SEGMENT_PARSE_COMPLETE,\n    JBIG2_SEGMENT_PAUSED,\n    JBIG2_SEGMENT_ERROR\n} JBig2_SegmentState;\ntypedef enum {\n    JBIG2_VOID_POINTER\t= 0,\n    JBIG2_IMAGE_POINTER,\n    JBIG2_SYMBOL_DICT_POINTER,\n    JBIG2_PATTERN_DICT_POINTER,\n    JBIG2_HUFFMAN_TABLE_POINTER\n} JBig2_ResultType;\nclass CJBig2_Segment : public CJBig2_Object\n{\npublic:\n\n    CJBig2_Segment();\n\n    ~CJBig2_Segment();\n\n    void init();\n\n    void clean();\npublic:\n    FX_DWORD m_dwNumber;\n    union {\n        struct {\n            FX_BYTE type\t\t\t\t\t:\t6;\n            FX_BYTE page_association_size\t:\t1;\n            FX_BYTE deferred_non_retain\t\t:\t1;\n        } s;\n        FX_BYTE c;\n    } m_cFlags;\n    FX_INT32 m_nReferred_to_segment_count;\n    FX_DWORD * m_pReferred_to_segment_numbers;\n    FX_DWORD m_dwPage_association;\n    FX_DWORD m_dwData_length;\n\n    FX_DWORD m_dwHeader_Length;\n    FX_BYTE  *m_pData;\n    JBig2_SegmentState m_State;\n    JBig2_ResultType m_nResultType;\n    union {\n        CJBig2_SymbolDict\t*sd;\n        CJBig2_PatternDict\t*pd;\n        CJBig2_Image\t\t*im;\n        CJBig2_HuffmanTable\t*ht;\n        FX_LPVOID\t\t\t vd;\n    } m_Result;\n};\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_SymbolDict.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"JBig2_SymbolDict.h\"\nCJBig2_SymbolDict::CJBig2_SymbolDict()\n{\n    SDNUMEXSYMS = 0;\n    SDEXSYMS = NULL;\n    m_bContextRetained = FALSE;\n    m_gbContext = m_grContext = NULL;\n}\n\nCJBig2_SymbolDict::~CJBig2_SymbolDict()\n{\n    if(SDEXSYMS) {\n        for(FX_DWORD i = 0; i < SDNUMEXSYMS; i++) {\n            if(SDEXSYMS[i]) {\n                delete SDEXSYMS[i];\n            }\n        }\n        m_pModule->JBig2_Free(SDEXSYMS);\n    }\n    if(m_bContextRetained) {\n        if(m_gbContext) {\n            m_pModule->JBig2_Free(m_gbContext);\n        }\n        if(m_grContext) {\n            m_pModule->JBig2_Free(m_grContext);\n        }\n    }\n}\n"
  },
  {
    "path": "core/src/fxcodec/jbig2/JBig2_SymbolDict.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JBIG2_SYMBOL_DICT_H_\n#define _JBIG2_SYMBOL_DICT_H_\n#include \"JBig2_Define.h\"\n#include \"JBig2_ArithDecoder.h\"\n#include \"JBig2_Image.h\"\nclass CJBig2_SymbolDict : public CJBig2_Object\n{\npublic:\n\n    CJBig2_SymbolDict();\n\n    ~CJBig2_SymbolDict();\npublic:\n    FX_DWORD SDNUMEXSYMS;\n    CJBig2_Image **SDEXSYMS;\n    FX_BOOL m_bContextRetained;\n    JBig2ArithCtx *m_gbContext,\n                  *m_grContext;\n};\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/include/fx_lcms2.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_LCMS2_H_\n#define _FX_LCMS2_H_\n#include \"../lcms2-2.6/include/lcms2.h\"\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/include/fx_lcms2_plugin.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_LCMS2_H_\n#define _FX_LCMS2_H_\n#include \"../lcms2-2.6/include/lcms2_plugin.h\"\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/include/lcms2.h",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2014 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n//\n// Version 2.6\n//\n\n#ifndef _lcms2_H\n\n// ********** Configuration toggles ****************************************\n\n// Uncomment this one if you are using big endian machines\n// #define CMS_USE_BIG_ENDIAN   1\n\n// Uncomment this one if your compiler/machine does NOT support the\n// \"long long\" type.\n// #define CMS_DONT_USE_INT64        1\n\n// Uncomment this if your compiler doesn't work with fast floor function\n// #define CMS_DONT_USE_FAST_FLOOR 1\n\n// Uncomment this line if you want lcms to use the black point tag in profile,\n// if commented, lcms will compute the black point by its own.\n// It is safer to leave it commented out\n// #define CMS_USE_PROFILE_BLACK_POINT_TAG    1\n\n// Uncomment this line if you are compiling as C++ and want a C++ API\n// #define CMS_USE_CPP_API\n\n// Uncomment this line if you need strict CGATS syntax. Makes CGATS files to\n// require \"KEYWORD\" on undefined identifiers, keep it comented out unless needed\n// #define CMS_STRICT_CGATS  1\n\n// Uncomment to get rid of the tables for \"half\" float support\n// #define CMS_NO_HALF_SUPPORT 1\n\n// Uncomment to get rid of pthreads/windows dependency\n// #define CMS_NO_PTHREADS  1\n\n// ********** End of configuration toggles ******************************\n\n// Needed for streams\n#include <stdio.h>\n\n// Needed for portability (C99 per 7.1.2)\n#include <limits.h>\n#include <time.h>\n#include <stddef.h>\n\n#ifndef CMS_USE_CPP_API\n#   ifdef __cplusplus\nextern \"C\" {\n#   endif\n#endif\n\n// Version/release\n#define LCMS_VERSION        2060\n\n// I will give the chance of redefining basic types for compilers that are not fully C99 compliant\n#ifndef CMS_BASIC_TYPES_ALREADY_DEFINED\n\n// Base types\ntypedef unsigned char        cmsUInt8Number;   // That is guaranteed by the C99 spec\ntypedef signed char          cmsInt8Number;    // That is guaranteed by the C99 spec\n\n#if CHAR_BIT != 8\n#  error \"Unable to find 8 bit type, unsupported compiler\"\n#endif\n\n// IEEE float storage numbers\ntypedef float                cmsFloat32Number;\ntypedef double               cmsFloat64Number;\n\n// 16-bit base types\n#if (USHRT_MAX == 65535U)\n typedef unsigned short      cmsUInt16Number;\n#elif (UINT_MAX == 65535U)\n typedef unsigned int        cmsUInt16Number;\n#else\n#  error \"Unable to find 16 bits unsigned type, unsupported compiler\"\n#endif\n\n#if (SHRT_MAX == 32767)\n  typedef  short             cmsInt16Number;\n#elif (INT_MAX == 32767)\n  typedef  int               cmsInt16Number;\n#else\n#  error \"Unable to find 16 bits signed type, unsupported compiler\"\n#endif\n\n// 32-bit base type\n#if (UINT_MAX == 4294967295U)\n typedef unsigned int        cmsUInt32Number;\n#elif (ULONG_MAX == 4294967295U)\n typedef unsigned long       cmsUInt32Number;\n#else\n#  error \"Unable to find 32 bit unsigned type, unsupported compiler\"\n#endif\n\n#if (INT_MAX == +2147483647)\n typedef  int                cmsInt32Number;\n#elif (LONG_MAX == +2147483647)\n typedef  long               cmsInt32Number;\n#else\n#  error \"Unable to find 32 bit signed type, unsupported compiler\"\n#endif\n\n// 64-bit base types\n#ifndef CMS_DONT_USE_INT64\n#  if (ULONG_MAX  == 18446744073709551615U)\n    typedef unsigned long   cmsUInt64Number;\n#  elif (ULLONG_MAX == 18446744073709551615U)\n      typedef unsigned long long   cmsUInt64Number;\n#  else\n#     define CMS_DONT_USE_INT64 1\n#  endif\n#  if (LONG_MAX == +9223372036854775807)\n      typedef  long          cmsInt64Number;\n#  elif (LLONG_MAX == +9223372036854775807)\n      typedef  long long     cmsInt64Number;\n#  else\n#     define CMS_DONT_USE_INT64 1\n#  endif\n#endif\n#endif\n\n// In the case 64 bit numbers are not supported by the compiler\n#ifdef CMS_DONT_USE_INT64\n    typedef cmsUInt32Number      cmsUInt64Number[2];\n    typedef cmsInt32Number       cmsInt64Number[2];\n#endif\n\n// Derivative types\ntypedef cmsUInt32Number      cmsSignature;\ntypedef cmsUInt16Number      cmsU8Fixed8Number;\ntypedef cmsInt32Number       cmsS15Fixed16Number;\ntypedef cmsUInt32Number      cmsU16Fixed16Number;\n\n// Boolean type, which will be using the native integer\ntypedef int                  cmsBool;\n\n// Try to detect windows\n#if defined (_WIN32) || defined(_WIN64) || defined(WIN32) || defined(_WIN32_)\n#  define CMS_IS_WINDOWS_ 1\n#endif\n\n#ifdef _MSC_VER\n#  define CMS_IS_WINDOWS_ 1\n#endif\n\n#ifdef __BORLANDC__\n#  define CMS_IS_WINDOWS_ 1\n#endif\n\n// Try to detect big endian platforms. This list can be endless, so only some checks are performed over here.\n// you can pass this toggle to the compiler by using -DCMS_USE_BIG_ENDIAN or something similar\n\n#if defined(__sgi__) || defined(__sgi) || defined(sparc)\n#   define CMS_USE_BIG_ENDIAN      1\n#endif\n\n#if defined(__s390__) || defined(__s390x__)\n#   define CMS_USE_BIG_ENDIAN   1\n#endif\n\n#  ifdef TARGET_CPU_PPC\n#    if TARGET_CPU_PPC\n#      define CMS_USE_BIG_ENDIAN   1\n#    endif\n#  endif\n\n#if defined(__powerpc__) || defined(__ppc__) || defined(TARGET_CPU_PPC)\n#   define CMS_USE_BIG_ENDIAN   1\n#   if defined (__GNUC__) && defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN)\n#       if __BYTE_ORDER  == __LITTLE_ENDIAN\n//               // Don't use big endian for PowerPC little endian mode\n#                undef CMS_USE_BIG_ENDIAN\n#       endif\n#   endif\n#endif\n\n// WORDS_BIGENDIAN takes precedence\n#if defined(_HOST_BIG_ENDIAN) || defined(__BIG_ENDIAN__) || defined(WORDS_BIGENDIAN)\n#   define CMS_USE_BIG_ENDIAN      1\n#endif\n\n#ifdef macintosh\n# ifdef __BIG_ENDIAN__\n#   define CMS_USE_BIG_ENDIAN      1\n# endif\n# ifdef __LITTLE_ENDIAN__\n#   undef CMS_USE_BIG_ENDIAN\n# endif\n#endif\n\n// Calling convention -- this is hardly platform and compiler dependent\n#ifdef CMS_IS_WINDOWS_\n#  if defined(CMS_DLL) || defined(CMS_DLL_BUILD)\n#     ifdef __BORLANDC__\n#        define CMSEXPORT       __stdcall _export\n#        define CMSAPI\n#     else\n#        define CMSEXPORT      _stdcall\n#        ifdef CMS_DLL_BUILD\n#            define CMSAPI    __declspec(dllexport)\n#        else\n#           define CMSAPI     __declspec(dllimport)\n#       endif\n#     endif\n#  else\n#       define CMSEXPORT\n#       define CMSAPI\n#  endif\n#else\n# define CMSEXPORT\n# define CMSAPI\n#endif\n\n#ifdef HasTHREADS\n# if HasTHREADS == 1\n#    undef CMS_NO_PTHREADS\n# else\n#    define CMS_NO_PTHREADS 1\n# endif\n#endif\n\n// Some common definitions\n#define cmsMAX_PATH     256\n\n#ifndef FALSE\n#       define FALSE 0\n#endif\n#ifndef TRUE\n#       define TRUE  1\n#endif\n\n// D50 XYZ normalized to Y=1.0\n#define cmsD50X             0.9642\n#define cmsD50Y             1.0\n#define cmsD50Z             0.8249\n\n// V4 perceptual black\n#define cmsPERCEPTUAL_BLACK_X  0.00336\n#define cmsPERCEPTUAL_BLACK_Y  0.0034731\n#define cmsPERCEPTUAL_BLACK_Z  0.00287\n\n// Definitions in ICC spec\n#define cmsMagicNumber      0x61637370     // 'acsp'\n#define lcmsSignature       0x6c636d73     // 'lcms'\n\n\n// Base ICC type definitions\ntypedef enum {\n    cmsSigChromaticityType                  = 0x6368726D,  // 'chrm'\n    cmsSigColorantOrderType                 = 0x636C726F,  // 'clro'\n    cmsSigColorantTableType                 = 0x636C7274,  // 'clrt'\n    cmsSigCrdInfoType                       = 0x63726469,  // 'crdi'\n    cmsSigCurveType                         = 0x63757276,  // 'curv'\n    cmsSigDataType                          = 0x64617461,  // 'data'\n    cmsSigDictType                          = 0x64696374,  // 'dict'\n    cmsSigDateTimeType                      = 0x6474696D,  // 'dtim'\n    cmsSigDeviceSettingsType                = 0x64657673,  // 'devs'\n    cmsSigLut16Type                         = 0x6d667432,  // 'mft2'\n    cmsSigLut8Type                          = 0x6d667431,  // 'mft1'\n    cmsSigLutAtoBType                       = 0x6d414220,  // 'mAB '\n    cmsSigLutBtoAType                       = 0x6d424120,  // 'mBA '\n    cmsSigMeasurementType                   = 0x6D656173,  // 'meas'\n    cmsSigMultiLocalizedUnicodeType         = 0x6D6C7563,  // 'mluc'\n    cmsSigMultiProcessElementType           = 0x6D706574,  // 'mpet'\n    cmsSigNamedColorType                    = 0x6E636f6C,  // 'ncol' -- DEPRECATED!\n    cmsSigNamedColor2Type                   = 0x6E636C32,  // 'ncl2'\n    cmsSigParametricCurveType               = 0x70617261,  // 'para'\n    cmsSigProfileSequenceDescType           = 0x70736571,  // 'pseq'\n    cmsSigProfileSequenceIdType             = 0x70736964,  // 'psid'\n    cmsSigResponseCurveSet16Type            = 0x72637332,  // 'rcs2'\n    cmsSigS15Fixed16ArrayType               = 0x73663332,  // 'sf32'\n    cmsSigScreeningType                     = 0x7363726E,  // 'scrn'\n    cmsSigSignatureType                     = 0x73696720,  // 'sig '\n    cmsSigTextType                          = 0x74657874,  // 'text'\n    cmsSigTextDescriptionType               = 0x64657363,  // 'desc'\n    cmsSigU16Fixed16ArrayType               = 0x75663332,  // 'uf32'\n    cmsSigUcrBgType                         = 0x62666420,  // 'bfd '\n    cmsSigUInt16ArrayType                   = 0x75693136,  // 'ui16'\n    cmsSigUInt32ArrayType                   = 0x75693332,  // 'ui32'\n    cmsSigUInt64ArrayType                   = 0x75693634,  // 'ui64'\n    cmsSigUInt8ArrayType                    = 0x75693038,  // 'ui08'\n    cmsSigVcgtType                          = 0x76636774,  // 'vcgt'\n    cmsSigViewingConditionsType             = 0x76696577,  // 'view'\n    cmsSigXYZType                           = 0x58595A20   // 'XYZ '\n\n\n} cmsTagTypeSignature;\n\n// Base ICC tag definitions\ntypedef enum {\n    cmsSigAToB0Tag                          = 0x41324230,  // 'A2B0'\n    cmsSigAToB1Tag                          = 0x41324231,  // 'A2B1'\n    cmsSigAToB2Tag                          = 0x41324232,  // 'A2B2'\n    cmsSigBlueColorantTag                   = 0x6258595A,  // 'bXYZ'\n    cmsSigBlueMatrixColumnTag               = 0x6258595A,  // 'bXYZ'\n    cmsSigBlueTRCTag                        = 0x62545243,  // 'bTRC'\n    cmsSigBToA0Tag                          = 0x42324130,  // 'B2A0'\n    cmsSigBToA1Tag                          = 0x42324131,  // 'B2A1'\n    cmsSigBToA2Tag                          = 0x42324132,  // 'B2A2'\n    cmsSigCalibrationDateTimeTag            = 0x63616C74,  // 'calt'\n    cmsSigCharTargetTag                     = 0x74617267,  // 'targ'\n    cmsSigChromaticAdaptationTag            = 0x63686164,  // 'chad'\n    cmsSigChromaticityTag                   = 0x6368726D,  // 'chrm'\n    cmsSigColorantOrderTag                  = 0x636C726F,  // 'clro'\n    cmsSigColorantTableTag                  = 0x636C7274,  // 'clrt'\n    cmsSigColorantTableOutTag               = 0x636C6F74,  // 'clot'\n    cmsSigColorimetricIntentImageStateTag   = 0x63696973,  // 'ciis'\n    cmsSigCopyrightTag                      = 0x63707274,  // 'cprt'\n    cmsSigCrdInfoTag                        = 0x63726469,  // 'crdi'\n    cmsSigDataTag                           = 0x64617461,  // 'data'\n    cmsSigDateTimeTag                       = 0x6474696D,  // 'dtim'\n    cmsSigDeviceMfgDescTag                  = 0x646D6E64,  // 'dmnd'\n    cmsSigDeviceModelDescTag                = 0x646D6464,  // 'dmdd'\n    cmsSigDeviceSettingsTag                 = 0x64657673,  // 'devs'\n    cmsSigDToB0Tag                          = 0x44324230,  // 'D2B0'\n    cmsSigDToB1Tag                          = 0x44324231,  // 'D2B1'\n    cmsSigDToB2Tag                          = 0x44324232,  // 'D2B2'\n    cmsSigDToB3Tag                          = 0x44324233,  // 'D2B3'\n    cmsSigBToD0Tag                          = 0x42324430,  // 'B2D0'\n    cmsSigBToD1Tag                          = 0x42324431,  // 'B2D1'\n    cmsSigBToD2Tag                          = 0x42324432,  // 'B2D2'\n    cmsSigBToD3Tag                          = 0x42324433,  // 'B2D3'\n    cmsSigGamutTag                          = 0x67616D74,  // 'gamt'\n    cmsSigGrayTRCTag                        = 0x6b545243,  // 'kTRC'\n    cmsSigGreenColorantTag                  = 0x6758595A,  // 'gXYZ'\n    cmsSigGreenMatrixColumnTag              = 0x6758595A,  // 'gXYZ'\n    cmsSigGreenTRCTag                       = 0x67545243,  // 'gTRC'\n    cmsSigLuminanceTag                      = 0x6C756d69,  // 'lumi'\n    cmsSigMeasurementTag                    = 0x6D656173,  // 'meas'\n    cmsSigMediaBlackPointTag                = 0x626B7074,  // 'bkpt'\n    cmsSigMediaWhitePointTag                = 0x77747074,  // 'wtpt'\n    cmsSigNamedColorTag                     = 0x6E636f6C,  // 'ncol' // Deprecated by the ICC\n    cmsSigNamedColor2Tag                    = 0x6E636C32,  // 'ncl2'\n    cmsSigOutputResponseTag                 = 0x72657370,  // 'resp'\n    cmsSigPerceptualRenderingIntentGamutTag = 0x72696730,  // 'rig0'\n    cmsSigPreview0Tag                       = 0x70726530,  // 'pre0'\n    cmsSigPreview1Tag                       = 0x70726531,  // 'pre1'\n    cmsSigPreview2Tag                       = 0x70726532,  // 'pre2'\n    cmsSigProfileDescriptionTag             = 0x64657363,  // 'desc'\n    cmsSigProfileDescriptionMLTag           = 0x6473636d,  // 'dscm'\n    cmsSigProfileSequenceDescTag            = 0x70736571,  // 'pseq'\n    cmsSigProfileSequenceIdTag              = 0x70736964,  // 'psid'\n    cmsSigPs2CRD0Tag                        = 0x70736430,  // 'psd0'\n    cmsSigPs2CRD1Tag                        = 0x70736431,  // 'psd1'\n    cmsSigPs2CRD2Tag                        = 0x70736432,  // 'psd2'\n    cmsSigPs2CRD3Tag                        = 0x70736433,  // 'psd3'\n    cmsSigPs2CSATag                         = 0x70733273,  // 'ps2s'\n    cmsSigPs2RenderingIntentTag             = 0x70733269,  // 'ps2i'\n    cmsSigRedColorantTag                    = 0x7258595A,  // 'rXYZ'\n    cmsSigRedMatrixColumnTag                = 0x7258595A,  // 'rXYZ'\n    cmsSigRedTRCTag                         = 0x72545243,  // 'rTRC'\n    cmsSigSaturationRenderingIntentGamutTag = 0x72696732,  // 'rig2'\n    cmsSigScreeningDescTag                  = 0x73637264,  // 'scrd'\n    cmsSigScreeningTag                      = 0x7363726E,  // 'scrn'\n    cmsSigTechnologyTag                     = 0x74656368,  // 'tech'\n    cmsSigUcrBgTag                          = 0x62666420,  // 'bfd '\n    cmsSigViewingCondDescTag                = 0x76756564,  // 'vued'\n    cmsSigViewingConditionsTag              = 0x76696577,  // 'view'\n    cmsSigVcgtTag                           = 0x76636774,  // 'vcgt'\n    cmsSigMetaTag                           = 0x6D657461   // 'meta'\n\n} cmsTagSignature;\n\n\n// ICC Technology tag\ntypedef enum {\n    cmsSigDigitalCamera                     = 0x6463616D,  // 'dcam'\n    cmsSigFilmScanner                       = 0x6673636E,  // 'fscn'\n    cmsSigReflectiveScanner                 = 0x7273636E,  // 'rscn'\n    cmsSigInkJetPrinter                     = 0x696A6574,  // 'ijet'\n    cmsSigThermalWaxPrinter                 = 0x74776178,  // 'twax'\n    cmsSigElectrophotographicPrinter        = 0x6570686F,  // 'epho'\n    cmsSigElectrostaticPrinter              = 0x65737461,  // 'esta'\n    cmsSigDyeSublimationPrinter             = 0x64737562,  // 'dsub'\n    cmsSigPhotographicPaperPrinter          = 0x7270686F,  // 'rpho'\n    cmsSigFilmWriter                        = 0x6670726E,  // 'fprn'\n    cmsSigVideoMonitor                      = 0x7669646D,  // 'vidm'\n    cmsSigVideoCamera                       = 0x76696463,  // 'vidc'\n    cmsSigProjectionTelevision              = 0x706A7476,  // 'pjtv'\n    cmsSigCRTDisplay                        = 0x43525420,  // 'CRT '\n    cmsSigPMDisplay                         = 0x504D4420,  // 'PMD '\n    cmsSigAMDisplay                         = 0x414D4420,  // 'AMD '\n    cmsSigPhotoCD                           = 0x4B504344,  // 'KPCD'\n    cmsSigPhotoImageSetter                  = 0x696D6773,  // 'imgs'\n    cmsSigGravure                           = 0x67726176,  // 'grav'\n    cmsSigOffsetLithography                 = 0x6F666673,  // 'offs'\n    cmsSigSilkscreen                        = 0x73696C6B,  // 'silk'\n    cmsSigFlexography                       = 0x666C6578,  // 'flex'\n    cmsSigMotionPictureFilmScanner          = 0x6D706673,  // 'mpfs'\n    cmsSigMotionPictureFilmRecorder         = 0x6D706672,  // 'mpfr'\n    cmsSigDigitalMotionPictureCamera        = 0x646D7063,  // 'dmpc'\n    cmsSigDigitalCinemaProjector            = 0x64636A70   // 'dcpj'\n\n} cmsTechnologySignature;\n\n\n// ICC Color spaces\ntypedef enum {\n    cmsSigXYZData                           = 0x58595A20,  // 'XYZ '\n    cmsSigLabData                           = 0x4C616220,  // 'Lab '\n    cmsSigLuvData                           = 0x4C757620,  // 'Luv '\n    cmsSigYCbCrData                         = 0x59436272,  // 'YCbr'\n    cmsSigYxyData                           = 0x59787920,  // 'Yxy '\n    cmsSigRgbData                           = 0x52474220,  // 'RGB '\n    cmsSigGrayData                          = 0x47524159,  // 'GRAY'\n    cmsSigHsvData                           = 0x48535620,  // 'HSV '\n    cmsSigHlsData                           = 0x484C5320,  // 'HLS '\n    cmsSigCmykData                          = 0x434D594B,  // 'CMYK'\n    cmsSigCmyData                           = 0x434D5920,  // 'CMY '\n    cmsSigMCH1Data                          = 0x4D434831,  // 'MCH1'\n    cmsSigMCH2Data                          = 0x4D434832,  // 'MCH2'\n    cmsSigMCH3Data                          = 0x4D434833,  // 'MCH3'\n    cmsSigMCH4Data                          = 0x4D434834,  // 'MCH4'\n    cmsSigMCH5Data                          = 0x4D434835,  // 'MCH5'\n    cmsSigMCH6Data                          = 0x4D434836,  // 'MCH6'\n    cmsSigMCH7Data                          = 0x4D434837,  // 'MCH7'\n    cmsSigMCH8Data                          = 0x4D434838,  // 'MCH8'\n    cmsSigMCH9Data                          = 0x4D434839,  // 'MCH9'\n    cmsSigMCHAData                          = 0x4D434841,  // 'MCHA'\n    cmsSigMCHBData                          = 0x4D434842,  // 'MCHB'\n    cmsSigMCHCData                          = 0x4D434843,  // 'MCHC'\n    cmsSigMCHDData                          = 0x4D434844,  // 'MCHD'\n    cmsSigMCHEData                          = 0x4D434845,  // 'MCHE'\n    cmsSigMCHFData                          = 0x4D434846,  // 'MCHF'\n    cmsSigNamedData                         = 0x6e6d636c,  // 'nmcl'\n    cmsSig1colorData                        = 0x31434C52,  // '1CLR'\n    cmsSig2colorData                        = 0x32434C52,  // '2CLR'\n    cmsSig3colorData                        = 0x33434C52,  // '3CLR'\n    cmsSig4colorData                        = 0x34434C52,  // '4CLR'\n    cmsSig5colorData                        = 0x35434C52,  // '5CLR'\n    cmsSig6colorData                        = 0x36434C52,  // '6CLR'\n    cmsSig7colorData                        = 0x37434C52,  // '7CLR'\n    cmsSig8colorData                        = 0x38434C52,  // '8CLR'\n    cmsSig9colorData                        = 0x39434C52,  // '9CLR'\n    cmsSig10colorData                       = 0x41434C52,  // 'ACLR'\n    cmsSig11colorData                       = 0x42434C52,  // 'BCLR'\n    cmsSig12colorData                       = 0x43434C52,  // 'CCLR'\n    cmsSig13colorData                       = 0x44434C52,  // 'DCLR'\n    cmsSig14colorData                       = 0x45434C52,  // 'ECLR'\n    cmsSig15colorData                       = 0x46434C52,  // 'FCLR'\n    cmsSigLuvKData                          = 0x4C75764B   // 'LuvK'\n\n} cmsColorSpaceSignature;\n\n// ICC Profile Class\ntypedef enum {\n    cmsSigInputClass                        = 0x73636E72,  // 'scnr'\n    cmsSigDisplayClass                      = 0x6D6E7472,  // 'mntr'\n    cmsSigOutputClass                       = 0x70727472,  // 'prtr'\n    cmsSigLinkClass                         = 0x6C696E6B,  // 'link'\n    cmsSigAbstractClass                     = 0x61627374,  // 'abst'\n    cmsSigColorSpaceClass                   = 0x73706163,  // 'spac'\n    cmsSigNamedColorClass                   = 0x6e6d636c   // 'nmcl'\n\n} cmsProfileClassSignature;\n\n// ICC Platforms\ntypedef enum {\n    cmsSigMacintosh                         = 0x4150504C,  // 'APPL'\n    cmsSigMicrosoft                         = 0x4D534654,  // 'MSFT'\n    cmsSigSolaris                           = 0x53554E57,  // 'SUNW'\n    cmsSigSGI                               = 0x53474920,  // 'SGI '\n    cmsSigTaligent                          = 0x54474E54,  // 'TGNT'\n    cmsSigUnices                            = 0x2A6E6978   // '*nix'   // From argyll -- Not official\n\n} cmsPlatformSignature;\n\n// Reference gamut\n#define  cmsSigPerceptualReferenceMediumGamut         0x70726d67  //'prmg'\n\n// For cmsSigColorimetricIntentImageStateTag\n#define  cmsSigSceneColorimetryEstimates              0x73636F65  //'scoe'\n#define  cmsSigSceneAppearanceEstimates               0x73617065  //'sape'\n#define  cmsSigFocalPlaneColorimetryEstimates         0x66706365  //'fpce'\n#define  cmsSigReflectionHardcopyOriginalColorimetry  0x72686F63  //'rhoc'\n#define  cmsSigReflectionPrintOutputColorimetry       0x72706F63  //'rpoc'\n\n// Multi process elements types\ntypedef enum {\n    cmsSigCurveSetElemType              = 0x63767374,  //'cvst'\n    cmsSigMatrixElemType                = 0x6D617466,  //'matf'\n    cmsSigCLutElemType                  = 0x636C7574,  //'clut'\n\n    cmsSigBAcsElemType                  = 0x62414353,  // 'bACS'\n    cmsSigEAcsElemType                  = 0x65414353,  // 'eACS'\n\n    // Custom from here, not in the ICC Spec\n    cmsSigXYZ2LabElemType               = 0x6C327820,  // 'l2x '\n    cmsSigLab2XYZElemType               = 0x78326C20,  // 'x2l '\n    cmsSigNamedColorElemType            = 0x6E636C20,  // 'ncl '\n    cmsSigLabV2toV4                     = 0x32203420,  // '2 4 '\n    cmsSigLabV4toV2                     = 0x34203220,  // '4 2 '\n\n    // Identities\n    cmsSigIdentityElemType              = 0x69646E20,  // 'idn '\n\n    // Float to floatPCS\n    cmsSigLab2FloatPCS                  = 0x64326C20,  // 'd2l '\n    cmsSigFloatPCS2Lab                  = 0x6C326420,  // 'l2d '\n    cmsSigXYZ2FloatPCS                  = 0x64327820,  // 'd2x '\n    cmsSigFloatPCS2XYZ                  = 0x78326420   // 'x2d '\n\n} cmsStageSignature;\n\n// Types of CurveElements\ntypedef enum {\n\n    cmsSigFormulaCurveSeg               = 0x70617266, // 'parf'\n    cmsSigSampledCurveSeg               = 0x73616D66, // 'samf'\n    cmsSigSegmentedCurve                = 0x63757266  // 'curf'\n\n} cmsCurveSegSignature;\n\n// Used in ResponseCurveType\n#define  cmsSigStatusA                    0x53746141 //'StaA'\n#define  cmsSigStatusE                    0x53746145 //'StaE'\n#define  cmsSigStatusI                    0x53746149 //'StaI'\n#define  cmsSigStatusT                    0x53746154 //'StaT'\n#define  cmsSigStatusM                    0x5374614D //'StaM'\n#define  cmsSigDN                         0x444E2020 //'DN  '\n#define  cmsSigDNP                        0x444E2050 //'DN P'\n#define  cmsSigDNN                        0x444E4E20 //'DNN '\n#define  cmsSigDNNP                       0x444E4E50 //'DNNP'\n\n// Device attributes, currently defined values correspond to the low 4 bytes\n// of the 8 byte attribute quantity\n#define cmsReflective     0\n#define cmsTransparency   1\n#define cmsGlossy         0\n#define cmsMatte          2\n\n// Common structures in ICC tags\ntypedef struct {\n    cmsUInt32Number len;\n    cmsUInt32Number flag;\n    cmsUInt8Number  data[1];\n\n} cmsICCData;\n\n// ICC date time\ntypedef struct {\n    cmsUInt16Number      year;\n    cmsUInt16Number      month;\n    cmsUInt16Number      day;\n    cmsUInt16Number      hours;\n    cmsUInt16Number      minutes;\n    cmsUInt16Number      seconds;\n\n} cmsDateTimeNumber;\n\n// ICC XYZ\ntypedef struct {\n    cmsS15Fixed16Number  X;\n    cmsS15Fixed16Number  Y;\n    cmsS15Fixed16Number  Z;\n\n} cmsEncodedXYZNumber;\n\n\n// Profile ID as computed by MD5 algorithm\ntypedef union {\n    cmsUInt8Number       ID8[16];\n    cmsUInt16Number      ID16[8];\n    cmsUInt32Number      ID32[4];\n\n} cmsProfileID;\n\n\n// ----------------------------------------------------------------------------------------------\n// ICC profile internal base types. Strictly, shouldn't be declared in this header, but maybe\n// somebody want to use this info for accessing profile header directly, so here it is.\n\n// Profile header -- it is 32-bit aligned, so no issues are expected on alignment\ntypedef struct {\n    cmsUInt32Number              size;           // Profile size in bytes\n    cmsSignature                 cmmId;          // CMM for this profile\n    cmsUInt32Number              version;        // Format version number\n    cmsProfileClassSignature     deviceClass;    // Type of profile\n    cmsColorSpaceSignature       colorSpace;     // Color space of data\n    cmsColorSpaceSignature       pcs;            // PCS, XYZ or Lab only\n    cmsDateTimeNumber            date;           // Date profile was created\n    cmsSignature                 magic;          // Magic Number to identify an ICC profile\n    cmsPlatformSignature         platform;       // Primary Platform\n    cmsUInt32Number              flags;          // Various bit settings\n    cmsSignature                 manufacturer;   // Device manufacturer\n    cmsUInt32Number              model;          // Device model number\n    cmsUInt64Number              attributes;     // Device attributes\n    cmsUInt32Number              renderingIntent;// Rendering intent\n    cmsEncodedXYZNumber          illuminant;     // Profile illuminant\n    cmsSignature                 creator;        // Profile creator\n    cmsProfileID                 profileID;      // Profile ID using MD5\n    cmsInt8Number                reserved[28];   // Reserved for future use\n\n} cmsICCHeader;\n\n// ICC base tag\ntypedef struct {\n    cmsTagTypeSignature  sig;\n    cmsInt8Number        reserved[4];\n\n} cmsTagBase;\n\n// A tag entry in directory\ntypedef struct {\n    cmsTagSignature      sig;            // The tag signature\n    cmsUInt32Number      offset;         // Start of tag\n    cmsUInt32Number      size;           // Size in bytes\n\n} cmsTagEntry;\n\n// ----------------------------------------------------------------------------------------------\n\n// Little CMS specific typedefs\n\ntypedef void* cmsHANDLE ;              // Generic handle\ntypedef void* cmsHPROFILE;             // Opaque typedefs to hide internals\ntypedef void* cmsHTRANSFORM;\n\n#define cmsMAXCHANNELS  16                // Maximum number of channels in ICC profiles\n\n// Format of pixel is defined by one cmsUInt32Number, using bit fields as follows\n//\n//                               2                1          0\n//                          3 2 10987 6 5 4 3 2 1 098 7654 321\n//                          A O TTTTT U Y F P X S EEE CCCC BBB\n//\n//            A: Floating point -- With this flag we can differentiate 16 bits as float and as int\n//            O: Optimized -- previous optimization already returns the final 8-bit value\n//            T: Pixeltype\n//            F: Flavor  0=MinIsBlack(Chocolate) 1=MinIsWhite(Vanilla)\n//            P: Planar? 0=Chunky, 1=Planar\n//            X: swap 16 bps endianess?\n//            S: Do swap? ie, BGR, KYMC\n//            E: Extra samples\n//            C: Channels (Samples per pixel)\n//            B: bytes per sample\n//            Y: Swap first - changes ABGR to BGRA and KCMY to CMYK\n\n#define FLOAT_SH(a)            ((a) << 22)\n#define OPTIMIZED_SH(s)        ((s) << 21)\n#define COLORSPACE_SH(s)       ((s) << 16)\n#define SWAPFIRST_SH(s)        ((s) << 14)\n#define FLAVOR_SH(s)           ((s) << 13)\n#define PLANAR_SH(p)           ((p) << 12)\n#define ENDIAN16_SH(e)         ((e) << 11)\n#define DOSWAP_SH(e)           ((e) << 10)\n#define EXTRA_SH(e)            ((e) << 7)\n#define CHANNELS_SH(c)         ((c) << 3)\n#define BYTES_SH(b)            (b)\n\n// These macros unpack format specifiers into integers\n#define T_FLOAT(a)            (((a)>>22)&1)\n#define T_OPTIMIZED(o)        (((o)>>21)&1)\n#define T_COLORSPACE(s)       (((s)>>16)&31)\n#define T_SWAPFIRST(s)        (((s)>>14)&1)\n#define T_FLAVOR(s)           (((s)>>13)&1)\n#define T_PLANAR(p)           (((p)>>12)&1)\n#define T_ENDIAN16(e)         (((e)>>11)&1)\n#define T_DOSWAP(e)           (((e)>>10)&1)\n#define T_EXTRA(e)            (((e)>>7)&7)\n#define T_CHANNELS(c)         (((c)>>3)&15)\n#define T_BYTES(b)            ((b)&7)\n\n\n// Pixel types\n#define PT_ANY       0    // Don't check colorspace\n                          // 1 & 2 are reserved\n#define PT_GRAY      3\n#define PT_RGB       4\n#define PT_CMY       5\n#define PT_CMYK      6\n#define PT_YCbCr     7\n#define PT_YUV       8      // Lu'v'\n#define PT_XYZ       9\n#define PT_Lab       10\n#define PT_YUVK      11     // Lu'v'K\n#define PT_HSV       12\n#define PT_HLS       13\n#define PT_Yxy       14\n\n#define PT_MCH1      15\n#define PT_MCH2      16\n#define PT_MCH3      17\n#define PT_MCH4      18\n#define PT_MCH5      19\n#define PT_MCH6      20\n#define PT_MCH7      21\n#define PT_MCH8      22\n#define PT_MCH9      23\n#define PT_MCH10     24\n#define PT_MCH11     25\n#define PT_MCH12     26\n#define PT_MCH13     27\n#define PT_MCH14     28\n#define PT_MCH15     29\n\n#define PT_LabV2     30     // Identical to PT_Lab, but using the V2 old encoding\n\n// Some (not all!) representations\n\n#ifndef TYPE_RGB_8      // TYPE_RGB_8 is a very common identifier, so don't include ours\n                        // if user has it already defined.\n\n#define TYPE_GRAY_8            (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(1))\n#define TYPE_GRAY_8_REV        (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1))\n#define TYPE_GRAY_16           (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2))\n#define TYPE_GRAY_16_REV       (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1))\n#define TYPE_GRAY_16_SE        (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1))\n#define TYPE_GRAYA_8           (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1))\n#define TYPE_GRAYA_16          (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2))\n#define TYPE_GRAYA_16_SE       (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1))\n#define TYPE_GRAYA_8_PLANAR    (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1)|PLANAR_SH(1))\n#define TYPE_GRAYA_16_PLANAR   (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|PLANAR_SH(1))\n\n#define TYPE_RGB_8             (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1))\n#define TYPE_RGB_8_PLANAR      (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))\n#define TYPE_BGR_8             (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1))\n#define TYPE_BGR_8_PLANAR      (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|PLANAR_SH(1))\n#define TYPE_RGB_16            (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2))\n#define TYPE_RGB_16_PLANAR     (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))\n#define TYPE_RGB_16_SE         (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))\n#define TYPE_BGR_16            (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))\n#define TYPE_BGR_16_PLANAR     (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1))\n#define TYPE_BGR_16_SE         (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))\n\n#define TYPE_RGBA_8            (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1))\n#define TYPE_RGBA_8_PLANAR     (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))\n#define TYPE_RGBA_16           (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2))\n#define TYPE_RGBA_16_PLANAR    (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))\n#define TYPE_RGBA_16_SE        (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))\n\n#define TYPE_ARGB_8            (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|SWAPFIRST_SH(1))\n#define TYPE_ARGB_8_PLANAR     (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|SWAPFIRST_SH(1)|PLANAR_SH(1))\n#define TYPE_ARGB_16           (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1))\n\n#define TYPE_ABGR_8            (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1))\n#define TYPE_ABGR_8_PLANAR     (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|PLANAR_SH(1))\n#define TYPE_ABGR_16           (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))\n#define TYPE_ABGR_16_PLANAR    (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1))\n#define TYPE_ABGR_16_SE        (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))\n\n#define TYPE_BGRA_8            (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1))\n#define TYPE_BGRA_8_PLANAR     (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)|PLANAR_SH(1))\n#define TYPE_BGRA_16           (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1))\n#define TYPE_BGRA_16_SE        (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1))\n\n#define TYPE_CMY_8             (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(1))\n#define TYPE_CMY_8_PLANAR      (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))\n#define TYPE_CMY_16            (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2))\n#define TYPE_CMY_16_PLANAR     (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))\n#define TYPE_CMY_16_SE         (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))\n\n#define TYPE_CMYK_8            (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1))\n#define TYPE_CMYKA_8           (COLORSPACE_SH(PT_CMYK)|EXTRA_SH(1)|CHANNELS_SH(4)|BYTES_SH(1))\n#define TYPE_CMYK_8_REV        (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1))\n#define TYPE_YUVK_8            TYPE_CMYK_8_REV\n#define TYPE_CMYK_8_PLANAR     (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|PLANAR_SH(1))\n#define TYPE_CMYK_16           (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2))\n#define TYPE_CMYK_16_REV       (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1))\n#define TYPE_YUVK_16           TYPE_CMYK_16_REV\n#define TYPE_CMYK_16_PLANAR    (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|PLANAR_SH(1))\n#define TYPE_CMYK_16_SE        (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1))\n\n#define TYPE_KYMC_8            (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1))\n#define TYPE_KYMC_16           (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1))\n#define TYPE_KYMC_16_SE        (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))\n\n#define TYPE_KCMY_8            (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1))\n#define TYPE_KCMY_8_REV        (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1)|SWAPFIRST_SH(1))\n#define TYPE_KCMY_16           (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|SWAPFIRST_SH(1))\n#define TYPE_KCMY_16_REV       (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1)|SWAPFIRST_SH(1))\n#define TYPE_KCMY_16_SE        (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1)|SWAPFIRST_SH(1))\n\n#define TYPE_CMYK5_8           (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(1))\n#define TYPE_CMYK5_16          (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2))\n#define TYPE_CMYK5_16_SE       (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)|ENDIAN16_SH(1))\n#define TYPE_KYMC5_8           (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(1)|DOSWAP_SH(1))\n#define TYPE_KYMC5_16          (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)|DOSWAP_SH(1))\n#define TYPE_KYMC5_16_SE       (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))\n#define TYPE_CMYK6_8           (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(1))\n#define TYPE_CMYK6_8_PLANAR    (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(1)|PLANAR_SH(1))\n#define TYPE_CMYK6_16          (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(2))\n#define TYPE_CMYK6_16_PLANAR   (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(2)|PLANAR_SH(1))\n#define TYPE_CMYK6_16_SE       (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(2)|ENDIAN16_SH(1))\n#define TYPE_CMYK7_8           (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(1))\n#define TYPE_CMYK7_16          (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2))\n#define TYPE_CMYK7_16_SE       (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)|ENDIAN16_SH(1))\n#define TYPE_KYMC7_8           (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(1)|DOSWAP_SH(1))\n#define TYPE_KYMC7_16          (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)|DOSWAP_SH(1))\n#define TYPE_KYMC7_16_SE       (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))\n#define TYPE_CMYK8_8           (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(1))\n#define TYPE_CMYK8_16          (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2))\n#define TYPE_CMYK8_16_SE       (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)|ENDIAN16_SH(1))\n#define TYPE_KYMC8_8           (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(1)|DOSWAP_SH(1))\n#define TYPE_KYMC8_16          (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)|DOSWAP_SH(1))\n#define TYPE_KYMC8_16_SE       (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))\n#define TYPE_CMYK9_8           (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(1))\n#define TYPE_CMYK9_16          (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2))\n#define TYPE_CMYK9_16_SE       (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)|ENDIAN16_SH(1))\n#define TYPE_KYMC9_8           (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(1)|DOSWAP_SH(1))\n#define TYPE_KYMC9_16          (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)|DOSWAP_SH(1))\n#define TYPE_KYMC9_16_SE       (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))\n#define TYPE_CMYK10_8          (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(1))\n#define TYPE_CMYK10_16         (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2))\n#define TYPE_CMYK10_16_SE      (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)|ENDIAN16_SH(1))\n#define TYPE_KYMC10_8          (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(1)|DOSWAP_SH(1))\n#define TYPE_KYMC10_16         (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)|DOSWAP_SH(1))\n#define TYPE_KYMC10_16_SE      (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))\n#define TYPE_CMYK11_8          (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(1))\n#define TYPE_CMYK11_16         (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2))\n#define TYPE_CMYK11_16_SE      (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)|ENDIAN16_SH(1))\n#define TYPE_KYMC11_8          (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(1)|DOSWAP_SH(1))\n#define TYPE_KYMC11_16         (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)|DOSWAP_SH(1))\n#define TYPE_KYMC11_16_SE      (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))\n#define TYPE_CMYK12_8          (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(1))\n#define TYPE_CMYK12_16         (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2))\n#define TYPE_CMYK12_16_SE      (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)|ENDIAN16_SH(1))\n#define TYPE_KYMC12_8          (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(1)|DOSWAP_SH(1))\n#define TYPE_KYMC12_16         (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)|DOSWAP_SH(1))\n#define TYPE_KYMC12_16_SE      (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))\n\n// Colorimetric\n#define TYPE_XYZ_16            (COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(2))\n#define TYPE_Lab_8             (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1))\n#define TYPE_LabV2_8           (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(1))\n\n#define TYPE_ALab_8            (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1))\n#define TYPE_ALabV2_8          (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1))\n#define TYPE_Lab_16            (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(2))\n#define TYPE_LabV2_16          (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(2))\n#define TYPE_Yxy_16            (COLORSPACE_SH(PT_Yxy)|CHANNELS_SH(3)|BYTES_SH(2))\n\n// YCbCr\n#define TYPE_YCbCr_8           (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(1))\n#define TYPE_YCbCr_8_PLANAR    (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))\n#define TYPE_YCbCr_16          (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2))\n#define TYPE_YCbCr_16_PLANAR   (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))\n#define TYPE_YCbCr_16_SE       (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))\n\n// YUV\n#define TYPE_YUV_8             (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(1))\n#define TYPE_YUV_8_PLANAR      (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))\n#define TYPE_YUV_16            (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2))\n#define TYPE_YUV_16_PLANAR     (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))\n#define TYPE_YUV_16_SE         (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))\n\n// HLS\n#define TYPE_HLS_8             (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(1))\n#define TYPE_HLS_8_PLANAR      (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))\n#define TYPE_HLS_16            (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2))\n#define TYPE_HLS_16_PLANAR     (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))\n#define TYPE_HLS_16_SE         (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))\n\n// HSV\n#define TYPE_HSV_8             (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(1))\n#define TYPE_HSV_8_PLANAR      (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))\n#define TYPE_HSV_16            (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2))\n#define TYPE_HSV_16_PLANAR     (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))\n#define TYPE_HSV_16_SE         (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))\n\n// Named color index. Only 16 bits allowed (don't check colorspace)\n#define TYPE_NAMED_COLOR_INDEX (CHANNELS_SH(1)|BYTES_SH(2))\n\n// Float formatters.\n#define TYPE_XYZ_FLT          (FLOAT_SH(1)|COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(4))\n#define TYPE_Lab_FLT          (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(4))\n#define TYPE_LabA_FLT         (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4))\n#define TYPE_GRAY_FLT         (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(4))\n#define TYPE_RGB_FLT          (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4))\n\n#define TYPE_RGBA_FLT         (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4))\n#define TYPE_ARGB_FLT         (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|SWAPFIRST_SH(1))\n#define TYPE_BGR_FLT          (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1))\n#define TYPE_BGRA_FLT         (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1)|SWAPFIRST_SH(1))\n#define TYPE_ABGR_FLT         (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1))\n\n#define TYPE_CMYK_FLT         (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(4))\n\n// Floating point formatters.\n// NOTE THAT 'BYTES' FIELD IS SET TO ZERO ON DLB because 8 bytes overflows the bitfield\n#define TYPE_XYZ_DBL          (FLOAT_SH(1)|COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(0))\n#define TYPE_Lab_DBL          (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(0))\n#define TYPE_GRAY_DBL         (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(0))\n#define TYPE_RGB_DBL          (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(0))\n#define TYPE_BGR_DBL          (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(0)|DOSWAP_SH(1))\n#define TYPE_CMYK_DBL         (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(0))\n\n// IEEE 754-2008 \"half\"\n#define TYPE_GRAY_HALF_FLT    (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2))\n#define TYPE_RGB_HALF_FLT     (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2))\n#define TYPE_RGBA_HALF_FLT    (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2))\n#define TYPE_CMYK_HALF_FLT    (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2))\n\n#define TYPE_RGBA_HALF_FLT    (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2))\n#define TYPE_ARGB_HALF_FLT    (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1))\n#define TYPE_BGR_HALF_FLT     (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))\n#define TYPE_BGRA_HALF_FLT    (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1))\n#define TYPE_ABGR_HALF_FLT    (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))\n\n#endif\n\n// Colorspaces\ntypedef struct {\n        cmsFloat64Number X;\n        cmsFloat64Number Y;\n        cmsFloat64Number Z;\n\n    } cmsCIEXYZ;\n\ntypedef struct {\n        cmsFloat64Number x;\n        cmsFloat64Number y;\n        cmsFloat64Number Y;\n\n    } cmsCIExyY;\n\ntypedef struct {\n        cmsFloat64Number L;\n        cmsFloat64Number a;\n        cmsFloat64Number b;\n\n    } cmsCIELab;\n\ntypedef struct {\n        cmsFloat64Number L;\n        cmsFloat64Number C;\n        cmsFloat64Number h;\n\n    } cmsCIELCh;\n\ntypedef struct {\n        cmsFloat64Number J;\n        cmsFloat64Number C;\n        cmsFloat64Number h;\n\n    } cmsJCh;\n\ntypedef struct {\n        cmsCIEXYZ  Red;\n        cmsCIEXYZ  Green;\n        cmsCIEXYZ  Blue;\n\n    } cmsCIEXYZTRIPLE;\n\ntypedef struct {\n        cmsCIExyY  Red;\n        cmsCIExyY  Green;\n        cmsCIExyY  Blue;\n\n    } cmsCIExyYTRIPLE;\n\n// Illuminant types for structs below\n#define cmsILLUMINANT_TYPE_UNKNOWN 0x0000000\n#define cmsILLUMINANT_TYPE_D50     0x0000001\n#define cmsILLUMINANT_TYPE_D65     0x0000002\n#define cmsILLUMINANT_TYPE_D93     0x0000003\n#define cmsILLUMINANT_TYPE_F2      0x0000004\n#define cmsILLUMINANT_TYPE_D55     0x0000005\n#define cmsILLUMINANT_TYPE_A       0x0000006\n#define cmsILLUMINANT_TYPE_E       0x0000007\n#define cmsILLUMINANT_TYPE_F8      0x0000008\n\ntypedef struct {\n        cmsUInt32Number  Observer;    // 0 = unknown, 1=CIE 1931, 2=CIE 1964\n        cmsCIEXYZ        Backing;     // Value of backing\n        cmsUInt32Number  Geometry;    // 0=unknown, 1=45/0, 0/45 2=0d, d/0\n        cmsFloat64Number Flare;       // 0..1.0\n        cmsUInt32Number  IlluminantType;\n\n    } cmsICCMeasurementConditions;\n\ntypedef struct {\n        cmsCIEXYZ       IlluminantXYZ;   // Not the same struct as CAM02,\n        cmsCIEXYZ       SurroundXYZ;     // This is for storing the tag\n        cmsUInt32Number IlluminantType;  // viewing condition\n\n    } cmsICCViewingConditions;\n\n// Support of non-standard functions --------------------------------------------------------------------------------------\n\nCMSAPI int               CMSEXPORT cmsstrcasecmp(const char* s1, const char* s2);\nCMSAPI long int          CMSEXPORT cmsfilelength(FILE* f);\n\n\n// Context handling --------------------------------------------------------------------------------------------------------\n\n// Each context holds its owns globals and its own plug-ins. There is a global context with the id = 0 for lecacy compatibility\n// though using the global context is not recomended. Proper context handling makes lcms more thread-safe.\n\ntypedef struct _cmsContext_struct* cmsContext;\n\nCMSAPI cmsContext       CMSEXPORT cmsCreateContext(void* Plugin, void* UserData);\nCMSAPI void             CMSEXPORT cmsDeleteContext(cmsContext ContexID);\nCMSAPI cmsContext       CMSEXPORT cmsDupContext(cmsContext ContextID, void* NewUserData);\nCMSAPI void*            CMSEXPORT cmsGetContextUserData(cmsContext ContextID);\n\n// Plug-In registering  --------------------------------------------------------------------------------------------------\n\nCMSAPI cmsBool           CMSEXPORT cmsPlugin(void* Plugin);\nCMSAPI cmsBool           CMSEXPORT cmsPluginTHR(cmsContext ContextID, void* Plugin);\nCMSAPI void              CMSEXPORT cmsUnregisterPlugins(void);\nCMSAPI void              CMSEXPORT cmsUnregisterPluginsTHR(cmsContext ContextID);\n\n// Error logging ----------------------------------------------------------------------------------------------------------\n\n// There is no error handling at all. When a function fails, it returns proper value.\n// For example, all create functions does return NULL on failure. Other may return FALSE.\n// It may be interesting, for the developer, to know why the function is failing.\n// for that reason, lcms2 does offer a logging function. This function will get\n// an ENGLISH string with some clues on what is going wrong. You can show this\n// info to the end user if you wish, or just create some sort of log on disk.\n// The logging function should NOT terminate the program, as this obviously can leave\n// unfreed resources. It is the programmer's responsibility to check each function\n// return code to make sure it didn't fail.\n\n#define cmsERROR_UNDEFINED                    0\n#define cmsERROR_FILE                         1\n#define cmsERROR_RANGE                        2\n#define cmsERROR_INTERNAL                     3\n#define cmsERROR_NULL                         4\n#define cmsERROR_READ                         5\n#define cmsERROR_SEEK                         6\n#define cmsERROR_WRITE                        7\n#define cmsERROR_UNKNOWN_EXTENSION            8\n#define cmsERROR_COLORSPACE_CHECK             9\n#define cmsERROR_ALREADY_DEFINED              10\n#define cmsERROR_BAD_SIGNATURE                11\n#define cmsERROR_CORRUPTION_DETECTED          12\n#define cmsERROR_NOT_SUITABLE                 13\n\n// Error logger is called with the ContextID when a message is raised. This gives the\n// chance to know which thread is responsible of the warning and any environment associated\n// with it. Non-multithreading applications may safely ignore this parameter.\n// Note that under certain special circumstances, ContextID may be NULL.\ntypedef void  (* cmsLogErrorHandlerFunction)(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text);\n\n// Allows user to set any specific logger\nCMSAPI void              CMSEXPORT cmsSetLogErrorHandler(cmsLogErrorHandlerFunction Fn);\nCMSAPI void              CMSEXPORT cmsSetLogErrorHandlerTHR(cmsContext ContextID, cmsLogErrorHandlerFunction Fn);\n\n// Conversions --------------------------------------------------------------------------------------------------------------\n\n// Returns pointers to constant structs\nCMSAPI const cmsCIEXYZ*  CMSEXPORT cmsD50_XYZ(void);\nCMSAPI const cmsCIExyY*  CMSEXPORT cmsD50_xyY(void);\n\n// Colorimetric space conversions\nCMSAPI void              CMSEXPORT cmsXYZ2xyY(cmsCIExyY* Dest, const cmsCIEXYZ* Source);\nCMSAPI void              CMSEXPORT cmsxyY2XYZ(cmsCIEXYZ* Dest, const cmsCIExyY* Source);\nCMSAPI void              CMSEXPORT cmsXYZ2Lab(const cmsCIEXYZ* WhitePoint, cmsCIELab* Lab, const cmsCIEXYZ* xyz);\nCMSAPI void              CMSEXPORT cmsLab2XYZ(const cmsCIEXYZ* WhitePoint, cmsCIEXYZ* xyz, const cmsCIELab* Lab);\nCMSAPI void              CMSEXPORT cmsLab2LCh(cmsCIELCh*LCh, const cmsCIELab* Lab);\nCMSAPI void              CMSEXPORT cmsLCh2Lab(cmsCIELab* Lab, const cmsCIELCh* LCh);\n\n// Encoding /Decoding on PCS\nCMSAPI void              CMSEXPORT cmsLabEncoded2Float(cmsCIELab* Lab, const cmsUInt16Number wLab[3]);\nCMSAPI void              CMSEXPORT cmsLabEncoded2FloatV2(cmsCIELab* Lab, const cmsUInt16Number wLab[3]);\nCMSAPI void              CMSEXPORT cmsFloat2LabEncoded(cmsUInt16Number wLab[3], const cmsCIELab* Lab);\nCMSAPI void              CMSEXPORT cmsFloat2LabEncodedV2(cmsUInt16Number wLab[3], const cmsCIELab* Lab);\nCMSAPI void              CMSEXPORT cmsXYZEncoded2Float(cmsCIEXYZ* fxyz, const cmsUInt16Number XYZ[3]);\nCMSAPI void              CMSEXPORT cmsFloat2XYZEncoded(cmsUInt16Number XYZ[3], const cmsCIEXYZ* fXYZ);\n\n// DeltaE metrics\nCMSAPI cmsFloat64Number  CMSEXPORT cmsDeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2);\nCMSAPI cmsFloat64Number  CMSEXPORT cmsCIE94DeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2);\nCMSAPI cmsFloat64Number  CMSEXPORT cmsBFDdeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2);\nCMSAPI cmsFloat64Number  CMSEXPORT cmsCMCdeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2, cmsFloat64Number l, cmsFloat64Number c);\nCMSAPI cmsFloat64Number  CMSEXPORT cmsCIE2000DeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2, cmsFloat64Number Kl, cmsFloat64Number Kc, cmsFloat64Number Kh);\n\n// Temperature <-> Chromaticity (Black body)\nCMSAPI cmsBool           CMSEXPORT cmsWhitePointFromTemp(cmsCIExyY* WhitePoint, cmsFloat64Number  TempK);\nCMSAPI cmsBool           CMSEXPORT cmsTempFromWhitePoint(cmsFloat64Number* TempK, const cmsCIExyY* WhitePoint);\n\n// Chromatic adaptation\nCMSAPI cmsBool           CMSEXPORT cmsAdaptToIlluminant(cmsCIEXYZ* Result, const cmsCIEXYZ* SourceWhitePt,\n                                                                           const cmsCIEXYZ* Illuminant,\n                                                                           const cmsCIEXYZ* Value);\n\n// CIECAM02 ---------------------------------------------------------------------------------------------------\n\n// Viewing conditions. Please note those are CAM model viewing conditions, and not the ICC tag viewing\n// conditions, which I'm naming cmsICCViewingConditions to make differences evident. Unfortunately, the tag\n// cannot deal with surround La, Yb and D value so is basically useless to store CAM02 viewing conditions.\n\n\n#define AVG_SURROUND       1\n#define DIM_SURROUND       2\n#define DARK_SURROUND      3\n#define CUTSHEET_SURROUND  4\n\n#define D_CALCULATE        (-1)\n\ntypedef struct {\n    cmsCIEXYZ        whitePoint;\n    cmsFloat64Number Yb;\n    cmsFloat64Number La;\n    int              surround;\n    cmsFloat64Number D_value;\n\n    } cmsViewingConditions;\n\nCMSAPI cmsHANDLE         CMSEXPORT cmsCIECAM02Init(cmsContext ContextID, const cmsViewingConditions* pVC);\nCMSAPI void              CMSEXPORT cmsCIECAM02Done(cmsHANDLE hModel);\nCMSAPI void              CMSEXPORT cmsCIECAM02Forward(cmsHANDLE hModel, const cmsCIEXYZ* pIn, cmsJCh* pOut);\nCMSAPI void              CMSEXPORT cmsCIECAM02Reverse(cmsHANDLE hModel, const cmsJCh* pIn,    cmsCIEXYZ* pOut);\n\n\n// Tone curves -----------------------------------------------------------------------------------------\n\n// This describes a curve segment. For a table of supported types, see the manual. User can increase the number of\n// available types by using a proper plug-in. Parametric segments allow 10 parameters at most\n\ntypedef struct {\n    cmsFloat32Number   x0, x1;           // Domain; for x0 < x <= x1\n    cmsInt32Number     Type;             // Parametric type, Type == 0 means sampled segment. Negative values are reserved\n    cmsFloat64Number   Params[10];       // Parameters if Type != 0\n    cmsUInt32Number    nGridPoints;      // Number of grid points if Type == 0\n    cmsFloat32Number*  SampledPoints;    // Points to an array of floats if Type == 0\n\n} cmsCurveSegment;\n\n// The internal representation is none of your business.\ntypedef struct _cms_curve_struct cmsToneCurve;\n\nCMSAPI cmsToneCurve*     CMSEXPORT cmsBuildSegmentedToneCurve(cmsContext ContextID, cmsInt32Number nSegments, const cmsCurveSegment Segments[]);\nCMSAPI cmsToneCurve*     CMSEXPORT cmsBuildParametricToneCurve(cmsContext ContextID, cmsInt32Number Type, const cmsFloat64Number Params[]);\nCMSAPI cmsToneCurve*     CMSEXPORT cmsBuildGamma(cmsContext ContextID, cmsFloat64Number Gamma);\nCMSAPI cmsToneCurve*     CMSEXPORT cmsBuildTabulatedToneCurve16(cmsContext ContextID, cmsInt32Number nEntries, const cmsUInt16Number values[]);\nCMSAPI cmsToneCurve*     CMSEXPORT cmsBuildTabulatedToneCurveFloat(cmsContext ContextID, cmsUInt32Number nEntries, const cmsFloat32Number values[]);\nCMSAPI void              CMSEXPORT cmsFreeToneCurve(cmsToneCurve* Curve);\nCMSAPI void              CMSEXPORT cmsFreeToneCurveTriple(cmsToneCurve* Curve[3]);\nCMSAPI cmsToneCurve*     CMSEXPORT cmsDupToneCurve(const cmsToneCurve* Src);\nCMSAPI cmsToneCurve*     CMSEXPORT cmsReverseToneCurve(const cmsToneCurve* InGamma);\nCMSAPI cmsToneCurve*     CMSEXPORT cmsReverseToneCurveEx(cmsInt32Number nResultSamples, const cmsToneCurve* InGamma);\nCMSAPI cmsToneCurve*     CMSEXPORT cmsJoinToneCurve(cmsContext ContextID, const cmsToneCurve* X,  const cmsToneCurve* Y, cmsUInt32Number nPoints);\nCMSAPI cmsBool           CMSEXPORT cmsSmoothToneCurve(cmsToneCurve* Tab, cmsFloat64Number lambda);\nCMSAPI cmsFloat32Number  CMSEXPORT cmsEvalToneCurveFloat(const cmsToneCurve* Curve, cmsFloat32Number v);\nCMSAPI cmsUInt16Number   CMSEXPORT cmsEvalToneCurve16(const cmsToneCurve* Curve, cmsUInt16Number v);\nCMSAPI cmsBool           CMSEXPORT cmsIsToneCurveMultisegment(const cmsToneCurve* InGamma);\nCMSAPI cmsBool           CMSEXPORT cmsIsToneCurveLinear(const cmsToneCurve* Curve);\nCMSAPI cmsBool           CMSEXPORT cmsIsToneCurveMonotonic(const cmsToneCurve* t);\nCMSAPI cmsBool           CMSEXPORT cmsIsToneCurveDescending(const cmsToneCurve* t);\nCMSAPI cmsInt32Number    CMSEXPORT cmsGetToneCurveParametricType(const cmsToneCurve* t);\nCMSAPI cmsFloat64Number  CMSEXPORT cmsEstimateGamma(const cmsToneCurve* t, cmsFloat64Number Precision);\n\n// Tone curve tabular estimation\nCMSAPI cmsUInt32Number         CMSEXPORT cmsGetToneCurveEstimatedTableEntries(const cmsToneCurve* t);\nCMSAPI const cmsUInt16Number*  CMSEXPORT cmsGetToneCurveEstimatedTable(const cmsToneCurve* t);\n\n\n// Implements pipelines of multi-processing elements -------------------------------------------------------------\n\n// Nothing to see here, move along\ntypedef struct _cmsPipeline_struct cmsPipeline;\ntypedef struct _cmsStage_struct cmsStage;\n\n// Those are hi-level pipelines\nCMSAPI cmsPipeline*      CMSEXPORT cmsPipelineAlloc(cmsContext ContextID, cmsUInt32Number InputChannels, cmsUInt32Number OutputChannels);\nCMSAPI void              CMSEXPORT cmsPipelineFree(cmsPipeline* lut);\nCMSAPI cmsPipeline*      CMSEXPORT cmsPipelineDup(const cmsPipeline* Orig);\n\nCMSAPI cmsContext        CMSEXPORT cmsGetPipelineContextID(const cmsPipeline* lut);\nCMSAPI cmsUInt32Number   CMSEXPORT cmsPipelineInputChannels(const cmsPipeline* lut);\nCMSAPI cmsUInt32Number   CMSEXPORT cmsPipelineOutputChannels(const cmsPipeline* lut);\n\nCMSAPI cmsUInt32Number   CMSEXPORT cmsPipelineStageCount(const cmsPipeline* lut);\nCMSAPI cmsStage*         CMSEXPORT cmsPipelineGetPtrToFirstStage(const cmsPipeline* lut);\nCMSAPI cmsStage*         CMSEXPORT cmsPipelineGetPtrToLastStage(const cmsPipeline* lut);\n\nCMSAPI void              CMSEXPORT cmsPipelineEval16(const cmsUInt16Number In[], cmsUInt16Number Out[], const cmsPipeline* lut);\nCMSAPI void              CMSEXPORT cmsPipelineEvalFloat(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsPipeline* lut);\nCMSAPI cmsBool           CMSEXPORT cmsPipelineEvalReverseFloat(cmsFloat32Number Target[], cmsFloat32Number Result[], cmsFloat32Number Hint[], const cmsPipeline* lut);\nCMSAPI cmsBool           CMSEXPORT cmsPipelineCat(cmsPipeline* l1, const cmsPipeline* l2);\nCMSAPI cmsBool           CMSEXPORT cmsPipelineSetSaveAs8bitsFlag(cmsPipeline* lut, cmsBool On);\n\n// Where to place/locate the stages in the pipeline chain\ntypedef enum { cmsAT_BEGIN, cmsAT_END } cmsStageLoc;\n\nCMSAPI int               CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage* mpe);\nCMSAPI void              CMSEXPORT cmsPipelineUnlinkStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage** mpe);\n\n// This function is quite useful to analyze the structure of a Pipeline and retrieve the Stage elements\n// that conform the Pipeline. It should be called with the Pipeline, the number of expected elements and\n// then a list of expected types followed with a list of double pointers to Stage elements. If\n// the function founds a match with current pipeline, it fills the pointers and returns TRUE\n// if not, returns FALSE without touching anything.\nCMSAPI cmsBool           CMSEXPORT cmsPipelineCheckAndRetreiveStages(const cmsPipeline* Lut, cmsUInt32Number n, ...);\n\n// Matrix has double precision and CLUT has only float precision. That is because an ICC profile can encode\n// matrices with far more precision that CLUTS\nCMSAPI cmsStage*         CMSEXPORT cmsStageAllocIdentity(cmsContext ContextID, cmsUInt32Number nChannels);\nCMSAPI cmsStage*         CMSEXPORT cmsStageAllocToneCurves(cmsContext ContextID, cmsUInt32Number nChannels, cmsToneCurve* const Curves[]);\nCMSAPI cmsStage*         CMSEXPORT cmsStageAllocMatrix(cmsContext ContextID, cmsUInt32Number Rows, cmsUInt32Number Cols, const cmsFloat64Number* Matrix, const cmsFloat64Number* Offset);\n\nCMSAPI cmsStage*         CMSEXPORT cmsStageAllocCLut16bit(cmsContext ContextID, cmsUInt32Number nGridPoints, cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsUInt16Number* Table);\nCMSAPI cmsStage*         CMSEXPORT cmsStageAllocCLutFloat(cmsContext ContextID, cmsUInt32Number nGridPoints, cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsFloat32Number* Table);\n\nCMSAPI cmsStage*         CMSEXPORT cmsStageAllocCLut16bitGranular(cmsContext ContextID, const cmsUInt32Number clutPoints[], cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsUInt16Number* Table);\nCMSAPI cmsStage*         CMSEXPORT cmsStageAllocCLutFloatGranular(cmsContext ContextID, const cmsUInt32Number clutPoints[], cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsFloat32Number* Table);\n\nCMSAPI cmsStage*         CMSEXPORT cmsStageDup(cmsStage* mpe);\nCMSAPI void              CMSEXPORT cmsStageFree(cmsStage* mpe);\nCMSAPI cmsStage*         CMSEXPORT cmsStageNext(const cmsStage* mpe);\n\nCMSAPI cmsUInt32Number   CMSEXPORT cmsStageInputChannels(const cmsStage* mpe);\nCMSAPI cmsUInt32Number   CMSEXPORT cmsStageOutputChannels(const cmsStage* mpe);\nCMSAPI cmsStageSignature CMSEXPORT cmsStageType(const cmsStage* mpe);\nCMSAPI void*             CMSEXPORT cmsStageData(const cmsStage* mpe);\n\n// Sampling\ntypedef cmsInt32Number (* cmsSAMPLER16)   (register const cmsUInt16Number In[],\n                                            register cmsUInt16Number Out[],\n                                            register void * Cargo);\n\ntypedef cmsInt32Number (* cmsSAMPLERFLOAT)(register const cmsFloat32Number In[],\n                                            register cmsFloat32Number Out[],\n                                            register void * Cargo);\n\n// Use this flag to prevent changes being written to destination\n#define SAMPLER_INSPECT     0x01000000\n\n// For CLUT only\nCMSAPI cmsBool           CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe,    cmsSAMPLER16 Sampler, void* Cargo, cmsUInt32Number dwFlags);\nCMSAPI cmsBool           CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler, void* Cargo, cmsUInt32Number dwFlags);\n\n// Slicers\nCMSAPI cmsBool           CMSEXPORT cmsSliceSpace16(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[],\n                                                   cmsSAMPLER16 Sampler, void * Cargo);\n\nCMSAPI cmsBool           CMSEXPORT cmsSliceSpaceFloat(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[],\n                                                   cmsSAMPLERFLOAT Sampler, void * Cargo);\n\n// Multilocalized Unicode management ---------------------------------------------------------------------------------------\n\ntypedef struct _cms_MLU_struct cmsMLU;\n\n#define  cmsNoLanguage \"\\0\\0\"\n#define  cmsNoCountry  \"\\0\\0\"\n\nCMSAPI cmsMLU*           CMSEXPORT cmsMLUalloc(cmsContext ContextID, cmsUInt32Number nItems);\nCMSAPI void              CMSEXPORT cmsMLUfree(cmsMLU* mlu);\nCMSAPI cmsMLU*           CMSEXPORT cmsMLUdup(const cmsMLU* mlu);\n\nCMSAPI cmsBool           CMSEXPORT cmsMLUsetASCII(cmsMLU* mlu,\n                                                  const char LanguageCode[3], const char CountryCode[3],\n                                                  const char* ASCIIString);\nCMSAPI cmsBool           CMSEXPORT cmsMLUsetWide(cmsMLU* mlu,\n                                                  const char LanguageCode[3], const char CountryCode[3],\n                                                  const wchar_t* WideString);\n\nCMSAPI cmsUInt32Number   CMSEXPORT cmsMLUgetASCII(const cmsMLU* mlu,\n                                                  const char LanguageCode[3], const char CountryCode[3],\n                                                  char* Buffer,    cmsUInt32Number BufferSize);\n\nCMSAPI cmsUInt32Number   CMSEXPORT cmsMLUgetWide(const cmsMLU* mlu,\n                                                 const char LanguageCode[3], const char CountryCode[3],\n                                                 wchar_t* Buffer, cmsUInt32Number BufferSize);\n\nCMSAPI cmsBool           CMSEXPORT cmsMLUgetTranslation(const cmsMLU* mlu,\n                                                         const char LanguageCode[3], const char CountryCode[3],\n                                                         char ObtainedLanguage[3], char ObtainedCountry[3]);\n\nCMSAPI cmsUInt32Number   CMSEXPORT cmsMLUtranslationsCount(const cmsMLU* mlu);\n\nCMSAPI cmsBool           CMSEXPORT cmsMLUtranslationsCodes(const cmsMLU* mlu,\n                                                             cmsUInt32Number idx,\n                                                             char LanguageCode[3],\n                                                             char CountryCode[3]);\n \n// Undercolorremoval & black generation -------------------------------------------------------------------------------------\n\ntypedef struct {\n        cmsToneCurve* Ucr;\n        cmsToneCurve* Bg;\n        cmsMLU*       Desc;\n\n} cmsUcrBg;\n\n// Screening ----------------------------------------------------------------------------------------------------------------\n\n#define cmsPRINTER_DEFAULT_SCREENS     0x0001\n#define cmsFREQUENCE_UNITS_LINES_CM    0x0000\n#define cmsFREQUENCE_UNITS_LINES_INCH  0x0002\n\n#define cmsSPOT_UNKNOWN         0\n#define cmsSPOT_PRINTER_DEFAULT 1\n#define cmsSPOT_ROUND           2\n#define cmsSPOT_DIAMOND         3\n#define cmsSPOT_ELLIPSE         4\n#define cmsSPOT_LINE            5\n#define cmsSPOT_SQUARE          6\n#define cmsSPOT_CROSS           7\n\ntypedef struct {\n    cmsFloat64Number  Frequency;\n    cmsFloat64Number  ScreenAngle;\n    cmsUInt32Number   SpotShape;\n\n} cmsScreeningChannel;\n\ntypedef struct {\n    cmsUInt32Number Flag;\n    cmsUInt32Number nChannels;\n    cmsScreeningChannel Channels[cmsMAXCHANNELS];\n\n} cmsScreening;\n\n\n// Named color -----------------------------------------------------------------------------------------------------------------\n\ntypedef struct _cms_NAMEDCOLORLIST_struct cmsNAMEDCOLORLIST;\n\nCMSAPI cmsNAMEDCOLORLIST* CMSEXPORT cmsAllocNamedColorList(cmsContext ContextID,\n                                                           cmsUInt32Number n,\n                                                           cmsUInt32Number ColorantCount,\n                                                           const char* Prefix, const char* Suffix);\n\nCMSAPI void               CMSEXPORT cmsFreeNamedColorList(cmsNAMEDCOLORLIST* v);\nCMSAPI cmsNAMEDCOLORLIST* CMSEXPORT cmsDupNamedColorList(const cmsNAMEDCOLORLIST* v);\nCMSAPI cmsBool            CMSEXPORT cmsAppendNamedColor(cmsNAMEDCOLORLIST* v, const char* Name,\n                                                            cmsUInt16Number PCS[3],\n                                                            cmsUInt16Number Colorant[cmsMAXCHANNELS]);\n\nCMSAPI cmsUInt32Number    CMSEXPORT cmsNamedColorCount(const cmsNAMEDCOLORLIST* v);\nCMSAPI cmsInt32Number     CMSEXPORT cmsNamedColorIndex(const cmsNAMEDCOLORLIST* v, const char* Name);\n\nCMSAPI cmsBool            CMSEXPORT cmsNamedColorInfo(const cmsNAMEDCOLORLIST* NamedColorList, cmsUInt32Number nColor,\n                                                      char* Name,\n                                                      char* Prefix,\n                                                      char* Suffix,\n                                                      cmsUInt16Number* PCS,\n                                                      cmsUInt16Number* Colorant);\n\n// Retrieve named color list from transform\nCMSAPI cmsNAMEDCOLORLIST* CMSEXPORT cmsGetNamedColorList(cmsHTRANSFORM xform);\n\n// Profile sequence -----------------------------------------------------------------------------------------------------\n\n// Profile sequence descriptor. Some fields come from profile sequence descriptor tag, others\n// come from Profile Sequence Identifier Tag\ntypedef struct {\n\n    cmsSignature           deviceMfg;\n    cmsSignature           deviceModel;\n    cmsUInt64Number        attributes;\n    cmsTechnologySignature technology;\n    cmsProfileID           ProfileID;\n    cmsMLU*                Manufacturer;\n    cmsMLU*                Model;\n    cmsMLU*                Description;\n\n} cmsPSEQDESC;\n\ntypedef struct {\n\n    cmsUInt32Number n;\n    cmsContext     ContextID;\n    cmsPSEQDESC*    seq;\n\n} cmsSEQ;\n\nCMSAPI cmsSEQ*           CMSEXPORT cmsAllocProfileSequenceDescription(cmsContext ContextID, cmsUInt32Number n);\nCMSAPI cmsSEQ*           CMSEXPORT cmsDupProfileSequenceDescription(const cmsSEQ* pseq);\nCMSAPI void              CMSEXPORT cmsFreeProfileSequenceDescription(cmsSEQ* pseq);\n\n// Dictionaries --------------------------------------------------------------------------------------------------------\n\ntypedef struct _cmsDICTentry_struct {\n\n    struct _cmsDICTentry_struct* Next;\n\n    cmsMLU *DisplayName;\n    cmsMLU *DisplayValue;\n    wchar_t* Name;\n    wchar_t* Value;\n\n} cmsDICTentry;\n\nCMSAPI cmsHANDLE           CMSEXPORT cmsDictAlloc(cmsContext ContextID);\nCMSAPI void                CMSEXPORT cmsDictFree(cmsHANDLE hDict);\nCMSAPI cmsHANDLE           CMSEXPORT cmsDictDup(cmsHANDLE hDict);\n\nCMSAPI cmsBool             CMSEXPORT cmsDictAddEntry(cmsHANDLE hDict, const wchar_t* Name, const wchar_t* Value, const cmsMLU *DisplayName, const cmsMLU *DisplayValue);\nCMSAPI const cmsDICTentry* CMSEXPORT cmsDictGetEntryList(cmsHANDLE hDict);\nCMSAPI const cmsDICTentry* CMSEXPORT cmsDictNextEntry(const cmsDICTentry* e);\n\n// Access to Profile data ----------------------------------------------------------------------------------------------\nCMSAPI cmsHPROFILE       CMSEXPORT cmsCreateProfilePlaceholder(cmsContext ContextID);\n\nCMSAPI cmsContext        CMSEXPORT cmsGetProfileContextID(cmsHPROFILE hProfile);\nCMSAPI cmsInt32Number    CMSEXPORT cmsGetTagCount(cmsHPROFILE hProfile);\nCMSAPI cmsTagSignature   CMSEXPORT cmsGetTagSignature(cmsHPROFILE hProfile, cmsUInt32Number n);\nCMSAPI cmsBool           CMSEXPORT cmsIsTag(cmsHPROFILE hProfile, cmsTagSignature sig);\n\n// Read and write pre-formatted data\nCMSAPI void*             CMSEXPORT cmsReadTag(cmsHPROFILE hProfile, cmsTagSignature sig);\nCMSAPI cmsBool           CMSEXPORT cmsWriteTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data);\nCMSAPI cmsBool           CMSEXPORT cmsLinkTag(cmsHPROFILE hProfile, cmsTagSignature sig, cmsTagSignature dest);\nCMSAPI cmsTagSignature   CMSEXPORT cmsTagLinkedTo(cmsHPROFILE hProfile, cmsTagSignature sig);\n\n// Read and write raw data\nCMSAPI cmsInt32Number    CMSEXPORT cmsReadRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, void* Buffer, cmsUInt32Number BufferSize);\nCMSAPI cmsBool           CMSEXPORT cmsWriteRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data, cmsUInt32Number Size);\n\n// Access header data\n#define cmsEmbeddedProfileFalse    0x00000000\n#define cmsEmbeddedProfileTrue     0x00000001\n#define cmsUseAnywhere             0x00000000\n#define cmsUseWithEmbeddedDataOnly 0x00000002\n\nCMSAPI cmsUInt32Number   CMSEXPORT cmsGetHeaderFlags(cmsHPROFILE hProfile);\nCMSAPI void              CMSEXPORT cmsGetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number* Flags);\nCMSAPI void              CMSEXPORT cmsGetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID);\nCMSAPI cmsBool           CMSEXPORT cmsGetHeaderCreationDateTime(cmsHPROFILE hProfile, struct tm *Dest);\nCMSAPI cmsUInt32Number   CMSEXPORT cmsGetHeaderRenderingIntent(cmsHPROFILE hProfile);\n\nCMSAPI void              CMSEXPORT cmsSetHeaderFlags(cmsHPROFILE hProfile, cmsUInt32Number Flags);\nCMSAPI cmsUInt32Number   CMSEXPORT cmsGetHeaderManufacturer(cmsHPROFILE hProfile);\nCMSAPI void              CMSEXPORT cmsSetHeaderManufacturer(cmsHPROFILE hProfile, cmsUInt32Number manufacturer);\nCMSAPI cmsUInt32Number   CMSEXPORT cmsGetHeaderCreator(cmsHPROFILE hProfile);\nCMSAPI cmsUInt32Number   CMSEXPORT cmsGetHeaderModel(cmsHPROFILE hProfile);\nCMSAPI void              CMSEXPORT cmsSetHeaderModel(cmsHPROFILE hProfile, cmsUInt32Number model);\nCMSAPI void              CMSEXPORT cmsSetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number Flags);\nCMSAPI void              CMSEXPORT cmsSetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID);\nCMSAPI void              CMSEXPORT cmsSetHeaderRenderingIntent(cmsHPROFILE hProfile, cmsUInt32Number RenderingIntent);\n\nCMSAPI cmsColorSpaceSignature\n                         CMSEXPORT cmsGetPCS(cmsHPROFILE hProfile);\nCMSAPI void              CMSEXPORT cmsSetPCS(cmsHPROFILE hProfile, cmsColorSpaceSignature pcs);\nCMSAPI cmsColorSpaceSignature\n                         CMSEXPORT cmsGetColorSpace(cmsHPROFILE hProfile);\nCMSAPI void              CMSEXPORT cmsSetColorSpace(cmsHPROFILE hProfile, cmsColorSpaceSignature sig);\nCMSAPI cmsProfileClassSignature\n                         CMSEXPORT cmsGetDeviceClass(cmsHPROFILE hProfile);\nCMSAPI void              CMSEXPORT cmsSetDeviceClass(cmsHPROFILE hProfile, cmsProfileClassSignature sig);\nCMSAPI void              CMSEXPORT cmsSetProfileVersion(cmsHPROFILE hProfile, cmsFloat64Number Version);\nCMSAPI cmsFloat64Number  CMSEXPORT cmsGetProfileVersion(cmsHPROFILE hProfile);\n\nCMSAPI cmsUInt32Number   CMSEXPORT cmsGetEncodedICCversion(cmsHPROFILE hProfile);\nCMSAPI void              CMSEXPORT cmsSetEncodedICCversion(cmsHPROFILE hProfile, cmsUInt32Number Version);\n\n// How profiles may be used\n#define LCMS_USED_AS_INPUT      0\n#define LCMS_USED_AS_OUTPUT     1\n#define LCMS_USED_AS_PROOF      2\n\nCMSAPI cmsBool           CMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection);\nCMSAPI cmsBool           CMSEXPORT cmsIsMatrixShaper(cmsHPROFILE hProfile);\nCMSAPI cmsBool           CMSEXPORT cmsIsCLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection);\n\n// Translate form/to our notation to ICC\nCMSAPI cmsColorSpaceSignature   CMSEXPORT _cmsICCcolorSpace(int OurNotation);\nCMSAPI int                      CMSEXPORT _cmsLCMScolorSpace(cmsColorSpaceSignature ProfileSpace);\n\nCMSAPI cmsUInt32Number   CMSEXPORT cmsChannelsOf(cmsColorSpaceSignature ColorSpace);\n\n// Build a suitable formatter for the colorspace of this profile\nCMSAPI cmsUInt32Number   CMSEXPORT cmsFormatterForColorspaceOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat);\nCMSAPI cmsUInt32Number   CMSEXPORT cmsFormatterForPCSOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat);\n\n\n// Localized info\ntypedef enum {\n             cmsInfoDescription  = 0,\n             cmsInfoManufacturer = 1,\n             cmsInfoModel        = 2,\n             cmsInfoCopyright    = 3\n} cmsInfoType;\n\nCMSAPI cmsUInt32Number   CMSEXPORT cmsGetProfileInfo(cmsHPROFILE hProfile, cmsInfoType Info,\n                                                            const char LanguageCode[3], const char CountryCode[3],\n                                                            wchar_t* Buffer, cmsUInt32Number BufferSize);\n\nCMSAPI cmsUInt32Number   CMSEXPORT cmsGetProfileInfoASCII(cmsHPROFILE hProfile, cmsInfoType Info,\n                                                            const char LanguageCode[3], const char CountryCode[3],\n                                                            char* Buffer, cmsUInt32Number BufferSize);\n\n// IO handlers ----------------------------------------------------------------------------------------------------------\n\ntypedef struct _cms_io_handler cmsIOHANDLER;\n\nCMSAPI cmsIOHANDLER*     CMSEXPORT cmsOpenIOhandlerFromFile(cmsContext ContextID, const char* FileName, const char* AccessMode);\nCMSAPI cmsIOHANDLER*     CMSEXPORT cmsOpenIOhandlerFromStream(cmsContext ContextID, FILE* Stream);\nCMSAPI cmsIOHANDLER*     CMSEXPORT cmsOpenIOhandlerFromMem(cmsContext ContextID, void *Buffer, cmsUInt32Number size, const char* AccessMode);\nCMSAPI cmsIOHANDLER*     CMSEXPORT cmsOpenIOhandlerFromNULL(cmsContext ContextID);\nCMSAPI cmsBool           CMSEXPORT cmsCloseIOhandler(cmsIOHANDLER* io);\n\n// MD5 message digest --------------------------------------------------------------------------------------------------\n\nCMSAPI cmsBool           CMSEXPORT cmsMD5computeID(cmsHPROFILE hProfile);\nCMSAPI cmsBool\t\t\t CMSEXPORT cmsMD5computeIDExt(const void* buf, unsigned long size, unsigned char ProfileID[16]);\n\n// Profile high level funtions ------------------------------------------------------------------------------------------\n\nCMSAPI cmsHPROFILE      CMSEXPORT cmsOpenProfileFromFile(const char *ICCProfile, const char *sAccess);\nCMSAPI cmsHPROFILE      CMSEXPORT cmsOpenProfileFromFileTHR(cmsContext ContextID, const char *ICCProfile, const char *sAccess);\nCMSAPI cmsHPROFILE      CMSEXPORT cmsOpenProfileFromStream(FILE* ICCProfile, const char* sAccess);\nCMSAPI cmsHPROFILE      CMSEXPORT cmsOpenProfileFromStreamTHR(cmsContext ContextID, FILE* ICCProfile, const char* sAccess);\nCMSAPI cmsHPROFILE      CMSEXPORT cmsOpenProfileFromMem(const void * MemPtr, cmsUInt32Number dwSize);\nCMSAPI cmsHPROFILE      CMSEXPORT cmsOpenProfileFromMemTHR(cmsContext ContextID, const void * MemPtr, cmsUInt32Number dwSize);\nCMSAPI cmsHPROFILE      CMSEXPORT cmsOpenProfileFromIOhandlerTHR(cmsContext ContextID, cmsIOHANDLER* io);\nCMSAPI cmsHPROFILE      CMSEXPORT cmsOpenProfileFromIOhandler2THR(cmsContext ContextID, cmsIOHANDLER* io, cmsBool write);\nCMSAPI cmsBool          CMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile);\n\nCMSAPI cmsBool          CMSEXPORT cmsSaveProfileToFile(cmsHPROFILE hProfile, const char* FileName);\nCMSAPI cmsBool          CMSEXPORT cmsSaveProfileToStream(cmsHPROFILE hProfile, FILE* Stream);\nCMSAPI cmsBool          CMSEXPORT cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr, cmsUInt32Number* BytesNeeded);\nCMSAPI cmsUInt32Number  CMSEXPORT cmsSaveProfileToIOhandler(cmsHPROFILE hProfile, cmsIOHANDLER* io);\n\n// Predefined virtual profiles ------------------------------------------------------------------------------------------\n\nCMSAPI cmsHPROFILE      CMSEXPORT cmsCreateRGBProfileTHR(cmsContext ContextID,\n                                                   const cmsCIExyY* WhitePoint,\n                                                   const cmsCIExyYTRIPLE* Primaries,\n                                                   cmsToneCurve* const TransferFunction[3]);\n\nCMSAPI cmsHPROFILE      CMSEXPORT cmsCreateRGBProfile(const cmsCIExyY* WhitePoint,\n                                                   const cmsCIExyYTRIPLE* Primaries,\n                                                   cmsToneCurve* const TransferFunction[3]);\n\nCMSAPI cmsHPROFILE      CMSEXPORT cmsCreateGrayProfileTHR(cmsContext ContextID,\n                                                    const cmsCIExyY* WhitePoint,\n                                                    const cmsToneCurve* TransferFunction);\n\nCMSAPI cmsHPROFILE      CMSEXPORT cmsCreateGrayProfile(const cmsCIExyY* WhitePoint,\n                                                    const cmsToneCurve* TransferFunction);\n\nCMSAPI cmsHPROFILE      CMSEXPORT cmsCreateLinearizationDeviceLinkTHR(cmsContext ContextID,\n                                                                cmsColorSpaceSignature ColorSpace,\n                                                                cmsToneCurve* const TransferFunctions[]);\n\nCMSAPI cmsHPROFILE      CMSEXPORT cmsCreateLinearizationDeviceLink(cmsColorSpaceSignature ColorSpace,\n                                                                cmsToneCurve* const TransferFunctions[]);\n\nCMSAPI cmsHPROFILE      CMSEXPORT cmsCreateInkLimitingDeviceLinkTHR(cmsContext ContextID,\n                                                              cmsColorSpaceSignature ColorSpace, cmsFloat64Number Limit);\n\nCMSAPI cmsHPROFILE      CMSEXPORT cmsCreateInkLimitingDeviceLink(cmsColorSpaceSignature ColorSpace, cmsFloat64Number Limit);\n\n\nCMSAPI cmsHPROFILE      CMSEXPORT cmsCreateLab2ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint);\nCMSAPI cmsHPROFILE      CMSEXPORT cmsCreateLab2Profile(const cmsCIExyY* WhitePoint);\nCMSAPI cmsHPROFILE      CMSEXPORT cmsCreateLab4ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint);\nCMSAPI cmsHPROFILE      CMSEXPORT cmsCreateLab4Profile(const cmsCIExyY* WhitePoint);\n\nCMSAPI cmsHPROFILE      CMSEXPORT cmsCreateXYZProfileTHR(cmsContext ContextID);\nCMSAPI cmsHPROFILE      CMSEXPORT cmsCreateXYZProfile(void);\n\nCMSAPI cmsHPROFILE      CMSEXPORT cmsCreate_sRGBProfileTHR(cmsContext ContextID);\nCMSAPI cmsHPROFILE      CMSEXPORT cmsCreate_sRGBProfile(void);\n\nCMSAPI cmsHPROFILE      CMSEXPORT cmsCreateBCHSWabstractProfileTHR(cmsContext ContextID,\n                                                             int nLUTPoints,\n                                                             cmsFloat64Number Bright,\n                                                             cmsFloat64Number Contrast,\n                                                             cmsFloat64Number Hue,\n                                                             cmsFloat64Number Saturation,\n                                                             int TempSrc,\n                                                             int TempDest);\n\nCMSAPI cmsHPROFILE      CMSEXPORT cmsCreateBCHSWabstractProfile(int nLUTPoints,\n                                                             cmsFloat64Number Bright,\n                                                             cmsFloat64Number Contrast,\n                                                             cmsFloat64Number Hue,\n                                                             cmsFloat64Number Saturation,\n                                                             int TempSrc,\n                                                             int TempDest);\n\nCMSAPI cmsHPROFILE      CMSEXPORT cmsCreateNULLProfileTHR(cmsContext ContextID);\nCMSAPI cmsHPROFILE      CMSEXPORT cmsCreateNULLProfile(void);\n\n// Converts a transform to a devicelink profile\nCMSAPI cmsHPROFILE      CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat64Number Version, cmsUInt32Number dwFlags);\n\n// Intents ----------------------------------------------------------------------------------------------\n\n// ICC Intents\n#define INTENT_PERCEPTUAL                              0\n#define INTENT_RELATIVE_COLORIMETRIC                   1\n#define INTENT_SATURATION                              2\n#define INTENT_ABSOLUTE_COLORIMETRIC                   3\n\n// Non-ICC intents\n#define INTENT_PRESERVE_K_ONLY_PERCEPTUAL             10\n#define INTENT_PRESERVE_K_ONLY_RELATIVE_COLORIMETRIC  11\n#define INTENT_PRESERVE_K_ONLY_SATURATION             12\n#define INTENT_PRESERVE_K_PLANE_PERCEPTUAL            13\n#define INTENT_PRESERVE_K_PLANE_RELATIVE_COLORIMETRIC 14\n#define INTENT_PRESERVE_K_PLANE_SATURATION            15\n\n// Call with NULL as parameters to get the intent count\nCMSAPI cmsUInt32Number  CMSEXPORT cmsGetSupportedIntents(cmsUInt32Number nMax, cmsUInt32Number* Codes, char** Descriptions);\nCMSAPI cmsUInt32Number  CMSEXPORT cmsGetSupportedIntentsTHR(cmsContext ContextID, cmsUInt32Number nMax, cmsUInt32Number* Codes, char** Descriptions);\n\n// Flags\n\n#define cmsFLAGS_NOCACHE                  0x0040    // Inhibit 1-pixel cache\n#define cmsFLAGS_NOOPTIMIZE               0x0100    // Inhibit optimizations\n#define cmsFLAGS_NULLTRANSFORM            0x0200    // Don't transform anyway\n\n// Proofing flags\n#define cmsFLAGS_GAMUTCHECK               0x1000    // Out of Gamut alarm\n#define cmsFLAGS_SOFTPROOFING             0x4000    // Do softproofing\n\n// Misc\n#define cmsFLAGS_BLACKPOINTCOMPENSATION   0x2000\n#define cmsFLAGS_NOWHITEONWHITEFIXUP      0x0004    // Don't fix scum dot\n#define cmsFLAGS_HIGHRESPRECALC           0x0400    // Use more memory to give better accurancy\n#define cmsFLAGS_LOWRESPRECALC            0x0800    // Use less memory to minimize resouces\n\n// For devicelink creation\n#define cmsFLAGS_8BITS_DEVICELINK         0x0008   // Create 8 bits devicelinks\n#define cmsFLAGS_GUESSDEVICECLASS         0x0020   // Guess device class (for transform2devicelink)\n#define cmsFLAGS_KEEP_SEQUENCE            0x0080   // Keep profile sequence for devicelink creation\n\n// Specific to a particular optimizations\n#define cmsFLAGS_FORCE_CLUT               0x0002    // Force CLUT optimization\n#define cmsFLAGS_CLUT_POST_LINEARIZATION  0x0001    // create postlinearization tables if possible\n#define cmsFLAGS_CLUT_PRE_LINEARIZATION   0x0010    // create prelinearization tables if possible\n\n// Fine-tune control over number of gridpoints\n#define cmsFLAGS_GRIDPOINTS(n)           (((n) & 0xFF) << 16)\n\n// CRD special\n#define cmsFLAGS_NODEFAULTRESOURCEDEF     0x01000000\n\n// Transforms ---------------------------------------------------------------------------------------------------\n\nCMSAPI cmsHTRANSFORM    CMSEXPORT cmsCreateTransformTHR(cmsContext ContextID,\n                                                  cmsHPROFILE Input,\n                                                  cmsUInt32Number InputFormat,\n                                                  cmsHPROFILE Output,\n                                                  cmsUInt32Number OutputFormat,\n                                                  cmsUInt32Number Intent,\n                                                  cmsUInt32Number dwFlags);\n\nCMSAPI cmsHTRANSFORM    CMSEXPORT cmsCreateTransform(cmsHPROFILE Input,\n                                                  cmsUInt32Number InputFormat,\n                                                  cmsHPROFILE Output,\n                                                  cmsUInt32Number OutputFormat,\n                                                  cmsUInt32Number Intent,\n                                                  cmsUInt32Number dwFlags);\n\nCMSAPI cmsHTRANSFORM    CMSEXPORT cmsCreateProofingTransformTHR(cmsContext ContextID,\n                                                  cmsHPROFILE Input,\n                                                  cmsUInt32Number InputFormat,\n                                                  cmsHPROFILE Output,\n                                                  cmsUInt32Number OutputFormat,\n                                                  cmsHPROFILE Proofing,\n                                                  cmsUInt32Number Intent,\n                                                  cmsUInt32Number ProofingIntent,\n                                                  cmsUInt32Number dwFlags);\n\nCMSAPI cmsHTRANSFORM    CMSEXPORT cmsCreateProofingTransform(cmsHPROFILE Input,\n                                                  cmsUInt32Number InputFormat,\n                                                  cmsHPROFILE Output,\n                                                  cmsUInt32Number OutputFormat,\n                                                  cmsHPROFILE Proofing,\n                                                  cmsUInt32Number Intent,\n                                                  cmsUInt32Number ProofingIntent,\n                                                  cmsUInt32Number dwFlags);\n\nCMSAPI cmsHTRANSFORM    CMSEXPORT cmsCreateMultiprofileTransformTHR(cmsContext ContextID,\n                                                  cmsHPROFILE hProfiles[],\n                                                  cmsUInt32Number nProfiles,\n                                                  cmsUInt32Number InputFormat,\n                                                  cmsUInt32Number OutputFormat,\n                                                  cmsUInt32Number Intent,\n                                                  cmsUInt32Number dwFlags);\n\n\nCMSAPI cmsHTRANSFORM    CMSEXPORT cmsCreateMultiprofileTransform(cmsHPROFILE hProfiles[],\n                                                  cmsUInt32Number nProfiles,\n                                                  cmsUInt32Number InputFormat,\n                                                  cmsUInt32Number OutputFormat,\n                                                  cmsUInt32Number Intent,\n                                                  cmsUInt32Number dwFlags);\n\n\nCMSAPI cmsHTRANSFORM    CMSEXPORT cmsCreateExtendedTransform(cmsContext ContextID,\n                                                   cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[],\n                                                   cmsBool  BPC[],\n                                                   cmsUInt32Number Intents[],\n                                                   cmsFloat64Number AdaptationStates[],\n                                                   cmsHPROFILE hGamutProfile,\n                                                   cmsUInt32Number nGamutPCSposition,\n                                                   cmsUInt32Number InputFormat,\n                                                   cmsUInt32Number OutputFormat,\n                                                   cmsUInt32Number dwFlags);\n\nCMSAPI void             CMSEXPORT cmsDeleteTransform(cmsHTRANSFORM hTransform);\n\nCMSAPI void             CMSEXPORT cmsDoTransform(cmsHTRANSFORM Transform,\n                                                 const void * InputBuffer,\n                                                 void * OutputBuffer,\n                                                 cmsUInt32Number Size);\n\nCMSAPI void             CMSEXPORT cmsDoTransformStride(cmsHTRANSFORM Transform,\n                                                 const void * InputBuffer,\n                                                 void * OutputBuffer,\n                                                 cmsUInt32Number Size,\n                                                 cmsUInt32Number Stride);\n\n\nCMSAPI void             CMSEXPORT cmsSetAlarmCodes(const cmsUInt16Number NewAlarm[cmsMAXCHANNELS]);\nCMSAPI void             CMSEXPORT cmsGetAlarmCodes(cmsUInt16Number NewAlarm[cmsMAXCHANNELS]);\n\n\nCMSAPI void             CMSEXPORT cmsSetAlarmCodesTHR(cmsContext ContextID, \n                                                          const cmsUInt16Number AlarmCodes[cmsMAXCHANNELS]);\nCMSAPI void             CMSEXPORT cmsGetAlarmCodesTHR(cmsContext ContextID, \n                                                          cmsUInt16Number AlarmCodes[cmsMAXCHANNELS]);\n\n\n\n// Adaptation state for absolute colorimetric intent\nCMSAPI cmsFloat64Number CMSEXPORT cmsSetAdaptationState(cmsFloat64Number d);\nCMSAPI cmsFloat64Number CMSEXPORT cmsSetAdaptationStateTHR(cmsContext ContextID, cmsFloat64Number d);\n\n\n\n// Grab the ContextID from an open transform. Returns NULL if a NULL transform is passed\nCMSAPI cmsContext       CMSEXPORT cmsGetTransformContextID(cmsHTRANSFORM hTransform);\n\n// Grab the input/output formats\nCMSAPI cmsUInt32Number CMSEXPORT cmsGetTransformInputFormat(cmsHTRANSFORM hTransform);\nCMSAPI cmsUInt32Number CMSEXPORT cmsGetTransformOutputFormat(cmsHTRANSFORM hTransform);\n\n// For backwards compatibility\nCMSAPI cmsBool          CMSEXPORT cmsChangeBuffersFormat(cmsHTRANSFORM hTransform,\n                                                         cmsUInt32Number InputFormat,\n                                                         cmsUInt32Number OutputFormat);\n\n\n\n// PostScript ColorRenderingDictionary and ColorSpaceArray ----------------------------------------------------\n\ntypedef enum { cmsPS_RESOURCE_CSA, cmsPS_RESOURCE_CRD } cmsPSResourceType;\n\n// lcms2 unified method to access postscript color resources\nCMSAPI cmsUInt32Number  CMSEXPORT cmsGetPostScriptColorResource(cmsContext ContextID,\n                                                                cmsPSResourceType Type,\n                                                                cmsHPROFILE hProfile,\n                                                                cmsUInt32Number Intent,\n                                                                cmsUInt32Number dwFlags,\n                                                                cmsIOHANDLER* io);\n\nCMSAPI cmsUInt32Number  CMSEXPORT cmsGetPostScriptCSA(cmsContext ContextID, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, void* Buffer, cmsUInt32Number dwBufferLen);\nCMSAPI cmsUInt32Number  CMSEXPORT cmsGetPostScriptCRD(cmsContext ContextID, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, void* Buffer, cmsUInt32Number dwBufferLen);\n\n\n// IT8.7 / CGATS.17-200x handling -----------------------------------------------------------------------------\n\nCMSAPI cmsHANDLE        CMSEXPORT cmsIT8Alloc(cmsContext ContextID);\nCMSAPI void             CMSEXPORT cmsIT8Free(cmsHANDLE hIT8);\n\n// Tables\nCMSAPI cmsUInt32Number  CMSEXPORT cmsIT8TableCount(cmsHANDLE hIT8);\nCMSAPI cmsInt32Number   CMSEXPORT cmsIT8SetTable(cmsHANDLE hIT8, cmsUInt32Number nTable);\n\n// Persistence\nCMSAPI cmsHANDLE        CMSEXPORT cmsIT8LoadFromFile(cmsContext ContextID, const char* cFileName);\nCMSAPI cmsHANDLE        CMSEXPORT cmsIT8LoadFromMem(cmsContext ContextID, void *Ptr, cmsUInt32Number len);\n// CMSAPI cmsHANDLE        CMSEXPORT cmsIT8LoadFromIOhandler(cmsContext ContextID, cmsIOHANDLER* io);\n\nCMSAPI cmsBool          CMSEXPORT cmsIT8SaveToFile(cmsHANDLE hIT8, const char* cFileName);\nCMSAPI cmsBool          CMSEXPORT cmsIT8SaveToMem(cmsHANDLE hIT8, void *MemPtr, cmsUInt32Number* BytesNeeded);\n\n// Properties\nCMSAPI const char*      CMSEXPORT cmsIT8GetSheetType(cmsHANDLE hIT8);\nCMSAPI cmsBool          CMSEXPORT cmsIT8SetSheetType(cmsHANDLE hIT8, const char* Type);\n\nCMSAPI cmsBool          CMSEXPORT cmsIT8SetComment(cmsHANDLE hIT8, const char* cComment);\n\nCMSAPI cmsBool          CMSEXPORT cmsIT8SetPropertyStr(cmsHANDLE hIT8, const char* cProp, const char *Str);\nCMSAPI cmsBool          CMSEXPORT cmsIT8SetPropertyDbl(cmsHANDLE hIT8, const char* cProp, cmsFloat64Number Val);\nCMSAPI cmsBool          CMSEXPORT cmsIT8SetPropertyHex(cmsHANDLE hIT8, const char* cProp, cmsUInt32Number Val);\nCMSAPI cmsBool          CMSEXPORT cmsIT8SetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char* SubKey, const char *Buffer);\nCMSAPI cmsBool          CMSEXPORT cmsIT8SetPropertyUncooked(cmsHANDLE hIT8, const char* Key, const char* Buffer);\n\n\nCMSAPI const char*      CMSEXPORT cmsIT8GetProperty(cmsHANDLE hIT8, const char* cProp);\nCMSAPI cmsFloat64Number CMSEXPORT cmsIT8GetPropertyDbl(cmsHANDLE hIT8, const char* cProp);\nCMSAPI const char*      CMSEXPORT cmsIT8GetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char *SubKey);\nCMSAPI cmsUInt32Number  CMSEXPORT cmsIT8EnumProperties(cmsHANDLE hIT8, char ***PropertyNames);\nCMSAPI cmsUInt32Number  CMSEXPORT cmsIT8EnumPropertyMulti(cmsHANDLE hIT8, const char* cProp, const char ***SubpropertyNames);\n\n// Datasets\nCMSAPI const char*      CMSEXPORT cmsIT8GetDataRowCol(cmsHANDLE hIT8, int row, int col);\nCMSAPI cmsFloat64Number CMSEXPORT cmsIT8GetDataRowColDbl(cmsHANDLE hIT8, int row, int col);\n\nCMSAPI cmsBool          CMSEXPORT cmsIT8SetDataRowCol(cmsHANDLE hIT8, int row, int col,\n                                                const char* Val);\n\nCMSAPI cmsBool          CMSEXPORT cmsIT8SetDataRowColDbl(cmsHANDLE hIT8, int row, int col,\n                                                cmsFloat64Number Val);\n\nCMSAPI const char*      CMSEXPORT cmsIT8GetData(cmsHANDLE hIT8, const char* cPatch, const char* cSample);\n\n\nCMSAPI cmsFloat64Number CMSEXPORT cmsIT8GetDataDbl(cmsHANDLE hIT8, const char* cPatch, const char* cSample);\n\nCMSAPI cmsBool          CMSEXPORT cmsIT8SetData(cmsHANDLE hIT8, const char* cPatch,\n                                                const char* cSample,\n                                                const char *Val);\n\nCMSAPI cmsBool          CMSEXPORT cmsIT8SetDataDbl(cmsHANDLE hIT8, const char* cPatch,\n                                                const char* cSample,\n                                                cmsFloat64Number Val);\n\nCMSAPI int              CMSEXPORT cmsIT8FindDataFormat(cmsHANDLE hIT8, const char* cSample);\nCMSAPI cmsBool          CMSEXPORT cmsIT8SetDataFormat(cmsHANDLE hIT8, int n, const char *Sample);\nCMSAPI int              CMSEXPORT cmsIT8EnumDataFormat(cmsHANDLE hIT8, char ***SampleNames);\n\nCMSAPI const char*      CMSEXPORT cmsIT8GetPatchName(cmsHANDLE hIT8, int nPatch, char* buffer);\nCMSAPI int              CMSEXPORT cmsIT8GetPatchByName(cmsHANDLE hIT8, const char *cPatch);\n\n// The LABEL extension\nCMSAPI int              CMSEXPORT cmsIT8SetTableByLabel(cmsHANDLE hIT8, const char* cSet, const char* cField, const char* ExpectedType);\n\nCMSAPI cmsBool          CMSEXPORT cmsIT8SetIndexColumn(cmsHANDLE hIT8, const char* cSample);\n\n// Formatter for double\nCMSAPI void             CMSEXPORT cmsIT8DefineDblFormat(cmsHANDLE hIT8, const char* Formatter);\n\n// Gamut boundary description routines ------------------------------------------------------------------------------\n\nCMSAPI cmsHANDLE        CMSEXPORT cmsGBDAlloc(cmsContext ContextID);\nCMSAPI void             CMSEXPORT cmsGBDFree(cmsHANDLE hGBD);\nCMSAPI cmsBool          CMSEXPORT cmsGDBAddPoint(cmsHANDLE hGBD, const cmsCIELab* Lab);\nCMSAPI cmsBool          CMSEXPORT cmsGDBCompute(cmsHANDLE  hGDB, cmsUInt32Number dwFlags);\nCMSAPI cmsBool          CMSEXPORT cmsGDBCheckPoint(cmsHANDLE hGBD, const cmsCIELab* Lab);\n\n// Feature detection  ----------------------------------------------------------------------------------------------\n\n// Estimate the black point\nCMSAPI cmsBool          CMSEXPORT cmsDetectBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags);\nCMSAPI cmsBool          CMSEXPORT cmsDetectDestinationBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags);\n\n// Estimate total area coverage\nCMSAPI cmsFloat64Number CMSEXPORT cmsDetectTAC(cmsHPROFILE hProfile);\n\n\n// Poor man's gamut mapping\nCMSAPI cmsBool          CMSEXPORT cmsDesaturateLab(cmsCIELab* Lab,\n                                                   double amax, double amin,\n                                                   double bmax, double bmin);\n\n#ifndef CMS_USE_CPP_API\n#   ifdef __cplusplus\n    }\n#   endif\n#endif\n\n#define _lcms2_H\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/include/lcms2_plugin.h",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2011 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n//\n// This is the plug-in header file. Normal LittleCMS clients should not use it.\n// It is provided for plug-in writters that may want to access the support\n// functions to do low level operations. All plug-in related structures\n// are defined here. Including this file forces to include the standard API too.\n\n#ifndef _lcms_plugin_H\n\n// Deal with Microsoft's attempt at deprecating C standard runtime functions\n#ifdef _MSC_VER\n#    if (_MSC_VER >= 1400)\n#      ifndef _CRT_SECURE_NO_DEPRECATE\n#        define _CRT_SECURE_NO_DEPRECATE\n#      endif\n#      ifndef _CRT_SECURE_NO_WARNINGS\n#        define _CRT_SECURE_NO_WARNINGS\n#      endif\n#    endif\n#endif\n\n#ifndef _lcms2_H\n#include \"lcms2.h\"\n#endif\n\n// We need some standard C functions.\n#include <stdlib.h>\n#include <math.h>\n#include <stdarg.h>\n#include <memory.h>\n#include <string.h>\n\n\n#ifndef CMS_USE_CPP_API\n#   ifdef __cplusplus\nextern \"C\" {\n#   endif\n#endif\n\n// Vector & Matrix operations -----------------------------------------------------------------------\n\n// Axis of the matrix/array. No specific meaning at all.\n#define VX      0\n#define VY      1\n#define VZ      2\n\n// Vectors\ntypedef struct {\n    cmsFloat64Number n[3];\n\n    } cmsVEC3;\n\n// 3x3 Matrix\ntypedef struct {\n    cmsVEC3 v[3];\n\n    } cmsMAT3;\n\nCMSAPI void               CMSEXPORT _cmsVEC3init(cmsVEC3* r, cmsFloat64Number x, cmsFloat64Number y, cmsFloat64Number z);\nCMSAPI void               CMSEXPORT _cmsVEC3minus(cmsVEC3* r, const cmsVEC3* a, const cmsVEC3* b);\nCMSAPI void               CMSEXPORT _cmsVEC3cross(cmsVEC3* r, const cmsVEC3* u, const cmsVEC3* v);\nCMSAPI cmsFloat64Number   CMSEXPORT _cmsVEC3dot(const cmsVEC3* u, const cmsVEC3* v);\nCMSAPI cmsFloat64Number   CMSEXPORT _cmsVEC3length(const cmsVEC3* a);\nCMSAPI cmsFloat64Number   CMSEXPORT _cmsVEC3distance(const cmsVEC3* a, const cmsVEC3* b);\n\nCMSAPI void               CMSEXPORT _cmsMAT3identity(cmsMAT3* a);\nCMSAPI cmsBool            CMSEXPORT _cmsMAT3isIdentity(const cmsMAT3* a);\nCMSAPI void               CMSEXPORT _cmsMAT3per(cmsMAT3* r, const cmsMAT3* a, const cmsMAT3* b);\nCMSAPI cmsBool            CMSEXPORT _cmsMAT3inverse(const cmsMAT3* a, cmsMAT3* b);\nCMSAPI cmsBool            CMSEXPORT _cmsMAT3solve(cmsVEC3* x, cmsMAT3* a, cmsVEC3* b);\nCMSAPI void               CMSEXPORT _cmsMAT3eval(cmsVEC3* r, const cmsMAT3* a, const cmsVEC3* v);\n\n\n// Error logging  -------------------------------------------------------------------------------------\n\nCMSAPI void               CMSEXPORT  cmsSignalError(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *ErrorText, ...);\n\n// Memory management ----------------------------------------------------------------------------------\n\nCMSAPI void*              CMSEXPORT _cmsMalloc(cmsContext ContextID, cmsUInt32Number size);\nCMSAPI void*              CMSEXPORT _cmsMallocZero(cmsContext ContextID, cmsUInt32Number size);\nCMSAPI void*              CMSEXPORT _cmsCalloc(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size);\nCMSAPI void*              CMSEXPORT _cmsRealloc(cmsContext ContextID, void* Ptr, cmsUInt32Number NewSize);\nCMSAPI void               CMSEXPORT _cmsFree(cmsContext ContextID, void* Ptr);\nCMSAPI void*              CMSEXPORT _cmsDupMem(cmsContext ContextID, const void* Org, cmsUInt32Number size);\n\n// I/O handler ----------------------------------------------------------------------------------\n\nstruct _cms_io_handler {\n\n    void* stream;   // Associated stream, which is implemented differently depending on media.\n\n    cmsContext        ContextID;\n    cmsUInt32Number   UsedSpace;\n    cmsUInt32Number   ReportedSize;\n    char              PhysicalFile[cmsMAX_PATH];\n\n    cmsUInt32Number   (* Read)(struct _cms_io_handler* iohandler, void *Buffer,\n                                                                  cmsUInt32Number size,\n                                                                  cmsUInt32Number count);\n    cmsBool           (* Seek)(struct _cms_io_handler* iohandler, cmsUInt32Number offset);\n    cmsBool           (* Close)(struct _cms_io_handler* iohandler);\n    cmsUInt32Number   (* Tell)(struct _cms_io_handler* iohandler);\n    cmsBool           (* Write)(struct _cms_io_handler* iohandler, cmsUInt32Number size,\n                                                                   const void* Buffer);\n};\n\n// Endianess adjust functions\nCMSAPI cmsUInt16Number   CMSEXPORT  _cmsAdjustEndianess16(cmsUInt16Number Word);\nCMSAPI cmsUInt32Number   CMSEXPORT  _cmsAdjustEndianess32(cmsUInt32Number Value);\nCMSAPI void              CMSEXPORT  _cmsAdjustEndianess64(cmsUInt64Number* Result, cmsUInt64Number* QWord);\n\n// Helper IO functions\nCMSAPI cmsBool           CMSEXPORT  _cmsReadUInt8Number(cmsIOHANDLER* io,  cmsUInt8Number* n);\nCMSAPI cmsBool           CMSEXPORT  _cmsReadUInt16Number(cmsIOHANDLER* io, cmsUInt16Number* n);\nCMSAPI cmsBool           CMSEXPORT  _cmsReadUInt32Number(cmsIOHANDLER* io, cmsUInt32Number* n);\nCMSAPI cmsBool           CMSEXPORT  _cmsReadFloat32Number(cmsIOHANDLER* io, cmsFloat32Number* n);\nCMSAPI cmsBool           CMSEXPORT  _cmsReadUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n);\nCMSAPI cmsBool           CMSEXPORT  _cmsRead15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number* n);\nCMSAPI cmsBool           CMSEXPORT  _cmsReadXYZNumber(cmsIOHANDLER* io, cmsCIEXYZ* XYZ);\nCMSAPI cmsBool           CMSEXPORT  _cmsReadUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, cmsUInt16Number* Array);\n\nCMSAPI cmsBool           CMSEXPORT  _cmsWriteUInt8Number(cmsIOHANDLER* io, cmsUInt8Number n);\nCMSAPI cmsBool           CMSEXPORT  _cmsWriteUInt16Number(cmsIOHANDLER* io, cmsUInt16Number n);\nCMSAPI cmsBool           CMSEXPORT  _cmsWriteUInt32Number(cmsIOHANDLER* io, cmsUInt32Number n);\nCMSAPI cmsBool           CMSEXPORT  _cmsWriteFloat32Number(cmsIOHANDLER* io, cmsFloat32Number n);\nCMSAPI cmsBool           CMSEXPORT  _cmsWriteUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n);\nCMSAPI cmsBool           CMSEXPORT  _cmsWrite15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number n);\nCMSAPI cmsBool           CMSEXPORT  _cmsWriteXYZNumber(cmsIOHANDLER* io, const cmsCIEXYZ* XYZ);\nCMSAPI cmsBool           CMSEXPORT  _cmsWriteUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, const cmsUInt16Number* Array);\n\n// ICC base tag\ntypedef struct {\n    cmsTagTypeSignature  sig;\n    cmsInt8Number        reserved[4];\n\n} _cmsTagBase;\n\n// Type base helper functions\nCMSAPI cmsTagTypeSignature  CMSEXPORT _cmsReadTypeBase(cmsIOHANDLER* io);\nCMSAPI cmsBool              CMSEXPORT _cmsWriteTypeBase(cmsIOHANDLER* io, cmsTagTypeSignature sig);\n\n// Alignment functions\nCMSAPI cmsBool             CMSEXPORT _cmsReadAlignment(cmsIOHANDLER* io);\nCMSAPI cmsBool             CMSEXPORT _cmsWriteAlignment(cmsIOHANDLER* io);\n\n// To deal with text streams. 2K at most\nCMSAPI cmsBool             CMSEXPORT _cmsIOPrintf(cmsIOHANDLER* io, const char* frm, ...);\n\n// Fixed point helper functions\nCMSAPI cmsFloat64Number    CMSEXPORT _cms8Fixed8toDouble(cmsUInt16Number fixed8);\nCMSAPI cmsUInt16Number     CMSEXPORT _cmsDoubleTo8Fixed8(cmsFloat64Number val);\n\nCMSAPI cmsFloat64Number    CMSEXPORT _cms15Fixed16toDouble(cmsS15Fixed16Number fix32);\nCMSAPI cmsS15Fixed16Number CMSEXPORT _cmsDoubleTo15Fixed16(cmsFloat64Number v);\n\n// Date/time helper functions\nCMSAPI void                CMSEXPORT _cmsEncodeDateTimeNumber(cmsDateTimeNumber *Dest, const struct tm *Source);\nCMSAPI void                CMSEXPORT _cmsDecodeDateTimeNumber(const cmsDateTimeNumber *Source, struct tm *Dest);\n\n//----------------------------------------------------------------------------------------------------------\n\n// Shared callbacks for user data\ntypedef void     (* _cmsFreeUserDataFn)(cmsContext ContextID, void* Data);\ntypedef void*    (* _cmsDupUserDataFn)(cmsContext ContextID, const void* Data);\n\n//----------------------------------------------------------------------------------------------------------\n\n// Plug-in foundation\n#define cmsPluginMagicNumber                 0x61637070     // 'acpp'\n\n#define cmsPluginMemHandlerSig               0x6D656D48     // 'memH'\n#define cmsPluginInterpolationSig            0x696E7048     // 'inpH'\n#define cmsPluginParametricCurveSig          0x70617248     // 'parH'\n#define cmsPluginFormattersSig               0x66726D48     // 'frmH\n#define cmsPluginTagTypeSig                  0x74797048     // 'typH'\n#define cmsPluginTagSig                      0x74616748     // 'tagH'\n#define cmsPluginRenderingIntentSig          0x696E7448     // 'intH'\n#define cmsPluginMultiProcessElementSig      0x6D706548     // 'mpeH'\n#define cmsPluginOptimizationSig             0x6F707448     // 'optH'\n#define cmsPluginTransformSig                0x7A666D48     // 'xfmH'\n#define cmsPluginMutexSig                    0x6D747A48     // 'mtxH'\n\ntypedef struct _cmsPluginBaseStruct {\n\n        cmsUInt32Number                Magic;               // 'acpp' signature\n        cmsUInt32Number                ExpectedVersion;     // Expected version of LittleCMS\n        cmsUInt32Number                Type;                // Type of plug-in\n        struct _cmsPluginBaseStruct*   Next;                // For multiple plugin definition. NULL for end of list.\n\n} cmsPluginBase;\n\n// Maximum number of types in a plugin array\n#define MAX_TYPES_IN_LCMS_PLUGIN    20\n\n//----------------------------------------------------------------------------------------------------------\n\n// Memory handler. Each new plug-in type replaces current behaviour\n\ntypedef void* (* _cmsMallocFnPtrType)(cmsContext ContextID, cmsUInt32Number size); \ntypedef void  (* _cmsFreeFnPtrType)(cmsContext ContextID, void *Ptr);\ntypedef void* (* _cmsReallocFnPtrType)(cmsContext ContextID, void* Ptr, cmsUInt32Number NewSize);\n\ntypedef void* (* _cmsMalloZerocFnPtrType)(cmsContext ContextID, cmsUInt32Number size); \ntypedef void* (* _cmsCallocFnPtrType)(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size);\ntypedef void* (* _cmsDupFnPtrType)(cmsContext ContextID, const void* Org, cmsUInt32Number size);\n\ntypedef struct {\n\n        cmsPluginBase base;\n\n        // Required\n        _cmsMallocFnPtrType  MallocPtr;\n        _cmsFreeFnPtrType    FreePtr;\n        _cmsReallocFnPtrType ReallocPtr;\n\n        // Optional\n       _cmsMalloZerocFnPtrType MallocZeroPtr;\n       _cmsCallocFnPtrType     CallocPtr;\n       _cmsDupFnPtrType        DupPtr;\n\n} cmsPluginMemHandler;\n\n\n// ------------------------------------------------------------------------------------------------------------------\n\n// Interpolation. 16 bits and floating point versions.\nstruct _cms_interp_struc;\n\n// Interpolation callbacks\n\n// 16 bits forward interpolation. This function performs precision-limited linear interpolation\n// and is supposed to be quite fast. Implementation may be tetrahedral or trilinear, and plug-ins may\n// choose to implement any other interpolation algorithm.\ntypedef void (* _cmsInterpFn16)(register const cmsUInt16Number Input[],\n                                register cmsUInt16Number Output[],\n                                register const struct _cms_interp_struc* p);\n\n// Floating point forward interpolation. Full precision interpolation using floats. This is not a\n// time critical function. Implementation may be tetrahedral or trilinear, and plug-ins may\n// choose to implement any other interpolation algorithm.\ntypedef void (* _cmsInterpFnFloat)(cmsFloat32Number const Input[],\n                                   cmsFloat32Number Output[],\n                                   const struct _cms_interp_struc* p);\n\n\n\n// This type holds a pointer to an interpolator that can be either 16 bits or float\ntypedef union {\n    _cmsInterpFn16       Lerp16;            // Forward interpolation in 16 bits\n    _cmsInterpFnFloat    LerpFloat;         // Forward interpolation in floating point\n} cmsInterpFunction;\n\n// Flags for interpolator selection\n#define CMS_LERP_FLAGS_16BITS             0x0000        // The default\n#define CMS_LERP_FLAGS_FLOAT              0x0001        // Requires different implementation\n#define CMS_LERP_FLAGS_TRILINEAR          0x0100        // Hint only\n\n\n#define MAX_INPUT_DIMENSIONS 8\n\ntypedef struct _cms_interp_struc {  // Used on all interpolations. Supplied by lcms2 when calling the interpolation function\n\n    cmsContext ContextID;     // The calling thread\n\n    cmsUInt32Number dwFlags;  // Keep original flags\n    cmsUInt32Number nInputs;  // != 1 only in 3D interpolation\n    cmsUInt32Number nOutputs; // != 1 only in 3D interpolation\n\n    cmsUInt32Number nSamples[MAX_INPUT_DIMENSIONS];  // Valid on all kinds of tables\n    cmsUInt32Number Domain[MAX_INPUT_DIMENSIONS];    // Domain = nSamples - 1\n\n    cmsUInt32Number opta[MAX_INPUT_DIMENSIONS];     // Optimization for 3D CLUT. This is the number of nodes premultiplied for each\n                                                    // dimension. For example, in 7 nodes, 7, 7^2 , 7^3, 7^4, etc. On non-regular\n                                                    // Samplings may vary according of the number of nodes for each dimension.\n\n    const void *Table;                // Points to the actual interpolation table\n    cmsInterpFunction Interpolation;  // Points to the function to do the interpolation\n\n } cmsInterpParams;\n\n// Interpolators factory\ntypedef cmsInterpFunction (* cmsInterpFnFactory)(cmsUInt32Number nInputChannels, cmsUInt32Number nOutputChannels, cmsUInt32Number dwFlags);\n\n// The plug-in\ntypedef struct {\n    cmsPluginBase base;\n\n    // Points to a user-supplied function which implements the factory\n    cmsInterpFnFactory InterpolatorsFactory;\n\n} cmsPluginInterpolation;\n\n//----------------------------------------------------------------------------------------------------------\n\n// Parametric curves. A negative type means same function but analytically inverted. Max. number of params is 10\n\n// Evaluator callback for user-suplied parametric curves. May implement more than one type\ntypedef  cmsFloat64Number (* cmsParametricCurveEvaluator)(cmsInt32Number Type, const cmsFloat64Number Params[10], cmsFloat64Number R);\n\n// Plug-in may implement an arbitrary number of parametric curves\ntypedef struct {\n    cmsPluginBase base;\n\n    cmsUInt32Number nFunctions;                                     // Number of supported functions\n    cmsUInt32Number FunctionTypes[MAX_TYPES_IN_LCMS_PLUGIN];        // The identification types\n    cmsUInt32Number ParameterCount[MAX_TYPES_IN_LCMS_PLUGIN];       // Number of parameters for each function\n\n    cmsParametricCurveEvaluator    Evaluator;                       // The evaluator\n\n} cmsPluginParametricCurves;\n//----------------------------------------------------------------------------------------------------------\n\n// Formatters. This plug-in adds new handlers, replacing them if they already exist. Formatters dealing with\n// cmsFloat32Number (bps = 4) or double (bps = 0) types are requested via FormatterFloat callback. Others come across\n// Formatter16 callback\n\nstruct _cmstransform_struct;\n\ntypedef cmsUInt8Number* (* cmsFormatter16)(register struct _cmstransform_struct* CMMcargo,\n                                           register cmsUInt16Number Values[],\n                                           register cmsUInt8Number*  Buffer,\n                                           register cmsUInt32Number  Stride);\n\ntypedef cmsUInt8Number* (* cmsFormatterFloat)(struct _cmstransform_struct* CMMcargo,\n                                              cmsFloat32Number Values[],\n                                              cmsUInt8Number*  Buffer,\n                                              cmsUInt32Number  Stride);\n\n// This type holds a pointer to a formatter that can be either 16 bits or cmsFloat32Number\ntypedef union {\n    cmsFormatter16    Fmt16;\n    cmsFormatterFloat FmtFloat;\n\n} cmsFormatter;\n\n#define CMS_PACK_FLAGS_16BITS       0x0000\n#define CMS_PACK_FLAGS_FLOAT        0x0001\n\ntypedef enum { cmsFormatterInput=0, cmsFormatterOutput=1 } cmsFormatterDirection;\n\ntypedef cmsFormatter (* cmsFormatterFactory)(cmsUInt32Number Type,           // Specific type, i.e. TYPE_RGB_8\n                                             cmsFormatterDirection Dir,\n                                             cmsUInt32Number dwFlags);      // precision\n\n// Plug-in may implement an arbitrary number of formatters\ntypedef struct {\n    cmsPluginBase          base;\n    cmsFormatterFactory    FormattersFactory;\n\n} cmsPluginFormatters;\n\n//----------------------------------------------------------------------------------------------------------\n\n// Tag type handler. Each type is free to return anything it wants, and it is up to the caller to\n// know in advance what is the type contained in the tag.\ntypedef struct _cms_typehandler_struct {\n\n        cmsTagTypeSignature Signature;     // The signature of the type\n\n        // Allocates and reads items\n        void *   (* ReadPtr)(struct _cms_typehandler_struct* self,\n                             cmsIOHANDLER*      io,\n                             cmsUInt32Number*   nItems,\n                             cmsUInt32Number    SizeOfTag);\n\n        // Writes n Items\n        cmsBool  (* WritePtr)(struct _cms_typehandler_struct* self,\n                              cmsIOHANDLER*     io,\n                              void*             Ptr,\n                              cmsUInt32Number   nItems);\n\n        // Duplicate an item or array of items\n        void*   (* DupPtr)(struct _cms_typehandler_struct* self,\n                           const void *Ptr,\n                           cmsUInt32Number n);\n\n        // Free all resources\n        void    (* FreePtr)(struct _cms_typehandler_struct* self,\n                            void *Ptr);\n\n        // Additional parameters used by the calling thread\n        cmsContext       ContextID;\n        cmsUInt32Number  ICCVersion;\n\n} cmsTagTypeHandler;\n\n// Each plug-in implements a single type\ntypedef struct {\n        cmsPluginBase      base;\n        cmsTagTypeHandler  Handler;\n\n} cmsPluginTagType;\n\n//----------------------------------------------------------------------------------------------------------\n\n// This is the tag plugin, which identifies tags. For writing, a pointer to function is provided.\n// This function should return the desired type for this tag, given the version of profile\n// and the data being serialized.\ntypedef struct {\n\n    cmsUInt32Number     ElemCount;          // If this tag needs an array, how many elements should keep\n\n    // For reading.\n    cmsUInt32Number     nSupportedTypes;    // In how many types this tag can come (MAX_TYPES_IN_LCMS_PLUGIN maximum)\n    cmsTagTypeSignature SupportedTypes[MAX_TYPES_IN_LCMS_PLUGIN];\n\n    // For writting\n    cmsTagTypeSignature (* DecideType)(cmsFloat64Number ICCVersion, const void *Data);\n\n} cmsTagDescriptor;\n\n// Plug-in implements a single tag\ntypedef struct {\n    cmsPluginBase    base;\n\n    cmsTagSignature  Signature;\n    cmsTagDescriptor Descriptor;\n\n} cmsPluginTag;\n\n//----------------------------------------------------------------------------------------------------------\n\n// Custom intents. This function should join all profiles specified in the array in\n// a single LUT. Any custom intent in the chain redirects to custom function. If more than\n// one custom intent is found, the one located first is invoked. Usually users should use only one\n// custom intent, so mixing custom intents in same multiprofile transform is not supported.\n\ntypedef cmsPipeline* (* cmsIntentFn)( cmsContext       ContextID,\n                                      cmsUInt32Number  nProfiles,\n                                      cmsUInt32Number  Intents[],\n                                      cmsHPROFILE      hProfiles[],\n                                      cmsBool          BPC[],\n                                      cmsFloat64Number AdaptationStates[],\n                                      cmsUInt32Number  dwFlags);\n\n\n// Each plug-in defines a single intent number.\ntypedef struct {\n    cmsPluginBase     base;\n    cmsUInt32Number   Intent;\n    cmsIntentFn       Link;\n    char              Description[256];\n\n} cmsPluginRenderingIntent;\n\n\n// The default ICC intents (perceptual, saturation, rel.col and abs.col)\nCMSAPI cmsPipeline*  CMSEXPORT _cmsDefaultICCintents(cmsContext       ContextID,\n                                                     cmsUInt32Number  nProfiles,\n                                                     cmsUInt32Number  Intents[],\n                                                     cmsHPROFILE      hProfiles[],\n                                                     cmsBool          BPC[],\n                                                     cmsFloat64Number AdaptationStates[],\n                                                     cmsUInt32Number  dwFlags);\n\n\n//----------------------------------------------------------------------------------------------------------\n\n// Pipelines, Multi Process Elements.\n\ntypedef void (* _cmsStageEvalFn)     (const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage* mpe);\ntypedef void*(* _cmsStageDupElemFn)  (cmsStage* mpe);\ntypedef void (* _cmsStageFreeElemFn) (cmsStage* mpe);\n\n\n// This function allocates a generic MPE\nCMSAPI cmsStage* CMSEXPORT _cmsStageAllocPlaceholder(cmsContext ContextID,\n                                cmsStageSignature     Type,\n                                cmsUInt32Number       InputChannels,\n                                cmsUInt32Number       OutputChannels,\n                                _cmsStageEvalFn       EvalPtr,            // Points to fn that evaluates the element (always in floating point)\n                                _cmsStageDupElemFn    DupElemPtr,         // Points to a fn that duplicates the stage\n                                _cmsStageFreeElemFn   FreePtr,            // Points to a fn that sets the element free\n                                void*                 Data);              // A generic pointer to whatever memory needed by the element\ntypedef struct {\n      cmsPluginBase     base;\n      cmsTagTypeHandler Handler;\n\n}  cmsPluginMultiProcessElement;\n\n\n// Data kept in \"Element\" member of cmsStage\n\n// Curves\ntypedef struct {\n    cmsUInt32Number nCurves;\n    cmsToneCurve**  TheCurves;\n\n} _cmsStageToneCurvesData;\n\n// Matrix\ntypedef struct {\n    cmsFloat64Number*  Double;          // floating point for the matrix\n    cmsFloat64Number*  Offset;          // The offset\n\n} _cmsStageMatrixData;\n\n// CLUT\ntypedef struct {\n\n    union {                       // Can have only one of both representations at same time\n        cmsUInt16Number*  T;      // Points to the table 16 bits table\n        cmsFloat32Number* TFloat; // Points to the cmsFloat32Number table\n\n    } Tab;\n\n    cmsInterpParams* Params;\n    cmsUInt32Number  nEntries;\n    cmsBool          HasFloatValues;\n\n} _cmsStageCLutData;\n\n\n//----------------------------------------------------------------------------------------------------------\n// Optimization. Using this plug-in, additional optimization strategies may be implemented.\n// The function should return TRUE if any optimization is done on the LUT, this terminates\n// the optimization  search. Or FALSE if it is unable to optimize and want to give a chance\n// to the rest of optimizers.\n\ntypedef void     (* _cmsOPTeval16Fn)(register const cmsUInt16Number In[],\n                                     register cmsUInt16Number Out[],\n                                     register const void* Data);\n\n\ntypedef cmsBool  (* _cmsOPToptimizeFn)(cmsPipeline** Lut,\n                                       cmsUInt32Number  Intent,\n                                       cmsUInt32Number* InputFormat,\n                                       cmsUInt32Number* OutputFormat,\n                                       cmsUInt32Number* dwFlags);\n\n// This function may be used to set the optional evaluator and a block of private data. If private data is being used, an optional\n// duplicator and free functions should also be specified in order to duplicate the LUT construct. Use NULL to inhibit such functionality.\n\nCMSAPI void CMSEXPORT _cmsPipelineSetOptimizationParameters(cmsPipeline* Lut,\n                                               _cmsOPTeval16Fn Eval16,\n                                               void* PrivateData,\n                                               _cmsFreeUserDataFn FreePrivateDataFn,\n                                               _cmsDupUserDataFn DupPrivateDataFn);\n\ntypedef struct {\n      cmsPluginBase     base;\n\n      // Optimize entry point\n      _cmsOPToptimizeFn  OptimizePtr;\n\n}  cmsPluginOptimization;\n\n//----------------------------------------------------------------------------------------------------------\n// Full xform\ntypedef void     (* _cmsTransformFn)(struct _cmstransform_struct *CMMcargo,\n                                     const void* InputBuffer,\n                                     void* OutputBuffer,\n                                     cmsUInt32Number Size,\n                                     cmsUInt32Number Stride);\n\ntypedef cmsBool  (* _cmsTransformFactory)(_cmsTransformFn* xform,\n                                         void** UserData,\n                                         _cmsFreeUserDataFn* FreePrivateDataFn,\n                                         cmsPipeline** Lut,\n                                         cmsUInt32Number* InputFormat,\n                                         cmsUInt32Number* OutputFormat,\n                                         cmsUInt32Number* dwFlags);\n\n\n// Retrieve user data as specified by the factory\nCMSAPI void   CMSEXPORT _cmsSetTransformUserData(struct _cmstransform_struct *CMMcargo, void* ptr, _cmsFreeUserDataFn FreePrivateDataFn);\nCMSAPI void * CMSEXPORT _cmsGetTransformUserData(struct _cmstransform_struct *CMMcargo);\n\n\n// Retrieve formatters\nCMSAPI void   CMSEXPORT _cmsGetTransformFormatters16   (struct _cmstransform_struct *CMMcargo, cmsFormatter16* FromInput, cmsFormatter16* ToOutput);\nCMSAPI void   CMSEXPORT _cmsGetTransformFormattersFloat(struct _cmstransform_struct *CMMcargo, cmsFormatterFloat* FromInput, cmsFormatterFloat* ToOutput);\n\ntypedef struct {\n      cmsPluginBase     base;\n\n      // Transform entry point\n      _cmsTransformFactory  Factory;\n\n}  cmsPluginTransform;\n\n//----------------------------------------------------------------------------------------------------------\n// Mutex \n\ntypedef void*    (* _cmsCreateMutexFnPtrType)(cmsContext ContextID);\ntypedef void     (* _cmsDestroyMutexFnPtrType)(cmsContext ContextID, void* mtx);\ntypedef cmsBool  (* _cmsLockMutexFnPtrType)(cmsContext ContextID, void* mtx);\ntypedef void     (* _cmsUnlockMutexFnPtrType)(cmsContext ContextID, void* mtx);\n\ntypedef struct {\n      cmsPluginBase     base;\n\n     _cmsCreateMutexFnPtrType  CreateMutexPtr;\n     _cmsDestroyMutexFnPtrType DestroyMutexPtr;\n     _cmsLockMutexFnPtrType    LockMutexPtr;\n     _cmsUnlockMutexFnPtrType  UnlockMutexPtr;\n\n}  cmsPluginMutex;\n\nCMSAPI void*   CMSEXPORT _cmsCreateMutex(cmsContext ContextID);\nCMSAPI void    CMSEXPORT _cmsDestroyMutex(cmsContext ContextID, void* mtx);\nCMSAPI cmsBool CMSEXPORT _cmsLockMutex(cmsContext ContextID, void* mtx);\nCMSAPI void    CMSEXPORT _cmsUnlockMutex(cmsContext ContextID, void* mtx);\n\n\n#ifndef CMS_USE_CPP_API\n#   ifdef __cplusplus\n    }\n#   endif\n#endif\n\n#define _lcms_plugin_H\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/src/cmscam02.c",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2012 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n//\n\n#include \"lcms2_internal.h\"\n\n// CIECAM 02 appearance model. Many thanks to Jordi Vilar for the debugging.\n\n// ---------- Implementation --------------------------------------------\n\ntypedef struct  {\n\n    cmsFloat64Number XYZ[3];\n    cmsFloat64Number RGB[3];\n    cmsFloat64Number RGBc[3];\n    cmsFloat64Number RGBp[3];\n    cmsFloat64Number RGBpa[3];\n    cmsFloat64Number a, b, h, e, H, A, J, Q, s, t, C, M;\n    cmsFloat64Number abC[2];\n    cmsFloat64Number abs[2];\n    cmsFloat64Number abM[2];\n\n} CAM02COLOR;\n\ntypedef struct  {\n\n    CAM02COLOR adoptedWhite;\n    cmsFloat64Number LA, Yb;\n    cmsFloat64Number F, c, Nc;\n    cmsUInt32Number surround;\n    cmsFloat64Number n, Nbb, Ncb, z, FL, D;\n\n    cmsContext ContextID;\n\n} cmsCIECAM02;\n\n\nstatic\ncmsFloat64Number compute_n(cmsCIECAM02* pMod)\n{\n    return (pMod -> Yb / pMod -> adoptedWhite.XYZ[1]);\n}\n\nstatic\ncmsFloat64Number compute_z(cmsCIECAM02* pMod)\n{\n    return (1.48 + pow(pMod -> n, 0.5));\n}\n\nstatic\ncmsFloat64Number computeNbb(cmsCIECAM02* pMod)\n{\n    return (0.725 * pow((1.0 / pMod -> n), 0.2));\n}\n\nstatic\ncmsFloat64Number computeFL(cmsCIECAM02* pMod)\n{\n    cmsFloat64Number k, FL;\n\n    k = 1.0 / ((5.0 * pMod->LA) + 1.0);\n    FL = 0.2 * pow(k, 4.0) * (5.0 * pMod->LA) + 0.1 *\n        (pow((1.0 - pow(k, 4.0)), 2.0)) *\n        (pow((5.0 * pMod->LA), (1.0 / 3.0)));\n\n    return FL;\n}\n\nstatic\ncmsFloat64Number computeD(cmsCIECAM02* pMod)\n{\n    cmsFloat64Number D;\n\n    D = pMod->F - (1.0/3.6)*(exp(((-pMod ->LA-42) / 92.0)));\n\n    return D;\n}\n\n\nstatic\nCAM02COLOR XYZtoCAT02(CAM02COLOR clr)\n{\n    clr.RGB[0] = (clr.XYZ[0] *  0.7328) + (clr.XYZ[1] *  0.4296) + (clr.XYZ[2] * -0.1624);\n    clr.RGB[1] = (clr.XYZ[0] * -0.7036) + (clr.XYZ[1] *  1.6975) + (clr.XYZ[2] *  0.0061);\n    clr.RGB[2] = (clr.XYZ[0] *  0.0030) + (clr.XYZ[1] *  0.0136) + (clr.XYZ[2] *  0.9834);\n\n    return clr;\n}\n\nstatic\nCAM02COLOR ChromaticAdaptation(CAM02COLOR clr, cmsCIECAM02* pMod)\n{\n    cmsUInt32Number i;\n\n    for (i = 0; i < 3; i++) {\n        clr.RGBc[i] = ((pMod -> adoptedWhite.XYZ[1] *\n            (pMod->D / pMod -> adoptedWhite.RGB[i])) +\n            (1.0 - pMod->D)) * clr.RGB[i];\n    }\n\n    return clr;\n}\n\n\nstatic\nCAM02COLOR CAT02toHPE(CAM02COLOR clr)\n{\n    cmsFloat64Number M[9];\n\n    M[0] =(( 0.38971 *  1.096124) + (0.68898 * 0.454369) + (-0.07868 * -0.009628));\n    M[1] =(( 0.38971 * -0.278869) + (0.68898 * 0.473533) + (-0.07868 * -0.005698));\n    M[2] =(( 0.38971 *  0.182745) + (0.68898 * 0.072098) + (-0.07868 *  1.015326));\n    M[3] =((-0.22981 *  1.096124) + (1.18340 * 0.454369) + ( 0.04641 * -0.009628));\n    M[4] =((-0.22981 * -0.278869) + (1.18340 * 0.473533) + ( 0.04641 * -0.005698));\n    M[5] =((-0.22981 *  0.182745) + (1.18340 * 0.072098) + ( 0.04641 *  1.015326));\n    M[6] =(-0.009628);\n    M[7] =(-0.005698);\n    M[8] =( 1.015326);\n\n    clr.RGBp[0] = (clr.RGBc[0] * M[0]) +  (clr.RGBc[1] * M[1]) + (clr.RGBc[2] * M[2]);\n    clr.RGBp[1] = (clr.RGBc[0] * M[3]) +  (clr.RGBc[1] * M[4]) + (clr.RGBc[2] * M[5]);\n    clr.RGBp[2] = (clr.RGBc[0] * M[6]) +  (clr.RGBc[1] * M[7]) + (clr.RGBc[2] * M[8]);\n\n    return  clr;\n}\n\nstatic\nCAM02COLOR NonlinearCompression(CAM02COLOR clr, cmsCIECAM02* pMod)\n{\n    cmsUInt32Number i;\n    cmsFloat64Number temp;\n\n    for (i = 0; i < 3; i++) {\n        if (clr.RGBp[i] < 0) {\n\n            temp = pow((-1.0 * pMod->FL * clr.RGBp[i] / 100.0), 0.42);\n            clr.RGBpa[i] = (-1.0 * 400.0 * temp) / (temp + 27.13) + 0.1;\n        }\n        else {\n            temp = pow((pMod->FL * clr.RGBp[i] / 100.0), 0.42);\n            clr.RGBpa[i] = (400.0 * temp) / (temp + 27.13) + 0.1;\n        }\n    }\n\n    clr.A = (((2.0 * clr.RGBpa[0]) + clr.RGBpa[1] +\n        (clr.RGBpa[2] / 20.0)) - 0.305) * pMod->Nbb;\n\n    return clr;\n}\n\nstatic\nCAM02COLOR ComputeCorrelates(CAM02COLOR clr, cmsCIECAM02* pMod)\n{\n    cmsFloat64Number a, b, temp, e, t, r2d, d2r;\n\n    a = clr.RGBpa[0] - (12.0 * clr.RGBpa[1] / 11.0) + (clr.RGBpa[2] / 11.0);\n    b = (clr.RGBpa[0] + clr.RGBpa[1] - (2.0 * clr.RGBpa[2])) / 9.0;\n\n    r2d = (180.0 / 3.141592654);\n    if (a == 0) {\n        if (b == 0)     clr.h = 0;\n        else if (b > 0) clr.h = 90;\n        else            clr.h = 270;\n    }\n    else if (a > 0) {\n        temp = b / a;\n        if (b > 0)       clr.h = (r2d * atan(temp));\n        else if (b == 0) clr.h = 0;\n        else             clr.h = (r2d * atan(temp)) + 360;\n    }\n    else {\n        temp = b / a;\n        clr.h = (r2d * atan(temp)) + 180;\n    }\n\n    d2r = (3.141592654 / 180.0);\n    e = ((12500.0 / 13.0) * pMod->Nc * pMod->Ncb) *\n        (cos((clr.h * d2r + 2.0)) + 3.8);\n\n    if (clr.h < 20.14) {\n        temp = ((clr.h + 122.47)/1.2) + ((20.14 - clr.h)/0.8);\n        clr.H = 300 + (100*((clr.h + 122.47)/1.2)) / temp;\n    }\n    else if (clr.h < 90.0) {\n        temp = ((clr.h - 20.14)/0.8) + ((90.00 - clr.h)/0.7);\n        clr.H = (100*((clr.h - 20.14)/0.8)) / temp;\n    }\n    else if (clr.h < 164.25) {\n        temp = ((clr.h - 90.00)/0.7) + ((164.25 - clr.h)/1.0);\n        clr.H = 100 + ((100*((clr.h - 90.00)/0.7)) / temp);\n    }\n    else if (clr.h < 237.53) {\n        temp = ((clr.h - 164.25)/1.0) + ((237.53 - clr.h)/1.2);\n        clr.H = 200 + ((100*((clr.h - 164.25)/1.0)) / temp);\n    }\n    else {\n        temp = ((clr.h - 237.53)/1.2) + ((360 - clr.h + 20.14)/0.8);\n        clr.H = 300 + ((100*((clr.h - 237.53)/1.2)) / temp);\n    }\n\n    clr.J = 100.0 * pow((clr.A / pMod->adoptedWhite.A),\n        (pMod->c * pMod->z));\n\n    clr.Q = (4.0 / pMod->c) * pow((clr.J / 100.0), 0.5) *\n        (pMod->adoptedWhite.A + 4.0) * pow(pMod->FL, 0.25);\n\n    t = (e * pow(((a * a) + (b * b)), 0.5)) /\n        (clr.RGBpa[0] + clr.RGBpa[1] +\n        ((21.0 / 20.0) * clr.RGBpa[2]));\n\n    clr.C = pow(t, 0.9) * pow((clr.J / 100.0), 0.5) *\n        pow((1.64 - pow(0.29, pMod->n)), 0.73);\n\n    clr.M = clr.C * pow(pMod->FL, 0.25);\n    clr.s = 100.0 * pow((clr.M / clr.Q), 0.5);\n\n    return clr;\n}\n\n\nstatic\nCAM02COLOR InverseCorrelates(CAM02COLOR clr, cmsCIECAM02* pMod)\n{\n\n    cmsFloat64Number t, e, p1, p2, p3, p4, p5, hr, d2r;\n    d2r = 3.141592654 / 180.0;\n\n    t = pow( (clr.C / (pow((clr.J / 100.0), 0.5) *\n        (pow((1.64 - pow(0.29, pMod->n)), 0.73)))),\n        (1.0 / 0.9) );\n    e = ((12500.0 / 13.0) * pMod->Nc * pMod->Ncb) *\n        (cos((clr.h * d2r + 2.0)) + 3.8);\n\n    clr.A = pMod->adoptedWhite.A * pow(\n           (clr.J / 100.0),\n           (1.0 / (pMod->c * pMod->z)));\n\n    p1 = e / t;\n    p2 = (clr.A / pMod->Nbb) + 0.305;\n    p3 = 21.0 / 20.0;\n\n    hr = clr.h * d2r;\n\n    if (fabs(sin(hr)) >= fabs(cos(hr))) {\n        p4 = p1 / sin(hr);\n        clr.b = (p2 * (2.0 + p3) * (460.0 / 1403.0)) /\n            (p4 + (2.0 + p3) * (220.0 / 1403.0) *\n            (cos(hr) / sin(hr)) - (27.0 / 1403.0) +\n            p3 * (6300.0 / 1403.0));\n        clr.a = clr.b * (cos(hr) / sin(hr));\n    }\n    else {\n        p5 = p1 / cos(hr);\n        clr.a = (p2 * (2.0 + p3) * (460.0 / 1403.0)) /\n            (p5 + (2.0 + p3) * (220.0 / 1403.0) -\n            ((27.0 / 1403.0) - p3 * (6300.0 / 1403.0)) *\n            (sin(hr) / cos(hr)));\n        clr.b = clr.a * (sin(hr) / cos(hr));\n    }\n\n    clr.RGBpa[0] = ((460.0 / 1403.0) * p2) +\n              ((451.0 / 1403.0) * clr.a) +\n              ((288.0 / 1403.0) * clr.b);\n    clr.RGBpa[1] = ((460.0 / 1403.0) * p2) -\n              ((891.0 / 1403.0) * clr.a) -\n              ((261.0 / 1403.0) * clr.b);\n    clr.RGBpa[2] = ((460.0 / 1403.0) * p2) -\n              ((220.0 / 1403.0) * clr.a) -\n              ((6300.0 / 1403.0) * clr.b);\n\n    return clr;\n}\n\nstatic\nCAM02COLOR InverseNonlinearity(CAM02COLOR clr, cmsCIECAM02* pMod)\n{\n    cmsUInt32Number i;\n    cmsFloat64Number c1;\n\n    for (i = 0; i < 3; i++) {\n        if ((clr.RGBpa[i] - 0.1) < 0) c1 = -1;\n        else                               c1 = 1;\n        clr.RGBp[i] = c1 * (100.0 / pMod->FL) *\n            pow(((27.13 * fabs(clr.RGBpa[i] - 0.1)) /\n            (400.0 - fabs(clr.RGBpa[i] - 0.1))),\n            (1.0 / 0.42));\n    }\n\n    return clr;\n}\n\nstatic\nCAM02COLOR HPEtoCAT02(CAM02COLOR clr)\n{\n    cmsFloat64Number M[9];\n\n    M[0] = (( 0.7328 *  1.910197) + (0.4296 * 0.370950));\n    M[1] = (( 0.7328 * -1.112124) + (0.4296 * 0.629054));\n    M[2] = (( 0.7328 *  0.201908) + (0.4296 * 0.000008) - 0.1624);\n    M[3] = ((-0.7036 *  1.910197) + (1.6975 * 0.370950));\n    M[4] = ((-0.7036 * -1.112124) + (1.6975 * 0.629054));\n    M[5] = ((-0.7036 *  0.201908) + (1.6975 * 0.000008) + 0.0061);\n    M[6] = (( 0.0030 *  1.910197) + (0.0136 * 0.370950));\n    M[7] = (( 0.0030 * -1.112124) + (0.0136 * 0.629054));\n    M[8] = (( 0.0030 *  0.201908) + (0.0136 * 0.000008) + 0.9834);;\n\n    clr.RGBc[0] = (clr.RGBp[0] * M[0]) + (clr.RGBp[1] * M[1]) + (clr.RGBp[2] * M[2]);\n    clr.RGBc[1] = (clr.RGBp[0] * M[3]) + (clr.RGBp[1] * M[4]) + (clr.RGBp[2] * M[5]);\n    clr.RGBc[2] = (clr.RGBp[0] * M[6]) + (clr.RGBp[1] * M[7]) + (clr.RGBp[2] * M[8]);\n    return clr;\n}\n\n\nstatic\nCAM02COLOR InverseChromaticAdaptation(CAM02COLOR clr,  cmsCIECAM02* pMod)\n{\n    cmsUInt32Number i;\n    for (i = 0; i < 3; i++) {\n        clr.RGB[i] = clr.RGBc[i] /\n            ((pMod->adoptedWhite.XYZ[1] * pMod->D / pMod->adoptedWhite.RGB[i]) + 1.0 - pMod->D);\n    }\n    return clr;\n}\n\n\nstatic\nCAM02COLOR CAT02toXYZ(CAM02COLOR clr)\n{\n    clr.XYZ[0] = (clr.RGB[0] *  1.096124) + (clr.RGB[1] * -0.278869) + (clr.RGB[2] *  0.182745);\n    clr.XYZ[1] = (clr.RGB[0] *  0.454369) + (clr.RGB[1] *  0.473533) + (clr.RGB[2] *  0.072098);\n    clr.XYZ[2] = (clr.RGB[0] * -0.009628) + (clr.RGB[1] * -0.005698) + (clr.RGB[2] *  1.015326);\n\n    return clr;\n}\n\n\ncmsHANDLE  CMSEXPORT cmsCIECAM02Init(cmsContext ContextID, const cmsViewingConditions* pVC)\n{\n    cmsCIECAM02* lpMod;\n\n    _cmsAssert(pVC != NULL);\n\n    if((lpMod = (cmsCIECAM02*) _cmsMallocZero(ContextID, sizeof(cmsCIECAM02))) == NULL) {\n        return NULL;\n    }\n\n    lpMod ->ContextID = ContextID;\n\n    lpMod ->adoptedWhite.XYZ[0] = pVC ->whitePoint.X;\n    lpMod ->adoptedWhite.XYZ[1] = pVC ->whitePoint.Y;\n    lpMod ->adoptedWhite.XYZ[2] = pVC ->whitePoint.Z;\n\n    lpMod -> LA       = pVC ->La;\n    lpMod -> Yb       = pVC ->Yb;\n    lpMod -> D        = pVC ->D_value;\n    lpMod -> surround = pVC ->surround;\n\n    switch (lpMod -> surround) {\n\n\n    case CUTSHEET_SURROUND:\n        lpMod->F = 0.8;\n        lpMod->c = 0.41;\n        lpMod->Nc = 0.8;\n        break;\n\n    case DARK_SURROUND:\n        lpMod -> F  = 0.8;\n        lpMod -> c  = 0.525;\n        lpMod -> Nc = 0.8;\n        break;\n\n    case DIM_SURROUND:\n        lpMod -> F  = 0.9;\n        lpMod -> c  = 0.59;\n        lpMod -> Nc = 0.95;\n        break;\n\n    default:\n        // Average surround\n        lpMod -> F  = 1.0;\n        lpMod -> c  = 0.69;\n        lpMod -> Nc = 1.0;\n    }\n\n    lpMod -> n   = compute_n(lpMod);\n    lpMod -> z   = compute_z(lpMod);\n    lpMod -> Nbb = computeNbb(lpMod);\n    lpMod -> FL  = computeFL(lpMod);\n\n    if (lpMod -> D == D_CALCULATE) {\n        lpMod -> D   = computeD(lpMod);\n    }\n\n    lpMod -> Ncb = lpMod -> Nbb;\n\n    lpMod -> adoptedWhite = XYZtoCAT02(lpMod -> adoptedWhite);\n    lpMod -> adoptedWhite = ChromaticAdaptation(lpMod -> adoptedWhite, lpMod);\n    lpMod -> adoptedWhite = CAT02toHPE(lpMod -> adoptedWhite);\n    lpMod -> adoptedWhite = NonlinearCompression(lpMod -> adoptedWhite, lpMod);\n\n    return (cmsHANDLE) lpMod;\n\n}\n\nvoid CMSEXPORT cmsCIECAM02Done(cmsHANDLE hModel)\n{\n    cmsCIECAM02* lpMod = (cmsCIECAM02*) hModel;\n\n    if (lpMod) _cmsFree(lpMod ->ContextID, lpMod);\n}\n\n\nvoid CMSEXPORT cmsCIECAM02Forward(cmsHANDLE hModel, const cmsCIEXYZ* pIn, cmsJCh* pOut)\n{\n    CAM02COLOR clr;\n    cmsCIECAM02* lpMod = (cmsCIECAM02*) hModel;\n  \n    _cmsAssert(lpMod != NULL);\n    _cmsAssert(pIn != NULL);\n    _cmsAssert(pOut != NULL);\n\n    memset(&clr, 0, sizeof(clr));\n\n    clr.XYZ[0] = pIn ->X;\n    clr.XYZ[1] = pIn ->Y;\n    clr.XYZ[2] = pIn ->Z;\n\n    clr = XYZtoCAT02(clr);\n    clr = ChromaticAdaptation(clr, lpMod);\n    clr = CAT02toHPE(clr);\n    clr = NonlinearCompression(clr, lpMod);\n    clr = ComputeCorrelates(clr, lpMod);\n\n    pOut ->J = clr.J;\n    pOut ->C = clr.C;\n    pOut ->h = clr.h;\n}\n\nvoid CMSEXPORT cmsCIECAM02Reverse(cmsHANDLE hModel, const cmsJCh* pIn, cmsCIEXYZ* pOut)\n{\n    CAM02COLOR clr;\n    cmsCIECAM02* lpMod = (cmsCIECAM02*) hModel;\n    \n    _cmsAssert(lpMod != NULL);\n    _cmsAssert(pIn != NULL);\n    _cmsAssert(pOut != NULL);\n\n    memset(&clr, 0, sizeof(clr));\n\n    clr.J = pIn -> J;\n    clr.C = pIn -> C;\n    clr.h = pIn -> h;\n\n    clr = InverseCorrelates(clr, lpMod);\n    clr = InverseNonlinearity(clr, lpMod);\n    clr = HPEtoCAT02(clr);\n    clr = InverseChromaticAdaptation(clr, lpMod);\n    clr = CAT02toXYZ(clr);\n\n    pOut ->X = clr.XYZ[0];\n    pOut ->Y = clr.XYZ[1];\n    pOut ->Z = clr.XYZ[2];\n}\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/src/cmscgats.c",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2012 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n//\n\n#include \"lcms2_internal.h\"\n\n\n// IT8.7 / CGATS.17-200x handling -----------------------------------------------------------------------------\n\n\n#define MAXID        128     // Max length of identifier\n#define MAXSTR      1024     // Max length of string\n#define MAXTABLES    255     // Max Number of tables in a single stream\n#define MAXINCLUDE    20     // Max number of nested includes\n\n#define DEFAULT_DBL_FORMAT  \"%.10g\" // Double formatting\n\n#ifdef CMS_IS_WINDOWS_\n//sunliang.liu modified 2010426 for wince error\n#\tifndef _WIN32_WCE\n#\t\tinclude <io.h>\n#\tendif\n#    define DIR_CHAR    '\\\\'\n#else\n#    define DIR_CHAR    '/'\n#endif\n\n\n// Symbols\ntypedef enum {\n\n        SNONE,\n        SINUM,      // Integer\n        SDNUM,      // Real\n        SIDENT,     // Identifier\n        SSTRING,    // string\n        SCOMMENT,   // comment\n        SEOLN,      // End of line\n        SEOF,       // End of stream\n        SSYNERROR,  // Syntax error found on stream\n\n        // Keywords\n\n        SBEGIN_DATA,\n        SBEGIN_DATA_FORMAT,\n        SEND_DATA,\n        SEND_DATA_FORMAT,\n        SKEYWORD,\n        SDATA_FORMAT_ID,\n        SINCLUDE\n\n    } SYMBOL;\n\n\n// How to write the value\ntypedef enum {\n\n        WRITE_UNCOOKED,\n        WRITE_STRINGIFY,\n        WRITE_HEXADECIMAL,\n        WRITE_BINARY,\n        WRITE_PAIR\n\n    } WRITEMODE;\n\n// Linked list of variable names\ntypedef struct _KeyVal {\n\n        struct _KeyVal*  Next;\n        char*            Keyword;       // Name of variable\n        struct _KeyVal*  NextSubkey;    // If key is a dictionary, points to the next item\n        char*            Subkey;        // If key is a dictionary, points to the subkey name\n        char*            Value;         // Points to value\n        WRITEMODE        WriteAs;       // How to write the value\n\n   } KEYVALUE;\n\n\n// Linked list of memory chunks (Memory sink)\ntypedef struct _OwnedMem {\n\n        struct _OwnedMem* Next;\n        void *            Ptr;          // Point to value\n\n   } OWNEDMEM;\n\n// Suballocator\ntypedef struct _SubAllocator {\n\n         cmsUInt8Number* Block;\n         cmsUInt32Number BlockSize;\n         cmsUInt32Number Used;\n\n    } SUBALLOCATOR;\n\n// Table. Each individual table can hold properties and rows & cols\ntypedef struct _Table {\n\n        char SheetType[MAXSTR];               // The first row of the IT8 (the type)\n\n        int            nSamples, nPatches;    // Cols, Rows\n        int            SampleID;              // Pos of ID\n\n        KEYVALUE*      HeaderList;            // The properties\n\n        char**         DataFormat;            // The binary stream descriptor\n        char**         Data;                  // The binary stream\n\n    } TABLE;\n\n// File stream being parsed\ntypedef struct _FileContext {\n        char           FileName[cmsMAX_PATH];    // File name if being readed from file\n        FILE*          Stream;                   // File stream or NULL if holded in memory\n    } FILECTX;\n\n// This struct hold all information about an open IT8 handler.\ntypedef struct {\n\n\n        cmsUInt32Number  TablesCount;                     // How many tables in this stream\n        cmsUInt32Number  nTable;                          // The actual table\n\n        TABLE Tab[MAXTABLES];\n\n        // Memory management\n        OWNEDMEM*      MemorySink;            // The storage backend\n        SUBALLOCATOR   Allocator;             // String suballocator -- just to keep it fast\n\n        // Parser state machine\n        SYMBOL         sy;                    // Current symbol\n        int            ch;                    // Current character\n\n        int            inum;                  // integer value\n        cmsFloat64Number         dnum;                  // real value\n        char           id[MAXID];             // identifier\n        char           str[MAXSTR];           // string\n\n        // Allowed keywords & datasets. They have visibility on whole stream\n        KEYVALUE*     ValidKeywords;\n        KEYVALUE*     ValidSampleID;\n\n        char*          Source;                // Points to loc. being parsed\n        int            lineno;                // line counter for error reporting\n\n        FILECTX*       FileStack[MAXINCLUDE]; // Stack of files being parsed\n        int            IncludeSP;             // Include Stack Pointer\n\n        char*          MemoryBlock;           // The stream if holded in memory\n\n        char           DoubleFormatter[MAXID];// Printf-like 'cmsFloat64Number' formatter\n\n        cmsContext    ContextID;              // The threading context\n\n   } cmsIT8;\n\n\n// The stream for save operations\ntypedef struct {\n\n        FILE* stream;   // For save-to-file behaviour\n\n        cmsUInt8Number* Base;\n        cmsUInt8Number* Ptr;        // For save-to-mem behaviour\n        cmsUInt32Number Used;\n        cmsUInt32Number Max;\n\n    } SAVESTREAM;\n\n\n// ------------------------------------------------------ cmsIT8 parsing routines\n\n\n// A keyword\ntypedef struct {\n\n        const char *id;\n        SYMBOL sy;\n\n   } KEYWORD;\n\n// The keyword->symbol translation table. Sorting is required.\nstatic const KEYWORD TabKeys[] = {\n\n        {\"$INCLUDE\",               SINCLUDE},   // This is an extension!\n        {\".INCLUDE\",               SINCLUDE},   // This is an extension!\n\n        {\"BEGIN_DATA\",             SBEGIN_DATA },\n        {\"BEGIN_DATA_FORMAT\",      SBEGIN_DATA_FORMAT },\n        {\"DATA_FORMAT_IDENTIFIER\", SDATA_FORMAT_ID},\n        {\"END_DATA\",               SEND_DATA},\n        {\"END_DATA_FORMAT\",        SEND_DATA_FORMAT},\n        {\"KEYWORD\",                SKEYWORD}\n        };\n\n#define NUMKEYS (sizeof(TabKeys)/sizeof(KEYWORD))\n\n// Predefined properties\n\n// A property\ntypedef struct {\n        const char *id;    // The identifier\n        WRITEMODE as;      // How is supposed to be written\n    } PROPERTY;\n\nstatic PROPERTY PredefinedProperties[] = {\n\n        {\"NUMBER_OF_FIELDS\", WRITE_UNCOOKED},    // Required - NUMBER OF FIELDS\n        {\"NUMBER_OF_SETS\",   WRITE_UNCOOKED},    // Required - NUMBER OF SETS\n        {\"ORIGINATOR\",       WRITE_STRINGIFY},   // Required - Identifies the specific system, organization or individual that created the data file.\n        {\"FILE_DESCRIPTOR\",  WRITE_STRINGIFY},   // Required - Describes the purpose or contents of the data file.\n        {\"CREATED\",          WRITE_STRINGIFY},   // Required - Indicates date of creation of the data file.\n        {\"DESCRIPTOR\",       WRITE_STRINGIFY},   // Required  - Describes the purpose or contents of the data file.\n        {\"DIFFUSE_GEOMETRY\", WRITE_STRINGIFY},   // The diffuse geometry used. Allowed values are \"sphere\" or \"opal\".\n        {\"MANUFACTURER\",     WRITE_STRINGIFY},\n        {\"MANUFACTURE\",      WRITE_STRINGIFY},   // Some broken Fuji targets does store this value\n        {\"PROD_DATE\",        WRITE_STRINGIFY},   // Identifies year and month of production of the target in the form yyyy:mm.\n        {\"SERIAL\",           WRITE_STRINGIFY},   // Uniquely identifies individual physical target.\n\n        {\"MATERIAL\",         WRITE_STRINGIFY},   // Identifies the material on which the target was produced using a code\n                               // uniquely identifying th e material. This is intend ed to be used for IT8.7\n                               // physical targets only (i.e . IT8.7/1 a nd IT8.7/2).\n\n        {\"INSTRUMENTATION\",  WRITE_STRINGIFY},   // Used to report the specific instrumentation used (manufacturer and\n                               // model number) to generate the data reported. This data will often\n                               // provide more information about the particular data collected than an\n                               // extensive list of specific details. This is particularly important for\n                               // spectral data or data derived from spectrophotometry.\n\n        {\"MEASUREMENT_SOURCE\", WRITE_STRINGIFY}, // Illumination used for spectral measurements. This data helps provide\n                               // a guide to the potential for issues of paper fluorescence, etc.\n\n        {\"PRINT_CONDITIONS\", WRITE_STRINGIFY},   // Used to define the characteristics of the printed sheet being reported.\n                               // Where standard conditions have been defined (e.g., SWOP at nominal)\n                               // named conditions may suffice. Otherwise, detailed information is\n                               // needed.\n\n        {\"SAMPLE_BACKING\",   WRITE_STRINGIFY},   // Identifies the backing material used behind the sample during\n                               // measurement. Allowed values are black? white? or {\"na\".\n\n        {\"CHISQ_DOF\",        WRITE_STRINGIFY},   // Degrees of freedom associated with the Chi squared statistic\n\n       // below properties are new in recent specs:\n\n        {\"MEASUREMENT_GEOMETRY\", WRITE_STRINGIFY}, // The type of measurement, either reflection or transmission, should be indicated\n                               // along with details of the geometry and the aperture size and shape. For example,\n                               // for transmission measurements it is important to identify 0/diffuse, diffuse/0,\n                               // opal or integrating sphere, etc. For reflection it is important to identify 0/45,\n                               // 45/0, sphere (specular included or excluded), etc.\n\n       {\"FILTER\",            WRITE_STRINGIFY},   // Identifies the use of physical filter(s) during measurement. Typically used to\n                               // denote the use of filters such as none, D65, Red, Green or Blue.\n\n       {\"POLARIZATION\",      WRITE_STRINGIFY},   // Identifies the use of a physical polarization filter during measurement. Allowed\n                               // values are {\"yes? white? none?or na?\n\n       {\"WEIGHTING_FUNCTION\", WRITE_PAIR},   // Indicates such functions as: the CIE standard observer functions used in the\n                               // calculation of various data parameters (2 degree and 10 degree), CIE standard\n                               // illuminant functions used in the calculation of various data parameters (e.g., D50,\n                               // D65, etc.), density status response, etc. If used there shall be at least one\n                               // name-value pair following the WEIGHTING_FUNCTION tag/keyword. The first attribute\n                               // in the set shall be {\"name\" and shall identify the particular parameter used.\n                               // The second shall be {\"value\" and shall provide the value associated with that name.\n                               // For ASCII data, a string containing the Name and Value attribute pairs shall follow\n                               // the weighting function keyword. A semi-colon separates attribute pairs from each\n                               // other and within the attribute the name and value are separated by a comma.\n\n       {\"COMPUTATIONAL_PARAMETER\", WRITE_PAIR}, // Parameter that is used in computing a value from measured data. Name is the name\n                               // of the calculation, parameter is the name of the parameter used in the calculation\n                               // and value is the value of the parameter.\n\n       {\"TARGET_TYPE\",        WRITE_STRINGIFY},  // The type of target being measured, e.g. IT8.7/1, IT8.7/3, user defined, etc.\n\n       {\"COLORANT\",           WRITE_STRINGIFY},  // Identifies the colorant(s) used in creating the target.\n\n       {\"TABLE_DESCRIPTOR\",   WRITE_STRINGIFY},  // Describes the purpose or contents of a data table.\n\n       {\"TABLE_NAME\",         WRITE_STRINGIFY}   // Provides a short name for a data table.\n};\n\n#define NUMPREDEFINEDPROPS (sizeof(PredefinedProperties)/sizeof(PROPERTY))\n\n\n// Predefined sample types on dataset\nstatic const char* PredefinedSampleID[] = {\n        \"SAMPLE_ID\",      // Identifies sample that data represents\n        \"STRING\",         // Identifies label, or other non-machine readable value.\n                          // Value must begin and end with a \" symbol\n\n        \"CMYK_C\",         // Cyan component of CMYK data expressed as a percentage\n        \"CMYK_M\",         // Magenta component of CMYK data expressed as a percentage\n        \"CMYK_Y\",         // Yellow component of CMYK data expressed as a percentage\n        \"CMYK_K\",         // Black component of CMYK data expressed as a percentage\n        \"D_RED\",          // Red filter density\n        \"D_GREEN\",        // Green filter density\n        \"D_BLUE\",         // Blue filter density\n        \"D_VIS\",          // Visual filter density\n        \"D_MAJOR_FILTER\", // Major filter d ensity\n        \"RGB_R\",          // Red component of RGB data\n        \"RGB_G\",          // Green component of RGB data\n        \"RGB_B\",          // Blue com ponent of RGB data\n        \"SPECTRAL_NM\",    // Wavelength of measurement expressed in nanometers\n        \"SPECTRAL_PCT\",   // Percentage reflectance/transmittance\n        \"SPECTRAL_DEC\",   // Reflectance/transmittance\n        \"XYZ_X\",          // X component of tristimulus data\n        \"XYZ_Y\",          // Y component of tristimulus data\n        \"XYZ_Z\",          // Z component of tristimulus data\n        \"XYY_X\"           // x component of chromaticity data\n        \"XYY_Y\",          // y component of chromaticity data\n        \"XYY_CAPY\",       // Y component of tristimulus data\n        \"LAB_L\",          // L* component of Lab data\n        \"LAB_A\",          // a* component of Lab data\n        \"LAB_B\",          // b* component of Lab data\n        \"LAB_C\",          // C*ab component of Lab data\n        \"LAB_H\",          // hab component of Lab data\n        \"LAB_DE\",         // CIE dE\n        \"LAB_DE_94\",      // CIE dE using CIE 94\n        \"LAB_DE_CMC\",     // dE using CMC\n        \"LAB_DE_2000\",    // CIE dE using CIE DE 2000\n        \"MEAN_DE\",        // Mean Delta E (LAB_DE) of samples compared to batch average\n                          // (Used for data files for ANSI IT8.7/1 and IT8.7/2 targets)\n        \"STDEV_X\",        // Standard deviation of X (tristimulus data)\n        \"STDEV_Y\",        // Standard deviation of Y (tristimulus data)\n        \"STDEV_Z\",        // Standard deviation of Z (tristimulus data)\n        \"STDEV_L\",        // Standard deviation of L*\n        \"STDEV_A\",        // Standard deviation of a*\n        \"STDEV_B\",        // Standard deviation of b*\n        \"STDEV_DE\",       // Standard deviation of CIE dE\n        \"CHI_SQD_PAR\"};   // The average of the standard deviations of L*, a* and b*. It is\n                          // used to derive an estimate of the chi-squared parameter which is\n                          // recommended as the predictor of the variability of dE\n\n#define NUMPREDEFINEDSAMPLEID (sizeof(PredefinedSampleID)/sizeof(char *))\n\n//Forward declaration of some internal functions\nstatic void* AllocChunk(cmsIT8* it8, cmsUInt32Number size);\n\n// Checks whatever c is a separator\nstatic\ncmsBool isseparator(int c)\n{\n    return (c == ' ') || (c == '\\t') ; \n}\n\n// Checks whatever c is a valid identifier char\nstatic\ncmsBool ismiddle(int c)\n{\n   return (!isseparator(c) && (c != '#') && (c !='\\\"') && (c != '\\'') && (c > 32) && (c < 127));\n}\n\n// Checks whatsever c is a valid identifier middle char.\nstatic\ncmsBool isidchar(int c)\n{\n   return isalnum(c) || ismiddle(c);\n}\n\n// Checks whatsever c is a valid identifier first char.\nstatic\ncmsBool isfirstidchar(int c)\n{\n     return !isdigit(c) && ismiddle(c);\n}\n\n// Guess whether the supplied path looks like an absolute path\nstatic\ncmsBool isabsolutepath(const char *path)\n{\n    char ThreeChars[4];\n\n    if(path == NULL)\n        return FALSE;\n    if (path[0] == 0)\n        return FALSE;\n\n    strncpy(ThreeChars, path, 3);\n    ThreeChars[3] = 0;\n\n    if(ThreeChars[0] == DIR_CHAR)\n        return TRUE;\n\n#ifdef  CMS_IS_WINDOWS_\n    if (isalpha((int) ThreeChars[0]) && ThreeChars[1] == ':')\n        return TRUE;\n#endif\n    return FALSE;\n}\n\n\n// Makes a file path based on a given reference path\n// NOTE: this function doesn't check if the path exists or even if it's legal\nstatic\ncmsBool BuildAbsolutePath(const char *relPath, const char *basePath, char *buffer, cmsUInt32Number MaxLen)\n{\n    char *tail;\n    cmsUInt32Number len;\n\n    // Already absolute?\n    if (isabsolutepath(relPath)) {\n\n        strncpy(buffer, relPath, MaxLen);\n        buffer[MaxLen-1] = 0;\n        return TRUE;\n    }\n\n    // No, search for last\n    strncpy(buffer, basePath, MaxLen);\n    buffer[MaxLen-1] = 0;\n\n    tail = strrchr(buffer, DIR_CHAR);\n    if (tail == NULL) return FALSE;    // Is not absolute and has no separators??\n\n    len = (cmsUInt32Number) (tail - buffer);\n    if (len >= MaxLen) return FALSE;\n\n    // No need to assure zero terminator over here\n    strncpy(tail + 1, relPath, MaxLen - len);\n\n    return TRUE;\n}\n\n\n// Make sure no exploit is being even tried\nstatic\nconst char* NoMeta(const char* str)\n{\n    if (strchr(str, '%') != NULL)\n        return \"**** CORRUPTED FORMAT STRING ***\";\n\n    return str;\n}\n\n// Syntax error\nstatic\ncmsBool SynError(cmsIT8* it8, const char *Txt, ...)\n{\n    char Buffer[256], ErrMsg[1024];\n    va_list args;\n\n    va_start(args, Txt);\n    vsnprintf(Buffer, 255, Txt, args);\n    Buffer[255] = 0;\n    va_end(args);\n\n    snprintf(ErrMsg, 1023, \"%s: Line %d, %s\", it8->FileStack[it8 ->IncludeSP]->FileName, it8->lineno, Buffer);\n    ErrMsg[1023] = 0;\n    it8->sy = SSYNERROR;\n    cmsSignalError(it8 ->ContextID, cmsERROR_CORRUPTION_DETECTED, \"%s\", ErrMsg);\n    return FALSE;\n}\n\n// Check if current symbol is same as specified. issue an error else.\nstatic\ncmsBool Check(cmsIT8* it8, SYMBOL sy, const char* Err)\n{\n        if (it8 -> sy != sy)\n                return SynError(it8, NoMeta(Err));\n        return TRUE;\n}\n\n// Read Next character from stream\nstatic\nvoid NextCh(cmsIT8* it8)\n{\n    if (it8 -> FileStack[it8 ->IncludeSP]->Stream) {\n\n        it8 ->ch = fgetc(it8 ->FileStack[it8 ->IncludeSP]->Stream);\n\n        if (feof(it8 -> FileStack[it8 ->IncludeSP]->Stream))  {\n\n            if (it8 ->IncludeSP > 0) {\n\n                fclose(it8 ->FileStack[it8->IncludeSP--]->Stream);\n                it8 -> ch = ' ';                            // Whitespace to be ignored\n\n            } else\n                it8 ->ch = 0;   // EOF\n        }\n    }\n    else {\n        it8->ch = *it8->Source;\n        if (it8->ch) it8->Source++;\n    }\n}\n\n\n// Try to see if current identifier is a keyword, if so return the referred symbol\nstatic\nSYMBOL BinSrchKey(const char *id)\n{\n    int l = 1;\n    int r = NUMKEYS;\n    int x, res;\n\n    while (r >= l)\n    {\n        x = (l+r)/2;\n        res = cmsstrcasecmp(id, TabKeys[x-1].id);\n        if (res == 0) return TabKeys[x-1].sy;\n        if (res < 0) r = x - 1;\n        else l = x + 1;\n    }\n\n    return SNONE;\n}\n\n\n// 10 ^n\nstatic\ncmsFloat64Number xpow10(int n)\n{\n    return pow(10, (cmsFloat64Number) n);\n}\n\n\n//  Reads a Real number, tries to follow from integer number\nstatic\nvoid ReadReal(cmsIT8* it8, int inum)\n{\n    it8->dnum = (cmsFloat64Number) inum;\n\n    while (isdigit(it8->ch)) {\n\n        it8->dnum = it8->dnum * 10.0 + (it8->ch - '0');\n        NextCh(it8);\n    }\n\n    if (it8->ch == '.') {        // Decimal point\n\n        cmsFloat64Number frac = 0.0;      // fraction\n        int prec = 0;                     // precision\n\n        NextCh(it8);               // Eats dec. point\n\n        while (isdigit(it8->ch)) {\n\n            frac = frac * 10.0 + (it8->ch - '0');\n            prec++;\n            NextCh(it8);\n        }\n\n        it8->dnum = it8->dnum + (frac / xpow10(prec));\n    }\n\n    // Exponent, example 34.00E+20\n    if (toupper(it8->ch) == 'E') {\n\n        int e;\n        int sgn;\n\n        NextCh(it8); sgn = 1;\n\n        if (it8->ch == '-') {\n\n            sgn = -1; NextCh(it8);\n        }\n        else\n            if (it8->ch == '+') {\n\n                sgn = +1;\n                NextCh(it8);\n            }\n\n            e = 0;\n            while (isdigit(it8->ch)) {\n\n                if ((cmsFloat64Number) e * 10L < INT_MAX)\n                    e = e * 10 + (it8->ch - '0');\n\n                NextCh(it8);\n            }\n\n            e = sgn*e;\n            it8 -> dnum = it8 -> dnum * xpow10(e);\n    }\n}\n\n// Parses a float number\n// This can not call directly atof because it uses locale dependant\n// parsing, while CCMX files always use . as decimal separator\nstatic\ncmsFloat64Number ParseFloatNumber(const char *Buffer)\n{\n    cmsFloat64Number dnum = 0.0;\n    int sign = 1;\n\n    // keep safe\n    if (Buffer == NULL) return 0.0;\n\n    if (*Buffer == '-' || *Buffer == '+') {\n\n         sign = (*Buffer == '-') ? -1 : 1;\n         Buffer++;\n    }\n\n\n    while (*Buffer && isdigit((int) *Buffer)) {\n\n        dnum = dnum * 10.0 + (*Buffer - '0');\n        if (*Buffer) Buffer++;\n    }\n\n    if (*Buffer == '.') {\n\n        cmsFloat64Number frac = 0.0;      // fraction\n        int prec = 0;                     // precission\n\n        if (*Buffer) Buffer++;\n\n        while (*Buffer && isdigit((int) *Buffer)) {\n\n            frac = frac * 10.0 + (*Buffer - '0');\n            prec++;\n            if (*Buffer) Buffer++;\n        }\n\n        dnum = dnum + (frac / xpow10(prec));\n    }\n\n    // Exponent, example 34.00E+20\n    if (*Buffer && toupper(*Buffer) == 'E') {\n\n        int e;\n        int sgn;\n\n        if (*Buffer) Buffer++;\n        sgn = 1;\n\n        if (*Buffer == '-') {\n\n            sgn = -1;\n            if (*Buffer) Buffer++;\n        }\n        else\n            if (*Buffer == '+') {\n\n                sgn = +1;\n                if (*Buffer) Buffer++;\n            }\n\n            e = 0;\n            while (*Buffer && isdigit((int) *Buffer)) {\n\n                if ((cmsFloat64Number) e * 10L < INT_MAX)\n                    e = e * 10 + (*Buffer - '0');\n\n                if (*Buffer) Buffer++;\n            }\n\n            e = sgn*e;\n            dnum = dnum * xpow10(e);\n    }\n\n    return sign * dnum;\n}\n\n\n// Reads next symbol\nstatic\nvoid InSymbol(cmsIT8* it8)\n{\n    register char *idptr;\n    register int k;\n    SYMBOL key;\n    int sng;\n    \n    do {\n\n        while (isseparator(it8->ch))\n            NextCh(it8);\n\n        if (isfirstidchar(it8->ch)) {          // Identifier\n\n            k = 0;\n            idptr = it8->id;\n\n            do {\n\n                if (++k < MAXID) *idptr++ = (char) it8->ch;\n\n                NextCh(it8);\n\n            } while (isidchar(it8->ch));\n\n            *idptr = '\\0';\n\n\n            key = BinSrchKey(it8->id);\n            if (key == SNONE) it8->sy = SIDENT;\n            else it8->sy = key;\n\n        }\n        else                         // Is a number?\n            if (isdigit(it8->ch) || it8->ch == '.' || it8->ch == '-' || it8->ch == '+')\n            {\n                int sign = 1;\n\n                if (it8->ch == '-') {\n                    sign = -1;\n                    NextCh(it8);\n                }\n\n                it8->inum = 0;\n                it8->sy   = SINUM;\n\n                if (it8->ch == '0') {          // 0xnnnn (Hexa) or 0bnnnn (Binary)\n\n                    NextCh(it8);\n                    if (toupper(it8->ch) == 'X') {\n\n                        int j;\n\n                        NextCh(it8);\n                        while (isxdigit(it8->ch))\n                        {\n                            it8->ch = toupper(it8->ch);\n                            if (it8->ch >= 'A' && it8->ch <= 'F')  j = it8->ch -'A'+10;\n                            else j = it8->ch - '0';\n\n                            if ((long) it8->inum * 16L > (long) INT_MAX)\n                            {\n                                SynError(it8, \"Invalid hexadecimal number\");\n                                return;\n                            }\n\n                            it8->inum = it8->inum * 16 + j;\n                            NextCh(it8);\n                        }\n                        return;\n                    }\n\n                    if (toupper(it8->ch) == 'B') {  // Binary\n\n                        int j;\n\n                        NextCh(it8);\n                        while (it8->ch == '0' || it8->ch == '1')\n                        {\n                            j = it8->ch - '0';\n\n                            if ((long) it8->inum * 2L > (long) INT_MAX)\n                            {\n                                SynError(it8, \"Invalid binary number\");\n                                return;\n                            }\n\n                            it8->inum = it8->inum * 2 + j;\n                            NextCh(it8);\n                        }\n                        return;\n                    }\n                }\n\n\n                while (isdigit(it8->ch)) {\n\n                    if ((long) it8->inum * 10L > (long) INT_MAX) {\n                        ReadReal(it8, it8->inum);\n                        it8->sy = SDNUM;\n                        it8->dnum *= sign;\n                        return;\n                    }\n\n                    it8->inum = it8->inum * 10 + (it8->ch - '0');\n                    NextCh(it8);\n                }\n\n                if (it8->ch == '.') {\n\n                    ReadReal(it8, it8->inum);\n                    it8->sy = SDNUM;\n                    it8->dnum *= sign;\n                    return;\n                }\n\n                it8 -> inum *= sign;\n\n                // Special case. Numbers followed by letters are taken as identifiers\n\n                if (isidchar(it8 ->ch)) {\n\n                    if (it8 ->sy == SINUM) {\n\n                        sprintf(it8->id, \"%d\", it8->inum);\n                    }\n                    else {\n\n                        sprintf(it8->id, it8 ->DoubleFormatter, it8->dnum);\n                    }\n\n                    k = (int) strlen(it8 ->id);\n                    idptr = it8 ->id + k;\n                    do {\n\n                        if (++k < MAXID) *idptr++ = (char) it8->ch;\n\n                        NextCh(it8);\n\n                    } while (isidchar(it8->ch));\n\n                    *idptr = '\\0';\n                    it8->sy = SIDENT;\n                }\n                return;\n\n            }\n            else\n                switch ((int) it8->ch) {\n\n        // EOF marker -- ignore it\n        case '\\x1a':\n            NextCh(it8);\n            break;\n\n        // Eof stream markers\n        case 0:\n        case -1:\n            it8->sy = SEOF;\n            break;\n\n\n        // Next line\n        case '\\r':\n            NextCh(it8);\n            if (it8 ->ch == '\\n') \n                NextCh(it8);\n            it8->sy = SEOLN;\n            it8->lineno++;\n            break;\n\n        case '\\n':\n            NextCh(it8);\n            it8->sy = SEOLN;\n            it8->lineno++;\n            break;\n\n        // Comment\n        case '#':\n            NextCh(it8);\n            while (it8->ch && it8->ch != '\\n' && it8->ch != '\\r')\n                NextCh(it8);\n\n            it8->sy = SCOMMENT;\n            break;\n\n        // String.\n        case '\\'':\n        case '\\\"':\n            idptr = it8->str;\n            sng = it8->ch;\n            k = 0;\n            NextCh(it8);\n\n            while (k < MAXSTR && it8->ch != sng) {\n\n                if (it8->ch == '\\n'|| it8->ch == '\\r') k = MAXSTR+1;\n                else {\n                    *idptr++ = (char) it8->ch;\n                    NextCh(it8);\n                    k++;\n                }\n            }\n\n            it8->sy = SSTRING;\n            *idptr = '\\0';\n            NextCh(it8);\n            break;\n\n\n        default:\n            SynError(it8, \"Unrecognized character: 0x%x\", it8 ->ch);\n            return;\n            }\n\n    } while (it8->sy == SCOMMENT);\n\n    // Handle the include special token\n\n    if (it8 -> sy == SINCLUDE) {\n\n                FILECTX* FileNest;\n\n                if(it8 -> IncludeSP >= (MAXINCLUDE-1)) {\n\n                    SynError(it8, \"Too many recursion levels\");\n                    return;\n                }\n\n                InSymbol(it8);\n                if (!Check(it8, SSTRING, \"Filename expected\")) return;\n\n                FileNest = it8 -> FileStack[it8 -> IncludeSP + 1];\n                if(FileNest == NULL) {\n\n                    FileNest = it8 ->FileStack[it8 -> IncludeSP + 1] = (FILECTX*)AllocChunk(it8, sizeof(FILECTX));\n                    //if(FileNest == NULL)\n                    //  TODO: how to manage out-of-memory conditions?\n                }\n\n                if (BuildAbsolutePath(it8->str,\n                                      it8->FileStack[it8->IncludeSP]->FileName,\n                                      FileNest->FileName, cmsMAX_PATH-1) == FALSE) {\n                    SynError(it8, \"File path too long\");\n                    return;\n                }\n\n                FileNest->Stream = fopen(FileNest->FileName, \"rt\");\n                if (FileNest->Stream == NULL) {\n\n                        SynError(it8, \"File %s not found\", FileNest->FileName);\n                        return;\n                }\n                it8->IncludeSP++;\n\n                it8 ->ch = ' ';\n                InSymbol(it8);\n    }\n\n}\n\n// Checks end of line separator\nstatic\ncmsBool CheckEOLN(cmsIT8* it8)\n{\n        if (!Check(it8, SEOLN, \"Expected separator\")) return FALSE;\n        while (it8 -> sy == SEOLN)\n                        InSymbol(it8);\n        return TRUE;\n\n}\n\n// Skip a symbol\n\nstatic\nvoid Skip(cmsIT8* it8, SYMBOL sy)\n{\n        if (it8->sy == sy && it8->sy != SEOF)\n                        InSymbol(it8);\n}\n\n\n// Skip multiple EOLN\nstatic\nvoid SkipEOLN(cmsIT8* it8)\n{\n    while (it8->sy == SEOLN) {\n             InSymbol(it8);\n    }\n}\n\n\n// Returns a string holding current value\nstatic\ncmsBool GetVal(cmsIT8* it8, char* Buffer, cmsUInt32Number max, const char* ErrorTitle)\n{\n    switch (it8->sy) {\n\n    case SEOLN:   // Empty value\n                  Buffer[0]=0;\n                  break;\n    case SIDENT:  strncpy(Buffer, it8->id, max);\n                  Buffer[max-1]=0;\n                  break;\n    case SINUM:   snprintf(Buffer, max, \"%d\", it8 -> inum); break;\n    case SDNUM:   snprintf(Buffer, max, it8->DoubleFormatter, it8 -> dnum); break;\n    case SSTRING: strncpy(Buffer, it8->str, max);\n                  Buffer[max-1] = 0;\n                  break;\n\n\n    default:\n         return SynError(it8, \"%s\", ErrorTitle);\n    }\n\n    Buffer[max] = 0;\n    return TRUE;\n}\n\n// ---------------------------------------------------------- Table\n\nstatic\nTABLE* GetTable(cmsIT8* it8)\n{\n   if ((it8 -> nTable >= it8 ->TablesCount)) {\n\n           SynError(it8, \"Table %d out of sequence\", it8 -> nTable);\n           return it8 -> Tab;\n   }\n\n   return it8 ->Tab + it8 ->nTable;\n}\n\n// ---------------------------------------------------------- Memory management\n\n\n// Frees an allocator and owned memory\nvoid CMSEXPORT cmsIT8Free(cmsHANDLE hIT8)\n{\n   cmsIT8* it8 = (cmsIT8*) hIT8;\n\n    if (it8 == NULL)\n        return;\n\n    if (it8->MemorySink) {\n\n        OWNEDMEM* p;\n        OWNEDMEM* n;\n\n        for (p = it8->MemorySink; p != NULL; p = n) {\n\n            n = p->Next;\n            if (p->Ptr) _cmsFree(it8 ->ContextID, p->Ptr);\n            _cmsFree(it8 ->ContextID, p);\n        }\n    }\n\n    if (it8->MemoryBlock)\n        _cmsFree(it8 ->ContextID, it8->MemoryBlock);\n\n    _cmsFree(it8 ->ContextID, it8);\n}\n\n\n// Allocates a chunk of data, keep linked list\nstatic\nvoid* AllocBigBlock(cmsIT8* it8, cmsUInt32Number size)\n{\n    OWNEDMEM* ptr1;\n    void* ptr = _cmsMallocZero(it8->ContextID, size);\n\n    if (ptr != NULL) {\n\n        ptr1 = (OWNEDMEM*) _cmsMallocZero(it8 ->ContextID, sizeof(OWNEDMEM));\n\n        if (ptr1 == NULL) {\n\n            _cmsFree(it8 ->ContextID, ptr);\n            return NULL;\n        }\n\n        ptr1-> Ptr        = ptr;\n        ptr1-> Next       = it8 -> MemorySink;\n        it8 -> MemorySink = ptr1;\n    }\n\n    return ptr;\n}\n\n\n// Suballocator.\nstatic\nvoid* AllocChunk(cmsIT8* it8, cmsUInt32Number size)\n{\n    cmsUInt32Number Free = it8 ->Allocator.BlockSize - it8 ->Allocator.Used;\n    cmsUInt8Number* ptr;\n\n    size = _cmsALIGNMEM(size);\n\n    if (size > Free) {\n\n        if (it8 -> Allocator.BlockSize == 0)\n\n                it8 -> Allocator.BlockSize = 20*1024;\n        else\n                it8 ->Allocator.BlockSize *= 2;\n\n        if (it8 ->Allocator.BlockSize < size)\n                it8 ->Allocator.BlockSize = size;\n\n        it8 ->Allocator.Used = 0;\n        it8 ->Allocator.Block = (cmsUInt8Number*)  AllocBigBlock(it8, it8 ->Allocator.BlockSize);\n    }\n\n    ptr = it8 ->Allocator.Block + it8 ->Allocator.Used;\n    it8 ->Allocator.Used += size;\n\n    return (void*) ptr;\n\n}\n\n\n// Allocates a string\nstatic\nchar *AllocString(cmsIT8* it8, const char* str)\n{\n    cmsUInt32Number Size = (cmsUInt32Number) strlen(str)+1;\n    char *ptr;\n\n\n    ptr = (char *) AllocChunk(it8, Size);\n    if (ptr) strncpy (ptr, str, Size-1);\n\n    return ptr;\n}\n\n// Searches through linked list\n\nstatic\ncmsBool IsAvailableOnList(KEYVALUE* p, const char* Key, const char* Subkey, KEYVALUE** LastPtr)\n{\n    if (LastPtr) *LastPtr = p;\n\n    for (;  p != NULL; p = p->Next) {\n\n        if (LastPtr) *LastPtr = p;\n\n        if (*Key != '#') { // Comments are ignored\n\n            if (cmsstrcasecmp(Key, p->Keyword) == 0)\n                break;\n        }\n    }\n\n    if (p == NULL)\n        return FALSE;\n\n    if (Subkey == 0)\n        return TRUE;\n\n    for (; p != NULL; p = p->NextSubkey) {\n\n        if (p ->Subkey == NULL) continue;\n\n        if (LastPtr) *LastPtr = p;\n\n        if (cmsstrcasecmp(Subkey, p->Subkey) == 0)\n            return TRUE;\n    }\n\n    return FALSE;\n}\n\n\n\n// Add a property into a linked list\nstatic\nKEYVALUE* AddToList(cmsIT8* it8, KEYVALUE** Head, const char *Key, const char *Subkey, const char* xValue, WRITEMODE WriteAs)\n{\n    KEYVALUE* p;\n    KEYVALUE* last;\n\n\n    // Check if property is already in list\n\n    if (IsAvailableOnList(*Head, Key, Subkey, &p)) {\n\n        // This may work for editing properties\n\n        //     return SynError(it8, \"duplicate key <%s>\", Key);\n    }\n    else {\n\n        last = p;\n\n        // Allocate the container\n        p = (KEYVALUE*) AllocChunk(it8, sizeof(KEYVALUE));\n        if (p == NULL)\n        {\n            SynError(it8, \"AddToList: out of memory\");\n            return NULL;\n        }\n\n        // Store name and value\n        p->Keyword = AllocString(it8, Key);\n        p->Subkey = (Subkey == NULL) ? NULL : AllocString(it8, Subkey);\n\n        // Keep the container in our list\n        if (*Head == NULL) {\n            *Head = p;\n        }\n        else\n        {\n            if (Subkey != NULL && last != NULL) {\n\n                last->NextSubkey = p;\n\n                // If Subkey is not null, then last is the last property with the same key,\n                // but not necessarily is the last property in the list, so we need to move\n                // to the actual list end\n                while (last->Next != NULL)\n                         last = last->Next;\n            }\n\n            if (last != NULL) last->Next = p;\n        }\n\n        p->Next    = NULL;\n        p->NextSubkey = NULL;\n    }\n\n    p->WriteAs = WriteAs;\n\n    if (xValue != NULL) {\n\n        p->Value   = AllocString(it8, xValue);\n    }\n    else {\n        p->Value   = NULL;\n    }\n\n    return p;\n}\n\nstatic\nKEYVALUE* AddAvailableProperty(cmsIT8* it8, const char* Key, WRITEMODE as)\n{\n    return AddToList(it8, &it8->ValidKeywords, Key, NULL, NULL, as);\n}\n\n\nstatic\nKEYVALUE* AddAvailableSampleID(cmsIT8* it8, const char* Key)\n{\n    return AddToList(it8, &it8->ValidSampleID, Key, NULL, NULL, WRITE_UNCOOKED);\n}\n\n\nstatic\nvoid AllocTable(cmsIT8* it8)\n{\n    TABLE* t;\n\n    t = it8 ->Tab + it8 ->TablesCount;\n\n    t->HeaderList = NULL;\n    t->DataFormat = NULL;\n    t->Data       = NULL;\n\n    it8 ->TablesCount++;\n}\n\n\ncmsInt32Number CMSEXPORT cmsIT8SetTable(cmsHANDLE  IT8, cmsUInt32Number nTable)\n{\n     cmsIT8* it8 = (cmsIT8*) IT8;\n\n     if (nTable >= it8 ->TablesCount) {\n\n         if (nTable == it8 ->TablesCount) {\n\n             AllocTable(it8);\n         }\n         else {\n             SynError(it8, \"Table %d is out of sequence\", nTable);\n             return -1;\n         }\n     }\n\n     it8 ->nTable = nTable;\n\n     return (cmsInt32Number) nTable;\n}\n\n\n\n// Init an empty container\ncmsHANDLE  CMSEXPORT cmsIT8Alloc(cmsContext ContextID)\n{\n    cmsIT8* it8;\n    cmsUInt32Number i;\n\n    it8 = (cmsIT8*) _cmsMallocZero(ContextID, sizeof(cmsIT8));\n    if (it8 == NULL) return NULL;\n\n    AllocTable(it8);\n\n    it8->MemoryBlock = NULL;\n    it8->MemorySink  = NULL;\n\n    it8 ->nTable = 0;\n\n    it8->ContextID = ContextID;\n    it8->Allocator.Used = 0;\n    it8->Allocator.Block = NULL;\n    it8->Allocator.BlockSize = 0;\n\n    it8->ValidKeywords = NULL;\n    it8->ValidSampleID = NULL;\n\n    it8 -> sy = SNONE;\n    it8 -> ch = ' ';\n    it8 -> Source = NULL;\n    it8 -> inum = 0;\n    it8 -> dnum = 0.0;\n\n    it8->FileStack[0] = (FILECTX*)AllocChunk(it8, sizeof(FILECTX));\n    it8->IncludeSP   = 0;\n    it8 -> lineno = 1;\n\n    strcpy(it8->DoubleFormatter, DEFAULT_DBL_FORMAT);\n    cmsIT8SetSheetType((cmsHANDLE) it8, \"CGATS.17\");\n\n    // Initialize predefined properties & data\n\n    for (i=0; i < NUMPREDEFINEDPROPS; i++)\n            AddAvailableProperty(it8, PredefinedProperties[i].id, PredefinedProperties[i].as);\n\n    for (i=0; i < NUMPREDEFINEDSAMPLEID; i++)\n            AddAvailableSampleID(it8, PredefinedSampleID[i]);\n\n\n   return (cmsHANDLE) it8;\n}\n\n\nconst char* CMSEXPORT cmsIT8GetSheetType(cmsHANDLE hIT8)\n{\n        return GetTable((cmsIT8*) hIT8)->SheetType;\n}\n\ncmsBool CMSEXPORT cmsIT8SetSheetType(cmsHANDLE hIT8, const char* Type)\n{\n        TABLE* t = GetTable((cmsIT8*) hIT8);\n\n        strncpy(t ->SheetType, Type, MAXSTR-1);\n        t ->SheetType[MAXSTR-1] = 0;\n        return TRUE;\n}\n\ncmsBool CMSEXPORT cmsIT8SetComment(cmsHANDLE hIT8, const char* Val)\n{\n    cmsIT8* it8 = (cmsIT8*) hIT8;\n\n    if (!Val) return FALSE;\n    if (!*Val) return FALSE;\n\n    return AddToList(it8, &GetTable(it8)->HeaderList, \"# \", NULL, Val, WRITE_UNCOOKED) != NULL;\n}\n\n// Sets a property\ncmsBool CMSEXPORT cmsIT8SetPropertyStr(cmsHANDLE hIT8, const char* Key, const char *Val)\n{\n    cmsIT8* it8 = (cmsIT8*) hIT8;\n\n    if (!Val) return FALSE;\n    if (!*Val) return FALSE;\n\n    return AddToList(it8, &GetTable(it8)->HeaderList, Key, NULL, Val, WRITE_STRINGIFY) != NULL;\n}\n\ncmsBool CMSEXPORT cmsIT8SetPropertyDbl(cmsHANDLE hIT8, const char* cProp, cmsFloat64Number Val)\n{\n    cmsIT8* it8 = (cmsIT8*) hIT8;\n    char Buffer[1024];\n\n    sprintf(Buffer, it8->DoubleFormatter, Val);\n\n    return AddToList(it8, &GetTable(it8)->HeaderList, cProp, NULL, Buffer, WRITE_UNCOOKED) != NULL;\n}\n\ncmsBool CMSEXPORT cmsIT8SetPropertyHex(cmsHANDLE hIT8, const char* cProp, cmsUInt32Number Val)\n{\n    cmsIT8* it8 = (cmsIT8*) hIT8;\n    char Buffer[1024];\n\n    sprintf(Buffer, \"%u\", Val);\n\n    return AddToList(it8, &GetTable(it8)->HeaderList, cProp, NULL, Buffer, WRITE_HEXADECIMAL) != NULL;\n}\n\ncmsBool CMSEXPORT cmsIT8SetPropertyUncooked(cmsHANDLE hIT8, const char* Key, const char* Buffer)\n{\n    cmsIT8* it8 = (cmsIT8*) hIT8;\n\n    return AddToList(it8, &GetTable(it8)->HeaderList, Key, NULL, Buffer, WRITE_UNCOOKED) != NULL;\n}\n\ncmsBool CMSEXPORT cmsIT8SetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char* SubKey, const char *Buffer)\n{\n    cmsIT8* it8 = (cmsIT8*) hIT8;\n\n    return AddToList(it8, &GetTable(it8)->HeaderList, Key, SubKey, Buffer, WRITE_PAIR) != NULL;\n}\n\n// Gets a property\nconst char* CMSEXPORT cmsIT8GetProperty(cmsHANDLE hIT8, const char* Key)\n{\n    cmsIT8* it8 = (cmsIT8*) hIT8;\n    KEYVALUE* p;\n\n    if (IsAvailableOnList(GetTable(it8) -> HeaderList, Key, NULL, &p))\n    {\n        return p -> Value;\n    }\n    return NULL;\n}\n\n\ncmsFloat64Number CMSEXPORT cmsIT8GetPropertyDbl(cmsHANDLE hIT8, const char* cProp)\n{\n    const char *v = cmsIT8GetProperty(hIT8, cProp);\n\n    if (v == NULL) return 0.0;\n\n    return ParseFloatNumber(v);\n}\n\nconst char* CMSEXPORT cmsIT8GetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char *SubKey)\n{\n    cmsIT8* it8 = (cmsIT8*) hIT8;\n    KEYVALUE* p;\n\n    if (IsAvailableOnList(GetTable(it8) -> HeaderList, Key, SubKey, &p)) {\n        return p -> Value;\n    }\n    return NULL;\n}\n\n// ----------------------------------------------------------------- Datasets\n\n\nstatic\nvoid AllocateDataFormat(cmsIT8* it8)\n{\n    TABLE* t = GetTable(it8);\n\n    if (t -> DataFormat) return;    // Already allocated\n\n    t -> nSamples  = (int) cmsIT8GetPropertyDbl(it8, \"NUMBER_OF_FIELDS\");\n\n    if (t -> nSamples <= 0) {\n\n        SynError(it8, \"AllocateDataFormat: Unknown NUMBER_OF_FIELDS\");\n        t -> nSamples = 10;\n        }\n\n    t -> DataFormat = (char**) AllocChunk (it8, ((cmsUInt32Number) t->nSamples + 1) * sizeof(char *));\n    if (t->DataFormat == NULL) {\n\n        SynError(it8, \"AllocateDataFormat: Unable to allocate dataFormat array\");\n    }\n\n}\n\nstatic\nconst char *GetDataFormat(cmsIT8* it8, int n)\n{\n    TABLE* t = GetTable(it8);\n\n    if (t->DataFormat)\n        return t->DataFormat[n];\n\n    return NULL;\n}\n\nstatic\ncmsBool SetDataFormat(cmsIT8* it8, int n, const char *label)\n{\n    TABLE* t = GetTable(it8);\n\n    if (!t->DataFormat)\n        AllocateDataFormat(it8);\n\n    if (n > t -> nSamples) {\n        SynError(it8, \"More than NUMBER_OF_FIELDS fields.\");\n        return FALSE;\n    }\n\n    if (t->DataFormat) {\n        t->DataFormat[n] = AllocString(it8, label);\n    }\n\n    return TRUE;\n}\n\n\ncmsBool CMSEXPORT cmsIT8SetDataFormat(cmsHANDLE  h, int n, const char *Sample)\n{\n        cmsIT8* it8 = (cmsIT8*) h;\n        return SetDataFormat(it8, n, Sample);\n}\n\nstatic\nvoid AllocateDataSet(cmsIT8* it8)\n{\n    TABLE* t = GetTable(it8);\n\n    if (t -> Data) return;    // Already allocated\n\n    t-> nSamples   = atoi(cmsIT8GetProperty(it8, \"NUMBER_OF_FIELDS\"));\n    t-> nPatches   = atoi(cmsIT8GetProperty(it8, \"NUMBER_OF_SETS\"));\n\n    t-> Data = (char**)AllocChunk (it8, ((cmsUInt32Number) t->nSamples + 1) * ((cmsUInt32Number) t->nPatches + 1) *sizeof (char*));\n    if (t->Data == NULL) {\n\n        SynError(it8, \"AllocateDataSet: Unable to allocate data array\");\n    }\n\n}\n\nstatic\nchar* GetData(cmsIT8* it8, int nSet, int nField)\n{\n    TABLE* t = GetTable(it8);\n    int  nSamples   = t -> nSamples;\n    int  nPatches   = t -> nPatches;\n\n    if (nSet >= nPatches || nField >= nSamples)\n        return NULL;\n\n    if (!t->Data) return NULL;\n    return t->Data [nSet * nSamples + nField];\n}\n\nstatic\ncmsBool SetData(cmsIT8* it8, int nSet, int nField, const char *Val)\n{\n    TABLE* t = GetTable(it8);\n\n    if (!t->Data)\n        AllocateDataSet(it8);\n\n    if (!t->Data) return FALSE;\n\n    if (nSet > t -> nPatches || nSet < 0) {\n\n            return SynError(it8, \"Patch %d out of range, there are %d patches\", nSet, t -> nPatches);\n    }\n\n    if (nField > t ->nSamples || nField < 0) {\n            return SynError(it8, \"Sample %d out of range, there are %d samples\", nField, t ->nSamples);\n\n    }\n\n    t->Data [nSet * t -> nSamples + nField] = AllocString(it8, Val);\n    return TRUE;\n}\n\n\n// --------------------------------------------------------------- File I/O\n\n\n// Writes a string to file\nstatic\nvoid WriteStr(SAVESTREAM* f, const char *str)\n{\n    cmsUInt32Number len;\n\n    if (str == NULL)\n        str = \" \";\n\n    // Length to write\n    len = (cmsUInt32Number) strlen(str);\n    f ->Used += len;\n\n\n    if (f ->stream) {   // Should I write it to a file?\n\n        if (fwrite(str, 1, len, f->stream) != len) {\n            cmsSignalError(0, cmsERROR_WRITE, \"Write to file error in CGATS parser\");\n            return;\n        }\n\n    }\n    else {  // Or to a memory block?\n\n        if (f ->Base) {   // Am I just counting the bytes?\n\n            if (f ->Used > f ->Max) {\n\n                 cmsSignalError(0, cmsERROR_WRITE, \"Write to memory overflows in CGATS parser\");\n                 return;\n            }\n\n            memmove(f ->Ptr, str, len);\n            f->Ptr += len;\n        }\n\n    }\n}\n\n\n// Write formatted\n\nstatic\nvoid Writef(SAVESTREAM* f, const char* frm, ...)\n{\n    char Buffer[4096];\n    va_list args;\n\n    va_start(args, frm);\n    vsnprintf(Buffer, 4095, frm, args);\n    Buffer[4095] = 0;\n    WriteStr(f, Buffer);\n    va_end(args);\n\n}\n\n// Writes full header\nstatic\nvoid WriteHeader(cmsIT8* it8, SAVESTREAM* fp)\n{\n    KEYVALUE* p;\n    TABLE* t = GetTable(it8);\n\n    // Writes the type\n    WriteStr(fp, t->SheetType);\n    WriteStr(fp, \"\\n\");\n\n    for (p = t->HeaderList; (p != NULL); p = p->Next)\n    {\n        if (*p ->Keyword == '#') {\n\n            char* Pt;\n\n            WriteStr(fp, \"#\\n# \");\n            for (Pt = p ->Value; *Pt; Pt++) {\n\n\n                Writef(fp, \"%c\", *Pt);\n\n                if (*Pt == '\\n') {\n                    WriteStr(fp, \"# \");\n                }\n            }\n\n            WriteStr(fp, \"\\n#\\n\");\n            continue;\n        }\n\n\n        if (!IsAvailableOnList(it8-> ValidKeywords, p->Keyword, NULL, NULL)) {\n\n#ifdef CMS_STRICT_CGATS\n            WriteStr(fp, \"KEYWORD\\t\\\"\");\n            WriteStr(fp, p->Keyword);\n            WriteStr(fp, \"\\\"\\n\");\n#endif\n\n            AddAvailableProperty(it8, p->Keyword, WRITE_UNCOOKED);\n        }\n\n        WriteStr(fp, p->Keyword);\n        if (p->Value) {\n\n            switch (p ->WriteAs) {\n\n            case WRITE_UNCOOKED:\n                    Writef(fp, \"\\t%s\", p ->Value);\n                    break;\n\n            case WRITE_STRINGIFY:\n                    Writef(fp, \"\\t\\\"%s\\\"\", p->Value );\n                    break;\n\n            case WRITE_HEXADECIMAL:\n                    Writef(fp, \"\\t0x%X\", atoi(p ->Value));\n                    break;\n\n            case WRITE_BINARY:\n                    Writef(fp, \"\\t0x%B\", atoi(p ->Value));\n                    break;\n\n            case WRITE_PAIR:\n                    Writef(fp, \"\\t\\\"%s,%s\\\"\", p->Subkey, p->Value);\n                    break;\n\n            default: SynError(it8, \"Unknown write mode %d\", p ->WriteAs);\n                     return;\n            }\n        }\n\n        WriteStr (fp, \"\\n\");\n    }\n\n}\n\n\n// Writes the data format\nstatic\nvoid WriteDataFormat(SAVESTREAM* fp, cmsIT8* it8)\n{\n    int i, nSamples;\n    TABLE* t = GetTable(it8);\n\n    if (!t -> DataFormat) return;\n\n       WriteStr(fp, \"BEGIN_DATA_FORMAT\\n\");\n       WriteStr(fp, \" \");\n       nSamples = atoi(cmsIT8GetProperty(it8, \"NUMBER_OF_FIELDS\"));\n\n       for (i = 0; i < nSamples; i++) {\n\n              WriteStr(fp, t->DataFormat[i]);\n              WriteStr(fp, ((i == (nSamples-1)) ? \"\\n\" : \"\\t\"));\n          }\n\n       WriteStr (fp, \"END_DATA_FORMAT\\n\");\n}\n\n\n// Writes data array\nstatic\nvoid WriteData(SAVESTREAM* fp, cmsIT8* it8)\n{\n       int  i, j;\n       TABLE* t = GetTable(it8);\n\n       if (!t->Data) return;\n\n       WriteStr (fp, \"BEGIN_DATA\\n\");\n\n       t->nPatches = atoi(cmsIT8GetProperty(it8, \"NUMBER_OF_SETS\"));\n\n       for (i = 0; i < t-> nPatches; i++) {\n\n              WriteStr(fp, \" \");\n\n              for (j = 0; j < t->nSamples; j++) {\n\n                     char *ptr = t->Data[i*t->nSamples+j];\n\n                     if (ptr == NULL) WriteStr(fp, \"\\\"\\\"\");\n                     else {\n                         // If value contains whitespace, enclose within quote\n\n                         if (strchr(ptr, ' ') != NULL) {\n\n                             WriteStr(fp, \"\\\"\");\n                             WriteStr(fp, ptr);\n                             WriteStr(fp, \"\\\"\");\n                         }\n                         else\n                            WriteStr(fp, ptr);\n                     }\n\n                     WriteStr(fp, ((j == (t->nSamples-1)) ? \"\\n\" : \"\\t\"));\n              }\n       }\n       WriteStr (fp, \"END_DATA\\n\");\n}\n\n\n\n// Saves whole file\ncmsBool CMSEXPORT cmsIT8SaveToFile(cmsHANDLE hIT8, const char* cFileName)\n{\n    SAVESTREAM sd;\n    cmsUInt32Number i;\n    cmsIT8* it8 = (cmsIT8*) hIT8;\n\n    memset(&sd, 0, sizeof(sd));\n\n    sd.stream = fopen(cFileName, \"wt\");\n    if (!sd.stream) return FALSE;\n\n    for (i=0; i < it8 ->TablesCount; i++) {\n\n            cmsIT8SetTable(hIT8, i);\n            WriteHeader(it8, &sd);\n            WriteDataFormat(&sd, it8);\n            WriteData(&sd, it8);\n    }\n\n    if (fclose(sd.stream) != 0) return FALSE;\n\n    return TRUE;\n}\n\n\n// Saves to memory\ncmsBool CMSEXPORT cmsIT8SaveToMem(cmsHANDLE hIT8, void *MemPtr, cmsUInt32Number* BytesNeeded)\n{\n    SAVESTREAM sd;\n    cmsUInt32Number i;\n    cmsIT8* it8 = (cmsIT8*) hIT8;\n\n    memset(&sd, 0, sizeof(sd));\n\n    sd.stream = NULL;\n    sd.Base   = (cmsUInt8Number*)  MemPtr;\n    sd.Ptr    = sd.Base;\n\n    sd.Used = 0;\n\n    if (sd.Base)\n        sd.Max  = *BytesNeeded;     // Write to memory?\n    else\n        sd.Max  = 0;                // Just counting the needed bytes\n\n    for (i=0; i < it8 ->TablesCount; i++) {\n\n        cmsIT8SetTable(hIT8, i);\n        WriteHeader(it8, &sd);\n        WriteDataFormat(&sd, it8);\n        WriteData(&sd, it8);\n    }\n\n    sd.Used++;  // The \\0 at the very end\n\n    if (sd.Base)\n        *sd.Ptr = 0;\n\n    *BytesNeeded = sd.Used;\n\n    return TRUE;\n}\n\n\n// -------------------------------------------------------------- Higer level parsing\n\nstatic\ncmsBool DataFormatSection(cmsIT8* it8)\n{\n    int iField = 0;\n    TABLE* t = GetTable(it8);\n\n    InSymbol(it8);   // Eats \"BEGIN_DATA_FORMAT\"\n    CheckEOLN(it8);\n\n    while (it8->sy != SEND_DATA_FORMAT &&\n        it8->sy != SEOLN &&\n        it8->sy != SEOF &&\n        it8->sy != SSYNERROR)  {\n\n            if (it8->sy != SIDENT) {\n\n                return SynError(it8, \"Sample type expected\");\n            }\n\n            if (!SetDataFormat(it8, iField, it8->id)) return FALSE;\n            iField++;\n\n            InSymbol(it8);\n            SkipEOLN(it8);\n       }\n\n       SkipEOLN(it8);\n       Skip(it8, SEND_DATA_FORMAT);\n       SkipEOLN(it8);\n\n       if (iField != t ->nSamples) {\n           SynError(it8, \"Count mismatch. NUMBER_OF_FIELDS was %d, found %d\\n\", t ->nSamples, iField);\n\n\n       }\n\n       return TRUE;\n}\n\n\n\nstatic\ncmsBool DataSection (cmsIT8* it8)\n{\n    int  iField = 0;\n    int  iSet   = 0;\n    char Buffer[256];\n    TABLE* t = GetTable(it8);\n\n    InSymbol(it8);   // Eats \"BEGIN_DATA\"\n    CheckEOLN(it8);\n\n    if (!t->Data)\n        AllocateDataSet(it8);\n\n    while (it8->sy != SEND_DATA && it8->sy != SEOF)\n    {\n        if (iField >= t -> nSamples) {\n            iField = 0;\n            iSet++;\n\n        }\n\n        if (it8->sy != SEND_DATA && it8->sy != SEOF) {\n\n            if (!GetVal(it8, Buffer, 255, \"Sample data expected\"))\n                return FALSE;\n\n            if (!SetData(it8, iSet, iField, Buffer))\n                return FALSE;\n\n            iField++;\n\n            InSymbol(it8);\n            SkipEOLN(it8);\n        }\n    }\n\n    SkipEOLN(it8);\n    Skip(it8, SEND_DATA);\n    SkipEOLN(it8);\n\n    // Check for data completion.\n\n    if ((iSet+1) != t -> nPatches)\n        return SynError(it8, \"Count mismatch. NUMBER_OF_SETS was %d, found %d\\n\", t ->nPatches, iSet+1);\n\n    return TRUE;\n}\n\n\n\n\nstatic\ncmsBool HeaderSection(cmsIT8* it8)\n{\n    char VarName[MAXID];\n    char Buffer[MAXSTR];\n    KEYVALUE* Key;\n\n        while (it8->sy != SEOF &&\n               it8->sy != SSYNERROR &&\n               it8->sy != SBEGIN_DATA_FORMAT &&\n               it8->sy != SBEGIN_DATA) {\n\n\n        switch (it8 -> sy) {\n\n        case SKEYWORD:\n                InSymbol(it8);\n                if (!GetVal(it8, Buffer, MAXSTR-1, \"Keyword expected\")) return FALSE;\n                if (!AddAvailableProperty(it8, Buffer, WRITE_UNCOOKED)) return FALSE;\n                InSymbol(it8);\n                break;\n\n\n        case SDATA_FORMAT_ID:\n                InSymbol(it8);\n                if (!GetVal(it8, Buffer, MAXSTR-1, \"Keyword expected\")) return FALSE;\n                if (!AddAvailableSampleID(it8, Buffer)) return FALSE;\n                InSymbol(it8);\n                break;\n\n\n        case SIDENT:\n                strncpy(VarName, it8->id, MAXID-1);\n                VarName[MAXID-1] = 0;\n\n                if (!IsAvailableOnList(it8-> ValidKeywords, VarName, NULL, &Key)) {\n\n#ifdef CMS_STRICT_CGATS\n                 return SynError(it8, \"Undefined keyword '%s'\", VarName);\n#else\n                    Key = AddAvailableProperty(it8, VarName, WRITE_UNCOOKED);\n                    if (Key == NULL) return FALSE;\n#endif\n                }\n\n                InSymbol(it8);\n                if (!GetVal(it8, Buffer, MAXSTR-1, \"Property data expected\")) return FALSE;\n\n                if(Key->WriteAs != WRITE_PAIR) {\n                    AddToList(it8, &GetTable(it8)->HeaderList, VarName, NULL, Buffer,\n                                (it8->sy == SSTRING) ? WRITE_STRINGIFY : WRITE_UNCOOKED);\n                }\n                else {\n                    const char *Subkey;\n                    char *Nextkey;\n                    if (it8->sy != SSTRING)\n                        return SynError(it8, \"Invalid value '%s' for property '%s'.\", Buffer, VarName);\n\n                    // chop the string as a list of \"subkey, value\" pairs, using ';' as a separator\n                    for (Subkey = Buffer; Subkey != NULL; Subkey = Nextkey)\n                    {\n                        char *Value, *temp;\n\n                        //  identify token pair boundary\n                        Nextkey = (char*) strchr(Subkey, ';');\n                        if(Nextkey)\n                            *Nextkey++ = '\\0';\n\n                        // for each pair, split the subkey and the value\n                        Value = (char*) strrchr(Subkey, ',');\n                        if(Value == NULL)\n                            return SynError(it8, \"Invalid value for property '%s'.\", VarName);\n\n                        // gobble the spaces before the coma, and the coma itself\n                        temp = Value++;\n                        do *temp-- = '\\0'; while(temp >= Subkey && *temp == ' ');\n\n                        // gobble any space at the right\n                        temp = Value + strlen(Value) - 1;\n                        while(*temp == ' ') *temp-- = '\\0';\n\n                        // trim the strings from the left\n                        Subkey += strspn(Subkey, \" \");\n                        Value += strspn(Value, \" \");\n\n                        if(Subkey[0] == 0 || Value[0] == 0)\n                            return SynError(it8, \"Invalid value for property '%s'.\", VarName);\n                        AddToList(it8, &GetTable(it8)->HeaderList, VarName, Subkey, Value, WRITE_PAIR);\n                    }\n                }\n\n                InSymbol(it8);\n                break;\n\n\n        case SEOLN: break;\n\n        default:\n                return SynError(it8, \"expected keyword or identifier\");\n        }\n\n    SkipEOLN(it8);\n    }\n\n    return TRUE;\n\n}\n\n\nstatic\nvoid ReadType(cmsIT8* it8, char* SheetTypePtr)\n{\n    // First line is a very special case.\n\n    while (isseparator(it8->ch))\n            NextCh(it8);\n\n    while (it8->ch != '\\r' && it8 ->ch != '\\n' && it8->ch != '\\t' && it8 -> ch != -1) {\n\n        *SheetTypePtr++= (char) it8 ->ch;\n        NextCh(it8);\n    }\n\n    *SheetTypePtr = 0;\n}\n\n\nstatic\ncmsBool ParseIT8(cmsIT8* it8, cmsBool nosheet)\n{\n    char* SheetTypePtr = it8 ->Tab[0].SheetType;\n\n    if (nosheet == 0) {\n        ReadType(it8, SheetTypePtr);\n    }\n\n    InSymbol(it8);\n\n    SkipEOLN(it8);\n\n    while (it8-> sy != SEOF &&\n           it8-> sy != SSYNERROR) {\n\n            switch (it8 -> sy) {\n\n            case SBEGIN_DATA_FORMAT:\n                    if (!DataFormatSection(it8)) return FALSE;\n                    break;\n\n            case SBEGIN_DATA:\n\n                    if (!DataSection(it8)) return FALSE;\n\n                    if (it8 -> sy != SEOF) {\n\n                            AllocTable(it8);\n                            it8 ->nTable = it8 ->TablesCount - 1;\n\n                            // Read sheet type if present. We only support identifier and string.\n                            // <ident> <eoln> is a type string\n                            // anything else, is not a type string\n                            if (nosheet == 0) {\n\n                                if (it8 ->sy == SIDENT) {\n\n                                    // May be a type sheet or may be a prop value statement. We cannot use insymbol in\n                                    // this special case...\n                                     while (isseparator(it8->ch))\n                                         NextCh(it8);\n\n                                     // If a newline is found, then this is a type string\n                                    if (it8 ->ch == '\\n' || it8->ch == '\\r') {\n\n                                         cmsIT8SetSheetType(it8, it8 ->id);\n                                         InSymbol(it8);\n                                    }\n                                    else\n                                    {\n                                        // It is not. Just continue\n                                        cmsIT8SetSheetType(it8, \"\");\n                                    }\n                                }\n                                else\n                                    // Validate quoted strings\n                                    if (it8 ->sy == SSTRING) {\n                                        cmsIT8SetSheetType(it8, it8 ->str);\n                                        InSymbol(it8);\n                                    }\n                           }\n\n                    }\n                    break;\n\n            case SEOLN:\n                    SkipEOLN(it8);\n                    break;\n\n            default:\n                    if (!HeaderSection(it8)) return FALSE;\n           }\n\n    }\n\n    return (it8 -> sy != SSYNERROR);\n}\n\n\n\n// Init usefull pointers\n\nstatic\nvoid CookPointers(cmsIT8* it8)\n{\n    int idField, i;\n    char* Fld;\n    cmsUInt32Number j;\n    cmsUInt32Number nOldTable = it8 ->nTable;\n\n    for (j=0; j < it8 ->TablesCount; j++) {\n\n    TABLE* t = it8 ->Tab + j;\n\n    t -> SampleID = 0;\n    it8 ->nTable = j;\n\n    for (idField = 0; idField < t -> nSamples; idField++)\n    {\n        if (t ->DataFormat == NULL){\n            SynError(it8, \"Undefined DATA_FORMAT\");\n            return;\n        }\n\n        Fld = t->DataFormat[idField];\n        if (!Fld) continue;\n\n\n        if (cmsstrcasecmp(Fld, \"SAMPLE_ID\") == 0) {\n\n            t -> SampleID = idField;\n\n            for (i=0; i < t -> nPatches; i++) {\n\n                char *Data = GetData(it8, i, idField);\n                if (Data) {\n                    char Buffer[256];\n\n                    strncpy(Buffer, Data, 255);\n                    Buffer[255] = 0;\n\n                    if (strlen(Buffer) <= strlen(Data))\n                        strcpy(Data, Buffer);\n                    else\n                        SetData(it8, i, idField, Buffer);\n\n                }\n            }\n\n        }\n\n        // \"LABEL\" is an extension. It keeps references to forward tables\n\n        if ((cmsstrcasecmp(Fld, \"LABEL\") == 0) || Fld[0] == '$' ) {\n\n                    // Search for table references...\n                    for (i=0; i < t -> nPatches; i++) {\n\n                            char *Label = GetData(it8, i, idField);\n\n                            if (Label) {\n\n                                cmsUInt32Number k;\n\n                                // This is the label, search for a table containing\n                                // this property\n\n                                for (k=0; k < it8 ->TablesCount; k++) {\n\n                                    TABLE* Table = it8 ->Tab + k;\n                                    KEYVALUE* p;\n\n                                    if (IsAvailableOnList(Table->HeaderList, Label, NULL, &p)) {\n\n                                        // Available, keep type and table\n                                        char Buffer[256];\n\n                                        char *Type  = p ->Value;\n                                        int  nTable = (int) k;\n\n                                        snprintf(Buffer, 255, \"%s %d %s\", Label, nTable, Type );\n\n                                        SetData(it8, i, idField, Buffer);\n                                    }\n                                }\n\n\n                            }\n\n                    }\n\n\n        }\n\n    }\n    }\n\n    it8 ->nTable = nOldTable;\n}\n\n// Try to infere if the file is a CGATS/IT8 file at all. Read first line\n// that should be something like some printable characters plus a \\n\n// returns 0 if this is not like a CGATS, or an integer otherwise. This integer is the number of words in first line?\nstatic\nint IsMyBlock(cmsUInt8Number* Buffer, int n)\n{\n    int words = 1, space = 0, quot = 0;\n    int i;\n\n    if (n < 10) return 0;   // Too small\n\n    if (n > 132)\n        n = 132;\n\n    for (i = 1; i < n; i++) {\n\n        switch(Buffer[i])\n        {\n        case '\\n':\n        case '\\r':\n            return ((quot == 1) || (words > 2)) ? 0 : words;\n        case '\\t':\n        case ' ':\n            if(!quot && !space)\n                space = 1;\n            break;\n        case '\\\"':\n            quot = !quot;\n            break;\n        default:\n            if (Buffer[i] < 32) return 0;\n            if (Buffer[i] > 127) return 0;\n            words += space;\n            space = 0;\n            break;\n        }\n    }\n\n    return 0;\n}\n\n\nstatic\ncmsBool IsMyFile(const char* FileName)\n{\n   FILE *fp;\n   cmsUInt32Number Size;\n   cmsUInt8Number Ptr[133];\n\n   fp = fopen(FileName, \"rt\");\n   if (!fp) {\n       cmsSignalError(0, cmsERROR_FILE, \"File '%s' not found\", FileName);\n       return FALSE;\n   }\n\n   Size = (cmsUInt32Number) fread(Ptr, 1, 132, fp);\n\n   if (fclose(fp) != 0)\n       return FALSE;\n\n   Ptr[Size] = '\\0';\n\n   return IsMyBlock(Ptr, Size);\n}\n\n// ---------------------------------------------------------- Exported routines\n\n\ncmsHANDLE  CMSEXPORT cmsIT8LoadFromMem(cmsContext ContextID, void *Ptr, cmsUInt32Number len)\n{\n    cmsHANDLE hIT8;\n    cmsIT8*  it8;\n    int type;\n\n    _cmsAssert(Ptr != NULL);\n    _cmsAssert(len != 0);\n\n    type = IsMyBlock((cmsUInt8Number*)Ptr, len);\n    if (type == 0) return NULL;\n\n    hIT8 = cmsIT8Alloc(ContextID);\n    if (!hIT8) return NULL;\n\n    it8 = (cmsIT8*) hIT8;\n    it8 ->MemoryBlock = (char*) _cmsMalloc(ContextID, len + 1);\n\n    strncpy(it8 ->MemoryBlock, (const char*) Ptr, len);\n    it8 ->MemoryBlock[len] = 0;\n\n    strncpy(it8->FileStack[0]->FileName, \"\", cmsMAX_PATH-1);\n    it8-> Source = it8 -> MemoryBlock;\n\n    if (!ParseIT8(it8, type-1)) {\n\n        cmsIT8Free(hIT8);\n        return FALSE;\n    }\n\n    CookPointers(it8);\n    it8 ->nTable = 0;\n\n    _cmsFree(ContextID, it8->MemoryBlock);\n    it8 -> MemoryBlock = NULL;\n\n    return hIT8;\n\n\n}\n\n\ncmsHANDLE  CMSEXPORT cmsIT8LoadFromFile(cmsContext ContextID, const char* cFileName)\n{\n\n     cmsHANDLE hIT8;\n     cmsIT8*  it8;\n     int type;\n\n     _cmsAssert(cFileName != NULL);\n\n     type = IsMyFile(cFileName);\n     if (type == 0) return NULL;\n\n     hIT8 = cmsIT8Alloc(ContextID);\n     it8 = (cmsIT8*) hIT8;\n     if (!hIT8) return NULL;\n\n\n     it8 ->FileStack[0]->Stream = fopen(cFileName, \"rt\");\n\n     if (!it8 ->FileStack[0]->Stream) {\n         cmsIT8Free(hIT8);\n         return NULL;\n     }\n\n\n    strncpy(it8->FileStack[0]->FileName, cFileName, cmsMAX_PATH-1);\n    it8->FileStack[0]->FileName[cmsMAX_PATH-1] = 0;\n\n    if (!ParseIT8(it8, type-1)) {\n\n            fclose(it8 ->FileStack[0]->Stream);\n            cmsIT8Free(hIT8);\n            return NULL;\n    }\n\n    CookPointers(it8);\n    it8 ->nTable = 0;\n\n    if (fclose(it8 ->FileStack[0]->Stream)!= 0) {\n            cmsIT8Free(hIT8);\n            return NULL;\n    }\n\n    return hIT8;\n\n}\n\nint CMSEXPORT cmsIT8EnumDataFormat(cmsHANDLE hIT8, char ***SampleNames)\n{\n    cmsIT8* it8 = (cmsIT8*) hIT8;\n    TABLE* t;\n\n    _cmsAssert(hIT8 != NULL);\n\n    t = GetTable(it8);\n\n    if (SampleNames)\n        *SampleNames = t -> DataFormat;\n    return t -> nSamples;\n}\n\n\ncmsUInt32Number CMSEXPORT cmsIT8EnumProperties(cmsHANDLE hIT8, char ***PropertyNames)\n{\n    cmsIT8* it8 = (cmsIT8*) hIT8;\n    KEYVALUE* p;\n    cmsUInt32Number n;\n    char **Props;\n    TABLE* t;\n\n    _cmsAssert(hIT8 != NULL);\n\n    t = GetTable(it8);\n\n    // Pass#1 - count properties\n\n    n = 0;\n    for (p = t -> HeaderList;  p != NULL; p = p->Next) {\n        n++;\n    }\n\n\n    Props = (char **) AllocChunk(it8, sizeof(char *) * n);\n\n    // Pass#2 - Fill pointers\n    n = 0;\n    for (p = t -> HeaderList;  p != NULL; p = p->Next) {\n        Props[n++] = p -> Keyword;\n    }\n\n    *PropertyNames = Props;\n    return n;\n}\n\ncmsUInt32Number CMSEXPORT cmsIT8EnumPropertyMulti(cmsHANDLE hIT8, const char* cProp, const char ***SubpropertyNames)\n{\n    cmsIT8* it8 = (cmsIT8*) hIT8;\n    KEYVALUE *p, *tmp;\n    cmsUInt32Number n;\n    const char **Props;\n    TABLE* t;\n\n    _cmsAssert(hIT8 != NULL);\n\n\n    t = GetTable(it8);\n\n    if(!IsAvailableOnList(t->HeaderList, cProp, NULL, &p)) {\n        *SubpropertyNames = 0;\n        return 0;\n    }\n\n    // Pass#1 - count properties\n\n    n = 0;\n    for (tmp = p;  tmp != NULL; tmp = tmp->NextSubkey) {\n        if(tmp->Subkey != NULL)\n            n++;\n    }\n\n\n    Props = (const char **) AllocChunk(it8, sizeof(char *) * n);\n\n    // Pass#2 - Fill pointers\n    n = 0;\n    for (tmp = p;  tmp != NULL; tmp = tmp->NextSubkey) {\n        if(tmp->Subkey != NULL)\n            Props[n++] = p ->Subkey;\n    }\n\n    *SubpropertyNames = Props;\n    return n;\n}\n\nstatic\nint LocatePatch(cmsIT8* it8, const char* cPatch)\n{\n    int i;\n    const char *data;\n    TABLE* t = GetTable(it8);\n\n    for (i=0; i < t-> nPatches; i++) {\n\n        data = GetData(it8, i, t->SampleID);\n\n        if (data != NULL) {\n\n                if (cmsstrcasecmp(data, cPatch) == 0)\n                        return i;\n                }\n        }\n\n        // SynError(it8, \"Couldn't find patch '%s'\\n\", cPatch);\n        return -1;\n}\n\n\nstatic\nint LocateEmptyPatch(cmsIT8* it8)\n{\n    int i;\n    const char *data;\n    TABLE* t = GetTable(it8);\n\n    for (i=0; i < t-> nPatches; i++) {\n\n        data = GetData(it8, i, t->SampleID);\n\n        if (data == NULL)\n            return i;\n\n    }\n\n    return -1;\n}\n\nstatic\nint LocateSample(cmsIT8* it8, const char* cSample)\n{\n    int i;\n    const char *fld;\n    TABLE* t = GetTable(it8);\n\n    for (i=0; i < t->nSamples; i++) {\n\n        fld = GetDataFormat(it8, i);\n        if (cmsstrcasecmp(fld, cSample) == 0)\n            return i;\n    }\n\n    return -1;\n\n}\n\n\nint CMSEXPORT cmsIT8FindDataFormat(cmsHANDLE hIT8, const char* cSample)\n{\n    cmsIT8* it8 = (cmsIT8*) hIT8;\n\n    _cmsAssert(hIT8 != NULL);\n\n    return LocateSample(it8, cSample);\n}\n\n\n\nconst char* CMSEXPORT cmsIT8GetDataRowCol(cmsHANDLE hIT8, int row, int col)\n{\n    cmsIT8* it8 = (cmsIT8*) hIT8;\n\n    _cmsAssert(hIT8 != NULL);\n\n    return GetData(it8, row, col);\n}\n\n\ncmsFloat64Number CMSEXPORT cmsIT8GetDataRowColDbl(cmsHANDLE hIT8, int row, int col)\n{\n    const char* Buffer;\n\n    Buffer = cmsIT8GetDataRowCol(hIT8, row, col);\n\n    if (Buffer == NULL) return 0.0;\n\n    return ParseFloatNumber(Buffer);\n}\n\n\ncmsBool CMSEXPORT cmsIT8SetDataRowCol(cmsHANDLE hIT8, int row, int col, const char* Val)\n{\n    cmsIT8* it8 = (cmsIT8*) hIT8;\n\n    _cmsAssert(hIT8 != NULL);\n\n    return SetData(it8, row, col, Val);\n}\n\n\ncmsBool CMSEXPORT cmsIT8SetDataRowColDbl(cmsHANDLE hIT8, int row, int col, cmsFloat64Number Val)\n{\n    cmsIT8* it8 = (cmsIT8*) hIT8;\n    char Buff[256];\n\n    _cmsAssert(hIT8 != NULL);\n\n    sprintf(Buff, it8->DoubleFormatter, Val);\n\n    return SetData(it8, row, col, Buff);\n}\n\n\n\nconst char* CMSEXPORT cmsIT8GetData(cmsHANDLE hIT8, const char* cPatch, const char* cSample)\n{\n    cmsIT8* it8 = (cmsIT8*) hIT8;\n    int iField, iSet;\n\n    _cmsAssert(hIT8 != NULL);\n\n    iField = LocateSample(it8, cSample);\n    if (iField < 0) {\n        return NULL;\n    }\n\n    iSet = LocatePatch(it8, cPatch);\n    if (iSet < 0) {\n            return NULL;\n    }\n\n    return GetData(it8, iSet, iField);\n}\n\n\ncmsFloat64Number CMSEXPORT cmsIT8GetDataDbl(cmsHANDLE  it8, const char* cPatch, const char* cSample)\n{\n    const char* Buffer;\n\n    Buffer = cmsIT8GetData(it8, cPatch, cSample);\n\n    return ParseFloatNumber(Buffer);\n}\n\n\n\ncmsBool CMSEXPORT cmsIT8SetData(cmsHANDLE hIT8, const char* cPatch, const char* cSample, const char *Val)\n{\n    cmsIT8* it8 = (cmsIT8*) hIT8;\n    int iField, iSet;\n    TABLE* t;\n\n    _cmsAssert(hIT8 != NULL);\n\n    t = GetTable(it8);\n\n    iField = LocateSample(it8, cSample);\n\n    if (iField < 0)\n        return FALSE;\n\n    if (t-> nPatches == 0) {\n\n        AllocateDataFormat(it8);\n        AllocateDataSet(it8);\n        CookPointers(it8);\n    }\n\n    if (cmsstrcasecmp(cSample, \"SAMPLE_ID\") == 0) {\n\n        iSet   = LocateEmptyPatch(it8);\n        if (iSet < 0) {\n            return SynError(it8, \"Couldn't add more patches '%s'\\n\", cPatch);\n        }\n\n        iField = t -> SampleID;\n    }\n    else {\n        iSet = LocatePatch(it8, cPatch);\n        if (iSet < 0) {\n            return FALSE;\n        }\n    }\n\n    return SetData(it8, iSet, iField, Val);\n}\n\n\ncmsBool CMSEXPORT cmsIT8SetDataDbl(cmsHANDLE hIT8, const char* cPatch,\n                                   const char* cSample,\n                                   cmsFloat64Number Val)\n{\n    cmsIT8* it8 = (cmsIT8*) hIT8;\n    char Buff[256];\n\n    _cmsAssert(hIT8 != NULL);\n\n    snprintf(Buff, 255, it8->DoubleFormatter, Val);\n    return cmsIT8SetData(hIT8, cPatch, cSample, Buff);\n}\n\n// Buffer should get MAXSTR at least\n\nconst char* CMSEXPORT cmsIT8GetPatchName(cmsHANDLE hIT8, int nPatch, char* buffer)\n{\n    cmsIT8* it8 = (cmsIT8*) hIT8;\n    TABLE* t;\n    char* Data;\n\n    _cmsAssert(hIT8 != NULL);\n\n    t = GetTable(it8);\n    Data = GetData(it8, nPatch, t->SampleID);\n\n    if (!Data) return NULL;\n    if (!buffer) return Data;\n\n    strncpy(buffer, Data, MAXSTR-1);\n    buffer[MAXSTR-1] = 0;\n    return buffer;\n}\n\nint CMSEXPORT cmsIT8GetPatchByName(cmsHANDLE hIT8, const char *cPatch)\n{\n    _cmsAssert(hIT8 != NULL);\n\n    return LocatePatch((cmsIT8*)hIT8, cPatch);\n}\n\ncmsUInt32Number CMSEXPORT cmsIT8TableCount(cmsHANDLE hIT8)\n{\n    cmsIT8* it8 = (cmsIT8*) hIT8;\n\n    _cmsAssert(hIT8 != NULL);\n\n    return it8 ->TablesCount;\n}\n\n// This handles the \"LABEL\" extension.\n// Label, nTable, Type\n\nint CMSEXPORT cmsIT8SetTableByLabel(cmsHANDLE hIT8, const char* cSet, const char* cField, const char* ExpectedType)\n{\n    const char* cLabelFld;\n    char Type[256], Label[256];\n    int nTable;\n\n    _cmsAssert(hIT8 != NULL);\n\n    if (cField != NULL && *cField == 0)\n            cField = \"LABEL\";\n\n    if (cField == NULL)\n            cField = \"LABEL\";\n\n    cLabelFld = cmsIT8GetData(hIT8, cSet, cField);\n    if (!cLabelFld) return -1;\n\n    if (sscanf(cLabelFld, \"%255s %d %255s\", Label, &nTable, Type) != 3)\n            return -1;\n\n    if (ExpectedType != NULL && *ExpectedType == 0)\n        ExpectedType = NULL;\n\n    if (ExpectedType) {\n\n        if (cmsstrcasecmp(Type, ExpectedType) != 0) return -1;\n    }\n\n    return cmsIT8SetTable(hIT8, nTable);\n}\n\n\ncmsBool CMSEXPORT cmsIT8SetIndexColumn(cmsHANDLE hIT8, const char* cSample)\n{\n    cmsIT8* it8 = (cmsIT8*) hIT8;\n    int pos;\n\n    _cmsAssert(hIT8 != NULL);\n\n    pos = LocateSample(it8, cSample);\n    if(pos == -1)\n        return FALSE;\n\n    it8->Tab[it8->nTable].SampleID = pos;\n    return TRUE;\n}\n\n\nvoid CMSEXPORT cmsIT8DefineDblFormat(cmsHANDLE hIT8, const char* Formatter)\n{\n    cmsIT8* it8 = (cmsIT8*) hIT8;\n\n    _cmsAssert(hIT8 != NULL);\n\n    if (Formatter == NULL)\n        strcpy(it8->DoubleFormatter, DEFAULT_DBL_FORMAT);\n    else\n        strncpy(it8->DoubleFormatter, Formatter, sizeof(it8->DoubleFormatter));\n\n    it8 ->DoubleFormatter[sizeof(it8 ->DoubleFormatter)-1] = 0;\n}\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/src/cmscnvrt.c",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2012 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n//\n\n#include \"lcms2_internal.h\"\n\n\n// Link several profiles to obtain a single LUT modelling the whole color transform. Intents, Black point\n// compensation and Adaptation parameters may vary across profiles. BPC and Adaptation refers to the PCS\n// after the profile. I.e, BPC[0] refers to connexion between profile(0) and profile(1)\ncmsPipeline* _cmsLinkProfiles(cmsContext     ContextID,\n                              cmsUInt32Number nProfiles,\n                              cmsUInt32Number Intents[],\n                              cmsHPROFILE     hProfiles[],\n                              cmsBool         BPC[],\n                              cmsFloat64Number AdaptationStates[],\n                              cmsUInt32Number dwFlags);\n\n//---------------------------------------------------------------------------------\n\n// This is the default routine for ICC-style intents. A user may decide to override it by using a plugin.\n// Supported intents are perceptual, relative colorimetric, saturation and ICC-absolute colorimetric\nstatic\ncmsPipeline* DefaultICCintents(cmsContext     ContextID,\n                               cmsUInt32Number nProfiles,\n                               cmsUInt32Number Intents[],\n                               cmsHPROFILE     hProfiles[],\n                               cmsBool         BPC[],\n                               cmsFloat64Number AdaptationStates[],\n                               cmsUInt32Number dwFlags);\n\n//---------------------------------------------------------------------------------\n\n// This is the entry for black-preserving K-only intents, which are non-ICC. Last profile have to be a output profile\n// to do the trick (no devicelinks allowed at that position)\nstatic\ncmsPipeline*  BlackPreservingKOnlyIntents(cmsContext     ContextID,\n                                          cmsUInt32Number nProfiles,\n                                          cmsUInt32Number Intents[],\n                                          cmsHPROFILE     hProfiles[],\n                                          cmsBool         BPC[],\n                                          cmsFloat64Number AdaptationStates[],\n                                          cmsUInt32Number dwFlags);\n\n//---------------------------------------------------------------------------------\n\n// This is the entry for black-plane preserving, which are non-ICC. Again, Last profile have to be a output profile\n// to do the trick (no devicelinks allowed at that position)\nstatic\ncmsPipeline*  BlackPreservingKPlaneIntents(cmsContext     ContextID,\n                                           cmsUInt32Number nProfiles,\n                                           cmsUInt32Number Intents[],\n                                           cmsHPROFILE     hProfiles[],\n                                           cmsBool         BPC[],\n                                           cmsFloat64Number AdaptationStates[],\n                                           cmsUInt32Number dwFlags);\n\n//---------------------------------------------------------------------------------\n\n\n// This is a structure holding implementations for all supported intents.\ntypedef struct _cms_intents_list {\n\n    cmsUInt32Number Intent;\n    char            Description[256];\n    cmsIntentFn     Link;\n    struct _cms_intents_list*  Next;\n\n} cmsIntentsList;\n\n\n// Built-in intents\nstatic cmsIntentsList DefaultIntents[] = {\n\n    { INTENT_PERCEPTUAL,                            \"Perceptual\",                                   DefaultICCintents,            &DefaultIntents[1] },\n    { INTENT_RELATIVE_COLORIMETRIC,                 \"Relative colorimetric\",                        DefaultICCintents,            &DefaultIntents[2] },\n    { INTENT_SATURATION,                            \"Saturation\",                                   DefaultICCintents,            &DefaultIntents[3] },\n    { INTENT_ABSOLUTE_COLORIMETRIC,                 \"Absolute colorimetric\",                        DefaultICCintents,            &DefaultIntents[4] },\n    { INTENT_PRESERVE_K_ONLY_PERCEPTUAL,            \"Perceptual preserving black ink\",              BlackPreservingKOnlyIntents,  &DefaultIntents[5] },\n    { INTENT_PRESERVE_K_ONLY_RELATIVE_COLORIMETRIC, \"Relative colorimetric preserving black ink\",   BlackPreservingKOnlyIntents,  &DefaultIntents[6] },\n    { INTENT_PRESERVE_K_ONLY_SATURATION,            \"Saturation preserving black ink\",              BlackPreservingKOnlyIntents,  &DefaultIntents[7] },\n    { INTENT_PRESERVE_K_PLANE_PERCEPTUAL,           \"Perceptual preserving black plane\",            BlackPreservingKPlaneIntents, &DefaultIntents[8] },\n    { INTENT_PRESERVE_K_PLANE_RELATIVE_COLORIMETRIC,\"Relative colorimetric preserving black plane\", BlackPreservingKPlaneIntents, &DefaultIntents[9] },\n    { INTENT_PRESERVE_K_PLANE_SATURATION,           \"Saturation preserving black plane\",            BlackPreservingKPlaneIntents, NULL }\n};\n\n\n// A pointer to the begining of the list\n_cmsIntentsPluginChunkType _cmsIntentsPluginChunk = { NULL };\n\n// Duplicates the zone of memory used by the plug-in in the new context\nstatic\nvoid DupPluginIntentsList(struct _cmsContext_struct* ctx, \n                                               const struct _cmsContext_struct* src)\n{\n   _cmsIntentsPluginChunkType newHead = { NULL };\n   cmsIntentsList*  entry;\n   cmsIntentsList*  Anterior = NULL;\n   _cmsIntentsPluginChunkType* head = (_cmsIntentsPluginChunkType*) src->chunks[IntentPlugin];\n\n    // Walk the list copying all nodes\n   for (entry = head->Intents;\n        entry != NULL;\n        entry = entry ->Next) {\n\n            cmsIntentsList *newEntry = ( cmsIntentsList *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(cmsIntentsList));\n   \n            if (newEntry == NULL) \n                return;\n\n            // We want to keep the linked list order, so this is a little bit tricky\n            newEntry -> Next = NULL;\n            if (Anterior)\n                Anterior -> Next = newEntry;\n     \n            Anterior = newEntry;\n\n            if (newHead.Intents == NULL)\n                newHead.Intents = newEntry;\n    }\n\n  ctx ->chunks[IntentPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsIntentsPluginChunkType));\n}\n\nvoid  _cmsAllocIntentsPluginChunk(struct _cmsContext_struct* ctx, \n                                         const struct _cmsContext_struct* src)\n{\n    if (src != NULL) {\n\n        // Copy all linked list\n        DupPluginIntentsList(ctx, src);\n    }\n    else {\n        static _cmsIntentsPluginChunkType IntentsPluginChunkType = { NULL };\n        ctx ->chunks[IntentPlugin] = _cmsSubAllocDup(ctx ->MemPool, &IntentsPluginChunkType, sizeof(_cmsIntentsPluginChunkType));\n    }\n}\n\n\n// Search the list for a suitable intent. Returns NULL if not found\nstatic\ncmsIntentsList* SearchIntent(cmsContext ContextID, cmsUInt32Number Intent)\n{\n    _cmsIntentsPluginChunkType* ctx = ( _cmsIntentsPluginChunkType*) _cmsContextGetClientChunk(ContextID, IntentPlugin);\n    cmsIntentsList* pt;\n\n    for (pt = ctx -> Intents; pt != NULL; pt = pt -> Next)\n        if (pt ->Intent == Intent) return pt;\n\n    for (pt = DefaultIntents; pt != NULL; pt = pt -> Next)\n        if (pt ->Intent == Intent) return pt;\n\n    return NULL;\n}\n\n// Black point compensation. Implemented as a linear scaling in XYZ. Black points\n// should come relative to the white point. Fills an matrix/offset element m\n// which is organized as a 4x4 matrix.\nstatic\nvoid ComputeBlackPointCompensation(const cmsCIEXYZ* BlackPointIn,\n                                   const cmsCIEXYZ* BlackPointOut,\n                                   cmsMAT3* m, cmsVEC3* off)\n{\n  cmsFloat64Number ax, ay, az, bx, by, bz, tx, ty, tz;\n\n   // Now we need to compute a matrix plus an offset m and of such of\n   // [m]*bpin + off = bpout\n   // [m]*D50  + off = D50\n   //\n   // This is a linear scaling in the form ax+b, where\n   // a = (bpout - D50) / (bpin - D50)\n   // b = - D50* (bpout - bpin) / (bpin - D50)\n\n   tx = BlackPointIn->X - cmsD50_XYZ()->X;\n   ty = BlackPointIn->Y - cmsD50_XYZ()->Y;\n   tz = BlackPointIn->Z - cmsD50_XYZ()->Z;\n\n   ax = (BlackPointOut->X - cmsD50_XYZ()->X) / tx;\n   ay = (BlackPointOut->Y - cmsD50_XYZ()->Y) / ty;\n   az = (BlackPointOut->Z - cmsD50_XYZ()->Z) / tz;\n\n   bx = - cmsD50_XYZ()-> X * (BlackPointOut->X - BlackPointIn->X) / tx;\n   by = - cmsD50_XYZ()-> Y * (BlackPointOut->Y - BlackPointIn->Y) / ty;\n   bz = - cmsD50_XYZ()-> Z * (BlackPointOut->Z - BlackPointIn->Z) / tz;\n\n   _cmsVEC3init(&m ->v[0], ax, 0,  0);\n   _cmsVEC3init(&m ->v[1], 0, ay,  0);\n   _cmsVEC3init(&m ->v[2], 0,  0,  az);\n   _cmsVEC3init(off, bx, by, bz);\n\n}\n\n\n// Approximate a blackbody illuminant based on CHAD information\nstatic\ncmsFloat64Number CHAD2Temp(const cmsMAT3* Chad)\n{\n    // Convert D50 across inverse CHAD to get the absolute white point\n    cmsVEC3 d, s;\n    cmsCIEXYZ Dest;\n    cmsCIExyY DestChromaticity;\n    cmsFloat64Number TempK;\n    cmsMAT3 m1, m2;\n\n    m1 = *Chad;\n    if (!_cmsMAT3inverse(&m1, &m2)) return FALSE;\n\n    s.n[VX] = cmsD50_XYZ() -> X;\n    s.n[VY] = cmsD50_XYZ() -> Y;\n    s.n[VZ] = cmsD50_XYZ() -> Z;\n\n    _cmsMAT3eval(&d, &m2, &s);\n\n    Dest.X = d.n[VX];\n    Dest.Y = d.n[VY];\n    Dest.Z = d.n[VZ];\n\n    cmsXYZ2xyY(&DestChromaticity, &Dest);\n\n    if (!cmsTempFromWhitePoint(&TempK, &DestChromaticity))\n        return -1.0;\n\n    return TempK;\n}\n\n// Compute a CHAD based on a given temperature\nstatic\n    void Temp2CHAD(cmsMAT3* Chad, cmsFloat64Number Temp)\n{\n    cmsCIEXYZ White;\n    cmsCIExyY ChromaticityOfWhite;\n\n    cmsWhitePointFromTemp(&ChromaticityOfWhite, Temp);\n    cmsxyY2XYZ(&White, &ChromaticityOfWhite);\n    _cmsAdaptationMatrix(Chad, NULL, &White, cmsD50_XYZ());\n}\n\n// Join scalings to obtain relative input to absolute and then to relative output.\n// Result is stored in a 3x3 matrix\nstatic\ncmsBool  ComputeAbsoluteIntent(cmsFloat64Number AdaptationState,\n                               const cmsCIEXYZ* WhitePointIn,\n                               const cmsMAT3* ChromaticAdaptationMatrixIn,\n                               const cmsCIEXYZ* WhitePointOut,\n                               const cmsMAT3* ChromaticAdaptationMatrixOut,\n                               cmsMAT3* m)\n{\n    cmsMAT3 Scale, m1, m2, m3, m4;\n\n    // Adaptation state\n    if (AdaptationState == 1.0) {\n\n        // Observer is fully adapted. Keep chromatic adaptation.\n        // That is the standard V4 behaviour\n        _cmsVEC3init(&m->v[0], WhitePointIn->X / WhitePointOut->X, 0, 0);\n        _cmsVEC3init(&m->v[1], 0, WhitePointIn->Y / WhitePointOut->Y, 0);\n        _cmsVEC3init(&m->v[2], 0, 0, WhitePointIn->Z / WhitePointOut->Z);\n\n    }\n    else  {\n\n        // Incomplete adaptation. This is an advanced feature.\n        _cmsVEC3init(&Scale.v[0], WhitePointIn->X / WhitePointOut->X, 0, 0);\n        _cmsVEC3init(&Scale.v[1], 0,  WhitePointIn->Y / WhitePointOut->Y, 0);\n        _cmsVEC3init(&Scale.v[2], 0, 0,  WhitePointIn->Z / WhitePointOut->Z);\n\n\n        if (AdaptationState == 0.0) {\n\n            m1 = *ChromaticAdaptationMatrixOut;\n            _cmsMAT3per(&m2, &m1, &Scale);\n            // m2 holds CHAD from output white to D50 times abs. col. scaling\n\n            // Observer is not adapted, undo the chromatic adaptation\n            _cmsMAT3per(m, &m2, ChromaticAdaptationMatrixOut);\n\n            m3 = *ChromaticAdaptationMatrixIn;\n            if (!_cmsMAT3inverse(&m3, &m4)) return FALSE;\n            _cmsMAT3per(m, &m2, &m4);\n\n        } else {\n\n            cmsMAT3 MixedCHAD;\n            cmsFloat64Number TempSrc, TempDest, Temp;\n\n            m1 = *ChromaticAdaptationMatrixIn;\n            if (!_cmsMAT3inverse(&m1, &m2)) return FALSE;\n            _cmsMAT3per(&m3, &m2, &Scale);\n            // m3 holds CHAD from input white to D50 times abs. col. scaling\n\n            TempSrc  = CHAD2Temp(ChromaticAdaptationMatrixIn);\n            TempDest = CHAD2Temp(ChromaticAdaptationMatrixOut);\n\n            if (TempSrc < 0.0 || TempDest < 0.0) return FALSE; // Something went wrong\n\n            if (_cmsMAT3isIdentity(&Scale) && fabs(TempSrc - TempDest) < 0.01) {\n\n                _cmsMAT3identity(m);\n                return TRUE;\n            }\n\n            Temp = (1.0 - AdaptationState) * TempDest + AdaptationState * TempSrc;\n\n            // Get a CHAD from whatever output temperature to D50. This replaces output CHAD\n            Temp2CHAD(&MixedCHAD, Temp);\n\n            _cmsMAT3per(m, &m3, &MixedCHAD);\n        }\n\n    }\n    return TRUE;\n\n}\n\n// Just to see if m matrix should be applied\nstatic\ncmsBool IsEmptyLayer(cmsMAT3* m, cmsVEC3* off)\n{\n    cmsFloat64Number diff = 0;\n    cmsMAT3 Ident;\n    int i;\n\n    if (m == NULL && off == NULL) return TRUE;  // NULL is allowed as an empty layer\n    if (m == NULL && off != NULL) return FALSE; // This is an internal error\n\n    _cmsMAT3identity(&Ident);\n\n    for (i=0; i < 3*3; i++)\n        diff += fabs(((cmsFloat64Number*)m)[i] - ((cmsFloat64Number*)&Ident)[i]);\n\n    for (i=0; i < 3; i++)\n        diff += fabs(((cmsFloat64Number*)off)[i]);\n\n\n    return (diff < 0.002);\n}\n\n\n// Compute the conversion layer\nstatic\ncmsBool ComputeConversion(int i, cmsHPROFILE hProfiles[],\n                                 cmsUInt32Number Intent,\n                                 cmsBool BPC,\n                                 cmsFloat64Number AdaptationState,\n                                 cmsMAT3* m, cmsVEC3* off)\n{\n\n    int k;\n\n    // m  and off are set to identity and this is detected latter on\n    _cmsMAT3identity(m);\n    _cmsVEC3init(off, 0, 0, 0);\n\n    // If intent is abs. colorimetric,\n    if (Intent == INTENT_ABSOLUTE_COLORIMETRIC) {\n\n        cmsCIEXYZ WhitePointIn, WhitePointOut;\n        cmsMAT3 ChromaticAdaptationMatrixIn, ChromaticAdaptationMatrixOut;\n\n        _cmsReadMediaWhitePoint(&WhitePointIn,  hProfiles[i-1]);\n        _cmsReadCHAD(&ChromaticAdaptationMatrixIn, hProfiles[i-1]);\n\n        _cmsReadMediaWhitePoint(&WhitePointOut,  hProfiles[i]);\n        _cmsReadCHAD(&ChromaticAdaptationMatrixOut, hProfiles[i]);\n\n        if (!ComputeAbsoluteIntent(AdaptationState,\n                                  &WhitePointIn,  &ChromaticAdaptationMatrixIn,\n                                  &WhitePointOut, &ChromaticAdaptationMatrixOut, m)) return FALSE;\n\n    }\n    else {\n        // Rest of intents may apply BPC.\n\n        if (BPC) {\n\n            cmsCIEXYZ BlackPointIn, BlackPointOut;\n\n            cmsDetectBlackPoint(&BlackPointIn,  hProfiles[i-1], Intent, 0);\n            cmsDetectDestinationBlackPoint(&BlackPointOut, hProfiles[i], Intent, 0);\n\n            // If black points are equal, then do nothing\n            if (BlackPointIn.X != BlackPointOut.X ||\n                BlackPointIn.Y != BlackPointOut.Y ||\n                BlackPointIn.Z != BlackPointOut.Z)\n                    ComputeBlackPointCompensation(&BlackPointIn, &BlackPointOut, m, off);\n        }\n    }\n\n    // Offset should be adjusted because the encoding. We encode XYZ normalized to 0..1.0,\n    // to do that, we divide by MAX_ENCODEABLE_XZY. The conversion stage goes XYZ -> XYZ so\n    // we have first to convert from encoded to XYZ and then convert back to encoded.\n    // y = Mx + Off\n    // x = x'c\n    // y = M x'c + Off\n    // y = y'c; y' = y / c\n    // y' = (Mx'c + Off) /c = Mx' + (Off / c)\n\n    for (k=0; k < 3; k++) {\n        off ->n[k] /= MAX_ENCODEABLE_XYZ;\n    }\n\n    return TRUE;\n}\n\n\n// Add a conversion stage if needed. If a matrix/offset m is given, it applies to XYZ space\nstatic\ncmsBool AddConversion(cmsPipeline* Result, cmsColorSpaceSignature InPCS, cmsColorSpaceSignature OutPCS, cmsMAT3* m, cmsVEC3* off)\n{\n    cmsFloat64Number* m_as_dbl = (cmsFloat64Number*) m;\n    cmsFloat64Number* off_as_dbl = (cmsFloat64Number*) off;\n\n    // Handle PCS mismatches. A specialized stage is added to the LUT in such case\n    switch (InPCS) {\n\n    case cmsSigXYZData: // Input profile operates in XYZ\n\n        switch (OutPCS) {\n\n        case cmsSigXYZData:  // XYZ -> XYZ\n            if (!IsEmptyLayer(m, off) &&\n                !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)))\n                return FALSE;\n            break;\n\n        case cmsSigLabData:  // XYZ -> Lab\n            if (!IsEmptyLayer(m, off) &&\n                !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)))\n                return FALSE;\n            if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocXYZ2Lab(Result ->ContextID)))\n                return FALSE;\n            break;\n\n        default:\n            return FALSE;   // Colorspace mismatch\n        }\n        break;\n\n    case cmsSigLabData: // Input profile operates in Lab\n\n        switch (OutPCS) {\n\n        case cmsSigXYZData:  // Lab -> XYZ\n\n            if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocLab2XYZ(Result ->ContextID)))\n                return FALSE;\n            if (!IsEmptyLayer(m, off) &&\n                !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)))\n                return FALSE;\n            break;\n\n        case cmsSigLabData:  // Lab -> Lab\n\n            if (!IsEmptyLayer(m, off)) {\n                if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocLab2XYZ(Result ->ContextID)) ||\n                    !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)) ||\n                    !cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocXYZ2Lab(Result ->ContextID)))\n                    return FALSE;\n            }\n            break;\n\n        default:\n            return FALSE;  // Mismatch\n        }\n        break;\n\n        // On colorspaces other than PCS, check for same space\n    default:\n        if (InPCS != OutPCS) return FALSE;\n        break;\n    }\n\n    return TRUE;\n}\n\n\n// Is a given space compatible with another?\nstatic\ncmsBool ColorSpaceIsCompatible(cmsColorSpaceSignature a, cmsColorSpaceSignature b)\n{\n    // If they are same, they are compatible.\n    if (a == b) return TRUE;\n\n    // Check for MCH4 substitution of CMYK\n    if ((a == cmsSig4colorData) && (b == cmsSigCmykData)) return TRUE;\n    if ((a == cmsSigCmykData) && (b == cmsSig4colorData)) return TRUE;\n\n    // Check for XYZ/Lab. Those spaces are interchangeable as they can be computed one from other.\n    if ((a == cmsSigXYZData) && (b == cmsSigLabData)) return TRUE;\n    if ((a == cmsSigLabData) && (b == cmsSigXYZData)) return TRUE;\n\n    return FALSE;\n}\n\n\n// Default handler for ICC-style intents\nstatic\ncmsPipeline* DefaultICCintents(cmsContext       ContextID,\n                               cmsUInt32Number  nProfiles,\n                               cmsUInt32Number  TheIntents[],\n                               cmsHPROFILE      hProfiles[],\n                               cmsBool          BPC[],\n                               cmsFloat64Number AdaptationStates[],\n                               cmsUInt32Number  dwFlags)\n{\n    cmsPipeline* Lut = NULL;\n    cmsPipeline* Result;\n    cmsHPROFILE hProfile;\n    cmsMAT3 m;\n    cmsVEC3 off;\n    cmsColorSpaceSignature ColorSpaceIn, ColorSpaceOut, CurrentColorSpace;\n    cmsProfileClassSignature ClassSig;\n    cmsUInt32Number  i, Intent;\n\n    // For safety\n    if (nProfiles == 0) return NULL;\n\n    // Allocate an empty LUT for holding the result. 0 as channel count means 'undefined'\n    Result = cmsPipelineAlloc(ContextID, 0, 0);\n    if (Result == NULL) return NULL;\n\n    CurrentColorSpace = cmsGetColorSpace(hProfiles[0]);\n\n    for (i=0; i < nProfiles; i++) {\n\n        cmsBool  lIsDeviceLink, lIsInput;\n\n        hProfile      = hProfiles[i];\n        ClassSig      = cmsGetDeviceClass(hProfile);\n        lIsDeviceLink = (ClassSig == cmsSigLinkClass || ClassSig == cmsSigAbstractClass );\n\n        // First profile is used as input unless devicelink or abstract\n        if ((i == 0) && !lIsDeviceLink) {\n            lIsInput = TRUE;\n        }\n        else {\n          // Else use profile in the input direction if current space is not PCS\n        lIsInput      = (CurrentColorSpace != cmsSigXYZData) &&\n                        (CurrentColorSpace != cmsSigLabData);\n        }\n\n        Intent        = TheIntents[i];\n\n        if (lIsInput || lIsDeviceLink) {\n\n            ColorSpaceIn    = cmsGetColorSpace(hProfile);\n            ColorSpaceOut   = cmsGetPCS(hProfile);\n        }\n        else {\n\n            ColorSpaceIn    = cmsGetPCS(hProfile);\n            ColorSpaceOut   = cmsGetColorSpace(hProfile);\n        }\n\n        if (!ColorSpaceIsCompatible(ColorSpaceIn, CurrentColorSpace)) {\n\n            cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, \"ColorSpace mismatch\");\n            goto Error;\n        }\n\n        // If devicelink is found, then no custom intent is allowed and we can\n        // read the LUT to be applied. Settings don't apply here.\n        if (lIsDeviceLink || ((ClassSig == cmsSigNamedColorClass) && (nProfiles == 1))) {\n\n            // Get the involved LUT from the profile\n            Lut = _cmsReadDevicelinkLUT(hProfile, Intent);\n            if (Lut == NULL) goto Error;\n\n            // What about abstract profiles?\n             if (ClassSig == cmsSigAbstractClass && i > 0) {\n                if (!ComputeConversion(i, hProfiles, Intent, BPC[i], AdaptationStates[i], &m, &off)) goto Error;\n             }\n             else {\n                _cmsMAT3identity(&m);\n                _cmsVEC3init(&off, 0, 0, 0);\n             }\n\n\n            if (!AddConversion(Result, CurrentColorSpace, ColorSpaceIn, &m, &off)) goto Error;\n\n        }\n        else {\n\n            if (lIsInput) {\n                // Input direction means non-pcs connection, so proceed like devicelinks\n                Lut = _cmsReadInputLUT(hProfile, Intent);\n                if (Lut == NULL) goto Error;\n            }\n            else {\n\n                // Output direction means PCS connection. Intent may apply here\n                Lut = _cmsReadOutputLUT(hProfile, Intent);\n                if (Lut == NULL) goto Error;\n\n\n                if (!ComputeConversion(i, hProfiles, Intent, BPC[i], AdaptationStates[i], &m, &off)) goto Error;\n                if (!AddConversion(Result, CurrentColorSpace, ColorSpaceIn, &m, &off)) goto Error;\n\n            }\n        }\n\n        // Concatenate to the output LUT\n        if (!cmsPipelineCat(Result, Lut))\n            goto Error;\n\n        cmsPipelineFree(Lut);\n        Lut = NULL;\n\n        // Update current space\n        CurrentColorSpace = ColorSpaceOut;\n    }\n\n    return Result;\n\nError:\n\n    if (Lut != NULL) cmsPipelineFree(Lut);\n    if (Result != NULL) cmsPipelineFree(Result);\n    return NULL;\n\n    cmsUNUSED_PARAMETER(dwFlags);\n}\n\n\n// Wrapper for DLL calling convention\ncmsPipeline*  CMSEXPORT _cmsDefaultICCintents(cmsContext     ContextID,\n                                              cmsUInt32Number nProfiles,\n                                              cmsUInt32Number TheIntents[],\n                                              cmsHPROFILE     hProfiles[],\n                                              cmsBool         BPC[],\n                                              cmsFloat64Number AdaptationStates[],\n                                              cmsUInt32Number dwFlags)\n{\n    return DefaultICCintents(ContextID, nProfiles, TheIntents, hProfiles, BPC, AdaptationStates, dwFlags);\n}\n\n// Black preserving intents ---------------------------------------------------------------------------------------------\n\n// Translate black-preserving intents to ICC ones\nstatic\nint TranslateNonICCIntents(int Intent)\n{\n    switch (Intent) {\n        case INTENT_PRESERVE_K_ONLY_PERCEPTUAL:\n        case INTENT_PRESERVE_K_PLANE_PERCEPTUAL:\n            return INTENT_PERCEPTUAL;\n\n        case INTENT_PRESERVE_K_ONLY_RELATIVE_COLORIMETRIC:\n        case INTENT_PRESERVE_K_PLANE_RELATIVE_COLORIMETRIC:\n            return INTENT_RELATIVE_COLORIMETRIC;\n\n        case INTENT_PRESERVE_K_ONLY_SATURATION:\n        case INTENT_PRESERVE_K_PLANE_SATURATION:\n            return INTENT_SATURATION;\n\n        default: return Intent;\n    }\n}\n\n// Sampler for Black-only preserving CMYK->CMYK transforms\n\ntypedef struct {\n    cmsPipeline*    cmyk2cmyk;      // The original transform\n    cmsToneCurve*   KTone;          // Black-to-black tone curve\n\n} GrayOnlyParams;\n\n\n// Preserve black only if that is the only ink used\nstatic\nint BlackPreservingGrayOnlySampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo)\n{\n    GrayOnlyParams* bp = (GrayOnlyParams*) Cargo;\n\n    // If going across black only, keep black only\n    if (In[0] == 0 && In[1] == 0 && In[2] == 0) {\n\n        // TAC does not apply because it is black ink!\n        Out[0] = Out[1] = Out[2] = 0;\n        Out[3] = cmsEvalToneCurve16(bp->KTone, In[3]);\n        return TRUE;\n    }\n\n    // Keep normal transform for other colors\n    bp ->cmyk2cmyk ->Eval16Fn(In, Out, bp ->cmyk2cmyk->Data);\n    return TRUE;\n}\n\n// This is the entry for black-preserving K-only intents, which are non-ICC\nstatic\ncmsPipeline*  BlackPreservingKOnlyIntents(cmsContext     ContextID,\n                                          cmsUInt32Number nProfiles,\n                                          cmsUInt32Number TheIntents[],\n                                          cmsHPROFILE     hProfiles[],\n                                          cmsBool         BPC[],\n                                          cmsFloat64Number AdaptationStates[],\n                                          cmsUInt32Number dwFlags)\n{\n    GrayOnlyParams  bp;\n    cmsPipeline*    Result;\n    cmsUInt32Number ICCIntents[256];\n    cmsStage*         CLUT;\n    cmsUInt32Number i, nGridPoints;\n\n\n    // Sanity check\n    if (nProfiles < 1 || nProfiles > 255) return NULL;\n\n    // Translate black-preserving intents to ICC ones\n    for (i=0; i < nProfiles; i++)\n        ICCIntents[i] = TranslateNonICCIntents(TheIntents[i]);\n\n    // Check for non-cmyk profiles\n    if (cmsGetColorSpace(hProfiles[0]) != cmsSigCmykData ||\n        cmsGetColorSpace(hProfiles[nProfiles-1]) != cmsSigCmykData)\n           return DefaultICCintents(ContextID, nProfiles, ICCIntents, hProfiles, BPC, AdaptationStates, dwFlags);\n\n    memset(&bp, 0, sizeof(bp));\n\n    // Allocate an empty LUT for holding the result\n    Result = cmsPipelineAlloc(ContextID, 4, 4);\n    if (Result == NULL) return NULL;\n\n    // Create a LUT holding normal ICC transform\n    bp.cmyk2cmyk = DefaultICCintents(ContextID,\n        nProfiles,\n        ICCIntents,\n        hProfiles,\n        BPC,\n        AdaptationStates,\n        dwFlags);\n\n    if (bp.cmyk2cmyk == NULL) goto Error;\n\n    // Now, compute the tone curve\n    bp.KTone = _cmsBuildKToneCurve(ContextID,\n        4096,\n        nProfiles,\n        ICCIntents,\n        hProfiles,\n        BPC,\n        AdaptationStates,\n        dwFlags);\n\n    if (bp.KTone == NULL) goto Error;\n\n\n    // How many gridpoints are we going to use?\n    nGridPoints = _cmsReasonableGridpointsByColorspace(cmsSigCmykData, dwFlags);\n\n    // Create the CLUT. 16 bits\n    CLUT = cmsStageAllocCLut16bit(ContextID, nGridPoints, 4, 4, NULL);\n    if (CLUT == NULL) goto Error;\n\n    // This is the one and only MPE in this LUT\n    if (!cmsPipelineInsertStage(Result, cmsAT_BEGIN, CLUT))\n        goto Error;\n\n    // Sample it. We cannot afford pre/post linearization this time.\n    if (!cmsStageSampleCLut16bit(CLUT, BlackPreservingGrayOnlySampler, (void*) &bp, 0))\n        goto Error;\n\n    // Get rid of xform and tone curve\n    cmsPipelineFree(bp.cmyk2cmyk);\n    cmsFreeToneCurve(bp.KTone);\n\n    return Result;\n\nError:\n\n    if (bp.cmyk2cmyk != NULL) cmsPipelineFree(bp.cmyk2cmyk);\n    if (bp.KTone != NULL)  cmsFreeToneCurve(bp.KTone);\n    if (Result != NULL) cmsPipelineFree(Result);\n    return NULL;\n\n}\n\n// K Plane-preserving CMYK to CMYK ------------------------------------------------------------------------------------\n\ntypedef struct {\n\n    cmsPipeline*     cmyk2cmyk;     // The original transform\n    cmsHTRANSFORM    hProofOutput;  // Output CMYK to Lab (last profile)\n    cmsHTRANSFORM    cmyk2Lab;      // The input chain\n    cmsToneCurve*    KTone;         // Black-to-black tone curve\n    cmsPipeline*     LabK2cmyk;     // The output profile\n    cmsFloat64Number MaxError;\n\n    cmsHTRANSFORM    hRoundTrip;\n    cmsFloat64Number MaxTAC;\n\n\n} PreserveKPlaneParams;\n\n\n// The CLUT will be stored at 16 bits, but calculations are performed at cmsFloat32Number precision\nstatic\nint BlackPreservingSampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo)\n{\n    int i;\n    cmsFloat32Number Inf[4], Outf[4];\n    cmsFloat32Number LabK[4];\n    cmsFloat64Number SumCMY, SumCMYK, Error, Ratio;\n    cmsCIELab ColorimetricLab, BlackPreservingLab;\n    PreserveKPlaneParams* bp = (PreserveKPlaneParams*) Cargo;\n\n    // Convert from 16 bits to floating point\n    for (i=0; i < 4; i++)\n        Inf[i] = (cmsFloat32Number) (In[i] / 65535.0);\n\n    // Get the K across Tone curve\n    LabK[3] = cmsEvalToneCurveFloat(bp ->KTone, Inf[3]);\n\n    // If going across black only, keep black only\n    if (In[0] == 0 && In[1] == 0 && In[2] == 0) {\n\n        Out[0] = Out[1] = Out[2] = 0;\n        Out[3] = _cmsQuickSaturateWord(LabK[3] * 65535.0);\n        return TRUE;\n    }\n\n    // Try the original transform,\n    cmsPipelineEvalFloat( Inf, Outf, bp ->cmyk2cmyk);\n\n    // Store a copy of the floating point result into 16-bit\n    for (i=0; i < 4; i++)\n            Out[i] = _cmsQuickSaturateWord(Outf[i] * 65535.0);\n\n    // Maybe K is already ok (mostly on K=0)\n    if ( fabs(Outf[3] - LabK[3]) < (3.0 / 65535.0) ) {\n        return TRUE;\n    }\n\n    // K differ, mesure and keep Lab measurement for further usage\n    // this is done in relative colorimetric intent\n    cmsDoTransform(bp->hProofOutput, Out, &ColorimetricLab, 1);\n\n    // Is not black only and the transform doesn't keep black.\n    // Obtain the Lab of output CMYK. After that we have Lab + K\n    cmsDoTransform(bp ->cmyk2Lab, Outf, LabK, 1);\n\n    // Obtain the corresponding CMY using reverse interpolation\n    // (K is fixed in LabK[3])\n    if (!cmsPipelineEvalReverseFloat(LabK, Outf, Outf, bp ->LabK2cmyk)) {\n\n        // Cannot find a suitable value, so use colorimetric xform\n        // which is already stored in Out[]\n        return TRUE;\n    }\n\n    // Make sure to pass thru K (which now is fixed)\n    Outf[3] = LabK[3];\n\n    // Apply TAC if needed\n    SumCMY   = Outf[0]  + Outf[1] + Outf[2];\n    SumCMYK  = SumCMY + Outf[3];\n\n    if (SumCMYK > bp ->MaxTAC) {\n\n        Ratio = 1 - ((SumCMYK - bp->MaxTAC) / SumCMY);\n        if (Ratio < 0)\n            Ratio = 0;\n    }\n    else\n       Ratio = 1.0;\n\n    Out[0] = _cmsQuickSaturateWord(Outf[0] * Ratio * 65535.0);     // C\n    Out[1] = _cmsQuickSaturateWord(Outf[1] * Ratio * 65535.0);     // M\n    Out[2] = _cmsQuickSaturateWord(Outf[2] * Ratio * 65535.0);     // Y\n    Out[3] = _cmsQuickSaturateWord(Outf[3] * 65535.0);\n\n    // Estimate the error (this goes 16 bits to Lab DBL)\n    cmsDoTransform(bp->hProofOutput, Out, &BlackPreservingLab, 1);\n    Error = cmsDeltaE(&ColorimetricLab, &BlackPreservingLab);\n    if (Error > bp -> MaxError)\n        bp->MaxError = Error;\n\n    return TRUE;\n}\n\n// This is the entry for black-plane preserving, which are non-ICC\nstatic\ncmsPipeline* BlackPreservingKPlaneIntents(cmsContext     ContextID,\n                                          cmsUInt32Number nProfiles,\n                                          cmsUInt32Number TheIntents[],\n                                          cmsHPROFILE     hProfiles[],\n                                          cmsBool         BPC[],\n                                          cmsFloat64Number AdaptationStates[],\n                                          cmsUInt32Number dwFlags)\n{\n    PreserveKPlaneParams bp;\n    cmsPipeline*    Result = NULL;\n    cmsUInt32Number ICCIntents[256];\n    cmsStage*         CLUT;\n    cmsUInt32Number i, nGridPoints;\n    cmsHPROFILE hLab;\n\n    // Sanity check\n    if (nProfiles < 1 || nProfiles > 255) return NULL;\n\n    // Translate black-preserving intents to ICC ones\n    for (i=0; i < nProfiles; i++)\n        ICCIntents[i] = TranslateNonICCIntents(TheIntents[i]);\n\n    // Check for non-cmyk profiles\n    if (cmsGetColorSpace(hProfiles[0]) != cmsSigCmykData ||\n        !(cmsGetColorSpace(hProfiles[nProfiles-1]) == cmsSigCmykData ||\n        cmsGetDeviceClass(hProfiles[nProfiles-1]) == cmsSigOutputClass))\n           return  DefaultICCintents(ContextID, nProfiles, ICCIntents, hProfiles, BPC, AdaptationStates, dwFlags);\n\n    // Allocate an empty LUT for holding the result\n    Result = cmsPipelineAlloc(ContextID, 4, 4);\n    if (Result == NULL) return NULL;\n\n\n    memset(&bp, 0, sizeof(bp));\n\n    // We need the input LUT of the last profile, assuming this one is responsible of\n    // black generation. This LUT will be seached in inverse order.\n    bp.LabK2cmyk = _cmsReadInputLUT(hProfiles[nProfiles-1], INTENT_RELATIVE_COLORIMETRIC);\n    if (bp.LabK2cmyk == NULL) goto Cleanup;\n\n    // Get total area coverage (in 0..1 domain)\n    bp.MaxTAC = cmsDetectTAC(hProfiles[nProfiles-1]) / 100.0;\n    if (bp.MaxTAC <= 0) goto Cleanup;\n\n\n    // Create a LUT holding normal ICC transform\n    bp.cmyk2cmyk = DefaultICCintents(ContextID,\n                                         nProfiles,\n                                         ICCIntents,\n                                         hProfiles,\n                                         BPC,\n                                         AdaptationStates,\n                                         dwFlags);\n    if (bp.cmyk2cmyk == NULL) goto Cleanup;\n\n    // Now the tone curve\n    bp.KTone = _cmsBuildKToneCurve(ContextID, 4096, nProfiles,\n                                   ICCIntents,\n                                   hProfiles,\n                                   BPC,\n                                   AdaptationStates,\n                                   dwFlags);\n    if (bp.KTone == NULL) goto Cleanup;\n\n    // To measure the output, Last profile to Lab\n    hLab = cmsCreateLab4ProfileTHR(ContextID, NULL);\n    bp.hProofOutput = cmsCreateTransformTHR(ContextID, hProfiles[nProfiles-1],\n                                         CHANNELS_SH(4)|BYTES_SH(2), hLab, TYPE_Lab_DBL,\n                                         INTENT_RELATIVE_COLORIMETRIC,\n                                         cmsFLAGS_NOCACHE|cmsFLAGS_NOOPTIMIZE);\n    if ( bp.hProofOutput == NULL) goto Cleanup;\n\n    // Same as anterior, but lab in the 0..1 range\n    bp.cmyk2Lab = cmsCreateTransformTHR(ContextID, hProfiles[nProfiles-1],\n                                         FLOAT_SH(1)|CHANNELS_SH(4)|BYTES_SH(4), hLab,\n                                         FLOAT_SH(1)|CHANNELS_SH(3)|BYTES_SH(4),\n                                         INTENT_RELATIVE_COLORIMETRIC,\n                                         cmsFLAGS_NOCACHE|cmsFLAGS_NOOPTIMIZE);\n    if (bp.cmyk2Lab == NULL) goto Cleanup;\n    cmsCloseProfile(hLab);\n\n    // Error estimation (for debug only)\n    bp.MaxError = 0;\n\n    // How many gridpoints are we going to use?\n    nGridPoints = _cmsReasonableGridpointsByColorspace(cmsSigCmykData, dwFlags);\n\n\n    CLUT = cmsStageAllocCLut16bit(ContextID, nGridPoints, 4, 4, NULL);\n    if (CLUT == NULL) goto Cleanup;\n\n    if (!cmsPipelineInsertStage(Result, cmsAT_BEGIN, CLUT))\n        goto Cleanup;\n\n    cmsStageSampleCLut16bit(CLUT, BlackPreservingSampler, (void*) &bp, 0);\n\nCleanup:\n\n    if (bp.cmyk2cmyk) cmsPipelineFree(bp.cmyk2cmyk);\n    if (bp.cmyk2Lab) cmsDeleteTransform(bp.cmyk2Lab);\n    if (bp.hProofOutput) cmsDeleteTransform(bp.hProofOutput);\n\n    if (bp.KTone) cmsFreeToneCurve(bp.KTone);\n    if (bp.LabK2cmyk) cmsPipelineFree(bp.LabK2cmyk);\n\n    return Result;\n}\n\n// Link routines ------------------------------------------------------------------------------------------------------\n\n// Chain several profiles into a single LUT. It just checks the parameters and then calls the handler\n// for the first intent in chain. The handler may be user-defined. Is up to the handler to deal with the\n// rest of intents in chain. A maximum of 255 profiles at time are supported, which is pretty reasonable.\ncmsPipeline* _cmsLinkProfiles(cmsContext     ContextID,\n                              cmsUInt32Number nProfiles,\n                              cmsUInt32Number TheIntents[],\n                              cmsHPROFILE     hProfiles[],\n                              cmsBool         BPC[],\n                              cmsFloat64Number AdaptationStates[],\n                              cmsUInt32Number dwFlags)\n{\n    cmsUInt32Number i;\n    cmsIntentsList* Intent;\n\n    // Make sure a reasonable number of profiles is provided\n    if (nProfiles <= 0 || nProfiles > 255) {\n         cmsSignalError(ContextID, cmsERROR_RANGE, \"Couldn't link '%d' profiles\", nProfiles);\n        return NULL;\n    }\n\n    for (i=0; i < nProfiles; i++) {\n\n        // Check if black point is really needed or allowed. Note that\n        // following Adobe's document:\n        // BPC does not apply to devicelink profiles, nor to abs colorimetric,\n        // and applies always on V4 perceptual and saturation.\n\n        if (TheIntents[i] == INTENT_ABSOLUTE_COLORIMETRIC)\n            BPC[i] = FALSE;\n\n        if (TheIntents[i] == INTENT_PERCEPTUAL || TheIntents[i] == INTENT_SATURATION) {\n\n            // Force BPC for V4 profiles in perceptual and saturation\n            if (cmsGetProfileVersion(hProfiles[i]) >= 4.0)\n                BPC[i] = TRUE;\n        }\n    }\n\n    // Search for a handler. The first intent in the chain defines the handler. That would\n    // prevent using multiple custom intents in a multiintent chain, but the behaviour of\n    // this case would present some issues if the custom intent tries to do things like\n    // preserve primaries. This solution is not perfect, but works well on most cases.\n\n    Intent = SearchIntent(ContextID, TheIntents[0]);\n    if (Intent == NULL) {\n        cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, \"Unsupported intent '%d'\", TheIntents[0]);\n        return NULL;\n    }\n\n    // Call the handler\n    return Intent ->Link(ContextID, nProfiles, TheIntents, hProfiles, BPC, AdaptationStates, dwFlags);\n}\n\n// -------------------------------------------------------------------------------------------------\n\n// Get information about available intents. nMax is the maximum space for the supplied \"Codes\"\n// and \"Descriptions\" the function returns the total number of intents, which may be greater\n// than nMax, although the matrices are not populated beyond this level.\ncmsUInt32Number CMSEXPORT cmsGetSupportedIntentsTHR(cmsContext ContextID, cmsUInt32Number nMax, cmsUInt32Number* Codes, char** Descriptions)\n{\n    _cmsIntentsPluginChunkType* ctx = ( _cmsIntentsPluginChunkType*) _cmsContextGetClientChunk(ContextID, IntentPlugin);\n    cmsIntentsList* pt;\n    cmsUInt32Number nIntents;\n\n\n    for (nIntents=0, pt = ctx->Intents; pt != NULL; pt = pt -> Next)\n    {\n        if (nIntents < nMax) {\n            if (Codes != NULL)\n                Codes[nIntents] = pt ->Intent;\n\n            if (Descriptions != NULL)\n                Descriptions[nIntents] = pt ->Description;\n        }\n\n        nIntents++;\n    }\n\n    for (nIntents=0, pt = DefaultIntents; pt != NULL; pt = pt -> Next)\n    {\n        if (nIntents < nMax) {\n            if (Codes != NULL)\n                Codes[nIntents] = pt ->Intent;\n\n            if (Descriptions != NULL)\n                Descriptions[nIntents] = pt ->Description;\n        }\n\n        nIntents++;\n    }\n    return nIntents;\n}\n\ncmsUInt32Number CMSEXPORT cmsGetSupportedIntents(cmsUInt32Number nMax, cmsUInt32Number* Codes, char** Descriptions)\n{\n    return cmsGetSupportedIntentsTHR(NULL, nMax, Codes, Descriptions);\n}\n\n// The plug-in registration. User can add new intents or override default routines\ncmsBool  _cmsRegisterRenderingIntentPlugin(cmsContext id, cmsPluginBase* Data)\n{\n    _cmsIntentsPluginChunkType* ctx = ( _cmsIntentsPluginChunkType*) _cmsContextGetClientChunk(id, IntentPlugin);\n    cmsPluginRenderingIntent* Plugin = (cmsPluginRenderingIntent*) Data;\n    cmsIntentsList* fl;\n\n    // Do we have to reset the custom intents?\n    if (Data == NULL) {\n\n        ctx->Intents = NULL;\n        return TRUE;\n    }\n\n    fl = (cmsIntentsList*) _cmsPluginMalloc(id, sizeof(cmsIntentsList));\n    if (fl == NULL) return FALSE;\n\n\n    fl ->Intent  = Plugin ->Intent;\n    strncpy(fl ->Description, Plugin ->Description, sizeof(fl ->Description)-1);\n    fl ->Description[sizeof(fl ->Description)-1] = 0;\n\n    fl ->Link    = Plugin ->Link;\n\n    fl ->Next = ctx ->Intents;\n    ctx ->Intents = fl;\n\n    return TRUE;\n}\n\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/src/cmserr.c",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2012 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n\n#include \"lcms2_internal.h\"\n\n// I am so tired about incompatibilities on those functions that here are some replacements\n// that hopefully would be fully portable.\n\n// compare two strings ignoring case\nint CMSEXPORT cmsstrcasecmp(const char* s1, const char* s2)\n{\n    register const unsigned char *us1 = (const unsigned char *)s1,\n                                 *us2 = (const unsigned char *)s2;\n\n    while (toupper(*us1) == toupper(*us2++))\n        if (*us1++ == '\\0')\n            return 0;\n\n    return (toupper(*us1) - toupper(*--us2));\n}\n\n// long int because C99 specifies ftell in such way (7.19.9.2)\nlong int CMSEXPORT cmsfilelength(FILE* f)\n{\n    long int p , n;\n\n    p = ftell(f); // register current file position\n\n    if (fseek(f, 0, SEEK_END) != 0) {\n        return -1;\n    }\n\n    n = ftell(f);\n    fseek(f, p, SEEK_SET); // file position restored\n\n    return n;\n}\n\n#if 0\n// Memory handling ------------------------------------------------------------------\n//\n// This is the interface to low-level memory management routines. By default a simple\n// wrapping to malloc/free/realloc is provided, although there is a limit on the max\n// amount of memoy that can be reclaimed. This is mostly as a safety feature to prevent \n// bogus or evil code to allocate huge blocks that otherwise lcms would never need.\n\n#define MAX_MEMORY_FOR_ALLOC  ((cmsUInt32Number)(1024U*1024U*512U))\n\n// User may override this behaviour by using a memory plug-in, which basically replaces\n// the default memory management functions. In this case, no check is performed and it\n// is up to the plug-in writter to keep in the safe side. There are only three functions\n// required to be implemented: malloc, realloc and free, although the user may want to\n// replace the optional mallocZero, calloc and dup as well.\n\ncmsBool   _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase* Plugin);\n\n// *********************************************************************************\n\n// This is the default memory allocation function. It does a very coarse\n// check of amout of memory, just to prevent exploits\nstatic\nvoid* _cmsMallocDefaultFn(cmsContext ContextID, cmsUInt32Number size)\n{\n    if (size > MAX_MEMORY_FOR_ALLOC) return NULL;  // Never allow over maximum\n\n    return (void*) malloc(size);\n\n    cmsUNUSED_PARAMETER(ContextID);\n}\n\n// Generic allocate & zero\nstatic\nvoid* _cmsMallocZeroDefaultFn(cmsContext ContextID, cmsUInt32Number size)\n{\n    void *pt = _cmsMalloc(ContextID, size);\n    if (pt == NULL) return NULL;\n\n    memset(pt, 0, size);\n    return pt;\n}\n\n\n// The default free function. The only check proformed is against NULL pointers\nstatic\nvoid _cmsFreeDefaultFn(cmsContext ContextID, void *Ptr)\n{\n    // free(NULL) is defined a no-op by C99, therefore it is safe to\n    // avoid the check, but it is here just in case...\n\n    if (Ptr) free(Ptr);\n\n    cmsUNUSED_PARAMETER(ContextID);\n}\n\n// The default realloc function. Again it checks for exploits. If Ptr is NULL,\n// realloc behaves the same way as malloc and allocates a new block of size bytes.\nstatic\nvoid* _cmsReallocDefaultFn(cmsContext ContextID, void* Ptr, cmsUInt32Number size)\n{\n\n    if (size > MAX_MEMORY_FOR_ALLOC) return NULL;  // Never realloc over 512Mb\n\n    return realloc(Ptr, size);\n\n    cmsUNUSED_PARAMETER(ContextID);\n}\n\n\n// The default calloc function. Allocates an array of num elements, each one of size bytes\n// all memory is initialized to zero.\nstatic\nvoid* _cmsCallocDefaultFn(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size)\n{\n    cmsUInt32Number Total = num * size;\n\n    // Preserve calloc behaviour\n    if (Total == 0) return NULL;\n\n    // Safe check for overflow.\n    if (num >= UINT_MAX / size) return NULL;\n\n    // Check for overflow\n    if (Total < num || Total < size) {\n        return NULL;\n    }\n\n    if (Total > MAX_MEMORY_FOR_ALLOC) return NULL;  // Never alloc over 512Mb\n\n    return _cmsMallocZero(ContextID, Total);\n}\n\n// Generic block duplication\nstatic\nvoid* _cmsDupDefaultFn(cmsContext ContextID, const void* Org, cmsUInt32Number size)\n{\n    void* mem;\n\n    if (size > MAX_MEMORY_FOR_ALLOC) return NULL;  // Never dup over 512Mb\n\n    mem = _cmsMalloc(ContextID, size);\n\n    if (mem != NULL && Org != NULL)\n        memmove(mem, Org, size);\n\n    return mem;\n}\n\n\n// Pointers to memory manager functions in Context0\n_cmsMemPluginChunkType _cmsMemPluginChunk = { _cmsMallocDefaultFn, _cmsMallocZeroDefaultFn, _cmsFreeDefaultFn, \n                                              _cmsReallocDefaultFn, _cmsCallocDefaultFn,    _cmsDupDefaultFn\n                                            };\n\n\n// Reset and duplicate memory manager\nvoid _cmsAllocMemPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src)\n{\n    _cmsAssert(ctx != NULL);\n\n    if (src != NULL) {    \n\n        // Duplicate\n        ctx ->chunks[MemPlugin] = _cmsSubAllocDup(ctx ->MemPool, src ->chunks[MemPlugin], sizeof(_cmsMemPluginChunkType));  \n    }\n    else {\n\n        // To reset it, we use the default allocators, which cannot be overriden\n        ctx ->chunks[MemPlugin] = &ctx ->DefaultMemoryManager;\n    } \n}\n\n// Auxiliar to fill memory management functions from plugin (or context 0 defaults)\nvoid _cmsInstallAllocFunctions(cmsPluginMemHandler* Plugin, _cmsMemPluginChunkType* ptr)\n{\n    if (Plugin == NULL) {\n\n        memcpy(ptr, &_cmsMemPluginChunk, sizeof(_cmsMemPluginChunk));\n    }\n    else {\n\n        ptr ->MallocPtr  = Plugin -> MallocPtr;\n        ptr ->FreePtr    = Plugin -> FreePtr;\n        ptr ->ReallocPtr = Plugin -> ReallocPtr;\n\n        // Make sure we revert to defaults\n        ptr ->MallocZeroPtr= _cmsMallocZeroDefaultFn;\n        ptr ->CallocPtr    = _cmsCallocDefaultFn;\n        ptr ->DupPtr       = _cmsDupDefaultFn;\n      \n        if (Plugin ->MallocZeroPtr != NULL) ptr ->MallocZeroPtr = Plugin -> MallocZeroPtr;\n        if (Plugin ->CallocPtr != NULL)     ptr ->CallocPtr     = Plugin -> CallocPtr;\n        if (Plugin ->DupPtr != NULL)        ptr ->DupPtr        = Plugin -> DupPtr;\n        \n    }\n}\n\n\n// Plug-in replacement entry\ncmsBool  _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase *Data)\n{\n    cmsPluginMemHandler* Plugin = (cmsPluginMemHandler*) Data;     \n    _cmsMemPluginChunkType* ptr;\n\n    // NULL forces to reset to defaults. In this special case, the defaults are stored in the context structure. \n    // Remaining plug-ins does NOT have any copy in the context structure, but this is somehow special as the\n    // context internal data should be malloce'd by using those functions. \n    if (Data == NULL) {\n\n       struct _cmsContext_struct* ctx = ( struct _cmsContext_struct*) ContextID;\n\n       // Return to the default allocators\n        if (ContextID != NULL) {\n            ctx->chunks[MemPlugin] = (void*) &ctx->DefaultMemoryManager;\n        }\n        return TRUE;\n    }\n\n    // Check for required callbacks\n    if (Plugin -> MallocPtr == NULL ||\n        Plugin -> FreePtr == NULL ||\n        Plugin -> ReallocPtr == NULL) return FALSE;\n\n    // Set replacement functions\n    ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin);\n    if (ptr == NULL) \n        return FALSE;\n\n    _cmsInstallAllocFunctions(Plugin, ptr);\n    return TRUE;\n}\n#else\n#include \"../../../../../include/fxcrt/fx_system.h\"\n#include \"../../../../../include/fxcrt/fx_memory.h\"\n\ncmsBool  _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase* Plugin)\n{\n\treturn TRUE;\n}\n\n// Generic allocate\nvoid* CMSEXPORT _cmsMalloc(cmsContext ContextID, cmsUInt32Number size)\n{\n    return FXMEM_DefaultAlloc(size, 1);\n}\n\n// Generic allocate & zero\nvoid* CMSEXPORT _cmsMallocZero(cmsContext ContextID, cmsUInt32Number size)\n{\n\tvoid* p = FXMEM_DefaultAlloc(size, 1);\n\tif (p) FXSYS_memset32(p, 0, size);\n\treturn p;\n}\n\n// Generic calloc\nvoid* CMSEXPORT _cmsCalloc(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size)\n{\n\tcmsUInt32Number total = num * size;\n\tif (total == 0 || total / size != num || total >= 512 * 1024 * 1024)\n\t\treturn NULL;\n\n\treturn _cmsMallocZero(ContextID, num * size);\n}\n\n// Generic reallocate\nvoid* CMSEXPORT _cmsRealloc(cmsContext ContextID, void* Ptr, cmsUInt32Number size)\n{\n\treturn FXMEM_DefaultRealloc(Ptr, size, 1);\n}\n\n// Generic free memory\nvoid CMSEXPORT _cmsFree(cmsContext ContextID, void* Ptr)\n{\n\tif (Ptr != NULL) FXMEM_DefaultFree(Ptr, 0);\n}\n\n// Generic block duplication\nvoid* CMSEXPORT _cmsDupMem(cmsContext ContextID, const void* Org, cmsUInt32Number size)\n{\n\tvoid* p = FXMEM_DefaultAlloc(size, 1);\n\tFXSYS_memmove32(p, Org, size);\n\treturn p;\n}\n\n_cmsMemPluginChunkType _cmsMemPluginChunk = {_cmsMalloc, _cmsMallocZero, _cmsFree, \n\t                                         _cmsRealloc, _cmsCalloc,    _cmsDupMem\n                                            };\n\nvoid _cmsAllocMemPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src)\n{\n\t_cmsAssert(ctx != NULL);\n\n\tif (src != NULL) {    \n\n\t\t// Duplicate\n\t\tctx ->chunks[MemPlugin] = _cmsSubAllocDup(ctx ->MemPool, src ->chunks[MemPlugin], sizeof(_cmsMemPluginChunkType));  \n\t}\n\telse {\n\n\t\t// To reset it, we use the default allocators, which cannot be overriden\n\t\tctx ->chunks[MemPlugin] = &ctx ->DefaultMemoryManager;\n\t} \n}\n\nvoid _cmsInstallAllocFunctions(cmsPluginMemHandler* Plugin, _cmsMemPluginChunkType* ptr)\n{\n\tif (Plugin == NULL) {\n\n\t\tmemcpy(ptr, &_cmsMemPluginChunk, sizeof(_cmsMemPluginChunk));\n\t}\n\telse {\n\n\t\tptr ->MallocPtr  = Plugin -> MallocPtr;\n\t\tptr ->FreePtr    = Plugin -> FreePtr;\n\t\tptr ->ReallocPtr = Plugin -> ReallocPtr;\n\n\t\t// Make sure we revert to defaults\n\t\tptr ->MallocZeroPtr= _cmsMallocZero;\n\t\tptr ->CallocPtr    = _cmsCalloc;\n\t\tptr ->DupPtr       = _cmsDupMem;\n\n\t\tif (Plugin ->MallocZeroPtr != NULL) ptr ->MallocZeroPtr = Plugin -> MallocZeroPtr;\n\t\tif (Plugin ->CallocPtr != NULL)     ptr ->CallocPtr     = Plugin -> CallocPtr;\n\t\tif (Plugin ->DupPtr != NULL)        ptr ->DupPtr        = Plugin -> DupPtr;\n\n\t}\n}\n#endif\n\n// ********************************************************************************************\n\n// Sub allocation takes care of many pointers of small size. The memory allocated in\n// this way have be freed at once. Next function allocates a single chunk for linked list\n// I prefer this method over realloc due to the big inpact on xput realloc may have if\n// memory is being swapped to disk. This approach is safer (although that may not be true on all platforms)\nstatic\n_cmsSubAllocator_chunk* _cmsCreateSubAllocChunk(cmsContext ContextID, cmsUInt32Number Initial)\n{\n    _cmsSubAllocator_chunk* chunk;\n\n    // 20K by default\n    if (Initial == 0)\n        Initial = 20*1024;\n\n    // Create the container\n    chunk = (_cmsSubAllocator_chunk*) _cmsMallocZero(ContextID, sizeof(_cmsSubAllocator_chunk));\n    if (chunk == NULL) return NULL;\n\n    // Initialize values\n    chunk ->Block     = (cmsUInt8Number*) _cmsMalloc(ContextID, Initial);\n    if (chunk ->Block == NULL) {\n\n        // Something went wrong\n        _cmsFree(ContextID, chunk);\n        return NULL;\n    }\n\n    chunk ->BlockSize = Initial;\n    chunk ->Used      = 0;\n    chunk ->next      = NULL;\n\n    return chunk;\n}\n\n// The suballocated is nothing but a pointer to the first element in the list. We also keep\n// the thread ID in this structure.\n_cmsSubAllocator* _cmsCreateSubAlloc(cmsContext ContextID, cmsUInt32Number Initial)\n{\n    _cmsSubAllocator* sub;\n\n    // Create the container\n    sub = (_cmsSubAllocator*) _cmsMallocZero(ContextID, sizeof(_cmsSubAllocator));\n    if (sub == NULL) return NULL;\n\n    sub ->ContextID = ContextID;\n\n    sub ->h = _cmsCreateSubAllocChunk(ContextID, Initial);\n    if (sub ->h == NULL) {\n        _cmsFree(ContextID, sub);\n        return NULL;\n    }\n\n    return sub;\n}\n\n\n// Get rid of whole linked list\nvoid _cmsSubAllocDestroy(_cmsSubAllocator* sub)\n{\n    _cmsSubAllocator_chunk *chunk, *n;\n\n    for (chunk = sub ->h; chunk != NULL; chunk = n) {\n\n        n = chunk->next;\n        if (chunk->Block != NULL) _cmsFree(sub ->ContextID, chunk->Block);\n        _cmsFree(sub ->ContextID, chunk);\n    }\n\n    // Free the header\n    _cmsFree(sub ->ContextID, sub);\n}\n\n\n// Get a pointer to small memory block.\nvoid*  _cmsSubAlloc(_cmsSubAllocator* sub, cmsUInt32Number size)\n{\n    cmsUInt32Number Free = sub -> h ->BlockSize - sub -> h -> Used;\n    cmsUInt8Number* ptr;\n\n    size = _cmsALIGNMEM(size);\n\n    // Check for memory. If there is no room, allocate a new chunk of double memory size.\n    if (size > Free) {\n\n        _cmsSubAllocator_chunk* chunk;\n        cmsUInt32Number newSize;\n\n        newSize = sub -> h ->BlockSize * 2;\n        if (newSize < size) newSize = size;\n\n        chunk = _cmsCreateSubAllocChunk(sub -> ContextID, newSize);\n        if (chunk == NULL) return NULL;\n\n        // Link list\n        chunk ->next = sub ->h;\n        sub ->h    = chunk;\n\n    }\n\n    ptr =  sub -> h ->Block + sub -> h ->Used;\n    sub -> h -> Used += size;\n\n    return (void*) ptr;\n}\n\n// Duplicate in pool\nvoid* _cmsSubAllocDup(_cmsSubAllocator* s, const void *ptr, cmsUInt32Number size)\n{\n    void *NewPtr;\n    \n    // Dup of null pointer is also NULL\n    if (ptr == NULL)\n        return NULL;\n\n    NewPtr = _cmsSubAlloc(s, size);\n\n    if (ptr != NULL && NewPtr != NULL) {\n        memcpy(NewPtr, ptr, size);\n    }\n\n    return NewPtr;\n}\n\n\n\n// Error logging ******************************************************************\n\n// There is no error handling at all. When a funtion fails, it returns proper value.\n// For example, all create functions does return NULL on failure. Other return FALSE\n// It may be interesting, for the developer, to know why the function is failing.\n// for that reason, lcms2 does offer a logging function. This function does recive\n// a ENGLISH string with some clues on what is going wrong. You can show this\n// info to the end user, or just create some sort of log.\n// The logging function should NOT terminate the program, as this obviously can leave\n// resources. It is the programmer's responsability to check each function return code\n// to make sure it didn't fail.\n\n// Error messages are limited to MAX_ERROR_MESSAGE_LEN\n\n#define MAX_ERROR_MESSAGE_LEN   1024\n\n// ---------------------------------------------------------------------------------------------------------\n\n// This is our default log error\nstatic void DefaultLogErrorHandlerFunction(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text);\n\n// Context0 storage, which is global\n_cmsLogErrorChunkType _cmsLogErrorChunk = { DefaultLogErrorHandlerFunction };\n\n// Allocates and inits error logger container for a given context. If src is NULL, only initializes the value\n// to the default. Otherwise, it duplicates the value. The interface is standard across all context clients\nvoid _cmsAllocLogErrorChunk(struct _cmsContext_struct* ctx, \n                            const struct _cmsContext_struct* src)\n{    \n    static _cmsLogErrorChunkType LogErrorChunk = { DefaultLogErrorHandlerFunction };\n    void* from;\n     \n     if (src != NULL) {\n        from = src ->chunks[Logger];       \n    }\n    else {\n       from = &LogErrorChunk;\n    }\n    \n    ctx ->chunks[Logger] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsLogErrorChunkType));   \n}\n\n// The default error logger does nothing.\nstatic\nvoid DefaultLogErrorHandlerFunction(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text)\n{\n    // fprintf(stderr, \"[lcms]: %s\\n\", Text);\n    // fflush(stderr);\n\n     cmsUNUSED_PARAMETER(ContextID);\n     cmsUNUSED_PARAMETER(ErrorCode);\n     cmsUNUSED_PARAMETER(Text);\n}\n\n// Change log error, context based\nvoid CMSEXPORT cmsSetLogErrorHandlerTHR(cmsContext ContextID, cmsLogErrorHandlerFunction Fn)\n{\n    _cmsLogErrorChunkType* lhg = (_cmsLogErrorChunkType*) _cmsContextGetClientChunk(ContextID, Logger);\n\n    if (lhg != NULL) {\n\n        if (Fn == NULL)\n            lhg -> LogErrorHandler = DefaultLogErrorHandlerFunction;\n        else\n            lhg -> LogErrorHandler = Fn;\n    }\n}\n\n// Change log error, legacy\nvoid CMSEXPORT cmsSetLogErrorHandler(cmsLogErrorHandlerFunction Fn)\n{\n    cmsSetLogErrorHandlerTHR(NULL, Fn);    \n}\n\n// Log an error\n// ErrorText is a text holding an english description of error.\nvoid CMSEXPORT cmsSignalError(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *ErrorText, ...)\n{\n    va_list args;\n    char Buffer[MAX_ERROR_MESSAGE_LEN];\n    _cmsLogErrorChunkType* lhg;\n\n\n    va_start(args, ErrorText);\n    vsnprintf(Buffer, MAX_ERROR_MESSAGE_LEN-1, ErrorText, args);\n    va_end(args);\n\n    // Check for the context, if specified go there. If not, go for the global\n    lhg = (_cmsLogErrorChunkType*) _cmsContextGetClientChunk(ContextID, Logger);\n    if (lhg ->LogErrorHandler) {\n        lhg ->LogErrorHandler(ContextID, ErrorCode, Buffer);\n    }   \n}\n\n// Utility function to print signatures\nvoid _cmsTagSignature2String(char String[5], cmsTagSignature sig)\n{\n    cmsUInt32Number be;\n\n    // Convert to big endian\n    be = _cmsAdjustEndianess32((cmsUInt32Number) sig);\n\n    // Move chars\n    memmove(String, &be, 4);\n\n    // Make sure of terminator\n    String[4] = 0;\n}\n\n//--------------------------------------------------------------------------------------------------\n\n\nstatic\nvoid* defMtxCreate(cmsContext id)\n{\n    _cmsMutex* ptr_mutex = (_cmsMutex*) _cmsMalloc(id, sizeof(_cmsMutex));\n    _cmsInitMutexPrimitive(ptr_mutex);\n    return (void*) ptr_mutex;   \n}\n\nstatic\nvoid defMtxDestroy(cmsContext id, void* mtx)\n{\n    _cmsDestroyMutexPrimitive((_cmsMutex *) mtx); \n    _cmsFree(id, mtx);\n}\n\nstatic\ncmsBool defMtxLock(cmsContext id, void* mtx)\n{\n    cmsUNUSED_PARAMETER(id);\n    return _cmsLockPrimitive((_cmsMutex *) mtx) == 0;     \n}\n\nstatic\nvoid defMtxUnlock(cmsContext id, void* mtx)\n{\n    cmsUNUSED_PARAMETER(id);\n    _cmsUnlockPrimitive((_cmsMutex *) mtx); \n}\n\n\n\n// Pointers to memory manager functions in Context0\n_cmsMutexPluginChunkType _cmsMutexPluginChunk = { defMtxCreate, defMtxDestroy, defMtxLock, defMtxUnlock };\n\n// Allocate and init mutex container.\nvoid _cmsAllocMutexPluginChunk(struct _cmsContext_struct* ctx, \n                                        const struct _cmsContext_struct* src)\n{\n    static _cmsMutexPluginChunkType MutexChunk = {defMtxCreate, defMtxDestroy, defMtxLock, defMtxUnlock };\n    void* from;\n     \n     if (src != NULL) {\n        from = src ->chunks[MutexPlugin];       \n    }\n    else {\n       from = &MutexChunk;\n    }\n    \n    ctx ->chunks[MutexPlugin] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsMutexPluginChunkType));   \n}\n\n// Register new ways to transform\ncmsBool  _cmsRegisterMutexPlugin(cmsContext ContextID, cmsPluginBase* Data)\n{\n    cmsPluginMutex* Plugin = (cmsPluginMutex*) Data;\n    _cmsMutexPluginChunkType* ctx = ( _cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin);\n\n    if (Data == NULL) {\n\n        // No lock routines\n        ctx->CreateMutexPtr = NULL; \n        ctx->DestroyMutexPtr = NULL; \n        ctx->LockMutexPtr = NULL;\n        ctx ->UnlockMutexPtr = NULL;\n        return TRUE;\n    }\n\n    // Factory callback is required\n    if (Plugin ->CreateMutexPtr == NULL || Plugin ->DestroyMutexPtr == NULL || \n        Plugin ->LockMutexPtr == NULL || Plugin ->UnlockMutexPtr == NULL) return FALSE;\n\n\n    ctx->CreateMutexPtr  = Plugin->CreateMutexPtr;\n    ctx->DestroyMutexPtr = Plugin ->DestroyMutexPtr;\n    ctx ->LockMutexPtr   = Plugin ->LockMutexPtr;\n    ctx ->UnlockMutexPtr = Plugin ->UnlockMutexPtr;\n\n    // All is ok\n    return TRUE;\n}\n\n// Generic Mutex fns\nvoid* CMSEXPORT _cmsCreateMutex(cmsContext ContextID)\n{\n    _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin);\n\n    if (ptr ->CreateMutexPtr == NULL) return NULL;\n\n    return ptr ->CreateMutexPtr(ContextID);\n}\n\nvoid CMSEXPORT _cmsDestroyMutex(cmsContext ContextID, void* mtx)\n{\n    _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin);\n\n    if (ptr ->DestroyMutexPtr != NULL) {\n\n        ptr ->DestroyMutexPtr(ContextID, mtx);\n    }\n}\n\ncmsBool CMSEXPORT _cmsLockMutex(cmsContext ContextID, void* mtx)\n{\n    _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin);\n\n    if (ptr ->LockMutexPtr == NULL) return TRUE;\n\n    return ptr ->LockMutexPtr(ContextID, mtx);\n}\n\nvoid CMSEXPORT _cmsUnlockMutex(cmsContext ContextID, void* mtx)\n{\n    _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin);\n\n    if (ptr ->UnlockMutexPtr != NULL) {\n\n        ptr ->UnlockMutexPtr(ContextID, mtx);\n    }\n}\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/src/cmsgamma.c",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2013 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n//\n\n#include \"lcms2_internal.h\"\n\n// Tone curves are powerful constructs that can contain curves specified in diverse ways.\n// The curve is stored in segments, where each segment can be sampled or specified by parameters.\n// a 16.bit simplification of the *whole* curve is kept for optimization purposes. For float operation,\n// each segment is evaluated separately. Plug-ins may be used to define new parametric schemes,\n// each plug-in may define up to MAX_TYPES_IN_LCMS_PLUGIN functions types. For defining a function,\n// the plug-in should provide the type id, how many parameters each type has, and a pointer to\n// a procedure that evaluates the function. In the case of reverse evaluation, the evaluator will\n// be called with the type id as a negative value, and a sampled version of the reversed curve\n// will be built.\n\n// ----------------------------------------------------------------- Implementation\n// Maxim number of nodes\n#define MAX_NODES_IN_CURVE   4097\n#define MINUS_INF            (-1E22F)\n#define PLUS_INF             (+1E22F)\n\n// The list of supported parametric curves\ntypedef struct _cmsParametricCurvesCollection_st {\n\n    int nFunctions;                                     // Number of supported functions in this chunk\n    int FunctionTypes[MAX_TYPES_IN_LCMS_PLUGIN];        // The identification types\n    int ParameterCount[MAX_TYPES_IN_LCMS_PLUGIN];       // Number of parameters for each function\n    cmsParametricCurveEvaluator    Evaluator;           // The evaluator\n\n    struct _cmsParametricCurvesCollection_st* Next; // Next in list\n\n} _cmsParametricCurvesCollection;\n\n// This is the default (built-in) evaluator\nstatic cmsFloat64Number DefaultEvalParametricFn(cmsInt32Number Type, const cmsFloat64Number Params[], cmsFloat64Number R);\n\n// The built-in list\nstatic _cmsParametricCurvesCollection DefaultCurves = {\n    9,                                  // # of curve types\n    { 1, 2, 3, 4, 5, 6, 7, 8, 108 },    // Parametric curve ID\n    { 1, 3, 4, 5, 7, 4, 5, 5, 1 },      // Parameters by type\n    DefaultEvalParametricFn,            // Evaluator\n    NULL                                // Next in chain\n};\n\n// Duplicates the zone of memory used by the plug-in in the new context\nstatic\nvoid DupPluginCurvesList(struct _cmsContext_struct* ctx, \n                                               const struct _cmsContext_struct* src)\n{\n   _cmsCurvesPluginChunkType newHead = { NULL };\n   _cmsParametricCurvesCollection*  entry;\n   _cmsParametricCurvesCollection*  Anterior = NULL;\n   _cmsCurvesPluginChunkType* head = (_cmsCurvesPluginChunkType*) src->chunks[CurvesPlugin];\n\n    _cmsAssert(head != NULL);\n\n    // Walk the list copying all nodes\n   for (entry = head->ParametricCurves;\n        entry != NULL;\n        entry = entry ->Next) {\n\n            _cmsParametricCurvesCollection *newEntry = ( _cmsParametricCurvesCollection *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsParametricCurvesCollection));\n   \n            if (newEntry == NULL) \n                return;\n\n            // We want to keep the linked list order, so this is a little bit tricky\n            newEntry -> Next = NULL;\n            if (Anterior)\n                Anterior -> Next = newEntry;\n     \n            Anterior = newEntry;\n\n            if (newHead.ParametricCurves == NULL)\n                newHead.ParametricCurves = newEntry;\n    }\n\n  ctx ->chunks[CurvesPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsCurvesPluginChunkType));\n}\n\n// The allocator have to follow the chain\nvoid _cmsAllocCurvesPluginChunk(struct _cmsContext_struct* ctx, \n                                const struct _cmsContext_struct* src)\n{\n    _cmsAssert(ctx != NULL);\n\n    if (src != NULL) {\n\n        // Copy all linked list\n       DupPluginCurvesList(ctx, src);\n    }\n    else {\n        static _cmsCurvesPluginChunkType CurvesPluginChunk = { NULL };\n        ctx ->chunks[CurvesPlugin] = _cmsSubAllocDup(ctx ->MemPool, &CurvesPluginChunk, sizeof(_cmsCurvesPluginChunkType));\n    }\n}\n\n\n// The linked list head\n_cmsCurvesPluginChunkType _cmsCurvesPluginChunk = { NULL };\n\n// As a way to install new parametric curves\ncmsBool _cmsRegisterParametricCurvesPlugin(cmsContext ContextID, cmsPluginBase* Data)\n{\n    _cmsCurvesPluginChunkType* ctx = ( _cmsCurvesPluginChunkType*) _cmsContextGetClientChunk(ContextID, CurvesPlugin);\n    cmsPluginParametricCurves* Plugin = (cmsPluginParametricCurves*) Data;\n    _cmsParametricCurvesCollection* fl;\n\n    if (Data == NULL) {\n\n          ctx -> ParametricCurves =  NULL;\n          return TRUE;\n    }\n\n    fl = (_cmsParametricCurvesCollection*) _cmsPluginMalloc(ContextID, sizeof(_cmsParametricCurvesCollection));\n    if (fl == NULL) return FALSE;\n\n    // Copy the parameters\n    fl ->Evaluator  = Plugin ->Evaluator;\n    fl ->nFunctions = Plugin ->nFunctions;\n\n    // Make sure no mem overwrites\n    if (fl ->nFunctions > MAX_TYPES_IN_LCMS_PLUGIN)\n        fl ->nFunctions = MAX_TYPES_IN_LCMS_PLUGIN;\n\n    // Copy the data\n    memmove(fl->FunctionTypes,  Plugin ->FunctionTypes,   fl->nFunctions * sizeof(cmsUInt32Number));\n    memmove(fl->ParameterCount, Plugin ->ParameterCount,  fl->nFunctions * sizeof(cmsUInt32Number));\n\n    // Keep linked list\n    fl ->Next = ctx->ParametricCurves;\n    ctx->ParametricCurves = fl;\n\n    // All is ok\n    return TRUE;\n}\n\n\n// Search in type list, return position or -1 if not found\nstatic\nint IsInSet(int Type, _cmsParametricCurvesCollection* c)\n{\n    int i;\n\n    for (i=0; i < c ->nFunctions; i++)\n        if (abs(Type) == c ->FunctionTypes[i]) return i;\n\n    return -1;\n}\n\n\n// Search for the collection which contains a specific type\nstatic\n_cmsParametricCurvesCollection *GetParametricCurveByType(cmsContext ContextID, int Type, int* index)\n{\n    _cmsParametricCurvesCollection* c;\n    int Position;\n    _cmsCurvesPluginChunkType* ctx = ( _cmsCurvesPluginChunkType*) _cmsContextGetClientChunk(ContextID, CurvesPlugin);\n\n    for (c = ctx->ParametricCurves; c != NULL; c = c ->Next) {\n\n        Position = IsInSet(Type, c);\n\n        if (Position != -1) {\n            if (index != NULL)\n                *index = Position;\n            return c;\n        }\n    }\n    // If none found, revert for defaults\n    for (c = &DefaultCurves; c != NULL; c = c ->Next) {\n\n        Position = IsInSet(Type, c);\n\n        if (Position != -1) {\n            if (index != NULL)\n                *index = Position;\n            return c;\n        }\n    }\n\n    return NULL;\n}\n\n// Low level allocate, which takes care of memory details. nEntries may be zero, and in this case\n// no optimation curve is computed. nSegments may also be zero in the inverse case, where only the\n// optimization curve is given. Both features simultaneously is an error\nstatic\ncmsToneCurve* AllocateToneCurveStruct(cmsContext ContextID, cmsInt32Number nEntries,\n                                      cmsInt32Number nSegments, const cmsCurveSegment* Segments,\n                                      const cmsUInt16Number* Values)\n{\n    cmsToneCurve* p;\n    int i;\n\n    // We allow huge tables, which are then restricted for smoothing operations\n    if (nEntries > 65530 || nEntries < 0) {\n        cmsSignalError(ContextID, cmsERROR_RANGE, \"Couldn't create tone curve of more than 65530 entries\");\n        return NULL;\n    }\n\n    if (nEntries <= 0 && nSegments <= 0) {\n        cmsSignalError(ContextID, cmsERROR_RANGE, \"Couldn't create tone curve with zero segments and no table\");\n        return NULL;\n    }\n\n    // Allocate all required pointers, etc.\n    p = (cmsToneCurve*) _cmsMallocZero(ContextID, sizeof(cmsToneCurve));\n    if (!p) return NULL;\n\n    // In this case, there are no segments\n    if (nSegments <= 0) {\n        p ->Segments = NULL;\n        p ->Evals = NULL;\n    }\n    else {\n        p ->Segments = (cmsCurveSegment*) _cmsCalloc(ContextID, nSegments, sizeof(cmsCurveSegment));\n        if (p ->Segments == NULL) goto Error;\n\n        p ->Evals    = (cmsParametricCurveEvaluator*) _cmsCalloc(ContextID, nSegments, sizeof(cmsParametricCurveEvaluator));\n        if (p ->Evals == NULL) goto Error;\n    }\n\n    p -> nSegments = nSegments;\n\n    // This 16-bit table contains a limited precision representation of the whole curve and is kept for\n    // increasing xput on certain operations.\n    if (nEntries <= 0) {\n        p ->Table16 = NULL;\n    }\n    else {\n       p ->Table16 = (cmsUInt16Number*)  _cmsCalloc(ContextID, nEntries, sizeof(cmsUInt16Number));\n       if (p ->Table16 == NULL) goto Error;\n    }\n\n    p -> nEntries  = nEntries;\n\n    // Initialize members if requested\n    if (Values != NULL && (nEntries > 0)) {\n\n        for (i=0; i < nEntries; i++)\n            p ->Table16[i] = Values[i];\n    }\n\n    // Initialize the segments stuff. The evaluator for each segment is located and a pointer to it\n    // is placed in advance to maximize performance.\n    if (Segments != NULL && (nSegments > 0)) {\n\n        _cmsParametricCurvesCollection *c;\n\n        p ->SegInterp = (cmsInterpParams**) _cmsCalloc(ContextID, nSegments, sizeof(cmsInterpParams*));\n        if (p ->SegInterp == NULL) goto Error;\n\n        for (i=0; i< nSegments; i++) {\n\n            // Type 0 is a special marker for table-based curves\n            if (Segments[i].Type == 0)\n                p ->SegInterp[i] = _cmsComputeInterpParams(ContextID, Segments[i].nGridPoints, 1, 1, NULL, CMS_LERP_FLAGS_FLOAT);\n\n            memmove(&p ->Segments[i], &Segments[i], sizeof(cmsCurveSegment));\n\n            if (Segments[i].Type == 0 && Segments[i].SampledPoints != NULL)\n                p ->Segments[i].SampledPoints = (cmsFloat32Number*) _cmsDupMem(ContextID, Segments[i].SampledPoints, sizeof(cmsFloat32Number) * Segments[i].nGridPoints);\n            else\n                p ->Segments[i].SampledPoints = NULL;\n\n\n            c = GetParametricCurveByType(ContextID, Segments[i].Type, NULL);\n            if (c != NULL)\n                    p ->Evals[i] = c ->Evaluator;\n        }\n    }\n\n    p ->InterpParams = _cmsComputeInterpParams(ContextID, p ->nEntries, 1, 1, p->Table16, CMS_LERP_FLAGS_16BITS);\n    if (p->InterpParams != NULL)\n        return p;\n\nError:\n    if (p -> Segments) _cmsFree(ContextID, p ->Segments);\n    if (p -> Evals) _cmsFree(ContextID, p -> Evals);\n    if (p ->Table16) _cmsFree(ContextID, p ->Table16);\n    _cmsFree(ContextID, p);\n    return NULL;\n}\n\n\n// Parametric Fn using floating point\nstatic\ncmsFloat64Number DefaultEvalParametricFn(cmsInt32Number Type, const cmsFloat64Number Params[], cmsFloat64Number R)\n{\n    cmsFloat64Number e, Val, disc;\n\n    switch (Type) {\n\n   // X = Y ^ Gamma\n    case 1:\n        if (R < 0) {\n\n            if (fabs(Params[0] - 1.0) < MATRIX_DET_TOLERANCE)\n                Val = R;\n            else\n                Val = 0;\n        }\n        else\n            Val = pow(R, Params[0]);\n        break;\n\n    // Type 1 Reversed: X = Y ^1/gamma\n    case -1:\n         if (R < 0) {\n\n            if (fabs(Params[0] - 1.0) < MATRIX_DET_TOLERANCE)\n                Val = R;\n            else\n                Val = 0;\n        }\n        else\n            Val = pow(R, 1/Params[0]);\n        break;\n\n    // CIE 122-1966\n    // Y = (aX + b)^Gamma  | X >= -b/a\n    // Y = 0               | else\n    case 2:\n        disc = -Params[2] / Params[1];\n\n        if (R >= disc ) {\n\n            e = Params[1]*R + Params[2];\n\n            if (e > 0)\n                Val = pow(e, Params[0]);\n            else\n                Val = 0;\n        }\n        else\n            Val = 0;\n        break;\n\n     // Type 2 Reversed\n     // X = (Y ^1/g  - b) / a\n     case -2:\n         if (R < 0)\n             Val = 0;\n         else\n             Val = (pow(R, 1.0/Params[0]) - Params[2]) / Params[1];\n\n         if (Val < 0)\n              Val = 0;\n         break;\n\n\n    // IEC 61966-3\n    // Y = (aX + b)^Gamma | X <= -b/a\n    // Y = c              | else\n    case 3:\n        disc = -Params[2] / Params[1];\n        if (disc < 0)\n            disc = 0;\n\n        if (R >= disc) {\n\n            e = Params[1]*R + Params[2];\n\n            if (e > 0)\n                Val = pow(e, Params[0]) + Params[3];\n            else\n                Val = 0;\n        }\n        else\n            Val = Params[3];\n        break;\n\n\n    // Type 3 reversed\n    // X=((Y-c)^1/g - b)/a      | (Y>=c)\n    // X=-b/a                   | (Y<c)\n    case -3:\n        if (R >= Params[3])  {\n\n            e = R - Params[3];\n\n            if (e > 0)\n                Val = (pow(e, 1/Params[0]) - Params[2]) / Params[1];\n            else\n                Val = 0;\n        }\n        else {\n            Val = -Params[2] / Params[1];\n        }\n        break;\n\n\n    // IEC 61966-2.1 (sRGB)\n    // Y = (aX + b)^Gamma | X >= d\n    // Y = cX             | X < d\n    case 4:\n        if (R >= Params[4]) {\n\n            e = Params[1]*R + Params[2];\n\n            if (e > 0)\n                Val = pow(e, Params[0]);\n            else\n                Val = 0;\n        }\n        else\n            Val = R * Params[3];\n        break;\n\n    // Type 4 reversed\n    // X=((Y^1/g-b)/a)    | Y >= (ad+b)^g\n    // X=Y/c              | Y< (ad+b)^g\n    case -4:\n        e = Params[1] * Params[4] + Params[2];\n        if (e < 0)\n            disc = 0;\n        else\n            disc = pow(e, Params[0]);\n\n        if (R >= disc) {\n\n            Val = (pow(R, 1.0/Params[0]) - Params[2]) / Params[1];\n        }\n        else {\n            Val = R / Params[3];\n        }\n        break;\n\n\n    // Y = (aX + b)^Gamma + e | X >= d\n    // Y = cX + f             | X < d\n    case 5:\n        if (R >= Params[4]) {\n\n            e = Params[1]*R + Params[2];\n\n            if (e > 0)\n                Val = pow(e, Params[0]) + Params[5];\n            else\n                Val = Params[5];\n        }\n        else\n            Val = R*Params[3] + Params[6];\n        break;\n\n\n    // Reversed type 5\n    // X=((Y-e)1/g-b)/a   | Y >=(ad+b)^g+e), cd+f\n    // X=(Y-f)/c          | else\n    case -5:\n\n        disc = Params[3] * Params[4] + Params[6];\n        if (R >= disc) {\n\n            e = R - Params[5];\n            if (e < 0)\n                Val = 0;\n            else\n                Val = (pow(e, 1.0/Params[0]) - Params[2]) / Params[1];\n        }\n        else {\n            Val = (R - Params[6]) / Params[3];\n        }\n        break;\n\n\n    // Types 6,7,8 comes from segmented curves as described in ICCSpecRevision_02_11_06_Float.pdf\n    // Type 6 is basically identical to type 5 without d\n\n    // Y = (a * X + b) ^ Gamma + c\n    case 6:\n        e = Params[1]*R + Params[2];\n\n        if (e < 0)\n            Val = Params[3];\n        else\n            Val = pow(e, Params[0]) + Params[3];\n        break;\n\n    // ((Y - c) ^1/Gamma - b) / a\n    case -6:\n        e = R - Params[3];\n        if (e < 0)\n            Val = 0;\n        else\n        Val = (pow(e, 1.0/Params[0]) - Params[2]) / Params[1];\n        break;\n\n\n    // Y = a * log (b * X^Gamma + c) + d\n    case 7:\n\n       e = Params[2] * pow(R, Params[0]) + Params[3];\n       if (e <= 0)\n           Val = Params[4];\n       else\n           Val = Params[1]*log10(e) + Params[4];\n       break;\n\n    // (Y - d) / a = log(b * X ^Gamma + c)\n    // pow(10, (Y-d) / a) = b * X ^Gamma + c\n    // pow((pow(10, (Y-d) / a) - c) / b, 1/g) = X\n    case -7:\n       Val = pow((pow(10.0, (R-Params[4]) / Params[1]) - Params[3]) / Params[2], 1.0 / Params[0]);\n       break;\n\n\n   //Y = a * b^(c*X+d) + e\n   case 8:\n       Val = (Params[0] * pow(Params[1], Params[2] * R + Params[3]) + Params[4]);\n       break;\n\n\n   // Y = (log((y-e) / a) / log(b) - d ) / c\n   // a=0, b=1, c=2, d=3, e=4,\n   case -8:\n\n       disc = R - Params[4];\n       if (disc < 0) Val = 0;\n       else\n           Val = (log(disc / Params[0]) / log(Params[1]) - Params[3]) / Params[2];\n       break;\n\n   // S-Shaped: (1 - (1-x)^1/g)^1/g\n   case 108:\n      Val = pow(1.0 - pow(1 - R, 1/Params[0]), 1/Params[0]);\n      break;\n\n    // y = (1 - (1-x)^1/g)^1/g\n    // y^g = (1 - (1-x)^1/g)\n    // 1 - y^g = (1-x)^1/g\n    // (1 - y^g)^g = 1 - x\n    // 1 - (1 - y^g)^g\n    case -108:\n        Val = 1 - pow(1 - pow(R, Params[0]), Params[0]);\n        break;\n\n    default:\n        // Unsupported parametric curve. Should never reach here\n        return 0;\n    }\n\n    return Val;\n}\n\n// Evaluate a segmented funtion for a single value. Return -1 if no valid segment found .\n// If fn type is 0, perform an interpolation on the table\nstatic\ncmsFloat64Number EvalSegmentedFn(const cmsToneCurve *g, cmsFloat64Number R)\n{\n    int i;\n\n    for (i = g ->nSegments-1; i >= 0 ; --i) {\n\n        // Check for domain\n        if ((R > g ->Segments[i].x0) && (R <= g ->Segments[i].x1)) {\n\n            // Type == 0 means segment is sampled\n            if (g ->Segments[i].Type == 0) {\n\n                cmsFloat32Number R1 = (cmsFloat32Number) (R - g ->Segments[i].x0) / (g ->Segments[i].x1 - g ->Segments[i].x0);\n                cmsFloat32Number Out;\n\n                // Setup the table (TODO: clean that)\n                g ->SegInterp[i]-> Table = g ->Segments[i].SampledPoints;\n\n                g ->SegInterp[i] -> Interpolation.LerpFloat(&R1, &Out, g ->SegInterp[i]);\n\n                return Out;\n            }\n            else\n                return g ->Evals[i](g->Segments[i].Type, g ->Segments[i].Params, R);\n        }\n    }\n\n    return MINUS_INF;\n}\n\n// Access to estimated low-res table\ncmsUInt32Number CMSEXPORT cmsGetToneCurveEstimatedTableEntries(const cmsToneCurve* t)\n{\n    _cmsAssert(t != NULL);\n    return t ->nEntries;\n}\n\nconst cmsUInt16Number* CMSEXPORT cmsGetToneCurveEstimatedTable(const cmsToneCurve* t)\n{\n    _cmsAssert(t != NULL);\n    return t ->Table16;\n}\n\n\n// Create an empty gamma curve, by using tables. This specifies only the limited-precision part, and leaves the\n// floating point description empty.\ncmsToneCurve* CMSEXPORT cmsBuildTabulatedToneCurve16(cmsContext ContextID, cmsInt32Number nEntries, const cmsUInt16Number Values[])\n{\n    return AllocateToneCurveStruct(ContextID, nEntries, 0, NULL, Values);\n}\n\nstatic\nint EntriesByGamma(cmsFloat64Number Gamma)\n{\n    if (fabs(Gamma - 1.0) < 0.001) return 2;\n    return 4096;\n}\n\n\n// Create a segmented gamma, fill the table\ncmsToneCurve* CMSEXPORT cmsBuildSegmentedToneCurve(cmsContext ContextID,\n                                                   cmsInt32Number nSegments, const cmsCurveSegment Segments[])\n{\n    int i;\n    cmsFloat64Number R, Val;\n    cmsToneCurve* g;\n    int nGridPoints = 4096;\n\n    _cmsAssert(Segments != NULL);\n\n    // Optimizatin for identity curves.\n    if (nSegments == 1 && Segments[0].Type == 1) {\n\n        nGridPoints = EntriesByGamma(Segments[0].Params[0]);\n    }\n\n    g = AllocateToneCurveStruct(ContextID, nGridPoints, nSegments, Segments, NULL);\n    if (g == NULL) return NULL;\n\n    // Once we have the floating point version, we can approximate a 16 bit table of 4096 entries\n    // for performance reasons. This table would normally not be used except on 8/16 bits transforms.\n    for (i=0; i < nGridPoints; i++) {\n\n        R   = (cmsFloat64Number) i / (nGridPoints-1);\n\n        Val = EvalSegmentedFn(g, R);\n\n        // Round and saturate\n        g ->Table16[i] = _cmsQuickSaturateWord(Val * 65535.0);\n    }\n\n    return g;\n}\n\n// Use a segmented curve to store the floating point table\ncmsToneCurve* CMSEXPORT cmsBuildTabulatedToneCurveFloat(cmsContext ContextID, cmsUInt32Number nEntries, const cmsFloat32Number values[])\n{\n    cmsCurveSegment Seg[3];\n\n    // A segmented tone curve should have function segments in the first and last positions\n    // Initialize segmented curve part up to 0 to constant value = samples[0]\n    Seg[0].x0 = MINUS_INF;\n    Seg[0].x1 = 0;\n    Seg[0].Type = 6;\n\n    Seg[0].Params[0] = 1;\n    Seg[0].Params[1] = 0;\n    Seg[0].Params[2] = 0;\n    Seg[0].Params[3] = values[0];\n    Seg[0].Params[4] = 0;\n\n    // From zero to 1\n    Seg[1].x0 = 0;\n    Seg[1].x1 = 1.0;\n    Seg[1].Type = 0;\n\n    Seg[1].nGridPoints = nEntries;\n    Seg[1].SampledPoints = (cmsFloat32Number*) values;\n\n    // Final segment is constant = lastsample\n    Seg[2].x0 = 1.0;\n    Seg[2].x1 = PLUS_INF;\n    Seg[2].Type = 6;\n    \n    Seg[2].Params[0] = 1;\n    Seg[2].Params[1] = 0;\n    Seg[2].Params[2] = 0;\n    Seg[2].Params[3] = values[nEntries-1];\n    Seg[2].Params[4] = 0;\n    \n\n    return cmsBuildSegmentedToneCurve(ContextID, 3, Seg);\n}\n\n// Parametric curves\n//\n// Parameters goes as: Curve, a, b, c, d, e, f\n// Type is the ICC type +1\n// if type is negative, then the curve is analyticaly inverted\ncmsToneCurve* CMSEXPORT cmsBuildParametricToneCurve(cmsContext ContextID, cmsInt32Number Type, const cmsFloat64Number Params[])\n{\n    cmsCurveSegment Seg0;\n    int Pos = 0;\n    cmsUInt32Number size;\n    _cmsParametricCurvesCollection* c = GetParametricCurveByType(ContextID, Type, &Pos);\n\n    _cmsAssert(Params != NULL);\n\n    if (c == NULL) {\n        cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, \"Invalid parametric curve type %d\", Type);\n        return NULL;\n    }\n\n    memset(&Seg0, 0, sizeof(Seg0));\n\n    Seg0.x0   = MINUS_INF;\n    Seg0.x1   = PLUS_INF;\n    Seg0.Type = Type;\n\n    size = c->ParameterCount[Pos] * sizeof(cmsFloat64Number);\n    memmove(Seg0.Params, Params, size);\n\n    return cmsBuildSegmentedToneCurve(ContextID, 1, &Seg0);\n}\n\n\n\n// Build a gamma table based on gamma constant\ncmsToneCurve* CMSEXPORT cmsBuildGamma(cmsContext ContextID, cmsFloat64Number Gamma)\n{\n    return cmsBuildParametricToneCurve(ContextID, 1, &Gamma);\n}\n\n\n// Free all memory taken by the gamma curve\nvoid CMSEXPORT cmsFreeToneCurve(cmsToneCurve* Curve)\n{\n    cmsContext ContextID;\n\n\t// added by Xiaochuan Liu\n\t// Curve->InterpParams may be null\n    if (Curve == NULL || Curve->InterpParams == NULL) return;\n\n    ContextID = Curve ->InterpParams->ContextID;\n\n    _cmsFreeInterpParams(Curve ->InterpParams);\n\tCurve ->InterpParams = NULL;\n\n    if (Curve -> Table16)\n\t{\n        _cmsFree(ContextID, Curve ->Table16);\n\t\tCurve ->Table16 = NULL;\n\t}\n\n    if (Curve ->Segments) {\n\n        cmsUInt32Number i;\n\n        for (i=0; i < Curve ->nSegments; i++) {\n\n            if (Curve ->Segments[i].SampledPoints) {\n                _cmsFree(ContextID, Curve ->Segments[i].SampledPoints);\n\t\t\t\tCurve ->Segments[i].SampledPoints = NULL;\n            }\n\n            if (Curve ->SegInterp[i] != 0)\n\t\t\t{\n                _cmsFreeInterpParams(Curve->SegInterp[i]);\n\t\t\t\tCurve->SegInterp[i] = NULL;\n\t\t\t}\n        }\n\n        _cmsFree(ContextID, Curve ->Segments);\n\t\tCurve ->Segments = NULL;\n        _cmsFree(ContextID, Curve ->SegInterp);\n\t\tCurve ->SegInterp = NULL;\n    }\n\n    if (Curve -> Evals)\n\t{\n        _cmsFree(ContextID, Curve -> Evals);\n\t\tCurve -> Evals = NULL;\n\t}\n\n    if (Curve)\n\t{\n\t\t_cmsFree(ContextID, Curve);\n\t\tCurve = NULL;\n\t}\n}\n\n// Utility function, free 3 gamma tables\nvoid CMSEXPORT cmsFreeToneCurveTriple(cmsToneCurve* Curve[3])\n{\n\n    _cmsAssert(Curve != NULL);\n\n    if (Curve[0] != NULL) cmsFreeToneCurve(Curve[0]);\n    if (Curve[1] != NULL) cmsFreeToneCurve(Curve[1]);\n    if (Curve[2] != NULL) cmsFreeToneCurve(Curve[2]);\n\n    Curve[0] = Curve[1] = Curve[2] = NULL;\n}\n\n\n// Duplicate a gamma table\ncmsToneCurve* CMSEXPORT cmsDupToneCurve(const cmsToneCurve* In)\n{   \n\t// Xiaochuan Liu\n\t// fix openpdf bug(mantis id:0055683, google id:360198)\n\t// the function CurveSetElemTypeFree in cmslut.c also needs to check pointer\n    if (In == NULL || In ->InterpParams == NULL) return NULL;\n\n    return  AllocateToneCurveStruct(In ->InterpParams ->ContextID, In ->nEntries, In ->nSegments, In ->Segments, In ->Table16);\n}\n\n// Joins two curves for X and Y. Curves should be monotonic.\n// We want to get\n//\n//      y = Y^-1(X(t))\n//\ncmsToneCurve* CMSEXPORT cmsJoinToneCurve(cmsContext ContextID,\n                                      const cmsToneCurve* X,\n                                      const cmsToneCurve* Y, cmsUInt32Number nResultingPoints)\n{\n    cmsToneCurve* out = NULL;\n    cmsToneCurve* Yreversed = NULL;\n    cmsFloat32Number t, x;\n    cmsFloat32Number* Res = NULL;\n    cmsUInt32Number i;\n\n\n    _cmsAssert(X != NULL);\n    _cmsAssert(Y != NULL);\n\n    Yreversed = cmsReverseToneCurveEx(nResultingPoints, Y);\n    if (Yreversed == NULL) goto Error;\n\n    Res = (cmsFloat32Number*) _cmsCalloc(ContextID, nResultingPoints, sizeof(cmsFloat32Number));\n    if (Res == NULL) goto Error;\n\n    //Iterate\n    for (i=0; i <  nResultingPoints; i++) {\n\n        t = (cmsFloat32Number) i / (nResultingPoints-1);\n        x = cmsEvalToneCurveFloat(X,  t);\n        Res[i] = cmsEvalToneCurveFloat(Yreversed, x);\n    }\n\n    // Allocate space for output\n    out = cmsBuildTabulatedToneCurveFloat(ContextID, nResultingPoints, Res);\n\nError:\n\n    if (Res != NULL) _cmsFree(ContextID, Res);\n    if (Yreversed != NULL) cmsFreeToneCurve(Yreversed);\n\n    return out;\n}\n\n\n\n// Get the surrounding nodes. This is tricky on non-monotonic tables\nstatic\nint GetInterval(cmsFloat64Number In, const cmsUInt16Number LutTable[], const struct _cms_interp_struc* p)\n{\n    int i;\n    int y0, y1;\n\n    // A 1 point table is not allowed\n    if (p -> Domain[0] < 1) return -1;\n\n    // Let's see if ascending or descending.\n    if (LutTable[0] < LutTable[p ->Domain[0]]) {\n\n        // Table is overall ascending\n        for (i=p->Domain[0]-1; i >=0; --i) {\n\n            y0 = LutTable[i];\n            y1 = LutTable[i+1];\n\n            if (y0 <= y1) { // Increasing\n                if (In >= y0 && In <= y1) return i;\n            }\n            else\n                if (y1 < y0) { // Decreasing\n                    if (In >= y1 && In <= y0) return i;\n                }\n        }\n    }\n    else {\n        // Table is overall descending\n        for (i=0; i < (int) p -> Domain[0]; i++) {\n\n            y0 = LutTable[i];\n            y1 = LutTable[i+1];\n\n            if (y0 <= y1) { // Increasing\n                if (In >= y0 && In <= y1) return i;\n            }\n            else\n                if (y1 < y0) { // Decreasing\n                    if (In >= y1 && In <= y0) return i;\n                }\n        }\n    }\n\n    return -1;\n}\n\n// Reverse a gamma table\ncmsToneCurve* CMSEXPORT cmsReverseToneCurveEx(cmsInt32Number nResultSamples, const cmsToneCurve* InCurve)\n{\n    cmsToneCurve *out;\n    cmsFloat64Number a = 0, b = 0, y, x1, y1, x2, y2;\n    int i, j;\n    int Ascending;\n\n    _cmsAssert(InCurve != NULL);\n\n    // Try to reverse it analytically whatever possible\n \n    if (InCurve ->nSegments == 1 && InCurve ->Segments[0].Type > 0 && \n        /* InCurve -> Segments[0].Type <= 5 */ \n        GetParametricCurveByType(InCurve ->InterpParams->ContextID, InCurve ->Segments[0].Type, NULL) != NULL) {\n\n        return cmsBuildParametricToneCurve(InCurve ->InterpParams->ContextID,\n                                       -(InCurve -> Segments[0].Type),\n                                       InCurve -> Segments[0].Params);\n    }\n\n    // Nope, reverse the table.\n    out = cmsBuildTabulatedToneCurve16(InCurve ->InterpParams->ContextID, nResultSamples, NULL);\n    if (out == NULL)\n        return NULL;\n\n    // We want to know if this is an ascending or descending table\n    Ascending = !cmsIsToneCurveDescending(InCurve);\n\n    // Iterate across Y axis\n    for (i=0; i <  nResultSamples; i++) {\n\n        y = (cmsFloat64Number) i * 65535.0 / (nResultSamples - 1);\n\n        // Find interval in which y is within.\n        j = GetInterval(y, InCurve->Table16, InCurve->InterpParams);\n        if (j >= 0) {\n\n\n            // Get limits of interval\n            x1 = InCurve ->Table16[j];\n            x2 = InCurve ->Table16[j+1];\n\n            y1 = (cmsFloat64Number) (j * 65535.0) / (InCurve ->nEntries - 1);\n            y2 = (cmsFloat64Number) ((j+1) * 65535.0 ) / (InCurve ->nEntries - 1);\n\n            // If collapsed, then use any\n            if (x1 == x2) {\n\n                out ->Table16[i] = _cmsQuickSaturateWord(Ascending ? y2 : y1);\n                continue;\n\n            } else {\n\n                // Interpolate\n                a = (y2 - y1) / (x2 - x1);\n                b = y2 - a * x2;\n            }\n        }\n\n        out ->Table16[i] = _cmsQuickSaturateWord(a* y + b);\n    }\n\n\n    return out;\n}\n\n// Reverse a gamma table\ncmsToneCurve* CMSEXPORT cmsReverseToneCurve(const cmsToneCurve* InGamma)\n{\n    _cmsAssert(InGamma != NULL);\n\n    return cmsReverseToneCurveEx(4096, InGamma);\n}\n\n// From: Eilers, P.H.C. (1994) Smoothing and interpolation with finite\n// differences. in: Graphic Gems IV, Heckbert, P.S. (ed.), Academic press.\n//\n// Smoothing and interpolation with second differences.\n//\n//   Input:  weights (w), data (y): vector from 1 to m.\n//   Input:  smoothing parameter (lambda), length (m).\n//   Output: smoothed vector (z): vector from 1 to m.\n\nstatic\ncmsBool smooth2(cmsContext ContextID, cmsFloat32Number w[], cmsFloat32Number y[], cmsFloat32Number z[], cmsFloat32Number lambda, int m)\n{\n    int i, i1, i2;\n    cmsFloat32Number *c, *d, *e;\n    cmsBool st;\n\n\n    c = (cmsFloat32Number*) _cmsCalloc(ContextID, MAX_NODES_IN_CURVE, sizeof(cmsFloat32Number));\n    d = (cmsFloat32Number*) _cmsCalloc(ContextID, MAX_NODES_IN_CURVE, sizeof(cmsFloat32Number));\n    e = (cmsFloat32Number*) _cmsCalloc(ContextID, MAX_NODES_IN_CURVE, sizeof(cmsFloat32Number));\n\n    if (c != NULL && d != NULL && e != NULL) {\n\n\n    d[1] = w[1] + lambda;\n    c[1] = -2 * lambda / d[1];\n    e[1] = lambda /d[1];\n    z[1] = w[1] * y[1];\n    d[2] = w[2] + 5 * lambda - d[1] * c[1] *  c[1];\n    c[2] = (-4 * lambda - d[1] * c[1] * e[1]) / d[2];\n    e[2] = lambda / d[2];\n    z[2] = w[2] * y[2] - c[1] * z[1];\n\n    for (i = 3; i < m - 1; i++) {\n        i1 = i - 1; i2 = i - 2;\n        d[i]= w[i] + 6 * lambda - c[i1] * c[i1] * d[i1] - e[i2] * e[i2] * d[i2];\n        c[i] = (-4 * lambda -d[i1] * c[i1] * e[i1])/ d[i];\n        e[i] = lambda / d[i];\n        z[i] = w[i] * y[i] - c[i1] * z[i1] - e[i2] * z[i2];\n    }\n\n    i1 = m - 2; i2 = m - 3;\n\n    d[m - 1] = w[m - 1] + 5 * lambda -c[i1] * c[i1] * d[i1] - e[i2] * e[i2] * d[i2];\n    c[m - 1] = (-2 * lambda - d[i1] * c[i1] * e[i1]) / d[m - 1];\n    z[m - 1] = w[m - 1] * y[m - 1] - c[i1] * z[i1] - e[i2] * z[i2];\n    i1 = m - 1; i2 = m - 2;\n\n    d[m] = w[m] + lambda - c[i1] * c[i1] * d[i1] - e[i2] * e[i2] * d[i2];\n    z[m] = (w[m] * y[m] - c[i1] * z[i1] - e[i2] * z[i2]) / d[m];\n    z[m - 1] = z[m - 1] / d[m - 1] - c[m - 1] * z[m];\n\n    for (i = m - 2; 1<= i; i--)\n        z[i] = z[i] / d[i] - c[i] * z[i + 1] - e[i] * z[i + 2];\n\n      st = TRUE;\n    }\n    else st = FALSE;\n\n    if (c != NULL) _cmsFree(ContextID, c);\n    if (d != NULL) _cmsFree(ContextID, d);\n    if (e != NULL) _cmsFree(ContextID, e);\n\n    return st;\n}\n\n// Smooths a curve sampled at regular intervals.\ncmsBool  CMSEXPORT cmsSmoothToneCurve(cmsToneCurve* Tab, cmsFloat64Number lambda)\n{\n    cmsFloat32Number w[MAX_NODES_IN_CURVE], y[MAX_NODES_IN_CURVE], z[MAX_NODES_IN_CURVE];\n    int i, nItems, Zeros, Poles;\n\n    if (Tab == NULL) return FALSE;\n\n    if (cmsIsToneCurveLinear(Tab)) return TRUE; // Nothing to do\n\n    nItems = Tab -> nEntries;\n\n    if (nItems >= MAX_NODES_IN_CURVE) {\n        cmsSignalError(Tab ->InterpParams->ContextID, cmsERROR_RANGE, \"cmsSmoothToneCurve: too many points.\");\n        return FALSE;\n    }\n\n    memset(w, 0, nItems * sizeof(cmsFloat32Number));\n    memset(y, 0, nItems * sizeof(cmsFloat32Number));\n    memset(z, 0, nItems * sizeof(cmsFloat32Number));\n\n    for (i=0; i < nItems; i++)\n    {\n        y[i+1] = (cmsFloat32Number) Tab -> Table16[i];\n        w[i+1] = 1.0;\n    }\n\n    if (!smooth2(Tab ->InterpParams->ContextID, w, y, z, (cmsFloat32Number) lambda, nItems)) return FALSE;\n\n    // Do some reality - checking...\n    Zeros = Poles = 0;\n    for (i=nItems; i > 1; --i) {\n\n        if (z[i] == 0.) Zeros++;\n        if (z[i] >= 65535.) Poles++;\n        if (z[i] < z[i-1]) {\n            cmsSignalError(Tab ->InterpParams->ContextID, cmsERROR_RANGE, \"cmsSmoothToneCurve: Non-Monotonic.\");\n            return FALSE;\n        }\n    }\n\n    if (Zeros > (nItems / 3)) {\n        cmsSignalError(Tab ->InterpParams->ContextID, cmsERROR_RANGE, \"cmsSmoothToneCurve: Degenerated, mostly zeros.\");\n        return FALSE;\n    }\n    if (Poles > (nItems / 3)) {\n        cmsSignalError(Tab ->InterpParams->ContextID, cmsERROR_RANGE, \"cmsSmoothToneCurve: Degenerated, mostly poles.\");\n        return FALSE;\n    }\n\n    // Seems ok\n    for (i=0; i < nItems; i++) {\n\n        // Clamp to cmsUInt16Number\n        Tab -> Table16[i] = _cmsQuickSaturateWord(z[i+1]);\n    }\n\n    return TRUE;\n}\n\n// Is a table linear? Do not use parametric since we cannot guarantee some weird parameters resulting\n// in a linear table. This way assures it is linear in 12 bits, which should be enought in most cases.\ncmsBool CMSEXPORT cmsIsToneCurveLinear(const cmsToneCurve* Curve)\n{\n    cmsUInt32Number i;\n    int diff;\n\n    _cmsAssert(Curve != NULL);\n\n    for (i=0; i < Curve ->nEntries; i++) {\n\n        diff = abs((int) Curve->Table16[i] - (int) _cmsQuantizeVal(i, Curve ->nEntries));\n        if (diff > 0x0f)\n            return FALSE;\n    }\n\n    return TRUE;\n}\n\n// Same, but for monotonicity\ncmsBool  CMSEXPORT cmsIsToneCurveMonotonic(const cmsToneCurve* t)\n{\n    int n;\n    int i, last;\n    cmsBool lDescending;\n\n    _cmsAssert(t != NULL);\n\n    // Degenerated curves are monotonic? Ok, let's pass them\n    n = t ->nEntries;\n    if (n < 2) return TRUE;\n\n    // Curve direction\n    lDescending = cmsIsToneCurveDescending(t);\n\n    if (lDescending) {\n\n        last = t ->Table16[0];\n\n        for (i = 1; i < n; i++) {\n\n            if (t ->Table16[i] - last > 2) // We allow some ripple\n                return FALSE;\n            else\n                last = t ->Table16[i];\n\n        }\n    }\n    else {\n\n        last = t ->Table16[n-1];\n\n        for (i = n-2; i >= 0; --i) {\n\n            if (t ->Table16[i] - last > 2)\n                return FALSE;\n            else\n                last = t ->Table16[i];\n\n        }\n    }\n\n    return TRUE;\n}\n\n// Same, but for descending tables\ncmsBool  CMSEXPORT cmsIsToneCurveDescending(const cmsToneCurve* t)\n{\n    _cmsAssert(t != NULL);\n\n    return t ->Table16[0] > t ->Table16[t ->nEntries-1];\n}\n\n\n// Another info fn: is out gamma table multisegment?\ncmsBool  CMSEXPORT cmsIsToneCurveMultisegment(const cmsToneCurve* t)\n{\n    _cmsAssert(t != NULL);\n\n    return t -> nSegments > 1;\n}\n\ncmsInt32Number  CMSEXPORT cmsGetToneCurveParametricType(const cmsToneCurve* t)\n{\n    _cmsAssert(t != NULL);\n\n    if (t -> nSegments != 1) return 0;\n    return t ->Segments[0].Type;\n}\n\n// We need accuracy this time\ncmsFloat32Number CMSEXPORT cmsEvalToneCurveFloat(const cmsToneCurve* Curve, cmsFloat32Number v)\n{\n    _cmsAssert(Curve != NULL);\n\n    // Check for 16 bits table. If so, this is a limited-precision tone curve\n    if (Curve ->nSegments == 0) {\n\n        cmsUInt16Number In, Out;\n\n        In = (cmsUInt16Number) _cmsQuickSaturateWord(v * 65535.0);\n        Out = cmsEvalToneCurve16(Curve, In);\n\n        return (cmsFloat32Number) (Out / 65535.0);\n    }\n\n    return (cmsFloat32Number) EvalSegmentedFn(Curve, v);\n}\n\n// We need xput over here\ncmsUInt16Number CMSEXPORT cmsEvalToneCurve16(const cmsToneCurve* Curve, cmsUInt16Number v)\n{\n    cmsUInt16Number out;\n\n    _cmsAssert(Curve != NULL);\n\n    Curve ->InterpParams ->Interpolation.Lerp16(&v, &out, Curve ->InterpParams);\n    return out;\n}\n\n\n// Least squares fitting.\n// A mathematical procedure for finding the best-fitting curve to a given set of points by\n// minimizing the sum of the squares of the offsets (\"the residuals\") of the points from the curve.\n// The sum of the squares of the offsets is used instead of the offset absolute values because\n// this allows the residuals to be treated as a continuous differentiable quantity.\n//\n// y = f(x) = x ^ g\n//\n// R  = (yi - (xi^g))\n// R2 = (yi - (xi^g))2\n// SUM R2 = SUM (yi - (xi^g))2\n//\n// dR2/dg = -2 SUM x^g log(x)(y - x^g)\n// solving for dR2/dg = 0\n//\n// g = 1/n * SUM(log(y) / log(x))\n\ncmsFloat64Number CMSEXPORT cmsEstimateGamma(const cmsToneCurve* t, cmsFloat64Number Precision)\n{\n    cmsFloat64Number gamma, sum, sum2;\n    cmsFloat64Number n, x, y, Std;\n    cmsUInt32Number i;\n\n    _cmsAssert(t != NULL);\n\n    sum = sum2 = n = 0;\n\n    // Excluding endpoints\n    for (i=1; i < (MAX_NODES_IN_CURVE-1); i++) {\n\n        x = (cmsFloat64Number) i / (MAX_NODES_IN_CURVE-1);\n        y = (cmsFloat64Number) cmsEvalToneCurveFloat(t, (cmsFloat32Number) x);\n\n        // Avoid 7% on lower part to prevent\n        // artifacts due to linear ramps\n\n        if (y > 0. && y < 1. && x > 0.07) {\n\n            gamma = log(y) / log(x);\n            sum  += gamma;\n            sum2 += gamma * gamma;\n            n++;\n        }\n    }\n\n    // Take a look on SD to see if gamma isn't exponential at all\n    Std = sqrt((n * sum2 - sum * sum) / (n*(n-1)));\n\n    if (Std > Precision)\n        return -1.0;\n\n    return (sum / n);   // The mean\n}\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/src/cmsgmt.c",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2012 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n//\n\n#include \"lcms2_internal.h\"\n\n\n// Auxiliar: append a Lab identity after the given sequence of profiles\n// and return the transform. Lab profile is closed, rest of profiles are kept open.\ncmsHTRANSFORM _cmsChain2Lab(cmsContext            ContextID,\n                            cmsUInt32Number        nProfiles,\n                            cmsUInt32Number        InputFormat,\n                            cmsUInt32Number        OutputFormat,\n                            const cmsUInt32Number  Intents[],\n                            const cmsHPROFILE      hProfiles[],\n                            const cmsBool          BPC[],\n                            const cmsFloat64Number AdaptationStates[],\n                            cmsUInt32Number        dwFlags)\n{\n    cmsHTRANSFORM xform;\n    cmsHPROFILE   hLab;\n    cmsHPROFILE   ProfileList[256];\n    cmsBool       BPCList[256];\n    cmsFloat64Number AdaptationList[256];\n    cmsUInt32Number IntentList[256];\n    cmsUInt32Number i;\n\n    // This is a rather big number and there is no need of dynamic memory\n    // since we are adding a profile, 254 + 1 = 255 and this is the limit\n    if (nProfiles > 254) return NULL;\n\n    // The output space\n    hLab = cmsCreateLab4ProfileTHR(ContextID, NULL);\n    if (hLab == NULL) return NULL;\n\n    // Create a copy of parameters\n    for (i=0; i < nProfiles; i++) {\n\n        ProfileList[i]    = hProfiles[i];\n        BPCList[i]        = BPC[i];\n        AdaptationList[i] = AdaptationStates[i];\n        IntentList[i]     = Intents[i];\n    }\n\n    // Place Lab identity at chain's end.\n    ProfileList[nProfiles]    = hLab;\n    BPCList[nProfiles]        = 0;\n    AdaptationList[nProfiles] = 1.0;\n    IntentList[nProfiles]     = INTENT_RELATIVE_COLORIMETRIC;\n\n    // Create the transform\n    xform = cmsCreateExtendedTransform(ContextID, nProfiles + 1, ProfileList,\n                                       BPCList,\n                                       IntentList,\n                                       AdaptationList,\n                                       NULL, 0,\n                                       InputFormat,\n                                       OutputFormat,\n                                       dwFlags);\n\n    cmsCloseProfile(hLab);\n\n    return xform;\n}\n\n\n// Compute K -> L* relationship. Flags may include black point compensation. In this case,\n// the relationship is assumed from the profile with BPC to a black point zero.\nstatic\ncmsToneCurve* ComputeKToLstar(cmsContext            ContextID,\n                               cmsUInt32Number       nPoints,\n                               cmsUInt32Number       nProfiles,\n                               const cmsUInt32Number Intents[],\n                               const cmsHPROFILE     hProfiles[],\n                               const cmsBool         BPC[],\n                               const cmsFloat64Number AdaptationStates[],\n                               cmsUInt32Number dwFlags)\n{\n    cmsToneCurve* out = NULL;\n    cmsUInt32Number i;\n    cmsHTRANSFORM xform;\n    cmsCIELab Lab;\n    cmsFloat32Number cmyk[4];\n    cmsFloat32Number* SampledPoints;\n\n    xform = _cmsChain2Lab(ContextID, nProfiles, TYPE_CMYK_FLT, TYPE_Lab_DBL, Intents, hProfiles, BPC, AdaptationStates, dwFlags);\n    if (xform == NULL) return NULL;\n\n    SampledPoints = (cmsFloat32Number*) _cmsCalloc(ContextID, nPoints, sizeof(cmsFloat32Number));\n    if (SampledPoints  == NULL) goto Error;\n\n    for (i=0; i < nPoints; i++) {\n\n        cmyk[0] = 0;\n        cmyk[1] = 0;\n        cmyk[2] = 0;\n        cmyk[3] = (cmsFloat32Number) ((i * 100.0) / (nPoints-1));\n\n        cmsDoTransform(xform, cmyk, &Lab, 1);\n        SampledPoints[i]= (cmsFloat32Number) (1.0 - Lab.L / 100.0); // Negate K for easier operation\n    }\n\n    out = cmsBuildTabulatedToneCurveFloat(ContextID, nPoints, SampledPoints);\n\nError:\n\n    cmsDeleteTransform(xform);\n    if (SampledPoints) _cmsFree(ContextID, SampledPoints);\n\n    return out;\n}\n\n\n// Compute Black tone curve on a CMYK -> CMYK transform. This is done by\n// using the proof direction on both profiles to find K->L* relationship\n// then joining both curves. dwFlags may include black point compensation.\ncmsToneCurve* _cmsBuildKToneCurve(cmsContext        ContextID,\n                                   cmsUInt32Number   nPoints,\n                                   cmsUInt32Number   nProfiles,\n                                   const cmsUInt32Number Intents[],\n                                   const cmsHPROFILE hProfiles[],\n                                   const cmsBool     BPC[],\n                                   const cmsFloat64Number AdaptationStates[],\n                                   cmsUInt32Number   dwFlags)\n{\n    cmsToneCurve *in, *out, *KTone;\n\n    // Make sure CMYK -> CMYK\n    if (cmsGetColorSpace(hProfiles[0]) != cmsSigCmykData ||\n        cmsGetColorSpace(hProfiles[nProfiles-1])!= cmsSigCmykData) return NULL;\n\n\n    // Make sure last is an output profile\n    if (cmsGetDeviceClass(hProfiles[nProfiles - 1]) != cmsSigOutputClass) return NULL;\n\n    // Create individual curves. BPC works also as each K to L* is\n    // computed as a BPC to zero black point in case of L*\n    in  = ComputeKToLstar(ContextID, nPoints, nProfiles - 1, Intents, hProfiles, BPC, AdaptationStates, dwFlags);\n    if (in == NULL) return NULL;\n\n    out = ComputeKToLstar(ContextID, nPoints, 1,\n                            Intents + (nProfiles - 1),\n                            &hProfiles [nProfiles - 1],\n                            BPC + (nProfiles - 1),\n                            AdaptationStates + (nProfiles - 1),\n                            dwFlags);\n    if (out == NULL) {\n        cmsFreeToneCurve(in);\n        return NULL;\n    }\n\n    // Build the relationship. This effectively limits the maximum accuracy to 16 bits, but\n    // since this is used on black-preserving LUTs, we are not loosing  accuracy in any case\n    KTone = cmsJoinToneCurve(ContextID, in, out, nPoints);\n\n    // Get rid of components\n    cmsFreeToneCurve(in); cmsFreeToneCurve(out);\n\n    // Something went wrong...\n    if (KTone == NULL) return NULL;\n\n    // Make sure it is monotonic\n    if (!cmsIsToneCurveMonotonic(KTone)) {\n        cmsFreeToneCurve(KTone);\n        return NULL;\n    }\n\n    return KTone;\n}\n\n\n// Gamut LUT Creation -----------------------------------------------------------------------------------------\n\n// Used by gamut & softproofing\n\ntypedef struct {\n\n    cmsHTRANSFORM hInput;               // From whatever input color space. 16 bits to DBL\n    cmsHTRANSFORM hForward, hReverse;   // Transforms going from Lab to colorant and back\n    cmsFloat64Number Thereshold;        // The thereshold after which is considered out of gamut\n\n    } GAMUTCHAIN;\n\n// This sampler does compute gamut boundaries by comparing original\n// values with a transform going back and forth. Values above ERR_THERESHOLD\n// of maximum are considered out of gamut.\n\n#define ERR_THERESHOLD      5\n\n\nstatic\nint GamutSampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo)\n{\n    GAMUTCHAIN*  t = (GAMUTCHAIN* ) Cargo;\n    cmsCIELab LabIn1, LabOut1;\n    cmsCIELab LabIn2, LabOut2;\n    cmsUInt16Number Proof[cmsMAXCHANNELS], Proof2[cmsMAXCHANNELS];\n    cmsFloat64Number dE1, dE2, ErrorRatio;\n\n    // Assume in-gamut by default.\n    ErrorRatio = 1.0;\n\n    // Convert input to Lab\n    cmsDoTransform(t -> hInput, In, &LabIn1, 1);\n\n    // converts from PCS to colorant. This always\n    // does return in-gamut values,\n    cmsDoTransform(t -> hForward, &LabIn1, Proof, 1);\n\n    // Now, do the inverse, from colorant to PCS.\n    cmsDoTransform(t -> hReverse, Proof, &LabOut1, 1);\n\n    memmove(&LabIn2, &LabOut1, sizeof(cmsCIELab));\n\n    // Try again, but this time taking Check as input\n    cmsDoTransform(t -> hForward, &LabOut1, Proof2, 1);\n    cmsDoTransform(t -> hReverse, Proof2, &LabOut2, 1);\n\n    // Take difference of direct value\n    dE1 = cmsDeltaE(&LabIn1, &LabOut1);\n\n    // Take difference of converted value\n    dE2 = cmsDeltaE(&LabIn2, &LabOut2);\n\n\n    // if dE1 is small and dE2 is small, value is likely to be in gamut\n    if (dE1 < t->Thereshold && dE2 < t->Thereshold)\n        Out[0] = 0;\n    else {\n\n        // if dE1 is small and dE2 is big, undefined. Assume in gamut\n        if (dE1 < t->Thereshold && dE2 > t->Thereshold)\n            Out[0] = 0;\n        else\n            // dE1 is big and dE2 is small, clearly out of gamut\n            if (dE1 > t->Thereshold && dE2 < t->Thereshold)\n                Out[0] = (cmsUInt16Number) _cmsQuickFloor((dE1 - t->Thereshold) + .5);\n            else  {\n\n                // dE1 is big and dE2 is also big, could be due to perceptual mapping\n                // so take error ratio\n                if (dE2 == 0.0)\n                    ErrorRatio = dE1;\n                else\n                    ErrorRatio = dE1 / dE2;\n\n                if (ErrorRatio > t->Thereshold)\n                    Out[0] = (cmsUInt16Number)  _cmsQuickFloor((ErrorRatio - t->Thereshold) + .5);\n                else\n                    Out[0] = 0;\n            }\n    }\n\n\n    return TRUE;\n}\n\n// Does compute a gamut LUT going back and forth across pcs -> relativ. colorimetric intent -> pcs\n// the dE obtained is then annotated on the LUT. Values truely out of gamut are clipped to dE = 0xFFFE\n// and values changed are supposed to be handled by any gamut remapping, so, are out of gamut as well.\n//\n// **WARNING: This algorithm does assume that gamut remapping algorithms does NOT move in-gamut colors,\n// of course, many perceptual and saturation intents does not work in such way, but relativ. ones should.\n\ncmsPipeline* _cmsCreateGamutCheckPipeline(cmsContext ContextID,\n                                          cmsHPROFILE hProfiles[],\n                                          cmsBool  BPC[],\n                                          cmsUInt32Number Intents[],\n                                          cmsFloat64Number AdaptationStates[],\n                                          cmsUInt32Number nGamutPCSposition,\n                                          cmsHPROFILE hGamut)\n{\n    cmsHPROFILE hLab;\n    cmsPipeline* Gamut;\n    cmsStage* CLUT;\n    cmsUInt32Number dwFormat;\n    GAMUTCHAIN Chain;\n    int nChannels, nGridpoints;\n    cmsColorSpaceSignature ColorSpace;\n    cmsUInt32Number i;\n    cmsHPROFILE ProfileList[256];\n    cmsBool     BPCList[256];\n    cmsFloat64Number AdaptationList[256];\n    cmsUInt32Number IntentList[256];\n\n    memset(&Chain, 0, sizeof(GAMUTCHAIN));\n\n\n    if (nGamutPCSposition <= 0 || nGamutPCSposition > 255) {\n        cmsSignalError(ContextID, cmsERROR_RANGE, \"Wrong position of PCS. 1..255 expected, %d found.\", nGamutPCSposition);\n        return NULL;\n    }\n\n    hLab = cmsCreateLab4ProfileTHR(ContextID, NULL);\n    if (hLab == NULL) return NULL;\n\n\n    // The figure of merit. On matrix-shaper profiles, should be almost zero as\n    // the conversion is pretty exact. On LUT based profiles, different resolutions\n    // of input and output CLUT may result in differences.\n\n    if (cmsIsMatrixShaper(hGamut)) {\n\n        Chain.Thereshold = 1.0;\n    }\n    else {\n        Chain.Thereshold = ERR_THERESHOLD;\n    }\n\n\n    // Create a copy of parameters\n    for (i=0; i < nGamutPCSposition; i++) {\n        ProfileList[i]    = hProfiles[i];\n        BPCList[i]        = BPC[i];\n        AdaptationList[i] = AdaptationStates[i];\n        IntentList[i]     = Intents[i];\n    }\n\n    // Fill Lab identity\n    ProfileList[nGamutPCSposition] = hLab;\n    BPCList[nGamutPCSposition] = 0;\n    AdaptationList[nGamutPCSposition] = 1.0;\n    IntentList[nGamutPCSposition] = INTENT_RELATIVE_COLORIMETRIC;\n\n\n    ColorSpace  = cmsGetColorSpace(hGamut);\n\n    nChannels   = cmsChannelsOf(ColorSpace);\n    nGridpoints = _cmsReasonableGridpointsByColorspace(ColorSpace, cmsFLAGS_HIGHRESPRECALC);\n    dwFormat    = (CHANNELS_SH(nChannels)|BYTES_SH(2));\n\n    // 16 bits to Lab double\n    Chain.hInput = cmsCreateExtendedTransform(ContextID,\n        nGamutPCSposition + 1,\n        ProfileList,\n        BPCList,\n        IntentList,\n        AdaptationList,\n        NULL, 0,\n        dwFormat, TYPE_Lab_DBL,\n        cmsFLAGS_NOCACHE);\n\n\n    // Does create the forward step. Lab double to device\n    dwFormat    = (CHANNELS_SH(nChannels)|BYTES_SH(2));\n    Chain.hForward = cmsCreateTransformTHR(ContextID,\n        hLab, TYPE_Lab_DBL,\n        hGamut, dwFormat,\n        INTENT_RELATIVE_COLORIMETRIC,\n        cmsFLAGS_NOCACHE);\n\n    // Does create the backwards step\n    Chain.hReverse = cmsCreateTransformTHR(ContextID, hGamut, dwFormat,\n        hLab, TYPE_Lab_DBL,\n        INTENT_RELATIVE_COLORIMETRIC,\n        cmsFLAGS_NOCACHE);\n\n\n    // All ok?\n    if (Chain.hInput && Chain.hForward && Chain.hReverse) {\n\n        // Go on, try to compute gamut LUT from PCS. This consist on a single channel containing\n        // dE when doing a transform back and forth on the colorimetric intent.\n\n        Gamut = cmsPipelineAlloc(ContextID, 3, 1);\n        if (Gamut != NULL) {\n\n            CLUT = cmsStageAllocCLut16bit(ContextID, nGridpoints, nChannels, 1, NULL);\n            if (!cmsPipelineInsertStage(Gamut, cmsAT_BEGIN, CLUT)) {\n                cmsPipelineFree(Gamut);\n                Gamut = NULL;\n            } \n            else {\n                cmsStageSampleCLut16bit(CLUT, GamutSampler, (void*) &Chain, 0);\n            }\n        }\n    }\n    else\n        Gamut = NULL;   // Didn't work...\n\n    // Free all needed stuff.\n    if (Chain.hInput)   cmsDeleteTransform(Chain.hInput);\n    if (Chain.hForward) cmsDeleteTransform(Chain.hForward);\n    if (Chain.hReverse) cmsDeleteTransform(Chain.hReverse);\n    if (hLab) cmsCloseProfile(hLab);\n\n    // And return computed hull\n    return Gamut;\n}\n\n// Total Area Coverage estimation ----------------------------------------------------------------\n\ntypedef struct {\n    cmsUInt32Number  nOutputChans;\n    cmsHTRANSFORM    hRoundTrip;\n    cmsFloat32Number MaxTAC;\n    cmsFloat32Number MaxInput[cmsMAXCHANNELS];\n\n} cmsTACestimator;\n\n\n// This callback just accounts the maximum ink dropped in the given node. It does not populate any\n// memory, as the destination table is NULL. Its only purpose it to know the global maximum.\nstatic\nint EstimateTAC(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void * Cargo)\n{\n    cmsTACestimator* bp = (cmsTACestimator*) Cargo;\n    cmsFloat32Number RoundTrip[cmsMAXCHANNELS];\n    cmsUInt32Number i;\n    cmsFloat32Number Sum;\n\n\n    // Evaluate the xform\n    cmsDoTransform(bp->hRoundTrip, In, RoundTrip, 1);\n\n    // All all amounts of ink\n    for (Sum=0, i=0; i < bp ->nOutputChans; i++)\n            Sum += RoundTrip[i];\n\n    // If above maximum, keep track of input values\n    if (Sum > bp ->MaxTAC) {\n\n            bp ->MaxTAC = Sum;\n\n            for (i=0; i < bp ->nOutputChans; i++) {\n                bp ->MaxInput[i] = In[i];\n            }\n    }\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(Out);\n}\n\n\n// Detect Total area coverage of the profile\ncmsFloat64Number CMSEXPORT cmsDetectTAC(cmsHPROFILE hProfile)\n{\n    cmsTACestimator bp;\n    cmsUInt32Number dwFormatter;\n    cmsUInt32Number GridPoints[MAX_INPUT_DIMENSIONS];\n    cmsHPROFILE hLab;\n    cmsContext ContextID = cmsGetProfileContextID(hProfile);\n\n    // TAC only works on output profiles\n    if (cmsGetDeviceClass(hProfile) != cmsSigOutputClass) {\n        return 0;\n    }\n\n    // Create a fake formatter for result\n    dwFormatter = cmsFormatterForColorspaceOfProfile(hProfile, 4, TRUE);\n\n    bp.nOutputChans = T_CHANNELS(dwFormatter);\n    bp.MaxTAC = 0;    // Initial TAC is 0\n\n    //  for safety\n    if (bp.nOutputChans >= cmsMAXCHANNELS) return 0;\n\n    hLab = cmsCreateLab4ProfileTHR(ContextID, NULL);\n    if (hLab == NULL) return 0;\n    // Setup a roundtrip on perceptual intent in output profile for TAC estimation\n    bp.hRoundTrip = cmsCreateTransformTHR(ContextID, hLab, TYPE_Lab_16,\n                                          hProfile, dwFormatter, INTENT_PERCEPTUAL, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_NOCACHE);\n\n    cmsCloseProfile(hLab);\n    if (bp.hRoundTrip == NULL) return 0;\n\n    // For L* we only need black and white. For C* we need many points\n    GridPoints[0] = 6;\n    GridPoints[1] = 74;\n    GridPoints[2] = 74;\n\n\n    if (!cmsSliceSpace16(3, GridPoints, EstimateTAC, &bp)) {\n        bp.MaxTAC = 0;\n    }\n\n    cmsDeleteTransform(bp.hRoundTrip);\n\n    // Results in %\n    return bp.MaxTAC;\n}\n\n\n// Carefully,  clamp on CIELab space.\n\ncmsBool CMSEXPORT cmsDesaturateLab(cmsCIELab* Lab,\n                                   double amax, double amin,\n                                   double bmax, double bmin)\n{\n\n    // Whole Luma surface to zero\n\n    if (Lab -> L < 0) {\n\n        Lab-> L = Lab->a = Lab-> b = 0.0;\n        return FALSE;\n    }\n\n    // Clamp white, DISCARD HIGHLIGHTS. This is done\n    // in such way because icc spec doesn't allow the\n    // use of L>100 as a highlight means.\n\n    if (Lab->L > 100)\n        Lab -> L = 100;\n\n    // Check out gamut prism, on a, b faces\n\n    if (Lab -> a < amin || Lab->a > amax||\n        Lab -> b < bmin || Lab->b > bmax) {\n\n            cmsCIELCh LCh;\n            double h, slope;\n\n            // Falls outside a, b limits. Transports to LCh space,\n            // and then do the clipping\n\n\n            if (Lab -> a == 0.0) { // Is hue exactly 90?\n\n                // atan will not work, so clamp here\n                Lab -> b = Lab->b < 0 ? bmin : bmax;\n                return TRUE;\n            }\n\n            cmsLab2LCh(&LCh, Lab);\n\n            slope = Lab -> b / Lab -> a;\n            h = LCh.h;\n\n            // There are 4 zones\n\n            if ((h >= 0. && h < 45.) ||\n                (h >= 315 && h <= 360.)) {\n\n                    // clip by amax\n                    Lab -> a = amax;\n                    Lab -> b = amax * slope;\n            }\n            else\n                if (h >= 45. && h < 135.)\n                {\n                    // clip by bmax\n                    Lab -> b = bmax;\n                    Lab -> a = bmax / slope;\n                }\n                else\n                    if (h >= 135. && h < 225.) {\n                        // clip by amin\n                        Lab -> a = amin;\n                        Lab -> b = amin * slope;\n\n                    }\n                    else\n                        if (h >= 225. && h < 315.) {\n                            // clip by bmin\n                            Lab -> b = bmin;\n                            Lab -> a = bmin / slope;\n                        }\n                        else  {\n                            cmsSignalError(0, cmsERROR_RANGE, \"Invalid angle\");\n                            return FALSE;\n                        }\n\n    }\n\n    return TRUE;\n}\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/src/cmshalf.c",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2012 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n\n#include \"lcms2_internal.h\"\n\n#ifndef CMS_NO_HALF_SUPPORT \n\n// This code is inspired in the paper \"Fast Half Float Conversions\"\n// by Jeroen van der Zijp\n\nstatic cmsUInt32Number Mantissa[2048] = {\n\n0x00000000, 0x33800000, 0x34000000, 0x34400000, 0x34800000, 0x34a00000,\n0x34c00000, 0x34e00000, 0x35000000, 0x35100000, 0x35200000, 0x35300000,\n0x35400000, 0x35500000, 0x35600000, 0x35700000, 0x35800000, 0x35880000,\n0x35900000, 0x35980000, 0x35a00000, 0x35a80000, 0x35b00000, 0x35b80000,\n0x35c00000, 0x35c80000, 0x35d00000, 0x35d80000, 0x35e00000, 0x35e80000,\n0x35f00000, 0x35f80000, 0x36000000, 0x36040000, 0x36080000, 0x360c0000,\n0x36100000, 0x36140000, 0x36180000, 0x361c0000, 0x36200000, 0x36240000,\n0x36280000, 0x362c0000, 0x36300000, 0x36340000, 0x36380000, 0x363c0000,\n0x36400000, 0x36440000, 0x36480000, 0x364c0000, 0x36500000, 0x36540000,\n0x36580000, 0x365c0000, 0x36600000, 0x36640000, 0x36680000, 0x366c0000,\n0x36700000, 0x36740000, 0x36780000, 0x367c0000, 0x36800000, 0x36820000,\n0x36840000, 0x36860000, 0x36880000, 0x368a0000, 0x368c0000, 0x368e0000,\n0x36900000, 0x36920000, 0x36940000, 0x36960000, 0x36980000, 0x369a0000,\n0x369c0000, 0x369e0000, 0x36a00000, 0x36a20000, 0x36a40000, 0x36a60000,\n0x36a80000, 0x36aa0000, 0x36ac0000, 0x36ae0000, 0x36b00000, 0x36b20000,\n0x36b40000, 0x36b60000, 0x36b80000, 0x36ba0000, 0x36bc0000, 0x36be0000,\n0x36c00000, 0x36c20000, 0x36c40000, 0x36c60000, 0x36c80000, 0x36ca0000,\n0x36cc0000, 0x36ce0000, 0x36d00000, 0x36d20000, 0x36d40000, 0x36d60000,\n0x36d80000, 0x36da0000, 0x36dc0000, 0x36de0000, 0x36e00000, 0x36e20000,\n0x36e40000, 0x36e60000, 0x36e80000, 0x36ea0000, 0x36ec0000, 0x36ee0000,\n0x36f00000, 0x36f20000, 0x36f40000, 0x36f60000, 0x36f80000, 0x36fa0000,\n0x36fc0000, 0x36fe0000, 0x37000000, 0x37010000, 0x37020000, 0x37030000,\n0x37040000, 0x37050000, 0x37060000, 0x37070000, 0x37080000, 0x37090000,\n0x370a0000, 0x370b0000, 0x370c0000, 0x370d0000, 0x370e0000, 0x370f0000,\n0x37100000, 0x37110000, 0x37120000, 0x37130000, 0x37140000, 0x37150000,\n0x37160000, 0x37170000, 0x37180000, 0x37190000, 0x371a0000, 0x371b0000,\n0x371c0000, 0x371d0000, 0x371e0000, 0x371f0000, 0x37200000, 0x37210000,\n0x37220000, 0x37230000, 0x37240000, 0x37250000, 0x37260000, 0x37270000,\n0x37280000, 0x37290000, 0x372a0000, 0x372b0000, 0x372c0000, 0x372d0000,\n0x372e0000, 0x372f0000, 0x37300000, 0x37310000, 0x37320000, 0x37330000,\n0x37340000, 0x37350000, 0x37360000, 0x37370000, 0x37380000, 0x37390000,\n0x373a0000, 0x373b0000, 0x373c0000, 0x373d0000, 0x373e0000, 0x373f0000,\n0x37400000, 0x37410000, 0x37420000, 0x37430000, 0x37440000, 0x37450000,\n0x37460000, 0x37470000, 0x37480000, 0x37490000, 0x374a0000, 0x374b0000,\n0x374c0000, 0x374d0000, 0x374e0000, 0x374f0000, 0x37500000, 0x37510000,\n0x37520000, 0x37530000, 0x37540000, 0x37550000, 0x37560000, 0x37570000,\n0x37580000, 0x37590000, 0x375a0000, 0x375b0000, 0x375c0000, 0x375d0000,\n0x375e0000, 0x375f0000, 0x37600000, 0x37610000, 0x37620000, 0x37630000,\n0x37640000, 0x37650000, 0x37660000, 0x37670000, 0x37680000, 0x37690000,\n0x376a0000, 0x376b0000, 0x376c0000, 0x376d0000, 0x376e0000, 0x376f0000,\n0x37700000, 0x37710000, 0x37720000, 0x37730000, 0x37740000, 0x37750000,\n0x37760000, 0x37770000, 0x37780000, 0x37790000, 0x377a0000, 0x377b0000,\n0x377c0000, 0x377d0000, 0x377e0000, 0x377f0000, 0x37800000, 0x37808000,\n0x37810000, 0x37818000, 0x37820000, 0x37828000, 0x37830000, 0x37838000,\n0x37840000, 0x37848000, 0x37850000, 0x37858000, 0x37860000, 0x37868000,\n0x37870000, 0x37878000, 0x37880000, 0x37888000, 0x37890000, 0x37898000,\n0x378a0000, 0x378a8000, 0x378b0000, 0x378b8000, 0x378c0000, 0x378c8000,\n0x378d0000, 0x378d8000, 0x378e0000, 0x378e8000, 0x378f0000, 0x378f8000,\n0x37900000, 0x37908000, 0x37910000, 0x37918000, 0x37920000, 0x37928000,\n0x37930000, 0x37938000, 0x37940000, 0x37948000, 0x37950000, 0x37958000,\n0x37960000, 0x37968000, 0x37970000, 0x37978000, 0x37980000, 0x37988000,\n0x37990000, 0x37998000, 0x379a0000, 0x379a8000, 0x379b0000, 0x379b8000,\n0x379c0000, 0x379c8000, 0x379d0000, 0x379d8000, 0x379e0000, 0x379e8000,\n0x379f0000, 0x379f8000, 0x37a00000, 0x37a08000, 0x37a10000, 0x37a18000,\n0x37a20000, 0x37a28000, 0x37a30000, 0x37a38000, 0x37a40000, 0x37a48000,\n0x37a50000, 0x37a58000, 0x37a60000, 0x37a68000, 0x37a70000, 0x37a78000,\n0x37a80000, 0x37a88000, 0x37a90000, 0x37a98000, 0x37aa0000, 0x37aa8000,\n0x37ab0000, 0x37ab8000, 0x37ac0000, 0x37ac8000, 0x37ad0000, 0x37ad8000,\n0x37ae0000, 0x37ae8000, 0x37af0000, 0x37af8000, 0x37b00000, 0x37b08000,\n0x37b10000, 0x37b18000, 0x37b20000, 0x37b28000, 0x37b30000, 0x37b38000,\n0x37b40000, 0x37b48000, 0x37b50000, 0x37b58000, 0x37b60000, 0x37b68000,\n0x37b70000, 0x37b78000, 0x37b80000, 0x37b88000, 0x37b90000, 0x37b98000,\n0x37ba0000, 0x37ba8000, 0x37bb0000, 0x37bb8000, 0x37bc0000, 0x37bc8000,\n0x37bd0000, 0x37bd8000, 0x37be0000, 0x37be8000, 0x37bf0000, 0x37bf8000,\n0x37c00000, 0x37c08000, 0x37c10000, 0x37c18000, 0x37c20000, 0x37c28000,\n0x37c30000, 0x37c38000, 0x37c40000, 0x37c48000, 0x37c50000, 0x37c58000,\n0x37c60000, 0x37c68000, 0x37c70000, 0x37c78000, 0x37c80000, 0x37c88000,\n0x37c90000, 0x37c98000, 0x37ca0000, 0x37ca8000, 0x37cb0000, 0x37cb8000,\n0x37cc0000, 0x37cc8000, 0x37cd0000, 0x37cd8000, 0x37ce0000, 0x37ce8000,\n0x37cf0000, 0x37cf8000, 0x37d00000, 0x37d08000, 0x37d10000, 0x37d18000,\n0x37d20000, 0x37d28000, 0x37d30000, 0x37d38000, 0x37d40000, 0x37d48000,\n0x37d50000, 0x37d58000, 0x37d60000, 0x37d68000, 0x37d70000, 0x37d78000,\n0x37d80000, 0x37d88000, 0x37d90000, 0x37d98000, 0x37da0000, 0x37da8000,\n0x37db0000, 0x37db8000, 0x37dc0000, 0x37dc8000, 0x37dd0000, 0x37dd8000,\n0x37de0000, 0x37de8000, 0x37df0000, 0x37df8000, 0x37e00000, 0x37e08000,\n0x37e10000, 0x37e18000, 0x37e20000, 0x37e28000, 0x37e30000, 0x37e38000,\n0x37e40000, 0x37e48000, 0x37e50000, 0x37e58000, 0x37e60000, 0x37e68000,\n0x37e70000, 0x37e78000, 0x37e80000, 0x37e88000, 0x37e90000, 0x37e98000,\n0x37ea0000, 0x37ea8000, 0x37eb0000, 0x37eb8000, 0x37ec0000, 0x37ec8000,\n0x37ed0000, 0x37ed8000, 0x37ee0000, 0x37ee8000, 0x37ef0000, 0x37ef8000,\n0x37f00000, 0x37f08000, 0x37f10000, 0x37f18000, 0x37f20000, 0x37f28000,\n0x37f30000, 0x37f38000, 0x37f40000, 0x37f48000, 0x37f50000, 0x37f58000,\n0x37f60000, 0x37f68000, 0x37f70000, 0x37f78000, 0x37f80000, 0x37f88000,\n0x37f90000, 0x37f98000, 0x37fa0000, 0x37fa8000, 0x37fb0000, 0x37fb8000,\n0x37fc0000, 0x37fc8000, 0x37fd0000, 0x37fd8000, 0x37fe0000, 0x37fe8000,\n0x37ff0000, 0x37ff8000, 0x38000000, 0x38004000, 0x38008000, 0x3800c000,\n0x38010000, 0x38014000, 0x38018000, 0x3801c000, 0x38020000, 0x38024000,\n0x38028000, 0x3802c000, 0x38030000, 0x38034000, 0x38038000, 0x3803c000,\n0x38040000, 0x38044000, 0x38048000, 0x3804c000, 0x38050000, 0x38054000,\n0x38058000, 0x3805c000, 0x38060000, 0x38064000, 0x38068000, 0x3806c000,\n0x38070000, 0x38074000, 0x38078000, 0x3807c000, 0x38080000, 0x38084000,\n0x38088000, 0x3808c000, 0x38090000, 0x38094000, 0x38098000, 0x3809c000,\n0x380a0000, 0x380a4000, 0x380a8000, 0x380ac000, 0x380b0000, 0x380b4000,\n0x380b8000, 0x380bc000, 0x380c0000, 0x380c4000, 0x380c8000, 0x380cc000,\n0x380d0000, 0x380d4000, 0x380d8000, 0x380dc000, 0x380e0000, 0x380e4000,\n0x380e8000, 0x380ec000, 0x380f0000, 0x380f4000, 0x380f8000, 0x380fc000,\n0x38100000, 0x38104000, 0x38108000, 0x3810c000, 0x38110000, 0x38114000,\n0x38118000, 0x3811c000, 0x38120000, 0x38124000, 0x38128000, 0x3812c000,\n0x38130000, 0x38134000, 0x38138000, 0x3813c000, 0x38140000, 0x38144000,\n0x38148000, 0x3814c000, 0x38150000, 0x38154000, 0x38158000, 0x3815c000,\n0x38160000, 0x38164000, 0x38168000, 0x3816c000, 0x38170000, 0x38174000,\n0x38178000, 0x3817c000, 0x38180000, 0x38184000, 0x38188000, 0x3818c000,\n0x38190000, 0x38194000, 0x38198000, 0x3819c000, 0x381a0000, 0x381a4000,\n0x381a8000, 0x381ac000, 0x381b0000, 0x381b4000, 0x381b8000, 0x381bc000,\n0x381c0000, 0x381c4000, 0x381c8000, 0x381cc000, 0x381d0000, 0x381d4000,\n0x381d8000, 0x381dc000, 0x381e0000, 0x381e4000, 0x381e8000, 0x381ec000,\n0x381f0000, 0x381f4000, 0x381f8000, 0x381fc000, 0x38200000, 0x38204000,\n0x38208000, 0x3820c000, 0x38210000, 0x38214000, 0x38218000, 0x3821c000,\n0x38220000, 0x38224000, 0x38228000, 0x3822c000, 0x38230000, 0x38234000,\n0x38238000, 0x3823c000, 0x38240000, 0x38244000, 0x38248000, 0x3824c000,\n0x38250000, 0x38254000, 0x38258000, 0x3825c000, 0x38260000, 0x38264000,\n0x38268000, 0x3826c000, 0x38270000, 0x38274000, 0x38278000, 0x3827c000,\n0x38280000, 0x38284000, 0x38288000, 0x3828c000, 0x38290000, 0x38294000,\n0x38298000, 0x3829c000, 0x382a0000, 0x382a4000, 0x382a8000, 0x382ac000,\n0x382b0000, 0x382b4000, 0x382b8000, 0x382bc000, 0x382c0000, 0x382c4000,\n0x382c8000, 0x382cc000, 0x382d0000, 0x382d4000, 0x382d8000, 0x382dc000,\n0x382e0000, 0x382e4000, 0x382e8000, 0x382ec000, 0x382f0000, 0x382f4000,\n0x382f8000, 0x382fc000, 0x38300000, 0x38304000, 0x38308000, 0x3830c000,\n0x38310000, 0x38314000, 0x38318000, 0x3831c000, 0x38320000, 0x38324000,\n0x38328000, 0x3832c000, 0x38330000, 0x38334000, 0x38338000, 0x3833c000,\n0x38340000, 0x38344000, 0x38348000, 0x3834c000, 0x38350000, 0x38354000,\n0x38358000, 0x3835c000, 0x38360000, 0x38364000, 0x38368000, 0x3836c000,\n0x38370000, 0x38374000, 0x38378000, 0x3837c000, 0x38380000, 0x38384000,\n0x38388000, 0x3838c000, 0x38390000, 0x38394000, 0x38398000, 0x3839c000,\n0x383a0000, 0x383a4000, 0x383a8000, 0x383ac000, 0x383b0000, 0x383b4000,\n0x383b8000, 0x383bc000, 0x383c0000, 0x383c4000, 0x383c8000, 0x383cc000,\n0x383d0000, 0x383d4000, 0x383d8000, 0x383dc000, 0x383e0000, 0x383e4000,\n0x383e8000, 0x383ec000, 0x383f0000, 0x383f4000, 0x383f8000, 0x383fc000,\n0x38400000, 0x38404000, 0x38408000, 0x3840c000, 0x38410000, 0x38414000,\n0x38418000, 0x3841c000, 0x38420000, 0x38424000, 0x38428000, 0x3842c000,\n0x38430000, 0x38434000, 0x38438000, 0x3843c000, 0x38440000, 0x38444000,\n0x38448000, 0x3844c000, 0x38450000, 0x38454000, 0x38458000, 0x3845c000,\n0x38460000, 0x38464000, 0x38468000, 0x3846c000, 0x38470000, 0x38474000,\n0x38478000, 0x3847c000, 0x38480000, 0x38484000, 0x38488000, 0x3848c000,\n0x38490000, 0x38494000, 0x38498000, 0x3849c000, 0x384a0000, 0x384a4000,\n0x384a8000, 0x384ac000, 0x384b0000, 0x384b4000, 0x384b8000, 0x384bc000,\n0x384c0000, 0x384c4000, 0x384c8000, 0x384cc000, 0x384d0000, 0x384d4000,\n0x384d8000, 0x384dc000, 0x384e0000, 0x384e4000, 0x384e8000, 0x384ec000,\n0x384f0000, 0x384f4000, 0x384f8000, 0x384fc000, 0x38500000, 0x38504000,\n0x38508000, 0x3850c000, 0x38510000, 0x38514000, 0x38518000, 0x3851c000,\n0x38520000, 0x38524000, 0x38528000, 0x3852c000, 0x38530000, 0x38534000,\n0x38538000, 0x3853c000, 0x38540000, 0x38544000, 0x38548000, 0x3854c000,\n0x38550000, 0x38554000, 0x38558000, 0x3855c000, 0x38560000, 0x38564000,\n0x38568000, 0x3856c000, 0x38570000, 0x38574000, 0x38578000, 0x3857c000,\n0x38580000, 0x38584000, 0x38588000, 0x3858c000, 0x38590000, 0x38594000,\n0x38598000, 0x3859c000, 0x385a0000, 0x385a4000, 0x385a8000, 0x385ac000,\n0x385b0000, 0x385b4000, 0x385b8000, 0x385bc000, 0x385c0000, 0x385c4000,\n0x385c8000, 0x385cc000, 0x385d0000, 0x385d4000, 0x385d8000, 0x385dc000,\n0x385e0000, 0x385e4000, 0x385e8000, 0x385ec000, 0x385f0000, 0x385f4000,\n0x385f8000, 0x385fc000, 0x38600000, 0x38604000, 0x38608000, 0x3860c000,\n0x38610000, 0x38614000, 0x38618000, 0x3861c000, 0x38620000, 0x38624000,\n0x38628000, 0x3862c000, 0x38630000, 0x38634000, 0x38638000, 0x3863c000,\n0x38640000, 0x38644000, 0x38648000, 0x3864c000, 0x38650000, 0x38654000,\n0x38658000, 0x3865c000, 0x38660000, 0x38664000, 0x38668000, 0x3866c000,\n0x38670000, 0x38674000, 0x38678000, 0x3867c000, 0x38680000, 0x38684000,\n0x38688000, 0x3868c000, 0x38690000, 0x38694000, 0x38698000, 0x3869c000,\n0x386a0000, 0x386a4000, 0x386a8000, 0x386ac000, 0x386b0000, 0x386b4000,\n0x386b8000, 0x386bc000, 0x386c0000, 0x386c4000, 0x386c8000, 0x386cc000,\n0x386d0000, 0x386d4000, 0x386d8000, 0x386dc000, 0x386e0000, 0x386e4000,\n0x386e8000, 0x386ec000, 0x386f0000, 0x386f4000, 0x386f8000, 0x386fc000,\n0x38700000, 0x38704000, 0x38708000, 0x3870c000, 0x38710000, 0x38714000,\n0x38718000, 0x3871c000, 0x38720000, 0x38724000, 0x38728000, 0x3872c000,\n0x38730000, 0x38734000, 0x38738000, 0x3873c000, 0x38740000, 0x38744000,\n0x38748000, 0x3874c000, 0x38750000, 0x38754000, 0x38758000, 0x3875c000,\n0x38760000, 0x38764000, 0x38768000, 0x3876c000, 0x38770000, 0x38774000,\n0x38778000, 0x3877c000, 0x38780000, 0x38784000, 0x38788000, 0x3878c000,\n0x38790000, 0x38794000, 0x38798000, 0x3879c000, 0x387a0000, 0x387a4000,\n0x387a8000, 0x387ac000, 0x387b0000, 0x387b4000, 0x387b8000, 0x387bc000,\n0x387c0000, 0x387c4000, 0x387c8000, 0x387cc000, 0x387d0000, 0x387d4000,\n0x387d8000, 0x387dc000, 0x387e0000, 0x387e4000, 0x387e8000, 0x387ec000,\n0x387f0000, 0x387f4000, 0x387f8000, 0x387fc000, 0x38000000, 0x38002000,\n0x38004000, 0x38006000, 0x38008000, 0x3800a000, 0x3800c000, 0x3800e000,\n0x38010000, 0x38012000, 0x38014000, 0x38016000, 0x38018000, 0x3801a000,\n0x3801c000, 0x3801e000, 0x38020000, 0x38022000, 0x38024000, 0x38026000,\n0x38028000, 0x3802a000, 0x3802c000, 0x3802e000, 0x38030000, 0x38032000,\n0x38034000, 0x38036000, 0x38038000, 0x3803a000, 0x3803c000, 0x3803e000,\n0x38040000, 0x38042000, 0x38044000, 0x38046000, 0x38048000, 0x3804a000,\n0x3804c000, 0x3804e000, 0x38050000, 0x38052000, 0x38054000, 0x38056000,\n0x38058000, 0x3805a000, 0x3805c000, 0x3805e000, 0x38060000, 0x38062000,\n0x38064000, 0x38066000, 0x38068000, 0x3806a000, 0x3806c000, 0x3806e000,\n0x38070000, 0x38072000, 0x38074000, 0x38076000, 0x38078000, 0x3807a000,\n0x3807c000, 0x3807e000, 0x38080000, 0x38082000, 0x38084000, 0x38086000,\n0x38088000, 0x3808a000, 0x3808c000, 0x3808e000, 0x38090000, 0x38092000,\n0x38094000, 0x38096000, 0x38098000, 0x3809a000, 0x3809c000, 0x3809e000,\n0x380a0000, 0x380a2000, 0x380a4000, 0x380a6000, 0x380a8000, 0x380aa000,\n0x380ac000, 0x380ae000, 0x380b0000, 0x380b2000, 0x380b4000, 0x380b6000,\n0x380b8000, 0x380ba000, 0x380bc000, 0x380be000, 0x380c0000, 0x380c2000,\n0x380c4000, 0x380c6000, 0x380c8000, 0x380ca000, 0x380cc000, 0x380ce000,\n0x380d0000, 0x380d2000, 0x380d4000, 0x380d6000, 0x380d8000, 0x380da000,\n0x380dc000, 0x380de000, 0x380e0000, 0x380e2000, 0x380e4000, 0x380e6000,\n0x380e8000, 0x380ea000, 0x380ec000, 0x380ee000, 0x380f0000, 0x380f2000,\n0x380f4000, 0x380f6000, 0x380f8000, 0x380fa000, 0x380fc000, 0x380fe000,\n0x38100000, 0x38102000, 0x38104000, 0x38106000, 0x38108000, 0x3810a000,\n0x3810c000, 0x3810e000, 0x38110000, 0x38112000, 0x38114000, 0x38116000,\n0x38118000, 0x3811a000, 0x3811c000, 0x3811e000, 0x38120000, 0x38122000,\n0x38124000, 0x38126000, 0x38128000, 0x3812a000, 0x3812c000, 0x3812e000,\n0x38130000, 0x38132000, 0x38134000, 0x38136000, 0x38138000, 0x3813a000,\n0x3813c000, 0x3813e000, 0x38140000, 0x38142000, 0x38144000, 0x38146000,\n0x38148000, 0x3814a000, 0x3814c000, 0x3814e000, 0x38150000, 0x38152000,\n0x38154000, 0x38156000, 0x38158000, 0x3815a000, 0x3815c000, 0x3815e000,\n0x38160000, 0x38162000, 0x38164000, 0x38166000, 0x38168000, 0x3816a000,\n0x3816c000, 0x3816e000, 0x38170000, 0x38172000, 0x38174000, 0x38176000,\n0x38178000, 0x3817a000, 0x3817c000, 0x3817e000, 0x38180000, 0x38182000,\n0x38184000, 0x38186000, 0x38188000, 0x3818a000, 0x3818c000, 0x3818e000,\n0x38190000, 0x38192000, 0x38194000, 0x38196000, 0x38198000, 0x3819a000,\n0x3819c000, 0x3819e000, 0x381a0000, 0x381a2000, 0x381a4000, 0x381a6000,\n0x381a8000, 0x381aa000, 0x381ac000, 0x381ae000, 0x381b0000, 0x381b2000,\n0x381b4000, 0x381b6000, 0x381b8000, 0x381ba000, 0x381bc000, 0x381be000,\n0x381c0000, 0x381c2000, 0x381c4000, 0x381c6000, 0x381c8000, 0x381ca000,\n0x381cc000, 0x381ce000, 0x381d0000, 0x381d2000, 0x381d4000, 0x381d6000,\n0x381d8000, 0x381da000, 0x381dc000, 0x381de000, 0x381e0000, 0x381e2000,\n0x381e4000, 0x381e6000, 0x381e8000, 0x381ea000, 0x381ec000, 0x381ee000,\n0x381f0000, 0x381f2000, 0x381f4000, 0x381f6000, 0x381f8000, 0x381fa000,\n0x381fc000, 0x381fe000, 0x38200000, 0x38202000, 0x38204000, 0x38206000,\n0x38208000, 0x3820a000, 0x3820c000, 0x3820e000, 0x38210000, 0x38212000,\n0x38214000, 0x38216000, 0x38218000, 0x3821a000, 0x3821c000, 0x3821e000,\n0x38220000, 0x38222000, 0x38224000, 0x38226000, 0x38228000, 0x3822a000,\n0x3822c000, 0x3822e000, 0x38230000, 0x38232000, 0x38234000, 0x38236000,\n0x38238000, 0x3823a000, 0x3823c000, 0x3823e000, 0x38240000, 0x38242000,\n0x38244000, 0x38246000, 0x38248000, 0x3824a000, 0x3824c000, 0x3824e000,\n0x38250000, 0x38252000, 0x38254000, 0x38256000, 0x38258000, 0x3825a000,\n0x3825c000, 0x3825e000, 0x38260000, 0x38262000, 0x38264000, 0x38266000,\n0x38268000, 0x3826a000, 0x3826c000, 0x3826e000, 0x38270000, 0x38272000,\n0x38274000, 0x38276000, 0x38278000, 0x3827a000, 0x3827c000, 0x3827e000,\n0x38280000, 0x38282000, 0x38284000, 0x38286000, 0x38288000, 0x3828a000,\n0x3828c000, 0x3828e000, 0x38290000, 0x38292000, 0x38294000, 0x38296000,\n0x38298000, 0x3829a000, 0x3829c000, 0x3829e000, 0x382a0000, 0x382a2000,\n0x382a4000, 0x382a6000, 0x382a8000, 0x382aa000, 0x382ac000, 0x382ae000,\n0x382b0000, 0x382b2000, 0x382b4000, 0x382b6000, 0x382b8000, 0x382ba000,\n0x382bc000, 0x382be000, 0x382c0000, 0x382c2000, 0x382c4000, 0x382c6000,\n0x382c8000, 0x382ca000, 0x382cc000, 0x382ce000, 0x382d0000, 0x382d2000,\n0x382d4000, 0x382d6000, 0x382d8000, 0x382da000, 0x382dc000, 0x382de000,\n0x382e0000, 0x382e2000, 0x382e4000, 0x382e6000, 0x382e8000, 0x382ea000,\n0x382ec000, 0x382ee000, 0x382f0000, 0x382f2000, 0x382f4000, 0x382f6000,\n0x382f8000, 0x382fa000, 0x382fc000, 0x382fe000, 0x38300000, 0x38302000,\n0x38304000, 0x38306000, 0x38308000, 0x3830a000, 0x3830c000, 0x3830e000,\n0x38310000, 0x38312000, 0x38314000, 0x38316000, 0x38318000, 0x3831a000,\n0x3831c000, 0x3831e000, 0x38320000, 0x38322000, 0x38324000, 0x38326000,\n0x38328000, 0x3832a000, 0x3832c000, 0x3832e000, 0x38330000, 0x38332000,\n0x38334000, 0x38336000, 0x38338000, 0x3833a000, 0x3833c000, 0x3833e000,\n0x38340000, 0x38342000, 0x38344000, 0x38346000, 0x38348000, 0x3834a000,\n0x3834c000, 0x3834e000, 0x38350000, 0x38352000, 0x38354000, 0x38356000,\n0x38358000, 0x3835a000, 0x3835c000, 0x3835e000, 0x38360000, 0x38362000,\n0x38364000, 0x38366000, 0x38368000, 0x3836a000, 0x3836c000, 0x3836e000,\n0x38370000, 0x38372000, 0x38374000, 0x38376000, 0x38378000, 0x3837a000,\n0x3837c000, 0x3837e000, 0x38380000, 0x38382000, 0x38384000, 0x38386000,\n0x38388000, 0x3838a000, 0x3838c000, 0x3838e000, 0x38390000, 0x38392000,\n0x38394000, 0x38396000, 0x38398000, 0x3839a000, 0x3839c000, 0x3839e000,\n0x383a0000, 0x383a2000, 0x383a4000, 0x383a6000, 0x383a8000, 0x383aa000,\n0x383ac000, 0x383ae000, 0x383b0000, 0x383b2000, 0x383b4000, 0x383b6000,\n0x383b8000, 0x383ba000, 0x383bc000, 0x383be000, 0x383c0000, 0x383c2000,\n0x383c4000, 0x383c6000, 0x383c8000, 0x383ca000, 0x383cc000, 0x383ce000,\n0x383d0000, 0x383d2000, 0x383d4000, 0x383d6000, 0x383d8000, 0x383da000,\n0x383dc000, 0x383de000, 0x383e0000, 0x383e2000, 0x383e4000, 0x383e6000,\n0x383e8000, 0x383ea000, 0x383ec000, 0x383ee000, 0x383f0000, 0x383f2000,\n0x383f4000, 0x383f6000, 0x383f8000, 0x383fa000, 0x383fc000, 0x383fe000,\n0x38400000, 0x38402000, 0x38404000, 0x38406000, 0x38408000, 0x3840a000,\n0x3840c000, 0x3840e000, 0x38410000, 0x38412000, 0x38414000, 0x38416000,\n0x38418000, 0x3841a000, 0x3841c000, 0x3841e000, 0x38420000, 0x38422000,\n0x38424000, 0x38426000, 0x38428000, 0x3842a000, 0x3842c000, 0x3842e000,\n0x38430000, 0x38432000, 0x38434000, 0x38436000, 0x38438000, 0x3843a000,\n0x3843c000, 0x3843e000, 0x38440000, 0x38442000, 0x38444000, 0x38446000,\n0x38448000, 0x3844a000, 0x3844c000, 0x3844e000, 0x38450000, 0x38452000,\n0x38454000, 0x38456000, 0x38458000, 0x3845a000, 0x3845c000, 0x3845e000,\n0x38460000, 0x38462000, 0x38464000, 0x38466000, 0x38468000, 0x3846a000,\n0x3846c000, 0x3846e000, 0x38470000, 0x38472000, 0x38474000, 0x38476000,\n0x38478000, 0x3847a000, 0x3847c000, 0x3847e000, 0x38480000, 0x38482000,\n0x38484000, 0x38486000, 0x38488000, 0x3848a000, 0x3848c000, 0x3848e000,\n0x38490000, 0x38492000, 0x38494000, 0x38496000, 0x38498000, 0x3849a000,\n0x3849c000, 0x3849e000, 0x384a0000, 0x384a2000, 0x384a4000, 0x384a6000,\n0x384a8000, 0x384aa000, 0x384ac000, 0x384ae000, 0x384b0000, 0x384b2000,\n0x384b4000, 0x384b6000, 0x384b8000, 0x384ba000, 0x384bc000, 0x384be000,\n0x384c0000, 0x384c2000, 0x384c4000, 0x384c6000, 0x384c8000, 0x384ca000,\n0x384cc000, 0x384ce000, 0x384d0000, 0x384d2000, 0x384d4000, 0x384d6000,\n0x384d8000, 0x384da000, 0x384dc000, 0x384de000, 0x384e0000, 0x384e2000,\n0x384e4000, 0x384e6000, 0x384e8000, 0x384ea000, 0x384ec000, 0x384ee000,\n0x384f0000, 0x384f2000, 0x384f4000, 0x384f6000, 0x384f8000, 0x384fa000,\n0x384fc000, 0x384fe000, 0x38500000, 0x38502000, 0x38504000, 0x38506000,\n0x38508000, 0x3850a000, 0x3850c000, 0x3850e000, 0x38510000, 0x38512000,\n0x38514000, 0x38516000, 0x38518000, 0x3851a000, 0x3851c000, 0x3851e000,\n0x38520000, 0x38522000, 0x38524000, 0x38526000, 0x38528000, 0x3852a000,\n0x3852c000, 0x3852e000, 0x38530000, 0x38532000, 0x38534000, 0x38536000,\n0x38538000, 0x3853a000, 0x3853c000, 0x3853e000, 0x38540000, 0x38542000,\n0x38544000, 0x38546000, 0x38548000, 0x3854a000, 0x3854c000, 0x3854e000,\n0x38550000, 0x38552000, 0x38554000, 0x38556000, 0x38558000, 0x3855a000,\n0x3855c000, 0x3855e000, 0x38560000, 0x38562000, 0x38564000, 0x38566000,\n0x38568000, 0x3856a000, 0x3856c000, 0x3856e000, 0x38570000, 0x38572000,\n0x38574000, 0x38576000, 0x38578000, 0x3857a000, 0x3857c000, 0x3857e000,\n0x38580000, 0x38582000, 0x38584000, 0x38586000, 0x38588000, 0x3858a000,\n0x3858c000, 0x3858e000, 0x38590000, 0x38592000, 0x38594000, 0x38596000,\n0x38598000, 0x3859a000, 0x3859c000, 0x3859e000, 0x385a0000, 0x385a2000,\n0x385a4000, 0x385a6000, 0x385a8000, 0x385aa000, 0x385ac000, 0x385ae000,\n0x385b0000, 0x385b2000, 0x385b4000, 0x385b6000, 0x385b8000, 0x385ba000,\n0x385bc000, 0x385be000, 0x385c0000, 0x385c2000, 0x385c4000, 0x385c6000,\n0x385c8000, 0x385ca000, 0x385cc000, 0x385ce000, 0x385d0000, 0x385d2000,\n0x385d4000, 0x385d6000, 0x385d8000, 0x385da000, 0x385dc000, 0x385de000,\n0x385e0000, 0x385e2000, 0x385e4000, 0x385e6000, 0x385e8000, 0x385ea000,\n0x385ec000, 0x385ee000, 0x385f0000, 0x385f2000, 0x385f4000, 0x385f6000,\n0x385f8000, 0x385fa000, 0x385fc000, 0x385fe000, 0x38600000, 0x38602000,\n0x38604000, 0x38606000, 0x38608000, 0x3860a000, 0x3860c000, 0x3860e000,\n0x38610000, 0x38612000, 0x38614000, 0x38616000, 0x38618000, 0x3861a000,\n0x3861c000, 0x3861e000, 0x38620000, 0x38622000, 0x38624000, 0x38626000,\n0x38628000, 0x3862a000, 0x3862c000, 0x3862e000, 0x38630000, 0x38632000,\n0x38634000, 0x38636000, 0x38638000, 0x3863a000, 0x3863c000, 0x3863e000,\n0x38640000, 0x38642000, 0x38644000, 0x38646000, 0x38648000, 0x3864a000,\n0x3864c000, 0x3864e000, 0x38650000, 0x38652000, 0x38654000, 0x38656000,\n0x38658000, 0x3865a000, 0x3865c000, 0x3865e000, 0x38660000, 0x38662000,\n0x38664000, 0x38666000, 0x38668000, 0x3866a000, 0x3866c000, 0x3866e000,\n0x38670000, 0x38672000, 0x38674000, 0x38676000, 0x38678000, 0x3867a000,\n0x3867c000, 0x3867e000, 0x38680000, 0x38682000, 0x38684000, 0x38686000,\n0x38688000, 0x3868a000, 0x3868c000, 0x3868e000, 0x38690000, 0x38692000,\n0x38694000, 0x38696000, 0x38698000, 0x3869a000, 0x3869c000, 0x3869e000,\n0x386a0000, 0x386a2000, 0x386a4000, 0x386a6000, 0x386a8000, 0x386aa000,\n0x386ac000, 0x386ae000, 0x386b0000, 0x386b2000, 0x386b4000, 0x386b6000,\n0x386b8000, 0x386ba000, 0x386bc000, 0x386be000, 0x386c0000, 0x386c2000,\n0x386c4000, 0x386c6000, 0x386c8000, 0x386ca000, 0x386cc000, 0x386ce000,\n0x386d0000, 0x386d2000, 0x386d4000, 0x386d6000, 0x386d8000, 0x386da000,\n0x386dc000, 0x386de000, 0x386e0000, 0x386e2000, 0x386e4000, 0x386e6000,\n0x386e8000, 0x386ea000, 0x386ec000, 0x386ee000, 0x386f0000, 0x386f2000,\n0x386f4000, 0x386f6000, 0x386f8000, 0x386fa000, 0x386fc000, 0x386fe000,\n0x38700000, 0x38702000, 0x38704000, 0x38706000, 0x38708000, 0x3870a000,\n0x3870c000, 0x3870e000, 0x38710000, 0x38712000, 0x38714000, 0x38716000,\n0x38718000, 0x3871a000, 0x3871c000, 0x3871e000, 0x38720000, 0x38722000,\n0x38724000, 0x38726000, 0x38728000, 0x3872a000, 0x3872c000, 0x3872e000,\n0x38730000, 0x38732000, 0x38734000, 0x38736000, 0x38738000, 0x3873a000,\n0x3873c000, 0x3873e000, 0x38740000, 0x38742000, 0x38744000, 0x38746000,\n0x38748000, 0x3874a000, 0x3874c000, 0x3874e000, 0x38750000, 0x38752000,\n0x38754000, 0x38756000, 0x38758000, 0x3875a000, 0x3875c000, 0x3875e000,\n0x38760000, 0x38762000, 0x38764000, 0x38766000, 0x38768000, 0x3876a000,\n0x3876c000, 0x3876e000, 0x38770000, 0x38772000, 0x38774000, 0x38776000,\n0x38778000, 0x3877a000, 0x3877c000, 0x3877e000, 0x38780000, 0x38782000,\n0x38784000, 0x38786000, 0x38788000, 0x3878a000, 0x3878c000, 0x3878e000,\n0x38790000, 0x38792000, 0x38794000, 0x38796000, 0x38798000, 0x3879a000,\n0x3879c000, 0x3879e000, 0x387a0000, 0x387a2000, 0x387a4000, 0x387a6000,\n0x387a8000, 0x387aa000, 0x387ac000, 0x387ae000, 0x387b0000, 0x387b2000,\n0x387b4000, 0x387b6000, 0x387b8000, 0x387ba000, 0x387bc000, 0x387be000,\n0x387c0000, 0x387c2000, 0x387c4000, 0x387c6000, 0x387c8000, 0x387ca000,\n0x387cc000, 0x387ce000, 0x387d0000, 0x387d2000, 0x387d4000, 0x387d6000,\n0x387d8000, 0x387da000, 0x387dc000, 0x387de000, 0x387e0000, 0x387e2000,\n0x387e4000, 0x387e6000, 0x387e8000, 0x387ea000, 0x387ec000, 0x387ee000,\n0x387f0000, 0x387f2000, 0x387f4000, 0x387f6000, 0x387f8000, 0x387fa000,\n0x387fc000, 0x387fe000\n};\n\nstatic cmsUInt16Number Offset[64] = {\n0x0000, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,\n0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,\n0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,\n0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,\n0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,\n0x0400, 0x0400, 0x0000, 0x0400, 0x0400, 0x0400,\n0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,\n0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,\n0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,\n0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,\n0x0400, 0x0400, 0x0400, 0x0400\n};\n\nstatic cmsUInt32Number Exponent[64] = {\n0x00000000, 0x00800000, 0x01000000, 0x01800000, 0x02000000, 0x02800000,\n0x03000000, 0x03800000, 0x04000000, 0x04800000, 0x05000000, 0x05800000,\n0x06000000, 0x06800000, 0x07000000, 0x07800000, 0x08000000, 0x08800000,\n0x09000000, 0x09800000, 0x0a000000, 0x0a800000, 0x0b000000, 0x0b800000,\n0x0c000000, 0x0c800000, 0x0d000000, 0x0d800000, 0x0e000000, 0x0e800000,\n0x0f000000, 0x47800000, 0x80000000, 0x80800000, 0x81000000, 0x81800000,\n0x82000000, 0x82800000, 0x83000000, 0x83800000, 0x84000000, 0x84800000,\n0x85000000, 0x85800000, 0x86000000, 0x86800000, 0x87000000, 0x87800000,\n0x88000000, 0x88800000, 0x89000000, 0x89800000, 0x8a000000, 0x8a800000,\n0x8b000000, 0x8b800000, 0x8c000000, 0x8c800000, 0x8d000000, 0x8d800000,\n0x8e000000, 0x8e800000, 0x8f000000, 0xc7800000\n};\n\nstatic cmsUInt16Number Base[512] = {\n0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040,\n0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x0c00, 0x1000, 0x1400, 0x1800, 0x1c00,\n0x2000, 0x2400, 0x2800, 0x2c00, 0x3000, 0x3400, 0x3800, 0x3c00, 0x4000, 0x4400,\n0x4800, 0x4c00, 0x5000, 0x5400, 0x5800, 0x5c00, 0x6000, 0x6400, 0x6800, 0x6c00,\n0x7000, 0x7400, 0x7800, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,\n0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,\n0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,\n0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,\n0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,\n0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,\n0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,\n0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,\n0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,\n0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,\n0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,\n0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x8000, 0x8000, 0x8000, 0x8000,\n0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,\n0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,\n0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,\n0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,\n0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,\n0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,\n0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,\n0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,\n0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,\n0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8001,\n0x8002, 0x8004, 0x8008, 0x8010, 0x8020, 0x8040, 0x8080, 0x8100, 0x8200, 0x8400,\n0x8800, 0x8c00, 0x9000, 0x9400, 0x9800, 0x9c00, 0xa000, 0xa400, 0xa800, 0xac00,\n0xb000, 0xb400, 0xb800, 0xbc00, 0xc000, 0xc400, 0xc800, 0xcc00, 0xd000, 0xd400,\n0xd800, 0xdc00, 0xe000, 0xe400, 0xe800, 0xec00, 0xf000, 0xf400, 0xf800, 0xfc00,\n0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,\n0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,\n0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,\n0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,\n0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,\n0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,\n0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,\n0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,\n0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,\n0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,\n0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,\n0xfc00, 0xfc00\n};\n\nstatic cmsUInt8Number  Shift[512] = {\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17,\n0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d,\n0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,\n0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0d, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13,\n0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,\n0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,\n0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,\n0x18, 0x18, 0x18, 0x18, 0x0d\n};\n\ncmsFloat32Number _cmsHalf2Float(cmsUInt16Number h)\n{\n    union {\n        cmsFloat32Number flt;\n        cmsUInt32Number  num;\n    } out;\n\n    int n = h >> 10;\n\n    out.num = Mantissa[  (h & 0x3ff) + Offset[ n ] ] + Exponent[ n ];\n    return out.flt;\n}\n\ncmsUInt16Number _cmsFloat2Half(cmsFloat32Number flt)\n{\n    union {\n        cmsFloat32Number flt;\n        cmsUInt32Number  num;\n    } in;\n\n    cmsUInt32Number n, j;\n\n    in.flt = flt;\n    n = in.num;\n    j = (n >> 23) & 0x1ff;\n\n    return (cmsUInt16Number) ((cmsUInt32Number) Base[ j ] + (( n & 0x007fffff) >> Shift[ j ]));\n}\n\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/src/cmsintrp.c",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2012 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n//\n\n#include \"lcms2_internal.h\"\n\n// This module incorporates several interpolation routines, for 1 to 8 channels on input and\n// up to 65535 channels on output. The user may change those by using the interpolation plug-in\n\n// Interpolation routines by default\nstatic cmsInterpFunction DefaultInterpolatorsFactory(cmsUInt32Number nInputChannels, cmsUInt32Number nOutputChannels, cmsUInt32Number dwFlags);\n\n// This is the default factory\n_cmsInterpPluginChunkType _cmsInterpPluginChunk = { NULL };\n\n// The interpolation plug-in memory chunk allocator/dup\nvoid _cmsAllocInterpPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src)\n{\n    void* from;\n\n    _cmsAssert(ctx != NULL);\n\n    if (src != NULL) {\n        from = src ->chunks[InterpPlugin];       \n    }\n    else { \n        static _cmsInterpPluginChunkType InterpPluginChunk = { NULL };\n\n        from = &InterpPluginChunk;\n    }\n\n    _cmsAssert(from != NULL);\n    ctx ->chunks[InterpPlugin] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsInterpPluginChunkType));\n}\n\n\n// Main plug-in entry\ncmsBool  _cmsRegisterInterpPlugin(cmsContext ContextID, cmsPluginBase* Data)\n{\n    cmsPluginInterpolation* Plugin = (cmsPluginInterpolation*) Data;\n    _cmsInterpPluginChunkType* ptr = (_cmsInterpPluginChunkType*) _cmsContextGetClientChunk(ContextID, InterpPlugin);\n\n    if (Data == NULL) {\n\n        ptr ->Interpolators = NULL;\n        return TRUE;\n    }\n\n    // Set replacement functions\n    ptr ->Interpolators = Plugin ->InterpolatorsFactory;\n    return TRUE;\n}\n\n\n// Set the interpolation method\ncmsBool _cmsSetInterpolationRoutine(cmsContext ContextID, cmsInterpParams* p)\n{      \n    _cmsInterpPluginChunkType* ptr = (_cmsInterpPluginChunkType*) _cmsContextGetClientChunk(ContextID, InterpPlugin);\n\n    p ->Interpolation.Lerp16 = NULL;\n\n   // Invoke factory, possibly in the Plug-in\n    if (ptr ->Interpolators != NULL)\n        p ->Interpolation = ptr->Interpolators(p -> nInputs, p ->nOutputs, p ->dwFlags);\n    \n    // If unsupported by the plug-in, go for the LittleCMS default.\n    // If happens only if an extern plug-in is being used\n    if (p ->Interpolation.Lerp16 == NULL)\n        p ->Interpolation = DefaultInterpolatorsFactory(p ->nInputs, p ->nOutputs, p ->dwFlags);\n\n    // Check for valid interpolator (we just check one member of the union)\n    if (p ->Interpolation.Lerp16 == NULL) {\n            return FALSE;\n    }\n\n    return TRUE;\n}\n\n\n// This function precalculates as many parameters as possible to speed up the interpolation.\ncmsInterpParams* _cmsComputeInterpParamsEx(cmsContext ContextID,\n                                           const cmsUInt32Number nSamples[],\n                                           int InputChan, int OutputChan,\n                                           const void *Table,\n                                           cmsUInt32Number dwFlags)\n{\n    cmsInterpParams* p;\n    int i;\n\n    // Check for maximum inputs\n    if (InputChan > MAX_INPUT_DIMENSIONS) {\n             cmsSignalError(ContextID, cmsERROR_RANGE, \"Too many input channels (%d channels, max=%d)\", InputChan, MAX_INPUT_DIMENSIONS);\n            return NULL;\n    }\n\n    // Creates an empty object\n    p = (cmsInterpParams*) _cmsMallocZero(ContextID, sizeof(cmsInterpParams));\n    if (p == NULL) return NULL;\n\n    // Keep original parameters\n    p -> dwFlags  = dwFlags;\n    p -> nInputs  = InputChan;\n    p -> nOutputs = OutputChan;\n    p ->Table     = Table;\n    p ->ContextID  = ContextID;\n\n    // Fill samples per input direction and domain (which is number of nodes minus one)\n    for (i=0; i < InputChan; i++) {\n\n        p -> nSamples[i] = nSamples[i];\n        p -> Domain[i]   = nSamples[i] - 1;\n    }\n\n    // Compute factors to apply to each component to index the grid array\n    p -> opta[0] = p -> nOutputs;\n    for (i=1; i < InputChan; i++)\n        p ->opta[i] = p ->opta[i-1] * nSamples[InputChan-i];\n\n\n    if (!_cmsSetInterpolationRoutine(ContextID, p)) {\n         cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, \"Unsupported interpolation (%d->%d channels)\", InputChan, OutputChan);\n        _cmsFree(ContextID, p);\n        return NULL;\n    }\n\n    // All seems ok\n    return p;\n}\n\n\n// This one is a wrapper on the anterior, but assuming all directions have same number of nodes\ncmsInterpParams* _cmsComputeInterpParams(cmsContext ContextID, int nSamples, int InputChan, int OutputChan, const void* Table, cmsUInt32Number dwFlags)\n{\n    int i;\n    cmsUInt32Number Samples[MAX_INPUT_DIMENSIONS];\n\n    // Fill the auxiliar array\n    for (i=0; i < MAX_INPUT_DIMENSIONS; i++)\n        Samples[i] = nSamples;\n\n    // Call the extended function\n    return _cmsComputeInterpParamsEx(ContextID, Samples, InputChan, OutputChan, Table, dwFlags);\n}\n\n\n// Free all associated memory\nvoid _cmsFreeInterpParams(cmsInterpParams* p)\n{\n    if (p != NULL) _cmsFree(p ->ContextID, p);\n}\n\n\n// Inline fixed point interpolation\ncmsINLINE cmsUInt16Number LinearInterp(cmsS15Fixed16Number a, cmsS15Fixed16Number l, cmsS15Fixed16Number h)\n{\n    cmsUInt32Number dif = (cmsUInt32Number) (h - l) * a + 0x8000;\n    dif = (dif >> 16) + l;\n    return (cmsUInt16Number) (dif);\n}\n\n\n//  Linear interpolation (Fixed-point optimized)\nstatic\nvoid LinLerp1D(register const cmsUInt16Number Value[],\n               register cmsUInt16Number Output[],\n               register const cmsInterpParams* p)\n{\n    cmsUInt16Number y1, y0;\n    int cell0, rest;\n    int val3;\n    const cmsUInt16Number* LutTable = (cmsUInt16Number*) p ->Table;\n\n    // if last value...\n    if (Value[0] == 0xffff) {\n\n        Output[0] = LutTable[p -> Domain[0]];\n        return;\n    }\n\n    val3 = p -> Domain[0] * Value[0];\n    val3 = _cmsToFixedDomain(val3);    // To fixed 15.16\n\n    cell0 = FIXED_TO_INT(val3);             // Cell is 16 MSB bits\n    rest  = FIXED_REST_TO_INT(val3);        // Rest is 16 LSB bits\n\n    y0 = LutTable[cell0];\n    y1 = LutTable[cell0+1];\n\n\n    Output[0] = LinearInterp(rest, y0, y1);\n}\n\n// To prevent out of bounds indexing\ncmsINLINE cmsFloat32Number fclamp(cmsFloat32Number v) \n{\n    return v < 0.0f ? 0.0f : (v > 1.0f ? 1.0f : v);\n}\n\n// Floating-point version of 1D interpolation\nstatic\nvoid LinLerp1Dfloat(const cmsFloat32Number Value[],\n                    cmsFloat32Number Output[],\n                    const cmsInterpParams* p)\n{\n       cmsFloat32Number y1, y0;\n       cmsFloat32Number val2, rest;\n       int cell0, cell1;\n       const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table;\n\n       val2 = fclamp(Value[0]);\n\n       // if last value...\n       if (val2 == 1.0) {\n           Output[0] = LutTable[p -> Domain[0]];\n           return;\n       }\n\n       val2 *= p -> Domain[0];\n\n       cell0 = (int) floor(val2);\n       cell1 = (int) ceil(val2);\n\n       // Rest is 16 LSB bits\n       rest = val2 - cell0;\n\n       y0 = LutTable[cell0] ;\n       y1 = LutTable[cell1] ;\n\n       Output[0] = y0 + (y1 - y0) * rest;\n}\n\n\n\n// Eval gray LUT having only one input channel\nstatic\nvoid Eval1Input(register const cmsUInt16Number Input[],\n                register cmsUInt16Number Output[],\n                register const cmsInterpParams* p16)\n{\n       cmsS15Fixed16Number fk;\n       cmsS15Fixed16Number k0, k1, rk, K0, K1;\n       int v;\n       cmsUInt32Number OutChan;\n       const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table;\n\n       v = Input[0] * p16 -> Domain[0];\n       fk = _cmsToFixedDomain(v);\n\n       k0 = FIXED_TO_INT(fk);\n       rk = (cmsUInt16Number) FIXED_REST_TO_INT(fk);\n\n       k1 = k0 + (Input[0] != 0xFFFFU ? 1 : 0);\n\n       K0 = p16 -> opta[0] * k0;\n       K1 = p16 -> opta[0] * k1;\n\n       for (OutChan=0; OutChan < p16->nOutputs; OutChan++) {\n\n           Output[OutChan] = LinearInterp(rk, LutTable[K0+OutChan], LutTable[K1+OutChan]);\n       }\n}\n\n\n\n// Eval gray LUT having only one input channel\nstatic\nvoid Eval1InputFloat(const cmsFloat32Number Value[],\n                     cmsFloat32Number Output[],\n                     const cmsInterpParams* p)\n{\n    cmsFloat32Number y1, y0;\n    cmsFloat32Number val2, rest;\n    int cell0, cell1;\n    cmsUInt32Number OutChan;\n    const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table;\n\n    val2 = fclamp(Value[0]);\n\n        // if last value...\n       if (val2 == 1.0) {\n           Output[0] = LutTable[p -> Domain[0]];\n           return;\n       }\n\n       val2 *= p -> Domain[0];\n\n       cell0 = (int) floor(val2);\n       cell1 = (int) ceil(val2);\n\n       // Rest is 16 LSB bits\n       rest = val2 - cell0;\n\n       cell0 *= p -> opta[0];\n       cell1 *= p -> opta[0];\n\n       for (OutChan=0; OutChan < p->nOutputs; OutChan++) {\n\n            y0 = LutTable[cell0 + OutChan] ;\n            y1 = LutTable[cell1 + OutChan] ;\n\n            Output[OutChan] = y0 + (y1 - y0) * rest;\n       }\n}\n\n// Bilinear interpolation (16 bits) - cmsFloat32Number version\nstatic\nvoid BilinearInterpFloat(const cmsFloat32Number Input[],\n                         cmsFloat32Number Output[],\n                         const cmsInterpParams* p)\n\n{\n#   define LERP(a,l,h)    (cmsFloat32Number) ((l)+(((h)-(l))*(a)))\n#   define DENS(i,j)      (LutTable[(i)+(j)+OutChan])\n\n    const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table;\n    cmsFloat32Number      px, py;\n    int        x0, y0,\n               X0, Y0, X1, Y1;\n    int        TotalOut, OutChan;\n    cmsFloat32Number      fx, fy,\n        d00, d01, d10, d11,\n        dx0, dx1,\n        dxy;\n\n    TotalOut   = p -> nOutputs;\n    px = fclamp(Input[0]) * p->Domain[0];\n    py = fclamp(Input[1]) * p->Domain[1];\n\n    x0 = (int) _cmsQuickFloor(px); fx = px - (cmsFloat32Number) x0;\n    y0 = (int) _cmsQuickFloor(py); fy = py - (cmsFloat32Number) y0;\n\n    X0 = p -> opta[1] * x0;\n    X1 = X0 + (Input[0] >= 1.0 ? 0 : p->opta[1]);\n\n    Y0 = p -> opta[0] * y0;\n    Y1 = Y0 + (Input[1] >= 1.0 ? 0 : p->opta[0]);\n\n    for (OutChan = 0; OutChan < TotalOut; OutChan++) {\n\n        d00 = DENS(X0, Y0);\n        d01 = DENS(X0, Y1);\n        d10 = DENS(X1, Y0);\n        d11 = DENS(X1, Y1);\n\n        dx0 = LERP(fx, d00, d10);\n        dx1 = LERP(fx, d01, d11);\n\n        dxy = LERP(fy, dx0, dx1);\n\n        Output[OutChan] = dxy;\n    }\n\n\n#   undef LERP\n#   undef DENS\n}\n\n// Bilinear interpolation (16 bits) - optimized version\nstatic\nvoid BilinearInterp16(register const cmsUInt16Number Input[],\n                      register cmsUInt16Number Output[],\n                      register const cmsInterpParams* p)\n\n{\n#define DENS(i,j) (LutTable[(i)+(j)+OutChan])\n#define LERP(a,l,h)     (cmsUInt16Number) (l + ROUND_FIXED_TO_INT(((h-l)*a)))\n\n           const cmsUInt16Number* LutTable = (cmsUInt16Number*) p ->Table;\n           int        OutChan, TotalOut;\n           cmsS15Fixed16Number    fx, fy;\n  register int        rx, ry;\n           int        x0, y0;\n  register int        X0, X1, Y0, Y1;\n           int        d00, d01, d10, d11,\n                      dx0, dx1,\n                      dxy;\n\n    TotalOut   = p -> nOutputs;\n\n    fx = _cmsToFixedDomain((int) Input[0] * p -> Domain[0]);\n    x0  = FIXED_TO_INT(fx);\n    rx  = FIXED_REST_TO_INT(fx);    // Rest in 0..1.0 domain\n\n\n    fy = _cmsToFixedDomain((int) Input[1] * p -> Domain[1]);\n    y0  = FIXED_TO_INT(fy);\n    ry  = FIXED_REST_TO_INT(fy);\n\n\n    X0 = p -> opta[1] * x0;\n    X1 = X0 + (Input[0] == 0xFFFFU ? 0 : p->opta[1]);\n\n    Y0 = p -> opta[0] * y0;\n    Y1 = Y0 + (Input[1] == 0xFFFFU ? 0 : p->opta[0]);\n\n    for (OutChan = 0; OutChan < TotalOut; OutChan++) {\n\n        d00 = DENS(X0, Y0);\n        d01 = DENS(X0, Y1);\n        d10 = DENS(X1, Y0);\n        d11 = DENS(X1, Y1);\n\n        dx0 = LERP(rx, d00, d10);\n        dx1 = LERP(rx, d01, d11);\n\n        dxy = LERP(ry, dx0, dx1);\n\n        Output[OutChan] = (cmsUInt16Number) dxy;\n    }\n\n\n#   undef LERP\n#   undef DENS\n}\n\n\n// Trilinear interpolation (16 bits) - cmsFloat32Number version\nstatic\nvoid TrilinearInterpFloat(const cmsFloat32Number Input[],\n                          cmsFloat32Number Output[],\n                          const cmsInterpParams* p)\n\n{\n#   define LERP(a,l,h)      (cmsFloat32Number) ((l)+(((h)-(l))*(a)))\n#   define DENS(i,j,k)      (LutTable[(i)+(j)+(k)+OutChan])\n\n    const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table;\n    cmsFloat32Number      px, py, pz;\n    int        x0, y0, z0,\n               X0, Y0, Z0, X1, Y1, Z1;\n    int        TotalOut, OutChan;\n    cmsFloat32Number      fx, fy, fz,\n        d000, d001, d010, d011,\n        d100, d101, d110, d111,\n        dx00, dx01, dx10, dx11,\n        dxy0, dxy1, dxyz;\n\n    TotalOut   = p -> nOutputs;\n\n    // We need some clipping here\n    px = fclamp(Input[0]) * p->Domain[0];\n    py = fclamp(Input[1]) * p->Domain[1];\n    pz = fclamp(Input[2]) * p->Domain[2];\n\n    x0 = (int) _cmsQuickFloor(px); fx = px - (cmsFloat32Number) x0;\n    y0 = (int) _cmsQuickFloor(py); fy = py - (cmsFloat32Number) y0;\n    z0 = (int) _cmsQuickFloor(pz); fz = pz - (cmsFloat32Number) z0;\n\n    X0 = p -> opta[2] * x0;\n    X1 = X0 + (Input[0] >= 1.0 ? 0 : p->opta[2]);\n\n    Y0 = p -> opta[1] * y0;\n    Y1 = Y0 + (Input[1] >= 1.0 ? 0 : p->opta[1]);\n\n    Z0 = p -> opta[0] * z0;\n    Z1 = Z0 + (Input[2] >= 1.0 ? 0 : p->opta[0]);\n\n    for (OutChan = 0; OutChan < TotalOut; OutChan++) {\n\n        d000 = DENS(X0, Y0, Z0);\n        d001 = DENS(X0, Y0, Z1);\n        d010 = DENS(X0, Y1, Z0);\n        d011 = DENS(X0, Y1, Z1);\n\n        d100 = DENS(X1, Y0, Z0);\n        d101 = DENS(X1, Y0, Z1);\n        d110 = DENS(X1, Y1, Z0);\n        d111 = DENS(X1, Y1, Z1);\n\n\n        dx00 = LERP(fx, d000, d100);\n        dx01 = LERP(fx, d001, d101);\n        dx10 = LERP(fx, d010, d110);\n        dx11 = LERP(fx, d011, d111);\n\n        dxy0 = LERP(fy, dx00, dx10);\n        dxy1 = LERP(fy, dx01, dx11);\n\n        dxyz = LERP(fz, dxy0, dxy1);\n\n        Output[OutChan] = dxyz;\n    }\n\n\n#   undef LERP\n#   undef DENS\n}\n\n// Trilinear interpolation (16 bits) - optimized version\nstatic\nvoid TrilinearInterp16(register const cmsUInt16Number Input[],\n                       register cmsUInt16Number Output[],\n                       register const cmsInterpParams* p)\n\n{\n#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan])\n#define LERP(a,l,h)     (cmsUInt16Number) (l + ROUND_FIXED_TO_INT(((h-l)*a)))\n\n           const cmsUInt16Number* LutTable = (cmsUInt16Number*) p ->Table;\n           int        OutChan, TotalOut;\n           cmsS15Fixed16Number    fx, fy, fz;\n  register int        rx, ry, rz;\n           int        x0, y0, z0;\n  register int        X0, X1, Y0, Y1, Z0, Z1;\n           int        d000, d001, d010, d011,\n                      d100, d101, d110, d111,\n                      dx00, dx01, dx10, dx11,\n                      dxy0, dxy1, dxyz;\n\n    TotalOut   = p -> nOutputs;\n\n    fx = _cmsToFixedDomain((int) Input[0] * p -> Domain[0]);\n    x0  = FIXED_TO_INT(fx);\n    rx  = FIXED_REST_TO_INT(fx);    // Rest in 0..1.0 domain\n\n\n    fy = _cmsToFixedDomain((int) Input[1] * p -> Domain[1]);\n    y0  = FIXED_TO_INT(fy);\n    ry  = FIXED_REST_TO_INT(fy);\n\n    fz = _cmsToFixedDomain((int) Input[2] * p -> Domain[2]);\n    z0 = FIXED_TO_INT(fz);\n    rz = FIXED_REST_TO_INT(fz);\n\n\n    X0 = p -> opta[2] * x0;\n    X1 = X0 + (Input[0] == 0xFFFFU ? 0 : p->opta[2]);\n\n    Y0 = p -> opta[1] * y0;\n    Y1 = Y0 + (Input[1] == 0xFFFFU ? 0 : p->opta[1]);\n\n    Z0 = p -> opta[0] * z0;\n    Z1 = Z0 + (Input[2] == 0xFFFFU ? 0 : p->opta[0]);\n\n    for (OutChan = 0; OutChan < TotalOut; OutChan++) {\n\n        d000 = DENS(X0, Y0, Z0);\n        d001 = DENS(X0, Y0, Z1);\n        d010 = DENS(X0, Y1, Z0);\n        d011 = DENS(X0, Y1, Z1);\n\n        d100 = DENS(X1, Y0, Z0);\n        d101 = DENS(X1, Y0, Z1);\n        d110 = DENS(X1, Y1, Z0);\n        d111 = DENS(X1, Y1, Z1);\n\n\n        dx00 = LERP(rx, d000, d100);\n        dx01 = LERP(rx, d001, d101);\n        dx10 = LERP(rx, d010, d110);\n        dx11 = LERP(rx, d011, d111);\n\n        dxy0 = LERP(ry, dx00, dx10);\n        dxy1 = LERP(ry, dx01, dx11);\n\n        dxyz = LERP(rz, dxy0, dxy1);\n\n        Output[OutChan] = (cmsUInt16Number) dxyz;\n    }\n\n\n#   undef LERP\n#   undef DENS\n}\n\n\n// Tetrahedral interpolation, using Sakamoto algorithm.\n#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan])\nstatic\nvoid TetrahedralInterpFloat(const cmsFloat32Number Input[],\n                            cmsFloat32Number Output[],\n                            const cmsInterpParams* p)\n{\n    const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table;\n    cmsFloat32Number     px, py, pz;\n    int        x0, y0, z0,\n               X0, Y0, Z0, X1, Y1, Z1;\n    cmsFloat32Number     rx, ry, rz;\n    cmsFloat32Number     c0, c1=0, c2=0, c3=0;\n    int                  OutChan, TotalOut;\n\n    TotalOut   = p -> nOutputs;\n\n    // We need some clipping here\n    px = fclamp(Input[0]) * p->Domain[0];\n    py = fclamp(Input[1]) * p->Domain[1];\n    pz = fclamp(Input[2]) * p->Domain[2];\n\n    x0 = (int) _cmsQuickFloor(px); rx = (px - (cmsFloat32Number) x0);\n    y0 = (int) _cmsQuickFloor(py); ry = (py - (cmsFloat32Number) y0);\n    z0 = (int) _cmsQuickFloor(pz); rz = (pz - (cmsFloat32Number) z0);\n\n\n    X0 = p -> opta[2] * x0;\n    X1 = X0 + (Input[0] >= 1.0 ? 0 : p->opta[2]);\n\n    Y0 = p -> opta[1] * y0;\n    Y1 = Y0 + (Input[1] >= 1.0 ? 0 : p->opta[1]);\n\n    Z0 = p -> opta[0] * z0;\n    Z1 = Z0 + (Input[2] >= 1.0 ? 0 : p->opta[0]);\n\n    for (OutChan=0; OutChan < TotalOut; OutChan++) {\n\n       // These are the 6 Tetrahedral\n\n        c0 = DENS(X0, Y0, Z0);\n\n        if (rx >= ry && ry >= rz) {\n\n            c1 = DENS(X1, Y0, Z0) - c0;\n            c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0);\n            c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);\n\n        }\n        else\n            if (rx >= rz && rz >= ry) {\n\n                c1 = DENS(X1, Y0, Z0) - c0;\n                c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);\n                c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0);\n\n            }\n            else\n                if (rz >= rx && rx >= ry) {\n\n                    c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1);\n                    c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);\n                    c3 = DENS(X0, Y0, Z1) - c0;\n\n                }\n                else\n                    if (ry >= rx && rx >= rz) {\n\n                        c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0);\n                        c2 = DENS(X0, Y1, Z0) - c0;\n                        c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);\n\n                    }\n                    else\n                        if (ry >= rz && rz >= rx) {\n\n                            c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);\n                            c2 = DENS(X0, Y1, Z0) - c0;\n                            c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0);\n\n                        }\n                        else\n                            if (rz >= ry && ry >= rx) {\n\n                                c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);\n                                c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1);\n                                c3 = DENS(X0, Y0, Z1) - c0;\n\n                            }\n                            else  {\n                                c1 = c2 = c3 = 0;\n                            }\n\n       Output[OutChan] = c0 + c1 * rx + c2 * ry + c3 * rz;\n       }\n\n}\n\n#undef DENS\n\n\n\n\nstatic\nvoid TetrahedralInterp16(register const cmsUInt16Number Input[],\n                         register cmsUInt16Number Output[],\n                         register const cmsInterpParams* p)\n{\n    const cmsUInt16Number* LutTable = (cmsUInt16Number*) p -> Table;\n    cmsS15Fixed16Number fx, fy, fz;\n    cmsS15Fixed16Number rx, ry, rz;\n    int x0, y0, z0;\n    cmsS15Fixed16Number c0, c1, c2, c3, Rest;\n    cmsS15Fixed16Number X0, X1, Y0, Y1, Z0, Z1;\n    cmsUInt32Number TotalOut = p -> nOutputs;\n\n    fx = _cmsToFixedDomain((int) Input[0] * p -> Domain[0]);\n    fy = _cmsToFixedDomain((int) Input[1] * p -> Domain[1]);\n    fz = _cmsToFixedDomain((int) Input[2] * p -> Domain[2]);\n\n    x0 = FIXED_TO_INT(fx);\n    y0 = FIXED_TO_INT(fy);\n    z0 = FIXED_TO_INT(fz);\n\n    rx = FIXED_REST_TO_INT(fx);\n    ry = FIXED_REST_TO_INT(fy);\n    rz = FIXED_REST_TO_INT(fz);\n\n    X0 = p -> opta[2] * x0;\n    X1 = (Input[0] == 0xFFFFU ? 0 : p->opta[2]);\n\n    Y0 = p -> opta[1] * y0;\n    Y1 = (Input[1] == 0xFFFFU ? 0 : p->opta[1]);\n\n    Z0 = p -> opta[0] * z0;\n    Z1 = (Input[2] == 0xFFFFU ? 0 : p->opta[0]);\n\n    LutTable = &LutTable[X0+Y0+Z0];\n\n    // Output should be computed as x = ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest))\n    // which expands as: x = (Rest + ((Rest+0x7fff)/0xFFFF) + 0x8000)>>16\n    // This can be replaced by: t = Rest+0x8001, x = (t + (t>>16))>>16\n    // at the cost of being off by one at 7fff and 17ffe.\n\n    if (rx >= ry) {\n        if (ry >= rz) {\n            Y1 += X1;\n            Z1 += Y1;\n            for (; TotalOut; TotalOut--) {\n                c1 = LutTable[X1];\n                c2 = LutTable[Y1];\n                c3 = LutTable[Z1];\n                c0 = *LutTable++;\n                c3 -= c2;\n                c2 -= c1;\n                c1 -= c0;\n                Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001;\n                *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16);\n            }\n        } else if (rz >= rx) {\n            X1 += Z1;\n            Y1 += X1;\n            for (; TotalOut; TotalOut--) {\n                c1 = LutTable[X1];\n                c2 = LutTable[Y1];\n                c3 = LutTable[Z1];\n                c0 = *LutTable++;\n                c2 -= c1;\n                c1 -= c3;\n                c3 -= c0;\n                Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001;\n                *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16);\n            }\n        } else {\n            Z1 += X1;\n            Y1 += Z1;\n            for (; TotalOut; TotalOut--) {\n                c1 = LutTable[X1];\n                c2 = LutTable[Y1];\n                c3 = LutTable[Z1];\n                c0 = *LutTable++;\n                c2 -= c3;\n                c3 -= c1;\n                c1 -= c0;\n                Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001;\n                *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16);\n            }\n        }\n    } else {\n        if (rx >= rz) {\n            X1 += Y1;\n            Z1 += X1;\n            for (; TotalOut; TotalOut--) {\n                c1 = LutTable[X1];\n                c2 = LutTable[Y1];\n                c3 = LutTable[Z1];\n                c0 = *LutTable++;\n                c3 -= c1;\n                c1 -= c2;\n                c2 -= c0;\n                Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001;\n                *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16);\n            }\n        } else if (ry >= rz) {\n            Z1 += Y1;\n            X1 += Z1;\n            for (; TotalOut; TotalOut--) {\n                c1 = LutTable[X1];\n                c2 = LutTable[Y1];\n                c3 = LutTable[Z1];\n                c0 = *LutTable++;\n                c1 -= c3;\n                c3 -= c2;\n                c2 -= c0;\n                Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001;\n                *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16);\n            }\n        } else {\n            Y1 += Z1;\n            X1 += Y1;\n            for (; TotalOut; TotalOut--) {\n                c1 = LutTable[X1];\n                c2 = LutTable[Y1];\n                c3 = LutTable[Z1];\n                c0 = *LutTable++;\n                c1 -= c2;\n                c2 -= c3;\n                c3 -= c0;\n                Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001;\n                *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16);\n            }\n        }\n    }\n}\n\n\n#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan])\nstatic\nvoid Eval4Inputs(register const cmsUInt16Number Input[],\n                     register cmsUInt16Number Output[],\n                     register const cmsInterpParams* p16)\n{\n    const cmsUInt16Number* LutTable;\n    cmsS15Fixed16Number fk;\n    cmsS15Fixed16Number k0, rk;\n    int K0, K1;\n    cmsS15Fixed16Number    fx, fy, fz;\n    cmsS15Fixed16Number    rx, ry, rz;\n    int                    x0, y0, z0;\n    cmsS15Fixed16Number    X0, X1, Y0, Y1, Z0, Z1;\n    cmsUInt32Number i;\n    cmsS15Fixed16Number    c0, c1, c2, c3, Rest;\n    cmsUInt32Number        OutChan;\n    cmsUInt16Number        Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];\n\n\n    fk  = _cmsToFixedDomain((int) Input[0] * p16 -> Domain[0]);\n    fx  = _cmsToFixedDomain((int) Input[1] * p16 -> Domain[1]);\n    fy  = _cmsToFixedDomain((int) Input[2] * p16 -> Domain[2]);\n    fz  = _cmsToFixedDomain((int) Input[3] * p16 -> Domain[3]);\n\n    k0  = FIXED_TO_INT(fk);\n    x0  = FIXED_TO_INT(fx);\n    y0  = FIXED_TO_INT(fy);\n    z0  = FIXED_TO_INT(fz);\n\n    rk  = FIXED_REST_TO_INT(fk);\n    rx  = FIXED_REST_TO_INT(fx);\n    ry  = FIXED_REST_TO_INT(fy);\n    rz  = FIXED_REST_TO_INT(fz);\n\n    K0 = p16 -> opta[3] * k0;\n    K1 = K0 + (Input[0] == 0xFFFFU ? 0 : p16->opta[3]);\n\n    X0 = p16 -> opta[2] * x0;\n    X1 = X0 + (Input[1] == 0xFFFFU ? 0 : p16->opta[2]);\n\n    Y0 = p16 -> opta[1] * y0;\n    Y1 = Y0 + (Input[2] == 0xFFFFU ? 0 : p16->opta[1]);\n\n    Z0 = p16 -> opta[0] * z0;\n    Z1 = Z0 + (Input[3] == 0xFFFFU ? 0 : p16->opta[0]);\n\n    LutTable = (cmsUInt16Number*) p16 -> Table;\n    LutTable += K0;\n\n    for (OutChan=0; OutChan < p16 -> nOutputs; OutChan++) {\n\n        c0 = DENS(X0, Y0, Z0);\n\n        if (rx >= ry && ry >= rz) {\n\n            c1 = DENS(X1, Y0, Z0) - c0;\n            c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0);\n            c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);\n\n        }\n        else\n            if (rx >= rz && rz >= ry) {\n\n                c1 = DENS(X1, Y0, Z0) - c0;\n                c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);\n                c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0);\n\n            }\n            else\n                if (rz >= rx && rx >= ry) {\n\n                    c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1);\n                    c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);\n                    c3 = DENS(X0, Y0, Z1) - c0;\n\n                }\n                else\n                    if (ry >= rx && rx >= rz) {\n\n                        c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0);\n                        c2 = DENS(X0, Y1, Z0) - c0;\n                        c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);\n\n                    }\n                    else\n                        if (ry >= rz && rz >= rx) {\n\n                            c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);\n                            c2 = DENS(X0, Y1, Z0) - c0;\n                            c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0);\n\n                        }\n                        else\n                            if (rz >= ry && ry >= rx) {\n\n                                c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);\n                                c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1);\n                                c3 = DENS(X0, Y0, Z1) - c0;\n\n                            }\n                            else  {\n                                c1 = c2 = c3 = 0;\n                            }\n\n                            Rest = c1 * rx + c2 * ry + c3 * rz;\n\n                            Tmp1[OutChan] = (cmsUInt16Number) c0 + ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest));\n    }\n\n\n    LutTable = (cmsUInt16Number*) p16 -> Table;\n    LutTable += K1;\n\n    for (OutChan=0; OutChan < p16 -> nOutputs; OutChan++) {\n\n        c0 = DENS(X0, Y0, Z0);\n\n        if (rx >= ry && ry >= rz) {\n\n            c1 = DENS(X1, Y0, Z0) - c0;\n            c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0);\n            c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);\n\n        }\n        else\n            if (rx >= rz && rz >= ry) {\n\n                c1 = DENS(X1, Y0, Z0) - c0;\n                c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);\n                c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0);\n\n            }\n            else\n                if (rz >= rx && rx >= ry) {\n\n                    c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1);\n                    c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);\n                    c3 = DENS(X0, Y0, Z1) - c0;\n\n                }\n                else\n                    if (ry >= rx && rx >= rz) {\n\n                        c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0);\n                        c2 = DENS(X0, Y1, Z0) - c0;\n                        c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);\n\n                    }\n                    else\n                        if (ry >= rz && rz >= rx) {\n\n                            c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);\n                            c2 = DENS(X0, Y1, Z0) - c0;\n                            c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0);\n\n                        }\n                        else\n                            if (rz >= ry && ry >= rx) {\n\n                                c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);\n                                c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1);\n                                c3 = DENS(X0, Y0, Z1) - c0;\n\n                            }\n                            else  {\n                                c1 = c2 = c3 = 0;\n                            }\n\n                            Rest = c1 * rx + c2 * ry + c3 * rz;\n\n                            Tmp2[OutChan] = (cmsUInt16Number) c0 + ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest));\n    }\n\n\n\n    for (i=0; i < p16 -> nOutputs; i++) {\n        Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]);\n    }\n}\n#undef DENS\n\n\n// For more that 3 inputs (i.e., CMYK)\n// evaluate two 3-dimensional interpolations and then linearly interpolate between them.\n\n\nstatic\nvoid Eval4InputsFloat(const cmsFloat32Number Input[],\n                      cmsFloat32Number Output[],\n                      const cmsInterpParams* p)\n{\n       const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table;\n       cmsFloat32Number rest;\n       cmsFloat32Number pk;\n       int k0, K0, K1;\n       const cmsFloat32Number* T;\n       cmsUInt32Number i;\n       cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];\n       cmsInterpParams p1;\n\n       pk = fclamp(Input[0]) * p->Domain[0];\n       k0 = _cmsQuickFloor(pk);\n       rest = pk - (cmsFloat32Number) k0;\n\n       K0 = p -> opta[3] * k0;\n       K1 = K0 + (Input[0] >= 1.0 ? 0 : p->opta[3]);\n\n       p1 = *p;\n       memmove(&p1.Domain[0], &p ->Domain[1], 3*sizeof(cmsUInt32Number));\n\n       T = LutTable + K0;\n       p1.Table = T;\n\n       TetrahedralInterpFloat(Input + 1,  Tmp1, &p1);\n\n       T = LutTable + K1;\n       p1.Table = T;\n       TetrahedralInterpFloat(Input + 1,  Tmp2, &p1);\n\n       for (i=0; i < p -> nOutputs; i++)\n       {\n              cmsFloat32Number y0 = Tmp1[i];\n              cmsFloat32Number y1 = Tmp2[i];\n\n              Output[i] = y0 + (y1 - y0) * rest;\n       }\n}\n\n\nstatic\nvoid Eval5Inputs(register const cmsUInt16Number Input[],\n                 register cmsUInt16Number Output[],\n\n                 register const cmsInterpParams* p16)\n{\n       const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table;\n       cmsS15Fixed16Number fk;\n       cmsS15Fixed16Number k0, rk;\n       int K0, K1;\n       const cmsUInt16Number* T;\n       cmsUInt32Number i;\n       cmsUInt16Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];\n       cmsInterpParams p1;\n\n\n       fk = _cmsToFixedDomain((cmsS15Fixed16Number) Input[0] * p16 -> Domain[0]);\n       k0 = FIXED_TO_INT(fk);\n       rk = FIXED_REST_TO_INT(fk);\n\n       K0 = p16 -> opta[4] * k0;\n       K1 = p16 -> opta[4] * (k0 + (Input[0] != 0xFFFFU ? 1 : 0));\n\n       p1 = *p16;\n       memmove(&p1.Domain[0], &p16 ->Domain[1], 4*sizeof(cmsUInt32Number));\n\n       T = LutTable + K0;\n       p1.Table = T;\n\n       Eval4Inputs(Input + 1, Tmp1, &p1);\n\n       T = LutTable + K1;\n       p1.Table = T;\n\n       Eval4Inputs(Input + 1, Tmp2, &p1);\n\n       for (i=0; i < p16 -> nOutputs; i++) {\n\n              Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]);\n       }\n\n}\n\n\nstatic\nvoid Eval5InputsFloat(const cmsFloat32Number Input[],\n                      cmsFloat32Number Output[],\n                      const cmsInterpParams* p)\n{\n       const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table;\n       cmsFloat32Number rest;\n       cmsFloat32Number pk;\n       int k0, K0, K1;\n       const cmsFloat32Number* T;\n       cmsUInt32Number i;\n       cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];\n       cmsInterpParams p1;\n\n       pk = fclamp(Input[0]) * p->Domain[0];\n       k0 = _cmsQuickFloor(pk);\n       rest = pk - (cmsFloat32Number) k0;\n\n       K0 = p -> opta[4] * k0;\n       K1 = K0 + (Input[0] >= 1.0 ? 0 : p->opta[4]);\n\n       p1 = *p;\n       memmove(&p1.Domain[0], &p ->Domain[1], 4*sizeof(cmsUInt32Number));\n\n       T = LutTable + K0;\n       p1.Table = T;\n\n       Eval4InputsFloat(Input + 1,  Tmp1, &p1);\n\n       T = LutTable + K1;\n       p1.Table = T;\n\n       Eval4InputsFloat(Input + 1,  Tmp2, &p1);\n\n       for (i=0; i < p -> nOutputs; i++) {\n\n              cmsFloat32Number y0 = Tmp1[i];\n              cmsFloat32Number y1 = Tmp2[i];\n\n              Output[i] = y0 + (y1 - y0) * rest;\n       }\n}\n\n\n\nstatic\nvoid Eval6Inputs(register const cmsUInt16Number Input[],\n                 register cmsUInt16Number Output[],\n                 register const cmsInterpParams* p16)\n{\n       const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table;\n       cmsS15Fixed16Number fk;\n       cmsS15Fixed16Number k0, rk;\n       int K0, K1;\n       const cmsUInt16Number* T;\n       cmsUInt32Number i;\n       cmsUInt16Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];\n       cmsInterpParams p1;\n\n       fk = _cmsToFixedDomain((cmsS15Fixed16Number) Input[0] * p16 -> Domain[0]);\n       k0 = FIXED_TO_INT(fk);\n       rk = FIXED_REST_TO_INT(fk);\n\n       K0 = p16 -> opta[5] * k0;\n       K1 = p16 -> opta[5] * (k0 + (Input[0] != 0xFFFFU ? 1 : 0));\n\n       p1 = *p16;\n       memmove(&p1.Domain[0], &p16 ->Domain[1], 5*sizeof(cmsUInt32Number));\n\n       T = LutTable + K0;\n       p1.Table = T;\n\n       Eval5Inputs(Input + 1, Tmp1, &p1);\n\n       T = LutTable + K1;\n       p1.Table = T;\n\n       Eval5Inputs(Input + 1, Tmp2, &p1);\n\n       for (i=0; i < p16 -> nOutputs; i++) {\n\n              Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]);\n       }\n\n}\n\n\nstatic\nvoid Eval6InputsFloat(const cmsFloat32Number Input[],\n                      cmsFloat32Number Output[],\n                      const cmsInterpParams* p)\n{\n       const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table;\n       cmsFloat32Number rest;\n       cmsFloat32Number pk;\n       int k0, K0, K1;\n       const cmsFloat32Number* T;\n       cmsUInt32Number i;\n       cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];\n       cmsInterpParams p1;\n\n       pk = fclamp(Input[0]) * p->Domain[0];\n       k0 = _cmsQuickFloor(pk);\n       rest = pk - (cmsFloat32Number) k0;\n\n       K0 = p -> opta[5] * k0;\n       K1 = K0 + (Input[0] >= 1.0 ? 0 : p->opta[5]);\n\n       p1 = *p;\n       memmove(&p1.Domain[0], &p ->Domain[1], 5*sizeof(cmsUInt32Number));\n\n       T = LutTable + K0;\n       p1.Table = T;\n\n       Eval5InputsFloat(Input + 1,  Tmp1, &p1);\n\n       T = LutTable + K1;\n       p1.Table = T;\n\n       Eval5InputsFloat(Input + 1,  Tmp2, &p1);\n\n       for (i=0; i < p -> nOutputs; i++) {\n\n              cmsFloat32Number y0 = Tmp1[i];\n              cmsFloat32Number y1 = Tmp2[i];\n\n              Output[i] = y0 + (y1 - y0) * rest;\n       }\n}\n\n\nstatic\nvoid Eval7Inputs(register const cmsUInt16Number Input[],\n                 register cmsUInt16Number Output[],\n                 register const cmsInterpParams* p16)\n{\n       const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table;\n       cmsS15Fixed16Number fk;\n       cmsS15Fixed16Number k0, rk;\n       int K0, K1;\n       const cmsUInt16Number* T;\n       cmsUInt32Number i;\n       cmsUInt16Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];\n       cmsInterpParams p1;\n\n\n       fk = _cmsToFixedDomain((cmsS15Fixed16Number) Input[0] * p16 -> Domain[0]);\n       k0 = FIXED_TO_INT(fk);\n       rk = FIXED_REST_TO_INT(fk);\n\n       K0 = p16 -> opta[6] * k0;\n       K1 = p16 -> opta[6] * (k0 + (Input[0] != 0xFFFFU ? 1 : 0));\n\n       p1 = *p16;\n       memmove(&p1.Domain[0], &p16 ->Domain[1], 6*sizeof(cmsUInt32Number));\n\n       T = LutTable + K0;\n       p1.Table = T;\n\n       Eval6Inputs(Input + 1, Tmp1, &p1);\n\n       T = LutTable + K1;\n       p1.Table = T;\n\n       Eval6Inputs(Input + 1, Tmp2, &p1);\n\n       for (i=0; i < p16 -> nOutputs; i++) {\n              Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]);\n       }\n}\n\n\nstatic\nvoid Eval7InputsFloat(const cmsFloat32Number Input[],\n                      cmsFloat32Number Output[],\n                      const cmsInterpParams* p)\n{\n       const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table;\n       cmsFloat32Number rest;\n       cmsFloat32Number pk;\n       int k0, K0, K1;\n       const cmsFloat32Number* T;\n       cmsUInt32Number i;\n       cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];\n       cmsInterpParams p1;\n\n       pk = fclamp(Input[0]) * p->Domain[0];\n       k0 = _cmsQuickFloor(pk);\n       rest = pk - (cmsFloat32Number) k0;\n\n       K0 = p -> opta[6] * k0;\n       K1 = K0 + (Input[0] >= 1.0 ? 0 : p->opta[6]);\n\n       p1 = *p;\n       memmove(&p1.Domain[0], &p ->Domain[1], 6*sizeof(cmsUInt32Number));\n\n       T = LutTable + K0;\n       p1.Table = T;\n\n       Eval6InputsFloat(Input + 1,  Tmp1, &p1);\n\n       T = LutTable + K1;\n       p1.Table = T;\n\n       Eval6InputsFloat(Input + 1,  Tmp2, &p1);\n\n\n       for (i=0; i < p -> nOutputs; i++) {\n\n              cmsFloat32Number y0 = Tmp1[i];\n              cmsFloat32Number y1 = Tmp2[i];\n\n              Output[i] = y0 + (y1 - y0) * rest;\n\n       }\n}\n\nstatic\nvoid Eval8Inputs(register const cmsUInt16Number Input[],\n                 register cmsUInt16Number Output[],\n                 register const cmsInterpParams* p16)\n{\n       const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table;\n       cmsS15Fixed16Number fk;\n       cmsS15Fixed16Number k0, rk;\n       int K0, K1;\n       const cmsUInt16Number* T;\n       cmsUInt32Number i;\n       cmsUInt16Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];\n       cmsInterpParams p1;\n\n       fk = _cmsToFixedDomain((cmsS15Fixed16Number) Input[0] * p16 -> Domain[0]);\n       k0 = FIXED_TO_INT(fk);\n       rk = FIXED_REST_TO_INT(fk);\n\n       K0 = p16 -> opta[7] * k0;\n       K1 = p16 -> opta[7] * (k0 + (Input[0] != 0xFFFFU ? 1 : 0));\n\n       p1 = *p16;\n       memmove(&p1.Domain[0], &p16 ->Domain[1], 7*sizeof(cmsUInt32Number));\n\n       T = LutTable + K0;\n       p1.Table = T;\n\n       Eval7Inputs(Input + 1, Tmp1, &p1);\n\n       T = LutTable + K1;\n       p1.Table = T;\n       Eval7Inputs(Input + 1, Tmp2, &p1);\n\n       for (i=0; i < p16 -> nOutputs; i++) {\n              Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]);\n       }\n}\n\n\n\nstatic\nvoid Eval8InputsFloat(const cmsFloat32Number Input[],\n                      cmsFloat32Number Output[],\n                      const cmsInterpParams* p)\n{\n       const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table;\n       cmsFloat32Number rest;\n       cmsFloat32Number pk;\n       int k0, K0, K1;\n       const cmsFloat32Number* T;\n       cmsUInt32Number i;\n       cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];\n       cmsInterpParams p1;\n\n       pk = fclamp(Input[0]) * p->Domain[0];\n       k0 = _cmsQuickFloor(pk);\n       rest = pk - (cmsFloat32Number) k0;\n\n       K0 = p -> opta[7] * k0;\n       K1 = K0 + (Input[0] >= 1.0 ? 0 : p->opta[7]);\n\n       p1 = *p;\n       memmove(&p1.Domain[0], &p ->Domain[1], 7*sizeof(cmsUInt32Number));\n\n       T = LutTable + K0;\n       p1.Table = T;\n\n       Eval7InputsFloat(Input + 1,  Tmp1, &p1);\n\n       T = LutTable + K1;\n       p1.Table = T;\n\n       Eval7InputsFloat(Input + 1,  Tmp2, &p1);\n\n\n       for (i=0; i < p -> nOutputs; i++) {\n\n              cmsFloat32Number y0 = Tmp1[i];\n              cmsFloat32Number y1 = Tmp2[i];\n\n              Output[i] = y0 + (y1 - y0) * rest;\n       }\n}\n\n// The default factory\nstatic\ncmsInterpFunction DefaultInterpolatorsFactory(cmsUInt32Number nInputChannels, cmsUInt32Number nOutputChannels, cmsUInt32Number dwFlags)\n{\n\n    cmsInterpFunction Interpolation;\n    cmsBool  IsFloat     = (dwFlags & CMS_LERP_FLAGS_FLOAT);\n    cmsBool  IsTrilinear = (dwFlags & CMS_LERP_FLAGS_TRILINEAR);\n\n    memset(&Interpolation, 0, sizeof(Interpolation));\n\n    // Safety check\n    if (nInputChannels >= 4 && nOutputChannels >= MAX_STAGE_CHANNELS)\n        return Interpolation;\n\n    switch (nInputChannels) {\n\n           case 1: // Gray LUT / linear\n\n               if (nOutputChannels == 1) {\n\n                   if (IsFloat)\n                       Interpolation.LerpFloat = LinLerp1Dfloat;\n                   else\n                       Interpolation.Lerp16 = LinLerp1D;\n\n               }\n               else {\n\n                   if (IsFloat)\n                       Interpolation.LerpFloat = Eval1InputFloat;\n                   else\n                       Interpolation.Lerp16 = Eval1Input;\n               }\n               break;\n\n           case 2: // Duotone\n               if (IsFloat)\n                      Interpolation.LerpFloat =  BilinearInterpFloat;\n               else\n                      Interpolation.Lerp16    =  BilinearInterp16;\n               break;\n\n           case 3:  // RGB et al\n\n               if (IsTrilinear) {\n\n                   if (IsFloat)\n                       Interpolation.LerpFloat = TrilinearInterpFloat;\n                   else\n                       Interpolation.Lerp16 = TrilinearInterp16;\n               }\n               else {\n\n                   if (IsFloat)\n                       Interpolation.LerpFloat = TetrahedralInterpFloat;\n                   else {\n\n                       Interpolation.Lerp16 = TetrahedralInterp16;\n                   }\n               }\n               break;\n\n           case 4:  // CMYK lut\n\n               if (IsFloat)\n                   Interpolation.LerpFloat =  Eval4InputsFloat;\n               else\n                   Interpolation.Lerp16    =  Eval4Inputs;\n               break;\n\n           case 5: // 5 Inks\n               if (IsFloat)\n                   Interpolation.LerpFloat =  Eval5InputsFloat;\n               else\n                   Interpolation.Lerp16    =  Eval5Inputs;\n               break;\n\n           case 6: // 6 Inks\n               if (IsFloat)\n                   Interpolation.LerpFloat =  Eval6InputsFloat;\n               else\n                   Interpolation.Lerp16    =  Eval6Inputs;\n               break;\n\n           case 7: // 7 inks\n               if (IsFloat)\n                   Interpolation.LerpFloat =  Eval7InputsFloat;\n               else\n                   Interpolation.Lerp16    =  Eval7Inputs;\n               break;\n\n           case 8: // 8 inks\n               if (IsFloat)\n                   Interpolation.LerpFloat =  Eval8InputsFloat;\n               else\n                   Interpolation.Lerp16    =  Eval8Inputs;\n               break;\n\n               break;\n\n           default:\n               Interpolation.Lerp16 = NULL;\n    }\n\n    return Interpolation;\n}\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/src/cmsio0.c",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2012 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n//\n#include \"lcms2_internal.h\"\n\n// Generic I/O, tag dictionary management, profile struct\n\n// IOhandlers are abstractions used by littleCMS to read from whatever file, stream,\n// memory block or any storage. Each IOhandler provides implementations for read,\n// write, seek and tell functions. LittleCMS code deals with IO across those objects.\n// In this way, is easier to add support for new storage media.\n\n// NULL stream, for taking care of used space -------------------------------------\n\n// NULL IOhandler basically does nothing but keep track on how many bytes have been\n// written. This is handy when creating profiles, where the file size is needed in the\n// header. Then, whole profile is serialized across NULL IOhandler and a second pass\n// writes the bytes to the pertinent IOhandler.\n\ntypedef struct {\n    cmsUInt32Number Pointer;         // Points to current location\n} FILENULL;\n\nstatic\ncmsUInt32Number NULLRead(cmsIOHANDLER* iohandler, void *Buffer, cmsUInt32Number size, cmsUInt32Number count)\n{\n    FILENULL* ResData = (FILENULL*) iohandler ->stream;\n\n    cmsUInt32Number len = size * count;\n    ResData -> Pointer += len;\n    return count;\n\n    cmsUNUSED_PARAMETER(Buffer);\n}\n\nstatic\ncmsBool  NULLSeek(cmsIOHANDLER* iohandler, cmsUInt32Number offset)\n{\n    FILENULL* ResData = (FILENULL*) iohandler ->stream;\n\n    ResData ->Pointer = offset;\n    return TRUE;\n}\n\nstatic\ncmsUInt32Number NULLTell(cmsIOHANDLER* iohandler)\n{\n    FILENULL* ResData = (FILENULL*) iohandler ->stream;\n    return ResData -> Pointer;\n}\n\nstatic\ncmsBool  NULLWrite(cmsIOHANDLER* iohandler, cmsUInt32Number size, const void *Ptr)\n{\n    FILENULL* ResData = (FILENULL*) iohandler ->stream;\n\n    ResData ->Pointer += size;\n    if (ResData ->Pointer > iohandler->UsedSpace)\n        iohandler->UsedSpace = ResData ->Pointer;\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(Ptr);\n}\n\nstatic\ncmsBool  NULLClose(cmsIOHANDLER* iohandler)\n{\n    FILENULL* ResData = (FILENULL*) iohandler ->stream;\n\n    _cmsFree(iohandler ->ContextID, ResData);\n    _cmsFree(iohandler ->ContextID, iohandler);\n    return TRUE;\n}\n\n// The NULL IOhandler creator\ncmsIOHANDLER*  CMSEXPORT cmsOpenIOhandlerFromNULL(cmsContext ContextID)\n{\n    struct _cms_io_handler* iohandler = NULL;\n    FILENULL* fm = NULL;\n\n    iohandler = (struct _cms_io_handler*) _cmsMallocZero(ContextID, sizeof(struct _cms_io_handler));\n    if (iohandler == NULL) return NULL;\n\n    fm = (FILENULL*) _cmsMallocZero(ContextID, sizeof(FILENULL));\n    if (fm == NULL) goto Error;\n\n    fm ->Pointer = 0;\n\n    iohandler ->ContextID = ContextID;\n    iohandler ->stream  = (void*) fm;\n    iohandler ->UsedSpace = 0;\n    iohandler ->ReportedSize = 0;\n    iohandler ->PhysicalFile[0] = 0;\n\n    iohandler ->Read    = NULLRead;\n    iohandler ->Seek    = NULLSeek;\n    iohandler ->Close   = NULLClose;\n    iohandler ->Tell    = NULLTell;\n    iohandler ->Write   = NULLWrite;\n\n    return iohandler;\n\nError:    \n    if (iohandler) _cmsFree(ContextID, iohandler);\n    return NULL;\n\n}\n\n\n// Memory-based stream --------------------------------------------------------------\n\n// Those functions implements an iohandler which takes a block of memory as storage medium.\n\ntypedef struct {\n    cmsUInt8Number* Block;    // Points to allocated memory\n    cmsUInt32Number Size;     // Size of allocated memory\n    cmsUInt32Number Pointer;  // Points to current location\n    int FreeBlockOnClose;     // As title\n\n} FILEMEM;\n\nstatic\ncmsUInt32Number MemoryRead(struct _cms_io_handler* iohandler, void *Buffer, cmsUInt32Number size, cmsUInt32Number count)\n{\n    FILEMEM* ResData = (FILEMEM*) iohandler ->stream;\n    cmsUInt8Number* Ptr;\n    cmsUInt32Number len = size * count;\n\n    if (ResData -> Pointer + len > ResData -> Size){\n\n        len = (ResData -> Size - ResData -> Pointer);\n        cmsSignalError(iohandler ->ContextID, cmsERROR_READ, \"Read from memory error. Got %d bytes, block should be of %d bytes\", len, count * size);\n        return 0;\n    }\n\n    Ptr  = ResData -> Block;\n    Ptr += ResData -> Pointer;\n    memmove(Buffer, Ptr, len);\n    ResData -> Pointer += len;\n\n    return count;\n}\n\n// SEEK_CUR is assumed\nstatic\ncmsBool  MemorySeek(struct _cms_io_handler* iohandler, cmsUInt32Number offset)\n{\n    FILEMEM* ResData = (FILEMEM*) iohandler ->stream;\n\n    if (offset > ResData ->Size) {\n        cmsSignalError(iohandler ->ContextID, cmsERROR_SEEK,  \"Too few data; probably corrupted profile\");\n        return FALSE;\n    }\n\n    ResData ->Pointer = offset;\n    return TRUE;\n}\n\n// Tell for memory\nstatic\ncmsUInt32Number MemoryTell(struct _cms_io_handler* iohandler)\n{\n    FILEMEM* ResData = (FILEMEM*) iohandler ->stream;\n\n    if (ResData == NULL) return 0;\n    return ResData -> Pointer;\n}\n\n\n// Writes data to memory, also keeps used space for further reference.\nstatic\ncmsBool MemoryWrite(struct _cms_io_handler* iohandler, cmsUInt32Number size, const void *Ptr)\n{\n    FILEMEM* ResData = (FILEMEM*) iohandler ->stream;\n\n    if (ResData == NULL) return FALSE; // Housekeeping\n\n    // Check for available space. Clip.\n    if (ResData->Pointer + size > ResData->Size) {\n        size = ResData ->Size - ResData->Pointer;\n    }\n      \n    if (size == 0) return TRUE;     // Write zero bytes is ok, but does nothing\n\n    memmove(ResData ->Block + ResData ->Pointer, Ptr, size);\n    ResData ->Pointer += size;\n\n    if (ResData ->Pointer > iohandler->UsedSpace)\n        iohandler->UsedSpace = ResData ->Pointer;\n\n    return TRUE;\n}\n\n\nstatic\ncmsBool  MemoryClose(struct _cms_io_handler* iohandler)\n{\n    FILEMEM* ResData = (FILEMEM*) iohandler ->stream;\n\n    if (ResData ->FreeBlockOnClose) {\n\n        if (ResData ->Block) _cmsFree(iohandler ->ContextID, ResData ->Block);\n    }\n\n    _cmsFree(iohandler ->ContextID, ResData);\n    _cmsFree(iohandler ->ContextID, iohandler);\n\n    return TRUE;\n}\n\n// Create a iohandler for memory block. AccessMode=='r' assumes the iohandler is going to read, and makes\n// a copy of the memory block for letting user to free the memory after invoking open profile. In write\n// mode (\"w\"), Buffere points to the begin of memory block to be written.\ncmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromMem(cmsContext ContextID, void *Buffer, cmsUInt32Number size, const char* AccessMode)\n{\n    cmsIOHANDLER* iohandler = NULL;\n    FILEMEM* fm = NULL;\n\n    _cmsAssert(AccessMode != NULL);\n\n    iohandler = (cmsIOHANDLER*) _cmsMallocZero(ContextID, sizeof(cmsIOHANDLER));\n    if (iohandler == NULL) return NULL;\n\n    switch (*AccessMode) {\n\n    case 'r':\n        fm = (FILEMEM*) _cmsMallocZero(ContextID, sizeof(FILEMEM));\n        if (fm == NULL) goto Error;\n\n        if (Buffer == NULL) {\n            cmsSignalError(ContextID, cmsERROR_READ, \"Couldn't read profile from NULL pointer\");\n            goto Error;\n        }\n\n        fm ->Block = (cmsUInt8Number*) _cmsMalloc(ContextID, size);\n        if (fm ->Block == NULL) {\n\n            _cmsFree(ContextID, fm);\n            _cmsFree(ContextID, iohandler);\n            cmsSignalError(ContextID, cmsERROR_READ, \"Couldn't allocate %ld bytes for profile\", size);\n            return NULL;\n        }\n\n\n        memmove(fm->Block, Buffer, size);\n        fm ->FreeBlockOnClose = TRUE;\n        fm ->Size    = size;\n        fm ->Pointer = 0;\n        iohandler -> ReportedSize = size;\n        break;\n\n    case 'w':\n        fm = (FILEMEM*) _cmsMallocZero(ContextID, sizeof(FILEMEM));\n        if (fm == NULL) goto Error;\n\n        fm ->Block = (cmsUInt8Number*) Buffer;\n        fm ->FreeBlockOnClose = FALSE;\n        fm ->Size    = size;\n        fm ->Pointer = 0;\n        iohandler -> ReportedSize = 0;\n        break;\n\n    default:\n        cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, \"Unknown access mode '%c'\", *AccessMode);\n        return NULL;\n    }\n\n    iohandler ->ContextID = ContextID;\n    iohandler ->stream  = (void*) fm;\n    iohandler ->UsedSpace = 0;\n    iohandler ->PhysicalFile[0] = 0;\n\n    iohandler ->Read    = MemoryRead;\n    iohandler ->Seek    = MemorySeek;\n    iohandler ->Close   = MemoryClose;\n    iohandler ->Tell    = MemoryTell;\n    iohandler ->Write   = MemoryWrite;\n\n    return iohandler;\n\nError:\n    if (fm) _cmsFree(ContextID, fm);\n    if (iohandler) _cmsFree(ContextID, iohandler);\n    return NULL;\n}\n\n// File-based stream -------------------------------------------------------\n\n// Read count elements of size bytes each. Return number of elements read\nstatic\ncmsUInt32Number FileRead(cmsIOHANDLER* iohandler, void *Buffer, cmsUInt32Number size, cmsUInt32Number count)\n{\n    cmsUInt32Number nReaded = (cmsUInt32Number) fread(Buffer, size, count, (FILE*) iohandler->stream);\n\n    if (nReaded != count) {\n            cmsSignalError(iohandler ->ContextID, cmsERROR_FILE, \"Read error. Got %d bytes, block should be of %d bytes\", nReaded * size, count * size);\n            return 0;\n    }\n\n    return nReaded;\n}\n\n// Postion file pointer in the file\nstatic\ncmsBool  FileSeek(cmsIOHANDLER* iohandler, cmsUInt32Number offset)\n{\n    if (fseek((FILE*) iohandler ->stream, (long) offset, SEEK_SET) != 0) {\n\n       cmsSignalError(iohandler ->ContextID, cmsERROR_FILE, \"Seek error; probably corrupted file\");\n       return FALSE;\n    }\n\n    return TRUE;\n}\n\n// Returns file pointer position\nstatic\ncmsUInt32Number FileTell(cmsIOHANDLER* iohandler)\n{\n    return (cmsUInt32Number) ftell((FILE*)iohandler ->stream);\n}\n\n// Writes data to stream, also keeps used space for further reference. Returns TRUE on success, FALSE on error\nstatic\ncmsBool  FileWrite(cmsIOHANDLER* iohandler, cmsUInt32Number size, const void* Buffer)\n{\n       if (size == 0) return TRUE;  // We allow to write 0 bytes, but nothing is written\n\n       iohandler->UsedSpace += size;\n       return (fwrite(Buffer, size, 1, (FILE*) iohandler->stream) == 1);\n}\n\n// Closes the file\nstatic\ncmsBool  FileClose(cmsIOHANDLER* iohandler)\n{\n    if (fclose((FILE*) iohandler ->stream) != 0) return FALSE;\n    _cmsFree(iohandler ->ContextID, iohandler);\n    return TRUE;\n}\n\n// Create a iohandler for disk based files.\ncmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromFile(cmsContext ContextID, const char* FileName, const char* AccessMode)\n{\n    cmsIOHANDLER* iohandler = NULL;\n    FILE* fm = NULL;\n\n    _cmsAssert(FileName != NULL);\n    _cmsAssert(AccessMode != NULL);\n\n    iohandler = (cmsIOHANDLER*) _cmsMallocZero(ContextID, sizeof(cmsIOHANDLER));\n    if (iohandler == NULL) return NULL;\n\n    switch (*AccessMode) {\n\n    case 'r':\n        fm = fopen(FileName, \"rb\");\n        if (fm == NULL) {\n            _cmsFree(ContextID, iohandler);\n             cmsSignalError(ContextID, cmsERROR_FILE, \"File '%s' not found\", FileName);\n            return NULL;\n        }\n        iohandler -> ReportedSize = (cmsUInt32Number) cmsfilelength(fm);\n        break;\n\n    case 'w':\n        fm = fopen(FileName, \"wb\");\n        if (fm == NULL) {\n            _cmsFree(ContextID, iohandler);\n             cmsSignalError(ContextID, cmsERROR_FILE, \"Couldn't create '%s'\", FileName);\n            return NULL;\n        }\n        iohandler -> ReportedSize = 0;\n        break;\n\n    default:\n        _cmsFree(ContextID, iohandler);\n         cmsSignalError(ContextID, cmsERROR_FILE, \"Unknown access mode '%c'\", *AccessMode);\n        return NULL;\n    }\n\n    iohandler ->ContextID = ContextID;\n    iohandler ->stream = (void*) fm;\n    iohandler ->UsedSpace = 0;\n\n    // Keep track of the original file    \n    strncpy(iohandler -> PhysicalFile, FileName, sizeof(iohandler -> PhysicalFile)-1);\n    iohandler -> PhysicalFile[sizeof(iohandler -> PhysicalFile)-1] = 0;\n\n    iohandler ->Read    = FileRead;\n    iohandler ->Seek    = FileSeek;\n    iohandler ->Close   = FileClose;\n    iohandler ->Tell    = FileTell;\n    iohandler ->Write   = FileWrite;\n\n    return iohandler;\n}\n\n// Create a iohandler for stream based files\ncmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromStream(cmsContext ContextID, FILE* Stream)\n{\n    cmsIOHANDLER* iohandler = NULL;\n\n    iohandler = (cmsIOHANDLER*) _cmsMallocZero(ContextID, sizeof(cmsIOHANDLER));\n    if (iohandler == NULL) return NULL;\n\n    iohandler -> ContextID = ContextID;\n    iohandler -> stream = (void*) Stream;\n    iohandler -> UsedSpace = 0;\n    iohandler -> ReportedSize = (cmsUInt32Number) cmsfilelength(Stream);\n    iohandler -> PhysicalFile[0] = 0;\n\n    iohandler ->Read    = FileRead;\n    iohandler ->Seek    = FileSeek;\n    iohandler ->Close   = FileClose;\n    iohandler ->Tell    = FileTell;\n    iohandler ->Write   = FileWrite;\n\n    return iohandler;\n}\n\n\n\n// Close an open IO handler\ncmsBool CMSEXPORT cmsCloseIOhandler(cmsIOHANDLER* io)\n{\n    return io -> Close(io);\n}\n\n// -------------------------------------------------------------------------------------------------------\n\n#ifdef _WIN32_WCE\ntime_t wceex_time(time_t *timer);\nstruct tm * wceex_gmtime(const time_t *timer);\n\n#define time wceex_time\n#define gmtime wceex_gmtime\n#endif\n\n// Creates an empty structure holding all required parameters\ncmsHPROFILE CMSEXPORT cmsCreateProfilePlaceholder(cmsContext ContextID)\n{\n    time_t now = time(NULL);\n    _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) _cmsMallocZero(ContextID, sizeof(_cmsICCPROFILE));\n    if (Icc == NULL) return NULL;\n\n    Icc ->ContextID = ContextID;\n\n    // Set it to empty\n    Icc -> TagCount   = 0;\n\n    // Set default version\n    Icc ->Version =  0x02100000;\n\n    // Set creation date/time\n    memmove(&Icc ->Created, gmtime(&now), sizeof(Icc ->Created));\n\n    // Create a mutex if the user provided proper plugin. NULL otherwise\n    Icc ->UsrMutex = _cmsCreateMutex(ContextID);\n\n    // Return the handle\n    return (cmsHPROFILE) Icc;\n}\n\ncmsContext CMSEXPORT cmsGetProfileContextID(cmsHPROFILE hProfile)\n{\n     _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;\n\n    if (Icc == NULL) return NULL;\n    return Icc -> ContextID;\n}\n\n\n// Return the number of tags\ncmsInt32Number CMSEXPORT cmsGetTagCount(cmsHPROFILE hProfile)\n{\n    _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;\n    if (Icc == NULL) return -1;\n\n    return  Icc->TagCount;\n}\n\n// Return the tag signature of a given tag number\ncmsTagSignature CMSEXPORT cmsGetTagSignature(cmsHPROFILE hProfile, cmsUInt32Number n)\n{\n    _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;\n\n    if (n > Icc->TagCount) return (cmsTagSignature) 0;  // Mark as not available\n    if (n >= MAX_TABLE_TAG) return (cmsTagSignature) 0; // As double check\n\n    return Icc ->TagNames[n];\n}\n\n\nstatic\nint SearchOneTag(_cmsICCPROFILE* Profile, cmsTagSignature sig)\n{\n    cmsUInt32Number i;\n\n    for (i=0; i < Profile -> TagCount; i++) {\n\n        if (sig == Profile -> TagNames[i])\n            return i;\n    }\n\n    return -1;\n}\n\n// Search for a specific tag in tag dictionary. Returns position or -1 if tag not found.\n// If followlinks is turned on, then the position of the linked tag is returned\nint _cmsSearchTag(_cmsICCPROFILE* Icc, cmsTagSignature sig, cmsBool lFollowLinks)\n{\n    int n;\n    cmsTagSignature LinkedSig;\n\n    do {\n\n        // Search for given tag in ICC profile directory\n        n = SearchOneTag(Icc, sig);\n        if (n < 0)\n            return -1;        // Not found\n\n        if (!lFollowLinks)\n            return n;         // Found, don't follow links\n\n        // Is this a linked tag?\n        LinkedSig = Icc ->TagLinked[n];\n\n        // Yes, follow link\n        if (LinkedSig != (cmsTagSignature) 0) {\n\t\t\t// fix bug mantis id#0055942\n\t\t\t// assume that TRCTag and ColorantTag can't be linked.\n\t\t\t// Xiaochuan Liu 2014-04-23\n\t\t\tif ((sig == cmsSigRedTRCTag || sig == cmsSigGreenTRCTag || sig == cmsSigBlueTRCTag) && \n\t\t\t\t(LinkedSig == cmsSigRedColorantTag || LinkedSig == cmsSigGreenColorantTag || LinkedSig == cmsSigBlueColorantTag))\n\t\t\t{\n\t\t\t\treturn n;\n\t\t\t}\n            sig = LinkedSig;\n        }\n\n    } while (LinkedSig != (cmsTagSignature) 0);\n\n    return n;\n}\n\n// Deletes a tag entry\n\nstatic\nvoid _cmsDeleteTagByPos(_cmsICCPROFILE* Icc, int i)\n{\n    _cmsAssert(Icc != NULL);\n    _cmsAssert(i >= 0);\n\n   \n    if (Icc -> TagPtrs[i] != NULL) {\n\n        // Free previous version\n        if (Icc ->TagSaveAsRaw[i]) {\n            _cmsFree(Icc ->ContextID, Icc ->TagPtrs[i]);\n        }\n        else {\n            cmsTagTypeHandler* TypeHandler = Icc ->TagTypeHandlers[i];\n\n            if (TypeHandler != NULL) {\n\n                cmsTagTypeHandler LocalTypeHandler = *TypeHandler;\n                LocalTypeHandler.ContextID = Icc ->ContextID;              // As an additional parameter\n                LocalTypeHandler.ICCVersion = Icc ->Version;\n                LocalTypeHandler.FreePtr(&LocalTypeHandler, Icc -> TagPtrs[i]);\n                Icc ->TagPtrs[i] = NULL;\n            }\n        }\n\n    } \n}\n\n\n// Creates a new tag entry\nstatic\ncmsBool _cmsNewTag(_cmsICCPROFILE* Icc, cmsTagSignature sig, int* NewPos)\n{\n    int i;\n\n    // Search for the tag\n    i = _cmsSearchTag(Icc, sig, FALSE);\n    if (i >= 0) {\n\n        // Already exists? delete it\n        _cmsDeleteTagByPos(Icc, i);\n        *NewPos = i;\n    }\n    else  {\n\n        // No, make a new one\n\n        if (Icc -> TagCount >= MAX_TABLE_TAG) {\n            cmsSignalError(Icc ->ContextID, cmsERROR_RANGE, \"Too many tags (%d)\", MAX_TABLE_TAG);\n            return FALSE;\n        }\n\n        *NewPos = Icc ->TagCount;\n        Icc -> TagCount++;\n    }\n\n    return TRUE;\n}\n\n\n// Check existance\ncmsBool CMSEXPORT cmsIsTag(cmsHPROFILE hProfile, cmsTagSignature sig)\n{\n       _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) (void*) hProfile;\n       return _cmsSearchTag(Icc, sig, FALSE) >= 0;\n}\n\n\n// Read profile header and validate it\ncmsBool _cmsReadHeader(_cmsICCPROFILE* Icc)\n{\n    cmsTagEntry Tag;\n    cmsICCHeader Header;\n    cmsUInt32Number i, j;\n    cmsUInt32Number HeaderSize;\n    cmsIOHANDLER* io = Icc ->IOhandler;\n    cmsUInt32Number TagCount;\n\n\n    // Read the header\n    if (io -> Read(io, &Header, sizeof(cmsICCHeader), 1) != 1) {\n        return FALSE;\n    }\n\n    // Validate file as an ICC profile\n    if (_cmsAdjustEndianess32(Header.magic) != cmsMagicNumber) {\n        cmsSignalError(Icc ->ContextID, cmsERROR_BAD_SIGNATURE, \"not an ICC profile, invalid signature\");\n        return FALSE;\n    }\n\n    // Adjust endianess of the used parameters\n    Icc -> DeviceClass     = (cmsProfileClassSignature) _cmsAdjustEndianess32(Header.deviceClass);\n    Icc -> ColorSpace      = (cmsColorSpaceSignature)   _cmsAdjustEndianess32(Header.colorSpace);\n    Icc -> PCS             = (cmsColorSpaceSignature)   _cmsAdjustEndianess32(Header.pcs);\n   \n    Icc -> RenderingIntent = _cmsAdjustEndianess32(Header.renderingIntent);\n    Icc -> flags           = _cmsAdjustEndianess32(Header.flags);\n    Icc -> manufacturer    = _cmsAdjustEndianess32(Header.manufacturer);\n    Icc -> model           = _cmsAdjustEndianess32(Header.model);\n    Icc -> creator         = _cmsAdjustEndianess32(Header.creator);\n    \n    _cmsAdjustEndianess64(&Icc -> attributes, &Header.attributes);\n    Icc -> Version         = _cmsAdjustEndianess32(Header.version);\n\n    // Get size as reported in header\n    HeaderSize = _cmsAdjustEndianess32(Header.size);\n\n    // Make sure HeaderSize is lower than profile size\n    if (HeaderSize >= Icc ->IOhandler ->ReportedSize)\n            HeaderSize = Icc ->IOhandler ->ReportedSize;\n\n\n    // Get creation date/time\n    _cmsDecodeDateTimeNumber(&Header.date, &Icc ->Created);\n\n    // The profile ID are 32 raw bytes\n    memmove(Icc ->ProfileID.ID32, Header.profileID.ID32, 16);\n\n\n    // Read tag directory\n    if (!_cmsReadUInt32Number(io, &TagCount)) return FALSE;\n    if (TagCount > MAX_TABLE_TAG) {\n\n        cmsSignalError(Icc ->ContextID, cmsERROR_RANGE, \"Too many tags (%d)\", TagCount);\n        return FALSE;\n    }\n\n\n    // Read tag directory\n    Icc -> TagCount = 0;\n    for (i=0; i < TagCount; i++) {\n\n        if (!_cmsReadUInt32Number(io, (cmsUInt32Number *) &Tag.sig)) return FALSE;\n        if (!_cmsReadUInt32Number(io, &Tag.offset)) return FALSE;\n        if (!_cmsReadUInt32Number(io, &Tag.size)) return FALSE;\n\n        // Perform some sanity check. Offset + size should fall inside file.\n        if (Tag.offset + Tag.size > HeaderSize ||\n            Tag.offset + Tag.size < Tag.offset)\n                  continue;\n\n        Icc -> TagNames[Icc ->TagCount]   = Tag.sig;\n        Icc -> TagOffsets[Icc ->TagCount] = Tag.offset;\n        Icc -> TagSizes[Icc ->TagCount]   = Tag.size;\n\n       // Search for links\n        for (j=0; j < Icc ->TagCount; j++) {\n\n            if ((Icc ->TagOffsets[j] == Tag.offset) &&\n                (Icc ->TagSizes[j]   == Tag.size)) {\n\n                Icc ->TagLinked[Icc ->TagCount] = Icc ->TagNames[j];\n            }\n\n        }\n\n        Icc ->TagCount++;\n    }\n\n    return TRUE;\n}\n\n// Saves profile header\ncmsBool _cmsWriteHeader(_cmsICCPROFILE* Icc, cmsUInt32Number UsedSpace)\n{\n    cmsICCHeader Header;\n    cmsUInt32Number i;\n    cmsTagEntry Tag;\n    cmsInt32Number Count = 0;\n\n    Header.size        = _cmsAdjustEndianess32(UsedSpace);\n    Header.cmmId       = _cmsAdjustEndianess32(lcmsSignature);\n    Header.version     = _cmsAdjustEndianess32(Icc ->Version);\n\n    Header.deviceClass = (cmsProfileClassSignature) _cmsAdjustEndianess32(Icc -> DeviceClass);\n    Header.colorSpace  = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Icc -> ColorSpace);\n    Header.pcs         = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Icc -> PCS);\n\n    //   NOTE: in v4 Timestamp must be in UTC rather than in local time\n    _cmsEncodeDateTimeNumber(&Header.date, &Icc ->Created);\n\n    Header.magic       = _cmsAdjustEndianess32(cmsMagicNumber);\n\n#ifdef CMS_IS_WINDOWS_\n    Header.platform    = (cmsPlatformSignature) _cmsAdjustEndianess32(cmsSigMicrosoft);\n#else\n    Header.platform    = (cmsPlatformSignature) _cmsAdjustEndianess32(cmsSigMacintosh);\n#endif\n\n    Header.flags        = _cmsAdjustEndianess32(Icc -> flags);\n    Header.manufacturer = _cmsAdjustEndianess32(Icc -> manufacturer);\n    Header.model        = _cmsAdjustEndianess32(Icc -> model);\n\n    _cmsAdjustEndianess64(&Header.attributes, &Icc -> attributes);\n\n    // Rendering intent in the header (for embedded profiles)\n    Header.renderingIntent = _cmsAdjustEndianess32(Icc -> RenderingIntent);\n\n    // Illuminant is always D50\n    Header.illuminant.X = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(cmsD50_XYZ()->X));\n    Header.illuminant.Y = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(cmsD50_XYZ()->Y));\n    Header.illuminant.Z = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(cmsD50_XYZ()->Z));\n\n    // Created by LittleCMS (that's me!)\n    Header.creator      = _cmsAdjustEndianess32(lcmsSignature);\n\n    memset(&Header.reserved, 0, sizeof(Header.reserved));\n\n    // Set profile ID. Endianess is always big endian\n    memmove(&Header.profileID, &Icc ->ProfileID, 16);\n\n    // Dump the header\n    if (!Icc -> IOhandler->Write(Icc->IOhandler, sizeof(cmsICCHeader), &Header)) return FALSE;\n\n    // Saves Tag directory\n\n    // Get true count\n    for (i=0;  i < Icc -> TagCount; i++) {\n        if (Icc ->TagNames[i] != 0)\n            Count++;\n    }\n\n    // Store number of tags\n    if (!_cmsWriteUInt32Number(Icc ->IOhandler, Count)) return FALSE;\n\n    for (i=0; i < Icc -> TagCount; i++) {\n\n        if (Icc ->TagNames[i] == 0) continue;   // It is just a placeholder\n\n        Tag.sig    = (cmsTagSignature) _cmsAdjustEndianess32((cmsInt32Number) Icc -> TagNames[i]);\n        Tag.offset = _cmsAdjustEndianess32((cmsInt32Number) Icc -> TagOffsets[i]);\n        Tag.size   = _cmsAdjustEndianess32((cmsInt32Number) Icc -> TagSizes[i]);\n\n        if (!Icc ->IOhandler -> Write(Icc-> IOhandler, sizeof(cmsTagEntry), &Tag)) return FALSE;\n    }\n\n    return TRUE;\n}\n\n// ----------------------------------------------------------------------- Set/Get several struct members\n\n\ncmsUInt32Number CMSEXPORT cmsGetHeaderRenderingIntent(cmsHPROFILE hProfile)\n{\n    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;\n    return Icc -> RenderingIntent;\n}\n\nvoid CMSEXPORT cmsSetHeaderRenderingIntent(cmsHPROFILE hProfile, cmsUInt32Number RenderingIntent)\n{\n    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;\n    Icc -> RenderingIntent = RenderingIntent;\n}\n\ncmsUInt32Number CMSEXPORT cmsGetHeaderFlags(cmsHPROFILE hProfile)\n{\n    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;\n    return (cmsUInt32Number) Icc -> flags;\n}\n\nvoid CMSEXPORT cmsSetHeaderFlags(cmsHPROFILE hProfile, cmsUInt32Number Flags)\n{\n    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;\n    Icc -> flags = (cmsUInt32Number) Flags;\n}\n\ncmsUInt32Number CMSEXPORT cmsGetHeaderManufacturer(cmsHPROFILE hProfile)\n{\n    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;\n    return Icc ->manufacturer;\n}\n\nvoid CMSEXPORT cmsSetHeaderManufacturer(cmsHPROFILE hProfile, cmsUInt32Number manufacturer)\n{\n    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;\n    Icc -> manufacturer = manufacturer;\n}\n\ncmsUInt32Number CMSEXPORT cmsGetHeaderCreator(cmsHPROFILE hProfile)\n{\n    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;\n    return Icc ->creator;\n}\n\ncmsUInt32Number CMSEXPORT cmsGetHeaderModel(cmsHPROFILE hProfile)\n{\n    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;\n    return Icc ->model;\n}\n\nvoid CMSEXPORT cmsSetHeaderModel(cmsHPROFILE hProfile, cmsUInt32Number model)\n{\n    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;\n    Icc -> model = model;\n}\n\nvoid CMSEXPORT cmsGetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number* Flags)\n{\n    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;\n    memmove(Flags, &Icc -> attributes, sizeof(cmsUInt64Number));\n}\n\nvoid CMSEXPORT cmsSetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number Flags)\n{\n    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;\n    memmove(&Icc -> attributes, &Flags, sizeof(cmsUInt64Number));\n}\n\nvoid CMSEXPORT cmsGetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID)\n{\n    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;\n    memmove(ProfileID, Icc ->ProfileID.ID8, 16);\n}\n\nvoid CMSEXPORT cmsSetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID)\n{\n    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;\n    memmove(&Icc -> ProfileID, ProfileID, 16);\n}\n\ncmsBool  CMSEXPORT cmsGetHeaderCreationDateTime(cmsHPROFILE hProfile, struct tm *Dest)\n{\n    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;\n    memmove(Dest, &Icc ->Created, sizeof(struct tm));\n    return TRUE;\n}\n\ncmsColorSpaceSignature CMSEXPORT cmsGetPCS(cmsHPROFILE hProfile)\n{\n    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;\n    return Icc -> PCS;\n}\n\nvoid CMSEXPORT cmsSetPCS(cmsHPROFILE hProfile, cmsColorSpaceSignature pcs)\n{\n    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;\n    Icc -> PCS = pcs;\n}\n\ncmsColorSpaceSignature CMSEXPORT cmsGetColorSpace(cmsHPROFILE hProfile)\n{\n    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;\n    return Icc -> ColorSpace;\n}\n\nvoid CMSEXPORT cmsSetColorSpace(cmsHPROFILE hProfile, cmsColorSpaceSignature sig)\n{\n    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;\n    Icc -> ColorSpace = sig;\n}\n\ncmsProfileClassSignature CMSEXPORT cmsGetDeviceClass(cmsHPROFILE hProfile)\n{\n    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;\n    return Icc -> DeviceClass;\n}\n\nvoid CMSEXPORT cmsSetDeviceClass(cmsHPROFILE hProfile, cmsProfileClassSignature sig)\n{\n    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;\n    Icc -> DeviceClass = sig;\n}\n\ncmsUInt32Number CMSEXPORT cmsGetEncodedICCversion(cmsHPROFILE hProfile)\n{\n    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;\n    return Icc -> Version;\n}\n\nvoid CMSEXPORT cmsSetEncodedICCversion(cmsHPROFILE hProfile, cmsUInt32Number Version)\n{\n    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;\n    Icc -> Version = Version;\n}\n\n// Get an hexadecimal number with same digits as v\nstatic\ncmsUInt32Number BaseToBase(cmsUInt32Number in, int BaseIn, int BaseOut)\n{\n    char Buff[100];\n    int i, len;\n    cmsUInt32Number out;\n\n    for (len=0; in > 0 && len < 100; len++) {\n\n        Buff[len] = (char) (in % BaseIn);\n        in /= BaseIn;\n    }\n\n    for (i=len-1, out=0; i >= 0; --i) {\n        out = out * BaseOut + Buff[i];\n    }\n\n    return out;\n}\n\nvoid  CMSEXPORT cmsSetProfileVersion(cmsHPROFILE hProfile, cmsFloat64Number Version)\n{\n    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;\n\n    // 4.2 -> 0x4200000\n\n    Icc -> Version = BaseToBase((cmsUInt32Number) floor(Version * 100.0 + 0.5), 10, 16) << 16;\n}\n\ncmsFloat64Number CMSEXPORT cmsGetProfileVersion(cmsHPROFILE hProfile)\n{\n    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;\n    cmsUInt32Number n = Icc -> Version >> 16;\n\n    return BaseToBase(n, 16, 10) / 100.0;\n}\n// --------------------------------------------------------------------------------------------------------------\n\n\n// Create profile from IOhandler\ncmsHPROFILE CMSEXPORT cmsOpenProfileFromIOhandlerTHR(cmsContext ContextID, cmsIOHANDLER* io)\n{\n    _cmsICCPROFILE* NewIcc;\n    cmsHPROFILE hEmpty = cmsCreateProfilePlaceholder(ContextID);\n\n    if (hEmpty == NULL) return NULL;\n\n    NewIcc = (_cmsICCPROFILE*) hEmpty;\n\n    NewIcc ->IOhandler = io;\n    if (!_cmsReadHeader(NewIcc)) goto Error;\n    return hEmpty;\n\nError:\n    cmsCloseProfile(hEmpty);\n    return NULL;\n}\n\n// Create profile from IOhandler\ncmsHPROFILE CMSEXPORT cmsOpenProfileFromIOhandler2THR(cmsContext ContextID, cmsIOHANDLER* io, cmsBool write)\n{\n    _cmsICCPROFILE* NewIcc;\n    cmsHPROFILE hEmpty = cmsCreateProfilePlaceholder(ContextID);\n\n    if (hEmpty == NULL) return NULL;\n\n    NewIcc = (_cmsICCPROFILE*) hEmpty;\n\n    NewIcc ->IOhandler = io;\n    if (write) {\n\n        NewIcc -> IsWrite = TRUE;\n        return hEmpty;\n    }\n\n    if (!_cmsReadHeader(NewIcc)) goto Error;\n    return hEmpty;\n\nError:\n    cmsCloseProfile(hEmpty);\n    return NULL;\n}\n\n\n// Create profile from disk file\ncmsHPROFILE CMSEXPORT cmsOpenProfileFromFileTHR(cmsContext ContextID, const char *lpFileName, const char *sAccess)\n{\n    _cmsICCPROFILE* NewIcc;\n    cmsHPROFILE hEmpty = cmsCreateProfilePlaceholder(ContextID);\n\n    if (hEmpty == NULL) return NULL;\n\n    NewIcc = (_cmsICCPROFILE*) hEmpty;\n\n    NewIcc ->IOhandler = cmsOpenIOhandlerFromFile(ContextID, lpFileName, sAccess);\n    if (NewIcc ->IOhandler == NULL) goto Error;\n\n    if (*sAccess == 'W' || *sAccess == 'w') {\n\n        NewIcc -> IsWrite = TRUE;\n\n        return hEmpty;\n    }\n\n    if (!_cmsReadHeader(NewIcc)) goto Error;\n    return hEmpty;\n\nError:\n    cmsCloseProfile(hEmpty);\n    return NULL;\n}\n\n\ncmsHPROFILE CMSEXPORT cmsOpenProfileFromFile(const char *ICCProfile, const char *sAccess)\n{\n    return cmsOpenProfileFromFileTHR(NULL, ICCProfile, sAccess);\n}\n\n\ncmsHPROFILE  CMSEXPORT cmsOpenProfileFromStreamTHR(cmsContext ContextID, FILE* ICCProfile, const char *sAccess)\n{\n    _cmsICCPROFILE* NewIcc;\n    cmsHPROFILE hEmpty = cmsCreateProfilePlaceholder(ContextID);\n\n    if (hEmpty == NULL) return NULL;\n\n    NewIcc = (_cmsICCPROFILE*) hEmpty;\n\n    NewIcc ->IOhandler = cmsOpenIOhandlerFromStream(ContextID, ICCProfile);\n    if (NewIcc ->IOhandler == NULL) goto Error;\n\n    if (*sAccess == 'w') {\n\n        NewIcc -> IsWrite = TRUE;\n        return hEmpty;\n    }\n\n    if (!_cmsReadHeader(NewIcc)) goto Error;\n    return hEmpty;\n\nError:\n    cmsCloseProfile(hEmpty);\n    return NULL;\n\n}\n\ncmsHPROFILE  CMSEXPORT cmsOpenProfileFromStream(FILE* ICCProfile, const char *sAccess)\n{\n    return cmsOpenProfileFromStreamTHR(NULL, ICCProfile, sAccess);\n}\n\n\n// Open from memory block\ncmsHPROFILE CMSEXPORT cmsOpenProfileFromMemTHR(cmsContext ContextID, const void* MemPtr, cmsUInt32Number dwSize)\n{\n    _cmsICCPROFILE* NewIcc;\n    cmsHPROFILE hEmpty;\n\n    hEmpty = cmsCreateProfilePlaceholder(ContextID);\n    if (hEmpty == NULL) return NULL;\n\n    NewIcc = (_cmsICCPROFILE*) hEmpty;\n\n    // Ok, in this case const void* is casted to void* just because open IO handler\n    // shares read and writting modes. Don't abuse this feature!\n    NewIcc ->IOhandler = cmsOpenIOhandlerFromMem(ContextID, (void*) MemPtr, dwSize, \"r\");\n    if (NewIcc ->IOhandler == NULL) goto Error;\n\n    if (!_cmsReadHeader(NewIcc)) goto Error;\n\n    return hEmpty;\n\nError:\n    cmsCloseProfile(hEmpty);\n    return NULL;\n}\n\ncmsHPROFILE CMSEXPORT cmsOpenProfileFromMem(const void* MemPtr, cmsUInt32Number dwSize)\n{\n    return cmsOpenProfileFromMemTHR(NULL, MemPtr, dwSize);\n}\n\n\n\n// Dump tag contents. If the profile is being modified, untouched tags are copied from FileOrig\nstatic\ncmsBool SaveTags(_cmsICCPROFILE* Icc, _cmsICCPROFILE* FileOrig)\n{\n    cmsUInt8Number* Data;\n    cmsUInt32Number i;\n    cmsUInt32Number Begin;\n    cmsIOHANDLER* io = Icc ->IOhandler;\n    cmsTagDescriptor* TagDescriptor;\n    cmsTagTypeSignature TypeBase;\n    cmsTagTypeSignature Type;\n    cmsTagTypeHandler* TypeHandler;\n    cmsFloat64Number   Version = cmsGetProfileVersion((cmsHPROFILE) Icc);\n    cmsTagTypeHandler LocalTypeHandler;\n\n    for (i=0; i < Icc -> TagCount; i++) {\n\n        if (Icc ->TagNames[i] == 0) continue;\n\n        // Linked tags are not written\n        if (Icc ->TagLinked[i] != (cmsTagSignature) 0) continue;\n\n        Icc -> TagOffsets[i] = Begin = io ->UsedSpace;\n\n        Data = (cmsUInt8Number*)  Icc -> TagPtrs[i];\n\n        if (!Data) {\n\n            // Reach here if we are copying a tag from a disk-based ICC profile which has not been modified by user.\n            // In this case a blind copy of the block data is performed\n            if (FileOrig != NULL && Icc -> TagOffsets[i]) {\n\n                cmsUInt32Number TagSize   = FileOrig -> TagSizes[i];\n                cmsUInt32Number TagOffset = FileOrig -> TagOffsets[i];\n                void* Mem;\n\n                if (!FileOrig ->IOhandler->Seek(FileOrig ->IOhandler, TagOffset)) return FALSE;\n\n                Mem = _cmsMalloc(Icc ->ContextID, TagSize);\n                if (Mem == NULL) return FALSE;\n\n                if (FileOrig ->IOhandler->Read(FileOrig->IOhandler, Mem, TagSize, 1) != 1) return FALSE;\n                if (!io ->Write(io, TagSize, Mem)) return FALSE;\n                _cmsFree(Icc ->ContextID, Mem);\n\n                Icc -> TagSizes[i] = (io ->UsedSpace - Begin);\n\n\n                // Align to 32 bit boundary.\n                if (! _cmsWriteAlignment(io))\n                    return FALSE;\n            }\n\n            continue;\n        }\n\n\n        // Should this tag be saved as RAW? If so, tagsizes should be specified in advance (no further cooking is done)\n        if (Icc ->TagSaveAsRaw[i]) {\n\n            if (io -> Write(io, Icc ->TagSizes[i], Data) != 1) return FALSE;\n        }\n        else {\n\n            // Search for support on this tag\n            TagDescriptor = _cmsGetTagDescriptor(Icc-> ContextID, Icc -> TagNames[i]);\n            if (TagDescriptor == NULL) continue;                        // Unsupported, ignore it\n           \n            if (TagDescriptor ->DecideType != NULL) {\n\n                Type = TagDescriptor ->DecideType(Version, Data);\n            }\n            else {\n\n                Type = TagDescriptor ->SupportedTypes[0];\n            }\n\n            TypeHandler =  _cmsGetTagTypeHandler(Icc->ContextID, Type);\n\n            if (TypeHandler == NULL) {\n                cmsSignalError(Icc ->ContextID, cmsERROR_INTERNAL, \"(Internal) no handler for tag %x\", Icc -> TagNames[i]);\n                continue;\n            }\n\n            TypeBase = TypeHandler ->Signature;\n            if (!_cmsWriteTypeBase(io, TypeBase))\n                return FALSE;\n\n            LocalTypeHandler = *TypeHandler;\n            LocalTypeHandler.ContextID  = Icc ->ContextID;\n            LocalTypeHandler.ICCVersion = Icc ->Version;\n            if (!LocalTypeHandler.WritePtr(&LocalTypeHandler, io, Data, TagDescriptor ->ElemCount)) {\n\n                char String[5];\n\n                _cmsTagSignature2String(String, (cmsTagSignature) TypeBase);\n                cmsSignalError(Icc ->ContextID, cmsERROR_WRITE, \"Couldn't write type '%s'\", String);\n                return FALSE;\n            }\n        }\n\n\n        Icc -> TagSizes[i] = (io ->UsedSpace - Begin);\n\n        // Align to 32 bit boundary.\n        if (! _cmsWriteAlignment(io))\n            return FALSE;\n    }\n\n\n    return TRUE;\n}\n\n\n// Fill the offset and size fields for all linked tags\nstatic\ncmsBool SetLinks( _cmsICCPROFILE* Icc)\n{\n    cmsUInt32Number i;\n\n    for (i=0; i < Icc -> TagCount; i++) {\n\n        cmsTagSignature lnk = Icc ->TagLinked[i];\n        if (lnk != (cmsTagSignature) 0) {\n\n            int j = _cmsSearchTag(Icc, lnk, FALSE);\n            if (j >= 0) {\n\n                Icc ->TagOffsets[i] = Icc ->TagOffsets[j];\n                Icc ->TagSizes[i]   = Icc ->TagSizes[j];\n            }\n\n        }\n    }\n\n    return TRUE;\n}\n\n// Low-level save to IOHANDLER. It returns the number of bytes used to\n// store the profile, or zero on error. io may be NULL and in this case\n// no data is written--only sizes are calculated\ncmsUInt32Number CMSEXPORT cmsSaveProfileToIOhandler(cmsHPROFILE hProfile, cmsIOHANDLER* io)\n{\n    _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;\n    _cmsICCPROFILE Keep;\n    cmsIOHANDLER* PrevIO = NULL;\n    cmsUInt32Number UsedSpace;\n    cmsContext ContextID;\n\n    _cmsAssert(hProfile != NULL);\n\n    memmove(&Keep, Icc, sizeof(_cmsICCPROFILE));\n\n    ContextID = cmsGetProfileContextID(hProfile);\n    PrevIO = Icc ->IOhandler = cmsOpenIOhandlerFromNULL(ContextID);\n    if (PrevIO == NULL) return 0;\n\n    // Pass #1 does compute offsets\n\n    if (!_cmsWriteHeader(Icc, 0)) goto Error;\n    if (!SaveTags(Icc, &Keep)) goto Error;\n\n    UsedSpace = PrevIO ->UsedSpace;\n\n    // Pass #2 does save to iohandler\n\n    if (io != NULL) {\n\n        Icc ->IOhandler = io;\n        if (!SetLinks(Icc)) goto Error;\n        if (!_cmsWriteHeader(Icc, UsedSpace)) goto Error;\n        if (!SaveTags(Icc, &Keep)) goto Error;\n    }\n\n    memmove(Icc, &Keep, sizeof(_cmsICCPROFILE));\n    if (!cmsCloseIOhandler(PrevIO)) return 0;\n\n    return UsedSpace;\n\n\nError:\n    cmsCloseIOhandler(PrevIO);\n    memmove(Icc, &Keep, sizeof(_cmsICCPROFILE));\n    return 0;\n}\n\n#ifdef _WIN32_WCE\nint wceex_unlink(const char *filename);\n#ifndef remove\n#\tdefine remove wceex_unlink\n#endif\n#endif\n\n// Low-level save to disk.\ncmsBool  CMSEXPORT cmsSaveProfileToFile(cmsHPROFILE hProfile, const char* FileName)\n{\n    cmsContext ContextID = cmsGetProfileContextID(hProfile);\n    cmsIOHANDLER* io = cmsOpenIOhandlerFromFile(ContextID, FileName, \"w\");\n    cmsBool rc;\n\n    if (io == NULL) return FALSE;\n\n    rc = (cmsSaveProfileToIOhandler(hProfile, io) != 0);\n    rc &= cmsCloseIOhandler(io);\n\n    if (rc == FALSE) {          // remove() is C99 per 7.19.4.1\n            remove(FileName);   // We have to IGNORE return value in this case\n    }\n    return rc;\n}\n\n// Same as anterior, but for streams\ncmsBool CMSEXPORT cmsSaveProfileToStream(cmsHPROFILE hProfile, FILE* Stream)\n{\n    cmsBool rc;\n    cmsContext ContextID = cmsGetProfileContextID(hProfile);\n    cmsIOHANDLER* io = cmsOpenIOhandlerFromStream(ContextID, Stream);\n\n    if (io == NULL) return FALSE;\n\n    rc = (cmsSaveProfileToIOhandler(hProfile, io) != 0);\n    rc &= cmsCloseIOhandler(io);\n\n    return rc;\n}\n\n\n// Same as anterior, but for memory blocks. In this case, a NULL as MemPtr means calculate needed space only\ncmsBool CMSEXPORT cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr, cmsUInt32Number* BytesNeeded)\n{\n    cmsBool rc;\n    cmsIOHANDLER* io;\n    cmsContext ContextID = cmsGetProfileContextID(hProfile);\n\n    _cmsAssert(BytesNeeded != NULL);\n\n    // Should we just calculate the needed space?\n    if (MemPtr == NULL) {\n\n           *BytesNeeded =  cmsSaveProfileToIOhandler(hProfile, NULL);\n            return (*BytesNeeded == 0) ? FALSE : TRUE;\n    }\n\n    // That is a real write operation\n    io =  cmsOpenIOhandlerFromMem(ContextID, MemPtr, *BytesNeeded, \"w\");\n    if (io == NULL) return FALSE;\n\n    rc = (cmsSaveProfileToIOhandler(hProfile, io) != 0);\n    rc &= cmsCloseIOhandler(io);\n\n    return rc;\n}\n\n\n\n// Closes a profile freeing any involved resources\ncmsBool  CMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile)\n{\n    _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;\n    cmsBool  rc = TRUE;\n    cmsUInt32Number i;\n\n    if (!Icc) return FALSE;\n\n    // Was open in write mode?\n    if (Icc ->IsWrite) {\n\n        Icc ->IsWrite = FALSE;      // Assure no further writting\n        rc &= cmsSaveProfileToFile(hProfile, Icc ->IOhandler->PhysicalFile);\n    }\n\n    for (i=0; i < Icc -> TagCount; i++) {\n\n        if (Icc -> TagPtrs[i]) {\n\n            cmsTagTypeHandler* TypeHandler = Icc ->TagTypeHandlers[i];\n\n            if (TypeHandler != NULL) {\n                cmsTagTypeHandler LocalTypeHandler = *TypeHandler;\n\n                LocalTypeHandler.ContextID = Icc ->ContextID;              // As an additional parameters\n                LocalTypeHandler.ICCVersion = Icc ->Version;\n                LocalTypeHandler.FreePtr(&LocalTypeHandler, Icc -> TagPtrs[i]);\n            }\n            else\n                _cmsFree(Icc ->ContextID, Icc ->TagPtrs[i]);\n        }\n    }\n\n    if (Icc ->IOhandler != NULL) {\n        rc &= cmsCloseIOhandler(Icc->IOhandler);\n    }\n\n    _cmsDestroyMutex(Icc->ContextID, Icc->UsrMutex);\n\n    _cmsFree(Icc ->ContextID, Icc);   // Free placeholder memory\n\n    return rc;\n}\n\n\n// -------------------------------------------------------------------------------------------------------------------\n\n\n// Returns TRUE if a given tag is supported by a plug-in\nstatic\ncmsBool IsTypeSupported(cmsTagDescriptor* TagDescriptor, cmsTagTypeSignature Type)\n{\n    cmsUInt32Number i, nMaxTypes;\n\n    nMaxTypes = TagDescriptor->nSupportedTypes;\n    if (nMaxTypes >= MAX_TYPES_IN_LCMS_PLUGIN)\n        nMaxTypes = MAX_TYPES_IN_LCMS_PLUGIN;\n\n    for (i=0; i < nMaxTypes; i++) {\n        if (Type == TagDescriptor ->SupportedTypes[i]) return TRUE;\n    }\n\n    return FALSE;\n}\n\n\n// That's the main read function\nvoid* CMSEXPORT cmsReadTag(cmsHPROFILE hProfile, cmsTagSignature sig)\n{\n    _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;\n    cmsIOHANDLER* io = Icc ->IOhandler;\n    cmsTagTypeHandler* TypeHandler;\n    cmsTagTypeHandler LocalTypeHandler;\n    cmsTagDescriptor*  TagDescriptor;\n    cmsTagTypeSignature BaseType;\n    cmsUInt32Number Offset, TagSize;\n    cmsUInt32Number ElemCount;\n    int n;\n\n    if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return NULL;\n\n    n = _cmsSearchTag(Icc, sig, TRUE);\n    if (n < 0) goto Error;               // Not found, return NULL\n\n\n    // If the element is already in memory, return the pointer\n    if (Icc -> TagPtrs[n]) {\n\n        if (Icc ->TagSaveAsRaw[n]) goto Error;  // We don't support read raw tags as cooked\n\n        _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);\n        return Icc -> TagPtrs[n];\n    }\n\n    // We need to read it. Get the offset and size to the file\n    Offset    = Icc -> TagOffsets[n];\n    TagSize   = Icc -> TagSizes[n];\n\n    // Seek to its location\n    if (!io -> Seek(io, Offset))\n        goto Error;\n\n    // Search for support on this tag\n    TagDescriptor = _cmsGetTagDescriptor(Icc-> ContextID, sig);\n    if (TagDescriptor == NULL) {\n\n        char String[5];\n\n        _cmsTagSignature2String(String, sig);\n\n        // An unknown element was found.\n        cmsSignalError(Icc ->ContextID, cmsERROR_UNKNOWN_EXTENSION, \"Unknown tag type '%s' found.\", String);\n        goto Error;     // Unsupported.\n    }\n\n    // if supported, get type and check if in list\n    BaseType = _cmsReadTypeBase(io);\n    if (BaseType == 0) goto Error;\n\n    if (!IsTypeSupported(TagDescriptor, BaseType)) goto Error;\n\n    TagSize  -= 8;                      // Alredy read by the type base logic\n\n    // Get type handler\n    TypeHandler = _cmsGetTagTypeHandler(Icc ->ContextID, BaseType);\n    if (TypeHandler == NULL) goto Error;\n    LocalTypeHandler = *TypeHandler;\n\n\n    // Read the tag\n    Icc -> TagTypeHandlers[n] = TypeHandler;\n\n    LocalTypeHandler.ContextID = Icc ->ContextID;\n    LocalTypeHandler.ICCVersion = Icc ->Version;\n    Icc -> TagPtrs[n] = LocalTypeHandler.ReadPtr(&LocalTypeHandler, io, &ElemCount, TagSize);\n\n    // The tag type is supported, but something wrong happend and we cannot read the tag.\n    // let know the user about this (although it is just a warning)\n    if (Icc -> TagPtrs[n] == NULL) {\n\n        char String[5];\n\n        _cmsTagSignature2String(String, sig);\n        cmsSignalError(Icc ->ContextID, cmsERROR_CORRUPTION_DETECTED, \"Corrupted tag '%s'\", String);\n        goto Error;\n    }\n\n    // This is a weird error that may be a symptom of something more serious, the number of\n    // stored item is actually less than the number of required elements.\n    if (ElemCount < TagDescriptor ->ElemCount) {\n\n        char String[5];\n\n        _cmsTagSignature2String(String, sig);\n        cmsSignalError(Icc ->ContextID, cmsERROR_CORRUPTION_DETECTED, \"'%s' Inconsistent number of items: expected %d, got %d\",\n            String, TagDescriptor ->ElemCount, ElemCount);\n    }\n\n\n    // Return the data\n    _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);\n    return Icc -> TagPtrs[n];\n\n\n    // Return error and unlock tha data\nError:\n    _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);\n    return NULL;\n}\n\n\n// Get true type of data\ncmsTagTypeSignature _cmsGetTagTrueType(cmsHPROFILE hProfile, cmsTagSignature sig)\n{\n    _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;\n    cmsTagTypeHandler* TypeHandler;\n    int n;\n\n    // Search for given tag in ICC profile directory\n    n = _cmsSearchTag(Icc, sig, TRUE);\n    if (n < 0) return (cmsTagTypeSignature) 0;                // Not found, return NULL\n\n    // Get the handler. The true type is there\n    TypeHandler =  Icc -> TagTypeHandlers[n];\n    return TypeHandler ->Signature;\n}\n\n\n// Write a single tag. This just keeps track of the tak into a list of \"to be written\". If the tag is already\n// in that list, the previous version is deleted.\ncmsBool CMSEXPORT cmsWriteTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data)\n{\n    _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;\n    cmsTagTypeHandler* TypeHandler = NULL;\n    cmsTagTypeHandler LocalTypeHandler;\n    cmsTagDescriptor* TagDescriptor = NULL;\n    cmsTagTypeSignature Type;\n    int i;\n    cmsFloat64Number Version;\n    char TypeString[5], SigString[5];\n\n    if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return FALSE;\n\n    // To delete tags.\n    if (data == NULL) {\n\n         // Delete the tag\n         i = _cmsSearchTag(Icc, sig, FALSE);\n         if (i >= 0) {\n                \n             // Use zero as a mark of deleted \n             _cmsDeleteTagByPos(Icc, i);\n             Icc ->TagNames[i] = (cmsTagSignature) 0;\n             _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);\n             return TRUE;\n         }\n         // Didn't find the tag\n        goto Error;\n    }\n\n    if (!_cmsNewTag(Icc, sig, &i)) goto Error;\n\n    // This is not raw\n    Icc ->TagSaveAsRaw[i] = FALSE;\n\n    // This is not a link\n    Icc ->TagLinked[i] = (cmsTagSignature) 0;\n\n    // Get information about the TAG.\n    TagDescriptor = _cmsGetTagDescriptor(Icc-> ContextID, sig);\n    if (TagDescriptor == NULL){\n         cmsSignalError(Icc ->ContextID, cmsERROR_UNKNOWN_EXTENSION, \"Unsupported tag '%x'\", sig);\n        goto Error;\n    }\n\n\n    // Now we need to know which type to use. It depends on the version.\n    Version = cmsGetProfileVersion(hProfile);\n\n    if (TagDescriptor ->DecideType != NULL) {\n\n        // Let the tag descriptor to decide the type base on depending on\n        // the data. This is useful for example on parametric curves, where\n        // curves specified by a table cannot be saved as parametric and needs\n        // to be casted to single v2-curves, even on v4 profiles.\n\n        Type = TagDescriptor ->DecideType(Version, data);\n    }\n    else {\n\n        Type = TagDescriptor ->SupportedTypes[0];\n    }\n\n    // Does the tag support this type?\n    if (!IsTypeSupported(TagDescriptor, Type)) {\n\n        _cmsTagSignature2String(TypeString, (cmsTagSignature) Type);\n        _cmsTagSignature2String(SigString,  sig);\n\n        cmsSignalError(Icc ->ContextID, cmsERROR_UNKNOWN_EXTENSION, \"Unsupported type '%s' for tag '%s'\", TypeString, SigString);\n        goto Error;\n    }\n\n    // Does we have a handler for this type?\n    TypeHandler =  _cmsGetTagTypeHandler(Icc->ContextID, Type);\n    if (TypeHandler == NULL) {\n\n        _cmsTagSignature2String(TypeString, (cmsTagSignature) Type);\n        _cmsTagSignature2String(SigString,  sig);\n\n        cmsSignalError(Icc ->ContextID, cmsERROR_UNKNOWN_EXTENSION, \"Unsupported type '%s' for tag '%s'\", TypeString, SigString);\n        goto Error;           // Should never happen\n    }\n\n\n    // Fill fields on icc structure\n    Icc ->TagTypeHandlers[i]  = TypeHandler;\n    Icc ->TagNames[i]         = sig;\n    Icc ->TagSizes[i]         = 0;\n    Icc ->TagOffsets[i]       = 0;\n\n    LocalTypeHandler = *TypeHandler;\n    LocalTypeHandler.ContextID  = Icc ->ContextID;\n    LocalTypeHandler.ICCVersion = Icc ->Version;\n    Icc ->TagPtrs[i]            = LocalTypeHandler.DupPtr(&LocalTypeHandler, data, TagDescriptor ->ElemCount);\n\n    if (Icc ->TagPtrs[i] == NULL)  {\n\n        _cmsTagSignature2String(TypeString, (cmsTagSignature) Type);\n        _cmsTagSignature2String(SigString,  sig);\n        cmsSignalError(Icc ->ContextID, cmsERROR_CORRUPTION_DETECTED, \"Malformed struct in type '%s' for tag '%s'\", TypeString, SigString);\n\n        goto Error;\n    }\n\n    _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);\n    return TRUE;\n\nError:\n    _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);\n    return FALSE;\n\n}\n\n// Read and write raw data. The only way those function would work and keep consistence with normal read and write\n// is to do an additional step of serialization. That means, readRaw would issue a normal read and then convert the obtained\n// data to raw bytes by using the \"write\" serialization logic. And vice-versa. I know this may end in situations where\n// raw data written does not exactly correspond with the raw data proposed to cmsWriteRaw data, but this approach allows\n// to write a tag as raw data and the read it as handled.\n\ncmsInt32Number CMSEXPORT cmsReadRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, void* data, cmsUInt32Number BufferSize)\n{\n    _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;\n    void *Object;\n    int i;\n    cmsIOHANDLER* MemIO;\n    cmsTagTypeHandler* TypeHandler = NULL;\n    cmsTagTypeHandler LocalTypeHandler;\n    cmsTagDescriptor* TagDescriptor = NULL;\n    cmsUInt32Number rc;\n    cmsUInt32Number Offset, TagSize;\n\n    if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return 0;\n\n    // Search for given tag in ICC profile directory\n    i = _cmsSearchTag(Icc, sig, TRUE);\n    if (i < 0) goto Error;                 // Not found, \n\n    // It is already read?\n    if (Icc -> TagPtrs[i] == NULL) {\n\n        // No yet, get original position\n        Offset   = Icc ->TagOffsets[i];\n        TagSize  = Icc ->TagSizes[i];\n\n        // read the data directly, don't keep copy\n        if (data != NULL) {\n\n            if (BufferSize < TagSize)\n                TagSize = BufferSize;\n\n            if (!Icc ->IOhandler ->Seek(Icc ->IOhandler, Offset)) goto Error;\n            if (!Icc ->IOhandler ->Read(Icc ->IOhandler, data, 1, TagSize)) goto Error;\n\n            _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);\n            return TagSize;\n        }\n\n        _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);\n        return Icc ->TagSizes[i];\n    }\n\n    // The data has been already read, or written. But wait!, maybe the user choosed to save as\n    // raw data. In this case, return the raw data directly\n    if (Icc ->TagSaveAsRaw[i]) {\n\n        if (data != NULL)  {\n\n            TagSize  = Icc ->TagSizes[i];\n            if (BufferSize < TagSize)\n                TagSize = BufferSize;\n\n            memmove(data, Icc ->TagPtrs[i], TagSize);\n\n            _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);\n            return TagSize;\n        }\n\n        _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);\n        return Icc ->TagSizes[i];\n    }\n\n    // Already readed, or previously set by cmsWriteTag(). We need to serialize that\n    // data to raw in order to maintain consistency.\n\n    _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);\n    Object = cmsReadTag(hProfile, sig);\n    if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return 0;\n\n    if (Object == NULL) goto Error;\n\n    // Now we need to serialize to a memory block: just use a memory iohandler\n\n    if (data == NULL) {\n        MemIO = cmsOpenIOhandlerFromNULL(cmsGetProfileContextID(hProfile));\n    } else{\n        MemIO = cmsOpenIOhandlerFromMem(cmsGetProfileContextID(hProfile), data, BufferSize, \"w\");\n    }\n    if (MemIO == NULL) goto Error;\n\n    // Obtain type handling for the tag\n    TypeHandler = Icc ->TagTypeHandlers[i];\n    TagDescriptor = _cmsGetTagDescriptor(Icc-> ContextID, sig);\n    if (TagDescriptor == NULL) {\n        cmsCloseIOhandler(MemIO);\n        goto Error;\n    }\n    \n    if (TypeHandler == NULL) goto Error;\n\n    // Serialize\n    LocalTypeHandler = *TypeHandler;\n    LocalTypeHandler.ContextID  = Icc ->ContextID;\n    LocalTypeHandler.ICCVersion = Icc ->Version;\n\n    if (!_cmsWriteTypeBase(MemIO, TypeHandler ->Signature)) {\n        cmsCloseIOhandler(MemIO);\n        goto Error;\n    }\n\n    if (!LocalTypeHandler.WritePtr(&LocalTypeHandler, MemIO, Object, TagDescriptor ->ElemCount)) {\n        cmsCloseIOhandler(MemIO);\n        goto Error;\n    }\n\n    // Get Size and close\n    rc = MemIO ->Tell(MemIO);\n    cmsCloseIOhandler(MemIO);      // Ignore return code this time\n\n    _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);\n    return rc;\n\nError:\n    _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);\n    return 0;\n}\n\n// Similar to the anterior. This function allows to write directly to the ICC profile any data, without\n// checking anything. As a rule, mixing Raw with cooked doesn't work, so writting a tag as raw and then reading\n// it as cooked without serializing does result into an error. If that is wha you want, you will need to dump\n// the profile to memry or disk and then reopen it.\ncmsBool CMSEXPORT cmsWriteRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data, cmsUInt32Number Size)\n{\n    _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;\n    int i;\n\n    if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return 0;\n\n    if (!_cmsNewTag(Icc, sig, &i)) {\n        _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);\n         return FALSE;\n    }\n\n    // Mark the tag as being written as RAW\n    Icc ->TagSaveAsRaw[i] = TRUE;\n    Icc ->TagNames[i]     = sig;\n    Icc ->TagLinked[i]    = (cmsTagSignature) 0;\n\n    // Keep a copy of the block\n    Icc ->TagPtrs[i]  = _cmsDupMem(Icc ->ContextID, data, Size);\n    Icc ->TagSizes[i] = Size;\n\n    _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);\n    return TRUE;\n}\n\n// Using this function you can collapse several tag entries to the same block in the profile\ncmsBool CMSEXPORT cmsLinkTag(cmsHPROFILE hProfile, cmsTagSignature sig, cmsTagSignature dest)\n{\n    _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;\n    int i;\n\n     if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return FALSE;\n\n    if (!_cmsNewTag(Icc, sig, &i)) {\n        _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);\n        return FALSE;\n    }\n\n    // Keep necessary information\n    Icc ->TagSaveAsRaw[i] = FALSE;\n    Icc ->TagNames[i]     = sig;\n    Icc ->TagLinked[i]    = dest;\n\n    Icc ->TagPtrs[i]    = NULL;\n    Icc ->TagSizes[i]   = 0;\n    Icc ->TagOffsets[i] = 0;\n\n    _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);\n    return TRUE;\n}\n\n\n// Returns the tag linked to sig, in the case two tags are sharing same resource\ncmsTagSignature  CMSEXPORT cmsTagLinkedTo(cmsHPROFILE hProfile, cmsTagSignature sig)\n{\n    _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;\n    int i;\n\n    // Search for given tag in ICC profile directory\n    i = _cmsSearchTag(Icc, sig, FALSE);\n    if (i < 0) return (cmsTagSignature) 0;                 // Not found, return 0\n\n    return Icc -> TagLinked[i];\n}\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/src/cmsio1.c",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2012 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n//\n\n#include \"lcms2_internal.h\"\n\n// Read tags using low-level functions, provides necessary glue code to adapt versions, etc.\n\n// LUT tags\nstatic const cmsTagSignature Device2PCS16[]   =  {cmsSigAToB0Tag,     // Perceptual\n                                                  cmsSigAToB1Tag,     // Relative colorimetric\n                                                  cmsSigAToB2Tag,     // Saturation\n                                                  cmsSigAToB1Tag };   // Absolute colorimetric\n\nstatic const cmsTagSignature Device2PCSFloat[] = {cmsSigDToB0Tag,     // Perceptual\n                                                  cmsSigDToB1Tag,     // Relative colorimetric\n                                                  cmsSigDToB2Tag,     // Saturation\n                                                  cmsSigDToB3Tag };   // Absolute colorimetric\n\nstatic const cmsTagSignature PCS2Device16[]    = {cmsSigBToA0Tag,     // Perceptual\n                                                  cmsSigBToA1Tag,     // Relative colorimetric\n                                                  cmsSigBToA2Tag,     // Saturation\n                                                  cmsSigBToA1Tag };   // Absolute colorimetric\n\nstatic const cmsTagSignature PCS2DeviceFloat[] = {cmsSigBToD0Tag,     // Perceptual\n                                                  cmsSigBToD1Tag,     // Relative colorimetric\n                                                  cmsSigBToD2Tag,     // Saturation\n                                                  cmsSigBToD3Tag };   // Absolute colorimetric\n\n\n// Factors to convert from 1.15 fixed point to 0..1.0 range and vice-versa\n#define InpAdj   (1.0/MAX_ENCODEABLE_XYZ)     // (65536.0/(65535.0*2.0))\n#define OutpAdj  (MAX_ENCODEABLE_XYZ)         // ((2.0*65535.0)/65536.0)\n\n// Several resources for gray conversions.\nstatic const cmsFloat64Number GrayInputMatrix[] = { (InpAdj*cmsD50X),  (InpAdj*cmsD50Y),  (InpAdj*cmsD50Z) };\nstatic const cmsFloat64Number OneToThreeInputMatrix[] = { 1, 1, 1 };\nstatic const cmsFloat64Number PickYMatrix[] = { 0, (OutpAdj*cmsD50Y), 0 };\nstatic const cmsFloat64Number PickLstarMatrix[] = { 1, 0, 0 };\n\n// Get a media white point fixing some issues found in certain old profiles\ncmsBool  _cmsReadMediaWhitePoint(cmsCIEXYZ* Dest, cmsHPROFILE hProfile)\n{\n    cmsCIEXYZ* Tag;\n\n    _cmsAssert(Dest != NULL);\n\n    Tag = (cmsCIEXYZ*) cmsReadTag(hProfile, cmsSigMediaWhitePointTag);\n\n    // If no wp, take D50\n    if (Tag == NULL) {\n        *Dest = *cmsD50_XYZ();\n        return TRUE;\n    }\n\n    // V2 display profiles should give D50\n    if (cmsGetEncodedICCversion(hProfile) < 0x4000000) {\n\n        if (cmsGetDeviceClass(hProfile) == cmsSigDisplayClass) {\n            *Dest = *cmsD50_XYZ();\n            return TRUE;\n        }\n    }\n\n    // All seems ok\n    *Dest = *Tag;\n    return TRUE;\n}\n\n\n// Chromatic adaptation matrix. Fix some issues as well\ncmsBool  _cmsReadCHAD(cmsMAT3* Dest, cmsHPROFILE hProfile)\n{\n    cmsMAT3* Tag;\n\n    _cmsAssert(Dest != NULL);\n\n    Tag = (cmsMAT3*) cmsReadTag(hProfile, cmsSigChromaticAdaptationTag);\n\n    if (Tag != NULL) {\n        *Dest = *Tag;\n        return TRUE;\n    }\n\n    // No CHAD available, default it to identity\n    _cmsMAT3identity(Dest);\n\n    // V2 display profiles should give D50\n    if (cmsGetEncodedICCversion(hProfile) < 0x4000000) {\n\n        if (cmsGetDeviceClass(hProfile) == cmsSigDisplayClass) {\n\n            cmsCIEXYZ* White = (cmsCIEXYZ*) cmsReadTag(hProfile, cmsSigMediaWhitePointTag);\n\n            if (White == NULL) {\n\n                _cmsMAT3identity(Dest);\n                return TRUE;\n            }\n\n            return _cmsAdaptationMatrix(Dest, NULL, White, cmsD50_XYZ());\n        }\n    }\n\n    return TRUE;\n}\n\n\n// Auxiliar, read colorants as a MAT3 structure. Used by any function that needs a matrix-shaper\nstatic\ncmsBool ReadICCMatrixRGB2XYZ(cmsMAT3* r, cmsHPROFILE hProfile)\n{\n    cmsCIEXYZ *PtrRed, *PtrGreen, *PtrBlue;\n\n    _cmsAssert(r != NULL);\n\n    PtrRed   = (cmsCIEXYZ *) cmsReadTag(hProfile, cmsSigRedColorantTag);\n    PtrGreen = (cmsCIEXYZ *) cmsReadTag(hProfile, cmsSigGreenColorantTag);\n    PtrBlue  = (cmsCIEXYZ *) cmsReadTag(hProfile, cmsSigBlueColorantTag);\n\n    if (PtrRed == NULL || PtrGreen == NULL || PtrBlue == NULL)\n        return FALSE;\n\n    _cmsVEC3init(&r -> v[0], PtrRed -> X, PtrGreen -> X,  PtrBlue -> X);\n    _cmsVEC3init(&r -> v[1], PtrRed -> Y, PtrGreen -> Y,  PtrBlue -> Y);\n    _cmsVEC3init(&r -> v[2], PtrRed -> Z, PtrGreen -> Z,  PtrBlue -> Z);\n\n    return TRUE;\n}\n\n\n// Gray input pipeline\nstatic\ncmsPipeline* BuildGrayInputMatrixPipeline(cmsHPROFILE hProfile)\n{\n    cmsToneCurve *GrayTRC;\n    cmsPipeline* Lut;\n    cmsContext ContextID = cmsGetProfileContextID(hProfile);\n\n    GrayTRC = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigGrayTRCTag);\n    if (GrayTRC == NULL) return NULL;\n\n    Lut = cmsPipelineAlloc(ContextID, 1, 3);\n    if (Lut == NULL)\n        goto Error;\n\n    if (cmsGetPCS(hProfile) == cmsSigLabData) {\n\n        // In this case we implement the profile as an  identity matrix plus 3 tone curves\n        cmsUInt16Number Zero[2] = { 0x8080, 0x8080 };\n        cmsToneCurve* EmptyTab;\n        cmsToneCurve* LabCurves[3];\n\n        EmptyTab = cmsBuildTabulatedToneCurve16(ContextID, 2, Zero);\n\n        if (EmptyTab == NULL)\n            goto Error;\n\n        LabCurves[0] = GrayTRC;\n        LabCurves[1] = EmptyTab;\n        LabCurves[2] = EmptyTab;\n\n        if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3,  1, OneToThreeInputMatrix, NULL)) ||\n            !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, LabCurves))) {\n                cmsFreeToneCurve(EmptyTab);\n                goto Error;\n        }\n\n        cmsFreeToneCurve(EmptyTab);\n\n    }\n    else  {\n\n        if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 1, &GrayTRC)) ||\n            !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3,  1, GrayInputMatrix, NULL)))\n            goto Error;\n    }\n\n    return Lut;\n\nError:\n\t// memory pointed by GrayTRC is not a new malloc memory, so don't free it here, \n\t// memory pointed by GrayTRC will be freed when hProfile is closed.\n\t// test file :0047776_Pocket Medicine_ The Massachusetts General Hospital Handbook of Internal Medicine-2.pdf\n\t// Xiaochuan Liu, 20140421\n    //cmsFreeToneCurve(GrayTRC);\n    cmsPipelineFree(Lut);\n    return NULL;\n}\n\n// RGB Matrix shaper\nstatic\ncmsPipeline* BuildRGBInputMatrixShaper(cmsHPROFILE hProfile)\n{\n    cmsPipeline* Lut;\n    cmsMAT3 Mat;\n    cmsToneCurve *Shapes[3];\n    cmsContext ContextID = cmsGetProfileContextID(hProfile);\n    int i, j;\n\n    if (!ReadICCMatrixRGB2XYZ(&Mat, hProfile)) return NULL;\n\n    // XYZ PCS in encoded in 1.15 format, and the matrix output comes in 0..0xffff range, so\n    // we need to adjust the output by a factor of (0x10000/0xffff) to put data in\n    // a 1.16 range, and then a >> 1 to obtain 1.15. The total factor is (65536.0)/(65535.0*2)\n\n    for (i=0; i < 3; i++)\n        for (j=0; j < 3; j++)\n            Mat.v[i].n[j] *= InpAdj;\n\n\n    Shapes[0] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigRedTRCTag);\n    Shapes[1] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigGreenTRCTag);\n    Shapes[2] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigBlueTRCTag);\n\n    if (!Shapes[0] || !Shapes[1] || !Shapes[2])\n        return NULL;\n\n    Lut = cmsPipelineAlloc(ContextID, 3, 3);\n    if (Lut != NULL) {\n\n        if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, Shapes)) ||\n            !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (cmsFloat64Number*) &Mat, NULL)))\n            goto Error;\n\n        // Note that it is certainly possible a single profile would have a LUT based\n        // tag for output working in lab and a matrix-shaper for the fallback cases. \n        // This is not allowed by the spec, but this code is tolerant to those cases    \n        if (cmsGetPCS(hProfile) == cmsSigLabData) {\n\n            if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocXYZ2Lab(ContextID)))\n                goto Error;\n        }\n\n    }\n\n    return Lut;\n\nError:\n    cmsPipelineFree(Lut);\n    return NULL;\n}\n\n\n\n// Read the DToAX tag, adjusting the encoding of Lab or XYZ if neded\nstatic\ncmsPipeline* _cmsReadFloatInputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat)\n{\n    cmsContext ContextID       = cmsGetProfileContextID(hProfile);\n    cmsPipeline* Lut           = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat));\n    cmsColorSpaceSignature spc = cmsGetColorSpace(hProfile);\n    cmsColorSpaceSignature PCS = cmsGetPCS(hProfile);\n    \n    if (Lut == NULL) return NULL;\n    \n    // input and output of transform are in lcms 0..1 encoding.  If XYZ or Lab spaces are used, \n    //  these need to be normalized into the appropriate ranges (Lab = 100,0,0, XYZ=1.0,1.0,1.0)\n    if ( spc == cmsSigLabData)\n    {\n        if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID)))\n            goto Error;\n    }\n    else if (spc == cmsSigXYZData)\n    {\n        if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID)))\n            goto Error;\n    }\n    \n    if ( PCS == cmsSigLabData)\n    {\n        if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID)))\n            goto Error;\n    }\n    else if( PCS == cmsSigXYZData)\n    {\n        if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID)))\n            goto Error;\n    }\n    \n    return Lut;\n\nError:\n    cmsPipelineFree(Lut);\n    return NULL;\n}\n\n\n// Read and create a BRAND NEW MPE LUT from a given profile. All stuff dependent of version, etc\n// is adjusted here in order to create a LUT that takes care of all those details.\n// We add intent = -1 as a way to read matrix shaper always, no matter of other LUT\ncmsPipeline* _cmsReadInputLUT(cmsHPROFILE hProfile, int Intent)\n{\n    cmsTagTypeSignature OriginalType;\n    cmsTagSignature tag16    = Device2PCS16[Intent];\n    cmsTagSignature tagFloat = Device2PCSFloat[Intent];\n    cmsContext ContextID = cmsGetProfileContextID(hProfile);\n\n    // On named color, take the appropiate tag\n    if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) {\n\n        cmsPipeline* Lut;\n        cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*) cmsReadTag(hProfile, cmsSigNamedColor2Tag);\n\n        if (nc == NULL) return NULL;\n\n        Lut = cmsPipelineAlloc(ContextID, 0, 0);\n        if (Lut == NULL) {\n            cmsFreeNamedColorList(nc);\n            return NULL;\n        }\n\n        if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, TRUE)) ||\n            !cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID))) {\n            cmsPipelineFree(Lut);\n            return NULL;\n        }\n        return Lut;\n    }\n\n    // This is an attempt to reuse this funtion to retrieve the matrix-shaper as pipeline no\n    // matter other LUT are present and have precedence. Intent = -1 means just this.\n    if (Intent != -1) {\n\n        if (cmsIsTag(hProfile, tagFloat)) {  // Float tag takes precedence\n\n            // Floating point LUT are always V4, but the encoding range is no\n            // longer 0..1.0, so we need to add an stage depending on the color space\n            return _cmsReadFloatInputTag(hProfile, tagFloat);\n        }\n\n        // Revert to perceptual if no tag is found\n        if (!cmsIsTag(hProfile, tag16)) {\n            tag16 = Device2PCS16[0];\n        }\n\n        if (cmsIsTag(hProfile, tag16)) { // Is there any LUT-Based table?\n\n            // Check profile version and LUT type. Do the necessary adjustments if needed\n\n            // First read the tag\n            cmsPipeline* Lut = (cmsPipeline*) cmsReadTag(hProfile, tag16);\n            if (Lut == NULL) return NULL;\n\n            // After reading it, we have now info about the original type\n            OriginalType =  _cmsGetTagTrueType(hProfile, tag16);\n\n            // The profile owns the Lut, so we need to copy it\n            Lut = cmsPipelineDup(Lut);\n\n            // We need to adjust data only for Lab16 on output\n            if (OriginalType != cmsSigLut16Type || cmsGetPCS(hProfile) != cmsSigLabData)\n                return Lut;\n\n            // If the input is Lab, add also a conversion at the begin\n            if (cmsGetColorSpace(hProfile) == cmsSigLabData &&\n                !cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID)))\n                goto Error;\n\n            // Add a matrix for conversion V2 to V4 Lab PCS\n            if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)))\n                goto Error;\n\n            return Lut;\nError:\n            cmsPipelineFree(Lut);\n            return NULL;\n        }\n    }\n\n    // Lut was not found, try to create a matrix-shaper\n\n    // Check if this is a grayscale profile.\n    if (cmsGetColorSpace(hProfile) == cmsSigGrayData) {\n\n        // if so, build appropiate conversion tables.\n        // The tables are the PCS iluminant, scaled across GrayTRC\n        return BuildGrayInputMatrixPipeline(hProfile);\n    }\n\n    // Not gray, create a normal matrix-shaper\n    return BuildRGBInputMatrixShaper(hProfile);\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n\n// Gray output pipeline.\n// XYZ -> Gray or Lab -> Gray. Since we only know the GrayTRC, we need to do some assumptions. Gray component will be\n// given by Y on XYZ PCS and by L* on Lab PCS, Both across inverse TRC curve.\n// The complete pipeline on XYZ is Matrix[3:1] -> Tone curve and in Lab Matrix[3:1] -> Tone Curve as well.\n\nstatic\ncmsPipeline* BuildGrayOutputPipeline(cmsHPROFILE hProfile)\n{\n    cmsToneCurve *GrayTRC, *RevGrayTRC;\n    cmsPipeline* Lut;\n    cmsContext ContextID = cmsGetProfileContextID(hProfile);\n\n    GrayTRC = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigGrayTRCTag);\n    if (GrayTRC == NULL) return NULL;\n\n    RevGrayTRC = cmsReverseToneCurve(GrayTRC);\n    if (RevGrayTRC == NULL) return NULL;\n\n    Lut = cmsPipelineAlloc(ContextID, 3, 1);\n    if (Lut == NULL) {\n        cmsFreeToneCurve(RevGrayTRC);\n        return NULL;\n    }\n\n    if (cmsGetPCS(hProfile) == cmsSigLabData) {\n\n        if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 1,  3, PickLstarMatrix, NULL)))\n            goto Error;\n    }\n    else  {\n        if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 1,  3, PickYMatrix, NULL)))\n            goto Error;\n    }\n\n    if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 1, &RevGrayTRC)))\n        goto Error;\n\n    cmsFreeToneCurve(RevGrayTRC);\n    return Lut;\n\nError:\n    cmsFreeToneCurve(RevGrayTRC);\n    cmsPipelineFree(Lut);\n    return NULL;\n}\n\n\nstatic\ncmsPipeline* BuildRGBOutputMatrixShaper(cmsHPROFILE hProfile)\n{\n    cmsPipeline* Lut;\n    cmsToneCurve *Shapes[3], *InvShapes[3];\n    cmsMAT3 Mat, Inv;\n    int i, j;\n    cmsContext ContextID = cmsGetProfileContextID(hProfile);\n\n    if (!ReadICCMatrixRGB2XYZ(&Mat, hProfile))\n        return NULL;\n\n    if (!_cmsMAT3inverse(&Mat, &Inv))\n        return NULL;\n\n    // XYZ PCS in encoded in 1.15 format, and the matrix input should come in 0..0xffff range, so\n    // we need to adjust the input by a << 1 to obtain a 1.16 fixed and then by a factor of\n    // (0xffff/0x10000) to put data in 0..0xffff range. Total factor is (2.0*65535.0)/65536.0;\n\n    for (i=0; i < 3; i++)\n        for (j=0; j < 3; j++)\n            Inv.v[i].n[j] *= OutpAdj;\n\n    Shapes[0] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigRedTRCTag);\n    Shapes[1] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigGreenTRCTag);\n    Shapes[2] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigBlueTRCTag);\n\n    if (!Shapes[0] || !Shapes[1] || !Shapes[2])\n        return NULL;\n\n    InvShapes[0] = cmsReverseToneCurve(Shapes[0]);\n    InvShapes[1] = cmsReverseToneCurve(Shapes[1]);\n    InvShapes[2] = cmsReverseToneCurve(Shapes[2]);\n\n    if (!InvShapes[0] || !InvShapes[1] || !InvShapes[2]) {\n        return NULL;\n    }\n\n    Lut = cmsPipelineAlloc(ContextID, 3, 3);\n    if (Lut != NULL) {\n\n        // Note that it is certainly possible a single profile would have a LUT based\n        // tag for output working in lab and a matrix-shaper for the fallback cases. \n        // This is not allowed by the spec, but this code is tolerant to those cases    \n        if (cmsGetPCS(hProfile) == cmsSigLabData) {\n\n            if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLab2XYZ(ContextID)))\n                goto Error;\n        }\n\n        if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (cmsFloat64Number*) &Inv, NULL)) ||\n            !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, InvShapes)))\n            goto Error;\n    }\n\n    cmsFreeToneCurveTriple(InvShapes);\n    return Lut;\nError:\n    cmsFreeToneCurveTriple(InvShapes);\n    cmsPipelineFree(Lut);\n    return NULL;\n}\n\n\n// Change CLUT interpolation to trilinear\nstatic\nvoid ChangeInterpolationToTrilinear(cmsPipeline* Lut)\n{\n    cmsStage* Stage;\n\n    for (Stage = cmsPipelineGetPtrToFirstStage(Lut);\n        Stage != NULL;\n        Stage = cmsStageNext(Stage)) {\n\n            if (cmsStageType(Stage) == cmsSigCLutElemType) {\n\n                _cmsStageCLutData* CLUT = (_cmsStageCLutData*) Stage ->Data;\n\n                CLUT ->Params->dwFlags |= CMS_LERP_FLAGS_TRILINEAR;\n                _cmsSetInterpolationRoutine(Lut->ContextID, CLUT ->Params);\n            }\n    }\n}\n\n\n// Read the DToAX tag, adjusting the encoding of Lab or XYZ if neded\nstatic\ncmsPipeline* _cmsReadFloatOutputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat)\n{\n    cmsContext ContextID       = cmsGetProfileContextID(hProfile);\n    cmsPipeline* Lut           = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat));\n    cmsColorSpaceSignature PCS = cmsGetPCS(hProfile);\n    cmsColorSpaceSignature dataSpace = cmsGetColorSpace(hProfile);\n    \n    if (Lut == NULL) return NULL;\n    \n    // If PCS is Lab or XYZ, the floating point tag is accepting data in the space encoding,\n    // and since the formatter has already accomodated to 0..1.0, we should undo this change\n    if ( PCS == cmsSigLabData)\n    {\n        if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID)))\n            goto Error;\n    }\n    else\n        if (PCS == cmsSigXYZData)\n        {\n            if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID)))\n                goto Error;\n        }\n    \n    // the output can be Lab or XYZ, in which case normalisation is needed on the end of the pipeline\n    if ( dataSpace == cmsSigLabData)\n    {\n        if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID)))\n            goto Error;\n    }\n    else if (dataSpace == cmsSigXYZData)\n    {\n        if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID)))\n            goto Error;\n    }\n    \n    return Lut;\n\nError:\n    cmsPipelineFree(Lut);\n    return NULL;\n}\n\n// Create an output MPE LUT from agiven profile. Version mismatches are handled here\ncmsPipeline* _cmsReadOutputLUT(cmsHPROFILE hProfile, int Intent)\n{\n    cmsTagTypeSignature OriginalType;\n    cmsTagSignature tag16    = PCS2Device16[Intent];\n    cmsTagSignature tagFloat = PCS2DeviceFloat[Intent];\n    cmsContext ContextID     = cmsGetProfileContextID(hProfile);\n\n\n    if (Intent != -1) {\n\n        if (cmsIsTag(hProfile, tagFloat)) {  // Float tag takes precedence\n\n            // Floating point LUT are always V4\n            return _cmsReadFloatOutputTag(hProfile, tagFloat);\n        }\n\n        // Revert to perceptual if no tag is found\n        if (!cmsIsTag(hProfile, tag16)) {\n            tag16 = PCS2Device16[0];\n        }\n\n        if (cmsIsTag(hProfile, tag16)) { // Is there any LUT-Based table?\n\n            // Check profile version and LUT type. Do the necessary adjustments if needed\n\n            // First read the tag\n            cmsPipeline* Lut = (cmsPipeline*) cmsReadTag(hProfile, tag16);\n            if (Lut == NULL) return NULL;\n\n            // After reading it, we have info about the original type\n            OriginalType =  _cmsGetTagTrueType(hProfile, tag16);\n\n            // The profile owns the Lut, so we need to copy it\n            Lut = cmsPipelineDup(Lut);\n            if (Lut == NULL) return NULL;\n\n            // Now it is time for a controversial stuff. I found that for 3D LUTS using\n            // Lab used as indexer space,  trilinear interpolation should be used\n            if (cmsGetPCS(hProfile) == cmsSigLabData)\n                ChangeInterpolationToTrilinear(Lut);\n\n            // We need to adjust data only for Lab and Lut16 type\n            if (OriginalType != cmsSigLut16Type || cmsGetPCS(hProfile) != cmsSigLabData)\n                return Lut;\n\n            // Add a matrix for conversion V4 to V2 Lab PCS\n            if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID)))\n                goto Error;\n\n            // If the output is Lab, add also a conversion at the end\n            if (cmsGetColorSpace(hProfile) == cmsSigLabData)\n                if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)))\n                    goto Error;\n\n            return Lut;\nError:\n            cmsPipelineFree(Lut);\n            return NULL;\n        }\n    }\n\n    // Lut not found, try to create a matrix-shaper\n\n    // Check if this is a grayscale profile.\n    if (cmsGetColorSpace(hProfile) == cmsSigGrayData) {\n\n        // if so, build appropiate conversion tables.\n        // The tables are the PCS iluminant, scaled across GrayTRC\n        return BuildGrayOutputPipeline(hProfile);\n    }\n\n    // Not gray, create a normal matrix-shaper, which only operates in XYZ space  \n    return BuildRGBOutputMatrixShaper(hProfile);\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n\n// Read the AToD0 tag, adjusting the encoding of Lab or XYZ if neded\nstatic\ncmsPipeline* _cmsReadFloatDevicelinkTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat)\n{\n    cmsContext ContextID       = cmsGetProfileContextID(hProfile);\n    cmsPipeline* Lut           = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat));\n    cmsColorSpaceSignature PCS = cmsGetPCS(hProfile);\n    cmsColorSpaceSignature spc = cmsGetColorSpace(hProfile);\n\n    if (Lut == NULL) return NULL;\n\n    if (spc == cmsSigLabData)\n    {\n        if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID)))\n            goto Error;\n    }\n    else\n        if (spc == cmsSigXYZData)\n        {\n            if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID)))\n                goto Error;\n        }\n\n        if (PCS == cmsSigLabData)\n        {\n            if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID)))\n                goto Error;\n        }\n        else\n            if (PCS == cmsSigXYZData)\n            {\n                if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID)))\n                    goto Error;\n            }\n\n    return Lut;\nError:\n    cmsPipelineFree(Lut);\n    return NULL;\n}\n\n// This one includes abstract profiles as well. Matrix-shaper cannot be obtained on that device class. The\n// tag name here may default to AToB0\ncmsPipeline* _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, int Intent)\n{\n    cmsPipeline* Lut;\n    cmsTagTypeSignature OriginalType;\n    cmsTagSignature tag16    = Device2PCS16[Intent];\n    cmsTagSignature tagFloat = Device2PCSFloat[Intent];\n    cmsContext ContextID = cmsGetProfileContextID(hProfile);\n\n\n    // On named color, take the appropiate tag\n    if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) {\n\n        cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*) cmsReadTag(hProfile, cmsSigNamedColor2Tag);\n\n        if (nc == NULL) return NULL;\n\n        Lut = cmsPipelineAlloc(ContextID, 0, 0);\n        if (Lut == NULL)\n            goto Error;\n\n        if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, FALSE)))\n            goto Error;\n\n        if (cmsGetColorSpace(hProfile) == cmsSigLabData)\n            if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)))\n                goto Error;\n\n        return Lut;\nError:\n        cmsPipelineFree(Lut);\n        cmsFreeNamedColorList(nc);\n        return NULL;\n    }\n\n    if (cmsIsTag(hProfile, tagFloat)) {  // Float tag takes precedence\n\n        // Floating point LUT are always V\n        return _cmsReadFloatDevicelinkTag(hProfile, tagFloat);\n    }\n\n    tagFloat = Device2PCSFloat[0];\n    if (cmsIsTag(hProfile, tagFloat)) {\n\n        return cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat));\n    }\n\n    if (!cmsIsTag(hProfile, tag16)) {  // Is there any LUT-Based table?\n\n        tag16    = Device2PCS16[0];\n        if (!cmsIsTag(hProfile, tag16)) return NULL;\n    }\n\n    // Check profile version and LUT type. Do the necessary adjustments if needed\n\n    // Read the tag\n    Lut = (cmsPipeline*) cmsReadTag(hProfile, tag16);\n    if (Lut == NULL) return NULL;\n\n    // The profile owns the Lut, so we need to copy it\n    Lut = cmsPipelineDup(Lut);\n    if (Lut == NULL) return NULL;\n\n    // Now it is time for a controversial stuff. I found that for 3D LUTS using\n    // Lab used as indexer space,  trilinear interpolation should be used\n    if (cmsGetPCS(hProfile) == cmsSigLabData)\n        ChangeInterpolationToTrilinear(Lut);\n\n    // After reading it, we have info about the original type\n    OriginalType =  _cmsGetTagTrueType(hProfile, tag16);\n\n    // We need to adjust data for Lab16 on output\n    if (OriginalType != cmsSigLut16Type) return Lut;\n\n    // Here it is possible to get Lab on both sides\n\n    if (cmsGetColorSpace(hProfile) == cmsSigLabData) {\n        if(!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID)))\n            goto Error2;\n    }\n\n    if (cmsGetPCS(hProfile) == cmsSigLabData) {\n        if(!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)))\n            goto Error2;\n    }\n\n    return Lut;\n\nError2:\n    cmsPipelineFree(Lut);\n    return NULL;\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n\n// Returns TRUE if the profile is implemented as matrix-shaper\ncmsBool  CMSEXPORT cmsIsMatrixShaper(cmsHPROFILE hProfile)\n{\n    switch (cmsGetColorSpace(hProfile)) {\n\n    case cmsSigGrayData:\n\n        return cmsIsTag(hProfile, cmsSigGrayTRCTag);\n\n    case cmsSigRgbData:\n\n        return (cmsIsTag(hProfile, cmsSigRedColorantTag) &&\n                cmsIsTag(hProfile, cmsSigGreenColorantTag) &&\n                cmsIsTag(hProfile, cmsSigBlueColorantTag) &&\n                cmsIsTag(hProfile, cmsSigRedTRCTag) &&\n                cmsIsTag(hProfile, cmsSigGreenTRCTag) &&\n                cmsIsTag(hProfile, cmsSigBlueTRCTag));\n\n    default:\n\n        return FALSE;\n    }\n}\n\n// Returns TRUE if the intent is implemented as CLUT\ncmsBool  CMSEXPORT cmsIsCLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection)\n{\n    const cmsTagSignature* TagTable;\n\n    // For devicelinks, the supported intent is that one stated in the header\n    if (cmsGetDeviceClass(hProfile) == cmsSigLinkClass) {\n            return (cmsGetHeaderRenderingIntent(hProfile) == Intent);\n    }\n\n    switch (UsedDirection) {\n\n       case LCMS_USED_AS_INPUT: TagTable = Device2PCS16; break;\n       case LCMS_USED_AS_OUTPUT:TagTable = PCS2Device16; break;\n\n       // For proofing, we need rel. colorimetric in output. Let's do some recursion\n       case LCMS_USED_AS_PROOF:\n           return cmsIsIntentSupported(hProfile, Intent, LCMS_USED_AS_INPUT) &&\n                  cmsIsIntentSupported(hProfile, INTENT_RELATIVE_COLORIMETRIC, LCMS_USED_AS_OUTPUT);\n\n       default:\n           cmsSignalError(cmsGetProfileContextID(hProfile), cmsERROR_RANGE, \"Unexpected direction (%d)\", UsedDirection);\n           return FALSE;\n    }\n\n    return cmsIsTag(hProfile, TagTable[Intent]);\n\n}\n\n\n// Return info about supported intents\ncmsBool  CMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile,\n                                        cmsUInt32Number Intent, cmsUInt32Number UsedDirection)\n{\n\n    if (cmsIsCLUT(hProfile, Intent, UsedDirection)) return TRUE;\n\n    // Is there any matrix-shaper? If so, the intent is supported. This is a bit odd, since V2 matrix shaper\n    // does not fully support relative colorimetric because they cannot deal with non-zero black points, but\n    // many profiles claims that, and this is certainly not true for V4 profiles. Lets answer \"yes\" no matter\n    // the accuracy would be less than optimal in rel.col and v2 case.\n\n    return cmsIsMatrixShaper(hProfile);\n}\n\n\n// ---------------------------------------------------------------------------------------------------------------\n\n// Read both, profile sequence description and profile sequence id if present. Then combine both to\n// create qa unique structure holding both. Shame on ICC to store things in such complicated way.\ncmsSEQ* _cmsReadProfileSequence(cmsHPROFILE hProfile)\n{\n    cmsSEQ* ProfileSeq;\n    cmsSEQ* ProfileId;\n    cmsSEQ* NewSeq;\n    cmsUInt32Number i;\n\n    // Take profile sequence description first\n    ProfileSeq = (cmsSEQ*) cmsReadTag(hProfile, cmsSigProfileSequenceDescTag);\n\n    // Take profile sequence ID\n    ProfileId  = (cmsSEQ*) cmsReadTag(hProfile, cmsSigProfileSequenceIdTag);\n\n    if (ProfileSeq == NULL && ProfileId == NULL) return NULL;\n\n    if (ProfileSeq == NULL) return cmsDupProfileSequenceDescription(ProfileId);\n    if (ProfileId  == NULL) return cmsDupProfileSequenceDescription(ProfileSeq);\n\n    // We have to mix both together. For that they must agree\n    if (ProfileSeq ->n != ProfileId ->n) return cmsDupProfileSequenceDescription(ProfileSeq);\n\n    NewSeq = cmsDupProfileSequenceDescription(ProfileSeq);\n\n    // Ok, proceed to the mixing\n    if (NewSeq != NULL) {\n        for (i=0; i < ProfileSeq ->n; i++) {\n\n            memmove(&NewSeq ->seq[i].ProfileID, &ProfileId ->seq[i].ProfileID, sizeof(cmsProfileID));\n            NewSeq ->seq[i].Description = cmsMLUdup(ProfileId ->seq[i].Description);\n        }\n    }\n    return NewSeq;\n}\n\n// Dump the contents of profile sequence in both tags (if v4 available)\ncmsBool _cmsWriteProfileSequence(cmsHPROFILE hProfile, const cmsSEQ* seq)\n{\n    if (!cmsWriteTag(hProfile, cmsSigProfileSequenceDescTag, seq)) return FALSE;\n\n    if (cmsGetProfileVersion(hProfile) >= 4.0) {\n\n            if (!cmsWriteTag(hProfile, cmsSigProfileSequenceIdTag, seq)) return FALSE;\n    }\n\n    return TRUE;\n}\n\n\n// Auxiliar, read and duplicate a MLU if found.\nstatic\ncmsMLU* GetMLUFromProfile(cmsHPROFILE h, cmsTagSignature sig)\n{\n    cmsMLU* mlu = (cmsMLU*) cmsReadTag(h, sig);\n    if (mlu == NULL) return NULL;\n\n    return cmsMLUdup(mlu);\n}\n\n// Create a sequence description out of an array of profiles\ncmsSEQ* _cmsCompileProfileSequence(cmsContext ContextID, cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[])\n{\n    cmsUInt32Number i;\n    cmsSEQ* seq = cmsAllocProfileSequenceDescription(ContextID, nProfiles);\n\n    if (seq == NULL) return NULL;\n\n    for (i=0; i < nProfiles; i++) {\n\n        cmsPSEQDESC* ps = &seq ->seq[i];\n        cmsHPROFILE h = hProfiles[i];\n        cmsTechnologySignature* techpt;\n\n        cmsGetHeaderAttributes(h, &ps ->attributes);\n        cmsGetHeaderProfileID(h, ps ->ProfileID.ID8);\n        ps ->deviceMfg   = cmsGetHeaderManufacturer(h);\n        ps ->deviceModel = cmsGetHeaderModel(h);\n\n        techpt = (cmsTechnologySignature*) cmsReadTag(h, cmsSigTechnologyTag);\n        if (techpt == NULL)\n            ps ->technology   =  (cmsTechnologySignature) 0;\n        else\n            ps ->technology   = *techpt;\n\n        ps ->Manufacturer = GetMLUFromProfile(h,  cmsSigDeviceMfgDescTag);\n        ps ->Model        = GetMLUFromProfile(h,  cmsSigDeviceModelDescTag);\n        ps ->Description  = GetMLUFromProfile(h, cmsSigProfileDescriptionTag);\n\n    }\n\n    return seq;\n}\n\n// -------------------------------------------------------------------------------------------------------------------\n\n\nstatic\nconst cmsMLU* GetInfo(cmsHPROFILE hProfile, cmsInfoType Info)\n{\n    cmsTagSignature sig;\n\n    switch (Info) {\n\n    case cmsInfoDescription:\n        sig = cmsSigProfileDescriptionTag;\n        break;\n\n    case cmsInfoManufacturer:\n        sig = cmsSigDeviceMfgDescTag;\n        break;\n\n    case cmsInfoModel:\n        sig = cmsSigDeviceModelDescTag;\n         break;\n\n    case cmsInfoCopyright:\n        sig = cmsSigCopyrightTag;\n        break;\n\n    default: return NULL;\n    }\n\n\n    return (cmsMLU*) cmsReadTag(hProfile, sig);\n}\n\n\n\ncmsUInt32Number CMSEXPORT cmsGetProfileInfo(cmsHPROFILE hProfile, cmsInfoType Info,\n                                            const char LanguageCode[3], const char CountryCode[3],\n                                            wchar_t* Buffer, cmsUInt32Number BufferSize)\n{\n    const cmsMLU* mlu = GetInfo(hProfile, Info);\n    if (mlu == NULL) return 0;\n\n    return cmsMLUgetWide(mlu, LanguageCode, CountryCode, Buffer, BufferSize);\n}\n\n\ncmsUInt32Number  CMSEXPORT cmsGetProfileInfoASCII(cmsHPROFILE hProfile, cmsInfoType Info,\n                                                          const char LanguageCode[3], const char CountryCode[3],\n                                                          char* Buffer, cmsUInt32Number BufferSize)\n{\n    const cmsMLU* mlu = GetInfo(hProfile, Info);\n    if (mlu == NULL) return 0;\n\n    return cmsMLUgetASCII(mlu, LanguageCode, CountryCode, Buffer, BufferSize);\n}\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/src/cmslut.c",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2012 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n//\n\n#include \"lcms2_internal.h\"\n\n\n// Allocates an empty multi profile element\ncmsStage* CMSEXPORT _cmsStageAllocPlaceholder(cmsContext ContextID,\n                                cmsStageSignature Type,\n                                cmsUInt32Number InputChannels,\n                                cmsUInt32Number OutputChannels,\n                                _cmsStageEvalFn     EvalPtr,\n                                _cmsStageDupElemFn  DupElemPtr,\n                                _cmsStageFreeElemFn FreePtr,\n                                void*             Data)\n{\n    cmsStage* ph = (cmsStage*) _cmsMallocZero(ContextID, sizeof(cmsStage));\n\n    if (ph == NULL) return NULL;\n\n\n    ph ->ContextID = ContextID;\n\n    ph ->Type       = Type;\n    ph ->Implements = Type;   // By default, no clue on what is implementing\n\n    ph ->InputChannels  = InputChannels;\n    ph ->OutputChannels = OutputChannels;\n    ph ->EvalPtr        = EvalPtr;\n    ph ->DupElemPtr     = DupElemPtr;\n    ph ->FreePtr        = FreePtr;\n    ph ->Data           = Data;\n\n    return ph;\n}\n\n\nstatic\nvoid EvaluateIdentity(const cmsFloat32Number In[],\n                            cmsFloat32Number Out[],\n                      const cmsStage *mpe)\n{\n    memmove(Out, In, mpe ->InputChannels * sizeof(cmsFloat32Number));\n}\n\n\ncmsStage* CMSEXPORT cmsStageAllocIdentity(cmsContext ContextID, cmsUInt32Number nChannels)\n{\n    return _cmsStageAllocPlaceholder(ContextID,\n                                   cmsSigIdentityElemType,\n                                   nChannels, nChannels,\n                                   EvaluateIdentity,\n                                   NULL,\n                                   NULL,\n                                   NULL);\n }\n\n// Conversion functions. From floating point to 16 bits\nstatic\nvoid FromFloatTo16(const cmsFloat32Number In[], cmsUInt16Number Out[], cmsUInt32Number n)\n{\n    cmsUInt32Number i;\n\n    for (i=0; i < n; i++) {\n        Out[i] = _cmsQuickSaturateWord(In[i] * 65535.0);\n    }\n}\n\n// From 16 bits to floating point\nstatic\nvoid From16ToFloat(const cmsUInt16Number In[], cmsFloat32Number Out[], cmsUInt32Number n)\n{\n    cmsUInt32Number i;\n\n    for (i=0; i < n; i++) {\n        Out[i] = (cmsFloat32Number) In[i] / 65535.0F;\n    }\n}\n\n\n// This function is quite useful to analyze the structure of a LUT and retrieve the MPE elements\n// that conform the LUT. It should be called with the LUT, the number of expected elements and\n// then a list of expected types followed with a list of cmsFloat64Number pointers to MPE elements. If\n// the function founds a match with current pipeline, it fills the pointers and returns TRUE\n// if not, returns FALSE without touching anything. Setting pointers to NULL does bypass\n// the storage process.\ncmsBool  CMSEXPORT cmsPipelineCheckAndRetreiveStages(const cmsPipeline* Lut, cmsUInt32Number n, ...)\n{\n    va_list args;\n    cmsUInt32Number i;\n    cmsStage* mpe;\n    cmsStageSignature Type;\n    void** ElemPtr;\n\n    // Make sure same number of elements\n    if (cmsPipelineStageCount(Lut) != n) return FALSE;\n\n    va_start(args, n);\n\n    // Iterate across asked types\n    mpe = Lut ->Elements;\n    for (i=0; i < n; i++) {\n\n        // Get asked type\n        Type  = (cmsStageSignature)va_arg(args, cmsStageSignature);\n        if (mpe ->Type != Type) {\n\n            va_end(args);       // Mismatch. We are done.\n            return FALSE;\n        }\n        mpe = mpe ->Next;\n    }\n\n    // Found a combination, fill pointers if not NULL\n    mpe = Lut ->Elements;\n    for (i=0; i < n; i++) {\n\n        ElemPtr = va_arg(args, void**);\n        if (ElemPtr != NULL)\n            *ElemPtr = mpe;\n\n        mpe = mpe ->Next;\n    }\n\n    va_end(args);\n    return TRUE;\n}\n\n// Below there are implementations for several types of elements. Each type may be implemented by a\n// evaluation function, a duplication function, a function to free resources and a constructor.\n\n// *************************************************************************************************\n// Type cmsSigCurveSetElemType (curves)\n// *************************************************************************************************\n\ncmsToneCurve** _cmsStageGetPtrToCurveSet(const cmsStage* mpe)\n{\n    _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) mpe ->Data;\n\n    return Data ->TheCurves;\n}\n\nstatic\nvoid EvaluateCurves(const cmsFloat32Number In[],\n                    cmsFloat32Number Out[],\n                    const cmsStage *mpe)\n{\n    _cmsStageToneCurvesData* Data;\n    cmsUInt32Number i;\n\n    _cmsAssert(mpe != NULL);\n\n    Data = (_cmsStageToneCurvesData*) mpe ->Data;\n    if (Data == NULL) return;\n\n    if (Data ->TheCurves == NULL) return;\n\n    for (i=0; i < Data ->nCurves; i++) {\n        Out[i] = cmsEvalToneCurveFloat(Data ->TheCurves[i], In[i]);\n    }\n}\n\nstatic\nvoid CurveSetElemTypeFree(cmsStage* mpe)\n{\n    _cmsStageToneCurvesData* Data;\n    cmsUInt32Number i;\n\n    _cmsAssert(mpe != NULL);\n\n    Data = (_cmsStageToneCurvesData*) mpe ->Data;\n    if (Data == NULL) return;\n\n    if (Data ->TheCurves != NULL) {\n        for (i=0; i < Data ->nCurves; i++) {\n            if (Data ->TheCurves[i] != NULL)\n                cmsFreeToneCurve(Data ->TheCurves[i]);\n        }\n    }\n    _cmsFree(mpe ->ContextID, Data ->TheCurves);\n    _cmsFree(mpe ->ContextID, Data);\n}\n\n\nstatic\nvoid* CurveSetDup(cmsStage* mpe)\n{\n    _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) mpe ->Data;\n    _cmsStageToneCurvesData* NewElem;\n    cmsUInt32Number i;\n\n    NewElem = (_cmsStageToneCurvesData*) _cmsMallocZero(mpe ->ContextID, sizeof(_cmsStageToneCurvesData));\n    if (NewElem == NULL) return NULL;\n\n    NewElem ->nCurves   = Data ->nCurves;\n    NewElem ->TheCurves = (cmsToneCurve**) _cmsCalloc(mpe ->ContextID, NewElem ->nCurves, sizeof(cmsToneCurve*));\n\n    if (NewElem ->TheCurves == NULL) goto Error;\n\n    for (i=0; i < NewElem ->nCurves; i++) {\n\n        // Duplicate each curve. It may fail.\n        NewElem ->TheCurves[i] = cmsDupToneCurve(Data ->TheCurves[i]);\n        if (NewElem ->TheCurves[i] == NULL) goto Error;\n\n\n    }\n    return (void*) NewElem;\n\nError:\n\n    if (NewElem ->TheCurves != NULL) {\n        for (i=0; i < NewElem ->nCurves; i++) {\n            if (NewElem ->TheCurves[i])\n                cmsFreeToneCurve(NewElem ->TheCurves[i]);\n        }\n    }\n    _cmsFree(mpe ->ContextID, NewElem ->TheCurves);\n    _cmsFree(mpe ->ContextID, NewElem);\n    return NULL;\n}\n\n\n// Curves == NULL forces identity curves\ncmsStage* CMSEXPORT cmsStageAllocToneCurves(cmsContext ContextID, cmsUInt32Number nChannels, cmsToneCurve* const Curves[])\n{\n    cmsUInt32Number i;\n    _cmsStageToneCurvesData* NewElem;\n    cmsStage* NewMPE;\n\n\n    NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigCurveSetElemType, nChannels, nChannels,\n                                     EvaluateCurves, CurveSetDup, CurveSetElemTypeFree, NULL );\n    if (NewMPE == NULL) return NULL;\n\n    NewElem = (_cmsStageToneCurvesData*) _cmsMallocZero(ContextID, sizeof(_cmsStageToneCurvesData));\n    if (NewElem == NULL) {\n        cmsStageFree(NewMPE);\n        return NULL;\n    }\n\n    NewMPE ->Data  = (void*) NewElem;\n\n    NewElem ->nCurves   = nChannels;\n    NewElem ->TheCurves = (cmsToneCurve**) _cmsCalloc(ContextID, nChannels, sizeof(cmsToneCurve*));\n    if (NewElem ->TheCurves == NULL) {\n        cmsStageFree(NewMPE);\n        return NULL;\n    }\n\n    for (i=0; i < nChannels; i++) {\n\n        if (Curves == NULL) {\n            NewElem ->TheCurves[i] = cmsBuildGamma(ContextID, 1.0);\n        }\n        else {\n            NewElem ->TheCurves[i] = cmsDupToneCurve(Curves[i]);\n        }\n\n        if (NewElem ->TheCurves[i] == NULL) {\n            cmsStageFree(NewMPE);\n            return NULL;\n        }\n\n    }\n\n   return NewMPE;\n}\n\n\n// Create a bunch of identity curves\ncmsStage* _cmsStageAllocIdentityCurves(cmsContext ContextID, int nChannels)\n{\n    cmsStage* mpe = cmsStageAllocToneCurves(ContextID, nChannels, NULL);\n\n    if (mpe == NULL) return NULL;\n    mpe ->Implements = cmsSigIdentityElemType;\n    return mpe;\n}\n\n\n// *************************************************************************************************\n// Type cmsSigMatrixElemType (Matrices)\n// *************************************************************************************************\n\n\n// Special care should be taken here because precision loss. A temporary cmsFloat64Number buffer is being used\nstatic\nvoid EvaluateMatrix(const cmsFloat32Number In[],\n                    cmsFloat32Number Out[],\n                    const cmsStage *mpe)\n{\n    cmsUInt32Number i, j;\n    _cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data;\n    cmsFloat64Number Tmp;\n\n    // Input is already in 0..1.0 notation\n    for (i=0; i < mpe ->OutputChannels; i++) {\n\n        Tmp = 0;\n        for (j=0; j < mpe->InputChannels; j++) {\n            Tmp += In[j] * Data->Double[i*mpe->InputChannels + j];\n        }\n\n        if (Data ->Offset != NULL)\n            Tmp += Data->Offset[i];\n\n        Out[i] = (cmsFloat32Number) Tmp;\n    }\n\n\n    // Output in 0..1.0 domain\n}\n\n\n// Duplicate a yet-existing matrix element\nstatic\nvoid* MatrixElemDup(cmsStage* mpe)\n{\n    _cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data;\n    _cmsStageMatrixData* NewElem;\n    cmsUInt32Number sz;\n\n    NewElem = (_cmsStageMatrixData*) _cmsMallocZero(mpe ->ContextID, sizeof(_cmsStageMatrixData));\n    if (NewElem == NULL) return NULL;\n\n    sz = mpe ->InputChannels * mpe ->OutputChannels;\n\n    NewElem ->Double = (cmsFloat64Number*) _cmsDupMem(mpe ->ContextID, Data ->Double, sz * sizeof(cmsFloat64Number)) ;\n\n    if (Data ->Offset)\n        NewElem ->Offset = (cmsFloat64Number*) _cmsDupMem(mpe ->ContextID,\n                                                Data ->Offset, mpe -> OutputChannels * sizeof(cmsFloat64Number)) ;\n\n    return (void*) NewElem;\n}\n\n\nstatic\nvoid MatrixElemTypeFree(cmsStage* mpe)\n{\n    _cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data;\n    if (Data == NULL)\n        return;\n    if (Data ->Double)\n        _cmsFree(mpe ->ContextID, Data ->Double);\n\n    if (Data ->Offset)\n        _cmsFree(mpe ->ContextID, Data ->Offset);\n\n    _cmsFree(mpe ->ContextID, mpe ->Data);\n}\n\n\n\ncmsStage*  CMSEXPORT cmsStageAllocMatrix(cmsContext ContextID, cmsUInt32Number Rows, cmsUInt32Number Cols,\n                                     const cmsFloat64Number* Matrix, const cmsFloat64Number* Offset)\n{\n    cmsUInt32Number i, n;\n    _cmsStageMatrixData* NewElem;\n    cmsStage* NewMPE;\n\n    n = Rows * Cols;\n\n    // Check for overflow\n    if (n == 0) return NULL;\n    if (n >= UINT_MAX / Cols) return NULL;\n    if (n >= UINT_MAX / Rows) return NULL;\n    if (n < Rows || n < Cols) return NULL;\n\n    NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigMatrixElemType, Cols, Rows,\n                                     EvaluateMatrix, MatrixElemDup, MatrixElemTypeFree, NULL );\n    if (NewMPE == NULL) return NULL;\n\n\n    NewElem = (_cmsStageMatrixData*) _cmsMallocZero(ContextID, sizeof(_cmsStageMatrixData));\n    if (NewElem == NULL) return NULL;\n\n\n    NewElem ->Double = (cmsFloat64Number*) _cmsCalloc(ContextID, n, sizeof(cmsFloat64Number));\n\n    if (NewElem->Double == NULL) {\n        MatrixElemTypeFree(NewMPE);\n        return NULL;\n    }\n\n    for (i=0; i < n; i++) {\n        NewElem ->Double[i] = Matrix[i];\n    }\n\n\n    if (Offset != NULL) {\n\n        NewElem ->Offset = (cmsFloat64Number*) _cmsCalloc(ContextID, Cols, sizeof(cmsFloat64Number));\n        if (NewElem->Offset == NULL) {\n           MatrixElemTypeFree(NewMPE);\n           return NULL;\n        }\n\n        for (i=0; i < Cols; i++) {\n                NewElem ->Offset[i] = Offset[i];\n        }\n\n    }\n\n    NewMPE ->Data  = (void*) NewElem;\n    return NewMPE;\n}\n\n\n// *************************************************************************************************\n// Type cmsSigCLutElemType\n// *************************************************************************************************\n\n\n// Evaluate in true floating point\nstatic\nvoid EvaluateCLUTfloat(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe)\n{\n    _cmsStageCLutData* Data = (_cmsStageCLutData*) mpe ->Data;\n\n    Data -> Params ->Interpolation.LerpFloat(In, Out, Data->Params);\n}\n\n\n// Convert to 16 bits, evaluate, and back to floating point\nstatic\nvoid EvaluateCLUTfloatIn16(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe)\n{\n    _cmsStageCLutData* Data = (_cmsStageCLutData*) mpe ->Data;\n    cmsUInt16Number In16[MAX_STAGE_CHANNELS], Out16[MAX_STAGE_CHANNELS];\n\n    _cmsAssert(mpe ->InputChannels  <= MAX_STAGE_CHANNELS);\n    _cmsAssert(mpe ->OutputChannels <= MAX_STAGE_CHANNELS);\n\n    FromFloatTo16(In, In16, mpe ->InputChannels);\n    Data -> Params ->Interpolation.Lerp16(In16, Out16, Data->Params);\n    From16ToFloat(Out16, Out,  mpe ->OutputChannels);\n}\n\n\n// Given an hypercube of b dimensions, with Dims[] number of nodes by dimension, calculate the total amount of nodes\nstatic\ncmsUInt32Number CubeSize(const cmsUInt32Number Dims[], cmsUInt32Number b)\n{\n    cmsUInt32Number rv, dim;\n\n    _cmsAssert(Dims != NULL);\n\n    for (rv = 1; b > 0; b--) {\n\n        dim = Dims[b-1];\n        if (dim == 0) return 0;  // Error\n\n        rv *= dim;\n\n        // Check for overflow\n        if (rv > UINT_MAX / dim) return 0;\n    }\n\n    return rv;\n}\n\nstatic\nvoid* CLUTElemDup(cmsStage* mpe)\n{\n    _cmsStageCLutData* Data = (_cmsStageCLutData*) mpe ->Data;\n    _cmsStageCLutData* NewElem;\n\n\n    NewElem = (_cmsStageCLutData*) _cmsMallocZero(mpe ->ContextID, sizeof(_cmsStageCLutData));\n    if (NewElem == NULL) return NULL;\n\n    NewElem ->nEntries       = Data ->nEntries;\n    NewElem ->HasFloatValues = Data ->HasFloatValues;\n\n    if (Data ->Tab.T) {\n\n        if (Data ->HasFloatValues) {\n            NewElem ->Tab.TFloat = (cmsFloat32Number*) _cmsDupMem(mpe ->ContextID, Data ->Tab.TFloat, Data ->nEntries * sizeof (cmsFloat32Number));\n            if (NewElem ->Tab.TFloat == NULL)\n                goto Error;\n        } else {\n            NewElem ->Tab.T = (cmsUInt16Number*) _cmsDupMem(mpe ->ContextID, Data ->Tab.T, Data ->nEntries * sizeof (cmsUInt16Number));\n            if (NewElem ->Tab.TFloat == NULL)\n                goto Error;\n        }\n    }\n\n    NewElem ->Params   = _cmsComputeInterpParamsEx(mpe ->ContextID,\n                                                   Data ->Params ->nSamples,\n                                                   Data ->Params ->nInputs,\n                                                   Data ->Params ->nOutputs,\n                                                   NewElem ->Tab.T,\n                                                   Data ->Params ->dwFlags);\n    if (NewElem->Params != NULL)\n        return (void*) NewElem;\n Error:\n    if (NewElem->Tab.T)\n        // This works for both types\n        _cmsFree(mpe ->ContextID, NewElem -> Tab.T);\n    _cmsFree(mpe ->ContextID, NewElem);\n    return NULL;\n}\n\n\nstatic\nvoid CLutElemTypeFree(cmsStage* mpe)\n{\n\n    _cmsStageCLutData* Data = (_cmsStageCLutData*) mpe ->Data;\n\n    // Already empty\n    if (Data == NULL) return;\n\n    // This works for both types\n    if (Data -> Tab.T)\n        _cmsFree(mpe ->ContextID, Data -> Tab.T);\n\n    _cmsFreeInterpParams(Data ->Params);\n    _cmsFree(mpe ->ContextID, mpe ->Data);\n}\n\n\n// Allocates a 16-bit multidimensional CLUT. This is evaluated at 16-bit precision. Table may have different\n// granularity on each dimension.\ncmsStage* CMSEXPORT cmsStageAllocCLut16bitGranular(cmsContext ContextID,\n                                         const cmsUInt32Number clutPoints[],\n                                         cmsUInt32Number inputChan,\n                                         cmsUInt32Number outputChan,\n                                         const cmsUInt16Number* Table)\n{\n    cmsUInt32Number i, n;\n    _cmsStageCLutData* NewElem;\n    cmsStage* NewMPE;\n\n    _cmsAssert(clutPoints != NULL);\n\n    if (inputChan > MAX_INPUT_DIMENSIONS) {\n        cmsSignalError(ContextID, cmsERROR_RANGE, \"Too many input channels (%d channels, max=%d)\", inputChan, MAX_INPUT_DIMENSIONS);\n        return NULL;\n    }\n\n    NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigCLutElemType, inputChan, outputChan,\n                                     EvaluateCLUTfloatIn16, CLUTElemDup, CLutElemTypeFree, NULL );\n\n    if (NewMPE == NULL) return NULL;\n\n    NewElem = (_cmsStageCLutData*) _cmsMallocZero(ContextID, sizeof(_cmsStageCLutData));\n    if (NewElem == NULL) {\n        cmsStageFree(NewMPE);\n        return NULL;\n    }\n\n    NewMPE ->Data  = (void*) NewElem;\n\n    NewElem -> nEntries = n = outputChan * CubeSize(clutPoints, inputChan);\n    NewElem -> HasFloatValues = FALSE;\n\n    if (n == 0) {\n        cmsStageFree(NewMPE);\n        return NULL;\n    }\n\n\n    NewElem ->Tab.T  = (cmsUInt16Number*) _cmsCalloc(ContextID, n, sizeof(cmsUInt16Number));\n    if (NewElem ->Tab.T == NULL) {\n        cmsStageFree(NewMPE);\n        return NULL;\n    }\n\n    if (Table != NULL) {\n        for (i=0; i < n; i++) {\n            NewElem ->Tab.T[i] = Table[i];\n        }\n    }\n\n    NewElem ->Params = _cmsComputeInterpParamsEx(ContextID, clutPoints, inputChan, outputChan, NewElem ->Tab.T, CMS_LERP_FLAGS_16BITS);\n    if (NewElem ->Params == NULL) {\n        cmsStageFree(NewMPE);\n        return NULL;\n    }\n\n    return NewMPE;\n}\n\ncmsStage* CMSEXPORT cmsStageAllocCLut16bit(cmsContext ContextID,\n                                    cmsUInt32Number nGridPoints,\n                                    cmsUInt32Number inputChan,\n                                    cmsUInt32Number outputChan,\n                                    const cmsUInt16Number* Table)\n{\n    cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS];\n    int i;\n\n   // Our resulting LUT would be same gridpoints on all dimensions\n    for (i=0; i < MAX_INPUT_DIMENSIONS; i++)\n        Dimensions[i] = nGridPoints;\n\n    return cmsStageAllocCLut16bitGranular(ContextID, Dimensions, inputChan, outputChan, Table);\n}\n\n\ncmsStage* CMSEXPORT cmsStageAllocCLutFloat(cmsContext ContextID,\n                                       cmsUInt32Number nGridPoints,\n                                       cmsUInt32Number inputChan,\n                                       cmsUInt32Number outputChan,\n                                       const cmsFloat32Number* Table)\n{\n   cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS];\n   int i;\n\n    // Our resulting LUT would be same gridpoints on all dimensions\n    for (i=0; i < MAX_INPUT_DIMENSIONS; i++)\n        Dimensions[i] = nGridPoints;\n\n    return cmsStageAllocCLutFloatGranular(ContextID, Dimensions, inputChan, outputChan, Table);\n}\n\n\n\ncmsStage* CMSEXPORT cmsStageAllocCLutFloatGranular(cmsContext ContextID, const cmsUInt32Number clutPoints[], cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsFloat32Number* Table)\n{\n    cmsUInt32Number i, n;\n    _cmsStageCLutData* NewElem;\n    cmsStage* NewMPE;\n\n    _cmsAssert(clutPoints != NULL);\n\n    if (inputChan > MAX_INPUT_DIMENSIONS) {\n        cmsSignalError(ContextID, cmsERROR_RANGE, \"Too many input channels (%d channels, max=%d)\", inputChan, MAX_INPUT_DIMENSIONS);\n        return NULL;\n    }\n\n    NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigCLutElemType, inputChan, outputChan,\n                                             EvaluateCLUTfloat, CLUTElemDup, CLutElemTypeFree, NULL);\n    if (NewMPE == NULL) return NULL;\n\n\n    NewElem = (_cmsStageCLutData*) _cmsMallocZero(ContextID, sizeof(_cmsStageCLutData));\n    if (NewElem == NULL) {\n        cmsStageFree(NewMPE);\n        return NULL;\n    }\n\n    NewMPE ->Data  = (void*) NewElem;\n\n    // There is a potential integer overflow on conputing n and nEntries.\n    NewElem -> nEntries = n = outputChan * CubeSize(clutPoints, inputChan);\n    NewElem -> HasFloatValues = TRUE;\n\n    if (n == 0) {\n        cmsStageFree(NewMPE);\n        return NULL;\n    }\n\n    NewElem ->Tab.TFloat  = (cmsFloat32Number*) _cmsCalloc(ContextID, n, sizeof(cmsFloat32Number));\n    if (NewElem ->Tab.TFloat == NULL) {\n        cmsStageFree(NewMPE);\n        return NULL;\n    }\n\n    if (Table != NULL) {\n        for (i=0; i < n; i++) {\n            NewElem ->Tab.TFloat[i] = Table[i];\n        }\n    }\n\n    NewElem ->Params = _cmsComputeInterpParamsEx(ContextID, clutPoints,  inputChan, outputChan, NewElem ->Tab.TFloat, CMS_LERP_FLAGS_FLOAT);\n    if (NewElem ->Params == NULL) {\n        cmsStageFree(NewMPE);\n        return NULL;\n    }\n\n    return NewMPE;\n}\n\n\nstatic\nint IdentitySampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void * Cargo)\n{\n    int nChan = *(int*) Cargo;\n    int i;\n\n    for (i=0; i < nChan; i++)\n        Out[i] = In[i];\n\n    return 1;\n}\n\n// Creates an MPE that just copies input to output\ncmsStage* _cmsStageAllocIdentityCLut(cmsContext ContextID, int nChan)\n{\n    cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS];\n    cmsStage* mpe ;\n    int i;\n\n    for (i=0; i < MAX_INPUT_DIMENSIONS; i++)\n        Dimensions[i] = 2;\n\n    mpe = cmsStageAllocCLut16bitGranular(ContextID, Dimensions, nChan, nChan, NULL);\n    if (mpe == NULL) return NULL;\n\n    if (!cmsStageSampleCLut16bit(mpe, IdentitySampler, &nChan, 0)) {\n        cmsStageFree(mpe);\n        return NULL;\n    }\n\n    mpe ->Implements = cmsSigIdentityElemType;\n    return mpe;\n}\n\n\n\n// Quantize a value 0 <= i < MaxSamples to 0..0xffff\ncmsUInt16Number _cmsQuantizeVal(cmsFloat64Number i, int MaxSamples)\n{\n    cmsFloat64Number x;\n\n    x = ((cmsFloat64Number) i * 65535.) / (cmsFloat64Number) (MaxSamples - 1);\n    return _cmsQuickSaturateWord(x);\n}\n\n\n// This routine does a sweep on whole input space, and calls its callback\n// function on knots. returns TRUE if all ok, FALSE otherwise.\ncmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, void * Cargo, cmsUInt32Number dwFlags)\n{\n    int i, t, nTotalPoints, index, rest;\n    int nInputs, nOutputs;\n    cmsUInt32Number* nSamples;\n    cmsUInt16Number In[MAX_INPUT_DIMENSIONS+1], Out[MAX_STAGE_CHANNELS];\n    _cmsStageCLutData* clut;\n\n    if (mpe == NULL) return FALSE;\n\n    clut = (_cmsStageCLutData*) mpe->Data;\n\n    if (clut == NULL) return FALSE;\n\n    nSamples = clut->Params ->nSamples;\n    nInputs  = clut->Params ->nInputs;\n    nOutputs = clut->Params ->nOutputs;\n\n    if (nInputs <= 0) return FALSE;\n    if (nOutputs <= 0) return FALSE;\n    if (nInputs > MAX_INPUT_DIMENSIONS) return FALSE;\n    if (nOutputs >= MAX_STAGE_CHANNELS) return FALSE;\n\n    nTotalPoints = CubeSize(nSamples, nInputs);\n    if (nTotalPoints == 0) return FALSE;\n\n    index = 0;\n    for (i = 0; i < nTotalPoints; i++) {\n\n        rest = i;\n        for (t = nInputs-1; t >=0; --t) {\n\n            cmsUInt32Number  Colorant = rest % nSamples[t];\n\n            rest /= nSamples[t];\n\n            In[t] = _cmsQuantizeVal(Colorant, nSamples[t]);\n        }\n\n        if (clut ->Tab.T != NULL) {\n            for (t=0; t < nOutputs; t++)\n                Out[t] = clut->Tab.T[index + t];\n        }\n\n        if (!Sampler(In, Out, Cargo))\n            return FALSE;\n\n        if (!(dwFlags & SAMPLER_INSPECT)) {\n\n            if (clut ->Tab.T != NULL) {\n                for (t=0; t < nOutputs; t++)\n                    clut->Tab.T[index + t] = Out[t];\n            }\n        }\n\n        index += nOutputs;\n    }\n\n    return TRUE;\n}\n\n// Same as anterior, but for floting point\ncmsBool CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler, void * Cargo, cmsUInt32Number dwFlags)\n{\n    int i, t, nTotalPoints, index, rest;\n    int nInputs, nOutputs;\n    cmsUInt32Number* nSamples;\n    cmsFloat32Number In[MAX_INPUT_DIMENSIONS+1], Out[MAX_STAGE_CHANNELS];\n    _cmsStageCLutData* clut = (_cmsStageCLutData*) mpe->Data;\n\n    nSamples = clut->Params ->nSamples;\n    nInputs  = clut->Params ->nInputs;\n    nOutputs = clut->Params ->nOutputs;\n\n    if (nInputs <= 0) return FALSE;\n    if (nOutputs <= 0) return FALSE;\n    if (nInputs  > MAX_INPUT_DIMENSIONS) return FALSE;\n    if (nOutputs >= MAX_STAGE_CHANNELS) return FALSE;\n\n    nTotalPoints = CubeSize(nSamples, nInputs);\n    if (nTotalPoints == 0) return FALSE;\n\n    index = 0;\n    for (i = 0; i < nTotalPoints; i++) {\n\n        rest = i;\n        for (t = nInputs-1; t >=0; --t) {\n\n            cmsUInt32Number  Colorant = rest % nSamples[t];\n\n            rest /= nSamples[t];\n\n            In[t] =  (cmsFloat32Number) (_cmsQuantizeVal(Colorant, nSamples[t]) / 65535.0);\n        }\n\n        if (clut ->Tab.TFloat != NULL) {\n            for (t=0; t < nOutputs; t++)\n                Out[t] = clut->Tab.TFloat[index + t];\n        }\n\n        if (!Sampler(In, Out, Cargo))\n            return FALSE;\n\n        if (!(dwFlags & SAMPLER_INSPECT)) {\n\n            if (clut ->Tab.TFloat != NULL) {\n                for (t=0; t < nOutputs; t++)\n                    clut->Tab.TFloat[index + t] = Out[t];\n            }\n        }\n\n        index += nOutputs;\n    }\n\n    return TRUE;\n}\n\n\n\n// This routine does a sweep on whole input space, and calls its callback\n// function on knots. returns TRUE if all ok, FALSE otherwise.\ncmsBool CMSEXPORT cmsSliceSpace16(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[],\n                                         cmsSAMPLER16 Sampler, void * Cargo)\n{\n    int i, t, nTotalPoints, rest;\n    cmsUInt16Number In[cmsMAXCHANNELS];\n\n    if (nInputs >= cmsMAXCHANNELS) return FALSE;\n\n    nTotalPoints = CubeSize(clutPoints, nInputs);\n    if (nTotalPoints == 0) return FALSE;\n\n    for (i = 0; i < nTotalPoints; i++) {\n\n        rest = i;\n        for (t = nInputs-1; t >=0; --t) {\n\n            cmsUInt32Number  Colorant = rest % clutPoints[t];\n\n            rest /= clutPoints[t];\n            In[t] = _cmsQuantizeVal(Colorant, clutPoints[t]);\n\n        }\n\n        if (!Sampler(In, NULL, Cargo))\n            return FALSE;\n    }\n\n    return TRUE;\n}\n\ncmsInt32Number CMSEXPORT cmsSliceSpaceFloat(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[],\n                                            cmsSAMPLERFLOAT Sampler, void * Cargo)\n{\n    int i, t, nTotalPoints, rest;\n    cmsFloat32Number In[cmsMAXCHANNELS];\n\n    if (nInputs >= cmsMAXCHANNELS) return FALSE;\n\n    nTotalPoints = CubeSize(clutPoints, nInputs);\n    if (nTotalPoints == 0) return FALSE;\n\n    for (i = 0; i < nTotalPoints; i++) {\n\n        rest = i;\n        for (t = nInputs-1; t >=0; --t) {\n\n            cmsUInt32Number  Colorant = rest % clutPoints[t];\n\n            rest /= clutPoints[t];\n            In[t] =  (cmsFloat32Number) (_cmsQuantizeVal(Colorant, clutPoints[t]) / 65535.0);\n\n        }\n\n        if (!Sampler(In, NULL, Cargo))\n            return FALSE;\n    }\n\n    return TRUE;\n}\n\n// ********************************************************************************\n// Type cmsSigLab2XYZElemType\n// ********************************************************************************\n\n\nstatic\nvoid EvaluateLab2XYZ(const cmsFloat32Number In[],\n                     cmsFloat32Number Out[],\n                     const cmsStage *mpe)\n{\n    cmsCIELab Lab;\n    cmsCIEXYZ XYZ;\n    const cmsFloat64Number XYZadj = MAX_ENCODEABLE_XYZ;\n\n    // V4 rules\n    Lab.L = In[0] * 100.0;\n    Lab.a = In[1] * 255.0 - 128.0;\n    Lab.b = In[2] * 255.0 - 128.0;\n\n    cmsLab2XYZ(NULL, &XYZ, &Lab);\n\n    // From XYZ, range 0..19997 to 0..1.0, note that 1.99997 comes from 0xffff\n    // encoded as 1.15 fixed point, so 1 + (32767.0 / 32768.0)\n\n    Out[0] = (cmsFloat32Number) ((cmsFloat64Number) XYZ.X / XYZadj);\n    Out[1] = (cmsFloat32Number) ((cmsFloat64Number) XYZ.Y / XYZadj);\n    Out[2] = (cmsFloat32Number) ((cmsFloat64Number) XYZ.Z / XYZadj);\n    return;\n\n    cmsUNUSED_PARAMETER(mpe);\n}\n\n\n// No dup or free routines needed, as the structure has no pointers in it.\ncmsStage* _cmsStageAllocLab2XYZ(cmsContext ContextID)\n{\n    return _cmsStageAllocPlaceholder(ContextID, cmsSigLab2XYZElemType, 3, 3, EvaluateLab2XYZ, NULL, NULL, NULL);\n}\n\n// ********************************************************************************\n\n// v2 L=100 is supposed to be placed on 0xFF00. There is no reasonable\n// number of gridpoints that would make exact match. However, a prelinearization\n// of 258 entries, would map 0xFF00 exactly on entry 257, and this is good to avoid scum dot.\n// Almost all what we need but unfortunately, the rest of entries should be scaled by\n// (255*257/256) and this is not exact.\n\ncmsStage* _cmsStageAllocLabV2ToV4curves(cmsContext ContextID)\n{\n    cmsStage* mpe;\n    cmsToneCurve* LabTable[3];\n    int i, j;\n\n    LabTable[0] = cmsBuildTabulatedToneCurve16(ContextID, 258, NULL);\n    LabTable[1] = cmsBuildTabulatedToneCurve16(ContextID, 258, NULL);\n    LabTable[2] = cmsBuildTabulatedToneCurve16(ContextID, 258, NULL);\n\n    for (j=0; j < 3; j++) {\n\n        if (LabTable[j] == NULL) {\n            cmsFreeToneCurveTriple(LabTable);\n            return NULL;\n        }\n\n        // We need to map * (0xffff / 0xff00), thats same as (257 / 256)\n        // So we can use 258-entry tables to do the trick (i / 257) * (255 * 257) * (257 / 256);\n        for (i=0; i < 257; i++)  {\n\n            LabTable[j]->Table16[i] = (cmsUInt16Number) ((i * 0xffff + 0x80) >> 8);\n        }\n\n        LabTable[j] ->Table16[257] = 0xffff;\n    }\n\n    mpe = cmsStageAllocToneCurves(ContextID, 3, LabTable);\n    cmsFreeToneCurveTriple(LabTable);\n\n    if (mpe == NULL) return NULL;\n    mpe ->Implements = cmsSigLabV2toV4;\n    return mpe;\n}\n\n// ********************************************************************************\n\n// Matrix-based conversion, which is more accurate, but slower and cannot properly be saved in devicelink profiles\ncmsStage* _cmsStageAllocLabV2ToV4(cmsContext ContextID)\n{\n    static const cmsFloat64Number V2ToV4[] = { 65535.0/65280.0, 0, 0,\n                                     0, 65535.0/65280.0, 0,\n                                     0, 0, 65535.0/65280.0\n                                     };\n\n    cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, V2ToV4, NULL);\n\n    if (mpe == NULL) return mpe;\n    mpe ->Implements = cmsSigLabV2toV4;\n    return mpe;\n}\n\n\n// Reverse direction\ncmsStage* _cmsStageAllocLabV4ToV2(cmsContext ContextID)\n{\n    static const cmsFloat64Number V4ToV2[] = { 65280.0/65535.0, 0, 0,\n                                     0, 65280.0/65535.0, 0,\n                                     0, 0, 65280.0/65535.0\n                                     };\n\n     cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, V4ToV2, NULL);\n\n    if (mpe == NULL) return mpe;\n    mpe ->Implements = cmsSigLabV4toV2;\n    return mpe;\n}\n\n\n// To Lab to float. Note that the MPE gives numbers in normal Lab range\n// and we need 0..1.0 range for the formatters\n// L* : 0...100 => 0...1.0  (L* / 100)\n// ab* : -128..+127 to 0..1  ((ab* + 128) / 255)\n\ncmsStage* _cmsStageNormalizeFromLabFloat(cmsContext ContextID)\n{\n    static const cmsFloat64Number a1[] = {\n        1.0/100.0, 0, 0,\n        0, 1.0/255.0, 0,\n        0, 0, 1.0/255.0\n    };\n\n    static const cmsFloat64Number o1[] = {\n        0,\n        128.0/255.0,\n        128.0/255.0\n    };\n\n    cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, a1, o1);\n\n    if (mpe == NULL) return mpe;\n    mpe ->Implements = cmsSigLab2FloatPCS;\n    return mpe;\n}\n\n// Fom XYZ to floating point PCS\ncmsStage* _cmsStageNormalizeFromXyzFloat(cmsContext ContextID)\n{\n#define n (32768.0/65535.0)\n    static const cmsFloat64Number a1[] = {\n        n, 0, 0,\n        0, n, 0,\n        0, 0, n\n    };\n#undef n\n\n    cmsStage *mpe =  cmsStageAllocMatrix(ContextID, 3, 3, a1, NULL);\n\n    if (mpe == NULL) return mpe;\n    mpe ->Implements = cmsSigXYZ2FloatPCS;\n    return mpe;\n}\n\ncmsStage* _cmsStageNormalizeToLabFloat(cmsContext ContextID)\n{\n    static const cmsFloat64Number a1[] = {\n        100.0, 0, 0,\n        0, 255.0, 0,\n        0, 0, 255.0\n    };\n\n    static const cmsFloat64Number o1[] = {\n        0,\n        -128.0,\n        -128.0\n    };\n\n    cmsStage *mpe =  cmsStageAllocMatrix(ContextID, 3, 3, a1, o1);\n    if (mpe == NULL) return mpe;\n    mpe ->Implements = cmsSigFloatPCS2Lab;\n    return mpe;\n}\n\ncmsStage* _cmsStageNormalizeToXyzFloat(cmsContext ContextID)\n{\n#define n (65535.0/32768.0)\n\n    static const cmsFloat64Number a1[] = {\n        n, 0, 0,\n        0, n, 0,\n        0, 0, n\n    };\n#undef n\n\n    cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, a1, NULL);\n    if (mpe == NULL) return mpe;\n    mpe ->Implements = cmsSigFloatPCS2XYZ;\n    return mpe;\n}\n\n\n\n// ********************************************************************************\n// Type cmsSigXYZ2LabElemType\n// ********************************************************************************\n\nstatic\nvoid EvaluateXYZ2Lab(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe)\n{\n    cmsCIELab Lab;\n    cmsCIEXYZ XYZ;\n    const cmsFloat64Number XYZadj = MAX_ENCODEABLE_XYZ;\n\n    // From 0..1.0 to XYZ\n\n    XYZ.X = In[0] * XYZadj;\n    XYZ.Y = In[1] * XYZadj;\n    XYZ.Z = In[2] * XYZadj;\n\n    cmsXYZ2Lab(NULL, &Lab, &XYZ);\n\n    // From V4 Lab to 0..1.0\n\n    Out[0] = (cmsFloat32Number) (Lab.L / 100.0);\n    Out[1] = (cmsFloat32Number) ((Lab.a + 128.0) / 255.0);\n    Out[2] = (cmsFloat32Number) ((Lab.b + 128.0) / 255.0);\n    return;\n\n    cmsUNUSED_PARAMETER(mpe);\n}\n\ncmsStage* _cmsStageAllocXYZ2Lab(cmsContext ContextID)\n{\n    return _cmsStageAllocPlaceholder(ContextID, cmsSigXYZ2LabElemType, 3, 3, EvaluateXYZ2Lab, NULL, NULL, NULL);\n\n}\n\n// ********************************************************************************\n\n// For v4, S-Shaped curves are placed in a/b axis to increase resolution near gray\n\ncmsStage* _cmsStageAllocLabPrelin(cmsContext ContextID)\n{\n    cmsToneCurve* LabTable[3];\n    cmsFloat64Number Params[1] =  {2.4} ;\n\n    LabTable[0] = cmsBuildGamma(ContextID, 1.0);\n    LabTable[1] = cmsBuildParametricToneCurve(ContextID, 108, Params);\n    LabTable[2] = cmsBuildParametricToneCurve(ContextID, 108, Params);\n\n    return cmsStageAllocToneCurves(ContextID, 3, LabTable);\n}\n\n\n// Free a single MPE\nvoid CMSEXPORT cmsStageFree(cmsStage* mpe)\n{\n    if (mpe ->FreePtr)\n        mpe ->FreePtr(mpe);\n\n    _cmsFree(mpe ->ContextID, mpe);\n}\n\n\ncmsUInt32Number  CMSEXPORT cmsStageInputChannels(const cmsStage* mpe)\n{\n    return mpe ->InputChannels;\n}\n\ncmsUInt32Number  CMSEXPORT cmsStageOutputChannels(const cmsStage* mpe)\n{\n    return mpe ->OutputChannels;\n}\n\ncmsStageSignature CMSEXPORT cmsStageType(const cmsStage* mpe)\n{\n    return mpe -> Type;\n}\n\nvoid* CMSEXPORT cmsStageData(const cmsStage* mpe)\n{\n    return mpe -> Data;\n}\n\ncmsStage*  CMSEXPORT cmsStageNext(const cmsStage* mpe)\n{\n    return mpe -> Next;\n}\n\n\n// Duplicates an MPE\ncmsStage* CMSEXPORT cmsStageDup(cmsStage* mpe)\n{\n    cmsStage* NewMPE;\n\n    if (mpe == NULL) return NULL;\n    NewMPE = _cmsStageAllocPlaceholder(mpe ->ContextID,\n                                     mpe ->Type,\n                                     mpe ->InputChannels,\n                                     mpe ->OutputChannels,\n                                     mpe ->EvalPtr,\n                                     mpe ->DupElemPtr,\n                                     mpe ->FreePtr,\n                                     NULL);\n    if (NewMPE == NULL) return NULL;\n\n    NewMPE ->Implements = mpe ->Implements;\n\n    if (mpe ->DupElemPtr) {\n\n        NewMPE ->Data = mpe ->DupElemPtr(mpe);\n\n        if (NewMPE->Data == NULL) {\n\n            cmsStageFree(NewMPE);\n            return NULL;\n        }\n\n    } else {\n\n        NewMPE ->Data       = NULL;\n    }\n\n    return NewMPE;\n}\n\n\n// ***********************************************************************************************************\n\n// This function sets up the channel count\n\nstatic\nvoid BlessLUT(cmsPipeline* lut)\n{\n    // We can set the input/ouput channels only if we have elements.\n    if (lut ->Elements != NULL) {\n\n        cmsStage *First, *Last;\n\n        First  = cmsPipelineGetPtrToFirstStage(lut);\n        Last   = cmsPipelineGetPtrToLastStage(lut);\n\n        if (First != NULL)lut ->InputChannels = First ->InputChannels;\n        if (Last != NULL) lut ->OutputChannels = Last ->OutputChannels;\n    }\n}\n\n\n// Default to evaluate the LUT on 16 bit-basis. Precision is retained.\nstatic\nvoid _LUTeval16(register const cmsUInt16Number In[], register cmsUInt16Number Out[],  register const void* D)\n{\n    cmsPipeline* lut = (cmsPipeline*) D;\n    cmsStage *mpe;\n    cmsFloat32Number Storage[2][MAX_STAGE_CHANNELS] = {0.0f};\n    int Phase = 0, NextPhase;\n\n    From16ToFloat(In, &Storage[Phase][0], lut ->InputChannels);\n\n    for (mpe = lut ->Elements;\n         mpe != NULL;\n         mpe = mpe ->Next) {\n\n             NextPhase = Phase ^ 1;\n             mpe ->EvalPtr(&Storage[Phase][0], &Storage[NextPhase][0], mpe);\n             Phase = NextPhase;\n    }\n\n\n    FromFloatTo16(&Storage[Phase][0], Out, lut ->OutputChannels);\n}\n\n\n\n// Does evaluate the LUT on cmsFloat32Number-basis.\nstatic\nvoid _LUTevalFloat(register const cmsFloat32Number In[], register cmsFloat32Number Out[], const void* D)\n{\n    cmsPipeline* lut = (cmsPipeline*) D;\n    cmsStage *mpe;\n    cmsFloat32Number Storage[2][MAX_STAGE_CHANNELS] = {0.0f};\n    int Phase = 0, NextPhase;\n\n    memmove(&Storage[Phase][0], In, lut ->InputChannels  * sizeof(cmsFloat32Number));\n\n    for (mpe = lut ->Elements;\n         mpe != NULL;\n         mpe = mpe ->Next) {\n\n              NextPhase = Phase ^ 1;\n              mpe ->EvalPtr(&Storage[Phase][0], &Storage[NextPhase][0], mpe);\n              Phase = NextPhase;\n    }\n\n    memmove(Out, &Storage[Phase][0], lut ->OutputChannels * sizeof(cmsFloat32Number));\n}\n\n\n\n\n// LUT Creation & Destruction\n\ncmsPipeline* CMSEXPORT cmsPipelineAlloc(cmsContext ContextID, cmsUInt32Number InputChannels, cmsUInt32Number OutputChannels)\n{\n       cmsPipeline* NewLUT;\n\n       if (InputChannels >= cmsMAXCHANNELS ||\n           OutputChannels >= cmsMAXCHANNELS) return NULL;\n\n       NewLUT = (cmsPipeline*) _cmsMallocZero(ContextID, sizeof(cmsPipeline));\n       if (NewLUT == NULL) return NULL;\n\n\n       NewLUT -> InputChannels  = InputChannels;\n       NewLUT -> OutputChannels = OutputChannels;\n\n       NewLUT ->Eval16Fn    = _LUTeval16;\n       NewLUT ->EvalFloatFn = _LUTevalFloat;\n       NewLUT ->DupDataFn   = NULL;\n       NewLUT ->FreeDataFn  = NULL;\n       NewLUT ->Data        = NewLUT;\n       NewLUT ->ContextID   = ContextID;\n\n       BlessLUT(NewLUT);\n\n       return NewLUT;\n}\n\ncmsContext CMSEXPORT cmsGetPipelineContextID(const cmsPipeline* lut)\n{\n    _cmsAssert(lut != NULL);\n    return lut ->ContextID;\n}\n\ncmsUInt32Number CMSEXPORT cmsPipelineInputChannels(const cmsPipeline* lut)\n{\n    _cmsAssert(lut != NULL);\n    return lut ->InputChannels;\n}\n\ncmsUInt32Number CMSEXPORT cmsPipelineOutputChannels(const cmsPipeline* lut)\n{\n    _cmsAssert(lut != NULL);\n    return lut ->OutputChannels;\n}\n\n// Free a profile elements LUT\nvoid CMSEXPORT cmsPipelineFree(cmsPipeline* lut)\n{\n    cmsStage *mpe, *Next;\n\n    if (lut == NULL) return;\n\n    for (mpe = lut ->Elements;\n        mpe != NULL;\n        mpe = Next) {\n\n            Next = mpe ->Next;\n            cmsStageFree(mpe);\n    }\n\n    if (lut ->FreeDataFn) lut ->FreeDataFn(lut ->ContextID, lut ->Data);\n\n    _cmsFree(lut ->ContextID, lut);\n}\n\n\n// Default to evaluate the LUT on 16 bit-basis.\nvoid CMSEXPORT cmsPipelineEval16(const cmsUInt16Number In[], cmsUInt16Number Out[],  const cmsPipeline* lut)\n{\n    _cmsAssert(lut != NULL);\n    lut ->Eval16Fn(In, Out, lut->Data);\n}\n\n\n// Does evaluate the LUT on cmsFloat32Number-basis.\nvoid CMSEXPORT cmsPipelineEvalFloat(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsPipeline* lut)\n{\n    _cmsAssert(lut != NULL);\n    lut ->EvalFloatFn(In, Out, lut);\n}\n\n\n\n// Duplicates a LUT\ncmsPipeline* CMSEXPORT cmsPipelineDup(const cmsPipeline* lut)\n{\n    cmsPipeline* NewLUT;\n    cmsStage *NewMPE, *Anterior = NULL, *mpe;\n    cmsBool  First = TRUE;\n\n    if (lut == NULL) return NULL;\n\n    NewLUT = cmsPipelineAlloc(lut ->ContextID, lut ->InputChannels, lut ->OutputChannels);\n    if (NewLUT == NULL) return NULL;\n\n    for (mpe = lut ->Elements;\n         mpe != NULL;\n         mpe = mpe ->Next) {\n\n             NewMPE = cmsStageDup(mpe);\n\n             if (NewMPE == NULL) {\n                 cmsPipelineFree(NewLUT);\n                 return NULL;\n             }\n\n             if (First) {\n                 NewLUT ->Elements = NewMPE;\n                 First = FALSE;\n             }\n             else {\n                Anterior ->Next = NewMPE;\n             }\n\n            Anterior = NewMPE;\n    }\n\n    NewLUT ->Eval16Fn    = lut ->Eval16Fn;\n    NewLUT ->EvalFloatFn = lut ->EvalFloatFn;\n    NewLUT ->DupDataFn   = lut ->DupDataFn;\n    NewLUT ->FreeDataFn  = lut ->FreeDataFn;\n\n    if (NewLUT ->DupDataFn != NULL)\n        NewLUT ->Data = NewLUT ->DupDataFn(lut ->ContextID, lut->Data);\n\n\n    NewLUT ->SaveAs8Bits    = lut ->SaveAs8Bits;\n\n    BlessLUT(NewLUT);\n    return NewLUT;\n}\n\n\nint CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage* mpe)\n{\n    cmsStage* Anterior = NULL, *pt;\n\n    if (lut == NULL || mpe == NULL)\n        return FALSE;\n\n    switch (loc) {\n\n        case cmsAT_BEGIN:\n            mpe ->Next = lut ->Elements;\n            lut ->Elements = mpe;\n            break;\n\n        case cmsAT_END:\n\n            if (lut ->Elements == NULL)\n                lut ->Elements = mpe;\n            else {\n\n                for (pt = lut ->Elements;\n                     pt != NULL;\n                     pt = pt -> Next) Anterior = pt;\n\n                Anterior ->Next = mpe;\n                mpe ->Next = NULL;\n            }\n            break;\n        default:;\n            return FALSE;\n    }\n\n    BlessLUT(lut);\n    return TRUE;\n}\n\n// Unlink an element and return the pointer to it\nvoid CMSEXPORT cmsPipelineUnlinkStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage** mpe)\n{\n    cmsStage *Anterior, *pt, *Last;\n    cmsStage *Unlinked = NULL;\n\n\n    // If empty LUT, there is nothing to remove\n    if (lut ->Elements == NULL) {\n        if (mpe) *mpe = NULL;\n        return;\n    }\n\n    // On depending on the strategy...\n    switch (loc) {\n\n        case cmsAT_BEGIN:\n            {\n                cmsStage* elem = lut ->Elements;\n\n                lut ->Elements = elem -> Next;\n                elem ->Next = NULL;\n                Unlinked = elem;\n\n            }\n            break;\n\n        case cmsAT_END:\n            Anterior = Last = NULL;\n            for (pt = lut ->Elements;\n                pt != NULL;\n                pt = pt -> Next) {\n                    Anterior = Last;\n                    Last = pt;\n            }\n\n            Unlinked = Last;  // Next already points to NULL\n\n            // Truncate the chain\n            if (Anterior)\n                Anterior ->Next = NULL;\n            else\n                lut ->Elements = NULL;\n            break;\n        default:;\n    }\n\n    if (mpe)\n        *mpe = Unlinked;\n    else\n        cmsStageFree(Unlinked);\n\n    BlessLUT(lut);\n}\n\n\n// Concatenate two LUT into a new single one\ncmsBool  CMSEXPORT cmsPipelineCat(cmsPipeline* l1, const cmsPipeline* l2)\n{\n    cmsStage* mpe;\n\n    // If both LUTS does not have elements, we need to inherit\n    // the number of channels\n    if (l1 ->Elements == NULL && l2 ->Elements == NULL) {\n        l1 ->InputChannels  = l2 ->InputChannels;\n        l1 ->OutputChannels = l2 ->OutputChannels;\n    }\n\n    // Cat second\n    for (mpe = l2 ->Elements;\n         mpe != NULL;\n         mpe = mpe ->Next) {\n\n            // We have to dup each element\n            if (!cmsPipelineInsertStage(l1, cmsAT_END, cmsStageDup(mpe)))\n                return FALSE;\n    }\n\n    BlessLUT(l1);\n    return TRUE;\n}\n\n\ncmsBool CMSEXPORT cmsPipelineSetSaveAs8bitsFlag(cmsPipeline* lut, cmsBool On)\n{\n    cmsBool Anterior = lut ->SaveAs8Bits;\n\n    lut ->SaveAs8Bits = On;\n    return Anterior;\n}\n\n\ncmsStage* CMSEXPORT cmsPipelineGetPtrToFirstStage(const cmsPipeline* lut)\n{\n    return lut ->Elements;\n}\n\ncmsStage* CMSEXPORT cmsPipelineGetPtrToLastStage(const cmsPipeline* lut)\n{\n    cmsStage *mpe, *Anterior = NULL;\n\n    for (mpe = lut ->Elements; mpe != NULL; mpe = mpe ->Next)\n        Anterior = mpe;\n\n    return Anterior;\n}\n\ncmsUInt32Number CMSEXPORT cmsPipelineStageCount(const cmsPipeline* lut)\n{\n    cmsStage *mpe;\n    cmsUInt32Number n;\n\n    for (n=0, mpe = lut ->Elements; mpe != NULL; mpe = mpe ->Next)\n            n++;\n\n    return n;\n}\n\n// This function may be used to set the optional evaluator and a block of private data. If private data is being used, an optional\n// duplicator and free functions should also be specified in order to duplicate the LUT construct. Use NULL to inhibit such functionality.\nvoid CMSEXPORT _cmsPipelineSetOptimizationParameters(cmsPipeline* Lut,\n                                        _cmsOPTeval16Fn Eval16,\n                                        void* PrivateData,\n                                        _cmsFreeUserDataFn FreePrivateDataFn,\n                                        _cmsDupUserDataFn  DupPrivateDataFn)\n{\n\n    Lut ->Eval16Fn = Eval16;\n    Lut ->DupDataFn = DupPrivateDataFn;\n    Lut ->FreeDataFn = FreePrivateDataFn;\n    Lut ->Data = PrivateData;\n}\n\n\n// ----------------------------------------------------------- Reverse interpolation\n// Here's how it goes. The derivative Df(x) of the function f is the linear\n// transformation that best approximates f near the point x. It can be represented\n// by a matrix A whose entries are the partial derivatives of the components of f\n// with respect to all the coordinates. This is know as the Jacobian\n//\n// The best linear approximation to f is given by the matrix equation:\n//\n// y-y0 = A (x-x0)\n//\n// So, if x0 is a good \"guess\" for the zero of f, then solving for the zero of this\n// linear approximation will give a \"better guess\" for the zero of f. Thus let y=0,\n// and since y0=f(x0) one can solve the above equation for x. This leads to the\n// Newton's method formula:\n//\n// xn+1 = xn - A-1 f(xn)\n//\n// where xn+1 denotes the (n+1)-st guess, obtained from the n-th guess xn in the\n// fashion described above. Iterating this will give better and better approximations\n// if you have a \"good enough\" initial guess.\n\n\n#define JACOBIAN_EPSILON            0.001f\n#define INVERSION_MAX_ITERATIONS    30\n\n// Increment with reflexion on boundary\nstatic\nvoid IncDelta(cmsFloat32Number *Val)\n{\n    if (*Val < (1.0 - JACOBIAN_EPSILON))\n\n        *Val += JACOBIAN_EPSILON;\n\n    else\n        *Val -= JACOBIAN_EPSILON;\n\n}\n\n\n\n// Euclidean distance between two vectors of n elements each one\nstatic\ncmsFloat32Number EuclideanDistance(cmsFloat32Number a[], cmsFloat32Number b[], int n)\n{\n    cmsFloat32Number sum = 0;\n    int i;\n\n    for (i=0; i < n; i++) {\n        cmsFloat32Number dif = b[i] - a[i];\n        sum +=  dif * dif;\n    }\n\n    return sqrtf(sum);\n}\n\n\n// Evaluate a LUT in reverse direction. It only searches on 3->3 LUT. Uses Newton method\n//\n// x1 <- x - [J(x)]^-1 * f(x)\n//\n// lut: The LUT on where to do the search\n// Target: LabK, 3 values of Lab plus destination K which is fixed\n// Result: The obtained CMYK\n// Hint:   Location where begin the search\n\ncmsBool CMSEXPORT cmsPipelineEvalReverseFloat(cmsFloat32Number Target[],\n                                              cmsFloat32Number Result[],\n                                              cmsFloat32Number Hint[],\n                                              const cmsPipeline* lut)\n{\n    cmsUInt32Number  i, j;\n    cmsFloat64Number  error, LastError = 1E20;\n    cmsFloat32Number  fx[4], x[4], xd[4], fxd[4];\n    cmsVEC3 tmp, tmp2;\n    cmsMAT3 Jacobian;\n    \n    // Only 3->3 and 4->3 are supported\n    if (lut ->InputChannels != 3 && lut ->InputChannels != 4) return FALSE;\n    if (lut ->OutputChannels != 3) return FALSE;\n   \n    // Take the hint as starting point if specified\n    if (Hint == NULL) {\n\n        // Begin at any point, we choose 1/3 of CMY axis\n        x[0] = x[1] = x[2] = 0.3f;\n    }\n    else {\n\n        // Only copy 3 channels from hint...\n        for (j=0; j < 3; j++)\n            x[j] = Hint[j];\n    }\n\n    // If Lut is 4-dimensions, then grab target[3], which is fixed\n    if (lut ->InputChannels == 4) {\n        x[3] = Target[3];\n    }\n    else x[3] = 0; // To keep lint happy\n\n\n    // Iterate\n    for (i = 0; i < INVERSION_MAX_ITERATIONS; i++) {\n\n        // Get beginning fx\n        cmsPipelineEvalFloat(x, fx, lut);\n\n        // Compute error\n        error = EuclideanDistance(fx, Target, 3);\n\n        // If not convergent, return last safe value\n        if (error >= LastError)\n            break;\n\n        // Keep latest values\n        LastError     = error;\n        for (j=0; j < lut ->InputChannels; j++)\n                Result[j] = x[j];\n\n        // Found an exact match?\n        if (error <= 0)\n            break;\n\n        // Obtain slope (the Jacobian)\n        for (j = 0; j < 3; j++) {\n\n            xd[0] = x[0];\n            xd[1] = x[1];\n            xd[2] = x[2];\n            xd[3] = x[3];  // Keep fixed channel\n\n            IncDelta(&xd[j]);\n\n            cmsPipelineEvalFloat(xd, fxd, lut);\n\n            Jacobian.v[0].n[j] = ((fxd[0] - fx[0]) / JACOBIAN_EPSILON);\n            Jacobian.v[1].n[j] = ((fxd[1] - fx[1]) / JACOBIAN_EPSILON);\n            Jacobian.v[2].n[j] = ((fxd[2] - fx[2]) / JACOBIAN_EPSILON);\n        }\n\n        // Solve system\n        tmp2.n[0] = fx[0] - Target[0];\n        tmp2.n[1] = fx[1] - Target[1];\n        tmp2.n[2] = fx[2] - Target[2];\n\n        if (!_cmsMAT3solve(&tmp, &Jacobian, &tmp2))\n            return FALSE;\n\n        // Move our guess\n        x[0] -= (cmsFloat32Number) tmp.n[0];\n        x[1] -= (cmsFloat32Number) tmp.n[1];\n        x[2] -= (cmsFloat32Number) tmp.n[2];\n\n        // Some clipping....\n        for (j=0; j < 3; j++) {\n            if (x[j] < 0) x[j] = 0;\n            else\n                if (x[j] > 1.0) x[j] = 1.0;\n        }\n    }\n\n    return TRUE;\n}\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/src/cmsmd5.c",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2012 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n\n#include \"lcms2_internal.h\"\n\n#ifdef CMS_USE_BIG_ENDIAN\n\nstatic\nvoid byteReverse(cmsUInt8Number * buf, cmsUInt32Number longs)\n{\n    do {\n\n        cmsUInt32Number t = _cmsAdjustEndianess32(*(cmsUInt32Number *) buf);\n        *(cmsUInt32Number *) buf = t;\n        buf += sizeof(cmsUInt32Number);\n\n    } while (--longs);\n\n}\n\n#else\n#define byteReverse(buf, len)\n#endif\n\n\ntypedef struct {\n\n    cmsUInt32Number buf[4];\n    cmsUInt32Number bits[2];\n    cmsUInt8Number in[64];\n    cmsContext ContextID;\n\n} _cmsMD5;\n\n#define F1(x, y, z) (z ^ (x & (y ^ z)))\n#define F2(x, y, z) F1(z, x, y)\n#define F3(x, y, z) (x ^ y ^ z)\n#define F4(x, y, z) (y ^ (x | ~z))\n\n#define STEP(f, w, x, y, z, data, s) \\\n    ( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )\n\n\nstatic\nvoid MD5_Transform(cmsUInt32Number buf[4], cmsUInt32Number in[16])\n\n{\n    register cmsUInt32Number a, b, c, d;\n\n    a = buf[0];\n    b = buf[1];\n    c = buf[2];\n    d = buf[3];\n\n    STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);\n    STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);\n    STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);\n    STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);\n    STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);\n    STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);\n    STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);\n    STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);\n    STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);\n    STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);\n    STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);\n    STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);\n    STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);\n    STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);\n    STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);\n    STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);\n\n    STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);\n    STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);\n    STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);\n    STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);\n    STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);\n    STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);\n    STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);\n    STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);\n    STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);\n    STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);\n    STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);\n    STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);\n    STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);\n    STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);\n    STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);\n    STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);\n\n    STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);\n    STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);\n    STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);\n    STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);\n    STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);\n    STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);\n    STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);\n    STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);\n    STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);\n    STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);\n    STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);\n    STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);\n    STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);\n    STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);\n    STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);\n    STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);\n\n    STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);\n    STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);\n    STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);\n    STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);\n    STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);\n    STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);\n    STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);\n    STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);\n    STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);\n    STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);\n    STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);\n    STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);\n    STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);\n    STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);\n    STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);\n    STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);\n\n    buf[0] += a;\n    buf[1] += b;\n    buf[2] += c;\n    buf[3] += d;\n}\n\n\n// Create a MD5 object\nstatic\ncmsHANDLE  MD5alloc(cmsContext ContextID)\n{\n    _cmsMD5* ctx = (_cmsMD5*) _cmsMallocZero(ContextID, sizeof(_cmsMD5));\n    if (ctx == NULL) return NULL;\n\n    ctx ->ContextID = ContextID;\n\n    ctx->buf[0] = 0x67452301;\n    ctx->buf[1] = 0xefcdab89;\n    ctx->buf[2] = 0x98badcfe;\n    ctx->buf[3] = 0x10325476;\n\n    ctx->bits[0] = 0;\n    ctx->bits[1] = 0;\n\n    return (cmsHANDLE) ctx;\n}\n\n\nstatic\nvoid MD5add(cmsHANDLE Handle, cmsUInt8Number* buf, cmsUInt32Number len)\n{\n    _cmsMD5* ctx = (_cmsMD5*) Handle;\n    cmsUInt32Number t;\n\n    t = ctx->bits[0];\n    if ((ctx->bits[0] = t + (len << 3)) < t)\n        ctx->bits[1]++;\n\n    ctx->bits[1] += len >> 29;\n\n    t = (t >> 3) & 0x3f;\n\n    if (t) {\n\n        cmsUInt8Number *p = (cmsUInt8Number *) ctx->in + t;\n\n        t = 64 - t;\n        if (len < t) {\n            memmove(p, buf, len);\n            return;\n        }\n\n        memmove(p, buf, t);\n        byteReverse(ctx->in, 16);\n\n        MD5_Transform(ctx->buf, (cmsUInt32Number *) ctx->in);\n        buf += t;\n        len -= t;\n    }\n\n    while (len >= 64) {\n        memmove(ctx->in, buf, 64);\n        byteReverse(ctx->in, 16);\n        MD5_Transform(ctx->buf, (cmsUInt32Number *) ctx->in);\n        buf += 64;\n        len -= 64;\n    }\n\n    memmove(ctx->in, buf, len);\n}\n\n// Destroy the object and return the checksum\nstatic\nvoid MD5finish(cmsProfileID* ProfileID,  cmsHANDLE Handle)\n{\n    _cmsMD5* ctx = (_cmsMD5*) Handle;\n    cmsUInt32Number count;\n    cmsUInt8Number *p;\n\n    count = (ctx->bits[0] >> 3) & 0x3F;\n\n    p = ctx->in + count;\n    *p++ = 0x80;\n\n    count = 64 - 1 - count;\n\n    if (count < 8) {\n\n        memset(p, 0, count);\n        byteReverse(ctx->in, 16);\n        MD5_Transform(ctx->buf, (cmsUInt32Number *) ctx->in);\n\n        memset(ctx->in, 0, 56);\n    } else {\n        memset(p, 0, count - 8);\n    }\n    byteReverse(ctx->in, 14);\n\n    ((cmsUInt32Number *) ctx->in)[14] = ctx->bits[0];\n    ((cmsUInt32Number *) ctx->in)[15] = ctx->bits[1];\n\n    MD5_Transform(ctx->buf, (cmsUInt32Number *) ctx->in);\n\n    byteReverse((cmsUInt8Number *) ctx->buf, 4);\n    memmove(ProfileID ->ID8, ctx->buf, 16);\n\n    _cmsFree(ctx ->ContextID, ctx);\n}\n\n\n\n// Assuming io points to an ICC profile, compute and store MD5 checksum\n// In the header, rendering intentent, attributes and ID should be set to zero\n// before computing MD5 checksum (per 6.1.13 in ICC spec)\n\ncmsBool CMSEXPORT cmsMD5computeID(cmsHPROFILE hProfile)\n{\n    cmsContext   ContextID;\n    cmsUInt32Number BytesNeeded;\n    cmsUInt8Number* Mem = NULL;\n    cmsHANDLE  MD5 = NULL;\n    _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;\n    _cmsICCPROFILE Keep;\n\n    _cmsAssert(hProfile != NULL);\n\n    ContextID = cmsGetProfileContextID(hProfile);\n\n    // Save a copy of the profile header\n    memmove(&Keep, Icc, sizeof(_cmsICCPROFILE));\n\n    // Set RI, attributes and ID\n    memset(&Icc ->attributes, 0, sizeof(Icc ->attributes));\n    Icc ->RenderingIntent = 0;\n    memset(&Icc ->ProfileID, 0, sizeof(Icc ->ProfileID));\n\n    // Compute needed storage\n    if (!cmsSaveProfileToMem(hProfile, NULL, &BytesNeeded)) goto Error;\n\n    // Allocate memory\n    Mem = (cmsUInt8Number*) _cmsMalloc(ContextID, BytesNeeded);\n    if (Mem == NULL) goto Error;\n\n    // Save to temporary storage\n    if (!cmsSaveProfileToMem(hProfile, Mem, &BytesNeeded)) goto Error;\n\n    // Create MD5 object\n    MD5 = MD5alloc(ContextID);\n    if (MD5 == NULL) goto Error;\n\n    // Add all bytes\n    MD5add(MD5, Mem, BytesNeeded);\n\n    // Temp storage is no longer needed\n    _cmsFree(ContextID, Mem);\n\n    // Restore header\n    memmove(Icc, &Keep, sizeof(_cmsICCPROFILE));\n\n    // And store the ID\n    MD5finish(&Icc ->ProfileID,  MD5);\n    return TRUE;\n\nError:\n\n    // Free resources as something went wrong\n    // \"MD5\" cannot be other than NULL here, so no need to free it\n    if (Mem != NULL) _cmsFree(ContextID, Mem);\n    memmove(Icc, &Keep, sizeof(_cmsICCPROFILE));\n    return FALSE;\n}\n\ncmsBool CMSEXPORT cmsMD5computeIDExt(const void* buf, unsigned long size, unsigned char ProfileID[16])\n{\n\tcmsHANDLE  MD5;\n\tcmsUInt8Number* Mem;\n\n\tif (buf == NULL)\n\t\treturn FALSE;\n    MD5 = NULL;\n\tMem = (cmsUInt8Number*)_cmsMalloc(NULL,size);\n\tmemmove(Mem,buf,size);\n\t// Create MD5 object\n    MD5 = MD5alloc(NULL);\n    if (MD5 == NULL) goto Error;\n\n\t// Add all bytes\n    MD5add(MD5, Mem, size);\n\n\t// Temp storage is no longer needed\n    _cmsFree(NULL, Mem);\n\n\t// And store the ID\n    MD5finish((cmsProfileID*)ProfileID,  MD5);\n\treturn TRUE;\nError:\n\tif (MD5 != NULL) _cmsFree(NULL, MD5);\n\treturn FALSE;\n}\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/src/cmsmtrx.c",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2012 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n//\n\n#include \"lcms2_internal.h\"\n\n\n#define DSWAP(x, y)     {cmsFloat64Number tmp = (x); (x)=(y); (y)=tmp;}\n\n\n// Initiate a vector\nvoid CMSEXPORT _cmsVEC3init(cmsVEC3* r, cmsFloat64Number x, cmsFloat64Number y, cmsFloat64Number z)\n{\n    r -> n[VX] = x;\n    r -> n[VY] = y;\n    r -> n[VZ] = z;\n}\n\n// Vector substraction\nvoid CMSEXPORT _cmsVEC3minus(cmsVEC3* r, const cmsVEC3* a, const cmsVEC3* b)\n{\n  r -> n[VX] = a -> n[VX] - b -> n[VX];\n  r -> n[VY] = a -> n[VY] - b -> n[VY];\n  r -> n[VZ] = a -> n[VZ] - b -> n[VZ];\n}\n\n// Vector cross product\nvoid CMSEXPORT _cmsVEC3cross(cmsVEC3* r, const cmsVEC3* u, const cmsVEC3* v)\n{\n    r ->n[VX] = u->n[VY] * v->n[VZ] - v->n[VY] * u->n[VZ];\n    r ->n[VY] = u->n[VZ] * v->n[VX] - v->n[VZ] * u->n[VX];\n    r ->n[VZ] = u->n[VX] * v->n[VY] - v->n[VX] * u->n[VY];\n}\n\n// Vector dot product\ncmsFloat64Number CMSEXPORT _cmsVEC3dot(const cmsVEC3* u, const cmsVEC3* v)\n{\n    return u->n[VX] * v->n[VX] + u->n[VY] * v->n[VY] + u->n[VZ] * v->n[VZ];\n}\n\n// Euclidean length\ncmsFloat64Number CMSEXPORT _cmsVEC3length(const cmsVEC3* a)\n{\n    return sqrt(a ->n[VX] * a ->n[VX] +\n                a ->n[VY] * a ->n[VY] +\n                a ->n[VZ] * a ->n[VZ]);\n}\n\n// Euclidean distance\ncmsFloat64Number CMSEXPORT _cmsVEC3distance(const cmsVEC3* a, const cmsVEC3* b)\n{\n    cmsFloat64Number d1 = a ->n[VX] - b ->n[VX];\n    cmsFloat64Number d2 = a ->n[VY] - b ->n[VY];\n    cmsFloat64Number d3 = a ->n[VZ] - b ->n[VZ];\n\n    return sqrt(d1*d1 + d2*d2 + d3*d3);\n}\n\n\n\n// 3x3 Identity\nvoid CMSEXPORT _cmsMAT3identity(cmsMAT3* a)\n{\n    _cmsVEC3init(&a-> v[0], 1.0, 0.0, 0.0);\n    _cmsVEC3init(&a-> v[1], 0.0, 1.0, 0.0);\n    _cmsVEC3init(&a-> v[2], 0.0, 0.0, 1.0);\n}\n\nstatic\ncmsBool CloseEnough(cmsFloat64Number a, cmsFloat64Number b)\n{\n    return fabs(b - a) < (1.0 / 65535.0);\n}\n\n\ncmsBool CMSEXPORT _cmsMAT3isIdentity(const cmsMAT3* a)\n{\n    cmsMAT3 Identity;\n    int i, j;\n\n    _cmsMAT3identity(&Identity);\n\n    for (i=0; i < 3; i++)\n        for (j=0; j < 3; j++)\n            if (!CloseEnough(a ->v[i].n[j], Identity.v[i].n[j])) return FALSE;\n\n    return TRUE;\n}\n\n\n// Multiply two matrices\nvoid CMSEXPORT _cmsMAT3per(cmsMAT3* r, const cmsMAT3* a, const cmsMAT3* b)\n{\n#define ROWCOL(i, j) \\\n    a->v[i].n[0]*b->v[0].n[j] + a->v[i].n[1]*b->v[1].n[j] + a->v[i].n[2]*b->v[2].n[j]\n\n    _cmsVEC3init(&r-> v[0], ROWCOL(0,0), ROWCOL(0,1), ROWCOL(0,2));\n    _cmsVEC3init(&r-> v[1], ROWCOL(1,0), ROWCOL(1,1), ROWCOL(1,2));\n    _cmsVEC3init(&r-> v[2], ROWCOL(2,0), ROWCOL(2,1), ROWCOL(2,2));\n\n#undef ROWCOL //(i, j)\n}\n\n\n\n// Inverse of a matrix b = a^(-1)\ncmsBool  CMSEXPORT _cmsMAT3inverse(const cmsMAT3* a, cmsMAT3* b)\n{\n   cmsFloat64Number det, c0, c1, c2;\n\n   c0 =  a -> v[1].n[1]*a -> v[2].n[2] - a -> v[1].n[2]*a -> v[2].n[1];\n   c1 = -a -> v[1].n[0]*a -> v[2].n[2] + a -> v[1].n[2]*a -> v[2].n[0];\n   c2 =  a -> v[1].n[0]*a -> v[2].n[1] - a -> v[1].n[1]*a -> v[2].n[0];\n\n   det = a -> v[0].n[0]*c0 + a -> v[0].n[1]*c1 + a -> v[0].n[2]*c2;\n\n   if (fabs(det) < MATRIX_DET_TOLERANCE) return FALSE;  // singular matrix; can't invert\n\n   b -> v[0].n[0] = c0/det;\n   b -> v[0].n[1] = (a -> v[0].n[2]*a -> v[2].n[1] - a -> v[0].n[1]*a -> v[2].n[2])/det;\n   b -> v[0].n[2] = (a -> v[0].n[1]*a -> v[1].n[2] - a -> v[0].n[2]*a -> v[1].n[1])/det;\n   b -> v[1].n[0] = c1/det;\n   b -> v[1].n[1] = (a -> v[0].n[0]*a -> v[2].n[2] - a -> v[0].n[2]*a -> v[2].n[0])/det;\n   b -> v[1].n[2] = (a -> v[0].n[2]*a -> v[1].n[0] - a -> v[0].n[0]*a -> v[1].n[2])/det;\n   b -> v[2].n[0] = c2/det;\n   b -> v[2].n[1] = (a -> v[0].n[1]*a -> v[2].n[0] - a -> v[0].n[0]*a -> v[2].n[1])/det;\n   b -> v[2].n[2] = (a -> v[0].n[0]*a -> v[1].n[1] - a -> v[0].n[1]*a -> v[1].n[0])/det;\n\n   return TRUE;\n}\n\n\n// Solve a system in the form Ax = b\ncmsBool  CMSEXPORT _cmsMAT3solve(cmsVEC3* x, cmsMAT3* a, cmsVEC3* b)\n{\n    cmsMAT3 m, a_1;\n\n    memmove(&m, a, sizeof(cmsMAT3));\n\n    if (!_cmsMAT3inverse(&m, &a_1)) return FALSE;  // Singular matrix\n\n    _cmsMAT3eval(x, &a_1, b);\n    return TRUE;\n}\n\n// Evaluate a vector across a matrix\nvoid CMSEXPORT _cmsMAT3eval(cmsVEC3* r, const cmsMAT3* a, const cmsVEC3* v)\n{\n    r->n[VX] = a->v[0].n[VX]*v->n[VX] + a->v[0].n[VY]*v->n[VY] + a->v[0].n[VZ]*v->n[VZ];\n    r->n[VY] = a->v[1].n[VX]*v->n[VX] + a->v[1].n[VY]*v->n[VY] + a->v[1].n[VZ]*v->n[VZ];\n    r->n[VZ] = a->v[2].n[VX]*v->n[VX] + a->v[2].n[VY]*v->n[VY] + a->v[2].n[VZ]*v->n[VZ];\n}\n\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/src/cmsnamed.c",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2012 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n//\n\n#include \"lcms2_internal.h\"\n\n// Multilocalized unicode objects. That is an attempt to encapsulate i18n.\n\n\n// Allocates an empty multi localizad unicode object\ncmsMLU* CMSEXPORT cmsMLUalloc(cmsContext ContextID, cmsUInt32Number nItems)\n{\n    cmsMLU* mlu;\n\n    // nItems should be positive if given\n    if (nItems <= 0) nItems = 2;\n\n    // Create the container\n    mlu = (cmsMLU*) _cmsMallocZero(ContextID, sizeof(cmsMLU));\n    if (mlu == NULL) return NULL;\n\n    mlu ->ContextID = ContextID;\n\n    // Create entry array\n    mlu ->Entries = (_cmsMLUentry*) _cmsCalloc(ContextID, nItems, sizeof(_cmsMLUentry));\n    if (mlu ->Entries == NULL) {\n        _cmsFree(ContextID, mlu);\n        return NULL;\n    }\n\n    // Ok, keep indexes up to date\n    mlu ->AllocatedEntries    = nItems;\n    mlu ->UsedEntries         = 0;\n\n    return mlu;\n}\n\n\n// Grows a mempool table for a MLU. Each time this function is called, mempool size is multiplied times two.\nstatic\ncmsBool GrowMLUpool(cmsMLU* mlu)\n{\n    cmsUInt32Number size;\n    void *NewPtr;\n\n    // Sanity check\n    if (mlu == NULL) return FALSE;\n\n    if (mlu ->PoolSize == 0)\n        size = 256;\n    else\n        size = mlu ->PoolSize * 2;\n\n    // Check for overflow\n    if (size < mlu ->PoolSize) return FALSE;\n\n    // Reallocate the pool\n    NewPtr = _cmsRealloc(mlu ->ContextID, mlu ->MemPool, size);\n    if (NewPtr == NULL) return FALSE;\n\n\n    mlu ->MemPool  = NewPtr;\n    mlu ->PoolSize = size;\n\n    return TRUE;\n}\n\n\n// Grows a entry table for a MLU. Each time this function is called, table size is multiplied times two.\nstatic\ncmsBool GrowMLUtable(cmsMLU* mlu)\n{\n    int AllocatedEntries;\n    _cmsMLUentry *NewPtr;\n\n    // Sanity check\n    if (mlu == NULL) return FALSE;\n\n    AllocatedEntries = mlu ->AllocatedEntries * 2;\n\n    // Check for overflow\n    if (AllocatedEntries / 2 != mlu ->AllocatedEntries) return FALSE;\n\n    // Reallocate the memory\n    NewPtr = (_cmsMLUentry*)_cmsRealloc(mlu ->ContextID, mlu ->Entries, AllocatedEntries*sizeof(_cmsMLUentry));\n    if (NewPtr == NULL) return FALSE;\n\n    mlu ->Entries          = NewPtr;\n    mlu ->AllocatedEntries = AllocatedEntries;\n\n    return TRUE;\n}\n\n\n// Search for a specific entry in the structure. Language and Country are used.\nstatic\nint SearchMLUEntry(cmsMLU* mlu, cmsUInt16Number LanguageCode, cmsUInt16Number CountryCode)\n{\n    int i;\n\n    // Sanity check\n    if (mlu == NULL) return -1;\n\n    // Iterate whole table\n    for (i=0; i < mlu ->UsedEntries; i++) {\n\n        if (mlu ->Entries[i].Country  == CountryCode &&\n            mlu ->Entries[i].Language == LanguageCode) return i;\n    }\n\n    // Not found\n    return -1;\n}\n\n// Add a block of characters to the intended MLU. Language and country are specified.\n// Only one entry for Language/country pair is allowed.\nstatic\ncmsBool AddMLUBlock(cmsMLU* mlu, cmsUInt32Number size, const wchar_t *Block,\n                     cmsUInt16Number LanguageCode, cmsUInt16Number CountryCode)\n{\n    cmsUInt32Number Offset;\n    cmsUInt8Number* Ptr;\n\n    // Sanity check\n    if (mlu == NULL) return FALSE;\n\n    // Is there any room available?\n    if (mlu ->UsedEntries >= mlu ->AllocatedEntries) {\n        if (!GrowMLUtable(mlu)) return FALSE;\n    }\n\n    // Only one ASCII string\n    if (SearchMLUEntry(mlu, LanguageCode, CountryCode) >= 0) return FALSE;  // Only one  is allowed!\n\n    // Check for size\n    while ((mlu ->PoolSize - mlu ->PoolUsed) < size) {\n\n            if (!GrowMLUpool(mlu)) return FALSE;\n    }\n\n    Offset = mlu ->PoolUsed;\n\n    Ptr = (cmsUInt8Number*) mlu ->MemPool;\n    if (Ptr == NULL) return FALSE;\n\n    // Set the entry\n    memmove(Ptr + Offset, Block, size);\n    mlu ->PoolUsed += size;\n\n    mlu ->Entries[mlu ->UsedEntries].StrW     = Offset;\n    mlu ->Entries[mlu ->UsedEntries].Len      = size;\n    mlu ->Entries[mlu ->UsedEntries].Country  = CountryCode;\n    mlu ->Entries[mlu ->UsedEntries].Language = LanguageCode;\n    mlu ->UsedEntries++;\n\n    return TRUE;\n}\n\n\n// Add an ASCII entry.\ncmsBool CMSEXPORT cmsMLUsetASCII(cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], const char* ASCIIString)\n{\n    cmsUInt32Number i, len = (cmsUInt32Number) strlen(ASCIIString)+1;\n    wchar_t* WStr;\n    cmsBool  rc;\n    cmsUInt16Number Lang  = _cmsAdjustEndianess16(*(cmsUInt16Number*) LanguageCode);\n    cmsUInt16Number Cntry = _cmsAdjustEndianess16(*(cmsUInt16Number*) CountryCode);\n\n    if (mlu == NULL) return FALSE;\n\n    WStr = (wchar_t*) _cmsCalloc(mlu ->ContextID, len,  sizeof(wchar_t));\n    if (WStr == NULL) return FALSE;\n\n    for (i=0; i < len; i++)\n        WStr[i] = (wchar_t) ASCIIString[i];\n\n    rc = AddMLUBlock(mlu, len  * sizeof(wchar_t), WStr, Lang, Cntry);\n\n    _cmsFree(mlu ->ContextID, WStr);\n    return rc;\n\n}\n\n// We don't need any wcs support library\nstatic\ncmsUInt32Number mywcslen(const wchar_t *s)\n{\n    const wchar_t *p;\n\n    p = s;\n    while (*p)\n        p++;\n\n    return (cmsUInt32Number)(p - s);\n}\n\n\n// Add a wide entry\ncmsBool  CMSEXPORT cmsMLUsetWide(cmsMLU* mlu, const char Language[3], const char Country[3], const wchar_t* WideString)\n{\n    cmsUInt16Number Lang  = _cmsAdjustEndianess16(*(cmsUInt16Number*) Language);\n    cmsUInt16Number Cntry = _cmsAdjustEndianess16(*(cmsUInt16Number*) Country);\n    cmsUInt32Number len;\n\n    if (mlu == NULL) return FALSE;\n    if (WideString == NULL) return FALSE;\n\n    len = (cmsUInt32Number) (mywcslen(WideString) + 1) * sizeof(wchar_t);\n    return AddMLUBlock(mlu, len, WideString, Lang, Cntry);\n}\n\n// Duplicating a MLU is as easy as copying all members\ncmsMLU* CMSEXPORT cmsMLUdup(const cmsMLU* mlu)\n{\n    cmsMLU* NewMlu = NULL;\n\n    // Duplicating a NULL obtains a NULL\n    if (mlu == NULL) return NULL;\n\n    NewMlu = cmsMLUalloc(mlu ->ContextID, mlu ->UsedEntries);\n    if (NewMlu == NULL) return NULL;\n\n    // Should never happen\n    if (NewMlu ->AllocatedEntries < mlu ->UsedEntries)\n        goto Error;\n\n    // Sanitize...\n    if (NewMlu ->Entries == NULL || mlu ->Entries == NULL)  goto Error;\n\n    memmove(NewMlu ->Entries, mlu ->Entries, mlu ->UsedEntries * sizeof(_cmsMLUentry));\n    NewMlu ->UsedEntries = mlu ->UsedEntries;\n\n    // The MLU may be empty\n    if (mlu ->PoolUsed == 0) {\n        NewMlu ->MemPool = NULL;\n    }\n    else {\n        // It is not empty\n        NewMlu ->MemPool = _cmsMalloc(mlu ->ContextID, mlu ->PoolUsed);\n        if (NewMlu ->MemPool == NULL) goto Error;\n    }\n\n    NewMlu ->PoolSize = mlu ->PoolUsed;\n\n    if (NewMlu ->MemPool == NULL || mlu ->MemPool == NULL) goto Error;\n\n    memmove(NewMlu ->MemPool, mlu->MemPool, mlu ->PoolUsed);\n    NewMlu ->PoolUsed = mlu ->PoolUsed;\n\n    return NewMlu;\n\nError:\n\n    if (NewMlu != NULL) cmsMLUfree(NewMlu);\n    return NULL;\n}\n\n// Free any used memory\nvoid CMSEXPORT cmsMLUfree(cmsMLU* mlu)\n{\n    if (mlu) {\n\n        if (mlu -> Entries) _cmsFree(mlu ->ContextID, mlu->Entries);\n        if (mlu -> MemPool) _cmsFree(mlu ->ContextID, mlu->MemPool);\n\n        _cmsFree(mlu ->ContextID, mlu);\n    }\n}\n\n\n// The algorithm first searches for an exact match of country and language, if not found it uses\n// the Language. If none is found, first entry is used instead.\nstatic\nconst wchar_t* _cmsMLUgetWide(const cmsMLU* mlu,\n                              cmsUInt32Number *len,\n                              cmsUInt16Number LanguageCode, cmsUInt16Number CountryCode,\n                              cmsUInt16Number* UsedLanguageCode, cmsUInt16Number* UsedCountryCode)\n{\n    int i;\n    int Best = -1;\n    _cmsMLUentry* v;\n\n    if (mlu == NULL) return NULL;\n\n    if (mlu -> AllocatedEntries <= 0) return NULL;\n\n    for (i=0; i < mlu ->UsedEntries; i++) {\n\n        v = mlu ->Entries + i;\n\n        if (v -> Language == LanguageCode) {\n\n            if (Best == -1) Best = i;\n\n            if (v -> Country == CountryCode) {\n\n                if (UsedLanguageCode != NULL) *UsedLanguageCode = v ->Language;\n                if (UsedCountryCode  != NULL) *UsedCountryCode = v ->Country;\n\n                if (len != NULL) *len = v ->Len;\n\n                return (wchar_t*) ((cmsUInt8Number*) mlu ->MemPool + v -> StrW);        // Found exact match\n            }\n        }\n    }\n\n    // No string found. Return First one\n    if (Best == -1)\n        Best = 0;\n\n    v = mlu ->Entries + Best;\n\n    if (UsedLanguageCode != NULL) *UsedLanguageCode = v ->Language;\n    if (UsedCountryCode  != NULL) *UsedCountryCode = v ->Country;\n\n    if (len != NULL) *len   = v ->Len;\n\n    return(wchar_t*) ((cmsUInt8Number*) mlu ->MemPool + v ->StrW);\n}\n\n\n// Obtain an ASCII representation of the wide string. Setting buffer to NULL returns the len\ncmsUInt32Number CMSEXPORT cmsMLUgetASCII(const cmsMLU* mlu,\n                                       const char LanguageCode[3], const char CountryCode[3],\n                                       char* Buffer, cmsUInt32Number BufferSize)\n{\n    const wchar_t *Wide;\n    cmsUInt32Number  StrLen = 0;\n    cmsUInt32Number ASCIIlen, i;\n\n    cmsUInt16Number Lang  = _cmsAdjustEndianess16(*(cmsUInt16Number*) LanguageCode);\n    cmsUInt16Number Cntry = _cmsAdjustEndianess16(*(cmsUInt16Number*) CountryCode);\n\n    // Sanitize\n    if (mlu == NULL) return 0;\n\n    // Get WideChar\n    Wide = _cmsMLUgetWide(mlu, &StrLen, Lang, Cntry, NULL, NULL);\n    if (Wide == NULL) return 0;\n\n    ASCIIlen = StrLen / sizeof(wchar_t);\n\n    // Maybe we want only to know the len?\n    if (Buffer == NULL) return ASCIIlen + 1; // Note the zero at the end\n\n    // No buffer size means no data\n    if (BufferSize <= 0) return 0;\n\n    // Some clipping may be required\n    if (BufferSize < ASCIIlen + 1)\n        ASCIIlen = BufferSize - 1;\n\n    // Precess each character\n    for (i=0; i < ASCIIlen; i++) {\n\n        if (Wide[i] == 0)\n            Buffer[i] = 0;\n        else\n            Buffer[i] = (char) Wide[i];\n    }\n\n    // We put a termination \"\\0\"\n    Buffer[ASCIIlen] = 0;\n    return ASCIIlen + 1;\n}\n\n// Obtain a wide representation of the MLU, on depending on current locale settings\ncmsUInt32Number CMSEXPORT cmsMLUgetWide(const cmsMLU* mlu,\n                                      const char LanguageCode[3], const char CountryCode[3],\n                                      wchar_t* Buffer, cmsUInt32Number BufferSize)\n{\n    const wchar_t *Wide;\n    cmsUInt32Number  StrLen = 0;\n\n    cmsUInt16Number Lang  = _cmsAdjustEndianess16(*(cmsUInt16Number*) LanguageCode);\n    cmsUInt16Number Cntry = _cmsAdjustEndianess16(*(cmsUInt16Number*) CountryCode);\n\n    // Sanitize\n    if (mlu == NULL) return 0;\n\n    Wide = _cmsMLUgetWide(mlu, &StrLen, Lang, Cntry, NULL, NULL);\n    if (Wide == NULL) return 0;\n\n    // Maybe we want only to know the len?\n    if (Buffer == NULL) return StrLen + sizeof(wchar_t);\n\n  // No buffer size means no data\n    if (BufferSize <= 0) return 0;\n\n    // Some clipping may be required\n    if (BufferSize < StrLen + sizeof(wchar_t))\n        StrLen = BufferSize - + sizeof(wchar_t);\n\n    memmove(Buffer, Wide, StrLen);\n    Buffer[StrLen / sizeof(wchar_t)] = 0;\n\n    return StrLen + sizeof(wchar_t);\n}\n\n\n// Get also the language and country\nCMSAPI cmsBool CMSEXPORT cmsMLUgetTranslation(const cmsMLU* mlu,\n                                              const char LanguageCode[3], const char CountryCode[3],\n                                              char ObtainedLanguage[3], char ObtainedCountry[3])\n{\n    const wchar_t *Wide;\n\n    cmsUInt16Number Lang  = _cmsAdjustEndianess16(*(cmsUInt16Number*) LanguageCode);\n    cmsUInt16Number Cntry = _cmsAdjustEndianess16(*(cmsUInt16Number*) CountryCode);\n    cmsUInt16Number ObtLang, ObtCode;\n\n    // Sanitize\n    if (mlu == NULL) return FALSE;\n\n    Wide = _cmsMLUgetWide(mlu, NULL, Lang, Cntry, &ObtLang, &ObtCode);\n    if (Wide == NULL) return FALSE;\n\n    // Get used language and code\n    *(cmsUInt16Number *)ObtainedLanguage = _cmsAdjustEndianess16(ObtLang);\n    *(cmsUInt16Number *)ObtainedCountry  = _cmsAdjustEndianess16(ObtCode);\n\n    ObtainedLanguage[2] = ObtainedCountry[2] = 0;\n    return TRUE;\n}\n\n\n\n// Get the number of translations in the MLU object\ncmsUInt32Number CMSEXPORT cmsMLUtranslationsCount(const cmsMLU* mlu)\n{\n    if (mlu == NULL) return 0;\n    return mlu->UsedEntries;\n}\n\n// Get the language and country codes for a specific MLU index\ncmsBool CMSEXPORT cmsMLUtranslationsCodes(const cmsMLU* mlu,\n                                          cmsUInt32Number idx,\n                                          char LanguageCode[3],\n                                          char CountryCode[3])\n{\n    _cmsMLUentry *entry;\n\n    if (mlu == NULL) return FALSE;\n\n    if (idx >= (cmsUInt32Number) mlu->UsedEntries) return FALSE;\n\n    entry = &mlu->Entries[idx];\n    \n    *(cmsUInt16Number *)LanguageCode = _cmsAdjustEndianess16(entry->Language);\n    *(cmsUInt16Number *)CountryCode  = _cmsAdjustEndianess16(entry->Country);\n\n    return TRUE;\n}\n\n\n// Named color lists --------------------------------------------------------------------------------------------\n\n// Grow the list to keep at least NumElements\nstatic\ncmsBool  GrowNamedColorList(cmsNAMEDCOLORLIST* v)\n{\n    cmsUInt32Number size;\n    _cmsNAMEDCOLOR * NewPtr;\n\n    if (v == NULL) return FALSE;\n\n    if (v ->Allocated == 0)\n        size = 64;   // Initial guess\n    else\n        size = v ->Allocated * 2;\n\n    // Keep a maximum color lists can grow, 100K entries seems reasonable\n    if (size > 1024*100) return FALSE;\n\n    NewPtr = (_cmsNAMEDCOLOR*) _cmsRealloc(v ->ContextID, v ->List, size * sizeof(_cmsNAMEDCOLOR));\n    if (NewPtr == NULL)\n        return FALSE;\n\n    v ->List      = NewPtr;\n    v ->Allocated = size;\n    return TRUE;\n}\n\n// Allocate a list for n elements\ncmsNAMEDCOLORLIST* CMSEXPORT cmsAllocNamedColorList(cmsContext ContextID, cmsUInt32Number n, cmsUInt32Number ColorantCount, const char* Prefix, const char* Suffix)\n{\n    cmsNAMEDCOLORLIST* v = (cmsNAMEDCOLORLIST*) _cmsMallocZero(ContextID, sizeof(cmsNAMEDCOLORLIST));\n\n    if (v == NULL) return NULL;\n\n    v ->List      = NULL;\n    v ->nColors   = 0;\n    v ->ContextID  = ContextID;\n\n    while (v -> Allocated < n)\n        GrowNamedColorList(v);\n\n    strncpy(v ->Prefix, Prefix, sizeof(v ->Prefix)-1);\n    strncpy(v ->Suffix, Suffix, sizeof(v ->Suffix)-1);\n    v->Prefix[32] = v->Suffix[32] = 0;\n\n    v -> ColorantCount = ColorantCount;\n\n    return v;\n}\n\n// Free a list\nvoid CMSEXPORT cmsFreeNamedColorList(cmsNAMEDCOLORLIST* v)\n{\n    if (v == NULL) return;\n    if (v ->List) _cmsFree(v ->ContextID, v ->List);\n    _cmsFree(v ->ContextID, v);\n}\n\ncmsNAMEDCOLORLIST* CMSEXPORT cmsDupNamedColorList(const cmsNAMEDCOLORLIST* v)\n{\n    cmsNAMEDCOLORLIST* NewNC;\n\n    if (v == NULL) return NULL;\n\n    NewNC= cmsAllocNamedColorList(v ->ContextID, v -> nColors, v ->ColorantCount, v ->Prefix, v ->Suffix);\n    if (NewNC == NULL) return NULL;\n\n    // For really large tables we need this\n    while (NewNC ->Allocated < v ->Allocated)\n        GrowNamedColorList(NewNC);\n\n    memmove(NewNC ->Prefix, v ->Prefix, sizeof(v ->Prefix));\n    memmove(NewNC ->Suffix, v ->Suffix, sizeof(v ->Suffix));\n    NewNC ->ColorantCount = v ->ColorantCount;\n    memmove(NewNC->List, v ->List, v->nColors * sizeof(_cmsNAMEDCOLOR));\n    NewNC ->nColors = v ->nColors;\n    return NewNC;\n}\n\n\n// Append a color to a list. List pointer may change if reallocated\ncmsBool  CMSEXPORT cmsAppendNamedColor(cmsNAMEDCOLORLIST* NamedColorList,\n                                       const char* Name,\n                                       cmsUInt16Number PCS[3], cmsUInt16Number Colorant[cmsMAXCHANNELS])\n{\n    cmsUInt32Number i;\n\n    if (NamedColorList == NULL) return FALSE;\n\n    if (NamedColorList ->nColors + 1 > NamedColorList ->Allocated) {\n        if (!GrowNamedColorList(NamedColorList)) return FALSE;\n    }\n\n    for (i=0; i < NamedColorList ->ColorantCount; i++)\n        NamedColorList ->List[NamedColorList ->nColors].DeviceColorant[i] = Colorant == NULL? 0 : Colorant[i];\n\n    for (i=0; i < 3; i++)\n        NamedColorList ->List[NamedColorList ->nColors].PCS[i] = PCS == NULL ? 0 : PCS[i];\n\n    if (Name != NULL) {\n\n        strncpy(NamedColorList ->List[NamedColorList ->nColors].Name, Name, cmsMAX_PATH-1);\n        NamedColorList ->List[NamedColorList ->nColors].Name[cmsMAX_PATH-1] = 0;\n\n    }\n    else\n        NamedColorList ->List[NamedColorList ->nColors].Name[0] = 0;\n\n\n    NamedColorList ->nColors++;\n    return TRUE;\n}\n\n// Returns number of elements\ncmsUInt32Number CMSEXPORT cmsNamedColorCount(const cmsNAMEDCOLORLIST* NamedColorList)\n{\n     if (NamedColorList == NULL) return 0;\n     return NamedColorList ->nColors;\n}\n\n// Info aboout a given color\ncmsBool  CMSEXPORT cmsNamedColorInfo(const cmsNAMEDCOLORLIST* NamedColorList, cmsUInt32Number nColor,\n                                     char* Name,\n                                     char* Prefix,\n                                     char* Suffix,\n                                     cmsUInt16Number* PCS,\n                                     cmsUInt16Number* Colorant)\n{\n    if (NamedColorList == NULL) return FALSE;\n\n    if (nColor >= cmsNamedColorCount(NamedColorList)) return FALSE;\n\n    if (Name) strcpy(Name, NamedColorList->List[nColor].Name);\n    if (Prefix) strcpy(Prefix, NamedColorList->Prefix);\n    if (Suffix) strcpy(Suffix, NamedColorList->Suffix);\n    if (PCS)\n        memmove(PCS, NamedColorList ->List[nColor].PCS, 3*sizeof(cmsUInt16Number));\n\n    if (Colorant)\n        memmove(Colorant, NamedColorList ->List[nColor].DeviceColorant,\n                                sizeof(cmsUInt16Number) * NamedColorList ->ColorantCount);\n\n\n    return TRUE;\n}\n\n// Search for a given color name (no prefix or suffix)\ncmsInt32Number CMSEXPORT cmsNamedColorIndex(const cmsNAMEDCOLORLIST* NamedColorList, const char* Name)\n{\n    int i, n;\n\n    if (NamedColorList == NULL) return -1;\n    n = cmsNamedColorCount(NamedColorList);\n    for (i=0; i < n; i++) {\n        if (cmsstrcasecmp(Name,  NamedColorList->List[i].Name) == 0)\n            return i;\n    }\n\n    return -1;\n}\n\n// MPE support -----------------------------------------------------------------------------------------------------------------\n\nstatic\nvoid FreeNamedColorList(cmsStage* mpe)\n{\n    cmsNAMEDCOLORLIST* List = (cmsNAMEDCOLORLIST*) mpe ->Data;\n    cmsFreeNamedColorList(List);\n}\n\nstatic\nvoid* DupNamedColorList(cmsStage* mpe)\n{\n    cmsNAMEDCOLORLIST* List = (cmsNAMEDCOLORLIST*) mpe ->Data;\n    return cmsDupNamedColorList(List);\n}\n\nstatic\nvoid EvalNamedColorPCS(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe)\n{\n    cmsNAMEDCOLORLIST* NamedColorList = (cmsNAMEDCOLORLIST*) mpe ->Data;\n    cmsUInt16Number index = (cmsUInt16Number) _cmsQuickSaturateWord(In[0] * 65535.0);\n\n    if (index >= NamedColorList-> nColors) {\n        cmsSignalError(NamedColorList ->ContextID, cmsERROR_RANGE, \"Color %d out of range; ignored\", index);\n    }\n    else {\n\n            // Named color always uses Lab\n            Out[0] = (cmsFloat32Number) (NamedColorList->List[index].PCS[0] / 65535.0);\n            Out[1] = (cmsFloat32Number) (NamedColorList->List[index].PCS[1] / 65535.0);\n            Out[2] = (cmsFloat32Number) (NamedColorList->List[index].PCS[2] / 65535.0);\n    }\n}\n\nstatic\nvoid EvalNamedColor(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe)\n{\n    cmsNAMEDCOLORLIST* NamedColorList = (cmsNAMEDCOLORLIST*) mpe ->Data;\n    cmsUInt16Number index = (cmsUInt16Number) _cmsQuickSaturateWord(In[0] * 65535.0);\n    cmsUInt32Number j;\n\n    if (index >= NamedColorList-> nColors) {\n        cmsSignalError(NamedColorList ->ContextID, cmsERROR_RANGE, \"Color %d out of range; ignored\", index);\n    }\n    else {\n        for (j=0; j < NamedColorList ->ColorantCount; j++)\n            Out[j] = (cmsFloat32Number) (NamedColorList->List[index].DeviceColorant[j] / 65535.0);\n    }\n}\n\n\n// Named color lookup element\ncmsStage* _cmsStageAllocNamedColor(cmsNAMEDCOLORLIST* NamedColorList, cmsBool UsePCS)\n{\n    return _cmsStageAllocPlaceholder(NamedColorList ->ContextID,\n                                   cmsSigNamedColorElemType,\n                                   1, UsePCS ? 3 : NamedColorList ->ColorantCount,\n                                   UsePCS ? EvalNamedColorPCS : EvalNamedColor,\n                                   DupNamedColorList,\n                                   FreeNamedColorList,\n                                   cmsDupNamedColorList(NamedColorList));\n\n}\n\n\n// Retrieve the named color list from a transform. Should be first element in the LUT\ncmsNAMEDCOLORLIST* CMSEXPORT cmsGetNamedColorList(cmsHTRANSFORM xform)\n{\n    _cmsTRANSFORM* v = (_cmsTRANSFORM*) xform;\n    cmsStage* mpe  = v ->Lut->Elements;\n\n    if (mpe ->Type != cmsSigNamedColorElemType) return NULL;\n    return (cmsNAMEDCOLORLIST*) mpe ->Data;\n}\n\n\n// Profile sequence description routines -------------------------------------------------------------------------------------\n\ncmsSEQ* CMSEXPORT cmsAllocProfileSequenceDescription(cmsContext ContextID, cmsUInt32Number n)\n{\n    cmsSEQ* Seq;\n    cmsUInt32Number i;\n\n    if (n == 0) return NULL;\n\n    // In a absolutely arbitrary way, I hereby decide to allow a maxim of 255 profiles linked\n    // in a devicelink. It makes not sense anyway and may be used for exploits, so let's close the door!\n    if (n > 255) return NULL;\n\n    Seq = (cmsSEQ*) _cmsMallocZero(ContextID, sizeof(cmsSEQ));\n    if (Seq == NULL) return NULL;\n\n    Seq -> ContextID = ContextID;\n    Seq -> seq      = (cmsPSEQDESC*) _cmsCalloc(ContextID, n, sizeof(cmsPSEQDESC));\n    Seq -> n        = n;\n\n    if (Seq -> seq == NULL) {\n        _cmsFree(ContextID, Seq);\n        return NULL;\n    }\n\n    for (i=0; i < n; i++) {\n        Seq -> seq[i].Manufacturer = NULL;\n        Seq -> seq[i].Model        = NULL;\n        Seq -> seq[i].Description  = NULL;\n    }\n\n    return Seq;\n}\n\nvoid CMSEXPORT cmsFreeProfileSequenceDescription(cmsSEQ* pseq)\n{\n    cmsUInt32Number i;\n\n    for (i=0; i < pseq ->n; i++) {\n        if (pseq ->seq[i].Manufacturer != NULL) cmsMLUfree(pseq ->seq[i].Manufacturer);\n        if (pseq ->seq[i].Model != NULL) cmsMLUfree(pseq ->seq[i].Model);\n        if (pseq ->seq[i].Description != NULL) cmsMLUfree(pseq ->seq[i].Description);\n    }\n\n    if (pseq ->seq != NULL) _cmsFree(pseq ->ContextID, pseq ->seq);\n    _cmsFree(pseq -> ContextID, pseq);\n}\n\ncmsSEQ* CMSEXPORT cmsDupProfileSequenceDescription(const cmsSEQ* pseq)\n{\n    cmsSEQ *NewSeq;\n    cmsUInt32Number i;\n\n    if (pseq == NULL)\n        return NULL;\n\n    NewSeq = (cmsSEQ*) _cmsMalloc(pseq -> ContextID, sizeof(cmsSEQ));\n    if (NewSeq == NULL) return NULL;\n\n\n    NewSeq -> seq      = (cmsPSEQDESC*) _cmsCalloc(pseq ->ContextID, pseq ->n, sizeof(cmsPSEQDESC));\n    if (NewSeq ->seq == NULL) goto Error;\n\n    NewSeq -> ContextID = pseq ->ContextID;\n    NewSeq -> n        = pseq ->n;\n\n    for (i=0; i < pseq->n; i++) {\n\n        memmove(&NewSeq ->seq[i].attributes, &pseq ->seq[i].attributes, sizeof(cmsUInt64Number));\n\n        NewSeq ->seq[i].deviceMfg   = pseq ->seq[i].deviceMfg;\n        NewSeq ->seq[i].deviceModel = pseq ->seq[i].deviceModel;\n        memmove(&NewSeq ->seq[i].ProfileID, &pseq ->seq[i].ProfileID, sizeof(cmsProfileID));\n        NewSeq ->seq[i].technology  = pseq ->seq[i].technology;\n\n        NewSeq ->seq[i].Manufacturer = cmsMLUdup(pseq ->seq[i].Manufacturer);\n        NewSeq ->seq[i].Model        = cmsMLUdup(pseq ->seq[i].Model);\n        NewSeq ->seq[i].Description  = cmsMLUdup(pseq ->seq[i].Description);\n\n    }\n\n    return NewSeq;\n\nError:\n\n    cmsFreeProfileSequenceDescription(NewSeq);\n    return NULL;\n}\n\n// Dictionaries --------------------------------------------------------------------------------------------------------\n\n// Dictionaries are just very simple linked lists\n\n\ntypedef struct _cmsDICT_struct {\n    cmsDICTentry* head;\n    cmsContext ContextID;\n} _cmsDICT;\n\n\n// Allocate an empty dictionary\ncmsHANDLE CMSEXPORT cmsDictAlloc(cmsContext ContextID)\n{\n    _cmsDICT* dict = (_cmsDICT*) _cmsMallocZero(ContextID, sizeof(_cmsDICT));\n    if (dict == NULL) return NULL;\n\n    dict ->ContextID = ContextID;\n    return (cmsHANDLE) dict;\n\n}\n\n// Dispose resources\nvoid CMSEXPORT cmsDictFree(cmsHANDLE hDict)\n{\n    _cmsDICT* dict = (_cmsDICT*) hDict;\n    cmsDICTentry *entry, *next;\n\n    _cmsAssert(dict != NULL);\n\n    // Walk the list freeing all nodes\n    entry = dict ->head;\n    while (entry != NULL) {\n\n            if (entry ->DisplayName  != NULL) cmsMLUfree(entry ->DisplayName);\n            if (entry ->DisplayValue != NULL) cmsMLUfree(entry ->DisplayValue);\n            if (entry ->Name != NULL) _cmsFree(dict ->ContextID, entry -> Name);\n            if (entry ->Value != NULL) _cmsFree(dict ->ContextID, entry -> Value);\n\n            // Don't fall in the habitual trap...\n            next = entry ->Next;\n            _cmsFree(dict ->ContextID, entry);\n\n            entry = next;\n    }\n\n    _cmsFree(dict ->ContextID, dict);\n}\n\n\n// Duplicate a wide char string\nstatic\nwchar_t* DupWcs(cmsContext ContextID, const wchar_t* ptr)\n{\n    if (ptr == NULL) return NULL;\n    return (wchar_t*) _cmsDupMem(ContextID, ptr, (mywcslen(ptr) + 1) * sizeof(wchar_t));\n}\n\n// Add a new entry to the linked list\ncmsBool CMSEXPORT cmsDictAddEntry(cmsHANDLE hDict, const wchar_t* Name, const wchar_t* Value, const cmsMLU *DisplayName, const cmsMLU *DisplayValue)\n{\n    _cmsDICT* dict = (_cmsDICT*) hDict;\n    cmsDICTentry *entry;\n\n    _cmsAssert(dict != NULL);\n    _cmsAssert(Name != NULL);\n\n    entry = (cmsDICTentry*) _cmsMallocZero(dict ->ContextID, sizeof(cmsDICTentry));\n    if (entry == NULL) return FALSE;\n\n    entry ->DisplayName  = cmsMLUdup(DisplayName);\n    entry ->DisplayValue = cmsMLUdup(DisplayValue);\n    entry ->Name         = DupWcs(dict ->ContextID, Name);\n    entry ->Value        = DupWcs(dict ->ContextID, Value);\n\n    entry ->Next = dict ->head;\n    dict ->head = entry;\n\n    return TRUE;\n}\n\n\n// Duplicates an existing dictionary\ncmsHANDLE CMSEXPORT cmsDictDup(cmsHANDLE hDict)\n{\n    _cmsDICT* old_dict = (_cmsDICT*) hDict;\n    cmsHANDLE hNew;\n    cmsDICTentry *entry;\n\n    _cmsAssert(old_dict != NULL);\n\n    hNew  = cmsDictAlloc(old_dict ->ContextID);\n    if (hNew == NULL) return NULL;\n\n    // Walk the list freeing all nodes\n    entry = old_dict ->head;\n    while (entry != NULL) {\n\n        if (!cmsDictAddEntry(hNew, entry ->Name, entry ->Value, entry ->DisplayName, entry ->DisplayValue)) {\n\n            cmsDictFree(hNew);\n            return NULL;\n        }\n\n        entry = entry -> Next;\n    }\n\n    return hNew;\n}\n\n// Get a pointer to the linked list\nconst cmsDICTentry* CMSEXPORT cmsDictGetEntryList(cmsHANDLE hDict)\n{\n    _cmsDICT* dict = (_cmsDICT*) hDict;\n\n    if (dict == NULL) return NULL;\n    return dict ->head;\n}\n\n// Helper For external languages\nconst cmsDICTentry* CMSEXPORT cmsDictNextEntry(const cmsDICTentry* e)\n{\n     if (e == NULL) return NULL;\n     return e ->Next;\n}\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/src/cmsopt.c",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2011 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n//\n\n#include \"lcms2_internal.h\"\n\n\n//----------------------------------------------------------------------------------\n\n// Optimization for 8 bits, Shaper-CLUT (3 inputs only)\ntypedef struct {\n\n    cmsContext ContextID;\n\n    const cmsInterpParams* p;   // Tetrahedrical interpolation parameters. This is a not-owned pointer.\n\n    cmsUInt16Number rx[256], ry[256], rz[256];\n    cmsUInt32Number X0[256], Y0[256], Z0[256];  // Precomputed nodes and offsets for 8-bit input data\n\n\n} Prelin8Data;\n\n\n// Generic optimization for 16 bits Shaper-CLUT-Shaper (any inputs)\ntypedef struct {\n\n    cmsContext ContextID;\n\n    // Number of channels\n    int nInputs;\n    int nOutputs;\n\n    _cmsInterpFn16 EvalCurveIn16[MAX_INPUT_DIMENSIONS];       // The maximum number of input channels is known in advance\n    cmsInterpParams*  ParamsCurveIn16[MAX_INPUT_DIMENSIONS];\n\n    _cmsInterpFn16 EvalCLUT;            // The evaluator for 3D grid\n    const cmsInterpParams* CLUTparams;  // (not-owned pointer)\n\n\n    _cmsInterpFn16* EvalCurveOut16;       // Points to an array of curve evaluators in 16 bits (not-owned pointer)\n    cmsInterpParams**  ParamsCurveOut16;  // Points to an array of references to interpolation params (not-owned pointer)\n\n\n} Prelin16Data;\n\n\n// Optimization for matrix-shaper in 8 bits. Numbers are operated in n.14 signed, tables are stored in 1.14 fixed\n\ntypedef cmsInt32Number cmsS1Fixed14Number;   // Note that this may hold more than 16 bits!\n\n#define DOUBLE_TO_1FIXED14(x) ((cmsS1Fixed14Number) floor((x) * 16384.0 + 0.5))\n\ntypedef struct {\n\n    cmsContext ContextID;\n\n    cmsS1Fixed14Number Shaper1R[256];  // from 0..255 to 1.14  (0.0...1.0)\n    cmsS1Fixed14Number Shaper1G[256];\n    cmsS1Fixed14Number Shaper1B[256];\n\n    cmsS1Fixed14Number Mat[3][3];     // n.14 to n.14 (needs a saturation after that)\n    cmsS1Fixed14Number Off[3];\n\n    cmsUInt16Number Shaper2R[16385];    // 1.14 to 0..255\n    cmsUInt16Number Shaper2G[16385];\n    cmsUInt16Number Shaper2B[16385];\n\n} MatShaper8Data;\n\n// Curves, optimization is shared between 8 and 16 bits\ntypedef struct {\n\n    cmsContext ContextID;\n\n    int nCurves;                  // Number of curves\n    int nElements;                // Elements in curves\n    cmsUInt16Number** Curves;     // Points to a dynamically  allocated array\n\n} Curves16Data;\n\n\n// Simple optimizations ----------------------------------------------------------------------------------------------------------\n\n\n// Remove an element in linked chain\nstatic\nvoid _RemoveElement(cmsStage** head)\n{\n    cmsStage* mpe = *head;\n    cmsStage* next = mpe ->Next;\n    *head = next;\n    cmsStageFree(mpe);\n}\n\n// Remove all identities in chain. Note that pt actually is a double pointer to the element that holds the pointer.\nstatic\ncmsBool _Remove1Op(cmsPipeline* Lut, cmsStageSignature UnaryOp)\n{\n    cmsStage** pt = &Lut ->Elements;\n    cmsBool AnyOpt = FALSE;\n\n    while (*pt != NULL) {\n\n        if ((*pt) ->Implements == UnaryOp) {\n            _RemoveElement(pt);\n            AnyOpt = TRUE;\n        }\n        else\n            pt = &((*pt) -> Next);\n    }\n\n    return AnyOpt;\n}\n\n// Same, but only if two adjacent elements are found\nstatic\ncmsBool _Remove2Op(cmsPipeline* Lut, cmsStageSignature Op1, cmsStageSignature Op2)\n{\n    cmsStage** pt1;\n    cmsStage** pt2;\n    cmsBool AnyOpt = FALSE;\n\n    pt1 = &Lut ->Elements;\n    if (*pt1 == NULL) return AnyOpt;\n\n    while (*pt1 != NULL) {\n\n        pt2 = &((*pt1) -> Next);\n        if (*pt2 == NULL) return AnyOpt;\n\n        if ((*pt1) ->Implements == Op1 && (*pt2) ->Implements == Op2) {\n            _RemoveElement(pt2);\n            _RemoveElement(pt1);\n            AnyOpt = TRUE;\n        }\n        else\n            pt1 = &((*pt1) -> Next);\n    }\n\n    return AnyOpt;\n}\n\n// Preoptimize just gets rif of no-ops coming paired. Conversion from v2 to v4 followed\n// by a v4 to v2 and vice-versa. The elements are then discarded.\nstatic\ncmsBool PreOptimize(cmsPipeline* Lut)\n{\n    cmsBool AnyOpt = FALSE, Opt;\n\n    do {\n\n        Opt = FALSE;\n\n        // Remove all identities\n        Opt |= _Remove1Op(Lut, cmsSigIdentityElemType);\n\n        // Remove XYZ2Lab followed by Lab2XYZ\n        Opt |= _Remove2Op(Lut, cmsSigXYZ2LabElemType, cmsSigLab2XYZElemType);\n\n        // Remove Lab2XYZ followed by XYZ2Lab\n        Opt |= _Remove2Op(Lut, cmsSigLab2XYZElemType, cmsSigXYZ2LabElemType);\n\n        // Remove V4 to V2 followed by V2 to V4\n        Opt |= _Remove2Op(Lut, cmsSigLabV4toV2, cmsSigLabV2toV4);\n\n        // Remove V2 to V4 followed by V4 to V2\n        Opt |= _Remove2Op(Lut, cmsSigLabV2toV4, cmsSigLabV4toV2);\n\n        // Remove float pcs Lab conversions\n        Opt |= _Remove2Op(Lut, cmsSigLab2FloatPCS, cmsSigFloatPCS2Lab);\n\n        // Remove float pcs Lab conversions\n        Opt |= _Remove2Op(Lut, cmsSigXYZ2FloatPCS, cmsSigFloatPCS2XYZ);\n\n        if (Opt) AnyOpt = TRUE;\n\n    } while (Opt);\n\n    return AnyOpt;\n}\n\nstatic\nvoid Eval16nop1D(register const cmsUInt16Number Input[],\n                 register cmsUInt16Number Output[],\n                 register const struct _cms_interp_struc* p)\n{\n    Output[0] = Input[0];\n\n    cmsUNUSED_PARAMETER(p);\n}\n\nstatic\nvoid PrelinEval16(register const cmsUInt16Number Input[],\n                  register cmsUInt16Number Output[],\n                  register const void* D)\n{\n    Prelin16Data* p16 = (Prelin16Data*) D;\n    cmsUInt16Number  StageABC[MAX_INPUT_DIMENSIONS];\n    cmsUInt16Number  StageDEF[cmsMAXCHANNELS];\n    int i;\n\n    for (i=0; i < p16 ->nInputs; i++) {\n\n        p16 ->EvalCurveIn16[i](&Input[i], &StageABC[i], p16 ->ParamsCurveIn16[i]);\n    }\n\n    p16 ->EvalCLUT(StageABC, StageDEF, p16 ->CLUTparams);\n\n    for (i=0; i < p16 ->nOutputs; i++) {\n\n        p16 ->EvalCurveOut16[i](&StageDEF[i], &Output[i], p16 ->ParamsCurveOut16[i]);\n    }\n}\n\n\nstatic\nvoid PrelinOpt16free(cmsContext ContextID, void* ptr)\n{\n    Prelin16Data* p16 = (Prelin16Data*) ptr;\n\n    _cmsFree(ContextID, p16 ->EvalCurveOut16);\n    _cmsFree(ContextID, p16 ->ParamsCurveOut16);\n\n    _cmsFree(ContextID, p16);\n}\n\nstatic\nvoid* Prelin16dup(cmsContext ContextID, const void* ptr)\n{\n    Prelin16Data* p16 = (Prelin16Data*) ptr;\n    Prelin16Data* Duped = _cmsDupMem(ContextID, p16, sizeof(Prelin16Data));\n\n    if (Duped == NULL) return NULL;\n\n    Duped ->EvalCurveOut16   = (_cmsInterpFn16*)_cmsDupMem(ContextID, p16 ->EvalCurveOut16, p16 ->nOutputs * sizeof(_cmsInterpFn16));\n    Duped ->ParamsCurveOut16 = (cmsInterpParams**)_cmsDupMem(ContextID, p16 ->ParamsCurveOut16, p16 ->nOutputs * sizeof(cmsInterpParams* ));\n\n    return Duped;\n}\n\n\nstatic\nPrelin16Data* PrelinOpt16alloc(cmsContext ContextID,\n                               const cmsInterpParams* ColorMap,\n                               int nInputs, cmsToneCurve** In,\n                               int nOutputs, cmsToneCurve** Out )\n{\n    int i;\n    Prelin16Data* p16 = _cmsMallocZero(ContextID, sizeof(Prelin16Data));\n    if (p16 == NULL) return NULL;\n\n    p16 ->nInputs = nInputs;\n    p16 -> nOutputs = nOutputs;\n\n\n    for (i=0; i < nInputs; i++) {\n\n        if (In == NULL) {\n            p16 -> ParamsCurveIn16[i] = NULL;\n            p16 -> EvalCurveIn16[i] = Eval16nop1D;\n\n        }\n        else {\n            p16 -> ParamsCurveIn16[i] = In[i] ->InterpParams;\n            p16 -> EvalCurveIn16[i] = p16 ->ParamsCurveIn16[i]->Interpolation.Lerp16;\n        }\n    }\n\n    p16 ->CLUTparams = ColorMap;\n    p16 ->EvalCLUT   = ColorMap ->Interpolation.Lerp16;\n\n\n    p16 -> EvalCurveOut16 = (_cmsInterpFn16*) _cmsCalloc(ContextID, nOutputs, sizeof(_cmsInterpFn16));\n    p16 -> ParamsCurveOut16 = (cmsInterpParams**) _cmsCalloc(ContextID, nOutputs, sizeof(cmsInterpParams* ));\n\n    for (i=0; i < nOutputs; i++) {\n\n        if (Out == NULL) {\n            p16 ->ParamsCurveOut16[i] = NULL;\n            p16 -> EvalCurveOut16[i] = Eval16nop1D;\n        }\n        else {\n\n            p16 ->ParamsCurveOut16[i] = Out[i] ->InterpParams;\n            p16 -> EvalCurveOut16[i] = p16 ->ParamsCurveOut16[i]->Interpolation.Lerp16;\n        }\n    }\n\n    return p16;\n}\n\n\n\n// Resampling ---------------------------------------------------------------------------------\n\n#define PRELINEARIZATION_POINTS 4096\n\n// Sampler implemented by another LUT. This is a clean way to precalculate the devicelink 3D CLUT for\n// almost any transform. We use floating point precision and then convert from floating point to 16 bits.\nstatic\nint XFormSampler16(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo)\n{\n    cmsPipeline* Lut = (cmsPipeline*) Cargo;\n    cmsFloat32Number InFloat[cmsMAXCHANNELS], OutFloat[cmsMAXCHANNELS];\n    cmsUInt32Number i;\n\n    _cmsAssert(Lut -> InputChannels < cmsMAXCHANNELS);\n    _cmsAssert(Lut -> OutputChannels < cmsMAXCHANNELS);\n\n    // From 16 bit to floating point\n    for (i=0; i < Lut ->InputChannels; i++)\n        InFloat[i] = (cmsFloat32Number) (In[i] / 65535.0);\n\n    // Evaluate in floating point\n    cmsPipelineEvalFloat(InFloat, OutFloat, Lut);\n\n    // Back to 16 bits representation\n    for (i=0; i < Lut ->OutputChannels; i++)\n        Out[i] = _cmsQuickSaturateWord(OutFloat[i] * 65535.0);\n\n    // Always succeed\n    return TRUE;\n}\n\n// Try to see if the curves of a given MPE are linear\nstatic\ncmsBool AllCurvesAreLinear(cmsStage* mpe)\n{\n    cmsToneCurve** Curves;\n    cmsUInt32Number i, n;\n\n    Curves = _cmsStageGetPtrToCurveSet(mpe);\n    if (Curves == NULL) return FALSE;\n\n    n = cmsStageOutputChannels(mpe);\n\n    for (i=0; i < n; i++) {\n        if (!cmsIsToneCurveLinear(Curves[i])) return FALSE;\n    }\n\n    return TRUE;\n}\n\n// This function replaces a specific node placed in \"At\" by the \"Value\" numbers. Its purpose\n// is to fix scum dot on broken profiles/transforms. Works on 1, 3 and 4 channels\nstatic\ncmsBool  PatchLUT(cmsStage* CLUT, cmsUInt16Number At[], cmsUInt16Number Value[],\n                  int nChannelsOut, int nChannelsIn)\n{\n    _cmsStageCLutData* Grid = (_cmsStageCLutData*) CLUT ->Data;\n    cmsInterpParams* p16  = Grid ->Params;\n    cmsFloat64Number px, py, pz, pw;\n    int        x0, y0, z0, w0;\n    int        i, index;\n\n    if (CLUT -> Type != cmsSigCLutElemType) {\n        cmsSignalError(CLUT->ContextID, cmsERROR_INTERNAL, \"(internal) Attempt to PatchLUT on non-lut stage\");\n        return FALSE;\n    }\n\n\tif (nChannelsIn != 1 && nChannelsIn != 3 && nChannelsIn != 4) {\n\t\tcmsSignalError(CLUT->ContextID, cmsERROR_INTERNAL, \"(internal) %d Channels are not supported on PatchLUT\", nChannelsIn);\n        return FALSE;\n\t}\n    if (nChannelsIn == 4) {\n\n        px = ((cmsFloat64Number) At[0] * (p16->Domain[0])) / 65535.0;\n        py = ((cmsFloat64Number) At[1] * (p16->Domain[1])) / 65535.0;\n        pz = ((cmsFloat64Number) At[2] * (p16->Domain[2])) / 65535.0;\n        pw = ((cmsFloat64Number) At[3] * (p16->Domain[3])) / 65535.0;\n\n        x0 = (int) floor(px);\n        y0 = (int) floor(py);\n        z0 = (int) floor(pz);\n        w0 = (int) floor(pw);\n\n        if (((px - x0) != 0) ||\n            ((py - y0) != 0) ||\n            ((pz - z0) != 0) ||\n            ((pw - w0) != 0)) return FALSE; // Not on exact node\n\n        index = p16 -> opta[3] * x0 +\n                p16 -> opta[2] * y0 +\n                p16 -> opta[1] * z0 +\n                p16 -> opta[0] * w0;\n    }\n    else\n        if (nChannelsIn == 3) {\n\n            px = ((cmsFloat64Number) At[0] * (p16->Domain[0])) / 65535.0;\n            py = ((cmsFloat64Number) At[1] * (p16->Domain[1])) / 65535.0;\n            pz = ((cmsFloat64Number) At[2] * (p16->Domain[2])) / 65535.0;\n           \n            x0 = (int) floor(px);\n            y0 = (int) floor(py);\n            z0 = (int) floor(pz);\n           \n            if (((px - x0) != 0) ||\n                ((py - y0) != 0) ||\n                ((pz - z0) != 0)) return FALSE;  // Not on exact node\n\n            index = p16 -> opta[2] * x0 +\n                    p16 -> opta[1] * y0 +\n                    p16 -> opta[0] * z0;\n        }\n        else\n            if (nChannelsIn == 1) {\n\n                px = ((cmsFloat64Number) At[0] * (p16->Domain[0])) / 65535.0;\n                \n                x0 = (int) floor(px);\n                \n                if (((px - x0) != 0)) return FALSE; // Not on exact node\n\n                index = p16 -> opta[0] * x0;\n            }\n            else {\n                cmsSignalError(CLUT->ContextID, cmsERROR_INTERNAL, \"(internal) %d Channels are not supported on PatchLUT\", nChannelsIn);\n                return FALSE;\n            }\n\n            for (i=0; i < nChannelsOut; i++)\n                Grid -> Tab.T[index + i] = Value[i];\n\n            return TRUE;\n}\n\n// Auxiliar, to see if two values are equal or very different\nstatic\ncmsBool WhitesAreEqual(int n, cmsUInt16Number White1[], cmsUInt16Number White2[] )\n{\n    int i;\n\n    for (i=0; i < n; i++) {\n\n        if (abs(White1[i] - White2[i]) > 0xf000) return TRUE;  // Values are so extremly different that the fixup should be avoided\n        if (White1[i] != White2[i]) return FALSE;\n    }\n    return TRUE;\n}\n\n\n// Locate the node for the white point and fix it to pure white in order to avoid scum dot.\nstatic\ncmsBool FixWhiteMisalignment(cmsPipeline* Lut, cmsColorSpaceSignature EntryColorSpace, cmsColorSpaceSignature ExitColorSpace)\n{\n    cmsUInt16Number *WhitePointIn, *WhitePointOut;\n    cmsUInt16Number  WhiteIn[cmsMAXCHANNELS], WhiteOut[cmsMAXCHANNELS], ObtainedOut[cmsMAXCHANNELS];\n    cmsUInt32Number i, nOuts, nIns;\n    cmsStage *PreLin = NULL, *CLUT = NULL, *PostLin = NULL;\n\n    if (!_cmsEndPointsBySpace(EntryColorSpace,\n        &WhitePointIn, NULL, &nIns)) return FALSE;\n\n    if (!_cmsEndPointsBySpace(ExitColorSpace,\n        &WhitePointOut, NULL, &nOuts)) return FALSE;\n\n    // It needs to be fixed?\n    if (Lut ->InputChannels != nIns) return FALSE;\n    if (Lut ->OutputChannels != nOuts) return FALSE;\n\n    cmsPipelineEval16(WhitePointIn, ObtainedOut, Lut);\n\n    if (WhitesAreEqual(nOuts, WhitePointOut, ObtainedOut)) return TRUE; // whites already match\n\n    // Check if the LUT comes as Prelin, CLUT or Postlin. We allow all combinations\n    if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, &PreLin, &CLUT, &PostLin))\n        if (!cmsPipelineCheckAndRetreiveStages(Lut, 2, cmsSigCurveSetElemType, cmsSigCLutElemType, &PreLin, &CLUT))\n            if (!cmsPipelineCheckAndRetreiveStages(Lut, 2, cmsSigCLutElemType, cmsSigCurveSetElemType, &CLUT, &PostLin))\n                if (!cmsPipelineCheckAndRetreiveStages(Lut, 1, cmsSigCLutElemType, &CLUT))\n                    return FALSE;\n\n    // We need to interpolate white points of both, pre and post curves\n    if (PreLin) {\n\n        cmsToneCurve** Curves = _cmsStageGetPtrToCurveSet(PreLin);\n\n        for (i=0; i < nIns; i++) {\n            WhiteIn[i] = cmsEvalToneCurve16(Curves[i], WhitePointIn[i]);\n        }\n    }\n    else {\n        for (i=0; i < nIns; i++)\n            WhiteIn[i] = WhitePointIn[i];\n    }\n\n    // If any post-linearization, we need to find how is represented white before the curve, do\n    // a reverse interpolation in this case.\n    if (PostLin) {\n\n        cmsToneCurve** Curves = _cmsStageGetPtrToCurveSet(PostLin);\n\n        for (i=0; i < nOuts; i++) {\n\n            cmsToneCurve* InversePostLin = cmsReverseToneCurve(Curves[i]);\n            if (InversePostLin == NULL) {\n                WhiteOut[i] = WhitePointOut[i];    \n\n            } else {\n\n                WhiteOut[i] = cmsEvalToneCurve16(InversePostLin, WhitePointOut[i]);\n                cmsFreeToneCurve(InversePostLin);\n            }\n        }\n    }\n    else {\n        for (i=0; i < nOuts; i++)\n            WhiteOut[i] = WhitePointOut[i];\n    }\n\n    // Ok, proceed with patching. May fail and we don't care if it fails\n    PatchLUT(CLUT, WhiteIn, WhiteOut, nOuts, nIns);\n\n    return TRUE;\n}\n\n// -----------------------------------------------------------------------------------------------------------------------------------------------\n// This function creates simple LUT from complex ones. The generated LUT has an optional set of\n// prelinearization curves, a CLUT of nGridPoints and optional postlinearization tables.\n// These curves have to exist in the original LUT in order to be used in the simplified output.\n// Caller may also use the flags to allow this feature.\n// LUTS with all curves will be simplified to a single curve. Parametric curves are lost.\n// This function should be used on 16-bits LUTS only, as floating point losses precision when simplified\n// -----------------------------------------------------------------------------------------------------------------------------------------------\n\nstatic\ncmsBool OptimizeByResampling(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags)\n{\n    cmsPipeline* Src = NULL;\n    cmsPipeline* Dest = NULL;\n    cmsStage* mpe;\n    cmsStage* CLUT;\n    cmsStage *KeepPreLin = NULL, *KeepPostLin = NULL;\n    int nGridPoints;\n    cmsColorSpaceSignature ColorSpace, OutputColorSpace;\n    cmsStage *NewPreLin = NULL;\n    cmsStage *NewPostLin = NULL;\n    _cmsStageCLutData* DataCLUT;\n    cmsToneCurve** DataSetIn;\n    cmsToneCurve** DataSetOut;\n    Prelin16Data* p16;\n\n    // This is a loosy optimization! does not apply in floating-point cases\n    if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) return FALSE;\n\n    ColorSpace       = _cmsICCcolorSpace(T_COLORSPACE(*InputFormat));\n    OutputColorSpace = _cmsICCcolorSpace(T_COLORSPACE(*OutputFormat));\n    nGridPoints      = _cmsReasonableGridpointsByColorspace(ColorSpace, *dwFlags);\n\n    // For empty LUTs, 2 points are enough\n    if (cmsPipelineStageCount(*Lut) == 0)\n        nGridPoints = 2;\n\n    Src = *Lut;\n\n    // Named color pipelines cannot be optimized either\n    for (mpe = cmsPipelineGetPtrToFirstStage(Src);\n        mpe != NULL;\n        mpe = cmsStageNext(mpe)) {\n            if (cmsStageType(mpe) == cmsSigNamedColorElemType) return FALSE;\n    }\n\n    // Allocate an empty LUT\n    Dest =  cmsPipelineAlloc(Src ->ContextID, Src ->InputChannels, Src ->OutputChannels);\n    if (!Dest) return FALSE;\n\n    // Prelinearization tables are kept unless indicated by flags\n    if (*dwFlags & cmsFLAGS_CLUT_PRE_LINEARIZATION) {\n\n        // Get a pointer to the prelinearization element\n        cmsStage* PreLin = cmsPipelineGetPtrToFirstStage(Src);\n\n        // Check if suitable\n        if (PreLin ->Type == cmsSigCurveSetElemType) {\n\n            // Maybe this is a linear tram, so we can avoid the whole stuff\n            if (!AllCurvesAreLinear(PreLin)) {\n\n                // All seems ok, proceed.\n                NewPreLin = cmsStageDup(PreLin);\n                if(!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, NewPreLin))\n                    goto Error;\n\n                // Remove prelinearization. Since we have duplicated the curve\n                // in destination LUT, the sampling shoud be applied after this stage.\n                cmsPipelineUnlinkStage(Src, cmsAT_BEGIN, &KeepPreLin);\n            }\n        }\n    }\n\n    // Allocate the CLUT\n    CLUT = cmsStageAllocCLut16bit(Src ->ContextID, nGridPoints, Src ->InputChannels, Src->OutputChannels, NULL);\n    if (CLUT == NULL) return FALSE;\n\n    // Add the CLUT to the destination LUT\n    if (!cmsPipelineInsertStage(Dest, cmsAT_END, CLUT)) {\n        goto Error;\n    }\n\n    // Postlinearization tables are kept unless indicated by flags\n    if (*dwFlags & cmsFLAGS_CLUT_POST_LINEARIZATION) {\n\n        // Get a pointer to the postlinearization if present\n        cmsStage* PostLin = cmsPipelineGetPtrToLastStage(Src);\n\n        // Check if suitable\n        if (cmsStageType(PostLin) == cmsSigCurveSetElemType) {\n\n            // Maybe this is a linear tram, so we can avoid the whole stuff\n            if (!AllCurvesAreLinear(PostLin)) {\n\n                // All seems ok, proceed.\n                NewPostLin = cmsStageDup(PostLin);\n                if (!cmsPipelineInsertStage(Dest, cmsAT_END, NewPostLin))\n                    goto Error;\n\n                // In destination LUT, the sampling shoud be applied after this stage.\n                cmsPipelineUnlinkStage(Src, cmsAT_END, &KeepPostLin);\n            }\n        }\n    }\n\n    // Now its time to do the sampling. We have to ignore pre/post linearization\n    // The source LUT whithout pre/post curves is passed as parameter.\n    if (!cmsStageSampleCLut16bit(CLUT, XFormSampler16, (void*) Src, 0)) {\nError:\n        // Ops, something went wrong, Restore stages\n        if (KeepPreLin != NULL) {\n            if (!cmsPipelineInsertStage(Src, cmsAT_BEGIN, KeepPreLin)) {\n                _cmsAssert(0); // This never happens\n            }\n        }\n        if (KeepPostLin != NULL) {\n            if (!cmsPipelineInsertStage(Src, cmsAT_END,   KeepPostLin)) {\n                _cmsAssert(0); // This never happens\n            }\n        }\n        cmsPipelineFree(Dest);\n        return FALSE;\n    }\n\n    // Done.\n\n    if (KeepPreLin != NULL) cmsStageFree(KeepPreLin);\n    if (KeepPostLin != NULL) cmsStageFree(KeepPostLin);\n    cmsPipelineFree(Src);\n\n    DataCLUT = (_cmsStageCLutData*) CLUT ->Data;\n\n    if (NewPreLin == NULL) DataSetIn = NULL;\n    else DataSetIn = ((_cmsStageToneCurvesData*) NewPreLin ->Data) ->TheCurves;\n\n    if (NewPostLin == NULL) DataSetOut = NULL;\n    else  DataSetOut = ((_cmsStageToneCurvesData*) NewPostLin ->Data) ->TheCurves;\n\n\n    if (DataSetIn == NULL && DataSetOut == NULL) {\n\n        _cmsPipelineSetOptimizationParameters(Dest, (_cmsOPTeval16Fn) DataCLUT->Params->Interpolation.Lerp16, DataCLUT->Params, NULL, NULL);\n    }\n    else {\n\n        p16 = PrelinOpt16alloc(Dest ->ContextID,\n            DataCLUT ->Params,\n            Dest ->InputChannels,\n            DataSetIn,\n            Dest ->OutputChannels,\n            DataSetOut);\n\n        _cmsPipelineSetOptimizationParameters(Dest, PrelinEval16, (void*) p16, PrelinOpt16free, Prelin16dup);\n    }\n\n\n    // Don't fix white on absolute colorimetric\n    if (Intent == INTENT_ABSOLUTE_COLORIMETRIC)\n        *dwFlags |= cmsFLAGS_NOWHITEONWHITEFIXUP;\n\n    if (!(*dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP)) {\n\n        FixWhiteMisalignment(Dest, ColorSpace, OutputColorSpace);\n    }\n\n    *Lut = Dest;\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(Intent);\n}\n\n\n// -----------------------------------------------------------------------------------------------------------------------------------------------\n// Fixes the gamma balancing of transform. This is described in my paper \"Prelinearization Stages on\n// Color-Management Application-Specific Integrated Circuits (ASICs)\" presented at NIP24. It only works\n// for RGB transforms. See the paper for more details\n// -----------------------------------------------------------------------------------------------------------------------------------------------\n\n\n// Normalize endpoints by slope limiting max and min. This assures endpoints as well.\n// Descending curves are handled as well.\nstatic\nvoid SlopeLimiting(cmsToneCurve* g)\n{\n    int BeginVal, EndVal;\n    int AtBegin = (int) floor((cmsFloat64Number) g ->nEntries * 0.02 + 0.5);   // Cutoff at 2%\n    int AtEnd   = g ->nEntries - AtBegin - 1;                                  // And 98%\n    cmsFloat64Number Val, Slope, beta;\n    int i;\n\n    if (cmsIsToneCurveDescending(g)) {\n        BeginVal = 0xffff; EndVal = 0;\n    }\n    else {\n        BeginVal = 0; EndVal = 0xffff;\n    }\n\n    // Compute slope and offset for begin of curve\n    Val   = g ->Table16[AtBegin];\n    Slope = (Val - BeginVal) / AtBegin;\n    beta  = Val - Slope * AtBegin;\n\n    for (i=0; i < AtBegin; i++)\n        g ->Table16[i] = _cmsQuickSaturateWord(i * Slope + beta);\n\n    // Compute slope and offset for the end\n    Val   = g ->Table16[AtEnd];\n    Slope = (EndVal - Val) / AtBegin;   // AtBegin holds the X interval, which is same in both cases\n    beta  = Val - Slope * AtEnd;\n\n    for (i = AtEnd; i < (int) g ->nEntries; i++)\n        g ->Table16[i] = _cmsQuickSaturateWord(i * Slope + beta);\n}\n\n\n// Precomputes tables for 8-bit on input devicelink.\nstatic\nPrelin8Data* PrelinOpt8alloc(cmsContext ContextID, const cmsInterpParams* p, cmsToneCurve* G[3])\n{\n    int i;\n    cmsUInt16Number Input[3];\n    cmsS15Fixed16Number v1, v2, v3;\n    Prelin8Data* p8;\n\n    p8 = (Prelin8Data*)_cmsMallocZero(ContextID, sizeof(Prelin8Data));\n    if (p8 == NULL) return NULL;\n\n    // Since this only works for 8 bit input, values comes always as x * 257,\n    // we can safely take msb byte (x << 8 + x)\n\n    for (i=0; i < 256; i++) {\n\n        if (G != NULL) {\n\n            // Get 16-bit representation\n            Input[0] = cmsEvalToneCurve16(G[0], FROM_8_TO_16(i));\n            Input[1] = cmsEvalToneCurve16(G[1], FROM_8_TO_16(i));\n            Input[2] = cmsEvalToneCurve16(G[2], FROM_8_TO_16(i));\n        }\n        else {\n            Input[0] = FROM_8_TO_16(i);\n            Input[1] = FROM_8_TO_16(i);\n            Input[2] = FROM_8_TO_16(i);\n        }\n\n\n        // Move to 0..1.0 in fixed domain\n        v1 = _cmsToFixedDomain(Input[0] * p -> Domain[0]);\n        v2 = _cmsToFixedDomain(Input[1] * p -> Domain[1]);\n        v3 = _cmsToFixedDomain(Input[2] * p -> Domain[2]);\n\n        // Store the precalculated table of nodes\n        p8 ->X0[i] = (p->opta[2] * FIXED_TO_INT(v1));\n        p8 ->Y0[i] = (p->opta[1] * FIXED_TO_INT(v2));\n        p8 ->Z0[i] = (p->opta[0] * FIXED_TO_INT(v3));\n\n        // Store the precalculated table of offsets\n        p8 ->rx[i] = (cmsUInt16Number) FIXED_REST_TO_INT(v1);\n        p8 ->ry[i] = (cmsUInt16Number) FIXED_REST_TO_INT(v2);\n        p8 ->rz[i] = (cmsUInt16Number) FIXED_REST_TO_INT(v3);\n    }\n\n    p8 ->ContextID = ContextID;\n    p8 ->p = p;\n\n    return p8;\n}\n\nstatic\nvoid Prelin8free(cmsContext ContextID, void* ptr)\n{\n    _cmsFree(ContextID, ptr);\n}\n\nstatic\nvoid* Prelin8dup(cmsContext ContextID, const void* ptr)\n{\n    return _cmsDupMem(ContextID, ptr, sizeof(Prelin8Data));\n}\n\n\n\n// A optimized interpolation for 8-bit input.\n#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan])\nstatic\nvoid PrelinEval8(register const cmsUInt16Number Input[],\n                  register cmsUInt16Number Output[],\n                  register const void* D)\n{\n\n    cmsUInt8Number         r, g, b;\n    cmsS15Fixed16Number    rx, ry, rz;\n    cmsS15Fixed16Number    c0, c1, c2, c3, Rest;\n    int                    OutChan;\n    register cmsS15Fixed16Number    X0, X1, Y0, Y1, Z0, Z1;\n    Prelin8Data* p8 = (Prelin8Data*) D;\n    register const cmsInterpParams* p = p8 ->p;\n    int                    TotalOut = p -> nOutputs;\n    const cmsUInt16Number* LutTable = (const cmsUInt16Number*)p -> Table;\n\n    r = Input[0] >> 8;\n    g = Input[1] >> 8;\n    b = Input[2] >> 8;\n\n    X0 = X1 = p8->X0[r];\n    Y0 = Y1 = p8->Y0[g];\n    Z0 = Z1 = p8->Z0[b];\n\n    rx = p8 ->rx[r];\n    ry = p8 ->ry[g];\n    rz = p8 ->rz[b];\n\n    X1 = X0 + ((rx == 0) ? 0 : p ->opta[2]);\n    Y1 = Y0 + ((ry == 0) ? 0 : p ->opta[1]);\n    Z1 = Z0 + ((rz == 0) ? 0 : p ->opta[0]);\n\n\n    // These are the 6 Tetrahedral\n    for (OutChan=0; OutChan < TotalOut; OutChan++) {\n\n        c0 = DENS(X0, Y0, Z0);\n\n        if (rx >= ry && ry >= rz)\n        {\n            c1 = DENS(X1, Y0, Z0) - c0;\n            c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0);\n            c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);\n        }\n        else\n            if (rx >= rz && rz >= ry)\n            {\n                c1 = DENS(X1, Y0, Z0) - c0;\n                c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);\n                c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0);\n            }\n            else\n                if (rz >= rx && rx >= ry)\n                {\n                    c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1);\n                    c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);\n                    c3 = DENS(X0, Y0, Z1) - c0;\n                }\n                else\n                    if (ry >= rx && rx >= rz)\n                    {\n                        c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0);\n                        c2 = DENS(X0, Y1, Z0) - c0;\n                        c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);\n                    }\n                    else\n                        if (ry >= rz && rz >= rx)\n                        {\n                            c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);\n                            c2 = DENS(X0, Y1, Z0) - c0;\n                            c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0);\n                        }\n                        else\n                            if (rz >= ry && ry >= rx)\n                            {\n                                c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);\n                                c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1);\n                                c3 = DENS(X0, Y0, Z1) - c0;\n                            }\n                            else  {\n                                c1 = c2 = c3 = 0;\n                            }\n\n\n                            Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001;\n                            Output[OutChan] = (cmsUInt16Number)c0 + ((Rest + (Rest>>16))>>16);\n\n    }\n}\n\n#undef DENS\n\n\n// Curves that contain wide empty areas are not optimizeable\nstatic\ncmsBool IsDegenerated(const cmsToneCurve* g)\n{\n    int i, Zeros = 0, Poles = 0;\n    int nEntries = g ->nEntries;\n\n    for (i=0; i < nEntries; i++) {\n\n        if (g ->Table16[i] == 0x0000) Zeros++;\n        if (g ->Table16[i] == 0xffff) Poles++;\n    }\n\n    if (Zeros == 1 && Poles == 1) return FALSE;  // For linear tables\n    if (Zeros > (nEntries / 4)) return TRUE;  // Degenerated, mostly zeros\n    if (Poles > (nEntries / 4)) return TRUE;  // Degenerated, mostly poles\n\n    return FALSE;\n}\n\n// --------------------------------------------------------------------------------------------------------------\n// We need xput over here\n\nstatic\ncmsBool OptimizeByComputingLinearization(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags)\n{\n    cmsPipeline* OriginalLut;\n    int nGridPoints;\n    cmsToneCurve *Trans[cmsMAXCHANNELS], *TransReverse[cmsMAXCHANNELS];\n    cmsUInt32Number t, i;\n    cmsFloat32Number v, In[cmsMAXCHANNELS], Out[cmsMAXCHANNELS];\n    cmsBool lIsSuitable, lIsLinear;\n    cmsPipeline* OptimizedLUT = NULL, *LutPlusCurves = NULL;\n    cmsStage* OptimizedCLUTmpe;\n    cmsColorSpaceSignature ColorSpace, OutputColorSpace;\n    cmsStage* OptimizedPrelinMpe;\n    cmsStage* mpe;\n    cmsToneCurve**   OptimizedPrelinCurves;\n    _cmsStageCLutData*     OptimizedPrelinCLUT;\n\n\n    // This is a loosy optimization! does not apply in floating-point cases\n    if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) return FALSE;\n\n    // Only on RGB\n    if (T_COLORSPACE(*InputFormat)  != PT_RGB) return FALSE;\n    if (T_COLORSPACE(*OutputFormat) != PT_RGB) return FALSE;\n\n\n    // On 16 bits, user has to specify the feature\n    if (!_cmsFormatterIs8bit(*InputFormat)) {\n        if (!(*dwFlags & cmsFLAGS_CLUT_PRE_LINEARIZATION)) return FALSE;\n    }\n\n    OriginalLut = *Lut;\n\n   // Named color pipelines cannot be optimized either\n   for (mpe = cmsPipelineGetPtrToFirstStage(OriginalLut);\n         mpe != NULL;\n         mpe = cmsStageNext(mpe)) {\n            if (cmsStageType(mpe) == cmsSigNamedColorElemType) return FALSE;\n    }\n\n    ColorSpace       = _cmsICCcolorSpace(T_COLORSPACE(*InputFormat));\n    OutputColorSpace = _cmsICCcolorSpace(T_COLORSPACE(*OutputFormat));\n    nGridPoints      = _cmsReasonableGridpointsByColorspace(ColorSpace, *dwFlags);\n\n    // Empty gamma containers\n    memset(Trans, 0, sizeof(Trans));\n    memset(TransReverse, 0, sizeof(TransReverse));\n\n    for (t = 0; t < OriginalLut ->InputChannels; t++) {\n        Trans[t] = cmsBuildTabulatedToneCurve16(OriginalLut ->ContextID, PRELINEARIZATION_POINTS, NULL);\n        if (Trans[t] == NULL) goto Error;\n    }\n\n    // Populate the curves\n    for (i=0; i < PRELINEARIZATION_POINTS; i++) {\n\n        v = (cmsFloat32Number) ((cmsFloat64Number) i / (PRELINEARIZATION_POINTS - 1));\n\n        // Feed input with a gray ramp\n        for (t=0; t < OriginalLut ->InputChannels; t++)\n            In[t] = v;\n\n        // Evaluate the gray value\n        cmsPipelineEvalFloat(In, Out, OriginalLut);\n\n        // Store result in curve\n        for (t=0; t < OriginalLut ->InputChannels; t++)\n            Trans[t] ->Table16[i] = _cmsQuickSaturateWord(Out[t] * 65535.0);\n    }\n\n    // Slope-limit the obtained curves\n    for (t = 0; t < OriginalLut ->InputChannels; t++)\n        SlopeLimiting(Trans[t]);\n\n    // Check for validity\n    lIsSuitable = TRUE;\n    lIsLinear   = TRUE;\n    for (t=0; (lIsSuitable && (t < OriginalLut ->InputChannels)); t++) {\n\n        // Exclude if already linear\n        if (!cmsIsToneCurveLinear(Trans[t]))\n            lIsLinear = FALSE;\n\n        // Exclude if non-monotonic\n        if (!cmsIsToneCurveMonotonic(Trans[t]))\n            lIsSuitable = FALSE;\n\n        if (IsDegenerated(Trans[t]))\n            lIsSuitable = FALSE;\n    }\n\n    // If it is not suitable, just quit\n    if (!lIsSuitable) goto Error;\n\n    // Invert curves if possible\n    for (t = 0; t < OriginalLut ->InputChannels; t++) {\n        TransReverse[t] = cmsReverseToneCurveEx(PRELINEARIZATION_POINTS, Trans[t]);\n        if (TransReverse[t] == NULL) goto Error;\n    }\n\n    // Now inset the reversed curves at the begin of transform\n    LutPlusCurves = cmsPipelineDup(OriginalLut);\n    if (LutPlusCurves == NULL) goto Error;\n\n    if (!cmsPipelineInsertStage(LutPlusCurves, cmsAT_BEGIN, cmsStageAllocToneCurves(OriginalLut ->ContextID, OriginalLut ->InputChannels, TransReverse)))\n        goto Error;\n\n    // Create the result LUT\n    OptimizedLUT = cmsPipelineAlloc(OriginalLut ->ContextID, OriginalLut ->InputChannels, OriginalLut ->OutputChannels);\n    if (OptimizedLUT == NULL) goto Error;\n\n    OptimizedPrelinMpe = cmsStageAllocToneCurves(OriginalLut ->ContextID, OriginalLut ->InputChannels, Trans);\n\n    // Create and insert the curves at the beginning\n    if (!cmsPipelineInsertStage(OptimizedLUT, cmsAT_BEGIN, OptimizedPrelinMpe))\n        goto Error;\n\n    // Allocate the CLUT for result\n    OptimizedCLUTmpe = cmsStageAllocCLut16bit(OriginalLut ->ContextID, nGridPoints, OriginalLut ->InputChannels, OriginalLut ->OutputChannels, NULL);\n\n    // Add the CLUT to the destination LUT\n    if (!cmsPipelineInsertStage(OptimizedLUT, cmsAT_END, OptimizedCLUTmpe))\n        goto Error;\n\n    // Resample the LUT\n    if (!cmsStageSampleCLut16bit(OptimizedCLUTmpe, XFormSampler16, (void*) LutPlusCurves, 0)) goto Error;\n\n    // Free resources\n    for (t = 0; t < OriginalLut ->InputChannels; t++) {\n\n        if (Trans[t]) cmsFreeToneCurve(Trans[t]);\n        if (TransReverse[t]) cmsFreeToneCurve(TransReverse[t]);\n    }\n\n    cmsPipelineFree(LutPlusCurves);\n\n\n    OptimizedPrelinCurves = _cmsStageGetPtrToCurveSet(OptimizedPrelinMpe);\n    OptimizedPrelinCLUT   = (_cmsStageCLutData*) OptimizedCLUTmpe ->Data;\n\n    // Set the evaluator if 8-bit\n    if (_cmsFormatterIs8bit(*InputFormat)) {\n\n        Prelin8Data* p8 = PrelinOpt8alloc(OptimizedLUT ->ContextID,\n                                                OptimizedPrelinCLUT ->Params,\n                                                OptimizedPrelinCurves);\n        if (p8 == NULL) return FALSE;\n\n        _cmsPipelineSetOptimizationParameters(OptimizedLUT, PrelinEval8, (void*) p8, Prelin8free, Prelin8dup);\n\n    }\n    else\n    {\n        Prelin16Data* p16 = PrelinOpt16alloc(OptimizedLUT ->ContextID,\n            OptimizedPrelinCLUT ->Params,\n            3, OptimizedPrelinCurves, 3, NULL);\n        if (p16 == NULL) return FALSE;\n\n        _cmsPipelineSetOptimizationParameters(OptimizedLUT, PrelinEval16, (void*) p16, PrelinOpt16free, Prelin16dup);\n\n    }\n\n    // Don't fix white on absolute colorimetric\n    if (Intent == INTENT_ABSOLUTE_COLORIMETRIC)\n        *dwFlags |= cmsFLAGS_NOWHITEONWHITEFIXUP;\n\n    if (!(*dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP)) {\n\n        if (!FixWhiteMisalignment(OptimizedLUT, ColorSpace, OutputColorSpace)) {\n\n            return FALSE;\n        }\n    }\n\n    // And return the obtained LUT\n\n    cmsPipelineFree(OriginalLut);\n    *Lut = OptimizedLUT;\n    return TRUE;\n\nError:\n\n    for (t = 0; t < OriginalLut ->InputChannels; t++) {\n\n        if (Trans[t]) cmsFreeToneCurve(Trans[t]);\n        if (TransReverse[t]) cmsFreeToneCurve(TransReverse[t]);\n    }\n\n    if (LutPlusCurves != NULL) cmsPipelineFree(LutPlusCurves);\n    if (OptimizedLUT != NULL) cmsPipelineFree(OptimizedLUT);\n\n    return FALSE;\n\n    cmsUNUSED_PARAMETER(Intent);\n}\n\n\n// Curves optimizer ------------------------------------------------------------------------------------------------------------------\n\nstatic\nvoid CurvesFree(cmsContext ContextID, void* ptr)\n{\n     Curves16Data* Data = (Curves16Data*) ptr;\n     int i;\n\n     for (i=0; i < Data -> nCurves; i++) {\n\n         _cmsFree(ContextID, Data ->Curves[i]);\n     }\n\n     _cmsFree(ContextID, Data ->Curves);\n     _cmsFree(ContextID, ptr);\n}\n\nstatic\nvoid* CurvesDup(cmsContext ContextID, const void* ptr)\n{\n    Curves16Data* Data = (Curves16Data*)_cmsDupMem(ContextID, ptr, sizeof(Curves16Data));\n    int i;\n\n    if (Data == NULL) return NULL;\n\n    Data ->Curves = (cmsUInt16Number**)_cmsDupMem(ContextID, Data ->Curves, Data ->nCurves * sizeof(cmsUInt16Number*));\n\n    for (i=0; i < Data -> nCurves; i++) {\n        Data ->Curves[i] = (cmsUInt16Number*)_cmsDupMem(ContextID, Data ->Curves[i], Data -> nElements * sizeof(cmsUInt16Number));\n    }\n\n    return (void*) Data;\n}\n\n// Precomputes tables for 8-bit on input devicelink.\nstatic\nCurves16Data* CurvesAlloc(cmsContext ContextID, int nCurves, int nElements, cmsToneCurve** G)\n{\n    int i, j;\n    Curves16Data* c16;\n\n    c16 = (Curves16Data*)_cmsMallocZero(ContextID, sizeof(Curves16Data));\n    if (c16 == NULL) return NULL;\n\n    c16 ->nCurves = nCurves;\n    c16 ->nElements = nElements;\n\n    c16 ->Curves = (cmsUInt16Number**)_cmsCalloc(ContextID, nCurves, sizeof(cmsUInt16Number*));\n    if (c16 ->Curves == NULL) return NULL;\n\n    for (i=0; i < nCurves; i++) {\n\n        c16->Curves[i] = (cmsUInt16Number*)_cmsCalloc(ContextID, nElements, sizeof(cmsUInt16Number));\n\n        if (c16->Curves[i] == NULL) {\n\n            for (j=0; j < i; j++) {\n                _cmsFree(ContextID, c16->Curves[j]);\n            }\n            _cmsFree(ContextID, c16->Curves);\n            _cmsFree(ContextID, c16);\n            return NULL;\n        }\n\n        if (nElements == 256) {\n\n            for (j=0; j < nElements; j++) {\n\n                c16 ->Curves[i][j] = cmsEvalToneCurve16(G[i], FROM_8_TO_16(j));\n            }\n        }\n        else {\n\n            for (j=0; j < nElements; j++) {\n                c16 ->Curves[i][j] = cmsEvalToneCurve16(G[i], (cmsUInt16Number) j);\n            }\n        }\n    }\n\n    return c16;\n}\n\nstatic\nvoid FastEvaluateCurves8(register const cmsUInt16Number In[],\n                          register cmsUInt16Number Out[],\n                          register const void* D)\n{\n    Curves16Data* Data = (Curves16Data*) D;\n    cmsUInt8Number x;\n    int i;\n\n    for (i=0; i < Data ->nCurves; i++) {\n\n         x = (In[i] >> 8);\n         Out[i] = Data -> Curves[i][x];\n    }\n}\n\n\nstatic\nvoid FastEvaluateCurves16(register const cmsUInt16Number In[],\n                          register cmsUInt16Number Out[],\n                          register const void* D)\n{\n    Curves16Data* Data = (Curves16Data*) D;\n    int i;\n\n    for (i=0; i < Data ->nCurves; i++) {\n         Out[i] = Data -> Curves[i][In[i]];\n    }\n}\n\n\nstatic\nvoid FastIdentity16(register const cmsUInt16Number In[],\n                    register cmsUInt16Number Out[],\n                    register const void* D)\n{\n    cmsPipeline* Lut = (cmsPipeline*) D;\n    cmsUInt32Number i;\n\n    for (i=0; i < Lut ->InputChannels; i++) {\n         Out[i] = In[i];\n    }\n}\n\n\n// If the target LUT holds only curves, the optimization procedure is to join all those\n// curves together. That only works on curves and does not work on matrices.\nstatic\ncmsBool OptimizeByJoiningCurves(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags)\n{\n    cmsToneCurve** GammaTables = NULL;\n    cmsFloat32Number InFloat[cmsMAXCHANNELS], OutFloat[cmsMAXCHANNELS];\n    cmsUInt32Number i, j;\n    cmsPipeline* Src = *Lut;\n    cmsPipeline* Dest = NULL;\n    cmsStage* mpe;\n    cmsStage* ObtainedCurves = NULL;\n\n\n    // This is a loosy optimization! does not apply in floating-point cases\n    if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) return FALSE;\n\n    //  Only curves in this LUT?\n    for (mpe = cmsPipelineGetPtrToFirstStage(Src);\n         mpe != NULL;\n         mpe = cmsStageNext(mpe)) {\n            if (cmsStageType(mpe) != cmsSigCurveSetElemType) return FALSE;\n    }\n\n    // Allocate an empty LUT\n    Dest =  cmsPipelineAlloc(Src ->ContextID, Src ->InputChannels, Src ->OutputChannels);\n    if (Dest == NULL) return FALSE;\n\n    // Create target curves\n    GammaTables = (cmsToneCurve**) _cmsCalloc(Src ->ContextID, Src ->InputChannels, sizeof(cmsToneCurve*));\n    if (GammaTables == NULL) goto Error;\n\n    for (i=0; i < Src ->InputChannels; i++) {\n        GammaTables[i] = cmsBuildTabulatedToneCurve16(Src ->ContextID, PRELINEARIZATION_POINTS, NULL);\n        if (GammaTables[i] == NULL) goto Error;\n    }\n\n    // Compute 16 bit result by using floating point\n    for (i=0; i < PRELINEARIZATION_POINTS; i++) {\n\n        for (j=0; j < Src ->InputChannels; j++)\n            InFloat[j] = (cmsFloat32Number) ((cmsFloat64Number) i / (PRELINEARIZATION_POINTS - 1));\n\n        cmsPipelineEvalFloat(InFloat, OutFloat, Src);\n\n        for (j=0; j < Src ->InputChannels; j++)\n            GammaTables[j] -> Table16[i] = _cmsQuickSaturateWord(OutFloat[j] * 65535.0);\n    }\n\n    ObtainedCurves = cmsStageAllocToneCurves(Src ->ContextID, Src ->InputChannels, GammaTables);\n    if (ObtainedCurves == NULL) goto Error;\n\n    for (i=0; i < Src ->InputChannels; i++) {\n        cmsFreeToneCurve(GammaTables[i]);\n        GammaTables[i] = NULL;\n    }\n\n    if (GammaTables != NULL) _cmsFree(Src ->ContextID, GammaTables);\n\n    // Maybe the curves are linear at the end\n    if (!AllCurvesAreLinear(ObtainedCurves)) {\n\n        if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, ObtainedCurves))\n            goto Error;\n\n        // If the curves are to be applied in 8 bits, we can save memory\n        if (_cmsFormatterIs8bit(*InputFormat)) {\n\n            _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) ObtainedCurves ->Data;\n             Curves16Data* c16 = CurvesAlloc(Dest ->ContextID, Data ->nCurves, 256, Data ->TheCurves);\n\n             if (c16 == NULL) goto Error; \n             *dwFlags |= cmsFLAGS_NOCACHE;\n            _cmsPipelineSetOptimizationParameters(Dest, FastEvaluateCurves8, c16, CurvesFree, CurvesDup);\n\n        }\n        else {\n\n            _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) cmsStageData(ObtainedCurves);\n             Curves16Data* c16 = CurvesAlloc(Dest ->ContextID, Data ->nCurves, 65536, Data ->TheCurves);\n\n             if (c16 == NULL) goto Error; \n             *dwFlags |= cmsFLAGS_NOCACHE;\n            _cmsPipelineSetOptimizationParameters(Dest, FastEvaluateCurves16, c16, CurvesFree, CurvesDup);\n        }\n    }\n    else {\n\n        // LUT optimizes to nothing. Set the identity LUT\n        cmsStageFree(ObtainedCurves);\n\n        if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageAllocIdentity(Dest ->ContextID, Src ->InputChannels)))\n            goto Error;\n\n        *dwFlags |= cmsFLAGS_NOCACHE;\n        _cmsPipelineSetOptimizationParameters(Dest, FastIdentity16, (void*) Dest, NULL, NULL);\n    }\n\n    // We are done.\n    cmsPipelineFree(Src);\n    *Lut = Dest;\n    return TRUE;\n\nError:\n\n    if (ObtainedCurves != NULL) cmsStageFree(ObtainedCurves);\n    if (GammaTables != NULL) {\n        for (i=0; i < Src ->InputChannels; i++) {\n            if (GammaTables[i] != NULL) cmsFreeToneCurve(GammaTables[i]);\n        }\n\n        _cmsFree(Src ->ContextID, GammaTables);\n    }\n\n    if (Dest != NULL) cmsPipelineFree(Dest);\n    return FALSE;\n\n    cmsUNUSED_PARAMETER(Intent);\n    cmsUNUSED_PARAMETER(InputFormat);\n    cmsUNUSED_PARAMETER(OutputFormat);\n    cmsUNUSED_PARAMETER(dwFlags);\n}\n\n// -------------------------------------------------------------------------------------------------------------------------------------\n// LUT is Shaper - Matrix - Matrix - Shaper, which is very frequent when combining two matrix-shaper profiles\n\n\nstatic\nvoid  FreeMatShaper(cmsContext ContextID, void* Data)\n{\n    if (Data != NULL) _cmsFree(ContextID, Data);\n}\n\nstatic\nvoid* DupMatShaper(cmsContext ContextID, const void* Data)\n{\n    return _cmsDupMem(ContextID, Data, sizeof(MatShaper8Data));\n}\n\n\n// A fast matrix-shaper evaluator for 8 bits. This is a bit ticky since I'm using 1.14 signed fixed point\n// to accomplish some performance. Actually it takes 256x3 16 bits tables and 16385 x 3 tables of 8 bits,\n// in total about 50K, and the performance boost is huge!\nstatic\nvoid MatShaperEval16(register const cmsUInt16Number In[],\n                     register cmsUInt16Number Out[],\n                     register const void* D)\n{\n    MatShaper8Data* p = (MatShaper8Data*) D;\n    cmsS1Fixed14Number l1, l2, l3, r, g, b;\n    cmsUInt32Number ri, gi, bi;\n\n    // In this case (and only in this case!) we can use this simplification since\n    // In[] is assured to come from a 8 bit number. (a << 8 | a)\n    ri = In[0] & 0xFF;\n    gi = In[1] & 0xFF;\n    bi = In[2] & 0xFF;\n\n    // Across first shaper, which also converts to 1.14 fixed point\n    r = p->Shaper1R[ri];\n    g = p->Shaper1G[gi];\n    b = p->Shaper1B[bi];\n\n    // Evaluate the matrix in 1.14 fixed point\n    l1 =  (p->Mat[0][0] * r + p->Mat[0][1] * g + p->Mat[0][2] * b + p->Off[0] + 0x2000) >> 14;\n    l2 =  (p->Mat[1][0] * r + p->Mat[1][1] * g + p->Mat[1][2] * b + p->Off[1] + 0x2000) >> 14;\n    l3 =  (p->Mat[2][0] * r + p->Mat[2][1] * g + p->Mat[2][2] * b + p->Off[2] + 0x2000) >> 14;\n\n    // Now we have to clip to 0..1.0 range\n    ri = (l1 < 0) ? 0 : ((l1 > 16384) ? 16384 : l1);\n    gi = (l2 < 0) ? 0 : ((l2 > 16384) ? 16384 : l2);\n    bi = (l3 < 0) ? 0 : ((l3 > 16384) ? 16384 : l3);\n\n    // And across second shaper,\n    Out[0] = p->Shaper2R[ri];\n    Out[1] = p->Shaper2G[gi];\n    Out[2] = p->Shaper2B[bi];\n\n}\n\n// This table converts from 8 bits to 1.14 after applying the curve\nstatic\nvoid FillFirstShaper(cmsS1Fixed14Number* Table, cmsToneCurve* Curve)\n{\n    int i;\n    cmsFloat32Number R, y;\n\n    for (i=0; i < 256; i++) {\n\n        R   = (cmsFloat32Number) (i / 255.0);\n        y   = cmsEvalToneCurveFloat(Curve, R);\n\n        Table[i] = DOUBLE_TO_1FIXED14(y);\n    }\n}\n\n// This table converts form 1.14 (being 0x4000 the last entry) to 8 bits after applying the curve\nstatic\nvoid FillSecondShaper(cmsUInt16Number* Table, cmsToneCurve* Curve, cmsBool Is8BitsOutput)\n{\n    int i;\n    cmsFloat32Number R, Val;\n\n    for (i=0; i < 16385; i++) {\n\n        R   = (cmsFloat32Number) (i / 16384.0);\n        Val = cmsEvalToneCurveFloat(Curve, R);    // Val comes 0..1.0\n\n        if (Is8BitsOutput) {\n\n            // If 8 bits output, we can optimize further by computing the / 257 part.\n            // first we compute the resulting byte and then we store the byte times\n            // 257. This quantization allows to round very quick by doing a >> 8, but\n            // since the low byte is always equal to msb, we can do a & 0xff and this works!\n            cmsUInt16Number w = _cmsQuickSaturateWord(Val * 65535.0);\n            cmsUInt8Number  b = FROM_16_TO_8(w);\n\n            Table[i] = FROM_8_TO_16(b);\n        }\n        else Table[i]  = _cmsQuickSaturateWord(Val * 65535.0);\n    }\n}\n\n// Compute the matrix-shaper structure\nstatic\ncmsBool SetMatShaper(cmsPipeline* Dest, cmsToneCurve* Curve1[3], cmsMAT3* Mat, cmsVEC3* Off, cmsToneCurve* Curve2[3], cmsUInt32Number* OutputFormat)\n{\n    MatShaper8Data* p;\n    int i, j;\n    cmsBool Is8Bits = _cmsFormatterIs8bit(*OutputFormat);\n\n    // Allocate a big chuck of memory to store precomputed tables\n    p = (MatShaper8Data*) _cmsMalloc(Dest ->ContextID, sizeof(MatShaper8Data));\n    if (p == NULL) return FALSE;\n\n    p -> ContextID = Dest -> ContextID;\n\n    // Precompute tables\n    FillFirstShaper(p ->Shaper1R, Curve1[0]);\n    FillFirstShaper(p ->Shaper1G, Curve1[1]);\n    FillFirstShaper(p ->Shaper1B, Curve1[2]);\n\n    FillSecondShaper(p ->Shaper2R, Curve2[0], Is8Bits);\n    FillSecondShaper(p ->Shaper2G, Curve2[1], Is8Bits);\n    FillSecondShaper(p ->Shaper2B, Curve2[2], Is8Bits);\n\n    // Convert matrix to nFixed14. Note that those values may take more than 16 bits as\n    for (i=0; i < 3; i++) {\n        for (j=0; j < 3; j++) {\n            p ->Mat[i][j] = DOUBLE_TO_1FIXED14(Mat->v[i].n[j]);\n        }\n    }\n\n    for (i=0; i < 3; i++) {\n\n        if (Off == NULL) {\n            p ->Off[i] = 0;\n        }\n        else {\n            p ->Off[i] = DOUBLE_TO_1FIXED14(Off->n[i]);\n        }\n    }\n\n    // Mark as optimized for faster formatter\n    if (Is8Bits)\n        *OutputFormat |= OPTIMIZED_SH(1);\n\n    // Fill function pointers\n    _cmsPipelineSetOptimizationParameters(Dest, MatShaperEval16, (void*) p, FreeMatShaper, DupMatShaper);\n    return TRUE;\n}\n\n//  8 bits on input allows matrix-shaper boot up to 25 Mpixels per second on RGB. That's fast!\n// TODO: Allow a third matrix for abs. colorimetric\nstatic\ncmsBool OptimizeMatrixShaper(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags)\n{\n    cmsStage* Curve1, *Curve2;\n    cmsStage* Matrix1, *Matrix2;\n    _cmsStageMatrixData* Data1;\n    _cmsStageMatrixData* Data2;\n    cmsMAT3 res;\n    cmsBool IdentityMat;\n    cmsPipeline* Dest, *Src;\n\n    // Only works on RGB to RGB\n    if (T_CHANNELS(*InputFormat) != 3 || T_CHANNELS(*OutputFormat) != 3) return FALSE;\n\n    // Only works on 8 bit input\n    if (!_cmsFormatterIs8bit(*InputFormat)) return FALSE;\n\n    // Seems suitable, proceed\n    Src = *Lut;\n\n    // Check for shaper-matrix-matrix-shaper structure, that is what this optimizer stands for\n    if (!cmsPipelineCheckAndRetreiveStages(Src, 4,\n        cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType,\n        &Curve1, &Matrix1, &Matrix2, &Curve2)) return FALSE;\n\n    // Get both matrices\n    Data1 = (_cmsStageMatrixData*) cmsStageData(Matrix1);\n    Data2 = (_cmsStageMatrixData*) cmsStageData(Matrix2);\n\n    // Input offset should be zero\n    if (Data1 ->Offset != NULL) return FALSE;\n\n    // Multiply both matrices to get the result\n    _cmsMAT3per(&res, (cmsMAT3*) Data2 ->Double, (cmsMAT3*) Data1 ->Double);\n\n    // Now the result is in res + Data2 -> Offset. Maybe is a plain identity?\n    IdentityMat = FALSE;\n    if (_cmsMAT3isIdentity(&res) && Data2 ->Offset == NULL) {\n\n        // We can get rid of full matrix\n        IdentityMat = TRUE;\n    }\n\n      // Allocate an empty LUT\n    Dest =  cmsPipelineAlloc(Src ->ContextID, Src ->InputChannels, Src ->OutputChannels);\n    if (!Dest) return FALSE;\n\n    // Assamble the new LUT\n    if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageDup(Curve1)))\n        goto Error;\n\n    if (!IdentityMat)\n        if (!cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageAllocMatrix(Dest ->ContextID, 3, 3, (const cmsFloat64Number*) &res, Data2 ->Offset)))\n            goto Error;\n    if (!cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageDup(Curve2)))\n        goto Error;\n\n    // If identity on matrix, we can further optimize the curves, so call the join curves routine\n    if (IdentityMat) {\n\n        OptimizeByJoiningCurves(&Dest, Intent, InputFormat, OutputFormat, dwFlags);\n    }\n    else {\n        _cmsStageToneCurvesData* mpeC1 = (_cmsStageToneCurvesData*) cmsStageData(Curve1);\n        _cmsStageToneCurvesData* mpeC2 = (_cmsStageToneCurvesData*) cmsStageData(Curve2);\n\n        // In this particular optimization, cach?does not help as it takes more time to deal with\n        // the cach?that with the pixel handling\n        *dwFlags |= cmsFLAGS_NOCACHE;\n\n        // Setup the optimizarion routines\n        SetMatShaper(Dest, mpeC1 ->TheCurves, &res, (cmsVEC3*) Data2 ->Offset, mpeC2->TheCurves, OutputFormat);\n    }\n\n    cmsPipelineFree(Src);\n    *Lut = Dest;\n    return TRUE;\nError:\n    // Leave Src unchanged\n    cmsPipelineFree(Dest);\n    return FALSE;\n}\n\n\n// -------------------------------------------------------------------------------------------------------------------------------------\n// Optimization plug-ins\n\n// List of optimizations\ntypedef struct _cmsOptimizationCollection_st {\n\n    _cmsOPToptimizeFn  OptimizePtr;\n\n    struct _cmsOptimizationCollection_st *Next;\n\n} _cmsOptimizationCollection;\n\n\n// The built-in list. We currently implement 4 types of optimizations. Joining of curves, matrix-shaper, linearization and resampling\nstatic _cmsOptimizationCollection DefaultOptimization[] = {\n\n    { OptimizeByJoiningCurves,            &DefaultOptimization[1] },\n    { OptimizeMatrixShaper,               &DefaultOptimization[2] },\n    { OptimizeByComputingLinearization,   &DefaultOptimization[3] },\n    { OptimizeByResampling,               NULL }\n};\n\n// The linked list head\n_cmsOptimizationPluginChunkType _cmsOptimizationPluginChunk = { NULL };\n\n\n// Duplicates the zone of memory used by the plug-in in the new context\nstatic\nvoid DupPluginOptimizationList(struct _cmsContext_struct* ctx, \n                               const struct _cmsContext_struct* src)\n{\n   _cmsOptimizationPluginChunkType newHead = { NULL };\n   _cmsOptimizationCollection*  entry;\n   _cmsOptimizationCollection*  Anterior = NULL;\n   _cmsOptimizationPluginChunkType* head = (_cmsOptimizationPluginChunkType*) src->chunks[OptimizationPlugin];\n\n    _cmsAssert(ctx != NULL);\n    _cmsAssert(head != NULL);\n\n    // Walk the list copying all nodes\n   for (entry = head->OptimizationCollection;\n        entry != NULL;\n        entry = entry ->Next) {\n\n            _cmsOptimizationCollection *newEntry = ( _cmsOptimizationCollection *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsOptimizationCollection));\n   \n            if (newEntry == NULL) \n                return;\n\n            // We want to keep the linked list order, so this is a little bit tricky\n            newEntry -> Next = NULL;\n            if (Anterior)\n                Anterior -> Next = newEntry;\n     \n            Anterior = newEntry;\n\n            if (newHead.OptimizationCollection == NULL)\n                newHead.OptimizationCollection = newEntry;\n    }\n\n  ctx ->chunks[OptimizationPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsOptimizationPluginChunkType));\n}\n\nvoid  _cmsAllocOptimizationPluginChunk(struct _cmsContext_struct* ctx, \n                                         const struct _cmsContext_struct* src)\n{\n  if (src != NULL) {\n\n        // Copy all linked list\n       DupPluginOptimizationList(ctx, src);\n    }\n    else {\n        static _cmsOptimizationPluginChunkType OptimizationPluginChunkType = { NULL };\n        ctx ->chunks[OptimizationPlugin] = _cmsSubAllocDup(ctx ->MemPool, &OptimizationPluginChunkType, sizeof(_cmsOptimizationPluginChunkType));\n    }\n}\n\n\n// Register new ways to optimize\ncmsBool  _cmsRegisterOptimizationPlugin(cmsContext ContextID, cmsPluginBase* Data)\n{\n    cmsPluginOptimization* Plugin = (cmsPluginOptimization*) Data;\n    _cmsOptimizationPluginChunkType* ctx = ( _cmsOptimizationPluginChunkType*) _cmsContextGetClientChunk(ContextID, OptimizationPlugin);\n    _cmsOptimizationCollection* fl;\n\n    if (Data == NULL) {\n\n        ctx->OptimizationCollection = NULL;\n        return TRUE;\n    }\n\n    // Optimizer callback is required\n    if (Plugin ->OptimizePtr == NULL) return FALSE;\n\n    fl = (_cmsOptimizationCollection*) _cmsPluginMalloc(ContextID, sizeof(_cmsOptimizationCollection));\n    if (fl == NULL) return FALSE;\n\n    // Copy the parameters\n    fl ->OptimizePtr = Plugin ->OptimizePtr;\n\n    // Keep linked list\n    fl ->Next = ctx->OptimizationCollection;\n\n    // Set the head\n    ctx ->OptimizationCollection = fl;\n\n    // All is ok\n    return TRUE;\n}\n\n// The entry point for LUT optimization\ncmsBool _cmsOptimizePipeline(cmsContext ContextID,\n                             cmsPipeline**    PtrLut,\n                             int              Intent,\n                             cmsUInt32Number* InputFormat,\n                             cmsUInt32Number* OutputFormat,\n                             cmsUInt32Number* dwFlags)\n{\n    _cmsOptimizationPluginChunkType* ctx = ( _cmsOptimizationPluginChunkType*) _cmsContextGetClientChunk(ContextID, OptimizationPlugin);\n    _cmsOptimizationCollection* Opts;\n    cmsBool AnySuccess = FALSE;\n\n    // A CLUT is being asked, so force this specific optimization\n    if (*dwFlags & cmsFLAGS_FORCE_CLUT) {\n\n        PreOptimize(*PtrLut);\n        return OptimizeByResampling(PtrLut, Intent, InputFormat, OutputFormat, dwFlags);\n    }\n\n    // Anything to optimize?\n    if ((*PtrLut) ->Elements == NULL) {\n        _cmsPipelineSetOptimizationParameters(*PtrLut, FastIdentity16, (void*) *PtrLut, NULL, NULL);\n        return TRUE;\n    }\n\n    // Try to get rid of identities and trivial conversions.\n    AnySuccess = PreOptimize(*PtrLut);\n\n    // After removal do we end with an identity?\n    if ((*PtrLut) ->Elements == NULL) {\n        _cmsPipelineSetOptimizationParameters(*PtrLut, FastIdentity16, (void*) *PtrLut, NULL, NULL);\n        return TRUE;\n    }\n\n    // Do not optimize, keep all precision\n    if (*dwFlags & cmsFLAGS_NOOPTIMIZE)\n        return FALSE;\n\n    // Try plug-in optimizations \n    for (Opts = ctx->OptimizationCollection;\n         Opts != NULL;\n         Opts = Opts ->Next) {\n\n            // If one schema succeeded, we are done\n            if (Opts ->OptimizePtr(PtrLut, Intent, InputFormat, OutputFormat, dwFlags)) {\n\n                return TRUE;    // Optimized!\n            }\n    }\n\n   // Try built-in optimizations \n    for (Opts = DefaultOptimization;\n         Opts != NULL;\n         Opts = Opts ->Next) {\n\n            if (Opts ->OptimizePtr(PtrLut, Intent, InputFormat, OutputFormat, dwFlags)) {\n\n                return TRUE;  \n            }\n    }\n\n    // Only simple optimizations succeeded\n    return AnySuccess;\n}\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/src/cmspack.c",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2010 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n//\n#include \"lcms2_internal.h\"\n\n// This module handles all formats supported by lcms. There are two flavors, 16 bits and\n// floating point. Floating point is supported only in a subset, those formats holding\n// cmsFloat32Number (4 bytes per component) and double (marked as 0 bytes per component\n// as special case)\n\n// ---------------------------------------------------------------------------\n\n\n// This macro return words stored as big endian\n#define CHANGE_ENDIAN(w)    (cmsUInt16Number) ((cmsUInt16Number) ((w)<<8)|((w)>>8))\n\n// These macros handles reversing (negative)\n#define REVERSE_FLAVOR_8(x)     ((cmsUInt8Number) (0xff-(x)))\n#define REVERSE_FLAVOR_16(x)    ((cmsUInt16Number)(0xffff-(x)))\n\n// * 0xffff / 0xff00 = (255 * 257) / (255 * 256) = 257 / 256\ncmsINLINE cmsUInt16Number FomLabV2ToLabV4(cmsUInt16Number x)\n{\n    int a = (x << 8 | x) >> 8;  // * 257 / 256\n    if ( a > 0xffff) return 0xffff;\n    return (cmsUInt16Number) a;\n}\n\n// * 0xf00 / 0xffff = * 256 / 257\ncmsINLINE cmsUInt16Number FomLabV4ToLabV2(cmsUInt16Number x)\n{\n    return (cmsUInt16Number) (((x << 8) + 0x80) / 257);\n}\n\n\ntypedef struct {\n    cmsUInt32Number Type;\n    cmsUInt32Number Mask;\n    cmsFormatter16  Frm;\n\n} cmsFormatters16;\n\ntypedef struct {\n    cmsUInt32Number    Type;\n    cmsUInt32Number    Mask;\n    cmsFormatterFloat  Frm;\n\n} cmsFormattersFloat;\n\n\n#define ANYSPACE        COLORSPACE_SH(31)\n#define ANYCHANNELS     CHANNELS_SH(15)\n#define ANYEXTRA        EXTRA_SH(7)\n#define ANYPLANAR       PLANAR_SH(1)\n#define ANYENDIAN       ENDIAN16_SH(1)\n#define ANYSWAP         DOSWAP_SH(1)\n#define ANYSWAPFIRST    SWAPFIRST_SH(1)\n#define ANYFLAVOR       FLAVOR_SH(1)\n\n\n// Supress waning about info never being used\n\n#ifdef _MSC_VER\n#pragma warning(disable : 4100)\n#endif\n\n// Unpacking routines (16 bits) ----------------------------------------------------------------------------------------\n\n\n// Does almost everything but is slow\nstatic\ncmsUInt8Number* UnrollChunkyBytes(register _cmsTRANSFORM* info,\n                                  register cmsUInt16Number wIn[],\n                                  register cmsUInt8Number* accum,\n                                  register cmsUInt32Number Stride)\n{\n    int nChan      = T_CHANNELS(info -> InputFormat);\n    int DoSwap     = T_DOSWAP(info ->InputFormat);\n    int Reverse    = T_FLAVOR(info ->InputFormat);\n    int SwapFirst  = T_SWAPFIRST(info -> InputFormat);\n    int Extra      = T_EXTRA(info -> InputFormat);\n    int ExtraFirst = DoSwap ^ SwapFirst;\n    cmsUInt16Number v;\n    int i;\n\n    if (ExtraFirst) {\n        accum += Extra;\n    }\n\n    for (i=0; i < nChan; i++) {\n        int index = DoSwap ? (nChan - i - 1) : i;\n\n        v = FROM_8_TO_16(*accum);\n        v = Reverse ? REVERSE_FLAVOR_16(v) : v;\n        wIn[index] = v;\n        accum++;\n    }\n\n    if (!ExtraFirst) {\n        accum += Extra;\n    }\n\n    if (Extra == 0 && SwapFirst) {\n        cmsUInt16Number tmp = wIn[0];\n\n        memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number));\n        wIn[nChan-1] = tmp;\n    }\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n\n}\n\n// Extra channels are just ignored because come in the next planes\nstatic\ncmsUInt8Number* UnrollPlanarBytes(register _cmsTRANSFORM* info,\n                                  register cmsUInt16Number wIn[],\n                                  register cmsUInt8Number* accum,\n                                  register cmsUInt32Number Stride)\n{\n    int nChan     = T_CHANNELS(info -> InputFormat);\n    int DoSwap    = T_DOSWAP(info ->InputFormat);\n    int SwapFirst = T_SWAPFIRST(info ->InputFormat);\n    int Reverse   = T_FLAVOR(info ->InputFormat);\n    int i;\n    cmsUInt8Number* Init = accum;\n\n    if (DoSwap ^ SwapFirst) {\n        accum += T_EXTRA(info -> InputFormat) * Stride;\n    }\n\n    for (i=0; i < nChan; i++) {\n\n        int index = DoSwap ? (nChan - i - 1) : i;\n        cmsUInt16Number v = FROM_8_TO_16(*accum);\n\n        wIn[index] = Reverse ? REVERSE_FLAVOR_16(v) : v;\n        accum += Stride;\n    }\n\n    return (Init + 1);\n}\n\n// Special cases, provided for performance\nstatic\ncmsUInt8Number* Unroll4Bytes(register _cmsTRANSFORM* info,\n                             register cmsUInt16Number wIn[],\n                             register cmsUInt8Number* accum,\n                             register cmsUInt32Number Stride)\n{\n    wIn[0] = FROM_8_TO_16(*accum); accum++; // C\n    wIn[1] = FROM_8_TO_16(*accum); accum++; // M\n    wIn[2] = FROM_8_TO_16(*accum); accum++; // Y\n    wIn[3] = FROM_8_TO_16(*accum); accum++; // K\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Unroll4BytesReverse(register _cmsTRANSFORM* info,\n                                    register cmsUInt16Number wIn[],\n                                    register cmsUInt8Number* accum,\n                                    register cmsUInt32Number Stride)\n{\n    wIn[0] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // C\n    wIn[1] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // M\n    wIn[2] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // Y\n    wIn[3] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // K\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Unroll4BytesSwapFirst(register _cmsTRANSFORM* info,\n                                      register cmsUInt16Number wIn[],\n                                      register cmsUInt8Number* accum,\n                                      register cmsUInt32Number Stride)\n{\n    wIn[3] = FROM_8_TO_16(*accum); accum++; // K\n    wIn[0] = FROM_8_TO_16(*accum); accum++; // C\n    wIn[1] = FROM_8_TO_16(*accum); accum++; // M\n    wIn[2] = FROM_8_TO_16(*accum); accum++; // Y\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n// KYMC\nstatic\ncmsUInt8Number* Unroll4BytesSwap(register _cmsTRANSFORM* info,\n                                 register cmsUInt16Number wIn[],\n                                 register cmsUInt8Number* accum,\n                                 register cmsUInt32Number Stride)\n{\n    wIn[3] = FROM_8_TO_16(*accum); accum++;  // K\n    wIn[2] = FROM_8_TO_16(*accum); accum++;  // Y\n    wIn[1] = FROM_8_TO_16(*accum); accum++;  // M\n    wIn[0] = FROM_8_TO_16(*accum); accum++;  // C\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Unroll4BytesSwapSwapFirst(register _cmsTRANSFORM* info,\n                                          register cmsUInt16Number wIn[],\n                                          register cmsUInt8Number* accum,\n                                          register cmsUInt32Number Stride)\n{\n    wIn[2] = FROM_8_TO_16(*accum); accum++;  // K\n    wIn[1] = FROM_8_TO_16(*accum); accum++;  // Y\n    wIn[0] = FROM_8_TO_16(*accum); accum++;  // M\n    wIn[3] = FROM_8_TO_16(*accum); accum++;  // C\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Unroll3Bytes(register _cmsTRANSFORM* info,\n                             register cmsUInt16Number wIn[],\n                             register cmsUInt8Number* accum,\n                             register cmsUInt32Number Stride)\n{\n    wIn[0] = FROM_8_TO_16(*accum); accum++;     // R\n    wIn[1] = FROM_8_TO_16(*accum); accum++;     // G\n    wIn[2] = FROM_8_TO_16(*accum); accum++;     // B\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Unroll3BytesSkip1Swap(register _cmsTRANSFORM* info,\n                                      register cmsUInt16Number wIn[],\n                                      register cmsUInt8Number* accum,\n                                      register cmsUInt32Number Stride)\n{\n    accum++; // A\n    wIn[2] = FROM_8_TO_16(*accum); accum++; // B\n    wIn[1] = FROM_8_TO_16(*accum); accum++; // G\n    wIn[0] = FROM_8_TO_16(*accum); accum++; // R\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Unroll3BytesSkip1SwapSwapFirst(register _cmsTRANSFORM* info, \n                                              register cmsUInt16Number wIn[], \n                                              register cmsUInt8Number* accum,\n                                              register cmsUInt32Number Stride)\n{\n    wIn[2] = FROM_8_TO_16(*accum); accum++; // B\n    wIn[1] = FROM_8_TO_16(*accum); accum++; // G\n    wIn[0] = FROM_8_TO_16(*accum); accum++; // R\n    accum++; // A\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Unroll3BytesSkip1SwapFirst(register _cmsTRANSFORM* info, \n                                           register cmsUInt16Number wIn[], \n                                           register cmsUInt8Number* accum,\n                                           register cmsUInt32Number Stride)\n{\n    accum++; // A\n    wIn[0] = FROM_8_TO_16(*accum); accum++; // R\n    wIn[1] = FROM_8_TO_16(*accum); accum++; // G\n    wIn[2] = FROM_8_TO_16(*accum); accum++; // B\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n\n// BRG\nstatic\ncmsUInt8Number* Unroll3BytesSwap(register _cmsTRANSFORM* info,\n                                 register cmsUInt16Number wIn[],\n                                 register cmsUInt8Number* accum,\n                                 register cmsUInt32Number Stride)\n{\n    wIn[2] = FROM_8_TO_16(*accum); accum++;     // B\n    wIn[1] = FROM_8_TO_16(*accum); accum++;     // G\n    wIn[0] = FROM_8_TO_16(*accum); accum++;     // R\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* UnrollLabV2_8(register _cmsTRANSFORM* info,\n                              register cmsUInt16Number wIn[],\n                              register cmsUInt8Number* accum,\n                              register cmsUInt32Number Stride)\n{\n    wIn[0] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++;     // L\n    wIn[1] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++;     // a\n    wIn[2] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++;     // b\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* UnrollALabV2_8(register _cmsTRANSFORM* info,\n                               register cmsUInt16Number wIn[],\n                               register cmsUInt8Number* accum,\n                               register cmsUInt32Number Stride)\n{\n    accum++;  // A\n    wIn[0] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++;     // L\n    wIn[1] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++;     // a\n    wIn[2] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++;     // b\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* UnrollLabV2_16(register _cmsTRANSFORM* info,\n                               register cmsUInt16Number wIn[],\n                               register cmsUInt8Number* accum,\n                               register cmsUInt32Number Stride)\n{\n    wIn[0] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2;     // L\n    wIn[1] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2;     // a\n    wIn[2] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2;     // b\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n// for duplex\nstatic\ncmsUInt8Number* Unroll2Bytes(register _cmsTRANSFORM* info,\n                                     register cmsUInt16Number wIn[],\n                                     register cmsUInt8Number* accum,\n                                     register cmsUInt32Number Stride)\n{\n    wIn[0] = FROM_8_TO_16(*accum); accum++;     // ch1\n    wIn[1] = FROM_8_TO_16(*accum); accum++;     // ch2\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n\n\n\n// Monochrome duplicates L into RGB for null-transforms\nstatic\ncmsUInt8Number* Unroll1Byte(register _cmsTRANSFORM* info,\n                            register cmsUInt16Number wIn[],\n                            register cmsUInt8Number* accum,\n                            register cmsUInt32Number Stride)\n{\n    wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++;     // L\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n\nstatic\ncmsUInt8Number* Unroll1ByteSkip1(register _cmsTRANSFORM* info,\n                                 register cmsUInt16Number wIn[],\n                                 register cmsUInt8Number* accum,\n                                 register cmsUInt32Number Stride)\n{\n    wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++;     // L\n    accum += 1;\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Unroll1ByteSkip2(register _cmsTRANSFORM* info,\n                                 register cmsUInt16Number wIn[],\n                                 register cmsUInt8Number* accum,\n                                 register cmsUInt32Number Stride)\n{\n    wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++;     // L\n    accum += 2;\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Unroll1ByteReversed(register _cmsTRANSFORM* info,\n                                    register cmsUInt16Number wIn[],\n                                    register cmsUInt8Number* accum,\n                                    register cmsUInt32Number Stride)\n{\n    wIn[0] = wIn[1] = wIn[2] = REVERSE_FLAVOR_16(FROM_8_TO_16(*accum)); accum++;     // L\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n\nstatic\ncmsUInt8Number* UnrollAnyWords(register _cmsTRANSFORM* info,\n                               register cmsUInt16Number wIn[],\n                               register cmsUInt8Number* accum,\n                               register cmsUInt32Number Stride)\n{\n    int nChan       = T_CHANNELS(info -> InputFormat);\n    int SwapEndian  = T_ENDIAN16(info -> InputFormat);\n    int DoSwap      = T_DOSWAP(info ->InputFormat);\n    int Reverse     = T_FLAVOR(info ->InputFormat);\n    int SwapFirst   = T_SWAPFIRST(info -> InputFormat);\n    int Extra       = T_EXTRA(info -> InputFormat);\n    int ExtraFirst  = DoSwap ^ SwapFirst;\n    int i;\n\n    if (ExtraFirst) {\n        accum += Extra * sizeof(cmsUInt16Number);\n    }\n\n    for (i=0; i < nChan; i++) {\n\n        int index = DoSwap ? (nChan - i - 1) : i;\n        cmsUInt16Number v = *(cmsUInt16Number*) accum;\n\n        if (SwapEndian)\n            v = CHANGE_ENDIAN(v);\n\n        wIn[index] = Reverse ? REVERSE_FLAVOR_16(v) : v;\n\n        accum += sizeof(cmsUInt16Number);\n    }\n\n    if (!ExtraFirst) {\n        accum += Extra * sizeof(cmsUInt16Number);\n    }\n\n    if (Extra == 0 && SwapFirst) {\n\n        cmsUInt16Number tmp = wIn[0];\n\n        memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number));\n        wIn[nChan-1] = tmp;\n    }\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* UnrollPlanarWords(register _cmsTRANSFORM* info,\n                                  register cmsUInt16Number wIn[],\n                                  register cmsUInt8Number* accum,\n                                  register cmsUInt32Number Stride)\n{\n    int nChan = T_CHANNELS(info -> InputFormat);\n    int DoSwap= T_DOSWAP(info ->InputFormat);\n    int Reverse= T_FLAVOR(info ->InputFormat);\n    int SwapEndian = T_ENDIAN16(info -> InputFormat);\n    int i;\n    cmsUInt8Number* Init = accum;\n\n    if (DoSwap) {\n        accum += T_EXTRA(info -> InputFormat) * Stride * sizeof(cmsUInt16Number);\n    }\n\n    for (i=0; i < nChan; i++) {\n\n        int index = DoSwap ? (nChan - i - 1) : i;\n        cmsUInt16Number v = *(cmsUInt16Number*) accum;\n\n        if (SwapEndian)\n            v = CHANGE_ENDIAN(v);\n\n        wIn[index] = Reverse ? REVERSE_FLAVOR_16(v) : v;\n\n        accum +=  Stride * sizeof(cmsUInt16Number);\n    }\n\n    return (Init + sizeof(cmsUInt16Number));\n}\n\n\nstatic\ncmsUInt8Number* Unroll4Words(register _cmsTRANSFORM* info,\n                             register cmsUInt16Number wIn[],\n                             register cmsUInt8Number* accum,\n                             register cmsUInt32Number Stride)\n{\n    wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C\n    wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M\n    wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y\n    wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // K\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Unroll4WordsReverse(register _cmsTRANSFORM* info,\n                                    register cmsUInt16Number wIn[],\n                                    register cmsUInt8Number* accum,\n                                    register cmsUInt32Number Stride)\n{\n    wIn[0] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // C\n    wIn[1] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // M\n    wIn[2] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // Y\n    wIn[3] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // K\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Unroll4WordsSwapFirst(register _cmsTRANSFORM* info,\n                                      register cmsUInt16Number wIn[],\n                                      register cmsUInt8Number* accum,\n                                      register cmsUInt32Number Stride)\n{\n    wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // K\n    wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C\n    wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M\n    wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n// KYMC\nstatic\ncmsUInt8Number* Unroll4WordsSwap(register _cmsTRANSFORM* info,\n                                 register cmsUInt16Number wIn[],\n                                 register cmsUInt8Number* accum,\n                                 register cmsUInt32Number Stride)\n{\n    wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // K\n    wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y\n    wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M\n    wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Unroll4WordsSwapSwapFirst(register _cmsTRANSFORM* info,\n                                          register cmsUInt16Number wIn[],\n                                          register cmsUInt8Number* accum,\n                                          register cmsUInt32Number Stride)\n{\n    wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // K\n    wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // Y\n    wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // M\n    wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // C\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Unroll3Words(register _cmsTRANSFORM* info,\n                             register cmsUInt16Number wIn[],\n                             register cmsUInt8Number* accum,\n                             register cmsUInt32Number Stride)\n{\n    wIn[0] = *(cmsUInt16Number*) accum; accum+= 2;  // C R\n    wIn[1] = *(cmsUInt16Number*) accum; accum+= 2;  // M G\n    wIn[2] = *(cmsUInt16Number*) accum; accum+= 2;  // Y B\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Unroll3WordsSwap(register _cmsTRANSFORM* info,\n                                 register cmsUInt16Number wIn[],\n                                 register cmsUInt8Number* accum,\n                                 register cmsUInt32Number Stride)\n{\n    wIn[2] = *(cmsUInt16Number*) accum; accum+= 2;  // C R\n    wIn[1] = *(cmsUInt16Number*) accum; accum+= 2;  // M G\n    wIn[0] = *(cmsUInt16Number*) accum; accum+= 2;  // Y B\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Unroll3WordsSkip1Swap(register _cmsTRANSFORM* info,\n                                      register cmsUInt16Number wIn[],\n                                      register cmsUInt8Number* accum,\n                                      register cmsUInt32Number Stride)\n{\n    accum += 2; // A\n    wIn[2] = *(cmsUInt16Number*) accum; accum += 2; // R\n    wIn[1] = *(cmsUInt16Number*) accum; accum += 2; // G\n    wIn[0] = *(cmsUInt16Number*) accum; accum += 2; // B\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Unroll3WordsSkip1SwapFirst(register _cmsTRANSFORM* info,\n                                           register cmsUInt16Number wIn[],\n                                           register cmsUInt8Number* accum,\n                                           register cmsUInt32Number Stride)\n{\n    accum += 2; // A\n    wIn[0] = *(cmsUInt16Number*) accum; accum += 2; // R\n    wIn[1] = *(cmsUInt16Number*) accum; accum += 2; // G\n    wIn[2] = *(cmsUInt16Number*) accum; accum += 2; // B\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Unroll1Word(register _cmsTRANSFORM* info,\n                            register cmsUInt16Number wIn[],\n                            register cmsUInt8Number* accum,\n                            register cmsUInt32Number Stride)\n{\n    wIn[0] = wIn[1] = wIn[2] = *(cmsUInt16Number*) accum; accum+= 2;   // L\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Unroll1WordReversed(register _cmsTRANSFORM* info,\n                                    register cmsUInt16Number wIn[],\n                                    register cmsUInt8Number* accum,\n                                    register cmsUInt32Number Stride)\n{\n    wIn[0] = wIn[1] = wIn[2] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2;\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Unroll1WordSkip3(register _cmsTRANSFORM* info,\n                                 register cmsUInt16Number wIn[],\n                                 register cmsUInt8Number* accum,\n                                 register cmsUInt32Number Stride)\n{\n    wIn[0] = wIn[1] = wIn[2] = *(cmsUInt16Number*) accum;\n\n    accum += 8;\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Unroll2Words(register _cmsTRANSFORM* info,\n                                     register cmsUInt16Number wIn[],\n                                     register cmsUInt8Number* accum,\n                                     register cmsUInt32Number Stride)\n{\n    wIn[0] = *(cmsUInt16Number*) accum; accum += 2;    // ch1\n    wIn[1] = *(cmsUInt16Number*) accum; accum += 2;    // ch2\n\n    return accum;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n\n// This is a conversion of Lab double to 16 bits\nstatic\ncmsUInt8Number* UnrollLabDoubleTo16(register _cmsTRANSFORM* info,\n                                    register cmsUInt16Number wIn[],\n                                    register cmsUInt8Number* accum,\n                                    register cmsUInt32Number  Stride)\n{\n    if (T_PLANAR(info -> InputFormat)) {\n\n        cmsFloat64Number* Pt = (cmsFloat64Number*) accum;\n\n        cmsCIELab Lab;\n\n        Lab.L = Pt[0];\n        Lab.a = Pt[Stride];\n        Lab.b = Pt[Stride*2];\n\n        cmsFloat2LabEncoded(wIn, &Lab);\n        return accum + sizeof(cmsFloat64Number);\n    }\n    else {\n\n        cmsFloat2LabEncoded(wIn, (cmsCIELab*) accum);\n        accum += sizeof(cmsCIELab) + T_EXTRA(info ->InputFormat) * sizeof(cmsFloat64Number);\n        return accum;\n    }\n}\n\n\n// This is a conversion of Lab float to 16 bits\nstatic\ncmsUInt8Number* UnrollLabFloatTo16(register _cmsTRANSFORM* info,\n                                    register cmsUInt16Number wIn[],\n                                    register cmsUInt8Number* accum,\n                                    register cmsUInt32Number  Stride)\n{\n    cmsCIELab Lab;\n    \n    if (T_PLANAR(info -> InputFormat)) {\n\n        cmsFloat32Number* Pt = (cmsFloat32Number*) accum;\n\n     \n        Lab.L = Pt[0];\n        Lab.a = Pt[Stride];\n        Lab.b = Pt[Stride*2];\n\n        cmsFloat2LabEncoded(wIn, &Lab);\n        return accum + sizeof(cmsFloat32Number);\n    }\n    else {\n \n        Lab.L = ((cmsFloat32Number*) accum)[0];\n        Lab.a = ((cmsFloat32Number*) accum)[1];\n        Lab.b = ((cmsFloat32Number*) accum)[2];\n\n        cmsFloat2LabEncoded(wIn, &Lab);\n        accum += (3 + T_EXTRA(info ->InputFormat)) * sizeof(cmsFloat32Number);\n        return accum;\n    }\n}\n\n// This is a conversion of XYZ double to 16 bits\nstatic\ncmsUInt8Number* UnrollXYZDoubleTo16(register _cmsTRANSFORM* info,\n                                    register cmsUInt16Number wIn[],\n                                    register cmsUInt8Number* accum,\n                                    register cmsUInt32Number Stride)\n{\n    if (T_PLANAR(info -> InputFormat)) {\n\n        cmsFloat64Number* Pt = (cmsFloat64Number*) accum;\n        cmsCIEXYZ XYZ;\n\n        XYZ.X = Pt[0];\n        XYZ.Y = Pt[Stride];\n        XYZ.Z = Pt[Stride*2];\n        cmsFloat2XYZEncoded(wIn, &XYZ);\n\n        return accum + sizeof(cmsFloat64Number);\n\n    }\n\n    else {\n        cmsFloat2XYZEncoded(wIn, (cmsCIEXYZ*) accum);\n        accum += sizeof(cmsCIEXYZ) + T_EXTRA(info ->InputFormat) * sizeof(cmsFloat64Number);\n\n        return accum;\n    }\n}\n\n// This is a conversion of XYZ float to 16 bits\nstatic\ncmsUInt8Number* UnrollXYZFloatTo16(register _cmsTRANSFORM* info,\n                                   register cmsUInt16Number wIn[],\n                                   register cmsUInt8Number* accum,\n                                   register cmsUInt32Number Stride)\n{\n    if (T_PLANAR(info -> InputFormat)) {\n\n        cmsFloat32Number* Pt = (cmsFloat32Number*) accum;\n        cmsCIEXYZ XYZ;\n\n        XYZ.X = Pt[0];\n        XYZ.Y = Pt[Stride];\n        XYZ.Z = Pt[Stride*2];\n        cmsFloat2XYZEncoded(wIn, &XYZ);\n\n        return accum + sizeof(cmsFloat32Number);\n\n    }\n\n    else {\n        cmsFloat32Number* Pt = (cmsFloat32Number*) accum;\n        cmsCIEXYZ XYZ;\n\n        XYZ.X = Pt[0];\n        XYZ.Y = Pt[1];\n        XYZ.Z = Pt[2];\n        cmsFloat2XYZEncoded(wIn, &XYZ);\n\n        accum += 3 * sizeof(cmsFloat32Number) + T_EXTRA(info ->InputFormat) * sizeof(cmsFloat32Number);\n\n        return accum;\n    }\n}\n\n// Check if space is marked as ink\ncmsINLINE cmsBool IsInkSpace(cmsUInt32Number Type)\n{\n    switch (T_COLORSPACE(Type)) {\n\n     case PT_CMY:\n     case PT_CMYK:\n     case PT_MCH5:\n     case PT_MCH6:\n     case PT_MCH7:\n     case PT_MCH8:\n     case PT_MCH9:\n     case PT_MCH10:\n     case PT_MCH11:\n     case PT_MCH12:\n     case PT_MCH13:\n     case PT_MCH14:\n     case PT_MCH15: return TRUE;\n\n     default: return FALSE;\n    }\n}\n\n// Inks does come in percentage, remaining cases are between 0..1.0, again to 16 bits\nstatic\ncmsUInt8Number* UnrollDoubleTo16(register _cmsTRANSFORM* info,\n                                register cmsUInt16Number wIn[],\n                                register cmsUInt8Number* accum,\n                                register cmsUInt32Number Stride)\n{\n\n    int nChan      = T_CHANNELS(info -> InputFormat);\n    int DoSwap     = T_DOSWAP(info ->InputFormat);\n    int Reverse    = T_FLAVOR(info ->InputFormat);\n    int SwapFirst  = T_SWAPFIRST(info -> InputFormat);\n    int Extra      = T_EXTRA(info -> InputFormat);\n    int ExtraFirst = DoSwap ^ SwapFirst;\n    int Planar     = T_PLANAR(info -> InputFormat);\n    cmsFloat64Number v;\n    cmsUInt16Number  vi;\n    int i, start = 0;\n   cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 655.35 : 65535.0;\n\n\n    if (ExtraFirst)\n            start = Extra;\n\n    for (i=0; i < nChan; i++) {\n\n        int index = DoSwap ? (nChan - i - 1) : i;\n\n        if (Planar)\n            v = (cmsFloat32Number) ((cmsFloat64Number*) accum)[(i + start) * Stride];\n        else\n            v = (cmsFloat32Number) ((cmsFloat64Number*) accum)[i + start];\n\n        vi = _cmsQuickSaturateWord(v * maximum);\n\n        if (Reverse)\n            vi = REVERSE_FLAVOR_16(vi);\n\n        wIn[index] = vi;\n    }\n\n\n    if (Extra == 0 && SwapFirst) {\n        cmsUInt16Number tmp = wIn[0];\n\n        memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number));\n        wIn[nChan-1] = tmp;\n    }\n\n    if (T_PLANAR(info -> InputFormat))\n        return accum + sizeof(cmsFloat64Number);\n    else\n        return accum + (nChan + Extra) * sizeof(cmsFloat64Number);\n}\n\n\n\nstatic\ncmsUInt8Number* UnrollFloatTo16(register _cmsTRANSFORM* info,\n                                register cmsUInt16Number wIn[],\n                                register cmsUInt8Number* accum,\n                                register cmsUInt32Number Stride)\n{\n\n    int nChan      = T_CHANNELS(info -> InputFormat);\n    int DoSwap     = T_DOSWAP(info ->InputFormat);\n    int Reverse    = T_FLAVOR(info ->InputFormat);\n    int SwapFirst  = T_SWAPFIRST(info -> InputFormat);\n    int Extra      = T_EXTRA(info -> InputFormat);\n    int ExtraFirst = DoSwap ^ SwapFirst;\n    int Planar     = T_PLANAR(info -> InputFormat);\n    cmsFloat32Number v;\n    cmsUInt16Number  vi;\n    int i, start = 0;\n   cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 655.35 : 65535.0;\n\n\n    if (ExtraFirst)\n            start = Extra;\n\n    for (i=0; i < nChan; i++) {\n\n        int index = DoSwap ? (nChan - i - 1) : i;\n\n        if (Planar)\n            v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[(i + start) * Stride];\n        else\n            v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[i + start];\n\n        vi = _cmsQuickSaturateWord(v * maximum);\n\n        if (Reverse)\n            vi = REVERSE_FLAVOR_16(vi);\n\n        wIn[index] = vi;\n    }\n\n\n    if (Extra == 0 && SwapFirst) {\n        cmsUInt16Number tmp = wIn[0];\n\n        memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number));\n        wIn[nChan-1] = tmp;\n    }\n\n    if (T_PLANAR(info -> InputFormat))\n        return accum + sizeof(cmsFloat32Number);\n    else\n        return accum + (nChan + Extra) * sizeof(cmsFloat32Number);\n}\n\n\n\n\n// For 1 channel, we need to duplicate data (it comes in 0..1.0 range)\nstatic\ncmsUInt8Number* UnrollDouble1Chan(register _cmsTRANSFORM* info,\n                                  register cmsUInt16Number wIn[],\n                                  register cmsUInt8Number* accum,\n                                  register cmsUInt32Number Stride)\n{\n    cmsFloat64Number* Inks = (cmsFloat64Number*) accum;\n\n    wIn[0] = wIn[1] = wIn[2] = _cmsQuickSaturateWord(Inks[0] * 65535.0);\n\n    return accum + sizeof(cmsFloat64Number);\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n//-------------------------------------------------------------------------------------------------------------------\n\n// For anything going from cmsFloat32Number\nstatic\ncmsUInt8Number* UnrollFloatsToFloat(_cmsTRANSFORM* info,\n                                    cmsFloat32Number wIn[],\n                                    cmsUInt8Number* accum,\n                                    cmsUInt32Number Stride)\n{\n\n    int nChan      = T_CHANNELS(info -> InputFormat);\n    int DoSwap     = T_DOSWAP(info ->InputFormat);\n    int Reverse    = T_FLAVOR(info ->InputFormat);\n    int SwapFirst  = T_SWAPFIRST(info -> InputFormat);\n    int Extra      = T_EXTRA(info -> InputFormat);\n    int ExtraFirst = DoSwap ^ SwapFirst;\n    int Planar     = T_PLANAR(info -> InputFormat);\n    cmsFloat32Number v;\n    int i, start = 0;\n    cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 100.0F : 1.0F;\n\n\n    if (ExtraFirst)\n            start = Extra;\n\n    for (i=0; i < nChan; i++) {\n\n        int index = DoSwap ? (nChan - i - 1) : i;\n\n        if (Planar)\n            v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[(i + start) * Stride];\n        else\n            v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[i + start];\n\n        v /= maximum;\n\n        wIn[index] = Reverse ? 1 - v : v;\n    }\n\n\n    if (Extra == 0 && SwapFirst) {\n        cmsFloat32Number tmp = wIn[0];\n\n        memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number));\n        wIn[nChan-1] = tmp;\n    }\n\n    if (T_PLANAR(info -> InputFormat))\n        return accum + sizeof(cmsFloat32Number);\n    else\n        return accum + (nChan + Extra) * sizeof(cmsFloat32Number);\n}\n\n// For anything going from double\n\nstatic\ncmsUInt8Number* UnrollDoublesToFloat(_cmsTRANSFORM* info,\n                                    cmsFloat32Number wIn[],\n                                    cmsUInt8Number* accum,\n                                    cmsUInt32Number Stride)\n{\n\n    int nChan      = T_CHANNELS(info -> InputFormat);\n    int DoSwap     = T_DOSWAP(info ->InputFormat);\n    int Reverse    = T_FLAVOR(info ->InputFormat);\n    int SwapFirst  = T_SWAPFIRST(info -> InputFormat);\n    int Extra      = T_EXTRA(info -> InputFormat);\n    int ExtraFirst = DoSwap ^ SwapFirst;\n    int Planar     = T_PLANAR(info -> InputFormat);\n    cmsFloat64Number v;\n    int i, start = 0;\n    cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 100.0 : 1.0;\n\n\n    if (ExtraFirst)\n            start = Extra;\n\n    for (i=0; i < nChan; i++) {\n\n        int index = DoSwap ? (nChan - i - 1) : i;\n\n        if (Planar)\n            v = (cmsFloat64Number) ((cmsFloat64Number*) accum)[(i + start)  * Stride];\n        else\n            v = (cmsFloat64Number) ((cmsFloat64Number*) accum)[i + start];\n\n        v /= maximum;\n\n        wIn[index] = (cmsFloat32Number) (Reverse ? 1.0 - v : v);\n    }\n\n\n    if (Extra == 0 && SwapFirst) {\n        cmsFloat32Number tmp = wIn[0];\n\n        memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number));\n        wIn[nChan-1] = tmp;\n    }\n\n    if (T_PLANAR(info -> InputFormat))\n        return accum + sizeof(cmsFloat64Number);\n    else\n        return accum + (nChan + Extra) * sizeof(cmsFloat64Number);\n}\n\n\n\n// From Lab double to cmsFloat32Number\nstatic\ncmsUInt8Number* UnrollLabDoubleToFloat(_cmsTRANSFORM* info,\n                                       cmsFloat32Number wIn[],\n                                       cmsUInt8Number* accum,\n                                       cmsUInt32Number Stride)\n{\n    cmsFloat64Number* Pt = (cmsFloat64Number*) accum;\n\n    if (T_PLANAR(info -> InputFormat)) {\n\n        wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0);                            // from 0..100 to 0..1\n        wIn[1] = (cmsFloat32Number) ((Pt[Stride] + 128) / 255.0);    // form -128..+127 to 0..1\n        wIn[2] = (cmsFloat32Number) ((Pt[Stride*2] + 128) / 255.0);\n\n        return accum + sizeof(cmsFloat64Number);\n    }\n    else {\n\n        wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0);            // from 0..100 to 0..1\n        wIn[1] = (cmsFloat32Number) ((Pt[1] + 128) / 255.0);    // form -128..+127 to 0..1\n        wIn[2] = (cmsFloat32Number) ((Pt[2] + 128) / 255.0);\n\n        accum += sizeof(cmsFloat64Number)*(3 + T_EXTRA(info ->InputFormat));\n        return accum;\n    }\n}\n\n// From Lab double to cmsFloat32Number\nstatic\ncmsUInt8Number* UnrollLabFloatToFloat(_cmsTRANSFORM* info,\n                                      cmsFloat32Number wIn[],\n                                      cmsUInt8Number* accum,\n                                      cmsUInt32Number Stride)\n{\n    cmsFloat32Number* Pt = (cmsFloat32Number*) accum;\n\n    if (T_PLANAR(info -> InputFormat)) {\n\n        wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0);                 // from 0..100 to 0..1\n        wIn[1] = (cmsFloat32Number) ((Pt[Stride] + 128) / 255.0);    // form -128..+127 to 0..1\n        wIn[2] = (cmsFloat32Number) ((Pt[Stride*2] + 128) / 255.0);\n\n        return accum + sizeof(cmsFloat32Number);\n    }\n    else {\n\n        wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0);            // from 0..100 to 0..1\n        wIn[1] = (cmsFloat32Number) ((Pt[1] + 128) / 255.0);    // form -128..+127 to 0..1\n        wIn[2] = (cmsFloat32Number) ((Pt[2] + 128) / 255.0);\n\n        accum += sizeof(cmsFloat32Number)*(3 + T_EXTRA(info ->InputFormat));\n        return accum;\n    }\n}\n\n\n\n// 1.15 fixed point, that means maximum value is MAX_ENCODEABLE_XYZ (0xFFFF)\nstatic\ncmsUInt8Number* UnrollXYZDoubleToFloat(_cmsTRANSFORM* info,\n                                       cmsFloat32Number wIn[],\n                                       cmsUInt8Number* accum,\n                                       cmsUInt32Number Stride)\n{\n    cmsFloat64Number* Pt = (cmsFloat64Number*) accum;\n\n    if (T_PLANAR(info -> InputFormat)) {\n\n        wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ);\n        wIn[1] = (cmsFloat32Number) (Pt[Stride] / MAX_ENCODEABLE_XYZ);\n        wIn[2] = (cmsFloat32Number) (Pt[Stride*2] / MAX_ENCODEABLE_XYZ);\n\n        return accum + sizeof(cmsFloat64Number);\n    }\n    else {\n\n        wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ);\n        wIn[1] = (cmsFloat32Number) (Pt[1] / MAX_ENCODEABLE_XYZ);\n        wIn[2] = (cmsFloat32Number) (Pt[2] / MAX_ENCODEABLE_XYZ);\n\n        accum += sizeof(cmsFloat64Number)*(3 + T_EXTRA(info ->InputFormat));\n        return accum;\n    }\n}\n\nstatic\ncmsUInt8Number* UnrollXYZFloatToFloat(_cmsTRANSFORM* info,\n                                      cmsFloat32Number wIn[],\n                                      cmsUInt8Number* accum,\n                                      cmsUInt32Number Stride)\n{\n    cmsFloat32Number* Pt = (cmsFloat32Number*) accum;\n\n    if (T_PLANAR(info -> InputFormat)) {\n\n        wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ);\n        wIn[1] = (cmsFloat32Number) (Pt[Stride] / MAX_ENCODEABLE_XYZ);\n        wIn[2] = (cmsFloat32Number) (Pt[Stride*2] / MAX_ENCODEABLE_XYZ);\n\n        return accum + sizeof(cmsFloat32Number);\n    }\n    else {\n\n        wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ);\n        wIn[1] = (cmsFloat32Number) (Pt[1] / MAX_ENCODEABLE_XYZ);\n        wIn[2] = (cmsFloat32Number) (Pt[2] / MAX_ENCODEABLE_XYZ);\n\n        accum += sizeof(cmsFloat32Number)*(3 + T_EXTRA(info ->InputFormat));\n        return accum;\n    }\n}\n\n\n\n// Packing routines -----------------------------------------------------------------------------------------------------------\n\n\n// Generic chunky for byte\n\nstatic\ncmsUInt8Number* PackAnyBytes(register _cmsTRANSFORM* info,\n                             register cmsUInt16Number wOut[],\n                             register cmsUInt8Number* output,\n                             register cmsUInt32Number Stride)\n{\n    int nChan      = T_CHANNELS(info -> OutputFormat);\n    int DoSwap     = T_DOSWAP(info ->OutputFormat);\n    int Reverse    = T_FLAVOR(info ->OutputFormat);\n    int Extra      = T_EXTRA(info -> OutputFormat);\n    int SwapFirst  = T_SWAPFIRST(info -> OutputFormat);\n    int ExtraFirst = DoSwap ^ SwapFirst;\n    cmsUInt8Number* swap1;\n    cmsUInt8Number v = 0;\n    int i;\n\n    swap1 = output;\n\n    if (ExtraFirst) {\n        output += Extra;\n    }\n\n    for (i=0; i < nChan; i++) {\n\n        int index = DoSwap ? (nChan - i - 1) : i;\n\n        v = FROM_16_TO_8(wOut[index]);\n\n        if (Reverse)\n            v = REVERSE_FLAVOR_8(v);\n\n        *output++ = v;\n    }\n\n    if (!ExtraFirst) {\n        output += Extra;\n    }\n\n    if (Extra == 0 && SwapFirst) {\n\n        memmove(swap1 + 1, swap1, nChan-1);\n        *swap1 = v;\n    }\n\n\n    return output;\n\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n\n\nstatic\ncmsUInt8Number* PackAnyWords(register _cmsTRANSFORM* info,\n                             register cmsUInt16Number wOut[],\n                             register cmsUInt8Number* output,\n                             register cmsUInt32Number Stride)\n{\n    int nChan      = T_CHANNELS(info -> OutputFormat);\n    int SwapEndian = T_ENDIAN16(info -> InputFormat);\n    int DoSwap     = T_DOSWAP(info ->OutputFormat);\n    int Reverse    = T_FLAVOR(info ->OutputFormat);\n    int Extra      = T_EXTRA(info -> OutputFormat);\n    int SwapFirst  = T_SWAPFIRST(info -> OutputFormat);\n    int ExtraFirst = DoSwap ^ SwapFirst;\n    cmsUInt16Number* swap1;\n    cmsUInt16Number v = 0;\n    int i;\n\n    swap1 = (cmsUInt16Number*) output;\n\n    if (ExtraFirst) {\n        output += Extra * sizeof(cmsUInt16Number);\n    }\n\n    for (i=0; i < nChan; i++) {\n\n        int index = DoSwap ? (nChan - i - 1) : i;\n\n        v = wOut[index];\n\n        if (SwapEndian)\n            v = CHANGE_ENDIAN(v);\n\n        if (Reverse)\n            v = REVERSE_FLAVOR_16(v);\n\n        *(cmsUInt16Number*) output = v;\n\n        output += sizeof(cmsUInt16Number);\n    }\n\n    if (!ExtraFirst) {\n        output += Extra * sizeof(cmsUInt16Number);\n    }\n\n    if (Extra == 0 && SwapFirst) {\n\n        memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsUInt16Number));\n        *swap1 = v;\n    }\n\n\n    return output;\n\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n\nstatic\ncmsUInt8Number* PackPlanarBytes(register _cmsTRANSFORM* info,\n                                register cmsUInt16Number wOut[],\n                                register cmsUInt8Number* output,\n                                register cmsUInt32Number Stride)\n{\n    int nChan     = T_CHANNELS(info -> OutputFormat);\n    int DoSwap    = T_DOSWAP(info ->OutputFormat);\n    int SwapFirst = T_SWAPFIRST(info ->OutputFormat);\n    int Reverse   = T_FLAVOR(info ->OutputFormat);\n    int i;\n    cmsUInt8Number* Init = output;\n\n\n    if (DoSwap ^ SwapFirst) {\n        output += T_EXTRA(info -> OutputFormat) * Stride;\n    }\n\n\n    for (i=0; i < nChan; i++) {\n\n        int index = DoSwap ? (nChan - i - 1) : i;\n        cmsUInt8Number v = FROM_16_TO_8(wOut[index]);\n\n        *(cmsUInt8Number*)  output = (cmsUInt8Number) (Reverse ? REVERSE_FLAVOR_8(v) : v);\n        output += Stride;\n    }\n\n    return (Init + 1);\n\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n\nstatic\ncmsUInt8Number* PackPlanarWords(register _cmsTRANSFORM* info,\n                                register cmsUInt16Number wOut[],\n                                register cmsUInt8Number* output,\n                                register cmsUInt32Number Stride)\n{\n    int nChan = T_CHANNELS(info -> OutputFormat);\n    int DoSwap = T_DOSWAP(info ->OutputFormat);\n    int Reverse= T_FLAVOR(info ->OutputFormat);\n    int SwapEndian = T_ENDIAN16(info -> OutputFormat);\n    int i;\n    cmsUInt8Number* Init = output;\n    cmsUInt16Number v;\n\n    if (DoSwap) {\n        output += T_EXTRA(info -> OutputFormat) * Stride * sizeof(cmsUInt16Number);\n    }\n\n    for (i=0; i < nChan; i++) {\n\n        int index = DoSwap ? (nChan - i - 1) : i;\n\n        v = wOut[index];\n\n        if (SwapEndian)\n            v = CHANGE_ENDIAN(v);\n\n        if (Reverse)\n            v =  REVERSE_FLAVOR_16(v);\n\n        *(cmsUInt16Number*) output = v;\n        output += (Stride * sizeof(cmsUInt16Number));\n    }\n\n    return (Init + sizeof(cmsUInt16Number));\n}\n\n// CMYKcm (unrolled for speed)\n\nstatic\ncmsUInt8Number* Pack6Bytes(register _cmsTRANSFORM* info,\n                           register cmsUInt16Number wOut[],\n                           register cmsUInt8Number* output,\n                           register cmsUInt32Number Stride)\n{\n    *output++ = FROM_16_TO_8(wOut[0]);\n    *output++ = FROM_16_TO_8(wOut[1]);\n    *output++ = FROM_16_TO_8(wOut[2]);\n    *output++ = FROM_16_TO_8(wOut[3]);\n    *output++ = FROM_16_TO_8(wOut[4]);\n    *output++ = FROM_16_TO_8(wOut[5]);\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n// KCMYcm\n\nstatic\ncmsUInt8Number* Pack6BytesSwap(register _cmsTRANSFORM* info,\n                               register cmsUInt16Number wOut[],\n                               register cmsUInt8Number* output,\n                               register cmsUInt32Number Stride)\n{\n    *output++ = FROM_16_TO_8(wOut[5]);\n    *output++ = FROM_16_TO_8(wOut[4]);\n    *output++ = FROM_16_TO_8(wOut[3]);\n    *output++ = FROM_16_TO_8(wOut[2]);\n    *output++ = FROM_16_TO_8(wOut[1]);\n    *output++ = FROM_16_TO_8(wOut[0]);\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n// CMYKcm\nstatic\ncmsUInt8Number* Pack6Words(register _cmsTRANSFORM* info,\n                           register cmsUInt16Number wOut[],\n                           register cmsUInt8Number* output,\n                           register cmsUInt32Number Stride)\n{\n    *(cmsUInt16Number*) output = wOut[0];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[1];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[2];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[3];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[4];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[5];\n    output+= 2;\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n// KCMYcm\nstatic\ncmsUInt8Number* Pack6WordsSwap(register _cmsTRANSFORM* info,\n                               register cmsUInt16Number wOut[],\n                               register cmsUInt8Number* output,\n                               register cmsUInt32Number Stride)\n{\n    *(cmsUInt16Number*) output = wOut[5];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[4];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[3];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[2];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[1];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[0];\n    output+= 2;\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n\nstatic\ncmsUInt8Number* Pack4Bytes(register _cmsTRANSFORM* info,\n                           register cmsUInt16Number wOut[],\n                           register cmsUInt8Number* output,\n                           register cmsUInt32Number Stride)\n{\n    *output++ = FROM_16_TO_8(wOut[0]);\n    *output++ = FROM_16_TO_8(wOut[1]);\n    *output++ = FROM_16_TO_8(wOut[2]);\n    *output++ = FROM_16_TO_8(wOut[3]);\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Pack4BytesReverse(register _cmsTRANSFORM* info,\n                                  register cmsUInt16Number wOut[],\n                                  register cmsUInt8Number* output,\n                                  register cmsUInt32Number Stride)\n{\n    *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[0]));\n    *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[1]));\n    *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[2]));\n    *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[3]));\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n\nstatic\ncmsUInt8Number* Pack4BytesSwapFirst(register _cmsTRANSFORM* info,\n                                    register cmsUInt16Number wOut[],\n                                    register cmsUInt8Number* output,\n                                    register cmsUInt32Number Stride)\n{\n    *output++ = FROM_16_TO_8(wOut[3]);\n    *output++ = FROM_16_TO_8(wOut[0]);\n    *output++ = FROM_16_TO_8(wOut[1]);\n    *output++ = FROM_16_TO_8(wOut[2]);\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n// ABGR\nstatic\ncmsUInt8Number* Pack4BytesSwap(register _cmsTRANSFORM* info,\n                               register cmsUInt16Number wOut[],\n                               register cmsUInt8Number* output,\n                               register cmsUInt32Number Stride)\n{\n    *output++ = FROM_16_TO_8(wOut[3]);\n    *output++ = FROM_16_TO_8(wOut[2]);\n    *output++ = FROM_16_TO_8(wOut[1]);\n    *output++ = FROM_16_TO_8(wOut[0]);\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Pack4BytesSwapSwapFirst(register _cmsTRANSFORM* info,\n                                        register cmsUInt16Number wOut[],\n                                        register cmsUInt8Number* output,\n                                        register cmsUInt32Number Stride)\n{\n    *output++ = FROM_16_TO_8(wOut[2]);\n    *output++ = FROM_16_TO_8(wOut[1]);\n    *output++ = FROM_16_TO_8(wOut[0]);\n    *output++ = FROM_16_TO_8(wOut[3]);\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Pack4Words(register _cmsTRANSFORM* info,\n                           register cmsUInt16Number wOut[],\n                           register cmsUInt8Number* output,\n                           register cmsUInt32Number Stride)\n{\n    *(cmsUInt16Number*) output = wOut[0];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[1];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[2];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[3];\n    output+= 2;\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Pack4WordsReverse(register _cmsTRANSFORM* info,\n                                  register cmsUInt16Number wOut[],\n                                  register cmsUInt8Number* output,\n                                  register cmsUInt32Number Stride)\n{\n    *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[0]);\n    output+= 2;\n    *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[1]);\n    output+= 2;\n    *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[2]);\n    output+= 2;\n    *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[3]);\n    output+= 2;\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n// ABGR\nstatic\ncmsUInt8Number* Pack4WordsSwap(register _cmsTRANSFORM* info,\n                               register cmsUInt16Number wOut[],\n                               register cmsUInt8Number* output,\n                               register cmsUInt32Number Stride)\n{\n    *(cmsUInt16Number*) output = wOut[3];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[2];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[1];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[0];\n    output+= 2;\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n// CMYK\nstatic\ncmsUInt8Number* Pack4WordsBigEndian(register _cmsTRANSFORM* info,\n                                    register cmsUInt16Number wOut[],\n                                    register cmsUInt8Number* output,\n                                    register cmsUInt32Number Stride)\n{\n    *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[0]);\n    output+= 2;\n    *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[1]);\n    output+= 2;\n    *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[2]);\n    output+= 2;\n    *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[3]);\n    output+= 2;\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n\nstatic\ncmsUInt8Number* PackLabV2_8(register _cmsTRANSFORM* info,\n                            register cmsUInt16Number wOut[],\n                            register cmsUInt8Number* output,\n                            register cmsUInt32Number Stride)\n{\n    *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[0]));\n    *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[1]));\n    *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[2]));\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* PackALabV2_8(register _cmsTRANSFORM* info,\n                             register cmsUInt16Number wOut[],\n                             register cmsUInt8Number* output,\n                             register cmsUInt32Number Stride)\n{\n    output++;\n    *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[0]));\n    *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[1]));\n    *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[2]));\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* PackLabV2_16(register _cmsTRANSFORM* info,\n                             register cmsUInt16Number wOut[],\n                             register cmsUInt8Number* output,\n                             register cmsUInt32Number Stride)\n{\n    *(cmsUInt16Number*) output = FomLabV4ToLabV2(wOut[0]);\n    output += 2;\n    *(cmsUInt16Number*) output = FomLabV4ToLabV2(wOut[1]);\n    output += 2;\n    *(cmsUInt16Number*) output = FomLabV4ToLabV2(wOut[2]);\n    output += 2;\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Pack3Bytes(register _cmsTRANSFORM* info,\n                           register cmsUInt16Number wOut[],\n                           register cmsUInt8Number* output,\n                           register cmsUInt32Number Stride)\n{\n    *output++ = FROM_16_TO_8(wOut[0]);\n    *output++ = FROM_16_TO_8(wOut[1]);\n    *output++ = FROM_16_TO_8(wOut[2]);\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Pack3BytesOptimized(register _cmsTRANSFORM* info,\n                                    register cmsUInt16Number wOut[],\n                                    register cmsUInt8Number* output,\n                                    register cmsUInt32Number Stride)\n{\n    *output++ = (wOut[0] & 0xFF);\n    *output++ = (wOut[1] & 0xFF);\n    *output++ = (wOut[2] & 0xFF);\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Pack3BytesSwap(register _cmsTRANSFORM* info,\n                               register cmsUInt16Number wOut[],\n                               register cmsUInt8Number* output,\n                               register cmsUInt32Number Stride)\n{\n    *output++ = FROM_16_TO_8(wOut[2]);\n    *output++ = FROM_16_TO_8(wOut[1]);\n    *output++ = FROM_16_TO_8(wOut[0]);\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Pack3BytesSwapOptimized(register _cmsTRANSFORM* info,\n                                        register cmsUInt16Number wOut[],\n                                        register cmsUInt8Number* output,\n                                        register cmsUInt32Number Stride)\n{\n    *output++ = (wOut[2] & 0xFF);\n    *output++ = (wOut[1] & 0xFF);\n    *output++ = (wOut[0] & 0xFF);\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n\nstatic\ncmsUInt8Number* Pack3Words(register _cmsTRANSFORM* info,\n                           register cmsUInt16Number wOut[],\n                           register cmsUInt8Number* output,\n                           register cmsUInt32Number Stride)\n{\n    *(cmsUInt16Number*) output = wOut[0];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[1];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[2];\n    output+= 2;\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Pack3WordsSwap(register _cmsTRANSFORM* info,\n                               register cmsUInt16Number wOut[],\n                               register cmsUInt8Number* output,\n                               register cmsUInt32Number Stride)\n{\n    *(cmsUInt16Number*) output = wOut[2];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[1];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[0];\n    output+= 2;\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Pack3WordsBigEndian(register _cmsTRANSFORM* info,\n                                    register cmsUInt16Number wOut[],\n                                    register cmsUInt8Number* output,\n                                    register cmsUInt32Number Stride)\n{\n    *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[0]);\n    output+= 2;\n    *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[1]);\n    output+= 2;\n    *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[2]);\n    output+= 2;\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Pack3BytesAndSkip1(register _cmsTRANSFORM* info,\n                                   register cmsUInt16Number wOut[],\n                                   register cmsUInt8Number* output,\n                                   register cmsUInt32Number Stride)\n{\n    *output++ = FROM_16_TO_8(wOut[0]);\n    *output++ = FROM_16_TO_8(wOut[1]);\n    *output++ = FROM_16_TO_8(wOut[2]);\n    output++;\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Pack3BytesAndSkip1Optimized(register _cmsTRANSFORM* info,\n                                            register cmsUInt16Number wOut[],\n                                            register cmsUInt8Number* output,\n                                            register cmsUInt32Number Stride)\n{\n    *output++ = (wOut[0] & 0xFF);\n    *output++ = (wOut[1] & 0xFF);\n    *output++ = (wOut[2] & 0xFF);\n    output++;\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n\nstatic\ncmsUInt8Number* Pack3BytesAndSkip1SwapFirst(register _cmsTRANSFORM* info,\n                                            register cmsUInt16Number wOut[],\n                                            register cmsUInt8Number* output,\n                                            register cmsUInt32Number Stride)\n{\n    output++;\n    *output++ = FROM_16_TO_8(wOut[0]);\n    *output++ = FROM_16_TO_8(wOut[1]);\n    *output++ = FROM_16_TO_8(wOut[2]);\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Pack3BytesAndSkip1SwapFirstOptimized(register _cmsTRANSFORM* info,\n                                                     register cmsUInt16Number wOut[],\n                                                     register cmsUInt8Number* output,\n                                                     register cmsUInt32Number Stride)\n{\n    output++;\n    *output++ = (wOut[0] & 0xFF);\n    *output++ = (wOut[1] & 0xFF);\n    *output++ = (wOut[2] & 0xFF);\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Pack3BytesAndSkip1Swap(register _cmsTRANSFORM* info,\n                                       register cmsUInt16Number wOut[],\n                                       register cmsUInt8Number* output,\n                                       register cmsUInt32Number Stride)\n{\n    output++;\n    *output++ = FROM_16_TO_8(wOut[2]);\n    *output++ = FROM_16_TO_8(wOut[1]);\n    *output++ = FROM_16_TO_8(wOut[0]);\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Pack3BytesAndSkip1SwapOptimized(register _cmsTRANSFORM* info,\n                                                register cmsUInt16Number wOut[],\n                                                register cmsUInt8Number* output,\n                                                register cmsUInt32Number Stride)\n{\n    output++;\n    *output++ = (wOut[2] & 0xFF);\n    *output++ = (wOut[1] & 0xFF);\n    *output++ = (wOut[0] & 0xFF);\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n\nstatic\ncmsUInt8Number* Pack3BytesAndSkip1SwapSwapFirst(register _cmsTRANSFORM* info,\n                                                register cmsUInt16Number wOut[],\n                                                register cmsUInt8Number* output,\n                                                register cmsUInt32Number Stride)\n{\n    *output++ = FROM_16_TO_8(wOut[2]);\n    *output++ = FROM_16_TO_8(wOut[1]);\n    *output++ = FROM_16_TO_8(wOut[0]);\n    output++;\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Pack3BytesAndSkip1SwapSwapFirstOptimized(register _cmsTRANSFORM* info,\n                                                         register cmsUInt16Number wOut[],\n                                                         register cmsUInt8Number* output,\n                                                         register cmsUInt32Number Stride)\n{\n    *output++ = (wOut[2] & 0xFF);\n    *output++ = (wOut[1] & 0xFF);\n    *output++ = (wOut[0] & 0xFF);\n    output++;\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Pack3WordsAndSkip1(register _cmsTRANSFORM* info,\n                                   register cmsUInt16Number wOut[],\n                                   register cmsUInt8Number* output,\n                                   register cmsUInt32Number Stride)\n{\n    *(cmsUInt16Number*) output = wOut[0];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[1];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[2];\n    output+= 2;\n    output+= 2;\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Pack3WordsAndSkip1Swap(register _cmsTRANSFORM* info,\n                                       register cmsUInt16Number wOut[],\n                                       register cmsUInt8Number* output,\n                                       register cmsUInt32Number Stride)\n{\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[2];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[1];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[0];\n    output+= 2;\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n\nstatic\ncmsUInt8Number* Pack3WordsAndSkip1SwapFirst(register _cmsTRANSFORM* info,\n                                            register cmsUInt16Number wOut[],\n                                            register cmsUInt8Number* output,\n                                            register cmsUInt32Number Stride)\n{\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[0];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[1];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[2];\n    output+= 2;\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n\nstatic\ncmsUInt8Number* Pack3WordsAndSkip1SwapSwapFirst(register _cmsTRANSFORM* info,\n                                                register cmsUInt16Number wOut[],\n                                                register cmsUInt8Number* output,\n                                                register cmsUInt32Number Stride)\n{\n    *(cmsUInt16Number*) output = wOut[2];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[1];\n    output+= 2;\n    *(cmsUInt16Number*) output = wOut[0];\n    output+= 2;\n    output+= 2;\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n\n\nstatic\ncmsUInt8Number* Pack1Byte(register _cmsTRANSFORM* info,\n                          register cmsUInt16Number wOut[],\n                          register cmsUInt8Number* output,\n                          register cmsUInt32Number Stride)\n{\n    *output++ = FROM_16_TO_8(wOut[0]);\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n\nstatic\ncmsUInt8Number* Pack1ByteReversed(register _cmsTRANSFORM* info,\n                                  register cmsUInt16Number wOut[],\n                                  register cmsUInt8Number* output,\n                                  register cmsUInt32Number Stride)\n{\n    *output++ = FROM_16_TO_8(REVERSE_FLAVOR_16(wOut[0]));\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n\nstatic\ncmsUInt8Number* Pack1ByteSkip1(register _cmsTRANSFORM* info,\n                               register cmsUInt16Number wOut[],\n                               register cmsUInt8Number* output,\n                               register cmsUInt32Number Stride)\n{\n    *output++ = FROM_16_TO_8(wOut[0]);\n    output++;\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n\nstatic\ncmsUInt8Number* Pack1ByteSkip1SwapFirst(register _cmsTRANSFORM* info,\n                                        register cmsUInt16Number wOut[],\n                                        register cmsUInt8Number* output,\n                                        register cmsUInt32Number Stride)\n{\n    output++;\n    *output++ = FROM_16_TO_8(wOut[0]);\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Pack1Word(register _cmsTRANSFORM* info,\n                          register cmsUInt16Number wOut[],\n                          register cmsUInt8Number* output,\n                          register cmsUInt32Number Stride)\n{\n    *(cmsUInt16Number*) output = wOut[0];\n    output+= 2;\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n\nstatic\ncmsUInt8Number* Pack1WordReversed(register _cmsTRANSFORM* info,\n                                  register cmsUInt16Number wOut[],\n                                  register cmsUInt8Number* output,\n                                  register cmsUInt32Number Stride)\n{\n    *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[0]);\n    output+= 2;\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Pack1WordBigEndian(register _cmsTRANSFORM* info,\n                                   register cmsUInt16Number wOut[],\n                                   register cmsUInt8Number* output,\n                                   register cmsUInt32Number Stride)\n{\n    *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[0]);\n    output+= 2;\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n\nstatic\ncmsUInt8Number* Pack1WordSkip1(register _cmsTRANSFORM* info,\n                               register cmsUInt16Number wOut[],\n                               register cmsUInt8Number* output,\n                               register cmsUInt32Number Stride)\n{\n    *(cmsUInt16Number*) output = wOut[0];\n    output+= 4;\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\nstatic\ncmsUInt8Number* Pack1WordSkip1SwapFirst(register _cmsTRANSFORM* info,\n                                        register cmsUInt16Number wOut[],\n                                        register cmsUInt8Number* output,\n                                        register cmsUInt32Number Stride)\n{\n    output += 2;\n    *(cmsUInt16Number*) output = wOut[0];\n    output+= 2;\n\n    return output;\n\n    cmsUNUSED_PARAMETER(info);\n    cmsUNUSED_PARAMETER(Stride);\n}\n\n\n// Unencoded Float values -- don't try optimize speed\nstatic\ncmsUInt8Number* PackLabDoubleFrom16(register _cmsTRANSFORM* info,\n                                    register cmsUInt16Number wOut[],\n                                    register cmsUInt8Number* output,\n                                    register cmsUInt32Number Stride)\n{\n\n    if (T_PLANAR(info -> OutputFormat)) {\n\n        cmsCIELab  Lab;\n        cmsFloat64Number* Out = (cmsFloat64Number*) output;\n        cmsLabEncoded2Float(&Lab, wOut);\n\n        Out[0]        = Lab.L;\n        Out[Stride]   = Lab.a;\n        Out[Stride*2] = Lab.b;\n\n        return output + sizeof(cmsFloat64Number);\n    }\n    else {\n\n        cmsLabEncoded2Float((cmsCIELab*) output, wOut);\n        return output + (sizeof(cmsCIELab) + T_EXTRA(info ->OutputFormat) * sizeof(cmsFloat64Number));\n    }\n}\n\n\nstatic\ncmsUInt8Number* PackLabFloatFrom16(register _cmsTRANSFORM* info,\n                                    register cmsUInt16Number wOut[],\n                                    register cmsUInt8Number* output,\n                                    register cmsUInt32Number Stride)\n{\n    cmsCIELab  Lab;\n    cmsLabEncoded2Float(&Lab, wOut);\n\n    if (T_PLANAR(info -> OutputFormat)) {\n       \n        cmsFloat32Number* Out = (cmsFloat32Number*) output;\n    \n        Out[0]        = (cmsFloat32Number)Lab.L;\n        Out[Stride]   = (cmsFloat32Number)Lab.a;\n        Out[Stride*2] = (cmsFloat32Number)Lab.b;\n\n        return output + sizeof(cmsFloat32Number);\n    }\n    else {\n\n       ((cmsFloat32Number*) output)[0] = (cmsFloat32Number) Lab.L;\n       ((cmsFloat32Number*) output)[1] = (cmsFloat32Number) Lab.a;\n       ((cmsFloat32Number*) output)[2] = (cmsFloat32Number) Lab.b;\n\n        return output + (3 + T_EXTRA(info ->OutputFormat)) * sizeof(cmsFloat32Number);\n    }\n}\n\nstatic\ncmsUInt8Number* PackXYZDoubleFrom16(register _cmsTRANSFORM* Info,\n                                    register cmsUInt16Number wOut[],\n                                    register cmsUInt8Number* output,\n                                    register cmsUInt32Number Stride)\n{\n    if (T_PLANAR(Info -> OutputFormat)) {\n\n        cmsCIEXYZ XYZ;\n        cmsFloat64Number* Out = (cmsFloat64Number*) output;\n        cmsXYZEncoded2Float(&XYZ, wOut);\n\n        Out[0]        = XYZ.X;\n        Out[Stride]   = XYZ.Y;\n        Out[Stride*2] = XYZ.Z;\n\n        return output + sizeof(cmsFloat64Number);\n\n    }\n    else {\n\n        cmsXYZEncoded2Float((cmsCIEXYZ*) output, wOut);\n\n        return output + (sizeof(cmsCIEXYZ) + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat64Number));\n    }\n}\n\nstatic\ncmsUInt8Number* PackXYZFloatFrom16(register _cmsTRANSFORM* Info,\n                                   register cmsUInt16Number wOut[],\n                                   register cmsUInt8Number* output,\n                                   register cmsUInt32Number Stride)\n{\n    if (T_PLANAR(Info -> OutputFormat)) {\n\n        cmsCIEXYZ XYZ;\n        cmsFloat32Number* Out = (cmsFloat32Number*) output;\n        cmsXYZEncoded2Float(&XYZ, wOut);\n\n        Out[0]        = (cmsFloat32Number) XYZ.X;\n        Out[Stride]   = (cmsFloat32Number) XYZ.Y;\n        Out[Stride*2] = (cmsFloat32Number) XYZ.Z;\n\n        return output + sizeof(cmsFloat32Number);\n\n    }\n    else {\n\n        cmsCIEXYZ XYZ;\n        cmsFloat32Number* Out = (cmsFloat32Number*) output;\n        cmsXYZEncoded2Float(&XYZ, wOut);\n\n        Out[0] = (cmsFloat32Number) XYZ.X;\n        Out[1] = (cmsFloat32Number) XYZ.Y;\n        Out[2] = (cmsFloat32Number) XYZ.Z;\n\n        return output + (3 * sizeof(cmsFloat32Number) + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat32Number));\n    }\n}\n\nstatic\ncmsUInt8Number* PackDoubleFrom16(register _cmsTRANSFORM* info,\n                                register cmsUInt16Number wOut[],\n                                register cmsUInt8Number* output,\n                                register cmsUInt32Number Stride)\n{\n    int nChan      = T_CHANNELS(info -> OutputFormat);\n    int DoSwap     = T_DOSWAP(info ->OutputFormat);\n    int Reverse    = T_FLAVOR(info ->OutputFormat);\n    int Extra      = T_EXTRA(info -> OutputFormat);\n    int SwapFirst  = T_SWAPFIRST(info -> OutputFormat);\n    int Planar     = T_PLANAR(info -> OutputFormat);\n    int ExtraFirst = DoSwap ^ SwapFirst;\n    cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 655.35 : 65535.0;\n    cmsFloat64Number v = 0;\n    cmsFloat64Number* swap1 = (cmsFloat64Number*) output;\n    int i, start = 0;\n\n    if (ExtraFirst)\n        start = Extra;\n\n    for (i=0; i < nChan; i++) {\n\n        int index = DoSwap ? (nChan - i - 1) : i;\n\n        v = (cmsFloat64Number) wOut[index] / maximum;\n\n        if (Reverse)\n            v = maximum - v;\n\n        if (Planar)\n            ((cmsFloat64Number*) output)[(i + start)  * Stride]= v;\n        else\n            ((cmsFloat64Number*) output)[i + start] = v;\n    }\n\n    if (!ExtraFirst) {\n        output += Extra * sizeof(cmsFloat64Number);\n    }\n\n    if (Extra == 0 && SwapFirst) {\n\n         memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat64Number));\n        *swap1 = v;\n    }\n\n    if (T_PLANAR(info -> OutputFormat))\n        return output + sizeof(cmsFloat64Number);\n    else\n        return output + nChan * sizeof(cmsFloat64Number);\n\n}\n\n\nstatic\ncmsUInt8Number* PackFloatFrom16(register _cmsTRANSFORM* info,\n                                register cmsUInt16Number wOut[],\n                                register cmsUInt8Number* output,\n                                register cmsUInt32Number Stride)\n{\n    int nChan      = T_CHANNELS(info -> OutputFormat);\n    int DoSwap     = T_DOSWAP(info ->OutputFormat);\n    int Reverse    = T_FLAVOR(info ->OutputFormat);\n    int Extra      = T_EXTRA(info -> OutputFormat);\n    int SwapFirst  = T_SWAPFIRST(info -> OutputFormat);\n    int Planar     = T_PLANAR(info -> OutputFormat);\n    int ExtraFirst = DoSwap ^ SwapFirst;\n    cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 655.35 : 65535.0;\n    cmsFloat64Number v = 0;\n    cmsFloat32Number* swap1 = (cmsFloat32Number*) output;\n    int i, start = 0;\n\n    if (ExtraFirst)\n        start = Extra;\n\n    for (i=0; i < nChan; i++) {\n\n        int index = DoSwap ? (nChan - i - 1) : i;\n\n        v = (cmsFloat64Number) wOut[index] / maximum;\n\n        if (Reverse)\n            v = maximum - v;\n\n        if (Planar)\n            ((cmsFloat32Number*) output)[(i + start ) * Stride]= (cmsFloat32Number) v;\n        else\n            ((cmsFloat32Number*) output)[i + start] = (cmsFloat32Number) v;\n    }\n\n    if (!ExtraFirst) {\n        output += Extra * sizeof(cmsFloat32Number);\n    }\n\n  if (Extra == 0 && SwapFirst) {\n\n         memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat32Number));\n        *swap1 = (cmsFloat32Number) v;\n    }\n\n    if (T_PLANAR(info -> OutputFormat))\n        return output + sizeof(cmsFloat32Number);\n    else\n        return output + nChan * sizeof(cmsFloat32Number);\n}\n\n\n\n// --------------------------------------------------------------------------------------------------------\n\nstatic\ncmsUInt8Number* PackFloatsFromFloat(_cmsTRANSFORM* info,\n                                    cmsFloat32Number wOut[],\n                                    cmsUInt8Number* output,\n                                    cmsUInt32Number Stride)\n{\n    int nChan      = T_CHANNELS(info -> OutputFormat);\n    int DoSwap     = T_DOSWAP(info ->OutputFormat);\n    int Reverse    = T_FLAVOR(info ->OutputFormat);\n    int Extra      = T_EXTRA(info -> OutputFormat);\n    int SwapFirst  = T_SWAPFIRST(info -> OutputFormat);\n    int Planar     = T_PLANAR(info -> OutputFormat);\n    int ExtraFirst = DoSwap ^ SwapFirst;\n    cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 100.0 : 1.0;\n    cmsFloat32Number* swap1 = (cmsFloat32Number*) output;\n    cmsFloat64Number v = 0;\n    int i, start = 0;\n\n    if (ExtraFirst)\n        start = Extra;\n\n    for (i=0; i < nChan; i++) {\n\n        int index = DoSwap ? (nChan - i - 1) : i;\n\n        v = wOut[index] * maximum;\n\n        if (Reverse)\n            v = maximum - v;\n\n        if (Planar)\n            ((cmsFloat32Number*) output)[(i + start)* Stride]= (cmsFloat32Number) v;\n        else\n            ((cmsFloat32Number*) output)[i + start] = (cmsFloat32Number) v;\n    }\n\n    if (!ExtraFirst) {\n        output += Extra * sizeof(cmsFloat32Number);\n    }\n\n   if (Extra == 0 && SwapFirst) {\n\n         memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat32Number));\n        *swap1 = (cmsFloat32Number) v;\n    }\n\n    if (T_PLANAR(info -> OutputFormat))\n        return output + sizeof(cmsFloat32Number);\n    else\n        return output + nChan * sizeof(cmsFloat32Number);\n}\n\nstatic\ncmsUInt8Number* PackDoublesFromFloat(_cmsTRANSFORM* info,\n                                    cmsFloat32Number wOut[],\n                                    cmsUInt8Number* output,\n                                    cmsUInt32Number Stride)\n{\n    int nChan      = T_CHANNELS(info -> OutputFormat);\n    int DoSwap     = T_DOSWAP(info ->OutputFormat);\n    int Reverse    = T_FLAVOR(info ->OutputFormat);\n    int Extra      = T_EXTRA(info -> OutputFormat);\n    int SwapFirst  = T_SWAPFIRST(info -> OutputFormat);\n    int Planar     = T_PLANAR(info -> OutputFormat);\n    int ExtraFirst = DoSwap ^ SwapFirst;\n    cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 100.0 : 1.0;\n    cmsFloat64Number v = 0;\n    cmsFloat64Number* swap1 = (cmsFloat64Number*) output;\n    int i, start = 0;\n\n    if (ExtraFirst)\n        start = Extra;\n\n    for (i=0; i < nChan; i++) {\n\n        int index = DoSwap ? (nChan - i - 1) : i;\n\n        v = wOut[index] * maximum;\n\n        if (Reverse)\n            v = maximum - v;\n\n        if (Planar)\n            ((cmsFloat64Number*) output)[(i + start) * Stride] =  v;\n        else\n            ((cmsFloat64Number*) output)[i + start] =  v;\n    }\n\n    if (!ExtraFirst) {\n        output += Extra * sizeof(cmsFloat64Number);\n    }\n\n   if (Extra == 0 && SwapFirst) {\n\n         memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat64Number));\n        *swap1 = v;\n    }\n\n\n    if (T_PLANAR(info -> OutputFormat))\n        return output + sizeof(cmsFloat64Number);\n    else\n        return output + nChan * sizeof(cmsFloat64Number);\n\n}\n\n\n\n\n\nstatic\ncmsUInt8Number* PackLabFloatFromFloat(_cmsTRANSFORM* Info,\n                                      cmsFloat32Number wOut[],\n                                      cmsUInt8Number* output,\n                                      cmsUInt32Number Stride)\n{\n    cmsFloat32Number* Out = (cmsFloat32Number*) output;\n\n    if (T_PLANAR(Info -> OutputFormat)) {\n\n        Out[0]        = (cmsFloat32Number) (wOut[0] * 100.0);\n        Out[Stride]   = (cmsFloat32Number) (wOut[1] * 255.0 - 128.0);\n        Out[Stride*2] = (cmsFloat32Number) (wOut[2] * 255.0 - 128.0);\n\n        return output + sizeof(cmsFloat32Number);\n    }\n    else {\n\n        Out[0] = (cmsFloat32Number) (wOut[0] * 100.0);\n        Out[1] = (cmsFloat32Number) (wOut[1] * 255.0 - 128.0);\n        Out[2] = (cmsFloat32Number) (wOut[2] * 255.0 - 128.0);\n\n        return output + (sizeof(cmsFloat32Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat32Number));\n    }\n\n}\n\n\nstatic\ncmsUInt8Number* PackLabDoubleFromFloat(_cmsTRANSFORM* Info,\n                                       cmsFloat32Number wOut[],\n                                       cmsUInt8Number* output,\n                                       cmsUInt32Number Stride)\n{\n    cmsFloat64Number* Out = (cmsFloat64Number*) output;\n\n    if (T_PLANAR(Info -> OutputFormat)) {\n\n        Out[0]        = (cmsFloat64Number) (wOut[0] * 100.0);\n        Out[Stride]   = (cmsFloat64Number) (wOut[1] * 255.0 - 128.0);\n        Out[Stride*2] = (cmsFloat64Number) (wOut[2] * 255.0 - 128.0);\n\n        return output + sizeof(cmsFloat64Number);\n    }\n    else {\n\n        Out[0] = (cmsFloat64Number) (wOut[0] * 100.0);\n        Out[1] = (cmsFloat64Number) (wOut[1] * 255.0 - 128.0);\n        Out[2] = (cmsFloat64Number) (wOut[2] * 255.0 - 128.0);\n\n        return output + (sizeof(cmsFloat64Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat64Number));\n    }\n\n}\n\n\n// From 0..1 range to 0..MAX_ENCODEABLE_XYZ\nstatic\ncmsUInt8Number* PackXYZFloatFromFloat(_cmsTRANSFORM* Info,\n                                      cmsFloat32Number wOut[],\n                                      cmsUInt8Number* output,\n                                      cmsUInt32Number Stride)\n{\n    cmsFloat32Number* Out = (cmsFloat32Number*) output;\n\n    if (T_PLANAR(Info -> OutputFormat)) {\n\n        Out[0]        = (cmsFloat32Number) (wOut[0] * MAX_ENCODEABLE_XYZ);\n        Out[Stride]   = (cmsFloat32Number) (wOut[1] * MAX_ENCODEABLE_XYZ);\n        Out[Stride*2] = (cmsFloat32Number) (wOut[2] * MAX_ENCODEABLE_XYZ);\n\n        return output + sizeof(cmsFloat32Number);\n    }\n    else {\n\n        Out[0] = (cmsFloat32Number) (wOut[0] * MAX_ENCODEABLE_XYZ);\n        Out[1] = (cmsFloat32Number) (wOut[1] * MAX_ENCODEABLE_XYZ);\n        Out[2] = (cmsFloat32Number) (wOut[2] * MAX_ENCODEABLE_XYZ);\n\n        return output + (sizeof(cmsFloat32Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat32Number));\n    }\n\n}\n\n// Same, but convert to double\nstatic\ncmsUInt8Number* PackXYZDoubleFromFloat(_cmsTRANSFORM* Info,\n                                       cmsFloat32Number wOut[],\n                                       cmsUInt8Number* output,\n                                       cmsUInt32Number Stride)\n{\n    cmsFloat64Number* Out = (cmsFloat64Number*) output;\n\n    if (T_PLANAR(Info -> OutputFormat)) {\n\n        Out[0]        = (cmsFloat64Number) (wOut[0] * MAX_ENCODEABLE_XYZ);\n        Out[Stride]   = (cmsFloat64Number) (wOut[1] * MAX_ENCODEABLE_XYZ);\n        Out[Stride*2] = (cmsFloat64Number) (wOut[2] * MAX_ENCODEABLE_XYZ);\n\n        return output + sizeof(cmsFloat64Number);\n    }\n    else {\n\n        Out[0] = (cmsFloat64Number) (wOut[0] * MAX_ENCODEABLE_XYZ);\n        Out[1] = (cmsFloat64Number) (wOut[1] * MAX_ENCODEABLE_XYZ);\n        Out[2] = (cmsFloat64Number) (wOut[2] * MAX_ENCODEABLE_XYZ);\n\n        return output + (sizeof(cmsFloat64Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat64Number));\n    }\n\n}\n\n\n// ----------------------------------------------------------------------------------------------------------------\n\n#ifndef CMS_NO_HALF_SUPPORT \n\n// Decodes an stream of half floats to wIn[] described by input format\n\nstatic\ncmsUInt8Number* UnrollHalfTo16(register _cmsTRANSFORM* info,\n                                register cmsUInt16Number wIn[],\n                                register cmsUInt8Number* accum,\n                                register cmsUInt32Number Stride)\n{\n\n    int nChan      = T_CHANNELS(info -> InputFormat);\n    int DoSwap     = T_DOSWAP(info ->InputFormat);\n    int Reverse    = T_FLAVOR(info ->InputFormat);\n    int SwapFirst  = T_SWAPFIRST(info -> InputFormat);\n    int Extra      = T_EXTRA(info -> InputFormat);\n    int ExtraFirst = DoSwap ^ SwapFirst;\n    int Planar     = T_PLANAR(info -> InputFormat);\n    cmsFloat32Number v;\n    int i, start = 0;\n    cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 655.35F : 65535.0F;\n\n\n    if (ExtraFirst)\n            start = Extra;\n\n    for (i=0; i < nChan; i++) {\n\n        int index = DoSwap ? (nChan - i - 1) : i;\n\n        if (Planar)\n            v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[(i + start) * Stride] );\n        else\n            v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[i + start] ) ;\n\n        if (Reverse) v = maximum - v;\n\n        wIn[index] = _cmsQuickSaturateWord(v * maximum);\n    }\n\n\n    if (Extra == 0 && SwapFirst) {\n        cmsUInt16Number tmp = wIn[0];\n\n        memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number));\n        wIn[nChan-1] = tmp;\n    }\n\n    if (T_PLANAR(info -> InputFormat))\n        return accum + sizeof(cmsUInt16Number);\n    else\n        return accum + (nChan + Extra) * sizeof(cmsUInt16Number);\n}\n\n// Decodes an stream of half floats to wIn[] described by input format\n\nstatic\ncmsUInt8Number* UnrollHalfToFloat(_cmsTRANSFORM* info,\n                                    cmsFloat32Number wIn[],\n                                    cmsUInt8Number* accum,\n                                    cmsUInt32Number Stride)\n{\n\n    int nChan      = T_CHANNELS(info -> InputFormat);\n    int DoSwap     = T_DOSWAP(info ->InputFormat);\n    int Reverse    = T_FLAVOR(info ->InputFormat);\n    int SwapFirst  = T_SWAPFIRST(info -> InputFormat);\n    int Extra      = T_EXTRA(info -> InputFormat);\n    int ExtraFirst = DoSwap ^ SwapFirst;\n    int Planar     = T_PLANAR(info -> InputFormat);\n    cmsFloat32Number v;\n    int i, start = 0;\n    cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 100.0F : 1.0F;\n\n\n    if (ExtraFirst)\n            start = Extra;\n\n    for (i=0; i < nChan; i++) {\n\n        int index = DoSwap ? (nChan - i - 1) : i;\n\n        if (Planar)\n            v =  _cmsHalf2Float ( ((cmsUInt16Number*) accum)[(i + start) * Stride] );\n        else\n            v =  _cmsHalf2Float ( ((cmsUInt16Number*) accum)[i + start] ) ;\n\n        v /= maximum;\n\n        wIn[index] = Reverse ? 1 - v : v;\n    }\n\n\n    if (Extra == 0 && SwapFirst) {\n        cmsFloat32Number tmp = wIn[0];\n\n        memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number));\n        wIn[nChan-1] = tmp;\n    }\n\n    if (T_PLANAR(info -> InputFormat))\n        return accum + sizeof(cmsUInt16Number);\n    else\n        return accum + (nChan + Extra) * sizeof(cmsUInt16Number);\n}\n\n\nstatic\ncmsUInt8Number* PackHalfFrom16(register _cmsTRANSFORM* info,\n                                register cmsUInt16Number wOut[],\n                                register cmsUInt8Number* output,\n                                register cmsUInt32Number Stride)\n{\n    int nChan      = T_CHANNELS(info -> OutputFormat);\n    int DoSwap     = T_DOSWAP(info ->OutputFormat);\n    int Reverse    = T_FLAVOR(info ->OutputFormat);\n    int Extra      = T_EXTRA(info -> OutputFormat);\n    int SwapFirst  = T_SWAPFIRST(info -> OutputFormat);\n    int Planar     = T_PLANAR(info -> OutputFormat);\n    int ExtraFirst = DoSwap ^ SwapFirst;\n    cmsFloat32Number maximum = IsInkSpace(info ->OutputFormat) ? 655.35F : 65535.0F;\n    cmsFloat32Number v = 0;\n    cmsUInt16Number* swap1 = (cmsUInt16Number*) output;\n    int i, start = 0;\n\n    if (ExtraFirst)\n        start = Extra;\n\n    for (i=0; i < nChan; i++) {\n\n        int index = DoSwap ? (nChan - i - 1) : i;\n\n        v = (cmsFloat32Number) wOut[index] / maximum;\n\n        if (Reverse)\n            v = maximum - v;\n\n        if (Planar)\n            ((cmsUInt16Number*) output)[(i + start ) * Stride]= _cmsFloat2Half(v);\n        else\n            ((cmsUInt16Number*) output)[i + start] =  _cmsFloat2Half(v);\n    }\n\n    if (!ExtraFirst) {\n        output += Extra * sizeof(cmsUInt16Number);\n    }\n\n  if (Extra == 0 && SwapFirst) {\n\n         memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsUInt16Number));\n        *swap1 = _cmsFloat2Half(v);\n    }\n\n    if (T_PLANAR(info -> OutputFormat))\n        return output + sizeof(cmsUInt16Number);\n    else\n        return output + nChan * sizeof(cmsUInt16Number);\n}\n\n\n\nstatic\ncmsUInt8Number* PackHalfFromFloat(_cmsTRANSFORM* info,\n                                    cmsFloat32Number wOut[],\n                                    cmsUInt8Number* output,\n                                    cmsUInt32Number Stride)\n{\n    int nChan      = T_CHANNELS(info -> OutputFormat);\n    int DoSwap     = T_DOSWAP(info ->OutputFormat);\n    int Reverse    = T_FLAVOR(info ->OutputFormat);\n    int Extra      = T_EXTRA(info -> OutputFormat);\n    int SwapFirst  = T_SWAPFIRST(info -> OutputFormat);\n    int Planar     = T_PLANAR(info -> OutputFormat);\n    int ExtraFirst = DoSwap ^ SwapFirst;\n    cmsFloat32Number maximum = IsInkSpace(info ->OutputFormat) ? 100.0F : 1.0F;\n    cmsUInt16Number* swap1 = (cmsUInt16Number*) output;\n    cmsFloat32Number v = 0;\n    int i, start = 0;\n\n    if (ExtraFirst)\n        start = Extra;\n\n    for (i=0; i < nChan; i++) {\n\n        int index = DoSwap ? (nChan - i - 1) : i;\n\n        v = wOut[index] * maximum;\n\n        if (Reverse)\n            v = maximum - v;\n\n        if (Planar)\n            ((cmsUInt16Number*) output)[(i + start)* Stride]= _cmsFloat2Half( v );\n        else\n            ((cmsUInt16Number*) output)[i + start] = _cmsFloat2Half( v );\n    }\n\n    if (!ExtraFirst) {\n        output += Extra * sizeof(cmsUInt16Number);\n    }\n\n   if (Extra == 0 && SwapFirst) {\n\n         memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsUInt16Number));\n        *swap1 = (cmsUInt16Number)  _cmsFloat2Half( v );\n    }\n\n    if (T_PLANAR(info -> OutputFormat))\n        return output + sizeof(cmsUInt16Number);\n    else\n        return output + nChan * sizeof(cmsUInt16Number);\n}\n\n#endif\n\n// ----------------------------------------------------------------------------------------------------------------\n\n\nstatic cmsFormatters16 InputFormatters16[] = {\n\n    //    Type                                          Mask                  Function\n    //  ----------------------------   ------------------------------------  ----------------------------\n    { TYPE_Lab_DBL,                                 ANYPLANAR|ANYEXTRA,   UnrollLabDoubleTo16},\n    { TYPE_XYZ_DBL,                                 ANYPLANAR|ANYEXTRA,   UnrollXYZDoubleTo16},\n    { TYPE_Lab_FLT,                                 ANYPLANAR|ANYEXTRA,   UnrollLabFloatTo16},\n    { TYPE_XYZ_FLT,                                 ANYPLANAR|ANYEXTRA,   UnrollXYZFloatTo16},\n    { TYPE_GRAY_DBL,                                                 0,   UnrollDouble1Chan},\n    { FLOAT_SH(1)|BYTES_SH(0), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR|\n                                             ANYSWAP|ANYEXTRA|ANYSPACE,   UnrollDoubleTo16},\n    { FLOAT_SH(1)|BYTES_SH(4), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR|\n                                             ANYSWAP|ANYEXTRA|ANYSPACE,   UnrollFloatTo16},\n#ifndef CMS_NO_HALF_SUPPORT \n    { FLOAT_SH(1)|BYTES_SH(2), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR|\n                                            ANYEXTRA|ANYSWAP|ANYSPACE,   UnrollHalfTo16},\n#endif\n\n    { CHANNELS_SH(1)|BYTES_SH(1),                              ANYSPACE,  Unroll1Byte},\n    { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(1),                  ANYSPACE,  Unroll1ByteSkip1},\n    { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(2),                  ANYSPACE,  Unroll1ByteSkip2},\n    { CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1),                 ANYSPACE,  Unroll1ByteReversed},\n    { COLORSPACE_SH(PT_MCH2)|CHANNELS_SH(2)|BYTES_SH(1),              0,  Unroll2Bytes},\n\n    { TYPE_LabV2_8,                                                   0,  UnrollLabV2_8 },\n    { TYPE_ALabV2_8,                                                  0,  UnrollALabV2_8 },\n    { TYPE_LabV2_16,                                                  0,  UnrollLabV2_16 },\n\n    { CHANNELS_SH(3)|BYTES_SH(1),                              ANYSPACE,  Unroll3Bytes},\n    { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1),                 ANYSPACE,  Unroll3BytesSwap},\n    { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|DOSWAP_SH(1),     ANYSPACE,  Unroll3BytesSkip1Swap},\n    { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|SWAPFIRST_SH(1),  ANYSPACE,  Unroll3BytesSkip1SwapFirst},\n\n    { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1),  \n                                                               ANYSPACE,  Unroll3BytesSkip1SwapSwapFirst},\n\n    { CHANNELS_SH(4)|BYTES_SH(1),                              ANYSPACE,  Unroll4Bytes},\n    { CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1),                 ANYSPACE,  Unroll4BytesReverse},\n    { CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1),              ANYSPACE,  Unroll4BytesSwapFirst},\n    { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1),                 ANYSPACE,  Unroll4BytesSwap},\n    { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE,  Unroll4BytesSwapSwapFirst},\n\n    { BYTES_SH(1)|PLANAR_SH(1), ANYFLAVOR|ANYSWAPFIRST|\n                                   ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollPlanarBytes},\n\n    { BYTES_SH(1),    ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|\n                                           ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollChunkyBytes},\n\n    { CHANNELS_SH(1)|BYTES_SH(2),                              ANYSPACE,  Unroll1Word},\n    { CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1),                 ANYSPACE,  Unroll1WordReversed},\n    { CHANNELS_SH(1)|BYTES_SH(2)|EXTRA_SH(3),                  ANYSPACE,  Unroll1WordSkip3},\n\n    { CHANNELS_SH(2)|BYTES_SH(2),                              ANYSPACE,  Unroll2Words},\n    { CHANNELS_SH(3)|BYTES_SH(2),                              ANYSPACE,  Unroll3Words},\n    { CHANNELS_SH(4)|BYTES_SH(2),                              ANYSPACE,  Unroll4Words},\n\n    { CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1),                 ANYSPACE,  Unroll3WordsSwap},\n    { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|SWAPFIRST_SH(1),  ANYSPACE,  Unroll3WordsSkip1SwapFirst},\n    { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|DOSWAP_SH(1),     ANYSPACE,  Unroll3WordsSkip1Swap},\n    { CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1),                 ANYSPACE,  Unroll4WordsReverse},\n    { CHANNELS_SH(4)|BYTES_SH(2)|SWAPFIRST_SH(1),              ANYSPACE,  Unroll4WordsSwapFirst},\n    { CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1),                 ANYSPACE,  Unroll4WordsSwap},\n    { CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE,  Unroll4WordsSwapSwapFirst},\n\n\n    { BYTES_SH(2)|PLANAR_SH(1),  ANYFLAVOR|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE,  UnrollPlanarWords},\n    { BYTES_SH(2),  ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE,  UnrollAnyWords},\n};\n\n\n\nstatic cmsFormattersFloat InputFormattersFloat[] = {\n\n    //    Type                                          Mask                  Function\n    //  ----------------------------   ------------------------------------  ----------------------------\n    {     TYPE_Lab_DBL,                                ANYPLANAR|ANYEXTRA,   UnrollLabDoubleToFloat},\n    {     TYPE_Lab_FLT,                                ANYPLANAR|ANYEXTRA,   UnrollLabFloatToFloat},\n\n    {     TYPE_XYZ_DBL,                                ANYPLANAR|ANYEXTRA,   UnrollXYZDoubleToFloat},\n    {     TYPE_XYZ_FLT,                                ANYPLANAR|ANYEXTRA,   UnrollXYZFloatToFloat},\n\n    {     FLOAT_SH(1)|BYTES_SH(4), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|\n                                                      ANYCHANNELS|ANYSPACE,  UnrollFloatsToFloat},\n\n    {     FLOAT_SH(1)|BYTES_SH(0), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|\n                                                        ANYCHANNELS|ANYSPACE,  UnrollDoublesToFloat},\n#ifndef CMS_NO_HALF_SUPPORT \n    {     FLOAT_SH(1)|BYTES_SH(2), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|\n                                                        ANYCHANNELS|ANYSPACE,  UnrollHalfToFloat},\n#endif\n};\n\n\n// Bit fields set to one in the mask are not compared\nstatic\ncmsFormatter _cmsGetStockInputFormatter(cmsUInt32Number dwInput, cmsUInt32Number dwFlags)\n{\n    cmsUInt32Number i;\n    cmsFormatter fr;\n\n    switch (dwFlags) {\n\n    case CMS_PACK_FLAGS_16BITS: {\n        for (i=0; i < sizeof(InputFormatters16) / sizeof(cmsFormatters16); i++) {\n            cmsFormatters16* f = InputFormatters16 + i;\n\n            if ((dwInput & ~f ->Mask) == f ->Type) {\n                fr.Fmt16 = f ->Frm;\n                return fr;\n            }\n        }\n    }\n    break;\n\n    case CMS_PACK_FLAGS_FLOAT: {\n        for (i=0; i < sizeof(InputFormattersFloat) / sizeof(cmsFormattersFloat); i++) {\n            cmsFormattersFloat* f = InputFormattersFloat + i;\n\n            if ((dwInput & ~f ->Mask) == f ->Type) {\n                fr.FmtFloat = f ->Frm;\n                return fr;\n            }\n        }\n    }\n    break;\n\n    default:;\n\n    }\n\n    fr.Fmt16 = NULL;\n    return fr;\n}\n\nstatic cmsFormatters16 OutputFormatters16[] = {\n    //    Type                                          Mask                  Function\n    //  ----------------------------   ------------------------------------  ----------------------------\n\n    { TYPE_Lab_DBL,                                      ANYPLANAR|ANYEXTRA,  PackLabDoubleFrom16},\n    { TYPE_XYZ_DBL,                                      ANYPLANAR|ANYEXTRA,  PackXYZDoubleFrom16},\n\n    { TYPE_Lab_FLT,                                      ANYPLANAR|ANYEXTRA,  PackLabFloatFrom16},\n    { TYPE_XYZ_FLT,                                      ANYPLANAR|ANYEXTRA,  PackXYZFloatFrom16},\n    \n    { FLOAT_SH(1)|BYTES_SH(0),      ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|\n                                    ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE,  PackDoubleFrom16},\n    { FLOAT_SH(1)|BYTES_SH(4),      ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|\n                                    ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE,  PackFloatFrom16},\n#ifndef CMS_NO_HALF_SUPPORT \n    { FLOAT_SH(1)|BYTES_SH(2),      ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|\n                                    ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE,  PackHalfFrom16},\n#endif\n\n    { CHANNELS_SH(1)|BYTES_SH(1),                                  ANYSPACE,  Pack1Byte},\n    { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(1),                      ANYSPACE,  Pack1ByteSkip1},\n    { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1),      ANYSPACE,  Pack1ByteSkip1SwapFirst},\n\n    { CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1),                     ANYSPACE,  Pack1ByteReversed},\n\n    { TYPE_LabV2_8,                                                       0,  PackLabV2_8 },\n    { TYPE_ALabV2_8,                                                      0,  PackALabV2_8 },\n    { TYPE_LabV2_16,                                                      0,  PackLabV2_16 },\n\n    { CHANNELS_SH(3)|BYTES_SH(1)|OPTIMIZED_SH(1),                  ANYSPACE,  Pack3BytesOptimized},\n    { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|OPTIMIZED_SH(1),      ANYSPACE,  Pack3BytesAndSkip1Optimized},\n    { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1)|OPTIMIZED_SH(1),\n                                                                   ANYSPACE,  Pack3BytesAndSkip1SwapFirstOptimized},\n    { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)|OPTIMIZED_SH(1),\n                                                                   ANYSPACE,  Pack3BytesAndSkip1SwapSwapFirstOptimized},\n    { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|EXTRA_SH(1)|OPTIMIZED_SH(1),\n                                                                   ANYSPACE,  Pack3BytesAndSkip1SwapOptimized},\n    { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|OPTIMIZED_SH(1),     ANYSPACE,  Pack3BytesSwapOptimized},\n\n\n\n    { CHANNELS_SH(3)|BYTES_SH(1),                                  ANYSPACE,  Pack3Bytes},\n    { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1),                      ANYSPACE,  Pack3BytesAndSkip1},\n    { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1),      ANYSPACE,  Pack3BytesAndSkip1SwapFirst},\n    { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1),\n                                                                   ANYSPACE,  Pack3BytesAndSkip1SwapSwapFirst},\n    { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|EXTRA_SH(1),         ANYSPACE,  Pack3BytesAndSkip1Swap},\n    { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1),                     ANYSPACE,  Pack3BytesSwap},\n    { CHANNELS_SH(6)|BYTES_SH(1),                                  ANYSPACE,  Pack6Bytes},\n    { CHANNELS_SH(6)|BYTES_SH(1)|DOSWAP_SH(1),                     ANYSPACE,  Pack6BytesSwap},\n    { CHANNELS_SH(4)|BYTES_SH(1),                                  ANYSPACE,  Pack4Bytes},\n    { CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1),                     ANYSPACE,  Pack4BytesReverse},\n    { CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1),                  ANYSPACE,  Pack4BytesSwapFirst},\n    { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1),                     ANYSPACE,  Pack4BytesSwap},\n    { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1),     ANYSPACE,  Pack4BytesSwapSwapFirst},\n\n    { BYTES_SH(1),                 ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackAnyBytes},\n    { BYTES_SH(1)|PLANAR_SH(1),    ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackPlanarBytes},\n\n    { CHANNELS_SH(1)|BYTES_SH(2),                                  ANYSPACE,  Pack1Word},\n    { CHANNELS_SH(1)|BYTES_SH(2)|EXTRA_SH(1),                      ANYSPACE,  Pack1WordSkip1},\n    { CHANNELS_SH(1)|BYTES_SH(2)|EXTRA_SH(1)|SWAPFIRST_SH(1),      ANYSPACE,  Pack1WordSkip1SwapFirst},\n    { CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1),                     ANYSPACE,  Pack1WordReversed},\n    { CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1),                   ANYSPACE,  Pack1WordBigEndian},\n    { CHANNELS_SH(3)|BYTES_SH(2),                                  ANYSPACE,  Pack3Words},\n    { CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1),                     ANYSPACE,  Pack3WordsSwap},\n    { CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1),                   ANYSPACE,  Pack3WordsBigEndian},\n    { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1),                      ANYSPACE,  Pack3WordsAndSkip1},\n    { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|DOSWAP_SH(1),         ANYSPACE,  Pack3WordsAndSkip1Swap},\n    { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|SWAPFIRST_SH(1),      ANYSPACE,  Pack3WordsAndSkip1SwapFirst},\n\n    { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1),\n                                                                   ANYSPACE,  Pack3WordsAndSkip1SwapSwapFirst},\n\n    { CHANNELS_SH(4)|BYTES_SH(2),                                  ANYSPACE,  Pack4Words},\n    { CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1),                     ANYSPACE,  Pack4WordsReverse},\n    { CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1),                     ANYSPACE,  Pack4WordsSwap},\n    { CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1),                   ANYSPACE,  Pack4WordsBigEndian},\n\n    { CHANNELS_SH(6)|BYTES_SH(2),                                  ANYSPACE,  Pack6Words},\n    { CHANNELS_SH(6)|BYTES_SH(2)|DOSWAP_SH(1),                     ANYSPACE,  Pack6WordsSwap},\n\n    { BYTES_SH(2)|PLANAR_SH(1),     ANYFLAVOR|ANYENDIAN|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackPlanarWords},\n    { BYTES_SH(2),                  ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackAnyWords}\n\n};\n\n\nstatic cmsFormattersFloat OutputFormattersFloat[] = {\n    //    Type                                          Mask                                 Function\n    //  ----------------------------   ---------------------------------------------------  ----------------------------\n    {     TYPE_Lab_FLT,                                                ANYPLANAR|ANYEXTRA,   PackLabFloatFromFloat},\n    {     TYPE_XYZ_FLT,                                                ANYPLANAR|ANYEXTRA,   PackXYZFloatFromFloat},\n\n    {     TYPE_Lab_DBL,                                                ANYPLANAR|ANYEXTRA,   PackLabDoubleFromFloat},\n    {     TYPE_XYZ_DBL,                                                ANYPLANAR|ANYEXTRA,   PackXYZDoubleFromFloat},\n\n    {     FLOAT_SH(1)|BYTES_SH(4), ANYPLANAR|\n                             ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE,   PackFloatsFromFloat },\n    {     FLOAT_SH(1)|BYTES_SH(0), ANYPLANAR|\n                             ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE,   PackDoublesFromFloat },\n#ifndef CMS_NO_HALF_SUPPORT \n    {     FLOAT_SH(1)|BYTES_SH(2),                                   \n                             ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE,   PackHalfFromFloat },\n#endif\n\n\n\n};\n\n\n// Bit fields set to one in the mask are not compared\nstatic\ncmsFormatter _cmsGetStockOutputFormatter(cmsUInt32Number dwInput, cmsUInt32Number dwFlags)\n{\n    cmsUInt32Number i;\n    cmsFormatter fr;\n\n\n    switch (dwFlags)\n    {\n\n     case CMS_PACK_FLAGS_16BITS: {\n\n        for (i=0; i < sizeof(OutputFormatters16) / sizeof(cmsFormatters16); i++) {\n            cmsFormatters16* f = OutputFormatters16 + i;\n\n            if ((dwInput & ~f ->Mask) == f ->Type) {\n                fr.Fmt16 = f ->Frm;\n                return fr;\n            }\n        }\n        }\n        break;\n\n    case CMS_PACK_FLAGS_FLOAT: {\n\n        for (i=0; i < sizeof(OutputFormattersFloat) / sizeof(cmsFormattersFloat); i++) {\n            cmsFormattersFloat* f = OutputFormattersFloat + i;\n\n            if ((dwInput & ~f ->Mask) == f ->Type) {\n                fr.FmtFloat = f ->Frm;\n                return fr;\n            }\n        }\n        }\n        break;\n\n    default:;\n\n    }\n\n    fr.Fmt16 = NULL;\n    return fr;\n}\n\n\ntypedef struct _cms_formatters_factory_list {\n\n    cmsFormatterFactory Factory;\n    struct _cms_formatters_factory_list *Next;\n\n} cmsFormattersFactoryList;\n\n_cmsFormattersPluginChunkType _cmsFormattersPluginChunk = { NULL };\n\n\n// Duplicates the zone of memory used by the plug-in in the new context\nstatic\nvoid DupFormatterFactoryList(struct _cmsContext_struct* ctx, \n                                               const struct _cmsContext_struct* src)\n{\n   _cmsFormattersPluginChunkType newHead = { NULL };\n   cmsFormattersFactoryList*  entry;\n   cmsFormattersFactoryList*  Anterior = NULL;\n   _cmsFormattersPluginChunkType* head = (_cmsFormattersPluginChunkType*) src->chunks[FormattersPlugin];\n\n     _cmsAssert(head != NULL);\n\n   // Walk the list copying all nodes\n   for (entry = head->FactoryList;\n       entry != NULL;\n       entry = entry ->Next) {\n\n           cmsFormattersFactoryList *newEntry = ( cmsFormattersFactoryList *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(cmsFormattersFactoryList));\n\n           if (newEntry == NULL) \n               return;\n\n           // We want to keep the linked list order, so this is a little bit tricky\n           newEntry -> Next = NULL;\n           if (Anterior)\n               Anterior -> Next = newEntry;\n\n           Anterior = newEntry;\n\n           if (newHead.FactoryList == NULL)\n               newHead.FactoryList = newEntry;\n   }\n\n   ctx ->chunks[FormattersPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsFormattersPluginChunkType));\n}\n\n// The interpolation plug-in memory chunk allocator/dup\nvoid _cmsAllocFormattersPluginChunk(struct _cmsContext_struct* ctx, \n                                    const struct _cmsContext_struct* src)\n{\n      _cmsAssert(ctx != NULL);\n\n     if (src != NULL) {\n        \n         // Duplicate the LIST\n         DupFormatterFactoryList(ctx, src);\n     }\n     else {\n          static _cmsFormattersPluginChunkType FormattersPluginChunk = { NULL };\n          ctx ->chunks[FormattersPlugin] = _cmsSubAllocDup(ctx ->MemPool, &FormattersPluginChunk, sizeof(_cmsFormattersPluginChunkType));\n     }\n}\n\n\n\n// Formatters management\ncmsBool  _cmsRegisterFormattersPlugin(cmsContext ContextID, cmsPluginBase* Data)\n{\n    _cmsFormattersPluginChunkType* ctx = ( _cmsFormattersPluginChunkType*) _cmsContextGetClientChunk(ContextID, FormattersPlugin);\n    cmsPluginFormatters* Plugin = (cmsPluginFormatters*) Data;\n    cmsFormattersFactoryList* fl ;\n\n    // Reset to built-in defaults\n    if (Data == NULL) {\n\n          ctx ->FactoryList = NULL;\n          return TRUE;\n    }\n\n    fl = (cmsFormattersFactoryList*) _cmsPluginMalloc(ContextID, sizeof(cmsFormattersFactoryList));\n    if (fl == NULL) return FALSE;\n\n    fl ->Factory    = Plugin ->FormattersFactory;\n\n    fl ->Next = ctx -> FactoryList;\n    ctx ->FactoryList = fl;\n\n    return TRUE;\n}\n\ncmsFormatter _cmsGetFormatter(cmsContext ContextID,\n                             cmsUInt32Number Type,         // Specific type, i.e. TYPE_RGB_8\n                             cmsFormatterDirection Dir,\n                             cmsUInt32Number dwFlags)\n{\n    _cmsFormattersPluginChunkType* ctx = ( _cmsFormattersPluginChunkType*) _cmsContextGetClientChunk(ContextID, FormattersPlugin);\n    cmsFormattersFactoryList* f;\n\n    for (f =ctx->FactoryList; f != NULL; f = f ->Next) {\n\n        cmsFormatter fn = f ->Factory(Type, Dir, dwFlags);\n        if (fn.Fmt16 != NULL) return fn;\n    }\n\n    // Revert to default\n    if (Dir == cmsFormatterInput)\n        return _cmsGetStockInputFormatter(Type, dwFlags);\n    else\n        return _cmsGetStockOutputFormatter(Type, dwFlags);\n}\n\n\n// Return whatever given formatter refers to float values\ncmsBool  _cmsFormatterIsFloat(cmsUInt32Number Type)\n{\n    return T_FLOAT(Type) ? TRUE : FALSE;\n}\n\n// Return whatever given formatter refers to 8 bits\ncmsBool  _cmsFormatterIs8bit(cmsUInt32Number Type)\n{\n    int Bytes = T_BYTES(Type);\n\n    return (Bytes == 1);\n}\n\n// Build a suitable formatter for the colorspace of this profile\ncmsUInt32Number CMSEXPORT cmsFormatterForColorspaceOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat)\n{\n\n    cmsColorSpaceSignature ColorSpace      = cmsGetColorSpace(hProfile);\n    cmsUInt32Number        ColorSpaceBits  = _cmsLCMScolorSpace(ColorSpace);\n    cmsUInt32Number        nOutputChans    = cmsChannelsOf(ColorSpace);\n    cmsUInt32Number        Float           = lIsFloat ? 1 : 0;\n\n    // Create a fake formatter for result\n    return FLOAT_SH(Float) | COLORSPACE_SH(ColorSpaceBits) | BYTES_SH(nBytes) | CHANNELS_SH(nOutputChans);\n}\n\n// Build a suitable formatter for the colorspace of this profile\ncmsUInt32Number CMSEXPORT cmsFormatterForPCSOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat)\n{\n\n    cmsColorSpaceSignature ColorSpace      = cmsGetPCS(hProfile);\n    int                    ColorSpaceBits  = _cmsLCMScolorSpace(ColorSpace);\n    cmsUInt32Number        nOutputChans    = cmsChannelsOf(ColorSpace);\n    cmsUInt32Number        Float           = lIsFloat ? 1 : 0;\n\n    // Create a fake formatter for result\n    return FLOAT_SH(Float) | COLORSPACE_SH(ColorSpaceBits) | BYTES_SH(nBytes) | CHANNELS_SH(nOutputChans);\n}\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/src/cmspcs.c",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2010 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n//\n\n#include \"lcms2_internal.h\"\n\n//      inter PCS conversions XYZ <-> CIE L* a* b*\n/*\n\n\n       CIE 15:2004 CIELab is defined as:\n\n       L* = 116*f(Y/Yn) - 16                     0 <= L* <= 100\n       a* = 500*[f(X/Xn) - f(Y/Yn)]\n       b* = 200*[f(Y/Yn) - f(Z/Zn)]\n\n       and\n\n              f(t) = t^(1/3)                     1 >= t >  (24/116)^3\n                     (841/108)*t + (16/116)      0 <= t <= (24/116)^3\n\n\n       Reverse transform is:\n\n       X = Xn*[a* / 500 + (L* + 16) / 116] ^ 3   if (X/Xn) > (24/116)\n         = Xn*(a* / 500 + L* / 116) / 7.787      if (X/Xn) <= (24/116)\n\n\n\n       PCS in Lab2 is encoded as:\n\n              8 bit Lab PCS:\n\n                     L*      0..100 into a 0..ff byte.\n                     a*      t + 128 range is -128.0  +127.0\n                     b*\n\n             16 bit Lab PCS:\n\n                     L*     0..100  into a 0..ff00 word.\n                     a*     t + 128  range is  -128.0  +127.9961\n                     b*\n\n\n\nInterchange Space   Component     Actual Range        Encoded Range\nCIE XYZ             X             0 -> 1.99997        0x0000 -> 0xffff\nCIE XYZ             Y             0 -> 1.99997        0x0000 -> 0xffff\nCIE XYZ             Z             0 -> 1.99997        0x0000 -> 0xffff\n\nVersion 2,3\n-----------\n\nCIELAB (16 bit)     L*            0 -> 100.0          0x0000 -> 0xff00\nCIELAB (16 bit)     a*            -128.0 -> +127.996  0x0000 -> 0x8000 -> 0xffff\nCIELAB (16 bit)     b*            -128.0 -> +127.996  0x0000 -> 0x8000 -> 0xffff\n\n\nVersion 4\n---------\n\nCIELAB (16 bit)     L*            0 -> 100.0          0x0000 -> 0xffff\nCIELAB (16 bit)     a*            -128.0 -> +127      0x0000 -> 0x8080 -> 0xffff\nCIELAB (16 bit)     b*            -128.0 -> +127      0x0000 -> 0x8080 -> 0xffff\n\n*/\n\n// Conversions\nvoid CMSEXPORT cmsXYZ2xyY(cmsCIExyY* Dest, const cmsCIEXYZ* Source)\n{\n    cmsFloat64Number ISum;\n\n    ISum = 1./(Source -> X + Source -> Y + Source -> Z);\n\n    Dest -> x = (Source -> X) * ISum;\n    Dest -> y = (Source -> Y) * ISum;\n    Dest -> Y = Source -> Y;\n}\n\nvoid CMSEXPORT cmsxyY2XYZ(cmsCIEXYZ* Dest, const cmsCIExyY* Source)\n{\n    Dest -> X = (Source -> x / Source -> y) * Source -> Y;\n    Dest -> Y = Source -> Y;\n    Dest -> Z = ((1 - Source -> x - Source -> y) / Source -> y) * Source -> Y;\n}\n\nstatic\ncmsFloat64Number f(cmsFloat64Number t)\n{\n    const cmsFloat64Number Limit = (24.0/116.0) * (24.0/116.0) * (24.0/116.0);\n\n    if (t <= Limit)\n        return (841.0/108.0) * t + (16.0/116.0);\n    else\n        return pow(t, 1.0/3.0);\n}\n\nstatic\ncmsFloat64Number f_1(cmsFloat64Number t)\n{\n    const cmsFloat64Number Limit = (24.0/116.0);\n\n    if (t <= Limit) {\n        return (108.0/841.0) * (t - (16.0/116.0));\n    }\n\n    return t * t * t;\n}\n\n\n// Standard XYZ to Lab. it can handle negative XZY numbers in some cases\nvoid CMSEXPORT cmsXYZ2Lab(const cmsCIEXYZ* WhitePoint, cmsCIELab* Lab, const cmsCIEXYZ* xyz)\n{\n    cmsFloat64Number fx, fy, fz;\n\n    if (WhitePoint == NULL)\n        WhitePoint = cmsD50_XYZ();\n\n    fx = f(xyz->X / WhitePoint->X);\n    fy = f(xyz->Y / WhitePoint->Y);\n    fz = f(xyz->Z / WhitePoint->Z);\n\n    Lab->L = 116.0*fy - 16.0;\n    Lab->a = 500.0*(fx - fy);\n    Lab->b = 200.0*(fy - fz);\n}\n\n\n// Standard XYZ to Lab. It can return negative XYZ in some cases\nvoid CMSEXPORT cmsLab2XYZ(const cmsCIEXYZ* WhitePoint, cmsCIEXYZ* xyz,  const cmsCIELab* Lab)\n{\n    cmsFloat64Number x, y, z;\n\n    if (WhitePoint == NULL)\n        WhitePoint = cmsD50_XYZ();\n\n    y = (Lab-> L + 16.0) / 116.0;\n    x = y + 0.002 * Lab -> a;\n    z = y - 0.005 * Lab -> b;\n\n    xyz -> X = f_1(x) * WhitePoint -> X;\n    xyz -> Y = f_1(y) * WhitePoint -> Y;\n    xyz -> Z = f_1(z) * WhitePoint -> Z;\n\n}\n\nstatic\ncmsFloat64Number L2float2(cmsUInt16Number v)\n{\n    return (cmsFloat64Number) v / 652.800;\n}\n\n// the a/b part\nstatic\ncmsFloat64Number ab2float2(cmsUInt16Number v)\n{\n    return ((cmsFloat64Number) v / 256.0) - 128.0;\n}\n\nstatic\ncmsUInt16Number L2Fix2(cmsFloat64Number L)\n{\n    return _cmsQuickSaturateWord(L *  652.8);\n}\n\nstatic\ncmsUInt16Number ab2Fix2(cmsFloat64Number ab)\n{\n    return _cmsQuickSaturateWord((ab + 128.0) * 256.0);\n}\n\n\nstatic\ncmsFloat64Number L2float4(cmsUInt16Number v)\n{\n    return (cmsFloat64Number) v / 655.35;\n}\n\n// the a/b part\nstatic\ncmsFloat64Number ab2float4(cmsUInt16Number v)\n{\n    return ((cmsFloat64Number) v / 257.0) - 128.0;\n}\n\n\nvoid CMSEXPORT cmsLabEncoded2FloatV2(cmsCIELab* Lab, const cmsUInt16Number wLab[3])\n{\n        Lab->L = L2float2(wLab[0]);\n        Lab->a = ab2float2(wLab[1]);\n        Lab->b = ab2float2(wLab[2]);\n}\n\n\nvoid CMSEXPORT cmsLabEncoded2Float(cmsCIELab* Lab, const cmsUInt16Number wLab[3])\n{\n        Lab->L = L2float4(wLab[0]);\n        Lab->a = ab2float4(wLab[1]);\n        Lab->b = ab2float4(wLab[2]);\n}\n\nstatic\ncmsFloat64Number Clamp_L_doubleV2(cmsFloat64Number L)\n{\n    const cmsFloat64Number L_max = (cmsFloat64Number) (0xFFFF * 100.0) / 0xFF00;\n\n    if (L < 0) L = 0;\n    if (L > L_max) L = L_max;\n\n    return L;\n}\n\n\nstatic\ncmsFloat64Number Clamp_ab_doubleV2(cmsFloat64Number ab)\n{\n    if (ab < MIN_ENCODEABLE_ab2) ab = MIN_ENCODEABLE_ab2;\n    if (ab > MAX_ENCODEABLE_ab2) ab = MAX_ENCODEABLE_ab2;\n\n    return ab;\n}\n\nvoid CMSEXPORT cmsFloat2LabEncodedV2(cmsUInt16Number wLab[3], const cmsCIELab* fLab)\n{\n    cmsCIELab Lab;\n\n    Lab.L = Clamp_L_doubleV2(fLab ->L);\n    Lab.a = Clamp_ab_doubleV2(fLab ->a);\n    Lab.b = Clamp_ab_doubleV2(fLab ->b);\n\n    wLab[0] = L2Fix2(Lab.L);\n    wLab[1] = ab2Fix2(Lab.a);\n    wLab[2] = ab2Fix2(Lab.b);\n}\n\n\nstatic\ncmsFloat64Number Clamp_L_doubleV4(cmsFloat64Number L)\n{\n    if (L < 0) L = 0;\n    if (L > 100.0) L = 100.0;\n\n    return L;\n}\n\nstatic\ncmsFloat64Number Clamp_ab_doubleV4(cmsFloat64Number ab)\n{\n    if (ab < MIN_ENCODEABLE_ab4) ab = MIN_ENCODEABLE_ab4;\n    if (ab > MAX_ENCODEABLE_ab4) ab = MAX_ENCODEABLE_ab4;\n\n    return ab;\n}\n\nstatic\ncmsUInt16Number L2Fix4(cmsFloat64Number L)\n{\n    return _cmsQuickSaturateWord(L *  655.35);\n}\n\nstatic\ncmsUInt16Number ab2Fix4(cmsFloat64Number ab)\n{\n    return _cmsQuickSaturateWord((ab + 128.0) * 257.0);\n}\n\nvoid CMSEXPORT cmsFloat2LabEncoded(cmsUInt16Number wLab[3], const cmsCIELab* fLab)\n{\n    cmsCIELab Lab;\n\n    Lab.L = Clamp_L_doubleV4(fLab ->L);\n    Lab.a = Clamp_ab_doubleV4(fLab ->a);\n    Lab.b = Clamp_ab_doubleV4(fLab ->b);\n\n    wLab[0] = L2Fix4(Lab.L);\n    wLab[1] = ab2Fix4(Lab.a);\n    wLab[2] = ab2Fix4(Lab.b);\n}\n\n// Auxiliar: convert to Radians\nstatic\ncmsFloat64Number RADIANS(cmsFloat64Number deg)\n{\n    return (deg * M_PI) / 180.;\n}\n\n\n// Auxiliar: atan2 but operating in degrees and returning 0 if a==b==0\nstatic\ncmsFloat64Number atan2deg(cmsFloat64Number a, cmsFloat64Number b)\n{\n   cmsFloat64Number h;\n\n   if (a == 0 && b == 0)\n            h   = 0;\n    else\n            h = atan2(a, b);\n\n    h *= (180. / M_PI);\n\n    while (h > 360.)\n        h -= 360.;\n\n    while ( h < 0)\n        h += 360.;\n\n    return h;\n}\n\n\n// Auxiliar: Square\nstatic\ncmsFloat64Number Sqr(cmsFloat64Number v)\n{\n    return v *  v;\n}\n// From cylindrical coordinates. No check is performed, then negative values are allowed\nvoid CMSEXPORT cmsLab2LCh(cmsCIELCh* LCh, const cmsCIELab* Lab)\n{\n    LCh -> L = Lab -> L;\n    LCh -> C = pow(Sqr(Lab ->a) + Sqr(Lab ->b), 0.5);\n    LCh -> h = atan2deg(Lab ->b, Lab ->a);\n}\n\n\n// To cylindrical coordinates. No check is performed, then negative values are allowed\nvoid CMSEXPORT cmsLCh2Lab(cmsCIELab* Lab, const cmsCIELCh* LCh)\n{\n    cmsFloat64Number h = (LCh -> h * M_PI) / 180.0;\n\n    Lab -> L = LCh -> L;\n    Lab -> a = LCh -> C * cos(h);\n    Lab -> b = LCh -> C * sin(h);\n}\n\n// In XYZ All 3 components are encoded using 1.15 fixed point\nstatic\ncmsUInt16Number XYZ2Fix(cmsFloat64Number d)\n{\n    return _cmsQuickSaturateWord(d * 32768.0);\n}\n\nvoid CMSEXPORT cmsFloat2XYZEncoded(cmsUInt16Number XYZ[3], const cmsCIEXYZ* fXYZ)\n{\n    cmsCIEXYZ xyz;\n\n    xyz.X = fXYZ -> X;\n    xyz.Y = fXYZ -> Y;\n    xyz.Z = fXYZ -> Z;\n\n    // Clamp to encodeable values.\n    if (xyz.Y <= 0) {\n\n        xyz.X = 0;\n        xyz.Y = 0;\n        xyz.Z = 0;\n    }\n\n    if (xyz.X > MAX_ENCODEABLE_XYZ)\n        xyz.X = MAX_ENCODEABLE_XYZ;\n\n    if (xyz.X < 0)\n        xyz.X = 0;\n\n    if (xyz.Y > MAX_ENCODEABLE_XYZ)\n        xyz.Y = MAX_ENCODEABLE_XYZ;\n\n    if (xyz.Y < 0)\n        xyz.Y = 0;\n\n    if (xyz.Z > MAX_ENCODEABLE_XYZ)\n        xyz.Z = MAX_ENCODEABLE_XYZ;\n\n    if (xyz.Z < 0)\n        xyz.Z = 0;\n\n\n    XYZ[0] = XYZ2Fix(xyz.X);\n    XYZ[1] = XYZ2Fix(xyz.Y);\n    XYZ[2] = XYZ2Fix(xyz.Z);\n}\n\n\n//  To convert from Fixed 1.15 point to cmsFloat64Number\nstatic\ncmsFloat64Number XYZ2float(cmsUInt16Number v)\n{\n    cmsS15Fixed16Number fix32;\n\n    // From 1.15 to 15.16\n    fix32 = v << 1;\n\n    // From fixed 15.16 to cmsFloat64Number\n    return _cms15Fixed16toDouble(fix32);\n}\n\n\nvoid CMSEXPORT cmsXYZEncoded2Float(cmsCIEXYZ* fXYZ, const cmsUInt16Number XYZ[3])\n{\n    fXYZ -> X = XYZ2float(XYZ[0]);\n    fXYZ -> Y = XYZ2float(XYZ[1]);\n    fXYZ -> Z = XYZ2float(XYZ[2]);\n}\n\n\n// Returns dE on two Lab values\ncmsFloat64Number CMSEXPORT cmsDeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2)\n{\n    cmsFloat64Number dL, da, db;\n\n    dL = fabs(Lab1 -> L - Lab2 -> L);\n    da = fabs(Lab1 -> a - Lab2 -> a);\n    db = fabs(Lab1 -> b - Lab2 -> b);\n\n    return pow(Sqr(dL) + Sqr(da) + Sqr(db), 0.5);\n}\n\n\n// Return the CIE94 Delta E\ncmsFloat64Number CMSEXPORT cmsCIE94DeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2)\n{\n    cmsCIELCh LCh1, LCh2;\n    cmsFloat64Number dE, dL, dC, dh, dhsq;\n    cmsFloat64Number c12, sc, sh;\n\n    dL = fabs(Lab1 ->L - Lab2 ->L);\n\n    cmsLab2LCh(&LCh1, Lab1);\n    cmsLab2LCh(&LCh2, Lab2);\n\n    dC  = fabs(LCh1.C - LCh2.C);\n    dE  = cmsDeltaE(Lab1, Lab2);\n\n    dhsq = Sqr(dE) - Sqr(dL) - Sqr(dC);\n    if (dhsq < 0)\n        dh = 0;\n    else\n        dh = pow(dhsq, 0.5);\n\n    c12 = sqrt(LCh1.C * LCh2.C);\n\n    sc = 1.0 + (0.048 * c12);\n    sh = 1.0 + (0.014 * c12);\n\n    return sqrt(Sqr(dL)  + Sqr(dC) / Sqr(sc) + Sqr(dh) / Sqr(sh));\n}\n\n\n// Auxiliary\nstatic\ncmsFloat64Number ComputeLBFD(const cmsCIELab* Lab)\n{\n  cmsFloat64Number yt;\n\n  if (Lab->L > 7.996969)\n        yt = (Sqr((Lab->L+16)/116)*((Lab->L+16)/116))*100;\n  else\n        yt = 100 * (Lab->L / 903.3);\n\n  return (54.6 * (M_LOG10E * (log(yt + 1.5))) - 9.6);\n}\n\n\n\n// bfd - gets BFD(1:1) difference between Lab1, Lab2\ncmsFloat64Number CMSEXPORT cmsBFDdeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2)\n{\n    cmsFloat64Number lbfd1,lbfd2,AveC,Aveh,dE,deltaL,\n        deltaC,deltah,dc,t,g,dh,rh,rc,rt,bfd;\n    cmsCIELCh LCh1, LCh2;\n\n\n    lbfd1 = ComputeLBFD(Lab1);\n    lbfd2 = ComputeLBFD(Lab2);\n    deltaL = lbfd2 - lbfd1;\n\n    cmsLab2LCh(&LCh1, Lab1);\n    cmsLab2LCh(&LCh2, Lab2);\n\n    deltaC = LCh2.C - LCh1.C;\n    AveC = (LCh1.C+LCh2.C)/2;\n    Aveh = (LCh1.h+LCh2.h)/2;\n\n    dE = cmsDeltaE(Lab1, Lab2);\n\n    if (Sqr(dE)>(Sqr(Lab2->L-Lab1->L)+Sqr(deltaC)))\n        deltah = sqrt(Sqr(dE)-Sqr(Lab2->L-Lab1->L)-Sqr(deltaC));\n    else\n        deltah =0;\n\n\n    dc   = 0.035 * AveC / (1 + 0.00365 * AveC)+0.521;\n    g    = sqrt(Sqr(Sqr(AveC))/(Sqr(Sqr(AveC))+14000));\n    t    = 0.627+(0.055*cos((Aveh-254)/(180/M_PI))-\n           0.040*cos((2*Aveh-136)/(180/M_PI))+\n           0.070*cos((3*Aveh-31)/(180/M_PI))+\n           0.049*cos((4*Aveh+114)/(180/M_PI))-\n           0.015*cos((5*Aveh-103)/(180/M_PI)));\n\n    dh    = dc*(g*t+1-g);\n    rh    = -0.260*cos((Aveh-308)/(180/M_PI))-\n           0.379*cos((2*Aveh-160)/(180/M_PI))-\n           0.636*cos((3*Aveh+254)/(180/M_PI))+\n           0.226*cos((4*Aveh+140)/(180/M_PI))-\n           0.194*cos((5*Aveh+280)/(180/M_PI));\n\n    rc = sqrt((AveC*AveC*AveC*AveC*AveC*AveC)/((AveC*AveC*AveC*AveC*AveC*AveC)+70000000));\n    rt = rh*rc;\n\n    bfd = sqrt(Sqr(deltaL)+Sqr(deltaC/dc)+Sqr(deltah/dh)+(rt*(deltaC/dc)*(deltah/dh)));\n\n    return bfd;\n}\n\n\n//  cmc - CMC(l:c) difference between Lab1, Lab2\ncmsFloat64Number CMSEXPORT cmsCMCdeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2, cmsFloat64Number l, cmsFloat64Number c)\n{\n  cmsFloat64Number dE,dL,dC,dh,sl,sc,sh,t,f,cmc;\n  cmsCIELCh LCh1, LCh2;\n\n  if (Lab1 ->L == 0 && Lab2 ->L == 0) return 0;\n\n  cmsLab2LCh(&LCh1, Lab1);\n  cmsLab2LCh(&LCh2, Lab2);\n\n\n  dL = Lab2->L-Lab1->L;\n  dC = LCh2.C-LCh1.C;\n\n  dE = cmsDeltaE(Lab1, Lab2);\n\n  if (Sqr(dE)>(Sqr(dL)+Sqr(dC)))\n            dh = sqrt(Sqr(dE)-Sqr(dL)-Sqr(dC));\n  else\n            dh =0;\n\n  if ((LCh1.h > 164) && (LCh1.h < 345))\n      t = 0.56 + fabs(0.2 * cos(((LCh1.h + 168)/(180/M_PI))));\n  else\n      t = 0.36 + fabs(0.4 * cos(((LCh1.h + 35 )/(180/M_PI))));\n\n   sc  = 0.0638   * LCh1.C / (1 + 0.0131  * LCh1.C) + 0.638;\n   sl  = 0.040975 * Lab1->L /(1 + 0.01765 * Lab1->L);\n\n   if (Lab1->L<16)\n         sl = 0.511;\n\n   f   = sqrt((LCh1.C * LCh1.C * LCh1.C * LCh1.C)/((LCh1.C * LCh1.C * LCh1.C * LCh1.C)+1900));\n   sh  = sc*(t*f+1-f);\n   cmc = sqrt(Sqr(dL/(l*sl))+Sqr(dC/(c*sc))+Sqr(dh/sh));\n\n   return cmc;\n}\n\n// dE2000 The weightings KL, KC and KH can be modified to reflect the relative\n// importance of lightness, chroma and hue in different industrial applications\ncmsFloat64Number CMSEXPORT cmsCIE2000DeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2,\n                                  cmsFloat64Number Kl, cmsFloat64Number Kc, cmsFloat64Number Kh)\n{\n    cmsFloat64Number L1  = Lab1->L;\n    cmsFloat64Number a1  = Lab1->a;\n    cmsFloat64Number b1  = Lab1->b;\n    cmsFloat64Number C   = sqrt( Sqr(a1) + Sqr(b1) );\n\n    cmsFloat64Number Ls = Lab2 ->L;\n    cmsFloat64Number as = Lab2 ->a;\n    cmsFloat64Number bs = Lab2 ->b;\n    cmsFloat64Number Cs = sqrt( Sqr(as) + Sqr(bs) );\n\n    cmsFloat64Number G = 0.5 * ( 1 - sqrt(pow((C + Cs) / 2 , 7.0) / (pow((C + Cs) / 2, 7.0) + pow(25.0, 7.0) ) ));\n\n    cmsFloat64Number a_p = (1 + G ) * a1;\n    cmsFloat64Number b_p = b1;\n    cmsFloat64Number C_p = sqrt( Sqr(a_p) + Sqr(b_p));\n    cmsFloat64Number h_p = atan2deg(b_p, a_p);\n\n\n    cmsFloat64Number a_ps = (1 + G) * as;\n    cmsFloat64Number b_ps = bs;\n    cmsFloat64Number C_ps = sqrt(Sqr(a_ps) + Sqr(b_ps));\n    cmsFloat64Number h_ps = atan2deg(b_ps, a_ps);\n\n    cmsFloat64Number meanC_p =(C_p + C_ps) / 2;\n\n    cmsFloat64Number hps_plus_hp  = h_ps + h_p;\n    cmsFloat64Number hps_minus_hp = h_ps - h_p;\n\n    cmsFloat64Number meanh_p = fabs(hps_minus_hp) <= 180.000001 ? (hps_plus_hp)/2 :\n                            (hps_plus_hp) < 360 ? (hps_plus_hp + 360)/2 :\n                                                 (hps_plus_hp - 360)/2;\n\n    cmsFloat64Number delta_h = (hps_minus_hp) <= -180.000001 ?  (hps_minus_hp + 360) :\n                            (hps_minus_hp) > 180 ? (hps_minus_hp - 360) :\n                                                    (hps_minus_hp);\n    cmsFloat64Number delta_L = (Ls - L1);\n    cmsFloat64Number delta_C = (C_ps - C_p );\n\n\n    cmsFloat64Number delta_H =2 * sqrt(C_ps*C_p) * sin(RADIANS(delta_h) / 2);\n\n    cmsFloat64Number T = 1 - 0.17 * cos(RADIANS(meanh_p-30))\n                 + 0.24 * cos(RADIANS(2*meanh_p))\n                 + 0.32 * cos(RADIANS(3*meanh_p + 6))\n                 - 0.2  * cos(RADIANS(4*meanh_p - 63));\n\n    cmsFloat64Number Sl = 1 + (0.015 * Sqr((Ls + L1) /2- 50) )/ sqrt(20 + Sqr( (Ls+L1)/2 - 50) );\n\n    cmsFloat64Number Sc = 1 + 0.045 * (C_p + C_ps)/2;\n    cmsFloat64Number Sh = 1 + 0.015 * ((C_ps + C_p)/2) * T;\n\n    cmsFloat64Number delta_ro = 30 * exp( -Sqr(((meanh_p - 275 ) / 25)));\n\n    cmsFloat64Number Rc = 2 * sqrt(( pow(meanC_p, 7.0) )/( pow(meanC_p, 7.0) + pow(25.0, 7.0)));\n\n    cmsFloat64Number Rt = -sin(2 * RADIANS(delta_ro)) * Rc;\n\n    cmsFloat64Number deltaE00 = sqrt( Sqr(delta_L /(Sl * Kl)) +\n                            Sqr(delta_C/(Sc * Kc))  +\n                            Sqr(delta_H/(Sh * Kh))  +\n                            Rt*(delta_C/(Sc * Kc)) * (delta_H / (Sh * Kh)));\n\n    return deltaE00;\n}\n\n// This function returns a number of gridpoints to be used as LUT table. It assumes same number\n// of gripdpoints in all dimensions. Flags may override the choice.\nint _cmsReasonableGridpointsByColorspace(cmsColorSpaceSignature Colorspace, cmsUInt32Number dwFlags)\n{\n    int nChannels;\n\n    // Already specified?\n    if (dwFlags & 0x00FF0000) {\n            // Yes, grab'em\n            return (dwFlags >> 16) & 0xFF;\n    }\n\n    nChannels = cmsChannelsOf(Colorspace);\n\n    // HighResPrecalc is maximum resolution\n    if (dwFlags & cmsFLAGS_HIGHRESPRECALC) {\n\n        if (nChannels > 4)\n                return 7;       // 7 for Hifi\n\n        if (nChannels == 4)     // 23 for CMYK\n                return 23;\n\n        return 49;      // 49 for RGB and others\n    }\n\n\n    // LowResPrecal is lower resolution\n    if (dwFlags & cmsFLAGS_LOWRESPRECALC) {\n\n        if (nChannels > 4)\n                return 6;       // 6 for more than 4 channels\n\n        if (nChannels == 1)\n                return 33;      // For monochrome\n\n        return 17;              // 17 for remaining\n    }\n\n    // Default values\n    if (nChannels > 4)\n                return 7;       // 7 for Hifi\n\n    if (nChannels == 4)\n                return 17;      // 17 for CMYK\n\n    return 33;                  // 33 for RGB\n}\n\n\ncmsBool  _cmsEndPointsBySpace(cmsColorSpaceSignature Space,\n                             cmsUInt16Number **White,\n                             cmsUInt16Number **Black,\n                             cmsUInt32Number *nOutputs)\n{\n       // Only most common spaces\n\n       static cmsUInt16Number RGBblack[4]  = { 0, 0, 0 };\n       static cmsUInt16Number RGBwhite[4]  = { 0xffff, 0xffff, 0xffff };\n       static cmsUInt16Number CMYKblack[4] = { 0xffff, 0xffff, 0xffff, 0xffff };   // 400% of ink\n       static cmsUInt16Number CMYKwhite[4] = { 0, 0, 0, 0 };\n       static cmsUInt16Number LABblack[4]  = { 0, 0x8080, 0x8080 };               // V4 Lab encoding\n       static cmsUInt16Number LABwhite[4]  = { 0xFFFF, 0x8080, 0x8080 };\n       static cmsUInt16Number CMYblack[4]  = { 0xffff, 0xffff, 0xffff };\n       static cmsUInt16Number CMYwhite[4]  = { 0, 0, 0 };\n       static cmsUInt16Number Grayblack[4] = { 0 };\n       static cmsUInt16Number GrayWhite[4] = { 0xffff };\n\n       switch (Space) {\n\n       case cmsSigGrayData: if (White)    *White = GrayWhite;\n                           if (Black)    *Black = Grayblack;\n                           if (nOutputs) *nOutputs = 1;\n                           return TRUE;\n\n       case cmsSigRgbData:  if (White)    *White = RGBwhite;\n                           if (Black)    *Black = RGBblack;\n                           if (nOutputs) *nOutputs = 3;\n                           return TRUE;\n\n       case cmsSigLabData:  if (White)    *White = LABwhite;\n                           if (Black)    *Black = LABblack;\n                           if (nOutputs) *nOutputs = 3;\n                           return TRUE;\n\n       case cmsSigCmykData: if (White)    *White = CMYKwhite;\n                           if (Black)    *Black = CMYKblack;\n                           if (nOutputs) *nOutputs = 4;\n                           return TRUE;\n\n       case cmsSigCmyData:  if (White)    *White = CMYwhite;\n                           if (Black)    *Black = CMYblack;\n                           if (nOutputs) *nOutputs = 3;\n                           return TRUE;\n\n       default:;\n       }\n\n  return FALSE;\n}\n\n\n\n// Several utilities -------------------------------------------------------\n\n// Translate from our colorspace to ICC representation\n\ncmsColorSpaceSignature CMSEXPORT _cmsICCcolorSpace(int OurNotation)\n{\n       switch (OurNotation) {\n\n       case 1:\n       case PT_GRAY: return cmsSigGrayData;\n\n       case 2:\n       case PT_RGB:  return cmsSigRgbData;\n\n       case PT_CMY:  return cmsSigCmyData;\n       case PT_CMYK: return cmsSigCmykData;\n       case PT_YCbCr:return cmsSigYCbCrData;\n       case PT_YUV:  return cmsSigLuvData;\n       case PT_XYZ:  return cmsSigXYZData;\n\n       case PT_LabV2:\n       case PT_Lab:  return cmsSigLabData;\n\n       case PT_YUVK: return cmsSigLuvKData;\n       case PT_HSV:  return cmsSigHsvData;\n       case PT_HLS:  return cmsSigHlsData;\n       case PT_Yxy:  return cmsSigYxyData;\n\n       case PT_MCH1: return cmsSigMCH1Data;\n       case PT_MCH2: return cmsSigMCH2Data;\n       case PT_MCH3: return cmsSigMCH3Data;\n       case PT_MCH4: return cmsSigMCH4Data;\n       case PT_MCH5: return cmsSigMCH5Data;\n       case PT_MCH6: return cmsSigMCH6Data;\n       case PT_MCH7: return cmsSigMCH7Data;\n       case PT_MCH8: return cmsSigMCH8Data;\n\n       case PT_MCH9:  return cmsSigMCH9Data;\n       case PT_MCH10: return cmsSigMCHAData;\n       case PT_MCH11: return cmsSigMCHBData;\n       case PT_MCH12: return cmsSigMCHCData;\n       case PT_MCH13: return cmsSigMCHDData;\n       case PT_MCH14: return cmsSigMCHEData;\n       case PT_MCH15: return cmsSigMCHFData;\n\n       default:  return (cmsColorSpaceSignature) (-1);\n       }\n}\n\n\nint CMSEXPORT _cmsLCMScolorSpace(cmsColorSpaceSignature ProfileSpace)\n{\n    switch (ProfileSpace) {\n\n    case cmsSigGrayData: return  PT_GRAY;\n    case cmsSigRgbData:  return  PT_RGB;\n    case cmsSigCmyData:  return  PT_CMY;\n    case cmsSigCmykData: return  PT_CMYK;\n    case cmsSigYCbCrData:return  PT_YCbCr;\n    case cmsSigLuvData:  return  PT_YUV;\n    case cmsSigXYZData:  return  PT_XYZ;\n    case cmsSigLabData:  return  PT_Lab;\n    case cmsSigLuvKData: return  PT_YUVK;\n    case cmsSigHsvData:  return  PT_HSV;\n    case cmsSigHlsData:  return  PT_HLS;\n    case cmsSigYxyData:  return  PT_Yxy;\n\n    case cmsSig1colorData:\n    case cmsSigMCH1Data: return PT_MCH1;\n\n    case cmsSig2colorData:\n    case cmsSigMCH2Data: return PT_MCH2;\n\n    case cmsSig3colorData:\n    case cmsSigMCH3Data: return PT_MCH3;\n\n    case cmsSig4colorData:\n    case cmsSigMCH4Data: return PT_MCH4;\n\n    case cmsSig5colorData:\n    case cmsSigMCH5Data: return PT_MCH5;\n\n    case cmsSig6colorData:\n    case cmsSigMCH6Data: return PT_MCH6;\n\n    case cmsSigMCH7Data:\n    case cmsSig7colorData:return PT_MCH7;\n\n    case cmsSigMCH8Data:\n    case cmsSig8colorData:return PT_MCH8;\n\n    case cmsSigMCH9Data:\n    case cmsSig9colorData:return PT_MCH9;\n\n    case cmsSigMCHAData:\n    case cmsSig10colorData:return PT_MCH10;\n\n    case cmsSigMCHBData:\n    case cmsSig11colorData:return PT_MCH11;\n\n    case cmsSigMCHCData:\n    case cmsSig12colorData:return PT_MCH12;\n\n    case cmsSigMCHDData:\n    case cmsSig13colorData:return PT_MCH13;\n\n    case cmsSigMCHEData:\n    case cmsSig14colorData:return PT_MCH14;\n\n    case cmsSigMCHFData:\n    case cmsSig15colorData:return PT_MCH15;\n\n    default:  return (cmsColorSpaceSignature) (-1);\n    }\n}\n\n\ncmsUInt32Number CMSEXPORT cmsChannelsOf(cmsColorSpaceSignature ColorSpace)\n{\n    switch (ColorSpace) {\n\n    case cmsSigMCH1Data:\n    case cmsSig1colorData:\n    case cmsSigGrayData: return 1;\n\n    case cmsSigMCH2Data:\n    case cmsSig2colorData:  return 2;\n\n    case cmsSigXYZData:\n    case cmsSigLabData:\n    case cmsSigLuvData:\n    case cmsSigYCbCrData:\n    case cmsSigYxyData:\n    case cmsSigRgbData:\n    case cmsSigHsvData:\n    case cmsSigHlsData:\n    case cmsSigCmyData:\n    case cmsSigMCH3Data:\n    case cmsSig3colorData:  return 3;\n\n    case cmsSigLuvKData:\n    case cmsSigCmykData:\n    case cmsSigMCH4Data:\n    case cmsSig4colorData:  return 4;\n\n    case cmsSigMCH5Data:\n    case cmsSig5colorData:  return 5;\n\n    case cmsSigMCH6Data:\n    case cmsSig6colorData:  return 6;\n\n    case cmsSigMCH7Data:\n    case cmsSig7colorData:  return  7;\n\n    case cmsSigMCH8Data:\n    case cmsSig8colorData:  return  8;\n\n    case cmsSigMCH9Data:\n    case cmsSig9colorData:  return  9;\n\n    case cmsSigMCHAData:\n    case cmsSig10colorData: return 10;\n\n    case cmsSigMCHBData:\n    case cmsSig11colorData: return 11;\n\n    case cmsSigMCHCData:\n    case cmsSig12colorData: return 12;\n\n    case cmsSigMCHDData:\n    case cmsSig13colorData: return 13;\n\n    case cmsSigMCHEData:\n    case cmsSig14colorData: return 14;\n\n    case cmsSigMCHFData:\n    case cmsSig15colorData: return 15;\n\n    default: return 3;\n    }\n}\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/src/cmsplugin.c",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2010 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n//\n\n#include \"lcms2_internal.h\"\n\n\n// ----------------------------------------------------------------------------------\n// Encoding & Decoding support functions\n// ----------------------------------------------------------------------------------\n\n//      Little-Endian to Big-Endian\n\n// Adjust a word value after being readed/ before being written from/to an ICC profile\ncmsUInt16Number CMSEXPORT  _cmsAdjustEndianess16(cmsUInt16Number Word)\n{\n#ifndef CMS_USE_BIG_ENDIAN\n\n    cmsUInt8Number* pByte = (cmsUInt8Number*) &Word;\n    cmsUInt8Number tmp;\n\n    tmp = pByte[0];\n    pByte[0] = pByte[1];\n    pByte[1] = tmp;\n#endif\n\n    return Word;\n}\n\n\n// Transports to properly encoded values - note that icc profiles does use big endian notation.\n\n// 1 2 3 4\n// 4 3 2 1\n\ncmsUInt32Number CMSEXPORT  _cmsAdjustEndianess32(cmsUInt32Number DWord)\n{\n#ifndef CMS_USE_BIG_ENDIAN\n\n    cmsUInt8Number* pByte = (cmsUInt8Number*) &DWord;\n    cmsUInt8Number temp1;\n    cmsUInt8Number temp2;\n\n    temp1 = *pByte++;\n    temp2 = *pByte++;\n    *(pByte-1) = *pByte;\n    *pByte++ = temp2;\n    *(pByte-3) = *pByte;\n    *pByte = temp1;\n#endif\n    return DWord;\n}\n\n// 1 2 3 4 5 6 7 8\n// 8 7 6 5 4 3 2 1\n\nvoid CMSEXPORT  _cmsAdjustEndianess64(cmsUInt64Number* Result, cmsUInt64Number* QWord)\n{\n\n#ifndef CMS_USE_BIG_ENDIAN\n\n    cmsUInt8Number* pIn  = (cmsUInt8Number*) QWord;\n    cmsUInt8Number* pOut = (cmsUInt8Number*) Result;\n\n    _cmsAssert(Result != NULL);\n\n    pOut[7] = pIn[0];\n    pOut[6] = pIn[1];\n    pOut[5] = pIn[2];\n    pOut[4] = pIn[3];\n    pOut[3] = pIn[4];\n    pOut[2] = pIn[5];\n    pOut[1] = pIn[6];\n    pOut[0] = pIn[7];\n\n#else\n    _cmsAssert(Result != NULL);\n\n#  ifdef CMS_DONT_USE_INT64\n    (*Result)[0] = QWord[0];\n    (*Result)[1] = QWord[1];\n#  else\n    *Result = *QWord;\n#  endif\n#endif\n}\n\n// Auxiliar -- read 8, 16 and 32-bit numbers\ncmsBool CMSEXPORT  _cmsReadUInt8Number(cmsIOHANDLER* io, cmsUInt8Number* n)\n{\n    cmsUInt8Number tmp;\n\n    _cmsAssert(io != NULL);\n\n    if (io -> Read(io, &tmp, sizeof(cmsUInt8Number), 1) != 1)\n            return FALSE;\n\n    if (n != NULL) *n = tmp;\n    return TRUE;\n}\n\ncmsBool CMSEXPORT  _cmsReadUInt16Number(cmsIOHANDLER* io, cmsUInt16Number* n)\n{\n    cmsUInt16Number tmp;\n\n    _cmsAssert(io != NULL);\n\n    if (io -> Read(io, &tmp, sizeof(cmsUInt16Number), 1) != 1)\n            return FALSE;\n\n    if (n != NULL) *n = _cmsAdjustEndianess16(tmp);\n    return TRUE;\n}\n\ncmsBool CMSEXPORT  _cmsReadUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, cmsUInt16Number* Array)\n{\n    cmsUInt32Number i;\n\n    _cmsAssert(io != NULL);\n\n    for (i=0; i < n; i++) {\n\n        if (Array != NULL) {\n            if (!_cmsReadUInt16Number(io, Array + i)) return FALSE;\n        }\n        else {\n            if (!_cmsReadUInt16Number(io, NULL)) return FALSE;\n        }\n\n    }\n    return TRUE;\n}\n\ncmsBool CMSEXPORT  _cmsReadUInt32Number(cmsIOHANDLER* io, cmsUInt32Number* n)\n{\n    cmsUInt32Number tmp;\n\n    _cmsAssert(io != NULL);\n\n    if (io -> Read(io, &tmp, sizeof(cmsUInt32Number), 1) != 1)\n            return FALSE;\n\n    if (n != NULL) *n = _cmsAdjustEndianess32(tmp);\n    return TRUE;\n}\n\ncmsBool CMSEXPORT  _cmsReadFloat32Number(cmsIOHANDLER* io, cmsFloat32Number* n)\n{\n    cmsUInt32Number tmp;\n\n    _cmsAssert(io != NULL);\n\n    if (io -> Read(io, &tmp, sizeof(cmsFloat32Number), 1) != 1)\n            return FALSE;\n\n    if (n != NULL) {\n\n        tmp = _cmsAdjustEndianess32(tmp);\n        *n = *(cmsFloat32Number*) &tmp;\n    }\n    return TRUE;\n}\n\n\ncmsBool CMSEXPORT   _cmsReadUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n)\n{\n    cmsUInt64Number tmp;\n\n    _cmsAssert(io != NULL);\n\n    if (io -> Read(io, &tmp, sizeof(cmsUInt64Number), 1) != 1)\n            return FALSE;\n\n    if (n != NULL) _cmsAdjustEndianess64(n, &tmp);\n    return TRUE;\n}\n\n\ncmsBool CMSEXPORT  _cmsRead15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number* n)\n{\n    cmsUInt32Number tmp;\n\n    _cmsAssert(io != NULL);\n\n    if (io -> Read(io, &tmp, sizeof(cmsUInt32Number), 1) != 1)\n            return FALSE;\n\n    if (n != NULL) {\n        *n = _cms15Fixed16toDouble(_cmsAdjustEndianess32(tmp));\n    }\n\n    return TRUE;\n}\n\n\n// Jun-21-2000: Some profiles (those that comes with W2K) comes\n// with the media white (media black?) x 100. Add a sanity check\n\nstatic\nvoid NormalizeXYZ(cmsCIEXYZ* Dest)\n{\n    while (Dest -> X > 2. &&\n           Dest -> Y > 2. &&\n           Dest -> Z > 2.) {\n\n               Dest -> X /= 10.;\n               Dest -> Y /= 10.;\n               Dest -> Z /= 10.;\n       }\n}\n\ncmsBool CMSEXPORT  _cmsReadXYZNumber(cmsIOHANDLER* io, cmsCIEXYZ* XYZ)\n{\n    cmsEncodedXYZNumber xyz;\n\n    _cmsAssert(io != NULL);\n\n    if (io ->Read(io, &xyz, sizeof(cmsEncodedXYZNumber), 1) != 1) return FALSE;\n\n    if (XYZ != NULL) {\n\n        XYZ->X = _cms15Fixed16toDouble(_cmsAdjustEndianess32(xyz.X));\n        XYZ->Y = _cms15Fixed16toDouble(_cmsAdjustEndianess32(xyz.Y));\n        XYZ->Z = _cms15Fixed16toDouble(_cmsAdjustEndianess32(xyz.Z));\n\n        NormalizeXYZ(XYZ);\n    }\n    return TRUE;\n}\n\ncmsBool CMSEXPORT  _cmsWriteUInt8Number(cmsIOHANDLER* io, cmsUInt8Number n)\n{\n    _cmsAssert(io != NULL);\n\n    if (io -> Write(io, sizeof(cmsUInt8Number), &n) != 1)\n            return FALSE;\n\n    return TRUE;\n}\n\ncmsBool CMSEXPORT  _cmsWriteUInt16Number(cmsIOHANDLER* io, cmsUInt16Number n)\n{\n    cmsUInt16Number tmp;\n\n    _cmsAssert(io != NULL);\n\n    tmp = _cmsAdjustEndianess16(n);\n    if (io -> Write(io, sizeof(cmsUInt16Number), &tmp) != 1)\n            return FALSE;\n\n    return TRUE;\n}\n\ncmsBool CMSEXPORT  _cmsWriteUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, const cmsUInt16Number* Array)\n{\n    cmsUInt32Number i;\n\n    _cmsAssert(io != NULL);\n    _cmsAssert(Array != NULL);\n\n    for (i=0; i < n; i++) {\n        if (!_cmsWriteUInt16Number(io, Array[i])) return FALSE;\n    }\n\n    return TRUE;\n}\n\ncmsBool CMSEXPORT  _cmsWriteUInt32Number(cmsIOHANDLER* io, cmsUInt32Number n)\n{\n    cmsUInt32Number tmp;\n\n    _cmsAssert(io != NULL);\n\n    tmp = _cmsAdjustEndianess32(n);\n    if (io -> Write(io, sizeof(cmsUInt32Number), &tmp) != 1)\n            return FALSE;\n\n    return TRUE;\n}\n\n\ncmsBool CMSEXPORT  _cmsWriteFloat32Number(cmsIOHANDLER* io, cmsFloat32Number n)\n{\n    cmsUInt32Number tmp;\n\n    _cmsAssert(io != NULL);\n\n    tmp = *(cmsUInt32Number*) &n;\n    tmp = _cmsAdjustEndianess32(tmp);\n    if (io -> Write(io, sizeof(cmsUInt32Number), &tmp) != 1)\n            return FALSE;\n\n    return TRUE;\n}\n\ncmsBool CMSEXPORT  _cmsWriteUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n)\n{\n    cmsUInt64Number tmp;\n\n    _cmsAssert(io != NULL);\n\n    _cmsAdjustEndianess64(&tmp, n);\n    if (io -> Write(io, sizeof(cmsUInt64Number), &tmp) != 1)\n            return FALSE;\n\n    return TRUE;\n}\n\ncmsBool CMSEXPORT  _cmsWrite15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number n)\n{\n    cmsUInt32Number tmp;\n\n    _cmsAssert(io != NULL);\n\n    tmp = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(n));\n    if (io -> Write(io, sizeof(cmsUInt32Number), &tmp) != 1)\n            return FALSE;\n\n    return TRUE;\n}\n\ncmsBool CMSEXPORT  _cmsWriteXYZNumber(cmsIOHANDLER* io, const cmsCIEXYZ* XYZ)\n{\n    cmsEncodedXYZNumber xyz;\n\n    _cmsAssert(io != NULL);\n    _cmsAssert(XYZ != NULL);\n\n    xyz.X = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(XYZ->X));\n    xyz.Y = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(XYZ->Y));\n    xyz.Z = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(XYZ->Z));\n\n    return io -> Write(io,  sizeof(cmsEncodedXYZNumber), &xyz);\n}\n\n// from Fixed point 8.8 to double\ncmsFloat64Number CMSEXPORT _cms8Fixed8toDouble(cmsUInt16Number fixed8)\n{\n       cmsUInt8Number  msb, lsb;\n\n       lsb = (cmsUInt8Number) (fixed8 & 0xff);\n       msb = (cmsUInt8Number) (((cmsUInt16Number) fixed8 >> 8) & 0xff);\n\n       return (cmsFloat64Number) ((cmsFloat64Number) msb + ((cmsFloat64Number) lsb / 256.0));\n}\n\ncmsUInt16Number CMSEXPORT _cmsDoubleTo8Fixed8(cmsFloat64Number val)\n{\n    cmsS15Fixed16Number GammaFixed32 = _cmsDoubleTo15Fixed16(val);\n    return  (cmsUInt16Number) ((GammaFixed32 >> 8) & 0xFFFF);\n}\n\n// from Fixed point 15.16 to double\ncmsFloat64Number CMSEXPORT _cms15Fixed16toDouble(cmsS15Fixed16Number fix32)\n{\n    cmsFloat64Number floater, sign, mid;\n    int Whole, FracPart;\n\n    sign  = (fix32 < 0 ? -1 : 1);\n    fix32 = abs(fix32);\n\n    Whole     = (cmsUInt16Number)(fix32 >> 16) & 0xffff;\n    FracPart  = (cmsUInt16Number)(fix32 & 0xffff);\n\n    mid     = (cmsFloat64Number) FracPart / 65536.0;\n    floater = (cmsFloat64Number) Whole + mid;\n\n    return sign * floater;\n}\n\n// from double to Fixed point 15.16\ncmsS15Fixed16Number CMSEXPORT _cmsDoubleTo15Fixed16(cmsFloat64Number v)\n{\n    return ((cmsS15Fixed16Number) floor((v)*65536.0 + 0.5));\n}\n\n// Date/Time functions\n\nvoid CMSEXPORT _cmsDecodeDateTimeNumber(const cmsDateTimeNumber *Source, struct tm *Dest)\n{\n\n    _cmsAssert(Dest != NULL);\n    _cmsAssert(Source != NULL);\n\n    Dest->tm_sec   = _cmsAdjustEndianess16(Source->seconds);\n    Dest->tm_min   = _cmsAdjustEndianess16(Source->minutes);\n    Dest->tm_hour  = _cmsAdjustEndianess16(Source->hours);\n    Dest->tm_mday  = _cmsAdjustEndianess16(Source->day);\n    Dest->tm_mon   = _cmsAdjustEndianess16(Source->month) - 1;\n    Dest->tm_year  = _cmsAdjustEndianess16(Source->year) - 1900;\n    Dest->tm_wday  = -1;\n    Dest->tm_yday  = -1;\n    Dest->tm_isdst = 0;\n}\n\nvoid CMSEXPORT _cmsEncodeDateTimeNumber(cmsDateTimeNumber *Dest, const struct tm *Source)\n{\n    _cmsAssert(Dest != NULL);\n    _cmsAssert(Source != NULL);\n\n    Dest->seconds = _cmsAdjustEndianess16((cmsUInt16Number) Source->tm_sec);\n    Dest->minutes = _cmsAdjustEndianess16((cmsUInt16Number) Source->tm_min);\n    Dest->hours   = _cmsAdjustEndianess16((cmsUInt16Number) Source->tm_hour);\n    Dest->day     = _cmsAdjustEndianess16((cmsUInt16Number) Source->tm_mday);\n    Dest->month   = _cmsAdjustEndianess16((cmsUInt16Number) (Source->tm_mon + 1));\n    Dest->year    = _cmsAdjustEndianess16((cmsUInt16Number) (Source->tm_year + 1900));\n}\n\n// Read base and return type base\ncmsTagTypeSignature CMSEXPORT _cmsReadTypeBase(cmsIOHANDLER* io)\n{\n    _cmsTagBase Base;\n\n    _cmsAssert(io != NULL);\n\n    if (io -> Read(io, &Base, sizeof(_cmsTagBase), 1) != 1)\n        return (cmsTagTypeSignature) 0;\n\n    return (cmsTagTypeSignature) _cmsAdjustEndianess32(Base.sig);\n}\n\n// Setup base marker\ncmsBool  CMSEXPORT _cmsWriteTypeBase(cmsIOHANDLER* io, cmsTagTypeSignature sig)\n{\n    _cmsTagBase  Base;\n\n    _cmsAssert(io != NULL);\n\n    Base.sig = (cmsTagTypeSignature) _cmsAdjustEndianess32(sig);\n    memset(&Base.reserved, 0, sizeof(Base.reserved));\n    return io -> Write(io, sizeof(_cmsTagBase), &Base);\n}\n\ncmsBool CMSEXPORT _cmsReadAlignment(cmsIOHANDLER* io)\n{\n    cmsUInt8Number  Buffer[4];\n    cmsUInt32Number NextAligned, At;\n    cmsUInt32Number BytesToNextAlignedPos;\n\n    _cmsAssert(io != NULL);\n\n    At = io -> Tell(io);\n    NextAligned = _cmsALIGNLONG(At);\n    BytesToNextAlignedPos = NextAligned - At;\n    if (BytesToNextAlignedPos == 0) return TRUE;\n    if (BytesToNextAlignedPos > 4)  return FALSE;\n\n    return (io ->Read(io, Buffer, BytesToNextAlignedPos, 1) == 1);\n}\n\ncmsBool CMSEXPORT _cmsWriteAlignment(cmsIOHANDLER* io)\n{\n    cmsUInt8Number  Buffer[4];\n    cmsUInt32Number NextAligned, At;\n    cmsUInt32Number BytesToNextAlignedPos;\n\n    _cmsAssert(io != NULL);\n\n    At = io -> Tell(io);\n    NextAligned = _cmsALIGNLONG(At);\n    BytesToNextAlignedPos = NextAligned - At;\n    if (BytesToNextAlignedPos == 0) return TRUE;\n    if (BytesToNextAlignedPos > 4)  return FALSE;\n\n    memset(Buffer, 0, BytesToNextAlignedPos);\n    return io -> Write(io, BytesToNextAlignedPos, Buffer);\n}\n\n\n// To deal with text streams. 2K at most\ncmsBool CMSEXPORT _cmsIOPrintf(cmsIOHANDLER* io, const char* frm, ...)\n{\n    va_list args;\n    int len;\n    cmsUInt8Number Buffer[2048];\n    cmsBool rc;\n\n    _cmsAssert(io != NULL);\n    _cmsAssert(frm != NULL);\n\n    va_start(args, frm);\n\n    len = vsnprintf((char*) Buffer, 2047, frm, args);\n    if (len < 0) return FALSE;   // Truncated, which is a fatal error for us\n\n    rc = io ->Write(io, len, Buffer);\n\n    va_end(args);\n\n    return rc;\n}\n\n\n// Plugin memory management -------------------------------------------------------------------------------------------------\n\n// Specialized malloc for plug-ins, that is freed upon exit.\nvoid* _cmsPluginMalloc(cmsContext ContextID, cmsUInt32Number size)\n{\n    struct _cmsContext_struct* ctx = _cmsGetContext(ContextID);\n\n    if (ctx ->MemPool == NULL) {\n\n        if (ContextID == NULL) {\n\n            ctx->MemPool = _cmsCreateSubAlloc(0, 2*1024);\n        }\n        else {\n            cmsSignalError(ContextID, cmsERROR_CORRUPTION_DETECTED, \"NULL memory pool on context\");\n            return NULL;\n        }\n    }\n\n    return _cmsSubAlloc(ctx->MemPool, size);\n}\n\n\n// Main plug-in dispatcher\ncmsBool CMSEXPORT cmsPlugin(void* Plug_in)\n{\n    return cmsPluginTHR(NULL, Plug_in);\n}\n\ncmsBool CMSEXPORT cmsPluginTHR(cmsContext id, void* Plug_in)\n{\n    cmsPluginBase* Plugin;\n\n    for (Plugin = (cmsPluginBase*) Plug_in;\n         Plugin != NULL;\n         Plugin = Plugin -> Next) {\n\n            if (Plugin -> Magic != cmsPluginMagicNumber) {\n                cmsSignalError(id, cmsERROR_UNKNOWN_EXTENSION, \"Unrecognized plugin\");\n                return FALSE;\n            }\n\n            if (Plugin ->ExpectedVersion > LCMS_VERSION) {\n                cmsSignalError(id, cmsERROR_UNKNOWN_EXTENSION, \"plugin needs Little CMS %d, current version is %d\",\n                    Plugin ->ExpectedVersion, LCMS_VERSION);\n                return FALSE;\n            }\n\n            switch (Plugin -> Type) {\n\n                case cmsPluginMemHandlerSig:\n                    if (!_cmsRegisterMemHandlerPlugin(id, Plugin)) return FALSE;\n                    break;\n\n                case cmsPluginInterpolationSig:\n                    if (!_cmsRegisterInterpPlugin(id, Plugin)) return FALSE;\n                    break;\n\n                case cmsPluginTagTypeSig:\n                    if (!_cmsRegisterTagTypePlugin(id, Plugin)) return FALSE;\n                    break;\n\n                case cmsPluginTagSig:\n                    if (!_cmsRegisterTagPlugin(id, Plugin)) return FALSE;\n                    break;\n\n                case cmsPluginFormattersSig:\n                    if (!_cmsRegisterFormattersPlugin(id, Plugin)) return FALSE;\n                    break;\n\n                case cmsPluginRenderingIntentSig:\n                    if (!_cmsRegisterRenderingIntentPlugin(id, Plugin)) return FALSE;\n                    break;\n\n                case cmsPluginParametricCurveSig:\n                    if (!_cmsRegisterParametricCurvesPlugin(id, Plugin)) return FALSE;\n                    break;\n\n                case cmsPluginMultiProcessElementSig:\n                    if (!_cmsRegisterMultiProcessElementPlugin(id, Plugin)) return FALSE;\n                    break;\n\n                case cmsPluginOptimizationSig:\n                    if (!_cmsRegisterOptimizationPlugin(id, Plugin)) return FALSE;\n                    break;\n\n                case cmsPluginTransformSig:\n                    if (!_cmsRegisterTransformPlugin(id, Plugin)) return FALSE;\n                    break;\n\n                case cmsPluginMutexSig:\n                    if (!_cmsRegisterMutexPlugin(id, Plugin)) return FALSE;\n                    break;\n\n                default:\n                    cmsSignalError(id, cmsERROR_UNKNOWN_EXTENSION, \"Unrecognized plugin type '%X'\", Plugin -> Type);\n                    return FALSE;\n            }\n    }\n\n    // Keep a reference to the plug-in\n    return TRUE;\n}\n\n\n// Revert all plug-ins to default\nvoid CMSEXPORT cmsUnregisterPlugins(void)\n{\n    cmsUnregisterPluginsTHR(NULL);\n}\n\n\n// The Global storage for system context. This is the one and only global variable\n// pointers structure. All global vars are referenced here.\nstatic struct _cmsContext_struct globalContext = {\n\n    NULL,                              // Not in the linked list\n    NULL,                              // No suballocator\n    {\n        NULL,                          //  UserPtr,            \n        &_cmsLogErrorChunk,            //  Logger,\n        &_cmsAlarmCodesChunk,          //  AlarmCodes,\n        &_cmsAdaptationStateChunk,     //  AdaptationState, \n        &_cmsMemPluginChunk,           //  MemPlugin,\n        &_cmsInterpPluginChunk,        //  InterpPlugin,\n        &_cmsCurvesPluginChunk,        //  CurvesPlugin,\n        &_cmsFormattersPluginChunk,    //  FormattersPlugin,\n        &_cmsTagTypePluginChunk,       //  TagTypePlugin,\n        &_cmsTagPluginChunk,           //  TagPlugin,\n        &_cmsIntentsPluginChunk,       //  IntentPlugin,\n        &_cmsMPETypePluginChunk,       //  MPEPlugin,\n        &_cmsOptimizationPluginChunk,  //  OptimizationPlugin,\n        &_cmsTransformPluginChunk,     //  TransformPlugin,\n        &_cmsMutexPluginChunk          //  MutexPlugin\n    },\n    \n    { NULL, NULL, NULL, NULL, NULL, NULL } // The default memory allocator is not used for context 0\n};\n\n\n// The context pool (linked list head)\nstatic _cmsMutex _cmsContextPoolHeadMutex = CMS_MUTEX_INITIALIZER;\nstatic struct _cmsContext_struct* _cmsContextPoolHead = NULL;\n\n// Internal, get associated pointer, with guessing. Never returns NULL.\nstruct _cmsContext_struct* _cmsGetContext(cmsContext ContextID)\n{\n    struct _cmsContext_struct* id = (struct _cmsContext_struct*) ContextID;\n    struct _cmsContext_struct* ctx;\n\n\n    // On 0, use global settings\n    if (id == NULL) \n        return &globalContext;\n\n    // Search\n    for (ctx = _cmsContextPoolHead;\n         ctx != NULL;\n         ctx = ctx ->Next) {\n\n            // Found it?\n            if (id == ctx)\n                return ctx; // New-style context, \n    }\n\n    return &globalContext;\n}\n\n\n// Internal: get the memory area associanted with each context client\n// Returns the block assigned to the specific zone. \nvoid* _cmsContextGetClientChunk(cmsContext ContextID, _cmsMemoryClient mc)\n{\n    struct _cmsContext_struct* ctx;\n    void *ptr;\n\n    if (mc >= MemoryClientMax) {\n        cmsSignalError(ContextID, cmsERROR_RANGE, \"Bad context client\");\n        return NULL;\n    }\n    \n    ctx = _cmsGetContext(ContextID);\n    ptr = ctx ->chunks[mc];\n\n    if (ptr != NULL)\n        return ptr;\n\n    // A null ptr means no special settings for that context, and this \n    // reverts to Context0 globals\n    return globalContext.chunks[mc];    \n}\n\n\n// This function returns the given context its default pristine state,\n// as no plug-ins were declared. There is no way to unregister a single \n// plug-in, as a single call to cmsPluginTHR() function may register \n// many different plug-ins simultaneously, then there is no way to \n// identify which plug-in to unregister.\nvoid CMSEXPORT cmsUnregisterPluginsTHR(cmsContext ContextID)\n{\n    _cmsRegisterMemHandlerPlugin(ContextID, NULL);\n    _cmsRegisterInterpPlugin(ContextID, NULL);\n    _cmsRegisterTagTypePlugin(ContextID, NULL);\n    _cmsRegisterTagPlugin(ContextID, NULL);\n    _cmsRegisterFormattersPlugin(ContextID, NULL);\n    _cmsRegisterRenderingIntentPlugin(ContextID, NULL);\n    _cmsRegisterParametricCurvesPlugin(ContextID, NULL);\n    _cmsRegisterMultiProcessElementPlugin(ContextID, NULL);\n    _cmsRegisterOptimizationPlugin(ContextID, NULL);\n    _cmsRegisterTransformPlugin(ContextID, NULL);    \n    _cmsRegisterMutexPlugin(ContextID, NULL);\n}\n\n\n// Returns the memory manager plug-in, if any, from the Plug-in bundle\nstatic\ncmsPluginMemHandler* _cmsFindMemoryPlugin(void* PluginBundle)\n{\n    cmsPluginBase* Plugin;\n\n    for (Plugin = (cmsPluginBase*) PluginBundle;\n        Plugin != NULL;\n        Plugin = Plugin -> Next) {\n\n            if (Plugin -> Magic == cmsPluginMagicNumber && \n                Plugin -> ExpectedVersion <= LCMS_VERSION && \n                Plugin -> Type == cmsPluginMemHandlerSig) {\n\n                    // Found!\n                    return (cmsPluginMemHandler*) Plugin;  \n            }\n    }\n\n    // Nope, revert to defaults \n    return NULL;\n}\n\n\n// Creates a new context with optional associated plug-ins. Caller may also specify an optional pointer to user-defined \n// data that will be forwarded to plug-ins and logger.\ncmsContext CMSEXPORT cmsCreateContext(void* Plugin, void* UserData)\n{\n    struct _cmsContext_struct* ctx;\n    struct _cmsContext_struct  fakeContext;\n        \n    _cmsInstallAllocFunctions(_cmsFindMemoryPlugin(Plugin), &fakeContext.DefaultMemoryManager);\n    \n    fakeContext.chunks[UserPtr]     = UserData;\n    fakeContext.chunks[MemPlugin]   = &fakeContext.DefaultMemoryManager;\n\n    // Create the context structure.\n    ctx = (struct _cmsContext_struct*) _cmsMalloc(&fakeContext, sizeof(struct _cmsContext_struct));\n    if (ctx == NULL)   \n        return NULL;     // Something very wrong happened!\n\n    // Init the structure and the memory manager\n    memset(ctx, 0, sizeof(struct _cmsContext_struct));\n\n    // Keep memory manager\n    memcpy(&ctx->DefaultMemoryManager, &fakeContext.DefaultMemoryManager, sizeof(_cmsMemPluginChunk)); \n   \n    // Maintain the linked list (with proper locking)\n    _cmsEnterCriticalSectionPrimitive(&_cmsContextPoolHeadMutex);\n       ctx ->Next = _cmsContextPoolHead;\n       _cmsContextPoolHead = ctx;\n    _cmsLeaveCriticalSectionPrimitive(&_cmsContextPoolHeadMutex);\n\n    ctx ->chunks[UserPtr]     = UserData;\n    ctx ->chunks[MemPlugin]   = &ctx->DefaultMemoryManager;\n   \n    // Now we can allocate the pool by using default memory manager\n    ctx ->MemPool = _cmsCreateSubAlloc(ctx, 22 * sizeof(void*));  // default size about 32 pointers\n    if (ctx ->MemPool == NULL) {\n\n         cmsDeleteContext(ctx);\n        return NULL;\n    }\n\n    _cmsAllocLogErrorChunk(ctx, NULL);\n    _cmsAllocAlarmCodesChunk(ctx, NULL);\n    _cmsAllocAdaptationStateChunk(ctx, NULL);\n    _cmsAllocMemPluginChunk(ctx, NULL);\n    _cmsAllocInterpPluginChunk(ctx, NULL);\n    _cmsAllocCurvesPluginChunk(ctx, NULL);\n    _cmsAllocFormattersPluginChunk(ctx, NULL);\n    _cmsAllocTagTypePluginChunk(ctx, NULL);\n    _cmsAllocMPETypePluginChunk(ctx, NULL);\n    _cmsAllocTagPluginChunk(ctx, NULL);\n    _cmsAllocIntentsPluginChunk(ctx, NULL);\n    _cmsAllocOptimizationPluginChunk(ctx, NULL);\n    _cmsAllocTransformPluginChunk(ctx, NULL);\n    _cmsAllocMutexPluginChunk(ctx, NULL);\n\n    // Setup the plug-ins\n    if (!cmsPluginTHR(ctx, Plugin)) {\n    \n        cmsDeleteContext(ctx);\n        return NULL;\n    }\n\n    return (cmsContext) ctx;  \n}\n\n// Duplicates a context with all associated plug-ins. \n// Caller may specify an optional pointer to user-defined \n// data that will be forwarded to plug-ins and logger. \ncmsContext CMSEXPORT cmsDupContext(cmsContext ContextID, void* NewUserData)\n{\n    int i;\n    struct _cmsContext_struct* ctx;\n    const struct _cmsContext_struct* src = _cmsGetContext(ContextID);\n\n    void* userData = (NewUserData != NULL) ? NewUserData : src -> chunks[UserPtr];\n    \n    \n    ctx = (struct _cmsContext_struct*) _cmsMalloc(ContextID, sizeof(struct _cmsContext_struct));\n    if (ctx == NULL)   \n        return NULL;     // Something very wrong happened\n\n    // Setup default memory allocators\n    memcpy(&ctx->DefaultMemoryManager, &src->DefaultMemoryManager, sizeof(ctx->DefaultMemoryManager));\n\n    // Maintain the linked list\n    _cmsEnterCriticalSectionPrimitive(&_cmsContextPoolHeadMutex);\n       ctx ->Next = _cmsContextPoolHead;\n       _cmsContextPoolHead = ctx;\n    _cmsLeaveCriticalSectionPrimitive(&_cmsContextPoolHeadMutex);\n\n    ctx ->chunks[UserPtr]    = userData;\n    ctx ->chunks[MemPlugin]  = &ctx->DefaultMemoryManager;\n\n    ctx ->MemPool = _cmsCreateSubAlloc(ctx, 22 * sizeof(void*));\n    if (ctx ->MemPool == NULL) {\n\n         cmsDeleteContext(ctx);\n        return NULL;\n    }\n\n    // Allocate all required chunks.\n    _cmsAllocLogErrorChunk(ctx, src);\n    _cmsAllocAlarmCodesChunk(ctx, src);\n    _cmsAllocAdaptationStateChunk(ctx, src);\n    _cmsAllocMemPluginChunk(ctx, src);\n    _cmsAllocInterpPluginChunk(ctx, src);\n    _cmsAllocCurvesPluginChunk(ctx, src);\n    _cmsAllocFormattersPluginChunk(ctx, src);\n    _cmsAllocTagTypePluginChunk(ctx, src);\n    _cmsAllocMPETypePluginChunk(ctx, src);\n    _cmsAllocTagPluginChunk(ctx, src);\n    _cmsAllocIntentsPluginChunk(ctx, src);\n    _cmsAllocOptimizationPluginChunk(ctx, src);\n    _cmsAllocTransformPluginChunk(ctx, src);\n    _cmsAllocMutexPluginChunk(ctx, src);\n\n    // Make sure no one failed\n    for (i=Logger; i < MemoryClientMax; i++) {\n\n        if (src ->chunks[i] == NULL) {\n            cmsDeleteContext((cmsContext) ctx);\n            return NULL;\n        }\n    }\n\n    return (cmsContext) ctx;\n}\n\n\n\nstatic\nstruct _cmsContext_struct* FindPrev(struct _cmsContext_struct* id)\n{\n    struct _cmsContext_struct* prev;\n\n    // Search for previous\n    for (prev = _cmsContextPoolHead; \n             prev != NULL;\n             prev = prev ->Next)\n    {\n        if (prev ->Next == id)\n            return prev;\n    }\n\n    return NULL;  // List is empty or only one element!\n}\n\n// Frees any resources associated with the given context, \n// and destroys the context placeholder. \n// The ContextID can no longer be used in any THR operation.  \nvoid CMSEXPORT cmsDeleteContext(cmsContext ContextID)\n{\n    if (ContextID != NULL) {\n\n        struct _cmsContext_struct* ctx = (struct _cmsContext_struct*) ContextID;              \n        struct _cmsContext_struct  fakeContext;  \n        struct _cmsContext_struct* prev;\n\n        memcpy(&fakeContext.DefaultMemoryManager, &ctx->DefaultMemoryManager, sizeof(ctx->DefaultMemoryManager));\n\n        fakeContext.chunks[UserPtr]     = ctx ->chunks[UserPtr];\n        fakeContext.chunks[MemPlugin]   = &fakeContext.DefaultMemoryManager;\n\n        // Get rid of plugins\n        cmsUnregisterPluginsTHR(ContextID); \n\n        // Since all memory is allocated in the private pool, all what we need to do is destroy the pool\n        if (ctx -> MemPool != NULL)\n              _cmsSubAllocDestroy(ctx ->MemPool);\n        ctx -> MemPool = NULL;\n\n        // Maintain list\n        _cmsEnterCriticalSectionPrimitive(&_cmsContextPoolHeadMutex);\n        if (_cmsContextPoolHead == ctx) { \n\n            _cmsContextPoolHead = ctx->Next;\n        }\n        else {\n\n            // Search for previous\n            for (prev = _cmsContextPoolHead; \n                prev != NULL;\n                prev = prev ->Next)\n            {\n                if (prev -> Next == ctx) {\n                    prev -> Next = ctx ->Next;\n                    break;\n                }\n            }\n        }\n        _cmsLeaveCriticalSectionPrimitive(&_cmsContextPoolHeadMutex);\n\n        // free the memory block itself\n        _cmsFree(&fakeContext, ctx);\n    }\n}\n\n// Returns the user data associated to the given ContextID, or NULL if no user data was attached on context creation\nvoid* CMSEXPORT cmsGetContextUserData(cmsContext ContextID)\n{\n    return _cmsContextGetClientChunk(ContextID, UserPtr);\n}\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/src/cmsps2.c",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2011 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n//\n\n#include \"lcms2_internal.h\"\n\n// PostScript ColorRenderingDictionary and ColorSpaceArray\n\n\n#define MAXPSCOLS   60      // Columns on tables\n\n/*\n    Implementation\n    --------------\n\n  PostScript does use XYZ as its internal PCS. But since PostScript\n  interpolation tables are limited to 8 bits, I use Lab as a way to\n  improve the accuracy, favoring perceptual results. So, for the creation\n  of each CRD, CSA the profiles are converted to Lab via a device\n  link between  profile -> Lab or Lab -> profile. The PS code necessary to\n  convert Lab <-> XYZ is also included.\n\n\n\n  Color Space Arrays (CSA)\n  ==================================================================================\n\n  In order to obtain precision, code chooses between three ways to implement\n  the device -> XYZ transform. These cases identifies monochrome profiles (often\n  implemented as a set of curves), matrix-shaper and Pipeline-based.\n\n  Monochrome\n  -----------\n\n  This is implemented as /CIEBasedA CSA. The prelinearization curve is\n  placed into /DecodeA section, and matrix equals to D50. Since here is\n  no interpolation tables, I do the conversion directly to XYZ\n\n  NOTE: CLUT-based monochrome profiles are NOT supported. So, cmsFLAGS_MATRIXINPUT\n  flag is forced on such profiles.\n\n    [ /CIEBasedA\n      <<\n            /DecodeA { transfer function } bind\n            /MatrixA [D50]\n            /RangeLMN [ 0.0 cmsD50X 0.0 cmsD50Y 0.0 cmsD50Z ]\n            /WhitePoint [D50]\n            /BlackPoint [BP]\n            /RenderingIntent (intent)\n      >>\n    ]\n\n   On simpler profiles, the PCS is already XYZ, so no conversion is required.\n\n\n   Matrix-shaper based\n   -------------------\n\n   This is implemented both with /CIEBasedABC or /CIEBasedDEF on dependig\n   of profile implementation. Since here there are no interpolation tables, I do\n   the conversion directly to XYZ\n\n\n\n    [ /CIEBasedABC\n            <<\n                /DecodeABC [ {transfer1} {transfer2} {transfer3} ]\n                /MatrixABC [Matrix]\n                /RangeLMN [ 0.0 cmsD50X 0.0 cmsD50Y 0.0 cmsD50Z ]\n                /DecodeLMN [ { / 2} dup dup ]\n                /WhitePoint [D50]\n                /BlackPoint [BP]\n                /RenderingIntent (intent)\n            >>\n    ]\n\n\n    CLUT based\n    ----------\n\n     Lab is used in such cases.\n\n    [ /CIEBasedDEF\n            <<\n            /DecodeDEF [ <prelinearization> ]\n            /Table [ p p p [<...>]]\n            /RangeABC [ 0 1 0 1 0 1]\n            /DecodeABC[ <postlinearization> ]\n            /RangeLMN [ -0.236 1.254 0 1 -0.635 1.640 ]\n               % -128/500 1+127/500 0 1  -127/200 1+128/200\n            /MatrixABC [ 1 1 1 1 0 0 0 0 -1]\n            /WhitePoint [D50]\n            /BlackPoint [BP]\n            /RenderingIntent (intent)\n    ]\n\n\n  Color Rendering Dictionaries (CRD)\n  ==================================\n  These are always implemented as CLUT, and always are using Lab. Since CRD are expected to\n  be used as resources, the code adds the definition as well.\n\n  <<\n    /ColorRenderingType 1\n    /WhitePoint [ D50 ]\n    /BlackPoint [BP]\n    /MatrixPQR [ Bradford ]\n    /RangePQR [-0.125 1.375 -0.125 1.375 -0.125 1.375 ]\n    /TransformPQR [\n    {4 index 3 get div 2 index 3 get mul exch pop exch pop exch pop exch pop } bind\n    {4 index 4 get div 2 index 4 get mul exch pop exch pop exch pop exch pop } bind\n    {4 index 5 get div 2 index 5 get mul exch pop exch pop exch pop exch pop } bind\n    ]\n    /MatrixABC <...>\n    /EncodeABC <...>\n    /RangeABC  <.. used for  XYZ -> Lab>\n    /EncodeLMN\n    /RenderTable [ p p p [<...>]]\n\n    /RenderingIntent (Perceptual)\n  >>\n  /Current exch /ColorRendering defineresource pop\n\n\n  The following stages are used to convert from XYZ to Lab\n  --------------------------------------------------------\n\n  Input is given at LMN stage on X, Y, Z\n\n  Encode LMN gives us f(X/Xn), f(Y/Yn), f(Z/Zn)\n\n  /EncodeLMN [\n\n    { 0.964200  div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n    { 1.000000  div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n    { 0.824900  div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n\n    ]\n\n\n  MatrixABC is used to compute f(Y/Yn), f(X/Xn) - f(Y/Yn), f(Y/Yn) - f(Z/Zn)\n\n  | 0  1  0|\n  | 1 -1  0|\n  | 0  1 -1|\n\n  /MatrixABC [ 0 1 0 1 -1 1 0 0 -1 ]\n\n EncodeABC finally gives Lab values.\n\n  /EncodeABC [\n    { 116 mul  16 sub 100 div  } bind\n    { 500 mul 128 add 255 div  } bind\n    { 200 mul 128 add 255 div  } bind\n    ]\n\n  The following stages are used to convert Lab to XYZ\n  ----------------------------------------------------\n\n    /RangeABC [ 0 1 0 1 0 1]\n    /DecodeABC [ { 100 mul 16 add 116 div } bind\n                 { 255 mul 128 sub 500 div } bind\n                 { 255 mul 128 sub 200 div } bind\n               ]\n\n    /MatrixABC [ 1 1 1 1 0 0 0 0 -1]\n    /DecodeLMN [\n                {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.964200 mul} bind\n                {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse } bind\n                {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.824900 mul} bind\n                ]\n\n\n*/\n\n/*\n\n PostScript algorithms discussion.\n =========================================================================================================\n\n  1D interpolation algorithm\n\n\n  1D interpolation (float)\n  ------------------------\n\n    val2 = Domain * Value;\n\n    cell0 = (int) floor(val2);\n    cell1 = (int) ceil(val2);\n\n    rest = val2 - cell0;\n\n    y0 = LutTable[cell0] ;\n    y1 = LutTable[cell1] ;\n\n    y = y0 + (y1 - y0) * rest;\n\n\n\n  PostScript code                   Stack\n  ================================================\n\n  {                                 % v\n    <check 0..1.0>\n    [array]                         % v tab\n    dup                             % v tab tab\n    length 1 sub                    % v tab dom\n\n    3 -1 roll                       % tab dom v\n\n    mul                             % tab val2\n    dup                             % tab val2 val2\n    dup                             % tab val2 val2 val2\n    floor cvi                       % tab val2 val2 cell0\n    exch                            % tab val2 cell0 val2\n    ceiling cvi                     % tab val2 cell0 cell1\n\n    3 index                         % tab val2 cell0 cell1 tab\n    exch                            % tab val2 cell0 tab cell1\n    get                             % tab val2 cell0 y1\n\n    4 -1 roll                       % val2 cell0 y1 tab\n    3 -1 roll                       % val2 y1 tab cell0\n    get                             % val2 y1 y0\n\n    dup                             % val2 y1 y0 y0\n    3 1 roll                        % val2 y0 y1 y0\n\n    sub                             % val2 y0 (y1-y0)\n    3 -1 roll                       % y0 (y1-y0) val2\n    dup                             % y0 (y1-y0) val2 val2\n    floor cvi                       % y0 (y1-y0) val2 floor(val2)\n    sub                             % y0 (y1-y0) rest\n    mul                             % y0 t1\n    add                             % y\n    65535 div                       % result\n\n  } bind\n\n\n*/\n\n\n// This struct holds the memory block currently being write\ntypedef struct {\n    _cmsStageCLutData* Pipeline;\n    cmsIOHANDLER* m;\n\n    int FirstComponent;\n    int SecondComponent;\n\n    const char* PreMaj;\n    const char* PostMaj;\n    const char* PreMin;\n    const char* PostMin;\n\n    int  FixWhite;    // Force mapping of pure white\n\n    cmsColorSpaceSignature  ColorSpace;  // ColorSpace of profile\n\n\n} cmsPsSamplerCargo;\n\nstatic int _cmsPSActualColumn = 0;\n\n\n// Convert to byte\nstatic\ncmsUInt8Number Word2Byte(cmsUInt16Number w)\n{\n    return (cmsUInt8Number) floor((cmsFloat64Number) w / 257.0 + 0.5);\n}\n\n\n// Convert to byte (using ICC2 notation)\n/*\nstatic\ncmsUInt8Number L2Byte(cmsUInt16Number w)\n{\n    int ww = w + 0x0080;\n\n    if (ww > 0xFFFF) return 0xFF;\n\n    return (cmsUInt8Number) ((cmsUInt16Number) (ww >> 8) & 0xFF);\n}\n*/\n\n// Write a cooked byte\n\nstatic\nvoid WriteByte(cmsIOHANDLER* m, cmsUInt8Number b)\n{\n    _cmsIOPrintf(m, \"%02x\", b);\n    _cmsPSActualColumn += 2;\n\n    if (_cmsPSActualColumn > MAXPSCOLS) {\n\n        _cmsIOPrintf(m, \"\\n\");\n        _cmsPSActualColumn = 0;\n    }\n}\n\n// ----------------------------------------------------------------- PostScript generation\n\n\n// Removes offending Carriage returns\nstatic\nchar* RemoveCR(const char* txt)\n{\n    static char Buffer[2048];\n    char* pt;\n\n    strncpy(Buffer, txt, 2047);\n    Buffer[2047] = 0;\n    for (pt = Buffer; *pt; pt++)\n            if (*pt == '\\n' || *pt == '\\r') *pt = ' ';\n\n    return Buffer;\n\n}\n\nstatic\nvoid EmitHeader(cmsIOHANDLER* m, const char* Title, cmsHPROFILE hProfile)\n{\n    time_t timer;\n    cmsMLU *Description, *Copyright;\n    char DescASCII[256], CopyrightASCII[256];\n\n    time(&timer);\n\n    Description = (cmsMLU*) cmsReadTag(hProfile, cmsSigProfileDescriptionTag);\n    Copyright   = (cmsMLU*) cmsReadTag(hProfile, cmsSigCopyrightTag);\n\n    DescASCII[0] = DescASCII[255] = 0;\n    CopyrightASCII[0] = CopyrightASCII[255] = 0;\n\n    if (Description != NULL) cmsMLUgetASCII(Description,  cmsNoLanguage, cmsNoCountry, DescASCII,       255);\n    if (Copyright != NULL)   cmsMLUgetASCII(Copyright,    cmsNoLanguage, cmsNoCountry, CopyrightASCII,  255);\n\n    _cmsIOPrintf(m, \"%%!PS-Adobe-3.0\\n\");\n    _cmsIOPrintf(m, \"%%\\n\");\n    _cmsIOPrintf(m, \"%% %s\\n\", Title);\n    _cmsIOPrintf(m, \"%% Source: %s\\n\", RemoveCR(DescASCII));\n    _cmsIOPrintf(m, \"%%         %s\\n\", RemoveCR(CopyrightASCII));\n    _cmsIOPrintf(m, \"%% Created: %s\", ctime(&timer)); // ctime appends a \\n!!!\n    _cmsIOPrintf(m, \"%%\\n\");\n    _cmsIOPrintf(m, \"%%%%BeginResource\\n\");\n\n}\n\n\n// Emits White & Black point. White point is always D50, Black point is the device\n// Black point adapted to D50.\n\nstatic\nvoid EmitWhiteBlackD50(cmsIOHANDLER* m, cmsCIEXYZ* BlackPoint)\n{\n\n    _cmsIOPrintf(m, \"/BlackPoint [%f %f %f]\\n\", BlackPoint -> X,\n                                          BlackPoint -> Y,\n                                          BlackPoint -> Z);\n\n    _cmsIOPrintf(m, \"/WhitePoint [%f %f %f]\\n\", cmsD50_XYZ()->X,\n                                          cmsD50_XYZ()->Y,\n                                          cmsD50_XYZ()->Z);\n}\n\n\nstatic\nvoid EmitRangeCheck(cmsIOHANDLER* m)\n{\n    _cmsIOPrintf(m, \"dup 0.0 lt { pop 0.0 } if \"\n                    \"dup 1.0 gt { pop 1.0 } if \");\n\n}\n\n// Does write the intent\n\nstatic\nvoid EmitIntent(cmsIOHANDLER* m, int RenderingIntent)\n{\n    const char *intent;\n\n    switch (RenderingIntent) {\n\n        case INTENT_PERCEPTUAL:            intent = \"Perceptual\"; break;\n        case INTENT_RELATIVE_COLORIMETRIC: intent = \"RelativeColorimetric\"; break;\n        case INTENT_ABSOLUTE_COLORIMETRIC: intent = \"AbsoluteColorimetric\"; break;\n        case INTENT_SATURATION:            intent = \"Saturation\"; break;\n\n        default: intent = \"Undefined\"; break;\n    }\n\n    _cmsIOPrintf(m, \"/RenderingIntent (%s)\\n\", intent );\n}\n\n//\n//  Convert L* to Y\n//\n//      Y = Yn*[ (L* + 16) / 116] ^ 3   if (L*) >= 6 / 29\n//        = Yn*( L* / 116) / 7.787      if (L*) < 6 / 29\n//\n\n/*\nstatic\nvoid EmitL2Y(cmsIOHANDLER* m)\n{\n    _cmsIOPrintf(m,\n            \"{ \"\n                \"100 mul 16 add 116 div \"               // (L * 100 + 16) / 116\n                 \"dup 6 29 div ge \"                     // >= 6 / 29 ?\n                 \"{ dup dup mul mul } \"                 // yes, ^3 and done\n                 \"{ 4 29 div sub 108 841 div mul } \"    // no, slope limiting\n            \"ifelse } bind \");\n}\n*/\n\n\n// Lab -> XYZ, see the discussion above\n\nstatic\nvoid EmitLab2XYZ(cmsIOHANDLER* m)\n{\n    _cmsIOPrintf(m, \"/RangeABC [ 0 1 0 1 0 1]\\n\");\n    _cmsIOPrintf(m, \"/DecodeABC [\\n\");\n    _cmsIOPrintf(m, \"{100 mul  16 add 116 div } bind\\n\");\n    _cmsIOPrintf(m, \"{255 mul 128 sub 500 div } bind\\n\");\n    _cmsIOPrintf(m, \"{255 mul 128 sub 200 div } bind\\n\");\n    _cmsIOPrintf(m, \"]\\n\");\n    _cmsIOPrintf(m, \"/MatrixABC [ 1 1 1 1 0 0 0 0 -1]\\n\");\n    _cmsIOPrintf(m, \"/RangeLMN [ -0.236 1.254 0 1 -0.635 1.640 ]\\n\");\n    _cmsIOPrintf(m, \"/DecodeLMN [\\n\");\n    _cmsIOPrintf(m, \"{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.964200 mul} bind\\n\");\n    _cmsIOPrintf(m, \"{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse } bind\\n\");\n    _cmsIOPrintf(m, \"{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.824900 mul} bind\\n\");\n    _cmsIOPrintf(m, \"]\\n\");\n}\n\n\n\n// Outputs a table of words. It does use 16 bits\n\nstatic\nvoid Emit1Gamma(cmsIOHANDLER* m, cmsToneCurve* Table)\n{\n    cmsUInt32Number i;\n    cmsFloat64Number gamma;\n\n    if (Table == NULL) return; // Error\n\n    if (Table ->nEntries <= 0) return;  // Empty table\n\n    // Suppress whole if identity\n    if (cmsIsToneCurveLinear(Table)) return;\n\n    // Check if is really an exponential. If so, emit \"exp\"\n    gamma = cmsEstimateGamma(Table, 0.001);\n     if (gamma > 0) {\n            _cmsIOPrintf(m, \"{ %g exp } bind \", gamma);\n            return;\n     }\n\n    _cmsIOPrintf(m, \"{ \");\n\n    // Bounds check\n    EmitRangeCheck(m);\n\n    // Emit intepolation code\n\n    // PostScript code                      Stack\n    // ===============                      ========================\n                                            // v\n    _cmsIOPrintf(m, \" [\");\n\n    for (i=0; i < Table->nEntries; i++) {\n        _cmsIOPrintf(m, \"%d \", Table->Table16[i]);\n    }\n\n    _cmsIOPrintf(m, \"] \");                        // v tab\n\n    _cmsIOPrintf(m, \"dup \");                      // v tab tab\n    _cmsIOPrintf(m, \"length 1 sub \");             // v tab dom\n    _cmsIOPrintf(m, \"3 -1 roll \");                // tab dom v\n    _cmsIOPrintf(m, \"mul \");                      // tab val2\n    _cmsIOPrintf(m, \"dup \");                      // tab val2 val2\n    _cmsIOPrintf(m, \"dup \");                      // tab val2 val2 val2\n    _cmsIOPrintf(m, \"floor cvi \");                // tab val2 val2 cell0\n    _cmsIOPrintf(m, \"exch \");                     // tab val2 cell0 val2\n    _cmsIOPrintf(m, \"ceiling cvi \");              // tab val2 cell0 cell1\n    _cmsIOPrintf(m, \"3 index \");                  // tab val2 cell0 cell1 tab\n    _cmsIOPrintf(m, \"exch \");                     // tab val2 cell0 tab cell1\n    _cmsIOPrintf(m, \"get \");                      // tab val2 cell0 y1\n    _cmsIOPrintf(m, \"4 -1 roll \");                // val2 cell0 y1 tab\n    _cmsIOPrintf(m, \"3 -1 roll \");                // val2 y1 tab cell0\n    _cmsIOPrintf(m, \"get \");                      // val2 y1 y0\n    _cmsIOPrintf(m, \"dup \");                      // val2 y1 y0 y0\n    _cmsIOPrintf(m, \"3 1 roll \");                 // val2 y0 y1 y0\n    _cmsIOPrintf(m, \"sub \");                      // val2 y0 (y1-y0)\n    _cmsIOPrintf(m, \"3 -1 roll \");                // y0 (y1-y0) val2\n    _cmsIOPrintf(m, \"dup \");                      // y0 (y1-y0) val2 val2\n    _cmsIOPrintf(m, \"floor cvi \");                // y0 (y1-y0) val2 floor(val2)\n    _cmsIOPrintf(m, \"sub \");                      // y0 (y1-y0) rest\n    _cmsIOPrintf(m, \"mul \");                      // y0 t1\n    _cmsIOPrintf(m, \"add \");                      // y\n    _cmsIOPrintf(m, \"65535 div \");                // result\n\n    _cmsIOPrintf(m, \" } bind \");\n}\n\n\n// Compare gamma table\n\nstatic\ncmsBool GammaTableEquals(cmsUInt16Number* g1, cmsUInt16Number* g2, int nEntries)\n{\n    return memcmp(g1, g2, nEntries* sizeof(cmsUInt16Number)) == 0;\n}\n\n\n// Does write a set of gamma curves\n\nstatic\nvoid EmitNGamma(cmsIOHANDLER* m, int n, cmsToneCurve* g[])\n{\n    int i;\n\n    for( i=0; i < n; i++ )\n    {\n        if (g[i] == NULL) return; // Error\n\n        if (i > 0 && GammaTableEquals(g[i-1]->Table16, g[i]->Table16, g[i]->nEntries)) {\n\n            _cmsIOPrintf(m, \"dup \");\n        }\n        else {\n            Emit1Gamma(m, g[i]);\n        }\n    }\n\n}\n\n\n\n\n\n// Following code dumps a LUT onto memory stream\n\n\n// This is the sampler. Intended to work in SAMPLER_INSPECT mode,\n// that is, the callback will be called for each knot with\n//\n//          In[]  The grid location coordinates, normalized to 0..ffff\n//          Out[] The Pipeline values, normalized to 0..ffff\n//\n//  Returning a value other than 0 does terminate the sampling process\n//\n//  Each row contains Pipeline values for all but first component. So, I\n//  detect row changing by keeping a copy of last value of first\n//  component. -1 is used to mark begining of whole block.\n\nstatic\nint OutputValueSampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo)\n{\n    cmsPsSamplerCargo* sc = (cmsPsSamplerCargo*) Cargo;\n    cmsUInt32Number i;\n\n\n    if (sc -> FixWhite) {\n\n        if (In[0] == 0xFFFF) {  // Only in L* = 100, ab = [-8..8]\n\n            if ((In[1] >= 0x7800 && In[1] <= 0x8800) &&\n                (In[2] >= 0x7800 && In[2] <= 0x8800)) {\n\n                cmsUInt16Number* Black;\n                cmsUInt16Number* White;\n                cmsUInt32Number nOutputs;\n\n                if (!_cmsEndPointsBySpace(sc ->ColorSpace, &White, &Black, &nOutputs))\n                        return 0;\n\n                for (i=0; i < nOutputs; i++)\n                        Out[i] = White[i];\n            }\n\n\n        }\n    }\n\n\n    // Hadle the parenthesis on rows\n\n    if (In[0] != sc ->FirstComponent) {\n\n            if (sc ->FirstComponent != -1) {\n\n                    _cmsIOPrintf(sc ->m, sc ->PostMin);\n                    sc ->SecondComponent = -1;\n                    _cmsIOPrintf(sc ->m, sc ->PostMaj);\n            }\n\n            // Begin block\n            _cmsPSActualColumn = 0;\n\n            _cmsIOPrintf(sc ->m, sc ->PreMaj);\n            sc ->FirstComponent = In[0];\n    }\n\n\n      if (In[1] != sc ->SecondComponent) {\n\n            if (sc ->SecondComponent != -1) {\n\n                    _cmsIOPrintf(sc ->m, sc ->PostMin);\n            }\n\n            _cmsIOPrintf(sc ->m, sc ->PreMin);\n            sc ->SecondComponent = In[1];\n    }\n\n      // Dump table.\n\n      for (i=0; i < sc -> Pipeline ->Params->nOutputs; i++) {\n\n          cmsUInt16Number wWordOut = Out[i];\n          cmsUInt8Number wByteOut;           // Value as byte\n\n\n          // We always deal with Lab4\n\n          wByteOut = Word2Byte(wWordOut);\n          WriteByte(sc -> m, wByteOut);\n      }\n\n      return 1;\n}\n\n// Writes a Pipeline on memstream. Could be 8 or 16 bits based\n\nstatic\nvoid WriteCLUT(cmsIOHANDLER* m, cmsStage* mpe, const char* PreMaj,\n                                             const char* PostMaj,\n                                             const char* PreMin,\n                                             const char* PostMin,\n                                             int FixWhite,\n                                             cmsColorSpaceSignature ColorSpace)\n{\n    cmsUInt32Number i;\n    cmsPsSamplerCargo sc;\n\n    sc.FirstComponent = -1;\n    sc.SecondComponent = -1;\n    sc.Pipeline = (_cmsStageCLutData *) mpe ->Data;\n    sc.m   = m;\n    sc.PreMaj = PreMaj;\n    sc.PostMaj= PostMaj;\n\n    sc.PreMin   = PreMin;\n    sc.PostMin  = PostMin;\n    sc.FixWhite = FixWhite;\n    sc.ColorSpace = ColorSpace;\n\n    _cmsIOPrintf(m, \"[\");\n\n    for (i=0; i < sc.Pipeline->Params->nInputs; i++)\n        _cmsIOPrintf(m, \" %d \", sc.Pipeline->Params->nSamples[i]);\n\n    _cmsIOPrintf(m, \" [\\n\");\n\n    cmsStageSampleCLut16bit(mpe, OutputValueSampler, (void*) &sc, SAMPLER_INSPECT);\n\n    _cmsIOPrintf(m, PostMin);\n    _cmsIOPrintf(m, PostMaj);\n    _cmsIOPrintf(m, \"] \");\n\n}\n\n\n// Dumps CIEBasedA Color Space Array\n\nstatic\nint EmitCIEBasedA(cmsIOHANDLER* m, cmsToneCurve* Curve, cmsCIEXYZ* BlackPoint)\n{\n\n    _cmsIOPrintf(m, \"[ /CIEBasedA\\n\");\n    _cmsIOPrintf(m, \"  <<\\n\");\n\n    _cmsIOPrintf(m, \"/DecodeA \");\n\n    Emit1Gamma(m, Curve);\n\n    _cmsIOPrintf(m, \" \\n\");\n\n    _cmsIOPrintf(m, \"/MatrixA [ 0.9642 1.0000 0.8249 ]\\n\");\n    _cmsIOPrintf(m, \"/RangeLMN [ 0.0 0.9642 0.0 1.0000 0.0 0.8249 ]\\n\");\n\n    EmitWhiteBlackD50(m, BlackPoint);\n    EmitIntent(m, INTENT_PERCEPTUAL);\n\n    _cmsIOPrintf(m, \">>\\n\");\n    _cmsIOPrintf(m, \"]\\n\");\n\n    return 1;\n}\n\n\n// Dumps CIEBasedABC Color Space Array\n\nstatic\nint EmitCIEBasedABC(cmsIOHANDLER* m, cmsFloat64Number* Matrix, cmsToneCurve** CurveSet, cmsCIEXYZ* BlackPoint)\n{\n    int i;\n\n    _cmsIOPrintf(m, \"[ /CIEBasedABC\\n\");\n    _cmsIOPrintf(m, \"<<\\n\");\n    _cmsIOPrintf(m, \"/DecodeABC [ \");\n\n    EmitNGamma(m, 3, CurveSet);\n\n    _cmsIOPrintf(m, \"]\\n\");\n\n    _cmsIOPrintf(m, \"/MatrixABC [ \" );\n\n    for( i=0; i < 3; i++ ) {\n\n        _cmsIOPrintf(m, \"%.6f %.6f %.6f \", Matrix[i + 3*0],\n                                           Matrix[i + 3*1],\n                                           Matrix[i + 3*2]);\n    }\n\n\n    _cmsIOPrintf(m, \"]\\n\");\n\n    _cmsIOPrintf(m, \"/RangeLMN [ 0.0 0.9642 0.0 1.0000 0.0 0.8249 ]\\n\");\n\n    EmitWhiteBlackD50(m, BlackPoint);\n    EmitIntent(m, INTENT_PERCEPTUAL);\n\n    _cmsIOPrintf(m, \">>\\n\");\n    _cmsIOPrintf(m, \"]\\n\");\n\n\n    return 1;\n}\n\n\nstatic\nint EmitCIEBasedDEF(cmsIOHANDLER* m, cmsPipeline* Pipeline, int Intent, cmsCIEXYZ* BlackPoint)\n{\n    const char* PreMaj;\n    const char* PostMaj;\n    const char* PreMin, *PostMin;\n    cmsStage* mpe;\n\n    mpe = Pipeline ->Elements;\n\n    switch (cmsStageInputChannels(mpe)) {\n    case 3:\n\n            _cmsIOPrintf(m, \"[ /CIEBasedDEF\\n\");\n            PreMaj =\"<\";\n            PostMaj= \">\\n\";\n            PreMin = PostMin = \"\";\n            break;\n    case 4:\n            _cmsIOPrintf(m, \"[ /CIEBasedDEFG\\n\");\n            PreMaj = \"[\";\n            PostMaj = \"]\\n\";\n            PreMin = \"<\";\n            PostMin = \">\\n\";\n            break;\n    default:\n            return 0;\n\n    }\n\n    _cmsIOPrintf(m, \"<<\\n\");\n\n    if (cmsStageType(mpe) == cmsSigCurveSetElemType) {\n\n        _cmsIOPrintf(m, \"/DecodeDEF [ \");\n        EmitNGamma(m, cmsStageOutputChannels(mpe), _cmsStageGetPtrToCurveSet(mpe));\n        _cmsIOPrintf(m, \"]\\n\");\n\n        mpe = mpe ->Next;\n    }\n\n    if (cmsStageType(mpe) == cmsSigCLutElemType) {\n\n            _cmsIOPrintf(m, \"/Table \");\n            WriteCLUT(m, mpe, PreMaj, PostMaj, PreMin, PostMin, FALSE, (cmsColorSpaceSignature) 0);\n            _cmsIOPrintf(m, \"]\\n\");\n    }\n\n    EmitLab2XYZ(m);\n    EmitWhiteBlackD50(m, BlackPoint);\n    EmitIntent(m, Intent);\n\n    _cmsIOPrintf(m, \"   >>\\n\");\n    _cmsIOPrintf(m, \"]\\n\");\n\n    return 1;\n}\n\n// Generates a curve from a gray profile\n\nstatic\n    cmsToneCurve* ExtractGray2Y(cmsContext ContextID, cmsHPROFILE hProfile, int Intent)\n{\n    cmsToneCurve* Out = cmsBuildTabulatedToneCurve16(ContextID, 256, NULL);\n    cmsHPROFILE hXYZ  = cmsCreateXYZProfile();\n    cmsHTRANSFORM xform = cmsCreateTransformTHR(ContextID, hProfile, TYPE_GRAY_8, hXYZ, TYPE_XYZ_DBL, Intent, cmsFLAGS_NOOPTIMIZE);\n    int i;\n\n    if (Out != NULL) {\n        for (i=0; i < 256; i++) {\n\n            cmsUInt8Number Gray = (cmsUInt8Number) i;\n            cmsCIEXYZ XYZ;\n\n            cmsDoTransform(xform, &Gray, &XYZ, 1);\n\n            Out ->Table16[i] =_cmsQuickSaturateWord(XYZ.Y * 65535.0);\n        }\n    }\n\n    cmsDeleteTransform(xform);\n    cmsCloseProfile(hXYZ);\n    return Out;\n}\n\n\n\n// Because PostScript has only 8 bits in /Table, we should use\n// a more perceptually uniform space... I do choose Lab.\n\nstatic\nint WriteInputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, int Intent, cmsUInt32Number dwFlags)\n{\n    cmsHPROFILE hLab;\n    cmsHTRANSFORM xform;\n    cmsUInt32Number nChannels;\n    cmsUInt32Number InputFormat;\n    int rc;\n    cmsHPROFILE Profiles[2];\n    cmsCIEXYZ BlackPointAdaptedToD50;\n\n    // Does create a device-link based transform.\n    // The DeviceLink is next dumped as working CSA.\n\n    InputFormat = cmsFormatterForColorspaceOfProfile(hProfile, 2, FALSE);\n    nChannels   = T_CHANNELS(InputFormat);\n\n\n    cmsDetectBlackPoint(&BlackPointAdaptedToD50, hProfile, Intent, 0);\n\n    // Adjust output to Lab4\n    hLab = cmsCreateLab4ProfileTHR(m ->ContextID, NULL);\n\n    Profiles[0] = hProfile;\n    Profiles[1] = hLab;\n\n    xform = cmsCreateMultiprofileTransform(Profiles, 2,  InputFormat, TYPE_Lab_DBL, Intent, 0);\n    cmsCloseProfile(hLab);\n\n    if (xform == NULL) {\n\n        cmsSignalError(m ->ContextID, cmsERROR_COLORSPACE_CHECK, \"Cannot create transform Profile -> Lab\");\n        return 0;\n    }\n\n    // Only 1, 3 and 4 channels are allowed\n\n    switch (nChannels) {\n\n    case 1: {\n            cmsToneCurve* Gray2Y = ExtractGray2Y(m ->ContextID, hProfile, Intent);\n            EmitCIEBasedA(m, Gray2Y, &BlackPointAdaptedToD50);\n            cmsFreeToneCurve(Gray2Y);\n            }\n            break;\n\n    case 3:\n    case 4: {\n            cmsUInt32Number OutFrm = TYPE_Lab_16;\n            cmsPipeline* DeviceLink;\n            _cmsTRANSFORM* v = (_cmsTRANSFORM*) xform;\n\n            DeviceLink = cmsPipelineDup(v ->Lut);\n            if (DeviceLink == NULL) return 0;\n\n            dwFlags |= cmsFLAGS_FORCE_CLUT;\n            _cmsOptimizePipeline(m->ContextID, &DeviceLink, Intent, &InputFormat, &OutFrm, &dwFlags);\n\n            rc = EmitCIEBasedDEF(m, DeviceLink, Intent, &BlackPointAdaptedToD50);\n            cmsPipelineFree(DeviceLink);\n            if (rc == 0) return 0;\n            }\n            break;\n\n    default:\n\n        cmsSignalError(m ->ContextID, cmsERROR_COLORSPACE_CHECK, \"Only 3, 4 channels supported for CSA. This profile has %d channels.\", nChannels);\n        return 0;\n    }\n\n\n    cmsDeleteTransform(xform);\n\n    return 1;\n}\n\nstatic\ncmsFloat64Number* GetPtrToMatrix(const cmsStage* mpe)\n{\n    _cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data;\n\n    return Data -> Double;\n}\n\n\n// Does create CSA based on matrix-shaper. Allowed types are gray and RGB based\n\nstatic\nint WriteInputMatrixShaper(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsStage* Matrix, cmsStage* Shaper)\n{\n    cmsColorSpaceSignature ColorSpace;\n    int rc;\n    cmsCIEXYZ BlackPointAdaptedToD50;\n\n    ColorSpace = cmsGetColorSpace(hProfile);\n\n    cmsDetectBlackPoint(&BlackPointAdaptedToD50, hProfile, INTENT_RELATIVE_COLORIMETRIC, 0);\n\n    if (ColorSpace == cmsSigGrayData) {\n\n        cmsToneCurve** ShaperCurve = _cmsStageGetPtrToCurveSet(Shaper);\n        rc = EmitCIEBasedA(m, ShaperCurve[0], &BlackPointAdaptedToD50);\n\n    }\n    else\n        if (ColorSpace == cmsSigRgbData) {\n\n            cmsMAT3 Mat;\n            int i, j;\n\n            memmove(&Mat, GetPtrToMatrix(Matrix), sizeof(Mat));\n\n            for (i=0; i < 3; i++)\n                for (j=0; j < 3; j++)\n                    Mat.v[i].n[j] *= MAX_ENCODEABLE_XYZ;\n\n            rc = EmitCIEBasedABC(m,  (cmsFloat64Number *) &Mat,\n                                _cmsStageGetPtrToCurveSet(Shaper),\n                                 &BlackPointAdaptedToD50);\n        }\n        else  {\n\n            cmsSignalError(m ->ContextID, cmsERROR_COLORSPACE_CHECK, \"Profile is not suitable for CSA. Unsupported colorspace.\");\n            return 0;\n        }\n\n        return rc;\n}\n\n\n\n// Creates a PostScript color list from a named profile data.\n// This is a HP extension, and it works in Lab instead of XYZ\n\nstatic\nint WriteNamedColorCSA(cmsIOHANDLER* m, cmsHPROFILE hNamedColor, int Intent)\n{\n    cmsHTRANSFORM xform;\n    cmsHPROFILE   hLab;\n    int i, nColors;\n    char ColorName[32];\n    cmsNAMEDCOLORLIST* NamedColorList;\n\n    hLab  = cmsCreateLab4ProfileTHR(m ->ContextID, NULL);\n    xform = cmsCreateTransform(hNamedColor, TYPE_NAMED_COLOR_INDEX, hLab, TYPE_Lab_DBL, Intent, 0);\n    if (xform == NULL) return 0;\n\n    NamedColorList = cmsGetNamedColorList(xform);\n    if (NamedColorList == NULL) return 0;\n\n    _cmsIOPrintf(m, \"<<\\n\");\n    _cmsIOPrintf(m, \"(colorlistcomment) (%s)\\n\", \"Named color CSA\");\n    _cmsIOPrintf(m, \"(Prefix) [ (Pantone ) (PANTONE ) ]\\n\");\n    _cmsIOPrintf(m, \"(Suffix) [ ( CV) ( CVC) ( C) ]\\n\");\n\n    nColors   = cmsNamedColorCount(NamedColorList);\n\n\n    for (i=0; i < nColors; i++) {\n\n        cmsUInt16Number In[1];\n        cmsCIELab Lab;\n\n        In[0] = (cmsUInt16Number) i;\n\n        if (!cmsNamedColorInfo(NamedColorList, i, ColorName, NULL, NULL, NULL, NULL))\n                continue;\n\n        cmsDoTransform(xform, In, &Lab, 1);\n        _cmsIOPrintf(m, \"  (%s) [ %.3f %.3f %.3f ]\\n\", ColorName, Lab.L, Lab.a, Lab.b);\n    }\n\n\n\n    _cmsIOPrintf(m, \">>\\n\");\n\n    cmsDeleteTransform(xform);\n    cmsCloseProfile(hLab);\n    return 1;\n}\n\n\n// Does create a Color Space Array on XYZ colorspace for PostScript usage\nstatic\ncmsUInt32Number GenerateCSA(cmsContext ContextID,\n                            cmsHPROFILE hProfile,\n                            cmsUInt32Number Intent,\n                            cmsUInt32Number dwFlags,\n                            cmsIOHANDLER* mem)\n{\n    cmsUInt32Number dwBytesUsed;\n    cmsPipeline* lut = NULL;\n    cmsStage* Matrix, *Shaper;\n\n\n    // Is a named color profile?\n    if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) {\n\n        if (!WriteNamedColorCSA(mem, hProfile, Intent)) goto Error;\n    }\n    else {\n\n\n        // Any profile class are allowed (including devicelink), but\n        // output (PCS) colorspace must be XYZ or Lab\n        cmsColorSpaceSignature ColorSpace = cmsGetPCS(hProfile);\n\n        if (ColorSpace != cmsSigXYZData &&\n            ColorSpace != cmsSigLabData) {\n\n                cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, \"Invalid output color space\");\n                goto Error;\n        }\n\n\n        // Read the lut with all necessary conversion stages\n        lut = _cmsReadInputLUT(hProfile, Intent);\n        if (lut == NULL) goto Error;\n\n\n        // Tone curves + matrix can be implemented without any LUT\n        if (cmsPipelineCheckAndRetreiveStages(lut, 2, cmsSigCurveSetElemType, cmsSigMatrixElemType, &Shaper, &Matrix)) {\n\n            if (!WriteInputMatrixShaper(mem, hProfile, Matrix, Shaper)) goto Error;\n\n        }\n        else {\n           // We need a LUT for the rest\n           if (!WriteInputLUT(mem, hProfile, Intent, dwFlags)) goto Error;\n        }\n    }\n\n\n    // Done, keep memory usage\n    dwBytesUsed = mem ->UsedSpace;\n\n    // Get rid of LUT\n    if (lut != NULL) cmsPipelineFree(lut);\n\n    // Finally, return used byte count\n    return dwBytesUsed;\n\nError:\n    if (lut != NULL) cmsPipelineFree(lut);\n    return 0;\n}\n\n// ------------------------------------------------------ Color Rendering Dictionary (CRD)\n\n\n\n/*\n\n  Black point compensation plus chromatic adaptation:\n\n  Step 1 - Chromatic adaptation\n  =============================\n\n          WPout\n    X = ------- PQR\n          Wpin\n\n  Step 2 - Black point compensation\n  =================================\n\n          (WPout - BPout)*X - WPout*(BPin - BPout)\n    out = ---------------------------------------\n                        WPout - BPin\n\n\n  Algorithm discussion\n  ====================\n\n  TransformPQR(WPin, BPin, WPout, BPout, PQR)\n\n  Wpin,etc= { Xws Yws Zws Pws Qws Rws }\n\n\n  Algorithm             Stack 0...n\n  ===========================================================\n                        PQR BPout WPout BPin WPin\n  4 index 3 get         WPin PQR BPout WPout BPin WPin\n  div                   (PQR/WPin) BPout WPout BPin WPin\n  2 index 3 get         WPout (PQR/WPin) BPout WPout BPin WPin\n  mult                  WPout*(PQR/WPin) BPout WPout BPin WPin\n\n  2 index 3 get         WPout WPout*(PQR/WPin) BPout WPout BPin WPin\n  2 index 3 get         BPout WPout WPout*(PQR/WPin) BPout WPout BPin WPin\n  sub                   (WPout-BPout) WPout*(PQR/WPin) BPout WPout BPin WPin\n  mult                  (WPout-BPout)* WPout*(PQR/WPin) BPout WPout BPin WPin\n\n  2 index 3 get         WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin\n  4 index 3 get         BPin WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin\n  3 index 3 get         BPout BPin WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin\n\n  sub                   (BPin-BPout) WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin\n  mult                  (BPin-BPout)*WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin\n  sub                   (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin\n\n  3 index 3 get         BPin (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin\n  3 index 3 get         WPout BPin (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin\n  exch\n  sub                   (WPout-BPin) (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin\n  div\n\n  exch pop\n  exch pop\n  exch pop\n  exch pop\n\n*/\n\n\nstatic\nvoid EmitPQRStage(cmsIOHANDLER* m, cmsHPROFILE hProfile, int DoBPC, int lIsAbsolute)\n{\n\n\n        if (lIsAbsolute) {\n\n            // For absolute colorimetric intent, encode back to relative\n            // and generate a relative Pipeline\n\n            // Relative encoding is obtained across XYZpcs*(D50/WhitePoint)\n\n            cmsCIEXYZ White;\n\n            _cmsReadMediaWhitePoint(&White, hProfile);\n\n            _cmsIOPrintf(m,\"/MatrixPQR [1 0 0 0 1 0 0 0 1 ]\\n\");\n            _cmsIOPrintf(m,\"/RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]\\n\");\n\n            _cmsIOPrintf(m, \"%% Absolute colorimetric -- encode to relative to maximize LUT usage\\n\"\n                      \"/TransformPQR [\\n\"\n                      \"{0.9642 mul %g div exch pop exch pop exch pop exch pop} bind\\n\"\n                      \"{1.0000 mul %g div exch pop exch pop exch pop exch pop} bind\\n\"\n                      \"{0.8249 mul %g div exch pop exch pop exch pop exch pop} bind\\n]\\n\",\n                      White.X, White.Y, White.Z);\n            return;\n        }\n\n\n        _cmsIOPrintf(m,\"%% Bradford Cone Space\\n\"\n                 \"/MatrixPQR [0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296 ] \\n\");\n\n        _cmsIOPrintf(m, \"/RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]\\n\");\n\n\n        // No BPC\n\n        if (!DoBPC) {\n\n            _cmsIOPrintf(m, \"%% VonKries-like transform in Bradford Cone Space\\n\"\n                      \"/TransformPQR [\\n\"\n                      \"{exch pop exch 3 get mul exch pop exch 3 get div} bind\\n\"\n                      \"{exch pop exch 4 get mul exch pop exch 4 get div} bind\\n\"\n                      \"{exch pop exch 5 get mul exch pop exch 5 get div} bind\\n]\\n\");\n        } else {\n\n            // BPC\n\n            _cmsIOPrintf(m, \"%% VonKries-like transform in Bradford Cone Space plus BPC\\n\"\n                      \"/TransformPQR [\\n\");\n\n            _cmsIOPrintf(m, \"{4 index 3 get div 2 index 3 get mul \"\n                    \"2 index 3 get 2 index 3 get sub mul \"\n                    \"2 index 3 get 4 index 3 get 3 index 3 get sub mul sub \"\n                    \"3 index 3 get 3 index 3 get exch sub div \"\n                    \"exch pop exch pop exch pop exch pop } bind\\n\");\n\n            _cmsIOPrintf(m, \"{4 index 4 get div 2 index 4 get mul \"\n                    \"2 index 4 get 2 index 4 get sub mul \"\n                    \"2 index 4 get 4 index 4 get 3 index 4 get sub mul sub \"\n                    \"3 index 4 get 3 index 4 get exch sub div \"\n                    \"exch pop exch pop exch pop exch pop } bind\\n\");\n\n            _cmsIOPrintf(m, \"{4 index 5 get div 2 index 5 get mul \"\n                    \"2 index 5 get 2 index 5 get sub mul \"\n                    \"2 index 5 get 4 index 5 get 3 index 5 get sub mul sub \"\n                    \"3 index 5 get 3 index 5 get exch sub div \"\n                    \"exch pop exch pop exch pop exch pop } bind\\n]\\n\");\n\n        }\n\n\n}\n\n\nstatic\nvoid EmitXYZ2Lab(cmsIOHANDLER* m)\n{\n    _cmsIOPrintf(m, \"/RangeLMN [ -0.635 2.0 0 2 -0.635 2.0 ]\\n\");\n    _cmsIOPrintf(m, \"/EncodeLMN [\\n\");\n    _cmsIOPrintf(m, \"{ 0.964200  div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\\n\");\n    _cmsIOPrintf(m, \"{ 1.000000  div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\\n\");\n    _cmsIOPrintf(m, \"{ 0.824900  div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\\n\");\n    _cmsIOPrintf(m, \"]\\n\");\n    _cmsIOPrintf(m, \"/MatrixABC [ 0 1 0 1 -1 1 0 0 -1 ]\\n\");\n    _cmsIOPrintf(m, \"/EncodeABC [\\n\");\n\n\n    _cmsIOPrintf(m, \"{ 116 mul  16 sub 100 div  } bind\\n\");\n    _cmsIOPrintf(m, \"{ 500 mul 128 add 256 div  } bind\\n\");\n    _cmsIOPrintf(m, \"{ 200 mul 128 add 256 div  } bind\\n\");\n\n\n    _cmsIOPrintf(m, \"]\\n\");\n\n\n}\n\n// Due to impedance mismatch between XYZ and almost all RGB and CMYK spaces\n// I choose to dump LUTS in Lab instead of XYZ. There is still a lot of wasted\n// space on 3D CLUT, but since space seems not to be a problem here, 33 points\n// would give a reasonable accurancy. Note also that CRD tables must operate in\n// 8 bits.\n\nstatic\nint WriteOutputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, int Intent, cmsUInt32Number dwFlags)\n{\n    cmsHPROFILE hLab;\n    cmsHTRANSFORM xform;\n    int i, nChannels;\n    cmsUInt32Number OutputFormat;\n    _cmsTRANSFORM* v;\n    cmsPipeline* DeviceLink;\n    cmsHPROFILE Profiles[3];\n    cmsCIEXYZ BlackPointAdaptedToD50;\n    cmsBool lDoBPC = (dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION);\n    cmsBool lFixWhite = !(dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP);\n    cmsUInt32Number InFrm = TYPE_Lab_16;\n    int RelativeEncodingIntent;\n    cmsColorSpaceSignature ColorSpace;\n\n\n    hLab = cmsCreateLab4ProfileTHR(m ->ContextID, NULL);\n    if (hLab == NULL) return 0;\n\n    OutputFormat = cmsFormatterForColorspaceOfProfile(hProfile, 2, FALSE);\n    nChannels    = T_CHANNELS(OutputFormat);\n\n    ColorSpace = cmsGetColorSpace(hProfile);\n\n    // For absolute colorimetric, the LUT is encoded as relative in order to preserve precision.\n\n    RelativeEncodingIntent = Intent;\n    if (RelativeEncodingIntent == INTENT_ABSOLUTE_COLORIMETRIC)\n        RelativeEncodingIntent = INTENT_RELATIVE_COLORIMETRIC;\n\n\n    // Use V4 Lab always\n    Profiles[0] = hLab;\n    Profiles[1] = hProfile;\n\n    xform = cmsCreateMultiprofileTransformTHR(m ->ContextID,\n                                              Profiles, 2, TYPE_Lab_DBL,\n                                              OutputFormat, RelativeEncodingIntent, 0);\n    cmsCloseProfile(hLab);\n\n    if (xform == NULL) {\n\n        cmsSignalError(m ->ContextID, cmsERROR_COLORSPACE_CHECK, \"Cannot create transform Lab -> Profile in CRD creation\");\n        return 0;\n    }\n\n    // Get a copy of the internal devicelink\n    v = (_cmsTRANSFORM*) xform;\n    DeviceLink = cmsPipelineDup(v ->Lut);\n    if (DeviceLink == NULL) return 0;\n\n\n    // We need a CLUT\n    dwFlags |= cmsFLAGS_FORCE_CLUT;\n    _cmsOptimizePipeline(m->ContextID, &DeviceLink, RelativeEncodingIntent, &InFrm, &OutputFormat, &dwFlags);\n\n    _cmsIOPrintf(m, \"<<\\n\");\n    _cmsIOPrintf(m, \"/ColorRenderingType 1\\n\");\n\n\n    cmsDetectBlackPoint(&BlackPointAdaptedToD50, hProfile, Intent, 0);\n\n    // Emit headers, etc.\n    EmitWhiteBlackD50(m, &BlackPointAdaptedToD50);\n    EmitPQRStage(m, hProfile, lDoBPC, Intent == INTENT_ABSOLUTE_COLORIMETRIC);\n    EmitXYZ2Lab(m);\n\n\n    // FIXUP: map Lab (100, 0, 0) to perfect white, because the particular encoding for Lab\n    // does map a=b=0 not falling into any specific node. Since range a,b goes -128..127,\n    // zero is slightly moved towards right, so assure next node (in L=100 slice) is mapped to\n    // zero. This would sacrifice a bit of highlights, but failure to do so would cause\n    // scum dot. Ouch.\n\n    if (Intent == INTENT_ABSOLUTE_COLORIMETRIC)\n            lFixWhite = FALSE;\n\n    _cmsIOPrintf(m, \"/RenderTable \");\n\n\n    WriteCLUT(m, cmsPipelineGetPtrToFirstStage(DeviceLink), \"<\", \">\\n\", \"\", \"\", lFixWhite, ColorSpace);\n\n    _cmsIOPrintf(m, \" %d {} bind \", nChannels);\n\n    for (i=1; i < nChannels; i++)\n            _cmsIOPrintf(m, \"dup \");\n\n    _cmsIOPrintf(m, \"]\\n\");\n\n\n    EmitIntent(m, Intent);\n\n    _cmsIOPrintf(m, \">>\\n\");\n\n    if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) {\n\n        _cmsIOPrintf(m, \"/Current exch /ColorRendering defineresource pop\\n\");\n    }\n\n    cmsPipelineFree(DeviceLink);\n    cmsDeleteTransform(xform);\n\n    return 1;\n}\n\n\n// Builds a ASCII string containing colorant list in 0..1.0 range\nstatic\nvoid BuildColorantList(char *Colorant, int nColorant, cmsUInt16Number Out[])\n{\n    char Buff[32];\n    int j;\n\n    Colorant[0] = 0;\n    if (nColorant > cmsMAXCHANNELS)\n        nColorant = cmsMAXCHANNELS;\n\n    for (j=0; j < nColorant; j++) {\n\n                sprintf(Buff, \"%.3f\", Out[j] / 65535.0);\n                strcat(Colorant, Buff);\n                if (j < nColorant -1)\n                        strcat(Colorant, \" \");\n\n        }\n}\n\n\n// Creates a PostScript color list from a named profile data.\n// This is a HP extension.\n\nstatic\nint WriteNamedColorCRD(cmsIOHANDLER* m, cmsHPROFILE hNamedColor, int Intent, cmsUInt32Number dwFlags)\n{\n    cmsHTRANSFORM xform;\n    int i, nColors, nColorant;\n    cmsUInt32Number OutputFormat;\n    char ColorName[32];\n    char Colorant[128];\n    cmsNAMEDCOLORLIST* NamedColorList;\n\n\n    OutputFormat = cmsFormatterForColorspaceOfProfile(hNamedColor, 2, FALSE);\n    nColorant    = T_CHANNELS(OutputFormat);\n\n\n    xform = cmsCreateTransform(hNamedColor, TYPE_NAMED_COLOR_INDEX, NULL, OutputFormat, Intent, dwFlags);\n    if (xform == NULL) return 0;\n\n\n    NamedColorList = cmsGetNamedColorList(xform);\n    if (NamedColorList == NULL) return 0;\n\n    _cmsIOPrintf(m, \"<<\\n\");\n    _cmsIOPrintf(m, \"(colorlistcomment) (%s) \\n\", \"Named profile\");\n    _cmsIOPrintf(m, \"(Prefix) [ (Pantone ) (PANTONE ) ]\\n\");\n    _cmsIOPrintf(m, \"(Suffix) [ ( CV) ( CVC) ( C) ]\\n\");\n\n    nColors   = cmsNamedColorCount(NamedColorList);\n\n    for (i=0; i < nColors; i++) {\n\n        cmsUInt16Number In[1];\n        cmsUInt16Number Out[cmsMAXCHANNELS];\n\n        In[0] = (cmsUInt16Number) i;\n\n        if (!cmsNamedColorInfo(NamedColorList, i, ColorName, NULL, NULL, NULL, NULL))\n                continue;\n\n        cmsDoTransform(xform, In, Out, 1);\n        BuildColorantList(Colorant, nColorant, Out);\n        _cmsIOPrintf(m, \"  (%s) [ %s ]\\n\", ColorName, Colorant);\n    }\n\n    _cmsIOPrintf(m, \"   >>\");\n\n    if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) {\n\n    _cmsIOPrintf(m, \" /Current exch /HPSpotTable defineresource pop\\n\");\n    }\n\n    cmsDeleteTransform(xform);\n    return 1;\n}\n\n\n\n// This one does create a Color Rendering Dictionary.\n// CRD are always LUT-Based, no matter if profile is\n// implemented as matrix-shaper.\n\nstatic\ncmsUInt32Number  GenerateCRD(cmsContext ContextID,\n                             cmsHPROFILE hProfile,\n                             cmsUInt32Number Intent, cmsUInt32Number dwFlags,\n                             cmsIOHANDLER* mem)\n{\n    cmsUInt32Number dwBytesUsed;\n\n    if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) {\n\n        EmitHeader(mem, \"Color Rendering Dictionary (CRD)\", hProfile);\n    }\n\n\n    // Is a named color profile?\n    if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) {\n\n        if (!WriteNamedColorCRD(mem, hProfile, Intent, dwFlags)) {\n            return 0;\n        }\n    }\n    else {\n\n        // CRD are always implemented as LUT\n\n        if (!WriteOutputLUT(mem, hProfile, Intent, dwFlags)) {\n            return 0;\n        }\n    }\n\n    if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) {\n\n        _cmsIOPrintf(mem, \"%%%%EndResource\\n\");\n        _cmsIOPrintf(mem, \"\\n%% CRD End\\n\");\n    }\n\n    // Done, keep memory usage\n    dwBytesUsed = mem ->UsedSpace;\n\n    // Finally, return used byte count\n    return dwBytesUsed;\n\n    cmsUNUSED_PARAMETER(ContextID);\n}\n\n\n\n\ncmsUInt32Number CMSEXPORT cmsGetPostScriptColorResource(cmsContext ContextID,\n                                                               cmsPSResourceType Type,\n                                                               cmsHPROFILE hProfile,\n                                                               cmsUInt32Number Intent,\n                                                               cmsUInt32Number dwFlags,\n                                                               cmsIOHANDLER* io)\n{\n    cmsUInt32Number  rc;\n\n\n    switch (Type) {\n\n        case cmsPS_RESOURCE_CSA:\n            rc = GenerateCSA(ContextID, hProfile, Intent, dwFlags, io);\n            break;\n\n        default:\n        case cmsPS_RESOURCE_CRD:\n            rc = GenerateCRD(ContextID, hProfile, Intent, dwFlags, io);\n            break;\n    }\n\n    return rc;\n}\n\n\n\ncmsUInt32Number CMSEXPORT cmsGetPostScriptCRD(cmsContext ContextID,\n                              cmsHPROFILE hProfile,\n                              cmsUInt32Number Intent, cmsUInt32Number dwFlags,\n                              void* Buffer, cmsUInt32Number dwBufferLen)\n{\n    cmsIOHANDLER* mem;\n    cmsUInt32Number dwBytesUsed;\n\n    // Set up the serialization engine\n    if (Buffer == NULL)\n        mem = cmsOpenIOhandlerFromNULL(ContextID);\n    else\n        mem = cmsOpenIOhandlerFromMem(ContextID, Buffer, dwBufferLen, \"w\");\n\n    if (!mem) return 0;\n\n    dwBytesUsed =  cmsGetPostScriptColorResource(ContextID, cmsPS_RESOURCE_CRD, hProfile, Intent, dwFlags, mem);\n\n    // Get rid of memory stream\n    cmsCloseIOhandler(mem);\n\n    return dwBytesUsed;\n}\n\n\n\n// Does create a Color Space Array on XYZ colorspace for PostScript usage\ncmsUInt32Number CMSEXPORT cmsGetPostScriptCSA(cmsContext ContextID,\n                                              cmsHPROFILE hProfile,\n                                              cmsUInt32Number Intent,\n                                              cmsUInt32Number dwFlags,\n                                              void* Buffer,\n                                              cmsUInt32Number dwBufferLen)\n{\n    cmsIOHANDLER* mem;\n    cmsUInt32Number dwBytesUsed;\n\n    if (Buffer == NULL)\n        mem = cmsOpenIOhandlerFromNULL(ContextID);\n    else\n        mem = cmsOpenIOhandlerFromMem(ContextID, Buffer, dwBufferLen, \"w\");\n\n    if (!mem) return 0;\n\n    dwBytesUsed =  cmsGetPostScriptColorResource(ContextID, cmsPS_RESOURCE_CSA, hProfile, Intent, dwFlags, mem);\n\n    // Get rid of memory stream\n    cmsCloseIOhandler(mem);\n\n    return dwBytesUsed;\n\n}\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/src/cmssamp.c",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2010 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n//\n\n#include \"lcms2_internal.h\"\n\n\n#define cmsmin(a, b) (((a) < (b)) ? (a) : (b))\n#define cmsmax(a, b) (((a) > (b)) ? (a) : (b))\n\n// This file contains routines for resampling and LUT optimization, black point detection\n// and black preservation.\n\n// Black point detection -------------------------------------------------------------------------\n\n\n// PCS -> PCS round trip transform, always uses relative intent on the device -> pcs\nstatic\ncmsHTRANSFORM CreateRoundtripXForm(cmsHPROFILE hProfile, cmsUInt32Number nIntent)\n{\n    cmsContext ContextID = cmsGetProfileContextID(hProfile);\n    cmsHPROFILE hLab = cmsCreateLab4ProfileTHR(ContextID, NULL);\n    cmsHTRANSFORM xform;\n    cmsBool BPC[4] = { FALSE, FALSE, FALSE, FALSE };\n    cmsFloat64Number States[4] = { 1.0, 1.0, 1.0, 1.0 };\n    cmsHPROFILE hProfiles[4];\n    cmsUInt32Number Intents[4];\n\n    hProfiles[0] = hLab; hProfiles[1] = hProfile; hProfiles[2] = hProfile; hProfiles[3] = hLab;\n    Intents[0]   = INTENT_RELATIVE_COLORIMETRIC; Intents[1] = nIntent; Intents[2] = INTENT_RELATIVE_COLORIMETRIC; Intents[3] = INTENT_RELATIVE_COLORIMETRIC;\n\n    xform =  cmsCreateExtendedTransform(ContextID, 4, hProfiles, BPC, Intents,\n        States, NULL, 0, TYPE_Lab_DBL, TYPE_Lab_DBL, cmsFLAGS_NOCACHE|cmsFLAGS_NOOPTIMIZE);\n\n    cmsCloseProfile(hLab);\n    return xform;\n}\n\n// Use darker colorants to obtain black point. This works in the relative colorimetric intent and\n// assumes more ink results in darker colors. No ink limit is assumed.\nstatic\ncmsBool  BlackPointAsDarkerColorant(cmsHPROFILE    hInput,\n                                    cmsUInt32Number Intent,\n                                    cmsCIEXYZ* BlackPoint,\n                                    cmsUInt32Number dwFlags)\n{\n    cmsUInt16Number *Black;\n    cmsHTRANSFORM xform;\n    cmsColorSpaceSignature Space;\n    cmsUInt32Number nChannels;\n    cmsUInt32Number dwFormat;\n    cmsHPROFILE hLab;\n    cmsCIELab  Lab;\n    cmsCIEXYZ  BlackXYZ;\n    cmsContext ContextID = cmsGetProfileContextID(hInput);\n\n    // If the profile does not support input direction, assume Black point 0\n    if (!cmsIsIntentSupported(hInput, Intent, LCMS_USED_AS_INPUT)) {\n\n        BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;\n        return FALSE;\n    }\n\n    // Create a formatter which has n channels and floating point\n    dwFormat = cmsFormatterForColorspaceOfProfile(hInput, 2, FALSE);\n\n   // Try to get black by using black colorant\n    Space = cmsGetColorSpace(hInput);\n\n    // This function returns darker colorant in 16 bits for several spaces\n    if (!_cmsEndPointsBySpace(Space, NULL, &Black, &nChannels)) {\n\n        BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;\n        return FALSE;\n    }\n\n    if (nChannels != T_CHANNELS(dwFormat)) {\n       BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;\n       return FALSE;\n    }\n\n    // Lab will be used as the output space, but lab2 will avoid recursion\n    hLab = cmsCreateLab2ProfileTHR(ContextID, NULL);\n    if (hLab == NULL) {\n       BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;\n       return FALSE;\n    }\n\n    // Create the transform\n    xform = cmsCreateTransformTHR(ContextID, hInput, dwFormat,\n                                hLab, TYPE_Lab_DBL, Intent, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_NOCACHE);\n    cmsCloseProfile(hLab);\n\n    if (xform == NULL) {\n\n        // Something went wrong. Get rid of open resources and return zero as black\n        BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;\n        return FALSE;\n    }\n\n    // Convert black to Lab\n    cmsDoTransform(xform, Black, &Lab, 1);\n\n    // Force it to be neutral, clip to max. L* of 50\n    Lab.a = Lab.b = 0;\n    if (Lab.L > 50) Lab.L = 50;\n\n    // Free the resources\n    cmsDeleteTransform(xform);\n\n    // Convert from Lab (which is now clipped) to XYZ.\n    cmsLab2XYZ(NULL, &BlackXYZ, &Lab);\n\n    if (BlackPoint != NULL)\n        *BlackPoint = BlackXYZ;\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(dwFlags);\n}\n\n// Get a black point of output CMYK profile, discounting any ink-limiting embedded\n// in the profile. For doing that, we use perceptual intent in input direction:\n// Lab (0, 0, 0) -> [Perceptual] Profile -> CMYK -> [Rel. colorimetric] Profile -> Lab\nstatic\ncmsBool BlackPointUsingPerceptualBlack(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile)\n{\n    cmsHTRANSFORM hRoundTrip;\n    cmsCIELab LabIn, LabOut;\n    cmsCIEXYZ  BlackXYZ;\n\n     // Is the intent supported by the profile?\n    if (!cmsIsIntentSupported(hProfile, INTENT_PERCEPTUAL, LCMS_USED_AS_INPUT)) {\n\n        BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;\n        return TRUE;\n    }\n\n    hRoundTrip = CreateRoundtripXForm(hProfile, INTENT_PERCEPTUAL);\n    if (hRoundTrip == NULL) {\n        BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;\n        return FALSE;\n    }\n\n    LabIn.L = LabIn.a = LabIn.b = 0;\n    cmsDoTransform(hRoundTrip, &LabIn, &LabOut, 1);\n\n    // Clip Lab to reasonable limits\n    if (LabOut.L > 50) LabOut.L = 50;\n    LabOut.a = LabOut.b = 0;\n\n    cmsDeleteTransform(hRoundTrip);\n\n    // Convert it to XYZ\n    cmsLab2XYZ(NULL, &BlackXYZ, &LabOut);\n\n    if (BlackPoint != NULL)\n        *BlackPoint = BlackXYZ;\n\n    return TRUE;\n}\n\n// This function shouldn't exist at all -- there is such quantity of broken\n// profiles on black point tag, that we must somehow fix chromaticity to\n// avoid huge tint when doing Black point compensation. This function does\n// just that. There is a special flag for using black point tag, but turned\n// off by default because it is bogus on most profiles. The detection algorithm\n// involves to turn BP to neutral and to use only L component.\ncmsBool CMSEXPORT cmsDetectBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags)\n{\n    cmsProfileClassSignature devClass;\n\n    // Make sure the device class is adequate\n    devClass = cmsGetDeviceClass(hProfile);\n    if (devClass == cmsSigLinkClass ||\n        devClass == cmsSigAbstractClass ||\n        devClass == cmsSigNamedColorClass) {\n            BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;\n            return FALSE;\n    }\n\n    // Make sure intent is adequate\n    if (Intent != INTENT_PERCEPTUAL &&\n        Intent != INTENT_RELATIVE_COLORIMETRIC &&\n        Intent != INTENT_SATURATION) {\n            BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;\n            return FALSE;\n    }\n\n    // v4 + perceptual & saturation intents does have its own black point, and it is\n    // well specified enough to use it. Black point tag is deprecated in V4.\n    if ((cmsGetEncodedICCversion(hProfile) >= 0x4000000) &&\n        (Intent == INTENT_PERCEPTUAL || Intent == INTENT_SATURATION)) {\n\n            // Matrix shaper share MRC & perceptual intents\n            if (cmsIsMatrixShaper(hProfile))\n                return BlackPointAsDarkerColorant(hProfile, INTENT_RELATIVE_COLORIMETRIC, BlackPoint, 0);\n\n            // Get Perceptual black out of v4 profiles. That is fixed for perceptual & saturation intents\n            BlackPoint -> X = cmsPERCEPTUAL_BLACK_X;\n            BlackPoint -> Y = cmsPERCEPTUAL_BLACK_Y;\n            BlackPoint -> Z = cmsPERCEPTUAL_BLACK_Z;\n\n            return TRUE;\n    }\n\n\n#ifdef CMS_USE_PROFILE_BLACK_POINT_TAG\n\n    // v2, v4 rel/abs colorimetric\n    if (cmsIsTag(hProfile, cmsSigMediaBlackPointTag) &&\n        Intent == INTENT_RELATIVE_COLORIMETRIC) {\n\n            cmsCIEXYZ *BlackPtr, BlackXYZ, UntrustedBlackPoint, TrustedBlackPoint, MediaWhite;\n            cmsCIELab Lab;\n\n            // If black point is specified, then use it,\n\n            BlackPtr = cmsReadTag(hProfile, cmsSigMediaBlackPointTag);\n            if (BlackPtr != NULL) {\n\n                BlackXYZ = *BlackPtr;\n                _cmsReadMediaWhitePoint(&MediaWhite, hProfile);\n\n                // Black point is absolute XYZ, so adapt to D50 to get PCS value\n                cmsAdaptToIlluminant(&UntrustedBlackPoint, &MediaWhite, cmsD50_XYZ(), &BlackXYZ);\n\n                // Force a=b=0 to get rid of any chroma\n                cmsXYZ2Lab(NULL, &Lab, &UntrustedBlackPoint);\n                Lab.a = Lab.b = 0;\n                if (Lab.L > 50) Lab.L = 50; // Clip to L* <= 50\n                cmsLab2XYZ(NULL, &TrustedBlackPoint, &Lab);\n\n                if (BlackPoint != NULL)\n                    *BlackPoint = TrustedBlackPoint;\n\n                return TRUE;\n            }\n    }\n#endif\n\n    // That is about v2 profiles.\n\n    // If output profile, discount ink-limiting and that's all\n    if (Intent == INTENT_RELATIVE_COLORIMETRIC &&\n        (cmsGetDeviceClass(hProfile) == cmsSigOutputClass) &&\n        (cmsGetColorSpace(hProfile)  == cmsSigCmykData))\n        return BlackPointUsingPerceptualBlack(BlackPoint, hProfile);\n\n    // Nope, compute BP using current intent.\n    return BlackPointAsDarkerColorant(hProfile, Intent, BlackPoint, dwFlags);\n}\n\n\n\n// ---------------------------------------------------------------------------------------------------------\n\n// Least Squares Fit of a Quadratic Curve to Data\n// http://www.personal.psu.edu/jhm/f90/lectures/lsq2.html\n\nstatic\ncmsFloat64Number RootOfLeastSquaresFitQuadraticCurve(int n, cmsFloat64Number x[], cmsFloat64Number y[])\n{\n    double sum_x = 0, sum_x2 = 0, sum_x3 = 0, sum_x4 = 0;\n    double sum_y = 0, sum_yx = 0, sum_yx2 = 0;\n    double d, a, b, c;\n    int i;\n    cmsMAT3 m;\n    cmsVEC3 v, res;\n\n    if (n < 4) return 0;\n\n    for (i=0; i < n; i++) {\n\n        double xn = x[i];\n        double yn = y[i];\n\n        sum_x  += xn;\n        sum_x2 += xn*xn;\n        sum_x3 += xn*xn*xn;\n        sum_x4 += xn*xn*xn*xn;\n\n        sum_y += yn;\n        sum_yx += yn*xn;\n        sum_yx2 += yn*xn*xn;\n    }\n\n    _cmsVEC3init(&m.v[0], n,      sum_x,  sum_x2);\n    _cmsVEC3init(&m.v[1], sum_x,  sum_x2, sum_x3);\n    _cmsVEC3init(&m.v[2], sum_x2, sum_x3, sum_x4);\n\n    _cmsVEC3init(&v, sum_y, sum_yx, sum_yx2);\n\n    if (!_cmsMAT3solve(&res, &m, &v)) return 0;\n\n      \n    a = res.n[2];\n    b = res.n[1];\n    c = res.n[0];\n\n    if (fabs(a) < 1.0E-10) {\n    \n        return cmsmin(0, cmsmax(50, -c/b ));\n    }\n    else {\n\n         d = b*b - 4.0 * a * c;\n         if (d <= 0) {\n             return 0;\n         }\n         else {\n\n             double rt = (-b + sqrt(d)) / (2.0 * a);\n\n             return cmsmax(0, cmsmin(50, rt));\n         }\n   }\n\n}\n\n/*\nstatic\ncmsBool IsMonotonic(int n, const cmsFloat64Number Table[])\n{\n    int i;\n    cmsFloat64Number last;\n\n    last = Table[n-1];\n\n    for (i = n-2; i >= 0; --i) {\n\n        if (Table[i] > last)\n\n            return FALSE;\n        else\n            last = Table[i];\n\n    }\n\n    return TRUE;\n}\n*/\n\n// Calculates the black point of a destination profile.\n// This algorithm comes from the Adobe paper disclosing its black point compensation method.\ncmsBool CMSEXPORT cmsDetectDestinationBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags)\n{\n    cmsColorSpaceSignature ColorSpace;\n    cmsHTRANSFORM hRoundTrip = NULL;\n    cmsCIELab InitialLab, destLab, Lab;\n    cmsFloat64Number inRamp[256], outRamp[256];\n    cmsFloat64Number MinL, MaxL;\n    cmsBool NearlyStraightMidrange = TRUE;  \n    cmsFloat64Number yRamp[256];\n    cmsFloat64Number x[256], y[256];\n    cmsFloat64Number lo, hi;\n    int n, l;\n    cmsProfileClassSignature devClass;\n\n    // Make sure the device class is adequate\n    devClass = cmsGetDeviceClass(hProfile);\n    if (devClass == cmsSigLinkClass ||\n        devClass == cmsSigAbstractClass ||\n        devClass == cmsSigNamedColorClass) {\n            BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;\n            return FALSE;\n    }\n\n    // Make sure intent is adequate\n    if (Intent != INTENT_PERCEPTUAL &&\n        Intent != INTENT_RELATIVE_COLORIMETRIC &&\n        Intent != INTENT_SATURATION) {\n            BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;\n            return FALSE;\n    }\n\n\n    // v4 + perceptual & saturation intents does have its own black point, and it is\n    // well specified enough to use it. Black point tag is deprecated in V4.\n    if ((cmsGetEncodedICCversion(hProfile) >= 0x4000000) &&\n        (Intent == INTENT_PERCEPTUAL || Intent == INTENT_SATURATION)) {\n\n            // Matrix shaper share MRC & perceptual intents\n            if (cmsIsMatrixShaper(hProfile))\n                return BlackPointAsDarkerColorant(hProfile, INTENT_RELATIVE_COLORIMETRIC, BlackPoint, 0);\n\n            // Get Perceptual black out of v4 profiles. That is fixed for perceptual & saturation intents\n            BlackPoint -> X = cmsPERCEPTUAL_BLACK_X;\n            BlackPoint -> Y = cmsPERCEPTUAL_BLACK_Y;\n            BlackPoint -> Z = cmsPERCEPTUAL_BLACK_Z;\n            return TRUE;\n    }\n\n\n    // Check if the profile is lut based and gray, rgb or cmyk (7.2 in Adobe's document)\n    ColorSpace = cmsGetColorSpace(hProfile);\n    if (!cmsIsCLUT(hProfile, Intent, LCMS_USED_AS_OUTPUT ) ||\n        (ColorSpace != cmsSigGrayData &&\n         ColorSpace != cmsSigRgbData  &&\n         ColorSpace != cmsSigCmykData)) {\n\n        // In this case, handle as input case\n        return cmsDetectBlackPoint(BlackPoint, hProfile, Intent, dwFlags);\n    }\n\n    // It is one of the valid cases!, use Adobe algorithm\n\n    \n    // Set a first guess, that should work on good profiles.\n    if (Intent == INTENT_RELATIVE_COLORIMETRIC) {\n\n        cmsCIEXYZ IniXYZ;\n\n        // calculate initial Lab as source black point\n        if (!cmsDetectBlackPoint(&IniXYZ, hProfile, Intent, dwFlags)) {\n            return FALSE;\n        }\n\n        // convert the XYZ to lab\n        cmsXYZ2Lab(NULL, &InitialLab, &IniXYZ);\n\n    } else {\n\n        // set the initial Lab to zero, that should be the black point for perceptual and saturation\n        InitialLab.L = 0;\n        InitialLab.a = 0;\n        InitialLab.b = 0;\n    }\n\n\n    // Step 2\n    // ======\n\n    // Create a roundtrip. Define a Transform BT for all x in L*a*b*\n    hRoundTrip = CreateRoundtripXForm(hProfile, Intent);\n    if (hRoundTrip == NULL)  return FALSE;\n\n    // Compute ramps\n\n    for (l=0; l < 256; l++) {\n\n        Lab.L = (cmsFloat64Number) (l * 100.0) / 255.0;\n        Lab.a = cmsmin(50, cmsmax(-50, InitialLab.a));\n        Lab.b = cmsmin(50, cmsmax(-50, InitialLab.b));\n\n        cmsDoTransform(hRoundTrip, &Lab, &destLab, 1);\n\n        inRamp[l]  = Lab.L;\n        outRamp[l] = destLab.L;\n    }\n\n    // Make monotonic\n    for (l = 254; l > 0; --l) {\n        outRamp[l] = cmsmin(outRamp[l], outRamp[l+1]);\n    }\n\n    // Check\n    if (! (outRamp[0] < outRamp[255])) {\n\n        cmsDeleteTransform(hRoundTrip);\n        BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;\n        return FALSE;\n    }\n\n\n    // Test for mid range straight (only on relative colorimetric)\n\n    NearlyStraightMidrange = TRUE;\n    MinL = outRamp[0]; MaxL = outRamp[255];\n    if (Intent == INTENT_RELATIVE_COLORIMETRIC) {\n      \n        for (l=0; l < 256; l++) {\n\n            if (! ((inRamp[l] <= MinL + 0.2 * (MaxL - MinL) ) ||   \n                (fabs(inRamp[l] - outRamp[l]) < 4.0 )))\n                NearlyStraightMidrange = FALSE;\n        }\n\n        // If the mid range is straight (as determined above) then the \n        // DestinationBlackPoint shall be the same as initialLab. \n        // Otherwise, the DestinationBlackPoint shall be determined \n        // using curve fitting.\n\n        if (NearlyStraightMidrange) {\n\n            cmsLab2XYZ(NULL, BlackPoint, &InitialLab);\n            cmsDeleteTransform(hRoundTrip);\n            return TRUE;\n        }\n    }\n\n \n    // curve fitting: The round-trip curve normally looks like a nearly constant section at the black point,\n    // with a corner and a nearly straight line to the white point.\n  \n    for (l=0; l < 256; l++) {\n    \n        yRamp[l] = (outRamp[l] - MinL) / (MaxL - MinL);\n    }\n\n    // find the black point using the least squares error quadratic curve fitting\n\n    if (Intent == INTENT_RELATIVE_COLORIMETRIC) {\n        lo = 0.1;\n        hi = 0.5;\n    }\n    else {\n\n        // Perceptual and saturation\n        lo = 0.03;\n        hi = 0.25;\n    }\n\n    // Capture shadow points for the fitting.\n    n = 0;\n    for (l=0; l < 256; l++) {\n    \n        cmsFloat64Number ff = yRamp[l];\n\n        if (ff >= lo && ff < hi) {\n            x[n] = inRamp[l];\n            y[n] = yRamp[l];\n            n++;\n        }    \n    }\n\n    \n    // No suitable points\n    if (n < 3 ) {\n        cmsDeleteTransform(hRoundTrip);\n        BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;\n        return FALSE;\n    }\n\n  \n    // fit and get the vertex of quadratic curve\n    Lab.L = RootOfLeastSquaresFitQuadraticCurve(n, x, y);\n\n    if (Lab.L < 0.0) { // clip to zero L* if the vertex is negative\n        Lab.L = 0;\n    }\n\n    Lab.a = InitialLab.a;\n    Lab.b = InitialLab.b;\n\n    cmsLab2XYZ(NULL, BlackPoint, &Lab);\n\n    cmsDeleteTransform(hRoundTrip);\n    return TRUE;\n}\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/src/cmssm.c",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2011 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n//\n\n#include \"lcms2_internal.h\"\n\n\n// ------------------------------------------------------------------------\n\n// Gamut boundary description by using Jan Morovic's Segment maxima method\n// Many thanks to Jan for allowing me to use his algorithm.\n\n// r = C*\n// alpha = Hab\n// theta = L*\n\n#define SECTORS 16      // number of divisions in alpha and theta\n\n// Spherical coordinates\ntypedef struct {\n\n    cmsFloat64Number r;\n    cmsFloat64Number alpha;\n    cmsFloat64Number theta;\n\n} cmsSpherical;\n\ntypedef  enum {\n        GP_EMPTY,\n        GP_SPECIFIED,\n        GP_MODELED\n\n    } GDBPointType;\n\n\ntypedef struct {\n\n    GDBPointType Type;\n    cmsSpherical p;         // Keep also alpha & theta of maximum\n\n} cmsGDBPoint;\n\n\ntypedef struct {\n\n    cmsContext ContextID;\n    cmsGDBPoint Gamut[SECTORS][SECTORS];\n\n} cmsGDB;\n\n\n// A line using the parametric form\n// P = a + t*u\ntypedef struct {\n\n    cmsVEC3 a;\n    cmsVEC3 u;\n\n} cmsLine;\n\n\n// A plane using the parametric form\n// Q = b + r*v + s*w\ntypedef struct {\n\n    cmsVEC3 b;\n    cmsVEC3 v;\n    cmsVEC3 w;\n\n} cmsPlane;\n\n\n\n// --------------------------------------------------------------------------------------------\n\n// ATAN2() which always returns degree positive numbers\n\nstatic\ncmsFloat64Number _cmsAtan2(cmsFloat64Number y, cmsFloat64Number x)\n{\n    cmsFloat64Number a;\n\n    // Deal with undefined case\n    if (x == 0.0 && y == 0.0) return 0;\n\n    a = (atan2(y, x) * 180.0) / M_PI;\n\n    while (a < 0) {\n        a += 360;\n    }\n\n    return a;\n}\n\n// Convert to spherical coordinates\nstatic\nvoid ToSpherical(cmsSpherical* sp, const cmsVEC3* v)\n{\n\n    cmsFloat64Number L, a, b;\n\n    L = v ->n[VX];\n    a = v ->n[VY];\n    b = v ->n[VZ];\n\n    sp ->r = sqrt( L*L + a*a + b*b );\n\n   if (sp ->r == 0) {\n        sp ->alpha = sp ->theta = 0;\n        return;\n    }\n\n    sp ->alpha = _cmsAtan2(a, b);\n    sp ->theta = _cmsAtan2(sqrt(a*a + b*b), L);\n}\n\n\n// Convert to cartesian from spherical\nstatic\nvoid ToCartesian(cmsVEC3* v, const cmsSpherical* sp)\n{\n    cmsFloat64Number sin_alpha;\n    cmsFloat64Number cos_alpha;\n    cmsFloat64Number sin_theta;\n    cmsFloat64Number cos_theta;\n    cmsFloat64Number L, a, b;\n\n    sin_alpha = sin((M_PI * sp ->alpha) / 180.0);\n    cos_alpha = cos((M_PI * sp ->alpha) / 180.0);\n    sin_theta = sin((M_PI * sp ->theta) / 180.0);\n    cos_theta = cos((M_PI * sp ->theta) / 180.0);\n\n    a = sp ->r * sin_theta * sin_alpha;\n    b = sp ->r * sin_theta * cos_alpha;\n    L = sp ->r * cos_theta;\n\n    v ->n[VX] = L;\n    v ->n[VY] = a;\n    v ->n[VZ] = b;\n}\n\n\n// Quantize sector of a spherical coordinate. Saturate 360, 180 to last sector\n// The limits are the centers of each sector, so\nstatic\nvoid QuantizeToSector(const cmsSpherical* sp, int* alpha, int* theta)\n{\n    *alpha = (int) floor(((sp->alpha * (SECTORS)) / 360.0) );\n    *theta = (int) floor(((sp->theta * (SECTORS)) / 180.0) );\n\n    if (*alpha >= SECTORS)\n        *alpha = SECTORS-1;\n    if (*theta >= SECTORS)\n        *theta = SECTORS-1;\n}\n\n\n// Line determined by 2 points\nstatic\nvoid LineOf2Points(cmsLine* line, cmsVEC3* a, cmsVEC3* b)\n{\n\n    _cmsVEC3init(&line ->a, a ->n[VX], a ->n[VY], a ->n[VZ]);\n    _cmsVEC3init(&line ->u, b ->n[VX] - a ->n[VX],\n                            b ->n[VY] - a ->n[VY],\n                            b ->n[VZ] - a ->n[VZ]);\n}\n\n\n// Evaluate parametric line\nstatic\nvoid GetPointOfLine(cmsVEC3* p, const cmsLine* line, cmsFloat64Number t)\n{\n    p ->n[VX] = line ->a.n[VX] + t * line->u.n[VX];\n    p ->n[VY] = line ->a.n[VY] + t * line->u.n[VY];\n    p ->n[VZ] = line ->a.n[VZ] + t * line->u.n[VZ];\n}\n\n\n\n/*\n    Closest point in sector line1 to sector line2 (both are defined as 0 <=t <= 1)\n    http://softsurfer.com/Archive/algorithm_0106/algorithm_0106.htm\n\n    Copyright 2001, softSurfer (www.softsurfer.com)\n    This code may be freely used and modified for any purpose\n    providing that this copyright notice is included with it.\n    SoftSurfer makes no warranty for this code, and cannot be held\n    liable for any real or imagined damage resulting from its use.\n    Users of this code must verify correctness for their application.\n\n*/\n\nstatic\ncmsBool ClosestLineToLine(cmsVEC3* r, const cmsLine* line1, const cmsLine* line2)\n{\n    cmsFloat64Number a, b, c, d, e, D;\n    cmsFloat64Number sc, sN, sD;\n    cmsFloat64Number tc, tN, tD;\n    cmsVEC3 w0;\n\n    _cmsVEC3minus(&w0, &line1 ->a, &line2 ->a);\n\n    a  = _cmsVEC3dot(&line1 ->u, &line1 ->u);\n    b  = _cmsVEC3dot(&line1 ->u, &line2 ->u);\n    c  = _cmsVEC3dot(&line2 ->u, &line2 ->u);\n    d  = _cmsVEC3dot(&line1 ->u, &w0);\n    e  = _cmsVEC3dot(&line2 ->u, &w0);\n\n    D  = a*c - b * b;      // Denominator\n    sD = tD = D;           // default sD = D >= 0\n\n    if (D <  MATRIX_DET_TOLERANCE) {   // the lines are almost parallel\n\n        sN = 0.0;        // force using point P0 on segment S1\n        sD = 1.0;        // to prevent possible division by 0.0 later\n        tN = e;\n        tD = c;\n    }\n    else {                // get the closest points on the infinite lines\n\n        sN = (b*e - c*d);\n        tN = (a*e - b*d);\n\n        if (sN < 0.0) {       // sc < 0 => the s=0 edge is visible\n\n            sN = 0.0;\n            tN = e;\n            tD = c;\n        }\n        else if (sN > sD) {   // sc > 1 => the s=1 edge is visible\n            sN = sD;\n            tN = e + b;\n            tD = c;\n        }\n    }\n\n    if (tN < 0.0) {           // tc < 0 => the t=0 edge is visible\n\n        tN = 0.0;\n        // recompute sc for this edge\n        if (-d < 0.0)\n            sN = 0.0;\n        else if (-d > a)\n            sN = sD;\n        else {\n            sN = -d;\n            sD = a;\n        }\n    }\n    else if (tN > tD) {      // tc > 1 => the t=1 edge is visible\n\n        tN = tD;\n\n        // recompute sc for this edge\n        if ((-d + b) < 0.0)\n            sN = 0;\n        else if ((-d + b) > a)\n            sN = sD;\n        else {\n            sN = (-d + b);\n            sD = a;\n        }\n    }\n    // finally do the division to get sc and tc\n    sc = (fabs(sN) < MATRIX_DET_TOLERANCE ? 0.0 : sN / sD);\n    tc = (fabs(tN) < MATRIX_DET_TOLERANCE ? 0.0 : tN / tD);\n\n    GetPointOfLine(r, line1, sc);\n    return TRUE;\n}\n\n\n\n// ------------------------------------------------------------------ Wrapper\n\n\n// Allocate & free structure\ncmsHANDLE  CMSEXPORT cmsGBDAlloc(cmsContext ContextID)\n{\n    cmsGDB* gbd = (cmsGDB*) _cmsMallocZero(ContextID, sizeof(cmsGDB));\n    if (gbd == NULL) return NULL;\n\n    gbd -> ContextID = ContextID;\n\n    return (cmsHANDLE) gbd;\n}\n\n\nvoid CMSEXPORT cmsGBDFree(cmsHANDLE hGBD)\n{\n    cmsGDB* gbd = (cmsGDB*) hGBD;\n    if (hGBD != NULL)\n        _cmsFree(gbd->ContextID, (void*) gbd);\n}\n\n\n// Auxiliar to retrieve a pointer to the segmentr containing the Lab value\nstatic\ncmsGDBPoint* GetPoint(cmsGDB* gbd, const cmsCIELab* Lab, cmsSpherical* sp)\n{\n    cmsVEC3 v;\n    int alpha, theta;\n\n    // Housekeeping\n    _cmsAssert(gbd != NULL);\n    _cmsAssert(Lab != NULL);\n    _cmsAssert(sp != NULL);\n\n    // Center L* by substracting half of its domain, that's 50\n    _cmsVEC3init(&v, Lab ->L - 50.0, Lab ->a, Lab ->b);\n\n    // Convert to spherical coordinates\n    ToSpherical(sp, &v);\n\n    if (sp ->r < 0 || sp ->alpha < 0 || sp->theta < 0) {\n         cmsSignalError(gbd ->ContextID, cmsERROR_RANGE, \"spherical value out of range\");\n         return NULL;\n    }\n\n    // On which sector it falls?\n    QuantizeToSector(sp, &alpha, &theta);\n\n    if (alpha < 0 || theta < 0 || alpha >= SECTORS || theta >= SECTORS) {\n         cmsSignalError(gbd ->ContextID, cmsERROR_RANGE, \" quadrant out of range\");\n         return NULL;\n    }\n\n    // Get pointer to the sector\n    return &gbd ->Gamut[theta][alpha];\n}\n\n// Add a point to gamut descriptor. Point to add is in Lab color space.\n// GBD is centered on a=b=0 and L*=50\ncmsBool CMSEXPORT cmsGDBAddPoint(cmsHANDLE hGBD, const cmsCIELab* Lab)\n{\n    cmsGDB* gbd = (cmsGDB*) hGBD;\n    cmsGDBPoint* ptr;\n    cmsSpherical sp;\n\n\n    // Get pointer to the sector\n    ptr = GetPoint(gbd, Lab, &sp);\n    if (ptr == NULL) return FALSE;\n\n    // If no samples at this sector, add it\n    if (ptr ->Type == GP_EMPTY) {\n\n        ptr -> Type = GP_SPECIFIED;\n        ptr -> p    = sp;\n    }\n    else {\n\n\n        // Substitute only if radius is greater\n        if (sp.r > ptr -> p.r) {\n\n                ptr -> Type = GP_SPECIFIED;\n                ptr -> p    = sp;\n        }\n    }\n\n    return TRUE;\n}\n\n// Check if a given point falls inside gamut\ncmsBool CMSEXPORT cmsGDBCheckPoint(cmsHANDLE hGBD, const cmsCIELab* Lab)\n{\n    cmsGDB* gbd = (cmsGDB*) hGBD;\n    cmsGDBPoint* ptr;\n    cmsSpherical sp;\n\n    // Get pointer to the sector\n    ptr = GetPoint(gbd, Lab, &sp);\n    if (ptr == NULL) return FALSE;\n\n    // If no samples at this sector, return no data\n    if (ptr ->Type == GP_EMPTY) return FALSE;\n\n    // In gamut only if radius is greater\n\n    return (sp.r <= ptr -> p.r);\n}\n\n// -----------------------------------------------------------------------------------------------------------------------\n\n// Find near sectors. The list of sectors found is returned on Close[].\n// The function returns the number of sectors as well.\n\n// 24   9  10  11  12\n// 23   8   1   2  13\n// 22   7   *   3  14\n// 21   6   5   4  15\n// 20  19  18  17  16\n//\n// Those are the relative movements\n// {-2,-2}, {-1, -2}, {0, -2}, {+1, -2}, {+2,  -2},\n// {-2,-1}, {-1, -1}, {0, -1}, {+1, -1}, {+2,  -1},\n// {-2, 0}, {-1,  0}, {0,  0}, {+1,  0}, {+2,   0},\n// {-2,+1}, {-1, +1}, {0, +1}, {+1,  +1}, {+2,  +1},\n// {-2,+2}, {-1, +2}, {0, +2}, {+1,  +2}, {+2,  +2}};\n\n\nstatic\nconst struct _spiral {\n\n    int AdvX, AdvY;\n\n    } Spiral[] = { {0,  -1}, {+1, -1}, {+1,  0}, {+1, +1}, {0,  +1}, {-1, +1},\n                   {-1,  0}, {-1, -1}, {-1, -2}, {0,  -2}, {+1, -2}, {+2, -2},\n                   {+2, -1}, {+2,  0}, {+2, +1}, {+2, +2}, {+1, +2}, {0,  +2},\n                   {-1, +2}, {-2, +2}, {-2, +1}, {-2, 0},  {-2, -1}, {-2, -2} };\n\n#define NSTEPS (sizeof(Spiral) / sizeof(struct _spiral))\n\nstatic\nint FindNearSectors(cmsGDB* gbd, int alpha, int theta, cmsGDBPoint* Close[])\n{\n    int nSectors = 0;\n    int a, t;\n    cmsUInt32Number i;\n    cmsGDBPoint* pt;\n\n    for (i=0; i < NSTEPS; i++) {\n\n        a = alpha + Spiral[i].AdvX;\n        t = theta + Spiral[i].AdvY;\n\n        // Cycle at the end\n        a %= SECTORS;\n        t %= SECTORS;\n\n        // Cycle at the begin\n        if (a < 0) a = SECTORS + a;\n        if (t < 0) t = SECTORS + t;\n\n        pt = &gbd ->Gamut[t][a];\n\n        if (pt -> Type != GP_EMPTY) {\n\n            Close[nSectors++] = pt;\n        }\n    }\n\n    return nSectors;\n}\n\n\n// Interpolate a missing sector. Method identifies whatever this is top, bottom or mid\nstatic\ncmsBool InterpolateMissingSector(cmsGDB* gbd, int alpha, int theta)\n{\n    cmsSpherical sp;\n    cmsVEC3 Lab;\n    cmsVEC3 Centre;\n    cmsLine ray;\n    int nCloseSectors;\n    cmsGDBPoint* Close[NSTEPS + 1];\n    cmsSpherical closel, templ;\n    cmsLine edge;\n    int k, m;\n\n    // Is that point already specified?\n    if (gbd ->Gamut[theta][alpha].Type != GP_EMPTY) return TRUE;\n\n    // Fill close points\n    nCloseSectors = FindNearSectors(gbd, alpha, theta, Close);\n\n\n    // Find a central point on the sector\n    sp.alpha = (cmsFloat64Number) ((alpha + 0.5) * 360.0) / (SECTORS);\n    sp.theta = (cmsFloat64Number) ((theta + 0.5) * 180.0) / (SECTORS);\n    sp.r     = 50.0;\n\n    // Convert to Cartesian\n    ToCartesian(&Lab, &sp);\n\n    // Create a ray line from centre to this point\n    _cmsVEC3init(&Centre, 50.0, 0, 0);\n    LineOf2Points(&ray, &Lab, &Centre);\n\n    // For all close sectors\n    closel.r = 0.0;\n    closel.alpha = 0;\n    closel.theta = 0;\n\n    for (k=0; k < nCloseSectors; k++) {\n\n        for(m = k+1; m < nCloseSectors; m++) {\n\n            cmsVEC3 temp, a1, a2;\n\n            // A line from sector to sector\n            ToCartesian(&a1, &Close[k]->p);\n            ToCartesian(&a2, &Close[m]->p);\n\n            LineOf2Points(&edge, &a1, &a2);\n\n            // Find a line\n            ClosestLineToLine(&temp, &ray, &edge);\n\n            // Convert to spherical\n            ToSpherical(&templ, &temp);\n\n\n            if ( templ.r > closel.r &&\n                 templ.theta >= (theta*180.0/SECTORS) &&\n                 templ.theta <= ((theta+1)*180.0/SECTORS) &&\n                 templ.alpha >= (alpha*360.0/SECTORS) &&\n                 templ.alpha <= ((alpha+1)*360.0/SECTORS)) {\n\n                closel = templ;\n            }\n        }\n    }\n\n    gbd ->Gamut[theta][alpha].p = closel;\n    gbd ->Gamut[theta][alpha].Type = GP_MODELED;\n\n    return TRUE;\n\n}\n\n\n// Interpolate missing parts. The algorithm fist computes slices at\n// theta=0 and theta=Max.\ncmsBool CMSEXPORT cmsGDBCompute(cmsHANDLE hGBD, cmsUInt32Number dwFlags)\n{\n    int alpha, theta;\n    cmsGDB* gbd = (cmsGDB*) hGBD;\n\n    _cmsAssert(hGBD != NULL);\n\n    // Interpolate black\n    for (alpha = 0; alpha < SECTORS; alpha++) {\n\n        if (!InterpolateMissingSector(gbd, alpha, 0)) return FALSE;\n    }\n\n    // Interpolate white\n    for (alpha = 0; alpha < SECTORS; alpha++) {\n\n        if (!InterpolateMissingSector(gbd, alpha, SECTORS-1)) return FALSE;\n    }\n\n\n    // Interpolate Mid\n    for (theta = 1; theta < SECTORS; theta++) {\n        for (alpha = 0; alpha < SECTORS; alpha++) {\n\n            if (!InterpolateMissingSector(gbd, alpha, theta)) return FALSE;\n        }\n    }\n\n    // Done\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(dwFlags);\n}\n\n\n\n\n// --------------------------------------------------------------------------------------------------------\n\n// Great for debug, but not suitable for real use\n\n#if 0\ncmsBool cmsGBDdumpVRML(cmsHANDLE hGBD, const char* fname)\n{\n    FILE* fp;\n    int   i, j;\n    cmsGDB* gbd = (cmsGDB*) hGBD;\n    cmsGDBPoint* pt;\n\n    fp = fopen (fname, \"wt\");\n    if (fp == NULL)\n        return FALSE;\n\n    fprintf (fp, \"#VRML V2.0 utf8\\n\");\n\n    // set the viewing orientation and distance\n    fprintf (fp, \"DEF CamTest Group {\\n\");\n    fprintf (fp, \"\\tchildren [\\n\");\n    fprintf (fp, \"\\t\\tDEF Cameras Group {\\n\");\n    fprintf (fp, \"\\t\\t\\tchildren [\\n\");\n    fprintf (fp, \"\\t\\t\\t\\tDEF DefaultView Viewpoint {\\n\");\n    fprintf (fp, \"\\t\\t\\t\\t\\tposition 0 0 340\\n\");\n    fprintf (fp, \"\\t\\t\\t\\t\\torientation 0 0 1 0\\n\");\n    fprintf (fp, \"\\t\\t\\t\\t\\tdescription \\\"default view\\\"\\n\");\n    fprintf (fp, \"\\t\\t\\t\\t}\\n\");\n    fprintf (fp, \"\\t\\t\\t]\\n\");\n    fprintf (fp, \"\\t\\t},\\n\");\n    fprintf (fp, \"\\t]\\n\");\n    fprintf (fp, \"}\\n\");\n\n    // Output the background stuff\n    fprintf (fp, \"Background {\\n\");\n    fprintf (fp, \"\\tskyColor [\\n\");\n    fprintf (fp, \"\\t\\t.5 .5 .5\\n\");\n    fprintf (fp, \"\\t]\\n\");\n    fprintf (fp, \"}\\n\");\n\n    // Output the shape stuff\n    fprintf (fp, \"Transform {\\n\");\n    fprintf (fp, \"\\tscale .3 .3 .3\\n\");\n    fprintf (fp, \"\\tchildren [\\n\");\n\n    // Draw the axes as a shape:\n    fprintf (fp, \"\\t\\tShape {\\n\");\n    fprintf (fp, \"\\t\\t\\tappearance Appearance {\\n\");\n    fprintf (fp, \"\\t\\t\\t\\tmaterial Material {\\n\");\n    fprintf (fp, \"\\t\\t\\t\\t\\tdiffuseColor 0 0.8 0\\n\");\n    fprintf (fp, \"\\t\\t\\t\\t\\temissiveColor 1.0 1.0 1.0\\n\");\n    fprintf (fp, \"\\t\\t\\t\\t\\tshininess 0.8\\n\");\n    fprintf (fp, \"\\t\\t\\t\\t}\\n\");\n    fprintf (fp, \"\\t\\t\\t}\\n\");\n    fprintf (fp, \"\\t\\t\\tgeometry IndexedLineSet {\\n\");\n    fprintf (fp, \"\\t\\t\\t\\tcoord Coordinate {\\n\");\n    fprintf (fp, \"\\t\\t\\t\\t\\tpoint [\\n\");\n    fprintf (fp, \"\\t\\t\\t\\t\\t0.0 0.0 0.0,\\n\");\n    fprintf (fp, \"\\t\\t\\t\\t\\t%f 0.0 0.0,\\n\",  255.0);\n    fprintf (fp, \"\\t\\t\\t\\t\\t0.0 %f 0.0,\\n\",  255.0);\n    fprintf (fp, \"\\t\\t\\t\\t\\t0.0 0.0 %f]\\n\",  255.0);\n    fprintf (fp, \"\\t\\t\\t\\t}\\n\");\n    fprintf (fp, \"\\t\\t\\t\\tcoordIndex [\\n\");\n    fprintf (fp, \"\\t\\t\\t\\t\\t0, 1, -1\\n\");\n    fprintf (fp, \"\\t\\t\\t\\t\\t0, 2, -1\\n\");\n    fprintf (fp, \"\\t\\t\\t\\t\\t0, 3, -1]\\n\");\n    fprintf (fp, \"\\t\\t\\t}\\n\");\n    fprintf (fp, \"\\t\\t}\\n\");\n\n\n    fprintf (fp, \"\\t\\tShape {\\n\");\n    fprintf (fp, \"\\t\\t\\tappearance Appearance {\\n\");\n    fprintf (fp, \"\\t\\t\\t\\tmaterial Material {\\n\");\n    fprintf (fp, \"\\t\\t\\t\\t\\tdiffuseColor 0 0.8 0\\n\");\n    fprintf (fp, \"\\t\\t\\t\\t\\temissiveColor 1 1 1\\n\");\n    fprintf (fp, \"\\t\\t\\t\\t\\tshininess 0.8\\n\");\n    fprintf (fp, \"\\t\\t\\t\\t}\\n\");\n    fprintf (fp, \"\\t\\t\\t}\\n\");\n    fprintf (fp, \"\\t\\t\\tgeometry PointSet {\\n\");\n\n    // fill in the points here\n    fprintf (fp, \"\\t\\t\\t\\tcoord Coordinate {\\n\");\n    fprintf (fp, \"\\t\\t\\t\\t\\tpoint [\\n\");\n\n    // We need to transverse all gamut hull.\n    for (i=0; i < SECTORS; i++)\n        for (j=0; j < SECTORS; j++) {\n\n            cmsVEC3 v;\n\n            pt = &gbd ->Gamut[i][j];\n            ToCartesian(&v, &pt ->p);\n\n            fprintf (fp, \"\\t\\t\\t\\t\\t%g %g %g\", v.n[0]+50, v.n[1], v.n[2]);\n\n            if ((j == SECTORS - 1) && (i == SECTORS - 1))\n                fprintf (fp, \"]\\n\");\n            else\n                fprintf (fp, \",\\n\");\n\n        }\n\n        fprintf (fp, \"\\t\\t\\t\\t}\\n\");\n\n\n\n    // fill in the face colors\n    fprintf (fp, \"\\t\\t\\t\\tcolor Color {\\n\");\n    fprintf (fp, \"\\t\\t\\t\\t\\tcolor [\\n\");\n\n    for (i=0; i < SECTORS; i++)\n        for (j=0; j < SECTORS; j++) {\n\n           cmsVEC3 v;\n\n            pt = &gbd ->Gamut[i][j];\n\n\n            ToCartesian(&v, &pt ->p);\n\n\n        if (pt ->Type == GP_EMPTY)\n            fprintf (fp, \"\\t\\t\\t\\t\\t%g %g %g\", 0.0, 0.0, 0.0);\n        else\n            if (pt ->Type == GP_MODELED)\n                fprintf (fp, \"\\t\\t\\t\\t\\t%g %g %g\", 1.0, .5, .5);\n            else {\n                fprintf (fp, \"\\t\\t\\t\\t\\t%g %g %g\", 1.0, 1.0, 1.0);\n\n            }\n\n        if ((j == SECTORS - 1) && (i == SECTORS - 1))\n                fprintf (fp, \"]\\n\");\n            else\n                fprintf (fp, \",\\n\");\n    }\n    fprintf (fp, \"\\t\\t\\t}\\n\");\n\n\n    fprintf (fp, \"\\t\\t\\t}\\n\");\n    fprintf (fp, \"\\t\\t}\\n\");\n    fprintf (fp, \"\\t]\\n\");\n    fprintf (fp, \"}\\n\");\n\n    fclose (fp);\n\n    return TRUE;\n}\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/src/cmstypes.c",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2014 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n//\n\n#include \"lcms2_internal.h\"\n\n// Tag Serialization  -----------------------------------------------------------------------------\n// This file implements every single tag and tag type as described in the ICC spec. Some types\n// have been deprecated, like ncl and Data. There is no implementation for those types as there\n// are no profiles holding them. The programmer can also extend this list by defining his own types\n// by using the appropiate plug-in. There are three types of plug ins regarding that. First type\n// allows to define new tags using any existing type. Next plug-in type allows to define new types\n// and the third one is very specific: allows to extend the number of elements in the multiprocessing\n// elements special type.\n//--------------------------------------------------------------------------------------------------\n\n// Some broken types\n#define cmsCorbisBrokenXYZtype    ((cmsTagTypeSignature) 0x17A505B8)\n#define cmsMonacoBrokenCurveType  ((cmsTagTypeSignature) 0x9478ee00)\n\n// This is the linked list that keeps track of the defined types\ntypedef struct _cmsTagTypeLinkedList_st {\n\n    cmsTagTypeHandler Handler;\n    struct _cmsTagTypeLinkedList_st* Next;\n\n} _cmsTagTypeLinkedList;\n\n// Some macros to define callbacks.\n#define READ_FN(x)  Type_##x##_Read\n#define WRITE_FN(x) Type_##x##_Write\n#define FREE_FN(x)  Type_##x##_Free\n#define DUP_FN(x)   Type_##x##_Dup\n\n// Helper macro to define a handler. Callbacks do have a fixed naming convention.\n#define TYPE_HANDLER(t, x)  { (t), READ_FN(x), WRITE_FN(x), DUP_FN(x), FREE_FN(x), NULL, 0 }\n\n// Helper macro to define a MPE handler. Callbacks do have a fixed naming convention\n#define TYPE_MPE_HANDLER(t, x)  { (t), READ_FN(x), WRITE_FN(x), GenericMPEdup, GenericMPEfree, NULL, 0 }\n\n// Register a new type handler. This routine is shared between normal types and MPE. LinkedList points to the optional list head\nstatic\ncmsBool RegisterTypesPlugin(cmsContext id, cmsPluginBase* Data, _cmsMemoryClient pos)\n{\n    cmsPluginTagType* Plugin = (cmsPluginTagType*) Data;\n    _cmsTagTypePluginChunkType* ctx = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(id, pos);\n    _cmsTagTypeLinkedList *pt;\n\n    // Calling the function with NULL as plug-in would unregister the plug in.\n    if (Data == NULL) {\n\n        // There is no need to set free the memory, as pool is destroyed as a whole.\n        ctx ->TagTypes = NULL;\n        return TRUE;\n    }\n\n    // Registering happens in plug-in memory pool.\n    pt = (_cmsTagTypeLinkedList*) _cmsPluginMalloc(id, sizeof(_cmsTagTypeLinkedList));\n    if (pt == NULL) return FALSE;\n\n    pt ->Handler   = Plugin ->Handler;\n    pt ->Next      = ctx ->TagTypes;\n\n    ctx ->TagTypes = pt;\n     \n    return TRUE;\n}\n\n// Return handler for a given type or NULL if not found. Shared between normal types and MPE. It first tries the additons \n// made by plug-ins and then the built-in defaults.\nstatic\ncmsTagTypeHandler* GetHandler(cmsTagTypeSignature sig, _cmsTagTypeLinkedList* PluginLinkedList, _cmsTagTypeLinkedList* DefaultLinkedList)\n{\n    _cmsTagTypeLinkedList* pt;\n\n    for (pt = PluginLinkedList;\n         pt != NULL;\n         pt = pt ->Next) {\n\n            if (sig == pt -> Handler.Signature) return &pt ->Handler;\n    }\n\n    for (pt = DefaultLinkedList;\n         pt != NULL;\n         pt = pt ->Next) {\n\n            if (sig == pt -> Handler.Signature) return &pt ->Handler;\n    }\n\n    return NULL;\n}\n\n\n// Auxiliar to convert UTF-32 to UTF-16 in some cases\nstatic\ncmsBool _cmsWriteWCharArray(cmsIOHANDLER* io, cmsUInt32Number n, const wchar_t* Array)\n{\n    cmsUInt32Number i;\n\n    _cmsAssert(io != NULL);\n    _cmsAssert(!(Array == NULL && n > 0));\n\n    for (i=0; i < n; i++) {\n        if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) Array[i])) return FALSE;\n    }\n\n    return TRUE;\n}\n\n// Auxiliar to read an array of wchar_t\nstatic\ncmsBool _cmsReadWCharArray(cmsIOHANDLER* io, cmsUInt32Number n, wchar_t* Array)\n{\n    cmsUInt32Number i;\n    cmsUInt16Number tmp;\n\n    _cmsAssert(io != NULL);\n\n    for (i=0; i < n; i++) {\n\n        if (Array != NULL) {\n\n            if (!_cmsReadUInt16Number(io, &tmp)) return FALSE;\n            Array[i] = (wchar_t) tmp;\n        }\n        else {\n            if (!_cmsReadUInt16Number(io, NULL)) return FALSE;\n        }\n\n    }\n    return TRUE;\n}\n\n// To deal with position tables\ntypedef cmsBool (* PositionTableEntryFn)(struct _cms_typehandler_struct* self,\n                                             cmsIOHANDLER* io,\n                                             void* Cargo,\n                                             cmsUInt32Number n,\n                                             cmsUInt32Number SizeOfTag);\n\n// Helper function to deal with position tables as decribed in ICC spec 4.3\n// A table of n elements is readed, where first comes n records containing offsets and sizes and\n// then a block containing the data itself. This allows to reuse same data in more than one entry\nstatic\ncmsBool ReadPositionTable(struct _cms_typehandler_struct* self,\n                              cmsIOHANDLER* io,\n                              cmsUInt32Number Count,\n                              cmsUInt32Number BaseOffset,\n                              void *Cargo,\n                              PositionTableEntryFn ElementFn)\n{\n    cmsUInt32Number i;\n    cmsUInt32Number *ElementOffsets = NULL, *ElementSizes = NULL;\n\n    // Let's take the offsets to each element\n    ElementOffsets = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number));\n    if (ElementOffsets == NULL) goto Error;\n\n    ElementSizes = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number));\n    if (ElementSizes == NULL) goto Error;\n\n    for (i=0; i < Count; i++) {\n\n        if (!_cmsReadUInt32Number(io, &ElementOffsets[i])) goto Error;\n        if (!_cmsReadUInt32Number(io, &ElementSizes[i])) goto Error;\n\n        ElementOffsets[i] += BaseOffset;\n    }\n\n    // Seek to each element and read it\n    for (i=0; i < Count; i++) {\n\n        if (!io -> Seek(io, ElementOffsets[i])) goto Error;\n\n        // This is the reader callback\n        if (!ElementFn(self, io, Cargo, i, ElementSizes[i])) goto Error;\n    }\n\n    // Success\n    if (ElementOffsets != NULL) _cmsFree(io ->ContextID, ElementOffsets);\n    if (ElementSizes != NULL) _cmsFree(io ->ContextID, ElementSizes);\n    return TRUE;\n\nError:\n    if (ElementOffsets != NULL) _cmsFree(io ->ContextID, ElementOffsets);\n    if (ElementSizes != NULL) _cmsFree(io ->ContextID, ElementSizes);\n    return FALSE;\n}\n\n// Same as anterior, but for write position tables\nstatic\ncmsBool WritePositionTable(struct _cms_typehandler_struct* self,\n                               cmsIOHANDLER* io,\n                               cmsUInt32Number SizeOfTag,\n                               cmsUInt32Number Count,\n                               cmsUInt32Number BaseOffset,\n                               void *Cargo,\n                               PositionTableEntryFn ElementFn)\n{\n    cmsUInt32Number i;\n    cmsUInt32Number DirectoryPos, CurrentPos, Before;\n    cmsUInt32Number *ElementOffsets = NULL, *ElementSizes = NULL;\n\n     // Create table\n    ElementOffsets = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number));\n    if (ElementOffsets == NULL) goto Error;\n\n    ElementSizes = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number));\n    if (ElementSizes == NULL) goto Error;\n\n    // Keep starting position of curve offsets\n    DirectoryPos = io ->Tell(io);\n\n    // Write a fake directory to be filled latter on\n    for (i=0; i < Count; i++) {\n\n        if (!_cmsWriteUInt32Number(io, 0)) goto Error;  // Offset\n        if (!_cmsWriteUInt32Number(io, 0)) goto Error;  // size\n    }\n\n    // Write each element. Keep track of the size as well.\n    for (i=0; i < Count; i++) {\n\n        Before = io ->Tell(io);\n        ElementOffsets[i] = Before - BaseOffset;\n\n        // Callback to write...\n        if (!ElementFn(self, io, Cargo, i, SizeOfTag)) goto Error;\n\n        // Now the size\n        ElementSizes[i] = io ->Tell(io) - Before;\n    }\n\n    // Write the directory\n    CurrentPos = io ->Tell(io);\n    if (!io ->Seek(io, DirectoryPos)) goto Error;\n\n    for (i=0; i <  Count; i++) {\n        if (!_cmsWriteUInt32Number(io, ElementOffsets[i])) goto Error;\n        if (!_cmsWriteUInt32Number(io, ElementSizes[i])) goto Error;\n    }\n\n    if (!io ->Seek(io, CurrentPos)) goto Error;\n\n    if (ElementOffsets != NULL) _cmsFree(io ->ContextID, ElementOffsets);\n    if (ElementSizes != NULL) _cmsFree(io ->ContextID, ElementSizes);\n    return TRUE;\n\nError:\n    if (ElementOffsets != NULL) _cmsFree(io ->ContextID, ElementOffsets);\n    if (ElementSizes != NULL) _cmsFree(io ->ContextID, ElementSizes);\n    return FALSE;\n}\n\n\n// ********************************************************************************\n// Type XYZ. Only one value is allowed\n// ********************************************************************************\n\n//The XYZType contains an array of three encoded values for the XYZ tristimulus\n//values. Tristimulus values must be non-negative. The signed encoding allows for\n//implementation optimizations by minimizing the number of fixed formats.\n\n\nstatic\nvoid *Type_XYZ_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    cmsCIEXYZ* xyz;\n\n    *nItems = 0;\n    xyz = (cmsCIEXYZ*) _cmsMallocZero(self ->ContextID, sizeof(cmsCIEXYZ));\n    if (xyz == NULL) return NULL;\n\n    if (!_cmsReadXYZNumber(io, xyz)) {\n        _cmsFree(self ->ContextID, xyz);\n        return NULL;\n    }\n\n    *nItems = 1;\n    return (void*) xyz;\n\n    cmsUNUSED_PARAMETER(SizeOfTag);\n}\n\nstatic\ncmsBool  Type_XYZ_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    return _cmsWriteXYZNumber(io, (cmsCIEXYZ*) Ptr);\n\n    cmsUNUSED_PARAMETER(nItems);\n    cmsUNUSED_PARAMETER(self);\n}\n\nstatic\nvoid* Type_XYZ_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)\n{\n    return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsCIEXYZ));\n\n    cmsUNUSED_PARAMETER(n);\n}\n\nstatic\nvoid Type_XYZ_Free(struct _cms_typehandler_struct* self, void *Ptr)\n{\n    _cmsFree(self ->ContextID, Ptr);\n}\n\n\nstatic\ncmsTagTypeSignature DecideXYZtype(cmsFloat64Number ICCVersion, const void *Data)\n{\n    return cmsSigXYZType;\n\n    cmsUNUSED_PARAMETER(ICCVersion);\n    cmsUNUSED_PARAMETER(Data);\n}\n\n\n// ********************************************************************************\n// Type chromaticity. Only one value is allowed\n// ********************************************************************************\n// The chromaticity tag type provides basic chromaticity data and type of\n// phosphors or colorants of a monitor to applications and utilities.\n\nstatic\nvoid *Type_Chromaticity_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    cmsCIExyYTRIPLE* chrm;\n    cmsUInt16Number nChans, Table;\n\n    *nItems = 0;\n    chrm =  (cmsCIExyYTRIPLE*) _cmsMallocZero(self ->ContextID, sizeof(cmsCIExyYTRIPLE));\n    if (chrm == NULL) return NULL;\n\n    if (!_cmsReadUInt16Number(io, &nChans)) goto Error;\n\n    // Let's recover from a bug introduced in early versions of lcms1\n    if (nChans == 0 && SizeOfTag == 32) {\n\n        if (!_cmsReadUInt16Number(io, NULL)) goto Error;\n        if (!_cmsReadUInt16Number(io, &nChans)) goto Error;\n    }\n\n    if (nChans != 3) goto Error;\n\n    if (!_cmsReadUInt16Number(io, &Table)) goto Error;\n\n    if (!_cmsRead15Fixed16Number(io, &chrm ->Red.x)) goto Error;\n    if (!_cmsRead15Fixed16Number(io, &chrm ->Red.y)) goto Error;\n\n    chrm ->Red.Y = 1.0;\n\n    if (!_cmsRead15Fixed16Number(io, &chrm ->Green.x)) goto Error;\n    if (!_cmsRead15Fixed16Number(io, &chrm ->Green.y)) goto Error;\n\n    chrm ->Green.Y = 1.0;\n\n    if (!_cmsRead15Fixed16Number(io, &chrm ->Blue.x)) goto Error;\n    if (!_cmsRead15Fixed16Number(io, &chrm ->Blue.y)) goto Error;\n\n    chrm ->Blue.Y = 1.0;\n\n    *nItems = 1;\n    return (void*) chrm;\n\nError:\n    _cmsFree(self ->ContextID, (void*) chrm);\n    return NULL;\n\n    cmsUNUSED_PARAMETER(SizeOfTag);\n}\n\nstatic\ncmsBool  SaveOneChromaticity(cmsFloat64Number x, cmsFloat64Number y, cmsIOHANDLER* io)\n{\n    if (!_cmsWriteUInt32Number(io, _cmsDoubleTo15Fixed16(x))) return FALSE;\n    if (!_cmsWriteUInt32Number(io, _cmsDoubleTo15Fixed16(y))) return FALSE;\n\n    return TRUE;\n}\n\nstatic\ncmsBool  Type_Chromaticity_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsCIExyYTRIPLE* chrm = (cmsCIExyYTRIPLE*) Ptr;\n\n    if (!_cmsWriteUInt16Number(io, 3)) return FALSE;        // nChannels\n    if (!_cmsWriteUInt16Number(io, 0)) return FALSE;        // Table\n\n    if (!SaveOneChromaticity(chrm -> Red.x,   chrm -> Red.y, io)) return FALSE;\n    if (!SaveOneChromaticity(chrm -> Green.x, chrm -> Green.y, io)) return FALSE;\n    if (!SaveOneChromaticity(chrm -> Blue.x,  chrm -> Blue.y, io)) return FALSE;\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(nItems);\n    cmsUNUSED_PARAMETER(self);\n}\n\nstatic\nvoid* Type_Chromaticity_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)\n{\n    return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsCIExyYTRIPLE));\n\n    cmsUNUSED_PARAMETER(n);\n}\n\nstatic\nvoid Type_Chromaticity_Free(struct _cms_typehandler_struct* self, void* Ptr)\n{\n    _cmsFree(self ->ContextID, Ptr);\n}\n\n\n// ********************************************************************************\n// Type cmsSigColorantOrderType\n// ********************************************************************************\n\n// This is an optional tag which specifies the laydown order in which colorants will\n// be printed on an n-colorant device. The laydown order may be the same as the\n// channel generation order listed in the colorantTableTag or the channel order of a\n// colour space such as CMYK, in which case this tag is not needed. When this is not\n// the case (for example, ink-towers sometimes use the order KCMY), this tag may be\n// used to specify the laydown order of the colorants.\n\n\nstatic\nvoid *Type_ColorantOrderType_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    cmsUInt8Number* ColorantOrder;\n    cmsUInt32Number Count;\n\n    *nItems = 0;\n    if (!_cmsReadUInt32Number(io, &Count)) return NULL;\n    if (Count > cmsMAXCHANNELS) return NULL;\n\n    ColorantOrder = (cmsUInt8Number*) _cmsCalloc(self ->ContextID, cmsMAXCHANNELS, sizeof(cmsUInt8Number));\n    if (ColorantOrder == NULL) return NULL;\n\n    // We use FF as end marker\n    memset(ColorantOrder, 0xFF, cmsMAXCHANNELS * sizeof(cmsUInt8Number));\n\n    if (io ->Read(io, ColorantOrder, sizeof(cmsUInt8Number), Count) != Count) {\n\n        _cmsFree(self ->ContextID, (void*) ColorantOrder);\n        return NULL;\n    }\n\n    *nItems = 1;\n    return (void*) ColorantOrder;\n\n    cmsUNUSED_PARAMETER(SizeOfTag);\n}\n\nstatic\ncmsBool Type_ColorantOrderType_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsUInt8Number*  ColorantOrder = (cmsUInt8Number*) Ptr;\n    cmsUInt32Number i, sz, Count;\n\n    // Get the length\n    for (Count=i=0; i < cmsMAXCHANNELS; i++) {\n        if (ColorantOrder[i] != 0xFF) Count++;\n    }\n\n    if (!_cmsWriteUInt32Number(io, Count)) return FALSE;\n\n    sz = Count * sizeof(cmsUInt8Number);\n    if (!io -> Write(io, sz, ColorantOrder)) return FALSE;\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(nItems);\n    cmsUNUSED_PARAMETER(self);\n}\n\nstatic\nvoid* Type_ColorantOrderType_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)\n{\n    return _cmsDupMem(self ->ContextID, Ptr, cmsMAXCHANNELS * sizeof(cmsUInt8Number));\n\n    cmsUNUSED_PARAMETER(n);\n}\n\n\nstatic\nvoid Type_ColorantOrderType_Free(struct _cms_typehandler_struct* self, void* Ptr)\n{\n    _cmsFree(self ->ContextID, Ptr);\n}\n\n// ********************************************************************************\n// Type cmsSigS15Fixed16ArrayType\n// ********************************************************************************\n// This type represents an array of generic 4-byte/32-bit fixed point quantity.\n// The number of values is determined from the size of the tag.\n\nstatic\nvoid *Type_S15Fixed16_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    cmsFloat64Number*  array_double;\n    cmsUInt32Number i, n;\n\n    *nItems = 0;\n    n = SizeOfTag / sizeof(cmsUInt32Number);\n    array_double = (cmsFloat64Number*) _cmsCalloc(self ->ContextID, n, sizeof(cmsFloat64Number));\n    if (array_double == NULL) return NULL;\n\n    for (i=0; i < n; i++) {\n\n        if (!_cmsRead15Fixed16Number(io, &array_double[i])) {\n\n            _cmsFree(self ->ContextID, array_double);\n            return NULL;\n        }\n    }\n\n    *nItems = n;\n    return (void*) array_double;\n}\n\nstatic\ncmsBool Type_S15Fixed16_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsFloat64Number* Value = (cmsFloat64Number*) Ptr;\n    cmsUInt32Number i;\n\n    for (i=0; i < nItems; i++) {\n\n        if (!_cmsWrite15Fixed16Number(io, Value[i])) return FALSE;\n    }\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(self);\n}\n\nstatic\nvoid* Type_S15Fixed16_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)\n{\n    return _cmsDupMem(self ->ContextID, Ptr, n * sizeof(cmsFloat64Number));\n}\n\n\nstatic\nvoid Type_S15Fixed16_Free(struct _cms_typehandler_struct* self, void* Ptr)\n{\n    _cmsFree(self ->ContextID, Ptr);\n}\n\n// ********************************************************************************\n// Type cmsSigU16Fixed16ArrayType\n// ********************************************************************************\n// This type represents an array of generic 4-byte/32-bit quantity.\n// The number of values is determined from the size of the tag.\n\n\nstatic\nvoid *Type_U16Fixed16_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    cmsFloat64Number*  array_double;\n    cmsUInt32Number v;\n    cmsUInt32Number i, n;\n\n    *nItems = 0;\n    n = SizeOfTag / sizeof(cmsUInt32Number);\n    array_double = (cmsFloat64Number*) _cmsCalloc(self ->ContextID, n, sizeof(cmsFloat64Number));\n    if (array_double == NULL) return NULL;\n\n    for (i=0; i < n; i++) {\n\n        if (!_cmsReadUInt32Number(io, &v)) {\n            _cmsFree(self ->ContextID, (void*) array_double);\n            return NULL;\n        }\n\n        // Convert to cmsFloat64Number\n        array_double[i] =  (cmsFloat64Number) (v / 65536.0);\n    }\n\n    *nItems = n;\n    return (void*) array_double;\n}\n\nstatic\ncmsBool Type_U16Fixed16_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsFloat64Number* Value = (cmsFloat64Number*) Ptr;\n    cmsUInt32Number i;\n\n    for (i=0; i < nItems; i++) {\n\n        cmsUInt32Number v = (cmsUInt32Number) floor(Value[i]*65536.0 + 0.5);\n\n        if (!_cmsWriteUInt32Number(io, v)) return FALSE;\n    }\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(self);\n}\n\n\nstatic\nvoid* Type_U16Fixed16_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)\n{\n    return _cmsDupMem(self ->ContextID, Ptr, n * sizeof(cmsFloat64Number));\n}\n\nstatic\nvoid Type_U16Fixed16_Free(struct _cms_typehandler_struct* self, void* Ptr)\n{\n    _cmsFree(self ->ContextID, Ptr);\n}\n\n// ********************************************************************************\n// Type cmsSigSignatureType\n// ********************************************************************************\n//\n// The signatureType contains a four-byte sequence, Sequences of less than four\n// characters are padded at the end with spaces, 20h.\n// Typically this type is used for registered tags that can be displayed on many\n// development systems as a sequence of four characters.\n\nstatic\nvoid *Type_Signature_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    cmsSignature* SigPtr = (cmsSignature*) _cmsMalloc(self ->ContextID, sizeof(cmsSignature));\n    if (SigPtr == NULL) return NULL;\n\n     if (!_cmsReadUInt32Number(io, SigPtr)) return NULL;\n     *nItems = 1;\n\n     return SigPtr;\n\n     cmsUNUSED_PARAMETER(SizeOfTag);\n}\n\nstatic\ncmsBool  Type_Signature_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsSignature* SigPtr = (cmsSignature*) Ptr;\n\n    return _cmsWriteUInt32Number(io, *SigPtr);\n\n    cmsUNUSED_PARAMETER(nItems);\n    cmsUNUSED_PARAMETER(self);\n}\n\nstatic\nvoid* Type_Signature_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)\n{\n    return _cmsDupMem(self ->ContextID, Ptr, n * sizeof(cmsSignature));\n}\n\nstatic\nvoid Type_Signature_Free(struct _cms_typehandler_struct* self, void* Ptr)\n{\n    _cmsFree(self ->ContextID, Ptr);\n}\n\n\n// ********************************************************************************\n// Type cmsSigTextType\n// ********************************************************************************\n//\n// The textType is a simple text structure that contains a 7-bit ASCII text string.\n// The length of the string is obtained by subtracting 8 from the element size portion\n// of the tag itself. This string must be terminated with a 00h byte.\n\nstatic\nvoid *Type_Text_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    char* Text = NULL;\n    cmsMLU* mlu = NULL;\n\n    // Create a container\n    mlu = cmsMLUalloc(self ->ContextID, 1);\n    if (mlu == NULL) return NULL;\n\n    *nItems = 0;\n\n    // We need to store the \"\\0\" at the end, so +1\n    if (SizeOfTag == UINT_MAX) goto Error;\n\n    Text = (char*) _cmsMalloc(self ->ContextID, SizeOfTag + 1);\n    if (Text == NULL) goto Error;\n\n    if (io -> Read(io, Text, sizeof(char), SizeOfTag) != SizeOfTag) goto Error;\n\n    // Make sure text is properly ended\n    Text[SizeOfTag] = 0;\n    *nItems = 1;\n\n    // Keep the result\n    if (!cmsMLUsetASCII(mlu, cmsNoLanguage, cmsNoCountry, Text)) goto Error;\n\n    _cmsFree(self ->ContextID, Text);\n    return (void*) mlu;\n\nError:\n    if (mlu != NULL)\n        cmsMLUfree(mlu);\n    if (Text != NULL)\n        _cmsFree(self ->ContextID, Text);\n\n    return NULL;\n}\n\n// The conversion implies to choose a language. So, we choose the actual language.\nstatic\ncmsBool Type_Text_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsMLU* mlu = (cmsMLU*) Ptr;\n    cmsUInt32Number size;\n    cmsBool  rc;\n    char* Text;\n\n    // Get the size of the string. Note there is an extra \"\\0\" at the end\n    size = cmsMLUgetASCII(mlu, cmsNoLanguage, cmsNoCountry, NULL, 0);\n    if (size == 0) return FALSE;       // Cannot be zero!\n\n    // Create memory\n    Text = (char*) _cmsMalloc(self ->ContextID, size);\n    if (Text == NULL) return FALSE;\n\n    cmsMLUgetASCII(mlu, cmsNoLanguage, cmsNoCountry, Text, size);\n\n    // Write it, including separator\n    rc = io ->Write(io, size, Text);\n\n    _cmsFree(self ->ContextID, Text);\n    return rc;\n\n    cmsUNUSED_PARAMETER(nItems);\n}\n\nstatic\nvoid* Type_Text_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)\n{\n    return (void*) cmsMLUdup((cmsMLU*) Ptr);\n\n    cmsUNUSED_PARAMETER(n);\n    cmsUNUSED_PARAMETER(self);\n}\n\n\nstatic\nvoid Type_Text_Free(struct _cms_typehandler_struct* self, void* Ptr)\n{\n    cmsMLU* mlu = (cmsMLU*) Ptr;\n    cmsMLUfree(mlu);\n    return;\n\n    cmsUNUSED_PARAMETER(self);\n}\n\nstatic\ncmsTagTypeSignature DecideTextType(cmsFloat64Number ICCVersion, const void *Data)\n{\n    if (ICCVersion >= 4.0)\n        return cmsSigMultiLocalizedUnicodeType;\n\n    return cmsSigTextType;\n\n    cmsUNUSED_PARAMETER(Data);\n}\n\n\n// ********************************************************************************\n// Type cmsSigDataType\n// ********************************************************************************\n\n// General purpose data type\nstatic\nvoid *Type_Data_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    cmsICCData* BinData;\n    cmsUInt32Number LenOfData;\n\n    *nItems = 0;\n\n    if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL;\n\n    LenOfData = SizeOfTag - sizeof(cmsUInt32Number);\n    if (LenOfData > INT_MAX) return NULL;\n\n    BinData = (cmsICCData*) _cmsMalloc(self ->ContextID, sizeof(cmsICCData) + LenOfData - 1);\n    if (BinData == NULL) return NULL;\n\n    BinData ->len = LenOfData;\n    if (!_cmsReadUInt32Number(io, &BinData->flag)) {\n        _cmsFree(self ->ContextID, BinData);\n        return NULL;\n    }\n\n    if (io -> Read(io, BinData ->data, sizeof(cmsUInt8Number), LenOfData) != LenOfData) {\n\n        _cmsFree(self ->ContextID, BinData);\n        return NULL;\n    }\n\n    *nItems = 1;\n\n    return (void*) BinData;\n}\n\n\nstatic\ncmsBool Type_Data_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n   cmsICCData* BinData = (cmsICCData*) Ptr;\n\n   if (!_cmsWriteUInt32Number(io, BinData ->flag)) return FALSE;\n\n   return io ->Write(io, BinData ->len, BinData ->data);\n\n   cmsUNUSED_PARAMETER(nItems);\n   cmsUNUSED_PARAMETER(self);\n}\n\n\nstatic\nvoid* Type_Data_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)\n{\n    cmsICCData* BinData = (cmsICCData*) Ptr;\n\n    return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsICCData) + BinData ->len - 1);\n\n    cmsUNUSED_PARAMETER(n);\n}\n\nstatic\nvoid Type_Data_Free(struct _cms_typehandler_struct* self, void* Ptr)\n{\n    _cmsFree(self ->ContextID, Ptr);\n}\n\n// ********************************************************************************\n// Type cmsSigTextDescriptionType\n// ********************************************************************************\n\nstatic\nvoid *Type_Text_Description_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    char* Text = NULL;\n    cmsMLU* mlu = NULL;\n    cmsUInt32Number  AsciiCount;\n    cmsUInt32Number  i, UnicodeCode, UnicodeCount;\n    cmsUInt16Number  ScriptCodeCode, Dummy;\n    cmsUInt8Number   ScriptCodeCount;\n\n    *nItems = 0;\n\n    //  One dword should be there\n    if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL;\n\n    // Read len of ASCII\n    if (!_cmsReadUInt32Number(io, &AsciiCount)) return NULL;\n    SizeOfTag -= sizeof(cmsUInt32Number);\n\n    // Check for size\n    if (SizeOfTag < AsciiCount) return NULL;\n\n    // All seems Ok, allocate the container\n    mlu = cmsMLUalloc(self ->ContextID, 1);\n    if (mlu == NULL) return NULL;\n\n    // As many memory as size of tag\n    Text = (char*) _cmsMalloc(self ->ContextID, AsciiCount + 1);\n    if (Text == NULL) goto Error;\n\n    // Read it\n    if (io ->Read(io, Text, sizeof(char), AsciiCount) != AsciiCount) goto Error;\n    SizeOfTag -= AsciiCount;\n\n    // Make sure there is a terminator\n    Text[AsciiCount] = 0;\n\n    // Set the MLU entry. From here we can be tolerant to wrong types\n    if (!cmsMLUsetASCII(mlu, cmsNoLanguage, cmsNoCountry, Text)) goto Error;\n    _cmsFree(self ->ContextID, (void*) Text);\n    Text = NULL;\n\n    // Skip Unicode code\n    if (SizeOfTag < 2* sizeof(cmsUInt32Number)) goto Done;\n    if (!_cmsReadUInt32Number(io, &UnicodeCode)) goto Done;\n    if (!_cmsReadUInt32Number(io, &UnicodeCount)) goto Done;\n    SizeOfTag -= 2* sizeof(cmsUInt32Number);\n\n    if (SizeOfTag < UnicodeCount*sizeof(cmsUInt16Number)) goto Done;\n\n    for (i=0; i < UnicodeCount; i++) {\n        if (!io ->Read(io, &Dummy, sizeof(cmsUInt16Number), 1)) goto Done;\n    }\n    SizeOfTag -= UnicodeCount*sizeof(cmsUInt16Number);\n\n    // Skip ScriptCode code if present. Some buggy profiles does have less\n    // data that stricttly required. We need to skip it as this type may come\n    // embedded in other types.\n\n    if (SizeOfTag >= sizeof(cmsUInt16Number) + sizeof(cmsUInt8Number) + 67) {\n\n        if (!_cmsReadUInt16Number(io, &ScriptCodeCode)) goto Done;\n        if (!_cmsReadUInt8Number(io,  &ScriptCodeCount)) goto Done;\n\n        // Skip rest of tag\n        for (i=0; i < 67; i++) {\n            if (!io ->Read(io, &Dummy, sizeof(cmsUInt8Number), 1)) goto Error;\n        }\n    }\n\nDone:\n\n    *nItems = 1;\n    return mlu;\n\nError:\n    if (Text) _cmsFree(self ->ContextID, (void*) Text);\n    if (mlu) cmsMLUfree(mlu);\n    return NULL;\n}\n\n\n// This tag can come IN UNALIGNED SIZE. In order to prevent issues, we force zeros on description to align it\nstatic\ncmsBool  Type_Text_Description_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsMLU* mlu = (cmsMLU*) Ptr;\n    char *Text = NULL;\n    wchar_t *Wide = NULL;\n    cmsUInt32Number len, len_aligned, len_filler_alignment;\n    cmsBool  rc = FALSE;\n    char Filler[68];\n\n    // Used below for writting zeroes\n    memset(Filler, 0, sizeof(Filler));\n\n    // Get the len of string\n    len = cmsMLUgetASCII(mlu, cmsNoLanguage, cmsNoCountry, NULL, 0);\n\n    // From ICC3.4: It has been found that textDescriptionType can contain misaligned data\n    //(see clause 4.1 for the definition of aligned?. Because the Unicode language\n    // code and Unicode count immediately follow the ASCII description, their\n    // alignment is not correct if the ASCII count is not a multiple of four. The\n    // ScriptCode code is misaligned when the ASCII count is odd. Profile reading and\n    // writing software must be written carefully in order to handle these alignment\n    // problems.\n\n    // Compute an aligned size\n    len_aligned = _cmsALIGNLONG(len);\n    len_filler_alignment = len_aligned - len;\n\n    // Null strings\n    if (len <= 0) {\n\n        Text = (char*)    _cmsDupMem(self ->ContextID, \"\", sizeof(char));\n        Wide = (wchar_t*) _cmsDupMem(self ->ContextID, L\"\", sizeof(wchar_t));\n    }\n    else {\n        // Create independent buffers\n        Text = (char*) _cmsCalloc(self ->ContextID, len, sizeof(char));\n        if (Text == NULL) goto Error;\n\n        Wide = (wchar_t*) _cmsCalloc(self ->ContextID, len, sizeof(wchar_t));\n        if (Wide == NULL) goto Error;\n\n        // Get both representations.\n        cmsMLUgetASCII(mlu, cmsNoLanguage, cmsNoCountry,  Text, len * sizeof(char));\n        cmsMLUgetWide(mlu,  cmsNoLanguage, cmsNoCountry,  Wide, len * sizeof(wchar_t));\n    }\n\n  // * cmsUInt32Number       count;          * Description length\n  // * cmsInt8Number         desc[count]     * NULL terminated ascii string\n  // * cmsUInt32Number       ucLangCode;     * UniCode language code\n  // * cmsUInt32Number       ucCount;        * UniCode description length\n  // * cmsInt16Number        ucDesc[ucCount];* The UniCode description\n  // * cmsUInt16Number       scCode;         * ScriptCode code\n  // * cmsUInt8Number        scCount;        * ScriptCode count\n  // * cmsInt8Number         scDesc[67];     * ScriptCode Description\n\n    if (!_cmsWriteUInt32Number(io, len_aligned)) goto Error;\n    if (!io ->Write(io, len, Text)) goto Error;\n    if (!io ->Write(io, len_filler_alignment, Filler)) goto Error;\n\n    if (!_cmsWriteUInt32Number(io, 0)) goto Error;  // ucLanguageCode\n\n    // This part is tricky: we need an aligned tag size, and the ScriptCode part\n    // takes 70 bytes, so we need 2 extra bytes to do the alignment\n\n    if (!_cmsWriteUInt32Number(io, len_aligned+1)) goto Error;\n\n    // Note that in some compilers sizeof(cmsUInt16Number) != sizeof(wchar_t)\n    if (!_cmsWriteWCharArray(io, len, Wide)) goto Error;\n    if (!_cmsWriteUInt16Array(io, len_filler_alignment+1, (cmsUInt16Number*) Filler)) goto Error;\n\n    // ScriptCode Code & count (unused)\n    if (!_cmsWriteUInt16Number(io, 0)) goto Error;\n    if (!_cmsWriteUInt8Number(io, 0)) goto Error;\n\n    if (!io ->Write(io, 67, Filler)) goto Error;\n\n    rc = TRUE;\n\nError:\n    if (Text) _cmsFree(self ->ContextID, Text);\n    if (Wide) _cmsFree(self ->ContextID, Wide);\n\n    return rc;\n\n    cmsUNUSED_PARAMETER(nItems);\n}\n\n\nstatic\nvoid* Type_Text_Description_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)\n{\n    return (void*) cmsMLUdup((cmsMLU*) Ptr);\n\n    cmsUNUSED_PARAMETER(n);\n    cmsUNUSED_PARAMETER(self);\n}\n\nstatic\nvoid Type_Text_Description_Free(struct _cms_typehandler_struct* self, void* Ptr)\n{\n    cmsMLU* mlu = (cmsMLU*) Ptr;\n\n    cmsMLUfree(mlu);\n    return;\n\n    cmsUNUSED_PARAMETER(self);\n}\n\n\nstatic\ncmsTagTypeSignature DecideTextDescType(cmsFloat64Number ICCVersion, const void *Data)\n{\n    if (ICCVersion >= 4.0)\n        return cmsSigMultiLocalizedUnicodeType;\n\n    return cmsSigTextDescriptionType;\n\n    cmsUNUSED_PARAMETER(Data);\n}\n\n\n// ********************************************************************************\n// Type cmsSigCurveType\n// ********************************************************************************\n\nstatic\nvoid *Type_Curve_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    cmsUInt32Number Count;\n    cmsToneCurve* NewGamma;\n    \n    *nItems = 0;\n    if (!_cmsReadUInt32Number(io, &Count)) return NULL;\n\n    switch (Count) {\n\n           case 0:   // Linear.\n               {\n                   cmsFloat64Number SingleGamma = 1.0;\n\n                   NewGamma = cmsBuildParametricToneCurve(self ->ContextID, 1, &SingleGamma);\n                   if (!NewGamma) return NULL;\n                   *nItems = 1;\n                   return NewGamma;\n               }\n              \n           case 1:  // Specified as the exponent of gamma function\n               {\n                   cmsUInt16Number SingleGammaFixed;\n                   cmsFloat64Number SingleGamma;\n\n                   if (!_cmsReadUInt16Number(io, &SingleGammaFixed)) return NULL;\n                   SingleGamma = _cms8Fixed8toDouble(SingleGammaFixed);\n\n                   *nItems = 1;\n                   return cmsBuildParametricToneCurve(self ->ContextID, 1, &SingleGamma);\n               }\n\n           default:  // Curve\n\n               if (Count > 0x7FFF)\n                   return NULL; // This is to prevent bad guys for doing bad things\n\n               NewGamma = cmsBuildTabulatedToneCurve16(self ->ContextID, Count, NULL);\n               if (!NewGamma) return NULL;\n\n               if (!_cmsReadUInt16Array(io, Count, NewGamma -> Table16)) return NULL;\n\n               *nItems = 1;\n               return NewGamma;\n    }\n\n    cmsUNUSED_PARAMETER(SizeOfTag);\n}\n\n\nstatic\ncmsBool  Type_Curve_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsToneCurve* Curve = (cmsToneCurve*) Ptr;\n\n    if (Curve ->nSegments == 1 && Curve ->Segments[0].Type == 1) {\n\n            // Single gamma, preserve number\n            cmsUInt16Number SingleGammaFixed = _cmsDoubleTo8Fixed8(Curve ->Segments[0].Params[0]);\n\n            if (!_cmsWriteUInt32Number(io, 1)) return FALSE;\n            if (!_cmsWriteUInt16Number(io, SingleGammaFixed)) return FALSE;\n            return TRUE;\n\n    }\n\n    if (!_cmsWriteUInt32Number(io, Curve ->nEntries)) return FALSE;\n    return _cmsWriteUInt16Array(io, Curve ->nEntries, Curve ->Table16);\n\n    cmsUNUSED_PARAMETER(nItems);\n    cmsUNUSED_PARAMETER(self);\n}\n\n\nstatic\nvoid* Type_Curve_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)\n{\n    return (void*) cmsDupToneCurve((cmsToneCurve*) Ptr);\n\n    cmsUNUSED_PARAMETER(n);\n    cmsUNUSED_PARAMETER(self);\n}\n\nstatic\nvoid Type_Curve_Free(struct _cms_typehandler_struct* self, void* Ptr)\n{\n    cmsToneCurve* gamma = (cmsToneCurve*) Ptr;\n\n    cmsFreeToneCurve(gamma);\n    return;\n\n    cmsUNUSED_PARAMETER(self);\n}\n\n\n// ********************************************************************************\n// Type cmsSigParametricCurveType\n// ********************************************************************************\n\n\n// Decide which curve type to use on writting\nstatic\ncmsTagTypeSignature DecideCurveType(cmsFloat64Number ICCVersion, const void *Data)\n{\n    cmsToneCurve* Curve = (cmsToneCurve*) Data;\n\n    if (ICCVersion < 4.0) return cmsSigCurveType;\n    if (Curve ->nSegments != 1) return cmsSigCurveType;          // Only 1-segment curves can be saved as parametric\n    if (Curve ->Segments[0].Type < 0) return cmsSigCurveType;    // Only non-inverted curves\n    if (Curve ->Segments[0].Type > 5) return cmsSigCurveType;    // Only ICC parametric curves\n\n    return cmsSigParametricCurveType;\n}\n\nstatic\nvoid *Type_ParametricCurve_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    static const int ParamsByType[] = { 1, 3, 4, 5, 7 };\n    cmsFloat64Number Params[10];\n    cmsUInt16Number Type;\n    int i, n;\n    cmsToneCurve* NewGamma;\n\n    if (!_cmsReadUInt16Number(io, &Type)) return NULL;\n    if (!_cmsReadUInt16Number(io, NULL)) return NULL;   // Reserved\n\n    if (Type > 4) {\n\n        cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, \"Unknown parametric curve type '%d'\", Type);\n        return NULL;\n    }\n\n    memset(Params, 0, sizeof(Params));\n    n = ParamsByType[Type];\n\n    for (i=0; i < n; i++) {\n\n        if (!_cmsRead15Fixed16Number(io, &Params[i])) return NULL;\n    }\n\n    NewGamma = cmsBuildParametricToneCurve(self ->ContextID, Type+1, Params);\n\n    *nItems = 1;\n    return NewGamma;\n\n    cmsUNUSED_PARAMETER(SizeOfTag);\n}\n\n\nstatic\ncmsBool  Type_ParametricCurve_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsToneCurve* Curve = (cmsToneCurve*) Ptr;\n    int i, nParams, typen;\n    static const int ParamsByType[] = { 0, 1, 3, 4, 5, 7 };\n\n    typen = Curve -> Segments[0].Type;\n\n    if (Curve ->nSegments > 1 || typen < 1) {\n\n        cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, \"Multisegment or Inverted parametric curves cannot be written\");\n        return FALSE;\n    }\n\n    if (typen > 5) {\n        cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, \"Unsupported parametric curve\");\n        return FALSE;\n    }\n\n    nParams = ParamsByType[typen];\n\n    if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) (Curve ->Segments[0].Type - 1))) return FALSE;\n    if (!_cmsWriteUInt16Number(io, 0)) return FALSE;        // Reserved\n\n    for (i=0; i < nParams; i++) {\n\n        if (!_cmsWrite15Fixed16Number(io, Curve -> Segments[0].Params[i])) return FALSE;\n    }\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(nItems);\n}\n\nstatic\nvoid* Type_ParametricCurve_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)\n{\n    return (void*) cmsDupToneCurve((cmsToneCurve*) Ptr);\n\n    cmsUNUSED_PARAMETER(n);\n    cmsUNUSED_PARAMETER(self);\n}\n\nstatic\nvoid Type_ParametricCurve_Free(struct _cms_typehandler_struct* self, void* Ptr)\n{\n    cmsToneCurve* gamma = (cmsToneCurve*) Ptr;\n\n    cmsFreeToneCurve(gamma);\n    return;\n\n    cmsUNUSED_PARAMETER(self);\n}\n\n\n// ********************************************************************************\n// Type cmsSigDateTimeType\n// ********************************************************************************\n\n// A 12-byte value representation of the time and date, where the byte usage is assigned\n// as specified in table 1. The actual values are encoded as 16-bit unsigned integers\n// (uInt16Number - see 5.1.6).\n//\n// All the dateTimeNumber values in a profile shall be in Coordinated Universal Time\n// (UTC, also known as GMT or ZULU Time). Profile writers are required to convert local\n// time to UTC when setting these values. Programmes that display these values may show\n// the dateTimeNumber as UTC, show the equivalent local time (at current locale), or\n// display both UTC and local versions of the dateTimeNumber.\n\nstatic\nvoid *Type_DateTime_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    cmsDateTimeNumber timestamp;\n    struct tm * NewDateTime;\n\n    *nItems = 0;\n    NewDateTime = (struct tm*) _cmsMalloc(self ->ContextID, sizeof(struct tm));\n    if (NewDateTime == NULL) return NULL;\n\n    if (io->Read(io, &timestamp, sizeof(cmsDateTimeNumber), 1) != 1) return NULL;\n\n     _cmsDecodeDateTimeNumber(&timestamp, NewDateTime);\n\n     *nItems = 1;\n     return NewDateTime;\n\n     cmsUNUSED_PARAMETER(SizeOfTag);\n}\n\n\nstatic\ncmsBool  Type_DateTime_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    struct tm * DateTime = (struct tm*) Ptr;\n    cmsDateTimeNumber timestamp;\n\n    _cmsEncodeDateTimeNumber(&timestamp, DateTime);\n    if (!io ->Write(io, sizeof(cmsDateTimeNumber), &timestamp)) return FALSE;\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(nItems);\n    cmsUNUSED_PARAMETER(self);\n}\n\nstatic\nvoid* Type_DateTime_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)\n{\n    return _cmsDupMem(self ->ContextID, Ptr, sizeof(struct tm));\n\n    cmsUNUSED_PARAMETER(n);\n}\n\nstatic\nvoid Type_DateTime_Free(struct _cms_typehandler_struct* self, void* Ptr)\n{\n    _cmsFree(self ->ContextID, Ptr);\n}\n\n\n\n// ********************************************************************************\n// Type icMeasurementType\n// ********************************************************************************\n\n/*\nThe measurementType information refers only to the internal profile data and is\nmeant to provide profile makers an alternative to the default measurement\nspecifications.\n*/\n\nstatic\nvoid *Type_Measurement_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    cmsICCMeasurementConditions mc;\n\n\t\n    memset(&mc, 0, sizeof(mc));\n\t\n    if (!_cmsReadUInt32Number(io, &mc.Observer)) return NULL;\n    if (!_cmsReadXYZNumber(io,    &mc.Backing)) return NULL;\n    if (!_cmsReadUInt32Number(io, &mc.Geometry)) return NULL;\n    if (!_cmsRead15Fixed16Number(io, &mc.Flare)) return NULL;\n    if (!_cmsReadUInt32Number(io, &mc.IlluminantType)) return NULL;\n\n    *nItems = 1;\n    return _cmsDupMem(self ->ContextID, &mc, sizeof(cmsICCMeasurementConditions));\n\n    cmsUNUSED_PARAMETER(SizeOfTag);\n}\n\n\nstatic\ncmsBool  Type_Measurement_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsICCMeasurementConditions* mc =(cmsICCMeasurementConditions*) Ptr;\n\n    if (!_cmsWriteUInt32Number(io, mc->Observer)) return FALSE;\n    if (!_cmsWriteXYZNumber(io,    &mc->Backing)) return FALSE;\n    if (!_cmsWriteUInt32Number(io, mc->Geometry)) return FALSE;\n    if (!_cmsWrite15Fixed16Number(io, mc->Flare)) return FALSE;\n    if (!_cmsWriteUInt32Number(io, mc->IlluminantType)) return FALSE;\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(nItems);\n    cmsUNUSED_PARAMETER(self);\n}\n\nstatic\nvoid* Type_Measurement_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)\n{\n     return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsICCMeasurementConditions));\n\n     cmsUNUSED_PARAMETER(n);\n}\n\nstatic\nvoid Type_Measurement_Free(struct _cms_typehandler_struct* self, void* Ptr)\n{\n   _cmsFree(self ->ContextID, Ptr);\n}\n\n\n// ********************************************************************************\n// Type cmsSigMultiLocalizedUnicodeType\n// ********************************************************************************\n//\n//   Do NOT trust SizeOfTag as there is an issue on the definition of profileSequenceDescTag. See the TechNote from\n//   Max Derhak and Rohit Patil about this: basically the size of the string table should be guessed and cannot be\n//   taken from the size of tag if this tag is embedded as part of bigger structures (profileSequenceDescTag, for instance)\n//\n\nstatic\nvoid *Type_MLU_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    cmsMLU* mlu;\n    cmsUInt32Number Count, RecLen, NumOfWchar;\n    cmsUInt32Number SizeOfHeader;\n    cmsUInt32Number  Len, Offset;\n    cmsUInt32Number  i;\n    wchar_t*         Block;\n    cmsUInt32Number  BeginOfThisString, EndOfThisString, LargestPosition;\n\n    *nItems = 0;\n    if (!_cmsReadUInt32Number(io, &Count)) return NULL;\n    if (!_cmsReadUInt32Number(io, &RecLen)) return NULL;\n\n    if (RecLen != 12) {\n\n        cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, \"multiLocalizedUnicodeType of len != 12 is not supported.\");\n        return NULL;\n    }\n\n    mlu = cmsMLUalloc(self ->ContextID, Count);\n    if (mlu == NULL) return NULL;\n\n    mlu ->UsedEntries = Count;\n\n    SizeOfHeader = 12 * Count + sizeof(_cmsTagBase);\n    LargestPosition = 0;\n\n    for (i=0; i < Count; i++) {\n\n        if (!_cmsReadUInt16Number(io, &mlu ->Entries[i].Language)) goto Error;\n        if (!_cmsReadUInt16Number(io, &mlu ->Entries[i].Country))  goto Error;\n\n        // Now deal with Len and offset.\n        if (!_cmsReadUInt32Number(io, &Len)) goto Error;\n        if (!_cmsReadUInt32Number(io, &Offset)) goto Error;\n\n        // Check for overflow\n        if (Offset < (SizeOfHeader + 8)) goto Error;\n\n        // True begin of the string\n        BeginOfThisString = Offset - SizeOfHeader - 8;\n\n        // Ajust to wchar_t elements\n        mlu ->Entries[i].Len = (Len * sizeof(wchar_t)) / sizeof(cmsUInt16Number);\n        mlu ->Entries[i].StrW = (BeginOfThisString * sizeof(wchar_t)) / sizeof(cmsUInt16Number);\n\n        // To guess maximum size, add offset + len\n        EndOfThisString = BeginOfThisString + Len;\n        if (EndOfThisString > LargestPosition)\n            LargestPosition = EndOfThisString;\n    }\n\n    // Now read the remaining of tag and fill all strings. Substract the directory\n    SizeOfTag   = (LargestPosition * sizeof(wchar_t)) / sizeof(cmsUInt16Number);\n    if (SizeOfTag == 0)\n    {\n        Block = NULL;\n        NumOfWchar = 0;\n\n    }\n    else\n    {\n        Block = (wchar_t*) _cmsMalloc(self ->ContextID, SizeOfTag);\n        if (Block == NULL) goto Error;\n        NumOfWchar = SizeOfTag / sizeof(wchar_t);\n        if (!_cmsReadWCharArray(io, NumOfWchar, Block)) goto Error;\n    }\n\n    mlu ->MemPool  = Block;\n    mlu ->PoolSize = SizeOfTag;\n    mlu ->PoolUsed = SizeOfTag;\n\n    *nItems = 1;\n    return (void*) mlu;\n\nError:\n    if (mlu) cmsMLUfree(mlu);\n    return NULL;\n}\n\nstatic\ncmsBool  Type_MLU_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsMLU* mlu =(cmsMLU*) Ptr;\n    cmsUInt32Number HeaderSize;\n    cmsUInt32Number  Len, Offset;\n    int i;\n\n    if (Ptr == NULL) {\n\n          // Empty placeholder\n          if (!_cmsWriteUInt32Number(io, 0)) return FALSE;\n          if (!_cmsWriteUInt32Number(io, 12)) return FALSE;\n          return TRUE;\n    }\n\n    if (!_cmsWriteUInt32Number(io, mlu ->UsedEntries)) return FALSE;\n    if (!_cmsWriteUInt32Number(io, 12)) return FALSE;\n\n    HeaderSize = 12 * mlu ->UsedEntries + sizeof(_cmsTagBase);\n\n    for (i=0; i < mlu ->UsedEntries; i++) {\n\n        Len    =  mlu ->Entries[i].Len;\n        Offset =  mlu ->Entries[i].StrW;\n\n        Len    = (Len * sizeof(cmsUInt16Number)) / sizeof(wchar_t);\n        Offset = (Offset * sizeof(cmsUInt16Number)) / sizeof(wchar_t) + HeaderSize + 8;\n\n        if (!_cmsWriteUInt16Number(io, mlu ->Entries[i].Language)) return FALSE;\n        if (!_cmsWriteUInt16Number(io, mlu ->Entries[i].Country))  return FALSE;\n        if (!_cmsWriteUInt32Number(io, Len)) return FALSE;\n        if (!_cmsWriteUInt32Number(io, Offset)) return FALSE;\n    }\n\n    if (!_cmsWriteWCharArray(io, mlu ->PoolUsed / sizeof(wchar_t), (wchar_t*)  mlu ->MemPool)) return FALSE;\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(nItems);\n    cmsUNUSED_PARAMETER(self);\n}\n\n\nstatic\nvoid* Type_MLU_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)\n{\n    return (void*) cmsMLUdup((cmsMLU*) Ptr);\n\n    cmsUNUSED_PARAMETER(n);\n    cmsUNUSED_PARAMETER(self);\n}\n\nstatic\nvoid Type_MLU_Free(struct _cms_typehandler_struct* self, void* Ptr)\n{\n    cmsMLUfree((cmsMLU*) Ptr);\n    return;\n\n    cmsUNUSED_PARAMETER(self);\n}\n\n\n// ********************************************************************************\n// Type cmsSigLut8Type\n// ********************************************************************************\n\n// Decide which LUT type to use on writting\nstatic\ncmsTagTypeSignature DecideLUTtypeA2B(cmsFloat64Number ICCVersion, const void *Data)\n{\n    cmsPipeline* Lut = (cmsPipeline*) Data;\n\n    if (ICCVersion < 4.0) {\n        if (Lut ->SaveAs8Bits) return cmsSigLut8Type;\n        return cmsSigLut16Type;\n    }\n    else {\n         return cmsSigLutAtoBType;\n    }\n}\n\nstatic\ncmsTagTypeSignature DecideLUTtypeB2A(cmsFloat64Number ICCVersion, const void *Data)\n{\n    cmsPipeline* Lut = (cmsPipeline*) Data;\n\n    if (ICCVersion < 4.0) {\n        if (Lut ->SaveAs8Bits) return cmsSigLut8Type;\n        return cmsSigLut16Type;\n    }\n    else {\n         return cmsSigLutBtoAType;\n    }\n}\n\n/*\nThis structure represents a colour transform using tables of 8-bit precision.\nThis type contains four processing elements: a 3 by 3 matrix (which shall be\nthe identity matrix unless the input colour space is XYZ), a set of one dimensional\ninput tables, a multidimensional lookup table, and a set of one dimensional output\ntables. Data is processed using these elements via the following sequence:\n(matrix) -> (1d input tables)  -> (multidimensional lookup table - CLUT) -> (1d output tables)\n\nByte Position   Field Length (bytes)  Content Encoded as...\n8                  1          Number of Input Channels (i)    uInt8Number\n9                  1          Number of Output Channels (o)   uInt8Number\n10                 1          Number of CLUT grid points (identical for each side) (g) uInt8Number\n11                 1          Reserved for padding (fill with 00h)\n\n12..15             4          Encoded e00 parameter   s15Fixed16Number\n*/\n\n\n// Read 8 bit tables as gamma functions\nstatic\ncmsBool  Read8bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsPipeline* lut, int nChannels)\n{\n    cmsUInt8Number* Temp = NULL;\n    int i, j;\n    cmsToneCurve* Tables[cmsMAXCHANNELS];\n\n    if (nChannels > cmsMAXCHANNELS) return FALSE;\n    if (nChannels <= 0) return FALSE;\n\n    memset(Tables, 0, sizeof(Tables));\n\n    Temp = (cmsUInt8Number*) _cmsMalloc(ContextID, 256);\n    if (Temp == NULL) return FALSE;\n\n    for (i=0; i < nChannels; i++) {\n        Tables[i] = cmsBuildTabulatedToneCurve16(ContextID, 256, NULL);\n        if (Tables[i] == NULL) goto Error;\n    }\n\n    for (i=0; i < nChannels; i++) {\n\n        if (io ->Read(io, Temp, 256, 1) != 1) goto Error;\n\n        for (j=0; j < 256; j++)\n            Tables[i]->Table16[j] = (cmsUInt16Number) FROM_8_TO_16(Temp[j]);\n    }\n\n    _cmsFree(ContextID, Temp);\n    Temp = NULL;\n\n    if (!cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, nChannels, Tables)))\n        goto Error;\n\n    for (i=0; i < nChannels; i++)\n        cmsFreeToneCurve(Tables[i]);\n\n    return TRUE;\n\nError:\n    for (i=0; i < nChannels; i++) {\n        if (Tables[i]) cmsFreeToneCurve(Tables[i]);\n    }\n\n    if (Temp) _cmsFree(ContextID, Temp);\n    return FALSE;\n}\n\n\nstatic\ncmsBool Write8bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsUInt32Number n, _cmsStageToneCurvesData* Tables)\n{\n    int j;\n    cmsUInt32Number i;\n    cmsUInt8Number val;\n\n    for (i=0; i < n; i++) {\n\n        if (Tables) {\n\n            // Usual case of identity curves\n            if ((Tables ->TheCurves[i]->nEntries == 2) && \n                (Tables->TheCurves[i]->Table16[0] == 0) && \n                (Tables->TheCurves[i]->Table16[1] == 65535)) {\n\n                    for (j=0; j < 256; j++) {\n                        if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) j)) return FALSE;\n                    }\n            }\n            else \n                if (Tables ->TheCurves[i]->nEntries != 256) {\n                    cmsSignalError(ContextID, cmsERROR_RANGE, \"LUT8 needs 256 entries on prelinearization\");\n                    return FALSE;                \n                }\n                else\n                    for (j=0; j < 256; j++) {\n\n                        if (Tables != NULL)\n                            val = (cmsUInt8Number) FROM_16_TO_8(Tables->TheCurves[i]->Table16[j]);\n                        else\n                            val = (cmsUInt8Number) j;\n\n                        if (!_cmsWriteUInt8Number(io, val)) return FALSE;\n                    }\n        }\n    }\n    return TRUE;\n}\n\n\n// Check overflow\nstatic\ncmsUInt32Number uipow(cmsUInt32Number n, cmsUInt32Number a, cmsUInt32Number b)\n{\n    cmsUInt32Number rv = 1, rc;\n\n    if (a == 0) return 0;\n    if (n == 0) return 0;\n\n    for (; b > 0; b--) {\n\n        rv *= a;\n\n        // Check for overflow\n        if (rv > UINT_MAX / a) return (cmsUInt32Number) -1;\n\n    }\n\n    rc = rv * n;\n\n    if (rv != rc / n) return (cmsUInt32Number) -1;\n    return rc;\n}\n\n\n// That will create a MPE LUT with Matrix, pre tables, CLUT and post tables.\n// 8 bit lut may be scaled easely to v4 PCS, but we need also to properly adjust\n// PCS on BToAxx tags and AtoB if abstract. We need to fix input direction.\n\nstatic\nvoid *Type_LUT8_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    cmsUInt8Number InputChannels, OutputChannels, CLUTpoints;\n    cmsUInt8Number* Temp = NULL;\n    cmsPipeline* NewLUT = NULL;\n    cmsUInt32Number nTabSize, i;\n    cmsFloat64Number Matrix[3*3];\n\n    *nItems = 0;\n\n    if (!_cmsReadUInt8Number(io, &InputChannels)) goto Error;\n    if (!_cmsReadUInt8Number(io, &OutputChannels)) goto Error;\n    if (!_cmsReadUInt8Number(io, &CLUTpoints)) goto Error;\n\n     if (CLUTpoints == 1) goto Error; // Impossible value, 0 for no CLUT and then 2 at least\n\n    // Padding\n    if (!_cmsReadUInt8Number(io, NULL)) goto Error;\n\n    // Do some checking\n    if (InputChannels > cmsMAXCHANNELS)  goto Error;\n    if (OutputChannels > cmsMAXCHANNELS) goto Error;\n\n   // Allocates an empty Pipeline\n    NewLUT = cmsPipelineAlloc(self ->ContextID, InputChannels, OutputChannels);\n    if (NewLUT == NULL) goto Error;\n\n    // Read the Matrix\n    if (!_cmsRead15Fixed16Number(io,  &Matrix[0])) goto Error;\n    if (!_cmsRead15Fixed16Number(io,  &Matrix[1])) goto Error;\n    if (!_cmsRead15Fixed16Number(io,  &Matrix[2])) goto Error;\n    if (!_cmsRead15Fixed16Number(io,  &Matrix[3])) goto Error;\n    if (!_cmsRead15Fixed16Number(io,  &Matrix[4])) goto Error;\n    if (!_cmsRead15Fixed16Number(io,  &Matrix[5])) goto Error;\n    if (!_cmsRead15Fixed16Number(io,  &Matrix[6])) goto Error;\n    if (!_cmsRead15Fixed16Number(io,  &Matrix[7])) goto Error;\n    if (!_cmsRead15Fixed16Number(io,  &Matrix[8])) goto Error;\n\n\n    // Only operates if not identity...\n    if ((InputChannels == 3) && !_cmsMAT3isIdentity((cmsMAT3*) Matrix)) {\n\n        if (!cmsPipelineInsertStage(NewLUT, cmsAT_BEGIN, cmsStageAllocMatrix(self ->ContextID, 3, 3, Matrix, NULL)))\n            goto Error;\n    }\n\n    // Get input tables\n    if (!Read8bitTables(self ->ContextID, io,  NewLUT, InputChannels)) goto Error;\n\n    // Get 3D CLUT. Check the overflow....\n    nTabSize = uipow(OutputChannels, CLUTpoints, InputChannels);\n    if (nTabSize == (cmsUInt32Number) -1) goto Error;\n    if (nTabSize > 0) {\n\n        cmsUInt16Number *PtrW, *T;\n       \n        PtrW = T  = (cmsUInt16Number*) _cmsCalloc(self ->ContextID, nTabSize, sizeof(cmsUInt16Number));\n        if (T  == NULL) goto Error;\n\n        Temp = (cmsUInt8Number*) _cmsMalloc(self ->ContextID, nTabSize);\n        if (Temp == NULL) {\n            _cmsFree(self ->ContextID, T);\n            goto Error;\n        }\n\n        if (io ->Read(io, Temp, nTabSize, 1) != 1) {\n            _cmsFree(self ->ContextID, T);\n            _cmsFree(self ->ContextID, Temp);\n            goto Error;\n        }\n\n        for (i = 0; i < nTabSize; i++) {\n\n            *PtrW++ = FROM_8_TO_16(Temp[i]);\n        }\n        _cmsFree(self ->ContextID, Temp);\n        Temp = NULL;\n\n        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocCLut16bit(self ->ContextID, CLUTpoints, InputChannels, OutputChannels, T)))\n            goto Error;\n        _cmsFree(self ->ContextID, T);\n    }\n\n\n    // Get output tables\n    if (!Read8bitTables(self ->ContextID, io,  NewLUT, OutputChannels)) goto Error;\n\n    *nItems = 1;\n    return NewLUT;\n\nError:\n    if (NewLUT != NULL) cmsPipelineFree(NewLUT);\n    return NULL;\n\n    cmsUNUSED_PARAMETER(SizeOfTag);\n}\n\n// We only allow a specific MPE structure: Matrix plus prelin, plus clut, plus post-lin.\nstatic\ncmsBool  Type_LUT8_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsUInt32Number j, nTabSize;\n    cmsUInt8Number  val;\n    cmsPipeline* NewLUT = (cmsPipeline*) Ptr;\n    cmsStage* mpe;\n    _cmsStageToneCurvesData* PreMPE = NULL, *PostMPE = NULL;\n    _cmsStageMatrixData* MatMPE = NULL;\n    _cmsStageCLutData* clut = NULL;\n    int clutPoints;\n\n    // Disassemble the LUT into components.\n    mpe = NewLUT -> Elements;\n    if (mpe ->Type == cmsSigMatrixElemType) {\n\n        MatMPE = (_cmsStageMatrixData*) mpe ->Data;\n        mpe = mpe -> Next;\n    }\n\n    if (mpe != NULL && mpe ->Type == cmsSigCurveSetElemType) {\n        PreMPE = (_cmsStageToneCurvesData*) mpe ->Data;\n        mpe = mpe -> Next;\n    }\n\n    if (mpe != NULL && mpe ->Type == cmsSigCLutElemType) {\n        clut  = (_cmsStageCLutData*) mpe -> Data;\n        mpe = mpe ->Next;\n    }\n\n    if (mpe != NULL && mpe ->Type == cmsSigCurveSetElemType) {\n        PostMPE = (_cmsStageToneCurvesData*) mpe ->Data;\n        mpe = mpe -> Next;\n    }\n\n    // That should be all\n    if (mpe != NULL) {\n        cmsSignalError(mpe->ContextID, cmsERROR_UNKNOWN_EXTENSION, \"LUT is not suitable to be saved as LUT8\");\n        return FALSE;\n    }\n\n\n    if (clut == NULL)\n        clutPoints = 0;\n    else\n        clutPoints    = clut->Params->nSamples[0];\n\n    if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) NewLUT ->InputChannels)) return FALSE;\n    if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) NewLUT ->OutputChannels)) return FALSE;\n    if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) clutPoints)) return FALSE;\n    if (!_cmsWriteUInt8Number(io, 0)) return FALSE; // Padding\n\n\n    if (MatMPE != NULL) {\n\n        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[0])) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[1])) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[2])) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[3])) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[4])) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[5])) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[6])) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[7])) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[8])) return FALSE;\n\n    }\n    else {\n\n        if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE;\n    }\n\n    // The prelinearization table\n    if (!Write8bitTables(self ->ContextID, io, NewLUT ->InputChannels, PreMPE)) return FALSE;\n\n    nTabSize = uipow(NewLUT->OutputChannels, clutPoints, NewLUT ->InputChannels);\n    if (nTabSize == (cmsUInt32Number) -1) return FALSE;\n    if (nTabSize > 0) {\n\n        // The 3D CLUT.\n        if (clut != NULL) {\n\n            for (j=0; j < nTabSize; j++) {\n\n                val = (cmsUInt8Number) FROM_16_TO_8(clut ->Tab.T[j]);\n                if (!_cmsWriteUInt8Number(io, val)) return FALSE;\n            }\n        }\n    }\n\n    // The postlinearization table\n    if (!Write8bitTables(self ->ContextID, io, NewLUT ->OutputChannels, PostMPE)) return FALSE;\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(nItems);\n}\n\n\nstatic\nvoid* Type_LUT8_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)\n{\n    return (void*) cmsPipelineDup((cmsPipeline*) Ptr);\n\n    cmsUNUSED_PARAMETER(n);\n    cmsUNUSED_PARAMETER(self);\n}\n\nstatic\nvoid Type_LUT8_Free(struct _cms_typehandler_struct* self, void* Ptr)\n{\n    cmsPipelineFree((cmsPipeline*) Ptr);\n    return;\n\n    cmsUNUSED_PARAMETER(self);\n}\n\n// ********************************************************************************\n// Type cmsSigLut16Type\n// ********************************************************************************\n\n// Read 16 bit tables as gamma functions\nstatic\ncmsBool  Read16bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsPipeline* lut, int nChannels, int nEntries)\n{\n    int i;\n    cmsToneCurve* Tables[cmsMAXCHANNELS];\n\n    // Maybe an empty table? (this is a lcms extension)\n    if (nEntries <= 0) return TRUE;\n\n    // Check for malicious profiles\n    if (nEntries < 2) return FALSE;\n    if (nChannels > cmsMAXCHANNELS) return FALSE;\n\n    // Init table to zero\n    memset(Tables, 0, sizeof(Tables));\n\n    for (i=0; i < nChannels; i++) {\n\n        Tables[i] = cmsBuildTabulatedToneCurve16(ContextID, nEntries, NULL);\n        if (Tables[i] == NULL) goto Error;\n\n        if (!_cmsReadUInt16Array(io, nEntries, Tables[i]->Table16)) goto Error;\n    }\n\n\n    // Add the table (which may certainly be an identity, but this is up to the optimizer, not the reading code)\n    if (!cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, nChannels, Tables)))\n        goto Error;\n\n    for (i=0; i < nChannels; i++)\n        cmsFreeToneCurve(Tables[i]);\n\n    return TRUE;\n\nError:\n    for (i=0; i < nChannels; i++) {\n        if (Tables[i]) cmsFreeToneCurve(Tables[i]);\n    }\n\n    return FALSE;\n}\n\nstatic\ncmsBool Write16bitTables(cmsContext ContextID, cmsIOHANDLER* io, _cmsStageToneCurvesData* Tables)\n{\n    int j;\n    cmsUInt32Number i;\n    cmsUInt16Number val;\n    int nEntries;\n\n    _cmsAssert(Tables != NULL);\n\n    nEntries = Tables->TheCurves[0]->nEntries;\n\n    for (i=0; i < Tables ->nCurves; i++) {\n\n        for (j=0; j < nEntries; j++) {\n\n            val = Tables->TheCurves[i]->Table16[j];        \n            if (!_cmsWriteUInt16Number(io, val)) return FALSE;\n        }\n    }\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(ContextID);\n}\n\nstatic\nvoid *Type_LUT16_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    cmsUInt8Number InputChannels, OutputChannels, CLUTpoints;\n    cmsPipeline* NewLUT = NULL;\n    cmsUInt32Number nTabSize;\n    cmsFloat64Number Matrix[3*3];\n    cmsUInt16Number InputEntries, OutputEntries;\n\n    *nItems = 0;\n\n    if (!_cmsReadUInt8Number(io, &InputChannels)) return NULL;\n    if (!_cmsReadUInt8Number(io, &OutputChannels)) return NULL;\n    if (!_cmsReadUInt8Number(io, &CLUTpoints)) return NULL;   // 255 maximum\n\n    // Padding\n    if (!_cmsReadUInt8Number(io, NULL)) return NULL;\n\n    // Do some checking\n    if (InputChannels > cmsMAXCHANNELS)  goto Error;\n    if (OutputChannels > cmsMAXCHANNELS) goto Error;\n\n    // Allocates an empty LUT\n    NewLUT = cmsPipelineAlloc(self ->ContextID, InputChannels, OutputChannels);\n    if (NewLUT == NULL) goto Error;\n\n    // Read the Matrix\n    if (!_cmsRead15Fixed16Number(io,  &Matrix[0])) goto Error;\n    if (!_cmsRead15Fixed16Number(io,  &Matrix[1])) goto Error;\n    if (!_cmsRead15Fixed16Number(io,  &Matrix[2])) goto Error;\n    if (!_cmsRead15Fixed16Number(io,  &Matrix[3])) goto Error;\n    if (!_cmsRead15Fixed16Number(io,  &Matrix[4])) goto Error;\n    if (!_cmsRead15Fixed16Number(io,  &Matrix[5])) goto Error;\n    if (!_cmsRead15Fixed16Number(io,  &Matrix[6])) goto Error;\n    if (!_cmsRead15Fixed16Number(io,  &Matrix[7])) goto Error;\n    if (!_cmsRead15Fixed16Number(io,  &Matrix[8])) goto Error;\n\n\n    // Only operates on 3 channels\n    if ((InputChannels == 3) && !_cmsMAT3isIdentity((cmsMAT3*) Matrix)) {\n\n        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocMatrix(self ->ContextID, 3, 3, Matrix, NULL)))\n            goto Error;\n    }\n\n    if (!_cmsReadUInt16Number(io, &InputEntries)) goto Error;\n    if (!_cmsReadUInt16Number(io, &OutputEntries)) goto Error;\n\n    if (InputEntries > 0x7FFF || OutputEntries > 0x7FFF) goto Error;\n    if (CLUTpoints == 1) goto Error; // Impossible value, 0 for no CLUT and then 2 at least\n\n    // Get input tables\n    if (!Read16bitTables(self ->ContextID, io,  NewLUT, InputChannels, InputEntries)) goto Error;\n\n    // Get 3D CLUT\n    nTabSize = uipow(OutputChannels, CLUTpoints, InputChannels);\n    if (nTabSize == (cmsUInt32Number) -1) goto Error;\n    if (nTabSize > 0) {\n\n        cmsUInt16Number *T;\n\n        T  = (cmsUInt16Number*) _cmsCalloc(self ->ContextID, nTabSize, sizeof(cmsUInt16Number));\n        if (T  == NULL) goto Error;\n\n        if (!_cmsReadUInt16Array(io, nTabSize, T)) {\n            _cmsFree(self ->ContextID, T);\n            goto Error;\n        }\n\n        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocCLut16bit(self ->ContextID, CLUTpoints, InputChannels, OutputChannels, T))) {\n            _cmsFree(self ->ContextID, T);\n            goto Error;\n        }\n        _cmsFree(self ->ContextID, T);\n    }\n\n\n    // Get output tables\n    if (!Read16bitTables(self ->ContextID, io,  NewLUT, OutputChannels, OutputEntries)) goto Error;\n\n    *nItems = 1;\n    return NewLUT;\n\nError:\n    if (NewLUT != NULL) cmsPipelineFree(NewLUT);\n    return NULL;\n\n    cmsUNUSED_PARAMETER(SizeOfTag);\n}\n\n// We only allow some specific MPE structures: Matrix plus prelin, plus clut, plus post-lin.\n// Some empty defaults are created for missing parts\n\nstatic\ncmsBool  Type_LUT16_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsUInt32Number nTabSize;\n    cmsPipeline* NewLUT = (cmsPipeline*) Ptr;\n    cmsStage* mpe;\n    _cmsStageToneCurvesData* PreMPE = NULL, *PostMPE = NULL;\n    _cmsStageMatrixData* MatMPE = NULL;\n    _cmsStageCLutData* clut = NULL;\n    int i, InputChannels, OutputChannels, clutPoints;\n\n    // Disassemble the LUT into components.\n    mpe = NewLUT -> Elements;\n    if (mpe != NULL && mpe ->Type == cmsSigMatrixElemType) {\n\n        MatMPE = (_cmsStageMatrixData*) mpe ->Data;\n        mpe = mpe -> Next;\n    }\n\n\n    if (mpe != NULL && mpe ->Type == cmsSigCurveSetElemType) {\n        PreMPE = (_cmsStageToneCurvesData*) mpe ->Data;\n        mpe = mpe -> Next;\n    }\n\n    if (mpe != NULL && mpe ->Type == cmsSigCLutElemType) {\n        clut  = (_cmsStageCLutData*) mpe -> Data;\n        mpe = mpe ->Next;\n    }\n\n    if (mpe != NULL && mpe ->Type == cmsSigCurveSetElemType) {\n        PostMPE = (_cmsStageToneCurvesData*) mpe ->Data;\n        mpe = mpe -> Next;\n    }\n\n    // That should be all\n    if (mpe != NULL) {\n        cmsSignalError(mpe->ContextID, cmsERROR_UNKNOWN_EXTENSION, \"LUT is not suitable to be saved as LUT16\");\n        return FALSE;\n    }\n\n    InputChannels  = cmsPipelineInputChannels(NewLUT);\n    OutputChannels = cmsPipelineOutputChannels(NewLUT);\n\n    if (clut == NULL)\n        clutPoints = 0;\n    else\n        clutPoints    = clut->Params->nSamples[0];\n\n    if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) InputChannels)) return FALSE;\n    if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) OutputChannels)) return FALSE;\n    if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) clutPoints)) return FALSE;\n    if (!_cmsWriteUInt8Number(io, 0)) return FALSE; // Padding\n\n\n    if (MatMPE != NULL) {\n\n        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[0])) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[1])) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[2])) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[3])) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[4])) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[5])) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[6])) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[7])) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[8])) return FALSE;\n    }\n    else {\n\n        if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE;\n    }\n\n\n    if (PreMPE != NULL) {\n        if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) PreMPE ->TheCurves[0]->nEntries)) return FALSE;\n    } else {\n            if (!_cmsWriteUInt16Number(io, 2)) return FALSE;\n    }\n\n    if (PostMPE != NULL) {\n        if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) PostMPE ->TheCurves[0]->nEntries)) return FALSE;\n    } else {\n        if (!_cmsWriteUInt16Number(io, 2)) return FALSE;\n\n    }\n\n    // The prelinearization table\n\n    if (PreMPE != NULL) {\n        if (!Write16bitTables(self ->ContextID, io, PreMPE)) return FALSE;\n    }\n    else {\n        for (i=0; i < InputChannels; i++) {\n\n            if (!_cmsWriteUInt16Number(io, 0)) return FALSE;\n            if (!_cmsWriteUInt16Number(io, 0xffff)) return FALSE;\n        }\n    }\n\n    nTabSize = uipow(OutputChannels, clutPoints, InputChannels);\n    if (nTabSize == (cmsUInt32Number) -1) return FALSE;\n    if (nTabSize > 0) {\n        // The 3D CLUT.\n        if (clut != NULL) {\n            if (!_cmsWriteUInt16Array(io, nTabSize, clut->Tab.T)) return FALSE;\n        }\n    }\n\n    // The postlinearization table\n    if (PostMPE != NULL) {\n        if (!Write16bitTables(self ->ContextID, io, PostMPE)) return FALSE;\n    }\n    else {\n        for (i=0; i < OutputChannels; i++) {\n\n            if (!_cmsWriteUInt16Number(io, 0)) return FALSE;\n            if (!_cmsWriteUInt16Number(io, 0xffff)) return FALSE;\n        }\n    }\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(nItems);\n}\n\nstatic\nvoid* Type_LUT16_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)\n{\n    return (void*) cmsPipelineDup((cmsPipeline*) Ptr);\n\n    cmsUNUSED_PARAMETER(n);\n    cmsUNUSED_PARAMETER(self);\n}\n\nstatic\nvoid Type_LUT16_Free(struct _cms_typehandler_struct* self, void* Ptr)\n{\n    cmsPipelineFree((cmsPipeline*) Ptr);\n    return;\n\n    cmsUNUSED_PARAMETER(self);\n}\n\n\n// ********************************************************************************\n// Type cmsSigLutAToBType\n// ********************************************************************************\n\n\n// V4 stuff. Read matrix for LutAtoB and LutBtoA\n\nstatic\ncmsStage* ReadMatrix(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number Offset)\n{\n    cmsFloat64Number dMat[3*3];\n    cmsFloat64Number dOff[3];\n    cmsStage* Mat;\n\n    // Go to address\n    if (!io -> Seek(io, Offset)) return NULL;\n\n    // Read the Matrix\n    if (!_cmsRead15Fixed16Number(io, &dMat[0])) return NULL;\n    if (!_cmsRead15Fixed16Number(io, &dMat[1])) return NULL;\n    if (!_cmsRead15Fixed16Number(io, &dMat[2])) return NULL;\n    if (!_cmsRead15Fixed16Number(io, &dMat[3])) return NULL;\n    if (!_cmsRead15Fixed16Number(io, &dMat[4])) return NULL;\n    if (!_cmsRead15Fixed16Number(io, &dMat[5])) return NULL;\n    if (!_cmsRead15Fixed16Number(io, &dMat[6])) return NULL;\n    if (!_cmsRead15Fixed16Number(io, &dMat[7])) return NULL;\n    if (!_cmsRead15Fixed16Number(io, &dMat[8])) return NULL;\n\n    if (!_cmsRead15Fixed16Number(io, &dOff[0])) return NULL;\n    if (!_cmsRead15Fixed16Number(io, &dOff[1])) return NULL;\n    if (!_cmsRead15Fixed16Number(io, &dOff[2])) return NULL;\n\n    Mat = cmsStageAllocMatrix(self ->ContextID, 3, 3, dMat, dOff);\n\n     return Mat;\n}\n\n\n\n\n//  V4 stuff. Read CLUT part for LutAtoB and LutBtoA\n\nstatic\ncmsStage* ReadCLUT(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number Offset, int InputChannels, int OutputChannels)\n{\n    cmsUInt8Number  gridPoints8[cmsMAXCHANNELS]; // Number of grid points in each dimension.\n    cmsUInt32Number GridPoints[cmsMAXCHANNELS], i;\n    cmsUInt8Number  Precision;\n    cmsStage* CLUT;\n    _cmsStageCLutData* Data;\n\n    if (!io -> Seek(io, Offset)) return NULL;\n    if (io -> Read(io, gridPoints8, cmsMAXCHANNELS, 1) != 1) return NULL;\n\n\n    for (i=0; i < cmsMAXCHANNELS; i++) {\n\n        if (gridPoints8[i] == 1) return NULL; // Impossible value, 0 for no CLUT and then 2 at least\n        GridPoints[i] = gridPoints8[i];\n    }\n\n    if (!_cmsReadUInt8Number(io, &Precision)) return NULL;\n\n    if (!_cmsReadUInt8Number(io, NULL)) return NULL;\n    if (!_cmsReadUInt8Number(io, NULL)) return NULL;\n    if (!_cmsReadUInt8Number(io, NULL)) return NULL;\n\n    CLUT = cmsStageAllocCLut16bitGranular(self ->ContextID, GridPoints, InputChannels, OutputChannels, NULL);\n    if (CLUT == NULL) return NULL;\n\n    Data = (_cmsStageCLutData*) CLUT ->Data;\n\n    // Precision can be 1 or 2 bytes\n    if (Precision == 1) {\n\n        cmsUInt8Number  v;\n\n        for (i=0; i < Data ->nEntries; i++) {\n\n            if (io ->Read(io, &v, sizeof(cmsUInt8Number), 1) != 1) return NULL;\n            Data ->Tab.T[i] = FROM_8_TO_16(v);\n        }\n\n    }\n    else\n        if (Precision == 2) {\n\n            if (!_cmsReadUInt16Array(io, Data->nEntries, Data ->Tab.T)) {\n                cmsStageFree(CLUT);\n                return NULL;\n            }\n        }\n        else {\n            cmsStageFree(CLUT);\n            cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, \"Unknown precision of '%d'\", Precision);\n            return NULL;\n        }\n\n        return CLUT;\n}\n\nstatic\ncmsToneCurve* ReadEmbeddedCurve(struct _cms_typehandler_struct* self, cmsIOHANDLER* io)\n{\n    cmsTagTypeSignature  BaseType;\n    cmsUInt32Number nItems;\n\n    BaseType = _cmsReadTypeBase(io);\n    switch (BaseType) {\n\n            case cmsSigCurveType:\n                return (cmsToneCurve*) Type_Curve_Read(self, io, &nItems, 0);\n\n            case cmsSigParametricCurveType:\n                return (cmsToneCurve*) Type_ParametricCurve_Read(self, io, &nItems, 0);\n\n            default:\n                {\n                    char String[5];\n\n                    _cmsTagSignature2String(String, (cmsTagSignature) BaseType);\n                    cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, \"Unknown curve type '%s'\", String);\n                }\n                return NULL;\n    }\n}\n\n\n// Read a set of curves from specific offset\nstatic\ncmsStage* ReadSetOfCurves(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number Offset, cmsUInt32Number nCurves)\n{\n    cmsToneCurve* Curves[cmsMAXCHANNELS];\n    cmsUInt32Number i;\n    cmsStage* Lin = NULL;\n\n    if (nCurves > cmsMAXCHANNELS) return FALSE;\n\n    if (!io -> Seek(io, Offset)) return FALSE;\n\n    for (i=0; i < nCurves; i++)\n        Curves[i] = NULL;\n\n    for (i=0; i < nCurves; i++) {\n\n        Curves[i] = ReadEmbeddedCurve(self, io);\n        if (Curves[i] == NULL) goto Error;\n        if (!_cmsReadAlignment(io)) goto Error;\n\n    }\n\n    Lin = cmsStageAllocToneCurves(self ->ContextID, nCurves, Curves);\n\nError:\n    for (i=0; i < nCurves; i++)\n        cmsFreeToneCurve(Curves[i]);\n\n    return Lin;\n}\n\n\n// LutAtoB type\n\n// This structure represents a colour transform. The type contains up to five processing\n// elements which are stored in the AtoBTag tag in the following order: a set of one\n// dimensional curves, a 3 by 3 matrix with offset terms, a set of one dimensional curves,\n// a multidimensional lookup table, and a set of one dimensional output curves.\n// Data are processed using these elements via the following sequence:\n//\n//(\"A\" curves) -> (multidimensional lookup table - CLUT) -> (\"M\" curves) -> (matrix) -> (\"B\" curves).\n//\n/*\nIt is possible to use any or all of these processing elements. At least one processing element\nmust be included.Only the following combinations are allowed:\n\nB\nM - Matrix - B\nA - CLUT - B\nA - CLUT - M - Matrix - B\n\n*/\n\nstatic\nvoid* Type_LUTA2B_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    cmsUInt32Number      BaseOffset;\n    cmsUInt8Number       inputChan;      // Number of input channels\n    cmsUInt8Number       outputChan;     // Number of output channels\n    cmsUInt32Number      offsetB;        // Offset to first \"B\" curve\n    cmsUInt32Number      offsetMat;      // Offset to matrix\n    cmsUInt32Number      offsetM;        // Offset to first \"M\" curve\n    cmsUInt32Number      offsetC;        // Offset to CLUT\n    cmsUInt32Number      offsetA;        // Offset to first \"A\" curve\n    cmsPipeline* NewLUT = NULL;\n\n\n    BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);\n\n    if (!_cmsReadUInt8Number(io, &inputChan)) return NULL;\n    if (!_cmsReadUInt8Number(io, &outputChan)) return NULL;\n\n    if (!_cmsReadUInt16Number(io, NULL)) return NULL;\n\n    if (!_cmsReadUInt32Number(io, &offsetB)) return NULL;\n    if (!_cmsReadUInt32Number(io, &offsetMat)) return NULL;\n    if (!_cmsReadUInt32Number(io, &offsetM)) return NULL;\n    if (!_cmsReadUInt32Number(io, &offsetC)) return NULL;\n    if (!_cmsReadUInt32Number(io, &offsetA)) return NULL;\n\n   // Allocates an empty LUT\n    NewLUT = cmsPipelineAlloc(self ->ContextID, inputChan, outputChan);\n    if (NewLUT == NULL) return NULL;\n\n    if (offsetA!= 0) {\n        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetA, inputChan)))\n            goto Error;\n    }\n\n    if (offsetC != 0) {\n        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadCLUT(self, io, BaseOffset + offsetC, inputChan, outputChan)))\n            goto Error;\n    }\n\n    if (offsetM != 0) {\n        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetM, outputChan)))\n            goto Error;\n    }\n\n    if (offsetMat != 0) {\n        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadMatrix(self, io, BaseOffset + offsetMat)))\n            goto Error;\n    }\n\n    if (offsetB != 0) {\n        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetB, outputChan)))\n            goto Error;\n    }\n\n    *nItems = 1;\n    return NewLUT;\nError:\n    cmsPipelineFree(NewLUT);\n    return NULL;\n\n    cmsUNUSED_PARAMETER(SizeOfTag);\n}\n\n// Write a set of curves\nstatic\ncmsBool  WriteMatrix(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsStage* mpe)\n{\n    _cmsStageMatrixData* m = (_cmsStageMatrixData*) mpe -> Data;\n\n    // Write the Matrix\n    if (!_cmsWrite15Fixed16Number(io, m -> Double[0])) return FALSE;\n    if (!_cmsWrite15Fixed16Number(io, m -> Double[1])) return FALSE;\n    if (!_cmsWrite15Fixed16Number(io, m -> Double[2])) return FALSE;\n    if (!_cmsWrite15Fixed16Number(io, m -> Double[3])) return FALSE;\n    if (!_cmsWrite15Fixed16Number(io, m -> Double[4])) return FALSE;\n    if (!_cmsWrite15Fixed16Number(io, m -> Double[5])) return FALSE;\n    if (!_cmsWrite15Fixed16Number(io, m -> Double[6])) return FALSE;\n    if (!_cmsWrite15Fixed16Number(io, m -> Double[7])) return FALSE;\n    if (!_cmsWrite15Fixed16Number(io, m -> Double[8])) return FALSE;\n\n    if (m ->Offset != NULL) {\n\n    if (!_cmsWrite15Fixed16Number(io, m -> Offset[0])) return FALSE;\n    if (!_cmsWrite15Fixed16Number(io, m -> Offset[1])) return FALSE;\n    if (!_cmsWrite15Fixed16Number(io, m -> Offset[2])) return FALSE;\n    }\n    else {\n        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;\n\n    }\n\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(self);\n}\n\n\n// Write a set of curves\nstatic\ncmsBool WriteSetOfCurves(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsTagTypeSignature Type, cmsStage* mpe)\n{\n    cmsUInt32Number i, n;\n    cmsTagTypeSignature CurrentType;\n    cmsToneCurve** Curves;\n\n\n    n      = cmsStageOutputChannels(mpe);\n    Curves = _cmsStageGetPtrToCurveSet(mpe);\n\n    for (i=0; i < n; i++) {\n\n        // If this is a table-based curve, use curve type even on V4\n        CurrentType = Type;\n\n        if ((Curves[i] ->nSegments == 0)||\n            ((Curves[i]->nSegments == 2) && (Curves[i] ->Segments[1].Type == 0)) )\n            CurrentType = cmsSigCurveType;\n        else\n        if (Curves[i] ->Segments[0].Type < 0)\n            CurrentType = cmsSigCurveType;\n\n        if (!_cmsWriteTypeBase(io, CurrentType)) return FALSE;\n\n        switch (CurrentType) {\n\n            case cmsSigCurveType:\n                if (!Type_Curve_Write(self, io, Curves[i], 1)) return FALSE;\n                break;\n\n            case cmsSigParametricCurveType:\n                if (!Type_ParametricCurve_Write(self, io, Curves[i], 1)) return FALSE;\n                break;\n\n            default:\n                {\n                    char String[5];\n\n                    _cmsTagSignature2String(String, (cmsTagSignature) Type);\n                    cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, \"Unknown curve type '%s'\", String);\n                }\n                return FALSE;\n        }\n\n        if (!_cmsWriteAlignment(io)) return FALSE;\n    }\n\n\n    return TRUE;\n}\n\n\nstatic\ncmsBool WriteCLUT(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt8Number  Precision, cmsStage* mpe)\n{\n    cmsUInt8Number  gridPoints[cmsMAXCHANNELS]; // Number of grid points in each dimension.\n    cmsUInt32Number i;\n    _cmsStageCLutData* CLUT = ( _cmsStageCLutData*) mpe -> Data;\n\n    if (CLUT ->HasFloatValues) {\n         cmsSignalError(self ->ContextID, cmsERROR_NOT_SUITABLE, \"Cannot save floating point data, CLUT are 8 or 16 bit only\");\n         return FALSE;\n    }\n\n    memset(gridPoints, 0, sizeof(gridPoints));\n    for (i=0; i < (cmsUInt32Number) CLUT ->Params ->nInputs; i++)\n        gridPoints[i] = (cmsUInt8Number) CLUT ->Params ->nSamples[i];\n\n    if (!io -> Write(io, cmsMAXCHANNELS*sizeof(cmsUInt8Number), gridPoints)) return FALSE;\n\n    if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) Precision)) return FALSE;\n    if (!_cmsWriteUInt8Number(io, 0)) return FALSE;\n    if (!_cmsWriteUInt8Number(io, 0)) return FALSE;\n    if (!_cmsWriteUInt8Number(io, 0)) return FALSE;\n\n    // Precision can be 1 or 2 bytes\n    if (Precision == 1) {\n\n        for (i=0; i < CLUT->nEntries; i++) {\n\n            if (!_cmsWriteUInt8Number(io, FROM_16_TO_8(CLUT->Tab.T[i]))) return FALSE;\n        }\n    }\n    else\n        if (Precision == 2) {\n\n            if (!_cmsWriteUInt16Array(io, CLUT->nEntries, CLUT ->Tab.T)) return FALSE;\n        }\n        else {\n             cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, \"Unknown precision of '%d'\", Precision);\n            return FALSE;\n        }\n\n        if (!_cmsWriteAlignment(io)) return FALSE;\n\n        return TRUE;\n}\n\n\n\n\nstatic\ncmsBool Type_LUTA2B_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsPipeline* Lut = (cmsPipeline*) Ptr;\n    int inputChan, outputChan;\n    cmsStage *A = NULL, *B = NULL, *M = NULL;\n    cmsStage * Matrix = NULL;\n    cmsStage * CLUT = NULL;\n    cmsUInt32Number offsetB = 0, offsetMat = 0, offsetM = 0, offsetC = 0, offsetA = 0;\n    cmsUInt32Number BaseOffset, DirectoryPos, CurrentPos;\n\n    // Get the base for all offsets\n    BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);\n\n    if (Lut ->Elements != NULL)\n        if (!cmsPipelineCheckAndRetreiveStages(Lut, 1, cmsSigCurveSetElemType, &B))\n            if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, &M, &Matrix, &B))\n                if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, &A, &CLUT, &B))\n                    if (!cmsPipelineCheckAndRetreiveStages(Lut, 5, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType,\n                        cmsSigMatrixElemType, cmsSigCurveSetElemType, &A, &CLUT, &M, &Matrix, &B)) {\n\n                            cmsSignalError(self->ContextID, cmsERROR_NOT_SUITABLE, \"LUT is not suitable to be saved as LutAToB\");\n                            return FALSE;\n                    }\n\n    // Get input, output channels\n    inputChan  = cmsPipelineInputChannels(Lut);\n    outputChan = cmsPipelineOutputChannels(Lut);\n\n    // Write channel count\n    if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) inputChan)) return FALSE;\n    if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) outputChan)) return FALSE;\n    if (!_cmsWriteUInt16Number(io, 0)) return FALSE;\n\n    // Keep directory to be filled latter\n    DirectoryPos = io ->Tell(io);\n\n    // Write the directory\n    if (!_cmsWriteUInt32Number(io, 0)) return FALSE;\n    if (!_cmsWriteUInt32Number(io, 0)) return FALSE;\n    if (!_cmsWriteUInt32Number(io, 0)) return FALSE;\n    if (!_cmsWriteUInt32Number(io, 0)) return FALSE;\n    if (!_cmsWriteUInt32Number(io, 0)) return FALSE;\n\n    if (A != NULL) {\n\n        offsetA = io ->Tell(io) - BaseOffset;\n        if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, A)) return FALSE;\n    }\n\n    if (CLUT != NULL) {\n        offsetC = io ->Tell(io) - BaseOffset;\n        if (!WriteCLUT(self, io, Lut ->SaveAs8Bits ? 1 : 2, CLUT)) return FALSE;\n\n    }\n    if (M != NULL) {\n\n        offsetM = io ->Tell(io) - BaseOffset;\n        if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, M)) return FALSE;\n    }\n\n    if (Matrix != NULL) {\n        offsetMat = io ->Tell(io) - BaseOffset;\n        if (!WriteMatrix(self, io, Matrix)) return FALSE;\n    }\n\n    if (B != NULL) {\n\n        offsetB = io ->Tell(io) - BaseOffset;\n        if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, B)) return FALSE;\n    }\n\n    CurrentPos = io ->Tell(io);\n\n    if (!io ->Seek(io, DirectoryPos)) return FALSE;\n\n    if (!_cmsWriteUInt32Number(io, offsetB)) return FALSE;\n    if (!_cmsWriteUInt32Number(io, offsetMat)) return FALSE;\n    if (!_cmsWriteUInt32Number(io, offsetM)) return FALSE;\n    if (!_cmsWriteUInt32Number(io, offsetC)) return FALSE;\n    if (!_cmsWriteUInt32Number(io, offsetA)) return FALSE;\n\n    if (!io ->Seek(io, CurrentPos)) return FALSE;\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(nItems);\n}\n\n\nstatic\nvoid* Type_LUTA2B_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)\n{\n    return (void*) cmsPipelineDup((cmsPipeline*) Ptr);\n\n    cmsUNUSED_PARAMETER(n);\n    cmsUNUSED_PARAMETER(self);\n}\n\nstatic\nvoid Type_LUTA2B_Free(struct _cms_typehandler_struct* self, void* Ptr)\n{\n    cmsPipelineFree((cmsPipeline*) Ptr);\n    return;\n\n    cmsUNUSED_PARAMETER(self);\n}\n\n\n// LutBToA type\n\nstatic\nvoid* Type_LUTB2A_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    cmsUInt8Number       inputChan;      // Number of input channels\n    cmsUInt8Number       outputChan;     // Number of output channels\n    cmsUInt32Number      BaseOffset;     // Actual position in file\n    cmsUInt32Number      offsetB;        // Offset to first \"B\" curve\n    cmsUInt32Number      offsetMat;      // Offset to matrix\n    cmsUInt32Number      offsetM;        // Offset to first \"M\" curve\n    cmsUInt32Number      offsetC;        // Offset to CLUT\n    cmsUInt32Number      offsetA;        // Offset to first \"A\" curve\n    cmsPipeline* NewLUT = NULL;\n\n\n    BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);\n\n    if (!_cmsReadUInt8Number(io, &inputChan)) return NULL;\n    if (!_cmsReadUInt8Number(io, &outputChan)) return NULL;\n\n    // Padding\n    if (!_cmsReadUInt16Number(io, NULL)) return NULL;\n\n    if (!_cmsReadUInt32Number(io, &offsetB)) return NULL;\n    if (!_cmsReadUInt32Number(io, &offsetMat)) return NULL;\n    if (!_cmsReadUInt32Number(io, &offsetM)) return NULL;\n    if (!_cmsReadUInt32Number(io, &offsetC)) return NULL;\n    if (!_cmsReadUInt32Number(io, &offsetA)) return NULL;\n\n    // Allocates an empty LUT\n    NewLUT = cmsPipelineAlloc(self ->ContextID, inputChan, outputChan);\n    if (NewLUT == NULL) return NULL;\n\n    if (offsetB != 0) {\n        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetB, inputChan)))\n            goto Error;\n    }\n\n    if (offsetMat != 0) {\n        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadMatrix(self, io, BaseOffset + offsetMat)))\n            goto Error;\n    }\n\n    if (offsetM != 0) {\n        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetM, inputChan)))\n            goto Error;\n    }\n\n    if (offsetC != 0) {\n        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadCLUT(self, io, BaseOffset + offsetC, inputChan, outputChan)))\n            goto Error;\n    }\n\n    if (offsetA!= 0) {\n        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetA, outputChan)))\n            goto Error;\n    }\n\n    *nItems = 1;\n    return NewLUT;\nError:\n    cmsPipelineFree(NewLUT);\n    return NULL;\n\n    cmsUNUSED_PARAMETER(SizeOfTag);\n}\n\n\n/*\nB\nB - Matrix - M\nB - CLUT - A\nB - Matrix - M - CLUT - A\n*/\n\nstatic\ncmsBool  Type_LUTB2A_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsPipeline* Lut = (cmsPipeline*) Ptr;\n    int inputChan, outputChan;\n    cmsStage *A = NULL, *B = NULL, *M = NULL;\n    cmsStage *Matrix = NULL;\n    cmsStage *CLUT = NULL;\n    cmsUInt32Number offsetB = 0, offsetMat = 0, offsetM = 0, offsetC = 0, offsetA = 0;\n    cmsUInt32Number BaseOffset, DirectoryPos, CurrentPos;\n\n\n    BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);\n\n    if (!cmsPipelineCheckAndRetreiveStages(Lut, 1, cmsSigCurveSetElemType, &B))\n        if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, &B, &Matrix, &M))\n            if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, &B, &CLUT, &A))\n                if (!cmsPipelineCheckAndRetreiveStages(Lut, 5, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType,\n                    cmsSigCLutElemType, cmsSigCurveSetElemType, &B, &Matrix, &M, &CLUT, &A)) {\n                        cmsSignalError(self->ContextID, cmsERROR_NOT_SUITABLE, \"LUT is not suitable to be saved as LutBToA\");\n                        return FALSE;\n                }\n\n    inputChan  = cmsPipelineInputChannels(Lut);\n    outputChan = cmsPipelineOutputChannels(Lut);\n\n    if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) inputChan)) return FALSE;\n    if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) outputChan)) return FALSE;\n    if (!_cmsWriteUInt16Number(io, 0)) return FALSE;\n\n    DirectoryPos = io ->Tell(io);\n\n    if (!_cmsWriteUInt32Number(io, 0)) return FALSE;\n    if (!_cmsWriteUInt32Number(io, 0)) return FALSE;\n    if (!_cmsWriteUInt32Number(io, 0)) return FALSE;\n    if (!_cmsWriteUInt32Number(io, 0)) return FALSE;\n    if (!_cmsWriteUInt32Number(io, 0)) return FALSE;\n\n    if (A != NULL) {\n\n        offsetA = io ->Tell(io) - BaseOffset;\n        if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, A)) return FALSE;\n    }\n\n    if (CLUT != NULL) {\n        offsetC = io ->Tell(io) - BaseOffset;\n        if (!WriteCLUT(self, io, Lut ->SaveAs8Bits ? 1 : 2, CLUT)) return FALSE;\n\n    }\n    if (M != NULL) {\n\n        offsetM = io ->Tell(io) - BaseOffset;\n        if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, M)) return FALSE;\n    }\n\n    if (Matrix != NULL) {\n        offsetMat = io ->Tell(io) - BaseOffset;\n        if (!WriteMatrix(self, io, Matrix)) return FALSE;\n    }\n\n    if (B != NULL) {\n\n        offsetB = io ->Tell(io) - BaseOffset;\n        if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, B)) return FALSE;\n    }\n\n    CurrentPos = io ->Tell(io);\n\n    if (!io ->Seek(io, DirectoryPos)) return FALSE;\n\n    if (!_cmsWriteUInt32Number(io, offsetB)) return FALSE;\n    if (!_cmsWriteUInt32Number(io, offsetMat)) return FALSE;\n    if (!_cmsWriteUInt32Number(io, offsetM)) return FALSE;\n    if (!_cmsWriteUInt32Number(io, offsetC)) return FALSE;\n    if (!_cmsWriteUInt32Number(io, offsetA)) return FALSE;\n\n    if (!io ->Seek(io, CurrentPos)) return FALSE;\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(nItems);\n}\n\n\n\nstatic\nvoid* Type_LUTB2A_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)\n{\n    return (void*) cmsPipelineDup((cmsPipeline*) Ptr);\n\n    cmsUNUSED_PARAMETER(n);\n    cmsUNUSED_PARAMETER(self);\n}\n\nstatic\nvoid Type_LUTB2A_Free(struct _cms_typehandler_struct* self, void* Ptr)\n{\n    cmsPipelineFree((cmsPipeline*) Ptr);\n    return;\n\n    cmsUNUSED_PARAMETER(self);\n}\n\n\n\n// ********************************************************************************\n// Type cmsSigColorantTableType\n// ********************************************************************************\n/*\nThe purpose of this tag is to identify the colorants used in the profile by a\nunique name and set of XYZ or L*a*b* values to give the colorant an unambiguous\nvalue. The first colorant listed is the colorant of the first device channel of\na lut tag. The second colorant listed is the colorant of the second device channel\nof a lut tag, and so on.\n*/\n\nstatic\nvoid *Type_ColorantTable_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    cmsUInt32Number i, Count;\n    cmsNAMEDCOLORLIST* List;\n    char Name[34];\n    cmsUInt16Number PCS[3];\n\n\n    if (!_cmsReadUInt32Number(io, &Count)) return NULL;\n\n    if (Count > cmsMAXCHANNELS) {\n        cmsSignalError(self->ContextID, cmsERROR_RANGE, \"Too many colorants '%d'\", Count);\n        return NULL;\n    }\n\n    List = cmsAllocNamedColorList(self ->ContextID, Count, 0, \"\", \"\");\n    for (i=0; i < Count; i++) {\n\n        if (io ->Read(io, Name, 32, 1) != 1) goto Error;\n        Name[33] = 0;\n\n        if (!_cmsReadUInt16Array(io, 3, PCS)) goto Error;\n\n        if (!cmsAppendNamedColor(List, Name, PCS, NULL)) goto Error;\n\n    }\n\n    *nItems = 1;\n    return List;\n\nError:\n    *nItems = 0;\n    cmsFreeNamedColorList(List);\n    return NULL;\n\n    cmsUNUSED_PARAMETER(SizeOfTag);\n}\n\n\n\n// Saves a colorant table. It is using the named color structure for simplicity sake\nstatic\ncmsBool  Type_ColorantTable_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsNAMEDCOLORLIST* NamedColorList = (cmsNAMEDCOLORLIST*) Ptr;\n    int i, nColors;\n\n    nColors = cmsNamedColorCount(NamedColorList);\n\n    if (!_cmsWriteUInt32Number(io, nColors)) return FALSE;\n\n    for (i=0; i < nColors; i++) {\n\n        char root[33];\n        cmsUInt16Number PCS[3];\n\n        if (!cmsNamedColorInfo(NamedColorList, i, root, NULL, NULL, PCS, NULL)) return 0;\n        root[32] = 0;\n\n        if (!io ->Write(io, 32, root)) return FALSE;\n        if (!_cmsWriteUInt16Array(io, 3, PCS)) return FALSE;\n    }\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(nItems);\n    cmsUNUSED_PARAMETER(self);\n}\n\n\nstatic\nvoid* Type_ColorantTable_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n)\n{\n    cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*) Ptr;\n    return (void*) cmsDupNamedColorList(nc);\n\n    cmsUNUSED_PARAMETER(n);\n    cmsUNUSED_PARAMETER(self);\n}\n\n\nstatic\nvoid Type_ColorantTable_Free(struct _cms_typehandler_struct* self, void* Ptr)\n{\n    cmsFreeNamedColorList((cmsNAMEDCOLORLIST*) Ptr);\n    return;\n\n    cmsUNUSED_PARAMETER(self);\n}\n\n\n// ********************************************************************************\n// Type cmsSigNamedColor2Type\n// ********************************************************************************\n//\n//The namedColor2Type is a count value and array of structures that provide color\n//coordinates for 7-bit ASCII color names. For each named color, a PCS and optional\n//device representation of the color are given. Both representations are 16-bit values.\n//The device representation corresponds to the headers color space of data?field.\n//This representation should be consistent with the number of device components?//field in the namedColor2Type. If this field is 0, device coordinates are not provided.\n//The PCS representation corresponds to the headers PCS field. The PCS representation\n//is always provided. Color names are fixed-length, 32-byte fields including null\n//termination. In order to maintain maximum portability, it is strongly recommended\n//that special characters of the 7-bit ASCII set not be used.\n\nstatic\nvoid *Type_NamedColor_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n\n    cmsUInt32Number      vendorFlag;     // Bottom 16 bits for ICC use\n    cmsUInt32Number      count;          // Count of named colors\n    cmsUInt32Number      nDeviceCoords;  // Num of device coordinates\n    char                 prefix[32];     // Prefix for each color name\n    char                 suffix[32];     // Suffix for each color name\n    cmsNAMEDCOLORLIST*  v;\n    cmsUInt32Number i;\n\n\n    *nItems = 0;\n    if (!_cmsReadUInt32Number(io, &vendorFlag)) return NULL;\n    if (!_cmsReadUInt32Number(io, &count)) return NULL;\n    if (!_cmsReadUInt32Number(io, &nDeviceCoords)) return NULL;\n\n    if (io -> Read(io, prefix, 32, 1) != 1) return NULL;\n    if (io -> Read(io, suffix, 32, 1) != 1) return NULL;\n\n    prefix[31] = suffix[31] = 0;\n\n    v = cmsAllocNamedColorList(self ->ContextID, count, nDeviceCoords, prefix, suffix);\n    if (v == NULL) {\n        cmsSignalError(self->ContextID, cmsERROR_RANGE, \"Too many named colors '%d'\", count);\n        return NULL;\n    }\n\n    if (nDeviceCoords > cmsMAXCHANNELS) {\n        cmsSignalError(self->ContextID, cmsERROR_RANGE, \"Too many device coordinates '%d'\", nDeviceCoords);\n        return 0;\n    }\n    for (i=0; i < count; i++) {\n\n        cmsUInt16Number PCS[3];\n        cmsUInt16Number Colorant[cmsMAXCHANNELS];\n        char Root[33];\n\n        memset(Colorant, 0, sizeof(Colorant));\n        if (io -> Read(io, Root, 32, 1) != 1) return NULL;\n        if (!_cmsReadUInt16Array(io, 3, PCS)) goto Error;\n        if (!_cmsReadUInt16Array(io, nDeviceCoords, Colorant)) goto Error;\n\n        if (!cmsAppendNamedColor(v, Root, PCS, Colorant)) goto Error;\n    }\n\n    *nItems = 1;\n    return (void*) v ;\n\nError:\n    cmsFreeNamedColorList(v);\n    return NULL;\n\n    cmsUNUSED_PARAMETER(SizeOfTag);\n}\n\n\n// Saves a named color list into a named color profile\nstatic\ncmsBool Type_NamedColor_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsNAMEDCOLORLIST* NamedColorList = (cmsNAMEDCOLORLIST*) Ptr;\n    char                prefix[32];     // Prefix for each color name\n    char                suffix[32];     // Suffix for each color name\n    int i, nColors;\n\n    nColors = cmsNamedColorCount(NamedColorList);\n\n    if (!_cmsWriteUInt32Number(io, 0)) return FALSE;\n    if (!_cmsWriteUInt32Number(io, nColors)) return FALSE;\n    if (!_cmsWriteUInt32Number(io, NamedColorList ->ColorantCount)) return FALSE;\n\n    strncpy(prefix, (const char*) NamedColorList->Prefix, 32);\n    strncpy(suffix, (const char*) NamedColorList->Suffix, 32);\n\n    suffix[31] = prefix[31] = 0;\n\n    if (!io ->Write(io, 32, prefix)) return FALSE;\n    if (!io ->Write(io, 32, suffix)) return FALSE;\n\n    for (i=0; i < nColors; i++) {\n\n       cmsUInt16Number PCS[3];\n       cmsUInt16Number Colorant[cmsMAXCHANNELS];\n       char Root[33];\n\n        if (!cmsNamedColorInfo(NamedColorList, i, Root, NULL, NULL, PCS, Colorant)) return 0;\n        if (!io ->Write(io, 32 , Root)) return FALSE;\n        if (!_cmsWriteUInt16Array(io, 3, PCS)) return FALSE;\n        if (!_cmsWriteUInt16Array(io, NamedColorList ->ColorantCount, Colorant)) return FALSE;\n    }\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(nItems);\n    cmsUNUSED_PARAMETER(self);\n}\n\nstatic\nvoid* Type_NamedColor_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n)\n{\n    cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*) Ptr;\n\n    return (void*) cmsDupNamedColorList(nc);\n\n    cmsUNUSED_PARAMETER(n);\n    cmsUNUSED_PARAMETER(self);\n}\n\n\nstatic\nvoid Type_NamedColor_Free(struct _cms_typehandler_struct* self, void* Ptr)\n{\n    cmsFreeNamedColorList((cmsNAMEDCOLORLIST*) Ptr);\n    return;\n\n    cmsUNUSED_PARAMETER(self);\n}\n\n\n// ********************************************************************************\n// Type cmsSigProfileSequenceDescType\n// ********************************************************************************\n\n// This type is an array of structures, each of which contains information from the\n// header fields and tags from the original profiles which were combined to create\n// the final profile. The order of the structures is the order in which the profiles\n// were combined and includes a structure for the final profile. This provides a\n// description of the profile sequence from source to destination,\n// typically used with the DeviceLink profile.\n\nstatic\ncmsBool ReadEmbeddedText(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU** mlu, cmsUInt32Number SizeOfTag)\n{\n    cmsTagTypeSignature  BaseType;\n    cmsUInt32Number nItems;\n\n    BaseType = _cmsReadTypeBase(io);\n\n    switch (BaseType) {\n\n       case cmsSigTextType:\n           if (*mlu) cmsMLUfree(*mlu);\n           *mlu = (cmsMLU*)Type_Text_Read(self, io, &nItems, SizeOfTag);\n           return (*mlu != NULL);\n\n       case cmsSigTextDescriptionType:\n           if (*mlu) cmsMLUfree(*mlu);\n           *mlu =  (cmsMLU*) Type_Text_Description_Read(self, io, &nItems, SizeOfTag);\n           return (*mlu != NULL);\n\n           /*\n           TBD: Size is needed for MLU, and we have no idea on which is the available size\n           */\n\n       case cmsSigMultiLocalizedUnicodeType:\n           if (*mlu) cmsMLUfree(*mlu);\n           *mlu =  (cmsMLU*) Type_MLU_Read(self, io, &nItems, SizeOfTag);\n           return (*mlu != NULL);\n\n       default: return FALSE;\n    }\n}\n\n\nstatic\nvoid *Type_ProfileSequenceDesc_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    cmsSEQ* OutSeq;\n    cmsUInt32Number i, Count;\n\n    *nItems = 0;\n\n    if (!_cmsReadUInt32Number(io, &Count)) return NULL;\n\n    if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL;\n    SizeOfTag -= sizeof(cmsUInt32Number);\n\n\n    OutSeq = cmsAllocProfileSequenceDescription(self ->ContextID, Count);\n    if (OutSeq == NULL) return NULL;\n\n    OutSeq ->n = Count;\n\n    // Get structures as well\n\n    for (i=0; i < Count; i++) {\n\n        cmsPSEQDESC* sec = &OutSeq -> seq[i];\n\n        if (!_cmsReadUInt32Number(io, &sec ->deviceMfg)) goto Error;\n        if (SizeOfTag < sizeof(cmsUInt32Number)) goto Error;\n        SizeOfTag -= sizeof(cmsUInt32Number);\n\n        if (!_cmsReadUInt32Number(io, &sec ->deviceModel)) goto Error;\n        if (SizeOfTag < sizeof(cmsUInt32Number)) goto Error;\n        SizeOfTag -= sizeof(cmsUInt32Number);\n\n        if (!_cmsReadUInt64Number(io, &sec ->attributes)) goto Error;\n        if (SizeOfTag < sizeof(cmsUInt64Number)) goto Error;\n        SizeOfTag -= sizeof(cmsUInt64Number);\n\n        if (!_cmsReadUInt32Number(io, (cmsUInt32Number *)&sec ->technology)) goto Error;\n        if (SizeOfTag < sizeof(cmsUInt32Number)) goto Error;\n        SizeOfTag -= sizeof(cmsUInt32Number);\n\n        if (!ReadEmbeddedText(self, io, &sec ->Manufacturer, SizeOfTag)) goto Error;\n        if (!ReadEmbeddedText(self, io, &sec ->Model, SizeOfTag)) goto Error;\n    }\n\n    *nItems = 1;\n    return OutSeq;\n\nError:\n    cmsFreeProfileSequenceDescription(OutSeq);\n    return NULL;\n}\n\n\n// Aux--Embed a text description type. It can be of type text description or multilocalized unicode\n// and it depends of the version number passed on cmsTagDescriptor structure instead of stack\nstatic\ncmsBool  SaveDescription(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU* Text)\n{\n    if (self ->ICCVersion < 0x4000000) {\n\n        if (!_cmsWriteTypeBase(io, cmsSigTextDescriptionType)) return FALSE;\n        return Type_Text_Description_Write(self, io, Text, 1);\n    }\n    else {\n        if (!_cmsWriteTypeBase(io, cmsSigMultiLocalizedUnicodeType)) return FALSE;\n        return Type_MLU_Write(self, io, Text, 1);\n    }\n}\n\n\nstatic\ncmsBool  Type_ProfileSequenceDesc_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsSEQ* Seq = (cmsSEQ*) Ptr;\n    cmsUInt32Number i;\n\n    if (!_cmsWriteUInt32Number(io, Seq->n)) return FALSE;\n\n    for (i=0; i < Seq ->n; i++) {\n\n        cmsPSEQDESC* sec = &Seq -> seq[i];\n\n        if (!_cmsWriteUInt32Number(io, sec ->deviceMfg)) return FALSE;\n        if (!_cmsWriteUInt32Number(io, sec ->deviceModel)) return FALSE;\n        if (!_cmsWriteUInt64Number(io, &sec ->attributes)) return FALSE;\n        if (!_cmsWriteUInt32Number(io, sec ->technology)) return FALSE;\n\n        if (!SaveDescription(self, io, sec ->Manufacturer)) return FALSE;\n        if (!SaveDescription(self, io, sec ->Model)) return FALSE;\n    }\n\n     return TRUE;\n\n     cmsUNUSED_PARAMETER(nItems);\n}\n\n\nstatic\nvoid* Type_ProfileSequenceDesc_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n)\n{\n    return (void*) cmsDupProfileSequenceDescription((cmsSEQ*) Ptr);\n\n    cmsUNUSED_PARAMETER(n);\n    cmsUNUSED_PARAMETER(self);\n}\n\nstatic\nvoid Type_ProfileSequenceDesc_Free(struct _cms_typehandler_struct* self, void* Ptr)\n{\n    cmsFreeProfileSequenceDescription((cmsSEQ*) Ptr);\n    return;\n\n    cmsUNUSED_PARAMETER(self);\n}\n\n\n// ********************************************************************************\n// Type cmsSigProfileSequenceIdType\n// ********************************************************************************\n/*\nIn certain workflows using ICC Device Link Profiles, it is necessary to identify the\noriginal profiles that were combined to create the Device Link Profile.\nThis type is an array of structures, each of which contains information for\nidentification of a profile used in a sequence\n*/\n\n\nstatic\ncmsBool ReadSeqID(struct _cms_typehandler_struct* self,\n                                             cmsIOHANDLER* io,\n                                             void* Cargo,\n                                             cmsUInt32Number n,\n                                             cmsUInt32Number SizeOfTag)\n{\n    cmsSEQ* OutSeq = (cmsSEQ*) Cargo;\n    cmsPSEQDESC* seq = &OutSeq ->seq[n];\n\n    if (io -> Read(io, seq ->ProfileID.ID8, 16, 1) != 1) return FALSE;\n    if (!ReadEmbeddedText(self, io, &seq ->Description, SizeOfTag)) return FALSE;\n\n    return TRUE;\n}\n\n\n\nstatic\nvoid *Type_ProfileSequenceId_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    cmsSEQ* OutSeq;\n    cmsUInt32Number Count;\n    cmsUInt32Number BaseOffset;\n\n    *nItems = 0;\n\n    // Get actual position as a basis for element offsets\n    BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);\n\n    // Get table count\n    if (!_cmsReadUInt32Number(io, &Count)) return NULL;\n    SizeOfTag -= sizeof(cmsUInt32Number);\n\n    // Allocate an empty structure\n    OutSeq = cmsAllocProfileSequenceDescription(self ->ContextID, Count);\n    if (OutSeq == NULL) return NULL;\n\n\n    // Read the position table\n    if (!ReadPositionTable(self, io, Count, BaseOffset, OutSeq, ReadSeqID)) {\n\n        cmsFreeProfileSequenceDescription(OutSeq);\n        return NULL;\n    }\n\n    // Success\n    *nItems = 1;\n    return OutSeq;\n\n}\n\n\nstatic\ncmsBool WriteSeqID(struct _cms_typehandler_struct* self,\n                                             cmsIOHANDLER* io,\n                                             void* Cargo,\n                                             cmsUInt32Number n,\n                                             cmsUInt32Number SizeOfTag)\n{\n    cmsSEQ* Seq = (cmsSEQ*) Cargo;\n\n    if (!io ->Write(io, 16, Seq ->seq[n].ProfileID.ID8)) return FALSE;\n\n    // Store here the MLU\n    if (!SaveDescription(self, io, Seq ->seq[n].Description)) return FALSE;\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(SizeOfTag);\n}\n\nstatic\ncmsBool  Type_ProfileSequenceId_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsSEQ* Seq = (cmsSEQ*) Ptr;\n    cmsUInt32Number BaseOffset;\n\n    // Keep the base offset\n    BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);\n\n    // This is the table count\n    if (!_cmsWriteUInt32Number(io, Seq ->n)) return FALSE;\n\n    // This is the position table and content\n    if (!WritePositionTable(self, io, 0, Seq ->n, BaseOffset, Seq, WriteSeqID)) return FALSE;\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(nItems);\n}\n\nstatic\nvoid* Type_ProfileSequenceId_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n)\n{\n    return (void*) cmsDupProfileSequenceDescription((cmsSEQ*) Ptr);\n\n    cmsUNUSED_PARAMETER(n);\n    cmsUNUSED_PARAMETER(self);\n}\n\nstatic\nvoid Type_ProfileSequenceId_Free(struct _cms_typehandler_struct* self, void* Ptr)\n{\n    cmsFreeProfileSequenceDescription((cmsSEQ*) Ptr);\n    return;\n\n    cmsUNUSED_PARAMETER(self);\n}\n\n\n// ********************************************************************************\n// Type cmsSigUcrBgType\n// ********************************************************************************\n/*\nThis type contains curves representing the under color removal and black\ngeneration and a text string which is a general description of the method used\nfor the ucr/bg.\n*/\n\nstatic\nvoid *Type_UcrBg_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    cmsUcrBg* n = (cmsUcrBg*) _cmsMallocZero(self ->ContextID, sizeof(cmsUcrBg));\n    cmsUInt32Number CountUcr, CountBg;\n    char* ASCIIString;\n\n    *nItems = 0;\n    if (n == NULL) return NULL;\n\n    // First curve is Under color removal\n    if (!_cmsReadUInt32Number(io, &CountUcr)) return NULL;\n    if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL;\n    SizeOfTag -= sizeof(cmsUInt32Number);\n\n    n ->Ucr = cmsBuildTabulatedToneCurve16(self ->ContextID, CountUcr, NULL);\n    if (n ->Ucr == NULL) return NULL;\n\n    if (!_cmsReadUInt16Array(io, CountUcr, n ->Ucr->Table16)) return NULL;\n    if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL;\n    SizeOfTag -= CountUcr * sizeof(cmsUInt16Number);\n\n    // Second curve is Black generation\n    if (!_cmsReadUInt32Number(io, &CountBg)) return NULL;\n    if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL;\n    SizeOfTag -= sizeof(cmsUInt32Number);\n\n    n ->Bg = cmsBuildTabulatedToneCurve16(self ->ContextID, CountBg, NULL);\n    if (n ->Bg == NULL) return NULL;\n    if (!_cmsReadUInt16Array(io, CountBg, n ->Bg->Table16)) return NULL;\n    if (SizeOfTag < CountBg * sizeof(cmsUInt16Number)) return NULL;\n    SizeOfTag -= CountBg * sizeof(cmsUInt16Number);\n    if (SizeOfTag == UINT_MAX) return NULL;\n\n    // Now comes the text. The length is specified by the tag size\n    n ->Desc = cmsMLUalloc(self ->ContextID, 1);\n    if (n ->Desc == NULL) return NULL;\n\n    ASCIIString = (char*) _cmsMalloc(self ->ContextID, SizeOfTag + 1);\n    if (io ->Read(io, ASCIIString, sizeof(char), SizeOfTag) != SizeOfTag) return NULL;\n    ASCIIString[SizeOfTag] = 0;\n    cmsMLUsetASCII(n ->Desc, cmsNoLanguage, cmsNoCountry, ASCIIString);\n    _cmsFree(self ->ContextID, ASCIIString);\n\n    *nItems = 1;\n    return (void*) n;\n}\n\nstatic\ncmsBool  Type_UcrBg_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsUcrBg* Value = (cmsUcrBg*) Ptr;\n    cmsUInt32Number TextSize;\n    char* Text;\n\n    // First curve is Under color removal\n    if (!_cmsWriteUInt32Number(io, Value ->Ucr ->nEntries)) return FALSE;\n    if (!_cmsWriteUInt16Array(io, Value ->Ucr ->nEntries, Value ->Ucr ->Table16)) return FALSE;\n\n    // Then black generation\n    if (!_cmsWriteUInt32Number(io, Value ->Bg ->nEntries)) return FALSE;\n    if (!_cmsWriteUInt16Array(io, Value ->Bg ->nEntries, Value ->Bg ->Table16)) return FALSE;\n\n    // Now comes the text. The length is specified by the tag size\n    TextSize = cmsMLUgetASCII(Value ->Desc, cmsNoLanguage, cmsNoCountry, NULL, 0);\n    Text     = (char*) _cmsMalloc(self ->ContextID, TextSize);\n    if (cmsMLUgetASCII(Value ->Desc, cmsNoLanguage, cmsNoCountry, Text, TextSize) != TextSize) return FALSE;\n\n    if (!io ->Write(io, TextSize, Text)) return FALSE;\n    _cmsFree(self ->ContextID, Text);\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(nItems);\n}\n\nstatic\nvoid* Type_UcrBg_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)\n{\n    cmsUcrBg* Src = (cmsUcrBg*) Ptr;\n    cmsUcrBg* NewUcrBg = (cmsUcrBg*) _cmsMallocZero(self ->ContextID, sizeof(cmsUcrBg));\n\n    if (NewUcrBg == NULL) return NULL;\n\n    NewUcrBg ->Bg   = cmsDupToneCurve(Src ->Bg);\n    NewUcrBg ->Ucr  = cmsDupToneCurve(Src ->Ucr);\n    NewUcrBg ->Desc = cmsMLUdup(Src ->Desc);\n\n    return (void*) NewUcrBg;\n\n    cmsUNUSED_PARAMETER(n);\n}\n\nstatic\nvoid Type_UcrBg_Free(struct _cms_typehandler_struct* self, void *Ptr)\n{\n   cmsUcrBg* Src = (cmsUcrBg*) Ptr;\n\n   if (Src ->Ucr) cmsFreeToneCurve(Src ->Ucr);\n   if (Src ->Bg)  cmsFreeToneCurve(Src ->Bg);\n   if (Src ->Desc) cmsMLUfree(Src ->Desc);\n\n   _cmsFree(self ->ContextID, Ptr);\n}\n\n// ********************************************************************************\n// Type cmsSigCrdInfoType\n// ********************************************************************************\n\n/*\nThis type contains the PostScript product name to which this profile corresponds\nand the names of the companion CRDs. Recall that a single profile can generate\nmultiple CRDs. It is implemented as a MLU being the language code \"PS\" and then\ncountry varies for each element:\n\n                nm: PostScript product name\n                #0: Rendering intent 0 CRD name\n                #1: Rendering intent 1 CRD name\n                #2: Rendering intent 2 CRD name\n                #3: Rendering intent 3 CRD name\n*/\n\n\n\n// Auxiliar, read an string specified as count + string\nstatic\ncmsBool  ReadCountAndSting(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU* mlu, cmsUInt32Number* SizeOfTag, const char* Section)\n{\n    cmsUInt32Number Count;\n    char* Text;\n\n    if (*SizeOfTag < sizeof(cmsUInt32Number)) return FALSE;\n\n    if (!_cmsReadUInt32Number(io, &Count)) return FALSE;\n\n    if (Count > UINT_MAX - sizeof(cmsUInt32Number)) return FALSE;\n    if (*SizeOfTag < Count + sizeof(cmsUInt32Number)) return FALSE;\n\n    Text     = (char*) _cmsMalloc(self ->ContextID, Count+1);\n    if (Text == NULL) return FALSE;\n\n    if (io ->Read(io, Text, sizeof(cmsUInt8Number), Count) != Count) {\n        _cmsFree(self ->ContextID, Text);\n        return FALSE;\n    }\n\n    Text[Count] = 0;\n\n    cmsMLUsetASCII(mlu, \"PS\", Section, Text);\n    _cmsFree(self ->ContextID, Text);\n\n    *SizeOfTag -= (Count + sizeof(cmsUInt32Number));\n    return TRUE;\n}\n\nstatic\ncmsBool  WriteCountAndSting(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU* mlu, const char* Section)\n{\n cmsUInt32Number TextSize;\n char* Text;\n\n    TextSize = cmsMLUgetASCII(mlu, \"PS\", Section, NULL, 0);\n    Text     = (char*) _cmsMalloc(self ->ContextID, TextSize);\n\n    if (!_cmsWriteUInt32Number(io, TextSize)) return FALSE;\n\n    if (cmsMLUgetASCII(mlu, \"PS\", Section, Text, TextSize) == 0) return FALSE;\n\n    if (!io ->Write(io, TextSize, Text)) return FALSE;\n    _cmsFree(self ->ContextID, Text);\n\n    return TRUE;\n}\n\nstatic\nvoid *Type_CrdInfo_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    cmsMLU* mlu = cmsMLUalloc(self ->ContextID, 5);\n\n    *nItems = 0;\n    if (!ReadCountAndSting(self, io, mlu, &SizeOfTag, \"nm\")) goto Error;\n    if (!ReadCountAndSting(self, io, mlu, &SizeOfTag, \"#0\")) goto Error;\n    if (!ReadCountAndSting(self, io, mlu, &SizeOfTag, \"#1\")) goto Error;\n    if (!ReadCountAndSting(self, io, mlu, &SizeOfTag, \"#2\")) goto Error;\n    if (!ReadCountAndSting(self, io, mlu, &SizeOfTag, \"#3\")) goto Error;\n\n    *nItems = 1;\n    return (void*) mlu;\n\nError:\n    cmsMLUfree(mlu);\n    return NULL;\n\n}\n\nstatic\ncmsBool  Type_CrdInfo_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n\n    cmsMLU* mlu = (cmsMLU*) Ptr;\n\n    if (!WriteCountAndSting(self, io, mlu, \"nm\")) goto Error;\n    if (!WriteCountAndSting(self, io, mlu, \"#0\")) goto Error;\n    if (!WriteCountAndSting(self, io, mlu, \"#1\")) goto Error;\n    if (!WriteCountAndSting(self, io, mlu, \"#2\")) goto Error;\n    if (!WriteCountAndSting(self, io, mlu, \"#3\")) goto Error;\n\n    return TRUE;\n\nError:\n    return FALSE;\n\n    cmsUNUSED_PARAMETER(nItems);\n}\n\n\nstatic\nvoid* Type_CrdInfo_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)\n{\n    return (void*) cmsMLUdup((cmsMLU*) Ptr);\n\n    cmsUNUSED_PARAMETER(n);\n    cmsUNUSED_PARAMETER(self);\n}\n\nstatic\nvoid Type_CrdInfo_Free(struct _cms_typehandler_struct* self, void *Ptr)\n{\n    cmsMLUfree((cmsMLU*) Ptr);\n    return;\n\n    cmsUNUSED_PARAMETER(self);\n}\n\n// ********************************************************************************\n// Type cmsSigScreeningType\n// ********************************************************************************\n//\n//The screeningType describes various screening parameters including screen\n//frequency, screening angle, and spot shape.\n\nstatic\nvoid *Type_Screening_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    cmsScreening* sc = NULL;\n    cmsUInt32Number i;\n\n    sc = (cmsScreening*) _cmsMallocZero(self ->ContextID, sizeof(cmsScreening));\n    if (sc == NULL) return NULL;\n\n    *nItems = 0;\n\n    if (!_cmsReadUInt32Number(io, &sc ->Flag)) goto Error;\n    if (!_cmsReadUInt32Number(io, &sc ->nChannels)) goto Error;\n\n    if (sc ->nChannels > cmsMAXCHANNELS - 1)\n        sc ->nChannels = cmsMAXCHANNELS - 1;\n\n    for (i=0; i < sc ->nChannels; i++) {\n\n        if (!_cmsRead15Fixed16Number(io, &sc ->Channels[i].Frequency)) goto Error;\n        if (!_cmsRead15Fixed16Number(io, &sc ->Channels[i].ScreenAngle)) goto Error;\n        if (!_cmsReadUInt32Number(io, &sc ->Channels[i].SpotShape)) goto Error;\n    }\n\n\n    *nItems = 1;\n\n    return (void*) sc;\n\nError:\n    if (sc != NULL)\n        _cmsFree(self ->ContextID, sc);\n\n    return NULL;\n\n    cmsUNUSED_PARAMETER(SizeOfTag);\n}\n\n\nstatic\ncmsBool Type_Screening_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsScreening* sc = (cmsScreening* ) Ptr;\n    cmsUInt32Number i;\n\n    if (!_cmsWriteUInt32Number(io, sc ->Flag)) return FALSE;\n    if (!_cmsWriteUInt32Number(io, sc ->nChannels)) return FALSE;\n\n    for (i=0; i < sc ->nChannels; i++) {\n\n        if (!_cmsWrite15Fixed16Number(io, sc ->Channels[i].Frequency)) return FALSE;\n        if (!_cmsWrite15Fixed16Number(io, sc ->Channels[i].ScreenAngle)) return FALSE;\n        if (!_cmsWriteUInt32Number(io, sc ->Channels[i].SpotShape)) return FALSE;\n    }\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(nItems);\n    cmsUNUSED_PARAMETER(self);\n}\n\n\nstatic\nvoid* Type_Screening_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)\n{\n   return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsScreening));\n\n   cmsUNUSED_PARAMETER(n);\n}\n\n\nstatic\nvoid Type_Screening_Free(struct _cms_typehandler_struct* self, void* Ptr)\n{\n   _cmsFree(self ->ContextID, Ptr);\n}\n\n// ********************************************************************************\n// Type cmsSigViewingConditionsType\n// ********************************************************************************\n//\n//This type represents a set of viewing condition parameters including:\n//CIE absolute?illuminant white point tristimulus values and CIE absolute?//surround tristimulus values.\n\nstatic\nvoid *Type_ViewingConditions_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    cmsICCViewingConditions* vc = NULL;\n\n    vc = (cmsICCViewingConditions*) _cmsMallocZero(self ->ContextID, sizeof(cmsICCViewingConditions));\n    if (vc == NULL) return NULL;\n\n    *nItems = 0;\n\n    if (!_cmsReadXYZNumber(io, &vc ->IlluminantXYZ)) goto Error;\n    if (!_cmsReadXYZNumber(io, &vc ->SurroundXYZ)) goto Error;\n    if (!_cmsReadUInt32Number(io, &vc ->IlluminantType)) goto Error;\n\n    *nItems = 1;\n\n    return (void*) vc;\n\nError:\n    if (vc != NULL)\n        _cmsFree(self ->ContextID, vc);\n\n    return NULL;\n\n    cmsUNUSED_PARAMETER(SizeOfTag);\n}\n\n\nstatic\ncmsBool Type_ViewingConditions_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsICCViewingConditions* sc = (cmsICCViewingConditions* ) Ptr;\n\n    if (!_cmsWriteXYZNumber(io, &sc ->IlluminantXYZ)) return FALSE;\n    if (!_cmsWriteXYZNumber(io, &sc ->SurroundXYZ)) return FALSE;\n    if (!_cmsWriteUInt32Number(io, sc ->IlluminantType)) return FALSE;\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(nItems);\n    cmsUNUSED_PARAMETER(self);\n}\n\n\nstatic\nvoid* Type_ViewingConditions_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)\n{\n   return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsScreening));\n\n   cmsUNUSED_PARAMETER(n);\n}\n\n\nstatic\nvoid Type_ViewingConditions_Free(struct _cms_typehandler_struct* self, void* Ptr)\n{\n   _cmsFree(self ->ContextID, Ptr);\n}\n\n\n// ********************************************************************************\n// Type cmsSigMultiProcessElementType\n// ********************************************************************************\n\n\nstatic\nvoid* GenericMPEdup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)\n{\n    return (void*) cmsStageDup((cmsStage*) Ptr);\n\n    cmsUNUSED_PARAMETER(n);\n    cmsUNUSED_PARAMETER(self);\n}\n\nstatic\nvoid GenericMPEfree(struct _cms_typehandler_struct* self, void *Ptr)\n{\n    cmsStageFree((cmsStage*) Ptr);\n    return;\n\n    cmsUNUSED_PARAMETER(self);\n}\n\n// Each curve is stored in one or more curve segments, with break-points specified between curve segments.\n// The first curve segment always starts at Infinity, and the last curve segment always ends at +Infinity. The\n// first and last curve segments shall be specified in terms of a formula, whereas the other segments shall be\n// specified either in terms of a formula, or by a sampled curve.\n\n\n// Read an embedded segmented curve\nstatic\ncmsToneCurve* ReadSegmentedCurve(struct _cms_typehandler_struct* self, cmsIOHANDLER* io)\n{\n    cmsCurveSegSignature ElementSig;\n    cmsUInt32Number i, j;\n    cmsUInt16Number nSegments;\n    cmsCurveSegment*  Segments;\n    cmsToneCurve* Curve;\n    cmsFloat32Number PrevBreak = -1E22F;    // - infinite\n\n    // Take signature and channels for each element.\n     if (!_cmsReadUInt32Number(io, (cmsUInt32Number*) &ElementSig)) return NULL;\n\n     // That should be a segmented curve\n     if (ElementSig != cmsSigSegmentedCurve) return NULL;\n\n     if (!_cmsReadUInt32Number(io, NULL)) return NULL;\n     if (!_cmsReadUInt16Number(io, &nSegments)) return NULL;\n     if (!_cmsReadUInt16Number(io, NULL)) return NULL;\n\n     if (nSegments < 1) return NULL;\n     Segments = (cmsCurveSegment*) _cmsCalloc(self ->ContextID, nSegments, sizeof(cmsCurveSegment));\n     if (Segments == NULL) return NULL;\n\n     // Read breakpoints\n     for (i=0; i < (cmsUInt32Number) nSegments - 1; i++) {\n\n         Segments[i].x0 = PrevBreak;\n         if (!_cmsReadFloat32Number(io, &Segments[i].x1)) goto Error;\n         PrevBreak = Segments[i].x1;\n     }\n\n     Segments[nSegments-1].x0 = PrevBreak;\n     Segments[nSegments-1].x1 = 1E22F;     // A big cmsFloat32Number number\n\n     // Read segments\n     for (i=0; i < nSegments; i++) {\n\n          if (!_cmsReadUInt32Number(io, (cmsUInt32Number*) &ElementSig)) goto Error;\n          if (!_cmsReadUInt32Number(io, NULL)) goto Error;\n\n           switch (ElementSig) {\n\n            case cmsSigFormulaCurveSeg: {\n\n                cmsUInt16Number Type;\n                cmsUInt32Number ParamsByType[] = {4, 5, 5 };\n\n                if (!_cmsReadUInt16Number(io, &Type)) goto Error;\n                if (!_cmsReadUInt16Number(io, NULL)) goto Error;\n\n                Segments[i].Type = Type + 6;\n                if (Type > 2) goto Error;\n\n                for (j=0; j < ParamsByType[Type]; j++) {\n\n                    cmsFloat32Number f;\n                    if (!_cmsReadFloat32Number(io, &f)) goto Error;\n                    Segments[i].Params[j] = f;\n                }\n                }\n                break;\n\n\n            case cmsSigSampledCurveSeg: {\n                cmsUInt32Number Count;\n\n                if (!_cmsReadUInt32Number(io, &Count)) return NULL;\n\n                Segments[i].nGridPoints = Count;\n                Segments[i].SampledPoints = (cmsFloat32Number*) _cmsCalloc(self ->ContextID, Count, sizeof(cmsFloat32Number));\n                if (Segments[i].SampledPoints == NULL) goto Error;\n\n                for (j=0; j < Count; j++) {\n                    if (!_cmsReadFloat32Number(io, &Segments[i].SampledPoints[j])) goto Error;\n                }\n                }\n                break;\n\n            default:\n                {\n                char String[5];\n\n                _cmsTagSignature2String(String, (cmsTagSignature) ElementSig);\n                cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, \"Unknown curve element type '%s' found.\", String);\n                }\n                return NULL;\n\n         }\n     }\n\n     Curve = cmsBuildSegmentedToneCurve(self ->ContextID, nSegments, Segments);\n\n     for (i=0; i < nSegments; i++) {\n         if (Segments[i].SampledPoints) _cmsFree(self ->ContextID, Segments[i].SampledPoints);\n     }\n     _cmsFree(self ->ContextID, Segments);\n     return Curve;\n\nError:\n     if (Segments) _cmsFree(self ->ContextID, Segments);\n     return NULL;\n}\n\n\nstatic\ncmsBool ReadMPECurve(struct _cms_typehandler_struct* self,\n                     cmsIOHANDLER* io,\n                     void* Cargo,\n                     cmsUInt32Number n,\n                     cmsUInt32Number SizeOfTag)\n{\n      cmsToneCurve** GammaTables = ( cmsToneCurve**) Cargo;\n\n      GammaTables[n] = ReadSegmentedCurve(self, io);\n      return (GammaTables[n] != NULL);\n\n      cmsUNUSED_PARAMETER(SizeOfTag);\n}\n\nstatic\nvoid *Type_MPEcurve_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    cmsStage* mpe = NULL;\n    cmsUInt16Number InputChans, OutputChans;\n    cmsUInt32Number i, BaseOffset;\n    cmsToneCurve** GammaTables;\n\n    *nItems = 0;\n\n    // Get actual position as a basis for element offsets\n    BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);\n\n    if (!_cmsReadUInt16Number(io, &InputChans)) return NULL;\n    if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL;\n\n    if (InputChans != OutputChans) return NULL;\n\n    GammaTables = (cmsToneCurve**) _cmsCalloc(self ->ContextID, InputChans, sizeof(cmsToneCurve*));\n    if (GammaTables == NULL) return NULL;\n\n    if (ReadPositionTable(self, io, InputChans, BaseOffset, GammaTables, ReadMPECurve)) {\n\n        mpe = cmsStageAllocToneCurves(self ->ContextID, InputChans, GammaTables);\n    }\n    else {\n        mpe = NULL;\n    }\n\n    for (i=0; i < InputChans; i++) {\n        if (GammaTables[i]) cmsFreeToneCurve(GammaTables[i]);\n    }\n\n    _cmsFree(self ->ContextID, GammaTables);\n    *nItems = (mpe != NULL) ? 1 : 0;\n    return mpe;\n\n    cmsUNUSED_PARAMETER(SizeOfTag);\n}\n\n\n// Write a single segmented curve. NO CHECK IS PERFORMED ON VALIDITY\nstatic\ncmsBool WriteSegmentedCurve(cmsIOHANDLER* io, cmsToneCurve* g)\n{\n    cmsUInt32Number i, j;\n    cmsCurveSegment* Segments = g ->Segments;\n    cmsUInt32Number nSegments = g ->nSegments;\n\n    if (!_cmsWriteUInt32Number(io, cmsSigSegmentedCurve)) goto Error;\n    if (!_cmsWriteUInt32Number(io, 0)) goto Error;\n    if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) nSegments)) goto Error;\n    if (!_cmsWriteUInt16Number(io, 0)) goto Error;\n\n    // Write the break-points\n    for (i=0; i < nSegments - 1; i++) {\n        if (!_cmsWriteFloat32Number(io, Segments[i].x1)) goto Error;\n    }\n\n    // Write the segments\n    for (i=0; i < g ->nSegments; i++) {\n\n        cmsCurveSegment* ActualSeg = Segments + i;\n\n        if (ActualSeg -> Type == 0) {\n\n            // This is a sampled curve\n            if (!_cmsWriteUInt32Number(io, (cmsUInt32Number) cmsSigSampledCurveSeg)) goto Error;\n            if (!_cmsWriteUInt32Number(io, 0)) goto Error;\n            if (!_cmsWriteUInt32Number(io, ActualSeg -> nGridPoints)) goto Error;\n\n            for (j=0; j < g ->Segments[i].nGridPoints; j++) {\n                if (!_cmsWriteFloat32Number(io, ActualSeg -> SampledPoints[j])) goto Error;\n            }\n\n        }\n        else {\n            int Type;\n            cmsUInt32Number ParamsByType[] = { 4, 5, 5 };\n\n            // This is a formula-based\n            if (!_cmsWriteUInt32Number(io, (cmsUInt32Number) cmsSigFormulaCurveSeg)) goto Error;\n            if (!_cmsWriteUInt32Number(io, 0)) goto Error;\n\n            // We only allow 1, 2 and 3 as types\n            Type = ActualSeg ->Type - 6;\n            if (Type > 2 || Type < 0) goto Error;\n\n            if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) Type)) goto Error;\n            if (!_cmsWriteUInt16Number(io, 0)) goto Error;\n\n            for (j=0; j < ParamsByType[Type]; j++) {\n                if (!_cmsWriteFloat32Number(io, (cmsFloat32Number) ActualSeg ->Params[j])) goto Error;\n            }\n        }\n\n        // It seems there is no need to align. Code is here, and for safety commented out\n        // if (!_cmsWriteAlignment(io)) goto Error;\n    }\n\n    return TRUE;\n\nError:\n    return FALSE;\n}\n\n\nstatic\ncmsBool WriteMPECurve(struct _cms_typehandler_struct* self,\n                      cmsIOHANDLER* io,\n                      void* Cargo,\n                      cmsUInt32Number n,\n                      cmsUInt32Number SizeOfTag)\n{\n    _cmsStageToneCurvesData* Curves  = (_cmsStageToneCurvesData*) Cargo;\n\n    return WriteSegmentedCurve(io, Curves ->TheCurves[n]);\n\n    cmsUNUSED_PARAMETER(SizeOfTag);\n    cmsUNUSED_PARAMETER(self);\n}\n\n// Write a curve, checking first for validity\nstatic\ncmsBool  Type_MPEcurve_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsUInt32Number BaseOffset;\n    cmsStage* mpe = (cmsStage*) Ptr;\n    _cmsStageToneCurvesData* Curves = (_cmsStageToneCurvesData*) mpe ->Data;\n\n    BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);\n\n    // Write the header. Since those are curves, input and output channels are same\n    if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->InputChannels)) return FALSE;\n    if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->InputChannels)) return FALSE;\n\n    if (!WritePositionTable(self, io, 0,\n                                mpe ->InputChannels, BaseOffset, Curves, WriteMPECurve)) return FALSE;\n\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(nItems);\n}\n\n\n\n// The matrix is organized as an array of PxQ+Q elements, where P is the number of input channels to the\n// matrix, and Q is the number of output channels. The matrix elements are each float32Numbers. The array\n// is organized as follows:\n// array = [e11, e12, ? e1P, e21, e22, ? e2P, ? eQ1, eQ2, ? eQP, e1, e2, ? eQ]\n\nstatic\nvoid *Type_MPEmatrix_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    cmsStage* mpe;\n    cmsUInt16Number   InputChans, OutputChans;\n    cmsUInt32Number   nElems, i;\n    cmsFloat64Number* Matrix;\n    cmsFloat64Number* Offsets;\n\n    if (!_cmsReadUInt16Number(io, &InputChans)) return NULL;\n    if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL;\n\n\n    nElems = InputChans * OutputChans;\n\n    // Input and output chans may be ANY (up to 0xffff)\n    Matrix = (cmsFloat64Number*) _cmsCalloc(self ->ContextID, nElems, sizeof(cmsFloat64Number));\n    if (Matrix == NULL) return NULL;\n\n    Offsets = (cmsFloat64Number*) _cmsCalloc(self ->ContextID, OutputChans, sizeof(cmsFloat64Number));\n    if (Offsets == NULL) {\n\n        _cmsFree(self ->ContextID, Matrix);\n        return NULL;\n    }\n\n    for (i=0; i < nElems; i++) {\n\n        cmsFloat32Number v;\n\n        if (!_cmsReadFloat32Number(io, &v)) return NULL;\n        Matrix[i] = v;\n    }\n\n\n    for (i=0; i < OutputChans; i++) {\n\n        cmsFloat32Number v;\n\n        if (!_cmsReadFloat32Number(io, &v)) return NULL;\n        Offsets[i] = v;\n    }\n\n\n    mpe = cmsStageAllocMatrix(self ->ContextID, OutputChans, InputChans, Matrix, Offsets);\n    _cmsFree(self ->ContextID, Matrix);\n    _cmsFree(self ->ContextID, Offsets);\n\n    *nItems = 1;\n\n    return mpe;\n\n    cmsUNUSED_PARAMETER(SizeOfTag);\n}\n\nstatic\ncmsBool  Type_MPEmatrix_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsUInt32Number i, nElems;\n    cmsStage* mpe = (cmsStage*) Ptr;\n    _cmsStageMatrixData* Matrix = (_cmsStageMatrixData*) mpe ->Data;\n\n    if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->InputChannels)) return FALSE;\n    if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->OutputChannels)) return FALSE;\n\n    nElems = mpe ->InputChannels * mpe ->OutputChannels;\n\n    for (i=0; i < nElems; i++) {\n        if (!_cmsWriteFloat32Number(io, (cmsFloat32Number) Matrix->Double[i])) return FALSE;\n    }\n\n\n    for (i=0; i < mpe ->OutputChannels; i++) {\n\n        if (Matrix ->Offset == NULL) {\n\n               if (!_cmsWriteFloat32Number(io, 0)) return FALSE;\n        }\n        else {\n               if (!_cmsWriteFloat32Number(io, (cmsFloat32Number) Matrix->Offset[i])) return FALSE;\n        }\n    }\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(nItems);\n    cmsUNUSED_PARAMETER(self);\n}\n\n\n\nstatic\nvoid *Type_MPEclut_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    cmsStage* mpe = NULL;\n    cmsUInt16Number InputChans, OutputChans;\n    cmsUInt8Number Dimensions8[16];\n    cmsUInt32Number i, nMaxGrids, GridPoints[MAX_INPUT_DIMENSIONS];\n    _cmsStageCLutData* clut;\n\n    if (!_cmsReadUInt16Number(io, &InputChans)) return NULL;\n    if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL;\n\n    if (InputChans == 0) goto Error;\n    if (OutputChans == 0) goto Error;\n\n    if (io ->Read(io, Dimensions8, sizeof(cmsUInt8Number), 16) != 16)\n        goto Error;\n\n    // Copy MAX_INPUT_DIMENSIONS at most. Expand to cmsUInt32Number\n    nMaxGrids = InputChans > MAX_INPUT_DIMENSIONS ? MAX_INPUT_DIMENSIONS : InputChans;\n    for (i=0; i < nMaxGrids; i++) GridPoints[i] = (cmsUInt32Number) Dimensions8[i];\n\n    // Allocate the true CLUT\n    mpe = cmsStageAllocCLutFloatGranular(self ->ContextID, GridPoints, InputChans, OutputChans, NULL);\n    if (mpe == NULL) goto Error;\n\n    // Read the data\n    clut = (_cmsStageCLutData*) mpe ->Data;\n    for (i=0; i < clut ->nEntries; i++) {\n\n        if (!_cmsReadFloat32Number(io, &clut ->Tab.TFloat[i])) goto Error;\n    }\n\n    *nItems = 1;\n    return mpe;\n\nError:\n    *nItems = 0;\n    if (mpe != NULL) cmsStageFree(mpe);\n    return NULL;\n\n    cmsUNUSED_PARAMETER(SizeOfTag);\n}\n\n// Write a CLUT in floating point\nstatic\ncmsBool  Type_MPEclut_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsUInt8Number Dimensions8[16];\n    cmsUInt32Number i;\n    cmsStage* mpe = (cmsStage*) Ptr;\n    _cmsStageCLutData* clut = (_cmsStageCLutData*) mpe ->Data;\n\n    // Check for maximum number of channels\n    if (mpe -> InputChannels > 15) return FALSE;\n\n    // Only floats are supported in MPE\n    if (clut ->HasFloatValues == FALSE) return FALSE;\n\n    if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->InputChannels)) return FALSE;\n    if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->OutputChannels)) return FALSE;\n\n    memset(Dimensions8, 0, sizeof(Dimensions8));\n\n    for (i=0; i < mpe ->InputChannels; i++)\n        Dimensions8[i] = (cmsUInt8Number) clut ->Params ->nSamples[i];\n\n    if (!io ->Write(io, 16, Dimensions8)) return FALSE;\n\n    for (i=0; i < clut ->nEntries; i++) {\n\n        if (!_cmsWriteFloat32Number(io, clut ->Tab.TFloat[i])) return FALSE;\n    }\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(nItems);\n    cmsUNUSED_PARAMETER(self);\n}\n\n\n\n// This is the list of built-in MPE types\nstatic _cmsTagTypeLinkedList SupportedMPEtypes[] = {\n\n{{ (cmsTagTypeSignature) cmsSigBAcsElemType, NULL, NULL, NULL, NULL, NULL, 0 }, &SupportedMPEtypes[1] },   // Ignore those elements for now\n{{ (cmsTagTypeSignature) cmsSigEAcsElemType, NULL, NULL, NULL, NULL, NULL, 0 }, &SupportedMPEtypes[2] },   // (That's what the spec says)\n\n{TYPE_MPE_HANDLER((cmsTagTypeSignature) cmsSigCurveSetElemType,     MPEcurve),      &SupportedMPEtypes[3] },\n{TYPE_MPE_HANDLER((cmsTagTypeSignature) cmsSigMatrixElemType,       MPEmatrix),     &SupportedMPEtypes[4] },\n{TYPE_MPE_HANDLER((cmsTagTypeSignature) cmsSigCLutElemType,         MPEclut),        NULL },\n};\n\n_cmsTagTypePluginChunkType _cmsMPETypePluginChunk = { NULL };\n\nstatic\ncmsBool ReadMPEElem(struct _cms_typehandler_struct* self,\n                    cmsIOHANDLER* io,\n                    void* Cargo,\n                    cmsUInt32Number n,\n                    cmsUInt32Number SizeOfTag)\n{\n    cmsStageSignature ElementSig;\n    cmsTagTypeHandler* TypeHandler;\n    cmsUInt32Number nItems;\n    cmsPipeline *NewLUT = (cmsPipeline *) Cargo;\n    _cmsTagTypePluginChunkType* MPETypePluginChunk  = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(self->ContextID, MPEPlugin);\n\n\n    // Take signature and channels for each element.\n    if (!_cmsReadUInt32Number(io, (cmsUInt32Number*) &ElementSig)) return FALSE;\n\n    // The reserved placeholder\n    if (!_cmsReadUInt32Number(io, NULL)) return FALSE;\n\n    // Read diverse MPE types\n    TypeHandler = GetHandler((cmsTagTypeSignature) ElementSig, MPETypePluginChunk ->TagTypes, SupportedMPEtypes);\n    if (TypeHandler == NULL)  {\n\n        char String[5];\n\n        _cmsTagSignature2String(String, (cmsTagSignature) ElementSig);\n\n        // An unknown element was found.\n        cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, \"Unknown MPE type '%s' found.\", String);\n        return FALSE;\n    }\n\n    // If no read method, just ignore the element (valid for cmsSigBAcsElemType and cmsSigEAcsElemType)\n    // Read the MPE. No size is given\n    if (TypeHandler ->ReadPtr != NULL) {\n\n        // This is a real element which should be read and processed\n        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, (cmsStage*) TypeHandler ->ReadPtr(self, io, &nItems, SizeOfTag)))\n            return FALSE;\n    }\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(SizeOfTag);\n    cmsUNUSED_PARAMETER(n);\n}\n\n\n// This is the main dispatcher for MPE\nstatic\nvoid *Type_MPE_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n    cmsUInt16Number InputChans, OutputChans;\n    cmsUInt32Number ElementCount;\n    cmsPipeline *NewLUT = NULL;\n    cmsUInt32Number BaseOffset;\n\n    // Get actual position as a basis for element offsets\n    BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);\n\n    // Read channels and element count\n    if (!_cmsReadUInt16Number(io, &InputChans)) return NULL;\n    if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL;\n\n    // Allocates an empty LUT\n    NewLUT = cmsPipelineAlloc(self ->ContextID, InputChans, OutputChans);\n    if (NewLUT == NULL) return NULL;\n\n    if (!_cmsReadUInt32Number(io, &ElementCount)) return NULL;\n\n    if (!ReadPositionTable(self, io, ElementCount, BaseOffset, NewLUT, ReadMPEElem)) {\n        if (NewLUT != NULL) cmsPipelineFree(NewLUT);\n        *nItems = 0;\n        return NULL;\n    }\n\n    // Success\n    *nItems = 1;\n    return NewLUT;\n\n    cmsUNUSED_PARAMETER(SizeOfTag);\n}\n\n\n\n// This one is a liitle bit more complex, so we don't use position tables this time.\nstatic\ncmsBool Type_MPE_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsUInt32Number i, BaseOffset, DirectoryPos, CurrentPos;\n    int inputChan, outputChan;\n    cmsUInt32Number ElemCount;\n    cmsUInt32Number *ElementOffsets = NULL, *ElementSizes = NULL, Before;\n    cmsStageSignature ElementSig;\n    cmsPipeline* Lut = (cmsPipeline*) Ptr;\n    cmsStage* Elem = Lut ->Elements;\n    cmsTagTypeHandler* TypeHandler;\n    _cmsTagTypePluginChunkType* MPETypePluginChunk  = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(self->ContextID, MPEPlugin);\n\n    BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);\n\n    inputChan  = cmsPipelineInputChannels(Lut);\n    outputChan = cmsPipelineOutputChannels(Lut);\n    ElemCount  = cmsPipelineStageCount(Lut);\n\n    ElementOffsets = (cmsUInt32Number *) _cmsCalloc(self ->ContextID, ElemCount, sizeof(cmsUInt32Number));\n    if (ElementOffsets == NULL) goto Error;\n\n    ElementSizes = (cmsUInt32Number *) _cmsCalloc(self ->ContextID, ElemCount, sizeof(cmsUInt32Number));\n    if (ElementSizes == NULL) goto Error;\n\n    // Write the head\n    if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) inputChan)) goto Error;\n    if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) outputChan)) goto Error;\n    if (!_cmsWriteUInt32Number(io, (cmsUInt16Number) ElemCount)) goto Error;\n\n    DirectoryPos = io ->Tell(io);\n\n    // Write a fake directory to be filled latter on\n    for (i=0; i < ElemCount; i++) {\n        if (!_cmsWriteUInt32Number(io, 0)) goto Error;  // Offset\n        if (!_cmsWriteUInt32Number(io, 0)) goto Error;  // size\n    }\n\n    // Write each single tag. Keep track of the size as well.\n    for (i=0; i < ElemCount; i++) {\n\n        ElementOffsets[i] = io ->Tell(io) - BaseOffset;\n\n        ElementSig = Elem ->Type;\n\n        TypeHandler = GetHandler((cmsTagTypeSignature) ElementSig, MPETypePluginChunk->TagTypes, SupportedMPEtypes);\n        if (TypeHandler == NULL)  {\n\n                char String[5];\n\n                _cmsTagSignature2String(String, (cmsTagSignature) ElementSig);\n\n                 // An unknow element was found.\n                 cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, \"Found unknown MPE type '%s'\", String);\n                 goto Error;\n        }\n\n        if (!_cmsWriteUInt32Number(io, ElementSig)) goto Error;\n        if (!_cmsWriteUInt32Number(io, 0)) goto Error;\n        Before = io ->Tell(io);\n        if (!TypeHandler ->WritePtr(self, io, Elem, 1)) goto Error;\n        if (!_cmsWriteAlignment(io)) goto Error;\n\n        ElementSizes[i] = io ->Tell(io) - Before;\n\n        Elem = Elem ->Next;\n    }\n\n    // Write the directory\n    CurrentPos = io ->Tell(io);\n\n    if (!io ->Seek(io, DirectoryPos)) goto Error;\n\n    for (i=0; i < ElemCount; i++) {\n        if (!_cmsWriteUInt32Number(io, ElementOffsets[i])) goto Error;\n        if (!_cmsWriteUInt32Number(io, ElementSizes[i])) goto Error;\n    }\n\n    if (!io ->Seek(io, CurrentPos)) goto Error;\n\n    if (ElementOffsets != NULL) _cmsFree(self ->ContextID, ElementOffsets);\n    if (ElementSizes != NULL) _cmsFree(self ->ContextID, ElementSizes);\n    return TRUE;\n\nError:\n    if (ElementOffsets != NULL) _cmsFree(self ->ContextID, ElementOffsets);\n    if (ElementSizes != NULL) _cmsFree(self ->ContextID, ElementSizes);\n    return FALSE;\n\n    cmsUNUSED_PARAMETER(nItems);\n}\n\n\nstatic\nvoid* Type_MPE_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)\n{\n    return (void*) cmsPipelineDup((cmsPipeline*) Ptr);\n\n    cmsUNUSED_PARAMETER(n);\n    cmsUNUSED_PARAMETER(self);\n}\n\nstatic\nvoid Type_MPE_Free(struct _cms_typehandler_struct* self, void *Ptr)\n{\n    cmsPipelineFree((cmsPipeline*) Ptr);\n    return;\n\n    cmsUNUSED_PARAMETER(self);\n}\n\n\n// ********************************************************************************\n// Type cmsSigVcgtType\n// ********************************************************************************\n\n\n#define cmsVideoCardGammaTableType    0\n#define cmsVideoCardGammaFormulaType  1\n\n// Used internally\ntypedef struct {\n    double Gamma;\n    double Min;\n    double Max;\n} _cmsVCGTGAMMA;\n\n\nstatic\nvoid *Type_vcgt_Read(struct _cms_typehandler_struct* self,\n                     cmsIOHANDLER* io,\n                     cmsUInt32Number* nItems,\n                     cmsUInt32Number SizeOfTag)\n{\n    cmsUInt32Number TagType, n, i;\n    cmsToneCurve** Curves;\n\n    *nItems = 0;\n\n    // Read tag type\n    if (!_cmsReadUInt32Number(io, &TagType)) return NULL;\n\n    // Allocate space for the array\n    Curves = ( cmsToneCurve**) _cmsCalloc(self ->ContextID, 3, sizeof(cmsToneCurve*));\n    if (Curves == NULL) return NULL;\n\n    // There are two possible flavors\n    switch (TagType) {\n\n    // Gamma is stored as a table\n    case cmsVideoCardGammaTableType:\n    {\n       cmsUInt16Number nChannels, nElems, nBytes;\n\n       // Check channel count, which should be 3 (we don't support monochrome this time)\n       if (!_cmsReadUInt16Number(io, &nChannels)) goto Error;\n\n       if (nChannels != 3) {\n           cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, \"Unsupported number of channels for VCGT '%d'\", nChannels);\n           goto Error;\n       }\n\n       // Get Table element count and bytes per element\n       if (!_cmsReadUInt16Number(io, &nElems)) goto Error;\n       if (!_cmsReadUInt16Number(io, &nBytes)) goto Error;\n\n       // Adobe's quirk fixup. Fixing broken profiles...\n       if (nElems == 256 && nBytes == 1 && SizeOfTag == 1576)\n           nBytes = 2;\n\n\n       // Populate tone curves\n       for (n=0; n < 3; n++) {\n\n           Curves[n] = cmsBuildTabulatedToneCurve16(self ->ContextID, nElems, NULL);\n           if (Curves[n] == NULL) goto Error;\n\n           // On depending on byte depth\n           switch (nBytes) {\n\n           // One byte, 0..255\n           case 1:\n               for (i=0; i < nElems; i++) {\n\n                   cmsUInt8Number v;\n\n                      if (!_cmsReadUInt8Number(io, &v)) goto Error;\n                      Curves[n] ->Table16[i] = FROM_8_TO_16(v);\n               }\n               break;\n\n           // One word 0..65535\n           case 2:\n              if (!_cmsReadUInt16Array(io, nElems, Curves[n]->Table16)) goto Error;\n              break;\n\n          // Unsupported\n           default:\n              cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, \"Unsupported bit depth for VCGT '%d'\", nBytes * 8);\n              goto Error;\n           }\n       } // For all 3 channels\n    }\n    break;\n\n   // In this case, gamma is stored as a formula\n   case cmsVideoCardGammaFormulaType:\n   {\n       _cmsVCGTGAMMA Colorant[3];\n\n        // Populate tone curves\n       for (n=0; n < 3; n++) {\n\n           double Params[10];\n\n           if (!_cmsRead15Fixed16Number(io, &Colorant[n].Gamma)) goto Error;\n           if (!_cmsRead15Fixed16Number(io, &Colorant[n].Min)) goto Error;\n           if (!_cmsRead15Fixed16Number(io, &Colorant[n].Max)) goto Error;\n\n            // Parametric curve type 5 is:\n            // Y = (aX + b)^Gamma + e | X >= d\n            // Y = cX + f             | X < d\n\n            // vcgt formula is:\n            // Y = (Max ?Min) * (X ^ Gamma) + Min\n\n            // So, the translation is\n            // a = (Max ?Min) ^ ( 1 / Gamma)\n            // e = Min\n            // b=c=d=f=0\n\n           Params[0] = Colorant[n].Gamma;\n           Params[1] = pow((Colorant[n].Max - Colorant[n].Min), (1.0 / Colorant[n].Gamma));\n           Params[2] = 0;\n           Params[3] = 0;\n           Params[4] = 0;\n           Params[5] = Colorant[n].Min;\n           Params[6] = 0;\n\n           Curves[n] = cmsBuildParametricToneCurve(self ->ContextID, 5, Params);\n           if (Curves[n] == NULL) goto Error;\n       }\n   }\n   break;\n\n   // Unsupported\n   default:\n      cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, \"Unsupported tag type for VCGT '%d'\", TagType);\n      goto Error;\n   }\n\n   *nItems = 1;\n   return (void*) Curves;\n\n// Regret,  free all resources\nError:\n\n    cmsFreeToneCurveTriple(Curves);\n    _cmsFree(self ->ContextID, Curves);\n    return NULL;\n\n     cmsUNUSED_PARAMETER(SizeOfTag);\n}\n\n\n// We don't support all flavors, only 16bits tables and formula\nstatic\ncmsBool Type_vcgt_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsToneCurve** Curves =  (cmsToneCurve**) Ptr;\n    cmsUInt32Number i, j;\n\n    if (cmsGetToneCurveParametricType(Curves[0]) == 5 &&\n        cmsGetToneCurveParametricType(Curves[1]) == 5 &&\n        cmsGetToneCurveParametricType(Curves[2]) == 5) {\n\n            if (!_cmsWriteUInt32Number(io, cmsVideoCardGammaFormulaType)) return FALSE;\n\n            // Save parameters\n            for (i=0; i < 3; i++) {\n\n                _cmsVCGTGAMMA v;\n\n                v.Gamma = Curves[i] ->Segments[0].Params[0];\n                v.Min   = Curves[i] ->Segments[0].Params[5];\n                v.Max   = pow(Curves[i] ->Segments[0].Params[1], v.Gamma) + v.Min;\n\n                if (!_cmsWrite15Fixed16Number(io, v.Gamma)) return FALSE;\n                if (!_cmsWrite15Fixed16Number(io, v.Min)) return FALSE;\n                if (!_cmsWrite15Fixed16Number(io, v.Max)) return FALSE;\n            }\n    }\n\n    else {\n\n        // Always store as a table of 256 words\n        if (!_cmsWriteUInt32Number(io, cmsVideoCardGammaTableType)) return FALSE;\n        if (!_cmsWriteUInt16Number(io, 3)) return FALSE;\n        if (!_cmsWriteUInt16Number(io, 256)) return FALSE;\n        if (!_cmsWriteUInt16Number(io, 2)) return FALSE;\n\n        for (i=0; i < 3; i++) {\n            for (j=0; j < 256; j++) {\n\n                cmsFloat32Number v = cmsEvalToneCurveFloat(Curves[i], (cmsFloat32Number) (j / 255.0));\n                cmsUInt16Number  n = _cmsQuickSaturateWord(v * 65535.0);\n\n                if (!_cmsWriteUInt16Number(io, n)) return FALSE;\n            }\n        }\n    }\n\n    return TRUE;\n\n    cmsUNUSED_PARAMETER(self);\n    cmsUNUSED_PARAMETER(nItems);\n}\n\nstatic\nvoid* Type_vcgt_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)\n{\n    cmsToneCurve** OldCurves =  (cmsToneCurve**) Ptr;\n    cmsToneCurve** NewCurves;\n\n    NewCurves = ( cmsToneCurve**) _cmsCalloc(self ->ContextID, 3, sizeof(cmsToneCurve*));\n    if (NewCurves == NULL) return NULL;\n\n    NewCurves[0] = cmsDupToneCurve(OldCurves[0]);\n    NewCurves[1] = cmsDupToneCurve(OldCurves[1]);\n    NewCurves[2] = cmsDupToneCurve(OldCurves[2]);\n\n    return (void*) NewCurves;\n\n    cmsUNUSED_PARAMETER(n);\n}\n\n\nstatic\nvoid Type_vcgt_Free(struct _cms_typehandler_struct* self, void* Ptr)\n{\n    cmsFreeToneCurveTriple((cmsToneCurve**) Ptr);\n    _cmsFree(self ->ContextID, Ptr);\n}\n\n\n// ********************************************************************************\n// Type cmsSigDictType\n// ********************************************************************************\n\n// Single column of the table can point to wchar or MLUC elements. Holds arrays of data\ntypedef struct {\n    cmsContext ContextID;\n    cmsUInt32Number *Offsets;\n    cmsUInt32Number *Sizes;\n} _cmsDICelem;\n\ntypedef struct {\n    _cmsDICelem Name, Value, DisplayName, DisplayValue;\n\n} _cmsDICarray;\n\n// Allocate an empty array element\nstatic\ncmsBool AllocElem(cmsContext ContextID, _cmsDICelem* e,  cmsUInt32Number Count)\n{\n    e->Offsets = (cmsUInt32Number *) _cmsCalloc(ContextID, Count, sizeof(cmsUInt32Number));\n    if (e->Offsets == NULL) return FALSE;\n\n    e->Sizes = (cmsUInt32Number *) _cmsCalloc(ContextID, Count, sizeof(cmsUInt32Number));\n    if (e->Sizes == NULL) {\n\n        _cmsFree(ContextID, e -> Offsets);\n        return FALSE;\n    }\n\n    e ->ContextID = ContextID;\n    return TRUE;\n}\n\n// Free an array element\nstatic\nvoid FreeElem(_cmsDICelem* e)\n{\n    if (e ->Offsets != NULL)  _cmsFree(e -> ContextID, e -> Offsets);\n    if (e ->Sizes   != NULL)  _cmsFree(e -> ContextID, e -> Sizes);\n    e->Offsets = e ->Sizes = NULL;\n}\n\n// Get rid of whole array\nstatic\nvoid FreeArray( _cmsDICarray* a)\n{\n    if (a ->Name.Offsets != NULL) FreeElem(&a->Name);\n    if (a ->Value.Offsets != NULL) FreeElem(&a ->Value);\n    if (a ->DisplayName.Offsets != NULL) FreeElem(&a->DisplayName);\n    if (a ->DisplayValue.Offsets != NULL) FreeElem(&a ->DisplayValue);\n}\n\n\n// Allocate whole array\nstatic\ncmsBool AllocArray(cmsContext ContextID, _cmsDICarray* a, cmsUInt32Number Count, cmsUInt32Number Length)\n{\n    // Empty values\n    memset(a, 0, sizeof(_cmsDICarray));\n\n    // On depending on record size, create column arrays\n    if (!AllocElem(ContextID, &a ->Name, Count)) goto Error;\n    if (!AllocElem(ContextID, &a ->Value, Count)) goto Error;\n\n    if (Length > 16) {\n        if (!AllocElem(ContextID, &a -> DisplayName, Count)) goto Error;\n\n    }\n    if (Length > 24) {\n        if (!AllocElem(ContextID, &a ->DisplayValue, Count)) goto Error;\n    }\n    return TRUE;\n\nError:\n    FreeArray(a);\n    return FALSE;\n}\n\n// Read one element\nstatic\ncmsBool ReadOneElem(cmsIOHANDLER* io,  _cmsDICelem* e, cmsUInt32Number i, cmsUInt32Number BaseOffset)\n{\n    if (!_cmsReadUInt32Number(io, &e->Offsets[i])) return FALSE;\n    if (!_cmsReadUInt32Number(io, &e ->Sizes[i])) return FALSE;\n\n    // An offset of zero has special meaning and shal be preserved\n    if (e ->Offsets[i] > 0)\n        e ->Offsets[i] += BaseOffset;\n    return TRUE;\n}\n\n\nstatic\ncmsBool ReadOffsetArray(cmsIOHANDLER* io,  _cmsDICarray* a, cmsUInt32Number Count, cmsUInt32Number Length, cmsUInt32Number BaseOffset)\n{\n    cmsUInt32Number i;\n\n    // Read column arrays\n    for (i=0; i < Count; i++) {\n\n        if (!ReadOneElem(io, &a -> Name, i, BaseOffset)) return FALSE;\n        if (!ReadOneElem(io, &a -> Value, i, BaseOffset)) return FALSE;\n\n        if (Length > 16) {\n\n            if (!ReadOneElem(io, &a ->DisplayName, i, BaseOffset)) return FALSE;\n\n        }\n\n        if (Length > 24) {\n\n            if (!ReadOneElem(io, & a -> DisplayValue, i, BaseOffset)) return FALSE;\n        }\n    }\n    return TRUE;\n}\n\n\n// Write one element\nstatic\ncmsBool WriteOneElem(cmsIOHANDLER* io,  _cmsDICelem* e, cmsUInt32Number i)\n{\n    if (!_cmsWriteUInt32Number(io, e->Offsets[i])) return FALSE;\n    if (!_cmsWriteUInt32Number(io, e ->Sizes[i])) return FALSE;\n\n    return TRUE;\n}\n\nstatic\ncmsBool WriteOffsetArray(cmsIOHANDLER* io,  _cmsDICarray* a, cmsUInt32Number Count, cmsUInt32Number Length)\n{\n    cmsUInt32Number i;\n\n    for (i=0; i < Count; i++) {\n\n        if (!WriteOneElem(io, &a -> Name, i)) return FALSE;\n        if (!WriteOneElem(io, &a -> Value, i))  return FALSE;\n\n        if (Length > 16) {\n\n            if (!WriteOneElem(io, &a -> DisplayName, i))  return FALSE;\n        }\n\n        if (Length > 24) {\n\n            if (!WriteOneElem(io, &a -> DisplayValue, i))  return FALSE;\n        }\n    }\n\n    return TRUE;\n}\n\nstatic\ncmsBool ReadOneWChar(cmsIOHANDLER* io,  _cmsDICelem* e, cmsUInt32Number i, wchar_t ** wcstr)\n{\n\n    cmsUInt32Number nChars;\n\n      // Special case for undefined strings (see ICC Votable\n      // Proposal Submission, Dictionary Type and Metadata TAG Definition)\n      if (e -> Offsets[i] == 0) {\n\n          *wcstr = NULL;\n          return TRUE;\n      }\n\n      if (!io -> Seek(io, e -> Offsets[i])) return FALSE;\n\n      nChars = e ->Sizes[i] / sizeof(cmsUInt16Number);\n\n\n      *wcstr = (wchar_t*) _cmsMallocZero(e ->ContextID, (nChars + 1) * sizeof(wchar_t));\n      if (*wcstr == NULL) return FALSE;\n\n      if (!_cmsReadWCharArray(io, nChars, *wcstr)) {\n          _cmsFree(e ->ContextID, *wcstr);\n          return FALSE;\n      }\n\n      // End of string marker\n      (*wcstr)[nChars] = 0;\n      return TRUE;\n}\n\nstatic\ncmsUInt32Number mywcslen(const wchar_t *s)\n{\n    const wchar_t *p;\n\n    p = s;\n    while (*p)\n        p++;\n\n    return (cmsUInt32Number)(p - s);\n}\n\nstatic\ncmsBool WriteOneWChar(cmsIOHANDLER* io,  _cmsDICelem* e, cmsUInt32Number i, const wchar_t * wcstr, cmsUInt32Number BaseOffset)\n{\n    cmsUInt32Number Before = io ->Tell(io);\n    cmsUInt32Number n;\n\n    e ->Offsets[i] = Before - BaseOffset;\n\n    if (wcstr == NULL) {\n        e ->Sizes[i] = 0;\n        e ->Offsets[i] = 0;\n        return TRUE;\n    }\n\n    n = mywcslen(wcstr);\n    if (!_cmsWriteWCharArray(io,  n, wcstr)) return FALSE;\n\n    e ->Sizes[i] = io ->Tell(io) - Before;\n    return TRUE;\n}\n\nstatic\ncmsBool ReadOneMLUC(struct _cms_typehandler_struct* self, cmsIOHANDLER* io,  _cmsDICelem* e, cmsUInt32Number i, cmsMLU** mlu)\n{\n    cmsUInt32Number nItems = 0;\n\n    // A way to get null MLUCs\n    if (e -> Offsets[i] == 0 || e ->Sizes[i] == 0) {\n\n        *mlu = NULL;\n        return TRUE;\n    }\n\n    if (!io -> Seek(io, e -> Offsets[i])) return FALSE;\n\n    *mlu = (cmsMLU*) Type_MLU_Read(self, io, &nItems, e ->Sizes[i]);\n    return *mlu != NULL;\n}\n\nstatic\ncmsBool WriteOneMLUC(struct _cms_typehandler_struct* self, cmsIOHANDLER* io,  _cmsDICelem* e, cmsUInt32Number i, const cmsMLU* mlu, cmsUInt32Number BaseOffset)\n{\n    cmsUInt32Number Before;\n\n     // Special case for undefined strings (see ICC Votable\n     // Proposal Submission, Dictionary Type and Metadata TAG Definition)\n     if (mlu == NULL) {\n        e ->Sizes[i] = 0;\n        e ->Offsets[i] = 0;\n        return TRUE;\n    }\n\n    Before = io ->Tell(io);\n    e ->Offsets[i] = Before - BaseOffset;\n\n    if (!Type_MLU_Write(self, io, (void*) mlu, 1)) return FALSE;\n\n    e ->Sizes[i] = io ->Tell(io) - Before;\n    return TRUE;\n}\n\n\nstatic\nvoid *Type_Dictionary_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)\n{\n   cmsHANDLE hDict;\n   cmsUInt32Number i, Count, Length;\n   cmsUInt32Number BaseOffset;\n   _cmsDICarray a;\n   wchar_t *NameWCS = NULL, *ValueWCS = NULL;\n   cmsMLU *DisplayNameMLU = NULL, *DisplayValueMLU=NULL;\n   cmsBool rc;\n\n    *nItems = 0;\n\n    // Get actual position as a basis for element offsets\n    BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);\n\n    // Get name-value record count\n    if (!_cmsReadUInt32Number(io, &Count)) return NULL;\n    SizeOfTag -= sizeof(cmsUInt32Number);\n\n    // Get rec length\n    if (!_cmsReadUInt32Number(io, &Length)) return NULL;\n    SizeOfTag -= sizeof(cmsUInt32Number);\n\n    // Check for valid lengths\n    if (Length != 16 && Length != 24 && Length != 32) {\n         cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, \"Unknown record length in dictionary '%d'\", Length);\n         return NULL;\n    }\n\n    // Creates an empty dictionary\n    hDict = cmsDictAlloc(self -> ContextID);\n    if (hDict == NULL) return NULL;\n\n    // On depending on record size, create column arrays\n    if (!AllocArray(self -> ContextID, &a, Count, Length)) goto Error;\n\n    // Read column arrays\n    if (!ReadOffsetArray(io, &a, Count, Length, BaseOffset)) goto Error;\n\n    // Seek to each element and read it\n    for (i=0; i < Count; i++) {\n\n        if (!ReadOneWChar(io, &a.Name, i, &NameWCS)) goto Error;\n        if (!ReadOneWChar(io, &a.Value, i, &ValueWCS)) goto Error;\n\n        if (Length > 16) {\n            if (!ReadOneMLUC(self, io, &a.DisplayName, i, &DisplayNameMLU)) goto Error;\n        }\n\n        if (Length > 24) {\n            if (!ReadOneMLUC(self, io, &a.DisplayValue, i, &DisplayValueMLU)) goto Error;\n        }\n\n        if (NameWCS == NULL || ValueWCS == NULL) {\n        \n            cmsSignalError(self->ContextID, cmsERROR_CORRUPTION_DETECTED, \"Bad dictionary Name/Value\");        \n            rc = FALSE;\n        }\n        else {\n\n            rc = cmsDictAddEntry(hDict, NameWCS, ValueWCS, DisplayNameMLU, DisplayValueMLU);\n        }\n\n        if (NameWCS != NULL) _cmsFree(self ->ContextID, NameWCS);\n        if (ValueWCS != NULL) _cmsFree(self ->ContextID, ValueWCS);\n        if (DisplayNameMLU != NULL) cmsMLUfree(DisplayNameMLU);\n        if (DisplayValueMLU != NULL) cmsMLUfree(DisplayValueMLU);\n\n        if (!rc) goto Error;\n    }\n\n   FreeArray(&a);\n   *nItems = 1;\n   return (void*) hDict;\n\nError:\n   FreeArray(&a);\n   cmsDictFree(hDict);\n   return NULL;\n}\n\n\nstatic\ncmsBool Type_Dictionary_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)\n{\n    cmsHANDLE hDict = (cmsHANDLE) Ptr;\n    const cmsDICTentry* p;\n    cmsBool AnyName, AnyValue;\n    cmsUInt32Number i, Count, Length;\n    cmsUInt32Number DirectoryPos, CurrentPos, BaseOffset;\n   _cmsDICarray a;\n\n    if (hDict == NULL) return FALSE;\n\n    BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);\n\n    // Let's inspect the dictionary\n    Count = 0; AnyName = FALSE; AnyValue = FALSE;\n    for (p = cmsDictGetEntryList(hDict); p != NULL; p = cmsDictNextEntry(p)) {\n\n        if (p ->DisplayName != NULL) AnyName = TRUE;\n        if (p ->DisplayValue != NULL) AnyValue = TRUE;\n        Count++;\n    }\n\n    Length = 16;\n    if (AnyName)  Length += 8;\n    if (AnyValue) Length += 8;\n\n    if (!_cmsWriteUInt32Number(io, Count)) return FALSE;\n    if (!_cmsWriteUInt32Number(io, Length)) return FALSE;\n\n    // Keep starting position of offsets table\n    DirectoryPos = io ->Tell(io);\n\n    // Allocate offsets array\n    if (!AllocArray(self ->ContextID, &a, Count, Length)) goto Error;\n\n    // Write a fake directory to be filled latter on\n    if (!WriteOffsetArray(io, &a, Count, Length)) goto Error;\n\n    // Write each element. Keep track of the size as well.\n    p = cmsDictGetEntryList(hDict);\n    for (i=0; i < Count; i++) {\n\n        if (!WriteOneWChar(io, &a.Name, i,  p ->Name, BaseOffset)) goto Error;\n        if (!WriteOneWChar(io, &a.Value, i, p ->Value, BaseOffset)) goto Error;\n\n        if (p ->DisplayName != NULL) {\n            if (!WriteOneMLUC(self, io, &a.DisplayName, i, p ->DisplayName, BaseOffset)) goto Error;\n        }\n\n        if (p ->DisplayValue != NULL) {\n            if (!WriteOneMLUC(self, io, &a.DisplayValue, i, p ->DisplayValue, BaseOffset)) goto Error;\n        }\n\n       p = cmsDictNextEntry(p);\n    }\n\n    // Write the directory\n    CurrentPos = io ->Tell(io);\n    if (!io ->Seek(io, DirectoryPos)) goto Error;\n\n    if (!WriteOffsetArray(io, &a, Count, Length)) goto Error;\n\n    if (!io ->Seek(io, CurrentPos)) goto Error;\n\n    FreeArray(&a);\n    return TRUE;\n\nError:\n    FreeArray(&a);\n    return FALSE;\n\n    cmsUNUSED_PARAMETER(nItems);\n}\n\n\nstatic\nvoid* Type_Dictionary_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)\n{\n    return (void*)  cmsDictDup((cmsHANDLE) Ptr);\n\n    cmsUNUSED_PARAMETER(n);\n    cmsUNUSED_PARAMETER(self);\n}\n\n\nstatic\nvoid Type_Dictionary_Free(struct _cms_typehandler_struct* self, void* Ptr)\n{\n    cmsDictFree((cmsHANDLE) Ptr);\n    cmsUNUSED_PARAMETER(self);\n}\n\n\n// ********************************************************************************\n// Type support main routines\n// ********************************************************************************\n\n\n// This is the list of built-in types\nstatic _cmsTagTypeLinkedList SupportedTagTypes[] = {\n\n{TYPE_HANDLER(cmsSigChromaticityType,          Chromaticity),        &SupportedTagTypes[1] },\n{TYPE_HANDLER(cmsSigColorantOrderType,         ColorantOrderType),   &SupportedTagTypes[2] },\n{TYPE_HANDLER(cmsSigS15Fixed16ArrayType,       S15Fixed16),          &SupportedTagTypes[3] },\n{TYPE_HANDLER(cmsSigU16Fixed16ArrayType,       U16Fixed16),          &SupportedTagTypes[4] },\n{TYPE_HANDLER(cmsSigTextType,                  Text),                &SupportedTagTypes[5] },\n{TYPE_HANDLER(cmsSigTextDescriptionType,       Text_Description),    &SupportedTagTypes[6] },\n{TYPE_HANDLER(cmsSigCurveType,                 Curve),               &SupportedTagTypes[7] },\n{TYPE_HANDLER(cmsSigParametricCurveType,       ParametricCurve),     &SupportedTagTypes[8] },\n{TYPE_HANDLER(cmsSigDateTimeType,              DateTime),            &SupportedTagTypes[9] },\n{TYPE_HANDLER(cmsSigLut8Type,                  LUT8),                &SupportedTagTypes[10] },\n{TYPE_HANDLER(cmsSigLut16Type,                 LUT16),               &SupportedTagTypes[11] },\n{TYPE_HANDLER(cmsSigColorantTableType,         ColorantTable),       &SupportedTagTypes[12] },\n{TYPE_HANDLER(cmsSigNamedColor2Type,           NamedColor),          &SupportedTagTypes[13] },\n{TYPE_HANDLER(cmsSigMultiLocalizedUnicodeType, MLU),                 &SupportedTagTypes[14] },\n{TYPE_HANDLER(cmsSigProfileSequenceDescType,   ProfileSequenceDesc), &SupportedTagTypes[15] },\n{TYPE_HANDLER(cmsSigSignatureType,             Signature),           &SupportedTagTypes[16] },\n{TYPE_HANDLER(cmsSigMeasurementType,           Measurement),         &SupportedTagTypes[17] },\n{TYPE_HANDLER(cmsSigDataType,                  Data),                &SupportedTagTypes[18] },\n{TYPE_HANDLER(cmsSigLutAtoBType,               LUTA2B),              &SupportedTagTypes[19] },\n{TYPE_HANDLER(cmsSigLutBtoAType,               LUTB2A),              &SupportedTagTypes[20] },\n{TYPE_HANDLER(cmsSigUcrBgType,                 UcrBg),               &SupportedTagTypes[21] },\n{TYPE_HANDLER(cmsSigCrdInfoType,               CrdInfo),             &SupportedTagTypes[22] },\n{TYPE_HANDLER(cmsSigMultiProcessElementType,   MPE),                 &SupportedTagTypes[23] },\n{TYPE_HANDLER(cmsSigScreeningType,             Screening),           &SupportedTagTypes[24] },\n{TYPE_HANDLER(cmsSigViewingConditionsType,     ViewingConditions),   &SupportedTagTypes[25] },\n{TYPE_HANDLER(cmsSigXYZType,                   XYZ),                 &SupportedTagTypes[26] },\n{TYPE_HANDLER(cmsCorbisBrokenXYZtype,          XYZ),                 &SupportedTagTypes[27] },\n{TYPE_HANDLER(cmsMonacoBrokenCurveType,        Curve),               &SupportedTagTypes[28] },\n{TYPE_HANDLER(cmsSigProfileSequenceIdType,     ProfileSequenceId),   &SupportedTagTypes[29] },\n{TYPE_HANDLER(cmsSigDictType,                  Dictionary),          &SupportedTagTypes[30] },\n{TYPE_HANDLER(cmsSigVcgtType,                  vcgt),                NULL }\n};\n\n\n_cmsTagTypePluginChunkType _cmsTagTypePluginChunk = { NULL };\n\n\n\n// Duplicates the zone of memory used by the plug-in in the new context\nstatic\nvoid DupTagTypeList(struct _cmsContext_struct* ctx, \n                    const struct _cmsContext_struct* src, \n                    int loc)\n{\n   _cmsTagTypePluginChunkType newHead = { NULL };\n   _cmsTagTypeLinkedList*  entry;\n   _cmsTagTypeLinkedList*  Anterior = NULL;\n   _cmsTagTypePluginChunkType* head = (_cmsTagTypePluginChunkType*) src->chunks[loc];\n\n   // Walk the list copying all nodes\n   for (entry = head->TagTypes;\n       entry != NULL;\n       entry = entry ->Next) {\n\n           _cmsTagTypeLinkedList *newEntry = ( _cmsTagTypeLinkedList *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsTagTypeLinkedList));\n\n           if (newEntry == NULL) \n               return;\n\n           // We want to keep the linked list order, so this is a little bit tricky\n           newEntry -> Next = NULL;\n           if (Anterior)\n               Anterior -> Next = newEntry;\n\n           Anterior = newEntry;\n\n           if (newHead.TagTypes == NULL)\n               newHead.TagTypes = newEntry;\n   }\n\n   ctx ->chunks[loc] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsTagTypePluginChunkType));\n}\n\n\nvoid _cmsAllocTagTypePluginChunk(struct _cmsContext_struct* ctx, \n                                 const struct _cmsContext_struct* src)\n{\n    if (src != NULL) {\n        \n        // Duplicate the LIST\n        DupTagTypeList(ctx, src, TagTypePlugin);\n    }\n    else {\n        static _cmsTagTypePluginChunkType TagTypePluginChunk = { NULL };\n        ctx ->chunks[TagTypePlugin] = _cmsSubAllocDup(ctx ->MemPool, &TagTypePluginChunk, sizeof(_cmsTagTypePluginChunkType));\n    }\n}\n\nvoid _cmsAllocMPETypePluginChunk(struct _cmsContext_struct* ctx, \n                               const struct _cmsContext_struct* src)\n{\n    if (src != NULL) {\n        \n        // Duplicate the LIST\n        DupTagTypeList(ctx, src, MPEPlugin);\n    }\n    else {\n        static _cmsTagTypePluginChunkType TagTypePluginChunk = { NULL };\n        ctx ->chunks[MPEPlugin] = _cmsSubAllocDup(ctx ->MemPool, &TagTypePluginChunk, sizeof(_cmsTagTypePluginChunkType));\n    }\n\n}\n\n\n// Both kind of plug-ins share same structure\ncmsBool  _cmsRegisterTagTypePlugin(cmsContext id, cmsPluginBase* Data)\n{\n    return RegisterTypesPlugin(id, Data, TagTypePlugin);\n}\n\ncmsBool  _cmsRegisterMultiProcessElementPlugin(cmsContext id, cmsPluginBase* Data)\n{\n    return RegisterTypesPlugin(id, Data,MPEPlugin);\n}\n\n\n// Wrapper for tag types\ncmsTagTypeHandler* _cmsGetTagTypeHandler(cmsContext ContextID, cmsTagTypeSignature sig)\n{\n    _cmsTagTypePluginChunkType* ctx = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(ContextID, TagTypePlugin);\n\n    return GetHandler(sig, ctx->TagTypes, SupportedTagTypes);\n}\n\n// ********************************************************************************\n// Tag support main routines\n// ********************************************************************************\n\ntypedef struct _cmsTagLinkedList_st {\n\n            cmsTagSignature Signature;\n            cmsTagDescriptor Descriptor;\n            struct _cmsTagLinkedList_st* Next;\n\n} _cmsTagLinkedList;\n\n// This is the list of built-in tags\nstatic _cmsTagLinkedList SupportedTags[] = {\n\n    { cmsSigAToB0Tag,               { 1, 3,  { cmsSigLut16Type,  cmsSigLutAtoBType, cmsSigLut8Type}, DecideLUTtypeA2B}, &SupportedTags[1]},\n    { cmsSigAToB1Tag,               { 1, 3,  { cmsSigLut16Type,  cmsSigLutAtoBType, cmsSigLut8Type}, DecideLUTtypeA2B}, &SupportedTags[2]},\n    { cmsSigAToB2Tag,               { 1, 3,  { cmsSigLut16Type,  cmsSigLutAtoBType, cmsSigLut8Type}, DecideLUTtypeA2B}, &SupportedTags[3]},\n    { cmsSigBToA0Tag,               { 1, 3,  { cmsSigLut16Type,  cmsSigLutBtoAType, cmsSigLut8Type}, DecideLUTtypeB2A}, &SupportedTags[4]},\n    { cmsSigBToA1Tag,               { 1, 3,  { cmsSigLut16Type,  cmsSigLutBtoAType, cmsSigLut8Type}, DecideLUTtypeB2A}, &SupportedTags[5]},\n    { cmsSigBToA2Tag,               { 1, 3,  { cmsSigLut16Type,  cmsSigLutBtoAType, cmsSigLut8Type}, DecideLUTtypeB2A}, &SupportedTags[6]},\n\n    // Allow corbis  and its broken XYZ type\n    { cmsSigRedColorantTag,         { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, DecideXYZtype}, &SupportedTags[7]},\n    { cmsSigGreenColorantTag,       { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, DecideXYZtype}, &SupportedTags[8]},\n    { cmsSigBlueColorantTag,        { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, DecideXYZtype}, &SupportedTags[9]},\n\n    { cmsSigRedTRCTag,              { 1, 3, { cmsSigCurveType, cmsSigParametricCurveType, cmsMonacoBrokenCurveType }, DecideCurveType}, &SupportedTags[10]},\n    { cmsSigGreenTRCTag,            { 1, 3, { cmsSigCurveType, cmsSigParametricCurveType, cmsMonacoBrokenCurveType }, DecideCurveType}, &SupportedTags[11]},\n    { cmsSigBlueTRCTag,             { 1, 3, { cmsSigCurveType, cmsSigParametricCurveType, cmsMonacoBrokenCurveType }, DecideCurveType}, &SupportedTags[12]},\n\n    { cmsSigCalibrationDateTimeTag, { 1, 1, { cmsSigDateTimeType }, NULL}, &SupportedTags[13]},\n    { cmsSigCharTargetTag,          { 1, 1, { cmsSigTextType },     NULL}, &SupportedTags[14]},\n\n    { cmsSigChromaticAdaptationTag, { 9, 1, { cmsSigS15Fixed16ArrayType }, NULL}, &SupportedTags[15]},\n    { cmsSigChromaticityTag,        { 1, 1, { cmsSigChromaticityType    }, NULL}, &SupportedTags[16]},\n    { cmsSigColorantOrderTag,       { 1, 1, { cmsSigColorantOrderType   }, NULL}, &SupportedTags[17]},\n    { cmsSigColorantTableTag,       { 1, 1, { cmsSigColorantTableType   }, NULL}, &SupportedTags[18]},\n    { cmsSigColorantTableOutTag,    { 1, 1, { cmsSigColorantTableType   }, NULL}, &SupportedTags[19]},\n\n    { cmsSigCopyrightTag,           { 1, 3, { cmsSigTextType,  cmsSigMultiLocalizedUnicodeType, cmsSigTextDescriptionType}, DecideTextType}, &SupportedTags[20]},\n    { cmsSigDateTimeTag,            { 1, 1, { cmsSigDateTimeType }, NULL}, &SupportedTags[21]},\n\n    { cmsSigDeviceMfgDescTag,       { 1, 3, { cmsSigTextDescriptionType, cmsSigMultiLocalizedUnicodeType, cmsSigTextType}, DecideTextDescType}, &SupportedTags[22]},\n    { cmsSigDeviceModelDescTag,     { 1, 3, { cmsSigTextDescriptionType, cmsSigMultiLocalizedUnicodeType, cmsSigTextType}, DecideTextDescType}, &SupportedTags[23]},\n\n    { cmsSigGamutTag,               { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type }, DecideLUTtypeB2A}, &SupportedTags[24]},\n\n    { cmsSigGrayTRCTag,             { 1, 2, { cmsSigCurveType, cmsSigParametricCurveType }, DecideCurveType}, &SupportedTags[25]},\n    { cmsSigLuminanceTag,           { 1, 1, { cmsSigXYZType }, NULL}, &SupportedTags[26]},\n\n    { cmsSigMediaBlackPointTag,     { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, NULL}, &SupportedTags[27]},\n    { cmsSigMediaWhitePointTag,     { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, NULL}, &SupportedTags[28]},\n\n    { cmsSigNamedColor2Tag,         { 1, 1, { cmsSigNamedColor2Type }, NULL}, &SupportedTags[29]},\n\n    { cmsSigPreview0Tag,            { 1, 3,  { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type }, DecideLUTtypeB2A}, &SupportedTags[30]},\n    { cmsSigPreview1Tag,            { 1, 3,  { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type }, DecideLUTtypeB2A}, &SupportedTags[31]},\n    { cmsSigPreview2Tag,            { 1, 3,  { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type }, DecideLUTtypeB2A}, &SupportedTags[32]},\n\n    { cmsSigProfileDescriptionTag,  { 1, 3, { cmsSigTextDescriptionType, cmsSigMultiLocalizedUnicodeType, cmsSigTextType}, DecideTextDescType}, &SupportedTags[33]},\n    { cmsSigProfileSequenceDescTag, { 1, 1, { cmsSigProfileSequenceDescType }, NULL}, &SupportedTags[34]},\n    { cmsSigTechnologyTag,          { 1, 1, { cmsSigSignatureType }, NULL},  &SupportedTags[35]},\n\n    { cmsSigColorimetricIntentImageStateTag,   { 1, 1, { cmsSigSignatureType }, NULL}, &SupportedTags[36]},\n    { cmsSigPerceptualRenderingIntentGamutTag, { 1, 1, { cmsSigSignatureType }, NULL}, &SupportedTags[37]},\n    { cmsSigSaturationRenderingIntentGamutTag, { 1, 1, { cmsSigSignatureType }, NULL}, &SupportedTags[38]},\n\n    { cmsSigMeasurementTag,         { 1, 1, { cmsSigMeasurementType }, NULL}, &SupportedTags[39]},\n\n    { cmsSigPs2CRD0Tag,             { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[40]},\n    { cmsSigPs2CRD1Tag,             { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[41]},\n    { cmsSigPs2CRD2Tag,             { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[42]},\n    { cmsSigPs2CRD3Tag,             { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[43]},\n    { cmsSigPs2CSATag,              { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[44]},\n    { cmsSigPs2RenderingIntentTag,  { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[45]},\n\n    { cmsSigViewingCondDescTag,     { 1, 3, { cmsSigTextDescriptionType, cmsSigMultiLocalizedUnicodeType, cmsSigTextType}, DecideTextDescType}, &SupportedTags[46]},\n\n    { cmsSigUcrBgTag,               { 1, 1, { cmsSigUcrBgType}, NULL},    &SupportedTags[47]},\n    { cmsSigCrdInfoTag,             { 1, 1, { cmsSigCrdInfoType}, NULL},  &SupportedTags[48]},\n\n    { cmsSigDToB0Tag,               { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[49]},\n    { cmsSigDToB1Tag,               { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[50]},\n    { cmsSigDToB2Tag,               { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[51]},\n    { cmsSigDToB3Tag,               { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[52]},\n    { cmsSigBToD0Tag,               { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[53]},\n    { cmsSigBToD1Tag,               { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[54]},\n    { cmsSigBToD2Tag,               { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[55]},\n    { cmsSigBToD3Tag,               { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[56]},\n\n    { cmsSigScreeningDescTag,       { 1, 1, { cmsSigTextDescriptionType },    NULL}, &SupportedTags[57]},\n    { cmsSigViewingConditionsTag,   { 1, 1, { cmsSigViewingConditionsType },  NULL}, &SupportedTags[58]},\n\n    { cmsSigScreeningTag,           { 1, 1, { cmsSigScreeningType},          NULL }, &SupportedTags[59]},\n    { cmsSigVcgtTag,                { 1, 1, { cmsSigVcgtType},               NULL }, &SupportedTags[60]},\n    { cmsSigMetaTag,                { 1, 1, { cmsSigDictType},               NULL }, &SupportedTags[61]},\n    { cmsSigProfileSequenceIdTag,   { 1, 1, { cmsSigProfileSequenceIdType},  NULL },  &SupportedTags[62]},\n    { cmsSigProfileDescriptionMLTag,{ 1, 1, { cmsSigMultiLocalizedUnicodeType}, NULL}, NULL}\n\n\n};\n\n/*\n    Not supported                 Why\n    =======================       =========================================\n    cmsSigOutputResponseTag   ==> WARNING, POSSIBLE PATENT ON THIS SUBJECT!\n    cmsSigNamedColorTag       ==> Deprecated\n    cmsSigDataTag             ==> Ancient, unused\n    cmsSigDeviceSettingsTag   ==> Deprecated, useless\n*/\n\n\n_cmsTagPluginChunkType _cmsTagPluginChunk = { NULL };\n\n\n// Duplicates the zone of memory used by the plug-in in the new context\nstatic\nvoid DupTagList(struct _cmsContext_struct* ctx, \n                    const struct _cmsContext_struct* src)\n{\n   _cmsTagPluginChunkType newHead = { NULL };\n   _cmsTagLinkedList*  entry;\n   _cmsTagLinkedList*  Anterior = NULL;\n   _cmsTagPluginChunkType* head = (_cmsTagPluginChunkType*) src->chunks[TagPlugin];\n\n   // Walk the list copying all nodes\n   for (entry = head->Tag;\n       entry != NULL;\n       entry = entry ->Next) {\n\n           _cmsTagLinkedList *newEntry = ( _cmsTagLinkedList *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsTagLinkedList));\n\n           if (newEntry == NULL) \n               return;\n\n           // We want to keep the linked list order, so this is a little bit tricky\n           newEntry -> Next = NULL;\n           if (Anterior)\n               Anterior -> Next = newEntry;\n\n           Anterior = newEntry;\n\n           if (newHead.Tag == NULL)\n               newHead.Tag = newEntry;\n   }\n\n   ctx ->chunks[TagPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsTagPluginChunkType));\n}\n\nvoid _cmsAllocTagPluginChunk(struct _cmsContext_struct* ctx, \n                                 const struct _cmsContext_struct* src)\n{\n    if (src != NULL) {\n\n        DupTagList(ctx, src);\n    }\n    else {\n        static _cmsTagPluginChunkType TagPluginChunk = { NULL };\n        ctx ->chunks[TagPlugin] = _cmsSubAllocDup(ctx ->MemPool, &TagPluginChunk, sizeof(_cmsTagPluginChunkType));\n    }\n\n}\n\ncmsBool  _cmsRegisterTagPlugin(cmsContext id, cmsPluginBase* Data)\n{\n    cmsPluginTag* Plugin = (cmsPluginTag*) Data;\n    _cmsTagLinkedList *pt;\n    _cmsTagPluginChunkType* TagPluginChunk = ( _cmsTagPluginChunkType*) _cmsContextGetClientChunk(id, TagPlugin);\n\n    if (Data == NULL) {\n\n        TagPluginChunk->Tag = NULL;\n        return TRUE;\n    }\n\n    pt = (_cmsTagLinkedList*) _cmsPluginMalloc(id, sizeof(_cmsTagLinkedList));\n    if (pt == NULL) return FALSE;\n\n    pt ->Signature  = Plugin ->Signature;\n    pt ->Descriptor = Plugin ->Descriptor;\n    pt ->Next       = TagPluginChunk ->Tag;\n\n    TagPluginChunk ->Tag = pt;\n    \n    return TRUE;\n}\n\n// Return a descriptor for a given tag or NULL\ncmsTagDescriptor* _cmsGetTagDescriptor(cmsContext ContextID, cmsTagSignature sig)\n{\n    _cmsTagLinkedList* pt;\n    _cmsTagPluginChunkType* TagPluginChunk = ( _cmsTagPluginChunkType*) _cmsContextGetClientChunk(ContextID, TagPlugin);\n\n    for (pt = TagPluginChunk->Tag;\n             pt != NULL;\n             pt = pt ->Next) {\n\n                if (sig == pt -> Signature) return &pt ->Descriptor;\n    }\n\n    for (pt = SupportedTags;\n            pt != NULL;\n            pt = pt ->Next) {\n\n                if (sig == pt -> Signature) return &pt ->Descriptor;\n    }\n\n    return NULL;\n}\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/src/cmsvirt.c",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2014 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n//\n\n#include \"lcms2_internal.h\"\n\n// Virtual (built-in) profiles\n// -----------------------------------------------------------------------------------\n\nstatic\ncmsBool SetTextTags(cmsHPROFILE hProfile, const wchar_t* Description)\n{\n    cmsMLU *DescriptionMLU, *CopyrightMLU;\n    cmsBool  rc = FALSE;\n    cmsContext ContextID = cmsGetProfileContextID(hProfile);\n\n    DescriptionMLU  = cmsMLUalloc(ContextID, 1);\n    CopyrightMLU    = cmsMLUalloc(ContextID, 1);\n\n    if (DescriptionMLU == NULL || CopyrightMLU == NULL) goto Error;\n\n    if (!cmsMLUsetWide(DescriptionMLU,  \"en\", \"US\", Description)) goto Error;\n    if (!cmsMLUsetWide(CopyrightMLU,    \"en\", \"US\", L\"No copyright, use freely\")) goto Error;\n\n    if (!cmsWriteTag(hProfile, cmsSigProfileDescriptionTag,  DescriptionMLU)) goto Error;\n    if (!cmsWriteTag(hProfile, cmsSigCopyrightTag,           CopyrightMLU)) goto Error;\n\n    rc = TRUE;\n\nError:\n\n    if (DescriptionMLU)\n        cmsMLUfree(DescriptionMLU);\n    if (CopyrightMLU)\n        cmsMLUfree(CopyrightMLU);\n    return rc;\n}\n\n\nstatic\ncmsBool  SetSeqDescTag(cmsHPROFILE hProfile, const char* Model)\n{\n    cmsBool  rc = FALSE;\n    cmsContext ContextID = cmsGetProfileContextID(hProfile);\n    cmsSEQ* Seq = cmsAllocProfileSequenceDescription(ContextID, 1);\n\n    if (Seq == NULL) return FALSE;\n\n    Seq->seq[0].deviceMfg = (cmsSignature) 0;\n    Seq->seq[0].deviceModel = (cmsSignature) 0;\n\n#ifdef CMS_DONT_USE_INT64\n    Seq->seq[0].attributes[0] = 0;\n    Seq->seq[0].attributes[1] = 0;\n#else\n    Seq->seq[0].attributes = 0;\n#endif\n\n    Seq->seq[0].technology = (cmsTechnologySignature) 0;\n\n    cmsMLUsetASCII( Seq->seq[0].Manufacturer, cmsNoLanguage, cmsNoCountry, \"Little CMS\");\n    cmsMLUsetASCII( Seq->seq[0].Model,        cmsNoLanguage, cmsNoCountry, Model);\n\n    if (!_cmsWriteProfileSequence(hProfile, Seq)) goto Error;\n\n    rc = TRUE;\n\nError:\n    if (Seq)\n        cmsFreeProfileSequenceDescription(Seq);\n\n    return rc;\n}\n\n\n\n// This function creates a profile based on White point, primaries and\n// transfer functions.\ncmsHPROFILE CMSEXPORT cmsCreateRGBProfileTHR(cmsContext ContextID,\n                                          const cmsCIExyY* WhitePoint,\n                                          const cmsCIExyYTRIPLE* Primaries,\n                                          cmsToneCurve* const TransferFunction[3])\n{\n    cmsHPROFILE hICC;\n    cmsMAT3 MColorants;\n    cmsCIEXYZTRIPLE Colorants;\n    cmsCIExyY MaxWhite;\n    cmsMAT3 CHAD;\n    cmsCIEXYZ WhitePointXYZ;\n\n    hICC = cmsCreateProfilePlaceholder(ContextID);\n    if (!hICC)                          // can't allocate\n        return NULL;\n\n    cmsSetProfileVersion(hICC, 4.3);\n\n    cmsSetDeviceClass(hICC,      cmsSigDisplayClass);\n    cmsSetColorSpace(hICC,       cmsSigRgbData);\n    cmsSetPCS(hICC,              cmsSigXYZData);\n\n    cmsSetHeaderRenderingIntent(hICC,  INTENT_PERCEPTUAL);\n\n\n    // Implement profile using following tags:\n    //\n    //  1 cmsSigProfileDescriptionTag\n    //  2 cmsSigMediaWhitePointTag\n    //  3 cmsSigRedColorantTag\n    //  4 cmsSigGreenColorantTag\n    //  5 cmsSigBlueColorantTag\n    //  6 cmsSigRedTRCTag\n    //  7 cmsSigGreenTRCTag\n    //  8 cmsSigBlueTRCTag\n    //  9 Chromatic adaptation Tag\n    // This conforms a standard RGB DisplayProfile as says ICC, and then I add (As per addendum II)\n    // 10 cmsSigChromaticityTag\n\n\n    if (!SetTextTags(hICC, L\"RGB built-in\")) goto Error;\n\n    if (WhitePoint) {\n\n        if (!cmsWriteTag(hICC, cmsSigMediaWhitePointTag, cmsD50_XYZ())) goto Error;\n\n        cmsxyY2XYZ(&WhitePointXYZ, WhitePoint);\n        _cmsAdaptationMatrix(&CHAD, NULL, &WhitePointXYZ, cmsD50_XYZ());\n\n        // This is a V4 tag, but many CMM does read and understand it no matter which version\n        if (!cmsWriteTag(hICC, cmsSigChromaticAdaptationTag, (void*) &CHAD)) goto Error;\n    }\n\n    if (WhitePoint && Primaries) {\n\n        MaxWhite.x =  WhitePoint -> x;\n        MaxWhite.y =  WhitePoint -> y;\n        MaxWhite.Y =  1.0;\n\n        if (!_cmsBuildRGB2XYZtransferMatrix(&MColorants, &MaxWhite, Primaries)) goto Error;\n\n        Colorants.Red.X   = MColorants.v[0].n[0];\n        Colorants.Red.Y   = MColorants.v[1].n[0];\n        Colorants.Red.Z   = MColorants.v[2].n[0];\n\n        Colorants.Green.X = MColorants.v[0].n[1];\n        Colorants.Green.Y = MColorants.v[1].n[1];\n        Colorants.Green.Z = MColorants.v[2].n[1];\n\n        Colorants.Blue.X  = MColorants.v[0].n[2];\n        Colorants.Blue.Y  = MColorants.v[1].n[2];\n        Colorants.Blue.Z  = MColorants.v[2].n[2];\n\n        if (!cmsWriteTag(hICC, cmsSigRedColorantTag,   (void*) &Colorants.Red)) goto Error;\n        if (!cmsWriteTag(hICC, cmsSigBlueColorantTag,  (void*) &Colorants.Blue)) goto Error;\n        if (!cmsWriteTag(hICC, cmsSigGreenColorantTag, (void*) &Colorants.Green)) goto Error;\n    }\n\n\n    if (TransferFunction) {\n\n        // Tries to minimize space. Thanks to Richard Hughes for this nice idea         \n        if (!cmsWriteTag(hICC, cmsSigRedTRCTag,   (void*) TransferFunction[0])) goto Error;\n\n        if (TransferFunction[1] == TransferFunction[0]) {\n\n            if (!cmsLinkTag (hICC, cmsSigGreenTRCTag, cmsSigRedTRCTag)) goto Error;\n\n        } else {\n\n            if (!cmsWriteTag(hICC, cmsSigGreenTRCTag, (void*) TransferFunction[1])) goto Error;\n        }\n\n        if (TransferFunction[2] == TransferFunction[0]) {\n\n            if (!cmsLinkTag (hICC, cmsSigBlueTRCTag, cmsSigRedTRCTag)) goto Error;\n\n        } else {\n\n            if (!cmsWriteTag(hICC, cmsSigBlueTRCTag, (void*) TransferFunction[2])) goto Error;\n        }\n    }\n\n    if (Primaries) {\n        if (!cmsWriteTag(hICC, cmsSigChromaticityTag, (void*) Primaries)) goto Error;\n    }\n\n\n    return hICC;\n\nError:\n    if (hICC)\n        cmsCloseProfile(hICC);\n    return NULL;\n}\n\ncmsHPROFILE CMSEXPORT cmsCreateRGBProfile(const cmsCIExyY* WhitePoint,\n                                          const cmsCIExyYTRIPLE* Primaries,\n                                          cmsToneCurve* const TransferFunction[3])\n{\n    return cmsCreateRGBProfileTHR(NULL, WhitePoint, Primaries, TransferFunction);\n}\n\n\n\n// This function creates a profile based on White point and transfer function.\ncmsHPROFILE CMSEXPORT cmsCreateGrayProfileTHR(cmsContext ContextID,\n                                           const cmsCIExyY* WhitePoint,\n                                           const cmsToneCurve* TransferFunction)\n{\n    cmsHPROFILE hICC;\n    cmsCIEXYZ tmp;\n\n    hICC = cmsCreateProfilePlaceholder(ContextID);\n    if (!hICC)                          // can't allocate\n        return NULL;\n\n    cmsSetProfileVersion(hICC, 4.3);\n\n    cmsSetDeviceClass(hICC,      cmsSigDisplayClass);\n    cmsSetColorSpace(hICC,       cmsSigGrayData);\n    cmsSetPCS(hICC,              cmsSigXYZData);\n    cmsSetHeaderRenderingIntent(hICC,  INTENT_PERCEPTUAL);\n\n\n    // Implement profile using following tags:\n    //\n    //  1 cmsSigProfileDescriptionTag\n    //  2 cmsSigMediaWhitePointTag\n    //  3 cmsSigGrayTRCTag\n\n    // This conforms a standard Gray DisplayProfile\n\n    // Fill-in the tags\n\n    if (!SetTextTags(hICC, L\"gray built-in\")) goto Error;\n\n\n    if (WhitePoint) {\n\n        cmsxyY2XYZ(&tmp, WhitePoint);\n        if (!cmsWriteTag(hICC, cmsSigMediaWhitePointTag, (void*) &tmp)) goto Error;\n    }\n\n    if (TransferFunction) {\n\n        if (!cmsWriteTag(hICC, cmsSigGrayTRCTag, (void*) TransferFunction)) goto Error;\n    }\n\n    return hICC;\n\nError:\n    if (hICC)\n        cmsCloseProfile(hICC);\n    return NULL;\n}\n\n\n\ncmsHPROFILE CMSEXPORT cmsCreateGrayProfile(const cmsCIExyY* WhitePoint,\n                                                    const cmsToneCurve* TransferFunction)\n{\n    return cmsCreateGrayProfileTHR(NULL, WhitePoint, TransferFunction);\n}\n\n// This is a devicelink operating in the target colorspace with as many transfer functions as components\n\ncmsHPROFILE CMSEXPORT cmsCreateLinearizationDeviceLinkTHR(cmsContext ContextID,\n                                                          cmsColorSpaceSignature ColorSpace,\n                                                          cmsToneCurve* const TransferFunctions[])\n{\n    cmsHPROFILE hICC;\n    cmsPipeline* Pipeline;\n    int nChannels;\n\n    hICC = cmsCreateProfilePlaceholder(ContextID);\n    if (!hICC)\n        return NULL;\n\n    cmsSetProfileVersion(hICC, 4.3);\n\n    cmsSetDeviceClass(hICC,      cmsSigLinkClass);\n    cmsSetColorSpace(hICC,       ColorSpace);\n    cmsSetPCS(hICC,              ColorSpace);\n\n    cmsSetHeaderRenderingIntent(hICC,  INTENT_PERCEPTUAL);\n\n    // Set up channels\n    nChannels = cmsChannelsOf(ColorSpace);\n\n    // Creates a Pipeline with prelinearization step only\n    Pipeline = cmsPipelineAlloc(ContextID, nChannels, nChannels);\n    if (Pipeline == NULL) goto Error;\n\n\n    // Copy tables to Pipeline\n    if (!cmsPipelineInsertStage(Pipeline, cmsAT_BEGIN, cmsStageAllocToneCurves(ContextID, nChannels, TransferFunctions)))\n        goto Error;\n\n    // Create tags\n    if (!SetTextTags(hICC, L\"Linearization built-in\")) goto Error;\n    if (!cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) Pipeline)) goto Error;\n    if (!SetSeqDescTag(hICC, \"Linearization built-in\")) goto Error;\n\n    // Pipeline is already on virtual profile\n    cmsPipelineFree(Pipeline);\n\n    // Ok, done\n    return hICC;\n\nError:\n    cmsPipelineFree(Pipeline);\n    if (hICC)\n        cmsCloseProfile(hICC);\n\n\n    return NULL;\n}\n\ncmsHPROFILE CMSEXPORT cmsCreateLinearizationDeviceLink(cmsColorSpaceSignature ColorSpace,\n                                                                 cmsToneCurve* const TransferFunctions[])\n{\n    return cmsCreateLinearizationDeviceLinkTHR(NULL, ColorSpace, TransferFunctions);\n}\n\n// Ink-limiting algorithm\n//\n//  Sum = C + M + Y + K\n//  If Sum > InkLimit\n//        Ratio= 1 - (Sum - InkLimit) / (C + M + Y)\n//        if Ratio <0\n//              Ratio=0\n//        endif\n//     Else\n//         Ratio=1\n//     endif\n//\n//     C = Ratio * C\n//     M = Ratio * M\n//     Y = Ratio * Y\n//     K: Does not change\n\nstatic\nint InkLimitingSampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo)\n{\n    cmsFloat64Number InkLimit = *(cmsFloat64Number *) Cargo;\n    cmsFloat64Number SumCMY, SumCMYK, Ratio;\n\n    InkLimit = (InkLimit * 655.35);\n\n    SumCMY   = In[0]  + In[1] + In[2];\n    SumCMYK  = SumCMY + In[3];\n\n    if (SumCMYK > InkLimit) {\n\n        Ratio = 1 - ((SumCMYK - InkLimit) / SumCMY);\n        if (Ratio < 0)\n            Ratio = 0;\n    }\n    else Ratio = 1;\n\n    Out[0] = _cmsQuickSaturateWord(In[0] * Ratio);     // C\n    Out[1] = _cmsQuickSaturateWord(In[1] * Ratio);     // M\n    Out[2] = _cmsQuickSaturateWord(In[2] * Ratio);     // Y\n\n    Out[3] = In[3];                                 // K (untouched)\n\n    return TRUE;\n}\n\n// This is a devicelink operating in CMYK for ink-limiting\n\ncmsHPROFILE CMSEXPORT cmsCreateInkLimitingDeviceLinkTHR(cmsContext ContextID,\n                                                     cmsColorSpaceSignature ColorSpace,\n                                                     cmsFloat64Number Limit)\n{\n    cmsHPROFILE hICC;\n    cmsPipeline* LUT;\n    cmsStage* CLUT;\n    int nChannels;\n\n    if (ColorSpace != cmsSigCmykData) {\n        cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, \"InkLimiting: Only CMYK currently supported\");\n        return NULL;\n    }\n\n    if (Limit < 0.0 || Limit > 400) {\n\n        cmsSignalError(ContextID, cmsERROR_RANGE, \"InkLimiting: Limit should be between 0..400\");\n        if (Limit < 0) Limit = 0;\n        if (Limit > 400) Limit = 400;\n\n    }\n\n    hICC = cmsCreateProfilePlaceholder(ContextID);\n    if (!hICC)                          // can't allocate\n        return NULL;\n\n    cmsSetProfileVersion(hICC, 4.3);\n\n    cmsSetDeviceClass(hICC,      cmsSigLinkClass);\n    cmsSetColorSpace(hICC,       ColorSpace);\n    cmsSetPCS(hICC,              ColorSpace);\n\n    cmsSetHeaderRenderingIntent(hICC,  INTENT_PERCEPTUAL);\n\n\n    // Creates a Pipeline with 3D grid only\n    LUT = cmsPipelineAlloc(ContextID, 4, 4);\n    if (LUT == NULL) goto Error;\n\n\n    nChannels = cmsChannelsOf(ColorSpace);\n\n    CLUT = cmsStageAllocCLut16bit(ContextID, 17, nChannels, nChannels, NULL);\n    if (CLUT == NULL) goto Error;\n\n    if (!cmsStageSampleCLut16bit(CLUT, InkLimitingSampler, (void*) &Limit, 0)) goto Error;\n\n    if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, nChannels)) ||\n        !cmsPipelineInsertStage(LUT, cmsAT_END, CLUT) ||\n        !cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, nChannels)))\n        goto Error;\n\n    // Create tags\n    if (!SetTextTags(hICC, L\"ink-limiting built-in\")) goto Error;\n\n    if (!cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) LUT))  goto Error;\n    if (!SetSeqDescTag(hICC, \"ink-limiting built-in\")) goto Error;\n\n    // cmsPipeline is already on virtual profile\n    cmsPipelineFree(LUT);\n\n    // Ok, done\n    return hICC;\n\nError:\n    if (LUT != NULL)\n        cmsPipelineFree(LUT);\n\n    if (hICC != NULL)\n        cmsCloseProfile(hICC);\n\n    return NULL;\n}\n\ncmsHPROFILE CMSEXPORT cmsCreateInkLimitingDeviceLink(cmsColorSpaceSignature ColorSpace, cmsFloat64Number Limit)\n{\n    return cmsCreateInkLimitingDeviceLinkTHR(NULL, ColorSpace, Limit);\n}\n\n\n// Creates a fake Lab identity.\ncmsHPROFILE CMSEXPORT cmsCreateLab2ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint)\n{\n    cmsHPROFILE hProfile;\n    cmsPipeline* LUT = NULL;\n\n    hProfile = cmsCreateRGBProfileTHR(ContextID, WhitePoint == NULL ? cmsD50_xyY() : WhitePoint, NULL, NULL);\n    if (hProfile == NULL) return NULL;\n\n    cmsSetProfileVersion(hProfile, 2.1);\n\n    cmsSetDeviceClass(hProfile, cmsSigAbstractClass);\n    cmsSetColorSpace(hProfile,  cmsSigLabData);\n    cmsSetPCS(hProfile,         cmsSigLabData);\n\n    if (!SetTextTags(hProfile, L\"Lab identity built-in\")) return NULL;\n\n    // An identity LUT is all we need\n    LUT = cmsPipelineAlloc(ContextID, 3, 3);\n    if (LUT == NULL) goto Error;\n\n    if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCLut(ContextID, 3)))\n        goto Error;\n\n    if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error;\n    cmsPipelineFree(LUT);\n\n    return hProfile;\n\nError:\n\n    if (LUT != NULL)\n        cmsPipelineFree(LUT);\n\n    if (hProfile != NULL)\n        cmsCloseProfile(hProfile);\n\n    return NULL;\n}\n\n\ncmsHPROFILE CMSEXPORT cmsCreateLab2Profile(const cmsCIExyY* WhitePoint)\n{\n    return cmsCreateLab2ProfileTHR(NULL, WhitePoint);\n}\n\n\n// Creates a fake Lab V4 identity.\ncmsHPROFILE CMSEXPORT cmsCreateLab4ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint)\n{\n    cmsHPROFILE hProfile;\n    cmsPipeline* LUT = NULL;\n\n    hProfile = cmsCreateRGBProfileTHR(ContextID, WhitePoint == NULL ? cmsD50_xyY() : WhitePoint, NULL, NULL);\n    if (hProfile == NULL) return NULL;\n\n    cmsSetProfileVersion(hProfile, 4.3);\n\n    cmsSetDeviceClass(hProfile, cmsSigAbstractClass);\n    cmsSetColorSpace(hProfile,  cmsSigLabData);\n    cmsSetPCS(hProfile,         cmsSigLabData);\n\n    if (!SetTextTags(hProfile, L\"Lab identity built-in\")) goto Error;\n\n    // An empty LUTs is all we need\n    LUT = cmsPipelineAlloc(ContextID, 3, 3);\n    if (LUT == NULL) goto Error;\n\n    if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3)))\n        goto Error;\n\n    if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error;\n    cmsPipelineFree(LUT);\n\n    return hProfile;\n\nError:\n\n    if (LUT != NULL)\n        cmsPipelineFree(LUT);\n\n    if (hProfile != NULL)\n        cmsCloseProfile(hProfile);\n\n    return NULL;\n}\n\ncmsHPROFILE CMSEXPORT cmsCreateLab4Profile(const cmsCIExyY* WhitePoint)\n{\n    return cmsCreateLab4ProfileTHR(NULL, WhitePoint);\n}\n\n\n// Creates a fake XYZ identity\ncmsHPROFILE CMSEXPORT cmsCreateXYZProfileTHR(cmsContext ContextID)\n{\n    cmsHPROFILE hProfile;\n    cmsPipeline* LUT = NULL;\n\n    hProfile = cmsCreateRGBProfileTHR(ContextID, cmsD50_xyY(), NULL, NULL);\n    if (hProfile == NULL) return NULL;\n\n    cmsSetProfileVersion(hProfile, 4.3);\n\n    cmsSetDeviceClass(hProfile, cmsSigAbstractClass);\n    cmsSetColorSpace(hProfile,  cmsSigXYZData);\n    cmsSetPCS(hProfile,         cmsSigXYZData);\n\n    if (!SetTextTags(hProfile, L\"XYZ identity built-in\")) goto Error;\n\n    // An identity LUT is all we need\n    LUT = cmsPipelineAlloc(ContextID, 3, 3);\n    if (LUT == NULL) goto Error;\n\n    if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3)))\n        goto Error;\n\n    if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error;\n    cmsPipelineFree(LUT);\n\n    return hProfile;\n\nError:\n\n    if (LUT != NULL)\n        cmsPipelineFree(LUT);\n\n    if (hProfile != NULL)\n        cmsCloseProfile(hProfile);\n\n    return NULL;\n}\n\n\ncmsHPROFILE CMSEXPORT cmsCreateXYZProfile(void)\n{\n    return cmsCreateXYZProfileTHR(NULL);\n}\n\n\n//sRGB Curves are defined by:\n//\n//If  RsRGB,GsRGB, BsRGB < 0.04045\n//\n//    R =  RsRGB / 12.92\n//    G =  GsRGB / 12.92\n//    B =  BsRGB / 12.92\n//\n//\n//else if  RsRGB,GsRGB, BsRGB >= 0.04045\n//\n//    R = ((RsRGB + 0.055) / 1.055)^2.4\n//    G = ((GsRGB + 0.055) / 1.055)^2.4\n//    B = ((BsRGB + 0.055) / 1.055)^2.4\n\nstatic\ncmsToneCurve* Build_sRGBGamma(cmsContext ContextID)\n{\n    cmsFloat64Number Parameters[5];\n\n    Parameters[0] = 2.4;\n    Parameters[1] = 1. / 1.055;\n    Parameters[2] = 0.055 / 1.055;\n    Parameters[3] = 1. / 12.92;\n    Parameters[4] = 0.04045;\n\n    return cmsBuildParametricToneCurve(ContextID, 4, Parameters);\n}\n\n// Create the ICC virtual profile for sRGB space\ncmsHPROFILE CMSEXPORT cmsCreate_sRGBProfileTHR(cmsContext ContextID)\n{\n       cmsCIExyY       D65;\n       cmsCIExyYTRIPLE Rec709Primaries = {\n                                   {0.6400, 0.3300, 1.0},\n                                   {0.3000, 0.6000, 1.0},\n                                   {0.1500, 0.0600, 1.0}\n                                   };\n       cmsToneCurve* Gamma22[3];\n       cmsHPROFILE  hsRGB;\n\n       cmsWhitePointFromTemp(&D65, 6504);\n       Gamma22[0] = Gamma22[1] = Gamma22[2] = Build_sRGBGamma(ContextID);\n       if (Gamma22[0] == NULL) return NULL;\n\n       hsRGB = cmsCreateRGBProfileTHR(ContextID, &D65, &Rec709Primaries, Gamma22);\n       cmsFreeToneCurve(Gamma22[0]);\n       if (hsRGB == NULL) return NULL;\n\n       if (!SetTextTags(hsRGB, L\"sRGB built-in\")) {\n           cmsCloseProfile(hsRGB);\n           return NULL;\n       }\n\n       return hsRGB;\n}\n\ncmsHPROFILE CMSEXPORT cmsCreate_sRGBProfile(void)\n{\n    return cmsCreate_sRGBProfileTHR(NULL);\n}\n\n\n\ntypedef struct {\n                cmsFloat64Number Brightness;\n                cmsFloat64Number Contrast;\n                cmsFloat64Number Hue;\n                cmsFloat64Number Saturation;\n                cmsCIEXYZ WPsrc, WPdest;\n\n} BCHSWADJUSTS, *LPBCHSWADJUSTS;\n\n\nstatic\nint bchswSampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo)\n{\n    cmsCIELab LabIn, LabOut;\n    cmsCIELCh LChIn, LChOut;\n    cmsCIEXYZ XYZ;\n    LPBCHSWADJUSTS bchsw = (LPBCHSWADJUSTS) Cargo;\n\n\n    cmsLabEncoded2Float(&LabIn, In);\n\n\n    cmsLab2LCh(&LChIn, &LabIn);\n\n    // Do some adjusts on LCh\n\n    LChOut.L = LChIn.L * bchsw ->Contrast + bchsw ->Brightness;\n    LChOut.C = LChIn.C + bchsw -> Saturation;\n    LChOut.h = LChIn.h + bchsw -> Hue;\n\n\n    cmsLCh2Lab(&LabOut, &LChOut);\n\n    // Move white point in Lab\n\n    cmsLab2XYZ(&bchsw ->WPsrc,  &XYZ, &LabOut);\n    cmsXYZ2Lab(&bchsw ->WPdest, &LabOut, &XYZ);\n\n    // Back to encoded\n\n    cmsFloat2LabEncoded(Out, &LabOut);\n\n    return TRUE;\n}\n\n\n// Creates an abstract profile operating in Lab space for Brightness,\n// contrast, Saturation and white point displacement\n\ncmsHPROFILE CMSEXPORT cmsCreateBCHSWabstractProfileTHR(cmsContext ContextID,\n    int nLUTPoints,\n    cmsFloat64Number Bright,\n    cmsFloat64Number Contrast,\n    cmsFloat64Number Hue,\n    cmsFloat64Number Saturation,\n    int TempSrc,\n    int TempDest)\n{\n    cmsHPROFILE hICC;\n    cmsPipeline* Pipeline;\n    BCHSWADJUSTS bchsw;\n    cmsCIExyY WhitePnt;\n    cmsStage* CLUT;\n    cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS];\n    int i;\n\n    bchsw.Brightness = Bright;\n    bchsw.Contrast   = Contrast;\n    bchsw.Hue        = Hue;\n    bchsw.Saturation = Saturation;\n\n    cmsWhitePointFromTemp(&WhitePnt, TempSrc );\n    cmsxyY2XYZ(&bchsw.WPsrc, &WhitePnt);\n\n    cmsWhitePointFromTemp(&WhitePnt, TempDest);\n    cmsxyY2XYZ(&bchsw.WPdest, &WhitePnt);\n\n    hICC = cmsCreateProfilePlaceholder(ContextID);\n    if (!hICC)                          // can't allocate\n        return NULL;\n\n\n    cmsSetDeviceClass(hICC,      cmsSigAbstractClass);\n    cmsSetColorSpace(hICC,       cmsSigLabData);\n    cmsSetPCS(hICC,              cmsSigLabData);\n\n    cmsSetHeaderRenderingIntent(hICC,  INTENT_PERCEPTUAL);\n\n    // Creates a Pipeline with 3D grid only\n    Pipeline = cmsPipelineAlloc(ContextID, 3, 3);\n    if (Pipeline == NULL) {\n        cmsCloseProfile(hICC);\n        return NULL;\n    }\n\n    for (i=0; i < MAX_INPUT_DIMENSIONS; i++) Dimensions[i] = nLUTPoints;\n    CLUT = cmsStageAllocCLut16bitGranular(ContextID, Dimensions, 3, 3, NULL);\n    if (CLUT == NULL) return NULL;\n\n\n    if (!cmsStageSampleCLut16bit(CLUT, bchswSampler, (void*) &bchsw, 0)) {\n\n        // Shouldn't reach here\n        goto Error;\n    }\n\n    if (!cmsPipelineInsertStage(Pipeline, cmsAT_END, CLUT)) {\n        goto Error;\n    }\n\n    // Create tags\n    if (!SetTextTags(hICC, L\"BCHS built-in\")) return NULL;\n\n    cmsWriteTag(hICC, cmsSigMediaWhitePointTag, (void*) cmsD50_XYZ());\n\n    cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) Pipeline);\n\n    // Pipeline is already on virtual profile\n    cmsPipelineFree(Pipeline);\n\n    // Ok, done\n    return hICC;\n\nError:\n    cmsPipelineFree(Pipeline);\n    cmsCloseProfile(hICC);\n    return NULL;\n}\n\n\nCMSAPI cmsHPROFILE   CMSEXPORT cmsCreateBCHSWabstractProfile(int nLUTPoints,\n                                                             cmsFloat64Number Bright,\n                                                             cmsFloat64Number Contrast,\n                                                             cmsFloat64Number Hue,\n                                                             cmsFloat64Number Saturation,\n                                                             int TempSrc,\n                                                             int TempDest)\n{\n    return cmsCreateBCHSWabstractProfileTHR(NULL, nLUTPoints, Bright, Contrast, Hue, Saturation, TempSrc, TempDest);\n}\n\n\n// Creates a fake NULL profile. This profile return 1 channel as always 0.\n// Is useful only for gamut checking tricks\ncmsHPROFILE CMSEXPORT cmsCreateNULLProfileTHR(cmsContext ContextID)\n{\n    cmsHPROFILE hProfile;\n    cmsPipeline* LUT = NULL;\n    cmsStage* PostLin;\n    cmsToneCurve* EmptyTab;\n    cmsUInt16Number Zero[2] = { 0, 0 };\n\n    hProfile = cmsCreateProfilePlaceholder(ContextID);\n    if (!hProfile)                          // can't allocate\n        return NULL;\n\n    cmsSetProfileVersion(hProfile, 4.3);\n\n    if (!SetTextTags(hProfile, L\"NULL profile built-in\")) goto Error;\n\n\n\n    cmsSetDeviceClass(hProfile, cmsSigOutputClass);\n    cmsSetColorSpace(hProfile,  cmsSigGrayData);\n    cmsSetPCS(hProfile,         cmsSigLabData);\n\n    // An empty LUTs is all we need\n    LUT = cmsPipelineAlloc(ContextID, 1, 1);\n    if (LUT == NULL) goto Error;\n\n    EmptyTab = cmsBuildTabulatedToneCurve16(ContextID, 2, Zero);\n    PostLin = cmsStageAllocToneCurves(ContextID, 1, &EmptyTab);\n    cmsFreeToneCurve(EmptyTab);\n\n    if (!cmsPipelineInsertStage(LUT, cmsAT_END, PostLin))\n        goto Error;\n\n    if (!cmsWriteTag(hProfile, cmsSigBToA0Tag, (void*) LUT)) goto Error;\n    if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, cmsD50_XYZ())) goto Error;\n\n    cmsPipelineFree(LUT);\n    return hProfile;\n\nError:\n\n    if (LUT != NULL)\n        cmsPipelineFree(LUT);\n\n    if (hProfile != NULL)\n        cmsCloseProfile(hProfile);\n\n    return NULL;\n}\n\ncmsHPROFILE CMSEXPORT cmsCreateNULLProfile(void)\n{\n    return cmsCreateNULLProfileTHR(NULL);\n}\n\n\nstatic\nint IsPCS(cmsColorSpaceSignature ColorSpace)\n{\n    return (ColorSpace == cmsSigXYZData ||\n            ColorSpace == cmsSigLabData);\n}\n\n\nstatic\nvoid FixColorSpaces(cmsHPROFILE hProfile,\n                              cmsColorSpaceSignature ColorSpace,\n                              cmsColorSpaceSignature PCS,\n                              cmsUInt32Number dwFlags)\n{\n    if (dwFlags & cmsFLAGS_GUESSDEVICECLASS) {\n\n            if (IsPCS(ColorSpace) && IsPCS(PCS)) {\n\n                    cmsSetDeviceClass(hProfile,      cmsSigAbstractClass);\n                    cmsSetColorSpace(hProfile,       ColorSpace);\n                    cmsSetPCS(hProfile,              PCS);\n                    return;\n            }\n\n            if (IsPCS(ColorSpace) && !IsPCS(PCS)) {\n\n                    cmsSetDeviceClass(hProfile, cmsSigOutputClass);\n                    cmsSetPCS(hProfile,         ColorSpace);\n                    cmsSetColorSpace(hProfile,  PCS);\n                    return;\n            }\n\n            if (IsPCS(PCS) && !IsPCS(ColorSpace)) {\n\n                   cmsSetDeviceClass(hProfile,  cmsSigInputClass);\n                   cmsSetColorSpace(hProfile,   ColorSpace);\n                   cmsSetPCS(hProfile,          PCS);\n                   return;\n            }\n    }\n\n    cmsSetDeviceClass(hProfile,      cmsSigLinkClass);\n    cmsSetColorSpace(hProfile,       ColorSpace);\n    cmsSetPCS(hProfile,              PCS);\n}\n\n\n\n// This function creates a named color profile dumping all the contents of transform to a single profile\n// In this way, LittleCMS may be used to \"group\" several named color databases into a single profile.\n// It has, however, several minor limitations. PCS is always Lab, which is not very critic since this\n// is the normal PCS for named color profiles.\nstatic\ncmsHPROFILE CreateNamedColorDevicelink(cmsHTRANSFORM xform)\n{\n    _cmsTRANSFORM* v = (_cmsTRANSFORM*) xform;\n    cmsHPROFILE hICC = NULL;\n    int i, nColors;\n    cmsNAMEDCOLORLIST *nc2 = NULL, *Original = NULL;\n\n    // Create an empty placeholder\n    hICC = cmsCreateProfilePlaceholder(v->ContextID);\n    if (hICC == NULL) return NULL;\n\n    // Critical information\n    cmsSetDeviceClass(hICC, cmsSigNamedColorClass);\n    cmsSetColorSpace(hICC, v ->ExitColorSpace);\n    cmsSetPCS(hICC, cmsSigLabData);\n\n    // Tag profile with information\n    if (!SetTextTags(hICC, L\"Named color devicelink\")) goto Error;\n\n    Original = cmsGetNamedColorList(xform);\n    if (Original == NULL) goto Error;\n\n    nColors = cmsNamedColorCount(Original);\n    nc2     = cmsDupNamedColorList(Original);\n    if (nc2 == NULL) goto Error;\n\n    // Colorant count now depends on the output space\n    nc2 ->ColorantCount = cmsPipelineOutputChannels(v ->Lut);\n\n    // Make sure we have proper formatters\n    cmsChangeBuffersFormat(xform, TYPE_NAMED_COLOR_INDEX,\n        FLOAT_SH(0) | COLORSPACE_SH(_cmsLCMScolorSpace(v ->ExitColorSpace))\n        | BYTES_SH(2) | CHANNELS_SH(cmsChannelsOf(v ->ExitColorSpace)));\n\n    // Apply the transfor to colorants.\n    for (i=0; i < nColors; i++) {\n        cmsDoTransform(xform, &i, nc2 ->List[i].DeviceColorant, 1);\n    }\n\n    if (!cmsWriteTag(hICC, cmsSigNamedColor2Tag, (void*) nc2)) goto Error;\n    cmsFreeNamedColorList(nc2);\n\n    return hICC;\n\nError:\n    if (hICC != NULL) cmsCloseProfile(hICC);\n    return NULL;\n}\n\n\n// This structure holds information about which MPU can be stored on a profile based on the version\n\ntypedef struct {\n    cmsBool              IsV4;             // Is a V4 tag?\n    cmsTagSignature      RequiredTag;      // Set to 0 for both types\n    cmsTagTypeSignature  LutType;          // The LUT type\n    int                  nTypes;           // Number of types (up to 5)\n    cmsStageSignature    MpeTypes[5];      // 5 is the maximum number\n\n} cmsAllowedLUT;\n\nstatic const cmsAllowedLUT AllowedLUTTypes[] = {\n\n    { FALSE, 0,              cmsSigLut16Type,    4,  { cmsSigMatrixElemType,   cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType}},\n    { FALSE, 0,              cmsSigLut16Type,    3,  { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType}},\n    { FALSE, 0,              cmsSigLut16Type,    2,  { cmsSigCurveSetElemType, cmsSigCLutElemType}},\n    { TRUE , 0,              cmsSigLutAtoBType,  1,  { cmsSigCurveSetElemType }},\n    { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType,  3,  { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType } },\n    { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType,  3,  { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType   } },\n    { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType,  5,  { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType }},\n    { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType,  1,  { cmsSigCurveSetElemType }},\n    { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType,  3,  { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType }},\n    { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType,  3,  { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType }},\n    { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType,  5,  { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType }}\n};\n\n#define SIZE_OF_ALLOWED_LUT (sizeof(AllowedLUTTypes)/sizeof(cmsAllowedLUT))\n\n// Check a single entry\nstatic\ncmsBool CheckOne(const cmsAllowedLUT* Tab, const cmsPipeline* Lut)\n{\n    cmsStage* mpe;\n    int n;\n\n    for (n=0, mpe = Lut ->Elements; mpe != NULL; mpe = mpe ->Next, n++) {\n\n        if (n > Tab ->nTypes) return FALSE;\n        if (cmsStageType(mpe) != Tab ->MpeTypes[n]) return FALSE;\n    }\n\n    return (n == Tab ->nTypes);\n}\n\n\nstatic\nconst cmsAllowedLUT* FindCombination(const cmsPipeline* Lut, cmsBool IsV4, cmsTagSignature DestinationTag)\n{\n    cmsUInt32Number n;\n\n    for (n=0; n < SIZE_OF_ALLOWED_LUT; n++) {\n\n        const cmsAllowedLUT* Tab = AllowedLUTTypes + n;\n\n        if (IsV4 ^ Tab -> IsV4) continue;\n        if ((Tab ->RequiredTag != 0) && (Tab ->RequiredTag != DestinationTag)) continue;\n\n        if (CheckOne(Tab, Lut)) return Tab;\n    }\n\n    return NULL;\n}\n\n\n// Does convert a transform into a device link profile\ncmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat64Number Version, cmsUInt32Number dwFlags)\n{\n    cmsHPROFILE hProfile = NULL;\n    cmsUInt32Number FrmIn, FrmOut, ChansIn, ChansOut;\n    cmsUInt32Number ColorSpaceBitsIn, ColorSpaceBitsOut;\n    _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform;\n    cmsPipeline* LUT = NULL;\n    cmsStage* mpe;\n    cmsContext ContextID = cmsGetTransformContextID(hTransform);\n    const cmsAllowedLUT* AllowedLUT;\n    cmsTagSignature DestinationTag;\n    cmsProfileClassSignature deviceClass; \n\n    _cmsAssert(hTransform != NULL);\n\n    // Get the first mpe to check for named color\n    mpe = cmsPipelineGetPtrToFirstStage(xform ->Lut);\n\n    // Check if is a named color transform\n    if (mpe != NULL) {\n\n        if (cmsStageType(mpe) == cmsSigNamedColorElemType) {\n            return CreateNamedColorDevicelink(hTransform);\n        }\n    }\n\n    // First thing to do is to get a copy of the transformation\n    LUT = cmsPipelineDup(xform ->Lut);\n    if (LUT == NULL) return NULL;\n\n    // Time to fix the Lab2/Lab4 issue.\n    if ((xform ->EntryColorSpace == cmsSigLabData) && (Version < 4.0)) {\n\n        if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocLabV2ToV4curves(ContextID)))\n            goto Error;\n    }\n\n    // On the output side too\n    if ((xform ->ExitColorSpace) == cmsSigLabData && (Version < 4.0)) {\n\n        if (!cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocLabV4ToV2(ContextID)))\n            goto Error;\n    }\n\n\n    hProfile = cmsCreateProfilePlaceholder(ContextID);\n    if (!hProfile) goto Error;                    // can't allocate\n\n    cmsSetProfileVersion(hProfile, Version);\n\n    FixColorSpaces(hProfile, xform -> EntryColorSpace, xform -> ExitColorSpace, dwFlags);\n\n    // Optimize the LUT and precalculate a devicelink\n\n    ChansIn  = cmsChannelsOf(xform -> EntryColorSpace);\n    ChansOut = cmsChannelsOf(xform -> ExitColorSpace);\n\n    ColorSpaceBitsIn  = _cmsLCMScolorSpace(xform -> EntryColorSpace);\n    ColorSpaceBitsOut = _cmsLCMScolorSpace(xform -> ExitColorSpace);\n\n    FrmIn  = COLORSPACE_SH(ColorSpaceBitsIn) | CHANNELS_SH(ChansIn)|BYTES_SH(2);\n    FrmOut = COLORSPACE_SH(ColorSpaceBitsOut) | CHANNELS_SH(ChansOut)|BYTES_SH(2);\n\n    deviceClass = cmsGetDeviceClass(hProfile);\n\n     if (deviceClass == cmsSigOutputClass)\n         DestinationTag = cmsSigBToA0Tag;\n     else\n         DestinationTag = cmsSigAToB0Tag;\n\n    // Check if the profile/version can store the result\n    if (dwFlags & cmsFLAGS_FORCE_CLUT)\n        AllowedLUT = NULL;\n    else\n        AllowedLUT = FindCombination(LUT, Version >= 4.0, DestinationTag);\n\n    if (AllowedLUT == NULL) {\n\n        // Try to optimize\n        _cmsOptimizePipeline(ContextID, &LUT, xform ->RenderingIntent, &FrmIn, &FrmOut, &dwFlags);\n        AllowedLUT = FindCombination(LUT, Version >= 4.0, DestinationTag);\n\n    }\n\n    // If no way, then force CLUT that for sure can be written\n    if (AllowedLUT == NULL) {\n\n        dwFlags |= cmsFLAGS_FORCE_CLUT;\n        _cmsOptimizePipeline(ContextID, &LUT, xform ->RenderingIntent, &FrmIn, &FrmOut, &dwFlags);\n\n        // Put identity curves if needed\n        if (cmsPipelineGetPtrToFirstStage(LUT) ->Type != cmsSigCurveSetElemType)\n             if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, ChansIn)))\n                 goto Error;\n\n        if (cmsPipelineGetPtrToLastStage(LUT) ->Type != cmsSigCurveSetElemType)\n             if (!cmsPipelineInsertStage(LUT, cmsAT_END,   _cmsStageAllocIdentityCurves(ContextID, ChansOut)))\n                 goto Error;\n\n        AllowedLUT = FindCombination(LUT, Version >= 4.0, DestinationTag);\n    }\n\n    // Somethings is wrong...\n    if (AllowedLUT == NULL) {\n        goto Error;\n    }\n\n\n    if (dwFlags & cmsFLAGS_8BITS_DEVICELINK)\n                     cmsPipelineSetSaveAs8bitsFlag(LUT, TRUE);\n\n    // Tag profile with information\n    if (!SetTextTags(hProfile, L\"devicelink\")) goto Error;\n\n    // Store result\n    if (!cmsWriteTag(hProfile, DestinationTag, LUT)) goto Error;\n\n\n    if (xform -> InputColorant != NULL) {\n           if (!cmsWriteTag(hProfile, cmsSigColorantTableTag, xform->InputColorant)) goto Error;\n    }\n\n    if (xform -> OutputColorant != NULL) {\n           if (!cmsWriteTag(hProfile, cmsSigColorantTableOutTag, xform->OutputColorant)) goto Error;\n    }\n\n    if ((deviceClass == cmsSigLinkClass) && (xform ->Sequence != NULL)) {\n        if (!_cmsWriteProfileSequence(hProfile, xform ->Sequence)) goto Error;\n    }\n\n    // Set the white point\n    if (deviceClass == cmsSigInputClass) {\n        if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, &xform ->EntryWhitePoint)) goto Error;\n    }\n    else {\n         if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, &xform ->ExitWhitePoint)) goto Error;\n    }\n\n  \n    // Per 7.2.15 in spec 4.3\n    cmsSetHeaderRenderingIntent(hProfile, xform ->RenderingIntent);\n\n    cmsPipelineFree(LUT);\n    return hProfile;\n\nError:\n    if (LUT != NULL) cmsPipelineFree(LUT);\n    cmsCloseProfile(hProfile);\n    return NULL;\n}\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/src/cmswtpnt.c",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2014 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n//\n\n#include \"lcms2_internal.h\"\n\n\n// D50 - Widely used\nconst cmsCIEXYZ* CMSEXPORT cmsD50_XYZ(void)\n{\n    static cmsCIEXYZ D50XYZ = {cmsD50X, cmsD50Y, cmsD50Z};\n\n    return &D50XYZ;\n}\n\nconst cmsCIExyY* CMSEXPORT cmsD50_xyY(void)\n{\n    static cmsCIExyY D50xyY;\n\n    cmsXYZ2xyY(&D50xyY, cmsD50_XYZ());\n\n    return &D50xyY;\n}\n\n// Obtains WhitePoint from Temperature\ncmsBool  CMSEXPORT cmsWhitePointFromTemp(cmsCIExyY* WhitePoint, cmsFloat64Number TempK)\n{\n    cmsFloat64Number x, y;\n    cmsFloat64Number T, T2, T3;\n    // cmsFloat64Number M1, M2;\n\n    _cmsAssert(WhitePoint != NULL);\n\n    T = TempK;\n    T2 = T*T;            // Square\n    T3 = T2*T;           // Cube\n\n    // For correlated color temperature (T) between 4000K and 7000K:\n\n    if (T >= 4000. && T <= 7000.)\n    {\n        x = -4.6070*(1E9/T3) + 2.9678*(1E6/T2) + 0.09911*(1E3/T) + 0.244063;\n    }\n    else\n        // or for correlated color temperature (T) between 7000K and 25000K:\n\n        if (T > 7000.0 && T <= 25000.0)\n        {\n            x = -2.0064*(1E9/T3) + 1.9018*(1E6/T2) + 0.24748*(1E3/T) + 0.237040;\n        }\n        else {\n            cmsSignalError(0, cmsERROR_RANGE, \"cmsWhitePointFromTemp: invalid temp\");\n            return FALSE;\n        }\n\n        // Obtain y(x)\n\n        y = -3.000*(x*x) + 2.870*x - 0.275;\n\n        // wave factors (not used, but here for futures extensions)\n\n        // M1 = (-1.3515 - 1.7703*x + 5.9114 *y)/(0.0241 + 0.2562*x - 0.7341*y);\n        // M2 = (0.0300 - 31.4424*x + 30.0717*y)/(0.0241 + 0.2562*x - 0.7341*y);\n\n        WhitePoint -> x = x;\n        WhitePoint -> y = y;\n        WhitePoint -> Y = 1.0;\n\n        return TRUE;\n}\n\n\n\ntypedef struct {\n\n    cmsFloat64Number mirek;  // temp (in microreciprocal kelvin)\n    cmsFloat64Number ut;     // u coord of intersection w/ blackbody locus\n    cmsFloat64Number vt;     // v coord of intersection w/ blackbody locus\n    cmsFloat64Number tt;     // slope of ISOTEMPERATURE. line\n\n    } ISOTEMPERATURE;\n\nstatic ISOTEMPERATURE isotempdata[] = {\n//  {Mirek, Ut,       Vt,      Tt      }\n    {0,     0.18006,  0.26352,  -0.24341},\n    {10,    0.18066,  0.26589,  -0.25479},\n    {20,    0.18133,  0.26846,  -0.26876},\n    {30,    0.18208,  0.27119,  -0.28539},\n    {40,    0.18293,  0.27407,  -0.30470},\n    {50,    0.18388,  0.27709,  -0.32675},\n    {60,    0.18494,  0.28021,  -0.35156},\n    {70,    0.18611,  0.28342,  -0.37915},\n    {80,    0.18740,  0.28668,  -0.40955},\n    {90,    0.18880,  0.28997,  -0.44278},\n    {100,   0.19032,  0.29326,  -0.47888},\n    {125,   0.19462,  0.30141,  -0.58204},\n    {150,   0.19962,  0.30921,  -0.70471},\n    {175,   0.20525,  0.31647,  -0.84901},\n    {200,   0.21142,  0.32312,  -1.0182 },\n    {225,   0.21807,  0.32909,  -1.2168 },\n    {250,   0.22511,  0.33439,  -1.4512 },\n    {275,   0.23247,  0.33904,  -1.7298 },\n    {300,   0.24010,  0.34308,  -2.0637 },\n    {325,   0.24702,  0.34655,  -2.4681 },\n    {350,   0.25591,  0.34951,  -2.9641 },\n    {375,   0.26400,  0.35200,  -3.5814 },\n    {400,   0.27218,  0.35407,  -4.3633 },\n    {425,   0.28039,  0.35577,  -5.3762 },\n    {450,   0.28863,  0.35714,  -6.7262 },\n    {475,   0.29685,  0.35823,  -8.5955 },\n    {500,   0.30505,  0.35907,  -11.324 },\n    {525,   0.31320,  0.35968,  -15.628 },\n    {550,   0.32129,  0.36011,  -23.325 },\n    {575,   0.32931,  0.36038,  -40.770 },\n    {600,   0.33724,  0.36051,  -116.45  }\n};\n\n#define NISO sizeof(isotempdata)/sizeof(ISOTEMPERATURE)\n\n\n// Robertson's method\ncmsBool  CMSEXPORT cmsTempFromWhitePoint(cmsFloat64Number* TempK, const cmsCIExyY* WhitePoint)\n{\n    cmsUInt32Number j;\n    cmsFloat64Number us,vs;\n    cmsFloat64Number uj,vj,tj,di,dj,mi,mj;\n    cmsFloat64Number xs, ys;\n\n    _cmsAssert(WhitePoint != NULL);\n    _cmsAssert(TempK != NULL);\n\n    di = mi = 0;\n    xs = WhitePoint -> x;\n    ys = WhitePoint -> y;\n\n    // convert (x,y) to CIE 1960 (u,WhitePoint)\n\n    us = (2*xs) / (-xs + 6*ys + 1.5);\n    vs = (3*ys) / (-xs + 6*ys + 1.5);\n\n\n    for (j=0; j < NISO; j++) {\n\n        uj = isotempdata[j].ut;\n        vj = isotempdata[j].vt;\n        tj = isotempdata[j].tt;\n        mj = isotempdata[j].mirek;\n\n        dj = ((vs - vj) - tj * (us - uj)) / sqrt(1.0 + tj * tj);\n\n        if ((j != 0) && (di/dj < 0.0)) {\n\n            // Found a match\n            *TempK = 1000000.0 / (mi + (di / (di - dj)) * (mj - mi));\n            return TRUE;\n        }\n\n        di = dj;\n        mi = mj;\n    }\n\n    // Not found\n    return FALSE;\n}\n\n\n// Compute chromatic adaptation matrix using Chad as cone matrix\n\nstatic\ncmsBool ComputeChromaticAdaptation(cmsMAT3* Conversion,\n                                const cmsCIEXYZ* SourceWhitePoint,\n                                const cmsCIEXYZ* DestWhitePoint,\n                                const cmsMAT3* Chad)\n\n{\n\n    cmsMAT3 Chad_Inv;\n    cmsVEC3 ConeSourceXYZ, ConeSourceRGB;\n    cmsVEC3 ConeDestXYZ, ConeDestRGB;\n    cmsMAT3 Cone, Tmp;\n\n\n    Tmp = *Chad;\n    if (!_cmsMAT3inverse(&Tmp, &Chad_Inv)) return FALSE;\n\n    _cmsVEC3init(&ConeSourceXYZ, SourceWhitePoint -> X,\n                             SourceWhitePoint -> Y,\n                             SourceWhitePoint -> Z);\n\n    _cmsVEC3init(&ConeDestXYZ,   DestWhitePoint -> X,\n                             DestWhitePoint -> Y,\n                             DestWhitePoint -> Z);\n\n    _cmsMAT3eval(&ConeSourceRGB, Chad, &ConeSourceXYZ);\n    _cmsMAT3eval(&ConeDestRGB,   Chad, &ConeDestXYZ);\n\n    // Build matrix\n    _cmsVEC3init(&Cone.v[0], ConeDestRGB.n[0]/ConeSourceRGB.n[0],    0.0,  0.0);\n    _cmsVEC3init(&Cone.v[1], 0.0,   ConeDestRGB.n[1]/ConeSourceRGB.n[1],   0.0);\n    _cmsVEC3init(&Cone.v[2], 0.0,   0.0,   ConeDestRGB.n[2]/ConeSourceRGB.n[2]);\n\n\n    // Normalize\n    _cmsMAT3per(&Tmp, &Cone, Chad);\n    _cmsMAT3per(Conversion, &Chad_Inv, &Tmp);\n\n    return TRUE;\n}\n\n// Returns the final chrmatic adaptation from illuminant FromIll to Illuminant ToIll\n// The cone matrix can be specified in ConeMatrix. If NULL, Bradford is assumed\ncmsBool  _cmsAdaptationMatrix(cmsMAT3* r, const cmsMAT3* ConeMatrix, const cmsCIEXYZ* FromIll, const cmsCIEXYZ* ToIll)\n{\n    cmsMAT3 LamRigg   = {{ // Bradford matrix\n        {{  0.8951,  0.2664, -0.1614 }},\n        {{ -0.7502,  1.7135,  0.0367 }},\n        {{  0.0389, -0.0685,  1.0296 }}\n    }};\n\n    if (ConeMatrix == NULL)\n        ConeMatrix = &LamRigg;\n\n    return ComputeChromaticAdaptation(r, FromIll, ToIll, ConeMatrix);\n}\n\n// Same as anterior, but assuming D50 destination. White point is given in xyY\nstatic\ncmsBool _cmsAdaptMatrixToD50(cmsMAT3* r, const cmsCIExyY* SourceWhitePt)\n{\n    cmsCIEXYZ Dn;\n    cmsMAT3 Bradford;\n    cmsMAT3 Tmp;\n\n    cmsxyY2XYZ(&Dn, SourceWhitePt);\n\n    if (!_cmsAdaptationMatrix(&Bradford, NULL, &Dn, cmsD50_XYZ())) return FALSE;\n\n    Tmp = *r;\n    _cmsMAT3per(r, &Bradford, &Tmp);\n\n    return TRUE;\n}\n\n// Build a White point, primary chromas transfer matrix from RGB to CIE XYZ\n// This is just an approximation, I am not handling all the non-linear\n// aspects of the RGB to XYZ process, and assumming that the gamma correction\n// has transitive property in the tranformation chain.\n//\n// the alghoritm:\n//\n//            - First I build the absolute conversion matrix using\n//              primaries in XYZ. This matrix is next inverted\n//            - Then I eval the source white point across this matrix\n//              obtaining the coeficients of the transformation\n//            - Then, I apply these coeficients to the original matrix\n//\ncmsBool _cmsBuildRGB2XYZtransferMatrix(cmsMAT3* r, const cmsCIExyY* WhitePt, const cmsCIExyYTRIPLE* Primrs)\n{\n    cmsVEC3 WhitePoint, Coef;\n    cmsMAT3 Result, Primaries;\n    cmsFloat64Number xn, yn;\n    cmsFloat64Number xr, yr;\n    cmsFloat64Number xg, yg;\n    cmsFloat64Number xb, yb;\n\n    xn = WhitePt -> x;\n    yn = WhitePt -> y;\n    xr = Primrs -> Red.x;\n    yr = Primrs -> Red.y;\n    xg = Primrs -> Green.x;\n    yg = Primrs -> Green.y;\n    xb = Primrs -> Blue.x;\n    yb = Primrs -> Blue.y;\n\n    // Build Primaries matrix\n    _cmsVEC3init(&Primaries.v[0], xr,        xg,         xb);\n    _cmsVEC3init(&Primaries.v[1], yr,        yg,         yb);\n    _cmsVEC3init(&Primaries.v[2], (1-xr-yr), (1-xg-yg),  (1-xb-yb));\n\n\n    // Result = Primaries ^ (-1) inverse matrix\n    if (!_cmsMAT3inverse(&Primaries, &Result))\n        return FALSE;\n\n\n    _cmsVEC3init(&WhitePoint, xn/yn, 1.0, (1.0-xn-yn)/yn);\n\n    // Across inverse primaries ...\n    _cmsMAT3eval(&Coef, &Result, &WhitePoint);\n\n    // Give us the Coefs, then I build transformation matrix\n    _cmsVEC3init(&r -> v[0], Coef.n[VX]*xr,          Coef.n[VY]*xg,          Coef.n[VZ]*xb);\n    _cmsVEC3init(&r -> v[1], Coef.n[VX]*yr,          Coef.n[VY]*yg,          Coef.n[VZ]*yb);\n    _cmsVEC3init(&r -> v[2], Coef.n[VX]*(1.0-xr-yr), Coef.n[VY]*(1.0-xg-yg), Coef.n[VZ]*(1.0-xb-yb));\n\n\n    return _cmsAdaptMatrixToD50(r, WhitePt);\n\n}\n\n\n// Adapts a color to a given illuminant. Original color is expected to have\n// a SourceWhitePt white point.\ncmsBool CMSEXPORT cmsAdaptToIlluminant(cmsCIEXYZ* Result,\n                                       const cmsCIEXYZ* SourceWhitePt,\n                                       const cmsCIEXYZ* Illuminant,\n                                       const cmsCIEXYZ* Value)\n{\n    cmsMAT3 Bradford;\n    cmsVEC3 In, Out;\n\n    _cmsAssert(Result != NULL);\n    _cmsAssert(SourceWhitePt != NULL);\n    _cmsAssert(Illuminant != NULL);\n    _cmsAssert(Value != NULL);\n\n    if (!_cmsAdaptationMatrix(&Bradford, NULL, SourceWhitePt, Illuminant)) return FALSE;\n\n    _cmsVEC3init(&In, Value -> X, Value -> Y, Value -> Z);\n    _cmsMAT3eval(&Out, &Bradford, &In);\n\n    Result -> X = Out.n[0];\n    Result -> Y = Out.n[1];\n    Result -> Z = Out.n[2];\n\n    return TRUE;\n}\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/src/cmsxform.c",
    "content": "//---------------------------------------------------------------------------------\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2014 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n//\n\n#include \"lcms2_internal.h\"\n\n// Transformations stuff\n// -----------------------------------------------------------------------\n\n#define DEFAULT_OBSERVER_ADAPTATION_STATE 1.0\n\n// The Context0 observer adaptation state.\n_cmsAdaptationStateChunkType _cmsAdaptationStateChunk = { DEFAULT_OBSERVER_ADAPTATION_STATE };\n\n// Init and duplicate observer adaptation state\nvoid _cmsAllocAdaptationStateChunk(struct _cmsContext_struct* ctx, \n                                   const struct _cmsContext_struct* src)\n{\n    static _cmsAdaptationStateChunkType AdaptationStateChunk = { DEFAULT_OBSERVER_ADAPTATION_STATE };\n    void* from;\n     \n    if (src != NULL) {\n        from = src ->chunks[AdaptationStateContext];       \n    }\n    else {\n       from = &AdaptationStateChunk;\n    }\n    \n    ctx ->chunks[AdaptationStateContext] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsAdaptationStateChunkType));     \n}\n\n\n// Sets adaptation state for absolute colorimetric intent in the given context.  Adaptation state applies on all \n// but cmsCreateExtendedTransformTHR().  Little CMS can handle incomplete adaptation states.\ncmsFloat64Number CMSEXPORT cmsSetAdaptationStateTHR(cmsContext ContextID, cmsFloat64Number d)\n{\n    cmsFloat64Number prev;\n    _cmsAdaptationStateChunkType* ptr = (_cmsAdaptationStateChunkType*) _cmsContextGetClientChunk(ContextID, AdaptationStateContext);\n\n    // Get previous value for return\n    prev = ptr ->AdaptationState;\n\n    // Set the value if d is positive or zero\n    if (d >= 0.0) {\n\n        ptr ->AdaptationState = d;\n    }\n\n    // Always return previous value\n    return prev;\n}\n\n\n// The adaptation state may be defaulted by this function. If you don't like it, use the extended transform routine\ncmsFloat64Number CMSEXPORT cmsSetAdaptationState(cmsFloat64Number d)\n{    \n    return cmsSetAdaptationStateTHR(NULL, d);\n}\n\n// -----------------------------------------------------------------------\n\n// Alarm codes for 16-bit transformations, because the fixed range of containers there are\n// no values left to mark out of gamut. \n\n#define DEFAULT_ALARM_CODES_VALUE {0x7F00, 0x7F00, 0x7F00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}\n\n_cmsAlarmCodesChunkType _cmsAlarmCodesChunk = { DEFAULT_ALARM_CODES_VALUE };\n\n// Sets the codes used to mark out-out-gamut on Proofing transforms for a given context. Values are meant to be \n// encoded in 16 bits.\nvoid CMSEXPORT cmsSetAlarmCodesTHR(cmsContext ContextID, const cmsUInt16Number AlarmCodesP[cmsMAXCHANNELS])\n{\n    _cmsAlarmCodesChunkType* ContextAlarmCodes = (_cmsAlarmCodesChunkType*) _cmsContextGetClientChunk(ContextID, AlarmCodesContext);\n       \n    _cmsAssert(ContextAlarmCodes != NULL); // Can't happen\n    \n    memcpy(ContextAlarmCodes->AlarmCodes, AlarmCodesP, sizeof(ContextAlarmCodes->AlarmCodes));    \n}\n\n// Gets the current codes used to mark out-out-gamut on Proofing transforms for the given context.\n// Values are meant to be encoded in 16 bits.\nvoid CMSEXPORT cmsGetAlarmCodesTHR(cmsContext ContextID, cmsUInt16Number AlarmCodesP[cmsMAXCHANNELS])\n{\n    _cmsAlarmCodesChunkType* ContextAlarmCodes = (_cmsAlarmCodesChunkType*) _cmsContextGetClientChunk(ContextID, AlarmCodesContext);\n\n    _cmsAssert(ContextAlarmCodes != NULL); // Can't happen\n\n    memcpy(AlarmCodesP, ContextAlarmCodes->AlarmCodes, sizeof(ContextAlarmCodes->AlarmCodes));\n}\n\nvoid CMSEXPORT cmsSetAlarmCodes(const cmsUInt16Number NewAlarm[cmsMAXCHANNELS])\n{\n    _cmsAssert(NewAlarm != NULL);\n\n    cmsSetAlarmCodesTHR(NULL, NewAlarm);\n}\n\nvoid CMSEXPORT cmsGetAlarmCodes(cmsUInt16Number OldAlarm[cmsMAXCHANNELS])\n{ \n    _cmsAssert(OldAlarm != NULL);\n    cmsGetAlarmCodesTHR(NULL, OldAlarm);\n}\n\n\n// Init and duplicate alarm codes\nvoid _cmsAllocAlarmCodesChunk(struct _cmsContext_struct* ctx, \n                              const struct _cmsContext_struct* src)\n{\n    static _cmsAlarmCodesChunkType AlarmCodesChunk = { DEFAULT_ALARM_CODES_VALUE };\n    void* from;\n     \n    if (src != NULL) {\n        from = src ->chunks[AlarmCodesContext];       \n    }\n    else {\n       from = &AlarmCodesChunk;\n    }\n    \n    ctx ->chunks[AlarmCodesContext] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsAlarmCodesChunkType));     \n}\n\n// -----------------------------------------------------------------------\n\n// Get rid of transform resources\nvoid CMSEXPORT cmsDeleteTransform(cmsHTRANSFORM hTransform)\n{\n    _cmsTRANSFORM* p = (_cmsTRANSFORM*) hTransform;\n\n    _cmsAssert(p != NULL);\n\n    if (p -> GamutCheck)\n        cmsPipelineFree(p -> GamutCheck);\n\n    if (p -> Lut)\n        cmsPipelineFree(p -> Lut);\n\n    if (p ->InputColorant)\n        cmsFreeNamedColorList(p ->InputColorant);\n\n    if (p -> OutputColorant)\n        cmsFreeNamedColorList(p ->OutputColorant);\n\n    if (p ->Sequence)\n        cmsFreeProfileSequenceDescription(p ->Sequence);\n\n    if (p ->UserData)\n        p ->FreeUserData(p ->ContextID, p ->UserData);\n\n    _cmsFree(p ->ContextID, (void *) p);\n}\n\n// Apply transform.\nvoid CMSEXPORT cmsDoTransform(cmsHTRANSFORM  Transform,\n                              const void* InputBuffer,\n                              void* OutputBuffer,\n                              cmsUInt32Number Size)\n\n{\n    _cmsTRANSFORM* p = (_cmsTRANSFORM*) Transform;\n\n    p -> xform(p, InputBuffer, OutputBuffer, Size, Size);\n}\n\n\n// Apply transform.\nvoid CMSEXPORT cmsDoTransformStride(cmsHTRANSFORM  Transform,\n                              const void* InputBuffer,\n                              void* OutputBuffer,\n                              cmsUInt32Number Size, cmsUInt32Number Stride)\n\n{\n    _cmsTRANSFORM* p = (_cmsTRANSFORM*) Transform;\n\n    p -> xform(p, InputBuffer, OutputBuffer, Size, Stride);\n}\n\n\n// Transform routines ----------------------------------------------------------------------------------------------------------\n\n// Float xform converts floats. Since there are no performance issues, one routine does all job, including gamut check.\n// Note that because extended range, we can use a -1.0 value for out of gamut in this case.\nstatic\nvoid FloatXFORM(_cmsTRANSFORM* p,\n                const void* in,\n                void* out, cmsUInt32Number Size, cmsUInt32Number Stride)\n{\n    cmsUInt8Number* accum;\n    cmsUInt8Number* output;\n    cmsFloat32Number fIn[cmsMAXCHANNELS], fOut[cmsMAXCHANNELS];\n    cmsFloat32Number OutOfGamut;\n    cmsUInt32Number i, j;\n\n    accum  = (cmsUInt8Number*)  in;\n    output = (cmsUInt8Number*)  out;\n\n    for (i=0; i < Size; i++) {\n\n        accum = p -> FromInputFloat(p, fIn, accum, Stride);\n\n        // Any gamut chack to do?\n        if (p ->GamutCheck != NULL) {\n\n            // Evaluate gamut marker.\n            cmsPipelineEvalFloat( fIn, &OutOfGamut, p ->GamutCheck);\n\n            // Is current color out of gamut?\n            if (OutOfGamut > 0.0) {\n\n                // Certainly, out of gamut\n                for (j=0; j < cmsMAXCHANNELS; j++)\n                    fOut[j] = -1.0;\n\n            }\n            else {\n                // No, proceed normally\n                cmsPipelineEvalFloat(fIn, fOut, p -> Lut);\n            }\n        }\n        else {\n\n            // No gamut check at all\n            cmsPipelineEvalFloat(fIn, fOut, p -> Lut);\n        }\n\n        // Back to asked representation\n        output = p -> ToOutputFloat(p, fOut, output, Stride);\n    }\n}\n\n\nstatic\nvoid NullFloatXFORM(_cmsTRANSFORM* p,\n                    const void* in,\n                    void* out, \n                    cmsUInt32Number Size,\n                    cmsUInt32Number Stride)\n{\n    cmsUInt8Number* accum;\n    cmsUInt8Number* output;\n    cmsFloat32Number fIn[cmsMAXCHANNELS];\n    cmsUInt32Number i, n;\n\n    accum  = (cmsUInt8Number*)  in;\n    output = (cmsUInt8Number*)  out;\n    n = Size;                   \n\n    for (i=0; i < n; i++) {\n\n        accum  = p -> FromInputFloat(p, fIn, accum, Stride);\n        output = p -> ToOutputFloat(p, fIn, output, Stride);\n    }\n}\n\n// 16 bit precision -----------------------------------------------------------------------------------------------------------\n\n// Null transformation, only applies formatters. No cach?static\nvoid NullXFORM(_cmsTRANSFORM* p,\n               const void* in,\n               void* out, cmsUInt32Number Size,\n               cmsUInt32Number Stride)\n{\n    cmsUInt8Number* accum;\n    cmsUInt8Number* output;\n    cmsUInt16Number wIn[cmsMAXCHANNELS];\n    cmsUInt32Number i, n;\n\n    accum  = (cmsUInt8Number*)  in;\n    output = (cmsUInt8Number*)  out;\n    n = Size;                    // Buffer len\n\n    for (i=0; i < n; i++) {\n\n        accum  = p -> FromInput(p, wIn, accum, Stride);\n        output = p -> ToOutput(p, wIn, output, Stride);\n    }\n}\n\n\n// No gamut check, no cache, 16 bits\nstatic\nvoid PrecalculatedXFORM(_cmsTRANSFORM* p,\n                        const void* in,\n                        void* out, cmsUInt32Number Size, cmsUInt32Number Stride)\n{\n    register cmsUInt8Number* accum;\n    register cmsUInt8Number* output;\n    cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS];\n    cmsUInt32Number i, n;\n\n    accum  = (cmsUInt8Number*)  in;\n    output = (cmsUInt8Number*)  out;\n    n = Size;\n\n    for (i=0; i < n; i++) {\n\n        accum = p -> FromInput(p, wIn, accum, Stride);\n        p ->Lut ->Eval16Fn(wIn, wOut, p -> Lut->Data);\n        output = p -> ToOutput(p, wOut, output, Stride);\n    }\n}\n\n\n// Auxiliar: Handle precalculated gamut check. The retrieval of context may be alittle bit slow, but this function is not critical.\nstatic\nvoid TransformOnePixelWithGamutCheck(_cmsTRANSFORM* p,\n                                     const cmsUInt16Number wIn[],\n                                     cmsUInt16Number wOut[])\n{\n    cmsUInt16Number wOutOfGamut;\n\n    p ->GamutCheck ->Eval16Fn(wIn, &wOutOfGamut, p ->GamutCheck ->Data);\n    if (wOutOfGamut >= 1) {\n\n        cmsUInt16Number i;\n        _cmsAlarmCodesChunkType* ContextAlarmCodes = (_cmsAlarmCodesChunkType*) _cmsContextGetClientChunk(p->ContextID, AlarmCodesContext);        \n\n        for (i=0; i < p ->Lut->OutputChannels; i++) {\n\n            wOut[i] = ContextAlarmCodes ->AlarmCodes[i];\n        }\n    }\n    else\n        p ->Lut ->Eval16Fn(wIn, wOut, p -> Lut->Data);\n}\n\n// Gamut check, No cach? 16 bits.\nstatic\nvoid PrecalculatedXFORMGamutCheck(_cmsTRANSFORM* p,\n                                  const void* in,\n                                  void* out, cmsUInt32Number Size, cmsUInt32Number Stride)\n{\n    cmsUInt8Number* accum;\n    cmsUInt8Number* output;\n    cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS];\n    cmsUInt32Number i, n;\n\n    accum  = (cmsUInt8Number*)  in;\n    output = (cmsUInt8Number*)  out;\n    n = Size;                    // Buffer len\n\n    for (i=0; i < n; i++) {\n\n        accum = p -> FromInput(p, wIn, accum, Stride);\n        TransformOnePixelWithGamutCheck(p, wIn, wOut);\n        output = p -> ToOutput(p, wOut, output, Stride);\n    }\n}\n\n\n// No gamut check, Cach? 16 bits,\nstatic\nvoid CachedXFORM(_cmsTRANSFORM* p,\n                 const void* in,\n                 void* out, cmsUInt32Number Size, cmsUInt32Number Stride)\n{\n    cmsUInt8Number* accum;\n    cmsUInt8Number* output;\n    cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS];\n    cmsUInt32Number i, n;\n    _cmsCACHE Cache;\n\n    accum  = (cmsUInt8Number*)  in;\n    output = (cmsUInt8Number*)  out;\n    n = Size;                    // Buffer len\n\n    // Empty buffers for quick memcmp\n    memset(wIn,  0, sizeof(wIn));\n    memset(wOut, 0, sizeof(wOut));\n\n    // Get copy of zero cache\n    memcpy(&Cache, &p ->Cache, sizeof(Cache));\n\n    for (i=0; i < n; i++) {\n\n        accum = p -> FromInput(p, wIn, accum, Stride);\n\n        if (memcmp(wIn, Cache.CacheIn, sizeof(Cache.CacheIn)) == 0) {\n\n            memcpy(wOut, Cache.CacheOut, sizeof(Cache.CacheOut));\n        }\n        else {\n\n            p ->Lut ->Eval16Fn(wIn, wOut, p -> Lut->Data);\n\n            memcpy(Cache.CacheIn,  wIn,  sizeof(Cache.CacheIn));\n            memcpy(Cache.CacheOut, wOut, sizeof(Cache.CacheOut));\n        }\n\n        output = p -> ToOutput(p, wOut, output, Stride);\n    }\n\n}\n\n\n// All those nice features together\nstatic\nvoid CachedXFORMGamutCheck(_cmsTRANSFORM* p,\n                           const void* in,\n                           void* out, cmsUInt32Number Size, cmsUInt32Number Stride)\n{\n       cmsUInt8Number* accum;\n       cmsUInt8Number* output;\n       cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS];\n       cmsUInt32Number i, n;\n       _cmsCACHE Cache;\n\n       accum  = (cmsUInt8Number*)  in;\n       output = (cmsUInt8Number*)  out;\n       n = Size;                    // Buffer len\n\n       // Empty buffers for quick memcmp\n       memset(wIn,  0, sizeof(cmsUInt16Number) * cmsMAXCHANNELS);\n       memset(wOut, 0, sizeof(cmsUInt16Number) * cmsMAXCHANNELS);\n\n       // Get copy of zero cache\n       memcpy(&Cache, &p ->Cache, sizeof(Cache));\n\n       for (i=0; i < n; i++) {\n\n            accum = p -> FromInput(p, wIn, accum, Stride);\n\n            if (memcmp(wIn, Cache.CacheIn, sizeof(Cache.CacheIn)) == 0) {\n                    memcpy(wOut, Cache.CacheOut, sizeof(Cache.CacheOut));\n            }\n            else {\n                    TransformOnePixelWithGamutCheck(p, wIn, wOut);\n                    memcpy(Cache.CacheIn, wIn, sizeof(Cache.CacheIn));\n                    memcpy(Cache.CacheOut, wOut, sizeof(Cache.CacheOut));\n            }\n\n            output = p -> ToOutput(p, wOut, output, Stride);\n       }\n\n}\n\n// -------------------------------------------------------------------------------------------------------------\n\n// List of used-defined transform factories\ntypedef struct _cmsTransformCollection_st {\n\n    _cmsTransformFactory  Factory;\n    struct _cmsTransformCollection_st *Next;\n\n} _cmsTransformCollection;\n\n// The linked list head\n_cmsTransformPluginChunkType _cmsTransformPluginChunk = { NULL };\n\n\n// Duplicates the zone of memory used by the plug-in in the new context\nstatic\nvoid DupPluginTransformList(struct _cmsContext_struct* ctx, \n                                               const struct _cmsContext_struct* src)\n{\n   _cmsTransformPluginChunkType newHead = { NULL };\n   _cmsTransformCollection*  entry;\n   _cmsTransformCollection*  Anterior = NULL;\n   _cmsTransformPluginChunkType* head = (_cmsTransformPluginChunkType*) src->chunks[TransformPlugin];\n\n    // Walk the list copying all nodes\n   for (entry = head->TransformCollection;\n        entry != NULL;\n        entry = entry ->Next) {\n\n            _cmsTransformCollection *newEntry = ( _cmsTransformCollection *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsTransformCollection));\n   \n            if (newEntry == NULL) \n                return;\n\n            // We want to keep the linked list order, so this is a little bit tricky\n            newEntry -> Next = NULL;\n            if (Anterior)\n                Anterior -> Next = newEntry;\n     \n            Anterior = newEntry;\n\n            if (newHead.TransformCollection == NULL)\n                newHead.TransformCollection = newEntry;\n    }\n\n  ctx ->chunks[TransformPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsTransformPluginChunkType));\n}\n\nvoid _cmsAllocTransformPluginChunk(struct _cmsContext_struct* ctx, \n                                        const struct _cmsContext_struct* src)\n{\n    if (src != NULL) {\n\n        // Copy all linked list\n        DupPluginTransformList(ctx, src);\n    }\n    else {\n        static _cmsTransformPluginChunkType TransformPluginChunkType = { NULL };\n        ctx ->chunks[TransformPlugin] = _cmsSubAllocDup(ctx ->MemPool, &TransformPluginChunkType, sizeof(_cmsTransformPluginChunkType));\n    }\n}\n\n\n\n// Register new ways to transform\ncmsBool  _cmsRegisterTransformPlugin(cmsContext ContextID, cmsPluginBase* Data)\n{\n    cmsPluginTransform* Plugin = (cmsPluginTransform*) Data;\n    _cmsTransformCollection* fl;\n    _cmsTransformPluginChunkType* ctx = ( _cmsTransformPluginChunkType*) _cmsContextGetClientChunk(ContextID,TransformPlugin);\n\n    if (Data == NULL) {\n\n        // Free the chain. Memory is safely freed at exit\n        ctx->TransformCollection = NULL;\n        return TRUE;\n    }\n\n    // Factory callback is required\n    if (Plugin ->Factory == NULL) return FALSE;\n\n\n    fl = (_cmsTransformCollection*) _cmsPluginMalloc(ContextID, sizeof(_cmsTransformCollection));\n    if (fl == NULL) return FALSE;\n\n    // Copy the parameters\n    fl ->Factory = Plugin ->Factory;\n\n    // Keep linked list\n    fl ->Next = ctx->TransformCollection;\n    ctx->TransformCollection = fl;\n\n    // All is ok\n    return TRUE;\n}\n\n\nvoid CMSEXPORT _cmsSetTransformUserData(struct _cmstransform_struct *CMMcargo, void* ptr, _cmsFreeUserDataFn FreePrivateDataFn)\n{\n    _cmsAssert(CMMcargo != NULL);\n    CMMcargo ->UserData = ptr;\n    CMMcargo ->FreeUserData = FreePrivateDataFn;\n}\n\n// returns the pointer defined by the plug-in to store private data\nvoid * CMSEXPORT _cmsGetTransformUserData(struct _cmstransform_struct *CMMcargo)\n{\n    _cmsAssert(CMMcargo != NULL);\n    return CMMcargo ->UserData;\n}\n\n// returns the current formatters\nvoid CMSEXPORT _cmsGetTransformFormatters16(struct _cmstransform_struct *CMMcargo, cmsFormatter16* FromInput, cmsFormatter16* ToOutput)\n{\n     _cmsAssert(CMMcargo != NULL);\n     if (FromInput) *FromInput = CMMcargo ->FromInput;\n     if (ToOutput)  *ToOutput  = CMMcargo ->ToOutput;\n}\n\nvoid CMSEXPORT _cmsGetTransformFormattersFloat(struct _cmstransform_struct *CMMcargo, cmsFormatterFloat* FromInput, cmsFormatterFloat* ToOutput)\n{\n     _cmsAssert(CMMcargo != NULL);\n     if (FromInput) *FromInput = CMMcargo ->FromInputFloat;\n     if (ToOutput)  *ToOutput  = CMMcargo ->ToOutputFloat;\n}\n\n\n// Allocate transform struct and set it to defaults. Ask the optimization plug-in about if those formats are proper\n// for separated transforms. If this is the case,\nstatic\n_cmsTRANSFORM* AllocEmptyTransform(cmsContext ContextID, cmsPipeline* lut,\n                                               cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags)\n{\n     _cmsTransformPluginChunkType* ctx = ( _cmsTransformPluginChunkType*) _cmsContextGetClientChunk(ContextID, TransformPlugin);\n     _cmsTransformCollection* Plugin;\n\n    // Allocate needed memory\n    _cmsTRANSFORM* p = (_cmsTRANSFORM*) _cmsMallocZero(ContextID, sizeof(_cmsTRANSFORM));\n    if (!p) return NULL;\n\n    // Store the proposed pipeline\n    p ->Lut = lut;\n\n    // Let's see if any plug-in want to do the transform by itself\n    for (Plugin = ctx ->TransformCollection;\n        Plugin != NULL;\n        Plugin = Plugin ->Next) {\n\n            if (Plugin ->Factory(&p->xform, &p->UserData, &p ->FreeUserData, &p ->Lut, InputFormat, OutputFormat, dwFlags)) {\n                \n                // Last plugin in the declaration order takes control. We just keep\n                // the original parameters as a logging. \n                // Note that cmsFLAGS_CAN_CHANGE_FORMATTER is not set, so by default \n                // an optimized transform is not reusable. The plug-in can, however, change\n                // the flags and make it suitable.\n\n                p ->ContextID       = ContextID;               \n                p ->InputFormat     = *InputFormat;\n                p ->OutputFormat    = *OutputFormat;\n                p ->dwOriginalFlags = *dwFlags;\n               \n                // Fill the formatters just in case the optimized routine is interested.\n                // No error is thrown if the formatter doesn't exist. It is up to the optimization \n                // factory to decide what to do in those cases.\n                p ->FromInput      = _cmsGetFormatter(ContextID, *InputFormat,  cmsFormatterInput, CMS_PACK_FLAGS_16BITS).Fmt16;\n                p ->ToOutput       = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS).Fmt16;\n                p ->FromInputFloat = _cmsGetFormatter(ContextID, *InputFormat,  cmsFormatterInput, CMS_PACK_FLAGS_FLOAT).FmtFloat;\n                p ->ToOutputFloat  = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_FLOAT).FmtFloat;\n\n                return p;\n            }\n    }\n\n    // Not suitable for the transform plug-in, let's check  the pipeline plug-in\n    if (p ->Lut != NULL)\n        _cmsOptimizePipeline(ContextID, &p->Lut, Intent, InputFormat, OutputFormat, dwFlags);\n\n    // Check whatever this is a true floating point transform\n    if (_cmsFormatterIsFloat(*InputFormat) && _cmsFormatterIsFloat(*OutputFormat)) {\n\n        // Get formatter function always return a valid union, but the contents of this union may be NULL.\n        p ->FromInputFloat = _cmsGetFormatter(ContextID, *InputFormat,  cmsFormatterInput, CMS_PACK_FLAGS_FLOAT).FmtFloat;\n        p ->ToOutputFloat  = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_FLOAT).FmtFloat;\n        *dwFlags |= cmsFLAGS_CAN_CHANGE_FORMATTER;\n\n        if (p ->FromInputFloat == NULL || p ->ToOutputFloat == NULL) {\n\n            cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, \"Unsupported raster format\");\n            _cmsFree(ContextID, p);\n            return NULL;\n        }\n\n        if (*dwFlags & cmsFLAGS_NULLTRANSFORM) {\n\n            p ->xform = NullFloatXFORM;\n        }\n        else {\n            // Float transforms don't use cach? always are non-NULL\n            p ->xform = FloatXFORM;\n        }\n\n    }\n    else {\n\n        if (*InputFormat == 0 && *OutputFormat == 0) {\n            p ->FromInput = p ->ToOutput = NULL;\n            *dwFlags |= cmsFLAGS_CAN_CHANGE_FORMATTER;\n        }\n        else {\n\n            int BytesPerPixelInput;\n\n            p ->FromInput = _cmsGetFormatter(ContextID, *InputFormat,  cmsFormatterInput, CMS_PACK_FLAGS_16BITS).Fmt16;\n            p ->ToOutput  = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS).Fmt16;\n\n            if (p ->FromInput == NULL || p ->ToOutput == NULL) {\n\n                cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, \"Unsupported raster format\");\n                _cmsFree(ContextID, p);\n                return NULL;\n            }\n\n            BytesPerPixelInput = T_BYTES(p ->InputFormat);\n            if (BytesPerPixelInput == 0 || BytesPerPixelInput >= 2)\n                   *dwFlags |= cmsFLAGS_CAN_CHANGE_FORMATTER;\n\n        }\n\n        if (*dwFlags & cmsFLAGS_NULLTRANSFORM) {\n\n            p ->xform = NullXFORM;\n        }\n        else {\n            if (*dwFlags & cmsFLAGS_NOCACHE) {\n\n                if (*dwFlags & cmsFLAGS_GAMUTCHECK)\n                    p ->xform = PrecalculatedXFORMGamutCheck;  // Gamut check, no cach?                else\n                    p ->xform = PrecalculatedXFORM;  // No cach? no gamut check\n            }\n            else {\n\n                if (*dwFlags & cmsFLAGS_GAMUTCHECK)\n                    p ->xform = CachedXFORMGamutCheck;    // Gamut check, cach?                else\n                    p ->xform = CachedXFORM;  // No gamut check, cach?\n            }\n        }\n    }\n\n    p ->InputFormat     = *InputFormat;\n    p ->OutputFormat    = *OutputFormat;\n    p ->dwOriginalFlags = *dwFlags;\n    p ->ContextID       = ContextID;\n    p ->UserData        = NULL;\n    return p;\n}\n\nstatic\ncmsBool GetXFormColorSpaces(int nProfiles, cmsHPROFILE hProfiles[], cmsColorSpaceSignature* Input, cmsColorSpaceSignature* Output)\n{\n    cmsColorSpaceSignature ColorSpaceIn, ColorSpaceOut;\n    cmsColorSpaceSignature PostColorSpace;\n    int i;\n\n    if (nProfiles <= 0) return FALSE;\n    if (hProfiles[0] == NULL) return FALSE;\n\n    *Input = PostColorSpace = cmsGetColorSpace(hProfiles[0]);\n\n    for (i=0; i < nProfiles; i++) {\n\n        cmsProfileClassSignature cls;\n        cmsHPROFILE hProfile = hProfiles[i];\n\n        int lIsInput = (PostColorSpace != cmsSigXYZData) &&\n                       (PostColorSpace != cmsSigLabData);\n\n        if (hProfile == NULL) return FALSE;\n\n        cls = cmsGetDeviceClass(hProfile);\n\n        if (cls == cmsSigNamedColorClass) {\n\n            ColorSpaceIn    = cmsSig1colorData;\n            ColorSpaceOut   = (nProfiles > 1) ? cmsGetPCS(hProfile) : cmsGetColorSpace(hProfile);\n        }\n        else\n        if (lIsInput || (cls == cmsSigLinkClass)) {\n\n            ColorSpaceIn    = cmsGetColorSpace(hProfile);\n            ColorSpaceOut   = cmsGetPCS(hProfile);\n        }\n        else\n        {\n            ColorSpaceIn    = cmsGetPCS(hProfile);\n            ColorSpaceOut   = cmsGetColorSpace(hProfile);\n        }\n\n        if (i==0)\n            *Input = ColorSpaceIn;\n\n        PostColorSpace = ColorSpaceOut;\n    }\n\n    *Output = PostColorSpace;\n\n    return TRUE;\n}\n\n// Check colorspace\nstatic\ncmsBool  IsProperColorSpace(cmsColorSpaceSignature Check, cmsUInt32Number dwFormat)\n{\n    int Space1 = T_COLORSPACE(dwFormat);\n    int Space2 = _cmsLCMScolorSpace(Check);\n\n    if (Space1 == PT_ANY) return TRUE;\n    if (Space1 == Space2) return TRUE;\n\n    if (Space1 == PT_LabV2 && Space2 == PT_Lab) return TRUE;\n    if (Space1 == PT_Lab   && Space2 == PT_LabV2) return TRUE;\n\n    return FALSE;\n}\n\n// ----------------------------------------------------------------------------------------------------------------\n\nstatic\nvoid SetWhitePoint(cmsCIEXYZ* wtPt, const cmsCIEXYZ* src)\n{\n    if (src == NULL) {\n        wtPt ->X = cmsD50X;\n        wtPt ->Y = cmsD50Y;\n        wtPt ->Z = cmsD50Z;\n    }\n    else {\n        wtPt ->X = src->X;\n        wtPt ->Y = src->Y;\n        wtPt ->Z = src->Z;\n    }\n\n}\n\n// New to lcms 2.0 -- have all parameters available.\ncmsHTRANSFORM CMSEXPORT cmsCreateExtendedTransform(cmsContext ContextID,\n                                                   cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[],\n                                                   cmsBool  BPC[],\n                                                   cmsUInt32Number Intents[],\n                                                   cmsFloat64Number AdaptationStates[],\n                                                   cmsHPROFILE hGamutProfile,\n                                                   cmsUInt32Number nGamutPCSposition,\n                                                   cmsUInt32Number InputFormat,\n                                                   cmsUInt32Number OutputFormat,\n                                                   cmsUInt32Number dwFlags)\n{\n    _cmsTRANSFORM* xform;    \n    cmsColorSpaceSignature EntryColorSpace;\n    cmsColorSpaceSignature ExitColorSpace;\n    cmsPipeline* Lut;\n    cmsUInt32Number LastIntent = Intents[nProfiles-1];\n\n    // If it is a fake transform\n    if (dwFlags & cmsFLAGS_NULLTRANSFORM)\n    {\n        return AllocEmptyTransform(ContextID, NULL, INTENT_PERCEPTUAL, &InputFormat, &OutputFormat, &dwFlags);\n    }\n\n    // If gamut check is requested, make sure we have a gamut profile\n    if (dwFlags & cmsFLAGS_GAMUTCHECK) {\n        if (hGamutProfile == NULL) dwFlags &= ~cmsFLAGS_GAMUTCHECK;\n    }\n\n    // On floating point transforms, inhibit cache\n    if (_cmsFormatterIsFloat(InputFormat) || _cmsFormatterIsFloat(OutputFormat))\n        dwFlags |= cmsFLAGS_NOCACHE;\n\n    // Mark entry/exit spaces\n    if (!GetXFormColorSpaces(nProfiles, hProfiles, &EntryColorSpace, &ExitColorSpace)) {\n        cmsSignalError(ContextID, cmsERROR_NULL, \"NULL input profiles on transform\");\n        return NULL;\n    }\n\n    // Check if proper colorspaces\n    if (!IsProperColorSpace(EntryColorSpace, InputFormat)) {\n        cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, \"Wrong input color space on transform\");\n        return NULL;\n    }\n\n    if (!IsProperColorSpace(ExitColorSpace, OutputFormat)) {\n        cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, \"Wrong output color space on transform\");\n        return NULL;\n    }\n\n    // Create a pipeline with all transformations\n    Lut = _cmsLinkProfiles(ContextID, nProfiles, Intents, hProfiles, BPC, AdaptationStates, dwFlags);\n    if (Lut == NULL) {\n        cmsSignalError(ContextID, cmsERROR_NOT_SUITABLE, \"Couldn't link the profiles\");\n        return NULL;\n    }\n\n    // Check channel count\n    if ((cmsChannelsOf(EntryColorSpace) != cmsPipelineInputChannels(Lut)) ||\n        (cmsChannelsOf(ExitColorSpace)  != cmsPipelineOutputChannels(Lut))) {\n        cmsPipelineFree(Lut);\n        cmsSignalError(ContextID, cmsERROR_NOT_SUITABLE, \"Channel count doesn't match. Profile is corrupted\");\n        return NULL;\n    }\n\n\n    // All seems ok\n    xform = AllocEmptyTransform(ContextID, Lut, LastIntent, &InputFormat, &OutputFormat, &dwFlags);\n    if (xform == NULL) {\n        return NULL;\n    }\n\n    // Keep values\n    xform ->EntryColorSpace = EntryColorSpace;\n    xform ->ExitColorSpace  = ExitColorSpace;\n    xform ->RenderingIntent = Intents[nProfiles-1];\n\n    // Take white points\n    SetWhitePoint(&xform->EntryWhitePoint, (cmsCIEXYZ*) cmsReadTag(hProfiles[0], cmsSigMediaWhitePointTag));\n    SetWhitePoint(&xform->ExitWhitePoint,  (cmsCIEXYZ*) cmsReadTag(hProfiles[nProfiles-1], cmsSigMediaWhitePointTag));\n   \n\n    // Create a gamut check LUT if requested\n    if (hGamutProfile != NULL && (dwFlags & cmsFLAGS_GAMUTCHECK))\n        xform ->GamutCheck  = _cmsCreateGamutCheckPipeline(ContextID, hProfiles,\n                                                        BPC, Intents,\n                                                        AdaptationStates,\n                                                        nGamutPCSposition,\n                                                        hGamutProfile);\n\n\n    // Try to read input and output colorant table\n    if (cmsIsTag(hProfiles[0], cmsSigColorantTableTag)) {\n\n        // Input table can only come in this way.\n        xform ->InputColorant = cmsDupNamedColorList((cmsNAMEDCOLORLIST*) cmsReadTag(hProfiles[0], cmsSigColorantTableTag));\n    }\n\n    // Output is a little bit more complex.\n    if (cmsGetDeviceClass(hProfiles[nProfiles-1]) == cmsSigLinkClass) {\n\n        // This tag may exist only on devicelink profiles.\n        if (cmsIsTag(hProfiles[nProfiles-1], cmsSigColorantTableOutTag)) {\n\n            // It may be NULL if error\n            xform ->OutputColorant = cmsDupNamedColorList((cmsNAMEDCOLORLIST*) cmsReadTag(hProfiles[nProfiles-1], cmsSigColorantTableOutTag));\n        }\n\n    } else {\n\n        if (cmsIsTag(hProfiles[nProfiles-1], cmsSigColorantTableTag)) {\n\n            xform -> OutputColorant = cmsDupNamedColorList((cmsNAMEDCOLORLIST*) cmsReadTag(hProfiles[nProfiles-1], cmsSigColorantTableTag));\n        }\n    }\n\n    // Store the sequence of profiles\n    if (dwFlags & cmsFLAGS_KEEP_SEQUENCE) {\n        xform ->Sequence = _cmsCompileProfileSequence(ContextID, nProfiles, hProfiles);\n    }\n    else\n        xform ->Sequence = NULL;\n\n    // If this is a cached transform, init first value, which is zero (16 bits only)\n    if (!(dwFlags & cmsFLAGS_NOCACHE)) {\n\n        memset(&xform ->Cache.CacheIn, 0, sizeof(xform ->Cache.CacheIn));\n\n        if (xform ->GamutCheck != NULL) {\n            TransformOnePixelWithGamutCheck(xform, xform ->Cache.CacheIn, xform->Cache.CacheOut);\n        }\n        else {\n\n            xform ->Lut ->Eval16Fn(xform ->Cache.CacheIn, xform->Cache.CacheOut, xform -> Lut->Data);\n        }\n\n    }\n\n    return (cmsHTRANSFORM) xform;\n}\n\n// Multiprofile transforms: Gamut check is not available here, as it is unclear from which profile the gamut comes.\ncmsHTRANSFORM CMSEXPORT cmsCreateMultiprofileTransformTHR(cmsContext ContextID,\n                                                       cmsHPROFILE hProfiles[],\n                                                       cmsUInt32Number nProfiles,\n                                                       cmsUInt32Number InputFormat,\n                                                       cmsUInt32Number OutputFormat,\n                                                       cmsUInt32Number Intent,\n                                                       cmsUInt32Number dwFlags)\n{\n    cmsUInt32Number i;\n    cmsBool BPC[256];\n    cmsUInt32Number Intents[256];\n    cmsFloat64Number AdaptationStates[256];\n\n    if (nProfiles <= 0 || nProfiles > 255) {\n         cmsSignalError(ContextID, cmsERROR_RANGE, \"Wrong number of profiles. 1..255 expected, %d found.\", nProfiles);\n        return NULL;\n    }\n\n    for (i=0; i < nProfiles; i++) {\n        BPC[i] = dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION ? TRUE : FALSE;\n        Intents[i] = Intent;\n        AdaptationStates[i] = cmsSetAdaptationStateTHR(ContextID, -1);\n    }\n\n\n    return cmsCreateExtendedTransform(ContextID, nProfiles, hProfiles, BPC, Intents, AdaptationStates, NULL, 0, InputFormat, OutputFormat, dwFlags);\n}\n\n\n\ncmsHTRANSFORM CMSEXPORT cmsCreateMultiprofileTransform(cmsHPROFILE hProfiles[],\n                                                  cmsUInt32Number nProfiles,\n                                                  cmsUInt32Number InputFormat,\n                                                  cmsUInt32Number OutputFormat,\n                                                  cmsUInt32Number Intent,\n                                                  cmsUInt32Number dwFlags)\n{\n\n    if (nProfiles <= 0 || nProfiles > 255) {\n         cmsSignalError(NULL, cmsERROR_RANGE, \"Wrong number of profiles. 1..255 expected, %d found.\", nProfiles);\n         return NULL;\n    }\n\n    return cmsCreateMultiprofileTransformTHR(cmsGetProfileContextID(hProfiles[0]),\n                                                  hProfiles,\n                                                  nProfiles,\n                                                  InputFormat,\n                                                  OutputFormat,\n                                                  Intent,\n                                                  dwFlags);\n}\n\ncmsHTRANSFORM CMSEXPORT cmsCreateTransformTHR(cmsContext ContextID,\n                                              cmsHPROFILE Input,\n                                              cmsUInt32Number InputFormat,\n                                              cmsHPROFILE Output,\n                                              cmsUInt32Number OutputFormat,\n                                              cmsUInt32Number Intent,\n                                              cmsUInt32Number dwFlags)\n{\n\n    cmsHPROFILE hArray[2];\n\n    hArray[0] = Input;\n    hArray[1] = Output;\n\n    return cmsCreateMultiprofileTransformTHR(ContextID, hArray, Output == NULL ? 1 : 2, InputFormat, OutputFormat, Intent, dwFlags);\n}\n\nCMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateTransform(cmsHPROFILE Input,\n                                                  cmsUInt32Number InputFormat,\n                                                  cmsHPROFILE Output,\n                                                  cmsUInt32Number OutputFormat,\n                                                  cmsUInt32Number Intent,\n                                                  cmsUInt32Number dwFlags)\n{\n    return cmsCreateTransformTHR(cmsGetProfileContextID(Input), Input, InputFormat, Output, OutputFormat, Intent, dwFlags);\n}\n\n\ncmsHTRANSFORM CMSEXPORT cmsCreateProofingTransformTHR(cmsContext ContextID,\n                                                   cmsHPROFILE InputProfile,\n                                                   cmsUInt32Number InputFormat,\n                                                   cmsHPROFILE OutputProfile,\n                                                   cmsUInt32Number OutputFormat,\n                                                   cmsHPROFILE ProofingProfile,\n                                                   cmsUInt32Number nIntent,\n                                                   cmsUInt32Number ProofingIntent,\n                                                   cmsUInt32Number dwFlags)\n{\n    cmsHPROFILE hArray[4];\n    cmsUInt32Number Intents[4];\n    cmsBool  BPC[4];\n    cmsFloat64Number Adaptation[4];\n    cmsBool  DoBPC = (dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION) ? TRUE : FALSE;\n\n\n    hArray[0]  = InputProfile; hArray[1] = ProofingProfile; hArray[2]  = ProofingProfile;               hArray[3] = OutputProfile;\n    Intents[0] = nIntent;      Intents[1] = nIntent;        Intents[2] = INTENT_RELATIVE_COLORIMETRIC;  Intents[3] = ProofingIntent;\n    BPC[0]     = DoBPC;        BPC[1] = DoBPC;              BPC[2] = 0;                                 BPC[3] = 0;\n\n    Adaptation[0] = Adaptation[1] = Adaptation[2] = Adaptation[3] = cmsSetAdaptationStateTHR(ContextID, -1);\n\n    if (!(dwFlags & (cmsFLAGS_SOFTPROOFING|cmsFLAGS_GAMUTCHECK)))\n        return cmsCreateTransformTHR(ContextID, InputProfile, InputFormat, OutputProfile, OutputFormat, nIntent, dwFlags);\n\n    return cmsCreateExtendedTransform(ContextID, 4, hArray, BPC, Intents, Adaptation,\n                                        ProofingProfile, 1, InputFormat, OutputFormat, dwFlags);\n\n}\n\n\ncmsHTRANSFORM CMSEXPORT cmsCreateProofingTransform(cmsHPROFILE InputProfile,\n                                                   cmsUInt32Number InputFormat,\n                                                   cmsHPROFILE OutputProfile,\n                                                   cmsUInt32Number OutputFormat,\n                                                   cmsHPROFILE ProofingProfile,\n                                                   cmsUInt32Number nIntent,\n                                                   cmsUInt32Number ProofingIntent,\n                                                   cmsUInt32Number dwFlags)\n{\n    return cmsCreateProofingTransformTHR(cmsGetProfileContextID(InputProfile),\n                                                   InputProfile,\n                                                   InputFormat,\n                                                   OutputProfile,\n                                                   OutputFormat,\n                                                   ProofingProfile,\n                                                   nIntent,\n                                                   ProofingIntent,\n                                                   dwFlags);\n}\n\n\n// Grab the ContextID from an open transform. Returns NULL if a NULL transform is passed\ncmsContext CMSEXPORT cmsGetTransformContextID(cmsHTRANSFORM hTransform)\n{\n    _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform;\n\n    if (xform == NULL) return NULL;\n    return xform -> ContextID;\n}\n\n// Grab the input/output formats\ncmsUInt32Number CMSEXPORT cmsGetTransformInputFormat(cmsHTRANSFORM hTransform)\n{\n    _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform;\n\n    if (xform == NULL) return 0;\n    return xform->InputFormat;\n}\n\ncmsUInt32Number CMSEXPORT cmsGetTransformOutputFormat(cmsHTRANSFORM hTransform)\n{\n    _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform;\n\n    if (xform == NULL) return 0;\n    return xform->OutputFormat;\n}\n\n// For backwards compatibility\ncmsBool CMSEXPORT cmsChangeBuffersFormat(cmsHTRANSFORM hTransform,\n                                         cmsUInt32Number InputFormat,\n                                         cmsUInt32Number OutputFormat)\n{\n\n    _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform;\n    cmsFormatter16 FromInput, ToOutput;\n\n\n    // We only can afford to change formatters if previous transform is at least 16 bits\n    if (!(xform ->dwOriginalFlags & cmsFLAGS_CAN_CHANGE_FORMATTER)) {\n\n        cmsSignalError(xform ->ContextID, cmsERROR_NOT_SUITABLE, \"cmsChangeBuffersFormat works only on transforms created originally with at least 16 bits of precision\");\n        return FALSE;\n    }\n\n    FromInput = _cmsGetFormatter(xform->ContextID, InputFormat,  cmsFormatterInput, CMS_PACK_FLAGS_16BITS).Fmt16;\n    ToOutput  = _cmsGetFormatter(xform->ContextID, OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS).Fmt16;\n\n    if (FromInput == NULL || ToOutput == NULL) {\n\n        cmsSignalError(xform -> ContextID, cmsERROR_UNKNOWN_EXTENSION, \"Unsupported raster format\");\n        return FALSE;\n    }\n\n    xform ->InputFormat  = InputFormat;\n    xform ->OutputFormat = OutputFormat;\n    xform ->FromInput    = FromInput;\n    xform ->ToOutput     = ToOutput;\n    return TRUE;\n}\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/lcms2-2.6/src/lcms2_internal.h",
    "content": "//<<<+++OPENSOURCE\n//<<<+++OPENSOURCE_MUST_BEGIN COMMENT==TRUE\n//\n//  Little Color Management System\n//  Copyright (c) 1998-2014 Marti Maria Saguer\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the Software\n// is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//---------------------------------------------------------------------------------\n//\n\n#ifndef _lcms_internal_H\n\n// Include plug-in foundation\n#ifndef _lcms_plugin_H\n#   include \"../include/lcms2_plugin.h\"\n#endif\n\n// ctype is part of C99 as per 7.1.2\n#include <ctype.h>\n\n// assert macro is part of C99 as per 7.2\n#include <assert.h>\n\n// Some needed constants\n#ifndef M_PI\n#       define M_PI        3.14159265358979323846\n#endif\n\n#ifndef M_LOG10E\n#       define M_LOG10E    0.434294481903251827651\n#endif\n\n// BorlandC 5.5, VC2003 are broken on that\n#if defined(__BORLANDC__) || (_MSC_VER < 1400) // 1400 == VC++ 8.0\n#define sinf(x) (float)sin((float)x)\n#define sqrtf(x) (float)sqrt((float)x)\n#endif\n\n\n// Alignment of ICC file format uses 4 bytes (cmsUInt32Number)\n#define _cmsALIGNLONG(x) (((x)+(sizeof(cmsUInt32Number)-1)) & ~(sizeof(cmsUInt32Number)-1))\n\n// Alignment to memory pointer\n#define _cmsALIGNMEM(x)  (((x)+(sizeof(void *) - 1)) & ~(sizeof(void *) - 1))\n\n// Maximum encodeable values in floating point\n#define MAX_ENCODEABLE_XYZ  (1.0 + 32767.0/32768.0)\n#define MIN_ENCODEABLE_ab2  (-128.0)\n#define MAX_ENCODEABLE_ab2  ((65535.0/256.0) - 128.0)\n#define MIN_ENCODEABLE_ab4  (-128.0)\n#define MAX_ENCODEABLE_ab4  (127.0)\n\n// Maximum of channels for internal pipeline evaluation\n#define MAX_STAGE_CHANNELS  128\n\n// Unused parameter warning supression\n#define cmsUNUSED_PARAMETER(x) ((void)x)\n\n// The specification for \"inline\" is section 6.7.4 of the C99 standard (ISO/IEC 9899:1999).\n// unfortunately VisualC++ does not conform that\n#if defined(_MSC_VER) || defined(__BORLANDC__)\n#   define cmsINLINE __inline\n#else\n#   define cmsINLINE static inline\n#endif\n\n// Other replacement functions\n#ifdef _MSC_VER\n# ifndef snprintf\n#       define snprintf  _snprintf\n# endif\n# ifndef vsnprintf\n#       define vsnprintf  _vsnprintf\n# endif\n#endif\n\n\n// A fast way to convert from/to 16 <-> 8 bits\n#define FROM_8_TO_16(rgb) (cmsUInt16Number) ((((cmsUInt16Number) (rgb)) << 8)|(rgb))\n#define FROM_16_TO_8(rgb) (cmsUInt8Number) ((((rgb) * 65281 + 8388608) >> 24) & 0xFF)\n\n// Code analysis is broken on asserts\n#ifdef _MSC_VER\n#    if (_MSC_VER >= 1500)\n#            define _cmsAssert(a)  { assert((a)); __analysis_assume((a)); }\n#     else\n#            define _cmsAssert(a)   assert((a))\n#     endif\n#else\n#      define _cmsAssert(a)   assert((a))\n#endif\n\n//---------------------------------------------------------------------------------\n\n// Determinant lower than that are assumed zero (used on matrix invert)\n#define MATRIX_DET_TOLERANCE    0.0001\n\n//---------------------------------------------------------------------------------\n\n// Fixed point\n#define FIXED_TO_INT(x)         ((x)>>16)\n#define FIXED_REST_TO_INT(x)    ((x)&0xFFFFU)\n#define ROUND_FIXED_TO_INT(x)   (((x)+0x8000)>>16)\n\ncmsINLINE cmsS15Fixed16Number _cmsToFixedDomain(int a)                   { return a + ((a + 0x7fff) / 0xffff); }\ncmsINLINE int                 _cmsFromFixedDomain(cmsS15Fixed16Number a) { return a - ((a + 0x7fff) >> 16); }\n\n// -----------------------------------------------------------------------------------------------------------\n\n// Fast floor conversion logic. Thanks to Sree Kotay and Stuart Nixon\n// note than this only works in the range ..-32767...+32767 because\n// mantissa is interpreted as 15.16 fixed point.\n// The union is to avoid pointer aliasing overoptimization.\ncmsINLINE int _cmsQuickFloor(cmsFloat64Number val)\n{\n#ifdef CMS_DONT_USE_FAST_FLOOR\n    return (int) floor(val);\n#else\n    const cmsFloat64Number _lcms_double2fixmagic = 68719476736.0 * 1.5;  // 2^36 * 1.5, (52-16=36) uses limited precision to floor\n    union {\n        cmsFloat64Number val;\n        int halves[2];\n    } temp;\n\n    temp.val = val + _lcms_double2fixmagic;\n\n#ifdef CMS_USE_BIG_ENDIAN\n    return temp.halves[1] >> 16;\n#else\n    return temp.halves[0] >> 16;\n#endif\n#endif\n}\n\n// Fast floor restricted to 0..65535.0\ncmsINLINE cmsUInt16Number _cmsQuickFloorWord(cmsFloat64Number d)\n{\n    return (cmsUInt16Number) _cmsQuickFloor(d - 32767.0) + 32767U;\n}\n\n// Floor to word, taking care of saturation\ncmsINLINE cmsUInt16Number _cmsQuickSaturateWord(cmsFloat64Number d)\n{\n    d += 0.5;\n    if (d <= 0) return 0;\n    if (d >= 65535.0) return 0xffff;\n\n    return _cmsQuickFloorWord(d);\n}\n\n\n// Pthread support --------------------------------------------------------------------\n#ifndef CMS_NO_PTHREADS\n\n// This is the threading support. Unfortunately, it has to be platform-dependent because \n// windows does not support pthreads. \n\n#ifdef CMS_IS_WINDOWS_\n\n#define WIN32_LEAN_AND_MEAN 1\n#include <windows.h>\n\n\n// From: http://locklessinc.com/articles/pthreads_on_windows/\n// The pthreads API has an initialization macro that has no correspondence to anything in \n// the windows API. By investigating the internal definition of the critical section type, \n// one may work out how to initialize one without calling InitializeCriticalSection(). \n// The trick here is that InitializeCriticalSection() is not allowed to fail. It tries \n// to allocate a critical section debug object, but if no memory is available, it sets \n// the pointer to a specific value. (One would expect that value to be NULL, but it is \n// actually (void *)-1 for some reason.) Thus we can use this special value for that \n// pointer, and the critical section code will work.\n\n// The other important part of the critical section type to initialize is the number \n// of waiters. This controls whether or not the mutex is locked. Fortunately, this \n// part of the critical section is unlikely to change. Apparently, many programs \n// already test critical sections to see if they are locked using this value, so \n// Microsoft felt that it was necessary to keep it set at -1 for an unlocked critical\n// section, even when they changed the underlying algorithm to be more scalable. \n// The final parts of the critical section object are unimportant, and can be set \n// to zero for their defaults. This yields an initialization macro:\n\ntypedef CRITICAL_SECTION _cmsMutex;\n\n#define CMS_MUTEX_INITIALIZER {(void*) -1,-1,0,0,0,0}\n\ncmsINLINE int _cmsLockPrimitive(_cmsMutex *m)\n{\n\tEnterCriticalSection(m);\n\treturn 0;\n}\n\ncmsINLINE int _cmsUnlockPrimitive(_cmsMutex *m)\n{\n\tLeaveCriticalSection(m);\n\treturn 0;\n}\n\t\ncmsINLINE int _cmsInitMutexPrimitive(_cmsMutex *m)\n{\n\tInitializeCriticalSection(m);\n\treturn 0;\n}\n\ncmsINLINE int _cmsDestroyMutexPrimitive(_cmsMutex *m)\n{\n\tDeleteCriticalSection(m);\n\treturn 0;\n}\n\ncmsINLINE int _cmsEnterCriticalSectionPrimitive(_cmsMutex *m)\n{\n\tEnterCriticalSection(m);\n\treturn 0;\n}\n\ncmsINLINE int _cmsLeaveCriticalSectionPrimitive(_cmsMutex *m)\n{\n\tLeaveCriticalSection(m);\n\treturn 0;\n}\n\n#else\n\n// Rest of the wide world\n#include <pthread.h>\n\n#define CMS_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER\ntypedef pthread_mutex_t _cmsMutex;\n\n\ncmsINLINE int _cmsLockPrimitive(_cmsMutex *m)\n{\n\treturn pthread_mutex_lock(m);\n}\n\ncmsINLINE int _cmsUnlockPrimitive(_cmsMutex *m)\n{\n\treturn pthread_mutex_unlock(m);\n}\n\t\ncmsINLINE int _cmsInitMutexPrimitive(_cmsMutex *m)\n{\n\treturn pthread_mutex_init(m, NULL);\n}\n\ncmsINLINE int _cmsDestroyMutexPrimitive(_cmsMutex *m)\n{\n\treturn pthread_mutex_destroy(m);\n}\n\ncmsINLINE int _cmsEnterCriticalSectionPrimitive(_cmsMutex *m)\n{\n\treturn pthread_mutex_lock(m);\n}\n\ncmsINLINE int _cmsLeaveCriticalSectionPrimitive(_cmsMutex *m)\n{\n\treturn pthread_mutex_unlock(m);\n}\n\n#endif\n#else\n\n#define CMS_MUTEX_INITIALIZER 0\ntypedef int _cmsMutex;\n\n\ncmsINLINE int _cmsLockPrimitive(_cmsMutex *m)\n{\n\treturn 0;\n    cmsUNUSED_PARAMETER(m);\n}\n\ncmsINLINE int _cmsUnlockPrimitive(_cmsMutex *m)\n{\n\treturn 0;\n    cmsUNUSED_PARAMETER(m);\n}\n\t\ncmsINLINE int _cmsInitMutexPrimitive(_cmsMutex *m)\n{\n\treturn 0;\n    cmsUNUSED_PARAMETER(m);\n}\n\ncmsINLINE int _cmsDestroyMutexPrimitive(_cmsMutex *m)\n{\n\treturn 0;\n    cmsUNUSED_PARAMETER(m);\n}\n\ncmsINLINE int _cmsEnterCriticalSectionPrimitive(_cmsMutex *m)\n{\n\treturn 0;\n    cmsUNUSED_PARAMETER(m);\n}\n\ncmsINLINE int _cmsLeaveCriticalSectionPrimitive(_cmsMutex *m)\n{\n\treturn 0;\n    cmsUNUSED_PARAMETER(m);\n}\n#endif\n\n// Plug-In registration ---------------------------------------------------------------\n\n// Specialized function for plug-in memory management. No pairing free() since whole pool is freed at once.\nvoid* _cmsPluginMalloc(cmsContext ContextID, cmsUInt32Number size);\n\n// Memory management\ncmsBool   _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase* Plugin);\n\n// Interpolation\ncmsBool  _cmsRegisterInterpPlugin(cmsContext ContextID, cmsPluginBase* Plugin);\n\n// Parametric curves\ncmsBool  _cmsRegisterParametricCurvesPlugin(cmsContext ContextID, cmsPluginBase* Plugin);\n\n// Formatters management\ncmsBool  _cmsRegisterFormattersPlugin(cmsContext ContextID, cmsPluginBase* Plugin);\n\n// Tag type management\ncmsBool  _cmsRegisterTagTypePlugin(cmsContext ContextID, cmsPluginBase* Plugin);\n\n// Tag management\ncmsBool  _cmsRegisterTagPlugin(cmsContext ContextID, cmsPluginBase* Plugin);\n\n// Intent management\ncmsBool  _cmsRegisterRenderingIntentPlugin(cmsContext ContextID, cmsPluginBase* Plugin);\n\n// Multi Process elements\ncmsBool  _cmsRegisterMultiProcessElementPlugin(cmsContext ContextID, cmsPluginBase* Plugin);\n\n// Optimization\ncmsBool  _cmsRegisterOptimizationPlugin(cmsContext ContextID, cmsPluginBase* Plugin);\n\n// Transform\ncmsBool  _cmsRegisterTransformPlugin(cmsContext ContextID, cmsPluginBase* Plugin);\n\n// Mutex\ncmsBool _cmsRegisterMutexPlugin(cmsContext ContextID, cmsPluginBase* Plugin);\n\n// ---------------------------------------------------------------------------------------------------------\n\n// Suballocators. \ntypedef struct _cmsSubAllocator_chunk_st {\n\n    cmsUInt8Number* Block;\n    cmsUInt32Number BlockSize;\n    cmsUInt32Number Used;\n\n    struct _cmsSubAllocator_chunk_st* next;\n\n} _cmsSubAllocator_chunk;\n\n\ntypedef struct {\n\n    cmsContext ContextID;\n    _cmsSubAllocator_chunk* h;\n\n} _cmsSubAllocator;\n\n\n_cmsSubAllocator* _cmsCreateSubAlloc(cmsContext ContextID, cmsUInt32Number Initial);\nvoid              _cmsSubAllocDestroy(_cmsSubAllocator* s);\nvoid*             _cmsSubAlloc(_cmsSubAllocator* s, cmsUInt32Number size);\nvoid*             _cmsSubAllocDup(_cmsSubAllocator* s, const void *ptr, cmsUInt32Number size);\n\n// ----------------------------------------------------------------------------------\n\n// The context clients. \ntypedef enum {\n\n    UserPtr,            // User-defined pointer\n    Logger,\n    AlarmCodesContext,\n    AdaptationStateContext, \n    MemPlugin,\n    InterpPlugin,\n    CurvesPlugin,\n    FormattersPlugin,\n    TagTypePlugin,\n    TagPlugin,\n    IntentPlugin,\n    MPEPlugin,\n    OptimizationPlugin,\n    TransformPlugin,\n    MutexPlugin,\n\n    // Last in list\n    MemoryClientMax\n\n} _cmsMemoryClient;\n\n\n// Container for memory management plug-in.\ntypedef struct {\n\n    _cmsMallocFnPtrType     MallocPtr;    \n    _cmsMalloZerocFnPtrType MallocZeroPtr;\n    _cmsFreeFnPtrType       FreePtr;\n    _cmsReallocFnPtrType    ReallocPtr;\n    _cmsCallocFnPtrType     CallocPtr;\n    _cmsDupFnPtrType        DupPtr;\n\n} _cmsMemPluginChunkType;\n\n// Copy memory management function pointers from plug-in to chunk, taking care of missing routines\nvoid  _cmsInstallAllocFunctions(cmsPluginMemHandler* Plugin, _cmsMemPluginChunkType* ptr);\n\n// Internal structure for context\nstruct _cmsContext_struct {\n    \n    struct _cmsContext_struct* Next;  // Points to next context in the new style\n    _cmsSubAllocator* MemPool;        // The memory pool that stores context data\n    \n    void* chunks[MemoryClientMax];    // array of pointers to client chunks. Memory itself is hold in the suballocator. \n                                      // If NULL, then it reverts to global Context0\n\n    _cmsMemPluginChunkType DefaultMemoryManager;  // The allocators used for creating the context itself. Cannot be overriden\n};\n\n// Returns a pointer to a valid context structure, including the global one if id is zero. \n// Verifies the magic number.\nstruct _cmsContext_struct* _cmsGetContext(cmsContext ContextID);\n\n// Returns the block assigned to the specific zone. \nvoid*     _cmsContextGetClientChunk(cmsContext id, _cmsMemoryClient mc);\n\n\n// Chunks of context memory by plug-in client -------------------------------------------------------\n\n// Those structures encapsulates all variables needed by the several context clients (mostly plug-ins)\n\n// Container for error logger -- not a plug-in\ntypedef struct {\n\n    cmsLogErrorHandlerFunction LogErrorHandler;  // Set to NULL for Context0 fallback\n\n} _cmsLogErrorChunkType;\n\n// The global Context0 storage for error logger\nextern  _cmsLogErrorChunkType  _cmsLogErrorChunk;\n\n// Allocate and init error logger container. \nvoid _cmsAllocLogErrorChunk(struct _cmsContext_struct* ctx, \n                            const struct _cmsContext_struct* src);\n\n// Container for alarm codes -- not a plug-in\ntypedef struct {\n   \n    cmsUInt16Number AlarmCodes[cmsMAXCHANNELS];\n\n} _cmsAlarmCodesChunkType;\n\n// The global Context0 storage for alarm codes\nextern  _cmsAlarmCodesChunkType _cmsAlarmCodesChunk;\n\n// Allocate and init alarm codes container. \nvoid _cmsAllocAlarmCodesChunk(struct _cmsContext_struct* ctx, \n                            const struct _cmsContext_struct* src);\n\n// Container for adaptation state -- not a plug-in\ntypedef struct {\n    \n    cmsFloat64Number  AdaptationState;\n\n} _cmsAdaptationStateChunkType;\n\n// The global Context0 storage for adaptation state\nextern  _cmsAdaptationStateChunkType    _cmsAdaptationStateChunk;\n\n// Allocate and init adaptation state container.\nvoid _cmsAllocAdaptationStateChunk(struct _cmsContext_struct* ctx, \n                                   const struct _cmsContext_struct* src);\n\n\n// The global Context0 storage for memory management\nextern  _cmsMemPluginChunkType _cmsMemPluginChunk;\n\n// Allocate and init memory management container.\nvoid _cmsAllocMemPluginChunk(struct _cmsContext_struct* ctx, \n                             const struct _cmsContext_struct* src);\n\n// Container for interpolation plug-in\ntypedef struct {\n\n    cmsInterpFnFactory Interpolators;\n\n} _cmsInterpPluginChunkType;\n\n// The global Context0 storage for interpolation plug-in\nextern  _cmsInterpPluginChunkType _cmsInterpPluginChunk;\n\n// Allocate and init interpolation container.\nvoid _cmsAllocInterpPluginChunk(struct _cmsContext_struct* ctx, \n                                const struct _cmsContext_struct* src);\n\n// Container for parametric curves plug-in\ntypedef struct {\n\n    struct _cmsParametricCurvesCollection_st* ParametricCurves;\n\n} _cmsCurvesPluginChunkType;\n\n// The global Context0 storage for tone curves plug-in\nextern  _cmsCurvesPluginChunkType _cmsCurvesPluginChunk;\n\n// Allocate and init parametric curves container.\nvoid _cmsAllocCurvesPluginChunk(struct _cmsContext_struct* ctx, \n                                                      const struct _cmsContext_struct* src);\n\n// Container for formatters plug-in\ntypedef struct {\n\n    struct _cms_formatters_factory_list* FactoryList;\n\n} _cmsFormattersPluginChunkType;\n\n// The global Context0 storage for formatters plug-in\nextern  _cmsFormattersPluginChunkType _cmsFormattersPluginChunk;\n\n// Allocate and init formatters container.\nvoid _cmsAllocFormattersPluginChunk(struct _cmsContext_struct* ctx, \n                                                       const struct _cmsContext_struct* src);\n\n// This chunk type is shared by TagType plug-in and MPE Plug-in\ntypedef struct {\n\n    struct _cmsTagTypeLinkedList_st* TagTypes;\n\n} _cmsTagTypePluginChunkType;\n\n\n// The global Context0 storage for tag types plug-in\nextern  _cmsTagTypePluginChunkType      _cmsTagTypePluginChunk;\n\n\n// The global Context0 storage for mult process elements plug-in\nextern  _cmsTagTypePluginChunkType      _cmsMPETypePluginChunk;\n\n// Allocate and init Tag types container.\nvoid _cmsAllocTagTypePluginChunk(struct _cmsContext_struct* ctx, \n                                                        const struct _cmsContext_struct* src);\n// Allocate and init MPE container.\nvoid _cmsAllocMPETypePluginChunk(struct _cmsContext_struct* ctx, \n                                                        const struct _cmsContext_struct* src);\n// Container for tag plug-in\ntypedef struct {\n   \n    struct _cmsTagLinkedList_st* Tag;\n\n} _cmsTagPluginChunkType;\n\n\n// The global Context0 storage for tag plug-in\nextern  _cmsTagPluginChunkType _cmsTagPluginChunk;\n\n// Allocate and init Tag container.\nvoid _cmsAllocTagPluginChunk(struct _cmsContext_struct* ctx, \n                                                      const struct _cmsContext_struct* src); \n\n// Container for intents plug-in\ntypedef struct {\n\n    struct _cms_intents_list* Intents;\n\n} _cmsIntentsPluginChunkType;\n\n\n// The global Context0 storage for intents plug-in\nextern  _cmsIntentsPluginChunkType _cmsIntentsPluginChunk;\n\n// Allocate and init intents container.\nvoid _cmsAllocIntentsPluginChunk(struct _cmsContext_struct* ctx, \n                                                        const struct _cmsContext_struct* src); \n\n// Container for optimization plug-in\ntypedef struct {\n\n    struct _cmsOptimizationCollection_st* OptimizationCollection;\n\n} _cmsOptimizationPluginChunkType;\n\n\n// The global Context0 storage for optimizers plug-in\nextern  _cmsOptimizationPluginChunkType _cmsOptimizationPluginChunk;\n\n// Allocate and init optimizers container.\nvoid _cmsAllocOptimizationPluginChunk(struct _cmsContext_struct* ctx, \n                                         const struct _cmsContext_struct* src);\n\n// Container for transform plug-in\ntypedef struct {\n\n    struct _cmsTransformCollection_st* TransformCollection;\n\n} _cmsTransformPluginChunkType;\n\n// The global Context0 storage for full-transform replacement plug-in\nextern  _cmsTransformPluginChunkType _cmsTransformPluginChunk;\n\n// Allocate and init transform container.\nvoid _cmsAllocTransformPluginChunk(struct _cmsContext_struct* ctx, \n                                        const struct _cmsContext_struct* src);\n\n// Container for mutex plug-in\ntypedef struct {\n\n    _cmsCreateMutexFnPtrType  CreateMutexPtr;\n    _cmsDestroyMutexFnPtrType DestroyMutexPtr;\n    _cmsLockMutexFnPtrType    LockMutexPtr;\n    _cmsUnlockMutexFnPtrType  UnlockMutexPtr;\n\n} _cmsMutexPluginChunkType;\n\n// The global Context0 storage for mutex plug-in\nextern  _cmsMutexPluginChunkType _cmsMutexPluginChunk;\n\n// Allocate and init mutex container.\nvoid _cmsAllocMutexPluginChunk(struct _cmsContext_struct* ctx, \n                                        const struct _cmsContext_struct* src);\n\n// ----------------------------------------------------------------------------------\n// MLU internal representation\ntypedef struct {\n\n    cmsUInt16Number Language;\n    cmsUInt16Number Country;\n\n    cmsUInt32Number StrW;       // Offset to current unicode string\n    cmsUInt32Number Len;        // Length in bytes\n\n} _cmsMLUentry;\n\nstruct _cms_MLU_struct {\n\n    cmsContext ContextID;\n\n    // The directory\n    int AllocatedEntries;\n    int UsedEntries;\n    _cmsMLUentry* Entries;     // Array of pointers to strings allocated in MemPool\n\n    // The Pool\n    cmsUInt32Number PoolSize;  // The maximum allocated size\n    cmsUInt32Number PoolUsed;  // The used size\n    void*  MemPool;            // Pointer to begin of memory pool\n};\n\n// Named color list internal representation\ntypedef struct {\n\n    char Name[cmsMAX_PATH];\n    cmsUInt16Number PCS[3];\n    cmsUInt16Number DeviceColorant[cmsMAXCHANNELS];\n\n} _cmsNAMEDCOLOR;\n\nstruct _cms_NAMEDCOLORLIST_struct {\n\n    cmsUInt32Number nColors;\n    cmsUInt32Number Allocated;\n    cmsUInt32Number ColorantCount;\n\n    char Prefix[33];      // Prefix and suffix are defined to be 32 characters at most\n    char Suffix[33];\n\n    _cmsNAMEDCOLOR* List;\n\n    cmsContext ContextID;\n};\n\n\n// ----------------------------------------------------------------------------------\n\n// This is the internal struct holding profile details.\n\n// Maximum supported tags in a profile\n#define MAX_TABLE_TAG       100\n\ntypedef struct _cms_iccprofile_struct {\n\n    // I/O handler\n    cmsIOHANDLER*            IOhandler;\n\n    // The thread ID\n    cmsContext               ContextID;\n\n    // Creation time\n    struct tm                Created;\n\n    // Only most important items found in ICC profiles\n    cmsUInt32Number          Version;\n    cmsProfileClassSignature DeviceClass;\n    cmsColorSpaceSignature   ColorSpace;\n    cmsColorSpaceSignature   PCS;\n    cmsUInt32Number          RenderingIntent;\n\n    cmsUInt32Number          flags;\n    cmsUInt32Number          manufacturer, model;\n    cmsUInt64Number          attributes;\n    cmsUInt32Number          creator;\n\n    cmsProfileID             ProfileID;\n\n    // Dictionary\n    cmsUInt32Number          TagCount;\n    cmsTagSignature          TagNames[MAX_TABLE_TAG];\n    cmsTagSignature          TagLinked[MAX_TABLE_TAG];           // The tag to wich is linked (0=none)\n    cmsUInt32Number          TagSizes[MAX_TABLE_TAG];            // Size on disk\n    cmsUInt32Number          TagOffsets[MAX_TABLE_TAG];\n    cmsBool                  TagSaveAsRaw[MAX_TABLE_TAG];        // True to write uncooked\n    void *                   TagPtrs[MAX_TABLE_TAG];\n    cmsTagTypeHandler*       TagTypeHandlers[MAX_TABLE_TAG];     // Same structure may be serialized on different types\n                                                                 // depending on profile version, so we keep track of the\n                                                                 // type handler for each tag in the list.\n    // Special\n    cmsBool                  IsWrite;\n\n    // Keep a mutex for cmsReadTag -- Note that this only works if the user includes a mutex plugin\n    void *                   UsrMutex;\n\n} _cmsICCPROFILE;\n\n// IO helpers for profiles\ncmsBool              _cmsReadHeader(_cmsICCPROFILE* Icc);\ncmsBool              _cmsWriteHeader(_cmsICCPROFILE* Icc, cmsUInt32Number UsedSpace);\nint                  _cmsSearchTag(_cmsICCPROFILE* Icc, cmsTagSignature sig, cmsBool lFollowLinks);\n\n// Tag types\ncmsTagTypeHandler*   _cmsGetTagTypeHandler(cmsContext ContextID, cmsTagTypeSignature sig);\ncmsTagTypeSignature  _cmsGetTagTrueType(cmsHPROFILE hProfile, cmsTagSignature sig);\ncmsTagDescriptor*    _cmsGetTagDescriptor(cmsContext ContextID, cmsTagSignature sig);\n\n// Error logging ---------------------------------------------------------------------------------------------------------\n\nvoid                 _cmsTagSignature2String(char String[5], cmsTagSignature sig);\n\n// Interpolation ---------------------------------------------------------------------------------------------------------\n\ncmsInterpParams*     _cmsComputeInterpParams(cmsContext ContextID, int nSamples, int InputChan, int OutputChan, const void* Table, cmsUInt32Number dwFlags);\ncmsInterpParams*     _cmsComputeInterpParamsEx(cmsContext ContextID, const cmsUInt32Number nSamples[], int InputChan, int OutputChan, const void* Table, cmsUInt32Number dwFlags);\nvoid                 _cmsFreeInterpParams(cmsInterpParams* p);\ncmsBool              _cmsSetInterpolationRoutine(cmsContext ContextID, cmsInterpParams* p);\n\n// Curves ----------------------------------------------------------------------------------------------------------------\n\n// This struct holds information about a segment, plus a pointer to the function that implements the evaluation.\n// In the case of table-based, Eval pointer is set to NULL\n\n// The gamma function main structure\nstruct _cms_curve_struct {\n\n    cmsInterpParams*  InterpParams;  // Private optimizations for interpolation\n\n    cmsUInt32Number   nSegments;     // Number of segments in the curve. Zero for a 16-bit based tables\n    cmsCurveSegment*  Segments;      // The segments\n    cmsInterpParams** SegInterp;     // Array of private optimizations for interpolation in table-based segments\n\n    cmsParametricCurveEvaluator* Evals;  // Evaluators (one per segment)\n\n    // 16 bit Table-based representation follows\n    cmsUInt32Number    nEntries;      // Number of table elements\n    cmsUInt16Number*   Table16;       // The table itself.\n};\n\n\n//  Pipelines & Stages ---------------------------------------------------------------------------------------------\n\n// A single stage\nstruct _cmsStage_struct {\n\n    cmsContext          ContextID;\n\n    cmsStageSignature   Type;           // Identifies the stage\n    cmsStageSignature   Implements;     // Identifies the *function* of the stage (for optimizations)\n\n    cmsUInt32Number     InputChannels;  // Input channels -- for optimization purposes\n    cmsUInt32Number     OutputChannels; // Output channels -- for optimization purposes\n\n    _cmsStageEvalFn     EvalPtr;        // Points to fn that evaluates the stage (always in floating point)\n    _cmsStageDupElemFn  DupElemPtr;     // Points to a fn that duplicates the *data* of the stage\n    _cmsStageFreeElemFn FreePtr;        // Points to a fn that sets the *data* of the stage free\n\n    // A generic pointer to whatever memory needed by the stage\n    void*               Data;\n\n    // Maintains linked list (used internally)\n    struct _cmsStage_struct* Next;\n};\n\n\n// Special Stages (cannot be saved)\ncmsStage*        _cmsStageAllocLab2XYZ(cmsContext ContextID);\ncmsStage*        _cmsStageAllocXYZ2Lab(cmsContext ContextID);\ncmsStage*        _cmsStageAllocLabPrelin(cmsContext ContextID);\ncmsStage*        _cmsStageAllocLabV2ToV4(cmsContext ContextID);\ncmsStage*        _cmsStageAllocLabV2ToV4curves(cmsContext ContextID);\ncmsStage*        _cmsStageAllocLabV4ToV2(cmsContext ContextID);\ncmsStage*        _cmsStageAllocNamedColor(cmsNAMEDCOLORLIST* NamedColorList, cmsBool UsePCS);\ncmsStage*        _cmsStageAllocIdentityCurves(cmsContext ContextID, int nChannels);\ncmsStage*        _cmsStageAllocIdentityCLut(cmsContext ContextID, int nChan);\ncmsStage*        _cmsStageNormalizeFromLabFloat(cmsContext ContextID);\ncmsStage*        _cmsStageNormalizeFromXyzFloat(cmsContext ContextID);\ncmsStage*        _cmsStageNormalizeToLabFloat(cmsContext ContextID);\ncmsStage*        _cmsStageNormalizeToXyzFloat(cmsContext ContextID);\n\n// For curve set only\ncmsToneCurve**     _cmsStageGetPtrToCurveSet(const cmsStage* mpe);\n\n\n// Pipeline Evaluator (in floating point)\ntypedef void (* _cmsPipelineEvalFloatFn)(const cmsFloat32Number In[],\n                                         cmsFloat32Number Out[],\n                                         const void* Data);\n\nstruct _cmsPipeline_struct {\n\n    cmsStage* Elements;                                // Points to elements chain\n    cmsUInt32Number InputChannels, OutputChannels;\n\n    // Data & evaluators\n    void *Data;\n\n   _cmsOPTeval16Fn         Eval16Fn;\n   _cmsPipelineEvalFloatFn EvalFloatFn;\n   _cmsFreeUserDataFn      FreeDataFn;\n   _cmsDupUserDataFn       DupDataFn;\n\n    cmsContext ContextID;            // Environment\n\n    cmsBool  SaveAs8Bits;            // Implementation-specific: save as 8 bits if possible\n};\n\n// LUT reading & creation -------------------------------------------------------------------------------------------\n\n// Read tags using low-level function, provide necessary glue code to adapt versions, etc. All those return a brand new copy\n// of the LUTS, since ownership of original is up to the profile. The user should free allocated resources.\n\ncmsPipeline*      _cmsReadInputLUT(cmsHPROFILE hProfile, int Intent);\ncmsPipeline*      _cmsReadOutputLUT(cmsHPROFILE hProfile, int Intent);\ncmsPipeline*      _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, int Intent);\n\n// Special values\ncmsBool           _cmsReadMediaWhitePoint(cmsCIEXYZ* Dest, cmsHPROFILE hProfile);\ncmsBool           _cmsReadCHAD(cmsMAT3* Dest, cmsHPROFILE hProfile);\n\n// Profile linker --------------------------------------------------------------------------------------------------\n\ncmsPipeline* _cmsLinkProfiles(cmsContext         ContextID,\n                              cmsUInt32Number    nProfiles,\n                              cmsUInt32Number    TheIntents[],\n                              cmsHPROFILE        hProfiles[],\n                              cmsBool            BPC[],\n                              cmsFloat64Number   AdaptationStates[],\n                              cmsUInt32Number    dwFlags);\n\n// Sequence --------------------------------------------------------------------------------------------------------\n\ncmsSEQ* _cmsReadProfileSequence(cmsHPROFILE hProfile);\ncmsBool _cmsWriteProfileSequence(cmsHPROFILE hProfile, const cmsSEQ* seq);\ncmsSEQ* _cmsCompileProfileSequence(cmsContext ContextID, cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[]);\n\n\n// LUT optimization ------------------------------------------------------------------------------------------------\n\ncmsUInt16Number  _cmsQuantizeVal(cmsFloat64Number i, int MaxSamples);\nint              _cmsReasonableGridpointsByColorspace(cmsColorSpaceSignature Colorspace, cmsUInt32Number dwFlags);\n\ncmsBool          _cmsEndPointsBySpace(cmsColorSpaceSignature Space,\n                                      cmsUInt16Number **White,\n                                      cmsUInt16Number **Black,\n                                      cmsUInt32Number *nOutputs);\n\ncmsBool          _cmsOptimizePipeline(cmsContext ContextID,\n                                      cmsPipeline**    Lut,\n                                      int              Intent,\n                                      cmsUInt32Number* InputFormat,\n                                      cmsUInt32Number* OutputFormat,\n                                      cmsUInt32Number* dwFlags );\n\n\n// Hi level LUT building ----------------------------------------------------------------------------------------------\n\ncmsPipeline*     _cmsCreateGamutCheckPipeline(cmsContext ContextID,\n                                              cmsHPROFILE hProfiles[],\n                                              cmsBool  BPC[],\n                                              cmsUInt32Number Intents[],\n                                              cmsFloat64Number AdaptationStates[],\n                                              cmsUInt32Number nGamutPCSposition,\n                                              cmsHPROFILE hGamut);\n\n\n// Formatters ------------------------------------------------------------------------------------------------------------\n\n#define cmsFLAGS_CAN_CHANGE_FORMATTER     0x02000000   // Allow change buffer format\n\ncmsBool         _cmsFormatterIsFloat(cmsUInt32Number Type);\ncmsBool         _cmsFormatterIs8bit(cmsUInt32Number Type);\n\ncmsFormatter    _cmsGetFormatter(cmsContext ContextID,\n                                 cmsUInt32Number Type,          // Specific type, i.e. TYPE_RGB_8\n                                 cmsFormatterDirection Dir,\n                                 cmsUInt32Number dwFlags);\n\n\n#ifndef CMS_NO_HALF_SUPPORT \n\n// Half float\ncmsFloat32Number _cmsHalf2Float(cmsUInt16Number h);\ncmsUInt16Number  _cmsFloat2Half(cmsFloat32Number flt);\n\n#endif\n\n// Transform logic ------------------------------------------------------------------------------------------------------\n\nstruct _cmstransform_struct;\n\ntypedef struct {\n\n    // 1-pixel cache (16 bits only)\n    cmsUInt16Number CacheIn[cmsMAXCHANNELS];\n    cmsUInt16Number CacheOut[cmsMAXCHANNELS];\n\n} _cmsCACHE;\n\n\n\n// Transformation\ntypedef struct _cmstransform_struct {\n\n    cmsUInt32Number InputFormat, OutputFormat; // Keep formats for further reference\n\n    // Points to transform code\n    _cmsTransformFn xform;\n\n    // Formatters, cannot be embedded into LUT because cache\n    cmsFormatter16 FromInput;\n    cmsFormatter16 ToOutput;\n\n    cmsFormatterFloat FromInputFloat;\n    cmsFormatterFloat ToOutputFloat;\n\n    // 1-pixel cache seed for zero as input (16 bits, read only)\n    _cmsCACHE Cache;\n\n    // A Pipeline holding the full (optimized) transform\n    cmsPipeline* Lut;\n\n    // A Pipeline holding the gamut check. It goes from the input space to bilevel\n    cmsPipeline* GamutCheck;\n\n    // Colorant tables\n    cmsNAMEDCOLORLIST* InputColorant;       // Input Colorant table\n    cmsNAMEDCOLORLIST* OutputColorant;      // Colorant table (for n chans > CMYK)\n\n    // Informational only\n    cmsColorSpaceSignature EntryColorSpace;\n    cmsColorSpaceSignature ExitColorSpace;\n\n    // White points (informative only)\n    cmsCIEXYZ EntryWhitePoint;\n    cmsCIEXYZ ExitWhitePoint;\n\n    // Profiles used to create the transform\n    cmsSEQ* Sequence;\n\n    cmsUInt32Number  dwOriginalFlags;\n    cmsFloat64Number AdaptationState;\n\n    // The intent of this transform. That is usually the last intent in the profilechain, but may differ\n    cmsUInt32Number RenderingIntent;\n\n    // An id that uniquely identifies the running context. May be null.\n    cmsContext ContextID;\n\n    // A user-defined pointer that can be used to store data for transform plug-ins\n    void* UserData;\n    _cmsFreeUserDataFn FreeUserData;\n\n} _cmsTRANSFORM;\n\n// --------------------------------------------------------------------------------------------------\n\ncmsHTRANSFORM _cmsChain2Lab(cmsContext             ContextID,\n                            cmsUInt32Number        nProfiles,\n                            cmsUInt32Number        InputFormat,\n                            cmsUInt32Number        OutputFormat,\n                            const cmsUInt32Number  Intents[],\n                            const cmsHPROFILE      hProfiles[],\n                            const cmsBool          BPC[],\n                            const cmsFloat64Number AdaptationStates[],\n                            cmsUInt32Number        dwFlags);\n\n\ncmsToneCurve* _cmsBuildKToneCurve(cmsContext       ContextID,\n                            cmsUInt32Number        nPoints,\n                            cmsUInt32Number        nProfiles,\n                            const cmsUInt32Number  Intents[],\n                            const cmsHPROFILE      hProfiles[],\n                            const cmsBool          BPC[],\n                            const cmsFloat64Number AdaptationStates[],\n                            cmsUInt32Number        dwFlags);\n\ncmsBool   _cmsAdaptationMatrix(cmsMAT3* r, const cmsMAT3* ConeMatrix, const cmsCIEXYZ* FromIll, const cmsCIEXYZ* ToIll);\n\ncmsBool   _cmsBuildRGB2XYZtransferMatrix(cmsMAT3* r, const cmsCIExyY* WhitePoint, const cmsCIExyYTRIPLE* Primaries);\n\n\n#define _lcms_internal_H\n#endif\n//<<<+++OPENSOURCE_MUST_END\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/src/fx_cmscam02.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../lcms2-2.6/src/cmscam02.c\"\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/src/fx_cmscgats.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../lcms2-2.6/src/cmscgats.c\"\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/src/fx_cmscnvrt.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../lcms2-2.6/src/cmscnvrt.c\"\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/src/fx_cmserr.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../lcms2-2.6/src/cmserr.c\"\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/src/fx_cmsgamma.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../lcms2-2.6/src/cmsgamma.c\"\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/src/fx_cmsgmt.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../lcms2-2.6/src/cmsgmt.c\"\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/src/fx_cmshalf.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../lcms2-2.6/src/cmshalf.c\"\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/src/fx_cmsintrp.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../lcms2-2.6/src/cmsintrp.c\"\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/src/fx_cmsio0.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../lcms2-2.6/src/cmsio0.c\"\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/src/fx_cmsio1.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../lcms2-2.6/src/cmsio1.c\"\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/src/fx_cmslut.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../lcms2-2.6/src/cmslut.c\"\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/src/fx_cmsmd5.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../lcms2-2.6/src/cmsmd5.c\"\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/src/fx_cmsmtrx.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../lcms2-2.6/src/cmsmtrx.c\"\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/src/fx_cmsnamed.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../lcms2-2.6/src/cmsnamed.c\"\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/src/fx_cmsopt.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../lcms2-2.6/src/cmsopt.c\"\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/src/fx_cmspack.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../lcms2-2.6/src/cmspack.c\"\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/src/fx_cmspcs.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../lcms2-2.6/src/cmspcs.c\"\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/src/fx_cmsplugin.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../lcms2-2.6/src/cmsplugin.c\"\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/src/fx_cmsps2.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../lcms2-2.6/src/cmsps2.c\"\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/src/fx_cmssamp.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../lcms2-2.6/src/cmssamp.c\"\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/src/fx_cmssm.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../lcms2-2.6/src/cmssm.c\"\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/src/fx_cmstypes.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../lcms2-2.6/src/cmstypes.c\"\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/src/fx_cmsvirt.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../lcms2-2.6/src/cmsvirt.c\"\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/src/fx_cmswtpnt.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../lcms2-2.6/src/cmswtpnt.c\"\n"
  },
  {
    "path": "core/src/fxcodec/lcms2/src/fx_cmsxform.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../lcms2-2.6/src/cmsxform.c\"\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/cderror.h",
    "content": "/*\n * cderror.h\n *\n * Copyright (C) 1994-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file defines the error and message codes for the cjpeg/djpeg\n * applications.  These strings are not needed as part of the JPEG library\n * proper.\n * Edit this file to add new codes, or to translate the message strings to\n * some other language.\n */\n\n/*\n * To define the enum list of message codes, include this file without\n * defining macro JMESSAGE.  To create a message string table, include it\n * again with a suitable JMESSAGE definition (see jerror.c for an example).\n */\n#ifndef JMESSAGE\n#ifndef CDERROR_H\n#define CDERROR_H\n/* First time through, define the enum list */\n#define JMAKE_ENUM_LIST\n#else\n/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */\n#define JMESSAGE(code,string)\n#endif /* CDERROR_H */\n#endif /* JMESSAGE */\n\n#ifdef JMAKE_ENUM_LIST\n\ntypedef enum {\n\n#define JMESSAGE(code,string)\tcode ,\n\n#endif /* JMAKE_ENUM_LIST */\n\nJMESSAGE(JMSG_FIRSTADDONCODE=1000, NULL) /* Must be first entry! */\n\n#ifdef BMP_SUPPORTED\nJMESSAGE(JERR_BMP_BADCMAP, \"Unsupported BMP colormap format\")\nJMESSAGE(JERR_BMP_BADDEPTH, \"Only 8- and 24-bit BMP files are supported\")\nJMESSAGE(JERR_BMP_BADHEADER, \"Invalid BMP file: bad header length\")\nJMESSAGE(JERR_BMP_BADPLANES, \"Invalid BMP file: biPlanes not equal to 1\")\nJMESSAGE(JERR_BMP_COLORSPACE, \"BMP output must be grayscale or RGB\")\nJMESSAGE(JERR_BMP_COMPRESSED, \"Sorry, compressed BMPs not yet supported\")\nJMESSAGE(JERR_BMP_NOT, \"Not a BMP file - does not start with BM\")\nJMESSAGE(JTRC_BMP, \"%ux%u 24-bit BMP image\")\nJMESSAGE(JTRC_BMP_MAPPED, \"%ux%u 8-bit colormapped BMP image\")\nJMESSAGE(JTRC_BMP_OS2, \"%ux%u 24-bit OS2 BMP image\")\nJMESSAGE(JTRC_BMP_OS2_MAPPED, \"%ux%u 8-bit colormapped OS2 BMP image\")\n#endif /* BMP_SUPPORTED */\n\n#ifdef GIF_SUPPORTED\nJMESSAGE(JERR_GIF_BUG, \"GIF output got confused\")\nJMESSAGE(JERR_GIF_CODESIZE, \"Bogus GIF codesize %d\")\nJMESSAGE(JERR_GIF_COLORSPACE, \"GIF output must be grayscale or RGB\")\nJMESSAGE(JERR_GIF_IMAGENOTFOUND, \"Too few images in GIF file\")\nJMESSAGE(JERR_GIF_NOT, \"Not a GIF file\")\nJMESSAGE(JTRC_GIF, \"%ux%ux%d GIF image\")\nJMESSAGE(JTRC_GIF_BADVERSION,\n\t \"Warning: unexpected GIF version number '%c%c%c'\")\nJMESSAGE(JTRC_GIF_EXTENSION, \"Ignoring GIF extension block of type 0x%02x\")\nJMESSAGE(JTRC_GIF_NONSQUARE, \"Caution: nonsquare pixels in input\")\nJMESSAGE(JWRN_GIF_BADDATA, \"Corrupt data in GIF file\")\nJMESSAGE(JWRN_GIF_CHAR, \"Bogus char 0x%02x in GIF file, ignoring\")\nJMESSAGE(JWRN_GIF_ENDCODE, \"Premature end of GIF image\")\nJMESSAGE(JWRN_GIF_NOMOREDATA, \"Ran out of GIF bits\")\n#endif /* GIF_SUPPORTED */\n\n#ifdef PPM_SUPPORTED\nJMESSAGE(JERR_PPM_COLORSPACE, \"PPM output must be grayscale or RGB\")\nJMESSAGE(JERR_PPM_NONNUMERIC, \"Nonnumeric data in PPM file\")\nJMESSAGE(JERR_PPM_NOT, \"Not a PPM/PGM file\")\nJMESSAGE(JTRC_PGM, \"%ux%u PGM image\")\nJMESSAGE(JTRC_PGM_TEXT, \"%ux%u text PGM image\")\nJMESSAGE(JTRC_PPM, \"%ux%u PPM image\")\nJMESSAGE(JTRC_PPM_TEXT, \"%ux%u text PPM image\")\n#endif /* PPM_SUPPORTED */\n\n#ifdef RLE_SUPPORTED\nJMESSAGE(JERR_RLE_BADERROR, \"Bogus error code from RLE library\")\nJMESSAGE(JERR_RLE_COLORSPACE, \"RLE output must be grayscale or RGB\")\nJMESSAGE(JERR_RLE_DIMENSIONS, \"Image dimensions (%ux%u) too large for RLE\")\nJMESSAGE(JERR_RLE_EMPTY, \"Empty RLE file\")\nJMESSAGE(JERR_RLE_EOF, \"Premature EOF in RLE header\")\nJMESSAGE(JERR_RLE_MEM, \"Insufficient memory for RLE header\")\nJMESSAGE(JERR_RLE_NOT, \"Not an RLE file\")\nJMESSAGE(JERR_RLE_TOOMANYCHANNELS, \"Cannot handle %d output channels for RLE\")\nJMESSAGE(JERR_RLE_UNSUPPORTED, \"Cannot handle this RLE setup\")\nJMESSAGE(JTRC_RLE, \"%ux%u full-color RLE file\")\nJMESSAGE(JTRC_RLE_FULLMAP, \"%ux%u full-color RLE file with map of length %d\")\nJMESSAGE(JTRC_RLE_GRAY, \"%ux%u grayscale RLE file\")\nJMESSAGE(JTRC_RLE_MAPGRAY, \"%ux%u grayscale RLE file with map of length %d\")\nJMESSAGE(JTRC_RLE_MAPPED, \"%ux%u colormapped RLE file with map of length %d\")\n#endif /* RLE_SUPPORTED */\n\n#ifdef TARGA_SUPPORTED\nJMESSAGE(JERR_TGA_BADCMAP, \"Unsupported Targa colormap format\")\nJMESSAGE(JERR_TGA_BADPARMS, \"Invalid or unsupported Targa file\")\nJMESSAGE(JERR_TGA_COLORSPACE, \"Targa output must be grayscale or RGB\")\nJMESSAGE(JTRC_TGA, \"%ux%u RGB Targa image\")\nJMESSAGE(JTRC_TGA_GRAY, \"%ux%u grayscale Targa image\")\nJMESSAGE(JTRC_TGA_MAPPED, \"%ux%u colormapped Targa image\")\n#else\nJMESSAGE(JERR_TGA_NOTCOMP, \"Targa support was not compiled\")\n#endif /* TARGA_SUPPORTED */\n\nJMESSAGE(JERR_BAD_CMAP_FILE,\n\t \"Color map file is invalid or of unsupported format\")\nJMESSAGE(JERR_TOO_MANY_COLORS,\n\t \"Output file format cannot handle %d colormap entries\")\nJMESSAGE(JERR_UNGETC_FAILED, \"ungetc failed\")\n#ifdef TARGA_SUPPORTED\nJMESSAGE(JERR_UNKNOWN_FORMAT,\n\t \"Unrecognized input file format --- perhaps you need -targa\")\n#else\nJMESSAGE(JERR_UNKNOWN_FORMAT, \"Unrecognized input file format\")\n#endif\nJMESSAGE(JERR_UNSUPPORTED_FORMAT, \"Unsupported output file format\")\n\n#ifdef JMAKE_ENUM_LIST\n\n  JMSG_LASTADDONCODE\n} ADDON_MESSAGE_CODE;\n\n#undef JMAKE_ENUM_LIST\n#endif /* JMAKE_ENUM_LIST */\n\n/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */\n#undef JMESSAGE\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/cdjpeg.h",
    "content": "/*\n * cdjpeg.h\n *\n * Copyright (C) 1994-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains common declarations for the sample applications\n * cjpeg and djpeg.  It is NOT used by the core JPEG library.\n */\n\n#define JPEG_CJPEG_DJPEG\t/* define proper options in jconfig.h */\n#define JPEG_INTERNAL_OPTIONS\t/* cjpeg.c,djpeg.c need to see xxx_SUPPORTED */\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jerror.h\"\t\t/* get library error codes too */\n#include \"cderror.h\"\t\t/* get application-specific error codes */\n\n\n/*\n * Object interface for cjpeg's source file decoding modules\n */\n\ntypedef struct cjpeg_source_struct * cjpeg_source_ptr;\n\nstruct cjpeg_source_struct {\n  JMETHOD(void, start_input, (j_compress_ptr cinfo,\n\t\t\t      cjpeg_source_ptr sinfo));\n  JMETHOD(JDIMENSION, get_pixel_rows, (j_compress_ptr cinfo,\n\t\t\t\t       cjpeg_source_ptr sinfo));\n  JMETHOD(void, finish_input, (j_compress_ptr cinfo,\n\t\t\t       cjpeg_source_ptr sinfo));\n\n  FXSYS_FILE *input_file;\n\n  JSAMPARRAY buffer;\n  JDIMENSION buffer_height;\n};\n\n\n/*\n * Object interface for djpeg's output file encoding modules\n */\n\ntypedef struct djpeg_dest_struct * djpeg_dest_ptr;\n\nstruct djpeg_dest_struct {\n  /* start_output is called after jpeg_start_decompress finishes.\n   * The color map will be ready at this time, if one is needed.\n   */\n  JMETHOD(void, start_output, (j_decompress_ptr cinfo,\n\t\t\t       djpeg_dest_ptr dinfo));\n  /* Emit the specified number of pixel rows from the buffer. */\n  JMETHOD(void, put_pixel_rows, (j_decompress_ptr cinfo,\n\t\t\t\t djpeg_dest_ptr dinfo,\n\t\t\t\t JDIMENSION rows_supplied));\n  /* Finish up at the end of the image. */\n  JMETHOD(void, finish_output, (j_decompress_ptr cinfo,\n\t\t\t\tdjpeg_dest_ptr dinfo));\n\n  /* Target file spec; filled in by djpeg.c after object is created. */\n  FXSYS_FILE * output_file;\n\n  /* Output pixel-row buffer.  Created by module init or start_output.\n   * Width is cinfo->output_width * cinfo->output_components;\n   * height is buffer_height.\n   */\n  JSAMPARRAY buffer;\n  JDIMENSION buffer_height;\n};\n\n\n/*\n * cjpeg/djpeg may need to perform extra passes to convert to or from\n * the source/destination file format.  The JPEG library does not know\n * about these passes, but we'd like them to be counted by the progress\n * monitor.  We use an expanded progress monitor object to hold the\n * additional pass count.\n */\n\nstruct cdjpeg_progress_mgr {\n  struct jpeg_progress_mgr pub;\t/* fields known to JPEG library */\n  int completed_extra_passes;\t/* extra passes completed */\n  int total_extra_passes;\t/* total extra */\n  /* last printed percentage stored here to avoid multiple printouts */\n  int percent_done;\n};\n\ntypedef struct cdjpeg_progress_mgr * cd_progress_ptr;\n\n\n/* Short forms of external names for systems with brain-damaged linkers. */\n\n#ifdef NEED_SHORT_EXTERNAL_NAMES\n#define jinit_read_bmp\t\tjIRdBMP\n#define jinit_write_bmp\t\tjIWrBMP\n#define jinit_read_gif\t\tjIRdGIF\n#define jinit_write_gif\t\tjIWrGIF\n#define jinit_read_ppm\t\tjIRdPPM\n#define jinit_write_ppm\t\tjIWrPPM\n#define jinit_read_rle\t\tjIRdRLE\n#define jinit_write_rle\t\tjIWrRLE\n#define jinit_read_targa\tjIRdTarga\n#define jinit_write_targa\tjIWrTarga\n#define read_quant_tables\tRdQTables\n#define read_scan_script\tRdScnScript\n#define set_quant_slots\t\tSetQSlots\n#define set_sample_factors\tSetSFacts\n#define read_color_map\t\tRdCMap\n#define enable_signal_catcher\tEnSigCatcher\n#define start_progress_monitor\tStProgMon\n#define end_progress_monitor\tEnProgMon\n#define read_stdin\t\tRdStdin\n#define write_stdout\t\tWrStdout\n#endif /* NEED_SHORT_EXTERNAL_NAMES */\n\n/* Module selection routines for I/O modules. */\n\nEXTERN(cjpeg_source_ptr) jinit_read_bmp JPP((j_compress_ptr cinfo));\nEXTERN(djpeg_dest_ptr) jinit_write_bmp JPP((j_decompress_ptr cinfo,\n\t\t\t\t\t    boolean is_os2));\nEXTERN(cjpeg_source_ptr) jinit_read_gif JPP((j_compress_ptr cinfo));\nEXTERN(djpeg_dest_ptr) jinit_write_gif JPP((j_decompress_ptr cinfo));\nEXTERN(cjpeg_source_ptr) jinit_read_ppm JPP((j_compress_ptr cinfo));\nEXTERN(djpeg_dest_ptr) jinit_write_ppm JPP((j_decompress_ptr cinfo));\nEXTERN(cjpeg_source_ptr) jinit_read_rle JPP((j_compress_ptr cinfo));\nEXTERN(djpeg_dest_ptr) jinit_write_rle JPP((j_decompress_ptr cinfo));\nEXTERN(cjpeg_source_ptr) jinit_read_targa JPP((j_compress_ptr cinfo));\nEXTERN(djpeg_dest_ptr) jinit_write_targa JPP((j_decompress_ptr cinfo));\n\n/* cjpeg support routines (in rdswitch.c) */\n\nEXTERN(boolean) read_quant_tables JPP((j_compress_ptr cinfo, char * filename,\n\t\t\t\t    int scale_factor, boolean force_baseline));\nEXTERN(boolean) read_scan_script JPP((j_compress_ptr cinfo, char * filename));\nEXTERN(boolean) set_quant_slots JPP((j_compress_ptr cinfo, char *arg));\nEXTERN(boolean) set_sample_factors JPP((j_compress_ptr cinfo, char *arg));\n\n/* djpeg support routines (in rdcolmap.c) */\n\nEXTERN(void) read_color_map JPP((j_decompress_ptr cinfo, FXSYS_FILE * infile));\n\n/* common support routines (in cdjpeg.c) */\n\nEXTERN(void) enable_signal_catcher JPP((j_common_ptr cinfo));\nEXTERN(void) start_progress_monitor JPP((j_common_ptr cinfo,\n\t\t\t\t\t cd_progress_ptr progress));\nEXTERN(void) end_progress_monitor JPP((j_common_ptr cinfo));\nEXTERN(boolean) keymatch JPP((char * arg, const char * keyword, int minchars));\nEXTERN(FXSYS_FILE *) read_stdin JPP((void));\nEXTERN(FXSYS_FILE *) write_stdout JPP((void));\n\n/* miscellaneous useful macros */\n\n#ifdef DONT_USE_B_MODE\t\t/* define mode parameters for fopen() */\n#define READ_BINARY\t\"r\"\n#define WRITE_BINARY\t\"w\"\n#else\n#ifdef VMS\t\t\t/* VMS is very nonstandard */\n#define READ_BINARY\t\"rb\", \"ctx=stm\"\n#define WRITE_BINARY\t\"wb\", \"ctx=stm\"\n#else\t\t\t\t/* standard ANSI-compliant case */\n#define READ_BINARY\t\"rb\"\n#define WRITE_BINARY\t\"wb\"\n#endif\n#endif\n\n#ifndef EXIT_FAILURE\t\t/* define exit() codes if not provided */\n#define EXIT_FAILURE  1\n#endif\n#ifndef EXIT_SUCCESS\n#ifdef VMS\n#define EXIT_SUCCESS  1\t\t/* VMS is very nonstandard */\n#else\n#define EXIT_SUCCESS  0\n#endif\n#endif\n#ifndef EXIT_WARNING\n#ifdef VMS\n#define EXIT_WARNING  1\t\t/* VMS is very nonstandard */\n#else\n#define EXIT_WARNING  2\n#endif\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jcapimin.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jcapimin.c\n *\n * Copyright (C) 1994-1998, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains application interface code for the compression half\n * of the JPEG library.  These are the \"minimum\" API routines that may be\n * needed in either the normal full-compression case or the transcoding-only\n * case.\n *\n * Most of the routines intended to be called directly by an application\n * are in this file or in jcapistd.c.  But also see jcparam.c for\n * parameter-setup helper routines, jcomapi.c for routines shared by\n * compression and decompression, and jctrans.c for the transcoding case.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/*\n * Initialization of a JPEG compression object.\n * The error manager must already be set up (in case memory manager fails).\n */\n\nGLOBAL(void)\njpeg_CreateCompress (j_compress_ptr cinfo, int version, size_t structsize)\n{\n  int i;\n\n  /* Guard against version mismatches between library and caller. */\n  cinfo->mem = NULL;\t\t/* so jpeg_destroy knows mem mgr not called */\n  if (version != JPEG_LIB_VERSION)\n    ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version);\n  if (structsize != SIZEOF(struct jpeg_compress_struct))\n    ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE, \n\t     (int) SIZEOF(struct jpeg_compress_struct), (int) structsize);\n\n  /* For debugging purposes, we zero the whole master structure.\n   * But the application has already set the err pointer, and may have set\n   * client_data, so we have to save and restore those fields.\n   * Note: if application hasn't set client_data, tools like Purify may\n   * complain here.\n   */\n  {\n    struct jpeg_error_mgr * err = cinfo->err;\n    void * client_data = cinfo->client_data; /* ignore Purify complaint here */\n    MEMZERO(cinfo, SIZEOF(struct jpeg_compress_struct));\n    cinfo->err = err;\n    cinfo->client_data = client_data;\n  }\n  cinfo->is_decompressor = FALSE;\n\n  /* Initialize a memory manager instance for this object */\n  jinit_memory_mgr((j_common_ptr) cinfo);\n\n  /* Zero out pointers to permanent structures. */\n  cinfo->progress = NULL;\n  cinfo->dest = NULL;\n\n  cinfo->comp_info = NULL;\n\n  for (i = 0; i < NUM_QUANT_TBLS; i++)\n    cinfo->quant_tbl_ptrs[i] = NULL;\n\n  for (i = 0; i < NUM_HUFF_TBLS; i++) {\n    cinfo->dc_huff_tbl_ptrs[i] = NULL;\n    cinfo->ac_huff_tbl_ptrs[i] = NULL;\n  }\n\n  cinfo->script_space = NULL;\n\n  cinfo->input_gamma = 1.0;\t/* in case application forgets */\n\n  /* OK, I'm ready */\n  cinfo->global_state = CSTATE_START;\n}\n\n\n/*\n * Destruction of a JPEG compression object\n */\n\nGLOBAL(void)\njpeg_destroy_compress (j_compress_ptr cinfo)\n{\n  jpeg_destroy((j_common_ptr) cinfo); /* use common routine */\n}\n\n\n/*\n * Abort processing of a JPEG compression operation,\n * but don't destroy the object itself.\n */\n\nGLOBAL(void)\njpeg_abort_compress (j_compress_ptr cinfo)\n{\n  jpeg_abort((j_common_ptr) cinfo); /* use common routine */\n}\n\n\n/*\n * Forcibly suppress or un-suppress all quantization and Huffman tables.\n * Marks all currently defined tables as already written (if suppress)\n * or not written (if !suppress).  This will control whether they get emitted\n * by a subsequent jpeg_start_compress call.\n *\n * This routine is exported for use by applications that want to produce\n * abbreviated JPEG datastreams.  It logically belongs in jcparam.c, but\n * since it is called by jpeg_start_compress, we put it here --- otherwise\n * jcparam.o would be linked whether the application used it or not.\n */\n\nGLOBAL(void)\njpeg_suppress_tables (j_compress_ptr cinfo, boolean suppress)\n{\n  int i;\n  JQUANT_TBL * qtbl;\n  JHUFF_TBL * htbl;\n\n  for (i = 0; i < NUM_QUANT_TBLS; i++) {\n    if ((qtbl = cinfo->quant_tbl_ptrs[i]) != NULL)\n      qtbl->sent_table = suppress;\n  }\n\n  for (i = 0; i < NUM_HUFF_TBLS; i++) {\n    if ((htbl = cinfo->dc_huff_tbl_ptrs[i]) != NULL)\n      htbl->sent_table = suppress;\n    if ((htbl = cinfo->ac_huff_tbl_ptrs[i]) != NULL)\n      htbl->sent_table = suppress;\n  }\n}\n\n\n/*\n * Finish JPEG compression.\n *\n * If a multipass operating mode was selected, this may do a great deal of\n * work including most of the actual output.\n */\n\nGLOBAL(void)\njpeg_finish_compress (j_compress_ptr cinfo)\n{\n  JDIMENSION iMCU_row;\n\n  if (cinfo->global_state == CSTATE_SCANNING ||\n      cinfo->global_state == CSTATE_RAW_OK) {\n    /* Terminate first pass */\n    if (cinfo->next_scanline < cinfo->image_height)\n      ERREXIT(cinfo, JERR_TOO_LITTLE_DATA);\n    (*cinfo->master->finish_pass) (cinfo);\n  } else if (cinfo->global_state != CSTATE_WRCOEFS)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  /* Perform any remaining passes */\n  while (! cinfo->master->is_last_pass) {\n    (*cinfo->master->prepare_for_pass) (cinfo);\n    for (iMCU_row = 0; iMCU_row < cinfo->total_iMCU_rows; iMCU_row++) {\n      if (cinfo->progress != NULL) {\n\tcinfo->progress->pass_counter = (long) iMCU_row;\n\tcinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows;\n\t(*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);\n      }\n      /* We bypass the main controller and invoke coef controller directly;\n       * all work is being done from the coefficient buffer.\n       */\n      if (! (*cinfo->coef->compress_data) (cinfo, (JSAMPIMAGE) NULL))\n\tERREXIT(cinfo, JERR_CANT_SUSPEND);\n    }\n    (*cinfo->master->finish_pass) (cinfo);\n  }\n  /* Write EOI, do final cleanup */\n  (*cinfo->marker->write_file_trailer) (cinfo);\n  (*cinfo->dest->term_destination) (cinfo);\n  /* We can use jpeg_abort to release memory and reset global_state */\n  jpeg_abort((j_common_ptr) cinfo);\n}\n\n\n/*\n * Write a special marker.\n * This is only recommended for writing COM or APPn markers.\n * Must be called after jpeg_start_compress() and before\n * first call to jpeg_write_scanlines() or jpeg_write_raw_data().\n */\n\nGLOBAL(void)\njpeg_write_marker (j_compress_ptr cinfo, int marker,\n\t\t   const JOCTET *dataptr, unsigned int datalen)\n{\n  JMETHOD(void, write_marker_byte, (j_compress_ptr info, int val));\n\n  if (cinfo->next_scanline != 0 ||\n      (cinfo->global_state != CSTATE_SCANNING &&\n       cinfo->global_state != CSTATE_RAW_OK &&\n       cinfo->global_state != CSTATE_WRCOEFS))\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n\n  (*cinfo->marker->write_marker_header) (cinfo, marker, datalen);\n  write_marker_byte = cinfo->marker->write_marker_byte;\t/* copy for speed */\n  while (datalen--) {\n    (*write_marker_byte) (cinfo, *dataptr);\n    dataptr++;\n  }\n}\n\n/* Same, but piecemeal. */\n\nGLOBAL(void)\njpeg_write_m_header (j_compress_ptr cinfo, int marker, unsigned int datalen)\n{\n  if (cinfo->next_scanline != 0 ||\n      (cinfo->global_state != CSTATE_SCANNING &&\n       cinfo->global_state != CSTATE_RAW_OK &&\n       cinfo->global_state != CSTATE_WRCOEFS))\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n\n  (*cinfo->marker->write_marker_header) (cinfo, marker, datalen);\n}\n\nGLOBAL(void)\njpeg_write_m_byte (j_compress_ptr cinfo, int val)\n{\n  (*cinfo->marker->write_marker_byte) (cinfo, val);\n}\n\n\n/*\n * Alternate compression function: just write an abbreviated table file.\n * Before calling this, all parameters and a data destination must be set up.\n *\n * To produce a pair of files containing abbreviated tables and abbreviated\n * image data, one would proceed as follows:\n *\n *\t\tinitialize JPEG object\n *\t\tset JPEG parameters\n *\t\tset destination to table file\n *\t\tjpeg_write_tables(cinfo);\n *\t\tset destination to image file\n *\t\tjpeg_start_compress(cinfo, FALSE);\n *\t\twrite data...\n *\t\tjpeg_finish_compress(cinfo);\n *\n * jpeg_write_tables has the side effect of marking all tables written\n * (same as jpeg_suppress_tables(..., TRUE)).  Thus a subsequent start_compress\n * will not re-emit the tables unless it is passed write_all_tables=TRUE.\n */\n\nGLOBAL(void)\njpeg_write_tables (j_compress_ptr cinfo)\n{\n  if (cinfo->global_state != CSTATE_START)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n\n  /* (Re)initialize error mgr and destination modules */\n  (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);\n  (*cinfo->dest->init_destination) (cinfo);\n  /* Initialize the marker writer ... bit of a crock to do it here. */\n  jinit_marker_writer(cinfo);\n  /* Write them tables! */\n  (*cinfo->marker->write_tables_only) (cinfo);\n  /* And clean up. */\n  (*cinfo->dest->term_destination) (cinfo);\n  /*\n   * In library releases up through v6a, we called jpeg_abort() here to free\n   * any working memory allocated by the destination manager and marker\n   * writer.  Some applications had a problem with that: they allocated space\n   * of their own from the library memory manager, and didn't want it to go\n   * away during write_tables.  So now we do nothing.  This will cause a\n   * memory leak if an app calls write_tables repeatedly without doing a full\n   * compression cycle or otherwise resetting the JPEG object.  However, that\n   * seems less bad than unexpectedly freeing memory in the normal case.\n   * An app that prefers the old behavior can call jpeg_abort for itself after\n   * each call to jpeg_write_tables().\n   */\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jcapistd.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jcapistd.c\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains application interface code for the compression half\n * of the JPEG library.  These are the \"standard\" API routines that are\n * used in the normal full-compression case.  They are not used by a\n * transcoding-only application.  Note that if an application links in\n * jpeg_start_compress, it will end up linking in the entire compressor.\n * We thus must separate this file from jcapimin.c to avoid linking the\n * whole compression library into a transcoder.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/*\n * Compression initialization.\n * Before calling this, all parameters and a data destination must be set up.\n *\n * We require a write_all_tables parameter as a failsafe check when writing\n * multiple datastreams from the same compression object.  Since prior runs\n * will have left all the tables marked sent_table=TRUE, a subsequent run\n * would emit an abbreviated stream (no tables) by default.  This may be what\n * is wanted, but for safety's sake it should not be the default behavior:\n * programmers should have to make a deliberate choice to emit abbreviated\n * images.  Therefore the documentation and examples should encourage people\n * to pass write_all_tables=TRUE; then it will take active thought to do the\n * wrong thing.\n */\n\nGLOBAL(void)\njpeg_start_compress (j_compress_ptr cinfo, boolean write_all_tables)\n{\n  if (cinfo->global_state != CSTATE_START)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n\n  if (write_all_tables)\n    jpeg_suppress_tables(cinfo, FALSE);\t/* mark all tables to be written */\n\n  /* (Re)initialize error mgr and destination modules */\n  (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);\n  (*cinfo->dest->init_destination) (cinfo);\n  /* Perform master selection of active modules */\n  jinit_compress_master(cinfo);\n  /* Set up for the first pass */\n  (*cinfo->master->prepare_for_pass) (cinfo);\n  /* Ready for application to drive first pass through jpeg_write_scanlines\n   * or jpeg_write_raw_data.\n   */\n  cinfo->next_scanline = 0;\n  cinfo->global_state = (cinfo->raw_data_in ? CSTATE_RAW_OK : CSTATE_SCANNING);\n}\n\n\n/*\n * Write some scanlines of data to the JPEG compressor.\n *\n * The return value will be the number of lines actually written.\n * This should be less than the supplied num_lines only in case that\n * the data destination module has requested suspension of the compressor,\n * or if more than image_height scanlines are passed in.\n *\n * Note: we warn about excess calls to jpeg_write_scanlines() since\n * this likely signals an application programmer error.  However,\n * excess scanlines passed in the last valid call are *silently* ignored,\n * so that the application need not adjust num_lines for end-of-image\n * when using a multiple-scanline buffer.\n */\n\nGLOBAL(JDIMENSION)\njpeg_write_scanlines (j_compress_ptr cinfo, JSAMPARRAY scanlines,\n\t\t      JDIMENSION num_lines)\n{\n  JDIMENSION row_ctr, rows_left;\n\n  if (cinfo->global_state != CSTATE_SCANNING)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  if (cinfo->next_scanline >= cinfo->image_height)\n    WARNMS(cinfo, JWRN_TOO_MUCH_DATA);\n\n  /* Call progress monitor hook if present */\n  if (cinfo->progress != NULL) {\n    cinfo->progress->pass_counter = (long) cinfo->next_scanline;\n    cinfo->progress->pass_limit = (long) cinfo->image_height;\n    (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);\n  }\n\n  /* Give master control module another chance if this is first call to\n   * jpeg_write_scanlines.  This lets output of the frame/scan headers be\n   * delayed so that application can write COM, etc, markers between\n   * jpeg_start_compress and jpeg_write_scanlines.\n   */\n  if (cinfo->master->call_pass_startup)\n    (*cinfo->master->pass_startup) (cinfo);\n\n  /* Ignore any extra scanlines at bottom of image. */\n  rows_left = cinfo->image_height - cinfo->next_scanline;\n  if (num_lines > rows_left)\n    num_lines = rows_left;\n\n  row_ctr = 0;\n  (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, num_lines);\n  cinfo->next_scanline += row_ctr;\n  return row_ctr;\n}\n\n\n/*\n * Alternate entry point to write raw data.\n * Processes exactly one iMCU row per call, unless suspended.\n */\n\nGLOBAL(JDIMENSION)\njpeg_write_raw_data (j_compress_ptr cinfo, JSAMPIMAGE data,\n\t\t     JDIMENSION num_lines)\n{\n  JDIMENSION lines_per_iMCU_row;\n\n  if (cinfo->global_state != CSTATE_RAW_OK)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  if (cinfo->next_scanline >= cinfo->image_height) {\n    WARNMS(cinfo, JWRN_TOO_MUCH_DATA);\n    return 0;\n  }\n\n  /* Call progress monitor hook if present */\n  if (cinfo->progress != NULL) {\n    cinfo->progress->pass_counter = (long) cinfo->next_scanline;\n    cinfo->progress->pass_limit = (long) cinfo->image_height;\n    (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);\n  }\n\n  /* Give master control module another chance if this is first call to\n   * jpeg_write_raw_data.  This lets output of the frame/scan headers be\n   * delayed so that application can write COM, etc, markers between\n   * jpeg_start_compress and jpeg_write_raw_data.\n   */\n  if (cinfo->master->call_pass_startup)\n    (*cinfo->master->pass_startup) (cinfo);\n\n  /* Verify that at least one iMCU row has been passed. */\n  lines_per_iMCU_row = cinfo->max_v_samp_factor * DCTSIZE;\n  if (num_lines < lines_per_iMCU_row)\n    ERREXIT(cinfo, JERR_BUFFER_SIZE);\n\n  /* Directly compress the row. */\n  if (! (*cinfo->coef->compress_data) (cinfo, data)) {\n    /* If compressor did not consume the whole row, suspend processing. */\n    return 0;\n  }\n\n  /* OK, we processed one iMCU row. */\n  cinfo->next_scanline += lines_per_iMCU_row;\n  return lines_per_iMCU_row;\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jccoefct.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jccoefct.c\n *\n * Copyright (C) 1994-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains the coefficient buffer controller for compression.\n * This controller is the top level of the JPEG compressor proper.\n * The coefficient buffer lies between forward-DCT and entropy encoding steps.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* We use a full-image coefficient buffer when doing Huffman optimization,\n * and also for writing multiple-scan JPEG files.  In all cases, the DCT\n * step is run during the first pass, and subsequent passes need only read\n * the buffered coefficients.\n */\n#ifdef ENTROPY_OPT_SUPPORTED\n#define FULL_COEF_BUFFER_SUPPORTED\n#else\n#ifdef C_MULTISCAN_FILES_SUPPORTED\n#define FULL_COEF_BUFFER_SUPPORTED\n#endif\n#endif\n\n\n/* Private buffer controller object */\n\ntypedef struct {\n  struct jpeg_c_coef_controller pub; /* public fields */\n\n  JDIMENSION iMCU_row_num;\t/* iMCU row # within image */\n  JDIMENSION mcu_ctr;\t\t/* counts MCUs processed in current row */\n  int MCU_vert_offset;\t\t/* counts MCU rows within iMCU row */\n  int MCU_rows_per_iMCU_row;\t/* number of such rows needed */\n\n  /* For single-pass compression, it's sufficient to buffer just one MCU\n   * (although this may prove a bit slow in practice).  We allocate a\n   * workspace of C_MAX_BLOCKS_IN_MCU coefficient blocks, and reuse it for each\n   * MCU constructed and sent.  (On 80x86, the workspace is FAR even though\n   * it's not really very big; this is to keep the module interfaces unchanged\n   * when a large coefficient buffer is necessary.)\n   * In multi-pass modes, this array points to the current MCU's blocks\n   * within the virtual arrays.\n   */\n  JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU];\n\n  /* In multi-pass modes, we need a virtual block array for each component. */\n  jvirt_barray_ptr whole_image[MAX_COMPONENTS];\n} my_coef_controller;\n\ntypedef my_coef_controller * my_coef_ptr;\n\n\n/* Forward declarations */\nMETHODDEF(boolean) compress_data\n    JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));\n#ifdef FULL_COEF_BUFFER_SUPPORTED\nMETHODDEF(boolean) compress_first_pass\n    JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));\nMETHODDEF(boolean) compress_output\n    JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));\n#endif\n\n\nLOCAL(void)\nstart_iMCU_row (j_compress_ptr cinfo)\n/* Reset within-iMCU-row counters for a new row */\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n\n  /* In an interleaved scan, an MCU row is the same as an iMCU row.\n   * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.\n   * But at the bottom of the image, process only what's left.\n   */\n  if (cinfo->comps_in_scan > 1) {\n    coef->MCU_rows_per_iMCU_row = 1;\n  } else {\n    if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1))\n      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;\n    else\n      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;\n  }\n\n  coef->mcu_ctr = 0;\n  coef->MCU_vert_offset = 0;\n}\n\n\n/*\n * Initialize for a processing pass.\n */\n\nMETHODDEF(void)\nstart_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode)\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n\n  coef->iMCU_row_num = 0;\n  start_iMCU_row(cinfo);\n\n  switch (pass_mode) {\n  case JBUF_PASS_THRU:\n    if (coef->whole_image[0] != NULL)\n      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n    coef->pub.compress_data = compress_data;\n    break;\n#ifdef FULL_COEF_BUFFER_SUPPORTED\n  case JBUF_SAVE_AND_PASS:\n    if (coef->whole_image[0] == NULL)\n      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n    coef->pub.compress_data = compress_first_pass;\n    break;\n  case JBUF_CRANK_DEST:\n    if (coef->whole_image[0] == NULL)\n      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n    coef->pub.compress_data = compress_output;\n    break;\n#endif\n  default:\n    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n    break;\n  }\n}\n\n\n/*\n * Process some data in the single-pass case.\n * We process the equivalent of one fully interleaved MCU row (\"iMCU\" row)\n * per call, ie, v_samp_factor block rows for each component in the image.\n * Returns TRUE if the iMCU row is completed, FALSE if suspended.\n *\n * NB: input_buf contains a plane for each component in image,\n * which we index according to the component's SOF position.\n */\n\nMETHODDEF(boolean)\ncompress_data (j_compress_ptr cinfo, JSAMPIMAGE input_buf)\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n  JDIMENSION MCU_col_num;\t/* index of current MCU within row */\n  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;\n  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;\n  int blkn, bi, ci, yindex, yoffset, blockcnt;\n  JDIMENSION ypos, xpos;\n  jpeg_component_info *compptr;\n\n  /* Loop to write as much as one whole iMCU row */\n  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;\n       yoffset++) {\n    for (MCU_col_num = coef->mcu_ctr; MCU_col_num <= last_MCU_col;\n\t MCU_col_num++) {\n      /* Determine where data comes from in input_buf and do the DCT thing.\n       * Each call on forward_DCT processes a horizontal row of DCT blocks\n       * as wide as an MCU; we rely on having allocated the MCU_buffer[] blocks\n       * sequentially.  Dummy blocks at the right or bottom edge are filled in\n       * specially.  The data in them does not matter for image reconstruction,\n       * so we fill them with values that will encode to the smallest amount of\n       * data, viz: all zeroes in the AC entries, DC entries equal to previous\n       * block's DC value.  (Thanks to Thomas Kinsman for this idea.)\n       */\n      blkn = 0;\n      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n\tcompptr = cinfo->cur_comp_info[ci];\n\tblockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width\n\t\t\t\t\t\t: compptr->last_col_width;\n\txpos = MCU_col_num * compptr->MCU_sample_width;\n\typos = yoffset * DCTSIZE; /* ypos == (yoffset+yindex) * DCTSIZE */\n\tfor (yindex = 0; yindex < compptr->MCU_height; yindex++) {\n\t  if (coef->iMCU_row_num < last_iMCU_row ||\n\t      yoffset+yindex < compptr->last_row_height) {\n\t    (*cinfo->fdct->forward_DCT) (cinfo, compptr,\n\t\t\t\t\t input_buf[compptr->component_index],\n\t\t\t\t\t coef->MCU_buffer[blkn],\n\t\t\t\t\t ypos, xpos, (JDIMENSION) blockcnt);\n\t    if (blockcnt < compptr->MCU_width) {\n\t      /* Create some dummy blocks at the right edge of the image. */\n\t      jzero_far((void FAR *) coef->MCU_buffer[blkn + blockcnt],\n\t\t\t(compptr->MCU_width - blockcnt) * SIZEOF(JBLOCK));\n\t      for (bi = blockcnt; bi < compptr->MCU_width; bi++) {\n\t\tcoef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn+bi-1][0][0];\n\t      }\n\t    }\n\t  } else {\n\t    /* Create a row of dummy blocks at the bottom of the image. */\n\t    jzero_far((void FAR *) coef->MCU_buffer[blkn],\n\t\t      compptr->MCU_width * SIZEOF(JBLOCK));\n\t    for (bi = 0; bi < compptr->MCU_width; bi++) {\n\t      coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn-1][0][0];\n\t    }\n\t  }\n\t  blkn += compptr->MCU_width;\n\t  ypos += DCTSIZE;\n\t}\n      }\n      /* Try to write the MCU.  In event of a suspension failure, we will\n       * re-DCT the MCU on restart (a bit inefficient, could be fixed...)\n       */\n      if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) {\n\t/* Suspension forced; update state counters and exit */\n\tcoef->MCU_vert_offset = yoffset;\n\tcoef->mcu_ctr = MCU_col_num;\n\treturn FALSE;\n      }\n    }\n    /* Completed an MCU row, but perhaps not an iMCU row */\n    coef->mcu_ctr = 0;\n  }\n  /* Completed the iMCU row, advance counters for next one */\n  coef->iMCU_row_num++;\n  start_iMCU_row(cinfo);\n  return TRUE;\n}\n\n\n#ifdef FULL_COEF_BUFFER_SUPPORTED\n\n/*\n * Process some data in the first pass of a multi-pass case.\n * We process the equivalent of one fully interleaved MCU row (\"iMCU\" row)\n * per call, ie, v_samp_factor block rows for each component in the image.\n * This amount of data is read from the source buffer, DCT'd and quantized,\n * and saved into the virtual arrays.  We also generate suitable dummy blocks\n * as needed at the right and lower edges.  (The dummy blocks are constructed\n * in the virtual arrays, which have been padded appropriately.)  This makes\n * it possible for subsequent passes not to worry about real vs. dummy blocks.\n *\n * We must also emit the data to the entropy encoder.  This is conveniently\n * done by calling compress_output() after we've loaded the current strip\n * of the virtual arrays.\n *\n * NB: input_buf contains a plane for each component in image.  All\n * components are DCT'd and loaded into the virtual arrays in this pass.\n * However, it may be that only a subset of the components are emitted to\n * the entropy encoder during this first pass; be careful about looking\n * at the scan-dependent variables (MCU dimensions, etc).\n */\n\nMETHODDEF(boolean)\ncompress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf)\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;\n  JDIMENSION blocks_across, MCUs_across, MCUindex;\n  int bi, ci, h_samp_factor, block_row, block_rows, ndummy;\n  JCOEF lastDC;\n  jpeg_component_info *compptr;\n  JBLOCKARRAY buffer;\n  JBLOCKROW thisblockrow, lastblockrow;\n\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    /* Align the virtual buffer for this component. */\n    buffer = (*cinfo->mem->access_virt_barray)\n      ((j_common_ptr) cinfo, coef->whole_image[ci],\n       coef->iMCU_row_num * compptr->v_samp_factor,\n       (JDIMENSION) compptr->v_samp_factor, TRUE);\n    /* Count non-dummy DCT block rows in this iMCU row. */\n    if (coef->iMCU_row_num < last_iMCU_row)\n      block_rows = compptr->v_samp_factor;\n    else {\n      /* NB: can't use last_row_height here, since may not be set! */\n      block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);\n      if (block_rows == 0) block_rows = compptr->v_samp_factor;\n    }\n    blocks_across = compptr->width_in_blocks;\n    h_samp_factor = compptr->h_samp_factor;\n    /* Count number of dummy blocks to be added at the right margin. */\n    ndummy = (int) (blocks_across % h_samp_factor);\n    if (ndummy > 0)\n      ndummy = h_samp_factor - ndummy;\n    /* Perform DCT for all non-dummy blocks in this iMCU row.  Each call\n     * on forward_DCT processes a complete horizontal row of DCT blocks.\n     */\n    for (block_row = 0; block_row < block_rows; block_row++) {\n      thisblockrow = buffer[block_row];\n      (*cinfo->fdct->forward_DCT) (cinfo, compptr,\n\t\t\t\t   input_buf[ci], thisblockrow,\n\t\t\t\t   (JDIMENSION) (block_row * DCTSIZE),\n\t\t\t\t   (JDIMENSION) 0, blocks_across);\n      if (ndummy > 0) {\n\t/* Create dummy blocks at the right edge of the image. */\n\tthisblockrow += blocks_across; /* => first dummy block */\n\tjzero_far((void FAR *) thisblockrow, ndummy * SIZEOF(JBLOCK));\n\tlastDC = thisblockrow[-1][0];\n\tfor (bi = 0; bi < ndummy; bi++) {\n\t  thisblockrow[bi][0] = lastDC;\n\t}\n      }\n    }\n    /* If at end of image, create dummy block rows as needed.\n     * The tricky part here is that within each MCU, we want the DC values\n     * of the dummy blocks to match the last real block's DC value.\n     * This squeezes a few more bytes out of the resulting file...\n     */\n    if (coef->iMCU_row_num == last_iMCU_row) {\n      blocks_across += ndummy;\t/* include lower right corner */\n      MCUs_across = blocks_across / h_samp_factor;\n      for (block_row = block_rows; block_row < compptr->v_samp_factor;\n\t   block_row++) {\n\tthisblockrow = buffer[block_row];\n\tlastblockrow = buffer[block_row-1];\n\tjzero_far((void FAR *) thisblockrow,\n\t\t  (size_t) (blocks_across * SIZEOF(JBLOCK)));\n\tfor (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) {\n\t  lastDC = lastblockrow[h_samp_factor-1][0];\n\t  for (bi = 0; bi < h_samp_factor; bi++) {\n\t    thisblockrow[bi][0] = lastDC;\n\t  }\n\t  thisblockrow += h_samp_factor; /* advance to next MCU in row */\n\t  lastblockrow += h_samp_factor;\n\t}\n      }\n    }\n  }\n  /* NB: compress_output will increment iMCU_row_num if successful.\n   * A suspension return will result in redoing all the work above next time.\n   */\n\n  /* Emit data to the entropy encoder, sharing code with subsequent passes */\n  return compress_output(cinfo, input_buf);\n}\n\n\n/*\n * Process some data in subsequent passes of a multi-pass case.\n * We process the equivalent of one fully interleaved MCU row (\"iMCU\" row)\n * per call, ie, v_samp_factor block rows for each component in the scan.\n * The data is obtained from the virtual arrays and fed to the entropy coder.\n * Returns TRUE if the iMCU row is completed, FALSE if suspended.\n *\n * NB: input_buf is ignored; it is likely to be a NULL pointer.\n */\n\nMETHODDEF(boolean)\ncompress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf)\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n  JDIMENSION MCU_col_num;\t/* index of current MCU within row */\n  int blkn, ci, xindex, yindex, yoffset;\n  JDIMENSION start_col;\n  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];\n  JBLOCKROW buffer_ptr;\n  jpeg_component_info *compptr;\n\n  /* Align the virtual buffers for the components used in this scan.\n   * NB: during first pass, this is safe only because the buffers will\n   * already be aligned properly, so jmemmgr.c won't need to do any I/O.\n   */\n  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n    compptr = cinfo->cur_comp_info[ci];\n    buffer[ci] = (*cinfo->mem->access_virt_barray)\n      ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index],\n       coef->iMCU_row_num * compptr->v_samp_factor,\n       (JDIMENSION) compptr->v_samp_factor, FALSE);\n  }\n\n  /* Loop to process one whole iMCU row */\n  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;\n       yoffset++) {\n    for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row;\n\t MCU_col_num++) {\n      /* Construct list of pointers to DCT blocks belonging to this MCU */\n      blkn = 0;\t\t\t/* index of current DCT block within MCU */\n      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n\tcompptr = cinfo->cur_comp_info[ci];\n\tstart_col = MCU_col_num * compptr->MCU_width;\n\tfor (yindex = 0; yindex < compptr->MCU_height; yindex++) {\n\t  buffer_ptr = buffer[ci][yindex+yoffset] + start_col;\n\t  for (xindex = 0; xindex < compptr->MCU_width; xindex++) {\n\t    coef->MCU_buffer[blkn++] = buffer_ptr++;\n\t  }\n\t}\n      }\n      /* Try to write the MCU. */\n      if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) {\n\t/* Suspension forced; update state counters and exit */\n\tcoef->MCU_vert_offset = yoffset;\n\tcoef->mcu_ctr = MCU_col_num;\n\treturn FALSE;\n      }\n    }\n    /* Completed an MCU row, but perhaps not an iMCU row */\n    coef->mcu_ctr = 0;\n  }\n  /* Completed the iMCU row, advance counters for next one */\n  coef->iMCU_row_num++;\n  start_iMCU_row(cinfo);\n  return TRUE;\n}\n\n#endif /* FULL_COEF_BUFFER_SUPPORTED */\n\n\n/*\n * Initialize coefficient buffer controller.\n */\n\nGLOBAL(void)\njinit_c_coef_controller (j_compress_ptr cinfo, boolean need_full_buffer)\n{\n  my_coef_ptr coef;\n\n  coef = (my_coef_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_coef_controller));\n  cinfo->coef = (struct jpeg_c_coef_controller *) coef;\n  coef->pub.start_pass = start_pass_coef;\n\n  /* Create the coefficient buffer. */\n  if (need_full_buffer) {\n#ifdef FULL_COEF_BUFFER_SUPPORTED\n    /* Allocate a full-image virtual array for each component, */\n    /* padded to a multiple of samp_factor DCT blocks in each direction. */\n    int ci;\n    jpeg_component_info *compptr;\n\n    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n\t ci++, compptr++) {\n      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)\n\t((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,\n\t (JDIMENSION) jround_up((long) compptr->width_in_blocks,\n\t\t\t\t(long) compptr->h_samp_factor),\n\t (JDIMENSION) jround_up((long) compptr->height_in_blocks,\n\t\t\t\t(long) compptr->v_samp_factor),\n\t (JDIMENSION) compptr->v_samp_factor);\n    }\n#else\n    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n#endif\n  } else {\n    /* We only need a single-MCU buffer. */\n    JBLOCKROW buffer;\n    int i;\n\n    buffer = (JBLOCKROW)\n      (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));\n    for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) {\n      coef->MCU_buffer[i] = buffer + i;\n    }\n    coef->whole_image[0] = NULL; /* flag for no virtual arrays */\n  }\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jccolor.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jccolor.c\n *\n * Copyright (C) 1991-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains input colorspace conversion routines.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Private subobject */\n\ntypedef struct {\n  struct jpeg_color_converter pub; /* public fields */\n\n  /* Private state for RGB->YCC conversion */\n  INT32 * rgb_ycc_tab;\t\t/* => table for RGB to YCbCr conversion */\n} my_color_converter;\n\ntypedef my_color_converter * my_cconvert_ptr;\n\n\n/**************** RGB -> YCbCr conversion: most common case **************/\n\n/*\n * YCbCr is defined per CCIR 601-1, except that Cb and Cr are\n * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.\n * The conversion equations to be implemented are therefore\n *\tY  =  0.29900 * R + 0.58700 * G + 0.11400 * B\n *\tCb = -0.16874 * R - 0.33126 * G + 0.50000 * B  + CENTERJSAMPLE\n *\tCr =  0.50000 * R - 0.41869 * G - 0.08131 * B  + CENTERJSAMPLE\n * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)\n * Note: older versions of the IJG code used a zero offset of MAXJSAMPLE/2,\n * rather than CENTERJSAMPLE, for Cb and Cr.  This gave equal positive and\n * negative swings for Cb/Cr, but meant that grayscale values (Cb=Cr=0)\n * were not represented exactly.  Now we sacrifice exact representation of\n * maximum red and maximum blue in order to get exact grayscales.\n *\n * To avoid floating-point arithmetic, we represent the fractional constants\n * as integers scaled up by 2^16 (about 4 digits precision); we have to divide\n * the products by 2^16, with appropriate rounding, to get the correct answer.\n *\n * For even more speed, we avoid doing any multiplications in the inner loop\n * by precalculating the constants times R,G,B for all possible values.\n * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);\n * for 12-bit samples it is still acceptable.  It's not very reasonable for\n * 16-bit samples, but if you want lossless storage you shouldn't be changing\n * colorspace anyway.\n * The CENTERJSAMPLE offsets and the rounding fudge-factor of 0.5 are included\n * in the tables to save adding them separately in the inner loop.\n */\n\n#define SCALEBITS\t16\t/* speediest right-shift on some machines */\n#define CBCR_OFFSET\t((INT32) CENTERJSAMPLE << SCALEBITS)\n#define ONE_HALF\t((INT32) 1 << (SCALEBITS-1))\n#define FIX(x)\t\t((INT32) ((x) * (1L<<SCALEBITS) + 0.5))\n\n/* We allocate one big table and divide it up into eight parts, instead of\n * doing eight alloc_small requests.  This lets us use a single table base\n * address, which can be held in a register in the inner loops on many\n * machines (more than can hold all eight addresses, anyway).\n */\n\n#define R_Y_OFF\t\t0\t\t\t/* offset to R => Y section */\n#define G_Y_OFF\t\t(1*(MAXJSAMPLE+1))\t/* offset to G => Y section */\n#define B_Y_OFF\t\t(2*(MAXJSAMPLE+1))\t/* etc. */\n#define R_CB_OFF\t(3*(MAXJSAMPLE+1))\n#define G_CB_OFF\t(4*(MAXJSAMPLE+1))\n#define B_CB_OFF\t(5*(MAXJSAMPLE+1))\n#define R_CR_OFF\tB_CB_OFF\t\t/* B=>Cb, R=>Cr are the same */\n#define G_CR_OFF\t(6*(MAXJSAMPLE+1))\n#define B_CR_OFF\t(7*(MAXJSAMPLE+1))\n#define TABLE_SIZE\t(8*(MAXJSAMPLE+1))\n\n\n/*\n * Initialize for RGB->YCC colorspace conversion.\n */\n\nMETHODDEF(void)\nrgb_ycc_start (j_compress_ptr cinfo)\n{\n  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;\n  INT32 * rgb_ycc_tab;\n  INT32 i;\n\n  /* Allocate and fill in the conversion tables. */\n  cconvert->rgb_ycc_tab = rgb_ycc_tab = (INT32 *)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t(TABLE_SIZE * SIZEOF(INT32)));\n\n  for (i = 0; i <= MAXJSAMPLE; i++) {\n    rgb_ycc_tab[i+R_Y_OFF] = FIX(0.29900) * i;\n    rgb_ycc_tab[i+G_Y_OFF] = FIX(0.58700) * i;\n    rgb_ycc_tab[i+B_Y_OFF] = FIX(0.11400) * i     + ONE_HALF;\n    rgb_ycc_tab[i+R_CB_OFF] = (-FIX(0.16874)) * i;\n    rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.33126)) * i;\n    /* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr.\n     * This ensures that the maximum output will round to MAXJSAMPLE\n     * not MAXJSAMPLE+1, and thus that we don't have to range-limit.\n     */\n    rgb_ycc_tab[i+B_CB_OFF] = FIX(0.50000) * i    + CBCR_OFFSET + ONE_HALF-1;\n/*  B=>Cb and R=>Cr tables are the same\n    rgb_ycc_tab[i+R_CR_OFF] = FIX(0.50000) * i    + CBCR_OFFSET + ONE_HALF-1;\n*/\n    rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.41869)) * i;\n    rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.08131)) * i;\n  }\n}\n\n\n/*\n * Convert some rows of samples to the JPEG colorspace.\n *\n * Note that we change from the application's interleaved-pixel format\n * to our internal noninterleaved, one-plane-per-component format.\n * The input buffer is therefore three times as wide as the output buffer.\n *\n * A starting row offset is provided only for the output buffer.  The caller\n * can easily adjust the passed input_buf value to accommodate any row\n * offset required on that side.\n */\n\nMETHODDEF(void)\nrgb_ycc_convert (j_compress_ptr cinfo,\n\t\t JSAMPARRAY input_buf, JSAMPIMAGE output_buf,\n\t\t JDIMENSION output_row, int num_rows)\n{\n  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;\n  register int r, g, b;\n  register INT32 * ctab = cconvert->rgb_ycc_tab;\n  register JSAMPROW inptr;\n  register JSAMPROW outptr0, outptr1, outptr2;\n  register JDIMENSION col;\n  JDIMENSION num_cols = cinfo->image_width;\n\n  while (--num_rows >= 0) {\n    inptr = *input_buf++;\n    outptr0 = output_buf[0][output_row];\n    outptr1 = output_buf[1][output_row];\n    outptr2 = output_buf[2][output_row];\n    output_row++;\n    for (col = 0; col < num_cols; col++) {\n      r = GETJSAMPLE(inptr[RGB_RED]);\n      g = GETJSAMPLE(inptr[RGB_GREEN]);\n      b = GETJSAMPLE(inptr[RGB_BLUE]);\n      inptr += RGB_PIXELSIZE;\n      /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations\n       * must be too; we do not need an explicit range-limiting operation.\n       * Hence the value being shifted is never negative, and we don't\n       * need the general RIGHT_SHIFT macro.\n       */\n      /* Y */\n      outptr0[col] = (JSAMPLE)\n\t\t((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])\n\t\t >> SCALEBITS);\n      /* Cb */\n      outptr1[col] = (JSAMPLE)\n\t\t((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF])\n\t\t >> SCALEBITS);\n      /* Cr */\n      outptr2[col] = (JSAMPLE)\n\t\t((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])\n\t\t >> SCALEBITS);\n    }\n  }\n}\n\n\n/**************** Cases other than RGB -> YCbCr **************/\n\n\n/*\n * Convert some rows of samples to the JPEG colorspace.\n * This version handles RGB->grayscale conversion, which is the same\n * as the RGB->Y portion of RGB->YCbCr.\n * We assume rgb_ycc_start has been called (we only use the Y tables).\n */\n\nMETHODDEF(void)\nrgb_gray_convert (j_compress_ptr cinfo,\n\t\t  JSAMPARRAY input_buf, JSAMPIMAGE output_buf,\n\t\t  JDIMENSION output_row, int num_rows)\n{\n  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;\n  register int r, g, b;\n  register INT32 * ctab = cconvert->rgb_ycc_tab;\n  register JSAMPROW inptr;\n  register JSAMPROW outptr;\n  register JDIMENSION col;\n  JDIMENSION num_cols = cinfo->image_width;\n\n  while (--num_rows >= 0) {\n    inptr = *input_buf++;\n    outptr = output_buf[0][output_row];\n    output_row++;\n    for (col = 0; col < num_cols; col++) {\n      r = GETJSAMPLE(inptr[RGB_RED]);\n      g = GETJSAMPLE(inptr[RGB_GREEN]);\n      b = GETJSAMPLE(inptr[RGB_BLUE]);\n      inptr += RGB_PIXELSIZE;\n      /* Y */\n      outptr[col] = (JSAMPLE)\n\t\t((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])\n\t\t >> SCALEBITS);\n    }\n  }\n}\n\n\n/*\n * Convert some rows of samples to the JPEG colorspace.\n * This version handles Adobe-style CMYK->YCCK conversion,\n * where we convert R=1-C, G=1-M, and B=1-Y to YCbCr using the same\n * conversion as above, while passing K (black) unchanged.\n * We assume rgb_ycc_start has been called.\n */\n\nMETHODDEF(void)\ncmyk_ycck_convert (j_compress_ptr cinfo,\n\t\t   JSAMPARRAY input_buf, JSAMPIMAGE output_buf,\n\t\t   JDIMENSION output_row, int num_rows)\n{\n  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;\n  register int r, g, b;\n  register INT32 * ctab = cconvert->rgb_ycc_tab;\n  register JSAMPROW inptr;\n  register JSAMPROW outptr0, outptr1, outptr2, outptr3;\n  register JDIMENSION col;\n  JDIMENSION num_cols = cinfo->image_width;\n\n  while (--num_rows >= 0) {\n    inptr = *input_buf++;\n    outptr0 = output_buf[0][output_row];\n    outptr1 = output_buf[1][output_row];\n    outptr2 = output_buf[2][output_row];\n    outptr3 = output_buf[3][output_row];\n    output_row++;\n    for (col = 0; col < num_cols; col++) {\n      r = MAXJSAMPLE - GETJSAMPLE(inptr[0]);\n      g = MAXJSAMPLE - GETJSAMPLE(inptr[1]);\n      b = MAXJSAMPLE - GETJSAMPLE(inptr[2]);\n      /* K passes through as-is */\n      outptr3[col] = inptr[3];\t/* don't need GETJSAMPLE here */\n      inptr += 4;\n      /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations\n       * must be too; we do not need an explicit range-limiting operation.\n       * Hence the value being shifted is never negative, and we don't\n       * need the general RIGHT_SHIFT macro.\n       */\n      /* Y */\n      outptr0[col] = (JSAMPLE)\n\t\t((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])\n\t\t >> SCALEBITS);\n      /* Cb */\n      outptr1[col] = (JSAMPLE)\n\t\t((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF])\n\t\t >> SCALEBITS);\n      /* Cr */\n      outptr2[col] = (JSAMPLE)\n\t\t((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])\n\t\t >> SCALEBITS);\n    }\n  }\n}\n\n\n/*\n * Convert some rows of samples to the JPEG colorspace.\n * This version handles grayscale output with no conversion.\n * The source can be either plain grayscale or YCbCr (since Y == gray).\n */\n\nMETHODDEF(void)\ngrayscale_convert (j_compress_ptr cinfo,\n\t\t   JSAMPARRAY input_buf, JSAMPIMAGE output_buf,\n\t\t   JDIMENSION output_row, int num_rows)\n{\n  register JSAMPROW inptr;\n  register JSAMPROW outptr;\n  register JDIMENSION col;\n  JDIMENSION num_cols = cinfo->image_width;\n  int instride = cinfo->input_components;\n\n  while (--num_rows >= 0) {\n    inptr = *input_buf++;\n    outptr = output_buf[0][output_row];\n    output_row++;\n    for (col = 0; col < num_cols; col++) {\n      outptr[col] = inptr[0];\t/* don't need GETJSAMPLE() here */\n      inptr += instride;\n    }\n  }\n}\n\n\n/*\n * Convert some rows of samples to the JPEG colorspace.\n * This version handles multi-component colorspaces without conversion.\n * We assume input_components == num_components.\n */\n\nMETHODDEF(void)\nnull_convert (j_compress_ptr cinfo,\n\t      JSAMPARRAY input_buf, JSAMPIMAGE output_buf,\n\t      JDIMENSION output_row, int num_rows)\n{\n  register JSAMPROW inptr;\n  register JSAMPROW outptr;\n  register JDIMENSION col;\n  register int ci;\n  int nc = cinfo->num_components;\n  JDIMENSION num_cols = cinfo->image_width;\n\n  while (--num_rows >= 0) {\n    /* It seems fastest to make a separate pass for each component. */\n    for (ci = 0; ci < nc; ci++) {\n      inptr = *input_buf;\n      outptr = output_buf[ci][output_row];\n      for (col = 0; col < num_cols; col++) {\n\toutptr[col] = inptr[ci]; /* don't need GETJSAMPLE() here */\n\tinptr += nc;\n      }\n    }\n    input_buf++;\n    output_row++;\n  }\n}\n\n\n/*\n * Empty method for start_pass.\n */\n\nMETHODDEF(void)\nnull_method (j_compress_ptr cinfo)\n{\n  /* no work needed */\n}\n\n\n/*\n * Module initialization routine for input colorspace conversion.\n */\n\nGLOBAL(void)\njinit_color_converter (j_compress_ptr cinfo)\n{\n  my_cconvert_ptr cconvert;\n\n  cconvert = (my_cconvert_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_color_converter));\n  cinfo->cconvert = (struct jpeg_color_converter *) cconvert;\n  /* set start_pass to null method until we find out differently */\n  cconvert->pub.start_pass = null_method;\n\n  /* Make sure input_components agrees with in_color_space */\n  switch (cinfo->in_color_space) {\n  case JCS_GRAYSCALE:\n    if (cinfo->input_components != 1)\n      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);\n    break;\n\n  case JCS_RGB:\n#if RGB_PIXELSIZE != 3\n    if (cinfo->input_components != RGB_PIXELSIZE)\n      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);\n    break;\n#endif /* else share code with YCbCr */\n\n  case JCS_YCbCr:\n    if (cinfo->input_components != 3)\n      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);\n    break;\n\n  case JCS_CMYK:\n  case JCS_YCCK:\n    if (cinfo->input_components != 4)\n      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);\n    break;\n\n  default:\t\t\t/* JCS_UNKNOWN can be anything */\n    if (cinfo->input_components < 1)\n      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);\n    break;\n  }\n\n  /* Check num_components, set conversion method based on requested space */\n  switch (cinfo->jpeg_color_space) {\n  case JCS_GRAYSCALE:\n    if (cinfo->num_components != 1)\n      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);\n    if (cinfo->in_color_space == JCS_GRAYSCALE)\n      cconvert->pub.color_convert = grayscale_convert;\n    else if (cinfo->in_color_space == JCS_RGB) {\n      cconvert->pub.start_pass = rgb_ycc_start;\n      cconvert->pub.color_convert = rgb_gray_convert;\n    } else if (cinfo->in_color_space == JCS_YCbCr)\n      cconvert->pub.color_convert = grayscale_convert;\n    else\n      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n    break;\n\n  case JCS_RGB:\n    if (cinfo->num_components != 3)\n      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);\n    if (cinfo->in_color_space == JCS_RGB && RGB_PIXELSIZE == 3)\n      cconvert->pub.color_convert = null_convert;\n    else\n      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n    break;\n\n  case JCS_YCbCr:\n    if (cinfo->num_components != 3)\n      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);\n    if (cinfo->in_color_space == JCS_RGB) {\n      cconvert->pub.start_pass = rgb_ycc_start;\n      cconvert->pub.color_convert = rgb_ycc_convert;\n    } else if (cinfo->in_color_space == JCS_YCbCr)\n      cconvert->pub.color_convert = null_convert;\n    else\n      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n    break;\n\n  case JCS_CMYK:\n    if (cinfo->num_components != 4)\n      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);\n    if (cinfo->in_color_space == JCS_CMYK)\n      cconvert->pub.color_convert = null_convert;\n    else\n      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n    break;\n\n  case JCS_YCCK:\n    if (cinfo->num_components != 4)\n      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);\n    if (cinfo->in_color_space == JCS_CMYK) {\n      cconvert->pub.start_pass = rgb_ycc_start;\n      cconvert->pub.color_convert = cmyk_ycck_convert;\n    } else if (cinfo->in_color_space == JCS_YCCK)\n      cconvert->pub.color_convert = null_convert;\n    else\n      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n    break;\n\n  default:\t\t\t/* allow null conversion of JCS_UNKNOWN */\n    if (cinfo->jpeg_color_space != cinfo->in_color_space ||\n\tcinfo->num_components != cinfo->input_components)\n      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n    cconvert->pub.color_convert = null_convert;\n    break;\n  }\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jcdctmgr.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jcdctmgr.c\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains the forward-DCT management logic.\n * This code selects a particular DCT implementation to be used,\n * and it performs related housekeeping chores including coefficient\n * quantization.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jdct.h\"\t\t/* Private declarations for DCT subsystem */\n\n\n/* Private subobject for this module */\n\ntypedef struct {\n  struct jpeg_forward_dct pub;\t/* public fields */\n\n  /* Pointer to the DCT routine actually in use */\n  forward_DCT_method_ptr do_dct;\n\n  /* The actual post-DCT divisors --- not identical to the quant table\n   * entries, because of scaling (especially for an unnormalized DCT).\n   * Each table is given in normal array order.\n   */\n  DCTELEM * divisors[NUM_QUANT_TBLS];\n\n#ifdef DCT_FLOAT_SUPPORTED\n  /* Same as above for the floating-point case. */\n  float_DCT_method_ptr do_float_dct;\n  FAST_FLOAT * float_divisors[NUM_QUANT_TBLS];\n#endif\n} my_fdct_controller;\n\ntypedef my_fdct_controller * my_fdct_ptr;\n\n\n/*\n * Initialize for a processing pass.\n * Verify that all referenced Q-tables are present, and set up\n * the divisor table for each one.\n * In the current implementation, DCT of all components is done during\n * the first pass, even if only some components will be output in the\n * first scan.  Hence all components should be examined here.\n */\n\nMETHODDEF(void)\nstart_pass_fdctmgr (j_compress_ptr cinfo)\n{\n  my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;\n  int ci, qtblno, i;\n  jpeg_component_info *compptr;\n  JQUANT_TBL * qtbl;\n  DCTELEM * dtbl;\n\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    qtblno = compptr->quant_tbl_no;\n    /* Make sure specified quantization table is present */\n    if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS ||\n\tcinfo->quant_tbl_ptrs[qtblno] == NULL)\n      ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);\n    qtbl = cinfo->quant_tbl_ptrs[qtblno];\n    /* Compute divisors for this quant table */\n    /* We may do this more than once for same table, but it's not a big deal */\n    switch (cinfo->dct_method) {\n#ifdef DCT_ISLOW_SUPPORTED\n    case JDCT_ISLOW:\n      /* For LL&M IDCT method, divisors are equal to raw quantization\n       * coefficients multiplied by 8 (to counteract scaling).\n       */\n      if (fdct->divisors[qtblno] == NULL) {\n\tfdct->divisors[qtblno] = (DCTELEM *)\n\t  (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t      DCTSIZE2 * SIZEOF(DCTELEM));\n      }\n      dtbl = fdct->divisors[qtblno];\n      for (i = 0; i < DCTSIZE2; i++) {\n\tdtbl[i] = ((DCTELEM) qtbl->quantval[i]) << 3;\n      }\n      break;\n#endif\n#ifdef DCT_IFAST_SUPPORTED\n    case JDCT_IFAST:\n      {\n\t/* For AA&N IDCT method, divisors are equal to quantization\n\t * coefficients scaled by scalefactor[row]*scalefactor[col], where\n\t *   scalefactor[0] = 1\n\t *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7\n\t * We apply a further scale factor of 8.\n\t */\n#define CONST_BITS 14\n\tstatic const INT16 aanscales[DCTSIZE2] = {\n\t  /* precomputed values scaled up by 14 bits */\n\t  16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,\n\t  22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,\n\t  21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,\n\t  19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,\n\t  16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,\n\t  12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,\n\t   8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,\n\t   4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247\n\t};\n\tSHIFT_TEMPS\n\n\tif (fdct->divisors[qtblno] == NULL) {\n\t  fdct->divisors[qtblno] = (DCTELEM *)\n\t    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t\tDCTSIZE2 * SIZEOF(DCTELEM));\n\t}\n\tdtbl = fdct->divisors[qtblno];\n\tfor (i = 0; i < DCTSIZE2; i++) {\n\t  dtbl[i] = (DCTELEM)\n\t    DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i],\n\t\t\t\t  (INT32) aanscales[i]),\n\t\t    CONST_BITS-3);\n\t}\n      }\n      break;\n#endif\n#ifdef DCT_FLOAT_SUPPORTED\n    case JDCT_FLOAT:\n      {\n\t/* For float AA&N IDCT method, divisors are equal to quantization\n\t * coefficients scaled by scalefactor[row]*scalefactor[col], where\n\t *   scalefactor[0] = 1\n\t *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7\n\t * We apply a further scale factor of 8.\n\t * What's actually stored is 1/divisor so that the inner loop can\n\t * use a multiplication rather than a division.\n\t */\n\tFAST_FLOAT * fdtbl;\n\tint row, col;\n\tstatic const double aanscalefactor[DCTSIZE] = {\n\t  1.0, 1.387039845, 1.306562965, 1.175875602,\n\t  1.0, 0.785694958, 0.541196100, 0.275899379\n\t};\n\n\tif (fdct->float_divisors[qtblno] == NULL) {\n\t  fdct->float_divisors[qtblno] = (FAST_FLOAT *)\n\t    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t\tDCTSIZE2 * SIZEOF(FAST_FLOAT));\n\t}\n\tfdtbl = fdct->float_divisors[qtblno];\n\ti = 0;\n\tfor (row = 0; row < DCTSIZE; row++) {\n\t  for (col = 0; col < DCTSIZE; col++) {\n\t    fdtbl[i] = (FAST_FLOAT)\n\t      (1.0 / (((double) qtbl->quantval[i] *\n\t\t       aanscalefactor[row] * aanscalefactor[col] * 8.0)));\n\t    i++;\n\t  }\n\t}\n      }\n      break;\n#endif\n    default:\n      ERREXIT(cinfo, JERR_NOT_COMPILED);\n      break;\n    }\n  }\n}\n\n\n/*\n * Perform forward DCT on one or more blocks of a component.\n *\n * The input samples are taken from the sample_data[] array starting at\n * position start_row/start_col, and moving to the right for any additional\n * blocks. The quantized coefficients are returned in coef_blocks[].\n */\n\nMETHODDEF(void)\nforward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr,\n\t     JSAMPARRAY sample_data, JBLOCKROW coef_blocks,\n\t     JDIMENSION start_row, JDIMENSION start_col,\n\t     JDIMENSION num_blocks)\n/* This version is used for integer DCT implementations. */\n{\n  /* This routine is heavily used, so it's worth coding it tightly. */\n  my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;\n  forward_DCT_method_ptr do_dct = fdct->do_dct;\n  DCTELEM * divisors = fdct->divisors[compptr->quant_tbl_no];\n  DCTELEM workspace[DCTSIZE2];\t/* work area for FDCT subroutine */\n  JDIMENSION bi;\n\n  sample_data += start_row;\t/* fold in the vertical offset once */\n\n  for (bi = 0; bi < num_blocks; bi++, start_col += DCTSIZE) {\n    /* Load data into workspace, applying unsigned->signed conversion */\n    { register DCTELEM *workspaceptr;\n      register JSAMPROW elemptr;\n      register int elemr;\n\n      workspaceptr = workspace;\n      for (elemr = 0; elemr < DCTSIZE; elemr++) {\n\telemptr = sample_data[elemr] + start_col;\n#if DCTSIZE == 8\t\t/* unroll the inner loop */\n\t*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;\n\t*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;\n\t*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;\n\t*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;\n\t*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;\n\t*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;\n\t*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;\n\t*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;\n#else\n\t{ register int elemc;\n\t  for (elemc = DCTSIZE; elemc > 0; elemc--) {\n\t    *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;\n\t  }\n\t}\n#endif\n      }\n    }\n\n    /* Perform the DCT */\n    (*do_dct) (workspace);\n\n    /* Quantize/descale the coefficients, and store into coef_blocks[] */\n    { register DCTELEM temp, qval;\n      register int i;\n      register JCOEFPTR output_ptr = coef_blocks[bi];\n\n      for (i = 0; i < DCTSIZE2; i++) {\n\tqval = divisors[i];\n\ttemp = workspace[i];\n\t/* Divide the coefficient value by qval, ensuring proper rounding.\n\t * Since C does not specify the direction of rounding for negative\n\t * quotients, we have to force the dividend positive for portability.\n\t *\n\t * In most files, at least half of the output values will be zero\n\t * (at default quantization settings, more like three-quarters...)\n\t * so we should ensure that this case is fast.  On many machines,\n\t * a comparison is enough cheaper than a divide to make a special test\n\t * a win.  Since both inputs will be nonnegative, we need only test\n\t * for a < b to discover whether a/b is 0.\n\t * If your machine's division is fast enough, define FAST_DIVIDE.\n\t */\n#ifdef FAST_DIVIDE\n#define DIVIDE_BY(a,b)\ta /= b\n#else\n#define DIVIDE_BY(a,b)\tif (a >= b) a /= b; else a = 0\n#endif\n\tif (temp < 0) {\n\t  temp = -temp;\n\t  temp += qval>>1;\t/* for rounding */\n\t  DIVIDE_BY(temp, qval);\n\t  temp = -temp;\n\t} else {\n\t  temp += qval>>1;\t/* for rounding */\n\t  DIVIDE_BY(temp, qval);\n\t}\n\toutput_ptr[i] = (JCOEF) temp;\n      }\n    }\n  }\n}\n\n\n#ifdef DCT_FLOAT_SUPPORTED\n\nMETHODDEF(void)\nforward_DCT_float (j_compress_ptr cinfo, jpeg_component_info * compptr,\n\t\t   JSAMPARRAY sample_data, JBLOCKROW coef_blocks,\n\t\t   JDIMENSION start_row, JDIMENSION start_col,\n\t\t   JDIMENSION num_blocks)\n/* This version is used for floating-point DCT implementations. */\n{\n  /* This routine is heavily used, so it's worth coding it tightly. */\n  my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;\n  float_DCT_method_ptr do_dct = fdct->do_float_dct;\n  FAST_FLOAT * divisors = fdct->float_divisors[compptr->quant_tbl_no];\n  FAST_FLOAT workspace[DCTSIZE2]; /* work area for FDCT subroutine */\n  JDIMENSION bi;\n\n  sample_data += start_row;\t/* fold in the vertical offset once */\n\n  for (bi = 0; bi < num_blocks; bi++, start_col += DCTSIZE) {\n    /* Load data into workspace, applying unsigned->signed conversion */\n    { register FAST_FLOAT *workspaceptr;\n      register JSAMPROW elemptr;\n      register int elemr;\n\n      workspaceptr = workspace;\n      for (elemr = 0; elemr < DCTSIZE; elemr++) {\n\telemptr = sample_data[elemr] + start_col;\n#if DCTSIZE == 8\t\t/* unroll the inner loop */\n\t*workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);\n\t*workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);\n\t*workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);\n\t*workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);\n\t*workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);\n\t*workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);\n\t*workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);\n\t*workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);\n#else\n\t{ register int elemc;\n\t  for (elemc = DCTSIZE; elemc > 0; elemc--) {\n\t    *workspaceptr++ = (FAST_FLOAT)\n\t      (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);\n\t  }\n\t}\n#endif\n      }\n    }\n\n    /* Perform the DCT */\n    (*do_dct) (workspace);\n\n    /* Quantize/descale the coefficients, and store into coef_blocks[] */\n    { register FAST_FLOAT temp;\n      register int i;\n      register JCOEFPTR output_ptr = coef_blocks[bi];\n\n      for (i = 0; i < DCTSIZE2; i++) {\n\t/* Apply the quantization and scaling factor */\n\ttemp = workspace[i] * divisors[i];\n\t/* Round to nearest integer.\n\t * Since C does not specify the direction of rounding for negative\n\t * quotients, we have to force the dividend positive for portability.\n\t * The maximum coefficient size is +-16K (for 12-bit data), so this\n\t * code should work for either 16-bit or 32-bit ints.\n\t */\n\toutput_ptr[i] = (JCOEF) ((int) (temp + (FAST_FLOAT) 16384.5) - 16384);\n      }\n    }\n  }\n}\n\n#endif /* DCT_FLOAT_SUPPORTED */\n\n\n/*\n * Initialize FDCT manager.\n */\n\nGLOBAL(void)\njinit_forward_dct (j_compress_ptr cinfo)\n{\n  my_fdct_ptr fdct;\n  int i;\n\n  fdct = (my_fdct_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_fdct_controller));\n  cinfo->fdct = (struct jpeg_forward_dct *) fdct;\n  fdct->pub.start_pass = start_pass_fdctmgr;\n\n  switch (cinfo->dct_method) {\n#ifdef DCT_ISLOW_SUPPORTED\n  case JDCT_ISLOW:\n    fdct->pub.forward_DCT = forward_DCT;\n    fdct->do_dct = jpeg_fdct_islow;\n    break;\n#endif\n#ifdef DCT_IFAST_SUPPORTED\n  case JDCT_IFAST:\n    fdct->pub.forward_DCT = forward_DCT;\n    fdct->do_dct = jpeg_fdct_ifast;\n    break;\n#endif\n#ifdef DCT_FLOAT_SUPPORTED\n  case JDCT_FLOAT:\n    fdct->pub.forward_DCT = forward_DCT_float;\n    fdct->do_float_dct = jpeg_fdct_float;\n    break;\n#endif\n  default:\n    ERREXIT(cinfo, JERR_NOT_COMPILED);\n    break;\n  }\n\n  /* Mark divisor tables unallocated */\n  for (i = 0; i < NUM_QUANT_TBLS; i++) {\n    fdct->divisors[i] = NULL;\n#ifdef DCT_FLOAT_SUPPORTED\n    fdct->float_divisors[i] = NULL;\n#endif\n  }\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jchuff.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jchuff.c\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains Huffman entropy encoding routines.\n *\n * Much of the complexity here has to do with supporting output suspension.\n * If the data destination module demands suspension, we want to be able to\n * back up to the start of the current MCU.  To do this, we copy state\n * variables into local working storage, and update them back to the\n * permanent JPEG objects only upon successful completion of an MCU.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jchuff.h\"\t\t/* Declarations shared with jcphuff.c */\n\n#ifdef _FX_MANAGED_CODE_\n#define savable_state\tsavable_state_c\n#endif\n\n/* Expanded entropy encoder object for Huffman encoding.\n *\n * The savable_state subrecord contains fields that change within an MCU,\n * but must not be updated permanently until we complete the MCU.\n */\n\ntypedef struct {\n  INT32 put_buffer;\t\t/* current bit-accumulation buffer */\n  int put_bits;\t\t\t/* # of bits now in it */\n  int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */\n} savable_state;\n\n/* This macro is to work around compilers with missing or broken\n * structure assignment.  You'll need to fix this code if you have\n * such a compiler and you change MAX_COMPS_IN_SCAN.\n */\n\n#ifndef NO_STRUCT_ASSIGN\n#define ASSIGN_STATE(dest,src)  ((dest) = (src))\n#else\n#if MAX_COMPS_IN_SCAN == 4\n#define ASSIGN_STATE(dest,src)  \\\n\t((dest).put_buffer = (src).put_buffer, \\\n\t (dest).put_bits = (src).put_bits, \\\n\t (dest).last_dc_val[0] = (src).last_dc_val[0], \\\n\t (dest).last_dc_val[1] = (src).last_dc_val[1], \\\n\t (dest).last_dc_val[2] = (src).last_dc_val[2], \\\n\t (dest).last_dc_val[3] = (src).last_dc_val[3])\n#endif\n#endif\n\n\ntypedef struct {\n  struct jpeg_entropy_encoder pub; /* public fields */\n\n  savable_state saved;\t\t/* Bit buffer & DC state at start of MCU */\n\n  /* These fields are NOT loaded into local working state. */\n  unsigned int restarts_to_go;\t/* MCUs left in this restart interval */\n  int next_restart_num;\t\t/* next restart number to write (0-7) */\n\n  /* Pointers to derived tables (these workspaces have image lifespan) */\n  c_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS];\n  c_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS];\n\n#ifdef ENTROPY_OPT_SUPPORTED\t/* Statistics tables for optimization */\n  long * dc_count_ptrs[NUM_HUFF_TBLS];\n  long * ac_count_ptrs[NUM_HUFF_TBLS];\n#endif\n} huff_entropy_encoder;\n\ntypedef huff_entropy_encoder * huff_entropy_ptr;\n\n/* Working state while writing an MCU.\n * This struct contains all the fields that are needed by subroutines.\n */\n\ntypedef struct {\n  JOCTET * next_output_byte;\t/* => next byte to write in buffer */\n  size_t free_in_buffer;\t/* # of byte spaces remaining in buffer */\n  savable_state cur;\t\t/* Current bit buffer & DC state */\n  j_compress_ptr cinfo;\t\t/* dump_buffer needs access to this */\n} working_state;\n\n\n/* Forward declarations */\nMETHODDEF(boolean) encode_mcu_huff JPP((j_compress_ptr cinfo,\n\t\t\t\t\tJBLOCKROW *MCU_data));\nMETHODDEF(void) finish_pass_huff JPP((j_compress_ptr cinfo));\n#ifdef ENTROPY_OPT_SUPPORTED\nMETHODDEF(boolean) encode_mcu_gather JPP((j_compress_ptr cinfo,\n\t\t\t\t\t  JBLOCKROW *MCU_data));\nMETHODDEF(void) finish_pass_gather JPP((j_compress_ptr cinfo));\n#endif\n\n\n/*\n * Initialize for a Huffman-compressed scan.\n * If gather_statistics is TRUE, we do not output anything during the scan,\n * just count the Huffman symbols used and generate Huffman code tables.\n */\n\nMETHODDEF(void)\nstart_pass_huff (j_compress_ptr cinfo, boolean gather_statistics)\n{\n  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;\n  int ci, dctbl, actbl;\n  jpeg_component_info * compptr;\n\n  if (gather_statistics) {\n#ifdef ENTROPY_OPT_SUPPORTED\n    entropy->pub.encode_mcu = encode_mcu_gather;\n    entropy->pub.finish_pass = finish_pass_gather;\n#else\n    ERREXIT(cinfo, JERR_NOT_COMPILED);\n#endif\n  } else {\n    entropy->pub.encode_mcu = encode_mcu_huff;\n    entropy->pub.finish_pass = finish_pass_huff;\n  }\n\n  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n    compptr = cinfo->cur_comp_info[ci];\n    dctbl = compptr->dc_tbl_no;\n    actbl = compptr->ac_tbl_no;\n    if (gather_statistics) {\n#ifdef ENTROPY_OPT_SUPPORTED\n      /* Check for invalid table indexes */\n      /* (make_c_derived_tbl does this in the other path) */\n      if (dctbl < 0 || dctbl >= NUM_HUFF_TBLS)\n\tERREXIT1(cinfo, JERR_NO_HUFF_TABLE, dctbl);\n      if (actbl < 0 || actbl >= NUM_HUFF_TBLS)\n\tERREXIT1(cinfo, JERR_NO_HUFF_TABLE, actbl);\n      /* Allocate and zero the statistics tables */\n      /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */\n      if (entropy->dc_count_ptrs[dctbl] == NULL)\n\tentropy->dc_count_ptrs[dctbl] = (long *)\n\t  (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t      257 * SIZEOF(long));\n      MEMZERO(entropy->dc_count_ptrs[dctbl], 257 * SIZEOF(long));\n      if (entropy->ac_count_ptrs[actbl] == NULL)\n\tentropy->ac_count_ptrs[actbl] = (long *)\n\t  (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t      257 * SIZEOF(long));\n      MEMZERO(entropy->ac_count_ptrs[actbl], 257 * SIZEOF(long));\n#endif\n    } else {\n      /* Compute derived values for Huffman tables */\n      /* We may do this more than once for a table, but it's not expensive */\n      jpeg_make_c_derived_tbl(cinfo, TRUE, dctbl,\n\t\t\t      & entropy->dc_derived_tbls[dctbl]);\n      jpeg_make_c_derived_tbl(cinfo, FALSE, actbl,\n\t\t\t      & entropy->ac_derived_tbls[actbl]);\n    }\n    /* Initialize DC predictions to 0 */\n    entropy->saved.last_dc_val[ci] = 0;\n  }\n\n  /* Initialize bit buffer to empty */\n  entropy->saved.put_buffer = 0;\n  entropy->saved.put_bits = 0;\n\n  /* Initialize restart stuff */\n  entropy->restarts_to_go = cinfo->restart_interval;\n  entropy->next_restart_num = 0;\n}\n\n\n/*\n * Compute the derived values for a Huffman table.\n * This routine also performs some validation checks on the table.\n *\n * Note this is also used by jcphuff.c.\n */\n\nGLOBAL(void)\njpeg_make_c_derived_tbl (j_compress_ptr cinfo, boolean isDC, int tblno,\n\t\t\t c_derived_tbl ** pdtbl)\n{\n  JHUFF_TBL *htbl;\n  c_derived_tbl *dtbl;\n  int p, i, l, lastp, _si, maxsymbol;\n  char huffsize[257];\n  unsigned int huffcode[257];\n  unsigned int code;\n\n  /* Note that huffsize[] and huffcode[] are filled in code-length order,\n   * paralleling the order of the symbols themselves in htbl->huffval[].\n   */\n\n  /* Find the input Huffman table */\n  if (tblno < 0 || tblno >= NUM_HUFF_TBLS)\n    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);\n  htbl =\n    isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];\n  if (htbl == NULL)\n    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);\n\n  /* Allocate a workspace if we haven't already done so. */\n  if (*pdtbl == NULL)\n    *pdtbl = (c_derived_tbl *)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  SIZEOF(c_derived_tbl));\n  dtbl = *pdtbl;\n  \n  /* Figure C.1: make table of Huffman code length for each symbol */\n\n  p = 0;\n  for (l = 1; l <= 16; l++) {\n    i = (int) htbl->bits[l];\n    if (i < 0 || p + i > 256)\t/* protect against table overrun */\n      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);\n    while (i--)\n      huffsize[p++] = (char) l;\n  }\n  huffsize[p] = 0;\n  lastp = p;\n  \n  /* Figure C.2: generate the codes themselves */\n  /* We also validate that the counts represent a legal Huffman code tree. */\n\n  code = 0;\n  _si = huffsize[0];\n  p = 0;\n  while (huffsize[p]) {\n    while (((int) huffsize[p]) == _si) {\n      huffcode[p++] = code;\n      code++;\n    }\n    /* code is now 1 more than the last code used for codelength si; but\n     * it must still fit in si bits, since no code is allowed to be all ones.\n     */\n    if (((INT32) code) >= (((INT32) 1) << _si))\n      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);\n    code <<= 1;\n    _si++;\n  }\n  \n  /* Figure C.3: generate encoding tables */\n  /* These are code and size indexed by symbol value */\n\n  /* Set all codeless symbols to have code length 0;\n   * this lets us detect duplicate VAL entries here, and later\n   * allows emit_bits to detect any attempt to emit such symbols.\n   */\n  MEMZERO(dtbl->ehufsi, SIZEOF(dtbl->ehufsi));\n\n  /* This is also a convenient place to check for out-of-range\n   * and duplicated VAL entries.  We allow 0..255 for AC symbols\n   * but only 0..15 for DC.  (We could constrain them further\n   * based on data depth and mode, but this seems enough.)\n   */\n  maxsymbol = isDC ? 15 : 255;\n\n  for (p = 0; p < lastp; p++) {\n    i = htbl->huffval[p];\n    if (i < 0 || i > maxsymbol || dtbl->ehufsi[i])\n      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);\n    dtbl->ehufco[i] = huffcode[p];\n    dtbl->ehufsi[i] = huffsize[p];\n  }\n}\n\n\n/* Outputting bytes to the file */\n\n/* Emit a byte, taking 'action' if must suspend. */\n#define emit_byte(state,val,action)  \\\n\t{ *(state)->next_output_byte++ = (JOCTET) (val);  \\\n\t  if (--(state)->free_in_buffer == 0)  \\\n\t    if (! dump_buffer(state))  \\\n\t      { action; } }\n\n\nLOCAL(boolean)\ndump_buffer (working_state * state)\n/* Empty the output buffer; return TRUE if successful, FALSE if must suspend */\n{\n  struct jpeg_destination_mgr * dest = state->cinfo->dest;\n\n  if (! (*dest->empty_output_buffer) (state->cinfo))\n    return FALSE;\n  /* After a successful buffer dump, must reset buffer pointers */\n  state->next_output_byte = dest->next_output_byte;\n  state->free_in_buffer = dest->free_in_buffer;\n  return TRUE;\n}\n\n\n/* Outputting bits to the file */\n\n/* Only the right 24 bits of put_buffer are used; the valid bits are\n * left-justified in this part.  At most 16 bits can be passed to emit_bits\n * in one call, and we never retain more than 7 bits in put_buffer\n * between calls, so 24 bits are sufficient.\n */\n\nINLINE\nLOCAL(boolean)\nemit_bits (working_state * state, unsigned int code, int size)\n/* Emit some bits; return TRUE if successful, FALSE if must suspend */\n{\n  /* This routine is heavily used, so it's worth coding tightly. */\n  register INT32 put_buffer = (INT32) code;\n  register int put_bits = state->cur.put_bits;\n\n  /* if size is 0, caller used an invalid Huffman table entry */\n  if (size == 0)\n    ERREXIT(state->cinfo, JERR_HUFF_MISSING_CODE);\n\n  put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */\n  \n  put_bits += size;\t\t/* new number of bits in buffer */\n  \n  put_buffer <<= 24 - put_bits; /* align incoming bits */\n\n  put_buffer |= state->cur.put_buffer; /* and merge with old buffer contents */\n  \n  while (put_bits >= 8) {\n    int c = (int) ((put_buffer >> 16) & 0xFF);\n    \n    emit_byte(state, c, return FALSE);\n    if (c == 0xFF) {\t\t/* need to stuff a zero byte? */\n      emit_byte(state, 0, return FALSE);\n    }\n    put_buffer <<= 8;\n    put_bits -= 8;\n  }\n\n  state->cur.put_buffer = put_buffer; /* update state variables */\n  state->cur.put_bits = put_bits;\n\n  return TRUE;\n}\n\n\nLOCAL(boolean)\nflush_bits (working_state * state)\n{\n  if (! emit_bits(state, 0x7F, 7)) /* fill any partial byte with ones */\n    return FALSE;\n  state->cur.put_buffer = 0;\t/* and reset bit-buffer to empty */\n  state->cur.put_bits = 0;\n  return TRUE;\n}\n\n\n/* Encode a single block's worth of coefficients */\n\nLOCAL(boolean)\nencode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,\n\t\t  c_derived_tbl *dctbl, c_derived_tbl *actbl)\n{\n  register int temp, temp2;\n  register int nbits;\n  register int k, r, i;\n  \n  /* Encode the DC coefficient difference per section F.1.2.1 */\n  \n  temp = temp2 = block[0] - last_dc_val;\n\n  if (temp < 0) {\n    temp = -temp;\t\t/* temp is abs value of input */\n    /* For a negative input, want temp2 = bitwise complement of abs(input) */\n    /* This code assumes we are on a two's complement machine */\n    temp2--;\n  }\n  \n  /* Find the number of bits needed for the magnitude of the coefficient */\n  nbits = 0;\n  while (temp) {\n    nbits++;\n    temp >>= 1;\n  }\n  /* Check for out-of-range coefficient values.\n   * Since we're encoding a difference, the range limit is twice as much.\n   */\n  if (nbits > MAX_COEF_BITS+1)\n    ERREXIT(state->cinfo, JERR_BAD_DCT_COEF);\n  \n  /* Emit the Huffman-coded symbol for the number of bits */\n  if (! emit_bits(state, dctbl->ehufco[nbits], dctbl->ehufsi[nbits]))\n    return FALSE;\n\n  /* Emit that number of bits of the value, if positive, */\n  /* or the complement of its magnitude, if negative. */\n  if (nbits)\t\t\t/* emit_bits rejects calls with size 0 */\n    if (! emit_bits(state, (unsigned int) temp2, nbits))\n      return FALSE;\n\n  /* Encode the AC coefficients per section F.1.2.2 */\n  \n  r = 0;\t\t\t/* r = run length of zeros */\n  \n  for (k = 1; k < DCTSIZE2; k++) {\n    if ((temp = block[jpeg_natural_order[k]]) == 0) {\n      r++;\n    } else {\n      /* if run length > 15, must emit special run-length-16 codes (0xF0) */\n      while (r > 15) {\n\tif (! emit_bits(state, actbl->ehufco[0xF0], actbl->ehufsi[0xF0]))\n\t  return FALSE;\n\tr -= 16;\n      }\n\n      temp2 = temp;\n      if (temp < 0) {\n\ttemp = -temp;\t\t/* temp is abs value of input */\n\t/* This code assumes we are on a two's complement machine */\n\ttemp2--;\n      }\n      \n      /* Find the number of bits needed for the magnitude of the coefficient */\n      nbits = 1;\t\t/* there must be at least one 1 bit */\n      while ((temp >>= 1))\n\tnbits++;\n      /* Check for out-of-range coefficient values */\n      if (nbits > MAX_COEF_BITS)\n\tERREXIT(state->cinfo, JERR_BAD_DCT_COEF);\n      \n      /* Emit Huffman symbol for run length / number of bits */\n      i = (r << 4) + nbits;\n      if (! emit_bits(state, actbl->ehufco[i], actbl->ehufsi[i]))\n\treturn FALSE;\n\n      /* Emit that number of bits of the value, if positive, */\n      /* or the complement of its magnitude, if negative. */\n      if (! emit_bits(state, (unsigned int) temp2, nbits))\n\treturn FALSE;\n      \n      r = 0;\n    }\n  }\n\n  /* If the last coef(s) were zero, emit an end-of-block code */\n  if (r > 0)\n    if (! emit_bits(state, actbl->ehufco[0], actbl->ehufsi[0]))\n      return FALSE;\n\n  return TRUE;\n}\n\n\n/*\n * Emit a restart marker & resynchronize predictions.\n */\n\nLOCAL(boolean)\nemit_restart (working_state * state, int restart_num)\n{\n  int ci;\n\n  if (! flush_bits(state))\n    return FALSE;\n\n  emit_byte(state, 0xFF, return FALSE);\n  emit_byte(state, JPEG_RST0 + restart_num, return FALSE);\n\n  /* Re-initialize DC predictions to 0 */\n  for (ci = 0; ci < state->cinfo->comps_in_scan; ci++)\n    state->cur.last_dc_val[ci] = 0;\n\n  /* The restart counter is not updated until we successfully write the MCU. */\n\n  return TRUE;\n}\n\n\n/*\n * Encode and output one MCU's worth of Huffman-compressed coefficients.\n */\n\nMETHODDEF(boolean)\nencode_mcu_huff (j_compress_ptr cinfo, JBLOCKROW *MCU_data)\n{\n  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;\n  working_state state;\n  int blkn, ci;\n  jpeg_component_info * compptr;\n\n  /* Load up working state */\n  state.next_output_byte = cinfo->dest->next_output_byte;\n  state.free_in_buffer = cinfo->dest->free_in_buffer;\n  ASSIGN_STATE(state.cur, entropy->saved);\n  state.cinfo = cinfo;\n\n  /* Emit restart marker if needed */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0)\n      if (! emit_restart(&state, entropy->next_restart_num))\n\treturn FALSE;\n  }\n\n  /* Encode the MCU data blocks */\n  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {\n    ci = cinfo->MCU_membership[blkn];\n    compptr = cinfo->cur_comp_info[ci];\n    if (! encode_one_block(&state,\n\t\t\t   MCU_data[blkn][0], state.cur.last_dc_val[ci],\n\t\t\t   entropy->dc_derived_tbls[compptr->dc_tbl_no],\n\t\t\t   entropy->ac_derived_tbls[compptr->ac_tbl_no]))\n      return FALSE;\n    /* Update last_dc_val */\n    state.cur.last_dc_val[ci] = MCU_data[blkn][0][0];\n  }\n\n  /* Completed MCU, so update state */\n  cinfo->dest->next_output_byte = state.next_output_byte;\n  cinfo->dest->free_in_buffer = state.free_in_buffer;\n  ASSIGN_STATE(entropy->saved, state.cur);\n\n  /* Update restart-interval state too */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0) {\n      entropy->restarts_to_go = cinfo->restart_interval;\n      entropy->next_restart_num++;\n      entropy->next_restart_num &= 7;\n    }\n    entropy->restarts_to_go--;\n  }\n\n  return TRUE;\n}\n\n\n/*\n * Finish up at the end of a Huffman-compressed scan.\n */\n\nMETHODDEF(void)\nfinish_pass_huff (j_compress_ptr cinfo)\n{\n  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;\n  working_state state;\n\n  /* Load up working state ... flush_bits needs it */\n  state.next_output_byte = cinfo->dest->next_output_byte;\n  state.free_in_buffer = cinfo->dest->free_in_buffer;\n  ASSIGN_STATE(state.cur, entropy->saved);\n  state.cinfo = cinfo;\n\n  /* Flush out the last data */\n  if (! flush_bits(&state))\n    ERREXIT(cinfo, JERR_CANT_SUSPEND);\n\n  /* Update state */\n  cinfo->dest->next_output_byte = state.next_output_byte;\n  cinfo->dest->free_in_buffer = state.free_in_buffer;\n  ASSIGN_STATE(entropy->saved, state.cur);\n}\n\n\n/*\n * Huffman coding optimization.\n *\n * We first scan the supplied data and count the number of uses of each symbol\n * that is to be Huffman-coded. (This process MUST agree with the code above.)\n * Then we build a Huffman coding tree for the observed counts.\n * Symbols which are not needed at all for the particular image are not\n * assigned any code, which saves space in the DHT marker as well as in\n * the compressed data.\n */\n\n#ifdef ENTROPY_OPT_SUPPORTED\n\n\n/* Process a single block's worth of coefficients */\n\nLOCAL(void)\nhtest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,\n\t\t long dc_counts[], long ac_counts[])\n{\n  register int temp;\n  register int nbits;\n  register int k, r;\n  \n  /* Encode the DC coefficient difference per section F.1.2.1 */\n  \n  temp = block[0] - last_dc_val;\n  if (temp < 0)\n    temp = -temp;\n  \n  /* Find the number of bits needed for the magnitude of the coefficient */\n  nbits = 0;\n  while (temp) {\n    nbits++;\n    temp >>= 1;\n  }\n  /* Check for out-of-range coefficient values.\n   * Since we're encoding a difference, the range limit is twice as much.\n   */\n  if (nbits > MAX_COEF_BITS+1)\n    ERREXIT(cinfo, JERR_BAD_DCT_COEF);\n\n  /* Count the Huffman symbol for the number of bits */\n  dc_counts[nbits]++;\n  \n  /* Encode the AC coefficients per section F.1.2.2 */\n  \n  r = 0;\t\t\t/* r = run length of zeros */\n  \n  for (k = 1; k < DCTSIZE2; k++) {\n    if ((temp = block[jpeg_natural_order[k]]) == 0) {\n      r++;\n    } else {\n      /* if run length > 15, must emit special run-length-16 codes (0xF0) */\n      while (r > 15) {\n\tac_counts[0xF0]++;\n\tr -= 16;\n      }\n      \n      /* Find the number of bits needed for the magnitude of the coefficient */\n      if (temp < 0)\n\ttemp = -temp;\n      \n      /* Find the number of bits needed for the magnitude of the coefficient */\n      nbits = 1;\t\t/* there must be at least one 1 bit */\n      while ((temp >>= 1))\n\tnbits++;\n      /* Check for out-of-range coefficient values */\n      if (nbits > MAX_COEF_BITS)\n\tERREXIT(cinfo, JERR_BAD_DCT_COEF);\n      \n      /* Count Huffman symbol for run length / number of bits */\n      ac_counts[(r << 4) + nbits]++;\n      \n      r = 0;\n    }\n  }\n\n  /* If the last coef(s) were zero, emit an end-of-block code */\n  if (r > 0)\n    ac_counts[0]++;\n}\n\n\n/*\n * Trial-encode one MCU's worth of Huffman-compressed coefficients.\n * No data is actually output, so no suspension return is possible.\n */\n\nMETHODDEF(boolean)\nencode_mcu_gather (j_compress_ptr cinfo, JBLOCKROW *MCU_data)\n{\n  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;\n  int blkn, ci;\n  jpeg_component_info * compptr;\n\n  /* Take care of restart intervals if needed */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0) {\n      /* Re-initialize DC predictions to 0 */\n      for (ci = 0; ci < cinfo->comps_in_scan; ci++)\n\tentropy->saved.last_dc_val[ci] = 0;\n      /* Update restart state */\n      entropy->restarts_to_go = cinfo->restart_interval;\n    }\n    entropy->restarts_to_go--;\n  }\n\n  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {\n    ci = cinfo->MCU_membership[blkn];\n    compptr = cinfo->cur_comp_info[ci];\n    htest_one_block(cinfo, MCU_data[blkn][0], entropy->saved.last_dc_val[ci],\n\t\t    entropy->dc_count_ptrs[compptr->dc_tbl_no],\n\t\t    entropy->ac_count_ptrs[compptr->ac_tbl_no]);\n    entropy->saved.last_dc_val[ci] = MCU_data[blkn][0][0];\n  }\n\n  return TRUE;\n}\n\n\n/*\n * Generate the best Huffman code table for the given counts, fill htbl.\n * Note this is also used by jcphuff.c.\n *\n * The JPEG standard requires that no symbol be assigned a codeword of all\n * one bits (so that padding bits added at the end of a compressed segment\n * can't look like a valid code).  Because of the canonical ordering of\n * codewords, this just means that there must be an unused slot in the\n * longest codeword length category.  Section K.2 of the JPEG spec suggests\n * reserving such a slot by pretending that symbol 256 is a valid symbol\n * with count 1.  In theory that's not optimal; giving it count zero but\n * including it in the symbol set anyway should give a better Huffman code.\n * But the theoretically better code actually seems to come out worse in\n * practice, because it produces more all-ones bytes (which incur stuffed\n * zero bytes in the final file).  In any case the difference is tiny.\n *\n * The JPEG standard requires Huffman codes to be no more than 16 bits long.\n * If some symbols have a very small but nonzero probability, the Huffman tree\n * must be adjusted to meet the code length restriction.  We currently use\n * the adjustment method suggested in JPEG section K.2.  This method is *not*\n * optimal; it may not choose the best possible limited-length code.  But\n * typically only very-low-frequency symbols will be given less-than-optimal\n * lengths, so the code is almost optimal.  Experimental comparisons against\n * an optimal limited-length-code algorithm indicate that the difference is\n * microscopic --- usually less than a hundredth of a percent of total size.\n * So the extra complexity of an optimal algorithm doesn't seem worthwhile.\n */\n\nGLOBAL(void)\njpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])\n{\n#define MAX_CLEN 32\t\t/* assumed maximum initial code length */\n  UINT8 bits[MAX_CLEN+1];\t/* bits[k] = # of symbols with code length k */\n  int codesize[257];\t\t/* codesize[k] = code length of symbol k */\n  int others[257];\t\t/* next symbol in current branch of tree */\n  int c1, c2;\n  int p, i, j;\n  long v;\n\n  /* This algorithm is explained in section K.2 of the JPEG standard */\n\n  MEMZERO(bits, SIZEOF(bits));\n  MEMZERO(codesize, SIZEOF(codesize));\n  for (i = 0; i < 257; i++)\n    others[i] = -1;\t\t/* init links to empty */\n  \n  freq[256] = 1;\t\t/* make sure 256 has a nonzero count */\n  /* Including the pseudo-symbol 256 in the Huffman procedure guarantees\n   * that no real symbol is given code-value of all ones, because 256\n   * will be placed last in the largest codeword category.\n   */\n\n  /* Huffman's basic algorithm to assign optimal code lengths to symbols */\n\n  for (;;) {\n    /* Find the smallest nonzero frequency, set c1 = its symbol */\n    /* In case of ties, take the larger symbol number */\n    c1 = -1;\n    v = 1000000000L;\n    for (i = 0; i <= 256; i++) {\n      if (freq[i] && freq[i] <= v) {\n\tv = freq[i];\n\tc1 = i;\n      }\n    }\n\n    /* Find the next smallest nonzero frequency, set c2 = its symbol */\n    /* In case of ties, take the larger symbol number */\n    c2 = -1;\n    v = 1000000000L;\n    for (i = 0; i <= 256; i++) {\n      if (freq[i] && freq[i] <= v && i != c1) {\n\tv = freq[i];\n\tc2 = i;\n      }\n    }\n\n    /* Done if we've merged everything into one frequency */\n    if (c2 < 0)\n      break;\n    \n    /* Else merge the two counts/trees */\n    freq[c1] += freq[c2];\n    freq[c2] = 0;\n\n    /* Increment the codesize of everything in c1's tree branch */\n    codesize[c1]++;\n    while (others[c1] >= 0) {\n      c1 = others[c1];\n      codesize[c1]++;\n    }\n    \n    others[c1] = c2;\t\t/* chain c2 onto c1's tree branch */\n    \n    /* Increment the codesize of everything in c2's tree branch */\n    codesize[c2]++;\n    while (others[c2] >= 0) {\n      c2 = others[c2];\n      codesize[c2]++;\n    }\n  }\n\n  /* Now count the number of symbols of each code length */\n  for (i = 0; i <= 256; i++) {\n    if (codesize[i]) {\n      /* The JPEG standard seems to think that this can't happen, */\n      /* but I'm paranoid... */\n      if (codesize[i] > MAX_CLEN)\n\tERREXIT(cinfo, JERR_HUFF_CLEN_OVERFLOW);\n\n      bits[codesize[i]]++;\n    }\n  }\n\n  /* JPEG doesn't allow symbols with code lengths over 16 bits, so if the pure\n   * Huffman procedure assigned any such lengths, we must adjust the coding.\n   * Here is what the JPEG spec says about how this next bit works:\n   * Since symbols are paired for the longest Huffman code, the symbols are\n   * removed from this length category two at a time.  The prefix for the pair\n   * (which is one bit shorter) is allocated to one of the pair; then,\n   * skipping the BITS entry for that prefix length, a code word from the next\n   * shortest nonzero BITS entry is converted into a prefix for two code words\n   * one bit longer.\n   */\n  \n  for (i = MAX_CLEN; i > 16; i--) {\n    while (bits[i] > 0) {\n      j = i - 2;\t\t/* find length of new prefix to be used */\n      while (bits[j] == 0)\n\tj--;\n      \n      bits[i] -= 2;\t\t/* remove two symbols */\n      bits[i-1]++;\t\t/* one goes in this length */\n      bits[j+1] += 2;\t\t/* two new symbols in this length */\n      bits[j]--;\t\t/* symbol of this length is now a prefix */\n    }\n  }\n\n  /* Remove the count for the pseudo-symbol 256 from the largest codelength */\n  while (bits[i] == 0)\t\t/* find largest codelength still in use */\n    i--;\n  bits[i]--;\n  \n  /* Return final symbol counts (only for lengths 0..16) */\n  MEMCOPY(htbl->bits, bits, SIZEOF(htbl->bits));\n  \n  /* Return a list of the symbols sorted by code length */\n  /* It's not real clear to me why we don't need to consider the codelength\n   * changes made above, but the JPEG spec seems to think this works.\n   */\n  p = 0;\n  for (i = 1; i <= MAX_CLEN; i++) {\n    for (j = 0; j <= 255; j++) {\n      if (codesize[j] == i) {\n\thtbl->huffval[p] = (UINT8) j;\n\tp++;\n      }\n    }\n  }\n\n  /* Set sent_table FALSE so updated table will be written to JPEG file. */\n  htbl->sent_table = FALSE;\n}\n\n\n/*\n * Finish up a statistics-gathering pass and create the new Huffman tables.\n */\n\nMETHODDEF(void)\nfinish_pass_gather (j_compress_ptr cinfo)\n{\n  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;\n  int ci, dctbl, actbl;\n  jpeg_component_info * compptr;\n  JHUFF_TBL **htblptr;\n  boolean did_dc[NUM_HUFF_TBLS];\n  boolean did_ac[NUM_HUFF_TBLS];\n\n  /* It's important not to apply jpeg_gen_optimal_table more than once\n   * per table, because it clobbers the input frequency counts!\n   */\n  MEMZERO(did_dc, SIZEOF(did_dc));\n  MEMZERO(did_ac, SIZEOF(did_ac));\n\n  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n    compptr = cinfo->cur_comp_info[ci];\n    dctbl = compptr->dc_tbl_no;\n    actbl = compptr->ac_tbl_no;\n    if (! did_dc[dctbl]) {\n      htblptr = & cinfo->dc_huff_tbl_ptrs[dctbl];\n      if (*htblptr == NULL)\n\t*htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);\n      jpeg_gen_optimal_table(cinfo, *htblptr, entropy->dc_count_ptrs[dctbl]);\n      did_dc[dctbl] = TRUE;\n    }\n    if (! did_ac[actbl]) {\n      htblptr = & cinfo->ac_huff_tbl_ptrs[actbl];\n      if (*htblptr == NULL)\n\t*htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);\n      jpeg_gen_optimal_table(cinfo, *htblptr, entropy->ac_count_ptrs[actbl]);\n      did_ac[actbl] = TRUE;\n    }\n  }\n}\n\n\n#endif /* ENTROPY_OPT_SUPPORTED */\n\n\n/*\n * Module initialization routine for Huffman entropy encoding.\n */\n\nGLOBAL(void)\njinit_huff_encoder (j_compress_ptr cinfo)\n{\n  huff_entropy_ptr entropy;\n  int i;\n\n  entropy = (huff_entropy_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(huff_entropy_encoder));\n  cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;\n  entropy->pub.start_pass = start_pass_huff;\n\n  /* Mark tables unallocated */\n  for (i = 0; i < NUM_HUFF_TBLS; i++) {\n    entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;\n#ifdef ENTROPY_OPT_SUPPORTED\n    entropy->dc_count_ptrs[i] = entropy->ac_count_ptrs[i] = NULL;\n#endif\n  }\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jcinit.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jcinit.c\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains initialization logic for the JPEG compressor.\n * This routine is in charge of selecting the modules to be executed and\n * making an initialization call to each one.\n *\n * Logically, this code belongs in jcmaster.c.  It's split out because\n * linking this routine implies linking the entire compression library.\n * For a transcoding-only application, we want to be able to use jcmaster.c\n * without linking in the whole library.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/*\n * Master selection of compression modules.\n * This is done once at the start of processing an image.  We determine\n * which modules will be used and give them appropriate initialization calls.\n */\n\nGLOBAL(void)\njinit_compress_master (j_compress_ptr cinfo)\n{\n  /* Initialize master control (includes parameter checking/processing) */\n  jinit_c_master_control(cinfo, FALSE /* full compression */);\n\n  /* Preprocessing */\n  if (! cinfo->raw_data_in) {\n    jinit_color_converter(cinfo);\n    jinit_downsampler(cinfo);\n    jinit_c_prep_controller(cinfo, FALSE /* never need full buffer here */);\n  }\n  /* Forward DCT */\n  jinit_forward_dct(cinfo);\n  /* Entropy encoding: either Huffman or arithmetic coding. */\n  if (cinfo->arith_code) {\n    ERREXIT(cinfo, JERR_ARITH_NOTIMPL);\n  } else {\n    if (cinfo->progressive_mode) {\n#ifdef C_PROGRESSIVE_SUPPORTED\n      jinit_phuff_encoder(cinfo);\n#else\n      ERREXIT(cinfo, JERR_NOT_COMPILED);\n#endif\n    } else\n      jinit_huff_encoder(cinfo);\n  }\n\n  /* Need a full-image coefficient buffer in any multi-pass mode. */\n  jinit_c_coef_controller(cinfo,\n\t\t(boolean) (cinfo->num_scans > 1 || cinfo->optimize_coding));\n  jinit_c_main_controller(cinfo, FALSE /* never need full buffer here */);\n\n  jinit_marker_writer(cinfo);\n\n  /* We can now tell the memory manager to allocate virtual arrays. */\n  (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);\n\n  /* Write the datastream header (SOI) immediately.\n   * Frame and scan headers are postponed till later.\n   * This lets application insert special markers after the SOI.\n   */\n  (*cinfo->marker->write_file_header) (cinfo);\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jcmainct.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jcmainct.c\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains the main buffer controller for compression.\n * The main buffer lies between the pre-processor and the JPEG\n * compressor proper; it holds downsampled data in the JPEG colorspace.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Note: currently, there is no operating mode in which a full-image buffer\n * is needed at this step.  If there were, that mode could not be used with\n * \"raw data\" input, since this module is bypassed in that case.  However,\n * we've left the code here for possible use in special applications.\n */\n#undef FULL_MAIN_BUFFER_SUPPORTED\n\n\n/* Private buffer controller object */\n\ntypedef struct {\n  struct jpeg_c_main_controller pub; /* public fields */\n\n  JDIMENSION cur_iMCU_row;\t/* number of current iMCU row */\n  JDIMENSION rowgroup_ctr;\t/* counts row groups received in iMCU row */\n  boolean suspended;\t\t/* remember if we suspended output */\n  J_BUF_MODE pass_mode;\t\t/* current operating mode */\n\n  /* If using just a strip buffer, this points to the entire set of buffers\n   * (we allocate one for each component).  In the full-image case, this\n   * points to the currently accessible strips of the virtual arrays.\n   */\n  JSAMPARRAY buffer[MAX_COMPONENTS];\n\n#ifdef FULL_MAIN_BUFFER_SUPPORTED\n  /* If using full-image storage, this array holds pointers to virtual-array\n   * control blocks for each component.  Unused if not full-image storage.\n   */\n  jvirt_sarray_ptr whole_image[MAX_COMPONENTS];\n#endif\n} my_main_controller;\n\ntypedef my_main_controller * my_main_ptr;\n\n\n/* Forward declarations */\nMETHODDEF(void) process_data_simple_main\n\tJPP((j_compress_ptr cinfo, JSAMPARRAY input_buf,\n\t     JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail));\n#ifdef FULL_MAIN_BUFFER_SUPPORTED\nMETHODDEF(void) process_data_buffer_main\n\tJPP((j_compress_ptr cinfo, JSAMPARRAY input_buf,\n\t     JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail));\n#endif\n\n\n/*\n * Initialize for a processing pass.\n */\n\nMETHODDEF(void)\nstart_pass_main (j_compress_ptr cinfo, J_BUF_MODE pass_mode)\n{\n  my_main_ptr main = (my_main_ptr) cinfo->main;\n\n  /* Do nothing in raw-data mode. */\n  if (cinfo->raw_data_in)\n    return;\n\n  main->cur_iMCU_row = 0;\t/* initialize counters */\n  main->rowgroup_ctr = 0;\n  main->suspended = FALSE;\n  main->pass_mode = pass_mode;\t/* save mode for use by process_data */\n\n  switch (pass_mode) {\n  case JBUF_PASS_THRU:\n#ifdef FULL_MAIN_BUFFER_SUPPORTED\n    if (main->whole_image[0] != NULL)\n      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n#endif\n    main->pub.process_data = process_data_simple_main;\n    break;\n#ifdef FULL_MAIN_BUFFER_SUPPORTED\n  case JBUF_SAVE_SOURCE:\n  case JBUF_CRANK_DEST:\n  case JBUF_SAVE_AND_PASS:\n    if (main->whole_image[0] == NULL)\n      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n    main->pub.process_data = process_data_buffer_main;\n    break;\n#endif\n  default:\n    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n    break;\n  }\n}\n\n\n/*\n * Process some data.\n * This routine handles the simple pass-through mode,\n * where we have only a strip buffer.\n */\n\nMETHODDEF(void)\nprocess_data_simple_main (j_compress_ptr cinfo,\n\t\t\t  JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,\n\t\t\t  JDIMENSION in_rows_avail)\n{\n  my_main_ptr main = (my_main_ptr) cinfo->main;\n\n  while (main->cur_iMCU_row < cinfo->total_iMCU_rows) {\n    /* Read input data if we haven't filled the main buffer yet */\n    if (main->rowgroup_ctr < DCTSIZE)\n      (*cinfo->prep->pre_process_data) (cinfo,\n\t\t\t\t\tinput_buf, in_row_ctr, in_rows_avail,\n\t\t\t\t\tmain->buffer, &main->rowgroup_ctr,\n\t\t\t\t\t(JDIMENSION) DCTSIZE);\n\n    /* If we don't have a full iMCU row buffered, return to application for\n     * more data.  Note that preprocessor will always pad to fill the iMCU row\n     * at the bottom of the image.\n     */\n    if (main->rowgroup_ctr != DCTSIZE)\n      return;\n\n    /* Send the completed row to the compressor */\n    if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) {\n      /* If compressor did not consume the whole row, then we must need to\n       * suspend processing and return to the application.  In this situation\n       * we pretend we didn't yet consume the last input row; otherwise, if\n       * it happened to be the last row of the image, the application would\n       * think we were done.\n       */\n      if (! main->suspended) {\n\t(*in_row_ctr)--;\n\tmain->suspended = TRUE;\n      }\n      return;\n    }\n    /* We did finish the row.  Undo our little suspension hack if a previous\n     * call suspended; then mark the main buffer empty.\n     */\n    if (main->suspended) {\n      (*in_row_ctr)++;\n      main->suspended = FALSE;\n    }\n    main->rowgroup_ctr = 0;\n    main->cur_iMCU_row++;\n  }\n}\n\n\n#ifdef FULL_MAIN_BUFFER_SUPPORTED\n\n/*\n * Process some data.\n * This routine handles all of the modes that use a full-size buffer.\n */\n\nMETHODDEF(void)\nprocess_data_buffer_main (j_compress_ptr cinfo,\n\t\t\t  JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,\n\t\t\t  JDIMENSION in_rows_avail)\n{\n  my_main_ptr main = (my_main_ptr) cinfo->main;\n  int ci;\n  jpeg_component_info *compptr;\n  boolean writing = (main->pass_mode != JBUF_CRANK_DEST);\n\n  while (main->cur_iMCU_row < cinfo->total_iMCU_rows) {\n    /* Realign the virtual buffers if at the start of an iMCU row. */\n    if (main->rowgroup_ctr == 0) {\n      for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n\t   ci++, compptr++) {\n\tmain->buffer[ci] = (*cinfo->mem->access_virt_sarray)\n\t  ((j_common_ptr) cinfo, main->whole_image[ci],\n\t   main->cur_iMCU_row * (compptr->v_samp_factor * DCTSIZE),\n\t   (JDIMENSION) (compptr->v_samp_factor * DCTSIZE), writing);\n      }\n      /* In a read pass, pretend we just read some source data. */\n      if (! writing) {\n\t*in_row_ctr += cinfo->max_v_samp_factor * DCTSIZE;\n\tmain->rowgroup_ctr = DCTSIZE;\n      }\n    }\n\n    /* If a write pass, read input data until the current iMCU row is full. */\n    /* Note: preprocessor will pad if necessary to fill the last iMCU row. */\n    if (writing) {\n      (*cinfo->prep->pre_process_data) (cinfo,\n\t\t\t\t\tinput_buf, in_row_ctr, in_rows_avail,\n\t\t\t\t\tmain->buffer, &main->rowgroup_ctr,\n\t\t\t\t\t(JDIMENSION) DCTSIZE);\n      /* Return to application if we need more data to fill the iMCU row. */\n      if (main->rowgroup_ctr < DCTSIZE)\n\treturn;\n    }\n\n    /* Emit data, unless this is a sink-only pass. */\n    if (main->pass_mode != JBUF_SAVE_SOURCE) {\n      if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) {\n\t/* If compressor did not consume the whole row, then we must need to\n\t * suspend processing and return to the application.  In this situation\n\t * we pretend we didn't yet consume the last input row; otherwise, if\n\t * it happened to be the last row of the image, the application would\n\t * think we were done.\n\t */\n\tif (! main->suspended) {\n\t  (*in_row_ctr)--;\n\t  main->suspended = TRUE;\n\t}\n\treturn;\n      }\n      /* We did finish the row.  Undo our little suspension hack if a previous\n       * call suspended; then mark the main buffer empty.\n       */\n      if (main->suspended) {\n\t(*in_row_ctr)++;\n\tmain->suspended = FALSE;\n      }\n    }\n\n    /* If get here, we are done with this iMCU row.  Mark buffer empty. */\n    main->rowgroup_ctr = 0;\n    main->cur_iMCU_row++;\n  }\n}\n\n#endif /* FULL_MAIN_BUFFER_SUPPORTED */\n\n\n/*\n * Initialize main buffer controller.\n */\n\nGLOBAL(void)\njinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer)\n{\n  my_main_ptr main;\n  int ci;\n  jpeg_component_info *compptr;\n\n  main = (my_main_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_main_controller));\n  cinfo->main = (struct jpeg_c_main_controller *) main;\n  main->pub.start_pass = start_pass_main;\n\n  /* We don't need to create a buffer in raw-data mode. */\n  if (cinfo->raw_data_in)\n    return;\n\n  /* Create the buffer.  It holds downsampled data, so each component\n   * may be of a different size.\n   */\n  if (need_full_buffer) {\n#ifdef FULL_MAIN_BUFFER_SUPPORTED\n    /* Allocate a full-image virtual array for each component */\n    /* Note we pad the bottom to a multiple of the iMCU height */\n    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n\t ci++, compptr++) {\n      main->whole_image[ci] = (*cinfo->mem->request_virt_sarray)\n\t((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,\n\t compptr->width_in_blocks * DCTSIZE,\n\t (JDIMENSION) jround_up((long) compptr->height_in_blocks,\n\t\t\t\t(long) compptr->v_samp_factor) * DCTSIZE,\n\t (JDIMENSION) (compptr->v_samp_factor * DCTSIZE));\n    }\n#else\n    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n#endif\n  } else {\n#ifdef FULL_MAIN_BUFFER_SUPPORTED\n    main->whole_image[0] = NULL; /* flag for no virtual arrays */\n#endif\n    /* Allocate a strip buffer for each component */\n    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n\t ci++, compptr++) {\n      main->buffer[ci] = (*cinfo->mem->alloc_sarray)\n\t((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t compptr->width_in_blocks * DCTSIZE,\n\t (JDIMENSION) (compptr->v_samp_factor * DCTSIZE));\n    }\n  }\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jcmarker.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jcmarker.c\n *\n * Copyright (C) 1991-1998, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains routines to write JPEG datastream markers.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\ntypedef enum {\t\t\t/* JPEG marker codes */\n  M_SOF0  = 0xc0,\n  M_SOF1  = 0xc1,\n  M_SOF2  = 0xc2,\n  M_SOF3  = 0xc3,\n  \n  M_SOF5  = 0xc5,\n  M_SOF6  = 0xc6,\n  M_SOF7  = 0xc7,\n  \n  M_JPG   = 0xc8,\n  M_SOF9  = 0xc9,\n  M_SOF10 = 0xca,\n  M_SOF11 = 0xcb,\n  \n  M_SOF13 = 0xcd,\n  M_SOF14 = 0xce,\n  M_SOF15 = 0xcf,\n  \n  M_DHT   = 0xc4,\n  \n  M_DAC   = 0xcc,\n  \n  M_RST0  = 0xd0,\n  M_RST1  = 0xd1,\n  M_RST2  = 0xd2,\n  M_RST3  = 0xd3,\n  M_RST4  = 0xd4,\n  M_RST5  = 0xd5,\n  M_RST6  = 0xd6,\n  M_RST7  = 0xd7,\n  \n  M_SOI   = 0xd8,\n  M_EOI   = 0xd9,\n  M_SOS   = 0xda,\n  M_DQT   = 0xdb,\n  M_DNL   = 0xdc,\n  M_DRI   = 0xdd,\n  M_DHP   = 0xde,\n  M_EXP   = 0xdf,\n  \n  M_APP0  = 0xe0,\n  M_APP1  = 0xe1,\n  M_APP2  = 0xe2,\n  M_APP3  = 0xe3,\n  M_APP4  = 0xe4,\n  M_APP5  = 0xe5,\n  M_APP6  = 0xe6,\n  M_APP7  = 0xe7,\n  M_APP8  = 0xe8,\n  M_APP9  = 0xe9,\n  M_APP10 = 0xea,\n  M_APP11 = 0xeb,\n  M_APP12 = 0xec,\n  M_APP13 = 0xed,\n  M_APP14 = 0xee,\n  M_APP15 = 0xef,\n  \n  M_JPG0  = 0xf0,\n  M_JPG13 = 0xfd,\n  M_COM   = 0xfe,\n  \n  M_TEM   = 0x01,\n  \n  M_ERROR = 0x100\n} JPEG_MARKER;\n\n\n/* Private state */\n\ntypedef struct {\n  struct jpeg_marker_writer pub; /* public fields */\n\n  unsigned int last_restart_interval; /* last DRI value emitted; 0 after SOI */\n} my_marker_writer;\n\ntypedef my_marker_writer * my_marker_ptr;\n\n\n/*\n * Basic output routines.\n *\n * Note that we do not support suspension while writing a marker.\n * Therefore, an application using suspension must ensure that there is\n * enough buffer space for the initial markers (typ. 600-700 bytes) before\n * calling jpeg_start_compress, and enough space to write the trailing EOI\n * (a few bytes) before calling jpeg_finish_compress.  Multipass compression\n * modes are not supported at all with suspension, so those two are the only\n * points where markers will be written.\n */\n\nLOCAL(void)\nemit_byte (j_compress_ptr cinfo, int val)\n/* Emit a byte */\n{\n  struct jpeg_destination_mgr * dest = cinfo->dest;\n\n  *(dest->next_output_byte)++ = (JOCTET) val;\n  if (--dest->free_in_buffer == 0) {\n    if (! (*dest->empty_output_buffer) (cinfo))\n      ERREXIT(cinfo, JERR_CANT_SUSPEND);\n  }\n}\n\n\nLOCAL(void)\nemit_marker (j_compress_ptr cinfo, JPEG_MARKER mark)\n/* Emit a marker code */\n{\n  emit_byte(cinfo, 0xFF);\n  emit_byte(cinfo, (int) mark);\n}\n\n\nLOCAL(void)\nemit_2bytes (j_compress_ptr cinfo, int value)\n/* Emit a 2-byte integer; these are always MSB first in JPEG files */\n{\n  emit_byte(cinfo, (value >> 8) & 0xFF);\n  emit_byte(cinfo, value & 0xFF);\n}\n\n\n/*\n * Routines to write specific marker types.\n */\n\nLOCAL(int)\nemit_dqt (j_compress_ptr cinfo, int index)\n/* Emit a DQT marker */\n/* Returns the precision used (0 = 8bits, 1 = 16bits) for baseline checking */\n{\n  JQUANT_TBL * qtbl = cinfo->quant_tbl_ptrs[index];\n  int prec;\n  int i;\n\n  if (qtbl == NULL)\n    ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, index);\n\n  prec = 0;\n  for (i = 0; i < DCTSIZE2; i++) {\n    if (qtbl->quantval[i] > 255)\n      prec = 1;\n  }\n\n  if (! qtbl->sent_table) {\n    emit_marker(cinfo, M_DQT);\n\n    emit_2bytes(cinfo, prec ? DCTSIZE2*2 + 1 + 2 : DCTSIZE2 + 1 + 2);\n\n    emit_byte(cinfo, index + (prec<<4));\n\n    for (i = 0; i < DCTSIZE2; i++) {\n      /* The table entries must be emitted in zigzag order. */\n      unsigned int qval = qtbl->quantval[jpeg_natural_order[i]];\n      if (prec)\n\temit_byte(cinfo, (int) (qval >> 8));\n      emit_byte(cinfo, (int) (qval & 0xFF));\n    }\n\n    qtbl->sent_table = TRUE;\n  }\n\n  return prec;\n}\n\n\nLOCAL(void)\nemit_dht (j_compress_ptr cinfo, int index, boolean is_ac)\n/* Emit a DHT marker */\n{\n  JHUFF_TBL * htbl;\n  int length, i;\n  \n  if (is_ac) {\n    htbl = cinfo->ac_huff_tbl_ptrs[index];\n    index += 0x10;\t\t/* output index has AC bit set */\n  } else {\n    htbl = cinfo->dc_huff_tbl_ptrs[index];\n  }\n\n  if (htbl == NULL)\n    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, index);\n  \n  if (! htbl->sent_table) {\n    emit_marker(cinfo, M_DHT);\n    \n    length = 0;\n    for (i = 1; i <= 16; i++)\n      length += htbl->bits[i];\n    \n    emit_2bytes(cinfo, length + 2 + 1 + 16);\n    emit_byte(cinfo, index);\n    \n    for (i = 1; i <= 16; i++)\n      emit_byte(cinfo, htbl->bits[i]);\n    \n    for (i = 0; i < length; i++)\n      emit_byte(cinfo, htbl->huffval[i]);\n    \n    htbl->sent_table = TRUE;\n  }\n}\n\n\nLOCAL(void)\nemit_dac (j_compress_ptr cinfo)\n/* Emit a DAC marker */\n/* Since the useful info is so small, we want to emit all the tables in */\n/* one DAC marker.  Therefore this routine does its own scan of the table. */\n{\n#ifdef C_ARITH_CODING_SUPPORTED\n  char dc_in_use[NUM_ARITH_TBLS];\n  char ac_in_use[NUM_ARITH_TBLS];\n  int length, i;\n  jpeg_component_info *compptr;\n  \n  for (i = 0; i < NUM_ARITH_TBLS; i++)\n    dc_in_use[i] = ac_in_use[i] = 0;\n  \n  for (i = 0; i < cinfo->comps_in_scan; i++) {\n    compptr = cinfo->cur_comp_info[i];\n    dc_in_use[compptr->dc_tbl_no] = 1;\n    ac_in_use[compptr->ac_tbl_no] = 1;\n  }\n  \n  length = 0;\n  for (i = 0; i < NUM_ARITH_TBLS; i++)\n    length += dc_in_use[i] + ac_in_use[i];\n  \n  emit_marker(cinfo, M_DAC);\n  \n  emit_2bytes(cinfo, length*2 + 2);\n  \n  for (i = 0; i < NUM_ARITH_TBLS; i++) {\n    if (dc_in_use[i]) {\n      emit_byte(cinfo, i);\n      emit_byte(cinfo, cinfo->arith_dc_L[i] + (cinfo->arith_dc_U[i]<<4));\n    }\n    if (ac_in_use[i]) {\n      emit_byte(cinfo, i + 0x10);\n      emit_byte(cinfo, cinfo->arith_ac_K[i]);\n    }\n  }\n#endif /* C_ARITH_CODING_SUPPORTED */\n}\n\n\nLOCAL(void)\nemit_dri (j_compress_ptr cinfo)\n/* Emit a DRI marker */\n{\n  emit_marker(cinfo, M_DRI);\n  \n  emit_2bytes(cinfo, 4);\t/* fixed length */\n\n  emit_2bytes(cinfo, (int) cinfo->restart_interval);\n}\n\n\nLOCAL(void)\nemit_sof (j_compress_ptr cinfo, JPEG_MARKER code)\n/* Emit a SOF marker */\n{\n  int ci;\n  jpeg_component_info *compptr;\n  \n  emit_marker(cinfo, code);\n  \n  emit_2bytes(cinfo, 3 * cinfo->num_components + 2 + 5 + 1); /* length */\n\n  /* Make sure image isn't bigger than SOF field can handle */\n  if ((long) cinfo->image_height > 65535L ||\n      (long) cinfo->image_width > 65535L)\n    ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) 65535);\n\n  emit_byte(cinfo, cinfo->data_precision);\n  emit_2bytes(cinfo, (int) cinfo->image_height);\n  emit_2bytes(cinfo, (int) cinfo->image_width);\n\n  emit_byte(cinfo, cinfo->num_components);\n\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    emit_byte(cinfo, compptr->component_id);\n    emit_byte(cinfo, (compptr->h_samp_factor << 4) + compptr->v_samp_factor);\n    emit_byte(cinfo, compptr->quant_tbl_no);\n  }\n}\n\n\nLOCAL(void)\nemit_sos (j_compress_ptr cinfo)\n/* Emit a SOS marker */\n{\n  int i, td, ta;\n  jpeg_component_info *compptr;\n  \n  emit_marker(cinfo, M_SOS);\n  \n  emit_2bytes(cinfo, 2 * cinfo->comps_in_scan + 2 + 1 + 3); /* length */\n  \n  emit_byte(cinfo, cinfo->comps_in_scan);\n  \n  for (i = 0; i < cinfo->comps_in_scan; i++) {\n    compptr = cinfo->cur_comp_info[i];\n    emit_byte(cinfo, compptr->component_id);\n    td = compptr->dc_tbl_no;\n    ta = compptr->ac_tbl_no;\n    if (cinfo->progressive_mode) {\n      /* Progressive mode: only DC or only AC tables are used in one scan;\n       * furthermore, Huffman coding of DC refinement uses no table at all.\n       * We emit 0 for unused field(s); this is recommended by the P&M text\n       * but does not seem to be specified in the standard.\n       */\n      if (cinfo->Ss == 0) {\n\tta = 0;\t\t\t/* DC scan */\n\tif (cinfo->Ah != 0 && !cinfo->arith_code)\n\t  td = 0;\t\t/* no DC table either */\n      } else {\n\ttd = 0;\t\t\t/* AC scan */\n      }\n    }\n    emit_byte(cinfo, (td << 4) + ta);\n  }\n\n  emit_byte(cinfo, cinfo->Ss);\n  emit_byte(cinfo, cinfo->Se);\n  emit_byte(cinfo, (cinfo->Ah << 4) + cinfo->Al);\n}\n\n\nLOCAL(void)\nemit_jfif_app0 (j_compress_ptr cinfo)\n/* Emit a JFIF-compliant APP0 marker */\n{\n  /*\n   * Length of APP0 block\t(2 bytes)\n   * Block ID\t\t\t(4 bytes - ASCII \"JFIF\")\n   * Zero byte\t\t\t(1 byte to terminate the ID string)\n   * Version Major, Minor\t(2 bytes - major first)\n   * Units\t\t\t(1 byte - 0x00 = none, 0x01 = inch, 0x02 = cm)\n   * Xdpu\t\t\t(2 bytes - dots per unit horizontal)\n   * Ydpu\t\t\t(2 bytes - dots per unit vertical)\n   * Thumbnail X size\t\t(1 byte)\n   * Thumbnail Y size\t\t(1 byte)\n   */\n  \n  emit_marker(cinfo, M_APP0);\n  \n  emit_2bytes(cinfo, 2 + 4 + 1 + 2 + 1 + 2 + 2 + 1 + 1); /* length */\n\n  emit_byte(cinfo, 0x4A);\t/* Identifier: ASCII \"JFIF\" */\n  emit_byte(cinfo, 0x46);\n  emit_byte(cinfo, 0x49);\n  emit_byte(cinfo, 0x46);\n  emit_byte(cinfo, 0);\n  emit_byte(cinfo, cinfo->JFIF_major_version); /* Version fields */\n  emit_byte(cinfo, cinfo->JFIF_minor_version);\n  emit_byte(cinfo, cinfo->density_unit); /* Pixel size information */\n  emit_2bytes(cinfo, (int) cinfo->X_density);\n  emit_2bytes(cinfo, (int) cinfo->Y_density);\n  emit_byte(cinfo, 0);\t\t/* No thumbnail image */\n  emit_byte(cinfo, 0);\n}\n\n\nLOCAL(void)\nemit_adobe_app14 (j_compress_ptr cinfo)\n/* Emit an Adobe APP14 marker */\n{\n  /*\n   * Length of APP14 block\t(2 bytes)\n   * Block ID\t\t\t(5 bytes - ASCII \"Adobe\")\n   * Version Number\t\t(2 bytes - currently 100)\n   * Flags0\t\t\t(2 bytes - currently 0)\n   * Flags1\t\t\t(2 bytes - currently 0)\n   * Color transform\t\t(1 byte)\n   *\n   * Although Adobe TN 5116 mentions Version = 101, all the Adobe files\n   * now in circulation seem to use Version = 100, so that's what we write.\n   *\n   * We write the color transform byte as 1 if the JPEG color space is\n   * YCbCr, 2 if it's YCCK, 0 otherwise.  Adobe's definition has to do with\n   * whether the encoder performed a transformation, which is pretty useless.\n   */\n  \n  emit_marker(cinfo, M_APP14);\n  \n  emit_2bytes(cinfo, 2 + 5 + 2 + 2 + 2 + 1); /* length */\n\n  emit_byte(cinfo, 0x41);\t/* Identifier: ASCII \"Adobe\" */\n  emit_byte(cinfo, 0x64);\n  emit_byte(cinfo, 0x6F);\n  emit_byte(cinfo, 0x62);\n  emit_byte(cinfo, 0x65);\n  emit_2bytes(cinfo, 100);\t/* Version */\n  emit_2bytes(cinfo, 0);\t/* Flags0 */\n  emit_2bytes(cinfo, 0);\t/* Flags1 */\n  switch (cinfo->jpeg_color_space) {\n  case JCS_YCbCr:\n    emit_byte(cinfo, 1);\t/* Color transform = 1 */\n    break;\n  case JCS_YCCK:\n    emit_byte(cinfo, 2);\t/* Color transform = 2 */\n    break;\n  default:\n    emit_byte(cinfo, 0);\t/* Color transform = 0 */\n    break;\n  }\n}\n\n\n/*\n * These routines allow writing an arbitrary marker with parameters.\n * The only intended use is to emit COM or APPn markers after calling\n * write_file_header and before calling write_frame_header.\n * Other uses are not guaranteed to produce desirable results.\n * Counting the parameter bytes properly is the caller's responsibility.\n */\n\nMETHODDEF(void)\nwrite_marker_header (j_compress_ptr cinfo, int marker, unsigned int datalen)\n/* Emit an arbitrary marker header */\n{\n  if (datalen > (unsigned int) 65533)\t\t/* safety check */\n    ERREXIT(cinfo, JERR_BAD_LENGTH);\n\n  emit_marker(cinfo, (JPEG_MARKER) marker);\n\n  emit_2bytes(cinfo, (int) (datalen + 2));\t/* total length */\n}\n\nMETHODDEF(void)\nwrite_marker_byte (j_compress_ptr cinfo, int val)\n/* Emit one byte of marker parameters following write_marker_header */\n{\n  emit_byte(cinfo, val);\n}\n\n\n/*\n * Write datastream header.\n * This consists of an SOI and optional APPn markers.\n * We recommend use of the JFIF marker, but not the Adobe marker,\n * when using YCbCr or grayscale data.  The JFIF marker should NOT\n * be used for any other JPEG colorspace.  The Adobe marker is helpful\n * to distinguish RGB, CMYK, and YCCK colorspaces.\n * Note that an application can write additional header markers after\n * jpeg_start_compress returns.\n */\n\nMETHODDEF(void)\nwrite_file_header (j_compress_ptr cinfo)\n{\n  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;\n\n  emit_marker(cinfo, M_SOI);\t/* first the SOI */\n\n  /* SOI is defined to reset restart interval to 0 */\n  marker->last_restart_interval = 0;\n\n  if (cinfo->write_JFIF_header)\t/* next an optional JFIF APP0 */\n    emit_jfif_app0(cinfo);\n  if (cinfo->write_Adobe_marker) /* next an optional Adobe APP14 */\n    emit_adobe_app14(cinfo);\n}\n\n\n/*\n * Write frame header.\n * This consists of DQT and SOFn markers.\n * Note that we do not emit the SOF until we have emitted the DQT(s).\n * This avoids compatibility problems with incorrect implementations that\n * try to error-check the quant table numbers as soon as they see the SOF.\n */\n\nMETHODDEF(void)\nwrite_frame_header (j_compress_ptr cinfo)\n{\n  int ci, prec;\n  boolean is_baseline;\n  jpeg_component_info *compptr;\n  \n  /* Emit DQT for each quantization table.\n   * Note that emit_dqt() suppresses any duplicate tables.\n   */\n  prec = 0;\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    prec += emit_dqt(cinfo, compptr->quant_tbl_no);\n  }\n  /* now prec is nonzero iff there are any 16-bit quant tables. */\n\n  /* Check for a non-baseline specification.\n   * Note we assume that Huffman table numbers won't be changed later.\n   */\n  if (cinfo->arith_code || cinfo->progressive_mode ||\n      cinfo->data_precision != 8) {\n    is_baseline = FALSE;\n  } else {\n    is_baseline = TRUE;\n    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n\t ci++, compptr++) {\n      if (compptr->dc_tbl_no > 1 || compptr->ac_tbl_no > 1)\n\tis_baseline = FALSE;\n    }\n    if (prec && is_baseline) {\n      is_baseline = FALSE;\n      /* If it's baseline except for quantizer size, warn the user */\n      TRACEMS(cinfo, 0, JTRC_16BIT_TABLES);\n    }\n  }\n\n  /* Emit the proper SOF marker */\n  if (cinfo->arith_code) {\n    emit_sof(cinfo, M_SOF9);\t/* SOF code for arithmetic coding */\n  } else {\n    if (cinfo->progressive_mode)\n      emit_sof(cinfo, M_SOF2);\t/* SOF code for progressive Huffman */\n    else if (is_baseline)\n      emit_sof(cinfo, M_SOF0);\t/* SOF code for baseline implementation */\n    else\n      emit_sof(cinfo, M_SOF1);\t/* SOF code for non-baseline Huffman file */\n  }\n}\n\n\n/*\n * Write scan header.\n * This consists of DHT or DAC markers, optional DRI, and SOS.\n * Compressed data will be written following the SOS.\n */\n\nMETHODDEF(void)\nwrite_scan_header (j_compress_ptr cinfo)\n{\n  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;\n  int i;\n  jpeg_component_info *compptr;\n\n  if (cinfo->arith_code) {\n    /* Emit arith conditioning info.  We may have some duplication\n     * if the file has multiple scans, but it's so small it's hardly\n     * worth worrying about.\n     */\n    emit_dac(cinfo);\n  } else {\n    /* Emit Huffman tables.\n     * Note that emit_dht() suppresses any duplicate tables.\n     */\n    for (i = 0; i < cinfo->comps_in_scan; i++) {\n      compptr = cinfo->cur_comp_info[i];\n      if (cinfo->progressive_mode) {\n\t/* Progressive mode: only DC or only AC tables are used in one scan */\n\tif (cinfo->Ss == 0) {\n\t  if (cinfo->Ah == 0)\t/* DC needs no table for refinement scan */\n\t    emit_dht(cinfo, compptr->dc_tbl_no, FALSE);\n\t} else {\n\t  emit_dht(cinfo, compptr->ac_tbl_no, TRUE);\n\t}\n      } else {\n\t/* Sequential mode: need both DC and AC tables */\n\temit_dht(cinfo, compptr->dc_tbl_no, FALSE);\n\temit_dht(cinfo, compptr->ac_tbl_no, TRUE);\n      }\n    }\n  }\n\n  /* Emit DRI if required --- note that DRI value could change for each scan.\n   * We avoid wasting space with unnecessary DRIs, however.\n   */\n  if (cinfo->restart_interval != marker->last_restart_interval) {\n    emit_dri(cinfo);\n    marker->last_restart_interval = cinfo->restart_interval;\n  }\n\n  emit_sos(cinfo);\n}\n\n\n/*\n * Write datastream trailer.\n */\n\nMETHODDEF(void)\nwrite_file_trailer (j_compress_ptr cinfo)\n{\n  emit_marker(cinfo, M_EOI);\n}\n\n\n/*\n * Write an abbreviated table-specification datastream.\n * This consists of SOI, DQT and DHT tables, and EOI.\n * Any table that is defined and not marked sent_table = TRUE will be\n * emitted.  Note that all tables will be marked sent_table = TRUE at exit.\n */\n\nMETHODDEF(void)\nwrite_tables_only (j_compress_ptr cinfo)\n{\n  int i;\n\n  emit_marker(cinfo, M_SOI);\n\n  for (i = 0; i < NUM_QUANT_TBLS; i++) {\n    if (cinfo->quant_tbl_ptrs[i] != NULL)\n      (void) emit_dqt(cinfo, i);\n  }\n\n  if (! cinfo->arith_code) {\n    for (i = 0; i < NUM_HUFF_TBLS; i++) {\n      if (cinfo->dc_huff_tbl_ptrs[i] != NULL)\n\temit_dht(cinfo, i, FALSE);\n      if (cinfo->ac_huff_tbl_ptrs[i] != NULL)\n\temit_dht(cinfo, i, TRUE);\n    }\n  }\n\n  emit_marker(cinfo, M_EOI);\n}\n\n\n/*\n * Initialize the marker writer module.\n */\n\nGLOBAL(void)\njinit_marker_writer (j_compress_ptr cinfo)\n{\n  my_marker_ptr marker;\n\n  /* Create the subobject */\n  marker = (my_marker_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_marker_writer));\n  cinfo->marker = (struct jpeg_marker_writer *) marker;\n  /* Initialize method pointers */\n  marker->pub.write_file_header = write_file_header;\n  marker->pub.write_frame_header = write_frame_header;\n  marker->pub.write_scan_header = write_scan_header;\n  marker->pub.write_file_trailer = write_file_trailer;\n  marker->pub.write_tables_only = write_tables_only;\n  marker->pub.write_marker_header = write_marker_header;\n  marker->pub.write_marker_byte = write_marker_byte;\n  /* Initialize private state */\n  marker->last_restart_interval = 0;\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jcmaster.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jcmaster.c\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains master control logic for the JPEG compressor.\n * These routines are concerned with parameter validation, initial setup,\n * and inter-pass control (determining the number of passes and the work \n * to be done in each pass).\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Private state */\n\ntypedef enum {\n\tmain_pass,\t\t/* input data, also do first output step */\n\thuff_opt_pass,\t\t/* Huffman code optimization pass */\n\toutput_pass\t\t/* data output pass */\n} c_pass_type;\n\ntypedef struct {\n  struct jpeg_comp_master pub;\t/* public fields */\n\n  c_pass_type pass_type;\t/* the type of the current pass */\n\n  int pass_number;\t\t/* # of passes completed */\n  int total_passes;\t\t/* total # of passes needed */\n\n  int scan_number;\t\t/* current index in scan_info[] */\n} my_comp_master;\n\ntypedef my_comp_master * my_master_ptr;\n\n\n/*\n * Support routines that do various essential calculations.\n */\n\nLOCAL(void)\ninitial_setup (j_compress_ptr cinfo)\n/* Do computations that are needed before master selection phase */\n{\n  int ci;\n  jpeg_component_info *compptr;\n  long samplesperrow;\n  JDIMENSION jd_samplesperrow;\n\n  /* Sanity check on image dimensions */\n  if (cinfo->image_height <= 0 || cinfo->image_width <= 0\n      || cinfo->num_components <= 0 || cinfo->input_components <= 0)\n    ERREXIT(cinfo, JERR_EMPTY_IMAGE);\n\n  /* Make sure image isn't bigger than I can handle */\n  if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION ||\n      (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION)\n    ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);\n\n  /* Width of an input scanline must be representable as JDIMENSION. */\n  samplesperrow = (long) cinfo->image_width * (long) cinfo->input_components;\n  jd_samplesperrow = (JDIMENSION) samplesperrow;\n  if ((long) jd_samplesperrow != samplesperrow)\n    ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);\n\n  /* For now, precision must match compiled-in value... */\n  if (cinfo->data_precision != BITS_IN_JSAMPLE)\n    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);\n\n  /* Check that number of components won't exceed internal array sizes */\n  if (cinfo->num_components > MAX_COMPONENTS)\n    ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,\n\t     MAX_COMPONENTS);\n\n  /* Compute maximum sampling factors; check factor validity */\n  cinfo->max_h_samp_factor = 1;\n  cinfo->max_v_samp_factor = 1;\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR ||\n\tcompptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR)\n      ERREXIT(cinfo, JERR_BAD_SAMPLING);\n    cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor,\n\t\t\t\t   compptr->h_samp_factor);\n    cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor,\n\t\t\t\t   compptr->v_samp_factor);\n  }\n\n  /* Compute dimensions of components */\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    /* Fill in the correct component_index value; don't rely on application */\n    compptr->component_index = ci;\n    /* For compression, we never do DCT scaling. */\n    compptr->DCT_scaled_size = DCTSIZE;\n    /* Size in DCT blocks */\n    compptr->width_in_blocks = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,\n\t\t    (long) (cinfo->max_h_samp_factor * DCTSIZE));\n    compptr->height_in_blocks = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,\n\t\t    (long) (cinfo->max_v_samp_factor * DCTSIZE));\n    /* Size in samples */\n    compptr->downsampled_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,\n\t\t    (long) cinfo->max_h_samp_factor);\n    compptr->downsampled_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,\n\t\t    (long) cinfo->max_v_samp_factor);\n    /* Mark component needed (this flag isn't actually used for compression) */\n    compptr->component_needed = TRUE;\n  }\n\n  /* Compute number of fully interleaved MCU rows (number of times that\n   * main controller will call coefficient controller).\n   */\n  cinfo->total_iMCU_rows = (JDIMENSION)\n    jdiv_round_up((long) cinfo->image_height,\n\t\t  (long) (cinfo->max_v_samp_factor*DCTSIZE));\n}\n\n\n#ifdef C_MULTISCAN_FILES_SUPPORTED\n\nLOCAL(void)\nvalidate_script (j_compress_ptr cinfo)\n/* Verify that the scan script in cinfo->scan_info[] is valid; also\n * determine whether it uses progressive JPEG, and set cinfo->progressive_mode.\n */\n{\n  const jpeg_scan_info * scanptr;\n  int scanno, ncomps, ci, coefi, thisi;\n  int Ss, Se, Ah, Al;\n  boolean component_sent[MAX_COMPONENTS];\n#ifdef C_PROGRESSIVE_SUPPORTED\n  int * last_bitpos_ptr;\n  int last_bitpos[MAX_COMPONENTS][DCTSIZE2];\n  /* -1 until that coefficient has been seen; then last Al for it */\n#endif\n\n  if (cinfo->num_scans <= 0)\n    ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, 0);\n\n  /* For sequential JPEG, all scans must have Ss=0, Se=DCTSIZE2-1;\n   * for progressive JPEG, no scan can have this.\n   */\n  scanptr = cinfo->scan_info;\n  if (scanptr->Ss != 0 || scanptr->Se != DCTSIZE2-1) {\n#ifdef C_PROGRESSIVE_SUPPORTED\n    cinfo->progressive_mode = TRUE;\n    last_bitpos_ptr = & last_bitpos[0][0];\n    for (ci = 0; ci < cinfo->num_components; ci++) \n      for (coefi = 0; coefi < DCTSIZE2; coefi++)\n\t*last_bitpos_ptr++ = -1;\n#else\n    ERREXIT(cinfo, JERR_NOT_COMPILED);\n#endif\n  } else {\n    cinfo->progressive_mode = FALSE;\n    for (ci = 0; ci < cinfo->num_components; ci++) \n      component_sent[ci] = FALSE;\n  }\n\n  for (scanno = 1; scanno <= cinfo->num_scans; scanptr++, scanno++) {\n    /* Validate component indexes */\n    ncomps = scanptr->comps_in_scan;\n    if (ncomps <= 0 || ncomps > MAX_COMPS_IN_SCAN)\n      ERREXIT2(cinfo, JERR_COMPONENT_COUNT, ncomps, MAX_COMPS_IN_SCAN);\n    for (ci = 0; ci < ncomps; ci++) {\n      thisi = scanptr->component_index[ci];\n      if (thisi < 0 || thisi >= cinfo->num_components)\n\tERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);\n      /* Components must appear in SOF order within each scan */\n      if (ci > 0 && thisi <= scanptr->component_index[ci-1])\n\tERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);\n    }\n    /* Validate progression parameters */\n    Ss = scanptr->Ss;\n    Se = scanptr->Se;\n    Ah = scanptr->Ah;\n    Al = scanptr->Al;\n    if (cinfo->progressive_mode) {\n#ifdef C_PROGRESSIVE_SUPPORTED\n      /* The JPEG spec simply gives the ranges 0..13 for Ah and Al, but that\n       * seems wrong: the upper bound ought to depend on data precision.\n       * Perhaps they really meant 0..N+1 for N-bit precision.\n       * Here we allow 0..10 for 8-bit data; Al larger than 10 results in\n       * out-of-range reconstructed DC values during the first DC scan,\n       * which might cause problems for some decoders.\n       */\n#if BITS_IN_JSAMPLE == 8\n#define MAX_AH_AL 10\n#else\n#define MAX_AH_AL 13\n#endif\n      if (Ss < 0 || Ss >= DCTSIZE2 || Se < Ss || Se >= DCTSIZE2 ||\n\t  Ah < 0 || Ah > MAX_AH_AL || Al < 0 || Al > MAX_AH_AL)\n\tERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);\n      if (Ss == 0) {\n\tif (Se != 0)\t\t/* DC and AC together not OK */\n\t  ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);\n      } else {\n\tif (ncomps != 1)\t/* AC scans must be for only one component */\n\t  ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);\n      }\n      for (ci = 0; ci < ncomps; ci++) {\n\tlast_bitpos_ptr = & last_bitpos[scanptr->component_index[ci]][0];\n\tif (Ss != 0 && last_bitpos_ptr[0] < 0) /* AC without prior DC scan */\n\t  ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);\n\tfor (coefi = Ss; coefi <= Se; coefi++) {\n\t  if (last_bitpos_ptr[coefi] < 0) {\n\t    /* first scan of this coefficient */\n\t    if (Ah != 0)\n\t      ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);\n\t  } else {\n\t    /* not first scan */\n\t    if (Ah != last_bitpos_ptr[coefi] || Al != Ah-1)\n\t      ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);\n\t  }\n\t  last_bitpos_ptr[coefi] = Al;\n\t}\n      }\n#endif\n    } else {\n      /* For sequential JPEG, all progression parameters must be these: */\n      if (Ss != 0 || Se != DCTSIZE2-1 || Ah != 0 || Al != 0)\n\tERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);\n      /* Make sure components are not sent twice */\n      for (ci = 0; ci < ncomps; ci++) {\n\tthisi = scanptr->component_index[ci];\n\tif (component_sent[thisi])\n\t  ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);\n\tcomponent_sent[thisi] = TRUE;\n      }\n    }\n  }\n\n  /* Now verify that everything got sent. */\n  if (cinfo->progressive_mode) {\n#ifdef C_PROGRESSIVE_SUPPORTED\n    /* For progressive mode, we only check that at least some DC data\n     * got sent for each component; the spec does not require that all bits\n     * of all coefficients be transmitted.  Would it be wiser to enforce\n     * transmission of all coefficient bits??\n     */\n    for (ci = 0; ci < cinfo->num_components; ci++) {\n      if (last_bitpos[ci][0] < 0)\n\tERREXIT(cinfo, JERR_MISSING_DATA);\n    }\n#endif\n  } else {\n    for (ci = 0; ci < cinfo->num_components; ci++) {\n      if (! component_sent[ci])\n\tERREXIT(cinfo, JERR_MISSING_DATA);\n    }\n  }\n}\n\n#endif /* C_MULTISCAN_FILES_SUPPORTED */\n\n\nLOCAL(void)\nselect_scan_parameters (j_compress_ptr cinfo)\n/* Set up the scan parameters for the current scan */\n{\n  int ci;\n\n#ifdef C_MULTISCAN_FILES_SUPPORTED\n  if (cinfo->scan_info != NULL) {\n    /* Prepare for current scan --- the script is already validated */\n    my_master_ptr master = (my_master_ptr) cinfo->master;\n    const jpeg_scan_info * scanptr = cinfo->scan_info + master->scan_number;\n\n    cinfo->comps_in_scan = scanptr->comps_in_scan;\n    for (ci = 0; ci < scanptr->comps_in_scan; ci++) {\n      cinfo->cur_comp_info[ci] =\n\t&cinfo->comp_info[scanptr->component_index[ci]];\n    }\n    cinfo->Ss = scanptr->Ss;\n    cinfo->Se = scanptr->Se;\n    cinfo->Ah = scanptr->Ah;\n    cinfo->Al = scanptr->Al;\n  }\n  else\n#endif\n  {\n    /* Prepare for single sequential-JPEG scan containing all components */\n    if (cinfo->num_components > MAX_COMPS_IN_SCAN)\n      ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,\n\t       MAX_COMPS_IN_SCAN);\n    cinfo->comps_in_scan = cinfo->num_components;\n    for (ci = 0; ci < cinfo->num_components; ci++) {\n      cinfo->cur_comp_info[ci] = &cinfo->comp_info[ci];\n    }\n    cinfo->Ss = 0;\n    cinfo->Se = DCTSIZE2-1;\n    cinfo->Ah = 0;\n    cinfo->Al = 0;\n  }\n}\n\n\nLOCAL(void)\nper_scan_setup (j_compress_ptr cinfo)\n/* Do computations that are needed before processing a JPEG scan */\n/* cinfo->comps_in_scan and cinfo->cur_comp_info[] are already set */\n{\n  int ci, mcublks, tmp;\n  jpeg_component_info *compptr;\n  \n  if (cinfo->comps_in_scan == 1) {\n    \n    /* Noninterleaved (single-component) scan */\n    compptr = cinfo->cur_comp_info[0];\n    \n    /* Overall image size in MCUs */\n    cinfo->MCUs_per_row = compptr->width_in_blocks;\n    cinfo->MCU_rows_in_scan = compptr->height_in_blocks;\n    \n    /* For noninterleaved scan, always one block per MCU */\n    compptr->MCU_width = 1;\n    compptr->MCU_height = 1;\n    compptr->MCU_blocks = 1;\n    compptr->MCU_sample_width = DCTSIZE;\n    compptr->last_col_width = 1;\n    /* For noninterleaved scans, it is convenient to define last_row_height\n     * as the number of block rows present in the last iMCU row.\n     */\n    tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor);\n    if (tmp == 0) tmp = compptr->v_samp_factor;\n    compptr->last_row_height = tmp;\n    \n    /* Prepare array describing MCU composition */\n    cinfo->blocks_in_MCU = 1;\n    cinfo->MCU_membership[0] = 0;\n    \n  } else {\n    \n    /* Interleaved (multi-component) scan */\n    if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN)\n      ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan,\n\t       MAX_COMPS_IN_SCAN);\n    \n    /* Overall image size in MCUs */\n    cinfo->MCUs_per_row = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width,\n\t\t    (long) (cinfo->max_h_samp_factor*DCTSIZE));\n    cinfo->MCU_rows_in_scan = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height,\n\t\t    (long) (cinfo->max_v_samp_factor*DCTSIZE));\n    \n    cinfo->blocks_in_MCU = 0;\n    \n    for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n      compptr = cinfo->cur_comp_info[ci];\n      /* Sampling factors give # of blocks of component in each MCU */\n      compptr->MCU_width = compptr->h_samp_factor;\n      compptr->MCU_height = compptr->v_samp_factor;\n      compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height;\n      compptr->MCU_sample_width = compptr->MCU_width * DCTSIZE;\n      /* Figure number of non-dummy blocks in last MCU column & row */\n      tmp = (int) (compptr->width_in_blocks % compptr->MCU_width);\n      if (tmp == 0) tmp = compptr->MCU_width;\n      compptr->last_col_width = tmp;\n      tmp = (int) (compptr->height_in_blocks % compptr->MCU_height);\n      if (tmp == 0) tmp = compptr->MCU_height;\n      compptr->last_row_height = tmp;\n      /* Prepare array describing MCU composition */\n      mcublks = compptr->MCU_blocks;\n      if (cinfo->blocks_in_MCU + mcublks > C_MAX_BLOCKS_IN_MCU)\n\tERREXIT(cinfo, JERR_BAD_MCU_SIZE);\n      while (mcublks-- > 0) {\n\tcinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci;\n      }\n    }\n    \n  }\n\n  /* Convert restart specified in rows to actual MCU count. */\n  /* Note that count must fit in 16 bits, so we provide limiting. */\n  if (cinfo->restart_in_rows > 0) {\n    long nominal = (long) cinfo->restart_in_rows * (long) cinfo->MCUs_per_row;\n    cinfo->restart_interval = (unsigned int) MIN(nominal, 65535L);\n  }\n}\n\n\n/*\n * Per-pass setup.\n * This is called at the beginning of each pass.  We determine which modules\n * will be active during this pass and give them appropriate start_pass calls.\n * We also set is_last_pass to indicate whether any more passes will be\n * required.\n */\n\nMETHODDEF(void)\nprepare_for_pass (j_compress_ptr cinfo)\n{\n  my_master_ptr master = (my_master_ptr) cinfo->master;\n\n  switch (master->pass_type) {\n  case main_pass:\n    /* Initial pass: will collect input data, and do either Huffman\n     * optimization or data output for the first scan.\n     */\n    select_scan_parameters(cinfo);\n    per_scan_setup(cinfo);\n    if (! cinfo->raw_data_in) {\n      (*cinfo->cconvert->start_pass) (cinfo);\n      (*cinfo->downsample->start_pass) (cinfo);\n      (*cinfo->prep->start_pass) (cinfo, JBUF_PASS_THRU);\n    }\n    (*cinfo->fdct->start_pass) (cinfo);\n    (*cinfo->entropy->start_pass) (cinfo, cinfo->optimize_coding);\n    (*cinfo->coef->start_pass) (cinfo,\n\t\t\t\t(master->total_passes > 1 ?\n\t\t\t\t JBUF_SAVE_AND_PASS : JBUF_PASS_THRU));\n    (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU);\n    if (cinfo->optimize_coding) {\n      /* No immediate data output; postpone writing frame/scan headers */\n      master->pub.call_pass_startup = FALSE;\n    } else {\n      /* Will write frame/scan headers at first jpeg_write_scanlines call */\n      master->pub.call_pass_startup = TRUE;\n    }\n    break;\n#ifdef ENTROPY_OPT_SUPPORTED\n  case huff_opt_pass:\n    /* Do Huffman optimization for a scan after the first one. */\n    select_scan_parameters(cinfo);\n    per_scan_setup(cinfo);\n    if (cinfo->Ss != 0 || cinfo->Ah == 0 || cinfo->arith_code) {\n      (*cinfo->entropy->start_pass) (cinfo, TRUE);\n      (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST);\n      master->pub.call_pass_startup = FALSE;\n      break;\n    }\n    /* Special case: Huffman DC refinement scans need no Huffman table\n     * and therefore we can skip the optimization pass for them.\n     */\n    master->pass_type = output_pass;\n    master->pass_number++;\n    /*FALLTHROUGH*/\n#endif\n  case output_pass:\n    /* Do a data-output pass. */\n    /* We need not repeat per-scan setup if prior optimization pass did it. */\n    if (! cinfo->optimize_coding) {\n      select_scan_parameters(cinfo);\n      per_scan_setup(cinfo);\n    }\n    (*cinfo->entropy->start_pass) (cinfo, FALSE);\n    (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST);\n    /* We emit frame/scan headers now */\n    if (master->scan_number == 0)\n      (*cinfo->marker->write_frame_header) (cinfo);\n    (*cinfo->marker->write_scan_header) (cinfo);\n    master->pub.call_pass_startup = FALSE;\n    break;\n  default:\n    ERREXIT(cinfo, JERR_NOT_COMPILED);\n  }\n\n  master->pub.is_last_pass = (master->pass_number == master->total_passes-1);\n\n  /* Set up progress monitor's pass info if present */\n  if (cinfo->progress != NULL) {\n    cinfo->progress->completed_passes = master->pass_number;\n    cinfo->progress->total_passes = master->total_passes;\n  }\n}\n\n\n/*\n * Special start-of-pass hook.\n * This is called by jpeg_write_scanlines if call_pass_startup is TRUE.\n * In single-pass processing, we need this hook because we don't want to\n * write frame/scan headers during jpeg_start_compress; we want to let the\n * application write COM markers etc. between jpeg_start_compress and the\n * jpeg_write_scanlines loop.\n * In multi-pass processing, this routine is not used.\n */\n\nMETHODDEF(void)\npass_startup (j_compress_ptr cinfo)\n{\n  cinfo->master->call_pass_startup = FALSE; /* reset flag so call only once */\n\n  (*cinfo->marker->write_frame_header) (cinfo);\n  (*cinfo->marker->write_scan_header) (cinfo);\n}\n\n\n/*\n * Finish up at end of pass.\n */\n\nMETHODDEF(void)\nfinish_pass_master (j_compress_ptr cinfo)\n{\n  my_master_ptr master = (my_master_ptr) cinfo->master;\n\n  /* The entropy coder always needs an end-of-pass call,\n   * either to analyze statistics or to flush its output buffer.\n   */\n  (*cinfo->entropy->finish_pass) (cinfo);\n\n  /* Update state for next pass */\n  switch (master->pass_type) {\n  case main_pass:\n    /* next pass is either output of scan 0 (after optimization)\n     * or output of scan 1 (if no optimization).\n     */\n    master->pass_type = output_pass;\n    if (! cinfo->optimize_coding)\n      master->scan_number++;\n    break;\n  case huff_opt_pass:\n    /* next pass is always output of current scan */\n    master->pass_type = output_pass;\n    break;\n  case output_pass:\n    /* next pass is either optimization or output of next scan */\n    if (cinfo->optimize_coding)\n      master->pass_type = huff_opt_pass;\n    master->scan_number++;\n    break;\n  }\n\n  master->pass_number++;\n}\n\n\n/*\n * Initialize master compression control.\n */\n\nGLOBAL(void)\njinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only)\n{\n  my_master_ptr master;\n\n  master = (my_master_ptr)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  SIZEOF(my_comp_master));\n  cinfo->master = (struct jpeg_comp_master *) master;\n  master->pub.prepare_for_pass = prepare_for_pass;\n  master->pub.pass_startup = pass_startup;\n  master->pub.finish_pass = finish_pass_master;\n  master->pub.is_last_pass = FALSE;\n\n  /* Validate parameters, determine derived values */\n  initial_setup(cinfo);\n\n  if (cinfo->scan_info != NULL) {\n#ifdef C_MULTISCAN_FILES_SUPPORTED\n    validate_script(cinfo);\n#else\n    ERREXIT(cinfo, JERR_NOT_COMPILED);\n#endif\n  } else {\n    cinfo->progressive_mode = FALSE;\n    cinfo->num_scans = 1;\n  }\n\n  if (cinfo->progressive_mode)\t/*  TEMPORARY HACK ??? */\n    cinfo->optimize_coding = TRUE; /* assume default tables no good for progressive mode */\n\n  /* Initialize my private state */\n  if (transcode_only) {\n    /* no main pass in transcoding */\n    if (cinfo->optimize_coding)\n      master->pass_type = huff_opt_pass;\n    else\n      master->pass_type = output_pass;\n  } else {\n    /* for normal compression, first pass is always this type: */\n    master->pass_type = main_pass;\n  }\n  master->scan_number = 0;\n  master->pass_number = 0;\n  if (cinfo->optimize_coding)\n    master->total_passes = cinfo->num_scans * 2;\n  else\n    master->total_passes = cinfo->num_scans;\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jcomapi.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jcomapi.c\n *\n * Copyright (C) 1994-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains application interface routines that are used for both\n * compression and decompression.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/*\n * Abort processing of a JPEG compression or decompression operation,\n * but don't destroy the object itself.\n *\n * For this, we merely clean up all the nonpermanent memory pools.\n * Note that temp files (virtual arrays) are not allowed to belong to\n * the permanent pool, so we will be able to close all temp files here.\n * Closing a data source or destination, if necessary, is the application's\n * responsibility.\n */\n\nGLOBAL(void)\njpeg_abort (j_common_ptr cinfo)\n{\n  int pool;\n\n  /* Do nothing if called on a not-initialized or destroyed JPEG object. */\n  if (cinfo->mem == NULL)\n    return;\n\n  /* Releasing pools in reverse order might help avoid fragmentation\n   * with some (brain-damaged) malloc libraries.\n   */\n  for (pool = JPOOL_NUMPOOLS-1; pool > JPOOL_PERMANENT; pool--) {\n    (*cinfo->mem->free_pool) (cinfo, pool);\n  }\n\n  /* Reset overall state for possible reuse of object */\n  if (cinfo->is_decompressor) {\n    cinfo->global_state = DSTATE_START;\n    /* Try to keep application from accessing now-deleted marker list.\n     * A bit kludgy to do it here, but this is the most central place.\n     */\n    ((j_decompress_ptr) cinfo)->marker_list = NULL;\n  } else {\n    cinfo->global_state = CSTATE_START;\n  }\n}\n\n\n/*\n * Destruction of a JPEG object.\n *\n * Everything gets deallocated except the master jpeg_compress_struct itself\n * and the error manager struct.  Both of these are supplied by the application\n * and must be freed, if necessary, by the application.  (Often they are on\n * the stack and so don't need to be freed anyway.)\n * Closing a data source or destination, if necessary, is the application's\n * responsibility.\n */\n\nGLOBAL(void)\njpeg_destroy (j_common_ptr cinfo)\n{\n  /* We need only tell the memory manager to release everything. */\n  /* NB: mem pointer is NULL if memory mgr failed to initialize. */\n  if (cinfo->mem != NULL)\n    (*cinfo->mem->self_destruct) (cinfo);\n  cinfo->mem = NULL;\t\t/* be safe if jpeg_destroy is called twice */\n  cinfo->global_state = 0;\t/* mark it destroyed */\n}\n\n\n/*\n * Convenience routines for allocating quantization and Huffman tables.\n * (Would jutils.c be a more reasonable place to put these?)\n */\n\nGLOBAL(JQUANT_TBL *)\njpeg_alloc_quant_table (j_common_ptr cinfo)\n{\n  JQUANT_TBL *tbl;\n\n  tbl = (JQUANT_TBL *)\n    (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JQUANT_TBL));\n  tbl->sent_table = FALSE;\t/* make sure this is false in any new table */\n  return tbl;\n}\n\n\nGLOBAL(JHUFF_TBL *)\njpeg_alloc_huff_table (j_common_ptr cinfo)\n{\n  JHUFF_TBL *tbl;\n\n  tbl = (JHUFF_TBL *)\n    (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JHUFF_TBL));\n  tbl->sent_table = FALSE;\t/* make sure this is false in any new table */\n  return tbl;\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jcparam.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jcparam.c\n *\n * Copyright (C) 1991-1998, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains optional default-setting code for the JPEG compressor.\n * Applications do not have to use this file, but those that don't use it\n * must know a lot more about the innards of the JPEG code.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/*\n * Quantization table setup routines\n */\n\nGLOBAL(void)\njpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl,\n\t\t      const unsigned int *basic_table,\n\t\t      int scale_factor, boolean force_baseline)\n/* Define a quantization table equal to the basic_table times\n * a scale factor (given as a percentage).\n * If force_baseline is TRUE, the computed quantization table entries\n * are limited to 1..255 for JPEG baseline compatibility.\n */\n{\n  JQUANT_TBL ** qtblptr;\n  int i;\n  long temp;\n\n  /* Safety check to ensure start_compress not called yet. */\n  if (cinfo->global_state != CSTATE_START)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n\n  if (which_tbl < 0 || which_tbl >= NUM_QUANT_TBLS)\n    ERREXIT1(cinfo, JERR_DQT_INDEX, which_tbl);\n\n  qtblptr = & cinfo->quant_tbl_ptrs[which_tbl];\n\n  if (*qtblptr == NULL)\n    *qtblptr = jpeg_alloc_quant_table((j_common_ptr) cinfo);\n\n  for (i = 0; i < DCTSIZE2; i++) {\n    temp = ((long) basic_table[i] * scale_factor + 50L) / 100L;\n    /* limit the values to the valid range */\n    if (temp <= 0L) temp = 1L;\n    if (temp > 32767L) temp = 32767L; /* max quantizer needed for 12 bits */\n    if (force_baseline && temp > 255L)\n      temp = 255L;\t\t/* limit to baseline range if requested */\n    (*qtblptr)->quantval[i] = (UINT16) temp;\n  }\n\n  /* Initialize sent_table FALSE so table will be written to JPEG file. */\n  (*qtblptr)->sent_table = FALSE;\n}\n\n\nGLOBAL(void)\njpeg_set_linear_quality (j_compress_ptr cinfo, int scale_factor,\n\t\t\t boolean force_baseline)\n/* Set or change the 'quality' (quantization) setting, using default tables\n * and a straight percentage-scaling quality scale.  In most cases it's better\n * to use jpeg_set_quality (below); this entry point is provided for\n * applications that insist on a linear percentage scaling.\n */\n{\n  /* These are the sample quantization tables given in JPEG spec section K.1.\n   * The spec says that the values given produce \"good\" quality, and\n   * when divided by 2, \"very good\" quality.\n   */\n  static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = {\n    16,  11,  10,  16,  24,  40,  51,  61,\n    12,  12,  14,  19,  26,  58,  60,  55,\n    14,  13,  16,  24,  40,  57,  69,  56,\n    14,  17,  22,  29,  51,  87,  80,  62,\n    18,  22,  37,  56,  68, 109, 103,  77,\n    24,  35,  55,  64,  81, 104, 113,  92,\n    49,  64,  78,  87, 103, 121, 120, 101,\n    72,  92,  95,  98, 112, 100, 103,  99\n  };\n  static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = {\n    17,  18,  24,  47,  99,  99,  99,  99,\n    18,  21,  26,  66,  99,  99,  99,  99,\n    24,  26,  56,  99,  99,  99,  99,  99,\n    47,  66,  99,  99,  99,  99,  99,  99,\n    99,  99,  99,  99,  99,  99,  99,  99,\n    99,  99,  99,  99,  99,  99,  99,  99,\n    99,  99,  99,  99,  99,  99,  99,  99,\n    99,  99,  99,  99,  99,  99,  99,  99\n  };\n\n  /* Set up two quantization tables using the specified scaling */\n  jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl,\n\t\t       scale_factor, force_baseline);\n  jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl,\n\t\t       scale_factor, force_baseline);\n}\n\n\nGLOBAL(int)\njpeg_quality_scaling (int quality)\n/* Convert a user-specified quality rating to a percentage scaling factor\n * for an underlying quantization table, using our recommended scaling curve.\n * The input 'quality' factor should be 0 (terrible) to 100 (very good).\n */\n{\n  /* Safety limit on quality factor.  Convert 0 to 1 to avoid zero divide. */\n  if (quality <= 0) quality = 1;\n  if (quality > 100) quality = 100;\n\n  /* The basic table is used as-is (scaling 100) for a quality of 50.\n   * Qualities 50..100 are converted to scaling percentage 200 - 2*Q;\n   * note that at Q=100 the scaling is 0, which will cause jpeg_add_quant_table\n   * to make all the table entries 1 (hence, minimum quantization loss).\n   * Qualities 1..50 are converted to scaling percentage 5000/Q.\n   */\n  if (quality < 50)\n    quality = 5000 / quality;\n  else\n    quality = 200 - quality*2;\n\n  return quality;\n}\n\n\nGLOBAL(void)\njpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline)\n/* Set or change the 'quality' (quantization) setting, using default tables.\n * This is the standard quality-adjusting entry point for typical user\n * interfaces; only those who want detailed control over quantization tables\n * would use the preceding three routines directly.\n */\n{\n  /* Convert user 0-100 rating to percentage scaling */\n  quality = jpeg_quality_scaling(quality);\n\n  /* Set up standard quality tables */\n  jpeg_set_linear_quality(cinfo, quality, force_baseline);\n}\n\n\n/*\n * Huffman table setup routines\n */\n\nLOCAL(void)\nadd_huff_table (j_compress_ptr cinfo,\n\t\tJHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val)\n/* Define a Huffman table */\n{\n  int nsymbols, len;\n\n  if (*htblptr == NULL)\n    *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);\n\n  /* Copy the number-of-symbols-of-each-code-length counts */\n  MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));\n\n  /* Validate the counts.  We do this here mainly so we can copy the right\n   * number of symbols from the val[] array, without risking marching off\n   * the end of memory.  jchuff.c will do a more thorough test later.\n   */\n  nsymbols = 0;\n  for (len = 1; len <= 16; len++)\n    nsymbols += bits[len];\n  if (nsymbols < 1 || nsymbols > 256)\n    ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);\n\n  MEMCOPY((*htblptr)->huffval, val, nsymbols * SIZEOF(UINT8));\n\n  /* Initialize sent_table FALSE so table will be written to JPEG file. */\n  (*htblptr)->sent_table = FALSE;\n}\n\n\nLOCAL(void)\nstd_huff_tables (j_compress_ptr cinfo)\n/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */\n/* IMPORTANT: these are only valid for 8-bit data precision! */\n{\n  static const UINT8 bits_dc_luminance[17] =\n    { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };\n  static const UINT8 val_dc_luminance[] =\n    { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };\n  \n  static const UINT8 bits_dc_chrominance[17] =\n    { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };\n  static const UINT8 val_dc_chrominance[] =\n    { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };\n  \n  static const UINT8 bits_ac_luminance[17] =\n    { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };\n  static const UINT8 val_ac_luminance[] =\n    { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,\n      0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,\n      0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,\n      0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,\n      0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,\n      0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,\n      0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,\n      0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,\n      0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,\n      0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,\n      0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,\n      0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,\n      0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,\n      0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,\n      0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,\n      0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,\n      0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,\n      0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,\n      0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,\n      0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,\n      0xf9, 0xfa };\n  \n  static const UINT8 bits_ac_chrominance[17] =\n    { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };\n  static const UINT8 val_ac_chrominance[] =\n    { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,\n      0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,\n      0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,\n      0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,\n      0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,\n      0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,\n      0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,\n      0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,\n      0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,\n      0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,\n      0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,\n      0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,\n      0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,\n      0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,\n      0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,\n      0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,\n      0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,\n      0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,\n      0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,\n      0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,\n      0xf9, 0xfa };\n  \n  add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[0],\n\t\t bits_dc_luminance, val_dc_luminance);\n  add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[0],\n\t\t bits_ac_luminance, val_ac_luminance);\n  add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[1],\n\t\t bits_dc_chrominance, val_dc_chrominance);\n  add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[1],\n\t\t bits_ac_chrominance, val_ac_chrominance);\n}\n\n\n/*\n * Default parameter setup for compression.\n *\n * Applications that don't choose to use this routine must do their\n * own setup of all these parameters.  Alternately, you can call this\n * to establish defaults and then alter parameters selectively.  This\n * is the recommended approach since, if we add any new parameters,\n * your code will still work (they'll be set to reasonable defaults).\n */\n\nGLOBAL(void)\njpeg_set_defaults (j_compress_ptr cinfo)\n{\n  int i;\n\n  /* Safety check to ensure start_compress not called yet. */\n  if (cinfo->global_state != CSTATE_START)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n\n  /* Allocate comp_info array large enough for maximum component count.\n   * Array is made permanent in case application wants to compress\n   * multiple images at same param settings.\n   */\n  if (cinfo->comp_info == NULL)\n    cinfo->comp_info = (jpeg_component_info *)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,\n\t\t\t\t  MAX_COMPONENTS * SIZEOF(jpeg_component_info));\n\n  /* Initialize everything not dependent on the color space */\n\n  cinfo->data_precision = BITS_IN_JSAMPLE;\n  /* Set up two quantization tables using default quality of 75 */\n  jpeg_set_quality(cinfo, 75, TRUE);\n  /* Set up two Huffman tables */\n  std_huff_tables(cinfo);\n\n  /* Initialize default arithmetic coding conditioning */\n  for (i = 0; i < NUM_ARITH_TBLS; i++) {\n    cinfo->arith_dc_L[i] = 0;\n    cinfo->arith_dc_U[i] = 1;\n    cinfo->arith_ac_K[i] = 5;\n  }\n\n  /* Default is no multiple-scan output */\n  cinfo->scan_info = NULL;\n  cinfo->num_scans = 0;\n\n  /* Expect normal source image, not raw downsampled data */\n  cinfo->raw_data_in = FALSE;\n\n  /* Use Huffman coding, not arithmetic coding, by default */\n  cinfo->arith_code = FALSE;\n\n  /* By default, don't do extra passes to optimize entropy coding */\n  cinfo->optimize_coding = FALSE;\n  /* The standard Huffman tables are only valid for 8-bit data precision.\n   * If the precision is higher, force optimization on so that usable\n   * tables will be computed.  This test can be removed if default tables\n   * are supplied that are valid for the desired precision.\n   */\n  if (cinfo->data_precision > 8)\n    cinfo->optimize_coding = TRUE;\n\n  /* By default, use the simpler non-cosited sampling alignment */\n  cinfo->CCIR601_sampling = FALSE;\n\n  /* No input smoothing */\n  cinfo->smoothing_factor = 0;\n\n  /* DCT algorithm preference */\n  cinfo->dct_method = JDCT_DEFAULT;\n\n  /* No restart markers */\n  cinfo->restart_interval = 0;\n  cinfo->restart_in_rows = 0;\n\n  /* Fill in default JFIF marker parameters.  Note that whether the marker\n   * will actually be written is determined by jpeg_set_colorspace.\n   *\n   * By default, the library emits JFIF version code 1.01.\n   * An application that wants to emit JFIF 1.02 extension markers should set\n   * JFIF_minor_version to 2.  We could probably get away with just defaulting\n   * to 1.02, but there may still be some decoders in use that will complain\n   * about that; saying 1.01 should minimize compatibility problems.\n   */\n  cinfo->JFIF_major_version = 1; /* Default JFIF version = 1.01 */\n  cinfo->JFIF_minor_version = 1;\n  cinfo->density_unit = 0;\t/* Pixel size is unknown by default */\n  cinfo->X_density = 1;\t\t/* Pixel aspect ratio is square by default */\n  cinfo->Y_density = 1;\n\n  /* Choose JPEG colorspace based on input space, set defaults accordingly */\n\n  jpeg_default_colorspace(cinfo);\n}\n\n\n/*\n * Select an appropriate JPEG colorspace for in_color_space.\n */\n\nGLOBAL(void)\njpeg_default_colorspace (j_compress_ptr cinfo)\n{\n  switch (cinfo->in_color_space) {\n  case JCS_GRAYSCALE:\n    jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);\n    break;\n  case JCS_RGB:\n    jpeg_set_colorspace(cinfo, JCS_YCbCr);\n    break;\n  case JCS_YCbCr:\n    jpeg_set_colorspace(cinfo, JCS_YCbCr);\n    break;\n  case JCS_CMYK:\n    jpeg_set_colorspace(cinfo, JCS_CMYK); /* By default, no translation */\n    break;\n  case JCS_YCCK:\n    jpeg_set_colorspace(cinfo, JCS_YCCK);\n    break;\n  case JCS_UNKNOWN:\n    jpeg_set_colorspace(cinfo, JCS_UNKNOWN);\n    break;\n  default:\n    ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);\n  }\n}\n\n\n/*\n * Set the JPEG colorspace, and choose colorspace-dependent default values.\n */\n\nGLOBAL(void)\njpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace)\n{\n  jpeg_component_info * compptr;\n  int ci;\n\n#define SET_COMP(index,id,hsamp,vsamp,quant,dctbl,actbl)  \\\n  (compptr = &cinfo->comp_info[index], \\\n   compptr->component_id = (id), \\\n   compptr->h_samp_factor = (hsamp), \\\n   compptr->v_samp_factor = (vsamp), \\\n   compptr->quant_tbl_no = (quant), \\\n   compptr->dc_tbl_no = (dctbl), \\\n   compptr->ac_tbl_no = (actbl) )\n\n  /* Safety check to ensure start_compress not called yet. */\n  if (cinfo->global_state != CSTATE_START)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n\n  /* For all colorspaces, we use Q and Huff tables 0 for luminance components,\n   * tables 1 for chrominance components.\n   */\n\n  cinfo->jpeg_color_space = colorspace;\n\n  cinfo->write_JFIF_header = FALSE; /* No marker for non-JFIF colorspaces */\n  cinfo->write_Adobe_marker = FALSE; /* write no Adobe marker by default */\n\n  switch (colorspace) {\n  case JCS_GRAYSCALE:\n    cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */\n    cinfo->num_components = 1;\n    /* JFIF specifies component ID 1 */\n    SET_COMP(0, 1, 1,1, 0, 0,0);\n    break;\n  case JCS_RGB:\n    cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag RGB */\n    cinfo->num_components = 3;\n    SET_COMP(0, 0x52 /* 'R' */, 1,1, 0, 0,0);\n    SET_COMP(1, 0x47 /* 'G' */, 1,1, 0, 0,0);\n    SET_COMP(2, 0x42 /* 'B' */, 1,1, 0, 0,0);\n    break;\n  case JCS_YCbCr:\n    cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */\n    cinfo->num_components = 3;\n    /* JFIF specifies component IDs 1,2,3 */\n    /* We default to 2x2 subsamples of chrominance */\n    SET_COMP(0, 1, 2,2, 0, 0,0);\n    SET_COMP(1, 2, 1,1, 1, 1,1);\n    SET_COMP(2, 3, 1,1, 1, 1,1);\n    break;\n  case JCS_CMYK:\n    cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag CMYK */\n    cinfo->num_components = 4;\n    SET_COMP(0, 0x43 /* 'C' */, 1,1, 0, 0,0);\n    SET_COMP(1, 0x4D /* 'M' */, 1,1, 0, 0,0);\n    SET_COMP(2, 0x59 /* 'Y' */, 1,1, 0, 0,0);\n    SET_COMP(3, 0x4B /* 'K' */, 1,1, 0, 0,0);\n    break;\n  case JCS_YCCK:\n    cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag YCCK */\n    cinfo->num_components = 4;\n    SET_COMP(0, 1, 2,2, 0, 0,0);\n    SET_COMP(1, 2, 1,1, 1, 1,1);\n    SET_COMP(2, 3, 1,1, 1, 1,1);\n    SET_COMP(3, 4, 2,2, 0, 0,0);\n    break;\n  case JCS_UNKNOWN:\n    cinfo->num_components = cinfo->input_components;\n    if (cinfo->num_components < 1 || cinfo->num_components > MAX_COMPONENTS)\n      ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,\n\t       MAX_COMPONENTS);\n    for (ci = 0; ci < cinfo->num_components; ci++) {\n      SET_COMP(ci, ci, 1,1, 0, 0,0);\n    }\n    break;\n  default:\n    ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);\n  }\n}\n\n\n#ifdef C_PROGRESSIVE_SUPPORTED\n\nLOCAL(jpeg_scan_info *)\nfill_a_scan (jpeg_scan_info * scanptr, int ci,\n\t     int Ss, int Se, int Ah, int Al)\n/* Support routine: generate one scan for specified component */\n{\n  scanptr->comps_in_scan = 1;\n  scanptr->component_index[0] = ci;\n  scanptr->Ss = Ss;\n  scanptr->Se = Se;\n  scanptr->Ah = Ah;\n  scanptr->Al = Al;\n  scanptr++;\n  return scanptr;\n}\n\nLOCAL(jpeg_scan_info *)\nfill_scans (jpeg_scan_info * scanptr, int ncomps,\n\t    int Ss, int Se, int Ah, int Al)\n/* Support routine: generate one scan for each component */\n{\n  int ci;\n\n  for (ci = 0; ci < ncomps; ci++) {\n    scanptr->comps_in_scan = 1;\n    scanptr->component_index[0] = ci;\n    scanptr->Ss = Ss;\n    scanptr->Se = Se;\n    scanptr->Ah = Ah;\n    scanptr->Al = Al;\n    scanptr++;\n  }\n  return scanptr;\n}\n\nLOCAL(jpeg_scan_info *)\nfill_dc_scans (jpeg_scan_info * scanptr, int ncomps, int Ah, int Al)\n/* Support routine: generate interleaved DC scan if possible, else N scans */\n{\n  int ci;\n\n  if (ncomps <= MAX_COMPS_IN_SCAN) {\n    /* Single interleaved DC scan */\n    scanptr->comps_in_scan = ncomps;\n    for (ci = 0; ci < ncomps; ci++)\n      scanptr->component_index[ci] = ci;\n    scanptr->Ss = scanptr->Se = 0;\n    scanptr->Ah = Ah;\n    scanptr->Al = Al;\n    scanptr++;\n  } else {\n    /* Noninterleaved DC scan for each component */\n    scanptr = fill_scans(scanptr, ncomps, 0, 0, Ah, Al);\n  }\n  return scanptr;\n}\n\n\n/*\n * Create a recommended progressive-JPEG script.\n * cinfo->num_components and cinfo->jpeg_color_space must be correct.\n */\n\nGLOBAL(void)\njpeg_simple_progression (j_compress_ptr cinfo)\n{\n  int ncomps = cinfo->num_components;\n  int nscans;\n  jpeg_scan_info * scanptr;\n\n  /* Safety check to ensure start_compress not called yet. */\n  if (cinfo->global_state != CSTATE_START)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n\n  /* Figure space needed for script.  Calculation must match code below! */\n  if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {\n    /* Custom script for YCbCr color images. */\n    nscans = 10;\n  } else {\n    /* All-purpose script for other color spaces. */\n    if (ncomps > MAX_COMPS_IN_SCAN)\n      nscans = 6 * ncomps;\t/* 2 DC + 4 AC scans per component */\n    else\n      nscans = 2 + 4 * ncomps;\t/* 2 DC scans; 4 AC scans per component */\n  }\n\n  /* Allocate space for script.\n   * We need to put it in the permanent pool in case the application performs\n   * multiple compressions without changing the settings.  To avoid a memory\n   * leak if jpeg_simple_progression is called repeatedly for the same JPEG\n   * object, we try to re-use previously allocated space, and we allocate\n   * enough space to handle YCbCr even if initially asked for grayscale.\n   */\n  if (cinfo->script_space == NULL || cinfo->script_space_size < nscans) {\n    cinfo->script_space_size = MAX(nscans, 10);\n    cinfo->script_space = (jpeg_scan_info *)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,\n\t\t\tcinfo->script_space_size * SIZEOF(jpeg_scan_info));\n  }\n  scanptr = cinfo->script_space;\n  cinfo->scan_info = scanptr;\n  cinfo->num_scans = nscans;\n\n  if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {\n    /* Custom script for YCbCr color images. */\n    /* Initial DC scan */\n    scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);\n    /* Initial AC scan: get some luma data out in a hurry */\n    scanptr = fill_a_scan(scanptr, 0, 1, 5, 0, 2);\n    /* Chroma data is too small to be worth expending many scans on */\n    scanptr = fill_a_scan(scanptr, 2, 1, 63, 0, 1);\n    scanptr = fill_a_scan(scanptr, 1, 1, 63, 0, 1);\n    /* Complete spectral selection for luma AC */\n    scanptr = fill_a_scan(scanptr, 0, 6, 63, 0, 2);\n    /* Refine next bit of luma AC */\n    scanptr = fill_a_scan(scanptr, 0, 1, 63, 2, 1);\n    /* Finish DC successive approximation */\n    scanptr = fill_dc_scans(scanptr, ncomps, 1, 0);\n    /* Finish AC successive approximation */\n    scanptr = fill_a_scan(scanptr, 2, 1, 63, 1, 0);\n    scanptr = fill_a_scan(scanptr, 1, 1, 63, 1, 0);\n    /* Luma bottom bit comes last since it's usually largest scan */\n    scanptr = fill_a_scan(scanptr, 0, 1, 63, 1, 0);\n  } else {\n    /* All-purpose script for other color spaces. */\n    /* Successive approximation first pass */\n    scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);\n    scanptr = fill_scans(scanptr, ncomps, 1, 5, 0, 2);\n    scanptr = fill_scans(scanptr, ncomps, 6, 63, 0, 2);\n    /* Successive approximation second pass */\n    scanptr = fill_scans(scanptr, ncomps, 1, 63, 2, 1);\n    /* Successive approximation final pass */\n    scanptr = fill_dc_scans(scanptr, ncomps, 1, 0);\n    scanptr = fill_scans(scanptr, ncomps, 1, 63, 1, 0);\n  }\n}\n\n#endif /* C_PROGRESSIVE_SUPPORTED */\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jcphuff.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jcphuff.c\n *\n * Copyright (C) 1995-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains Huffman entropy encoding routines for progressive JPEG.\n *\n * We do not support output suspension in this module, since the library\n * currently does not allow multiple-scan files to be written with output\n * suspension.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jchuff.h\"\t\t/* Declarations shared with jchuff.c */\n\n#ifdef C_PROGRESSIVE_SUPPORTED\n\n/* Expanded entropy encoder object for progressive Huffman encoding. */\n\ntypedef struct {\n  struct jpeg_entropy_encoder pub; /* public fields */\n\n  /* Mode flag: TRUE for optimization, FALSE for actual data output */\n  boolean gather_statistics;\n\n  /* Bit-level coding status.\n   * next_output_byte/free_in_buffer are local copies of cinfo->dest fields.\n   */\n  JOCTET * next_output_byte;\t/* => next byte to write in buffer */\n  size_t free_in_buffer;\t/* # of byte spaces remaining in buffer */\n  INT32 put_buffer;\t\t/* current bit-accumulation buffer */\n  int put_bits;\t\t\t/* # of bits now in it */\n  j_compress_ptr cinfo;\t\t/* link to cinfo (needed for dump_buffer) */\n\n  /* Coding status for DC components */\n  int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */\n\n  /* Coding status for AC components */\n  int ac_tbl_no;\t\t/* the table number of the single component */\n  unsigned int EOBRUN;\t\t/* run length of EOBs */\n  unsigned int BE;\t\t/* # of buffered correction bits before MCU */\n  char * bit_buffer;\t\t/* buffer for correction bits (1 per char) */\n  /* packing correction bits tightly would save some space but cost time... */\n\n  unsigned int restarts_to_go;\t/* MCUs left in this restart interval */\n  int next_restart_num;\t\t/* next restart number to write (0-7) */\n\n  /* Pointers to derived tables (these workspaces have image lifespan).\n   * Since any one scan codes only DC or only AC, we only need one set\n   * of tables, not one for DC and one for AC.\n   */\n  c_derived_tbl * derived_tbls[NUM_HUFF_TBLS];\n\n  /* Statistics tables for optimization; again, one set is enough */\n  long * count_ptrs[NUM_HUFF_TBLS];\n} phuff_entropy_encoder;\n\ntypedef phuff_entropy_encoder * phuff_entropy_ptr;\n\n/* MAX_CORR_BITS is the number of bits the AC refinement correction-bit\n * buffer can hold.  Larger sizes may slightly improve compression, but\n * 1000 is already well into the realm of overkill.\n * The minimum safe size is 64 bits.\n */\n\n#define MAX_CORR_BITS  1000\t/* Max # of correction bits I can buffer */\n\n/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32.\n * We assume that int right shift is unsigned if INT32 right shift is,\n * which should be safe.\n */\n\n#ifdef RIGHT_SHIFT_IS_UNSIGNED\n#define ISHIFT_TEMPS\tint ishift_temp;\n#define IRIGHT_SHIFT(x,shft)  \\\n\t((ishift_temp = (x)) < 0 ? \\\n\t (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \\\n\t (ishift_temp >> (shft)))\n#else\n#define ISHIFT_TEMPS\n#define IRIGHT_SHIFT(x,shft)\t((x) >> (shft))\n#endif\n\n/* Forward declarations */\nMETHODDEF(boolean) encode_mcu_DC_first JPP((j_compress_ptr cinfo,\n\t\t\t\t\t    JBLOCKROW *MCU_data));\nMETHODDEF(boolean) encode_mcu_AC_first JPP((j_compress_ptr cinfo,\n\t\t\t\t\t    JBLOCKROW *MCU_data));\nMETHODDEF(boolean) encode_mcu_DC_refine JPP((j_compress_ptr cinfo,\n\t\t\t\t\t     JBLOCKROW *MCU_data));\nMETHODDEF(boolean) encode_mcu_AC_refine JPP((j_compress_ptr cinfo,\n\t\t\t\t\t     JBLOCKROW *MCU_data));\nMETHODDEF(void) finish_pass_phuff JPP((j_compress_ptr cinfo));\nMETHODDEF(void) finish_pass_gather_phuff JPP((j_compress_ptr cinfo));\n\n\n/*\n * Initialize for a Huffman-compressed scan using progressive JPEG.\n */\n\nMETHODDEF(void)\nstart_pass_phuff (j_compress_ptr cinfo, boolean gather_statistics)\n{  \n  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;\n  boolean is_DC_band;\n  int ci, tbl;\n  jpeg_component_info * compptr;\n\n  entropy->cinfo = cinfo;\n  entropy->gather_statistics = gather_statistics;\n\n  is_DC_band = (cinfo->Ss == 0);\n\n  /* We assume jcmaster.c already validated the scan parameters. */\n\n  /* Select execution routines */\n  if (cinfo->Ah == 0) {\n    if (is_DC_band)\n      entropy->pub.encode_mcu = encode_mcu_DC_first;\n    else\n      entropy->pub.encode_mcu = encode_mcu_AC_first;\n  } else {\n    if (is_DC_band)\n      entropy->pub.encode_mcu = encode_mcu_DC_refine;\n    else {\n      entropy->pub.encode_mcu = encode_mcu_AC_refine;\n      /* AC refinement needs a correction bit buffer */\n      if (entropy->bit_buffer == NULL)\n\tentropy->bit_buffer = (char *)\n\t  (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t      MAX_CORR_BITS * SIZEOF(char));\n    }\n  }\n  if (gather_statistics)\n    entropy->pub.finish_pass = finish_pass_gather_phuff;\n  else\n    entropy->pub.finish_pass = finish_pass_phuff;\n\n  /* Only DC coefficients may be interleaved, so cinfo->comps_in_scan = 1\n   * for AC coefficients.\n   */\n  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n    compptr = cinfo->cur_comp_info[ci];\n    /* Initialize DC predictions to 0 */\n    entropy->last_dc_val[ci] = 0;\n    /* Get table index */\n    if (is_DC_band) {\n      if (cinfo->Ah != 0)\t/* DC refinement needs no table */\n\tcontinue;\n      tbl = compptr->dc_tbl_no;\n    } else {\n      entropy->ac_tbl_no = tbl = compptr->ac_tbl_no;\n    }\n    if (gather_statistics) {\n      /* Check for invalid table index */\n      /* (make_c_derived_tbl does this in the other path) */\n      if (tbl < 0 || tbl >= NUM_HUFF_TBLS)\n        ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl);\n      /* Allocate and zero the statistics tables */\n      /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */\n      if (entropy->count_ptrs[tbl] == NULL)\n\tentropy->count_ptrs[tbl] = (long *)\n\t  (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t      257 * SIZEOF(long));\n      MEMZERO(entropy->count_ptrs[tbl], 257 * SIZEOF(long));\n    } else {\n      /* Compute derived values for Huffman table */\n      /* We may do this more than once for a table, but it's not expensive */\n      jpeg_make_c_derived_tbl(cinfo, is_DC_band, tbl,\n\t\t\t      & entropy->derived_tbls[tbl]);\n    }\n  }\n\n  /* Initialize AC stuff */\n  entropy->EOBRUN = 0;\n  entropy->BE = 0;\n\n  /* Initialize bit buffer to empty */\n  entropy->put_buffer = 0;\n  entropy->put_bits = 0;\n\n  /* Initialize restart stuff */\n  entropy->restarts_to_go = cinfo->restart_interval;\n  entropy->next_restart_num = 0;\n}\n\n\n/* Outputting bytes to the file.\n * NB: these must be called only when actually outputting,\n * that is, entropy->gather_statistics == FALSE.\n */\n\n/* Emit a byte */\n#define emit_byte(entropy,val)  \\\n\t{ *(entropy)->next_output_byte++ = (JOCTET) (val);  \\\n\t  if (--(entropy)->free_in_buffer == 0)  \\\n\t    dump_buffer(entropy); }\n\n\nLOCAL(void)\ndump_buffer (phuff_entropy_ptr entropy)\n/* Empty the output buffer; we do not support suspension in this module. */\n{\n  struct jpeg_destination_mgr * dest = entropy->cinfo->dest;\n\n  if (! (*dest->empty_output_buffer) (entropy->cinfo))\n    ERREXIT(entropy->cinfo, JERR_CANT_SUSPEND);\n  /* After a successful buffer dump, must reset buffer pointers */\n  entropy->next_output_byte = dest->next_output_byte;\n  entropy->free_in_buffer = dest->free_in_buffer;\n}\n\n\n/* Outputting bits to the file */\n\n/* Only the right 24 bits of put_buffer are used; the valid bits are\n * left-justified in this part.  At most 16 bits can be passed to emit_bits\n * in one call, and we never retain more than 7 bits in put_buffer\n * between calls, so 24 bits are sufficient.\n */\n\nINLINE\nLOCAL(void)\nemit_bits (phuff_entropy_ptr entropy, unsigned int code, int size)\n/* Emit some bits, unless we are in gather mode */\n{\n  /* This routine is heavily used, so it's worth coding tightly. */\n  register INT32 put_buffer = (INT32) code;\n  register int put_bits = entropy->put_bits;\n\n  /* if size is 0, caller used an invalid Huffman table entry */\n  if (size == 0)\n    ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE);\n\n  if (entropy->gather_statistics)\n    return;\t\t\t/* do nothing if we're only getting stats */\n\n  put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */\n  \n  put_bits += size;\t\t/* new number of bits in buffer */\n  \n  put_buffer <<= 24 - put_bits; /* align incoming bits */\n\n  put_buffer |= entropy->put_buffer; /* and merge with old buffer contents */\n\n  while (put_bits >= 8) {\n    int c = (int) ((put_buffer >> 16) & 0xFF);\n    \n    emit_byte(entropy, c);\n    if (c == 0xFF) {\t\t/* need to stuff a zero byte? */\n      emit_byte(entropy, 0);\n    }\n    put_buffer <<= 8;\n    put_bits -= 8;\n  }\n\n  entropy->put_buffer = put_buffer; /* update variables */\n  entropy->put_bits = put_bits;\n}\n\n\nLOCAL(void)\nflush_bits (phuff_entropy_ptr entropy)\n{\n  emit_bits(entropy, 0x7F, 7); /* fill any partial byte with ones */\n  entropy->put_buffer = 0;     /* and reset bit-buffer to empty */\n  entropy->put_bits = 0;\n}\n\n\n/*\n * Emit (or just count) a Huffman symbol.\n */\n\nINLINE\nLOCAL(void)\nemit_symbol (phuff_entropy_ptr entropy, int tbl_no, int symbol)\n{\n  if (entropy->gather_statistics)\n    entropy->count_ptrs[tbl_no][symbol]++;\n  else {\n    c_derived_tbl * tbl = entropy->derived_tbls[tbl_no];\n    emit_bits(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]);\n  }\n}\n\n\n/*\n * Emit bits from a correction bit buffer.\n */\n\nLOCAL(void)\nemit_buffered_bits (phuff_entropy_ptr entropy, char * bufstart,\n\t\t    unsigned int nbits)\n{\n  if (entropy->gather_statistics)\n    return;\t\t\t/* no real work */\n\n  while (nbits > 0) {\n    emit_bits(entropy, (unsigned int) (*bufstart), 1);\n    bufstart++;\n    nbits--;\n  }\n}\n\n\n/*\n * Emit any pending EOBRUN symbol.\n */\n\nLOCAL(void)\nemit_eobrun (phuff_entropy_ptr entropy)\n{\n  register int temp, nbits;\n\n  if (entropy->EOBRUN > 0) {\t/* if there is any pending EOBRUN */\n    temp = entropy->EOBRUN;\n    nbits = 0;\n    while ((temp >>= 1))\n      nbits++;\n    /* safety check: shouldn't happen given limited correction-bit buffer */\n    if (nbits > 14)\n      ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE);\n\n    emit_symbol(entropy, entropy->ac_tbl_no, nbits << 4);\n    if (nbits)\n      emit_bits(entropy, entropy->EOBRUN, nbits);\n\n    entropy->EOBRUN = 0;\n\n    /* Emit any buffered correction bits */\n    emit_buffered_bits(entropy, entropy->bit_buffer, entropy->BE);\n    entropy->BE = 0;\n  }\n}\n\n\n/*\n * Emit a restart marker & resynchronize predictions.\n */\n\nLOCAL(void)\nemit_restart (phuff_entropy_ptr entropy, int restart_num)\n{\n  int ci;\n\n  emit_eobrun(entropy);\n\n  if (! entropy->gather_statistics) {\n    flush_bits(entropy);\n    emit_byte(entropy, 0xFF);\n    emit_byte(entropy, JPEG_RST0 + restart_num);\n  }\n\n  if (entropy->cinfo->Ss == 0) {\n    /* Re-initialize DC predictions to 0 */\n    for (ci = 0; ci < entropy->cinfo->comps_in_scan; ci++)\n      entropy->last_dc_val[ci] = 0;\n  } else {\n    /* Re-initialize all AC-related fields to 0 */\n    entropy->EOBRUN = 0;\n    entropy->BE = 0;\n  }\n}\n\n\n/*\n * MCU encoding for DC initial scan (either spectral selection,\n * or first pass of successive approximation).\n */\n\nMETHODDEF(boolean)\nencode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)\n{\n  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;\n  register int temp, temp2;\n  register int nbits;\n  int blkn, ci;\n  int Al = cinfo->Al;\n  JBLOCKROW block;\n  jpeg_component_info * compptr;\n  ISHIFT_TEMPS\n\n  entropy->next_output_byte = cinfo->dest->next_output_byte;\n  entropy->free_in_buffer = cinfo->dest->free_in_buffer;\n\n  /* Emit restart marker if needed */\n  if (cinfo->restart_interval)\n    if (entropy->restarts_to_go == 0)\n      emit_restart(entropy, entropy->next_restart_num);\n\n  /* Encode the MCU data blocks */\n  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {\n    block = MCU_data[blkn];\n    ci = cinfo->MCU_membership[blkn];\n    compptr = cinfo->cur_comp_info[ci];\n\n    /* Compute the DC value after the required point transform by Al.\n     * This is simply an arithmetic right shift.\n     */\n    temp2 = IRIGHT_SHIFT((int) ((*block)[0]), Al);\n\n    /* DC differences are figured on the point-transformed values. */\n    temp = temp2 - entropy->last_dc_val[ci];\n    entropy->last_dc_val[ci] = temp2;\n\n    /* Encode the DC coefficient difference per section G.1.2.1 */\n    temp2 = temp;\n    if (temp < 0) {\n      temp = -temp;\t\t/* temp is abs value of input */\n      /* For a negative input, want temp2 = bitwise complement of abs(input) */\n      /* This code assumes we are on a two's complement machine */\n      temp2--;\n    }\n    \n    /* Find the number of bits needed for the magnitude of the coefficient */\n    nbits = 0;\n    while (temp) {\n      nbits++;\n      temp >>= 1;\n    }\n    /* Check for out-of-range coefficient values.\n     * Since we're encoding a difference, the range limit is twice as much.\n     */\n    if (nbits > MAX_COEF_BITS+1)\n      ERREXIT(cinfo, JERR_BAD_DCT_COEF);\n    \n    /* Count/emit the Huffman-coded symbol for the number of bits */\n    emit_symbol(entropy, compptr->dc_tbl_no, nbits);\n    \n    /* Emit that number of bits of the value, if positive, */\n    /* or the complement of its magnitude, if negative. */\n    if (nbits)\t\t\t/* emit_bits rejects calls with size 0 */\n      emit_bits(entropy, (unsigned int) temp2, nbits);\n  }\n\n  cinfo->dest->next_output_byte = entropy->next_output_byte;\n  cinfo->dest->free_in_buffer = entropy->free_in_buffer;\n\n  /* Update restart-interval state too */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0) {\n      entropy->restarts_to_go = cinfo->restart_interval;\n      entropy->next_restart_num++;\n      entropy->next_restart_num &= 7;\n    }\n    entropy->restarts_to_go--;\n  }\n\n  return TRUE;\n}\n\n\n/*\n * MCU encoding for AC initial scan (either spectral selection,\n * or first pass of successive approximation).\n */\n\nMETHODDEF(boolean)\nencode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)\n{\n  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;\n  register int temp, temp2;\n  register int nbits;\n  register int r, k;\n  int Se = cinfo->Se;\n  int Al = cinfo->Al;\n  JBLOCKROW block;\n\n  entropy->next_output_byte = cinfo->dest->next_output_byte;\n  entropy->free_in_buffer = cinfo->dest->free_in_buffer;\n\n  /* Emit restart marker if needed */\n  if (cinfo->restart_interval)\n    if (entropy->restarts_to_go == 0)\n      emit_restart(entropy, entropy->next_restart_num);\n\n  /* Encode the MCU data block */\n  block = MCU_data[0];\n\n  /* Encode the AC coefficients per section G.1.2.2, fig. G.3 */\n  \n  r = 0;\t\t\t/* r = run length of zeros */\n   \n  for (k = cinfo->Ss; k <= Se; k++) {\n    if ((temp = (*block)[jpeg_natural_order[k]]) == 0) {\n      r++;\n      continue;\n    }\n    /* We must apply the point transform by Al.  For AC coefficients this\n     * is an integer division with rounding towards 0.  To do this portably\n     * in C, we shift after obtaining the absolute value; so the code is\n     * interwoven with finding the abs value (temp) and output bits (temp2).\n     */\n    if (temp < 0) {\n      temp = -temp;\t\t/* temp is abs value of input */\n      temp >>= Al;\t\t/* apply the point transform */\n      /* For a negative coef, want temp2 = bitwise complement of abs(coef) */\n      temp2 = ~temp;\n    } else {\n      temp >>= Al;\t\t/* apply the point transform */\n      temp2 = temp;\n    }\n    /* Watch out for case that nonzero coef is zero after point transform */\n    if (temp == 0) {\n      r++;\n      continue;\n    }\n\n    /* Emit any pending EOBRUN */\n    if (entropy->EOBRUN > 0)\n      emit_eobrun(entropy);\n    /* if run length > 15, must emit special run-length-16 codes (0xF0) */\n    while (r > 15) {\n      emit_symbol(entropy, entropy->ac_tbl_no, 0xF0);\n      r -= 16;\n    }\n\n    /* Find the number of bits needed for the magnitude of the coefficient */\n    nbits = 1;\t\t\t/* there must be at least one 1 bit */\n    while ((temp >>= 1))\n      nbits++;\n    /* Check for out-of-range coefficient values */\n    if (nbits > MAX_COEF_BITS)\n      ERREXIT(cinfo, JERR_BAD_DCT_COEF);\n\n    /* Count/emit Huffman symbol for run length / number of bits */\n    emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + nbits);\n\n    /* Emit that number of bits of the value, if positive, */\n    /* or the complement of its magnitude, if negative. */\n    emit_bits(entropy, (unsigned int) temp2, nbits);\n\n    r = 0;\t\t\t/* reset zero run length */\n  }\n\n  if (r > 0) {\t\t\t/* If there are trailing zeroes, */\n    entropy->EOBRUN++;\t\t/* count an EOB */\n    if (entropy->EOBRUN == 0x7FFF)\n      emit_eobrun(entropy);\t/* force it out to avoid overflow */\n  }\n\n  cinfo->dest->next_output_byte = entropy->next_output_byte;\n  cinfo->dest->free_in_buffer = entropy->free_in_buffer;\n\n  /* Update restart-interval state too */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0) {\n      entropy->restarts_to_go = cinfo->restart_interval;\n      entropy->next_restart_num++;\n      entropy->next_restart_num &= 7;\n    }\n    entropy->restarts_to_go--;\n  }\n\n  return TRUE;\n}\n\n\n/*\n * MCU encoding for DC successive approximation refinement scan.\n * Note: we assume such scans can be multi-component, although the spec\n * is not very clear on the point.\n */\n\nMETHODDEF(boolean)\nencode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)\n{\n  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;\n  register int temp;\n  int blkn;\n  int Al = cinfo->Al;\n  JBLOCKROW block;\n\n  entropy->next_output_byte = cinfo->dest->next_output_byte;\n  entropy->free_in_buffer = cinfo->dest->free_in_buffer;\n\n  /* Emit restart marker if needed */\n  if (cinfo->restart_interval)\n    if (entropy->restarts_to_go == 0)\n      emit_restart(entropy, entropy->next_restart_num);\n\n  /* Encode the MCU data blocks */\n  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {\n    block = MCU_data[blkn];\n\n    /* We simply emit the Al'th bit of the DC coefficient value. */\n    temp = (*block)[0];\n    emit_bits(entropy, (unsigned int) (temp >> Al), 1);\n  }\n\n  cinfo->dest->next_output_byte = entropy->next_output_byte;\n  cinfo->dest->free_in_buffer = entropy->free_in_buffer;\n\n  /* Update restart-interval state too */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0) {\n      entropy->restarts_to_go = cinfo->restart_interval;\n      entropy->next_restart_num++;\n      entropy->next_restart_num &= 7;\n    }\n    entropy->restarts_to_go--;\n  }\n\n  return TRUE;\n}\n\n\n/*\n * MCU encoding for AC successive approximation refinement scan.\n */\n\nMETHODDEF(boolean)\nencode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)\n{\n  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;\n  register int temp;\n  register int r, k;\n  int EOB;\n  char *BR_buffer;\n  unsigned int BR;\n  int Se = cinfo->Se;\n  int Al = cinfo->Al;\n  JBLOCKROW block;\n  int absvalues[DCTSIZE2];\n\n  entropy->next_output_byte = cinfo->dest->next_output_byte;\n  entropy->free_in_buffer = cinfo->dest->free_in_buffer;\n\n  /* Emit restart marker if needed */\n  if (cinfo->restart_interval)\n    if (entropy->restarts_to_go == 0)\n      emit_restart(entropy, entropy->next_restart_num);\n\n  /* Encode the MCU data block */\n  block = MCU_data[0];\n\n  /* It is convenient to make a pre-pass to determine the transformed\n   * coefficients' absolute values and the EOB position.\n   */\n  EOB = 0;\n  for (k = cinfo->Ss; k <= Se; k++) {\n    temp = (*block)[jpeg_natural_order[k]];\n    /* We must apply the point transform by Al.  For AC coefficients this\n     * is an integer division with rounding towards 0.  To do this portably\n     * in C, we shift after obtaining the absolute value.\n     */\n    if (temp < 0)\n      temp = -temp;\t\t/* temp is abs value of input */\n    temp >>= Al;\t\t/* apply the point transform */\n    absvalues[k] = temp;\t/* save abs value for main pass */\n    if (temp == 1)\n      EOB = k;\t\t\t/* EOB = index of last newly-nonzero coef */\n  }\n\n  /* Encode the AC coefficients per section G.1.2.3, fig. G.7 */\n  \n  r = 0;\t\t\t/* r = run length of zeros */\n  BR = 0;\t\t\t/* BR = count of buffered bits added now */\n  BR_buffer = entropy->bit_buffer + entropy->BE; /* Append bits to buffer */\n\n  for (k = cinfo->Ss; k <= Se; k++) {\n    if ((temp = absvalues[k]) == 0) {\n      r++;\n      continue;\n    }\n\n    /* Emit any required ZRLs, but not if they can be folded into EOB */\n    while (r > 15 && k <= EOB) {\n      /* emit any pending EOBRUN and the BE correction bits */\n      emit_eobrun(entropy);\n      /* Emit ZRL */\n      emit_symbol(entropy, entropy->ac_tbl_no, 0xF0);\n      r -= 16;\n      /* Emit buffered correction bits that must be associated with ZRL */\n      emit_buffered_bits(entropy, BR_buffer, BR);\n      BR_buffer = entropy->bit_buffer; /* BE bits are gone now */\n      BR = 0;\n    }\n\n    /* If the coef was previously nonzero, it only needs a correction bit.\n     * NOTE: a straight translation of the spec's figure G.7 would suggest\n     * that we also need to test r > 15.  But if r > 15, we can only get here\n     * if k > EOB, which implies that this coefficient is not 1.\n     */\n    if (temp > 1) {\n      /* The correction bit is the next bit of the absolute value. */\n      BR_buffer[BR++] = (char) (temp & 1);\n      continue;\n    }\n\n    /* Emit any pending EOBRUN and the BE correction bits */\n    emit_eobrun(entropy);\n\n    /* Count/emit Huffman symbol for run length / number of bits */\n    emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + 1);\n\n    /* Emit output bit for newly-nonzero coef */\n    temp = ((*block)[jpeg_natural_order[k]] < 0) ? 0 : 1;\n    emit_bits(entropy, (unsigned int) temp, 1);\n\n    /* Emit buffered correction bits that must be associated with this code */\n    emit_buffered_bits(entropy, BR_buffer, BR);\n    BR_buffer = entropy->bit_buffer; /* BE bits are gone now */\n    BR = 0;\n    r = 0;\t\t\t/* reset zero run length */\n  }\n\n  if (r > 0 || BR > 0) {\t/* If there are trailing zeroes, */\n    entropy->EOBRUN++;\t\t/* count an EOB */\n    entropy->BE += BR;\t\t/* concat my correction bits to older ones */\n    /* We force out the EOB if we risk either:\n     * 1. overflow of the EOB counter;\n     * 2. overflow of the correction bit buffer during the next MCU.\n     */\n    if (entropy->EOBRUN == 0x7FFF || entropy->BE > (MAX_CORR_BITS-DCTSIZE2+1))\n      emit_eobrun(entropy);\n  }\n\n  cinfo->dest->next_output_byte = entropy->next_output_byte;\n  cinfo->dest->free_in_buffer = entropy->free_in_buffer;\n\n  /* Update restart-interval state too */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0) {\n      entropy->restarts_to_go = cinfo->restart_interval;\n      entropy->next_restart_num++;\n      entropy->next_restart_num &= 7;\n    }\n    entropy->restarts_to_go--;\n  }\n\n  return TRUE;\n}\n\n\n/*\n * Finish up at the end of a Huffman-compressed progressive scan.\n */\n\nMETHODDEF(void)\nfinish_pass_phuff (j_compress_ptr cinfo)\n{   \n  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;\n\n  entropy->next_output_byte = cinfo->dest->next_output_byte;\n  entropy->free_in_buffer = cinfo->dest->free_in_buffer;\n\n  /* Flush out any buffered data */\n  emit_eobrun(entropy);\n  flush_bits(entropy);\n\n  cinfo->dest->next_output_byte = entropy->next_output_byte;\n  cinfo->dest->free_in_buffer = entropy->free_in_buffer;\n}\n\n\n/*\n * Finish up a statistics-gathering pass and create the new Huffman tables.\n */\n\nMETHODDEF(void)\nfinish_pass_gather_phuff (j_compress_ptr cinfo)\n{\n  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;\n  boolean is_DC_band;\n  int ci, tbl;\n  jpeg_component_info * compptr;\n  JHUFF_TBL **htblptr;\n  boolean did[NUM_HUFF_TBLS];\n\n  /* Flush out buffered data (all we care about is counting the EOB symbol) */\n  emit_eobrun(entropy);\n\n  is_DC_band = (cinfo->Ss == 0);\n\n  /* It's important not to apply jpeg_gen_optimal_table more than once\n   * per table, because it clobbers the input frequency counts!\n   */\n  MEMZERO(did, SIZEOF(did));\n\n  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n    compptr = cinfo->cur_comp_info[ci];\n    if (is_DC_band) {\n      if (cinfo->Ah != 0)\t/* DC refinement needs no table */\n\tcontinue;\n      tbl = compptr->dc_tbl_no;\n    } else {\n      tbl = compptr->ac_tbl_no;\n    }\n    if (! did[tbl]) {\n      if (is_DC_band)\n        htblptr = & cinfo->dc_huff_tbl_ptrs[tbl];\n      else\n        htblptr = & cinfo->ac_huff_tbl_ptrs[tbl];\n      if (*htblptr == NULL)\n        *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);\n      jpeg_gen_optimal_table(cinfo, *htblptr, entropy->count_ptrs[tbl]);\n      did[tbl] = TRUE;\n    }\n  }\n}\n\n\n/*\n * Module initialization routine for progressive Huffman entropy encoding.\n */\n\nGLOBAL(void)\njinit_phuff_encoder (j_compress_ptr cinfo)\n{\n  phuff_entropy_ptr entropy;\n  int i;\n\n  entropy = (phuff_entropy_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(phuff_entropy_encoder));\n  cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;\n  entropy->pub.start_pass = start_pass_phuff;\n\n  /* Mark tables unallocated */\n  for (i = 0; i < NUM_HUFF_TBLS; i++) {\n    entropy->derived_tbls[i] = NULL;\n    entropy->count_ptrs[i] = NULL;\n  }\n  entropy->bit_buffer = NULL;\t/* needed only in AC refinement scan */\n}\n\n#endif /* C_PROGRESSIVE_SUPPORTED */\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jcprepct.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jcprepct.c\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains the compression preprocessing controller.\n * This controller manages the color conversion, downsampling,\n * and edge expansion steps.\n *\n * Most of the complexity here is associated with buffering input rows\n * as required by the downsampler.  See the comments at the head of\n * jcsample.c for the downsampler's needs.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* At present, jcsample.c can request context rows only for smoothing.\n * In the future, we might also need context rows for CCIR601 sampling\n * or other more-complex downsampling procedures.  The code to support\n * context rows should be compiled only if needed.\n */\n#ifdef INPUT_SMOOTHING_SUPPORTED\n#define CONTEXT_ROWS_SUPPORTED\n#endif\n\n\n/*\n * For the simple (no-context-row) case, we just need to buffer one\n * row group's worth of pixels for the downsampling step.  At the bottom of\n * the image, we pad to a full row group by replicating the last pixel row.\n * The downsampler's last output row is then replicated if needed to pad\n * out to a full iMCU row.\n *\n * When providing context rows, we must buffer three row groups' worth of\n * pixels.  Three row groups are physically allocated, but the row pointer\n * arrays are made five row groups high, with the extra pointers above and\n * below \"wrapping around\" to point to the last and first real row groups.\n * This allows the downsampler to access the proper context rows.\n * At the top and bottom of the image, we create dummy context rows by\n * copying the first or last real pixel row.  This copying could be avoided\n * by pointer hacking as is done in jdmainct.c, but it doesn't seem worth the\n * trouble on the compression side.\n */\n\n\n/* Private buffer controller object */\n\ntypedef struct {\n  struct jpeg_c_prep_controller pub; /* public fields */\n\n  /* Downsampling input buffer.  This buffer holds color-converted data\n   * until we have enough to do a downsample step.\n   */\n  JSAMPARRAY color_buf[MAX_COMPONENTS];\n\n  JDIMENSION rows_to_go;\t/* counts rows remaining in source image */\n  int next_buf_row;\t\t/* index of next row to store in color_buf */\n\n#ifdef CONTEXT_ROWS_SUPPORTED\t/* only needed for context case */\n  int this_row_group;\t\t/* starting row index of group to process */\n  int next_buf_stop;\t\t/* downsample when we reach this index */\n#endif\n} my_prep_controller;\n\ntypedef my_prep_controller * my_prep_ptr;\n\n\n/*\n * Initialize for a processing pass.\n */\n\nMETHODDEF(void)\nstart_pass_prep (j_compress_ptr cinfo, J_BUF_MODE pass_mode)\n{\n  my_prep_ptr prep = (my_prep_ptr) cinfo->prep;\n\n  if (pass_mode != JBUF_PASS_THRU)\n    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n\n  /* Initialize total-height counter for detecting bottom of image */\n  prep->rows_to_go = cinfo->image_height;\n  /* Mark the conversion buffer empty */\n  prep->next_buf_row = 0;\n#ifdef CONTEXT_ROWS_SUPPORTED\n  /* Preset additional state variables for context mode.\n   * These aren't used in non-context mode, so we needn't test which mode.\n   */\n  prep->this_row_group = 0;\n  /* Set next_buf_stop to stop after two row groups have been read in. */\n  prep->next_buf_stop = 2 * cinfo->max_v_samp_factor;\n#endif\n}\n\n\n/*\n * Expand an image vertically from height input_rows to height output_rows,\n * by duplicating the bottom row.\n */\n\nLOCAL(void)\nexpand_bottom_edge (JSAMPARRAY image_data, JDIMENSION num_cols,\n\t\t    int input_rows, int output_rows)\n{\n  register int row;\n\n  for (row = input_rows; row < output_rows; row++) {\n    jcopy_sample_rows(image_data, input_rows-1, image_data, row,\n\t\t      1, num_cols);\n  }\n}\n\n\n/*\n * Process some data in the simple no-context case.\n *\n * Preprocessor output data is counted in \"row groups\".  A row group\n * is defined to be v_samp_factor sample rows of each component.\n * Downsampling will produce this much data from each max_v_samp_factor\n * input rows.\n */\n\nMETHODDEF(void)\npre_process_data (j_compress_ptr cinfo,\n\t\t  JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,\n\t\t  JDIMENSION in_rows_avail,\n\t\t  JSAMPIMAGE output_buf, JDIMENSION *out_row_group_ctr,\n\t\t  JDIMENSION out_row_groups_avail)\n{\n  my_prep_ptr prep = (my_prep_ptr) cinfo->prep;\n  int numrows, ci;\n  JDIMENSION inrows;\n  jpeg_component_info * compptr;\n\n  while (*in_row_ctr < in_rows_avail &&\n\t *out_row_group_ctr < out_row_groups_avail) {\n    /* Do color conversion to fill the conversion buffer. */\n    inrows = in_rows_avail - *in_row_ctr;\n    numrows = cinfo->max_v_samp_factor - prep->next_buf_row;\n    numrows = (int) MIN((JDIMENSION) numrows, inrows);\n    (*cinfo->cconvert->color_convert) (cinfo, input_buf + *in_row_ctr,\n\t\t\t\t       prep->color_buf,\n\t\t\t\t       (JDIMENSION) prep->next_buf_row,\n\t\t\t\t       numrows);\n    *in_row_ctr += numrows;\n    prep->next_buf_row += numrows;\n    prep->rows_to_go -= numrows;\n    /* If at bottom of image, pad to fill the conversion buffer. */\n    if (prep->rows_to_go == 0 &&\n\tprep->next_buf_row < cinfo->max_v_samp_factor) {\n      for (ci = 0; ci < cinfo->num_components; ci++) {\n\texpand_bottom_edge(prep->color_buf[ci], cinfo->image_width,\n\t\t\t   prep->next_buf_row, cinfo->max_v_samp_factor);\n      }\n      prep->next_buf_row = cinfo->max_v_samp_factor;\n    }\n    /* If we've filled the conversion buffer, empty it. */\n    if (prep->next_buf_row == cinfo->max_v_samp_factor) {\n      (*cinfo->downsample->downsample) (cinfo,\n\t\t\t\t\tprep->color_buf, (JDIMENSION) 0,\n\t\t\t\t\toutput_buf, *out_row_group_ctr);\n      prep->next_buf_row = 0;\n      (*out_row_group_ctr)++;\n    }\n    /* If at bottom of image, pad the output to a full iMCU height.\n     * Note we assume the caller is providing a one-iMCU-height output buffer!\n     */\n    if (prep->rows_to_go == 0 &&\n\t*out_row_group_ctr < out_row_groups_avail) {\n      for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n\t   ci++, compptr++) {\n\texpand_bottom_edge(output_buf[ci],\n\t\t\t   compptr->width_in_blocks * DCTSIZE,\n\t\t\t   (int) (*out_row_group_ctr * compptr->v_samp_factor),\n\t\t\t   (int) (out_row_groups_avail * compptr->v_samp_factor));\n      }\n      *out_row_group_ctr = out_row_groups_avail;\n      break;\t\t\t/* can exit outer loop without test */\n    }\n  }\n}\n\n\n#ifdef CONTEXT_ROWS_SUPPORTED\n\n/*\n * Process some data in the context case.\n */\n\nMETHODDEF(void)\npre_process_context (j_compress_ptr cinfo,\n\t\t     JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,\n\t\t     JDIMENSION in_rows_avail,\n\t\t     JSAMPIMAGE output_buf, JDIMENSION *out_row_group_ctr,\n\t\t     JDIMENSION out_row_groups_avail)\n{\n  my_prep_ptr prep = (my_prep_ptr) cinfo->prep;\n  int numrows, ci;\n  int buf_height = cinfo->max_v_samp_factor * 3;\n  JDIMENSION inrows;\n\n  while (*out_row_group_ctr < out_row_groups_avail) {\n    if (*in_row_ctr < in_rows_avail) {\n      /* Do color conversion to fill the conversion buffer. */\n      inrows = in_rows_avail - *in_row_ctr;\n      numrows = prep->next_buf_stop - prep->next_buf_row;\n      numrows = (int) MIN((JDIMENSION) numrows, inrows);\n      (*cinfo->cconvert->color_convert) (cinfo, input_buf + *in_row_ctr,\n\t\t\t\t\t prep->color_buf,\n\t\t\t\t\t (JDIMENSION) prep->next_buf_row,\n\t\t\t\t\t numrows);\n      /* Pad at top of image, if first time through */\n      if (prep->rows_to_go == cinfo->image_height) {\n\tfor (ci = 0; ci < cinfo->num_components; ci++) {\n\t  int row;\n\t  for (row = 1; row <= cinfo->max_v_samp_factor; row++) {\n\t    jcopy_sample_rows(prep->color_buf[ci], 0,\n\t\t\t      prep->color_buf[ci], -row,\n\t\t\t      1, cinfo->image_width);\n\t  }\n\t}\n      }\n      *in_row_ctr += numrows;\n      prep->next_buf_row += numrows;\n      prep->rows_to_go -= numrows;\n    } else {\n      /* Return for more data, unless we are at the bottom of the image. */\n      if (prep->rows_to_go != 0)\n\tbreak;\n      /* When at bottom of image, pad to fill the conversion buffer. */\n      if (prep->next_buf_row < prep->next_buf_stop) {\n\tfor (ci = 0; ci < cinfo->num_components; ci++) {\n\t  expand_bottom_edge(prep->color_buf[ci], cinfo->image_width,\n\t\t\t     prep->next_buf_row, prep->next_buf_stop);\n\t}\n\tprep->next_buf_row = prep->next_buf_stop;\n      }\n    }\n    /* If we've gotten enough data, downsample a row group. */\n    if (prep->next_buf_row == prep->next_buf_stop) {\n      (*cinfo->downsample->downsample) (cinfo,\n\t\t\t\t\tprep->color_buf,\n\t\t\t\t\t(JDIMENSION) prep->this_row_group,\n\t\t\t\t\toutput_buf, *out_row_group_ctr);\n      (*out_row_group_ctr)++;\n      /* Advance pointers with wraparound as necessary. */\n      prep->this_row_group += cinfo->max_v_samp_factor;\n      if (prep->this_row_group >= buf_height)\n\tprep->this_row_group = 0;\n      if (prep->next_buf_row >= buf_height)\n\tprep->next_buf_row = 0;\n      prep->next_buf_stop = prep->next_buf_row + cinfo->max_v_samp_factor;\n    }\n  }\n}\n\n\n/*\n * Create the wrapped-around downsampling input buffer needed for context mode.\n */\n\nLOCAL(void)\ncreate_context_buffer (j_compress_ptr cinfo)\n{\n  my_prep_ptr prep = (my_prep_ptr) cinfo->prep;\n  int rgroup_height = cinfo->max_v_samp_factor;\n  int ci, i;\n  jpeg_component_info * compptr;\n  JSAMPARRAY true_buffer, fake_buffer;\n\n  /* Grab enough space for fake row pointers for all the components;\n   * we need five row groups' worth of pointers for each component.\n   */\n  fake_buffer = (JSAMPARRAY)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t(cinfo->num_components * 5 * rgroup_height) *\n\t\t\t\tSIZEOF(JSAMPROW));\n\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    /* Allocate the actual buffer space (3 row groups) for this component.\n     * We make the buffer wide enough to allow the downsampler to edge-expand\n     * horizontally within the buffer, if it so chooses.\n     */\n    true_buffer = (*cinfo->mem->alloc_sarray)\n      ((j_common_ptr) cinfo, JPOOL_IMAGE,\n       (JDIMENSION) (((long) compptr->width_in_blocks * DCTSIZE *\n\t\t      cinfo->max_h_samp_factor) / compptr->h_samp_factor),\n       (JDIMENSION) (3 * rgroup_height));\n    /* Copy true buffer row pointers into the middle of the fake row array */\n    MEMCOPY(fake_buffer + rgroup_height, true_buffer,\n\t    3 * rgroup_height * SIZEOF(JSAMPROW));\n    /* Fill in the above and below wraparound pointers */\n    for (i = 0; i < rgroup_height; i++) {\n      fake_buffer[i] = true_buffer[2 * rgroup_height + i];\n      fake_buffer[4 * rgroup_height + i] = true_buffer[i];\n    }\n    prep->color_buf[ci] = fake_buffer + rgroup_height;\n    fake_buffer += 5 * rgroup_height; /* point to space for next component */\n  }\n}\n\n#endif /* CONTEXT_ROWS_SUPPORTED */\n\n\n/*\n * Initialize preprocessing controller.\n */\n\nGLOBAL(void)\njinit_c_prep_controller (j_compress_ptr cinfo, boolean need_full_buffer)\n{\n  my_prep_ptr prep;\n  int ci;\n  jpeg_component_info * compptr;\n\n  if (need_full_buffer)\t\t/* safety check */\n    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n\n  prep = (my_prep_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_prep_controller));\n  cinfo->prep = (struct jpeg_c_prep_controller *) prep;\n  prep->pub.start_pass = start_pass_prep;\n\n  /* Allocate the color conversion buffer.\n   * We make the buffer wide enough to allow the downsampler to edge-expand\n   * horizontally within the buffer, if it so chooses.\n   */\n  if (cinfo->downsample->need_context_rows) {\n    /* Set up to provide context rows */\n#ifdef CONTEXT_ROWS_SUPPORTED\n    prep->pub.pre_process_data = pre_process_context;\n    create_context_buffer(cinfo);\n#else\n    ERREXIT(cinfo, JERR_NOT_COMPILED);\n#endif\n  } else {\n    /* No context, just make it tall enough for one row group */\n    prep->pub.pre_process_data = pre_process_data;\n    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n\t ci++, compptr++) {\n      prep->color_buf[ci] = (*cinfo->mem->alloc_sarray)\n\t((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t (JDIMENSION) (((long) compptr->width_in_blocks * DCTSIZE *\n\t\t\tcinfo->max_h_samp_factor) / compptr->h_samp_factor),\n\t (JDIMENSION) cinfo->max_v_samp_factor);\n    }\n  }\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jcsample.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jcsample.c\n *\n * Copyright (C) 1991-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains downsampling routines.\n *\n * Downsampling input data is counted in \"row groups\".  A row group\n * is defined to be max_v_samp_factor pixel rows of each component,\n * from which the downsampler produces v_samp_factor sample rows.\n * A single row group is processed in each call to the downsampler module.\n *\n * The downsampler is responsible for edge-expansion of its output data\n * to fill an integral number of DCT blocks horizontally.  The source buffer\n * may be modified if it is helpful for this purpose (the source buffer is\n * allocated wide enough to correspond to the desired output width).\n * The caller (the prep controller) is responsible for vertical padding.\n *\n * The downsampler may request \"context rows\" by setting need_context_rows\n * during startup.  In this case, the input arrays will contain at least\n * one row group's worth of pixels above and below the passed-in data;\n * the caller will create dummy rows at image top and bottom by replicating\n * the first or last real pixel row.\n *\n * An excellent reference for image resampling is\n *   Digital Image Warping, George Wolberg, 1990.\n *   Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7.\n *\n * The downsampling algorithm used here is a simple average of the source\n * pixels covered by the output pixel.  The hi-falutin sampling literature\n * refers to this as a \"box filter\".  In general the characteristics of a box\n * filter are not very good, but for the specific cases we normally use (1:1\n * and 2:1 ratios) the box is equivalent to a \"triangle filter\" which is not\n * nearly so bad.  If you intend to use other sampling ratios, you'd be well\n * advised to improve this code.\n *\n * A simple input-smoothing capability is provided.  This is mainly intended\n * for cleaning up color-dithered GIF input files (if you find it inadequate,\n * we suggest using an external filtering program such as pnmconvol).  When\n * enabled, each input pixel P is replaced by a weighted sum of itself and its\n * eight neighbors.  P's weight is 1-8*SF and each neighbor's weight is SF,\n * where SF = (smoothing_factor / 1024).\n * Currently, smoothing is only supported for 2h2v sampling factors.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Pointer to routine to downsample a single component */\ntypedef JMETHOD(void, downsample1_ptr,\n\t\t(j_compress_ptr cinfo, jpeg_component_info * compptr,\n\t\t JSAMPARRAY input_data, JSAMPARRAY output_data));\n\n/* Private subobject */\n\ntypedef struct {\n  struct jpeg_downsampler pub;\t/* public fields */\n\n  /* Downsampling method pointers, one per component */\n  downsample1_ptr methods[MAX_COMPONENTS];\n} my_downsampler;\n\ntypedef my_downsampler * my_downsample_ptr;\n\n\n/*\n * Initialize for a downsampling pass.\n */\n\nMETHODDEF(void)\nstart_pass_downsample (j_compress_ptr cinfo)\n{\n  /* no work for now */\n}\n\n\n/*\n * Expand a component horizontally from width input_cols to width output_cols,\n * by duplicating the rightmost samples.\n */\n\nLOCAL(void)\nexpand_right_edge (JSAMPARRAY image_data, int num_rows,\n\t\t   JDIMENSION input_cols, JDIMENSION output_cols)\n{\n  register JSAMPROW ptr;\n  register JSAMPLE pixval;\n  register int count;\n  int row;\n  int numcols = (int) (output_cols - input_cols);\n\n  if (numcols > 0) {\n    for (row = 0; row < num_rows; row++) {\n      ptr = image_data[row] + input_cols;\n      pixval = ptr[-1];\t\t/* don't need GETJSAMPLE() here */\n      for (count = numcols; count > 0; count--)\n\t*ptr++ = pixval;\n    }\n  }\n}\n\n\n/*\n * Do downsampling for a whole row group (all components).\n *\n * In this version we simply downsample each component independently.\n */\n\nMETHODDEF(void)\nsep_downsample (j_compress_ptr cinfo,\n\t\tJSAMPIMAGE input_buf, JDIMENSION in_row_index,\n\t\tJSAMPIMAGE output_buf, JDIMENSION out_row_group_index)\n{\n  my_downsample_ptr downsample = (my_downsample_ptr) cinfo->downsample;\n  int ci;\n  jpeg_component_info * compptr;\n  JSAMPARRAY in_ptr, out_ptr;\n\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    in_ptr = input_buf[ci] + in_row_index;\n    out_ptr = output_buf[ci] + (out_row_group_index * compptr->v_samp_factor);\n    (*downsample->methods[ci]) (cinfo, compptr, in_ptr, out_ptr);\n  }\n}\n\n\n/*\n * Downsample pixel values of a single component.\n * One row group is processed per call.\n * This version handles arbitrary integral sampling ratios, without smoothing.\n * Note that this version is not actually used for customary sampling ratios.\n */\n\nMETHODDEF(void)\nint_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,\n\t\tJSAMPARRAY input_data, JSAMPARRAY output_data)\n{\n  int inrow, outrow, h_expand, v_expand, numpix, numpix2, h, v;\n  JDIMENSION outcol, outcol_h;\t/* outcol_h == outcol*h_expand */\n  JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;\n  JSAMPROW inptr, outptr;\n  INT32 outvalue;\n\n  h_expand = cinfo->max_h_samp_factor / compptr->h_samp_factor;\n  v_expand = cinfo->max_v_samp_factor / compptr->v_samp_factor;\n  numpix = h_expand * v_expand;\n  numpix2 = numpix/2;\n\n  /* Expand input data enough to let all the output samples be generated\n   * by the standard loop.  Special-casing padded output would be more\n   * efficient.\n   */\n  expand_right_edge(input_data, cinfo->max_v_samp_factor,\n\t\t    cinfo->image_width, output_cols * h_expand);\n\n  inrow = 0;\n  for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {\n    outptr = output_data[outrow];\n    for (outcol = 0, outcol_h = 0; outcol < output_cols;\n\t outcol++, outcol_h += h_expand) {\n      outvalue = 0;\n      for (v = 0; v < v_expand; v++) {\n\tinptr = input_data[inrow+v] + outcol_h;\n\tfor (h = 0; h < h_expand; h++) {\n\t  outvalue += (INT32) GETJSAMPLE(*inptr++);\n\t}\n      }\n      *outptr++ = (JSAMPLE) ((outvalue + numpix2) / numpix);\n    }\n    inrow += v_expand;\n  }\n}\n\n\n/*\n * Downsample pixel values of a single component.\n * This version handles the special case of a full-size component,\n * without smoothing.\n */\n\nMETHODDEF(void)\nfullsize_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,\n\t\t     JSAMPARRAY input_data, JSAMPARRAY output_data)\n{\n  /* Copy the data */\n  jcopy_sample_rows(input_data, 0, output_data, 0,\n\t\t    cinfo->max_v_samp_factor, cinfo->image_width);\n  /* Edge-expand */\n  expand_right_edge(output_data, cinfo->max_v_samp_factor,\n\t\t    cinfo->image_width, compptr->width_in_blocks * DCTSIZE);\n}\n\n\n/*\n * Downsample pixel values of a single component.\n * This version handles the common case of 2:1 horizontal and 1:1 vertical,\n * without smoothing.\n *\n * A note about the \"bias\" calculations: when rounding fractional values to\n * integer, we do not want to always round 0.5 up to the next integer.\n * If we did that, we'd introduce a noticeable bias towards larger values.\n * Instead, this code is arranged so that 0.5 will be rounded up or down at\n * alternate pixel locations (a simple ordered dither pattern).\n */\n\nMETHODDEF(void)\nh2v1_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,\n\t\t JSAMPARRAY input_data, JSAMPARRAY output_data)\n{\n  int outrow;\n  JDIMENSION outcol;\n  JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;\n  register JSAMPROW inptr, outptr;\n  register int bias;\n\n  /* Expand input data enough to let all the output samples be generated\n   * by the standard loop.  Special-casing padded output would be more\n   * efficient.\n   */\n  expand_right_edge(input_data, cinfo->max_v_samp_factor,\n\t\t    cinfo->image_width, output_cols * 2);\n\n  for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {\n    outptr = output_data[outrow];\n    inptr = input_data[outrow];\n    bias = 0;\t\t\t/* bias = 0,1,0,1,... for successive samples */\n    for (outcol = 0; outcol < output_cols; outcol++) {\n      *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr) + GETJSAMPLE(inptr[1])\n\t\t\t      + bias) >> 1);\n      bias ^= 1;\t\t/* 0=>1, 1=>0 */\n      inptr += 2;\n    }\n  }\n}\n\n\n/*\n * Downsample pixel values of a single component.\n * This version handles the standard case of 2:1 horizontal and 2:1 vertical,\n * without smoothing.\n */\n\nMETHODDEF(void)\nh2v2_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,\n\t\t JSAMPARRAY input_data, JSAMPARRAY output_data)\n{\n  int inrow, outrow;\n  JDIMENSION outcol;\n  JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;\n  register JSAMPROW inptr0, inptr1, outptr;\n  register int bias;\n\n  /* Expand input data enough to let all the output samples be generated\n   * by the standard loop.  Special-casing padded output would be more\n   * efficient.\n   */\n  expand_right_edge(input_data, cinfo->max_v_samp_factor,\n\t\t    cinfo->image_width, output_cols * 2);\n\n  inrow = 0;\n  for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {\n    outptr = output_data[outrow];\n    inptr0 = input_data[inrow];\n    inptr1 = input_data[inrow+1];\n    bias = 1;\t\t\t/* bias = 1,2,1,2,... for successive samples */\n    for (outcol = 0; outcol < output_cols; outcol++) {\n      *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +\n\t\t\t      GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1])\n\t\t\t      + bias) >> 2);\n      bias ^= 3;\t\t/* 1=>2, 2=>1 */\n      inptr0 += 2; inptr1 += 2;\n    }\n    inrow += 2;\n  }\n}\n\n\n#ifdef INPUT_SMOOTHING_SUPPORTED\n\n/*\n * Downsample pixel values of a single component.\n * This version handles the standard case of 2:1 horizontal and 2:1 vertical,\n * with smoothing.  One row of context is required.\n */\n\nMETHODDEF(void)\nh2v2_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,\n\t\t\tJSAMPARRAY input_data, JSAMPARRAY output_data)\n{\n  int inrow, outrow;\n  JDIMENSION colctr;\n  JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;\n  register JSAMPROW inptr0, inptr1, above_ptr, below_ptr, outptr;\n  INT32 membersum, neighsum, memberscale, neighscale;\n\n  /* Expand input data enough to let all the output samples be generated\n   * by the standard loop.  Special-casing padded output would be more\n   * efficient.\n   */\n  expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2,\n\t\t    cinfo->image_width, output_cols * 2);\n\n  /* We don't bother to form the individual \"smoothed\" input pixel values;\n   * we can directly compute the output which is the average of the four\n   * smoothed values.  Each of the four member pixels contributes a fraction\n   * (1-8*SF) to its own smoothed image and a fraction SF to each of the three\n   * other smoothed pixels, therefore a total fraction (1-5*SF)/4 to the final\n   * output.  The four corner-adjacent neighbor pixels contribute a fraction\n   * SF to just one smoothed pixel, or SF/4 to the final output; while the\n   * eight edge-adjacent neighbors contribute SF to each of two smoothed\n   * pixels, or SF/2 overall.  In order to use integer arithmetic, these\n   * factors are scaled by 2^16 = 65536.\n   * Also recall that SF = smoothing_factor / 1024.\n   */\n\n  memberscale = 16384 - cinfo->smoothing_factor * 80; /* scaled (1-5*SF)/4 */\n  neighscale = cinfo->smoothing_factor * 16; /* scaled SF/4 */\n\n  inrow = 0;\n  for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {\n    outptr = output_data[outrow];\n    inptr0 = input_data[inrow];\n    inptr1 = input_data[inrow+1];\n    above_ptr = input_data[inrow-1];\n    below_ptr = input_data[inrow+2];\n\n    /* Special case for first column: pretend column -1 is same as column 0 */\n    membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +\n\t\tGETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);\n    neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +\n\t       GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +\n\t       GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[2]) +\n\t       GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[2]);\n    neighsum += neighsum;\n    neighsum += GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[2]) +\n\t\tGETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[2]);\n    membersum = membersum * memberscale + neighsum * neighscale;\n    *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);\n    inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2;\n\n    for (colctr = output_cols - 2; colctr > 0; colctr--) {\n      /* sum of pixels directly mapped to this output element */\n      membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +\n\t\t  GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);\n      /* sum of edge-neighbor pixels */\n      neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +\n\t\t GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +\n\t\t GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[2]) +\n\t\t GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[2]);\n      /* The edge-neighbors count twice as much as corner-neighbors */\n      neighsum += neighsum;\n      /* Add in the corner-neighbors */\n      neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[2]) +\n\t\t  GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[2]);\n      /* form final output scaled up by 2^16 */\n      membersum = membersum * memberscale + neighsum * neighscale;\n      /* round, descale and output it */\n      *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);\n      inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2;\n    }\n\n    /* Special case for last column */\n    membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +\n\t\tGETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);\n    neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +\n\t       GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +\n\t       GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[1]) +\n\t       GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[1]);\n    neighsum += neighsum;\n    neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[1]) +\n\t\tGETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[1]);\n    membersum = membersum * memberscale + neighsum * neighscale;\n    *outptr = (JSAMPLE) ((membersum + 32768) >> 16);\n\n    inrow += 2;\n  }\n}\n\n\n/*\n * Downsample pixel values of a single component.\n * This version handles the special case of a full-size component,\n * with smoothing.  One row of context is required.\n */\n\nMETHODDEF(void)\nfullsize_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info *compptr,\n\t\t\t    JSAMPARRAY input_data, JSAMPARRAY output_data)\n{\n  int outrow;\n  JDIMENSION colctr;\n  JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;\n  register JSAMPROW inptr, above_ptr, below_ptr, outptr;\n  INT32 membersum, neighsum, memberscale, neighscale;\n  int colsum, lastcolsum, nextcolsum;\n\n  /* Expand input data enough to let all the output samples be generated\n   * by the standard loop.  Special-casing padded output would be more\n   * efficient.\n   */\n  expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2,\n\t\t    cinfo->image_width, output_cols);\n\n  /* Each of the eight neighbor pixels contributes a fraction SF to the\n   * smoothed pixel, while the main pixel contributes (1-8*SF).  In order\n   * to use integer arithmetic, these factors are multiplied by 2^16 = 65536.\n   * Also recall that SF = smoothing_factor / 1024.\n   */\n\n  memberscale = 65536L - cinfo->smoothing_factor * 512L; /* scaled 1-8*SF */\n  neighscale = cinfo->smoothing_factor * 64; /* scaled SF */\n\n  for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {\n    outptr = output_data[outrow];\n    inptr = input_data[outrow];\n    above_ptr = input_data[outrow-1];\n    below_ptr = input_data[outrow+1];\n\n    /* Special case for first column */\n    colsum = GETJSAMPLE(*above_ptr++) + GETJSAMPLE(*below_ptr++) +\n\t     GETJSAMPLE(*inptr);\n    membersum = GETJSAMPLE(*inptr++);\n    nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) +\n\t\t GETJSAMPLE(*inptr);\n    neighsum = colsum + (colsum - membersum) + nextcolsum;\n    membersum = membersum * memberscale + neighsum * neighscale;\n    *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);\n    lastcolsum = colsum; colsum = nextcolsum;\n\n    for (colctr = output_cols - 2; colctr > 0; colctr--) {\n      membersum = GETJSAMPLE(*inptr++);\n      above_ptr++; below_ptr++;\n      nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) +\n\t\t   GETJSAMPLE(*inptr);\n      neighsum = lastcolsum + (colsum - membersum) + nextcolsum;\n      membersum = membersum * memberscale + neighsum * neighscale;\n      *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);\n      lastcolsum = colsum; colsum = nextcolsum;\n    }\n\n    /* Special case for last column */\n    membersum = GETJSAMPLE(*inptr);\n    neighsum = lastcolsum + (colsum - membersum) + colsum;\n    membersum = membersum * memberscale + neighsum * neighscale;\n    *outptr = (JSAMPLE) ((membersum + 32768) >> 16);\n\n  }\n}\n\n#endif /* INPUT_SMOOTHING_SUPPORTED */\n\n\n/*\n * Module initialization routine for downsampling.\n * Note that we must select a routine for each component.\n */\n\nGLOBAL(void)\njinit_downsampler (j_compress_ptr cinfo)\n{\n  my_downsample_ptr downsample;\n  int ci;\n  jpeg_component_info * compptr;\n  boolean smoothok = TRUE;\n\n  downsample = (my_downsample_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_downsampler));\n  cinfo->downsample = (struct jpeg_downsampler *) downsample;\n  downsample->pub.start_pass = start_pass_downsample;\n  downsample->pub.downsample = sep_downsample;\n  downsample->pub.need_context_rows = FALSE;\n\n  if (cinfo->CCIR601_sampling)\n    ERREXIT(cinfo, JERR_CCIR601_NOTIMPL);\n\n  /* Verify we can handle the sampling factors, and set up method pointers */\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    if (compptr->h_samp_factor == cinfo->max_h_samp_factor &&\n\tcompptr->v_samp_factor == cinfo->max_v_samp_factor) {\n#ifdef INPUT_SMOOTHING_SUPPORTED\n      if (cinfo->smoothing_factor) {\n\tdownsample->methods[ci] = fullsize_smooth_downsample;\n\tdownsample->pub.need_context_rows = TRUE;\n      } else\n#endif\n\tdownsample->methods[ci] = fullsize_downsample;\n    } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor &&\n\t       compptr->v_samp_factor == cinfo->max_v_samp_factor) {\n      smoothok = FALSE;\n      downsample->methods[ci] = h2v1_downsample;\n    } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor &&\n\t       compptr->v_samp_factor * 2 == cinfo->max_v_samp_factor) {\n#ifdef INPUT_SMOOTHING_SUPPORTED\n      if (cinfo->smoothing_factor) {\n\tdownsample->methods[ci] = h2v2_smooth_downsample;\n\tdownsample->pub.need_context_rows = TRUE;\n      } else\n#endif\n\tdownsample->methods[ci] = h2v2_downsample;\n    } else if ((cinfo->max_h_samp_factor % compptr->h_samp_factor) == 0 &&\n\t       (cinfo->max_v_samp_factor % compptr->v_samp_factor) == 0) {\n      smoothok = FALSE;\n      downsample->methods[ci] = int_downsample;\n    } else\n      ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL);\n  }\n\n#ifdef INPUT_SMOOTHING_SUPPORTED\n  if (cinfo->smoothing_factor && !smoothok)\n    TRACEMS(cinfo, 0, JTRC_SMOOTH_NOTIMPL);\n#endif\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jctrans.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jctrans.c\n *\n * Copyright (C) 1995-1998, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains library routines for transcoding compression,\n * that is, writing raw DCT coefficient arrays to an output JPEG file.\n * The routines in jcapimin.c will also be needed by a transcoder.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Forward declarations */\nLOCAL(void) transencode_master_selection\n\tJPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays));\nLOCAL(void) transencode_coef_controller\n\tJPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays));\n\n\n/*\n * Compression initialization for writing raw-coefficient data.\n * Before calling this, all parameters and a data destination must be set up.\n * Call jpeg_finish_compress() to actually write the data.\n *\n * The number of passed virtual arrays must match cinfo->num_components.\n * Note that the virtual arrays need not be filled or even realized at\n * the time write_coefficients is called; indeed, if the virtual arrays\n * were requested from this compression object's memory manager, they\n * typically will be realized during this routine and filled afterwards.\n */\n\nGLOBAL(void)\njpeg_write_coefficients (j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays)\n{\n  if (cinfo->global_state != CSTATE_START)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  /* Mark all tables to be written */\n  jpeg_suppress_tables(cinfo, FALSE);\n  /* (Re)initialize error mgr and destination modules */\n  (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);\n  (*cinfo->dest->init_destination) (cinfo);\n  /* Perform master selection of active modules */\n  transencode_master_selection(cinfo, coef_arrays);\n  /* Wait for jpeg_finish_compress() call */\n  cinfo->next_scanline = 0;\t/* so jpeg_write_marker works */\n  cinfo->global_state = CSTATE_WRCOEFS;\n}\n\n\n/*\n * Initialize the compression object with default parameters,\n * then copy from the source object all parameters needed for lossless\n * transcoding.  Parameters that can be varied without loss (such as\n * scan script and Huffman optimization) are left in their default states.\n */\n\nGLOBAL(void)\njpeg_copy_critical_parameters (j_decompress_ptr srcinfo,\n\t\t\t       j_compress_ptr dstinfo)\n{\n  JQUANT_TBL ** qtblptr;\n  jpeg_component_info *incomp, *outcomp;\n  JQUANT_TBL *c_quant, *slot_quant;\n  int tblno, ci, coefi;\n\n  /* Safety check to ensure start_compress not called yet. */\n  if (dstinfo->global_state != CSTATE_START)\n    ERREXIT1(dstinfo, JERR_BAD_STATE, dstinfo->global_state);\n  /* Copy fundamental image dimensions */\n  dstinfo->image_width = srcinfo->image_width;\n  dstinfo->image_height = srcinfo->image_height;\n  dstinfo->input_components = srcinfo->num_components;\n  dstinfo->in_color_space = srcinfo->jpeg_color_space;\n  /* Initialize all parameters to default values */\n  jpeg_set_defaults(dstinfo);\n  /* jpeg_set_defaults may choose wrong colorspace, eg YCbCr if input is RGB.\n   * Fix it to get the right header markers for the image colorspace.\n   */\n  jpeg_set_colorspace(dstinfo, srcinfo->jpeg_color_space);\n  dstinfo->data_precision = srcinfo->data_precision;\n  dstinfo->CCIR601_sampling = srcinfo->CCIR601_sampling;\n  /* Copy the source's quantization tables. */\n  for (tblno = 0; tblno < NUM_QUANT_TBLS; tblno++) {\n    if (srcinfo->quant_tbl_ptrs[tblno] != NULL) {\n      qtblptr = & dstinfo->quant_tbl_ptrs[tblno];\n      if (*qtblptr == NULL)\n\t*qtblptr = jpeg_alloc_quant_table((j_common_ptr) dstinfo);\n      MEMCOPY((*qtblptr)->quantval,\n\t      srcinfo->quant_tbl_ptrs[tblno]->quantval,\n\t      SIZEOF((*qtblptr)->quantval));\n      (*qtblptr)->sent_table = FALSE;\n    }\n  }\n  /* Copy the source's per-component info.\n   * Note we assume jpeg_set_defaults has allocated the dest comp_info array.\n   */\n  dstinfo->num_components = srcinfo->num_components;\n  if (dstinfo->num_components < 1 || dstinfo->num_components > MAX_COMPONENTS)\n    ERREXIT2(dstinfo, JERR_COMPONENT_COUNT, dstinfo->num_components,\n\t     MAX_COMPONENTS);\n  for (ci = 0, incomp = srcinfo->comp_info, outcomp = dstinfo->comp_info;\n       ci < dstinfo->num_components; ci++, incomp++, outcomp++) {\n    outcomp->component_id = incomp->component_id;\n    outcomp->h_samp_factor = incomp->h_samp_factor;\n    outcomp->v_samp_factor = incomp->v_samp_factor;\n    outcomp->quant_tbl_no = incomp->quant_tbl_no;\n    /* Make sure saved quantization table for component matches the qtable\n     * slot.  If not, the input file re-used this qtable slot.\n     * IJG encoder currently cannot duplicate this.\n     */\n    tblno = outcomp->quant_tbl_no;\n    if (tblno < 0 || tblno >= NUM_QUANT_TBLS ||\n\tsrcinfo->quant_tbl_ptrs[tblno] == NULL)\n      ERREXIT1(dstinfo, JERR_NO_QUANT_TABLE, tblno);\n    slot_quant = srcinfo->quant_tbl_ptrs[tblno];\n    c_quant = incomp->quant_table;\n    if (c_quant != NULL) {\n      for (coefi = 0; coefi < DCTSIZE2; coefi++) {\n\tif (c_quant->quantval[coefi] != slot_quant->quantval[coefi])\n\t  ERREXIT1(dstinfo, JERR_MISMATCHED_QUANT_TABLE, tblno);\n      }\n    }\n    /* Note: we do not copy the source's Huffman table assignments;\n     * instead we rely on jpeg_set_colorspace to have made a suitable choice.\n     */\n  }\n  /* Also copy JFIF version and resolution information, if available.\n   * Strictly speaking this isn't \"critical\" info, but it's nearly\n   * always appropriate to copy it if available.  In particular,\n   * if the application chooses to copy JFIF 1.02 extension markers from\n   * the source file, we need to copy the version to make sure we don't\n   * emit a file that has 1.02 extensions but a claimed version of 1.01.\n   * We will *not*, however, copy version info from mislabeled \"2.01\" files.\n   */\n  if (srcinfo->saw_JFIF_marker) {\n    if (srcinfo->JFIF_major_version == 1) {\n      dstinfo->JFIF_major_version = srcinfo->JFIF_major_version;\n      dstinfo->JFIF_minor_version = srcinfo->JFIF_minor_version;\n    }\n    dstinfo->density_unit = srcinfo->density_unit;\n    dstinfo->X_density = srcinfo->X_density;\n    dstinfo->Y_density = srcinfo->Y_density;\n  }\n}\n\n\n/*\n * Master selection of compression modules for transcoding.\n * This substitutes for jcinit.c's initialization of the full compressor.\n */\n\nLOCAL(void)\ntransencode_master_selection (j_compress_ptr cinfo,\n\t\t\t      jvirt_barray_ptr * coef_arrays)\n{\n  /* Although we don't actually use input_components for transcoding,\n   * jcmaster.c's initial_setup will complain if input_components is 0.\n   */\n  cinfo->input_components = 1;\n  /* Initialize master control (includes parameter checking/processing) */\n  jinit_c_master_control(cinfo, TRUE /* transcode only */);\n\n  /* Entropy encoding: either Huffman or arithmetic coding. */\n  if (cinfo->arith_code) {\n    ERREXIT(cinfo, JERR_ARITH_NOTIMPL);\n  } else {\n    if (cinfo->progressive_mode) {\n#ifdef C_PROGRESSIVE_SUPPORTED\n      jinit_phuff_encoder(cinfo);\n#else\n      ERREXIT(cinfo, JERR_NOT_COMPILED);\n#endif\n    } else\n      jinit_huff_encoder(cinfo);\n  }\n\n  /* We need a special coefficient buffer controller. */\n  transencode_coef_controller(cinfo, coef_arrays);\n\n  jinit_marker_writer(cinfo);\n\n  /* We can now tell the memory manager to allocate virtual arrays. */\n  (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);\n\n  /* Write the datastream header (SOI, JFIF) immediately.\n   * Frame and scan headers are postponed till later.\n   * This lets application insert special markers after the SOI.\n   */\n  (*cinfo->marker->write_file_header) (cinfo);\n}\n\n\n/*\n * The rest of this file is a special implementation of the coefficient\n * buffer controller.  This is similar to jccoefct.c, but it handles only\n * output from presupplied virtual arrays.  Furthermore, we generate any\n * dummy padding blocks on-the-fly rather than expecting them to be present\n * in the arrays.\n */\n\n/* Private buffer controller object */\n\ntypedef struct {\n  struct jpeg_c_coef_controller pub; /* public fields */\n\n  JDIMENSION iMCU_row_num;\t/* iMCU row # within image */\n  JDIMENSION mcu_ctr;\t\t/* counts MCUs processed in current row */\n  int MCU_vert_offset;\t\t/* counts MCU rows within iMCU row */\n  int MCU_rows_per_iMCU_row;\t/* number of such rows needed */\n\n  /* Virtual block array for each component. */\n  jvirt_barray_ptr * whole_image;\n\n  /* Workspace for constructing dummy blocks at right/bottom edges. */\n  JBLOCKROW dummy_buffer[C_MAX_BLOCKS_IN_MCU];\n} my_coef_controller;\n\ntypedef my_coef_controller * my_coef_ptr;\n\n\nLOCAL(void)\nstart_iMCU_row (j_compress_ptr cinfo)\n/* Reset within-iMCU-row counters for a new row */\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n\n  /* In an interleaved scan, an MCU row is the same as an iMCU row.\n   * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.\n   * But at the bottom of the image, process only what's left.\n   */\n  if (cinfo->comps_in_scan > 1) {\n    coef->MCU_rows_per_iMCU_row = 1;\n  } else {\n    if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1))\n      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;\n    else\n      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;\n  }\n\n  coef->mcu_ctr = 0;\n  coef->MCU_vert_offset = 0;\n}\n\n\n/*\n * Initialize for a processing pass.\n */\n\nMETHODDEF(void)\nstart_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode)\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n\n  if (pass_mode != JBUF_CRANK_DEST)\n    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n\n  coef->iMCU_row_num = 0;\n  start_iMCU_row(cinfo);\n}\n\n\n/*\n * Process some data.\n * We process the equivalent of one fully interleaved MCU row (\"iMCU\" row)\n * per call, ie, v_samp_factor block rows for each component in the scan.\n * The data is obtained from the virtual arrays and fed to the entropy coder.\n * Returns TRUE if the iMCU row is completed, FALSE if suspended.\n *\n * NB: input_buf is ignored; it is likely to be a NULL pointer.\n */\n\nMETHODDEF(boolean)\ncompress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf)\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n  JDIMENSION MCU_col_num;\t/* index of current MCU within row */\n  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;\n  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;\n  int blkn, ci, xindex, yindex, yoffset, blockcnt;\n  JDIMENSION start_col;\n  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];\n  JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU];\n  JBLOCKROW buffer_ptr;\n  jpeg_component_info *compptr;\n\n  /* Align the virtual buffers for the components used in this scan. */\n  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n    compptr = cinfo->cur_comp_info[ci];\n    buffer[ci] = (*cinfo->mem->access_virt_barray)\n      ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index],\n       coef->iMCU_row_num * compptr->v_samp_factor,\n       (JDIMENSION) compptr->v_samp_factor, FALSE);\n  }\n\n  /* Loop to process one whole iMCU row */\n  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;\n       yoffset++) {\n    for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row;\n\t MCU_col_num++) {\n      /* Construct list of pointers to DCT blocks belonging to this MCU */\n      blkn = 0;\t\t\t/* index of current DCT block within MCU */\n      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n\tcompptr = cinfo->cur_comp_info[ci];\n\tstart_col = MCU_col_num * compptr->MCU_width;\n\tblockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width\n\t\t\t\t\t\t: compptr->last_col_width;\n\tfor (yindex = 0; yindex < compptr->MCU_height; yindex++) {\n\t  if (coef->iMCU_row_num < last_iMCU_row ||\n\t      yindex+yoffset < compptr->last_row_height) {\n\t    /* Fill in pointers to real blocks in this row */\n\t    buffer_ptr = buffer[ci][yindex+yoffset] + start_col;\n\t    for (xindex = 0; xindex < blockcnt; xindex++)\n\t      MCU_buffer[blkn++] = buffer_ptr++;\n\t  } else {\n\t    /* At bottom of image, need a whole row of dummy blocks */\n\t    xindex = 0;\n\t  }\n\t  /* Fill in any dummy blocks needed in this row.\n\t   * Dummy blocks are filled in the same way as in jccoefct.c:\n\t   * all zeroes in the AC entries, DC entries equal to previous\n\t   * block's DC value.  The init routine has already zeroed the\n\t   * AC entries, so we need only set the DC entries correctly.\n\t   */\n\t  for (; xindex < compptr->MCU_width; xindex++) {\n\t    MCU_buffer[blkn] = coef->dummy_buffer[blkn];\n\t    MCU_buffer[blkn][0][0] = MCU_buffer[blkn-1][0][0];\n\t    blkn++;\n\t  }\n\t}\n      }\n      /* Try to write the MCU. */\n      if (! (*cinfo->entropy->encode_mcu) (cinfo, MCU_buffer)) {\n\t/* Suspension forced; update state counters and exit */\n\tcoef->MCU_vert_offset = yoffset;\n\tcoef->mcu_ctr = MCU_col_num;\n\treturn FALSE;\n      }\n    }\n    /* Completed an MCU row, but perhaps not an iMCU row */\n    coef->mcu_ctr = 0;\n  }\n  /* Completed the iMCU row, advance counters for next one */\n  coef->iMCU_row_num++;\n  start_iMCU_row(cinfo);\n  return TRUE;\n}\n\n\n/*\n * Initialize coefficient buffer controller.\n *\n * Each passed coefficient array must be the right size for that\n * coefficient: width_in_blocks wide and height_in_blocks high,\n * with unitheight at least v_samp_factor.\n */\n\nLOCAL(void)\ntransencode_coef_controller (j_compress_ptr cinfo,\n\t\t\t     jvirt_barray_ptr * coef_arrays)\n{\n  my_coef_ptr coef;\n  JBLOCKROW buffer;\n  int i;\n\n  coef = (my_coef_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_coef_controller));\n  cinfo->coef = (struct jpeg_c_coef_controller *) coef;\n  coef->pub.start_pass = start_pass_coef;\n  coef->pub.compress_data = compress_output;\n\n  /* Save pointer to virtual arrays */\n  coef->whole_image = coef_arrays;\n\n  /* Allocate and pre-zero space for dummy DCT blocks. */\n  buffer = (JBLOCKROW)\n    (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tC_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));\n  jzero_far((void FAR *) buffer, C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));\n  for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) {\n    coef->dummy_buffer[i] = buffer + i;\n  }\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jdapimin.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jdapimin.c\n *\n * Copyright (C) 1994-1998, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains application interface code for the decompression half\n * of the JPEG library.  These are the \"minimum\" API routines that may be\n * needed in either the normal full-decompression case or the\n * transcoding-only case.\n *\n * Most of the routines intended to be called directly by an application\n * are in this file or in jdapistd.c.  But also see jcomapi.c for routines\n * shared by compression and decompression, and jdtrans.c for the transcoding\n * case.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/*\n * Initialization of a JPEG decompression object.\n * The error manager must already be set up (in case memory manager fails).\n */\n\nGLOBAL(void)\njpeg_CreateDecompress (j_decompress_ptr cinfo, int version, size_t structsize)\n{\n  int i;\n\n  /* Guard against version mismatches between library and caller. */\n  cinfo->mem = NULL;\t\t/* so jpeg_destroy knows mem mgr not called */\n  if (version != JPEG_LIB_VERSION)\n    ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version);\n  if (structsize != SIZEOF(struct jpeg_decompress_struct))\n    ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE, \n\t     (int) SIZEOF(struct jpeg_decompress_struct), (int) structsize);\n\n  /* For debugging purposes, we zero the whole master structure.\n   * But the application has already set the err pointer, and may have set\n   * client_data, so we have to save and restore those fields.\n   * Note: if application hasn't set client_data, tools like Purify may\n   * complain here.\n   */\n  {\n    struct jpeg_error_mgr * err = cinfo->err;\n    void * client_data = cinfo->client_data; /* ignore Purify complaint here */\n    MEMZERO(cinfo, SIZEOF(struct jpeg_decompress_struct));\n    cinfo->err = err;\n    cinfo->client_data = client_data;\n  }\n  cinfo->is_decompressor = TRUE;\n\n  /* Initialize a memory manager instance for this object */\n  jinit_memory_mgr((j_common_ptr) cinfo);\n\n  /* Zero out pointers to permanent structures. */\n  cinfo->progress = NULL;\n  cinfo->src = NULL;\n\n  for (i = 0; i < NUM_QUANT_TBLS; i++)\n    cinfo->quant_tbl_ptrs[i] = NULL;\n\n  for (i = 0; i < NUM_HUFF_TBLS; i++) {\n    cinfo->dc_huff_tbl_ptrs[i] = NULL;\n    cinfo->ac_huff_tbl_ptrs[i] = NULL;\n  }\n\n  /* Initialize marker processor so application can override methods\n   * for COM, APPn markers before calling jpeg_read_header.\n   */\n  cinfo->marker_list = NULL;\n  jinit_marker_reader(cinfo);\n\n  /* And initialize the overall input controller. */\n  jinit_input_controller(cinfo);\n\n  /* OK, I'm ready */\n  cinfo->global_state = DSTATE_START;\n}\n\n\n/*\n * Destruction of a JPEG decompression object\n */\n\nGLOBAL(void)\njpeg_destroy_decompress (j_decompress_ptr cinfo)\n{\n  jpeg_destroy((j_common_ptr) cinfo); /* use common routine */\n}\n\n\n/*\n * Abort processing of a JPEG decompression operation,\n * but don't destroy the object itself.\n */\n\nGLOBAL(void)\njpeg_abort_decompress (j_decompress_ptr cinfo)\n{\n  jpeg_abort((j_common_ptr) cinfo); /* use common routine */\n}\n\n\n/*\n * Set default decompression parameters.\n */\n\nLOCAL(void)\ndefault_decompress_parms (j_decompress_ptr cinfo)\n{\n  /* Guess the input colorspace, and set output colorspace accordingly. */\n  /* (Wish JPEG committee had provided a real way to specify this...) */\n  /* Note application may override our guesses. */\n  switch (cinfo->num_components) {\n  case 1:\n    cinfo->jpeg_color_space = JCS_GRAYSCALE;\n    cinfo->out_color_space = JCS_GRAYSCALE;\n    break;\n    \n  case 3:\n    if (cinfo->saw_JFIF_marker) {\n      cinfo->jpeg_color_space = JCS_YCbCr; /* JFIF implies YCbCr */\n    } else if (cinfo->saw_Adobe_marker) {\n      switch (cinfo->Adobe_transform) {\n      case 0:\n\tcinfo->jpeg_color_space = JCS_RGB;\n\tbreak;\n      case 1:\n\tcinfo->jpeg_color_space = JCS_YCbCr;\n\tbreak;\n      default:\n\tWARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);\n\tcinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */\n\tbreak;\n      }\n    } else {\n      /* Saw no special markers, try to guess from the component IDs */\n      int cid0 = cinfo->comp_info[0].component_id;\n      int cid1 = cinfo->comp_info[1].component_id;\n      int cid2 = cinfo->comp_info[2].component_id;\n\n      if (cid0 == 1 && cid1 == 2 && cid2 == 3)\n\tcinfo->jpeg_color_space = JCS_YCbCr; /* assume JFIF w/out marker */\n      else if (cid0 == 82 && cid1 == 71 && cid2 == 66)\n\tcinfo->jpeg_color_space = JCS_RGB; /* ASCII 'R', 'G', 'B' */\n      else {\n\tTRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2);\n\tcinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */\n      }\n    }\n    /* Always guess RGB is proper output colorspace. */\n    cinfo->out_color_space = JCS_RGB;\n    break;\n    \n  case 4:\n    if (cinfo->saw_Adobe_marker) {\n      switch (cinfo->Adobe_transform) {\n      case 0:\n\tcinfo->jpeg_color_space = JCS_CMYK;\n\tbreak;\n      case 2:\n\tcinfo->jpeg_color_space = JCS_YCCK;\n\tbreak;\n      default:\n\tWARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);\n\tcinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */\n\tbreak;\n      }\n    } else {\n      /* No special markers, assume straight CMYK. */\n      cinfo->jpeg_color_space = JCS_CMYK;\n    }\n    cinfo->out_color_space = JCS_CMYK;\n    break;\n    \n  default:\n    cinfo->jpeg_color_space = JCS_UNKNOWN;\n    cinfo->out_color_space = JCS_UNKNOWN;\n    break;\n  }\n\n  /* Set defaults for other decompression parameters. */\n  cinfo->scale_num = 1;\t\t/* 1:1 scaling */\n  cinfo->scale_denom = 1;\n  cinfo->output_gamma = 1.0;\n  cinfo->buffered_image = FALSE;\n  cinfo->raw_data_out = FALSE;\n  cinfo->dct_method = JDCT_DEFAULT;\n  cinfo->do_fancy_upsampling = TRUE;\n  cinfo->do_block_smoothing = TRUE;\n  cinfo->quantize_colors = FALSE;\n  /* We set these in case application only sets quantize_colors. */\n  cinfo->dither_mode = JDITHER_FS;\n#ifdef QUANT_2PASS_SUPPORTED\n  cinfo->two_pass_quantize = TRUE;\n#else\n  cinfo->two_pass_quantize = FALSE;\n#endif\n  cinfo->desired_number_of_colors = 256;\n  cinfo->colormap = NULL;\n  /* Initialize for no mode change in buffered-image mode. */\n  cinfo->enable_1pass_quant = FALSE;\n  cinfo->enable_external_quant = FALSE;\n  cinfo->enable_2pass_quant = FALSE;\n}\n\n\n/*\n * Decompression startup: read start of JPEG datastream to see what's there.\n * Need only initialize JPEG object and supply a data source before calling.\n *\n * This routine will read as far as the first SOS marker (ie, actual start of\n * compressed data), and will save all tables and parameters in the JPEG\n * object.  It will also initialize the decompression parameters to default\n * values, and finally return JPEG_HEADER_OK.  On return, the application may\n * adjust the decompression parameters and then call jpeg_start_decompress.\n * (Or, if the application only wanted to determine the image parameters,\n * the data need not be decompressed.  In that case, call jpeg_abort or\n * jpeg_destroy to release any temporary space.)\n * If an abbreviated (tables only) datastream is presented, the routine will\n * return JPEG_HEADER_TABLES_ONLY upon reaching EOI.  The application may then\n * re-use the JPEG object to read the abbreviated image datastream(s).\n * It is unnecessary (but OK) to call jpeg_abort in this case.\n * The JPEG_SUSPENDED return code only occurs if the data source module\n * requests suspension of the decompressor.  In this case the application\n * should load more source data and then re-call jpeg_read_header to resume\n * processing.\n * If a non-suspending data source is used and require_image is TRUE, then the\n * return code need not be inspected since only JPEG_HEADER_OK is possible.\n *\n * This routine is now just a front end to jpeg_consume_input, with some\n * extra error checking.\n */\n\nGLOBAL(int)\njpeg_read_header (j_decompress_ptr cinfo, boolean require_image)\n{\n  int retcode;\n\n  if (cinfo->global_state != DSTATE_START &&\n      cinfo->global_state != DSTATE_INHEADER)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n\n  retcode = jpeg_consume_input(cinfo);\n\n  switch (retcode) {\n  case JPEG_REACHED_SOS:\n    retcode = JPEG_HEADER_OK;\n    break;\n  case JPEG_REACHED_EOI:\n    if (require_image)\t\t/* Complain if application wanted an image */\n      ERREXIT(cinfo, JERR_NO_IMAGE);\n    /* Reset to start state; it would be safer to require the application to\n     * call jpeg_abort, but we can't change it now for compatibility reasons.\n     * A side effect is to free any temporary memory (there shouldn't be any).\n     */\n    jpeg_abort((j_common_ptr) cinfo); /* sets state = DSTATE_START */\n    retcode = JPEG_HEADER_TABLES_ONLY;\n    break;\n  case JPEG_SUSPENDED:\n    /* no work */\n    break;\n  }\n\n  return retcode;\n}\n\n\n/*\n * Consume data in advance of what the decompressor requires.\n * This can be called at any time once the decompressor object has\n * been created and a data source has been set up.\n *\n * This routine is essentially a state machine that handles a couple\n * of critical state-transition actions, namely initial setup and\n * transition from header scanning to ready-for-start_decompress.\n * All the actual input is done via the input controller's consume_input\n * method.\n */\n\nGLOBAL(int)\njpeg_consume_input (j_decompress_ptr cinfo)\n{\n  int retcode = JPEG_SUSPENDED;\n\n  /* NB: every possible DSTATE value should be listed in this switch */\n  switch (cinfo->global_state) {\n  case DSTATE_START:\n    /* Start-of-datastream actions: reset appropriate modules */\n    (*cinfo->inputctl->reset_input_controller) (cinfo);\n    /* Initialize application's data source module */\n    (*cinfo->src->init_source) (cinfo);\n    cinfo->global_state = DSTATE_INHEADER;\n    /*FALLTHROUGH*/\n  case DSTATE_INHEADER:\n    retcode = (*cinfo->inputctl->consume_input) (cinfo);\n    if (retcode == JPEG_REACHED_SOS) { /* Found SOS, prepare to decompress */\n      /* Set up default parameters based on header data */\n      default_decompress_parms(cinfo);\n      /* Set global state: ready for start_decompress */\n      cinfo->global_state = DSTATE_READY;\n    }\n    break;\n  case DSTATE_READY:\n    /* Can't advance past first SOS until start_decompress is called */\n    retcode = JPEG_REACHED_SOS;\n    break;\n  case DSTATE_PRELOAD:\n  case DSTATE_PRESCAN:\n  case DSTATE_SCANNING:\n  case DSTATE_RAW_OK:\n  case DSTATE_BUFIMAGE:\n  case DSTATE_BUFPOST:\n  case DSTATE_STOPPING:\n    retcode = (*cinfo->inputctl->consume_input) (cinfo);\n    break;\n  default:\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  }\n  return retcode;\n}\n\n\n/*\n * Have we finished reading the input file?\n */\n\nGLOBAL(boolean)\njpeg_input_complete (j_decompress_ptr cinfo)\n{\n  /* Check for valid jpeg object */\n  if (cinfo->global_state < DSTATE_START ||\n      cinfo->global_state > DSTATE_STOPPING)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  return cinfo->inputctl->eoi_reached;\n}\n\n\n/*\n * Is there more than one scan?\n */\n\nGLOBAL(boolean)\njpeg_has_multiple_scans (j_decompress_ptr cinfo)\n{\n  /* Only valid after jpeg_read_header completes */\n  if (cinfo->global_state < DSTATE_READY ||\n      cinfo->global_state > DSTATE_STOPPING)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  return cinfo->inputctl->has_multiple_scans;\n}\n\n\n/*\n * Finish JPEG decompression.\n *\n * This will normally just verify the file trailer and release temp storage.\n *\n * Returns FALSE if suspended.  The return value need be inspected only if\n * a suspending data source is used.\n */\n\nGLOBAL(boolean)\njpeg_finish_decompress (j_decompress_ptr cinfo)\n{\n  if ((cinfo->global_state == DSTATE_SCANNING ||\n       cinfo->global_state == DSTATE_RAW_OK) && ! cinfo->buffered_image) {\n    /* Terminate final pass of non-buffered mode */\n    if (cinfo->output_scanline < cinfo->output_height)\n      ERREXIT(cinfo, JERR_TOO_LITTLE_DATA);\n    (*cinfo->master->finish_output_pass) (cinfo);\n    cinfo->global_state = DSTATE_STOPPING;\n  } else if (cinfo->global_state == DSTATE_BUFIMAGE) {\n    /* Finishing after a buffered-image operation */\n    cinfo->global_state = DSTATE_STOPPING;\n  } else if (cinfo->global_state != DSTATE_STOPPING) {\n    /* STOPPING = repeat call after a suspension, anything else is error */\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  }\n  /* Read until EOI */\n  while (! cinfo->inputctl->eoi_reached) {\n    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)\n      return FALSE;\t\t/* Suspend, come back later */\n  }\n  /* Do final cleanup */\n  (*cinfo->src->term_source) (cinfo);\n  /* We can use jpeg_abort to release memory and reset global_state */\n  jpeg_abort((j_common_ptr) cinfo);\n  return TRUE;\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jdapistd.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jdapistd.c\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains application interface code for the decompression half\n * of the JPEG library.  These are the \"standard\" API routines that are\n * used in the normal full-decompression case.  They are not used by a\n * transcoding-only application.  Note that if an application links in\n * jpeg_start_decompress, it will end up linking in the entire decompressor.\n * We thus must separate this file from jdapimin.c to avoid linking the\n * whole decompression library into a transcoder.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Forward declarations */\nLOCAL(boolean) output_pass_setup JPP((j_decompress_ptr cinfo));\n\n\n/*\n * Decompression initialization.\n * jpeg_read_header must be completed before calling this.\n *\n * If a multipass operating mode was selected, this will do all but the\n * last pass, and thus may take a great deal of time.\n *\n * Returns FALSE if suspended.  The return value need be inspected only if\n * a suspending data source is used.\n */\n\nGLOBAL(boolean)\njpeg_start_decompress (j_decompress_ptr cinfo)\n{\n  if (cinfo->global_state == DSTATE_READY) {\n    /* First call: initialize master control, select active modules */\n    jinit_master_decompress(cinfo);\n    if (cinfo->buffered_image) {\n      /* No more work here; expecting jpeg_start_output next */\n      cinfo->global_state = DSTATE_BUFIMAGE;\n      return TRUE;\n    }\n    cinfo->global_state = DSTATE_PRELOAD;\n  }\n  if (cinfo->global_state == DSTATE_PRELOAD) {\n    /* If file has multiple scans, absorb them all into the coef buffer */\n    if (cinfo->inputctl->has_multiple_scans) {\n#ifdef D_MULTISCAN_FILES_SUPPORTED\n      for (;;) {\n\tint retcode;\n\t/* Call progress monitor hook if present */\n\tif (cinfo->progress != NULL)\n\t  (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);\n\t/* Absorb some more input */\n\tretcode = (*cinfo->inputctl->consume_input) (cinfo);\n\tif (retcode == JPEG_SUSPENDED)\n\t  return FALSE;\n\tif (retcode == JPEG_REACHED_EOI)\n\t  break;\n\t/* Advance progress counter if appropriate */\n\tif (cinfo->progress != NULL &&\n\t    (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) {\n\t  if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) {\n\t    /* jdmaster underestimated number of scans; ratchet up one scan */\n\t    cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows;\n\t  }\n\t}\n      }\n#else\n      ERREXIT(cinfo, JERR_NOT_COMPILED);\n#endif /* D_MULTISCAN_FILES_SUPPORTED */\n    }\n    cinfo->output_scan_number = cinfo->input_scan_number;\n  } else if (cinfo->global_state != DSTATE_PRESCAN)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  /* Perform any dummy output passes, and set up for the final pass */\n  return output_pass_setup(cinfo);\n}\n\n\n/*\n * Set up for an output pass, and perform any dummy pass(es) needed.\n * Common subroutine for jpeg_start_decompress and jpeg_start_output.\n * Entry: global_state = DSTATE_PRESCAN only if previously suspended.\n * Exit: If done, returns TRUE and sets global_state for proper output mode.\n *       If suspended, returns FALSE and sets global_state = DSTATE_PRESCAN.\n */\n\nLOCAL(boolean)\noutput_pass_setup (j_decompress_ptr cinfo)\n{\n  if (cinfo->global_state != DSTATE_PRESCAN) {\n    /* First call: do pass setup */\n    (*cinfo->master->prepare_for_output_pass) (cinfo);\n    cinfo->output_scanline = 0;\n    cinfo->global_state = DSTATE_PRESCAN;\n  }\n  /* Loop over any required dummy passes */\n  while (cinfo->master->is_dummy_pass) {\n#ifdef QUANT_2PASS_SUPPORTED\n    /* Crank through the dummy pass */\n    while (cinfo->output_scanline < cinfo->output_height) {\n      JDIMENSION last_scanline;\n      /* Call progress monitor hook if present */\n      if (cinfo->progress != NULL) {\n\tcinfo->progress->pass_counter = (long) cinfo->output_scanline;\n\tcinfo->progress->pass_limit = (long) cinfo->output_height;\n\t(*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);\n      }\n      /* Process some data */\n      last_scanline = cinfo->output_scanline;\n      (*cinfo->main->process_data) (cinfo, (JSAMPARRAY) NULL,\n\t\t\t\t    &cinfo->output_scanline, (JDIMENSION) 0);\n      if (cinfo->output_scanline == last_scanline)\n\treturn FALSE;\t\t/* No progress made, must suspend */\n    }\n    /* Finish up dummy pass, and set up for another one */\n    (*cinfo->master->finish_output_pass) (cinfo);\n    (*cinfo->master->prepare_for_output_pass) (cinfo);\n    cinfo->output_scanline = 0;\n#else\n    ERREXIT(cinfo, JERR_NOT_COMPILED);\n#endif /* QUANT_2PASS_SUPPORTED */\n  }\n  /* Ready for application to drive output pass through\n   * jpeg_read_scanlines or jpeg_read_raw_data.\n   */\n  cinfo->global_state = cinfo->raw_data_out ? DSTATE_RAW_OK : DSTATE_SCANNING;\n  return TRUE;\n}\n\n\n/*\n * Read some scanlines of data from the JPEG decompressor.\n *\n * The return value will be the number of lines actually read.\n * This may be less than the number requested in several cases,\n * including bottom of image, data source suspension, and operating\n * modes that emit multiple scanlines at a time.\n *\n * Note: we warn about excess calls to jpeg_read_scanlines() since\n * this likely signals an application programmer error.  However,\n * an oversize buffer (max_lines > scanlines remaining) is not an error.\n */\n\nGLOBAL(JDIMENSION)\njpeg_read_scanlines (j_decompress_ptr cinfo, JSAMPARRAY scanlines,\n\t\t     JDIMENSION max_lines)\n{\n  JDIMENSION row_ctr;\n\n  if (cinfo->global_state != DSTATE_SCANNING)\n\t  return 0; /* XYQ 2010-6-27: don't throw exception here */\n/*    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); */\n  if (cinfo->output_scanline >= cinfo->output_height) {\n    WARNMS(cinfo, JWRN_TOO_MUCH_DATA);\n    return 0;\n  }\n\n  /* Call progress monitor hook if present */\n  if (cinfo->progress != NULL) {\n    cinfo->progress->pass_counter = (long) cinfo->output_scanline;\n    cinfo->progress->pass_limit = (long) cinfo->output_height;\n    (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);\n  }\n\n  /* Process some data */\n  row_ctr = 0;\n  (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, max_lines);\n  cinfo->output_scanline += row_ctr;\n  return row_ctr;\n}\n\n\n/*\n * Alternate entry point to read raw data.\n * Processes exactly one iMCU row per call, unless suspended.\n */\n\nGLOBAL(JDIMENSION)\njpeg_read_raw_data (j_decompress_ptr cinfo, JSAMPIMAGE data,\n\t\t    JDIMENSION max_lines)\n{\n  JDIMENSION lines_per_iMCU_row;\n\n  if (cinfo->global_state != DSTATE_RAW_OK)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  if (cinfo->output_scanline >= cinfo->output_height) {\n    WARNMS(cinfo, JWRN_TOO_MUCH_DATA);\n    return 0;\n  }\n\n  /* Call progress monitor hook if present */\n  if (cinfo->progress != NULL) {\n    cinfo->progress->pass_counter = (long) cinfo->output_scanline;\n    cinfo->progress->pass_limit = (long) cinfo->output_height;\n    (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);\n  }\n\n  /* Verify that at least one iMCU row can be returned. */\n  lines_per_iMCU_row = cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size;\n  if (max_lines < lines_per_iMCU_row)\n    ERREXIT(cinfo, JERR_BUFFER_SIZE);\n\n  /* Decompress directly into user's buffer. */\n  if (! (*cinfo->coef->decompress_data) (cinfo, data))\n    return 0;\t\t\t/* suspension forced, can do nothing more */\n\n  /* OK, we processed one iMCU row. */\n  cinfo->output_scanline += lines_per_iMCU_row;\n  return lines_per_iMCU_row;\n}\n\n\n/* Additional entry points for buffered-image mode. */\n\n#ifdef D_MULTISCAN_FILES_SUPPORTED\n\n/*\n * Initialize for an output pass in buffered-image mode.\n */\n\nGLOBAL(boolean)\njpeg_start_output (j_decompress_ptr cinfo, int scan_number)\n{\n  if (cinfo->global_state != DSTATE_BUFIMAGE &&\n      cinfo->global_state != DSTATE_PRESCAN)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  /* Limit scan number to valid range */\n  if (scan_number <= 0)\n    scan_number = 1;\n  if (cinfo->inputctl->eoi_reached &&\n      scan_number > cinfo->input_scan_number)\n    scan_number = cinfo->input_scan_number;\n  cinfo->output_scan_number = scan_number;\n  /* Perform any dummy output passes, and set up for the real pass */\n  return output_pass_setup(cinfo);\n}\n\n\n/*\n * Finish up after an output pass in buffered-image mode.\n *\n * Returns FALSE if suspended.  The return value need be inspected only if\n * a suspending data source is used.\n */\n\nGLOBAL(boolean)\njpeg_finish_output (j_decompress_ptr cinfo)\n{\n  if ((cinfo->global_state == DSTATE_SCANNING ||\n       cinfo->global_state == DSTATE_RAW_OK) && cinfo->buffered_image) {\n    /* Terminate this pass. */\n    /* We do not require the whole pass to have been completed. */\n    (*cinfo->master->finish_output_pass) (cinfo);\n    cinfo->global_state = DSTATE_BUFPOST;\n  } else if (cinfo->global_state != DSTATE_BUFPOST) {\n    /* BUFPOST = repeat call after a suspension, anything else is error */\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  }\n  /* Read markers looking for SOS or EOI */\n  while (cinfo->input_scan_number <= cinfo->output_scan_number &&\n\t ! cinfo->inputctl->eoi_reached) {\n    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)\n      return FALSE;\t\t/* Suspend, come back later */\n  }\n  cinfo->global_state = DSTATE_BUFIMAGE;\n  return TRUE;\n}\n\n#endif /* D_MULTISCAN_FILES_SUPPORTED */\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jdcoefct.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jdcoefct.c\n *\n * Copyright (C) 1994-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains the coefficient buffer controller for decompression.\n * This controller is the top level of the JPEG decompressor proper.\n * The coefficient buffer lies between entropy decoding and inverse-DCT steps.\n *\n * In buffered-image mode, this controller is the interface between\n * input-oriented processing and output-oriented processing.\n * Also, the input side (only) is used when reading a file for transcoding.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n/* Block smoothing is only applicable for progressive JPEG, so: */\n#ifndef D_PROGRESSIVE_SUPPORTED\n#undef BLOCK_SMOOTHING_SUPPORTED\n#endif\n\n/* Private buffer controller object */\n\ntypedef struct {\n  struct jpeg_d_coef_controller pub; /* public fields */\n\n  /* These variables keep track of the current location of the input side. */\n  /* cinfo->input_iMCU_row is also used for this. */\n  JDIMENSION MCU_ctr;\t\t/* counts MCUs processed in current row */\n  int MCU_vert_offset;\t\t/* counts MCU rows within iMCU row */\n  int MCU_rows_per_iMCU_row;\t/* number of such rows needed */\n\n  /* The output side's location is represented by cinfo->output_iMCU_row. */\n\n  /* In single-pass modes, it's sufficient to buffer just one MCU.\n   * We allocate a workspace of D_MAX_BLOCKS_IN_MCU coefficient blocks,\n   * and let the entropy decoder write into that workspace each time.\n   * (On 80x86, the workspace is FAR even though it's not really very big;\n   * this is to keep the module interfaces unchanged when a large coefficient\n   * buffer is necessary.)\n   * In multi-pass modes, this array points to the current MCU's blocks\n   * within the virtual arrays; it is used only by the input side.\n   */\n  JBLOCKROW MCU_buffer[D_MAX_BLOCKS_IN_MCU];\n\n#ifdef D_MULTISCAN_FILES_SUPPORTED\n  /* In multi-pass modes, we need a virtual block array for each component. */\n  jvirt_barray_ptr whole_image[MAX_COMPONENTS];\n#endif\n\n#ifdef BLOCK_SMOOTHING_SUPPORTED\n  /* When doing block smoothing, we latch coefficient Al values here */\n  int * coef_bits_latch;\n#define SAVED_COEFS  6\t\t/* we save coef_bits[0..5] */\n#endif\n} my_coef_controller;\n\ntypedef my_coef_controller * my_coef_ptr;\n\n/* Forward declarations */\nMETHODDEF(int) decompress_onepass\n\tJPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf));\n#ifdef D_MULTISCAN_FILES_SUPPORTED\nMETHODDEF(int) decompress_data\n\tJPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf));\n#endif\n#ifdef BLOCK_SMOOTHING_SUPPORTED\nLOCAL(boolean) smoothing_ok JPP((j_decompress_ptr cinfo));\nMETHODDEF(int) decompress_smooth_data\n\tJPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf));\n#endif\n\n\nLOCAL(void)\nstart_iMCU_row (j_decompress_ptr cinfo)\n/* Reset within-iMCU-row counters for a new row (input side) */\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n\n  /* In an interleaved scan, an MCU row is the same as an iMCU row.\n   * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.\n   * But at the bottom of the image, process only what's left.\n   */\n  if (cinfo->comps_in_scan > 1) {\n    coef->MCU_rows_per_iMCU_row = 1;\n  } else {\n    if (cinfo->input_iMCU_row < (cinfo->total_iMCU_rows-1))\n      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;\n    else\n      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;\n  }\n\n  coef->MCU_ctr = 0;\n  coef->MCU_vert_offset = 0;\n}\n\n\n/*\n * Initialize for an input processing pass.\n */\n\nMETHODDEF(void)\nstart_input_pass (j_decompress_ptr cinfo)\n{\n  cinfo->input_iMCU_row = 0;\n  start_iMCU_row(cinfo);\n}\n\n\n/*\n * Initialize for an output processing pass.\n */\n\nMETHODDEF(void)\nstart_output_pass (j_decompress_ptr cinfo)\n{\n#ifdef BLOCK_SMOOTHING_SUPPORTED\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n\n  /* If multipass, check to see whether to use block smoothing on this pass */\n  if (coef->pub.coef_arrays != NULL) {\n    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))\n      coef->pub.decompress_data = decompress_smooth_data;\n    else\n      coef->pub.decompress_data = decompress_data;\n  }\n#endif\n  cinfo->output_iMCU_row = 0;\n}\n\n\n/*\n * Decompress and return some data in the single-pass case.\n * Always attempts to emit one fully interleaved MCU row (\"iMCU\" row).\n * Input and output must run in lockstep since we have only a one-MCU buffer.\n * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.\n *\n * NB: output_buf contains a plane for each component in image,\n * which we index according to the component's SOF position.\n */\n\nMETHODDEF(int)\ndecompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n  JDIMENSION MCU_col_num;\t/* index of current MCU within row */\n  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;\n  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;\n  int blkn, ci, xindex, yindex, yoffset, useful_width;\n  JSAMPARRAY output_ptr;\n  JDIMENSION start_col, output_col;\n  jpeg_component_info *compptr;\n  inverse_DCT_method_ptr inverse_DCT;\n\n  /* Loop to process as much as one whole iMCU row */\n  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;\n       yoffset++) {\n    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;\n\t MCU_col_num++) {\n      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */\n      jzero_far((void FAR *) coef->MCU_buffer[0],\n\t\t(size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK)));\n      if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {\n\t/* Suspension forced; update state counters and exit */\n\tcoef->MCU_vert_offset = yoffset;\n\tcoef->MCU_ctr = MCU_col_num;\n\treturn JPEG_SUSPENDED;\n      }\n      /* Determine where data should go in output_buf and do the IDCT thing.\n       * We skip dummy blocks at the right and bottom edges (but blkn gets\n       * incremented past them!).  Note the inner loop relies on having\n       * allocated the MCU_buffer[] blocks sequentially.\n       */\n      blkn = 0;\t\t\t/* index of current DCT block within MCU */\n      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n\tcompptr = cinfo->cur_comp_info[ci];\n\t/* Don't bother to IDCT an uninteresting component. */\n\tif (! compptr->component_needed) {\n\t  blkn += compptr->MCU_blocks;\n\t  continue;\n\t}\n\tinverse_DCT = cinfo->idct->inverse_DCT[compptr->component_index];\n\tuseful_width = (MCU_col_num < last_MCU_col) ? compptr->MCU_width\n\t\t\t\t\t\t    : compptr->last_col_width;\n\toutput_ptr = output_buf[compptr->component_index] +\n\t  yoffset * compptr->DCT_scaled_size;\n\tstart_col = MCU_col_num * compptr->MCU_sample_width;\n\tfor (yindex = 0; yindex < compptr->MCU_height; yindex++) {\n\t  if (cinfo->input_iMCU_row < last_iMCU_row ||\n\t      yoffset+yindex < compptr->last_row_height) {\n\t    output_col = start_col;\n\t    for (xindex = 0; xindex < useful_width; xindex++) {\n\t      (*inverse_DCT) (cinfo, compptr,\n\t\t\t      (JCOEFPTR) coef->MCU_buffer[blkn+xindex],\n\t\t\t      output_ptr, output_col);\n\t      output_col += compptr->DCT_scaled_size;\n\t    }\n\t  }\n\t  blkn += compptr->MCU_width;\n\t  output_ptr += compptr->DCT_scaled_size;\n\t}\n      }\n    }\n    /* Completed an MCU row, but perhaps not an iMCU row */\n    coef->MCU_ctr = 0;\n  }\n  /* Completed the iMCU row, advance counters for next one */\n  cinfo->output_iMCU_row++;\n  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {\n    start_iMCU_row(cinfo);\n    return JPEG_ROW_COMPLETED;\n  }\n  /* Completed the scan */\n  (*cinfo->inputctl->finish_input_pass) (cinfo);\n  return JPEG_SCAN_COMPLETED;\n}\n\n\n/*\n * Dummy consume-input routine for single-pass operation.\n */\n\nMETHODDEF(int)\ndummy_consume_data (j_decompress_ptr cinfo)\n{\n  return JPEG_SUSPENDED;\t/* Always indicate nothing was done */\n}\n\n\n#ifdef D_MULTISCAN_FILES_SUPPORTED\n\n/*\n * Consume input data and store it in the full-image coefficient buffer.\n * We read as much as one fully interleaved MCU row (\"iMCU\" row) per call,\n * ie, v_samp_factor block rows for each component in the scan.\n * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.\n */\n\nMETHODDEF(int)\nconsume_data (j_decompress_ptr cinfo)\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n  JDIMENSION MCU_col_num;\t/* index of current MCU within row */\n  int blkn, ci, xindex, yindex, yoffset;\n  JDIMENSION start_col;\n  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];\n  JBLOCKROW buffer_ptr;\n  jpeg_component_info *compptr;\n\n  /* Align the virtual buffers for the components used in this scan. */\n  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n    compptr = cinfo->cur_comp_info[ci];\n    buffer[ci] = (*cinfo->mem->access_virt_barray)\n      ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index],\n       cinfo->input_iMCU_row * compptr->v_samp_factor,\n       (JDIMENSION) compptr->v_samp_factor, TRUE);\n    /* Note: entropy decoder expects buffer to be zeroed,\n     * but this is handled automatically by the memory manager\n     * because we requested a pre-zeroed array.\n     */\n  }\n\n  /* Loop to process one whole iMCU row */\n  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;\n       yoffset++) {\n    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;\n\t MCU_col_num++) {\n      /* Construct list of pointers to DCT blocks belonging to this MCU */\n      blkn = 0;\t\t\t/* index of current DCT block within MCU */\n      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n\tcompptr = cinfo->cur_comp_info[ci];\n\tstart_col = MCU_col_num * compptr->MCU_width;\n\tfor (yindex = 0; yindex < compptr->MCU_height; yindex++) {\n\t  buffer_ptr = buffer[ci][yindex+yoffset] + start_col;\n\t  for (xindex = 0; xindex < compptr->MCU_width; xindex++) {\n\t    coef->MCU_buffer[blkn++] = buffer_ptr++;\n\t  }\n\t}\n      }\n      /* Try to fetch the MCU. */\n      if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {\n\t/* Suspension forced; update state counters and exit */\n\tcoef->MCU_vert_offset = yoffset;\n\tcoef->MCU_ctr = MCU_col_num;\n\treturn JPEG_SUSPENDED;\n      }\n    }\n    /* Completed an MCU row, but perhaps not an iMCU row */\n    coef->MCU_ctr = 0;\n  }\n  /* Completed the iMCU row, advance counters for next one */\n  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {\n    start_iMCU_row(cinfo);\n    return JPEG_ROW_COMPLETED;\n  }\n  /* Completed the scan */\n  (*cinfo->inputctl->finish_input_pass) (cinfo);\n  return JPEG_SCAN_COMPLETED;\n}\n\n\n/*\n * Decompress and return some data in the multi-pass case.\n * Always attempts to emit one fully interleaved MCU row (\"iMCU\" row).\n * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.\n *\n * NB: output_buf contains a plane for each component in image.\n */\n\nMETHODDEF(int)\ndecompress_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;\n  JDIMENSION block_num;\n  int ci, block_row, block_rows;\n  JBLOCKARRAY buffer;\n  JBLOCKROW buffer_ptr;\n  JSAMPARRAY output_ptr;\n  JDIMENSION output_col;\n  jpeg_component_info *compptr;\n  inverse_DCT_method_ptr inverse_DCT;\n\n  /* Force some input to be done if we are getting ahead of the input. */\n  while (cinfo->input_scan_number < cinfo->output_scan_number ||\n\t (cinfo->input_scan_number == cinfo->output_scan_number &&\n\t  cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {\n    if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED)\n      return JPEG_SUSPENDED;\n  }\n\n  /* OK, output from the virtual arrays. */\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    /* Don't bother to IDCT an uninteresting component. */\n    if (! compptr->component_needed)\n      continue;\n    /* Align the virtual buffer for this component. */\n    buffer = (*cinfo->mem->access_virt_barray)\n      ((j_common_ptr) cinfo, coef->whole_image[ci],\n       cinfo->output_iMCU_row * compptr->v_samp_factor,\n       (JDIMENSION) compptr->v_samp_factor, FALSE);\n    /* Count non-dummy DCT block rows in this iMCU row. */\n    if (cinfo->output_iMCU_row < last_iMCU_row)\n      block_rows = compptr->v_samp_factor;\n    else {\n      /* NB: can't use last_row_height here; it is input-side-dependent! */\n      block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);\n      if (block_rows == 0) block_rows = compptr->v_samp_factor;\n    }\n    inverse_DCT = cinfo->idct->inverse_DCT[ci];\n    output_ptr = output_buf[ci];\n    /* Loop over all DCT blocks to be processed. */\n    for (block_row = 0; block_row < block_rows; block_row++) {\n      buffer_ptr = buffer[block_row];\n      output_col = 0;\n      for (block_num = 0; block_num < compptr->width_in_blocks; block_num++) {\n\t(*inverse_DCT) (cinfo, compptr, (JCOEFPTR) buffer_ptr,\n\t\t\toutput_ptr, output_col);\n\tbuffer_ptr++;\n\toutput_col += compptr->DCT_scaled_size;\n      }\n      output_ptr += compptr->DCT_scaled_size;\n    }\n  }\n\n  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)\n    return JPEG_ROW_COMPLETED;\n  return JPEG_SCAN_COMPLETED;\n}\n\n#endif /* D_MULTISCAN_FILES_SUPPORTED */\n\n\n#ifdef BLOCK_SMOOTHING_SUPPORTED\n\n/*\n * This code applies interblock smoothing as described by section K.8\n * of the JPEG standard: the first 5 AC coefficients are estimated from\n * the DC values of a DCT block and its 8 neighboring blocks.\n * We apply smoothing only for progressive JPEG decoding, and only if\n * the coefficients it can estimate are not yet known to full precision.\n */\n\n/* Natural-order array positions of the first 5 zigzag-order coefficients */\n#define Q01_POS  1\n#define Q10_POS  8\n#define Q20_POS  16\n#define Q11_POS  9\n#define Q02_POS  2\n\n/*\n * Determine whether block smoothing is applicable and safe.\n * We also latch the current states of the coef_bits[] entries for the\n * AC coefficients; otherwise, if the input side of the decompressor\n * advances into a new scan, we might think the coefficients are known\n * more accurately than they really are.\n */\n\nLOCAL(boolean)\nsmoothing_ok (j_decompress_ptr cinfo)\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n  boolean smoothing_useful = FALSE;\n  int ci, coefi;\n  jpeg_component_info *compptr;\n  JQUANT_TBL * qtable;\n  int * coef_bits;\n  int * coef_bits_latch;\n\n  if (! cinfo->progressive_mode || cinfo->coef_bits == NULL)\n    return FALSE;\n\n  /* Allocate latch area if not already done */\n  if (coef->coef_bits_latch == NULL)\n    coef->coef_bits_latch = (int *)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  cinfo->num_components *\n\t\t\t\t  (SAVED_COEFS * SIZEOF(int)));\n  coef_bits_latch = coef->coef_bits_latch;\n\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    /* All components' quantization values must already be latched. */\n    if ((qtable = compptr->quant_table) == NULL)\n      return FALSE;\n    /* Verify DC & first 5 AC quantizers are nonzero to avoid zero-divide. */\n    if (qtable->quantval[0] == 0 ||\n\tqtable->quantval[Q01_POS] == 0 ||\n\tqtable->quantval[Q10_POS] == 0 ||\n\tqtable->quantval[Q20_POS] == 0 ||\n\tqtable->quantval[Q11_POS] == 0 ||\n\tqtable->quantval[Q02_POS] == 0)\n      return FALSE;\n    /* DC values must be at least partly known for all components. */\n    coef_bits = cinfo->coef_bits[ci];\n    if (coef_bits[0] < 0)\n      return FALSE;\n    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */\n    for (coefi = 1; coefi <= 5; coefi++) {\n      coef_bits_latch[coefi] = coef_bits[coefi];\n      if (coef_bits[coefi] != 0)\n\tsmoothing_useful = TRUE;\n    }\n    coef_bits_latch += SAVED_COEFS;\n  }\n\n  return smoothing_useful;\n}\n\n\n/*\n * Variant of decompress_data for use when doing block smoothing.\n */\n\nMETHODDEF(int)\ndecompress_smooth_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;\n  JDIMENSION block_num, last_block_column;\n  int ci, block_row, block_rows, access_rows;\n  JBLOCKARRAY buffer;\n  JBLOCKROW buffer_ptr, prev_block_row, next_block_row;\n  JSAMPARRAY output_ptr;\n  JDIMENSION output_col;\n  jpeg_component_info *compptr;\n  inverse_DCT_method_ptr inverse_DCT;\n  boolean first_row, last_row;\n  JBLOCK workspace;\n  int *coef_bits;\n  JQUANT_TBL *quanttbl;\n  INT32 Q00,Q01,Q02,Q10,Q11,Q20, num;\n  int DC1,DC2,DC3,DC4,DC5,DC6,DC7,DC8,DC9;\n  int Al, pred;\n\n  /* Force some input to be done if we are getting ahead of the input. */\n  while (cinfo->input_scan_number <= cinfo->output_scan_number &&\n\t ! cinfo->inputctl->eoi_reached) {\n    if (cinfo->input_scan_number == cinfo->output_scan_number) {\n      /* If input is working on current scan, we ordinarily want it to\n       * have completed the current row.  But if input scan is DC,\n       * we want it to keep one row ahead so that next block row's DC\n       * values are up to date.\n       */\n      JDIMENSION delta = (cinfo->Ss == 0) ? 1 : 0;\n      if (cinfo->input_iMCU_row > cinfo->output_iMCU_row+delta)\n\tbreak;\n    }\n    if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED)\n      return JPEG_SUSPENDED;\n  }\n\n  /* OK, output from the virtual arrays. */\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    /* Don't bother to IDCT an uninteresting component. */\n    if (! compptr->component_needed)\n      continue;\n    /* Count non-dummy DCT block rows in this iMCU row. */\n    if (cinfo->output_iMCU_row < last_iMCU_row) {\n      block_rows = compptr->v_samp_factor;\n      access_rows = block_rows * 2; /* this and next iMCU row */\n      last_row = FALSE;\n    } else {\n      /* NB: can't use last_row_height here; it is input-side-dependent! */\n      block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);\n      if (block_rows == 0) block_rows = compptr->v_samp_factor;\n      access_rows = block_rows; /* this iMCU row only */\n      last_row = TRUE;\n    }\n    /* Align the virtual buffer for this component. */\n    if (cinfo->output_iMCU_row > 0) {\n      access_rows += compptr->v_samp_factor; /* prior iMCU row too */\n      buffer = (*cinfo->mem->access_virt_barray)\n\t((j_common_ptr) cinfo, coef->whole_image[ci],\n\t (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,\n\t (JDIMENSION) access_rows, FALSE);\n      buffer += compptr->v_samp_factor;\t/* point to current iMCU row */\n      first_row = FALSE;\n    } else {\n      buffer = (*cinfo->mem->access_virt_barray)\n\t((j_common_ptr) cinfo, coef->whole_image[ci],\n\t (JDIMENSION) 0, (JDIMENSION) access_rows, FALSE);\n      first_row = TRUE;\n    }\n    /* Fetch component-dependent info */\n    coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);\n    quanttbl = compptr->quant_table;\n    Q00 = quanttbl->quantval[0];\n    Q01 = quanttbl->quantval[Q01_POS];\n    Q10 = quanttbl->quantval[Q10_POS];\n    Q20 = quanttbl->quantval[Q20_POS];\n    Q11 = quanttbl->quantval[Q11_POS];\n    Q02 = quanttbl->quantval[Q02_POS];\n    inverse_DCT = cinfo->idct->inverse_DCT[ci];\n    output_ptr = output_buf[ci];\n    /* Loop over all DCT blocks to be processed. */\n    for (block_row = 0; block_row < block_rows; block_row++) {\n      buffer_ptr = buffer[block_row];\n      if (first_row && block_row == 0)\n\tprev_block_row = buffer_ptr;\n      else\n\tprev_block_row = buffer[block_row-1];\n      if (last_row && block_row == block_rows-1)\n\tnext_block_row = buffer_ptr;\n      else\n\tnext_block_row = buffer[block_row+1];\n      /* We fetch the surrounding DC values using a sliding-register approach.\n       * Initialize all nine here so as to do the right thing on narrow pics.\n       */\n      DC1 = DC2 = DC3 = (int) prev_block_row[0][0];\n      DC4 = DC5 = DC6 = (int) buffer_ptr[0][0];\n      DC7 = DC8 = DC9 = (int) next_block_row[0][0];\n      output_col = 0;\n      last_block_column = compptr->width_in_blocks - 1;\n      for (block_num = 0; block_num <= last_block_column; block_num++) {\n\t/* Fetch current DCT block into workspace so we can modify it. */\n\tjcopy_block_row(buffer_ptr, (JBLOCKROW) workspace, (JDIMENSION) 1);\n\t/* Update DC values */\n\tif (block_num < last_block_column) {\n\t  DC3 = (int) prev_block_row[1][0];\n\t  DC6 = (int) buffer_ptr[1][0];\n\t  DC9 = (int) next_block_row[1][0];\n\t}\n\t/* Compute coefficient estimates per K.8.\n\t * An estimate is applied only if coefficient is still zero,\n\t * and is not known to be fully accurate.\n\t */\n\t/* AC01 */\n\tif ((Al=coef_bits[1]) != 0 && workspace[1] == 0) {\n\t  num = 36 * Q00 * (DC4 - DC6);\n\t  if (num >= 0) {\n\t    pred = (int) (((Q01<<7) + num) / (Q01<<8));\n\t    if (Al > 0 && pred >= (1<<Al))\n\t      pred = (1<<Al)-1;\n\t  } else {\n\t    pred = (int) (((Q01<<7) - num) / (Q01<<8));\n\t    if (Al > 0 && pred >= (1<<Al))\n\t      pred = (1<<Al)-1;\n\t    pred = -pred;\n\t  }\n\t  workspace[1] = (JCOEF) pred;\n\t}\n\t/* AC10 */\n\tif ((Al=coef_bits[2]) != 0 && workspace[8] == 0) {\n\t  num = 36 * Q00 * (DC2 - DC8);\n\t  if (num >= 0) {\n\t    pred = (int) (((Q10<<7) + num) / (Q10<<8));\n\t    if (Al > 0 && pred >= (1<<Al))\n\t      pred = (1<<Al)-1;\n\t  } else {\n\t    pred = (int) (((Q10<<7) - num) / (Q10<<8));\n\t    if (Al > 0 && pred >= (1<<Al))\n\t      pred = (1<<Al)-1;\n\t    pred = -pred;\n\t  }\n\t  workspace[8] = (JCOEF) pred;\n\t}\n\t/* AC20 */\n\tif ((Al=coef_bits[3]) != 0 && workspace[16] == 0) {\n\t  num = 9 * Q00 * (DC2 + DC8 - 2*DC5);\n\t  if (num >= 0) {\n\t    pred = (int) (((Q20<<7) + num) / (Q20<<8));\n\t    if (Al > 0 && pred >= (1<<Al))\n\t      pred = (1<<Al)-1;\n\t  } else {\n\t    pred = (int) (((Q20<<7) - num) / (Q20<<8));\n\t    if (Al > 0 && pred >= (1<<Al))\n\t      pred = (1<<Al)-1;\n\t    pred = -pred;\n\t  }\n\t  workspace[16] = (JCOEF) pred;\n\t}\n\t/* AC11 */\n\tif ((Al=coef_bits[4]) != 0 && workspace[9] == 0) {\n\t  num = 5 * Q00 * (DC1 - DC3 - DC7 + DC9);\n\t  if (num >= 0) {\n\t    pred = (int) (((Q11<<7) + num) / (Q11<<8));\n\t    if (Al > 0 && pred >= (1<<Al))\n\t      pred = (1<<Al)-1;\n\t  } else {\n\t    pred = (int) (((Q11<<7) - num) / (Q11<<8));\n\t    if (Al > 0 && pred >= (1<<Al))\n\t      pred = (1<<Al)-1;\n\t    pred = -pred;\n\t  }\n\t  workspace[9] = (JCOEF) pred;\n\t}\n\t/* AC02 */\n\tif ((Al=coef_bits[5]) != 0 && workspace[2] == 0) {\n\t  num = 9 * Q00 * (DC4 + DC6 - 2*DC5);\n\t  if (num >= 0) {\n\t    pred = (int) (((Q02<<7) + num) / (Q02<<8));\n\t    if (Al > 0 && pred >= (1<<Al))\n\t      pred = (1<<Al)-1;\n\t  } else {\n\t    pred = (int) (((Q02<<7) - num) / (Q02<<8));\n\t    if (Al > 0 && pred >= (1<<Al))\n\t      pred = (1<<Al)-1;\n\t    pred = -pred;\n\t  }\n\t  workspace[2] = (JCOEF) pred;\n\t}\n\t/* OK, do the IDCT */\n\t(*inverse_DCT) (cinfo, compptr, (JCOEFPTR) workspace,\n\t\t\toutput_ptr, output_col);\n\t/* Advance for next column */\n\tDC1 = DC2; DC2 = DC3;\n\tDC4 = DC5; DC5 = DC6;\n\tDC7 = DC8; DC8 = DC9;\n\tbuffer_ptr++, prev_block_row++, next_block_row++;\n\toutput_col += compptr->DCT_scaled_size;\n      }\n      output_ptr += compptr->DCT_scaled_size;\n    }\n  }\n\n  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)\n    return JPEG_ROW_COMPLETED;\n  return JPEG_SCAN_COMPLETED;\n}\n\n#endif /* BLOCK_SMOOTHING_SUPPORTED */\n\n\n/*\n * Initialize coefficient buffer controller.\n */\n\nGLOBAL(void)\njinit_d_coef_controller (j_decompress_ptr cinfo, boolean need_full_buffer)\n{\n  my_coef_ptr coef;\n\n  coef = (my_coef_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_coef_controller));\n  cinfo->coef = (struct jpeg_d_coef_controller *) coef;\n  coef->pub.start_input_pass = start_input_pass;\n  coef->pub.start_output_pass = start_output_pass;\n#ifdef BLOCK_SMOOTHING_SUPPORTED\n  coef->coef_bits_latch = NULL;\n#endif\n\n  /* Create the coefficient buffer. */\n  if (need_full_buffer) {\n#ifdef D_MULTISCAN_FILES_SUPPORTED\n    /* Allocate a full-image virtual array for each component, */\n    /* padded to a multiple of samp_factor DCT blocks in each direction. */\n    /* Note we ask for a pre-zeroed array. */\n    int ci, access_rows;\n    jpeg_component_info *compptr;\n\n    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n\t ci++, compptr++) {\n      access_rows = compptr->v_samp_factor;\n#ifdef BLOCK_SMOOTHING_SUPPORTED\n      /* If block smoothing could be used, need a bigger window */\n      if (cinfo->progressive_mode)\n\taccess_rows *= 3;\n#endif\n      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)\n\t((j_common_ptr) cinfo, JPOOL_IMAGE, TRUE,\n\t (JDIMENSION) jround_up((long) compptr->width_in_blocks,\n\t\t\t\t(long) compptr->h_samp_factor),\n\t (JDIMENSION) jround_up((long) compptr->height_in_blocks,\n\t\t\t\t(long) compptr->v_samp_factor),\n\t (JDIMENSION) access_rows);\n    }\n    coef->pub.consume_data = consume_data;\n    coef->pub.decompress_data = decompress_data;\n    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */\n#else\n    ERREXIT(cinfo, JERR_NOT_COMPILED);\n#endif\n  } else {\n    /* We only need a single-MCU buffer. */\n    JBLOCKROW buffer;\n    int i;\n\n    buffer = (JBLOCKROW)\n      (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  D_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));\n    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {\n      coef->MCU_buffer[i] = buffer + i;\n    }\n    coef->pub.consume_data = dummy_consume_data;\n    coef->pub.decompress_data = decompress_onepass;\n    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */\n  }\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jdcolor.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jdcolor.c\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains output colorspace conversion routines.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Private subobject */\n\ntypedef struct {\n  struct jpeg_color_deconverter pub; /* public fields */\n\n  /* Private state for YCC->RGB conversion */\n  int * Cr_r_tab;\t\t/* => table for Cr to R conversion */\n  int * Cb_b_tab;\t\t/* => table for Cb to B conversion */\n  INT32 * Cr_g_tab;\t\t/* => table for Cr to G conversion */\n  INT32 * Cb_g_tab;\t\t/* => table for Cb to G conversion */\n} my_color_deconverter;\n\ntypedef my_color_deconverter * my_cconvert_ptr;\n\n\n/**************** YCbCr -> RGB conversion: most common case **************/\n\n/*\n * YCbCr is defined per CCIR 601-1, except that Cb and Cr are\n * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.\n * The conversion equations to be implemented are therefore\n *\tR = Y                + 1.40200 * Cr\n *\tG = Y - 0.34414 * Cb - 0.71414 * Cr\n *\tB = Y + 1.77200 * Cb\n * where Cb and Cr represent the incoming values less CENTERJSAMPLE.\n * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)\n *\n * To avoid floating-point arithmetic, we represent the fractional constants\n * as integers scaled up by 2^16 (about 4 digits precision); we have to divide\n * the products by 2^16, with appropriate rounding, to get the correct answer.\n * Notice that Y, being an integral input, does not contribute any fraction\n * so it need not participate in the rounding.\n *\n * For even more speed, we avoid doing any multiplications in the inner loop\n * by precalculating the constants times Cb and Cr for all possible values.\n * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);\n * for 12-bit samples it is still acceptable.  It's not very reasonable for\n * 16-bit samples, but if you want lossless storage you shouldn't be changing\n * colorspace anyway.\n * The Cr=>R and Cb=>B values can be rounded to integers in advance; the\n * values for the G calculation are left scaled up, since we must add them\n * together before rounding.\n */\n\n#define SCALEBITS\t16\t/* speediest right-shift on some machines */\n#define ONE_HALF\t((INT32) 1 << (SCALEBITS-1))\n#define FIX(x)\t\t((INT32) ((x) * (1L<<SCALEBITS) + 0.5))\n\n\n/*\n * Initialize tables for YCC->RGB colorspace conversion.\n */\n\nLOCAL(void)\nbuild_ycc_rgb_table (j_decompress_ptr cinfo)\n{\n  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;\n  int i;\n  INT32 x;\n  SHIFT_TEMPS\n\n  cconvert->Cr_r_tab = (int *)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t(MAXJSAMPLE+1) * SIZEOF(int));\n  cconvert->Cb_b_tab = (int *)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t(MAXJSAMPLE+1) * SIZEOF(int));\n  cconvert->Cr_g_tab = (INT32 *)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t(MAXJSAMPLE+1) * SIZEOF(INT32));\n  cconvert->Cb_g_tab = (INT32 *)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t(MAXJSAMPLE+1) * SIZEOF(INT32));\n\n  for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {\n    /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */\n    /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */\n    /* Cr=>R value is nearest int to 1.40200 * x */\n    cconvert->Cr_r_tab[i] = (int)\n\t\t    RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS);\n    /* Cb=>B value is nearest int to 1.77200 * x */\n    cconvert->Cb_b_tab[i] = (int)\n\t\t    RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS);\n    /* Cr=>G value is scaled-up -0.71414 * x */\n    cconvert->Cr_g_tab[i] = (- FIX(0.71414)) * x;\n    /* Cb=>G value is scaled-up -0.34414 * x */\n    /* We also add in ONE_HALF so that need not do it in inner loop */\n    cconvert->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF;\n  }\n}\n\n\n/*\n * Convert some rows of samples to the output colorspace.\n *\n * Note that we change from noninterleaved, one-plane-per-component format\n * to interleaved-pixel format.  The output buffer is therefore three times\n * as wide as the input buffer.\n * A starting row offset is provided only for the input buffer.  The caller\n * can easily adjust the passed output_buf value to accommodate any row\n * offset required on that side.\n */\n\nMETHODDEF(void)\nycc_rgb_convert (j_decompress_ptr cinfo,\n\t\t JSAMPIMAGE input_buf, JDIMENSION input_row,\n\t\t JSAMPARRAY output_buf, int num_rows)\n{\n  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;\n  register int y, cb, cr;\n  register JSAMPROW outptr;\n  register JSAMPROW inptr0, inptr1, inptr2;\n  register JDIMENSION col;\n  JDIMENSION num_cols = cinfo->output_width;\n  /* copy these pointers into registers if possible */\n  register JSAMPLE * range_limit = cinfo->sample_range_limit;\n  register int * Crrtab = cconvert->Cr_r_tab;\n  register int * Cbbtab = cconvert->Cb_b_tab;\n  register INT32 * Crgtab = cconvert->Cr_g_tab;\n  register INT32 * Cbgtab = cconvert->Cb_g_tab;\n  SHIFT_TEMPS\n\n  while (--num_rows >= 0) {\n    inptr0 = input_buf[0][input_row];\n    inptr1 = input_buf[1][input_row];\n    inptr2 = input_buf[2][input_row];\n    input_row++;\n    outptr = *output_buf++;\n    for (col = 0; col < num_cols; col++) {\n      y  = GETJSAMPLE(inptr0[col]);\n      cb = GETJSAMPLE(inptr1[col]);\n      cr = GETJSAMPLE(inptr2[col]);\n      /* Range-limiting is essential due to noise introduced by DCT losses. */\n      outptr[RGB_RED] =   range_limit[y + Crrtab[cr]];\n      outptr[RGB_GREEN] = range_limit[y +\n\t\t\t      ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],\n\t\t\t\t\t\t SCALEBITS))];\n      outptr[RGB_BLUE] =  range_limit[y + Cbbtab[cb]];\n      outptr += RGB_PIXELSIZE;\n    }\n  }\n}\n\n\n/**************** Cases other than YCbCr -> RGB **************/\n\n\n/*\n * Color conversion for no colorspace change: just copy the data,\n * converting from separate-planes to interleaved representation.\n */\n\nMETHODDEF(void)\nnull_convert (j_decompress_ptr cinfo,\n\t      JSAMPIMAGE input_buf, JDIMENSION input_row,\n\t      JSAMPARRAY output_buf, int num_rows)\n{\n  register JSAMPROW inptr, outptr;\n  register JDIMENSION count;\n  register int num_components = cinfo->num_components;\n  JDIMENSION num_cols = cinfo->output_width;\n  int ci;\n\n  while (--num_rows >= 0) {\n    for (ci = 0; ci < num_components; ci++) {\n      inptr = input_buf[ci][input_row];\n      outptr = output_buf[0] + ci;\n      for (count = num_cols; count > 0; count--) {\n\t*outptr = *inptr++;\t/* needn't bother with GETJSAMPLE() here */\n\toutptr += num_components;\n      }\n    }\n    input_row++;\n    output_buf++;\n  }\n}\n\n\n/*\n * Color conversion for grayscale: just copy the data.\n * This also works for YCbCr -> grayscale conversion, in which\n * we just copy the Y (luminance) component and ignore chrominance.\n */\n\nMETHODDEF(void)\ngrayscale_convert (j_decompress_ptr cinfo,\n\t\t   JSAMPIMAGE input_buf, JDIMENSION input_row,\n\t\t   JSAMPARRAY output_buf, int num_rows)\n{\n  jcopy_sample_rows(input_buf[0], (int) input_row, output_buf, 0,\n\t\t    num_rows, cinfo->output_width);\n}\n\n\n/*\n * Convert grayscale to RGB: just duplicate the graylevel three times.\n * This is provided to support applications that don't want to cope\n * with grayscale as a separate case.\n */\n\nMETHODDEF(void)\ngray_rgb_convert (j_decompress_ptr cinfo,\n\t\t  JSAMPIMAGE input_buf, JDIMENSION input_row,\n\t\t  JSAMPARRAY output_buf, int num_rows)\n{\n  register JSAMPROW inptr, outptr;\n  register JDIMENSION col;\n  JDIMENSION num_cols = cinfo->output_width;\n\n  while (--num_rows >= 0) {\n    inptr = input_buf[0][input_row++];\n    outptr = *output_buf++;\n    for (col = 0; col < num_cols; col++) {\n      /* We can dispense with GETJSAMPLE() here */\n      outptr[RGB_RED] = outptr[RGB_GREEN] = outptr[RGB_BLUE] = inptr[col];\n      outptr += RGB_PIXELSIZE;\n    }\n  }\n}\n\n\n/*\n * Adobe-style YCCK->CMYK conversion.\n * We convert YCbCr to R=1-C, G=1-M, and B=1-Y using the same\n * conversion as above, while passing K (black) unchanged.\n * We assume build_ycc_rgb_table has been called.\n */\n\nMETHODDEF(void)\nycck_cmyk_convert (j_decompress_ptr cinfo,\n\t\t   JSAMPIMAGE input_buf, JDIMENSION input_row,\n\t\t   JSAMPARRAY output_buf, int num_rows)\n{\n  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;\n  register int y, cb, cr;\n  register JSAMPROW outptr;\n  register JSAMPROW inptr0, inptr1, inptr2, inptr3;\n  register JDIMENSION col;\n  JDIMENSION num_cols = cinfo->output_width;\n  /* copy these pointers into registers if possible */\n  register JSAMPLE * range_limit = cinfo->sample_range_limit;\n  register int * Crrtab = cconvert->Cr_r_tab;\n  register int * Cbbtab = cconvert->Cb_b_tab;\n  register INT32 * Crgtab = cconvert->Cr_g_tab;\n  register INT32 * Cbgtab = cconvert->Cb_g_tab;\n  SHIFT_TEMPS\n\n  while (--num_rows >= 0) {\n    inptr0 = input_buf[0][input_row];\n    inptr1 = input_buf[1][input_row];\n    inptr2 = input_buf[2][input_row];\n    inptr3 = input_buf[3][input_row];\n    input_row++;\n    outptr = *output_buf++;\n    for (col = 0; col < num_cols; col++) {\n      y  = GETJSAMPLE(inptr0[col]);\n      cb = GETJSAMPLE(inptr1[col]);\n      cr = GETJSAMPLE(inptr2[col]);\n      /* Range-limiting is essential due to noise introduced by DCT losses. */\n      outptr[0] = range_limit[MAXJSAMPLE - (y + Crrtab[cr])];\t/* red */\n      outptr[1] = range_limit[MAXJSAMPLE - (y +\t\t\t/* green */\n\t\t\t      ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],\n\t\t\t\t\t\t SCALEBITS)))];\n      outptr[2] = range_limit[MAXJSAMPLE - (y + Cbbtab[cb])];\t/* blue */\n      /* K passes through unchanged */\n      outptr[3] = inptr3[col];\t/* don't need GETJSAMPLE here */\n      outptr += 4;\n    }\n  }\n}\n\n\n/*\n * Empty method for start_pass.\n */\n\nMETHODDEF(void)\nstart_pass_dcolor (j_decompress_ptr cinfo)\n{\n  /* no work needed */\n}\n\n\n/*\n * Module initialization routine for output colorspace conversion.\n */\n\nGLOBAL(void)\njinit_color_deconverter (j_decompress_ptr cinfo)\n{\n  my_cconvert_ptr cconvert;\n  int ci;\n\n  cconvert = (my_cconvert_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_color_deconverter));\n  cinfo->cconvert = (struct jpeg_color_deconverter *) cconvert;\n  cconvert->pub.start_pass = start_pass_dcolor;\n\n  /* Make sure num_components agrees with jpeg_color_space */\n  switch (cinfo->jpeg_color_space) {\n  case JCS_GRAYSCALE:\n    if (cinfo->num_components != 1)\n      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);\n    break;\n\n  case JCS_RGB:\n  case JCS_YCbCr:\n    if (cinfo->num_components != 3)\n      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);\n    break;\n\n  case JCS_CMYK:\n  case JCS_YCCK:\n    if (cinfo->num_components != 4)\n      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);\n    break;\n\n  default:\t\t\t/* JCS_UNKNOWN can be anything */\n    if (cinfo->num_components < 1)\n      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);\n    break;\n  }\n\n  /* Set out_color_components and conversion method based on requested space.\n   * Also clear the component_needed flags for any unused components,\n   * so that earlier pipeline stages can avoid useless computation.\n   */\n\n  switch (cinfo->out_color_space) {\n  case JCS_GRAYSCALE:\n    cinfo->out_color_components = 1;\n    if (cinfo->jpeg_color_space == JCS_GRAYSCALE ||\n\tcinfo->jpeg_color_space == JCS_YCbCr) {\n      cconvert->pub.color_convert = grayscale_convert;\n      /* For color->grayscale conversion, only the Y (0) component is needed */\n      for (ci = 1; ci < cinfo->num_components; ci++)\n\tcinfo->comp_info[ci].component_needed = FALSE;\n    } else\n      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n    break;\n\n  case JCS_RGB:\n    cinfo->out_color_components = RGB_PIXELSIZE;\n    if (cinfo->jpeg_color_space == JCS_YCbCr) {\n      cconvert->pub.color_convert = ycc_rgb_convert;\n      build_ycc_rgb_table(cinfo);\n    } else if (cinfo->jpeg_color_space == JCS_GRAYSCALE) {\n      cconvert->pub.color_convert = gray_rgb_convert;\n    } else if (cinfo->jpeg_color_space == JCS_RGB && RGB_PIXELSIZE == 3) {\n      cconvert->pub.color_convert = null_convert;\n    } else\n      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n    break;\n\n  case JCS_CMYK:\n    cinfo->out_color_components = 4;\n    if (cinfo->jpeg_color_space == JCS_YCCK) {\n      cconvert->pub.color_convert = ycck_cmyk_convert;\n      build_ycc_rgb_table(cinfo);\n    } else if (cinfo->jpeg_color_space == JCS_CMYK) {\n      cconvert->pub.color_convert = null_convert;\n    } else\n      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n    break;\n\n  default:\n    /* Permit null conversion to same output space */\n    if (cinfo->out_color_space == cinfo->jpeg_color_space) {\n      cinfo->out_color_components = cinfo->num_components;\n      cconvert->pub.color_convert = null_convert;\n    } else\t\t\t/* unsupported non-null conversion */\n      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n    break;\n  }\n\n  if (cinfo->quantize_colors)\n    cinfo->output_components = 1; /* single colormapped output component */\n  else\n    cinfo->output_components = cinfo->out_color_components;\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jddctmgr.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jddctmgr.c\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains the inverse-DCT management logic.\n * This code selects a particular IDCT implementation to be used,\n * and it performs related housekeeping chores.  No code in this file\n * is executed per IDCT step, only during output pass setup.\n *\n * Note that the IDCT routines are responsible for performing coefficient\n * dequantization as well as the IDCT proper.  This module sets up the\n * dequantization multiplier table needed by the IDCT routine.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jdct.h\"\t\t/* Private declarations for DCT subsystem */\n\n\n/*\n * The decompressor input side (jdinput.c) saves away the appropriate\n * quantization table for each component at the start of the first scan\n * involving that component.  (This is necessary in order to correctly\n * decode files that reuse Q-table slots.)\n * When we are ready to make an output pass, the saved Q-table is converted\n * to a multiplier table that will actually be used by the IDCT routine.\n * The multiplier table contents are IDCT-method-dependent.  To support\n * application changes in IDCT method between scans, we can remake the\n * multiplier tables if necessary.\n * In buffered-image mode, the first output pass may occur before any data\n * has been seen for some components, and thus before their Q-tables have\n * been saved away.  To handle this case, multiplier tables are preset\n * to zeroes; the result of the IDCT will be a neutral gray level.\n */\n\n\n/* Private subobject for this module */\n\ntypedef struct {\n  struct jpeg_inverse_dct pub;\t/* public fields */\n\n  /* This array contains the IDCT method code that each multiplier table\n   * is currently set up for, or -1 if it's not yet set up.\n   * The actual multiplier tables are pointed to by dct_table in the\n   * per-component comp_info structures.\n   */\n  int cur_method[MAX_COMPONENTS];\n} my_idct_controller;\n\ntypedef my_idct_controller * my_idct_ptr;\n\n\n/* Allocated multiplier tables: big enough for any supported variant */\n\ntypedef union {\n  ISLOW_MULT_TYPE islow_array[DCTSIZE2];\n#ifdef DCT_IFAST_SUPPORTED\n  IFAST_MULT_TYPE ifast_array[DCTSIZE2];\n#endif\n#ifdef DCT_FLOAT_SUPPORTED\n  FLOAT_MULT_TYPE float_array[DCTSIZE2];\n#endif\n} multiplier_table;\n\n\n/* The current scaled-IDCT routines require ISLOW-style multiplier tables,\n * so be sure to compile that code if either ISLOW or SCALING is requested.\n */\n#ifdef DCT_ISLOW_SUPPORTED\n#define PROVIDE_ISLOW_TABLES\n#else\n#ifdef IDCT_SCALING_SUPPORTED\n#define PROVIDE_ISLOW_TABLES\n#endif\n#endif\n\n\n/*\n * Prepare for an output pass.\n * Here we select the proper IDCT routine for each component and build\n * a matching multiplier table.\n */\n\nMETHODDEF(void)\nstart_pass (j_decompress_ptr cinfo)\n{\n  my_idct_ptr idct = (my_idct_ptr) cinfo->idct;\n  int ci, i;\n  jpeg_component_info *compptr;\n  int method = 0;\n  inverse_DCT_method_ptr method_ptr = NULL;\n  JQUANT_TBL * qtbl;\n\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    /* Select the proper IDCT routine for this component's scaling */\n    switch (compptr->DCT_scaled_size) {\n#ifdef IDCT_SCALING_SUPPORTED\n    case 1:\n      method_ptr = jpeg_idct_1x1;\n      method = JDCT_ISLOW;\t/* jidctred uses islow-style table */\n      break;\n    case 2:\n      method_ptr = jpeg_idct_2x2;\n      method = JDCT_ISLOW;\t/* jidctred uses islow-style table */\n      break;\n    case 4:\n      method_ptr = jpeg_idct_4x4;\n      method = JDCT_ISLOW;\t/* jidctred uses islow-style table */\n      break;\n#endif\n    case DCTSIZE:\n      switch (cinfo->dct_method) {\n#ifdef DCT_ISLOW_SUPPORTED\n      case JDCT_ISLOW:\n\tmethod_ptr = jpeg_idct_islow;\n\tmethod = JDCT_ISLOW;\n\tbreak;\n#endif\n#ifdef DCT_IFAST_SUPPORTED\n      case JDCT_IFAST:\n\tmethod_ptr = jpeg_idct_ifast;\n\tmethod = JDCT_IFAST;\n\tbreak;\n#endif\n#ifdef DCT_FLOAT_SUPPORTED\n      case JDCT_FLOAT:\n\tmethod_ptr = jpeg_idct_float;\n\tmethod = JDCT_FLOAT;\n\tbreak;\n#endif\n      default:\n\tERREXIT(cinfo, JERR_NOT_COMPILED);\n\tbreak;\n      }\n      break;\n    default:\n      ERREXIT1(cinfo, JERR_BAD_DCTSIZE, compptr->DCT_scaled_size);\n      break;\n    }\n    idct->pub.inverse_DCT[ci] = method_ptr;\n    /* Create multiplier table from quant table.\n     * However, we can skip this if the component is uninteresting\n     * or if we already built the table.  Also, if no quant table\n     * has yet been saved for the component, we leave the\n     * multiplier table all-zero; we'll be reading zeroes from the\n     * coefficient controller's buffer anyway.\n     */\n    if (! compptr->component_needed || idct->cur_method[ci] == method)\n      continue;\n    qtbl = compptr->quant_table;\n    if (qtbl == NULL)\t\t/* happens if no data yet for component */\n      continue;\n    idct->cur_method[ci] = method;\n    switch (method) {\n#ifdef PROVIDE_ISLOW_TABLES\n    case JDCT_ISLOW:\n      {\n\t/* For LL&M IDCT method, multipliers are equal to raw quantization\n\t * coefficients, but are stored as ints to ensure access efficiency.\n\t */\n\tISLOW_MULT_TYPE * ismtbl = (ISLOW_MULT_TYPE *) compptr->dct_table;\n\tfor (i = 0; i < DCTSIZE2; i++) {\n\t  ismtbl[i] = (ISLOW_MULT_TYPE) qtbl->quantval[i];\n\t}\n      }\n      break;\n#endif\n#ifdef DCT_IFAST_SUPPORTED\n    case JDCT_IFAST:\n      {\n\t/* For AA&N IDCT method, multipliers are equal to quantization\n\t * coefficients scaled by scalefactor[row]*scalefactor[col], where\n\t *   scalefactor[0] = 1\n\t *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7\n\t * For integer operation, the multiplier table is to be scaled by\n\t * IFAST_SCALE_BITS.\n\t */\n\tIFAST_MULT_TYPE * ifmtbl = (IFAST_MULT_TYPE *) compptr->dct_table;\n#define CONST_BITS 14\n\tstatic const INT16 aanscales[DCTSIZE2] = {\n\t  /* precomputed values scaled up by 14 bits */\n\t  16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,\n\t  22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,\n\t  21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,\n\t  19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,\n\t  16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,\n\t  12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,\n\t   8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,\n\t   4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247\n\t};\n\tSHIFT_TEMPS\n\n\tfor (i = 0; i < DCTSIZE2; i++) {\n\t  ifmtbl[i] = (IFAST_MULT_TYPE)\n\t    DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i],\n\t\t\t\t  (INT32) aanscales[i]),\n\t\t    CONST_BITS-IFAST_SCALE_BITS);\n\t}\n      }\n      break;\n#endif\n#ifdef DCT_FLOAT_SUPPORTED\n    case JDCT_FLOAT:\n      {\n\t/* For float AA&N IDCT method, multipliers are equal to quantization\n\t * coefficients scaled by scalefactor[row]*scalefactor[col], where\n\t *   scalefactor[0] = 1\n\t *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7\n\t */\n\tFLOAT_MULT_TYPE * fmtbl = (FLOAT_MULT_TYPE *) compptr->dct_table;\n\tint row, col;\n\tstatic const double aanscalefactor[DCTSIZE] = {\n\t  1.0, 1.387039845, 1.306562965, 1.175875602,\n\t  1.0, 0.785694958, 0.541196100, 0.275899379\n\t};\n\n\ti = 0;\n\tfor (row = 0; row < DCTSIZE; row++) {\n\t  for (col = 0; col < DCTSIZE; col++) {\n\t    fmtbl[i] = (FLOAT_MULT_TYPE)\n\t      ((double) qtbl->quantval[i] *\n\t       aanscalefactor[row] * aanscalefactor[col]);\n\t    i++;\n\t  }\n\t}\n      }\n      break;\n#endif\n    default:\n      ERREXIT(cinfo, JERR_NOT_COMPILED);\n      break;\n    }\n  }\n}\n\n\n/*\n * Initialize IDCT manager.\n */\n\nGLOBAL(void)\njinit_inverse_dct (j_decompress_ptr cinfo)\n{\n  my_idct_ptr idct;\n  int ci;\n  jpeg_component_info *compptr;\n\n  idct = (my_idct_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_idct_controller));\n  cinfo->idct = (struct jpeg_inverse_dct *) idct;\n  idct->pub.start_pass = start_pass;\n\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    /* Allocate and pre-zero a multiplier table for each component */\n    compptr->dct_table =\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  SIZEOF(multiplier_table));\n    MEMZERO(compptr->dct_table, SIZEOF(multiplier_table));\n    /* Mark multiplier table not yet set up for any method */\n    idct->cur_method[ci] = -1;\n  }\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jdhuff.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jdhuff.c\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains Huffman entropy decoding routines.\n *\n * Much of the complexity here has to do with supporting input suspension.\n * If the data source module demands suspension, we want to be able to back\n * up to the start of the current MCU.  To do this, we copy state variables\n * into local working storage, and update them back to the permanent\n * storage only upon successful completion of an MCU.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jdhuff.h\"\t\t/* Declarations shared with jdphuff.c */\n\n#ifdef _FX_MANAGED_CODE_\n#define savable_state\tsavable_state_d\n#endif\n\n/*\n * Expanded entropy decoder object for Huffman decoding.\n *\n * The savable_state subrecord contains fields that change within an MCU,\n * but must not be updated permanently until we complete the MCU.\n */\n\ntypedef struct {\n  int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */\n} savable_state;\n\n/* This macro is to work around compilers with missing or broken\n * structure assignment.  You'll need to fix this code if you have\n * such a compiler and you change MAX_COMPS_IN_SCAN.\n */\n\n#ifndef NO_STRUCT_ASSIGN\n#define ASSIGN_STATE(dest,src)  ((dest) = (src))\n#else\n#if MAX_COMPS_IN_SCAN == 4\n#define ASSIGN_STATE(dest,src)  \\\n\t((dest).last_dc_val[0] = (src).last_dc_val[0], \\\n\t (dest).last_dc_val[1] = (src).last_dc_val[1], \\\n\t (dest).last_dc_val[2] = (src).last_dc_val[2], \\\n\t (dest).last_dc_val[3] = (src).last_dc_val[3])\n#endif\n#endif\n\n\ntypedef struct {\n  struct jpeg_entropy_decoder pub; /* public fields */\n\n  /* These fields are loaded into local variables at start of each MCU.\n   * In case of suspension, we exit WITHOUT updating them.\n   */\n  bitread_perm_state bitstate;\t/* Bit buffer at start of MCU */\n  savable_state saved;\t\t/* Other state at start of MCU */\n\n  /* These fields are NOT loaded into local working state. */\n  unsigned int restarts_to_go;\t/* MCUs left in this restart interval */\n\n  /* Pointers to derived tables (these workspaces have image lifespan) */\n  d_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS];\n  d_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS];\n\n  /* Precalculated info set up by start_pass for use in decode_mcu: */\n\n  /* Pointers to derived tables to be used for each block within an MCU */\n  d_derived_tbl * dc_cur_tbls[D_MAX_BLOCKS_IN_MCU];\n  d_derived_tbl * ac_cur_tbls[D_MAX_BLOCKS_IN_MCU];\n  /* Whether we care about the DC and AC coefficient values for each block */\n  boolean dc_needed[D_MAX_BLOCKS_IN_MCU];\n  boolean ac_needed[D_MAX_BLOCKS_IN_MCU];\n} huff_entropy_decoder;\n\ntypedef huff_entropy_decoder * huff_entropy_ptr;\n\n\n/*\n * Initialize for a Huffman-compressed scan.\n */\n\nMETHODDEF(void)\nstart_pass_huff_decoder (j_decompress_ptr cinfo)\n{\n  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;\n  int ci, blkn, dctbl, actbl;\n  jpeg_component_info * compptr;\n\n  /* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG.\n   * This ought to be an error condition, but we make it a warning because\n   * there are some baseline files out there with all zeroes in these bytes.\n   */\n  if (cinfo->Ss != 0 || cinfo->Se != DCTSIZE2-1 ||\n      cinfo->Ah != 0 || cinfo->Al != 0)\n    WARNMS(cinfo, JWRN_NOT_SEQUENTIAL);\n\n  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n    compptr = cinfo->cur_comp_info[ci];\n    dctbl = compptr->dc_tbl_no;\n    actbl = compptr->ac_tbl_no;\n    /* Compute derived values for Huffman tables */\n    /* We may do this more than once for a table, but it's not expensive */\n    jpeg_make_d_derived_tbl(cinfo, TRUE, dctbl,\n\t\t\t    & entropy->dc_derived_tbls[dctbl]);\n    jpeg_make_d_derived_tbl(cinfo, FALSE, actbl,\n\t\t\t    & entropy->ac_derived_tbls[actbl]);\n    /* Initialize DC predictions to 0 */\n    entropy->saved.last_dc_val[ci] = 0;\n  }\n\n  /* Precalculate decoding info for each block in an MCU of this scan */\n  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {\n    ci = cinfo->MCU_membership[blkn];\n    compptr = cinfo->cur_comp_info[ci];\n    /* Precalculate which table to use for each block */\n    entropy->dc_cur_tbls[blkn] = entropy->dc_derived_tbls[compptr->dc_tbl_no];\n    entropy->ac_cur_tbls[blkn] = entropy->ac_derived_tbls[compptr->ac_tbl_no];\n    /* Decide whether we really care about the coefficient values */\n    if (compptr->component_needed) {\n      entropy->dc_needed[blkn] = TRUE;\n      /* we don't need the ACs if producing a 1/8th-size image */\n      entropy->ac_needed[blkn] = (compptr->DCT_scaled_size > 1);\n    } else {\n      entropy->dc_needed[blkn] = entropy->ac_needed[blkn] = FALSE;\n    }\n  }\n\n  /* Initialize bitread state variables */\n  entropy->bitstate.bits_left = 0;\n  entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */\n  entropy->pub.insufficient_data = FALSE;\n\n  /* Initialize restart counter */\n  entropy->restarts_to_go = cinfo->restart_interval;\n}\n\n\n/*\n * Compute the derived values for a Huffman table.\n * This routine also performs some validation checks on the table.\n *\n * Note this is also used by jdphuff.c.\n */\n\nGLOBAL(void)\njpeg_make_d_derived_tbl (j_decompress_ptr cinfo, boolean isDC, int tblno,\n\t\t\t d_derived_tbl ** pdtbl)\n{\n  JHUFF_TBL *htbl;\n  d_derived_tbl *dtbl;\n  int p, i, l, _si, numsymbols;\n  int lookbits, ctr;\n  char huffsize[257];\n  unsigned int huffcode[257];\n  unsigned int code;\n\n  /* Note that huffsize[] and huffcode[] are filled in code-length order,\n   * paralleling the order of the symbols themselves in htbl->huffval[].\n   */\n\n  /* Find the input Huffman table */\n  if (tblno < 0 || tblno >= NUM_HUFF_TBLS)\n    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);\n  htbl =\n    isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];\n  if (htbl == NULL)\n    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);\n\n  /* Allocate a workspace if we haven't already done so. */\n  if (*pdtbl == NULL)\n    *pdtbl = (d_derived_tbl *)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  SIZEOF(d_derived_tbl));\n  dtbl = *pdtbl;\n  dtbl->pub = htbl;\t\t/* fill in back link */\n  \n  /* Figure C.1: make table of Huffman code length for each symbol */\n\n  p = 0;\n  for (l = 1; l <= 16; l++) {\n    i = (int) htbl->bits[l];\n    if (i < 0 || p + i > 256)\t/* protect against table overrun */\n      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);\n    while (i--)\n      huffsize[p++] = (char) l;\n  }\n  huffsize[p] = 0;\n  numsymbols = p;\n  \n  /* Figure C.2: generate the codes themselves */\n  /* We also validate that the counts represent a legal Huffman code tree. */\n  \n  code = 0;\n  _si = huffsize[0];\n  p = 0;\n  while (huffsize[p]) {\n    while (((int) huffsize[p]) == _si) {\n      huffcode[p++] = code;\n      code++;\n    }\n    /* code is now 1 more than the last code used for codelength si; but\n     * it must still fit in si bits, since no code is allowed to be all ones.\n     */\n    if (((INT32) code) >= (((INT32) 1) << _si))\n      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);\n    code <<= 1;\n    _si++;\n  }\n\n  /* Figure F.15: generate decoding tables for bit-sequential decoding */\n\n  p = 0;\n  for (l = 1; l <= 16; l++) {\n    if (htbl->bits[l]) {\n      /* valoffset[l] = huffval[] index of 1st symbol of code length l,\n       * minus the minimum code of length l\n       */\n      dtbl->valoffset[l] = (INT32) p - (INT32) huffcode[p];\n      p += htbl->bits[l];\n      dtbl->maxcode[l] = huffcode[p-1]; /* maximum code of length l */\n    } else {\n      dtbl->maxcode[l] = -1;\t/* -1 if no codes of this length */\n    }\n  }\n  dtbl->maxcode[17] = 0xFFFFFL; /* ensures jpeg_huff_decode terminates */\n\n  /* Compute lookahead tables to speed up decoding.\n   * First we set all the table entries to 0, indicating \"too long\";\n   * then we iterate through the Huffman codes that are short enough and\n   * fill in all the entries that correspond to bit sequences starting\n   * with that code.\n   */\n\n  MEMZERO(dtbl->look_nbits, SIZEOF(dtbl->look_nbits));\n\n  p = 0;\n  for (l = 1; l <= HUFF_LOOKAHEAD; l++) {\n    for (i = 1; i <= (int) htbl->bits[l]; i++, p++) {\n      /* l = current code's length, p = its index in huffcode[] & huffval[]. */\n      /* Generate left-justified code followed by all possible bit sequences */\n      lookbits = huffcode[p] << (HUFF_LOOKAHEAD-l);\n      for (ctr = 1 << (HUFF_LOOKAHEAD-l); ctr > 0; ctr--) {\n\tdtbl->look_nbits[lookbits] = l;\n\tdtbl->look_sym[lookbits] = htbl->huffval[p];\n\tlookbits++;\n      }\n    }\n  }\n\n  /* Validate symbols as being reasonable.\n   * For AC tables, we make no check, but accept all byte values 0..255.\n   * For DC tables, we require the symbols to be in range 0..15.\n   * (Tighter bounds could be applied depending on the data depth and mode,\n   * but this is sufficient to ensure safe decoding.)\n   */\n  if (isDC) {\n    for (i = 0; i < numsymbols; i++) {\n      int sym = htbl->huffval[i];\n      if (sym < 0 || sym > 15)\n\tERREXIT(cinfo, JERR_BAD_HUFF_TABLE);\n    }\n  }\n}\n\n\n/*\n * Out-of-line code for bit fetching (shared with jdphuff.c).\n * See jdhuff.h for info about usage.\n * Note: current values of get_buffer and bits_left are passed as parameters,\n * but are returned in the corresponding fields of the state struct.\n *\n * On most machines MIN_GET_BITS should be 25 to allow the full 32-bit width\n * of get_buffer to be used.  (On machines with wider words, an even larger\n * buffer could be used.)  However, on some machines 32-bit shifts are\n * quite slow and take time proportional to the number of places shifted.\n * (This is true with most PC compilers, for instance.)  In this case it may\n * be a win to set MIN_GET_BITS to the minimum value of 15.  This reduces the\n * average shift distance at the cost of more calls to jpeg_fill_bit_buffer.\n */\n\n#ifdef SLOW_SHIFT_32\n#define MIN_GET_BITS  15\t/* minimum allowable value */\n#else\n#define MIN_GET_BITS  (BIT_BUF_SIZE-7)\n#endif\n\n\nGLOBAL(boolean)\njpeg_fill_bit_buffer (bitread_working_state * state,\n\t\t      register bit_buf_type get_buffer, register int bits_left,\n\t\t      int nbits)\n/* Load up the bit buffer to a depth of at least nbits */\n{\n  /* Copy heavily used state fields into locals (hopefully registers) */\n  register const JOCTET * next_input_byte = state->next_input_byte;\n  register size_t bytes_in_buffer = state->bytes_in_buffer;\n  j_decompress_ptr cinfo = state->cinfo;\n\n  /* Attempt to load at least MIN_GET_BITS bits into get_buffer. */\n  /* (It is assumed that no request will be for more than that many bits.) */\n  /* We fail to do so only if we hit a marker or are forced to suspend. */\n\n  if (cinfo->unread_marker == 0) {\t/* cannot advance past a marker */\n    while (bits_left < MIN_GET_BITS) {\n      register int c;\n\n      /* Attempt to read a byte */\n      if (bytes_in_buffer == 0) {\n\tif (! (*cinfo->src->fill_input_buffer) (cinfo))\n\t  return FALSE;\n\tnext_input_byte = cinfo->src->next_input_byte;\n\tbytes_in_buffer = cinfo->src->bytes_in_buffer;\n      }\n      bytes_in_buffer--;\n      c = GETJOCTET(*next_input_byte++);\n\n      /* If it's 0xFF, check and discard stuffed zero byte */\n      if (c == 0xFF) {\n\t/* Loop here to discard any padding FF's on terminating marker,\n\t * so that we can save a valid unread_marker value.  NOTE: we will\n\t * accept multiple FF's followed by a 0 as meaning a single FF data\n\t * byte.  This data pattern is not valid according to the standard.\n\t */\n\tdo {\n\t  if (bytes_in_buffer == 0) {\n\t    if (! (*cinfo->src->fill_input_buffer) (cinfo))\n\t      return FALSE;\n\t    next_input_byte = cinfo->src->next_input_byte;\n\t    bytes_in_buffer = cinfo->src->bytes_in_buffer;\n\t  }\n\t  bytes_in_buffer--;\n\t  c = GETJOCTET(*next_input_byte++);\n\t} while (c == 0xFF);\n\n\tif (c == 0) {\n\t  /* Found FF/00, which represents an FF data byte */\n\t  c = 0xFF;\n\t} else {\n\t  /* Oops, it's actually a marker indicating end of compressed data.\n\t   * Save the marker code for later use.\n\t   * Fine point: it might appear that we should save the marker into\n\t   * bitread working state, not straight into permanent state.  But\n\t   * once we have hit a marker, we cannot need to suspend within the\n\t   * current MCU, because we will read no more bytes from the data\n\t   * source.  So it is OK to update permanent state right away.\n\t   */\n\t  cinfo->unread_marker = c;\n\t  /* See if we need to insert some fake zero bits. */\n\t  goto no_more_bytes;\n\t}\n      }\n\n      /* OK, load c into get_buffer */\n      get_buffer = (get_buffer << 8) | c;\n      bits_left += 8;\n    } /* end while */\n  } else {\n  no_more_bytes:\n    /* We get here if we've read the marker that terminates the compressed\n     * data segment.  There should be enough bits in the buffer register\n     * to satisfy the request; if so, no problem.\n     */\n    if (nbits > bits_left) {\n      /* Uh-oh.  Report corrupted data to user and stuff zeroes into\n       * the data stream, so that we can produce some kind of image.\n       * We use a nonvolatile flag to ensure that only one warning message\n       * appears per data segment.\n       */\n      if (! cinfo->entropy->insufficient_data) {\n\tWARNMS(cinfo, JWRN_HIT_MARKER);\n\tcinfo->entropy->insufficient_data = TRUE;\n      }\n      /* Fill the buffer with zero bits */\n      get_buffer <<= MIN_GET_BITS - bits_left;\n      bits_left = MIN_GET_BITS;\n    }\n  }\n\n  /* Unload the local registers */\n  state->next_input_byte = next_input_byte;\n  state->bytes_in_buffer = bytes_in_buffer;\n  state->get_buffer = get_buffer;\n  state->bits_left = bits_left;\n\n  return TRUE;\n}\n\n\n/*\n * Out-of-line code for Huffman code decoding.\n * See jdhuff.h for info about usage.\n */\n\nGLOBAL(int)\njpeg_huff_decode (bitread_working_state * state,\n\t\t  register bit_buf_type get_buffer, register int bits_left,\n\t\t  d_derived_tbl * htbl, int min_bits)\n{\n  register int l = min_bits;\n  register INT32 code;\n\n  /* HUFF_DECODE has determined that the code is at least min_bits */\n  /* bits long, so fetch that many bits in one swoop. */\n\n  CHECK_BIT_BUFFER(*state, l, return -1);\n  code = GET_BITS(l);\n\n  /* Collect the rest of the Huffman code one bit at a time. */\n  /* This is per Figure F.16 in the JPEG spec. */\n\n  while (code > htbl->maxcode[l]) {\n    code <<= 1;\n    CHECK_BIT_BUFFER(*state, 1, return -1);\n    code |= GET_BITS(1);\n    l++;\n  }\n\n  /* Unload the local registers */\n  state->get_buffer = get_buffer;\n  state->bits_left = bits_left;\n\n  /* With garbage input we may reach the sentinel value l = 17. */\n\n  if (l > 16) {\n    WARNMS(state->cinfo, JWRN_HUFF_BAD_CODE);\n    return 0;\t\t\t/* fake a zero as the safest result */\n  }\n\n  return htbl->pub->huffval[ (int) (code + htbl->valoffset[l]) ];\n}\n\n\n/*\n * Figure F.12: extend sign bit.\n * On some machines, a shift and add will be faster than a table lookup.\n */\n\n#ifdef AVOID_TABLES\n\n#define HUFF_EXTEND(x,s)  ((x) < (1<<((s)-1)) ? (x) + (((-1)<<(s)) + 1) : (x))\n\n#else\n\n#define HUFF_EXTEND(x,s)  ((x) < extend_test[s] ? (x) + extend_offset[s] : (x))\n\nstatic const int extend_test[16] =   /* entry n is 2**(n-1) */\n  { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,\n    0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 };\n\nstatic const int extend_offset[16] = /* entry n is (-1 << n) + 1 */\n  { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1,\n    ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1,\n    ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1,\n    ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 };\n\n#endif /* AVOID_TABLES */\n\n\n/*\n * Check for a restart marker & resynchronize decoder.\n * Returns FALSE if must suspend.\n */\n\nLOCAL(boolean)\nprocess_restart (j_decompress_ptr cinfo)\n{\n  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;\n  int ci;\n\n  /* Throw away any unused bits remaining in bit buffer; */\n  /* include any full bytes in next_marker's count of discarded bytes */\n  cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8;\n  entropy->bitstate.bits_left = 0;\n\n  /* Advance past the RSTn marker */\n  if (! (*cinfo->marker->read_restart_marker) (cinfo))\n    return FALSE;\n\n  /* Re-initialize DC predictions to 0 */\n  for (ci = 0; ci < cinfo->comps_in_scan; ci++)\n    entropy->saved.last_dc_val[ci] = 0;\n\n  /* Reset restart counter */\n  entropy->restarts_to_go = cinfo->restart_interval;\n\n  /* Reset out-of-data flag, unless read_restart_marker left us smack up\n   * against a marker.  In that case we will end up treating the next data\n   * segment as empty, and we can avoid producing bogus output pixels by\n   * leaving the flag set.\n   */\n  if (cinfo->unread_marker == 0)\n    entropy->pub.insufficient_data = FALSE;\n\n  return TRUE;\n}\n\n\n/*\n * Decode and return one MCU's worth of Huffman-compressed coefficients.\n * The coefficients are reordered from zigzag order into natural array order,\n * but are not dequantized.\n *\n * The i'th block of the MCU is stored into the block pointed to by\n * MCU_data[i].  WE ASSUME THIS AREA HAS BEEN ZEROED BY THE CALLER.\n * (Wholesale zeroing is usually a little faster than retail...)\n *\n * Returns FALSE if data source requested suspension.  In that case no\n * changes have been made to permanent state.  (Exception: some output\n * coefficients may already have been assigned.  This is harmless for\n * this module, since we'll just re-assign them on the next call.)\n */\n\nMETHODDEF(boolean)\ndecode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)\n{\n  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;\n  int blkn;\n  BITREAD_STATE_VARS;\n  savable_state state;\n\n  /* Process restart marker if needed; may have to suspend */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0)\n      if (! process_restart(cinfo))\n\treturn FALSE;\n  }\n\n  /* If we've run out of data, just leave the MCU set to zeroes.\n   * This way, we return uniform gray for the remainder of the segment.\n   */\n  if (! entropy->pub.insufficient_data) {\n\n    /* Load up working state */\n    BITREAD_LOAD_STATE(cinfo,entropy->bitstate);\n    ASSIGN_STATE(state, entropy->saved);\n\n    /* Outer loop handles each block in the MCU */\n\n    for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {\n      JBLOCKROW block = MCU_data[blkn];\n      d_derived_tbl * dctbl = entropy->dc_cur_tbls[blkn];\n      d_derived_tbl * actbl = entropy->ac_cur_tbls[blkn];\n      register int s, k, r;\n\n      /* Decode a single block's worth of coefficients */\n\n      /* Section F.2.2.1: decode the DC coefficient difference */\n      HUFF_DECODE(s, br_state, dctbl, return FALSE, label1);\n      if (s) {\n\tCHECK_BIT_BUFFER(br_state, s, return FALSE);\n\tr = GET_BITS(s);\n\ts = HUFF_EXTEND(r, s);\n      }\n\n      if (entropy->dc_needed[blkn]) {\n\t/* Convert DC difference to actual value, update last_dc_val */\n\tint ci = cinfo->MCU_membership[blkn];\n\ts += state.last_dc_val[ci];\n\tstate.last_dc_val[ci] = s;\n\t/* Output the DC coefficient (assumes jpeg_natural_order[0] = 0) */\n\t(*block)[0] = (JCOEF) s;\n      }\n\n      if (entropy->ac_needed[blkn]) {\n\n\t/* Section F.2.2.2: decode the AC coefficients */\n\t/* Since zeroes are skipped, output area must be cleared beforehand */\n\tfor (k = 1; k < DCTSIZE2; k++) {\n\t  HUFF_DECODE(s, br_state, actbl, return FALSE, label2);\n      \n\t  r = s >> 4;\n\t  s &= 15;\n      \n\t  if (s) {\n\t    k += r;\n\t    CHECK_BIT_BUFFER(br_state, s, return FALSE);\n\t    r = GET_BITS(s);\n\t    s = HUFF_EXTEND(r, s);\n\t    /* Output coefficient in natural (dezigzagged) order.\n\t     * Note: the extra entries in jpeg_natural_order[] will save us\n\t     * if k >= DCTSIZE2, which could happen if the data is corrupted.\n\t     */\n\t    (*block)[jpeg_natural_order[k]] = (JCOEF) s;\n\t  } else {\n\t    if (r != 15)\n\t      break;\n\t    k += 15;\n\t  }\n\t}\n\n      } else {\n\n\t/* Section F.2.2.2: decode the AC coefficients */\n\t/* In this path we just discard the values */\n\tfor (k = 1; k < DCTSIZE2; k++) {\n\t  HUFF_DECODE(s, br_state, actbl, return FALSE, label3);\n      \n\t  r = s >> 4;\n\t  s &= 15;\n      \n\t  if (s) {\n\t    k += r;\n\t    CHECK_BIT_BUFFER(br_state, s, return FALSE);\n\t    DROP_BITS(s);\n\t  } else {\n\t    if (r != 15)\n\t      break;\n\t    k += 15;\n\t  }\n\t}\n\n      }\n    }\n\n    /* Completed MCU, so update state */\n    BITREAD_SAVE_STATE(cinfo,entropy->bitstate);\n    ASSIGN_STATE(entropy->saved, state);\n  }\n\n  /* Account for restart interval (no-op if not using restarts) */\n  entropy->restarts_to_go--;\n\n  return TRUE;\n}\n\n\n/*\n * Module initialization routine for Huffman entropy decoding.\n */\n\nGLOBAL(void)\njinit_huff_decoder (j_decompress_ptr cinfo)\n{\n  huff_entropy_ptr entropy;\n  int i;\n\n  entropy = (huff_entropy_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(huff_entropy_decoder));\n  cinfo->entropy = (struct jpeg_entropy_decoder *) entropy;\n  entropy->pub.start_pass = start_pass_huff_decoder;\n  entropy->pub.decode_mcu = decode_mcu;\n\n  /* Mark tables unallocated */\n  for (i = 0; i < NUM_HUFF_TBLS; i++) {\n    entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;\n  }\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jdinput.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jdinput.c\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains input control logic for the JPEG decompressor.\n * These routines are concerned with controlling the decompressor's input\n * processing (marker reading and coefficient decoding).  The actual input\n * reading is done in jdmarker.c, jdhuff.c, and jdphuff.c.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Private state */\n\ntypedef struct {\n  struct jpeg_input_controller pub; /* public fields */\n\n  boolean inheaders;\t\t/* TRUE until first SOS is reached */\n} my_input_controller;\n\ntypedef my_input_controller * my_inputctl_ptr;\n\n\n/* Forward declarations */\nMETHODDEF(int) consume_markers JPP((j_decompress_ptr cinfo));\n\n\n/*\n * Routines to calculate various quantities related to the size of the image.\n */\n\nLOCAL(void)\ninitial_setup (j_decompress_ptr cinfo)\n/* Called once, when first SOS marker is reached */\n{\n  int ci;\n  jpeg_component_info *compptr;\n\n  /* Make sure image isn't bigger than I can handle */\n  if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION ||\n      (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION)\n    ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);\n\n  /* For now, precision must match compiled-in value... */\n  if (cinfo->data_precision != BITS_IN_JSAMPLE)\n    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);\n\n  /* Check that number of components won't exceed internal array sizes */\n  if (cinfo->num_components > MAX_COMPONENTS)\n    ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,\n\t     MAX_COMPONENTS);\n\n  /* Compute maximum sampling factors; check factor validity */\n  cinfo->max_h_samp_factor = 1;\n  cinfo->max_v_samp_factor = 1;\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR ||\n\tcompptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR)\n      ERREXIT(cinfo, JERR_BAD_SAMPLING);\n    cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor,\n\t\t\t\t   compptr->h_samp_factor);\n    cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor,\n\t\t\t\t   compptr->v_samp_factor);\n  }\n\n  /* We initialize DCT_scaled_size and min_DCT_scaled_size to DCTSIZE.\n   * In the full decompressor, this will be overridden by jdmaster.c;\n   * but in the transcoder, jdmaster.c is not used, so we must do it here.\n   */\n  cinfo->min_DCT_scaled_size = DCTSIZE;\n\n  /* Compute dimensions of components */\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    compptr->DCT_scaled_size = DCTSIZE;\n    /* Size in DCT blocks */\n    compptr->width_in_blocks = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,\n\t\t    (long) (cinfo->max_h_samp_factor * DCTSIZE));\n    compptr->height_in_blocks = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,\n\t\t    (long) (cinfo->max_v_samp_factor * DCTSIZE));\n    /* downsampled_width and downsampled_height will also be overridden by\n     * jdmaster.c if we are doing full decompression.  The transcoder library\n     * doesn't use these values, but the calling application might.\n     */\n    /* Size in samples */\n    compptr->downsampled_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,\n\t\t    (long) cinfo->max_h_samp_factor);\n    compptr->downsampled_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,\n\t\t    (long) cinfo->max_v_samp_factor);\n    /* Mark component needed, until color conversion says otherwise */\n    compptr->component_needed = TRUE;\n    /* Mark no quantization table yet saved for component */\n    compptr->quant_table = NULL;\n  }\n\n  /* Compute number of fully interleaved MCU rows. */\n  cinfo->total_iMCU_rows = (JDIMENSION)\n    jdiv_round_up((long) cinfo->image_height,\n\t\t  (long) (cinfo->max_v_samp_factor*DCTSIZE));\n\n  /* Decide whether file contains multiple scans */\n  if (cinfo->comps_in_scan < cinfo->num_components || cinfo->progressive_mode)\n    cinfo->inputctl->has_multiple_scans = TRUE;\n  else\n    cinfo->inputctl->has_multiple_scans = FALSE;\n}\n\n\nLOCAL(void)\nper_scan_setup (j_decompress_ptr cinfo)\n/* Do computations that are needed before processing a JPEG scan */\n/* cinfo->comps_in_scan and cinfo->cur_comp_info[] were set from SOS marker */\n{\n  int ci, mcublks, tmp;\n  jpeg_component_info *compptr;\n  \n  if (cinfo->comps_in_scan == 1) {\n    \n    /* Noninterleaved (single-component) scan */\n    compptr = cinfo->cur_comp_info[0];\n    \n    /* Overall image size in MCUs */\n    cinfo->MCUs_per_row = compptr->width_in_blocks;\n    cinfo->MCU_rows_in_scan = compptr->height_in_blocks;\n    \n    /* For noninterleaved scan, always one block per MCU */\n    compptr->MCU_width = 1;\n    compptr->MCU_height = 1;\n    compptr->MCU_blocks = 1;\n    compptr->MCU_sample_width = compptr->DCT_scaled_size;\n    compptr->last_col_width = 1;\n    /* For noninterleaved scans, it is convenient to define last_row_height\n     * as the number of block rows present in the last iMCU row.\n     */\n    tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor);\n    if (tmp == 0) tmp = compptr->v_samp_factor;\n    compptr->last_row_height = tmp;\n    \n    /* Prepare array describing MCU composition */\n    cinfo->blocks_in_MCU = 1;\n    cinfo->MCU_membership[0] = 0;\n    \n  } else {\n    \n    /* Interleaved (multi-component) scan */\n    if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN)\n      ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan,\n\t       MAX_COMPS_IN_SCAN);\n    \n    /* Overall image size in MCUs */\n    cinfo->MCUs_per_row = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width,\n\t\t    (long) (cinfo->max_h_samp_factor*DCTSIZE));\n    cinfo->MCU_rows_in_scan = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height,\n\t\t    (long) (cinfo->max_v_samp_factor*DCTSIZE));\n    \n    cinfo->blocks_in_MCU = 0;\n    \n    for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n      compptr = cinfo->cur_comp_info[ci];\n      /* Sampling factors give # of blocks of component in each MCU */\n      compptr->MCU_width = compptr->h_samp_factor;\n      compptr->MCU_height = compptr->v_samp_factor;\n      compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height;\n      compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_scaled_size;\n      /* Figure number of non-dummy blocks in last MCU column & row */\n      tmp = (int) (compptr->width_in_blocks % compptr->MCU_width);\n      if (tmp == 0) tmp = compptr->MCU_width;\n      compptr->last_col_width = tmp;\n      tmp = (int) (compptr->height_in_blocks % compptr->MCU_height);\n      if (tmp == 0) tmp = compptr->MCU_height;\n      compptr->last_row_height = tmp;\n      /* Prepare array describing MCU composition */\n      mcublks = compptr->MCU_blocks;\n      if (cinfo->blocks_in_MCU + mcublks > D_MAX_BLOCKS_IN_MCU)\n\tERREXIT(cinfo, JERR_BAD_MCU_SIZE);\n      while (mcublks-- > 0) {\n\tcinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci;\n      }\n    }\n    \n  }\n}\n\n\n/*\n * Save away a copy of the Q-table referenced by each component present\n * in the current scan, unless already saved during a prior scan.\n *\n * In a multiple-scan JPEG file, the encoder could assign different components\n * the same Q-table slot number, but change table definitions between scans\n * so that each component uses a different Q-table.  (The IJG encoder is not\n * currently capable of doing this, but other encoders might.)  Since we want\n * to be able to dequantize all the components at the end of the file, this\n * means that we have to save away the table actually used for each component.\n * We do this by copying the table at the start of the first scan containing\n * the component.\n * The JPEG spec prohibits the encoder from changing the contents of a Q-table\n * slot between scans of a component using that slot.  If the encoder does so\n * anyway, this decoder will simply use the Q-table values that were current\n * at the start of the first scan for the component.\n *\n * The decompressor output side looks only at the saved quant tables,\n * not at the current Q-table slots.\n */\n\nLOCAL(void)\nlatch_quant_tables (j_decompress_ptr cinfo)\n{\n  int ci, qtblno;\n  jpeg_component_info *compptr;\n  JQUANT_TBL * qtbl;\n\n  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n    compptr = cinfo->cur_comp_info[ci];\n    /* No work if we already saved Q-table for this component */\n    if (compptr->quant_table != NULL)\n      continue;\n    /* Make sure specified quantization table is present */\n    qtblno = compptr->quant_tbl_no;\n    if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS ||\n\tcinfo->quant_tbl_ptrs[qtblno] == NULL)\n      ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);\n    /* OK, save away the quantization table */\n    qtbl = (JQUANT_TBL *)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  SIZEOF(JQUANT_TBL));\n    MEMCOPY(qtbl, cinfo->quant_tbl_ptrs[qtblno], SIZEOF(JQUANT_TBL));\n    compptr->quant_table = qtbl;\n  }\n}\n\n\n/*\n * Initialize the input modules to read a scan of compressed data.\n * The first call to this is done by jdmaster.c after initializing\n * the entire decompressor (during jpeg_start_decompress).\n * Subsequent calls come from consume_markers, below.\n */\n\nMETHODDEF(void)\nstart_input_pass (j_decompress_ptr cinfo)\n{\n  per_scan_setup(cinfo);\n  latch_quant_tables(cinfo);\n  (*cinfo->entropy->start_pass) (cinfo);\n  (*cinfo->coef->start_input_pass) (cinfo);\n  cinfo->inputctl->consume_input = cinfo->coef->consume_data;\n}\n\n\n/*\n * Finish up after inputting a compressed-data scan.\n * This is called by the coefficient controller after it's read all\n * the expected data of the scan.\n */\n\nMETHODDEF(void)\nfinish_input_pass (j_decompress_ptr cinfo)\n{\n  cinfo->inputctl->consume_input = consume_markers;\n}\n\n\n/*\n * Read JPEG markers before, between, or after compressed-data scans.\n * Change state as necessary when a new scan is reached.\n * Return value is JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.\n *\n * The consume_input method pointer points either here or to the\n * coefficient controller's consume_data routine, depending on whether\n * we are reading a compressed data segment or inter-segment markers.\n */\n\nMETHODDEF(int)\nconsume_markers (j_decompress_ptr cinfo)\n{\n  my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl;\n  int val;\n\n  if (inputctl->pub.eoi_reached) /* After hitting EOI, read no further */\n    return JPEG_REACHED_EOI;\n\n  val = (*cinfo->marker->read_markers) (cinfo);\n\n  switch (val) {\n  case JPEG_REACHED_SOS:\t/* Found SOS */\n    if (inputctl->inheaders) {\t/* 1st SOS */\n      initial_setup(cinfo);\n      inputctl->inheaders = FALSE;\n      /* Note: start_input_pass must be called by jdmaster.c\n       * before any more input can be consumed.  jdapimin.c is\n       * responsible for enforcing this sequencing.\n       */\n    } else {\t\t\t/* 2nd or later SOS marker */\n      if (! inputctl->pub.has_multiple_scans)\n\tERREXIT(cinfo, JERR_EOI_EXPECTED); /* Oops, I wasn't expecting this! */\n      start_input_pass(cinfo);\n    }\n    break;\n  case JPEG_REACHED_EOI:\t/* Found EOI */\n    inputctl->pub.eoi_reached = TRUE;\n    if (inputctl->inheaders) {\t/* Tables-only datastream, apparently */\n      if (cinfo->marker->saw_SOF)\n\tERREXIT(cinfo, JERR_SOF_NO_SOS);\n    } else {\n      /* Prevent infinite loop in coef ctlr's decompress_data routine\n       * if user set output_scan_number larger than number of scans.\n       */\n      if (cinfo->output_scan_number > cinfo->input_scan_number)\n\tcinfo->output_scan_number = cinfo->input_scan_number;\n    }\n    break;\n  case JPEG_SUSPENDED:\n    break;\n  }\n\n  return val;\n}\n\n\n/*\n * Reset state to begin a fresh datastream.\n */\n\nMETHODDEF(void)\nreset_input_controller (j_decompress_ptr cinfo)\n{\n  my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl;\n\n  inputctl->pub.consume_input = consume_markers;\n  inputctl->pub.has_multiple_scans = FALSE; /* \"unknown\" would be better */\n  inputctl->pub.eoi_reached = FALSE;\n  inputctl->inheaders = TRUE;\n  /* Reset other modules */\n  (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);\n  (*cinfo->marker->reset_marker_reader) (cinfo);\n  /* Reset progression state -- would be cleaner if entropy decoder did this */\n  cinfo->coef_bits = NULL;\n}\n\n\n/*\n * Initialize the input controller module.\n * This is called only once, when the decompression object is created.\n */\n\nGLOBAL(void)\njinit_input_controller (j_decompress_ptr cinfo)\n{\n  my_inputctl_ptr inputctl;\n\n  /* Create subobject in permanent pool */\n  inputctl = (my_inputctl_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,\n\t\t\t\tSIZEOF(my_input_controller));\n  cinfo->inputctl = (struct jpeg_input_controller *) inputctl;\n  /* Initialize method pointers */\n  inputctl->pub.consume_input = consume_markers;\n  inputctl->pub.reset_input_controller = reset_input_controller;\n  inputctl->pub.start_input_pass = start_input_pass;\n  inputctl->pub.finish_input_pass = finish_input_pass;\n  /* Initialize state: can't use reset_input_controller since we don't\n   * want to try to reset other modules yet.\n   */\n  inputctl->pub.has_multiple_scans = FALSE; /* \"unknown\" would be better */\n  inputctl->pub.eoi_reached = FALSE;\n  inputctl->inheaders = TRUE;\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jdmainct.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jdmainct.c\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains the main buffer controller for decompression.\n * The main buffer lies between the JPEG decompressor proper and the\n * post-processor; it holds downsampled data in the JPEG colorspace.\n *\n * Note that this code is bypassed in raw-data mode, since the application\n * supplies the equivalent of the main buffer in that case.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/*\n * In the current system design, the main buffer need never be a full-image\n * buffer; any full-height buffers will be found inside the coefficient or\n * postprocessing controllers.  Nonetheless, the main controller is not\n * trivial.  Its responsibility is to provide context rows for upsampling/\n * rescaling, and doing this in an efficient fashion is a bit tricky.\n *\n * Postprocessor input data is counted in \"row groups\".  A row group\n * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size)\n * sample rows of each component.  (We require DCT_scaled_size values to be\n * chosen such that these numbers are integers.  In practice DCT_scaled_size\n * values will likely be powers of two, so we actually have the stronger\n * condition that DCT_scaled_size / min_DCT_scaled_size is an integer.)\n * Upsampling will typically produce max_v_samp_factor pixel rows from each\n * row group (times any additional scale factor that the upsampler is\n * applying).\n *\n * The coefficient controller will deliver data to us one iMCU row at a time;\n * each iMCU row contains v_samp_factor * DCT_scaled_size sample rows, or\n * exactly min_DCT_scaled_size row groups.  (This amount of data corresponds\n * to one row of MCUs when the image is fully interleaved.)  Note that the\n * number of sample rows varies across components, but the number of row\n * groups does not.  Some garbage sample rows may be included in the last iMCU\n * row at the bottom of the image.\n *\n * Depending on the vertical scaling algorithm used, the upsampler may need\n * access to the sample row(s) above and below its current input row group.\n * The upsampler is required to set need_context_rows TRUE at global selection\n * time if so.  When need_context_rows is FALSE, this controller can simply\n * obtain one iMCU row at a time from the coefficient controller and dole it\n * out as row groups to the postprocessor.\n *\n * When need_context_rows is TRUE, this controller guarantees that the buffer\n * passed to postprocessing contains at least one row group's worth of samples\n * above and below the row group(s) being processed.  Note that the context\n * rows \"above\" the first passed row group appear at negative row offsets in\n * the passed buffer.  At the top and bottom of the image, the required\n * context rows are manufactured by duplicating the first or last real sample\n * row; this avoids having special cases in the upsampling inner loops.\n *\n * The amount of context is fixed at one row group just because that's a\n * convenient number for this controller to work with.  The existing\n * upsamplers really only need one sample row of context.  An upsampler\n * supporting arbitrary output rescaling might wish for more than one row\n * group of context when shrinking the image; tough, we don't handle that.\n * (This is justified by the assumption that downsizing will be handled mostly\n * by adjusting the DCT_scaled_size values, so that the actual scale factor at\n * the upsample step needn't be much less than one.)\n *\n * To provide the desired context, we have to retain the last two row groups\n * of one iMCU row while reading in the next iMCU row.  (The last row group\n * can't be processed until we have another row group for its below-context,\n * and so we have to save the next-to-last group too for its above-context.)\n * We could do this most simply by copying data around in our buffer, but\n * that'd be very slow.  We can avoid copying any data by creating a rather\n * strange pointer structure.  Here's how it works.  We allocate a workspace\n * consisting of M+2 row groups (where M = min_DCT_scaled_size is the number\n * of row groups per iMCU row).  We create two sets of redundant pointers to\n * the workspace.  Labeling the physical row groups 0 to M+1, the synthesized\n * pointer lists look like this:\n *                   M+1                          M-1\n * master pointer --> 0         master pointer --> 0\n *                    1                            1\n *                   ...                          ...\n *                   M-3                          M-3\n *                   M-2                           M\n *                   M-1                          M+1\n *                    M                           M-2\n *                   M+1                          M-1\n *                    0                            0\n * We read alternate iMCU rows using each master pointer; thus the last two\n * row groups of the previous iMCU row remain un-overwritten in the workspace.\n * The pointer lists are set up so that the required context rows appear to\n * be adjacent to the proper places when we pass the pointer lists to the\n * upsampler.\n *\n * The above pictures describe the normal state of the pointer lists.\n * At top and bottom of the image, we diddle the pointer lists to duplicate\n * the first or last sample row as necessary (this is cheaper than copying\n * sample rows around).\n *\n * This scheme breaks down if M < 2, ie, min_DCT_scaled_size is 1.  In that\n * situation each iMCU row provides only one row group so the buffering logic\n * must be different (eg, we must read two iMCU rows before we can emit the\n * first row group).  For now, we simply do not support providing context\n * rows when min_DCT_scaled_size is 1.  That combination seems unlikely to\n * be worth providing --- if someone wants a 1/8th-size preview, they probably\n * want it quick and dirty, so a context-free upsampler is sufficient.\n */\n\n\n/* Private buffer controller object */\n\ntypedef struct {\n  struct jpeg_d_main_controller pub; /* public fields */\n\n  /* Pointer to allocated workspace (M or M+2 row groups). */\n  JSAMPARRAY buffer[MAX_COMPONENTS];\n\n  boolean buffer_full;\t\t/* Have we gotten an iMCU row from decoder? */\n  JDIMENSION rowgroup_ctr;\t/* counts row groups output to postprocessor */\n\n  /* Remaining fields are only used in the context case. */\n\n  /* These are the master pointers to the funny-order pointer lists. */\n  JSAMPIMAGE xbuffer[2];\t/* pointers to weird pointer lists */\n\n  int whichptr;\t\t\t/* indicates which pointer set is now in use */\n  int context_state;\t\t/* process_data state machine status */\n  JDIMENSION rowgroups_avail;\t/* row groups available to postprocessor */\n  JDIMENSION iMCU_row_ctr;\t/* counts iMCU rows to detect image top/bot */\n} my_main_controller;\n\ntypedef my_main_controller * my_main_ptr;\n\n/* context_state values: */\n#define CTX_PREPARE_FOR_IMCU\t0\t/* need to prepare for MCU row */\n#define CTX_PROCESS_IMCU\t1\t/* feeding iMCU to postprocessor */\n#define CTX_POSTPONED_ROW\t2\t/* feeding postponed row group */\n\n\n/* Forward declarations */\nMETHODDEF(void) process_data_simple_main\n\tJPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,\n\t     JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));\nMETHODDEF(void) process_data_context_main\n\tJPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,\n\t     JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));\n#ifdef QUANT_2PASS_SUPPORTED\nMETHODDEF(void) process_data_crank_post\n\tJPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,\n\t     JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));\n#endif\n\n\nLOCAL(void)\nalloc_funny_pointers (j_decompress_ptr cinfo)\n/* Allocate space for the funny pointer lists.\n * This is done only once, not once per pass.\n */\n{\n  my_main_ptr main = (my_main_ptr) cinfo->main;\n  int ci, rgroup;\n  int M = cinfo->min_DCT_scaled_size;\n  jpeg_component_info *compptr;\n  JSAMPARRAY xbuf;\n\n  /* Get top-level space for component array pointers.\n   * We alloc both arrays with one call to save a few cycles.\n   */\n  main->xbuffer[0] = (JSAMPIMAGE)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tcinfo->num_components * 2 * SIZEOF(JSAMPARRAY));\n  main->xbuffer[1] = main->xbuffer[0] + cinfo->num_components;\n\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /\n      cinfo->min_DCT_scaled_size; /* height of a row group of component */\n    /* Get space for pointer lists --- M+4 row groups in each list.\n     * We alloc both pointer lists with one call to save a few cycles.\n     */\n    xbuf = (JSAMPARRAY)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  2 * (rgroup * (M + 4)) * SIZEOF(JSAMPROW));\n    xbuf += rgroup;\t\t/* want one row group at negative offsets */\n    main->xbuffer[0][ci] = xbuf;\n    xbuf += rgroup * (M + 4);\n    main->xbuffer[1][ci] = xbuf;\n  }\n}\n\n\nLOCAL(void)\nmake_funny_pointers (j_decompress_ptr cinfo)\n/* Create the funny pointer lists discussed in the comments above.\n * The actual workspace is already allocated (in main->buffer),\n * and the space for the pointer lists is allocated too.\n * This routine just fills in the curiously ordered lists.\n * This will be repeated at the beginning of each pass.\n */\n{\n  my_main_ptr main = (my_main_ptr) cinfo->main;\n  int ci, i, rgroup;\n  int M = cinfo->min_DCT_scaled_size;\n  jpeg_component_info *compptr;\n  JSAMPARRAY buf, xbuf0, xbuf1;\n\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /\n      cinfo->min_DCT_scaled_size; /* height of a row group of component */\n    xbuf0 = main->xbuffer[0][ci];\n    xbuf1 = main->xbuffer[1][ci];\n    /* First copy the workspace pointers as-is */\n    buf = main->buffer[ci];\n    for (i = 0; i < rgroup * (M + 2); i++) {\n      xbuf0[i] = xbuf1[i] = buf[i];\n    }\n    /* In the second list, put the last four row groups in swapped order */\n    for (i = 0; i < rgroup * 2; i++) {\n      xbuf1[rgroup*(M-2) + i] = buf[rgroup*M + i];\n      xbuf1[rgroup*M + i] = buf[rgroup*(M-2) + i];\n    }\n    /* The wraparound pointers at top and bottom will be filled later\n     * (see set_wraparound_pointers, below).  Initially we want the \"above\"\n     * pointers to duplicate the first actual data line.  This only needs\n     * to happen in xbuffer[0].\n     */\n    for (i = 0; i < rgroup; i++) {\n      xbuf0[i - rgroup] = xbuf0[0];\n    }\n  }\n}\n\n\nLOCAL(void)\nset_wraparound_pointers (j_decompress_ptr cinfo)\n/* Set up the \"wraparound\" pointers at top and bottom of the pointer lists.\n * This changes the pointer list state from top-of-image to the normal state.\n */\n{\n  my_main_ptr main = (my_main_ptr) cinfo->main;\n  int ci, i, rgroup;\n  int M = cinfo->min_DCT_scaled_size;\n  jpeg_component_info *compptr;\n  JSAMPARRAY xbuf0, xbuf1;\n\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /\n      cinfo->min_DCT_scaled_size; /* height of a row group of component */\n    xbuf0 = main->xbuffer[0][ci];\n    xbuf1 = main->xbuffer[1][ci];\n    for (i = 0; i < rgroup; i++) {\n      xbuf0[i - rgroup] = xbuf0[rgroup*(M+1) + i];\n      xbuf1[i - rgroup] = xbuf1[rgroup*(M+1) + i];\n      xbuf0[rgroup*(M+2) + i] = xbuf0[i];\n      xbuf1[rgroup*(M+2) + i] = xbuf1[i];\n    }\n  }\n}\n\n\nLOCAL(void)\nset_bottom_pointers (j_decompress_ptr cinfo)\n/* Change the pointer lists to duplicate the last sample row at the bottom\n * of the image.  whichptr indicates which xbuffer holds the final iMCU row.\n * Also sets rowgroups_avail to indicate number of nondummy row groups in row.\n */\n{\n  my_main_ptr main = (my_main_ptr) cinfo->main;\n  int ci, i, rgroup, iMCUheight, rows_left;\n  jpeg_component_info *compptr;\n  JSAMPARRAY xbuf;\n\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    /* Count sample rows in one iMCU row and in one row group */\n    iMCUheight = compptr->v_samp_factor * compptr->DCT_scaled_size;\n    rgroup = iMCUheight / cinfo->min_DCT_scaled_size;\n    /* Count nondummy sample rows remaining for this component */\n    rows_left = (int) (compptr->downsampled_height % (JDIMENSION) iMCUheight);\n    if (rows_left == 0) rows_left = iMCUheight;\n    /* Count nondummy row groups.  Should get same answer for each component,\n     * so we need only do it once.\n     */\n    if (ci == 0) {\n      main->rowgroups_avail = (JDIMENSION) ((rows_left-1) / rgroup + 1);\n    }\n    /* Duplicate the last real sample row rgroup*2 times; this pads out the\n     * last partial rowgroup and ensures at least one full rowgroup of context.\n     */\n    xbuf = main->xbuffer[main->whichptr][ci];\n    for (i = 0; i < rgroup * 2; i++) {\n      xbuf[rows_left + i] = xbuf[rows_left-1];\n    }\n  }\n}\n\n\n/*\n * Initialize for a processing pass.\n */\n\nMETHODDEF(void)\nstart_pass_main (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)\n{\n  my_main_ptr main = (my_main_ptr) cinfo->main;\n\n  switch (pass_mode) {\n  case JBUF_PASS_THRU:\n    if (cinfo->upsample->need_context_rows) {\n      main->pub.process_data = process_data_context_main;\n      make_funny_pointers(cinfo); /* Create the xbuffer[] lists */\n      main->whichptr = 0;\t/* Read first iMCU row into xbuffer[0] */\n      main->context_state = CTX_PREPARE_FOR_IMCU;\n      main->iMCU_row_ctr = 0;\n    } else {\n      /* Simple case with no context needed */\n      main->pub.process_data = process_data_simple_main;\n    }\n    main->buffer_full = FALSE;\t/* Mark buffer empty */\n    main->rowgroup_ctr = 0;\n    break;\n#ifdef QUANT_2PASS_SUPPORTED\n  case JBUF_CRANK_DEST:\n    /* For last pass of 2-pass quantization, just crank the postprocessor */\n    main->pub.process_data = process_data_crank_post;\n    break;\n#endif\n  default:\n    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n    break;\n  }\n}\n\n\n/*\n * Process some data.\n * This handles the simple case where no context is required.\n */\n\nMETHODDEF(void)\nprocess_data_simple_main (j_decompress_ptr cinfo,\n\t\t\t  JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t\t\t  JDIMENSION out_rows_avail)\n{\n  my_main_ptr main = (my_main_ptr) cinfo->main;\n  JDIMENSION rowgroups_avail;\n\n  /* Read input data if we haven't filled the main buffer yet */\n  if (! main->buffer_full) {\n    if (! (*cinfo->coef->decompress_data) (cinfo, main->buffer))\n      return;\t\t\t/* suspension forced, can do nothing more */\n    main->buffer_full = TRUE;\t/* OK, we have an iMCU row to work with */\n  }\n\n  /* There are always min_DCT_scaled_size row groups in an iMCU row. */\n  rowgroups_avail = (JDIMENSION) cinfo->min_DCT_scaled_size;\n  /* Note: at the bottom of the image, we may pass extra garbage row groups\n   * to the postprocessor.  The postprocessor has to check for bottom\n   * of image anyway (at row resolution), so no point in us doing it too.\n   */\n\n  /* Feed the postprocessor */\n  (*cinfo->post->post_process_data) (cinfo, main->buffer,\n\t\t\t\t     &main->rowgroup_ctr, rowgroups_avail,\n\t\t\t\t     output_buf, out_row_ctr, out_rows_avail);\n\n  /* Has postprocessor consumed all the data yet? If so, mark buffer empty */\n  if (main->rowgroup_ctr >= rowgroups_avail) {\n    main->buffer_full = FALSE;\n    main->rowgroup_ctr = 0;\n  }\n}\n\n\n/*\n * Process some data.\n * This handles the case where context rows must be provided.\n */\n\nMETHODDEF(void)\nprocess_data_context_main (j_decompress_ptr cinfo,\n\t\t\t   JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t\t\t   JDIMENSION out_rows_avail)\n{\n  my_main_ptr main = (my_main_ptr) cinfo->main;\n\n  /* Read input data if we haven't filled the main buffer yet */\n  if (! main->buffer_full) {\n    if (! (*cinfo->coef->decompress_data) (cinfo,\n\t\t\t\t\t   main->xbuffer[main->whichptr]))\n      return;\t\t\t/* suspension forced, can do nothing more */\n    main->buffer_full = TRUE;\t/* OK, we have an iMCU row to work with */\n    main->iMCU_row_ctr++;\t/* count rows received */\n  }\n\n  /* Postprocessor typically will not swallow all the input data it is handed\n   * in one call (due to filling the output buffer first).  Must be prepared\n   * to exit and restart.  This switch lets us keep track of how far we got.\n   * Note that each case falls through to the next on successful completion.\n   */\n  switch (main->context_state) {\n  case CTX_POSTPONED_ROW:\n    /* Call postprocessor using previously set pointers for postponed row */\n    (*cinfo->post->post_process_data) (cinfo, main->xbuffer[main->whichptr],\n\t\t\t&main->rowgroup_ctr, main->rowgroups_avail,\n\t\t\toutput_buf, out_row_ctr, out_rows_avail);\n    if (main->rowgroup_ctr < main->rowgroups_avail)\n      return;\t\t\t/* Need to suspend */\n    main->context_state = CTX_PREPARE_FOR_IMCU;\n    if (*out_row_ctr >= out_rows_avail)\n      return;\t\t\t/* Postprocessor exactly filled output buf */\n    /*FALLTHROUGH*/\n  case CTX_PREPARE_FOR_IMCU:\n    /* Prepare to process first M-1 row groups of this iMCU row */\n    main->rowgroup_ctr = 0;\n    main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size - 1);\n    /* Check for bottom of image: if so, tweak pointers to \"duplicate\"\n     * the last sample row, and adjust rowgroups_avail to ignore padding rows.\n     */\n    if (main->iMCU_row_ctr == cinfo->total_iMCU_rows)\n      set_bottom_pointers(cinfo);\n    main->context_state = CTX_PROCESS_IMCU;\n    /*FALLTHROUGH*/\n  case CTX_PROCESS_IMCU:\n    /* Call postprocessor using previously set pointers */\n    (*cinfo->post->post_process_data) (cinfo, main->xbuffer[main->whichptr],\n\t\t\t&main->rowgroup_ctr, main->rowgroups_avail,\n\t\t\toutput_buf, out_row_ctr, out_rows_avail);\n    if (main->rowgroup_ctr < main->rowgroups_avail)\n      return;\t\t\t/* Need to suspend */\n    /* After the first iMCU, change wraparound pointers to normal state */\n    if (main->iMCU_row_ctr == 1)\n      set_wraparound_pointers(cinfo);\n    /* Prepare to load new iMCU row using other xbuffer list */\n    main->whichptr ^= 1;\t/* 0=>1 or 1=>0 */\n    main->buffer_full = FALSE;\n    /* Still need to process last row group of this iMCU row, */\n    /* which is saved at index M+1 of the other xbuffer */\n    main->rowgroup_ctr = (JDIMENSION) (cinfo->min_DCT_scaled_size + 1);\n    main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size + 2);\n    main->context_state = CTX_POSTPONED_ROW;\n  }\n}\n\n\n/*\n * Process some data.\n * Final pass of two-pass quantization: just call the postprocessor.\n * Source data will be the postprocessor controller's internal buffer.\n */\n\n#ifdef QUANT_2PASS_SUPPORTED\n\nMETHODDEF(void)\nprocess_data_crank_post (j_decompress_ptr cinfo,\n\t\t\t JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t\t\t JDIMENSION out_rows_avail)\n{\n  (*cinfo->post->post_process_data) (cinfo, (JSAMPIMAGE) NULL,\n\t\t\t\t     (JDIMENSION *) NULL, (JDIMENSION) 0,\n\t\t\t\t     output_buf, out_row_ctr, out_rows_avail);\n}\n\n#endif /* QUANT_2PASS_SUPPORTED */\n\n\n/*\n * Initialize main buffer controller.\n */\n\nGLOBAL(void)\njinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer)\n{\n  my_main_ptr main;\n  int ci, rgroup, ngroups;\n  jpeg_component_info *compptr;\n\n  main = (my_main_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_main_controller));\n  cinfo->main = (struct jpeg_d_main_controller *) main;\n  main->pub.start_pass = start_pass_main;\n\n  if (need_full_buffer)\t\t/* shouldn't happen */\n    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n\n  /* Allocate the workspace.\n   * ngroups is the number of row groups we need.\n   */\n  if (cinfo->upsample->need_context_rows) {\n    if (cinfo->min_DCT_scaled_size < 2) /* unsupported, see comments above */\n      ERREXIT(cinfo, JERR_NOTIMPL);\n    alloc_funny_pointers(cinfo); /* Alloc space for xbuffer[] lists */\n    ngroups = cinfo->min_DCT_scaled_size + 2;\n  } else {\n    ngroups = cinfo->min_DCT_scaled_size;\n  }\n\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /\n      cinfo->min_DCT_scaled_size; /* height of a row group of component */\n    main->buffer[ci] = (*cinfo->mem->alloc_sarray)\n\t\t\t((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t compptr->width_in_blocks * compptr->DCT_scaled_size,\n\t\t\t (JDIMENSION) (rgroup * ngroups));\n  }\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jdmarker.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jdmarker.c\n *\n * Copyright (C) 1991-1998, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains routines to decode JPEG datastream markers.\n * Most of the complexity arises from our desire to support input\n * suspension: if not all of the data for a marker is available,\n * we must exit back to the application.  On resumption, we reprocess\n * the marker.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\ntypedef enum {\t\t\t/* JPEG marker codes */\n  M_SOF0  = 0xc0,\n  M_SOF1  = 0xc1,\n  M_SOF2  = 0xc2,\n  M_SOF3  = 0xc3,\n  \n  M_SOF5  = 0xc5,\n  M_SOF6  = 0xc6,\n  M_SOF7  = 0xc7,\n  \n  M_JPG   = 0xc8,\n  M_SOF9  = 0xc9,\n  M_SOF10 = 0xca,\n  M_SOF11 = 0xcb,\n  \n  M_SOF13 = 0xcd,\n  M_SOF14 = 0xce,\n  M_SOF15 = 0xcf,\n  \n  M_DHT   = 0xc4,\n  \n  M_DAC   = 0xcc,\n  \n  M_RST0  = 0xd0,\n  M_RST1  = 0xd1,\n  M_RST2  = 0xd2,\n  M_RST3  = 0xd3,\n  M_RST4  = 0xd4,\n  M_RST5  = 0xd5,\n  M_RST6  = 0xd6,\n  M_RST7  = 0xd7,\n  \n  M_SOI   = 0xd8,\n  M_EOI   = 0xd9,\n  M_SOS   = 0xda,\n  M_DQT   = 0xdb,\n  M_DNL   = 0xdc,\n  M_DRI   = 0xdd,\n  M_DHP   = 0xde,\n  M_EXP   = 0xdf,\n  \n  M_APP0  = 0xe0,\n  M_APP1  = 0xe1,\n  M_APP2  = 0xe2,\n  M_APP3  = 0xe3,\n  M_APP4  = 0xe4,\n  M_APP5  = 0xe5,\n  M_APP6  = 0xe6,\n  M_APP7  = 0xe7,\n  M_APP8  = 0xe8,\n  M_APP9  = 0xe9,\n  M_APP10 = 0xea,\n  M_APP11 = 0xeb,\n  M_APP12 = 0xec,\n  M_APP13 = 0xed,\n  M_APP14 = 0xee,\n  M_APP15 = 0xef,\n  \n  M_JPG0  = 0xf0,\n  M_JPG13 = 0xfd,\n  M_COM   = 0xfe,\n  \n  M_TEM   = 0x01,\n  \n  M_ERROR = 0x100\n} JPEG_MARKER;\n\n\n/* Private state */\n\ntypedef struct {\n  struct jpeg_marker_reader pub; /* public fields */\n\n  /* Application-overridable marker processing methods */\n  jpeg_marker_parser_method process_COM;\n  jpeg_marker_parser_method process_APPn[16];\n\n  /* Limit on marker data length to save for each marker type */\n  unsigned int length_limit_COM;\n  unsigned int length_limit_APPn[16];\n\n  /* Status of COM/APPn marker saving */\n  jpeg_saved_marker_ptr cur_marker;\t/* NULL if not processing a marker */\n  unsigned int bytes_read;\t\t/* data bytes read so far in marker */\n  /* Note: cur_marker is not linked into marker_list until it's all read. */\n} my_marker_reader;\n\ntypedef my_marker_reader * my_marker_ptr;\n\n\n/*\n * Macros for fetching data from the data source module.\n *\n * At all times, cinfo->src->next_input_byte and ->bytes_in_buffer reflect\n * the current restart point; we update them only when we have reached a\n * suitable place to restart if a suspension occurs.\n */\n\n/* Declare and initialize local copies of input pointer/count */\n#define INPUT_VARS(cinfo)  \\\n\tstruct jpeg_source_mgr * datasrc = (cinfo)->src;  \\\n\tconst JOCTET * next_input_byte = datasrc->next_input_byte;  \\\n\tsize_t bytes_in_buffer = datasrc->bytes_in_buffer\n\n/* Unload the local copies --- do this only at a restart boundary */\n#define INPUT_SYNC(cinfo)  \\\n\t( datasrc->next_input_byte = next_input_byte,  \\\n\t  datasrc->bytes_in_buffer = bytes_in_buffer )\n\n/* Reload the local copies --- used only in MAKE_BYTE_AVAIL */\n#define INPUT_RELOAD(cinfo)  \\\n\t( next_input_byte = datasrc->next_input_byte,  \\\n\t  bytes_in_buffer = datasrc->bytes_in_buffer )\n\n/* Internal macro for INPUT_BYTE and INPUT_2BYTES: make a byte available.\n * Note we do *not* do INPUT_SYNC before calling fill_input_buffer,\n * but we must reload the local copies after a successful fill.\n */\n#define MAKE_BYTE_AVAIL(cinfo,action)  \\\n\tif (bytes_in_buffer == 0) {  \\\n\t  if (! (*datasrc->fill_input_buffer) (cinfo))  \\\n\t    { action; }  \\\n\t  INPUT_RELOAD(cinfo);  \\\n\t}\n\n/* Read a byte into variable V.\n * If must suspend, take the specified action (typically \"return FALSE\").\n */\n#define INPUT_BYTE(cinfo,V,action)  \\\n\tMAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \\\n\t\t  bytes_in_buffer--; \\\n\t\t  V = GETJOCTET(*next_input_byte++); )\n\n/* As above, but read two bytes interpreted as an unsigned 16-bit integer.\n * V should be declared unsigned int or perhaps INT32.\n */\n#define INPUT_2BYTES(cinfo,V,action)  \\\n\tMAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \\\n\t\t  bytes_in_buffer--; \\\n\t\t  V = ((unsigned int) GETJOCTET(*next_input_byte++)) << 8; \\\n\t\t  MAKE_BYTE_AVAIL(cinfo,action); \\\n\t\t  bytes_in_buffer--; \\\n\t\t  V += GETJOCTET(*next_input_byte++); )\n\n\n/*\n * Routines to process JPEG markers.\n *\n * Entry condition: JPEG marker itself has been read and its code saved\n *   in cinfo->unread_marker; input restart point is just after the marker.\n *\n * Exit: if return TRUE, have read and processed any parameters, and have\n *   updated the restart point to point after the parameters.\n *   If return FALSE, was forced to suspend before reaching end of\n *   marker parameters; restart point has not been moved.  Same routine\n *   will be called again after application supplies more input data.\n *\n * This approach to suspension assumes that all of a marker's parameters\n * can fit into a single input bufferload.  This should hold for \"normal\"\n * markers.  Some COM/APPn markers might have large parameter segments\n * that might not fit.  If we are simply dropping such a marker, we use\n * skip_input_data to get past it, and thereby put the problem on the\n * source manager's shoulders.  If we are saving the marker's contents\n * into memory, we use a slightly different convention: when forced to\n * suspend, the marker processor updates the restart point to the end of\n * what it's consumed (ie, the end of the buffer) before returning FALSE.\n * On resumption, cinfo->unread_marker still contains the marker code,\n * but the data source will point to the next chunk of marker data.\n * The marker processor must retain internal state to deal with this.\n *\n * Note that we don't bother to avoid duplicate trace messages if a\n * suspension occurs within marker parameters.  Other side effects\n * require more care.\n */\n\n\nLOCAL(boolean)\nget_soi (j_decompress_ptr cinfo)\n/* Process an SOI marker */\n{\n  int i;\n  \n  TRACEMS(cinfo, 1, JTRC_SOI);\n\n  if (cinfo->marker->saw_SOI)\n    ERREXIT(cinfo, JERR_SOI_DUPLICATE);\n\n  /* Reset all parameters that are defined to be reset by SOI */\n\n  for (i = 0; i < NUM_ARITH_TBLS; i++) {\n    cinfo->arith_dc_L[i] = 0;\n    cinfo->arith_dc_U[i] = 1;\n    cinfo->arith_ac_K[i] = 5;\n  }\n  cinfo->restart_interval = 0;\n\n  /* Set initial assumptions for colorspace etc */\n\n  cinfo->jpeg_color_space = JCS_UNKNOWN;\n  cinfo->CCIR601_sampling = FALSE; /* Assume non-CCIR sampling??? */\n\n  cinfo->saw_JFIF_marker = FALSE;\n  cinfo->JFIF_major_version = 1; /* set default JFIF APP0 values */\n  cinfo->JFIF_minor_version = 1;\n  cinfo->density_unit = 0;\n  cinfo->X_density = 1;\n  cinfo->Y_density = 1;\n  cinfo->saw_Adobe_marker = FALSE;\n  cinfo->Adobe_transform = 0;\n\n  cinfo->marker->saw_SOI = TRUE;\n\n  return TRUE;\n}\n\n\nLOCAL(boolean)\nget_sof (j_decompress_ptr cinfo, boolean is_prog, boolean is_arith)\n/* Process a SOFn marker */\n{\n  INT32 length;\n  int c, ci;\n  jpeg_component_info * compptr;\n  /* LiuSunliang added 20111209 */\n  JDIMENSION image_width, image_height;\n  INPUT_VARS(cinfo);\n\n  cinfo->progressive_mode = is_prog;\n  cinfo->arith_code = is_arith;\n\n  INPUT_2BYTES(cinfo, length, return FALSE);\n\n  INPUT_BYTE(cinfo, cinfo->data_precision, return FALSE);\n  INPUT_2BYTES(cinfo, image_height, return FALSE);\n  INPUT_2BYTES(cinfo, image_width, return FALSE);\n  INPUT_BYTE(cinfo, cinfo->num_components, return FALSE);\n\n  if (image_width <= JPEG_MAX_DIMENSION)\n\t  cinfo->image_width = image_width;\n \n  if (image_height <= JPEG_MAX_DIMENSION)\n\t  cinfo->image_height = image_height;\n\n  length -= 8;\n\n  TRACEMS4(cinfo, 1, JTRC_SOF, cinfo->unread_marker,\n\t   (int) cinfo->image_width, (int) cinfo->image_height,\n\t   cinfo->num_components);\n\n  if (cinfo->marker->saw_SOF)\n    ERREXIT(cinfo, JERR_SOF_DUPLICATE);\n\n  /* We don't support files in which the image height is initially specified */\n  /* as 0 and is later redefined by DNL.  As long as we have to check that,  */\n  /* might as well have a general sanity check. */\n  if (cinfo->image_height <= 0 || cinfo->image_width <= 0\n      || cinfo->num_components <= 0)\n    ERREXIT(cinfo, JERR_EMPTY_IMAGE);\n\n  if (length != (cinfo->num_components * 3))\n    ERREXIT(cinfo, JERR_BAD_LENGTH);\n\n  if (cinfo->comp_info == NULL)\t/* do only once, even if suspend */\n    cinfo->comp_info = (jpeg_component_info *) (*cinfo->mem->alloc_small)\n\t\t\t((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t cinfo->num_components * SIZEOF(jpeg_component_info));\n  \n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    compptr->component_index = ci;\n    INPUT_BYTE(cinfo, compptr->component_id, return FALSE);\n\t/* XYQ 2008-03-25: Adobe CMYK JPEG has serious flaw: the K channel has same component id as C channel */\n\t{\n\t\tint i;\n\t\tfor (i = 0; i < ci; i ++)\n\t\t\tif (compptr->component_id == cinfo->comp_info[i].component_id) break;\n\t\tif (i < ci)\n\t\t\t/* Found the error! We replace the id with something unlikely used elsewhere */\n\t\t\tcompptr->component_id += 0xf0;\n\t}\n\t/* end of modification */\n    INPUT_BYTE(cinfo, c, return FALSE);\n    compptr->h_samp_factor = (c >> 4) & 15;\n    compptr->v_samp_factor = (c     ) & 15;\n    INPUT_BYTE(cinfo, compptr->quant_tbl_no, return FALSE);\n\n    TRACEMS4(cinfo, 1, JTRC_SOF_COMPONENT,\n\t     compptr->component_id, compptr->h_samp_factor,\n\t     compptr->v_samp_factor, compptr->quant_tbl_no);\n  }\n\n  cinfo->marker->saw_SOF = TRUE;\n\n  INPUT_SYNC(cinfo);\n  return TRUE;\n}\n\n\nLOCAL(boolean)\nget_sos (j_decompress_ptr cinfo)\n/* Process a SOS marker */\n{\n  INT32 length;\n  int i, ci, n, c, cc;\n  jpeg_component_info * compptr;\n  INPUT_VARS(cinfo);\n\n  if (! cinfo->marker->saw_SOF)\n    ERREXIT(cinfo, JERR_SOS_NO_SOF);\n\n  INPUT_2BYTES(cinfo, length, return FALSE);\n\n  INPUT_BYTE(cinfo, n, return FALSE); /* Number of components */\n\n  TRACEMS1(cinfo, 1, JTRC_SOS, n);\n\n  if (length != (n * 2 + 6) || n < 1 || n > MAX_COMPS_IN_SCAN)\n    ERREXIT(cinfo, JERR_BAD_LENGTH);\n\n  cinfo->comps_in_scan = n;\n\n  /* Collect the component-spec parameters */\n\n  for (i = 0; i < n; i++) {\n    INPUT_BYTE(cinfo, cc, return FALSE);\n    INPUT_BYTE(cinfo, c, return FALSE);\n    \n\t/* XYQ 2008-03-25: Adobe CMYK JPEG has serious flaw: the K channel has same component id as C channel */\n\t{\n\t\tint j;\n\t\tfor (j = 0; j < i; j ++)\n\t\t\tif (cc == cinfo->cur_comp_info[j]->component_id) break;\n\t\tif (j < i)\n\t\t\t/* found the error! */\n\t\t\tcc += 0xf0;\n\t}\n\t/* end of modification */\n    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n\t ci++, compptr++) {\n      if (cc == compptr->component_id)\n\tgoto id_found;\n    }\n\n    ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc);\n\n  id_found:\n\n    cinfo->cur_comp_info[i] = compptr;\n    compptr->dc_tbl_no = (c >> 4) & 15;\n    compptr->ac_tbl_no = (c     ) & 15;\n    \n    TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc,\n\t     compptr->dc_tbl_no, compptr->ac_tbl_no);\n\t/* This CSi (cc) should differ from the previous CSi */\n    for (ci = 0; ci < i; ci++) {\n      if (cinfo->cur_comp_info[ci] == compptr)\n        ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc);\n    }\n  }\n\n  /* Collect the additional scan parameters Ss, Se, Ah/Al. */\n  INPUT_BYTE(cinfo, c, return FALSE);\n  cinfo->Ss = c;\n  INPUT_BYTE(cinfo, c, return FALSE);\n  cinfo->Se = c;\n  INPUT_BYTE(cinfo, c, return FALSE);\n  cinfo->Ah = (c >> 4) & 15;\n  cinfo->Al = (c     ) & 15;\n\n  TRACEMS4(cinfo, 1, JTRC_SOS_PARAMS, cinfo->Ss, cinfo->Se,\n\t   cinfo->Ah, cinfo->Al);\n\n  /* Prepare to scan data & restart markers */\n  cinfo->marker->next_restart_num = 0;\n\n  /* Count another SOS marker */\n  cinfo->input_scan_number++;\n\n  INPUT_SYNC(cinfo);\n  return TRUE;\n}\n\n\n#ifdef D_ARITH_CODING_SUPPORTED\n\nLOCAL(boolean)\nget_dac (j_decompress_ptr cinfo)\n/* Process a DAC marker */\n{\n  INT32 length;\n  int index, val;\n  INPUT_VARS(cinfo);\n\n  INPUT_2BYTES(cinfo, length, return FALSE);\n  length -= 2;\n  \n  while (length > 0) {\n    INPUT_BYTE(cinfo, index, return FALSE);\n    INPUT_BYTE(cinfo, val, return FALSE);\n\n    length -= 2;\n\n    TRACEMS2(cinfo, 1, JTRC_DAC, index, val);\n\n    if (index < 0 || index >= (2*NUM_ARITH_TBLS))\n      ERREXIT1(cinfo, JERR_DAC_INDEX, index);\n\n    if (index >= NUM_ARITH_TBLS) { /* define AC table */\n      cinfo->arith_ac_K[index-NUM_ARITH_TBLS] = (UINT8) val;\n    } else {\t\t\t/* define DC table */\n      cinfo->arith_dc_L[index] = (UINT8) (val & 0x0F);\n      cinfo->arith_dc_U[index] = (UINT8) (val >> 4);\n      if (cinfo->arith_dc_L[index] > cinfo->arith_dc_U[index])\n\tERREXIT1(cinfo, JERR_DAC_VALUE, val);\n    }\n  }\n\n  if (length != 0)\n    ERREXIT(cinfo, JERR_BAD_LENGTH);\n\n  INPUT_SYNC(cinfo);\n  return TRUE;\n}\n\n#else /* ! D_ARITH_CODING_SUPPORTED */\n\n#define get_dac(cinfo)  skip_variable(cinfo)\n\n#endif /* D_ARITH_CODING_SUPPORTED */\n\n\nLOCAL(boolean)\nget_dht (j_decompress_ptr cinfo)\n/* Process a DHT marker */\n{\n  INT32 length;\n  UINT8 bits[17];\n  UINT8 huffval[256];\n  int i, index, count;\n  JHUFF_TBL **htblptr;\n  INPUT_VARS(cinfo);\n\n  INPUT_2BYTES(cinfo, length, return FALSE);\n  length -= 2;\n  \n  while (length > 16) {\n    INPUT_BYTE(cinfo, index, return FALSE);\n\n    TRACEMS1(cinfo, 1, JTRC_DHT, index);\n      \n    bits[0] = 0;\n    count = 0;\n    for (i = 1; i <= 16; i++) {\n      INPUT_BYTE(cinfo, bits[i], return FALSE);\n      count += bits[i];\n    }\n\n    length -= 1 + 16;\n\n    TRACEMS8(cinfo, 2, JTRC_HUFFBITS,\n\t     bits[1], bits[2], bits[3], bits[4],\n\t     bits[5], bits[6], bits[7], bits[8]);\n    TRACEMS8(cinfo, 2, JTRC_HUFFBITS,\n\t     bits[9], bits[10], bits[11], bits[12],\n\t     bits[13], bits[14], bits[15], bits[16]);\n\n    /* Here we just do minimal validation of the counts to avoid walking\n     * off the end of our table space.  jdhuff.c will check more carefully.\n     */\n    if (count > 256 || ((INT32) count) > length)\n      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);\n\n    for (i = 0; i < count; i++)\n      INPUT_BYTE(cinfo, huffval[i], return FALSE);\n\n    length -= count;\n\n    if (index & 0x10) {\t\t/* AC table definition */\n      index -= 0x10;\n      htblptr = &cinfo->ac_huff_tbl_ptrs[index];\n    } else {\t\t\t/* DC table definition */\n      htblptr = &cinfo->dc_huff_tbl_ptrs[index];\n    }\n\n    if (index < 0 || index >= NUM_HUFF_TBLS)\n      ERREXIT1(cinfo, JERR_DHT_INDEX, index);\n\n    if (*htblptr == NULL)\n      *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);\n  \n    MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));\n    MEMCOPY((*htblptr)->huffval, huffval, SIZEOF((*htblptr)->huffval));\n  }\n\n  if (length != 0)\n    ERREXIT(cinfo, JERR_BAD_LENGTH);\n\n  INPUT_SYNC(cinfo);\n  return TRUE;\n}\n\n\nLOCAL(boolean)\nget_dqt (j_decompress_ptr cinfo)\n/* Process a DQT marker */\n{\n  INT32 length;\n  int n, i, prec;\n  unsigned int tmp;\n  JQUANT_TBL *quant_ptr;\n  INPUT_VARS(cinfo);\n\n  INPUT_2BYTES(cinfo, length, return FALSE);\n  length -= 2;\n\n  while (length > 0) {\n    INPUT_BYTE(cinfo, n, return FALSE);\n    prec = n >> 4;\n    n &= 0x0F;\n\n    TRACEMS2(cinfo, 1, JTRC_DQT, n, prec);\n\n    if (n >= NUM_QUANT_TBLS)\n      ERREXIT1(cinfo, JERR_DQT_INDEX, n);\n      \n    if (cinfo->quant_tbl_ptrs[n] == NULL)\n      cinfo->quant_tbl_ptrs[n] = jpeg_alloc_quant_table((j_common_ptr) cinfo);\n    quant_ptr = cinfo->quant_tbl_ptrs[n];\n\n    for (i = 0; i < DCTSIZE2; i++) {\n      if (prec)\n\tINPUT_2BYTES(cinfo, tmp, return FALSE);\n      else\n\tINPUT_BYTE(cinfo, tmp, return FALSE);\n      /* We convert the zigzag-order table to natural array order. */\n      quant_ptr->quantval[jpeg_natural_order[i]] = (UINT16) tmp;\n    }\n\n    if (cinfo->err->trace_level >= 2) {\n      for (i = 0; i < DCTSIZE2; i += 8) {\n\tTRACEMS8(cinfo, 2, JTRC_QUANTVALS,\n\t\t quant_ptr->quantval[i],   quant_ptr->quantval[i+1],\n\t\t quant_ptr->quantval[i+2], quant_ptr->quantval[i+3],\n\t\t quant_ptr->quantval[i+4], quant_ptr->quantval[i+5],\n\t\t quant_ptr->quantval[i+6], quant_ptr->quantval[i+7]);\n      }\n    }\n\n    length -= DCTSIZE2+1;\n    if (prec) length -= DCTSIZE2;\n  }\n\n  if (length != 0)\n    ERREXIT(cinfo, JERR_BAD_LENGTH);\n\n  INPUT_SYNC(cinfo);\n  return TRUE;\n}\n\n\nLOCAL(boolean)\nget_dri (j_decompress_ptr cinfo)\n/* Process a DRI marker */\n{\n  INT32 length;\n  unsigned int tmp;\n  INPUT_VARS(cinfo);\n\n  INPUT_2BYTES(cinfo, length, return FALSE);\n  \n  if (length != 4)\n    ERREXIT(cinfo, JERR_BAD_LENGTH);\n\n  INPUT_2BYTES(cinfo, tmp, return FALSE);\n\n  TRACEMS1(cinfo, 1, JTRC_DRI, tmp);\n\n  cinfo->restart_interval = tmp;\n\n  INPUT_SYNC(cinfo);\n  return TRUE;\n}\n\n\n/*\n * Routines for processing APPn and COM markers.\n * These are either saved in memory or discarded, per application request.\n * APP0 and APP14 are specially checked to see if they are\n * JFIF and Adobe markers, respectively.\n */\n\n#define APP0_DATA_LEN\t14\t/* Length of interesting data in APP0 */\n#define APP14_DATA_LEN\t12\t/* Length of interesting data in APP14 */\n#define APPN_DATA_LEN\t14\t/* Must be the largest of the above!! */\n\n\nLOCAL(void)\nexamine_app0 (j_decompress_ptr cinfo, JOCTET FAR * data,\n\t      unsigned int datalen, INT32 remaining)\n/* Examine first few bytes from an APP0.\n * Take appropriate action if it is a JFIF marker.\n * datalen is # of bytes at data[], remaining is length of rest of marker data.\n */\n{\n  INT32 totallen = (INT32) datalen + remaining;\n\n  if (datalen >= APP0_DATA_LEN &&\n      GETJOCTET(data[0]) == 0x4A &&\n      GETJOCTET(data[1]) == 0x46 &&\n      GETJOCTET(data[2]) == 0x49 &&\n      GETJOCTET(data[3]) == 0x46 &&\n      GETJOCTET(data[4]) == 0) {\n    /* Found JFIF APP0 marker: save info */\n    cinfo->saw_JFIF_marker = TRUE;\n    cinfo->JFIF_major_version = GETJOCTET(data[5]);\n    cinfo->JFIF_minor_version = GETJOCTET(data[6]);\n    cinfo->density_unit = GETJOCTET(data[7]);\n    cinfo->X_density = (GETJOCTET(data[8]) << 8) + GETJOCTET(data[9]);\n    cinfo->Y_density = (GETJOCTET(data[10]) << 8) + GETJOCTET(data[11]);\n    /* Check version.\n     * Major version must be 1, anything else signals an incompatible change.\n     * (We used to treat this as an error, but now it's a nonfatal warning,\n     * because some bozo at Hijaak couldn't read the spec.)\n     * Minor version should be 0..2, but process anyway if newer.\n     */\n    if (cinfo->JFIF_major_version != 1)\n      WARNMS2(cinfo, JWRN_JFIF_MAJOR,\n\t      cinfo->JFIF_major_version, cinfo->JFIF_minor_version);\n    /* Generate trace messages */\n    TRACEMS5(cinfo, 1, JTRC_JFIF,\n\t     cinfo->JFIF_major_version, cinfo->JFIF_minor_version,\n\t     cinfo->X_density, cinfo->Y_density, cinfo->density_unit);\n    /* Validate thumbnail dimensions and issue appropriate messages */\n    if (GETJOCTET(data[12]) | GETJOCTET(data[13]))\n      TRACEMS2(cinfo, 1, JTRC_JFIF_THUMBNAIL,\n\t       GETJOCTET(data[12]), GETJOCTET(data[13]));\n    totallen -= APP0_DATA_LEN;\n    if (totallen !=\n\t((INT32)GETJOCTET(data[12]) * (INT32)GETJOCTET(data[13]) * (INT32) 3))\n      TRACEMS1(cinfo, 1, JTRC_JFIF_BADTHUMBNAILSIZE, (int) totallen);\n  } else if (datalen >= 6 &&\n      GETJOCTET(data[0]) == 0x4A &&\n      GETJOCTET(data[1]) == 0x46 &&\n      GETJOCTET(data[2]) == 0x58 &&\n      GETJOCTET(data[3]) == 0x58 &&\n      GETJOCTET(data[4]) == 0) {\n    /* Found JFIF \"JFXX\" extension APP0 marker */\n    /* The library doesn't actually do anything with these,\n     * but we try to produce a helpful trace message.\n     */\n    switch (GETJOCTET(data[5])) {\n    case 0x10:\n      TRACEMS1(cinfo, 1, JTRC_THUMB_JPEG, (int) totallen);\n      break;\n    case 0x11:\n      TRACEMS1(cinfo, 1, JTRC_THUMB_PALETTE, (int) totallen);\n      break;\n    case 0x13:\n      TRACEMS1(cinfo, 1, JTRC_THUMB_RGB, (int) totallen);\n      break;\n    default:\n      TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION,\n\t       GETJOCTET(data[5]), (int) totallen);\n      break;\n    }\n  } else {\n    /* Start of APP0 does not match \"JFIF\" or \"JFXX\", or too short */\n    TRACEMS1(cinfo, 1, JTRC_APP0, (int) totallen);\n  }\n}\n\n\nLOCAL(void)\nexamine_app14 (j_decompress_ptr cinfo, JOCTET FAR * data,\n\t       unsigned int datalen, INT32 remaining)\n/* Examine first few bytes from an APP14.\n * Take appropriate action if it is an Adobe marker.\n * datalen is # of bytes at data[], remaining is length of rest of marker data.\n */\n{\n  unsigned int version, flags0, flags1, transform;\n\n  if (datalen >= APP14_DATA_LEN &&\n      GETJOCTET(data[0]) == 0x41 &&\n      GETJOCTET(data[1]) == 0x64 &&\n      GETJOCTET(data[2]) == 0x6F &&\n      GETJOCTET(data[3]) == 0x62 &&\n      GETJOCTET(data[4]) == 0x65) {\n    /* Found Adobe APP14 marker */\n    version = (GETJOCTET(data[5]) << 8) + GETJOCTET(data[6]);\n    flags0 = (GETJOCTET(data[7]) << 8) + GETJOCTET(data[8]);\n    flags1 = (GETJOCTET(data[9]) << 8) + GETJOCTET(data[10]);\n    transform = GETJOCTET(data[11]);\n    TRACEMS4(cinfo, 1, JTRC_ADOBE, version, flags0, flags1, transform);\n    cinfo->saw_Adobe_marker = TRUE;\n    cinfo->Adobe_transform = (UINT8) transform;\n  } else {\n    /* Start of APP14 does not match \"Adobe\", or too short */\n    TRACEMS1(cinfo, 1, JTRC_APP14, (int) (datalen + remaining));\n  }\n}\n\n\nMETHODDEF(boolean)\nget_interesting_appn (j_decompress_ptr cinfo)\n/* Process an APP0 or APP14 marker without saving it */\n{\n  INT32 length;\n  JOCTET b[APPN_DATA_LEN];\n  unsigned int i, numtoread;\n  INPUT_VARS(cinfo);\n\n  INPUT_2BYTES(cinfo, length, return FALSE);\n  length -= 2;\n\n  /* get the interesting part of the marker data */\n  if (length >= APPN_DATA_LEN)\n    numtoread = APPN_DATA_LEN;\n  else if (length > 0)\n    numtoread = (unsigned int) length;\n  else\n    numtoread = 0;\n  for (i = 0; i < numtoread; i++)\n    INPUT_BYTE(cinfo, b[i], return FALSE);\n  length -= numtoread;\n\n  /* process it */\n  switch (cinfo->unread_marker) {\n  case M_APP0:\n    examine_app0(cinfo, (JOCTET FAR *) b, numtoread, length);\n    break;\n  case M_APP14:\n    examine_app14(cinfo, (JOCTET FAR *) b, numtoread, length);\n    break;\n  default:\n    /* can't get here unless jpeg_save_markers chooses wrong processor */\n    ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);\n    break;\n  }\n\n  /* skip any remaining data -- could be lots */\n  INPUT_SYNC(cinfo);\n  if (length > 0)\n    (*cinfo->src->skip_input_data) (cinfo, (long) length);\n\n  return TRUE;\n}\n\n\n#ifdef SAVE_MARKERS_SUPPORTED\n\nMETHODDEF(boolean)\nsave_marker (j_decompress_ptr cinfo)\n/* Save an APPn or COM marker into the marker list */\n{\n  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;\n  jpeg_saved_marker_ptr cur_marker = marker->cur_marker;\n  unsigned int bytes_read, data_length;\n  JOCTET FAR * data;\n  INT32 length = 0;\n  INPUT_VARS(cinfo);\n\n  if (cur_marker == NULL) {\n    /* begin reading a marker */\n    INPUT_2BYTES(cinfo, length, return FALSE);\n    length -= 2;\n    if (length >= 0) {\t\t/* watch out for bogus length word */\n      /* figure out how much we want to save */\n      unsigned int limit;\n      if (cinfo->unread_marker == (int) M_COM)\n\tlimit = marker->length_limit_COM;\n      else\n\tlimit = marker->length_limit_APPn[cinfo->unread_marker - (int) M_APP0];\n      if ((unsigned int) length < limit)\n\tlimit = (unsigned int) length;\n      /* allocate and initialize the marker item */\n      cur_marker = (jpeg_saved_marker_ptr)\n\t(*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t    SIZEOF(struct jpeg_marker_struct) + limit);\n      cur_marker->next = NULL;\n      cur_marker->marker = (UINT8) cinfo->unread_marker;\n      cur_marker->original_length = (unsigned int) length;\n      cur_marker->data_length = limit;\n      /* data area is just beyond the jpeg_marker_struct */\n      data = cur_marker->data = (JOCTET FAR *) (cur_marker + 1);\n      marker->cur_marker = cur_marker;\n      marker->bytes_read = 0;\n      bytes_read = 0;\n      data_length = limit;\n    } else {\n      /* deal with bogus length word */\n      bytes_read = data_length = 0;\n      data = NULL;\n    }\n  } else {\n    /* resume reading a marker */\n    bytes_read = marker->bytes_read;\n    data_length = cur_marker->data_length;\n    data = cur_marker->data + bytes_read;\n  }\n\n  while (bytes_read < data_length) {\n    INPUT_SYNC(cinfo);\t\t/* move the restart point to here */\n    marker->bytes_read = bytes_read;\n    /* If there's not at least one byte in buffer, suspend */\n    MAKE_BYTE_AVAIL(cinfo, return FALSE);\n    /* Copy bytes with reasonable rapidity */\n    while (bytes_read < data_length && bytes_in_buffer > 0) {\n      *data++ = *next_input_byte++;\n      bytes_in_buffer--;\n      bytes_read++;\n    }\n  }\n\n  /* Done reading what we want to read */\n  if (cur_marker != NULL) {\t/* will be NULL if bogus length word */\n    /* Add new marker to end of list */\n    if (cinfo->marker_list == NULL) {\n      cinfo->marker_list = cur_marker;\n    } else {\n      jpeg_saved_marker_ptr prev = cinfo->marker_list;\n      while (prev->next != NULL)\n\tprev = prev->next;\n      prev->next = cur_marker;\n    }\n    /* Reset pointer & calc remaining data length */\n    data = cur_marker->data;\n    length = cur_marker->original_length - data_length;\n  }\n  /* Reset to initial state for next marker */\n  marker->cur_marker = NULL;\n\n  /* Process the marker if interesting; else just make a generic trace msg */\n  switch (cinfo->unread_marker) {\n  case M_APP0:\n    examine_app0(cinfo, data, data_length, length);\n    break;\n  case M_APP14:\n    examine_app14(cinfo, data, data_length, length);\n    break;\n  default:\n    TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker,\n\t     (int) (data_length + length));\n    break;\n  }\n\n  /* skip any remaining data -- could be lots */\n  INPUT_SYNC(cinfo);\t\t/* do before skip_input_data */\n  if (length > 0)\n    (*cinfo->src->skip_input_data) (cinfo, (long) length);\n\n  return TRUE;\n}\n\n#endif /* SAVE_MARKERS_SUPPORTED */\n\n\nMETHODDEF(boolean)\nskip_variable (j_decompress_ptr cinfo)\n/* Skip over an unknown or uninteresting variable-length marker */\n{\n  INT32 length;\n  INPUT_VARS(cinfo);\n\n  INPUT_2BYTES(cinfo, length, return FALSE);\n  length -= 2;\n  \n  TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, (int) length);\n\n  INPUT_SYNC(cinfo);\t\t/* do before skip_input_data */\n  if (length > 0)\n    (*cinfo->src->skip_input_data) (cinfo, (long) length);\n\n  return TRUE;\n}\n\n\n/*\n * Find the next JPEG marker, save it in cinfo->unread_marker.\n * Returns FALSE if had to suspend before reaching a marker;\n * in that case cinfo->unread_marker is unchanged.\n *\n * Note that the result might not be a valid marker code,\n * but it will never be 0 or FF.\n */\n\nLOCAL(boolean)\nnext_marker (j_decompress_ptr cinfo)\n{\n  int c;\n  INPUT_VARS(cinfo);\n\n  for (;;) {\n    INPUT_BYTE(cinfo, c, return FALSE);\n    /* Skip any non-FF bytes.\n     * This may look a bit inefficient, but it will not occur in a valid file.\n     * We sync after each discarded byte so that a suspending data source\n     * can discard the byte from its buffer.\n     */\n    while (c != 0xFF) {\n      cinfo->marker->discarded_bytes++;\n      INPUT_SYNC(cinfo);\n      INPUT_BYTE(cinfo, c, return FALSE);\n    }\n    /* This loop swallows any duplicate FF bytes.  Extra FFs are legal as\n     * pad bytes, so don't count them in discarded_bytes.  We assume there\n     * will not be so many consecutive FF bytes as to overflow a suspending\n     * data source's input buffer.\n     */\n    do {\n      INPUT_BYTE(cinfo, c, return FALSE);\n    } while (c == 0xFF);\n    if (c != 0)\n      break;\t\t\t/* found a valid marker, exit loop */\n    /* Reach here if we found a stuffed-zero data sequence (FF/00).\n     * Discard it and loop back to try again.\n     */\n    cinfo->marker->discarded_bytes += 2;\n    INPUT_SYNC(cinfo);\n  }\n\n  if (cinfo->marker->discarded_bytes != 0) {\n    WARNMS2(cinfo, JWRN_EXTRANEOUS_DATA, cinfo->marker->discarded_bytes, c);\n    cinfo->marker->discarded_bytes = 0;\n  }\n\n  cinfo->unread_marker = c;\n\n  INPUT_SYNC(cinfo);\n  return TRUE;\n}\n\n\nLOCAL(boolean)\nfirst_marker (j_decompress_ptr cinfo)\n/* Like next_marker, but used to obtain the initial SOI marker. */\n/* For this marker, we do not allow preceding garbage or fill; otherwise,\n * we might well scan an entire input file before realizing it ain't JPEG.\n * If an application wants to process non-JFIF files, it must seek to the\n * SOI before calling the JPEG library.\n */\n{\n  int c, c2;\n  INPUT_VARS(cinfo);\n\n  INPUT_BYTE(cinfo, c, return FALSE);\n  INPUT_BYTE(cinfo, c2, return FALSE);\n  if (c != 0xFF || c2 != (int) M_SOI)\n    ERREXIT2(cinfo, JERR_NO_SOI, c, c2);\n\n  cinfo->unread_marker = c2;\n\n  INPUT_SYNC(cinfo);\n  return TRUE;\n}\n\n\n/*\n * Read markers until SOS or EOI.\n *\n * Returns same codes as are defined for jpeg_consume_input:\n * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.\n */\n\nMETHODDEF(int)\nread_markers (j_decompress_ptr cinfo)\n{\n  /* Outer loop repeats once for each marker. */\n  for (;;) {\n    /* Collect the marker proper, unless we already did. */\n    /* NB: first_marker() enforces the requirement that SOI appear first. */\n    if (cinfo->unread_marker == 0) {\n      if (! cinfo->marker->saw_SOI) {\n\tif (! first_marker(cinfo))\n\t  return JPEG_SUSPENDED;\n      } else {\n\tif (! next_marker(cinfo))\n\t  return JPEG_SUSPENDED;\n      }\n    }\n    /* At this point cinfo->unread_marker contains the marker code and the\n     * input point is just past the marker proper, but before any parameters.\n     * A suspension will cause us to return with this state still true.\n     */\n    switch (cinfo->unread_marker) {\n    case M_SOI:\n      if (! get_soi(cinfo))\n\treturn JPEG_SUSPENDED;\n      break;\n\n    case M_SOF0:\t\t/* Baseline */\n    case M_SOF1:\t\t/* Extended sequential, Huffman */\n      if (! get_sof(cinfo, FALSE, FALSE))\n\treturn JPEG_SUSPENDED;\n      break;\n\n    case M_SOF2:\t\t/* Progressive, Huffman */\n      if (! get_sof(cinfo, TRUE, FALSE))\n\treturn JPEG_SUSPENDED;\n      break;\n\n    case M_SOF9:\t\t/* Extended sequential, arithmetic */\n      if (! get_sof(cinfo, FALSE, TRUE))\n\treturn JPEG_SUSPENDED;\n      break;\n\n    case M_SOF10:\t\t/* Progressive, arithmetic */\n      if (! get_sof(cinfo, TRUE, TRUE))\n\treturn JPEG_SUSPENDED;\n      break;\n\n    /* Currently unsupported SOFn types */\n    case M_SOF3:\t\t/* Lossless, Huffman */\n    case M_SOF5:\t\t/* Differential sequential, Huffman */\n    case M_SOF6:\t\t/* Differential progressive, Huffman */\n    case M_SOF7:\t\t/* Differential lossless, Huffman */\n    case M_JPG:\t\t\t/* Reserved for JPEG extensions */\n    case M_SOF11:\t\t/* Lossless, arithmetic */\n    case M_SOF13:\t\t/* Differential sequential, arithmetic */\n    case M_SOF14:\t\t/* Differential progressive, arithmetic */\n    case M_SOF15:\t\t/* Differential lossless, arithmetic */\n      ERREXIT1(cinfo, JERR_SOF_UNSUPPORTED, cinfo->unread_marker);\n      break;\n\n    case M_SOS:\n      if (! get_sos(cinfo))\n\treturn JPEG_SUSPENDED;\n      cinfo->unread_marker = 0;\t/* processed the marker */\n      return JPEG_REACHED_SOS;\n    \n    case M_EOI:\n      TRACEMS(cinfo, 1, JTRC_EOI);\n      cinfo->unread_marker = 0;\t/* processed the marker */\n      return JPEG_REACHED_EOI;\n      \n    case M_DAC:\n      if (! get_dac(cinfo))\n\treturn JPEG_SUSPENDED;\n      break;\n      \n    case M_DHT:\n      if (! get_dht(cinfo))\n\treturn JPEG_SUSPENDED;\n      break;\n      \n    case M_DQT:\n      if (! get_dqt(cinfo))\n\treturn JPEG_SUSPENDED;\n      break;\n      \n    case M_DRI:\n      if (! get_dri(cinfo))\n\treturn JPEG_SUSPENDED;\n      break;\n      \n    case M_APP0:\n    case M_APP1:\n    case M_APP2:\n    case M_APP3:\n    case M_APP4:\n    case M_APP5:\n    case M_APP6:\n    case M_APP7:\n    case M_APP8:\n    case M_APP9:\n    case M_APP10:\n    case M_APP11:\n    case M_APP12:\n    case M_APP13:\n    case M_APP14:\n    case M_APP15:\n      if (! (*((my_marker_ptr) cinfo->marker)->process_APPn[\n\t\tcinfo->unread_marker - (int) M_APP0]) (cinfo))\n\treturn JPEG_SUSPENDED;\n      break;\n      \n    case M_COM:\n      if (! (*((my_marker_ptr) cinfo->marker)->process_COM) (cinfo))\n\treturn JPEG_SUSPENDED;\n      break;\n\n    case M_RST0:\t\t/* these are all parameterless */\n    case M_RST1:\n    case M_RST2:\n    case M_RST3:\n    case M_RST4:\n    case M_RST5:\n    case M_RST6:\n    case M_RST7:\n    case M_TEM:\n      TRACEMS1(cinfo, 1, JTRC_PARMLESS_MARKER, cinfo->unread_marker);\n      break;\n\n    case M_DNL:\t\t\t/* Ignore DNL ... perhaps the wrong thing */\n      if (! skip_variable(cinfo))\n\treturn JPEG_SUSPENDED;\n      break;\n\n    default:\t\t\t/* must be DHP, EXP, JPGn, or RESn */\n      /* For now, we treat the reserved markers as fatal errors since they are\n       * likely to be used to signal incompatible JPEG Part 3 extensions.\n       * Once the JPEG 3 version-number marker is well defined, this code\n       * ought to change!\n       */\n      ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);\n      break;\n    }\n    /* Successfully processed marker, so reset state variable */\n    cinfo->unread_marker = 0;\n  } /* end loop */\n}\n\n\n/*\n * Read a restart marker, which is expected to appear next in the datastream;\n * if the marker is not there, take appropriate recovery action.\n * Returns FALSE if suspension is required.\n *\n * This is called by the entropy decoder after it has read an appropriate\n * number of MCUs.  cinfo->unread_marker may be nonzero if the entropy decoder\n * has already read a marker from the data source.  Under normal conditions\n * cinfo->unread_marker will be reset to 0 before returning; if not reset,\n * it holds a marker which the decoder will be unable to read past.\n */\n\nMETHODDEF(boolean)\nread_restart_marker (j_decompress_ptr cinfo)\n{\n  /* Obtain a marker unless we already did. */\n  /* Note that next_marker will complain if it skips any data. */\n  if (cinfo->unread_marker == 0) {\n    if (! next_marker(cinfo))\n      return FALSE;\n  }\n\n  if (cinfo->unread_marker ==\n      ((int) M_RST0 + cinfo->marker->next_restart_num)) {\n    /* Normal case --- swallow the marker and let entropy decoder continue */\n    TRACEMS1(cinfo, 3, JTRC_RST, cinfo->marker->next_restart_num);\n    cinfo->unread_marker = 0;\n  } else {\n    /* Uh-oh, the restart markers have been messed up. */\n    /* Let the data source manager determine how to resync. */\n    if (! (*cinfo->src->resync_to_restart) (cinfo,\n\t\t\t\t\t    cinfo->marker->next_restart_num))\n      return FALSE;\n  }\n\n  /* Update next-restart state */\n  cinfo->marker->next_restart_num = (cinfo->marker->next_restart_num + 1) & 7;\n\n  return TRUE;\n}\n\n\n/*\n * This is the default resync_to_restart method for data source managers\n * to use if they don't have any better approach.  Some data source managers\n * may be able to back up, or may have additional knowledge about the data\n * which permits a more intelligent recovery strategy; such managers would\n * presumably supply their own resync method.\n *\n * read_restart_marker calls resync_to_restart if it finds a marker other than\n * the restart marker it was expecting.  (This code is *not* used unless\n * a nonzero restart interval has been declared.)  cinfo->unread_marker is\n * the marker code actually found (might be anything, except 0 or FF).\n * The desired restart marker number (0..7) is passed as a parameter.\n * This routine is supposed to apply whatever error recovery strategy seems\n * appropriate in order to position the input stream to the next data segment.\n * Note that cinfo->unread_marker is treated as a marker appearing before\n * the current data-source input point; usually it should be reset to zero\n * before returning.\n * Returns FALSE if suspension is required.\n *\n * This implementation is substantially constrained by wanting to treat the\n * input as a data stream; this means we can't back up.  Therefore, we have\n * only the following actions to work with:\n *   1. Simply discard the marker and let the entropy decoder resume at next\n *      byte of file.\n *   2. Read forward until we find another marker, discarding intervening\n *      data.  (In theory we could look ahead within the current bufferload,\n *      without having to discard data if we don't find the desired marker.\n *      This idea is not implemented here, in part because it makes behavior\n *      dependent on buffer size and chance buffer-boundary positions.)\n *   3. Leave the marker unread (by failing to zero cinfo->unread_marker).\n *      This will cause the entropy decoder to process an empty data segment,\n *      inserting dummy zeroes, and then we will reprocess the marker.\n *\n * #2 is appropriate if we think the desired marker lies ahead, while #3 is\n * appropriate if the found marker is a future restart marker (indicating\n * that we have missed the desired restart marker, probably because it got\n * corrupted).\n * We apply #2 or #3 if the found marker is a restart marker no more than\n * two counts behind or ahead of the expected one.  We also apply #2 if the\n * found marker is not a legal JPEG marker code (it's certainly bogus data).\n * If the found marker is a restart marker more than 2 counts away, we do #1\n * (too much risk that the marker is erroneous; with luck we will be able to\n * resync at some future point).\n * For any valid non-restart JPEG marker, we apply #3.  This keeps us from\n * overrunning the end of a scan.  An implementation limited to single-scan\n * files might find it better to apply #2 for markers other than EOI, since\n * any other marker would have to be bogus data in that case.\n */\n\nGLOBAL(boolean)\njpeg_resync_to_restart (j_decompress_ptr cinfo, int desired)\n{\n  int marker = cinfo->unread_marker;\n  int action = 1;\n  \n  /* Always put up a warning. */\n  WARNMS2(cinfo, JWRN_MUST_RESYNC, marker, desired);\n  \n  /* Outer loop handles repeated decision after scanning forward. */\n  for (;;) {\n    if (marker < (int) M_SOF0)\n      action = 2;\t\t/* invalid marker */\n    else if (marker < (int) M_RST0 || marker > (int) M_RST7)\n      action = 3;\t\t/* valid non-restart marker */\n    else {\n      if (marker == ((int) M_RST0 + ((desired+1) & 7)) ||\n\t  marker == ((int) M_RST0 + ((desired+2) & 7)))\n\taction = 3;\t\t/* one of the next two expected restarts */\n      else if (marker == ((int) M_RST0 + ((desired-1) & 7)) ||\n\t       marker == ((int) M_RST0 + ((desired-2) & 7)))\n\taction = 2;\t\t/* a prior restart, so advance */\n      else\n\taction = 1;\t\t/* desired restart or too far away */\n    }\n    TRACEMS2(cinfo, 4, JTRC_RECOVERY_ACTION, marker, action);\n    switch (action) {\n    case 1:\n      /* Discard marker and let entropy decoder resume processing. */\n      cinfo->unread_marker = 0;\n      return TRUE;\n    case 2:\n      /* Scan to the next marker, and repeat the decision loop. */\n      if (! next_marker(cinfo))\n\treturn FALSE;\n      marker = cinfo->unread_marker;\n      break;\n    case 3:\n      /* Return without advancing past this marker. */\n      /* Entropy decoder will be forced to process an empty segment. */\n      return TRUE;\n    }\n  } /* end loop */\n}\n\n\n/*\n * Reset marker processing state to begin a fresh datastream.\n */\n\nMETHODDEF(void)\nreset_marker_reader (j_decompress_ptr cinfo)\n{\n  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;\n\n  cinfo->comp_info = NULL;\t\t/* until allocated by get_sof */\n  cinfo->input_scan_number = 0;\t\t/* no SOS seen yet */\n  cinfo->unread_marker = 0;\t\t/* no pending marker */\n  marker->pub.saw_SOI = FALSE;\t\t/* set internal state too */\n  marker->pub.saw_SOF = FALSE;\n  marker->pub.discarded_bytes = 0;\n  marker->cur_marker = NULL;\n}\n\n\n/*\n * Initialize the marker reader module.\n * This is called only once, when the decompression object is created.\n */\n\nGLOBAL(void)\njinit_marker_reader (j_decompress_ptr cinfo)\n{\n  my_marker_ptr marker;\n  int i;\n\n  /* Create subobject in permanent pool */\n  marker = (my_marker_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,\n\t\t\t\tSIZEOF(my_marker_reader));\n  cinfo->marker = (struct jpeg_marker_reader *) marker;\n  /* Initialize public method pointers */\n  marker->pub.reset_marker_reader = reset_marker_reader;\n  marker->pub.read_markers = read_markers;\n  marker->pub.read_restart_marker = read_restart_marker;\n  /* Initialize COM/APPn processing.\n   * By default, we examine and then discard APP0 and APP14,\n   * but simply discard COM and all other APPn.\n   */\n  marker->process_COM = skip_variable;\n  marker->length_limit_COM = 0;\n  for (i = 0; i < 16; i++) {\n    marker->process_APPn[i] = skip_variable;\n    marker->length_limit_APPn[i] = 0;\n  }\n  marker->process_APPn[0] = get_interesting_appn;\n  marker->process_APPn[14] = get_interesting_appn;\n  /* Reset marker processing state */\n  reset_marker_reader(cinfo);\n}\n\n\n/*\n * Control saving of COM and APPn markers into marker_list.\n */\n\n#ifdef SAVE_MARKERS_SUPPORTED\n\nGLOBAL(void)\njpeg_save_markers (j_decompress_ptr cinfo, int marker_code,\n\t\t   unsigned int length_limit)\n{\n  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;\n  long maxlength;\n  jpeg_marker_parser_method processor;\n\n  /* Length limit mustn't be larger than what we can allocate\n   * (should only be a concern in a 16-bit environment).\n   */\n  maxlength = cinfo->mem->max_alloc_chunk - SIZEOF(struct jpeg_marker_struct);\n  if (((long) length_limit) > maxlength)\n    length_limit = (unsigned int) maxlength;\n\n  /* Choose processor routine to use.\n   * APP0/APP14 have special requirements.\n   */\n  if (length_limit) {\n    processor = save_marker;\n    /* If saving APP0/APP14, save at least enough for our internal use. */\n    if (marker_code == (int) M_APP0 && length_limit < APP0_DATA_LEN)\n      length_limit = APP0_DATA_LEN;\n    else if (marker_code == (int) M_APP14 && length_limit < APP14_DATA_LEN)\n      length_limit = APP14_DATA_LEN;\n  } else {\n    processor = skip_variable;\n    /* If discarding APP0/APP14, use our regular on-the-fly processor. */\n    if (marker_code == (int) M_APP0 || marker_code == (int) M_APP14)\n      processor = get_interesting_appn;\n  }\n\n  if (marker_code == (int) M_COM) {\n    marker->process_COM = processor;\n    marker->length_limit_COM = length_limit;\n  } else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15) {\n    marker->process_APPn[marker_code - (int) M_APP0] = processor;\n    marker->length_limit_APPn[marker_code - (int) M_APP0] = length_limit;\n  } else\n    ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code);\n}\n\n#endif /* SAVE_MARKERS_SUPPORTED */\n\n\n/*\n * Install a special processing method for COM or APPn markers.\n */\n\nGLOBAL(void)\njpeg_set_marker_processor (j_decompress_ptr cinfo, int marker_code,\n\t\t\t   jpeg_marker_parser_method routine)\n{\n  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;\n\n  if (marker_code == (int) M_COM)\n    marker->process_COM = routine;\n  else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15)\n    marker->process_APPn[marker_code - (int) M_APP0] = routine;\n  else\n    ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code);\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jdmaster.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jdmaster.c\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains master control logic for the JPEG decompressor.\n * These routines are concerned with selecting the modules to be executed\n * and with determining the number of passes and the work to be done in each\n * pass.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Private state */\n\ntypedef struct {\n  struct jpeg_decomp_master pub; /* public fields */\n\n  int pass_number;\t\t/* # of passes completed */\n\n  boolean using_merged_upsample; /* TRUE if using merged upsample/cconvert */\n\n  /* Saved references to initialized quantizer modules,\n   * in case we need to switch modes.\n   */\n  struct jpeg_color_quantizer * quantizer_1pass;\n  struct jpeg_color_quantizer * quantizer_2pass;\n} my_decomp_master;\n\ntypedef my_decomp_master * my_master_ptr;\n\n\n/*\n * Determine whether merged upsample/color conversion should be used.\n * CRUCIAL: this must match the actual capabilities of jdmerge.c!\n */\n\nLOCAL(boolean)\nuse_merged_upsample (j_decompress_ptr cinfo)\n{\n#ifdef UPSAMPLE_MERGING_SUPPORTED\n  /* Merging is the equivalent of plain box-filter upsampling */\n  if (cinfo->do_fancy_upsampling || cinfo->CCIR601_sampling)\n    return FALSE;\n  /* jdmerge.c only supports YCC=>RGB color conversion */\n  if (cinfo->jpeg_color_space != JCS_YCbCr || cinfo->num_components != 3 ||\n      cinfo->out_color_space != JCS_RGB ||\n      cinfo->out_color_components != RGB_PIXELSIZE)\n    return FALSE;\n  /* and it only handles 2h1v or 2h2v sampling ratios */\n  if (cinfo->comp_info[0].h_samp_factor != 2 ||\n      cinfo->comp_info[1].h_samp_factor != 1 ||\n      cinfo->comp_info[2].h_samp_factor != 1 ||\n      cinfo->comp_info[0].v_samp_factor >  2 ||\n      cinfo->comp_info[1].v_samp_factor != 1 ||\n      cinfo->comp_info[2].v_samp_factor != 1)\n    return FALSE;\n  /* furthermore, it doesn't work if we've scaled the IDCTs differently */\n  if (cinfo->comp_info[0].DCT_scaled_size != cinfo->min_DCT_scaled_size ||\n      cinfo->comp_info[1].DCT_scaled_size != cinfo->min_DCT_scaled_size ||\n      cinfo->comp_info[2].DCT_scaled_size != cinfo->min_DCT_scaled_size)\n    return FALSE;\n  /* ??? also need to test for upsample-time rescaling, when & if supported */\n  return TRUE;\t\t\t/* by golly, it'll work... */\n#else\n  return FALSE;\n#endif\n}\n\n\n/*\n * Compute output image dimensions and related values.\n * NOTE: this is exported for possible use by application.\n * Hence it mustn't do anything that can't be done twice.\n * Also note that it may be called before the master module is initialized!\n */\n\nGLOBAL(void)\njpeg_calc_output_dimensions (j_decompress_ptr cinfo)\n/* Do computations that are needed before master selection phase */\n{\n#ifdef IDCT_SCALING_SUPPORTED\n  int ci;\n  jpeg_component_info *compptr;\n#endif\n\n  /* Prevent application from calling me at wrong times */\n  if (cinfo->global_state != DSTATE_READY)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n\n#ifdef IDCT_SCALING_SUPPORTED\n\n  /* Compute actual output image dimensions and DCT scaling choices. */\n  if (cinfo->scale_num * 8 <= cinfo->scale_denom) {\n    /* Provide 1/8 scaling */\n    cinfo->output_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width, 8L);\n    cinfo->output_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height, 8L);\n    cinfo->min_DCT_scaled_size = 1;\n  } else if (cinfo->scale_num * 4 <= cinfo->scale_denom) {\n    /* Provide 1/4 scaling */\n    cinfo->output_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width, 4L);\n    cinfo->output_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height, 4L);\n    cinfo->min_DCT_scaled_size = 2;\n  } else if (cinfo->scale_num * 2 <= cinfo->scale_denom) {\n    /* Provide 1/2 scaling */\n    cinfo->output_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width, 2L);\n    cinfo->output_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height, 2L);\n    cinfo->min_DCT_scaled_size = 4;\n  } else {\n    /* Provide 1/1 scaling */\n    cinfo->output_width = cinfo->image_width;\n    cinfo->output_height = cinfo->image_height;\n    cinfo->min_DCT_scaled_size = DCTSIZE;\n  }\n  /* In selecting the actual DCT scaling for each component, we try to\n   * scale up the chroma components via IDCT scaling rather than upsampling.\n   * This saves time if the upsampler gets to use 1:1 scaling.\n   * Note this code assumes that the supported DCT scalings are powers of 2.\n   */\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    int ssize = cinfo->min_DCT_scaled_size;\n    while (ssize < DCTSIZE &&\n\t   (compptr->h_samp_factor * ssize * 2 <=\n\t    cinfo->max_h_samp_factor * cinfo->min_DCT_scaled_size) &&\n\t   (compptr->v_samp_factor * ssize * 2 <=\n\t    cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size)) {\n      ssize = ssize * 2;\n    }\n    compptr->DCT_scaled_size = ssize;\n  }\n\n  /* Recompute downsampled dimensions of components;\n   * application needs to know these if using raw downsampled data.\n   */\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    /* Size in samples, after IDCT scaling */\n    compptr->downsampled_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width *\n\t\t    (long) (compptr->h_samp_factor * compptr->DCT_scaled_size),\n\t\t    (long) (cinfo->max_h_samp_factor * DCTSIZE));\n    compptr->downsampled_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height *\n\t\t    (long) (compptr->v_samp_factor * compptr->DCT_scaled_size),\n\t\t    (long) (cinfo->max_v_samp_factor * DCTSIZE));\n  }\n\n#else /* !IDCT_SCALING_SUPPORTED */\n\n  /* Hardwire it to \"no scaling\" */\n  cinfo->output_width = cinfo->image_width;\n  cinfo->output_height = cinfo->image_height;\n  /* jdinput.c has already initialized DCT_scaled_size to DCTSIZE,\n   * and has computed unscaled downsampled_width and downsampled_height.\n   */\n\n#endif /* IDCT_SCALING_SUPPORTED */\n\n  /* Report number of components in selected colorspace. */\n  /* Probably this should be in the color conversion module... */\n  switch (cinfo->out_color_space) {\n  case JCS_GRAYSCALE:\n    cinfo->out_color_components = 1;\n    break;\n  case JCS_RGB:\n#if RGB_PIXELSIZE != 3\n    cinfo->out_color_components = RGB_PIXELSIZE;\n    break;\n#endif /* else share code with YCbCr */\n  case JCS_YCbCr:\n    cinfo->out_color_components = 3;\n    break;\n  case JCS_CMYK:\n  case JCS_YCCK:\n    cinfo->out_color_components = 4;\n    break;\n  default:\t\t\t/* else must be same colorspace as in file */\n    cinfo->out_color_components = cinfo->num_components;\n    break;\n  }\n  cinfo->output_components = (cinfo->quantize_colors ? 1 :\n\t\t\t      cinfo->out_color_components);\n\n  /* See if upsampler will want to emit more than one row at a time */\n  if (use_merged_upsample(cinfo))\n    cinfo->rec_outbuf_height = cinfo->max_v_samp_factor;\n  else\n    cinfo->rec_outbuf_height = 1;\n}\n\n\n/*\n * Several decompression processes need to range-limit values to the range\n * 0..MAXJSAMPLE; the input value may fall somewhat outside this range\n * due to noise introduced by quantization, roundoff error, etc.  These\n * processes are inner loops and need to be as fast as possible.  On most\n * machines, particularly CPUs with pipelines or instruction prefetch,\n * a (subscript-check-less) C table lookup\n *\t\tx = sample_range_limit[x];\n * is faster than explicit tests\n *\t\tif (x < 0)  x = 0;\n *\t\telse if (x > MAXJSAMPLE)  x = MAXJSAMPLE;\n * These processes all use a common table prepared by the routine below.\n *\n * For most steps we can mathematically guarantee that the initial value\n * of x is within MAXJSAMPLE+1 of the legal range, so a table running from\n * -(MAXJSAMPLE+1) to 2*MAXJSAMPLE+1 is sufficient.  But for the initial\n * limiting step (just after the IDCT), a wildly out-of-range value is \n * possible if the input data is corrupt.  To avoid any chance of indexing\n * off the end of memory and getting a bad-pointer trap, we perform the\n * post-IDCT limiting thus:\n *\t\tx = range_limit[x & MASK];\n * where MASK is 2 bits wider than legal sample data, ie 10 bits for 8-bit\n * samples.  Under normal circumstances this is more than enough range and\n * a correct output will be generated; with bogus input data the mask will\n * cause wraparound, and we will safely generate a bogus-but-in-range output.\n * For the post-IDCT step, we want to convert the data from signed to unsigned\n * representation by adding CENTERJSAMPLE at the same time that we limit it.\n * So the post-IDCT limiting table ends up looking like this:\n *   CENTERJSAMPLE,CENTERJSAMPLE+1,...,MAXJSAMPLE,\n *   MAXJSAMPLE (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),\n *   0          (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),\n *   0,1,...,CENTERJSAMPLE-1\n * Negative inputs select values from the upper half of the table after\n * masking.\n *\n * We can save some space by overlapping the start of the post-IDCT table\n * with the simpler range limiting table.  The post-IDCT table begins at\n * sample_range_limit + CENTERJSAMPLE.\n *\n * Note that the table is allocated in near data space on PCs; it's small\n * enough and used often enough to justify this.\n */\n\nLOCAL(void)\nprepare_range_limit_table (j_decompress_ptr cinfo)\n/* Allocate and fill in the sample_range_limit table */\n{\n  JSAMPLE * table;\n  int i;\n\n  table = (JSAMPLE *)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t(5 * (MAXJSAMPLE+1) + CENTERJSAMPLE) * SIZEOF(JSAMPLE));\n  table += (MAXJSAMPLE+1);\t/* allow negative subscripts of simple table */\n  cinfo->sample_range_limit = table;\n  /* First segment of \"simple\" table: limit[x] = 0 for x < 0 */\n  MEMZERO(table - (MAXJSAMPLE+1), (MAXJSAMPLE+1) * SIZEOF(JSAMPLE));\n  /* Main part of \"simple\" table: limit[x] = x */\n  for (i = 0; i <= MAXJSAMPLE; i++)\n    table[i] = (JSAMPLE) i;\n  table += CENTERJSAMPLE;\t/* Point to where post-IDCT table starts */\n  /* End of simple table, rest of first half of post-IDCT table */\n  for (i = CENTERJSAMPLE; i < 2*(MAXJSAMPLE+1); i++)\n    table[i] = MAXJSAMPLE;\n  /* Second half of post-IDCT table */\n  MEMZERO(table + (2 * (MAXJSAMPLE+1)),\n\t  (2 * (MAXJSAMPLE+1) - CENTERJSAMPLE) * SIZEOF(JSAMPLE));\n  MEMCOPY(table + (4 * (MAXJSAMPLE+1) - CENTERJSAMPLE),\n\t  cinfo->sample_range_limit, CENTERJSAMPLE * SIZEOF(JSAMPLE));\n}\n\n\n/*\n * Master selection of decompression modules.\n * This is done once at jpeg_start_decompress time.  We determine\n * which modules will be used and give them appropriate initialization calls.\n * We also initialize the decompressor input side to begin consuming data.\n *\n * Since jpeg_read_header has finished, we know what is in the SOF\n * and (first) SOS markers.  We also have all the application parameter\n * settings.\n */\n\nLOCAL(void)\nmaster_selection (j_decompress_ptr cinfo)\n{\n  my_master_ptr master = (my_master_ptr) cinfo->master;\n  boolean use_c_buffer;\n  long samplesperrow;\n  JDIMENSION jd_samplesperrow;\n\n  /* Initialize dimensions and other stuff */\n  jpeg_calc_output_dimensions(cinfo);\n  prepare_range_limit_table(cinfo);\n\n  /* Width of an output scanline must be representable as JDIMENSION. */\n  samplesperrow = (long) cinfo->output_width * (long) cinfo->out_color_components;\n  jd_samplesperrow = (JDIMENSION) samplesperrow;\n  if ((long) jd_samplesperrow != samplesperrow)\n    ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);\n\n  /* Initialize my private state */\n  master->pass_number = 0;\n  master->using_merged_upsample = use_merged_upsample(cinfo);\n\n  /* Color quantizer selection */\n  master->quantizer_1pass = NULL;\n  master->quantizer_2pass = NULL;\n  /* No mode changes if not using buffered-image mode. */\n  if (! cinfo->quantize_colors || ! cinfo->buffered_image) {\n    cinfo->enable_1pass_quant = FALSE;\n    cinfo->enable_external_quant = FALSE;\n    cinfo->enable_2pass_quant = FALSE;\n  }\n  if (cinfo->quantize_colors) {\n    if (cinfo->raw_data_out)\n      ERREXIT(cinfo, JERR_NOTIMPL);\n    /* 2-pass quantizer only works in 3-component color space. */\n    if (cinfo->out_color_components != 3) {\n      cinfo->enable_1pass_quant = TRUE;\n      cinfo->enable_external_quant = FALSE;\n      cinfo->enable_2pass_quant = FALSE;\n      cinfo->colormap = NULL;\n    } else if (cinfo->colormap != NULL) {\n      cinfo->enable_external_quant = TRUE;\n    } else if (cinfo->two_pass_quantize) {\n      cinfo->enable_2pass_quant = TRUE;\n    } else {\n      cinfo->enable_1pass_quant = TRUE;\n    }\n\n    if (cinfo->enable_1pass_quant) {\n#ifdef QUANT_1PASS_SUPPORTED\n      jinit_1pass_quantizer(cinfo);\n      master->quantizer_1pass = cinfo->cquantize;\n#else\n      ERREXIT(cinfo, JERR_NOT_COMPILED);\n#endif\n    }\n\n    /* We use the 2-pass code to map to external colormaps. */\n    if (cinfo->enable_2pass_quant || cinfo->enable_external_quant) {\n#ifdef QUANT_2PASS_SUPPORTED\n      jinit_2pass_quantizer(cinfo);\n      master->quantizer_2pass = cinfo->cquantize;\n#else\n      ERREXIT(cinfo, JERR_NOT_COMPILED);\n#endif\n    }\n    /* If both quantizers are initialized, the 2-pass one is left active;\n     * this is necessary for starting with quantization to an external map.\n     */\n  }\n\n  /* Post-processing: in particular, color conversion first */\n  if (! cinfo->raw_data_out) {\n    if (master->using_merged_upsample) {\n#ifdef UPSAMPLE_MERGING_SUPPORTED\n      jinit_merged_upsampler(cinfo); /* does color conversion too */\n#else\n      ERREXIT(cinfo, JERR_NOT_COMPILED);\n#endif\n    } else {\n      jinit_color_deconverter(cinfo);\n      jinit_upsampler(cinfo);\n    }\n    jinit_d_post_controller(cinfo, cinfo->enable_2pass_quant);\n  }\n  /* Inverse DCT */\n  jinit_inverse_dct(cinfo);\n  /* Entropy decoding: either Huffman or arithmetic coding. */\n  if (cinfo->arith_code) {\n    ERREXIT(cinfo, JERR_ARITH_NOTIMPL);\n  } else {\n    if (cinfo->progressive_mode) {\n#ifdef D_PROGRESSIVE_SUPPORTED\n      jinit_phuff_decoder(cinfo);\n#else\n      ERREXIT(cinfo, JERR_NOT_COMPILED);\n#endif\n    } else\n      jinit_huff_decoder(cinfo);\n  }\n\n  /* Initialize principal buffer controllers. */\n  use_c_buffer = cinfo->inputctl->has_multiple_scans || cinfo->buffered_image;\n  jinit_d_coef_controller(cinfo, use_c_buffer);\n\n  if (! cinfo->raw_data_out)\n    jinit_d_main_controller(cinfo, FALSE /* never need full buffer here */);\n\n  /* We can now tell the memory manager to allocate virtual arrays. */\n  (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);\n\n  /* Initialize input side of decompressor to consume first scan. */\n  (*cinfo->inputctl->start_input_pass) (cinfo);\n\n#ifdef D_MULTISCAN_FILES_SUPPORTED\n  /* If jpeg_start_decompress will read the whole file, initialize\n   * progress monitoring appropriately.  The input step is counted\n   * as one pass.\n   */\n  if (cinfo->progress != NULL && ! cinfo->buffered_image &&\n      cinfo->inputctl->has_multiple_scans) {\n    int nscans;\n    /* Estimate number of scans to set pass_limit. */\n    if (cinfo->progressive_mode) {\n      /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */\n      nscans = 2 + 3 * cinfo->num_components;\n    } else {\n      /* For a nonprogressive multiscan file, estimate 1 scan per component. */\n      nscans = cinfo->num_components;\n    }\n    cinfo->progress->pass_counter = 0L;\n    cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans;\n    cinfo->progress->completed_passes = 0;\n    cinfo->progress->total_passes = (cinfo->enable_2pass_quant ? 3 : 2);\n    /* Count the input pass as done */\n    master->pass_number++;\n  }\n#endif /* D_MULTISCAN_FILES_SUPPORTED */\n}\n\n\n/*\n * Per-pass setup.\n * This is called at the beginning of each output pass.  We determine which\n * modules will be active during this pass and give them appropriate\n * start_pass calls.  We also set is_dummy_pass to indicate whether this\n * is a \"real\" output pass or a dummy pass for color quantization.\n * (In the latter case, jdapistd.c will crank the pass to completion.)\n */\n\nMETHODDEF(void)\nprepare_for_output_pass (j_decompress_ptr cinfo)\n{\n  my_master_ptr master = (my_master_ptr) cinfo->master;\n\n  if (master->pub.is_dummy_pass) {\n#ifdef QUANT_2PASS_SUPPORTED\n    /* Final pass of 2-pass quantization */\n    master->pub.is_dummy_pass = FALSE;\n    (*cinfo->cquantize->start_pass) (cinfo, FALSE);\n    (*cinfo->post->start_pass) (cinfo, JBUF_CRANK_DEST);\n    (*cinfo->main->start_pass) (cinfo, JBUF_CRANK_DEST);\n#else\n    ERREXIT(cinfo, JERR_NOT_COMPILED);\n#endif /* QUANT_2PASS_SUPPORTED */\n  } else {\n    if (cinfo->quantize_colors && cinfo->colormap == NULL) {\n      /* Select new quantization method */\n      if (cinfo->two_pass_quantize && cinfo->enable_2pass_quant) {\n\tcinfo->cquantize = master->quantizer_2pass;\n\tmaster->pub.is_dummy_pass = TRUE;\n      } else if (cinfo->enable_1pass_quant) {\n\tcinfo->cquantize = master->quantizer_1pass;\n      } else {\n\tERREXIT(cinfo, JERR_MODE_CHANGE);\n      }\n    }\n    (*cinfo->idct->start_pass) (cinfo);\n    (*cinfo->coef->start_output_pass) (cinfo);\n    if (! cinfo->raw_data_out) {\n      if (! master->using_merged_upsample)\n\t(*cinfo->cconvert->start_pass) (cinfo);\n      (*cinfo->upsample->start_pass) (cinfo);\n      if (cinfo->quantize_colors)\n\t(*cinfo->cquantize->start_pass) (cinfo, master->pub.is_dummy_pass);\n      (*cinfo->post->start_pass) (cinfo,\n\t    (master->pub.is_dummy_pass ? JBUF_SAVE_AND_PASS : JBUF_PASS_THRU));\n      (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU);\n    }\n  }\n\n  /* Set up progress monitor's pass info if present */\n  if (cinfo->progress != NULL) {\n    cinfo->progress->completed_passes = master->pass_number;\n    cinfo->progress->total_passes = master->pass_number +\n\t\t\t\t    (master->pub.is_dummy_pass ? 2 : 1);\n    /* In buffered-image mode, we assume one more output pass if EOI not\n     * yet reached, but no more passes if EOI has been reached.\n     */\n    if (cinfo->buffered_image && ! cinfo->inputctl->eoi_reached) {\n      cinfo->progress->total_passes += (cinfo->enable_2pass_quant ? 2 : 1);\n    }\n  }\n}\n\n\n/*\n * Finish up at end of an output pass.\n */\n\nMETHODDEF(void)\nfinish_output_pass (j_decompress_ptr cinfo)\n{\n  my_master_ptr master = (my_master_ptr) cinfo->master;\n\n  if (cinfo->quantize_colors)\n    (*cinfo->cquantize->finish_pass) (cinfo);\n  master->pass_number++;\n}\n\n\n#ifdef D_MULTISCAN_FILES_SUPPORTED\n\n/*\n * Switch to a new external colormap between output passes.\n */\n\nGLOBAL(void)\njpeg_new_colormap (j_decompress_ptr cinfo)\n{\n  my_master_ptr master = (my_master_ptr) cinfo->master;\n\n  /* Prevent application from calling me at wrong times */\n  if (cinfo->global_state != DSTATE_BUFIMAGE)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n\n  if (cinfo->quantize_colors && cinfo->enable_external_quant &&\n      cinfo->colormap != NULL) {\n    /* Select 2-pass quantizer for external colormap use */\n    cinfo->cquantize = master->quantizer_2pass;\n    /* Notify quantizer of colormap change */\n    (*cinfo->cquantize->new_color_map) (cinfo);\n    master->pub.is_dummy_pass = FALSE; /* just in case */\n  } else\n    ERREXIT(cinfo, JERR_MODE_CHANGE);\n}\n\n#endif /* D_MULTISCAN_FILES_SUPPORTED */\n\n\n/*\n * Initialize master decompression control and select active modules.\n * This is performed at the start of jpeg_start_decompress.\n */\n\nGLOBAL(void)\njinit_master_decompress (j_decompress_ptr cinfo)\n{\n  my_master_ptr master;\n\n  master = (my_master_ptr)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  SIZEOF(my_decomp_master));\n  cinfo->master = (struct jpeg_decomp_master *) master;\n  master->pub.prepare_for_output_pass = prepare_for_output_pass;\n  master->pub.finish_output_pass = finish_output_pass;\n\n  master->pub.is_dummy_pass = FALSE;\n\n  master_selection(cinfo);\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jdmerge.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jdmerge.c\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains code for merged upsampling/color conversion.\n *\n * This file combines functions from jdsample.c and jdcolor.c;\n * read those files first to understand what's going on.\n *\n * When the chroma components are to be upsampled by simple replication\n * (ie, box filtering), we can save some work in color conversion by\n * calculating all the output pixels corresponding to a pair of chroma\n * samples at one time.  In the conversion equations\n *\tR = Y           + K1 * Cr\n *\tG = Y + K2 * Cb + K3 * Cr\n *\tB = Y + K4 * Cb\n * only the Y term varies among the group of pixels corresponding to a pair\n * of chroma samples, so the rest of the terms can be calculated just once.\n * At typical sampling ratios, this eliminates half or three-quarters of the\n * multiplications needed for color conversion.\n *\n * This file currently provides implementations for the following cases:\n *\tYCbCr => RGB color conversion only.\n *\tSampling ratios of 2h1v or 2h2v.\n *\tNo scaling needed at upsample time.\n *\tCorner-aligned (non-CCIR601) sampling alignment.\n * Other special cases could be added, but in most applications these are\n * the only common cases.  (For uncommon cases we fall back on the more\n * general code in jdsample.c and jdcolor.c.)\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n#ifdef UPSAMPLE_MERGING_SUPPORTED\n\n#ifdef _FX_MANAGED_CODE_\n#define my_upsampler\tmy_upsampler_m\n#endif\n\n/* Private subobject */\n\ntypedef struct {\n  struct jpeg_upsampler pub;\t/* public fields */\n\n  /* Pointer to routine to do actual upsampling/conversion of one row group */\n  JMETHOD(void, upmethod, (j_decompress_ptr cinfo,\n\t\t\t   JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,\n\t\t\t   JSAMPARRAY output_buf));\n\n  /* Private state for YCC->RGB conversion */\n  int * Cr_r_tab;\t\t/* => table for Cr to R conversion */\n  int * Cb_b_tab;\t\t/* => table for Cb to B conversion */\n  INT32 * Cr_g_tab;\t\t/* => table for Cr to G conversion */\n  INT32 * Cb_g_tab;\t\t/* => table for Cb to G conversion */\n\n  /* For 2:1 vertical sampling, we produce two output rows at a time.\n   * We need a \"spare\" row buffer to hold the second output row if the\n   * application provides just a one-row buffer; we also use the spare\n   * to discard the dummy last row if the image height is odd.\n   */\n  JSAMPROW spare_row;\n  boolean spare_full;\t\t/* T if spare buffer is occupied */\n\n  JDIMENSION out_row_width;\t/* samples per output row */\n  JDIMENSION rows_to_go;\t/* counts rows remaining in image */\n} my_upsampler;\n\ntypedef my_upsampler * my_upsample_ptr;\n\n#define SCALEBITS\t16\t/* speediest right-shift on some machines */\n#define ONE_HALF\t((INT32) 1 << (SCALEBITS-1))\n#define FIX(x)\t\t((INT32) ((x) * (1L<<SCALEBITS) + 0.5))\n\n\n/*\n * Initialize tables for YCC->RGB colorspace conversion.\n * This is taken directly from jdcolor.c; see that file for more info.\n */\n\nLOCAL(void)\nbuild_ycc_rgb_table (j_decompress_ptr cinfo)\n{\n  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;\n  int i;\n  INT32 x;\n  SHIFT_TEMPS\n\n  upsample->Cr_r_tab = (int *)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t(MAXJSAMPLE+1) * SIZEOF(int));\n  upsample->Cb_b_tab = (int *)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t(MAXJSAMPLE+1) * SIZEOF(int));\n  upsample->Cr_g_tab = (INT32 *)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t(MAXJSAMPLE+1) * SIZEOF(INT32));\n  upsample->Cb_g_tab = (INT32 *)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t(MAXJSAMPLE+1) * SIZEOF(INT32));\n\n  for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {\n    /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */\n    /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */\n    /* Cr=>R value is nearest int to 1.40200 * x */\n    upsample->Cr_r_tab[i] = (int)\n\t\t    RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS);\n    /* Cb=>B value is nearest int to 1.77200 * x */\n    upsample->Cb_b_tab[i] = (int)\n\t\t    RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS);\n    /* Cr=>G value is scaled-up -0.71414 * x */\n    upsample->Cr_g_tab[i] = (- FIX(0.71414)) * x;\n    /* Cb=>G value is scaled-up -0.34414 * x */\n    /* We also add in ONE_HALF so that need not do it in inner loop */\n    upsample->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF;\n  }\n}\n\n\n/*\n * Initialize for an upsampling pass.\n */\n\nMETHODDEF(void)\nstart_pass_merged_upsample (j_decompress_ptr cinfo)\n{\n  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;\n\n  /* Mark the spare buffer empty */\n  upsample->spare_full = FALSE;\n  /* Initialize total-height counter for detecting bottom of image */\n  upsample->rows_to_go = cinfo->output_height;\n}\n\n\n/*\n * Control routine to do upsampling (and color conversion).\n *\n * The control routine just handles the row buffering considerations.\n */\n\nMETHODDEF(void)\nmerged_2v_upsample (j_decompress_ptr cinfo,\n\t\t    JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,\n\t\t    JDIMENSION in_row_groups_avail,\n\t\t    JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t\t    JDIMENSION out_rows_avail)\n/* 2:1 vertical sampling case: may need a spare row. */\n{\n  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;\n  JSAMPROW work_ptrs[2];\n  JDIMENSION num_rows;\t\t/* number of rows returned to caller */\n\n  if (upsample->spare_full) {\n    /* If we have a spare row saved from a previous cycle, just return it. */\n    jcopy_sample_rows(& upsample->spare_row, 0, output_buf + *out_row_ctr, 0,\n\t\t      1, upsample->out_row_width);\n    num_rows = 1;\n    upsample->spare_full = FALSE;\n  } else {\n    /* Figure number of rows to return to caller. */\n    num_rows = 2;\n    /* Not more than the distance to the end of the image. */\n    if (num_rows > upsample->rows_to_go)\n      num_rows = upsample->rows_to_go;\n    /* And not more than what the client can accept: */\n    out_rows_avail -= *out_row_ctr;\n    if (num_rows > out_rows_avail)\n      num_rows = out_rows_avail;\n    /* Create output pointer array for upsampler. */\n    work_ptrs[0] = output_buf[*out_row_ctr];\n    if (num_rows > 1) {\n      work_ptrs[1] = output_buf[*out_row_ctr + 1];\n    } else {\n      work_ptrs[1] = upsample->spare_row;\n      upsample->spare_full = TRUE;\n    }\n    /* Now do the upsampling. */\n    (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, work_ptrs);\n  }\n\n  /* Adjust counts */\n  *out_row_ctr += num_rows;\n  upsample->rows_to_go -= num_rows;\n  /* When the buffer is emptied, declare this input row group consumed */\n  if (! upsample->spare_full)\n    (*in_row_group_ctr)++;\n}\n\n\nMETHODDEF(void)\nmerged_1v_upsample (j_decompress_ptr cinfo,\n\t\t    JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,\n\t\t    JDIMENSION in_row_groups_avail,\n\t\t    JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t\t    JDIMENSION out_rows_avail)\n/* 1:1 vertical sampling case: much easier, never need a spare row. */\n{\n  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;\n\n  /* Just do the upsampling. */\n  (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr,\n\t\t\t output_buf + *out_row_ctr);\n  /* Adjust counts */\n  (*out_row_ctr)++;\n  (*in_row_group_ctr)++;\n}\n\n\n/*\n * These are the routines invoked by the control routines to do\n * the actual upsampling/conversion.  One row group is processed per call.\n *\n * Note: since we may be writing directly into application-supplied buffers,\n * we have to be honest about the output width; we can't assume the buffer\n * has been rounded up to an even width.\n */\n\n\n/*\n * Upsample and color convert for the case of 2:1 horizontal and 1:1 vertical.\n */\n\nMETHODDEF(void)\nh2v1_merged_upsample (j_decompress_ptr cinfo,\n\t\t      JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,\n\t\t      JSAMPARRAY output_buf)\n{\n  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;\n  register int y, cred, cgreen, cblue;\n  int cb, cr;\n  register JSAMPROW outptr;\n  JSAMPROW inptr0, inptr1, inptr2;\n  JDIMENSION col;\n  /* copy these pointers into registers if possible */\n  register JSAMPLE * range_limit = cinfo->sample_range_limit;\n  int * Crrtab = upsample->Cr_r_tab;\n  int * Cbbtab = upsample->Cb_b_tab;\n  INT32 * Crgtab = upsample->Cr_g_tab;\n  INT32 * Cbgtab = upsample->Cb_g_tab;\n  SHIFT_TEMPS\n\n  inptr0 = input_buf[0][in_row_group_ctr];\n  inptr1 = input_buf[1][in_row_group_ctr];\n  inptr2 = input_buf[2][in_row_group_ctr];\n  outptr = output_buf[0];\n  /* Loop for each pair of output pixels */\n  for (col = cinfo->output_width >> 1; col > 0; col--) {\n    /* Do the chroma part of the calculation */\n    cb = GETJSAMPLE(*inptr1++);\n    cr = GETJSAMPLE(*inptr2++);\n    cred = Crrtab[cr];\n    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);\n    cblue = Cbbtab[cb];\n    /* Fetch 2 Y values and emit 2 pixels */\n    y  = GETJSAMPLE(*inptr0++);\n    outptr[RGB_RED] =   range_limit[y + cred];\n    outptr[RGB_GREEN] = range_limit[y + cgreen];\n    outptr[RGB_BLUE] =  range_limit[y + cblue];\n    outptr += RGB_PIXELSIZE;\n    y  = GETJSAMPLE(*inptr0++);\n    outptr[RGB_RED] =   range_limit[y + cred];\n    outptr[RGB_GREEN] = range_limit[y + cgreen];\n    outptr[RGB_BLUE] =  range_limit[y + cblue];\n    outptr += RGB_PIXELSIZE;\n  }\n  /* If image width is odd, do the last output column separately */\n  if (cinfo->output_width & 1) {\n    cb = GETJSAMPLE(*inptr1);\n    cr = GETJSAMPLE(*inptr2);\n    cred = Crrtab[cr];\n    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);\n    cblue = Cbbtab[cb];\n    y  = GETJSAMPLE(*inptr0);\n    outptr[RGB_RED] =   range_limit[y + cred];\n    outptr[RGB_GREEN] = range_limit[y + cgreen];\n    outptr[RGB_BLUE] =  range_limit[y + cblue];\n  }\n}\n\n\n/*\n * Upsample and color convert for the case of 2:1 horizontal and 2:1 vertical.\n */\n\nMETHODDEF(void)\nh2v2_merged_upsample (j_decompress_ptr cinfo,\n\t\t      JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,\n\t\t      JSAMPARRAY output_buf)\n{\n  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;\n  register int y, cred, cgreen, cblue;\n  int cb, cr;\n  register JSAMPROW outptr0, outptr1;\n  JSAMPROW inptr00, inptr01, inptr1, inptr2;\n  JDIMENSION col;\n  /* copy these pointers into registers if possible */\n  register JSAMPLE * range_limit = cinfo->sample_range_limit;\n  int * Crrtab = upsample->Cr_r_tab;\n  int * Cbbtab = upsample->Cb_b_tab;\n  INT32 * Crgtab = upsample->Cr_g_tab;\n  INT32 * Cbgtab = upsample->Cb_g_tab;\n  SHIFT_TEMPS\n\n  inptr00 = input_buf[0][in_row_group_ctr*2];\n  inptr01 = input_buf[0][in_row_group_ctr*2 + 1];\n  inptr1 = input_buf[1][in_row_group_ctr];\n  inptr2 = input_buf[2][in_row_group_ctr];\n  outptr0 = output_buf[0];\n  outptr1 = output_buf[1];\n  /* Loop for each group of output pixels */\n  for (col = cinfo->output_width >> 1; col > 0; col--) {\n    /* Do the chroma part of the calculation */\n    cb = GETJSAMPLE(*inptr1++);\n    cr = GETJSAMPLE(*inptr2++);\n    cred = Crrtab[cr];\n    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);\n    cblue = Cbbtab[cb];\n    /* Fetch 4 Y values and emit 4 pixels */\n    y  = GETJSAMPLE(*inptr00++);\n    outptr0[RGB_RED] =   range_limit[y + cred];\n    outptr0[RGB_GREEN] = range_limit[y + cgreen];\n    outptr0[RGB_BLUE] =  range_limit[y + cblue];\n    outptr0 += RGB_PIXELSIZE;\n    y  = GETJSAMPLE(*inptr00++);\n    outptr0[RGB_RED] =   range_limit[y + cred];\n    outptr0[RGB_GREEN] = range_limit[y + cgreen];\n    outptr0[RGB_BLUE] =  range_limit[y + cblue];\n    outptr0 += RGB_PIXELSIZE;\n    y  = GETJSAMPLE(*inptr01++);\n    outptr1[RGB_RED] =   range_limit[y + cred];\n    outptr1[RGB_GREEN] = range_limit[y + cgreen];\n    outptr1[RGB_BLUE] =  range_limit[y + cblue];\n    outptr1 += RGB_PIXELSIZE;\n    y  = GETJSAMPLE(*inptr01++);\n    outptr1[RGB_RED] =   range_limit[y + cred];\n    outptr1[RGB_GREEN] = range_limit[y + cgreen];\n    outptr1[RGB_BLUE] =  range_limit[y + cblue];\n    outptr1 += RGB_PIXELSIZE;\n  }\n  /* If image width is odd, do the last output column separately */\n  if (cinfo->output_width & 1) {\n    cb = GETJSAMPLE(*inptr1);\n    cr = GETJSAMPLE(*inptr2);\n    cred = Crrtab[cr];\n    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);\n    cblue = Cbbtab[cb];\n    y  = GETJSAMPLE(*inptr00);\n    outptr0[RGB_RED] =   range_limit[y + cred];\n    outptr0[RGB_GREEN] = range_limit[y + cgreen];\n    outptr0[RGB_BLUE] =  range_limit[y + cblue];\n    y  = GETJSAMPLE(*inptr01);\n    outptr1[RGB_RED] =   range_limit[y + cred];\n    outptr1[RGB_GREEN] = range_limit[y + cgreen];\n    outptr1[RGB_BLUE] =  range_limit[y + cblue];\n  }\n}\n\n\n/*\n * Module initialization routine for merged upsampling/color conversion.\n *\n * NB: this is called under the conditions determined by use_merged_upsample()\n * in jdmaster.c.  That routine MUST correspond to the actual capabilities\n * of this module; no safety checks are made here.\n */\n\nGLOBAL(void)\njinit_merged_upsampler (j_decompress_ptr cinfo)\n{\n  my_upsample_ptr upsample;\n\n  upsample = (my_upsample_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_upsampler));\n  cinfo->upsample = (struct jpeg_upsampler *) upsample;\n  upsample->pub.start_pass = start_pass_merged_upsample;\n  upsample->pub.need_context_rows = FALSE;\n\n  upsample->out_row_width = cinfo->output_width * cinfo->out_color_components;\n\n  if (cinfo->max_v_samp_factor == 2) {\n    upsample->pub.upsample = merged_2v_upsample;\n    upsample->upmethod = h2v2_merged_upsample;\n    /* Allocate a spare row buffer */\n    upsample->spare_row = (JSAMPROW)\n      (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t(size_t) (upsample->out_row_width * SIZEOF(JSAMPLE)));\n  } else {\n    upsample->pub.upsample = merged_1v_upsample;\n    upsample->upmethod = h2v1_merged_upsample;\n    /* No spare row needed */\n    upsample->spare_row = NULL;\n  }\n\n  build_ycc_rgb_table(cinfo);\n}\n\n#endif /* UPSAMPLE_MERGING_SUPPORTED */\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jdphuff.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jdphuff.c\n *\n * Copyright (C) 1995-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains Huffman entropy decoding routines for progressive JPEG.\n *\n * Much of the complexity here has to do with supporting input suspension.\n * If the data source module demands suspension, we want to be able to back\n * up to the start of the current MCU.  To do this, we copy state variables\n * into local working storage, and update them back to the permanent\n * storage only upon successful completion of an MCU.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jdhuff.h\"\t\t/* Declarations shared with jdhuff.c */\n\n\n#ifdef D_PROGRESSIVE_SUPPORTED\n\n/*\n * Expanded entropy decoder object for progressive Huffman decoding.\n *\n * The savable_state subrecord contains fields that change within an MCU,\n * but must not be updated permanently until we complete the MCU.\n */\n\ntypedef struct {\n  unsigned int EOBRUN;\t\t\t/* remaining EOBs in EOBRUN */\n  int last_dc_val[MAX_COMPS_IN_SCAN];\t/* last DC coef for each component */\n} savable_state;\n\n/* This macro is to work around compilers with missing or broken\n * structure assignment.  You'll need to fix this code if you have\n * such a compiler and you change MAX_COMPS_IN_SCAN.\n */\n\n#ifndef NO_STRUCT_ASSIGN\n#define ASSIGN_STATE(dest,src)  ((dest) = (src))\n#else\n#if MAX_COMPS_IN_SCAN == 4\n#define ASSIGN_STATE(dest,src)  \\\n\t((dest).EOBRUN = (src).EOBRUN, \\\n\t (dest).last_dc_val[0] = (src).last_dc_val[0], \\\n\t (dest).last_dc_val[1] = (src).last_dc_val[1], \\\n\t (dest).last_dc_val[2] = (src).last_dc_val[2], \\\n\t (dest).last_dc_val[3] = (src).last_dc_val[3])\n#endif\n#endif\n\n\ntypedef struct {\n  struct jpeg_entropy_decoder pub; /* public fields */\n\n  /* These fields are loaded into local variables at start of each MCU.\n   * In case of suspension, we exit WITHOUT updating them.\n   */\n  bitread_perm_state bitstate;\t/* Bit buffer at start of MCU */\n  savable_state saved;\t\t/* Other state at start of MCU */\n\n  /* These fields are NOT loaded into local working state. */\n  unsigned int restarts_to_go;\t/* MCUs left in this restart interval */\n\n  /* Pointers to derived tables (these workspaces have image lifespan) */\n  d_derived_tbl * derived_tbls[NUM_HUFF_TBLS];\n\n  d_derived_tbl * ac_derived_tbl; /* active table during an AC scan */\n} phuff_entropy_decoder;\n\ntypedef phuff_entropy_decoder * phuff_entropy_ptr;\n\n/* Forward declarations */\nMETHODDEF(boolean) decode_mcu_DC_first JPP((j_decompress_ptr cinfo,\n\t\t\t\t\t    JBLOCKROW *MCU_data));\nMETHODDEF(boolean) decode_mcu_AC_first JPP((j_decompress_ptr cinfo,\n\t\t\t\t\t    JBLOCKROW *MCU_data));\nMETHODDEF(boolean) decode_mcu_DC_refine JPP((j_decompress_ptr cinfo,\n\t\t\t\t\t     JBLOCKROW *MCU_data));\nMETHODDEF(boolean) decode_mcu_AC_refine JPP((j_decompress_ptr cinfo,\n\t\t\t\t\t     JBLOCKROW *MCU_data));\n\n\n/*\n * Initialize for a Huffman-compressed scan.\n */\n\nMETHODDEF(void)\nstart_pass_phuff_decoder (j_decompress_ptr cinfo)\n{\n  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;\n  boolean is_DC_band, bad;\n  int ci, coefi, tbl;\n  int *coef_bit_ptr;\n  jpeg_component_info * compptr;\n\n  is_DC_band = (cinfo->Ss == 0);\n\n  /* Validate scan parameters */\n  bad = FALSE;\n  if (is_DC_band) {\n    if (cinfo->Se != 0)\n      bad = TRUE;\n  } else {\n    /* need not check Ss/Se < 0 since they came from unsigned bytes */\n    if (cinfo->Ss > cinfo->Se || cinfo->Se >= DCTSIZE2)\n      bad = TRUE;\n    /* AC scans may have only one component */\n    if (cinfo->comps_in_scan != 1)\n      bad = TRUE;\n  }\n  if (cinfo->Ah != 0) {\n    /* Successive approximation refinement scan: must have Al = Ah-1. */\n    if (cinfo->Al != cinfo->Ah-1)\n      bad = TRUE;\n  }\n  if (cinfo->Al > 13)\t\t/* need not check for < 0 */\n    bad = TRUE;\n  /* Arguably the maximum Al value should be less than 13 for 8-bit precision,\n   * but the spec doesn't say so, and we try to be liberal about what we\n   * accept.  Note: large Al values could result in out-of-range DC\n   * coefficients during early scans, leading to bizarre displays due to\n   * overflows in the IDCT math.  But we won't crash.\n   */\n  if (bad)\n    ERREXIT4(cinfo, JERR_BAD_PROGRESSION,\n\t     cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al);\n  /* Update progression status, and verify that scan order is legal.\n   * Note that inter-scan inconsistencies are treated as warnings\n   * not fatal errors ... not clear if this is right way to behave.\n   */\n  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n    int cindex = cinfo->cur_comp_info[ci]->component_index;\n    coef_bit_ptr = & cinfo->coef_bits[cindex][0];\n    if (!is_DC_band && coef_bit_ptr[0] < 0) /* AC without prior DC scan */\n      WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0);\n    for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) {\n      int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi];\n      if (cinfo->Ah != expected)\n\tWARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi);\n      coef_bit_ptr[coefi] = cinfo->Al;\n    }\n  }\n\n  /* Select MCU decoding routine */\n  if (cinfo->Ah == 0) {\n    if (is_DC_band)\n      entropy->pub.decode_mcu = decode_mcu_DC_first;\n    else\n      entropy->pub.decode_mcu = decode_mcu_AC_first;\n  } else {\n    if (is_DC_band)\n      entropy->pub.decode_mcu = decode_mcu_DC_refine;\n    else\n      entropy->pub.decode_mcu = decode_mcu_AC_refine;\n  }\n\n  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n    compptr = cinfo->cur_comp_info[ci];\n    /* Make sure requested tables are present, and compute derived tables.\n     * We may build same derived table more than once, but it's not expensive.\n     */\n    if (is_DC_band) {\n      if (cinfo->Ah == 0) {\t/* DC refinement needs no table */\n\ttbl = compptr->dc_tbl_no;\n\tjpeg_make_d_derived_tbl(cinfo, TRUE, tbl,\n\t\t\t\t& entropy->derived_tbls[tbl]);\n      }\n    } else {\n      tbl = compptr->ac_tbl_no;\n      jpeg_make_d_derived_tbl(cinfo, FALSE, tbl,\n\t\t\t      & entropy->derived_tbls[tbl]);\n      /* remember the single active table */\n      entropy->ac_derived_tbl = entropy->derived_tbls[tbl];\n    }\n    /* Initialize DC predictions to 0 */\n    entropy->saved.last_dc_val[ci] = 0;\n  }\n\n  /* Initialize bitread state variables */\n  entropy->bitstate.bits_left = 0;\n  entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */\n  entropy->pub.insufficient_data = FALSE;\n\n  /* Initialize private state variables */\n  entropy->saved.EOBRUN = 0;\n\n  /* Initialize restart counter */\n  entropy->restarts_to_go = cinfo->restart_interval;\n}\n\n\n/*\n * Figure F.12: extend sign bit.\n * On some machines, a shift and add will be faster than a table lookup.\n */\n\n#ifdef AVOID_TABLES\n\n#define HUFF_EXTEND(x,s)  ((x) < (1<<((s)-1)) ? (x) + (((-1)<<(s)) + 1) : (x))\n\n#else\n\n#define HUFF_EXTEND(x,s)  ((x) < extend_test[s] ? (x) + extend_offset[s] : (x))\n\nstatic const int extend_test[16] =   /* entry n is 2**(n-1) */\n  { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,\n    0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 };\n\nstatic const int extend_offset[16] = /* entry n is (-1 << n) + 1 */\n  { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1,\n    ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1,\n    ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1,\n    ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 };\n\n#endif /* AVOID_TABLES */\n\n\n/*\n * Check for a restart marker & resynchronize decoder.\n * Returns FALSE if must suspend.\n */\n\nLOCAL(boolean)\nprocess_restart (j_decompress_ptr cinfo)\n{\n  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;\n  int ci;\n\n  /* Throw away any unused bits remaining in bit buffer; */\n  /* include any full bytes in next_marker's count of discarded bytes */\n  cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8;\n  entropy->bitstate.bits_left = 0;\n\n  /* Advance past the RSTn marker */\n  if (! (*cinfo->marker->read_restart_marker) (cinfo))\n    return FALSE;\n\n  /* Re-initialize DC predictions to 0 */\n  for (ci = 0; ci < cinfo->comps_in_scan; ci++)\n    entropy->saved.last_dc_val[ci] = 0;\n  /* Re-init EOB run count, too */\n  entropy->saved.EOBRUN = 0;\n\n  /* Reset restart counter */\n  entropy->restarts_to_go = cinfo->restart_interval;\n\n  /* Reset out-of-data flag, unless read_restart_marker left us smack up\n   * against a marker.  In that case we will end up treating the next data\n   * segment as empty, and we can avoid producing bogus output pixels by\n   * leaving the flag set.\n   */\n  if (cinfo->unread_marker == 0)\n    entropy->pub.insufficient_data = FALSE;\n\n  return TRUE;\n}\n\n\n/*\n * Huffman MCU decoding.\n * Each of these routines decodes and returns one MCU's worth of\n * Huffman-compressed coefficients. \n * The coefficients are reordered from zigzag order into natural array order,\n * but are not dequantized.\n *\n * The i'th block of the MCU is stored into the block pointed to by\n * MCU_data[i].  WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER.\n *\n * We return FALSE if data source requested suspension.  In that case no\n * changes have been made to permanent state.  (Exception: some output\n * coefficients may already have been assigned.  This is harmless for\n * spectral selection, since we'll just re-assign them on the next call.\n * Successive approximation AC refinement has to be more careful, however.)\n */\n\n/*\n * MCU decoding for DC initial scan (either spectral selection,\n * or first pass of successive approximation).\n */\n\nMETHODDEF(boolean)\ndecode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)\n{   \n  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;\n  int Al = cinfo->Al;\n  register int s, r;\n  int blkn, ci;\n  JBLOCKROW block;\n  BITREAD_STATE_VARS;\n  savable_state state;\n  d_derived_tbl * tbl;\n  jpeg_component_info * compptr;\n\n  /* Process restart marker if needed; may have to suspend */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0)\n      if (! process_restart(cinfo))\n\treturn FALSE;\n  }\n\n  /* If we've run out of data, just leave the MCU set to zeroes.\n   * This way, we return uniform gray for the remainder of the segment.\n   */\n  if (! entropy->pub.insufficient_data) {\n\n    /* Load up working state */\n    BITREAD_LOAD_STATE(cinfo,entropy->bitstate);\n    ASSIGN_STATE(state, entropy->saved);\n\n    /* Outer loop handles each block in the MCU */\n\n    for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {\n      block = MCU_data[blkn];\n      ci = cinfo->MCU_membership[blkn];\n      compptr = cinfo->cur_comp_info[ci];\n      tbl = entropy->derived_tbls[compptr->dc_tbl_no];\n\n      /* Decode a single block's worth of coefficients */\n\n      /* Section F.2.2.1: decode the DC coefficient difference */\n      HUFF_DECODE(s, br_state, tbl, return FALSE, label1);\n      if (s) {\n\tCHECK_BIT_BUFFER(br_state, s, return FALSE);\n\tr = GET_BITS(s);\n\ts = HUFF_EXTEND(r, s);\n      }\n\n      /* Convert DC difference to actual value, update last_dc_val */\n      s += state.last_dc_val[ci];\n      state.last_dc_val[ci] = s;\n      /* Scale and output the coefficient (assumes jpeg_natural_order[0]=0) */\n      (*block)[0] = (JCOEF) (s << Al);\n    }\n\n    /* Completed MCU, so update state */\n    BITREAD_SAVE_STATE(cinfo,entropy->bitstate);\n    ASSIGN_STATE(entropy->saved, state);\n  }\n\n  /* Account for restart interval (no-op if not using restarts) */\n  entropy->restarts_to_go--;\n\n  return TRUE;\n}\n\n\n/*\n * MCU decoding for AC initial scan (either spectral selection,\n * or first pass of successive approximation).\n */\n\nMETHODDEF(boolean)\ndecode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)\n{   \n  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;\n  int Se = cinfo->Se;\n  int Al = cinfo->Al;\n  register int s, k, r;\n  unsigned int EOBRUN;\n  JBLOCKROW block;\n  BITREAD_STATE_VARS;\n  d_derived_tbl * tbl;\n\n  /* Process restart marker if needed; may have to suspend */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0)\n      if (! process_restart(cinfo))\n\treturn FALSE;\n  }\n\n  /* If we've run out of data, just leave the MCU set to zeroes.\n   * This way, we return uniform gray for the remainder of the segment.\n   */\n  if (! entropy->pub.insufficient_data) {\n\n    /* Load up working state.\n     * We can avoid loading/saving bitread state if in an EOB run.\n     */\n    EOBRUN = entropy->saved.EOBRUN;\t/* only part of saved state we need */\n\n    /* There is always only one block per MCU */\n\n    if (EOBRUN > 0)\t\t/* if it's a band of zeroes... */\n      EOBRUN--;\t\t\t/* ...process it now (we do nothing) */\n    else {\n      BITREAD_LOAD_STATE(cinfo,entropy->bitstate);\n      block = MCU_data[0];\n      tbl = entropy->ac_derived_tbl;\n\n      for (k = cinfo->Ss; k <= Se; k++) {\n\tHUFF_DECODE(s, br_state, tbl, return FALSE, label2);\n\tr = s >> 4;\n\ts &= 15;\n\tif (s) {\n\t  k += r;\n\t  CHECK_BIT_BUFFER(br_state, s, return FALSE);\n\t  r = GET_BITS(s);\n\t  s = HUFF_EXTEND(r, s);\n\t  /* Scale and output coefficient in natural (dezigzagged) order */\n\t  (*block)[jpeg_natural_order[k]] = (JCOEF) (s << Al);\n\t} else {\n\t  if (r == 15) {\t/* ZRL */\n\t    k += 15;\t\t/* skip 15 zeroes in band */\n\t  } else {\t\t/* EOBr, run length is 2^r + appended bits */\n\t    EOBRUN = 1 << r;\n\t    if (r) {\t\t/* EOBr, r > 0 */\n\t      CHECK_BIT_BUFFER(br_state, r, return FALSE);\n\t      r = GET_BITS(r);\n\t      EOBRUN += r;\n\t    }\n\t    EOBRUN--;\t\t/* this band is processed at this moment */\n\t    break;\t\t/* force end-of-band */\n\t  }\n\t}\n      }\n\n      BITREAD_SAVE_STATE(cinfo,entropy->bitstate);\n    }\n\n    /* Completed MCU, so update state */\n    entropy->saved.EOBRUN = EOBRUN;\t/* only part of saved state we need */\n  }\n\n  /* Account for restart interval (no-op if not using restarts) */\n  entropy->restarts_to_go--;\n\n  return TRUE;\n}\n\n\n/*\n * MCU decoding for DC successive approximation refinement scan.\n * Note: we assume such scans can be multi-component, although the spec\n * is not very clear on the point.\n */\n\nMETHODDEF(boolean)\ndecode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)\n{   \n  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;\n  int p1 = 1 << cinfo->Al;\t/* 1 in the bit position being coded */\n  int blkn;\n  JBLOCKROW block;\n  BITREAD_STATE_VARS;\n\n  /* Process restart marker if needed; may have to suspend */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0)\n      if (! process_restart(cinfo))\n\treturn FALSE;\n  }\n\n  /* Not worth the cycles to check insufficient_data here,\n   * since we will not change the data anyway if we read zeroes.\n   */\n\n  /* Load up working state */\n  BITREAD_LOAD_STATE(cinfo,entropy->bitstate);\n\n  /* Outer loop handles each block in the MCU */\n\n  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {\n    block = MCU_data[blkn];\n\n    /* Encoded data is simply the next bit of the two's-complement DC value */\n    CHECK_BIT_BUFFER(br_state, 1, return FALSE);\n    if (GET_BITS(1))\n      (*block)[0] |= p1;\n    /* Note: since we use |=, repeating the assignment later is safe */\n  }\n\n  /* Completed MCU, so update state */\n  BITREAD_SAVE_STATE(cinfo,entropy->bitstate);\n\n  /* Account for restart interval (no-op if not using restarts) */\n  entropy->restarts_to_go--;\n\n  return TRUE;\n}\n\n\n/*\n * MCU decoding for AC successive approximation refinement scan.\n */\n\nMETHODDEF(boolean)\ndecode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)\n{   \n  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;\n  int Se = cinfo->Se;\n  int p1 = 1 << cinfo->Al;\t/* 1 in the bit position being coded */\n  int m1 = (-1) << cinfo->Al;\t/* -1 in the bit position being coded */\n  register int s, k, r;\n  unsigned int EOBRUN;\n  JBLOCKROW block;\n  JCOEFPTR thiscoef;\n  BITREAD_STATE_VARS;\n  d_derived_tbl * tbl;\n  int num_newnz;\n  int newnz_pos[DCTSIZE2];\n\n  /* Process restart marker if needed; may have to suspend */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0)\n      if (! process_restart(cinfo))\n\treturn FALSE;\n  }\n\n  /* If we've run out of data, don't modify the MCU.\n   */\n  if (! entropy->pub.insufficient_data) {\n\n    /* Load up working state */\n    BITREAD_LOAD_STATE(cinfo,entropy->bitstate);\n    EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */\n\n    /* There is always only one block per MCU */\n    block = MCU_data[0];\n    tbl = entropy->ac_derived_tbl;\n\n    /* If we are forced to suspend, we must undo the assignments to any newly\n     * nonzero coefficients in the block, because otherwise we'd get confused\n     * next time about which coefficients were already nonzero.\n     * But we need not undo addition of bits to already-nonzero coefficients;\n     * instead, we can test the current bit to see if we already did it.\n     */\n    num_newnz = 0;\n\n    /* initialize coefficient loop counter to start of band */\n    k = cinfo->Ss;\n\n    if (EOBRUN == 0) {\n      for (; k <= Se; k++) {\n\tHUFF_DECODE(s, br_state, tbl, goto undoit, label3);\n\tr = s >> 4;\n\ts &= 15;\n\tif (s) {\n\t  if (s != 1)\t\t/* size of new coef should always be 1 */\n\t    WARNMS(cinfo, JWRN_HUFF_BAD_CODE);\n\t  CHECK_BIT_BUFFER(br_state, 1, goto undoit);\n\t  if (GET_BITS(1))\n\t    s = p1;\t\t/* newly nonzero coef is positive */\n\t  else\n\t    s = m1;\t\t/* newly nonzero coef is negative */\n\t} else {\n\t  if (r != 15) {\n\t    EOBRUN = 1 << r;\t/* EOBr, run length is 2^r + appended bits */\n\t    if (r) {\n\t      CHECK_BIT_BUFFER(br_state, r, goto undoit);\n\t      r = GET_BITS(r);\n\t      EOBRUN += r;\n\t    }\n\t    break;\t\t/* rest of block is handled by EOB logic */\n\t  }\n\t  /* note s = 0 for processing ZRL */\n\t}\n\t/* Advance over already-nonzero coefs and r still-zero coefs,\n\t * appending correction bits to the nonzeroes.  A correction bit is 1\n\t * if the absolute value of the coefficient must be increased.\n\t */\n\tdo {\n\t  thiscoef = *block + jpeg_natural_order[k];\n\t  if (*thiscoef != 0) {\n\t    CHECK_BIT_BUFFER(br_state, 1, goto undoit);\n\t    if (GET_BITS(1)) {\n\t      if ((*thiscoef & p1) == 0) { /* do nothing if already set it */\n\t\tif (*thiscoef >= 0)\n\t\t  *thiscoef += p1;\n\t\telse\n\t\t  *thiscoef += m1;\n\t      }\n\t    }\n\t  } else {\n\t    if (--r < 0)\n\t      break;\t\t/* reached target zero coefficient */\n\t  }\n\t  k++;\n\t} while (k <= Se);\n\tif (s) {\n\t  int pos = jpeg_natural_order[k];\n\t  /* Output newly nonzero coefficient */\n\t  (*block)[pos] = (JCOEF) s;\n\t  /* Remember its position in case we have to suspend */\n\t  newnz_pos[num_newnz++] = pos;\n\t}\n      }\n    }\n\n    if (EOBRUN > 0) {\n      /* Scan any remaining coefficient positions after the end-of-band\n       * (the last newly nonzero coefficient, if any).  Append a correction\n       * bit to each already-nonzero coefficient.  A correction bit is 1\n       * if the absolute value of the coefficient must be increased.\n       */\n      for (; k <= Se; k++) {\n\tthiscoef = *block + jpeg_natural_order[k];\n\tif (*thiscoef != 0) {\n\t  CHECK_BIT_BUFFER(br_state, 1, goto undoit);\n\t  if (GET_BITS(1)) {\n\t    if ((*thiscoef & p1) == 0) { /* do nothing if already changed it */\n\t      if (*thiscoef >= 0)\n\t\t*thiscoef += p1;\n\t      else\n\t\t*thiscoef += m1;\n\t    }\n\t  }\n\t}\n      }\n      /* Count one block completed in EOB run */\n      EOBRUN--;\n    }\n\n    /* Completed MCU, so update state */\n    BITREAD_SAVE_STATE(cinfo,entropy->bitstate);\n    entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */\n  }\n\n  /* Account for restart interval (no-op if not using restarts) */\n  entropy->restarts_to_go--;\n\n  return TRUE;\n\nundoit:\n  /* Re-zero any output coefficients that we made newly nonzero */\n  while (num_newnz > 0)\n    (*block)[newnz_pos[--num_newnz]] = 0;\n\n  return FALSE;\n}\n\n\n/*\n * Module initialization routine for progressive Huffman entropy decoding.\n */\n\nGLOBAL(void)\njinit_phuff_decoder (j_decompress_ptr cinfo)\n{\n  phuff_entropy_ptr entropy;\n  int *coef_bit_ptr;\n  int ci, i;\n\n  entropy = (phuff_entropy_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(phuff_entropy_decoder));\n  cinfo->entropy = (struct jpeg_entropy_decoder *) entropy;\n  entropy->pub.start_pass = start_pass_phuff_decoder;\n\n  /* Mark derived tables unallocated */\n  for (i = 0; i < NUM_HUFF_TBLS; i++) {\n    entropy->derived_tbls[i] = NULL;\n  }\n\n  /* Create progression status table */\n  cinfo->coef_bits = (int (*)[DCTSIZE2])\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tcinfo->num_components*DCTSIZE2*SIZEOF(int));\n  coef_bit_ptr = & cinfo->coef_bits[0][0];\n  for (ci = 0; ci < cinfo->num_components; ci++) \n    for (i = 0; i < DCTSIZE2; i++)\n      *coef_bit_ptr++ = -1;\n}\n\n#endif /* D_PROGRESSIVE_SUPPORTED */\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jdpostct.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jdpostct.c\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains the decompression postprocessing controller.\n * This controller manages the upsampling, color conversion, and color\n * quantization/reduction steps; specifically, it controls the buffering\n * between upsample/color conversion and color quantization/reduction.\n *\n * If no color quantization/reduction is required, then this module has no\n * work to do, and it just hands off to the upsample/color conversion code.\n * An integrated upsample/convert/quantize process would replace this module\n * entirely.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Private buffer controller object */\n\ntypedef struct {\n  struct jpeg_d_post_controller pub; /* public fields */\n\n  /* Color quantization source buffer: this holds output data from\n   * the upsample/color conversion step to be passed to the quantizer.\n   * For two-pass color quantization, we need a full-image buffer;\n   * for one-pass operation, a strip buffer is sufficient.\n   */\n  jvirt_sarray_ptr whole_image;\t/* virtual array, or NULL if one-pass */\n  JSAMPARRAY buffer;\t\t/* strip buffer, or current strip of virtual */\n  JDIMENSION strip_height;\t/* buffer size in rows */\n  /* for two-pass mode only: */\n  JDIMENSION starting_row;\t/* row # of first row in current strip */\n  JDIMENSION next_row;\t\t/* index of next row to fill/empty in strip */\n} my_post_controller;\n\ntypedef my_post_controller * my_post_ptr;\n\n\n/* Forward declarations */\nMETHODDEF(void) post_process_1pass\n\tJPP((j_decompress_ptr cinfo,\n\t     JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,\n\t     JDIMENSION in_row_groups_avail,\n\t     JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t     JDIMENSION out_rows_avail));\n#ifdef QUANT_2PASS_SUPPORTED\nMETHODDEF(void) post_process_prepass\n\tJPP((j_decompress_ptr cinfo,\n\t     JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,\n\t     JDIMENSION in_row_groups_avail,\n\t     JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t     JDIMENSION out_rows_avail));\nMETHODDEF(void) post_process_2pass\n\tJPP((j_decompress_ptr cinfo,\n\t     JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,\n\t     JDIMENSION in_row_groups_avail,\n\t     JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t     JDIMENSION out_rows_avail));\n#endif\n\n\n/*\n * Initialize for a processing pass.\n */\n\nMETHODDEF(void)\nstart_pass_dpost (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)\n{\n  my_post_ptr post = (my_post_ptr) cinfo->post;\n\n  switch (pass_mode) {\n  case JBUF_PASS_THRU:\n    if (cinfo->quantize_colors) {\n      /* Single-pass processing with color quantization. */\n      post->pub.post_process_data = post_process_1pass;\n      /* We could be doing buffered-image output before starting a 2-pass\n       * color quantization; in that case, jinit_d_post_controller did not\n       * allocate a strip buffer.  Use the virtual-array buffer as workspace.\n       */\n      if (post->buffer == NULL) {\n\tpost->buffer = (*cinfo->mem->access_virt_sarray)\n\t  ((j_common_ptr) cinfo, post->whole_image,\n\t   (JDIMENSION) 0, post->strip_height, TRUE);\n      }\n    } else {\n      /* For single-pass processing without color quantization,\n       * I have no work to do; just call the upsampler directly.\n       */\n      post->pub.post_process_data = cinfo->upsample->upsample;\n    }\n    break;\n#ifdef QUANT_2PASS_SUPPORTED\n  case JBUF_SAVE_AND_PASS:\n    /* First pass of 2-pass quantization */\n    if (post->whole_image == NULL)\n      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n    post->pub.post_process_data = post_process_prepass;\n    break;\n  case JBUF_CRANK_DEST:\n    /* Second pass of 2-pass quantization */\n    if (post->whole_image == NULL)\n      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n    post->pub.post_process_data = post_process_2pass;\n    break;\n#endif /* QUANT_2PASS_SUPPORTED */\n  default:\n    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n    break;\n  }\n  post->starting_row = post->next_row = 0;\n}\n\n\n/*\n * Process some data in the one-pass (strip buffer) case.\n * This is used for color precision reduction as well as one-pass quantization.\n */\n\nMETHODDEF(void)\npost_process_1pass (j_decompress_ptr cinfo,\n\t\t    JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,\n\t\t    JDIMENSION in_row_groups_avail,\n\t\t    JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t\t    JDIMENSION out_rows_avail)\n{\n  my_post_ptr post = (my_post_ptr) cinfo->post;\n  JDIMENSION num_rows, max_rows;\n\n  /* Fill the buffer, but not more than what we can dump out in one go. */\n  /* Note we rely on the upsampler to detect bottom of image. */\n  max_rows = out_rows_avail - *out_row_ctr;\n  if (max_rows > post->strip_height)\n    max_rows = post->strip_height;\n  num_rows = 0;\n  (*cinfo->upsample->upsample) (cinfo,\n\t\tinput_buf, in_row_group_ctr, in_row_groups_avail,\n\t\tpost->buffer, &num_rows, max_rows);\n  /* Quantize and emit data. */\n  (*cinfo->cquantize->color_quantize) (cinfo,\n\t\tpost->buffer, output_buf + *out_row_ctr, (int) num_rows);\n  *out_row_ctr += num_rows;\n}\n\n\n#ifdef QUANT_2PASS_SUPPORTED\n\n/*\n * Process some data in the first pass of 2-pass quantization.\n */\n\nMETHODDEF(void)\npost_process_prepass (j_decompress_ptr cinfo,\n\t\t      JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,\n\t\t      JDIMENSION in_row_groups_avail,\n\t\t      JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t\t      JDIMENSION out_rows_avail)\n{\n  my_post_ptr post = (my_post_ptr) cinfo->post;\n  JDIMENSION old_next_row, num_rows;\n\n  /* Reposition virtual buffer if at start of strip. */\n  if (post->next_row == 0) {\n    post->buffer = (*cinfo->mem->access_virt_sarray)\n\t((j_common_ptr) cinfo, post->whole_image,\n\t post->starting_row, post->strip_height, TRUE);\n  }\n\n  /* Upsample some data (up to a strip height's worth). */\n  old_next_row = post->next_row;\n  (*cinfo->upsample->upsample) (cinfo,\n\t\tinput_buf, in_row_group_ctr, in_row_groups_avail,\n\t\tpost->buffer, &post->next_row, post->strip_height);\n\n  /* Allow quantizer to scan new data.  No data is emitted, */\n  /* but we advance out_row_ctr so outer loop can tell when we're done. */\n  if (post->next_row > old_next_row) {\n    num_rows = post->next_row - old_next_row;\n    (*cinfo->cquantize->color_quantize) (cinfo, post->buffer + old_next_row,\n\t\t\t\t\t (JSAMPARRAY) NULL, (int) num_rows);\n    *out_row_ctr += num_rows;\n  }\n\n  /* Advance if we filled the strip. */\n  if (post->next_row >= post->strip_height) {\n    post->starting_row += post->strip_height;\n    post->next_row = 0;\n  }\n}\n\n\n/*\n * Process some data in the second pass of 2-pass quantization.\n */\n\nMETHODDEF(void)\npost_process_2pass (j_decompress_ptr cinfo,\n\t\t    JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,\n\t\t    JDIMENSION in_row_groups_avail,\n\t\t    JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t\t    JDIMENSION out_rows_avail)\n{\n  my_post_ptr post = (my_post_ptr) cinfo->post;\n  JDIMENSION num_rows, max_rows;\n\n  /* Reposition virtual buffer if at start of strip. */\n  if (post->next_row == 0) {\n    post->buffer = (*cinfo->mem->access_virt_sarray)\n\t((j_common_ptr) cinfo, post->whole_image,\n\t post->starting_row, post->strip_height, FALSE);\n  }\n\n  /* Determine number of rows to emit. */\n  num_rows = post->strip_height - post->next_row; /* available in strip */\n  max_rows = out_rows_avail - *out_row_ctr; /* available in output area */\n  if (num_rows > max_rows)\n    num_rows = max_rows;\n  /* We have to check bottom of image here, can't depend on upsampler. */\n  max_rows = cinfo->output_height - post->starting_row;\n  if (num_rows > max_rows)\n    num_rows = max_rows;\n\n  /* Quantize and emit data. */\n  (*cinfo->cquantize->color_quantize) (cinfo,\n\t\tpost->buffer + post->next_row, output_buf + *out_row_ctr,\n\t\t(int) num_rows);\n  *out_row_ctr += num_rows;\n\n  /* Advance if we filled the strip. */\n  post->next_row += num_rows;\n  if (post->next_row >= post->strip_height) {\n    post->starting_row += post->strip_height;\n    post->next_row = 0;\n  }\n}\n\n#endif /* QUANT_2PASS_SUPPORTED */\n\n\n/*\n * Initialize postprocessing controller.\n */\n\nGLOBAL(void)\njinit_d_post_controller (j_decompress_ptr cinfo, boolean need_full_buffer)\n{\n  my_post_ptr post;\n\n  post = (my_post_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_post_controller));\n  cinfo->post = (struct jpeg_d_post_controller *) post;\n  post->pub.start_pass = start_pass_dpost;\n  post->whole_image = NULL;\t/* flag for no virtual arrays */\n  post->buffer = NULL;\t\t/* flag for no strip buffer */\n\n  /* Create the quantization buffer, if needed */\n  if (cinfo->quantize_colors) {\n    /* The buffer strip height is max_v_samp_factor, which is typically\n     * an efficient number of rows for upsampling to return.\n     * (In the presence of output rescaling, we might want to be smarter?)\n     */\n    post->strip_height = (JDIMENSION) cinfo->max_v_samp_factor;\n    if (need_full_buffer) {\n      /* Two-pass color quantization: need full-image storage. */\n      /* We round up the number of rows to a multiple of the strip height. */\n#ifdef QUANT_2PASS_SUPPORTED\n      post->whole_image = (*cinfo->mem->request_virt_sarray)\n\t((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,\n\t cinfo->output_width * cinfo->out_color_components,\n\t (JDIMENSION) jround_up((long) cinfo->output_height,\n\t\t\t\t(long) post->strip_height),\n\t post->strip_height);\n#else\n      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n#endif /* QUANT_2PASS_SUPPORTED */\n    } else {\n      /* One-pass color quantization: just make a strip buffer. */\n      post->buffer = (*cinfo->mem->alloc_sarray)\n\t((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t cinfo->output_width * cinfo->out_color_components,\n\t post->strip_height);\n    }\n  }\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jdsample.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jdsample.c\n *\n * Copyright (C) 1991-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains upsampling routines.\n *\n * Upsampling input data is counted in \"row groups\".  A row group\n * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size)\n * sample rows of each component.  Upsampling will normally produce\n * max_v_samp_factor pixel rows from each row group (but this could vary\n * if the upsampler is applying a scale factor of its own).\n *\n * An excellent reference for image resampling is\n *   Digital Image Warping, George Wolberg, 1990.\n *   Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Pointer to routine to upsample a single component */\ntypedef JMETHOD(void, upsample1_ptr,\n\t\t(j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\t JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr));\n\n/* Private subobject */\n\ntypedef struct {\n  struct jpeg_upsampler pub;\t/* public fields */\n\n  /* Color conversion buffer.  When using separate upsampling and color\n   * conversion steps, this buffer holds one upsampled row group until it\n   * has been color converted and output.\n   * Note: we do not allocate any storage for component(s) which are full-size,\n   * ie do not need rescaling.  The corresponding entry of color_buf[] is\n   * simply set to point to the input data array, thereby avoiding copying.\n   */\n  JSAMPARRAY color_buf[MAX_COMPONENTS];\n\n  /* Per-component upsampling method pointers */\n  upsample1_ptr methods[MAX_COMPONENTS];\n\n  int next_row_out;\t\t/* counts rows emitted from color_buf */\n  JDIMENSION rows_to_go;\t/* counts rows remaining in image */\n\n  /* Height of an input row group for each component. */\n  int rowgroup_height[MAX_COMPONENTS];\n\n  /* These arrays save pixel expansion factors so that int_expand need not\n   * recompute them each time.  They are unused for other upsampling methods.\n   */\n  UINT8 h_expand[MAX_COMPONENTS];\n  UINT8 v_expand[MAX_COMPONENTS];\n} my_upsampler;\n\ntypedef my_upsampler * my_upsample_ptr;\n\n\n/*\n * Initialize for an upsampling pass.\n */\n\nMETHODDEF(void)\nstart_pass_upsample (j_decompress_ptr cinfo)\n{\n  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;\n\n  /* Mark the conversion buffer empty */\n  upsample->next_row_out = cinfo->max_v_samp_factor;\n  /* Initialize total-height counter for detecting bottom of image */\n  upsample->rows_to_go = cinfo->output_height;\n}\n\n\n/*\n * Control routine to do upsampling (and color conversion).\n *\n * In this version we upsample each component independently.\n * We upsample one row group into the conversion buffer, then apply\n * color conversion a row at a time.\n */\n\nMETHODDEF(void)\nsep_upsample (j_decompress_ptr cinfo,\n\t      JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,\n\t      JDIMENSION in_row_groups_avail,\n\t      JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t      JDIMENSION out_rows_avail)\n{\n  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;\n  int ci;\n  jpeg_component_info * compptr;\n  JDIMENSION num_rows;\n\n  /* Fill the conversion buffer, if it's empty */\n  if (upsample->next_row_out >= cinfo->max_v_samp_factor) {\n    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n\t ci++, compptr++) {\n      /* Invoke per-component upsample method.  Notice we pass a POINTER\n       * to color_buf[ci], so that fullsize_upsample can change it.\n       */\n      (*upsample->methods[ci]) (cinfo, compptr,\n\tinput_buf[ci] + (*in_row_group_ctr * upsample->rowgroup_height[ci]),\n\tupsample->color_buf + ci);\n    }\n    upsample->next_row_out = 0;\n  }\n\n  /* Color-convert and emit rows */\n\n  /* How many we have in the buffer: */\n  num_rows = (JDIMENSION) (cinfo->max_v_samp_factor - upsample->next_row_out);\n  /* Not more than the distance to the end of the image.  Need this test\n   * in case the image height is not a multiple of max_v_samp_factor:\n   */\n  if (num_rows > upsample->rows_to_go) \n    num_rows = upsample->rows_to_go;\n  /* And not more than what the client can accept: */\n  out_rows_avail -= *out_row_ctr;\n  if (num_rows > out_rows_avail)\n    num_rows = out_rows_avail;\n\n  (*cinfo->cconvert->color_convert) (cinfo, upsample->color_buf,\n\t\t\t\t     (JDIMENSION) upsample->next_row_out,\n\t\t\t\t     output_buf + *out_row_ctr,\n\t\t\t\t     (int) num_rows);\n\n  /* Adjust counts */\n  *out_row_ctr += num_rows;\n  upsample->rows_to_go -= num_rows;\n  upsample->next_row_out += num_rows;\n  /* When the buffer is emptied, declare this input row group consumed */\n  if (upsample->next_row_out >= cinfo->max_v_samp_factor)\n    (*in_row_group_ctr)++;\n}\n\n\n/*\n * These are the routines invoked by sep_upsample to upsample pixel values\n * of a single component.  One row group is processed per call.\n */\n\n\n/*\n * For full-size components, we just make color_buf[ci] point at the\n * input buffer, and thus avoid copying any data.  Note that this is\n * safe only because sep_upsample doesn't declare the input row group\n * \"consumed\" until we are done color converting and emitting it.\n */\n\nMETHODDEF(void)\nfullsize_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\t   JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)\n{\n  *output_data_ptr = input_data;\n}\n\n\n/*\n * This is a no-op version used for \"uninteresting\" components.\n * These components will not be referenced by color conversion.\n */\n\nMETHODDEF(void)\nnoop_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t       JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)\n{\n  *output_data_ptr = NULL;\t/* safety check */\n}\n\n\n/*\n * This version handles any integral sampling ratios.\n * This is not used for typical JPEG files, so it need not be fast.\n * Nor, for that matter, is it particularly accurate: the algorithm is\n * simple replication of the input pixel onto the corresponding output\n * pixels.  The hi-falutin sampling literature refers to this as a\n * \"box filter\".  A box filter tends to introduce visible artifacts,\n * so if you are actually going to use 3:1 or 4:1 sampling ratios\n * you would be well advised to improve this code.\n */\n\nMETHODDEF(void)\nint_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t      JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)\n{\n  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;\n  JSAMPARRAY output_data = *output_data_ptr;\n  register JSAMPROW inptr, outptr;\n  register JSAMPLE invalue;\n  register int h;\n  JSAMPROW outend;\n  int h_expand, v_expand;\n  int inrow, outrow;\n\n  h_expand = upsample->h_expand[compptr->component_index];\n  v_expand = upsample->v_expand[compptr->component_index];\n\n  inrow = outrow = 0;\n  while (outrow < cinfo->max_v_samp_factor) {\n    /* Generate one output row with proper horizontal expansion */\n    inptr = input_data[inrow];\n    outptr = output_data[outrow];\n    outend = outptr + cinfo->output_width;\n    while (outptr < outend) {\n      invalue = *inptr++;\t/* don't need GETJSAMPLE() here */\n      for (h = h_expand; h > 0; h--) {\n\t*outptr++ = invalue;\n      }\n    }\n    /* Generate any additional output rows by duplicating the first one */\n    if (v_expand > 1) {\n      jcopy_sample_rows(output_data, outrow, output_data, outrow+1,\n\t\t\tv_expand-1, cinfo->output_width);\n    }\n    inrow++;\n    outrow += v_expand;\n  }\n}\n\n\n/*\n * Fast processing for the common case of 2:1 horizontal and 1:1 vertical.\n * It's still a box filter.\n */\n\nMETHODDEF(void)\nh2v1_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t       JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)\n{\n  JSAMPARRAY output_data = *output_data_ptr;\n  register JSAMPROW inptr, outptr;\n  register JSAMPLE invalue;\n  JSAMPROW outend;\n  int inrow;\n\n  for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) {\n    inptr = input_data[inrow];\n    outptr = output_data[inrow];\n    outend = outptr + cinfo->output_width;\n    while (outptr < outend) {\n      invalue = *inptr++;\t/* don't need GETJSAMPLE() here */\n      *outptr++ = invalue;\n      *outptr++ = invalue;\n    }\n  }\n}\n\n\n/*\n * Fast processing for the common case of 2:1 horizontal and 2:1 vertical.\n * It's still a box filter.\n */\n\nMETHODDEF(void)\nh2v2_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t       JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)\n{\n  JSAMPARRAY output_data = *output_data_ptr;\n  register JSAMPROW inptr, outptr;\n  register JSAMPLE invalue;\n  JSAMPROW outend;\n  int inrow, outrow;\n\n  inrow = outrow = 0;\n  while (outrow < cinfo->max_v_samp_factor) {\n    inptr = input_data[inrow];\n    outptr = output_data[outrow];\n    outend = outptr + cinfo->output_width;\n    while (outptr < outend) {\n      invalue = *inptr++;\t/* don't need GETJSAMPLE() here */\n      *outptr++ = invalue;\n      *outptr++ = invalue;\n    }\n    jcopy_sample_rows(output_data, outrow, output_data, outrow+1,\n\t\t      1, cinfo->output_width);\n    inrow++;\n    outrow += 2;\n  }\n}\n\n\n/*\n * Fancy processing for the common case of 2:1 horizontal and 1:1 vertical.\n *\n * The upsampling algorithm is linear interpolation between pixel centers,\n * also known as a \"triangle filter\".  This is a good compromise between\n * speed and visual quality.  The centers of the output pixels are 1/4 and 3/4\n * of the way between input pixel centers.\n *\n * A note about the \"bias\" calculations: when rounding fractional values to\n * integer, we do not want to always round 0.5 up to the next integer.\n * If we did that, we'd introduce a noticeable bias towards larger values.\n * Instead, this code is arranged so that 0.5 will be rounded up or down at\n * alternate pixel locations (a simple ordered dither pattern).\n */\n\nMETHODDEF(void)\nh2v1_fancy_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\t     JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)\n{\n  JSAMPARRAY output_data = *output_data_ptr;\n  register JSAMPROW inptr, outptr;\n  register int invalue;\n  register JDIMENSION colctr;\n  int inrow;\n\n  for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) {\n    inptr = input_data[inrow];\n    outptr = output_data[inrow];\n    /* Special case for first column */\n    invalue = GETJSAMPLE(*inptr++);\n    *outptr++ = (JSAMPLE) invalue;\n    *outptr++ = (JSAMPLE) ((invalue * 3 + GETJSAMPLE(*inptr) + 2) >> 2);\n\n    for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) {\n      /* General case: 3/4 * nearer pixel + 1/4 * further pixel */\n      invalue = GETJSAMPLE(*inptr++) * 3;\n      *outptr++ = (JSAMPLE) ((invalue + GETJSAMPLE(inptr[-2]) + 1) >> 2);\n      *outptr++ = (JSAMPLE) ((invalue + GETJSAMPLE(*inptr) + 2) >> 2);\n    }\n\n    /* Special case for last column */\n    invalue = GETJSAMPLE(*inptr);\n    *outptr++ = (JSAMPLE) ((invalue * 3 + GETJSAMPLE(inptr[-1]) + 1) >> 2);\n    *outptr++ = (JSAMPLE) invalue;\n  }\n}\n\n\n/*\n * Fancy processing for the common case of 2:1 horizontal and 2:1 vertical.\n * Again a triangle filter; see comments for h2v1 case, above.\n *\n * It is OK for us to reference the adjacent input rows because we demanded\n * context from the main buffer controller (see initialization code).\n */\n\nMETHODDEF(void)\nh2v2_fancy_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\t     JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)\n{\n  JSAMPARRAY output_data = *output_data_ptr;\n  register JSAMPROW inptr0, inptr1, outptr;\n#if BITS_IN_JSAMPLE == 8\n  register int thiscolsum, lastcolsum, nextcolsum;\n#else\n  register INT32 thiscolsum, lastcolsum, nextcolsum;\n#endif\n  register JDIMENSION colctr;\n  int inrow, outrow, v;\n\n  inrow = outrow = 0;\n  while (outrow < cinfo->max_v_samp_factor) {\n    for (v = 0; v < 2; v++) {\n      /* inptr0 points to nearest input row, inptr1 points to next nearest */\n      inptr0 = input_data[inrow];\n      if (v == 0)\t\t/* next nearest is row above */\n\tinptr1 = input_data[inrow-1];\n      else\t\t\t/* next nearest is row below */\n\tinptr1 = input_data[inrow+1];\n      outptr = output_data[outrow++];\n\n      /* Special case for first column */\n      thiscolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++);\n      nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++);\n      *outptr++ = (JSAMPLE) ((thiscolsum * 4 + 8) >> 4);\n      *outptr++ = (JSAMPLE) ((thiscolsum * 3 + nextcolsum + 7) >> 4);\n      lastcolsum = thiscolsum; thiscolsum = nextcolsum;\n\n      for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) {\n\t/* General case: 3/4 * nearer pixel + 1/4 * further pixel in each */\n\t/* dimension, thus 9/16, 3/16, 3/16, 1/16 overall */\n\tnextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++);\n\t*outptr++ = (JSAMPLE) ((thiscolsum * 3 + lastcolsum + 8) >> 4);\n\t*outptr++ = (JSAMPLE) ((thiscolsum * 3 + nextcolsum + 7) >> 4);\n\tlastcolsum = thiscolsum; thiscolsum = nextcolsum;\n      }\n\n      /* Special case for last column */\n      *outptr++ = (JSAMPLE) ((thiscolsum * 3 + lastcolsum + 8) >> 4);\n      *outptr++ = (JSAMPLE) ((thiscolsum * 4 + 7) >> 4);\n    }\n    inrow++;\n  }\n}\n\n\n/*\n * Module initialization routine for upsampling.\n */\n\nGLOBAL(void)\njinit_upsampler (j_decompress_ptr cinfo)\n{\n  my_upsample_ptr upsample;\n  int ci;\n  jpeg_component_info * compptr;\n  boolean need_buffer, do_fancy;\n  int h_in_group, v_in_group, h_out_group, v_out_group;\n\n  upsample = (my_upsample_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_upsampler));\n  cinfo->upsample = (struct jpeg_upsampler *) upsample;\n  upsample->pub.start_pass = start_pass_upsample;\n  upsample->pub.upsample = sep_upsample;\n  upsample->pub.need_context_rows = FALSE; /* until we find out differently */\n\n  if (cinfo->CCIR601_sampling)\t/* this isn't supported */\n    ERREXIT(cinfo, JERR_CCIR601_NOTIMPL);\n\n  /* jdmainct.c doesn't support context rows when min_DCT_scaled_size = 1,\n   * so don't ask for it.\n   */\n  do_fancy = cinfo->do_fancy_upsampling && cinfo->min_DCT_scaled_size > 1;\n\n  /* Verify we can handle the sampling factors, select per-component methods,\n   * and create storage as needed.\n   */\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    /* Compute size of an \"input group\" after IDCT scaling.  This many samples\n     * are to be converted to max_h_samp_factor * max_v_samp_factor pixels.\n     */\n    h_in_group = (compptr->h_samp_factor * compptr->DCT_scaled_size) /\n\t\t cinfo->min_DCT_scaled_size;\n    v_in_group = (compptr->v_samp_factor * compptr->DCT_scaled_size) /\n\t\t cinfo->min_DCT_scaled_size;\n    h_out_group = cinfo->max_h_samp_factor;\n    v_out_group = cinfo->max_v_samp_factor;\n    upsample->rowgroup_height[ci] = v_in_group; /* save for use later */\n    need_buffer = TRUE;\n    if (! compptr->component_needed) {\n      /* Don't bother to upsample an uninteresting component. */\n      upsample->methods[ci] = noop_upsample;\n      need_buffer = FALSE;\n    } else if (h_in_group == h_out_group && v_in_group == v_out_group) {\n      /* Fullsize components can be processed without any work. */\n      upsample->methods[ci] = fullsize_upsample;\n      need_buffer = FALSE;\n    } else if (h_in_group * 2 == h_out_group &&\n\t       v_in_group == v_out_group) {\n      /* Special cases for 2h1v upsampling */\n      if (do_fancy && compptr->downsampled_width > 2)\n\tupsample->methods[ci] = h2v1_fancy_upsample;\n      else\n\tupsample->methods[ci] = h2v1_upsample;\n    } else if (h_in_group * 2 == h_out_group &&\n\t       v_in_group * 2 == v_out_group) {\n      /* Special cases for 2h2v upsampling */\n      if (do_fancy && compptr->downsampled_width > 2) {\n\tupsample->methods[ci] = h2v2_fancy_upsample;\n\tupsample->pub.need_context_rows = TRUE;\n      } else\n\tupsample->methods[ci] = h2v2_upsample;\n    } else if ((h_out_group % h_in_group) == 0 &&\n\t       (v_out_group % v_in_group) == 0) {\n      /* Generic integral-factors upsampling method */\n      upsample->methods[ci] = int_upsample;\n      upsample->h_expand[ci] = (UINT8) (h_out_group / h_in_group);\n      upsample->v_expand[ci] = (UINT8) (v_out_group / v_in_group);\n    } else\n      ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL);\n    if (need_buffer) {\n      upsample->color_buf[ci] = (*cinfo->mem->alloc_sarray)\n\t((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t (JDIMENSION) jround_up((long) cinfo->output_width,\n\t\t\t\t(long) cinfo->max_h_samp_factor),\n\t (JDIMENSION) cinfo->max_v_samp_factor);\n    }\n  }\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jdtrans.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jdtrans.c\n *\n * Copyright (C) 1995-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains library routines for transcoding decompression,\n * that is, reading raw DCT coefficient arrays from an input JPEG file.\n * The routines in jdapimin.c will also be needed by a transcoder.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Forward declarations */\nLOCAL(void) transdecode_master_selection JPP((j_decompress_ptr cinfo));\n\n\n/*\n * Read the coefficient arrays from a JPEG file.\n * jpeg_read_header must be completed before calling this.\n *\n * The entire image is read into a set of virtual coefficient-block arrays,\n * one per component.  The return value is a pointer to the array of\n * virtual-array descriptors.  These can be manipulated directly via the\n * JPEG memory manager, or handed off to jpeg_write_coefficients().\n * To release the memory occupied by the virtual arrays, call\n * jpeg_finish_decompress() when done with the data.\n *\n * An alternative usage is to simply obtain access to the coefficient arrays\n * during a buffered-image-mode decompression operation.  This is allowed\n * after any jpeg_finish_output() call.  The arrays can be accessed until\n * jpeg_finish_decompress() is called.  (Note that any call to the library\n * may reposition the arrays, so don't rely on access_virt_barray() results\n * to stay valid across library calls.)\n *\n * Returns NULL if suspended.  This case need be checked only if\n * a suspending data source is used.\n */\n\nGLOBAL(jvirt_barray_ptr *)\njpeg_read_coefficients (j_decompress_ptr cinfo)\n{\n  if (cinfo->global_state == DSTATE_READY) {\n    /* First call: initialize active modules */\n    transdecode_master_selection(cinfo);\n    cinfo->global_state = DSTATE_RDCOEFS;\n  }\n  if (cinfo->global_state == DSTATE_RDCOEFS) {\n    /* Absorb whole file into the coef buffer */\n    for (;;) {\n      int retcode;\n      /* Call progress monitor hook if present */\n      if (cinfo->progress != NULL)\n\t(*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);\n      /* Absorb some more input */\n      retcode = (*cinfo->inputctl->consume_input) (cinfo);\n      if (retcode == JPEG_SUSPENDED)\n\treturn NULL;\n      if (retcode == JPEG_REACHED_EOI)\n\tbreak;\n      /* Advance progress counter if appropriate */\n      if (cinfo->progress != NULL &&\n\t  (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) {\n\tif (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) {\n\t  /* startup underestimated number of scans; ratchet up one scan */\n\t  cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows;\n\t}\n      }\n    }\n    /* Set state so that jpeg_finish_decompress does the right thing */\n    cinfo->global_state = DSTATE_STOPPING;\n  }\n  /* At this point we should be in state DSTATE_STOPPING if being used\n   * standalone, or in state DSTATE_BUFIMAGE if being invoked to get access\n   * to the coefficients during a full buffered-image-mode decompression.\n   */\n  if ((cinfo->global_state == DSTATE_STOPPING ||\n       cinfo->global_state == DSTATE_BUFIMAGE) && cinfo->buffered_image) {\n    return cinfo->coef->coef_arrays;\n  }\n  /* Oops, improper usage */\n  ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  return NULL;\t\t\t/* keep compiler happy */\n}\n\n\n/*\n * Master selection of decompression modules for transcoding.\n * This substitutes for jdmaster.c's initialization of the full decompressor.\n */\n\nLOCAL(void)\ntransdecode_master_selection (j_decompress_ptr cinfo)\n{\n  /* This is effectively a buffered-image operation. */\n  cinfo->buffered_image = TRUE;\n\n  /* Entropy decoding: either Huffman or arithmetic coding. */\n  if (cinfo->arith_code) {\n    ERREXIT(cinfo, JERR_ARITH_NOTIMPL);\n  } else {\n    if (cinfo->progressive_mode) {\n#ifdef D_PROGRESSIVE_SUPPORTED\n      jinit_phuff_decoder(cinfo);\n#else\n      ERREXIT(cinfo, JERR_NOT_COMPILED);\n#endif\n    } else\n      jinit_huff_decoder(cinfo);\n  }\n\n  /* Always get a full-image coefficient buffer. */\n  jinit_d_coef_controller(cinfo, TRUE);\n\n  /* We can now tell the memory manager to allocate virtual arrays. */\n  (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);\n\n  /* Initialize input side of decompressor to consume first scan. */\n  (*cinfo->inputctl->start_input_pass) (cinfo);\n\n  /* Initialize progress monitoring. */\n  if (cinfo->progress != NULL) {\n    int nscans;\n    /* Estimate number of scans to set pass_limit. */\n    if (cinfo->progressive_mode) {\n      /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */\n      nscans = 2 + 3 * cinfo->num_components;\n    } else if (cinfo->inputctl->has_multiple_scans) {\n      /* For a nonprogressive multiscan file, estimate 1 scan per component. */\n      nscans = cinfo->num_components;\n    } else {\n      nscans = 1;\n    }\n    cinfo->progress->pass_counter = 0L;\n    cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans;\n    cinfo->progress->completed_passes = 0;\n    cinfo->progress->total_passes = 1;\n  }\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jerror.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jerror.c\n *\n * Copyright (C) 1991-1998, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains simple error-reporting and trace-message routines.\n * These are suitable for Unix-like systems and others where writing to\n * stderr is the right thing to do.  Many applications will want to replace\n * some or all of these routines.\n *\n * If you define USE_WINDOWS_MESSAGEBOX in jconfig.h or in the makefile,\n * you get a Windows-specific hack to display error messages in a dialog box.\n * It ain't much, but it beats dropping error messages into the bit bucket,\n * which is what happens to output to stderr under most Windows C compilers.\n *\n * These routines are used by both the compression and decompression code.\n */\n\n/* this is not a core library module, so it doesn't define JPEG_INTERNALS */\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jversion.h\"\n#include \"jerror.h\"\n\n#ifndef EXIT_FAILURE\t\t/* define exit() codes if not provided */\n#define EXIT_FAILURE  1\n#endif\n\n\n/*\n * Create the message string table.\n * We do this from the master message list in jerror.h by re-reading\n * jerror.h with a suitable definition for macro JMESSAGE.\n * The message table is made an external symbol just in case any applications\n * want to refer to it directly.\n */\n\n#ifdef NEED_SHORT_EXTERNAL_NAMES\n#define jpeg_std_message_table\tjMsgTable\n#endif\n\n#define JMESSAGE(code,string)\tstring ,\n\nconst char * const jpeg_std_message_table[] = {\n#include \"jerror.h\"\n  NULL\n};\n\n\n/*\n * Error exit handler: must not return to caller.\n *\n * Applications may override this if they want to get control back after\n * an error.  Typically one would longjmp somewhere instead of exiting.\n * The setjmp buffer can be made a private field within an expanded error\n * handler object.  Note that the info needed to generate an error message\n * is stored in the error object, so you can generate the message now or\n * later, at your convenience.\n * You should make sure that the JPEG object is cleaned up (with jpeg_abort\n * or jpeg_destroy) at some point.\n */\n\nMETHODDEF(void)\nerror_exit (j_common_ptr cinfo)\n{\n  /* Always display the message */\n  (*cinfo->err->output_message) (cinfo);\n\n  /* Let the memory manager delete any temp files before we die */\n  jpeg_destroy(cinfo);\n\n//  exit(EXIT_FAILURE);\n}\n\n\n/*\n * Actual output of an error or trace message.\n * Applications may override this method to send JPEG messages somewhere\n * other than stderr.\n *\n * On Windows, printing to stderr is generally completely useless,\n * so we provide optional code to produce an error-dialog popup.\n * Most Windows applications will still prefer to override this routine,\n * but if they don't, it'll do something at least marginally useful.\n *\n * NOTE: to use the library in an environment that doesn't support the\n * C stdio library, you may have to delete the call to fprintf() entirely,\n * not just not use this routine.\n */\n\nMETHODDEF(void)\noutput_message (j_common_ptr cinfo)\n{\n  char buffer[JMSG_LENGTH_MAX];\n\n  /* Create the message */\n  (*cinfo->err->format_message) (cinfo, buffer);\n\n#ifdef USE_WINDOWS_MESSAGEBOX\n  /* Display it in a message dialog box */\n  MessageBox(GetActiveWindow(), buffer, \"JPEG Library Error\",\n\t     MB_OK | MB_ICONERROR);\n#else\n  /* Send it to stderr, adding a newline */\n#ifndef _FPDFAPI_MINI_\n  FXSYS_fprintf(stderr, \"%s\\n\", buffer);\n#endif\n#endif\n}\n\n\n/*\n * Decide whether to emit a trace or warning message.\n * msg_level is one of:\n *   -1: recoverable corrupt-data warning, may want to abort.\n *    0: important advisory messages (always display to user).\n *    1: first level of tracing detail.\n *    2,3,...: successively more detailed tracing messages.\n * An application might override this method if it wanted to abort on warnings\n * or change the policy about which messages to display.\n */\n\nMETHODDEF(void)\nemit_message (j_common_ptr cinfo, int msg_level)\n{\n  struct jpeg_error_mgr * err = cinfo->err;\n\n  if (msg_level < 0) {\n    /* It's a warning message.  Since corrupt files may generate many warnings,\n     * the policy implemented here is to show only the first warning,\n     * unless trace_level >= 3.\n     */\n    if (err->num_warnings == 0 || err->trace_level >= 3)\n      (*err->output_message) (cinfo);\n    /* Always count warnings in num_warnings. */\n    err->num_warnings++;\n  } else {\n    /* It's a trace message.  Show it if trace_level >= msg_level. */\n    if (err->trace_level >= msg_level)\n      (*err->output_message) (cinfo);\n  }\n}\n\n\n/*\n * Format a message string for the most recent JPEG error or message.\n * The message is stored into buffer, which should be at least JMSG_LENGTH_MAX\n * characters.  Note that no '\\n' character is added to the string.\n * Few applications should need to override this method.\n */\n\nMETHODDEF(void)\nformat_message (j_common_ptr cinfo, char * buffer)\n{\n#if 0\t/* XYQ */\n  struct jpeg_error_mgr * err = cinfo->err;\n  int msg_code = err->msg_code;\n  const char * msgtext = NULL;\n  const char * msgptr;\n  char ch;\n  boolean isstring;\n\n  /* Look up message string in proper table */\n  if (msg_code > 0 && msg_code <= err->last_jpeg_message) {\n    msgtext = err->jpeg_message_table[msg_code];\n  } else if (err->addon_message_table != NULL &&\n\t     msg_code >= err->first_addon_message &&\n\t     msg_code <= err->last_addon_message) {\n    msgtext = err->addon_message_table[msg_code - err->first_addon_message];\n  }\n\n  /* Defend against bogus message number */\n  if (msgtext == NULL) {\n    err->msg_parm.i[0] = msg_code;\n    msgtext = err->jpeg_message_table[0];\n  }\n\n  /* Check for string parameter, as indicated by %s in the message text */\n  isstring = FALSE;\n  msgptr = msgtext;\n  while ((ch = *msgptr++) != '\\0') {\n    if (ch == '%') {\n      if (*msgptr == 's') isstring = TRUE;\n      break;\n    }\n  }\n\n  /* Format the message into the passed buffer */\n  if (isstring)\n    FXSYS_sprintf(buffer, msgtext, err->msg_parm.s);\n  else\n    FXSYS_sprintf(buffer, msgtext,\n\t    err->msg_parm.i[0], err->msg_parm.i[1],\n\t    err->msg_parm.i[2], err->msg_parm.i[3],\n\t    err->msg_parm.i[4], err->msg_parm.i[5],\n\t    err->msg_parm.i[6], err->msg_parm.i[7]);\n#endif\n}\n\n\n/*\n * Reset error state variables at start of a new image.\n * This is called during compression startup to reset trace/error\n * processing to default state, without losing any application-specific\n * method pointers.  An application might possibly want to override\n * this method if it has additional error processing state.\n */\n\nMETHODDEF(void)\nreset_error_mgr (j_common_ptr cinfo)\n{\n  cinfo->err->num_warnings = 0;\n  /* trace_level is not reset since it is an application-supplied parameter */\n  cinfo->err->msg_code = 0;\t/* may be useful as a flag for \"no error\" */\n}\n\n\n/*\n * Fill in the standard error-handling methods in a jpeg_error_mgr object.\n * Typical call is:\n *\tstruct jpeg_compress_struct cinfo;\n *\tstruct jpeg_error_mgr err;\n *\n *\tcinfo.err = jpeg_std_error(&err);\n * after which the application may override some of the methods.\n */\n\nGLOBAL(struct jpeg_error_mgr *)\njpeg_std_error (struct jpeg_error_mgr * err)\n{\n  err->error_exit = error_exit;\n  err->emit_message = emit_message;\n  err->output_message = output_message;\n  err->format_message = format_message;\n  err->reset_error_mgr = reset_error_mgr;\n\n  err->trace_level = 0;\t\t/* default = no tracing */\n  err->num_warnings = 0;\t/* no warnings emitted yet */\n  err->msg_code = 0;\t\t/* may be useful as a flag for \"no error\" */\n\n  /* Initialize message table pointers */\n  err->jpeg_message_table = jpeg_std_message_table;\n  err->last_jpeg_message = (int) JMSG_LASTMSGCODE - 1;\n\n  err->addon_message_table = NULL;\n  err->first_addon_message = 0;\t/* for safety */\n  err->last_addon_message = 0;\n\n  return err;\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jfdctfst.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jfdctfst.c\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains a fast, not so accurate integer implementation of the\n * forward DCT (Discrete Cosine Transform).\n *\n * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT\n * on each column.  Direct algorithms are also available, but they are\n * much more complex and seem not to be any faster when reduced to code.\n *\n * This implementation is based on Arai, Agui, and Nakajima's algorithm for\n * scaled DCT.  Their original paper (Trans. IEICE E-71(11):1095) is in\n * Japanese, but the algorithm is described in the Pennebaker & Mitchell\n * JPEG textbook (see REFERENCES section in file README).  The following code\n * is based directly on figure 4-8 in P&M.\n * While an 8-point DCT cannot be done in less than 11 multiplies, it is\n * possible to arrange the computation so that many of the multiplies are\n * simple scalings of the final outputs.  These multiplies can then be\n * folded into the multiplications or divisions by the JPEG quantization\n * table entries.  The AA&N method leaves only 5 multiplies and 29 adds\n * to be done in the DCT itself.\n * The primary disadvantage of this method is that with fixed-point math,\n * accuracy is lost due to imprecise representation of the scaled\n * quantization values.  The smaller the quantization table entry, the less\n * precise the scaled value, so this implementation does worse with high-\n * quality-setting files than with low-quality ones.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jdct.h\"\t\t/* Private declarations for DCT subsystem */\n\n#ifdef DCT_IFAST_SUPPORTED\n\n\n/*\n * This module is specialized to the case DCTSIZE = 8.\n */\n\n#if DCTSIZE != 8\n  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */\n#endif\n\n\n/* Scaling decisions are generally the same as in the LL&M algorithm;\n * see jfdctint.c for more details.  However, we choose to descale\n * (right shift) multiplication products as soon as they are formed,\n * rather than carrying additional fractional bits into subsequent additions.\n * This compromises accuracy slightly, but it lets us save a few shifts.\n * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples)\n * everywhere except in the multiplications proper; this saves a good deal\n * of work on 16-bit-int machines.\n *\n * Again to save a few shifts, the intermediate results between pass 1 and\n * pass 2 are not upscaled, but are represented only to integral precision.\n *\n * A final compromise is to represent the multiplicative constants to only\n * 8 fractional bits, rather than 13.  This saves some shifting work on some\n * machines, and may also reduce the cost of multiplication (since there\n * are fewer one-bits in the constants).\n */\n\n#define CONST_BITS  8\n\n\n/* Some C compilers fail to reduce \"FIX(constant)\" at compile time, thus\n * causing a lot of useless floating-point operations at run time.\n * To get around this we use the following pre-calculated constants.\n * If you change CONST_BITS you may want to add appropriate values.\n * (With a reasonable C compiler, you can just rely on the FIX() macro...)\n */\n\n#if CONST_BITS == 8\n#define FIX_0_382683433  ((INT32)   98)\t\t/* FIX(0.382683433) */\n#define FIX_0_541196100  ((INT32)  139)\t\t/* FIX(0.541196100) */\n#define FIX_0_707106781  ((INT32)  181)\t\t/* FIX(0.707106781) */\n#define FIX_1_306562965  ((INT32)  334)\t\t/* FIX(1.306562965) */\n#else\n#define FIX_0_382683433  FIX(0.382683433)\n#define FIX_0_541196100  FIX(0.541196100)\n#define FIX_0_707106781  FIX(0.707106781)\n#define FIX_1_306562965  FIX(1.306562965)\n#endif\n\n\n/* We can gain a little more speed, with a further compromise in accuracy,\n * by omitting the addition in a descaling shift.  This yields an incorrectly\n * rounded result half the time...\n */\n\n#ifndef USE_ACCURATE_ROUNDING\n#undef DESCALE\n#define DESCALE(x,n)  RIGHT_SHIFT(x, n)\n#endif\n\n\n/* Multiply a DCTELEM variable by an INT32 constant, and immediately\n * descale to yield a DCTELEM result.\n */\n\n#define MULTIPLY(var,const)  ((DCTELEM) DESCALE((var) * (const), CONST_BITS))\n\n\n/*\n * Perform the forward DCT on one block of samples.\n */\n\nGLOBAL(void)\njpeg_fdct_ifast (DCTELEM * data)\n{\n  DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;\n  DCTELEM tmp10, tmp11, tmp12, tmp13;\n  DCTELEM z1, z2, z3, z4, z5, z11, z13;\n  DCTELEM *dataptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pass 1: process rows. */\n\n  dataptr = data;\n  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {\n    tmp0 = dataptr[0] + dataptr[7];\n    tmp7 = dataptr[0] - dataptr[7];\n    tmp1 = dataptr[1] + dataptr[6];\n    tmp6 = dataptr[1] - dataptr[6];\n    tmp2 = dataptr[2] + dataptr[5];\n    tmp5 = dataptr[2] - dataptr[5];\n    tmp3 = dataptr[3] + dataptr[4];\n    tmp4 = dataptr[3] - dataptr[4];\n    \n    /* Even part */\n    \n    tmp10 = tmp0 + tmp3;\t/* phase 2 */\n    tmp13 = tmp0 - tmp3;\n    tmp11 = tmp1 + tmp2;\n    tmp12 = tmp1 - tmp2;\n    \n    dataptr[0] = tmp10 + tmp11; /* phase 3 */\n    dataptr[4] = tmp10 - tmp11;\n    \n    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */\n    dataptr[2] = tmp13 + z1;\t/* phase 5 */\n    dataptr[6] = tmp13 - z1;\n    \n    /* Odd part */\n\n    tmp10 = tmp4 + tmp5;\t/* phase 2 */\n    tmp11 = tmp5 + tmp6;\n    tmp12 = tmp6 + tmp7;\n\n    /* The rotator is modified from fig 4-8 to avoid extra negations. */\n    z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */\n    z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */\n    z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */\n    z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */\n\n    z11 = tmp7 + z3;\t\t/* phase 5 */\n    z13 = tmp7 - z3;\n\n    dataptr[5] = z13 + z2;\t/* phase 6 */\n    dataptr[3] = z13 - z2;\n    dataptr[1] = z11 + z4;\n    dataptr[7] = z11 - z4;\n\n    dataptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n\n  /* Pass 2: process columns. */\n\n  dataptr = data;\n  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {\n    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];\n    tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];\n    tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];\n    tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];\n    tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];\n    tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];\n    tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];\n    tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];\n    \n    /* Even part */\n    \n    tmp10 = tmp0 + tmp3;\t/* phase 2 */\n    tmp13 = tmp0 - tmp3;\n    tmp11 = tmp1 + tmp2;\n    tmp12 = tmp1 - tmp2;\n    \n    dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */\n    dataptr[DCTSIZE*4] = tmp10 - tmp11;\n    \n    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */\n    dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */\n    dataptr[DCTSIZE*6] = tmp13 - z1;\n    \n    /* Odd part */\n\n    tmp10 = tmp4 + tmp5;\t/* phase 2 */\n    tmp11 = tmp5 + tmp6;\n    tmp12 = tmp6 + tmp7;\n\n    /* The rotator is modified from fig 4-8 to avoid extra negations. */\n    z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */\n    z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */\n    z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */\n    z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */\n\n    z11 = tmp7 + z3;\t\t/* phase 5 */\n    z13 = tmp7 - z3;\n\n    dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */\n    dataptr[DCTSIZE*3] = z13 - z2;\n    dataptr[DCTSIZE*1] = z11 + z4;\n    dataptr[DCTSIZE*7] = z11 - z4;\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n#endif /* DCT_IFAST_SUPPORTED */\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jfdctint.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jfdctint.c\n *\n * Copyright (C) 1991-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains a slow-but-accurate integer implementation of the\n * forward DCT (Discrete Cosine Transform).\n *\n * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT\n * on each column.  Direct algorithms are also available, but they are\n * much more complex and seem not to be any faster when reduced to code.\n *\n * This implementation is based on an algorithm described in\n *   C. Loeffler, A. Ligtenberg and G. Moschytz, \"Practical Fast 1-D DCT\n *   Algorithms with 11 Multiplications\", Proc. Int'l. Conf. on Acoustics,\n *   Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991.\n * The primary algorithm described there uses 11 multiplies and 29 adds.\n * We use their alternate method with 12 multiplies and 32 adds.\n * The advantage of this method is that no data path contains more than one\n * multiplication; this allows a very simple and accurate implementation in\n * scaled fixed-point arithmetic, with a minimal number of shifts.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jdct.h\"\t\t/* Private declarations for DCT subsystem */\n\n#ifdef DCT_ISLOW_SUPPORTED\n\n\n/*\n * This module is specialized to the case DCTSIZE = 8.\n */\n\n#if DCTSIZE != 8\n  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */\n#endif\n\n\n/*\n * The poop on this scaling stuff is as follows:\n *\n * Each 1-D DCT step produces outputs which are a factor of sqrt(N)\n * larger than the true DCT outputs.  The final outputs are therefore\n * a factor of N larger than desired; since N=8 this can be cured by\n * a simple right shift at the end of the algorithm.  The advantage of\n * this arrangement is that we save two multiplications per 1-D DCT,\n * because the y0 and y4 outputs need not be divided by sqrt(N).\n * In the IJG code, this factor of 8 is removed by the quantization step\n * (in jcdctmgr.c), NOT in this module.\n *\n * We have to do addition and subtraction of the integer inputs, which\n * is no problem, and multiplication by fractional constants, which is\n * a problem to do in integer arithmetic.  We multiply all the constants\n * by CONST_SCALE and convert them to integer constants (thus retaining\n * CONST_BITS bits of precision in the constants).  After doing a\n * multiplication we have to divide the product by CONST_SCALE, with proper\n * rounding, to produce the correct output.  This division can be done\n * cheaply as a right shift of CONST_BITS bits.  We postpone shifting\n * as long as possible so that partial sums can be added together with\n * full fractional precision.\n *\n * The outputs of the first pass are scaled up by PASS1_BITS bits so that\n * they are represented to better-than-integral precision.  These outputs\n * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word\n * with the recommended scaling.  (For 12-bit sample data, the intermediate\n * array is INT32 anyway.)\n *\n * To avoid overflow of the 32-bit intermediate results in pass 2, we must\n * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26.  Error analysis\n * shows that the values given below are the most effective.\n */\n\n#if BITS_IN_JSAMPLE == 8\n#define CONST_BITS  13\n#define PASS1_BITS  2\n#else\n#define CONST_BITS  13\n#define PASS1_BITS  1\t\t/* lose a little precision to avoid overflow */\n#endif\n\n/* Some C compilers fail to reduce \"FIX(constant)\" at compile time, thus\n * causing a lot of useless floating-point operations at run time.\n * To get around this we use the following pre-calculated constants.\n * If you change CONST_BITS you may want to add appropriate values.\n * (With a reasonable C compiler, you can just rely on the FIX() macro...)\n */\n\n#if CONST_BITS == 13\n#define FIX_0_298631336  ((INT32)  2446)\t/* FIX(0.298631336) */\n#define FIX_0_390180644  ((INT32)  3196)\t/* FIX(0.390180644) */\n#define FIX_0_541196100  ((INT32)  4433)\t/* FIX(0.541196100) */\n#define FIX_0_765366865  ((INT32)  6270)\t/* FIX(0.765366865) */\n#define FIX_0_899976223  ((INT32)  7373)\t/* FIX(0.899976223) */\n#define FIX_1_175875602  ((INT32)  9633)\t/* FIX(1.175875602) */\n#define FIX_1_501321110  ((INT32)  12299)\t/* FIX(1.501321110) */\n#define FIX_1_847759065  ((INT32)  15137)\t/* FIX(1.847759065) */\n#define FIX_1_961570560  ((INT32)  16069)\t/* FIX(1.961570560) */\n#define FIX_2_053119869  ((INT32)  16819)\t/* FIX(2.053119869) */\n#define FIX_2_562915447  ((INT32)  20995)\t/* FIX(2.562915447) */\n#define FIX_3_072711026  ((INT32)  25172)\t/* FIX(3.072711026) */\n#else\n#define FIX_0_298631336  FIX(0.298631336)\n#define FIX_0_390180644  FIX(0.390180644)\n#define FIX_0_541196100  FIX(0.541196100)\n#define FIX_0_765366865  FIX(0.765366865)\n#define FIX_0_899976223  FIX(0.899976223)\n#define FIX_1_175875602  FIX(1.175875602)\n#define FIX_1_501321110  FIX(1.501321110)\n#define FIX_1_847759065  FIX(1.847759065)\n#define FIX_1_961570560  FIX(1.961570560)\n#define FIX_2_053119869  FIX(2.053119869)\n#define FIX_2_562915447  FIX(2.562915447)\n#define FIX_3_072711026  FIX(3.072711026)\n#endif\n\n\n/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.\n * For 8-bit samples with the recommended scaling, all the variable\n * and constant values involved are no more than 16 bits wide, so a\n * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.\n * For 12-bit samples, a full 32-bit multiplication will be needed.\n */\n\n#if BITS_IN_JSAMPLE == 8\n#define MULTIPLY(var,const)  MULTIPLY16C16(var,const)\n#else\n#define MULTIPLY(var,const)  ((var) * (const))\n#endif\n\n\n/*\n * Perform the forward DCT on one block of samples.\n */\n\nGLOBAL(void)\njpeg_fdct_islow (DCTELEM * data)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;\n  INT32 tmp10, tmp11, tmp12, tmp13;\n  INT32 z1, z2, z3, z4, z5;\n  DCTELEM *dataptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT; */\n  /* furthermore, we scale the results by 2**PASS1_BITS. */\n\n  dataptr = data;\n  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {\n    tmp0 = dataptr[0] + dataptr[7];\n    tmp7 = dataptr[0] - dataptr[7];\n    tmp1 = dataptr[1] + dataptr[6];\n    tmp6 = dataptr[1] - dataptr[6];\n    tmp2 = dataptr[2] + dataptr[5];\n    tmp5 = dataptr[2] - dataptr[5];\n    tmp3 = dataptr[3] + dataptr[4];\n    tmp4 = dataptr[3] - dataptr[4];\n    \n    /* Even part per LL&M figure 1 --- note that published figure is faulty;\n     * rotator \"sqrt(2)*c1\" should be \"sqrt(2)*c6\".\n     */\n    \n    tmp10 = tmp0 + tmp3;\n    tmp13 = tmp0 - tmp3;\n    tmp11 = tmp1 + tmp2;\n    tmp12 = tmp1 - tmp2;\n    \n    dataptr[0] = (DCTELEM) ((tmp10 + tmp11) << PASS1_BITS);\n    dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS);\n    \n    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);\n    dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),\n\t\t\t\t   CONST_BITS-PASS1_BITS);\n    dataptr[6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),\n\t\t\t\t   CONST_BITS-PASS1_BITS);\n    \n    /* Odd part per figure 8 --- note paper omits factor of sqrt(2).\n     * cK represents cos(K*pi/16).\n     * i0..i3 in the paper are tmp4..tmp7 here.\n     */\n    \n    z1 = tmp4 + tmp7;\n    z2 = tmp5 + tmp6;\n    z3 = tmp4 + tmp6;\n    z4 = tmp5 + tmp7;\n    z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */\n    \n    tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */\n    tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */\n    tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */\n    tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */\n    z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */\n    z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */\n    z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */\n    z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */\n    \n    z3 += z5;\n    z4 += z5;\n    \n    dataptr[7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, CONST_BITS-PASS1_BITS);\n    dataptr[5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, CONST_BITS-PASS1_BITS);\n    dataptr[3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, CONST_BITS-PASS1_BITS);\n    dataptr[1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, CONST_BITS-PASS1_BITS);\n    \n    dataptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n\n  /* Pass 2: process columns.\n   * We remove the PASS1_BITS scaling, but leave the results scaled up\n   * by an overall factor of 8.\n   */\n\n  dataptr = data;\n  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {\n    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];\n    tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];\n    tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];\n    tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];\n    tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];\n    tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];\n    tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];\n    tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];\n    \n    /* Even part per LL&M figure 1 --- note that published figure is faulty;\n     * rotator \"sqrt(2)*c1\" should be \"sqrt(2)*c6\".\n     */\n    \n    tmp10 = tmp0 + tmp3;\n    tmp13 = tmp0 - tmp3;\n    tmp11 = tmp1 + tmp2;\n    tmp12 = tmp1 - tmp2;\n    \n    dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS);\n    dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS);\n    \n    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);\n    dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),\n\t\t\t\t\t   CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),\n\t\t\t\t\t   CONST_BITS+PASS1_BITS);\n    \n    /* Odd part per figure 8 --- note paper omits factor of sqrt(2).\n     * cK represents cos(K*pi/16).\n     * i0..i3 in the paper are tmp4..tmp7 here.\n     */\n    \n    z1 = tmp4 + tmp7;\n    z2 = tmp5 + tmp6;\n    z3 = tmp4 + tmp6;\n    z4 = tmp5 + tmp7;\n    z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */\n    \n    tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */\n    tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */\n    tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */\n    tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */\n    z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */\n    z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */\n    z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */\n    z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */\n    \n    z3 += z5;\n    z4 += z5;\n    \n    dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp4 + z1 + z3,\n\t\t\t\t\t   CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp5 + z2 + z4,\n\t\t\t\t\t   CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp6 + z2 + z3,\n\t\t\t\t\t   CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp7 + z1 + z4,\n\t\t\t\t\t   CONST_BITS+PASS1_BITS);\n    \n    dataptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n#endif /* DCT_ISLOW_SUPPORTED */\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jidctfst.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jidctfst.c\n *\n * Copyright (C) 1994-1998, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains a fast, not so accurate integer implementation of the\n * inverse DCT (Discrete Cosine Transform).  In the IJG code, this routine\n * must also perform dequantization of the input coefficients.\n *\n * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT\n * on each row (or vice versa, but it's more convenient to emit a row at\n * a time).  Direct algorithms are also available, but they are much more\n * complex and seem not to be any faster when reduced to code.\n *\n * This implementation is based on Arai, Agui, and Nakajima's algorithm for\n * scaled DCT.  Their original paper (Trans. IEICE E-71(11):1095) is in\n * Japanese, but the algorithm is described in the Pennebaker & Mitchell\n * JPEG textbook (see REFERENCES section in file README).  The following code\n * is based directly on figure 4-8 in P&M.\n * While an 8-point DCT cannot be done in less than 11 multiplies, it is\n * possible to arrange the computation so that many of the multiplies are\n * simple scalings of the final outputs.  These multiplies can then be\n * folded into the multiplications or divisions by the JPEG quantization\n * table entries.  The AA&N method leaves only 5 multiplies and 29 adds\n * to be done in the DCT itself.\n * The primary disadvantage of this method is that with fixed-point math,\n * accuracy is lost due to imprecise representation of the scaled\n * quantization values.  The smaller the quantization table entry, the less\n * precise the scaled value, so this implementation does worse with high-\n * quality-setting files than with low-quality ones.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jdct.h\"\t\t/* Private declarations for DCT subsystem */\n\n#ifdef DCT_IFAST_SUPPORTED\n\n\n/*\n * This module is specialized to the case DCTSIZE = 8.\n */\n\n#if DCTSIZE != 8\n  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */\n#endif\n\n\n/* Scaling decisions are generally the same as in the LL&M algorithm;\n * see jidctint.c for more details.  However, we choose to descale\n * (right shift) multiplication products as soon as they are formed,\n * rather than carrying additional fractional bits into subsequent additions.\n * This compromises accuracy slightly, but it lets us save a few shifts.\n * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples)\n * everywhere except in the multiplications proper; this saves a good deal\n * of work on 16-bit-int machines.\n *\n * The dequantized coefficients are not integers because the AA&N scaling\n * factors have been incorporated.  We represent them scaled up by PASS1_BITS,\n * so that the first and second IDCT rounds have the same input scaling.\n * For 8-bit JSAMPLEs, we choose IFAST_SCALE_BITS = PASS1_BITS so as to\n * avoid a descaling shift; this compromises accuracy rather drastically\n * for small quantization table entries, but it saves a lot of shifts.\n * For 12-bit JSAMPLEs, there's no hope of using 16x16 multiplies anyway,\n * so we use a much larger scaling factor to preserve accuracy.\n *\n * A final compromise is to represent the multiplicative constants to only\n * 8 fractional bits, rather than 13.  This saves some shifting work on some\n * machines, and may also reduce the cost of multiplication (since there\n * are fewer one-bits in the constants).\n */\n\n#if BITS_IN_JSAMPLE == 8\n#define CONST_BITS  8\n#define PASS1_BITS  2\n#else\n#define CONST_BITS  8\n#define PASS1_BITS  1\t\t/* lose a little precision to avoid overflow */\n#endif\n\n/* Some C compilers fail to reduce \"FIX(constant)\" at compile time, thus\n * causing a lot of useless floating-point operations at run time.\n * To get around this we use the following pre-calculated constants.\n * If you change CONST_BITS you may want to add appropriate values.\n * (With a reasonable C compiler, you can just rely on the FIX() macro...)\n */\n\n#if CONST_BITS == 8\n#define FIX_1_082392200  ((INT32)  277)\t\t/* FIX(1.082392200) */\n#define FIX_1_414213562  ((INT32)  362)\t\t/* FIX(1.414213562) */\n#define FIX_1_847759065  ((INT32)  473)\t\t/* FIX(1.847759065) */\n#define FIX_2_613125930  ((INT32)  669)\t\t/* FIX(2.613125930) */\n#else\n#define FIX_1_082392200  FIX(1.082392200)\n#define FIX_1_414213562  FIX(1.414213562)\n#define FIX_1_847759065  FIX(1.847759065)\n#define FIX_2_613125930  FIX(2.613125930)\n#endif\n\n\n/* We can gain a little more speed, with a further compromise in accuracy,\n * by omitting the addition in a descaling shift.  This yields an incorrectly\n * rounded result half the time...\n */\n\n#ifndef USE_ACCURATE_ROUNDING\n#undef DESCALE\n#define DESCALE(x,n)  RIGHT_SHIFT(x, n)\n#endif\n\n\n/* Multiply a DCTELEM variable by an INT32 constant, and immediately\n * descale to yield a DCTELEM result.\n */\n\n#define MULTIPLY(var,const)  ((DCTELEM) DESCALE((var) * (const), CONST_BITS))\n\n\n/* Dequantize a coefficient by multiplying it by the multiplier-table\n * entry; produce a DCTELEM result.  For 8-bit data a 16x16->16\n * multiplication will do.  For 12-bit data, the multiplier table is\n * declared INT32, so a 32-bit multiply will be used.\n */\n\n#if BITS_IN_JSAMPLE == 8\n#define DEQUANTIZE(coef,quantval)  (((IFAST_MULT_TYPE) (coef)) * (quantval))\n#else\n#define DEQUANTIZE(coef,quantval)  \\\n\tDESCALE((coef)*(quantval), IFAST_SCALE_BITS-PASS1_BITS)\n#endif\n\n\n/* Like DESCALE, but applies to a DCTELEM and produces an int.\n * We assume that int right shift is unsigned if INT32 right shift is.\n */\n\n#ifdef RIGHT_SHIFT_IS_UNSIGNED\n#define ISHIFT_TEMPS\tDCTELEM ishift_temp;\n#if BITS_IN_JSAMPLE == 8\n#define DCTELEMBITS  16\t\t/* DCTELEM may be 16 or 32 bits */\n#else\n#define DCTELEMBITS  32\t\t/* DCTELEM must be 32 bits */\n#endif\n#define IRIGHT_SHIFT(x,shft)  \\\n    ((ishift_temp = (x)) < 0 ? \\\n     (ishift_temp >> (shft)) | ((~((DCTELEM) 0)) << (DCTELEMBITS-(shft))) : \\\n     (ishift_temp >> (shft)))\n#else\n#define ISHIFT_TEMPS\n#define IRIGHT_SHIFT(x,shft)\t((x) >> (shft))\n#endif\n\n#ifdef USE_ACCURATE_ROUNDING\n#define IDESCALE(x,n)  ((int) IRIGHT_SHIFT((x) + (1 << ((n)-1)), n))\n#else\n#define IDESCALE(x,n)  ((int) IRIGHT_SHIFT(x, n))\n#endif\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients.\n */\n\nGLOBAL(void)\njpeg_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\t JCOEFPTR coef_block,\n\t\t JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;\n  DCTELEM tmp10, tmp11, tmp12, tmp13;\n  DCTELEM z5, z10, z11, z12, z13;\n  JCOEFPTR inptr;\n  IFAST_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[DCTSIZE2];\t/* buffers data between passes */\n  SHIFT_TEMPS\t\t\t/* for DESCALE */\n  ISHIFT_TEMPS\t\t\t/* for IDESCALE */\n\n  /* Pass 1: process columns from input, store into work array. */\n\n  inptr = coef_block;\n  quantptr = (IFAST_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = DCTSIZE; ctr > 0; ctr--) {\n    /* Due to quantization, we will usually find that many of the input\n     * coefficients are zero, especially the AC terms.  We can exploit this\n     * by short-circuiting the IDCT calculation for any column in which all\n     * the AC terms are zero.  In that case each output is equal to the\n     * DC coefficient (with scale factor as needed).\n     * With typical images and quantization tables, half or more of the\n     * column DCT calculations can be simplified this way.\n     */\n    \n    if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&\n\tinptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&\n\tinptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&\n\tinptr[DCTSIZE*7] == 0) {\n      /* AC terms all zero */\n      int dcval = (int) DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n\n      wsptr[DCTSIZE*0] = dcval;\n      wsptr[DCTSIZE*1] = dcval;\n      wsptr[DCTSIZE*2] = dcval;\n      wsptr[DCTSIZE*3] = dcval;\n      wsptr[DCTSIZE*4] = dcval;\n      wsptr[DCTSIZE*5] = dcval;\n      wsptr[DCTSIZE*6] = dcval;\n      wsptr[DCTSIZE*7] = dcval;\n      \n      inptr++;\t\t\t/* advance pointers to next column */\n      quantptr++;\n      wsptr++;\n      continue;\n    }\n    \n    /* Even part */\n\n    tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    tmp1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);\n    tmp3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);\n\n    tmp10 = tmp0 + tmp2;\t/* phase 3 */\n    tmp11 = tmp0 - tmp2;\n\n    tmp13 = tmp1 + tmp3;\t/* phases 5-3 */\n    tmp12 = MULTIPLY(tmp1 - tmp3, FIX_1_414213562) - tmp13; /* 2*c4 */\n\n    tmp0 = tmp10 + tmp13;\t/* phase 2 */\n    tmp3 = tmp10 - tmp13;\n    tmp1 = tmp11 + tmp12;\n    tmp2 = tmp11 - tmp12;\n    \n    /* Odd part */\n\n    tmp4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    tmp5 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n    tmp6 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);\n    tmp7 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);\n\n    z13 = tmp6 + tmp5;\t\t/* phase 6 */\n    z10 = tmp6 - tmp5;\n    z11 = tmp4 + tmp7;\n    z12 = tmp4 - tmp7;\n\n    tmp7 = z11 + z13;\t\t/* phase 5 */\n    tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */\n\n    z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */\n    tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */\n    tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */\n\n    tmp6 = tmp12 - tmp7;\t/* phase 2 */\n    tmp5 = tmp11 - tmp6;\n    tmp4 = tmp10 + tmp5;\n\n    wsptr[DCTSIZE*0] = (int) (tmp0 + tmp7);\n    wsptr[DCTSIZE*7] = (int) (tmp0 - tmp7);\n    wsptr[DCTSIZE*1] = (int) (tmp1 + tmp6);\n    wsptr[DCTSIZE*6] = (int) (tmp1 - tmp6);\n    wsptr[DCTSIZE*2] = (int) (tmp2 + tmp5);\n    wsptr[DCTSIZE*5] = (int) (tmp2 - tmp5);\n    wsptr[DCTSIZE*4] = (int) (tmp3 + tmp4);\n    wsptr[DCTSIZE*3] = (int) (tmp3 - tmp4);\n\n    inptr++;\t\t\t/* advance pointers to next column */\n    quantptr++;\n    wsptr++;\n  }\n  \n  /* Pass 2: process rows from work array, store into output array. */\n  /* Note that we must descale the results by a factor of 8 == 2**3, */\n  /* and also undo the PASS1_BITS scaling. */\n\n  wsptr = workspace;\n  for (ctr = 0; ctr < DCTSIZE; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n    /* Rows of zeroes can be exploited in the same way as we did with columns.\n     * However, the column calculation has created many nonzero AC terms, so\n     * the simplification applies less often (typically 5% to 10% of the time).\n     * On machines with very fast multiplication, it's possible that the\n     * test takes more time than it's worth.  In that case this section\n     * may be commented out.\n     */\n    \n#ifndef NO_ZERO_ROW_TEST\n    if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 &&\n\twsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {\n      /* AC terms all zero */\n      JSAMPLE dcval = range_limit[IDESCALE(wsptr[0], PASS1_BITS+3)\n\t\t\t\t  & RANGE_MASK];\n      \n      outptr[0] = dcval;\n      outptr[1] = dcval;\n      outptr[2] = dcval;\n      outptr[3] = dcval;\n      outptr[4] = dcval;\n      outptr[5] = dcval;\n      outptr[6] = dcval;\n      outptr[7] = dcval;\n\n      wsptr += DCTSIZE;\t\t/* advance pointer to next row */\n      continue;\n    }\n#endif\n    \n    /* Even part */\n\n    tmp10 = ((DCTELEM) wsptr[0] + (DCTELEM) wsptr[4]);\n    tmp11 = ((DCTELEM) wsptr[0] - (DCTELEM) wsptr[4]);\n\n    tmp13 = ((DCTELEM) wsptr[2] + (DCTELEM) wsptr[6]);\n    tmp12 = MULTIPLY((DCTELEM) wsptr[2] - (DCTELEM) wsptr[6], FIX_1_414213562)\n\t    - tmp13;\n\n    tmp0 = tmp10 + tmp13;\n    tmp3 = tmp10 - tmp13;\n    tmp1 = tmp11 + tmp12;\n    tmp2 = tmp11 - tmp12;\n\n    /* Odd part */\n\n    z13 = (DCTELEM) wsptr[5] + (DCTELEM) wsptr[3];\n    z10 = (DCTELEM) wsptr[5] - (DCTELEM) wsptr[3];\n    z11 = (DCTELEM) wsptr[1] + (DCTELEM) wsptr[7];\n    z12 = (DCTELEM) wsptr[1] - (DCTELEM) wsptr[7];\n\n    tmp7 = z11 + z13;\t\t/* phase 5 */\n    tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */\n\n    z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */\n    tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */\n    tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */\n\n    tmp6 = tmp12 - tmp7;\t/* phase 2 */\n    tmp5 = tmp11 - tmp6;\n    tmp4 = tmp10 + tmp5;\n\n    /* Final output stage: scale down by a factor of 8 and range-limit */\n\n    outptr[0] = range_limit[IDESCALE(tmp0 + tmp7, PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[7] = range_limit[IDESCALE(tmp0 - tmp7, PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[1] = range_limit[IDESCALE(tmp1 + tmp6, PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[6] = range_limit[IDESCALE(tmp1 - tmp6, PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[2] = range_limit[IDESCALE(tmp2 + tmp5, PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[5] = range_limit[IDESCALE(tmp2 - tmp5, PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[4] = range_limit[IDESCALE(tmp3 + tmp4, PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[3] = range_limit[IDESCALE(tmp3 - tmp4, PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n\n    wsptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n}\n\n#endif /* DCT_IFAST_SUPPORTED */\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jidctint.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jidctint.c\n *\n * Copyright (C) 1991-1998, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains a slow-but-accurate integer implementation of the\n * inverse DCT (Discrete Cosine Transform).  In the IJG code, this routine\n * must also perform dequantization of the input coefficients.\n *\n * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT\n * on each row (or vice versa, but it's more convenient to emit a row at\n * a time).  Direct algorithms are also available, but they are much more\n * complex and seem not to be any faster when reduced to code.\n *\n * This implementation is based on an algorithm described in\n *   C. Loeffler, A. Ligtenberg and G. Moschytz, \"Practical Fast 1-D DCT\n *   Algorithms with 11 Multiplications\", Proc. Int'l. Conf. on Acoustics,\n *   Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991.\n * The primary algorithm described there uses 11 multiplies and 29 adds.\n * We use their alternate method with 12 multiplies and 32 adds.\n * The advantage of this method is that no data path contains more than one\n * multiplication; this allows a very simple and accurate implementation in\n * scaled fixed-point arithmetic, with a minimal number of shifts.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jdct.h\"\t\t/* Private declarations for DCT subsystem */\n\n#ifdef DCT_ISLOW_SUPPORTED\n\n\n/*\n * This module is specialized to the case DCTSIZE = 8.\n */\n\n#if DCTSIZE != 8\n  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */\n#endif\n\n\n/*\n * The poop on this scaling stuff is as follows:\n *\n * Each 1-D IDCT step produces outputs which are a factor of sqrt(N)\n * larger than the true IDCT outputs.  The final outputs are therefore\n * a factor of N larger than desired; since N=8 this can be cured by\n * a simple right shift at the end of the algorithm.  The advantage of\n * this arrangement is that we save two multiplications per 1-D IDCT,\n * because the y0 and y4 inputs need not be divided by sqrt(N).\n *\n * We have to do addition and subtraction of the integer inputs, which\n * is no problem, and multiplication by fractional constants, which is\n * a problem to do in integer arithmetic.  We multiply all the constants\n * by CONST_SCALE and convert them to integer constants (thus retaining\n * CONST_BITS bits of precision in the constants).  After doing a\n * multiplication we have to divide the product by CONST_SCALE, with proper\n * rounding, to produce the correct output.  This division can be done\n * cheaply as a right shift of CONST_BITS bits.  We postpone shifting\n * as long as possible so that partial sums can be added together with\n * full fractional precision.\n *\n * The outputs of the first pass are scaled up by PASS1_BITS bits so that\n * they are represented to better-than-integral precision.  These outputs\n * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word\n * with the recommended scaling.  (To scale up 12-bit sample data further, an\n * intermediate INT32 array would be needed.)\n *\n * To avoid overflow of the 32-bit intermediate results in pass 2, we must\n * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26.  Error analysis\n * shows that the values given below are the most effective.\n */\n\n#if BITS_IN_JSAMPLE == 8\n#define CONST_BITS  13\n#define PASS1_BITS  2\n#else\n#define CONST_BITS  13\n#define PASS1_BITS  1\t\t/* lose a little precision to avoid overflow */\n#endif\n\n/* Some C compilers fail to reduce \"FIX(constant)\" at compile time, thus\n * causing a lot of useless floating-point operations at run time.\n * To get around this we use the following pre-calculated constants.\n * If you change CONST_BITS you may want to add appropriate values.\n * (With a reasonable C compiler, you can just rely on the FIX() macro...)\n */\n\n#if CONST_BITS == 13\n#define FIX_0_298631336  ((INT32)  2446)\t/* FIX(0.298631336) */\n#define FIX_0_390180644  ((INT32)  3196)\t/* FIX(0.390180644) */\n#define FIX_0_541196100  ((INT32)  4433)\t/* FIX(0.541196100) */\n#define FIX_0_765366865  ((INT32)  6270)\t/* FIX(0.765366865) */\n#define FIX_0_899976223  ((INT32)  7373)\t/* FIX(0.899976223) */\n#define FIX_1_175875602  ((INT32)  9633)\t/* FIX(1.175875602) */\n#define FIX_1_501321110  ((INT32)  12299)\t/* FIX(1.501321110) */\n#define FIX_1_847759065  ((INT32)  15137)\t/* FIX(1.847759065) */\n#define FIX_1_961570560  ((INT32)  16069)\t/* FIX(1.961570560) */\n#define FIX_2_053119869  ((INT32)  16819)\t/* FIX(2.053119869) */\n#define FIX_2_562915447  ((INT32)  20995)\t/* FIX(2.562915447) */\n#define FIX_3_072711026  ((INT32)  25172)\t/* FIX(3.072711026) */\n#else\n#define FIX_0_298631336  FIX(0.298631336)\n#define FIX_0_390180644  FIX(0.390180644)\n#define FIX_0_541196100  FIX(0.541196100)\n#define FIX_0_765366865  FIX(0.765366865)\n#define FIX_0_899976223  FIX(0.899976223)\n#define FIX_1_175875602  FIX(1.175875602)\n#define FIX_1_501321110  FIX(1.501321110)\n#define FIX_1_847759065  FIX(1.847759065)\n#define FIX_1_961570560  FIX(1.961570560)\n#define FIX_2_053119869  FIX(2.053119869)\n#define FIX_2_562915447  FIX(2.562915447)\n#define FIX_3_072711026  FIX(3.072711026)\n#endif\n\n\n/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.\n * For 8-bit samples with the recommended scaling, all the variable\n * and constant values involved are no more than 16 bits wide, so a\n * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.\n * For 12-bit samples, a full 32-bit multiplication will be needed.\n */\n\n#if BITS_IN_JSAMPLE == 8\n#define MULTIPLY(var,const)  MULTIPLY16C16(var,const)\n#else\n#define MULTIPLY(var,const)  ((var) * (const))\n#endif\n\n\n/* Dequantize a coefficient by multiplying it by the multiplier-table\n * entry; produce an int result.  In this module, both inputs and result\n * are 16 bits or less, so either int or short multiply will work.\n */\n\n#define DEQUANTIZE(coef,quantval)  (((ISLOW_MULT_TYPE) (coef)) * (quantval))\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients.\n */\n\nGLOBAL(void)\njpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\t JCOEFPTR coef_block,\n\t\t JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3;\n  INT32 tmp10, tmp11, tmp12, tmp13;\n  INT32 z1, z2, z3, z4, z5;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[DCTSIZE2];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array. */\n  /* Note results are scaled up by sqrt(8) compared to a true IDCT; */\n  /* furthermore, we scale the results by 2**PASS1_BITS. */\n\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = DCTSIZE; ctr > 0; ctr--) {\n    /* Due to quantization, we will usually find that many of the input\n     * coefficients are zero, especially the AC terms.  We can exploit this\n     * by short-circuiting the IDCT calculation for any column in which all\n     * the AC terms are zero.  In that case each output is equal to the\n     * DC coefficient (with scale factor as needed).\n     * With typical images and quantization tables, half or more of the\n     * column DCT calculations can be simplified this way.\n     */\n    \n    if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&\n\tinptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&\n\tinptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&\n\tinptr[DCTSIZE*7] == 0) {\n      /* AC terms all zero */\n      int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;\n      \n      wsptr[DCTSIZE*0] = dcval;\n      wsptr[DCTSIZE*1] = dcval;\n      wsptr[DCTSIZE*2] = dcval;\n      wsptr[DCTSIZE*3] = dcval;\n      wsptr[DCTSIZE*4] = dcval;\n      wsptr[DCTSIZE*5] = dcval;\n      wsptr[DCTSIZE*6] = dcval;\n      wsptr[DCTSIZE*7] = dcval;\n      \n      inptr++;\t\t\t/* advance pointers to next column */\n      quantptr++;\n      wsptr++;\n      continue;\n    }\n    \n    /* Even part: reverse the even part of the forward DCT. */\n    /* The rotator is sqrt(2)*c(-6). */\n    \n    z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);\n    \n    z1 = MULTIPLY(z2 + z3, FIX_0_541196100);\n    tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065);\n    tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865);\n    \n    z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);\n\n    tmp0 = (z2 + z3) << CONST_BITS;\n    tmp1 = (z2 - z3) << CONST_BITS;\n    \n    tmp10 = tmp0 + tmp3;\n    tmp13 = tmp0 - tmp3;\n    tmp11 = tmp1 + tmp2;\n    tmp12 = tmp1 - tmp2;\n    \n    /* Odd part per figure 8; the matrix is unitary and hence its\n     * transpose is its inverse.  i0..i3 are y7,y5,y3,y1 respectively.\n     */\n    \n    tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);\n    tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);\n    tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n    tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    \n    z1 = tmp0 + tmp3;\n    z2 = tmp1 + tmp2;\n    z3 = tmp0 + tmp2;\n    z4 = tmp1 + tmp3;\n    z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */\n    \n    tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */\n    tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */\n    tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */\n    tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */\n    z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */\n    z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */\n    z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */\n    z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */\n    \n    z3 += z5;\n    z4 += z5;\n    \n    tmp0 += z1 + z3;\n    tmp1 += z2 + z4;\n    tmp2 += z2 + z3;\n    tmp3 += z1 + z4;\n    \n    /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */\n    \n    wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS);\n    wsptr[DCTSIZE*7] = (int) DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS);\n    wsptr[DCTSIZE*1] = (int) DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS);\n    wsptr[DCTSIZE*6] = (int) DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS);\n    wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS);\n    wsptr[DCTSIZE*5] = (int) DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS);\n    wsptr[DCTSIZE*3] = (int) DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS);\n    wsptr[DCTSIZE*4] = (int) DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS);\n    \n    inptr++;\t\t\t/* advance pointers to next column */\n    quantptr++;\n    wsptr++;\n  }\n  \n  /* Pass 2: process rows from work array, store into output array. */\n  /* Note that we must descale the results by a factor of 8 == 2**3, */\n  /* and also undo the PASS1_BITS scaling. */\n\n  wsptr = workspace;\n  for (ctr = 0; ctr < DCTSIZE; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n    /* Rows of zeroes can be exploited in the same way as we did with columns.\n     * However, the column calculation has created many nonzero AC terms, so\n     * the simplification applies less often (typically 5% to 10% of the time).\n     * On machines with very fast multiplication, it's possible that the\n     * test takes more time than it's worth.  In that case this section\n     * may be commented out.\n     */\n    \n#ifndef NO_ZERO_ROW_TEST\n    if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 &&\n\twsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {\n      /* AC terms all zero */\n      JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)\n\t\t\t\t  & RANGE_MASK];\n      \n      outptr[0] = dcval;\n      outptr[1] = dcval;\n      outptr[2] = dcval;\n      outptr[3] = dcval;\n      outptr[4] = dcval;\n      outptr[5] = dcval;\n      outptr[6] = dcval;\n      outptr[7] = dcval;\n\n      wsptr += DCTSIZE;\t\t/* advance pointer to next row */\n      continue;\n    }\n#endif\n    \n    /* Even part: reverse the even part of the forward DCT. */\n    /* The rotator is sqrt(2)*c(-6). */\n    \n    z2 = (INT32) wsptr[2];\n    z3 = (INT32) wsptr[6];\n    \n    z1 = MULTIPLY(z2 + z3, FIX_0_541196100);\n    tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065);\n    tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865);\n    \n    tmp0 = ((INT32) wsptr[0] + (INT32) wsptr[4]) << CONST_BITS;\n    tmp1 = ((INT32) wsptr[0] - (INT32) wsptr[4]) << CONST_BITS;\n    \n    tmp10 = tmp0 + tmp3;\n    tmp13 = tmp0 - tmp3;\n    tmp11 = tmp1 + tmp2;\n    tmp12 = tmp1 - tmp2;\n    \n    /* Odd part per figure 8; the matrix is unitary and hence its\n     * transpose is its inverse.  i0..i3 are y7,y5,y3,y1 respectively.\n     */\n    \n    tmp0 = (INT32) wsptr[7];\n    tmp1 = (INT32) wsptr[5];\n    tmp2 = (INT32) wsptr[3];\n    tmp3 = (INT32) wsptr[1];\n    \n    z1 = tmp0 + tmp3;\n    z2 = tmp1 + tmp2;\n    z3 = tmp0 + tmp2;\n    z4 = tmp1 + tmp3;\n    z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */\n    \n    tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */\n    tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */\n    tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */\n    tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */\n    z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */\n    z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */\n    z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */\n    z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */\n    \n    z3 += z5;\n    z4 += z5;\n    \n    tmp0 += z1 + z3;\n    tmp1 += z2 + z4;\n    tmp2 += z2 + z3;\n    tmp3 += z1 + z4;\n    \n    /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */\n    \n    outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp3,\n\t\t\t\t\t  CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[7] = range_limit[(int) DESCALE(tmp10 - tmp3,\n\t\t\t\t\t  CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[1] = range_limit[(int) DESCALE(tmp11 + tmp2,\n\t\t\t\t\t  CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[6] = range_limit[(int) DESCALE(tmp11 - tmp2,\n\t\t\t\t\t  CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[2] = range_limit[(int) DESCALE(tmp12 + tmp1,\n\t\t\t\t\t  CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[5] = range_limit[(int) DESCALE(tmp12 - tmp1,\n\t\t\t\t\t  CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[3] = range_limit[(int) DESCALE(tmp13 + tmp0,\n\t\t\t\t\t  CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[4] = range_limit[(int) DESCALE(tmp13 - tmp0,\n\t\t\t\t\t  CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    \n    wsptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n}\n\n#endif /* DCT_ISLOW_SUPPORTED */\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jidctred.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jidctred.c\n *\n * Copyright (C) 1994-1998, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains inverse-DCT routines that produce reduced-size output:\n * either 4x4, 2x2, or 1x1 pixels from an 8x8 DCT block.\n *\n * The implementation is based on the Loeffler, Ligtenberg and Moschytz (LL&M)\n * algorithm used in jidctint.c.  We simply replace each 8-to-8 1-D IDCT step\n * with an 8-to-4 step that produces the four averages of two adjacent outputs\n * (or an 8-to-2 step producing two averages of four outputs, for 2x2 output).\n * These steps were derived by computing the corresponding values at the end\n * of the normal LL&M code, then simplifying as much as possible.\n *\n * 1x1 is trivial: just take the DC coefficient divided by 8.\n *\n * See jidctint.c for additional comments.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jdct.h\"\t\t/* Private declarations for DCT subsystem */\n\n#ifdef IDCT_SCALING_SUPPORTED\n\n\n/*\n * This module is specialized to the case DCTSIZE = 8.\n */\n\n#if DCTSIZE != 8\n  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */\n#endif\n\n\n/* Scaling is the same as in jidctint.c. */\n\n#if BITS_IN_JSAMPLE == 8\n#define CONST_BITS  13\n#define PASS1_BITS  2\n#else\n#define CONST_BITS  13\n#define PASS1_BITS  1\t\t/* lose a little precision to avoid overflow */\n#endif\n\n/* Some C compilers fail to reduce \"FIX(constant)\" at compile time, thus\n * causing a lot of useless floating-point operations at run time.\n * To get around this we use the following pre-calculated constants.\n * If you change CONST_BITS you may want to add appropriate values.\n * (With a reasonable C compiler, you can just rely on the FIX() macro...)\n */\n\n#if CONST_BITS == 13\n#define FIX_0_211164243  ((INT32)  1730)\t/* FIX(0.211164243) */\n#define FIX_0_509795579  ((INT32)  4176)\t/* FIX(0.509795579) */\n#define FIX_0_601344887  ((INT32)  4926)\t/* FIX(0.601344887) */\n#define FIX_0_720959822  ((INT32)  5906)\t/* FIX(0.720959822) */\n#define FIX_0_765366865  ((INT32)  6270)\t/* FIX(0.765366865) */\n#define FIX_0_850430095  ((INT32)  6967)\t/* FIX(0.850430095) */\n#define FIX_0_899976223  ((INT32)  7373)\t/* FIX(0.899976223) */\n#define FIX_1_061594337  ((INT32)  8697)\t/* FIX(1.061594337) */\n#define FIX_1_272758580  ((INT32)  10426)\t/* FIX(1.272758580) */\n#define FIX_1_451774981  ((INT32)  11893)\t/* FIX(1.451774981) */\n#define FIX_1_847759065  ((INT32)  15137)\t/* FIX(1.847759065) */\n#define FIX_2_172734803  ((INT32)  17799)\t/* FIX(2.172734803) */\n#define FIX_2_562915447  ((INT32)  20995)\t/* FIX(2.562915447) */\n#define FIX_3_624509785  ((INT32)  29692)\t/* FIX(3.624509785) */\n#else\n#define FIX_0_211164243  FIX(0.211164243)\n#define FIX_0_509795579  FIX(0.509795579)\n#define FIX_0_601344887  FIX(0.601344887)\n#define FIX_0_720959822  FIX(0.720959822)\n#define FIX_0_765366865  FIX(0.765366865)\n#define FIX_0_850430095  FIX(0.850430095)\n#define FIX_0_899976223  FIX(0.899976223)\n#define FIX_1_061594337  FIX(1.061594337)\n#define FIX_1_272758580  FIX(1.272758580)\n#define FIX_1_451774981  FIX(1.451774981)\n#define FIX_1_847759065  FIX(1.847759065)\n#define FIX_2_172734803  FIX(2.172734803)\n#define FIX_2_562915447  FIX(2.562915447)\n#define FIX_3_624509785  FIX(3.624509785)\n#endif\n\n\n/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.\n * For 8-bit samples with the recommended scaling, all the variable\n * and constant values involved are no more than 16 bits wide, so a\n * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.\n * For 12-bit samples, a full 32-bit multiplication will be needed.\n */\n\n#if BITS_IN_JSAMPLE == 8\n#define MULTIPLY(var,const)  MULTIPLY16C16(var,const)\n#else\n#define MULTIPLY(var,const)  ((var) * (const))\n#endif\n\n\n/* Dequantize a coefficient by multiplying it by the multiplier-table\n * entry; produce an int result.  In this module, both inputs and result\n * are 16 bits or less, so either int or short multiply will work.\n */\n\n#define DEQUANTIZE(coef,quantval)  (((ISLOW_MULT_TYPE) (coef)) * (quantval))\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a reduced-size 4x4 output block.\n */\n\nGLOBAL(void)\njpeg_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t       JCOEFPTR coef_block,\n\t       JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp0, tmp2, tmp10, tmp12;\n  INT32 z1, z2, z3, z4;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[DCTSIZE*4];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array. */\n\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) {\n    /* Don't bother to process column 4, because second pass won't use it */\n    if (ctr == DCTSIZE-4)\n      continue;\n    if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&\n\tinptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*5] == 0 &&\n\tinptr[DCTSIZE*6] == 0 && inptr[DCTSIZE*7] == 0) {\n      /* AC terms all zero; we need not examine term 4 for 4x4 output */\n      int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;\n      \n      wsptr[DCTSIZE*0] = dcval;\n      wsptr[DCTSIZE*1] = dcval;\n      wsptr[DCTSIZE*2] = dcval;\n      wsptr[DCTSIZE*3] = dcval;\n      \n      continue;\n    }\n    \n    /* Even part */\n    \n    tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    tmp0 <<= (CONST_BITS+1);\n    \n    z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);\n\n    tmp2 = MULTIPLY(z2, FIX_1_847759065) + MULTIPLY(z3, - FIX_0_765366865);\n    \n    tmp10 = tmp0 + tmp2;\n    tmp12 = tmp0 - tmp2;\n    \n    /* Odd part */\n    \n    z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);\n    z2 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n    z4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    \n    tmp0 = MULTIPLY(z1, - FIX_0_211164243) /* sqrt(2) * (c3-c1) */\n\t + MULTIPLY(z2, FIX_1_451774981) /* sqrt(2) * (c3+c7) */\n\t + MULTIPLY(z3, - FIX_2_172734803) /* sqrt(2) * (-c1-c5) */\n\t + MULTIPLY(z4, FIX_1_061594337); /* sqrt(2) * (c5+c7) */\n    \n    tmp2 = MULTIPLY(z1, - FIX_0_509795579) /* sqrt(2) * (c7-c5) */\n\t + MULTIPLY(z2, - FIX_0_601344887) /* sqrt(2) * (c5-c1) */\n\t + MULTIPLY(z3, FIX_0_899976223) /* sqrt(2) * (c3-c7) */\n\t + MULTIPLY(z4, FIX_2_562915447); /* sqrt(2) * (c1+c3) */\n\n    /* Final output stage */\n    \n    wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp2, CONST_BITS-PASS1_BITS+1);\n    wsptr[DCTSIZE*3] = (int) DESCALE(tmp10 - tmp2, CONST_BITS-PASS1_BITS+1);\n    wsptr[DCTSIZE*1] = (int) DESCALE(tmp12 + tmp0, CONST_BITS-PASS1_BITS+1);\n    wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 - tmp0, CONST_BITS-PASS1_BITS+1);\n  }\n  \n  /* Pass 2: process 4 rows from work array, store into output array. */\n\n  wsptr = workspace;\n  for (ctr = 0; ctr < 4; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n    /* It's not clear whether a zero row test is worthwhile here ... */\n\n#ifndef NO_ZERO_ROW_TEST\n    if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 &&\n\twsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {\n      /* AC terms all zero */\n      JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)\n\t\t\t\t  & RANGE_MASK];\n      \n      outptr[0] = dcval;\n      outptr[1] = dcval;\n      outptr[2] = dcval;\n      outptr[3] = dcval;\n      \n      wsptr += DCTSIZE;\t\t/* advance pointer to next row */\n      continue;\n    }\n#endif\n    \n    /* Even part */\n    \n    tmp0 = ((INT32) wsptr[0]) << (CONST_BITS+1);\n    \n    tmp2 = MULTIPLY((INT32) wsptr[2], FIX_1_847759065)\n\t + MULTIPLY((INT32) wsptr[6], - FIX_0_765366865);\n    \n    tmp10 = tmp0 + tmp2;\n    tmp12 = tmp0 - tmp2;\n    \n    /* Odd part */\n    \n    z1 = (INT32) wsptr[7];\n    z2 = (INT32) wsptr[5];\n    z3 = (INT32) wsptr[3];\n    z4 = (INT32) wsptr[1];\n    \n    tmp0 = MULTIPLY(z1, - FIX_0_211164243) /* sqrt(2) * (c3-c1) */\n\t + MULTIPLY(z2, FIX_1_451774981) /* sqrt(2) * (c3+c7) */\n\t + MULTIPLY(z3, - FIX_2_172734803) /* sqrt(2) * (-c1-c5) */\n\t + MULTIPLY(z4, FIX_1_061594337); /* sqrt(2) * (c5+c7) */\n    \n    tmp2 = MULTIPLY(z1, - FIX_0_509795579) /* sqrt(2) * (c7-c5) */\n\t + MULTIPLY(z2, - FIX_0_601344887) /* sqrt(2) * (c5-c1) */\n\t + MULTIPLY(z3, FIX_0_899976223) /* sqrt(2) * (c3-c7) */\n\t + MULTIPLY(z4, FIX_2_562915447); /* sqrt(2) * (c1+c3) */\n\n    /* Final output stage */\n    \n    outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp2,\n\t\t\t\t\t  CONST_BITS+PASS1_BITS+3+1)\n\t\t\t    & RANGE_MASK];\n    outptr[3] = range_limit[(int) DESCALE(tmp10 - tmp2,\n\t\t\t\t\t  CONST_BITS+PASS1_BITS+3+1)\n\t\t\t    & RANGE_MASK];\n    outptr[1] = range_limit[(int) DESCALE(tmp12 + tmp0,\n\t\t\t\t\t  CONST_BITS+PASS1_BITS+3+1)\n\t\t\t    & RANGE_MASK];\n    outptr[2] = range_limit[(int) DESCALE(tmp12 - tmp0,\n\t\t\t\t\t  CONST_BITS+PASS1_BITS+3+1)\n\t\t\t    & RANGE_MASK];\n    \n    wsptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a reduced-size 2x2 output block.\n */\n\nGLOBAL(void)\njpeg_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t       JCOEFPTR coef_block,\n\t       JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp0, tmp10, z1;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[DCTSIZE*2];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array. */\n\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) {\n    /* Don't bother to process columns 2,4,6 */\n    if (ctr == DCTSIZE-2 || ctr == DCTSIZE-4 || ctr == DCTSIZE-6)\n      continue;\n    if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*3] == 0 &&\n\tinptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*7] == 0) {\n      /* AC terms all zero; we need not examine terms 2,4,6 for 2x2 output */\n      int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;\n      \n      wsptr[DCTSIZE*0] = dcval;\n      wsptr[DCTSIZE*1] = dcval;\n      \n      continue;\n    }\n    \n    /* Even part */\n    \n    z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    tmp10 = z1 << (CONST_BITS+2);\n    \n    /* Odd part */\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);\n    tmp0 = MULTIPLY(z1, - FIX_0_720959822); /* sqrt(2) * (c7-c5+c3-c1) */\n    z1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);\n    tmp0 += MULTIPLY(z1, FIX_0_850430095); /* sqrt(2) * (-c1+c3+c5+c7) */\n    z1 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n    tmp0 += MULTIPLY(z1, - FIX_1_272758580); /* sqrt(2) * (-c1+c3-c5-c7) */\n    z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    tmp0 += MULTIPLY(z1, FIX_3_624509785); /* sqrt(2) * (c1+c3+c5+c7) */\n\n    /* Final output stage */\n    \n    wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp0, CONST_BITS-PASS1_BITS+2);\n    wsptr[DCTSIZE*1] = (int) DESCALE(tmp10 - tmp0, CONST_BITS-PASS1_BITS+2);\n  }\n  \n  /* Pass 2: process 2 rows from work array, store into output array. */\n\n  wsptr = workspace;\n  for (ctr = 0; ctr < 2; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n    /* It's not clear whether a zero row test is worthwhile here ... */\n\n#ifndef NO_ZERO_ROW_TEST\n    if (wsptr[1] == 0 && wsptr[3] == 0 && wsptr[5] == 0 && wsptr[7] == 0) {\n      /* AC terms all zero */\n      JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)\n\t\t\t\t  & RANGE_MASK];\n      \n      outptr[0] = dcval;\n      outptr[1] = dcval;\n      \n      wsptr += DCTSIZE;\t\t/* advance pointer to next row */\n      continue;\n    }\n#endif\n    \n    /* Even part */\n    \n    tmp10 = ((INT32) wsptr[0]) << (CONST_BITS+2);\n    \n    /* Odd part */\n\n    tmp0 = MULTIPLY((INT32) wsptr[7], - FIX_0_720959822) /* sqrt(2) * (c7-c5+c3-c1) */\n\t + MULTIPLY((INT32) wsptr[5], FIX_0_850430095) /* sqrt(2) * (-c1+c3+c5+c7) */\n\t + MULTIPLY((INT32) wsptr[3], - FIX_1_272758580) /* sqrt(2) * (-c1+c3-c5-c7) */\n\t + MULTIPLY((INT32) wsptr[1], FIX_3_624509785); /* sqrt(2) * (c1+c3+c5+c7) */\n\n    /* Final output stage */\n    \n    outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp0,\n\t\t\t\t\t  CONST_BITS+PASS1_BITS+3+2)\n\t\t\t    & RANGE_MASK];\n    outptr[1] = range_limit[(int) DESCALE(tmp10 - tmp0,\n\t\t\t\t\t  CONST_BITS+PASS1_BITS+3+2)\n\t\t\t    & RANGE_MASK];\n    \n    wsptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a reduced-size 1x1 output block.\n */\n\nGLOBAL(void)\njpeg_idct_1x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t       JCOEFPTR coef_block,\n\t       JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  int dcval;\n  ISLOW_MULT_TYPE * quantptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  SHIFT_TEMPS\n\n  /* We hardly need an inverse DCT routine for this: just take the\n   * average pixel value, which is one-eighth of the DC coefficient.\n   */\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  dcval = DEQUANTIZE(coef_block[0], quantptr[0]);\n  dcval = (int) DESCALE((INT32) dcval, 3);\n\n  output_buf[0][output_col] = range_limit[dcval & RANGE_MASK];\n}\n\n#endif /* IDCT_SCALING_SUPPORTED */\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jmemmgr.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jmemmgr.c\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains the JPEG system-independent memory management\n * routines.  This code is usable across a wide variety of machines; most\n * of the system dependencies have been isolated in a separate file.\n * The major functions provided here are:\n *   * pool-based allocation and freeing of memory;\n *   * policy decisions about how to divide available memory among the\n *     virtual arrays;\n *   * control logic for swapping virtual arrays between main memory and\n *     backing storage.\n * The separate system-dependent file provides the actual backing-storage\n * access code, and it contains the policy decision about how much total\n * main memory to use.\n * This file is system-dependent in the sense that some of its functions\n * are unnecessary in some systems.  For example, if there is enough virtual\n * memory so that backing storage will never be used, much of the virtual\n * array control logic could be removed.  (Of course, if you have that much\n * memory then you shouldn't care about a little bit of unused code...)\n */\n\n#define JPEG_INTERNALS\n#define AM_MEMORY_MANAGER\t/* we define jvirt_Xarray_control structs */\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jmemsys.h\"\t\t/* import the system-dependent declarations */\n\n#define NO_GETENV\t/* XYQ: 2007-5-22 Don't use it */\n\n#ifndef NO_GETENV\n#ifndef HAVE_STDLIB_H\t\t/* <stdlib.h> should declare getenv() */\nextern char * getenv JPP((const char * name));\n#endif\n#endif\n\n\n/*\n * Some important notes:\n *   The allocation routines provided here must never return NULL.\n *   They should exit to error_exit if unsuccessful.\n *\n *   It's not a good idea to try to merge the sarray and barray routines,\n *   even though they are textually almost the same, because samples are\n *   usually stored as bytes while coefficients are shorts or ints.  Thus,\n *   in machines where byte pointers have a different representation from\n *   word pointers, the resulting machine code could not be the same.\n */\n\n\n/*\n * Many machines require storage alignment: longs must start on 4-byte\n * boundaries, doubles on 8-byte boundaries, etc.  On such machines, malloc()\n * always returns pointers that are multiples of the worst-case alignment\n * requirement, and we had better do so too.\n * There isn't any really portable way to determine the worst-case alignment\n * requirement.  This module assumes that the alignment requirement is\n * multiples of sizeof(ALIGN_TYPE).\n * By default, we define ALIGN_TYPE as double.  This is necessary on some\n * workstations (where doubles really do need 8-byte alignment) and will work\n * fine on nearly everything.  If your machine has lesser alignment needs,\n * you can save a few bytes by making ALIGN_TYPE smaller.\n * The only place I know of where this will NOT work is certain Macintosh\n * 680x0 compilers that define double as a 10-byte IEEE extended float.\n * Doing 10-byte alignment is counterproductive because longwords won't be\n * aligned well.  Put \"#define ALIGN_TYPE long\" in jconfig.h if you have\n * such a compiler.\n */\n\n#ifndef ALIGN_TYPE\t\t/* so can override from jconfig.h */\n#define ALIGN_TYPE  double\n#endif\n\n\n/*\n * We allocate objects from \"pools\", where each pool is gotten with a single\n * request to jpeg_get_small() or jpeg_get_large().  There is no per-object\n * overhead within a pool, except for alignment padding.  Each pool has a\n * header with a link to the next pool of the same class.\n * Small and large pool headers are identical except that the latter's\n * link pointer must be FAR on 80x86 machines.\n * Notice that the \"real\" header fields are union'ed with a dummy ALIGN_TYPE\n * field.  This forces the compiler to make SIZEOF(small_pool_hdr) a multiple\n * of the alignment requirement of ALIGN_TYPE.\n */\n\ntypedef union small_pool_struct * small_pool_ptr;\n\ntypedef union small_pool_struct {\n  struct {\n    small_pool_ptr next;\t/* next in list of pools */\n    size_t bytes_used;\t\t/* how many bytes already used within pool */\n    size_t bytes_left;\t\t/* bytes still available in this pool */\n  } hdr;\n  ALIGN_TYPE dummy;\t\t/* included in union to ensure alignment */\n} small_pool_hdr;\n\ntypedef union large_pool_struct FAR * large_pool_ptr;\n\ntypedef union large_pool_struct {\n  struct {\n    large_pool_ptr next;\t/* next in list of pools */\n    size_t bytes_used;\t\t/* how many bytes already used within pool */\n    size_t bytes_left;\t\t/* bytes still available in this pool */\n  } hdr;\n  ALIGN_TYPE dummy;\t\t/* included in union to ensure alignment */\n} large_pool_hdr;\n\n\n/*\n * Here is the full definition of a memory manager object.\n */\n\ntypedef struct {\n  struct jpeg_memory_mgr pub;\t/* public fields */\n\n  /* Each pool identifier (lifetime class) names a linked list of pools. */\n  small_pool_ptr small_list[JPOOL_NUMPOOLS];\n  large_pool_ptr large_list[JPOOL_NUMPOOLS];\n\n  /* Since we only have one lifetime class of virtual arrays, only one\n   * linked list is necessary (for each datatype).  Note that the virtual\n   * array control blocks being linked together are actually stored somewhere\n   * in the small-pool list.\n   */\n  jvirt_sarray_ptr virt_sarray_list;\n  jvirt_barray_ptr virt_barray_list;\n\n  /* This counts total space obtained from jpeg_get_small/large */\n  long total_space_allocated;\n\n  /* alloc_sarray and alloc_barray set this value for use by virtual\n   * array routines.\n   */\n  JDIMENSION last_rowsperchunk;\t/* from most recent alloc_sarray/barray */\n} my_memory_mgr;\n\ntypedef my_memory_mgr * my_mem_ptr;\n\n\n/*\n * The control blocks for virtual arrays.\n * Note that these blocks are allocated in the \"small\" pool area.\n * System-dependent info for the associated backing store (if any) is hidden\n * inside the backing_store_info struct.\n */\n\nstruct jvirt_sarray_control {\n  JSAMPARRAY mem_buffer;\t/* => the in-memory buffer */\n  JDIMENSION rows_in_array;\t/* total virtual array height */\n  JDIMENSION samplesperrow;\t/* width of array (and of memory buffer) */\n  JDIMENSION maxaccess;\t\t/* max rows accessed by access_virt_sarray */\n  JDIMENSION rows_in_mem;\t/* height of memory buffer */\n  JDIMENSION rowsperchunk;\t/* allocation chunk size in mem_buffer */\n  JDIMENSION cur_start_row;\t/* first logical row # in the buffer */\n  JDIMENSION first_undef_row;\t/* row # of first uninitialized row */\n  boolean pre_zero;\t\t/* pre-zero mode requested? */\n  boolean dirty;\t\t/* do current buffer contents need written? */\n  boolean b_s_open;\t\t/* is backing-store data valid? */\n  jvirt_sarray_ptr next;\t/* link to next virtual sarray control block */\n  backing_store_info b_s_info;\t/* System-dependent control info */\n};\n\nstruct jvirt_barray_control {\n  JBLOCKARRAY mem_buffer;\t/* => the in-memory buffer */\n  JDIMENSION rows_in_array;\t/* total virtual array height */\n  JDIMENSION blocksperrow;\t/* width of array (and of memory buffer) */\n  JDIMENSION maxaccess;\t\t/* max rows accessed by access_virt_barray */\n  JDIMENSION rows_in_mem;\t/* height of memory buffer */\n  JDIMENSION rowsperchunk;\t/* allocation chunk size in mem_buffer */\n  JDIMENSION cur_start_row;\t/* first logical row # in the buffer */\n  JDIMENSION first_undef_row;\t/* row # of first uninitialized row */\n  boolean pre_zero;\t\t/* pre-zero mode requested? */\n  boolean dirty;\t\t/* do current buffer contents need written? */\n  boolean b_s_open;\t\t/* is backing-store data valid? */\n  jvirt_barray_ptr next;\t/* link to next virtual barray control block */\n  backing_store_info b_s_info;\t/* System-dependent control info */\n};\n\n\n#ifdef MEM_STATS\t\t/* optional extra stuff for statistics */\n\nLOCAL(void)\nprint_mem_stats (j_common_ptr cinfo, int pool_id)\n{\n  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;\n  small_pool_ptr shdr_ptr;\n  large_pool_ptr lhdr_ptr;\n\n  /* Since this is only a debugging stub, we can cheat a little by using\n   * fprintf directly rather than going through the trace message code.\n   * This is helpful because message parm array can't handle longs.\n   */\n  FXSYS_fprintf(stderr, \"Freeing pool %d, total space = %ld\\n\",\n\t  pool_id, mem->total_space_allocated);\n\n  for (lhdr_ptr = mem->large_list[pool_id]; lhdr_ptr != NULL;\n       lhdr_ptr = lhdr_ptr->hdr.next) {\n    FXSYS_fprintf(stderr, \"  Large chunk used %ld\\n\",\n\t    (long) lhdr_ptr->hdr.bytes_used);\n  }\n\n  for (shdr_ptr = mem->small_list[pool_id]; shdr_ptr != NULL;\n       shdr_ptr = shdr_ptr->hdr.next) {\n    FXSYS_fprintf(stderr, \"  Small chunk used %ld free %ld\\n\",\n\t    (long) shdr_ptr->hdr.bytes_used,\n\t    (long) shdr_ptr->hdr.bytes_left);\n  }\n}\n\n#endif /* MEM_STATS */\n\n\nLOCAL(void)\nout_of_memory (j_common_ptr cinfo, int which)\n/* Report an out-of-memory error and stop execution */\n/* If we compiled MEM_STATS support, report alloc requests before dying */\n{\n#ifdef MEM_STATS\n  cinfo->err->trace_level = 2;\t/* force self_destruct to report stats */\n#endif\n  ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, which);\n}\n\n\n/*\n * Allocation of \"small\" objects.\n *\n * For these, we use pooled storage.  When a new pool must be created,\n * we try to get enough space for the current request plus a \"slop\" factor,\n * where the slop will be the amount of leftover space in the new pool.\n * The speed vs. space tradeoff is largely determined by the slop values.\n * A different slop value is provided for each pool class (lifetime),\n * and we also distinguish the first pool of a class from later ones.\n * NOTE: the values given work fairly well on both 16- and 32-bit-int\n * machines, but may be too small if longs are 64 bits or more.\n */\n\nstatic const size_t first_pool_slop[JPOOL_NUMPOOLS] = \n{\n\t1600,\t\t\t/* first PERMANENT pool */\n\t16000\t\t\t/* first IMAGE pool */\n};\n\nstatic const size_t extra_pool_slop[JPOOL_NUMPOOLS] = \n{\n\t0,\t\t\t/* additional PERMANENT pools */\n\t5000\t\t\t/* additional IMAGE pools */\n};\n\n#define MIN_SLOP  50\t\t/* greater than 0 to avoid futile looping */\n\n\nMETHODDEF(void *)\nalloc_small (j_common_ptr cinfo, int pool_id, size_t sizeofobject)\n/* Allocate a \"small\" object */\n{\n  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;\n  small_pool_ptr hdr_ptr, prev_hdr_ptr;\n  char * data_ptr;\n  size_t odd_bytes, min_request, slop;\n\n  /* Check for unsatisfiable request (do now to ensure no overflow below) */\n  if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(small_pool_hdr)))\n    out_of_memory(cinfo, 1);\t/* request exceeds malloc's ability */\n\n  /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */\n  odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE);\n  if (odd_bytes > 0)\n    sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes;\n\n  /* See if space is available in any existing pool */\n  if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS)\n    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id);\t/* safety check */\n  prev_hdr_ptr = NULL;\n  hdr_ptr = mem->small_list[pool_id];\n  while (hdr_ptr != NULL) {\n    if (hdr_ptr->hdr.bytes_left >= sizeofobject)\n      break;\t\t\t/* found pool with enough space */\n    prev_hdr_ptr = hdr_ptr;\n    hdr_ptr = hdr_ptr->hdr.next;\n  }\n\n  /* Time to make a new pool? */\n  if (hdr_ptr == NULL) {\n    /* min_request is what we need now, slop is what will be leftover */\n    min_request = sizeofobject + SIZEOF(small_pool_hdr);\n    if (prev_hdr_ptr == NULL)\t/* first pool in class? */\n      slop = first_pool_slop[pool_id];\n    else\n      slop = extra_pool_slop[pool_id];\n    /* Don't ask for more than MAX_ALLOC_CHUNK */\n    if (slop > (size_t) (MAX_ALLOC_CHUNK-min_request))\n      slop = (size_t) (MAX_ALLOC_CHUNK-min_request);\n    /* Try to get space, if fail reduce slop and try again */\n    for (;;) {\n      hdr_ptr = (small_pool_ptr) jpeg_get_small(cinfo, min_request + slop);\n      if (hdr_ptr != NULL)\n\tbreak;\n      slop /= 2;\n      if (slop < MIN_SLOP)\t/* give up when it gets real small */\n\tout_of_memory(cinfo, 2); /* jpeg_get_small failed */\n    }\n    mem->total_space_allocated += min_request + slop;\n    /* Success, initialize the new pool header and add to end of list */\n    hdr_ptr->hdr.next = NULL;\n    hdr_ptr->hdr.bytes_used = 0;\n    hdr_ptr->hdr.bytes_left = sizeofobject + slop;\n    if (prev_hdr_ptr == NULL)\t/* first pool in class? */\n      mem->small_list[pool_id] = hdr_ptr;\n    else\n      prev_hdr_ptr->hdr.next = hdr_ptr;\n  }\n\n  /* OK, allocate the object from the current pool */\n  data_ptr = (char *) (hdr_ptr + 1); /* point to first data byte in pool */\n  data_ptr += hdr_ptr->hdr.bytes_used; /* point to place for object */\n  hdr_ptr->hdr.bytes_used += sizeofobject;\n  hdr_ptr->hdr.bytes_left -= sizeofobject;\n\n  return (void *) data_ptr;\n}\n\n\n/*\n * Allocation of \"large\" objects.\n *\n * The external semantics of these are the same as \"small\" objects,\n * except that FAR pointers are used on 80x86.  However the pool\n * management heuristics are quite different.  We assume that each\n * request is large enough that it may as well be passed directly to\n * jpeg_get_large; the pool management just links everything together\n * so that we can free it all on demand.\n * Note: the major use of \"large\" objects is in JSAMPARRAY and JBLOCKARRAY\n * structures.  The routines that create these structures (see below)\n * deliberately bunch rows together to ensure a large request size.\n */\n\nMETHODDEF(void FAR *)\nalloc_large (j_common_ptr cinfo, int pool_id, size_t sizeofobject)\n/* Allocate a \"large\" object */\n{\n  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;\n  large_pool_ptr hdr_ptr;\n  size_t odd_bytes;\n\n  /* Check for unsatisfiable request (do now to ensure no overflow below) */\n  if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)))\n    out_of_memory(cinfo, 3);\t/* request exceeds malloc's ability */\n\n  /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */\n  odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE);\n  if (odd_bytes > 0)\n    sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes;\n\n  /* Always make a new pool */\n  if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS)\n    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id);\t/* safety check */\n\n  hdr_ptr = (large_pool_ptr) jpeg_get_large(cinfo, sizeofobject +\n\t\t\t\t\t    SIZEOF(large_pool_hdr));\n  if (hdr_ptr == NULL)\n    out_of_memory(cinfo, 4);\t/* jpeg_get_large failed */\n  mem->total_space_allocated += sizeofobject + SIZEOF(large_pool_hdr);\n\n  /* Success, initialize the new pool header and add to list */\n  hdr_ptr->hdr.next = mem->large_list[pool_id];\n  /* We maintain space counts in each pool header for statistical purposes,\n   * even though they are not needed for allocation.\n   */\n  hdr_ptr->hdr.bytes_used = sizeofobject;\n  hdr_ptr->hdr.bytes_left = 0;\n  mem->large_list[pool_id] = hdr_ptr;\n\n  return (void FAR *) (hdr_ptr + 1); /* point to first data byte in pool */\n}\n\n\n/*\n * Creation of 2-D sample arrays.\n * The pointers are in near heap, the samples themselves in FAR heap.\n *\n * To minimize allocation overhead and to allow I/O of large contiguous\n * blocks, we allocate the sample rows in groups of as many rows as possible\n * without exceeding MAX_ALLOC_CHUNK total bytes per allocation request.\n * NB: the virtual array control routines, later in this file, know about\n * this chunking of rows.  The rowsperchunk value is left in the mem manager\n * object so that it can be saved away if this sarray is the workspace for\n * a virtual array.\n */\n\nMETHODDEF(JSAMPARRAY)\nalloc_sarray (j_common_ptr cinfo, int pool_id,\n\t      JDIMENSION samplesperrow, JDIMENSION numrows)\n/* Allocate a 2-D sample array */\n{\n  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;\n  JSAMPARRAY result;\n  JSAMPROW workspace;\n  JDIMENSION rowsperchunk, currow, i;\n  long ltemp;\n\n  /* Calculate max # of rows allowed in one allocation chunk */\n  ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) /\n\t  ((long) samplesperrow * SIZEOF(JSAMPLE));\n  if (ltemp <= 0)\n    ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);\n  if (ltemp < (long) numrows)\n    rowsperchunk = (JDIMENSION) ltemp;\n  else\n    rowsperchunk = numrows;\n  mem->last_rowsperchunk = rowsperchunk;\n\n  /* Get space for row pointers (small object) */\n  result = (JSAMPARRAY) alloc_small(cinfo, pool_id,\n\t\t\t\t    (size_t) (numrows * SIZEOF(JSAMPROW)));\n\n  /* Get the rows themselves (large objects) */\n  currow = 0;\n  while (currow < numrows) {\n    rowsperchunk = MIN(rowsperchunk, numrows - currow);\n    workspace = (JSAMPROW) alloc_large(cinfo, pool_id,\n\t(size_t) ((size_t) rowsperchunk * (size_t) samplesperrow\n\t\t  * SIZEOF(JSAMPLE)));\n    for (i = rowsperchunk; i > 0; i--) {\n      result[currow++] = workspace;\n      workspace += samplesperrow;\n    }\n  }\n\n  return result;\n}\n\n\n/*\n * Creation of 2-D coefficient-block arrays.\n * This is essentially the same as the code for sample arrays, above.\n */\n\nMETHODDEF(JBLOCKARRAY)\nalloc_barray (j_common_ptr cinfo, int pool_id,\n\t      JDIMENSION blocksperrow, JDIMENSION numrows)\n/* Allocate a 2-D coefficient-block array */\n{\n  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;\n  JBLOCKARRAY result;\n  JBLOCKROW workspace;\n  JDIMENSION rowsperchunk, currow, i;\n  long ltemp;\n\n  /* Calculate max # of rows allowed in one allocation chunk */\n  ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) /\n\t  ((long) blocksperrow * SIZEOF(JBLOCK));\n  if (ltemp <= 0)\n    ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);\n  if (ltemp < (long) numrows)\n    rowsperchunk = (JDIMENSION) ltemp;\n  else\n    rowsperchunk = numrows;\n  mem->last_rowsperchunk = rowsperchunk;\n\n  /* Get space for row pointers (small object) */\n  result = (JBLOCKARRAY) alloc_small(cinfo, pool_id,\n\t\t\t\t     (size_t) (numrows * SIZEOF(JBLOCKROW)));\n\n  /* Get the rows themselves (large objects) */\n  currow = 0;\n  while (currow < numrows) {\n    rowsperchunk = MIN(rowsperchunk, numrows - currow);\n    workspace = (JBLOCKROW) alloc_large(cinfo, pool_id,\n\t(size_t) ((size_t) rowsperchunk * (size_t) blocksperrow\n\t\t  * SIZEOF(JBLOCK)));\n    for (i = rowsperchunk; i > 0; i--) {\n      result[currow++] = workspace;\n      workspace += blocksperrow;\n    }\n  }\n\n  return result;\n}\n\n\n/*\n * About virtual array management:\n *\n * The above \"normal\" array routines are only used to allocate strip buffers\n * (as wide as the image, but just a few rows high).  Full-image-sized buffers\n * are handled as \"virtual\" arrays.  The array is still accessed a strip at a\n * time, but the memory manager must save the whole array for repeated\n * accesses.  The intended implementation is that there is a strip buffer in\n * memory (as high as is possible given the desired memory limit), plus a\n * backing file that holds the rest of the array.\n *\n * The request_virt_array routines are told the total size of the image and\n * the maximum number of rows that will be accessed at once.  The in-memory\n * buffer must be at least as large as the maxaccess value.\n *\n * The request routines create control blocks but not the in-memory buffers.\n * That is postponed until realize_virt_arrays is called.  At that time the\n * total amount of space needed is known (approximately, anyway), so free\n * memory can be divided up fairly.\n *\n * The access_virt_array routines are responsible for making a specific strip\n * area accessible (after reading or writing the backing file, if necessary).\n * Note that the access routines are told whether the caller intends to modify\n * the accessed strip; during a read-only pass this saves having to rewrite\n * data to disk.  The access routines are also responsible for pre-zeroing\n * any newly accessed rows, if pre-zeroing was requested.\n *\n * In current usage, the access requests are usually for nonoverlapping\n * strips; that is, successive access start_row numbers differ by exactly\n * num_rows = maxaccess.  This means we can get good performance with simple\n * buffer dump/reload logic, by making the in-memory buffer be a multiple\n * of the access height; then there will never be accesses across bufferload\n * boundaries.  The code will still work with overlapping access requests,\n * but it doesn't handle bufferload overlaps very efficiently.\n */\n\n\nMETHODDEF(jvirt_sarray_ptr)\nrequest_virt_sarray (j_common_ptr cinfo, int pool_id, boolean pre_zero,\n\t\t     JDIMENSION samplesperrow, JDIMENSION numrows,\n\t\t     JDIMENSION maxaccess)\n/* Request a virtual 2-D sample array */\n{\n  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;\n  jvirt_sarray_ptr result;\n\n  /* Only IMAGE-lifetime virtual arrays are currently supported */\n  if (pool_id != JPOOL_IMAGE)\n    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id);\t/* safety check */\n\n  /* get control block */\n  result = (jvirt_sarray_ptr) alloc_small(cinfo, pool_id,\n\t\t\t\t\t  SIZEOF(struct jvirt_sarray_control));\n\n  result->mem_buffer = NULL;\t/* marks array not yet realized */\n  result->rows_in_array = numrows;\n  result->samplesperrow = samplesperrow;\n  result->maxaccess = maxaccess;\n  result->pre_zero = pre_zero;\n  result->b_s_open = FALSE;\t/* no associated backing-store object */\n  result->next = mem->virt_sarray_list; /* add to list of virtual arrays */\n  mem->virt_sarray_list = result;\n\n  return result;\n}\n\n\nMETHODDEF(jvirt_barray_ptr)\nrequest_virt_barray (j_common_ptr cinfo, int pool_id, boolean pre_zero,\n\t\t     JDIMENSION blocksperrow, JDIMENSION numrows,\n\t\t     JDIMENSION maxaccess)\n/* Request a virtual 2-D coefficient-block array */\n{\n  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;\n  jvirt_barray_ptr result;\n\n  /* Only IMAGE-lifetime virtual arrays are currently supported */\n  if (pool_id != JPOOL_IMAGE)\n    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id);\t/* safety check */\n\n  /* get control block */\n  result = (jvirt_barray_ptr) alloc_small(cinfo, pool_id,\n\t\t\t\t\t  SIZEOF(struct jvirt_barray_control));\n\n  result->mem_buffer = NULL;\t/* marks array not yet realized */\n  result->rows_in_array = numrows;\n  result->blocksperrow = blocksperrow;\n  result->maxaccess = maxaccess;\n  result->pre_zero = pre_zero;\n  result->b_s_open = FALSE;\t/* no associated backing-store object */\n  result->next = mem->virt_barray_list; /* add to list of virtual arrays */\n  mem->virt_barray_list = result;\n\n  return result;\n}\n\n\nMETHODDEF(void)\nrealize_virt_arrays (j_common_ptr cinfo)\n/* Allocate the in-memory buffers for any unrealized virtual arrays */\n{\n  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;\n  long space_per_minheight, maximum_space, avail_mem;\n  long minheights, max_minheights;\n  jvirt_sarray_ptr sptr;\n  jvirt_barray_ptr bptr;\n\n  /* Compute the minimum space needed (maxaccess rows in each buffer)\n   * and the maximum space needed (full image height in each buffer).\n   * These may be of use to the system-dependent jpeg_mem_available routine.\n   */\n  space_per_minheight = 0;\n  maximum_space = 0;\n  for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {\n    if (sptr->mem_buffer == NULL) { /* if not realized yet */\n      space_per_minheight += (long) sptr->maxaccess *\n\t\t\t     (long) sptr->samplesperrow * SIZEOF(JSAMPLE);\n      maximum_space += (long) sptr->rows_in_array *\n\t\t       (long) sptr->samplesperrow * SIZEOF(JSAMPLE);\n    }\n  }\n  for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {\n    if (bptr->mem_buffer == NULL) { /* if not realized yet */\n      space_per_minheight += (long) bptr->maxaccess *\n\t\t\t     (long) bptr->blocksperrow * SIZEOF(JBLOCK);\n      maximum_space += (long) bptr->rows_in_array *\n\t\t       (long) bptr->blocksperrow * SIZEOF(JBLOCK);\n    }\n  }\n\n  if (space_per_minheight <= 0)\n    return;\t\t\t/* no unrealized arrays, no work */\n\n  /* Determine amount of memory to actually use; this is system-dependent. */\n  avail_mem = jpeg_mem_available(cinfo, space_per_minheight, maximum_space,\n\t\t\t\t mem->total_space_allocated);\n\n  /* If the maximum space needed is available, make all the buffers full\n   * height; otherwise parcel it out with the same number of minheights\n   * in each buffer.\n   */\n  if (avail_mem >= maximum_space)\n    max_minheights = 1000000000L;\n  else {\n    max_minheights = avail_mem / space_per_minheight;\n    /* If there doesn't seem to be enough space, try to get the minimum\n     * anyway.  This allows a \"stub\" implementation of jpeg_mem_available().\n     */\n    if (max_minheights <= 0)\n      max_minheights = 1;\n  }\n\n  /* Allocate the in-memory buffers and initialize backing store as needed. */\n\n  for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {\n    if (sptr->mem_buffer == NULL) { /* if not realized yet */\n      minheights = ((long) sptr->rows_in_array - 1L) / sptr->maxaccess + 1L;\n      if (minheights <= max_minheights) {\n\t/* This buffer fits in memory */\n\tsptr->rows_in_mem = sptr->rows_in_array;\n      } else {\n\t/* It doesn't fit in memory, create backing store. */\n\tsptr->rows_in_mem = (JDIMENSION) (max_minheights * sptr->maxaccess);\n\tjpeg_open_backing_store(cinfo, & sptr->b_s_info,\n\t\t\t\t(long) sptr->rows_in_array *\n\t\t\t\t(long) sptr->samplesperrow *\n\t\t\t\t(long) SIZEOF(JSAMPLE));\n\tsptr->b_s_open = TRUE;\n      }\n      sptr->mem_buffer = alloc_sarray(cinfo, JPOOL_IMAGE,\n\t\t\t\t      sptr->samplesperrow, sptr->rows_in_mem);\n      sptr->rowsperchunk = mem->last_rowsperchunk;\n      sptr->cur_start_row = 0;\n      sptr->first_undef_row = 0;\n      sptr->dirty = FALSE;\n    }\n  }\n\n  for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {\n    if (bptr->mem_buffer == NULL) { /* if not realized yet */\n      minheights = ((long) bptr->rows_in_array - 1L) / bptr->maxaccess + 1L;\n      if (minheights <= max_minheights) {\n\t/* This buffer fits in memory */\n\tbptr->rows_in_mem = bptr->rows_in_array;\n      } else {\n\t/* It doesn't fit in memory, create backing store. */\n\tbptr->rows_in_mem = (JDIMENSION) (max_minheights * bptr->maxaccess);\n\tjpeg_open_backing_store(cinfo, & bptr->b_s_info,\n\t\t\t\t(long) bptr->rows_in_array *\n\t\t\t\t(long) bptr->blocksperrow *\n\t\t\t\t(long) SIZEOF(JBLOCK));\n\tbptr->b_s_open = TRUE;\n      }\n      bptr->mem_buffer = alloc_barray(cinfo, JPOOL_IMAGE,\n\t\t\t\t      bptr->blocksperrow, bptr->rows_in_mem);\n      bptr->rowsperchunk = mem->last_rowsperchunk;\n      bptr->cur_start_row = 0;\n      bptr->first_undef_row = 0;\n      bptr->dirty = FALSE;\n    }\n  }\n}\n\n\nLOCAL(void)\ndo_sarray_io (j_common_ptr cinfo, jvirt_sarray_ptr ptr, boolean writing)\n/* Do backing store read or write of a virtual sample array */\n{\n  long bytesperrow, file_offset, byte_count, rows, thisrow, i;\n\n  bytesperrow = (long) ptr->samplesperrow * SIZEOF(JSAMPLE);\n  file_offset = ptr->cur_start_row * bytesperrow;\n  /* Loop to read or write each allocation chunk in mem_buffer */\n  for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) {\n    /* One chunk, but check for short chunk at end of buffer */\n    rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i);\n    /* Transfer no more than is currently defined */\n    thisrow = (long) ptr->cur_start_row + i;\n    rows = MIN(rows, (long) ptr->first_undef_row - thisrow);\n    /* Transfer no more than fits in file */\n    rows = MIN(rows, (long) ptr->rows_in_array - thisrow);\n    if (rows <= 0)\t\t/* this chunk might be past end of file! */\n      break;\n    byte_count = rows * bytesperrow;\n    if (writing)\n      (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info,\n\t\t\t\t\t    (void FAR *) ptr->mem_buffer[i],\n\t\t\t\t\t    file_offset, byte_count);\n    else\n      (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info,\n\t\t\t\t\t   (void FAR *) ptr->mem_buffer[i],\n\t\t\t\t\t   file_offset, byte_count);\n    file_offset += byte_count;\n  }\n}\n\n\nLOCAL(void)\ndo_barray_io (j_common_ptr cinfo, jvirt_barray_ptr ptr, boolean writing)\n/* Do backing store read or write of a virtual coefficient-block array */\n{\n  long bytesperrow, file_offset, byte_count, rows, thisrow, i;\n\n  bytesperrow = (long) ptr->blocksperrow * SIZEOF(JBLOCK);\n  file_offset = ptr->cur_start_row * bytesperrow;\n  /* Loop to read or write each allocation chunk in mem_buffer */\n  for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) {\n    /* One chunk, but check for short chunk at end of buffer */\n    rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i);\n    /* Transfer no more than is currently defined */\n    thisrow = (long) ptr->cur_start_row + i;\n    rows = MIN(rows, (long) ptr->first_undef_row - thisrow);\n    /* Transfer no more than fits in file */\n    rows = MIN(rows, (long) ptr->rows_in_array - thisrow);\n    if (rows <= 0)\t\t/* this chunk might be past end of file! */\n      break;\n    byte_count = rows * bytesperrow;\n    if (writing)\n      (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info,\n\t\t\t\t\t    (void FAR *) ptr->mem_buffer[i],\n\t\t\t\t\t    file_offset, byte_count);\n    else\n      (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info,\n\t\t\t\t\t   (void FAR *) ptr->mem_buffer[i],\n\t\t\t\t\t   file_offset, byte_count);\n    file_offset += byte_count;\n  }\n}\n\n\nMETHODDEF(JSAMPARRAY)\naccess_virt_sarray (j_common_ptr cinfo, jvirt_sarray_ptr ptr,\n\t\t    JDIMENSION start_row, JDIMENSION num_rows,\n\t\t    boolean writable)\n/* Access the part of a virtual sample array starting at start_row */\n/* and extending for num_rows rows.  writable is true if  */\n/* caller intends to modify the accessed area. */\n{\n  JDIMENSION end_row = start_row + num_rows;\n  JDIMENSION undef_row;\n\n  /* debugging check */\n  if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess ||\n      ptr->mem_buffer == NULL)\n    ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);\n\n  /* Make the desired part of the virtual array accessible */\n  if (start_row < ptr->cur_start_row ||\n      end_row > ptr->cur_start_row+ptr->rows_in_mem) {\n    if (! ptr->b_s_open)\n      ERREXIT(cinfo, JERR_VIRTUAL_BUG);\n    /* Flush old buffer contents if necessary */\n    if (ptr->dirty) {\n      do_sarray_io(cinfo, ptr, TRUE);\n      ptr->dirty = FALSE;\n    }\n    /* Decide what part of virtual array to access.\n     * Algorithm: if target address > current window, assume forward scan,\n     * load starting at target address.  If target address < current window,\n     * assume backward scan, load so that target area is top of window.\n     * Note that when switching from forward write to forward read, will have\n     * start_row = 0, so the limiting case applies and we load from 0 anyway.\n     */\n    if (start_row > ptr->cur_start_row) {\n      ptr->cur_start_row = start_row;\n    } else {\n      /* use long arithmetic here to avoid overflow & unsigned problems */\n      long ltemp;\n\n      ltemp = (long) end_row - (long) ptr->rows_in_mem;\n      if (ltemp < 0)\n\tltemp = 0;\t\t/* don't fall off front end of file */\n      ptr->cur_start_row = (JDIMENSION) ltemp;\n    }\n    /* Read in the selected part of the array.\n     * During the initial write pass, we will do no actual read\n     * because the selected part is all undefined.\n     */\n    do_sarray_io(cinfo, ptr, FALSE);\n  }\n  /* Ensure the accessed part of the array is defined; prezero if needed.\n   * To improve locality of access, we only prezero the part of the array\n   * that the caller is about to access, not the entire in-memory array.\n   */\n  if (ptr->first_undef_row < end_row) {\n    if (ptr->first_undef_row < start_row) {\n      if (writable)\t\t/* writer skipped over a section of array */\n\tERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);\n      undef_row = start_row;\t/* but reader is allowed to read ahead */\n    } else {\n      undef_row = ptr->first_undef_row;\n    }\n    if (writable)\n      ptr->first_undef_row = end_row;\n    if (ptr->pre_zero) {\n      size_t bytesperrow = (size_t) ptr->samplesperrow * SIZEOF(JSAMPLE);\n      undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */\n      end_row -= ptr->cur_start_row;\n      while (undef_row < end_row) {\n\tjzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow);\n\tundef_row++;\n      }\n    } else {\n      if (! writable)\t\t/* reader looking at undefined data */\n\tERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);\n    }\n  }\n  /* Flag the buffer dirty if caller will write in it */\n  if (writable)\n    ptr->dirty = TRUE;\n  /* Return address of proper part of the buffer */\n  return ptr->mem_buffer + (start_row - ptr->cur_start_row);\n}\n\n\nMETHODDEF(JBLOCKARRAY)\naccess_virt_barray (j_common_ptr cinfo, jvirt_barray_ptr ptr,\n\t\t    JDIMENSION start_row, JDIMENSION num_rows,\n\t\t    boolean writable)\n/* Access the part of a virtual block array starting at start_row */\n/* and extending for num_rows rows.  writable is true if  */\n/* caller intends to modify the accessed area. */\n{\n  JDIMENSION end_row = start_row + num_rows;\n  JDIMENSION undef_row;\n\n  /* debugging check */\n  if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess ||\n      ptr->mem_buffer == NULL)\n    ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);\n\n  /* Make the desired part of the virtual array accessible */\n  if (start_row < ptr->cur_start_row ||\n      end_row > ptr->cur_start_row+ptr->rows_in_mem) {\n    if (! ptr->b_s_open)\n      ERREXIT(cinfo, JERR_VIRTUAL_BUG);\n    /* Flush old buffer contents if necessary */\n    if (ptr->dirty) {\n      do_barray_io(cinfo, ptr, TRUE);\n      ptr->dirty = FALSE;\n    }\n    /* Decide what part of virtual array to access.\n     * Algorithm: if target address > current window, assume forward scan,\n     * load starting at target address.  If target address < current window,\n     * assume backward scan, load so that target area is top of window.\n     * Note that when switching from forward write to forward read, will have\n     * start_row = 0, so the limiting case applies and we load from 0 anyway.\n     */\n    if (start_row > ptr->cur_start_row) {\n      ptr->cur_start_row = start_row;\n    } else {\n      /* use long arithmetic here to avoid overflow & unsigned problems */\n      long ltemp;\n\n      ltemp = (long) end_row - (long) ptr->rows_in_mem;\n      if (ltemp < 0)\n\tltemp = 0;\t\t/* don't fall off front end of file */\n      ptr->cur_start_row = (JDIMENSION) ltemp;\n    }\n    /* Read in the selected part of the array.\n     * During the initial write pass, we will do no actual read\n     * because the selected part is all undefined.\n     */\n    do_barray_io(cinfo, ptr, FALSE);\n  }\n  /* Ensure the accessed part of the array is defined; prezero if needed.\n   * To improve locality of access, we only prezero the part of the array\n   * that the caller is about to access, not the entire in-memory array.\n   */\n  if (ptr->first_undef_row < end_row) {\n    if (ptr->first_undef_row < start_row) {\n      if (writable)\t\t/* writer skipped over a section of array */\n\tERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);\n      undef_row = start_row;\t/* but reader is allowed to read ahead */\n    } else {\n      undef_row = ptr->first_undef_row;\n    }\n    if (writable)\n      ptr->first_undef_row = end_row;\n    if (ptr->pre_zero) {\n      size_t bytesperrow = (size_t) ptr->blocksperrow * SIZEOF(JBLOCK);\n      undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */\n      end_row -= ptr->cur_start_row;\n      while (undef_row < end_row) {\n\tjzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow);\n\tundef_row++;\n      }\n    } else {\n      if (! writable)\t\t/* reader looking at undefined data */\n\tERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);\n    }\n  }\n  /* Flag the buffer dirty if caller will write in it */\n  if (writable)\n    ptr->dirty = TRUE;\n  /* Return address of proper part of the buffer */\n  return ptr->mem_buffer + (start_row - ptr->cur_start_row);\n}\n\n\n/*\n * Release all objects belonging to a specified pool.\n */\n\nMETHODDEF(void)\nfree_pool (j_common_ptr cinfo, int pool_id)\n{\n  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;\n  small_pool_ptr shdr_ptr;\n  large_pool_ptr lhdr_ptr;\n  size_t space_freed;\n\n  if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS)\n    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id);\t/* safety check */\n\n#ifdef MEM_STATS\n  if (cinfo->err->trace_level > 1)\n    print_mem_stats(cinfo, pool_id); /* print pool's memory usage statistics */\n#endif\n\n  /* If freeing IMAGE pool, close any virtual arrays first */\n  if (pool_id == JPOOL_IMAGE) {\n    jvirt_sarray_ptr sptr;\n    jvirt_barray_ptr bptr;\n\n    for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {\n      if (sptr->b_s_open) {\t/* there may be no backing store */\n\tsptr->b_s_open = FALSE;\t/* prevent recursive close if error */\n\t(*sptr->b_s_info.close_backing_store) (cinfo, & sptr->b_s_info);\n      }\n    }\n    mem->virt_sarray_list = NULL;\n    for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {\n      if (bptr->b_s_open) {\t/* there may be no backing store */\n\tbptr->b_s_open = FALSE;\t/* prevent recursive close if error */\n\t(*bptr->b_s_info.close_backing_store) (cinfo, & bptr->b_s_info);\n      }\n    }\n    mem->virt_barray_list = NULL;\n  }\n\n  /* Release large objects */\n  lhdr_ptr = mem->large_list[pool_id];\n  mem->large_list[pool_id] = NULL;\n\n  while (lhdr_ptr != NULL) {\n    large_pool_ptr next_lhdr_ptr = lhdr_ptr->hdr.next;\n    space_freed = lhdr_ptr->hdr.bytes_used +\n\t\t  lhdr_ptr->hdr.bytes_left +\n\t\t  SIZEOF(large_pool_hdr);\n    jpeg_free_large(cinfo, (void FAR *) lhdr_ptr, space_freed);\n    mem->total_space_allocated -= space_freed;\n    lhdr_ptr = next_lhdr_ptr;\n  }\n\n  /* Release small objects */\n  shdr_ptr = mem->small_list[pool_id];\n  mem->small_list[pool_id] = NULL;\n\n  while (shdr_ptr != NULL) {\n    small_pool_ptr next_shdr_ptr = shdr_ptr->hdr.next;\n    space_freed = shdr_ptr->hdr.bytes_used +\n\t\t  shdr_ptr->hdr.bytes_left +\n\t\t  SIZEOF(small_pool_hdr);\n    jpeg_free_small(cinfo, (void *) shdr_ptr, space_freed);\n    mem->total_space_allocated -= space_freed;\n    shdr_ptr = next_shdr_ptr;\n  }\n}\n\n\n/*\n * Close up shop entirely.\n * Note that this cannot be called unless cinfo->mem is non-NULL.\n */\n\nMETHODDEF(void)\nself_destruct (j_common_ptr cinfo)\n{\n  int pool;\n\n  /* Close all backing store, release all memory.\n   * Releasing pools in reverse order might help avoid fragmentation\n   * with some (brain-damaged) malloc libraries.\n   */\n  for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) {\n    free_pool(cinfo, pool);\n  }\n\n  /* Release the memory manager control block too. */\n  jpeg_free_small(cinfo, (void *) cinfo->mem, SIZEOF(my_memory_mgr));\n  cinfo->mem = NULL;\t\t/* ensures I will be called only once */\n\n  jpeg_mem_term(cinfo);\t\t/* system-dependent cleanup */\n}\n\n\n/*\n * Memory manager initialization.\n * When this is called, only the error manager pointer is valid in cinfo!\n */\n\nGLOBAL(void)\njinit_memory_mgr (j_common_ptr cinfo)\n{\n  my_mem_ptr mem;\n  long max_to_use;\n  int pool;\n  size_t test_mac;\n\n  cinfo->mem = NULL;\t\t/* for safety if init fails */\n\n  /* Check for configuration errors.\n   * SIZEOF(ALIGN_TYPE) should be a power of 2; otherwise, it probably\n   * doesn't reflect any real hardware alignment requirement.\n   * The test is a little tricky: for X>0, X and X-1 have no one-bits\n   * in common if and only if X is a power of 2, ie has only one one-bit.\n   * Some compilers may give an \"unreachable code\" warning here; ignore it.\n   */\n  if ((SIZEOF(ALIGN_TYPE) & (SIZEOF(ALIGN_TYPE)-1)) != 0)\n    ERREXIT(cinfo, JERR_BAD_ALIGN_TYPE);\n  /* MAX_ALLOC_CHUNK must be representable as type size_t, and must be\n   * a multiple of SIZEOF(ALIGN_TYPE).\n   * Again, an \"unreachable code\" warning may be ignored here.\n   * But a \"constant too large\" warning means you need to fix MAX_ALLOC_CHUNK.\n   */\n  test_mac = (size_t) MAX_ALLOC_CHUNK;\n  if ((long) test_mac != MAX_ALLOC_CHUNK ||\n      (MAX_ALLOC_CHUNK % SIZEOF(ALIGN_TYPE)) != 0)\n    ERREXIT(cinfo, JERR_BAD_ALLOC_CHUNK);\n\n  max_to_use = jpeg_mem_init(cinfo); /* system-dependent initialization */\n\n  /* Attempt to allocate memory manager's control block */\n  mem = (my_mem_ptr) jpeg_get_small(cinfo, SIZEOF(my_memory_mgr));\n\n  if (mem == NULL) {\n    jpeg_mem_term(cinfo);\t/* system-dependent cleanup */\n    ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 0);\n  }\n\n  /* OK, fill in the method pointers */\n  mem->pub.alloc_small = alloc_small;\n  mem->pub.alloc_large = alloc_large;\n  mem->pub.alloc_sarray = alloc_sarray;\n  mem->pub.alloc_barray = alloc_barray;\n  mem->pub.request_virt_sarray = request_virt_sarray;\n  mem->pub.request_virt_barray = request_virt_barray;\n  mem->pub.realize_virt_arrays = realize_virt_arrays;\n  mem->pub.access_virt_sarray = access_virt_sarray;\n  mem->pub.access_virt_barray = access_virt_barray;\n  mem->pub.free_pool = free_pool;\n  mem->pub.self_destruct = self_destruct;\n\n  /* Make MAX_ALLOC_CHUNK accessible to other modules */\n  mem->pub.max_alloc_chunk = MAX_ALLOC_CHUNK;\n\n  /* Initialize working state */\n  mem->pub.max_memory_to_use = max_to_use;\n\n  for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) {\n    mem->small_list[pool] = NULL;\n    mem->large_list[pool] = NULL;\n  }\n  mem->virt_sarray_list = NULL;\n  mem->virt_barray_list = NULL;\n\n  mem->total_space_allocated = SIZEOF(my_memory_mgr);\n\n  /* Declare ourselves open for business */\n  cinfo->mem = & mem->pub;\n\n  /* Check for an environment variable JPEGMEM; if found, override the\n   * default max_memory setting from jpeg_mem_init.  Note that the\n   * surrounding application may again override this value.\n   * If your system doesn't support getenv(), define NO_GETENV to disable\n   * this feature.\n   */\n#ifndef NO_GETENV\n  { char * memenv;\n\n    if ((memenv = getenv(\"JPEGMEM\")) != NULL) {\n      char ch = 'x';\n\n      if (sscanf(memenv, \"%ld%c\", &max_to_use, &ch) > 0) {\n\tif (ch == 'm' || ch == 'M')\n\t  max_to_use *= 1000L;\n\tmem->pub.max_memory_to_use = max_to_use * 1000L;\n      }\n    }\n  }\n#endif\n\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jmemnobs.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jmemnobs.c\n *\n * Copyright (C) 1992-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file provides a really simple implementation of the system-\n * dependent portion of the JPEG memory manager.  This implementation\n * assumes that no backing-store files are needed: all required space\n * can be obtained from malloc().\n * This is very portable in the sense that it'll compile on almost anything,\n * but you'd better have lots of main memory (or virtual memory) if you want\n * to process big images.\n * Note that the max_memory_to_use option is ignored by this implementation.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jmemsys.h\"\t\t/* import the system-dependent declarations */\n\n#ifndef HAVE_STDLIB_H\t\t/* <stdlib.h> should declare malloc(),free() */\nextern void * malloc JPP((size_t size));\nextern void free JPP((void *ptr));\n#endif\n\n#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)\nextern \"C\" {\n#endif\n\nvoid*\tFXMEM_DefaultAlloc(int byte_size, int);\nvoid\tFXMEM_DefaultFree(void* pointer, int);\n\n#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)\n}\n#endif\n\n/*\n * Memory allocation and freeing are controlled by the regular library\n * routines malloc() and free().\n */\n\nGLOBAL(void *)\njpeg_get_small (j_common_ptr cinfo, size_t sizeofobject)\n{\n//  return (void *) malloc(sizeofobject);\n\treturn FXMEM_DefaultAlloc(sizeofobject, 0);\n}\n\nGLOBAL(void)\njpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject)\n{\n//  free(object);\n\tFXMEM_DefaultFree(object, 0);\n}\n\n\n/*\n * \"Large\" objects are treated the same as \"small\" ones.\n * NB: although we include FAR keywords in the routine declarations,\n * this file won't actually work in 80x86 small/medium model; at least,\n * you probably won't be able to process useful-size images in only 64KB.\n */\n\nGLOBAL(void FAR *)\njpeg_get_large (j_common_ptr cinfo, size_t sizeofobject)\n{\n//  return (void FAR *) malloc(sizeofobject);\n\treturn FXMEM_DefaultAlloc(sizeofobject, 0);\n}\n\nGLOBAL(void)\njpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject)\n{\n//  free(object);\n\tFXMEM_DefaultFree(object, 0);\n}\n\n\n/*\n * This routine computes the total memory space available for allocation.\n * Here we always say, \"we got all you want bud!\"\n */\n\nGLOBAL(long)\njpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed,\n\t\t    long max_bytes_needed, long already_allocated)\n{\n  return max_bytes_needed;\n}\n\n\n/*\n * Backing store (temporary file) management.\n * Since jpeg_mem_available always promised the moon,\n * this should never be called and we can just error out.\n */\n\nGLOBAL(void)\njpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info,\n\t\t\t long total_bytes_needed)\n{\n  ERREXIT(cinfo, JERR_NO_BACKING_STORE);\n}\n\n\n/*\n * These routines take care of any system-dependent initialization and\n * cleanup required.  Here, there isn't any.\n */\n\nGLOBAL(long)\njpeg_mem_init (j_common_ptr cinfo)\n{\n  return 0;\t\t\t/* just set max_memory_to_use to 0 */\n}\n\nGLOBAL(void)\njpeg_mem_term (j_common_ptr cinfo)\n{\n  /* no work */\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/fpdfapi_jutils.c",
    "content": "#if !defined(_FX_JPEG_TURBO_)\n/*\n * jutils.c\n *\n * Copyright (C) 1991-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains tables and miscellaneous utility routines needed\n * for both compression and decompression.\n * Note we prefix all global names with \"j\" to minimize conflicts with\n * a surrounding application.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/*\n * jpeg_zigzag_order[i] is the zigzag-order position of the i'th element\n * of a DCT block read in natural order (left to right, top to bottom).\n */\n\n#if 0\t\t\t\t/* This table is not actually needed in v6a */\n\nconst int jpeg_zigzag_order[DCTSIZE2] = {\n   0,  1,  5,  6, 14, 15, 27, 28,\n   2,  4,  7, 13, 16, 26, 29, 42,\n   3,  8, 12, 17, 25, 30, 41, 43,\n   9, 11, 18, 24, 31, 40, 44, 53,\n  10, 19, 23, 32, 39, 45, 52, 54,\n  20, 22, 33, 38, 46, 51, 55, 60,\n  21, 34, 37, 47, 50, 56, 59, 61,\n  35, 36, 48, 49, 57, 58, 62, 63\n};\n\n#endif\n\n/*\n * jpeg_natural_order[i] is the natural-order position of the i'th element\n * of zigzag order.\n *\n * When reading corrupted data, the Huffman decoders could attempt\n * to reference an entry beyond the end of this array (if the decoded\n * zero run length reaches past the end of the block).  To prevent\n * wild stores without adding an inner-loop test, we put some extra\n * \"63\"s after the real entries.  This will cause the extra coefficient\n * to be stored in location 63 of the block, not somewhere random.\n * The worst case would be a run-length of 15, which means we need 16\n * fake entries.\n */\n\nconst int jpeg_natural_order[DCTSIZE2+16] = {\n  0,  1,  8, 16,  9,  2,  3, 10,\n 17, 24, 32, 25, 18, 11,  4,  5,\n 12, 19, 26, 33, 40, 48, 41, 34,\n 27, 20, 13,  6,  7, 14, 21, 28,\n 35, 42, 49, 56, 57, 50, 43, 36,\n 29, 22, 15, 23, 30, 37, 44, 51,\n 58, 59, 52, 45, 38, 31, 39, 46,\n 53, 60, 61, 54, 47, 55, 62, 63,\n 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */\n 63, 63, 63, 63, 63, 63, 63, 63\n};\n\n\n/*\n * Arithmetic utilities\n */\n\nGLOBAL(long)\njdiv_round_up (long a, long b)\n/* Compute a/b rounded up to next integer, ie, ceil(a/b) */\n/* Assumes a >= 0, b > 0 */\n{\n  return (a + b - 1L) / b;\n}\n\n\nGLOBAL(long)\njround_up (long a, long b)\n/* Compute a rounded up to next multiple of b, ie, ceil(a/b)*b */\n/* Assumes a >= 0, b > 0 */\n{\n  a += b - 1L;\n  return a - (a % b);\n}\n\n\n/* On normal machines we can apply MEMCOPY() and MEMZERO() to sample arrays\n * and coefficient-block arrays.  This won't work on 80x86 because the arrays\n * are FAR and we're assuming a small-pointer memory model.  However, some\n * DOS compilers provide far-pointer versions of memcpy() and memset() even\n * in the small-model libraries.  These will be used if USE_FMEM is defined.\n * Otherwise, the routines below do it the hard way.  (The performance cost\n * is not all that great, because these routines aren't very heavily used.)\n */\n\n#ifndef NEED_FAR_POINTERS\t/* normal case, same as regular macros */\n#define FMEMCOPY(dest,src,size)\tMEMCOPY(dest,src,size)\n#define FMEMZERO(target,size)\tMEMZERO(target,size)\n#else\t\t\t\t/* 80x86 case, define if we can */\n#ifdef USE_FMEM\n#define FMEMCOPY(dest,src,size)\t_fmemcpy((void FAR *)(dest), (const void FAR *)(src), (size_t)(size))\n#define FMEMZERO(target,size)\t_fmemset((void FAR *)(target), 0, (size_t)(size))\n#endif\n#endif\n\n\nGLOBAL(void)\njcopy_sample_rows (JSAMPARRAY input_array, int source_row,\n\t\t   JSAMPARRAY output_array, int dest_row,\n\t\t   int num_rows, JDIMENSION num_cols)\n/* Copy some rows of samples from one place to another.\n * num_rows rows are copied from input_array[source_row++]\n * to output_array[dest_row++]; these areas may overlap for duplication.\n * The source and destination arrays must be at least as wide as num_cols.\n */\n{\n  register JSAMPROW inptr, outptr;\n#ifdef FMEMCOPY\n  register size_t count = (size_t) (num_cols * SIZEOF(JSAMPLE));\n#else\n  register JDIMENSION count;\n#endif\n  register int row;\n\n  input_array += source_row;\n  output_array += dest_row;\n\n  for (row = num_rows; row > 0; row--) {\n    inptr = *input_array++;\n    outptr = *output_array++;\n#ifdef FMEMCOPY\n    FMEMCOPY(outptr, inptr, count);\n#else\n    for (count = num_cols; count > 0; count--)\n      *outptr++ = *inptr++;\t/* needn't bother with GETJSAMPLE() here */\n#endif\n  }\n}\n\n\nGLOBAL(void)\njcopy_block_row (JBLOCKROW input_row, JBLOCKROW output_row,\n\t\t JDIMENSION num_blocks)\n/* Copy a row of coefficient blocks from one place to another. */\n{\n#ifdef FMEMCOPY\n  FMEMCOPY(output_row, input_row, num_blocks * (DCTSIZE2 * SIZEOF(JCOEF)));\n#else\n  register JCOEFPTR inptr, outptr;\n  register long count;\n\n  inptr = (JCOEFPTR) input_row;\n  outptr = (JCOEFPTR) output_row;\n  for (count = (long) num_blocks * DCTSIZE2; count > 0; count--) {\n    *outptr++ = *inptr++;\n  }\n#endif\n}\n\n\nGLOBAL(void)\njzero_far (void FAR * target, size_t bytestozero)\n/* Zero out a chunk of FAR memory. */\n/* This might be sample-array data, block-array data, or alloc_large data. */\n{\n#ifdef FMEMZERO\n  FMEMZERO(target, bytestozero);\n#else\n  register char FAR * ptr = (char FAR *) target;\n  register size_t count;\n\n  for (count = bytestozero; count > 0; count--) {\n    *ptr++ = 0;\n  }\n#endif\n}\n\n#endif //_FX_JPEG_TURBO_\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/jchuff.h",
    "content": "/*\n * jchuff.h\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains declarations for Huffman entropy encoding routines\n * that are shared between the sequential encoder (jchuff.c) and the\n * progressive encoder (jcphuff.c).  No other modules need to see these.\n */\n\n/* The legal range of a DCT coefficient is\n *  -1024 .. +1023  for 8-bit data;\n * -16384 .. +16383 for 12-bit data.\n * Hence the magnitude should always fit in 10 or 14 bits respectively.\n */\n\n#if BITS_IN_JSAMPLE == 8\n#define MAX_COEF_BITS 10\n#else\n#define MAX_COEF_BITS 14\n#endif\n\n/* Derived data constructed for each Huffman table */\n\ntypedef struct {\n  unsigned int ehufco[256];\t/* code for each symbol */\n  char ehufsi[256];\t\t/* length of code for each symbol */\n  /* If no code has been allocated for a symbol S, ehufsi[S] contains 0 */\n} c_derived_tbl;\n\n/* Short forms of external names for systems with brain-damaged linkers. */\n\n#ifdef NEED_SHORT_EXTERNAL_NAMES\n#define jpeg_make_c_derived_tbl\tjMkCDerived\n#define jpeg_gen_optimal_table\tjGenOptTbl\n#endif /* NEED_SHORT_EXTERNAL_NAMES */\n\n/* Expand a Huffman table definition into the derived format */\nEXTERN(void) jpeg_make_c_derived_tbl\n\tJPP((j_compress_ptr cinfo, boolean isDC, int tblno,\n\t     c_derived_tbl ** pdtbl));\n\n/* Generate an optimal table definition given the specified counts */\nEXTERN(void) jpeg_gen_optimal_table\n\tJPP((j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[]));\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/jconfig.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n/* jconfig.vc --- jconfig.h for Microsoft Visual C++ on Windows 95 or NT. */\n/* see jconfig.doc for explanations */\n\n#define HAVE_PROTOTYPES\n#define HAVE_UNSIGNED_CHAR\n#define HAVE_UNSIGNED_SHORT\n/* #define void char */\n/* #define const */\n#undef CHAR_IS_UNSIGNED\n#define HAVE_STDDEF_H\n#define HAVE_STDLIB_H\n#undef NEED_BSD_STRINGS\n#undef NEED_SYS_TYPES_H\n#undef NEED_FAR_POINTERS\t/* we presume a 32-bit flat memory model */\n#undef NEED_SHORT_EXTERNAL_NAMES\n#undef INCOMPLETE_TYPES_BROKEN\n\n/* Define \"boolean\" as unsigned char, not int, per Windows custom */\n#ifndef __RPCNDR_H__\t\t/* don't conflict if rpcndr.h already read */\ntypedef unsigned char boolean;\n#endif\n#define HAVE_BOOLEAN\t\t/* prevent jmorecfg.h from redefining it */\n\n\n#ifdef JPEG_INTERNALS\n\n#undef RIGHT_SHIFT_IS_UNSIGNED\n\n#endif /* JPEG_INTERNALS */\n\n#ifdef JPEG_CJPEG_DJPEG\n\n#define BMP_SUPPORTED\t\t/* BMP image file format */\n#define GIF_SUPPORTED\t\t/* GIF image file format */\n#define PPM_SUPPORTED\t\t/* PBMPLUS PPM/PGM image file format */\n#undef RLE_SUPPORTED\t\t/* Utah RLE image file format */\n#define TARGA_SUPPORTED\t\t/* Targa image file format */\n\n#define TWO_FILE_COMMANDLINE\t/* optional */\n#define USE_SETMODE\t\t/* Microsoft has setmode() */\n#undef NEED_SIGNAL_CATCHER\n#undef DONT_USE_B_MODE\n#undef PROGRESS_REPORT\t\t/* optional */\n\n#endif /* JPEG_CJPEG_DJPEG */\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/jdct.h",
    "content": "/*\n * jdct.h\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This include file contains common declarations for the forward and\n * inverse DCT modules.  These declarations are private to the DCT managers\n * (jcdctmgr.c, jddctmgr.c) and the individual DCT algorithms.\n * The individual DCT algorithms are kept in separate files to ease \n * machine-dependent tuning (e.g., assembly coding).\n */\n\n\n/*\n * A forward DCT routine is given a pointer to a work area of type DCTELEM[];\n * the DCT is to be performed in-place in that buffer.  Type DCTELEM is int\n * for 8-bit samples, INT32 for 12-bit samples.  (NOTE: Floating-point DCT\n * implementations use an array of type FAST_FLOAT, instead.)\n * The DCT inputs are expected to be signed (range +-CENTERJSAMPLE).\n * The DCT outputs are returned scaled up by a factor of 8; they therefore\n * have a range of +-8K for 8-bit data, +-128K for 12-bit data.  This\n * convention improves accuracy in integer implementations and saves some\n * work in floating-point ones.\n * Quantization of the output coefficients is done by jcdctmgr.c.\n */\n\n#if BITS_IN_JSAMPLE == 8\ntypedef int DCTELEM;\t\t/* 16 or 32 bits is fine */\n#else\ntypedef INT32 DCTELEM;\t\t/* must have 32 bits */\n#endif\n\ntypedef JMETHOD(void, forward_DCT_method_ptr, (DCTELEM * data));\ntypedef JMETHOD(void, float_DCT_method_ptr, (FAST_FLOAT * data));\n\n\n/*\n * An inverse DCT routine is given a pointer to the input JBLOCK and a pointer\n * to an output sample array.  The routine must dequantize the input data as\n * well as perform the IDCT; for dequantization, it uses the multiplier table\n * pointed to by compptr->dct_table.  The output data is to be placed into the\n * sample array starting at a specified column.  (Any row offset needed will\n * be applied to the array pointer before it is passed to the IDCT code.)\n * Note that the number of samples emitted by the IDCT routine is\n * DCT_scaled_size * DCT_scaled_size.\n */\n\n/* typedef inverse_DCT_method_ptr is declared in jpegint.h */\n\n/*\n * Each IDCT routine has its own ideas about the best dct_table element type.\n */\n\ntypedef MULTIPLIER ISLOW_MULT_TYPE; /* short or int, whichever is faster */\n#if BITS_IN_JSAMPLE == 8\ntypedef MULTIPLIER IFAST_MULT_TYPE; /* 16 bits is OK, use short if faster */\n#define IFAST_SCALE_BITS  2\t/* fractional bits in scale factors */\n#else\ntypedef INT32 IFAST_MULT_TYPE;\t/* need 32 bits for scaled quantizers */\n#define IFAST_SCALE_BITS  13\t/* fractional bits in scale factors */\n#endif\ntypedef FAST_FLOAT FLOAT_MULT_TYPE; /* preferred floating type */\n\n\n/*\n * Each IDCT routine is responsible for range-limiting its results and\n * converting them to unsigned form (0..MAXJSAMPLE).  The raw outputs could\n * be quite far out of range if the input data is corrupt, so a bulletproof\n * range-limiting step is required.  We use a mask-and-table-lookup method\n * to do the combined operations quickly.  See the comments with\n * prepare_range_limit_table (in jdmaster.c) for more info.\n */\n\n#define IDCT_range_limit(cinfo)  ((cinfo)->sample_range_limit + CENTERJSAMPLE)\n\n#define RANGE_MASK  (MAXJSAMPLE * 4 + 3) /* 2 bits wider than legal samples */\n\n\n/* Short forms of external names for systems with brain-damaged linkers. */\n\n#ifdef NEED_SHORT_EXTERNAL_NAMES\n#define jpeg_fdct_islow\t\tjFDislow\n#define jpeg_fdct_ifast\t\tjFDifast\n#define jpeg_fdct_float\t\tjFDfloat\n#define jpeg_idct_islow\t\tjRDislow\n#define jpeg_idct_ifast\t\tjRDifast\n#define jpeg_idct_float\t\tjRDfloat\n#define jpeg_idct_4x4\t\tjRD4x4\n#define jpeg_idct_2x2\t\tjRD2x2\n#define jpeg_idct_1x1\t\tjRD1x1\n#endif /* NEED_SHORT_EXTERNAL_NAMES */\n\n/* Extern declarations for the forward and inverse DCT routines. */\n\nEXTERN(void) jpeg_fdct_islow JPP((DCTELEM * data));\nEXTERN(void) jpeg_fdct_ifast JPP((DCTELEM * data));\nEXTERN(void) jpeg_fdct_float JPP((FAST_FLOAT * data));\n\nEXTERN(void) jpeg_idct_islow\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_ifast\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_float\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_4x4\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_2x2\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_1x1\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\n\n\n/*\n * Macros for handling fixed-point arithmetic; these are used by many\n * but not all of the DCT/IDCT modules.\n *\n * All values are expected to be of type INT32.\n * Fractional constants are scaled left by CONST_BITS bits.\n * CONST_BITS is defined within each module using these macros,\n * and may differ from one module to the next.\n */\n\n#define ONE\t((INT32) 1)\n#define CONST_SCALE (ONE << CONST_BITS)\n\n/* Convert a positive real constant to an integer scaled by CONST_SCALE.\n * Caution: some C compilers fail to reduce \"FIX(constant)\" at compile time,\n * thus causing a lot of useless floating-point operations at run time.\n */\n\n#define FIX(x)\t((INT32) ((x) * CONST_SCALE + 0.5))\n\n/* Descale and correctly round an INT32 value that's scaled by N bits.\n * We assume RIGHT_SHIFT rounds towards minus infinity, so adding\n * the fudge factor is correct for either sign of X.\n */\n\n#define DESCALE(x,n)  RIGHT_SHIFT((x) + (ONE << ((n)-1)), n)\n\n/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.\n * This macro is used only when the two inputs will actually be no more than\n * 16 bits wide, so that a 16x16->32 bit multiply can be used instead of a\n * full 32x32 multiply.  This provides a useful speedup on many machines.\n * Unfortunately there is no way to specify a 16x16->32 multiply portably\n * in C, but some C compilers will do the right thing if you provide the\n * correct combination of casts.\n */\n\n#ifdef SHORTxSHORT_32\t\t/* may work if 'int' is 32 bits */\n#define MULTIPLY16C16(var,const)  (((INT16) (var)) * ((INT16) (const)))\n#endif\n#ifdef SHORTxLCONST_32\t\t/* known to work with Microsoft C 6.0 */\n#define MULTIPLY16C16(var,const)  (((INT16) (var)) * ((INT32) (const)))\n#endif\n\n#ifndef MULTIPLY16C16\t\t/* default definition */\n#define MULTIPLY16C16(var,const)  ((var) * (const))\n#endif\n\n/* Same except both inputs are variables. */\n\n#ifdef SHORTxSHORT_32\t\t/* may work if 'int' is 32 bits */\n#define MULTIPLY16V16(var1,var2)  (((INT16) (var1)) * ((INT16) (var2)))\n#endif\n\n#ifndef MULTIPLY16V16\t\t/* default definition */\n#define MULTIPLY16V16(var1,var2)  ((var1) * (var2))\n#endif\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/jdhuff.h",
    "content": "/*\n * jdhuff.h\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains declarations for Huffman entropy decoding routines\n * that are shared between the sequential decoder (jdhuff.c) and the\n * progressive decoder (jdphuff.c).  No other modules need to see these.\n */\n\n/* Short forms of external names for systems with brain-damaged linkers. */\n\n#ifdef NEED_SHORT_EXTERNAL_NAMES\n#define jpeg_make_d_derived_tbl\tjMkDDerived\n#define jpeg_fill_bit_buffer\tjFilBitBuf\n#define jpeg_huff_decode\tjHufDecode\n#endif /* NEED_SHORT_EXTERNAL_NAMES */\n\n\n/* Derived data constructed for each Huffman table */\n\n#define HUFF_LOOKAHEAD\t8\t/* # of bits of lookahead */\n\ntypedef struct {\n  /* Basic tables: (element [0] of each array is unused) */\n  INT32 maxcode[18];\t\t/* largest code of length k (-1 if none) */\n  /* (maxcode[17] is a sentinel to ensure jpeg_huff_decode terminates) */\n  INT32 valoffset[17];\t\t/* huffval[] offset for codes of length k */\n  /* valoffset[k] = huffval[] index of 1st symbol of code length k, less\n   * the smallest code of length k; so given a code of length k, the\n   * corresponding symbol is huffval[code + valoffset[k]]\n   */\n\n  /* Link to public Huffman table (needed only in jpeg_huff_decode) */\n  JHUFF_TBL *pub;\n\n  /* Lookahead tables: indexed by the next HUFF_LOOKAHEAD bits of\n   * the input data stream.  If the next Huffman code is no more\n   * than HUFF_LOOKAHEAD bits long, we can obtain its length and\n   * the corresponding symbol directly from these tables.\n   */\n  int look_nbits[1<<HUFF_LOOKAHEAD]; /* # bits, or 0 if too long */\n  UINT8 look_sym[1<<HUFF_LOOKAHEAD]; /* symbol, or unused */\n} d_derived_tbl;\n\n/* Expand a Huffman table definition into the derived format */\nEXTERN(void) jpeg_make_d_derived_tbl\n\tJPP((j_decompress_ptr cinfo, boolean isDC, int tblno,\n\t     d_derived_tbl ** pdtbl));\n\n\n/*\n * Fetching the next N bits from the input stream is a time-critical operation\n * for the Huffman decoders.  We implement it with a combination of inline\n * macros and out-of-line subroutines.  Note that N (the number of bits\n * demanded at one time) never exceeds 15 for JPEG use.\n *\n * We read source bytes into get_buffer and dole out bits as needed.\n * If get_buffer already contains enough bits, they are fetched in-line\n * by the macros CHECK_BIT_BUFFER and GET_BITS.  When there aren't enough\n * bits, jpeg_fill_bit_buffer is called; it will attempt to fill get_buffer\n * as full as possible (not just to the number of bits needed; this\n * prefetching reduces the overhead cost of calling jpeg_fill_bit_buffer).\n * Note that jpeg_fill_bit_buffer may return FALSE to indicate suspension.\n * On TRUE return, jpeg_fill_bit_buffer guarantees that get_buffer contains\n * at least the requested number of bits --- dummy zeroes are inserted if\n * necessary.\n */\n\ntypedef INT32 bit_buf_type;\t/* type of bit-extraction buffer */\n#define BIT_BUF_SIZE  32\t/* size of buffer in bits */\n\n/* If long is > 32 bits on your machine, and shifting/masking longs is\n * reasonably fast, making bit_buf_type be long and setting BIT_BUF_SIZE\n * appropriately should be a win.  Unfortunately we can't define the size\n * with something like  #define BIT_BUF_SIZE (sizeof(bit_buf_type)*8)\n * because not all machines measure sizeof in 8-bit bytes.\n */\n\ntypedef struct {\t\t/* Bitreading state saved across MCUs */\n  bit_buf_type get_buffer;\t/* current bit-extraction buffer */\n  int bits_left;\t\t/* # of unused bits in it */\n} bitread_perm_state;\n\ntypedef struct {\t\t/* Bitreading working state within an MCU */\n  /* Current data source location */\n  /* We need a copy, rather than munging the original, in case of suspension */\n  const JOCTET * next_input_byte; /* => next byte to read from source */\n  size_t bytes_in_buffer;\t/* # of bytes remaining in source buffer */\n  /* Bit input buffer --- note these values are kept in register variables,\n   * not in this struct, inside the inner loops.\n   */\n  bit_buf_type get_buffer;\t/* current bit-extraction buffer */\n  int bits_left;\t\t/* # of unused bits in it */\n  /* Pointer needed by jpeg_fill_bit_buffer. */\n  j_decompress_ptr cinfo;\t/* back link to decompress master record */\n} bitread_working_state;\n\n/* Macros to declare and load/save bitread local variables. */\n#define BITREAD_STATE_VARS  \\\n\tregister bit_buf_type get_buffer;  \\\n\tregister int bits_left;  \\\n\tbitread_working_state br_state\n\n#define BITREAD_LOAD_STATE(cinfop,permstate)  \\\n\tbr_state.cinfo = cinfop; \\\n\tbr_state.next_input_byte = cinfop->src->next_input_byte; \\\n\tbr_state.bytes_in_buffer = cinfop->src->bytes_in_buffer; \\\n\tget_buffer = permstate.get_buffer; \\\n\tbits_left = permstate.bits_left;\n\n#define BITREAD_SAVE_STATE(cinfop,permstate)  \\\n\tcinfop->src->next_input_byte = br_state.next_input_byte; \\\n\tcinfop->src->bytes_in_buffer = br_state.bytes_in_buffer; \\\n\tpermstate.get_buffer = get_buffer; \\\n\tpermstate.bits_left = bits_left\n\n/*\n * These macros provide the in-line portion of bit fetching.\n * Use CHECK_BIT_BUFFER to ensure there are N bits in get_buffer\n * before using GET_BITS, PEEK_BITS, or DROP_BITS.\n * The variables get_buffer and bits_left are assumed to be locals,\n * but the state struct might not be (jpeg_huff_decode needs this).\n *\tCHECK_BIT_BUFFER(state,n,action);\n *\t\tEnsure there are N bits in get_buffer; if suspend, take action.\n *      val = GET_BITS(n);\n *\t\tFetch next N bits.\n *      val = PEEK_BITS(n);\n *\t\tFetch next N bits without removing them from the buffer.\n *\tDROP_BITS(n);\n *\t\tDiscard next N bits.\n * The value N should be a simple variable, not an expression, because it\n * is evaluated multiple times.\n */\n\n#define CHECK_BIT_BUFFER(state,nbits,action) \\\n\t{ if (bits_left < (nbits)) {  \\\n\t    if (! jpeg_fill_bit_buffer(&(state),get_buffer,bits_left,nbits))  \\\n\t      { action; }  \\\n\t    get_buffer = (state).get_buffer; bits_left = (state).bits_left; } }\n\n#define GET_BITS(nbits) \\\n\t(((int) (get_buffer >> (bits_left -= (nbits)))) & ((1<<(nbits))-1))\n\n#define PEEK_BITS(nbits) \\\n\t(((int) (get_buffer >> (bits_left -  (nbits)))) & ((1<<(nbits))-1))\n\n#define DROP_BITS(nbits) \\\n\t(bits_left -= (nbits))\n\n/* Load up the bit buffer to a depth of at least nbits */\nEXTERN(boolean) jpeg_fill_bit_buffer\n\tJPP((bitread_working_state * state, register bit_buf_type get_buffer,\n\t     register int bits_left, int nbits));\n\n\n/*\n * Code for extracting next Huffman-coded symbol from input bit stream.\n * Again, this is time-critical and we make the main paths be macros.\n *\n * We use a lookahead table to process codes of up to HUFF_LOOKAHEAD bits\n * without looping.  Usually, more than 95% of the Huffman codes will be 8\n * or fewer bits long.  The few overlength codes are handled with a loop,\n * which need not be inline code.\n *\n * Notes about the HUFF_DECODE macro:\n * 1. Near the end of the data segment, we may fail to get enough bits\n *    for a lookahead.  In that case, we do it the hard way.\n * 2. If the lookahead table contains no entry, the next code must be\n *    more than HUFF_LOOKAHEAD bits long.\n * 3. jpeg_huff_decode returns -1 if forced to suspend.\n */\n\n#define HUFF_DECODE(result,state,htbl,failaction,slowlabel) \\\n{ register int nb, look; \\\n  if (bits_left < HUFF_LOOKAHEAD) { \\\n    if (! jpeg_fill_bit_buffer(&state,get_buffer,bits_left, 0)) {failaction;} \\\n    get_buffer = state.get_buffer; bits_left = state.bits_left; \\\n    if (bits_left < HUFF_LOOKAHEAD) { \\\n      nb = 1; goto slowlabel; \\\n    } \\\n  } \\\n  look = PEEK_BITS(HUFF_LOOKAHEAD); \\\n  if ((nb = htbl->look_nbits[look]) != 0) { \\\n    DROP_BITS(nb); \\\n    result = htbl->look_sym[look]; \\\n  } else { \\\n    nb = HUFF_LOOKAHEAD+1; \\\nslowlabel: \\\n    if ((result=jpeg_huff_decode(&state,get_buffer,bits_left,htbl,nb)) < 0) \\\n\t{ failaction; } \\\n    get_buffer = state.get_buffer; bits_left = state.bits_left; \\\n  } \\\n}\n\n/* Out-of-line case for Huffman code fetching */\nEXTERN(int) jpeg_huff_decode\n\tJPP((bitread_working_state * state, register bit_buf_type get_buffer,\n\t     register int bits_left, d_derived_tbl * htbl, int min_bits));\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/jerror.h",
    "content": "/*\n * jerror.h\n *\n * Copyright (C) 1994-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file defines the error and message codes for the JPEG library.\n * Edit this file to add new codes, or to translate the message strings to\n * some other language.\n * A set of error-reporting macros are defined too.  Some applications using\n * the JPEG library may wish to include this file to get the error codes\n * and/or the macros.\n */\n\n/*\n * To define the enum list of message codes, include this file without\n * defining macro JMESSAGE.  To create a message string table, include it\n * again with a suitable JMESSAGE definition (see jerror.c for an example).\n */\n#ifndef JMESSAGE\n#ifndef JERROR_H\n/* First time through, define the enum list */\n#define JMAKE_ENUM_LIST\n#else\n/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */\n#define JMESSAGE(code,string)\n#endif /* JERROR_H */\n#endif /* JMESSAGE */\n\n#ifdef JMAKE_ENUM_LIST\n\ntypedef enum {\n\n#define JMESSAGE(code,string)\tcode ,\n\n#endif /* JMAKE_ENUM_LIST */\n\nJMESSAGE(JMSG_NOMESSAGE, \"Bogus message code %d\") /* Must be first entry! */\n\n/* For maintenance convenience, list is alphabetical by message code name */\nJMESSAGE(JERR_ARITH_NOTIMPL,\n\t \"Sorry, there are legal restrictions on arithmetic coding\")\nJMESSAGE(JERR_BAD_ALIGN_TYPE, \"ALIGN_TYPE is wrong, please fix\")\nJMESSAGE(JERR_BAD_ALLOC_CHUNK, \"MAX_ALLOC_CHUNK is wrong, please fix\")\nJMESSAGE(JERR_BAD_BUFFER_MODE, \"Bogus buffer control mode\")\nJMESSAGE(JERR_BAD_COMPONENT_ID, \"Invalid component ID %d in SOS\")\nJMESSAGE(JERR_BAD_DCT_COEF, \"DCT coefficient out of range\")\nJMESSAGE(JERR_BAD_DCTSIZE, \"IDCT output block size %d not supported\")\nJMESSAGE(JERR_BAD_HUFF_TABLE, \"Bogus Huffman table definition\")\nJMESSAGE(JERR_BAD_IN_COLORSPACE, \"Bogus input colorspace\")\nJMESSAGE(JERR_BAD_J_COLORSPACE, \"Bogus JPEG colorspace\")\nJMESSAGE(JERR_BAD_LENGTH, \"Bogus marker length\")\nJMESSAGE(JERR_BAD_LIB_VERSION,\n\t \"Wrong JPEG library version: library is %d, caller expects %d\")\nJMESSAGE(JERR_BAD_MCU_SIZE, \"Sampling factors too large for interleaved scan\")\nJMESSAGE(JERR_BAD_POOL_ID, \"Invalid memory pool code %d\")\nJMESSAGE(JERR_BAD_PRECISION, \"Unsupported JPEG data precision %d\")\nJMESSAGE(JERR_BAD_PROGRESSION,\n\t \"Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d\")\nJMESSAGE(JERR_BAD_PROG_SCRIPT,\n\t \"Invalid progressive parameters at scan script entry %d\")\nJMESSAGE(JERR_BAD_SAMPLING, \"Bogus sampling factors\")\nJMESSAGE(JERR_BAD_SCAN_SCRIPT, \"Invalid scan script at entry %d\")\nJMESSAGE(JERR_BAD_STATE, \"Improper call to JPEG library in state %d\")\nJMESSAGE(JERR_BAD_STRUCT_SIZE,\n\t \"JPEG parameter struct mismatch: library thinks size is %u, caller expects %u\")\nJMESSAGE(JERR_BAD_VIRTUAL_ACCESS, \"Bogus virtual array access\")\nJMESSAGE(JERR_BUFFER_SIZE, \"Buffer passed to JPEG library is too small\")\nJMESSAGE(JERR_CANT_SUSPEND, \"Suspension not allowed here\")\nJMESSAGE(JERR_CCIR601_NOTIMPL, \"CCIR601 sampling not implemented yet\")\nJMESSAGE(JERR_COMPONENT_COUNT, \"Too many color components: %d, max %d\")\nJMESSAGE(JERR_CONVERSION_NOTIMPL, \"Unsupported color conversion request\")\nJMESSAGE(JERR_DAC_INDEX, \"Bogus DAC index %d\")\nJMESSAGE(JERR_DAC_VALUE, \"Bogus DAC value 0x%x\")\nJMESSAGE(JERR_DHT_INDEX, \"Bogus DHT index %d\")\nJMESSAGE(JERR_DQT_INDEX, \"Bogus DQT index %d\")\nJMESSAGE(JERR_EMPTY_IMAGE, \"Empty JPEG image (DNL not supported)\")\nJMESSAGE(JERR_EMS_READ, \"Read from EMS failed\")\nJMESSAGE(JERR_EMS_WRITE, \"Write to EMS failed\")\nJMESSAGE(JERR_EOI_EXPECTED, \"Didn't expect more than one scan\")\nJMESSAGE(JERR_FILE_READ, \"Input file read error\")\nJMESSAGE(JERR_FILE_WRITE, \"Output file write error --- out of disk space?\")\nJMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, \"Fractional sampling not implemented yet\")\nJMESSAGE(JERR_HUFF_CLEN_OVERFLOW, \"Huffman code size table overflow\")\nJMESSAGE(JERR_HUFF_MISSING_CODE, \"Missing Huffman code table entry\")\nJMESSAGE(JERR_IMAGE_TOO_BIG, \"Maximum supported image dimension is %u pixels\")\nJMESSAGE(JERR_INPUT_EMPTY, \"Empty input file\")\nJMESSAGE(JERR_INPUT_EOF, \"Premature end of input file\")\nJMESSAGE(JERR_MISMATCHED_QUANT_TABLE,\n\t \"Cannot transcode due to multiple use of quantization table %d\")\nJMESSAGE(JERR_MISSING_DATA, \"Scan script does not transmit all data\")\nJMESSAGE(JERR_MODE_CHANGE, \"Invalid color quantization mode change\")\nJMESSAGE(JERR_NOTIMPL, \"Not implemented yet\")\nJMESSAGE(JERR_NOT_COMPILED, \"Requested feature was omitted at compile time\")\nJMESSAGE(JERR_NO_BACKING_STORE, \"Backing store not supported\")\nJMESSAGE(JERR_NO_HUFF_TABLE, \"Huffman table 0x%02x was not defined\")\nJMESSAGE(JERR_NO_IMAGE, \"JPEG datastream contains no image\")\nJMESSAGE(JERR_NO_QUANT_TABLE, \"Quantization table 0x%02x was not defined\")\nJMESSAGE(JERR_NO_SOI, \"Not a JPEG file: starts with 0x%02x 0x%02x\")\nJMESSAGE(JERR_OUT_OF_MEMORY, \"Insufficient memory (case %d)\")\nJMESSAGE(JERR_QUANT_COMPONENTS,\n\t \"Cannot quantize more than %d color components\")\nJMESSAGE(JERR_QUANT_FEW_COLORS, \"Cannot quantize to fewer than %d colors\")\nJMESSAGE(JERR_QUANT_MANY_COLORS, \"Cannot quantize to more than %d colors\")\nJMESSAGE(JERR_SOF_DUPLICATE, \"Invalid JPEG file structure: two SOF markers\")\nJMESSAGE(JERR_SOF_NO_SOS, \"Invalid JPEG file structure: missing SOS marker\")\nJMESSAGE(JERR_SOF_UNSUPPORTED, \"Unsupported JPEG process: SOF type 0x%02x\")\nJMESSAGE(JERR_SOI_DUPLICATE, \"Invalid JPEG file structure: two SOI markers\")\nJMESSAGE(JERR_SOS_NO_SOF, \"Invalid JPEG file structure: SOS before SOF\")\nJMESSAGE(JERR_TFILE_CREATE, \"Failed to create temporary file %s\")\nJMESSAGE(JERR_TFILE_READ, \"Read failed on temporary file\")\nJMESSAGE(JERR_TFILE_SEEK, \"Seek failed on temporary file\")\nJMESSAGE(JERR_TFILE_WRITE,\n\t \"Write failed on temporary file --- out of disk space?\")\nJMESSAGE(JERR_TOO_LITTLE_DATA, \"Application transferred too few scanlines\")\nJMESSAGE(JERR_UNKNOWN_MARKER, \"Unsupported marker type 0x%02x\")\nJMESSAGE(JERR_VIRTUAL_BUG, \"Virtual array controller messed up\")\nJMESSAGE(JERR_WIDTH_OVERFLOW, \"Image too wide for this implementation\")\nJMESSAGE(JERR_XMS_READ, \"Read from XMS failed\")\nJMESSAGE(JERR_XMS_WRITE, \"Write to XMS failed\")\nJMESSAGE(JMSG_COPYRIGHT, JCOPYRIGHT)\nJMESSAGE(JMSG_VERSION, JVERSION)\nJMESSAGE(JTRC_16BIT_TABLES,\n\t \"Caution: quantization tables are too coarse for baseline JPEG\")\nJMESSAGE(JTRC_ADOBE,\n\t \"Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d\")\nJMESSAGE(JTRC_APP0, \"Unknown APP0 marker (not JFIF), length %u\")\nJMESSAGE(JTRC_APP14, \"Unknown APP14 marker (not Adobe), length %u\")\nJMESSAGE(JTRC_DAC, \"Define Arithmetic Table 0x%02x: 0x%02x\")\nJMESSAGE(JTRC_DHT, \"Define Huffman Table 0x%02x\")\nJMESSAGE(JTRC_DQT, \"Define Quantization Table %d  precision %d\")\nJMESSAGE(JTRC_DRI, \"Define Restart Interval %u\")\nJMESSAGE(JTRC_EMS_CLOSE, \"Freed EMS handle %u\")\nJMESSAGE(JTRC_EMS_OPEN, \"Obtained EMS handle %u\")\nJMESSAGE(JTRC_EOI, \"End Of Image\")\nJMESSAGE(JTRC_HUFFBITS, \"        %3d %3d %3d %3d %3d %3d %3d %3d\")\nJMESSAGE(JTRC_JFIF, \"JFIF APP0 marker: version %d.%02d, density %dx%d  %d\")\nJMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE,\n\t \"Warning: thumbnail image size does not match data length %u\")\nJMESSAGE(JTRC_JFIF_EXTENSION,\n\t \"JFIF extension marker: type 0x%02x, length %u\")\nJMESSAGE(JTRC_JFIF_THUMBNAIL, \"    with %d x %d thumbnail image\")\nJMESSAGE(JTRC_MISC_MARKER, \"Miscellaneous marker 0x%02x, length %u\")\nJMESSAGE(JTRC_PARMLESS_MARKER, \"Unexpected marker 0x%02x\")\nJMESSAGE(JTRC_QUANTVALS, \"        %4u %4u %4u %4u %4u %4u %4u %4u\")\nJMESSAGE(JTRC_QUANT_3_NCOLORS, \"Quantizing to %d = %d*%d*%d colors\")\nJMESSAGE(JTRC_QUANT_NCOLORS, \"Quantizing to %d colors\")\nJMESSAGE(JTRC_QUANT_SELECTED, \"Selected %d colors for quantization\")\nJMESSAGE(JTRC_RECOVERY_ACTION, \"At marker 0x%02x, recovery action %d\")\nJMESSAGE(JTRC_RST, \"RST%d\")\nJMESSAGE(JTRC_SMOOTH_NOTIMPL,\n\t \"Smoothing not supported with nonstandard sampling ratios\")\nJMESSAGE(JTRC_SOF, \"Start Of Frame 0x%02x: width=%u, height=%u, components=%d\")\nJMESSAGE(JTRC_SOF_COMPONENT, \"    Component %d: %dhx%dv q=%d\")\nJMESSAGE(JTRC_SOI, \"Start of Image\")\nJMESSAGE(JTRC_SOS, \"Start Of Scan: %d components\")\nJMESSAGE(JTRC_SOS_COMPONENT, \"    Component %d: dc=%d ac=%d\")\nJMESSAGE(JTRC_SOS_PARAMS, \"  Ss=%d, Se=%d, Ah=%d, Al=%d\")\nJMESSAGE(JTRC_TFILE_CLOSE, \"Closed temporary file %s\")\nJMESSAGE(JTRC_TFILE_OPEN, \"Opened temporary file %s\")\nJMESSAGE(JTRC_THUMB_JPEG,\n\t \"JFIF extension marker: JPEG-compressed thumbnail image, length %u\")\nJMESSAGE(JTRC_THUMB_PALETTE,\n\t \"JFIF extension marker: palette thumbnail image, length %u\")\nJMESSAGE(JTRC_THUMB_RGB,\n\t \"JFIF extension marker: RGB thumbnail image, length %u\")\nJMESSAGE(JTRC_UNKNOWN_IDS,\n\t \"Unrecognized component IDs %d %d %d, assuming YCbCr\")\nJMESSAGE(JTRC_XMS_CLOSE, \"Freed XMS handle %u\")\nJMESSAGE(JTRC_XMS_OPEN, \"Obtained XMS handle %u\")\nJMESSAGE(JWRN_ADOBE_XFORM, \"Unknown Adobe color transform code %d\")\nJMESSAGE(JWRN_BOGUS_PROGRESSION,\n\t \"Inconsistent progression sequence for component %d coefficient %d\")\nJMESSAGE(JWRN_EXTRANEOUS_DATA,\n\t \"Corrupt JPEG data: %u extraneous bytes before marker 0x%02x\")\nJMESSAGE(JWRN_HIT_MARKER, \"Corrupt JPEG data: premature end of data segment\")\nJMESSAGE(JWRN_HUFF_BAD_CODE, \"Corrupt JPEG data: bad Huffman code\")\nJMESSAGE(JWRN_JFIF_MAJOR, \"Warning: unknown JFIF revision number %d.%02d\")\nJMESSAGE(JWRN_JPEG_EOF, \"Premature end of JPEG file\")\nJMESSAGE(JWRN_MUST_RESYNC,\n\t \"Corrupt JPEG data: found marker 0x%02x instead of RST%d\")\nJMESSAGE(JWRN_NOT_SEQUENTIAL, \"Invalid SOS parameters for sequential JPEG\")\nJMESSAGE(JWRN_TOO_MUCH_DATA, \"Application transferred too many scanlines\")\n\n#ifdef JMAKE_ENUM_LIST\n\n  JMSG_LASTMSGCODE\n} J_MESSAGE_CODE;\n\n#undef JMAKE_ENUM_LIST\n#endif /* JMAKE_ENUM_LIST */\n\n/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */\n#undef JMESSAGE\n\n\n#ifndef JERROR_H\n#define JERROR_H\n\n/* Macros to simplify using the error and trace message stuff */\n/* The first parameter is either type of cinfo pointer */\n\n/* Fatal errors (print message and exit) */\n#define ERREXIT(cinfo,code)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))\n#define ERREXIT1(cinfo,code,p1)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (cinfo)->err->msg_parm.i[0] = (p1), \\\n   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))\n#define ERREXIT2(cinfo,code,p1,p2)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (cinfo)->err->msg_parm.i[0] = (p1), \\\n   (cinfo)->err->msg_parm.i[1] = (p2), \\\n   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))\n#define ERREXIT3(cinfo,code,p1,p2,p3)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (cinfo)->err->msg_parm.i[0] = (p1), \\\n   (cinfo)->err->msg_parm.i[1] = (p2), \\\n   (cinfo)->err->msg_parm.i[2] = (p3), \\\n   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))\n#define ERREXIT4(cinfo,code,p1,p2,p3,p4)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (cinfo)->err->msg_parm.i[0] = (p1), \\\n   (cinfo)->err->msg_parm.i[1] = (p2), \\\n   (cinfo)->err->msg_parm.i[2] = (p3), \\\n   (cinfo)->err->msg_parm.i[3] = (p4), \\\n   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))\n#define ERREXITS(cinfo,code,str)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   FXSYS_strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \\\n   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))\n\n#define MAKESTMT(stuff)\t\tdo { stuff } while (0)\n\n/* Nonfatal errors (we can keep going, but the data is probably corrupt) */\n#define WARNMS(cinfo,code)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))\n#define WARNMS1(cinfo,code,p1)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (cinfo)->err->msg_parm.i[0] = (p1), \\\n   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))\n#define WARNMS2(cinfo,code,p1,p2)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (cinfo)->err->msg_parm.i[0] = (p1), \\\n   (cinfo)->err->msg_parm.i[1] = (p2), \\\n   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))\n\n/* Informational/debugging messages */\n#define TRACEMS(cinfo,lvl,code)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))\n#define TRACEMS1(cinfo,lvl,code,p1)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (cinfo)->err->msg_parm.i[0] = (p1), \\\n   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))\n#define TRACEMS2(cinfo,lvl,code,p1,p2)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (cinfo)->err->msg_parm.i[0] = (p1), \\\n   (cinfo)->err->msg_parm.i[1] = (p2), \\\n   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))\n#define TRACEMS3(cinfo,lvl,code,p1,p2,p3)  \\\n  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \\\n\t   _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); \\\n\t   (cinfo)->err->msg_code = (code); \\\n\t   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )\n#define TRACEMS4(cinfo,lvl,code,p1,p2,p3,p4)  \\\n  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \\\n\t   _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \\\n\t   (cinfo)->err->msg_code = (code); \\\n\t   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )\n#define TRACEMS5(cinfo,lvl,code,p1,p2,p3,p4,p5)  \\\n  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \\\n\t   _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \\\n\t   _mp[4] = (p5); \\\n\t   (cinfo)->err->msg_code = (code); \\\n\t   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )\n#define TRACEMS8(cinfo,lvl,code,p1,p2,p3,p4,p5,p6,p7,p8)  \\\n  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \\\n\t   _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \\\n\t   _mp[4] = (p5); _mp[5] = (p6); _mp[6] = (p7); _mp[7] = (p8); \\\n\t   (cinfo)->err->msg_code = (code); \\\n\t   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )\n#define TRACEMSS(cinfo,lvl,code,str)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   FXSYS_strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \\\n   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))\n\n#endif /* JERROR_H */\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/jinclude.h",
    "content": "/*\n * jinclude.h\n *\n * Copyright (C) 1991-1994, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file exists to provide a single place to fix any problems with\n * including the wrong system include files.  (Common problems are taken\n * care of by the standard jconfig symbols, but on really weird systems\n * you may have to edit this file.)\n *\n * NOTE: this file is NOT intended to be included by applications using the\n * JPEG library.  Most applications need only include jpeglib.h.\n */\n\n\n/* Include auto-config file to find out which system include files we need. */\n\n#include \"jconfig.h\"\t\t/* auto configuration options */\n#define JCONFIG_INCLUDED\t/* so that jpeglib.h doesn't do it again */\n\n#include \"../../../include/fxcrt/fx_system.h\"\n/*\n * We need the NULL macro and size_t typedef.\n * On an ANSI-conforming system it is sufficient to include <stddef.h>.\n * Otherwise, we get them from <stdlib.h> or <stdio.h>; we may have to\n * pull in <sys/types.h> as well.\n * Note that the core JPEG library does not require <stdio.h>;\n * only the default error handler and data source/destination modules do.\n * But we must pull it in because of the references to FILE in jpeglib.h.\n * You can remove those references if you want to compile without <stdio.h>.\n */\n\n#ifdef _DEBUG\n#define CRTDBG_MAP_ALLOC\n//#include <stdlib.h>\n//#include <crtdbg.h>\n#endif\n\n#ifdef HAVE_STDDEF_H\n#include <stddef.h>\n#endif\n\n#ifdef HAVE_STDLIB_H\n//#include <stdlib.h>\n#endif\n\n#ifdef NEED_SYS_TYPES_H\n#include <sys/types.h>\n#endif\n\n#ifndef FAR\n#define FAR\n#endif\n\n//#include <stdio.h>\n\n/*\n * We need memory copying and zeroing functions, plus strncpy().\n * ANSI and System V implementations declare these in <string.h>.\n * BSD doesn't have the mem() functions, but it does have bcopy()/bzero().\n * Some systems may declare memset and memcpy in <memory.h>.\n *\n * NOTE: we assume the size parameters to these functions are of type size_t.\n * Change the casts in these macros if not!\n */\n\n#ifdef NEED_BSD_STRINGS\n\n//#include <strings.h>\n#define MEMZERO(target,size)\tbzero((void *)(target), (size_t)(size))\n#define MEMCOPY(dest,src,size)\tbcopy((const void *)(src), (void *)(dest), (size_t)(size))\n\n#else /* not BSD, assume ANSI/SysV string lib */\n\n//#include <string.h>\n#define MEMZERO(target,size)\tFXSYS_memset32((void *)(target), 0, (size_t)(size))\n#define MEMCOPY(dest,src,size)\tFXSYS_memcpy32((void *)(dest), (const void *)(src), (size_t)(size))\n\n#endif\n\n/*\n * In ANSI C, and indeed any rational implementation, size_t is also the\n * type returned by sizeof().  However, it seems there are some irrational\n * implementations out there, in which sizeof() returns an int even though\n * size_t is defined as long or unsigned long.  To ensure consistent results\n * we always use this SIZEOF() macro in place of using sizeof() directly.\n */\n\n#define SIZEOF(object)\t((size_t) sizeof(object))\n\n/*\n * The modules that use fread() and fwrite() always invoke them through\n * these macros.  On some systems you may need to twiddle the argument casts.\n * CAUTION: argument order is different from underlying functions!\n */\n\n#define JFREAD(file,buf,sizeofbuf)  \\\n  ((size_t) FXSYS_fread((void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file)))\n#define JFWRITE(file,buf,sizeofbuf)  \\\n  ((size_t) FXSYS_fwrite((const void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file)))\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/jmemsys.h",
    "content": "/*\n * jmemsys.h\n *\n * Copyright (C) 1992-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This include file defines the interface between the system-independent\n * and system-dependent portions of the JPEG memory manager.  No other\n * modules need include it.  (The system-independent portion is jmemmgr.c;\n * there are several different versions of the system-dependent portion.)\n *\n * This file works as-is for the system-dependent memory managers supplied\n * in the IJG distribution.  You may need to modify it if you write a\n * custom memory manager.  If system-dependent changes are needed in\n * this file, the best method is to #ifdef them based on a configuration\n * symbol supplied in jconfig.h, as we have done with USE_MSDOS_MEMMGR\n * and USE_MAC_MEMMGR.\n */\n\n\n/* Short forms of external names for systems with brain-damaged linkers. */\n\n#ifdef NEED_SHORT_EXTERNAL_NAMES\n#define jpeg_get_small\t\tjGetSmall\n#define jpeg_free_small\t\tjFreeSmall\n#define jpeg_get_large\t\tjGetLarge\n#define jpeg_free_large\t\tjFreeLarge\n#define jpeg_mem_available\tjMemAvail\n#define jpeg_open_backing_store\tjOpenBackStore\n#define jpeg_mem_init\t\tjMemInit\n#define jpeg_mem_term\t\tjMemTerm\n#endif /* NEED_SHORT_EXTERNAL_NAMES */\n\n\n/*\n * These two functions are used to allocate and release small chunks of\n * memory.  (Typically the total amount requested through jpeg_get_small is\n * no more than 20K or so; this will be requested in chunks of a few K each.)\n * Behavior should be the same as for the standard library functions malloc\n * and free; in particular, jpeg_get_small must return NULL on failure.\n * On most systems, these ARE malloc and free.  jpeg_free_small is passed the\n * size of the object being freed, just in case it's needed.\n * On an 80x86 machine using small-data memory model, these manage near heap.\n */\n\nEXTERN(void *) jpeg_get_small JPP((j_common_ptr cinfo, size_t sizeofobject));\nEXTERN(void) jpeg_free_small JPP((j_common_ptr cinfo, void * object,\n\t\t\t\t  size_t sizeofobject));\n\n/*\n * These two functions are used to allocate and release large chunks of\n * memory (up to the total free space designated by jpeg_mem_available).\n * The interface is the same as above, except that on an 80x86 machine,\n * far pointers are used.  On most other machines these are identical to\n * the jpeg_get/free_small routines; but we keep them separate anyway,\n * in case a different allocation strategy is desirable for large chunks.\n */\n\nEXTERN(void FAR *) jpeg_get_large JPP((j_common_ptr cinfo,\n\t\t\t\t       size_t sizeofobject));\nEXTERN(void) jpeg_free_large JPP((j_common_ptr cinfo, void FAR * object,\n\t\t\t\t  size_t sizeofobject));\n\n/*\n * The macro MAX_ALLOC_CHUNK designates the maximum number of bytes that may\n * be requested in a single call to jpeg_get_large (and jpeg_get_small for that\n * matter, but that case should never come into play).  This macro is needed\n * to model the 64Kb-segment-size limit of far addressing on 80x86 machines.\n * On those machines, we expect that jconfig.h will provide a proper value.\n * On machines with 32-bit flat address spaces, any large constant may be used.\n *\n * NB: jmemmgr.c expects that MAX_ALLOC_CHUNK will be representable as type\n * size_t and will be a multiple of sizeof(align_type).\n */\n\n#ifndef MAX_ALLOC_CHUNK\t\t/* may be overridden in jconfig.h */\n#define MAX_ALLOC_CHUNK  1000000000L\n#endif\n\n/*\n * This routine computes the total space still available for allocation by\n * jpeg_get_large.  If more space than this is needed, backing store will be\n * used.  NOTE: any memory already allocated must not be counted.\n *\n * There is a minimum space requirement, corresponding to the minimum\n * feasible buffer sizes; jmemmgr.c will request that much space even if\n * jpeg_mem_available returns zero.  The maximum space needed, enough to hold\n * all working storage in memory, is also passed in case it is useful.\n * Finally, the total space already allocated is passed.  If no better\n * method is available, cinfo->mem->max_memory_to_use - already_allocated\n * is often a suitable calculation.\n *\n * It is OK for jpeg_mem_available to underestimate the space available\n * (that'll just lead to more backing-store access than is really necessary).\n * However, an overestimate will lead to failure.  Hence it's wise to subtract\n * a slop factor from the true available space.  5% should be enough.\n *\n * On machines with lots of virtual memory, any large constant may be returned.\n * Conversely, zero may be returned to always use the minimum amount of memory.\n */\n\nEXTERN(long) jpeg_mem_available JPP((j_common_ptr cinfo,\n\t\t\t\t     long min_bytes_needed,\n\t\t\t\t     long max_bytes_needed,\n\t\t\t\t     long already_allocated));\n\n\n/*\n * This structure holds whatever state is needed to access a single\n * backing-store object.  The read/write/close method pointers are called\n * by jmemmgr.c to manipulate the backing-store object; all other fields\n * are private to the system-dependent backing store routines.\n */\n\n#define TEMP_NAME_LENGTH   64\t/* max length of a temporary file's name */\n\n\n#ifdef USE_MSDOS_MEMMGR\t\t/* DOS-specific junk */\n\ntypedef unsigned short XMSH;\t/* type of extended-memory handles */\ntypedef unsigned short EMSH;\t/* type of expanded-memory handles */\n\ntypedef union {\n  short file_handle;\t\t/* DOS file handle if it's a temp file */\n  XMSH xms_handle;\t\t/* handle if it's a chunk of XMS */\n  EMSH ems_handle;\t\t/* handle if it's a chunk of EMS */\n} handle_union;\n\n#endif /* USE_MSDOS_MEMMGR */\n\n#ifdef USE_MAC_MEMMGR\t\t/* Mac-specific junk */\n#include <Files.h>\n#endif /* USE_MAC_MEMMGR */\n\n\ntypedef struct backing_store_struct * backing_store_ptr;\n\ntypedef struct backing_store_struct {\n  /* Methods for reading/writing/closing this backing-store object */\n  JMETHOD(void, read_backing_store, (j_common_ptr cinfo,\n\t\t\t\t     backing_store_ptr info,\n\t\t\t\t     void FAR * buffer_address,\n\t\t\t\t     long file_offset, long byte_count));\n  JMETHOD(void, write_backing_store, (j_common_ptr cinfo,\n\t\t\t\t      backing_store_ptr info,\n\t\t\t\t      void FAR * buffer_address,\n\t\t\t\t      long file_offset, long byte_count));\n  JMETHOD(void, close_backing_store, (j_common_ptr cinfo,\n\t\t\t\t      backing_store_ptr info));\n\n  /* Private fields for system-dependent backing-store management */\n#ifdef USE_MSDOS_MEMMGR\n  /* For the MS-DOS manager (jmemdos.c), we need: */\n  handle_union handle;\t\t/* reference to backing-store storage object */\n  char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */\n#else\n#ifdef USE_MAC_MEMMGR\n  /* For the Mac manager (jmemmac.c), we need: */\n  short temp_file;\t\t/* file reference number to temp file */\n  FSSpec tempSpec;\t\t/* the FSSpec for the temp file */\n  char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */\n#else\n  /* For a typical implementation with temp files, we need: */\n#ifndef _FPDFAPI_MINI_\n  FXSYS_FILE * temp_file;\t\t/* stdio reference to temp file */\n  char temp_name[TEMP_NAME_LENGTH]; /* name of temp file */\n#endif\n#endif\n#endif\n} backing_store_info;\n\n\n/*\n * Initial opening of a backing-store object.  This must fill in the\n * read/write/close pointers in the object.  The read/write routines\n * may take an error exit if the specified maximum file size is exceeded.\n * (If jpeg_mem_available always returns a large value, this routine can\n * just take an error exit.)\n */\n\nEXTERN(void) jpeg_open_backing_store JPP((j_common_ptr cinfo,\n\t\t\t\t\t  backing_store_ptr info,\n\t\t\t\t\t  long total_bytes_needed));\n\n\n/*\n * These routines take care of any system-dependent initialization and\n * cleanup required.  jpeg_mem_init will be called before anything is\n * allocated (and, therefore, nothing in cinfo is of use except the error\n * manager pointer).  It should return a suitable default value for\n * max_memory_to_use; this may subsequently be overridden by the surrounding\n * application.  (Note that max_memory_to_use is only important if\n * jpeg_mem_available chooses to consult it ... no one else will.)\n * jpeg_mem_term may assume that all requested memory has been freed and that\n * all opened backing-store objects have been closed.\n */\n\nEXTERN(long) jpeg_mem_init JPP((j_common_ptr cinfo));\nEXTERN(void) jpeg_mem_term JPP((j_common_ptr cinfo));\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/jmorecfg.h",
    "content": "/*\n * jmorecfg.h\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains additional configuration options that customize the\n * JPEG software for special applications or support machine-dependent\n * optimizations.  Most users will not need to touch this file.\n */\n\n#ifdef _MSC_VER\n#pragma warning (disable : 4142)\n#endif\n\n/*\n * Define BITS_IN_JSAMPLE as either\n *   8   for 8-bit sample values (the usual setting)\n *   12  for 12-bit sample values\n * Only 8 and 12 are legal data precisions for lossy JPEG according to the\n * JPEG standard, and the IJG code does not support anything else!\n * We do not support run-time selection of data precision, sorry.\n */\n\n#define BITS_IN_JSAMPLE  8\t/* use 8 or 12 */\n\n\n/*\n * Maximum number of components (color channels) allowed in JPEG image.\n * To meet the letter of the JPEG spec, set this to 255.  However, darn\n * few applications need more than 4 channels (maybe 5 for CMYK + alpha\n * mask).  We recommend 10 as a reasonable compromise; use 4 if you are\n * really short on memory.  (Each allowed component costs a hundred or so\n * bytes of storage, whether actually used in an image or not.)\n */\n\n#define MAX_COMPONENTS  10\t/* maximum number of image components */\n\n\n/*\n * Basic data types.\n * You may need to change these if you have a machine with unusual data\n * type sizes; for example, \"char\" not 8 bits, \"short\" not 16 bits,\n * or \"long\" not 32 bits.  We don't care whether \"int\" is 16 or 32 bits,\n * but it had better be at least 16.\n */\n\n/* Representation of a single sample (pixel element value).\n * We frequently allocate large arrays of these, so it's important to keep\n * them small.  But if you have memory to burn and access to char or short\n * arrays is very slow on your hardware, you might want to change these.\n */\n\n#if BITS_IN_JSAMPLE == 8\n/* JSAMPLE should be the smallest type that will hold the values 0..255.\n * You can use a signed char by having GETJSAMPLE mask it with 0xFF.\n */\n\n#ifdef HAVE_UNSIGNED_CHAR\n\ntypedef unsigned char JSAMPLE;\n#define GETJSAMPLE(value)  ((int) (value))\n\n#else /* not HAVE_UNSIGNED_CHAR */\n\ntypedef char JSAMPLE;\n#ifdef CHAR_IS_UNSIGNED\n#define GETJSAMPLE(value)  ((int) (value))\n#else\n#define GETJSAMPLE(value)  ((int) (value) & 0xFF)\n#endif /* CHAR_IS_UNSIGNED */\n\n#endif /* HAVE_UNSIGNED_CHAR */\n\n#define MAXJSAMPLE\t255\n#define CENTERJSAMPLE\t128\n\n#endif /* BITS_IN_JSAMPLE == 8 */\n\n\n#if BITS_IN_JSAMPLE == 12\n/* JSAMPLE should be the smallest type that will hold the values 0..4095.\n * On nearly all machines \"short\" will do nicely.\n */\n\ntypedef short JSAMPLE;\n#define GETJSAMPLE(value)  ((int) (value))\n\n#define MAXJSAMPLE\t4095\n#define CENTERJSAMPLE\t2048\n\n#endif /* BITS_IN_JSAMPLE == 12 */\n\n\n/* Representation of a DCT frequency coefficient.\n * This should be a signed value of at least 16 bits; \"short\" is usually OK.\n * Again, we allocate large arrays of these, but you can change to int\n * if you have memory to burn and \"short\" is really slow.\n */\n\ntypedef short JCOEF;\n\n\n/* Compressed datastreams are represented as arrays of JOCTET.\n * These must be EXACTLY 8 bits wide, at least once they are written to\n * external storage.  Note that when using the stdio data source/destination\n * managers, this is also the data type passed to fread/fwrite.\n */\n\n#ifdef HAVE_UNSIGNED_CHAR\n\ntypedef unsigned char JOCTET;\n#define GETJOCTET(value)  (value)\n\n#else /* not HAVE_UNSIGNED_CHAR */\n\ntypedef char JOCTET;\n#ifdef CHAR_IS_UNSIGNED\n#define GETJOCTET(value)  (value)\n#else\n#define GETJOCTET(value)  ((value) & 0xFF)\n#endif /* CHAR_IS_UNSIGNED */\n\n#endif /* HAVE_UNSIGNED_CHAR */\n\n\n/* These typedefs are used for various table entries and so forth.\n * They must be at least as wide as specified; but making them too big\n * won't cost a huge amount of memory, so we don't provide special\n * extraction code like we did for JSAMPLE.  (In other words, these\n * typedefs live at a different point on the speed/space tradeoff curve.)\n */\n\n#if _FX_OS_ != _FX_VXWORKS_\n\n/* UINT8 must hold at least the values 0..255. */\n\n#ifdef HAVE_UNSIGNED_CHAR\ntypedef unsigned char UINT8;\n#else /* not HAVE_UNSIGNED_CHAR */\n#ifdef CHAR_IS_UNSIGNED\ntypedef char UINT8;\n#else /* not CHAR_IS_UNSIGNED */\ntypedef short UINT8;\n#endif /* CHAR_IS_UNSIGNED */\n#endif /* HAVE_UNSIGNED_CHAR */\n\n\n/* UINT16 must hold at least the values 0..65535. */\n\n#ifdef HAVE_UNSIGNED_SHORT\ntypedef unsigned short UINT16;\n#else /* not HAVE_UNSIGNED_SHORT */\ntypedef unsigned int UINT16;\n#endif /* HAVE_UNSIGNED_SHORT */\n\n/* INT16 must hold at least the values -32768..32767. */\n\n#ifndef XMD_H\t\t\t/* X11/xmd.h correctly defines INT16 */\ntypedef short INT16;\n#endif\n\n/* INT32 must hold at least signed 32-bit values. */\n\n#ifndef XMD_H\t\t\t/* X11/xmd.h correctly defines INT32 */\ntypedef int INT32;\n#endif\n\n#endif \n\n/* Datatype used for image dimensions.  The JPEG standard only supports\n * images up to 64K*64K due to 16-bit fields in SOF markers.  Therefore\n * \"unsigned int\" is sufficient on all machines.  However, if you need to\n * handle larger images and you don't mind deviating from the spec, you\n * can change this datatype.\n */\n\ntypedef unsigned int JDIMENSION;\n\n#define JPEG_MAX_DIMENSION  65500L  /* a tad under 64K to prevent overflows */\n\n\n/* These macros are used in all function definitions and extern declarations.\n * You could modify them if you need to change function linkage conventions;\n * in particular, you'll need to do that to make the library a Windows DLL.\n * Another application is to make all functions global for use with debuggers\n * or code profilers that require it.\n */\n\n/* a function called through method pointers: */\n#define METHODDEF(type)\t\tstatic type\n/* a function used only in its module: */\n#define LOCAL(type)\t\tstatic type\n/* a function referenced thru EXTERNs: */\n#define GLOBAL(type)\t\ttype\n\n#ifdef _FX_MANAGED_CODE_\n#define EXTERN(type)\t\textern \"C\" type\n#else\n/* a reference to a GLOBAL function: */\n#define EXTERN(type)\t\textern type\n#endif\n\n\n/* This macro is used to declare a \"method\", that is, a function pointer.\n * We want to supply prototype parameters if the compiler can cope.\n * Note that the arglist parameter must be parenthesized!\n * Again, you can customize this if you need special linkage keywords.\n */\n\n#ifdef HAVE_PROTOTYPES\n#define JMETHOD(type,methodname,arglist)  type (*methodname) arglist\n#else\n#define JMETHOD(type,methodname,arglist)  type (*methodname) ()\n#endif\n\n\n/* Here is the pseudo-keyword for declaring pointers that must be \"far\"\n * on 80x86 machines.  Most of the specialized coding for 80x86 is handled\n * by just saying \"FAR *\" where such a pointer is needed.  In a few places\n * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol.\n */\n\n#ifdef NEED_FAR_POINTERS\n#define FAR  far\n#else\n//#define FAR\n#endif\n\n\n/*\n * On a few systems, type boolean and/or its values FALSE, TRUE may appear\n * in standard header files.  Or you may have conflicts with application-\n * specific header files that you want to include together with these files.\n * Defining HAVE_BOOLEAN before including jpeglib.h should make it work.\n */\n\n#ifndef HAVE_BOOLEAN\ntypedef int boolean;\n#endif\n#ifndef FALSE\t\t\t/* in case these macros already exist */\n#define FALSE\t0\t\t/* values of boolean */\n#endif\n#ifndef TRUE\n#define TRUE\t1\n#endif\n\n\n/*\n * The remaining options affect code selection within the JPEG library,\n * but they don't need to be visible to most applications using the library.\n * To minimize application namespace pollution, the symbols won't be\n * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined.\n */\n\n#ifdef JPEG_INTERNALS\n#define JPEG_INTERNAL_OPTIONS\n#endif\n\n#ifdef JPEG_INTERNAL_OPTIONS\n\n\n/*\n * These defines indicate whether to include various optional functions.\n * Undefining some of these symbols will produce a smaller but less capable\n * library.  Note that you can leave certain source files out of the\n * compilation/linking process if you've #undef'd the corresponding symbols.\n * (You may HAVE to do that if your compiler doesn't like null source files.)\n */\n\n/* Arithmetic coding is unsupported for legal reasons.  Complaints to IBM. */\n\n/* Capability options common to encoder and decoder: */\n\n#define DCT_ISLOW_SUPPORTED\t/* slow but accurate integer algorithm */\n#define DCT_IFAST_SUPPORTED\t/* faster, less accurate integer method */\n#undef DCT_FLOAT_SUPPORTED\t/* floating-point: accurate, fast on fast HW */\n\n/* Encoder capability options: */\n\n#undef  C_ARITH_CODING_SUPPORTED    /* Arithmetic coding back end? */\n#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */\n#define C_PROGRESSIVE_SUPPORTED\t    /* Progressive JPEG? (Requires MULTISCAN)*/\n#define ENTROPY_OPT_SUPPORTED\t    /* Optimization of entropy coding parms? */\n/* Note: if you selected 12-bit data precision, it is dangerous to turn off\n * ENTROPY_OPT_SUPPORTED.  The standard Huffman tables are only good for 8-bit\n * precision, so jchuff.c normally uses entropy optimization to compute\n * usable tables for higher precision.  If you don't want to do optimization,\n * you'll have to supply different default Huffman tables.\n * The exact same statements apply for progressive JPEG: the default tables\n * don't work for progressive mode.  (This may get fixed, however.)\n */\n#define INPUT_SMOOTHING_SUPPORTED   /* Input image smoothing option? */\n\n/* Decoder capability options: */\n\n#undef  D_ARITH_CODING_SUPPORTED    /* Arithmetic coding back end? */\n#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */\n#define D_PROGRESSIVE_SUPPORTED\t    /* Progressive JPEG? (Requires MULTISCAN)*/\n#define SAVE_MARKERS_SUPPORTED\t    /* jpeg_save_markers() needed? */\n#define BLOCK_SMOOTHING_SUPPORTED   /* Block smoothing? (Progressive only) */\n#define IDCT_SCALING_SUPPORTED\t    /* Output rescaling via IDCT? */\n#undef UPSAMPLE_SCALING_SUPPORTED  /* Output rescaling at upsample stage? */\n#define UPSAMPLE_MERGING_SUPPORTED  /* Fast path for sloppy upsampling? */\n#undef QUANT_1PASS_SUPPORTED\t    /* 1-pass color quantization? */\n#undef QUANT_2PASS_SUPPORTED\t    /* 2-pass color quantization? */\n\n/* more capability options later, no doubt */\n\n\n/*\n * Ordering of RGB data in scanlines passed to or from the application.\n * If your application wants to deal with data in the order B,G,R, just\n * change these macros.  You can also deal with formats such as R,G,B,X\n * (one extra byte per pixel) by changing RGB_PIXELSIZE.  Note that changing\n * the offsets will also change the order in which colormap data is organized.\n * RESTRICTIONS:\n * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats.\n * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not\n *    useful if you are using JPEG color spaces other than YCbCr or grayscale.\n * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE\n *    is not 3 (they don't understand about dummy color components!).  So you\n *    can't use color quantization if you change that value.\n */\n\n#define RGB_RED\t\t0\t/* Offset of Red in an RGB scanline element */\n#define RGB_GREEN\t1\t/* Offset of Green */\n#define RGB_BLUE\t2\t/* Offset of Blue */\n#define RGB_PIXELSIZE\t3\t/* JSAMPLEs per RGB scanline element */\n\n\n/* Definitions for speed-related optimizations. */\n\n\n/* If your compiler supports inline functions, define INLINE\n * as the inline keyword; otherwise define it as empty.\n */\n\n#ifndef INLINE\n#ifdef __GNUC__\t\t\t/* for instance, GNU C knows about inline */\n#define INLINE __inline__\n#endif\n#ifndef INLINE\n#define INLINE\t\t\t/* default is to define it as empty */\n#endif\n#endif\n\n\n/* On some machines (notably 68000 series) \"int\" is 32 bits, but multiplying\n * two 16-bit shorts is faster than multiplying two ints.  Define MULTIPLIER\n * as short on such a machine.  MULTIPLIER must be at least 16 bits wide.\n */\n\n#ifndef MULTIPLIER\n#define MULTIPLIER  int\t\t/* type for fastest integer multiply */\n#endif\n\n\n/* FAST_FLOAT should be either float or double, whichever is done faster\n * by your compiler.  (Note that this type is only used in the floating point\n * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.)\n * Typically, float is faster in ANSI C compilers, while double is faster in\n * pre-ANSI compilers (because they insist on converting to double anyway).\n * The code below therefore chooses float if we have ANSI-style prototypes.\n */\n\n#ifndef FAST_FLOAT\n#ifdef HAVE_PROTOTYPES\n#define FAST_FLOAT  float\n#else\n#define FAST_FLOAT  double\n#endif\n#endif\n\n#endif /* JPEG_INTERNAL_OPTIONS */\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/jpegint.h",
    "content": "/*\n * jpegint.h\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file provides common declarations for the various JPEG modules.\n * These declarations are considered internal to the JPEG library; most\n * applications using the library shouldn't need to include this file.\n */\n\n\n/* Declarations for both compression & decompression */\n\ntypedef enum {\t\t\t/* Operating modes for buffer controllers */\n\tJBUF_PASS_THRU,\t\t/* Plain stripwise operation */\n\t/* Remaining modes require a full-image buffer to have been created */\n\tJBUF_SAVE_SOURCE,\t/* Run source subobject only, save output */\n\tJBUF_CRANK_DEST,\t/* Run dest subobject only, using saved data */\n\tJBUF_SAVE_AND_PASS\t/* Run both subobjects, save output */\n} J_BUF_MODE;\n\n/* Values of global_state field (jdapi.c has some dependencies on ordering!) */\n#define CSTATE_START\t100\t/* after create_compress */\n#define CSTATE_SCANNING\t101\t/* start_compress done, write_scanlines OK */\n#define CSTATE_RAW_OK\t102\t/* start_compress done, write_raw_data OK */\n#define CSTATE_WRCOEFS\t103\t/* jpeg_write_coefficients done */\n#define DSTATE_START\t200\t/* after create_decompress */\n#define DSTATE_INHEADER\t201\t/* reading header markers, no SOS yet */\n#define DSTATE_READY\t202\t/* found SOS, ready for start_decompress */\n#define DSTATE_PRELOAD\t203\t/* reading multiscan file in start_decompress*/\n#define DSTATE_PRESCAN\t204\t/* performing dummy pass for 2-pass quant */\n#define DSTATE_SCANNING\t205\t/* start_decompress done, read_scanlines OK */\n#define DSTATE_RAW_OK\t206\t/* start_decompress done, read_raw_data OK */\n#define DSTATE_BUFIMAGE\t207\t/* expecting jpeg_start_output */\n#define DSTATE_BUFPOST\t208\t/* looking for SOS/EOI in jpeg_finish_output */\n#define DSTATE_RDCOEFS\t209\t/* reading file in jpeg_read_coefficients */\n#define DSTATE_STOPPING\t210\t/* looking for EOI in jpeg_finish_decompress */\n\n\n/* Declarations for compression modules */\n\n/* Master control module */\nstruct jpeg_comp_master {\n  JMETHOD(void, prepare_for_pass, (j_compress_ptr cinfo));\n  JMETHOD(void, pass_startup, (j_compress_ptr cinfo));\n  JMETHOD(void, finish_pass, (j_compress_ptr cinfo));\n\n  /* State variables made visible to other modules */\n  boolean call_pass_startup;\t/* True if pass_startup must be called */\n  boolean is_last_pass;\t\t/* True during last pass */\n};\n\n/* Main buffer control (downsampled-data buffer) */\nstruct jpeg_c_main_controller {\n  JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));\n  JMETHOD(void, process_data, (j_compress_ptr cinfo,\n\t\t\t       JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,\n\t\t\t       JDIMENSION in_rows_avail));\n};\n\n/* Compression preprocessing (downsampling input buffer control) */\nstruct jpeg_c_prep_controller {\n  JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));\n  JMETHOD(void, pre_process_data, (j_compress_ptr cinfo,\n\t\t\t\t   JSAMPARRAY input_buf,\n\t\t\t\t   JDIMENSION *in_row_ctr,\n\t\t\t\t   JDIMENSION in_rows_avail,\n\t\t\t\t   JSAMPIMAGE output_buf,\n\t\t\t\t   JDIMENSION *out_row_group_ctr,\n\t\t\t\t   JDIMENSION out_row_groups_avail));\n};\n\n/* Coefficient buffer control */\nstruct jpeg_c_coef_controller {\n  JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));\n  JMETHOD(boolean, compress_data, (j_compress_ptr cinfo,\n\t\t\t\t   JSAMPIMAGE input_buf));\n};\n\n/* Colorspace conversion */\nstruct jpeg_color_converter {\n  JMETHOD(void, start_pass, (j_compress_ptr cinfo));\n  JMETHOD(void, color_convert, (j_compress_ptr cinfo,\n\t\t\t\tJSAMPARRAY input_buf, JSAMPIMAGE output_buf,\n\t\t\t\tJDIMENSION output_row, int num_rows));\n};\n\n/* Downsampling */\nstruct jpeg_downsampler {\n  JMETHOD(void, start_pass, (j_compress_ptr cinfo));\n  JMETHOD(void, downsample, (j_compress_ptr cinfo,\n\t\t\t     JSAMPIMAGE input_buf, JDIMENSION in_row_index,\n\t\t\t     JSAMPIMAGE output_buf,\n\t\t\t     JDIMENSION out_row_group_index));\n\n  boolean need_context_rows;\t/* TRUE if need rows above & below */\n};\n\n/* Forward DCT (also controls coefficient quantization) */\nstruct jpeg_forward_dct {\n  JMETHOD(void, start_pass, (j_compress_ptr cinfo));\n  /* perhaps this should be an array??? */\n  JMETHOD(void, forward_DCT, (j_compress_ptr cinfo,\n\t\t\t      jpeg_component_info * compptr,\n\t\t\t      JSAMPARRAY sample_data, JBLOCKROW coef_blocks,\n\t\t\t      JDIMENSION start_row, JDIMENSION start_col,\n\t\t\t      JDIMENSION num_blocks));\n};\n\n/* Entropy encoding */\nstruct jpeg_entropy_encoder {\n  JMETHOD(void, start_pass, (j_compress_ptr cinfo, boolean gather_statistics));\n  JMETHOD(boolean, encode_mcu, (j_compress_ptr cinfo, JBLOCKROW *MCU_data));\n  JMETHOD(void, finish_pass, (j_compress_ptr cinfo));\n};\n\n/* Marker writing */\nstruct jpeg_marker_writer {\n  JMETHOD(void, write_file_header, (j_compress_ptr cinfo));\n  JMETHOD(void, write_frame_header, (j_compress_ptr cinfo));\n  JMETHOD(void, write_scan_header, (j_compress_ptr cinfo));\n  JMETHOD(void, write_file_trailer, (j_compress_ptr cinfo));\n  JMETHOD(void, write_tables_only, (j_compress_ptr cinfo));\n  /* These routines are exported to allow insertion of extra markers */\n  /* Probably only COM and APPn markers should be written this way */\n  JMETHOD(void, write_marker_header, (j_compress_ptr cinfo, int marker,\n\t\t\t\t      unsigned int datalen));\n  JMETHOD(void, write_marker_byte, (j_compress_ptr cinfo, int val));\n};\n\n\n/* Declarations for decompression modules */\n\n/* Master control module */\nstruct jpeg_decomp_master {\n  JMETHOD(void, prepare_for_output_pass, (j_decompress_ptr cinfo));\n  JMETHOD(void, finish_output_pass, (j_decompress_ptr cinfo));\n\n  /* State variables made visible to other modules */\n  boolean is_dummy_pass;\t/* True during 1st pass for 2-pass quant */\n};\n\n/* Input control module */\nstruct jpeg_input_controller {\n  JMETHOD(int, consume_input, (j_decompress_ptr cinfo));\n  JMETHOD(void, reset_input_controller, (j_decompress_ptr cinfo));\n  JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));\n  JMETHOD(void, finish_input_pass, (j_decompress_ptr cinfo));\n\n  /* State variables made visible to other modules */\n  boolean has_multiple_scans;\t/* True if file has multiple scans */\n  boolean eoi_reached;\t\t/* True when EOI has been consumed */\n};\n\n/* Main buffer control (downsampled-data buffer) */\nstruct jpeg_d_main_controller {\n  JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));\n  JMETHOD(void, process_data, (j_decompress_ptr cinfo,\n\t\t\t       JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t\t\t       JDIMENSION out_rows_avail));\n};\n\n/* Coefficient buffer control */\nstruct jpeg_d_coef_controller {\n  JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));\n  JMETHOD(int, consume_data, (j_decompress_ptr cinfo));\n  JMETHOD(void, start_output_pass, (j_decompress_ptr cinfo));\n  JMETHOD(int, decompress_data, (j_decompress_ptr cinfo,\n\t\t\t\t JSAMPIMAGE output_buf));\n  /* Pointer to array of coefficient virtual arrays, or NULL if none */\n  jvirt_barray_ptr *coef_arrays;\n};\n\n/* Decompression postprocessing (color quantization buffer control) */\nstruct jpeg_d_post_controller {\n  JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));\n  JMETHOD(void, post_process_data, (j_decompress_ptr cinfo,\n\t\t\t\t    JSAMPIMAGE input_buf,\n\t\t\t\t    JDIMENSION *in_row_group_ctr,\n\t\t\t\t    JDIMENSION in_row_groups_avail,\n\t\t\t\t    JSAMPARRAY output_buf,\n\t\t\t\t    JDIMENSION *out_row_ctr,\n\t\t\t\t    JDIMENSION out_rows_avail));\n};\n\n/* Marker reading & parsing */\nstruct jpeg_marker_reader {\n  JMETHOD(void, reset_marker_reader, (j_decompress_ptr cinfo));\n  /* Read markers until SOS or EOI.\n   * Returns same codes as are defined for jpeg_consume_input:\n   * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.\n   */\n  JMETHOD(int, read_markers, (j_decompress_ptr cinfo));\n  /* Read a restart marker --- exported for use by entropy decoder only */\n  jpeg_marker_parser_method read_restart_marker;\n\n  /* State of marker reader --- nominally internal, but applications\n   * supplying COM or APPn handlers might like to know the state.\n   */\n  boolean saw_SOI;\t\t/* found SOI? */\n  boolean saw_SOF;\t\t/* found SOF? */\n  int next_restart_num;\t\t/* next restart number expected (0-7) */\n  unsigned int discarded_bytes;\t/* # of bytes skipped looking for a marker */\n};\n\n/* Entropy decoding */\nstruct jpeg_entropy_decoder {\n  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));\n  JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo,\n\t\t\t\tJBLOCKROW *MCU_data));\n\n  /* This is here to share code between baseline and progressive decoders; */\n  /* other modules probably should not use it */\n  boolean insufficient_data;\t/* set TRUE after emitting warning */\n};\n\n/* Inverse DCT (also performs dequantization) */\ntypedef JMETHOD(void, inverse_DCT_method_ptr,\n\t\t(j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\t JCOEFPTR coef_block,\n\t\t JSAMPARRAY output_buf, JDIMENSION output_col));\n\nstruct jpeg_inverse_dct {\n  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));\n  /* It is useful to allow each component to have a separate IDCT method. */\n  inverse_DCT_method_ptr inverse_DCT[MAX_COMPONENTS];\n};\n\n/* Upsampling (note that upsampler must also call color converter) */\nstruct jpeg_upsampler {\n  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));\n  JMETHOD(void, upsample, (j_decompress_ptr cinfo,\n\t\t\t   JSAMPIMAGE input_buf,\n\t\t\t   JDIMENSION *in_row_group_ctr,\n\t\t\t   JDIMENSION in_row_groups_avail,\n\t\t\t   JSAMPARRAY output_buf,\n\t\t\t   JDIMENSION *out_row_ctr,\n\t\t\t   JDIMENSION out_rows_avail));\n\n  boolean need_context_rows;\t/* TRUE if need rows above & below */\n};\n\n/* Colorspace conversion */\nstruct jpeg_color_deconverter {\n  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));\n  JMETHOD(void, color_convert, (j_decompress_ptr cinfo,\n\t\t\t\tJSAMPIMAGE input_buf, JDIMENSION input_row,\n\t\t\t\tJSAMPARRAY output_buf, int num_rows));\n};\n\n/* Color quantization or color precision reduction */\nstruct jpeg_color_quantizer {\n  JMETHOD(void, start_pass, (j_decompress_ptr cinfo, boolean is_pre_scan));\n  JMETHOD(void, color_quantize, (j_decompress_ptr cinfo,\n\t\t\t\t JSAMPARRAY input_buf, JSAMPARRAY output_buf,\n\t\t\t\t int num_rows));\n  JMETHOD(void, finish_pass, (j_decompress_ptr cinfo));\n  JMETHOD(void, new_color_map, (j_decompress_ptr cinfo));\n};\n\n\n/* Miscellaneous useful macros */\n\n#undef MAX\n#define MAX(a,b)\t((a) > (b) ? (a) : (b))\n#undef MIN\n#define MIN(a,b)\t((a) < (b) ? (a) : (b))\n\n\n/* We assume that right shift corresponds to signed division by 2 with\n * rounding towards minus infinity.  This is correct for typical \"arithmetic\n * shift\" instructions that shift in copies of the sign bit.  But some\n * C compilers implement >> with an unsigned shift.  For these machines you\n * must define RIGHT_SHIFT_IS_UNSIGNED.\n * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity.\n * It is only applied with constant shift counts.  SHIFT_TEMPS must be\n * included in the variables of any routine using RIGHT_SHIFT.\n */\n\n#ifdef RIGHT_SHIFT_IS_UNSIGNED\n#define SHIFT_TEMPS\tINT32 shift_temp;\n#define RIGHT_SHIFT(x,shft)  \\\n\t((shift_temp = (x)) < 0 ? \\\n\t (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \\\n\t (shift_temp >> (shft)))\n#else\n#define SHIFT_TEMPS\n#define RIGHT_SHIFT(x,shft)\t((x) >> (shft))\n#endif\n\n\n/* Short forms of external names for systems with brain-damaged linkers. */\n\n#ifdef NEED_SHORT_EXTERNAL_NAMES\n#define jinit_compress_master\tjICompress\n#define jinit_c_master_control\tjICMaster\n#define jinit_c_main_controller\tjICMainC\n#define jinit_c_prep_controller\tjICPrepC\n#define jinit_c_coef_controller\tjICCoefC\n#define jinit_color_converter\tjICColor\n#define jinit_downsampler\tjIDownsampler\n#define jinit_forward_dct\tjIFDCT\n#define jinit_huff_encoder\tjIHEncoder\n#define jinit_phuff_encoder\tjIPHEncoder\n#define jinit_marker_writer\tjIMWriter\n#define jinit_master_decompress\tjIDMaster\n#define jinit_d_main_controller\tjIDMainC\n#define jinit_d_coef_controller\tjIDCoefC\n#define jinit_d_post_controller\tjIDPostC\n#define jinit_input_controller\tjIInCtlr\n#define jinit_marker_reader\tjIMReader\n#define jinit_huff_decoder\tjIHDecoder\n#define jinit_phuff_decoder\tjIPHDecoder\n#define jinit_inverse_dct\tjIIDCT\n#define jinit_upsampler\t\tjIUpsampler\n#define jinit_color_deconverter\tjIDColor\n#define jinit_1pass_quantizer\tjI1Quant\n#define jinit_2pass_quantizer\tjI2Quant\n#define jinit_merged_upsampler\tjIMUpsampler\n#define jinit_memory_mgr\tjIMemMgr\n#define jdiv_round_up\t\tjDivRound\n#define jround_up\t\tjRound\n#define jcopy_sample_rows\tjCopySamples\n#define jcopy_block_row\t\tjCopyBlocks\n#define jzero_far\t\tjZeroFar\n#define jpeg_zigzag_order\tjZIGTable\n#define jpeg_natural_order\tjZAGTable\n#endif /* NEED_SHORT_EXTERNAL_NAMES */\n\n\n/* Compression module initialization routines */\nEXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo));\nEXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo,\n\t\t\t\t\t boolean transcode_only));\nEXTERN(void) jinit_c_main_controller JPP((j_compress_ptr cinfo,\n\t\t\t\t\t  boolean need_full_buffer));\nEXTERN(void) jinit_c_prep_controller JPP((j_compress_ptr cinfo,\n\t\t\t\t\t  boolean need_full_buffer));\nEXTERN(void) jinit_c_coef_controller JPP((j_compress_ptr cinfo,\n\t\t\t\t\t  boolean need_full_buffer));\nEXTERN(void) jinit_color_converter JPP((j_compress_ptr cinfo));\nEXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo));\nEXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo));\nEXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo));\nEXTERN(void) jinit_phuff_encoder JPP((j_compress_ptr cinfo));\nEXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo));\n/* Decompression module initialization routines */\nEXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_d_main_controller JPP((j_decompress_ptr cinfo,\n\t\t\t\t\t  boolean need_full_buffer));\nEXTERN(void) jinit_d_coef_controller JPP((j_decompress_ptr cinfo,\n\t\t\t\t\t  boolean need_full_buffer));\nEXTERN(void) jinit_d_post_controller JPP((j_decompress_ptr cinfo,\n\t\t\t\t\t  boolean need_full_buffer));\nEXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_phuff_decoder JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_1pass_quantizer JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_2pass_quantizer JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_merged_upsampler JPP((j_decompress_ptr cinfo));\n/* Memory manager initialization */\nEXTERN(void) jinit_memory_mgr JPP((j_common_ptr cinfo));\n\n/* Utility routines in jutils.c */\nEXTERN(long) jdiv_round_up JPP((long a, long b));\nEXTERN(long) jround_up JPP((long a, long b));\nEXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row,\n\t\t\t\t    JSAMPARRAY output_array, int dest_row,\n\t\t\t\t    int num_rows, JDIMENSION num_cols));\nEXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row,\n\t\t\t\t  JDIMENSION num_blocks));\nEXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero));\n/* Constant tables in jutils.c */\n#if 0\t\t\t\t/* This table is not actually needed in v6a */\nextern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */\n#endif\nextern const int jpeg_natural_order[]; /* zigzag coef order to natural order */\n\n/* Suppress undefined-structure complaints if necessary. */\n\n#ifdef INCOMPLETE_TYPES_BROKEN\n#ifndef AM_MEMORY_MANAGER\t/* only jmemmgr.c defines these */\nstruct jvirt_sarray_control { long dummy; };\nstruct jvirt_barray_control { long dummy; };\n#endif\n#endif /* INCOMPLETE_TYPES_BROKEN */\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/jpeglib.h",
    "content": "/*\n * jpeglib.h\n *\n * Copyright (C) 1991-1998, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file defines the application interface for the JPEG library.\n * Most applications using the library need only include this file,\n * and perhaps jerror.h if they want to know the exact error codes.\n */\n\n#ifndef JPEGLIB_H\n#define JPEGLIB_H\n\n#define FOXIT_PREFIX(origName)  FPDFAPIJPEG_##origName\n\n#define jcopy_block_row FOXIT_PREFIX(jcopy_block_row)\n#define jcopy_sample_rows FOXIT_PREFIX(jcopy_sample_rows)\n#define jdiv_round_up FOXIT_PREFIX(jdiv_round_up)\n#define jinit_1pass_quantizer FOXIT_PREFIX(jinit_1pass_quantizer)\n#define jinit_2pass_quantizer FOXIT_PREFIX(jinit_2pass_quantizer)\n#define jinit_color_deconverter FOXIT_PREFIX(jinit_color_deconverter)\n#define jinit_d_coef_controller FOXIT_PREFIX(jinit_d_coef_controller)\n#define jinit_d_main_controller FOXIT_PREFIX(jinit_d_main_controller)\n#define jinit_d_post_controller FOXIT_PREFIX(jinit_d_post_controller)\n#define jinit_huff_decoder FOXIT_PREFIX(jinit_huff_decoder)\n#define jinit_input_controller FOXIT_PREFIX(jinit_input_controller)\n#define jinit_inverse_dct FOXIT_PREFIX(jinit_inverse_dct)\n#define jinit_marker_reader FOXIT_PREFIX(jinit_marker_reader)\n#define jinit_master_decompress FOXIT_PREFIX(jinit_master_decompress)\n#define jinit_memory_mgr FOXIT_PREFIX(jinit_memory_mgr)\n#define jinit_merged_upsampler FOXIT_PREFIX(jinit_merged_upsampler)\n#define jinit_phuff_decoder FOXIT_PREFIX(jinit_phuff_decoder)\n#define jinit_upsampler FOXIT_PREFIX(jinit_upsampler)\n#define jpeg_CreateDecompress FOXIT_PREFIX(jpeg_CreateDecompress)\n#define jpeg_abort FOXIT_PREFIX(jpeg_abort)\n#define jpeg_abort_decompress FOXIT_PREFIX(jpeg_abort_decompress)\n#define jpeg_alloc_huff_table FOXIT_PREFIX(jpeg_alloc_huff_table)\n#define jpeg_alloc_quant_table FOXIT_PREFIX(jpeg_alloc_quant_table)\n#define jpeg_calc_output_dimensions FOXIT_PREFIX(jpeg_calc_output_dimensions)\n#define jpeg_consume_input FOXIT_PREFIX(jpeg_consume_input)\n#define jpeg_destroy FOXIT_PREFIX(jpeg_destroy)\n#define jpeg_destroy_decompress FOXIT_PREFIX(jpeg_destroy_decompress)\n#define jpeg_fill_bit_buffer FOXIT_PREFIX(jpeg_fill_bit_buffer)\n#define jpeg_finish_decompress FOXIT_PREFIX(jpeg_finish_decompress)\n#define jpeg_finish_output FOXIT_PREFIX(jpeg_finish_output)\n#define jpeg_free_large FOXIT_PREFIX(jpeg_free_large)\n#define jpeg_free_small FOXIT_PREFIX(jpeg_free_small)\n#define jpeg_get_large FOXIT_PREFIX(jpeg_get_large)\n#define jpeg_get_small FOXIT_PREFIX(jpeg_get_small)\n#define jpeg_has_multiple_scans FOXIT_PREFIX(jpeg_has_multiple_scans)\n#define jpeg_huff_decode FOXIT_PREFIX(jpeg_huff_decode)\n#define jpeg_idct_1x1 FOXIT_PREFIX(jpeg_idct_1x1)\n#define jpeg_idct_2x2 FOXIT_PREFIX(jpeg_idct_2x2)\n#define jpeg_idct_4x4 FOXIT_PREFIX(jpeg_idct_4x4)\n#define jpeg_idct_float FOXIT_PREFIX(jpeg_idct_float)\n#define jpeg_idct_ifast FOXIT_PREFIX(jpeg_idct_ifast)\n#define jpeg_idct_islow FOXIT_PREFIX(jpeg_idct_islow)\n#define jpeg_input_complete FOXIT_PREFIX(jpeg_input_complete)\n#define jpeg_make_d_derived_tbl FOXIT_PREFIX(jpeg_make_d_derived_tbl)\n#define jpeg_mem_available FOXIT_PREFIX(jpeg_mem_available)\n#define jpeg_mem_init FOXIT_PREFIX(jpeg_mem_init)\n#define jpeg_mem_term FOXIT_PREFIX(jpeg_mem_term)\n#define jpeg_natural_order FOXIT_PREFIX(jpeg_natural_order)\n#define jpeg_new_colormap FOXIT_PREFIX(jpeg_new_colormap)\n#define jpeg_open_backing_store FOXIT_PREFIX(jpeg_open_backing_store)\n#define jpeg_read_coefficients FOXIT_PREFIX(jpeg_read_coefficients)\n#define jpeg_read_header FOXIT_PREFIX(jpeg_read_header)\n#define jpeg_read_raw_data FOXIT_PREFIX(jpeg_read_raw_data)\n#define jpeg_read_scanlines FOXIT_PREFIX(jpeg_read_scanlines)\n#define jpeg_resync_to_restart FOXIT_PREFIX(jpeg_resync_to_restart)\n#define jpeg_save_markers FOXIT_PREFIX(jpeg_save_markers)\n#define jpeg_set_marker_processor FOXIT_PREFIX(jpeg_set_marker_processor)\n#define jpeg_start_decompress FOXIT_PREFIX(jpeg_start_decompress)\n#define jpeg_start_output FOXIT_PREFIX(jpeg_start_output)\n#define jpeg_std_error FOXIT_PREFIX(jpeg_std_error)\n#define jpeg_std_message_table FOXIT_PREFIX(jpeg_std_message_table)\n#define jpeg_stdio_src FOXIT_PREFIX(jpeg_stdio_src)\n#define jround_up FOXIT_PREFIX(jround_up)\n#define jzero_far FOXIT_PREFIX(jzero_far)\n\n /*\n * First we include the configuration files that record how this\n * installation of the JPEG library is set up.  jconfig.h can be\n * generated automatically for many systems.  jmorecfg.h contains\n * manual configuration options that most people need not worry about.\n */\n\n#ifndef JCONFIG_INCLUDED\t/* in case jinclude.h already did */\n#include \"jconfig.h\"\t\t/* widely used configuration options */\n#endif\n#include \"jmorecfg.h\"\t\t/* seldom changed options */\n\n\n/* Version ID for the JPEG library.\n * Might be useful for tests like \"#if JPEG_LIB_VERSION >= 60\".\n */\n\n#define JPEG_LIB_VERSION  62\t/* Version 6b */\n\n\n/* Various constants determining the sizes of things.\n * All of these are specified by the JPEG standard, so don't change them\n * if you want to be compatible.\n */\n\n#define DCTSIZE\t\t    8\t/* The basic DCT block is 8x8 samples */\n#define DCTSIZE2\t    64\t/* DCTSIZE squared; # of elements in a block */\n#define NUM_QUANT_TBLS      4\t/* Quantization tables are numbered 0..3 */\n#define NUM_HUFF_TBLS       4\t/* Huffman tables are numbered 0..3 */\n#define NUM_ARITH_TBLS      16\t/* Arith-coding tables are numbered 0..15 */\n#define MAX_COMPS_IN_SCAN   4\t/* JPEG limit on # of components in one scan */\n#define MAX_SAMP_FACTOR     4\t/* JPEG limit on sampling factors */\n/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard;\n * the PostScript DCT filter can emit files with many more than 10 blocks/MCU.\n * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU\n * to handle it.  We even let you do this from the jconfig.h file.  However,\n * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe\n * sometimes emits noncompliant files doesn't mean you should too.\n */\n#define C_MAX_BLOCKS_IN_MCU   10 /* compressor's limit on blocks per MCU */\n#ifndef D_MAX_BLOCKS_IN_MCU\n#define D_MAX_BLOCKS_IN_MCU   10 /* decompressor's limit on blocks per MCU */\n#endif\n\n\n/* Data structures for images (arrays of samples and of DCT coefficients).\n * On 80x86 machines, the image arrays are too big for near pointers,\n * but the pointer arrays can fit in near memory.\n */\n\ntypedef JSAMPLE  *JSAMPROW;\t/* ptr to one image row of pixel samples. */\ntypedef JSAMPROW *JSAMPARRAY;\t/* ptr to some rows (a 2-D sample array) */\ntypedef JSAMPARRAY *JSAMPIMAGE;\t/* a 3-D sample array: top index is color */\n\ntypedef JCOEF JBLOCK[DCTSIZE2];\t/* one block of coefficients */\ntypedef JBLOCK  *JBLOCKROW;\t/* pointer to one row of coefficient blocks */\ntypedef JBLOCKROW *JBLOCKARRAY;\t\t/* a 2-D array of coefficient blocks */\ntypedef JBLOCKARRAY *JBLOCKIMAGE;\t/* a 3-D array of coefficient blocks */\n\ntypedef JCOEF  *JCOEFPTR;\t/* useful in a couple of places */\n\n\n/* Types for JPEG compression parameters and working tables. */\n\n\n/* DCT coefficient quantization tables. */\n\ntypedef struct {\n  /* This array gives the coefficient quantizers in natural array order\n   * (not the zigzag order in which they are stored in a JPEG DQT marker).\n   * CAUTION: IJG versions prior to v6a kept this array in zigzag order.\n   */\n  UINT16 quantval[DCTSIZE2];\t/* quantization step for each coefficient */\n  /* This field is used only during compression.  It's initialized FALSE when\n   * the table is created, and set TRUE when it's been output to the file.\n   * You could suppress output of a table by setting this to TRUE.\n   * (See jpeg_suppress_tables for an example.)\n   */\n  boolean sent_table;\t\t/* TRUE when table has been output */\n} JQUANT_TBL;\n\n\n/* Huffman coding tables. */\n\ntypedef struct {\n  /* These two fields directly represent the contents of a JPEG DHT marker */\n  UINT8 bits[17];\t\t/* bits[k] = # of symbols with codes of */\n\t\t\t\t/* length k bits; bits[0] is unused */\n  UINT8 huffval[256];\t\t/* The symbols, in order of incr code length */\n  /* This field is used only during compression.  It's initialized FALSE when\n   * the table is created, and set TRUE when it's been output to the file.\n   * You could suppress output of a table by setting this to TRUE.\n   * (See jpeg_suppress_tables for an example.)\n   */\n  boolean sent_table;\t\t/* TRUE when table has been output */\n} JHUFF_TBL;\n\n\n/* Basic info about one component (color channel). */\n\ntypedef struct {\n  /* These values are fixed over the whole image. */\n  /* For compression, they must be supplied by parameter setup; */\n  /* for decompression, they are read from the SOF marker. */\n  int component_id;\t\t/* identifier for this component (0..255) */\n  int component_index;\t\t/* its index in SOF or cinfo->comp_info[] */\n  int h_samp_factor;\t\t/* horizontal sampling factor (1..4) */\n  int v_samp_factor;\t\t/* vertical sampling factor (1..4) */\n  int quant_tbl_no;\t\t/* quantization table selector (0..3) */\n  /* These values may vary between scans. */\n  /* For compression, they must be supplied by parameter setup; */\n  /* for decompression, they are read from the SOS marker. */\n  /* The decompressor output side may not use these variables. */\n  int dc_tbl_no;\t\t/* DC entropy table selector (0..3) */\n  int ac_tbl_no;\t\t/* AC entropy table selector (0..3) */\n  \n  /* Remaining fields should be treated as private by applications. */\n  \n  /* These values are computed during compression or decompression startup: */\n  /* Component's size in DCT blocks.\n   * Any dummy blocks added to complete an MCU are not counted; therefore\n   * these values do not depend on whether a scan is interleaved or not.\n   */\n  JDIMENSION width_in_blocks;\n  JDIMENSION height_in_blocks;\n  /* Size of a DCT block in samples.  Always DCTSIZE for compression.\n   * For decompression this is the size of the output from one DCT block,\n   * reflecting any scaling we choose to apply during the IDCT step.\n   * Values of 1,2,4,8 are likely to be supported.  Note that different\n   * components may receive different IDCT scalings.\n   */\n  int DCT_scaled_size;\n  /* The downsampled dimensions are the component's actual, unpadded number\n   * of samples at the main buffer (preprocessing/compression interface), thus\n   * downsampled_width = ceil(image_width * Hi/Hmax)\n   * and similarly for height.  For decompression, IDCT scaling is included, so\n   * downsampled_width = ceil(image_width * Hi/Hmax * DCT_scaled_size/DCTSIZE)\n   */\n  JDIMENSION downsampled_width;\t /* actual width in samples */\n  JDIMENSION downsampled_height; /* actual height in samples */\n  /* This flag is used only for decompression.  In cases where some of the\n   * components will be ignored (eg grayscale output from YCbCr image),\n   * we can skip most computations for the unused components.\n   */\n  boolean component_needed;\t/* do we need the value of this component? */\n\n  /* These values are computed before starting a scan of the component. */\n  /* The decompressor output side may not use these variables. */\n  int MCU_width;\t\t/* number of blocks per MCU, horizontally */\n  int MCU_height;\t\t/* number of blocks per MCU, vertically */\n  int MCU_blocks;\t\t/* MCU_width * MCU_height */\n  int MCU_sample_width;\t\t/* MCU width in samples, MCU_width*DCT_scaled_size */\n  int last_col_width;\t\t/* # of non-dummy blocks across in last MCU */\n  int last_row_height;\t\t/* # of non-dummy blocks down in last MCU */\n\n  /* Saved quantization table for component; NULL if none yet saved.\n   * See jdinput.c comments about the need for this information.\n   * This field is currently used only for decompression.\n   */\n  JQUANT_TBL * quant_table;\n\n  /* Private per-component storage for DCT or IDCT subsystem. */\n  void * dct_table;\n} jpeg_component_info;\n\n\n/* The script for encoding a multiple-scan file is an array of these: */\n\ntypedef struct {\n  int comps_in_scan;\t\t/* number of components encoded in this scan */\n  int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */\n  int Ss, Se;\t\t\t/* progressive JPEG spectral selection parms */\n  int Ah, Al;\t\t\t/* progressive JPEG successive approx. parms */\n} jpeg_scan_info;\n\n/* The decompressor can save APPn and COM markers in a list of these: */\n\ntypedef struct jpeg_marker_struct  * jpeg_saved_marker_ptr;\n\nstruct jpeg_marker_struct {\n  jpeg_saved_marker_ptr next;\t/* next in list, or NULL */\n  UINT8 marker;\t\t\t/* marker code: JPEG_COM, or JPEG_APP0+n */\n  unsigned int original_length;\t/* # bytes of data in the file */\n  unsigned int data_length;\t/* # bytes of data saved at data[] */\n  JOCTET  * data;\t\t/* the data contained in the marker */\n  /* the marker length word is not counted in data_length or original_length */\n};\n\n/* Known color spaces. */\n\ntypedef enum {\n\tJCS_UNKNOWN,\t\t/* error/unspecified */\n\tJCS_GRAYSCALE,\t\t/* monochrome */\n\tJCS_RGB,\t\t/* red/green/blue */\n\tJCS_YCbCr,\t\t/* Y/Cb/Cr (also known as YUV) */\n\tJCS_CMYK,\t\t/* C/M/Y/K */\n\tJCS_YCCK\t\t/* Y/Cb/Cr/K */\n} J_COLOR_SPACE;\n\n/* DCT/IDCT algorithm options. */\n\ntypedef enum {\n\tJDCT_ISLOW,\t\t/* slow but accurate integer algorithm */\n\tJDCT_IFAST,\t\t/* faster, less accurate integer method */\n\tJDCT_FLOAT\t\t/* floating-point: accurate, fast on fast HW */\n} J_DCT_METHOD;\n\n#ifndef JDCT_DEFAULT\t\t/* may be overridden in jconfig.h */\n#define JDCT_DEFAULT  JDCT_ISLOW\n#endif\n#ifndef JDCT_FASTEST\t\t/* may be overridden in jconfig.h */\n#define JDCT_FASTEST  JDCT_IFAST\n#endif\n\n/* Dithering options for decompression. */\n\ntypedef enum {\n\tJDITHER_NONE,\t\t/* no dithering */\n\tJDITHER_ORDERED,\t/* simple ordered dither */\n\tJDITHER_FS\t\t/* Floyd-Steinberg error diffusion dither */\n} J_DITHER_MODE;\n\n\n/* Common fields between JPEG compression and decompression master structs. */\n\n#define jpeg_common_fields \\\n  struct jpeg_error_mgr * err;\t/* Error handler module */\\\n  struct jpeg_memory_mgr * mem;\t/* Memory manager module */\\\n  struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\\\n  void * client_data;\t\t/* Available for use by application */\\\n  boolean is_decompressor;\t/* So common code can tell which is which */\\\n  int global_state\t\t/* For checking call sequence validity */\n\n/* Routines that are to be used by both halves of the library are declared\n * to receive a pointer to this structure.  There are no actual instances of\n * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct.\n */\nstruct jpeg_common_struct {\n  jpeg_common_fields;\t\t/* Fields common to both master struct types */\n  /* Additional fields follow in an actual jpeg_compress_struct or\n   * jpeg_decompress_struct.  All three structs must agree on these\n   * initial fields!  (This would be a lot cleaner in C++.)\n   */\n};\n\ntypedef struct jpeg_common_struct * j_common_ptr;\ntypedef struct jpeg_compress_struct * j_compress_ptr;\ntypedef struct jpeg_decompress_struct * j_decompress_ptr;\n\n\n/* Master record for a compression instance */\n\nstruct jpeg_compress_struct {\n  jpeg_common_fields;\t\t/* Fields shared with jpeg_decompress_struct */\n\n  /* Destination for compressed data */\n  struct jpeg_destination_mgr * dest;\n\n  /* Description of source image --- these fields must be filled in by\n   * outer application before starting compression.  in_color_space must\n   * be correct before you can even call jpeg_set_defaults().\n   */\n\n  JDIMENSION image_width;\t/* input image width */\n  JDIMENSION image_height;\t/* input image height */\n  int input_components;\t\t/* # of color components in input image */\n  J_COLOR_SPACE in_color_space;\t/* colorspace of input image */\n\n  double input_gamma;\t\t/* image gamma of input image */\n\n  /* Compression parameters --- these fields must be set before calling\n   * jpeg_start_compress().  We recommend calling jpeg_set_defaults() to\n   * initialize everything to reasonable defaults, then changing anything\n   * the application specifically wants to change.  That way you won't get\n   * burnt when new parameters are added.  Also note that there are several\n   * helper routines to simplify changing parameters.\n   */\n\n  int data_precision;\t\t/* bits of precision in image data */\n\n  int num_components;\t\t/* # of color components in JPEG image */\n  J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */\n\n  jpeg_component_info * comp_info;\n  /* comp_info[i] describes component that appears i'th in SOF */\n  \n  JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS];\n  /* ptrs to coefficient quantization tables, or NULL if not defined */\n  \n  JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];\n  JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];\n  /* ptrs to Huffman coding tables, or NULL if not defined */\n  \n  UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */\n  UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */\n  UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */\n\n  int num_scans;\t\t/* # of entries in scan_info array */\n  const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */\n  /* The default value of scan_info is NULL, which causes a single-scan\n   * sequential JPEG file to be emitted.  To create a multi-scan file,\n   * set num_scans and scan_info to point to an array of scan definitions.\n   */\n\n  boolean raw_data_in;\t\t/* TRUE=caller supplies downsampled data */\n  boolean arith_code;\t\t/* TRUE=arithmetic coding, FALSE=Huffman */\n  boolean optimize_coding;\t/* TRUE=optimize entropy encoding parms */\n  boolean CCIR601_sampling;\t/* TRUE=first samples are cosited */\n  int smoothing_factor;\t\t/* 1..100, or 0 for no input smoothing */\n  J_DCT_METHOD dct_method;\t/* DCT algorithm selector */\n\n  /* The restart interval can be specified in absolute MCUs by setting\n   * restart_interval, or in MCU rows by setting restart_in_rows\n   * (in which case the correct restart_interval will be figured\n   * for each scan).\n   */\n  unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */\n  int restart_in_rows;\t\t/* if > 0, MCU rows per restart interval */\n\n  /* Parameters controlling emission of special markers. */\n\n  boolean write_JFIF_header;\t/* should a JFIF marker be written? */\n  UINT8 JFIF_major_version;\t/* What to write for the JFIF version number */\n  UINT8 JFIF_minor_version;\n  /* These three values are not used by the JPEG code, merely copied */\n  /* into the JFIF APP0 marker.  density_unit can be 0 for unknown, */\n  /* 1 for dots/inch, or 2 for dots/cm.  Note that the pixel aspect */\n  /* ratio is defined by X_density/Y_density even when density_unit=0. */\n  UINT8 density_unit;\t\t/* JFIF code for pixel size units */\n  UINT16 X_density;\t\t/* Horizontal pixel density */\n  UINT16 Y_density;\t\t/* Vertical pixel density */\n  boolean write_Adobe_marker;\t/* should an Adobe marker be written? */\n  \n  /* State variable: index of next scanline to be written to\n   * jpeg_write_scanlines().  Application may use this to control its\n   * processing loop, e.g., \"while (next_scanline < image_height)\".\n   */\n\n  JDIMENSION next_scanline;\t/* 0 .. image_height-1  */\n\n  /* Remaining fields are known throughout compressor, but generally\n   * should not be touched by a surrounding application.\n   */\n\n  /*\n   * These fields are computed during compression startup\n   */\n  boolean progressive_mode;\t/* TRUE if scan script uses progressive mode */\n  int max_h_samp_factor;\t/* largest h_samp_factor */\n  int max_v_samp_factor;\t/* largest v_samp_factor */\n\n  JDIMENSION total_iMCU_rows;\t/* # of iMCU rows to be input to coef ctlr */\n  /* The coefficient controller receives data in units of MCU rows as defined\n   * for fully interleaved scans (whether the JPEG file is interleaved or not).\n   * There are v_samp_factor * DCTSIZE sample rows of each component in an\n   * \"iMCU\" (interleaved MCU) row.\n   */\n  \n  /*\n   * These fields are valid during any one scan.\n   * They describe the components and MCUs actually appearing in the scan.\n   */\n  int comps_in_scan;\t\t/* # of JPEG components in this scan */\n  jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];\n  /* *cur_comp_info[i] describes component that appears i'th in SOS */\n  \n  JDIMENSION MCUs_per_row;\t/* # of MCUs across the image */\n  JDIMENSION MCU_rows_in_scan;\t/* # of MCU rows in the image */\n  \n  int blocks_in_MCU;\t\t/* # of DCT blocks per MCU */\n  int MCU_membership[C_MAX_BLOCKS_IN_MCU];\n  /* MCU_membership[i] is index in cur_comp_info of component owning */\n  /* i'th block in an MCU */\n\n  int Ss, Se, Ah, Al;\t\t/* progressive JPEG parameters for scan */\n\n  /*\n   * Links to compression subobjects (methods and private variables of modules)\n   */\n  struct jpeg_comp_master * master;\n  struct jpeg_c_main_controller * main;\n  struct jpeg_c_prep_controller * prep;\n  struct jpeg_c_coef_controller * coef;\n  struct jpeg_marker_writer * marker;\n  struct jpeg_color_converter * cconvert;\n  struct jpeg_downsampler * downsample;\n  struct jpeg_forward_dct * fdct;\n  struct jpeg_entropy_encoder * entropy;\n  jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */\n  int script_space_size;\n};\n\n\n/* Master record for a decompression instance */\n\nstruct jpeg_decompress_struct {\n  jpeg_common_fields;\t\t/* Fields shared with jpeg_compress_struct */\n\n  /* Source of compressed data */\n  struct jpeg_source_mgr * src;\n\n  /* Basic description of image --- filled in by jpeg_read_header(). */\n  /* Application may inspect these values to decide how to process image. */\n\n  JDIMENSION image_width;\t/* nominal image width (from SOF marker) */\n  JDIMENSION image_height;\t/* nominal image height */\n  int num_components;\t\t/* # of color components in JPEG image */\n  J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */\n\n  /* Decompression processing parameters --- these fields must be set before\n   * calling jpeg_start_decompress().  Note that jpeg_read_header() initializes\n   * them to default values.\n   */\n\n  J_COLOR_SPACE out_color_space; /* colorspace for output */\n\n  unsigned int scale_num, scale_denom; /* fraction by which to scale image */\n\n  double output_gamma;\t\t/* image gamma wanted in output */\n\n  boolean buffered_image;\t/* TRUE=multiple output passes */\n  boolean raw_data_out;\t\t/* TRUE=downsampled data wanted */\n\n  J_DCT_METHOD dct_method;\t/* IDCT algorithm selector */\n  boolean do_fancy_upsampling;\t/* TRUE=apply fancy upsampling */\n  boolean do_block_smoothing;\t/* TRUE=apply interblock smoothing */\n\n  boolean quantize_colors;\t/* TRUE=colormapped output wanted */\n  /* the following are ignored if not quantize_colors: */\n  J_DITHER_MODE dither_mode;\t/* type of color dithering to use */\n  boolean two_pass_quantize;\t/* TRUE=use two-pass color quantization */\n  int desired_number_of_colors;\t/* max # colors to use in created colormap */\n  /* these are significant only in buffered-image mode: */\n  boolean enable_1pass_quant;\t/* enable future use of 1-pass quantizer */\n  boolean enable_external_quant;/* enable future use of external colormap */\n  boolean enable_2pass_quant;\t/* enable future use of 2-pass quantizer */\n\n  /* Description of actual output image that will be returned to application.\n   * These fields are computed by jpeg_start_decompress().\n   * You can also use jpeg_calc_output_dimensions() to determine these values\n   * in advance of calling jpeg_start_decompress().\n   */\n\n  JDIMENSION output_width;\t/* scaled image width */\n  JDIMENSION output_height;\t/* scaled image height */\n  int out_color_components;\t/* # of color components in out_color_space */\n  int output_components;\t/* # of color components returned */\n  /* output_components is 1 (a colormap index) when quantizing colors;\n   * otherwise it equals out_color_components.\n   */\n  int rec_outbuf_height;\t/* min recommended height of scanline buffer */\n  /* If the buffer passed to jpeg_read_scanlines() is less than this many rows\n   * high, space and time will be wasted due to unnecessary data copying.\n   * Usually rec_outbuf_height will be 1 or 2, at most 4.\n   */\n\n  /* When quantizing colors, the output colormap is described by these fields.\n   * The application can supply a colormap by setting colormap non-NULL before\n   * calling jpeg_start_decompress; otherwise a colormap is created during\n   * jpeg_start_decompress or jpeg_start_output.\n   * The map has out_color_components rows and actual_number_of_colors columns.\n   */\n  int actual_number_of_colors;\t/* number of entries in use */\n  JSAMPARRAY colormap;\t\t/* The color map as a 2-D pixel array */\n\n  /* State variables: these variables indicate the progress of decompression.\n   * The application may examine these but must not modify them.\n   */\n\n  /* Row index of next scanline to be read from jpeg_read_scanlines().\n   * Application may use this to control its processing loop, e.g.,\n   * \"while (output_scanline < output_height)\".\n   */\n  JDIMENSION output_scanline;\t/* 0 .. output_height-1  */\n\n  /* Current input scan number and number of iMCU rows completed in scan.\n   * These indicate the progress of the decompressor input side.\n   */\n  int input_scan_number;\t/* Number of SOS markers seen so far */\n  JDIMENSION input_iMCU_row;\t/* Number of iMCU rows completed */\n\n  /* The \"output scan number\" is the notional scan being displayed by the\n   * output side.  The decompressor will not allow output scan/row number\n   * to get ahead of input scan/row, but it can fall arbitrarily far behind.\n   */\n  int output_scan_number;\t/* Nominal scan number being displayed */\n  JDIMENSION output_iMCU_row;\t/* Number of iMCU rows read */\n\n  /* Current progression status.  coef_bits[c][i] indicates the precision\n   * with which component c's DCT coefficient i (in zigzag order) is known.\n   * It is -1 when no data has yet been received, otherwise it is the point\n   * transform (shift) value for the most recent scan of the coefficient\n   * (thus, 0 at completion of the progression).\n   * This pointer is NULL when reading a non-progressive file.\n   */\n  int (*coef_bits)[DCTSIZE2];\t/* -1 or current Al value for each coef */\n\n  /* Internal JPEG parameters --- the application usually need not look at\n   * these fields.  Note that the decompressor output side may not use\n   * any parameters that can change between scans.\n   */\n\n  /* Quantization and Huffman tables are carried forward across input\n   * datastreams when processing abbreviated JPEG datastreams.\n   */\n\n  JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS];\n  /* ptrs to coefficient quantization tables, or NULL if not defined */\n\n  JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];\n  JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];\n  /* ptrs to Huffman coding tables, or NULL if not defined */\n\n  /* These parameters are never carried across datastreams, since they\n   * are given in SOF/SOS markers or defined to be reset by SOI.\n   */\n\n  int data_precision;\t\t/* bits of precision in image data */\n\n  jpeg_component_info * comp_info;\n  /* comp_info[i] describes component that appears i'th in SOF */\n\n  boolean progressive_mode;\t/* TRUE if SOFn specifies progressive mode */\n  boolean arith_code;\t\t/* TRUE=arithmetic coding, FALSE=Huffman */\n\n  UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */\n  UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */\n  UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */\n\n  unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */\n\n  /* These fields record data obtained from optional markers recognized by\n   * the JPEG library.\n   */\n  boolean saw_JFIF_marker;\t/* TRUE iff a JFIF APP0 marker was found */\n  /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */\n  UINT8 JFIF_major_version;\t/* JFIF version number */\n  UINT8 JFIF_minor_version;\n  UINT8 density_unit;\t\t/* JFIF code for pixel size units */\n  UINT16 X_density;\t\t/* Horizontal pixel density */\n  UINT16 Y_density;\t\t/* Vertical pixel density */\n  boolean saw_Adobe_marker;\t/* TRUE iff an Adobe APP14 marker was found */\n  UINT8 Adobe_transform;\t/* Color transform code from Adobe marker */\n\n  boolean CCIR601_sampling;\t/* TRUE=first samples are cosited */\n\n  /* Aside from the specific data retained from APPn markers known to the\n   * library, the uninterpreted contents of any or all APPn and COM markers\n   * can be saved in a list for examination by the application.\n   */\n  jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */\n\n  /* Remaining fields are known throughout decompressor, but generally\n   * should not be touched by a surrounding application.\n   */\n\n  /*\n   * These fields are computed during decompression startup\n   */\n  int max_h_samp_factor;\t/* largest h_samp_factor */\n  int max_v_samp_factor;\t/* largest v_samp_factor */\n\n  int min_DCT_scaled_size;\t/* smallest DCT_scaled_size of any component */\n\n  JDIMENSION total_iMCU_rows;\t/* # of iMCU rows in image */\n  /* The coefficient controller's input and output progress is measured in\n   * units of \"iMCU\" (interleaved MCU) rows.  These are the same as MCU rows\n   * in fully interleaved JPEG scans, but are used whether the scan is\n   * interleaved or not.  We define an iMCU row as v_samp_factor DCT block\n   * rows of each component.  Therefore, the IDCT output contains\n   * v_samp_factor*DCT_scaled_size sample rows of a component per iMCU row.\n   */\n\n  JSAMPLE * sample_range_limit; /* table for fast range-limiting */\n\n  /*\n   * These fields are valid during any one scan.\n   * They describe the components and MCUs actually appearing in the scan.\n   * Note that the decompressor output side must not use these fields.\n   */\n  int comps_in_scan;\t\t/* # of JPEG components in this scan */\n  jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];\n  /* *cur_comp_info[i] describes component that appears i'th in SOS */\n\n  JDIMENSION MCUs_per_row;\t/* # of MCUs across the image */\n  JDIMENSION MCU_rows_in_scan;\t/* # of MCU rows in the image */\n\n  int blocks_in_MCU;\t\t/* # of DCT blocks per MCU */\n  int MCU_membership[D_MAX_BLOCKS_IN_MCU];\n  /* MCU_membership[i] is index in cur_comp_info of component owning */\n  /* i'th block in an MCU */\n\n  int Ss, Se, Ah, Al;\t\t/* progressive JPEG parameters for scan */\n\n  /* This field is shared between entropy decoder and marker parser.\n   * It is either zero or the code of a JPEG marker that has been\n   * read from the data source, but has not yet been processed.\n   */\n  int unread_marker;\n\n  /*\n   * Links to decompression subobjects (methods, private variables of modules)\n   */\n  struct jpeg_decomp_master * master;\n  struct jpeg_d_main_controller * main;\n  struct jpeg_d_coef_controller * coef;\n  struct jpeg_d_post_controller * post;\n  struct jpeg_input_controller * inputctl;\n  struct jpeg_marker_reader * marker;\n  struct jpeg_entropy_decoder * entropy;\n  struct jpeg_inverse_dct * idct;\n  struct jpeg_upsampler * upsample;\n  struct jpeg_color_deconverter * cconvert;\n  struct jpeg_color_quantizer * cquantize;\n};\n\n\n/* \"Object\" declarations for JPEG modules that may be supplied or called\n * directly by the surrounding application.\n * As with all objects in the JPEG library, these structs only define the\n * publicly visible methods and state variables of a module.  Additional\n * private fields may exist after the public ones.\n */\n\n\n/* Error handler object */\n\nstruct jpeg_error_mgr {\n  /* Error exit handler: does not return to caller */\n  JMETHOD(void, error_exit, (j_common_ptr cinfo));\n  /* Conditionally emit a trace or warning message */\n  JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level));\n  /* Routine that actually outputs a trace or error message */\n  JMETHOD(void, output_message, (j_common_ptr cinfo));\n  /* Format a message string for the most recent JPEG error or message */\n  JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer));\n#define JMSG_LENGTH_MAX  200\t/* recommended size of format_message buffer */\n  /* Reset error state variables at start of a new image */\n  JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo));\n  \n  /* The message ID code and any parameters are saved here.\n   * A message can have one string parameter or up to 8 int parameters.\n   */\n  int msg_code;\n#define JMSG_STR_PARM_MAX  80\n  union {\n    int i[8];\n    char s[JMSG_STR_PARM_MAX];\n  } msg_parm;\n  \n  /* Standard state variables for error facility */\n  \n  int trace_level;\t\t/* max msg_level that will be displayed */\n  \n  /* For recoverable corrupt-data errors, we emit a warning message,\n   * but keep going unless emit_message chooses to abort.  emit_message\n   * should count warnings in num_warnings.  The surrounding application\n   * can check for bad data by seeing if num_warnings is nonzero at the\n   * end of processing.\n   */\n  long num_warnings;\t\t/* number of corrupt-data warnings */\n\n  /* These fields point to the table(s) of error message strings.\n   * An application can change the table pointer to switch to a different\n   * message list (typically, to change the language in which errors are\n   * reported).  Some applications may wish to add additional error codes\n   * that will be handled by the JPEG library error mechanism; the second\n   * table pointer is used for this purpose.\n   *\n   * First table includes all errors generated by JPEG library itself.\n   * Error code 0 is reserved for a \"no such error string\" message.\n   */\n  const char * const * jpeg_message_table; /* Library errors */\n  int last_jpeg_message;    /* Table contains strings 0..last_jpeg_message */\n  /* Second table can be added by application (see cjpeg/djpeg for example).\n   * It contains strings numbered first_addon_message..last_addon_message.\n   */\n  const char * const * addon_message_table; /* Non-library errors */\n  int first_addon_message;\t/* code for first string in addon table */\n  int last_addon_message;\t/* code for last string in addon table */\n};\n\n\n/* Progress monitor object */\n\nstruct jpeg_progress_mgr {\n  JMETHOD(void, progress_monitor, (j_common_ptr cinfo));\n\n  long pass_counter;\t\t/* work units completed in this pass */\n  long pass_limit;\t\t/* total number of work units in this pass */\n  int completed_passes;\t\t/* passes completed so far */\n  int total_passes;\t\t/* total number of passes expected */\n};\n\n\n/* Data destination object for compression */\n\nstruct jpeg_destination_mgr {\n  JOCTET * next_output_byte;\t/* => next byte to write in buffer */\n  size_t free_in_buffer;\t/* # of byte spaces remaining in buffer */\n\n  JMETHOD(void, init_destination, (j_compress_ptr cinfo));\n  JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo));\n  JMETHOD(void, term_destination, (j_compress_ptr cinfo));\n};\n\n\n/* Data source object for decompression */\n\nstruct jpeg_source_mgr {\n  const JOCTET * next_input_byte; /* => next byte to read from buffer */\n  size_t bytes_in_buffer;\t/* # of bytes remaining in buffer */\n\n  JMETHOD(void, init_source, (j_decompress_ptr cinfo));\n  JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo));\n  JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes));\n  JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired));\n  JMETHOD(void, term_source, (j_decompress_ptr cinfo));\n};\n\n\n/* Memory manager object.\n * Allocates \"small\" objects (a few K total), \"large\" objects (tens of K),\n * and \"really big\" objects (virtual arrays with backing store if needed).\n * The memory manager does not allow individual objects to be freed; rather,\n * each created object is assigned to a pool, and whole pools can be freed\n * at once.  This is faster and more convenient than remembering exactly what\n * to free, especially where malloc()/free() are not too speedy.\n * NB: alloc routines never return NULL.  They exit to error_exit if not\n * successful.\n */\n\n#define JPOOL_PERMANENT\t0\t/* lasts until master record is destroyed */\n#define JPOOL_IMAGE\t1\t/* lasts until done with image/datastream */\n#define JPOOL_NUMPOOLS\t2\n\ntypedef struct jvirt_sarray_control * jvirt_sarray_ptr;\ntypedef struct jvirt_barray_control * jvirt_barray_ptr;\n\n\nstruct jpeg_memory_mgr {\n  /* Method pointers */\n  JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id,\n\t\t\t\tsize_t sizeofobject));\n  JMETHOD(void  *, alloc_large, (j_common_ptr cinfo, int pool_id,\n\t\t\t\t     size_t sizeofobject));\n  JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id,\n\t\t\t\t     JDIMENSION samplesperrow,\n\t\t\t\t     JDIMENSION numrows));\n  JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id,\n\t\t\t\t      JDIMENSION blocksperrow,\n\t\t\t\t      JDIMENSION numrows));\n  JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo,\n\t\t\t\t\t\t  int pool_id,\n\t\t\t\t\t\t  boolean pre_zero,\n\t\t\t\t\t\t  JDIMENSION samplesperrow,\n\t\t\t\t\t\t  JDIMENSION numrows,\n\t\t\t\t\t\t  JDIMENSION maxaccess));\n  JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo,\n\t\t\t\t\t\t  int pool_id,\n\t\t\t\t\t\t  boolean pre_zero,\n\t\t\t\t\t\t  JDIMENSION blocksperrow,\n\t\t\t\t\t\t  JDIMENSION numrows,\n\t\t\t\t\t\t  JDIMENSION maxaccess));\n  JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo));\n  JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo,\n\t\t\t\t\t   jvirt_sarray_ptr ptr,\n\t\t\t\t\t   JDIMENSION start_row,\n\t\t\t\t\t   JDIMENSION num_rows,\n\t\t\t\t\t   boolean writable));\n  JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo,\n\t\t\t\t\t    jvirt_barray_ptr ptr,\n\t\t\t\t\t    JDIMENSION start_row,\n\t\t\t\t\t    JDIMENSION num_rows,\n\t\t\t\t\t    boolean writable));\n  JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id));\n  JMETHOD(void, self_destruct, (j_common_ptr cinfo));\n\n  /* Limit on memory allocation for this JPEG object.  (Note that this is\n   * merely advisory, not a guaranteed maximum; it only affects the space\n   * used for virtual-array buffers.)  May be changed by outer application\n   * after creating the JPEG object.\n   */\n  long max_memory_to_use;\n\n  /* Maximum allocation request accepted by alloc_large. */\n  long max_alloc_chunk;\n};\n\n\n/* Routine signature for application-supplied marker processing methods.\n * Need not pass marker code since it is stored in cinfo->unread_marker.\n */\ntypedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo));\n\n\n/* Declarations for routines called by application.\n * The JPP macro hides prototype parameters from compilers that can't cope.\n * Note JPP requires double parentheses.\n */\n\n#ifdef HAVE_PROTOTYPES\n#define JPP(arglist)\targlist\n#else\n#define JPP(arglist)\t()\n#endif\n\n\n/* Short forms of external names for systems with brain-damaged linkers.\n * We shorten external names to be unique in the first six letters, which\n * is good enough for all known systems.\n * (If your compiler itself needs names to be unique in less than 15 \n * characters, you are out of luck.  Get a better compiler.)\n */\n\n#ifdef NEED_SHORT_EXTERNAL_NAMES\n#define jpeg_std_error\t\tjStdError\n#define jpeg_CreateCompress\tjCreaCompress\n#define jpeg_CreateDecompress\tjCreaDecompress\n#define jpeg_destroy_compress\tjDestCompress\n#define jpeg_destroy_decompress\tjDestDecompress\n#define jpeg_stdio_dest\t\tjStdDest\n#define jpeg_stdio_src\t\tjStdSrc\n#define jpeg_set_defaults\tjSetDefaults\n#define jpeg_set_colorspace\tjSetColorspace\n#define jpeg_default_colorspace\tjDefColorspace\n#define jpeg_set_quality\tjSetQuality\n#define jpeg_set_linear_quality\tjSetLQuality\n#define jpeg_add_quant_table\tjAddQuantTable\n#define jpeg_quality_scaling\tjQualityScaling\n#define jpeg_simple_progression\tjSimProgress\n#define jpeg_suppress_tables\tjSuppressTables\n#define jpeg_alloc_quant_table\tjAlcQTable\n#define jpeg_alloc_huff_table\tjAlcHTable\n#define jpeg_start_compress\tjStrtCompress\n#define jpeg_write_scanlines\tjWrtScanlines\n#define jpeg_finish_compress\tjFinCompress\n#define jpeg_write_raw_data\tjWrtRawData\n#define jpeg_write_marker\tjWrtMarker\n#define jpeg_write_m_header\tjWrtMHeader\n#define jpeg_write_m_byte\tjWrtMByte\n#define jpeg_write_tables\tjWrtTables\n#define jpeg_read_header\tjReadHeader\n#define jpeg_start_decompress\tjStrtDecompress\n#define jpeg_read_scanlines\tjReadScanlines\n#define jpeg_finish_decompress\tjFinDecompress\n#define jpeg_read_raw_data\tjReadRawData\n#define jpeg_has_multiple_scans\tjHasMultScn\n#define jpeg_start_output\tjStrtOutput\n#define jpeg_finish_output\tjFinOutput\n#define jpeg_input_complete\tjInComplete\n#define jpeg_new_colormap\tjNewCMap\n#define jpeg_consume_input\tjConsumeInput\n#define jpeg_calc_output_dimensions\tjCalcDimensions\n#define jpeg_save_markers\tjSaveMarkers\n#define jpeg_set_marker_processor\tjSetMarker\n#define jpeg_read_coefficients\tjReadCoefs\n#define jpeg_write_coefficients\tjWrtCoefs\n#define jpeg_copy_critical_parameters\tjCopyCrit\n#define jpeg_abort_compress\tjAbrtCompress\n#define jpeg_abort_decompress\tjAbrtDecompress\n#define jpeg_abort\t\tjAbort\n#define jpeg_destroy\t\tjDestroy\n#define jpeg_resync_to_restart\tjResyncRestart\n#endif /* NEED_SHORT_EXTERNAL_NAMES */\n\n\n/* Default error-management setup */\nEXTERN(struct jpeg_error_mgr *) jpeg_std_error\n\tJPP((struct jpeg_error_mgr * err));\n\n/* Initialization of JPEG compression objects.\n * jpeg_create_compress() and jpeg_create_decompress() are the exported\n * names that applications should call.  These expand to calls on\n * jpeg_CreateCompress and jpeg_CreateDecompress with additional information\n * passed for version mismatch checking.\n * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx.\n */\n#define jpeg_create_compress(cinfo) \\\n    jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \\\n\t\t\t(size_t) sizeof(struct jpeg_compress_struct))\n#define jpeg_create_decompress(cinfo) \\\n    jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \\\n\t\t\t  (size_t) sizeof(struct jpeg_decompress_struct))\nEXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo,\n\t\t\t\t      int version, size_t structsize));\nEXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo,\n\t\t\t\t\tint version, size_t structsize));\n/* Destruction of JPEG compression objects */\nEXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo));\nEXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo));\n\n#if 0\n/* Standard data source and destination managers: stdio streams. */\n/* Caller is responsible for opening the file before and closing after. */\nEXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FXSYS_FILE * outfile));\nEXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FXSYS_FILE * infile));\n#endif\n\n/* Default parameter setup for compression */\nEXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo));\n/* Compression parameter setup aids */\nEXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo,\n\t\t\t\t      J_COLOR_SPACE colorspace));\nEXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo));\nEXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality,\n\t\t\t\t   boolean force_baseline));\nEXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo,\n\t\t\t\t\t  int scale_factor,\n\t\t\t\t\t  boolean force_baseline));\nEXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl,\n\t\t\t\t       const unsigned int *basic_table,\n\t\t\t\t       int scale_factor,\n\t\t\t\t       boolean force_baseline));\nEXTERN(int) jpeg_quality_scaling JPP((int quality));\nEXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo));\nEXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo,\n\t\t\t\t       boolean suppress));\nEXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo));\nEXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo));\n\n/* Main entry points for compression */\nEXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo,\n\t\t\t\t      boolean write_all_tables));\nEXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo,\n\t\t\t\t\t     JSAMPARRAY scanlines,\n\t\t\t\t\t     JDIMENSION num_lines));\nEXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo));\n\n/* Replaces jpeg_write_scanlines when writing raw downsampled data. */\nEXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo,\n\t\t\t\t\t    JSAMPIMAGE data,\n\t\t\t\t\t    JDIMENSION num_lines));\n\n/* Write a special marker.  See libjpeg.doc concerning safe usage. */\nEXTERN(void) jpeg_write_marker\n\tJPP((j_compress_ptr cinfo, int marker,\n\t     const JOCTET * dataptr, unsigned int datalen));\n/* Same, but piecemeal. */\nEXTERN(void) jpeg_write_m_header\n\tJPP((j_compress_ptr cinfo, int marker, unsigned int datalen));\nEXTERN(void) jpeg_write_m_byte\n\tJPP((j_compress_ptr cinfo, int val));\n\n/* Alternate compression function: just write an abbreviated table file */\nEXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo));\n\n/* Decompression startup: read start of JPEG datastream to see what's there */\nEXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo,\n\t\t\t\t  boolean require_image));\n/* Return value is one of: */\n#define JPEG_SUSPENDED\t\t0 /* Suspended due to lack of input data */\n#define JPEG_HEADER_OK\t\t1 /* Found valid image datastream */\n#define JPEG_HEADER_TABLES_ONLY\t2 /* Found valid table-specs-only datastream */\n/* If you pass require_image = TRUE (normal case), you need not check for\n * a TABLES_ONLY return code; an abbreviated file will cause an error exit.\n * JPEG_SUSPENDED is only possible if you use a data source module that can\n * give a suspension return (the stdio source module doesn't).\n */\n\n/* Main entry points for decompression */\nEXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo));\nEXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo,\n\t\t\t\t\t    JSAMPARRAY scanlines,\n\t\t\t\t\t    JDIMENSION max_lines));\nEXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo));\n\n/* Replaces jpeg_read_scanlines when reading raw downsampled data. */\nEXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo,\n\t\t\t\t\t   JSAMPIMAGE data,\n\t\t\t\t\t   JDIMENSION max_lines));\n\n/* Additional entry points for buffered-image mode. */\nEXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo));\nEXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo,\n\t\t\t\t       int scan_number));\nEXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo));\nEXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo));\nEXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo));\nEXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo));\n/* Return value is one of: */\n/* #define JPEG_SUSPENDED\t0    Suspended due to lack of input data */\n#define JPEG_REACHED_SOS\t1 /* Reached start of new scan */\n#define JPEG_REACHED_EOI\t2 /* Reached end of image */\n#define JPEG_ROW_COMPLETED\t3 /* Completed one iMCU row */\n#define JPEG_SCAN_COMPLETED\t4 /* Completed last iMCU row of a scan */\n\n/* Precalculate output dimensions for current decompression parameters. */\nEXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo));\n\n/* Control saving of COM and APPn markers into marker_list. */\nEXTERN(void) jpeg_save_markers\n\tJPP((j_decompress_ptr cinfo, int marker_code,\n\t     unsigned int length_limit));\n\n/* Install a special processing method for COM or APPn markers. */\nEXTERN(void) jpeg_set_marker_processor\n\tJPP((j_decompress_ptr cinfo, int marker_code,\n\t     jpeg_marker_parser_method routine));\n\n/* Read or write raw DCT coefficients --- useful for lossless transcoding. */\nEXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo));\nEXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo,\n\t\t\t\t\t  jvirt_barray_ptr * coef_arrays));\nEXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo,\n\t\t\t\t\t\tj_compress_ptr dstinfo));\n\n/* If you choose to abort compression or decompression before completing\n * jpeg_finish_(de)compress, then you need to clean up to release memory,\n * temporary files, etc.  You can just call jpeg_destroy_(de)compress\n * if you're done with the JPEG object, but if you want to clean it up and\n * reuse it, call this:\n */\nEXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo));\nEXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo));\n\n/* Generic versions of jpeg_abort and jpeg_destroy that work on either\n * flavor of JPEG object.  These may be more convenient in some places.\n */\nEXTERN(void) jpeg_abort JPP((j_common_ptr cinfo));\nEXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo));\n\n/* Default restart-marker-resync procedure for use by data source modules */\nEXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo,\n\t\t\t\t\t    int desired));\n\n\n/* These marker codes are exported since applications and data source modules\n * are likely to want to use them.\n */\n\n#define JPEG_RST0\t0xD0\t/* RST0 marker code */\n#define JPEG_EOI\t0xD9\t/* EOI marker code */\n#define JPEG_APP0\t0xE0\t/* APP0 marker code */\n#define JPEG_COM\t0xFE\t/* COM marker code */\n\n\n/* If we have a brain-damaged compiler that emits warnings (or worse, errors)\n * for structure definitions that are never filled in, keep it quiet by\n * supplying dummy definitions for the various substructures.\n */\n\n#ifdef INCOMPLETE_TYPES_BROKEN\n#ifndef JPEG_INTERNALS\t\t/* will be defined in jpegint.h */\nstruct jvirt_sarray_control { long dummy; };\nstruct jvirt_barray_control { long dummy; };\nstruct jpeg_comp_master { long dummy; };\nstruct jpeg_c_main_controller { long dummy; };\nstruct jpeg_c_prep_controller { long dummy; };\nstruct jpeg_c_coef_controller { long dummy; };\nstruct jpeg_marker_writer { long dummy; };\nstruct jpeg_color_converter { long dummy; };\nstruct jpeg_downsampler { long dummy; };\nstruct jpeg_forward_dct { long dummy; };\nstruct jpeg_entropy_encoder { long dummy; };\nstruct jpeg_decomp_master { long dummy; };\nstruct jpeg_d_main_controller { long dummy; };\nstruct jpeg_d_coef_controller { long dummy; };\nstruct jpeg_d_post_controller { long dummy; };\nstruct jpeg_input_controller { long dummy; };\nstruct jpeg_marker_reader { long dummy; };\nstruct jpeg_entropy_decoder { long dummy; };\nstruct jpeg_inverse_dct { long dummy; };\nstruct jpeg_upsampler { long dummy; };\nstruct jpeg_color_deconverter { long dummy; };\nstruct jpeg_color_quantizer { long dummy; };\n#endif /* JPEG_INTERNALS */\n#endif /* INCOMPLETE_TYPES_BROKEN */\n\n\n/*\n * The JPEG library modules define JPEG_INTERNALS before including this file.\n * The internal structure declarations are read only when that is true.\n * Applications using the library should not include jpegint.h, but may wish\n * to include jerror.h.\n */\n\n#ifdef JPEG_INTERNALS\n#include \"jpegint.h\"\t\t/* fetch private declarations */\n#include \"jerror.h\"\t\t/* fetch error codes too */\n#endif\n\n#endif /* JPEGLIB_H */\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/jversion.h",
    "content": "/*\n * jversion.h\n *\n * Copyright (C) 1991-1998, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains software version identification.\n */\n\n\n#define JVERSION\t\"6b  27-Mar-1998\"\n\n#define JCOPYRIGHT\t\"Copyright (C) 1998, Thomas G. Lane\"\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/makefile",
    "content": "sources = fpdfapi_jcapimin.c fpdfapi_jcapistd.c fpdfapi_jccoefct.c fpdfapi_jccolor.c fpdfapi_jcdctmgr.c fpdfapi_jchuff.c fpdfapi_jcinit.c fpdfapi_jcmainct.c fpdfapi_jcmarker.c fpdfapi_jcmaster.c \\\n\tfpdfapi_jcomapi.c fpdfapi_jcparam.c fpdfapi_jcphuff.c fpdfapi_jcprepct.c fpdfapi_jcsample.c fpdfapi_jctrans.c fpdfapi_jdapimin.c fpdfapi_jdapistd.c fpdfapi_jdcoefct.c \\\n\t fpdfapi_jdcolor.c fpdfapi_jddctmgr.c fpdfapi_jdhuff.c fpdfapi_jdinput.c fpdfapi_jdmainct.c fpdfapi_jdmarker.c fpdfapi_jdmaster.c fpdfapi_jdmerge.c fpdfapi_jdphuff.c fpdfapi_jdpostct.c fpdfapi_jdsample.c \\\n\t fpdfapi_jdtrans.c fpdfapi_jerror.c fpdfapi_jfdctfst.c fpdfapi_jfdctint.c fpdfapi_jcapimin.c fpdfapi_jidctfst.c fpdfapi_jidctint.c fpdfapi_jidctred.c fpdfapi_jmemmgr.c \\\n\t fpdfapi_jmemnobs.c fpdfapi_jutils.c\narmsources=$(sources)\narmsourcesc=$(sources)\ninclude ../../src/makefile\n"
  },
  {
    "path": "core/src/fxcodec/libjpeg/transupp.h",
    "content": "/*\n * transupp.h\n *\n * Copyright (C) 1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains declarations for image transformation routines and\n * other utility code used by the jpegtran sample application.  These are\n * NOT part of the core JPEG library.  But we keep these routines separate\n * from jpegtran.c to ease the task of maintaining jpegtran-like programs\n * that have other user interfaces.\n *\n * NOTE: all the routines declared here have very specific requirements\n * about when they are to be executed during the reading and writing of the\n * source and destination files.  See the comments in transupp.c, or see\n * jpegtran.c for an example of correct usage.\n */\n\n/* If you happen not to want the image transform support, disable it here */\n#ifndef TRANSFORMS_SUPPORTED\n#define TRANSFORMS_SUPPORTED 1\t\t/* 0 disables transform code */\n#endif\n\n/* Short forms of external names for systems with brain-damaged linkers. */\n\n#ifdef NEED_SHORT_EXTERNAL_NAMES\n#define jtransform_request_workspace\t\tjTrRequest\n#define jtransform_adjust_parameters\t\tjTrAdjust\n#define jtransform_execute_transformation\tjTrExec\n#define jcopy_markers_setup\t\t\tjCMrkSetup\n#define jcopy_markers_execute\t\t\tjCMrkExec\n#endif /* NEED_SHORT_EXTERNAL_NAMES */\n\n\n/*\n * Codes for supported types of image transformations.\n */\n\ntypedef enum {\n\tJXFORM_NONE,\t\t/* no transformation */\n\tJXFORM_FLIP_H,\t\t/* horizontal flip */\n\tJXFORM_FLIP_V,\t\t/* vertical flip */\n\tJXFORM_TRANSPOSE,\t/* transpose across UL-to-LR axis */\n\tJXFORM_TRANSVERSE,\t/* transpose across UR-to-LL axis */\n\tJXFORM_ROT_90,\t\t/* 90-degree clockwise rotation */\n\tJXFORM_ROT_180,\t\t/* 180-degree rotation */\n\tJXFORM_ROT_270\t\t/* 270-degree clockwise (or 90 ccw) */\n} JXFORM_CODE;\n\n/*\n * Although rotating and flipping data expressed as DCT coefficients is not\n * hard, there is an asymmetry in the JPEG format specification for images\n * whose dimensions aren't multiples of the iMCU size.  The right and bottom\n * image edges are padded out to the next iMCU boundary with junk data; but\n * no padding is possible at the top and left edges.  If we were to flip\n * the whole image including the pad data, then pad garbage would become\n * visible at the top and/or left, and real pixels would disappear into the\n * pad margins --- perhaps permanently, since encoders & decoders may not\n * bother to preserve DCT blocks that appear to be completely outside the\n * nominal image area.  So, we have to exclude any partial iMCUs from the\n * basic transformation.\n *\n * Transpose is the only transformation that can handle partial iMCUs at the\n * right and bottom edges completely cleanly.  flip_h can flip partial iMCUs\n * at the bottom, but leaves any partial iMCUs at the right edge untouched.\n * Similarly flip_v leaves any partial iMCUs at the bottom edge untouched.\n * The other transforms are defined as combinations of these basic transforms\n * and process edge blocks in a way that preserves the equivalence.\n *\n * The \"trim\" option causes untransformable partial iMCUs to be dropped;\n * this is not strictly lossless, but it usually gives the best-looking\n * result for odd-size images.  Note that when this option is active,\n * the expected mathematical equivalences between the transforms may not hold.\n * (For example, -rot 270 -trim trims only the bottom edge, but -rot 90 -trim\n * followed by -rot 180 -trim trims both edges.)\n *\n * We also offer a \"force to grayscale\" option, which simply discards the\n * chrominance channels of a YCbCr image.  This is lossless in the sense that\n * the luminance channel is preserved exactly.  It's not the same kind of\n * thing as the rotate/flip transformations, but it's convenient to handle it\n * as part of this package, mainly because the transformation routines have to\n * be aware of the option to know how many components to work on.\n */\n\ntypedef struct {\n  /* Options: set by caller */\n  JXFORM_CODE transform;\t/* image transform operator */\n  boolean trim;\t\t\t/* if TRUE, trim partial MCUs as needed */\n  boolean force_grayscale;\t/* if TRUE, convert color image to grayscale */\n\n  /* Internal workspace: caller should not touch these */\n  int num_components;\t\t/* # of components in workspace */\n  jvirt_barray_ptr * workspace_coef_arrays; /* workspace for transformations */\n} jpeg_transform_info;\n\n\n#if TRANSFORMS_SUPPORTED\n\n/* Request any required workspace */\nEXTERN(void) jtransform_request_workspace\n\tJPP((j_decompress_ptr srcinfo, jpeg_transform_info *info));\n/* Adjust output image parameters */\nEXTERN(jvirt_barray_ptr *) jtransform_adjust_parameters\n\tJPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,\n\t     jvirt_barray_ptr *src_coef_arrays,\n\t     jpeg_transform_info *info));\n/* Execute the actual transformation, if any */\nEXTERN(void) jtransform_execute_transformation\n\tJPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,\n\t     jvirt_barray_ptr *src_coef_arrays,\n\t     jpeg_transform_info *info));\n\n#endif /* TRANSFORMS_SUPPORTED */\n\n\n/*\n * Support for copying optional markers from source to destination file.\n */\n\ntypedef enum {\n\tJCOPYOPT_NONE,\t\t/* copy no optional markers */\n\tJCOPYOPT_COMMENTS,\t/* copy only comment (COM) markers */\n\tJCOPYOPT_ALL\t\t/* copy all optional markers */\n} JCOPY_OPTION;\n\n#define JCOPYOPT_DEFAULT  JCOPYOPT_COMMENTS\t/* recommended default */\n\n/* Setup decompression object to save desired markers in memory */\nEXTERN(void) jcopy_markers_setup\n\tJPP((j_decompress_ptr srcinfo, JCOPY_OPTION option));\n/* Copy markers saved in the given source object to the destination object */\nEXTERN(void) jcopy_markers_execute\n\tJPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,\n\t     JCOPY_OPTION option));\n"
  },
  {
    "path": "core/src/fxcrt/extension.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXCRT_EXTENSION_IMP_\n#define _FXCRT_EXTENSION_IMP_\nclass IFXCRT_FileAccess\n{\npublic:\n    virtual ~IFXCRT_FileAccess() {}\n    virtual FX_BOOL\t\tOpen(FX_BSTR fileName, FX_DWORD dwMode) = 0;\n    virtual FX_BOOL\t\tOpen(FX_WSTR fileName, FX_DWORD dwMode) = 0;\n    virtual void\t\tClose() = 0;\n    virtual void\t\tRelease() = 0;\n    virtual FX_FILESIZE\tGetSize() const = 0;\n    virtual FX_FILESIZE\tGetPosition() const = 0;\n    virtual FX_FILESIZE\tSetPosition(FX_FILESIZE pos) = 0;\n    virtual size_t\t\tRead(void* pBuffer, size_t szBuffer) = 0;\n    virtual size_t\t\tWrite(const void* pBuffer, size_t szBuffer) = 0;\n    virtual size_t\t\tReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos) = 0;\n    virtual size_t\t\tWritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos) = 0;\n    virtual FX_BOOL\t\tFlush() = 0;\n    virtual FX_BOOL\t\tTruncate(FX_FILESIZE szFile) = 0;\n};\nIFXCRT_FileAccess*\tFXCRT_FileAccess_Create();\nclass CFX_CRTFileStream FX_FINAL : public IFX_FileStream, public CFX_Object\n{\npublic:\n    CFX_CRTFileStream(IFXCRT_FileAccess* pFA) : m_pFile(pFA), m_dwCount(1), m_bUseRange(FALSE), m_nOffset(0), m_nSize(0) {}\n    ~CFX_CRTFileStream()\n    {\n        if (m_pFile) {\n            m_pFile->Release();\n        }\n    }\n    virtual IFX_FileStream*\t\tRetain()\n    {\n        m_dwCount ++;\n        return this;\n    }\n    virtual void\t\t\t\tRelease()\n    {\n        FX_DWORD nCount = -- m_dwCount;\n        if (!nCount) {\n            delete this;\n        }\n    }\n    virtual FX_FILESIZE\t\t\tGetSize()\n    {\n        return m_bUseRange ? m_nSize : m_pFile->GetSize();\n    }\n    virtual FX_BOOL\t\t\t\tIsEOF()\n    {\n        return GetPosition() >= GetSize();\n    }\n    virtual FX_FILESIZE\t\t\tGetPosition()\n    {\n        FX_FILESIZE pos = m_pFile->GetPosition();\n        if (m_bUseRange) {\n            pos -= m_nOffset;\n        }\n        return pos;\n    }\n    virtual FX_BOOL\t\t\t\tSetRange(FX_FILESIZE offset, FX_FILESIZE size)\n    {\n        if (offset < 0 || offset + size > m_pFile->GetSize()) {\n            return FALSE;\n        }\n        m_nOffset = offset, m_nSize = size;\n        m_bUseRange = TRUE;\n        m_pFile->SetPosition(m_nOffset);\n        return TRUE;\n    }\n    virtual void\t\t\t\tClearRange()\n    {\n        m_bUseRange = FALSE;\n    }\n    virtual FX_BOOL\t\t\t\tReadBlock(void* buffer, FX_FILESIZE offset, size_t size)\n    {\n        if (m_bUseRange) {\n            if (offset + size > (size_t)GetSize()) {\n                return FALSE;\n            }\n            offset += m_nOffset;\n        }\n        return (FX_BOOL)m_pFile->ReadPos(buffer, size, offset);\n    }\n    virtual size_t\t\t\t\tReadBlock(void* buffer, size_t size)\n    {\n        if (m_bUseRange) {\n            FX_FILESIZE availSize = m_nOffset + m_nSize - m_pFile->GetPosition();\n            if ((size_t)availSize < size) {\n                size -= size - (size_t)availSize;\n            }\n        }\n        return m_pFile->Read(buffer, size);\n    }\n    virtual\tFX_BOOL\t\t\t\tWriteBlock(const void* buffer, FX_FILESIZE offset, size_t size)\n    {\n        if (m_bUseRange) {\n            offset += m_nOffset;\n        }\n        return (FX_BOOL)m_pFile->WritePos(buffer, size, offset);\n    }\n    virtual FX_BOOL\t\t\t\tFlush()\n    {\n        return m_pFile->Flush();\n    }\n    IFXCRT_FileAccess*\tm_pFile;\n    FX_DWORD\t\t\tm_dwCount;\n    FX_BOOL\t\t\t\tm_bUseRange;\n    FX_FILESIZE\t\t\tm_nOffset;\n    FX_FILESIZE\t\t\tm_nSize;\n};\n#define FX_MEMSTREAM_BlockSize\t\t(64 * 1024)\n#define FX_MEMSTREAM_Consecutive\t0x01\n#define FX_MEMSTREAM_TakeOver\t\t0x02\nclass CFX_MemoryStream FX_FINAL : public IFX_MemoryStream, public CFX_Object\n{\npublic:\n    CFX_MemoryStream(FX_BOOL bConsecutive)\n        : m_dwCount(1)\n        , m_nTotalSize(0)\n        , m_nCurSize(0)\n        , m_nCurPos(0)\n        , m_nGrowSize(FX_MEMSTREAM_BlockSize)\n        , m_bUseRange(FALSE)\n    {\n        m_dwFlags = FX_MEMSTREAM_TakeOver | (bConsecutive ? FX_MEMSTREAM_Consecutive : 0);\n    }\n    CFX_MemoryStream(FX_LPBYTE pBuffer, size_t nSize, FX_BOOL bTakeOver)\n        : m_dwCount(1)\n        , m_nTotalSize(nSize)\n        , m_nCurSize(nSize)\n        , m_nCurPos(0)\n        , m_nGrowSize(FX_MEMSTREAM_BlockSize)\n        , m_bUseRange(FALSE)\n    {\n        m_Blocks.Add(pBuffer);\n        m_dwFlags = FX_MEMSTREAM_Consecutive | (bTakeOver ? FX_MEMSTREAM_TakeOver : 0);\n    }\n    ~CFX_MemoryStream()\n    {\n        if (m_dwFlags & FX_MEMSTREAM_TakeOver) {\n            for (FX_INT32 i = 0; i < m_Blocks.GetSize(); i++) {\n                FX_Free((FX_LPBYTE)m_Blocks[i]);\n            }\n        }\n        m_Blocks.RemoveAll();\n    }\n    virtual IFX_FileStream*\t\tRetain()\n    {\n        m_dwCount ++;\n        return this;\n    }\n    virtual void\t\t\t\tRelease()\n    {\n        FX_DWORD nCount = -- m_dwCount;\n        if (nCount) {\n            return;\n        }\n        delete this;\n    }\n    virtual FX_FILESIZE\t\t\tGetSize()\n    {\n        return m_bUseRange ? (FX_FILESIZE) m_nSize : (FX_FILESIZE)m_nCurSize;\n    }\n    virtual FX_BOOL\t\t\t\tIsEOF()\n    {\n        return m_nCurPos >= (size_t)GetSize();\n    }\n    virtual FX_FILESIZE\t\t\tGetPosition()\n    {\n        FX_FILESIZE pos = (FX_FILESIZE)m_nCurPos;\n        if (m_bUseRange) {\n            pos -= (FX_FILESIZE)m_nOffset;\n        }\n        return pos;\n    }\n    virtual FX_BOOL\t\t\t\tSetRange(FX_FILESIZE offset, FX_FILESIZE size)\n    {\n        if (offset < 0 || (size_t)(offset + size) > m_nCurSize) {\n            return FALSE;\n        }\n        m_nOffset = (size_t)offset, m_nSize = (size_t)size;\n        m_bUseRange = TRUE;\n        m_nCurPos = m_nOffset;\n        return TRUE;\n    }\n    virtual void\t\t\t\tClearRange()\n    {\n        m_bUseRange = FALSE;\n    }\n    virtual FX_BOOL\t\t\t\tReadBlock(void* buffer, FX_FILESIZE offset, size_t size)\n    {\n        if (!buffer || !size) {\n            return FALSE;\n        }\n        if (m_bUseRange) {\n            offset += (FX_FILESIZE)m_nOffset;\n        }\n        if ((size_t)offset + size > m_nCurSize) {\n            return FALSE;\n        }\n        m_nCurPos = (size_t)offset + size;\n        if (m_dwFlags & FX_MEMSTREAM_Consecutive) {\n            FXSYS_memcpy32(buffer, (FX_LPBYTE)m_Blocks[0] + (size_t)offset, size);\n            return TRUE;\n        }\n        size_t nStartBlock = (size_t)offset / m_nGrowSize;\n        offset -= (FX_FILESIZE)(nStartBlock * m_nGrowSize);\n        while (size) {\n            size_t nRead = m_nGrowSize - (size_t)offset;\n            if (nRead > size) {\n                nRead = size;\n            }\n            FXSYS_memcpy32(buffer, (FX_LPBYTE)m_Blocks[(int)nStartBlock] + (size_t)offset, nRead);\n            buffer = ((FX_LPBYTE)buffer) + nRead;\n            size -= nRead;\n            nStartBlock ++;\n            offset = 0;\n        }\n        return TRUE;\n    }\n    virtual size_t\t\t\t\tReadBlock(void* buffer, size_t size)\n    {\n        if (m_nCurPos >= m_nCurSize) {\n            return 0;\n        }\n        if (m_bUseRange) {\n            size_t availSize = m_nOffset + m_nSize - m_nCurPos;\n            if (availSize < size) {\n                size -= size - (size_t)availSize;\n            }\n        }\n        size_t nRead = FX_MIN(size, m_nCurSize - m_nCurPos);\n        if (!ReadBlock(buffer, (FX_INT32)m_nCurPos, nRead)) {\n            return 0;\n        }\n        return nRead;\n    }\n    virtual\tFX_BOOL\t\t\t\tWriteBlock(const void* buffer, FX_FILESIZE offset, size_t size)\n    {\n        if (!buffer || !size) {\n            return FALSE;\n        }\n        if (m_bUseRange) {\n            offset += (FX_FILESIZE)m_nOffset;\n        }\n        if (m_dwFlags & FX_MEMSTREAM_Consecutive) {\n            m_nCurPos = (size_t)offset + size;\n            if (m_nCurPos > m_nTotalSize) {\n                m_nTotalSize = (m_nCurPos + m_nGrowSize - 1) / m_nGrowSize * m_nGrowSize;\n                if (m_Blocks.GetSize() < 1) {\n                    void* block = FX_Alloc(FX_BYTE, m_nTotalSize);\n                    m_Blocks.Add(block);\n                } else {\n                    m_Blocks[0] = FX_Realloc(FX_BYTE, m_Blocks[0], m_nTotalSize);\n                }\n                if (!m_Blocks[0]) {\n                    m_Blocks.RemoveAll();\n                    return FALSE;\n                }\n            }\n            FXSYS_memcpy32((FX_LPBYTE)m_Blocks[0] + (size_t)offset, buffer, size);\n            if (m_nCurSize < m_nCurPos) {\n                m_nCurSize = m_nCurPos;\n            }\n            return TRUE;\n        }\n        if (!ExpandBlocks((size_t)offset + size)) {\n            return FALSE;\n        }\n        m_nCurPos = (size_t)offset + size;\n        size_t nStartBlock = (size_t)offset / m_nGrowSize;\n        offset -= (FX_FILESIZE)(nStartBlock * m_nGrowSize);\n        while (size) {\n            size_t nWrite = m_nGrowSize - (size_t)offset;\n            if (nWrite > size) {\n                nWrite = size;\n            }\n            FXSYS_memcpy32((FX_LPBYTE)m_Blocks[(int)nStartBlock] + (size_t)offset, buffer, nWrite);\n            buffer = ((FX_LPBYTE)buffer) + nWrite;\n            size -= nWrite;\n            nStartBlock ++;\n            offset = 0;\n        }\n        return TRUE;\n    }\n    virtual FX_BOOL\t\t\t\tFlush()\n    {\n        return TRUE;\n    }\n    virtual FX_BOOL\t\t\t\tIsConsecutive() const\n    {\n        return m_dwFlags & FX_MEMSTREAM_Consecutive;\n    }\n    virtual void\t\t\t\tEstimateSize(size_t nInitSize, size_t nGrowSize)\n    {\n        if (m_dwFlags & FX_MEMSTREAM_Consecutive) {\n            if (m_Blocks.GetSize() < 1) {\n                FX_LPBYTE pBlock = FX_Alloc(FX_BYTE, FX_MAX(nInitSize, 4096));\n                if (pBlock) {\n                    m_Blocks.Add(pBlock);\n                }\n            }\n            m_nGrowSize = FX_MAX(nGrowSize, 4096);\n        } else if (m_Blocks.GetSize() < 1) {\n            m_nGrowSize = FX_MAX(nGrowSize, 4096);\n        }\n    }\n    virtual FX_LPBYTE\t\t\tGetBuffer() const\n    {\n        return m_Blocks.GetSize() ? (FX_LPBYTE)m_Blocks[0] : NULL;\n    }\n    virtual void\t\t\t\tAttachBuffer(FX_LPBYTE pBuffer, size_t nSize, FX_BOOL bTakeOver = FALSE)\n    {\n        if (!(m_dwFlags & FX_MEMSTREAM_Consecutive)) {\n            return;\n        }\n        m_Blocks.RemoveAll();\n        m_Blocks.Add(pBuffer);\n        m_nTotalSize = m_nCurSize = nSize;\n        m_nCurPos = 0;\n        m_dwFlags = FX_MEMSTREAM_Consecutive | (bTakeOver ? FX_MEMSTREAM_TakeOver : 0);\n        ClearRange();\n    }\n    virtual void\t\t\t\tDetachBuffer()\n    {\n        if (!(m_dwFlags & FX_MEMSTREAM_Consecutive)) {\n            return;\n        }\n        m_Blocks.RemoveAll();\n        m_nTotalSize = m_nCurSize = m_nCurPos = 0;\n        m_dwFlags = FX_MEMSTREAM_TakeOver;\n        ClearRange();\n    }\nprotected:\n    CFX_PtrArray\tm_Blocks;\n    FX_DWORD\t\tm_dwCount;\n    size_t\t\t\tm_nTotalSize;\n    size_t\t\t\tm_nCurSize;\n    size_t\t\t\tm_nCurPos;\n    size_t\t\t\tm_nGrowSize;\n    FX_DWORD\t\tm_dwFlags;\n    FX_BOOL\t\t\tm_bUseRange;\n    size_t\t\t\tm_nOffset;\n    size_t\t\t\tm_nSize;\n    FX_BOOL\tExpandBlocks(size_t size)\n    {\n        if (m_nCurSize < size) {\n            m_nCurSize = size;\n        }\n        if (size <= m_nTotalSize) {\n            return TRUE;\n        }\n        FX_INT32 iCount = m_Blocks.GetSize();\n        size = (size - m_nTotalSize + m_nGrowSize - 1) / m_nGrowSize;\n        m_Blocks.SetSize(m_Blocks.GetSize() + (FX_INT32)size);\n        while (size --) {\n            FX_LPBYTE pBlock = FX_Alloc(FX_BYTE, m_nGrowSize);\n            if (!pBlock) {\n                return FALSE;\n            }\n            m_Blocks.SetAt(iCount ++, pBlock);\n            m_nTotalSize += m_nGrowSize;\n        }\n        return TRUE;\n    }\n};\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n#define MT_N\t\t\t848\n#define MT_M\t\t\t456\n#define MT_Matrix_A\t\t0x9908b0df\n#define MT_Upper_Mask\t0x80000000\n#define MT_Lower_Mask\t0x7fffffff\ntypedef struct _FX_MTRANDOMCONTEXT {\n    _FX_MTRANDOMCONTEXT()\n    {\n        mti = MT_N + 1;\n        bHaveSeed = FALSE;\n    }\n    FX_DWORD mti;\n    FX_BOOL\t bHaveSeed;\n    FX_DWORD mt[MT_N];\n} FX_MTRANDOMCONTEXT, * FX_LPMTRANDOMCONTEXT;\ntypedef FX_MTRANDOMCONTEXT const * FX_LPCMTRANDOMCONTEXT;\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\nFX_BOOL FX_GenerateCryptoRandom(FX_LPDWORD pBuffer, FX_INT32 iCount);\n#endif\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "core/src/fxcrt/fx_arabic.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxcrt/fx_ext.h\"\n#include \"fx_arabic.h\"\nextern const FX_DWORD gs_FX_TextLayout_CodeProperties[65536];\nIFX_BidiChar* IFX_BidiChar::Create()\n{\n    return FX_NEW CFX_BidiChar;\n}\nCFX_BidiChar::CFX_BidiChar()\n    : m_bSeparateNeutral(TRUE)\n    , m_iCurStart(0)\n    , m_iCurCount(0)\n    , m_iCurBidi(0)\n    , m_iLastBidi(0)\n    , m_iLastStart(0)\n    , m_iLastCount(0)\n{\n}\nFX_BOOL CFX_BidiChar::AppendChar(FX_WCHAR wch)\n{\n    FX_DWORD dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];\n    FX_INT32 iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS;\n    FX_INT32 iContext = 0;\n    switch (iBidiCls) {\n        case FX_BIDICLASS_L:\n        case FX_BIDICLASS_AN:\n        case FX_BIDICLASS_EN:\n            iContext = 1;\n            break;\n        case FX_BIDICLASS_R:\n        case FX_BIDICLASS_AL:\n            iContext = 2;\n            break;\n    }\n    FX_BOOL bRet = FALSE;\n    if (iContext != m_iCurBidi) {\n        if (m_bSeparateNeutral) {\n            bRet = TRUE;\n        } else {\n            if (m_iCurBidi == 0) {\n                bRet = (m_iCurCount > 0);\n            } else {\n                bRet = (iContext != 0);\n            }\n        }\n        if (bRet) {\n            m_iLastBidi = m_iCurBidi;\n            m_iLastStart = m_iCurStart;\n            m_iCurStart = m_iCurCount;\n            m_iLastCount = m_iCurCount - m_iLastStart;\n        }\n        if (m_bSeparateNeutral || iContext != 0) {\n            m_iCurBidi = iContext;\n        }\n    }\n    m_iCurCount ++;\n    return bRet;\n}\nFX_BOOL CFX_BidiChar::EndChar()\n{\n    m_iLastBidi = m_iCurBidi;\n    m_iLastStart = m_iCurStart;\n    m_iCurStart = m_iCurCount;\n    m_iLastCount = m_iCurCount - m_iLastStart;\n    return m_iLastCount > 0;\n}\nFX_INT32 CFX_BidiChar::GetBidiInfo(FX_INT32 &iStart, FX_INT32 &iCount)\n{\n    iStart = m_iLastStart;\n    iCount = m_iLastCount;\n    return m_iLastBidi;\n}\nvoid CFX_BidiChar::Reset()\n{\n    m_iCurStart = 0;\n    m_iCurCount = 0;\n    m_iCurBidi = 0;\n    m_iLastBidi = 0;\n    m_iLastStart = 0;\n    m_iLastCount = 0;\n}\n"
  },
  {
    "path": "core/src/fxcrt/fx_arabic.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_ARABIC_IMP\n#define _FX_ARABIC_IMP\nclass CFX_BidiChar FX_FINAL : public IFX_BidiChar, public CFX_Object\n{\npublic:\n    CFX_BidiChar();\n    virtual void\t\tRelease()\n    {\n        delete this;\n    }\n    virtual void\t\tSetPolicy(FX_BOOL bSeparateNeutral = TRUE)\n    {\n        m_bSeparateNeutral = bSeparateNeutral;\n    }\n    virtual FX_BOOL\t\tAppendChar(FX_WCHAR wch);\n    virtual FX_BOOL\t\tEndChar();\n    virtual FX_INT32\tGetBidiInfo(FX_INT32 &iStart, FX_INT32 &iCount);\n    virtual void\t\tReset();\nprotected:\n    FX_BOOL\t\tm_bSeparateNeutral;\n    FX_INT32\tm_iCurStart;\n    FX_INT32\tm_iCurCount;\n    FX_INT32\tm_iCurBidi;\n    FX_INT32\tm_iLastBidi;\n    FX_INT32\tm_iLastStart;\n    FX_INT32\tm_iLastCount;\n};\n#endif\n"
  },
  {
    "path": "core/src/fxcrt/fx_basic_array.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxcrt/fx_basic.h\"\n#include \"../../../third_party/numerics/safe_math.h\"\n\nCFX_BasicArray::CFX_BasicArray(int unit_size)\n    : m_pData(NULL)\n    , m_nSize(0)\n    , m_nMaxSize(0)\n{\n    if (unit_size < 0 || unit_size > (1 << 28)) {\n        m_nUnitSize = 4;\n    } else {\n        m_nUnitSize = unit_size;\n    }\n}\nCFX_BasicArray::~CFX_BasicArray()\n{\n    FX_Free(m_pData);\n}\nFX_BOOL CFX_BasicArray::SetSize(int nNewSize)\n{\n    if (nNewSize <= 0) {\n        FX_Free(m_pData);\n        m_pData = NULL;\n        m_nSize = m_nMaxSize = 0;\n        return 0 == nNewSize;\n    }\n\n    if (m_pData == NULL) {\n        base::CheckedNumeric<int> totalSize = nNewSize;\n        totalSize *= m_nUnitSize;\n        if (!totalSize.IsValid()) {\n            m_nSize = m_nMaxSize = 0;\n            return FALSE;\n        }\n        m_pData = FX_Alloc(FX_BYTE, totalSize.ValueOrDie());\n        if (!m_pData) {\n            m_nSize = m_nMaxSize = 0;\n            return FALSE;\n        }\n        m_nSize = m_nMaxSize = nNewSize;\n    } else if (nNewSize <= m_nMaxSize) {\n        if (nNewSize > m_nSize) {\n            FXSYS_memset32(m_pData + m_nSize * m_nUnitSize, 0, (nNewSize - m_nSize) * m_nUnitSize);\n        }\n        m_nSize = nNewSize;\n    } else {\n        int nNewMax = nNewSize < m_nMaxSize ? m_nMaxSize : nNewSize;\n        base::CheckedNumeric<int> totalSize = nNewMax;\n        totalSize *= m_nUnitSize;\n        if (!totalSize.IsValid() || nNewMax < m_nSize) {\n            return FALSE;\n        }\n        FX_LPBYTE pNewData = FX_Realloc(FX_BYTE, m_pData, totalSize.ValueOrDie());\n        if (pNewData == NULL) {\n            return FALSE;\n        }\n        FXSYS_memset32(pNewData + m_nSize * m_nUnitSize, 0, (nNewMax - m_nSize) * m_nUnitSize);\n        m_pData = pNewData;\n        m_nSize = nNewSize;\n        m_nMaxSize = nNewMax;\n    }\n    return TRUE;\n}\nFX_BOOL CFX_BasicArray::Append(const CFX_BasicArray& src)\n{\n    int nOldSize = m_nSize;\n    base::CheckedNumeric<int> newSize = m_nSize;\n    newSize += src.m_nSize;\n    if (m_nUnitSize != src.m_nUnitSize || !newSize.IsValid() || !SetSize(newSize.ValueOrDie())) {\n        return FALSE;\n    }\n\n    FXSYS_memcpy32(m_pData + nOldSize * m_nUnitSize, src.m_pData, src.m_nSize * m_nUnitSize);\n    return TRUE;\n}\nFX_BOOL CFX_BasicArray::Copy(const CFX_BasicArray& src)\n{\n    if (!SetSize(src.m_nSize)) {\n        return FALSE;\n    }\n    FXSYS_memcpy32(m_pData, src.m_pData, src.m_nSize * m_nUnitSize);\n    return TRUE;\n}\nFX_LPBYTE CFX_BasicArray::InsertSpaceAt(int nIndex, int nCount)\n{\n    if (nIndex < 0 || nCount <= 0) {\n        return NULL;\n    }\n    if (nIndex >= m_nSize) {\n        if (!SetSize(nIndex + nCount)) {\n            return NULL;\n        }\n    } else {\n        int nOldSize = m_nSize;\n        if (!SetSize(m_nSize + nCount)) {\n            return NULL;\n        }\n        FXSYS_memmove32(m_pData + (nIndex + nCount)*m_nUnitSize, m_pData + nIndex * m_nUnitSize,\n                        (nOldSize - nIndex) * m_nUnitSize);\n        FXSYS_memset32(m_pData + nIndex * m_nUnitSize, 0, nCount * m_nUnitSize);\n    }\n    return m_pData + nIndex * m_nUnitSize;\n}\nFX_BOOL CFX_BasicArray::RemoveAt(int nIndex, int nCount)\n{\n    if (nIndex < 0 || nCount <= 0 || m_nSize < nIndex + nCount) {\n        return FALSE;\n    }\n    int nMoveCount = m_nSize - (nIndex + nCount);\n    if (nMoveCount) {\n        FXSYS_memmove32(m_pData + nIndex * m_nUnitSize, m_pData + (nIndex + nCount) * m_nUnitSize, nMoveCount * m_nUnitSize);\n    }\n    m_nSize -= nCount;\n    return TRUE;\n}\nFX_BOOL CFX_BasicArray::InsertAt(int nStartIndex, const CFX_BasicArray* pNewArray)\n{\n    if (pNewArray == NULL) {\n        return FALSE;\n    }\n    if (pNewArray->m_nSize == 0) {\n        return TRUE;\n    }\n    if (!InsertSpaceAt(nStartIndex, pNewArray->m_nSize)) {\n        return FALSE;\n    }\n    FXSYS_memcpy32(m_pData + nStartIndex * m_nUnitSize, pNewArray->m_pData, pNewArray->m_nSize * m_nUnitSize);\n    return TRUE;\n}\nconst void* CFX_BasicArray::GetDataPtr(int index) const\n{\n    if (index < 0 || index >= m_nSize || m_pData == NULL) {\n        return NULL;\n    }\n    return m_pData + index * m_nUnitSize;\n}\nCFX_BaseSegmentedArray::CFX_BaseSegmentedArray(int unit_size, int segment_units, int index_size)\n    : m_UnitSize(unit_size)\n    , m_SegmentSize(segment_units)\n    , m_IndexSize(index_size)\n    , m_IndexDepth(0)\n    , m_DataSize(0)\n    , m_pIndex(NULL)\n{\n}\nvoid CFX_BaseSegmentedArray::SetUnitSize(int unit_size, int segment_units, int index_size)\n{\n    ASSERT(m_DataSize == 0);\n    m_UnitSize = unit_size;\n    m_SegmentSize = segment_units;\n    m_IndexSize = index_size;\n}\nCFX_BaseSegmentedArray::~CFX_BaseSegmentedArray()\n{\n    RemoveAll();\n}\nstatic void _ClearIndex(int level, int size, void** pIndex)\n{\n    if (level == 0) {\n        FX_Free(pIndex);\n        return;\n    }\n    for (int i = 0; i < size; i++) {\n        if (pIndex[i] == NULL) {\n            continue;\n        }\n        _ClearIndex(level - 1, size, (void**)pIndex[i]);\n    }\n    FX_Free(pIndex);\n}\nvoid CFX_BaseSegmentedArray::RemoveAll()\n{\n    if (m_pIndex == NULL) {\n        return;\n    }\n    _ClearIndex(m_IndexDepth, m_IndexSize, (void**)m_pIndex);\n    m_pIndex = NULL;\n    m_IndexDepth = 0;\n    m_DataSize = 0;\n}\nvoid* CFX_BaseSegmentedArray::Add()\n{\n    if (m_DataSize % m_SegmentSize) {\n        return GetAt(m_DataSize ++);\n    }\n    void* pSegment = FX_Alloc(FX_BYTE, m_UnitSize * m_SegmentSize);\n    if (!pSegment) {\n        return NULL;\n    }\n    if (m_pIndex == NULL) {\n        m_pIndex = pSegment;\n        m_DataSize ++;\n        return pSegment;\n    }\n    if (m_IndexDepth == 0) {\n        void** pIndex = (void**)FX_Alloc(void*, m_IndexSize);\n        if (pIndex == NULL) {\n            FX_Free(pSegment);\n            return NULL;\n        }\n        pIndex[0] = m_pIndex;\n        pIndex[1] = pSegment;\n        m_pIndex = pIndex;\n        m_DataSize ++;\n        m_IndexDepth ++;\n        return pSegment;\n    }\n    int seg_index = m_DataSize / m_SegmentSize;\n    if (seg_index % m_IndexSize) {\n        void** pIndex = GetIndex(seg_index);\n        pIndex[seg_index % m_IndexSize] = pSegment;\n        m_DataSize ++;\n        return pSegment;\n    }\n    int tree_size = 1;\n    int i;\n    for (i = 0; i < m_IndexDepth; i ++) {\n        tree_size *= m_IndexSize;\n    }\n    if (m_DataSize == tree_size * m_SegmentSize) {\n        void** pIndex = (void**)FX_Alloc(void*, m_IndexSize);\n        if (pIndex == NULL) {\n            FX_Free(pSegment);\n            return NULL;\n        }\n        pIndex[0] = m_pIndex;\n        m_pIndex = pIndex;\n        m_IndexDepth ++;\n    } else {\n        tree_size /= m_IndexSize;\n    }\n    void** pSpot = (void**)m_pIndex;\n    for (i = 1; i < m_IndexDepth; i ++) {\n        if (pSpot[seg_index / tree_size] == NULL) {\n            pSpot[seg_index / tree_size] = (void*)FX_Alloc(void*, m_IndexSize);\n            if (pSpot[seg_index / tree_size] == NULL) {\n                break;\n            }\n        }\n        pSpot = (void**)pSpot[seg_index / tree_size];\n        seg_index = seg_index % tree_size;\n        tree_size /= m_IndexSize;\n    }\n    if (i < m_IndexDepth) {\n        FX_Free(pSegment);\n        RemoveAll();\n        return NULL;\n    }\n    pSpot[seg_index % m_IndexSize] = pSegment;\n    m_DataSize ++;\n    return pSegment;\n}\nvoid** CFX_BaseSegmentedArray::GetIndex(int seg_index) const\n{\n    ASSERT(m_IndexDepth != 0);\n    if (m_IndexDepth == 1) {\n        return (void**)m_pIndex;\n    } else if (m_IndexDepth == 2) {\n        return (void**)((void**)m_pIndex)[seg_index / m_IndexSize];\n    }\n    int tree_size = 1;\n    int i;\n    for (i = 1; i < m_IndexDepth; i ++) {\n        tree_size *= m_IndexSize;\n    }\n    void** pSpot = (void**)m_pIndex;\n    for (i = 1; i < m_IndexDepth; i ++) {\n        pSpot = (void**)pSpot[seg_index / tree_size];\n        seg_index = seg_index % tree_size;\n        tree_size /= m_IndexSize;\n    }\n    return pSpot;\n}\nvoid* CFX_BaseSegmentedArray::IterateSegment(FX_LPCBYTE pSegment, int count, FX_BOOL (*callback)(void* param, void* pData), void* param) const\n{\n    for (int i = 0; i < count; i ++) {\n        if (!callback(param, (void*)(pSegment + i * m_UnitSize))) {\n            return (void*)(pSegment + i * m_UnitSize);\n        }\n    }\n    return NULL;\n}\nvoid* CFX_BaseSegmentedArray::IterateIndex(int level, int& start, void** pIndex, FX_BOOL (*callback)(void* param, void* pData), void* param) const\n{\n    if (level == 0) {\n        int count = m_DataSize - start;\n        if (count > m_SegmentSize) {\n            count = m_SegmentSize;\n        }\n        start += count;\n        return IterateSegment((FX_LPCBYTE)pIndex, count, callback, param);\n    }\n    for (int i = 0; i < m_IndexSize; i ++) {\n        if (pIndex[i] == NULL) {\n            continue;\n        }\n        void* p = IterateIndex(level - 1, start, (void**)pIndex[i], callback, param);\n        if (p) {\n            return p;\n        }\n    }\n    return NULL;\n}\nvoid* CFX_BaseSegmentedArray::Iterate(FX_BOOL (*callback)(void* param, void* pData), void* param) const\n{\n    if (m_pIndex == NULL) {\n        return NULL;\n    }\n    int start = 0;\n    return IterateIndex(m_IndexDepth, start, (void**)m_pIndex, callback, param);\n}\nvoid* CFX_BaseSegmentedArray::GetAt(int index) const\n{\n    if (index < 0 || index >= m_DataSize) {\n        return NULL;\n    }\n    if (m_IndexDepth == 0) {\n        return (FX_LPBYTE)m_pIndex + m_UnitSize * index;\n    }\n    int seg_index = index / m_SegmentSize;\n    return (FX_LPBYTE)GetIndex(seg_index)[seg_index % m_IndexSize] + (index % m_SegmentSize) * m_UnitSize;\n}\nvoid CFX_BaseSegmentedArray::Delete(int index, int count)\n{\n    if(index < 0 || count < 1 || index + count > m_DataSize) {\n        return;\n    }\n    int i;\n    for (i = index; i < m_DataSize - count; i ++) {\n        FX_BYTE* pSrc = (FX_BYTE*)GetAt(i + count);\n        FX_BYTE* pDest = (FX_BYTE*)GetAt(i);\n        for (int j = 0; j < m_UnitSize; j ++) {\n            pDest[j] = pSrc[j];\n        }\n    }\n    int new_segs = (m_DataSize - count + m_SegmentSize - 1) / m_SegmentSize;\n    int old_segs = (m_DataSize + m_SegmentSize - 1) / m_SegmentSize;\n    if (new_segs < old_segs) {\n        if(m_IndexDepth) {\n            for (i = new_segs; i < old_segs; i ++) {\n                void** pIndex = GetIndex(i);\n                FX_Free(pIndex[i % m_IndexSize]);\n                pIndex[i % m_IndexSize] = NULL;\n            }\n        } else {\n            FX_Free(m_pIndex);\n            m_pIndex = NULL;\n        }\n    }\n    m_DataSize -= count;\n}\n"
  },
  {
    "path": "core/src/fxcrt/fx_basic_bstring.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxcrt/fx_basic.h\"\n#include \"../../../third_party/numerics/safe_math.h\"\n\nstatic int _Buffer_itoa(char* buf, int i, FX_DWORD flags)\n{\n    if (i == 0) {\n        buf[0] = '0';\n        return 1;\n    }\n    char buf1[32];\n    int buf_pos = 31;\n    FX_DWORD u = i;\n    if ((flags & FXFORMAT_SIGNED) && i < 0) {\n        u = -i;\n    }\n    int base = 10;\n    FX_LPCSTR string = \"0123456789abcdef\";\n    if (flags & FXFORMAT_HEX) {\n        base = 16;\n        if (flags & FXFORMAT_CAPITAL) {\n            string = \"0123456789ABCDEF\";\n        }\n    }\n    while (u != 0) {\n        buf1[buf_pos--] = string[u % base];\n        u = u / base;\n    }\n    if ((flags & FXFORMAT_SIGNED) && i < 0) {\n        buf1[buf_pos--] = '-';\n    }\n    int len = 31 - buf_pos;\n    for (int ii = 0; ii < len; ii ++) {\n        buf[ii] = buf1[ii + buf_pos + 1];\n    }\n    return len;\n}\nCFX_ByteString CFX_ByteString::FormatInteger(int i, FX_DWORD flags)\n{\n    char buf[32];\n    return CFX_ByteStringC(buf, _Buffer_itoa(buf, i, flags));\n}\nstatic CFX_StringData* FX_AllocString(int nLen)\n{\n    // |nLen| is currently declared as in |int|. TODO(palmer): It should be\n    // a |size_t|, or at least unsigned.\n    if (nLen == 0 || nLen < 0) {\n        return NULL;\n    }\n    base::CheckedNumeric<int> nSize = nLen;\n    nSize += sizeof(long) * 3 + 1;\n    CFX_StringData* pData = (CFX_StringData*)FX_Alloc(FX_BYTE, nSize.ValueOrDie());\n    if (!pData) {\n        return NULL;\n    }\n    pData->m_nAllocLength = nLen;\n    pData->m_nDataLength = nLen;\n    pData->m_nRefs = 1;\n    pData->m_String[nLen] = 0;\n    return pData;\n}\nstatic void FX_ReleaseString(CFX_StringData* pData)\n{\n    if (pData == NULL) {\n        return;\n    }\n    pData->m_nRefs --;\n    if (pData->m_nRefs <= 0) {\n        FX_Free(pData);\n    }\n}\nCFX_ByteString::~CFX_ByteString()\n{\n    if (m_pData == NULL) {\n        return;\n    }\n    m_pData->m_nRefs --;\n    if (m_pData->m_nRefs < 1) {\n        FX_Free(m_pData);\n    }\n}\nCFX_ByteString::CFX_ByteString(FX_LPCSTR lpsz, FX_STRSIZE nLen)\n{\n    if (nLen < 0) {\n        nLen = lpsz ? (FX_STRSIZE)FXSYS_strlen(lpsz) : 0;\n    }\n    if (nLen) {\n        m_pData = FX_AllocString(nLen);\n        if (m_pData) {\n            FXSYS_memcpy32(m_pData->m_String, lpsz, nLen);\n        }\n    } else {\n        m_pData = NULL;\n    }\n}\nCFX_ByteString::CFX_ByteString(FX_LPCBYTE lpsz, FX_STRSIZE nLen)\n{\n    if (nLen > 0) {\n        m_pData = FX_AllocString(nLen);\n        if (m_pData) {\n            FXSYS_memcpy32(m_pData->m_String, lpsz, nLen);\n        }\n    } else {\n        m_pData = NULL;\n    }\n}\nCFX_ByteString::CFX_ByteString(char ch)\n{\n    m_pData = FX_AllocString(1);\n    if (m_pData) {\n        m_pData->m_String[0] = ch;\n    }\n}\nCFX_ByteString::CFX_ByteString(const CFX_ByteString& stringSrc)\n{\n    if (stringSrc.m_pData == NULL) {\n        m_pData = NULL;\n        return;\n    }\n    if (stringSrc.m_pData->m_nRefs >= 0) {\n        m_pData = stringSrc.m_pData;\n        m_pData->m_nRefs ++;\n    } else {\n        m_pData = NULL;\n        *this = stringSrc;\n    }\n}\nCFX_ByteString::CFX_ByteString(FX_BSTR stringSrc)\n{\n    if (stringSrc.IsEmpty()) {\n        m_pData = NULL;\n        return;\n    } else {\n        m_pData = NULL;\n        *this = stringSrc;\n    }\n}\nCFX_ByteString::CFX_ByteString(FX_BSTR str1, FX_BSTR str2)\n{\n    m_pData = NULL;\n    int nNewLen = str1.GetLength() + str2.GetLength();\n    if (nNewLen == 0) {\n        return;\n    }\n    m_pData = FX_AllocString(nNewLen);\n    if (m_pData) {\n        FXSYS_memcpy32(m_pData->m_String, str1.GetCStr(), str1.GetLength());\n        FXSYS_memcpy32(m_pData->m_String + str1.GetLength(), str2.GetCStr(), str2.GetLength());\n    }\n}\nconst CFX_ByteString& CFX_ByteString::operator=(FX_LPCSTR lpsz)\n{\n    if (lpsz == NULL || lpsz[0] == 0) {\n        Empty();\n    } else {\n        AssignCopy((FX_STRSIZE)FXSYS_strlen(lpsz), lpsz);\n    }\n    return *this;\n}\nconst CFX_ByteString& CFX_ByteString::operator=(FX_BSTR str)\n{\n    if (str.IsEmpty()) {\n        Empty();\n    } else {\n        AssignCopy(str.GetLength(), str.GetCStr());\n    }\n    return *this;\n}\nconst CFX_ByteString& CFX_ByteString::operator=(const CFX_ByteString& stringSrc)\n{\n    if (m_pData == stringSrc.m_pData) {\n        return *this;\n    }\n    if (stringSrc.IsEmpty()) {\n        Empty();\n    } else if ((m_pData && m_pData->m_nRefs < 0) ||\n               (stringSrc.m_pData && stringSrc.m_pData->m_nRefs < 0)) {\n        AssignCopy(stringSrc.m_pData->m_nDataLength, stringSrc.m_pData->m_String);\n    } else {\n        Empty();\n        m_pData = stringSrc.m_pData;\n        if (m_pData) {\n            m_pData->m_nRefs ++;\n        }\n    }\n    return *this;\n}\nconst CFX_ByteString& CFX_ByteString::operator=(const CFX_BinaryBuf& buf)\n{\n    Load(buf.GetBuffer(), buf.GetSize());\n    return *this;\n}\nvoid CFX_ByteString::Load(FX_LPCBYTE buf, FX_STRSIZE len)\n{\n    Empty();\n    if (len) {\n        m_pData = FX_AllocString(len);\n        if (m_pData) {\n            FXSYS_memcpy32(m_pData->m_String, buf, len);\n        }\n    } else {\n        m_pData = NULL;\n    }\n}\nconst CFX_ByteString& CFX_ByteString::operator+=(FX_LPCSTR lpsz)\n{\n    if (lpsz) {\n        ConcatInPlace((FX_STRSIZE)FXSYS_strlen(lpsz), lpsz);\n    }\n    return *this;\n}\nconst CFX_ByteString& CFX_ByteString::operator+=(char ch)\n{\n    ConcatInPlace(1, &ch);\n    return *this;\n}\nconst CFX_ByteString& CFX_ByteString::operator+=(const CFX_ByteString& string)\n{\n    if (string.m_pData == NULL) {\n        return *this;\n    }\n    ConcatInPlace(string.m_pData->m_nDataLength, string.m_pData->m_String);\n    return *this;\n}\nconst CFX_ByteString& CFX_ByteString::operator+=(FX_BSTR string)\n{\n    if (string.IsEmpty()) {\n        return *this;\n    }\n    ConcatInPlace(string.GetLength(), string.GetCStr());\n    return *this;\n}\nbool CFX_ByteString::Equal(FX_BSTR str) const\n{\n    if (m_pData == NULL) {\n        return str.IsEmpty();\n    }\n    return m_pData->m_nDataLength == str.GetLength() &&\n           FXSYS_memcmp32(m_pData->m_String, str.GetCStr(), str.GetLength()) == 0;\n}\nbool CFX_ByteString::operator ==(const CFX_ByteString& s2) const\n{\n    if (m_pData == NULL) {\n        return s2.IsEmpty();\n    }\n    if (s2.m_pData == NULL) {\n        return false;\n    }\n    return m_pData->m_nDataLength == s2.m_pData->m_nDataLength &&\n           FXSYS_memcmp32(m_pData->m_String, s2.m_pData->m_String, m_pData->m_nDataLength) == 0;\n}\nvoid CFX_ByteString::Empty()\n{\n    if (m_pData == NULL) {\n        return;\n    }\n    if (m_pData->m_nRefs > 1) {\n        m_pData->m_nRefs --;\n    } else {\n        FX_Free(m_pData);\n    }\n    m_pData = NULL;\n}\nbool CFX_ByteString::EqualNoCase(FX_BSTR str) const\n{\n    if (m_pData == NULL) {\n        return str.IsEmpty();\n    }\n    FX_STRSIZE len = str.GetLength();\n    if (m_pData->m_nDataLength != len) {\n        return false;\n    }\n    FX_LPCBYTE pThis = (FX_LPCBYTE)m_pData->m_String;\n    FX_LPCBYTE pThat = (FX_LPCBYTE)str;\n    for (FX_STRSIZE i = 0; i < len; i ++) {\n        if ((*pThis) != (*pThat)) {\n            FX_BYTE bThis = *pThis;\n            if (bThis >= 'A' && bThis <= 'Z') {\n                bThis += 'a' - 'A';\n            }\n            FX_BYTE bThat = *pThat;\n            if (bThat >= 'A' && bThat <= 'Z') {\n                bThat += 'a' - 'A';\n            }\n            if (bThis != bThat) {\n                return false;\n            }\n        }\n        pThis ++;\n        pThat ++;\n    }\n    return true;\n}\nvoid CFX_ByteString::AssignCopy(FX_STRSIZE nSrcLen, FX_LPCSTR lpszSrcData)\n{\n    AllocBeforeWrite(nSrcLen);\n    FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen);\n    m_pData->m_nDataLength = nSrcLen;\n    m_pData->m_String[nSrcLen] = 0;\n}\nvoid CFX_ByteString::CopyBeforeWrite()\n{\n    if (m_pData == NULL || m_pData->m_nRefs <= 1) {\n        return;\n    }\n    CFX_StringData* pData = m_pData;\n    m_pData->m_nRefs --;\n    FX_STRSIZE nDataLength = pData->m_nDataLength;\n    m_pData = FX_AllocString(nDataLength);\n    if (m_pData != NULL) {\n        FXSYS_memcpy32(m_pData->m_String, pData->m_String, nDataLength + 1);\n    }\n}\nvoid CFX_ByteString::AllocBeforeWrite(FX_STRSIZE nLen)\n{\n    if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nLen) {\n        return;\n    }\n    Empty();\n    m_pData = FX_AllocString(nLen);\n}\nvoid CFX_ByteString::ReleaseBuffer(FX_STRSIZE nNewLength)\n{\n    if (m_pData == NULL) {\n        return;\n    }\n    CopyBeforeWrite();\n    if (nNewLength == -1) {\n        nNewLength = (FX_STRSIZE)FXSYS_strlen((FX_LPCSTR)m_pData->m_String);\n    }\n    if (nNewLength == 0) {\n        Empty();\n        return;\n    }\n    FXSYS_assert(nNewLength <= m_pData->m_nAllocLength);\n    m_pData->m_nDataLength = nNewLength;\n    m_pData->m_String[nNewLength] = 0;\n}\nFX_LPSTR CFX_ByteString::LockBuffer()\n{\n    if (m_pData == NULL) {\n        return NULL;\n    }\n    FX_LPSTR lpsz = GetBuffer(0);\n    m_pData->m_nRefs = -1;\n    return lpsz;\n}\nvoid CFX_ByteString::Reserve(FX_STRSIZE len)\n{\n    GetBuffer(len);\n    ReleaseBuffer(GetLength());\n}\nFX_LPSTR CFX_ByteString::GetBuffer(FX_STRSIZE nMinBufLength)\n{\n    if (m_pData == NULL && nMinBufLength == 0) {\n        return NULL;\n    }\n    if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nMinBufLength) {\n        return m_pData->m_String;\n    }\n    if (m_pData == NULL) {\n        m_pData = FX_AllocString(nMinBufLength);\n        if (!m_pData) {\n            return NULL;\n        }\n        m_pData->m_nDataLength = 0;\n        m_pData->m_String[0] = 0;\n        return m_pData->m_String;\n    }\n    CFX_StringData* pOldData = m_pData;\n    FX_STRSIZE nOldLen = pOldData->m_nDataLength;\n    if (nMinBufLength < nOldLen) {\n        nMinBufLength = nOldLen;\n    }\n    m_pData = FX_AllocString(nMinBufLength);\n    if (!m_pData) {\n        return NULL;\n    }\n    FXSYS_memcpy32(m_pData->m_String, pOldData->m_String, (nOldLen + 1));\n    m_pData->m_nDataLength = nOldLen;\n    pOldData->m_nRefs --;\n    if (pOldData->m_nRefs <= 0) {\n        FX_Free(pOldData);\n    }\n    return m_pData->m_String;\n}\nFX_STRSIZE CFX_ByteString::Delete(FX_STRSIZE nIndex, FX_STRSIZE nCount)\n{\n    if (m_pData == NULL) {\n        return 0;\n    }\n    if (nIndex < 0) {\n        nIndex = 0;\n    }\n    FX_STRSIZE nOldLength = m_pData->m_nDataLength;\n    if (nCount > 0 && nIndex < nOldLength) {\n        FX_STRSIZE mLength = nIndex + nCount;\n        if (mLength >= nOldLength) {\n            m_pData->m_nDataLength = nIndex;\n            return m_pData->m_nDataLength;\n        }\n        CopyBeforeWrite();\n        int nBytesToCopy = nOldLength - mLength + 1;\n        FXSYS_memmove32(m_pData->m_String + nIndex,\n                        m_pData->m_String + mLength, nBytesToCopy);\n        m_pData->m_nDataLength = nOldLength - nCount;\n    }\n    return m_pData->m_nDataLength;\n}\nvoid CFX_ByteString::ConcatInPlace(FX_STRSIZE nSrcLen, FX_LPCSTR lpszSrcData)\n{\n    if (nSrcLen == 0 || lpszSrcData == NULL) {\n        return;\n    }\n    if (m_pData == NULL) {\n        m_pData = FX_AllocString(nSrcLen);\n        if (!m_pData) {\n            return;\n        }\n        FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen);\n        return;\n    }\n    if (m_pData->m_nRefs > 1 || m_pData->m_nDataLength + nSrcLen > m_pData->m_nAllocLength) {\n        CFX_StringData* pOldData = m_pData;\n        ConcatCopy(m_pData->m_nDataLength, m_pData->m_String, nSrcLen, lpszSrcData);\n        FX_ReleaseString(pOldData);\n    } else {\n        FXSYS_memcpy32(m_pData->m_String + m_pData->m_nDataLength, lpszSrcData, nSrcLen);\n        m_pData->m_nDataLength += nSrcLen;\n        m_pData->m_String[m_pData->m_nDataLength] = 0;\n    }\n}\nvoid CFX_ByteString::ConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCSTR lpszSrc1Data,\n                                FX_STRSIZE nSrc2Len, FX_LPCSTR lpszSrc2Data)\n{\n    int nNewLen = nSrc1Len + nSrc2Len;\n    if (nNewLen == 0) {\n        return;\n    }\n    m_pData = FX_AllocString(nNewLen);\n    if (m_pData) {\n        FXSYS_memcpy32(m_pData->m_String, lpszSrc1Data, nSrc1Len);\n        FXSYS_memcpy32(m_pData->m_String + nSrc1Len, lpszSrc2Data, nSrc2Len);\n    }\n}\nCFX_ByteString CFX_ByteString::Mid(FX_STRSIZE nFirst) const\n{\n    if (m_pData == NULL) {\n        return CFX_ByteString();\n    }\n    return Mid(nFirst, m_pData->m_nDataLength - nFirst);\n}\nCFX_ByteString CFX_ByteString::Mid(FX_STRSIZE nFirst, FX_STRSIZE nCount) const\n{\n    if (nFirst < 0) {\n        nFirst = 0;\n    }\n    if (nCount < 0) {\n        nCount = 0;\n    }\n    if (nFirst + nCount > m_pData->m_nDataLength) {\n        nCount = m_pData->m_nDataLength - nFirst;\n    }\n    if (nFirst > m_pData->m_nDataLength) {\n        nCount = 0;\n    }\n    if (nFirst == 0 && nFirst + nCount == m_pData->m_nDataLength) {\n        return *this;\n    }\n    CFX_ByteString dest;\n    AllocCopy(dest, nCount, nFirst);\n    return dest;\n}\nvoid CFX_ByteString::AllocCopy(CFX_ByteString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex) const\n{\n    // |FX_STRSIZE| is currently typedef'd as in |int|. TODO(palmer): It\n    // should be a |size_t|, or at least unsigned.\n    if (nCopyLen == 0 || nCopyLen < 0) {\n        return;\n    }\n    ASSERT(dest.m_pData == NULL);\n    dest.m_pData = FX_AllocString(nCopyLen);\n    if (dest.m_pData) {\n        FXSYS_memcpy32(dest.m_pData->m_String, m_pData->m_String + nCopyIndex, nCopyLen);\n    }\n}\n#define FORCE_ANSI      0x10000\n#define FORCE_UNICODE   0x20000\n#define FORCE_INT64     0x40000\nvoid CFX_ByteString::FormatV(FX_LPCSTR lpszFormat, va_list argList)\n{\n    va_list argListSave;\n#if defined(__ARMCC_VERSION) || (!defined(_MSC_VER) && (_FX_CPU_ == _FX_X64_ || _FX_CPU_ == _FX_IA64_ || _FX_CPU_ == _FX_ARM64_)) || defined(__native_client__)\n    va_copy(argListSave, argList);\n#else\n    argListSave = argList;\n#endif\n    int nMaxLen = 0;\n    for (FX_LPCSTR lpsz = lpszFormat; *lpsz != 0; lpsz ++) {\n        if (*lpsz != '%' || *(lpsz = lpsz + 1) == '%') {\n            nMaxLen += (FX_STRSIZE)FXSYS_strlen(lpsz);\n            continue;\n        }\n        int nItemLen = 0;\n        int nWidth = 0;\n        for (; *lpsz != 0; lpsz ++) {\n            if (*lpsz == '#') {\n                nMaxLen += 2;\n            } else if (*lpsz == '*') {\n                nWidth = va_arg(argList, int);\n            } else if (*lpsz == '-' || *lpsz == '+' || *lpsz == '0' ||\n                       *lpsz == ' ')\n                ;\n            else {\n                break;\n            }\n        }\n        if (nWidth == 0) {\n            nWidth = FXSYS_atoi(lpsz);\n            for (; (*lpsz) >= '0' && (*lpsz) <= '9'; lpsz ++)\n                ;\n        }\n        if (nWidth < 0 || nWidth > 128 * 1024) {\n            lpszFormat = \"Bad width\";\n            nMaxLen = 10;\n            break;\n        }\n        int nPrecision = 0;\n        if (*lpsz == '.') {\n            lpsz ++;\n            if (*lpsz == '*') {\n                nPrecision = va_arg(argList, int);\n                lpsz ++;\n            } else {\n                nPrecision = FXSYS_atoi(lpsz);\n                for (; (*lpsz) >= '0' && (*lpsz) <= '9'; lpsz ++)\n                    ;\n            }\n        }\n        if (nPrecision < 0 || nPrecision > 128 * 1024) {\n            lpszFormat = \"Bad precision\";\n            nMaxLen = 14;\n            break;\n        }\n        int nModifier = 0;\n        if (FXSYS_strncmp(lpsz, \"I64\", 3) == 0) {\n            lpsz += 3;\n            nModifier = FORCE_INT64;\n        } else {\n            switch (*lpsz) {\n                case 'h':\n                    nModifier = FORCE_ANSI;\n                    lpsz ++;\n                    break;\n                case 'l':\n                    nModifier = FORCE_UNICODE;\n                    lpsz ++;\n                    break;\n                case 'F':\n                case 'N':\n                case 'L':\n                    lpsz ++;\n                    break;\n            }\n        }\n        switch (*lpsz | nModifier) {\n            case 'c':\n            case 'C':\n                nItemLen = 2;\n                va_arg(argList, int);\n                break;\n            case 'c'|FORCE_ANSI:\n            case 'C'|FORCE_ANSI:\n                nItemLen = 2;\n                va_arg(argList, int);\n                break;\n            case 'c'|FORCE_UNICODE:\n            case 'C'|FORCE_UNICODE:\n                nItemLen = 2;\n                va_arg(argList, int);\n                break;\n            case 's': {\n                    FX_LPCSTR pstrNextArg = va_arg(argList, FX_LPCSTR);\n                    if (pstrNextArg == NULL) {\n                        nItemLen = 6;\n                    } else {\n                        nItemLen = (FX_STRSIZE)FXSYS_strlen(pstrNextArg);\n                        if (nItemLen < 1) {\n                            nItemLen = 1;\n                        }\n                    }\n                }\n                break;\n            case 'S': {\n                    FX_LPWSTR pstrNextArg = va_arg(argList, FX_LPWSTR);\n                    if (pstrNextArg == NULL) {\n                        nItemLen = 6;\n                    } else {\n                        nItemLen = (FX_STRSIZE)FXSYS_wcslen(pstrNextArg);\n                        if (nItemLen < 1) {\n                            nItemLen = 1;\n                        }\n                    }\n                }\n                break;\n            case 's'|FORCE_ANSI:\n            case 'S'|FORCE_ANSI: {\n                    FX_LPCSTR pstrNextArg = va_arg(argList, FX_LPCSTR);\n                    if (pstrNextArg == NULL) {\n                        nItemLen = 6;\n                    } else {\n                        nItemLen = (FX_STRSIZE)FXSYS_strlen(pstrNextArg);\n                        if (nItemLen < 1) {\n                            nItemLen = 1;\n                        }\n                    }\n                }\n                break;\n            case 's'|FORCE_UNICODE:\n            case 'S'|FORCE_UNICODE: {\n                    FX_LPWSTR pstrNextArg = va_arg(argList, FX_LPWSTR);\n                    if (pstrNextArg == NULL) {\n                        nItemLen = 6;\n                    } else {\n                        nItemLen = (FX_STRSIZE)FXSYS_wcslen(pstrNextArg);\n                        if (nItemLen < 1) {\n                            nItemLen = 1;\n                        }\n                    }\n                }\n                break;\n        }\n        if (nItemLen != 0) {\n            if (nPrecision != 0 && nItemLen > nPrecision) {\n                nItemLen = nPrecision;\n            }\n            if (nItemLen < nWidth) {\n                nItemLen = nWidth;\n            }\n        } else {\n            switch (*lpsz) {\n                case 'd':\n                case 'i':\n                case 'u':\n                case 'x':\n                case 'X':\n                case 'o':\n                    if (nModifier & FORCE_INT64) {\n                        va_arg(argList, FX_INT64);\n                    } else {\n                        va_arg(argList, int);\n                    }\n                    nItemLen = 32;\n                    if (nItemLen < nWidth + nPrecision) {\n                        nItemLen = nWidth + nPrecision;\n                    }\n                    break;\n                case 'a':\n                case 'A':\n                case 'e':\n                case 'E':\n                case 'g':\n                case 'G':\n                    va_arg(argList, double);\n                    nItemLen = 128;\n                    if (nItemLen < nWidth + nPrecision) {\n                        nItemLen = nWidth + nPrecision;\n                    }\n                    break;\n                case 'f':\n                    if (nWidth + nPrecision > 100) {\n                        nItemLen = nPrecision + nWidth + 128;\n                    } else {\n                        double f;\n                        char pszTemp[256];\n                        f = va_arg(argList, double);\n                        FXSYS_sprintf(pszTemp, \"%*.*f\", nWidth, nPrecision + 6, f );\n                        nItemLen = (FX_STRSIZE)FXSYS_strlen(pszTemp);\n                    }\n                    break;\n                case 'p':\n                    va_arg(argList, void*);\n                    nItemLen = 32;\n                    if (nItemLen < nWidth + nPrecision) {\n                        nItemLen = nWidth + nPrecision;\n                    }\n                    break;\n                case 'n':\n                    va_arg(argList, int*);\n                    break;\n            }\n        }\n        nMaxLen += nItemLen;\n    }\n    GetBuffer(nMaxLen);\n    if (m_pData) {\n        FXSYS_vsprintf(m_pData->m_String, lpszFormat, argListSave);\n        ReleaseBuffer();\n    }\n    va_end(argListSave);\n}\nvoid CFX_ByteString::Format(FX_LPCSTR lpszFormat, ...)\n{\n    va_list argList;\n    va_start(argList, lpszFormat);\n    FormatV(lpszFormat, argList);\n    va_end(argList);\n}\nFX_STRSIZE CFX_ByteString::Insert(FX_STRSIZE nIndex, FX_CHAR ch)\n{\n    CopyBeforeWrite();\n    if (nIndex < 0) {\n        nIndex = 0;\n    }\n    FX_STRSIZE nNewLength = m_pData ? m_pData->m_nDataLength : 0;\n    if (nIndex > nNewLength) {\n        nIndex = nNewLength;\n    }\n    nNewLength++;\n    if (m_pData == NULL || m_pData->m_nAllocLength < nNewLength) {\n        CFX_StringData* pOldData = m_pData;\n        FX_LPCSTR pstr = m_pData->m_String;\n        m_pData = FX_AllocString(nNewLength);\n        if (!m_pData) {\n            return 0;\n        }\n        if(pOldData != NULL) {\n            FXSYS_memmove32(m_pData->m_String, pstr, (pOldData->m_nDataLength + 1));\n            FX_ReleaseString(pOldData);\n        } else {\n            m_pData->m_String[0] = 0;\n        }\n    }\n    FXSYS_memmove32(m_pData->m_String + nIndex + 1,\n                    m_pData->m_String + nIndex, (nNewLength - nIndex));\n    m_pData->m_String[nIndex] = ch;\n    m_pData->m_nDataLength = nNewLength;\n    return nNewLength;\n}\nCFX_ByteString CFX_ByteString::Right(FX_STRSIZE nCount) const\n{\n    if (m_pData == NULL) {\n        return CFX_ByteString();\n    }\n    if (nCount < 0) {\n        nCount = 0;\n    }\n    if (nCount >= m_pData->m_nDataLength) {\n        return *this;\n    }\n    CFX_ByteString dest;\n    AllocCopy(dest, nCount, m_pData->m_nDataLength - nCount);\n    return dest;\n}\nCFX_ByteString CFX_ByteString::Left(FX_STRSIZE nCount) const\n{\n    if (m_pData == NULL) {\n        return CFX_ByteString();\n    }\n    if (nCount < 0) {\n        nCount = 0;\n    }\n    if (nCount >= m_pData->m_nDataLength) {\n        return *this;\n    }\n    CFX_ByteString dest;\n    AllocCopy(dest, nCount, 0);\n    return dest;\n}\nFX_STRSIZE CFX_ByteString::Find(FX_CHAR ch, FX_STRSIZE nStart) const\n{\n    if (m_pData == NULL) {\n        return -1;\n    }\n    FX_STRSIZE nLength = m_pData->m_nDataLength;\n    if (nStart >= nLength) {\n        return -1;\n    }\n    FX_LPCSTR lpsz = FXSYS_strchr(m_pData->m_String + nStart, ch);\n    return (lpsz == NULL) ? -1 : (int)(lpsz - m_pData->m_String);\n}\nFX_STRSIZE CFX_ByteString::ReverseFind(FX_CHAR ch) const\n{\n    if (m_pData == NULL) {\n        return -1;\n    }\n    FX_STRSIZE nLength = m_pData->m_nDataLength;\n    while (nLength) {\n        if (m_pData->m_String[nLength - 1] == ch) {\n            return nLength - 1;\n        }\n        nLength --;\n    }\n    return -1;\n}\nFX_LPCSTR FX_strstr(FX_LPCSTR str1, int len1, FX_LPCSTR str2, int len2)\n{\n    if (len2 > len1 || len2 == 0) {\n        return NULL;\n    }\n    FX_LPCSTR end_ptr = str1 + len1 - len2;\n    while (str1 <= end_ptr) {\n        int i = 0;\n        while (1) {\n            if (str1[i] != str2[i]) {\n                break;\n            }\n            i ++;\n            if (i == len2) {\n                return str1;\n            }\n        }\n        str1 ++;\n    }\n    return NULL;\n}\nFX_STRSIZE CFX_ByteString::Find(FX_BSTR lpszSub, FX_STRSIZE nStart) const\n{\n    if (m_pData == NULL) {\n        return -1;\n    }\n    FX_STRSIZE nLength = m_pData->m_nDataLength;\n    if (nStart > nLength) {\n        return -1;\n    }\n    FX_LPCSTR lpsz = FX_strstr(m_pData->m_String + nStart, m_pData->m_nDataLength - nStart,\n                               lpszSub.GetCStr(), lpszSub.GetLength());\n    return (lpsz == NULL) ? -1 : (int)(lpsz - m_pData->m_String);\n}\nvoid CFX_ByteString::MakeLower()\n{\n    if (m_pData == NULL) {\n        return;\n    }\n    CopyBeforeWrite();\n    if (GetLength() < 1) {\n        return;\n    }\n    FXSYS_strlwr(m_pData->m_String);\n}\nvoid CFX_ByteString::MakeUpper()\n{\n    if (m_pData == NULL) {\n        return;\n    }\n    CopyBeforeWrite();\n    if (GetLength() < 1) {\n        return;\n    }\n    FXSYS_strupr(m_pData->m_String);\n}\nFX_STRSIZE CFX_ByteString::Remove(FX_CHAR chRemove)\n{\n    if (m_pData == NULL) {\n        return 0;\n    }\n    CopyBeforeWrite();\n    if (GetLength() < 1) {\n        return 0;\n    }\n    FX_LPSTR pstrSource = m_pData->m_String;\n    FX_LPSTR pstrDest = m_pData->m_String;\n    FX_LPSTR pstrEnd = m_pData->m_String + m_pData->m_nDataLength;\n    while (pstrSource < pstrEnd) {\n        if (*pstrSource != chRemove) {\n            *pstrDest = *pstrSource;\n            pstrDest ++;\n        }\n        pstrSource ++;\n    }\n    *pstrDest = 0;\n    FX_STRSIZE nCount = (FX_STRSIZE)(pstrSource - pstrDest);\n    m_pData->m_nDataLength -= nCount;\n    return nCount;\n}\nFX_STRSIZE CFX_ByteString::Replace(FX_BSTR lpszOld, FX_BSTR lpszNew)\n{\n    if (m_pData == NULL) {\n        return 0;\n    }\n    if (lpszOld.IsEmpty()) {\n        return 0;\n    }\n    FX_STRSIZE nSourceLen = lpszOld.GetLength();\n    FX_STRSIZE nReplacementLen = lpszNew.GetLength();\n    FX_STRSIZE nCount = 0;\n    FX_LPCSTR pStart = m_pData->m_String;\n    FX_LPSTR pEnd = m_pData->m_String + m_pData->m_nDataLength;\n    while (1) {\n        FX_LPCSTR pTarget = FX_strstr(pStart, (FX_STRSIZE)(pEnd - pStart), lpszOld.GetCStr(), nSourceLen);\n        if (pTarget == NULL) {\n            break;\n        }\n        nCount++;\n        pStart = pTarget + nSourceLen;\n    }\n    if (nCount == 0) {\n        return 0;\n    }\n    FX_STRSIZE nNewLength =  m_pData->m_nDataLength + (nReplacementLen - nSourceLen) * nCount;\n    if (nNewLength == 0) {\n        Empty();\n        return nCount;\n    }\n    CFX_StringData* pNewData = FX_AllocString(nNewLength);\n    if (!pNewData) {\n        return 0;\n    }\n    pStart = m_pData->m_String;\n    FX_LPSTR pDest = pNewData->m_String;\n    for (FX_STRSIZE i = 0; i < nCount; i ++) {\n        FX_LPCSTR pTarget = FX_strstr(pStart, (FX_STRSIZE)(pEnd - pStart), lpszOld.GetCStr(), nSourceLen);\n        FXSYS_memcpy32(pDest, pStart, pTarget - pStart);\n        pDest += pTarget - pStart;\n        FXSYS_memcpy32(pDest, lpszNew.GetCStr(), lpszNew.GetLength());\n        pDest += lpszNew.GetLength();\n        pStart = pTarget + nSourceLen;\n    }\n    FXSYS_memcpy32(pDest, pStart, pEnd - pStart);\n    FX_ReleaseString(m_pData);\n    m_pData = pNewData;\n    return nCount;\n}\nvoid CFX_ByteString::SetAt(FX_STRSIZE nIndex, FX_CHAR ch)\n{\n    if (m_pData == NULL) {\n        return;\n    }\n    FXSYS_assert(nIndex >= 0);\n    FXSYS_assert(nIndex < m_pData->m_nDataLength);\n    CopyBeforeWrite();\n    m_pData->m_String[nIndex] = ch;\n}\nCFX_ByteString CFX_ByteString::LoadFromFile(FX_BSTR filename)\n{\n    FXSYS_FILE* file = FXSYS_fopen(CFX_ByteString(filename), \"rb\");\n    if (file == NULL) {\n        return CFX_ByteString();\n    }\n    FXSYS_fseek(file, 0, FXSYS_SEEK_END);\n    int len = FXSYS_ftell(file);\n    FXSYS_fseek(file, 0, FXSYS_SEEK_SET);\n    CFX_ByteString str;\n    FX_LPSTR buf = str.GetBuffer(len);\n    size_t readCnt = FXSYS_fread(buf, 1, len, file);\n    str.ReleaseBuffer(len);\n    FXSYS_fclose(file);\n    return str;\n}\nCFX_WideString CFX_ByteString::UTF8Decode() const\n{\n    CFX_UTF8Decoder decoder;\n    for (FX_STRSIZE i = 0; i < GetLength(); i ++) {\n        decoder.Input((FX_BYTE)m_pData->m_String[i]);\n    }\n    return decoder.GetResult();\n}\nCFX_ByteString CFX_ByteString::FromUnicode(FX_LPCWSTR str, FX_STRSIZE len)\n{\n    if (len < 0) {\n        len = (FX_STRSIZE)FXSYS_wcslen(str);\n    }\n    CFX_ByteString bstr;\n    bstr.ConvertFrom(CFX_WideString(str, len));\n    return bstr;\n}\nCFX_ByteString CFX_ByteString::FromUnicode(const CFX_WideString& str)\n{\n    return FromUnicode((FX_LPCWSTR)str, str.GetLength());\n}\nvoid CFX_ByteString::ConvertFrom(const CFX_WideString& str, CFX_CharMap* pCharMap)\n{\n    if (pCharMap == NULL) {\n        pCharMap = CFX_CharMap::GetDefaultMapper();\n    }\n    *this = (*pCharMap->m_GetByteString)(pCharMap, str);\n}\nint CFX_ByteString::Compare(FX_BSTR str) const\n{\n    if (m_pData == NULL) {\n        return str.IsEmpty() ? 0 : -1;\n    }\n    int this_len = m_pData->m_nDataLength;\n    int that_len = str.GetLength();\n    int min_len = this_len < that_len ? this_len : that_len;\n    for (int i = 0; i < min_len; i ++) {\n        if ((FX_BYTE)m_pData->m_String[i] < str.GetAt(i)) {\n            return -1;\n        } else if ((FX_BYTE)m_pData->m_String[i] > str.GetAt(i)) {\n            return 1;\n        }\n    }\n    if (this_len < that_len) {\n        return -1;\n    } else if (this_len > that_len) {\n        return 1;\n    }\n    return 0;\n}\nvoid CFX_ByteString::TrimRight(FX_BSTR lpszTargets)\n{\n    if (m_pData == NULL || lpszTargets.IsEmpty()) {\n        return;\n    }\n    CopyBeforeWrite();\n    FX_STRSIZE pos = GetLength();\n    if (pos < 1) {\n        return;\n    }\n    while (pos) {\n        FX_STRSIZE i = 0;\n        while (i < lpszTargets.GetLength() && lpszTargets[i] != m_pData->m_String[pos - 1]) {\n            i ++;\n        }\n        if (i == lpszTargets.GetLength()) {\n            break;\n        }\n        pos --;\n    }\n    if (pos < m_pData->m_nDataLength) {\n        m_pData->m_String[pos] = 0;\n        m_pData->m_nDataLength = pos;\n    }\n}\nvoid CFX_ByteString::TrimRight(FX_CHAR chTarget)\n{\n    TrimRight(CFX_ByteStringC(chTarget));\n}\nvoid CFX_ByteString::TrimRight()\n{\n    TrimRight(FX_BSTRC(\"\\x09\\x0a\\x0b\\x0c\\x0d\\x20\"));\n}\nvoid CFX_ByteString::TrimLeft(FX_BSTR lpszTargets)\n{\n    if (m_pData == NULL) {\n        return;\n    }\n    if (lpszTargets.IsEmpty()) {\n        return;\n    }\n    CopyBeforeWrite();\n    FX_STRSIZE len = GetLength();\n    if (len < 1) {\n        return;\n    }\n    FX_STRSIZE pos = 0;\n    while (pos < len) {\n        FX_STRSIZE i = 0;\n        while (i < lpszTargets.GetLength() && lpszTargets[i] != m_pData->m_String[pos]) {\n            i ++;\n        }\n        if (i == lpszTargets.GetLength()) {\n            break;\n        }\n        pos ++;\n    }\n    if (pos) {\n        FX_STRSIZE nDataLength = len - pos;\n        FXSYS_memmove32(m_pData->m_String, m_pData->m_String + pos, (nDataLength + 1)*sizeof(FX_CHAR));\n        m_pData->m_nDataLength = nDataLength;\n    }\n}\nvoid CFX_ByteString::TrimLeft(FX_CHAR chTarget)\n{\n    TrimLeft(CFX_ByteStringC(chTarget));\n}\nvoid CFX_ByteString::TrimLeft()\n{\n    TrimLeft(FX_BSTRC(\"\\x09\\x0a\\x0b\\x0c\\x0d\\x20\"));\n}\nFX_DWORD CFX_ByteString::GetID(FX_STRSIZE start_pos) const\n{\n    return CFX_ByteStringC(*this).GetID(start_pos);\n}\nFX_DWORD CFX_ByteStringC::GetID(FX_STRSIZE start_pos) const\n{\n    if (m_Length == 0) {\n        return 0;\n    }\n    if (start_pos >= m_Length) {\n        return 0;\n    }\n    FX_DWORD strid = 0;\n    if (start_pos + 4 > m_Length) {\n        for (FX_STRSIZE i = 0; i < m_Length - start_pos; i ++) {\n            strid = strid * 256 + m_Ptr[start_pos + i];\n        }\n        strid = strid << ((4 - m_Length + start_pos) * 8);\n    } else {\n        for (int i = 0; i < 4; i ++) {\n            strid = strid * 256 + m_Ptr[start_pos + i];\n        }\n    }\n    return strid;\n}\nFX_STRSIZE FX_ftoa(FX_FLOAT d, FX_LPSTR buf)\n{\n    buf[0] = '0';\n    buf[1] = '\\0';\n    if (d == 0.0f) {\n        return 1;\n    }\n    FX_BOOL bNegative = FALSE;\n    if (d < 0) {\n        bNegative = TRUE;\n        d = -d;\n    }\n    int scale = 1;\n    int scaled = FXSYS_round(d);\n    while (scaled < 100000) {\n        if (scale == 1000000) {\n            break;\n        }\n        scale *= 10;\n        scaled = FXSYS_round(d * scale);\n    }\n    if (scaled == 0) {\n        return 1;\n    }\n    char buf2[32];\n    int buf_size = 0;\n    if (bNegative) {\n        buf[buf_size++] = '-';\n    }\n    int i = scaled / scale;\n    FXSYS_itoa(i, buf2, 10);\n    FX_STRSIZE len = (FX_STRSIZE)FXSYS_strlen(buf2);\n    FXSYS_memcpy32(buf + buf_size, buf2, len);\n    buf_size += len;\n    int fraction = scaled % scale;\n    if (fraction == 0) {\n        return buf_size;\n    }\n    buf[buf_size++] = '.';\n    scale /= 10;\n    while (fraction) {\n        buf[buf_size++] = '0' + fraction / scale;\n        fraction %= scale;\n        scale /= 10;\n    }\n    return buf_size;\n}\nCFX_ByteString CFX_ByteString::FormatFloat(FX_FLOAT d, int precision)\n{\n    FX_CHAR buf[32];\n    FX_STRSIZE len = FX_ftoa(d, buf);\n    return CFX_ByteString(buf, len);\n}\nvoid CFX_StringBufBase::Copy(FX_BSTR str)\n{\n    m_Size = str.GetLength();\n    if (m_Size > m_Limit) {\n        m_Size = m_Limit;\n    }\n    FX_CHAR* pBuffer = (FX_CHAR*)(this + 1);\n    FXSYS_memcpy32(pBuffer, str.GetPtr(), m_Size);\n}\nvoid CFX_StringBufBase::Append(FX_BSTR str)\n{\n    int len = str.GetLength();\n    if (len > m_Limit - m_Size) {\n        len = m_Limit - m_Size;\n    }\n    FX_CHAR* pBuffer = (FX_CHAR*)(this + 1);\n    FXSYS_memcpy32(pBuffer + m_Size, str.GetPtr(), len);\n    m_Size += len;\n}\nvoid CFX_StringBufBase::Append(int i, FX_DWORD flags)\n{\n    char buf[32];\n    int len = _Buffer_itoa(buf, i, flags);\n    Append(CFX_ByteStringC(buf, len));\n}\n"
  },
  {
    "path": "core/src/fxcrt/fx_basic_buffer.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxcrt/fx_basic.h\"\nFX_STRSIZE FX_ftoa(FX_FLOAT f, FX_LPSTR buf);\nCFX_BinaryBuf::CFX_BinaryBuf()\n    : m_AllocStep(0)\n    , m_pBuffer(NULL)\n    , m_DataSize(0)\n    , m_AllocSize(0)\n{\n}\nCFX_BinaryBuf::CFX_BinaryBuf(FX_STRSIZE size)\n    : m_AllocStep(0)\n    , m_DataSize(size)\n    , m_AllocSize(size)\n{\n    m_pBuffer = FX_Alloc(FX_BYTE, size);\n}\nCFX_BinaryBuf::~CFX_BinaryBuf()\n{\n    if (m_pBuffer) {\n        FX_Free(m_pBuffer);\n    }\n}\nvoid CFX_BinaryBuf::Delete(int start_index, int count)\n{\n    if (!m_pBuffer || start_index < 0 || start_index + count > m_DataSize) {\n        return;\n    }\n    FXSYS_memmove32(m_pBuffer + start_index, m_pBuffer + start_index + count, m_DataSize - start_index - count);\n    m_DataSize -= count;\n}\nvoid CFX_BinaryBuf::Clear()\n{\n    m_DataSize = 0;\n}\nvoid CFX_BinaryBuf::DetachBuffer()\n{\n    m_DataSize = 0;\n    m_pBuffer = NULL;\n    m_AllocSize = 0;\n}\nvoid CFX_BinaryBuf::AttachData(void* buffer, FX_STRSIZE size)\n{\n    if (m_pBuffer) {\n        FX_Free(m_pBuffer);\n    }\n    m_DataSize = size;\n    m_pBuffer = (FX_LPBYTE)buffer;\n    m_AllocSize = size;\n}\nvoid CFX_BinaryBuf::TakeOver(CFX_BinaryBuf& other)\n{\n    AttachData(other.GetBuffer(), other.GetSize());\n    other.DetachBuffer();\n}\nvoid CFX_BinaryBuf::EstimateSize(FX_STRSIZE size, FX_STRSIZE step)\n{\n    m_AllocStep = step;\n    if (m_AllocSize >= size) {\n        return;\n    }\n    ExpandBuf(size - m_DataSize);\n}\nvoid CFX_BinaryBuf::ExpandBuf(FX_STRSIZE add_size)\n{\n    FX_STRSIZE new_size = add_size + m_DataSize;\n    if (m_AllocSize >= new_size) {\n        return;\n    }\n    int alloc_step;\n    if (m_AllocStep == 0) {\n        alloc_step = m_AllocSize / 4;\n        if (alloc_step < 128 ) {\n            alloc_step = 128;\n        }\n    } else {\n        alloc_step = m_AllocStep;\n    }\n    new_size = (new_size + alloc_step - 1) / alloc_step * alloc_step;\n    FX_LPBYTE pNewBuffer = m_pBuffer;\n    if (pNewBuffer) {\n        pNewBuffer = FX_Realloc(FX_BYTE, m_pBuffer, new_size);\n    } else {\n        pNewBuffer = FX_Alloc(FX_BYTE, new_size);\n    }\n    if (pNewBuffer) {\n        m_pBuffer = pNewBuffer;\n        m_AllocSize = new_size;\n    }\n}\nvoid CFX_BinaryBuf::CopyData(const void* pStr, FX_STRSIZE size)\n{\n    if (size == 0) {\n        m_DataSize = 0;\n        return;\n    }\n    if (m_AllocSize < size) {\n        ExpandBuf(size - m_DataSize);\n    }\n    if (!m_pBuffer) {\n        return;\n    }\n    FXSYS_memcpy32(m_pBuffer, pStr, size);\n    m_DataSize = size;\n}\nvoid CFX_BinaryBuf::AppendBlock(const void* pBuf, FX_STRSIZE size)\n{\n    ExpandBuf(size);\n    if (pBuf && m_pBuffer) {\n        FXSYS_memcpy32(m_pBuffer + m_DataSize, pBuf, size);\n    }\n    m_DataSize += size;\n}\nvoid CFX_BinaryBuf::InsertBlock(FX_STRSIZE pos, const void* pBuf, FX_STRSIZE size)\n{\n    ExpandBuf(size);\n    if (!m_pBuffer) {\n        return;\n    }\n    FXSYS_memmove32(m_pBuffer + pos + size, m_pBuffer + pos, m_DataSize - pos);\n    if (pBuf) {\n        FXSYS_memcpy32(m_pBuffer + pos, pBuf, size);\n    }\n    m_DataSize += size;\n}\nvoid CFX_BinaryBuf::AppendFill(FX_BYTE byte, FX_STRSIZE count)\n{\n    ExpandBuf(count);\n    if (!m_pBuffer) {\n        return;\n    }\n    FXSYS_memset8(m_pBuffer + m_DataSize, byte, count);\n    m_DataSize += count;\n}\nCFX_ByteStringC CFX_BinaryBuf::GetByteString() const\n{\n    return CFX_ByteStringC(m_pBuffer, m_DataSize);\n}\nCFX_ByteTextBuf& CFX_ByteTextBuf::operator << (FX_BSTR lpsz)\n{\n    AppendBlock((FX_LPCBYTE)lpsz, lpsz.GetLength());\n    return *this;\n}\nCFX_ByteTextBuf& CFX_ByteTextBuf::operator << (int i)\n{\n    char buf[32];\n    FXSYS_itoa(i, buf, 10);\n    AppendBlock(buf, (FX_STRSIZE)FXSYS_strlen(buf));\n    return *this;\n}\nCFX_ByteTextBuf& CFX_ByteTextBuf::operator << (FX_DWORD i)\n{\n    char buf[32];\n    FXSYS_itoa(i, buf, 10);\n    AppendBlock(buf, (FX_STRSIZE)FXSYS_strlen(buf));\n    return *this;\n}\nCFX_ByteTextBuf& CFX_ByteTextBuf::operator << (double f)\n{\n    char buf[32];\n    FX_STRSIZE len = FX_ftoa((FX_FLOAT)f, buf);\n    AppendBlock(buf, len);\n    return *this;\n}\nCFX_ByteTextBuf& CFX_ByteTextBuf::operator << (const CFX_ByteTextBuf& buf)\n{\n    AppendBlock(buf.m_pBuffer, buf.m_DataSize);\n    return *this;\n}\nvoid CFX_ByteTextBuf::operator =(const CFX_ByteStringC& str)\n{\n    CopyData((FX_LPCBYTE)str, str.GetLength());\n}\nvoid CFX_WideTextBuf::AppendChar(FX_WCHAR ch)\n{\n    if (m_AllocSize < m_DataSize + (FX_STRSIZE)sizeof(FX_WCHAR)) {\n        ExpandBuf(sizeof(FX_WCHAR));\n    }\n    ASSERT(m_pBuffer != NULL);\n    *(FX_WCHAR*)(m_pBuffer + m_DataSize) = ch;\n    m_DataSize += sizeof(FX_WCHAR);\n}\nCFX_WideTextBuf& CFX_WideTextBuf::operator << (FX_WSTR str)\n{\n    AppendBlock(str.GetPtr(), str.GetLength() * sizeof(FX_WCHAR));\n    return *this;\n}\nCFX_WideTextBuf& CFX_WideTextBuf::operator << (const CFX_WideString &str)\n{\n    AppendBlock((FX_LPCWSTR)str, str.GetLength() * sizeof(FX_WCHAR));\n    return *this;\n}\nCFX_WideTextBuf& CFX_WideTextBuf::operator << (int i)\n{\n    char buf[32];\n    FXSYS_itoa(i, buf, 10);\n    FX_STRSIZE len = (FX_STRSIZE)FXSYS_strlen(buf);\n    if (m_AllocSize < m_DataSize + (FX_STRSIZE)(len * sizeof(FX_WCHAR))) {\n        ExpandBuf(len * sizeof(FX_WCHAR));\n    }\n    ASSERT(m_pBuffer != NULL);\n    FX_LPWSTR str = (FX_WCHAR*)(m_pBuffer + m_DataSize);\n    for (FX_STRSIZE j = 0; j < len; j ++) {\n        *str ++ = buf[j];\n    }\n    m_DataSize += len * sizeof(FX_WCHAR);\n    return *this;\n}\nCFX_WideTextBuf& CFX_WideTextBuf::operator << (double f)\n{\n    char buf[32];\n    FX_STRSIZE len = FX_ftoa((FX_FLOAT)f, buf);\n    if (m_AllocSize < m_DataSize + (FX_STRSIZE)(len * sizeof(FX_WCHAR))) {\n        ExpandBuf(len * sizeof(FX_WCHAR));\n    }\n    ASSERT(m_pBuffer != NULL);\n    FX_LPWSTR str = (FX_WCHAR*)(m_pBuffer + m_DataSize);\n    for (FX_STRSIZE i = 0; i < len; i ++) {\n        *str ++ = buf[i];\n    }\n    m_DataSize += len * sizeof(FX_WCHAR);\n    return *this;\n}\nCFX_WideTextBuf& CFX_WideTextBuf::operator << (FX_LPCWSTR lpsz)\n{\n    AppendBlock(lpsz, (FX_STRSIZE)FXSYS_wcslen(lpsz)*sizeof(FX_WCHAR));\n    return *this;\n}\nCFX_WideTextBuf& CFX_WideTextBuf::operator << (const CFX_WideTextBuf& buf)\n{\n    AppendBlock(buf.m_pBuffer, buf.m_DataSize);\n    return *this;\n}\nvoid CFX_WideTextBuf::operator =(FX_WSTR str)\n{\n    CopyData(str.GetPtr(), str.GetLength() * sizeof(FX_WCHAR));\n}\nCFX_WideStringC CFX_WideTextBuf::GetWideString() const\n{\n    return CFX_WideStringC((FX_LPCWSTR)m_pBuffer, m_DataSize / sizeof(FX_WCHAR));\n}\nCFX_ArchiveSaver& CFX_ArchiveSaver::operator << (FX_BYTE i)\n{\n    if (m_pStream) {\n        m_pStream->WriteBlock(&i, 1);\n    } else {\n        m_SavingBuf.AppendByte(i);\n    }\n    return *this;\n}\nCFX_ArchiveSaver& CFX_ArchiveSaver::operator << (int i)\n{\n    if (m_pStream) {\n        m_pStream->WriteBlock(&i, sizeof(int));\n    } else {\n        m_SavingBuf.AppendBlock(&i, sizeof(int));\n    }\n    return *this;\n}\nCFX_ArchiveSaver& CFX_ArchiveSaver::operator << (FX_DWORD i)\n{\n    if (m_pStream) {\n        m_pStream->WriteBlock(&i, sizeof(FX_DWORD));\n    } else {\n        m_SavingBuf.AppendBlock(&i, sizeof(FX_DWORD));\n    }\n    return *this;\n}\nCFX_ArchiveSaver& CFX_ArchiveSaver::operator << (FX_FLOAT f)\n{\n    if (m_pStream) {\n        m_pStream->WriteBlock(&f, sizeof(FX_FLOAT));\n    } else {\n        m_SavingBuf.AppendBlock(&f, sizeof(FX_FLOAT));\n    }\n    return *this;\n}\nCFX_ArchiveSaver& CFX_ArchiveSaver::operator << (FX_BSTR bstr)\n{\n    int len = bstr.GetLength();\n    if (m_pStream) {\n        m_pStream->WriteBlock(&len, sizeof(int));\n        m_pStream->WriteBlock(bstr, len);\n    } else {\n        m_SavingBuf.AppendBlock(&len, sizeof(int));\n        m_SavingBuf.AppendBlock(bstr, len);\n    }\n    return *this;\n}\nCFX_ArchiveSaver& CFX_ArchiveSaver::operator << (FX_LPCWSTR wstr)\n{\n    FX_STRSIZE len = (FX_STRSIZE)FXSYS_wcslen(wstr);\n    if (m_pStream) {\n        m_pStream->WriteBlock(&len, sizeof(int));\n        m_pStream->WriteBlock(wstr, len);\n    } else {\n        m_SavingBuf.AppendBlock(&len, sizeof(int));\n        m_SavingBuf.AppendBlock(wstr, len);\n    }\n    return *this;\n}\nCFX_ArchiveSaver& CFX_ArchiveSaver::operator << (const CFX_WideString& wstr)\n{\n    CFX_ByteString encoded = wstr.UTF16LE_Encode();\n    return operator << (encoded);\n}\nvoid CFX_ArchiveSaver::Write(const void* pData, FX_STRSIZE dwSize)\n{\n    if (m_pStream) {\n        m_pStream->WriteBlock(pData, dwSize);\n    } else {\n        m_SavingBuf.AppendBlock(pData, dwSize);\n    }\n}\nCFX_ArchiveLoader::CFX_ArchiveLoader(FX_LPCBYTE pData, FX_DWORD dwSize)\n{\n    m_pLoadingBuf = pData;\n    m_LoadingPos = 0;\n    m_LoadingSize = dwSize;\n}\nFX_BOOL CFX_ArchiveLoader::IsEOF()\n{\n    return m_LoadingPos >= m_LoadingSize;\n}\nCFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (FX_BYTE& i)\n{\n    if (m_LoadingPos >= m_LoadingSize) {\n        return *this;\n    }\n    i = m_pLoadingBuf[m_LoadingPos++];\n    return *this;\n}\nCFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (int& i)\n{\n    Read(&i, sizeof(int));\n    return *this;\n}\nCFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (FX_DWORD& i)\n{\n    Read(&i, sizeof(FX_DWORD));\n    return *this;\n}\nCFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (FX_FLOAT& i)\n{\n    Read(&i, sizeof(FX_FLOAT));\n    return *this;\n}\nCFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (CFX_ByteString& str)\n{\n    if (m_LoadingPos + 4 > m_LoadingSize) {\n        return *this;\n    }\n    int len;\n    operator >> (len);\n    str.Empty();\n    if (len <= 0 || m_LoadingPos + len > m_LoadingSize) {\n        return *this;\n    }\n    FX_LPSTR buffer = str.GetBuffer(len);\n    FXSYS_memcpy32(buffer, m_pLoadingBuf + m_LoadingPos, len);\n    str.ReleaseBuffer(len);\n    m_LoadingPos += len;\n    return *this;\n}\nCFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (CFX_WideString& str)\n{\n    CFX_ByteString encoded;\n    operator >> (encoded);\n    str = CFX_WideString::FromUTF16LE((const unsigned short*)(FX_LPCSTR)encoded, encoded.GetLength());\n    return *this;\n}\nFX_BOOL CFX_ArchiveLoader::Read(void* pBuf, FX_DWORD dwSize)\n{\n    if (m_LoadingPos + dwSize > m_LoadingSize) {\n        return FALSE;\n    }\n    FXSYS_memcpy32(pBuf, m_pLoadingBuf + m_LoadingPos, dwSize);\n    m_LoadingPos += dwSize;\n    return TRUE;\n}\nvoid CFX_BitStream::Init(FX_LPCBYTE pData, FX_DWORD dwSize)\n{\n    m_pData = pData;\n    m_BitSize = dwSize * 8;\n    m_BitPos = 0;\n}\nvoid CFX_BitStream::ByteAlign()\n{\n    int mod = m_BitPos % 8;\n    if (mod == 0) {\n        return;\n    }\n    m_BitPos += 8 - mod;\n}\nFX_DWORD CFX_BitStream::GetBits(FX_DWORD nBits)\n{\n    if (nBits > m_BitSize || m_BitPos + nBits > m_BitSize) {\n        return 0;\n    }\n    if (nBits == 1) {\n        int bit = (m_pData[m_BitPos / 8] & (1 << (7 - m_BitPos % 8))) ? 1 : 0;\n        m_BitPos ++;\n        return bit;\n    }\n    FX_DWORD byte_pos = m_BitPos / 8;\n    FX_DWORD bit_pos = m_BitPos % 8, bit_left = nBits;\n    FX_DWORD result = 0;\n    if (bit_pos) {\n        if (8 - bit_pos >= bit_left) {\n            result = (m_pData[byte_pos] & (0xff >> bit_pos)) >> (8 - bit_pos - bit_left);\n            m_BitPos += bit_left;\n            return result;\n        }\n        bit_left -= 8 - bit_pos;\n        result = (m_pData[byte_pos++] & ((1 << (8 - bit_pos)) - 1)) << bit_left;\n    }\n    while (bit_left >= 8) {\n        bit_left -= 8;\n        result |= m_pData[byte_pos++] << bit_left;\n    }\n    if (bit_left) {\n        result |= m_pData[byte_pos] >> (8 - bit_left);\n    }\n    m_BitPos += nBits;\n    return result;\n}\nIFX_BufferArchive::IFX_BufferArchive(FX_STRSIZE size)\n    : m_BufSize(size)\n    , m_pBuffer(NULL)\n    , m_Length(0)\n{\n}\nvoid IFX_BufferArchive::Clear()\n{\n    m_Length = 0;\n    if (m_pBuffer) {\n        FX_Free(m_pBuffer);\n        m_pBuffer = NULL;\n    }\n}\nFX_BOOL IFX_BufferArchive::Flush()\n{\n    FX_BOOL bRet = DoWork(m_pBuffer, m_Length);\n    m_Length = 0;\n    return bRet;\n}\nFX_INT32 IFX_BufferArchive::AppendBlock(const void* pBuf, size_t size)\n{\n    if (!pBuf || size < 1) {\n        return 0;\n    }\n    if (!m_pBuffer) {\n        m_pBuffer = FX_Alloc(FX_BYTE, m_BufSize);\n        if (!m_pBuffer) {\n            return -1;\n        }\n    }\n    FX_LPBYTE buffer = (FX_LPBYTE)pBuf;\n    FX_STRSIZE temp_size = (FX_STRSIZE)size;\n    while (temp_size > 0) {\n        FX_STRSIZE buf_size = FX_MIN(m_BufSize - m_Length, (FX_STRSIZE)temp_size);\n        FXSYS_memcpy32(m_pBuffer + m_Length, buffer, buf_size);\n        m_Length += buf_size;\n        if (m_Length == m_BufSize) {\n            if (!Flush()) {\n                return -1;\n            }\n        }\n        temp_size -= buf_size;\n        buffer += buf_size;\n    }\n    return (FX_INT32)size;\n}\nFX_INT32 IFX_BufferArchive::AppendByte(FX_BYTE byte)\n{\n    return AppendBlock(&byte, 1);\n}\nFX_INT32 IFX_BufferArchive::AppendDWord(FX_DWORD i)\n{\n    char buf[32];\n    FXSYS_itoa(i, buf, 10);\n    return AppendBlock(buf, (size_t)FXSYS_strlen(buf));\n}\nFX_INT32 IFX_BufferArchive::AppendString(FX_BSTR lpsz)\n{\n    return AppendBlock((FX_LPCBYTE)lpsz, lpsz.GetLength());\n}\nCFX_FileBufferArchive::CFX_FileBufferArchive(FX_STRSIZE size)\n    : IFX_BufferArchive(size)\n    , m_pFile(NULL)\n    , m_bTakeover(FALSE)\n{\n}\nCFX_FileBufferArchive::~CFX_FileBufferArchive()\n{\n    Clear();\n}\nvoid CFX_FileBufferArchive::Clear()\n{\n    if (m_pFile && m_bTakeover) {\n        m_pFile->Release();\n    }\n    m_pFile = NULL;\n    m_bTakeover = FALSE;\n    IFX_BufferArchive::Clear();\n}\nFX_BOOL CFX_FileBufferArchive::AttachFile(IFX_StreamWrite *pFile, FX_BOOL bTakeover )\n{\n    if (!pFile) {\n        return FALSE;\n    }\n    if (m_pFile && m_bTakeover) {\n        m_pFile->Release();\n    }\n    m_pFile = pFile;\n    m_bTakeover = bTakeover;\n    return TRUE;\n}\nFX_BOOL CFX_FileBufferArchive::AttachFile(FX_LPCWSTR filename)\n{\n    if (!filename) {\n        return FALSE;\n    }\n    if (m_pFile && m_bTakeover) {\n        m_pFile->Release();\n    }\n    m_pFile = FX_CreateFileWrite(filename);\n    if (!m_pFile) {\n        return FALSE;\n    }\n    m_bTakeover = TRUE;\n    return TRUE;\n}\nFX_BOOL CFX_FileBufferArchive::AttachFile(FX_LPCSTR filename)\n{\n    if (!filename) {\n        return FALSE;\n    }\n    if (m_pFile && m_bTakeover) {\n        m_pFile->Release();\n    }\n    m_pFile = FX_CreateFileWrite(filename);\n    if (!m_pFile) {\n        return FALSE;\n    }\n    m_bTakeover = TRUE;\n    return TRUE;\n}\nFX_BOOL CFX_FileBufferArchive::DoWork(const void* pBuf, size_t size)\n{\n    if (!m_pFile) {\n        return FALSE;\n    }\n    if (!pBuf || size < 1) {\n        return TRUE;\n    }\n    return m_pFile->WriteBlock(pBuf, size);\n}\n"
  },
  {
    "path": "core/src/fxcrt/fx_basic_coords.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxcrt/fx_ext.h\"\nvoid FX_RECT::Normalize()\n{\n    if (left > right) {\n        int temp = left;\n        left = right;\n        right = temp;\n    }\n    if (top > bottom) {\n        int temp = top;\n        top = bottom;\n        bottom = temp;\n    }\n}\nvoid FX_RECT::Intersect(const FX_RECT& src)\n{\n    FX_RECT src_n = src;\n    src_n.Normalize();\n    Normalize();\n    left = left > src_n.left ? left : src_n.left;\n    top = top > src_n.top ? top : src_n.top;\n    right = right < src_n.right ? right : src_n.right;\n    bottom = bottom < src_n.bottom ? bottom : src_n.bottom;\n    if (left > right || top > bottom) {\n        left = top = right = bottom = 0;\n    }\n}\nvoid FX_RECT::Union(const FX_RECT& other_rect)\n{\n    Normalize();\n    FX_RECT other = other_rect;\n    other.Normalize();\n    left = left < other.left ? left : other.left;\n    right = right > other.right ? right : other.right;\n    bottom = bottom > other.bottom ? bottom : other.bottom;\n    top = top < other.top ? top : other.top;\n}\nFX_BOOL GetIntersection(FX_FLOAT low1, FX_FLOAT high1, FX_FLOAT low2, FX_FLOAT high2,\n                        FX_FLOAT& interlow, FX_FLOAT& interhigh)\n{\n    if (low1 >= high2 || low2 >= high1) {\n        return FALSE;\n    }\n    interlow = low1 > low2 ? low1 : low2;\n    interhigh = high1 > high2 ? high2 : high1;\n    return TRUE;\n}\nextern \"C\" int FXSYS_round(FX_FLOAT d)\n{\n    int iRet = 0;\n    if (d >= 0.0f) {\n        iRet = (int)(d + 0.5f);\n        if (iRet >= 0) {\n            return iRet;\n        }\n        return -iRet;\n    }\n    return (int)(d - 0.5f);\n}\nCFX_FloatRect::CFX_FloatRect(const FX_RECT& rect)\n{\n    left = (FX_FLOAT)(rect.left);\n    right = (FX_FLOAT)(rect.right);\n    bottom = (FX_FLOAT)(rect.top);\n    top = (FX_FLOAT)(rect.bottom);\n}\nvoid CFX_FloatRect::Normalize()\n{\n    FX_FLOAT temp;\n    if (left > right) {\n        temp = left;\n        left = right;\n        right = temp;\n    }\n    if (bottom > top) {\n        temp = top;\n        top = bottom;\n        bottom = temp;\n    }\n}\nvoid CFX_FloatRect::Intersect(const CFX_FloatRect& other_rect)\n{\n    Normalize();\n    CFX_FloatRect other = other_rect;\n    other.Normalize();\n    left = left > other.left ? left : other.left;\n    right = right < other.right ? right : other.right;\n    bottom = bottom > other.bottom ? bottom : other.bottom;\n    top = top < other.top ? top : other.top;\n    if (left > right || bottom > top) {\n        left = right = bottom = top = 0;\n    }\n}\nvoid CFX_FloatRect::Union(const CFX_FloatRect& other_rect)\n{\n    Normalize();\n    CFX_FloatRect other = other_rect;\n    other.Normalize();\n    left = left < other.left ? left : other.left;\n    right = right > other.right ? right : other.right;\n    bottom = bottom < other.bottom ? bottom : other.bottom;\n    top = top > other.top ? top : other.top;\n}\nvoid CFX_FloatRect::Transform(const CFX_Matrix* pMatrix)\n{\n    pMatrix->TransformRect(left, right, top, bottom);\n}\nint CFX_FloatRect::Substract4(CFX_FloatRect& s, CFX_FloatRect* pRects)\n{\n    Normalize();\n    s.Normalize();\n    int nRects = 0;\n    CFX_FloatRect rects[4];\n    if (left < s.left) {\n        rects[nRects].left = left;\n        rects[nRects].right = s.left;\n        rects[nRects].bottom = bottom;\n        rects[nRects].top = top;\n        nRects ++;\n    }\n    if (s.left < right && s.top < top) {\n        rects[nRects].left = s.left;\n        rects[nRects].right = right;\n        rects[nRects].bottom = s.top;\n        rects[nRects].top = top;\n        nRects ++;\n    }\n    if (s.top > bottom && s.right < right) {\n        rects[nRects].left = s.right;\n        rects[nRects].right = right;\n        rects[nRects].bottom = bottom;\n        rects[nRects].top = s.top;\n        nRects ++;\n    }\n    if (s.bottom > bottom) {\n        rects[nRects].left = s.left;\n        rects[nRects].right = s.right;\n        rects[nRects].bottom = bottom;\n        rects[nRects].top = s.bottom;\n        nRects ++;\n    }\n    if (nRects == 0) {\n        return 0;\n    }\n    for (int i = 0; i < nRects; i ++) {\n        pRects[i] = rects[i];\n        pRects[i].Intersect(*this);\n    }\n    return nRects;\n}\nFX_RECT CFX_FloatRect::GetOutterRect() const\n{\n    CFX_FloatRect rect1 = *this;\n    FX_RECT rect;\n    rect.left = (int)FXSYS_floor(rect1.left);\n    rect.right = (int)FXSYS_ceil(rect1.right);\n    rect.top = (int)FXSYS_floor(rect1.bottom);\n    rect.bottom = (int)FXSYS_ceil(rect1.top);\n    rect.Normalize();\n    return rect;\n}\nFX_RECT CFX_FloatRect::GetInnerRect() const\n{\n    CFX_FloatRect rect1 = *this;\n    FX_RECT rect;\n    rect.left = (int)FXSYS_ceil(rect1.left);\n    rect.right = (int)FXSYS_floor(rect1.right);\n    rect.top = (int)FXSYS_ceil(rect1.bottom);\n    rect.bottom = (int)FXSYS_floor(rect1.top);\n    rect.Normalize();\n    return rect;\n}\nstatic void _MatchFloatRange(FX_FLOAT f1, FX_FLOAT f2, int& i1, int& i2)\n{\n    int length = (int)FXSYS_ceil(f2 - f1);\n    int i1_1 = (int)FXSYS_floor(f1);\n    int i1_2 = (int)FXSYS_ceil(f1);\n    FX_FLOAT error1 = f1 - i1_1 + (FX_FLOAT)FXSYS_fabs(f2 - i1_1 - length);\n    FX_FLOAT error2 = i1_2 - f1 + (FX_FLOAT)FXSYS_fabs(f2 - i1_2 - length);\n    i1 = (error1 > error2) ? i1_2 : i1_1;\n    i2 = i1 + length;\n}\nFX_RECT CFX_FloatRect::GetClosestRect() const\n{\n    CFX_FloatRect rect1 = *this;\n    FX_RECT rect;\n    _MatchFloatRange(rect1.left, rect1.right, rect.left, rect.right);\n    _MatchFloatRange(rect1.bottom, rect1.top, rect.top, rect.bottom);\n    rect.Normalize();\n    return rect;\n}\nFX_BOOL CFX_FloatRect::Contains(const CFX_FloatRect& other_rect) const\n{\n    CFX_FloatRect n1 = *this;\n    n1.Normalize();\n    CFX_FloatRect n2 = other_rect;\n    n2.Normalize();\n    if (n2.left >= n1.left && n2.right <= n1.right && n2.bottom >= n1.bottom && n2.top <= n1.top) {\n        return TRUE;\n    }\n    return FALSE;\n}\nFX_BOOL CFX_FloatRect::Contains(FX_FLOAT x, FX_FLOAT y) const\n{\n    CFX_FloatRect n1 = *this;\n    n1.Normalize();\n    return x <= n1.right && x >= n1.left && y <= n1.top && y >= n1.bottom;\n}\nvoid CFX_FloatRect::UpdateRect(FX_FLOAT x, FX_FLOAT y)\n{\n    if (left > x) {\n        left = x;\n    }\n    if (right < x) {\n        right = x;\n    }\n    if (bottom > y) {\n        bottom = y;\n    }\n    if (top < y) {\n        top = y;\n    }\n}\nCFX_FloatRect CFX_FloatRect::GetBBox(const CFX_FloatPoint* pPoints, int nPoints)\n{\n    if (nPoints == 0) {\n        return CFX_FloatRect();\n    }\n    FX_FLOAT min_x = pPoints->x, max_x = pPoints->x, min_y = pPoints->y, max_y = pPoints->y;\n    for (int i = 1; i < nPoints; i ++) {\n        if (min_x > pPoints[i].x) {\n            min_x = pPoints[i].x;\n        }\n        if (max_x < pPoints[i].x) {\n            max_x = pPoints[i].x;\n        }\n        if (min_y > pPoints[i].y) {\n            min_y = pPoints[i].y;\n        }\n        if (max_y < pPoints[i].y) {\n            max_y = pPoints[i].y;\n        }\n    }\n    return CFX_FloatRect(min_x, min_y, max_x, max_y);\n}\nvoid CFX_Matrix::Set(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f)\n{\n    this->a = a;\n    this->b = b;\n    this->c = c;\n    this->d = d;\n    this->e = e;\n    this->f = f;\n}\nvoid CFX_Matrix::Set(const FX_FLOAT n[6])\n{\n    this->a = n[0];\n    this->b = n[1];\n    this->c = n[2];\n    this->d = n[3];\n    this->e = n[4];\n    this->f = n[5];\n}\nvoid CFX_Matrix::SetReverse(const CFX_Matrix &m)\n{\n    FX_FLOAT i = m.a * m.d - m.b * m.c;\n    if (FXSYS_fabs(i) == 0) {\n        return;\n    }\n    FX_FLOAT j = -i;\n    a = m.d / i;\n    b = m.b / j;\n    c = m.c / j;\n    d = m.a / i;\n    e = (m.c * m.f - m.d * m.e) / i;\n    f = (m.a * m.f - m.b * m.e) / j;\n}\nstatic void FXCRT_Matrix_Concat(CFX_Matrix &m, const CFX_Matrix &m1, const CFX_Matrix &m2)\n{\n    FX_FLOAT aa = m1.a * m2.a + m1.b * m2.c;\n    FX_FLOAT bb = m1.a * m2.b + m1.b * m2.d;\n    FX_FLOAT cc = m1.c * m2.a + m1.d * m2.c;\n    FX_FLOAT dd = m1.c * m2.b + m1.d * m2.d;\n    FX_FLOAT ee = m1.e * m2.a + m1.f * m2.c + m2.e;\n    FX_FLOAT ff = m1.e * m2.b + m1.f * m2.d + m2.f;\n    m.a = aa, m.b = bb, m.c = cc, m.d = dd, m.e = ee, m.f = ff;\n}\nvoid CFX_Matrix::Concat(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f, FX_BOOL bPrepended)\n{\n    CFX_Matrix m;\n    m.Set(a, b, c, d, e, f);\n    Concat(m, bPrepended);\n}\nvoid CFX_Matrix::Concat(const CFX_Matrix &m, FX_BOOL bPrepended)\n{\n    if (bPrepended) {\n        FXCRT_Matrix_Concat(*this, m, *this);\n    } else {\n        FXCRT_Matrix_Concat(*this, *this, m);\n    }\n}\nvoid CFX_Matrix::ConcatInverse(const CFX_Matrix& src, FX_BOOL bPrepended)\n{\n    CFX_Matrix m;\n    m.SetReverse(src);\n    Concat(m, bPrepended);\n}\nFX_BOOL CFX_Matrix::IsInvertible() const\n{\n    return FXSYS_fabs(a * d - b * c) >= 0.0001f;\n}\nFX_BOOL CFX_Matrix::Is90Rotated() const\n{\n    return FXSYS_fabs(a * 1000) < FXSYS_fabs(b) && FXSYS_fabs(d * 1000) < FXSYS_fabs(c);\n}\nFX_BOOL CFX_Matrix::IsScaled() const\n{\n    return FXSYS_fabs(b * 1000) < FXSYS_fabs(a) && FXSYS_fabs(c * 1000) < FXSYS_fabs(d);\n}\nvoid CFX_Matrix::Translate(FX_FLOAT x, FX_FLOAT y, FX_BOOL bPrepended)\n{\n    if (bPrepended) {\n        e += x * a + y * c;\n        f += y * d + x * b;\n    } else {\n        e += x, f += y;\n    }\n}\nvoid CFX_Matrix::Scale(FX_FLOAT sx, FX_FLOAT sy, FX_BOOL bPrepended)\n{\n    a *= sx, d *= sy;\n    if (bPrepended) {\n        b *= sx;\n        c *= sy;\n    } else {\n        b *= sy;\n        c *= sx;\n        e *= sx;\n        f *= sy;\n    }\n}\nvoid CFX_Matrix::Rotate(FX_FLOAT fRadian, FX_BOOL bPrepended)\n{\n    FX_FLOAT cosValue = FXSYS_cos(fRadian);\n    FX_FLOAT sinValue = FXSYS_sin(fRadian);\n    CFX_Matrix m;\n    m.Set(cosValue, sinValue, -sinValue, cosValue, 0, 0);\n    if (bPrepended) {\n        FXCRT_Matrix_Concat(*this, m, *this);\n    } else {\n        FXCRT_Matrix_Concat(*this, *this, m);\n    }\n}\nvoid CFX_Matrix::RotateAt(FX_FLOAT fRadian, FX_FLOAT dx, FX_FLOAT dy, FX_BOOL bPrepended)\n{\n    Translate(dx, dy, bPrepended);\n    Rotate(fRadian, bPrepended);\n    Translate(-dx, -dy, bPrepended);\n}\nvoid CFX_Matrix::Shear(FX_FLOAT fAlphaRadian, FX_FLOAT fBetaRadian, FX_BOOL bPrepended)\n{\n    CFX_Matrix m;\n    m.Set(1, FXSYS_tan(fAlphaRadian), FXSYS_tan(fBetaRadian), 1, 0, 0);\n    if (bPrepended) {\n        FXCRT_Matrix_Concat(*this, m, *this);\n    } else {\n        FXCRT_Matrix_Concat(*this, *this, m);\n    }\n}\nvoid CFX_Matrix::MatchRect(const CFX_FloatRect& dest, const CFX_FloatRect& src)\n{\n    FX_FLOAT fDiff = src.left - src.right;\n    a = FXSYS_fabs(fDiff) < 0.001f ? 1 : (dest.left - dest.right) / fDiff;\n    fDiff = src.bottom - src.top;\n    d = FXSYS_fabs(fDiff) < 0.001f ? 1 : (dest.bottom - dest.top) / fDiff;\n    e = dest.left - src.left * a;\n    f = dest.bottom - src.bottom * d;\n    b = 0;\n    c = 0;\n}\nFX_FLOAT CFX_Matrix::GetXUnit() const\n{\n    if (b == 0) {\n        return (a > 0 ? a : -a);\n    }\n    if (a == 0) {\n        return (b > 0 ? b : -b);\n    }\n    return FXSYS_sqrt(a * a + b * b);\n}\nFX_FLOAT CFX_Matrix::GetYUnit() const\n{\n    if (c == 0) {\n        return (d > 0 ? d : -d);\n    }\n    if (d == 0) {\n        return (c > 0 ? c : -c);\n    }\n    return FXSYS_sqrt(c * c + d * d);\n}\nvoid CFX_Matrix::GetUnitRect(CFX_RectF &rect) const\n{\n    rect.left = rect.top = 0;\n    rect.width = rect.height = 1;\n    TransformRect(rect);\n}\nCFX_FloatRect CFX_Matrix::GetUnitRect() const\n{\n    CFX_FloatRect rect(0, 0, 1, 1);\n    rect.Transform((const CFX_Matrix*)this);\n    return rect;\n}\nFX_FLOAT CFX_Matrix::GetUnitArea() const\n{\n    FX_FLOAT A = FXSYS_sqrt(a * a + b * b);\n    FX_FLOAT B = FXSYS_sqrt(c * c + d * d);\n    FX_FLOAT ac = a + c, bd = b + d;\n    FX_FLOAT C = FXSYS_sqrt(ac * ac + bd * bd);\n    FX_FLOAT P = (A + B + C ) / 2;\n    return FXSYS_sqrt(P * (P - A) * (P - B) * (P - C)) * 2;\n}\nFX_FLOAT CFX_Matrix::TransformXDistance(FX_FLOAT dx) const\n{\n    FX_FLOAT fx = a * dx, fy = b * dx;\n    return FXSYS_sqrt(fx * fx + fy * fy);\n}\nFX_INT32 CFX_Matrix::TransformXDistance(FX_INT32 dx) const\n{\n    FX_FLOAT fx = a * dx, fy = b * dx;\n    return FXSYS_round(FXSYS_sqrt(fx * fx + fy * fy));\n}\nFX_FLOAT CFX_Matrix::TransformYDistance(FX_FLOAT dy) const\n{\n    FX_FLOAT fx = c * dy, fy = d * dy;\n    return FXSYS_sqrt(fx * fx + fy * fy);\n}\nFX_INT32 CFX_Matrix::TransformYDistance(FX_INT32 dy) const\n{\n    FX_FLOAT fx = c * dy, fy = d * dy;\n    return FXSYS_round(FXSYS_sqrt(fx * fx + fy * fy));\n}\nFX_FLOAT CFX_Matrix::TransformDistance(FX_FLOAT dx, FX_FLOAT dy) const\n{\n    FX_FLOAT fx = a * dx + c * dy, fy = b * dx + d * dy;\n    return FXSYS_sqrt(fx * fx + fy * fy);\n}\nFX_INT32 CFX_Matrix::TransformDistance(FX_INT32 dx, FX_INT32 dy) const\n{\n    FX_FLOAT fx = a * dx + c * dy, fy = b * dx + d * dy;\n    return FXSYS_round(FXSYS_sqrt(fx * fx + fy * fy));\n}\nFX_FLOAT CFX_Matrix::TransformDistance(FX_FLOAT distance) const\n{\n    return distance * (GetXUnit() + GetYUnit()) / 2;\n}\nvoid CFX_Matrix::TransformVector(CFX_VectorF &v) const\n{\n    FX_FLOAT fx = a * v.x + c * v.y;\n    FX_FLOAT fy = b * v.x + d * v.y;\n    v.x = fx, v.y = fy;\n}\nvoid CFX_Matrix::TransformVector(CFX_Vector &v) const\n{\n    FX_FLOAT fx = a * v.x + c * v.y;\n    FX_FLOAT fy = b * v.x + d * v.y;\n    v.x = FXSYS_round(fx);\n    v.y = FXSYS_round(fy);\n}\nvoid CFX_Matrix::TransformPoints(CFX_Point *points, FX_INT32 iCount) const\n{\n    FXSYS_assert(iCount > 0);\n    FX_FLOAT fx, fy;\n    for (FX_INT32 i = 0; i < iCount; i ++) {\n        fx = a * points->x + c * points->y + e;\n        fy = b * points->x + d * points->y + f;\n        points->x = FXSYS_round(fx);\n        points->y = FXSYS_round(fy);\n        points ++;\n    }\n}\nvoid CFX_Matrix::TransformPoints(CFX_PointF *points, FX_INT32 iCount) const\n{\n    FXSYS_assert(iCount > 0);\n    FX_FLOAT fx, fy;\n    for (FX_INT32 i = 0; i < iCount; i ++) {\n        fx = a * points->x + c * points->y + e;\n        fy = b * points->x + d * points->y + f;\n        points->x = fx, points->y = fy;\n        points ++;\n    }\n}\nvoid CFX_Matrix::TransformPoint(FX_FLOAT &x, FX_FLOAT &y) const\n{\n    FX_FLOAT fx = a * x + c * y + e;\n    FX_FLOAT fy = b * x + d * y + f;\n    x = fx, y = fy;\n}\nvoid CFX_Matrix::TransformPoint(FX_INT32 &x, FX_INT32 &y) const\n{\n    FX_FLOAT fx = a * x + c * y + e;\n    FX_FLOAT fy = b * x + d * y + f;\n    x = FXSYS_round(fx);\n    y = FXSYS_round(fy);\n}\nvoid CFX_Matrix::TransformRect(CFX_RectF &rect) const\n{\n    FX_FLOAT right = rect.right(), bottom = rect.bottom();\n    TransformRect(rect.left, right, bottom, rect.top);\n    rect.width = right - rect.left;\n    rect.height = bottom - rect.top;\n}\nvoid CFX_Matrix::TransformRect(CFX_Rect &rect) const\n{\n    FX_FLOAT left = (FX_FLOAT)rect.left;\n    FX_FLOAT top = (FX_FLOAT)rect.bottom();\n    FX_FLOAT right = (FX_FLOAT)rect.right();\n    FX_FLOAT bottom = (FX_FLOAT)rect.top;\n    TransformRect(left, right, top, bottom);\n    rect.left = FXSYS_round(left);\n    rect.top = FXSYS_round(bottom);\n    rect.width = FXSYS_round(right - left);\n    rect.height = FXSYS_round(top - bottom);\n}\nvoid CFX_Matrix::TransformRect(FX_FLOAT& left, FX_FLOAT& right, FX_FLOAT& top, FX_FLOAT& bottom) const\n{\n    FX_FLOAT x[4], y[4];\n    x[0] = left;\n    y[0] = top;\n    x[1] = left;\n    y[1] = bottom;\n    x[2] = right;\n    y[2] = top;\n    x[3] = right;\n    y[3] = bottom;\n    int i;\n    for (i = 0; i < 4; i ++) {\n        Transform(x[i], y[i], x[i], y[i]);\n    }\n    right = left = x[0];\n    top = bottom = y[0];\n    for (i = 1; i < 4; i ++) {\n        if (right < x[i]) {\n            right = x[i];\n        }\n        if (left > x[i]) {\n            left = x[i];\n        }\n        if (top < y[i]) {\n            top = y[i];\n        }\n        if (bottom > y[i]) {\n            bottom = y[i];\n        }\n    }\n}\n"
  },
  {
    "path": "core/src/fxcrt/fx_basic_gcc.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxcrt/fx_ext.h\"\ntemplate <class T, class STR_T>\nT FXSYS_StrToInt(STR_T str)\n{\n    FX_BOOL neg = FALSE;\n    if (str == NULL) {\n        return 0;\n    }\n    if (*str == '-') {\n        neg = TRUE;\n        str ++;\n    }\n    T num = 0;\n    while (*str) {\n        if ((*str) < '0' || (*str) > '9') {\n            break;\n        }\n        num = num * 10 + (*str) - '0';\n        str ++;\n    }\n    return neg ? -num : num;\n}\ntemplate <typename T, typename STR_T>\nSTR_T FXSYS_IntToStr(T value, STR_T string, int radix)\n{\n    int i = 0;\n    if (value < 0) {\n        string[i++] = '-';\n        value = -value;\n    } else if (value == 0) {\n        string[0] = '0';\n        string[1] = 0;\n        return string;\n    }\n    int digits = 1;\n    T order = value / 10;\n    while(order > 0) {\n        digits++;\n        order = order / 10;\n    }\n    for (int d = digits - 1; d > -1; d--) {\n        string[d + i] = \"0123456789abcdef\"[value % 10];\n        value /= 10;\n    }\n    string[digits + i] = 0;\n    return string;\n}\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nFX_INT32 FXSYS_atoi(FX_LPCSTR str)\n{\n    return FXSYS_StrToInt<FX_INT32, FX_LPCSTR>(str);\n}\nFX_INT32 FXSYS_wtoi(FX_LPCWSTR str)\n{\n    return FXSYS_StrToInt<FX_INT32, FX_LPCWSTR>(str);\n}\nFX_INT64 FXSYS_atoi64(FX_LPCSTR str)\n{\n    return FXSYS_StrToInt<FX_INT64, FX_LPCSTR>(str);\n}\nFX_INT64 FXSYS_wtoi64(FX_LPCWSTR str)\n{\n    return FXSYS_StrToInt<FX_INT64, FX_LPCWSTR>(str);\n}\nFX_LPCSTR FXSYS_i64toa(FX_INT64 value, FX_LPSTR str, int radix)\n{\n    return FXSYS_IntToStr<FX_INT64, FX_LPSTR>(value, str, radix);\n}\nFX_LPCWSTR FXSYS_i64tow(FX_INT64 value, FX_LPWSTR str, int radix)\n{\n    return FXSYS_IntToStr<FX_INT64, FX_LPWSTR>(value, str, radix);\n}\n#ifdef __cplusplus\n}\n#endif\n#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nint FXSYS_GetACP()\n{\n    return 0;\n}\nFX_DWORD FXSYS_GetFullPathName(FX_LPCSTR filename, FX_DWORD buflen, FX_LPSTR buf, FX_LPSTR* filepart)\n{\n    int srclen = FXSYS_strlen(filename);\n    if (buf == NULL || (int)buflen < srclen + 1) {\n        return srclen + 1;\n    }\n    FXSYS_strcpy(buf, filename);\n    return srclen;\n}\nFX_DWORD FXSYS_GetModuleFileName(FX_LPVOID hModule, char* buf, FX_DWORD bufsize)\n{\n    return (FX_DWORD) - 1;\n}\n#ifdef __cplusplus\n}\n#endif\n#endif\n#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nFXSYS_FILE* FXSYS_wfopen(FX_LPCWSTR filename, FX_LPCWSTR mode)\n{\n    return FXSYS_fopen(CFX_ByteString::FromUnicode(filename), CFX_ByteString::FromUnicode(mode));\n}\nchar* FXSYS_strlwr(char* str)\n{\n    if (str == NULL) {\n        return NULL;\n    }\n    char* s = str;\n    while (*str) {\n        *str = FXSYS_tolower(*str);\n        str ++;\n    }\n    return s;\n}\nchar* FXSYS_strupr(char* str)\n{\n    if (str == NULL) {\n        return NULL;\n    }\n    char* s = str;\n    while (*str) {\n        *str = FXSYS_toupper(*str);\n        str ++;\n    }\n    return s;\n}\nFX_WCHAR* FXSYS_wcslwr(FX_WCHAR* str)\n{\n    if (str == NULL) {\n        return NULL;\n    }\n    FX_WCHAR* s = str;\n    while (*str) {\n        *str = FXSYS_tolower(*str);\n        str ++;\n    }\n    return s;\n}\nFX_WCHAR* FXSYS_wcsupr(FX_WCHAR* str)\n{\n    if (str == NULL) {\n        return NULL;\n    }\n    FX_WCHAR* s = str;\n    while (*str) {\n        *str = FXSYS_toupper(*str);\n        str ++;\n    }\n    return s;\n}\nint FXSYS_stricmp(const char*dst, const char*src)\n{\n    int f, l;\n    do {\n        if ( ((f = (unsigned char)(*(dst++))) >= 'A') && (f <= 'Z') ) {\n            f -= ('A' - 'a');\n        }\n        if ( ((l = (unsigned char)(*(src++))) >= 'A') && (l <= 'Z') ) {\n            l -= ('A' - 'a');\n        }\n    } while ( f && (f == l) );\n    return(f - l);\n}\nint FXSYS_wcsicmp(const FX_WCHAR *dst, const FX_WCHAR *src)\n{\n    FX_WCHAR f, l;\n    do {\n        if ( ((f = (FX_WCHAR)(*(dst++))) >= 'A') && (f <= 'Z') ) {\n            f -= ('A' - 'a');\n        }\n        if ( ((l = (FX_WCHAR)(*(src++))) >= 'A') && (l <= 'Z') ) {\n            l -= ('A' - 'a');\n        }\n    } while ( f && (f == l) );\n    return(f - l);\n}\nchar* FXSYS_itoa(int value, char* string, int radix)\n{\n    return FXSYS_IntToStr<FX_INT32, FX_LPSTR>(value, string, radix);\n}\n#ifdef __cplusplus\n}\n#endif\n#endif\n#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nint FXSYS_WideCharToMultiByte(FX_DWORD codepage, FX_DWORD dwFlags, FX_LPCWSTR wstr, int wlen,\n                              FX_LPSTR buf, int buflen, FX_LPCSTR default_str, FX_BOOL* pUseDefault)\n{\n    int len = 0;\n    for (int i = 0; i < wlen; i ++) {\n        if (wstr[i] < 0x100) {\n            if (buf && len < buflen) {\n                buf[len] = (FX_CHAR)wstr[i];\n            }\n            len ++;\n        }\n    }\n    return len;\n}\nint FXSYS_MultiByteToWideChar(FX_DWORD codepage, FX_DWORD dwFlags, FX_LPCSTR bstr, int blen,\n                              FX_LPWSTR buf, int buflen)\n{\n    int wlen = 0;\n    for (int i = 0; i < blen; i ++) {\n        if (buf && wlen < buflen) {\n            buf[wlen] = bstr[i];\n        }\n        wlen ++;\n    }\n    return wlen;\n}\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "core/src/fxcrt/fx_basic_list.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxcrt/fx_basic.h\"\n#include \"plex.h\"\nCFX_PtrList::CFX_PtrList(int nBlockSize)\n    : m_pNodeHead(NULL)\n    , m_pNodeTail(NULL)\n    , m_nCount(0)\n    , m_pNodeFree(NULL)\n    , m_pBlocks(NULL)\n    , m_nBlockSize(nBlockSize)\n{\n}\nFX_POSITION CFX_PtrList::AddTail(void* newElement)\n{\n    CNode* pNewNode = NewNode(m_pNodeTail, NULL);\n    pNewNode->data = newElement;\n    if (m_pNodeTail != NULL) {\n        m_pNodeTail->pNext = pNewNode;\n    } else {\n        m_pNodeHead = pNewNode;\n    }\n    m_pNodeTail = pNewNode;\n    return (FX_POSITION) pNewNode;\n}\nFX_POSITION CFX_PtrList::AddHead(void* newElement)\n{\n    CNode* pNewNode = NewNode(NULL, m_pNodeHead);\n    pNewNode->data = newElement;\n    if (m_pNodeHead != NULL) {\n        m_pNodeHead->pPrev = pNewNode;\n    } else {\n        m_pNodeTail = pNewNode;\n    }\n    m_pNodeHead = pNewNode;\n    return (FX_POSITION) pNewNode;\n}\nFX_POSITION CFX_PtrList::InsertAfter(FX_POSITION position, void* newElement)\n{\n    if (position == NULL) {\n        return AddTail(newElement);\n    }\n    CNode* pOldNode = (CNode*) position;\n    CNode* pNewNode = NewNode(pOldNode, pOldNode->pNext);\n    pNewNode->data = newElement;\n    if (pOldNode->pNext != NULL) {\n        pOldNode->pNext->pPrev = pNewNode;\n    } else {\n        m_pNodeTail = pNewNode;\n    }\n    pOldNode->pNext = pNewNode;\n    return (FX_POSITION) pNewNode;\n}\nvoid CFX_PtrList::RemoveAt(FX_POSITION position)\n{\n    CNode* pOldNode = (CNode*) position;\n    if (pOldNode == m_pNodeHead) {\n        m_pNodeHead = pOldNode->pNext;\n    } else {\n        pOldNode->pPrev->pNext = pOldNode->pNext;\n    }\n    if (pOldNode == m_pNodeTail) {\n        m_pNodeTail = pOldNode->pPrev;\n    } else {\n        pOldNode->pNext->pPrev = pOldNode->pPrev;\n    }\n    FreeNode(pOldNode);\n}\nvoid CFX_PtrList::FreeNode(CFX_PtrList::CNode* pNode)\n{\n    pNode->pNext = m_pNodeFree;\n    m_pNodeFree = pNode;\n    m_nCount--;\n    if (m_nCount == 0) {\n        RemoveAll();\n    }\n}\nvoid CFX_PtrList::RemoveAll()\n{\n    m_nCount = 0;\n    m_pNodeHead = m_pNodeTail = m_pNodeFree = NULL;\n    m_pBlocks->FreeDataChain();\n    m_pBlocks = NULL;\n}\nCFX_PtrList::CNode*\nCFX_PtrList::NewNode(CFX_PtrList::CNode* pPrev, CFX_PtrList::CNode* pNext)\n{\n    if (m_pNodeFree == NULL) {\n        CFX_Plex* pNewBlock = CFX_Plex::Create(m_pBlocks, m_nBlockSize, sizeof(CNode));\n        CNode* pNode = (CNode*)pNewBlock->data();\n        pNode += m_nBlockSize - 1;\n        for (int i = m_nBlockSize - 1; i >= 0; i--, pNode--) {\n            pNode->pNext = m_pNodeFree;\n            m_pNodeFree = pNode;\n        }\n    }\n    ASSERT(m_pNodeFree != NULL);\n    CFX_PtrList::CNode* pNode = m_pNodeFree;\n    m_pNodeFree = m_pNodeFree->pNext;\n    pNode->pPrev = pPrev;\n    pNode->pNext = pNext;\n    m_nCount++;\n    ASSERT(m_nCount > 0);\n    pNode->data = 0;\n    return pNode;\n}\nCFX_PtrList::~CFX_PtrList()\n{\n    RemoveAll();\n    ASSERT(m_nCount == 0);\n}\nFX_POSITION CFX_PtrList::FindIndex(int nIndex) const\n{\n    if (nIndex >= m_nCount || nIndex < 0) {\n        return NULL;\n    }\n    CNode* pNode = m_pNodeHead;\n    while (nIndex--) {\n        pNode = pNode->pNext;\n    }\n    return (FX_POSITION) pNode;\n}\nFX_POSITION CFX_PtrList::Find(void* searchValue, FX_POSITION startAfter) const\n{\n    CNode* pNode = (CNode*) startAfter;\n    if (pNode == NULL) {\n        pNode = m_pNodeHead;\n    } else {\n        pNode = pNode->pNext;\n    }\n    for (; pNode != NULL; pNode = pNode->pNext)\n        if (pNode->data == searchValue) {\n            return (FX_POSITION) pNode;\n        }\n    return NULL;\n}\n"
  },
  {
    "path": "core/src/fxcrt/fx_basic_maps.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxcrt/fx_ext.h\"\n#include \"plex.h\"\nstatic void ConstructElement(CFX_ByteString* pNewData)\n{\n    new (pNewData) CFX_ByteString();\n}\nstatic void DestructElement(CFX_ByteString* pOldData)\n{\n    pOldData->~CFX_ByteString();\n}\nCFX_MapPtrToPtr::CFX_MapPtrToPtr(int nBlockSize)\n    : m_pHashTable(NULL)\n    , m_nHashTableSize(17)\n    , m_nCount(0)\n    , m_pFreeList(NULL)\n    , m_pBlocks(NULL)\n    , m_nBlockSize(nBlockSize)\n{\n    ASSERT(m_nBlockSize > 0);\n}\nvoid CFX_MapPtrToPtr::RemoveAll()\n{\n    if (m_pHashTable) {\n        FX_Free(m_pHashTable);\n        m_pHashTable = NULL;\n    }\n    m_nCount = 0;\n    m_pFreeList = NULL;\n    m_pBlocks->FreeDataChain();\n    m_pBlocks = NULL;\n}\nCFX_MapPtrToPtr::~CFX_MapPtrToPtr()\n{\n    RemoveAll();\n    ASSERT(m_nCount == 0);\n}\nFX_DWORD CFX_MapPtrToPtr::HashKey(void* key) const\n{\n    return ((FX_DWORD)(FX_UINTPTR)key) >> 4;\n}\nvoid CFX_MapPtrToPtr::GetNextAssoc(FX_POSITION& rNextPosition, void*& rKey, void*& rValue) const\n{\n    ASSERT(m_pHashTable != NULL);\n    CAssoc* pAssocRet = (CAssoc*)rNextPosition;\n    ASSERT(pAssocRet != NULL);\n    if (pAssocRet == (CAssoc*) - 1) {\n        for (FX_DWORD nBucket = 0; nBucket < m_nHashTableSize; nBucket++)\n            if ((pAssocRet = m_pHashTable[nBucket]) != NULL) {\n                break;\n            }\n        ASSERT(pAssocRet != NULL);\n    }\n    CAssoc* pAssocNext;\n    if ((pAssocNext = pAssocRet->pNext) == NULL) {\n        for (FX_DWORD nBucket = (HashKey(pAssocRet->key) % m_nHashTableSize) + 1; nBucket < m_nHashTableSize; nBucket ++) {\n            if ((pAssocNext = m_pHashTable[nBucket]) != NULL) {\n                break;\n            }\n        }\n    }\n    rNextPosition = (FX_POSITION) pAssocNext;\n    rKey = pAssocRet->key;\n    rValue = pAssocRet->value;\n}\nFX_BOOL CFX_MapPtrToPtr::Lookup(void* key, void*& rValue) const\n{\n    FX_DWORD nHash;\n    CAssoc* pAssoc = GetAssocAt(key, nHash);\n    if (pAssoc == NULL) {\n        return FALSE;\n    }\n    rValue = pAssoc->value;\n    return TRUE;\n}\nvoid* CFX_MapPtrToPtr::GetValueAt(void* key) const\n{\n    FX_DWORD nHash;\n    CAssoc* pAssoc = GetAssocAt(key, nHash);\n    if (pAssoc == NULL) {\n        return NULL;\n    }\n    return pAssoc->value;\n}\nvoid*& CFX_MapPtrToPtr::operator[](void* key)\n{\n    FX_DWORD nHash;\n    CAssoc* pAssoc;\n    if ((pAssoc = GetAssocAt(key, nHash)) == NULL) {\n        if (m_pHashTable == NULL) {\n            InitHashTable(m_nHashTableSize);\n        }\n        pAssoc = NewAssoc();\n        pAssoc->key = key;\n        pAssoc->pNext = m_pHashTable[nHash];\n        m_pHashTable[nHash] = pAssoc;\n    }\n    return pAssoc->value;\n}\nCFX_MapPtrToPtr::CAssoc*\nCFX_MapPtrToPtr::GetAssocAt(void* key, FX_DWORD& nHash) const\n{\n    nHash = HashKey(key) % m_nHashTableSize;\n    if (m_pHashTable == NULL) {\n        return NULL;\n    }\n    CAssoc* pAssoc;\n    for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL; pAssoc = pAssoc->pNext) {\n        if (pAssoc->key == key) {\n            return pAssoc;\n        }\n    }\n    return NULL;\n}\nCFX_MapPtrToPtr::CAssoc*\nCFX_MapPtrToPtr::NewAssoc()\n{\n    if (m_pFreeList == NULL) {\n        CFX_Plex* newBlock = CFX_Plex::Create(m_pBlocks, m_nBlockSize, sizeof(CFX_MapPtrToPtr::CAssoc));\n        CFX_MapPtrToPtr::CAssoc* pAssoc = (CFX_MapPtrToPtr::CAssoc*)newBlock->data();\n        pAssoc += m_nBlockSize - 1;\n        for (int i = m_nBlockSize - 1; i >= 0; i--, pAssoc--) {\n            pAssoc->pNext = m_pFreeList;\n            m_pFreeList = pAssoc;\n        }\n    }\n    ASSERT(m_pFreeList != NULL);\n    CFX_MapPtrToPtr::CAssoc* pAssoc = m_pFreeList;\n    m_pFreeList = m_pFreeList->pNext;\n    m_nCount++;\n    ASSERT(m_nCount > 0);\n    pAssoc->key = 0;\n    pAssoc->value = 0;\n    return pAssoc;\n}\nvoid CFX_MapPtrToPtr::InitHashTable(\n    FX_DWORD nHashSize, FX_BOOL bAllocNow)\n{\n    ASSERT(m_nCount == 0);\n    ASSERT(nHashSize > 0);\n    if (m_pHashTable != NULL) {\n        FX_Free(m_pHashTable);\n        m_pHashTable = NULL;\n    }\n    if (bAllocNow) {\n        m_pHashTable = FX_Alloc(CAssoc*, nHashSize);\n    }\n    m_nHashTableSize = nHashSize;\n}\nFX_BOOL CFX_MapPtrToPtr::RemoveKey(void* key)\n{\n    if (m_pHashTable == NULL) {\n        return FALSE;\n    }\n    CAssoc** ppAssocPrev;\n    ppAssocPrev = &m_pHashTable[HashKey(key) % m_nHashTableSize];\n    CAssoc* pAssoc;\n    for (pAssoc = *ppAssocPrev; pAssoc != NULL; pAssoc = pAssoc->pNext) {\n        if (pAssoc->key == key) {\n            *ppAssocPrev = pAssoc->pNext;\n            FreeAssoc(pAssoc);\n            return TRUE;\n        }\n        ppAssocPrev = &pAssoc->pNext;\n    }\n    return FALSE;\n}\nvoid CFX_MapPtrToPtr::FreeAssoc(CFX_MapPtrToPtr::CAssoc* pAssoc)\n{\n    pAssoc->pNext = m_pFreeList;\n    m_pFreeList = pAssoc;\n    m_nCount--;\n    ASSERT(m_nCount >= 0);\n    if (m_nCount == 0) {\n        RemoveAll();\n    }\n}\nCFX_MapByteStringToPtr::CFX_MapByteStringToPtr(int nBlockSize)\n    : m_pHashTable(NULL)\n    , m_nHashTableSize(17)\n    , m_nCount(0)\n    , m_pFreeList(NULL)\n    , m_pBlocks(NULL)\n    , m_nBlockSize(nBlockSize)\n{\n    ASSERT(m_nBlockSize > 0);\n}\nvoid CFX_MapByteStringToPtr::RemoveAll()\n{\n    if (m_pHashTable != NULL) {\n        for (FX_DWORD nHash = 0; nHash < m_nHashTableSize; nHash++) {\n            CAssoc* pAssoc;\n            for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL;\n                    pAssoc = pAssoc->pNext) {\n                DestructElement(&pAssoc->key);\n            }\n        }\n        FX_Free(m_pHashTable);\n        m_pHashTable = NULL;\n    }\n    m_nCount = 0;\n    m_pFreeList = NULL;\n    m_pBlocks->FreeDataChain();\n    m_pBlocks = NULL;\n}\nCFX_MapByteStringToPtr::~CFX_MapByteStringToPtr()\n{\n    RemoveAll();\n    ASSERT(m_nCount == 0);\n}\nvoid CFX_MapByteStringToPtr::GetNextAssoc(FX_POSITION& rNextPosition,\n        CFX_ByteString& rKey, void*& rValue) const\n{\n    ASSERT(m_pHashTable != NULL);\n    CAssoc* pAssocRet = (CAssoc*)rNextPosition;\n    ASSERT(pAssocRet != NULL);\n    if (pAssocRet == (CAssoc*) - 1) {\n        for (FX_DWORD nBucket = 0; nBucket < m_nHashTableSize; nBucket++)\n            if ((pAssocRet = m_pHashTable[nBucket]) != NULL) {\n                break;\n            }\n        ASSERT(pAssocRet != NULL);\n    }\n    CAssoc* pAssocNext;\n    if ((pAssocNext = pAssocRet->pNext) == NULL) {\n        for (FX_DWORD nBucket = pAssocRet->nHashValue + 1;\n                nBucket < m_nHashTableSize; nBucket++)\n            if ((pAssocNext = m_pHashTable[nBucket]) != NULL) {\n                break;\n            }\n    }\n    rNextPosition = (FX_POSITION) pAssocNext;\n    rKey = pAssocRet->key;\n    rValue = pAssocRet->value;\n}\nFX_LPVOID CFX_MapByteStringToPtr::GetNextValue(FX_POSITION& rNextPosition) const\n{\n    ASSERT(m_pHashTable != NULL);\n    CAssoc* pAssocRet = (CAssoc*)rNextPosition;\n    ASSERT(pAssocRet != NULL);\n    if (pAssocRet == (CAssoc*) - 1) {\n        for (FX_DWORD nBucket = 0; nBucket < m_nHashTableSize; nBucket++)\n            if ((pAssocRet = m_pHashTable[nBucket]) != NULL) {\n                break;\n            }\n        ASSERT(pAssocRet != NULL);\n    }\n    CAssoc* pAssocNext;\n    if ((pAssocNext = pAssocRet->pNext) == NULL) {\n        for (FX_DWORD nBucket = pAssocRet->nHashValue + 1;\n                nBucket < m_nHashTableSize; nBucket++)\n            if ((pAssocNext = m_pHashTable[nBucket]) != NULL) {\n                break;\n            }\n    }\n    rNextPosition = (FX_POSITION) pAssocNext;\n    return pAssocRet->value;\n}\nvoid*& CFX_MapByteStringToPtr::operator[](FX_BSTR key)\n{\n    FX_DWORD nHash;\n    CAssoc* pAssoc;\n    if ((pAssoc = GetAssocAt(key, nHash)) == NULL) {\n        if (m_pHashTable == NULL) {\n            InitHashTable(m_nHashTableSize);\n        }\n        pAssoc = NewAssoc();\n        pAssoc->nHashValue = nHash;\n        pAssoc->key = key;\n        pAssoc->pNext = m_pHashTable[nHash];\n        m_pHashTable[nHash] = pAssoc;\n    }\n    return pAssoc->value;\n}\nCFX_MapByteStringToPtr::CAssoc*\nCFX_MapByteStringToPtr::NewAssoc()\n{\n    if (m_pFreeList == NULL) {\n        CFX_Plex* newBlock = CFX_Plex::Create(m_pBlocks, m_nBlockSize, sizeof(CFX_MapByteStringToPtr::CAssoc));\n        CFX_MapByteStringToPtr::CAssoc* pAssoc = (CFX_MapByteStringToPtr::CAssoc*)newBlock->data();\n        pAssoc += m_nBlockSize - 1;\n        for (int i = m_nBlockSize - 1; i >= 0; i--, pAssoc--) {\n            pAssoc->pNext = m_pFreeList;\n            m_pFreeList = pAssoc;\n        }\n    }\n    ASSERT(m_pFreeList != NULL);\n    CFX_MapByteStringToPtr::CAssoc* pAssoc = m_pFreeList;\n    m_pFreeList = m_pFreeList->pNext;\n    m_nCount++;\n    ASSERT(m_nCount > 0);\n    ConstructElement(&pAssoc->key);\n    pAssoc->value = 0;\n    return pAssoc;\n}\nvoid CFX_MapByteStringToPtr::FreeAssoc(CFX_MapByteStringToPtr::CAssoc* pAssoc)\n{\n    DestructElement(&pAssoc->key);\n    pAssoc->pNext = m_pFreeList;\n    m_pFreeList = pAssoc;\n    m_nCount--;\n    ASSERT(m_nCount >= 0);\n    if (m_nCount == 0) {\n        RemoveAll();\n    }\n}\nCFX_MapByteStringToPtr::CAssoc*\nCFX_MapByteStringToPtr::GetAssocAt(FX_BSTR key, FX_DWORD& nHash) const\n{\n    nHash = HashKey(key) % m_nHashTableSize;\n    if (m_pHashTable == NULL) {\n        return NULL;\n    }\n    CAssoc* pAssoc;\n    for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL; pAssoc = pAssoc->pNext) {\n        if (pAssoc->key == key) {\n            return pAssoc;\n        }\n    }\n    return NULL;\n}\nFX_BOOL CFX_MapByteStringToPtr::Lookup(FX_BSTR key, void*& rValue) const\n{\n    FX_DWORD nHash;\n    CAssoc* pAssoc = GetAssocAt(key, nHash);\n    if (pAssoc == NULL) {\n        return FALSE;\n    }\n    rValue = pAssoc->value;\n    return TRUE;\n}\nvoid CFX_MapByteStringToPtr::InitHashTable(\n    FX_DWORD nHashSize, FX_BOOL bAllocNow)\n{\n    ASSERT(m_nCount == 0);\n    ASSERT(nHashSize > 0);\n    if (m_pHashTable != NULL) {\n        FX_Free(m_pHashTable);\n        m_pHashTable = NULL;\n    }\n    if (bAllocNow) {\n        m_pHashTable = FX_Alloc(CAssoc*, nHashSize);\n    }\n    m_nHashTableSize = nHashSize;\n}\ninline FX_DWORD CFX_MapByteStringToPtr::HashKey(FX_BSTR key) const\n{\n    FX_DWORD nHash = 0;\n    int len = key.GetLength();\n    FX_LPCBYTE buf = key;\n    for (int i = 0; i < len; i ++) {\n        nHash = (nHash << 5) + nHash + buf[i];\n    }\n    return nHash;\n}\nFX_BOOL CFX_MapByteStringToPtr::RemoveKey(FX_BSTR key)\n{\n    if (m_pHashTable == NULL) {\n        return FALSE;\n    }\n    CAssoc** ppAssocPrev;\n    ppAssocPrev = &m_pHashTable[HashKey(key) % m_nHashTableSize];\n    CAssoc* pAssoc;\n    for (pAssoc = *ppAssocPrev; pAssoc != NULL; pAssoc = pAssoc->pNext) {\n        if (pAssoc->key == key) {\n            *ppAssocPrev = pAssoc->pNext;\n            FreeAssoc(pAssoc);\n            return TRUE;\n        }\n        ppAssocPrev = &pAssoc->pNext;\n    }\n    return FALSE;\n}\nstruct _CompactString {\n    FX_BYTE\t\tm_CompactLen;\n    FX_BYTE\t\tm_LenHigh;\n    FX_BYTE\t\tm_LenLow;\n    FX_BYTE\t\tm_Unused;\n    FX_LPBYTE\tm_pBuffer;\n};\nstatic void _CompactStringRelease(_CompactString* pCompact)\n{\n    if (pCompact->m_CompactLen == 0xff) {\n        FX_Free(pCompact->m_pBuffer);\n    }\n}\nstatic FX_BOOL _CompactStringSame(_CompactString* pCompact, FX_LPCBYTE pStr, int len)\n{\n    if (len < sizeof(_CompactString)) {\n        if (pCompact->m_CompactLen != len) {\n            return FALSE;\n        }\n        return FXSYS_memcmp32(&pCompact->m_LenHigh, pStr, len) == 0;\n    }\n    if (pCompact->m_CompactLen != 0xff || pCompact->m_LenHigh * 256 + pCompact->m_LenLow != len) {\n        return FALSE;\n    }\n    return FXSYS_memcmp32(pCompact->m_pBuffer, pStr, len) == 0;\n}\nstatic void _CompactStringStore(_CompactString* pCompact, FX_LPCBYTE pStr, int len)\n{\n    if (len < (int)sizeof(_CompactString)) {\n        pCompact->m_CompactLen = (FX_BYTE)len;\n        FXSYS_memcpy32(&pCompact->m_LenHigh, pStr, len);\n        return;\n    }\n    pCompact->m_CompactLen = 0xff;\n    pCompact->m_LenHigh = len / 256;\n    pCompact->m_LenLow = len % 256;\n    pCompact->m_pBuffer = FX_Alloc(FX_BYTE, len);\n    if (pCompact->m_pBuffer) {\n        FXSYS_memcpy32(pCompact->m_pBuffer, pStr, len);\n    }\n}\nstatic CFX_ByteStringC _CompactStringGet(_CompactString* pCompact)\n{\n    if (pCompact->m_CompactLen == 0xff) {\n        return CFX_ByteStringC(pCompact->m_pBuffer, pCompact->m_LenHigh * 256 + pCompact->m_LenLow);\n    }\n    if (pCompact->m_CompactLen == 0xfe) {\n        return CFX_ByteStringC();\n    }\n    return CFX_ByteStringC(&pCompact->m_LenHigh, pCompact->m_CompactLen);\n}\n#define CMAP_ALLOC_STEP\t\t8\n#define CMAP_INDEX_SIZE\t\t8\nCFX_CMapByteStringToPtr::CFX_CMapByteStringToPtr()\n    : m_Buffer(sizeof(_CompactString) + sizeof(void*), CMAP_ALLOC_STEP, CMAP_INDEX_SIZE)\n{\n}\nCFX_CMapByteStringToPtr::~CFX_CMapByteStringToPtr()\n{\n    RemoveAll();\n}\nvoid CFX_CMapByteStringToPtr::RemoveAll()\n{\n    int size = m_Buffer.GetSize();\n    for (int i = 0; i < size; i++) {\n        _CompactStringRelease((_CompactString*)m_Buffer.GetAt(i));\n    }\n    m_Buffer.RemoveAll();\n}\nFX_POSITION CFX_CMapByteStringToPtr::GetStartPosition() const\n{\n    int size = m_Buffer.GetSize();\n    for (int i = 0; i < size; i ++) {\n        _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(i);\n        if (pKey->m_CompactLen != 0xfe) {\n            return (FX_POSITION)(FX_UINTPTR)(i + 1);\n        }\n    }\n    return NULL;\n}\nvoid CFX_CMapByteStringToPtr::GetNextAssoc(FX_POSITION& rNextPosition, CFX_ByteString& rKey, void*& rValue) const\n{\n    if (rNextPosition == NULL) {\n        return;\n    }\n    int index = (int)(FX_UINTPTR)rNextPosition - 1;\n    _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);\n    rKey = _CompactStringGet(pKey);\n    rValue = *(void**)(pKey + 1);\n    index ++;\n    int size = m_Buffer.GetSize();\n    while (index < size) {\n        pKey = (_CompactString*)m_Buffer.GetAt(index);\n        if (pKey->m_CompactLen != 0xfe) {\n            rNextPosition = (FX_POSITION)(FX_UINTPTR)(index + 1);\n            return;\n        }\n        index ++;\n    }\n    rNextPosition = NULL;\n}\nFX_LPVOID CFX_CMapByteStringToPtr::GetNextValue(FX_POSITION& rNextPosition) const\n{\n    if (rNextPosition == NULL) {\n        return NULL;\n    }\n    int index = (int)(FX_UINTPTR)rNextPosition - 1;\n    _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);\n    FX_LPVOID rValue = *(void**)(pKey + 1);\n    index ++;\n    int size = m_Buffer.GetSize();\n    while (index < size) {\n        pKey = (_CompactString*)m_Buffer.GetAt(index);\n        if (pKey->m_CompactLen != 0xfe) {\n            rNextPosition = (FX_POSITION)(FX_UINTPTR)(index + 1);\n            return rValue;\n        }\n        index ++;\n    }\n    rNextPosition = NULL;\n    return rValue;\n}\nFX_BOOL _CMapLookupCallback(void* param, void* pData)\n{\n    return !_CompactStringSame((_CompactString*)pData, ((CFX_ByteStringC*)param)->GetPtr(), ((CFX_ByteStringC*)param)->GetLength());\n}\nFX_BOOL CFX_CMapByteStringToPtr::Lookup(FX_BSTR key, void*& rValue) const\n{\n    void* p = m_Buffer.Iterate(_CMapLookupCallback, (void*)&key);\n    if (!p) {\n        return FALSE;\n    }\n    rValue = *(void**)((_CompactString*)p + 1);\n    return TRUE;\n}\nvoid CFX_CMapByteStringToPtr::SetAt(FX_BSTR key, void* value)\n{\n    ASSERT(value != NULL);\n    int index, key_len = key.GetLength();\n    int size = m_Buffer.GetSize();\n    for (index = 0; index < size; index ++) {\n        _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);\n        if (!_CompactStringSame(pKey, (FX_LPCBYTE)key, key_len)) {\n            continue;\n        }\n        *(void**)(pKey + 1) = value;\n        return;\n    }\n    for (index = 0; index < size; index ++) {\n        _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);\n        if (pKey->m_CompactLen) {\n            continue;\n        }\n        _CompactStringStore(pKey, (FX_LPCBYTE)key, key_len);\n        *(void**)(pKey + 1) = value;\n        return;\n    }\n    _CompactString* pKey = (_CompactString*)m_Buffer.Add();\n    _CompactStringStore(pKey, (FX_LPCBYTE)key, key_len);\n    *(void**)(pKey + 1) = value;\n}\nvoid CFX_CMapByteStringToPtr::AddValue(FX_BSTR key, void* value)\n{\n    ASSERT(value != NULL);\n    _CompactString* pKey = (_CompactString*)m_Buffer.Add();\n    _CompactStringStore(pKey, (FX_LPCBYTE)key, key.GetLength());\n    *(void**)(pKey + 1) = value;\n}\nvoid CFX_CMapByteStringToPtr::RemoveKey(FX_BSTR key)\n{\n    int key_len = key.GetLength();\n    int size = m_Buffer.GetSize();\n    for (int index = 0; index < size; index++) {\n        _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);\n        if (!_CompactStringSame(pKey, (FX_LPCBYTE)key, key_len)) {\n            continue;\n        }\n        _CompactStringRelease(pKey);\n        pKey->m_CompactLen = 0xfe;\n        return;\n    }\n}\nint CFX_CMapByteStringToPtr::GetCount() const\n{\n    int count = 0;\n    int size = m_Buffer.GetSize();\n    for (int i = 0; i < size; i ++) {\n        _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(i);\n        if (pKey->m_CompactLen != 0xfe) {\n            count ++;\n        }\n    }\n    return count;\n}\nextern \"C\" {\n    static int _CompareDWord(const void* p1, const void* p2)\n    {\n        return (*(FX_DWORD*)p1) - (*(FX_DWORD*)p2);\n    }\n};\nstruct _DWordPair {\n    FX_DWORD key;\n    FX_DWORD value;\n};\nFX_BOOL CFX_CMapDWordToDWord::Lookup(FX_DWORD key, FX_DWORD& value) const\n{\n    FX_LPVOID pResult = FXSYS_bsearch(&key, m_Buffer.GetBuffer(), m_Buffer.GetSize() / sizeof(_DWordPair),\n                                      sizeof(_DWordPair), _CompareDWord);\n    if (pResult == NULL) {\n        return FALSE;\n    }\n    value = ((FX_DWORD*)pResult)[1];\n    return TRUE;\n}\nFX_POSITION CFX_CMapDWordToDWord::GetStartPosition() const\n{\n    FX_DWORD count = m_Buffer.GetSize() / sizeof(_DWordPair);\n    if (count == 0) {\n        return NULL;\n    }\n    return (FX_POSITION)1;\n}\nvoid CFX_CMapDWordToDWord::GetNextAssoc(FX_POSITION& pos, FX_DWORD& key, FX_DWORD& value) const\n{\n    if (pos == 0) {\n        return;\n    }\n    FX_DWORD index = ((FX_DWORD)(FX_UINTPTR)pos) - 1;\n    FX_DWORD count = m_Buffer.GetSize() / sizeof(_DWordPair);\n    _DWordPair* buf = (_DWordPair*)m_Buffer.GetBuffer();\n    key = buf[index].key;\n    value = buf[index].value;\n    if (index == count - 1) {\n        pos = 0;\n    } else {\n        pos = (FX_POSITION)((FX_UINTPTR)pos + 1);\n    }\n}\nvoid CFX_CMapDWordToDWord::SetAt(FX_DWORD key, FX_DWORD value)\n{\n    FX_DWORD count = m_Buffer.GetSize() / sizeof(_DWordPair);\n    _DWordPair* buf = (_DWordPair*)m_Buffer.GetBuffer();\n    _DWordPair pair = {key, value};\n    if (count == 0 || key > buf[count - 1].key) {\n        m_Buffer.AppendBlock(&pair, sizeof(_DWordPair));\n        return;\n    }\n    int low = 0, high = count - 1;\n    while (low <= high) {\n        int mid = (low + high) / 2;\n        if (buf[mid].key < key) {\n            low = mid + 1;\n        } else if (buf[mid].key > key) {\n            high = mid - 1;\n        } else {\n            buf[mid].value = value;\n            return;\n        }\n    }\n    m_Buffer.InsertBlock(low * sizeof(_DWordPair), &pair, sizeof(_DWordPair));\n}\nvoid CFX_CMapDWordToDWord::EstimateSize(FX_DWORD size, FX_DWORD grow_by)\n{\n    m_Buffer.EstimateSize(size, grow_by);\n}\n"
  },
  {
    "path": "core/src/fxcrt/fx_basic_memmgr.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxcrt/fx_basic.h\"\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nvoid*\tFXMEM_DefaultAlloc(size_t byte_size, int flags)\n{\n    return (void*)malloc(byte_size);\n}\nvoid*\tFXMEM_DefaultRealloc(void* pointer, size_t new_size, int flags)\n{\n    return realloc(pointer, new_size);\n}\nvoid\tFXMEM_DefaultFree(void* pointer, int flags)\n{\n    free(pointer);\n}\n#ifdef __cplusplus\n}\n#endif\nCFX_GrowOnlyPool::CFX_GrowOnlyPool(size_t trunk_size)\n{\n    m_TrunkSize = trunk_size;\n    m_pFirstTrunk = NULL;\n}\nCFX_GrowOnlyPool::~CFX_GrowOnlyPool()\n{\n    FreeAll();\n}\nstruct _FX_GrowOnlyTrunk {\n    size_t\tm_Size;\n    size_t\tm_Allocated;\n    _FX_GrowOnlyTrunk*\tm_pNext;\n};\nvoid CFX_GrowOnlyPool::FreeAll()\n{\n    _FX_GrowOnlyTrunk* pTrunk = (_FX_GrowOnlyTrunk*)m_pFirstTrunk;\n    while (pTrunk) {\n        _FX_GrowOnlyTrunk* pNext = pTrunk->m_pNext;\n        FX_Free(pTrunk);\n        pTrunk = pNext;\n    }\n    m_pFirstTrunk = NULL;\n}\nvoid* CFX_GrowOnlyPool::Alloc(size_t size)\n{\n    size = (size + 3) / 4 * 4;\n    _FX_GrowOnlyTrunk* pTrunk = (_FX_GrowOnlyTrunk*)m_pFirstTrunk;\n    while (pTrunk) {\n        if (pTrunk->m_Size - pTrunk->m_Allocated >= size) {\n            void* p = (FX_LPBYTE)(pTrunk + 1) + pTrunk->m_Allocated;\n            pTrunk->m_Allocated += size;\n            return p;\n        }\n        pTrunk = pTrunk->m_pNext;\n    }\n    size_t alloc_size = size > m_TrunkSize ? size : m_TrunkSize;\n    pTrunk = (_FX_GrowOnlyTrunk*)FX_Alloc(FX_BYTE, sizeof(_FX_GrowOnlyTrunk) + alloc_size);\n    pTrunk->m_Size = alloc_size;\n    pTrunk->m_Allocated = size;\n    pTrunk->m_pNext = (_FX_GrowOnlyTrunk*)m_pFirstTrunk;\n    m_pFirstTrunk = pTrunk;\n    return pTrunk + 1;\n}\n"
  },
  {
    "path": "core/src/fxcrt/fx_basic_plex.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxcrt/fx_basic.h\"\n#include \"plex.h\"\nCFX_Plex* CFX_Plex::Create(CFX_Plex*& pHead, FX_DWORD nMax, FX_DWORD cbElement)\n{\n    CFX_Plex* p = (CFX_Plex*)FX_Alloc(FX_BYTE, sizeof(CFX_Plex) + nMax * cbElement);\n    if (!p) {\n        return NULL;\n    }\n    p->pNext = pHead;\n    pHead = p;\n    return p;\n}\nvoid CFX_Plex::FreeDataChain()\n{\n    CFX_Plex* p = this;\n    while (p != NULL) {\n        FX_BYTE* bytes = (FX_BYTE*)p;\n        CFX_Plex* pNext = p->pNext;\n        FX_Free(bytes);\n        p = pNext;\n    }\n}\n"
  },
  {
    "path": "core/src/fxcrt/fx_basic_utf.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxcrt/fx_basic.h\"\nvoid CFX_UTF8Decoder::Clear()\n{\n    m_Buffer.Clear();\n    m_PendingBytes = 0;\n}\nvoid CFX_UTF8Decoder::AppendChar(FX_DWORD ch)\n{\n    m_Buffer.AppendChar((FX_WCHAR)ch);\n}\nvoid CFX_UTF8Decoder::Input(FX_BYTE byte)\n{\n    if (byte < 0x80) {\n        m_PendingBytes = 0;\n        m_Buffer.AppendChar(byte);\n    } else if (byte < 0xc0) {\n        if (m_PendingBytes == 0) {\n            return;\n        }\n        m_PendingBytes --;\n        m_PendingChar |= (byte & 0x3f) << (m_PendingBytes * 6);\n        if (m_PendingBytes == 0) {\n            AppendChar(m_PendingChar);\n        }\n    } else if (byte < 0xe0) {\n        m_PendingBytes = 1;\n        m_PendingChar = (byte & 0x1f) << 6;\n    } else if (byte < 0xf0) {\n        m_PendingBytes = 2;\n        m_PendingChar = (byte & 0x0f) << 12;\n    } else if (byte < 0xf8) {\n        m_PendingBytes = 3;\n        m_PendingChar = (byte & 0x07) << 18;\n    } else if (byte < 0xfc) {\n        m_PendingBytes = 4;\n        m_PendingChar = (byte & 0x03) << 24;\n    } else if (byte < 0xfe) {\n        m_PendingBytes = 5;\n        m_PendingChar = (byte & 0x01) << 30;\n    }\n}\nvoid CFX_UTF8Encoder::Input(FX_WCHAR unicode)\n{\n    if ((FX_DWORD)unicode < 0x80) {\n        m_Buffer.AppendChar(unicode);\n    } else {\n        if ((FX_DWORD)unicode >= 0x80000000) {\n            return;\n        }\n        int nbytes = 0;\n        if ((FX_DWORD)unicode < 0x800) {\n            nbytes = 2;\n        } else if ((FX_DWORD)unicode < 0x10000) {\n            nbytes = 3;\n        } else if ((FX_DWORD)unicode < 0x200000) {\n            nbytes = 4;\n        } else if ((FX_DWORD)unicode < 0x4000000) {\n            nbytes = 5;\n        } else {\n            nbytes = 6;\n        }\n        static FX_BYTE prefix[] = {0xc0, 0xe0, 0xf0, 0xf8, 0xfc};\n        int order = 1 << ((nbytes - 1) * 6);\n        int code = unicode;\n        m_Buffer.AppendChar(prefix[nbytes - 2] | (code / order));\n        for (int i = 0; i < nbytes - 1; i ++) {\n            code = code % order;\n            order >>= 6;\n            m_Buffer.AppendChar(0x80 | (code / order));\n        }\n    }\n}\nCFX_ByteString FX_UTF8Encode(FX_LPCWSTR pwsStr, FX_STRSIZE len)\n{\n    FXSYS_assert(pwsStr != NULL);\n    if (len < 0) {\n        len = (FX_STRSIZE)FXSYS_wcslen(pwsStr);\n    }\n    CFX_UTF8Encoder encoder;\n    while (len -- > 0) {\n        encoder.Input(*pwsStr ++);\n    }\n    return encoder.GetResult();\n}\n"
  },
  {
    "path": "core/src/fxcrt/fx_basic_util.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxcrt/fx_basic.h\"\n#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_\n#include <sys/types.h>\n#include <dirent.h>\n#else\n#include <direct.h>\n#endif\nCFX_PrivateData::~CFX_PrivateData()\n{\n    ClearAll();\n}\nvoid FX_PRIVATEDATA::FreeData()\n{\n    if (m_pData == NULL) {\n        return;\n    }\n    if (m_bSelfDestruct) {\n        delete (CFX_DestructObject*)m_pData;\n    } else if (m_pCallback) {\n        m_pCallback(m_pData);\n    }\n}\nvoid CFX_PrivateData::AddData(FX_LPVOID pModuleId, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback, FX_BOOL bSelfDestruct)\n{\n    if (pModuleId == NULL) {\n        return;\n    }\n    FX_PRIVATEDATA* pList = m_DataList.GetData();\n    int count = m_DataList.GetSize();\n    for (int i = 0; i < count; i ++) {\n        if (pList[i].m_pModuleId == pModuleId) {\n            pList[i].FreeData();\n            pList[i].m_pData = pData;\n            pList[i].m_pCallback = callback;\n            return;\n        }\n    }\n    FX_PRIVATEDATA data = {pModuleId, pData, callback, bSelfDestruct};\n    m_DataList.Add(data);\n}\nvoid CFX_PrivateData::SetPrivateData(FX_LPVOID pModuleId, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback)\n{\n    AddData(pModuleId, pData, callback, FALSE);\n}\nvoid CFX_PrivateData::SetPrivateObj(FX_LPVOID pModuleId, CFX_DestructObject* pObj)\n{\n    AddData(pModuleId, pObj, NULL, TRUE);\n}\nFX_BOOL CFX_PrivateData::RemovePrivateData(FX_LPVOID pModuleId)\n{\n    if (pModuleId == NULL) {\n        return FALSE;\n    }\n    FX_PRIVATEDATA* pList = m_DataList.GetData();\n    int count = m_DataList.GetSize();\n    for (int i = 0; i < count; i ++) {\n        if (pList[i].m_pModuleId == pModuleId) {\n            m_DataList.RemoveAt(i);\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nFX_LPVOID CFX_PrivateData::GetPrivateData(FX_LPVOID pModuleId)\n{\n    if (pModuleId == NULL) {\n        return NULL;\n    }\n    FX_PRIVATEDATA* pList = m_DataList.GetData();\n    int count = m_DataList.GetSize();\n    for (int i = 0; i < count; i ++) {\n        if (pList[i].m_pModuleId == pModuleId) {\n            return pList[i].m_pData;\n        }\n    }\n    return NULL;\n}\nvoid CFX_PrivateData::ClearAll()\n{\n    FX_PRIVATEDATA* pList = m_DataList.GetData();\n    int count = m_DataList.GetSize();\n    for (int i = 0; i < count; i ++) {\n        pList[i].FreeData();\n    }\n    m_DataList.RemoveAll();\n}\nvoid FX_atonum(FX_BSTR strc, FX_BOOL& bInteger, void* pData)\n{\n    if (FXSYS_memchr(strc.GetPtr(), '.', strc.GetLength()) == NULL) {\n        bInteger = TRUE;\n        int cc = 0, integer = 0;\n        FX_LPCSTR str = strc.GetCStr();\n        int len = strc.GetLength();\n        FX_BOOL bNegative = FALSE;\n        if (str[0] == '+') {\n            cc++;\n        } else if (str[0] == '-') {\n            bNegative = TRUE;\n            cc++;\n        }\n        while (cc < len) {\n            if (str[cc] < '0' || str[cc] > '9') {\n                break;\n            }\n            integer = integer * 10 + str[cc] - '0';\n            if (integer < 0) {\n                break;\n            }\n            cc ++;\n        }\n        if (bNegative) {\n            integer = -integer;\n        }\n        *(int*)pData = integer;\n    } else {\n        bInteger = FALSE;\n        *(FX_FLOAT*)pData = FX_atof(strc);\n    }\n}\nFX_FLOAT FX_atof(FX_BSTR strc)\n{\n    if (strc.GetLength() == 0) {\n        return 0.0;\n    }\n    int cc = 0;\n    FX_BOOL bNegative = FALSE;\n    FX_LPCSTR str = strc.GetCStr();\n    int len = strc.GetLength();\n    if (str[0] == '+') {\n        cc++;\n    } else if (str[0] == '-') {\n        bNegative = TRUE;\n        cc++;\n    }\n    while (cc < len) {\n        if (str[cc] != '+' && str[cc] != '-') {\n            break;\n        }\n        cc ++;\n    }\n    FX_FLOAT value = 0;\n    while (cc < len) {\n        if (str[cc] == '.') {\n            break;\n        }\n        value = value * 10 + str[cc] - '0';\n        cc ++;\n    }\n    static const FX_FLOAT fraction_scales[] = {0.1f, 0.01f, 0.001f, 0.0001f, 0.00001f, 0.000001f,\n                                               0.0000001f, 0.00000001f, 0.000000001f, 0.0000000001f, 0.00000000001f\n                                              };\n    int scale = 0;\n    if (cc < len && str[cc] == '.') {\n        cc ++;\n        while (cc < len) {\n            value += fraction_scales[scale] * (str[cc] - '0');\n            scale ++;\n            if (scale == sizeof fraction_scales / sizeof(FX_FLOAT)) {\n                break;\n            }\n            cc ++;\n        }\n    }\n    return bNegative ? -value : value;\n}\nstatic FX_BOOL FX_IsDigit(FX_BYTE ch)\n{\n    return (ch >= '0' && ch <= '9') ? TRUE : FALSE;\n}\nstatic FX_BOOL FX_IsXDigit(FX_BYTE ch)\n{\n    return (FX_IsDigit(ch) || (ch >= 'A' && ch <= 'F') || (ch >= 'a' && ch <= 'f')) ? TRUE : FALSE;\n}\nstatic FX_BYTE FX_MakeUpper(FX_BYTE ch)\n{\n    if (ch < 'a' || ch > 'z') {\n        return ch;\n    }\n    return ch - 32;\n}\nstatic int FX_HexToI(FX_BYTE ch)\n{\n    ch = FX_MakeUpper(ch);\n    return FX_IsDigit(ch) ? (ch - '0') : (ch - 55);\n}\nstatic const unsigned char url_encodeTable[128] = {\n    1,  1,  1,  1,\t\t1,  1,  1,  1,\n    1,  1,  1,  1,\t\t1,  1,  1,  1,\n    1,  1,  1,  1,\t\t1,  1,  1,  1,\n    1,  1,  1,  1,\t\t1,  1,  1,  1,\n    1,  0,  1,  1,\t\t0,  1,  0,  0,\n    0,  0,  0,  0,\t\t0,  0,  0,  0,\n    0,  0,  0,  0,\t\t0,  0,  0,  0,\n    0,  0,  0,  0,\t\t1,  0,  1,  0,\n    0,  0,  0,  0,\t\t0,  0,  0,  0,\n    0,  0,  0,  0,\t\t0,  0,  0,  0,\n    0,  0,  0,  0,\t\t0,  0,  0,  0,\n    0,  0,  0,  1,\t\t1,  1,  1,  0,\n    1,  0,  0,  0,\t\t0,  0,  0,  0,\n    0,  0,  0,  0,\t\t0,  0,  0,  0,\n    0,  0,  0,  0,\t\t0,  0,  0,  0,\n    0,  0,  0,  1,\t\t1,  1,  1,  1,\n};\nCFX_ByteString FX_UrlEncode(const CFX_WideString& wsUrl)\n{\n    const char arDigits[] = \"0123456789ABCDEF\";\n    CFX_ByteString rUrl;\n    int nLength = wsUrl.GetLength();\n    for (int i = 0; i < nLength; i++) {\n        FX_DWORD word = wsUrl.GetAt(i);\n        if (word > 0x7F || url_encodeTable[word] == 1) {\n            CFX_ByteString bsUri = CFX_ByteString::FromUnicode((FX_WORD)word);\n            int nByte = bsUri.GetLength();\n            for (int j = 0; j < nByte; j++) {\n                rUrl += '%';\n                FX_BYTE code = bsUri.GetAt(j);\n                rUrl += arDigits[code >> 4];\n                rUrl += arDigits[code & 0x0F];\n            }\n        } else {\n            rUrl += CFX_ByteString::FromUnicode((FX_WORD)word);\n        }\n    }\n    return rUrl;\n}\nCFX_WideString FX_UrlDecode(const CFX_ByteString& bsUrl)\n{\n    CFX_ByteString rUrl;\n    int nLength = bsUrl.GetLength();\n    for (int i = 0; i < nLength; i++) {\n        if (i < nLength - 2 && bsUrl[i] == '%' && FX_IsXDigit(bsUrl[i + 1]) && FX_IsXDigit(bsUrl[i + 2])) {\n            rUrl += (FX_HexToI(bsUrl[i + 1]) << 4 | FX_HexToI(bsUrl[i + 2]));\n            i += 2;\n        } else {\n            rUrl += bsUrl[i];\n        }\n    }\n    return CFX_WideString::FromLocal(rUrl);\n}\nCFX_ByteString FX_EncodeURI(const CFX_WideString& wsURI)\n{\n    const char arDigits[] = \"0123456789ABCDEF\";\n    CFX_ByteString rURI;\n    CFX_ByteString bsUri = wsURI.UTF8Encode();\n    int nLength = bsUri.GetLength();\n    for (int i = 0; i < nLength; i++) {\n        FX_BYTE code = bsUri.GetAt(i);\n        if (code > 0x7F || url_encodeTable[code] == 1) {\n            rURI += '%';\n            rURI += arDigits[code >> 4];\n            rURI += arDigits[code & 0x0F];\n        } else {\n            rURI += code;\n        }\n    }\n    return rURI;\n}\nCFX_WideString FX_DecodeURI(const CFX_ByteString& bsURI)\n{\n    CFX_ByteString rURI;\n    int nLength = bsURI.GetLength();\n    for (int i = 0; i < nLength; i++) {\n        if (i < nLength - 2 && bsURI[i] == '%' && FX_IsXDigit(bsURI[i + 1]) && FX_IsXDigit(bsURI[i + 2])) {\n            rURI += (FX_HexToI(bsURI[i + 1]) << 4 | FX_HexToI(bsURI[i + 2]));\n            i += 2;\n        } else {\n            rURI += bsURI[i];\n        }\n    }\n    return CFX_WideString::FromUTF8(rURI, rURI.GetLength());\n}\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\nclass CFindFileData : public CFX_Object\n{\npublic:\n    virtual ~CFindFileData() {}\n    HANDLE\t\t\t\tm_Handle;\n    FX_BOOL\t\t\t\tm_bEnd;\n};\nclass CFindFileDataA : public CFindFileData\n{\npublic:\n    virtual ~CFindFileDataA() {}\n    WIN32_FIND_DATAA\tm_FindData;\n};\nclass CFindFileDataW : public CFindFileData\n{\npublic:\n    virtual ~CFindFileDataW() {}\n    WIN32_FIND_DATAW\tm_FindData;\n};\n#endif\nvoid* FX_OpenFolder(FX_LPCSTR path)\n{\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\n#ifndef _WIN32_WCE\n    CFindFileDataA* pData = FX_NEW CFindFileDataA;\n    if (!pData) {\n        return NULL;\n    }\n#ifdef _FX_WINAPI_PARTITION_DESKTOP_\n    pData->m_Handle = FindFirstFileA(CFX_ByteString(path) + \"/*.*\", &pData->m_FindData);\n#else\n    pData->m_Handle = FindFirstFileExA(CFX_ByteString(path) + \"/*.*\", FindExInfoStandard, &pData->m_FindData, FindExSearchNameMatch, NULL, 0);\n#endif\n#else\n    CFindFileDataW* pData = FX_NEW CFindFileDataW;\n    if (!pData) {\n        return NULL;\n    }\n    pData->m_Handle = FindFirstFileW(CFX_WideString::FromLocal(path) + L\"/*.*\", &pData->m_FindData);\n#endif\n    if (pData->m_Handle == INVALID_HANDLE_VALUE) {\n        delete pData;\n        return NULL;\n    }\n    pData->m_bEnd = FALSE;\n    return pData;\n#else\n    DIR* dir = opendir(path);\n    return dir;\n#endif\n}\nvoid* FX_OpenFolder(FX_LPCWSTR path)\n{\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\n    CFindFileDataW* pData = FX_NEW CFindFileDataW;\n    if (!pData) {\n        return NULL;\n    }\n#ifdef _FX_WINAPI_PARTITION_DESKTOP_\n    pData->m_Handle = FindFirstFileW(CFX_WideString(path) + L\"/*.*\", &pData->m_FindData);\n#else\n    pData->m_Handle = FindFirstFileExW(CFX_WideString(path) + L\"/*.*\", FindExInfoStandard, &pData->m_FindData, FindExSearchNameMatch, NULL, 0);\n#endif\n    if (pData->m_Handle == INVALID_HANDLE_VALUE) {\n        delete pData;\n        return NULL;\n    }\n    pData->m_bEnd = FALSE;\n    return pData;\n#else\n    DIR* dir = opendir(CFX_ByteString::FromUnicode(path));\n    return dir;\n#endif\n}\nFX_BOOL FX_GetNextFile(void* handle, CFX_ByteString& filename, FX_BOOL& bFolder)\n{\n    if (handle == NULL) {\n        return FALSE;\n    }\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\n#ifndef _WIN32_WCE\n    CFindFileDataA* pData = (CFindFileDataA*)handle;\n    if (pData->m_bEnd) {\n        return FALSE;\n    }\n    filename = pData->m_FindData.cFileName;\n    bFolder = pData->m_FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;\n    if (!FindNextFileA(pData->m_Handle, &pData->m_FindData)) {\n        pData->m_bEnd = TRUE;\n    }\n    return TRUE;\n#else\n    CFindFileDataW* pData = (CFindFileDataW*)handle;\n    if (pData->m_bEnd) {\n        return FALSE;\n    }\n    filename = CFX_ByteString::FromUnicode(pData->m_FindData.cFileName);\n    bFolder = pData->m_FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;\n    if (!FindNextFileW(pData->m_Handle, &pData->m_FindData)) {\n        pData->m_bEnd = TRUE;\n    }\n    return TRUE;\n#endif\n#elif defined(__native_client__)\n    abort();\n    return FALSE;\n#else\n    struct dirent *de = readdir((DIR*)handle);\n    if (de == NULL) {\n        return FALSE;\n    }\n    filename = de->d_name;\n    bFolder = de->d_type == DT_DIR;\n    return TRUE;\n#endif\n}\nFX_BOOL FX_GetNextFile(void* handle, CFX_WideString& filename, FX_BOOL& bFolder)\n{\n    if (handle == NULL) {\n        return FALSE;\n    }\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\n    CFindFileDataW* pData = (CFindFileDataW*)handle;\n    if (pData->m_bEnd) {\n        return FALSE;\n    }\n    filename = pData->m_FindData.cFileName;\n    bFolder = pData->m_FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;\n    if (!FindNextFileW(pData->m_Handle, &pData->m_FindData)) {\n        pData->m_bEnd = TRUE;\n    }\n    return TRUE;\n#elif defined(__native_client__)\n    abort();\n    return FALSE;\n#else\n    struct dirent *de = readdir((DIR*)handle);\n    if (de == NULL) {\n        return FALSE;\n    }\n    filename = CFX_WideString::FromLocal(de->d_name);\n    bFolder = de->d_type == DT_DIR;\n    return TRUE;\n#endif\n}\nvoid FX_CloseFolder(void* handle)\n{\n    if (handle == NULL) {\n        return;\n    }\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\n    CFindFileData* pData = (CFindFileData*)handle;\n    FindClose(pData->m_Handle);\n    delete pData;\n#else\n    closedir((DIR*)handle);\n#endif\n}\nFX_WCHAR FX_GetFolderSeparator()\n{\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\n    return '\\\\';\n#else\n    return '/';\n#endif\n}\n"
  },
  {
    "path": "core/src/fxcrt/fx_basic_wstring.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxcrt/fx_basic.h\"\n#include \"../../../third_party/numerics/safe_math.h\"\n\nstatic CFX_StringDataW* FX_AllocStringW(int nLen)\n{\n    if (nLen == 0 || nLen < 0) {\n        return NULL;\n    }\n\n    base::CheckedNumeric<int> iSize = static_cast<int>(sizeof(FX_WCHAR));\n    iSize *= nLen + 1;\n    iSize += sizeof(long) * 3;\n    CFX_StringDataW* pData = (CFX_StringDataW*)FX_Alloc(FX_BYTE, iSize.ValueOrDie());\n    if (!pData) {\n        return NULL;\n    }\n\n    // TODO(palmer): |nLen| should really be declared as |size_t|, but for\n    // now I just want to fix the overflow without changing any interfaces.\n    // Declaring |nLen| as |size_t| will also simplify the above code\n    // somewhat.\n    pData->m_nAllocLength = nLen;\n    pData->m_nDataLength = nLen;\n    pData->m_nRefs = 1;\n    pData->m_String[nLen] = 0;\n    return pData;\n}\nstatic void FX_ReleaseStringW(CFX_StringDataW* pData)\n{\n    if (pData == NULL) {\n        return;\n    }\n    pData->m_nRefs --;\n    if (pData->m_nRefs <= 0) {\n        FX_Free(pData);\n    }\n}\nCFX_WideString::~CFX_WideString()\n{\n    if (m_pData == NULL) {\n        return;\n    }\n    m_pData->m_nRefs --;\n    if (m_pData->m_nRefs < 1) {\n        FX_Free(m_pData);\n    }\n}\nvoid CFX_WideString::InitStr(FX_LPCWSTR lpsz, FX_STRSIZE nLen)\n{\n    if (nLen < 0) {\n        nLen = lpsz ? (FX_STRSIZE)FXSYS_wcslen(lpsz) : 0;\n    }\n    if (nLen) {\n        m_pData = FX_AllocStringW(nLen);\n        if (!m_pData) {\n            return;\n        }\n        FXSYS_memcpy32(m_pData->m_String, lpsz, nLen * sizeof(FX_WCHAR));\n    } else {\n        m_pData = NULL;\n    }\n}\nCFX_WideString::CFX_WideString(const CFX_WideString& stringSrc)\n{\n    if (stringSrc.m_pData == NULL) {\n        m_pData = NULL;\n        return;\n    }\n    if (stringSrc.m_pData->m_nRefs >= 0) {\n        m_pData = stringSrc.m_pData;\n        m_pData->m_nRefs ++;\n    } else {\n        m_pData = NULL;\n        *this = stringSrc;\n    }\n}\nCFX_WideString::CFX_WideString(FX_WCHAR ch)\n{\n    m_pData = FX_AllocStringW(1);\n    if (m_pData) {\n        m_pData->m_String[0] = ch;\n    }\n}\nCFX_WideString::CFX_WideString(const CFX_WideStringC& str)\n{\n    if (str.IsEmpty()) {\n        m_pData = NULL;\n        return;\n    }\n    m_pData = FX_AllocStringW(str.GetLength());\n    if (m_pData) {\n        FXSYS_memcpy32(m_pData->m_String, str.GetPtr(), str.GetLength()*sizeof(FX_WCHAR));\n    }\n}\nCFX_WideString::CFX_WideString(const CFX_WideStringC& str1, const CFX_WideStringC& str2)\n{\n    m_pData = NULL;\n    int nNewLen = str1.GetLength() + str2.GetLength();\n    if (nNewLen == 0) {\n        return;\n    }\n    m_pData = FX_AllocStringW(nNewLen);\n    if (m_pData) {\n        FXSYS_memcpy32(m_pData->m_String, str1.GetPtr(), str1.GetLength()*sizeof(FX_WCHAR));\n        FXSYS_memcpy32(m_pData->m_String + str1.GetLength(), str2.GetPtr(), str2.GetLength()*sizeof(FX_WCHAR));\n    }\n}\nvoid CFX_WideString::ReleaseBuffer(FX_STRSIZE nNewLength)\n{\n    if (m_pData == NULL) {\n        return;\n    }\n    CopyBeforeWrite();\n    if (nNewLength == -1) {\n        nNewLength = m_pData ? (FX_STRSIZE)FXSYS_wcslen(m_pData->m_String) : 0;\n    }\n    if (nNewLength == 0) {\n        Empty();\n        return;\n    }\n    FXSYS_assert(nNewLength <= m_pData->m_nAllocLength);\n    m_pData->m_nDataLength = nNewLength;\n    m_pData->m_String[nNewLength] = 0;\n}\nconst CFX_WideString& CFX_WideString::operator=(FX_LPCWSTR lpsz)\n{\n    if (lpsz == NULL || lpsz[0] == 0) {\n        Empty();\n    } else {\n        AssignCopy((FX_STRSIZE)FXSYS_wcslen(lpsz), lpsz);\n    }\n    return *this;\n}\nconst CFX_WideString& CFX_WideString::operator=(const CFX_WideStringC& stringSrc)\n{\n    if (stringSrc.IsEmpty()) {\n        Empty();\n    } else {\n        AssignCopy(stringSrc.GetLength(), stringSrc.GetPtr());\n    }\n    return *this;\n}\nconst CFX_WideString& CFX_WideString::operator=(const CFX_WideString& stringSrc)\n{\n    if (m_pData == stringSrc.m_pData) {\n        return *this;\n    }\n    if (stringSrc.IsEmpty()) {\n        Empty();\n    } else if ((m_pData && m_pData->m_nRefs < 0) ||\n               (stringSrc.m_pData && stringSrc.m_pData->m_nRefs < 0)) {\n        AssignCopy(stringSrc.m_pData->m_nDataLength, stringSrc.m_pData->m_String);\n    } else {\n        Empty();\n        m_pData = stringSrc.m_pData;\n        if (m_pData) {\n            m_pData->m_nRefs ++;\n        }\n    }\n    return *this;\n}\nconst CFX_WideString& CFX_WideString::operator+=(FX_WCHAR ch)\n{\n    ConcatInPlace(1, &ch);\n    return *this;\n}\nconst CFX_WideString& CFX_WideString::operator+=(FX_LPCWSTR lpsz)\n{\n    if (lpsz) {\n        ConcatInPlace((FX_STRSIZE)FXSYS_wcslen(lpsz), lpsz);\n    }\n    return *this;\n}\nconst CFX_WideString& CFX_WideString::operator+=(const CFX_WideString& string)\n{\n    if (string.m_pData == NULL) {\n        return *this;\n    }\n    ConcatInPlace(string.m_pData->m_nDataLength, string.m_pData->m_String);\n    return *this;\n}\nconst CFX_WideString& CFX_WideString::operator+=(const CFX_WideStringC& string)\n{\n    if (string.IsEmpty()) {\n        return *this;\n    }\n    ConcatInPlace(string.GetLength(), string.GetPtr());\n    return *this;\n}\nbool operator==(const CFX_WideString& s1, FX_LPCWSTR s2)\n{\n    return s1.Equal(s2);\n}\nbool operator==(FX_LPCWSTR s1, const CFX_WideString& s2)\n{\n    return s2.Equal(s1);\n}\nbool operator==(const CFX_WideString& s1, const CFX_WideString& s2)\n{\n    return s1.Equal(s2);\n}\nbool operator==(const CFX_WideString& s1, const CFX_WideStringC& s2)\n{\n    return s1.Equal(s2);\n}\nbool operator==(const CFX_WideStringC& s1, const CFX_WideString& s2)\n{\n    return s2.Equal(s1);\n}\nbool operator != (const CFX_WideString& s1, FX_LPCWSTR s2)\n{\n    return !s1.Equal(s2);\n}\nbool operator!=(const CFX_WideString& s1, const CFX_WideString& s2)\n{\n    return !s1.Equal(s2);\n}\nbool operator!=(const CFX_WideString& s1, const CFX_WideStringC& s2)\n{\n    return !s1.Equal(s2);\n}\nbool operator!=(const CFX_WideStringC& s1, const CFX_WideString& s2)\n{\n    return !s2.Equal(s1);\n}\nbool CFX_WideString::Equal(const CFX_WideStringC& str) const\n{\n    if (m_pData == NULL) {\n        return str.IsEmpty();\n    }\n    return str.GetLength() == m_pData->m_nDataLength &&\n           FXSYS_memcmp32(str.GetPtr(), m_pData->m_String, m_pData->m_nDataLength * sizeof(FX_WCHAR)) == 0;\n}\nvoid CFX_WideString::Empty()\n{\n    if (m_pData == NULL) {\n        return;\n    }\n    if (m_pData->m_nRefs > 1) {\n        m_pData->m_nRefs --;\n    } else {\n        FX_Free(m_pData);\n    }\n    m_pData = NULL;\n}\nvoid CFX_WideString::ConcatInPlace(FX_STRSIZE nSrcLen, FX_LPCWSTR lpszSrcData)\n{\n    if (nSrcLen == 0 || lpszSrcData == NULL) {\n        return;\n    }\n    if (m_pData == NULL) {\n        m_pData = FX_AllocStringW(nSrcLen);\n        if (m_pData) {\n            FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen * sizeof(FX_WCHAR));\n        }\n        return;\n    }\n    if (m_pData->m_nRefs > 1 || m_pData->m_nDataLength + nSrcLen > m_pData->m_nAllocLength) {\n        CFX_StringDataW* pOldData = m_pData;\n        ConcatCopy(m_pData->m_nDataLength, m_pData->m_String, nSrcLen, lpszSrcData);\n        FX_ReleaseStringW(pOldData);\n    } else {\n        FXSYS_memcpy32(m_pData->m_String + m_pData->m_nDataLength, lpszSrcData, nSrcLen * sizeof(FX_WCHAR));\n        m_pData->m_nDataLength += nSrcLen;\n        m_pData->m_String[m_pData->m_nDataLength] = 0;\n    }\n}\nvoid CFX_WideString::ConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCWSTR lpszSrc1Data,\n                                FX_STRSIZE nSrc2Len, FX_LPCWSTR lpszSrc2Data)\n{\n    FX_STRSIZE nNewLen = nSrc1Len + nSrc2Len;\n    if (nNewLen == 0) {\n        return;\n    }\n    m_pData = FX_AllocStringW(nNewLen);\n    if (m_pData) {\n        FXSYS_memcpy32(m_pData->m_String, lpszSrc1Data, nSrc1Len * sizeof(FX_WCHAR));\n        FXSYS_memcpy32(m_pData->m_String + nSrc1Len, lpszSrc2Data, nSrc2Len * sizeof(FX_WCHAR));\n    }\n}\nvoid CFX_WideString::CopyBeforeWrite()\n{\n    if (m_pData == NULL || m_pData->m_nRefs <= 1) {\n        return;\n    }\n    CFX_StringDataW* pData = m_pData;\n    m_pData->m_nRefs --;\n    FX_STRSIZE nDataLength = pData->m_nDataLength;\n    m_pData = FX_AllocStringW(nDataLength);\n    if (m_pData != NULL) {\n        FXSYS_memcpy32(m_pData->m_String, pData->m_String, (nDataLength + 1) * sizeof(FX_WCHAR));\n    }\n}\nvoid CFX_WideString::AllocBeforeWrite(FX_STRSIZE nLen)\n{\n    if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nLen) {\n        return;\n    }\n    Empty();\n    m_pData = FX_AllocStringW(nLen);\n}\nvoid CFX_WideString::AssignCopy(FX_STRSIZE nSrcLen, FX_LPCWSTR lpszSrcData)\n{\n    AllocBeforeWrite(nSrcLen);\n    FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen * sizeof(FX_WCHAR));\n    m_pData->m_nDataLength = nSrcLen;\n    m_pData->m_String[nSrcLen] = 0;\n}\nint CFX_WideString::Compare(FX_LPCWSTR lpsz) const\n{\n    if (m_pData == NULL) {\n        return (lpsz == NULL || lpsz[0] == 0) ? 0 : -1;\n    }\n    return FXSYS_wcscmp(m_pData->m_String, lpsz);\n}\nCFX_ByteString CFX_WideString::UTF8Encode() const\n{\n    return FX_UTF8Encode(*this);\n}\nCFX_ByteString CFX_WideString::UTF16LE_Encode(FX_BOOL bTerminate) const\n{\n    if (m_pData == NULL) {\n        return bTerminate ? CFX_ByteString(FX_BSTRC(\"\\0\\0\")) : CFX_ByteString();\n    }\n    int len = m_pData->m_nDataLength;\n    CFX_ByteString result;\n    FX_LPSTR buffer = result.GetBuffer(len * 2 + (bTerminate ? 2 : 0));\n    for (int i = 0; i < len; i ++) {\n        buffer[i * 2] = m_pData->m_String[i] & 0xff;\n        buffer[i * 2 + 1] = m_pData->m_String[i] >> 8;\n    }\n    if (bTerminate) {\n        buffer[len * 2] = 0;\n        buffer[len * 2 + 1] = 0;\n        result.ReleaseBuffer(len * 2 + 2);\n    } else {\n        result.ReleaseBuffer(len * 2);\n    }\n    return result;\n}\nvoid CFX_WideString::ConvertFrom(const CFX_ByteString& str, CFX_CharMap* pCharMap)\n{\n    if (pCharMap == NULL) {\n        pCharMap = CFX_CharMap::GetDefaultMapper();\n    }\n    *this = pCharMap->m_GetWideString(pCharMap, str);\n}\nvoid CFX_WideString::Reserve(FX_STRSIZE len)\n{\n    GetBuffer(len);\n    ReleaseBuffer(GetLength());\n}\nFX_LPWSTR CFX_WideString::GetBuffer(FX_STRSIZE nMinBufLength)\n{\n    if (m_pData == NULL && nMinBufLength == 0) {\n        return NULL;\n    }\n    if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nMinBufLength) {\n        return m_pData->m_String;\n    }\n    if (m_pData == NULL) {\n        m_pData = FX_AllocStringW(nMinBufLength);\n        if (!m_pData) {\n            return NULL;\n        }\n        m_pData->m_nDataLength = 0;\n        m_pData->m_String[0] = 0;\n        return m_pData->m_String;\n    }\n    CFX_StringDataW* pOldData = m_pData;\n    FX_STRSIZE nOldLen = pOldData->m_nDataLength;\n    if (nMinBufLength < nOldLen) {\n        nMinBufLength = nOldLen;\n    }\n    m_pData = FX_AllocStringW(nMinBufLength);\n    if (!m_pData) {\n        return NULL;\n    }\n    FXSYS_memcpy32(m_pData->m_String, pOldData->m_String, (nOldLen + 1)*sizeof(FX_WCHAR));\n    m_pData->m_nDataLength = nOldLen;\n    pOldData->m_nRefs --;\n    if (pOldData->m_nRefs <= 0) {\n        FX_Free(pOldData);\n    }\n    return m_pData->m_String;\n}\nCFX_WideString CFX_WideString::FromLocal(const char* str, FX_STRSIZE len)\n{\n    CFX_WideString result;\n    result.ConvertFrom(CFX_ByteString(str, len));\n    return result;\n}\nCFX_WideString CFX_WideString::FromUTF8(const char* str, FX_STRSIZE len)\n{\n    if (!str || 0 == len) {\n        return CFX_WideString();\n    }\n\n    CFX_UTF8Decoder decoder;\n    for (FX_STRSIZE i = 0; i < len; i ++) {\n        decoder.Input(str[i]);\n    }\n    return decoder.GetResult();\n}\nCFX_WideString CFX_WideString::FromUTF16LE(const unsigned short* wstr, FX_STRSIZE wlen)\n{\n    if (!wstr || 0 == wlen) {\n        return CFX_WideString();\n    }\n\n    CFX_WideString result;\n    FX_WCHAR* buf = result.GetBuffer(wlen);\n    for (int i = 0; i < wlen; i ++) {\n        buf[i] = wstr[i];\n    }\n    result.ReleaseBuffer(wlen);\n    return result;\n}\nFX_STRSIZE CFX_WideString::WStringLength(const unsigned short* str)\n{\n    FX_STRSIZE len = 0;\n    if (str)\n        while (str[len]) len++;\n    return len;\n}\n\n\n\nvoid CFX_WideString::AllocCopy(CFX_WideString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex) const\n{\n    // |FX_STRSIZE| is currently typedef'd as in |int|. TODO(palmer): It\n    // should be a |size_t|, or at least unsigned.\n    if (nCopyLen == 0 || nCopyLen < 0) {\n        return;\n    }\n    base::CheckedNumeric<FX_STRSIZE> iSize = static_cast<FX_STRSIZE>(sizeof(FX_WCHAR));\n    iSize *= nCopyLen;\n    ASSERT(dest.m_pData == NULL);\n    dest.m_pData = FX_AllocStringW(nCopyLen);\n    if (dest.m_pData) {\n        FXSYS_memcpy32(dest.m_pData->m_String, m_pData->m_String + nCopyIndex, iSize.ValueOrDie());\n    }\n}\nCFX_WideString CFX_WideString::Left(FX_STRSIZE nCount) const\n{\n    if (m_pData == NULL) {\n        return CFX_WideString();\n    }\n    if (nCount < 0) {\n        nCount = 0;\n    }\n    if (nCount >= m_pData->m_nDataLength) {\n        return *this;\n    }\n    CFX_WideString dest;\n    AllocCopy(dest, nCount, 0);\n    return dest;\n}\nCFX_WideString CFX_WideString::Mid(FX_STRSIZE nFirst) const\n{\n    return Mid(nFirst, m_pData->m_nDataLength - nFirst);\n}\nCFX_WideString CFX_WideString::Mid(FX_STRSIZE nFirst, FX_STRSIZE nCount) const\n{\n    if (m_pData == NULL) {\n        return CFX_WideString();\n    }\n    if (nFirst < 0) {\n        nFirst = 0;\n    }\n    if (nCount < 0) {\n        nCount = 0;\n    }\n    if (nFirst + nCount > m_pData->m_nDataLength) {\n        nCount = m_pData->m_nDataLength - nFirst;\n    }\n    if (nFirst > m_pData->m_nDataLength) {\n        nCount = 0;\n    }\n    if (nFirst == 0 && nFirst + nCount == m_pData->m_nDataLength) {\n        return *this;\n    }\n    CFX_WideString dest;\n    AllocCopy(dest, nCount, nFirst);\n    return dest;\n}\nCFX_WideString CFX_WideString::Right(FX_STRSIZE nCount) const\n{\n    if (m_pData == NULL) {\n        return CFX_WideString();\n    }\n    if (nCount < 0) {\n        nCount = 0;\n    }\n    if (nCount >= m_pData->m_nDataLength) {\n        return *this;\n    }\n    CFX_WideString dest;\n    AllocCopy(dest, nCount, m_pData->m_nDataLength - nCount);\n    return dest;\n}\nint CFX_WideString::CompareNoCase(FX_LPCWSTR lpsz) const\n{\n    if (m_pData == NULL) {\n        return (lpsz == NULL || lpsz[0] == 0) ? 0 : -1;\n    }\n    return FXSYS_wcsicmp(m_pData->m_String, lpsz);\n}\nint CFX_WideString::Compare(const CFX_WideString& str) const\n{\n    if (m_pData == NULL) {\n        if (str.m_pData == NULL) {\n            return 0;\n        }\n        return -1;\n    } else if (str.m_pData == NULL) {\n        return 1;\n    }\n    int this_len = m_pData->m_nDataLength;\n    int that_len = str.m_pData->m_nDataLength;\n    int min_len = this_len < that_len ? this_len : that_len;\n    for (int i = 0; i < min_len; i ++) {\n        if (m_pData->m_String[i] < str.m_pData->m_String[i]) {\n            return -1;\n        } else if (m_pData->m_String[i] > str.m_pData->m_String[i]) {\n            return 1;\n        }\n    }\n    if (this_len < that_len) {\n        return -1;\n    } else if (this_len > that_len) {\n        return 1;\n    }\n    return 0;\n}\nFX_LPWSTR CFX_WideString::LockBuffer()\n{\n    if (m_pData == NULL) {\n        return NULL;\n    }\n    FX_LPWSTR lpsz = GetBuffer(0);\n    m_pData->m_nRefs = -1;\n    return lpsz;\n}\nvoid CFX_WideString::SetAt(FX_STRSIZE nIndex, FX_WCHAR ch)\n{\n    if (m_pData == NULL) {\n        return;\n    }\n    ASSERT(nIndex >= 0);\n    ASSERT(nIndex < m_pData->m_nDataLength);\n    CopyBeforeWrite();\n    m_pData->m_String[nIndex] = ch;\n}\nvoid CFX_WideString::MakeLower()\n{\n    if (m_pData == NULL) {\n        return;\n    }\n    CopyBeforeWrite();\n    if (GetLength() < 1) {\n        return;\n    }\n    FXSYS_wcslwr(m_pData->m_String);\n}\nvoid CFX_WideString::MakeUpper()\n{\n    if (m_pData == NULL) {\n        return;\n    }\n    CopyBeforeWrite();\n    if (GetLength() < 1) {\n        return;\n    }\n    FXSYS_wcsupr(m_pData->m_String);\n}\nFX_STRSIZE CFX_WideString::Find(FX_LPCWSTR lpszSub, FX_STRSIZE nStart) const\n{\n    FX_STRSIZE nLength = GetLength();\n    if (nLength < 1 || nStart > nLength) {\n        return -1;\n    }\n    FX_LPCWSTR lpsz = (FX_LPCWSTR)FXSYS_wcsstr(m_pData->m_String + nStart, lpszSub);\n    return (lpsz == NULL) ? -1 : (int)(lpsz - m_pData->m_String);\n}\nFX_STRSIZE CFX_WideString::Find(FX_WCHAR ch, FX_STRSIZE nStart) const\n{\n    if (m_pData == NULL) {\n        return -1;\n    }\n    FX_STRSIZE nLength = m_pData->m_nDataLength;\n    if (nStart >= nLength) {\n        return -1;\n    }\n    FX_LPCWSTR lpsz = (FX_LPCWSTR)FXSYS_wcschr(m_pData->m_String + nStart, ch);\n    return (lpsz == NULL) ? -1 : (int)(lpsz - m_pData->m_String);\n}\nvoid CFX_WideString::TrimRight(FX_LPCWSTR lpszTargetList)\n{\n    FXSYS_assert(lpszTargetList != NULL);\n    if (m_pData == NULL || *lpszTargetList == 0) {\n        return;\n    }\n    CopyBeforeWrite();\n    FX_STRSIZE len = GetLength();\n    if (len < 1) {\n        return;\n    }\n    FX_STRSIZE pos = len;\n    while (pos) {\n        if (FXSYS_wcschr(lpszTargetList, m_pData->m_String[pos - 1]) == NULL) {\n            break;\n        }\n        pos --;\n    }\n    if (pos < len) {\n        m_pData->m_String[pos] = 0;\n        m_pData->m_nDataLength = pos;\n    }\n}\nvoid CFX_WideString::TrimRight(FX_WCHAR chTarget)\n{\n    FX_WCHAR str[2] = {chTarget, 0};\n    TrimRight(str);\n}\nvoid CFX_WideString::TrimRight()\n{\n    TrimRight(L\"\\x09\\x0a\\x0b\\x0c\\x0d\\x20\");\n}\nvoid CFX_WideString::TrimLeft(FX_LPCWSTR lpszTargets)\n{\n    FXSYS_assert(lpszTargets != NULL);\n    if (m_pData == NULL || *lpszTargets == 0) {\n        return;\n    }\n    CopyBeforeWrite();\n    if (GetLength() < 1) {\n        return;\n    }\n    FX_LPCWSTR lpsz = m_pData->m_String;\n    while (*lpsz != 0) {\n        if (FXSYS_wcschr(lpszTargets, *lpsz) == NULL) {\n            break;\n        }\n        lpsz ++;\n    }\n    if (lpsz != m_pData->m_String) {\n        int nDataLength = m_pData->m_nDataLength - (FX_STRSIZE)(lpsz - m_pData->m_String);\n        FXSYS_memmove32(m_pData->m_String, lpsz, (nDataLength + 1)*sizeof(FX_WCHAR));\n        m_pData->m_nDataLength = nDataLength;\n    }\n}\nvoid CFX_WideString::TrimLeft(FX_WCHAR chTarget)\n{\n    FX_WCHAR str[2] = {chTarget, 0};\n    TrimLeft(str);\n}\nvoid CFX_WideString::TrimLeft()\n{\n    TrimLeft(L\"\\x09\\x0a\\x0b\\x0c\\x0d\\x20\");\n}\nFX_STRSIZE CFX_WideString::Replace(FX_LPCWSTR lpszOld, FX_LPCWSTR lpszNew)\n{\n    if (GetLength() < 1) {\n        return 0;\n    }\n    if (lpszOld == NULL) {\n        return 0;\n    }\n    FX_STRSIZE nSourceLen = (FX_STRSIZE)FXSYS_wcslen(lpszOld);\n    if (nSourceLen == 0) {\n        return 0;\n    }\n    FX_STRSIZE nReplacementLen = lpszNew ? (FX_STRSIZE)FXSYS_wcslen(lpszNew) : 0;\n    FX_STRSIZE nCount = 0;\n    FX_LPWSTR lpszStart = m_pData->m_String;\n    FX_LPWSTR lpszEnd = m_pData->m_String + m_pData->m_nDataLength;\n    FX_LPWSTR lpszTarget;\n    {\n        while ((lpszTarget = (FX_LPWSTR)FXSYS_wcsstr(lpszStart, lpszOld)) != NULL && lpszStart < lpszEnd) {\n            nCount++;\n            lpszStart = lpszTarget + nSourceLen;\n        }\n    }\n    if (nCount > 0) {\n        CopyBeforeWrite();\n        FX_STRSIZE nOldLength = m_pData->m_nDataLength;\n        FX_STRSIZE nNewLength =  nOldLength + (nReplacementLen - nSourceLen) * nCount;\n        if (m_pData->m_nAllocLength < nNewLength || m_pData->m_nRefs > 1) {\n            CFX_StringDataW* pOldData = m_pData;\n            FX_LPCWSTR pstr = m_pData->m_String;\n            m_pData = FX_AllocStringW(nNewLength);\n            if (!m_pData) {\n                return 0;\n            }\n            FXSYS_memcpy32(m_pData->m_String, pstr, pOldData->m_nDataLength * sizeof(FX_WCHAR));\n            FX_ReleaseStringW(pOldData);\n        }\n        lpszStart = m_pData->m_String;\n        lpszEnd = m_pData->m_String + FX_MAX(m_pData->m_nDataLength, nNewLength);\n        {\n            while ((lpszTarget = (FX_LPWSTR)FXSYS_wcsstr(lpszStart, lpszOld)) != NULL && lpszStart < lpszEnd) {\n                FX_STRSIZE nBalance = nOldLength - (FX_STRSIZE)(lpszTarget - m_pData->m_String + nSourceLen);\n                FXSYS_memmove32(lpszTarget + nReplacementLen, lpszTarget + nSourceLen, nBalance * sizeof(FX_WCHAR));\n                FXSYS_memcpy32(lpszTarget, lpszNew, nReplacementLen * sizeof(FX_WCHAR));\n                lpszStart = lpszTarget + nReplacementLen;\n                lpszStart[nBalance] = 0;\n                nOldLength += (nReplacementLen - nSourceLen);\n            }\n        }\n        ASSERT(m_pData->m_String[nNewLength] == 0);\n        m_pData->m_nDataLength = nNewLength;\n    }\n    return nCount;\n}\nFX_STRSIZE CFX_WideString::Insert(FX_STRSIZE nIndex, FX_WCHAR ch)\n{\n    CopyBeforeWrite();\n    if (nIndex < 0) {\n        nIndex = 0;\n    }\n    FX_STRSIZE nNewLength = GetLength();\n    if (nIndex > nNewLength) {\n        nIndex = nNewLength;\n    }\n    nNewLength++;\n    if (m_pData == NULL || m_pData->m_nAllocLength < nNewLength) {\n        CFX_StringDataW* pOldData = m_pData;\n        FX_LPCWSTR pstr = m_pData->m_String;\n        m_pData = FX_AllocStringW(nNewLength);\n        if (!m_pData) {\n            return 0;\n        }\n        if(pOldData != NULL) {\n            FXSYS_memmove32(m_pData->m_String, pstr, (pOldData->m_nDataLength + 1)*sizeof(FX_WCHAR));\n            FX_ReleaseStringW(pOldData);\n        } else {\n            m_pData->m_String[0] = 0;\n        }\n    }\n    FXSYS_memmove32(m_pData->m_String + nIndex + 1,\n                    m_pData->m_String + nIndex, (nNewLength - nIndex)*sizeof(FX_WCHAR));\n    m_pData->m_String[nIndex] = ch;\n    m_pData->m_nDataLength = nNewLength;\n    return nNewLength;\n}\nFX_STRSIZE CFX_WideString::Delete(FX_STRSIZE nIndex, FX_STRSIZE nCount)\n{\n    if (GetLength() < 1) {\n        return 0;\n    }\n    if (nIndex < 0) {\n        nIndex = 0;\n    }\n    FX_STRSIZE nOldLength = m_pData->m_nDataLength;\n    if (nCount > 0 && nIndex < nOldLength) {\n        CopyBeforeWrite();\n        int nBytesToCopy = nOldLength - (nIndex + nCount) + 1;\n        FXSYS_memmove32(m_pData->m_String + nIndex,\n                        m_pData->m_String + nIndex + nCount, nBytesToCopy * sizeof(FX_WCHAR));\n        m_pData->m_nDataLength = nOldLength - nCount;\n    }\n    return m_pData->m_nDataLength;\n}\nFX_STRSIZE CFX_WideString::Remove(FX_WCHAR chRemove)\n{\n    if (m_pData == NULL) {\n        return 0;\n    }\n    CopyBeforeWrite();\n    if (GetLength() < 1) {\n        return 0;\n    }\n    FX_LPWSTR pstrSource = m_pData->m_String;\n    FX_LPWSTR pstrDest = m_pData->m_String;\n    FX_LPWSTR pstrEnd = m_pData->m_String + m_pData->m_nDataLength;\n    while (pstrSource < pstrEnd) {\n        if (*pstrSource != chRemove) {\n            *pstrDest = *pstrSource;\n            pstrDest ++;\n        }\n        pstrSource ++;\n    }\n    *pstrDest = 0;\n    FX_STRSIZE nCount = (FX_STRSIZE)(pstrSource - pstrDest);\n    m_pData->m_nDataLength -= nCount;\n    return nCount;\n}\n#define FORCE_ANSI      0x10000\n#define FORCE_UNICODE   0x20000\n#define FORCE_INT64     0x40000\nvoid CFX_WideString::FormatV(FX_LPCWSTR lpszFormat, va_list argList)\n{\n    va_list argListSave;\n#if defined(__ARMCC_VERSION) || (!defined(_MSC_VER) && (_FX_CPU_ == _FX_X64_ || _FX_CPU_ == _FX_IA64_ || _FX_CPU_ == _FX_ARM64_)) || defined(__native_client__)\n    va_copy(argListSave, argList);\n#else\n    argListSave = argList;\n#endif\n    int nMaxLen = 0;\n    for (FX_LPCWSTR lpsz = lpszFormat; *lpsz != 0; lpsz ++) {\n        if (*lpsz != '%' || *(lpsz = lpsz + 1) == '%') {\n            nMaxLen += (FX_STRSIZE)FXSYS_wcslen(lpsz);\n            continue;\n        }\n        int nItemLen = 0;\n        int nWidth = 0;\n        for (; *lpsz != 0; lpsz ++) {\n            if (*lpsz == '#') {\n                nMaxLen += 2;\n            } else if (*lpsz == '*') {\n                nWidth = va_arg(argList, int);\n            } else if (*lpsz == '-' || *lpsz == '+' || *lpsz == '0' ||\n                       *lpsz == ' ')\n                ;\n            else {\n                break;\n            }\n        }\n        if (nWidth == 0) {\n            nWidth = FXSYS_wtoi(lpsz);\n            for (; *lpsz != 0 && (*lpsz) <= '9' && (*lpsz) >= '0'; lpsz ++)\n                ;\n        }\n        if (nWidth < 0 || nWidth > 128 * 1024) {\n            lpszFormat = (FX_LPCWSTR)L\"Bad width\";\n            nMaxLen = 10;\n            break;\n        }\n        int nPrecision = 0;\n        if (*lpsz == '.') {\n            lpsz ++;\n            if (*lpsz == '*') {\n                nPrecision = va_arg(argList, int);\n                lpsz ++;\n            } else {\n                nPrecision = FXSYS_wtoi(lpsz);\n                for (; *lpsz != 0 && (*lpsz) >= '0' && (*lpsz) <= '9'; lpsz ++)\n                    ;\n            }\n        }\n        if (nPrecision < 0 || nPrecision > 128 * 1024) {\n            lpszFormat = (FX_LPCWSTR)L\"Bad precision\";\n            nMaxLen = 14;\n            break;\n        }\n        int nModifier = 0;\n        if (*lpsz == L'I' && *(lpsz + 1) == L'6' && *(lpsz + 2) == L'4') {\n            lpsz += 3;\n            nModifier = FORCE_INT64;\n        } else {\n            switch (*lpsz) {\n                case 'h':\n                    nModifier = FORCE_ANSI;\n                    lpsz ++;\n                    break;\n                case 'l':\n                    nModifier = FORCE_UNICODE;\n                    lpsz ++;\n                    break;\n                case 'F':\n                case 'N':\n                case 'L':\n                    lpsz ++;\n                    break;\n            }\n        }\n        switch (*lpsz | nModifier) {\n            case 'c':\n            case 'C':\n                nItemLen = 2;\n                va_arg(argList, int);\n                break;\n            case 'c'|FORCE_ANSI:\n            case 'C'|FORCE_ANSI:\n                nItemLen = 2;\n                va_arg(argList, int);\n                break;\n            case 'c'|FORCE_UNICODE:\n            case 'C'|FORCE_UNICODE:\n                nItemLen = 2;\n                va_arg(argList, int);\n                break;\n            case 's': {\n                    FX_LPCWSTR pstrNextArg = va_arg(argList, FX_LPCWSTR);\n                    if (pstrNextArg == NULL) {\n                        nItemLen = 6;\n                    } else {\n                        nItemLen = (FX_STRSIZE)FXSYS_wcslen(pstrNextArg);\n                        if (nItemLen < 1) {\n                            nItemLen = 1;\n                        }\n                    }\n                }\n                break;\n            case 'S': {\n                    FX_LPCSTR pstrNextArg = va_arg(argList, FX_LPCSTR);\n                    if (pstrNextArg == NULL) {\n                        nItemLen = 6;\n                    } else {\n                        nItemLen = (FX_STRSIZE)FXSYS_strlen(pstrNextArg);\n                        if (nItemLen < 1) {\n                            nItemLen = 1;\n                        }\n                    }\n                }\n                break;\n            case 's'|FORCE_ANSI:\n            case 'S'|FORCE_ANSI: {\n                    FX_LPCSTR pstrNextArg = va_arg(argList, FX_LPCSTR);\n                    if (pstrNextArg == NULL) {\n                        nItemLen = 6;\n                    } else {\n                        nItemLen = (FX_STRSIZE)FXSYS_strlen(pstrNextArg);\n                        if (nItemLen < 1) {\n                            nItemLen = 1;\n                        }\n                    }\n                }\n                break;\n            case 's'|FORCE_UNICODE:\n            case 'S'|FORCE_UNICODE: {\n                    FX_LPWSTR pstrNextArg = va_arg(argList, FX_LPWSTR);\n                    if (pstrNextArg == NULL) {\n                        nItemLen = 6;\n                    } else {\n                        nItemLen = (FX_STRSIZE)FXSYS_wcslen(pstrNextArg);\n                        if (nItemLen < 1) {\n                            nItemLen = 1;\n                        }\n                    }\n                }\n                break;\n        }\n        if (nItemLen != 0) {\n            if (nPrecision != 0 && nItemLen > nPrecision) {\n                nItemLen = nPrecision;\n            }\n            if (nItemLen < nWidth) {\n                nItemLen = nWidth;\n            }\n        } else {\n            switch (*lpsz) {\n                case 'd':\n                case 'i':\n                case 'u':\n                case 'x':\n                case 'X':\n                case 'o':\n                    if (nModifier & FORCE_INT64) {\n                        va_arg(argList, FX_INT64);\n                    } else {\n                        va_arg(argList, int);\n                    }\n                    nItemLen = 32;\n                    if (nItemLen < nWidth + nPrecision) {\n                        nItemLen = nWidth + nPrecision;\n                    }\n                    break;\n                case 'a':\n                case 'A':\n                case 'e':\n                case 'E':\n                case 'g':\n                case 'G':\n                    va_arg(argList, double);\n                    nItemLen = 128;\n                    if (nItemLen < nWidth + nPrecision) {\n                        nItemLen = nWidth + nPrecision;\n                    }\n                    break;\n                case 'f':\n                    if (nWidth + nPrecision > 100) {\n                        nItemLen = nPrecision + nWidth + 128;\n                    } else {\n                        double f;\n                        char pszTemp[256];\n                        f = va_arg(argList, double);\n                        FXSYS_snprintf(pszTemp, sizeof(pszTemp), \"%*.*f\", nWidth, nPrecision + 6, f );\n                        nItemLen = (FX_STRSIZE)FXSYS_strlen(pszTemp);\n                    }\n                    break;\n                case 'p':\n                    va_arg(argList, void*);\n                    nItemLen = 32;\n                    if (nItemLen < nWidth + nPrecision) {\n                        nItemLen = nWidth + nPrecision;\n                    }\n                    break;\n                case 'n':\n                    va_arg(argList, int*);\n                    break;\n            }\n        }\n        nMaxLen += nItemLen;\n    }\n    GetBuffer(nMaxLen);\n    if (m_pData) {\n        FXSYS_vswprintf((wchar_t*)m_pData->m_String, nMaxLen + 1, (const wchar_t*)lpszFormat, argListSave);\n        ReleaseBuffer();\n    }\n    va_end(argListSave);\n}\nvoid CFX_WideString::Format(FX_LPCWSTR lpszFormat, ...)\n{\n    va_list argList;\n    va_start(argList, lpszFormat);\n    FormatV(lpszFormat, argList);\n    va_end(argList);\n}\nFX_FLOAT FX_wtof(FX_LPCWSTR str, int len)\n{\n    if (len == 0) {\n        return 0.0;\n    }\n    int cc = 0;\n    FX_BOOL bNegative = FALSE;\n    if (str[0] == '+') {\n        cc++;\n    } else if (str[0] == '-') {\n        bNegative = TRUE;\n        cc++;\n    }\n    int integer = 0;\n    while (cc < len) {\n        if (str[cc] == '.') {\n            break;\n        }\n        integer = integer * 10 + str[cc] - '0';\n        cc ++;\n    }\n    FX_FLOAT fraction = 0;\n    if (str[cc] == '.') {\n        cc ++;\n        FX_FLOAT scale = 0.1f;\n        while (cc < len) {\n            fraction += scale * (str[cc] - '0');\n            scale *= 0.1f;\n            cc ++;\n        }\n    }\n    fraction += (FX_FLOAT)integer;\n    return bNegative ? -fraction : fraction;\n}\nint CFX_WideString::GetInteger() const\n{\n    if (m_pData == NULL) {\n        return 0;\n    }\n    return FXSYS_wtoi(m_pData->m_String);\n}\nFX_FLOAT CFX_WideString::GetFloat() const\n{\n    if (m_pData == NULL) {\n        return 0.0;\n    }\n    return FX_wtof(m_pData->m_String, m_pData->m_nDataLength);\n}\nstatic CFX_ByteString _DefMap_GetByteString(CFX_CharMap* pCharMap, const CFX_WideString& widestr)\n{\n    int src_len = widestr.GetLength();\n    int codepage = pCharMap->m_GetCodePage ? pCharMap->m_GetCodePage() : 0;\n    int dest_len = FXSYS_WideCharToMultiByte(codepage, 0, widestr, src_len, NULL, 0, NULL, NULL);\n    if (dest_len == 0) {\n        return CFX_ByteString();\n    }\n    CFX_ByteString bytestr;\n    FX_LPSTR dest_buf = bytestr.GetBuffer(dest_len);\n    FXSYS_WideCharToMultiByte(codepage, 0, widestr, src_len, dest_buf, dest_len, NULL, NULL);\n    bytestr.ReleaseBuffer(dest_len);\n    return bytestr;\n}\nstatic CFX_WideString _DefMap_GetWideString(CFX_CharMap* pCharMap, const CFX_ByteString& bytestr)\n{\n    int src_len = bytestr.GetLength();\n    int codepage = pCharMap->m_GetCodePage ? pCharMap->m_GetCodePage() : 0;\n    int dest_len = FXSYS_MultiByteToWideChar(codepage, 0, bytestr, src_len, NULL, 0);\n    if (dest_len == 0) {\n        return CFX_WideString();\n    }\n    CFX_WideString widestr;\n    FX_LPWSTR dest_buf = widestr.GetBuffer(dest_len);\n    FXSYS_MultiByteToWideChar(codepage, 0, bytestr, src_len, dest_buf, dest_len);\n    widestr.ReleaseBuffer(dest_len);\n    return widestr;\n}\nstatic int _DefMap_GetGBKCodePage()\n{\n    return 936;\n}\nstatic int _DefMap_GetUHCCodePage()\n{\n    return 949;\n}\nstatic int _DefMap_GetJISCodePage()\n{\n    return 932;\n}\nstatic int _DefMap_GetBig5CodePage()\n{\n    return 950;\n}\nstatic const CFX_CharMap g_DefaultMapper = {&_DefMap_GetWideString, &_DefMap_GetByteString, NULL};\nstatic const CFX_CharMap g_DefaultGBKMapper = {&_DefMap_GetWideString, &_DefMap_GetByteString, &_DefMap_GetGBKCodePage};\nstatic const CFX_CharMap g_DefaultJISMapper = {&_DefMap_GetWideString, &_DefMap_GetByteString, &_DefMap_GetJISCodePage};\nstatic const CFX_CharMap g_DefaultUHCMapper = {&_DefMap_GetWideString, &_DefMap_GetByteString, &_DefMap_GetUHCCodePage};\nstatic const CFX_CharMap g_DefaultBig5Mapper = {&_DefMap_GetWideString, &_DefMap_GetByteString, &_DefMap_GetBig5CodePage};\nCFX_CharMap* CFX_CharMap::GetDefaultMapper(FX_INT32 codepage)\n{\n    switch (codepage) {\n        case 0:\n            return (CFX_CharMap*)&g_DefaultMapper;\n        case 932:\n            return (CFX_CharMap*)&g_DefaultJISMapper;\n        case 936:\n            return (CFX_CharMap*)&g_DefaultGBKMapper;\n        case 949:\n            return (CFX_CharMap*)&g_DefaultUHCMapper;\n        case 950:\n            return (CFX_CharMap*)&g_DefaultBig5Mapper;\n    }\n    return NULL;\n}\n"
  },
  {
    "path": "core/src/fxcrt/fx_extension.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxcrt/fx_ext.h\"\n#include \"extension.h\"\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\n#include <wincrypt.h>\n#else\n#include <ctime>\n#endif\nFX_HFILE FX_File_Open(FX_BSTR fileName, FX_DWORD dwMode)\n{\n    IFXCRT_FileAccess* pFA = FXCRT_FileAccess_Create();\n    if (pFA && !pFA->Open(fileName, dwMode)) {\n        pFA->Release();\n        return NULL;\n    }\n    return (FX_HFILE)pFA;\n}\nFX_HFILE FX_File_Open(FX_WSTR fileName, FX_DWORD dwMode)\n{\n    IFXCRT_FileAccess* pFA = FXCRT_FileAccess_Create();\n    if (pFA && !pFA->Open(fileName, dwMode)) {\n        pFA->Release();\n        return NULL;\n    }\n    return (FX_HFILE)pFA;\n}\nvoid FX_File_Close(FX_HFILE hFile)\n{\n    FXSYS_assert(hFile != NULL);\n    ((IFXCRT_FileAccess*)hFile)->Close();\n    ((IFXCRT_FileAccess*)hFile)->Release();\n}\nFX_FILESIZE FX_File_GetSize(FX_HFILE hFile)\n{\n    FXSYS_assert(hFile != NULL);\n    return ((IFXCRT_FileAccess*)hFile)->GetSize();\n}\nFX_FILESIZE FX_File_GetPosition(FX_HFILE hFile)\n{\n    FXSYS_assert(hFile != NULL);\n    return ((IFXCRT_FileAccess*)hFile)->GetPosition();\n}\nFX_FILESIZE FX_File_SetPosition(FX_HFILE hFile, FX_FILESIZE pos)\n{\n    FXSYS_assert(hFile != NULL);\n    return ((IFXCRT_FileAccess*)hFile)->SetPosition(pos);\n}\nsize_t FX_File_Read(FX_HFILE hFile, void* pBuffer, size_t szBuffer)\n{\n    FXSYS_assert(hFile != NULL);\n    return ((IFXCRT_FileAccess*)hFile)->Read(pBuffer, szBuffer);\n}\nsize_t FX_File_ReadPos(FX_HFILE hFile, void* pBuffer, size_t szBuffer, FX_FILESIZE pos)\n{\n    FXSYS_assert(hFile != NULL);\n    return ((IFXCRT_FileAccess*)hFile)->ReadPos(pBuffer, szBuffer, pos);\n}\nsize_t FX_File_Write(FX_HFILE hFile, const void* pBuffer, size_t szBuffer)\n{\n    FXSYS_assert(hFile != NULL);\n    return ((IFXCRT_FileAccess*)hFile)->Write(pBuffer, szBuffer);\n}\nsize_t FX_File_WritePos(FX_HFILE hFile, const void* pBuffer, size_t szBuffer, FX_FILESIZE pos)\n{\n    FXSYS_assert(hFile != NULL);\n    return ((IFXCRT_FileAccess*)hFile)->WritePos(pBuffer, szBuffer, pos);\n}\nFX_BOOL FX_File_Flush(FX_HFILE hFile)\n{\n    FXSYS_assert(hFile != NULL);\n    return ((IFXCRT_FileAccess*)hFile)->Flush();\n}\nFX_BOOL FX_File_Truncate(FX_HFILE hFile, FX_FILESIZE szFile)\n{\n    FXSYS_assert(hFile != NULL);\n    return ((IFXCRT_FileAccess*)hFile)->Truncate(szFile);\n}\nIFX_FileStream* FX_CreateFileStream(FX_LPCSTR filename, FX_DWORD dwModes)\n{\n    IFXCRT_FileAccess* pFA = FXCRT_FileAccess_Create();\n    if (!pFA) {\n        return NULL;\n    }\n    if (!pFA->Open(filename, dwModes)) {\n        pFA->Release();\n        return NULL;\n    }\n    return FX_NEW CFX_CRTFileStream(pFA);\n}\nIFX_FileStream* FX_CreateFileStream(FX_LPCWSTR filename, FX_DWORD dwModes)\n{\n    IFXCRT_FileAccess* pFA = FXCRT_FileAccess_Create();\n    if (!pFA) {\n        return NULL;\n    }\n    if (!pFA->Open(filename, dwModes)) {\n        pFA->Release();\n        return NULL;\n    }\n    return FX_NEW CFX_CRTFileStream(pFA);\n}\nIFX_FileWrite* FX_CreateFileWrite(FX_LPCSTR filename)\n{\n    return FX_CreateFileStream(filename, FX_FILEMODE_Truncate);\n}\nIFX_FileWrite* FX_CreateFileWrite(FX_LPCWSTR filename)\n{\n    return FX_CreateFileStream(filename, FX_FILEMODE_Truncate);\n}\nIFX_FileRead* FX_CreateFileRead(FX_LPCSTR filename)\n{\n    return FX_CreateFileStream(filename, FX_FILEMODE_ReadOnly);\n}\nIFX_FileRead* FX_CreateFileRead(FX_LPCWSTR filename)\n{\n    return FX_CreateFileStream(filename, FX_FILEMODE_ReadOnly);\n}\nIFX_MemoryStream* FX_CreateMemoryStream(FX_LPBYTE pBuffer, size_t dwSize, FX_BOOL bTakeOver)\n{\n    return FX_NEW CFX_MemoryStream(pBuffer, dwSize, bTakeOver);\n}\nIFX_MemoryStream* FX_CreateMemoryStream(FX_BOOL bConsecutive)\n{\n    return FX_NEW CFX_MemoryStream(bConsecutive);\n}\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nFX_FLOAT FXSYS_tan(FX_FLOAT a)\n{\n    return (FX_FLOAT)tan(a);\n}\nFX_FLOAT FXSYS_logb(FX_FLOAT b, FX_FLOAT x)\n{\n    return FXSYS_log(x) / FXSYS_log(b);\n}\nFX_FLOAT FXSYS_strtof(FX_LPCSTR pcsStr, FX_INT32 iLength, FX_INT32 *pUsedLen)\n{\n    FXSYS_assert(pcsStr != NULL);\n    if (iLength < 0) {\n        iLength = (FX_INT32)FXSYS_strlen(pcsStr);\n    }\n    CFX_WideString ws = CFX_WideString::FromLocal(pcsStr, iLength);\n    return FXSYS_wcstof((FX_LPCWSTR)ws, iLength, pUsedLen);\n}\nFX_FLOAT FXSYS_wcstof(FX_LPCWSTR pwsStr, FX_INT32 iLength, FX_INT32 *pUsedLen)\n{\n    FXSYS_assert(pwsStr != NULL);\n    if (iLength < 0) {\n        iLength = (FX_INT32)FXSYS_wcslen(pwsStr);\n    }\n    if (iLength == 0) {\n        return 0.0f;\n    }\n    FX_INT32 iUsedLen = 0;\n    FX_BOOL bNegtive = FALSE;\n    switch (pwsStr[iUsedLen]) {\n        case '-':\n            bNegtive = TRUE;\n        case '+':\n            iUsedLen++;\n            break;\n    }\n    FX_FLOAT fValue = 0.0f;\n    while (iUsedLen < iLength) {\n        FX_WCHAR wch = pwsStr[iUsedLen];\n        if (wch >= L'0' && wch <= L'9') {\n            fValue = fValue * 10.0f + (wch - L'0');\n        } else {\n            break;\n        }\n        iUsedLen++;\n    }\n    if (iUsedLen < iLength && pwsStr[iUsedLen] == L'.') {\n        FX_FLOAT fPrecise = 0.1f;\n        while (++iUsedLen < iLength) {\n            FX_WCHAR wch = pwsStr[iUsedLen];\n            if (wch >= L'0' && wch <= L'9') {\n                fValue += (wch - L'0') * fPrecise;\n                fPrecise *= 0.1f;\n            } else {\n                break;\n            }\n        }\n    }\n    if (pUsedLen) {\n        *pUsedLen = iUsedLen;\n    }\n    return bNegtive ? -fValue : fValue;\n}\nFX_LPWSTR FXSYS_wcsncpy(FX_LPWSTR dstStr, FX_LPCWSTR srcStr, size_t count)\n{\n    FXSYS_assert(dstStr != NULL && srcStr != NULL && count > 0);\n    for (size_t i = 0; i < count; ++i)\n        if ((dstStr[i] = srcStr[i]) == L'\\0') {\n            break;\n        }\n    return dstStr;\n}\nFX_INT32 FXSYS_wcsnicmp(FX_LPCWSTR s1, FX_LPCWSTR s2, size_t count)\n{\n    FXSYS_assert(s1 != NULL && s2 != NULL && count > 0);\n    FX_WCHAR wch1 = 0, wch2 = 0;\n    while (count-- > 0) {\n        wch1 = (FX_WCHAR)FXSYS_tolower(*s1++);\n        wch2 = (FX_WCHAR)FXSYS_tolower(*s2++);\n        if (wch1 != wch2) {\n            break;\n        }\n    }\n    return wch1 - wch2;\n}\nFX_INT32 FXSYS_strnicmp(FX_LPCSTR s1, FX_LPCSTR s2, size_t count)\n{\n    FXSYS_assert(s1 != NULL && s2 != NULL && count > 0);\n    FX_CHAR ch1 = 0, ch2 = 0;\n    while (count-- > 0) {\n        ch1 = (FX_CHAR)FXSYS_tolower(*s1++);\n        ch2 = (FX_CHAR)FXSYS_tolower(*s2++);\n        if (ch1 != ch2) {\n            break;\n        }\n    }\n    return ch1 - ch2;\n}\nFX_DWORD FX_HashCode_String_GetA(FX_LPCSTR pStr, FX_INT32 iLength, FX_BOOL bIgnoreCase)\n{\n    FXSYS_assert(pStr != NULL);\n    if (iLength < 0) {\n        iLength = (FX_INT32)FXSYS_strlen(pStr);\n    }\n    FX_LPCSTR pStrEnd = pStr + iLength;\n    FX_DWORD dwHashCode = 0;\n    if (bIgnoreCase) {\n        while (pStr < pStrEnd) {\n            dwHashCode = 31 * dwHashCode + FXSYS_tolower(*pStr++);\n        }\n    } else {\n        while (pStr < pStrEnd) {\n            dwHashCode = 31 * dwHashCode + *pStr ++;\n        }\n    }\n    return dwHashCode;\n}\nFX_DWORD FX_HashCode_String_GetW(FX_LPCWSTR pStr, FX_INT32 iLength, FX_BOOL bIgnoreCase)\n{\n    FXSYS_assert(pStr != NULL);\n    if (iLength < 0) {\n        iLength = (FX_INT32)FXSYS_wcslen(pStr);\n    }\n    FX_LPCWSTR pStrEnd = pStr + iLength;\n    FX_DWORD dwHashCode = 0;\n    if (bIgnoreCase) {\n        while (pStr < pStrEnd) {\n            dwHashCode = 1313 * dwHashCode + FXSYS_tolower(*pStr++);\n        }\n    } else {\n        while (pStr < pStrEnd) {\n            dwHashCode = 1313 * dwHashCode + *pStr ++;\n        }\n    }\n    return dwHashCode;\n}\n#ifdef __cplusplus\n}\n#endif\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nFX_LPVOID FX_Random_MT_Start(FX_DWORD dwSeed)\n{\n    FX_LPMTRANDOMCONTEXT pContext = FX_Alloc(FX_MTRANDOMCONTEXT, 1);\n    if (!pContext) {\n        return NULL;\n    }\n    pContext->mt[0] = dwSeed;\n    FX_DWORD &i = pContext->mti;\n    FX_LPDWORD pBuf = pContext->mt;\n    for (i = 1; i < MT_N; i ++) {\n        pBuf[i] = (1812433253UL * (pBuf[i - 1] ^ (pBuf[i - 1] >> 30)) + i);\n    }\n    pContext->bHaveSeed = TRUE;\n    return pContext;\n}\nFX_DWORD FX_Random_MT_Generate(FX_LPVOID pContext)\n{\n    FXSYS_assert(pContext != NULL);\n    FX_LPMTRANDOMCONTEXT pMTC = (FX_LPMTRANDOMCONTEXT)pContext;\n    FX_DWORD v;\n    static FX_DWORD mag[2] = {0, MT_Matrix_A};\n    FX_DWORD &mti = pMTC->mti;\n    FX_LPDWORD pBuf = pMTC->mt;\n    if ((int)mti < 0 || mti >= MT_N) {\n        if (mti > MT_N && !pMTC->bHaveSeed) {\n            return 0;\n        }\n        FX_DWORD kk;\n        for (kk = 0; kk < MT_N - MT_M; kk ++) {\n            v = (pBuf[kk] & MT_Upper_Mask) | (pBuf[kk + 1] & MT_Lower_Mask);\n            pBuf[kk] = pBuf[kk + MT_M] ^ (v >> 1) ^ mag[v & 1];\n        }\n        for (; kk < MT_N - 1; kk ++) {\n            v = (pBuf[kk] & MT_Upper_Mask) | (pBuf[kk + 1] & MT_Lower_Mask);\n            pBuf[kk] = pBuf[kk + (MT_M - MT_N)] ^ (v >> 1) ^ mag[v & 1];\n        }\n        v = (pBuf[MT_N - 1] & MT_Upper_Mask) | (pBuf[0] & MT_Lower_Mask);\n        pBuf[MT_N - 1] = pBuf[MT_M - 1] ^ (v >> 1) ^ mag[v & 1];\n        mti = 0;\n    }\n    v = pBuf[mti ++];\n    v ^= (v >> 11);\n    v ^= (v << 7) & 0x9d2c5680UL;\n    v ^= (v << 15) & 0xefc60000UL;\n    v ^= (v >> 18);\n    return v;\n}\nvoid FX_Random_MT_Close(FX_LPVOID pContext)\n{\n    FXSYS_assert(pContext != NULL);\n    FX_Free(pContext);\n}\nvoid FX_Random_GenerateMT(FX_LPDWORD pBuffer, FX_INT32 iCount)\n{\n    FX_DWORD dwSeed;\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\n    if (!FX_GenerateCryptoRandom(&dwSeed, 1)) {\n        FX_Random_GenerateBase(&dwSeed, 1);\n    }\n#else\n    FX_Random_GenerateBase(&dwSeed, 1);\n#endif\n    FX_LPVOID pContext = FX_Random_MT_Start(dwSeed);\n    while (iCount -- > 0) {\n        *pBuffer ++ = FX_Random_MT_Generate(pContext);\n    }\n    FX_Random_MT_Close(pContext);\n}\nvoid FX_Random_GenerateBase(FX_LPDWORD pBuffer, FX_INT32 iCount)\n{\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\n    SYSTEMTIME st1, st2;\n    ::GetSystemTime(&st1);\n    do {\n        ::GetSystemTime(&st2);\n    } while (FXSYS_memcmp32(&st1, &st2, sizeof(SYSTEMTIME)) == 0);\n    FX_DWORD dwHash1 = FX_HashCode_String_GetA((FX_LPCSTR)&st1, sizeof(st1), TRUE);\n    FX_DWORD dwHash2 = FX_HashCode_String_GetA((FX_LPCSTR)&st2, sizeof(st2), TRUE);\n    ::srand((dwHash1 << 16) | (FX_DWORD)dwHash2);\n#else\n    time_t tmLast = time(NULL), tmCur;\n    while ((tmCur = time(NULL)) == tmLast);\n    ::srand((tmCur << 16) | (tmLast & 0xFFFF));\n#endif\n    while (iCount -- > 0) {\n        *pBuffer ++ = (FX_DWORD)((::rand() << 16) | (::rand() & 0xFFFF));\n    }\n}\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\nFX_BOOL FX_GenerateCryptoRandom(FX_LPDWORD pBuffer, FX_INT32 iCount)\n{\n    HCRYPTPROV hCP = NULL;\n    if (!::CryptAcquireContext(&hCP, NULL, NULL, PROV_RSA_FULL, 0) || hCP == NULL) {\n        return FALSE;\n    }\n    ::CryptGenRandom(hCP, iCount * sizeof(FX_DWORD), (FX_LPBYTE)pBuffer);\n    ::CryptReleaseContext(hCP, 0);\n    return TRUE;\n}\n#endif\nvoid FX_Random_GenerateCrypto(FX_LPDWORD pBuffer, FX_INT32 iCount)\n{\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\n    FX_GenerateCryptoRandom(pBuffer, iCount);\n#else\n    FX_Random_GenerateBase(pBuffer, iCount);\n#endif\n}\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "core/src/fxcrt/fx_ucddata.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxcrt/fx_ext.h\"\nextern const FX_DWORD gs_FX_TextLayout_CodeProperties[65536] = {\n    0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe8ae5, 0xfffe9b5c, 0xfffe9ada, 0xfffe9b1a, 0xfffe9b5b, 0xfffe9a93, 0xfffe9a93,\n    0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9b53, 0xfffe9b53, 0xfffe9b53, 0xfffe9ad3,\n    0xfffe9323, 0xfffeb005, 0xfffeb002, 0xfffeb24b, 0xfffeb248, 0xfffeb249, 0xfffeb00b, 0xfffeb002, 0x007eb000, 0x00feb001, 0xfffeb00b, 0xfffeb208, 0xfffeb1c7, 0xfffeb20e, 0xfffeb1c7, 0xfffeb1c6,\n    0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffeb1c7, 0xfffeb007, 0x017eb000, 0xfffeb00b, 0x01feb001, 0xfffeb005,\n    0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0x027eb000, 0xfffeb008, 0x02feb001, 0xfffeb00b, 0xff80b00b,\n    0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0x037eb000, 0xfffeb00f, 0x03feb001, 0xfffeb00b, 0xfffeb293,\n    0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb35d, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293,\n    0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293,\n    0xfffe91c3, 0xfffeb000, 0xfffeb249, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb062, 0x047eb000, 0xfffeb00b, 0xfffeb28f, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb249, 0xfffeb248, 0xfffeb122, 0xfffeb122, 0xfffeb010, 0xfffeb04b, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb122, 0xfffeb062, 0x04feb001, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb000,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb022, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb022, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb010, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb010, 0xfffeb022, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb062, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb010,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea183,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea183, 0xfffea183, 0xfffea183, 0xfffea183,\n    0xfffea183, 0xfffea183, 0xfffea183, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb007, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb193, 0xfffeb193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb047, 0xfffeb00f, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe80a4, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb08f, 0xfffea193,\n    0xfffeb08b, 0xfffea193, 0xfffea193, 0xfffeb08b, 0xfffea193, 0xfffea193, 0xfffeb085, 0xfffea193, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,\n    0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b,\n    0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,\n    0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,\n    0xfffed0cb, 0xfffed0cb, 0xfffed0cb, 0xfffed0cb, 0xfffed164, 0xfffed164, 0xfffed00b, 0xfffed00b, 0xfffed14b, 0xfffed249, 0xfffed249, 0xfffed149, 0xfffed1c7, 0xfffed147, 0xfffed00b, 0xfffed00b,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffed145, 0xfffed164, 0xfffed164, 0xfffed145, 0xfffed145,\n    0xfffed164, 0xfffed14b, 0xfffeb94b, 0xfffeb94b, 0xfffec14b, 0xfffeb94b, 0xfffec94b, 0xfffeb94b, 0xfffec94b, 0xfffec14b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec14b,\n    0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b,\n    0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec14b, 0xfffec94b, 0xfffec94b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffed164,\n    0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed249, 0xfffed0ca, 0xfffed0ca, 0xfffed14b, 0xfffed14b, 0xfffed14b,\n    0xfffea193, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffea14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b,\n    0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b,\n    0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b,\n    0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b,\n    0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffed14b, 0xfffed14b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b,\n    0xfffec14b, 0xfffec94b, 0xfffec94b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec94b, 0xfffec14b, 0xfffec94b, 0xfffec14b,\n    0xfffec94b, 0xfffec94b, 0xfffec14b, 0xfffec14b, 0xfffec945, 0xfffec14b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffed0cb, 0xfffed193, 0xfffea193,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffed14b, 0xfffed14b, 0xfffea193, 0xfffea193, 0xfffed00b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffec14b, 0xfffec14b,\n    0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b,\n    0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffe8164, 0xfffeb28b,\n    0xfffeb14b, 0xfffea193, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b,\n    0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8164, 0xfffe8164, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b,\n    0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b,\n    0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffec14b, 0xfffec14b, 0xfffed14b, 0xfffed14b, 0xfffed14b,\n    0xfffed14b, 0xfffec14b, 0xfffed14b, 0xfffec14b, 0xfffec14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffec14b, 0xfffec14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b,\n    0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b,\n    0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b,\n    0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,\n    0xfffea193, 0xfffeb14b, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164,\n    0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b,\n    0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b,\n    0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb08b, 0xfffeb08b, 0xfffeb00b, 0xfffeb00b, 0xfffeb007, 0xfffeb005, 0xfffeb08b, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,\n    0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b,\n    0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb08b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb08b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb08b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe80a4, 0xfffe80a4,\n    0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffe80a4,\n    0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,\n    0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,\n    0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,\n    0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,\n    0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,\n    0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,\n    0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,\n    0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,\n    0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,\n    0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,\n    0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,\n    0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb04b, 0xfffeb053, 0xfffeb053,\n    0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffeb053, 0xfffe8024,\n    0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffeb04f, 0xfffeb04f, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffe8024, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b,\n    0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb04b, 0xfffeb053, 0xfffeb053,\n    0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffeb04b, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb249, 0xfffeb249, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb049, 0xfffeb04b, 0xfffeb248, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b,\n    0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffe8024, 0xfffeb053, 0xfffeb053,\n    0xfffeb053, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,\n    0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb04b, 0xfffeb053, 0xfffeb053,\n    0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,\n    0xfffe8024, 0xfffeb248, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b,\n    0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb04b, 0xfffeb053, 0xfffea193,\n    0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,\n    0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053,\n    0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb248, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffea193, 0xfffea193,\n    0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b,\n    0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb04b, 0xfffeb053, 0xfffea053,\n    0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffea053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,\n    0xfffe8024, 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb053, 0xfffeb053,\n    0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb049, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb053,\n    0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffea193, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,\n    0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb248,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb04b,\n    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04f, 0xfffeb04f, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffeb05e, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,\n    0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffeb05e, 0xfffe8024, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,\n    0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffe8024, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffe8024, 0xfffe8024,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffeb05e, 0xfffe8024, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffe8024, 0xfffe8024,\n    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb050, 0xfffeb050, 0xfffeb050, 0xfffeb050, 0xfffeb04b, 0xfffeb050, 0xfffeb050, 0xfffeb043, 0xfffeb050, 0xfffeb050, 0xfffeb04f, 0xfffeb043, 0xfffeb045, 0xfffeb045, 0xfffeb045,\n    0xfffeb045, 0xfffeb045, 0xfffeb043, 0xfffeb04b, 0xfffeb045, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04f, 0xfffea193, 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffea193, 0x057eb000, 0x05feb001, 0x067eb000, 0x06feb001, 0xfffeb053, 0xfffeb053,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb04f,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb04f, 0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffeb04f, 0xfffeb04f,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb050, 0xfffeb050, 0xfffeb04f, 0xfffeb050, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e,\n    0xfffea19e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffeb05e,\n    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04f, 0xfffeb04f, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e,\n    0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,\n    0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,\n    0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e,\n    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057,\n    0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057,\n    0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057,\n    0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057,\n    0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057,\n    0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057,\n    0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058,\n    0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058,\n    0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058,\n    0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058,\n    0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,\n    0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,\n    0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,\n    0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,\n    0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,\n    0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024,\n    0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193,\n    0xfffeb04b, 0xfffeb04f, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb00f, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb30f, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0x077eb000, 0x07feb001, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb04f, 0xfffeb04f, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e,\n    0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb04f, 0xfffeb04f, 0xfffeb044, 0xfffeb05e, 0xfffeb04f, 0xfffeb04b, 0xfffeb04f, 0xfffeb248, 0xfffeb05e, 0xfffea19e, 0xfffe8024, 0xfffe8024,\n    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb005, 0xfffeb005, 0xfffeb00f, 0xfffeb00f, 0xfffeb010, 0xfffeb00b, 0xfffeb005, 0xfffeb005, 0xfffeb00b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb303, 0xfffe8024,\n    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb005, 0xfffeb005, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffe8024,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb01e, 0xfffeb01e,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffe8024,\n    0xfffea19e, 0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffe8024, 0xfffe8024, 0xfffea193,\n    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053,\n    0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04f, 0xfffeb04f, 0xfffeb04b, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f,\n    0xfffeb04f, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f,\n    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04f, 0xfffeb04f,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,\n    0xfffea193, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffea193,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb010, 0xfffeb00b, 0xfffe8024,\n    0xfffeb30f, 0xfffeb30f, 0xfffeb30f, 0xfffeb30f, 0xfffeb30f, 0xfffeb30f, 0xfffeb30f, 0xfffeb303, 0xfffeb30f, 0xfffeb30f, 0xfffeb30f, 0xfffeb292, 0xfffe9a93, 0xfffe9a93, 0xfffe9853, 0xfffe9893,\n    0xfffeb00f, 0xfffeb003, 0xfffeb00f, 0xff82b00f, 0xff84b011, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0x0806b000, 0x0888b002, 0xfffeb000, 0xfffeb002, 0x090ab000, 0x098cb001, 0xfffeb000, 0xfffeb002,\n    0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00d, 0xfffeb00d, 0xfffeb00d, 0xfffeb00f, 0xfffe9b1a, 0xfffe9b5a, 0xfffe9c53, 0xfffe9bd3, 0xfffe9c93, 0xfffe9c13, 0xfffe9b93, 0xfffeb1c3,\n    0xfffeb249, 0xfffeb249, 0xfffeb249, 0xfffeb249, 0xfffeb249, 0xfffeb009, 0xfffeb009, 0xfffeb009, 0xfffeb00b, 0x0a7eb000, 0x0afeb001, 0xfffeb022, 0xfffeb004, 0xfffeb004, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb1c7, 0x0b7eb000, 0x0bfeb001, 0xfffeb004, 0xfffeb004, 0xfffeb004, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00f, 0xfffeb00b, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00b, 0xfffeb00f, 0xfffeb00f, 0xfffeb30f,\n    0xfffeb294, 0xfffeb28b, 0xfffeb28b, 0xfffeb28b, 0xfffeb28b, 0xfffe82a4, 0xfffe82a4, 0xfffe82a4, 0xfffe82a4, 0xfffe82a4, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93,\n    0xfffeb10b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb122, 0xfffeb10b, 0xfffeb10b, 0xfffeb10b, 0xfffeb10b, 0xfffeb10b, 0xfffeb20b, 0xfffeb20b, 0xfffeb00b, 0x0c7eb000, 0x0cfeb001, 0xfffeb062,\n    0xfffeb10b, 0xfffeb122, 0xfffeb122, 0xfffeb122, 0xfffeb122, 0xfffeb10b, 0xfffeb10b, 0xfffeb10b, 0xfffeb10b, 0xfffeb10b, 0xfffeb20b, 0xfffeb20b, 0xfffeb00b, 0x0d7eb000, 0x0dfeb001, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb249, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248,\n    0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb249, 0xfffeb248, 0xfffeb248, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb193, 0xfffeb193, 0xfffeb193,\n    0xfffeb193, 0xfffea193, 0xfffeb193, 0xfffeb193, 0xfffeb193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,\n    0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb009, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b, 0xfffeb009, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb062, 0xfffeb00b, 0xfffeb04b, 0xfffeb008, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b, 0xfffeb04b, 0xfffeb062, 0xfffeb04b, 0xfffeb04b, 0xfffeb24b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b,\n    0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb022, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb022, 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0x0e7eb022, 0x0efeb00b, 0x0f7eb00b, 0x0ffeb022, 0x107eb00b, 0x10feb00b, 0xfffeb00b, 0xfffeb022,\n    0xfffeb00b, 0xfffeb022, 0xfffeb208, 0xfffeb248, 0xfffeb00b, 0x117eb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb022,\n    0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb022, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0x11feb022, 0x127eb022, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0x12feb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0x137eb022, 0x13feb00b, 0x147eb00b, 0x14feb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0x157eb022, 0x15feb022, 0x167eb022, 0x16feb022, 0x177eb00b, 0x17feb00b, 0x187eb022, 0x18feb022, 0xfffeb00b, 0xfffeb00b, 0x197eb022, 0x19feb022,\n    0x1a7eb00b, 0x1afeb00b, 0x1b7eb00b, 0x1bfeb00b, 0x1c7eb00b, 0x1cfeb00b, 0x1d7eb00b, 0x1dfeb00b, 0x1e7eb00b, 0x1efeb00b, 0x1f7eb00b, 0x1ffeb00b, 0x207eb00b, 0x20feb00b, 0x217eb00b, 0x21feb00b,\n    0x227eb00b, 0x22feb00b, 0x237eb022, 0x23feb022, 0x247eb00b, 0x24feb00b, 0x257eb022, 0x25feb022, 0x267eb00b, 0x26feb00b, 0x277eb00b, 0x27feb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0x287eb00b,\n    0x28feb00b, 0x297eb00b, 0x29feb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0x2a7eb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0x2afeb00b, 0x2b7eb00b, 0xfffeb00b, 0xfffeb022, 0x2bfeb00b, 0xfffeb00b, 0x2c7eb00b, 0x2cfeb00b, 0xfffeb00b, 0x2d7eb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0x2dfeb00b, 0x2e7eb00b, 0x2efeb00b, 0x2f7eb00b, 0x2ffeb00b, 0x307eb00b, 0x30feb00b, 0x317eb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0x31feb00b, 0x327eb00b, 0x32feb00b, 0x337eb00b, 0x33feb00b, 0xfffeb00b, 0xfffeb00b,\n    0x347eb00b, 0x34feb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0x357eb00b, 0x35feb00b, 0x367eb00b, 0x36feb00b, 0x377eb00b, 0x37feb00b, 0x387eb00b, 0x38feb00b, 0x397eb00b, 0x39feb00b,\n    0x3a7eb00b, 0x3afeb00b, 0x3b7eb00b, 0x3bfeb00b, 0x3c7eb00b, 0x3cfeb00b, 0x3d7eb00b, 0x3dfeb00b, 0x3e7eb00b, 0x3efeb00b, 0x3f7eb00b, 0x3ffeb00b, 0x407eb00b, 0x40feb00b, 0xfffeb00b, 0xfffeb00b,\n    0x417eb00b, 0x41feb00b, 0x427eb00b, 0x42feb00b, 0x437eb00b, 0xfffeb00b, 0x43feb00b, 0x447eb00b, 0xfffeb00b, 0xfffeb00b, 0x44feb00b, 0x457eb00b, 0x45feb00b, 0x467eb00b, 0x46feb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0x477eb00b, 0x47feb00b, 0x487eb00b, 0x48feb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0x497eb000, 0x49feb001, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,\n    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,\n    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122,\n    0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062,\n    0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062,\n    0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062,\n    0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062,\n    0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062,\n    0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,\n    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b,\n    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,\n    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,\n    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,\n    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,\n    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,\n    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,\n    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,\n    0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b,\n    0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022,\n    0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe300b, 0xfffe3022, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe3022, 0xfffe300b, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe3022,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe304b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe0024, 0xfffe3022,\n    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,\n    0xfffe3022, 0xfffe3022, 0xfffe0024, 0xfffe3022, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,\n    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,\n    0xfffe0024, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024, 0xfffe0024, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024, 0xfffe300b, 0xfffe0024, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe300b, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3002, 0xfffe3002, 0xfffe3002, 0xfffe3002, 0xfffe0024,\n    0xfffe0024, 0xfffe300b, 0xfffe3005, 0xfffe3005, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x4a7e3000, 0x4afe3001, 0x4b7e3000, 0x4bfe3001, 0x4c7e3000, 0x4cfe3001, 0x4d7e3000, 0x4dfe3001,\n    0x4e7e3000, 0x4efe3001, 0x4f7e3000, 0x4ffe3001, 0x507e3000, 0x50fe3001, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,\n    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,\n    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe0024, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0x517e300b, 0x51fe300b, 0x527e3000, 0x52fe3001, 0xfffe300b, 0x537e300b, 0x53fe300b, 0xfffe300b, 0xfffe0024, 0xfffe300b, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x547e300b, 0x54fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x557e300b, 0x55fe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0x567e300b, 0x56fe300b, 0x577e300b, 0x57fe300b, 0x587e3000, 0x58fe3001, 0x597e3000, 0x59fe3001, 0x5a7e3000, 0x5afe3001, 0x5b7e3000, 0x5bfe3001, 0x5c7e3000, 0x5cfe3001,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0x5d7e3000, 0x5dfe3001, 0x5e7e3000, 0x5efe3001, 0x5f7e3000, 0x5ffe3001, 0x607e3000, 0x60fe3001, 0x617e3000, 0x61fe3001, 0x627e3000, 0x62fe3001, 0x637e3000,\n    0x63fe3001, 0x647e3000, 0x64fe3001, 0x657e3000, 0x65fe3001, 0x667e3000, 0x66fe3001, 0x677e3000, 0x67fe3001, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x687e300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0x68fe300b, 0x697e300b, 0xfffe300b, 0xfffe300b, 0x69fe300b, 0x6a7e300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x6afe300b,\n    0x6b7e300b, 0x6bfe300b, 0x6c7e300b, 0xfffe300b, 0x6cfe300b, 0x6d7e300b, 0xfffe300b, 0xfffe300b, 0x6dfe3000, 0x6e7e3001, 0x6efe3000, 0x6f7e3001, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x6ffe300b, 0xfffe300b, 0xfffe300b, 0x707e300b, 0x70fe300b, 0xfffe300b, 0xfffe300b, 0x717e3000, 0x71fe3001, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x727e300b, 0x72fe300b, 0x737e300b, 0x73fe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x747e300b, 0x74fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x757e300b, 0x75fe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x767e300b, 0x76fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x777e300b, 0x77fe300b, 0xfffe300b, 0xfffe300b, 0x787e300b, 0x78fe300b, 0x797e300b,\n    0x79fe300b, 0x7a7e300b, 0x7afe300b, 0x7b7e300b, 0x7bfe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x7c7e300b, 0x7cfe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0x7d7e300b, 0x7dfe300b, 0x7e7e300b, 0x7efe300b, 0x7f7e300b, 0x7ffe300b, 0x807e300b, 0x80fe300b, 0x817e300b, 0x81fe300b, 0x827e300b, 0x82fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0x837e300b, 0x83fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x847e300b, 0x84fe300b, 0x857e300b, 0x85fe300b, 0x867e300b, 0x86fe300b, 0x877e300b, 0x87fe300b, 0xfffe300b, 0x887e300b,\n    0x88fe300b, 0xfffe300b, 0xfffe300b, 0x897e300b, 0x89fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x8a7e300b, 0x8afe300b, 0x8b7e300b, 0x8bfe300b, 0x8c7e300b,\n    0x8cfe300b, 0x8d7e300b, 0x8dfe300b, 0x8e7e300b, 0x8efe300b, 0x8f7e300b, 0x8ffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x907e300b, 0x90fe300b, 0x917e300b,\n    0x91fe300b, 0x927e300b, 0x92fe300b, 0x937e300b, 0x93fe300b, 0x947e300b, 0x94fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x957e300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0x95fe300b, 0x967e300b, 0x96fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x977e300b, 0x97fe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x987e300b, 0x98fe300b, 0x997e300b, 0x99fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193,\n    0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb005, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00b, 0xfffeb005, 0xfffeb00f,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,\n    0xfffeb001, 0xfffeb001, 0x9a7eb000, 0x9afeb001, 0x9b7eb000, 0x9bfeb001, 0xfffeb002, 0xfffeb002, 0xfffeb002, 0x9c7eb000, 0x9cfeb001, 0xfffeb002, 0x9d7eb000, 0x9dfeb001, 0xfffeb00f, 0xfffeb00f,\n    0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00b, 0xfffeb00f, 0xfffeb000, 0xfffeb00f, 0xfffeb00b, 0xfffeb00b, 0x9e7eb000, 0x9efeb001, 0xfffeb00b, 0xfffeb00b,\n    0x9f7eb000, 0x9ffeb001, 0xa07eb000, 0xa0feb001, 0xa17eb000, 0xa1feb001, 0xa27eb000, 0xa2feb001, 0xa37eb000, 0xa3feb001, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb005, 0xfffeb00b,\n    0xfffeb00f, 0xfffeb00f, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffe330c, 0xffff3001, 0xffff3001, 0xfffe300c, 0xfffe300c, 0xfffe3044, 0xfffe304c, 0xfffe304c, 0xa40eb000, 0xa490b001, 0xa512b000, 0xa594b001, 0xa616b000, 0xa698b001, 0xa71ab000, 0xa79cb001,\n    0xa81eb000, 0xa8a0b001, 0xfffe300c, 0xfffe300c, 0xa922b000, 0xa9a4b001, 0xaa7eb000, 0xaafeb001, 0xab7eb000, 0xabfeb001, 0xac7eb000, 0xacfeb001, 0xfffe3004, 0xfffe3000, 0xfffe3001, 0xfffe3001,\n    0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe2193, 0xfffe2193, 0xfffe2193, 0xfffe2193, 0xfffe2193, 0xfffe2193,\n    0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe3044, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe0024, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xffff3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xffff3044, 0xfffe304c, 0xffff3044, 0xfffe304c, 0xffff3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe3044, 0xfffe0024, 0xfffe0024, 0xfffe2193, 0xfffe2193, 0xfffe3004, 0xfffe3004, 0xfffe3044, 0xfffe3044, 0xfffe304c,\n    0xfffe3004, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3004, 0xfffeb044, 0xfffe3044, 0xfffe3044, 0xfffe304c,\n    0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffeb04c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe0024, 0xfffe0024,\n    0xfffe0024, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe0024,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe300c, 0xfffe0024,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe0024,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe300c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe0064, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe0064, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304f, 0xfffe304f,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe300f, 0xfffe3005, 0xfffe300f,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304b, 0xfffe304b, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193,\n    0xfffeb193, 0xfffeb193, 0xfffeb193, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,\n    0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb249, 0xfffeb24b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb010, 0xfffeb010, 0xfffeb005, 0xfffeb005, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb053, 0xfffeb053, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053,\n    0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04f, 0xfffeb04f,\n    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,\n    0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb04f, 0xfffeb04f,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,\n    0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b,\n    0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057,\n    0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053,\n    0xfffeb053, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b,\n    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053,\n    0xfffeb053, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb053, 0xfffe8024, 0xfffe8024,\n    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,\n    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,\n    0xfffea19e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e,\n    0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb04f, 0xfffeb053, 0xfffea193, 0xfffe8024, 0xfffe8024,\n    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,\n    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,\n    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058,\n    0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,\n    0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,\n    0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,\n    0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe0024,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe0024,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,\n    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe0024,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,\n    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe0064,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe0024,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe0024,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024,\n    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb08b, 0xfffea193, 0xfffeb08b,\n    0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb20b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b,\n    0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffe80a4, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffe80a4, 0xfffeb08b, 0xfffe80a4,\n    0xfffeb08b, 0xfffeb08b, 0xfffe80a4, 0xfffeb08b, 0xfffeb08b, 0xfffe80a4, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964,\n    0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964,\n    0xfffed964, 0xfffed964, 0xfffed964, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed800, 0xfffed801,\n    0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed964, 0xfffed964, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964,\n    0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4,\n    0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed949, 0xfffed80b, 0xfffed964, 0xfffed964,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,\n    0xfffe3007, 0xfffe3001, 0xfffe3001, 0xfffe3007, 0xfffe3007, 0xfffe3005, 0xfffe3005, 0xfffe3000, 0xfffe3001, 0xfffe300d, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,\n    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe3000, 0xfffe3001, 0xfffe3000, 0xfffe3001, 0xfffe3000, 0xfffe3001, 0xfffe3000, 0xfffe3001, 0xfffe3000, 0xfffe3001, 0xfffe3000,\n    0xfffe3001, 0xfffe3000, 0xfffe3001, 0xfffe3000, 0xfffe3001, 0xfffe300c, 0xfffe300c, 0xfffe3000, 0xfffe3001, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xffa6300c,\n    0xfffe31c1, 0xfffe300c, 0xfffe31c1, 0xfffe0024, 0xfffe3004, 0xfffe31c4, 0xfffe3005, 0xfffe3005, 0xfffe300c, 0xad7e3000, 0xadfe3001, 0xae7e3000, 0xaefe3001, 0xaf7e3000, 0xaffe3001, 0xfffe324c,\n    0xfffe300c, 0xfffe300c, 0xfffe320c, 0xfffe320c, 0xb07e300c, 0xb0fe300c, 0xfffe300c, 0xfffe0024, 0xfffe300c, 0xfffe3248, 0xfffe3249, 0xfffe300c, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed964, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,\n    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed964, 0xfffed964, 0xfffe9a94,\n    0xfffe0024, 0xffff3005, 0xfffe300c, 0xfffe324c, 0xfffe3248, 0xfffe3249, 0xfffe300c, 0xfffe300c, 0xb1283000, 0xb1aa3001, 0xfffe300c, 0xfffe320c, 0xffff31c1, 0xfffeb20c, 0xffff31c1, 0xfffe31cc,\n    0xfffe310c, 0xfffe310c, 0xfffe310c, 0xfffe310c, 0xfffe310c, 0xfffe310c, 0xfffe310c, 0xfffe310c, 0xfffe310c, 0xfffe310c, 0xffff31c4, 0xffff3004, 0xb27e300c, 0xfffe300c, 0xb2fe300c, 0xffff3005,\n    0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xb37eb000, 0xfffe300c, 0xb3feb001, 0xfffe300c, 0xfffeb00c,\n    0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,\n    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xb42c3000, 0xfffe300c, 0xb4ae3001, 0xfffeb00c, 0xb57e3000,\n    0xb5fe3001, 0xfffeb001, 0xb67eb000, 0xb6feb001, 0xfffeb001, 0xfffe3004, 0xfffe304b, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044,\n    0xfffe3044, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe3044, 0xfffe3044,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe0024,\n    0xfffe0024, 0xfffe0024, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe0024, 0xfffe0024, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,\n    0xfffe0024, 0xfffe0024, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe0024, 0xfffe0024, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe0024, 0xfffe0024, 0xfffe0024,\n    0xfffe3249, 0xfffe3248, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe3248, 0xfffe3248, 0xfffe0024, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024,\n    0xfffe02a4, 0xfffe02a4, 0xfffe02a4, 0xfffe02a4, 0xfffe02a4, 0xfffe02a4, 0xfffe02a4, 0xfffe02a4, 0xfffe02a4, 0xfffe3013, 0xfffe3013, 0xfffe3013, 0xfffe3011, 0xfffe3022, 0xfffe1aa4, 0xfffe1aa4,\n};\nextern const FX_WCHAR gs_FX_TextLayout_VerticalMirror[64] = {\n    0xFE33, 0xFE32, 0xFE31, 0xFE41, 0xFE42, 0xFE43, 0xFE44, 0xFE3F, 0xFE40, 0xFE3D, 0xFE3E, 0xFE41, 0xFE42, 0xFE43, 0xFE44, 0xFE3B,\n    0xFE3C, 0xFE39, 0xFE3A, 0xFE34, 0xFE35, 0xFE36, 0xFE37, 0xFE38, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,\n    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,\n    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,\n};\nextern const FX_WCHAR gs_FX_TextLayout_BidiMirror[512] = {\n    0x0029, 0x0028, 0x003E, 0x003C, 0x005D, 0x005B, 0x007D, 0x007B, 0x00BB, 0x00AB, 0x0F3B, 0x0F3A, 0x0F3D, 0x0F3C, 0x169C, 0x169B,\n    0x2019, 0x2018, 0x201D, 0x201C, 0x203A, 0x2039, 0x2046, 0x2045, 0x207E, 0x207D, 0x208E, 0x208D, 0x220B, 0x220C, 0x220D, 0x2208,\n    0x2209, 0x220A, 0x29F5, 0x223D, 0x223C, 0x22CD, 0x2253, 0x2252, 0x2255, 0x2254, 0x2265, 0x2264, 0x2267, 0x2266, 0x2269, 0x2268,\n    0x226B, 0x226A, 0x226F, 0x226E, 0x2271, 0x2270, 0x2273, 0x2272, 0x2275, 0x2274, 0x2277, 0x2276, 0x2279, 0x2278, 0x227B, 0x227A,\n    0x227D, 0x227C, 0x227F, 0x227E, 0x2281, 0x2280, 0x2283, 0x2282, 0x2285, 0x2284, 0x2287, 0x2286, 0x2289, 0x2288, 0x228B, 0x228A,\n    0x2290, 0x228F, 0x2292, 0x2291, 0x29B8, 0x22A3, 0x22A2, 0x2ADE, 0x2AE4, 0x2AE3, 0x2AE5, 0x22B1, 0x22B0, 0x22B3, 0x22B2, 0x22B5,\n    0x22B4, 0x22B7, 0x22B6, 0x22CA, 0x22C9, 0x22CC, 0x22CB, 0x2243, 0x22D1, 0x22D0, 0x22D7, 0x22D6, 0x22D9, 0x22D8, 0x22DB, 0x22DA,\n    0x22DD, 0x22DC, 0x22DF, 0x22DE, 0x22E1, 0x22E0, 0x22E3, 0x22E2, 0x22E5, 0x22E4, 0x22E7, 0x22E6, 0x22E9, 0x22E8, 0x22EB, 0x22EA,\n    0x22ED, 0x22EC, 0x22F1, 0x22F0, 0x22FA, 0x22FB, 0x22FC, 0x22FD, 0x22FE, 0x22F2, 0x22F3, 0x22F4, 0x22F6, 0x22F7, 0x2309, 0x2308,\n    0x230B, 0x230A, 0x232A, 0x2329, 0x2769, 0x2768, 0x276B, 0x276A, 0x276D, 0x276C, 0x276F, 0x276E, 0x2771, 0x2770, 0x2773, 0x2772,\n    0x2775, 0x2774, 0x27C4, 0x27C3, 0x27C6, 0x27C5, 0x27C9, 0x27C8, 0x27D6, 0x27D5, 0x27DE, 0x27DD, 0x27E3, 0x27E2, 0x27E5, 0x27E4,\n    0x27E7, 0x27E6, 0x27E9, 0x27E8, 0x27EB, 0x27EA, 0x27ED, 0x27EC, 0x27EF, 0x27EE, 0x2984, 0x2983, 0x2986, 0x2985, 0x2988, 0x2987,\n    0x298A, 0x2989, 0x298C, 0x298B, 0x2990, 0x298F, 0x298E, 0x298D, 0x2992, 0x2991, 0x2994, 0x2993, 0x2996, 0x2995, 0x2998, 0x2997,\n    0x2298, 0x29C1, 0x29C0, 0x29C5, 0x29C4, 0x29D0, 0x29CF, 0x29D2, 0x29D1, 0x29D5, 0x29D4, 0x29D9, 0x29D8, 0x29DB, 0x29DA, 0x2215,\n    0x29F9, 0x29F8, 0x29FD, 0x29FC, 0x2A2C, 0x2A2B, 0x2A2E, 0x2A2D, 0x2A35, 0x2A34, 0x2A3D, 0x2A3C, 0x2A65, 0x2A64, 0x2A7A, 0x2A79,\n    0x2A7E, 0x2A7D, 0x2A80, 0x2A7F, 0x2A82, 0x2A81, 0x2A84, 0x2A83, 0x2A8C, 0x2A8B, 0x2A92, 0x2A91, 0x2A94, 0x2A93, 0x2A96, 0x2A95,\n    0x2A98, 0x2A97, 0x2A9A, 0x2A99, 0x2A9C, 0x2A9B, 0x2AA2, 0x2AA1, 0x2AA7, 0x2AA6, 0x2AA9, 0x2AA8, 0x2AAB, 0x2AAA, 0x2AAD, 0x2AAC,\n    0x2AB0, 0x2AAF, 0x2AB4, 0x2AB3, 0x2ABC, 0x2ABB, 0x2ABE, 0x2ABD, 0x2AC0, 0x2ABF, 0x2AC2, 0x2AC1, 0x2AC4, 0x2AC3, 0x2AC6, 0x2AC5,\n    0x2ACE, 0x2ACD, 0x2AD0, 0x2ACF, 0x2AD2, 0x2AD1, 0x2AD4, 0x2AD3, 0x2AD6, 0x2AD5, 0x22A6, 0x22A9, 0x22A8, 0x22AB, 0x2AED, 0x2AEC,\n    0x2AF8, 0x2AF7, 0x2AFA, 0x2AF9, 0x2E03, 0x2E02, 0x2E05, 0x2E04, 0x2E0A, 0x2E09, 0x2E0D, 0x2E0C, 0x2E1D, 0x2E1C, 0x2E21, 0x2E20,\n    0x2E23, 0x2E22, 0x2E25, 0x2E24, 0x2E27, 0x2E26, 0x2E29, 0x2E28, 0x3009, 0x3008, 0x300B, 0x300A, 0x300D, 0x300C, 0x300F, 0x300E,\n    0x3011, 0x3010, 0x3015, 0x3014, 0x3017, 0x3016, 0x3019, 0x3018, 0x301B, 0x301A, 0xFE5A, 0xFE59, 0xFE5C, 0xFE5B, 0xFE5E, 0xFE5D,\n    0xFE65, 0xFE64, 0xFF09, 0xFF08, 0xFF1E, 0xFF1C, 0xFF3D, 0xFF3B, 0xFF5D, 0xFF5B, 0xFF60, 0xFF5F, 0xFF63, 0xFF62, 0xFFFF, 0xFEFF,\n    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,\n    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,\n    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,\n    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,\n    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,\n    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,\n    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,\n    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,\n    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,\n};\n"
  },
  {
    "path": "core/src/fxcrt/fx_unicode.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxcrt/fx_ext.h\"\nextern const FX_DWORD gs_FX_TextLayout_CodeProperties[65536];\nextern const FX_WCHAR gs_FX_TextLayout_VerticalMirror[64];\nextern const FX_WCHAR gs_FX_TextLayout_BidiMirror[512];\nFX_DWORD FX_GetUnicodeProperties(FX_WCHAR wch)\n{\n    return gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];\n}\nFX_BOOL FX_IsCtrlCode(FX_WCHAR ch)\n{\n    FX_DWORD dwRet = (gs_FX_TextLayout_CodeProperties[(FX_WORD)ch] & FX_CHARTYPEBITSMASK);\n    return dwRet == FX_CHARTYPE_Tab || dwRet == FX_CHARTYPE_Control;\n}\nFX_BOOL FX_IsRotationCode(FX_WCHAR ch)\n{\n    return (gs_FX_TextLayout_CodeProperties[(FX_WORD)ch] & 0x8000) != 0;\n}\nFX_BOOL FX_IsCombinationChar(FX_WCHAR wch)\n{\n    FX_DWORD dwProps = (gs_FX_TextLayout_CodeProperties[(FX_WORD)wch] & FX_CHARTYPEBITSMASK);\n    return dwProps == FX_CHARTYPE_Combination;\n}\nFX_BOOL\tFX_IsBidiChar(FX_WCHAR wch)\n{\n    FX_DWORD dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];\n    FX_INT32 iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS;\n    return (FX_BIDICLASS_R == iBidiCls || FX_BIDICLASS_AL == iBidiCls);\n}\nFX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, FX_BOOL bRTL, FX_BOOL bVertical)\n{\n    FX_DWORD dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];\n    FX_DWORD dwTemp = (dwProps & 0xFF800000);\n    if (bRTL && dwTemp < 0xFF800000) {\n        wch = gs_FX_TextLayout_BidiMirror[dwTemp >> 23];\n        dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];\n    }\n    if (bVertical) {\n        dwTemp = (dwProps & 0x007E0000);\n        if (dwTemp < 0x007E0000) {\n            wch = gs_FX_TextLayout_VerticalMirror[dwTemp >> 17];\n        }\n    }\n    return wch;\n}\nFX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, FX_DWORD dwProps, FX_BOOL bRTL, FX_BOOL bVertical)\n{\n    FX_DWORD dwTemp = (dwProps & 0xFF800000);\n    if (bRTL && dwTemp < 0xFF800000) {\n        wch = gs_FX_TextLayout_BidiMirror[dwTemp >> 23];\n        dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];\n    }\n    if (bVertical) {\n        dwTemp = (dwProps & 0x007E0000);\n        if (dwTemp < 0x007E0000) {\n            wch = gs_FX_TextLayout_VerticalMirror[dwTemp >> 17];\n        }\n    }\n    return wch;\n}\n"
  },
  {
    "path": "core/src/fxcrt/fx_xml_composer.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxcrt/fx_xml.h\"\n#include \"xml_int.h\"\nvoid FX_XML_SplitQualifiedName(FX_BSTR bsFullName, CFX_ByteStringC &bsSpace, CFX_ByteStringC &bsName)\n{\n    if (bsFullName.IsEmpty()) {\n        return;\n    }\n    FX_INT32 iStart = 0;\n    for (; iStart < bsFullName.GetLength(); iStart ++) {\n        if (bsFullName.GetAt(iStart) == ':') {\n            break;\n        }\n    }\n    if (iStart >= bsFullName.GetLength()) {\n        bsName = bsFullName;\n    } else {\n        bsSpace = CFX_ByteStringC(bsFullName.GetCStr(), iStart);\n        iStart ++;\n        bsName = CFX_ByteStringC(bsFullName.GetCStr() + iStart, bsFullName.GetLength() - iStart);\n    }\n}\nvoid CXML_Element::SetTag(FX_BSTR qSpace, FX_BSTR tagname)\n{\n    m_QSpaceName = qSpace;\n    m_TagName = tagname;\n}\nvoid CXML_Element::SetTag(FX_BSTR qTagName)\n{\n    ASSERT(!qTagName.IsEmpty());\n    CFX_ByteStringC bsSpace, bsName;\n    FX_XML_SplitQualifiedName(qTagName, bsSpace, bsName);\n    m_QSpaceName = bsSpace;\n    m_TagName = bsName;\n}\n"
  },
  {
    "path": "core/src/fxcrt/fx_xml_parser.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxcrt/fx_xml.h\"\n#include \"xml_int.h\"\nCXML_Parser::~CXML_Parser()\n{\n    if (m_bOwnedStream) {\n        m_pDataAcc->Release();\n    }\n}\nFX_BOOL CXML_Parser::Init(FX_LPBYTE pBuffer, size_t size)\n{\n    m_pDataAcc = FX_NEW CXML_DataBufAcc(pBuffer, size);\n    if (!m_pDataAcc) {\n        return FALSE;\n    }\n    return Init(TRUE);\n}\nFX_BOOL CXML_Parser::Init(IFX_FileRead *pFileRead)\n{\n    m_pDataAcc = FX_NEW CXML_DataStmAcc(pFileRead);\n    if (!m_pDataAcc) {\n        return FALSE;\n    }\n    return Init(TRUE);\n}\nFX_BOOL CXML_Parser::Init(IFX_BufferRead *pBuffer)\n{\n    if (!pBuffer) {\n        return FALSE;\n    }\n    m_pDataAcc = pBuffer;\n    return Init(FALSE);\n}\nFX_BOOL CXML_Parser::Init(FX_BOOL bOwndedStream)\n{\n    m_bOwnedStream = bOwndedStream;\n    m_nOffset = 0;\n    return ReadNextBlock();\n}\nFX_BOOL CXML_Parser::ReadNextBlock()\n{\n    if (!m_pDataAcc->ReadNextBlock()) {\n        return FALSE;\n    }\n    m_pBuffer = m_pDataAcc->GetBlockBuffer();\n    m_dwBufferSize = m_pDataAcc->GetBlockSize();\n    m_nBufferOffset = m_pDataAcc->GetBlockOffset();\n    m_dwIndex = 0;\n    return m_dwBufferSize > 0;\n}\nFX_BOOL CXML_Parser::IsEOF()\n{\n    if (!m_pDataAcc->IsEOF()) {\n        return FALSE;\n    }\n    return m_dwIndex >= m_dwBufferSize;\n}\n#define FXCRTM_XML_CHARTYPE_Normal\t\t\t0x00\n#define FXCRTM_XML_CHARTYPE_SpaceChar\t\t0x01\n#define FXCRTM_XML_CHARTYPE_Letter\t\t\t0x02\n#define FXCRTM_XML_CHARTYPE_Digital\t\t\t0x04\n#define FXCRTM_XML_CHARTYPE_NameIntro\t\t0x08\n#define FXCRTM_XML_CHARTYPE_NameChar\t\t0x10\n#define FXCRTM_XML_CHARTYPE_HexDigital\t\t0x20\n#define FXCRTM_XML_CHARTYPE_HexLowerLetter\t0x40\n#define FXCRTM_XML_CHARTYPE_HexUpperLetter\t0x60\n#define FXCRTM_XML_CHARTYPE_HexChar\t\t\t0x60\nFX_BYTE g_FXCRT_XML_ByteTypes[256] = {\n    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\n    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\n    0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00,\n    0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,\n    0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x18,\n    0x00, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,\n    0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,\n    0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,\n    0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,\n    0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,\n    0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,\n    0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,\n    0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,\n    0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x01, 0x01,\n};\nFX_BOOL g_FXCRT_XML_IsWhiteSpace(FX_BYTE ch)\n{\n    return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_SpaceChar) != 0;\n}\nFX_BOOL g_FXCRT_XML_IsLetter(FX_BYTE ch)\n{\n    return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_Letter) != 0;\n}\nFX_BOOL g_FXCRT_XML_IsDigital(FX_BYTE ch)\n{\n    return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_Digital) != 0;\n}\nFX_BOOL g_FXCRT_XML_IsNameIntro(FX_BYTE ch)\n{\n    return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_NameIntro) != 0;\n}\nFX_BOOL g_FXCRT_XML_IsNameChar(FX_BYTE ch)\n{\n    return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_NameChar) != 0;\n}\nFX_BOOL g_FXCRT_XML_IsHexChar(FX_BYTE ch)\n{\n    return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_HexChar) != 0;\n}\nvoid CXML_Parser::SkipWhiteSpaces()\n{\n    m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;\n    if (IsEOF()) {\n        return;\n    }\n    do {\n        while (m_dwIndex < m_dwBufferSize && g_FXCRT_XML_IsWhiteSpace(m_pBuffer[m_dwIndex])) {\n            m_dwIndex ++;\n        }\n        m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;\n        if (m_dwIndex < m_dwBufferSize || IsEOF()) {\n            break;\n        }\n    } while (ReadNextBlock());\n}\nvoid CXML_Parser::GetName(CFX_ByteString &space, CFX_ByteString &name)\n{\n    m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;\n    if (IsEOF()) {\n        return;\n    }\n    CFX_ByteTextBuf buf;\n    FX_BYTE ch;\n    do {\n        while (m_dwIndex < m_dwBufferSize) {\n            ch = m_pBuffer[m_dwIndex];\n            if (ch == ':') {\n                space = buf.GetByteString();\n                buf.Clear();\n            } else if (g_FXCRT_XML_IsNameChar(ch)) {\n                buf.AppendChar(ch);\n            } else {\n                break;\n            }\n            m_dwIndex ++;\n        }\n        m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;\n        if (m_dwIndex < m_dwBufferSize || IsEOF()) {\n            break;\n        }\n    } while (ReadNextBlock());\n    name = buf.GetByteString();\n}\nvoid CXML_Parser::SkipLiterals(FX_BSTR str)\n{\n    m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;\n    if (IsEOF()) {\n        return;\n    }\n    FX_INT32 i = 0, iLen = str.GetLength();\n    do {\n        while (m_dwIndex < m_dwBufferSize) {\n            if (str.GetAt(i) != m_pBuffer[m_dwIndex ++]) {\n                i = 0;\n            } else {\n                i ++;\n                if (i == iLen) {\n                    break;\n                }\n            }\n        }\n        m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;\n        if (i == iLen) {\n            return;\n        }\n        if (m_dwIndex < m_dwBufferSize || IsEOF()) {\n            break;\n        }\n    } while (ReadNextBlock());\n    while (!m_pDataAcc->IsEOF()) {\n        ReadNextBlock();\n        m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwBufferSize;\n    }\n    m_dwIndex = m_dwBufferSize;\n}\nFX_DWORD CXML_Parser::GetCharRef()\n{\n    m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;\n    if (IsEOF()) {\n        return 0;\n    }\n    FX_BYTE ch;\n    FX_INT32 iState = 0;\n    CFX_ByteTextBuf buf;\n    FX_DWORD code = 0;\n    do {\n        while (m_dwIndex < m_dwBufferSize) {\n            ch = m_pBuffer[m_dwIndex];\n            switch (iState) {\n                case 0:\n                    if (ch == '#') {\n                        m_dwIndex ++;\n                        iState = 2;\n                        break;\n                    }\n                    iState = 1;\n                case 1:\n                    m_dwIndex ++;\n                    if (ch == ';') {\n                        CFX_ByteStringC ref = buf.GetByteString();\n                        if (ref == FX_BSTRC(\"gt\")) {\n                            code = '>';\n                        } else if (ref == FX_BSTRC(\"lt\")) {\n                            code = '<';\n                        } else if (ref == FX_BSTRC(\"amp\")) {\n                            code = '&';\n                        } else if (ref == FX_BSTRC(\"apos\")) {\n                            code = '\\'';\n                        } else if (ref == FX_BSTRC(\"quot\")) {\n                            code = '\"';\n                        }\n                        iState = 10;\n                        break;\n                    }\n                    buf.AppendByte(ch);\n                    break;\n                case 2:\n                    if (ch == 'x') {\n                        m_dwIndex ++;\n                        iState = 4;\n                        break;\n                    }\n                    iState = 3;\n                case 3:\n                    m_dwIndex ++;\n                    if (ch == ';') {\n                        iState = 10;\n                        break;\n                    }\n                    if (g_FXCRT_XML_IsDigital(ch)) {\n                        code = code * 10 + ch - '0';\n                    }\n                    break;\n                case 4:\n                    m_dwIndex ++;\n                    if (ch == ';') {\n                        iState = 10;\n                        break;\n                    }\n                    FX_BYTE nHex = g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_HexChar;\n                    if (nHex) {\n                        if (nHex == FXCRTM_XML_CHARTYPE_HexDigital) {\n                            code = (code << 4) + ch - '0';\n                        } else if (nHex == FXCRTM_XML_CHARTYPE_HexLowerLetter) {\n                            code = (code << 4) + ch - 87;\n                        } else {\n                            code = (code << 4) + ch - 55;\n                        }\n                    }\n                    break;\n            }\n            if (iState == 10) {\n                break;\n            }\n        }\n        m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;\n        if (iState == 10 || m_dwIndex < m_dwBufferSize || IsEOF()) {\n            break;\n        }\n    } while (ReadNextBlock());\n    return code;\n}\nvoid CXML_Parser::GetAttrValue(CFX_WideString &value)\n{\n    m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;\n    if (IsEOF()) {\n        return;\n    }\n    CFX_UTF8Decoder decoder;\n    FX_BYTE mark = 0, ch;\n    do {\n        while (m_dwIndex < m_dwBufferSize) {\n            ch = m_pBuffer[m_dwIndex];\n            if (mark == 0) {\n                if (ch != '\\'' && ch != '\"') {\n                    return;\n                }\n                mark = ch;\n                m_dwIndex ++;\n                ch = 0;\n                continue;\n            }\n            m_dwIndex ++;\n            if (ch == mark) {\n                break;\n            }\n            if (ch == '&') {\n                decoder.AppendChar(GetCharRef());\n                if (IsEOF()) {\n                    value = decoder.GetResult();\n                    return;\n                }\n            } else {\n                decoder.Input(ch);\n            }\n        }\n        m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;\n        if (ch == mark || m_dwIndex < m_dwBufferSize || IsEOF()) {\n            break;\n        }\n    } while (ReadNextBlock());\n    value = decoder.GetResult();\n}\nvoid CXML_Parser::GetTagName(CFX_ByteString &space, CFX_ByteString &name, FX_BOOL &bEndTag, FX_BOOL bStartTag)\n{\n    m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;\n    if (IsEOF()) {\n        return;\n    }\n    bEndTag = FALSE;\n    FX_BYTE ch;\n    FX_INT32 iState = bStartTag ? 1 : 0;\n    do {\n        while (m_dwIndex < m_dwBufferSize) {\n            ch = m_pBuffer[m_dwIndex];\n            switch (iState) {\n                case 0:\n                    m_dwIndex ++;\n                    if (ch != '<') {\n                        break;\n                    }\n                    iState = 1;\n                    break;\n                case 1:\n                    if (ch == '?') {\n                        m_dwIndex ++;\n                        SkipLiterals(FX_BSTRC(\"?>\"));\n                        iState = 0;\n                        break;\n                    } else if (ch == '!') {\n                        m_dwIndex ++;\n                        SkipLiterals(FX_BSTRC(\"-->\"));\n                        iState = 0;\n                        break;\n                    }\n                    if (ch == '/') {\n                        m_dwIndex ++;\n                        GetName(space, name);\n                        bEndTag = TRUE;\n                    } else {\n                        GetName(space, name);\n                        bEndTag = FALSE;\n                    }\n                    return;\n            }\n        }\n        m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;\n        if (m_dwIndex < m_dwBufferSize || IsEOF()) {\n            break;\n        }\n    } while (ReadNextBlock());\n}\nCXML_Element* CXML_Parser::ParseElement(CXML_Element* pParent, FX_BOOL bStartTag)\n{\n    m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;\n    if (IsEOF()) {\n        return NULL;\n    }\n    CFX_ByteString tag_name, tag_space;\n    FX_BOOL bEndTag;\n    GetTagName(tag_space, tag_name, bEndTag, bStartTag);\n    if (tag_name.IsEmpty() || bEndTag) {\n        return NULL;\n    }\n    CXML_Element* pElement;\n    pElement = FX_NEW CXML_Element;\n    if (pElement) {\n        pElement->m_pParent = pParent;\n        pElement->SetTag(tag_space, tag_name);\n    }\n    if (!pElement) {\n        return NULL;\n    }\n    do {\n        CFX_ByteString attr_space, attr_name;\n        while (m_dwIndex < m_dwBufferSize) {\n            SkipWhiteSpaces();\n            if (IsEOF()) {\n                break;\n            }\n            if (!g_FXCRT_XML_IsNameIntro(m_pBuffer[m_dwIndex])) {\n                break;\n            }\n            GetName(attr_space, attr_name);\n            SkipWhiteSpaces();\n            if (IsEOF()) {\n                break;\n            }\n            if (m_pBuffer[m_dwIndex] != '=') {\n                break;\n            }\n            m_dwIndex ++;\n            SkipWhiteSpaces();\n            if (IsEOF()) {\n                break;\n            }\n            CFX_WideString attr_value;\n            GetAttrValue(attr_value);\n            pElement->m_AttrMap.SetAt(attr_space, attr_name, attr_value);\n        }\n        m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;\n        if (m_dwIndex < m_dwBufferSize || IsEOF()) {\n            break;\n        }\n    } while (ReadNextBlock());\n    SkipWhiteSpaces();\n    if (IsEOF()) {\n        return pElement;\n    }\n    FX_BYTE ch = m_pBuffer[m_dwIndex ++];\n    if (ch == '/') {\n        m_dwIndex ++;\n        m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;\n        return pElement;\n    }\n    if (ch != '>') {\n        m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;\n        delete pElement;\n        return NULL;\n    }\n    SkipWhiteSpaces();\n    if (IsEOF()) {\n        return pElement;\n    }\n    CFX_UTF8Decoder decoder;\n    CFX_WideTextBuf content;\n    FX_BOOL bCDATA = FALSE;\n    FX_INT32 iState = 0;\n    do {\n        while (m_dwIndex < m_dwBufferSize) {\n            ch = m_pBuffer[m_dwIndex ++];\n            switch (iState) {\n                case 0:\n                    if (ch == '<') {\n                        iState = 1;\n                    } else if (ch == '&') {\n                        decoder.ClearStatus();\n                        decoder.AppendChar(GetCharRef());\n                    } else {\n                        decoder.Input(ch);\n                    }\n                    break;\n                case 1:\n                    if (ch == '!') {\n                        iState = 2;\n                    } else if (ch == '?') {\n                        SkipLiterals(FX_BSTRC(\"?>\"));\n                        SkipWhiteSpaces();\n                        iState = 0;\n                    } else if (ch == '/') {\n                        CFX_ByteString space, name;\n                        GetName(space, name);\n                        SkipWhiteSpaces();\n                        m_dwIndex ++;\n                        iState = 10;\n                    } else {\n                        content << decoder.GetResult();\n                        CFX_WideString dataStr = content.GetWideString();\n                        if (!bCDATA && !m_bSaveSpaceChars) {\n                            dataStr.TrimRight((FX_LPCWSTR)L\" \\t\\r\\n\");\n                        }\n                        InsertContentSegment(bCDATA, dataStr, pElement);\n                        content.Clear();\n                        decoder.Clear();\n                        bCDATA = FALSE;\n                        iState = 0;\n                        m_dwIndex --;\n                        CXML_Element* pSubElement = ParseElement(pElement, TRUE);\n                        if (pSubElement == NULL) {\n                            break;\n                        }\n                        pSubElement->m_pParent = pElement;\n                        pElement->m_Children.Add((FX_LPVOID)CXML_Element::Element);\n                        pElement->m_Children.Add(pSubElement);\n                        SkipWhiteSpaces();\n                    }\n                    break;\n                case 2:\n                    if (ch == '[') {\n                        SkipLiterals(FX_BSTRC(\"]]>\"));\n                    } else if (ch == '-') {\n                        m_dwIndex ++;\n                        SkipLiterals(FX_BSTRC(\"-->\"));\n                    } else {\n                        SkipLiterals(FX_BSTRC(\">\"));\n                    }\n                    decoder.Clear();\n                    SkipWhiteSpaces();\n                    iState = 0;\n                    break;\n            }\n            if (iState == 10) {\n                break;\n            }\n        }\n        m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;\n        if (iState == 10 || m_dwIndex < m_dwBufferSize || IsEOF()) {\n            break;\n        }\n    } while (ReadNextBlock());\n    content << decoder.GetResult();\n    CFX_WideString dataStr = content.GetWideString();\n    if (!m_bSaveSpaceChars) {\n        dataStr.TrimRight((FX_LPCWSTR)L\" \\t\\r\\n\");\n    }\n    InsertContentSegment(bCDATA, dataStr, pElement);\n    content.Clear();\n    decoder.Clear();\n    bCDATA = FALSE;\n    return pElement;\n}\nvoid CXML_Parser::InsertContentSegment(FX_BOOL bCDATA, FX_WSTR content, CXML_Element* pElement)\n{\n    if (content.IsEmpty()) {\n        return;\n    }\n    CXML_Content* pContent;\n    pContent = FX_NEW CXML_Content;\n    if (!pContent) {\n        return;\n    }\n    pContent->Set(bCDATA, content);\n    pElement->m_Children.Add((FX_LPVOID)CXML_Element::Content);\n    pElement->m_Children.Add(pContent);\n}\nstatic CXML_Element* XML_ContinueParse(CXML_Parser &parser, FX_BOOL bSaveSpaceChars, FX_FILESIZE* pParsedSize)\n{\n    parser.m_bSaveSpaceChars = bSaveSpaceChars;\n    CXML_Element* pElement = parser.ParseElement(NULL, FALSE);\n    if (pParsedSize) {\n        *pParsedSize = parser.m_nOffset;\n    }\n    return pElement;\n}\nCXML_Element* CXML_Element::Parse(const void* pBuffer, size_t size, FX_BOOL bSaveSpaceChars, FX_FILESIZE* pParsedSize)\n{\n    CXML_Parser parser;\n    if (!parser.Init((FX_LPBYTE)pBuffer, size)) {\n        return NULL;\n    }\n    return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize);\n}\nCXML_Element* CXML_Element::Parse(IFX_FileRead *pFile, FX_BOOL bSaveSpaceChars, FX_FILESIZE* pParsedSize)\n{\n    CXML_Parser parser;\n    if (!parser.Init(pFile)) {\n        return NULL;\n    }\n    return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize);\n}\nCXML_Element* CXML_Element::Parse(IFX_BufferRead *pBuffer, FX_BOOL bSaveSpaceChars, FX_FILESIZE* pParsedSize)\n{\n    CXML_Parser parser;\n    if (!parser.Init(pBuffer)) {\n        return NULL;\n    }\n    return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize);\n}\nCXML_Element::CXML_Element()\n    : m_QSpaceName()\n    , m_TagName()\n    , m_AttrMap()\n{\n}\nCXML_Element::CXML_Element(FX_BSTR qSpace, FX_BSTR tagName)\n    : m_QSpaceName()\n    , m_TagName()\n    , m_AttrMap()\n{\n    m_QSpaceName = qSpace;\n    m_TagName = tagName;\n}\nCXML_Element::CXML_Element(FX_BSTR qTagName)\n    : m_pParent(NULL)\n    , m_QSpaceName()\n    , m_TagName()\n    , m_AttrMap()\n{\n    SetTag(qTagName);\n}\nCXML_Element::~CXML_Element()\n{\n    Empty();\n}\nvoid CXML_Element::Empty()\n{\n    RemoveChildren();\n}\nvoid CXML_Element::RemoveChildren()\n{\n    for (int i = 0; i < m_Children.GetSize(); i += 2) {\n        ChildType type = (ChildType)(FX_UINTPTR)m_Children.GetAt(i);\n        if (type == Content) {\n            CXML_Content* content = (CXML_Content*)m_Children.GetAt(i + 1);\n            delete content;\n        } else if (type == Element) {\n            CXML_Element* child = (CXML_Element*)m_Children.GetAt(i + 1);\n            child->RemoveChildren();\n            delete child;\n        }\n    }\n    m_Children.RemoveAll();\n}\nCFX_ByteString CXML_Element::GetTagName(FX_BOOL bQualified) const\n{\n    if (!bQualified || m_QSpaceName.IsEmpty()) {\n        return m_TagName;\n    }\n    CFX_ByteString bsTag = m_QSpaceName;\n    bsTag += \":\";\n    bsTag += m_TagName;\n    return bsTag;\n}\nCFX_ByteString CXML_Element::GetNamespace(FX_BOOL bQualified) const\n{\n    if (bQualified) {\n        return m_QSpaceName;\n    }\n    return GetNamespaceURI(m_QSpaceName);\n}\nCFX_ByteString CXML_Element::GetNamespaceURI(FX_BSTR qName) const\n{\n    const CFX_WideString* pwsSpace;\n    const CXML_Element *pElement = this;\n    do {\n        if (qName.IsEmpty()) {\n            pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC(\"\"), FX_BSTRC(\"xmlns\"));\n        } else {\n            pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC(\"xmlns\"), qName);\n        }\n        if (pwsSpace) {\n            break;\n        }\n        pElement = pElement->GetParent();\n    } while(pElement);\n    return pwsSpace ? FX_UTF8Encode(*pwsSpace) : CFX_ByteString();\n}\nvoid CXML_Element::GetAttrByIndex(int index, CFX_ByteString& space, CFX_ByteString& name, CFX_WideString& value) const\n{\n    if (index < 0 || index >= m_AttrMap.GetSize()) {\n        return;\n    }\n    CXML_AttrItem& item = m_AttrMap.GetAt(index);\n    space = item.m_QSpaceName;\n    name = item.m_AttrName;\n    value = item.m_Value;\n}\nFX_BOOL CXML_Element::HasAttr(FX_BSTR name) const\n{\n    CFX_ByteStringC bsSpace, bsName;\n    FX_XML_SplitQualifiedName(name, bsSpace, bsName);\n    return m_AttrMap.Lookup(bsSpace, bsName) != NULL;\n}\nFX_BOOL CXML_Element::GetAttrValue(FX_BSTR name, CFX_WideString& attribute) const\n{\n    CFX_ByteStringC bsSpace, bsName;\n    FX_XML_SplitQualifiedName(name, bsSpace, bsName);\n    const CFX_WideString* pValue = m_AttrMap.Lookup(bsSpace, bsName);\n    if (pValue) {\n        attribute = CFX_WideString((FX_LPCWSTR)pValue, pValue->GetLength());\n        return TRUE;\n    }\n    return FALSE;\n}\nFX_BOOL CXML_Element::GetAttrValue(FX_BSTR space, FX_BSTR name, CFX_WideString& attribute) const\n{\n    const CFX_WideString* pValue = m_AttrMap.Lookup(space, name);\n    if (pValue) {\n        attribute = CFX_WideString((FX_LPCWSTR)pValue, pValue->GetLength());\n        return TRUE;\n    }\n    return FALSE;\n}\nFX_BOOL CXML_Element::GetAttrInteger(FX_BSTR name, int& attribute) const\n{\n    CFX_ByteStringC bsSpace, bsName;\n    FX_XML_SplitQualifiedName(name, bsSpace, bsName);\n    const CFX_WideString* pwsValue = m_AttrMap.Lookup(bsSpace, bsName);\n    if (pwsValue) {\n        attribute = pwsValue->GetInteger();\n        return TRUE;\n    }\n    return FALSE;\n}\nFX_BOOL\tCXML_Element::GetAttrInteger(FX_BSTR space, FX_BSTR name, int& attribute) const\n{\n    const CFX_WideString* pwsValue = m_AttrMap.Lookup(space, name);\n    if (pwsValue) {\n        attribute = pwsValue->GetInteger();\n        return TRUE;\n    }\n    return FALSE;\n}\nFX_BOOL CXML_Element::GetAttrFloat(FX_BSTR name, FX_FLOAT& attribute) const\n{\n    CFX_ByteStringC bsSpace, bsName;\n    FX_XML_SplitQualifiedName(name, bsSpace, bsName);\n    return GetAttrFloat(bsSpace, bsName, attribute);\n}\nFX_BOOL CXML_Element::GetAttrFloat(FX_BSTR space, FX_BSTR name, FX_FLOAT& attribute) const\n{\n    const CFX_WideString* pValue = m_AttrMap.Lookup(space, name);\n    if (pValue) {\n        attribute = pValue->GetFloat();\n        return TRUE;\n    }\n    return FALSE;\n}\nFX_DWORD CXML_Element::CountChildren() const\n{\n    return m_Children.GetSize() / 2;\n}\nCXML_Element::ChildType CXML_Element::GetChildType(FX_DWORD index) const\n{\n    index <<= 1;\n    if (index >= (FX_DWORD)m_Children.GetSize()) {\n        return Invalid;\n    }\n    return (ChildType)(FX_UINTPTR)m_Children.GetAt(index);\n}\nCFX_WideString CXML_Element::GetContent(FX_DWORD index) const\n{\n    index <<= 1;\n    if (index >= (FX_DWORD)m_Children.GetSize() ||\n            (ChildType)(FX_UINTPTR)m_Children.GetAt(index) != Content) {\n        return CFX_WideString();\n    }\n    CXML_Content* pContent = (CXML_Content*)m_Children.GetAt(index + 1);\n    if (pContent) {\n        return pContent->m_Content;\n    }\n    return CFX_WideString();\n}\nCXML_Element* CXML_Element::GetElement(FX_DWORD index) const\n{\n    index <<= 1;\n    if (index >= (FX_DWORD)m_Children.GetSize() ||\n            (ChildType)(FX_UINTPTR)m_Children.GetAt(index) != Element) {\n        return NULL;\n    }\n    return (CXML_Element*)m_Children.GetAt(index + 1);\n}\nFX_DWORD CXML_Element::CountElements(FX_BSTR space, FX_BSTR tag) const\n{\n    int count = 0;\n    for (int i = 0; i < m_Children.GetSize(); i += 2) {\n        ChildType type = (ChildType)(FX_UINTPTR)m_Children.GetAt(i);\n        if (type != Element) {\n            continue;\n        }\n        CXML_Element* pKid = (CXML_Element*)m_Children.GetAt(i + 1);\n        if ((space.IsEmpty() || pKid->m_QSpaceName == space) && pKid->m_TagName == tag) {\n            count ++;\n        }\n    }\n    return count;\n}\nCXML_Element* CXML_Element::GetElement(FX_BSTR space, FX_BSTR tag, int index) const\n{\n    if (index < 0) {\n        return NULL;\n    }\n    for (int i = 0; i < m_Children.GetSize(); i += 2) {\n        ChildType type = (ChildType)(FX_UINTPTR)m_Children.GetAt(i);\n        if (type != Element) {\n            continue;\n        }\n        CXML_Element* pKid = (CXML_Element*)m_Children.GetAt(i + 1);\n        if ((!space.IsEmpty() && pKid->m_QSpaceName != space) || pKid->m_TagName != tag) {\n            continue;\n        }\n        if (index -- == 0) {\n            return pKid;\n        }\n    }\n    return NULL;\n}\nFX_DWORD CXML_Element::FindElement(CXML_Element *pChild) const\n{\n    for (int i = 0; i < m_Children.GetSize(); i += 2) {\n        if ((ChildType)(FX_UINTPTR)m_Children.GetAt(i) == Element &&\n                (CXML_Element*)m_Children.GetAt(i + 1) == pChild) {\n            return (FX_DWORD)(i >> 1);\n        }\n    }\n    return (FX_DWORD) - 1;\n}\nconst CFX_WideString* CXML_AttrMap::Lookup(FX_BSTR space, FX_BSTR name) const\n{\n    if (m_pMap == NULL) {\n        return NULL;\n    }\n    for (int i = 0; i < m_pMap->GetSize(); i ++) {\n        CXML_AttrItem& item = GetAt(i);\n        if ((space.IsEmpty() || item.m_QSpaceName == space) && item.m_AttrName == name) {\n            return &item.m_Value;\n        }\n    }\n    return NULL;\n}\nvoid CXML_AttrMap::SetAt(FX_BSTR space, FX_BSTR name, FX_WSTR value)\n{\n    for (int i = 0; i < GetSize(); i++) {\n        CXML_AttrItem& item = GetAt(i);\n        if ((space.IsEmpty() || item.m_QSpaceName == space) && item.m_AttrName == name) {\n            item.m_Value = value;\n            return;\n        }\n    }\n    if (!m_pMap) {\n        m_pMap = FX_NEW CFX_ObjectArray < CXML_AttrItem > ;\n    }\n    if (!m_pMap) {\n        return;\n    }\n    CXML_AttrItem* pItem = (CXML_AttrItem*)m_pMap->AddSpace();\n    if (!pItem) {\n        return;\n    }\n    pItem->m_QSpaceName = space;\n    pItem->m_AttrName = name;\n    pItem->m_Value = value;\n}\nvoid CXML_AttrMap::RemoveAt(FX_BSTR space, FX_BSTR name)\n{\n    if (m_pMap == NULL) {\n        return;\n    }\n    for (int i = 0; i < m_pMap->GetSize(); i ++) {\n        CXML_AttrItem& item = GetAt(i);\n        if ((space.IsEmpty() || item.m_QSpaceName == space) && item.m_AttrName == name) {\n            m_pMap->RemoveAt(i);\n            return;\n        }\n    }\n}\nint CXML_AttrMap::GetSize() const\n{\n    return m_pMap == NULL ? 0 : m_pMap->GetSize();\n}\nCXML_AttrItem& CXML_AttrMap::GetAt(int index) const\n{\n    ASSERT(m_pMap != NULL);\n    return (*m_pMap)[index];\n}\nvoid CXML_AttrMap::RemoveAll()\n{\n    if (!m_pMap) {\n        return;\n    }\n    for (int i = 0; i < m_pMap->GetSize(); i ++) {\n        CXML_AttrItem& item = (*m_pMap)[i];\n    }\n    m_pMap->RemoveAll();\n    delete m_pMap;\n    m_pMap = NULL;\n}\n"
  },
  {
    "path": "core/src/fxcrt/fxcrt_platforms.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxcrt/fx_ext.h\"\n#include \"fxcrt_platforms.h\"\n#if (_FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ && _FXM_PLATFORM_ != _FXM_PLATFORM_LINUX_ && _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ && _FXM_PLATFORM_ != _FXM_PLATFORM_ANDROID_)\nIFXCRT_FileAccess* FXCRT_FileAccess_Create()\n{\n    return FX_NEW CFXCRT_FileAccess_CRT;\n}\nvoid FXCRT_GetFileModeString(FX_DWORD dwModes, CFX_ByteString &bsMode)\n{\n    if (dwModes & FX_FILEMODE_ReadOnly) {\n        bsMode = FX_BSTRC(\"rb\");\n    } else if (dwModes & FX_FILEMODE_Truncate) {\n        bsMode = FX_BSTRC(\"w+b\");\n    } else {\n        bsMode = FX_BSTRC(\"a+b\");\n    }\n}\nvoid FXCRT_GetFileModeString(FX_DWORD dwModes, CFX_WideString &wsMode)\n{\n    if (dwModes & FX_FILEMODE_ReadOnly) {\n        wsMode = FX_WSTRC(L\"rb\");\n    } else if (dwModes & FX_FILEMODE_Truncate) {\n        wsMode = FX_WSTRC(L\"w+b\");\n    } else {\n        wsMode = FX_WSTRC(L\"a+b\");\n    }\n}\nCFXCRT_FileAccess_CRT::CFXCRT_FileAccess_CRT()\n    : m_hFile(NULL)\n{\n}\nCFXCRT_FileAccess_CRT::~CFXCRT_FileAccess_CRT()\n{\n    Close();\n}\nFX_BOOL CFXCRT_FileAccess_CRT::Open(FX_BSTR fileName, FX_DWORD dwMode)\n{\n    if (m_hFile) {\n        return FALSE;\n    }\n    CFX_ByteString strMode;\n    FXCRT_GetFileModeString(dwMode, strMode);\n    m_hFile = FXSYS_fopen(fileName.GetCStr(), (FX_LPCSTR)strMode);\n    return m_hFile != NULL;\n}\nFX_BOOL CFXCRT_FileAccess_CRT::Open(FX_WSTR fileName, FX_DWORD dwMode)\n{\n    if (m_hFile) {\n        return FALSE;\n    }\n    CFX_WideString strMode;\n    FXCRT_GetFileModeString(dwMode, strMode);\n    m_hFile = FXSYS_wfopen(fileName.GetPtr(), (FX_LPCWSTR)strMode);\n    return m_hFile != NULL;\n}\nvoid CFXCRT_FileAccess_CRT::Close()\n{\n    if (!m_hFile) {\n        return;\n    }\n    FXSYS_fclose(m_hFile);\n    m_hFile = NULL;\n}\nvoid CFXCRT_FileAccess_CRT::Release()\n{\n    delete this;\n}\nFX_FILESIZE CFXCRT_FileAccess_CRT::GetSize() const\n{\n    if (!m_hFile) {\n        return 0;\n    }\n    FX_FILESIZE pos = (FX_FILESIZE)FXSYS_ftell(m_hFile);\n    FXSYS_fseek(m_hFile, 0, FXSYS_SEEK_END);\n    FX_FILESIZE size = (FX_FILESIZE)FXSYS_ftell(m_hFile);\n    FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);\n    return size;\n}\nFX_FILESIZE CFXCRT_FileAccess_CRT::GetPosition() const\n{\n    if (!m_hFile) {\n        return (FX_FILESIZE) - 1;\n    }\n    return (FX_FILESIZE)FXSYS_ftell(m_hFile);\n}\nFX_FILESIZE CFXCRT_FileAccess_CRT::SetPosition(FX_FILESIZE pos)\n{\n    if (!m_hFile) {\n        return (FX_FILESIZE) - 1;\n    }\n    FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);\n    return (FX_FILESIZE)FXSYS_ftell(m_hFile);\n}\nsize_t CFXCRT_FileAccess_CRT::Read(void* pBuffer, size_t szBuffer)\n{\n    if (!m_hFile) {\n        return 0;\n    }\n    return FXSYS_fread(pBuffer, 1, szBuffer, m_hFile);\n}\nsize_t CFXCRT_FileAccess_CRT::Write(const void* pBuffer, size_t szBuffer)\n{\n    if (!m_hFile) {\n        return 0;\n    }\n    return FXSYS_fwrite(pBuffer, 1, szBuffer, m_hFile);\n}\nsize_t CFXCRT_FileAccess_CRT::ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos)\n{\n    if (!m_hFile) {\n        return (FX_FILESIZE) - 1;\n    }\n    FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);\n    return FXSYS_fread(pBuffer, 1, szBuffer, m_hFile);\n}\nsize_t CFXCRT_FileAccess_CRT::WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos)\n{\n    if (!m_hFile) {\n        return (FX_FILESIZE) - 1;\n    }\n    FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);\n    return FXSYS_fwrite(pBuffer, 1, szBuffer, m_hFile);\n}\nFX_BOOL CFXCRT_FileAccess_CRT::Flush()\n{\n    if (!m_hFile) {\n        return FALSE;\n    }\n    return !FXSYS_fflush(m_hFile);\n}\nFX_BOOL CFXCRT_FileAccess_CRT::Truncate(FX_FILESIZE szFile)\n{\n    return FALSE;\n}\nFX_BOOL FX_File_Exist(FX_BSTR fileName)\n{\n    return access(fileName.GetCStr(), F_OK) > -1;\n}\nFX_BOOL FX_File_Exist(FX_WSTR fileName)\n{\n    return FX_File_Exist(FX_UTF8Encode(fileName));\n}\nFX_BOOL FX_File_Delete(FX_BSTR fileName)\n{\n    return remove(fileName.GetCStr()) > -1;\n}\nFX_BOOL FX_File_Delete(FX_WSTR fileName)\n{\n    return FX_File_Delete(FX_UTF8Encode(fileName));\n}\nFX_BOOL FX_File_Copy(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)\n{\n    CFXCRT_FileAccess_CRT src, dst;\n    if (!src.Open(fileNameSrc, FX_FILEMODE_ReadOnly)) {\n        return FALSE;\n    }\n    FX_FILESIZE size = src.GetSize();\n    if (!size) {\n        return FALSE;\n    }\n    if (!dst.Open(fileNameDst, FX_FILEMODE_Truncate)) {\n        return FALSE;\n    }\n    FX_FILESIZE num = 0;\n    FX_LPBYTE pBuffer = FX_Alloc(FX_BYTE, 32768);\n    if (!pBuffer) {\n        return FALSE;\n    }\n    while (num = src.Read(pBuffer, 32768)) {\n        if (dst.Write(pBuffer, num) != num) {\n            break;\n        }\n    }\n    FX_Free(pBuffer);\n    return TRUE;\n}\nFX_BOOL FX_File_Copy(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)\n{\n    return FX_File_Copy(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));\n}\nFX_BOOL FX_File_Move(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)\n{\n    return rename(fileNameSrc.GetCStr(), fileNameDst.GetCStr());\n}\nFX_BOOL FX_File_Move(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)\n{\n    return FX_File_Move(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));\n}\n#endif\n"
  },
  {
    "path": "core/src/fxcrt/fxcrt_platforms.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXCRT_PLATFORMS_\n#define _FXCRT_PLATFORMS_\n#include \"extension.h\"\n#if _FX_OS_ == _FX_ANDROID_\nvoid\tFXCRT_GetFileModeString(FX_DWORD dwModes, CFX_ByteString &bsMode);\nvoid\tFXCRT_GetFileModeString(FX_DWORD dwModes, CFX_WideString &wsMode);\nclass CFXCRT_FileAccess_CRT : public IFXCRT_FileAccess, public CFX_Object\n{\npublic:\n    CFXCRT_FileAccess_CRT();\n    virtual ~CFXCRT_FileAccess_CRT();\n    virtual FX_BOOL\t\tOpen(FX_BSTR fileName, FX_DWORD dwMode);\n    virtual FX_BOOL\t\tOpen(FX_WSTR fileName, FX_DWORD dwMode);\n    virtual void\t\tClose();\n    virtual void\t\tRelease();\n    virtual FX_FILESIZE\tGetSize() const;\n    virtual FX_FILESIZE\tGetPosition() const;\n    virtual FX_FILESIZE\tSetPosition(FX_FILESIZE pos);\n    virtual size_t\t\tRead(void* pBuffer, size_t szBuffer);\n    virtual size_t\t\tWrite(const void* pBuffer, size_t szBuffer);\n    virtual size_t\t\tReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos);\n    virtual size_t\t\tWritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos);\n    virtual FX_BOOL\t\tFlush();\n    virtual FX_BOOL\t\tTruncate(FX_FILESIZE szFile);\nprotected:\n    FXSYS_FILE*\tm_hFile;\n};\n#endif\n#endif\n"
  },
  {
    "path": "core/src/fxcrt/fxcrt_posix.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxcrt/fx_ext.h\"\n#include \"fxcrt_posix.h\"\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_\nIFXCRT_FileAccess* FXCRT_FileAccess_Create()\n{\n    return FX_NEW CFXCRT_FileAccess_Posix;\n}\nvoid FXCRT_Posix_GetFileMode(FX_DWORD dwModes, FX_INT32 &nFlags, FX_INT32 &nMasks)\n{\n    nFlags = O_BINARY | O_LARGEFILE;\n    if (dwModes & FX_FILEMODE_ReadOnly) {\n        nFlags |= O_RDONLY;\n        nMasks = 0;\n    } else {\n        nFlags |= O_RDWR | O_CREAT;\n        if (dwModes & FX_FILEMODE_Truncate) {\n            nFlags |= O_TRUNC;\n        }\n        nMasks = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;\n    }\n}\nCFXCRT_FileAccess_Posix::CFXCRT_FileAccess_Posix()\n    : m_nFD(-1)\n{\n}\nCFXCRT_FileAccess_Posix::~CFXCRT_FileAccess_Posix()\n{\n    Close();\n}\nFX_BOOL CFXCRT_FileAccess_Posix::Open(FX_BSTR fileName, FX_DWORD dwMode)\n{\n    if (m_nFD > -1) {\n        return FALSE;\n    }\n    FX_INT32 nFlags, nMasks;\n    FXCRT_Posix_GetFileMode(dwMode, nFlags, nMasks);\n    m_nFD = open(fileName.GetCStr(), nFlags, nMasks);\n    return m_nFD > -1;\n}\nFX_BOOL CFXCRT_FileAccess_Posix::Open(FX_WSTR fileName, FX_DWORD dwMode)\n{\n    return Open(FX_UTF8Encode(fileName), dwMode);\n}\nvoid CFXCRT_FileAccess_Posix::Close()\n{\n    if (m_nFD < 0) {\n        return;\n    }\n    close(m_nFD);\n    m_nFD = -1;\n}\nvoid CFXCRT_FileAccess_Posix::Release()\n{\n    delete this;\n}\nFX_FILESIZE CFXCRT_FileAccess_Posix::GetSize() const\n{\n    if (m_nFD < 0) {\n        return 0;\n    }\n    struct stat s;\n    FXSYS_memset32(&s, 0, sizeof(s));\n    fstat(m_nFD, &s);\n    return s.st_size;\n}\nFX_FILESIZE CFXCRT_FileAccess_Posix::GetPosition() const\n{\n    if (m_nFD < 0) {\n        return (FX_FILESIZE) - 1;\n    }\n    return lseek(m_nFD, 0, SEEK_CUR);\n}\nFX_FILESIZE CFXCRT_FileAccess_Posix::SetPosition(FX_FILESIZE pos)\n{\n    if (m_nFD < 0) {\n        return (FX_FILESIZE) - 1;\n    }\n    return lseek(m_nFD, pos, SEEK_SET);\n}\nsize_t CFXCRT_FileAccess_Posix::Read(void* pBuffer, size_t szBuffer)\n{\n    if (m_nFD < 0) {\n        return 0;\n    }\n    return read(m_nFD, pBuffer, szBuffer);\n}\nsize_t CFXCRT_FileAccess_Posix::Write(const void* pBuffer, size_t szBuffer)\n{\n    if (m_nFD < 0) {\n        return 0;\n    }\n    return write(m_nFD, pBuffer, szBuffer);\n}\nsize_t CFXCRT_FileAccess_Posix::ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos)\n{\n    if (m_nFD < 0) {\n        return 0;\n    }\n    if (pos >= GetSize()) {\n        return 0;\n    }\n    if (SetPosition(pos) == (FX_FILESIZE) - 1) {\n        return 0;\n    }\n    return Read(pBuffer, szBuffer);\n}\nsize_t CFXCRT_FileAccess_Posix::WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos)\n{\n    if (m_nFD < 0) {\n        return 0;\n    }\n    if (SetPosition(pos) == (FX_FILESIZE) - 1) {\n        return 0;\n    }\n    return Write(pBuffer, szBuffer);\n}\nFX_BOOL CFXCRT_FileAccess_Posix::Flush()\n{\n    if (m_nFD < 0) {\n        return FALSE;\n    }\n    return fsync(m_nFD) > -1;\n}\nFX_BOOL CFXCRT_FileAccess_Posix::Truncate(FX_FILESIZE szFile)\n{\n    if (m_nFD < 0) {\n        return FALSE;\n    }\n    return !ftruncate(m_nFD, szFile);\n}\nFX_BOOL FX_File_Exist(FX_BSTR fileName)\n{\n    return access(fileName.GetCStr(), F_OK) > -1;\n}\nFX_BOOL FX_File_Exist(FX_WSTR fileName)\n{\n    return FX_File_Exist(FX_UTF8Encode(fileName));\n}\nFX_BOOL FX_File_Delete(FX_BSTR fileName)\n{\n    return remove(fileName.GetCStr()) > -1;\n}\nFX_BOOL FX_File_Delete(FX_WSTR fileName)\n{\n    return FX_File_Delete(FX_UTF8Encode(fileName));\n}\nFX_BOOL FX_File_Copy(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)\n{\n    CFXCRT_FileAccess_Posix src, dst;\n    if (!src.Open(fileNameSrc, FX_FILEMODE_ReadOnly)) {\n        return FALSE;\n    }\n    FX_FILESIZE size = src.GetSize();\n    if (!size) {\n        return FALSE;\n    }\n    if (!dst.Open(fileNameDst, FX_FILEMODE_Truncate)) {\n        return FALSE;\n    }\n    size_t num = 0;\n    FX_LPBYTE pBuffer = FX_Alloc(FX_BYTE, 32768);\n    if (!pBuffer) {\n        return FALSE;\n    }\n    num = src.Read(pBuffer, 32768);\n    while (num) {\n        if (dst.Write(pBuffer, num) != num) {\n            break;\n        }\n        num = src.Read(pBuffer, 32768);\n    }\n    FX_Free(pBuffer);\n    return TRUE;\n}\nFX_BOOL FX_File_Copy(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)\n{\n    return FX_File_Copy(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));\n}\nFX_BOOL FX_File_Move(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)\n{\n    return rename(fileNameSrc.GetCStr(), fileNameDst.GetCStr());\n}\nFX_BOOL FX_File_Move(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)\n{\n    return FX_File_Move(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));\n}\n#endif\n"
  },
  {
    "path": "core/src/fxcrt/fxcrt_posix.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXCRT_LINUX_\n#define _FXCRT_LINUX_\n#include \"extension.h\"\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_\nclass CFXCRT_FileAccess_Posix : public IFXCRT_FileAccess, public CFX_Object\n{\npublic:\n    CFXCRT_FileAccess_Posix();\n    virtual ~CFXCRT_FileAccess_Posix();\n    virtual FX_BOOL\t\tOpen(FX_BSTR fileName, FX_DWORD dwMode);\n    virtual FX_BOOL\t\tOpen(FX_WSTR fileName, FX_DWORD dwMode);\n    virtual void\t\tClose();\n    virtual void\t\tRelease();\n    virtual FX_FILESIZE\tGetSize() const;\n    virtual FX_FILESIZE\tGetPosition() const;\n    virtual FX_FILESIZE\tSetPosition(FX_FILESIZE pos);\n    virtual size_t\t\tRead(void* pBuffer, size_t szBuffer);\n    virtual size_t\t\tWrite(const void* pBuffer, size_t szBuffer);\n    virtual size_t\t\tReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos);\n    virtual size_t\t\tWritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos);\n    virtual FX_BOOL\t\tFlush();\n    virtual FX_BOOL\t\tTruncate(FX_FILESIZE szFile);\nprotected:\n    FX_INT32\tm_nFD;\n};\n#endif\n#endif\n"
  },
  {
    "path": "core/src/fxcrt/fxcrt_windows.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxcrt/fx_ext.h\"\n#include \"fxcrt_windows.h\"\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\nFX_BOOL FX_File_Exist(FX_BSTR fileName)\n{\n    FX_DWORD dwAttri = ::GetFileAttributesA(fileName.GetCStr());\n    if (dwAttri == -1) {\n        return FALSE;\n    }\n    return (dwAttri & FILE_ATTRIBUTE_DIRECTORY) == 0;\n}\nFX_BOOL FX_File_Exist(FX_WSTR fileName)\n{\n    FX_DWORD dwAttri = ::GetFileAttributesW((LPCWSTR)fileName.GetPtr());\n    if (dwAttri == -1) {\n        return FALSE;\n    }\n    return (dwAttri & FILE_ATTRIBUTE_DIRECTORY) == 0;\n}\nIFXCRT_FileAccess* FXCRT_FileAccess_Create()\n{\n    return FX_NEW CFXCRT_FileAccess_Win64;\n}\nvoid FXCRT_Windows_GetFileMode(FX_DWORD dwMode, FX_DWORD &dwAccess, FX_DWORD &dwShare, FX_DWORD &dwCreation)\n{\n    dwAccess = GENERIC_READ;\n    dwShare = FILE_SHARE_READ | FILE_SHARE_WRITE;\n    if (!(dwMode & FX_FILEMODE_ReadOnly)) {\n        dwAccess |= GENERIC_WRITE;\n        dwCreation = (dwMode & FX_FILEMODE_Truncate) ? CREATE_ALWAYS : OPEN_ALWAYS;\n    } else {\n        dwCreation = OPEN_EXISTING;\n    }\n}\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nWINBASEAPI BOOL WINAPI GetFileSizeEx(HANDLE hFile, PLARGE_INTEGER lpFileSize);\nWINBASEAPI BOOL WINAPI SetFilePointerEx(HANDLE hFile, LARGE_INTEGER liDistanceToMove, PLARGE_INTEGER lpNewFilePointer, DWORD dwMoveMethod);\n#ifdef __cplusplus\n}\n#endif\nCFXCRT_FileAccess_Win64::CFXCRT_FileAccess_Win64()\n    : m_hFile(NULL)\n{\n}\nCFXCRT_FileAccess_Win64::~CFXCRT_FileAccess_Win64()\n{\n    Close();\n}\nFX_BOOL CFXCRT_FileAccess_Win64::Open(FX_BSTR fileName, FX_DWORD dwMode)\n{\n    if (m_hFile) {\n        return FALSE;\n    }\n    FX_DWORD dwAccess, dwShare, dwCreation;\n    FXCRT_Windows_GetFileMode(dwMode, dwAccess, dwShare, dwCreation);\n    m_hFile = ::CreateFileA(fileName.GetCStr(), dwAccess, dwShare, NULL, dwCreation, FILE_ATTRIBUTE_NORMAL, NULL);\n    if (m_hFile == INVALID_HANDLE_VALUE) {\n        m_hFile = NULL;\n    }\n    return m_hFile != NULL;\n}\nFX_BOOL CFXCRT_FileAccess_Win64::Open(FX_WSTR fileName, FX_DWORD dwMode)\n{\n    if (m_hFile) {\n        return FALSE;\n    }\n    FX_DWORD dwAccess, dwShare, dwCreation;\n    FXCRT_Windows_GetFileMode(dwMode, dwAccess, dwShare, dwCreation);\n    m_hFile = ::CreateFileW((LPCWSTR)fileName.GetPtr(), dwAccess, dwShare, NULL, dwCreation, FILE_ATTRIBUTE_NORMAL, NULL);\n    if (m_hFile == INVALID_HANDLE_VALUE) {\n        m_hFile = NULL;\n    }\n    return m_hFile != NULL;\n}\nvoid CFXCRT_FileAccess_Win64::Close()\n{\n    if (!m_hFile) {\n        return;\n    }\n    ::CloseHandle(m_hFile);\n    m_hFile = NULL;\n}\nvoid CFXCRT_FileAccess_Win64::Release()\n{\n    delete this;\n}\nFX_FILESIZE CFXCRT_FileAccess_Win64::GetSize() const\n{\n    if (!m_hFile) {\n        return 0;\n    }\n    LARGE_INTEGER size = {0, 0};\n    if (!::GetFileSizeEx(m_hFile, &size)) {\n        return 0;\n    }\n    return (FX_FILESIZE)size.QuadPart;\n}\nFX_FILESIZE CFXCRT_FileAccess_Win64::GetPosition() const\n{\n    if (!m_hFile) {\n        return (FX_FILESIZE) - 1;\n    }\n    LARGE_INTEGER dist = {0, 0};\n    LARGE_INTEGER newPos = {0, 0};\n    if (!::SetFilePointerEx(m_hFile, dist, &newPos, FILE_CURRENT)) {\n        return (FX_FILESIZE) - 1;\n    }\n    return (FX_FILESIZE)newPos.QuadPart;\n}\nFX_FILESIZE CFXCRT_FileAccess_Win64::SetPosition(FX_FILESIZE pos)\n{\n    if (!m_hFile) {\n        return (FX_FILESIZE) - 1;\n    }\n    LARGE_INTEGER dist;\n    dist.QuadPart = pos;\n    LARGE_INTEGER newPos = {0, 0};\n    if (!::SetFilePointerEx(m_hFile, dist, &newPos, FILE_BEGIN)) {\n        return (FX_FILESIZE) - 1;\n    }\n    return (FX_FILESIZE)newPos.QuadPart;\n}\nsize_t CFXCRT_FileAccess_Win64::Read(void* pBuffer, size_t szBuffer)\n{\n    if (!m_hFile) {\n        return 0;\n    }\n    size_t szRead = 0;\n    if (!::ReadFile(m_hFile, pBuffer, (DWORD)szBuffer, (LPDWORD)&szRead, NULL)) {\n        return 0;\n    }\n    return szRead;\n}\nsize_t CFXCRT_FileAccess_Win64::Write(const void* pBuffer, size_t szBuffer)\n{\n    if (!m_hFile) {\n        return 0;\n    }\n    size_t szWrite = 0;\n    if (!::WriteFile(m_hFile, pBuffer, (DWORD)szBuffer, (LPDWORD)&szWrite, NULL)) {\n        return 0;\n    }\n    return szWrite;\n}\nsize_t CFXCRT_FileAccess_Win64::ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos)\n{\n    if (!m_hFile) {\n        return 0;\n    }\n    if (pos >= GetSize()) {\n        return 0;\n    }\n    if (SetPosition(pos) == (FX_FILESIZE) - 1) {\n        return 0;\n    }\n    return Read(pBuffer, szBuffer);\n}\nsize_t CFXCRT_FileAccess_Win64::WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos)\n{\n    if (!m_hFile) {\n        return 0;\n    }\n    if (SetPosition(pos) == (FX_FILESIZE) - 1) {\n        return 0;\n    }\n    return Write(pBuffer, szBuffer);\n}\nFX_BOOL CFXCRT_FileAccess_Win64::Flush()\n{\n    if (!m_hFile) {\n        return FALSE;\n    }\n    return ::FlushFileBuffers(m_hFile);\n}\nFX_BOOL CFXCRT_FileAccess_Win64::Truncate(FX_FILESIZE szFile)\n{\n    if (SetPosition(szFile) == (FX_FILESIZE) - 1) {\n        return FALSE;\n    }\n    return ::SetEndOfFile(m_hFile);\n}\nFX_BOOL FX_File_Delete(FX_BSTR fileName)\n{\n    return ::DeleteFileA(fileName.GetCStr());\n}\nFX_BOOL FX_File_Delete(FX_WSTR fileName)\n{\n    return ::DeleteFileW((LPCWSTR)fileName.GetPtr());\n}\nFX_BOOL FX_File_Copy(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)\n{\n    return ::CopyFileA(fileNameSrc.GetCStr(), fileNameDst.GetCStr(), FALSE);\n}\nFX_BOOL FX_File_Copy(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)\n{\n    return ::CopyFileW((LPCWSTR)fileNameSrc.GetPtr(), (LPCWSTR)fileNameDst.GetPtr(), FALSE);\n}\nFX_BOOL FX_File_Move(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)\n{\n    return ::MoveFileA(fileNameSrc.GetCStr(), fileNameDst.GetCStr());\n}\nFX_BOOL FX_File_Move(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)\n{\n    return ::MoveFileW((LPCWSTR)fileNameSrc.GetPtr(), (LPCWSTR)fileNameDst.GetPtr());\n}\n#endif\n"
  },
  {
    "path": "core/src/fxcrt/fxcrt_windows.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXCRT_WINDOWS_\n#define _FXCRT_WINDOWS_\n#include \"extension.h\"\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\nclass CFXCRT_FileAccess_Win64 : public IFXCRT_FileAccess, public CFX_Object\n{\npublic:\n    CFXCRT_FileAccess_Win64();\n    virtual ~CFXCRT_FileAccess_Win64();\n    virtual FX_BOOL\t\tOpen(FX_BSTR fileName, FX_DWORD dwMode);\n    virtual FX_BOOL\t\tOpen(FX_WSTR fileName, FX_DWORD dwMode);\n    virtual void\t\tClose();\n    virtual void\t\tRelease();\n    virtual FX_FILESIZE\tGetSize() const;\n    virtual FX_FILESIZE\tGetPosition() const;\n    virtual FX_FILESIZE\tSetPosition(FX_FILESIZE pos);\n    virtual size_t\t\tRead(void* pBuffer, size_t szBuffer);\n    virtual size_t\t\tWrite(const void* pBuffer, size_t szBuffer);\n    virtual size_t\t\tReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos);\n    virtual size_t\t\tWritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos);\n    virtual FX_BOOL\t\tFlush();\n    virtual FX_BOOL\t\tTruncate(FX_FILESIZE szFile);\nprotected:\n    FX_LPVOID\tm_hFile;\n};\n#endif\n#endif\n"
  },
  {
    "path": "core/src/fxcrt/plex.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nstruct CFX_Plex {\n    CFX_Plex* pNext;\n    void* data()\n    {\n        return this + 1;\n    }\n    static CFX_Plex* Create(CFX_Plex*& head, FX_DWORD nMax, FX_DWORD cbElement);\n    void FreeDataChain();\n};\n"
  },
  {
    "path": "core/src/fxcrt/xml_int.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXCRT_XML_INT_\n#define _FXCRT_XML_INT_\nclass CXML_DataBufAcc : public IFX_BufferRead, public CFX_Object\n{\npublic:\n    CXML_DataBufAcc(FX_LPCBYTE pBuffer, size_t size)\n        : m_pBuffer(pBuffer)\n        , m_dwSize(size)\n        , m_dwCurPos(0)\n    {\n    }\n    virtual ~CXML_DataBufAcc() {}\n    virtual void\t\t\tRelease()\n    {\n        delete this;\n    }\n    virtual FX_BOOL\t\t\tIsEOF()\n    {\n        return m_dwCurPos >= m_dwSize;\n    }\n    virtual FX_FILESIZE\t\tGetPosition()\n    {\n        return (FX_FILESIZE)m_dwCurPos;\n    }\n    virtual size_t\t\t\tReadBlock(void* buffer, size_t size)\n    {\n        return 0;\n    }\n    virtual FX_BOOL\t\t\tReadNextBlock(FX_BOOL bRestart = FALSE)\n    {\n        if (bRestart) {\n            m_dwCurPos = 0;\n        }\n        if (m_dwCurPos < m_dwSize) {\n            m_dwCurPos = m_dwSize;\n            return TRUE;\n        }\n        return FALSE;\n    }\n    virtual FX_LPCBYTE\t\tGetBlockBuffer()\n    {\n        return m_pBuffer;\n    }\n    virtual size_t\t\t\tGetBlockSize()\n    {\n        return m_dwSize;\n    }\n    virtual FX_FILESIZE\t\tGetBlockOffset()\n    {\n        return 0;\n    }\nprotected:\n    FX_LPCBYTE\t\tm_pBuffer;\n    size_t\t\t\tm_dwSize;\n    size_t\t\t\tm_dwCurPos;\n};\n#define FX_XMLDATASTREAM_BufferSize\t\t(32 * 1024)\nclass CXML_DataStmAcc : public IFX_BufferRead, public CFX_Object\n{\npublic:\n    CXML_DataStmAcc(IFX_FileRead *pFileRead)\n        : m_pFileRead(pFileRead)\n        , m_pBuffer(NULL)\n        , m_nStart(0)\n        , m_dwSize(0)\n    {\n        FXSYS_assert(m_pFileRead != NULL);\n    }\n    virtual ~CXML_DataStmAcc()\n    {\n        if (m_pBuffer) {\n            FX_Free(m_pBuffer);\n        }\n    }\n    virtual void\t\t\tRelease()\n    {\n        delete this;\n    }\n    virtual FX_BOOL\t\t\tIsEOF()\n    {\n        return m_nStart + (FX_FILESIZE)m_dwSize >= m_pFileRead->GetSize();\n    }\n    virtual FX_FILESIZE\t\tGetPosition()\n    {\n        return m_nStart + (FX_FILESIZE)m_dwSize;\n    }\n    virtual size_t\t\t\tReadBlock(void* buffer, size_t size)\n    {\n        return 0;\n    }\n    virtual FX_BOOL\t\t\tReadNextBlock(FX_BOOL bRestart = FALSE)\n    {\n        if (bRestart) {\n            m_nStart = 0;\n        }\n        FX_FILESIZE nLength = m_pFileRead->GetSize();\n        m_nStart += (FX_FILESIZE)m_dwSize;\n        if (m_nStart >= nLength) {\n            return FALSE;\n        }\n        m_dwSize = (size_t)FX_MIN(FX_XMLDATASTREAM_BufferSize, nLength - m_nStart);\n        if (!m_pBuffer) {\n            m_pBuffer = FX_Alloc(FX_BYTE, m_dwSize);\n            if (!m_pBuffer) {\n                return FALSE;\n            }\n        }\n        return m_pFileRead->ReadBlock(m_pBuffer, m_nStart, m_dwSize);\n    }\n    virtual FX_LPCBYTE\t\tGetBlockBuffer()\n    {\n        return (FX_LPCBYTE)m_pBuffer;\n    }\n    virtual size_t\t\t\tGetBlockSize()\n    {\n        return m_dwSize;\n    }\n    virtual FX_FILESIZE\t\tGetBlockOffset()\n    {\n        return m_nStart;\n    }\nprotected:\n    IFX_FileRead\t*m_pFileRead;\n    FX_LPBYTE\t\tm_pBuffer;\n    FX_FILESIZE\t\tm_nStart;\n    size_t\t\t\tm_dwSize;\n};\nclass CXML_Parser\n{\npublic:\n    ~CXML_Parser();\n    IFX_BufferRead*\tm_pDataAcc;\n    FX_BOOL\t\t\tm_bOwnedStream;\n    FX_FILESIZE\t\tm_nOffset;\n    FX_BOOL\t\t\tm_bSaveSpaceChars;\n    FX_LPCBYTE\t\tm_pBuffer;\n    size_t\t\t\tm_dwBufferSize;\n    FX_FILESIZE\t\tm_nBufferOffset;\n    size_t\t\t\tm_dwIndex;\n    FX_BOOL\t\t\tInit(FX_LPBYTE pBuffer, size_t size);\n    FX_BOOL\t\t\tInit(IFX_FileRead *pFileRead);\n    FX_BOOL\t\t\tInit(IFX_BufferRead *pBuffer);\n    FX_BOOL\t\t\tInit(FX_BOOL bOwndedStream);\n    FX_BOOL\t\t\tReadNextBlock();\n    FX_BOOL\t\t\tIsEOF();\n    FX_BOOL\t\t\tHaveAvailData();\n    void\t\t\tSkipWhiteSpaces();\n    void\t\t\tGetName(CFX_ByteString& space, CFX_ByteString& name);\n    void\t\t\tGetAttrValue(CFX_WideString &value);\n    FX_DWORD\t\tGetCharRef();\n    void\t\t\tGetTagName(CFX_ByteString &space, CFX_ByteString &name, FX_BOOL &bEndTag, FX_BOOL bStartTag = FALSE);\n    void\t\t\tSkipLiterals(FX_BSTR str);\n    CXML_Element*\tParseElement(CXML_Element* pParent, FX_BOOL bStartTag = FALSE);\n    void\t\t\tInsertContentSegment(FX_BOOL bCDATA, FX_WSTR content, CXML_Element* pElement);\n    void\t\t\tInsertCDATASegment(CFX_UTF8Decoder& decoder, CXML_Element* pElement);\n};\nvoid FX_XML_SplitQualifiedName(FX_BSTR bsFullName, CFX_ByteStringC &bsSpace, CFX_ByteStringC &bsName);\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/agg_array.h",
    "content": "\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n#ifndef AGG_ARRAY_INCLUDED\n#define AGG_ARRAY_INCLUDED\n#include \"agg_basics.h\"\nnamespace agg\n{\ntemplate<class T> class pod_array : public CFX_Object\n{\npublic:\n    typedef T value_type;\n    ~pod_array()\n    {\n        FX_Free(m_array);\n    }\n    pod_array() : m_size(0), m_capacity(0), m_array(0) {}\n    pod_array(unsigned cap, unsigned extra_tail = 0);\n    pod_array(const pod_array<T>&);\n    const pod_array<T>& operator = (const pod_array<T>&);\n    void capacity(unsigned cap, unsigned extra_tail = 0);\n    unsigned capacity() const\n    {\n        return m_capacity;\n    }\n    void allocate(unsigned size, unsigned extra_tail = 0);\n    void resize(unsigned new_size);\n    void zero()\n    {\n        FXSYS_memset(m_array, 0, sizeof(T) * m_size);\n    }\n    void add(const T& v)\n    {\n        m_array[m_size++] = v;\n    }\n    void inc_size(unsigned size)\n    {\n        m_size += size;\n    }\n    unsigned size()      const\n    {\n        return m_size;\n    }\n    unsigned byte_size() const\n    {\n        return m_size * sizeof(T);\n    }\n    const T& operator [] (unsigned i) const\n    {\n        return m_array[i];\n    }\n    T& operator [] (unsigned i)\n    {\n        return m_array[i];\n    }\n    const T& at(unsigned i) const\n    {\n        return m_array[i];\n    }\n    T& at(unsigned i)\n    {\n        return m_array[i];\n    }\n    T  value_at(unsigned i) const\n    {\n        return m_array[i];\n    }\n    const T* data() const\n    {\n        return m_array;\n    }\n    T* data()\n    {\n        return m_array;\n    }\n    void remove_all()\n    {\n        m_size = 0;\n    }\n    void cut_at(unsigned num)\n    {\n        if(num < m_size) {\n            m_size = num;\n        }\n    }\nprivate:\n    unsigned m_size;\n    unsigned m_capacity;\n    T*       m_array;\n};\ntemplate<class T>\nvoid pod_array<T>::capacity(unsigned cap, unsigned extra_tail)\n{\n    m_size = 0;\n    unsigned full_cap = cap + extra_tail;\n    if(full_cap < cap) {\n        FX_Free(m_array);\n        m_array = 0;\n        m_capacity = 0;\n    } else if(full_cap > m_capacity) {\n        FX_Free(m_array);\n        m_array = 0;\n        m_capacity = 0;\n        m_array = FX_Alloc(T, full_cap);\n        if (m_array) {\n            m_capacity = full_cap;\n        }\n    }\n}\ntemplate<class T>\nvoid pod_array<T>::allocate(unsigned size, unsigned extra_tail)\n{\n    capacity(size, extra_tail);\n    m_size = size;\n}\ntemplate<class T>\nvoid pod_array<T>::resize(unsigned new_size)\n{\n    if(new_size > m_size) {\n        if(new_size > m_capacity) {\n            T* data = FX_Alloc(T, new_size);\n            FXSYS_memcpy(data, m_array, m_size * sizeof(T));\n            FX_Free(m_array);\n            m_array = data;\n        }\n    } else {\n        m_size = new_size;\n    }\n}\ntemplate<class T> pod_array<T>::pod_array(unsigned cap, unsigned extra_tail) :\n    m_size(0), m_capacity(cap + extra_tail), m_array(FX_Alloc(T, m_capacity)) {}\ntemplate<class T> pod_array<T>::pod_array(const pod_array<T>& v) :\n    m_size(v.m_size),\n    m_capacity(v.m_capacity),\n    m_array(v.m_capacity ? FX_Alloc(T, v.m_capacity) : 0)\n{\n    FXSYS_memcpy(m_array, v.m_array, sizeof(T) * v.m_size);\n}\ntemplate<class T> const pod_array<T>&\npod_array<T>::operator = (const pod_array<T>&v)\n{\n    allocate(v.m_size);\n    if(v.m_size) {\n        FXSYS_memcpy(m_array, v.m_array, sizeof(T) * v.m_size);\n    }\n    return *this;\n}\ntemplate<class T, unsigned S = 6> class pod_deque : public CFX_Object\n{\npublic:\n    enum block_scale_e {\n        block_shift = S,\n        block_size  = 1 << block_shift,\n        block_mask  = block_size - 1\n    };\n    typedef T value_type;\n    ~pod_deque();\n    pod_deque();\n    pod_deque(unsigned block_ptr_inc);\n    pod_deque(const pod_deque<T, S>& v);\n    const pod_deque<T, S>& operator = (const pod_deque<T, S>& v);\n    void remove_all()\n    {\n        m_size = 0;\n    }\n    void free_all()\n    {\n        free_tail(0);\n    }\n    void free_tail(unsigned size);\n    void add(const T& val);\n    void modify_last(const T& val);\n    void remove_last();\n    int allocate_continuous_block(unsigned num_elements);\n    void add_array(const T* ptr, unsigned num_elem)\n    {\n        while(num_elem--) {\n            add(*ptr++);\n        }\n    }\n    template<class DataAccessor> void add_data(DataAccessor& data)\n    {\n        while(data.size()) {\n            add(*data);\n            ++data;\n        }\n    }\n    void cut_at(unsigned size)\n    {\n        if(size < m_size) {\n            m_size = size;\n        }\n    }\n    unsigned size() const\n    {\n        return m_size;\n    }\n    const T& operator [] (unsigned i) const\n    {\n        return m_blocks[i >> block_shift][i & block_mask];\n    }\n    T& operator [] (unsigned i)\n    {\n        return m_blocks[i >> block_shift][i & block_mask];\n    }\n    const T& at(unsigned i) const\n    {\n        return m_blocks[i >> block_shift][i & block_mask];\n    }\n    T& at(unsigned i)\n    {\n        return m_blocks[i >> block_shift][i & block_mask];\n    }\n    T value_at(unsigned i) const\n    {\n        return m_blocks[i >> block_shift][i & block_mask];\n    }\n    const T& curr(unsigned idx) const\n    {\n        return (*this)[idx];\n    }\n    T& curr(unsigned idx)\n    {\n        return (*this)[idx];\n    }\n    const T& prev(unsigned idx) const\n    {\n        return (*this)[(idx + m_size - 1) % m_size];\n    }\n    T& prev(unsigned idx)\n    {\n        return (*this)[(idx + m_size - 1) % m_size];\n    }\n    const T& next(unsigned idx) const\n    {\n        return (*this)[(idx + 1) % m_size];\n    }\n    T& next(unsigned idx)\n    {\n        return (*this)[(idx + 1) % m_size];\n    }\n    const T& last() const\n    {\n        return (*this)[m_size - 1];\n    }\n    T& last()\n    {\n        return (*this)[m_size - 1];\n    }\n    unsigned byte_size() const;\n    const T* block(unsigned nb) const\n    {\n        return m_blocks[nb];\n    }\npublic:\n    void allocate_block(unsigned nb);\n    T*   data_ptr();\n    unsigned        m_size;\n    unsigned        m_num_blocks;\n    unsigned        m_max_blocks;\n    T**             m_blocks;\n    unsigned        m_block_ptr_inc;\n};\ntemplate<class T, unsigned S> pod_deque<T, S>::~pod_deque()\n{\n    if(m_num_blocks) {\n        T** blk = m_blocks + m_num_blocks - 1;\n        while(m_num_blocks--) {\n            FX_Free(*blk);\n            --blk;\n        }\n        FX_Free(m_blocks);\n    }\n}\ntemplate<class T, unsigned S>\nvoid pod_deque<T, S>::free_tail(unsigned size)\n{\n    if(size < m_size) {\n        unsigned nb = (size + block_mask) >> block_shift;\n        while(m_num_blocks > nb) {\n            FX_Free(m_blocks[--m_num_blocks]);\n        }\n        m_size = size;\n    }\n}\ntemplate<class T, unsigned S> pod_deque<T, S>::pod_deque() :\n    m_size(0),\n    m_num_blocks(0),\n    m_max_blocks(0),\n    m_blocks(0),\n    m_block_ptr_inc(block_size)\n{\n}\ntemplate<class T, unsigned S>\npod_deque<T, S>::pod_deque(unsigned block_ptr_inc) :\n    m_size(0),\n    m_num_blocks(0),\n    m_max_blocks(0),\n    m_blocks(0),\n    m_block_ptr_inc(block_ptr_inc)\n{\n}\ntemplate<class T, unsigned S>\npod_deque<T, S>::pod_deque(const pod_deque<T, S>& v) :\n    m_size(v.m_size),\n    m_num_blocks(v.m_num_blocks),\n    m_max_blocks(v.m_max_blocks),\n    m_blocks(v.m_max_blocks ? FX_Alloc(T*, v.m_max_blocks) : 0),\n    m_block_ptr_inc(v.m_block_ptr_inc)\n{\n    unsigned i;\n    for(i = 0; i < v.m_num_blocks; ++i) {\n        m_blocks[i] = FX_Alloc(T, block_size);\n        FXSYS_memcpy(m_blocks[i], v.m_blocks[i], block_size * sizeof(T));\n    }\n}\ntemplate<class T, unsigned S>\nconst pod_deque<T, S>& pod_deque<T, S>::operator = (const pod_deque<T, S>& v)\n{\n    unsigned i;\n    for(i = m_num_blocks; i < v.m_num_blocks; ++i) {\n        allocate_block(i);\n    }\n    for(i = 0; i < v.m_num_blocks; ++i) {\n        FXSYS_memcpy(m_blocks[i], v.m_blocks[i], block_size * sizeof(T));\n    }\n    m_size = v.m_size;\n    return *this;\n}\ntemplate<class T, unsigned S>\nvoid pod_deque<T, S>::allocate_block(unsigned nb)\n{\n    if(nb >= m_max_blocks) {\n        T** new_blocks = FX_Alloc(T*, m_max_blocks + m_block_ptr_inc);\n        if(m_blocks) {\n            FXSYS_memcpy(new_blocks,\n                         m_blocks,\n                         m_num_blocks * sizeof(T*));\n            FX_Free(m_blocks);\n        }\n        m_blocks = new_blocks;\n        m_max_blocks += m_block_ptr_inc;\n    }\n    m_blocks[nb] = FX_Alloc(T, block_size);\n    m_num_blocks++;\n}\ntemplate<class T, unsigned S>\ninline T* pod_deque<T, S>::data_ptr()\n{\n    unsigned nb = m_size >> block_shift;\n    if(nb >= m_num_blocks) {\n        allocate_block(nb);\n    }\n    return m_blocks[nb] + (m_size & block_mask);\n}\ntemplate<class T, unsigned S>\ninline void pod_deque<T, S>::add(const T& val)\n{\n    *data_ptr() = val;\n    ++m_size;\n}\ntemplate<class T, unsigned S>\ninline void pod_deque<T, S>::remove_last()\n{\n    if(m_size) {\n        --m_size;\n    }\n}\ntemplate<class T, unsigned S>\nvoid pod_deque<T, S>::modify_last(const T& val)\n{\n    remove_last();\n    add(val);\n}\ntemplate<class T, unsigned S>\nint pod_deque<T, S>::allocate_continuous_block(unsigned num_elements)\n{\n    if(num_elements < block_size) {\n        data_ptr();\n        unsigned rest = block_size - (m_size & block_mask);\n        unsigned index;\n        if(num_elements <= rest) {\n            index = m_size;\n            m_size += num_elements;\n            return index;\n        }\n        m_size += rest;\n        data_ptr();\n        index = m_size;\n        m_size += num_elements;\n        return index;\n    }\n    return -1;\n}\ntemplate<class T, unsigned S>\nunsigned pod_deque<T, S>::byte_size() const\n{\n    return m_size * sizeof(T);\n}\nclass pod_allocator : public CFX_Object\n{\npublic:\n    void remove_all()\n    {\n        if(m_num_blocks) {\n            int8u** blk = m_blocks + m_num_blocks - 1;\n            while(m_num_blocks--) {\n                FX_Free(*blk);\n                --blk;\n            }\n            FX_Free(m_blocks);\n        }\n        m_num_blocks = 0;\n        m_max_blocks = 0;\n        m_blocks = 0;\n        m_buf_ptr = 0;\n        m_rest = 0;\n    }\n    ~pod_allocator()\n    {\n        remove_all();\n    }\n    pod_allocator(unsigned block_size, unsigned block_ptr_inc = 256 - 8) :\n        m_block_size(block_size),\n        m_block_ptr_inc(block_ptr_inc),\n        m_num_blocks(0),\n        m_max_blocks(0),\n        m_blocks(0),\n        m_buf_ptr(0),\n        m_rest(0)\n    {\n    }\n    int8u* allocate(unsigned size, unsigned alignment = 1)\n    {\n        if(size == 0) {\n            return 0;\n        }\n        if(size <= m_rest) {\n            int8u* ptr = m_buf_ptr;\n            if(alignment > 1) {\n                unsigned align = (alignment - unsigned((size_t)ptr) % alignment) % alignment;\n                size += align;\n                ptr += align;\n                if(size <= m_rest) {\n                    m_rest -= size;\n                    m_buf_ptr += size;\n                    return ptr;\n                }\n                allocate_block(size);\n                return allocate(size - align, alignment);\n            }\n            m_rest -= size;\n            m_buf_ptr += size;\n            return ptr;\n        }\n        allocate_block(size + alignment - 1);\n        return allocate(size, alignment);\n    }\nprivate:\n    void allocate_block(unsigned size)\n    {\n        if(size < m_block_size) {\n            size = m_block_size;\n        }\n        if(m_num_blocks >= m_max_blocks) {\n            int8u** new_blocks = FX_Alloc(int8u*, m_max_blocks + m_block_ptr_inc);\n            if(m_blocks) {\n                FXSYS_memcpy(new_blocks,\n                             m_blocks,\n                             m_num_blocks * sizeof(int8u*));\n                FX_Free(m_blocks);\n            }\n            m_blocks = new_blocks;\n            m_max_blocks += m_block_ptr_inc;\n        }\n        m_blocks[m_num_blocks] = m_buf_ptr = FX_Alloc(int8u, size);\n        m_num_blocks++;\n        m_rest = size;\n    }\n    unsigned m_block_size;\n    unsigned m_block_ptr_inc;\n    unsigned m_num_blocks;\n    unsigned m_max_blocks;\n    int8u**  m_blocks;\n    int8u*   m_buf_ptr;\n    unsigned m_rest;\n};\nenum quick_sort_threshold_e {\n    quick_sort_threshold = 9\n};\ntemplate<class T> inline void swap_elements(T& a, T& b)\n{\n    T temp = a;\n    a = b;\n    b = temp;\n}\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/agg_basics.h",
    "content": "\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n#ifndef AGG_BASICS_INCLUDED\n#define AGG_BASICS_INCLUDED\n#ifndef AGG_INT8\n#define AGG_INT8 signed char\n#endif\n#ifndef AGG_INT8U\n#define AGG_INT8U unsigned char\n#endif\n#ifndef AGG_INT16\n#define AGG_INT16 short\n#endif\n#ifndef AGG_INT16U\n#define AGG_INT16U unsigned short\n#endif\n#ifndef AGG_INT32\n#define AGG_INT32 int\n#endif\n#ifndef AGG_INT32U\n#define AGG_INT32U unsigned\n#endif\n#ifndef AGG_INT64\n#define AGG_INT64 signed long long\n#endif\n#ifndef AGG_INT64U\n#define AGG_INT64U unsigned long long\n#endif\n#define AGG_INLINE inline\nnamespace agg\n{\ntypedef AGG_INT8   int8;\ntypedef AGG_INT8U  int8u;\ntypedef AGG_INT16  int16;\ntypedef AGG_INT16U int16u;\ntypedef AGG_INT32  int32;\ntypedef AGG_INT32U int32u;\ntypedef AGG_INT64  int64;\ntypedef AGG_INT64U int64u;\ntypedef unsigned char cover_type;\nenum cover_scale_e {\n    cover_shift = 8,\n    cover_size  = 1 << cover_shift,\n    cover_mask  = cover_size - 1,\n    cover_none  = 0,\n    cover_full  = cover_mask\n};\ntemplate<class T> struct rect_base : public CFX_Object {\n    typedef rect_base<T> self_type;\n    T x1;\n    T y1;\n    T x2;\n    T y2;\n    rect_base() {}\n    rect_base(T x1_, T y1_, T x2_, T y2_) :\n        x1(x1_), y1(y1_), x2(x2_), y2(y2_) {}\n    const self_type& normalize()\n    {\n        T t;\n        if(x1 > x2) {\n            t = x1;\n            x1 = x2;\n            x2 = t;\n        }\n        if(y1 > y2) {\n            t = y1;\n            y1 = y2;\n            y2 = t;\n        }\n        return *this;\n    }\n    bool clip(const self_type& r)\n    {\n        if(x2 > r.x2) {\n            x2 = r.x2;\n        }\n        if(y2 > r.y2) {\n            y2 = r.y2;\n        }\n        if(x1 < r.x1) {\n            x1 = r.x1;\n        }\n        if(y1 < r.y1) {\n            y1 = r.y1;\n        }\n        return x1 <= x2 && y1 <= y2;\n    }\n    bool is_valid() const\n    {\n        return x1 <= x2 && y1 <= y2;\n    }\n};\ntemplate<class Rect>\ninline Rect intersect_rectangles(const Rect& r1, const Rect& r2)\n{\n    Rect r = r1;\n    if(r.x2 > r2.x2) {\n        r.x2 = r2.x2;\n    }\n    if(r.y2 > r2.y2) {\n        r.y2 = r2.y2;\n    }\n    if(r.x1 < r2.x1) {\n        r.x1 = r2.x1;\n    }\n    if(r.y1 < r2.y1) {\n        r.y1 = r2.y1;\n    }\n    return r;\n}\ntemplate<class Rect>\ninline Rect unite_rectangles(const Rect& r1, const Rect& r2)\n{\n    Rect r = r1;\n    if(r.x2 < r2.x2) {\n        r.x2 = r2.x2;\n    }\n    if(r.y2 < r2.y2) {\n        r.y2 = r2.y2;\n    }\n    if(r.x1 > r2.x1) {\n        r.x1 = r2.x1;\n    }\n    if(r.y1 > r2.y1) {\n        r.y1 = r2.y1;\n    }\n    return r;\n}\ntypedef rect_base<int>    rect;\ntypedef rect_base<FX_FLOAT> rect_d;\nenum path_commands_e {\n    path_cmd_stop     = 0,\n    path_cmd_move_to  = 1,\n    path_cmd_line_to  = 2,\n    path_cmd_curve3   = 3,\n    path_cmd_curve4   = 4,\n    path_cmd_curveN   = 5,\n    path_cmd_catrom   = 6,\n    path_cmd_ubspline = 7,\n    path_cmd_end_poly = 0x0F,\n    path_cmd_mask     = 0x0F\n};\nenum path_flags_e {\n    path_flags_none  = 0,\n    path_flags_ccw   = 0x10,\n    path_flags_cw    = 0x20,\n    path_flags_close = 0x40,\n    path_flags_jr\t = 0x80,\n    path_flags_mask  = 0xF0\n};\ninline bool is_vertex(unsigned c)\n{\n    c &= ~path_flags_jr;\n    return c >= path_cmd_move_to && c < path_cmd_end_poly;\n}\ninline bool is_drawing(unsigned c)\n{\n    c &= ~path_flags_jr;\n    return c >= path_cmd_line_to && c < path_cmd_end_poly;\n}\ninline bool is_stop(unsigned c)\n{\n    c &= ~path_flags_jr;\n    return c == path_cmd_stop;\n}\ninline bool is_move_to(unsigned c)\n{\n    c &= ~path_flags_jr;\n    return c == path_cmd_move_to;\n}\ninline bool is_line_to(unsigned c)\n{\n    c &= ~path_flags_jr;\n    return c == path_cmd_line_to;\n}\ninline bool is_curve(unsigned c)\n{\n    c &= ~path_flags_jr;\n    return c == path_cmd_curve3 || c == path_cmd_curve4;\n}\ninline bool is_curve3(unsigned c)\n{\n    c &= ~path_flags_jr;\n    return c == path_cmd_curve3;\n}\ninline bool is_curve4(unsigned c)\n{\n    c &= ~path_flags_jr;\n    return c == path_cmd_curve4;\n}\ninline bool is_end_poly(unsigned c)\n{\n    c &= ~path_flags_jr;\n    return (c & path_cmd_mask) == path_cmd_end_poly;\n}\ninline bool is_close(unsigned c)\n{\n    c &= ~path_flags_jr;\n    return (c & ~(path_flags_cw | path_flags_ccw)) ==\n           (path_cmd_end_poly | path_flags_close);\n}\ninline bool is_next_poly(unsigned c)\n{\n    c &= ~path_flags_jr;\n    return is_stop(c) || is_move_to(c) || is_end_poly(c);\n}\ninline bool is_cw(unsigned c)\n{\n    c &= ~path_flags_jr;\n    return (c & path_flags_cw) != 0;\n}\ninline bool is_ccw(unsigned c)\n{\n    c &= ~path_flags_jr;\n    return (c & path_flags_ccw) != 0;\n}\ninline bool is_oriented(unsigned c)\n{\n    c &= ~path_flags_jr;\n    return (c & (path_flags_cw | path_flags_ccw)) != 0;\n}\ninline bool is_closed(unsigned c)\n{\n    c &= ~path_flags_jr;\n    return (c & path_flags_close) != 0;\n}\ninline unsigned get_close_flag(unsigned c)\n{\n    c &= ~path_flags_jr;\n    return c & path_flags_close;\n}\ninline unsigned clear_orientation(unsigned c)\n{\n    c &= ~path_flags_jr;\n    return c & ~(path_flags_cw | path_flags_ccw);\n}\ninline unsigned get_orientation(unsigned c)\n{\n    c &= ~path_flags_jr;\n    return c & (path_flags_cw | path_flags_ccw);\n}\ninline unsigned set_orientation(unsigned c, unsigned o)\n{\n    c &= ~path_flags_jr;\n    return clear_orientation(c) | o;\n}\nstruct point_type : public CFX_Object {\n    FX_FLOAT x, y;\n    unsigned flag;\n    point_type() {}\n    point_type(FX_FLOAT x_, FX_FLOAT y_, unsigned flag_ = 0) : x(x_), y(y_), flag(flag_) {}\n};\nstruct point_type_flag : public point_type {\n    unsigned flag;\n    point_type_flag()\n    {\n        flag = 0;\n    }\n    point_type_flag(FX_FLOAT x_, FX_FLOAT y_, unsigned flag_ = 0) : point_type(x_, y_), flag(flag_) {}\n};\nstruct vertex_type : public CFX_Object {\n    FX_FLOAT   x, y;\n    unsigned cmd;\n    vertex_type() {}\n    vertex_type(FX_FLOAT x_, FX_FLOAT y_, unsigned cmd_) :\n        x(x_), y(y_), cmd(cmd_) {}\n};\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/agg_clip_liang_barsky.h",
    "content": "\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n//\n// Liang-Barsky clipping\n//\n//----------------------------------------------------------------------------\n#ifndef AGG_CLIP_LIANG_BARSKY_INCLUDED\n#define AGG_CLIP_LIANG_BARSKY_INCLUDED\n#include \"agg_basics.h\"\nnamespace agg\n{\ntemplate<class T>\ninline unsigned clipping_flags(T x, T y, const rect_base<T>& clip_box)\n{\n    return  (x > clip_box.x2) |\n            ((y > clip_box.y2) << 1) |\n            ((x < clip_box.x1) << 2) |\n            ((y < clip_box.y1) << 3);\n}\ntemplate<class T>\ninline unsigned clip_liang_barsky(T x1, T y1, T x2, T y2,\n                                  const rect_base<T>& clip_box,\n                                  T* x, T* y)\n{\n    const FX_FLOAT nearzero = 1e-30f;\n    FX_FLOAT deltax = (FX_FLOAT)(x2 - x1);\n    FX_FLOAT deltay = (FX_FLOAT)(y2 - y1);\n    unsigned np = 0;\n    if(deltax == 0) {\n        deltax = (x1 > clip_box.x1) ? -nearzero : nearzero;\n    }\n    FX_FLOAT xin, xout;\n    if(deltax > 0) {\n        xin  = (FX_FLOAT)clip_box.x1;\n        xout = (FX_FLOAT)clip_box.x2;\n    } else {\n        xin  = (FX_FLOAT)clip_box.x2;\n        xout = (FX_FLOAT)clip_box.x1;\n    }\n    FX_FLOAT tinx = FXSYS_Div(xin - x1, deltax);\n    if(deltay == 0) {\n        deltay = (y1 > clip_box.y1) ? -nearzero : nearzero;\n    }\n    FX_FLOAT yin, yout;\n    if(deltay > 0) {\n        yin  = (FX_FLOAT)clip_box.y1;\n        yout = (FX_FLOAT)clip_box.y2;\n    } else {\n        yin  = (FX_FLOAT)clip_box.y2;\n        yout = (FX_FLOAT)clip_box.y1;\n    }\n    FX_FLOAT tiny = FXSYS_Div(yin - y1, deltay);\n    FX_FLOAT tin1, tin2;\n    if (tinx < tiny) {\n        tin1 = tinx;\n        tin2 = tiny;\n    } else {\n        tin1 = tiny;\n        tin2 = tinx;\n    }\n    if(tin1 <= 1.0f) {\n        if(0 < tin1) {\n            *x++ = (T)xin;\n            *y++ = (T)yin;\n            ++np;\n        }\n        if(tin2 <= 1.0f) {\n            FX_FLOAT toutx = FXSYS_Div(xout - x1, deltax);\n            FX_FLOAT touty = FXSYS_Div(yout - y1, deltay);\n            FX_FLOAT tout1 = (toutx < touty) ? toutx : touty;\n            if(tin2 > 0 || tout1 > 0) {\n                if(tin2 <= tout1) {\n                    if(tin2 > 0) {\n                        if(tinx > tiny) {\n                            *x++ = (T)xin;\n                            *y++ = (T)(y1 + FXSYS_Mul(deltay, tinx));\n                        } else {\n                            *x++ = (T)(x1 + FXSYS_Mul(deltax, tiny));\n                            *y++ = (T)yin;\n                        }\n                        ++np;\n                    }\n                    if(tout1 < 1.0f) {\n                        if(toutx < touty) {\n                            *x++ = (T)xout;\n                            *y++ = (T)(y1 + FXSYS_Mul(deltay, toutx));\n                        } else {\n                            *x++ = (T)(x1 + FXSYS_Mul(deltax, touty));\n                            *y++ = (T)yout;\n                        }\n                    } else {\n                        *x++ = x2;\n                        *y++ = y2;\n                    }\n                    ++np;\n                } else {\n                    if(tinx > tiny) {\n                        *x++ = (T)xin;\n                        *y++ = (T)yout;\n                    } else {\n                        *x++ = (T)xout;\n                        *y++ = (T)yin;\n                    }\n                    ++np;\n                }\n            }\n        }\n    }\n    return np;\n}\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/agg_color_gray.h",
    "content": "\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n//\n// Adaptation for high precision colors has been sponsored by\n// Liberty Technology Systems, Inc., visit http://lib-sys.com\n//\n// Liberty Technology Systems, Inc. is the provider of\n// PostScript and PDF technology for software developers.\n//\n//----------------------------------------------------------------------------\n//\n// color types gray8, gray16\n//\n//----------------------------------------------------------------------------\n#ifndef AGG_COLOR_GRAY_INCLUDED\n#define AGG_COLOR_GRAY_INCLUDED\n#include \"agg_basics.h\"\nnamespace agg\n{\nstruct gray8 {\n    typedef int8u  value_type;\n    typedef int32u calc_type;\n    typedef int32  long_type;\n    enum base_scale_e {\n        base_shift = 8,\n        base_size  = 1 << base_shift,\n        base_mask  = base_size - 1\n    };\n    typedef gray8 self_type;\n    value_type v;\n    value_type a;\n    gray8() {}\n    gray8(unsigned v_, unsigned a_ = base_mask) :\n        v(int8u(v_)), a(int8u(a_)) {}\n};\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/agg_conv_adaptor_vcgen.h",
    "content": "\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n#ifndef AGG_CONV_ADAPTOR_VCGEN_INCLUDED\n#define AGG_CONV_ADAPTOR_VCGEN_INCLUDED\n#include \"agg_basics.h\"\nnamespace agg\n{\nstruct null_markers : public CFX_Object {\n    void remove_all() {}\n    void add_vertex(FX_FLOAT, FX_FLOAT, unsigned) {}\n    void prepare_src() {}\n    void rewind(unsigned) {}\n    unsigned vertex(FX_FLOAT*, FX_FLOAT*)\n    {\n        return path_cmd_stop;\n    }\n};\ntemplate<class VertexSource,\n         class Generator,\n         class Markers = null_markers> class conv_adaptor_vcgen : public CFX_Object\n{\n    enum status {\n        initial,\n        accumulate,\n        generate\n    };\npublic:\n    conv_adaptor_vcgen(VertexSource& source) :\n        m_source(&source),\n        m_status(initial)\n    {}\n    void set_source(VertexSource& source)\n    {\n        m_source = &source;\n    }\n    Generator& generator()\n    {\n        return m_generator;\n    }\n    const Generator& generator() const\n    {\n        return m_generator;\n    }\n    Markers& markers()\n    {\n        return m_markers;\n    }\n    const Markers& markers() const\n    {\n        return m_markers;\n    }\n    void rewind(unsigned path_id)\n    {\n        m_source->rewind(path_id);\n        m_status = initial;\n    }\n    unsigned vertex(FX_FLOAT* x, FX_FLOAT* y);\nprivate:\n    conv_adaptor_vcgen(const conv_adaptor_vcgen<VertexSource, Generator, Markers>&);\n    const conv_adaptor_vcgen<VertexSource, Generator, Markers>&\n    operator = (const conv_adaptor_vcgen<VertexSource, Generator, Markers>&);\n    VertexSource* m_source;\n    Generator     m_generator;\n    Markers       m_markers;\n    status        m_status;\n    unsigned      m_last_cmd;\n    FX_FLOAT        m_start_x;\n    FX_FLOAT        m_start_y;\n};\ntemplate<class VertexSource, class Generator, class Markers>\nunsigned conv_adaptor_vcgen<VertexSource, Generator, Markers>::vertex(FX_FLOAT* x, FX_FLOAT* y)\n{\n    unsigned cmd = path_cmd_stop;\n    bool done = false;\n    while(!done) {\n        switch(m_status) {\n            case initial:\n                m_markers.remove_all();\n                m_last_cmd = m_source->vertex(&m_start_x, &m_start_y);\n                m_status = accumulate;\n            case accumulate:\n                if(is_stop(m_last_cmd)) {\n                    return path_cmd_stop;\n                }\n                m_generator.remove_all();\n                m_generator.add_vertex(m_start_x, m_start_y, path_cmd_move_to);\n                m_markers.add_vertex(m_start_x, m_start_y, path_cmd_move_to);\n                for(;;) {\n                    cmd = m_source->vertex(x, y);\n                    if(is_vertex(cmd)) {\n                        m_last_cmd = cmd;\n                        if(is_move_to(cmd)) {\n                            m_start_x = *x;\n                            m_start_y = *y;\n                            break;\n                        }\n                        m_generator.add_vertex(*x, *y, cmd);\n                        m_markers.add_vertex(*x, *y, path_cmd_line_to);\n                    } else {\n                        if(is_stop(cmd)) {\n                            m_last_cmd = path_cmd_stop;\n                            break;\n                        }\n                        if(is_end_poly(cmd)) {\n                            m_generator.add_vertex(*x, *y, cmd);\n                            break;\n                        }\n                    }\n                }\n                m_generator.rewind(0);\n                m_status = generate;\n            case generate:\n                cmd = m_generator.vertex(x, y);\n                if(is_stop(cmd)) {\n                    m_status = accumulate;\n                    break;\n                }\n                done = true;\n                break;\n        }\n    }\n    return cmd;\n}\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/agg_conv_dash.h",
    "content": "\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n//\n// conv_dash\n//\n//----------------------------------------------------------------------------\n#ifndef AGG_CONV_DASH_INCLUDED\n#define AGG_CONV_DASH_INCLUDED\n#include \"agg_basics.h\"\n#include \"agg_vcgen_dash.h\"\n#include \"agg_conv_adaptor_vcgen.h\"\nnamespace agg\n{\ntemplate<class VertexSource, class Markers = null_markers>\nstruct conv_dash : public conv_adaptor_vcgen<VertexSource, vcgen_dash, Markers> {\n    typedef Markers marker_type;\n    typedef conv_adaptor_vcgen<VertexSource, vcgen_dash, Markers> base_type;\n    conv_dash(VertexSource& vs) :\n        conv_adaptor_vcgen<VertexSource, vcgen_dash, Markers>(vs)\n    {\n    }\n    void remove_all_dashes()\n    {\n        base_type::generator().remove_all_dashes();\n    }\n    void add_dash(FX_FLOAT dash_len, FX_FLOAT gap_len)\n    {\n        base_type::generator().add_dash(dash_len, gap_len);\n    }\n    void dash_start(FX_FLOAT ds)\n    {\n        base_type::generator().dash_start(ds);\n    }\n    void shorten(FX_FLOAT s)\n    {\n        base_type::generator().shorten(s);\n    }\n    double shorten() const\n    {\n        return base_type::generator().shorten();\n    }\nprivate:\n    conv_dash(const conv_dash<VertexSource, Markers>&);\n    const conv_dash<VertexSource, Markers>&\n    operator = (const conv_dash<VertexSource, Markers>&);\n};\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/agg_conv_stroke.h",
    "content": "\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n//\n// conv_stroke\n//\n//----------------------------------------------------------------------------\n#ifndef AGG_CONV_STROKE_INCLUDED\n#define AGG_CONV_STROKE_INCLUDED\n#include \"agg_basics.h\"\n#include \"agg_vcgen_stroke.h\"\n#include \"agg_conv_adaptor_vcgen.h\"\nnamespace agg\n{\ntemplate<class VertexSource, class Markers = null_markers>\nstruct conv_stroke :\n        public conv_adaptor_vcgen<VertexSource, vcgen_stroke, Markers> {\n    typedef Markers marker_type;\n    typedef conv_adaptor_vcgen<VertexSource, vcgen_stroke, Markers> base_type;\n    conv_stroke(VertexSource& vs) :\n        conv_adaptor_vcgen<VertexSource, vcgen_stroke, Markers>(vs)\n    {\n    }\n    void line_cap(line_cap_e lc)\n    {\n        base_type::generator().line_cap(lc);\n    }\n    void line_join(line_join_e lj)\n    {\n        base_type::generator().line_join(lj);\n    }\n    void inner_join(inner_join_e ij)\n    {\n        base_type::generator().inner_join(ij);\n    }\n    line_cap_e   line_cap()   const\n    {\n        return base_type::generator().line_cap();\n    }\n    line_join_e  line_join()  const\n    {\n        return base_type::generator().line_join();\n    }\n    inner_join_e inner_join() const\n    {\n        return base_type::generator().inner_join();\n    }\n    void width(FX_FLOAT w)\n    {\n        base_type::generator().width(w);\n    }\n    void miter_limit(FX_FLOAT ml)\n    {\n        base_type::generator().miter_limit(ml);\n    }\n    void miter_limit_theta(FX_FLOAT t)\n    {\n        base_type::generator().miter_limit_theta(t);\n    }\n    void inner_miter_limit(FX_FLOAT ml)\n    {\n        base_type::generator().inner_miter_limit(ml);\n    }\n    void approximation_scale(FX_FLOAT as)\n    {\n        base_type::generator().approximation_scale(as);\n    }\n    FX_FLOAT width() const\n    {\n        return base_type::generator().width();\n    }\n    FX_FLOAT miter_limit() const\n    {\n        return base_type::generator().miter_limit();\n    }\n    FX_FLOAT inner_miter_limit() const\n    {\n        return base_type::generator().inner_miter_limit();\n    }\n    FX_FLOAT approximation_scale() const\n    {\n        return base_type::generator().approximation_scale();\n    }\n    void shorten(FX_FLOAT s)\n    {\n        base_type::generator().shorten(s);\n    }\n    FX_FLOAT shorten() const\n    {\n        return base_type::generator().shorten();\n    }\nprivate:\n    conv_stroke(const conv_stroke<VertexSource, Markers>&);\n    const conv_stroke<VertexSource, Markers>&\n    operator = (const conv_stroke<VertexSource, Markers>&);\n};\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/agg_curves.h",
    "content": "\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n// Copyright (C) 2005 Tony Juricic (tonygeek@yahoo.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n#ifndef AGG_CURVES_INCLUDED\n#define AGG_CURVES_INCLUDED\n#include \"agg_array.h\"\nnamespace agg\n{\nstruct curve4_points : public CFX_Object {\n    FX_FLOAT cp[8];\n    curve4_points() {}\n    curve4_points(FX_FLOAT x1, FX_FLOAT y1,\n                  FX_FLOAT x2, FX_FLOAT y2,\n                  FX_FLOAT x3, FX_FLOAT y3,\n                  FX_FLOAT x4, FX_FLOAT y4)\n    {\n        cp[0] = x1;\n        cp[1] = y1;\n        cp[2] = x2;\n        cp[3] = y2;\n        cp[4] = x3;\n        cp[5] = y3;\n        cp[6] = x4;\n        cp[7] = y4;\n    }\n    void init(FX_FLOAT x1, FX_FLOAT y1,\n              FX_FLOAT x2, FX_FLOAT y2,\n              FX_FLOAT x3, FX_FLOAT y3,\n              FX_FLOAT x4, FX_FLOAT y4)\n    {\n        cp[0] = x1;\n        cp[1] = y1;\n        cp[2] = x2;\n        cp[3] = y2;\n        cp[4] = x3;\n        cp[5] = y3;\n        cp[6] = x4;\n        cp[7] = y4;\n    }\n    FX_FLOAT  operator [] (unsigned i) const\n    {\n        return cp[i];\n    }\n    FX_FLOAT& operator [] (unsigned i)\n    {\n        return cp[i];\n    }\n};\nclass curve4_div : public CFX_Object\n{\npublic:\n    curve4_div() :\n        m_cusp_limit(0),\n        m_count(0)\n    {}\n    curve4_div(FX_FLOAT x1, FX_FLOAT y1,\n               FX_FLOAT x2, FX_FLOAT y2,\n               FX_FLOAT x3, FX_FLOAT y3,\n               FX_FLOAT x4, FX_FLOAT y4) :\n        m_cusp_limit(0),\n        m_count(0)\n    {\n        init(x1, y1, x2, y2, x3, y3, x4, y4);\n    }\n    curve4_div(const curve4_points& cp) :\n        m_count(0)\n    {\n        init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);\n    }\n    void reset()\n    {\n        m_points.remove_all();\n        m_count = 0;\n    }\n    void init(FX_FLOAT x1, FX_FLOAT y1,\n              FX_FLOAT x2, FX_FLOAT y2,\n              FX_FLOAT x3, FX_FLOAT y3,\n              FX_FLOAT x4, FX_FLOAT y4);\n    void init(const curve4_points& cp)\n    {\n        init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);\n    }\n    void rewind(unsigned)\n    {\n        m_count = 0;\n    }\n    unsigned vertex(FX_FLOAT* x, FX_FLOAT* y)\n    {\n        if(m_count >= m_points.size()) {\n            return path_cmd_stop;\n        }\n        const point_type& p = m_points[m_count++];\n        *x = p.x;\n        *y = p.y;\n        return (m_count == 1) ? path_cmd_move_to : path_cmd_line_to;\n    }\n    unsigned vertex_flag(FX_FLOAT* x, FX_FLOAT* y, int& flag)\n    {\n        if(m_count >= m_points.size()) {\n            return path_cmd_stop;\n        }\n        const point_type& p = m_points[m_count++];\n        *x = p.x;\n        *y = p.y;\n        flag = p.flag;\n        return (m_count == 1) ? path_cmd_move_to : path_cmd_line_to;\n    }\n    int count()\n    {\n        return m_points.size();\n    }\nprivate:\n    void bezier(FX_FLOAT x1, FX_FLOAT y1,\n                FX_FLOAT x2, FX_FLOAT y2,\n                FX_FLOAT x3, FX_FLOAT y3,\n                FX_FLOAT x4, FX_FLOAT y4);\n    void recursive_bezier(FX_FLOAT x1, FX_FLOAT y1,\n                          FX_FLOAT x2, FX_FLOAT y2,\n                          FX_FLOAT x3, FX_FLOAT y3,\n                          FX_FLOAT x4, FX_FLOAT y4,\n                          unsigned level);\n    FX_FLOAT    m_distance_tolerance_square;\n    FX_FLOAT    m_distance_tolerance_manhattan;\n    FX_FLOAT    m_cusp_limit;\n    unsigned              m_count;\n    pod_deque<point_type> m_points;\n};\nclass curve4 : public CFX_Object\n{\npublic:\n    curve4() {}\n    curve4(FX_FLOAT x1, FX_FLOAT y1,\n           FX_FLOAT x2, FX_FLOAT y2,\n           FX_FLOAT x3, FX_FLOAT y3,\n           FX_FLOAT x4, FX_FLOAT y4)\n    {\n        init(x1, y1, x2, y2, x3, y3, x4, y4);\n    }\n    curve4(const curve4_points& cp)\n    {\n        init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);\n    }\n    void reset()\n    {\n        m_curve_div.reset();\n    }\n    void init(FX_FLOAT x1, FX_FLOAT y1,\n              FX_FLOAT x2, FX_FLOAT y2,\n              FX_FLOAT x3, FX_FLOAT y3,\n              FX_FLOAT x4, FX_FLOAT y4)\n    {\n        m_curve_div.init(x1, y1, x2, y2, x3, y3, x4, y4);\n    }\n    void init(const curve4_points& cp)\n    {\n        init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);\n    }\n    void rewind(unsigned path_id)\n    {\n        m_curve_div.rewind(path_id);\n    }\n    unsigned vertex(FX_FLOAT* x, FX_FLOAT* y)\n    {\n        return m_curve_div.vertex(x, y);\n    }\n    unsigned vertex_curve_flag(FX_FLOAT* x, FX_FLOAT* y, int& flag)\n    {\n        return m_curve_div.vertex_flag(x, y, flag);\n    }\n    int count()\n    {\n        return m_curve_div.count();\n    }\nprivate:\n    curve4_div m_curve_div;\n};\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/agg_math.h",
    "content": "\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n// Bessel function (besj) was adapted for use in AGG library by Andy Wilk\n// Contact: castor.vulgaris@gmail.com\n//----------------------------------------------------------------------------\n#ifndef AGG_MATH_INCLUDED\n#define AGG_MATH_INCLUDED\n#include \"agg_basics.h\"\nnamespace agg\n{\nconst FX_FLOAT intersection_epsilon = 1.0e-30f;\nAGG_INLINE FX_FLOAT calc_point_location(FX_FLOAT x1, FX_FLOAT y1,\n                                        FX_FLOAT x2, FX_FLOAT y2,\n                                        FX_FLOAT x,  FX_FLOAT y)\n{\n    return FXSYS_Mul(x - x2, y2 - y1) - FXSYS_Mul(y - y2, x2 - x1);\n}\nAGG_INLINE FX_FLOAT calc_distance(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2)\n{\n    FX_FLOAT dx = x2 - x1;\n    FX_FLOAT dy = y2 - y1;\n    return FXSYS_sqrt2(dx, dy);\n}\nAGG_INLINE FX_FLOAT calc_line_point_distance(FX_FLOAT x1, FX_FLOAT y1,\n        FX_FLOAT x2, FX_FLOAT y2,\n        FX_FLOAT x,  FX_FLOAT y)\n{\n    FX_FLOAT dx = x2 - x1;\n    FX_FLOAT dy = y2 - y1;\n    FX_FLOAT d = FXSYS_sqrt2(dx, dy);\n    if(d < intersection_epsilon) {\n        return calc_distance(x1, y1, x, y);\n    }\n    return FXSYS_MulDiv(x - x2, dy, d) - FXSYS_MulDiv(y - y2, dx, d);\n}\nAGG_INLINE bool calc_intersection(FX_FLOAT ax, FX_FLOAT ay, FX_FLOAT bx, FX_FLOAT by,\n                                  FX_FLOAT cx, FX_FLOAT cy, FX_FLOAT dx, FX_FLOAT dy,\n                                  FX_FLOAT* x, FX_FLOAT* y)\n{\n    FX_FLOAT num = FXSYS_Mul(ay - cy, dx - cx) - FXSYS_Mul(ax - cx, dy - cy);\n    FX_FLOAT den = FXSYS_Mul(bx - ax, dy - cy) - FXSYS_Mul(by - ay, dx - cx);\n    if (FXSYS_fabs(den) < intersection_epsilon) {\n        return false;\n    }\n    *x = ax + FXSYS_MulDiv(bx - ax, num, den);\n    *y = ay + FXSYS_MulDiv(by - ay, num, den);\n    return true;\n}\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/agg_math_stroke.h",
    "content": "\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n//\n// Stroke math\n//\n//----------------------------------------------------------------------------\n#ifndef AGG_STROKE_MATH_INCLUDED\n#define AGG_STROKE_MATH_INCLUDED\n#include \"agg_math.h\"\n#include \"agg_vertex_sequence.h\"\nnamespace agg\n{\nenum line_cap_e {\n    butt_cap,\n    square_cap,\n    round_cap\n};\nenum line_join_e {\n    miter_join         = 0,\n    miter_join_revert  = 1,\n    miter_join_round   = 4,\n    round_join         = 2,\n    bevel_join         = 3\n};\nenum inner_join_e {\n    inner_bevel,\n    inner_miter,\n    inner_jag,\n    inner_round\n};\nconst FX_FLOAT stroke_theta = 1.0f / 1000.0f;\ntemplate<class VertexConsumer>\nvoid stroke_calc_arc(VertexConsumer& out_vertices,\n                     FX_FLOAT x,   FX_FLOAT y,\n                     FX_FLOAT dx1, FX_FLOAT dy1,\n                     FX_FLOAT dx2, FX_FLOAT dy2,\n                     FX_FLOAT width,\n                     FX_FLOAT approximation_scale)\n{\n    typedef typename VertexConsumer::value_type coord_type;\n    FX_FLOAT a1 = FXSYS_atan2(dy1, dx1);\n    FX_FLOAT a2 = FXSYS_atan2(dy2, dx2);\n    FX_FLOAT da = a1 - a2;\n    bool ccw = da > 0 && da < FX_PI;\n    if(width < 0) {\n        width = -width;\n    }\n    da = FXSYS_acos(FXSYS_Div(width, width + FXSYS_Div(1.0f / 8, approximation_scale))) * 2;\n    out_vertices.add(coord_type(x + dx1, y + dy1));\n    if(!ccw) {\n        if(a1 > a2) {\n            a2 += 2 * FX_PI;\n        }\n        a2 -= da / 4;\n        a1 += da;\n        while(a1 < a2) {\n            out_vertices.add(coord_type(x + FXSYS_Mul(width, FXSYS_cos(a1)),\n                                        y + FXSYS_Mul(width, FXSYS_sin(a1))));\n            a1 += da;\n        }\n    } else {\n        if(a1 < a2) {\n            a2 -= 2 * FX_PI;\n        }\n        a2 += da / 4;\n        a1 -= da;\n        while(a1 > a2) {\n            out_vertices.add(coord_type(x + FXSYS_Mul(width, FXSYS_cos(a1)),\n                                        y + FXSYS_Mul(width, FXSYS_sin(a1))));\n            a1 -= da;\n        }\n    }\n    out_vertices.add(coord_type(x + dx2, y + dy2));\n}\ntemplate<class VertexConsumer>\nvoid stroke_calc_miter(VertexConsumer& out_vertices,\n                       const vertex_dist& v0,\n                       const vertex_dist& v1,\n                       const vertex_dist& v2,\n                       FX_FLOAT dx1, FX_FLOAT dy1,\n                       FX_FLOAT dx2, FX_FLOAT dy2,\n                       FX_FLOAT width,\n                       line_join_e line_join,\n                       FX_FLOAT miter_limit,\n                       FX_FLOAT approximation_scale)\n{\n    typedef typename VertexConsumer::value_type coord_type;\n    FX_FLOAT xi = v1.x;\n    FX_FLOAT yi = v1.y;\n    bool miter_limit_exceeded = true;\n    if(calc_intersection(v0.x + dx1, v0.y - dy1,\n                         v1.x + dx1, v1.y - dy1,\n                         v1.x + dx2, v1.y - dy2,\n                         v2.x + dx2, v2.y - dy2,\n                         &xi, &yi)) {\n        FX_FLOAT d1 = calc_distance(v1.x, v1.y, xi, yi);\n        FX_FLOAT lim = FXSYS_Mul(width, miter_limit);\n        if(d1 <= lim) {\n            out_vertices.add(coord_type(xi, yi));\n            miter_limit_exceeded = false;\n        }\n    } else {\n        FX_FLOAT x2 = v1.x + dx1;\n        FX_FLOAT y2 = v1.y - dy1;\n        if((FXSYS_Mul(x2 - v0.x, dy1) - FXSYS_Mul(v0.y - y2, dx1) < 0) !=\n                (FXSYS_Mul(x2 - v2.x, dy1) - FXSYS_Mul(v2.y - y2, dx1) < 0)) {\n            out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1));\n            miter_limit_exceeded = false;\n        }\n    }\n    if(miter_limit_exceeded) {\n        switch(line_join) {\n            case miter_join_revert:\n                out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1));\n                out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2));\n                break;\n            case miter_join_round:\n                stroke_calc_arc(out_vertices,\n                                v1.x, v1.y, dx1, -dy1, dx2, -dy2,\n                                width, approximation_scale);\n                break;\n            default:\n                out_vertices.add(coord_type(v1.x + dx1 + FXSYS_Mul(dy1, miter_limit),\n                                            v1.y - dy1 + FXSYS_Mul(dx1, miter_limit)));\n                out_vertices.add(coord_type(v1.x + dx2 - FXSYS_Mul(dy2, miter_limit),\n                                            v1.y - dy2 - FXSYS_Mul(dx2, miter_limit)));\n                break;\n        }\n    }\n}\ntemplate<class VertexConsumer>\nvoid stroke_calc_cap(VertexConsumer& out_vertices,\n                     const vertex_dist& v0,\n                     const vertex_dist& v1,\n                     FX_FLOAT len,\n                     line_cap_e line_cap,\n                     FX_FLOAT width,\n                     FX_FLOAT approximation_scale)\n{\n    typedef typename VertexConsumer::value_type coord_type;\n    out_vertices.remove_all();\n    FX_FLOAT dx1 = FXSYS_Div(v1.y - v0.y, len);\n    FX_FLOAT dy1 = FXSYS_Div(v1.x - v0.x, len);\n    FX_FLOAT dx2 = 0;\n    FX_FLOAT dy2 = 0;\n    dx1 = FXSYS_Mul(dx1, width);\n    dy1 = FXSYS_Mul(dy1, width);\n    if(line_cap != round_cap) {\n        if(line_cap == square_cap) {\n            dx2 = dy1;\n            dy2 = dx1;\n        }\n        out_vertices.add(coord_type(v0.x - dx1 - dx2, v0.y + dy1 - dy2));\n        out_vertices.add(coord_type(v0.x + dx1 - dx2, v0.y - dy1 - dy2));\n    } else {\n        FX_FLOAT a1 = FXSYS_atan2(dy1, -dx1);\n        FX_FLOAT a2 = a1 + FX_PI;\n        FX_FLOAT da = FXSYS_acos(FXSYS_Div(width, width +\n                                           FXSYS_Div(1.0f / 8, approximation_scale))) * 2;\n        out_vertices.add(coord_type(v0.x - dx1, v0.y + dy1));\n        a1 += da;\n        a2 -= da / 4;\n        while(a1 < a2) {\n            out_vertices.add(coord_type(v0.x + FXSYS_Mul(width, FXSYS_cos(a1)),\n                                        v0.y + FXSYS_Mul(width, FXSYS_sin(a1))));\n            a1 += da;\n        }\n        out_vertices.add(coord_type(v0.x + dx1, v0.y - dy1));\n    }\n}\ntemplate<class VertexConsumer>\nvoid stroke_calc_join(VertexConsumer& out_vertices,\n                      const vertex_dist& v0,\n                      const vertex_dist& v1,\n                      const vertex_dist& v2,\n                      FX_FLOAT len1,\n                      FX_FLOAT len2,\n                      FX_FLOAT width,\n                      line_join_e line_join,\n                      inner_join_e inner_join,\n                      FX_FLOAT miter_limit,\n                      FX_FLOAT inner_miter_limit,\n                      FX_FLOAT approximation_scale)\n{\n    typedef typename VertexConsumer::value_type coord_type;\n    FX_FLOAT dx1, dy1, dx2, dy2;\n    dx1 = FXSYS_MulDiv(width, v1.y - v0.y, len1);\n    dy1 = FXSYS_MulDiv(width, v1.x - v0.x, len1);\n    dx2 = FXSYS_MulDiv(width, v2.y - v1.y, len2);\n    dy2 = FXSYS_MulDiv(width, v2.x - v1.x, len2);\n    out_vertices.remove_all();\n    if(calc_point_location(v0.x, v0.y, v1.x, v1.y, v2.x, v2.y) > 0) {\n        switch(inner_join) {\n            default:\n                out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1));\n                out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2));\n                break;\n            case inner_miter:\n                stroke_calc_miter(out_vertices,\n                                  v0, v1, v2, dx1, dy1, dx2, dy2,\n                                  width,\n                                  miter_join_revert,\n                                  inner_miter_limit,\n                                  1.0f);\n                break;\n            case inner_jag:\n            case inner_round: {\n                    FX_FLOAT d = (dx1 - dx2) * (dx1 - dx2) + (dy1 - dy2) * (dy1 - dy2);\n                    if(d < len1 * len1 && d < len2 * len2) {\n                        stroke_calc_miter(out_vertices,\n                                          v0, v1, v2, dx1, dy1, dx2, dy2,\n                                          width,\n                                          miter_join_revert,\n                                          inner_miter_limit,\n                                          1.0f);\n                    } else {\n                        if(inner_join == inner_jag) {\n                            out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1));\n                            out_vertices.add(coord_type(v1.x,       v1.y      ));\n                            out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2));\n                        } else {\n                            out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1));\n                            out_vertices.add(coord_type(v1.x,       v1.y      ));\n                            stroke_calc_arc(out_vertices,\n                                            v1.x, v1.y, dx2, -dy2, dx1, -dy1,\n                                            width, approximation_scale);\n                            out_vertices.add(coord_type(v1.x,       v1.y      ));\n                            out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2));\n                        }\n                    }\n                }\n                break;\n        }\n    } else {\n        switch(line_join) {\n            case miter_join:\n            case miter_join_revert:\n            case miter_join_round:\n                stroke_calc_miter(out_vertices,\n                                  v0, v1, v2, dx1, dy1, dx2, dy2,\n                                  width,\n                                  line_join,\n                                  miter_limit,\n                                  approximation_scale);\n                break;\n            case round_join:\n                stroke_calc_arc(out_vertices,\n                                v1.x, v1.y, dx1, -dy1, dx2, -dy2,\n                                width, approximation_scale);\n                break;\n            default:\n                out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1));\n                out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2));\n                break;\n        }\n    }\n}\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/agg_path_storage.h",
    "content": "\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n#ifndef AGG_PATH_STORAGE_INCLUDED\n#define AGG_PATH_STORAGE_INCLUDED\n#include \"agg_basics.h\"\nnamespace agg\n{\nclass path_storage : public CFX_Object\n{\n    enum block_scale_e {\n        block_shift = 8,\n        block_size  = 1 << block_shift,\n        block_mask  = block_size - 1,\n        block_pool  = 256\n    };\npublic:\n    class vertex_source : public CFX_Object\n    {\n    public:\n        vertex_source() {}\n        vertex_source(const path_storage& p) : m_path(&p), m_vertex_idx(0) {}\n        void rewind(unsigned path_id)\n        {\n            m_vertex_idx = path_id;\n        }\n        unsigned vertex(FX_FLOAT* x, FX_FLOAT* y)\n        {\n            return (m_vertex_idx < m_path->total_vertices()) ?\n                   m_path->vertex(m_vertex_idx++, x, y) :\n                   path_cmd_stop;\n        }\n    private:\n        const path_storage* m_path;\n        unsigned            m_vertex_idx;\n    };\n    ~path_storage();\n    path_storage();\n    unsigned last_vertex(FX_FLOAT* x, FX_FLOAT* y) const;\n    unsigned prev_vertex(FX_FLOAT* x, FX_FLOAT* y) const;\n    void move_to(FX_FLOAT x, FX_FLOAT y);\n    void line_to(FX_FLOAT x, FX_FLOAT y);\n    void curve4(FX_FLOAT x_ctrl1, FX_FLOAT y_ctrl1,\n                FX_FLOAT x_ctrl2, FX_FLOAT y_ctrl2,\n                FX_FLOAT x_to,    FX_FLOAT y_to);\n    template<class VertexSource>\n    void add_path(VertexSource& vs,\n                  unsigned path_id = 0,\n                  bool solid_path = true)\n    {\n        FX_FLOAT x, y;\n        unsigned cmd;\n        vs.rewind(path_id);\n        while(!is_stop(cmd = vs.vertex(&x, &y))) {\n            if(is_move_to(cmd) && solid_path && m_total_vertices) {\n                cmd = path_cmd_line_to;\n            }\n            add_vertex(x, y, cmd);\n        }\n    }\n    template<class VertexSource>\n    void add_path_curve(VertexSource& vs,\n                        unsigned path_id = 0,\n                        bool solid_path = true)\n    {\n        FX_FLOAT x, y;\n        unsigned cmd;\n        int flag;\n        vs.rewind(path_id);\n        while(!is_stop(cmd = vs.vertex_curve_flag(&x, &y, flag))) {\n            if(is_move_to(cmd) && solid_path && m_total_vertices) {\n                cmd = path_cmd_line_to | flag;\n            }\n            add_vertex(x, y, cmd | flag);\n        }\n    }\n    unsigned total_vertices() const\n    {\n        return m_total_vertices;\n    }\n    unsigned vertex(unsigned idx, FX_FLOAT* x, FX_FLOAT* y) const\n    {\n        unsigned nb = idx >> block_shift;\n        const FX_FLOAT* pv = m_coord_blocks[nb] + ((idx & block_mask) << 1);\n        *x = *pv++;\n        *y = *pv;\n        return m_cmd_blocks[nb][idx & block_mask];\n    }\n    unsigned command(unsigned idx) const\n    {\n        return m_cmd_blocks[idx >> block_shift][idx & block_mask];\n    }\n    unsigned getflag(unsigned idx) const\n    {\n        return m_cmd_blocks[idx >> block_shift][idx & block_mask] & path_flags_jr;\n    }\n    void     rewind(unsigned path_id);\n    unsigned vertex(FX_FLOAT* x, FX_FLOAT* y);\n    void add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd);\n    void end_poly();\nprivate:\n    void allocate_block(unsigned nb);\n    unsigned char* storage_ptrs(FX_FLOAT** xy_ptr);\nprivate:\n    unsigned        m_total_vertices;\n    unsigned        m_total_blocks;\n    unsigned        m_max_blocks;\n    FX_FLOAT**   m_coord_blocks;\n    unsigned char** m_cmd_blocks;\n    unsigned        m_iterator;\n};\ninline unsigned path_storage::vertex(FX_FLOAT* x, FX_FLOAT* y)\n{\n    if(m_iterator >= m_total_vertices) {\n        return path_cmd_stop;\n    }\n    return vertex(m_iterator++, x, y);\n}\ninline unsigned path_storage::prev_vertex(FX_FLOAT* x, FX_FLOAT* y) const\n{\n    if(m_total_vertices > 1) {\n        return vertex(m_total_vertices - 2, x, y);\n    }\n    return path_cmd_stop;\n}\ninline unsigned path_storage::last_vertex(FX_FLOAT* x, FX_FLOAT* y) const\n{\n    if(m_total_vertices) {\n        return vertex(m_total_vertices - 1, x, y);\n    }\n    return path_cmd_stop;\n}\ninline unsigned char* path_storage::storage_ptrs(FX_FLOAT** xy_ptr)\n{\n    unsigned nb = m_total_vertices >> block_shift;\n    if(nb >= m_total_blocks) {\n        allocate_block(nb);\n    }\n    *xy_ptr = m_coord_blocks[nb] + ((m_total_vertices & block_mask) << 1);\n    return m_cmd_blocks[nb] + (m_total_vertices & block_mask);\n}\ninline void path_storage::add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd)\n{\n    FX_FLOAT* coord_ptr = 0;\n    unsigned char* cmd_ptr = storage_ptrs(&coord_ptr);\n    *cmd_ptr = (unsigned char)cmd;\n    *coord_ptr++ = x;\n    *coord_ptr   = y;\n    m_total_vertices++;\n}\ninline void path_storage::move_to(FX_FLOAT x, FX_FLOAT y)\n{\n    add_vertex(x, y, path_cmd_move_to);\n}\ninline void path_storage::line_to(FX_FLOAT x, FX_FLOAT y)\n{\n    add_vertex(x, y, path_cmd_line_to);\n}\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/agg_pixfmt_gray.h",
    "content": "\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n//\n// Adaptation for high precision colors has been sponsored by\n// Liberty Technology Systems, Inc., visit http://lib-sys.com\n//\n// Liberty Technology Systems, Inc. is the provider of\n// PostScript and PDF technology for software developers.\n//\n//----------------------------------------------------------------------------\n#ifndef AGG_PIXFMT_GRAY_INCLUDED\n#define AGG_PIXFMT_GRAY_INCLUDED\n#include \"agg_basics.h\"\n#include \"agg_color_gray.h\"\n#include \"agg_rendering_buffer.h\"\nnamespace agg\n{\ntemplate<class ColorT> struct blender_gray : public CFX_Object {\n    typedef ColorT color_type;\n    typedef typename color_type::value_type value_type;\n    typedef typename color_type::calc_type calc_type;\n    enum base_scale_e { base_shift = color_type::base_shift };\n    static AGG_INLINE void blend_pix(value_type* p, unsigned cv,\n                                     unsigned alpha, unsigned cover = 0)\n    {\n        *p = (value_type)((((cv - calc_type(*p)) * alpha) + (calc_type(*p) << base_shift)) >> base_shift);\n    }\n};\ntemplate<class Blender, unsigned Step = 1, unsigned Offset = 0>\nclass pixel_formats_gray : public CFX_Object\n{\npublic:\n    typedef rendering_buffer::row_data row_data;\n    typedef rendering_buffer::span_data span_data;\n    typedef typename Blender::color_type color_type;\n    typedef typename color_type::value_type value_type;\n    typedef typename color_type::calc_type calc_type;\n    enum base_scale_e {\n        base_shift = color_type::base_shift,\n        base_size  = color_type::base_size,\n        base_mask  = color_type::base_mask\n    };\nprivate:\n    static AGG_INLINE void copy_or_blend_pix(value_type* p,\n            const color_type& c,\n            unsigned cover)\n    {\n        if (c.a) {\n            calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8;\n            if(alpha == base_mask) {\n                *p = c.v;\n            } else {\n                Blender::blend_pix(p, c.v, alpha, cover);\n            }\n        }\n    }\n    static AGG_INLINE void copy_or_blend_pix(value_type* p,\n            const color_type& c)\n    {\n        if (c.a) {\n            if(c.a == base_mask) {\n                *p = c.v;\n            } else {\n                Blender::blend_pix(p, c.v, c.a);\n            }\n        }\n    }\npublic:\n    pixel_formats_gray(rendering_buffer& rb) :\n        m_rbuf(&rb)\n    {}\n    AGG_INLINE unsigned width()  const\n    {\n        return m_rbuf->width();\n    }\n    AGG_INLINE unsigned height() const\n    {\n        return m_rbuf->height();\n    }\n    AGG_INLINE color_type pixel(int x, int y) const\n    {\n        value_type* p = (value_type*)m_rbuf->row(y) + x * Step + Offset;\n        return color_type(*p);\n    }\n    row_data row(int x, int y) const\n    {\n        return row_data(x,\n                        width() - 1,\n                        m_rbuf->row(y) +\n                        x * Step * sizeof(value_type) +\n                        Offset * sizeof(value_type));\n    }\n    span_data span(int x, int y, unsigned len)\n    {\n        return span_data(x, len,\n                         m_rbuf->row(y) +\n                         x * Step * sizeof(value_type) +\n                         Offset * sizeof(value_type));\n    }\n    AGG_INLINE void copy_pixel(int x, int y, const color_type& c)\n    {\n        *((value_type*)m_rbuf->row(y) + x * Step + Offset) = c.v;\n    }\n    AGG_INLINE void blend_pixel(int x, int y, const color_type& c, int8u cover)\n    {\n        copy_or_blend_pix((value_type*)m_rbuf->row(y) + x * Step + Offset, c, cover);\n    }\n    AGG_INLINE void copy_hline(int x, int y,\n                               unsigned len,\n                               const color_type& c)\n    {\n        value_type* p = (value_type*)m_rbuf->row(y) + x * Step + Offset;\n        do {\n            *p = c.v;\n            p += Step;\n        } while(--len);\n    }\n    void blend_hline(int x, int y,\n                     unsigned len,\n                     const color_type& c,\n                     int8u cover)\n    {\n        if (c.a) {\n            value_type* p = (value_type*)m_rbuf->row(y) + x * Step + Offset;\n            calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8;\n            if(alpha == base_mask) {\n                do {\n                    *p = c.v;\n                    p += Step;\n                } while(--len);\n            } else {\n                do {\n                    Blender::blend_pix(p, c.v, alpha, cover);\n                    p += Step;\n                } while(--len);\n            }\n        }\n    }\n    void blend_solid_hspan(int x, int y,\n                           unsigned len,\n                           const color_type& c,\n                           const int8u* covers)\n    {\n        if (c.a) {\n            value_type* p = (value_type*)m_rbuf->row(y) + x * Step + Offset;\n            do {\n                calc_type alpha = (calc_type(c.a) * (calc_type(*covers) + 1)) >> 8;\n                if(alpha == base_mask) {\n                    *p = c.v;\n                } else {\n                    Blender::blend_pix(p, c.v, alpha, *covers);\n                }\n                p += Step;\n                ++covers;\n            } while(--len);\n        }\n    }\nprivate:\n    rendering_buffer* m_rbuf;\n};\ntypedef blender_gray<gray8>      blender_gray8;\ntypedef pixel_formats_gray<blender_gray8, 1, 0> pixfmt_gray8;\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/agg_rasterizer_scanline_aa.h",
    "content": "\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n//\n// The author gratefully acknowleges the support of David Turner,\n// Robert Wilhelm, and Werner Lemberg - the authors of the FreeType\n// libray - in producing this work. See http://www.freetype.org for details.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n//\n// Adaptation for 32-bit screen coordinates has been sponsored by\n// Liberty Technology Systems, Inc., visit http://lib-sys.com\n//\n// Liberty Technology Systems, Inc. is the provider of\n// PostScript and PDF technology for software developers.\n//\n//----------------------------------------------------------------------------\n#ifndef AGG_RASTERIZER_SCANLINE_AA_INCLUDED\n#define AGG_RASTERIZER_SCANLINE_AA_INCLUDED\n#include \"../../../../include/fxge/fx_ge.h\"\n#include \"agg_basics.h\"\n#include \"agg_math.h\"\n#include \"agg_array.h\"\n#include \"agg_clip_liang_barsky.h\"\n#include \"agg_render_scanlines.h\"\nnamespace agg\n{\nenum poly_base_scale_e {\n    poly_base_shift = 8,\n    poly_base_size  = 1 << poly_base_shift,\n    poly_base_mask  = poly_base_size - 1\n};\ninline int poly_coord(FX_FLOAT c)\n{\n    return int(c * poly_base_size);\n}\nstruct cell_aa : public CFX_Object {\n    int x;\n    int y;\n    int cover;\n    int area;\n    void set(int x, int y, int c, int a);\n    void set_coord(int x, int y);\n    void set_cover(int c, int a);\n    void add_cover(int c, int a);\n};\nclass outline_aa : public CFX_Object\n{\n    enum cell_block_scale_e {\n        cell_block_shift = 12,\n        cell_block_size  = 1 << cell_block_shift,\n        cell_block_mask  = cell_block_size - 1,\n        cell_block_pool  = 256,\n        cell_block_limit = 1024\n    };\n    struct sorted_y : public CFX_Object {\n        unsigned start;\n        unsigned num;\n    };\npublic:\n    ~outline_aa();\n    outline_aa();\n    void reset();\n    void move_to(int x, int y);\n    void line_to(int x, int y);\n    int min_x() const\n    {\n        return m_min_x;\n    }\n    int min_y() const\n    {\n        return m_min_y;\n    }\n    int max_x() const\n    {\n        return m_max_x;\n    }\n    int max_y() const\n    {\n        return m_max_y;\n    }\n    void sort_cells();\n    unsigned total_cells() const\n    {\n        return m_num_cells;\n    }\n    unsigned scanline_num_cells(unsigned y) const\n    {\n        return m_sorted_y[y - m_min_y].num;\n    }\n    const cell_aa* const* scanline_cells(unsigned y) const\n    {\n        return m_sorted_cells.data() + m_sorted_y[y - m_min_y].start;\n    }\n    bool sorted() const\n    {\n        return m_sorted;\n    }\nprivate:\n    outline_aa(const outline_aa&);\n    const outline_aa& operator = (const outline_aa&);\n    void set_cur_cell(int x, int y);\n    void add_cur_cell();\n    void render_hline(int ey, int x1, int y1, int x2, int y2);\n    void render_line(int x1, int y1, int x2, int y2);\n    void allocate_block();\nprivate:\n    unsigned  m_num_blocks;\n    unsigned  m_max_blocks;\n    unsigned  m_cur_block;\n    unsigned  m_num_cells;\n    cell_aa** m_cells;\n    cell_aa*  m_cur_cell_ptr;\n    pod_array<cell_aa*> m_sorted_cells;\n    pod_array<sorted_y> m_sorted_y;\n    cell_aa   m_cur_cell;\n    int       m_cur_x;\n    int       m_cur_y;\n    int       m_min_x;\n    int       m_min_y;\n    int       m_max_x;\n    int       m_max_y;\n    bool      m_sorted;\n};\nclass scanline_hit_test : public CFX_Object\n{\npublic:\n    scanline_hit_test(int x) : m_x(x), m_hit(false) {}\n    void reset_spans() {}\n    void finalize(int) {}\n    void add_cell(int x, int)\n    {\n        if(m_x == x) {\n            m_hit = true;\n        }\n    }\n    void add_span(int x, int len, int)\n    {\n        if(m_x >= x && m_x < x + len) {\n            m_hit = true;\n        }\n    }\n    unsigned num_spans() const\n    {\n        return 1;\n    }\n    bool hit() const\n    {\n        return m_hit;\n    }\nprivate:\n    int  m_x;\n    bool m_hit;\n};\nenum filling_rule_e {\n    fill_non_zero,\n    fill_even_odd\n};\nclass rasterizer_scanline_aa : public CFX_Object\n{\n    enum status {\n        status_initial,\n        status_line_to,\n        status_closed\n    };\npublic:\n    enum aa_scale_e {\n        aa_num   = 1 << 8,\n        aa_mask  = aa_num - 1,\n        aa_2num  = aa_num * 2,\n        aa_2mask = aa_2num - 1\n    };\n    rasterizer_scanline_aa() :\n        m_filling_rule(fill_non_zero),\n        m_clipped_start_x(0),\n        m_clipped_start_y(0),\n        m_status(status_initial),\n        m_clipping(false)\n    {\n    }\n    ~rasterizer_scanline_aa() {}\n    void filling_rule(filling_rule_e filling_rule)\n    {\n        m_filling_rule = filling_rule;\n    }\n    int min_x() const\n    {\n        return m_outline.min_x();\n    }\n    int min_y() const\n    {\n        return m_outline.min_y();\n    }\n    int max_x() const\n    {\n        return m_outline.max_x();\n    }\n    int max_y() const\n    {\n        return m_outline.max_y();\n    }\n    void reset()\n    {\n        m_outline.reset();\n        m_status = status_initial;\n    }\n    void clip_box(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2)\n    {\n        m_clip_box = rect(poly_coord(x1), poly_coord(y1),\n                          poly_coord(x2), poly_coord(y2));\n        m_clip_box.normalize();\n        m_clipping = true;\n    }\n    void add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd)\n    {\n        if(is_close(cmd)) {\n            close_polygon();\n        } else {\n            if(is_move_to(cmd)) {\n                move_to(poly_coord(x), poly_coord(y));\n            } else {\n                if(is_vertex(cmd)) {\n                    line_to(poly_coord(x), poly_coord(y));\n                }\n            }\n        }\n    }\n    void move_to(int x, int y)\n    {\n        if(m_clipping) {\n            if(m_outline.sorted()) {\n                reset();\n            }\n            if(m_status == status_line_to) {\n                close_polygon();\n            }\n            m_prev_x = m_start_x = x;\n            m_prev_y = m_start_y = y;\n            m_status = status_initial;\n            m_prev_flags = clipping_flags(x, y, m_clip_box);\n            if(m_prev_flags == 0) {\n                move_to_no_clip(x, y);\n            }\n        } else {\n            move_to_no_clip(x, y);\n        }\n    }\n    void line_to(int x, int y)\n    {\n        if(m_clipping) {\n            clip_segment(x, y);\n        } else {\n            line_to_no_clip(x, y);\n        }\n    }\n    void close_polygon()\n    {\n        if (m_status != status_line_to) {\n            return;\n        }\n        if(m_clipping) {\n            clip_segment(m_start_x, m_start_y);\n        }\n        close_polygon_no_clip();\n    }\n    AGG_INLINE unsigned calculate_alpha(int area, bool no_smooth) const\n    {\n        int cover = area >> (poly_base_shift * 2 + 1 - 8);\n        if(cover < 0) {\n            cover = -cover;\n        }\n        if(m_filling_rule == fill_even_odd) {\n            cover &= aa_2mask;\n            if(cover > aa_num) {\n                cover = aa_2num - cover;\n            }\n        }\n        if (no_smooth) {\n            cover = cover > aa_mask / 2 ? aa_mask : 0;\n        }\n        if(cover > aa_mask) {\n            cover = aa_mask;\n        }\n        return cover;\n    }\n    AGG_INLINE void sort()\n    {\n        m_outline.sort_cells();\n    }\n    AGG_INLINE bool rewind_scanlines()\n    {\n        close_polygon();\n        m_outline.sort_cells();\n        if(m_outline.total_cells() == 0) {\n            return false;\n        }\n        m_cur_y = m_outline.min_y();\n        return true;\n    }\n    AGG_INLINE bool navigate_scanline(int y)\n    {\n        close_polygon();\n        m_outline.sort_cells();\n        if(m_outline.total_cells() == 0 ||\n                y < m_outline.min_y() ||\n                y > m_outline.max_y()) {\n            return false;\n        }\n        m_cur_y = y;\n        return true;\n    }\n    template<class Scanline> bool sweep_scanline(Scanline& sl, bool no_smooth)\n    {\n        for(;;) {\n            if(m_cur_y > m_outline.max_y()) {\n                return false;\n            }\n            sl.reset_spans();\n            unsigned num_cells = m_outline.scanline_num_cells(m_cur_y);\n            const cell_aa* const* cells = m_outline.scanline_cells(m_cur_y);\n            int cover = 0;\n            while(num_cells) {\n                const cell_aa* cur_cell = *cells;\n                int x    = cur_cell->x;\n                int area = cur_cell->area;\n                unsigned alpha;\n                cover += cur_cell->cover;\n                while(--num_cells) {\n                    cur_cell = *++cells;\n                    if(cur_cell->x != x) {\n                        break;\n                    }\n                    area  += cur_cell->area;\n                    cover += cur_cell->cover;\n                }\n                if(area) {\n                    alpha = calculate_alpha((cover << (poly_base_shift + 1)) - area, no_smooth);\n                    if(alpha) {\n                        sl.add_cell(x, alpha);\n                    }\n                    x++;\n                }\n                if(num_cells && cur_cell->x > x) {\n                    alpha = calculate_alpha(cover << (poly_base_shift + 1), no_smooth);\n                    if(alpha) {\n                        sl.add_span(x, cur_cell->x - x, alpha);\n                    }\n                }\n            }\n            if(sl.num_spans()) {\n                break;\n            }\n            ++m_cur_y;\n        }\n        sl.finalize(m_cur_y);\n        ++m_cur_y;\n        return true;\n    }\n    template<class VertexSource>\n    void add_path(VertexSource& vs, unsigned path_id = 0)\n    {\n        FX_FLOAT x;\n        FX_FLOAT y;\n        unsigned cmd;\n        vs.rewind(path_id);\n        while(!is_stop(cmd = vs.vertex(&x, &y))) {\n            add_vertex(x, y, cmd);\n        }\n    }\n    template<class VertexSource>\n    void add_path_transformed(VertexSource& vs, const CFX_AffineMatrix* pMatrix, unsigned path_id = 0)\n    {\n        FX_FLOAT x;\n        FX_FLOAT y;\n        unsigned cmd;\n        vs.rewind(path_id);\n        while(!is_stop(cmd = vs.vertex(&x, &y))) {\n            if (pMatrix) {\n                pMatrix->Transform(x, y);\n            }\n            add_vertex(x, y, cmd);\n        }\n    }\nprivate:\n    rasterizer_scanline_aa(const rasterizer_scanline_aa&);\n    const rasterizer_scanline_aa&\n    operator = (const rasterizer_scanline_aa&);\n    void move_to_no_clip(int x, int y)\n    {\n        if(m_status == status_line_to) {\n            close_polygon_no_clip();\n        }\n        m_outline.move_to(x * 1, y);\n        m_clipped_start_x = x;\n        m_clipped_start_y = y;\n        m_status = status_line_to;\n    }\n    void line_to_no_clip(int x, int y)\n    {\n        if(m_status != status_initial) {\n            m_outline.line_to(x * 1, y);\n            m_status = status_line_to;\n        }\n    }\n    void close_polygon_no_clip()\n    {\n        if(m_status == status_line_to) {\n            m_outline.line_to(m_clipped_start_x * 1, m_clipped_start_y);\n            m_status = status_closed;\n        }\n    }\n    void clip_segment(int x, int y)\n    {\n        unsigned flags = clipping_flags(x, y, m_clip_box);\n        if(m_prev_flags == flags) {\n            if(flags == 0) {\n                if(m_status == status_initial) {\n                    move_to_no_clip(x, y);\n                } else {\n                    line_to_no_clip(x, y);\n                }\n            }\n        } else {\n            int cx[4];\n            int cy[4];\n            unsigned n = clip_liang_barsky(m_prev_x, m_prev_y,\n                                           x, y,\n                                           m_clip_box,\n                                           cx, cy);\n            const int* px = cx;\n            const int* py = cy;\n            while(n--) {\n                if(m_status == status_initial) {\n                    move_to_no_clip(*px++, *py++);\n                } else {\n                    line_to_no_clip(*px++, *py++);\n                }\n            }\n        }\n        m_prev_flags = flags;\n        m_prev_x = x;\n        m_prev_y = y;\n    }\nprivate:\n    outline_aa     m_outline;\n    filling_rule_e m_filling_rule;\n    int            m_clipped_start_x;\n    int            m_clipped_start_y;\n    int            m_start_x;\n    int            m_start_y;\n    int            m_prev_x;\n    int            m_prev_y;\n    unsigned       m_prev_flags;\n    unsigned       m_status;\n    rect           m_clip_box;\n    bool           m_clipping;\n    int            m_cur_y;\n};\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/agg_render_scanlines.h",
    "content": "\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n#ifndef AGG_RENDER_SCANLINES_INCLUDED\n#define AGG_RENDER_SCANLINES_INCLUDED\n#include \"agg_basics.h\"\nnamespace agg\n{\ntemplate<class Rasterizer, class Scanline, class Renderer>\nvoid render_scanlines(Rasterizer& ras, Scanline& sl, Renderer& ren, bool no_smooth)\n{\n    if(ras.rewind_scanlines()) {\n        sl.reset(ras.min_x(), ras.max_x());\n        ren.prepare(unsigned(ras.max_x() - ras.min_x() + 2));\n        while(ras.sweep_scanline(sl, no_smooth)) {\n            ren.render(sl);\n        }\n    }\n}\ntemplate<class Rasterizer, class Scanline, class Renderer,\n         class VertexSource, class ColorStorage, class PathId>\nvoid render_all_paths(Rasterizer& ras,\n                      Scanline& sl,\n                      Renderer& r,\n                      VertexSource& vs,\n                      const ColorStorage& as,\n                      const PathId& path_id,\n                      unsigned num_paths)\n{\n    for(unsigned i = 0; i < num_paths; i++) {\n        ras.reset();\n        ras.add_path(vs, path_id[i]);\n        r.color(as[i]);\n        render_scanlines(ras, sl, r);\n    }\n}\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/agg_renderer_base.h",
    "content": "\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n//\n// class renderer_base\n//\n//----------------------------------------------------------------------------\n#ifndef AGG_RENDERER_BASE_INCLUDED\n#define AGG_RENDERER_BASE_INCLUDED\n#include \"agg_basics.h\"\n#include \"agg_rendering_buffer.h\"\nnamespace agg\n{\ntemplate<class PixelFormat> class renderer_base : public CFX_Object\n{\npublic:\n    typedef PixelFormat pixfmt_type;\n    typedef typename pixfmt_type::color_type color_type;\n    typedef typename pixfmt_type::row_data row_data;\n    typedef typename pixfmt_type::span_data span_data;\n    renderer_base() : m_ren(0), m_clip_box(1, 1, 0, 0) {}\n    renderer_base(pixfmt_type& ren) :\n        m_ren(&ren),\n        m_clip_box(0, 0, ren.width() - 1, ren.height() - 1)\n    {}\n    void attach(pixfmt_type& ren)\n    {\n        m_ren = &ren;\n        m_clip_box = rect(0, 0, ren.width() - 1, ren.height() - 1);\n    }\n    const pixfmt_type& ren() const\n    {\n        return *m_ren;\n    }\n    pixfmt_type& ren()\n    {\n        return *m_ren;\n    }\n    unsigned width()  const\n    {\n        return m_ren->width();\n    }\n    unsigned height() const\n    {\n        return m_ren->height();\n    }\n    void first_clip_box() {}\n    bool next_clip_box()\n    {\n        return false;\n    }\n    const rect& clip_box() const\n    {\n        return m_clip_box;\n    }\n    int         xmin()     const\n    {\n        return m_clip_box.x1;\n    }\n    int         ymin()     const\n    {\n        return m_clip_box.y1;\n    }\n    int         xmax()     const\n    {\n        return m_clip_box.x2;\n    }\n    int         ymax()     const\n    {\n        return m_clip_box.y2;\n    }\n    const rect& bounding_clip_box() const\n    {\n        return m_clip_box;\n    }\n    int         bounding_xmin()     const\n    {\n        return m_clip_box.x1;\n    }\n    int         bounding_ymin()     const\n    {\n        return m_clip_box.y1;\n    }\n    int         bounding_xmax()     const\n    {\n        return m_clip_box.x2;\n    }\n    int         bounding_ymax()     const\n    {\n        return m_clip_box.y2;\n    }\n    void blend_hline(int x1, int y, int x2,\n                     const color_type& c, cover_type cover)\n    {\n        if(x1 > x2) {\n            int t = x2;\n            x2 = x1;\n            x1 = t;\n        }\n        if(y  > ymax()) {\n            return;\n        }\n        if(y  < ymin()) {\n            return;\n        }\n        if(x1 > xmax()) {\n            return;\n        }\n        if(x2 < xmin()) {\n            return;\n        }\n        if(x1 < xmin()) {\n            x1 = xmin();\n        }\n        if(x2 > xmax()) {\n            x2 = xmax();\n        }\n        m_ren->blend_hline(x1, y, x2 - x1 + 1, c, cover);\n    }\n    void blend_solid_hspan(int x, int y, int len,\n                           const color_type& c,\n                           const cover_type* covers)\n    {\n        if(y > ymax()) {\n            return;\n        }\n        if(y < ymin()) {\n            return;\n        }\n        if(x < xmin()) {\n            len -= xmin() - x;\n            if(len <= 0) {\n                return;\n            }\n            covers += xmin() - x;\n            x = xmin();\n        }\n        if(x + len > xmax()) {\n            len = xmax() - x + 1;\n            if(len <= 0) {\n                return;\n            }\n        }\n        m_ren->blend_solid_hspan(x, y, len, c, covers);\n    }\nprivate:\n    pixfmt_type* m_ren;\n    rect         m_clip_box;\n};\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/agg_renderer_scanline.h",
    "content": "\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n#ifndef AGG_RENDERER_SCANLINE_INCLUDED\n#define AGG_RENDERER_SCANLINE_INCLUDED\n#include \"agg_basics.h\"\n#include \"agg_renderer_base.h\"\n#include \"agg_render_scanlines.h\"\nnamespace agg\n{\ntemplate<class BaseRenderer, class SpanGenerator> class renderer_scanline_aa : public CFX_Object\n{\npublic:\n    typedef BaseRenderer  base_ren_type;\n    typedef SpanGenerator span_gen_type;\n    renderer_scanline_aa() : m_ren(0), m_span_gen(0) {}\n    renderer_scanline_aa(base_ren_type& ren, span_gen_type& span_gen) :\n        m_ren(&ren),\n        m_span_gen(&span_gen)\n    {}\n    void attach(base_ren_type& ren, span_gen_type& span_gen)\n    {\n        m_ren = &ren;\n        m_span_gen = &span_gen;\n    }\n    void prepare(unsigned max_span_len)\n    {\n        m_span_gen->prepare(max_span_len);\n    }\n    template<class Scanline> void render(const Scanline& sl)\n    {\n        int y = sl.y();\n        m_ren->first_clip_box();\n        do {\n            int xmin = m_ren->xmin();\n            int xmax = m_ren->xmax();\n            if(y >= m_ren->ymin() && y <= m_ren->ymax()) {\n                unsigned num_spans = sl.num_spans();\n                typename Scanline::const_iterator span = sl.begin();\n                for(;;) {\n                    int x = span->x;\n                    int len = span->len;\n                    bool solid = false;\n                    const typename Scanline::cover_type* covers = span->covers;\n                    if(len < 0) {\n                        solid = true;\n                        len = -len;\n                    }\n                    if(x < xmin) {\n                        len -= xmin - x;\n                        if(!solid) {\n                            covers += xmin - x;\n                        }\n                        x = xmin;\n                    }\n                    if(len > 0) {\n                        if(x + len > xmax) {\n                            len = xmax - x + 1;\n                        }\n                        if(len > 0) {\n                            m_ren->blend_color_hspan_no_clip(\n                                x, y, len,\n                                m_span_gen->generate(x, y, len),\n                                solid ? 0 : covers,\n                                *covers);\n                        }\n                    }\n                    if(--num_spans == 0) {\n                        break;\n                    }\n                    ++span;\n                }\n            }\n        } while(m_ren->next_clip_box());\n    }\nprivate:\n    base_ren_type* m_ren;\n    SpanGenerator* m_span_gen;\n};\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/agg_rendering_buffer.h",
    "content": "\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n//\n// class rendering_buffer\n//\n//----------------------------------------------------------------------------\n#ifndef AGG_RENDERING_BUFFER_INCLUDED\n#define AGG_RENDERING_BUFFER_INCLUDED\n#include \"agg_basics.h\"\nnamespace agg\n{\nclass rendering_buffer : public CFX_Object\n{\npublic:\n    struct row_data : public CFX_Object {\n        int x1, x2;\n        const int8u* ptr;\n        row_data() {}\n        row_data(int x1_, int x2_, const int8u* ptr_) :\n            x1(x1_), x2(x2_), ptr(ptr_) {}\n    };\n    struct span_data : public CFX_Object {\n        int x;\n        unsigned len;\n        int8u* ptr;\n        span_data() {}\n        span_data(int) : x(0), len(0), ptr(0) {}\n        span_data(int x_, unsigned len_, int8u* ptr_) :\n            x(x_), len(len_), ptr(ptr_) {}\n    };\n    ~rendering_buffer()\n    {\n        FX_Free(m_rows);\n    }\n    rendering_buffer() :\n        m_buf(0),\n        m_rows(0),\n        m_width(0),\n        m_height(0),\n        m_stride(0),\n        m_max_height(0)\n    {\n    }\n    rendering_buffer(int8u* buf, unsigned width, unsigned height, int stride) :\n        m_buf(0),\n        m_rows(0),\n        m_width(0),\n        m_height(0),\n        m_stride(0),\n        m_max_height(0)\n    {\n        attach(buf, width, height, stride);\n    }\n    void attach(int8u* buf, unsigned width, unsigned height, int stride)\n    {\n        m_buf = buf;\n        m_width = width;\n        m_height = height;\n        m_stride = stride;\n        if(height > m_max_height) {\n            FX_Free(m_rows);\n            m_rows = FX_Alloc(int8u*, m_max_height = height);\n        }\n        int8u* row_ptr = m_buf;\n        if(stride < 0) {\n            row_ptr = m_buf - int(height - 1) * stride;\n        }\n        int8u** rows = m_rows;\n        while(height--) {\n            *rows++ = row_ptr;\n            row_ptr += stride;\n        }\n    }\n    int8u* buf()\n    {\n        return m_buf;\n    }\n    const int8u* buf()    const\n    {\n        return m_buf;\n    }\n    unsigned width()  const\n    {\n        return m_width;\n    }\n    unsigned height() const\n    {\n        return m_height;\n    }\n    int      stride() const\n    {\n        return m_stride;\n    }\n    unsigned stride_abs() const\n    {\n        return (m_stride < 0) ?\n               unsigned(-m_stride) :\n               unsigned(m_stride);\n    }\n    int8u* row(unsigned y)\n    {\n        return m_rows[y];\n    }\n    const int8u* row(unsigned y) const\n    {\n        return m_rows[y];\n    }\n    int8u* next_row(void* p)\n    {\n        return (int8u*)p + m_stride;\n    }\n    const int8u* next_row(const void* p) const\n    {\n        return (int8u*)p + m_stride;\n    }\n    int8u const* const* rows() const\n    {\n        return m_rows;\n    }\nprivate:\n    rendering_buffer(const rendering_buffer&);\n    const rendering_buffer& operator = (const rendering_buffer&);\nprivate:\n    int8u*       m_buf;\n    int8u**      m_rows;\n    unsigned m_width;\n    unsigned m_height;\n    int      m_stride;\n    unsigned m_max_height;\n};\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/agg_scanline_u.h",
    "content": "\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n//\n// Adaptation for 32-bit screen coordinates (scanline32_u) has been sponsored by\n// Liberty Technology Systems, Inc., visit http://lib-sys.com\n//\n// Liberty Technology Systems, Inc. is the provider of\n// PostScript and PDF technology for software developers.\n//\n//----------------------------------------------------------------------------\n#ifndef AGG_SCANLINE_U_INCLUDED\n#define AGG_SCANLINE_U_INCLUDED\n#include \"agg_array.h\"\nnamespace agg\n{\ntemplate<class CoverT> class scanline_u : public CFX_Object\n{\npublic:\n    typedef scanline_u<CoverT> self_type;\n    typedef CoverT cover_type;\n    typedef int16  coord_type;\n    struct span : public CFX_Object {\n        coord_type  x;\n        coord_type  len;\n        cover_type* covers;\n    };\n    typedef span* iterator;\n    typedef const span* const_iterator;\n    ~scanline_u()\n    {\n        FX_Free(m_spans);\n        FX_Free(m_covers);\n    }\n    scanline_u() :\n        m_min_x(0),\n        m_max_len(0),\n        m_last_x(0x7FFFFFF0),\n        m_covers(0),\n        m_spans(0),\n        m_cur_span(0)\n    {}\n    void reset(int min_x, int max_x)\n    {\n        unsigned max_len = max_x - min_x + 2;\n        if(max_len > m_max_len) {\n            FX_Free(m_spans);\n            FX_Free(m_covers);\n            m_covers  = FX_Alloc( cover_type , max_len);\n            m_spans   = FX_Alloc( span       , max_len);\n            m_max_len = max_len;\n        }\n        m_last_x        = 0x7FFFFFF0;\n        m_min_x         = min_x;\n        m_cur_span      = m_spans;\n    }\n    void add_cell(int x, unsigned cover)\n    {\n        x -= m_min_x;\n        m_covers[x] = (cover_type)cover;\n        if(x == m_last_x + 1) {\n            m_cur_span->len++;\n        } else {\n            m_cur_span++;\n            m_cur_span->x      = (coord_type)(x + m_min_x);\n            m_cur_span->len    = 1;\n            m_cur_span->covers = m_covers + x;\n        }\n        m_last_x = x;\n    }\n    void add_cells(int x, unsigned len, const CoverT* covers)\n    {\n        x -= m_min_x;\n        FXSYS_memcpy(m_covers + x, covers, len * sizeof(CoverT));\n        if(x == m_last_x + 1) {\n            m_cur_span->len += (coord_type)len;\n        } else {\n            m_cur_span++;\n            m_cur_span->x      = (coord_type)(x + m_min_x);\n            m_cur_span->len    = (coord_type)len;\n            m_cur_span->covers = m_covers + x;\n        }\n        m_last_x = x + len - 1;\n    }\n    void add_span(int x, unsigned len, unsigned cover)\n    {\n        x -= m_min_x;\n        FXSYS_memset8(m_covers + x, cover, len);\n        if(x == m_last_x + 1) {\n            m_cur_span->len += (coord_type)len;\n        } else {\n            m_cur_span++;\n            m_cur_span->x      = (coord_type)(x + m_min_x);\n            m_cur_span->len    = (coord_type)len;\n            m_cur_span->covers = m_covers + x;\n        }\n        m_last_x = x + len - 1;\n    }\n    void finalize(int y)\n    {\n        m_y = y;\n    }\n    void reset_spans()\n    {\n        m_last_x    = 0x7FFFFFF0;\n        m_cur_span  = m_spans;\n    }\n    int      y()           const\n    {\n        return m_y;\n    }\n    unsigned num_spans()   const\n    {\n        return unsigned(m_cur_span - m_spans);\n    }\n    const_iterator begin() const\n    {\n        return m_spans + 1;\n    }\n    iterator       begin()\n    {\n        return m_spans + 1;\n    }\nprivate:\n    scanline_u(const self_type&);\n    const self_type& operator = (const self_type&);\nprivate:\n    int           m_min_x;\n    unsigned      m_max_len;\n    int           m_last_x;\n    int           m_y;\n    cover_type*   m_covers;\n    span*         m_spans;\n    span*         m_cur_span;\n};\ntypedef scanline_u<int8u> scanline_u8;\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/agg_shorten_path.h",
    "content": "\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n#ifndef AGG_SHORTEN_PATH_INCLUDED\n#define AGG_SHORTEN_PATH_INCLUDED\n#include \"agg_basics.h\"\n#include \"agg_vertex_sequence.h\"\nnamespace agg\n{\ntemplate<class VertexSequence>\nvoid shorten_path(VertexSequence& vs, FX_FLOAT s, unsigned closed = 0)\n{\n    typedef typename VertexSequence::value_type vertex_type;\n    if(s > 0 && vs.size() > 1) {\n        FX_FLOAT d;\n        int n = int(vs.size() - 2);\n        while(n) {\n            d = vs[n].dist;\n            if(d > s) {\n                break;\n            }\n            vs.remove_last();\n            s -= d;\n            --n;\n        }\n        if(vs.size() < 2) {\n            vs.remove_all();\n        } else {\n            n = vs.size() - 1;\n            vertex_type& prev = vs[n - 1];\n            vertex_type& last = vs[n];\n            d = (prev.dist - s) / prev.dist;\n            FX_FLOAT x = prev.x + (last.x - prev.x) * d;\n            FX_FLOAT y = prev.y + (last.y - prev.y) * d;\n            last.x = x;\n            last.y = y;\n            if(!prev(last)) {\n                vs.remove_last();\n            }\n            vs.close(closed != 0);\n        }\n    }\n}\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/agg_vcgen_dash.h",
    "content": "\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n//\n// Line dash generator\n//\n//----------------------------------------------------------------------------\n#ifndef AGG_VCGEN_DASH_INCLUDED\n#define AGG_VCGEN_DASH_INCLUDED\n#include \"agg_basics.h\"\n#include \"agg_vertex_sequence.h\"\nnamespace agg\n{\nclass vcgen_dash : public CFX_Object\n{\n    enum max_dashes_e {\n        max_dashes = 32\n    };\n    enum status_e {\n        initial,\n        ready,\n        polyline,\n        stop\n    };\npublic:\n    typedef vertex_sequence<vertex_dist, 6> vertex_storage;\n    vcgen_dash();\n    void remove_all_dashes();\n    void add_dash(FX_FLOAT dash_len, FX_FLOAT gap_len);\n    void dash_start(FX_FLOAT ds);\n    void shorten(FX_FLOAT s)\n    {\n        m_shorten = s;\n    }\n    double shorten() const\n    {\n        return m_shorten;\n    }\n    void remove_all();\n    void add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd);\n    void     rewind(unsigned path_id);\n    unsigned vertex(FX_FLOAT* x, FX_FLOAT* y);\nprivate:\n    vcgen_dash(const vcgen_dash&);\n    const vcgen_dash& operator = (const vcgen_dash&);\n    void calc_dash_start(FX_FLOAT ds);\n    FX_FLOAT     m_dashes[max_dashes];\n    FX_FLOAT\t\tm_total_dash_len;\n    unsigned        m_num_dashes;\n    FX_FLOAT     m_dash_start;\n    FX_FLOAT     m_shorten;\n    FX_FLOAT     m_curr_dash_start;\n    unsigned        m_curr_dash;\n    FX_FLOAT     m_curr_rest;\n    const vertex_dist* m_v1;\n    const vertex_dist* m_v2;\n    vertex_storage m_src_vertices;\n    unsigned       m_closed;\n    status_e       m_status;\n    unsigned       m_src_vertex;\n};\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/agg_vcgen_stroke.h",
    "content": "\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n#ifndef AGG_VCGEN_STROKE_INCLUDED\n#define AGG_VCGEN_STROKE_INCLUDED\n#include \"agg_math_stroke.h\"\nnamespace agg\n{\nclass vcgen_stroke : public CFX_Object\n{\n    enum status_e {\n        initial,\n        ready,\n        cap1,\n        cap2,\n        outline1,\n        close_first,\n        outline2,\n        out_vertices,\n        end_poly1,\n        end_poly2,\n        stop\n    };\npublic:\n    typedef vertex_sequence<vertex_dist_cmd, 6> vertex_storage;\n    typedef pod_deque<point_type, 6>        coord_storage;\n    vcgen_stroke();\n    void line_cap(line_cap_e lc)\n    {\n        m_line_cap = lc;\n    }\n    void line_join(line_join_e lj)\n    {\n        m_line_join = lj;\n    }\n    void inner_join(inner_join_e ij)\n    {\n        m_inner_join = ij;\n    }\n    line_cap_e   line_cap()   const\n    {\n        return m_line_cap;\n    }\n    line_join_e  line_join()  const\n    {\n        return m_line_join;\n    }\n    inner_join_e inner_join() const\n    {\n        return m_inner_join;\n    }\n    void width(FX_FLOAT w)\n    {\n        m_width = w / 2;\n    }\n    void miter_limit(FX_FLOAT ml)\n    {\n        m_miter_limit = ml;\n    }\n    void miter_limit_theta(FX_FLOAT t);\n    void inner_miter_limit(FX_FLOAT ml)\n    {\n        m_inner_miter_limit = ml;\n    }\n    void approximation_scale(FX_FLOAT as)\n    {\n        m_approx_scale = as;\n    }\n    FX_FLOAT width() const\n    {\n        return m_width * 2;\n    }\n    FX_FLOAT miter_limit() const\n    {\n        return m_miter_limit;\n    }\n    FX_FLOAT inner_miter_limit() const\n    {\n        return m_inner_miter_limit;\n    }\n    FX_FLOAT approximation_scale() const\n    {\n        return m_approx_scale;\n    }\n    void remove_all();\n    void add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd);\n    void     rewind(unsigned path_id);\n    unsigned vertex(FX_FLOAT* x, FX_FLOAT* y);\nprivate:\n    vcgen_stroke(const vcgen_stroke&);\n    const vcgen_stroke& operator = (const vcgen_stroke&);\n    vertex_storage m_src_vertices;\n    coord_storage  m_out_vertices;\n    FX_FLOAT         m_width;\n    FX_FLOAT         m_miter_limit;\n    FX_FLOAT         m_inner_miter_limit;\n    FX_FLOAT         m_approx_scale;\n    line_cap_e     m_line_cap;\n    line_join_e    m_line_join;\n    inner_join_e   m_inner_join;\n    unsigned       m_closed;\n    status_e       m_status;\n    status_e       m_prev_status;\n    unsigned       m_src_vertex;\n    unsigned       m_out_vertex;\n};\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/agg_vertex_sequence.h",
    "content": "\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n//\n// vertex_sequence container and vertex_dist struct\n//\n//----------------------------------------------------------------------------\n#ifndef AGG_VERTEX_SEQUENCE_INCLUDED\n#define AGG_VERTEX_SEQUENCE_INCLUDED\n#include \"agg_basics.h\"\n#include \"agg_array.h\"\n#include \"agg_math.h\"\nnamespace agg\n{\ntemplate<class T, unsigned S = 6>\nclass vertex_sequence : public pod_deque<T, S>\n{\npublic:\n    typedef pod_deque<T, S> base_type;\n    void add(const T& val);\n    void modify_last(const T& val);\n    void close(bool remove_flag);\n};\ntemplate<class T, unsigned S>\nvoid vertex_sequence<T, S>::add(const T& val)\n{\n    if(base_type::size() > 1) {\n        if(!(*this)[base_type::size() - 2]((*this)[base_type::size() - 1])) {\n            base_type::remove_last();\n        }\n    }\n    base_type::add(val);\n}\ntemplate<class T, unsigned S>\nvoid vertex_sequence<T, S>::modify_last(const T& val)\n{\n    base_type::remove_last();\n    add(val);\n}\ntemplate<class T, unsigned S>\nvoid vertex_sequence<T, S>::close(bool closed)\n{\n    while(base_type::size() > 1) {\n        if((*this)[base_type::size() - 2]((*this)[base_type::size() - 1])) {\n            break;\n        }\n        T t = (*this)[base_type::size() - 1];\n        base_type::remove_last();\n        modify_last(t);\n    }\n    if(closed) {\n        while(base_type::size() > 1) {\n            if((*this)[base_type::size() - 1]((*this)[0])) {\n                break;\n            }\n            base_type::remove_last();\n        }\n    }\n}\nconst FX_FLOAT vertex_dist_epsilon = 1e-14f;\nstruct vertex_dist : public CFX_Object {\n    FX_FLOAT   x;\n    FX_FLOAT   y;\n    FX_FLOAT   dist;\n    vertex_dist() {}\n    vertex_dist(FX_FLOAT x_, FX_FLOAT y_) :\n        x(x_),\n        y(y_),\n        dist(0)\n    {\n    }\n    bool operator () (const vertex_dist& val)\n    {\n        bool ret = (dist = calc_distance(x, y, val.x, val.y)) > vertex_dist_epsilon;\n        return ret;\n    }\n};\nstruct vertex_dist_cmd : public vertex_dist {\n    unsigned cmd;\n    vertex_dist_cmd() {}\n    vertex_dist_cmd(FX_FLOAT x_, FX_FLOAT y_, unsigned cmd_) :\n        vertex_dist(x_, y_),\n        cmd(cmd_)\n    {\n    }\n};\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/fx_agg_curves.cpp",
    "content": "\n//----------------------------------------------------------------------------\n// XYQ: 2006-01-22 Copied from AGG project.\n// TODO: This file uses intensive floating point operations, so it's NOT suitable\n// for platforms like Symbian OS. We need to change to FIX format.\n//----------------------------------------------------------------------------\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n#include \"../../../../include/fxcrt/fx_basic.h\"\n#include \"agg_curves.h\"\n#include \"agg_math.h\"\nnamespace agg\n{\nconst FX_FLOAT curve_collinearity_epsilon              = 1e-30f;\nenum curve_recursion_limit_e { curve_recursion_limit = 16 };\nvoid curve4_div::init(FX_FLOAT x1, FX_FLOAT y1,\n                      FX_FLOAT x2, FX_FLOAT y2,\n                      FX_FLOAT x3, FX_FLOAT y3,\n                      FX_FLOAT x4, FX_FLOAT y4)\n{\n    m_points.remove_all();\n    m_distance_tolerance_square = 1.0f / 4;\n    m_distance_tolerance_manhattan = 1.0f * 4;\n    bezier(x1, y1, x2, y2, x3, y3, x4, y4);\n    m_count = 0;\n}\nvoid curve4_div::recursive_bezier(FX_FLOAT x1, FX_FLOAT y1,\n                                  FX_FLOAT x2, FX_FLOAT y2,\n                                  FX_FLOAT x3, FX_FLOAT y3,\n                                  FX_FLOAT x4, FX_FLOAT y4,\n                                  unsigned level)\n{\n    if(level > curve_recursion_limit) {\n        return;\n    }\n    FX_FLOAT x12   = (x1 + x2) / 2;\n    FX_FLOAT y12   = (y1 + y2) / 2;\n    FX_FLOAT x23   = (x2 + x3) / 2;\n    FX_FLOAT y23   = (y2 + y3) / 2;\n    FX_FLOAT x34   = (x3 + x4) / 2;\n    FX_FLOAT y34   = (y3 + y4) / 2;\n    FX_FLOAT x123  = (x12 + x23) / 2;\n    FX_FLOAT y123  = (y12 + y23) / 2;\n    FX_FLOAT x234  = (x23 + x34) / 2;\n    FX_FLOAT y234  = (y23 + y34) / 2;\n    FX_FLOAT x1234 = (x123 + x234) / 2;\n    FX_FLOAT y1234 = (y123 + y234) / 2;\n    FX_FLOAT dx = x4 - x1;\n    FX_FLOAT dy = y4 - y1;\n    FX_FLOAT d2 = FXSYS_fabs(FXSYS_Mul(x2 - x4, dy) - FXSYS_Mul(y2 - y4, dx));\n    FX_FLOAT d3 = FXSYS_fabs(FXSYS_Mul(x3 - x4, dy) - FXSYS_Mul(y3 - y4, dx));\n    switch((int(d2 > curve_collinearity_epsilon) << 1) +\n            int(d3 > curve_collinearity_epsilon)) {\n        case 0:\n            if(FXSYS_fabs(x1 + x3 - x2 - x2) +\n                    FXSYS_fabs(y1 + y3 - y2 - y2) +\n                    FXSYS_fabs(x2 + x4 - x3 - x3) +\n                    FXSYS_fabs(y2 + y4 - y3 - y3) <= m_distance_tolerance_manhattan) {\n                m_points.add(point_type(x1234, y1234, path_flags_jr));\n                return;\n            }\n            break;\n        case 1:\n            if(FXSYS_Mul(d3, d3) <= FXSYS_Mul(m_distance_tolerance_square,\n                                              FXSYS_Mul(dx, dx) + FXSYS_Mul(dy, dy))) {\n                m_points.add(point_type(x23, y23, path_flags_jr));\n                return;\n            }\n            break;\n        case 2:\n            if(FXSYS_Mul(d2, d2) <= FXSYS_Mul(m_distance_tolerance_square,\n                                              FXSYS_Mul(dx, dx) + FXSYS_Mul(dy, dy))) {\n                m_points.add(point_type(x23, y23, path_flags_jr));\n                return;\n            }\n            break;\n        case 3:\n            if(FXSYS_Mul(d2 + d3, d2 + d3) <= FXSYS_Mul(m_distance_tolerance_square,\n                    FXSYS_Mul(dx, dx) + FXSYS_Mul(dy, dy))) {\n                m_points.add(point_type(x23, y23, path_flags_jr));\n                return;\n            }\n            break;\n    }\n    recursive_bezier(x1, y1, x12, y12, x123, y123, x1234, y1234, level + 1);\n    recursive_bezier(x1234, y1234, x234, y234, x34, y34, x4, y4, level + 1);\n}\nvoid curve4_div::bezier(FX_FLOAT x1, FX_FLOAT y1,\n                        FX_FLOAT x2, FX_FLOAT y2,\n                        FX_FLOAT x3, FX_FLOAT y3,\n                        FX_FLOAT x4, FX_FLOAT y4)\n{\n    m_points.add(point_type(x1, y1));\n    recursive_bezier(x1, y1, x2, y2, x3, y3, x4, y4, 0);\n    m_points.add(point_type(x4, y4));\n}\n}\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/fx_agg_driver.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../../include/fxge/fx_ge.h\"\n#include \"../../dib/dib_int.h\"\n#include \"../../ge/text_int.h\"\n#include \"../../../../include/fxcodec/fx_codec.h\"\n#include \"agg_pixfmt_gray.h\"\n#include \"agg_path_storage.h\"\n#include \"agg_scanline_u.h\"\n#include \"agg_rasterizer_scanline_aa.h\"\n#include \"agg_renderer_scanline.h\"\n#include \"agg_curves.h\"\n#include \"agg_conv_stroke.h\"\n#include \"agg_conv_dash.h\"\n#include \"../include/fx_agg_driver.h\"\nvoid _HardClip(FX_FLOAT& x, FX_FLOAT& y)\n{\n    if (x > 50000) {\n        x = 50000;\n    }\n    if (x < -50000) {\n        x = -50000;\n    }\n    if (y > 50000) {\n        y = 50000;\n    }\n    if (y < -50000) {\n        y = -50000;\n    }\n}\nvoid CAgg_PathData::BuildPath(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device)\n{\n    int nPoints = pPathData->GetPointCount();\n    FX_PATHPOINT* pPoints = pPathData->GetPoints();\n    for (int i = 0; i < nPoints; i ++) {\n        FX_FLOAT x = pPoints[i].m_PointX, y = pPoints[i].m_PointY;\n        if (pObject2Device) {\n            pObject2Device->Transform(x, y);\n        }\n        _HardClip(x, y);\n        int point_type = pPoints[i].m_Flag & FXPT_TYPE;\n        if (point_type == FXPT_MOVETO) {\n            m_PathData.move_to(x, y);\n        } else if (point_type == FXPT_LINETO) {\n            if (pPoints[i - 1].m_Flag == FXPT_MOVETO && (i == nPoints - 1 || pPoints[i + 1].m_Flag == FXPT_MOVETO) &&\n                    pPoints[i].m_PointX == pPoints[i - 1].m_PointX && pPoints[i].m_PointY == pPoints[i - 1].m_PointY) {\n                x += 1;\n            }\n            m_PathData.line_to(x, y);\n        } else if (point_type == FXPT_BEZIERTO) {\n            FX_FLOAT x0 = pPoints[i - 1].m_PointX, y0 = pPoints[i - 1].m_PointY;\n            FX_FLOAT x2 = pPoints[i + 1].m_PointX, y2 = pPoints[i + 1].m_PointY;\n            FX_FLOAT x3 = pPoints[i + 2].m_PointX, y3 = pPoints[i + 2].m_PointY;\n            if (pObject2Device) {\n                pObject2Device->Transform(x0, y0);\n                pObject2Device->Transform(x2, y2);\n                pObject2Device->Transform(x3, y3);\n            }\n            agg::curve4 curve(x0, y0, x, y, x2, y2, x3, y3);\n            i += 2;\n            m_PathData.add_path_curve(curve);\n        }\n        if (pPoints[i].m_Flag & FXPT_CLOSEFIGURE) {\n            m_PathData.end_poly();\n        }\n    }\n}\nnamespace agg\n{\ntemplate<class BaseRenderer> class renderer_scanline_aa_offset\n{\npublic:\n    typedef BaseRenderer base_ren_type;\n    typedef typename base_ren_type::color_type color_type;\n    renderer_scanline_aa_offset(base_ren_type& ren, unsigned left, unsigned top) :\n        m_ren(&ren), m_left(left), m_top(top)\n    {}\n    void color(const color_type& c)\n    {\n        m_color = c;\n    }\n    const color_type& color() const\n    {\n        return m_color;\n    }\n    void prepare(unsigned) {}\n    template<class Scanline> void render(const Scanline& sl)\n    {\n        int y = sl.y();\n        unsigned num_spans = sl.num_spans();\n        typename Scanline::const_iterator span = sl.begin();\n        for(;;) {\n            int x = span->x;\n            if(span->len > 0) {\n                m_ren->blend_solid_hspan(x - m_left, y - m_top, (unsigned)span->len,\n                                         m_color,\n                                         span->covers);\n            } else {\n                m_ren->blend_hline(x - m_left, y - m_top, (unsigned)(x - span->len - 1),\n                                   m_color,\n                                   *(span->covers));\n            }\n            if(--num_spans == 0) {\n                break;\n            }\n            ++span;\n        }\n    }\nprivate:\n    base_ren_type* m_ren;\n    color_type m_color;\n    unsigned m_left, m_top;\n};\n}\nstatic void RasterizeStroke(agg::rasterizer_scanline_aa& rasterizer, agg::path_storage& path_data,\n                            const CFX_AffineMatrix* pObject2Device,\n                            const CFX_GraphStateData* pGraphState, FX_FLOAT scale = 1.0f,\n                            FX_BOOL bStrokeAdjust = FALSE, FX_BOOL bTextMode = FALSE)\n{\n    agg::line_cap_e cap;\n    switch (pGraphState->m_LineCap) {\n        case CFX_GraphStateData::LineCapRound:\n            cap = agg::round_cap;\n            break;\n        case CFX_GraphStateData::LineCapSquare:\n            cap = agg::square_cap;\n            break;\n        default:\n            cap = agg::butt_cap;\n            break;\n    }\n    agg::line_join_e join;\n    switch (pGraphState->m_LineJoin) {\n        case CFX_GraphStateData::LineJoinRound:\n            join = agg::round_join;\n            break;\n        case CFX_GraphStateData::LineJoinBevel:\n            join = agg::bevel_join;\n            break;\n        default:\n            join = agg::miter_join_revert;\n            break;\n    }\n    FX_FLOAT width = pGraphState->m_LineWidth * scale;\n    FX_FLOAT unit = 1.f;\n    if (pObject2Device) {\n        unit = FXSYS_Div(1.0f, (pObject2Device->GetXUnit() + pObject2Device->GetYUnit()) / 2);\n    }\n    if (width < unit) {\n        width = unit;\n    }\n    if (pGraphState->m_DashArray == NULL) {\n        agg::conv_stroke<agg::path_storage> stroke(path_data);\n        stroke.line_join(join);\n        stroke.line_cap(cap);\n        stroke.miter_limit(pGraphState->m_MiterLimit);\n        stroke.width(width);\n        rasterizer.add_path_transformed(stroke, pObject2Device);\n    } else {\n        typedef agg::conv_dash<agg::path_storage> dash_converter;\n        dash_converter dash(path_data);\n        for (int i = 0; i < (pGraphState->m_DashCount + 1) / 2; i ++) {\n            FX_FLOAT on = pGraphState->m_DashArray[i * 2];\n            if (on <= 0.000001f) {\n                on = 1.0f / 10;\n            }\n            FX_FLOAT off = i * 2 + 1 == pGraphState->m_DashCount ? on :\n                           pGraphState->m_DashArray[i * 2 + 1];\n            if (off < 0) {\n                off = 0;\n            }\n            dash.add_dash(on * scale, off * scale);\n        }\n        dash.dash_start(pGraphState->m_DashPhase * scale);\n        typedef agg::conv_stroke<dash_converter> dash_stroke;\n        dash_stroke stroke(dash);\n        stroke.line_join(join);\n        stroke.line_cap(cap);\n        stroke.miter_limit(pGraphState->m_MiterLimit);\n        stroke.width(width);\n        rasterizer.add_path_transformed(stroke, pObject2Device);\n    }\n}\nIFX_RenderDeviceDriver* IFX_RenderDeviceDriver::CreateFxgeDriver(CFX_DIBitmap* pBitmap, FX_BOOL bRgbByteOrder, CFX_DIBitmap* pOriDevice, FX_BOOL bGroupKnockout)\n{\n    return FX_NEW CFX_AggDeviceDriver(pBitmap, 0, bRgbByteOrder, pOriDevice, bGroupKnockout);\n}\nCFX_AggDeviceDriver::CFX_AggDeviceDriver(CFX_DIBitmap* pBitmap, int dither_bits, FX_BOOL bRgbByteOrder, CFX_DIBitmap* pOriDevice, FX_BOOL bGroupKnockout)\n{\n    m_pBitmap = pBitmap;\n    m_DitherBits = dither_bits;\n    m_pClipRgn = NULL;\n    m_pPlatformBitmap = NULL;\n    m_pPlatformGraphics = NULL;\n    m_pDwRenderTartget = NULL;\n    m_bRgbByteOrder = bRgbByteOrder;\n    m_pOriDevice = pOriDevice;\n    m_bGroupKnockout = bGroupKnockout;\n    m_FillFlags = 0;\n    InitPlatform();\n}\nCFX_AggDeviceDriver::~CFX_AggDeviceDriver()\n{\n    if (m_pClipRgn) {\n        delete m_pClipRgn;\n    }\n    for (int i = 0; i < m_StateStack.GetSize(); i ++)\n        if (m_StateStack[i]) {\n            delete (CFX_ClipRgn*)m_StateStack[i];\n        }\n    DestroyPlatform();\n}\n#if ((_FXM_PLATFORM_  != _FXM_PLATFORM_APPLE_)|| defined(_FPDFAPI_MINI_))\nvoid CFX_AggDeviceDriver::InitPlatform()\n{\n}\nvoid CFX_AggDeviceDriver::DestroyPlatform()\n{\n}\nFX_BOOL CFX_AggDeviceDriver::DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,\n        CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,\n        int alpha_flag, void* pIccTransform)\n{\n    return FALSE;\n}\n#endif\nint CFX_AggDeviceDriver::GetDeviceCaps(int caps_id)\n{\n    switch (caps_id) {\n        case FXDC_DEVICE_CLASS:\n            return FXDC_DISPLAY;\n        case FXDC_PIXEL_WIDTH:\n            return m_pBitmap->GetWidth();\n        case FXDC_PIXEL_HEIGHT:\n            return m_pBitmap->GetHeight();\n        case FXDC_BITS_PIXEL:\n            return m_pBitmap->GetBPP();\n        case FXDC_HORZ_SIZE:\n        case FXDC_VERT_SIZE:\n            return 0;\n        case FXDC_RENDER_CAPS: {\n                int flags = FXRC_GET_BITS | FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE | FXRC_BLEND_MODE | FXRC_SOFT_CLIP;\n                if (m_pBitmap->HasAlpha()) {\n                    flags |= FXRC_ALPHA_OUTPUT;\n                } else if (m_pBitmap->IsAlphaMask()) {\n                    if (m_pBitmap->GetBPP() == 1) {\n                        flags |= FXRC_BITMASK_OUTPUT;\n                    } else {\n                        flags |= FXRC_BYTEMASK_OUTPUT;\n                    }\n                }\n                if (m_pBitmap->IsCmykImage()) {\n                    flags |= FXRC_CMYK_OUTPUT;\n                }\n                return flags;\n            }\n        case FXDC_DITHER_BITS:\n            return m_DitherBits;\n    }\n    return 0;\n}\nvoid CFX_AggDeviceDriver::SaveState()\n{\n    void* pClip = NULL;\n    if (m_pClipRgn) {\n        pClip = FX_NEW CFX_ClipRgn(*m_pClipRgn);\n        if (!pClip) {\n            return;\n        }\n    }\n    m_StateStack.Add(pClip);\n}\nvoid CFX_AggDeviceDriver::RestoreState(FX_BOOL bKeepSaved)\n{\n    if (m_StateStack.GetSize() == 0) {\n        if (m_pClipRgn) {\n            delete m_pClipRgn;\n            m_pClipRgn = NULL;\n        }\n        return;\n    }\n    CFX_ClipRgn* pSavedClip = (CFX_ClipRgn*)m_StateStack[m_StateStack.GetSize() - 1];\n    if (m_pClipRgn) {\n        delete m_pClipRgn;\n        m_pClipRgn = NULL;\n    }\n    if (bKeepSaved) {\n        if (pSavedClip) {\n            m_pClipRgn = FX_NEW CFX_ClipRgn(*pSavedClip);\n        }\n    } else {\n        m_StateStack.RemoveAt(m_StateStack.GetSize() - 1);\n        m_pClipRgn = pSavedClip;\n    }\n}\nvoid CFX_AggDeviceDriver::SetClipMask(agg::rasterizer_scanline_aa& rasterizer)\n{\n    FX_RECT path_rect(rasterizer.min_x(), rasterizer.min_y(),\n                      rasterizer.max_x() + 1, rasterizer.max_y() + 1);\n    path_rect.Intersect(m_pClipRgn->GetBox());\n    CFX_DIBitmapRef mask;\n    CFX_DIBitmap* pThisLayer = mask.New();\n    if (!pThisLayer) {\n        return;\n    }\n    pThisLayer->Create(path_rect.Width(), path_rect.Height(), FXDIB_8bppMask);\n    pThisLayer->Clear(0);\n    agg::rendering_buffer raw_buf(pThisLayer->GetBuffer(), pThisLayer->GetWidth(), pThisLayer->GetHeight(), pThisLayer->GetPitch());\n    agg::pixfmt_gray8 pixel_buf(raw_buf);\n    agg::renderer_base<agg::pixfmt_gray8> base_buf(pixel_buf);\n    agg::renderer_scanline_aa_offset<agg::renderer_base<agg::pixfmt_gray8> > final_render(base_buf, path_rect.left, path_rect.top);\n    final_render.color(agg::gray8(255));\n    agg::scanline_u8 scanline;\n    agg::render_scanlines(rasterizer, scanline, final_render, (m_FillFlags & FXFILL_NOPATHSMOOTH) != 0);\n    m_pClipRgn->IntersectMaskF(path_rect.left, path_rect.top, mask);\n}\nFX_BOOL CFX_AggDeviceDriver::SetClip_PathFill(const CFX_PathData* pPathData,\n        const CFX_AffineMatrix* pObject2Device,\n        int fill_mode\n                                             )\n{\n    m_FillFlags = fill_mode;\n    if (m_pClipRgn == NULL) {\n        m_pClipRgn = FX_NEW CFX_ClipRgn(GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT));\n        if (!m_pClipRgn) {\n            return FALSE;\n        }\n    }\n    if (pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) {\n        CFX_FloatRect rectf;\n        if (pPathData->IsRect(pObject2Device, &rectf)) {\n            rectf.Intersect(CFX_FloatRect(0, 0, (FX_FLOAT)GetDeviceCaps(FXDC_PIXEL_WIDTH), (FX_FLOAT)GetDeviceCaps(FXDC_PIXEL_HEIGHT)));\n            FX_RECT rect = rectf.GetOutterRect();\n            m_pClipRgn->IntersectRect(rect);\n            return TRUE;\n        }\n    }\n    CAgg_PathData path_data;\n    path_data.BuildPath(pPathData, pObject2Device);\n    path_data.m_PathData.end_poly();\n    agg::rasterizer_scanline_aa rasterizer;\n    rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT)));\n    rasterizer.add_path(path_data.m_PathData);\n    rasterizer.filling_rule((fill_mode & 3) == FXFILL_WINDING ? agg::fill_non_zero : agg::fill_even_odd);\n    SetClipMask(rasterizer);\n    return TRUE;\n}\nFX_BOOL CFX_AggDeviceDriver::SetClip_PathStroke(const CFX_PathData* pPathData,\n        const CFX_AffineMatrix* pObject2Device,\n        const CFX_GraphStateData* pGraphState\n                                               )\n{\n    if (m_pClipRgn == NULL) {\n        m_pClipRgn = FX_NEW CFX_ClipRgn(GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT));\n        if (!m_pClipRgn) {\n            return FALSE;\n        }\n    }\n    CAgg_PathData path_data;\n    path_data.BuildPath(pPathData, NULL);\n    agg::rasterizer_scanline_aa rasterizer;\n    rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT)));\n    RasterizeStroke(rasterizer, path_data.m_PathData, pObject2Device, pGraphState);\n    rasterizer.filling_rule(agg::fill_non_zero);\n    SetClipMask(rasterizer);\n    return TRUE;\n}\nclass CFX_Renderer : public CFX_Object\n{\nprivate:\n    int\t\t\tm_Alpha,\n                m_Red,\n                m_Green,\n                m_Blue,\n                m_Gray;\n    FX_DWORD\tm_Color;\n    FX_BOOL\t\tm_bFullCover;\n    FX_BOOL     m_bRgbByteOrder;\n    CFX_DIBitmap* m_pOriDevice;\n    FX_RECT\t\tm_ClipBox;\n    const CFX_DIBitmap*\tm_pClipMask;\n    CFX_DIBitmap*\tm_pDevice;\n    const CFX_ClipRgn* m_pClipRgn;\n    void (CFX_Renderer::*composite_span)(FX_LPBYTE, int, int, int, FX_LPBYTE, int, int, FX_LPBYTE, FX_LPBYTE);\npublic:\n    void prepare(unsigned) {}\n    void CompositeSpan(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan, int Bpp, FX_BOOL bDestAlpha,\n                       int span_left, int span_len, FX_LPBYTE cover_scan,\n                       int clip_left, int clip_right, FX_LPBYTE clip_scan)\n    {\n        ASSERT(!m_pDevice->IsCmykImage());\n        int col_start = span_left < clip_left ? clip_left - span_left : 0;\n        int col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n        if (Bpp) {\n            dest_scan += col_start * Bpp;\n            ori_scan += col_start * Bpp;\n        } else {\n            dest_scan += col_start / 8;\n            ori_scan += col_start / 8;\n        }\n        if (m_bRgbByteOrder) {\n            if (Bpp == 4 && bDestAlpha) {\n                for (int col = col_start; col < col_end; col ++) {\n                    int src_alpha;\n                    if (clip_scan) {\n                        src_alpha = m_Alpha * clip_scan[col] / 255;\n                    } else {\n                        src_alpha = m_Alpha;\n                    }\n                    FX_BYTE dest_alpha = ori_scan[3] + src_alpha - ori_scan[3] * src_alpha / 255;\n                    dest_scan[3] = dest_alpha;\n                    int alpha_ratio = src_alpha * 255 / dest_alpha;\n                    if (m_bFullCover) {\n                        *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, alpha_ratio);\n                        *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, alpha_ratio);\n                        *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, alpha_ratio);\n                        dest_scan++;\n                        ori_scan++;\n                    } else {\n                        int r = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, alpha_ratio);\n                        int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, alpha_ratio);\n                        int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, alpha_ratio);\n                        ori_scan ++;\n                        *dest_scan = FXDIB_ALPHA_MERGE( *dest_scan, r, cover_scan[col]);\n                        dest_scan ++;\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan[col]);\n                        dest_scan ++;\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, b, cover_scan[col]);\n                        dest_scan += 2;\n                    }\n                }\n                return;\n            } else if (Bpp == 3 || Bpp == 4) {\n                for (int col = col_start; col < col_end; col ++) {\n                    int src_alpha;\n                    if (clip_scan) {\n                        src_alpha = m_Alpha * clip_scan[col] / 255 ;\n                    } else {\n                        src_alpha = m_Alpha;\n                    }\n                    int r = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, src_alpha);\n                    int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha);\n                    int b = FXDIB_ALPHA_MERGE(*ori_scan, m_Blue, src_alpha);\n                    ori_scan += Bpp - 2;\n                    *dest_scan = FXDIB_ALPHA_MERGE( *dest_scan, r, cover_scan[col]);\n                    dest_scan ++;\n                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan[col]);\n                    dest_scan ++;\n                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, b, cover_scan[col]);\n                    dest_scan += Bpp - 2;\n                }\n            }\n            return;\n        }\n        if (Bpp == 4 && bDestAlpha) {\n            for (int col = col_start; col < col_end; col ++) {\n                int src_alpha;\n                if (clip_scan) {\n                    src_alpha = m_Alpha * clip_scan[col] / 255;\n                } else {\n                    src_alpha = m_Alpha;\n                }\n                int src_alpha_covered = src_alpha * cover_scan[col] / 255;\n                if (src_alpha_covered == 0) {\n                    dest_scan += 4;\n                    continue;\n                }\n                if (cover_scan[col] == 255) {\n                    dest_scan[3] = src_alpha_covered;\n                    *dest_scan ++ = m_Blue;\n                    *dest_scan ++ = m_Green;\n                    *dest_scan = m_Red;\n                    dest_scan += 2;\n                    continue;\n                } else {\n                    if (dest_scan[3] == 0) {\n                        dest_scan[3] = src_alpha_covered;\n                        *dest_scan ++ = m_Blue;\n                        *dest_scan ++ = m_Green;\n                        *dest_scan = m_Red;\n                        dest_scan += 2;\n                        continue;\n                    }\n                    FX_BYTE cover = cover_scan[col];\n                    dest_scan[3] = FXDIB_ALPHA_MERGE(dest_scan[3], src_alpha, cover);\n                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, cover);\n                    dest_scan ++;\n                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, cover);\n                    dest_scan ++;\n                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, cover);\n                    dest_scan += 2;\n                }\n            }\n            return;\n        } else if (Bpp == 3 || Bpp == 4) {\n            for (int col = col_start; col < col_end; col ++) {\n                int src_alpha;\n                if (clip_scan) {\n                    src_alpha = m_Alpha * clip_scan[col] / 255;\n                } else {\n                    src_alpha = m_Alpha;\n                }\n                if (m_bFullCover) {\n                    *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha);\n                    *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha);\n                    *dest_scan = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_alpha);\n                    dest_scan += Bpp - 2;\n                    ori_scan += Bpp - 2;\n                    continue;\n                }\n                int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha);\n                int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha);\n                int r = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_alpha);\n                ori_scan += Bpp - 2;\n                *dest_scan = FXDIB_ALPHA_MERGE( *dest_scan, b, cover_scan[col]);\n                dest_scan ++;\n                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan[col]);\n                dest_scan ++;\n                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan[col]);\n                dest_scan += Bpp - 2;\n                continue;\n            }\n            return;\n        } else if (Bpp == 1) {\n            for (int col = col_start; col < col_end; col ++) {\n                int src_alpha;\n                if (clip_scan) {\n                    src_alpha = m_Alpha * clip_scan[col] / 255;\n                } else {\n                    src_alpha = m_Alpha;\n                }\n                if (m_bFullCover) {\n                    *dest_scan = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray, src_alpha);\n                } else {\n                    int gray = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray, src_alpha);\n                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, cover_scan[col]);\n                    dest_scan++;\n                }\n            }\n        } else {\n            int index = 0;\n            if (m_pDevice->GetPalette() == NULL) {\n                index = ((FX_BYTE)m_Color == 0xff) ? 1 : 0;\n            } else {\n                for (int i = 0; i < 2; i ++)\n                    if (FXARGB_TODIB(m_pDevice->GetPalette()[i]) == m_Color) {\n                        index = i;\n                    }\n            }\n            FX_LPBYTE dest_scan1 = dest_scan;\n            for (int col = col_start; col < col_end; col ++) {\n                int src_alpha;\n                if (clip_scan) {\n                    src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;\n                } else {\n                    src_alpha = m_Alpha * cover_scan[col] / 255;\n                }\n                if (src_alpha) {\n                    if (!index) {\n                        *dest_scan1 &= ~(1 << (7 - (col + span_left) % 8));\n                    } else {\n                        *dest_scan1 |= 1 << (7 - (col + span_left) % 8);\n                    }\n                }\n                dest_scan1 = dest_scan + (span_left % 8 + col - col_start + 1) / 8;\n            }\n        }\n    }\n    void CompositeSpan1bpp(FX_LPBYTE dest_scan, int Bpp,\n                           int span_left, int span_len, FX_LPBYTE cover_scan,\n                           int clip_left, int clip_right, FX_LPBYTE clip_scan,\n                           FX_LPBYTE dest_extra_alpha_scan)\n    {\n        ASSERT(!m_bRgbByteOrder);\n        ASSERT(!m_pDevice->IsCmykImage());\n        int col_start = span_left < clip_left ? clip_left - span_left : 0;\n        int col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n        dest_scan += col_start / 8;\n        int index = 0;\n        if (m_pDevice->GetPalette() == NULL) {\n            index = ((FX_BYTE)m_Color == 0xff) ? 1 : 0;\n        } else {\n            for (int i = 0; i < 2; i ++)\n                if (FXARGB_TODIB(m_pDevice->GetPalette()[i]) == m_Color) {\n                    index = i;\n                }\n        }\n        FX_LPBYTE dest_scan1 = dest_scan;\n        for (int col = col_start; col < col_end; col ++) {\n            int src_alpha;\n            if (clip_scan) {\n                src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;\n            } else {\n                src_alpha = m_Alpha * cover_scan[col] / 255;\n            }\n            if (src_alpha) {\n                if (!index) {\n                    *dest_scan1 &= ~(1 << (7 - (col + span_left) % 8));\n                } else {\n                    *dest_scan1 |= 1 << (7 - (col + span_left) % 8);\n                }\n            }\n            dest_scan1 = dest_scan + (span_left % 8 + col - col_start + 1) / 8;\n        }\n    }\n    void CompositeSpanGray(FX_LPBYTE dest_scan, int Bpp,\n                           int span_left, int span_len, FX_LPBYTE cover_scan,\n                           int clip_left, int clip_right, FX_LPBYTE clip_scan,\n                           FX_LPBYTE dest_extra_alpha_scan)\n    {\n        ASSERT(!m_bRgbByteOrder);\n        int col_start = span_left < clip_left ? clip_left - span_left : 0;\n        int col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n        dest_scan += col_start;\n        if (dest_extra_alpha_scan) {\n            for (int col = col_start; col < col_end; col ++) {\n                int src_alpha;\n                if (m_bFullCover) {\n                    if (clip_scan) {\n                        src_alpha = m_Alpha * clip_scan[col] / 255;\n                    } else {\n                        src_alpha = m_Alpha;\n                    }\n                } else {\n                    if (clip_scan) {\n                        src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;\n                    } else {\n                        src_alpha = m_Alpha * cover_scan[col] / 255;\n                    }\n                }\n                if (src_alpha) {\n                    if (src_alpha == 255) {\n                        *dest_scan = m_Gray;\n                        *dest_extra_alpha_scan = m_Alpha;\n                    } else {\n                        FX_BYTE dest_alpha = (*dest_extra_alpha_scan) + src_alpha -\n                                             (*dest_extra_alpha_scan) * src_alpha / 255;\n                        *dest_extra_alpha_scan++ = dest_alpha;\n                        int alpha_ratio = src_alpha * 255 / dest_alpha;\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, alpha_ratio);\n                        dest_scan ++;\n                        continue;\n                    }\n                }\n                dest_extra_alpha_scan ++;\n                dest_scan ++;\n            }\n        } else {\n            for (int col = col_start; col < col_end; col ++) {\n                int src_alpha;\n                if (clip_scan) {\n                    src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;\n                } else {\n                    src_alpha = m_Alpha * cover_scan[col] / 255;\n                }\n                if (src_alpha) {\n                    if (src_alpha == 255) {\n                        *dest_scan = m_Gray;\n                    } else {\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, src_alpha);\n                    }\n                }\n                dest_scan ++;\n            }\n        }\n    }\n    void CompositeSpanARGB(FX_LPBYTE dest_scan, int Bpp,\n                           int span_left, int span_len, FX_LPBYTE cover_scan,\n                           int clip_left, int clip_right, FX_LPBYTE clip_scan,\n                           FX_LPBYTE dest_extra_alpha_scan)\n    {\n        int col_start = span_left < clip_left ? clip_left - span_left : 0;\n        int col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n        dest_scan += col_start * Bpp;\n        if (m_bRgbByteOrder) {\n            for (int col = col_start; col < col_end; col ++) {\n                int src_alpha;\n                if (m_bFullCover) {\n                    if (clip_scan) {\n                        src_alpha = m_Alpha * clip_scan[col] / 255;\n                    } else {\n                        src_alpha = m_Alpha;\n                    }\n                } else {\n                    if (clip_scan) {\n                        src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;\n                    } else {\n                        src_alpha = m_Alpha * cover_scan[col] / 255;\n                    }\n                }\n                if (src_alpha) {\n                    if (src_alpha == 255) {\n                        *(FX_DWORD*)dest_scan = m_Color;\n                    } else {\n                        FX_BYTE dest_alpha = dest_scan[3] + src_alpha - dest_scan[3] * src_alpha / 255;\n                        dest_scan[3] = dest_alpha;\n                        int alpha_ratio = src_alpha * 255 / dest_alpha;\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);\n                        dest_scan ++;\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);\n                        dest_scan ++;\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);\n                        dest_scan += 2;\n                        continue;\n                    }\n                }\n                dest_scan += 4;\n            }\n            return;\n        }\n        for (int col = col_start; col < col_end; col ++) {\n            int src_alpha;\n            if (m_bFullCover) {\n                if (clip_scan) {\n                    src_alpha = m_Alpha * clip_scan[col] / 255;\n                } else {\n                    src_alpha = m_Alpha;\n                }\n            } else {\n                if (clip_scan) {\n                    src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;\n                } else {\n                    src_alpha = m_Alpha * cover_scan[col] / 255;\n                }\n            }\n            if (src_alpha) {\n                if (src_alpha == 255) {\n                    *(FX_DWORD*)dest_scan = m_Color;\n                } else {\n                    if (dest_scan[3] == 0) {\n                        dest_scan[3] = src_alpha;\n                        *dest_scan++ = m_Blue;\n                        *dest_scan++ = m_Green;\n                        *dest_scan = m_Red;\n                        dest_scan += 2;\n                        continue;\n                    }\n                    FX_BYTE dest_alpha = dest_scan[3] + src_alpha - dest_scan[3] * src_alpha / 255;\n                    dest_scan[3] = dest_alpha;\n                    int alpha_ratio = src_alpha * 255 / dest_alpha;\n                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);\n                    dest_scan ++;\n                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);\n                    dest_scan ++;\n                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);\n                    dest_scan += 2;\n                    continue;\n                }\n            }\n            dest_scan += Bpp;\n        }\n    }\n    void CompositeSpanRGB(FX_LPBYTE dest_scan, int Bpp,\n                          int span_left, int span_len, FX_LPBYTE cover_scan,\n                          int clip_left, int clip_right, FX_LPBYTE clip_scan,\n                          FX_LPBYTE dest_extra_alpha_scan)\n    {\n        int col_start = span_left < clip_left ? clip_left - span_left : 0;\n        int col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n        dest_scan += col_start * Bpp;\n        if (m_bRgbByteOrder) {\n            for (int col = col_start; col < col_end; col ++) {\n                int src_alpha;\n                if (clip_scan) {\n                    src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;\n                } else {\n                    src_alpha = m_Alpha * cover_scan[col] / 255;\n                }\n                if (src_alpha) {\n                    if (src_alpha == 255) {\n                        if (Bpp == 4) {\n                            *(FX_DWORD*)dest_scan = m_Color;\n                        } else if (Bpp == 3) {\n                            *dest_scan++ = m_Red;\n                            *dest_scan++ = m_Green;\n                            *dest_scan++ = m_Blue;\n                            continue;\n                        }\n                    } else {\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha);\n                        dest_scan++;\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha);\n                        dest_scan++;\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha);\n                        dest_scan += Bpp - 2;\n                        continue;\n                    }\n                }\n                dest_scan += Bpp;\n            }\n            return;\n        }\n        if (Bpp == 3 && dest_extra_alpha_scan) {\n            for (int col = col_start; col < col_end; col ++) {\n                int src_alpha;\n                if (m_bFullCover) {\n                    if (clip_scan) {\n                        src_alpha = m_Alpha * clip_scan[col] / 255;\n                    } else {\n                        src_alpha = m_Alpha;\n                    }\n                } else {\n                    if (clip_scan) {\n                        src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;\n                    } else {\n                        src_alpha = m_Alpha * cover_scan[col] / 255;\n                    }\n                }\n                if (src_alpha) {\n                    if (src_alpha == 255) {\n                        *dest_scan++ = (FX_BYTE)m_Blue;\n                        *dest_scan++ = (FX_BYTE)m_Green;\n                        *dest_scan++ = (FX_BYTE)m_Red;\n                        *dest_extra_alpha_scan++ = (FX_BYTE)m_Alpha;\n                        continue;\n                    } else {\n                        FX_BYTE dest_alpha = (*dest_extra_alpha_scan) + src_alpha -\n                                             (*dest_extra_alpha_scan) * src_alpha / 255;\n                        *dest_extra_alpha_scan++ = dest_alpha;\n                        int alpha_ratio = src_alpha * 255 / dest_alpha;\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);\n                        dest_scan ++;\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);\n                        dest_scan ++;\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);\n                        dest_scan ++;\n                        continue;\n                    }\n                }\n                dest_extra_alpha_scan++;\n                dest_scan += Bpp;\n            }\n        } else {\n            for (int col = col_start; col < col_end; col ++) {\n                int src_alpha;\n                if (m_bFullCover) {\n                    if (clip_scan) {\n                        src_alpha = m_Alpha * clip_scan[col] / 255;\n                    } else {\n                        src_alpha = m_Alpha;\n                    }\n                } else {\n                    if (clip_scan) {\n                        src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;\n                    } else {\n                        src_alpha = m_Alpha * cover_scan[col] / 255;\n                    }\n                }\n                if (src_alpha) {\n                    if (src_alpha == 255) {\n                        if (Bpp == 4) {\n                            *(FX_DWORD*)dest_scan = m_Color;\n                        } else if (Bpp == 3) {\n                            *dest_scan++ = m_Blue;\n                            *dest_scan++ = m_Green;\n                            *dest_scan++ = m_Red;\n                            continue;\n                        }\n                    } else {\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha);\n                        dest_scan ++;\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha);\n                        dest_scan ++;\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha);\n                        dest_scan += Bpp - 2;\n                        continue;\n                    }\n                }\n                dest_scan += Bpp;\n            }\n        }\n    }\n    void CompositeSpanCMYK(FX_LPBYTE dest_scan, int Bpp,\n                           int span_left, int span_len, FX_LPBYTE cover_scan,\n                           int clip_left, int clip_right, FX_LPBYTE clip_scan,\n                           FX_LPBYTE dest_extra_alpha_scan)\n    {\n        ASSERT(!m_bRgbByteOrder);\n        int col_start = span_left < clip_left ? clip_left - span_left : 0;\n        int col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n        dest_scan += col_start * 4;\n        if (dest_extra_alpha_scan) {\n            for (int col = col_start; col < col_end; col ++) {\n                int src_alpha;\n                if (m_bFullCover) {\n                    if (clip_scan) {\n                        src_alpha = m_Alpha * clip_scan[col] / 255;\n                    } else {\n                        src_alpha = m_Alpha;\n                    }\n                } else {\n                    if (clip_scan) {\n                        src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;\n                    } else {\n                        src_alpha = m_Alpha * cover_scan[col] / 255;\n                    }\n                }\n                if (src_alpha) {\n                    if (src_alpha == 255) {\n                        *(FX_CMYK*)dest_scan = m_Color;\n                        *dest_extra_alpha_scan = (FX_BYTE)m_Alpha;\n                    } else {\n                        FX_BYTE dest_alpha = (*dest_extra_alpha_scan) + src_alpha -\n                                             (*dest_extra_alpha_scan) * src_alpha / 255;\n                        *dest_extra_alpha_scan++ = dest_alpha;\n                        int alpha_ratio = src_alpha * 255 / dest_alpha;\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);\n                        dest_scan ++;\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);\n                        dest_scan ++;\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);\n                        dest_scan ++;\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, alpha_ratio);\n                        dest_scan ++;\n                        continue;\n                    }\n                }\n                dest_extra_alpha_scan++;\n                dest_scan += 4;\n            }\n        } else {\n            for (int col = col_start; col < col_end; col ++) {\n                int src_alpha;\n                if (clip_scan) {\n                    src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;\n                } else {\n                    src_alpha = m_Alpha * cover_scan[col] / 255;\n                }\n                if (src_alpha) {\n                    if (src_alpha == 255) {\n                        *(FX_CMYK*)dest_scan = m_Color;\n                    } else {\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha);\n                        dest_scan ++;\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha);\n                        dest_scan ++;\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha);\n                        dest_scan ++;\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, src_alpha);\n                        dest_scan ++;\n                        continue;\n                    }\n                }\n                dest_scan += 4;\n            }\n        }\n    }\n    template<class Scanline> void render(const Scanline& sl)\n    {\n        if (m_pOriDevice == NULL && composite_span == NULL) {\n            return;\n        }\n        int y = sl.y();\n        if (y < m_ClipBox.top || y >= m_ClipBox.bottom) {\n            return;\n        }\n        FX_LPBYTE dest_scan = m_pDevice->GetBuffer() + m_pDevice->GetPitch() * y;\n        FX_LPBYTE dest_scan_extra_alpha = NULL;\n        CFX_DIBitmap* pAlphaMask = m_pDevice->m_pAlphaMask;\n        if (pAlphaMask) {\n            dest_scan_extra_alpha = pAlphaMask->GetBuffer() + pAlphaMask->GetPitch() * y;\n        }\n        FX_LPBYTE ori_scan = NULL;\n        if (m_pOriDevice) {\n            ori_scan = m_pOriDevice->GetBuffer() + m_pOriDevice->GetPitch() * y;\n        }\n        int Bpp = m_pDevice->GetBPP() / 8;\n        FX_BOOL bDestAlpha = m_pDevice->HasAlpha() || m_pDevice->IsAlphaMask();\n        unsigned num_spans = sl.num_spans();\n        typename Scanline::const_iterator span = sl.begin();\n        while (1) {\n            int x = span->x;\n            ASSERT(span->len > 0);\n            FX_LPBYTE dest_pos = NULL;\n            FX_LPBYTE dest_extra_alpha_pos = NULL;\n            FX_LPBYTE ori_pos = NULL;\n            if (Bpp) {\n                ori_pos = ori_scan ? ori_scan + x * Bpp : NULL;\n                dest_pos = dest_scan + x * Bpp;\n                dest_extra_alpha_pos = dest_scan_extra_alpha ? dest_scan_extra_alpha + x : NULL;\n            } else {\n                dest_pos = dest_scan + x / 8;\n                ori_pos = ori_scan ? ori_scan + x / 8 : NULL;\n            }\n            FX_LPBYTE clip_pos = NULL;\n            if (m_pClipMask) {\n                clip_pos = m_pClipMask->GetBuffer() + (y - m_ClipBox.top) * m_pClipMask->GetPitch() + x - m_ClipBox.left;\n            }\n            if (ori_pos) {\n                CompositeSpan(dest_pos, ori_pos, Bpp, bDestAlpha, x, span->len, span->covers, m_ClipBox.left, m_ClipBox.right, clip_pos);\n            } else {\n                (this->*composite_span)(dest_pos, Bpp, x, span->len, span->covers, m_ClipBox.left, m_ClipBox.right, clip_pos, dest_extra_alpha_pos);\n            }\n            if(--num_spans == 0) {\n                break;\n            }\n            ++span;\n        }\n    }\n\n    FX_BOOL Init(CFX_DIBitmap* pDevice, CFX_DIBitmap* pOriDevice, const CFX_ClipRgn* pClipRgn, FX_DWORD color, FX_BOOL bFullCover, FX_BOOL bRgbByteOrder,\n                 int alpha_flag = 0, void* pIccTransform = NULL)\n    {\n        m_pDevice = pDevice;\n        m_pClipRgn = pClipRgn;\n        composite_span = NULL;\n        m_bRgbByteOrder = bRgbByteOrder;\n        m_pOriDevice = pOriDevice;\n        if (m_pClipRgn) {\n            m_ClipBox = m_pClipRgn->GetBox();\n        } else {\n            m_ClipBox.left = m_ClipBox.top = 0;\n            m_ClipBox.right = m_pDevice->GetWidth();\n            m_ClipBox.bottom = m_pDevice->GetHeight();\n        }\n        m_pClipMask = NULL;\n        if (m_pClipRgn && m_pClipRgn->GetType() == CFX_ClipRgn::MaskF) {\n            m_pClipMask = m_pClipRgn->GetMask();\n        }\n        m_bFullCover = bFullCover;\n        FX_BOOL bObjectCMYK = FXGETFLAG_COLORTYPE(alpha_flag);\n        FX_BOOL bDeviceCMYK = pDevice->IsCmykImage();\n        m_Alpha = bObjectCMYK ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);\n        ICodec_IccModule* pIccModule = NULL;\n        if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {\n            pIccTransform = NULL;\n        } else {\n            pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n        }\n        if (m_pDevice->GetBPP() == 8) {\n            ASSERT(!m_bRgbByteOrder);\n            composite_span = &CFX_Renderer::CompositeSpanGray;\n            if (m_pDevice->IsAlphaMask()) {\n                m_Gray = 255;\n            } else {\n                if (pIccTransform) {\n                    FX_BYTE gray;\n                    color = bObjectCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);\n                    pIccModule->TranslateScanline(pIccTransform, &gray, (FX_LPCBYTE)&color, 1);\n                    m_Gray = gray;\n                } else {\n                    if (bObjectCMYK) {\n                        FX_BYTE r, g, b;\n                        AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), FXSYS_GetYValue(color), FXSYS_GetKValue(color),\n                                           r, g, b);\n                        m_Gray = FXRGB2GRAY(r, g, b);\n                    } else {\n                        m_Gray = FXRGB2GRAY(FXARGB_R(color), FXARGB_G(color), FXARGB_B(color));\n                    }\n                }\n            }\n            return TRUE;\n        }\n        if (bDeviceCMYK) {\n            ASSERT(!m_bRgbByteOrder);\n            composite_span = &CFX_Renderer::CompositeSpanCMYK;\n            if (bObjectCMYK) {\n                m_Color = FXCMYK_TODIB(color);\n                if (pIccTransform) {\n                    pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&m_Color, (FX_LPCBYTE)&m_Color, 1);\n                }\n            } else {\n                if (!pIccTransform) {\n                    return FALSE;\n                }\n                color = FXARGB_TODIB(color);\n                pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&m_Color, (FX_LPCBYTE)&color, 1);\n            }\n            m_Red = ((FX_LPBYTE)&m_Color)[0];\n            m_Green = ((FX_LPBYTE)&m_Color)[1];\n            m_Blue = ((FX_LPBYTE)&m_Color)[2];\n            m_Gray = ((FX_LPBYTE)&m_Color)[3];\n        } else {\n            composite_span = (pDevice->GetFormat() == FXDIB_Argb) ? &CFX_Renderer::CompositeSpanARGB : &CFX_Renderer::CompositeSpanRGB;\n            if (pIccTransform) {\n                color = bObjectCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);\n                pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&m_Color, (FX_LPCBYTE)&color, 1);\n                ((FX_LPBYTE)&m_Color)[3] = m_Alpha;\n                m_Red = ((FX_LPBYTE)&m_Color)[2];\n                m_Green = ((FX_LPBYTE)&m_Color)[1];\n                m_Blue = ((FX_LPBYTE)&m_Color)[0];\n                if (m_bRgbByteOrder) {\n                    m_Color = FXARGB_TODIB(m_Color);\n                    m_Color = FXARGB_TOBGRORDERDIB(m_Color);\n                }\n            } else {\n                if (bObjectCMYK) {\n                    FX_BYTE r, g, b;\n                    AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), FXSYS_GetYValue(color), FXSYS_GetKValue(color),\n                                       r, g, b);\n                    m_Color = FXARGB_MAKE(m_Alpha, r, g, b);\n                    if (m_bRgbByteOrder) {\n                        m_Color = FXARGB_TOBGRORDERDIB(m_Color);\n                    } else {\n                        m_Color = FXARGB_TODIB(m_Color);\n                    }\n                    m_Red = r;\n                    m_Green = g;\n                    m_Blue = b;\n                } else {\n                    if (m_bRgbByteOrder) {\n                        m_Color = FXARGB_TOBGRORDERDIB(color);\n                    } else {\n                        m_Color = FXARGB_TODIB(color);\n                    }\n                    ArgbDecode(color, m_Alpha, m_Red, m_Green, m_Blue);\n                }\n            }\n        }\n        if (m_pDevice->GetBPP() == 1) {\n            composite_span = &CFX_Renderer::CompositeSpan1bpp;\n        }\n        return TRUE;\n    }\n};\nFX_BOOL CFX_AggDeviceDriver::RenderRasterizer(agg::rasterizer_scanline_aa& rasterizer, FX_DWORD color, FX_BOOL bFullCover, FX_BOOL bGroupKnockout,\n        int alpha_flag, void* pIccTransform)\n{\n    CFX_DIBitmap* pt = bGroupKnockout ? m_pOriDevice : NULL;\n    CFX_Renderer render;\n    if (!render.Init(m_pBitmap, pt, m_pClipRgn, color, bFullCover, m_bRgbByteOrder, alpha_flag, pIccTransform)) {\n        return FALSE;\n    }\n    agg::scanline_u8 scanline;\n    agg::render_scanlines(rasterizer, scanline, render, (m_FillFlags & FXFILL_NOPATHSMOOTH) != 0);\n    return TRUE;\n}\nFX_BOOL\tCFX_AggDeviceDriver::DrawPath(const CFX_PathData* pPathData,\n                                      const CFX_AffineMatrix* pObject2Device,\n                                      const CFX_GraphStateData* pGraphState,\n                                      FX_DWORD fill_color,\n                                      FX_DWORD stroke_color,\n                                      int fill_mode,\n                                      int alpha_flag,\n                                      void* pIccTransform,\n                                      int blend_type\n                                     )\n{\n    if (blend_type != FXDIB_BLEND_NORMAL) {\n        return FALSE;\n    }\n    if (GetBuffer() == NULL) {\n        return TRUE;\n    }\n    m_FillFlags = fill_mode;\n    if ((fill_mode & 3) && fill_color) {\n        CAgg_PathData path_data;\n        path_data.BuildPath(pPathData, pObject2Device);\n        agg::rasterizer_scanline_aa rasterizer;\n        rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT)));\n        rasterizer.add_path(path_data.m_PathData);\n        rasterizer.filling_rule((fill_mode & 3) == FXFILL_WINDING ? agg::fill_non_zero : agg::fill_even_odd);\n        if (!RenderRasterizer(rasterizer, fill_color, fill_mode & FXFILL_FULLCOVER, FALSE, alpha_flag, pIccTransform)) {\n            return FALSE;\n        }\n    }\n    int stroke_alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_STROKE(alpha_flag) : FXARGB_A(stroke_color);\n    if (pGraphState && stroke_alpha) {\n        if (fill_mode & FX_ZEROAREA_FILL) {\n            CAgg_PathData path_data;\n            path_data.BuildPath(pPathData, pObject2Device);\n            agg::rasterizer_scanline_aa rasterizer;\n            rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT)));\n            RasterizeStroke(rasterizer, path_data.m_PathData, NULL, pGraphState, 1, FALSE, fill_mode & FX_STROKE_TEXT_MODE);\n            int fill_flag = FXGETFLAG_COLORTYPE(alpha_flag) << 8 | FXGETFLAG_ALPHA_STROKE(alpha_flag);\n            if (!RenderRasterizer(rasterizer, stroke_color, fill_mode & FXFILL_FULLCOVER, m_bGroupKnockout, fill_flag, pIccTransform)) {\n                return FALSE;\n            }\n            return TRUE;\n        }\n        CFX_AffineMatrix matrix1, matrix2;\n        if (pObject2Device) {\n            matrix1.a = FX_MAX(FXSYS_fabs(pObject2Device->a), FXSYS_fabs(pObject2Device->b));\n            matrix1.d = matrix1.a;\n            matrix2.Set(pObject2Device->a / matrix1.a, pObject2Device->b / matrix1.a,\n                        pObject2Device->c / matrix1.d, pObject2Device->d / matrix1.d,\n                        0, 0);\n            CFX_AffineMatrix mtRervese;\n            mtRervese.SetReverse(matrix2);\n            matrix1 = *pObject2Device;\n            matrix1.Concat(mtRervese);\n        }\n        CAgg_PathData path_data;\n        path_data.BuildPath(pPathData, &matrix1);\n        agg::rasterizer_scanline_aa rasterizer;\n        rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT)));\n        RasterizeStroke(rasterizer, path_data.m_PathData, &matrix2, pGraphState, matrix1.a, FALSE, fill_mode & FX_STROKE_TEXT_MODE);\n        int fill_flag = FXGETFLAG_COLORTYPE(alpha_flag) << 8 | FXGETFLAG_ALPHA_STROKE(alpha_flag);\n        if (!RenderRasterizer(rasterizer, stroke_color, fill_mode & FXFILL_FULLCOVER, m_bGroupKnockout, fill_flag, pIccTransform)) {\n            return FALSE;\n        }\n    }\n    return TRUE;\n}\nvoid RgbByteOrderSetPixel(CFX_DIBitmap* pBitmap, int x, int y, FX_DWORD argb)\n{\n    if (x < 0 || x >= pBitmap->GetWidth() || y < 0 || y >= pBitmap->GetHeight()) {\n        return;\n    }\n    FX_LPBYTE pos = (FX_BYTE*)pBitmap->GetBuffer() + y * pBitmap->GetPitch() + x * pBitmap->GetBPP() / 8;\n    if (pBitmap->GetFormat() == FXDIB_Argb) {\n        FXARGB_SETRGBORDERDIB(pos, ArgbGamma(argb));\n    } else {\n        int alpha = FXARGB_A(argb);\n        pos[0] = (FXARGB_R(argb) * alpha + pos[0] * (255 - alpha)) / 255;\n        pos[1] = (FXARGB_G(argb) * alpha + pos[1] * (255 - alpha)) / 255;\n        pos[2] = (FXARGB_B(argb) * alpha + pos[2] * (255 - alpha)) / 255;\n    }\n}\nvoid RgbByteOrderCompositeRect(CFX_DIBitmap* pBitmap, int left, int top, int width, int height, FX_ARGB argb)\n{\n    int src_alpha = FXARGB_A(argb);\n    if (src_alpha == 0) {\n        return;\n    }\n    FX_RECT rect(left, top, left + width, top + height);\n    rect.Intersect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight());\n    width = rect.Width();\n    int src_r = FXARGB_R(argb), src_g = FXARGB_G(argb), src_b = FXARGB_B(argb);\n    int Bpp = pBitmap->GetBPP() / 8;\n    FX_BOOL bAlpha = pBitmap->HasAlpha();\n    int dib_argb = FXARGB_TOBGRORDERDIB(argb);\n    FX_BYTE* pBuffer = pBitmap->GetBuffer();\n    if (src_alpha == 255) {\n        for (int row = rect.top; row < rect.bottom; row ++) {\n            FX_LPBYTE dest_scan = pBuffer + row * pBitmap->GetPitch() + rect.left * Bpp;\n            if (Bpp == 4) {\n                FX_DWORD* scan = (FX_DWORD*)dest_scan;\n                for (int col = 0; col < width; col ++) {\n                    *scan ++ = dib_argb;\n                }\n            } else {\n                for (int col = 0; col < width; col ++) {\n                    *dest_scan ++ = src_r;\n                    *dest_scan ++ = src_g;\n                    *dest_scan ++ = src_b;\n                }\n            }\n        }\n        return;\n    }\n    src_r = FX_GAMMA(src_r);\n    src_g = FX_GAMMA(src_g);\n    src_b = FX_GAMMA(src_b);\n    for (int row = rect.top; row < rect.bottom; row ++) {\n        FX_LPBYTE dest_scan = pBuffer + row * pBitmap->GetPitch() + rect.left * Bpp;\n        if (bAlpha) {\n            for (int col = 0; col < width; col ++) {\n                FX_BYTE back_alpha = dest_scan[3];\n                if (back_alpha == 0) {\n                    FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));\n                    dest_scan += 4;\n                    continue;\n                }\n                FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n                dest_scan[3] = dest_alpha;\n                int alpha_ratio = src_alpha * 255 / dest_alpha;\n                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);\n                dest_scan++;\n                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);\n                dest_scan++;\n                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);\n                dest_scan += 2;\n            }\n        } else {\n            for (int col = 0; col < width; col ++) {\n                *dest_scan = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(*dest_scan), src_r, src_alpha));\n                dest_scan++;\n                *dest_scan = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(*dest_scan), src_g, src_alpha));\n                dest_scan++;\n                *dest_scan = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(*dest_scan), src_b, src_alpha));\n                dest_scan++;\n                if (Bpp == 4) {\n                    dest_scan++;\n                }\n            }\n        }\n    }\n}\nvoid RgbByteOrderTransferBitmap(CFX_DIBitmap* pBitmap, int dest_left, int dest_top, int width, int height,\n                                const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)\n{\n    if (pBitmap == NULL) {\n        return;\n    }\n    pBitmap->GetOverlapRect(dest_left, dest_top, width, height, pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(), src_left, src_top, NULL);\n    if (width == 0 || height == 0) {\n        return;\n    }\n    int Bpp = pBitmap->GetBPP() / 8;\n    FXDIB_Format dest_format = pBitmap->GetFormat();\n    FXDIB_Format src_format = pSrcBitmap->GetFormat();\n    int pitch = pBitmap->GetPitch();\n    FX_BYTE* buffer = pBitmap->GetBuffer();\n    if (dest_format == src_format) {\n        for (int row = 0; row < height; row ++) {\n            FX_LPBYTE dest_scan = buffer + (dest_top + row) * pitch + dest_left * Bpp;\n            FX_LPBYTE src_scan = (FX_LPBYTE)pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp;\n            if (Bpp == 4) {\n                for (int col = 0; col < width; col ++) {\n                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_scan[3], src_scan[0], src_scan[1], src_scan[2]));\n                    dest_scan += 4;\n                    src_scan += 4;\n                }\n            } else {\n                for (int col = 0; col < width; col ++) {\n                    *dest_scan++ = src_scan[2];\n                    *dest_scan++ = src_scan[1];\n                    *dest_scan++ = src_scan[0];\n                    src_scan += 3;\n                }\n            }\n        }\n        return;\n    }\n    int src_pitch = pSrcBitmap->GetPitch();\n    FX_ARGB* src_pal = pSrcBitmap->GetPalette();\n    FX_LPBYTE dest_buf = buffer + dest_top * pitch + dest_left * Bpp;\n    if (dest_format == FXDIB_Rgb) {\n        if (src_format == FXDIB_Rgb32) {\n            for (int row = 0; row < height; row ++) {\n                FX_LPBYTE dest_scan = dest_buf + row * pitch;\n                FX_LPBYTE src_scan = (FX_BYTE*)pSrcBitmap->GetScanline(src_top + row) + src_left * 4;\n                for (int col = 0; col < width; col ++) {\n                    *dest_scan++ = src_scan[2];\n                    *dest_scan++ = src_scan[1];\n                    *dest_scan++ = src_scan[0];\n                    src_scan += 4;\n                }\n            }\n        } else {\n            ASSERT(FALSE);\n        }\n    } else if (dest_format == FXDIB_Argb || dest_format == FXDIB_Rgb32) {\n        if (src_format == FXDIB_Rgb) {\n            for (int row = 0; row < height; row ++) {\n                FX_BYTE* dest_scan = (FX_BYTE*)(dest_buf + row * pitch);\n                FX_LPBYTE src_scan = (FX_BYTE*)pSrcBitmap->GetScanline(src_top + row) + src_left * 3;\n                if (src_format == FXDIB_Argb) {\n                    for (int col = 0; col < width; col ++) {\n                        FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, FX_GAMMA(src_scan[0]), FX_GAMMA(src_scan[1]), FX_GAMMA(src_scan[2])));\n                        dest_scan += 4;\n                        src_scan += 3;\n                    }\n                } else {\n                    for (int col = 0; col < width; col ++) {\n                        FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[0], src_scan[1], src_scan[2]));\n                        dest_scan += 4;\n                        src_scan += 3;\n                    }\n                }\n            }\n        } else if (src_format == FXDIB_Rgb32) {\n            ASSERT(dest_format == FXDIB_Argb);\n            for (int row = 0; row < height; row ++) {\n                FX_LPBYTE dest_scan = dest_buf + row * pitch;\n                FX_LPBYTE src_scan = (FX_LPBYTE)(pSrcBitmap->GetScanline(src_top + row) + src_left * 4);\n                for (int col = 0; col < width; col++) {\n                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[0], src_scan[1], src_scan[2]));\n                    src_scan  += 4;\n                    dest_scan += 4;\n                }\n            }\n        }\n    } else {\n        ASSERT(FALSE);\n    }\n}\nFX_ARGB _DefaultCMYK2ARGB(FX_CMYK cmyk, FX_BYTE alpha)\n{\n    FX_BYTE r, g, b;\n    AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),\n                       r, g, b);\n    return ArgbEncode(alpha, r, g, b);\n}\nFX_BOOL _DibSetPixel(CFX_DIBitmap* pDevice, int x, int y, FX_DWORD color, int alpha_flag, void* pIccTransform)\n{\n    FX_BOOL bObjCMYK = FXGETFLAG_COLORTYPE(alpha_flag);\n    int alpha = bObjCMYK ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);\n    if (pIccTransform) {\n        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n        color = bObjCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);\n        pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&color, (FX_LPBYTE)&color, 1);\n        color = bObjCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);\n        if (!pDevice->IsCmykImage()) {\n            color = (color & 0xffffff) | (alpha << 24);\n        }\n    } else {\n        if (pDevice->IsCmykImage()) {\n            if (!bObjCMYK) {\n                return FALSE;\n            }\n        } else {\n            if (bObjCMYK) {\n                color = _DefaultCMYK2ARGB(color, alpha);\n            }\n        }\n    }\n    pDevice->SetPixel(x, y, color);\n    if (pDevice->m_pAlphaMask) {\n        pDevice->m_pAlphaMask->SetPixel(x, y, alpha << 24);\n    }\n    return TRUE;\n}\nFX_BOOL CFX_AggDeviceDriver::SetPixel(int x, int y, FX_DWORD color, int alpha_flag, void* pIccTransform)\n{\n    if (m_pBitmap->GetBuffer() == NULL) {\n        return TRUE;\n    }\n    if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {\n        pIccTransform = NULL;\n    }\n    if (m_pClipRgn == NULL) {\n        if (m_bRgbByteOrder) {\n            RgbByteOrderSetPixel(m_pBitmap, x, y, color);\n        } else {\n            return _DibSetPixel(m_pBitmap, x, y, color, alpha_flag, pIccTransform);\n        }\n    } else if (m_pClipRgn->GetBox().Contains(x, y)) {\n        if (m_pClipRgn->GetType() == CFX_ClipRgn::RectI) {\n            if (m_bRgbByteOrder) {\n                RgbByteOrderSetPixel(m_pBitmap, x, y, color);\n            } else {\n                return _DibSetPixel(m_pBitmap, x, y, color, alpha_flag, pIccTransform);\n            }\n        } else if (m_pClipRgn->GetType() == CFX_ClipRgn::MaskF) {\n            const CFX_DIBitmap* pMask = m_pClipRgn->GetMask();\n            FX_BOOL bCMYK = FXGETFLAG_COLORTYPE(alpha_flag);\n            int new_alpha = bCMYK ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);\n            new_alpha = new_alpha * pMask->GetScanline(y)[x] / 255;\n            if (m_bRgbByteOrder) {\n                RgbByteOrderSetPixel(m_pBitmap, x, y, (color & 0xffffff) | (new_alpha << 24));\n                return TRUE;\n            }\n            if (bCMYK) {\n                FXSETFLAG_ALPHA_FILL(alpha_flag, new_alpha);\n            } else {\n                color = (color & 0xffffff) | (new_alpha << 24);\n            }\n            return _DibSetPixel(m_pBitmap, x, y, color, alpha_flag, pIccTransform);\n        }\n    }\n    return TRUE;\n}\nFX_BOOL CFX_AggDeviceDriver::FillRect(const FX_RECT* pRect, FX_DWORD fill_color, int alpha_flag, void* pIccTransform, int blend_type)\n{\n    if (blend_type != FXDIB_BLEND_NORMAL) {\n        return FALSE;\n    }\n    if (m_pBitmap->GetBuffer() == NULL) {\n        return TRUE;\n    }\n    FX_RECT clip_rect;\n    GetClipBox(&clip_rect);\n    FX_RECT draw_rect = clip_rect;\n    if (pRect) {\n        draw_rect.Intersect(*pRect);\n    }\n    if (draw_rect.IsEmpty()) {\n        return TRUE;\n    }\n    if (m_pClipRgn == NULL || m_pClipRgn->GetType() == CFX_ClipRgn::RectI) {\n        if (m_bRgbByteOrder) {\n            RgbByteOrderCompositeRect(m_pBitmap, draw_rect.left, draw_rect.top, draw_rect.Width(), draw_rect.Height(), fill_color);\n        } else {\n            m_pBitmap->CompositeRect(draw_rect.left, draw_rect.top, draw_rect.Width(), draw_rect.Height(), fill_color, alpha_flag, pIccTransform);\n        }\n        return TRUE;\n    }\n    m_pBitmap->CompositeMask(draw_rect.left, draw_rect.top, draw_rect.Width(), draw_rect.Height(), (const CFX_DIBitmap*)m_pClipRgn->GetMask(),\n                             fill_color, draw_rect.left - clip_rect.left, draw_rect.top - clip_rect.top, FXDIB_BLEND_NORMAL, NULL, m_bRgbByteOrder, alpha_flag, pIccTransform);\n    return TRUE;\n}\nFX_BOOL CFX_AggDeviceDriver::GetClipBox(FX_RECT* pRect)\n{\n    if (m_pClipRgn == NULL) {\n        pRect->left = pRect->top = 0;\n        pRect->right = GetDeviceCaps(FXDC_PIXEL_WIDTH);\n        pRect->bottom = GetDeviceCaps(FXDC_PIXEL_HEIGHT);\n        return TRUE;\n    }\n    *pRect = m_pClipRgn->GetBox();\n    return TRUE;\n}\nFX_BOOL\tCFX_AggDeviceDriver::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform, FX_BOOL bDEdge)\n{\n    if (m_pBitmap->GetBuffer() == NULL) {\n        return TRUE;\n    }\n    if (bDEdge) {\n        if (m_bRgbByteOrder) {\n            RgbByteOrderTransferBitmap(pBitmap, 0, 0, pBitmap->GetWidth(), pBitmap->GetHeight(), m_pBitmap, left, top);\n        } else {\n            return pBitmap->TransferBitmap(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight(), m_pBitmap, left, top, pIccTransform);\n        }\n        return TRUE;\n    }\n    FX_RECT rect(left, top, left + pBitmap->GetWidth(), top + pBitmap->GetHeight());\n    CFX_DIBitmap *pBack = NULL;\n    if (m_pOriDevice) {\n        pBack = m_pOriDevice->Clone(&rect);\n        if (!pBack) {\n            return TRUE;\n        }\n        pBack->CompositeBitmap(0, 0, pBack->GetWidth(), pBack->GetHeight(), m_pBitmap, 0, 0);\n    } else {\n        pBack = m_pBitmap->Clone(&rect);\n    }\n    if (!pBack) {\n        return TRUE;\n    }\n    FX_BOOL bRet = TRUE;\n    left = left >= 0 ? 0 : left;\n    top = top >= 0 ? 0 : top;\n    if (m_bRgbByteOrder) {\n        RgbByteOrderTransferBitmap(pBitmap, 0, 0, rect.Width(), rect.Height(), pBack, left, top);\n    } else {\n        bRet = pBitmap->TransferBitmap(0, 0, rect.Width(), rect.Height(), pBack, left, top, pIccTransform);\n    }\n    delete pBack;\n    return bRet;\n}\nFX_BOOL\tCFX_AggDeviceDriver::SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD argb, const FX_RECT* pSrcRect, int left, int top, int blend_type,\n                                       int alpha_flag, void* pIccTransform)\n{\n    if (m_pBitmap->GetBuffer() == NULL) {\n        return TRUE;\n    }\n    if (pBitmap->IsAlphaMask())\n        return m_pBitmap->CompositeMask(left, top, pSrcRect->Width(), pSrcRect->Height(), pBitmap, argb,\n                                        pSrcRect->left, pSrcRect->top, blend_type, m_pClipRgn, m_bRgbByteOrder, alpha_flag, pIccTransform);\n    return m_pBitmap->CompositeBitmap(left, top, pSrcRect->Width(), pSrcRect->Height(), pBitmap,\n                                      pSrcRect->left, pSrcRect->top, blend_type, m_pClipRgn, m_bRgbByteOrder, pIccTransform);\n}\nFX_BOOL\tCFX_AggDeviceDriver::StretchDIBits(const CFX_DIBSource* pSource, FX_DWORD argb, int dest_left, int dest_top,\n        int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,\n        int alpha_flag, void* pIccTransform, int blend_type)\n{\n    if (m_pBitmap->GetBuffer() == NULL) {\n        return TRUE;\n    }\n    if (dest_width == pSource->GetWidth() && dest_height == pSource->GetHeight()) {\n        FX_RECT rect(0, 0, dest_width, dest_height);\n        return SetDIBits(pSource, argb, &rect, dest_left, dest_top, blend_type, alpha_flag, pIccTransform);\n    }\n    FX_RECT dest_rect(dest_left, dest_top, dest_left + dest_width, dest_top + dest_height);\n    dest_rect.Normalize();\n    FX_RECT dest_clip = dest_rect;\n    dest_clip.Intersect(*pClipRect);\n    CFX_BitmapComposer composer;\n    composer.Compose(m_pBitmap, m_pClipRgn, 255, argb, dest_clip, FALSE, FALSE, FALSE, m_bRgbByteOrder, alpha_flag, pIccTransform, blend_type);\n    dest_clip.Offset(-dest_rect.left, -dest_rect.top);\n    CFX_ImageStretcher stretcher;\n    if (stretcher.Start(&composer, pSource, dest_width, dest_height, dest_clip, flags)) {\n        stretcher.Continue(NULL);\n    }\n    return TRUE;\n}\nFX_BOOL\tCFX_AggDeviceDriver::StartDIBits(const CFX_DIBSource* pSource, int bitmap_alpha, FX_DWORD argb,\n        const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,\n        int alpha_flag, void* pIccTransform, int blend_type)\n{\n    if (m_pBitmap->GetBuffer() == NULL) {\n        return TRUE;\n    }\n    CFX_ImageRenderer* pRenderer = FX_NEW CFX_ImageRenderer;\n    if (!pRenderer) {\n        return FALSE;\n    }\n    pRenderer->Start(m_pBitmap, m_pClipRgn, pSource, bitmap_alpha, argb, pMatrix, render_flags, m_bRgbByteOrder, alpha_flag, pIccTransform);\n    handle = pRenderer;\n    return TRUE;\n}\nFX_BOOL\tCFX_AggDeviceDriver::ContinueDIBits(FX_LPVOID pHandle, IFX_Pause* pPause)\n{\n    if (m_pBitmap->GetBuffer() == NULL) {\n        return TRUE;\n    }\n    return ((CFX_ImageRenderer*)pHandle)->Continue(pPause);\n}\nvoid CFX_AggDeviceDriver::CancelDIBits(FX_LPVOID pHandle)\n{\n    if (m_pBitmap->GetBuffer() == NULL) {\n        return;\n    }\n    delete (CFX_ImageRenderer*)pHandle;\n}\nCFX_FxgeDevice::CFX_FxgeDevice()\n{\n    m_bOwnedBitmap = FALSE;\n}\nFX_BOOL CFX_FxgeDevice::Attach(CFX_DIBitmap* pBitmap, int dither_bits, FX_BOOL bRgbByteOrder, CFX_DIBitmap* pOriDevice, FX_BOOL bGroupKnockout)\n{\n    if (pBitmap == NULL) {\n        return FALSE;\n    }\n    SetBitmap(pBitmap);\n    IFX_RenderDeviceDriver* pDriver = FX_NEW CFX_AggDeviceDriver(pBitmap, dither_bits, bRgbByteOrder, pOriDevice, bGroupKnockout);\n    if (!pDriver) {\n        return FALSE;\n    }\n    SetDeviceDriver(pDriver);\n    return TRUE;\n}\nFX_BOOL CFX_FxgeDevice::Create(int width, int height, FXDIB_Format format, int dither_bits, CFX_DIBitmap* pOriDevice)\n{\n    m_bOwnedBitmap = TRUE;\n    CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;\n    if (!pBitmap) {\n        return FALSE;\n    }\n    if (!pBitmap->Create(width, height, format)) {\n        delete pBitmap;\n        return FALSE;\n    }\n    SetBitmap(pBitmap);\n    IFX_RenderDeviceDriver* pDriver = FX_NEW CFX_AggDeviceDriver(pBitmap, dither_bits, FALSE, pOriDevice, FALSE);\n    if (!pDriver) {\n        return FALSE;\n    }\n    SetDeviceDriver(pDriver);\n    return TRUE;\n}\nCFX_FxgeDevice::~CFX_FxgeDevice()\n{\n    if (m_bOwnedBitmap && GetBitmap()) {\n        delete GetBitmap();\n    }\n}\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/fx_agg_path_storage.cpp",
    "content": "\n//----------------------------------------------------------------------------\n// XYQ: 2006-01-22 Copied from AGG project.\n// TODO: This file uses intensive floating point operations, so it's NOT suitable\n// for platforms like Symbian OS. We need to change to FIX format.\n//----------------------------------------------------------------------------\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n//\n// Class path_storage\n//\n//----------------------------------------------------------------------------\n#include \"../../../../include/fxcrt/fx_basic.h\"\n#include \"agg_path_storage.h\"\n#include \"agg_math.h\"\nnamespace agg\n{\npath_storage::~path_storage()\n{\n    if(m_total_blocks) {\n        FX_FLOAT** coord_blk = m_coord_blocks + m_total_blocks - 1;\n        while(m_total_blocks--) {\n            FX_Free(*coord_blk);\n            --coord_blk;\n        }\n        FX_Free(m_coord_blocks);\n    }\n}\npath_storage::path_storage() :\n    m_total_vertices(0),\n    m_total_blocks(0),\n    m_max_blocks(0),\n    m_coord_blocks(0),\n    m_cmd_blocks(0),\n    m_iterator(0)\n{\n}\nvoid path_storage::allocate_block(unsigned nb)\n{\n    if(nb >= m_max_blocks) {\n        FX_FLOAT** new_coords =\n            FX_Alloc( FX_FLOAT*, (m_max_blocks + block_pool) * 2);\n        if (!new_coords) {\n            return;\n        }\n        unsigned char** new_cmds =\n            (unsigned char**)(new_coords + m_max_blocks + block_pool);\n        if(m_coord_blocks) {\n            FXSYS_memcpy32(new_coords,\n                           m_coord_blocks,\n                           m_max_blocks * sizeof(FX_FLOAT*));\n            FXSYS_memcpy32(new_cmds,\n                           m_cmd_blocks,\n                           m_max_blocks * sizeof(unsigned char*));\n            FX_Free(m_coord_blocks);\n        }\n        m_coord_blocks = new_coords;\n        m_cmd_blocks = new_cmds;\n        m_max_blocks += block_pool;\n    }\n    m_coord_blocks[nb] =\n        FX_Alloc( FX_FLOAT, block_size * 2 +\n                  block_size /\n                  (sizeof(FX_FLOAT) / sizeof(unsigned char)));\n    if (!m_coord_blocks[nb]) {\n        return;\n    }\n    m_cmd_blocks[nb]  =\n        (unsigned char*)(m_coord_blocks[nb] + block_size * 2);\n    m_total_blocks++;\n}\nvoid path_storage::rewind(unsigned path_id)\n{\n    m_iterator = path_id;\n}\nvoid path_storage::curve4(FX_FLOAT x_ctrl1, FX_FLOAT y_ctrl1,\n                          FX_FLOAT x_ctrl2, FX_FLOAT y_ctrl2,\n                          FX_FLOAT x_to,    FX_FLOAT y_to)\n{\n    add_vertex(x_ctrl1, y_ctrl1, path_cmd_curve4);\n    add_vertex(x_ctrl2, y_ctrl2, path_cmd_curve4);\n    add_vertex(x_to,    y_to,    path_cmd_curve4);\n}\nvoid path_storage::end_poly()\n{\n    if(m_total_vertices) {\n        if(is_vertex(command(m_total_vertices - 1))) {\n            add_vertex(0, 0, path_cmd_end_poly | path_flags_close);\n        }\n    }\n}\n}\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/fx_agg_rasterizer_scanline_aa.cpp",
    "content": "\n//----------------------------------------------------------------------------\n// XYQ: 2006-01-22 Copied from AGG project.\n// This file uses only integer data, so it's suitable for all platforms.\n//----------------------------------------------------------------------------\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n//\n// The author gratefully acknowleges the support of David Turner,\n// Robert Wilhelm, and Werner Lemberg - the authors of the FreeType\n// libray - in producing this work. See http://www.freetype.org for details.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n//\n// Adaptation for 32-bit screen coordinates has been sponsored by\n// Liberty Technology Systems, Inc., visit http://lib-sys.com\n//\n// Liberty Technology Systems, Inc. is the provider of\n// PostScript and PDF technology for software developers.\n//\n//----------------------------------------------------------------------------\n//\n// Class outline_aa - implementation.\n//\n// Initially the rendering algorithm was designed by David Turner and the\n// other authors of the FreeType library - see the above notice. I nearly\n// created a similar renderer, but still I was far from David's work.\n// I completely redesigned the original code and adapted it for Anti-Grain\n// ideas. Two functions - render_line and render_hline are the core of\n// the algorithm - they calculate the exact coverage of each pixel cell\n// of the polygon. I left these functions almost as is, because there's\n// no way to improve the perfection - hats off to David and his group!\n//\n// All other code is very different from the original.\n//\n//----------------------------------------------------------------------------\n#include \"../../../../include/fxcrt/fx_ext.h\"\n#include <limits.h>\n#include \"agg_rasterizer_scanline_aa.h\"\nnamespace agg\n{\nAGG_INLINE void cell_aa::set_cover(int c, int a)\n{\n    cover = c;\n    area = a;\n}\nAGG_INLINE void cell_aa::add_cover(int c, int a)\n{\n    cover += c;\n    area += a;\n}\nAGG_INLINE void cell_aa::set_coord(int cx, int cy)\n{\n    x = cx;\n    y = cy;\n}\nAGG_INLINE void cell_aa::set(int cx, int cy, int c, int a)\n{\n    x = cx;\n    y = cy;\n    cover = c;\n    area = a;\n}\noutline_aa::~outline_aa()\n{\n    if(m_num_blocks) {\n        cell_aa** ptr = m_cells + m_num_blocks - 1;\n        while(m_num_blocks--) {\n            FX_Free(*ptr);\n            ptr--;\n        }\n        FX_Free(m_cells);\n    }\n}\noutline_aa::outline_aa() :\n    m_num_blocks(0),\n    m_max_blocks(0),\n    m_cur_block(0),\n    m_num_cells(0),\n    m_cells(0),\n    m_cur_cell_ptr(0),\n    m_cur_x(0),\n    m_cur_y(0),\n    m_min_x(0x7FFFFFFF),\n    m_min_y(0x7FFFFFFF),\n    m_max_x(-0x7FFFFFFF),\n    m_max_y(-0x7FFFFFFF),\n    m_sorted(false)\n{\n    m_cur_cell.set(0x7FFF, 0x7FFF, 0, 0);\n}\nvoid outline_aa::reset()\n{\n    m_num_cells = 0;\n    m_cur_block = 0;\n    m_cur_cell.set(0x7FFF, 0x7FFF, 0, 0);\n    m_sorted = false;\n    m_min_x =  0x7FFFFFFF;\n    m_min_y =  0x7FFFFFFF;\n    m_max_x = -0x7FFFFFFF;\n    m_max_y = -0x7FFFFFFF;\n}\nvoid outline_aa::allocate_block()\n{\n    if(m_cur_block >= m_num_blocks) {\n        if(m_num_blocks >= m_max_blocks) {\n            cell_aa** new_cells = FX_Alloc( cell_aa*, m_max_blocks + cell_block_pool);\n            if (!new_cells) {\n                return;\n            }\n            if(m_cells) {\n                FXSYS_memcpy32(new_cells, m_cells, m_max_blocks * sizeof(cell_aa*));\n                FX_Free(m_cells);\n            }\n            m_cells = new_cells;\n            m_max_blocks += cell_block_pool;\n        }\n        m_cells[m_num_blocks++] = FX_Alloc(cell_aa, cell_block_size);\n        if (!m_cells[m_num_blocks - 1]) {\n            return;\n        }\n    }\n    m_cur_cell_ptr = m_cells[m_cur_block++];\n}\nAGG_INLINE void outline_aa::add_cur_cell()\n{\n    if(m_cur_cell.area | m_cur_cell.cover) {\n        if((m_num_cells & cell_block_mask) == 0) {\n            if(m_num_blocks >= cell_block_limit) {\n                return;\n            }\n            allocate_block();\n        }\n        *m_cur_cell_ptr++ = m_cur_cell;\n        ++m_num_cells;\n    }\n}\nAGG_INLINE void outline_aa::set_cur_cell(int x, int y)\n{\n    if(m_cur_cell.x != x || m_cur_cell.y != y) {\n        add_cur_cell();\n        m_cur_cell.set(x, y, 0, 0);\n        if(x < m_min_x) {\n            m_min_x = x;\n        }\n        if(x > m_max_x) {\n            m_max_x = x;\n        }\n        if(y < m_min_y) {\n            m_min_y = y;\n        }\n        if(y > m_max_y) {\n            m_max_y = y;\n        }\n    }\n}\nAGG_INLINE void outline_aa::render_hline(int ey, int x1, int y1, int x2, int y2)\n{\n    int ex1 = x1 >> poly_base_shift;\n    int ex2 = x2 >> poly_base_shift;\n    int fx1 = x1 & poly_base_mask;\n    int fx2 = x2 & poly_base_mask;\n    int delta, p, first, dx;\n    int incr, lift, mod, rem;\n    if(y1 == y2) {\n        set_cur_cell(ex2, ey);\n        return;\n    }\n    if(ex1 == ex2) {\n        delta = y2 - y1;\n        m_cur_cell.add_cover(delta, (fx1 + fx2) * delta);\n        return;\n    }\n    p     = (poly_base_size - fx1) * (y2 - y1);\n    first = poly_base_size;\n    incr  = 1;\n    dx = x2 - x1;\n    if(dx < 0) {\n        p     = fx1 * (y2 - y1);\n        first = 0;\n        incr  = -1;\n        dx    = -dx;\n    }\n    delta = p / dx;\n    mod   = p % dx;\n    if(mod < 0) {\n        delta--;\n        mod += dx;\n    }\n    m_cur_cell.add_cover(delta, (fx1 + first) * delta);\n    ex1 += incr;\n    set_cur_cell(ex1, ey);\n    y1  += delta;\n    if(ex1 != ex2) {\n        p     = poly_base_size * (y2 - y1 + delta);\n        lift  = p / dx;\n        rem   = p % dx;\n        if (rem < 0) {\n            lift--;\n            rem += dx;\n        }\n        mod -= dx;\n        while (ex1 != ex2) {\n            delta = lift;\n            mod  += rem;\n            if(mod >= 0) {\n                mod -= dx;\n                delta++;\n            }\n            m_cur_cell.add_cover(delta, (poly_base_size) * delta);\n            y1  += delta;\n            ex1 += incr;\n            set_cur_cell(ex1, ey);\n        }\n    }\n    delta = y2 - y1;\n    m_cur_cell.add_cover(delta, (fx2 + poly_base_size - first) * delta);\n}\nvoid outline_aa::render_line(int x1, int y1, int x2, int y2)\n{\n    enum dx_limit_e { dx_limit = 16384 << poly_base_shift };\n    int dx = x2 - x1;\n    if(dx >= dx_limit || dx <= -dx_limit) {\n        int cx = (x1 + x2) >> 1;\n        int cy = (y1 + y2) >> 1;\n        render_line(x1, y1, cx, cy);\n        render_line(cx, cy, x2, y2);\n    }\n    int dy = y2 - y1;\n    int ey1 = y1 >> poly_base_shift;\n    int ey2 = y2 >> poly_base_shift;\n    int fy1 = y1 & poly_base_mask;\n    int fy2 = y2 & poly_base_mask;\n    int x_from, x_to;\n    int p, rem, mod, lift, delta, first, incr;\n    if(ey1 == ey2) {\n        render_hline(ey1, x1, fy1, x2, fy2);\n        return;\n    }\n    incr  = 1;\n    if(dx == 0) {\n        int ex = x1 >> poly_base_shift;\n        int two_fx = (x1 - (ex << poly_base_shift)) << 1;\n        int area;\n        first = poly_base_size;\n        if(dy < 0) {\n            first = 0;\n            incr  = -1;\n        }\n        x_from = x1;\n        delta = first - fy1;\n        m_cur_cell.add_cover(delta, two_fx * delta);\n        ey1 += incr;\n        set_cur_cell(ex, ey1);\n        delta = first + first - poly_base_size;\n        area = two_fx * delta;\n        while(ey1 != ey2) {\n            m_cur_cell.set_cover(delta, area);\n            ey1 += incr;\n            set_cur_cell(ex, ey1);\n        }\n        delta = fy2 - poly_base_size + first;\n        m_cur_cell.add_cover(delta, two_fx * delta);\n        return;\n    }\n    p     = (poly_base_size - fy1) * dx;\n    first = poly_base_size;\n    if(dy < 0) {\n        p     = fy1 * dx;\n        first = 0;\n        incr  = -1;\n        dy    = -dy;\n    }\n    delta = p / dy;\n    mod   = p % dy;\n    if(mod < 0) {\n        delta--;\n        mod += dy;\n    }\n    x_from = x1 + delta;\n    render_hline(ey1, x1, fy1, x_from, first);\n    ey1 += incr;\n    set_cur_cell(x_from >> poly_base_shift, ey1);\n    if(ey1 != ey2) {\n        p     = poly_base_size * dx;\n        lift  = p / dy;\n        rem   = p % dy;\n        if(rem < 0) {\n            lift--;\n            rem += dy;\n        }\n        mod -= dy;\n        while(ey1 != ey2) {\n            delta = lift;\n            mod  += rem;\n            if (mod >= 0) {\n                mod -= dy;\n                delta++;\n            }\n            x_to = x_from + delta;\n            render_hline(ey1, x_from, poly_base_size - first, x_to, first);\n            x_from = x_to;\n            ey1 += incr;\n            set_cur_cell(x_from >> poly_base_shift, ey1);\n        }\n    }\n    render_hline(ey1, x_from, poly_base_size - first, x2, fy2);\n}\nvoid outline_aa::move_to(int x, int y)\n{\n    if(m_sorted) {\n        reset();\n    }\n    set_cur_cell(x >> poly_base_shift, y >> poly_base_shift);\n    m_cur_x = x;\n    m_cur_y = y;\n}\nvoid outline_aa::line_to(int x, int y)\n{\n    render_line(m_cur_x, m_cur_y, x, y);\n    m_cur_x = x;\n    m_cur_y = y;\n    m_sorted = false;\n}\ntemplate <class T> static AGG_INLINE void swap_cells(T* a, T* b)\n{\n    T temp = *a;\n    *a = *b;\n    *b = temp;\n}\nenum {\n    qsort_threshold = 9\n};\nstatic void qsort_cells(cell_aa** start, unsigned num)\n{\n    cell_aa**  stack[80];\n    cell_aa*** top;\n    cell_aa**  limit;\n    cell_aa**  base;\n    limit = start + num;\n    base  = start;\n    top   = stack;\n    for (;;) {\n        int len = int(limit - base);\n        cell_aa** i;\n        cell_aa** j;\n        cell_aa** pivot;\n        if(len > qsort_threshold) {\n            pivot = base + len / 2;\n            swap_cells(base, pivot);\n            i = base + 1;\n            j = limit - 1;\n            if((*j)->x < (*i)->x) {\n                swap_cells(i, j);\n            }\n            if((*base)->x < (*i)->x) {\n                swap_cells(base, i);\n            }\n            if((*j)->x < (*base)->x) {\n                swap_cells(base, j);\n            }\n            for(;;) {\n                int x = (*base)->x;\n                do {\n                    i++;\n                } while( (*i)->x < x );\n                do {\n                    j--;\n                } while( x < (*j)->x );\n                if(i > j) {\n                    break;\n                }\n                swap_cells(i, j);\n            }\n            swap_cells(base, j);\n            if(j - base > limit - i) {\n                top[0] = base;\n                top[1] = j;\n                base   = i;\n            } else {\n                top[0] = i;\n                top[1] = limit;\n                limit  = j;\n            }\n            top += 2;\n        } else {\n            j = base;\n            i = j + 1;\n            for(; i < limit; j = i, i++) {\n                for(; j[1]->x < (*j)->x; j--) {\n                    swap_cells(j + 1, j);\n                    if (j == base) {\n                        break;\n                    }\n                }\n            }\n            if(top > stack) {\n                top  -= 2;\n                base  = top[0];\n                limit = top[1];\n            } else {\n                break;\n            }\n        }\n    }\n}\nvoid outline_aa::sort_cells()\n{\n    if(m_sorted) {\n        return;\n    }\n    add_cur_cell();\n    if(m_num_cells == 0) {\n        return;\n    }\n    m_sorted_cells.allocate(m_num_cells, 16);\n    if (m_max_y > 0 && m_min_y < 0 && -m_min_y > INT_MAX - m_max_y) {\n        return;\n    }\n    unsigned size = m_max_y - m_min_y;\n    if (size + 1 < size) {\n        return;\n    }\n    size++;\n    m_sorted_y.allocate(size, 16);\n    m_sorted_y.zero();\n    cell_aa** block_ptr = m_cells;\n    cell_aa*  cell_ptr = NULL;\n    unsigned nb = m_num_cells >> cell_block_shift;\n    unsigned i;\n    while(nb--) {\n        cell_ptr = *block_ptr++;\n        i = cell_block_size;\n        while(i--) {\n            m_sorted_y[cell_ptr->y - m_min_y].start++;\n            ++cell_ptr;\n        }\n    }\n    i = m_num_cells & cell_block_mask;\n    if (i) {\n        cell_ptr = *block_ptr++;\n    }\n    while(i--) {\n        m_sorted_y[cell_ptr->y - m_min_y].start++;\n        ++cell_ptr;\n    }\n    unsigned start = 0;\n    for(i = 0; i < m_sorted_y.size(); i++) {\n        unsigned v = m_sorted_y[i].start;\n        m_sorted_y[i].start = start;\n        start += v;\n    }\n    block_ptr = m_cells;\n    nb = m_num_cells >> cell_block_shift;\n    while(nb--) {\n        cell_ptr = *block_ptr++;\n        i = cell_block_size;\n        while(i--) {\n            sorted_y& cur_y = m_sorted_y[cell_ptr->y - m_min_y];\n            m_sorted_cells[cur_y.start + cur_y.num] = cell_ptr;\n            ++cur_y.num;\n            ++cell_ptr;\n        }\n    }\n    i = m_num_cells & cell_block_mask;\n    if (i) {\n        cell_ptr = *block_ptr++;\n    }\n    while(i--) {\n        sorted_y& cur_y = m_sorted_y[cell_ptr->y - m_min_y];\n        m_sorted_cells[cur_y.start + cur_y.num] = cell_ptr;\n        ++cur_y.num;\n        ++cell_ptr;\n    }\n    for(i = 0; i < m_sorted_y.size(); i++) {\n        const sorted_y& cur_y = m_sorted_y[i];\n        if(cur_y.num) {\n            qsort_cells(m_sorted_cells.data() + cur_y.start, cur_y.num);\n        }\n    }\n    m_sorted = true;\n}\n}\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/fx_agg_vcgen_dash.cpp",
    "content": "\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n//\n// Line dash generator\n//\n//----------------------------------------------------------------------------\n#include \"../../../../include/fxcrt/fx_basic.h\"\n#include \"agg_vcgen_dash.h\"\n#include \"agg_shorten_path.h\"\nnamespace agg\n{\nvcgen_dash::vcgen_dash() :\n    m_total_dash_len(0),\n    m_num_dashes(0),\n    m_dash_start(0),\n    m_shorten(0),\n    m_curr_dash_start(0),\n    m_curr_dash(0),\n    m_src_vertices(),\n    m_closed(0),\n    m_status(initial),\n    m_src_vertex(0)\n{\n}\nvoid vcgen_dash::remove_all_dashes()\n{\n    m_total_dash_len = 0;\n    m_num_dashes = 0;\n    m_curr_dash_start = 0;\n    m_curr_dash = 0;\n}\nvoid vcgen_dash::add_dash(FX_FLOAT dash_len, FX_FLOAT gap_len)\n{\n    if(m_num_dashes < max_dashes) {\n        m_total_dash_len += dash_len + gap_len;\n        m_dashes[m_num_dashes++] = dash_len;\n        m_dashes[m_num_dashes++] = gap_len;\n    }\n}\nvoid vcgen_dash::dash_start(FX_FLOAT ds)\n{\n    m_dash_start = ds;\n    calc_dash_start(FXSYS_fabs(ds));\n}\nvoid vcgen_dash::calc_dash_start(FX_FLOAT ds)\n{\n    m_curr_dash = 0;\n    m_curr_dash_start = 0;\n    while(ds > 0) {\n        if(ds > m_dashes[m_curr_dash]) {\n            ds -= m_dashes[m_curr_dash];\n            ++m_curr_dash;\n            m_curr_dash_start = 0;\n            if(m_curr_dash >= m_num_dashes) {\n                m_curr_dash = 0;\n            }\n        } else {\n            m_curr_dash_start = ds;\n            ds = 0;\n        }\n    }\n}\nvoid vcgen_dash::remove_all()\n{\n    m_status = initial;\n    m_src_vertices.remove_all();\n    m_closed = 0;\n}\nvoid vcgen_dash::add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd)\n{\n    m_status = initial;\n    if(is_move_to(cmd)) {\n        m_src_vertices.modify_last(vertex_dist(x, y));\n    } else {\n        if(is_vertex(cmd)) {\n            m_src_vertices.add(vertex_dist(x, y));\n        } else {\n            m_closed = get_close_flag(cmd);\n        }\n    }\n}\nvoid vcgen_dash::rewind(unsigned)\n{\n    if(m_status == initial) {\n        m_src_vertices.close(m_closed != 0);\n        shorten_path(m_src_vertices, m_shorten, m_closed);\n    }\n    m_status = ready;\n    m_src_vertex = 0;\n}\nunsigned vcgen_dash::vertex(FX_FLOAT* x, FX_FLOAT* y)\n{\n    unsigned cmd = path_cmd_move_to;\n    while(!is_stop(cmd)) {\n        switch(m_status) {\n            case initial:\n                rewind(0);\n            case ready:\n                if(m_num_dashes < 2 || m_src_vertices.size() < 2) {\n                    cmd = path_cmd_stop;\n                    break;\n                }\n                m_status = polyline;\n                m_src_vertex = 1;\n                m_v1 = &m_src_vertices[0];\n                m_v2 = &m_src_vertices[1];\n                m_curr_rest = m_v1->dist;\n                *x = m_v1->x;\n                *y = m_v1->y;\n                if(m_dash_start >= 0) {\n                    calc_dash_start(m_dash_start);\n                }\n                return path_cmd_move_to;\n            case polyline: {\n                    FX_FLOAT dash_rest = m_dashes[m_curr_dash] - m_curr_dash_start;\n                    unsigned cmd = (m_curr_dash & 1) ?\n                                   path_cmd_move_to :\n                                   path_cmd_line_to;\n                    if(m_curr_rest > dash_rest) {\n                        m_curr_rest -= dash_rest;\n                        ++m_curr_dash;\n                        if(m_curr_dash >= m_num_dashes) {\n                            m_curr_dash = 0;\n                        }\n                        m_curr_dash_start = 0;\n                        *x = m_v2->x - (m_v2->x - m_v1->x) * m_curr_rest / m_v1->dist;\n                        *y = m_v2->y - (m_v2->y - m_v1->y) * m_curr_rest / m_v1->dist;\n                    } else {\n                        m_curr_dash_start += m_curr_rest;\n                        *x = m_v2->x;\n                        *y = m_v2->y;\n                        ++m_src_vertex;\n                        m_v1 = m_v2;\n                        m_curr_rest = m_v1->dist;\n                        if(m_closed) {\n                            if(m_src_vertex > m_src_vertices.size()) {\n                                m_status = stop;\n                            } else {\n                                m_v2 = &m_src_vertices\n                                       [\n                                           (m_src_vertex >= m_src_vertices.size()) ? 0 :\n                                           m_src_vertex\n                                       ];\n                            }\n                        } else {\n                            if(m_src_vertex >= m_src_vertices.size()) {\n                                m_status = stop;\n                            } else {\n                                m_v2 = &m_src_vertices[m_src_vertex];\n                            }\n                        }\n                    }\n                    return cmd;\n                }\n                break;\n            case stop:\n                cmd = path_cmd_stop;\n                break;\n        }\n    }\n    return path_cmd_stop;\n}\n}\n"
  },
  {
    "path": "core/src/fxge/agg/agg23/fx_agg_vcgen_stroke.cpp",
    "content": "\n//----------------------------------------------------------------------------\n// XYQ: 2006-01-22 Copied from AGG project.\n// TODO: This file uses intensive floating point operations, so it's NOT suitable\n// for platforms like Symbian OS. We need to change to FIX format.\n//----------------------------------------------------------------------------\n//----------------------------------------------------------------------------\n// Anti-Grain Geometry - Version 2.3\n// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)\n//\n// Permission to copy, use, modify, sell and distribute this software\n// is granted provided this copyright notice appears in all copies.\n// This software is provided \"as is\" without express or implied\n// warranty, and with no claim as to its suitability for any purpose.\n//\n//----------------------------------------------------------------------------\n// Contact: mcseem@antigrain.com\n//          mcseemagg@yahoo.com\n//          http://www.antigrain.com\n//----------------------------------------------------------------------------\n//\n// Stroke generator\n//\n//----------------------------------------------------------------------------\n#include \"../../../../include/fxcrt/fx_basic.h\"\n#include \"agg_vcgen_stroke.h\"\nnamespace agg\n{\n\nvcgen_stroke::vcgen_stroke() :\n    m_src_vertices(),\n    m_out_vertices(),\n    m_width(0.5f),\n    m_miter_limit(4 * 1.0f),\n    m_inner_miter_limit(1.0f + 1.0f / 100),\n    m_approx_scale(1.0f),\n    m_line_cap(butt_cap),\n    m_line_join(miter_join),\n    m_inner_join(inner_miter),\n    m_closed(0),\n    m_status(initial),\n    m_src_vertex(0),\n    m_out_vertex(0)\n{\n}\nvoid vcgen_stroke::remove_all()\n{\n    m_src_vertices.remove_all();\n    m_closed = 0;\n    m_status = initial;\n}\nvoid vcgen_stroke::add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd)\n{\n    m_status = initial;\n    if(is_move_to(cmd)) {\n        m_src_vertices.modify_last(vertex_dist_cmd(x, y, cmd));\n    } else {\n        if(is_vertex(cmd)) {\n            m_src_vertices.add(vertex_dist_cmd(x, y, cmd));\n        } else {\n            m_closed = get_close_flag(cmd);\n        }\n    }\n}\nstatic inline void calc_butt_cap(FX_FLOAT* cap,\n                                 const vertex_dist& v0,\n                                 const vertex_dist& v1,\n                                 FX_FLOAT len,\n                                 FX_FLOAT width)\n{\n    FX_FLOAT dx = FXSYS_MulDiv(v1.y - v0.y, width, len);\n    FX_FLOAT dy = FXSYS_MulDiv(v1.x - v0.x, width, len);\n    cap[0] = v0.x - dx;\n    cap[1] = v0.y + dy;\n    cap[2] = v0.x + dx;\n    cap[3] = v0.y - dy;\n}\nvoid vcgen_stroke::rewind(unsigned)\n{\n    if(m_status == initial) {\n        m_src_vertices.close(m_closed != 0);\n        if(m_src_vertices.size() < 3) {\n            m_closed = 0;\n        }\n    }\n    m_status = ready;\n    m_src_vertex = 0;\n    m_out_vertex = 0;\n}\nunsigned vcgen_stroke::vertex(FX_FLOAT* x, FX_FLOAT* y)\n{\n    unsigned cmd = path_cmd_line_to;\n    line_join_e curj;\n    while(!is_stop(cmd)) {\n        switch(m_status) {\n            case initial:\n                rewind(0);\n            case ready:\n                if(m_src_vertices.size() < 2 + unsigned(m_closed != 0)) {\n                    cmd = path_cmd_stop;\n                    break;\n                }\n                m_status = m_closed ? outline1 : cap1;\n                cmd = path_cmd_move_to;\n                m_src_vertex = 0;\n                m_out_vertex = 0;\n                break;\n            case cap1:\n                stroke_calc_cap(m_out_vertices,\n                                m_src_vertices[0],\n                                m_src_vertices[1],\n                                m_src_vertices[0].dist,\n                                m_line_cap,\n                                m_width,\n                                m_approx_scale);\n                m_src_vertex = 1;\n                m_prev_status = outline1;\n                m_status = out_vertices;\n                m_out_vertex = 0;\n                break;\n            case cap2:\n                stroke_calc_cap(m_out_vertices,\n                                m_src_vertices[m_src_vertices.size() - 1],\n                                m_src_vertices[m_src_vertices.size() - 2],\n                                m_src_vertices[m_src_vertices.size() - 2].dist,\n                                m_line_cap,\n                                m_width,\n                                m_approx_scale);\n                m_prev_status = outline2;\n                m_status = out_vertices;\n                m_out_vertex = 0;\n                break;\n            case outline1:\n                if(m_closed) {\n                    if(m_src_vertex >= m_src_vertices.size()) {\n                        m_prev_status = close_first;\n                        m_status = end_poly1;\n                        break;\n                    }\n                } else {\n                    if(m_src_vertex >= m_src_vertices.size() - 1) {\n                        m_status = cap2;\n                        break;\n                    }\n                }\n                curj = m_src_vertices[m_src_vertex].cmd & path_flags_jr ? miter_join_round : m_line_join;\n                stroke_calc_join(m_out_vertices,\n                                 m_src_vertices.prev(m_src_vertex),\n                                 m_src_vertices.curr(m_src_vertex),\n                                 m_src_vertices.next(m_src_vertex),\n                                 m_src_vertices.prev(m_src_vertex).dist,\n                                 m_src_vertices.curr(m_src_vertex).dist,\n                                 m_width,\n                                 curj,\n                                 m_inner_join,\n                                 m_miter_limit,\n                                 m_inner_miter_limit,\n                                 m_approx_scale);\n                ++m_src_vertex;\n                m_prev_status = m_status;\n                m_status = out_vertices;\n                m_out_vertex = 0;\n                break;\n            case close_first:\n                m_status = outline2;\n                cmd = path_cmd_move_to;\n            case outline2:\n                if(m_src_vertex <= unsigned(m_closed == 0)) {\n                    m_status = end_poly2;\n                    m_prev_status = stop;\n                    break;\n                }\n                --m_src_vertex;\n                curj = m_src_vertices[m_src_vertex].cmd & path_flags_jr ? miter_join_round : m_line_join;\n                stroke_calc_join(m_out_vertices,\n                                 m_src_vertices.next(m_src_vertex),\n                                 m_src_vertices.curr(m_src_vertex),\n                                 m_src_vertices.prev(m_src_vertex),\n                                 m_src_vertices.curr(m_src_vertex).dist,\n                                 m_src_vertices.prev(m_src_vertex).dist,\n                                 m_width,\n                                 curj,\n                                 m_inner_join,\n                                 m_miter_limit,\n                                 m_inner_miter_limit,\n                                 m_approx_scale);\n                m_prev_status = m_status;\n                m_status = out_vertices;\n                m_out_vertex = 0;\n                break;\n            case out_vertices:\n                if(m_out_vertex >= m_out_vertices.size()) {\n                    m_status = m_prev_status;\n                } else {\n                    const point_type& c = m_out_vertices[m_out_vertex++];\n                    *x = c.x;\n                    *y = c.y;\n                    return cmd;\n                }\n                break;\n            case end_poly1:\n                m_status = m_prev_status;\n                return path_cmd_end_poly | path_flags_close | path_flags_ccw;\n            case end_poly2:\n                m_status = m_prev_status;\n                return path_cmd_end_poly | path_flags_close | path_flags_cw;\n            case stop:\n                cmd = path_cmd_stop;\n                break;\n        }\n    }\n    return cmd;\n}\n}\n"
  },
  {
    "path": "core/src/fxge/agg/include/fx_agg_driver.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_AGG_DEVICE_DRIVER_\n#define _FX_AGG_DEVICE_DRIVER_\n#include \"fxfx_agg_path_storage.h\"\n#include \"fxfx_agg_rasterizer_scanline_aa.h\"\nclass CAgg_PathData : public CFX_Object\n{\npublic:\n    CAgg_PathData() {}\n    ~CAgg_PathData() {}\n    FX_NAMESPACE_DECLARE(agg, path_storage)\tm_PathData;\n    void\t\t\tBuildPath(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device);\n};\nclass CFX_AggDeviceDriver : public IFX_RenderDeviceDriver\n{\npublic:\n    CFX_AggDeviceDriver(CFX_DIBitmap* pBitmap, int dither_bits, FX_BOOL bRgbByteOrder, CFX_DIBitmap* pOriDevice, FX_BOOL bGroupKnockout);\n    virtual ~CFX_AggDeviceDriver();\n    void\t\t\t\tInitPlatform();\n    void\t\t\t\tDestroyPlatform();\n\n\n    virtual int\t\t\tGetDeviceCaps(int caps_id);\n\n\n    virtual void\t\tSaveState();\n    virtual void\t\tRestoreState(FX_BOOL bKeepSaved);\n\n\n    virtual FX_BOOL\t\tSetClip_PathFill(const CFX_PathData* pPathData,\n                                         const CFX_AffineMatrix* pObject2Device,\n                                         int fill_mode\n                                     );\n\n\n    virtual FX_BOOL\t\tSetClip_PathStroke(const CFX_PathData* pPathData,\n                                           const CFX_AffineMatrix* pObject2Device,\n                                           const CFX_GraphStateData* pGraphState\n                                       );\n\n\n    virtual FX_BOOL\t\tDrawPath(const CFX_PathData* pPathData,\n                                 const CFX_AffineMatrix* pObject2Device,\n                                 const CFX_GraphStateData* pGraphState,\n                                 FX_DWORD fill_color,\n                                 FX_DWORD stroke_color,\n                                 int fill_mode,\n                                 int alpha_flag,\n                                 void* pIccTransform,\n                                 int blend_type\n                             );\n\n    virtual FX_BOOL\t\tSetPixel(int x, int y, FX_DWORD color,\n                                 int alpha_flag, void* pIccTransform);\n\n    virtual FX_BOOL\t\tFillRect(const FX_RECT* pRect,\n                                 FX_DWORD fill_color, int alpha_flag, void* pIccTransform, int blend_type);\n\n\n    virtual FX_BOOL\t\tDrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,\n                                         int alpha_flag, void* pIccTransform, int blend_type)\n    {\n        return FALSE;\n    }\n\n    virtual FX_BOOL\t\tGetClipBox(FX_RECT* pRect);\n\n\n    virtual FX_BOOL\t\tGetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL, FX_BOOL bDEdge = FALSE);\n    virtual CFX_DIBitmap*   GetBackDrop()\n    {\n        return m_pOriDevice;\n    }\n\n    virtual FX_BOOL\t\tSetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,\n                                  int alpha_flag, void* pIccTransform);\n    virtual FX_BOOL\t\tStretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,\n                                      int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,\n                                      int alpha_flag, void* pIccTransform, int blend_type);\n\n    virtual FX_BOOL\t\tStartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,\n                                    const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle,\n                                    int alpha_flag, void* pIccTransform, int blend_type);\n    virtual FX_BOOL\t\tContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause);\n    virtual void\t\tCancelDIBits(FX_LPVOID handle);\n\n    virtual FX_BOOL     DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,\n                                       CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,\n                                       int alpha_flag, void* pIccTransform);\n    virtual FX_BOOL\t\tRenderRasterizer(FX_NAMESPACE_DECLARE(agg, rasterizer_scanline_aa)& rasterizer, FX_DWORD color, FX_BOOL bFullCover, FX_BOOL bGroupKnockout,\n                                         int alpha_flag, void* pIccTransform);\n\n    void\t\t\t\tSetClipMask(FX_NAMESPACE_DECLARE(agg, rasterizer_scanline_aa)& rasterizer);\n\n    virtual\tFX_LPBYTE\tGetBuffer() const\n    {\n        return m_pBitmap->GetBuffer();\n    }\n    virtual int\t\t\tGetDriverType()\n    {\n        return 1;\n    }\n\n    CFX_DIBitmap*\t\tm_pBitmap;\n    CFX_ClipRgn*\t\tm_pClipRgn;\n    CFX_PtrArray\t\tm_StateStack;\n    void*\t\t\t\tm_pPlatformGraphics;\n    void*\t\t\t\tm_pPlatformBitmap;\n    void*\t\t\t\tm_pDwRenderTartget;\n    int\t\t\t\t\tm_FillFlags;\n    int\t\t\t\t\tm_DitherBits;\n    FX_BOOL\t\t\t\tm_bRgbByteOrder;\n    CFX_DIBitmap*       m_pOriDevice;\n    FX_BOOL             m_bGroupKnockout;\n};\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/include/fxfx_agg_basics.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXFX_AGG_BASICS_H_\n#define _FXFX_AGG_BASICS_H_\n#include \"../agg23/agg_basics.h\"\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/include/fxfx_agg_clip_liang_barsky.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXFX_AGG_CLIP_LIANG_BARSKY_H_\n#define _FXFX_AGG_CLIP_LIANG_BARSKY_H_\n#include \"../agg23/agg_clip_liang_barsky.h\"\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/include/fxfx_agg_conv_dash.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXFX_AGG_CONV_DASH_H_\n#define _FXFX_AGG_CONV_DASH_H_\n#include \"../agg23/agg_conv_dash.h\"\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/include/fxfx_agg_conv_stroke.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXFX_AGG_CONV_STROKE_H_\n#define _FXFX_AGG_CONV_STROKE_H_\n#include \"../agg23/agg_conv_stroke.h\"\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/include/fxfx_agg_curves.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXFX_AGG_CURVERS_H_\n#define _FXFX_AGG_CURVERS_H_\n#include \"../agg23/agg_curves.h\"\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/include/fxfx_agg_path_storage.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXFX_AGG_PATH_STORAGE_H_\n#define _FXFX_AGG_PATH_STORAGE_H_\n#include \"../agg23/agg_path_storage.h\"\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/include/fxfx_agg_rasterizer_scanline_aa.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXFX_AGG_RASTERIZER_SCANLINE_AA_H_\n#define _FXFX_AGG_RASTERIZER_SCANLINE_AA_H_\n#include \"../agg23/agg_rasterizer_scanline_aa.h\"\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/include/fxfx_agg_renderer_scanline.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXFX_AGG_RENDER_SCANLINE_H_\n#define _FXFX_AGG_RENDER_SCANLINE_H_\n#include \"../agg23/agg_renderer_scanline.h\"\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/include/fxfx_agg_rendering_buffer.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXFX_AGG_RENDERING_BUFFER_H_\n#define _FXFX_AGG_RENDERING_BUFFER_H_\n#include \"../agg23/agg_rendering_buffer.h\"\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/include/fxfx_agg_scanline_u.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXFX_AGG_SCANLINE_U_H_\n#define _FXFX_AGG_SCANLINE_U_H_\n#include \"../agg23/agg_scanline_u.h\"\n#endif\n"
  },
  {
    "path": "core/src/fxge/agg/src/fxfx_agg_curves.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../agg23/fx_agg_curves.cpp\"\n"
  },
  {
    "path": "core/src/fxge/agg/src/fxfx_agg_driver.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../agg23/fx_agg_driver.cpp\"\n"
  },
  {
    "path": "core/src/fxge/agg/src/fxfx_agg_path_storage.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../agg23/fx_agg_path_storage.cpp\"\n"
  },
  {
    "path": "core/src/fxge/agg/src/fxfx_agg_rasterizer_scanline_aa.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../agg23/fx_agg_rasterizer_scanline_aa.cpp\"\n"
  },
  {
    "path": "core/src/fxge/agg/src/fxfx_agg_vcgen_dash.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../agg23/fx_agg_vcgen_dash.cpp\"\n"
  },
  {
    "path": "core/src/fxge/agg/src/fxfx_agg_vcgen_stroke.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../agg23/fx_agg_vcgen_stroke.cpp\"\n"
  },
  {
    "path": "core/src/fxge/android/fpf_skiafont.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"fx_fpf.h\"\n#if _FX_OS_ == _FX_ANDROID_\n#include \"fpf_skiafont.h\"\n#include \"fpf_skiafontmgr.h\"\n#define FPF_EM_ADJUST(em, a) (em == 0 ? (a) : (a) * 1000 / em)\nCFPF_SkiaFont::CFPF_SkiaFont()\n    : m_pFontMgr(NULL)\n    , m_pFontDes(NULL)\n    , m_Face(NULL)\n    , m_dwStyle(0)\n    , m_uCharset(0)\n    , m_dwRefCount(0)\n{\n}\nCFPF_SkiaFont::~CFPF_SkiaFont()\n{\n    if (m_Face) {\n        FXFT_Done_Face(m_Face);\n    }\n}\nvoid CFPF_SkiaFont::Release()\n{\n    if (--m_dwRefCount == 0) {\n        delete this;\n    }\n}\nIFPF_Font* CFPF_SkiaFont::Retain()\n{\n    m_dwRefCount++;\n    return (IFPF_Font*)this;\n}\nFPF_HFONT CFPF_SkiaFont::GetHandle()\n{\n    return NULL;\n}\nCFX_ByteString CFPF_SkiaFont::GetFamilyName()\n{\n    if (!m_Face) {\n        return CFX_ByteString();\n    }\n    return CFX_ByteString(FXFT_Get_Face_Family_Name(m_Face));\n}\nCFX_WideString CFPF_SkiaFont::GetPsName()\n{\n    if (!m_Face) {\n        return CFX_WideString();\n    }\n    return CFX_WideString::FromLocal(FXFT_Get_Postscript_Name(m_Face));\n}\nFX_INT32 CFPF_SkiaFont::GetGlyphIndex(FX_WCHAR wUnicode)\n{\n    if (!m_Face) {\n        return wUnicode;\n    }\n    if (FXFT_Select_Charmap(m_Face, FXFT_ENCODING_UNICODE)) {\n        return 0;\n    }\n    return FXFT_Get_Char_Index(m_Face, wUnicode);\n}\nFX_INT32 CFPF_SkiaFont::GetGlyphWidth(FX_INT32 iGlyphIndex)\n{\n    if (!m_Face) {\n        return 0;\n    }\n    if (FXFT_Load_Glyph(m_Face, iGlyphIndex, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) {\n        return 0;\n    }\n    return FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriAdvance(m_Face));\n}\nFX_INT32 CFPF_SkiaFont::GetAscent() const\n{\n    if (!m_Face) {\n        return 0;\n    }\n    return FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Ascender(m_Face));\n}\nFX_INT32 CFPF_SkiaFont::GetDescent() const\n{\n    if (!m_Face) {\n        return 0;\n    }\n    return FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Descender(m_Face));\n}\nFX_BOOL CFPF_SkiaFont::GetGlyphBBox(FX_INT32 iGlyphIndex, FX_RECT &rtBBox)\n{\n    if (!m_Face) {\n        return FALSE;\n    }\n    if (FXFT_Is_Face_Tricky(m_Face)) {\n        if (FXFT_Set_Char_Size(m_Face, 0, 1000 * 64, 72, 72)) {\n            return FALSE;\n        }\n        if (FXFT_Load_Glyph(m_Face, iGlyphIndex, FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) {\n            FXFT_Set_Pixel_Sizes(m_Face, 0, 64);\n            return FALSE;\n        }\n        FXFT_Glyph glyph;\n        if (FXFT_Get_Glyph(m_Face->glyph, &glyph)) {\n            FXFT_Set_Pixel_Sizes(m_Face, 0, 64);\n            return FALSE;\n        }\n        FXFT_BBox cbox;\n        FXFT_Glyph_Get_CBox(glyph, FXFT_GLYPH_BBOX_PIXELS, &cbox);\n        FX_INT32 x_ppem = m_Face->size->metrics.x_ppem;\n        FX_INT32 y_ppem = m_Face->size->metrics.y_ppem;\n        rtBBox.left = FPF_EM_ADJUST(x_ppem, cbox.xMin);\n        rtBBox.right = FPF_EM_ADJUST(x_ppem, cbox.xMax);\n        rtBBox.top = FPF_EM_ADJUST(y_ppem, cbox.yMax);\n        rtBBox.bottom = FPF_EM_ADJUST(y_ppem, cbox.yMin);\n        rtBBox.top = FX_MIN(rtBBox.top, GetAscent());\n        rtBBox.bottom = FX_MAX(rtBBox.bottom, GetDescent());\n        FXFT_Done_Glyph(glyph);\n        return FXFT_Set_Pixel_Sizes(m_Face, 0, 64) == 0;\n    }\n    if (FXFT_Load_Glyph(m_Face, iGlyphIndex, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) {\n        return FALSE;\n    }\n    rtBBox.left = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriBearingX(m_Face));\n    rtBBox.bottom = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriBearingY(m_Face));\n    rtBBox.right = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriBearingX(m_Face) + FXFT_Get_Glyph_Width(m_Face));\n    rtBBox.top = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriBearingY(m_Face) - FXFT_Get_Glyph_Height(m_Face));\n    return TRUE;\n}\nFX_BOOL CFPF_SkiaFont::GetBBox(FX_RECT &rtBBox)\n{\n    if (!m_Face) {\n        return FALSE;\n    }\n    rtBBox.left = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_xMin(m_Face));\n    rtBBox.top = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_yMin(m_Face));\n    rtBBox.right = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_xMax(m_Face));\n    rtBBox.bottom = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_yMax(m_Face));\n    return TRUE;\n}\nFX_INT32 CFPF_SkiaFont::GetHeight() const\n{\n    if (!m_Face) {\n        return 0;\n    }\n    return\tFPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Height(m_Face));\n}\nFX_INT32 CFPF_SkiaFont::GetItalicAngle() const\n{\n    if (!m_Face) {\n        return 0;\n    }\n    TT_Postscript *ttInfo = (TT_Postscript*)FT_Get_Sfnt_Table(m_Face, ft_sfnt_post);\n    if (ttInfo) {\n        return ttInfo->italicAngle;\n    }\n    return 0;\n}\nFX_DWORD CFPF_SkiaFont::GetFontData(FX_DWORD dwTable, FX_LPBYTE pBuffer, FX_DWORD dwSize)\n{\n    if (!m_Face) {\n        return FALSE;\n    }\n    if (FXFT_Load_Sfnt_Table(m_Face, dwTable, 0, pBuffer, (unsigned long*)&dwSize)) {\n        return 0;\n    }\n    return dwSize;\n}\nFX_BOOL CFPF_SkiaFont::InitFont(CFPF_SkiaFontMgr *pFontMgr, CFPF_SkiaFontDescriptor *pFontDes, FX_BSTR bsFamily, FX_DWORD dwStyle, FX_BYTE uCharset)\n{\n    if (!pFontMgr || !pFontDes) {\n        return FALSE;\n    }\n    switch (pFontDes->GetType()) {\n        case FPF_SKIAFONTTYPE_Path: {\n                CFPF_SkiaPathFont *pFont = (CFPF_SkiaPathFont*)pFontDes;\n                m_Face = pFontMgr->GetFontFace(pFont->m_pPath, pFont->m_iFaceIndex);\n            }\n            break;\n        case FPF_SKIAFONTTYPE_File: {\n                CFPF_SkiaFileFont *pFont = (CFPF_SkiaFileFont*)pFontDes;\n                m_Face = pFontMgr->GetFontFace(pFont->m_pFile, pFont->m_iFaceIndex);\n            }\n            break;\n        case FPF_SKIAFONTTYPE_Buffer: {\n                CFPF_SkiaBufferFont *pFont = (CFPF_SkiaBufferFont*)pFontDes;\n                m_Face = pFontMgr->GetFontFace((FX_LPCBYTE)pFont->m_pBuffer, pFont->m_szBuffer, pFont->m_iFaceIndex);\n            }\n            break;\n        default:\n            return FALSE;\n    }\n    if (!m_Face) {\n        return FALSE;\n    }\n    m_dwStyle = dwStyle;\n    m_uCharset = uCharset;\n    m_pFontMgr = pFontMgr;\n    m_pFontDes = pFontDes;\n    m_dwRefCount = 1;\n    return TRUE;\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/android/fpf_skiafont.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPF_SKIA_FONT_H_\n#define _FPF_SKIA_FONT_H_\n#if _FX_OS_ == _FX_ANDROID_\nclass CFPF_SkiaFontDescriptor;\nclass CFPF_SkiaFontMgr;\nclass SkTypeface;\nclass CFPF_SkiaFont : public IFPF_Font, public CFX_Object\n{\npublic:\n    CFPF_SkiaFont();\n    virtual ~CFPF_SkiaFont();\n    virtual void\t\t\tRelease();\n    virtual IFPF_Font*\t\tRetain();\n\n    virtual FPF_HFONT\t\tGetHandle();\n\n    virtual CFX_ByteString\tGetFamilyName();\n    virtual CFX_WideString\tGetPsName();\n\n    virtual FX_DWORD\t\tGetFontStyle() const\n    {\n        return m_dwStyle;\n    }\n    virtual FX_BYTE\t\t\tGetCharset() const\n    {\n        return m_uCharset;\n    }\n\n    virtual FX_INT32\t\tGetGlyphIndex(FX_WCHAR wUnicode);\n    virtual FX_INT32\t\tGetGlyphWidth(FX_INT32 iGlyphIndex);\n\n    virtual FX_INT32\t\tGetAscent() const;\n    virtual FX_INT32\t\tGetDescent() const;\n\n    virtual FX_BOOL\t\t\tGetGlyphBBox(FX_INT32 iGlyphIndex, FX_RECT &rtBBox);\n    virtual FX_BOOL\t\t\tGetBBox(FX_RECT &rtBBox);\n\n    virtual FX_INT32\t\tGetHeight() const;\n    virtual FX_INT32\t\tGetItalicAngle() const;\n    virtual FX_DWORD\t\tGetFontData(FX_DWORD dwTable, FX_LPBYTE pBuffer, FX_DWORD dwSize);\n    FX_BOOL\t\t\t\t\tInitFont(CFPF_SkiaFontMgr *pFontMgr, CFPF_SkiaFontDescriptor *pFontDes, FX_BSTR bsFamily, FX_DWORD dwStyle, FX_BYTE uCharset);\nprotected:\n    CFPF_SkiaFontMgr\t\t*m_pFontMgr;\n    CFPF_SkiaFontDescriptor\t*m_pFontDes;\n    FXFT_Face\t\t\t\tm_Face;\n    FX_DWORD\t\t\t\tm_dwStyle;\n    FX_BYTE\t\t\t\t\tm_uCharset;\n    FX_DWORD\t\t\t\tm_dwRefCount;\n};\n#endif\n#endif\n"
  },
  {
    "path": "core/src/fxge/android/fpf_skiafontmgr.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"fx_fpf.h\"\n#if _FX_OS_ == _FX_ANDROID_\n#define FPF_SKIAMATCHWEIGHT_NAME1\t62\n#define FPF_SKIAMATCHWEIGHT_NAME2\t60\n#define FPF_SKIAMATCHWEIGHT_1\t\t16\n#define FPF_SKIAMATCHWEIGHT_2\t\t8\n#include \"fpf_skiafontmgr.h\"\n#include \"fpf_skiafont.h\"\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nstatic unsigned long FPF_SkiaStream_Read(FXFT_Stream stream, unsigned long offset, unsigned char* buffer, unsigned long count)\n{\n    IFX_FileRead *pFileRead = (IFX_FileRead*)stream->descriptor.pointer;\n    if (!pFileRead) {\n        return 0;\n    }\n    if (count > 0) {\n        if (pFileRead->ReadBlock(buffer, (FX_FILESIZE)offset, (size_t)count) != count) {\n            return 0;\n        }\n    }\n    return count;\n}\nstatic void FPF_SkiaStream_Close(FXFT_Stream stream)\n{\n}\n#ifdef __cplusplus\n};\n#endif\ntypedef struct _FPF_SKIAFONTMAP {\n    FX_DWORD\tdwFamily;\n    FX_DWORD\tdwSubSt;\n} FPF_SKIAFONTMAP, *FPF_LPSKIAFONTMAP;\ntypedef FPF_SKIAFONTMAP const * FPF_LPCSKIAFONTMAP;\nstatic const FPF_SKIAFONTMAP g_SkiaFontmap[] = {\n    {0x58c5083,\t\t0xc8d2e345},\n    {0x5dfade2,\t\t0xe1633081},\n    {0x684317d,\t\t0xe1633081},\n    {0x14ee2d13,\t0xc8d2e345},\n    {0x3918fe2d,\t0xbbeeec72},\n    {0x3b98b31c,\t0xe1633081},\n    {0x3d49f40e,\t0xe1633081},\n    {0x432c41c5,\t0xe1633081},\n    {0x491b6ad0,\t0xe1633081},\n    {0x5612cab1,\t0x59b9f8f1},\n    {0x779ce19d,\t0xc8d2e345},\n    {0x7cc9510b,\t0x59b9f8f1},\n    {0x83746053,\t0xbbeeec72},\n    {0xaaa60c03,\t0xbbeeec72},\n    {0xbf85ff26,\t0xe1633081},\n    {0xc04fe601,\t0xbbeeec72},\n    {0xca3812d5,\t0x59b9f8f1},\n    {0xca383e15,\t0x59b9f8f1},\n    {0xcad5eaf6,\t0x59b9f8f1},\n    {0xcb7a04c8,\t0xc8d2e345},\n    {0xfb4ce0de,\t0xe1633081},\n};\nFX_DWORD FPF_SkiaGetSubstFont(FX_DWORD dwHash)\n{\n    FX_INT32 iStart = 0;\n    FX_INT32 iEnd = sizeof(g_SkiaFontmap) / sizeof(FPF_SKIAFONTMAP);\n    while (iStart <= iEnd) {\n        FX_INT32 iMid = (iStart + iEnd) / 2;\n        FPF_LPCSKIAFONTMAP pItem = &g_SkiaFontmap[iMid];\n        if (dwHash < pItem->dwFamily) {\n            iEnd = iMid - 1;\n        } else if (dwHash > pItem->dwFamily) {\n            iStart = iMid + 1;\n        } else {\n            return pItem->dwSubSt;\n        }\n    }\n    return NULL;\n}\nstatic const FPF_SKIAFONTMAP g_SkiaSansFontMap[] = {\n    {0x58c5083,\t\t0xd5b8d10f},\n    {0x14ee2d13,\t0xd5b8d10f},\n    {0x779ce19d,\t0xd5b8d10f},\n    {0xcb7a04c8,\t0xd5b8d10f},\n    {0xfb4ce0de,\t0xd5b8d10f},\n};\nFX_DWORD FPF_SkiaGetSansFont(FX_DWORD dwHash)\n{\n    FX_INT32 iStart = 0;\n    FX_INT32 iEnd = sizeof(g_SkiaSansFontMap) / sizeof(FPF_SKIAFONTMAP);\n    while (iStart <= iEnd) {\n        FX_INT32 iMid = (iStart + iEnd) / 2;\n        FPF_LPCSKIAFONTMAP pItem = &g_SkiaSansFontMap[iMid];\n        if (dwHash < pItem->dwFamily) {\n            iEnd = iMid - 1;\n        } else if (dwHash > pItem->dwFamily) {\n            iStart = iMid + 1;\n        } else {\n            return pItem->dwSubSt;\n        }\n    }\n    return 0;\n}\nstatic FX_UINT32 FPF_GetHashCode_StringA(FX_LPCSTR pStr, FX_INT32 iLength, FX_BOOL bIgnoreCase = FALSE)\n{\n    if (!pStr) {\n        return 0;\n    }\n    if (iLength < 0) {\n        iLength = FXSYS_strlen(pStr);\n    }\n    FX_LPCSTR pStrEnd = pStr + iLength;\n    FX_UINT32 uHashCode = 0;\n    if (bIgnoreCase) {\n        while (pStr < pStrEnd) {\n            uHashCode = 31 * uHashCode + FXSYS_tolower(*pStr++);\n        }\n    } else {\n        while (pStr < pStrEnd) {\n            uHashCode = 31 * uHashCode + *pStr ++;\n        }\n    }\n    return uHashCode;\n}\nenum FPF_SKIACHARSET {\n    FPF_SKIACHARSET_Ansi\t\t\t= 1 << 0,\n    FPF_SKIACHARSET_Default\t\t\t= 1 << 1,\n    FPF_SKIACHARSET_Symbol\t\t\t= 1 << 2,\n    FPF_SKIACHARSET_ShiftJIS\t\t= 1 << 3,\n    FPF_SKIACHARSET_Korean\t\t\t= 1 << 4,\n    FPF_SKIACHARSET_Johab\t\t\t= 1 << 5,\n    FPF_SKIACHARSET_GB2312\t\t\t= 1 << 6,\n    FPF_SKIACHARSET_BIG5\t\t\t= 1 << 7,\n    FPF_SKIACHARSET_Greek\t\t\t= 1 << 8,\n    FPF_SKIACHARSET_Turkish\t\t\t= 1 << 9,\n    FPF_SKIACHARSET_Vietnamese\t\t= 1 << 10,\n    FPF_SKIACHARSET_Hebrew\t\t\t= 1 << 11,\n    FPF_SKIACHARSET_Arabic\t\t\t= 1 << 12,\n    FPF_SKIACHARSET_Baltic\t\t\t= 1 << 13,\n    FPF_SKIACHARSET_Cyrillic\t\t= 1 << 14,\n    FPF_SKIACHARSET_Thai\t\t\t= 1 << 15,\n    FPF_SKIACHARSET_EeasternEuropean = 1 << 16,\n    FPF_SKIACHARSET_PC\t\t\t\t= 1 << 17,\n    FPF_SKIACHARSET_OEM\t\t\t\t= 1 << 18,\n};\nstatic FX_DWORD FPF_SkiaGetCharset(FX_BYTE uCharset)\n{\n    switch (uCharset) {\n        case FXFONT_ANSI_CHARSET:\n            return FPF_SKIACHARSET_Ansi;\n        case FXFONT_DEFAULT_CHARSET:\n            return FPF_SKIACHARSET_Default;\n        case FXFONT_SYMBOL_CHARSET:\n            return FPF_SKIACHARSET_Symbol;\n        case FXFONT_SHIFTJIS_CHARSET:\n            return FPF_SKIACHARSET_ShiftJIS;\n        case FXFONT_HANGEUL_CHARSET:\n            return FPF_SKIACHARSET_Korean;\n        case FXFONT_GB2312_CHARSET:\n            return FPF_SKIACHARSET_GB2312;\n        case FXFONT_CHINESEBIG5_CHARSET:\n            return FPF_SKIACHARSET_BIG5;\n        case FXFONT_GREEK_CHARSET:\n            return FPF_SKIACHARSET_Greek;\n        case FXFONT_TURKISH_CHARSET:\n            return FPF_SKIACHARSET_Turkish;\n        case FXFONT_HEBREW_CHARSET:\n            return FPF_SKIACHARSET_Hebrew;\n        case FXFONT_ARABIC_CHARSET:\n            return FPF_SKIACHARSET_Arabic;\n        case FXFONT_BALTIC_CHARSET:\n            return FPF_SKIACHARSET_Baltic;\n        case FXFONT_RUSSIAN_CHARSET:\n            return FPF_SKIACHARSET_Cyrillic;\n        case FXFONT_THAI_CHARSET:\n            return FPF_SKIACHARSET_Thai;\n        case FXFONT_EASTEUROPE_CHARSET:\n            return FPF_SKIACHARSET_EeasternEuropean;\n    }\n    return FPF_SKIACHARSET_Default;\n}\nstatic FX_DWORD FPF_SKIANormalizeFontName(FX_BSTR bsfamily)\n{\n    FX_DWORD dwHash = 0;\n    FX_INT32 iLength = bsfamily.GetLength();\n    FX_LPCSTR pBuffer = bsfamily.GetCStr();\n    for (FX_INT32 i = 0; i < iLength; i++) {\n        FX_CHAR ch = pBuffer[i];\n        if (ch == ' ' || ch == '-' || ch == ',') {\n            continue;\n        }\n        dwHash = 31 * dwHash + FXSYS_tolower(ch);\n    }\n    return dwHash;\n}\nstatic FX_DWORD\tFPF_SKIAGetFamilyHash(FX_BSTR bsFamily, FX_DWORD dwStyle, FX_BYTE uCharset)\n{\n    CFX_ByteString bsFont(bsFamily);\n    if (dwStyle & FXFONT_BOLD) {\n        bsFont += \"Bold\";\n    }\n    if (dwStyle & FXFONT_ITALIC) {\n        bsFont += \"Italic\";\n    }\n    if (dwStyle & FXFONT_SERIF)\t{\n        bsFont += \"Serif\";\n    }\n    bsFont += uCharset;\n    return FPF_GetHashCode_StringA((FX_LPCSTR)bsFont, bsFont.GetLength(), TRUE);\n}\nstatic FX_BOOL FPF_SkiaIsCJK(FX_BYTE uCharset)\n{\n    return (uCharset == FXFONT_GB2312_CHARSET) || (uCharset == FXFONT_CHINESEBIG5_CHARSET)\n           || (uCharset == FXFONT_HANGEUL_CHARSET) || (uCharset == FXFONT_SHIFTJIS_CHARSET);\n}\nstatic FX_BOOL FPF_SkiaMaybeSymbol(FX_BSTR bsFacename)\n{\n    CFX_ByteString bsName = bsFacename;\n    bsName.MakeLower();\n    return bsName.Find(\"symbol\") > -1;\n}\nstatic FX_BOOL FPF_SkiaMaybeArabic(FX_BSTR bsFacename)\n{\n    CFX_ByteString bsName = bsFacename;\n    bsName.MakeLower();\n    return bsName.Find(\"arabic\") > -1;\n}\nCFPF_SkiaFontMgr::CFPF_SkiaFontMgr()\n    : m_bLoaded(FALSE), m_FTLibrary(NULL)\n{\n}\nCFPF_SkiaFontMgr::~CFPF_SkiaFontMgr()\n{\n    void *pkey = NULL;\n    CFPF_SkiaFont *pValue = NULL;\n    FX_POSITION pos = m_FamilyFonts.GetStartPosition();\n    while (pos) {\n        m_FamilyFonts.GetNextAssoc(pos, pkey, (void*&)pValue);\n        if (pValue) {\n            pValue->Release();\n        }\n    }\n    m_FamilyFonts.RemoveAll();\n    for (FX_INT32 i = m_FontFaces.GetUpperBound(); i >= 0; i--) {\n        CFPF_SkiaFontDescriptor *pFont = (CFPF_SkiaFontDescriptor*)m_FontFaces.ElementAt(i);\n        if (pFont) {\n            delete pFont;\n        }\n    }\n    m_FontFaces.RemoveAll();\n    if (m_FTLibrary) {\n        FXFT_Done_FreeType(m_FTLibrary);\n    }\n}\nFX_BOOL CFPF_SkiaFontMgr::InitFTLibrary()\n{\n    if (m_FTLibrary == NULL) {\n        FXFT_Init_FreeType(&m_FTLibrary);\n    }\n    return m_FTLibrary != NULL;\n}\nvoid CFPF_SkiaFontMgr::LoadSystemFonts()\n{\n    if (m_bLoaded) {\n        return;\n    }\n    ScanPath(FX_BSTRC(\"/system/fonts\"));\n    OutputSystemFonts();\n    m_bLoaded = TRUE;\n}\nvoid CFPF_SkiaFontMgr::LoadPrivateFont(IFX_FileRead* pFontFile)\n{\n}\nvoid CFPF_SkiaFontMgr::LoadPrivateFont(FX_BSTR bsFileName)\n{\n}\nvoid CFPF_SkiaFontMgr::LoadPrivateFont(FX_LPVOID pBuffer, size_t szBuffer)\n{\n}\nIFPF_Font* CFPF_SkiaFontMgr::CreateFont(FX_BSTR bsFamilyname, FX_BYTE uCharset, FX_DWORD dwStyle, FX_DWORD dwMatch)\n{\n    FX_DWORD dwHash = FPF_SKIAGetFamilyHash(bsFamilyname, dwStyle, uCharset);\n    IFPF_Font *pFont = NULL;\n    if (m_FamilyFonts.Lookup((void*)(FX_UINTPTR)dwHash, (void*&)pFont)) {\n        if (pFont) {\n            return pFont->Retain();\n        }\n    }\n    FX_DWORD dwFaceName = FPF_SKIANormalizeFontName(bsFamilyname);\n    FX_DWORD dwSubst = FPF_SkiaGetSubstFont(dwFaceName);\n    FX_DWORD dwSubstSans = FPF_SkiaGetSansFont(dwFaceName);\n    FX_BOOL bMaybeSymbol = FPF_SkiaMaybeSymbol(bsFamilyname);\n    if (uCharset != FXFONT_ARABIC_CHARSET && FPF_SkiaMaybeArabic(bsFamilyname)) {\n        uCharset = FXFONT_ARABIC_CHARSET;\n    } else if (uCharset == FXFONT_ANSI_CHARSET && (dwMatch & FPF_MATCHFONT_REPLACEANSI)) {\n        uCharset = FXFONT_DEFAULT_CHARSET;\n    }\n    FX_INT32 nExpectVal = FPF_SKIAMATCHWEIGHT_NAME1 + FPF_SKIAMATCHWEIGHT_1 * 3 + FPF_SKIAMATCHWEIGHT_2 * 2;\n    FX_INT32 nItem = -1;\n    FX_INT32 nMax = -1;\n    FX_INT32 nGlyphNum = 0;\n    for (FX_INT32 i = m_FontFaces.GetUpperBound(); i >= 0; i--) {\n        CFPF_SkiaPathFont *pFontDes = (CFPF_SkiaPathFont*)m_FontFaces.ElementAt(i);\n        if(!(pFontDes->m_dwCharsets & FPF_SkiaGetCharset(uCharset))) {\n            continue;\n        }\n        FX_INT32 nFind = 0;\n        FX_DWORD dwSysFontName = FPF_SKIANormalizeFontName(pFontDes->m_pFamily);\n        if (dwFaceName == dwSysFontName) {\n            nFind += FPF_SKIAMATCHWEIGHT_NAME1;\n        }\n        FX_BOOL bMatchedName = (nFind == FPF_SKIAMATCHWEIGHT_NAME1);\n        if ((dwStyle & FXFONT_BOLD) == (pFontDes->m_dwStyle & FXFONT_BOLD)) {\n            nFind += FPF_SKIAMATCHWEIGHT_1;\n        }\n        if ((dwStyle & FXFONT_ITALIC) == (pFontDes->m_dwStyle & FXFONT_ITALIC)) {\n            nFind += FPF_SKIAMATCHWEIGHT_1;\n        }\n        if ((dwStyle & FXFONT_FIXED_PITCH) == (pFontDes->m_dwStyle & FXFONT_FIXED_PITCH)) {\n            nFind += FPF_SKIAMATCHWEIGHT_2;\n        }\n        if ((dwStyle & FXFONT_SERIF) == (pFontDes->m_dwStyle & FXFONT_SERIF)) {\n            nFind += FPF_SKIAMATCHWEIGHT_1;\n        }\n        if ((dwStyle & FXFONT_SCRIPT) == (pFontDes->m_dwStyle & FXFONT_SCRIPT)) {\n            nFind += FPF_SKIAMATCHWEIGHT_2;\n        }\n        if (dwSubst == dwSysFontName || dwSubstSans == dwSysFontName) {\n            nFind += FPF_SKIAMATCHWEIGHT_NAME2;\n            bMatchedName = TRUE;\n        }\n        if (uCharset == FXFONT_DEFAULT_CHARSET || bMaybeSymbol) {\n            if (nFind > nMax && bMatchedName) {\n                nMax = nFind;\n                nItem = i;\n            }\n        } else if (FPF_SkiaIsCJK(uCharset)) {\n            if (bMatchedName || pFontDes->m_iGlyphNum > nGlyphNum) {\n                nItem = i;\n                nGlyphNum = pFontDes->m_iGlyphNum;\n            }\n        } else if (nFind > nMax) {\n            nMax = nFind;\n            nItem = i;\n        }\n        if (nExpectVal <= nFind) {\n            nItem = i;\n            break;\n        }\n    }\n    if (nItem > -1) {\n        CFPF_SkiaFontDescriptor *pFontDes = (CFPF_SkiaFontDescriptor*)m_FontFaces.ElementAt(nItem);\n        CFPF_SkiaFont *pFont = FX_NEW CFPF_SkiaFont;\n        if (pFont) {\n            if (pFont->InitFont(this, pFontDes, bsFamilyname, dwStyle, uCharset)) {\n                m_FamilyFonts.SetAt((void*)(FX_UINTPTR)dwHash, (void*)pFont);\n                return pFont->Retain();\n            }\n            pFont->Release();\n            pFont = NULL;\n        }\n        return pFont;\n    }\n    return NULL;\n}\nFXFT_Face CFPF_SkiaFontMgr::GetFontFace(IFX_FileRead *pFileRead, FX_INT32 iFaceIndex)\n{\n    if (!pFileRead) {\n        return NULL;\n    }\n    if (pFileRead->GetSize() == 0) {\n        return NULL;\n    }\n    if (iFaceIndex < 0) {\n        return NULL;\n    }\n    FXFT_StreamRec streamRec;\n    FXSYS_memset32(&streamRec, 0, sizeof(FXFT_StreamRec));\n    streamRec.size = pFileRead->GetSize();\n    streamRec.descriptor.pointer = pFileRead;\n    streamRec.read = FPF_SkiaStream_Read;\n    streamRec.close = FPF_SkiaStream_Close;\n    FXFT_Open_Args args;\n    args.flags = FT_OPEN_STREAM;\n    args.stream = &streamRec;\n    FXFT_Face face;\n    if (FXFT_Open_Face(m_FTLibrary, &args, iFaceIndex, &face)) {\n        return NULL;\n    }\n    FXFT_Set_Pixel_Sizes(face, 0, 64);\n    return face;\n}\nFXFT_Face CFPF_SkiaFontMgr::GetFontFace(FX_BSTR bsFile, FX_INT32 iFaceIndex )\n{\n    if (bsFile.IsEmpty()) {\n        return NULL;\n    }\n    if (iFaceIndex < 0) {\n        return NULL;\n    }\n    FXFT_Open_Args args;\n    args.flags = FT_OPEN_PATHNAME;\n    args.pathname = (FT_String*)bsFile.GetCStr();\n    FXFT_Face face;\n    if (FXFT_Open_Face(m_FTLibrary, &args, iFaceIndex, &face)) {\n        return FALSE;\n    }\n    FXFT_Set_Pixel_Sizes(face, 0, 64);\n    return face;\n}\nFXFT_Face CFPF_SkiaFontMgr::GetFontFace(FX_LPCBYTE pBuffer, size_t szBuffer, FX_INT32 iFaceIndex )\n{\n    if (!pBuffer || szBuffer < 1) {\n        return NULL;\n    }\n    if (iFaceIndex < 0) {\n        return NULL;\n    }\n    FXFT_Open_Args args;\n    args.flags = FT_OPEN_MEMORY;\n    args.memory_base = pBuffer;\n    args.memory_size = szBuffer;\n    FXFT_Face face;\n    if (FXFT_Open_Face(m_FTLibrary, &args, iFaceIndex, &face)) {\n        return FALSE;\n    }\n    FXFT_Set_Pixel_Sizes(face, 0, 64);\n    return face;\n}\nvoid CFPF_SkiaFontMgr::ScanPath(FX_BSTR path)\n{\n    void *handle = FX_OpenFolder(path.GetCStr());\n    if (!handle) {\n        return;\n    }\n    CFX_ByteString filename;\n    FX_BOOL\tbFolder = FALSE;\n    while (FX_GetNextFile(handle, filename, bFolder)) {\n        if (bFolder) {\n            if (filename == FX_BSTRC(\".\") || filename == FX_BSTRC(\"..\")) {\n                continue;\n            }\n        } else {\n            CFX_ByteString ext = filename.Right(4);\n            ext.MakeLower();\n            if (ext != FX_BSTRC(\".ttf\") && ext != FX_BSTRC(\".ttc\")) {\n                continue;\n            }\n        }\n        CFX_ByteString fullpath = path;\n        fullpath += \"/\";\n        fullpath += filename;\n        if (bFolder) {\n            ScanPath(fullpath);\n        } else {\n            ScanFile(fullpath);\n        }\n    }\n    FX_CloseFolder(handle);\n}\nvoid CFPF_SkiaFontMgr::ScanFile(FX_BSTR file)\n{\n    FXFT_Face face = GetFontFace(file);\n    if (face) {\n        CFPF_SkiaPathFont *pFontDesc = FX_NEW CFPF_SkiaPathFont;\n        if (!pFontDesc) {\n            return;\n        }\n        pFontDesc->SetPath(file.GetCStr());\n        ReportFace(face, pFontDesc);\n        m_FontFaces.Add(pFontDesc);\n        FXFT_Done_Face(face);\n    }\n}\nstatic const FX_DWORD g_FPFSkiaFontCharsets [] = {\n    FPF_SKIACHARSET_Ansi,\n    FPF_SKIACHARSET_EeasternEuropean,\n    FPF_SKIACHARSET_Cyrillic,\n    FPF_SKIACHARSET_Greek,\n    FPF_SKIACHARSET_Turkish,\n    FPF_SKIACHARSET_Hebrew,\n    FPF_SKIACHARSET_Arabic,\n    FPF_SKIACHARSET_Baltic,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    FPF_SKIACHARSET_Thai,\n    FPF_SKIACHARSET_ShiftJIS,\n    FPF_SKIACHARSET_GB2312,\n    FPF_SKIACHARSET_Korean,\n    FPF_SKIACHARSET_BIG5,\n    FPF_SKIACHARSET_Johab,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    FPF_SKIACHARSET_OEM,\n    FPF_SKIACHARSET_Symbol,\n};\nstatic FX_DWORD FPF_SkiaGetFaceCharset(TT_OS2 *pOS2)\n{\n    FX_DWORD dwCharset = 0;\n    if (pOS2) {\n        for (FX_INT32 i = 0; i < 32; i++) {\n            if (pOS2->ulCodePageRange1 & (1 << i)) {\n                dwCharset |= g_FPFSkiaFontCharsets[i];\n            }\n        }\n    }\n    dwCharset |= FPF_SKIACHARSET_Default;\n    return dwCharset;\n}\nvoid CFPF_SkiaFontMgr::ReportFace(FXFT_Face face, CFPF_SkiaFontDescriptor *pFontDesc)\n{\n    if (!face || !pFontDesc) {\n        return;\n    }\n    pFontDesc->SetFamily(FXFT_Get_Face_Family_Name(face));\n    if (FXFT_Is_Face_Bold(face))\t{\n        pFontDesc->m_dwStyle |= FXFONT_BOLD;\n    }\n    if (FXFT_Is_Face_Italic(face))\t{\n        pFontDesc->m_dwStyle |= FXFONT_ITALIC;\n    }\n    if (FT_IS_FIXED_WIDTH(face))\t{\n        pFontDesc->m_dwStyle |= FXFONT_FIXED_PITCH;\n    }\n    TT_OS2 *pOS2 = (TT_OS2*)FT_Get_Sfnt_Table(face, ft_sfnt_os2);\n    if (pOS2) {\n        if (pOS2->ulCodePageRange1 & (1 << 31)) {\n            pFontDesc->m_dwStyle |= FXFONT_SYMBOLIC;\n        }\n        if (pOS2->panose[0] == 2) {\n            FX_BYTE uSerif = pOS2->panose[1];\n            if ((uSerif > 1 && uSerif < 10) || uSerif > 13) {\n                pFontDesc->m_dwStyle |= FXFONT_SERIF;\n            }\n        }\n    }\n    if (pOS2 && (pOS2->ulCodePageRange1 & (1 << 31))) {\n        pFontDesc->m_dwStyle |= FXFONT_SYMBOLIC;\n    }\n    pFontDesc->m_dwCharsets = FPF_SkiaGetFaceCharset(pOS2);\n    pFontDesc->m_iFaceIndex = face->face_index;\n    pFontDesc->m_iGlyphNum = face->num_glyphs;\n}\nvoid CFPF_SkiaFontMgr::OutputSystemFonts()\n{\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/android/fpf_skiafontmgr.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPF_SKIA_FONTMGR_H_\n#define _FPF_SKIA_FONTMGR_H_\n#if _FX_OS_ == _FX_ANDROID_\n#define FPF_SKIAFONTTYPE_Unknown\t0\n#define\tFPF_SKIAFONTTYPE_Path\t\t1\n#define FPF_SKIAFONTTYPE_File\t\t2\n#define FPF_SKIAFONTTYPE_Buffer\t\t3\nclass CFPF_SkiaFontDescriptor : public CFX_Object\n{\npublic:\n    CFPF_SkiaFontDescriptor() : m_pFamily(NULL), m_dwStyle(0), m_iFaceIndex(0), m_dwCharsets(0), m_iGlyphNum(0) {}\n    virtual ~CFPF_SkiaFontDescriptor()\n    {\n        if (m_pFamily) {\n            FX_Free(m_pFamily);\n        }\n    }\n    virtual\tFX_INT32\tGetType() const\n    {\n        return FPF_SKIAFONTTYPE_Unknown;\n    }\n    void\t\t\t\tSetFamily(FX_LPCSTR pFamily)\n    {\n        if (m_pFamily) {\n            FX_Free(m_pFamily);\n        }\n        FX_INT32 iSize = FXSYS_strlen(pFamily);\n        m_pFamily = FX_Alloc(FX_CHAR, iSize + 1);\n        FXSYS_memcpy32(m_pFamily, pFamily, iSize * sizeof(FX_CHAR));\n        m_pFamily[iSize] = 0;\n    }\n    FX_LPSTR\t\tm_pFamily;\n    FX_DWORD\t\tm_dwStyle;\n    FX_INT32\t\tm_iFaceIndex;\n    FX_DWORD\t\tm_dwCharsets;\n    FX_INT32\t\tm_iGlyphNum;\n};\nclass CFPF_SkiaPathFont : public CFPF_SkiaFontDescriptor\n{\npublic:\n    CFPF_SkiaPathFont() : m_pPath(NULL) {}\n    virtual ~CFPF_SkiaPathFont()\n    {\n        if (m_pPath) {\n            FX_Free(m_pPath);\n        }\n    }\n    virtual\tFX_INT32\tGetType() const\n    {\n        return FPF_SKIAFONTTYPE_Path;\n    }\n    void\t\t\t\tSetPath(FX_LPCSTR pPath)\n    {\n        if (m_pPath) {\n            FX_Free(m_pPath);\n        }\n        FX_INT32 iSize = FXSYS_strlen(pPath);\n        m_pPath = FX_Alloc(FX_CHAR, iSize + 1);\n        FXSYS_memcpy32(m_pPath, pPath, iSize * sizeof(FX_CHAR));\n        m_pPath[iSize] = 0;\n    }\n    FX_LPSTR\t\tm_pPath;\n};\nclass CFPF_SkiaFileFont : public CFPF_SkiaFontDescriptor\n{\npublic:\n    CFPF_SkiaFileFont() : m_pFile(NULL) {}\n    virtual FX_INT32\tGetType() const\n    {\n        return FPF_SKIAFONTTYPE_File;\n    }\n    IFX_FileRead\t\t*m_pFile;\n};\nclass CFPF_SkiaBufferFont : public CFPF_SkiaFontDescriptor\n{\npublic:\n    CFPF_SkiaBufferFont() : m_pBuffer(NULL), m_szBuffer(0) {}\n    virtual FX_INT32\tGetType() const\n    {\n        return FPF_SKIAFONTTYPE_Buffer;\n    }\n    FX_LPVOID\t\t\tm_pBuffer;\n    size_t\t\t\t\tm_szBuffer;\n};\nclass CFPF_SkiaFontMgr : public IFPF_FontMgr, public CFX_Object\n{\npublic:\n    CFPF_SkiaFontMgr();\n    virtual ~CFPF_SkiaFontMgr();\n    FX_BOOL\t\t\t\t\tInitFTLibrary();\n    virtual void\t\t\tLoadSystemFonts();\n    virtual void\t\t\tLoadPrivateFont(IFX_FileRead* pFontFile);\n    virtual void\t\t\tLoadPrivateFont(FX_BSTR bsFileName);\n    virtual void\t\t\tLoadPrivateFont(FX_LPVOID pBuffer, size_t szBuffer);\n\n    virtual IFPF_Font*\t\tCreateFont(FX_BSTR bsFamilyname, FX_BYTE uCharset, FX_DWORD dwStyle, FX_DWORD dwMatch = 0);\n    FXFT_Face\t\t\t\tGetFontFace(IFX_FileRead *pFileRead, FX_INT32 iFaceIndex = 0);\n    FXFT_Face\t\t\t\tGetFontFace(FX_BSTR bsFile, FX_INT32 iFaceIndex = 0);\n    FXFT_Face\t\t\t\tGetFontFace(FX_LPCBYTE pBuffer, size_t szBuffer, FX_INT32 iFaceIndex = 0);\nprotected:\n    void\t\t\t\tScanPath(FX_BSTR path);\n    void\t\t\t\tScanFile(FX_BSTR file);\n    void\t\t\t\tReportFace(FXFT_Face face, CFPF_SkiaFontDescriptor *pFontDesc);\n    void\t\t\t\tOutputSystemFonts();\n    FX_BOOL\t\t\t\tm_bLoaded;\n    CFX_PtrArray\t\tm_FontFaces;\n    FXFT_Library\t\tm_FTLibrary;\n    CFX_MapPtrToPtr\t\tm_FamilyFonts;\n};\n#endif\n#endif\n"
  },
  {
    "path": "core/src/fxge/android/fpf_skiamodule.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"fx_fpf.h\"\n#if _FX_OS_ == _FX_ANDROID_\n#include \"fpf_skiamodule.h\"\n#include \"fpf_skiafontmgr.h\"\nstatic IFPF_DeviceModule *gs_pPFModule = NULL;\nIFPF_DeviceModule* FPF_GetDeviceModule()\n{\n    if (!gs_pPFModule) {\n        gs_pPFModule = FX_NEW CFPF_SkiaDeviceModule;\n    }\n    return gs_pPFModule;\n}\nCFPF_SkiaDeviceModule::~CFPF_SkiaDeviceModule()\n{\n    if (m_pFontMgr) {\n        delete m_pFontMgr;\n    }\n}\nvoid CFPF_SkiaDeviceModule::Destroy()\n{\n    if (gs_pPFModule) {\n        delete (CFPF_SkiaDeviceModule*)gs_pPFModule;\n        gs_pPFModule = NULL;\n    }\n}\nIFPF_FontMgr* CFPF_SkiaDeviceModule::GetFontMgr()\n{\n    if (!m_pFontMgr) {\n        m_pFontMgr = FX_NEW CFPF_SkiaFontMgr;\n        if (!m_pFontMgr) {\n            return NULL;\n        }\n        if (!m_pFontMgr->InitFTLibrary()) {\n            delete m_pFontMgr;\n            return NULL;\n        }\n    }\n    return (IFPF_FontMgr*)m_pFontMgr;\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/android/fpf_skiamodule.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPF_MODULE_H_\n#define _FPF_MODULE_H_\n#if _FX_OS_ == _FX_ANDROID_\nclass CFPF_SkiaFontMgr;\nclass CFPF_SkiaDeviceModule : public IFPF_DeviceModule, public CFX_Object\n{\npublic:\n    CFPF_SkiaDeviceModule() : m_pFontMgr(NULL) {}\n    virtual ~CFPF_SkiaDeviceModule();\n    virtual void\t\t\t\tDestroy();\n    virtual IFPF_FontMgr*\t\tGetFontMgr();\nprotected:\n    CFPF_SkiaFontMgr\t*m_pFontMgr;\n};\n#endif\n#endif\n"
  },
  {
    "path": "core/src/fxge/android/fx_android_font.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"fx_fpf.h\"\n#if _FX_OS_ == _FX_ANDROID_\nCFX_AndroidFontInfo::CFX_AndroidFontInfo()\n    : m_pFontMgr(NULL)\n{\n}\nFX_BOOL CFX_AndroidFontInfo::Init(IFPF_FontMgr *pFontMgr)\n{\n    if (!pFontMgr) {\n        return FALSE;\n    }\n    pFontMgr->LoadSystemFonts();\n    m_pFontMgr = pFontMgr;\n    return TRUE;\n}\nFX_BOOL CFX_AndroidFontInfo::EnumFontList(CFX_FontMapper* pMapper)\n{\n    return FALSE;\n}\nvoid* CFX_AndroidFontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR face, FX_BOOL& bExact)\n{\n    if (!m_pFontMgr) {\n        return NULL;\n    }\n    FX_DWORD dwStyle = 0;\n    if (weight >= 700) {\n        dwStyle |= FXFONT_BOLD;\n    }\n    if (bItalic) {\n        dwStyle |= FXFONT_ITALIC;\n    }\n    if (pitch_family & FXFONT_FF_FIXEDPITCH) {\n        dwStyle |= FXFONT_FIXED_PITCH;\n    }\n    if (pitch_family & FXFONT_FF_SCRIPT) {\n        dwStyle |= FXFONT_SCRIPT;\n    }\n    if (pitch_family & FXFONT_FF_ROMAN) {\n        dwStyle |= FXFONT_SERIF;\n    }\n    return m_pFontMgr->CreateFont(face, charset, dwStyle, FPF_MATCHFONT_REPLACEANSI);\n}\nvoid* CFX_AndroidFontInfo::GetFont(FX_LPCSTR face)\n{\n    return NULL;\n}\nFX_DWORD CFX_AndroidFontInfo::GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size)\n{\n    if (!hFont) {\n        return 0;\n    }\n    return ((IFPF_Font*)hFont)->GetFontData(table, buffer, size);\n}\nFX_BOOL CFX_AndroidFontInfo::GetFaceName(void* hFont, CFX_ByteString& name)\n{\n    if (!hFont) {\n        return FALSE;\n    }\n    name = ((IFPF_Font*)hFont)->GetFamilyName();\n    return TRUE;\n}\nFX_BOOL CFX_AndroidFontInfo::GetFontCharset(void* hFont, int& charset)\n{\n    if (!hFont) {\n        return FALSE;\n    }\n    charset = ((IFPF_Font*)hFont)->GetCharset();\n    return FALSE;\n}\nvoid CFX_AndroidFontInfo::DeleteFont(void* hFont)\n{\n    if (!hFont) {\n        return;\n    }\n    ((IFPF_Font*)hFont)->Release();\n}\nvoid* CFX_AndroidFontInfo::RetainFont(void* hFont)\n{\n    return NULL;\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/android/fx_android_font.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_ANDROID_FONT_H_\n#define _FX_ANDROID_FONT_H_\n#if _FX_OS_ == _FX_ANDROID_\nclass IFPF_FontMgr;\nclass CFX_AndroidFontInfo : public IFX_SystemFontInfo\n{\npublic:\n    CFX_AndroidFontInfo();\n    virtual void\t\tRelease()\n    {\n        delete this;\n    }\n\n    virtual\tFX_BOOL\t\tEnumFontList(CFX_FontMapper* pMapper);\n\n    virtual void*\t\tMapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR face, FX_BOOL& bExact);\n\n    virtual void*\t\tGetFont(FX_LPCSTR face);\n    virtual FX_DWORD\tGetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size);\n    virtual FX_BOOL\t\tGetFaceName(void* hFont, CFX_ByteString& name);\n    virtual FX_BOOL\t\tGetFontCharset(void* hFont, int& charset);\n\n    virtual void\t\tDeleteFont(void* hFont);\n    virtual void*       RetainFont(void* hFont);\n    FX_BOOL\t\t\t\tInit(IFPF_FontMgr *pFontMgr);\nprotected:\n    IFPF_FontMgr\t\t*m_pFontMgr;\n};\n#endif\n#endif\n"
  },
  {
    "path": "core/src/fxge/android/fx_android_imp.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"fx_fpf.h\"\n#if _FX_OS_ == _FX_ANDROID_\nvoid CFX_GEModule::InitPlatform()\n{\n    IFPF_DeviceModule *pDeviceModule = FPF_GetDeviceModule();\n    if (!pDeviceModule) {\n        return;\n    }\n    IFPF_FontMgr *pFontMgr = pDeviceModule->GetFontMgr();\n    if (pFontMgr) {\n        CFX_AndroidFontInfo *pFontInfo = FX_NEW CFX_AndroidFontInfo;\n        if (!pFontInfo) {\n            return;\n        }\n        pFontInfo->Init(pFontMgr);\n        m_pFontMgr->SetSystemFontInfo(pFontInfo);\n    }\n    m_pPlatformData = pDeviceModule;\n}\nvoid CFX_GEModule::DestroyPlatform()\n{\n    if (m_pPlatformData) {\n        ((IFPF_DeviceModule*)m_pPlatformData)->Destroy();\n    }\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/android/fx_fpf.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_FPF_H_\n#define _FX_FPF_H_\n#include \"../../../include/fxcrt/fx_ext.h\"\n#include \"../../../include/fxge/fx_ge.h\"\n#include \"../../../include/fxge/fx_freetype.h\"\n#include \"../../../include/fxge/fpf.h\"\n#include \"fx_android_font.h\"\n#endif\n"
  },
  {
    "path": "core/src/fxge/apple/apple_int.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _APPLE_INT_H_\n#define _APPLE_INT_H_\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n#if _FX_OS_ == _FX_MACOSX_\n#include <Carbon/Carbon.h>\n#endif\ntypedef enum eFXIOSFONTCHARSET {\n    eFXFontCharsetDEFAULT       =   0,\n    eFXFontCharsetANSI          =   1,\n    eFXFontCharsetSYMBOL        =   1 << 1,\n    eFXFontCharsetSHIFTJIS      =   1 << 2,\n    eFXFontCharsetHANGEUL       =   1 << 3,\n    eFXFontCharsetGB2312        =   1 << 4,\n    eFXFontCharsetCHINESEBIG5   =   1 << 5,\n    eFXFontCharsetTHAI          =   1 << 6,\n    eFXFontCharsetEASTEUROPE    =   1 << 7,\n    eFXFontCharsetRUSSIAN       =   1 << 8,\n    eFXFontCharsetGREEK         =   1 << 9,\n    eFXFontCharsetTURKISH       =   1 << 10,\n    eFXFontCharsetHEBREW        =   1 << 11,\n    eFXFontCharsetARABIC        =   1 << 12,\n    eFXFontCharsetBALTIC        =   1 << 13,\n} FX_IOSCHARSET;\nFX_IOSCHARSET FX_GetiOSCharset(int charset);\ntypedef enum eFXIOSFONTFLAG {\n    eFXFontFlagBold         =  1,\n    eFXFontFlagItalic       =  1 << 1,\n    eFXFontFlagFixedPitch   =  1 << 2,\n    eFXFontFlagSerif        =  1 << 3,\n    eFXFontFlagScript       =  1 << 4,\n} FX_IOSFONTFLAG;\ntypedef struct _IOS_FONTDATA {\n    FX_DWORD        nHashCode;\n    const char*       psName;\n    FX_DWORD        charsets;\n    FX_DWORD        styles;\n} IOS_FONTDATA;\nclass CQuartz2D\n{\npublic:\n    void*\tcreateGraphics(CFX_DIBitmap* bitmap);\n    void\tdestroyGraphics(void* graphics);\n\n    void*\tCreateFont(FX_LPCBYTE pFontData, FX_DWORD dwFontSize);\n    void\tDestroyFont(void* pFont);\n    void\tsetGraphicsTextMatrix(void* graphics, CFX_AffineMatrix* matrix);\n    FX_BOOL\tdrawGraphicsString(void*                graphics,\n                               void*                font,\n                               FX_FLOAT             fontSize,\n                               FX_WORD*             glyphIndices,\n                               CGPoint*          glyphPositions,\n                               FX_INT32             chars,\n                               FX_ARGB              argb,\n                               CFX_AffineMatrix*    matrix = NULL);\n    void saveGraphicsState(void* graphics);\n    void restoreGraphicsState(void* graphics);\n};\nclass CApplePlatform : public CFX_Object\n{\npublic:\n    CApplePlatform()\n    {\n        m_pFontMapper = NULL;\n    }\n    ~CApplePlatform()\n    {\n        if (m_pFontMapper) {\n            delete m_pFontMapper;\n        }\n    }\n    CQuartz2D\t_quartz2d;\n    IFX_FontMapper* m_pFontMapper;\n};\nclass CFX_QuartzDeviceDriver : public IFX_RenderDeviceDriver\n{\npublic:\n    CFX_QuartzDeviceDriver(CGContextRef context, FX_INT32 deviceClass);\n    virtual ~CFX_QuartzDeviceDriver();\n\n    virtual int\t\tGetDeviceCaps(int caps_id);\n    virtual CFX_Matrix\tGetCTM() const;\n    virtual CFX_DIBitmap*   GetBackDrop()\n    {\n        return NULL;\n    }\n    virtual void*\tGetPlatformSurface()\n    {\n        return NULL;\n    }\n    virtual FX_BOOL IsPSPrintDriver()\n    {\n        return FALSE;\n    }\n    virtual FX_BOOL\tStartRendering()\n    {\n        return TRUE;\n    }\n    virtual void\tEndRendering() {}\n    virtual void\tSaveState();\n    virtual void\tRestoreState(FX_BOOL bKeepSaved);\n    virtual FX_BOOL\tSetClip_PathFill(const CFX_PathData* pPathData,\n                                     const CFX_AffineMatrix* pObject2Device,\n                                     int fill_mode\n                                    );\n    virtual FX_BOOL\tSetClip_PathStroke(const CFX_PathData* pPathData,\n                                       const CFX_AffineMatrix* pObject2Device,\n                                       const CFX_GraphStateData* pGraphState\n                                      );\n    virtual FX_BOOL\tDrawPath(const CFX_PathData* pPathData,\n                             const CFX_AffineMatrix* pObject2Device,\n                             const CFX_GraphStateData* pGraphState,\n                             FX_DWORD fill_color,\n                             FX_DWORD stroke_color,\n                             int fill_mode,\n                             int alpha_flag = 0,\n                             void* pIccTransform = NULL,\n                             int blend_type = FXDIB_BLEND_NORMAL\n                            );\n    virtual FX_BOOL\tSetPixel(int x, int y, FX_DWORD color,\n                             int alpha_flag = 0, void* pIccTransform = NULL)\n    {\n        return FALSE;\n    }\n    virtual FX_BOOL FillRect(const FX_RECT* pRect, FX_DWORD fill_color,\n                             int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);\n    virtual FX_BOOL\tDrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,\n                                     int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);\n    virtual FX_BOOL GetClipBox(FX_RECT* pRect);\n    virtual FX_BOOL\tGetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL, FX_BOOL bDEdge = FALSE);\n    virtual FX_BOOL\tSetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect,\n                              int dest_left, int dest_top, int blend_type,\n                              int alpha_flag = 0, void* pIccTransform = NULL);\n    virtual FX_BOOL\tStretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,\n                                  int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,\n                                  int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);\n    virtual FX_BOOL\tStartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,\n                                const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle,\n                                int alpha_flag = 0, void* pIccTransform = NULL,\n                                int blend_type = FXDIB_BLEND_NORMAL)\n    {\n        return FALSE;\n    }\n    virtual FX_BOOL\tContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause)\n    {\n        return FALSE;\n    }\n    virtual void\tCancelDIBits(FX_LPVOID handle) {}\n    virtual FX_BOOL DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,\n                                   CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,\n                                   int alpha_flag = 0, void* pIccTransform = NULL);\n    virtual void    ClearDriver();\nprotected:\n    void setStrokeInfo(const CFX_GraphStateData * graphState, FX_ARGB argb, FX_FLOAT lineWidth);\n    void setFillInfo(FX_ARGB argb);\n    void setPathToContext(const CFX_PathData * pathData);\n    FX_FLOAT getLineWidth(const CFX_GraphStateData * graphState, CGAffineTransform ctm);\n    FX_BOOL CG_DrawGlypRun(int                        nChars,\n                           const FXTEXT_CHARPOS*      pCharPos,\n                           CFX_Font*                  pFont,\n                           CFX_FontCache*             pCache,\n                           const CFX_AffineMatrix*    pGlyphMatrix,\n                           const CFX_AffineMatrix*    pObject2Device,\n                           FX_FLOAT                   font_size,\n                           FX_DWORD                   argb,\n                           int                        alpha_flag,\n                           void*                      pIccTransform);\n    void    CG_SetImageTransform(int dest_left, int dest_top, int dest_width, int dest_height, CGRect* rect = NULL);\nprotected:\n    CGContextRef\t_context;\n    CGAffineTransform _foxitDevice2User;\n    CGAffineTransform _user2FoxitDevice;\n    FX_INT32        m_saveCount;\n\n    FX_INT32\t\t_width;\n    FX_INT32\t\t_height;\n    FX_INT32\t\t_bitsPerPixel;\n    FX_INT32\t\t_deviceClass;\n    FX_INT32\t\t_renderCaps;\n    FX_INT32\t_horzSize;\n    FX_INT32\t_vertSize;\n};\nclass CFX_FontProvider FX_FINAL : public IFX_FileRead\n{\npublic:\n    virtual void\t\t\tRelease()\n    {\n        delete this;\n    }\n    virtual FX_FILESIZE\t\tGetSize()\n    {\n        return (FX_FILESIZE)_totalSize;\n    }\n    virtual FX_BOOL\t\t\tReadBlock(void* buffer, FX_FILESIZE offset, size_t size);\n\n    virtual FX_BOOL\t\t\tIsEOF()\n    {\n        return _offSet == _totalSize;\n    }\n    virtual FX_FILESIZE\t\tGetPosition()\n    {\n        return (FX_FILESIZE)_offSet;\n    }\n    virtual size_t\t\t\tReadBlock(void* buffer, size_t size);\npublic:\n    CFX_FontProvider(CGFontRef cgFont);\n    ~CFX_FontProvider();\n    void            InitTableOffset();\n    unsigned long   Read(unsigned long offset, unsigned char *buffer, unsigned long count);\nprotected:\n    uint32_t CalcTableCheckSum(const uint32_t *table, uint32_t numberOfBytesInTable);\n    uint32_t CalcTableDataRefCheckSum(CFDataRef dataRef);\nprivate:\n    CGFontRef   m_cgFont;\n    UInt32      m_iTableSize;\n    size_t      _offSet;\n    typedef struct FontHeader {\n        int32_t fVersion;\n        uint16_t fNumTables;\n        uint16_t fSearchRange;\n        uint16_t fEntrySelector;\n        uint16_t fRangeShift;\n    } FontHeader;\n    typedef struct TableEntry {\n        uint32_t fTag;\n        uint32_t fCheckSum;\n        uint32_t fOffset;\n        uint32_t fLength;\n    } TableEntry;\n    FontHeader _fontHeader;\n    unsigned char * _tableEntries;\n    size_t * _tableOffsets;\n    int _tableCount;\n    int _totalSize;\n};\nFX_UINT32 FX_GetHashCode( FX_LPCSTR pStr);\nFX_DWORD  FX_IOSGetMatchFamilyNameHashcode(FX_LPCSTR pFontName);\nFX_UINT32 FX_IOSGetFamilyNamesCount();\nFX_LPCSTR FX_IOSGetFamilyName( FX_UINT32 uIndex);\n#endif\n#endif\n"
  },
  {
    "path": "core/src/fxge/apple/fx_apple_platform.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxcrt/fx_ext.h\"\n#include \"../../../include/fxge/fx_ge.h\"\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n#include \"apple_int.h\"\n#include \"../../../include/fxge/fx_ge_apple.h\"\n#include \"../agg/include/fxfx_agg_clip_liang_barsky.h\"\n#include \"../ge/text_int.h\"\n#include \"../dib/dib_int.h\"\n#include \"../agg/include/fx_agg_driver.h\"\n#include \"../../../include/fxge/fx_freetype.h\"\n#if (_FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_ && (!defined(_FPDFAPI_MINI_)))\nvoid CFX_AggDeviceDriver::InitPlatform()\n{\n    CQuartz2D & quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;\n    m_pPlatformGraphics = quartz2d.createGraphics(m_pBitmap);\n}\nvoid CFX_AggDeviceDriver::DestroyPlatform()\n{\n    CQuartz2D & quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;\n    if (m_pPlatformGraphics) {\n        quartz2d.destroyGraphics(m_pPlatformGraphics);\n        m_pPlatformGraphics = NULL;\n    }\n}\nvoid CFX_FaceCache::InitPlatform() {}\nvoid CFX_FaceCache::DestroyPlatform() {}\nCFX_GlyphBitmap* CFX_FaceCache::RenderGlyph_Nativetext(CFX_Font *\t\t\t\tpFont,\n        FX_DWORD\t\t\t\t\tglyph_index,\n        const CFX_AffineMatrix *\tpMatrix,\n        int\t\t\t\t\t\tdest_width,\n        int\t\t\t\t\t\tanti_alias)\n{\n    return NULL;\n}\nstatic FX_BOOL _CGDrawGlyphRun(CGContextRef               pContext,\n                               int                        nChars,\n                               const FXTEXT_CHARPOS*      pCharPos,\n                               CFX_Font*                  pFont,\n                               CFX_FontCache*             pCache,\n                               const CFX_AffineMatrix*    pObject2Device,\n                               FX_FLOAT                   font_size,\n                               FX_DWORD                   argb,\n                               int                        alpha_flag,\n                               void*                      pIccTransform)\n{\n    if (nChars == 0) {\n        return TRUE;\n    }\n    CFX_AffineMatrix new_matrix;\n    FX_BOOL bNegSize = font_size < 0;\n    if (bNegSize) {\n        font_size = -font_size;\n    }\n    FX_FLOAT ori_x = pCharPos[0].m_OriginX, ori_y = pCharPos[0].m_OriginY;\n    new_matrix.Transform(ori_x, ori_y);\n    if (pObject2Device) {\n        new_matrix.Concat(*pObject2Device);\n    }\n    CQuartz2D& quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;\n    if (!pFont->m_pPlatformFont) {\n        if (pFont->GetPsName() == CFX_WideString::FromLocal(\"DFHeiStd-W5\")) {\n            return FALSE;\n        }\n        pFont->m_pPlatformFont = quartz2d.CreateFont(pFont->m_pFontData, pFont->m_dwSize);\n        if (NULL == pFont->m_pPlatformFont) {\n            return FALSE;\n        }\n    }\n    CFX_FixedBufGrow<FX_WORD, 32> glyph_indices(nChars);\n    CFX_FixedBufGrow<CGPoint, 32> glyph_positions(nChars);\n    for (int i = 0; i < nChars; i++ ) {\n        glyph_indices[i] = pCharPos[i].m_ExtGID;\n        if (bNegSize) {\n            glyph_positions[i].x = -pCharPos[i].m_OriginX;\n        } else {\n            glyph_positions[i].x = pCharPos[i].m_OriginX;\n        }\n        glyph_positions[i].y = pCharPos[i].m_OriginY;\n    }\n    if (bNegSize) {\n        new_matrix.a = -new_matrix.a;\n    } else {\n        new_matrix.b = -new_matrix.b;\n        new_matrix.d = -new_matrix.d;\n    }\n    quartz2d.setGraphicsTextMatrix(pContext, &new_matrix);\n    return quartz2d.drawGraphicsString(pContext,\n                                       pFont->m_pPlatformFont,\n                                       font_size,\n                                       glyph_indices,\n                                       glyph_positions,\n                                       nChars,\n                                       argb,\n                                       NULL);\n}\nstatic void _DoNothing(void *info, const void *data, size_t size) {}\nFX_BOOL CFX_AggDeviceDriver::DrawDeviceText(int\t\t\t\t\t\t nChars,\n        const FXTEXT_CHARPOS *\t pCharPos,\n        CFX_Font *\t\t\t\t pFont,\n        CFX_FontCache *\t\t\t pCache,\n        const CFX_AffineMatrix * pObject2Device,\n        FX_FLOAT\t\t\t\t font_size,\n        FX_DWORD\t\t\t\t argb,\n        int alpha_flag, void* pIccTransform)\n{\n    if (!pFont) {\n        return FALSE;\n    }\n    FX_BOOL bBold = pFont->IsBold();\n    if (!bBold && pFont->GetSubstFont() &&\n            pFont->GetSubstFont()->m_Weight >= 500 &&\n            pFont->GetSubstFont()->m_Weight <= 600) {\n        return FALSE;\n    }\n    for (int i = 0; i < nChars; i ++) {\n        if (pCharPos[i].m_bGlyphAdjust) {\n            return FALSE;\n        }\n    }\n    CGContextRef ctx = CGContextRef(m_pPlatformGraphics);\n    if (NULL == ctx) {\n        return FALSE;\n    }\n    CGContextSaveGState(ctx);\n    CGContextSetTextDrawingMode(ctx, kCGTextFillClip);\n    CGRect rect_cg;\n    CGImageRef pImageCG = NULL;\n    if (m_pClipRgn) {\n        rect_cg = CGRectMake(m_pClipRgn->GetBox().left, m_pClipRgn->GetBox().top, m_pClipRgn->GetBox().Width(), m_pClipRgn->GetBox().Height());\n        const CFX_DIBitmap*\tpClipMask = m_pClipRgn->GetMask();\n        if (pClipMask) {\n            CGDataProviderRef pClipMaskDataProvider = CGDataProviderCreateWithData(NULL,\n                    pClipMask->GetBuffer(),\n                    pClipMask->GetPitch() * pClipMask->GetHeight(),\n                    _DoNothing);\n            CGFloat decode_f[2] = {255.f, 0.f};\n            pImageCG = CGImageMaskCreate(pClipMask->GetWidth(), pClipMask->GetHeight(),\n                                         8, 8, pClipMask->GetPitch(), pClipMaskDataProvider,\n                                         decode_f, FALSE);\n            CGDataProviderRelease(pClipMaskDataProvider);\n        }\n    } else {\n        rect_cg = CGRectMake(0, 0, m_pBitmap->GetWidth(), m_pBitmap->GetHeight());\n    }\n    rect_cg = CGContextConvertRectToDeviceSpace(ctx, rect_cg);\n    if (pImageCG) {\n        CGContextClipToMask(ctx, rect_cg, pImageCG);\n    } else {\n        CGContextClipToRect(ctx, rect_cg);\n    }\n    FX_BOOL ret = _CGDrawGlyphRun(ctx, nChars, pCharPos, pFont, pCache, pObject2Device, font_size, argb, alpha_flag, pIccTransform);\n    if (pImageCG) {\n        CGImageRelease(pImageCG);\n    }\n    CGContextRestoreGState(ctx);\n    return ret;\n}\nvoid CFX_Font::ReleasePlatformResource()\n{\n    if (m_pPlatformFont) {\n        CQuartz2D & quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;\n        quartz2d.DestroyFont(m_pPlatformFont);\n        m_pPlatformFont = NULL;\n    }\n}\n#endif\n#endif\n"
  },
  {
    "path": "core/src/fxge/apple/fx_mac_imp.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxge/fx_ge.h\"\n#include \"apple_int.h\"\n#if _FX_OS_ == _FX_MACOSX_\nstatic const struct {\n    FX_LPCSTR\tm_pName;\n    FX_LPCSTR\tm_pSubstName;\n}\nBase14Substs[] = {\n    {\"Courier\", \"Courier New\"},\n    {\"Courier-Bold\", \"Courier New Bold\"},\n    {\"Courier-BoldOblique\", \"Courier New Bold Italic\"},\n    {\"Courier-Oblique\", \"Courier New Italic\"},\n    {\"Helvetica\", \"Arial\"},\n    {\"Helvetica-Bold\", \"Arial Bold\"},\n    {\"Helvetica-BoldOblique\", \"Arial Bold Italic\"},\n    {\"Helvetica-Oblique\", \"Arial Italic\"},\n    {\"Times-Roman\", \"Times New Roman\"},\n    {\"Times-Bold\", \"Times New Roman Bold\"},\n    {\"Times-BoldItalic\", \"Times New Roman Bold Italic\"},\n    {\"Times-Italic\", \"Times New Roman Italic\"},\n};\n#if !defined(_FPDFAPI_MINI_)\nclass CFX_MacFontInfo : public CFX_FolderFontInfo\n{\npublic:\n    virtual void*\t\tMapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL& bExact);\n};\n#define JAPAN_GOTHIC \"Hiragino Kaku Gothic Pro W6\"\n#define JAPAN_MINCHO \"Hiragino Mincho Pro W6\"\nstatic void GetJapanesePreference(CFX_ByteString& face, int weight, int picth_family)\n{\n    if (face.Find(\"Gothic\") >= 0) {\n        face = JAPAN_GOTHIC;\n        return;\n    }\n    if (!(picth_family & FXFONT_FF_ROMAN) && weight > 400) {\n        face = JAPAN_GOTHIC;\n    } else {\n        face = JAPAN_MINCHO;\n    }\n}\nvoid* CFX_MacFontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR cstr_face, FX_BOOL& bExact)\n{\n    CFX_ByteString face = cstr_face;\n    int iBaseFont;\n    for (iBaseFont = 0; iBaseFont < 12; iBaseFont ++)\n        if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) {\n            face = Base14Substs[iBaseFont].m_pSubstName;\n            bExact = TRUE;\n            break;\n        }\n    if (iBaseFont < 12) {\n        return GetFont(face);\n    }\n    FX_LPVOID p;\n    if (m_FontList.Lookup(face, p)) {\n        return p;\n    }\n    if (charset == FXFONT_ANSI_CHARSET && (pitch_family & FXFONT_FF_FIXEDPITCH)) {\n        return GetFont(\"Courier New\");\n    }\n    if (charset == FXFONT_ANSI_CHARSET || charset == FXFONT_SYMBOL_CHARSET) {\n        return NULL;\n    }\n    switch (charset) {\n        case FXFONT_SHIFTJIS_CHARSET:\n            GetJapanesePreference(face, weight, pitch_family);\n            break;\n        case FXFONT_GB2312_CHARSET:\n            face = \"STSong\";\n            break;\n        case FXFONT_HANGEUL_CHARSET:\n            face = \"AppleMyungjo\";\n            break;\n        case FXFONT_CHINESEBIG5_CHARSET:\n            face = \"LiSong Pro Light\";\n    }\n    if (m_FontList.Lookup(face, p)) {\n        return p;\n    }\n    return NULL;\n}\n#endif\nIFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()\n{\n#if !defined(_FPDFAPI_MINI_)\n    CFX_MacFontInfo* pInfo = FX_NEW CFX_MacFontInfo;\n    if (!pInfo) {\n        return NULL;\n    }\n    pInfo->AddPath(\"~/Library/Fonts\");\n    pInfo->AddPath(\"/Library/Fonts\");\n    pInfo->AddPath(\"/System/Library/Fonts\");\n    return pInfo;\n#else\n    return NULL;\n#endif\n}\nvoid CFX_GEModule::InitPlatform()\n{\n    m_pPlatformData = FX_NEW CApplePlatform;\n    m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault());\n}\nvoid CFX_GEModule::DestroyPlatform()\n{\n    if (m_pPlatformData) {\n        delete (CApplePlatform *) m_pPlatformData;\n    }\n    m_pPlatformData = NULL;\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/apple/fx_quartz_device.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxcrt/fx_ext.h\"\n#include \"../../../include/fxge/fx_ge.h\"\n#include \"../agg/include/fxfx_agg_clip_liang_barsky.h\"\n#include \"../ge/text_int.h\"\n#include \"../dib/dib_int.h\"\n#include \"../agg/include/fx_agg_driver.h\"\n#include \"../../../include/fxge/fx_freetype.h\"\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n#include \"apple_int.h\"\n#include \"../../../include/fxge/fx_ge_apple.h\"\n#ifndef CGFLOAT_IS_DOUBLE\n#error Expected CGFLOAT_IS_DOUBLE to be defined by CoreGraphics headers\n#endif\nvoid* CQuartz2D::createGraphics(CFX_DIBitmap* pBitmap)\n{\n    if (!pBitmap) {\n        return NULL;\n    }\n    CGBitmapInfo bmpInfo = kCGBitmapByteOrder32Little;\n    switch (pBitmap->GetFormat()) {\n        case FXDIB_Rgb32:\n            bmpInfo |= kCGImageAlphaNoneSkipFirst;\n            break;\n        case FXDIB_Argb:\n        default:\n            return NULL;\n    }\n    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();\n    CGContextRef context = CGBitmapContextCreate(pBitmap->GetBuffer(),\n                           pBitmap->GetWidth(),\n                           pBitmap->GetHeight(),\n                           8,\n                           pBitmap->GetPitch(),\n                           colorSpace,\n                           bmpInfo);\n    CGColorSpaceRelease(colorSpace);\n    return context;\n}\nvoid CQuartz2D::destroyGraphics(void* graphics)\n{\n    if (graphics) {\n        CGContextRelease((CGContextRef) graphics);\n    }\n}\nvoid* CQuartz2D::CreateFont(FX_LPCBYTE pFontData, FX_DWORD dwFontSize)\n{\n    CGDataProviderRef pDataProvider = CGDataProviderCreateWithData(NULL, pFontData, (size_t)dwFontSize, NULL);\n    if (NULL == pDataProvider) {\n        return NULL;\n    }\n    CGFontRef pCGFont = CGFontCreateWithDataProvider(pDataProvider);\n    CGDataProviderRelease(pDataProvider);\n    return pCGFont;\n}\nvoid CQuartz2D::DestroyFont(void* pFont)\n{\n    CGFontRelease((CGFontRef)pFont);\n}\nvoid CQuartz2D::setGraphicsTextMatrix(void* graphics, CFX_AffineMatrix* matrix)\n{\n    if (!graphics || !matrix) {\n        return;\n    }\n    CGContextRef context = (CGContextRef) graphics;\n    CGFloat ty = CGBitmapContextGetHeight(context) - matrix->f;\n    CGContextSetTextMatrix(context, CGAffineTransformMake(matrix->a,\n                           matrix->b,\n                           matrix->c,\n                           matrix->d,\n                           matrix->e,\n                           ty));\n}\nFX_BOOL CQuartz2D::drawGraphicsString(void*                 graphics,\n                                      void*                 font,\n                                      FX_FLOAT              fontSize,\n                                      FX_WORD*              glyphIndices,\n                                      CGPoint*           glyphPositions,\n                                      FX_INT32              charsCount,\n                                      FX_ARGB               argb,\n                                      CFX_AffineMatrix*     matrix )\n{\n    if (!graphics) {\n        return FALSE;\n    }\n    CGContextRef context = (CGContextRef) graphics;\n    CGContextSetFont(context, (CGFontRef)font);\n    CGContextSetFontSize(context, fontSize);\n    if (matrix) {\n        CGAffineTransform m = CGContextGetTextMatrix(context);\n        m = CGAffineTransformConcat(m,\n                                    CGAffineTransformMake(matrix->a,\n                                            matrix->b,\n                                            matrix->c,\n                                            matrix->d,\n                                            matrix->e,\n                                            matrix->f));\n        CGContextSetTextMatrix(context, m);\n    }\n    FX_INT32 a, r, g, b;\n    ArgbDecode(argb, a, r, g, b);\n    CGContextSetRGBFillColor(context,\n                             r / 255.f,\n                             g / 255.f,\n                             b / 255.f,\n                             a / 255.f);\n    CGContextSaveGState(context);\n#if CGFLOAT_IS_DOUBLE\n    CGPoint* glyphPositionsCG = new CGPoint[charsCount];\n    if (!glyphPositionsCG) {\n        return FALSE;\n    }\n    for (int index = 0; index < charsCount; ++index) {\n        glyphPositionsCG[index].x = glyphPositions[index].x;\n        glyphPositionsCG[index].y = glyphPositions[index].y;\n    }\n#else\n    CGPoint* glyphPositionsCG = (CGPoint*)glyphPositions;\n#endif\n    CGContextShowGlyphsAtPositions(context,\n                                   (CGGlyph *) glyphIndices,\n                                   glyphPositionsCG,\n                                   charsCount);\n#if CGFLOAT_IS_DOUBLE\n    delete[] glyphPositionsCG;\n#endif\n    CGContextRestoreGState(context);\n    return TRUE;\n}\nvoid CQuartz2D::saveGraphicsState(void * graphics)\n{\n    if (graphics) {\n        CGContextSaveGState((CGContextRef) graphics);\n    }\n}\nvoid CQuartz2D::restoreGraphicsState(void * graphics)\n{\n    if (graphics) {\n        CGContextRestoreGState((CGContextRef) graphics);\n    }\n}\nstatic CGContextRef createContextWithBitmap(CFX_DIBitmap* pBitmap)\n{\n    if (!pBitmap || pBitmap->IsCmykImage() || pBitmap->GetBPP() < 32) {\n        return NULL;\n    }\n    CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Little;\n    if (pBitmap->HasAlpha()) {\n        bitmapInfo |= kCGImageAlphaPremultipliedFirst;\n    } else {\n        bitmapInfo |= kCGImageAlphaNoneSkipFirst;\n    }\n    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();\n    CGContextRef context = CGBitmapContextCreate(pBitmap->GetBuffer(),\n                           pBitmap->GetWidth(),\n                           pBitmap->GetHeight(),\n                           8,\n                           pBitmap->GetPitch(),\n                           colorSpace,\n                           bitmapInfo);\n    CGColorSpaceRelease(colorSpace);\n    return context;\n}\nCFX_QuartzDeviceDriver::CFX_QuartzDeviceDriver(CGContextRef context, FX_INT32 deviceClass)\n{\n    m_saveCount = 0;\n    _context\t\t= context;\n    _deviceClass\t= deviceClass;\n    CGContextRetain(_context);\n    CGRect r = CGContextGetClipBoundingBox(context);\n    _width\t= FXSYS_round(r.size.width);\n    _height\t= FXSYS_round(r.size.height);\n    _renderCaps = FXRC_SOFT_CLIP | FXRC_BLEND_MODE |\n                  FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE |\n                  FXRC_BIT_MASK | FXRC_ALPHA_MASK;\n    if (_deviceClass != FXDC_DISPLAY) {\n    } else {\n        CGImageRef image = CGBitmapContextCreateImage(_context);\n        if (image) {\n            _renderCaps |= FXRC_GET_BITS;\n            _width = CGImageGetWidth(image);\n            _height = CGImageGetHeight(image);\n            CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(image);\n            if (kCGImageAlphaPremultipliedFirst == alphaInfo ||\n                    kCGImageAlphaPremultipliedLast == alphaInfo ||\n                    kCGImageAlphaOnly == alphaInfo) {\n                _renderCaps |= FXRC_ALPHA_OUTPUT;\n            }\n        }\n        CGImageRelease(image);\n    }\n    CGAffineTransform ctm = CGContextGetCTM(_context);\n    CGContextSaveGState(_context);\n    m_saveCount++;\n    if (ctm.d >= 0) {\n        CGFloat offset_x, offset_y;\n        offset_x = ctm.tx;\n        offset_y = ctm.ty;\n        CGContextTranslateCTM(_context, -offset_x, -offset_y);\n        CGContextConcatCTM(_context, CGAffineTransformMake(1, 0, 0, -1, offset_x, _height + offset_y));\n    }\n    _foxitDevice2User = CGAffineTransformIdentity;\n    _user2FoxitDevice = CGAffineTransformInvert(_foxitDevice2User);\n}\nCFX_QuartzDeviceDriver::~CFX_QuartzDeviceDriver()\n{\n    CGContextRestoreGState(_context);\n    m_saveCount--;\n    for (int i = 0; i < m_saveCount; ++i) {\n        CGContextRestoreGState(_context);\n    }\n    if (_context) {\n        CGContextRelease(_context);\n    }\n}\nint CFX_QuartzDeviceDriver::GetDeviceCaps(int capsID)\n{\n    switch (capsID) {\n        case FXDC_DEVICE_CLASS: {\n                return _deviceClass;\n            }\n        case FXDC_PIXEL_WIDTH: {\n                return _width;\n            }\n        case FXDC_PIXEL_HEIGHT: {\n                return _height;\n            }\n        case FXDC_BITS_PIXEL: {\n                return 32;\n            }\n        case FXDC_RENDER_CAPS: {\n                return _renderCaps;\n            }\n        default: {\n                return 0;\n            }\n    }\n}\nCFX_Matrix CFX_QuartzDeviceDriver::GetCTM() const\n{\n    CGAffineTransform ctm = CGContextGetCTM(_context);\n    return CFX_Matrix(ctm.a, ctm.b, ctm.c, ctm.d, ctm.tx, ctm.ty);\n}\nvoid CFX_QuartzDeviceDriver::SaveState()\n{\n    CGContextSaveGState(_context);\n    m_saveCount++;\n}\nvoid CFX_QuartzDeviceDriver::RestoreState(FX_BOOL isKeepSaved )\n{\n    CGContextRestoreGState(_context);\n    if (isKeepSaved) {\n        CGContextSaveGState(_context);\n    } else {\n        m_saveCount--;\n    }\n}\nFX_BOOL CFX_QuartzDeviceDriver::SetClip_PathFill(const CFX_PathData*    pathData,\n        const CFX_AffineMatrix*   matrix,\n        int                       fillMode )\n{\n    SaveState();\n    CGAffineTransform m = CGAffineTransformIdentity;\n    if (matrix) {\n        m = CGAffineTransformMake(matrix->GetA(), matrix->GetB(), matrix->GetC(), matrix->GetD(), matrix->GetE(), matrix->GetF());\n    }\n    m = CGAffineTransformConcat(m, _foxitDevice2User);\n    CGContextConcatCTM(_context, m);\n    setPathToContext(pathData);\n    RestoreState(FALSE);\n    if ((fillMode & 3) == FXFILL_WINDING) {\n        CGContextClip(_context);\n    } else {\n        CGContextEOClip(_context);\n    }\n    return TRUE;\n}\nFX_FLOAT CFX_QuartzDeviceDriver::getLineWidth(const CFX_GraphStateData * graphState, CGAffineTransform ctm)\n{\n    FX_FLOAT lineWidth = graphState->m_LineWidth;\n    if (graphState->m_LineWidth <= 0.f) {\n        CGSize size;\n        size.width = 1;\n        size.height = 1;\n        CGSize temp = CGSizeApplyAffineTransform(size, ctm);\n        CGFloat x = 1 / temp.width;\n        CGFloat y = 1 / temp.height;\n        lineWidth = x > y ? x : y;\n    }\n    return lineWidth;\n}\nFX_BOOL CFX_QuartzDeviceDriver::SetClip_PathStroke(const CFX_PathData*      pathData,\n        const CFX_AffineMatrix*     matrix,\n        const CFX_GraphStateData*   graphState )\n{\n    SaveState();\n    CGAffineTransform m = CGAffineTransformIdentity;\n    if (matrix) {\n        m = CGAffineTransformMake(matrix->GetA(), matrix->GetB(), matrix->GetC(), matrix->GetD(), matrix->GetE(), matrix->GetF());\n    }\n    m = CGAffineTransformConcat(m, _foxitDevice2User);\n    CGContextConcatCTM(_context, m);\n    FX_FLOAT lineWidth = getLineWidth(graphState, m);\n    setStrokeInfo(graphState, 0xFF000000, lineWidth);\n    setPathToContext(pathData);\n    CGContextReplacePathWithStrokedPath(_context);\n    RestoreState(FALSE);\n    CGContextClip(_context);\n    return TRUE;\n}\nstatic CGBlendMode GetCGBlendMode(int blend_type)\n{\n    CGBlendMode mode = kCGBlendModeNormal;\n    switch (blend_type) {\n        case FXDIB_BLEND_NORMAL:\n            mode = kCGBlendModeNormal;\n            break;\n        case FXDIB_BLEND_MULTIPLY:\n            mode = kCGBlendModeMultiply;\n            break;\n        case FXDIB_BLEND_SCREEN:\n            mode = kCGBlendModeScreen;\n            break;\n        case FXDIB_BLEND_OVERLAY:\n            mode = kCGBlendModeOverlay;\n            break;\n        case FXDIB_BLEND_DARKEN:\n            mode = kCGBlendModeDarken;\n            break;\n        case FXDIB_BLEND_LIGHTEN:\n            mode = kCGBlendModeLighten;\n            break;\n        case FXDIB_BLEND_COLORDODGE:\n            mode = kCGBlendModeColorDodge;\n            break;\n        case FXDIB_BLEND_COLORBURN:\n            mode = kCGBlendModeColorBurn;\n            break;\n        case FXDIB_BLEND_HARDLIGHT:\n            mode = kCGBlendModeHardLight;\n            break;\n        case FXDIB_BLEND_SOFTLIGHT:\n            mode = kCGBlendModeSoftLight;\n            break;\n        case FXDIB_BLEND_DIFFERENCE:\n            mode = kCGBlendModeDifference;\n            break;\n        case FXDIB_BLEND_EXCLUSION:\n            mode = kCGBlendModeExclusion;\n            break;\n        case FXDIB_BLEND_HUE:\n            mode = kCGBlendModeHue;\n            break;\n        case FXDIB_BLEND_SATURATION:\n            mode = kCGBlendModeSaturation;\n            break;\n        case FXDIB_BLEND_COLOR:\n            mode = kCGBlendModeColor;\n            break;\n        case FXDIB_BLEND_LUMINOSITY:\n            mode = kCGBlendModeLuminosity;\n            break;\n        default:\n            mode = kCGBlendModeNormal;\n            break;\n    }\n    return mode;\n}\nFX_BOOL CFX_QuartzDeviceDriver::DrawPath(const CFX_PathData*        pathData,\n        const CFX_AffineMatrix*       matrix,\n        const CFX_GraphStateData*     graphState,\n        FX_DWORD                      fillArgb,\n        FX_DWORD                      strokeArgb,\n        int                           fillMode,\n        int                           alpha_flag,\n        void*                         pIccTransform,\n        int\t\t\t\t\t\t\tblend_type\n                                        )\n{\n    SaveState();\n    CGBlendMode mode = GetCGBlendMode(blend_type);\n    if (mode != kCGBlendModeNormal) {\n        CGContextSetBlendMode(_context, mode);\n    }\n    CGAffineTransform m = CGAffineTransformIdentity;\n    if (matrix) {\n        m = CGAffineTransformMake(matrix->GetA(), matrix->GetB(), matrix->GetC(), matrix->GetD(), matrix->GetE(), matrix->GetF());\n    }\n    m = CGAffineTransformConcat(m, _foxitDevice2User);\n    CGContextConcatCTM(_context, m);\n    int pathMode = 0;\n    if (graphState && strokeArgb) {\n        CGContextSetMiterLimit(_context, graphState->m_MiterLimit);\n        FX_FLOAT lineWidth = getLineWidth(graphState, m);\n        setStrokeInfo(graphState, strokeArgb, lineWidth);\n        pathMode |= 4;\n    }\n    if (fillMode && fillArgb) {\n        setFillInfo(fillArgb);\n        if ((fillMode & 3) == FXFILL_WINDING) {\n            pathMode |= 1;\n        } else if ((fillMode & 3) == FXFILL_ALTERNATE) {\n            pathMode |= 2;\n        }\n    }\n    setPathToContext(pathData);\n    if (fillMode & FXFILL_FULLCOVER) {\n        CGContextSetShouldAntialias(_context, false);\n    }\n    if (pathMode == 4) {\n        CGContextStrokePath(_context);\n    } else if (pathMode == 1) {\n        CGContextFillPath(_context);\n    } else if (pathMode == 2) {\n        CGContextEOFillPath(_context);\n    } else if (pathMode == 5) {\n        CGContextDrawPath(_context, kCGPathFillStroke);\n    } else if (pathMode == 6) {\n        CGContextDrawPath(_context, kCGPathEOFillStroke);\n    }\n    RestoreState(FALSE);\n    return TRUE;\n}\nFX_BOOL CFX_QuartzDeviceDriver::FillRect(const FX_RECT*         rect,\n        FX_ARGB                   fillArgb,\n        int                       alphaFlag\t   ,\n        void*                     iccTransform ,\n        int\t\t\t\t\t\tblend_type )\n{\n    CGBlendMode mode = GetCGBlendMode(blend_type);\n    if (mode != kCGBlendModeNormal) {\n        CGContextSetBlendMode(_context, mode);\n    }\n    CGRect rect_fx = CGRectMake(rect->left, rect->top, rect->Width(), rect->Height());\n    CGRect rect_usr = CGRectApplyAffineTransform(rect_fx, _foxitDevice2User);\n    FX_INT32 a, r, g, b;\n    ArgbDecode(fillArgb, a, r, g, b);\n    CGContextSetRGBFillColor(_context,\n                             r / 255.f,\n                             g / 255.f,\n                             b / 255.f,\n                             a / 255.f);\n    CGContextFillRect(_context, rect_usr);\n    if (mode != kCGBlendModeNormal) {\n        CGContextSetBlendMode(_context, kCGBlendModeNormal);\n    }\n    return TRUE;\n}\nFX_BOOL CFX_QuartzDeviceDriver::DrawCosmeticLine(FX_FLOAT           x1,\n        FX_FLOAT              y1,\n        FX_FLOAT              x2,\n        FX_FLOAT              y2,\n        FX_DWORD              argb,\n        int                   alphaFlag       ,\n        void*                 iccTransform    ,\n        int\t\t\t\t\tblend_type )\n{\n    CGBlendMode mode = GetCGBlendMode(blend_type);\n    if (mode != kCGBlendModeNormal) {\n        CGContextSetBlendMode(_context, mode);\n    }\n    CGPoint pt = CGPointApplyAffineTransform(CGPointMake(x1, y1), _foxitDevice2User);\n    x1 = pt.x;\n    y1 = pt.y;\n    pt = CGPointApplyAffineTransform(CGPointMake(x2, y2), _foxitDevice2User);\n    x2 = pt.x;\n    y2 = pt.y;\n    FX_INT32 a, r, g, b;\n    ArgbDecode(argb, a, r, g, b);\n    CGContextSetRGBStrokeColor(_context,\n                               r / 255.f,\n                               g / 255.f,\n                               b / 255.f,\n                               a / 255.f);\n    CGContextMoveToPoint(_context, x1, y1);\n    CGContextAddLineToPoint(_context, x2, y2);\n    CGContextStrokePath(_context);\n    if (mode != kCGBlendModeNormal) {\n        CGContextSetBlendMode(_context, kCGBlendModeNormal);\n    }\n    return TRUE;\n}\nFX_BOOL CFX_QuartzDeviceDriver::GetClipBox(FX_RECT* rect)\n{\n    CGRect r = CGContextGetClipBoundingBox(_context);\n    r = CGRectApplyAffineTransform(r, _user2FoxitDevice);\n    rect->left\t\t= FXSYS_floor(r.origin.x);\n    rect->top\t\t= FXSYS_floor(r.origin.y);\n    rect->right\t\t= FXSYS_ceil(r.origin.x + r.size.width);\n    rect->bottom\t= FXSYS_ceil(r.origin.y + r.size.height);\n    return TRUE;\n}\nFX_BOOL CFX_QuartzDeviceDriver::GetDIBits(CFX_DIBitmap*     bitmap,\n        FX_INT32            left,\n        FX_INT32            top,\n        void* pIccTransform,\n        FX_BOOL bDEdge)\n{\n    if (FXDC_PRINTER == _deviceClass) {\n        return FALSE;\n    }\n    if (bitmap->GetBPP() < 32) {\n        return FALSE;\n    }\n    if (!(_renderCaps | FXRC_GET_BITS)) {\n        return FALSE;\n    }\n    CGPoint pt = CGPointMake(left, top);\n    pt = CGPointApplyAffineTransform(pt, _foxitDevice2User);\n    CGAffineTransform ctm = CGContextGetCTM(_context);\n    pt.x *= FXSYS_fabs(ctm.a);\n    pt.y *= FXSYS_fabs(ctm.d);\n    CGImageRef image = CGBitmapContextCreateImage(_context);\n    if (NULL == image) {\n        return FALSE;\n    }\n    CGFloat width\t= (CGFloat) bitmap->GetWidth();\n    CGFloat height\t= (CGFloat) bitmap->GetHeight();\n    if (width + pt.x > _width) {\n        width -= (width + pt.x - _width);\n    }\n    if (height + pt.y > _height) {\n        height -= (height + pt.y - _height);\n    }\n    CGImageRef subImage = CGImageCreateWithImageInRect(image,\n                          CGRectMake(pt.x,\n                                     pt.y,\n                                     width,\n                                     height));\n    CGContextRef context = createContextWithBitmap(bitmap);\n    CGRect rect = CGContextGetClipBoundingBox(context);\n    CGContextClearRect(context, rect);\n    CGContextDrawImage(context, rect, subImage);\n    CGContextRelease(context);\n    CGImageRelease(subImage);\n    CGImageRelease(image);\n    if (bitmap->HasAlpha()) {\n        for (int row = 0; row < bitmap->GetHeight(); row ++) {\n            FX_LPBYTE pScanline = (FX_LPBYTE)bitmap->GetScanline(row);\n            for (int col = 0; col < bitmap->GetWidth(); col ++) {\n                if (pScanline[3] > 0) {\n                    pScanline[0] = (pScanline[0] * 255.f / pScanline[3] + .5f);\n                    pScanline[1] = (pScanline[1] * 255.f / pScanline[3] + .5f);\n                    pScanline[2] = (pScanline[2] * 255.f / pScanline[3] + .5f);\n                }\n                pScanline += 4;\n            }\n        }\n    }\n    return TRUE;\n}\nFX_BOOL CFX_QuartzDeviceDriver::SetDIBits(const CFX_DIBSource*      pBitmap,\n        FX_ARGB                     argb,\n        const FX_RECT*              srcRect,\n        int                         dest_left,\n        int                         dest_top,\n        int                         blendType,\n        int                         alphaFlag       ,\n        void*                       iccTransform    )\n{\n    SaveState();\n    CGFloat src_left, src_top, src_width, src_height;\n    if (srcRect) {\n        src_left = srcRect->left;\n        src_top = srcRect->top;\n        src_width = srcRect->Width();\n        src_height = srcRect->Height();\n    } else {\n        src_left = src_top = 0;\n        src_width = pBitmap->GetWidth();\n        src_height = pBitmap->GetHeight();\n    }\n    CGAffineTransform ctm = CGContextGetCTM(_context);\n    CGFloat scale_x = FXSYS_fabs(ctm.a);\n    CGFloat scale_y = FXSYS_fabs(ctm.d);\n    src_left /= scale_x;\n    src_top /= scale_y;\n    src_width /= scale_x;\n    src_height /= scale_y;\n    CGRect rect_fx = CGRectMake(dest_left, dest_top, src_width, src_height);\n    CGRect rect_usr = CGRectApplyAffineTransform(rect_fx, _foxitDevice2User);\n    CGContextBeginPath(_context);\n    CGContextAddRect(_context, rect_usr);\n    CGContextClip(_context);\n    rect_usr.size = CGSizeMake(pBitmap->GetWidth() / scale_x, pBitmap->GetHeight() / scale_y);\n    rect_usr = CGRectOffset(rect_usr, -src_left, -src_top);\n    CG_SetImageTransform(dest_left, dest_top, src_width, src_height, &rect_usr);\n    CFX_DIBitmap* pBitmap1 = NULL;\n    if (pBitmap->IsAlphaMask()) {\n        if (pBitmap->GetBuffer()) {\n            pBitmap1 = (CFX_DIBitmap*)pBitmap;\n        } else {\n            pBitmap1 = pBitmap->Clone();\n        }\n        if (NULL == pBitmap1) {\n            RestoreState(FALSE);\n            return FALSE;\n        }\n        CGDataProviderRef pBitmapProvider = CGDataProviderCreateWithData(NULL,\n                                            pBitmap1->GetBuffer(),\n                                            pBitmap1->GetPitch() * pBitmap1->GetHeight(),\n                                            NULL);\n        CGColorSpaceRef pColorSpace = CGColorSpaceCreateDeviceGray();\n        CGBitmapInfo bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrderDefault;\n        CGImageRef pImage = CGImageCreate(pBitmap1->GetWidth(),\n                                          pBitmap1->GetHeight(),\n                                          pBitmap1->GetBPP(),\n                                          pBitmap1->GetBPP(),\n                                          pBitmap1->GetPitch(),\n                                          pColorSpace,\n                                          bitmapInfo,\n                                          pBitmapProvider, NULL, true,\n                                          kCGRenderingIntentDefault);\n        CGContextClipToMask(_context, rect_usr, pImage);\n        CGContextSetRGBFillColor(_context,\n                                 FXARGB_R(argb) / 255.f,\n                                 FXARGB_G(argb) / 255.f,\n                                 FXARGB_B(argb) / 255.f,\n                                 FXARGB_A(argb) / 255.f);\n        CGContextFillRect(_context, rect_usr);\n        CGImageRelease(pImage);\n        CGColorSpaceRelease(pColorSpace);\n        CGDataProviderRelease(pBitmapProvider);\n        if (pBitmap1 != pBitmap) {\n            delete pBitmap1;\n        }\n        RestoreState(FALSE);\n        return TRUE;\n    }\n    if (pBitmap->GetBPP() < 32) {\n        pBitmap1 = pBitmap->CloneConvert(FXDIB_Rgb32);\n    } else {\n        if (pBitmap->GetBuffer()) {\n            pBitmap1 = (CFX_DIBitmap*)pBitmap;\n        } else {\n            pBitmap1 = pBitmap->Clone();\n        }\n    }\n    if (NULL == pBitmap1) {\n        RestoreState(FALSE);\n        return FALSE;\n    }\n    if (pBitmap1->HasAlpha()) {\n        if (pBitmap1 == pBitmap) {\n            pBitmap1 = pBitmap->Clone();\n            if (!pBitmap1) {\n                RestoreState(FALSE);\n                return FALSE;\n            }\n        }\n        for (int row = 0; row < pBitmap1->GetHeight(); row ++) {\n            FX_LPBYTE pScanline = (FX_LPBYTE)pBitmap1->GetScanline(row);\n            for (int col = 0; col < pBitmap1->GetWidth(); col ++) {\n                pScanline[0] = (FX_BYTE)(pScanline[0] * pScanline[3] / 255.f + .5f);\n                pScanline[1] = (FX_BYTE)(pScanline[1] * pScanline[3] / 255.f + .5f);\n                pScanline[2] = (FX_BYTE)(pScanline[2] * pScanline[3] / 255.f + .5f);\n                pScanline += 4;\n            }\n        }\n    }\n    CGContextRef ctx = createContextWithBitmap(pBitmap1);\n    CGImageRef image = CGBitmapContextCreateImage(ctx);\n    int blend_mode = blendType;\n    if (FXDIB_BLEND_HARDLIGHT == blendType) {\n        blend_mode = kCGBlendModeSoftLight;\n    } else if (FXDIB_BLEND_SOFTLIGHT == blendType) {\n        blend_mode = kCGBlendModeHardLight;\n    } else if (blendType >= FXDIB_BLEND_NONSEPARABLE && blendType <= FXDIB_BLEND_LUMINOSITY) {\n        blend_mode = blendType - 9;\n    } else if (blendType > FXDIB_BLEND_LUMINOSITY || blendType < 0) {\n        blend_mode = kCGBlendModeNormal;\n    }\n    CGContextSetBlendMode(_context, (CGBlendMode)blend_mode);\n    CGContextDrawImage(_context, rect_usr, image);\n    CGImageRelease(image);\n    CGContextRelease(ctx);\n    if (pBitmap1 != pBitmap) {\n        delete pBitmap1;\n    }\n    RestoreState(FALSE);\n    return TRUE;\n}\nFX_BOOL CFX_QuartzDeviceDriver::StretchDIBits(const CFX_DIBSource*      pBitmap,\n        FX_ARGB                     argb,\n        int                         dest_left,\n        int                         dest_top,\n        int                         dest_width,\n        int                         dest_height,\n        const FX_RECT*              clipRect,\n        FX_DWORD                    flags,\n        int                         alphaFlag\t   ,\n        void*                       iccTransform ,\n        int\t\t\t\t\t\t\tblend_type)\n{\n    SaveState();\n    if (clipRect) {\n        CGContextBeginPath(_context);\n        CGRect rect_clip = CGRectMake(clipRect->left, clipRect->top, clipRect->Width(), clipRect->Height());\n        rect_clip = CGRectApplyAffineTransform(rect_clip, _foxitDevice2User);\n        CGContextAddRect(_context, rect_clip);\n        CGContextClip(_context);\n    }\n    CGRect rect = CGRectMake(dest_left, dest_top, dest_width, dest_height);\n    rect = CGRectApplyAffineTransform(rect, _foxitDevice2User);\n    if (FXDIB_BICUBIC_INTERPOL == flags) {\n        CGContextSetInterpolationQuality(_context, kCGInterpolationHigh);\n    } else if (FXDIB_DOWNSAMPLE == flags) {\n        CGContextSetInterpolationQuality(_context, kCGInterpolationNone);\n    } else {\n        CGContextSetInterpolationQuality(_context, kCGInterpolationMedium);\n    }\n    CG_SetImageTransform(dest_left, dest_top, dest_width, dest_height);\n    CFX_DIBitmap* pBitmap1 = NULL;\n    if (pBitmap->IsAlphaMask()) {\n        if (pBitmap->GetBuffer()) {\n            pBitmap1 = (CFX_DIBitmap*)pBitmap;\n        } else {\n            pBitmap1 = pBitmap->Clone();\n        }\n        if (NULL == pBitmap1) {\n            RestoreState(FALSE);\n            return FALSE;\n        }\n        CGDataProviderRef pBitmapProvider = CGDataProviderCreateWithData(NULL,\n                                            pBitmap1->GetBuffer(),\n                                            pBitmap1->GetPitch() * pBitmap1->GetHeight(),\n                                            NULL);\n        CGColorSpaceRef pColorSpace = CGColorSpaceCreateDeviceGray();\n        CGBitmapInfo bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrderDefault;\n        CGImageRef pImage = CGImageCreate(pBitmap1->GetWidth(),\n                                          pBitmap1->GetHeight(),\n                                          pBitmap1->GetBPP(),\n                                          pBitmap1->GetBPP(),\n                                          pBitmap1->GetPitch(),\n                                          pColorSpace,\n                                          bitmapInfo,\n                                          pBitmapProvider, NULL, true,\n                                          kCGRenderingIntentDefault);\n        CGContextClipToMask(_context, rect, pImage);\n        CGContextSetRGBFillColor(_context,\n                                 FXARGB_R(argb) / 255.f,\n                                 FXARGB_G(argb) / 255.f,\n                                 FXARGB_B(argb) / 255.f,\n                                 FXARGB_A(argb) / 255.f);\n        CGContextFillRect(_context, rect);\n        CGImageRelease(pImage);\n        CGColorSpaceRelease(pColorSpace);\n        CGDataProviderRelease(pBitmapProvider);\n        if (pBitmap1 != pBitmap) {\n            delete pBitmap1;\n        }\n        RestoreState(FALSE);\n        return TRUE;\n    }\n    if (pBitmap->GetBPP() < 32) {\n        pBitmap1 = pBitmap->CloneConvert(FXDIB_Rgb32);\n    } else {\n        if (pBitmap->GetBuffer()) {\n            pBitmap1 = (CFX_DIBitmap*)pBitmap;\n        } else {\n            pBitmap1 = pBitmap->Clone();\n        }\n    }\n    if (NULL == pBitmap1) {\n        RestoreState(FALSE);\n        return FALSE;\n    }\n    if (pBitmap1->HasAlpha()) {\n        if (pBitmap1 == pBitmap) {\n            pBitmap1 = pBitmap->Clone();\n            if (!pBitmap1) {\n                RestoreState(FALSE);\n                return FALSE;\n            }\n        }\n        for (int row = 0; row < pBitmap1->GetHeight(); row ++) {\n            FX_LPBYTE pScanline = (FX_LPBYTE)pBitmap1->GetScanline(row);\n            for (int col = 0; col < pBitmap1->GetWidth(); col ++) {\n                pScanline[0] = (FX_BYTE)(pScanline[0] * pScanline[3] / 255.f + .5f);\n                pScanline[1] = (FX_BYTE)(pScanline[1] * pScanline[3] / 255.f + .5f);\n                pScanline[2] = (FX_BYTE)(pScanline[2] * pScanline[3] / 255.f + .5f);\n                pScanline += 4;\n            }\n        }\n    }\n    CGContextRef ctx = createContextWithBitmap(pBitmap1);\n    CGImageRef image = CGBitmapContextCreateImage(ctx);\n    CGContextDrawImage(_context, rect, image);\n    CGImageRelease(image);\n    CGContextRelease(ctx);\n    if (pBitmap1 != pBitmap) {\n        delete pBitmap1;\n    }\n    RestoreState(FALSE);\n    return TRUE;\n}\nFX_BOOL CFX_QuartzDeviceDriver::CG_DrawGlypRun(int                        nChars,\n        const FXTEXT_CHARPOS*      pCharPos,\n        CFX_Font*                  pFont,\n        CFX_FontCache*             pCache,\n        const CFX_AffineMatrix*    pGlyphMatrix,\n        const CFX_AffineMatrix*    pObject2Device,\n        FX_FLOAT                   font_size,\n        FX_DWORD                   argb,\n        int                        alpha_flag,\n        void*                      pIccTransform)\n{\n    if (nChars == 0) {\n        return TRUE;\n    }\n    CQuartz2D& quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;\n    if (!pFont->m_pPlatformFont) {\n        if (pFont->GetPsName() == CFX_WideString::FromLocal(\"DFHeiStd-W5\")) {\n            return FALSE;\n        }\n        pFont->m_pPlatformFont = quartz2d.CreateFont(pFont->m_pFontData, pFont->m_dwSize);\n        if (NULL == pFont->m_pPlatformFont) {\n            return FALSE;\n        }\n    }\n    CFX_FixedBufGrow<FX_WORD, 32> glyph_indices(nChars);\n    CFX_FixedBufGrow<CGPoint, 32> glyph_positions(nChars);\n    for (int i = 0; i < nChars; i++ ) {\n        glyph_indices[i] = pCharPos[i].m_ExtGID;\n        glyph_positions[i].x = pCharPos[i].m_OriginX;\n        glyph_positions[i].y = pCharPos[i].m_OriginY;\n    }\n    CFX_AffineMatrix text_matrix;\n    if (pObject2Device) {\n        text_matrix.Concat(*pObject2Device);\n    }\n    CGAffineTransform matrix_cg = CGAffineTransformMake(text_matrix.a,\n                                  text_matrix.b,\n                                  text_matrix.c,\n                                  text_matrix.d,\n                                  text_matrix.e,\n                                  text_matrix.f);\n    matrix_cg = CGAffineTransformConcat(matrix_cg, _foxitDevice2User);\n    CGContextSetTextMatrix(_context, matrix_cg);\n    CGContextSetFont(_context, (CGFontRef)pFont->m_pPlatformFont);\n    CGContextSetFontSize(_context, FXSYS_fabs(font_size));\n    FX_INT32 a, r, g, b;\n    ArgbDecode(argb, a, r, g, b);\n    CGContextSetRGBFillColor(_context,\n                             r / 255.f,\n                             g / 255.f,\n                             b / 255.f,\n                             a / 255.f);\n    SaveState();\n    if (pGlyphMatrix) {\n        CGAffineTransform ctm = CGContextGetCTM(_context);\n        CGPoint origin = CGPointMake( glyph_positions[0].x,  glyph_positions[0].y);\n        origin = CGPointApplyAffineTransform(origin, matrix_cg);\n        CGContextTranslateCTM(_context, origin.x, origin.y);\n        CGAffineTransform glyph_matrix = CGAffineTransformMake(pGlyphMatrix->a,\n                                         pGlyphMatrix->b,\n                                         pGlyphMatrix->c,\n                                         pGlyphMatrix->d,\n                                         pGlyphMatrix->e,\n                                         pGlyphMatrix->f);\n        if (_foxitDevice2User.d < 0) {\n            glyph_matrix = CGAffineTransformInvert(glyph_matrix);\n        }\n        CGContextConcatCTM(_context, glyph_matrix);\n        CGContextTranslateCTM(_context, -origin.x, -origin.y);\n    }\n    CGContextShowGlyphsAtPositions(_context,\n                                   (CGGlyph*)glyph_indices,\n                                   glyph_positions,\n                                   nChars);\n    RestoreState(FALSE);\n    return TRUE;\n}\nFX_BOOL CFX_QuartzDeviceDriver::DrawDeviceText(int                      nChars,\n        const FXTEXT_CHARPOS*    pCharPos,\n        CFX_Font*                pFont,\n        CFX_FontCache*           pCache,\n        const CFX_AffineMatrix*  pObject2Device,\n        FX_FLOAT                 font_size,\n        FX_DWORD                 color,\n        int                      alpha_flag       ,\n        void*                    pIccTransform)\n{\n    if (NULL == pFont || NULL == _context) {\n        return FALSE;\n    }\n    FX_BOOL bBold = pFont->IsBold();\n    if (!bBold && pFont->GetSubstFont() &&\n            pFont->GetSubstFont()->m_Weight >= 500 &&\n            pFont->GetSubstFont()->m_Weight <= 600) {\n        return FALSE;\n    }\n    SaveState();\n    CGContextSetTextDrawingMode(_context, kCGTextFillClip);\n    FX_BOOL ret = FALSE;\n    FX_INT32 i = 0;\n    while (i < nChars) {\n        if (pCharPos[i].m_bGlyphAdjust || font_size < 0) {\n            if (i > 0) {\n                ret = CG_DrawGlypRun(i, pCharPos, pFont, pCache, NULL, pObject2Device, font_size, color, alpha_flag, pIccTransform);\n                if (!ret) {\n                    RestoreState(FALSE);\n                    return ret;\n                }\n            }\n            const FXTEXT_CHARPOS* char_pos = pCharPos + i;\n            CFX_AffineMatrix glphy_matrix;\n            if (font_size < 0) {\n                glphy_matrix.Concat(-1, 0, 0, -1, 0, 0);\n            }\n            if (char_pos->m_bGlyphAdjust) {\n                glphy_matrix.Concat(char_pos->m_AdjustMatrix[0],\n                                    char_pos->m_AdjustMatrix[1],\n                                    char_pos->m_AdjustMatrix[2],\n                                    char_pos->m_AdjustMatrix[3], 0, 0);\n            }\n            ret = CG_DrawGlypRun(1, char_pos, pFont, pCache, &glphy_matrix, pObject2Device, font_size, color, alpha_flag, pIccTransform);\n            if (!ret) {\n                RestoreState(FALSE);\n                return ret;\n            }\n            i ++;\n            pCharPos += i;\n            nChars -= i;\n            i = 0;\n        } else {\n            i ++;\n        }\n    }\n    if (i > 0) {\n        ret = CG_DrawGlypRun(i, pCharPos, pFont, pCache, NULL, pObject2Device, font_size, color, alpha_flag, pIccTransform);\n    }\n    RestoreState(FALSE);\n    return ret;\n}\nvoid CFX_QuartzDeviceDriver::setStrokeInfo(const CFX_GraphStateData* graphState, FX_ARGB argb, FX_FLOAT lineWidth)\n{\n    if (NULL == graphState) {\n        return;\n    }\n    CGContextSetLineWidth(_context, lineWidth);\n    CGLineCap cap;\n    switch (graphState->m_LineCap) {\n        case CFX_GraphStateData::LineCapRound: {\n                cap = kCGLineCapRound;\n                break;\n            }\n        case CFX_GraphStateData::LineCapSquare: {\n                cap = kCGLineCapSquare;\n                break;\n            }\n        case CFX_GraphStateData::LineCapButt:\n        default: {\n                cap = kCGLineCapButt;\n            }\n    }\n    CGContextSetLineCap(_context, cap);\n    CGLineJoin join;\n    switch (graphState->m_LineJoin) {\n        case CFX_GraphStateData::LineJoinRound: {\n                join = kCGLineJoinRound;\n                break;\n            }\n        case CFX_GraphStateData::LineJoinBevel: {\n                join = kCGLineJoinBevel;\n                break;\n            }\n        case CFX_GraphStateData::LineJoinMiter:\n        default: {\n                join = kCGLineJoinMiter;\n            }\n    }\n    CGContextSetLineJoin(_context, join);\n    if (graphState->m_DashCount) {\n#if CGFLOAT_IS_DOUBLE\n        CGFloat* dashArray = new CGFloat[graphState->m_DashCount];\n        if (!dashArray) {\n            return;\n        }\n        for (int index = 0; index < graphState->m_DashCount; ++index) {\n            dashArray[index] = graphState->m_DashArray[index];\n        }\n#else\n        CGFloat* dashArray = (CGFloat*)graphState->m_DashArray;\n#endif\n        CGContextSetLineDash(_context, graphState->m_DashPhase, dashArray, graphState->m_DashCount);\n#if CGFLOAT_IS_DOUBLE\n        delete[] dashArray;\n#endif\n    }\n    FX_INT32 a, r, g, b;\n    ArgbDecode(argb, a, r, g, b);\n    CGContextSetRGBStrokeColor(_context,\n                               r / 255.f,\n                               g / 255.f,\n                               b / 255.f,\n                               a / 255.f);\n}\nvoid CFX_QuartzDeviceDriver::setFillInfo(FX_ARGB argb)\n{\n    FX_INT32 a, r, g, b;\n    ArgbDecode(argb, a, r, g, b);\n    CGContextSetRGBFillColor(_context,\n                             r / 255.f,\n                             g / 255.f,\n                             b / 255.f,\n                             a / 255.f);\n}\nvoid CFX_QuartzDeviceDriver::setPathToContext(const CFX_PathData* pathData)\n{\n    FX_INT32 count = pathData->GetPointCount();\n    FX_PATHPOINT* points = pathData->GetPoints();\n    CGContextBeginPath(_context);\n    for (FX_INT32 i = 0; i < count; i ++) {\n        switch (points[i].m_Flag & FXPT_TYPE) {\n            case FXPT_MOVETO:\n                CGContextMoveToPoint(_context, points[i].m_PointX, points[i].m_PointY);\n                break;\n            case FXPT_LINETO:\n                CGContextAddLineToPoint(_context, points[i].m_PointX, points[i].m_PointY);\n                break;\n            case FXPT_BEZIERTO: {\n                    CGContextAddCurveToPoint(_context,\n                                             points[i].m_PointX, points[i].m_PointY,\n                                             points[i + 1].m_PointX, points[i + 1].m_PointY,\n                                             points[i + 2].m_PointX, points[i + 2].m_PointY);\n                    i += 2;\n                }\n        }\n        if (points[i].m_Flag & FXPT_CLOSEFIGURE) {\n            CGContextClosePath(_context);\n        }\n    }\n}\nvoid CFX_QuartzDeviceDriver::CG_SetImageTransform(int dest_left, int dest_top, int dest_width, int dest_height,\n        CGRect* rect )\n{\n    int flip_y = _foxitDevice2User.d * dest_height < 0 ? 1 : -1;\n    int flip_x = _foxitDevice2User.a * dest_width > 0 ? 1 : -1;\n    if (flip_y < 0 || flip_x < 0) {\n        if (dest_height < 0) {\n            dest_height = -dest_height;\n            dest_top -= dest_height;\n        }\n        CGRect rt = CGRectApplyAffineTransform(CGRectMake(dest_left, dest_top, dest_width, dest_height), _foxitDevice2User);\n        CGFloat offset_x = (rt.origin.x) + rt.size.width / 2.f,\n                offset_y = (rt.origin.y) + rt.size.height / 2.f;\n        CGAffineTransform transform = CGAffineTransformIdentity;\n        transform = CGAffineTransformConcat(transform, CGAffineTransformMake(1, 0, 0, 1, -offset_x, -offset_y));\n        transform = CGAffineTransformConcat(transform, CGAffineTransformMake(flip_x, 0, 0, flip_y, 0, 0));\n        transform = CGAffineTransformConcat(transform, CGAffineTransformMake(1, 0, 0, 1, offset_x, offset_y));\n        CGContextConcatCTM(_context, transform);\n        if (rect) {\n            *rect = CGRectApplyAffineTransform(*rect, transform);\n        }\n    }\n}\nvoid CFX_QuartzDeviceDriver::ClearDriver()\n{\n    if (NULL == _context) {\n        return;\n    }\n    for (int i = 0; i < m_saveCount; ++i) {\n        CGContextRestoreGState(_context);\n    }\n    m_saveCount = 0;\n    if (_context) {\n        CGContextRelease(_context);\n    }\n}\nCFX_QuartzDevice::CFX_QuartzDevice()\n{\n    m_bOwnedBitmap = FALSE;\n    m_pContext = NULL;\n}\nCFX_QuartzDevice::~CFX_QuartzDevice()\n{\n    if (m_pContext) {\n        CGContextRelease(m_pContext);\n    }\n    if (GetBitmap() && m_bOwnedBitmap) {\n        delete GetBitmap();\n    }\n}\nCGContextRef CFX_QuartzDevice::GetContext()\n{\n    return m_pContext;\n}\nFX_BOOL CFX_QuartzDevice::Attach(CGContextRef context, FX_INT32 nDeviceClass)\n{\n    if (m_pContext) {\n        CGContextRelease(m_pContext);\n    }\n    m_pContext = context;\n    CGContextRetain(m_pContext);\n    IFX_RenderDeviceDriver* pDriver = FX_NEW CFX_QuartzDeviceDriver(m_pContext, nDeviceClass);\n    if (!pDriver) {\n        return FALSE;\n    }\n    SetDeviceDriver(pDriver);\n    return TRUE;\n}\nFX_BOOL CFX_QuartzDevice::Attach(CFX_DIBitmap* pBitmap)\n{\n    SetBitmap(pBitmap);\n    m_pContext = createContextWithBitmap(pBitmap);\n    if (NULL == m_pContext) {\n        return FALSE;\n    }\n    IFX_RenderDeviceDriver* pDriver = FX_NEW CFX_QuartzDeviceDriver(m_pContext, FXDC_DISPLAY);\n    if (!pDriver) {\n        return FALSE;\n    }\n    SetDeviceDriver(pDriver);\n    return TRUE;\n}\nFX_BOOL CFX_QuartzDevice::Create(FX_INT32 width, FX_INT32 height, FXDIB_Format format)\n{\n    if ((FX_BYTE)format < 32) {\n        return FALSE;\n    }\n    CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;\n    if (!pBitmap) {\n        return FALSE;\n    }\n    if (!pBitmap->Create(width, height, format)) {\n        delete pBitmap;\n        return FALSE;\n    }\n    m_bOwnedBitmap = TRUE;\n    return Attach(pBitmap);\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/dib/dib_int.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nclass CPDF_FixedMatrix : public CFX_Object\n{\npublic:\n    CPDF_FixedMatrix(const CFX_AffineMatrix& src, int bits)\n    {\n        base = 1 << bits;\n        a = FXSYS_round(src.a * base);\n        b = FXSYS_round(src.b * base);\n        c = FXSYS_round(src.c * base);\n        d = FXSYS_round(src.d * base);\n        e = FXSYS_round(src.e * base);\n        f = FXSYS_round(src.f * base);\n    }\n    inline void\tTransform(int x, int y, int& x1, int& y1)\n    {\n        x1 = (a * x + c * y + e + base / 2) / base;\n        y1 = (b * x + d * y + f + base / 2) / base;\n    }\n    int\t\ta, b, c, d, e, f;\n    int\t\tbase;\n};\n#define FPDF_HUGE_IMAGE_SIZE\t60000000\nstruct PixelWeight {\n    int\t\tm_SrcStart;\n    int\t\tm_SrcEnd;\n    int\t\tm_Weights[1];\n};\nclass CWeightTable : public CFX_Object\n{\npublic:\n    CWeightTable()\n    {\n        m_pWeightTables = NULL;\n    }\n    ~CWeightTable()\n    {\n        if(m_pWeightTables) {\n            FX_Free(m_pWeightTables);\n        }\n        m_pWeightTables = NULL;\n    }\n    void\t\t\tCalc(int dest_len, int dest_min, int dest_max, int src_len, int src_min, int src_max, int flags);\n    PixelWeight*\tGetPixelWeight(int pixel)\n    {\n        return (PixelWeight*)(m_pWeightTables + (pixel - m_DestMin) * m_ItemSize);\n    }\n    int\t\t\t\tm_DestMin, m_ItemSize;\n    FX_LPBYTE\t\tm_pWeightTables;\n};\nclass CStretchEngine : public CFX_Object\n{\npublic:\n    CStretchEngine(IFX_ScanlineComposer* pDestBitmap, FXDIB_Format dest_format,\n                   int dest_width, int dest_height, const FX_RECT& clip_rect,\n                   const CFX_DIBSource* pSrcBitmap, int flags);\n    ~CStretchEngine();\n    FX_BOOL\t\tContinue(IFX_Pause* pPause);\npublic:\n    FXDIB_Format m_DestFormat;\n    int\t\tm_DestBpp, m_SrcBpp, m_bHasAlpha;\n    IFX_ScanlineComposer*\tm_pDestBitmap;\n    int\t\tm_DestWidth, m_DestHeight;\n    FX_RECT\tm_DestClip;\n    FX_LPBYTE\tm_pDestScanline;\n    FX_LPBYTE   m_pDestMaskScanline;\n    FX_RECT\tm_SrcClip;\n    const CFX_DIBSource*\tm_pSource;\n    FX_DWORD*\tm_pSrcPalette;\n    int\t\tm_SrcWidth, m_SrcHeight;\n    int\t\tm_SrcPitch, m_InterPitch;\n    int m_ExtraMaskPitch;\n    unsigned char*\tm_pInterBuf;\n    unsigned char*\tm_pExtraAlphaBuf;\n    int\t\tm_TransMethod;\n    int \tm_Flags;\n    CWeightTable\tm_WeightTable;\n    int\t\tm_CurRow;\n    FX_BOOL\tStartStretchHorz();\n    FX_BOOL\tContinueStretchHorz(IFX_Pause* pPause);\n    void\tStretchVert();\n    int\t\tm_State;\n};\n"
  },
  {
    "path": "core/src/fxge/dib/fx_dib_composite.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxge/fx_ge.h\"\n#include \"../../../include/fxcodec/fx_codec.h\"\n#include \"dib_int.h\"\nconst FX_BYTE g_GammaRamp[256] = {\n    0,   0,   0,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,\n    1,   1,   2,   2,   2,   2,   2,   2,   2,   2,   3,   3,   3,   3,   3,   3,\n    4,   4,   4,   4,   4,   5,   5,   5,   5,   6,   6,   6,   6,   7,   7,   7,\n    8,   8,   8,   8,   9,   9,   9,  10,  10,  10,  11,  11,  12,  12,  12,  13,\n    13,  13,  14,  14,  15,  15,  16,  16,  17,  17,  17,  18,  18,  19,  19,  20,\n    20,  21,  22,  22,  23,  23,  24,  24,  25,  25,  26,  27,  27,  28,  29,  29,\n    30,  30,  31,  32,  32,  33,  34,  35,  35,  36,  37,  37,  38,  39,  40,  41,\n    41,  42,  43,  44,  45,  45,  46,  47,  48,  49,  50,  51,  51,  52,  53,  54,\n    55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70,\n    71,  72,  73,  74,  76,  77,  78,  79,  80,  81,  82,  84,  85,  86,  87,  88,\n    90,  91,  92,  93,  95,  96,  97,  99, 100, 101, 103, 104, 105, 107, 108, 109,\n    111, 112, 114, 115, 116, 118, 119, 121, 122, 124, 125, 127, 128, 130, 131, 133,\n    134, 136, 138, 139, 141, 142, 144, 146, 147, 149, 151, 152, 154, 156, 157, 159,\n    161, 163, 164, 166, 168, 170, 171, 173, 175, 177, 179, 181, 183, 184, 186, 188,\n    190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220,\n    222, 224, 226, 229, 231, 233, 235, 237, 239, 242, 244, 246, 248, 250, 253, 255,\n};\nconst FX_BYTE g_GammaInverse[256] = {\n    0,  13,  22,  28,  34,  38,  42,  46,  50,  53,  56,  59,  61,  64,  66,  69,\n    71,  73,  75,  77,  79,  81,  83,  85,  86,  88,  90,  92,  93,  95,  96,  98,\n    99, 101, 102, 104, 105, 106, 108, 109, 110, 112, 113, 114, 115, 117, 118, 119,\n    120, 121, 122, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136,\n    137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 148, 149, 150, 151,\n    152, 153, 154, 155, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 163, 164,\n    165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 173, 173, 174, 175, 175, 176,\n    177, 178, 178, 179, 180, 180, 181, 182, 182, 183, 184, 185, 185, 186, 187, 187,\n    188, 189, 189, 190, 190, 191, 192, 192, 193, 194, 194, 195, 196, 196, 197, 197,\n    198, 199, 199, 200, 200, 201, 202, 202, 203, 203, 204, 205, 205, 206, 206, 207,\n    208, 208, 209, 209, 210, 210, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216,\n    216, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224,\n    225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 232, 233,\n    233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 238, 239, 239, 240, 240,\n    241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 246, 247, 247, 248,\n    248, 249, 249, 250, 250, 251, 251, 251, 252, 252, 253, 253, 254, 254, 255, 255,\n};\nconst FX_BYTE _color_sqrt[256] = {\n    0x00, 0x03, 0x07, 0x0B, 0x0F, 0x12, 0x16, 0x19, 0x1D, 0x20, 0x23, 0x26, 0x29, 0x2C, 0x2F, 0x32,\n    0x35, 0x37, 0x3A, 0x3C, 0x3F, 0x41, 0x43, 0x46, 0x48, 0x4A, 0x4C, 0x4E, 0x50, 0x52, 0x54, 0x56,\n    0x57, 0x59, 0x5B, 0x5C, 0x5E, 0x60, 0x61, 0x63, 0x64, 0x65, 0x67, 0x68, 0x69, 0x6B, 0x6C, 0x6D,\n    0x6E, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E,\n    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E,\n    0x8F, 0x90, 0x91, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C,\n    0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA4, 0xA5, 0xA6, 0xA7, 0xA7, 0xA8,\n    0xA9, 0xAA, 0xAA, 0xAB, 0xAC, 0xAD, 0xAD, 0xAE, 0xAF, 0xB0, 0xB0, 0xB1, 0xB2, 0xB3, 0xB3, 0xB4,\n    0xB5, 0xB5, 0xB6, 0xB7, 0xB7, 0xB8, 0xB9, 0xBA, 0xBA, 0xBB, 0xBC, 0xBC, 0xBD, 0xBE, 0xBE, 0xBF,\n    0xC0, 0xC0, 0xC1, 0xC2, 0xC2, 0xC3, 0xC4, 0xC4, 0xC5, 0xC6, 0xC6, 0xC7, 0xC7, 0xC8, 0xC9, 0xC9,\n    0xCA, 0xCB, 0xCB, 0xCC, 0xCC, 0xCD, 0xCE, 0xCE, 0xCF, 0xD0, 0xD0, 0xD1, 0xD1, 0xD2, 0xD3, 0xD3,\n    0xD4, 0xD4, 0xD5, 0xD6, 0xD6, 0xD7, 0xD7, 0xD8, 0xD9, 0xD9, 0xDA, 0xDA, 0xDB, 0xDC, 0xDC, 0xDD,\n    0xDD, 0xDE, 0xDE, 0xDF, 0xE0, 0xE0, 0xE1, 0xE1, 0xE2, 0xE2, 0xE3, 0xE4, 0xE4, 0xE5, 0xE5, 0xE6,\n    0xE6, 0xE7, 0xE7, 0xE8, 0xE9, 0xE9, 0xEA, 0xEA, 0xEB, 0xEB, 0xEC, 0xEC, 0xED, 0xED, 0xEE, 0xEE,\n    0xEF, 0xF0, 0xF0, 0xF1, 0xF1, 0xF2, 0xF2, 0xF3, 0xF3, 0xF4, 0xF4, 0xF5, 0xF5, 0xF6, 0xF6, 0xF7,\n    0xF7, 0xF8, 0xF8, 0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC, 0xFD, 0xFD, 0xFE, 0xFE, 0xFF\n};\nint _BLEND(int blend_mode, int back_color, int src_color)\n{\n    switch (blend_mode) {\n        case FXDIB_BLEND_NORMAL:\n            return src_color;\n        case FXDIB_BLEND_MULTIPLY:\n            return src_color * back_color / 255;\n        case FXDIB_BLEND_SCREEN:\n            return src_color + back_color - src_color * back_color / 255;\n        case FXDIB_BLEND_OVERLAY:\n            return _BLEND(FXDIB_BLEND_HARDLIGHT, src_color, back_color);\n        case FXDIB_BLEND_DARKEN:\n            return src_color < back_color ? src_color : back_color;\n        case FXDIB_BLEND_LIGHTEN:\n            return src_color > back_color ? src_color : back_color;\n        case FXDIB_BLEND_COLORDODGE: {\n                if (src_color == 255) {\n                    return src_color;\n                }\n                int result = back_color * 255 / (255 - src_color);\n                if (result > 255) {\n                    return 255;\n                }\n                return result;\n            }\n        case FXDIB_BLEND_COLORBURN: {\n                if (src_color == 0) {\n                    return src_color;\n                }\n                int result = (255 - back_color) * 255 / src_color;\n                if (result > 255) {\n                    result = 255;\n                }\n                return 255 - result;\n            }\n        case FXDIB_BLEND_HARDLIGHT:\n            if (src_color < 128) {\n                return (src_color * back_color * 2) / 255;\n            }\n            return _BLEND(FXDIB_BLEND_SCREEN, back_color, 2 * src_color - 255);\n        case FXDIB_BLEND_SOFTLIGHT: {\n                if (src_color < 128) {\n                    return back_color - (255 - 2 * src_color) * back_color * (255 - back_color) / 255 / 255;\n                }\n                return back_color + (2 * src_color - 255) * (_color_sqrt[back_color] - back_color) / 255;\n            }\n        case FXDIB_BLEND_DIFFERENCE:\n            return back_color < src_color ? src_color - back_color : back_color - src_color;\n        case FXDIB_BLEND_EXCLUSION:\n            return back_color + src_color - 2 * back_color * src_color / 255;\n    }\n    return src_color;\n}\nstruct _RGB {\n    int red;\n    int green;\n    int blue;\n};\nstatic inline int _Lum(_RGB color)\n{\n    return (color.red * 30 + color.green * 59 + color.blue * 11) / 100;\n}\nstatic _RGB _ClipColor(_RGB color)\n{\n    int l = _Lum(color);\n    int n = color.red;\n    if (color.green < n) {\n        n = color.green;\n    }\n    if (color.blue < n) {\n        n = color.blue;\n    }\n    int x = color.red;\n    if (color.green > x) {\n        x = color.green;\n    }\n    if (color.blue > x) {\n        x = color.blue;\n    }\n    if (n < 0) {\n        color.red = l + ((color.red - l) * l / (l - n));\n        color.green = l + ((color.green - l) * l / (l - n));\n        color.blue = l + ((color.blue - l) * l / (l - n));\n    }\n    if (x > 255) {\n        color.red = l + ((color.red - l) * (255 - l) / (x - l));\n        color.green = l + ((color.green - l) * (255 - l) / (x - l));\n        color.blue = l + ((color.blue - l) * (255 - l) / (x - l));\n    }\n    return color;\n}\nstatic _RGB _SetLum(_RGB color, int l)\n{\n    int d = l - _Lum(color);\n    color.red += d;\n    color.green += d;\n    color.blue += d;\n    return _ClipColor(color);\n}\nstatic int _Sat(_RGB color)\n{\n    int n = color.red;\n    if (color.green < n) {\n        n = color.green;\n    }\n    if (color.blue < n) {\n        n = color.blue;\n    }\n    int x = color.red;\n    if (color.green > x) {\n        x = color.green;\n    }\n    if (color.blue > x) {\n        x = color.blue;\n    }\n    return x - n;\n}\nstatic _RGB _SetSat(_RGB color, int s)\n{\n    int* max = &color.red;\n    int* mid = &color.red;\n    int* min = &color.red;\n    if (color.green > *max) {\n        max = &color.green;\n    }\n    if (color.blue > *max) {\n        max = &color.blue;\n    }\n    if (color.green < *min) {\n        min = &color.green;\n    }\n    if (color.blue < *min) {\n        min = &color.blue;\n    }\n    if (*max == *min) {\n        color.red = 0;\n        color.green = 0;\n        color.blue = 0;\n        return color;\n    }\n    if (max == &color.red) {\n        if (min == &color.green) {\n            mid = &color.blue;\n        } else {\n            mid = &color.green;\n        }\n    } else if (max == &color.green) {\n        if (min == &color.red) {\n            mid = &color.blue;\n        } else {\n            mid = &color.red;\n        }\n    } else {\n        if (min == &color.green) {\n            mid = &color.red;\n        } else {\n            mid = &color.green;\n        }\n    }\n    if (*max > *min) {\n        *mid = (*mid - *min) * s / (*max - *min);\n        *max = s;\n        *min = 0;\n    }\n    return color;\n}\nvoid _RGB_Blend(int blend_mode, FX_LPCBYTE src_scan, FX_BYTE* dest_scan, int results[3])\n{\n    _RGB src, back, result;\n    src.red = src_scan[2];\n    src.green = src_scan[1];\n    src.blue = src_scan[0];\n    back.red = dest_scan[2];\n    back.green = dest_scan[1];\n    back.blue = dest_scan[0];\n    switch (blend_mode) {\n        case FXDIB_BLEND_HUE:\n            result = _SetLum(_SetSat(src, _Sat(back)), _Lum(back));\n            break;\n        case FXDIB_BLEND_SATURATION:\n            result = _SetLum(_SetSat(back, _Sat(src)), _Lum(back));\n            break;\n        case FXDIB_BLEND_COLOR:\n            result = _SetLum(src, _Lum(back));\n            break;\n        case FXDIB_BLEND_LUMINOSITY:\n            result = _SetLum(back, _Lum(src));\n            break;\n    }\n    results[0] = result.blue;\n    results[1] = result.green;\n    results[2] = result.red;\n}\ninline void _CompositeRow_Argb2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, FX_LPCBYTE clip_scan)\n{\n    src_scan += 3;\n    for (int col = 0; col < pixel_count; col ++) {\n        int src_alpha = *src_scan;\n        if (clip_scan) {\n            src_alpha = clip_scan[col] * src_alpha / 255;\n        }\n        FX_BYTE back_alpha = *dest_scan;\n        if (!back_alpha) {\n            *dest_scan = src_alpha;\n        } else if (src_alpha) {\n            *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n        }\n        dest_scan ++;\n        src_scan += 4;\n    }\n}\nvoid _CompositeRow_Rgba2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_alpha_scan, int pixel_count, FX_LPCBYTE clip_scan)\n{\n    for (int col = 0; col < pixel_count; col ++) {\n        int src_alpha = *src_alpha_scan++;\n        if (clip_scan) {\n            src_alpha = clip_scan[col] * src_alpha / 255;\n        }\n        FX_BYTE back_alpha = *dest_scan;\n        if (!back_alpha) {\n            *dest_scan = src_alpha;\n        } else if (src_alpha) {\n            *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n        }\n        dest_scan ++;\n    }\n}\nvoid _CompositeRow_Rgb2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan)\n{\n    if (clip_scan) {\n        for (int i = 0; i < width; i ++) {\n            *dest_scan = FXDIB_ALPHA_UNION(*dest_scan, *clip_scan);\n            dest_scan ++;\n            clip_scan ++;\n        }\n    } else {\n        FXSYS_memset8(dest_scan, 0xff, width);\n    }\n}\nvoid _CompositeRow_Argb2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,\n                              FX_LPCBYTE src_alpha_scan, FX_LPBYTE dst_alpha_scan, void* pIccTransform)\n{\n    ICodec_IccModule* pIccModule = NULL;\n    if (pIccTransform) {\n        pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n    }\n    if (blend_type) {\n        FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;\n        int blended_color;\n        if (src_alpha_scan) {\n            for (int col = 0; col < pixel_count; col ++) {\n                FX_BYTE back_alpha = *dst_alpha_scan;\n                if (back_alpha == 0) {\n                    int src_alpha = *src_alpha_scan++;\n                    if (clip_scan) {\n                        src_alpha = clip_scan[col] * src_alpha / 255;\n                    }\n                    if (src_alpha) {\n                        if (pIccTransform) {\n                            pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);\n                        } else {\n                            *dest_scan =  FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);\n                        }\n                        *dst_alpha_scan = src_alpha;\n                    }\n                    dest_scan ++;\n                    dst_alpha_scan ++;\n                    src_scan += 3;\n                    continue;\n                }\n                FX_BYTE src_alpha = *src_alpha_scan++;\n                if (clip_scan) {\n                    src_alpha = clip_scan[col] * src_alpha / 255;\n                }\n                if (src_alpha == 0) {\n                    dest_scan ++;\n                    dst_alpha_scan ++;\n                    src_scan += 3;\n                    continue;\n                }\n                *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);\n                int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);\n                FX_BYTE gray;\n                if (pIccTransform) {\n                    pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);\n                } else {\n                    gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);\n                }\n                if (bNonseparableBlend) {\n                    blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;\n                }\n                gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);\n                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);\n                dest_scan ++;\n                dst_alpha_scan++;\n                src_scan += 3;\n            }\n        } else\n            for (int col = 0; col < pixel_count; col ++) {\n                FX_BYTE back_alpha = *dst_alpha_scan;\n                if (back_alpha == 0) {\n                    int src_alpha = src_scan[3];\n                    if (clip_scan) {\n                        src_alpha = clip_scan[col] * src_alpha / 255;\n                    }\n                    if (src_alpha) {\n                        if (pIccTransform) {\n                            pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);\n                        } else {\n                            *dest_scan =  FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);\n                        }\n                        *dst_alpha_scan = src_alpha;\n                    }\n                    dest_scan ++;\n                    dst_alpha_scan ++;\n                    src_scan += 4;\n                    continue;\n                }\n                FX_BYTE src_alpha = src_scan[3];\n                if (clip_scan) {\n                    src_alpha = clip_scan[col] * src_alpha / 255;\n                }\n                if (src_alpha == 0) {\n                    dest_scan ++;\n                    dst_alpha_scan ++;\n                    src_scan += 4;\n                    continue;\n                }\n                *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);\n                int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);\n                FX_BYTE gray;\n                if (pIccTransform) {\n                    pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);\n                } else {\n                    gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);\n                }\n                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);\n                dest_scan ++;\n                dst_alpha_scan++;\n                src_scan += 4;\n            }\n        return;\n    }\n    if (src_alpha_scan) {\n        for (int col = 0; col < pixel_count; col ++) {\n            FX_BYTE back_alpha = *dst_alpha_scan;\n            if (back_alpha == 0) {\n                int src_alpha = *src_alpha_scan++;\n                if (clip_scan) {\n                    src_alpha = clip_scan[col] * src_alpha / 255;\n                }\n                if (src_alpha) {\n                    if (pIccTransform) {\n                        pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);\n                    } else {\n                        *dest_scan =  FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);\n                    }\n                    *dst_alpha_scan = src_alpha;\n                }\n                dest_scan ++;\n                dst_alpha_scan ++;\n                src_scan += 3;\n                continue;\n            }\n            FX_BYTE src_alpha = *src_alpha_scan++;\n            if (clip_scan) {\n                src_alpha = clip_scan[col] * src_alpha / 255;\n            }\n            if (src_alpha == 0) {\n                dest_scan ++;\n                dst_alpha_scan ++;\n                src_scan += 3;\n                continue;\n            }\n            *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);\n            int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);\n            FX_BYTE gray;\n            if (pIccTransform) {\n                pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);\n            } else {\n                gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);\n            }\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);\n            dest_scan ++;\n            dst_alpha_scan++;\n            src_scan += 3;\n        }\n    } else\n        for (int col = 0; col < pixel_count; col ++) {\n            FX_BYTE back_alpha = *dst_alpha_scan;\n            if (back_alpha == 0) {\n                int src_alpha = src_scan[3];\n                if (clip_scan) {\n                    src_alpha = clip_scan[col] * src_alpha / 255;\n                }\n                if (src_alpha) {\n                    if (pIccTransform) {\n                        pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);\n                    } else {\n                        *dest_scan =  FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);\n                    }\n                    *dst_alpha_scan = src_alpha;\n                }\n                dest_scan ++;\n                dst_alpha_scan ++;\n                src_scan += 4;\n                continue;\n            }\n            FX_BYTE src_alpha = src_scan[3];\n            if (clip_scan) {\n                src_alpha = clip_scan[col] * src_alpha / 255;\n            }\n            if (src_alpha == 0) {\n                dest_scan ++;\n                dst_alpha_scan ++;\n                src_scan += 4;\n                continue;\n            }\n            *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);\n            int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);\n            FX_BYTE gray;\n            if (pIccTransform) {\n                pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);\n            } else {\n                gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);\n            }\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);\n            dest_scan ++;\n            dst_alpha_scan++;\n            src_scan += 4;\n        }\n}\ninline void _CompositeRow_Argb2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count,\n                                    int blend_type, FX_LPCBYTE clip_scan,\n                                    FX_LPCBYTE src_alpha_scan, void* pIccTransform)\n{\n    ICodec_IccModule* pIccModule = NULL;\n    FX_BYTE gray;\n    if (pIccTransform) {\n        pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n    }\n    if (blend_type) {\n        FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;\n        int blended_color;\n        if (src_alpha_scan) {\n            for (int col = 0; col < pixel_count; col ++) {\n                int src_alpha = *src_alpha_scan++;\n                if (clip_scan) {\n                    src_alpha = clip_scan[col] * src_alpha / 255;\n                }\n                if (src_alpha) {\n                    if (pIccTransform) {\n                        pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);\n                    } else {\n                        gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);\n                    }\n                    if (bNonseparableBlend) {\n                        blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;\n                    }\n                    gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);\n                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);\n                }\n                dest_scan ++;\n                src_scan += 3;\n            }\n        } else\n            for (int col = 0; col < pixel_count; col ++) {\n                int src_alpha = src_scan[3];\n                if (clip_scan) {\n                    src_alpha = clip_scan[col] * src_alpha / 255;\n                }\n                if (src_alpha) {\n                    if (pIccTransform) {\n                        pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);\n                    } else {\n                        gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);\n                    }\n                    if (bNonseparableBlend) {\n                        blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;\n                    }\n                    gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);\n                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);\n                }\n                dest_scan ++;\n                src_scan += 4;\n            }\n        return;\n    }\n    if (src_alpha_scan) {\n        for (int col = 0; col < pixel_count; col ++) {\n            int src_alpha = *src_alpha_scan++;\n            if (clip_scan) {\n                src_alpha = clip_scan[col] * src_alpha / 255;\n            }\n            if (src_alpha) {\n                if (pIccTransform) {\n                    pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);\n                } else {\n                    gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);\n                }\n                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);\n            }\n            dest_scan ++;\n            src_scan += 3;\n        }\n    } else\n        for (int col = 0; col < pixel_count; col ++) {\n            int src_alpha = src_scan[3];\n            if (clip_scan) {\n                src_alpha = clip_scan[col] * src_alpha / 255;\n            }\n            if (src_alpha) {\n                if (pIccTransform) {\n                    pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);\n                } else {\n                    gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);\n                }\n                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);\n            }\n            dest_scan ++;\n            src_scan += 4;\n        }\n}\ninline void _CompositeRow_Rgb2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_Bpp, int pixel_count,\n                                   int blend_type, FX_LPCBYTE clip_scan,\n                                   void* pIccTransform)\n{\n    ICodec_IccModule* pIccModule = NULL;\n    FX_BYTE gray;\n    if (pIccTransform) {\n        pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n    }\n    if (blend_type) {\n        FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;\n        int blended_color;\n        for (int col = 0; col < pixel_count; col ++) {\n            if (pIccTransform) {\n                pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);\n            } else {\n                gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);\n            }\n            if (bNonseparableBlend) {\n                blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;\n            }\n            gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);\n            if (clip_scan && clip_scan[col] < 255) {\n                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);\n            } else {\n                *dest_scan = gray;\n            }\n            dest_scan ++;\n            src_scan += src_Bpp;\n        }\n        return;\n    }\n    for (int col = 0; col < pixel_count; col ++) {\n        if (pIccTransform) {\n            pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);\n        } else {\n            gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);\n        }\n        if (clip_scan && clip_scan[col] < 255) {\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);\n        } else {\n            *dest_scan = gray;\n        }\n        dest_scan ++;\n        src_scan += src_Bpp;\n    }\n}\nvoid _CompositeRow_Rgb2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_Bpp, int pixel_count,\n                             int blend_type, FX_LPCBYTE clip_scan,\n                             FX_LPBYTE dest_alpha_scan, void* pIccTransform)\n{\n    ICodec_IccModule* pIccModule = NULL;\n    if (pIccTransform) {\n        pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n    }\n    if (blend_type) {\n        int blended_color;\n        FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;\n        for (int col = 0; col < pixel_count; col ++) {\n            int back_alpha = *dest_alpha_scan;\n            if (back_alpha == 0) {\n                if (pIccTransform) {\n                    pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);\n                } else {\n                    *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);\n                }\n                dest_scan ++;\n                dest_alpha_scan++;\n                src_scan += src_Bpp;\n                continue;\n            }\n            int src_alpha = 255;\n            if (clip_scan) {\n                src_alpha = clip_scan[col];\n            }\n            if (src_alpha == 0) {\n                dest_scan ++;\n                dest_alpha_scan ++;\n                src_scan += src_Bpp;\n                continue;\n            }\n            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n            *dest_alpha_scan++ = dest_alpha;\n            int alpha_ratio = src_alpha * 255 / dest_alpha;\n            FX_BYTE gray;\n            if (pIccTransform) {\n                pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);\n            } else {\n                gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);\n            }\n            if (bNonseparableBlend) {\n                blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;\n            }\n            gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);\n            dest_scan ++;\n            src_scan += src_Bpp;\n        }\n        return;\n    }\n    for (int col = 0; col < pixel_count; col ++) {\n        int src_alpha = 255;\n        if (clip_scan) {\n            src_alpha = clip_scan[col];\n        }\n        if (src_alpha == 255) {\n            if (pIccTransform) {\n                pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);\n            } else {\n                *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);\n            }\n            dest_scan ++;\n            *dest_alpha_scan++ = 255;\n            src_scan += src_Bpp;\n            continue;\n        }\n        if (src_alpha == 0) {\n            dest_scan ++;\n            dest_alpha_scan ++;\n            src_scan += src_Bpp;\n            continue;\n        }\n        int back_alpha = *dest_alpha_scan;\n        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n        *dest_alpha_scan++ = dest_alpha;\n        int alpha_ratio = src_alpha * 255 / dest_alpha;\n        FX_BYTE gray;\n        if (pIccTransform) {\n            pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);\n        } else {\n            gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);\n        }\n        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);\n        dest_scan ++;\n        src_scan += src_Bpp;\n    }\n}\nvoid _CompositeRow_Argb2Argb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,\n                             FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan)\n{\n    int blended_colors[3];\n    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;\n    if (dest_alpha_scan == NULL) {\n        if (src_alpha_scan == NULL) {\n            FX_BYTE back_alpha = 0;\n            for (int col = 0; col < pixel_count; col ++) {\n                back_alpha = dest_scan[3];\n                if (back_alpha == 0) {\n                    if (clip_scan) {\n                        int src_alpha = clip_scan[col] * src_scan[3] / 255;\n                        FXARGB_SETDIB(dest_scan, (FXARGB_GETDIB(src_scan) & 0xffffff) | (src_alpha << 24));\n                    } else {\n                        FXARGB_COPY(dest_scan, src_scan);\n                    }\n                    dest_scan += 4;\n                    src_scan += 4;\n                    continue;\n                }\n                FX_BYTE src_alpha;\n                if (clip_scan == NULL) {\n                    src_alpha = src_scan[3];\n                } else {\n                    src_alpha = clip_scan[col] * src_scan[3] / 255;\n                }\n                if (src_alpha == 0) {\n                    dest_scan += 4;\n                    src_scan += 4;\n                    continue;\n                }\n                FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n                dest_scan[3] = dest_alpha;\n                int alpha_ratio = src_alpha * 255 / dest_alpha;\n                if (bNonseparableBlend) {\n                    _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);\n                }\n                for (int color = 0; color < 3; color ++) {\n                    if (blend_type) {\n                        int blended = bNonseparableBlend ? blended_colors[color] :\n                                      _BLEND(blend_type, *dest_scan, *src_scan);\n                        blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);\n                    } else {\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);\n                    }\n                    dest_scan ++;\n                    src_scan ++;\n                }\n                dest_scan ++;\n                src_scan ++;\n            }\n        } else {\n            for (int col = 0; col < pixel_count; col ++) {\n                FX_BYTE back_alpha = dest_scan[3];\n                if (back_alpha == 0) {\n                    if (clip_scan) {\n                        int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;\n                        FXARGB_SETDIB(dest_scan, FXARGB_MAKE((src_alpha << 24), src_scan[2], src_scan[1], *src_scan));\n                    } else {\n                        FXARGB_SETDIB(dest_scan, FXARGB_MAKE((*src_alpha_scan << 24), src_scan[2], src_scan[1], *src_scan));\n                    }\n                    dest_scan += 4;\n                    src_scan += 3;\n                    src_alpha_scan ++;\n                    continue;\n                }\n                FX_BYTE src_alpha;\n                if (clip_scan == NULL) {\n                    src_alpha = *src_alpha_scan ++;\n                } else {\n                    src_alpha = clip_scan[col] * (*src_alpha_scan ++) / 255;\n                }\n                if (src_alpha == 0) {\n                    dest_scan += 4;\n                    src_scan += 3;\n                    continue;\n                }\n                FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n                dest_scan[3] = dest_alpha;\n                int alpha_ratio = src_alpha * 255 / dest_alpha;\n                if (bNonseparableBlend) {\n                    _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);\n                }\n                for (int color = 0; color < 3; color ++) {\n                    if (blend_type) {\n                        int blended = bNonseparableBlend ? blended_colors[color] :\n                                      _BLEND(blend_type, *dest_scan, *src_scan);\n                        blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);\n                    } else {\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);\n                    }\n                    dest_scan ++;\n                    src_scan ++;\n                }\n                dest_scan ++;\n            }\n        }\n    } else {\n        if (src_alpha_scan) {\n            for (int col = 0; col < pixel_count; col ++) {\n                FX_BYTE back_alpha = *dest_alpha_scan;\n                if (back_alpha == 0) {\n                    if (clip_scan) {\n                        int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;\n                        *dest_alpha_scan = src_alpha;\n                        *dest_scan++ = *src_scan++;\n                        *dest_scan++ = *src_scan++;\n                        *dest_scan++ = *src_scan++;\n                    } else {\n                        *dest_alpha_scan = *src_alpha_scan;\n                        *dest_scan++ = *src_scan++;\n                        *dest_scan++ = *src_scan++;\n                        *dest_scan++ = *src_scan++;\n                    }\n                    dest_alpha_scan ++;\n                    src_alpha_scan ++;\n                    continue;\n                }\n                FX_BYTE src_alpha;\n                if (clip_scan == NULL) {\n                    src_alpha = *src_alpha_scan ++;\n                } else {\n                    src_alpha = clip_scan[col] * (*src_alpha_scan ++) / 255;\n                }\n                if (src_alpha == 0) {\n                    dest_scan += 3;\n                    src_scan += 3;\n                    dest_alpha_scan ++;\n                    continue;\n                }\n                FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n                *dest_alpha_scan ++ = dest_alpha;\n                int alpha_ratio = src_alpha * 255 / dest_alpha;\n                if (bNonseparableBlend) {\n                    _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);\n                }\n                for (int color = 0; color < 3; color ++) {\n                    if (blend_type) {\n                        int blended = bNonseparableBlend ? blended_colors[color] :\n                                      _BLEND(blend_type, *dest_scan, *src_scan);\n                        blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);\n                    } else {\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);\n                    }\n                    dest_scan ++;\n                    src_scan ++;\n                }\n            }\n        } else {\n            for (int col = 0; col < pixel_count; col ++) {\n                FX_BYTE back_alpha = *dest_alpha_scan;\n                if (back_alpha == 0) {\n                    if (clip_scan) {\n                        int src_alpha = clip_scan[col] * src_scan[3] / 255;\n                        *dest_alpha_scan = src_alpha;\n                        *dest_scan++ = *src_scan++;\n                        *dest_scan++ = *src_scan++;\n                        *dest_scan++ = *src_scan++;\n                    } else {\n                        *dest_alpha_scan = src_scan[3];\n                        *dest_scan++ = *src_scan++;\n                        *dest_scan++ = *src_scan++;\n                        *dest_scan++ = *src_scan++;\n                    }\n                    dest_alpha_scan ++;\n                    src_scan ++;\n                    continue;\n                }\n                FX_BYTE src_alpha;\n                if (clip_scan == NULL) {\n                    src_alpha = src_scan[3];\n                } else {\n                    src_alpha = clip_scan[col] * src_scan[3] / 255;\n                }\n                if (src_alpha == 0) {\n                    dest_scan += 3;\n                    src_scan += 4;\n                    dest_alpha_scan ++;\n                    continue;\n                }\n                FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n                *dest_alpha_scan++ = dest_alpha;\n                int alpha_ratio = src_alpha * 255 / dest_alpha;\n                if (bNonseparableBlend) {\n                    _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);\n                }\n                for (int color = 0; color < 3; color ++) {\n                    if (blend_type) {\n                        int blended = bNonseparableBlend ? blended_colors[color] :\n                                      _BLEND(blend_type, *dest_scan, *src_scan);\n                        blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);\n                    } else {\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);\n                    }\n                    dest_scan ++;\n                    src_scan ++;\n                }\n                src_scan ++;\n            }\n        }\n    }\n}\nvoid _CompositeRow_Rgb2Argb_Blend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp,\n        FX_LPBYTE dest_alpha_scan)\n{\n    int blended_colors[3];\n    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;\n    int src_gap = src_Bpp - 3;\n    if (dest_alpha_scan == NULL) {\n        for (int col = 0; col < width; col ++) {\n            FX_BYTE back_alpha = dest_scan[3];\n            if (back_alpha == 0) {\n                if (src_Bpp == 4) {\n                    FXARGB_SETDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));\n                } else {\n                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));\n                }\n                dest_scan += 4;\n                src_scan += src_Bpp;\n                continue;\n            }\n            dest_scan[3] = 0xff;\n            if (bNonseparableBlend) {\n                _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);\n            }\n            for (int color = 0; color < 3; color ++) {\n                int src_color = *src_scan;\n                int blended = bNonseparableBlend ? blended_colors[color] :\n                              _BLEND(blend_type, *dest_scan, src_color);\n                *dest_scan = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);\n                dest_scan ++;\n                src_scan ++;\n            }\n            dest_scan ++;\n            src_scan += src_gap;\n        }\n    } else {\n        for (int col = 0; col < width; col ++) {\n            FX_BYTE back_alpha = *dest_alpha_scan;\n            if (back_alpha == 0) {\n                *dest_scan++ = *src_scan++;\n                *dest_scan++ = *src_scan++;\n                *dest_scan++ = *src_scan++;\n                *dest_alpha_scan++ = 0xff;\n                src_scan += src_gap;\n                continue;\n            }\n            *dest_alpha_scan++ = 0xff;\n            if (bNonseparableBlend) {\n                _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);\n            }\n            for (int color = 0; color < 3; color ++) {\n                int src_color = *src_scan;\n                int blended = bNonseparableBlend ? blended_colors[color] :\n                              _BLEND(blend_type, *dest_scan, src_color);\n                *dest_scan = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);\n                dest_scan ++;\n                src_scan ++;\n            }\n            src_scan += src_gap;\n        }\n    }\n}\ninline void _CompositeRow_Rgb2Argb_Blend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp, FX_LPCBYTE clip_scan,\n        FX_LPBYTE dest_alpha_scan)\n{\n    int blended_colors[3];\n    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;\n    int src_gap = src_Bpp - 3;\n    if (dest_alpha_scan == NULL) {\n        for (int col = 0; col < width; col ++) {\n            int src_alpha = *clip_scan ++;\n            FX_BYTE back_alpha = dest_scan[3];\n            if (back_alpha == 0) {\n                *dest_scan++ = *src_scan++;\n                *dest_scan++ = *src_scan++;\n                *dest_scan++ = *src_scan++;\n                src_scan += src_gap;\n                dest_scan ++;\n                continue;\n            }\n            if (src_alpha == 0) {\n                dest_scan += 4;\n                src_scan += src_Bpp;\n                continue;\n            }\n            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n            dest_scan[3] = dest_alpha;\n            int alpha_ratio = src_alpha * 255 / dest_alpha;\n            if (bNonseparableBlend) {\n                _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);\n            }\n            for (int color = 0; color < 3; color ++) {\n                int src_color = *src_scan;\n                int blended = bNonseparableBlend ? blended_colors[color] :\n                              _BLEND(blend_type, *dest_scan, src_color);\n                blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);\n                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);\n                dest_scan ++;\n                src_scan ++;\n            }\n            dest_scan ++;\n            src_scan += src_gap;\n        }\n    } else {\n        for (int col = 0; col < width; col ++) {\n            int src_alpha = *clip_scan ++;\n            FX_BYTE back_alpha = *dest_alpha_scan;\n            if (back_alpha == 0) {\n                *dest_scan++ = *src_scan++;\n                *dest_scan++ = *src_scan++;\n                *dest_scan++ = *src_scan++;\n                src_scan += src_gap;\n                dest_alpha_scan++;\n                continue;\n            }\n            if (src_alpha == 0) {\n                dest_scan += 3;\n                dest_alpha_scan++;\n                src_scan += src_Bpp;\n                continue;\n            }\n            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n            *dest_alpha_scan++ = dest_alpha;\n            int alpha_ratio = src_alpha * 255 / dest_alpha;\n            if (bNonseparableBlend) {\n                _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);\n            }\n            for (int color = 0; color < 3; color ++) {\n                int src_color = *src_scan;\n                int blended = bNonseparableBlend ? blended_colors[color] :\n                              _BLEND(blend_type, *dest_scan, src_color);\n                blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);\n                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);\n                dest_scan ++;\n                src_scan ++;\n            }\n            src_scan += src_gap;\n        }\n    }\n}\ninline void _CompositeRow_Rgb2Argb_NoBlend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp, FX_LPCBYTE clip_scan,\n        FX_LPBYTE dest_alpha_scan)\n{\n    int src_gap = src_Bpp - 3;\n    if (dest_alpha_scan == NULL) {\n        for (int col = 0; col < width; col ++) {\n            int src_alpha = clip_scan[col];\n            if (src_alpha == 255) {\n                *dest_scan++ = *src_scan++;\n                *dest_scan++ = *src_scan++;\n                *dest_scan++ = *src_scan++;\n                *dest_scan++ = 255;\n                src_scan += src_gap;\n                continue;\n            }\n            if (src_alpha == 0) {\n                dest_scan += 4;\n                src_scan += src_Bpp;\n                continue;\n            }\n            int back_alpha = dest_scan[3];\n            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n            dest_scan[3] = dest_alpha;\n            int alpha_ratio = src_alpha * 255 / dest_alpha;\n            for (int color = 0; color < 3; color ++) {\n                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);\n                dest_scan ++;\n                src_scan ++;\n            }\n            dest_scan ++;\n            src_scan += src_gap;\n        }\n    } else {\n        for (int col = 0; col < width; col ++) {\n            int src_alpha = clip_scan[col];\n            if (src_alpha == 255) {\n                *dest_scan++ = *src_scan++;\n                *dest_scan++ = *src_scan++;\n                *dest_scan++ = *src_scan++;\n                *dest_alpha_scan++ = 255;\n                src_scan += src_gap;\n                continue;\n            }\n            if (src_alpha == 0) {\n                dest_scan += 3;\n                dest_alpha_scan ++;\n                src_scan += src_Bpp;\n                continue;\n            }\n            int back_alpha = *dest_alpha_scan;\n            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n            *dest_alpha_scan ++ = dest_alpha;\n            int alpha_ratio = src_alpha * 255 / dest_alpha;\n            for (int color = 0; color < 3; color ++) {\n                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);\n                dest_scan ++;\n                src_scan ++;\n            }\n            src_scan += src_gap;\n        }\n    }\n}\ninline void _CompositeRow_Rgb2Argb_NoBlend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp,\n        FX_LPBYTE dest_alpha_scan)\n{\n    if (dest_alpha_scan == NULL) {\n        for (int col = 0; col < width; col ++) {\n            if (src_Bpp == 4) {\n                FXARGB_SETDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));\n            } else {\n                FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));\n            }\n            dest_scan += 4;\n            src_scan += src_Bpp;\n        }\n    } else {\n        int src_gap = src_Bpp - 3;\n        for (int col = 0; col < width; col ++) {\n            *dest_scan++ = *src_scan++;\n            *dest_scan++ = *src_scan++;\n            *dest_scan++ = *src_scan++;\n            *dest_alpha_scan++ = 0xff;\n            src_scan += src_gap;\n        }\n    }\n}\ninline void _CompositeRow_Argb2Rgb_Blend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, FX_LPCBYTE clip_scan,\n        FX_LPCBYTE src_alpha_scan)\n{\n    int blended_colors[3];\n    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;\n    int dest_gap = dest_Bpp - 3;\n    if (src_alpha_scan == NULL) {\n        for (int col = 0; col < width; col ++) {\n            FX_BYTE src_alpha;\n            if (clip_scan) {\n                src_alpha = src_scan[3] * (*clip_scan++) / 255;\n            } else {\n                src_alpha = src_scan[3];\n            }\n            if (src_alpha == 0) {\n                dest_scan += dest_Bpp;\n                src_scan += 4;\n                continue;\n            }\n            if (bNonseparableBlend) {\n                _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);\n            }\n            for (int color = 0; color < 3; color ++) {\n                int back_color = *dest_scan;\n                int blended = bNonseparableBlend ? blended_colors[color] :\n                              _BLEND(blend_type, back_color, *src_scan);\n                *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);\n                dest_scan ++;\n                src_scan ++;\n            }\n            dest_scan += dest_gap;\n            src_scan ++;\n        }\n    } else {\n        for (int col = 0; col < width; col ++) {\n            FX_BYTE src_alpha;\n            if (clip_scan) {\n                src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;\n            } else {\n                src_alpha = *src_alpha_scan++;\n            }\n            if (src_alpha == 0) {\n                dest_scan += dest_Bpp;\n                src_scan += 3;\n                continue;\n            }\n            if (bNonseparableBlend) {\n                _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);\n            }\n            for (int color = 0; color < 3; color ++) {\n                int back_color = *dest_scan;\n                int blended = bNonseparableBlend ? blended_colors[color] :\n                              _BLEND(blend_type, back_color, *src_scan);\n                *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);\n                dest_scan ++;\n                src_scan ++;\n            }\n            dest_scan += dest_gap;\n        }\n    }\n}\ninline void _CompositeRow_Argb2Rgb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, FX_LPCBYTE clip_scan,\n        FX_LPCBYTE src_alpha_scan)\n{\n    int dest_gap = dest_Bpp - 3;\n    if (src_alpha_scan == NULL) {\n        for (int col = 0; col < width; col ++) {\n            FX_BYTE src_alpha;\n            if (clip_scan) {\n                src_alpha = src_scan[3] * (*clip_scan++) / 255;\n            } else {\n                src_alpha = src_scan[3];\n            }\n            if (src_alpha == 255) {\n                *dest_scan++ = *src_scan++;\n                *dest_scan++ = *src_scan++;\n                *dest_scan++ = *src_scan++;\n                dest_scan += dest_gap;\n                src_scan ++;\n                continue;\n            }\n            if (src_alpha == 0) {\n                dest_scan += dest_Bpp;\n                src_scan += 4;\n                continue;\n            }\n            for (int color = 0; color < 3; color ++) {\n                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);\n                dest_scan ++;\n                src_scan ++;\n            }\n            dest_scan += dest_gap;\n            src_scan ++;\n        }\n    } else {\n        for (int col = 0; col < width; col ++) {\n            FX_BYTE src_alpha;\n            if (clip_scan) {\n                src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;\n            } else {\n                src_alpha = *src_alpha_scan++;\n            }\n            if (src_alpha == 255) {\n                *dest_scan++ = *src_scan++;\n                *dest_scan++ = *src_scan++;\n                *dest_scan++ = *src_scan++;\n                dest_scan += dest_gap;\n                continue;\n            }\n            if (src_alpha == 0) {\n                dest_scan += dest_Bpp;\n                src_scan += 3;\n                continue;\n            }\n            for (int color = 0; color < 3; color ++) {\n                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);\n                dest_scan ++;\n                src_scan ++;\n            }\n            dest_scan += dest_gap;\n        }\n    }\n}\ninline void _CompositeRow_Rgb2Rgb_Blend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp)\n{\n    int blended_colors[3];\n    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;\n    int dest_gap = dest_Bpp - 3;\n    int src_gap = src_Bpp - 3;\n    for (int col = 0; col < width; col ++) {\n        if (bNonseparableBlend) {\n            _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);\n        }\n        for (int color = 0; color < 3; color ++) {\n            int back_color = *dest_scan;\n            int src_color = *src_scan;\n            int blended = bNonseparableBlend ? blended_colors[color] :\n                          _BLEND(blend_type, back_color, src_color);\n            *dest_scan = blended;\n            dest_scan ++;\n            src_scan ++;\n        }\n        dest_scan += dest_gap;\n        src_scan += src_gap;\n    }\n}\ninline void _CompositeRow_Rgb2Rgb_Blend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)\n{\n    int blended_colors[3];\n    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;\n    int dest_gap = dest_Bpp - 3;\n    int src_gap = src_Bpp - 3;\n    for (int col = 0; col < width; col ++) {\n        FX_BYTE src_alpha = *clip_scan ++;\n        if (src_alpha == 0) {\n            dest_scan += dest_Bpp;\n            src_scan += src_Bpp;\n            continue;\n        }\n        if (bNonseparableBlend) {\n            _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);\n        }\n        for (int color = 0; color < 3; color ++) {\n            int src_color = *src_scan;\n            int back_color = *dest_scan;\n            int blended = bNonseparableBlend ? blended_colors[color] :\n                          _BLEND(blend_type, back_color, src_color);\n            *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);\n            dest_scan ++;\n            src_scan ++;\n        }\n        dest_scan += dest_gap;\n        src_scan += src_gap;\n    }\n}\ninline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp)\n{\n    if (dest_Bpp == src_Bpp) {\n        FXSYS_memcpy32(dest_scan, src_scan, width * dest_Bpp);\n        return;\n    }\n    for (int col = 0; col < width; col ++) {\n        dest_scan[0] = src_scan[0];\n        dest_scan[1] = src_scan[1];\n        dest_scan[2] = src_scan[2];\n        dest_scan += dest_Bpp;\n        src_scan += src_Bpp;\n    }\n}\ninline void _CompositeRow_Rgb2Rgb_NoBlend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)\n{\n    for (int col = 0; col < width; col ++) {\n        int src_alpha = clip_scan[col];\n        if (src_alpha == 255) {\n            dest_scan[0] = src_scan[0];\n            dest_scan[1] = src_scan[1];\n            dest_scan[2] = src_scan[2];\n        } else if (src_alpha) {\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);\n            dest_scan ++;\n            src_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);\n            dest_scan ++;\n            src_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);\n            dest_scan += dest_Bpp - 2;\n            src_scan += src_Bpp - 2;\n            continue;\n        }\n        dest_scan += dest_Bpp;\n        src_scan += src_Bpp;\n    }\n}\nvoid _CompositeRow_Argb2Argb_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,\n                                       FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)\n{\n    FX_LPBYTE dp = src_cache_scan;\n    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n    if (src_alpha_scan) {\n        if (dest_alpha_scan == NULL) {\n            for (int col = 0; col < pixel_count; col ++) {\n                pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);\n                dp[3] = *src_alpha_scan++;\n                src_scan += 3;\n                dp += 4;\n            }\n            src_alpha_scan = NULL;\n        } else {\n            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, pixel_count);\n        }\n    } else {\n        if (dest_alpha_scan == NULL) {\n            for (int col = 0; col < pixel_count; col ++) {\n                pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);\n                dp[3] = src_scan[3];\n                src_scan += 4;\n                dp += 4;\n            }\n        } else {\n            int blended_colors[3];\n            FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;\n            for (int col = 0; col < pixel_count; col ++) {\n                pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, 1);\n                FX_BYTE back_alpha = *dest_alpha_scan;\n                if (back_alpha == 0) {\n                    if (clip_scan) {\n                        int src_alpha = clip_scan[col] * src_scan[3] / 255;\n                        *dest_alpha_scan = src_alpha;\n                        *dest_scan++ = *src_cache_scan++;\n                        *dest_scan++ = *src_cache_scan++;\n                        *dest_scan++ = *src_cache_scan++;\n                    } else {\n                        *dest_alpha_scan = src_scan[3];\n                        *dest_scan++ = *src_cache_scan++;\n                        *dest_scan++ = *src_cache_scan++;\n                        *dest_scan++ = *src_cache_scan++;\n                    }\n                    dest_alpha_scan ++;\n                    src_scan += 4;\n                    continue;\n                }\n                FX_BYTE src_alpha;\n                if (clip_scan == NULL) {\n                    src_alpha = src_scan[3];\n                } else {\n                    src_alpha = clip_scan[col] * src_scan[3] / 255;\n                }\n                src_scan += 4;\n                if (src_alpha == 0) {\n                    dest_scan += 3;\n                    src_cache_scan += 3;\n                    dest_alpha_scan ++;\n                    continue;\n                }\n                FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n                *dest_alpha_scan ++ = dest_alpha;\n                int alpha_ratio = src_alpha * 255 / dest_alpha;\n                if (bNonseparableBlend) {\n                    _RGB_Blend(blend_type, src_cache_scan, dest_scan, blended_colors);\n                }\n                for (int color = 0; color < 3; color ++) {\n                    if (blend_type) {\n                        int blended = bNonseparableBlend ? blended_colors[color] :\n                                      _BLEND(blend_type, *dest_scan, *src_cache_scan);\n                        blended = FXDIB_ALPHA_MERGE(*src_cache_scan, blended, back_alpha);\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);\n                    } else {\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_cache_scan, alpha_ratio);\n                    }\n                    dest_scan ++;\n                    src_cache_scan ++;\n                }\n            }\n            return;\n        }\n    }\n    _CompositeRow_Argb2Argb(dest_scan, src_cache_scan, pixel_count, blend_type, clip_scan, dest_alpha_scan, src_alpha_scan);\n}\nvoid _CompositeRow_Rgb2Argb_Blend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp,\n        FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)\n{\n    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n    if (src_Bpp == 3) {\n        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);\n    } else {\n        FX_LPBYTE dp = src_cache_scan;\n        for (int col = 0; col < width; col ++) {\n            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);\n            src_scan += 4;\n            dp += 3;\n        }\n    }\n    _CompositeRow_Rgb2Argb_Blend_NoClip(dest_scan, src_cache_scan, width, blend_type, 3, dest_alpha_scan);\n}\ninline void _CompositeRow_Rgb2Argb_Blend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp, FX_LPCBYTE clip_scan,\n        FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)\n{\n    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n    if (src_Bpp == 3) {\n        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);\n    } else {\n        FX_LPBYTE dp = src_cache_scan;\n        for (int col = 0; col < width; col ++) {\n            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);\n            src_scan += 4;\n            dp += 3;\n        }\n    }\n    _CompositeRow_Rgb2Argb_Blend_Clip(dest_scan, src_cache_scan, width, blend_type, 3, clip_scan, dest_alpha_scan);\n}\ninline void _CompositeRow_Rgb2Argb_NoBlend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp, FX_LPCBYTE clip_scan,\n        FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)\n{\n    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n    if (src_Bpp == 3) {\n        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);\n    } else {\n        FX_LPBYTE dp = src_cache_scan;\n        for (int col = 0; col < width; col ++) {\n            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);\n            src_scan += 4;\n            dp += 3;\n        }\n    }\n    _CompositeRow_Rgb2Argb_NoBlend_Clip(dest_scan, src_cache_scan, width, 3, clip_scan, dest_alpha_scan);\n}\ninline void _CompositeRow_Rgb2Argb_NoBlend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp,\n        FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)\n{\n    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n    if (src_Bpp == 3) {\n        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);\n    } else {\n        FX_LPBYTE dp = src_cache_scan;\n        for (int col = 0; col < width; col ++) {\n            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);\n            src_scan += 4;\n            dp += 3;\n        }\n    }\n    _CompositeRow_Rgb2Argb_NoBlend_NoClip(dest_scan, src_cache_scan, width, 3, dest_alpha_scan);\n}\ninline void _CompositeRow_Argb2Rgb_Blend_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, FX_LPCBYTE clip_scan,\n        FX_LPCBYTE src_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)\n{\n    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n    if (src_alpha_scan) {\n        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);\n    } else {\n        int blended_colors[3];\n        FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;\n        int dest_gap = dest_Bpp - 3;\n        for (int col = 0; col < width; col ++) {\n            pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, 1);\n            FX_BYTE src_alpha;\n            if (clip_scan) {\n                src_alpha = src_scan[3] * (*clip_scan++) / 255;\n            } else {\n                src_alpha = src_scan[3];\n            }\n            src_scan += 4;\n            if (src_alpha == 0) {\n                dest_scan += dest_Bpp;\n                src_cache_scan += 3;\n                continue;\n            }\n            if (bNonseparableBlend) {\n                _RGB_Blend(blend_type, src_cache_scan, dest_scan, blended_colors);\n            }\n            for (int color = 0; color < 3; color ++) {\n                int back_color = *dest_scan;\n                int blended = bNonseparableBlend ? blended_colors[color] :\n                              _BLEND(blend_type, back_color, *src_cache_scan);\n                *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);\n                dest_scan ++;\n                src_cache_scan ++;\n            }\n            dest_scan += dest_gap;\n        }\n        return;\n    }\n    _CompositeRow_Argb2Rgb_Blend(dest_scan, src_cache_scan, width, blend_type, dest_Bpp, clip_scan, src_alpha_scan);\n}\ninline void _CompositeRow_Argb2Rgb_NoBlend_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, FX_LPCBYTE clip_scan,\n        FX_LPCBYTE src_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)\n{\n    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n    if (src_alpha_scan) {\n        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);\n    } else {\n        int dest_gap = dest_Bpp - 3;\n        for (int col = 0; col < width; col ++) {\n            pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, 1);\n            FX_BYTE src_alpha;\n            if (clip_scan) {\n                src_alpha = src_scan[3] * (*clip_scan++) / 255;\n            } else {\n                src_alpha = src_scan[3];\n            }\n            src_scan += 4;\n            if (src_alpha == 255) {\n                *dest_scan++ = *src_cache_scan++;\n                *dest_scan++ = *src_cache_scan++;\n                *dest_scan++ = *src_cache_scan++;\n                dest_scan += dest_gap;\n                continue;\n            }\n            if (src_alpha == 0) {\n                dest_scan += dest_Bpp;\n                src_cache_scan += 3;\n                continue;\n            }\n            for (int color = 0; color < 3; color ++) {\n                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_cache_scan, src_alpha);\n                dest_scan ++;\n                src_cache_scan ++;\n            }\n            dest_scan += dest_gap;\n        }\n        return;\n    }\n    _CompositeRow_Argb2Rgb_NoBlend(dest_scan, src_cache_scan, width, dest_Bpp, clip_scan, src_alpha_scan);\n}\ninline void _CompositeRow_Rgb2Rgb_Blend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp,\n        FX_LPBYTE src_cache_scan, void* pIccTransform)\n{\n    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n    if (src_Bpp == 3) {\n        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);\n    } else {\n        FX_LPBYTE dp = src_cache_scan;\n        for (int col = 0; col < width; col ++) {\n            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);\n            src_scan += 4;\n            dp += 3;\n        }\n    }\n    _CompositeRow_Rgb2Rgb_Blend_NoClip(dest_scan, src_cache_scan, width, blend_type, dest_Bpp, 3);\n}\ninline void _CompositeRow_Rgb2Rgb_Blend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan,\n        FX_LPBYTE src_cache_scan, void* pIccTransform)\n{\n    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n    if (src_Bpp == 3) {\n        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);\n    } else {\n        FX_LPBYTE dp = src_cache_scan;\n        for (int col = 0; col < width; col ++) {\n            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);\n            src_scan += 4;\n            dp += 3;\n        }\n    }\n    _CompositeRow_Rgb2Rgb_Blend_Clip(dest_scan, src_cache_scan, width, blend_type, dest_Bpp, 3, clip_scan);\n}\ninline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp,\n        FX_LPBYTE src_cache_scan, void* pIccTransform)\n{\n    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n    if (src_Bpp == 3) {\n        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);\n    } else {\n        FX_LPBYTE dp = src_cache_scan;\n        for (int col = 0; col < width; col ++) {\n            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);\n            src_scan += 4;\n            dp += 3;\n        }\n    }\n    _CompositeRow_Rgb2Rgb_NoBlend_NoClip(dest_scan, src_cache_scan, width, dest_Bpp, 3);\n}\ninline void _CompositeRow_Rgb2Rgb_NoBlend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan,\n        FX_LPBYTE src_cache_scan, void* pIccTransform)\n{\n    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n    if (src_Bpp == 3) {\n        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);\n    } else {\n        FX_LPBYTE dp = src_cache_scan;\n        for (int col = 0; col < width; col ++) {\n            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);\n            src_scan += 4;\n            dp += 3;\n        }\n    }\n    _CompositeRow_Rgb2Rgb_NoBlend_Clip(dest_scan, src_cache_scan, width, dest_Bpp, 3, clip_scan);\n}\ninline void _CompositeRow_8bppPal2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_LPCBYTE pPalette, int pixel_count,\n                                       int blend_type, FX_LPCBYTE clip_scan,\n                                       FX_LPCBYTE src_alpha_scan)\n{\n    if (src_alpha_scan) {\n        if (blend_type) {\n            FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;\n            int blended_color;\n            for (int col = 0; col < pixel_count; col ++) {\n                FX_BYTE gray = pPalette[*src_scan];\n                int src_alpha = *src_alpha_scan++;\n                if (clip_scan) {\n                    src_alpha = clip_scan[col] * src_alpha / 255;\n                }\n                if (bNonseparableBlend) {\n                    blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;\n                }\n                gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);\n                if (src_alpha) {\n                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);\n                } else {\n                    *dest_scan = gray;\n                }\n                dest_scan ++;\n                src_scan ++;\n            }\n            return;\n        }\n        for (int col = 0; col < pixel_count; col ++) {\n            FX_BYTE gray = pPalette[*src_scan];\n            int src_alpha = *src_alpha_scan++;\n            if (clip_scan) {\n                src_alpha = clip_scan[col] * src_alpha / 255;\n            }\n            if (src_alpha) {\n                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);\n            } else {\n                *dest_scan = gray;\n            }\n            dest_scan ++;\n            src_scan ++;\n        }\n    } else {\n        if (blend_type) {\n            FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;\n            int blended_color;\n            for (int col = 0; col < pixel_count; col ++) {\n                FX_BYTE gray = pPalette[*src_scan];\n                if (bNonseparableBlend) {\n                    blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;\n                }\n                gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);\n                if (clip_scan && clip_scan[col] < 255) {\n                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);\n                } else {\n                    *dest_scan = gray;\n                }\n                dest_scan ++;\n                src_scan ++;\n            }\n            return;\n        }\n        for (int col = 0; col < pixel_count; col ++) {\n            FX_BYTE gray = pPalette[*src_scan];\n            if (clip_scan && clip_scan[col] < 255) {\n                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);\n            } else {\n                *dest_scan = gray;\n            }\n            dest_scan ++;\n            src_scan ++;\n        }\n    }\n}\ninline void _CompositeRow_8bppPal2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_LPCBYTE pPalette, int pixel_count,\n                                        int blend_type, FX_LPCBYTE clip_scan,\n                                        FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan)\n{\n    if (src_alpha_scan) {\n        if (blend_type) {\n            FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;\n            int blended_color;\n            for (int col = 0; col < pixel_count; col ++) {\n                FX_BYTE gray = pPalette[*src_scan];\n                src_scan ++;\n                FX_BYTE back_alpha = *dest_alpha_scan;\n                if (back_alpha == 0) {\n                    int src_alpha = *src_alpha_scan ++;\n                    if (clip_scan) {\n                        src_alpha = clip_scan[col] * src_alpha / 255;\n                    }\n                    if (src_alpha) {\n                        *dest_scan = gray;\n                        *dest_alpha_scan = src_alpha;\n                    }\n                    dest_scan ++;\n                    dest_alpha_scan ++;\n                    continue;\n                }\n                FX_BYTE src_alpha = *src_alpha_scan++;\n                if (clip_scan) {\n                    src_alpha = clip_scan[col] * src_alpha / 255;\n                }\n                if (src_alpha == 0) {\n                    dest_scan ++;\n                    dest_alpha_scan ++;\n                    continue;\n                }\n                *dest_alpha_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n                int alpha_ratio = src_alpha * 255 / (*dest_alpha_scan);\n                if (bNonseparableBlend) {\n                    blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;\n                }\n                gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);\n                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);\n                dest_alpha_scan ++;\n                dest_scan ++;\n            }\n            return;\n        }\n        for (int col = 0; col < pixel_count; col ++) {\n            FX_BYTE gray = pPalette[*src_scan];\n            src_scan ++;\n            FX_BYTE back_alpha = *dest_alpha_scan;\n            if (back_alpha == 0) {\n                int src_alpha = *src_alpha_scan ++;\n                if (clip_scan) {\n                    src_alpha = clip_scan[col] * src_alpha / 255;\n                }\n                if (src_alpha) {\n                    *dest_scan = gray;\n                    *dest_alpha_scan = src_alpha;\n                }\n                dest_scan ++;\n                dest_alpha_scan ++;\n                continue;\n            }\n            FX_BYTE src_alpha = *src_alpha_scan++;\n            if (clip_scan) {\n                src_alpha = clip_scan[col] * src_alpha / 255;\n            }\n            if (src_alpha == 0) {\n                dest_scan ++;\n                dest_alpha_scan ++;\n                continue;\n            }\n            *dest_alpha_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n            int alpha_ratio = src_alpha * 255 / (*dest_alpha_scan);\n            dest_alpha_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);\n            dest_scan ++;\n        }\n    } else {\n        if (blend_type) {\n            FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;\n            int blended_color;\n            for (int col = 0; col < pixel_count; col ++) {\n                FX_BYTE gray = pPalette[*src_scan];\n                src_scan ++;\n                if (clip_scan == NULL || clip_scan[col] == 255) {\n                    *dest_scan++ = gray;\n                    *dest_alpha_scan++ = 255;\n                    continue;\n                }\n                int src_alpha = clip_scan[col];\n                if (src_alpha == 0) {\n                    dest_scan ++;\n                    dest_alpha_scan ++;\n                    continue;\n                }\n                int back_alpha = *dest_alpha_scan;\n                FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n                *dest_alpha_scan ++ = dest_alpha;\n                int alpha_ratio = src_alpha * 255 / dest_alpha;\n                if (bNonseparableBlend) {\n                    blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;\n                }\n                gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);\n                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);\n                dest_scan ++;\n            }\n            return;\n        }\n        for (int col = 0; col < pixel_count; col ++) {\n            FX_BYTE gray = pPalette[*src_scan];\n            src_scan ++;\n            if (clip_scan == NULL || clip_scan[col] == 255) {\n                *dest_scan++ = gray;\n                *dest_alpha_scan++ = 255;\n                continue;\n            }\n            int src_alpha = clip_scan[col];\n            if (src_alpha == 0) {\n                dest_scan ++;\n                dest_alpha_scan ++;\n                continue;\n            }\n            int back_alpha = *dest_alpha_scan;\n            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n            *dest_alpha_scan ++ = dest_alpha;\n            int alpha_ratio = src_alpha * 255 / dest_alpha;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);\n            dest_scan ++;\n        }\n    }\n}\ninline void _CompositeRow_1bppPal2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,\n                                       FX_LPCBYTE pPalette, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)\n{\n    int reset_gray = pPalette[0];\n    int set_gray = pPalette[1];\n    if (blend_type) {\n        FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;\n        int blended_color;\n        for (int col = 0; col < pixel_count; col ++) {\n            FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;\n            if (bNonseparableBlend) {\n                blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;\n            }\n            gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);\n            if (clip_scan && clip_scan[col] < 255) {\n                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);\n            } else {\n                *dest_scan = gray;\n            }\n            dest_scan ++;\n        }\n        return;\n    }\n    for (int col = 0; col < pixel_count; col ++) {\n        FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;\n        if (clip_scan && clip_scan[col] < 255) {\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);\n        } else {\n            *dest_scan = gray;\n        }\n        dest_scan ++;\n    }\n}\ninline void _CompositeRow_1bppPal2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,\n                                        FX_LPCBYTE pPalette, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,\n                                        FX_LPBYTE dest_alpha_scan)\n{\n    int reset_gray = pPalette[0];\n    int set_gray = pPalette[1];\n    if (blend_type) {\n        FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;\n        int blended_color;\n        for (int col = 0; col < pixel_count; col ++) {\n            FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;\n            if (clip_scan == NULL || clip_scan[col] == 255) {\n                *dest_scan++ = gray;\n                *dest_alpha_scan ++ = 255;\n                continue;\n            }\n            int src_alpha = clip_scan[col];\n            if (src_alpha == 0) {\n                dest_scan ++;\n                dest_alpha_scan ++;\n                continue;\n            }\n            int back_alpha = *dest_alpha_scan;\n            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n            *dest_alpha_scan ++ = dest_alpha;\n            int alpha_ratio = src_alpha * 255 / dest_alpha;\n            if (bNonseparableBlend) {\n                blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;\n            }\n            gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);\n            dest_scan ++;\n        }\n        return;\n    }\n    for (int col = 0; col < pixel_count; col ++) {\n        FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;\n        if (clip_scan == NULL || clip_scan[col] == 255) {\n            *dest_scan++ = gray;\n            *dest_alpha_scan ++ = 255;\n            continue;\n        }\n        int src_alpha = clip_scan[col];\n        if (src_alpha == 0) {\n            dest_scan ++;\n            dest_alpha_scan ++;\n            continue;\n        }\n        int back_alpha = *dest_alpha_scan;\n        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n        *dest_alpha_scan ++ = dest_alpha;\n        int alpha_ratio = src_alpha * 255 / dest_alpha;\n        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);\n        dest_scan ++;\n    }\n}\ninline void _CompositeRow_8bppRgb2Rgb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_DWORD* pPalette, int pixel_count,\n        int DestBpp, FX_LPCBYTE clip_scan,\n        FX_LPCBYTE src_alpha_scan)\n{\n    if (src_alpha_scan) {\n        int dest_gap = DestBpp - 3;\n        FX_ARGB argb = 0;\n        for (int col = 0; col < pixel_count; col ++) {\n            argb = pPalette[*src_scan];\n            int src_r = FXARGB_R(argb);\n            int src_g = FXARGB_G(argb);\n            int src_b = FXARGB_B(argb);\n            src_scan ++;\n            FX_BYTE src_alpha = 0;\n            if (clip_scan) {\n                src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;\n            } else {\n                src_alpha = *src_alpha_scan++;\n            }\n            if (src_alpha == 255) {\n                *dest_scan++ = src_b;\n                *dest_scan++ = src_g;\n                *dest_scan++ = src_r;\n                dest_scan += dest_gap;\n                continue;\n            }\n            if (src_alpha == 0) {\n                dest_scan += DestBpp;\n                continue;\n            }\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha);\n            dest_scan ++;\n            dest_scan += dest_gap;\n        }\n    } else {\n        FX_ARGB argb = 0;\n        for (int col = 0; col < pixel_count; col ++) {\n            argb = pPalette[*src_scan];\n            int src_r = FXARGB_R(argb);\n            int src_g = FXARGB_G(argb);\n            int src_b = FXARGB_B(argb);\n            if (clip_scan && clip_scan[col] < 255) {\n                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, clip_scan[col]);\n                dest_scan ++;\n                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, clip_scan[col]);\n                dest_scan ++;\n                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, clip_scan[col]);\n                dest_scan ++;\n            } else {\n                *dest_scan++ = src_b;\n                *dest_scan++ = src_g;\n                *dest_scan++ = src_r;\n            }\n            if (DestBpp == 4) {\n                dest_scan++;\n            }\n            src_scan ++;\n        }\n    }\n}\ninline void _CompositeRow_1bppRgb2Rgb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,\n        FX_DWORD* pPalette, int pixel_count, int DestBpp, FX_LPCBYTE clip_scan)\n{\n    int reset_r, reset_g, reset_b;\n    int set_r, set_g, set_b;\n    reset_r = FXARGB_R(pPalette[0]);\n    reset_g = FXARGB_G(pPalette[0]);\n    reset_b = FXARGB_B(pPalette[0]);\n    set_r = FXARGB_R(pPalette[1]);\n    set_g = FXARGB_G(pPalette[1]);\n    set_b = FXARGB_B(pPalette[1]);\n    for (int col = 0; col < pixel_count; col ++) {\n        int src_r, src_g, src_b;\n        if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {\n            src_r = set_r;\n            src_g = set_g;\n            src_b = set_b;\n        } else {\n            src_r = reset_r;\n            src_g = reset_g;\n            src_b = reset_b;\n        }\n        if (clip_scan && clip_scan[col] < 255) {\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, clip_scan[col]);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, clip_scan[col]);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, clip_scan[col]);\n            dest_scan ++;\n        } else {\n            *dest_scan++ = src_b;\n            *dest_scan++ = src_g;\n            *dest_scan++ = src_r;\n        }\n        if (DestBpp == 4) {\n            dest_scan++;\n        }\n    }\n}\ninline void _CompositeRow_8bppRgb2Argb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width,\n        FX_DWORD* pPalette, FX_LPCBYTE clip_scan,\n        FX_LPCBYTE src_alpha_scan)\n{\n    if (src_alpha_scan) {\n        for (int col = 0; col < width; col ++) {\n            FX_ARGB argb = pPalette[*src_scan];\n            src_scan ++;\n            int src_r = FXARGB_R(argb);\n            int src_g = FXARGB_G(argb);\n            int src_b = FXARGB_B(argb);\n            FX_BYTE back_alpha = dest_scan[3];\n            if (back_alpha == 0) {\n                if (clip_scan) {\n                    int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;\n                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));\n                } else {\n                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(*src_alpha_scan, src_r, src_g, src_b));\n                }\n                dest_scan += 4;\n                src_alpha_scan ++;\n                continue;\n            }\n            FX_BYTE src_alpha;\n            if (clip_scan == NULL) {\n                src_alpha = *src_alpha_scan ++;\n            } else {\n                src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255;\n            }\n            if (src_alpha == 0) {\n                dest_scan += 4;\n                continue;\n            }\n            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n            dest_scan[3] = dest_alpha;\n            int alpha_ratio = src_alpha * 255 / dest_alpha;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);\n            dest_scan ++;\n            dest_scan ++;\n        }\n    } else\n        for (int col = 0; col < width; col ++) {\n            FX_ARGB argb = pPalette[*src_scan];\n            int src_r = FXARGB_R(argb);\n            int src_g = FXARGB_G(argb);\n            int src_b = FXARGB_B(argb);\n            if (clip_scan == NULL || clip_scan[col] == 255) {\n                *dest_scan++ = src_b;\n                *dest_scan++ = src_g;\n                *dest_scan++ = src_r;\n                *dest_scan++ = 255;\n                src_scan ++;\n                continue;\n            }\n            int src_alpha = clip_scan[col];\n            if (src_alpha == 0) {\n                dest_scan += 4;\n                src_scan ++;\n                continue;\n            }\n            int back_alpha = dest_scan[3];\n            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n            dest_scan[3] = dest_alpha;\n            int alpha_ratio = src_alpha * 255 / dest_alpha;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);\n            dest_scan ++;\n            dest_scan ++;\n            src_scan ++;\n        }\n}\nvoid _CompositeRow_8bppRgb2Rgba_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width,\n                                        FX_DWORD* pPalette, FX_LPCBYTE clip_scan,\n                                        FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan)\n{\n    if (src_alpha_scan) {\n        for (int col = 0; col < width; col ++) {\n            FX_ARGB argb = pPalette[*src_scan];\n            src_scan ++;\n            int src_r = FXARGB_R(argb);\n            int src_g = FXARGB_G(argb);\n            int src_b = FXARGB_B(argb);\n            FX_BYTE back_alpha = *dest_alpha_scan;\n            if (back_alpha == 0) {\n                if (clip_scan) {\n                    int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;\n                    *dest_alpha_scan ++ = src_alpha;\n                } else {\n                    *dest_alpha_scan ++ = *src_alpha_scan;\n                }\n                *dest_scan ++ = src_b;\n                *dest_scan ++ = src_g;\n                *dest_scan ++ = src_r;\n                src_alpha_scan ++;\n                continue;\n            }\n            FX_BYTE src_alpha;\n            if (clip_scan == NULL) {\n                src_alpha = *src_alpha_scan++;\n            } else {\n                src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255;\n            }\n            if (src_alpha == 0) {\n                dest_scan += 3;\n                dest_alpha_scan ++;\n                continue;\n            }\n            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n            *dest_alpha_scan ++ = dest_alpha;\n            int alpha_ratio = src_alpha * 255 / dest_alpha;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);\n            dest_scan ++;\n        }\n    } else\n        for (int col = 0; col < width; col ++) {\n            FX_ARGB argb = pPalette[*src_scan];\n            int src_r = FXARGB_R(argb);\n            int src_g = FXARGB_G(argb);\n            int src_b = FXARGB_B(argb);\n            if (clip_scan == NULL || clip_scan[col] == 255) {\n                *dest_scan++ = src_b;\n                *dest_scan++ = src_g;\n                *dest_scan++ = src_r;\n                *dest_alpha_scan++ = 255;\n                src_scan ++;\n                continue;\n            }\n            int src_alpha = clip_scan[col];\n            if (src_alpha == 0) {\n                dest_scan += 3;\n                dest_alpha_scan ++;\n                src_scan ++;\n                continue;\n            }\n            int back_alpha = *dest_alpha_scan;\n            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n            *dest_alpha_scan ++ = dest_alpha;\n            int alpha_ratio = src_alpha * 255 / dest_alpha;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);\n            dest_scan ++;\n            src_scan ++;\n        }\n}\ninline void _CompositeRow_1bppRgb2Argb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width,\n        FX_DWORD* pPalette, FX_LPCBYTE clip_scan)\n{\n    int reset_r, reset_g, reset_b;\n    int set_r, set_g, set_b;\n    reset_r = FXARGB_R(pPalette[0]);\n    reset_g = FXARGB_G(pPalette[0]);\n    reset_b = FXARGB_B(pPalette[0]);\n    set_r = FXARGB_R(pPalette[1]);\n    set_g = FXARGB_G(pPalette[1]);\n    set_b = FXARGB_B(pPalette[1]);\n    for (int col = 0; col < width; col ++) {\n        int src_r, src_g, src_b;\n        if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {\n            src_r = set_r;\n            src_g = set_g;\n            src_b = set_b;\n        } else {\n            src_r = reset_r;\n            src_g = reset_g;\n            src_b = reset_b;\n        }\n        if (clip_scan == NULL || clip_scan[col] == 255) {\n            *dest_scan++ = src_b;\n            *dest_scan++ = src_g;\n            *dest_scan++ = src_r;\n            *dest_scan++ = 255;\n            continue;\n        }\n        int src_alpha = clip_scan[col];\n        if (src_alpha == 0) {\n            dest_scan += 4;\n            continue;\n        }\n        int back_alpha = dest_scan[3];\n        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n        dest_scan[3] = dest_alpha;\n        int alpha_ratio = src_alpha * 255 / dest_alpha;\n        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);\n        dest_scan ++;\n        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);\n        dest_scan ++;\n        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);\n        dest_scan ++;\n        dest_scan ++;\n    }\n}\nvoid _CompositeRow_1bppRgb2Rgba_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width,\n                                        FX_DWORD* pPalette, FX_LPCBYTE clip_scan,\n                                        FX_LPBYTE dest_alpha_scan)\n{\n    int reset_r, reset_g, reset_b;\n    int set_r, set_g, set_b;\n    reset_r = FXARGB_R(pPalette[0]);\n    reset_g = FXARGB_G(pPalette[0]);\n    reset_b = FXARGB_B(pPalette[0]);\n    set_r = FXARGB_R(pPalette[1]);\n    set_g = FXARGB_G(pPalette[1]);\n    set_b = FXARGB_B(pPalette[1]);\n    for (int col = 0; col < width; col ++) {\n        int src_r, src_g, src_b;\n        if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {\n            src_r = set_r;\n            src_g = set_g;\n            src_b = set_b;\n        } else {\n            src_r = reset_r;\n            src_g = reset_g;\n            src_b = reset_b;\n        }\n        if (clip_scan == NULL || clip_scan[col] == 255) {\n            *dest_scan++ = src_b;\n            *dest_scan++ = src_g;\n            *dest_scan++ = src_r;\n            *dest_alpha_scan++ = 255;\n            continue;\n        }\n        int src_alpha = clip_scan[col];\n        if (src_alpha == 0) {\n            dest_scan += 3;\n            dest_alpha_scan ++;\n            continue;\n        }\n        int back_alpha = *dest_alpha_scan;\n        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n        *dest_alpha_scan ++ = dest_alpha;\n        int alpha_ratio = src_alpha * 255 / dest_alpha;\n        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);\n        dest_scan ++;\n        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);\n        dest_scan ++;\n        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);\n        dest_scan ++;\n    }\n}\nvoid _CompositeRow_ByteMask2Argb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,\n                                 int blend_type, FX_LPCBYTE clip_scan)\n{\n    for (int col = 0; col < pixel_count; col ++) {\n        int src_alpha;\n        if (clip_scan) {\n            src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;\n        } else {\n            src_alpha = mask_alpha * src_scan[col] / 255;\n        }\n        FX_BYTE back_alpha = dest_scan[3];\n        if (back_alpha == 0) {\n            FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));\n            dest_scan += 4;\n            continue;\n        }\n        if (src_alpha == 0) {\n            dest_scan += 4;\n            continue;\n        }\n        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n        dest_scan[3] = dest_alpha;\n        int alpha_ratio = src_alpha * 255 / dest_alpha;\n        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {\n            int blended_colors[3];\n            FX_BYTE src_scan[3];\n            src_scan[0] = src_b;\n            src_scan[1] = src_g;\n            src_scan[2] = src_r;\n            _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);\n        } else if (blend_type) {\n            int blended = _BLEND(blend_type, *dest_scan, src_b);\n            blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);\n            dest_scan ++;\n            blended = _BLEND(blend_type, *dest_scan, src_g);\n            blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);\n            dest_scan ++;\n            blended = _BLEND(blend_type, *dest_scan, src_r);\n            blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);\n        } else {\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);\n        }\n        dest_scan += 2;\n    }\n}\nvoid _CompositeRow_ByteMask2Rgba(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,\n                                 int blend_type, FX_LPCBYTE clip_scan,\n                                 FX_LPBYTE dest_alpha_scan)\n{\n    for (int col = 0; col < pixel_count; col ++) {\n        int src_alpha;\n        if (clip_scan) {\n            src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;\n        } else {\n            src_alpha = mask_alpha * src_scan[col] / 255;\n        }\n        FX_BYTE back_alpha = *dest_alpha_scan;\n        if (back_alpha == 0) {\n            *dest_scan ++ = src_b;\n            *dest_scan ++ = src_g;\n            *dest_scan ++ = src_r;\n            *dest_alpha_scan ++ = src_alpha;\n            continue;\n        }\n        if (src_alpha == 0) {\n            dest_scan += 3;\n            dest_alpha_scan ++;\n            continue;\n        }\n        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n        *dest_alpha_scan ++ = dest_alpha;\n        int alpha_ratio = src_alpha * 255 / dest_alpha;\n        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {\n            int blended_colors[3];\n            FX_BYTE src_scan[3];\n            src_scan[0] = src_b;\n            src_scan[1] = src_g;\n            src_scan[2] = src_r;\n            _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);\n            dest_scan ++;\n        } else if (blend_type) {\n            int blended = _BLEND(blend_type, *dest_scan, src_b);\n            blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);\n            dest_scan ++;\n            blended = _BLEND(blend_type, *dest_scan, src_g);\n            blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);\n            dest_scan ++;\n            blended = _BLEND(blend_type, *dest_scan, src_r);\n            blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);\n            dest_scan ++;\n        } else {\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);\n            dest_scan ++;\n        }\n    }\n}\nvoid _CompositeRow_ByteMask2Rgb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,\n                                int blend_type, int Bpp, FX_LPCBYTE clip_scan)\n{\n    for (int col = 0; col < pixel_count; col ++) {\n        int src_alpha;\n        if (clip_scan) {\n            src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;\n        } else {\n            src_alpha = mask_alpha * src_scan[col] / 255;\n        }\n        if (src_alpha == 0) {\n            dest_scan += Bpp;\n            continue;\n        }\n        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {\n            int blended_colors[3];\n            FX_BYTE src_scan[3];\n            src_scan[0] = src_b;\n            src_scan[1] = src_g;\n            src_scan[2] = src_r;\n            _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], src_alpha);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], src_alpha);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], src_alpha);\n        } else if (blend_type) {\n            int blended = _BLEND(blend_type, *dest_scan, src_b);\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);\n            dest_scan ++;\n            blended = _BLEND(blend_type, *dest_scan, src_g);\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);\n            dest_scan ++;\n            blended = _BLEND(blend_type, *dest_scan, src_r);\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);\n        } else {\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha);\n        }\n        dest_scan += Bpp - 2;\n    }\n}\nvoid _CompositeRow_ByteMask2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int pixel_count,\n                                 FX_LPCBYTE clip_scan)\n{\n    for (int col = 0; col < pixel_count; col ++) {\n        int src_alpha;\n        if (clip_scan) {\n            src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;\n        } else {\n            src_alpha = mask_alpha * src_scan[col] / 255;\n        }\n        FX_BYTE back_alpha = *dest_scan;\n        if (!back_alpha) {\n            *dest_scan = src_alpha;\n        } else if (src_alpha) {\n            *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n        }\n        dest_scan ++;\n    }\n}\nvoid _CompositeRow_ByteMask2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,\n                                 int pixel_count, FX_LPCBYTE clip_scan)\n{\n    for (int col = 0; col < pixel_count; col ++) {\n        int src_alpha;\n        if (clip_scan) {\n            src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;\n        } else {\n            src_alpha = mask_alpha * src_scan[col] / 255;\n        }\n        if (src_alpha) {\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, src_alpha);\n        }\n        dest_scan ++;\n    }\n}\nvoid _CompositeRow_ByteMask2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,\n                                  int pixel_count, FX_LPCBYTE clip_scan,\n                                  FX_LPBYTE dest_alpha_scan)\n{\n    for (int col = 0; col < pixel_count; col ++) {\n        int src_alpha;\n        if (clip_scan) {\n            src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;\n        } else {\n            src_alpha = mask_alpha * src_scan[col] / 255;\n        }\n        FX_BYTE back_alpha = *dest_alpha_scan;\n        if (back_alpha == 0) {\n            *dest_scan ++ = src_gray;\n            *dest_alpha_scan ++ = src_alpha;\n            continue;\n        }\n        if (src_alpha == 0) {\n            dest_scan ++;\n            dest_alpha_scan ++;\n            continue;\n        }\n        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n        *dest_alpha_scan++ = dest_alpha;\n        int alpha_ratio = src_alpha * 255 / dest_alpha;\n        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, alpha_ratio);\n        dest_scan ++;\n    }\n}\nvoid _CompositeRow_BitMask2Argb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,\n                                int src_left, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)\n{\n    if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {\n        FX_ARGB argb = FXARGB_MAKE(0xff, src_r, src_g, src_b);\n        for (int col = 0; col < pixel_count; col ++) {\n            if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {\n                FXARGB_SETDIB(dest_scan, argb);\n            }\n            dest_scan += 4;\n        }\n        return;\n    }\n    for (int col = 0; col < pixel_count; col ++) {\n        if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {\n            dest_scan += 4;\n            continue;\n        }\n        int src_alpha;\n        if (clip_scan) {\n            src_alpha = mask_alpha * clip_scan[col] / 255;\n        } else {\n            src_alpha = mask_alpha;\n        }\n        FX_BYTE back_alpha = dest_scan[3];\n        if (back_alpha == 0) {\n            FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));\n            dest_scan += 4;\n            continue;\n        }\n        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n        dest_scan[3] = dest_alpha;\n        int alpha_ratio = src_alpha * 255 / dest_alpha;\n        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {\n            int blended_colors[3];\n            FX_BYTE src_scan[3];\n            src_scan[0] = src_b;\n            src_scan[1] = src_g;\n            src_scan[2] = src_r;\n            _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);\n        } else if (blend_type) {\n            int blended = _BLEND(blend_type, *dest_scan, src_b);\n            blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);\n            dest_scan ++;\n            blended = _BLEND(blend_type, *dest_scan, src_g);\n            blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);\n            dest_scan ++;\n            blended = _BLEND(blend_type, *dest_scan, src_r);\n            blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);\n        } else {\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);\n        }\n        dest_scan += 2;\n    }\n}\nvoid _CompositeRow_BitMask2Rgba(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,\n                                int src_left, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,\n                                FX_LPBYTE dest_alpha_scan)\n{\n    if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {\n        for (int col = 0; col < pixel_count; col ++) {\n            if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {\n                dest_scan[0] = src_b;\n                dest_scan[1] = src_g;\n                dest_scan[2] = src_r;\n                *dest_alpha_scan = mask_alpha;\n            }\n            dest_scan += 3;\n            dest_alpha_scan ++;\n        }\n        return;\n    }\n    for (int col = 0; col < pixel_count; col ++) {\n        if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {\n            dest_scan += 3;\n            dest_alpha_scan ++;\n            continue;\n        }\n        int src_alpha;\n        if (clip_scan) {\n            src_alpha = mask_alpha * clip_scan[col] / 255;\n        } else {\n            src_alpha = mask_alpha;\n        }\n        FX_BYTE back_alpha = dest_scan[3];\n        if (back_alpha == 0) {\n            *dest_scan ++ = src_b;\n            *dest_scan ++ = src_g;\n            *dest_scan ++ = src_r;\n            *dest_alpha_scan ++ = mask_alpha;\n            continue;\n        }\n        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n        *dest_alpha_scan ++ = dest_alpha;\n        int alpha_ratio = src_alpha * 255 / dest_alpha;\n        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {\n            int blended_colors[3];\n            FX_BYTE src_scan[3];\n            src_scan[0] = src_b;\n            src_scan[1] = src_g;\n            src_scan[2] = src_r;\n            _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);\n            dest_scan ++;\n        } else if (blend_type) {\n            int blended = _BLEND(blend_type, *dest_scan, src_b);\n            blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);\n            dest_scan ++;\n            blended = _BLEND(blend_type, *dest_scan, src_g);\n            blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);\n            dest_scan ++;\n            blended = _BLEND(blend_type, *dest_scan, src_r);\n            blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);\n            dest_scan ++;\n        } else {\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);\n            dest_scan ++;\n        }\n    }\n}\nvoid _CompositeRow_BitMask2Rgb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,\n                               int src_left, int pixel_count, int blend_type, int Bpp, FX_LPCBYTE clip_scan)\n{\n    if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {\n        for (int col = 0; col < pixel_count; col ++) {\n            if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {\n                dest_scan[2] = src_r;\n                dest_scan[1] = src_g;\n                dest_scan[0] = src_b;\n            }\n            dest_scan += Bpp;\n        }\n        return;\n    }\n    for (int col = 0; col < pixel_count; col ++) {\n        if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {\n            dest_scan += Bpp;\n            continue;\n        }\n        int src_alpha;\n        if (clip_scan) {\n            src_alpha = mask_alpha * clip_scan[col] / 255;\n        } else {\n            src_alpha = mask_alpha;\n        }\n        if (src_alpha == 0) {\n            dest_scan += Bpp;\n            continue;\n        }\n        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {\n            int blended_colors[3];\n            FX_BYTE src_scan[3];\n            src_scan[0] = src_b;\n            src_scan[1] = src_g;\n            src_scan[2] = src_r;\n            _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], src_alpha);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], src_alpha);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], src_alpha);\n        } else if (blend_type) {\n            int blended = _BLEND(blend_type, *dest_scan, src_b);\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);\n            dest_scan++;\n            blended = _BLEND(blend_type, *dest_scan, src_g);\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);\n            dest_scan++;\n            blended = _BLEND(blend_type, *dest_scan, src_r);\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);\n        } else {\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha);\n            dest_scan ++;\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha);\n        }\n        dest_scan += Bpp - 2;\n    }\n}\nvoid _CompositeRow_BitMask2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_left,\n                                int pixel_count, FX_LPCBYTE clip_scan)\n{\n    for (int col = 0; col < pixel_count; col ++) {\n        if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {\n            dest_scan ++;\n            continue;\n        }\n        int src_alpha;\n        if (clip_scan) {\n            src_alpha = mask_alpha * clip_scan[col] / 255;\n        } else {\n            src_alpha = mask_alpha;\n        }\n        FX_BYTE back_alpha = *dest_scan;\n        if (!back_alpha) {\n            *dest_scan = src_alpha;\n        } else if (src_alpha) {\n            *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n        }\n        dest_scan ++;\n    }\n}\nvoid _CompositeRow_BitMask2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,\n                                int src_left, int pixel_count, FX_LPCBYTE clip_scan)\n{\n    for (int col = 0; col < pixel_count; col ++) {\n        if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {\n            dest_scan ++;\n            continue;\n        }\n        int src_alpha;\n        if (clip_scan) {\n            src_alpha = mask_alpha * clip_scan[col] / 255;\n        } else {\n            src_alpha = mask_alpha;\n        }\n        if (src_alpha) {\n            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, src_alpha);\n        }\n        dest_scan ++;\n    }\n}\nvoid _CompositeRow_BitMask2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,\n                                 int src_left, int pixel_count, FX_LPCBYTE clip_scan,\n                                 FX_LPBYTE dest_alpha_scan)\n{\n    for (int col = 0; col < pixel_count; col ++) {\n        if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {\n            dest_scan ++;\n            dest_alpha_scan ++;\n            continue;\n        }\n        int src_alpha;\n        if (clip_scan) {\n            src_alpha = mask_alpha * clip_scan[col] / 255;\n        } else {\n            src_alpha = mask_alpha;\n        }\n        FX_BYTE back_alpha = *dest_alpha_scan;\n        if (back_alpha == 0) {\n            *dest_scan ++ = src_gray;\n            *dest_alpha_scan ++ = src_alpha;\n            continue;\n        }\n        if (src_alpha == 0) {\n            dest_scan ++;\n            dest_alpha_scan ++;\n            continue;\n        }\n        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n        *dest_alpha_scan++ = dest_alpha;\n        int alpha_ratio = src_alpha * 255 / dest_alpha;\n        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, alpha_ratio);\n        dest_scan ++;\n    }\n}\nvoid _CompositeRow_Argb2Argb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)\n{\n    int blended_colors[3];\n    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;\n    for (int col = 0; col < pixel_count; col ++) {\n        FX_BYTE back_alpha = dest_scan[3];\n        if (back_alpha == 0) {\n            if (clip_scan) {\n                int src_alpha = clip_scan[col] * src_scan[3] / 255;\n                dest_scan[3] = src_alpha;\n                dest_scan[0] = src_scan[2];\n                dest_scan[1] = src_scan[1];\n                dest_scan[2] = src_scan[0];\n            } else {\n                FXARGB_RGBORDERCOPY(dest_scan, src_scan);\n            }\n            dest_scan += 4;\n            src_scan += 4;\n            continue;\n        }\n        FX_BYTE src_alpha;\n        if (clip_scan == NULL) {\n            src_alpha = src_scan[3];\n        } else {\n            src_alpha = clip_scan[col] * src_scan[3] / 255;\n        }\n        if (src_alpha == 0) {\n            dest_scan += 4;\n            src_scan += 4;\n            continue;\n        }\n        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n        dest_scan[3] = dest_alpha;\n        int alpha_ratio = src_alpha * 255 / dest_alpha;\n        if (bNonseparableBlend) {\n            FX_BYTE dest_scan_o[3];\n            dest_scan_o[0] = dest_scan[2];\n            dest_scan_o[1] = dest_scan[1];\n            dest_scan_o[2] = dest_scan[0];\n            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);\n        }\n        for (int color = 0; color < 3; color ++) {\n            int index = 2 - color;\n            if (blend_type) {\n                int blended = bNonseparableBlend ? blended_colors[color] :\n                              _BLEND(blend_type, dest_scan[index], *src_scan);\n                blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);\n                dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], blended, alpha_ratio);\n            } else {\n                dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], *src_scan, alpha_ratio);\n            }\n            src_scan ++;\n        }\n        dest_scan += 4;\n        src_scan++;\n    }\n}\nvoid _CompositeRow_Rgb2Argb_Blend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp)\n{\n    int blended_colors[3];\n    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;\n    int src_gap = src_Bpp - 3;\n    for (int col = 0; col < width; col ++) {\n        FX_BYTE back_alpha = dest_scan[3];\n        if (back_alpha == 0) {\n            if (src_Bpp == 4) {\n                FXARGB_SETRGBORDERDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));\n            } else {\n                FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));\n            }\n            dest_scan += 4;\n            src_scan += src_Bpp;\n            continue;\n        }\n        dest_scan[3] = 0xff;\n        if (bNonseparableBlend)\t{\n            FX_BYTE dest_scan_o[3];\n            dest_scan_o[0] = dest_scan[2];\n            dest_scan_o[1] = dest_scan[1];\n            dest_scan_o[2] = dest_scan[0];\n            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);\n        }\n        for (int color = 0; color < 3; color ++) {\n            int index = 2 - color;\n            int src_color = FX_GAMMA(*src_scan);\n            int blended = bNonseparableBlend ? blended_colors[color] :\n                          _BLEND(blend_type, dest_scan[index], src_color);\n            dest_scan[index] = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);\n            src_scan ++;\n        }\n        dest_scan += 4;\n        src_scan += src_gap;\n    }\n}\ninline void _CompositeRow_Argb2Rgb_Blend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, FX_LPCBYTE clip_scan)\n{\n    int blended_colors[3];\n    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;\n    for (int col = 0; col < width; col ++) {\n        FX_BYTE src_alpha;\n        if (clip_scan) {\n            src_alpha = src_scan[3] * (*clip_scan++) / 255;\n        } else {\n            src_alpha = src_scan[3];\n        }\n        if (src_alpha == 0) {\n            dest_scan += dest_Bpp;\n            src_scan += 4;\n            continue;\n        }\n        if (bNonseparableBlend) {\n            FX_BYTE dest_scan_o[3];\n            dest_scan_o[0] = dest_scan[2];\n            dest_scan_o[1] = dest_scan[1];\n            dest_scan_o[2] = dest_scan[0];\n            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);\n        }\n        for (int color = 0; color < 3; color ++) {\n            int index = 2 - color;\n            int back_color = FX_GAMMA(dest_scan[index]);\n            int blended = bNonseparableBlend ? blended_colors[color] :\n                          _BLEND(blend_type, back_color, *src_scan);\n            dest_scan[index] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));\n            src_scan ++;\n        }\n        dest_scan += dest_Bpp;\n        src_scan ++;\n    }\n}\ninline void _CompositeRow_Rgb2Argb_NoBlend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp)\n{\n    int src_gap = src_Bpp - 3;\n    for (int col = 0; col < width; col ++) {\n        if (src_Bpp == 4) {\n            FXARGB_SETRGBORDERDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));\n        } else {\n            FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));\n        }\n        dest_scan += 4;\n        src_scan += src_Bpp;\n    }\n}\ninline void _CompositeRow_Rgb2Rgb_Blend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp)\n{\n    int blended_colors[3];\n    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;\n    int src_gap = src_Bpp - 3;\n    for (int col = 0; col < width; col ++) {\n        if (bNonseparableBlend) {\n            FX_BYTE dest_scan_o[3];\n            dest_scan_o[0] = dest_scan[2];\n            dest_scan_o[1] = dest_scan[1];\n            dest_scan_o[2] = dest_scan[0];\n            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);\n        }\n        for (int color = 0; color < 3; color ++) {\n            int index = 2 - color;\n            int back_color = FX_GAMMA(dest_scan[index]);\n            int src_color = FX_GAMMA(*src_scan);\n            int blended = bNonseparableBlend ? blended_colors[color] :\n                          _BLEND(blend_type, back_color, src_color);\n            dest_scan[index] = FX_GAMMA_INVERSE(blended);\n            src_scan ++;\n        }\n        dest_scan += dest_Bpp;\n        src_scan += src_gap;\n    }\n}\ninline void _CompositeRow_Argb2Rgb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, FX_LPCBYTE clip_scan)\n{\n    for (int col = 0; col < width; col ++) {\n        FX_BYTE src_alpha;\n        if (clip_scan) {\n            src_alpha = src_scan[3] * (*clip_scan++) / 255;\n        } else {\n            src_alpha = src_scan[3];\n        }\n        if (src_alpha == 255) {\n            dest_scan[2] = FX_GAMMA_INVERSE(*src_scan++);\n            dest_scan[1] = FX_GAMMA_INVERSE(*src_scan++);\n            dest_scan[0] = FX_GAMMA_INVERSE(*src_scan++);\n            dest_scan += dest_Bpp;\n            src_scan ++;\n            continue;\n        }\n        if (src_alpha == 0) {\n            dest_scan += dest_Bpp;\n            src_scan += 4;\n            continue;\n        }\n        for (int color = 0; color < 3; color ++) {\n            int index = 2 - color;\n            dest_scan[index] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[index]), *src_scan, src_alpha));\n            src_scan ++;\n        }\n        dest_scan += dest_Bpp;\n        src_scan ++;\n    }\n}\ninline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp)\n{\n    for (int col = 0; col < width; col ++) {\n        dest_scan[2] = src_scan[0];\n        dest_scan[1] = src_scan[1];\n        dest_scan[0] = src_scan[2];\n        dest_scan += dest_Bpp;\n        src_scan += src_Bpp;\n    }\n}\ninline void _CompositeRow_Rgb2Argb_Blend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp, FX_LPCBYTE clip_scan)\n{\n    int blended_colors[3];\n    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;\n    int src_gap = src_Bpp - 3;\n    for (int col = 0; col < width; col ++) {\n        int src_alpha = *clip_scan ++;\n        FX_BYTE back_alpha = dest_scan[3];\n        if (back_alpha == 0) {\n            dest_scan[2] = FX_GAMMA(*src_scan++);\n            dest_scan[1] = FX_GAMMA(*src_scan++);\n            dest_scan[0] = FX_GAMMA(*src_scan++);\n            src_scan += src_gap;\n            dest_scan += 4;\n            continue;\n        }\n        if (src_alpha == 0) {\n            dest_scan += 4;\n            src_scan += src_Bpp;\n            continue;\n        }\n        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n        dest_scan[3] = dest_alpha;\n        int alpha_ratio = src_alpha * 255 / dest_alpha;\n        if (bNonseparableBlend) {\n            FX_BYTE dest_scan_o[3];\n            dest_scan_o[0] = dest_scan[2];\n            dest_scan_o[1] = dest_scan[1];\n            dest_scan_o[2] = dest_scan[0];\n            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);\n        }\n        for (int color = 0; color < 3; color ++) {\n            int index = 2 - color;\n            int src_color = FX_GAMMA(*src_scan);\n            int blended = bNonseparableBlend ? blended_colors[color] :\n                          _BLEND(blend_type, dest_scan[index], src_color);\n            blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);\n            dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], blended, alpha_ratio);\n            src_scan ++;\n        }\n        dest_scan += 4;\n        src_scan += src_gap;\n    }\n}\ninline void _CompositeRow_Rgb2Rgb_Blend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)\n{\n    int blended_colors[3];\n    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;\n    int src_gap = src_Bpp - 3;\n    for (int col = 0; col < width; col ++) {\n        FX_BYTE src_alpha = *clip_scan ++;\n        if (src_alpha == 0) {\n            dest_scan += dest_Bpp;\n            src_scan += src_Bpp;\n            continue;\n        }\n        if (bNonseparableBlend) {\n            FX_BYTE dest_scan_o[3];\n            dest_scan_o[0] = dest_scan[2];\n            dest_scan_o[1] = dest_scan[1];\n            dest_scan_o[2] = dest_scan[0];\n            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);\n        }\n        for (int color = 0; color < 3; color ++) {\n            int index = 2 - color;\n            int src_color = FX_GAMMA(*src_scan);\n            int back_color = FX_GAMMA(dest_scan[index]);\n            int blended = bNonseparableBlend ? blended_colors[color] :\n                          _BLEND(blend_type, back_color, src_color);\n            dest_scan[index] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));\n            src_scan ++;\n        }\n        dest_scan += dest_Bpp;\n        src_scan += src_gap;\n    }\n}\ninline void _CompositeRow_Rgb2Argb_NoBlend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp, FX_LPCBYTE clip_scan)\n{\n    int src_gap = src_Bpp - 3;\n    for (int col = 0; col < width; col ++) {\n        int src_alpha = clip_scan[col];\n        if (src_alpha == 255) {\n            dest_scan[2] = FX_GAMMA(*src_scan++);\n            dest_scan[1] = FX_GAMMA(*src_scan++);\n            dest_scan[0] = FX_GAMMA(*src_scan++);\n            dest_scan[3] = 255;\n            dest_scan += 4;\n            src_scan  += src_gap;\n            continue;\n        }\n        if (src_alpha == 0) {\n            dest_scan += 4;\n            src_scan += src_Bpp;\n            continue;\n        }\n        int back_alpha = dest_scan[3];\n        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n        dest_scan[3] = dest_alpha;\n        int alpha_ratio = src_alpha * 255 / dest_alpha;\n        for (int color = 0; color < 3; color ++) {\n            int index = 2 - color;\n            dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], FX_GAMMA(*src_scan), alpha_ratio);\n            src_scan ++;\n        }\n        dest_scan += 4;\n        src_scan += src_gap;\n    }\n}\ninline void _CompositeRow_Rgb2Rgb_NoBlend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)\n{\n    for (int col = 0; col < width; col ++) {\n        int src_alpha = clip_scan[col];\n        if (src_alpha == 255) {\n            dest_scan[2] = src_scan[0];\n            dest_scan[1] = src_scan[1];\n            dest_scan[0] = src_scan[2];\n        } else if (src_alpha) {\n            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), FX_GAMMA(*src_scan), src_alpha));\n            src_scan ++;\n            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), FX_GAMMA(*src_scan), src_alpha));\n            src_scan ++;\n            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), FX_GAMMA(*src_scan), src_alpha));\n            dest_scan += dest_Bpp;\n            src_scan += src_Bpp - 2;\n            continue;\n        }\n        dest_scan += dest_Bpp;\n        src_scan += src_Bpp;\n    }\n}\ninline void _CompositeRow_8bppRgb2Rgb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_ARGB* pPalette, int pixel_count,\n        int DestBpp, FX_LPCBYTE clip_scan)\n{\n    for (int col = 0; col < pixel_count; col ++) {\n        FX_ARGB argb = pPalette ? pPalette[*src_scan] : (*src_scan) * 0x010101;\n        int src_r = FXARGB_R(argb);\n        int src_g = FXARGB_G(argb);\n        int src_b = FXARGB_B(argb);\n        if (clip_scan && clip_scan[col] < 255) {\n            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, clip_scan[col]);\n            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, clip_scan[col]);\n            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, clip_scan[col]);\n        } else {\n            dest_scan[2] = src_b;\n            dest_scan[1] = src_g;\n            dest_scan[0] = src_r;\n        }\n        dest_scan += DestBpp;\n        src_scan ++;\n    }\n}\ninline void _CompositeRow_1bppRgb2Rgb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,\n        FX_ARGB* pPalette, int pixel_count, int DestBpp, FX_LPCBYTE clip_scan)\n{\n    int reset_r, reset_g, reset_b;\n    int set_r, set_g, set_b;\n    if (pPalette) {\n        reset_r = FXARGB_R(pPalette[0]);\n        reset_g = FXARGB_G(pPalette[0]);\n        reset_b = FXARGB_B(pPalette[0]);\n        set_r = FXARGB_R(pPalette[1]);\n        set_g = FXARGB_G(pPalette[1]);\n        set_b = FXARGB_B(pPalette[1]);\n    } else {\n        reset_r = reset_g = reset_b = 0;\n        set_r = set_g = set_b = 255;\n    }\n    for (int col = 0; col < pixel_count; col ++) {\n        int src_r, src_g, src_b;\n        if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {\n            src_r = set_r;\n            src_g = set_g;\n            src_b = set_b;\n        } else {\n            src_r = reset_r;\n            src_g = reset_g;\n            src_b = reset_b;\n        }\n        if (clip_scan && clip_scan[col] < 255) {\n            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, clip_scan[col]);\n            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, clip_scan[col]);\n            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, clip_scan[col]);\n        } else {\n            dest_scan[2] = src_b;\n            dest_scan[1] = src_g;\n            dest_scan[0] = src_r;\n        }\n        dest_scan += DestBpp;\n    }\n}\ninline void _CompositeRow_8bppRgb2Argb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width,\n        FX_ARGB* pPalette, FX_LPCBYTE clip_scan)\n{\n    for (int col = 0; col < width; col ++) {\n        int src_r, src_g, src_b;\n        if (pPalette) {\n            FX_ARGB argb = pPalette[*src_scan];\n            src_r = FXARGB_R(argb);\n            src_g = FXARGB_G(argb);\n            src_b = FXARGB_B(argb);\n        } else {\n            src_r = src_g = src_b = *src_scan;\n        }\n        if (clip_scan == NULL || clip_scan[col] == 255) {\n            dest_scan[2] = FX_GAMMA(src_b);\n            dest_scan[1] = FX_GAMMA(src_g);\n            dest_scan[0] = FX_GAMMA(src_r);\n            dest_scan[3] = 255;\n            src_scan ++;\n            dest_scan += 4;\n            continue;\n        }\n        int src_alpha = clip_scan[col];\n        if (src_alpha == 0) {\n            dest_scan += 4;\n            src_scan ++;\n            continue;\n        }\n        int back_alpha = dest_scan[3];\n        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n        dest_scan[3] = dest_alpha;\n        int alpha_ratio = src_alpha * 255 / dest_alpha;\n        dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], FX_GAMMA(src_b), alpha_ratio);\n        dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], FX_GAMMA(src_g), alpha_ratio);\n        dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], FX_GAMMA(src_r), alpha_ratio);\n        dest_scan += 4;\n        src_scan ++;\n    }\n}\ninline void _CompositeRow_1bppRgb2Argb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width,\n        FX_ARGB* pPalette, FX_LPCBYTE clip_scan)\n{\n    int reset_r, reset_g, reset_b;\n    int set_r, set_g, set_b;\n    if (pPalette) {\n        reset_r = FXARGB_R(pPalette[0]);\n        reset_g = FXARGB_G(pPalette[0]);\n        reset_b = FXARGB_B(pPalette[0]);\n        set_r = FXARGB_R(pPalette[1]);\n        set_g = FXARGB_G(pPalette[1]);\n        set_b = FXARGB_B(pPalette[1]);\n    } else {\n        reset_r = reset_g = reset_b = 0;\n        set_r = set_g = set_b = 255;\n    }\n    for (int col = 0; col < width; col ++) {\n        int src_r, src_g, src_b;\n        if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {\n            src_r = set_r;\n            src_g = set_g;\n            src_b = set_b;\n        } else {\n            src_r = reset_r;\n            src_g = reset_g;\n            src_b = reset_b;\n        }\n        if (clip_scan == NULL || clip_scan[col] == 255) {\n            dest_scan[2] = FX_GAMMA(src_b);\n            dest_scan[1] = FX_GAMMA(src_g);\n            dest_scan[0] = FX_GAMMA(src_r);\n            dest_scan[3] = 255;\n            dest_scan += 4;\n            continue;\n        }\n        int src_alpha = clip_scan[col];\n        if (src_alpha == 0) {\n            dest_scan += 4;\n            continue;\n        }\n        int back_alpha = dest_scan[3];\n        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n        dest_scan[3] = dest_alpha;\n        int alpha_ratio = src_alpha * 255 / dest_alpha;\n        dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], FX_GAMMA(src_b), alpha_ratio);\n        dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], FX_GAMMA(src_g), alpha_ratio);\n        dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], FX_GAMMA(src_r), alpha_ratio);\n        dest_scan += 4;\n    }\n}\nvoid _CompositeRow_ByteMask2Argb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,\n        int blend_type, FX_LPCBYTE clip_scan)\n{\n    for (int col = 0; col < pixel_count; col ++) {\n        int src_alpha;\n        if (clip_scan) {\n            src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;\n        } else {\n            src_alpha = mask_alpha * src_scan[col] / 255;\n        }\n        FX_BYTE back_alpha = dest_scan[3];\n        if (back_alpha == 0) {\n            FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));\n            dest_scan += 4;\n            continue;\n        }\n        if (src_alpha == 0) {\n            dest_scan += 4;\n            continue;\n        }\n        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n        dest_scan[3] = dest_alpha;\n        int alpha_ratio = src_alpha * 255 / dest_alpha;\n        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {\n            int blended_colors[3];\n            FX_BYTE src_scan[3];\n            FX_BYTE dest_scan_o[3];\n            src_scan[0] = src_b;\n            src_scan[1] = src_g;\n            src_scan[2] = src_r;\n            dest_scan_o[0] = dest_scan[2];\n            dest_scan_o[1] = dest_scan[1];\n            dest_scan_o[2] = dest_scan[0];\n            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);\n            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], alpha_ratio);\n            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], alpha_ratio);\n            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], alpha_ratio);\n        } else if (blend_type) {\n            int blended = _BLEND(blend_type, dest_scan[2], src_b);\n            blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);\n            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, alpha_ratio);\n            blended = _BLEND(blend_type, dest_scan[1], src_g);\n            blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);\n            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, alpha_ratio);\n            blended = _BLEND(blend_type, dest_scan[0], src_r);\n            blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);\n            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, alpha_ratio);\n        } else {\n            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, alpha_ratio);\n            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, alpha_ratio);\n            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, alpha_ratio);\n        }\n        dest_scan += 4;\n    }\n}\nvoid _CompositeRow_ByteMask2Rgb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,\n        int blend_type, int Bpp, FX_LPCBYTE clip_scan)\n{\n    for (int col = 0; col < pixel_count; col ++) {\n        int src_alpha;\n        if (clip_scan) {\n            src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;\n        } else {\n            src_alpha = mask_alpha * src_scan[col] / 255;\n        }\n        if (src_alpha == 0) {\n            dest_scan += Bpp;\n            continue;\n        }\n        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {\n            int blended_colors[3];\n            FX_BYTE src_scan[3];\n            FX_BYTE dest_scan_o[3];\n            src_scan[0] = src_b;\n            src_scan[1] = src_g;\n            src_scan[2] = src_r;\n            dest_scan_o[0] = dest_scan[2];\n            dest_scan_o[1] = dest_scan[1];\n            dest_scan_o[2] = dest_scan[0];\n            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);\n            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], src_alpha);\n            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], src_alpha);\n            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], src_alpha);\n        } else if (blend_type) {\n            int blended = _BLEND(blend_type, dest_scan[2], src_b);\n            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, src_alpha);\n            blended = _BLEND(blend_type, dest_scan[1], src_g);\n            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, src_alpha);\n            blended = _BLEND(blend_type, dest_scan[0], src_r);\n            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, src_alpha);\n        } else {\n            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, src_alpha);\n            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, src_alpha);\n            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, src_alpha);\n        }\n        dest_scan += Bpp;\n    }\n}\nvoid _CompositeRow_BitMask2Argb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,\n        int src_left, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)\n{\n    if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {\n        FX_ARGB argb = FXARGB_MAKE(0xff, src_r, src_g, src_b);\n        for (int col = 0; col < pixel_count; col ++) {\n            if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {\n                FXARGB_SETRGBORDERDIB(dest_scan, argb);\n            }\n            dest_scan += 4;\n        }\n        return;\n    }\n    for (int col = 0; col < pixel_count; col ++) {\n        if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {\n            dest_scan += 4;\n            continue;\n        }\n        int src_alpha;\n        if (clip_scan) {\n            src_alpha = mask_alpha * clip_scan[col] / 255;\n        } else {\n            src_alpha = mask_alpha;\n        }\n        FX_BYTE back_alpha = dest_scan[3];\n        if (back_alpha == 0) {\n            FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));\n            dest_scan += 4;\n            continue;\n        }\n        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n        dest_scan[3] = dest_alpha;\n        int alpha_ratio = src_alpha * 255 / dest_alpha;\n        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {\n            int blended_colors[3];\n            FX_BYTE src_scan[3];\n            FX_BYTE dest_scan_o[3];\n            src_scan[0] = src_b;\n            src_scan[1] = src_g;\n            src_scan[2] = src_r;\n            dest_scan_o[0] = dest_scan[2];\n            dest_scan_o[1] = dest_scan[1];\n            dest_scan_o[2] = dest_scan[0];\n            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);\n            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], alpha_ratio);\n            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], alpha_ratio);\n            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], alpha_ratio);\n        } else if (blend_type) {\n            int blended = _BLEND(blend_type, dest_scan[2], src_b);\n            blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);\n            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, alpha_ratio);\n            blended = _BLEND(blend_type, dest_scan[1], src_g);\n            blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);\n            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, alpha_ratio);\n            blended = _BLEND(blend_type, dest_scan[0], src_r);\n            blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);\n            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, alpha_ratio);\n        } else {\n            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, alpha_ratio);\n            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, alpha_ratio);\n            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, alpha_ratio);\n        }\n        dest_scan += 4;\n    }\n}\nvoid _CompositeRow_BitMask2Rgb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,\n        int src_left, int pixel_count, int blend_type, int Bpp, FX_LPCBYTE clip_scan)\n{\n    if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {\n        for (int col = 0; col < pixel_count; col ++) {\n            if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {\n                dest_scan[2] = src_b;\n                dest_scan[1] = src_g;\n                dest_scan[0] = src_r;\n            }\n            dest_scan += Bpp;\n        }\n        return;\n    }\n    for (int col = 0; col < pixel_count; col ++) {\n        if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {\n            dest_scan += Bpp;\n            continue;\n        }\n        int src_alpha;\n        if (clip_scan) {\n            src_alpha = mask_alpha * clip_scan[col] / 255;\n        } else {\n            src_alpha = mask_alpha;\n        }\n        if (src_alpha == 0) {\n            dest_scan += Bpp;\n            continue;\n        }\n        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {\n            int blended_colors[3];\n            FX_BYTE src_scan[3];\n            FX_BYTE dest_scan_o[3];\n            src_scan[0] = src_b;\n            src_scan[1] = src_g;\n            src_scan[2] = src_r;\n            dest_scan_o[0] = dest_scan[2];\n            dest_scan_o[1] = dest_scan[1];\n            dest_scan_o[2] = dest_scan[0];\n            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);\n            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], src_alpha);\n            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], src_alpha);\n            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], src_alpha);\n        } else if (blend_type) {\n            int back_color = FX_GAMMA(dest_scan[2]);\n            int blended = _BLEND(blend_type, back_color, src_b);\n            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));\n            back_color = FX_GAMMA(dest_scan[1]);\n            blended = _BLEND(blend_type, back_color, src_g);\n            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));\n            back_color = FX_GAMMA(dest_scan[0]);\n            blended = _BLEND(blend_type, back_color, src_r);\n            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));\n        } else {\n            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), src_b, src_alpha));\n            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), src_g, src_alpha));\n            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), src_r, src_alpha));\n        }\n        dest_scan += Bpp;\n    }\n}\ninline FX_BOOL _ScanlineCompositor_InitSourceMask(FXDIB_Format dest_format, int alpha_flag, FX_DWORD mask_color, int& mask_alpha,\n        int& mask_red, int& mask_green, int& mask_blue, int& mask_black,\n        void* icc_module, void* pIccTransform)\n{\n    ICodec_IccModule* pIccModule = (ICodec_IccModule*)icc_module;\n    if (alpha_flag >> 8) {\n        mask_alpha = alpha_flag & 0xff;\n        mask_red = FXSYS_GetCValue(mask_color);\n        mask_green = FXSYS_GetMValue(mask_color);\n        mask_blue = FXSYS_GetYValue(mask_color);\n        mask_black = FXSYS_GetKValue(mask_color);\n    } else {\n        mask_alpha = FXARGB_A(mask_color);\n        mask_red = FXARGB_R(mask_color);\n        mask_green = FXARGB_G(mask_color);\n        mask_blue = FXARGB_B(mask_color);\n    }\n    if (dest_format == FXDIB_8bppMask) {\n        return TRUE;\n    }\n    if ((dest_format & 0xff) == 8) {\n        if (pIccTransform) {\n            mask_color = (alpha_flag >> 8) ? FXCMYK_TODIB(mask_color) : FXARGB_TODIB(mask_color);\n            FX_LPBYTE gray_p = (FX_LPBYTE)&mask_color;\n            pIccModule->TranslateScanline(pIccTransform, gray_p, gray_p, 1);\n            mask_red = dest_format & 0x0400 ? FX_CCOLOR(gray_p[0]) : gray_p[0];\n        } else {\n            if (alpha_flag >> 8) {\n                FX_BYTE r, g, b;\n                AdobeCMYK_to_sRGB1(mask_red, mask_green, mask_blue, mask_black,\n                                   r, g, b);\n                mask_red = FXRGB2GRAY(r, g, b);\n            } else {\n                mask_red = FXRGB2GRAY(mask_red, mask_green, mask_blue);\n            }\n            if (dest_format & 0x0400) {\n                mask_red = FX_CCOLOR(mask_red);\n            }\n        }\n    } else {\n        FX_LPBYTE mask_color_p = (FX_LPBYTE)&mask_color;\n        mask_color = (alpha_flag >> 8) ? FXCMYK_TODIB(mask_color) : FXARGB_TODIB(mask_color);\n        if (pIccTransform) {\n            pIccModule->TranslateScanline(pIccTransform, mask_color_p, mask_color_p, 1);\n            mask_red = mask_color_p[2];\n            mask_green = mask_color_p[1];\n            mask_blue = mask_color_p[0];\n        } else if (alpha_flag >> 8) {\n            AdobeCMYK_to_sRGB1(mask_color_p[0], mask_color_p[1], mask_color_p[2], mask_color_p[3],\n                               mask_color_p[2], mask_color_p[1], mask_color_p[0]);\n            mask_red = mask_color_p[2];\n            mask_green = mask_color_p[1];\n            mask_blue = mask_color_p[0];\n        }\n    }\n    return TRUE;\n}\ninline void _ScanlineCompositor_InitSourcePalette(FXDIB_Format src_format, FXDIB_Format dest_format,\n        FX_DWORD*& pDestPalette, FX_DWORD* pSrcPalette,\n        void* icc_module, void* pIccTransform)\n{\n    ICodec_IccModule* pIccModule = (ICodec_IccModule*)icc_module;\n    FX_BOOL isSrcCmyk = src_format & 0x0400 ? TRUE : FALSE;\n    FX_BOOL isDstCmyk = dest_format & 0x0400 ? TRUE : FALSE;\n    pDestPalette = NULL;\n    if (pIccTransform) {\n        if (pSrcPalette) {\n            if ((dest_format & 0xff) == 8) {\n                int pal_count = 1 << (src_format & 0xff);\n                FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);\n                if (!gray_pal) {\n                    return;\n                }\n                pDestPalette = (FX_DWORD*)gray_pal;\n                for (int i = 0; i < pal_count; i ++) {\n                    FX_DWORD color = isSrcCmyk ? FXCMYK_TODIB(pSrcPalette[i]) : FXARGB_TODIB(pSrcPalette[i]);\n                    pIccModule->TranslateScanline(pIccTransform, gray_pal, (FX_LPCBYTE)&color, 1);\n                    gray_pal ++;\n                }\n            } else {\n                int palsize = 1 << (src_format & 0xff);\n                pDestPalette = FX_Alloc(FX_DWORD, palsize);\n                if (!pDestPalette) {\n                    return;\n                }\n                for (int i = 0; i < palsize; i ++) {\n                    FX_DWORD color = isSrcCmyk ? FXCMYK_TODIB(pSrcPalette[i]) : FXARGB_TODIB(pSrcPalette[i]);\n                    pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&color, (FX_LPCBYTE)&color, 1);\n                    pDestPalette[i] = isDstCmyk ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);\n                }\n            }\n        } else {\n            int pal_count = 1 << (src_format & 0xff);\n            FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);\n            if (!gray_pal) {\n                return;\n            }\n            if (pal_count == 2) {\n                gray_pal[0] = 0;\n                gray_pal[1] = 255;\n            } else {\n                for (int i = 0; i < pal_count; i++) {\n                    gray_pal[i] = i;\n                }\n            }\n            if ((dest_format & 0xff) == 8) {\n                pIccModule->TranslateScanline(pIccTransform, gray_pal, gray_pal, pal_count);\n                pDestPalette = (FX_DWORD*)gray_pal;\n            } else {\n                pDestPalette = FX_Alloc(FX_DWORD, pal_count);\n                if (!pDestPalette) {\n                    FX_Free(gray_pal);\n                    return;\n                }\n                for (int i = 0; i < pal_count; i ++) {\n                    pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&pDestPalette[i], &gray_pal[i], 1);\n                    pDestPalette[i] = isDstCmyk ? FXCMYK_TODIB(pDestPalette[i]) : FXARGB_TODIB(pDestPalette[i]);\n                }\n                FX_Free(gray_pal);\n            }\n        }\n    } else {\n        if (pSrcPalette) {\n            if ((dest_format & 0xff) == 8) {\n                int pal_count = 1 << (src_format & 0xff);\n                FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);\n                if (!gray_pal) {\n                    return;\n                }\n                pDestPalette = (FX_DWORD*)gray_pal;\n                if (isSrcCmyk) {\n                    for (int i = 0; i < pal_count; i ++) {\n                        FX_CMYK cmyk = pSrcPalette[i];\n                        FX_BYTE r, g, b;\n                        AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),\n                                           r, g, b);\n                        *gray_pal ++ = FXRGB2GRAY(r, g, b);\n                    }\n                } else\n                    for (int i = 0; i < pal_count; i ++) {\n                        FX_ARGB argb = pSrcPalette[i];\n                        *gray_pal ++ = FXRGB2GRAY(FXARGB_R(argb), FXARGB_G(argb), FXARGB_B(argb));\n                    }\n            } else {\n                int palsize = 1 << (src_format & 0xff);\n                pDestPalette = FX_Alloc(FX_DWORD, palsize);\n                if (!pDestPalette) {\n                    return;\n                }\n                if (isDstCmyk == isSrcCmyk) {\n                    FXSYS_memcpy32(pDestPalette, pSrcPalette, palsize * sizeof(FX_DWORD));\n                } else {\n                    for (int i = 0; i < palsize; i ++) {\n                        FX_CMYK cmyk = pSrcPalette[i];\n                        FX_BYTE r, g, b;\n                        AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),\n                                           r, g, b);\n                        pDestPalette[i] = FXARGB_MAKE(0xff, r, g, b);\n                    }\n                }\n            }\n        } else {\n            if ((dest_format & 0xff) == 8) {\n                int pal_count = 1 << (src_format & 0xff);\n                FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);\n                if (!gray_pal) {\n                    return;\n                }\n                if (pal_count == 2) {\n                    gray_pal[0] = 0;\n                    gray_pal[1] = 255;\n                } else {\n                    for (int i = 0; i < pal_count; i++) {\n                        gray_pal[i] = i;\n                    }\n                }\n                pDestPalette = (FX_DWORD*)gray_pal;\n            } else {\n                int palsize = 1 << (src_format & 0xff);\n                pDestPalette = FX_Alloc(FX_DWORD, palsize);\n                if (!pDestPalette) {\n                    return;\n                }\n                if (palsize == 2) {\n                    pDestPalette[0] = isSrcCmyk ? 255 : 0xff000000;\n                    pDestPalette[1] = isSrcCmyk ? 0 : 0xffffffff;\n                } else {\n                    for (int i = 0; i < palsize; i++) {\n                        pDestPalette[i] = isSrcCmyk ? FX_CCOLOR(i) : (i * 0x10101);\n                    }\n                }\n                if (isSrcCmyk != isDstCmyk) {\n                    for (int i = 0; i < palsize; i ++) {\n                        FX_CMYK cmyk = pDestPalette[i];\n                        FX_BYTE r, g, b;\n                        AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),\n                                           r, g, b);\n                        pDestPalette[i] = FXARGB_MAKE(0xff, r, g, b);\n                    }\n                }\n            }\n        }\n    }\n}\nCFX_ScanlineCompositor::CFX_ScanlineCompositor()\n{\n    m_pSrcPalette = NULL;\n    m_pCacheScanline = NULL;\n    m_CacheSize = 0;\n    m_bRgbByteOrder = FALSE;\n    m_BlendType = FXDIB_BLEND_NORMAL;\n}\nCFX_ScanlineCompositor::~CFX_ScanlineCompositor()\n{\n    if (m_pSrcPalette) {\n        FX_Free(m_pSrcPalette);\n    }\n    if (m_pCacheScanline) {\n        FX_Free(m_pCacheScanline);\n    }\n}\nFX_BOOL CFX_ScanlineCompositor::Init(FXDIB_Format dest_format, FXDIB_Format src_format, FX_INT32 width, FX_DWORD* pSrcPalette,\n                                     FX_DWORD mask_color, int blend_type, FX_BOOL bClip, FX_BOOL bRgbByteOrder, int alpha_flag, void* pIccTransform)\n{\n    m_SrcFormat = src_format;\n    m_DestFormat = dest_format;\n    m_BlendType = blend_type;\n    m_bRgbByteOrder = bRgbByteOrder;\n    ICodec_IccModule* pIccModule = NULL;\n    if (CFX_GEModule::Get()->GetCodecModule()) {\n        pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n    }\n    if (pIccModule == NULL) {\n        pIccTransform = NULL;\n    }\n    m_pIccTransform = pIccTransform;\n    if ((dest_format & 0xff) == 1) {\n        return FALSE;\n    }\n    if (m_SrcFormat == FXDIB_1bppMask || m_SrcFormat == FXDIB_8bppMask) {\n        return _ScanlineCompositor_InitSourceMask(dest_format, alpha_flag, mask_color,\n                m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue, m_MaskBlack,\n                pIccModule, pIccTransform);\n    }\n    if (pIccTransform == NULL && (~src_format & 0x0400) && (dest_format & 0x0400)) {\n        return FALSE;\n    }\n    if ((m_SrcFormat & 0xff) <= 8) {\n        if (dest_format == FXDIB_8bppMask) {\n            return TRUE;\n        }\n        _ScanlineCompositor_InitSourcePalette(src_format, dest_format, m_pSrcPalette, pSrcPalette,\n                                              pIccModule, pIccTransform);\n        m_Transparency = (dest_format == FXDIB_Argb ? 1 : 0)\n                         + (dest_format & 0x0200 ? 2 : 0)\n                         + (dest_format & 0x0400 ? 4 : 0)\n                         + ((src_format & 0xff) == 1 ? 8 : 0);\n        return TRUE;\n    }\n    m_Transparency = (src_format & 0x0200 ? 0 : 1)\n                     + (dest_format & 0x0200 ? 0 : 2)\n                     + (blend_type == FXDIB_BLEND_NORMAL ? 4 : 0)\n                     + (bClip ? 8 : 0)\n                     + (src_format & 0x0400 ? 16 : 0)\n                     + (dest_format & 0x0400 ? 32 : 0)\n                     + (pIccTransform ? 64 : 0);\n    return TRUE;\n}\nvoid CFX_ScanlineCompositor::CompositeRgbBitmapLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan,\n        FX_LPCBYTE src_extra_alpha, FX_LPBYTE dst_extra_alpha)\n{\n    int src_Bpp = (m_SrcFormat & 0xff) >> 3;\n    int dest_Bpp = (m_DestFormat & 0xff) >> 3;\n    if (m_bRgbByteOrder) {\n        switch (m_Transparency) {\n            case 0:\n            case 4:\n            case 8:\n            case 12:\n                _CompositeRow_Argb2Argb_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, clip_scan);\n                break;\n            case 1:\n                _CompositeRow_Rgb2Argb_Blend_NoClip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, src_Bpp);\n                break;\n            case 2:\n            case 10:\n                _CompositeRow_Argb2Rgb_Blend_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, dest_Bpp, clip_scan);\n                break;\n            case 3:\n                _CompositeRow_Rgb2Rgb_Blend_NoClip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp);\n                break;\n            case 5:\n                _CompositeRow_Rgb2Argb_NoBlend_NoClip_RgbByteOrder(dest_scan, src_scan, width, src_Bpp);\n                break;\n            case 6:\n            case 14:\n                _CompositeRow_Argb2Rgb_NoBlend_RgbByteOrder(dest_scan, src_scan, width, dest_Bpp, clip_scan);\n                break;\n            case 7:\n                _CompositeRow_Rgb2Rgb_NoBlend_NoClip_RgbByteOrder(dest_scan, src_scan, width, dest_Bpp, src_Bpp);\n                break;\n            case 9:\n                _CompositeRow_Rgb2Argb_Blend_Clip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, src_Bpp, clip_scan);\n                break;\n            case 11:\n                _CompositeRow_Rgb2Rgb_Blend_Clip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp, clip_scan);\n                break;\n            case 13:\n                _CompositeRow_Rgb2Argb_NoBlend_Clip_RgbByteOrder(dest_scan, src_scan, width, src_Bpp, clip_scan);\n                break;\n            case 15:\n                _CompositeRow_Rgb2Rgb_NoBlend_Clip_RgbByteOrder(dest_scan, src_scan, width, dest_Bpp, src_Bpp, clip_scan);\n                break;\n        }\n        return;\n    }\n    if (m_DestFormat == FXDIB_8bppMask) {\n        if (m_SrcFormat & 0x0200) {\n            if (m_SrcFormat == FXDIB_Argb) {\n                _CompositeRow_Argb2Mask(dest_scan, src_scan, width, clip_scan);\n            } else {\n                _CompositeRow_Rgba2Mask(dest_scan, src_extra_alpha, width, clip_scan);\n            }\n        } else {\n            _CompositeRow_Rgb2Mask(dest_scan, src_scan, width, clip_scan);\n        }\n    } else if ((m_DestFormat & 0xff) == 8) {\n        if (m_DestFormat & 0x0400) {\n            for (int i = 0; i < width; i ++) {\n                *dest_scan = ~*dest_scan;\n                dest_scan++;\n            }\n        }\n        if (m_SrcFormat & 0x0200) {\n            if (m_DestFormat & 0x0200) {\n                _CompositeRow_Argb2Graya(dest_scan, src_scan, width, m_BlendType, clip_scan, src_extra_alpha, dst_extra_alpha, m_pIccTransform);\n            } else {\n                _CompositeRow_Argb2Gray(dest_scan, src_scan, width, m_BlendType, clip_scan, src_extra_alpha, m_pIccTransform);\n            }\n        } else {\n            if (m_DestFormat & 0x0200) {\n                _CompositeRow_Rgb2Graya(dest_scan, src_scan, src_Bpp, width, m_BlendType, clip_scan, dst_extra_alpha, m_pIccTransform);\n            } else {\n                _CompositeRow_Rgb2Gray(dest_scan, src_scan, src_Bpp, width, m_BlendType, clip_scan, m_pIccTransform);\n            }\n        }\n        if (m_DestFormat & 0x0400) {\n            for (int i = 0; i < width; i ++) {\n                *dest_scan = ~*dest_scan;\n                dest_scan++;\n            }\n        }\n    } else {\n        int dest_Size = width * dest_Bpp + 4;\n        if (dest_Size > m_CacheSize) {\n            m_pCacheScanline = FX_Realloc(FX_BYTE, m_pCacheScanline, dest_Size);\n            if (!m_pCacheScanline) {\n                return;\n            }\n            m_CacheSize = dest_Size;\n        }\n        switch (m_Transparency) {\n            case 0:\n            case 4:\n            case 8:\n            case 4+8: {\n                    _CompositeRow_Argb2Argb(dest_scan, src_scan, width, m_BlendType, clip_scan,\n                                            dst_extra_alpha, src_extra_alpha);\n                }\n                break;\n            case 64:\n            case 4+64:\n            case 8+64:\n            case 4+8+64: {\n                    _CompositeRow_Argb2Argb_Transform(dest_scan, src_scan, width, m_BlendType, clip_scan,\n                                                      dst_extra_alpha, src_extra_alpha, m_pCacheScanline, m_pIccTransform);\n                }\n                break;\n            case 1:\n                _CompositeRow_Rgb2Argb_Blend_NoClip(dest_scan, src_scan, width, m_BlendType, src_Bpp,\n                                                    dst_extra_alpha);\n                break;\n            case 1+64:\n                _CompositeRow_Rgb2Argb_Blend_NoClip_Transform(dest_scan, src_scan, width, m_BlendType, src_Bpp,\n                        dst_extra_alpha, m_pCacheScanline, m_pIccTransform);\n                break;\n            case 1+8:\n                _CompositeRow_Rgb2Argb_Blend_Clip(dest_scan, src_scan, width, m_BlendType, src_Bpp, clip_scan,\n                                                  dst_extra_alpha);\n                break;\n            case 1+8+64:\n                _CompositeRow_Rgb2Argb_Blend_Clip_Transform(dest_scan, src_scan, width, m_BlendType, src_Bpp, clip_scan,\n                        dst_extra_alpha, m_pCacheScanline, m_pIccTransform);\n                break;\n            case 1+4:\n                _CompositeRow_Rgb2Argb_NoBlend_NoClip(dest_scan, src_scan, width, src_Bpp,\n                                                      dst_extra_alpha);\n                break;\n            case 1+4+64:\n                _CompositeRow_Rgb2Argb_NoBlend_NoClip_Transform(dest_scan, src_scan, width, src_Bpp,\n                        dst_extra_alpha, m_pCacheScanline, m_pIccTransform);\n                break;\n            case 1+4+8:\n                _CompositeRow_Rgb2Argb_NoBlend_Clip(dest_scan, src_scan, width, src_Bpp, clip_scan,\n                                                    dst_extra_alpha);\n                break;\n            case 1+4+8+64:\n                _CompositeRow_Rgb2Argb_NoBlend_Clip_Transform(dest_scan, src_scan, width, src_Bpp, clip_scan,\n                        dst_extra_alpha, m_pCacheScanline, m_pIccTransform);\n                break;\n            case 2:\n            case 2+8:\n                _CompositeRow_Argb2Rgb_Blend(dest_scan, src_scan, width, m_BlendType, dest_Bpp, clip_scan,\n                                             src_extra_alpha);\n                break;\n            case 2+64:\n            case 2+8+64:\n                _CompositeRow_Argb2Rgb_Blend_Transform(dest_scan, src_scan, width, m_BlendType, dest_Bpp, clip_scan,\n                                                       src_extra_alpha, m_pCacheScanline, m_pIccTransform);\n                break;\n            case 2+4:\n            case 2+4+8:\n                _CompositeRow_Argb2Rgb_NoBlend(dest_scan, src_scan, width, dest_Bpp, clip_scan,\n                                               src_extra_alpha);\n                break;\n            case 2+4+64:\n            case 2+4+8+64:\n                _CompositeRow_Argb2Rgb_NoBlend_Transform(dest_scan, src_scan, width, dest_Bpp, clip_scan,\n                        src_extra_alpha, m_pCacheScanline, m_pIccTransform);\n                break;\n            case 1+2:\n                _CompositeRow_Rgb2Rgb_Blend_NoClip(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp);\n                break;\n            case 1+2+64:\n                _CompositeRow_Rgb2Rgb_Blend_NoClip_Transform(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp,\n                        m_pCacheScanline, m_pIccTransform);\n                break;\n            case 1+2+8:\n                _CompositeRow_Rgb2Rgb_Blend_Clip(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp, clip_scan);\n                break;\n            case 1+2+8+64:\n                _CompositeRow_Rgb2Rgb_Blend_Clip_Transform(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp, clip_scan,\n                        m_pCacheScanline, m_pIccTransform);\n                break;\n            case 1+2+4:\n                _CompositeRow_Rgb2Rgb_NoBlend_NoClip(dest_scan, src_scan, width, dest_Bpp, src_Bpp);\n                break;\n            case 1+2+4+64:\n                _CompositeRow_Rgb2Rgb_NoBlend_NoClip_Transform(dest_scan, src_scan, width, dest_Bpp, src_Bpp,\n                        m_pCacheScanline, m_pIccTransform);\n                break;\n            case 1+2+4+8:\n                _CompositeRow_Rgb2Rgb_NoBlend_Clip(dest_scan, src_scan, width, dest_Bpp, src_Bpp, clip_scan);\n                break;\n            case 1+2+4+8+64:\n                _CompositeRow_Rgb2Rgb_NoBlend_Clip_Transform(dest_scan, src_scan, width, dest_Bpp, src_Bpp, clip_scan,\n                        m_pCacheScanline, m_pIccTransform);\n                break;\n        }\n    }\n}\nvoid CFX_ScanlineCompositor::CompositePalBitmapLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width, FX_LPCBYTE clip_scan,\n        FX_LPCBYTE src_extra_alpha, FX_LPBYTE dst_extra_alpha)\n{\n    if (m_bRgbByteOrder) {\n        if (m_SrcFormat == FXDIB_1bppRgb) {\n            if (m_DestFormat == FXDIB_8bppRgb) {\n                return;\n            } else if(m_DestFormat == FXDIB_Argb) {\n                _CompositeRow_1bppRgb2Argb_NoBlend_RgbByteOrder(dest_scan, src_scan, src_left, width, m_pSrcPalette, clip_scan);\n            } else {\n                _CompositeRow_1bppRgb2Rgb_NoBlend_RgbByteOrder(dest_scan, src_scan, src_left, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan);\n            }\n        } else {\n            if (m_DestFormat == FXDIB_8bppRgb) {\n                return;\n            } else if (m_DestFormat == FXDIB_Argb) {\n                _CompositeRow_8bppRgb2Argb_NoBlend_RgbByteOrder(dest_scan, src_scan, width, m_pSrcPalette, clip_scan);\n            } else {\n                _CompositeRow_8bppRgb2Rgb_NoBlend_RgbByteOrder(dest_scan, src_scan, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan);\n            }\n        }\n        return;\n    }\n    if (m_DestFormat == FXDIB_8bppMask) {\n        _CompositeRow_Rgb2Mask(dest_scan, src_scan, width, clip_scan);\n        return;\n    } else if ((m_DestFormat & 0xff) == 8) {\n        if (m_Transparency & 8) {\n            if (m_DestFormat & 0x0200) {\n                _CompositeRow_1bppPal2Graya(dest_scan, src_scan, src_left, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan, dst_extra_alpha);\n            } else {\n                _CompositeRow_1bppPal2Gray(dest_scan, src_scan, src_left, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan);\n            }\n        } else {\n            if (m_DestFormat & 0x0200)\n                _CompositeRow_8bppPal2Graya(dest_scan, src_scan, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan,\n                                            dst_extra_alpha, src_extra_alpha);\n            else\n                _CompositeRow_8bppPal2Gray(dest_scan, src_scan, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan,\n                                           src_extra_alpha);\n        }\n    } else {\n        switch (m_Transparency) {\n            case 1+2:\n                _CompositeRow_8bppRgb2Argb_NoBlend(dest_scan, src_scan, width, m_pSrcPalette, clip_scan,\n                                                   src_extra_alpha);\n                break;\n            case 1+2+8:\n                _CompositeRow_1bppRgb2Argb_NoBlend(dest_scan, src_scan, src_left, width, m_pSrcPalette, clip_scan);\n                break;\n            case 0:\n                _CompositeRow_8bppRgb2Rgb_NoBlend(dest_scan, src_scan, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan,\n                                                  src_extra_alpha);\n                break;\n            case 0+8:\n                _CompositeRow_1bppRgb2Rgb_NoBlend(dest_scan, src_scan, src_left, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan);\n                break;\n            case 0+2:\n                _CompositeRow_8bppRgb2Rgb_NoBlend(dest_scan, src_scan, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan,\n                                                  src_extra_alpha);\n                break;\n            case 0+2+8:\n                _CompositeRow_1bppRgb2Rgba_NoBlend(dest_scan, src_scan, src_left, width, m_pSrcPalette, clip_scan,\n                                                   dst_extra_alpha);\n                break;\n                break;\n        }\n    }\n}\nvoid CFX_ScanlineCompositor::CompositeByteMaskLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan,\n        FX_LPBYTE dst_extra_alpha)\n{\n    if (m_DestFormat == FXDIB_8bppMask) {\n        _CompositeRow_ByteMask2Mask(dest_scan, src_scan, m_MaskAlpha, width, clip_scan);\n    } else if ((m_DestFormat & 0xff) == 8) {\n        if (m_DestFormat & 0x0200) {\n            _CompositeRow_ByteMask2Graya(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, width, clip_scan, dst_extra_alpha);\n        } else {\n            _CompositeRow_ByteMask2Gray(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, width, clip_scan);\n        }\n    } else if (m_bRgbByteOrder) {\n        if (m_DestFormat == FXDIB_Argb)\n            _CompositeRow_ByteMask2Argb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,\n                    width, m_BlendType, clip_scan);\n        else\n            _CompositeRow_ByteMask2Rgb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,\n                                                    width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);\n        return;\n    } else if (m_DestFormat == FXDIB_Argb)\n        _CompositeRow_ByteMask2Argb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,\n                                    width, m_BlendType, clip_scan);\n    else if (m_DestFormat == FXDIB_Rgb || m_DestFormat == FXDIB_Rgb32)\n        _CompositeRow_ByteMask2Rgb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,\n                                   width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);\n    else if (m_DestFormat == FXDIB_Rgba)\n        _CompositeRow_ByteMask2Rgba(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,\n                                    width, m_BlendType, clip_scan, dst_extra_alpha);\n}\nvoid CFX_ScanlineCompositor::CompositeBitMaskLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width, FX_LPCBYTE clip_scan,\n        FX_LPBYTE dst_extra_alpha)\n{\n    if (m_DestFormat == FXDIB_8bppMask) {\n        _CompositeRow_BitMask2Mask(dest_scan, src_scan, m_MaskAlpha, src_left, width, clip_scan);\n    } else if ((m_DestFormat & 0xff) == 8) {\n        if (m_DestFormat & 0x0200)\n            _CompositeRow_BitMask2Graya(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, src_left, width, clip_scan,\n                                        dst_extra_alpha);\n        else {\n            _CompositeRow_BitMask2Gray(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, src_left, width, clip_scan);\n        }\n    } else if (m_bRgbByteOrder) {\n        if (m_DestFormat == FXDIB_Argb)\n            _CompositeRow_BitMask2Argb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,\n                                                    src_left, width, m_BlendType, clip_scan);\n        else\n            _CompositeRow_BitMask2Rgb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,\n                                                   src_left, width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);\n        return;\n    } else if (m_DestFormat == FXDIB_Argb)\n        _CompositeRow_BitMask2Argb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,\n                                   src_left, width, m_BlendType, clip_scan);\n    else if (m_DestFormat == FXDIB_Rgb || m_DestFormat == FXDIB_Rgb32)\n        _CompositeRow_BitMask2Rgb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,\n                                  src_left, width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);\n}\nFX_BOOL CFX_DIBitmap::CompositeBitmap(int dest_left, int dest_top, int width, int height,\n                                      const CFX_DIBSource* pSrcBitmap, int src_left, int src_top,\n                                      int blend_type, const CFX_ClipRgn* pClipRgn, FX_BOOL bRgbByteOrder, void* pIccTransform)\n{\n    if (m_pBuffer == NULL) {\n        return FALSE;\n    }\n    ASSERT(!pSrcBitmap->IsAlphaMask());\n    ASSERT(m_bpp >= 8);\n    if (pSrcBitmap->IsAlphaMask() || m_bpp < 8) {\n        return FALSE;\n    }\n    GetOverlapRect(dest_left, dest_top, width, height, pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(),\n                   src_left, src_top, pClipRgn);\n    if (width == 0 || height == 0) {\n        return TRUE;\n    }\n    const CFX_DIBitmap* pClipMask = NULL;\n    FX_RECT clip_box;\n    if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) {\n        ASSERT(pClipRgn->GetType() == CFX_ClipRgn::MaskF);\n        pClipMask = pClipRgn->GetMask();\n        clip_box = pClipRgn->GetBox();\n    }\n    CFX_ScanlineCompositor compositor;\n    if (!compositor.Init(GetFormat(), pSrcBitmap->GetFormat(), width, pSrcBitmap->GetPalette(), 0, blend_type,\n                         pClipMask != NULL, bRgbByteOrder, 0, pIccTransform)) {\n        return FALSE;\n    }\n    int dest_Bpp = m_bpp / 8;\n    int src_Bpp = pSrcBitmap->GetBPP() / 8;\n    FX_BOOL bRgb = FALSE;\n    FX_BOOL bCmyk = FALSE;\n    if (src_Bpp > 1) {\n        if (pSrcBitmap->IsCmykImage()) {\n            bCmyk = TRUE;\n        } else {\n            bRgb = TRUE;\n        }\n    }\n    CFX_DIBitmap* pSrcAlphaMask = pSrcBitmap->m_pAlphaMask;\n    for (int row = 0; row < height; row ++) {\n        FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * dest_Bpp;\n        FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * src_Bpp;\n        FX_LPCBYTE src_scan_extra_alpha = pSrcAlphaMask ? pSrcAlphaMask->GetScanline(src_top + row) + src_left : NULL;\n        FX_LPBYTE dst_scan_extra_alpha = m_pAlphaMask ? (FX_LPBYTE)m_pAlphaMask->GetScanline(dest_top + row) + dest_left : NULL;\n        FX_LPCBYTE clip_scan = NULL;\n        if (pClipMask) {\n            clip_scan = pClipMask->m_pBuffer + (dest_top + row - clip_box.top) * pClipMask->m_Pitch + (dest_left - clip_box.left);\n        }\n        if (bRgb) {\n            compositor.CompositeRgbBitmapLine(dest_scan, src_scan, width, clip_scan, src_scan_extra_alpha, dst_scan_extra_alpha);\n        } else {\n            compositor.CompositePalBitmapLine(dest_scan, src_scan, src_left, width, clip_scan, src_scan_extra_alpha, dst_scan_extra_alpha);\n        }\n    }\n    return TRUE;\n}\nFX_BOOL CFX_DIBitmap::CompositeMask(int dest_left, int dest_top, int width, int height,\n                                    const CFX_DIBSource* pMask, FX_DWORD color, int src_left, int src_top,\n                                    int blend_type, const CFX_ClipRgn* pClipRgn, FX_BOOL bRgbByteOrder, int alpha_flag, void* pIccTransform)\n{\n    if (m_pBuffer == NULL) {\n        return FALSE;\n    }\n    ASSERT(pMask->IsAlphaMask());\n    ASSERT(m_bpp >= 8);\n    if (!pMask->IsAlphaMask() || m_bpp < 8) {\n        return FALSE;\n    }\n    GetOverlapRect(dest_left, dest_top, width, height, pMask->GetWidth(), pMask->GetHeight(), src_left, src_top, pClipRgn);\n    if (width == 0 || height == 0) {\n        return TRUE;\n    }\n    int src_alpha = (FX_BYTE)(alpha_flag >> 8) ? (alpha_flag & 0xff) : FXARGB_A(color);\n    if (src_alpha == 0) {\n        return TRUE;\n    }\n    const CFX_DIBitmap* pClipMask = NULL;\n    FX_RECT clip_box;\n    if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) {\n        ASSERT(pClipRgn->GetType() == CFX_ClipRgn::MaskF);\n        pClipMask = pClipRgn->GetMask();\n        clip_box = pClipRgn->GetBox();\n    }\n    int src_bpp = pMask->GetBPP();\n    int Bpp = GetBPP() / 8;\n    CFX_ScanlineCompositor compositor;\n    if (!compositor.Init(GetFormat(), pMask->GetFormat(), width, NULL, color, blend_type, pClipMask != NULL, bRgbByteOrder, alpha_flag, pIccTransform)) {\n        return FALSE;\n    }\n    for (int row = 0; row < height; row ++) {\n        FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * Bpp;\n        FX_LPCBYTE src_scan = pMask->GetScanline(src_top + row);\n        FX_LPBYTE dst_scan_extra_alpha = m_pAlphaMask ? (FX_LPBYTE)m_pAlphaMask->GetScanline(dest_top + row) + dest_left : NULL;\n        FX_LPCBYTE clip_scan = NULL;\n        if (pClipMask) {\n            clip_scan = pClipMask->m_pBuffer + (dest_top + row - clip_box.top) * pClipMask->m_Pitch + (dest_left - clip_box.left);\n        }\n        if (src_bpp == 1) {\n            compositor.CompositeBitMaskLine(dest_scan, src_scan, src_left, width, clip_scan, dst_scan_extra_alpha);\n        } else {\n            compositor.CompositeByteMaskLine(dest_scan, src_scan + src_left, width, clip_scan, dst_scan_extra_alpha);\n        }\n    }\n    return TRUE;\n}\nFX_BOOL CFX_DIBitmap::CompositeRect(int left, int top, int width, int height, FX_DWORD color, int alpha_flag, void* pIccTransform)\n{\n    if (m_pBuffer == NULL) {\n        return FALSE;\n    }\n    int src_alpha = (alpha_flag >> 8) ? (alpha_flag & 0xff) : FXARGB_A(color);\n    if (src_alpha == 0) {\n        return TRUE;\n    }\n    FX_RECT rect(left, top, left + width, top + height);\n    rect.Intersect(0, 0, m_Width, m_Height);\n    if (rect.IsEmpty()) {\n        return TRUE;\n    }\n    width = rect.Width();\n    FX_DWORD dst_color;\n    if (alpha_flag >> 8) {\n        dst_color = FXCMYK_TODIB(color);\n    } else {\n        dst_color = FXARGB_TODIB(color);\n    }\n    FX_LPBYTE color_p = (FX_LPBYTE)&dst_color;\n    if (m_bpp == 8) {\n        FX_BYTE gray = 255;\n        if (!IsAlphaMask()) {\n            if (pIccTransform && CFX_GEModule::Get()->GetCodecModule() && CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {\n                ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n                pIccModule->TranslateScanline(pIccTransform, &gray, color_p, 1);\n            } else {\n                if (alpha_flag >> 8) {\n                    FX_BYTE r, g, b;\n                    AdobeCMYK_to_sRGB1(color_p[0], color_p[1], color_p[2], color_p[3],\n                                       r, g, b);\n                    gray = FXRGB2GRAY(r, g, b);\n                } else {\n                    gray = (FX_BYTE)FXRGB2GRAY((int)color_p[2], color_p[1], color_p[0]);\n                }\n            }\n            if (IsCmykImage()) {\n                gray = ~gray;\n            }\n        }\n        for (int row = rect.top; row < rect.bottom; row ++) {\n            FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left;\n            if (src_alpha == 255) {\n                FXSYS_memset8(dest_scan, gray, width);\n            } else\n                for (int col = 0; col < width; col ++) {\n                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);\n                    dest_scan ++;\n                }\n        }\n        return TRUE;\n    } else if (m_bpp == 1) {\n        ASSERT(!IsCmykImage() && (FX_BYTE)(alpha_flag >> 8) == 0);\n        int left_shift = rect.left % 8;\n        int right_shift = rect.right % 8;\n        int width = rect.right / 8 - rect.left / 8;\n        int index = 0;\n        if (m_pPalette == NULL) {\n            index = ((FX_BYTE)color == 0xff) ? 1 : 0;\n        } else {\n            for (int i = 0; i < 2; i ++)\n                if (m_pPalette[i] == color) {\n                    index = i;\n                }\n        }\n        for (int row = rect.top; row < rect.bottom; row ++) {\n            FX_BYTE* dest_scan_top = (FX_BYTE*)GetScanline(row) + rect.left / 8;\n            FX_BYTE* dest_scan_top_r = (FX_BYTE*)GetScanline(row) + rect.right / 8;\n            FX_BYTE left_flag =  *dest_scan_top & (255 << (8 - left_shift));\n            FX_BYTE right_flag = *dest_scan_top_r & (255 >> right_shift);\n            if (width) {\n                FXSYS_memset8(dest_scan_top + 1, index ? 255 : 0, width - 1);\n                if (!index) {\n                    *dest_scan_top &= left_flag;\n                    *dest_scan_top_r &= right_flag;\n                } else {\n                    *dest_scan_top |= ~left_flag;\n                    *dest_scan_top_r |= ~right_flag;\n                }\n            } else {\n                if (!index) {\n                    *dest_scan_top &= left_flag | right_flag;\n                } else {\n                    *dest_scan_top |= ~(left_flag | right_flag);\n                }\n            }\n        }\n        return TRUE;\n    }\n    ASSERT(m_bpp >= 24);\n    if (m_bpp < 24) {\n        return FALSE;\n    }\n    if (pIccTransform && CFX_GEModule::Get()->GetCodecModule()) {\n        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n        pIccModule->TranslateScanline(pIccTransform, color_p, color_p, 1);\n    } else {\n        if (alpha_flag >> 8 && !IsCmykImage())\n            AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), FXSYS_GetYValue(color), FXSYS_GetKValue(color),\n                               color_p[2], color_p[1], color_p[0]);\n        else if (!(alpha_flag >> 8) && IsCmykImage()) {\n            return FALSE;\n        }\n    }\n    if(!IsCmykImage()) {\n        color_p[3] = (FX_BYTE)src_alpha;\n    }\n    int Bpp = m_bpp / 8;\n    FX_BOOL bAlpha = HasAlpha();\n    FX_BOOL bArgb = GetFormat() == FXDIB_Argb ? TRUE : FALSE;\n    if (src_alpha == 255) {\n        for (int row = rect.top; row < rect.bottom; row ++) {\n            FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left * Bpp;\n            FX_LPBYTE dest_scan_alpha = m_pAlphaMask ? (FX_LPBYTE)m_pAlphaMask->GetScanline(row) + rect.left : NULL;\n            if (dest_scan_alpha) {\n                FXSYS_memset8(dest_scan_alpha, 0xff, width);\n            }\n            if (Bpp == 4) {\n                FX_DWORD* scan = (FX_DWORD*)dest_scan;\n                for (int col = 0; col < width; col ++) {\n                    *scan ++ = dst_color;\n                }\n            } else {\n                for (int col = 0; col < width; col ++) {\n                    *dest_scan ++ = color_p[0];\n                    *dest_scan ++ = color_p[1];\n                    *dest_scan ++ = color_p[2];\n                }\n            }\n        }\n        return TRUE;\n    }\n    for (int row = rect.top; row < rect.bottom; row ++) {\n        FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left * Bpp;\n        if (bAlpha) {\n            if (bArgb) {\n                for (int col = 0; col < width; col ++) {\n                    FX_BYTE back_alpha = dest_scan[3];\n                    if (back_alpha == 0) {\n                        FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, color_p[2], color_p[1], color_p[0]));\n                        dest_scan += 4;\n                        continue;\n                    }\n                    FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n                    int alpha_ratio = src_alpha * 255 / dest_alpha;\n                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[0], alpha_ratio);\n                    dest_scan ++;\n                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[1], alpha_ratio);\n                    dest_scan ++;\n                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[2], alpha_ratio);\n                    dest_scan ++;\n                    *dest_scan++ = dest_alpha;\n                }\n            } else {\n                FX_LPBYTE dest_scan_alpha = (FX_LPBYTE)m_pAlphaMask->GetScanline(row) + rect.left;\n                for (int col = 0; col < width; col ++) {\n                    FX_BYTE back_alpha = *dest_scan_alpha;\n                    if (back_alpha == 0) {\n                        *dest_scan_alpha++ = src_alpha;\n                        FXSYS_memcpy32(dest_scan, color_p, Bpp);\n                        dest_scan += Bpp;\n                        continue;\n                    }\n                    FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;\n                    *dest_scan_alpha ++ = dest_alpha;\n                    int alpha_ratio = src_alpha * 255 / dest_alpha;\n                    for(int comps = 0; comps < Bpp; comps ++) {\n                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[comps], alpha_ratio);\n                        dest_scan ++;\n                    }\n                }\n            }\n        } else {\n            for (int col = 0; col < width; col ++) {\n                for(int comps = 0; comps < Bpp; comps ++) {\n                    if (comps == 3) {\n                        *dest_scan ++ = 255;\n                        continue;\n                    }\n                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[comps], src_alpha);\n                    dest_scan ++;\n                }\n            }\n        }\n    }\n    return TRUE;\n}\nCFX_BitmapComposer::CFX_BitmapComposer()\n{\n    m_pScanlineV = NULL;\n    m_pScanlineAlphaV = NULL;\n    m_pClipScanV = NULL;\n    m_pAddClipScan = NULL;\n    m_bRgbByteOrder = FALSE;\n    m_BlendType = FXDIB_BLEND_NORMAL;\n}\nCFX_BitmapComposer::~CFX_BitmapComposer()\n{\n    if (m_pScanlineV) {\n        FX_Free(m_pScanlineV);\n    }\n    if (m_pScanlineAlphaV) {\n        FX_Free(m_pScanlineAlphaV);\n    }\n    if (m_pClipScanV) {\n        FX_Free(m_pClipScanV);\n    }\n    if (m_pAddClipScan) {\n        FX_Free(m_pAddClipScan);\n    }\n}\nvoid CFX_BitmapComposer::Compose(CFX_DIBitmap* pDest, const CFX_ClipRgn* pClipRgn, int bitmap_alpha,\n                                 FX_DWORD mask_color, FX_RECT& dest_rect, FX_BOOL bVertical,\n                                 FX_BOOL bFlipX, FX_BOOL bFlipY, FX_BOOL bRgbByteOrder,\n                                 int alpha_flag, void* pIccTransform, int blend_type)\n{\n    m_pBitmap = pDest;\n    m_pClipRgn = pClipRgn;\n    m_DestLeft = dest_rect.left;\n    m_DestTop = dest_rect.top;\n    m_DestWidth = dest_rect.Width();\n    m_DestHeight = dest_rect.Height();\n    m_BitmapAlpha = bitmap_alpha;\n    m_MaskColor = mask_color;\n    m_pClipMask = NULL;\n    if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) {\n        m_pClipMask = pClipRgn->GetMask();\n    }\n    m_bVertical = bVertical;\n    m_bFlipX = bFlipX;\n    m_bFlipY = bFlipY;\n    m_AlphaFlag = alpha_flag;\n    m_pIccTransform = pIccTransform;\n    m_bRgbByteOrder = bRgbByteOrder;\n    m_BlendType = blend_type;\n}\nFX_BOOL CFX_BitmapComposer::SetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette)\n{\n    m_SrcFormat = src_format;\n    if (!m_Compositor.Init(m_pBitmap->GetFormat(), src_format, width, pSrcPalette, m_MaskColor, FXDIB_BLEND_NORMAL,\n                           m_pClipMask != NULL || (m_BitmapAlpha < 255), m_bRgbByteOrder, m_AlphaFlag, m_pIccTransform)) {\n        return FALSE;\n    }\n    if (m_bVertical) {\n        m_pScanlineV = FX_Alloc(FX_BYTE, m_pBitmap->GetBPP() / 8 * width + 4);\n        if (!m_pScanlineV) {\n            return FALSE;\n        }\n        m_pClipScanV = FX_Alloc(FX_BYTE, m_pBitmap->GetHeight());\n        if (!m_pClipScanV) {\n            return FALSE;\n        }\n        if (m_pBitmap->m_pAlphaMask) {\n            m_pScanlineAlphaV = FX_Alloc(FX_BYTE, width + 4);\n            if (!m_pScanlineAlphaV) {\n                return FALSE;\n            }\n        }\n    }\n    if (m_BitmapAlpha < 255) {\n        m_pAddClipScan = FX_Alloc(FX_BYTE, m_bVertical ? m_pBitmap->GetHeight() : m_pBitmap->GetWidth());\n        if (!m_pAddClipScan) {\n            return FALSE;\n        }\n    }\n    return TRUE;\n}\nvoid CFX_BitmapComposer::DoCompose(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int dest_width, FX_LPCBYTE clip_scan,\n                                   FX_LPCBYTE src_extra_alpha, FX_LPBYTE dst_extra_alpha)\n{\n    if (m_BitmapAlpha < 255) {\n        if (clip_scan) {\n            for (int i = 0; i < dest_width; i ++) {\n                m_pAddClipScan[i] = clip_scan[i] * m_BitmapAlpha / 255;\n            }\n        } else {\n            FXSYS_memset8(m_pAddClipScan, m_BitmapAlpha, dest_width);\n        }\n        clip_scan = m_pAddClipScan;\n    }\n    if (m_SrcFormat == FXDIB_8bppMask) {\n        m_Compositor.CompositeByteMaskLine(dest_scan, src_scan, dest_width, clip_scan, dst_extra_alpha);\n    } else if ((m_SrcFormat & 0xff) == 8) {\n        m_Compositor.CompositePalBitmapLine(dest_scan, src_scan, 0, dest_width, clip_scan, src_extra_alpha, dst_extra_alpha);\n    } else {\n        m_Compositor.CompositeRgbBitmapLine(dest_scan, src_scan, dest_width, clip_scan, src_extra_alpha, dst_extra_alpha);\n    }\n}\nvoid CFX_BitmapComposer::ComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha)\n{\n    if (m_bVertical) {\n        ComposeScanlineV(line, scanline, scan_extra_alpha);\n        return;\n    }\n    FX_LPCBYTE clip_scan = NULL;\n    if (m_pClipMask)\n        clip_scan = m_pClipMask->GetBuffer() + (m_DestTop + line - m_pClipRgn->GetBox().top) *\n                    m_pClipMask->GetPitch() + (m_DestLeft - m_pClipRgn->GetBox().left);\n    FX_LPBYTE dest_scan = (FX_LPBYTE)m_pBitmap->GetScanline(line + m_DestTop) +\n                          m_DestLeft * m_pBitmap->GetBPP() / 8;\n    FX_LPBYTE dest_alpha_scan = m_pBitmap->m_pAlphaMask ?\n                                (FX_LPBYTE)m_pBitmap->m_pAlphaMask->GetScanline(line + m_DestTop) + m_DestLeft : NULL;\n    DoCompose(dest_scan, scanline, m_DestWidth, clip_scan, scan_extra_alpha, dest_alpha_scan);\n}\nvoid CFX_BitmapComposer::ComposeScanlineV(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha)\n{\n    int i;\n    int Bpp = m_pBitmap->GetBPP() / 8;\n    int dest_pitch = m_pBitmap->GetPitch();\n    int dest_alpha_pitch = m_pBitmap->m_pAlphaMask ? m_pBitmap->m_pAlphaMask->GetPitch() : 0;\n    int dest_x = m_DestLeft + (m_bFlipX ? (m_DestWidth - line - 1) : line);\n    FX_LPBYTE dest_buf = m_pBitmap->GetBuffer() + dest_x * Bpp + m_DestTop * dest_pitch;\n    FX_LPBYTE dest_alpha_buf = m_pBitmap->m_pAlphaMask ?\n                               m_pBitmap->m_pAlphaMask->GetBuffer() + dest_x + m_DestTop * dest_alpha_pitch : NULL;\n    if (m_bFlipY) {\n        dest_buf += dest_pitch * (m_DestHeight - 1);\n        dest_alpha_buf += dest_alpha_pitch * (m_DestHeight - 1);\n    }\n    int y_step = dest_pitch;\n    int y_alpha_step = dest_alpha_pitch;\n    if (m_bFlipY) {\n        y_step = -y_step;\n        y_alpha_step = -y_alpha_step;\n    }\n    FX_LPBYTE src_scan = m_pScanlineV;\n    FX_LPBYTE dest_scan = dest_buf;\n    for (i = 0; i < m_DestHeight; i ++) {\n        for (int j = 0; j < Bpp; j ++) {\n            *src_scan++ = dest_scan[j];\n        }\n        dest_scan += y_step;\n    }\n    FX_LPBYTE src_alpha_scan = m_pScanlineAlphaV;\n    FX_LPBYTE dest_alpha_scan = dest_alpha_buf;\n    if (dest_alpha_scan) {\n        for (i = 0; i < m_DestHeight; i ++) {\n            *src_alpha_scan++ = *dest_alpha_scan;\n            dest_alpha_scan += y_alpha_step;\n        }\n    }\n    FX_LPBYTE clip_scan = NULL;\n    if (m_pClipMask) {\n        clip_scan = m_pClipScanV;\n        int clip_pitch = m_pClipMask->GetPitch();\n        FX_LPCBYTE src_clip = m_pClipMask->GetBuffer() + (m_DestTop - m_pClipRgn->GetBox().top) *\n                              clip_pitch + (dest_x - m_pClipRgn->GetBox().left);\n        if (m_bFlipY) {\n            src_clip += clip_pitch * (m_DestHeight - 1);\n            clip_pitch = -clip_pitch;\n        }\n        for (i = 0; i < m_DestHeight; i ++) {\n            clip_scan[i] = *src_clip;\n            src_clip += clip_pitch;\n        }\n    }\n    DoCompose(m_pScanlineV, scanline, m_DestHeight, clip_scan, scan_extra_alpha, m_pScanlineAlphaV);\n    src_scan = m_pScanlineV;\n    dest_scan = dest_buf;\n    for (i = 0; i < m_DestHeight; i ++) {\n        for (int j = 0; j < Bpp; j ++) {\n            dest_scan[j] = *src_scan++;\n        }\n        dest_scan += y_step;\n    }\n    src_alpha_scan = m_pScanlineAlphaV;\n    dest_alpha_scan = dest_alpha_buf;\n    if (dest_alpha_scan) {\n        for (i = 0; i < m_DestHeight; i ++) {\n            *dest_alpha_scan = *src_alpha_scan++;\n            dest_alpha_scan += y_alpha_step;\n        }\n    }\n}\n"
  },
  {
    "path": "core/src/fxge/dib/fx_dib_convert.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxge/fx_dib.h\"\n#include \"../../../include/fxge/fx_ge.h\"\n#include \"../../../include/fxcodec/fx_codec.h\"\nconst FX_DWORD g_dwWinPalette[256] = {\n    0xff000000, 0xff800000, 0xff008000, 0xff808000, 0xff000080, 0xff800080,\n    0xff008080, 0xff808080, 0xffC0DCC0, 0xffA6CAF0, 0xff2A3FAA, 0xff2A3FFF,\n    0xff2A5F00, 0xff2A5F55, 0xff2A5FAA, 0xff2A5FFF, 0xff2A7F00, 0xff2A7F55,\n    0xff2A7FAA, 0xff2A7FFF, 0xff2A9F00, 0xff2A9F55, 0xff2A9FAA, 0xff2A9FFF,\n    0xff2ABF00, 0xff2ABF55, 0xff2ABFAA, 0xff2ABFFF, 0xff2ADF00, 0xff2ADF55,\n    0xff2ADFAA, 0xff2ADFFF, 0xff2AFF00, 0xff2AFF55, 0xff2AFFAA, 0xff2AFFFF,\n    0xff550000, 0xff550055, 0xff5500AA, 0xff5500FF, 0xff551F00, 0xff551F55,\n    0xff551FAA, 0xff551FFF, 0xff553F00, 0xff553F55, 0xff553FAA, 0xff553FFF,\n    0xff555F00, 0xff555F55, 0xff555FAA, 0xff555FFF, 0xff557F00, 0xff557F55,\n    0xff557FAA, 0xff557FFF, 0xff559F00, 0xff559F55, 0xff559FAA, 0xff559FFF,\n    0xff55BF00, 0xff55BF55, 0xff55BFAA, 0xff55BFFF, 0xff55DF00, 0xff55DF55,\n    0xff55DFAA, 0xff55DFFF, 0xff55FF00, 0xff55FF55, 0xff55FFAA, 0xff55FFFF,\n    0xff7F0000, 0xff7F0055, 0xff7F00AA, 0xff7F00FF, 0xff7F1F00, 0xff7F1F55,\n    0xff7F1FAA, 0xff7F1FFF, 0xff7F3F00, 0xff7F3F55, 0xff7F3FAA, 0xff7F3FFF,\n    0xff7F5F00, 0xff7F5F55, 0xff7F5FAA, 0xff7F5FFF, 0xff7F7F00, 0xff7F7F55,\n    0xff7F7FAA, 0xff7F7FFF, 0xff7F9F00, 0xff7F9F55, 0xff7F9FAA, 0xff7F9FFF,\n    0xff7FBF00, 0xff7FBF55, 0xff7FBFAA, 0xff7FBFFF, 0xff7FDF00, 0xff7FDF55,\n    0xff7FDFAA, 0xff7FDFFF, 0xff00FF7F, 0xff7FFF55, 0xff7FFFAA, 0xff7FFFFF,\n    0xffAA0000, 0xffAA0055, 0xffAA00AA, 0xffAA00FF, 0xffAA1F00, 0xffAA1F55,\n    0xffAA1FAA, 0xffAA1FFF, 0xffAA3F00, 0xffAA3F55, 0xffAA3FAA, 0xffAA3FFF,\n    0xffAA5F00, 0xffAA5F55, 0xffAA5FAA, 0xffAA5FFF, 0xffAA7F00, 0xffAA7F55,\n    0xffAA7FAA, 0xffAA7FFF, 0xffAA9F00, 0xffAA9F55, 0xffAA9FAA, 0xffAA9FFF,\n    0xffAABF00, 0xffAABF55, 0xffAABFAA, 0xffAABFFF, 0xffAADF00, 0xffAADF55,\n    0xffAADFAA, 0xffAADFFF, 0xffAAFF00, 0xffAAFF55, 0xffAAFFAA, 0xffAAFFFF,\n    0xffD40000, 0xffD40055, 0xffD400AA, 0xffD400FF, 0xffD41F00, 0xffD41F55,\n    0xffD41FAA, 0xffD41FFF, 0xffD43F00, 0xffD43F55, 0xffD43FAA, 0xffD43FFF,\n    0xffD45F00, 0xffD45F55, 0xffD45FAA, 0xffD45FFF, 0xffD47F00, 0xffD47F55,\n    0xffD47FAA, 0xffD4F7FF, 0xffD49F00, 0xffD49F55, 0xffD49FAA, 0xffD49FFF,\n    0xffD4BF00, 0xffD4BF55, 0xffD4BFAA, 0xffD4BFFF, 0xffD4DF00, 0xffD4DF55,\n    0xffD4DFAA, 0xffD4DFFF, 0xffD4FF00, 0xffD4FF55, 0xffD4FFAA, 0xffD4FFFF,\n    0xffFF0055, 0xffFF00AA, 0xffFF1F00, 0xffFF1F55, 0xffFF1FAA, 0xffFF1FFF,\n    0xffFF3F00, 0xffFF3F55, 0xffFF3FAA, 0xffFF3FFF, 0xffFF5F00, 0xffFF5F55,\n    0xffFF5FAA, 0xffFF5FFF, 0xffFF7F00, 0xffFF7F55, 0xffFF7FAA, 0xffFF7FFF,\n    0xffFF9F00, 0xffFF9F55, 0xffFF9FAA, 0xffFF9FFF, 0xffFFBF00, 0xffFFBF55,\n    0xffFFBFAA, 0xffFFBFFF, 0xffFFDF00, 0xffFFDF55, 0xffFFDFAA, 0xffFFDFFF,\n    0xffFFFF55, 0xffFFFFAA, 0xffCCCCFF, 0xffFFCCFF, 0xff33FFFF, 0xff66FFFF,\n    0xff99FFFF, 0xffCCFFFF, 0xff007F00, 0xff007F55, 0xff007FAA, 0xff007FFF,\n    0xff009F00, 0xff009F55, 0xff009FAA, 0xff009FFF, 0xff00BF00, 0xff00BF55,\n    0xff00BFAA, 0xff00BFFF, 0xff00DF00, 0xff00DF55, 0xff00DFAA, 0xff00DFFF,\n    0xff00FF55, 0xff00FFAA, 0xff2A0000, 0xff2A0055, 0xff2A00AA, 0xff2A00FF,\n    0xff2A1F00, 0xff2A1F55, 0xff2A1FAA, 0xff2A1FFF, 0xff2A3F00, 0xff2A3F55,\n    0xffFFFBF0, 0xffA0A0A4, 0xff808080, 0xffFF0000, 0xff00FF00, 0xffFF0000,\n    0xff0000FF, 0xffFF00FF, 0xff00FFFF, 0xffFFFFFF\n};\nconst FX_DWORD g_dwMacPalette[256] = {\n    0xffFFFFFF, 0xffFFFFCC, 0xffFFFF99, 0xffFFFF66, 0xffFFFF33, 0xffFFFF00,\n    0xffFFCCFF, 0xffFFCCCC, 0xffFFCC99, 0xffFFCC66, 0xffFFCC33, 0xffFFCC00,\n    0xffFF99FF, 0xffFF99CC, 0xffFF9999, 0xffFF9966, 0xffFF9933, 0xffFF9900,\n    0xffFF66FF, 0xffFF66CC, 0xffFF6699, 0xffFF6666, 0xffFF6633, 0xffFF6600,\n    0xffFF33FF, 0xffFF33CC, 0xffFF3399, 0xffFF3366, 0xffFF3333, 0xffFF3300,\n    0xffFF00FF, 0xffFF00CC, 0xffFF0099, 0xffFF0066, 0xffFF0033, 0xffFF0000,\n    0xffCCFFFF, 0xffCCFFCC, 0xffCCFF99, 0xffCCFF66, 0xffCCFF33, 0xffCCFF00,\n    0xffCCCCFF, 0xffCCCCCC, 0xffCCCC99, 0xffCCCC66, 0xffCCCC33, 0xffCCCC00,\n    0xffCC99FF, 0xffCC99CC, 0xffCC9999, 0xffCC9966, 0xffCC9933, 0xffCC9900,\n    0xffCC66FF, 0xffCC66CC, 0xffCC6699, 0xffCC6666, 0xffCC6633, 0xffCC6600,\n    0xffCC33FF, 0xffCC33CC, 0xffCC3399, 0xffCC3366, 0xffCC3333, 0xffCC3300,\n    0xffCC00FF, 0xffCC00CC, 0xffCC0099, 0xffCC0066, 0xffCC0033, 0xffCC0000,\n    0xff99FFFF, 0xff99FFCC, 0xff99FF99, 0xff99FF66, 0xff99FF33, 0xff99FF00,\n    0xff99CCFF, 0xff99CCCC, 0xff99CC99, 0xff99CC66, 0xff99CC33, 0xff99CC00,\n    0xff9999FF, 0xff9999CC, 0xff999999, 0xff999966, 0xff999933, 0xff999900,\n    0xff9966FF, 0xff9966CC, 0xff996699, 0xff996666, 0xff996633, 0xff996600,\n    0xff9933FF, 0xff9933CC, 0xff993399, 0xff993366, 0xff993333, 0xff993300,\n    0xff9900FF, 0xff9900CC, 0xff990099, 0xff990066, 0xff990033, 0xff990000,\n    0xff66FFFF, 0xff66FFCC, 0xff66FF99, 0xff66FF66, 0xff66FF33, 0xff66FF00,\n    0xff66CCFF, 0xff66CCCC, 0xff66CC99, 0xff66CC66, 0xff66CC33, 0xff66CC00,\n    0xff6699FF, 0xff6699CC, 0xff669999, 0xff669966, 0xff669933, 0xff669900,\n    0xff6666FF, 0xff6666CC, 0xff666699, 0xff666666, 0xff666633, 0xff666600,\n    0xff6633FF, 0xff6633CC, 0xff663399, 0xff663366, 0xff663333, 0xff663300,\n    0xff6600FF, 0xff6600CC, 0xff660099, 0xff660066, 0xff660033, 0xff660000,\n    0xff33FFFF, 0xff33FFCC, 0xff33FF99, 0xff33FF66, 0xff33FF33, 0xff33FF00,\n    0xff33CCFF, 0xff33CCCC, 0xff33CC99, 0xff33CC66, 0xff33CC33, 0xff33CC00,\n    0xff3399FF, 0xff3399CC, 0xff339999, 0xff339966, 0xff339933, 0xff339900,\n    0xff3366FF, 0xff3366CC, 0xff336699, 0xff336666, 0xff336633, 0xff336600,\n    0xff3333FF, 0xff3333CC, 0xff333399, 0xff333366, 0xff333333, 0xff333300,\n    0xff3300FF, 0xff3300CC, 0xff330099, 0xff330066, 0xff330033, 0xff330000,\n    0xff00FFFF, 0xff00FFCC, 0xff00FF99, 0xff00FF66, 0xff00FF33, 0xff00FF00,\n    0xff00CCFF, 0xff00CCCC, 0xff00CC99, 0xff00CC66, 0xff00CC33, 0xff00CC00,\n    0xff0099FF, 0xff0099CC, 0xff009999, 0xff009966, 0xff009933, 0xff009900,\n    0xff0066FF, 0xff0066CC, 0xff006699, 0xff006666, 0xff006633, 0xff006600,\n    0xff0033FF, 0xff0033CC, 0xff003399, 0xff003366, 0xff003333, 0xff003300,\n    0xff0000FF, 0xff0000CC, 0xff000099, 0xff000066, 0xff000033,\n    0xffEE0000, 0xffDD0000, 0xffBB0000, 0xffAA0000, 0xff880000, 0xff770000,\n    0xff550000, 0xff440000, 0xff220000, 0xff110000, 0xff00EE00, 0xff00DD00,\n    0xff00BB00, 0xff00AA00, 0xff008800, 0xff007700, 0xff005500, 0xff004400,\n    0xff002200, 0xff001100, 0xff0000EE, 0xff0000DD, 0xff0000BB, 0xff0000AA,\n    0xff000088, 0xff000077, 0xff000055, 0xff000044, 0xff000022, 0xff000011,\n    0xffEEEEEE, 0xffDDDDDD, 0xffBBBBBB, 0xffAAAAAA, 0xff888888, 0xff777777,\n    0xff555555, 0xff444444, 0xff222222, 0xff111111, 0xff000000\n};\nclass CFX_Palette : public CFX_Object\n{\npublic:\n    CFX_Palette();\n    ~CFX_Palette();\npublic:\n    FX_BOOL      BuildPalette(const CFX_DIBSource* pBitmap, int dwPaletteType);\n    FX_DWORD*    GetPalette() const\n    {\n        return m_pPalette;\n    }\n\n    FX_DWORD*    GetColorLut()const\n    {\n        return m_cLut;\n    }\n    FX_DWORD*    GetAmountLut()const\n    {\n        return m_aLut;\n    }\n    FX_INT32     Getlut()const\n    {\n        return m_lut;\n    }\nprotected:\n    FX_DWORD*    m_pPalette;\n    FX_DWORD*    m_cLut;\n    FX_DWORD*    m_aLut;\n    int          m_lut;\n};\nint _Partition(FX_DWORD* alut, FX_DWORD* clut, int l, int r)\n{\n    FX_DWORD p_a = alut[l];\n    FX_DWORD p_c = clut[l];\n    while(l < r) {\n        while(l < r && alut[r] >= p_a) {\n            r--;\n        }\n        if (l < r) {\n            alut[l] = alut[r];\n            clut[l++] = clut[r];\n        }\n        while(l < r && alut[l] <= p_a) {\n            l++;\n        }\n        if (l < r) {\n            alut[r] = alut[l];\n            clut[r--] = clut[l];\n        }\n    }\n    alut[l] = p_a;\n    clut[l] = p_c;\n    return l;\n}\nvoid _Qsort(FX_DWORD* alut, FX_DWORD* clut, int l, int r)\n{\n    if(l < r) {\n        int pI = _Partition(alut, clut, l, r);\n        _Qsort(alut, clut, l, pI - 1);\n        _Qsort(alut, clut, pI + 1, r);\n    }\n}\nvoid _ColorDecode(FX_DWORD pal_v, FX_BYTE& r, FX_BYTE& g, FX_BYTE& b)\n{\n    r = (FX_BYTE)((pal_v & 0xf00) >> 4);\n    g = (FX_BYTE)(pal_v & 0x0f0);\n    b = (FX_BYTE)((pal_v & 0x00f) << 4);\n}\nvoid _Obtain_Pal(FX_DWORD* aLut, FX_DWORD*cLut, FX_DWORD* dest_pal, int pal_type, FX_DWORD* win_mac_pal, FX_DWORD lut)\n{\n    int row, col;\n    FX_DWORD lut_1 = lut - 1;\n    if (pal_type == FXDIB_PALETTE_LOC) {\n        for (row = 0; row < 256; row++) {\n            int lut_offset = lut_1 - row;\n            if (lut_offset < 0) {\n                lut_offset += 256;\n            }\n            FX_DWORD color = cLut[lut_offset];\n            FX_BYTE r, g, b;\n            _ColorDecode(color, r, g, b);\n            dest_pal[row] = ((FX_DWORD)r << 16) | ((FX_DWORD)g << 8) | b | 0xff000000;\n            aLut[lut_offset] = row;\n        }\n    } else {\n        for (row = 0; row < 256; row++) {\n            int lut_offset = lut_1 - row;\n            if (lut_offset < 0) {\n                lut_offset += 256;\n            }\n            FX_BYTE r, g, b;\n            _ColorDecode(cLut[lut_offset], r, g, b);\n            int error, min_error = 1000000;\n            int c_index = 0;\n            for (col = 0; col < 256; col++) {\n                FX_DWORD p_color = win_mac_pal[col];\n                int d_r = r - (FX_BYTE)(p_color >> 16);\n                int d_g = g - (FX_BYTE)(p_color >> 8);\n                int d_b = b - (FX_BYTE)p_color;\n                error = d_r * d_r + d_g * d_g + d_b * d_b;\n                if (error < min_error) {\n                    min_error = error;\n                    c_index = col;\n                }\n            }\n            dest_pal[row] =  win_mac_pal[c_index];\n            aLut[lut_offset] = row;\n        }\n    }\n}\nCFX_Palette::CFX_Palette()\n{\n    m_pPalette = NULL;\n    m_cLut = NULL;\n    m_aLut = NULL;\n    m_lut = 0;\n}\nCFX_Palette::~CFX_Palette()\n{\n    if (m_pPalette) {\n        FX_Free(m_pPalette);\n    }\n    if (m_cLut) {\n        FX_Free(m_cLut);\n    }\n    if (m_aLut) {\n        FX_Free(m_aLut);\n    }\n    m_lut = 0;\n}\nFX_BOOL CFX_Palette::BuildPalette(const CFX_DIBSource* pBitmap, int pal_type)\n{\n    if (pBitmap == NULL) {\n        return FALSE;\n    }\n    if (m_pPalette != NULL) {\n        FX_Free(m_pPalette);\n    }\n    m_pPalette = FX_Alloc(FX_DWORD, 256);\n    if (!m_pPalette) {\n        return FALSE;\n    }\n    int bpp    = pBitmap->GetBPP() / 8;\n    int width  = pBitmap->GetWidth();\n    int height = pBitmap->GetHeight();\n    if (m_cLut) {\n        FX_Free(m_cLut);\n        m_cLut = NULL;\n    }\n    if (m_aLut) {\n        FX_Free(m_aLut);\n        m_aLut = NULL;\n    }\n    m_cLut = FX_Alloc(FX_DWORD, 4096);\n    if (!m_cLut) {\n        return FALSE;\n    }\n    m_aLut = FX_Alloc(FX_DWORD, 4096);\n    if (!m_aLut) {\n        return FALSE;\n    }\n    int row, col;\n    m_lut = 0;\n    for (row = 0; row < height; row++) {\n        FX_BYTE* scan_line = (FX_BYTE*)pBitmap->GetScanline(row);\n        for (col = 0; col < width; col++) {\n            FX_BYTE* src_port = scan_line + col * bpp;\n            FX_DWORD b = src_port[0] & 0xf0;\n            FX_DWORD g = src_port[1] & 0xf0;\n            FX_DWORD r = src_port[2] & 0xf0;\n            FX_DWORD index = (r << 4) + g + (b >> 4);\n            m_aLut[index]++;\n        }\n    }\n    for (row = 0; row < 4096; row++) {\n        if (m_aLut[row] != 0) {\n            m_aLut[m_lut] = m_aLut[row];\n            m_cLut[m_lut] = row;\n            m_lut++;\n        }\n    }\n    _Qsort(m_aLut, m_cLut, 0, m_lut - 1);\n    FX_DWORD* win_mac_pal = NULL;\n    if (pal_type == FXDIB_PALETTE_WIN) {\n        win_mac_pal = (FX_DWORD*)g_dwWinPalette;\n    } else if (pal_type == FXDIB_PALETTE_MAC) {\n        win_mac_pal = (FX_DWORD*)g_dwMacPalette;\n    }\n    _Obtain_Pal(m_aLut, m_cLut, m_pPalette, pal_type, win_mac_pal, m_lut);\n    return TRUE;\n}\nFX_BOOL _ConvertBuffer_1bppMask2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,\n                                     const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)\n{\n    FX_BYTE set_gray, reset_gray;\n    set_gray = 0xff;\n    reset_gray = 0x00;\n    for (int row = 0; row < height; row ++) {\n        FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;\n        FXSYS_memset8(dest_scan, reset_gray, width);\n        FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);\n        for (int col = src_left; col < src_left + width; col ++) {\n            if (src_scan[col / 8] & (1 << (7 - col % 8))) {\n                *dest_scan = set_gray;\n            }\n            dest_scan ++;\n        }\n    }\n    return TRUE;\n}\nFX_BOOL _ConvertBuffer_8bppMask2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,\n                                     const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)\n{\n    for (int row = 0; row < height; row ++) {\n        FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;\n        FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;\n        FXSYS_memcpy32(dest_scan, src_scan, width);\n    }\n    return TRUE;\n}\nFX_BOOL _ConvertBuffer_1bppPlt2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,\n                                    const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)\n{\n    FX_DWORD* src_plt = pSrcBitmap->GetPalette();\n    FX_BYTE gray[2];\n    if (pIccTransform) {\n        FX_DWORD plt[2];\n        if (pSrcBitmap->IsCmykImage()) {\n            plt[0] = FXCMYK_TODIB(src_plt[0]);\n            plt[1] = FXCMYK_TODIB(src_plt[1]);\n        } else {\n            FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;\n            bgr_ptr[0] = FXARGB_B(src_plt[0]);\n            bgr_ptr[1] = FXARGB_G(src_plt[0]);\n            bgr_ptr[2] = FXARGB_R(src_plt[0]);\n            bgr_ptr[3] = FXARGB_B(src_plt[1]);\n            bgr_ptr[4] = FXARGB_G(src_plt[1]);\n            bgr_ptr[5] = FXARGB_R(src_plt[1]);\n        }\n        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n        pIccModule->TranslateScanline(pIccTransform, gray, (FX_LPCBYTE)plt, 2);\n    } else {\n        FX_BYTE reset_r, reset_g, reset_b,\n                set_r, set_g, set_b;\n        if (pSrcBitmap->IsCmykImage()) {\n            AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[0]), FXSYS_GetMValue(src_plt[0]), FXSYS_GetYValue(src_plt[0]), FXSYS_GetKValue(src_plt[0]),\n                               reset_r, reset_g, reset_b);\n            AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[1]), FXSYS_GetMValue(src_plt[1]), FXSYS_GetYValue(src_plt[1]), FXSYS_GetKValue(src_plt[1]),\n                               set_r, set_g, set_b);\n        } else {\n            reset_r = FXARGB_R(src_plt[0]);\n            reset_g = FXARGB_G(src_plt[0]);\n            reset_b = FXARGB_B(src_plt[0]);\n            set_r = FXARGB_R(src_plt[1]);\n            set_g = FXARGB_G(src_plt[1]);\n            set_b = FXARGB_B(src_plt[1]);\n        }\n        gray[0] = FXRGB2GRAY(reset_r, reset_g, reset_b);\n        gray[1] = FXRGB2GRAY(set_r, set_g, set_b);\n    }\n    for (int row = 0; row < height; row ++) {\n        FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;\n        FXSYS_memset8(dest_scan, gray[0], width);\n        FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);\n        for (int col = src_left; col < src_left + width; col ++) {\n            if (src_scan[col / 8] & (1 << (7 - col % 8))) {\n                *dest_scan = gray[1];\n            }\n            dest_scan ++;\n        }\n    }\n    return TRUE;\n}\nFX_BOOL _ConvertBuffer_8bppPlt2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,\n                                    const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)\n{\n    FX_DWORD* src_plt = pSrcBitmap->GetPalette();\n    FX_BYTE gray[256];\n    if (pIccTransform) {\n        FX_DWORD plt[256];\n        if (pSrcBitmap->IsCmykImage()) {\n            for (int i = 0; i < 256; i ++) {\n                plt[i] = FXCMYK_TODIB(src_plt[i]);\n            }\n        } else {\n            FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;\n            for (int i = 0; i < 256; i ++) {\n                *bgr_ptr++ = FXARGB_B(src_plt[i]);\n                *bgr_ptr++ = FXARGB_G(src_plt[i]);\n                *bgr_ptr++ = FXARGB_R(src_plt[i]);\n            }\n        }\n        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n        pIccModule->TranslateScanline(pIccTransform, gray, (FX_LPCBYTE)plt, 256);\n    } else {\n        if (pSrcBitmap->IsCmykImage()) {\n            FX_BYTE r, g, b;\n            for (int i = 0; i < 256; i ++) {\n                AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]),\n                                   r, g, b);\n                gray[i] = FXRGB2GRAY(r, g, b);\n            }\n        } else\n            for (int i = 0; i < 256; i ++) {\n                gray[i] = FXRGB2GRAY(FXARGB_R(src_plt[i]), FXARGB_G(src_plt[i]), FXARGB_B(src_plt[i]));\n            }\n    }\n    for (int row = 0; row < height; row ++) {\n        FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;\n        FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;\n        for (int col = 0; col < width; col ++) {\n            *dest_scan++ = gray[*src_scan++];\n        }\n    }\n    return TRUE;\n}\nFX_BOOL _ConvertBuffer_RgbOrCmyk2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,\n                                      const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)\n{\n    int Bpp = pSrcBitmap->GetBPP() / 8;\n    if (pIccTransform) {\n        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n        if (Bpp == 3 || pSrcBitmap->IsCmykImage()) {\n            for (int row = 0; row < height; row ++) {\n                FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;\n                FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp;\n                pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, width);\n            }\n        } else {\n            for (int row = 0; row < height; row ++) {\n                FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;\n                FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;\n                for (int col = 0; col < width; col ++) {\n                    pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);\n                    dest_scan++;\n                    src_scan += 4;\n                }\n            }\n        }\n    } else {\n        if (pSrcBitmap->IsCmykImage()) {\n            for (int row = 0; row < height; row ++) {\n                FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;\n                FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;\n                for (int col = 0; col < width; col ++) {\n                    FX_BYTE r, g, b;\n                    AdobeCMYK_to_sRGB1(FXSYS_GetCValue((FX_DWORD)src_scan[0]), FXSYS_GetMValue((FX_DWORD)src_scan[1]), FXSYS_GetYValue((FX_DWORD)src_scan[2]), FXSYS_GetKValue((FX_DWORD)src_scan[3]),\n                                       r, g, b);\n                    *dest_scan++ = FXRGB2GRAY(r, g, b);\n                    src_scan += 4;\n                }\n            }\n        } else {\n            for (int row = 0; row < height; row ++) {\n                FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;\n                FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp;\n                for (int col = 0; col < width; col ++) {\n                    *dest_scan++ = FXRGB2GRAY(src_scan[2], src_scan[1], src_scan[0]);\n                    src_scan += Bpp;\n                }\n            }\n        }\n    }\n    return TRUE;\n}\ninline void _ConvertBuffer_IndexCopy(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,\n                                     const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)\n{\n    if (pSrcBitmap->GetBPP() == 1) {\n        for (int row = 0; row < height; row ++) {\n            FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;\n            FXSYS_memset32(dest_scan, 0, width);\n            FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);\n            for (int col = src_left; col < src_left + width; col ++) {\n                if (src_scan[col / 8] & (1 << (7 - col % 8))) {\n                    *dest_scan = 1;\n                }\n                dest_scan ++;\n            }\n        }\n    } else {\n        for (int row = 0; row < height; row ++) {\n            FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;\n            FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;\n            FXSYS_memcpy32(dest_scan, src_scan, width);\n        }\n    }\n}\nFX_BOOL _ConvertBuffer_Plt2PltRgb8(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,\n                                   const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD* dst_plt, void* pIccTransform)\n{\n    _ConvertBuffer_IndexCopy(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);\n    FX_DWORD* src_plt = pSrcBitmap->GetPalette();\n    int plt_size = pSrcBitmap->GetPaletteSize();\n    if (pIccTransform) {\n        FX_DWORD plt[256];\n        FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;\n        if (pSrcBitmap->IsCmykImage()) {\n            for (int i = 0; i < plt_size; i ++) {\n                plt[i] = FXCMYK_TODIB(src_plt[i]);\n            }\n        } else {\n            for (int i = 0; i < plt_size; i ++) {\n                *bgr_ptr++ = FXARGB_B(src_plt[i]);\n                *bgr_ptr++ = FXARGB_G(src_plt[i]);\n                *bgr_ptr++ = FXARGB_R(src_plt[i]);\n            }\n            bgr_ptr = (FX_LPBYTE)plt;\n        }\n        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n        pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)plt, (FX_LPCBYTE)plt, plt_size);\n        for (int i = 0; i < plt_size; i ++) {\n            dst_plt[i] = FXARGB_MAKE(0xff, bgr_ptr[2], bgr_ptr[1], bgr_ptr[0]);\n            bgr_ptr += 3;\n        }\n    } else {\n        if (pSrcBitmap->IsCmykImage()) {\n            for (int i = 0; i < plt_size; i ++) {\n                FX_BYTE r, g, b;\n                AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]),\n                                   r, g, b);\n                dst_plt[i] = FXARGB_MAKE(0xff, r, g, b);\n            }\n        } else {\n            FXSYS_memcpy32(dst_plt, src_plt, plt_size * 4);\n        }\n    }\n    return TRUE;\n}\ninline FX_BOOL _ConvertBuffer_Rgb2PltRgb8_NoTransform(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,\n        const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD* dst_plt)\n{\n    int bpp = pSrcBitmap->GetBPP() / 8;\n    int row, col;\n    CFX_Palette palette;\n    palette.BuildPalette(pSrcBitmap, FXDIB_PALETTE_LOC);\n    FX_DWORD* cLut = palette.GetColorLut();\n    FX_DWORD* aLut = palette.GetAmountLut();\n    if (cLut == NULL || aLut == NULL) {\n        return FALSE;\n    }\n    int lut = palette.Getlut();\n    FX_DWORD* pPalette = palette.GetPalette();\n    if (lut > 256) {\n        int err, min_err;\n        int lut_256 = lut - 256;\n        for (row = 0; row < lut_256; row++) {\n            min_err = 1000000;\n            FX_BYTE r, g, b;\n            _ColorDecode(cLut[row], r, g, b);\n            int clrindex = 0;\n            for (int col = 0; col < 256; col++) {\n                FX_DWORD p_color = *(pPalette + col);\n                int d_r = r - (FX_BYTE)(p_color >> 16);\n                int d_g = g - (FX_BYTE)(p_color >> 8);\n                int d_b = b - (FX_BYTE)(p_color);\n                err = d_r * d_r + d_g * d_g + d_b * d_b;\n                if (err < min_err) {\n                    min_err = err;\n                    clrindex = col;\n                }\n            }\n            aLut[row] = clrindex;\n        }\n    }\n    FX_INT32 lut_1 = lut - 1;\n    for (row = 0; row < height; row ++) {\n        FX_BYTE* src_scan = (FX_BYTE*)pSrcBitmap->GetScanline(src_top + row) + src_left;\n        FX_BYTE* dest_scan = dest_buf + row * dest_pitch;\n        for (col = 0; col < width; col++) {\n            FX_BYTE* src_port = src_scan + col * bpp;\n            int r = src_port[2] & 0xf0;\n            int g = src_port[1] & 0xf0;\n            int b = src_port[0] & 0xf0;\n            FX_DWORD clrindex = (r << 4) + g + (b >> 4);\n            for (int i = lut_1; i >= 0; i--)\n                if (clrindex == cLut[i]) {\n                    *(dest_scan + col) = (FX_BYTE)(aLut[i]);\n                    break;\n                }\n        }\n    }\n    FXSYS_memcpy32(dst_plt, pPalette, sizeof(FX_DWORD) * 256);\n    return TRUE;\n}\nFX_BOOL _ConvertBuffer_Rgb2PltRgb8(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,\n                                   const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD* dst_plt, void* pIccTransform)\n{\n    ICodec_IccModule* pIccModule = NULL;\n    if (pIccTransform) {\n        pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n    }\n    FX_BOOL ret = _ConvertBuffer_Rgb2PltRgb8_NoTransform(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, dst_plt);\n    if (ret && pIccTransform) {\n        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n        for (int i = 0; i < 256; i++) {\n            FX_ARGB* plt = dst_plt + i;\n            FX_ARGB plt_entry = FXARGB_TODIB(*plt);\n            pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&plt_entry, (FX_LPCBYTE)&plt_entry, 1);\n            *plt = FXARGB_TODIB(plt_entry);\n        }\n    }\n    return ret;\n}\nFX_BOOL _ConvertBuffer_1bppMask2Rgb(FXDIB_Format dst_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,\n                                    const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)\n{\n    int comps = (dst_format & 0xff) / 8;\n    FX_BYTE set_gray, reset_gray;\n    set_gray = 0xff;\n    reset_gray = 0x00;\n    for (int row = 0; row < height; row ++) {\n        FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;\n        FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);\n        for (int col = src_left; col < src_left + width; col ++) {\n            if (src_scan[col / 8] & (1 << (7 - col % 8))) {\n                dest_scan[0] = set_gray;\n                dest_scan[1] = set_gray;\n                dest_scan[2] = set_gray;\n            } else {\n                dest_scan[0] = reset_gray;\n                dest_scan[1] = reset_gray;\n                dest_scan[2] = reset_gray;\n            }\n            dest_scan += comps;\n        }\n    }\n    return TRUE;\n}\nFX_BOOL _ConvertBuffer_8bppMask2Rgb(FXDIB_Format dst_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,\n                                    const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)\n{\n    int comps = (dst_format & 0xff) / 8;\n    for (int row = 0; row < height; row ++) {\n        FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;\n        FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;\n        FX_BYTE src_pixel;\n        for (int col = 0; col < width; col ++) {\n            src_pixel = *src_scan++;\n            *dest_scan++ = src_pixel;\n            *dest_scan++ = src_pixel;\n            *dest_scan   = src_pixel;\n            dest_scan += comps - 2;\n        }\n    }\n    return TRUE;\n}\nFX_BOOL _ConvertBuffer_1bppPlt2Rgb(FXDIB_Format dst_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,\n                                   const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)\n{\n    int comps = (dst_format & 0xff) / 8;\n    FX_DWORD* src_plt = pSrcBitmap->GetPalette();\n    FX_DWORD plt[2];\n    FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;\n    if (pSrcBitmap->IsCmykImage()) {\n        plt[0] = FXCMYK_TODIB(src_plt[0]);\n        plt[1] = FXCMYK_TODIB(src_plt[1]);\n    } else {\n        bgr_ptr[0] = FXARGB_B(src_plt[0]);\n        bgr_ptr[1] = FXARGB_G(src_plt[0]);\n        bgr_ptr[2] = FXARGB_R(src_plt[0]);\n        bgr_ptr[3] = FXARGB_B(src_plt[1]);\n        bgr_ptr[4] = FXARGB_G(src_plt[1]);\n        bgr_ptr[5] = FXARGB_R(src_plt[1]);\n    }\n    if (pIccTransform) {\n        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n        pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)plt, (FX_LPCBYTE)plt, 2);\n    } else {\n        if (pSrcBitmap->IsCmykImage()) {\n            AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[0]), FXSYS_GetMValue(src_plt[0]), FXSYS_GetYValue(src_plt[0]), FXSYS_GetKValue(src_plt[0]),\n                               bgr_ptr[2], bgr_ptr[1], bgr_ptr[0]);\n            AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[1]), FXSYS_GetMValue(src_plt[1]), FXSYS_GetYValue(src_plt[1]), FXSYS_GetKValue(src_plt[1]),\n                               bgr_ptr[5], bgr_ptr[4], bgr_ptr[3]);\n        }\n    }\n    for (int row = 0; row < height; row ++) {\n        FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;\n        FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);\n        for (int col = src_left; col < src_left + width; col ++) {\n            if (src_scan[col / 8] & (1 << (7 - col % 8))) {\n                *dest_scan++ = bgr_ptr[3];\n                *dest_scan++ = bgr_ptr[4];\n                *dest_scan   = bgr_ptr[5];\n            } else {\n                *dest_scan++ = bgr_ptr[0];\n                *dest_scan++ = bgr_ptr[1];\n                *dest_scan   = bgr_ptr[2];\n            }\n            dest_scan += comps - 2;\n        }\n    }\n    return TRUE;\n}\nFX_BOOL _ConvertBuffer_8bppPlt2Rgb(FXDIB_Format dst_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,\n                                   const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)\n{\n    int comps = (dst_format & 0xff) / 8;\n    FX_DWORD* src_plt = pSrcBitmap->GetPalette();\n    FX_DWORD plt[256];\n    FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;\n    if (!pSrcBitmap->IsCmykImage()) {\n        for (int i = 0; i < 256; i++) {\n            *bgr_ptr++ = FXARGB_B(src_plt[i]);\n            *bgr_ptr++ = FXARGB_G(src_plt[i]);\n            *bgr_ptr++ = FXARGB_R(src_plt[i]);\n        }\n        bgr_ptr = (FX_LPBYTE)plt;\n    }\n    if (pIccTransform) {\n        if (pSrcBitmap->IsCmykImage()) {\n            for (int i = 0; i < 256; i++) {\n                plt[i] = FXCMYK_TODIB(src_plt[i]);\n            }\n        }\n        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n        pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)plt, (FX_LPCBYTE)plt, 256);\n    } else {\n        if (pSrcBitmap->IsCmykImage()) {\n            for (int i = 0; i < 256; i++) {\n                AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]),\n                                   bgr_ptr[2], bgr_ptr[1], bgr_ptr[0]);\n                bgr_ptr += 3;\n            }\n            bgr_ptr = (FX_LPBYTE)plt;\n        }\n    }\n    for (int row = 0; row < height; row ++) {\n        FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;\n        FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;\n        for (int col = 0; col < width; col ++) {\n            FX_LPBYTE src_pixel = bgr_ptr + 3 * (*src_scan++);\n            *dest_scan++ = *src_pixel++;\n            *dest_scan++ = *src_pixel++;\n            *dest_scan   = *src_pixel++;\n            dest_scan += comps - 2;\n        }\n    }\n    return TRUE;\n}\nFX_BOOL _ConvertBuffer_24bppRgb2Rgb24(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,\n                                      const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)\n{\n    if (pIccTransform) {\n        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n        for (int row = 0; row < height; row ++) {\n            FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;\n            FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 3;\n            pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, width);\n        }\n    } else {\n        for (int row = 0; row < height; row ++) {\n            FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;\n            FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 3;\n            FXSYS_memcpy32(dest_scan, src_scan, width * 3);\n        }\n    }\n    return TRUE;\n}\nFX_BOOL _ConvertBuffer_32bppRgb2Rgb24(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,\n                                      const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)\n{\n    for (int row = 0; row < height; row ++) {\n        FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;\n        FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;\n        for (int col = 0; col < width; col ++) {\n            *dest_scan++ = *src_scan++;\n            *dest_scan++ = *src_scan++;\n            *dest_scan++ = *src_scan++;\n            src_scan++;\n        }\n    }\n    if (pIccTransform) {\n        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n        for (int row = 0; row < height; row ++) {\n            FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;\n            pIccModule->TranslateScanline(pIccTransform, dest_scan, dest_scan, width);\n        }\n    }\n    return TRUE;\n}\nFX_BOOL _ConvertBuffer_Rgb2Rgb32(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,\n                                 const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)\n{\n    int comps = pSrcBitmap->GetBPP() / 8;\n    if (pIccTransform) {\n        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n        for (int row = 0; row < height; row ++) {\n            FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;\n            FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * comps;\n            for (int col = 0; col < width; col ++) {\n                pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);\n                dest_scan += 4;\n                src_scan += comps;\n            }\n        }\n    } else {\n        for (int row = 0; row < height; row ++) {\n            FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;\n            FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * comps;\n            for (int col = 0; col < width; col ++) {\n                *dest_scan++ = *src_scan++;\n                *dest_scan++ = *src_scan++;\n                *dest_scan++ = *src_scan++;\n                dest_scan++;\n                src_scan += comps - 3;\n            }\n        }\n    }\n    return TRUE;\n}\nFX_BOOL _ConvertBuffer_32bppCmyk2Rgb32(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,\n                                       const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)\n{\n    if (pIccTransform) {\n        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n        for (int row = 0; row < height; row ++) {\n            FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;\n            FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;\n            for (int col = 0; col < width; col ++) {\n                pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);\n                dest_scan += 4;\n                src_scan += 4;\n            }\n        }\n    } else {\n        for (int row = 0; row < height; row ++) {\n            FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;\n            FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;\n            for (int col = 0; col < width; col ++) {\n                AdobeCMYK_to_sRGB1(src_scan[0], src_scan[1], src_scan[2], src_scan[3],\n                                   dest_scan[2], dest_scan[1], dest_scan[0]);\n                dest_scan += 4;\n                src_scan += 4;\n            }\n        }\n    }\n    return TRUE;\n}\nFX_BOOL ConvertBuffer(FXDIB_Format dest_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,\n                      const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD*& d_pal, void* pIccTransform)\n{\n    FXDIB_Format src_format = pSrcBitmap->GetFormat();\n    if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {\n        pIccTransform = NULL;\n    }\n    switch (dest_format) {\n        case FXDIB_Invalid:\n        case FXDIB_1bppCmyk:\n        case FXDIB_1bppMask:\n        case FXDIB_1bppRgb:\n            ASSERT(FALSE);\n            return FALSE;\n        case FXDIB_8bppMask: {\n                if ((src_format & 0xff) == 1) {\n                    if (pSrcBitmap->GetPalette()) {\n                        return _ConvertBuffer_1bppPlt2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);\n                    }\n                    return _ConvertBuffer_1bppMask2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);\n                } else if ((src_format & 0xff) == 8) {\n                    if (pSrcBitmap->GetPalette()) {\n                        return _ConvertBuffer_8bppPlt2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);\n                    }\n                    return _ConvertBuffer_8bppMask2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);\n                } else if ((src_format & 0xff) >= 24) {\n                    return _ConvertBuffer_RgbOrCmyk2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);\n                }\n                return FALSE;\n            }\n        case FXDIB_8bppRgb:\n        case FXDIB_8bppRgba: {\n                if ((src_format & 0xff) == 8 && pSrcBitmap->GetPalette() == NULL) {\n                    return ConvertBuffer(FXDIB_8bppMask, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, d_pal, pIccTransform);\n                }\n                d_pal = FX_Alloc(FX_DWORD, 256);\n                if (!d_pal) {\n                    return FALSE;\n                }\n                if (((src_format & 0xff) == 1 || (src_format & 0xff) == 8) && pSrcBitmap->GetPalette()) {\n                    return _ConvertBuffer_Plt2PltRgb8(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, d_pal, pIccTransform);\n                } else if ((src_format & 0xff) >= 24) {\n                    return _ConvertBuffer_Rgb2PltRgb8(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, d_pal, pIccTransform);\n                }\n                return FALSE;\n            }\n        case FXDIB_Rgb:\n        case FXDIB_Rgba: {\n                if ((src_format & 0xff) == 1) {\n                    if (pSrcBitmap->GetPalette()) {\n                        return _ConvertBuffer_1bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);\n                    }\n                    return _ConvertBuffer_1bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);\n                } else if ((src_format & 0xff) == 8) {\n                    if (pSrcBitmap->GetPalette()) {\n                        return _ConvertBuffer_8bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);\n                    }\n                    return _ConvertBuffer_8bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);\n                } else if ((src_format & 0xff) == 24) {\n                    return _ConvertBuffer_24bppRgb2Rgb24(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);\n                } else if ((src_format & 0xff) == 32) {\n                    return _ConvertBuffer_32bppRgb2Rgb24(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);\n                }\n                return FALSE;\n            }\n        case FXDIB_Argb:\n        case FXDIB_Rgb32: {\n                if ((src_format & 0xff) == 1) {\n                    if (pSrcBitmap->GetPalette()) {\n                        return _ConvertBuffer_1bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);\n                    }\n                    return _ConvertBuffer_1bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);\n                } else if ((src_format & 0xff) == 8) {\n                    if (pSrcBitmap->GetPalette()) {\n                        return _ConvertBuffer_8bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);\n                    }\n                    return _ConvertBuffer_8bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);\n                } else if ((src_format & 0xff) >= 24) {\n                    if (src_format & 0x0400) {\n                        return _ConvertBuffer_32bppCmyk2Rgb32(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);\n                    }\n                    return _ConvertBuffer_Rgb2Rgb32(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);\n                }\n                return FALSE;\n            }\n        default:\n            return FALSE;\n    }\n    return FALSE;\n}\nCFX_DIBitmap* CFX_DIBSource::CloneConvert(FXDIB_Format dest_format, const FX_RECT* pClip, void* pIccTransform) const\n{\n    if(dest_format == GetFormat() && pIccTransform == NULL) {\n        return Clone(pClip);\n    }\n    if (pClip) {\n        CFX_DIBitmap* pClone = Clone(pClip);\n        if (pClone == NULL) {\n            return NULL;\n        }\n        if(!pClone->ConvertFormat(dest_format, pIccTransform)) {\n            delete pClone;\n            return NULL;\n        }\n        return pClone;\n    }\n    CFX_DIBitmap* pClone = FX_NEW CFX_DIBitmap;\n    if (!pClone) {\n        return NULL;\n    }\n    if(!pClone->Create(m_Width, m_Height, dest_format)) {\n        delete pClone;\n        return NULL;\n    }\n    FX_BOOL ret = TRUE;\n    CFX_DIBitmap* pSrcAlpha = NULL;\n    if (m_AlphaFlag & 2) {\n        pSrcAlpha = (GetFormat() == FXDIB_Argb) ? GetAlphaMask() : m_pAlphaMask;\n        if (pSrcAlpha == NULL) {\n            delete pClone;\n            return NULL;\n        }\n    }\n    if (dest_format & 0x0200) {\n        if (dest_format == FXDIB_Argb)\n            ret = pSrcAlpha ?\n                  pClone->LoadChannel(FXDIB_Alpha, pSrcAlpha, FXDIB_Alpha) :\n                  pClone->LoadChannel(FXDIB_Alpha, 0xff);\n        else {\n            ret = pClone->CopyAlphaMask(pSrcAlpha);\n        }\n    }\n    if (pSrcAlpha && pSrcAlpha != m_pAlphaMask) {\n        delete pSrcAlpha;\n        pSrcAlpha = NULL;\n    }\n    if (!ret) {\n        delete pClone;\n        return NULL;\n    }\n    FX_DWORD* pal_8bpp = NULL;\n    ret = ConvertBuffer(dest_format, pClone->GetBuffer(), pClone->GetPitch(), m_Width, m_Height, this, 0, 0, pal_8bpp, pIccTransform);\n    if (!ret) {\n        if (pal_8bpp) {\n            FX_Free(pal_8bpp);\n        }\n        delete pClone;\n        return NULL;\n    }\n    if (pal_8bpp) {\n        pClone->CopyPalette(pal_8bpp);\n        FX_Free(pal_8bpp);\n        pal_8bpp = NULL;\n    }\n    return pClone;\n}\nFX_BOOL CFX_DIBitmap::ConvertFormat(FXDIB_Format dest_format, void* pIccTransform)\n{\n    FXDIB_Format src_format = GetFormat();\n    if (dest_format == src_format && pIccTransform == NULL) {\n        return TRUE;\n    }\n    if (dest_format == FXDIB_8bppMask && src_format == FXDIB_8bppRgb && m_pPalette == NULL) {\n        m_AlphaFlag = 1;\n        return TRUE;\n    }\n    if (dest_format == FXDIB_Argb && src_format == FXDIB_Rgb32 && pIccTransform == NULL) {\n        m_AlphaFlag = 2;\n        for (int row = 0; row < m_Height; row ++) {\n            FX_LPBYTE scanline = m_pBuffer + row * m_Pitch + 3;\n            for (int col = 0; col < m_Width; col ++) {\n                *scanline = 0xff;\n                scanline += 4;\n            }\n        }\n        return TRUE;\n    }\n    int dest_bpp = dest_format & 0xff;\n    int dest_pitch = (dest_bpp * m_Width + 31) / 32 * 4;\n    FX_LPBYTE dest_buf = FX_AllocNL(FX_BYTE, dest_pitch * m_Height + 4);\n    if (dest_buf == NULL) {\n        return FALSE;\n    }\n    CFX_DIBitmap* pAlphaMask = NULL;\n    if (dest_format == FXDIB_Argb) {\n        FXSYS_memset8(dest_buf, 0xff, dest_pitch * m_Height + 4);\n        if (m_pAlphaMask) {\n            for (int row = 0; row < m_Height; row ++) {\n                FX_LPBYTE pDstScanline = dest_buf + row * dest_pitch + 3;\n                FX_LPCBYTE pSrcScanline = m_pAlphaMask->GetScanline(row);\n                for (int col = 0; col < m_Width; col ++) {\n                    *pDstScanline = *pSrcScanline++;\n                    pDstScanline += 4;\n                }\n            }\n        }\n    } else if (dest_format & 0x0200) {\n        if (src_format == FXDIB_Argb) {\n            pAlphaMask = GetAlphaMask();\n            if (pAlphaMask == NULL) {\n                FX_Free(dest_buf);\n                return FALSE;\n            }\n        } else {\n            if (m_pAlphaMask == NULL) {\n                if (!BuildAlphaMask()) {\n                    FX_Free(dest_buf);\n                    return FALSE;\n                }\n                pAlphaMask = m_pAlphaMask;\n                m_pAlphaMask = NULL;\n            } else {\n                pAlphaMask = m_pAlphaMask;\n            }\n        }\n    }\n    FX_BOOL ret = FALSE;\n    FX_DWORD* pal_8bpp = NULL;\n    ret = ConvertBuffer(dest_format, dest_buf, dest_pitch, m_Width, m_Height, this, 0, 0, pal_8bpp, pIccTransform);\n    if (!ret) {\n        if (pal_8bpp) {\n            FX_Free(pal_8bpp);\n        }\n        if (pAlphaMask != m_pAlphaMask) {\n            delete pAlphaMask;\n        }\n        if (dest_buf) {\n            FX_Free(dest_buf);\n        }\n        return FALSE;\n    }\n    if (m_pAlphaMask && pAlphaMask != m_pAlphaMask) {\n        delete m_pAlphaMask;\n    }\n    m_pAlphaMask = pAlphaMask;\n    if (m_pPalette) {\n        FX_Free(m_pPalette);\n    }\n    m_pPalette = pal_8bpp;\n    if (!m_bExtBuf) {\n        FX_Free(m_pBuffer);\n    }\n    m_bExtBuf = FALSE;\n    m_pBuffer = dest_buf;\n    m_bpp = (FX_BYTE)dest_format;\n    m_AlphaFlag = (FX_BYTE)(dest_format >> 8);\n    m_Pitch = dest_pitch;\n    return TRUE;\n}\n"
  },
  {
    "path": "core/src/fxge/dib/fx_dib_engine.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxge/fx_dib.h\"\n#include \"../../../include/fxge/fx_ge.h\"\n#include \"dib_int.h\"\n#include <limits.h>\nextern int SDP_Table[513];\nvoid CWeightTable::Calc(int dest_len, int dest_min, int dest_max, int src_len, int src_min, int src_max, int flags)\n{\n    if (m_pWeightTables) {\n        FX_Free(m_pWeightTables);\n        m_pWeightTables = NULL;\n    }\n    double scale, base;\n    scale = FXSYS_Div((FX_FLOAT)(src_len), (FX_FLOAT)(dest_len));\n    if (dest_len < 0) {\n        base = (FX_FLOAT)(src_len);\n    } else {\n        base = 0;\n    }\n    int ext_size = flags & FXDIB_BICUBIC_INTERPOL ? 3 : 1;\n    m_ItemSize = sizeof(int) * 2 + (int)(sizeof(int) * (FXSYS_ceil(FXSYS_fabs((FX_FLOAT)scale)) + ext_size));\n    m_DestMin = dest_min;\n    if ((dest_max - dest_min) > (int)((1U << 30) - 4) / m_ItemSize) {\n        return;\n    }\n    m_pWeightTables = FX_AllocNL(FX_BYTE, (dest_max - dest_min) * m_ItemSize + 4);\n    if (m_pWeightTables == NULL) {\n        return;\n    }\n    if ((flags & FXDIB_NOSMOOTH) != 0 || FXSYS_fabs((FX_FLOAT)scale) < 1.0f) {\n        for (int dest_pixel = dest_min; dest_pixel < dest_max; dest_pixel ++) {\n            PixelWeight& pixel_weights = *GetPixelWeight(dest_pixel);\n            double src_pos = dest_pixel * scale + scale / 2 + base;\n            if (flags & FXDIB_INTERPOL) {\n                pixel_weights.m_SrcStart = (int)FXSYS_floor((FX_FLOAT)src_pos - 1.0f / 2);\n                pixel_weights.m_SrcEnd = (int)FXSYS_floor((FX_FLOAT)src_pos + 1.0f / 2);\n                if (pixel_weights.m_SrcStart < src_min) {\n                    pixel_weights.m_SrcStart = src_min;\n                }\n                if (pixel_weights.m_SrcEnd >= src_max) {\n                    pixel_weights.m_SrcEnd = src_max - 1;\n                }\n                if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) {\n                    pixel_weights.m_Weights[0] = 65536;\n                } else {\n                    pixel_weights.m_Weights[1] = FXSYS_round((FX_FLOAT)(src_pos - pixel_weights.m_SrcStart - 1.0f / 2) * 65536);\n                    pixel_weights.m_Weights[0] = 65536 - pixel_weights.m_Weights[1];\n                }\n            } else if (flags & FXDIB_BICUBIC_INTERPOL) {\n                pixel_weights.m_SrcStart = (int)FXSYS_floor((FX_FLOAT)src_pos - 1.0f / 2);\n                pixel_weights.m_SrcEnd = (int)FXSYS_floor((FX_FLOAT)src_pos + 1.0f / 2);\n                int start = pixel_weights.m_SrcStart - 1;\n                int end = pixel_weights.m_SrcEnd + 1;\n                if (start < src_min) {\n                    start = src_min;\n                }\n                if (end >= src_max) {\n                    end = src_max - 1;\n                }\n                if (pixel_weights.m_SrcStart < src_min) {\n                    src_pos += src_min - pixel_weights.m_SrcStart;\n                    pixel_weights.m_SrcStart = src_min;\n                }\n                if (pixel_weights.m_SrcEnd >= src_max) {\n                    pixel_weights.m_SrcEnd = src_max - 1;\n                }\n                int weight;\n                weight = FXSYS_round((FX_FLOAT)(src_pos - pixel_weights.m_SrcStart - 1.0f / 2) * 256);\n                if (start == end) {\n                    pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight] + SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;\n                } else if ((start == pixel_weights.m_SrcStart && (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd ||\n                            end == pixel_weights.m_SrcEnd) && start < end) || (start < pixel_weights.m_SrcStart && pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd && end == pixel_weights.m_SrcEnd)) {\n                    if (start < pixel_weights.m_SrcStart) {\n                        pixel_weights.m_Weights[0] = SDP_Table[256 + weight] << 8;\n                        pixel_weights.m_Weights[1] = (SDP_Table[weight] + SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;\n                    } else {\n                        if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) {\n                            pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight] + SDP_Table[256 - weight]) << 8;\n                            pixel_weights.m_Weights[1] = SDP_Table[512 - weight] << 8;\n                        } else {\n                            pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight]) << 8;\n                            pixel_weights.m_Weights[1] = (SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;\n                        }\n                    }\n                    if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) {\n                        pixel_weights.m_SrcEnd = end;\n                    }\n                    if (start < pixel_weights.m_SrcStart) {\n                        pixel_weights.m_SrcStart = start;\n                    }\n                } else if (start == pixel_weights.m_SrcStart &&\n                           start < pixel_weights.m_SrcEnd &&\n                           pixel_weights.m_SrcEnd < end) {\n                    pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight]) << 8;\n                    pixel_weights.m_Weights[1] = SDP_Table[256 - weight] << 8;\n                    pixel_weights.m_Weights[2] = SDP_Table[512 - weight] << 8;\n                    pixel_weights.m_SrcEnd = end;\n                } else if (start < pixel_weights.m_SrcStart &&\n                           pixel_weights.m_SrcStart < pixel_weights.m_SrcEnd &&\n                           pixel_weights.m_SrcEnd == end) {\n                    pixel_weights.m_Weights[0] = SDP_Table[256 + weight] << 8;\n                    pixel_weights.m_Weights[1] = SDP_Table[weight] << 8;\n                    pixel_weights.m_Weights[2] = (SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;\n                    pixel_weights.m_SrcStart = start;\n                } else {\n                    pixel_weights.m_Weights[0] = SDP_Table[256 + weight] << 8;\n                    pixel_weights.m_Weights[1] = SDP_Table[weight] << 8;\n                    pixel_weights.m_Weights[2] = SDP_Table[256 - weight] << 8;\n                    pixel_weights.m_Weights[3] = SDP_Table[512 - weight] << 8;\n                    pixel_weights.m_SrcStart = start;\n                    pixel_weights.m_SrcEnd = end;\n                }\n            } else {\n                pixel_weights.m_SrcStart = pixel_weights.m_SrcEnd = (int)FXSYS_floor((FX_FLOAT)src_pos);\n                if (pixel_weights.m_SrcStart < src_min) {\n                    pixel_weights.m_SrcStart = src_min;\n                }\n                if (pixel_weights.m_SrcEnd >= src_max) {\n                    pixel_weights.m_SrcEnd = src_max - 1;\n                }\n                pixel_weights.m_Weights[0] = 65536;\n            }\n        }\n        return;\n    }\n    for (int dest_pixel = dest_min; dest_pixel < dest_max; dest_pixel ++) {\n        PixelWeight& pixel_weights = *GetPixelWeight(dest_pixel);\n        double src_start = dest_pixel * scale + base;\n        double src_end = src_start + scale;\n        int start_i, end_i;\n        if (src_start < src_end) {\n            start_i = (int)FXSYS_floor((FX_FLOAT)src_start);\n            end_i = (int)FXSYS_ceil((FX_FLOAT)src_end);\n        } else {\n            start_i = (int)FXSYS_floor((FX_FLOAT)src_end);\n            end_i = (int)FXSYS_ceil((FX_FLOAT)src_start);\n        }\n        if (start_i < src_min) {\n            start_i = src_min;\n        }\n        if (end_i >= src_max) {\n            end_i = src_max - 1;\n        }\n        if (start_i > end_i) {\n            if (start_i >= src_max) {\n                start_i = src_max - 1;\n            }\n            pixel_weights.m_SrcStart = start_i;\n            pixel_weights.m_SrcEnd = start_i;\n            continue;\n        }\n        pixel_weights.m_SrcStart = start_i;\n        pixel_weights.m_SrcEnd = end_i;\n        for (int j = start_i; j <= end_i; j ++) {\n            double dest_start = FXSYS_Div((FX_FLOAT)(j) - base, scale);\n            double dest_end = FXSYS_Div((FX_FLOAT)(j + 1) - base, scale);\n            if (dest_start > dest_end) {\n                double temp = dest_start;\n                dest_start = dest_end;\n                dest_end = temp;\n            }\n            double area_start = dest_start > (FX_FLOAT)(dest_pixel) ? dest_start : (FX_FLOAT)(dest_pixel);\n            double area_end = dest_end > (FX_FLOAT)(dest_pixel + 1) ? (FX_FLOAT)(dest_pixel + 1) : dest_end;\n            double weight = area_start >= area_end ? 0.0f : area_end - area_start;\n            if (weight == 0 && j == end_i) {\n                pixel_weights.m_SrcEnd --;\n                break;\n            }\n            pixel_weights.m_Weights[j - start_i] = FXSYS_round((FX_FLOAT)(weight * 65536));\n        }\n    }\n}\nCStretchEngine::CStretchEngine(IFX_ScanlineComposer* pDestBitmap, FXDIB_Format dest_format,\n                               int dest_width, int dest_height, const FX_RECT& clip_rect,\n                               const CFX_DIBSource* pSrcBitmap, int flags)\n{\n    m_State = 0;\n    m_DestFormat = dest_format;\n    m_DestBpp = dest_format & 0xff;\n    m_SrcBpp = pSrcBitmap->GetFormat() & 0xff;\n    m_bHasAlpha = pSrcBitmap->GetFormat() & 0x200;\n    m_pSrcPalette = pSrcBitmap->GetPalette();\n    m_pDestBitmap = pDestBitmap;\n    m_DestWidth = dest_width;\n    m_DestHeight = dest_height;\n    m_pInterBuf = NULL;\n    m_pExtraAlphaBuf = NULL;\n    m_pDestMaskScanline = NULL;\n    m_DestClip = clip_rect;\n    FX_DWORD size = clip_rect.Width();\n    if (size && m_DestBpp > (int)(INT_MAX / size)) {\n        return;\n    }\n    size *= m_DestBpp;\n    if (size > INT_MAX - 31) {\n        return;\n    }\n    size += 31;\n    size = size / 32 * 4;\n    m_pDestScanline = FX_AllocNL(FX_BYTE, size);\n    if (m_pDestScanline == NULL) {\n        return;\n    }\n    if (dest_format == FXDIB_Rgb32) {\n        FXSYS_memset8(m_pDestScanline, 255, size);\n    }\n    m_InterPitch = (m_DestClip.Width() * m_DestBpp + 31) / 32 * 4;\n    m_ExtraMaskPitch = (m_DestClip.Width() * 8 + 31) / 32 * 4;\n    m_pInterBuf = NULL;\n    m_pSource = pSrcBitmap;\n    m_SrcWidth = pSrcBitmap->GetWidth();\n    m_SrcHeight = pSrcBitmap->GetHeight();\n    m_SrcPitch = (m_SrcWidth * m_SrcBpp + 31) / 32 * 4;\n    if ((flags & FXDIB_NOSMOOTH) == 0) {\n        FX_BOOL bInterpol = flags & FXDIB_INTERPOL || flags & FXDIB_BICUBIC_INTERPOL;\n        if (!bInterpol && FXSYS_abs(dest_width) != 0 && FXSYS_abs(dest_height) < m_SrcWidth * m_SrcHeight * 8 / FXSYS_abs(dest_width)) {\n            flags = FXDIB_INTERPOL;\n        }\n        m_Flags = flags;\n    } else {\n        m_Flags = FXDIB_NOSMOOTH;\n        if (flags & FXDIB_DOWNSAMPLE) {\n            m_Flags |= FXDIB_DOWNSAMPLE;\n        }\n    }\n    double scale_x = FXSYS_Div((FX_FLOAT)(m_SrcWidth), (FX_FLOAT)(m_DestWidth));\n    double scale_y = FXSYS_Div((FX_FLOAT)(m_SrcHeight), (FX_FLOAT)(m_DestHeight));\n    double base_x = m_DestWidth > 0 ? 0.0f : (FX_FLOAT)(m_DestWidth);\n    double base_y = m_DestHeight > 0 ? 0.0f : (FX_FLOAT)(m_DestHeight);\n    double src_left = FXSYS_Mul(scale_x, (FX_FLOAT)(clip_rect.left) + base_x);\n    double src_right = FXSYS_Mul(scale_x, (FX_FLOAT)(clip_rect.right) + base_x);\n    double src_top = FXSYS_Mul(scale_y, (FX_FLOAT)(clip_rect.top) + base_y);\n    double src_bottom = FXSYS_Mul(scale_y, (FX_FLOAT)(clip_rect.bottom) + base_y);\n    if (src_left > src_right) {\n        double temp = src_left;\n        src_left = src_right;\n        src_right = temp;\n    }\n    if (src_top > src_bottom) {\n        double temp = src_top;\n        src_top = src_bottom;\n        src_bottom = temp;\n    }\n    m_SrcClip.left = (int)FXSYS_floor((FX_FLOAT)src_left);\n    m_SrcClip.right = (int)FXSYS_ceil((FX_FLOAT)src_right);\n    m_SrcClip.top = (int)FXSYS_floor((FX_FLOAT)src_top);\n    m_SrcClip.bottom = (int)FXSYS_ceil((FX_FLOAT)src_bottom);\n    FX_RECT src_rect(0, 0, m_SrcWidth, m_SrcHeight);\n    m_SrcClip.Intersect(src_rect);\n    if (m_SrcBpp == 1) {\n        if (m_DestBpp == 8) {\n            m_TransMethod = 1;\n        } else {\n            m_TransMethod = 2;\n        }\n    } else if (m_SrcBpp == 8) {\n        if (m_DestBpp == 8) {\n            if (!m_bHasAlpha) {\n                m_TransMethod = 3;\n            } else {\n                m_TransMethod = 4;\n            }\n        } else {\n            if (!m_bHasAlpha) {\n                m_TransMethod = 5;\n            } else {\n                m_TransMethod = 6;\n            }\n        }\n    } else {\n        if (!m_bHasAlpha) {\n            m_TransMethod = 7;\n        } else {\n            m_TransMethod = 8;\n        }\n    }\n}\nFX_BOOL CStretchEngine::Continue(IFX_Pause* pPause)\n{\n    while (m_State == 1) {\n        if (ContinueStretchHorz(pPause)) {\n            return TRUE;\n        }\n        m_State = 2;\n        StretchVert();\n    }\n    return FALSE;\n}\nCStretchEngine::~CStretchEngine()\n{\n    if (m_pDestScanline) {\n        FX_Free(m_pDestScanline);\n    }\n    if (m_pInterBuf) {\n        FX_Free(m_pInterBuf);\n    }\n    if (m_pExtraAlphaBuf) {\n        FX_Free(m_pExtraAlphaBuf);\n    }\n    if (m_pDestMaskScanline) {\n        FX_Free(m_pDestMaskScanline);\n    }\n}\nFX_BOOL CStretchEngine::StartStretchHorz()\n{\n    if (m_DestWidth == 0 || m_pDestScanline == NULL || m_SrcClip.Height() > (int)((1U << 29) / m_InterPitch) || m_SrcClip.Height() == 0) {\n        return FALSE;\n    }\n#ifndef _FPDFAPI_MINI_\n    m_pInterBuf = FX_AllocNL(unsigned char, m_SrcClip.Height() * m_InterPitch);\n#else\n    m_pInterBuf = FX_Alloc(unsigned char, m_SrcClip.Height() * m_InterPitch);\n#endif\n    if (m_pInterBuf == NULL) {\n        return FALSE;\n    }\n    if (m_pSource && m_bHasAlpha && m_pSource->m_pAlphaMask) {\n        m_pExtraAlphaBuf = FX_Alloc(unsigned char, m_SrcClip.Height() * m_ExtraMaskPitch);\n        if (!m_pExtraAlphaBuf) {\n            return FALSE;\n        }\n        FX_DWORD size = (m_DestClip.Width() * 8 + 31) / 32 * 4;\n        m_pDestMaskScanline = FX_AllocNL(unsigned char, size);\n        if (!m_pDestMaskScanline) {\n            return FALSE;\n        }\n    }\n    m_WeightTable.Calc(m_DestWidth, m_DestClip.left, m_DestClip.right, m_SrcWidth, m_SrcClip.left, m_SrcClip.right, m_Flags);\n    if (m_WeightTable.m_pWeightTables == NULL) {\n        return FALSE;\n    }\n    m_CurRow = m_SrcClip.top;\n    m_State = 1;\n    return TRUE;\n}\n#define FX_STRECH_PAUSE_ROWS\t10\nFX_BOOL CStretchEngine::ContinueStretchHorz(IFX_Pause* pPause)\n{\n    if (!m_DestWidth) {\n        return 0;\n    }\n    if (m_pSource->SkipToScanline(m_CurRow, pPause)) {\n        return TRUE;\n    }\n    int Bpp = m_DestBpp / 8;\n    int rows_to_go = FX_STRECH_PAUSE_ROWS;\n    for (; m_CurRow < m_SrcClip.bottom; m_CurRow ++) {\n        if (rows_to_go == 0) {\n            if (pPause && pPause->NeedToPauseNow()) {\n                return TRUE;\n            } else {\n                rows_to_go = FX_STRECH_PAUSE_ROWS;\n            }\n        }\n        FX_LPCBYTE src_scan = m_pSource->GetScanline(m_CurRow);\n        FX_LPBYTE dest_scan = m_pInterBuf + (m_CurRow - m_SrcClip.top) * m_InterPitch;\n        FX_LPCBYTE src_scan_mask = NULL;\n        FX_LPBYTE dest_scan_mask = NULL;\n        if (m_pExtraAlphaBuf) {\n            src_scan_mask = m_pSource->m_pAlphaMask->GetScanline(m_CurRow);\n            dest_scan_mask = m_pExtraAlphaBuf + (m_CurRow - m_SrcClip.top) * m_ExtraMaskPitch;\n        }\n        switch (m_TransMethod) {\n            case 1:\n            case 2: {\n                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {\n                        PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);\n                        int dest_a = 0;\n                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {\n                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];\n                            if (src_scan[j / 8] & (1 << (7 - j % 8))) {\n                                dest_a += pixel_weight * 255;\n                            }\n                        }\n                        if (m_Flags & FXDIB_BICUBIC_INTERPOL) {\n                            dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;\n                        }\n                        *dest_scan++ = (FX_BYTE)(dest_a >> 16);\n                    }\n                    break;\n                }\n            case 3: {\n                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {\n                        PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);\n                        int dest_a = 0;\n                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {\n                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];\n                            dest_a += pixel_weight * src_scan[j];\n                        }\n                        if (m_Flags & FXDIB_BICUBIC_INTERPOL) {\n                            dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;\n                        }\n                        *dest_scan++ = (FX_BYTE)(dest_a >> 16);\n                    }\n                    break;\n                }\n            case 4: {\n                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {\n                        PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);\n                        int dest_a = 0, dest_r = 0;\n                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {\n                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];\n                            pixel_weight = pixel_weight * src_scan_mask[j] / 255;\n                            dest_r += pixel_weight * src_scan[j];\n                            dest_a += pixel_weight;\n                        }\n                        if (m_Flags & FXDIB_BICUBIC_INTERPOL) {\n                            dest_r = dest_r < 0 ? 0 : dest_r > 16711680 ? 16711680 : dest_r;\n                            dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a;\n                        }\n                        *dest_scan++ = (FX_BYTE)(dest_r >> 16);\n                        *dest_scan_mask++ = (FX_BYTE)((dest_a * 255) >> 16);\n                    }\n                    break;\n                }\n            case 5: {\n                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {\n                        PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);\n                        int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;\n                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {\n                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];\n                            unsigned long argb_cmyk = m_pSrcPalette[src_scan[j]];\n                            if (m_DestFormat == FXDIB_Rgb) {\n                                dest_r_y += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);\n                                dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);\n                                dest_b_c += pixel_weight * (FX_BYTE)argb_cmyk;\n                            } else {\n                                dest_b_c += pixel_weight * (FX_BYTE)(argb_cmyk >> 24);\n                                dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);\n                                dest_r_y += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);\n                            }\n                        }\n                        if (m_Flags & FXDIB_BICUBIC_INTERPOL) {\n                            dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;\n                            dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;\n                            dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;\n                        }\n                        *dest_scan++ = (FX_BYTE)(dest_b_c >> 16);\n                        *dest_scan++ = (FX_BYTE)(dest_g_m >> 16);\n                        *dest_scan++ = (FX_BYTE)(dest_r_y >> 16);\n                    }\n                    break;\n                }\n            case 6: {\n                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {\n                        PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);\n                        int dest_a = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;\n                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {\n                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];\n                            pixel_weight = pixel_weight * src_scan_mask[j] / 255;\n                            unsigned long argb_cmyk = m_pSrcPalette[src_scan[j]];\n                            if (m_DestFormat == FXDIB_Rgba) {\n                                dest_r_y += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);\n                                dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);\n                                dest_b_c += pixel_weight * (FX_BYTE)argb_cmyk;\n                            } else {\n                                dest_b_c += pixel_weight * (FX_BYTE)(argb_cmyk >> 24);\n                                dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);\n                                dest_r_y += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);\n                            }\n                            dest_a += pixel_weight;\n                        }\n                        if (m_Flags & FXDIB_BICUBIC_INTERPOL) {\n                            dest_k = dest_k < 0 ? 0 : dest_k > 16711680 ? 16711680 : dest_k;\n                            dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;\n                            dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;\n                            dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;\n                            dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a;\n                        }\n                        *dest_scan++ = (FX_BYTE)(dest_b_c >> 16);\n                        *dest_scan++ = (FX_BYTE)(dest_g_m >> 16);\n                        *dest_scan++ = (FX_BYTE)(dest_r_y >> 16);\n                        *dest_scan_mask++ = (FX_BYTE)((dest_a * 255) >> 16);\n                    }\n                    break;\n                }\n            case 7: {\n                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {\n                        PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);\n                        int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;\n                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {\n                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];\n                            FX_LPCBYTE src_pixel = src_scan + j * Bpp;\n                            dest_b_c += pixel_weight * (*src_pixel++);\n                            dest_g_m += pixel_weight * (*src_pixel++);\n                            dest_r_y += pixel_weight * (*src_pixel);\n                        }\n                        if (m_Flags & FXDIB_BICUBIC_INTERPOL) {\n                            dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;\n                            dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;\n                            dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;\n                        }\n                        *dest_scan++ = (FX_BYTE)((dest_b_c) >> 16);\n                        *dest_scan++ = (FX_BYTE)((dest_g_m) >> 16);\n                        *dest_scan++ = (FX_BYTE)((dest_r_y) >> 16);\n                        dest_scan += Bpp - 3;\n                    }\n                    break;\n                }\n            case 8: {\n                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {\n                        PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);\n                        int dest_a = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;\n                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {\n                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];\n                            FX_LPCBYTE src_pixel = src_scan + j * Bpp;\n                            if (m_DestFormat == FXDIB_Argb) {\n                                pixel_weight = pixel_weight * src_pixel[3] / 255;\n                            } else {\n                                pixel_weight = pixel_weight * src_scan_mask[j] / 255;\n                            }\n                            dest_b_c += pixel_weight * (*src_pixel++);\n                            dest_g_m += pixel_weight * (*src_pixel++);\n                            dest_r_y += pixel_weight * (*src_pixel);\n                            dest_a += pixel_weight;\n                        }\n                        if (m_Flags & FXDIB_BICUBIC_INTERPOL) {\n                            dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;\n                            dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;\n                            dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;\n                            dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a;\n                        }\n                        *dest_scan++ = (FX_BYTE)((dest_b_c) >> 16);\n                        *dest_scan++ = (FX_BYTE)((dest_g_m) >> 16);\n                        *dest_scan++ = (FX_BYTE)((dest_r_y) >> 16);\n                        if (m_DestFormat == FXDIB_Argb) {\n                            *dest_scan = (FX_BYTE)((dest_a * 255) >> 16);\n                        }\n                        if (dest_scan_mask) {\n                            *dest_scan_mask++ = (FX_BYTE)((dest_a * 255) >> 16);\n                        }\n                        dest_scan += Bpp - 3;\n                    }\n                    break;\n                }\n        }\n        rows_to_go --;\n    }\n    return FALSE;\n}\nvoid CStretchEngine::StretchVert()\n{\n    if (m_DestHeight == 0) {\n        return;\n    }\n    CWeightTable table;\n    table.Calc(m_DestHeight, m_DestClip.top, m_DestClip.bottom, m_SrcHeight, m_SrcClip.top, m_SrcClip.bottom, m_Flags);\n    if (table.m_pWeightTables == NULL) {\n        return;\n    }\n    int DestBpp = m_DestBpp / 8;\n    for (int row = m_DestClip.top; row < m_DestClip.bottom; row ++) {\n        unsigned char* dest_scan = m_pDestScanline;\n        unsigned char* dest_sacn_mask = m_pDestMaskScanline;\n        PixelWeight* pPixelWeights = table.GetPixelWeight(row);\n        switch(m_TransMethod) {\n            case 1:\n            case 2:\n            case 3: {\n                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {\n                        unsigned char* src_scan = m_pInterBuf + (col - m_DestClip.left) * DestBpp;\n                        int dest_a = 0;\n                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {\n                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];\n                            dest_a += pixel_weight * src_scan[(j - m_SrcClip.top) * m_InterPitch];\n                        }\n                        if (m_Flags & FXDIB_BICUBIC_INTERPOL) {\n                            dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;\n                        }\n                        *dest_scan = (FX_BYTE)(dest_a >> 16);\n                        dest_scan += DestBpp;\n                    }\n                    break;\n                }\n            case 4: {\n                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {\n                        unsigned char* src_scan = m_pInterBuf + (col - m_DestClip.left) * DestBpp;\n                        unsigned char* src_scan_mask = m_pExtraAlphaBuf + (col - m_DestClip.left);\n                        int dest_a = 0, dest_k = 0;\n                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {\n                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];\n                            dest_k += pixel_weight * src_scan[(j - m_SrcClip.top) * m_InterPitch];\n                            dest_a += pixel_weight * src_scan_mask[(j - m_SrcClip.top) * m_ExtraMaskPitch];\n                        }\n                        if (m_Flags & FXDIB_BICUBIC_INTERPOL) {\n                            dest_k = dest_k < 0 ? 0 : dest_k > 16711680 ? 16711680 : dest_k;\n                            dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;\n                        }\n                        *dest_scan = (FX_BYTE)(dest_k >> 16);\n                        dest_scan += DestBpp;\n                        *dest_sacn_mask++ = (FX_BYTE)(dest_a >> 16);\n                    }\n                    break;\n                }\n            case 5:\n            case 7: {\n                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {\n                        unsigned char* src_scan = m_pInterBuf + (col - m_DestClip.left) * DestBpp;\n                        int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;\n                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {\n                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];\n                            FX_LPCBYTE src_pixel = src_scan + (j - m_SrcClip.top) * m_InterPitch;\n                            dest_b_c += pixel_weight * (*src_pixel++);\n                            dest_g_m += pixel_weight * (*src_pixel++);\n                            dest_r_y += pixel_weight * (*src_pixel);\n                        }\n                        if (m_Flags & FXDIB_BICUBIC_INTERPOL) {\n                            dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;\n                            dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;\n                            dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;\n                        }\n                        dest_scan[0] = (FX_BYTE)((dest_b_c) >> 16);\n                        dest_scan[1] = (FX_BYTE)((dest_g_m) >> 16);\n                        dest_scan[2] = (FX_BYTE)((dest_r_y) >> 16);\n                        dest_scan += DestBpp;\n                    }\n                    break;\n                }\n            case 6:\n            case 8: {\n                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {\n                        unsigned char* src_scan = m_pInterBuf + (col - m_DestClip.left) * DestBpp;\n                        unsigned char* src_scan_mask = NULL;\n                        if (m_DestFormat != FXDIB_Argb) {\n                            src_scan_mask = m_pExtraAlphaBuf + (col - m_DestClip.left);\n                        }\n                        int dest_a = 0, dest_k = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0;\n                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {\n                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];\n                            FX_LPCBYTE src_pixel = src_scan + (j - m_SrcClip.top) * m_InterPitch;\n                            int mask_v = 255;\n                            if (src_scan_mask) {\n                                mask_v = src_scan_mask[(j - m_SrcClip.top) * m_ExtraMaskPitch];\n                            }\n                            dest_b_c += pixel_weight * (*src_pixel++);\n                            dest_g_m += pixel_weight * (*src_pixel++);\n                            dest_r_y += pixel_weight * (*src_pixel);\n                            if (m_DestFormat == FXDIB_Argb) {\n                                dest_a += pixel_weight * (*(src_pixel + 1));\n                            } else {\n                                dest_a += pixel_weight * mask_v;\n                            }\n                        }\n                        if (m_Flags & FXDIB_BICUBIC_INTERPOL) {\n                            dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;\n                            dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;\n                            dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;\n                            dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;\n                        }\n                        if (dest_a) {\n                            int r = ((FX_DWORD)dest_r_y) * 255 / dest_a;\n                            int g = ((FX_DWORD)dest_g_m) * 255 / dest_a;\n                            int b = ((FX_DWORD)dest_b_c) * 255 / dest_a;\n                            dest_scan[0] = b > 255 ? 255 : b < 0 ? 0 : b;\n                            dest_scan[1] = g > 255 ? 255 : g < 0 ? 0 : g;\n                            dest_scan[2] = r > 255 ? 255 : r < 0 ? 0 : r;\n                        }\n                        if (m_DestFormat == FXDIB_Argb) {\n                            dest_scan[3] = (FX_BYTE)((dest_a) >> 16);\n                        } else {\n                            *dest_sacn_mask = (FX_BYTE)((dest_a) >> 16);\n                        }\n                        dest_scan += DestBpp;\n                        if (dest_sacn_mask) {\n                            dest_sacn_mask++;\n                        }\n                    }\n                    break;\n                }\n        }\n        m_pDestBitmap->ComposeScanline(row - m_DestClip.top, m_pDestScanline, m_pDestMaskScanline);\n    }\n}\nCFX_ImageStretcher::CFX_ImageStretcher()\n{\n    m_pScanline = NULL;\n    m_pStretchEngine = NULL;\n    m_pMaskScanline = NULL;\n}\nCFX_ImageStretcher::~CFX_ImageStretcher()\n{\n    if (m_pScanline) {\n        FX_Free(m_pScanline);\n    }\n    if (m_pStretchEngine) {\n        delete m_pStretchEngine;\n    }\n    if (m_pMaskScanline) {\n        FX_Free(m_pMaskScanline);\n    }\n}\nFXDIB_Format _GetStretchedFormat(const CFX_DIBSource* pSrc)\n{\n    FXDIB_Format format = pSrc->GetFormat();\n    if (format == FXDIB_1bppMask) {\n        format = FXDIB_8bppMask;\n    } else if (format == FXDIB_1bppRgb) {\n        format = FXDIB_8bppRgb;\n    } else if (format == FXDIB_8bppRgb) {\n        if (pSrc->GetPalette()) {\n            format = FXDIB_Rgb;\n        }\n    }\n    return format;\n}\nFX_BOOL CFX_ImageStretcher::Start(IFX_ScanlineComposer* pDest,\n                                  const CFX_DIBSource* pSource, int dest_width, int dest_height,\n                                  const FX_RECT& rect, FX_DWORD flags)\n{\n    m_DestFormat = _GetStretchedFormat(pSource);\n    m_DestBPP = m_DestFormat & 0xff;\n    m_pDest = pDest;\n    m_pSource = pSource;\n    m_DestWidth = dest_width;\n    m_DestHeight = dest_height;\n    m_ClipRect = rect;\n    m_Flags = flags;\n    if (pSource->GetFormat() == FXDIB_1bppRgb && pSource->GetPalette()) {\n        FX_ARGB pal[256];\n        int a0, r0, g0, b0, a1, r1, g1, b1;\n        ArgbDecode(pSource->GetPaletteEntry(0), a0, r0, g0, b0);\n        ArgbDecode(pSource->GetPaletteEntry(1), a1, r1, g1, b1);\n        for (int i = 0; i < 256; i ++) {\n            int a = a0 + (a1 - a0) * i / 255;\n            int r = r0 + (r1 - r0) * i / 255;\n            int g = g0 + (g1 - g0) * i / 255;\n            int b = b0 + (b1 - b0) * i / 255;\n            pal[i] = ArgbEncode(a, r, g, b);\n        }\n        if (!pDest->SetInfo(rect.Width(), rect.Height(), m_DestFormat, pal)) {\n            return FALSE;\n        }\n    } else if (pSource->GetFormat() == FXDIB_1bppCmyk && pSource->GetPalette()) {\n        FX_CMYK pal[256];\n        int c0, m0, y0, k0, c1, m1, y1, k1;\n        CmykDecode(pSource->GetPaletteEntry(0), c0, m0, y0, k0);\n        CmykDecode(pSource->GetPaletteEntry(1), c1, m1, y1, k1);\n        for (int i = 0; i < 256; i ++) {\n            int c = c0 + (c1 - c0) * i / 255;\n            int m = m0 + (m1 - m0) * i / 255;\n            int y = y0 + (y1 - y0) * i / 255;\n            int k = k0 + (k1 - k0) * i / 255;\n            pal[i] = CmykEncode(c, m, y, k);\n        }\n        if (!pDest->SetInfo(rect.Width(), rect.Height(), m_DestFormat, pal)) {\n            return FALSE;\n        }\n    } else if (!pDest->SetInfo(rect.Width(), rect.Height(), m_DestFormat, NULL)) {\n        return FALSE;\n    }\n    if (flags & FXDIB_DOWNSAMPLE) {\n        return StartQuickStretch();\n    } else {\n        return StartStretch();\n    }\n}\nFX_BOOL CFX_ImageStretcher::Continue(IFX_Pause* pPause)\n{\n    if (m_Flags & FXDIB_DOWNSAMPLE) {\n        return ContinueQuickStretch(pPause);\n    } else {\n        return ContinueStretch(pPause);\n    }\n}\n#ifndef _FPDFAPI_MINI_\n#define MAX_PROGRESSIVE_STRETCH_PIXELS\t1000000\n#else\n#define MAX_PROGRESSIVE_STRETCH_PIXELS\t100000\n#endif\nFX_BOOL CFX_ImageStretcher::StartStretch()\n{\n    m_pStretchEngine = FX_NEW CStretchEngine(m_pDest, m_DestFormat, m_DestWidth, m_DestHeight, m_ClipRect, m_pSource, m_Flags);\n    if (!m_pStretchEngine) {\n        return FALSE;\n    }\n    m_pStretchEngine->StartStretchHorz();\n    if (m_pSource->GetWidth() * m_pSource->GetHeight() < MAX_PROGRESSIVE_STRETCH_PIXELS) {\n        m_pStretchEngine->Continue(NULL);\n        return FALSE;\n    }\n    return TRUE;\n}\nFX_BOOL CFX_ImageStretcher::ContinueStretch(IFX_Pause* pPause)\n{\n    if (m_pStretchEngine == NULL) {\n        return FALSE;\n    }\n    return m_pStretchEngine->Continue(pPause);\n}\nFX_BOOL CFX_ImageStretcher::StartQuickStretch()\n{\n#ifdef _FPDFAPI_MINI_\n    m_pSource->SetDownSampleSize(m_DestWidth, m_DestHeight);\n#endif\n    m_bFlipX = FALSE;\n    m_bFlipY = FALSE;\n    if (m_DestWidth < 0) {\n        m_bFlipX = TRUE;\n        m_DestWidth = -m_DestWidth;\n    }\n    if (m_DestHeight < 0) {\n        m_bFlipY = TRUE;\n        m_DestHeight = -m_DestHeight;\n    }\n    m_LineIndex = 0;\n    FX_DWORD size = m_ClipRect.Width();\n    if (size && m_DestBPP > (int)(INT_MAX / size)) {\n        return FALSE;\n    }\n    size *= m_DestBPP;\n    m_pScanline = FX_Alloc(FX_BYTE, (size / 8 + 3) / 4 * 4);\n    if (!m_pScanline) {\n        return FALSE;\n    }\n    if (m_pSource->m_pAlphaMask) {\n        m_pMaskScanline = FX_Alloc(FX_BYTE, (m_ClipRect.Width() + 3) / 4 * 4);\n        if (!m_pMaskScanline) {\n            return FALSE;\n        }\n    }\n    if (m_pSource->GetWidth() * m_pSource->GetHeight() < MAX_PROGRESSIVE_STRETCH_PIXELS) {\n        ContinueQuickStretch(NULL);\n        return FALSE;\n    }\n    return TRUE;\n}\nFX_BOOL CFX_ImageStretcher::ContinueQuickStretch(IFX_Pause* pPause)\n{\n    if (m_pScanline == NULL) {\n        return FALSE;\n    }\n    int result_width = m_ClipRect.Width(), result_height = m_ClipRect.Height();\n    int src_width = m_pSource->GetWidth(), src_height = m_pSource->GetHeight();\n    for (; m_LineIndex < result_height; m_LineIndex ++) {\n        int dest_y, src_y;\n        if (m_bFlipY) {\n            dest_y = result_height - m_LineIndex - 1;\n            src_y = (m_DestHeight - (dest_y + m_ClipRect.top) - 1) * src_height / m_DestHeight;\n        } else {\n            dest_y = m_LineIndex;\n            src_y = (dest_y + m_ClipRect.top) * src_height / m_DestHeight;\n        }\n        if (src_y >= src_height) {\n            src_y = src_height - 1;\n        }\n        if (src_y < 0) {\n            src_y = 0;\n        }\n        if (m_pSource->SkipToScanline(src_y, pPause)) {\n            return TRUE;\n        }\n        m_pSource->DownSampleScanline(src_y, m_pScanline, m_DestBPP, m_DestWidth, m_bFlipX, m_ClipRect.left, result_width);\n        FX_LPBYTE scan_extra_alpha = NULL;\n        if (m_pMaskScanline) {\n            m_pSource->m_pAlphaMask->DownSampleScanline(src_y, m_pMaskScanline, 1, m_DestWidth, m_bFlipX, m_ClipRect.left, result_width);\n        }\n        m_pDest->ComposeScanline(dest_y, m_pScanline, m_pMaskScanline);\n    }\n    return FALSE;\n}\n"
  },
  {
    "path": "core/src/fxge/dib/fx_dib_main.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxge/fx_dib.h\"\n#include \"../../../include/fxge/fx_ge.h\"\n#include \"../../../include/fxcodec/fx_codec.h\"\n#include \"dib_int.h\"\n#include <limits.h>\nFX_BOOL ConvertBuffer(FXDIB_Format dest_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,\n                      const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD*& pal, void* pIccTransform);\nvoid CmykDecode(FX_DWORD cmyk, int& c, int& m, int& y, int& k)\n{\n    c = FXSYS_GetCValue(cmyk);\n    m = FXSYS_GetMValue(cmyk);\n    y = FXSYS_GetYValue(cmyk);\n    k = FXSYS_GetKValue(cmyk);\n}\nvoid ArgbDecode(FX_DWORD argb, int& a, int& r, int& g, int& b)\n{\n    a = FXARGB_A(argb);\n    r = FXARGB_R(argb);\n    g = FXARGB_G(argb);\n    b = FXARGB_B(argb);\n}\nvoid ArgbDecode(FX_DWORD argb, int& a, FX_COLORREF& rgb)\n{\n    a = FXARGB_A(argb);\n    rgb = FXSYS_RGB(FXARGB_R(argb), FXARGB_G(argb), FXARGB_B(argb));\n}\nFX_DWORD ArgbEncode(int a, FX_COLORREF rgb)\n{\n    return FXARGB_MAKE(a, FXSYS_GetRValue(rgb), FXSYS_GetGValue(rgb), FXSYS_GetBValue(rgb));\n}\nCFX_DIBSource::CFX_DIBSource()\n{\n    m_bpp = 0;\n    m_AlphaFlag = 0;\n    m_Width = m_Height = 0;\n    m_Pitch = 0;\n    m_pPalette = NULL;\n    m_pAlphaMask = NULL;\n}\nCFX_DIBSource::~CFX_DIBSource()\n{\n    if (m_pPalette) {\n        FX_Free(m_pPalette);\n    }\n    if (m_pAlphaMask) {\n        delete m_pAlphaMask;\n    }\n}\nCFX_DIBitmap::CFX_DIBitmap()\n{\n    m_bExtBuf = FALSE;\n    m_pBuffer = NULL;\n    m_pPalette = NULL;\n}\n#define _MAX_OOM_LIMIT_\t12000000\nFX_BOOL CFX_DIBitmap::Create(int width, int height, FXDIB_Format format, FX_LPBYTE pBuffer, int pitch)\n{\n    m_pBuffer = NULL;\n    m_bpp = (FX_BYTE)format;\n    m_AlphaFlag = (FX_BYTE)(format >> 8);\n    m_Width = m_Height = m_Pitch = 0;\n    if (width <= 0 || height <= 0 || pitch < 0) {\n        return FALSE;\n    }\n    if ((INT_MAX - 31) / width < (format & 0xff)) {\n        return FALSE;\n    }\n    if (!pitch) {\n        pitch = (width * (format & 0xff) + 31) / 32 * 4;\n    }\n    if ((1 << 30) / pitch < height) {\n        return FALSE;\n    }\n    if (pBuffer) {\n        m_pBuffer = pBuffer;\n        m_bExtBuf = TRUE;\n    } else {\n        int size = pitch * height + 4;\n        int oomlimit = _MAX_OOM_LIMIT_;\n        if (oomlimit >= 0 && size >= oomlimit) {\n            m_pBuffer = FX_AllocNL(FX_BYTE, size);\n        } else {\n            m_pBuffer = FX_Alloc(FX_BYTE, size);\n        }\n        if (m_pBuffer == NULL) {\n            return FALSE;\n        }\n    }\n    m_Width = width;\n    m_Height = height;\n    m_Pitch = pitch;\n    if (HasAlpha() && format != FXDIB_Argb) {\n        FX_BOOL ret = TRUE;\n        ret = BuildAlphaMask();\n        if (!ret) {\n            if (!m_bExtBuf && m_pBuffer) {\n                FX_Free(m_pBuffer);\n                m_pBuffer = NULL;\n                m_Width = m_Height = m_Pitch = 0;\n                return FALSE;\n            }\n        }\n    }\n    return TRUE;\n}\nFX_BOOL CFX_DIBitmap::Copy(const CFX_DIBSource* pSrc)\n{\n    if (m_pBuffer) {\n        return FALSE;\n    }\n    if (!Create(pSrc->GetWidth(), pSrc->GetHeight(), pSrc->GetFormat())) {\n        return FALSE;\n    }\n    CopyPalette(pSrc->GetPalette());\n    CopyAlphaMask(pSrc->m_pAlphaMask);\n    for (int row = 0; row < pSrc->GetHeight(); row ++) {\n        FXSYS_memcpy32(m_pBuffer + row * m_Pitch, pSrc->GetScanline(row), m_Pitch);\n    }\n    return TRUE;\n}\nCFX_DIBitmap::~CFX_DIBitmap()\n{\n    if (m_pBuffer && !m_bExtBuf) {\n        FX_Free(m_pBuffer);\n    }\n    m_pBuffer = NULL;\n}\nvoid CFX_DIBitmap::TakeOver(CFX_DIBitmap* pSrcBitmap)\n{\n    if (m_pBuffer && !m_bExtBuf) {\n        FX_Free(m_pBuffer);\n    }\n    if (m_pPalette) {\n        FX_Free(m_pPalette);\n    }\n    if (m_pAlphaMask) {\n        delete m_pAlphaMask;\n    }\n    m_pBuffer = pSrcBitmap->m_pBuffer;\n    m_pPalette = pSrcBitmap->m_pPalette;\n    m_pAlphaMask = pSrcBitmap->m_pAlphaMask;\n    pSrcBitmap->m_pBuffer = NULL;\n    pSrcBitmap->m_pPalette = NULL;\n    pSrcBitmap->m_pAlphaMask = NULL;\n    m_bpp = pSrcBitmap->m_bpp;\n    m_bExtBuf = pSrcBitmap->m_bExtBuf;\n    m_AlphaFlag = pSrcBitmap->m_AlphaFlag;\n    m_Width = pSrcBitmap->m_Width;\n    m_Height = pSrcBitmap->m_Height;\n    m_Pitch = pSrcBitmap->m_Pitch;\n}\nCFX_DIBitmap* CFX_DIBSource::Clone(const FX_RECT* pClip) const\n{\n    FX_RECT rect(0, 0, m_Width, m_Height);\n    if (pClip) {\n        rect.Intersect(*pClip);\n        if (rect.IsEmpty()) {\n            return NULL;\n        }\n    }\n    CFX_DIBitmap* pNewBitmap = FX_NEW CFX_DIBitmap;\n    if (!pNewBitmap) {\n        return NULL;\n    }\n    if (!pNewBitmap->Create(rect.Width(), rect.Height(), GetFormat())) {\n        delete pNewBitmap;\n        return NULL;\n    }\n    pNewBitmap->CopyPalette(m_pPalette);\n    pNewBitmap->CopyAlphaMask(m_pAlphaMask, pClip);\n    if (GetBPP() == 1 && rect.left % 8 != 0) {\n        int left_shift = rect.left % 32;\n        int right_shift = 32 - left_shift;\n        int dword_count = pNewBitmap->m_Pitch / 4;\n        for (int row = rect.top; row < rect.bottom; row ++) {\n            FX_DWORD* src_scan = (FX_DWORD*)GetScanline(row) + rect.left / 32;\n            FX_DWORD* dest_scan = (FX_DWORD*)pNewBitmap->GetScanline(row - rect.top);\n            for (int i = 0; i < dword_count; i ++) {\n                dest_scan[i] = (src_scan[i] << left_shift) | (src_scan[i + 1] >> right_shift);\n            }\n        }\n    } else {\n        int copy_len = (pNewBitmap->GetWidth() * pNewBitmap->GetBPP() + 7) / 8;\n        if (m_Pitch < (FX_DWORD)copy_len) {\n            copy_len = m_Pitch;\n        }\n        for (int row = rect.top; row < rect.bottom; row ++) {\n            FX_LPCBYTE src_scan = GetScanline(row) + rect.left * m_bpp / 8;\n            FX_LPBYTE dest_scan = (FX_LPBYTE)pNewBitmap->GetScanline(row - rect.top);\n            FXSYS_memcpy32(dest_scan, src_scan, copy_len);\n        }\n    }\n    return pNewBitmap;\n}\nvoid CFX_DIBSource::BuildPalette()\n{\n    if (m_pPalette) {\n        return;\n    }\n    if (GetBPP() == 1) {\n        m_pPalette = FX_Alloc(FX_DWORD, 2);\n        if (!m_pPalette) {\n            return;\n        }\n        if(IsCmykImage()) {\n            m_pPalette[0] = 0xff;\n            m_pPalette[1] = 0;\n        } else {\n            m_pPalette[0] = 0xff000000;\n            m_pPalette[1] = 0xffffffff;\n        }\n    } else if (GetBPP() == 8) {\n        m_pPalette = FX_Alloc(FX_DWORD, 256);\n        if (!m_pPalette) {\n            return;\n        }\n        if(IsCmykImage()) {\n            for (int i = 0; i < 256; i ++) {\n                m_pPalette[i] = 0xff - i;\n            }\n        } else {\n            for (int i = 0; i < 256; i ++) {\n                m_pPalette[i] = 0xff000000 | (i * 0x10101);\n            }\n        }\n    }\n}\nFX_BOOL CFX_DIBSource::BuildAlphaMask()\n{\n    if (m_pAlphaMask) {\n        return TRUE;\n    }\n    m_pAlphaMask = FX_NEW CFX_DIBitmap;\n    if (!m_pAlphaMask) {\n        return FALSE;\n    }\n    if (!m_pAlphaMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {\n        delete m_pAlphaMask;\n        m_pAlphaMask = NULL;\n        return FALSE;\n    }\n    FXSYS_memset8(m_pAlphaMask->GetBuffer(), 0xff, m_pAlphaMask->GetHeight()*m_pAlphaMask->GetPitch());\n    return TRUE;\n}\nFX_DWORD CFX_DIBSource::GetPaletteEntry(int index) const\n{\n    ASSERT((GetBPP() == 1 || GetBPP() == 8) && !IsAlphaMask());\n    if (m_pPalette) {\n        return m_pPalette[index];\n    }\n    if (IsCmykImage()) {\n        if (GetBPP() == 1) {\n            return index ? 0 : 0xff;\n        }\n        return 0xff - index;\n    }\n    if (GetBPP() == 1) {\n        return index ? 0xffffffff : 0xff000000;\n    }\n    return index * 0x10101 | 0xff000000;\n}\nvoid CFX_DIBSource::SetPaletteEntry(int index, FX_DWORD color)\n{\n    ASSERT((GetBPP() == 1 || GetBPP() == 8) && !IsAlphaMask());\n    if (m_pPalette == NULL) {\n        BuildPalette();\n    }\n    m_pPalette[index] = color;\n}\nint CFX_DIBSource::FindPalette(FX_DWORD color) const\n{\n    ASSERT((GetBPP() == 1 || GetBPP() == 8) && !IsAlphaMask());\n    if (m_pPalette == NULL) {\n        if (IsCmykImage()) {\n            if (GetBPP() == 1) {\n                return ((FX_BYTE)color == 0xff) ? 0 : 1;\n            }\n            return 0xff - (FX_BYTE)color;\n        }\n        if (GetBPP() == 1) {\n            return ((FX_BYTE)color == 0xff) ? 1 : 0;\n        }\n        return (FX_BYTE)color;\n    }\n    int palsize = (1 << GetBPP());\n    for (int i = 0; i < palsize; i ++)\n        if (m_pPalette[i] == color) {\n            return i;\n        }\n    return -1;\n}\nvoid CFX_DIBitmap::Clear(FX_DWORD color)\n{\n    if (m_pBuffer == NULL) {\n        return;\n    }\n    switch (GetFormat()) {\n        case FXDIB_1bppMask:\n            FXSYS_memset8(m_pBuffer, (color & 0xff000000) ? 0xff : 0, m_Pitch * m_Height);\n            break;\n        case FXDIB_1bppRgb: {\n                int index = FindPalette(color);\n                FXSYS_memset8(m_pBuffer, index ? 0xff : 0, m_Pitch * m_Height);\n                break;\n            }\n        case FXDIB_8bppMask:\n            FXSYS_memset8(m_pBuffer, color >> 24, m_Pitch * m_Height);\n            break;\n        case FXDIB_8bppRgb: {\n                int index = FindPalette(color);\n                FXSYS_memset8(m_pBuffer, index, m_Pitch * m_Height);\n                break;\n            }\n        case FXDIB_Rgb:\n        case FXDIB_Rgba: {\n                int a, r, g, b;\n                ArgbDecode(color, a, r, g, b);\n                if (r == g && g == b) {\n                    FXSYS_memset8(m_pBuffer, r, m_Pitch * m_Height);\n                } else {\n                    int byte_pos = 0;\n                    for (int col = 0; col < m_Width; col ++) {\n                        m_pBuffer[byte_pos++] = b;\n                        m_pBuffer[byte_pos++] = g;\n                        m_pBuffer[byte_pos++] = r;\n                    }\n                    for (int row = 1; row < m_Height; row ++) {\n                        FXSYS_memcpy32(m_pBuffer + row * m_Pitch, m_pBuffer, m_Pitch);\n                    }\n                }\n                break;\n            }\n        case FXDIB_Rgb32:\n        case FXDIB_Argb: {\n                color = IsCmykImage() ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);\n                for (int i = 0; i < m_Width; i ++) {\n                    ((FX_DWORD*)m_pBuffer)[i] = color;\n                }\n                for (int row = 1; row < m_Height; row ++) {\n                    FXSYS_memcpy32(m_pBuffer + row * m_Pitch, m_pBuffer, m_Pitch);\n                }\n                break;\n            }\n        default:\n            break;\n    }\n}\nvoid CFX_DIBSource::GetOverlapRect(int& dest_left, int& dest_top, int& width, int& height,\n                                   int src_width, int src_height, int& src_left, int& src_top,\n                                   const CFX_ClipRgn* pClipRgn)\n{\n    if (width == 0 || height == 0) {\n        return;\n    }\n    ASSERT(width > 0 && height > 0);\n    if (dest_left > m_Width || dest_top > m_Height) {\n        width = 0;\n        height = 0;\n        return;\n    }\n    int x_offset = dest_left - src_left;\n    int y_offset = dest_top - src_top;\n    FX_RECT src_rect(src_left, src_top, src_left + width, src_top + height);\n    FX_RECT src_bound(0, 0, src_width, src_height);\n    src_rect.Intersect(src_bound);\n    FX_RECT dest_rect(src_rect.left + x_offset, src_rect.top + y_offset,\n                      src_rect.right + x_offset, src_rect.bottom + y_offset);\n    FX_RECT dest_bound(0, 0, m_Width, m_Height);\n    dest_rect.Intersect(dest_bound);\n    if (pClipRgn) {\n        dest_rect.Intersect(pClipRgn->GetBox());\n    }\n    dest_left = dest_rect.left;\n    dest_top = dest_rect.top;\n    src_left = dest_left - x_offset;\n    src_top = dest_top - y_offset;\n    width = dest_rect.right - dest_rect.left;\n    height = dest_rect.bottom - dest_rect.top;\n}\nFX_BOOL CFX_DIBitmap::TransferBitmap(int dest_left, int dest_top, int width, int height,\n                                     const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)\n{\n    if (m_pBuffer == NULL) {\n        return FALSE;\n    }\n    GetOverlapRect(dest_left, dest_top, width, height, pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(), src_left, src_top, NULL);\n    if (width == 0 || height == 0) {\n        return TRUE;\n    }\n    FXDIB_Format dest_format = GetFormat();\n    FXDIB_Format src_format = pSrcBitmap->GetFormat();\n    if (dest_format == src_format && pIccTransform == NULL) {\n        if (GetBPP() == 1) {\n            for (int row = 0; row < height; row ++) {\n                FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch;\n                FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);\n                for (int col = 0; col < width; col ++) {\n                    if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {\n                        dest_scan[(dest_left + col) / 8] |= 1 << (7 - (dest_left + col) % 8);\n                    } else {\n                        dest_scan[(dest_left + col) / 8] &= ~(1 << (7 - (dest_left + col) % 8));\n                    }\n                }\n            }\n        } else {\n            int Bpp = GetBPP() / 8;\n            for (int row = 0; row < height; row ++) {\n                FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * Bpp;\n                FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp;\n                FXSYS_memcpy32(dest_scan, src_scan, width * Bpp);\n            }\n        }\n    } else {\n        if (m_pPalette) {\n            return FALSE;\n        }\n        if (m_bpp == 8) {\n            dest_format = FXDIB_8bppMask;\n        }\n        FX_LPBYTE dest_buf = m_pBuffer + dest_top * m_Pitch + dest_left * GetBPP() / 8;\n        FX_DWORD* d_plt = NULL;\n        if(!ConvertBuffer(dest_format, dest_buf, m_Pitch, width, height, pSrcBitmap, src_left, src_top, d_plt, pIccTransform)) {\n            return FALSE;\n        }\n    }\n    return TRUE;\n}\n#ifndef _FPDFAPI_MINI_\nFX_BOOL CFX_DIBitmap::TransferMask(int dest_left, int dest_top, int width, int height,\n                                   const CFX_DIBSource* pMask, FX_DWORD color, int src_left, int src_top, int alpha_flag, void* pIccTransform)\n{\n    if (m_pBuffer == NULL) {\n        return FALSE;\n    }\n    ASSERT(HasAlpha() && (m_bpp >= 24));\n    ASSERT(pMask->IsAlphaMask());\n    if (!HasAlpha() || !pMask->IsAlphaMask() || m_bpp < 24) {\n        return FALSE;\n    }\n    GetOverlapRect(dest_left, dest_top, width, height, pMask->GetWidth(), pMask->GetHeight(), src_left, src_top, NULL);\n    if (width == 0 || height == 0) {\n        return TRUE;\n    }\n    int src_pitch = pMask->GetPitch();\n    int src_bpp = pMask->GetBPP();\n    int alpha;\n    FX_DWORD dst_color;\n    if (alpha_flag >> 8) {\n        alpha = alpha_flag & 0xff;\n        dst_color = FXCMYK_TODIB(color);\n    } else {\n        alpha = FXARGB_A(color);\n        dst_color = FXARGB_TODIB(color);\n    }\n    FX_LPBYTE color_p = (FX_LPBYTE)&dst_color;\n    if (pIccTransform && CFX_GEModule::Get()->GetCodecModule() && CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {\n        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n        pIccModule->TranslateScanline(pIccTransform, color_p, color_p, 1);\n    } else {\n        if (alpha_flag >> 8 && !IsCmykImage())\n            AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), FXSYS_GetYValue(color), FXSYS_GetKValue(color),\n                               color_p[2], color_p[1], color_p[0]);\n        else if (!(alpha_flag >> 8) && IsCmykImage()) {\n            return FALSE;\n        }\n    }\n    if(!IsCmykImage()) {\n        color_p[3] = (FX_BYTE)alpha;\n    }\n    if (GetFormat() == FXDIB_Argb) {\n        for (int row = 0; row < height; row ++) {\n            FX_DWORD* dest_pos = (FX_DWORD*)(m_pBuffer + (dest_top + row) * m_Pitch + dest_left * 4);\n            FX_LPCBYTE src_scan = pMask->GetScanline(src_top + row);\n            if (src_bpp == 1) {\n                for (int col = 0; col < width; col ++) {\n                    int src_bitpos = src_left + col;\n                    if (src_scan[src_bitpos / 8] & (1 << (7 - src_bitpos % 8))) {\n                        *dest_pos = dst_color;\n                    } else {\n                        *dest_pos = 0;\n                    }\n                    dest_pos ++;\n                }\n            } else {\n                src_scan += src_left;\n                dst_color = FXARGB_TODIB(dst_color);\n                dst_color &= 0xffffff;\n                for (int col = 0; col < width; col ++) {\n                    FXARGB_SETDIB(dest_pos++, dst_color | ((alpha * (*src_scan++) / 255) << 24));\n                }\n            }\n        }\n    } else {\n        int comps = m_bpp / 8;\n        for (int row = 0; row < height; row ++) {\n            FX_LPBYTE dest_color_pos = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * comps;\n            FX_LPBYTE dest_alpha_pos = (FX_LPBYTE)m_pAlphaMask->GetScanline(dest_top + row) + dest_left;\n            FX_LPCBYTE src_scan = pMask->GetScanline(src_top + row);\n            if (src_bpp == 1) {\n                for (int col = 0; col < width; col ++) {\n                    int src_bitpos = src_left + col;\n                    if (src_scan[src_bitpos / 8] & (1 << (7 - src_bitpos % 8))) {\n                        FXSYS_memcpy32(dest_color_pos, color_p, comps);\n                        *dest_alpha_pos = 0xff;\n                    } else {\n                        FXSYS_memset32(dest_color_pos, 0, comps);\n                        *dest_alpha_pos = 0;\n                    }\n                    dest_color_pos += comps;\n                    dest_alpha_pos ++;\n                }\n            } else {\n                src_scan += src_left;\n                for (int col = 0; col < width; col ++) {\n                    FXSYS_memcpy32(dest_color_pos, color_p, comps);\n                    dest_color_pos += comps;\n                    *dest_alpha_pos++ = (alpha * (*src_scan++) / 255);\n                }\n            }\n        }\n    }\n    return TRUE;\n}\n#endif\nvoid CFX_DIBSource::CopyPalette(const FX_DWORD* pSrc, FX_DWORD size)\n{\n    if (pSrc == NULL || GetBPP() > 8) {\n        if (m_pPalette) {\n            FX_Free(m_pPalette);\n        }\n        m_pPalette = NULL;\n    } else {\n        FX_DWORD pal_size = 1 << GetBPP();\n        if (m_pPalette == NULL) {\n            m_pPalette = FX_Alloc(FX_DWORD, pal_size);\n        }\n        if (!m_pPalette) {\n            return;\n        }\n        if (pal_size > size) {\n            pal_size = size;\n        }\n        FXSYS_memcpy32(m_pPalette, pSrc, pal_size * sizeof(FX_DWORD));\n    }\n}\nvoid CFX_DIBSource::GetPalette(FX_DWORD* pal, int alpha) const\n{\n    ASSERT(GetBPP() <= 8 && !IsCmykImage());\n    if (GetBPP() == 1) {\n        pal[0] = ((m_pPalette ? m_pPalette[0] : 0xff000000) & 0xffffff) | (alpha << 24);\n        pal[1] = ((m_pPalette ? m_pPalette[1] : 0xffffffff) & 0xffffff) | (alpha << 24);\n        return;\n    }\n    if (m_pPalette) {\n        for (int i = 0; i < 256; i ++) {\n            pal[i] = (m_pPalette[i] & 0x00ffffff) | (alpha << 24);\n        }\n    } else {\n        for (int i = 0; i < 256; i ++) {\n            pal[i] = (i * 0x10101) | (alpha << 24);\n        }\n    }\n}\nCFX_DIBitmap* CFX_DIBSource::GetAlphaMask(const FX_RECT* pClip) const\n{\n    ASSERT(GetFormat() == FXDIB_Argb);\n    FX_RECT rect(0, 0, m_Width, m_Height);\n    if (pClip) {\n        rect.Intersect(*pClip);\n        if (rect.IsEmpty()) {\n            return NULL;\n        }\n    }\n    CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;\n    if (!pMask) {\n        return NULL;\n    }\n    if (!pMask->Create(rect.Width(), rect.Height(), FXDIB_8bppMask)) {\n        delete pMask;\n        return NULL;\n    }\n    for (int row = rect.top; row < rect.bottom; row ++) {\n        FX_LPCBYTE src_scan = GetScanline(row) + rect.left * 4 + 3;\n        FX_LPBYTE dest_scan = (FX_LPBYTE)pMask->GetScanline(row - rect.top);\n        for (int col = rect.left; col < rect.right; col ++) {\n            *dest_scan ++ = *src_scan;\n            src_scan += 4;\n        }\n    }\n    return pMask;\n}\nFX_BOOL CFX_DIBSource::CopyAlphaMask(const CFX_DIBSource* pAlphaMask, const FX_RECT* pClip)\n{\n    if (!HasAlpha() || GetFormat() == FXDIB_Argb) {\n        return FALSE;\n    }\n    if (pAlphaMask) {\n        FX_RECT rect(0, 0, pAlphaMask->m_Width, pAlphaMask->m_Height);\n        if (pClip) {\n            rect.Intersect(*pClip);\n            if (rect.IsEmpty() || rect.Width() != m_Width || rect.Height() != m_Height) {\n                return FALSE;\n            }\n        } else {\n            if (pAlphaMask->m_Width != m_Width || pAlphaMask->m_Height != m_Height) {\n                return FALSE;\n            }\n        }\n        for (int row = 0; row < m_Height; row ++)\n            FXSYS_memcpy32((void*)m_pAlphaMask->GetScanline(row),\n                           pAlphaMask->GetScanline(row + rect.top) + rect.left, m_pAlphaMask->m_Pitch);\n    } else {\n        m_pAlphaMask->Clear(0xff000000);\n    }\n    return TRUE;\n}\nconst int g_ChannelOffset[] = {0, 2, 1, 0, 0, 1, 2, 3, 3};\nFX_BOOL CFX_DIBitmap::LoadChannel(FXDIB_Channel destChannel, const CFX_DIBSource* pSrcBitmap, FXDIB_Channel srcChannel)\n{\n    if (m_pBuffer == NULL) {\n        return FALSE;\n    }\n    CFX_DIBSource* pSrcClone = (CFX_DIBSource*)pSrcBitmap;\n    CFX_DIBitmap* pDst = this;\n    int destOffset, srcOffset;\n    if (srcChannel == FXDIB_Alpha) {\n        if (!pSrcBitmap->HasAlpha() && !pSrcBitmap->IsAlphaMask()) {\n            return FALSE;\n        }\n        if (pSrcBitmap->GetBPP() == 1) {\n            pSrcClone = pSrcBitmap->CloneConvert(FXDIB_8bppMask);\n            if (pSrcClone == NULL) {\n                return FALSE;\n            }\n        }\n        if(pSrcBitmap->GetFormat() == FXDIB_Argb) {\n            srcOffset = 3;\n        } else {\n            srcOffset = 0;\n        }\n    } else {\n        if (pSrcBitmap->IsAlphaMask()) {\n            return FALSE;\n        }\n        if (pSrcBitmap->GetBPP() < 24) {\n            if (pSrcBitmap->IsCmykImage()) {\n                pSrcClone = pSrcBitmap->CloneConvert((FXDIB_Format)((pSrcBitmap->GetFormat() & 0xff00) | 0x20));\n            } else {\n                pSrcClone = pSrcBitmap->CloneConvert((FXDIB_Format)((pSrcBitmap->GetFormat() & 0xff00) | 0x18));\n            }\n            if (pSrcClone == NULL) {\n                return FALSE;\n            }\n        }\n        srcOffset = g_ChannelOffset[srcChannel];\n    }\n    if (destChannel == FXDIB_Alpha) {\n        if (IsAlphaMask()) {\n            if(!ConvertFormat(FXDIB_8bppMask)) {\n                if (pSrcClone != pSrcBitmap) {\n                    delete pSrcClone;\n                }\n                return FALSE;\n            }\n            destOffset = 0;\n        } else {\n            destOffset = 0;\n            if(!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) {\n                if (pSrcClone != pSrcBitmap) {\n                    delete pSrcClone;\n                }\n                return FALSE;\n            }\n            if (GetFormat() == FXDIB_Argb) {\n                destOffset = 3;\n            }\n        }\n    } else {\n        if (IsAlphaMask()) {\n            if (pSrcClone != pSrcBitmap) {\n                delete pSrcClone;\n            }\n            return FALSE;\n        }\n        if (GetBPP() < 24) {\n            if (HasAlpha()) {\n                if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) {\n                    if (pSrcClone != pSrcBitmap) {\n                        delete pSrcClone;\n                    }\n                    return FALSE;\n                }\n            } else\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n                if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb32)) {\n#else\n                if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb)) {\n#endif\n                    if (pSrcClone != pSrcBitmap) {\n                        delete pSrcClone;\n                    }\n                    return FALSE;\n                }\n        }\n        destOffset = g_ChannelOffset[destChannel];\n    }\n    if (srcChannel == FXDIB_Alpha && pSrcClone->m_pAlphaMask) {\n        CFX_DIBitmap* pAlphaMask = pSrcClone->m_pAlphaMask;\n        if (pSrcClone->GetWidth() != m_Width || pSrcClone->GetHeight() != m_Height) {\n            if (pAlphaMask) {\n                pAlphaMask = pAlphaMask->StretchTo(m_Width, m_Height);\n                if (pAlphaMask == NULL) {\n                    if (pSrcClone != pSrcBitmap) {\n                        delete pSrcClone;\n                    }\n                    return FALSE;\n                }\n            }\n        }\n        if (pSrcClone != pSrcBitmap) {\n            pSrcClone->m_pAlphaMask = NULL;\n            delete pSrcClone;\n        }\n        pSrcClone = pAlphaMask;\n        srcOffset = 0;\n    } else if (pSrcClone->GetWidth() != m_Width || pSrcClone->GetHeight() != m_Height) {\n        CFX_DIBitmap* pSrcMatched = pSrcClone->StretchTo(m_Width, m_Height);\n        if (pSrcClone != pSrcBitmap) {\n            delete pSrcClone;\n        }\n        if (pSrcMatched == NULL) {\n            return FALSE;\n        }\n        pSrcClone = pSrcMatched;\n    }\n    if (destChannel == FXDIB_Alpha && m_pAlphaMask) {\n        pDst = m_pAlphaMask;\n        destOffset = 0;\n    }\n    int srcBytes = pSrcClone->GetBPP() / 8;\n    int destBytes = pDst->GetBPP() / 8;\n    for (int row = 0; row < m_Height; row ++) {\n        FX_LPBYTE dest_pos = (FX_LPBYTE)pDst->GetScanline(row) + destOffset;\n        FX_LPCBYTE src_pos = pSrcClone->GetScanline(row) + srcOffset;\n        for (int col = 0; col < m_Width; col ++) {\n            *dest_pos = *src_pos;\n            dest_pos += destBytes;\n            src_pos += srcBytes;\n        }\n    }\n    if (pSrcClone != pSrcBitmap && pSrcClone != pSrcBitmap->m_pAlphaMask) {\n        delete pSrcClone;\n    }\n    return TRUE;\n}\nFX_BOOL CFX_DIBitmap::LoadChannel(FXDIB_Channel destChannel, int value)\n{\n    if (m_pBuffer == NULL) {\n        return FALSE;\n    }\n    int destOffset;\n    if (destChannel == FXDIB_Alpha) {\n        if (IsAlphaMask()) {\n            if(!ConvertFormat(FXDIB_8bppMask)) {\n                return FALSE;\n            }\n            destOffset = 0;\n        } else {\n            destOffset = 0;\n            if(!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) {\n                return FALSE;\n            }\n            if (GetFormat() == FXDIB_Argb) {\n                destOffset = 3;\n            }\n        }\n    } else {\n        if (IsAlphaMask()) {\n            return FALSE;\n        }\n        if (GetBPP() < 24) {\n            if (HasAlpha()) {\n                if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) {\n                    return FALSE;\n                }\n            } else\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n                if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb)) {\n                    return FALSE;\n                }\n#else\n                if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb32)) {\n                    return FALSE;\n                }\n#endif\n        }\n        destOffset = g_ChannelOffset[destChannel];\n    }\n    int Bpp = GetBPP() / 8;\n    if (Bpp == 1) {\n        FXSYS_memset8(m_pBuffer, value, m_Height * m_Pitch);\n        return TRUE;\n    }\n    if (destChannel == FXDIB_Alpha && m_pAlphaMask) {\n        FXSYS_memset8(m_pAlphaMask->GetBuffer(), value, m_pAlphaMask->GetHeight()*m_pAlphaMask->GetPitch());\n        return TRUE;\n    }\n    for (int row = 0; row < m_Height; row ++) {\n        FX_LPBYTE scan_line = m_pBuffer + row * m_Pitch + destOffset;\n        for (int col = 0; col < m_Width; col ++) {\n            *scan_line = value;\n            scan_line += Bpp;\n        }\n    }\n    return TRUE;\n}\nFX_BOOL CFX_DIBitmap::MultiplyAlpha(const CFX_DIBSource* pSrcBitmap)\n{\n    if (m_pBuffer == NULL) {\n        return FALSE;\n    }\n    ASSERT(pSrcBitmap->IsAlphaMask());\n    if (!pSrcBitmap->IsAlphaMask()) {\n        return FALSE;\n    }\n    if (!IsAlphaMask() && !HasAlpha()) {\n        return LoadChannel(FXDIB_Alpha, pSrcBitmap, FXDIB_Alpha);\n    }\n    CFX_DIBitmap* pSrcClone = (CFX_DIBitmap*)pSrcBitmap;\n    if (pSrcBitmap->GetWidth() != m_Width || pSrcBitmap->GetHeight() != m_Height) {\n        pSrcClone = pSrcBitmap->StretchTo(m_Width, m_Height);\n        ASSERT(pSrcClone != NULL);\n        if (pSrcClone == NULL) {\n            return FALSE;\n        }\n    }\n    if (IsAlphaMask()) {\n        if(!ConvertFormat(FXDIB_8bppMask)) {\n            if (pSrcClone != pSrcBitmap) {\n                delete pSrcClone;\n            }\n            return FALSE;\n        }\n        for (int row = 0; row < m_Height; row ++) {\n            FX_LPBYTE dest_scan = m_pBuffer + m_Pitch * row;\n            FX_LPBYTE src_scan = pSrcClone->m_pBuffer + pSrcClone->m_Pitch * row;\n            if (pSrcClone->GetBPP() == 1) {\n                for (int col = 0; col < m_Width; col ++) {\n                    if (!((1 << (7 - col % 8)) & src_scan[col / 8])) {\n                        dest_scan[col] = 0;\n                    }\n                }\n            } else {\n                for (int col = 0; col < m_Width; col ++) {\n                    *dest_scan = (*dest_scan) * src_scan[col] / 255;\n                    dest_scan ++;\n                }\n            }\n        }\n    } else {\n        if(GetFormat() == FXDIB_Argb) {\n            if (pSrcClone->GetBPP() == 1) {\n                if (pSrcClone != pSrcBitmap) {\n                    delete pSrcClone;\n                }\n                return FALSE;\n            }\n            for (int row = 0; row < m_Height; row ++) {\n                FX_LPBYTE dest_scan = m_pBuffer + m_Pitch * row + 3;\n                FX_LPBYTE src_scan = pSrcClone->m_pBuffer + pSrcClone->m_Pitch * row;\n                for (int col = 0; col < m_Width; col ++) {\n                    *dest_scan = (*dest_scan) * src_scan[col] / 255;\n                    dest_scan += 4;\n                }\n            }\n        } else {\n            m_pAlphaMask->MultiplyAlpha(pSrcClone);\n        }\n    }\n    if (pSrcClone != pSrcBitmap) {\n        delete pSrcClone;\n    }\n    return TRUE;\n}\nFX_BOOL CFX_DIBitmap::GetGrayData(void* pIccTransform)\n{\n    if (m_pBuffer == NULL) {\n        return FALSE;\n    }\n    switch (GetFormat()) {\n        case FXDIB_1bppRgb: {\n                if (m_pPalette == NULL) {\n                    return FALSE;\n                }\n                FX_BYTE gray[2];\n                for (int i = 0; i < 2; i ++) {\n                    int r = (FX_BYTE)(m_pPalette[i] >> 16);\n                    int g = (FX_BYTE)(m_pPalette[i] >> 8);\n                    int b = (FX_BYTE)m_pPalette[i];\n                    gray[i] = (FX_BYTE)FXRGB2GRAY(r, g, b);\n                }\n                CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;\n                if (!pMask) {\n                    return FALSE;\n                }\n                if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {\n                    delete pMask;\n                    return FALSE;\n                }\n                FXSYS_memset8(pMask->GetBuffer(), gray[0], pMask->GetPitch() * m_Height);\n                for (int row = 0; row < m_Height; row ++) {\n                    FX_LPBYTE src_pos = m_pBuffer + row * m_Pitch;\n                    FX_LPBYTE dest_pos = (FX_LPBYTE)pMask->GetScanline(row);\n                    for (int col = 0; col < m_Width; col ++) {\n                        if (src_pos[col / 8] & (1 << (7 - col % 8))) {\n                            *dest_pos = gray[1];\n                        }\n                        dest_pos ++;\n                    }\n                }\n                TakeOver(pMask);\n                delete pMask;\n                break;\n            }\n        case FXDIB_8bppRgb: {\n                if (m_pPalette == NULL) {\n                    return FALSE;\n                }\n                FX_BYTE gray[256];\n                for (int i = 0; i < 256; i ++) {\n                    int r = (FX_BYTE)(m_pPalette[i] >> 16);\n                    int g = (FX_BYTE)(m_pPalette[i] >> 8);\n                    int b = (FX_BYTE)m_pPalette[i];\n                    gray[i] = (FX_BYTE)FXRGB2GRAY(r, g, b);\n                }\n                CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;\n                if (!pMask) {\n                    return FALSE;\n                }\n                if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {\n                    delete pMask;\n                    return FALSE;\n                }\n                for (int row = 0; row < m_Height; row ++) {\n                    FX_LPBYTE dest_pos = pMask->GetBuffer() + row * pMask->GetPitch();\n                    FX_LPBYTE src_pos = m_pBuffer + row * m_Pitch;\n                    for (int col = 0; col < m_Width; col ++) {\n                        *dest_pos ++ = gray[*src_pos ++];\n                    }\n                }\n                TakeOver(pMask);\n                delete pMask;\n                break;\n            }\n        case FXDIB_Rgb: {\n                CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;\n                if (!pMask) {\n                    return FALSE;\n                }\n                if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {\n                    delete pMask;\n                    return FALSE;\n                }\n                for (int row = 0; row < m_Height; row ++) {\n                    FX_LPBYTE src_pos = m_pBuffer + row * m_Pitch;\n                    FX_LPBYTE dest_pos = pMask->GetBuffer() + row * pMask->GetPitch();\n                    for (int col = 0; col < m_Width; col ++) {\n                        *dest_pos ++ = FXRGB2GRAY(src_pos[2], src_pos[1], *src_pos);\n                        src_pos += 3;\n                    }\n                }\n                TakeOver(pMask);\n                delete pMask;\n                break;\n            }\n        case FXDIB_Rgb32: {\n                CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;\n                if (!pMask) {\n                    return FALSE;\n                }\n                if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {\n                    delete pMask;\n                    return FALSE;\n                }\n                for (int row = 0; row < m_Height; row ++) {\n                    FX_LPBYTE src_pos = m_pBuffer + row * m_Pitch;\n                    FX_LPBYTE dest_pos = pMask->GetBuffer() + row * pMask->GetPitch();\n                    for (int col = 0; col < m_Width; col ++) {\n                        *dest_pos ++ = FXRGB2GRAY(src_pos[2], src_pos[1], *src_pos);\n                        src_pos += 4;\n                    }\n                }\n                TakeOver(pMask);\n                delete pMask;\n                break;\n            }\n        default:\n            return FALSE;\n    }\n    return TRUE;\n}\nFX_BOOL CFX_DIBitmap::MultiplyAlpha(int alpha)\n{\n    if (m_pBuffer == NULL) {\n        return FALSE;\n    }\n    switch (GetFormat()) {\n        case FXDIB_1bppMask:\n            if (!ConvertFormat(FXDIB_8bppMask)) {\n                return FALSE;\n            }\n            MultiplyAlpha(alpha);\n            break;\n        case FXDIB_8bppMask: {\n                for (int row = 0; row < m_Height; row ++) {\n                    FX_LPBYTE scan_line = m_pBuffer + row * m_Pitch;\n                    for (int col = 0; col < m_Width; col ++) {\n                        scan_line[col] = scan_line[col] * alpha / 255;\n                    }\n                }\n                break;\n            }\n        case FXDIB_Argb: {\n                for (int row = 0; row < m_Height; row ++) {\n                    FX_LPBYTE scan_line = m_pBuffer + row * m_Pitch + 3;\n                    for (int col = 0; col < m_Width; col ++) {\n                        *scan_line = (*scan_line) * alpha / 255;\n                        scan_line += 4;\n                    }\n                }\n                break;\n            }\n        default:\n            if (HasAlpha()) {\n                m_pAlphaMask->MultiplyAlpha(alpha);\n            } else if (IsCmykImage()) {\n                if (!ConvertFormat((FXDIB_Format)(GetFormat() | 0x0200))) {\n                    return FALSE;\n                }\n                m_pAlphaMask->MultiplyAlpha(alpha);\n            } else {\n                if (!ConvertFormat(FXDIB_Argb)) {\n                    return FALSE;\n                }\n                MultiplyAlpha(alpha);\n            }\n            break;\n    }\n    return TRUE;\n}\n#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)\nFX_DWORD CFX_DIBitmap::GetPixel(int x, int y) const\n{\n    if (m_pBuffer == NULL) {\n        return 0;\n    }\n    FX_LPBYTE pos = m_pBuffer + y * m_Pitch + x * GetBPP() / 8;\n    switch (GetFormat()) {\n        case FXDIB_1bppMask: {\n                if ((*pos) & (1 << (7 - x % 8))) {\n                    return 0xff000000;\n                }\n                return 0;\n            }\n        case FXDIB_1bppRgb: {\n                if ((*pos) & (1 << (7 - x % 8))) {\n                    return m_pPalette ? m_pPalette[1] : 0xffffffff;\n                } else {\n                    return m_pPalette ? m_pPalette[0] : 0xff000000;\n                }\n                break;\n            }\n        case FXDIB_8bppMask:\n            return (*pos) << 24;\n        case FXDIB_8bppRgb:\n            return m_pPalette ? m_pPalette[*pos] : (0xff000000 | ((*pos) * 0x10101));\n        case FXDIB_Rgb:\n        case FXDIB_Rgba:\n        case FXDIB_Rgb32:\n            return FXARGB_GETDIB(pos) | 0xff000000;\n        case FXDIB_Argb:\n            return FXARGB_GETDIB(pos);\n        default:\n            break;\n    }\n    return 0;\n}\n#endif\nvoid CFX_DIBitmap::SetPixel(int x, int y, FX_DWORD color)\n{\n    if (m_pBuffer == NULL) {\n        return;\n    }\n    if (x < 0 || x >= m_Width || y < 0 || y >= m_Height) {\n        return;\n    }\n    FX_LPBYTE pos = m_pBuffer + y * m_Pitch + x * GetBPP() / 8;\n    switch (GetFormat()) {\n        case FXDIB_1bppMask:\n            if (color >> 24) {\n                *pos |= 1 << (7 - x % 8);\n            } else {\n                *pos &= ~(1 << (7 - x % 8));\n            }\n            break;\n        case FXDIB_1bppRgb:\n            if (m_pPalette) {\n                if (color == m_pPalette[1]) {\n                    *pos |= 1 << (7 - x % 8);\n                } else {\n                    *pos &= ~(1 << (7 - x % 8));\n                }\n            } else {\n                if (color == 0xffffffff) {\n                    *pos |= 1 << (7 - x % 8);\n                } else {\n                    *pos &= ~(1 << (7 - x % 8));\n                }\n            }\n            break;\n        case FXDIB_8bppMask:\n            *pos = (FX_BYTE)(color >> 24);\n            break;\n        case FXDIB_8bppRgb: {\n                if (m_pPalette) {\n                    for (int i = 0; i < 256; i ++) {\n                        if (m_pPalette[i] == color) {\n                            *pos = (FX_BYTE)i;\n                            return;\n                        }\n                    }\n                    *pos = 0;\n                } else {\n                    *pos = FXRGB2GRAY(FXARGB_R(color), FXARGB_G(color), FXARGB_B(color));\n                }\n                break;\n            }\n        case FXDIB_Rgb:\n        case FXDIB_Rgb32: {\n                int alpha = FXARGB_A(color);\n                pos[0] = (FXARGB_B(color) * alpha + pos[0] * (255 - alpha)) / 255;\n                pos[1] = (FXARGB_G(color) * alpha + pos[1] * (255 - alpha)) / 255;\n                pos[2] = (FXARGB_R(color) * alpha + pos[2] * (255 - alpha)) / 255;\n                break;\n            }\n        case FXDIB_Rgba: {\n                pos[0] = FXARGB_B(color);\n                pos[1] = FXARGB_G(color);\n                pos[2] = FXARGB_R(color);\n                break;\n            }\n        case FXDIB_Argb:\n            FXARGB_SETDIB(pos, color);\n            break;\n        default:\n            break;\n    }\n}\nvoid CFX_DIBitmap::DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,\n                                      int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const\n{\n    if (m_pBuffer == NULL) {\n        return;\n    }\n    int src_Bpp = m_bpp / 8;\n    FX_LPBYTE scanline = m_pBuffer + line * m_Pitch;\n    if (src_Bpp == 0) {\n        for (int i = 0; i < clip_width; i ++) {\n            FX_DWORD dest_x = clip_left + i;\n            FX_DWORD src_x = dest_x * m_Width / dest_width;\n            if (bFlipX) {\n                src_x = m_Width - src_x - 1;\n            }\n#ifdef FOXIT_CHROME_BUILD\n            src_x %= m_Width;\n#endif\n            dest_scan[i] = (scanline[src_x / 8] & (1 << (7 - src_x % 8))) ? 255 : 0;\n        }\n    } else if (src_Bpp == 1) {\n        for (int i = 0; i < clip_width; i ++) {\n            FX_DWORD dest_x = clip_left + i;\n            FX_DWORD src_x = dest_x * m_Width / dest_width;\n            if (bFlipX) {\n                src_x = m_Width - src_x - 1;\n            }\n#ifdef FOXIT_CHROME_BUILD\n            src_x %= m_Width;\n#endif\n            int dest_pos = i;\n            if (m_pPalette) {\n                if (!IsCmykImage()) {\n                    dest_pos *= 3;\n                    FX_ARGB argb = m_pPalette[scanline[src_x]];\n                    dest_scan[dest_pos] = FXARGB_B(argb);\n                    dest_scan[dest_pos + 1] = FXARGB_G(argb);\n                    dest_scan[dest_pos + 2] = FXARGB_R(argb);\n                } else {\n                    dest_pos *= 4;\n                    FX_CMYK cmyk = m_pPalette[scanline[src_x]];\n                    dest_scan[dest_pos] = FXSYS_GetCValue(cmyk);\n                    dest_scan[dest_pos + 1] = FXSYS_GetMValue(cmyk);\n                    dest_scan[dest_pos + 2] = FXSYS_GetYValue(cmyk);\n                    dest_scan[dest_pos + 3] = FXSYS_GetKValue(cmyk);\n                }\n            } else {\n                dest_scan[dest_pos] = scanline[src_x];\n            }\n        }\n    } else {\n        for (int i = 0; i < clip_width; i ++) {\n            FX_DWORD dest_x = clip_left + i;\n            FX_DWORD src_x = bFlipX ? (m_Width - dest_x * m_Width / dest_width - 1) * src_Bpp : (dest_x * m_Width / dest_width) * src_Bpp;\n#ifdef FOXIT_CHROME_BUILD\n            src_x %= m_Width * src_Bpp;\n#endif\n            int dest_pos = i * src_Bpp;\n            for (int b = 0; b < src_Bpp; b ++) {\n                dest_scan[dest_pos + b] = scanline[src_x + b];\n            }\n        }\n    }\n}\nFX_BOOL CFX_DIBitmap::ConvertColorScale(FX_DWORD forecolor, FX_DWORD backcolor)\n{\n    ASSERT(!IsAlphaMask());\n    if (m_pBuffer == NULL || IsAlphaMask()) {\n        return FALSE;\n    }\n    int fc, fm, fy, fk, bc, bm, by, bk;\n    int fr, fg, fb, br, bg, bb;\n    FX_BOOL isCmykImage = IsCmykImage();\n    if (isCmykImage) {\n        fc = FXSYS_GetCValue(forecolor);\n        fm = FXSYS_GetMValue(forecolor);\n        fy = FXSYS_GetYValue(forecolor);\n        fk = FXSYS_GetKValue(forecolor);\n        bc = FXSYS_GetCValue(backcolor);\n        bm = FXSYS_GetMValue(backcolor);\n        by = FXSYS_GetYValue(backcolor);\n        bk = FXSYS_GetKValue(backcolor);\n    } else {\n        fr = FXSYS_GetRValue(forecolor);\n        fg = FXSYS_GetGValue(forecolor);\n        fb = FXSYS_GetBValue(forecolor);\n        br = FXSYS_GetRValue(backcolor);\n        bg = FXSYS_GetGValue(backcolor);\n        bb = FXSYS_GetBValue(backcolor);\n    }\n    if (m_bpp <= 8) {\n        if (isCmykImage) {\n            if (forecolor == 0xff && backcolor == 0 && m_pPalette == NULL) {\n                return TRUE;\n            }\n        } else if (forecolor == 0 && backcolor == 0xffffff && m_pPalette == NULL) {\n            return TRUE;\n        }\n        if (m_pPalette == NULL) {\n            BuildPalette();\n        }\n        int size = 1 << m_bpp;\n        if (isCmykImage) {\n            for (int i = 0; i < size; i ++) {\n                FX_BYTE b, g, r;\n                AdobeCMYK_to_sRGB1(FXSYS_GetCValue(m_pPalette[i]), FXSYS_GetMValue(m_pPalette[i]), FXSYS_GetYValue(m_pPalette[i]), FXSYS_GetKValue(m_pPalette[i]),\n                                   r, g, b);\n                int gray = 255 - FXRGB2GRAY(r, g, b);\n                m_pPalette[i] = CmykEncode(bc + (fc - bc) * gray / 255, bm + (fm - bm) * gray / 255,\n                                           by + (fy - by) * gray / 255, bk + (fk - bk) * gray / 255);\n            }\n        } else\n            for (int i = 0; i < size; i ++) {\n                int gray = FXRGB2GRAY(FXARGB_R(m_pPalette[i]), FXARGB_G(m_pPalette[i]), FXARGB_B(m_pPalette[i]));\n                m_pPalette[i] = FXARGB_MAKE(0xff, br + (fr - br) * gray / 255, bg + (fg - bg) * gray / 255,\n                                            bb + (fb - bb) * gray / 255);\n            }\n        return TRUE;\n    }\n    if (isCmykImage) {\n        if (forecolor == 0xff && backcolor == 0x00) {\n            for (int row = 0; row < m_Height; row ++) {\n                FX_LPBYTE scanline = m_pBuffer + row * m_Pitch;\n                for (int col = 0; col < m_Width; col ++) {\n                    FX_BYTE b, g, r;\n                    AdobeCMYK_to_sRGB1(scanline[0], scanline[1], scanline[2], scanline[3],\n                                       r, g, b);\n                    *scanline ++ = 0;\n                    *scanline ++ = 0;\n                    *scanline ++ = 0;\n                    *scanline ++ = 255 - FXRGB2GRAY(r, g, b);\n                }\n            }\n            return TRUE;\n        }\n    } else if (forecolor == 0 && backcolor == 0xffffff) {\n        for (int row = 0; row < m_Height; row ++) {\n            FX_LPBYTE scanline = m_pBuffer + row * m_Pitch;\n            int gap = m_bpp / 8 - 2;\n            for (int col = 0; col < m_Width; col ++) {\n                int gray = FXRGB2GRAY(scanline[2], scanline[1], scanline[0]);\n                *scanline ++ = gray;\n                *scanline ++ = gray;\n                *scanline    = gray;\n                scanline += gap;\n            }\n        }\n        return TRUE;\n    }\n    if (isCmykImage) {\n        for (int row = 0; row < m_Height; row ++) {\n            FX_LPBYTE scanline = m_pBuffer + row * m_Pitch;\n            for (int col = 0; col < m_Width; col ++) {\n                FX_BYTE b, g, r;\n                AdobeCMYK_to_sRGB1(scanline[0], scanline[1], scanline[2], scanline[3],\n                                   r, g, b);\n                int gray = 255 - FXRGB2GRAY(r, g, b);\n                *scanline ++ = bc + (fc - bc) * gray / 255;\n                *scanline ++ = bm + (fm - bm) * gray / 255;\n                *scanline ++ = by + (fy - by) * gray / 255;\n                *scanline ++ = bk + (fk - bk) * gray / 255;\n            }\n        }\n    } else {\n        for (int row = 0; row < m_Height; row ++) {\n            FX_LPBYTE scanline = m_pBuffer + row * m_Pitch;\n            int gap = m_bpp / 8 - 2;\n            for (int col = 0; col < m_Width; col ++) {\n                int gray = FXRGB2GRAY(scanline[2], scanline[1], scanline[0]);\n                *scanline ++ = bb + (fb - bb) * gray / 255;\n                *scanline ++ = bg + (fg - bg) * gray / 255;\n                *scanline    = br + (fr - br) * gray / 255;\n                scanline += gap;\n            }\n        }\n    }\n    return TRUE;\n}\nFX_BOOL CFX_DIBitmap::DitherFS(const FX_DWORD* pPalette, int pal_size, const FX_RECT* pRect)\n{\n    if (m_pBuffer == NULL) {\n        return FALSE;\n    }\n    if (m_bpp != 8 && m_pPalette != NULL && m_AlphaFlag != 0) {\n        return FALSE;\n    }\n    if (m_Width < 4 && m_Height < 4) {\n        return FALSE;\n    }\n    FX_RECT rect(0, 0, m_Width, m_Height);\n    if (pRect) {\n        rect.Intersect(*pRect);\n    }\n    FX_BYTE translate[256];\n    for (int i = 0; i < 256; i ++) {\n        int err2 = 65536;\n        for (int j = 0; j < pal_size; j ++) {\n            FX_BYTE entry = (FX_BYTE)pPalette[j];\n            int err = (int)entry - i;\n            if (err * err < err2) {\n                err2 = err * err;\n                translate[i] = entry;\n            }\n        }\n    }\n    for (int row = rect.top; row < rect.bottom; row ++) {\n        FX_LPBYTE scan = m_pBuffer + row * m_Pitch;\n        FX_LPBYTE next_scan = m_pBuffer + (row + 1) * m_Pitch;\n        for (int col = rect.left; col < rect.right; col ++) {\n            int src_pixel = scan[col];\n            int dest_pixel = translate[src_pixel];\n            scan[col] = (FX_BYTE)dest_pixel;\n            int error = -dest_pixel + src_pixel;\n            if (col < rect.right - 1) {\n                int src = scan[col + 1];\n                src += error * 7 / 16;\n                if (src > 255) {\n                    scan[col + 1] = 255;\n                } else if (src < 0) {\n                    scan[col + 1] = 0;\n                } else {\n                    scan[col + 1] = src;\n                }\n            }\n            if (col < rect.right - 1 && row < rect.bottom - 1) {\n                int src = next_scan[col + 1];\n                src += error * 1 / 16;\n                if (src > 255) {\n                    next_scan[col + 1] = 255;\n                } else if (src < 0) {\n                    next_scan[col + 1] = 0;\n                } else {\n                    next_scan[col + 1] = src;\n                }\n            }\n            if (row < rect.bottom - 1) {\n                int src = next_scan[col];\n                src += error * 5 / 16;\n                if (src > 255) {\n                    next_scan[col] = 255;\n                } else if (src < 0) {\n                    next_scan[col] = 0;\n                } else {\n                    next_scan[col] = src;\n                }\n            }\n            if (col > rect.left && row < rect.bottom - 1) {\n                int src = next_scan[col - 1];\n                src += error * 3 / 16;\n                if (src > 255) {\n                    next_scan[col - 1] = 255;\n                } else if (src < 0) {\n                    next_scan[col - 1] = 0;\n                } else {\n                    next_scan[col - 1] = src;\n                }\n            }\n        }\n    }\n    return TRUE;\n}\nCFX_DIBitmap* CFX_DIBSource::FlipImage(FX_BOOL bXFlip, FX_BOOL bYFlip) const\n{\n    CFX_DIBitmap* pFlipped = FX_NEW CFX_DIBitmap;\n    if (!pFlipped) {\n        return NULL;\n    }\n    if (!pFlipped->Create(m_Width, m_Height, GetFormat())) {\n        delete pFlipped;\n        return NULL;\n    }\n    pFlipped->CopyPalette(m_pPalette);\n    FX_LPBYTE pDestBuffer = pFlipped->GetBuffer();\n    int Bpp = m_bpp / 8;\n    for (int row = 0; row < m_Height; row ++) {\n        FX_LPCBYTE src_scan = GetScanline(row);\n        FX_LPBYTE dest_scan = pDestBuffer + m_Pitch * (bYFlip ? (m_Height - row - 1) : row);\n        if (!bXFlip) {\n            FXSYS_memcpy32(dest_scan, src_scan, m_Pitch);\n            continue;\n        }\n        if (m_bpp == 1) {\n            FXSYS_memset32(dest_scan, 0, m_Pitch);\n            for (int col = 0; col < m_Width; col ++)\n                if (src_scan[col / 8] & (1 << (7 - col % 8))) {\n                    int dest_col = m_Width - col - 1;\n                    dest_scan[dest_col / 8] |= (1 << (7 - dest_col % 8));\n                }\n        } else {\n            dest_scan += (m_Width - 1) * Bpp;\n            if (Bpp == 1) {\n                for (int col = 0; col < m_Width; col ++) {\n                    *dest_scan = *src_scan;\n                    dest_scan --;\n                    src_scan ++;\n                }\n            } else if (Bpp == 3) {\n                for (int col = 0; col < m_Width; col ++) {\n                    dest_scan[0] = src_scan[0];\n                    dest_scan[1] = src_scan[1];\n                    dest_scan[2] = src_scan[2];\n                    dest_scan -= 3;\n                    src_scan += 3;\n                }\n            } else {\n                ASSERT(Bpp == 4);\n                for (int col = 0; col < m_Width; col ++) {\n                    *(FX_DWORD*)dest_scan = *(FX_DWORD*)src_scan;\n                    dest_scan -= 4;\n                    src_scan += 4;\n                }\n            }\n        }\n    }\n    if (m_pAlphaMask) {\n        pDestBuffer = pFlipped->m_pAlphaMask->GetBuffer();\n        FX_DWORD dest_pitch = pFlipped->m_pAlphaMask->GetPitch();\n        for (int row = 0; row < m_Height; row ++) {\n            FX_LPCBYTE src_scan = m_pAlphaMask->GetScanline(row);\n            FX_LPBYTE dest_scan = pDestBuffer + dest_pitch * (bYFlip ? (m_Height - row - 1) : row);\n            if (!bXFlip) {\n                FXSYS_memcpy32(dest_scan, src_scan, dest_pitch);\n                continue;\n            }\n            dest_scan += (m_Width - 1);\n            for (int col = 0; col < m_Width; col ++) {\n                *dest_scan = *src_scan;\n                dest_scan --;\n                src_scan ++;\n            }\n        }\n    }\n    return pFlipped;\n}\nCFX_DIBExtractor::CFX_DIBExtractor(const CFX_DIBSource* pSrc)\n{\n    m_pBitmap = NULL;\n    if (pSrc->GetBuffer() == NULL) {\n        m_pBitmap = pSrc->Clone();\n    } else {\n        m_pBitmap = FX_NEW CFX_DIBitmap;\n        if (!m_pBitmap) {\n            return;\n        }\n        if (!m_pBitmap->Create(pSrc->GetWidth(), pSrc->GetHeight(), pSrc->GetFormat(), pSrc->GetBuffer())) {\n            delete m_pBitmap;\n            m_pBitmap = NULL;\n            return;\n        }\n        m_pBitmap->CopyPalette(pSrc->GetPalette());\n        m_pBitmap->CopyAlphaMask(pSrc->m_pAlphaMask);\n    }\n}\nCFX_DIBExtractor::~CFX_DIBExtractor()\n{\n    if (m_pBitmap) {\n        delete m_pBitmap;\n    }\n}\nCFX_FilteredDIB::CFX_FilteredDIB()\n{\n    m_pScanline = NULL;\n    m_pSrc = NULL;\n}\nCFX_FilteredDIB::~CFX_FilteredDIB()\n{\n    if (m_pSrc && m_bAutoDropSrc) {\n        delete m_pSrc;\n    }\n    if (m_pScanline) {\n        FX_Free(m_pScanline);\n    }\n}\nvoid CFX_FilteredDIB::LoadSrc(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc)\n{\n    m_pSrc = pSrc;\n    m_bAutoDropSrc = bAutoDropSrc;\n    m_Width = pSrc->GetWidth();\n    m_Height = pSrc->GetHeight();\n    FXDIB_Format format = GetDestFormat();\n    m_bpp = (FX_BYTE)format;\n    m_AlphaFlag = (FX_BYTE)(format >> 8);\n    m_Pitch = (m_Width * (format & 0xff) + 31) / 32 * 4;\n    m_pPalette = GetDestPalette();\n    m_pScanline = FX_Alloc(FX_BYTE, m_Pitch);\n}\nFX_LPCBYTE CFX_FilteredDIB::GetScanline(int line) const\n{\n    TranslateScanline(m_pScanline, m_pSrc->GetScanline(line));\n    return m_pScanline;\n}\nvoid CFX_FilteredDIB::DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,\n        int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const\n{\n    m_pSrc->DownSampleScanline(line, dest_scan, dest_bpp, dest_width, bFlipX, clip_left, clip_width);\n    TranslateDownSamples(dest_scan, dest_scan, clip_width, dest_bpp);\n}\nCFX_ImageRenderer::CFX_ImageRenderer()\n{\n    m_Status = 0;\n    m_pTransformer = NULL;\n    m_bRgbByteOrder = FALSE;\n    m_BlendType = FXDIB_BLEND_NORMAL;\n}\nCFX_ImageRenderer::~CFX_ImageRenderer()\n{\n    if (m_pTransformer) {\n        delete m_pTransformer;\n    }\n}\nextern FX_RECT _FXDIB_SwapClipBox(FX_RECT& clip, int width, int height, FX_BOOL bFlipX, FX_BOOL bFlipY);\nFX_BOOL CFX_ImageRenderer::Start(CFX_DIBitmap* pDevice, const CFX_ClipRgn* pClipRgn,\n                                 const CFX_DIBSource* pSource, int bitmap_alpha,\n                                 FX_DWORD mask_color, const CFX_AffineMatrix* pMatrix,\n                                 FX_DWORD dib_flags, FX_BOOL bRgbByteOrder,\n                                 int alpha_flag, void* pIccTransform, int blend_type)\n{\n    m_Matrix = *pMatrix;\n    CFX_FloatRect image_rect_f = m_Matrix.GetUnitRect();\n    FX_RECT image_rect = image_rect_f.GetOutterRect();\n    m_ClipBox = pClipRgn ? pClipRgn->GetBox() : FX_RECT(0, 0, pDevice->GetWidth(), pDevice->GetHeight());\n    m_ClipBox.Intersect(image_rect);\n    if (m_ClipBox.IsEmpty()) {\n        return FALSE;\n    }\n    m_pDevice = pDevice;\n    m_pClipRgn = pClipRgn;\n    m_MaskColor = mask_color;\n    m_BitmapAlpha = bitmap_alpha;\n    m_Matrix = *pMatrix;\n    m_Flags = dib_flags;\n    m_AlphaFlag = alpha_flag;\n    m_pIccTransform = pIccTransform;\n    m_bRgbByteOrder = bRgbByteOrder;\n    m_BlendType = blend_type;\n    FX_BOOL ret = TRUE;\n    if ((FXSYS_fabs(m_Matrix.b) >= 0.5f || m_Matrix.a == 0) ||\n            (FXSYS_fabs(m_Matrix.c) >= 0.5f || m_Matrix.d == 0) ) {\n        if (FXSYS_fabs(m_Matrix.a) < FXSYS_fabs(m_Matrix.b) / 20 && FXSYS_fabs(m_Matrix.d) < FXSYS_fabs(m_Matrix.c) / 20 &&\n                FXSYS_fabs(m_Matrix.a) < 0.5f && FXSYS_fabs(m_Matrix.d) < 0.5f) {\n            int dest_width = image_rect.Width();\n            int dest_height = image_rect.Height();\n            FX_RECT bitmap_clip = m_ClipBox;\n            bitmap_clip.Offset(-image_rect.left, -image_rect.top);\n            bitmap_clip = _FXDIB_SwapClipBox(bitmap_clip, dest_width, dest_height, m_Matrix.c > 0, m_Matrix.b < 0);\n            m_Composer.Compose(pDevice, pClipRgn, bitmap_alpha, mask_color, m_ClipBox, TRUE,\n                               m_Matrix.c > 0, m_Matrix.b < 0, m_bRgbByteOrder, alpha_flag, pIccTransform, m_BlendType);\n            if (!m_Stretcher.Start(&m_Composer, pSource, dest_height, dest_width, bitmap_clip, dib_flags)) {\n                return FALSE;\n            }\n            m_Status = 1;\n            return TRUE;\n        }\n        m_Status = 2;\n        m_pTransformer = FX_NEW CFX_ImageTransformer;\n        if (!m_pTransformer) {\n            return FALSE;\n        }\n        m_pTransformer->Start(pSource, &m_Matrix, dib_flags, &m_ClipBox);\n        return TRUE;\n    }\n    int dest_width = image_rect.Width();\n    if (m_Matrix.a < 0) {\n        dest_width = -dest_width;\n    }\n    int dest_height = image_rect.Height();\n    if (m_Matrix.d > 0) {\n        dest_height = -dest_height;\n    }\n    if (dest_width == 0 || dest_height == 0) {\n        return FALSE;\n    }\n    FX_RECT bitmap_clip = m_ClipBox;\n    bitmap_clip.Offset(-image_rect.left, -image_rect.top);\n    m_Composer.Compose(pDevice, pClipRgn, bitmap_alpha, mask_color,\n                       m_ClipBox, FALSE, FALSE, FALSE, m_bRgbByteOrder, alpha_flag, pIccTransform, m_BlendType);\n    m_Status = 1;\n    ret = m_Stretcher.Start(&m_Composer, pSource, dest_width, dest_height, bitmap_clip, dib_flags);\n    return ret;\n}\nFX_BOOL CFX_ImageRenderer::Continue(IFX_Pause* pPause)\n{\n    if (m_Status == 1) {\n        return m_Stretcher.Continue(pPause);\n    } else if (m_Status == 2) {\n        if (m_pTransformer->Continue(pPause)) {\n            return TRUE;\n        }\n        CFX_DIBitmap* pBitmap = m_pTransformer->m_Storer.Detach();\n        if (pBitmap == NULL) {\n            return FALSE;\n        }\n        if (pBitmap->GetBuffer() == NULL) {\n            delete pBitmap;\n            return FALSE;\n        }\n        if (pBitmap->IsAlphaMask()) {\n            if (m_BitmapAlpha != 255) {\n                if (m_AlphaFlag >> 8) {\n                    m_AlphaFlag = (((FX_BYTE)((m_AlphaFlag & 0xff) * m_BitmapAlpha / 255)) | ((m_AlphaFlag >> 8) << 8));\n                } else {\n                    m_MaskColor = FXARGB_MUL_ALPHA(m_MaskColor, m_BitmapAlpha);\n                }\n            }\n            m_pDevice->CompositeMask(m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop,\n                                     pBitmap->GetWidth(), pBitmap->GetHeight(), pBitmap, m_MaskColor,\n                                     0, 0, m_BlendType, m_pClipRgn, m_bRgbByteOrder, m_AlphaFlag, m_pIccTransform);\n        } else {\n            if (m_BitmapAlpha != 255) {\n                pBitmap->MultiplyAlpha(m_BitmapAlpha);\n            }\n            m_pDevice->CompositeBitmap(m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop,\n                                       pBitmap->GetWidth(), pBitmap->GetHeight(), pBitmap, 0, 0, m_BlendType, m_pClipRgn, m_bRgbByteOrder, m_pIccTransform);\n        }\n        delete pBitmap;\n        return FALSE;\n    }\n    return FALSE;\n}\nCFX_BitmapStorer::CFX_BitmapStorer()\n{\n    m_pBitmap = NULL;\n}\nCFX_BitmapStorer::~CFX_BitmapStorer()\n{\n    if (m_pBitmap) {\n        delete m_pBitmap;\n    }\n}\nCFX_DIBitmap* CFX_BitmapStorer::Detach()\n{\n    CFX_DIBitmap* pBitmap = m_pBitmap;\n    m_pBitmap = NULL;\n    return pBitmap;\n}\nvoid CFX_BitmapStorer::Replace(CFX_DIBitmap* pBitmap)\n{\n    if (m_pBitmap) {\n        delete m_pBitmap;\n    }\n    m_pBitmap = pBitmap;\n}\nvoid CFX_BitmapStorer::ComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha)\n{\n    FX_LPBYTE dest_buf = (FX_LPBYTE)m_pBitmap->GetScanline(line);\n    FX_LPBYTE dest_alpha_buf = m_pBitmap->m_pAlphaMask ?\n                               (FX_LPBYTE)m_pBitmap->m_pAlphaMask->GetScanline(line) : NULL;\n    if (dest_buf) {\n        FXSYS_memcpy32(dest_buf, scanline, m_pBitmap->GetPitch());\n    }\n    if (dest_alpha_buf) {\n        FXSYS_memcpy32(dest_alpha_buf, scan_extra_alpha, m_pBitmap->m_pAlphaMask->GetPitch());\n    }\n}\nFX_BOOL CFX_BitmapStorer::SetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette)\n{\n    m_pBitmap = FX_NEW CFX_DIBitmap;\n    if (!m_pBitmap) {\n        return FALSE;\n    }\n    if (!m_pBitmap->Create(width, height, src_format)) {\n        delete m_pBitmap;\n        m_pBitmap = NULL;\n        return FALSE;\n    }\n    if (pSrcPalette) {\n        m_pBitmap->CopyPalette(pSrcPalette);\n    }\n    return TRUE;\n}\n"
  },
  {
    "path": "core/src/fxge/dib/fx_dib_transform.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxge/fx_dib.h\"\n#include \"dib_int.h\"\nint SDP_Table[513] = {\n    256, 256, 256, 256, 256, 256, 256, 256, 256, 255, 255, 255, 255, 255, 255, 254, 254, 254, 254,\n    253, 253, 253, 252, 252, 252, 251, 251, 251, 250, 250, 249, 249, 249, 248, 248, 247, 247, 246,\n    246, 245, 244, 244, 243, 243, 242, 242, 241, 240, 240, 239, 238, 238, 237, 236, 236, 235, 234,\n    233, 233, 232, 231, 230, 230, 229, 228, 227, 226, 226, 225, 224, 223, 222, 221, 220, 219, 218,\n    218, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, 200,\n    199, 198, 196, 195, 194, 193, 192, 191, 190, 189, 188, 186, 185, 184, 183, 182, 181, 179, 178,\n    177, 176, 175, 173, 172, 171, 170, 169, 167, 166, 165, 164, 162, 161, 160, 159, 157, 156, 155,\n    154, 152, 151, 150, 149, 147, 146, 145, 143, 142, 141, 140, 138, 137, 136, 134, 133, 132, 130,\n    129, 128, 126, 125, 124, 122, 121, 120, 119, 117, 116, 115, 113, 112, 111, 109, 108, 107, 105,\n    104, 103, 101, 100, 99, 97, 96, 95, 93, 92, 91, 89, 88, 87, 85, 84, 83, 81, 80, 79, 77, 76, 75,\n    73, 72, 71, 69, 68, 67, 66, 64, 63, 62, 60, 59, 58, 57, 55, 54, 53, 52, 50, 49, 48, 47, 45, 44,\n    43, 42, 40, 39, 38, 37, 36, 34, 33, 32, 31, 30, 28, 27, 26, 25, 24, 23, 21, 20, 19, 18, 17, 16,\n    15, 14, 13, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, -1, -2, -3, -4, -5, -6, -7, -7, -8, -9, -10,\n    -11, -12, -12, -13, -14, -15, -15, -16, -17, -17, -18, -19, -19, -20, -21, -21, -22, -22, -23, -24,\n    -24, -25, -25, -26, -26, -27, -27, -27, -28, -28, -29, -29, -30, -30, -30, -31, -31, -31, -32, -32,\n    -32, -33, -33, -33, -33, -34, -34, -34, -34, -35, -35, -35, -35, -35, -36, -36, -36, -36, -36, -36,\n    -36, -36, -36, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37,\n    -37, -37, -37, -37, -36, -36, -36, -36, -36, -36, -36, -36, -36, -35, -35, -35, -35, -35, -35, -34,\n    -34, -34, -34, -34, -33, -33, -33, -33, -33, -32, -32, -32, -32, -31, -31, -31, -31, -30, -30, -30,\n    -30, -29, -29, -29, -29, -28, -28, -28, -27, -27, -27, -27, -26, -26, -26, -25, -25, -25, -24, -24,\n    -24, -23, -23, -23, -22, -22, -22, -22, -21, -21, -21, -20, -20, -20, -19, -19, -19, -18, -18, -18,\n    -17, -17, -17, -16, -16, -16, -15, -15, -15, -14, -14, -14, -13, -13, -13, -12, -12, -12, -11, -11,\n    -11, -10, -10, -10, -9, -9, -9, -9, -8, -8, -8, -7, -7, -7, -7, -6, -6, -6, -6, -5, -5, -5, -5, -4,\n    -4, -4, -4, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n};\nclass CFX_BilinearMatrix : public CPDF_FixedMatrix\n{\npublic:\n    CFX_BilinearMatrix(const CFX_AffineMatrix& src, int bits): CPDF_FixedMatrix(src, bits)\n    {}\n    inline void\tTransform(int x, int y, int& x1, int& y1, int&res_x, int&res_y)\n    {\n        x1 = a * x + c * y + e + base / 2;\n        y1 = b * x + d * y + f + base / 2;\n        res_x = x1 % base;\n        res_y = y1 % base;\n        if (res_x < 0 && res_x > -base) {\n            res_x = base + res_x;\n        }\n        if (res_y < 0 && res_x > -base) {\n            res_y = base + res_y;\n        }\n        x1 /= base;\n        y1 /= base;\n    }\n};\nCFX_DIBitmap* CFX_DIBSource::SwapXY(FX_BOOL bXFlip, FX_BOOL bYFlip, const FX_RECT* pDestClip) const\n{\n    FX_RECT dest_clip(0, 0, m_Height, m_Width);\n    if (pDestClip) {\n        dest_clip.Intersect(*pDestClip);\n    }\n    if (dest_clip.IsEmpty()) {\n        return NULL;\n    }\n    CFX_DIBitmap* pTransBitmap = FX_NEW CFX_DIBitmap;\n    if (!pTransBitmap) {\n        return NULL;\n    }\n    int result_height = dest_clip.Height(), result_width = dest_clip.Width();\n    if (!pTransBitmap->Create(result_width, result_height, GetFormat())) {\n        delete pTransBitmap;\n        return NULL;\n    }\n    pTransBitmap->CopyPalette(m_pPalette);\n    int src_pitch = m_Pitch;\n    int dest_pitch = pTransBitmap->GetPitch();\n    FX_LPBYTE dest_buf = pTransBitmap->GetBuffer();\n    int row_start = bXFlip ? m_Height - dest_clip.right : dest_clip.left;\n    int row_end = bXFlip ? m_Height - dest_clip.left : dest_clip.right;\n    int col_start = bYFlip ? m_Width - dest_clip.bottom : dest_clip.top;\n    int col_end = bYFlip ? m_Width - dest_clip.top : dest_clip.bottom;\n    if (GetBPP() == 1) {\n        FXSYS_memset8(dest_buf, 0xff, dest_pitch * result_height);\n        for (int row = row_start; row < row_end; row ++) {\n            FX_LPCBYTE src_scan = GetScanline(row);\n            int dest_col = (bXFlip ? dest_clip.right - (row - row_start) - 1 : row) - dest_clip.left;\n            FX_LPBYTE dest_scan = dest_buf;\n            if (bYFlip) {\n                dest_scan += (result_height - 1) * dest_pitch;\n            }\n            int dest_step = bYFlip ? -dest_pitch : dest_pitch;\n            for (int col = col_start; col < col_end; col ++) {\n                if (!(src_scan[col / 8] & (1 << (7 - col % 8)))) {\n                    dest_scan[dest_col / 8] &= ~(1 << (7 - dest_col % 8));\n                }\n                dest_scan += dest_step;\n            }\n        }\n    } else {\n        int nBytes = GetBPP() / 8;\n        int dest_step = bYFlip ? -dest_pitch : dest_pitch;\n        if (nBytes == 3) {\n            dest_step -= 2;\n        }\n        for (int row = row_start; row < row_end; row ++) {\n            int dest_col = (bXFlip ? dest_clip.right - (row - row_start) - 1 : row) - dest_clip.left;\n            FX_LPBYTE dest_scan = dest_buf + dest_col * nBytes;\n            if (bYFlip) {\n                dest_scan += (result_height - 1) * dest_pitch;\n            }\n            if (nBytes == 4) {\n                FX_DWORD* src_scan = (FX_DWORD*)GetScanline(row) + col_start;\n                for (int col = col_start; col < col_end; col ++) {\n                    *(FX_DWORD*)dest_scan = *src_scan++;\n                    dest_scan += dest_step;\n                }\n            } else {\n                FX_LPCBYTE src_scan = GetScanline(row) + col_start * nBytes;\n                if (nBytes == 1)\n                    for (int col = col_start; col < col_end; col ++) {\n                        *dest_scan = *src_scan++;\n                        dest_scan += dest_step;\n                    }\n                else\n                    for (int col = col_start; col < col_end; col ++) {\n                        *dest_scan++ = *src_scan++;\n                        *dest_scan++ = *src_scan++;\n                        *dest_scan = *src_scan++;\n                        dest_scan += dest_step;\n                    }\n            }\n        }\n    }\n    if (m_pAlphaMask) {\n        src_pitch = m_pAlphaMask->m_Pitch;\n        dest_pitch = pTransBitmap->m_pAlphaMask->GetPitch();\n        dest_buf = pTransBitmap->m_pAlphaMask->GetBuffer();\n        int dest_step = bYFlip ? -dest_pitch : dest_pitch;\n        for (int row = row_start; row < row_end; row ++) {\n            int dest_col = (bXFlip ? dest_clip.right - (row - row_start) - 1 : row) - dest_clip.left;\n            FX_LPBYTE dest_scan = dest_buf + dest_col;\n            if (bYFlip) {\n                dest_scan += (result_height - 1) * dest_pitch;\n            }\n            FX_LPCBYTE src_scan = m_pAlphaMask->GetScanline(row) + col_start;\n            for (int col = col_start; col < col_end; col ++) {\n                *dest_scan = *src_scan++;\n                dest_scan += dest_step;\n            }\n        }\n    }\n    return pTransBitmap;\n}\n#define FIX16_005 0.05f\nFX_RECT _FXDIB_SwapClipBox(FX_RECT& clip, int width, int height, FX_BOOL bFlipX, FX_BOOL bFlipY)\n{\n    FX_RECT rect;\n    if (bFlipY) {\n        rect.left = height - clip.top;\n        rect.right = height - clip.bottom;\n    } else {\n        rect.left = clip.top;\n        rect.right = clip.bottom;\n    }\n    if (bFlipX) {\n        rect.top = width - clip.left;\n        rect.bottom = width - clip.right;\n    } else {\n        rect.top = clip.left;\n        rect.bottom = clip.right;\n    }\n    rect.Normalize();\n    return rect;\n}\nCFX_DIBitmap* CFX_DIBSource::TransformTo(const CFX_AffineMatrix* pDestMatrix, int& result_left, int& result_top,\n        FX_DWORD flags, const FX_RECT* pDestClip) const\n{\n    CFX_ImageTransformer transformer;\n    transformer.Start(this, pDestMatrix, flags, pDestClip);\n    transformer.Continue(NULL);\n    result_left = transformer.m_ResultLeft;\n    result_top = transformer.m_ResultTop;\n    CFX_DIBitmap* pTransformed = transformer.m_Storer.Detach();\n    return pTransformed;\n}\nCFX_DIBitmap* CFX_DIBSource::StretchTo(int dest_width, int dest_height, FX_DWORD flags, const FX_RECT* pClip) const\n{\n    FX_RECT clip_rect(0, 0, FXSYS_abs(dest_width), FXSYS_abs(dest_height));\n    if (pClip) {\n        clip_rect.Intersect(*pClip);\n    }\n    if (clip_rect.IsEmpty()) {\n        return NULL;\n    }\n    if (dest_width == m_Width && dest_height == m_Height) {\n        return Clone(&clip_rect);\n    }\n    CFX_ImageStretcher stretcher;\n    CFX_BitmapStorer storer;\n    if (stretcher.Start(&storer, this, dest_width, dest_height, clip_rect, flags)) {\n        stretcher.Continue(NULL);\n    }\n    return storer.Detach();\n}\nCFX_ImageTransformer::CFX_ImageTransformer()\n{\n    m_Status = 0;\n    m_pMatrix = NULL;\n}\nCFX_ImageTransformer::~CFX_ImageTransformer()\n{\n}\nFX_BOOL CFX_ImageTransformer::Start(const CFX_DIBSource* pSrc, const CFX_AffineMatrix* pDestMatrix, int flags, const FX_RECT* pDestClip)\n{\n    m_pMatrix = (CFX_AffineMatrix*)pDestMatrix;\n    CFX_FloatRect unit_rect = pDestMatrix->GetUnitRect();\n    FX_RECT result_rect = unit_rect.GetClosestRect();\n    FX_RECT result_clip = result_rect;\n    if (pDestClip) {\n        result_clip.Intersect(*pDestClip);\n    }\n    if (result_clip.IsEmpty()) {\n        return FALSE;\n    }\n    m_ResultLeft = result_clip.left;\n    m_ResultTop = result_clip.top;\n    m_ResultWidth = result_clip.Width();\n    m_ResultHeight = result_clip.Height();\n    m_Flags = flags;\n    if (FXSYS_fabs(pDestMatrix->a) < FXSYS_fabs(pDestMatrix->b) / 20 &&\n            FXSYS_fabs(pDestMatrix->d) < FXSYS_fabs(pDestMatrix->c) / 20 &&\n            FXSYS_fabs(pDestMatrix->a) < 0.5f && FXSYS_fabs(pDestMatrix->d) < 0.5f) {\n        int dest_width = result_rect.Width();\n        int dest_height = result_rect.Height();\n        result_clip.Offset(-result_rect.left, -result_rect.top);\n        result_clip = _FXDIB_SwapClipBox(result_clip, dest_width, dest_height, pDestMatrix->c > 0, pDestMatrix->b < 0);\n        m_Stretcher.Start(&m_Storer, pSrc, dest_height, dest_width, result_clip, flags);\n        m_Status = 1;\n        return TRUE;\n    }\n    if (FXSYS_fabs(pDestMatrix->b) < FIX16_005 && FXSYS_fabs(pDestMatrix->c) < FIX16_005) {\n        int dest_width = pDestMatrix->a > 0 ? (int)FXSYS_ceil(pDestMatrix->a) : (int)FXSYS_floor(pDestMatrix->a);\n        int dest_height = pDestMatrix->d > 0 ? (int) - FXSYS_ceil(pDestMatrix->d) : (int) - FXSYS_floor(pDestMatrix->d);\n        result_clip.Offset(-result_rect.left, -result_rect.top);\n        m_Stretcher.Start(&m_Storer, pSrc, dest_width, dest_height, result_clip, flags);\n        m_Status = 2;\n        return TRUE;\n    }\n    int stretch_width = (int)FXSYS_ceil(FXSYS_sqrt2(pDestMatrix->a, pDestMatrix->b));\n    int stretch_height = (int)FXSYS_ceil(FXSYS_sqrt2(pDestMatrix->c, pDestMatrix->d));\n    CFX_AffineMatrix stretch2dest(1.0f, 0.0f, 0.0f, -1.0f, 0.0f, (FX_FLOAT)(stretch_height));\n    stretch2dest.Concat(pDestMatrix->a / stretch_width, pDestMatrix->b / stretch_width,\n                        pDestMatrix->c / stretch_height, pDestMatrix->d / stretch_height, pDestMatrix->e, pDestMatrix->f);\n    m_dest2stretch.SetReverse(stretch2dest);\n    CFX_FloatRect clip_rect_f(result_clip);\n    clip_rect_f.Transform(&m_dest2stretch);\n    m_StretchClip = clip_rect_f.GetOutterRect();\n    m_StretchClip.Intersect(0, 0, stretch_width, stretch_height);\n    m_Stretcher.Start(&m_Storer, pSrc, stretch_width, stretch_height, m_StretchClip, flags);\n    m_Status = 3;\n    return TRUE;\n}\nFX_BYTE _bilinear_interpol(FX_LPCBYTE buf, int row_offset_l, int row_offset_r,\n                           int src_col_l, int src_col_r, int res_x, int res_y,\n                           int bpp, int c_offset)\n{\n    int i_resx = 255 - res_x;\n    int col_bpp_l = src_col_l * bpp;\n    int col_bpp_r = src_col_r * bpp;\n    FX_LPCBYTE buf_u = buf + row_offset_l + c_offset;\n    FX_LPCBYTE buf_d = buf + row_offset_r + c_offset;\n    FX_LPCBYTE src_pos0 = buf_u + col_bpp_l;\n    FX_LPCBYTE src_pos1 = buf_u + col_bpp_r;\n    FX_LPCBYTE src_pos2 = buf_d + col_bpp_l;\n    FX_LPCBYTE src_pos3 = buf_d + col_bpp_r;\n    FX_BYTE r_pos_0 = (*src_pos0 * i_resx + *src_pos1 * res_x) >> 8;\n    FX_BYTE r_pos_1 = (*src_pos2 * i_resx + *src_pos3 * res_x) >> 8;\n    return (r_pos_0 * (255 - res_y) + r_pos_1 * res_y) >> 8;\n}\nFX_BYTE _bicubic_interpol(FX_LPCBYTE buf, int pitch, int pos_pixel[], int u_w[], int v_w[], int res_x, int res_y,\n                          int bpp, int c_offset)\n{\n    int s_result = 0;\n    for (int i = 0; i < 4; i ++) {\n        int a_result = 0;\n        for (int j = 0; j < 4; j ++) {\n            a_result += u_w[j] * (*(FX_BYTE*)(buf + pos_pixel[i + 4] * pitch + pos_pixel[j] * bpp + c_offset));\n        }\n        s_result += a_result * v_w[i];\n    }\n    s_result >>= 16;\n    return (FX_BYTE)(s_result < 0 ? 0 : s_result > 255 ? 255 : s_result);\n}\nvoid _bicubic_get_pos_weight(int pos_pixel[], int u_w[], int v_w[], int src_col_l, int src_row_l,\n                             int res_x, int res_y, int stretch_width, int stretch_height)\n{\n    pos_pixel[0] = src_col_l - 1;\n    pos_pixel[1] = src_col_l;\n    pos_pixel[2] = src_col_l + 1;\n    pos_pixel[3] = src_col_l + 2;\n    pos_pixel[4] = src_row_l - 1;\n    pos_pixel[5] = src_row_l;\n    pos_pixel[6] = src_row_l + 1;\n    pos_pixel[7] = src_row_l + 2;\n    for (int i = 0 ; i < 4; i ++) {\n        if (pos_pixel[i] < 0) {\n            pos_pixel[i] = 0;\n        }\n        if (pos_pixel[i] >= stretch_width) {\n            pos_pixel[i] = stretch_width - 1;\n        }\n        if (pos_pixel[i + 4] < 0) {\n            pos_pixel[i + 4] = 0;\n        }\n        if (pos_pixel[i + 4] >= stretch_height) {\n            pos_pixel[i + 4] = stretch_height - 1;\n        }\n    }\n    u_w[0] = SDP_Table[256 + res_x];\n    u_w[1] = SDP_Table[res_x];\n    u_w[2] = SDP_Table[256 - res_x];\n    u_w[3] = SDP_Table[512 - res_x];\n    v_w[0] = SDP_Table[256 + res_y];\n    v_w[1] = SDP_Table[res_y];\n    v_w[2] = SDP_Table[256 - res_y];\n    v_w[3] = SDP_Table[512 - res_y];\n}\nFXDIB_Format _GetTransformedFormat(const CFX_DIBSource* pDrc)\n{\n    FXDIB_Format format = pDrc->GetFormat();\n    if (pDrc->IsAlphaMask()) {\n        format = FXDIB_8bppMask;\n    } else if (format >= 1025) {\n        format = FXDIB_Cmyka;\n    } else if (format <= 32 || format == FXDIB_Argb) {\n        format = FXDIB_Argb;\n    } else {\n        format = FXDIB_Rgba;\n    }\n    return format;\n}\nFX_BOOL CFX_ImageTransformer::Continue(IFX_Pause* pPause)\n{\n    if (m_Status == 1) {\n        if (m_Stretcher.Continue(pPause)) {\n            return TRUE;\n        }\n        if (m_Storer.GetBitmap()) {\n            m_Storer.Replace(m_Storer.GetBitmap()->SwapXY(m_pMatrix->c > 0, m_pMatrix->b < 0));\n        }\n        return FALSE;\n    } else if (m_Status == 2) {\n        return m_Stretcher.Continue(pPause);\n    } else if (m_Status != 3) {\n        return FALSE;\n    }\n    if (m_Stretcher.Continue(pPause)) {\n        return TRUE;\n    }\n    int stretch_width = m_StretchClip.Width();\n    int stretch_height = m_StretchClip.Height();\n    if (m_Storer.GetBitmap() == NULL) {\n        return FALSE;\n    }\n    FX_LPCBYTE stretch_buf = m_Storer.GetBitmap()->GetBuffer();\n    FX_LPCBYTE stretch_buf_mask = NULL;\n    if (m_Storer.GetBitmap()->m_pAlphaMask) {\n        stretch_buf_mask = m_Storer.GetBitmap()->m_pAlphaMask->GetBuffer();\n    }\n    int stretch_pitch = m_Storer.GetBitmap()->GetPitch();\n    CFX_DIBitmap* pTransformed = FX_NEW CFX_DIBitmap;\n    if (!pTransformed) {\n        return FALSE;\n    }\n    FXDIB_Format transformF = _GetTransformedFormat(m_Stretcher.m_pSource);\n    if (!pTransformed->Create(m_ResultWidth, m_ResultHeight, transformF)) {\n        delete pTransformed;\n        return FALSE;\n    }\n    pTransformed->Clear(0);\n    if (pTransformed->m_pAlphaMask) {\n        pTransformed->m_pAlphaMask->Clear(0);\n    }\n    CFX_AffineMatrix result2stretch(1.0f, 0.0f, 0.0f, 1.0f, (FX_FLOAT)(m_ResultLeft), (FX_FLOAT)(m_ResultTop));\n    result2stretch.Concat(m_dest2stretch);\n    result2stretch.TranslateI(-m_StretchClip.left, -m_StretchClip.top);\n    if (stretch_buf_mask == NULL && pTransformed->m_pAlphaMask) {\n        pTransformed->m_pAlphaMask->Clear(0xff000000);\n    } else if (pTransformed->m_pAlphaMask) {\n        int stretch_pitch_mask = m_Storer.GetBitmap()->m_pAlphaMask->GetPitch();\n        if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) {\n            CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);\n            for (int row = 0; row < m_ResultHeight; row ++) {\n                FX_BYTE* dest_pos_mask = (FX_BYTE*)pTransformed->m_pAlphaMask->GetScanline(row);\n                for (int col = 0; col < m_ResultWidth; col ++) {\n                    int src_col_l, src_row_l, res_x, res_y;\n                    result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);\n                    if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {\n                        if (src_col_l == stretch_width) {\n                            src_col_l--;\n                        }\n                        if (src_row_l == stretch_height) {\n                            src_row_l--;\n                        }\n                        int src_col_r = src_col_l + 1;\n                        int src_row_r = src_row_l + 1;\n                        if (src_col_r == stretch_width) {\n                            src_col_r--;\n                        }\n                        if (src_row_r == stretch_height) {\n                            src_row_r--;\n                        }\n                        int row_offset_l = src_row_l * stretch_pitch_mask;\n                        int row_offset_r = src_row_r * stretch_pitch_mask;\n                        *dest_pos_mask = _bilinear_interpol(stretch_buf_mask, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, 1, 0);\n                    }\n                    dest_pos_mask++;\n                }\n            }\n        } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {\n            CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);\n            for (int row = 0; row < m_ResultHeight; row ++) {\n                FX_BYTE* dest_pos_mask = (FX_BYTE*)pTransformed->m_pAlphaMask->GetScanline(row);\n                for (int col = 0; col < m_ResultWidth; col ++) {\n                    int src_col_l, src_row_l, res_x, res_y;\n                    result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);\n                    if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {\n                        int pos_pixel[8];\n                        int u_w[4], v_w[4];\n                        if (src_col_l == stretch_width) {\n                            src_col_l--;\n                        }\n                        if (src_row_l == stretch_height) {\n                            src_row_l--;\n                        }\n                        _bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, res_x, res_y, stretch_width, stretch_height);\n                        *dest_pos_mask = _bicubic_interpol(stretch_buf_mask, stretch_pitch_mask, pos_pixel, u_w, v_w, res_x, res_y, 1, 0);\n                    }\n                    dest_pos_mask++;\n                }\n            }\n        } else {\n            CPDF_FixedMatrix result2stretch_fix(result2stretch, 8);\n            for (int row = 0; row < m_ResultHeight; row ++) {\n                FX_BYTE* dest_pos_mask = (FX_BYTE*)pTransformed->m_pAlphaMask->GetScanline(row);\n                for (int col = 0; col < m_ResultWidth; col ++) {\n                    int src_col, src_row;\n                    result2stretch_fix.Transform(col, row, src_col, src_row);\n                    if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && src_row <= stretch_height) {\n                        if (src_col == stretch_width) {\n                            src_col --;\n                        }\n                        if (src_row == stretch_height) {\n                            src_row --;\n                        }\n                        *dest_pos_mask = stretch_buf_mask[src_row * stretch_pitch_mask + src_col];\n                    }\n                    dest_pos_mask++;\n                }\n            }\n        }\n    }\n    if (m_Storer.GetBitmap()->IsAlphaMask()) {\n        if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) {\n            CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);\n            for (int row = 0; row < m_ResultHeight; row ++) {\n                FX_LPBYTE dest_scan = (FX_LPBYTE)pTransformed->GetScanline(row);\n                for (int col = 0; col < m_ResultWidth; col ++) {\n                    int src_col_l, src_row_l, res_x, res_y;\n                    result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);\n                    if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {\n                        if (src_col_l == stretch_width) {\n                            src_col_l--;\n                        }\n                        if (src_row_l == stretch_height) {\n                            src_row_l--;\n                        }\n                        int src_col_r = src_col_l + 1;\n                        int src_row_r = src_row_l + 1;\n                        if (src_col_r == stretch_width) {\n                            src_col_r--;\n                        }\n                        if (src_row_r == stretch_height) {\n                            src_row_r--;\n                        }\n                        int row_offset_l = src_row_l * stretch_pitch;\n                        int row_offset_r = src_row_r * stretch_pitch;\n                        *dest_scan = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, 1, 0);\n                    }\n                    dest_scan ++;\n                }\n            }\n        } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {\n            CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);\n            for (int row = 0; row < m_ResultHeight; row ++) {\n                FX_LPBYTE dest_scan = (FX_LPBYTE)pTransformed->GetScanline(row);\n                for (int col = 0; col < m_ResultWidth; col ++) {\n                    int src_col_l, src_row_l, res_x, res_y;\n                    result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);\n                    if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {\n                        int pos_pixel[8];\n                        int u_w[4], v_w[4];\n                        if (src_col_l == stretch_width) {\n                            src_col_l--;\n                        }\n                        if (src_row_l == stretch_height) {\n                            src_row_l--;\n                        }\n                        _bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, res_x, res_y, stretch_width, stretch_height);\n                        *dest_scan = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, 1, 0);\n                    }\n                    dest_scan ++;\n                }\n            }\n        } else {\n            CPDF_FixedMatrix result2stretch_fix(result2stretch, 8);\n            for (int row = 0; row < m_ResultHeight; row ++) {\n                FX_LPBYTE dest_scan = (FX_LPBYTE)pTransformed->GetScanline(row);\n                for (int col = 0; col < m_ResultWidth; col ++) {\n                    int src_col, src_row;\n                    result2stretch_fix.Transform(col, row, src_col, src_row);\n                    if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && src_row <= stretch_height) {\n                        if (src_col == stretch_width) {\n                            src_col --;\n                        }\n                        if (src_row == stretch_height) {\n                            src_row --;\n                        }\n                        FX_LPCBYTE src_pixel = stretch_buf + stretch_pitch * src_row + src_col;\n                        *dest_scan = *src_pixel;\n                    }\n                    dest_scan ++;\n                }\n            }\n        }\n    } else {\n        int Bpp = m_Storer.GetBitmap()->GetBPP() / 8;\n        int destBpp = pTransformed->GetBPP() / 8;\n        if (Bpp == 1) {\n            FX_BOOL bHasAlpha = m_Storer.GetBitmap()->HasAlpha();\n            FX_DWORD argb[256];\n            FX_ARGB* pPal = m_Storer.GetBitmap()->GetPalette();\n            if (pPal) {\n                for (int i = 0; i < 256; i ++) {\n                    argb[i] = pPal[i];\n                }\n            } else {\n                if (m_Storer.GetBitmap()->IsCmykImage())\n                    for (int i = 0; i < 256; i ++) {\n                        argb[i] = 255 - i;\n                    }\n                else\n                    for (int i = 0; i < 256; i ++) {\n                        argb[i] = 0xff000000 | (i * 0x010101);\n                    }\n            }\n            if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) {\n                CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);\n                for (int row = 0; row < m_ResultHeight; row ++) {\n                    FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);\n                    for (int col = 0; col < m_ResultWidth; col ++) {\n                        int src_col_l, src_row_l, res_x, res_y;\n                        result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);\n                        if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {\n                            if (src_col_l == stretch_width) {\n                                src_col_l--;\n                            }\n                            if (src_row_l == stretch_height) {\n                                src_row_l--;\n                            }\n                            int src_col_r = src_col_l + 1;\n                            int src_row_r = src_row_l + 1;\n                            if (src_col_r == stretch_width) {\n                                src_col_r--;\n                            }\n                            if (src_row_r == stretch_height) {\n                                src_row_r--;\n                            }\n                            int row_offset_l = src_row_l * stretch_pitch;\n                            int row_offset_r = src_row_r * stretch_pitch;\n                            FX_DWORD r_bgra_cmyk = argb[_bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, 1, 0)];\n                            if (transformF == FXDIB_Rgba) {\n                                dest_pos[0] = (FX_BYTE)(r_bgra_cmyk >> 24);\n                                dest_pos[1] = (FX_BYTE)(r_bgra_cmyk >> 16);\n                                dest_pos[2] = (FX_BYTE)(r_bgra_cmyk >> 8);\n                            } else {\n                                *(FX_DWORD*)dest_pos = r_bgra_cmyk;\n                            }\n                        }\n                        dest_pos += destBpp;\n                    }\n                }\n            } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {\n                CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);\n                for (int row = 0; row < m_ResultHeight; row ++) {\n                    FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);\n                    for (int col = 0; col < m_ResultWidth; col ++) {\n                        int src_col_l, src_row_l, res_x, res_y;\n                        result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);\n                        if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {\n                            int pos_pixel[8];\n                            int u_w[4], v_w[4];\n                            if (src_col_l == stretch_width) {\n                                src_col_l--;\n                            }\n                            if (src_row_l == stretch_height) {\n                                src_row_l--;\n                            }\n                            _bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, res_x, res_y, stretch_width, stretch_height);\n                            FX_DWORD r_bgra_cmyk = argb[_bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, 1, 0)];\n                            if (transformF == FXDIB_Rgba) {\n                                dest_pos[0] = (FX_BYTE)(r_bgra_cmyk >> 24);\n                                dest_pos[1] = (FX_BYTE)(r_bgra_cmyk >> 16);\n                                dest_pos[2] = (FX_BYTE)(r_bgra_cmyk >> 8);\n                            } else {\n                                *(FX_DWORD*)dest_pos = r_bgra_cmyk;\n                            }\n                        }\n                        dest_pos += destBpp;\n                    }\n                }\n            } else {\n                CPDF_FixedMatrix result2stretch_fix(result2stretch, 8);\n                for (int row = 0; row < m_ResultHeight; row ++) {\n                    FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);\n                    for (int col = 0; col < m_ResultWidth; col ++) {\n                        int src_col, src_row;\n                        result2stretch_fix.Transform(col, row, src_col, src_row);\n                        if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && src_row <= stretch_height) {\n                            if (src_col == stretch_width) {\n                                src_col --;\n                            }\n                            if (src_row == stretch_height) {\n                                src_row --;\n                            }\n                            FX_DWORD r_bgra_cmyk = argb[stretch_buf[src_row * stretch_pitch + src_col]];\n                            if (transformF == FXDIB_Rgba) {\n                                dest_pos[0] = (FX_BYTE)(r_bgra_cmyk >> 24);\n                                dest_pos[1] = (FX_BYTE)(r_bgra_cmyk >> 16);\n                                dest_pos[2] = (FX_BYTE)(r_bgra_cmyk >> 8);\n                            } else {\n                                *(FX_DWORD*)dest_pos = r_bgra_cmyk;\n                            }\n                        }\n                        dest_pos += destBpp;\n                    }\n                }\n            }\n        } else {\n            FX_BOOL bHasAlpha = m_Storer.GetBitmap()->HasAlpha();\n            int destBpp = pTransformed->GetBPP() / 8;\n            if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) {\n                CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);\n                for (int row = 0; row < m_ResultHeight; row ++) {\n                    FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);\n                    for (int col = 0; col < m_ResultWidth; col ++) {\n                        int src_col_l, src_row_l, res_x, res_y, r_pos_k_r = 0;\n                        result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);\n                        if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {\n                            if (src_col_l == stretch_width) {\n                                src_col_l--;\n                            }\n                            if (src_row_l == stretch_height) {\n                                src_row_l--;\n                            }\n                            int src_col_r = src_col_l + 1;\n                            int src_row_r = src_row_l + 1;\n                            if (src_col_r == stretch_width) {\n                                src_col_r--;\n                            }\n                            if (src_row_r == stretch_height) {\n                                src_row_r--;\n                            }\n                            int row_offset_l = src_row_l * stretch_pitch;\n                            int row_offset_r = src_row_r * stretch_pitch;\n                            FX_BYTE r_pos_red_y_r   = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 2);\n                            FX_BYTE r_pos_green_m_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 1);\n                            FX_BYTE r_pos_blue_c_r  = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 0);\n                            if (bHasAlpha) {\n                                if (transformF != FXDIB_Argb) {\n                                    if (transformF == FXDIB_Rgba) {\n                                        dest_pos[0] = r_pos_blue_c_r;\n                                        dest_pos[1] = r_pos_green_m_r;\n                                        dest_pos[2] = r_pos_red_y_r;\n                                    } else {\n                                        r_pos_k_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 3);\n                                        *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, r_pos_red_y_r, r_pos_k_r));\n                                    }\n                                } else {\n                                    FX_BYTE r_pos_a_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 3);\n                                    *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(r_pos_a_r, r_pos_red_y_r, r_pos_green_m_r, r_pos_blue_c_r));\n                                }\n                            } else {\n                                r_pos_k_r = 0xff;\n                                if (transformF == FXDIB_Cmyka) {\n                                    r_pos_k_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 3);\n                                    *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, r_pos_red_y_r, r_pos_k_r));\n                                } else {\n                                    *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(r_pos_k_r, r_pos_red_y_r, r_pos_green_m_r, r_pos_blue_c_r));\n                                }\n                            }\n                        }\n                        dest_pos += destBpp;\n                    }\n                }\n            } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {\n                CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);\n                for (int row = 0; row < m_ResultHeight; row ++) {\n                    FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);\n                    for (int col = 0; col < m_ResultWidth; col ++) {\n                        int src_col_l, src_row_l, res_x, res_y, r_pos_k_r = 0;\n                        result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);\n                        if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {\n                            int pos_pixel[8];\n                            int u_w[4], v_w[4];\n                            if (src_col_l == stretch_width) {\n                                src_col_l--;\n                            }\n                            if (src_row_l == stretch_height) {\n                                src_row_l--;\n                            }\n                            _bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, res_x, res_y, stretch_width, stretch_height);\n                            FX_BYTE r_pos_red_y_r   = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 2);\n                            FX_BYTE r_pos_green_m_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 1);\n                            FX_BYTE r_pos_blue_c_r  = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 0);\n                            if (bHasAlpha) {\n                                if (transformF != FXDIB_Argb) {\n                                    if (transformF == FXDIB_Rgba) {\n                                        dest_pos[0] = r_pos_blue_c_r;\n                                        dest_pos[1] = r_pos_green_m_r;\n                                        dest_pos[2] = r_pos_red_y_r;\n                                    } else {\n                                        r_pos_k_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 3);\n                                        *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, r_pos_red_y_r, r_pos_k_r));\n                                    }\n                                } else {\n                                    FX_BYTE r_pos_a_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 3);\n                                    *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(r_pos_a_r, r_pos_red_y_r, r_pos_green_m_r, r_pos_blue_c_r));\n                                }\n                            } else {\n                                r_pos_k_r = 0xff;\n                                if (transformF == FXDIB_Cmyka) {\n                                    r_pos_k_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 3);\n                                    *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, r_pos_red_y_r, r_pos_k_r));\n                                } else {\n                                    *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(r_pos_k_r, r_pos_red_y_r, r_pos_green_m_r, r_pos_blue_c_r));\n                                }\n                            }\n                        }\n                        dest_pos += destBpp;\n                    }\n                }\n            } else {\n                CPDF_FixedMatrix result2stretch_fix(result2stretch, 8);\n                for (int row = 0; row < m_ResultHeight; row ++) {\n                    FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);\n                    for (int col = 0; col < m_ResultWidth; col ++) {\n                        int src_col, src_row;\n                        result2stretch_fix.Transform(col, row, src_col, src_row);\n                        if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && src_row <= stretch_height) {\n                            if (src_col == stretch_width) {\n                                src_col --;\n                            }\n                            if (src_row == stretch_height) {\n                                src_row --;\n                            }\n                            FX_LPCBYTE src_pos = stretch_buf + src_row * stretch_pitch + src_col * Bpp;\n                            if (bHasAlpha) {\n                                if (transformF != FXDIB_Argb) {\n                                    if (transformF == FXDIB_Rgba) {\n                                        dest_pos[0] = src_pos[0];\n                                        dest_pos[1] = src_pos[1];\n                                        dest_pos[2] = src_pos[2];\n                                    } else {\n                                        *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(src_pos[0], src_pos[1], src_pos[2], src_pos[3]));\n                                    }\n                                } else {\n                                    *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(src_pos[3], src_pos[2], src_pos[1], src_pos[0]));\n                                }\n                            } else {\n                                if (transformF == FXDIB_Cmyka) {\n                                    *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(src_pos[0], src_pos[1], src_pos[2], src_pos[3]));\n                                } else {\n                                    *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(0xff, src_pos[2], src_pos[1], src_pos[0]));\n                                }\n                            }\n                        }\n                        dest_pos += destBpp;\n                    }\n                }\n            }\n        }\n    }\n    m_Storer.Replace(pTransformed);\n    return FALSE;\n}\n"
  },
  {
    "path": "core/src/fxge/fontdata/chromefontdata/FoxitDingbats.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nconst unsigned char g_FoxitDingbatsFontData [29513] = {0x1,\n                                                       0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x11,\n                                                       0x43, 0x68, 0x72, 0x6f, 0x6d, 0x44, 0x69, 0x6e,\n                                                       0x67, 0x62, 0x61, 0x74, 0x73, 0x4f, 0x54, 0x46,\n                                                       0x0, 0x1, 0x1, 0x1, 0x25, 0xf8, 0x10, 0x0,\n                                                       0xf8, 0xe4, 0x1, 0xf8, 0xe5, 0x2, 0xf8, 0xe5,\n                                                       0x3, 0xf8, 0xe6, 0x4, 0x8a, 0xfb, 0x38, 0xfa,\n                                                       0x69, 0xf9, 0xce, 0x5, 0x1c, 0x4, 0xdc, 0xf,\n                                                       0x1c, 0x4, 0xe3, 0x11, 0xa7, 0x1c, 0x6e, 0x3f,\n                                                       0x12, 0x0, 0xcc, 0x2, 0x0, 0x1, 0x0, 0x3,\n                                                       0x0, 0x6, 0x0, 0xa, 0x0, 0xe, 0x0, 0x12,\n                                                       0x0, 0x16, 0x0, 0x1a, 0x0, 0x1e, 0x0, 0x22,\n                                                       0x0, 0x26, 0x0, 0x2a, 0x0, 0x2e, 0x0, 0x31,\n                                                       0x0, 0x35, 0x0, 0x39, 0x0, 0x3d, 0x0, 0x41,\n                                                       0x0, 0x45, 0x0, 0x49, 0x0, 0x4c, 0x0, 0x50,\n                                                       0x0, 0x54, 0x0, 0x58, 0x0, 0x5c, 0x0, 0x60,\n                                                       0x0, 0x64, 0x0, 0x68, 0x0, 0x6c, 0x0, 0x70,\n                                                       0x0, 0x74, 0x0, 0x77, 0x0, 0x7b, 0x0, 0x7f,\n                                                       0x0, 0x83, 0x0, 0x87, 0x0, 0x8b, 0x0, 0x8f,\n                                                       0x0, 0x93, 0x0, 0x97, 0x0, 0x9b, 0x0, 0x9f,\n                                                       0x0, 0xa2, 0x0, 0xa6, 0x0, 0xaa, 0x0, 0xae,\n                                                       0x0, 0xb2, 0x0, 0xb6, 0x0, 0xba, 0x0, 0xbe,\n                                                       0x0, 0xc2, 0x0, 0xc6, 0x0, 0xca, 0x0, 0xcd,\n                                                       0x0, 0xd1, 0x0, 0xd5, 0x0, 0xd9, 0x0, 0xdd,\n                                                       0x0, 0xe1, 0x0, 0xe5, 0x0, 0xe9, 0x0, 0xed,\n                                                       0x0, 0xf1, 0x0, 0xf5, 0x0, 0xf8, 0x0, 0xfc,\n                                                       0x1, 0x0, 0x1, 0x4, 0x1, 0x8, 0x1, 0xc,\n                                                       0x1, 0x10, 0x1, 0x14, 0x1, 0x18, 0x1, 0x1c,\n                                                       0x1, 0x20, 0x1, 0x23, 0x1, 0x27, 0x1, 0x2b,\n                                                       0x1, 0x2f, 0x1, 0x33, 0x1, 0x37, 0x1, 0x3b,\n                                                       0x1, 0x3f, 0x1, 0x43, 0x1, 0x47, 0x1, 0x4b,\n                                                       0x1, 0x4e, 0x1, 0x52, 0x1, 0x56, 0x1, 0x5a,\n                                                       0x1, 0x5e, 0x1, 0x62, 0x1, 0x66, 0x1, 0x6a,\n                                                       0x1, 0x6e, 0x1, 0x72, 0x1, 0x76, 0x1, 0x79,\n                                                       0x1, 0x7d, 0x1, 0x81, 0x1, 0x85, 0x1, 0x89,\n                                                       0x1, 0x8d, 0x1, 0x91, 0x1, 0x95, 0x1, 0x99,\n                                                       0x1, 0x9d, 0x1, 0xa1, 0x1, 0xa3, 0x1, 0xa6,\n                                                       0x1, 0xaa, 0x1, 0xae, 0x1, 0xb2, 0x1, 0xb6,\n                                                       0x1, 0xba, 0x1, 0xbe, 0x1, 0xc2, 0x1, 0xc5,\n                                                       0x1, 0xc8, 0x1, 0xcb, 0x1, 0xce, 0x1, 0xd1,\n                                                       0x1, 0xd4, 0x1, 0xd7, 0x1, 0xda, 0x1, 0xdd,\n                                                       0x1, 0xdf, 0x1, 0xe2, 0x1, 0xe5, 0x1, 0xe8,\n                                                       0x1, 0xeb, 0x1, 0xee, 0x1, 0xf1, 0x1, 0xf4,\n                                                       0x1, 0xf7, 0x1, 0xfa, 0x1, 0xfd, 0x1, 0xff,\n                                                       0x2, 0x2, 0x2, 0x5, 0x2, 0x8, 0x2, 0xb,\n                                                       0x2, 0xe, 0x2, 0x11, 0x2, 0x14, 0x2, 0x17,\n                                                       0x2, 0x1a, 0x2, 0x1d, 0x2, 0x1f, 0x2, 0x22,\n                                                       0x2, 0x25, 0x2, 0x28, 0x2, 0x2b, 0x2, 0x2e,\n                                                       0x2, 0x31, 0x2, 0x34, 0x2, 0x37, 0x2, 0x3a,\n                                                       0x2, 0x3d, 0x2, 0x3f, 0x2, 0x42, 0x2, 0x45,\n                                                       0x2, 0x48, 0x2, 0x4b, 0x2, 0x4e, 0x2, 0x51,\n                                                       0x2, 0x54, 0x2, 0x57, 0x2, 0x5a, 0x2, 0x5d,\n                                                       0x2, 0x5f, 0x2, 0x62, 0x2, 0x65, 0x2, 0x68,\n                                                       0x2, 0x6b, 0x2, 0x6e, 0x2, 0x71, 0x2, 0x74,\n                                                       0x2, 0x77, 0x2, 0x7a, 0x2, 0x7d, 0x2, 0x7f,\n                                                       0x2, 0x82, 0x2, 0x85, 0x2, 0x88, 0x2, 0x8b,\n                                                       0x2, 0x8e, 0x2, 0x91, 0x2, 0x94, 0x2, 0x97,\n                                                       0x2, 0x9a, 0x2, 0x9c, 0x2, 0x9f, 0x2, 0xa2,\n                                                       0x2, 0xa5, 0x2, 0xa8, 0x2, 0xab, 0x2, 0xae,\n                                                       0x2, 0xb1, 0x2, 0xb4, 0x2, 0xb7, 0x2, 0xba,\n                                                       0x2, 0xe4, 0x2, 0xf6, 0x2, 0xfc, 0x61, 0x31,\n                                                       0x61, 0x31, 0x30, 0x61, 0x31, 0x30, 0x30, 0x61,\n                                                       0x31, 0x30, 0x31, 0x61, 0x31, 0x30, 0x32, 0x61,\n                                                       0x31, 0x30, 0x33, 0x61, 0x31, 0x30, 0x34, 0x61,\n                                                       0x31, 0x30, 0x35, 0x61, 0x31, 0x30, 0x36, 0x61,\n                                                       0x31, 0x30, 0x37, 0x61, 0x31, 0x30, 0x38, 0x61,\n                                                       0x31, 0x30, 0x39, 0x61, 0x31, 0x31, 0x61, 0x31,\n                                                       0x31, 0x30, 0x61, 0x31, 0x31, 0x31, 0x61, 0x31,\n                                                       0x31, 0x32, 0x61, 0x31, 0x31, 0x37, 0x61, 0x31,\n                                                       0x31, 0x38, 0x61, 0x31, 0x31, 0x39, 0x61, 0x31,\n                                                       0x32, 0x61, 0x31, 0x32, 0x30, 0x61, 0x31, 0x32,\n                                                       0x31, 0x61, 0x31, 0x32, 0x32, 0x61, 0x31, 0x32,\n                                                       0x33, 0x61, 0x31, 0x32, 0x34, 0x61, 0x31, 0x32,\n                                                       0x35, 0x61, 0x31, 0x32, 0x36, 0x61, 0x31, 0x32,\n                                                       0x37, 0x61, 0x31, 0x32, 0x38, 0x61, 0x31, 0x32,\n                                                       0x39, 0x61, 0x31, 0x33, 0x61, 0x31, 0x33, 0x30,\n                                                       0x61, 0x31, 0x33, 0x31, 0x61, 0x31, 0x33, 0x32,\n                                                       0x61, 0x31, 0x33, 0x33, 0x61, 0x31, 0x33, 0x34,\n                                                       0x61, 0x31, 0x33, 0x35, 0x61, 0x31, 0x33, 0x36,\n                                                       0x61, 0x31, 0x33, 0x37, 0x61, 0x31, 0x33, 0x38,\n                                                       0x61, 0x31, 0x33, 0x39, 0x61, 0x31, 0x34, 0x61,\n                                                       0x31, 0x34, 0x30, 0x61, 0x31, 0x34, 0x31, 0x61,\n                                                       0x31, 0x34, 0x32, 0x61, 0x31, 0x34, 0x33, 0x61,\n                                                       0x31, 0x34, 0x34, 0x61, 0x31, 0x34, 0x35, 0x61,\n                                                       0x31, 0x34, 0x36, 0x61, 0x31, 0x34, 0x37, 0x61,\n                                                       0x31, 0x34, 0x38, 0x61, 0x31, 0x34, 0x39, 0x61,\n                                                       0x31, 0x35, 0x61, 0x31, 0x35, 0x30, 0x61, 0x31,\n                                                       0x35, 0x31, 0x61, 0x31, 0x35, 0x32, 0x61, 0x31,\n                                                       0x35, 0x33, 0x61, 0x31, 0x35, 0x34, 0x61, 0x31,\n                                                       0x35, 0x35, 0x61, 0x31, 0x35, 0x36, 0x61, 0x31,\n                                                       0x35, 0x37, 0x61, 0x31, 0x35, 0x38, 0x61, 0x31,\n                                                       0x35, 0x39, 0x61, 0x31, 0x36, 0x61, 0x31, 0x36,\n                                                       0x30, 0x61, 0x31, 0x36, 0x31, 0x61, 0x31, 0x36,\n                                                       0x32, 0x61, 0x31, 0x36, 0x33, 0x61, 0x31, 0x36,\n                                                       0x34, 0x61, 0x31, 0x36, 0x35, 0x61, 0x31, 0x36,\n                                                       0x36, 0x61, 0x31, 0x36, 0x37, 0x61, 0x31, 0x36,\n                                                       0x38, 0x61, 0x31, 0x36, 0x39, 0x61, 0x31, 0x37,\n                                                       0x61, 0x31, 0x37, 0x30, 0x61, 0x31, 0x37, 0x31,\n                                                       0x61, 0x31, 0x37, 0x32, 0x61, 0x31, 0x37, 0x33,\n                                                       0x61, 0x31, 0x37, 0x34, 0x61, 0x31, 0x37, 0x35,\n                                                       0x61, 0x31, 0x37, 0x36, 0x61, 0x31, 0x37, 0x37,\n                                                       0x61, 0x31, 0x37, 0x38, 0x61, 0x31, 0x37, 0x39,\n                                                       0x61, 0x31, 0x38, 0x61, 0x31, 0x38, 0x30, 0x61,\n                                                       0x31, 0x38, 0x31, 0x61, 0x31, 0x38, 0x32, 0x61,\n                                                       0x31, 0x38, 0x33, 0x61, 0x31, 0x38, 0x34, 0x61,\n                                                       0x31, 0x38, 0x35, 0x61, 0x31, 0x38, 0x36, 0x61,\n                                                       0x31, 0x38, 0x37, 0x61, 0x31, 0x38, 0x38, 0x61,\n                                                       0x31, 0x38, 0x39, 0x61, 0x31, 0x39, 0x61, 0x31,\n                                                       0x39, 0x30, 0x61, 0x31, 0x39, 0x31, 0x61, 0x31,\n                                                       0x39, 0x32, 0x61, 0x31, 0x39, 0x33, 0x61, 0x31,\n                                                       0x39, 0x34, 0x61, 0x31, 0x39, 0x35, 0x61, 0x31,\n                                                       0x39, 0x36, 0x61, 0x31, 0x39, 0x37, 0x61, 0x31,\n                                                       0x39, 0x38, 0x61, 0x31, 0x39, 0x39, 0x61, 0x32,\n                                                       0x61, 0x32, 0x30, 0x61, 0x32, 0x30, 0x30, 0x61,\n                                                       0x32, 0x30, 0x31, 0x61, 0x32, 0x30, 0x32, 0x61,\n                                                       0x32, 0x30, 0x33, 0x61, 0x32, 0x30, 0x34, 0x61,\n                                                       0x32, 0x30, 0x35, 0x61, 0x32, 0x30, 0x36, 0x61,\n                                                       0x32, 0x31, 0x61, 0x32, 0x32, 0x61, 0x32, 0x33,\n                                                       0x61, 0x32, 0x34, 0x61, 0x32, 0x35, 0x61, 0x32,\n                                                       0x36, 0x61, 0x32, 0x37, 0x61, 0x32, 0x38, 0x61,\n                                                       0x32, 0x39, 0x61, 0x33, 0x61, 0x33, 0x30, 0x61,\n                                                       0x33, 0x31, 0x61, 0x33, 0x32, 0x61, 0x33, 0x33,\n                                                       0x61, 0x33, 0x34, 0x61, 0x33, 0x35, 0x61, 0x33,\n                                                       0x36, 0x61, 0x33, 0x37, 0x61, 0x33, 0x38, 0x61,\n                                                       0x33, 0x39, 0x61, 0x34, 0x61, 0x34, 0x30, 0x61,\n                                                       0x34, 0x31, 0x61, 0x34, 0x32, 0x61, 0x34, 0x33,\n                                                       0x61, 0x34, 0x34, 0x61, 0x34, 0x35, 0x61, 0x34,\n                                                       0x36, 0x61, 0x34, 0x37, 0x61, 0x34, 0x38, 0x61,\n                                                       0x34, 0x39, 0x61, 0x35, 0x61, 0x35, 0x30, 0x61,\n                                                       0x35, 0x31, 0x61, 0x35, 0x32, 0x61, 0x35, 0x33,\n                                                       0x61, 0x35, 0x34, 0x61, 0x35, 0x35, 0x61, 0x35,\n                                                       0x36, 0x61, 0x35, 0x37, 0x61, 0x35, 0x38, 0x61,\n                                                       0x35, 0x39, 0x61, 0x36, 0x61, 0x36, 0x30, 0x61,\n                                                       0x36, 0x31, 0x61, 0x36, 0x32, 0x61, 0x36, 0x33,\n                                                       0x61, 0x36, 0x34, 0x61, 0x36, 0x35, 0x61, 0x36,\n                                                       0x36, 0x61, 0x36, 0x37, 0x61, 0x36, 0x38, 0x61,\n                                                       0x36, 0x39, 0x61, 0x37, 0x61, 0x37, 0x30, 0x61,\n                                                       0x37, 0x31, 0x61, 0x37, 0x32, 0x61, 0x37, 0x33,\n                                                       0x61, 0x37, 0x34, 0x61, 0x37, 0x35, 0x61, 0x37,\n                                                       0x36, 0x61, 0x37, 0x37, 0x61, 0x37, 0x38, 0x61,\n                                                       0x37, 0x39, 0x61, 0x38, 0x61, 0x38, 0x31, 0x61,\n                                                       0x38, 0x32, 0x61, 0x38, 0x33, 0x61, 0x38, 0x34,\n                                                       0x61, 0x38, 0x35, 0x61, 0x38, 0x36, 0x61, 0x38,\n                                                       0x37, 0x61, 0x38, 0x38, 0x61, 0x38, 0x39, 0x61,\n                                                       0x39, 0x61, 0x39, 0x30, 0x61, 0x39, 0x31, 0x61,\n                                                       0x39, 0x32, 0x61, 0x39, 0x33, 0x61, 0x39, 0x34,\n                                                       0x61, 0x39, 0x35, 0x61, 0x39, 0x36, 0x61, 0x39,\n                                                       0x37, 0x61, 0x39, 0x38, 0x61, 0x39, 0x39, 0x20,\n                                                       0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                       0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                       0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                       0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                       0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                       0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20, 0x44,\n                                                       0x69, 0x6e, 0x67, 0x62, 0x61, 0x74, 0x73, 0x20,\n                                                       0x4f, 0x54, 0x46, 0x4e, 0x6f, 0x72, 0x6d, 0x61,\n                                                       0x6c, 0x0, 0x0, 0x1, 0x1, 0x87, 0xc8, 0x0,\n                                                       0x1, 0x0, 0x0, 0xcb, 0x2, 0x0, 0x1, 0x0,\n                                                       0x4, 0x1, 0x3, 0x1, 0x8d, 0x1, 0xfa, 0x2,\n                                                       0x4a, 0x2, 0x95, 0x2, 0xe3, 0x3, 0x25, 0x3,\n                                                       0x71, 0x3, 0xc9, 0x4, 0xe0, 0x6, 0x2f, 0x6,\n                                                       0x9f, 0x7, 0xcc, 0x8, 0x9, 0x8, 0x4e, 0x8,\n                                                       0xce, 0x9, 0x5d, 0xb, 0x1d, 0xc, 0xf8, 0xe,\n                                                       0x27, 0xe, 0x74, 0xe, 0xe7, 0xf, 0x55, 0xf,\n                                                       0xa7, 0x10, 0x36, 0x10, 0x90, 0x10, 0xde, 0x11,\n                                                       0x71, 0x12, 0x22, 0x12, 0xaa, 0x14, 0x21, 0x14,\n                                                       0x5e, 0x14, 0xca, 0x15, 0x6f, 0x15, 0xce, 0x16,\n                                                       0x5e, 0x16, 0xe9, 0x17, 0x2d, 0x17, 0xa2, 0x18,\n                                                       0x1c, 0x18, 0xaa, 0x1a, 0x1f, 0x1a, 0x45, 0x1a,\n                                                       0x95, 0x1a, 0xfe, 0x1b, 0x34, 0x1b, 0x91, 0x1c,\n                                                       0xa, 0x1c, 0x3e, 0x1c, 0xbf, 0x1d, 0x35, 0x1d,\n                                                       0x97, 0x1d, 0xe3, 0x1e, 0x1, 0x1e, 0x56, 0x1e,\n                                                       0xbc, 0x1e, 0xfa, 0x1f, 0x45, 0x1f, 0xa3, 0x1f,\n                                                       0xcd, 0x20, 0x42, 0x20, 0xa9, 0x21, 0x14, 0x21,\n                                                       0x57, 0x21, 0x87, 0x21, 0xb7, 0x21, 0xcc, 0x22,\n                                                       0x15, 0x22, 0x5f, 0x22, 0x8f, 0x23, 0x15, 0x23,\n                                                       0x69, 0x23, 0x8f, 0x23, 0xb6, 0x24, 0x5f, 0x24,\n                                                       0xa1, 0x24, 0xf7, 0x25, 0x18, 0x25, 0x2b, 0x25,\n                                                       0x40, 0x25, 0x72, 0x25, 0xa2, 0x25, 0xc4, 0x25,\n                                                       0xf4, 0x26, 0x38, 0x26, 0xa7, 0x26, 0xfc, 0x27,\n                                                       0x3c, 0x27, 0x82, 0x27, 0xc8, 0x28, 0x22, 0x28,\n                                                       0x67, 0x28, 0xca, 0x29, 0x3f, 0x29, 0xa5, 0x29,\n                                                       0xcb, 0x2a, 0x28, 0x2a, 0x4d, 0x2a, 0x81, 0x2a,\n                                                       0xb0, 0x2a, 0xf3, 0x2b, 0x4e, 0x2b, 0xbc, 0x2b,\n                                                       0xec, 0x2c, 0x47, 0x2c, 0xb5, 0x2d, 0xc, 0x2d,\n                                                       0xcd, 0x2e, 0x37, 0x2e, 0x78, 0x2e, 0xbf, 0x2f,\n                                                       0x84, 0x2f, 0xb8, 0x2f, 0xdf, 0x30, 0x10, 0x30,\n                                                       0x2d, 0x30, 0xaf, 0x31, 0x34, 0x31, 0xf2, 0x32,\n                                                       0xcd, 0x33, 0x1a, 0x33, 0x46, 0x33, 0x7e, 0x33,\n                                                       0xb6, 0x36, 0x8, 0x36, 0xf2, 0x38, 0x52, 0x39,\n                                                       0x3f, 0x3b, 0x97, 0x3c, 0x1a, 0x3c, 0x82, 0x3c,\n                                                       0xb1, 0x3d, 0x6, 0x3d, 0x60, 0x3d, 0xb0, 0x3d,\n                                                       0xdd, 0x40, 0x4b, 0x40, 0x76, 0x40, 0xb1, 0x41,\n                                                       0x1b, 0x41, 0x81, 0x41, 0xbf, 0x42, 0x1b, 0x42,\n                                                       0xa2, 0x43, 0x2, 0x45, 0xaf, 0x45, 0xe5, 0x47,\n                                                       0xc, 0x47, 0xb8, 0x47, 0xfc, 0x48, 0x55, 0x49,\n                                                       0x91, 0x4a, 0xda, 0x4b, 0xee, 0x4c, 0xb1, 0x4e,\n                                                       0x67, 0x4f, 0x36, 0x51, 0x49, 0x51, 0x6f, 0x54,\n                                                       0xde, 0x55, 0x5e, 0x58, 0xd9, 0x59, 0xc7, 0x5a,\n                                                       0xb9, 0x5b, 0xa5, 0x5c, 0xb1, 0x5d, 0xb9, 0x5e,\n                                                       0x95, 0x60, 0xef, 0x61, 0x45, 0x62, 0xd, 0x62,\n                                                       0x38, 0x62, 0x8b, 0x62, 0x9a, 0x62, 0xcb, 0x62,\n                                                       0xf5, 0x63, 0x9, 0x63, 0x20, 0x63, 0x36, 0x63,\n                                                       0x8e, 0x63, 0xf7, 0x64, 0x17, 0x64, 0x24, 0x64,\n                                                       0x32, 0x64, 0x42, 0x64, 0x72, 0x64, 0x8c, 0x64,\n                                                       0xaa, 0x64, 0xca, 0x65, 0x2, 0x65, 0x74, 0x65,\n                                                       0xad, 0x65, 0xc5, 0x65, 0xdb, 0x66, 0xb, 0x66,\n                                                       0x3b, 0x66, 0x8f, 0x66, 0xe5, 0x67, 0x29, 0x67,\n                                                       0x6c, 0x67, 0xbf, 0x67, 0xc2, 0xfc, 0xc5, 0xe,\n                                                       0xf7, 0x1b, 0xf7, 0x18, 0x9f, 0x9d, 0xae, 0xbf,\n                                                       0xb9, 0x88, 0xa6, 0x71, 0xa6, 0xf7, 0x6a, 0xb3,\n                                                       0x64, 0xb3, 0x12, 0xf8, 0xfa, 0xac, 0xa2, 0xb1,\n                                                       0x65, 0xf7, 0x15, 0xfb, 0x13, 0xf7, 0x12, 0x9f,\n                                                       0xb5, 0x62, 0xb5, 0xbe, 0xbb, 0x5c, 0xbb, 0x13,\n                                                       0xe5, 0x34, 0xf9, 0x33, 0xf7, 0x95, 0x15, 0xbb,\n                                                       0x89, 0x9c, 0x83, 0xae, 0x6a, 0x8, 0x73, 0xa4,\n                                                       0xac, 0x77, 0xaf, 0x1b, 0x13, 0xe5, 0x32, 0xb9,\n                                                       0xbd, 0xb1, 0xbc, 0x1f, 0x13, 0xcd, 0x34, 0xba,\n                                                       0x63, 0xa3, 0x60, 0x56, 0x52, 0x78, 0x87, 0x54,\n                                                       0x1e, 0x64, 0x88, 0x5, 0x13, 0xe5, 0x34, 0xfc,\n                                                       0x64, 0xfb, 0x3e, 0x15, 0xf8, 0x42, 0x9f, 0xfb,\n                                                       0x38, 0x6, 0xf7, 0x3d, 0xf5, 0x8f, 0xc2, 0xb5,\n                                                       0xb2, 0xb2, 0xaf, 0xbc, 0xa1, 0xb5, 0xab, 0x19,\n                                                       0x13, 0xe5, 0x2c, 0xa1, 0x9c, 0x9d, 0xa3, 0xa8,\n                                                       0x1a, 0x13, 0xe3, 0x34, 0xb6, 0x65, 0xa7, 0x62,\n                                                       0x1e, 0x13, 0xe5, 0x94, 0x45, 0x67, 0x4f, 0x4d,\n                                                       0x85, 0x1f, 0x85, 0x50, 0x6f, 0x71, 0x60, 0x67,\n                                                       0xfb, 0x76, 0xfb, 0x50, 0x18, 0xfb, 0x31, 0x6,\n                                                       0xfb, 0x60, 0xcb, 0x15, 0xf8, 0x45, 0x9d, 0xf3,\n                                                       0xe2, 0x5, 0x8c, 0x7, 0xfc, 0xb0, 0x2c, 0x5,\n                                                       0xf9, 0x55, 0xf7, 0x95, 0x15, 0x13, 0xe3, 0x34,\n                                                       0xaa, 0xb0, 0xa7, 0xa8, 0x1e, 0x13, 0xe5, 0x2c,\n                                                       0xa4, 0x9f, 0x76, 0x72, 0x6c, 0x68, 0x71, 0x6e,\n                                                       0x1f, 0x13, 0xe5, 0x94, 0x73, 0x74, 0x9e, 0xa4,\n                                                       0x1f, 0x13, 0xcd, 0x54, 0xe6, 0xfb, 0x80, 0x15,\n                                                       0xac, 0xac, 0x9f, 0xa9, 0x1e, 0x13, 0xe5, 0x32,\n                                                       0xa6, 0xa3, 0x7a, 0x6e, 0x6a, 0x6c, 0x7a, 0x6d,\n                                                       0x1f, 0x13, 0xd5, 0x54, 0x71, 0x70, 0x98, 0xa9,\n                                                       0x1f, 0xfb, 0x6d, 0xaf, 0x15, 0x93, 0x90, 0x93,\n                                                       0x94, 0x94, 0x94, 0x84, 0x82, 0x83, 0x82, 0x84,\n                                                       0x83, 0x82, 0x85, 0x91, 0x94, 0x1e, 0xe, 0xfb,\n                                                       0x27, 0x92, 0x76, 0xf7, 0x4b, 0xae, 0xf7, 0xb0,\n                                                       0xaf, 0xf7, 0x49, 0x54, 0xa, 0xf7, 0x3d, 0x15,\n                                                       0xf7, 0x61, 0x6, 0xf5, 0xfb, 0x4b, 0xf5, 0xf7,\n                                                       0x4b, 0x5, 0xf7, 0x61, 0x6, 0x25, 0xf7, 0x45,\n                                                       0xf1, 0xf7, 0x46, 0x5, 0xfb, 0x61, 0x6, 0x21,\n                                                       0xf7, 0x49, 0x21, 0xfb, 0x49, 0x5, 0xfb, 0x61,\n                                                       0x6, 0xf0, 0xfb, 0x46, 0x5, 0xf8, 0x23, 0xb2,\n                                                       0x15, 0x4c, 0xf2, 0x5, 0xf7, 0xe, 0x6, 0xfb,\n                                                       0xc, 0xfb, 0xb0, 0x15, 0xc8, 0xf3, 0xc5, 0x23,\n                                                       0x5, 0xfc, 0x86, 0x16, 0xca, 0xf3, 0xc9, 0x23,\n                                                       0x5, 0x4d, 0xf7, 0x49, 0x15, 0x4f, 0xf2, 0x5,\n                                                       0xf7, 0xd, 0x6, 0xb6, 0xfb, 0xb0, 0x15, 0x39,\n                                                       0xf7, 0x22, 0xdd, 0xf7, 0x22, 0x5, 0xf7, 0x3d,\n                                                       0x6, 0xdd, 0xfb, 0x22, 0x39, 0xfb, 0x22, 0x5,\n                                                       0xfb, 0x29, 0xf7, 0xd4, 0x15, 0xcb, 0xf7, 0x3,\n                                                       0xca, 0xfb, 0x3, 0x5, 0xfb, 0xd, 0xfb, 0xf7,\n                                                       0x15, 0xf7, 0x10, 0x6, 0x49, 0xfb, 0x0, 0x5,\n                                                       0xe, 0xfb, 0x3f, 0x73, 0xa, 0xf8, 0xee, 0xfc,\n                                                       0x24, 0xeb, 0xf7, 0x65, 0xea, 0x13, 0xb0, 0xdb,\n                                                       0xf7, 0x78, 0x15, 0xf7, 0xc, 0x68, 0xa, 0x1e,\n                                                       0x13, 0xc0, 0x31, 0x54, 0x42, 0x44, 0x53, 0xa4,\n                                                       0x6a, 0x9f, 0x7f, 0x1f, 0x96, 0x85, 0x9a, 0x87,\n                                                       0x9c, 0x90, 0x8, 0x90, 0x9c, 0x95, 0x90, 0xa4,\n                                                       0x1b, 0x13, 0xb0, 0xb1, 0xa3, 0x76, 0x61, 0x59,\n                                                       0x6a, 0x4a, 0xfb, 0x16, 0x6b, 0x1f, 0x8f, 0x76,\n                                                       0x5, 0xf7, 0xc5, 0x16, 0xf7, 0xb, 0x68, 0xa,\n                                                       0x31, 0x54, 0x42, 0x44, 0x53, 0xa4, 0x6a, 0xa0,\n                                                       0x7f, 0x1e, 0x96, 0x85, 0x99, 0x87, 0x9c, 0x90,\n                                                       0x8, 0x90, 0x9d, 0x94, 0x90, 0xa5, 0x1b, 0xb0,\n                                                       0xa4, 0x76, 0x61, 0x59, 0x69, 0x4a, 0xfb, 0x16,\n                                                       0x6b, 0x1f, 0x90, 0x76, 0x5, 0xe, 0x20, 0xfb,\n                                                       0x38, 0xd6, 0xf9, 0xaa, 0x77, 0xf7, 0x25, 0x77,\n                                                       0x1, 0xf8, 0x8c, 0xa7, 0x3, 0xf7, 0x94, 0x2f,\n                                                       0x15, 0x65, 0x9d, 0xab, 0x69, 0xb6, 0x1b, 0xd5,\n                                                       0xf7, 0x1, 0xbb, 0xf7, 0x8d, 0x1f, 0xf8, 0xcc,\n                                                       0x7, 0xb7, 0xf7, 0x11, 0x40, 0x7d, 0x86, 0xfb,\n                                                       0x3, 0x5, 0x72, 0x6, 0xfb, 0x41, 0xfb, 0x22,\n                                                       0x33, 0xfb, 0x42, 0xfb, 0x4d, 0xf7, 0x3a, 0x3d,\n                                                       0xf7, 0x15, 0x91, 0x95, 0x8e, 0x99, 0xb0, 0x1f,\n                                                       0x5f, 0x7, 0xfb, 0x58, 0x34, 0x61, 0x32, 0x7b,\n                                                       0x6b, 0x90, 0x91, 0x7d, 0x1e, 0xe, 0xfb, 0xbb,\n                                                       0x92, 0x76, 0xf9, 0x64, 0x77, 0x1, 0xf7, 0xa4,\n                                                       0xf7, 0xa4, 0x15, 0x9f, 0xd2, 0xaa, 0x96, 0xcc,\n                                                       0xa8, 0x8, 0xd3, 0xa9, 0xa7, 0xc5, 0xdc, 0x1a,\n                                                       0xf7, 0x27, 0xfb, 0x1, 0x92, 0xfb, 0x5, 0x25,\n                                                       0xfb, 0x0, 0x78, 0xfb, 0x15, 0x37, 0xa4, 0x51,\n                                                       0xd6, 0x6a, 0x1e, 0xcd, 0x6e, 0xa9, 0x80, 0x9f,\n                                                       0x44, 0x8, 0xfb, 0x10, 0xfb, 0x35, 0x15, 0x47,\n                                                       0xc4, 0x52, 0xcf, 0xd1, 0xc2, 0xc4, 0xcf, 0xd1,\n                                                       0x54, 0xc2, 0x45, 0x47, 0x52, 0x54, 0x45, 0x1e,\n                                                       0xe, 0xfb, 0xbb, 0x3a, 0xa, 0xf7, 0xa3, 0xf7,\n                                                       0xa8, 0x15, 0xa4, 0xcd, 0xbe, 0xa8, 0xc8, 0xa5,\n                                                       0x8, 0xcd, 0xa8, 0xad, 0xd8, 0xd6, 0x1a, 0xd1,\n                                                       0x62, 0xc4, 0x3f, 0x4a, 0x63, 0x55, 0x52, 0x7c,\n                                                       0x1e, 0xc4, 0x7f, 0x5f, 0xc1, 0x4c, 0x1b, 0x3a,\n                                                       0x66, 0x4e, 0x42, 0x45, 0xb4, 0x3d, 0xc7, 0x71,\n                                                       0x1f, 0xc8, 0x70, 0xbe, 0x6f, 0xa3, 0x49, 0x8,\n                                                       0xfb, 0x12, 0xfb, 0x38, 0x15, 0x46, 0xc3, 0x52,\n                                                       0xd1, 0xd1, 0xc3, 0xc4, 0xd0, 0xd2, 0x53, 0xc2,\n                                                       0x45, 0x46, 0x52, 0x54, 0x44, 0x1e, 0xe, 0xd2,\n                                                       0xc8, 0x76, 0xf8, 0xf7, 0x77, 0x1, 0xf8, 0x5b,\n                                                       0xb3, 0x15, 0xb0, 0xe2, 0xe3, 0xbe, 0xe0, 0xab,\n                                                       0x8, 0xf7, 0x2d, 0xc3, 0xc4, 0xdc, 0xec, 0x1a,\n                                                       0xf7, 0xb, 0x39, 0xe3, 0xfb, 0xd, 0xfb, 0x3,\n                                                       0x40, 0x2c, 0x25, 0x6c, 0x1e, 0xf1, 0x6f, 0x3a,\n                                                       0xea, 0xfb, 0x1, 0x1b, 0xfb, 0xd, 0x3a, 0x32,\n                                                       0xfb, 0xb, 0x2e, 0xc6, 0x35, 0xe2, 0x6c, 0x1f,\n                                                       0xf7, 0x29, 0x54, 0xe3, 0x59, 0xb0, 0x33, 0x8,\n                                                       0xe, 0xd3, 0x61, 0x76, 0xcc, 0x76, 0xf8, 0xb4,\n                                                       0x77, 0xe6, 0x77, 0x1, 0xf8, 0xde, 0x96, 0x3,\n                                                       0xf7, 0x23, 0xc0, 0x15, 0xa0, 0x75, 0xf8, 0x3a,\n                                                       0xf8, 0x39, 0x8c, 0x6f, 0xfc, 0x2c, 0xfc, 0x2c,\n                                                       0x96, 0x81, 0xf8, 0x2a, 0xf8, 0x2a, 0xaf, 0x7d,\n                                                       0xfc, 0x35, 0xfc, 0x35, 0xbb, 0x5a, 0xf8, 0x43,\n                                                       0xf8, 0x43, 0xf2, 0xf7, 0x72, 0x80, 0x96, 0xfb,\n                                                       0x74, 0xfb, 0x10, 0x5, 0xb0, 0x5c, 0x15, 0x88,\n                                                       0xab, 0xf7, 0x17, 0xd8, 0x95, 0x82, 0x34, 0xfb,\n                                                       0x1d, 0x80, 0xa0, 0x5, 0xe, 0xfb, 0x40, 0x92,\n                                                       0x76, 0xf7, 0xea, 0xaf, 0xf7, 0xe9, 0x54, 0xa,\n                                                       0xf8, 0xea, 0x3, 0xf7, 0x59, 0xf7, 0xe6, 0x15,\n                                                       0x36, 0x7b, 0x3e, 0x44, 0x32, 0x1a, 0x2b, 0xd8,\n                                                       0x3b, 0xec, 0xb3, 0xaf, 0x96, 0xa3, 0xab, 0x1e,\n                                                       0xda, 0xc6, 0x88, 0xf7, 0x4, 0xd2, 0xcf, 0x8,\n                                                       0xac, 0xae, 0xbc, 0xae, 0xbc, 0x1b, 0xaf, 0x89,\n                                                       0x5, 0xb3, 0x7, 0x67, 0x89, 0x63, 0x8e, 0x61,\n                                                       0xa5, 0x69, 0xa4, 0x19, 0x3a, 0xc6, 0x8c, 0xf7,\n                                                       0x1, 0x4a, 0xcf, 0x8, 0xab, 0x6b, 0x60, 0x9e,\n                                                       0x5e, 0x1b, 0x28, 0x39, 0x40, 0x27, 0x33, 0xd8,\n                                                       0x42, 0xe0, 0x7c, 0x1f, 0xe, 0x3c, 0x81, 0xab,\n                                                       0xee, 0xa4, 0x90, 0xde, 0xf7, 0x4a, 0x94, 0x82,\n                                                       0xf7, 0x4, 0xf7, 0x0, 0xa2, 0x12, 0x9d, 0xb9,\n                                                       0xf7, 0x2b, 0xf7, 0x10, 0x60, 0x9d, 0xf7, 0x16,\n                                                       0xaf, 0x7e, 0xf7, 0x36, 0xd2, 0xb5, 0x13, 0xef,\n                                                       0x50, 0xf7, 0xce, 0xf7, 0x34, 0x15, 0x8d, 0x6,\n                                                       0x84, 0x92, 0x94, 0x89, 0x98, 0x1b, 0x9c, 0xe0,\n                                                       0x95, 0xc6, 0xd7, 0x1f, 0xc2, 0xb6, 0xbe, 0xc6,\n                                                       0xd9, 0x1a, 0xb2, 0x72, 0xb7, 0x56, 0x60, 0x6b,\n                                                       0x71, 0x6b, 0x71, 0x1e, 0x87, 0x8d, 0x5, 0x9f,\n                                                       0xaf, 0x99, 0xa5, 0xb5, 0x1a, 0xb8, 0x71, 0xde,\n                                                       0xfb, 0x9, 0xfb, 0x50, 0xfb, 0x17, 0xfb, 0x50,\n                                                       0xfb, 0x44, 0xfb, 0x2d, 0xe2, 0xfb, 0x2c, 0xf7,\n                                                       0x6b, 0xf7, 0x71, 0xf7, 0x5d, 0xf7, 0x5e, 0xf7,\n                                                       0x70, 0xf7, 0xa, 0x48, 0xd7, 0x59, 0x7f, 0x7f,\n                                                       0x84, 0x7e, 0x84, 0x1e, 0x90, 0x88, 0x97, 0x87,\n                                                       0x96, 0x84, 0x8, 0xb7, 0x6c, 0xad, 0x49, 0x33,\n                                                       0x1a, 0xfb, 0x5f, 0xfb, 0x27, 0xfb, 0x36, 0xfb,\n                                                       0x62, 0xfb, 0x45, 0x21, 0xf7, 0x1d, 0xf7, 0x3c,\n                                                       0x1e, 0x13, 0xf6, 0xb0, 0xf7, 0x22, 0xe3, 0xf7,\n                                                       0x3b, 0xf7, 0x31, 0xf3, 0xaa, 0x38, 0x5b, 0x1e,\n                                                       0x8c, 0x75, 0x87, 0x72, 0x85, 0x7a, 0x8, 0x89,\n                                                       0x6, 0xb0, 0x82, 0x76, 0xbd, 0x4a, 0x1b, 0x40,\n                                                       0x5b, 0x42, 0x45, 0x64, 0x95, 0x78, 0xa3, 0x6a,\n                                                       0x1f, 0xb1, 0x57, 0x97, 0x79, 0x88, 0x66, 0x8,\n                                                       0x69, 0x88, 0x6d, 0x84, 0x84, 0x1b, 0x67, 0x74,\n                                                       0xb6, 0xa3, 0x8d, 0x1f, 0x8c, 0x96, 0x87, 0x8e,\n                                                       0x83, 0x81, 0x8, 0x81, 0x7f, 0x87, 0x7f, 0x7c,\n                                                       0x1a, 0x69, 0xa4, 0x74, 0xaf, 0xb4, 0xa4, 0x9b,\n                                                       0xa2, 0x98, 0x1e, 0x13, 0xf7, 0x50, 0xa4, 0xf7,\n                                                       0x23, 0x15, 0xc1, 0xa9, 0xc1, 0xc6, 0x90, 0x1e,\n                                                       0x96, 0x8c, 0x8b, 0x89, 0x90, 0x85, 0x8, 0x13,\n                                                       0xf7, 0x30, 0x98, 0x7c, 0x95, 0x74, 0x6f, 0x1a,\n                                                       0x59, 0x67, 0x5b, 0x59, 0x80, 0x1e, 0x7f, 0x88,\n                                                       0x8a, 0x8c, 0x84, 0x93, 0x8, 0x7f, 0x99, 0x81,\n                                                       0xa0, 0xa7, 0x1a, 0xe, 0x3c, 0xcf, 0xf7, 0x37,\n                                                       0xfb, 0x37, 0xf7, 0x38, 0x4b, 0xca, 0xf7, 0xa,\n                                                       0xf7, 0x44, 0xca, 0x77, 0x12, 0x96, 0xe0, 0x74,\n                                                       0xcf, 0xc7, 0xa0, 0x8b, 0xdf, 0x9e, 0xac, 0xf7,\n                                                       0xed, 0xb3, 0x13, 0x9b, 0xe0, 0xf7, 0xcb, 0xf7,\n                                                       0xb5, 0x15, 0x85, 0x86, 0x75, 0x7c, 0x80, 0x7b,\n                                                       0x8, 0x7d, 0x78, 0x86, 0x77, 0x7b, 0x1a, 0x7b,\n                                                       0x92, 0x65, 0xb3, 0x67, 0x1e, 0x6a, 0xb0, 0xb5,\n                                                       0x84, 0xa1, 0x1b, 0xba, 0xbf, 0xa6, 0xb1, 0xaa,\n                                                       0x1f, 0xbb, 0xc5, 0x9a, 0x94, 0xb8, 0x96, 0xad,\n                                                       0x93, 0xa8, 0x9d, 0x9d, 0x99, 0x8, 0x9a, 0x98,\n                                                       0x93, 0xa0, 0x98, 0x1a, 0xa2, 0x7f, 0x9c, 0x78,\n                                                       0x7a, 0x81, 0x7c, 0x83, 0x87, 0x1e, 0x88, 0x84,\n                                                       0x8e, 0x85, 0x8f, 0x8a, 0x8, 0x93, 0x88, 0x95,\n                                                       0x84, 0x7f, 0x1a, 0x79, 0x7d, 0x7e, 0x77, 0x79,\n                                                       0x6a, 0x8e, 0xf2, 0x64, 0x1e, 0x85, 0x9b, 0x85,\n                                                       0x9b, 0x85, 0x99, 0x8, 0xd5, 0x6d, 0x6d, 0xbe,\n                                                       0x3b, 0x1b, 0x6f, 0x6a, 0x7e, 0x73, 0x75, 0x1f,\n                                                       0x77, 0x75, 0x7f, 0x6d, 0x6d, 0x1a, 0x6e, 0x9a,\n                                                       0x6c, 0x8f, 0x85, 0x1e, 0x8e, 0x85, 0x8b, 0x88,\n                                                       0x87, 0x88, 0x85, 0x8a, 0x84, 0x8c, 0x85, 0x8c,\n                                                       0x7e, 0x8c, 0x6a, 0x95, 0x6b, 0xa1, 0x8, 0x9a,\n                                                       0x82, 0x9c, 0x83, 0x97, 0x1e, 0x83, 0x96, 0x85,\n                                                       0x8f, 0x73, 0x85, 0x8, 0x78, 0x99, 0x7f, 0x9d,\n                                                       0xaa, 0x1a, 0xaa, 0x91, 0x99, 0x91, 0x9a, 0x1e,\n                                                       0x90, 0x95, 0x8e, 0x90, 0x82, 0x96, 0x8, 0x99,\n                                                       0x81, 0x7e, 0x95, 0x82, 0x1b, 0x70, 0x77, 0x59,\n                                                       0x75, 0x82, 0x8f, 0x78, 0xab, 0x60, 0x1f, 0xa7,\n                                                       0x67, 0xad, 0x6b, 0xa9, 0x74, 0x8d, 0x73, 0x85,\n                                                       0x68, 0x7a, 0x6d, 0x8, 0x74, 0x7e, 0x77, 0x80,\n                                                       0x78, 0x1b, 0x13, 0x3d, 0xe0, 0x72, 0x84, 0x9f,\n                                                       0x99, 0x94, 0x8b, 0x89, 0x89, 0x8e, 0x1f, 0x90,\n                                                       0x84, 0x81, 0x91, 0x7e, 0x1b, 0x6f, 0x72, 0x72,\n                                                       0x6b, 0x68, 0xab, 0x71, 0xb0, 0xa0, 0xa0, 0x90,\n                                                       0x9d, 0xa4, 0x1f, 0xb7, 0xab, 0xab, 0xcb, 0x8a,\n                                                       0xbe, 0x9d, 0x81, 0xbb, 0x77, 0x95, 0x88, 0x98,\n                                                       0x86, 0x87, 0x84, 0x8f, 0x87, 0x8, 0xbd, 0x8e,\n                                                       0x15, 0x87, 0x96, 0x8b, 0x8d, 0x91, 0x92, 0x8,\n                                                       0x9e, 0x9b, 0x9f, 0x9d, 0xb4, 0x1b, 0xbc, 0xaa,\n                                                       0x61, 0x67, 0x97, 0x1f, 0x8e, 0x83, 0x8a, 0x88,\n                                                       0x85, 0x87, 0x8, 0x13, 0x5d, 0xe0, 0x7d, 0x7a,\n                                                       0x6d, 0x81, 0x6b, 0x1b, 0x58, 0x6e, 0xb0, 0xa2,\n                                                       0x83, 0x1f, 0xe, 0xfb, 0x69, 0xa0, 0x76, 0xf9,\n                                                       0x7a, 0x77, 0x1, 0xf7, 0xba, 0xb1, 0x3, 0xf7,\n                                                       0x6e, 0x16, 0xea, 0x6, 0xea, 0x96, 0x6, 0x5f,\n                                                       0xcc, 0x70, 0xf5, 0x86, 0xf7, 0x20, 0x8, 0x93,\n                                                       0x6, 0x8f, 0x75, 0x5, 0x4b, 0x97, 0xbd, 0x64,\n                                                       0xbb, 0x1b, 0xbb, 0xcd, 0xa8, 0xe7, 0xb4, 0x74,\n                                                       0xae, 0x6f, 0xa7, 0x1f, 0x6d, 0xa9, 0x68, 0xa2,\n                                                       0x79, 0xa0, 0x61, 0xba, 0x57, 0xd8, 0x79, 0xf7,\n                                                       0xc, 0x82, 0x8d, 0x18, 0x82, 0x89, 0x79, 0xfb,\n                                                       0xc, 0x57, 0x3e, 0x61, 0x5c, 0x19, 0x78, 0x76,\n                                                       0x65, 0x72, 0x6d, 0x6b, 0x8, 0x71, 0x6f, 0x76,\n                                                       0x6b, 0x63, 0x1a, 0x2f, 0xcd, 0x6e, 0xbb, 0xbb,\n                                                       0xbd, 0xb2, 0xcb, 0x97, 0x1e, 0x8f, 0xa1, 0x5,\n                                                       0x93, 0x6, 0x86, 0xfb, 0x20, 0x70, 0x21, 0x5f,\n                                                       0x4a, 0x8, 0xe, 0xf7, 0xd, 0xf7, 0x2e, 0x76,\n                                                       0xf7, 0xb7, 0xda, 0x43, 0xd3, 0xa9, 0x77, 0x12,\n                                                       0x13, 0xd0, 0xf8, 0x25, 0xf7, 0xd7, 0x15, 0xf7,\n                                                       0x6e, 0x42, 0xb5, 0x91, 0xb0, 0xc1, 0x5, 0xad,\n                                                       0x7, 0x52, 0xd4, 0xb9, 0x8d, 0xb9, 0x8d, 0xb9,\n                                                       0x8e, 0x19, 0x13, 0xb0, 0xaf, 0x8d, 0xaf, 0x8e,\n                                                       0xaf, 0x8d, 0x8, 0xa2, 0x8d, 0x9e, 0x95, 0xa4,\n                                                       0x1a, 0xa5, 0x76, 0x95, 0x73, 0x1e, 0xfc, 0x3,\n                                                       0x8a, 0xd2, 0x3f, 0x5, 0x8e, 0x88, 0x8d, 0x7b,\n                                                       0x87, 0x1a, 0x83, 0x89, 0x81, 0x85, 0x85, 0x1e,\n                                                       0xc2, 0x6f, 0x89, 0x81, 0x3b, 0x93, 0x7b, 0x8d,\n                                                       0x82, 0x8a, 0x7c, 0x8e, 0x19, 0x74, 0x8f, 0x65,\n                                                       0x98, 0x73, 0x91, 0x8, 0x74, 0x88, 0x81, 0x79,\n                                                       0x76, 0x1a, 0x87, 0x8b, 0x87, 0x8c, 0x87, 0x1e,\n                                                       0x8e, 0x33, 0x15, 0xf7, 0x22, 0x55, 0x9d, 0x8e,\n                                                       0xaa, 0xc5, 0xfb, 0x5c, 0xce, 0x5, 0x81, 0x86,\n                                                       0x85, 0x82, 0x80, 0x1a, 0x7a, 0x99, 0x78, 0x96,\n                                                       0x7e, 0x1e, 0xfb, 0xf4, 0x67, 0x15, 0xf7, 0x22,\n                                                       0x98, 0x9e, 0x82, 0xd6, 0x67, 0x9a, 0x87, 0x19,\n                                                       0x91, 0x89, 0xd6, 0x84, 0x96, 0x8a, 0x8, 0x7f,\n                                                       0x97, 0x7c, 0x9d, 0x9d, 0x1a, 0x98, 0x93, 0x95,\n                                                       0x96, 0x91, 0x1e, 0x7f, 0x9b, 0x7f, 0x9f, 0xa0,\n                                                       0x1a, 0x92, 0x8d, 0x92, 0x8e, 0x91, 0x1e, 0x7d,\n                                                       0x6f, 0x6c, 0x84, 0x6c, 0x1b, 0x7b, 0x7c, 0x8d,\n                                                       0x8e, 0x7c, 0x1f, 0x8e, 0x9b, 0x5, 0x88, 0x9a,\n                                                       0x9a, 0x8a, 0x9b, 0x1b, 0xb1, 0xad, 0x95, 0xa0,\n                                                       0xaa, 0x1f, 0xab, 0x9f, 0xa2, 0xab, 0x8f, 0x1e,\n                                                       0xdb, 0x75, 0x34, 0xc8, 0x4e, 0x79, 0x87, 0x9a,\n                                                       0xc4, 0x9c, 0x95, 0xb5, 0x9b, 0x86, 0x81, 0x66,\n                                                       0xe3, 0x4d, 0x5, 0x89, 0x8d, 0x9a, 0x8a, 0x8f,\n                                                       0x1b, 0x9d, 0x97, 0x8e, 0x9e, 0x1f, 0x90, 0x8a,\n                                                       0x90, 0x90, 0x1a, 0x20, 0xf7, 0x1, 0xfb, 0x33,\n                                                       0x91, 0xfb, 0x17, 0xfb, 0xf, 0xfb, 0x17, 0x8f,\n                                                       0x5, 0x78, 0x6e, 0x82, 0x68, 0x68, 0x1a, 0x62,\n                                                       0x97, 0x63, 0xa0, 0x68, 0x1e, 0xf8, 0x4, 0x58,\n                                                       0x15, 0xbd, 0x7c, 0xa9, 0x9b, 0xa0, 0xa3, 0xfb,\n                                                       0xe, 0xba, 0x5, 0x83, 0x88, 0x86, 0x84, 0x82,\n                                                       0x1a, 0x78, 0x9f, 0x75, 0x99, 0x7f, 0x1e, 0xe,\n                                                       0xfb, 0x25, 0x92, 0x76, 0xf9, 0x4d, 0x77, 0x1,\n                                                       0xf7, 0xef, 0x7d, 0x15, 0xa8, 0xf3, 0xf2, 0xf7,\n                                                       0x25, 0xd8, 0xec, 0x8, 0xc2, 0xd0, 0xbb, 0xcb,\n                                                       0xe8, 0x1a, 0xe0, 0x49, 0xc9, 0x36, 0x3a, 0x4c,\n                                                       0x3d, 0x3f, 0x7a, 0x1e, 0xda, 0x76, 0x52, 0xd6,\n                                                       0x33, 0x1b, 0x3a, 0x4a, 0x49, 0x39, 0x33, 0xc4,\n                                                       0x42, 0xc0, 0x4a, 0x1f, 0xe0, 0x23, 0xe8, 0xfb,\n                                                       0x1d, 0xa3, 0x23, 0x8, 0xe, 0xfb, 0x88, 0x94,\n                                                       0x76, 0xf9, 0x86, 0x77, 0x1, 0xcb, 0xf8, 0x66,\n                                                       0x3, 0xf7, 0xb4, 0x81, 0x15, 0x94, 0x89, 0x94,\n                                                       0x8d, 0xa5, 0xf7, 0x39, 0xf1, 0xf7, 0x22, 0xe9,\n                                                       0xc6, 0x19, 0x8d, 0x94, 0x89, 0x94, 0x2d, 0xc6,\n                                                       0x25, 0xf7, 0x22, 0x71, 0xf7, 0x39, 0x19, 0x82,\n                                                       0x8d, 0x82, 0x89, 0x71, 0xfb, 0x39, 0x25, 0xfb,\n                                                       0x22, 0x2d, 0x50, 0x19, 0x89, 0x82, 0x8d, 0x82,\n                                                       0xe9, 0x50, 0xf1, 0xfb, 0x22, 0xa5, 0xfb, 0x39,\n                                                       0x19, 0xe, 0x4c, 0xa0, 0x76, 0xf7, 0xd0, 0xad,\n                                                       0xf7, 0xf2, 0x77, 0x12, 0xf8, 0x5, 0xb1, 0x66,\n                                                       0xaf, 0x13, 0xf0, 0xf7, 0xb9, 0x16, 0xea, 0x6,\n                                                       0xea, 0x96, 0x6, 0x5f, 0xcb, 0x71, 0xf3, 0x85,\n                                                       0xf7, 0x1d, 0x8, 0x9a, 0x6, 0x48, 0x93, 0xc4,\n                                                       0x58, 0xd0, 0x1b, 0xd6, 0xc7, 0xc7, 0xd6, 0xd6,\n                                                       0x4f, 0xc7, 0x40, 0x46, 0x52, 0x58, 0x48, 0x83,\n                                                       0x1f, 0x13, 0xe8, 0x7b, 0x6, 0x94, 0x8b, 0x94,\n                                                       0x94, 0x1a, 0xc1, 0x7, 0xcd, 0x94, 0xbe, 0xc4,\n                                                       0xcf, 0x1a, 0xd6, 0x4f, 0xc7, 0x40, 0x40, 0x4f,\n                                                       0x4f, 0x40, 0x47, 0xbe, 0x52, 0xcd, 0x82, 0x1e,\n                                                       0x55, 0x7, 0x82, 0x8b, 0x82, 0x82, 0x1a, 0x7b,\n                                                       0x6, 0xce, 0x83, 0x52, 0xbe, 0x46, 0x1b, 0x40,\n                                                       0x4f, 0x4f, 0x40, 0x40, 0xc7, 0x4f, 0xd6, 0xd0,\n                                                       0xc4, 0xbe, 0xce, 0x93, 0x1f, 0x13, 0xf0, 0x9a,\n                                                       0x6, 0x85, 0xfb, 0x1d, 0x71, 0x23, 0x5f, 0x4b,\n                                                       0x8, 0xe, 0xfb, 0x29, 0xf7, 0x33, 0x76, 0xb3,\n                                                       0xf7, 0xe4, 0xfb, 0x8f, 0xf7, 0x39, 0xf7, 0x11,\n                                                       0x77, 0x12, 0xc1, 0xf8, 0xa, 0xfb, 0x37, 0xf8,\n                                                       0x1a, 0xfb, 0xcc, 0xf7, 0xcc, 0x13, 0xb2, 0xae,\n                                                       0xf7, 0x1e, 0x15, 0xf9, 0x0, 0xf8, 0x33, 0xfd,\n                                                       0x0, 0x6, 0x13, 0xd8, 0xf8, 0x1d, 0xfb, 0x6e,\n                                                       0x15, 0xa2, 0x7, 0xf7, 0x64, 0xf7, 0x30, 0x5,\n                                                       0xfb, 0xe4, 0x7, 0xfc, 0xda, 0x76, 0x15, 0x13,\n                                                       0xb4, 0xf7, 0x67, 0xf7, 0x34, 0x5, 0x68, 0x99,\n                                                       0xa9, 0x78, 0xb1, 0x1b, 0xaf, 0xa7, 0xa1, 0xab,\n                                                       0x98, 0x1f, 0xf7, 0x66, 0xfb, 0x34, 0x5, 0x13,\n                                                       0xb8, 0x13, 0xb4, 0xfc, 0x5, 0xf7, 0x6e, 0x15,\n                                                       0x13, 0xb8, 0xfb, 0x67, 0xf7, 0x36, 0x5, 0xf8,\n                                                       0xda, 0x6, 0xfb, 0x69, 0xfb, 0x36, 0x5, 0x13,\n                                                       0xb2, 0xad, 0x7e, 0x6d, 0x9e, 0x66, 0x1b, 0x13,\n                                                       0xd4, 0x6a, 0x69, 0x75, 0x6c, 0x80, 0x1f, 0x13,\n                                                       0xd8, 0xfb, 0x67, 0xfb, 0x59, 0x15, 0xf7, 0xe4,\n                                                       0x7, 0xf7, 0x63, 0xfb, 0x30, 0x5, 0x74, 0x7,\n                                                       0xe, 0x5b, 0xf7, 0x23, 0x9f, 0xc3, 0x9f, 0x84,\n                                                       0x99, 0x8a, 0x9f, 0xa7, 0x9f, 0x95, 0x9f, 0x8f,\n                                                       0x9f, 0xed, 0xa3, 0xf3, 0x77, 0x12, 0xf7, 0x1f,\n                                                       0x9f, 0x80, 0x9f, 0xf7, 0x5f, 0x99, 0xab, 0x9f,\n                                                       0x96, 0xa9, 0xda, 0x9f, 0x93, 0xa5, 0x13, 0xdf,\n                                                       0xdf, 0x8d, 0xf8, 0x12, 0x15, 0xce, 0x72, 0x5,\n                                                       0x7b, 0x8c, 0x95, 0x79, 0xa1, 0x1b, 0x99, 0x95,\n                                                       0x90, 0x91, 0x92, 0x1f, 0x91, 0x8a, 0x5, 0x73,\n                                                       0x9a, 0x7b, 0xa2, 0x96, 0x94, 0x8e, 0x90, 0x94,\n                                                       0x1e, 0x8c, 0x8a, 0x77, 0x7d, 0x7f, 0x7a, 0x85,\n                                                       0x75, 0x19, 0x13, 0xdf, 0xbf, 0x81, 0x7e, 0x80,\n                                                       0x7b, 0x76, 0x1a, 0x67, 0xa6, 0x79, 0xa4, 0xad,\n                                                       0xb0, 0x9e, 0xa5, 0xab, 0x1e, 0xd8, 0xcb, 0xb0,\n                                                       0x92, 0x5, 0x75, 0x8e, 0x9a, 0x79, 0xa7, 0x1b,\n                                                       0x13, 0xaf, 0xdf, 0xa0, 0x9d, 0x99, 0x98, 0x98,\n                                                       0x1f, 0xa9, 0xaa, 0x97, 0x8d, 0x5, 0x13, 0xdf,\n                                                       0xbf, 0x76, 0x8f, 0x9e, 0x7e, 0x9e, 0x1b, 0xa7,\n                                                       0xa6, 0xaa, 0x9f, 0x9d, 0x1f, 0xaf, 0x91, 0xdd,\n                                                       0xc2, 0x5, 0x99, 0x7, 0xfb, 0x79, 0x84, 0x34,\n                                                       0x90, 0x94, 0x9a, 0x94, 0x99, 0x92, 0x9b, 0x19,\n                                                       0xcf, 0xa6, 0xbc, 0xbc, 0x8a, 0x8f, 0x29, 0x82,\n                                                       0xab, 0xf5, 0x87, 0x8d, 0x3d, 0x60, 0x66, 0x48,\n                                                       0x5d, 0x94, 0x59, 0x74, 0x5, 0x88, 0x7, 0xcd,\n                                                       0x69, 0x78, 0x74, 0x6e, 0x7c, 0x72, 0x7b, 0x19,\n                                                       0xfb, 0xa1, 0xbe, 0x53, 0x6b, 0x5, 0x86, 0x8b,\n                                                       0x86, 0x86, 0x1a, 0xf8, 0xd3, 0x31, 0x15, 0x93,\n                                                       0x8c, 0x5, 0x7f, 0x8f, 0x85, 0x94, 0x93, 0x90,\n                                                       0x95, 0x97, 0x1e, 0xb3, 0x90, 0x5, 0x7b, 0x7c,\n                                                       0x76, 0x76, 0x7b, 0x1b, 0x7a, 0x84, 0x97, 0x9a,\n                                                       0x8d, 0x1f, 0xfb, 0x54, 0x78, 0x15, 0x86, 0xa5,\n                                                       0xa9, 0xa2, 0xb2, 0xa7, 0xf7, 0x4, 0x85, 0x18,\n                                                       0xf7, 0x4b, 0x91, 0x5c, 0x6d, 0xfb, 0x9a, 0x67,\n                                                       0x7e, 0x89, 0x77, 0x86, 0x7a, 0x87, 0x19, 0xad,\n                                                       0xf7, 0x40, 0x15, 0x61, 0xa1, 0x94, 0x8f, 0xb6,\n                                                       0x83, 0x5, 0x93, 0xfb, 0x52, 0x15, 0x96, 0x8c,\n                                                       0x5, 0x7f, 0x89, 0x8f, 0x80, 0x96, 0x1b, 0x97,\n                                                       0x91, 0x96, 0x9b, 0x8a, 0x1f, 0xbb, 0x92, 0x72,\n                                                       0x72, 0x5, 0x81, 0x81, 0x7e, 0x80, 0x7c, 0x1b,\n                                                       0x74, 0x86, 0x9d, 0x9b, 0x8d, 0x1f, 0xfb, 0x8c,\n                                                       0x6b, 0x15, 0x86, 0x92, 0x96, 0x87, 0x9d, 0x1b,\n                                                       0xa1, 0x84, 0x94, 0xa4, 0x6d, 0x81, 0x71, 0x95,\n                                                       0x83, 0x8e, 0x19, 0x97, 0xa8, 0xa6, 0x97, 0xa6,\n                                                       0x9c, 0xeb, 0xc7, 0x18, 0x9d, 0x96, 0x9c, 0x97,\n                                                       0x9a, 0x99, 0xa0, 0xa0, 0x95, 0xa3, 0x9a, 0xa5,\n                                                       0xab, 0xc3, 0x18, 0xae, 0x9e, 0x6f, 0x2f, 0xd9,\n                                                       0x92, 0x80, 0x80, 0x43, 0x6f, 0x80, 0x70, 0x7b,\n                                                       0x73, 0x7b, 0x73, 0x19, 0x63, 0x70, 0x66, 0x6d,\n                                                       0x92, 0x6e, 0x3b, 0x49, 0x18, 0x78, 0x74, 0x68,\n                                                       0x76, 0x6a, 0x1b, 0x13, 0xaf, 0xdf, 0x7a, 0x7c,\n                                                       0x98, 0xa0, 0x9e, 0x96, 0x99, 0x95, 0x96, 0x1f,\n                                                       0xc5, 0xd6, 0x15, 0xfb, 0x6a, 0xd7, 0xa7, 0x9b,\n                                                       0xf7, 0x93, 0x5b, 0x5, 0xfb, 0x31, 0x73, 0x15,\n                                                       0xb5, 0x7c, 0x5, 0x86, 0x84, 0x83, 0x88, 0x82,\n                                                       0x1b, 0x7d, 0x85, 0x96, 0x97, 0x8d, 0x1f, 0x45,\n                                                       0xa3, 0x15, 0xaa, 0x80, 0x5, 0x87, 0x86, 0x86,\n                                                       0x89, 0x83, 0x1b, 0x81, 0x88, 0x93, 0x94, 0x1f,\n                                                       0xe, 0x5a, 0xaf, 0x9f, 0xbd, 0xc5, 0xc0, 0xf5,\n                                                       0x29, 0xf7, 0x3, 0x61, 0xe7, 0x9d, 0xea, 0x9d,\n                                                       0x9f, 0x93, 0xcd, 0x84, 0xca, 0x12, 0xc9, 0xa3,\n                                                       0x80, 0xb6, 0x76, 0xa0, 0xf8, 0xd1, 0x9f, 0x13,\n                                                       0xe6, 0xd8, 0xcc, 0xf8, 0xa1, 0x15, 0xaf, 0x97,\n                                                       0xb8, 0xb6, 0xeb, 0x1b, 0xc1, 0xcd, 0x7c, 0x7d,\n                                                       0xcc, 0x1f, 0x13, 0xe7, 0x58, 0x7c, 0xce, 0xce,\n                                                       0x7c, 0xbc, 0x1b, 0xc8, 0xbe, 0xa4, 0xa1, 0xa9,\n                                                       0x1f, 0x78, 0xd3, 0x5, 0x71, 0x6d, 0x61, 0x70,\n                                                       0x57, 0x1b, 0x54, 0x4f, 0x98, 0x99, 0x4e, 0x1f,\n                                                       0x13, 0xe6, 0xd8, 0x99, 0x4c, 0x4b, 0x9a, 0x4e,\n                                                       0x1b, 0xfb, 0x7, 0x5c, 0x50, 0x53, 0x82, 0x8f,\n                                                       0x82, 0x8d, 0x82, 0x1f, 0xb6, 0xfb, 0x83, 0x15,\n                                                       0x85, 0x7b, 0x86, 0x80, 0x70, 0x1a, 0x2f, 0xf7,\n                                                       0x3, 0x23, 0xf7, 0x58, 0xf7, 0x3f, 0xf7, 0x1c,\n                                                       0xde, 0xf7, 0x9, 0xa2, 0x86, 0x96, 0x85, 0x9b,\n                                                       0x1e, 0x8b, 0x96, 0xaa, 0xa2, 0x1a, 0xf7, 0x1,\n                                                       0xfb, 0x18, 0xe3, 0xfb, 0x44, 0x22, 0x3a, 0x6b,\n                                                       0x66, 0x5c, 0x1e, 0x69, 0x95, 0x62, 0xa2, 0x82,\n                                                       0xad, 0x8, 0x13, 0xe7, 0x28, 0x85, 0x86, 0x86,\n                                                       0x7f, 0x80, 0x1a, 0x5e, 0x9e, 0x73, 0xa8, 0x7a,\n                                                       0x1e, 0x13, 0xe7, 0x58, 0x7a, 0x71, 0x82, 0x78,\n                                                       0x67, 0x1a, 0x72, 0x8e, 0x7f, 0x93, 0x7a, 0x1e,\n                                                       0x95, 0xc1, 0x15, 0xed, 0xf7, 0x13, 0xda, 0xf7,\n                                                       0x32, 0xf7, 0x32, 0xf7, 0x16, 0x3c, 0x29, 0x2a,\n                                                       0xfb, 0x16, 0x3c, 0xfb, 0x32, 0xfb, 0x32, 0xfb,\n                                                       0x13, 0xda, 0xec, 0x1e, 0x93, 0x48, 0x15, 0x97,\n                                                       0x77, 0xa4, 0x71, 0x9e, 0x7e, 0x8, 0x79, 0x87,\n                                                       0x7f, 0x8a, 0x83, 0x1a, 0x6e, 0xd1, 0x4c, 0xa6,\n                                                       0x94, 0x94, 0x92, 0x96, 0x96, 0x1e, 0x83, 0xa7,\n                                                       0xc5, 0x7e, 0xc2, 0x1b, 0xc0, 0xc1, 0x9d, 0x97,\n                                                       0x9f, 0x1f, 0x92, 0x85, 0x9e, 0x77, 0x99, 0x94,\n                                                       0x9d, 0x96, 0x9c, 0x99, 0x9a, 0x9f, 0x8, 0x99,\n                                                       0x9e, 0x93, 0x9c, 0x98, 0x1a, 0x90, 0x85, 0x91,\n                                                       0x83, 0x90, 0x1e, 0x98, 0x95, 0x9c, 0x9f, 0x93,\n                                                       0x99, 0x8, 0x90, 0x83, 0x8e, 0x7d, 0x78, 0x1a,\n                                                       0x2b, 0xfb, 0x13, 0x3b, 0xfb, 0x35, 0xfb, 0x33,\n                                                       0xfb, 0x11, 0xdc, 0xe8, 0x9e, 0x8f, 0x9b, 0x8f,\n                                                       0x93, 0x1e, 0xf7, 0x82, 0xf7, 0x1c, 0x15, 0x8e,\n                                                       0x86, 0x94, 0x8a, 0x91, 0x8d, 0x96, 0x8d, 0xa6,\n                                                       0x8c, 0x9b, 0x87, 0x97, 0x88, 0x8f, 0x8e, 0x8f,\n                                                       0x90, 0xbf, 0xcf, 0x18, 0x90, 0x92, 0x85, 0x8d,\n                                                       0x81, 0x8d, 0x55, 0x97, 0x66, 0x8f, 0x44, 0x80,\n                                                       0x82, 0x8a, 0x85, 0x85, 0x8e, 0x87, 0x8, 0xf7,\n                                                       0x37, 0xfb, 0x5a, 0x15, 0xdc, 0x54, 0x94, 0x85,\n                                                       0x91, 0x8d, 0x92, 0x90, 0x19, 0xb1, 0xa5, 0x9e,\n                                                       0x9f, 0x98, 0xb7, 0x8, 0x91, 0x8d, 0x86, 0x90,\n                                                       0x82, 0x1b, 0x13, 0xd7, 0x58, 0xfb, 0x10, 0x90,\n                                                       0x5, 0x81, 0x87, 0x87, 0x87, 0x1f, 0x8a, 0x83,\n                                                       0x82, 0x7d, 0x7e, 0x82, 0x82, 0x86, 0x8e, 0x87,\n                                                       0x91, 0x87, 0x8, 0xfb, 0x31, 0xc3, 0x15, 0x13,\n                                                       0xcf, 0x58, 0x72, 0xad, 0x76, 0xb4, 0xb4, 0xad,\n                                                       0xa0, 0xa4, 0xa4, 0x69, 0xa0, 0x62, 0x62, 0x69,\n                                                       0x76, 0x72, 0x1e, 0x2f, 0xfb, 0xc, 0x15, 0x93,\n                                                       0x87, 0x95, 0x8b, 0x8f, 0x8f, 0xd6, 0xc8, 0x18,\n                                                       0x91, 0x90, 0x87, 0x8f, 0x85, 0x8e, 0x82, 0x90,\n                                                       0x7b, 0x98, 0x87, 0x95, 0x88, 0x93, 0x85, 0x8c,\n                                                       0x82, 0x8a, 0xfb, 0xc, 0x7f, 0x18, 0x7e, 0x8a,\n                                                       0xe0, 0x31, 0x8d, 0x85, 0x9a, 0x69, 0x46, 0xcb,\n                                                       0xc1, 0x6d, 0x8, 0xe, 0xef, 0xf7, 0x2c, 0x76,\n                                                       0xd1, 0xa5, 0xf7, 0x3d, 0xa5, 0x78, 0xa4, 0xbd,\n                                                       0xa3, 0x90, 0xa4, 0x8f, 0x77, 0x12, 0x9f, 0xa4,\n                                                       0x13, 0xed, 0xc2, 0xf7, 0x57, 0x15, 0xf7, 0x1f,\n                                                       0x98, 0xf1, 0x5c, 0xde, 0x84, 0xda, 0x74, 0xad,\n                                                       0x9b, 0x9e, 0xa4, 0xb6, 0x96, 0xab, 0xc5, 0xc8,\n                                                       0x93, 0xb2, 0xc6, 0x5, 0xb3, 0x7, 0x5d, 0xc0,\n                                                       0xf7, 0x7, 0x8f, 0xf7, 0x5, 0x91, 0x5, 0xa4,\n                                                       0x8c, 0x9f, 0x9f, 0xa2, 0x1a, 0xa3, 0x74, 0x9e,\n                                                       0x6a, 0x8c, 0x1e, 0xfb, 0xf7, 0x91, 0x73, 0xa3,\n                                                       0x5, 0x13, 0xeb, 0xfb, 0x46, 0x92, 0xfb, 0xe,\n                                                       0xfb, 0xa, 0xfb, 0x13, 0x90, 0x5, 0x75, 0x69,\n                                                       0x82, 0x66, 0x65, 0x1a, 0x8c, 0x62, 0x97, 0x61,\n                                                       0xa1, 0x67, 0x8, 0xf7, 0xe5, 0xf7, 0x16, 0x15,\n                                                       0x87, 0xa1, 0x90, 0xa3, 0xa8, 0x90, 0xdb, 0x75,\n                                                       0x18, 0xf7, 0x5, 0x7f, 0x8d, 0x95, 0x57, 0xa6,\n                                                       0x95, 0x95, 0x89, 0xa2, 0x86, 0x95, 0x19, 0x56,\n                                                       0xc5, 0xf7, 0xe5, 0x88, 0x5, 0xa2, 0x97, 0x81,\n                                                       0x7e, 0x7f, 0x83, 0x81, 0x75, 0x8a, 0x1f, 0x25,\n                                                       0x86, 0xfb, 0x32, 0x84, 0xcb, 0x3b, 0x5, 0x74,\n                                                       0x7, 0x6e, 0x5f, 0x4f, 0x83, 0x5, 0xfb, 0x46,\n                                                       0x74, 0x15, 0x78, 0xa2, 0x78, 0xab, 0xa9, 0x9a,\n                                                       0xf7, 0x45, 0x51, 0x18, 0x72, 0x5a, 0x6e, 0x85,\n                                                       0x5, 0xfc, 0x4c, 0xa3, 0x15, 0x7b, 0xa8, 0x83,\n                                                       0xab, 0xaa, 0x1a, 0xaa, 0x91, 0xa9, 0x98, 0xa3,\n                                                       0x1e, 0xf7, 0x10, 0x85, 0xf7, 0xe, 0xf7, 0xa,\n                                                       0xf7, 0x35, 0x83, 0xdf, 0x32, 0x90, 0x83, 0x89,\n                                                       0x7b, 0x87, 0x89, 0x19, 0x7f, 0x81, 0x7d, 0x8b,\n                                                       0x78, 0x8f, 0x37, 0xc5, 0x18, 0x95, 0xaf, 0x7c,\n                                                       0x8f, 0x82, 0x63, 0x55, 0x7c, 0x8f, 0x7c, 0x5,\n                                                       0x13, 0xdd, 0xc4, 0x9d, 0xdd, 0x50, 0x3f, 0xa0,\n                                                       0x6d, 0x88, 0x77, 0x73, 0x8c, 0x6f, 0x19, 0x60,\n                                                       0x6e, 0x5e, 0x84, 0x57, 0x95, 0x89, 0x7c, 0x18,\n                                                       0xb7, 0x83, 0xb7, 0x8e, 0xb3, 0x9f, 0x81, 0x78,\n                                                       0x92, 0x6f, 0xa0, 0x72, 0x72, 0x7b, 0x90, 0x75,\n                                                       0x98, 0x78, 0x46, 0x91, 0x18, 0x23, 0xba, 0x5,\n                                                       0xf7, 0x59, 0x51, 0x15, 0x7d, 0x99, 0x7a, 0xa7,\n                                                       0xa4, 0x96, 0xf1, 0x63, 0x18, 0x7a, 0x77, 0x78,\n                                                       0x81, 0x5, 0xe, 0x7d, 0xae, 0xe5, 0xab, 0xf7,\n                                                       0xe3, 0x9c, 0xf7, 0x43, 0x4c, 0xa, 0xf7, 0xb2,\n                                                       0xe7, 0xf7, 0xa3, 0xae, 0x17, 0xae, 0xf7, 0xee,\n                                                       0x37, 0xa, 0x13, 0x6c, 0x33, 0xa, 0x1f, 0xf7,\n                                                       0x5e, 0x6b, 0xa, 0xf7, 0x9c, 0xa9, 0x6, 0x57,\n                                                       0x8f, 0x5, 0x65, 0x8e, 0x8d, 0x97, 0xa7, 0x1a,\n                                                       0xf8, 0x1d, 0x56, 0x7, 0x67, 0x5a, 0x64, 0x6f,\n                                                       0x4d, 0x82, 0x8, 0x7a, 0xc5, 0x7, 0xb5, 0x89,\n                                                       0x89, 0x61, 0x1f, 0xfb, 0x8a, 0x7, 0x74, 0x81,\n                                                       0x79, 0x72, 0x89, 0x1e, 0x5a, 0x87, 0x5, 0xe,\n                                                       0x7d, 0xae, 0x68, 0xf7, 0x11, 0xf8, 0x70, 0xf7,\n                                                       0xa, 0x68, 0x4c, 0xa, 0x68, 0xf7, 0x53, 0xf7,\n                                                       0xdc, 0xf7, 0x5c, 0xfb, 0x51, 0xf7, 0x51, 0x68,\n                                                       0xae, 0x13, 0x98, 0x80, 0x22, 0xa, 0x13, 0x66,\n                                                       0x0, 0xf7, 0x30, 0x6b, 0xa, 0xa2, 0x7, 0xd4,\n                                                       0xbd, 0xc1, 0xc2, 0xb4, 0x1e, 0xc1, 0xb3, 0xcb,\n                                                       0xbb, 0xd6, 0x1a, 0xb3, 0x7c, 0xb8, 0x5c, 0x7b,\n                                                       0x6a, 0x7b, 0x78, 0x1e, 0x7f, 0x91, 0x81, 0x7f,\n                                                       0x1a, 0x71, 0x76, 0x77, 0x71, 0x6c, 0x78, 0xa3,\n                                                       0xa9, 0xa7, 0x99, 0xa1, 0xa0, 0x9c, 0x1e, 0xa4,\n                                                       0xaa, 0xb2, 0x91, 0xb1, 0x1b, 0xd8, 0xe2, 0x68,\n                                                       0x31, 0xfb, 0x2e, 0xfb, 0x6d, 0x9a, 0x58, 0xfb,\n                                                       0xf, 0x1f, 0xf7, 0x60, 0x6, 0xba, 0x8e, 0xb1,\n                                                       0xc1, 0x96, 0x1f, 0x13, 0x65, 0x0, 0x99, 0xfb,\n                                                       0x49, 0x6, 0xe, 0x7d, 0xae, 0xf9, 0x1a, 0x77,\n                                                       0x1, 0x22, 0xa, 0xf7, 0x8f, 0x91, 0x15, 0x8c,\n                                                       0xab, 0x8b, 0x9c, 0xc7, 0xae, 0x68, 0x4f, 0x54,\n                                                       0x66, 0x46, 0x4f, 0x78, 0x6d, 0x9d, 0xa3, 0x1e,\n                                                       0x96, 0x91, 0x96, 0x96, 0x1a, 0xa7, 0x79, 0xa1,\n                                                       0x6c, 0x68, 0x77, 0x77, 0x68, 0x68, 0xa5, 0x71,\n                                                       0xa7, 0x7b, 0x1e, 0x7a, 0xaa, 0xb0, 0x84, 0xad,\n                                                       0x1b, 0xe6, 0xf3, 0xb9, 0xf4, 0xf7, 0x2, 0xfb,\n                                                       0x19, 0x92, 0x88, 0x91, 0x1f, 0x89, 0x8f, 0xf4,\n                                                       0xb1, 0xcd, 0x1a, 0xdc, 0x3c, 0xa0, 0x48, 0x55,\n                                                       0x2a, 0x79, 0x45, 0x6f, 0x9f, 0x79, 0xa6, 0xa5,\n                                                       0x9f, 0xa3, 0xa3, 0x92, 0x8a, 0x92, 0x87, 0x91,\n                                                       0x1e, 0xa2, 0xa8, 0x9d, 0x9d, 0xbb, 0xa0, 0x5d,\n                                                       0x60, 0x50, 0x5b, 0x6a, 0x54, 0x1e, 0x75, 0x6,\n                                                       0xe, 0x7d, 0xae, 0xe5, 0xf7, 0x3d, 0x5a, 0xbc,\n                                                       0xf8, 0x1a, 0x4c, 0xa, 0xf7, 0xc2, 0xe4, 0xf7,\n                                                       0x96, 0xae, 0x13, 0xbe, 0x22, 0xa, 0xf7, 0x1,\n                                                       0xfb, 0x7, 0x15, 0xf7, 0x55, 0x78, 0x6, 0x48,\n                                                       0x7b, 0x8b, 0x6e, 0x88, 0x1e, 0x77, 0x89, 0x5,\n                                                       0x13, 0xde, 0x6e, 0xf7, 0x71, 0xa8, 0x7, 0x79,\n                                                       0x8e, 0x5, 0x54, 0x94, 0x91, 0x89, 0xc9, 0x1a,\n                                                       0x13, 0xbe, 0x9e, 0xee, 0xbc, 0x28, 0xf7, 0xc1,\n                                                       0x33, 0x7, 0xfb, 0x56, 0xfb, 0xd4, 0x5, 0xce,\n                                                       0x9e, 0x15, 0xf7, 0x12, 0xf7, 0x63, 0x5, 0xfb,\n                                                       0x63, 0x7, 0xe, 0x7e, 0xae, 0xdd, 0xaf, 0xf7,\n                                                       0x6c, 0xb5, 0xdf, 0xe1, 0xf1, 0x4c, 0xa, 0xf7,\n                                                       0x43, 0xb4, 0xf7, 0x33, 0xf7, 0x6, 0xf7, 0x34,\n                                                       0xae, 0x17, 0x23, 0xa, 0xae, 0x16, 0x40, 0xa,\n                                                       0x41, 0xa, 0x1e, 0x13, 0xf3, 0x80, 0x28, 0xa,\n                                                       0xfb, 0x24, 0xfb, 0x48, 0x1f, 0x13, 0x77, 0x0,\n                                                       0xfb, 0x47, 0xfb, 0x25, 0xf7, 0x24, 0xf7, 0x48,\n                                                       0x1f, 0xf7, 0x43, 0x76, 0x15, 0xb4, 0x7a, 0x5,\n                                                       0xa4, 0x9d, 0xa7, 0xa2, 0xab, 0x1b, 0xc3, 0xa4,\n                                                       0x56, 0x5a, 0x57, 0x6a, 0x4d, 0x50, 0x79, 0x6b,\n                                                       0x93, 0xa2, 0x1f, 0x98, 0x95, 0x94, 0x9b, 0x1a,\n                                                       0xaa, 0x71, 0x9a, 0x6f, 0x6b, 0x79, 0x72, 0x6d,\n                                                       0x43, 0xef, 0x73, 0xc4, 0xe8, 0xef, 0xc4, 0xf1,\n                                                       0xe3, 0x3b, 0xba, 0x3b, 0x66, 0x5d, 0x81, 0x72,\n                                                       0x6d, 0x1e, 0xf7, 0xd, 0x7, 0xe9, 0x88, 0x5,\n                                                       0xb1, 0xca, 0x86, 0xa4, 0xab, 0x1f, 0x9d, 0x99,\n                                                       0x9c, 0xb7, 0x90, 0xa3, 0x8, 0x7f, 0x65, 0x63,\n                                                       0x88, 0x64, 0x1b, 0x51, 0x44, 0x92, 0x98, 0x4d,\n                                                       0x1f, 0xe, 0x7d, 0xae, 0xf9, 0x1d, 0xae, 0x1,\n                                                       0x22, 0xa, 0xf7, 0x75, 0x78, 0x15, 0xb7, 0xa8,\n                                                       0xc5, 0xa9, 0xc0, 0x1b, 0xda, 0xc7, 0x56, 0x39,\n                                                       0x28, 0x38, 0x4c, 0x2c, 0xfb, 0x1d, 0x4e, 0xf7,\n                                                       0x1, 0xf7, 0x11, 0xf7, 0x11, 0xce, 0xf7, 0x11,\n                                                       0xf7, 0x1c, 0xc1, 0xe6, 0x74, 0x47, 0x6e, 0x7b,\n                                                       0x71, 0x6c, 0x71, 0x77, 0x9e, 0xa5, 0x1f, 0x96,\n                                                       0x90, 0x98, 0x95, 0x1a, 0xa3, 0x65, 0x96, 0x78,\n                                                       0x2c, 0x80, 0xfb, 0x9, 0x41, 0x1e, 0x91, 0xfb,\n                                                       0xe, 0x15, 0x55, 0xb1, 0x58, 0xc6, 0xc6, 0xa4,\n                                                       0xc4, 0xbf, 0xba, 0x76, 0xc7, 0x52, 0x4c, 0x63,\n                                                       0x57, 0x50, 0x1e, 0xe, 0x7d, 0xae, 0xf8, 0x6b,\n                                                       0xe4, 0xe4, 0x4c, 0xa, 0xf7, 0x72, 0xf7, 0x4,\n                                                       0xfb, 0x4, 0xf7, 0xc, 0xf7, 0xc7, 0xae, 0x13,\n                                                       0xf6, 0x22, 0xa, 0xf7, 0x27, 0xcd, 0x15, 0x9f,\n                                                       0x6, 0xb8, 0x9f, 0x8d, 0xae, 0xb2, 0x1b, 0xf7,\n                                                       0x50, 0x6, 0x20, 0xfb, 0x24, 0x5, 0x67, 0x5c,\n                                                       0x58, 0x46, 0x4d, 0x1a, 0x65, 0xa1, 0x6f, 0xb3,\n                                                       0xae, 0xa2, 0xa2, 0xaf, 0x1e, 0x13, 0xfa, 0xa2,\n                                                       0x83, 0xa2, 0xa2, 0x1a, 0xce, 0xbb, 0xd0, 0xab,\n                                                       0xc2, 0x1e, 0xe7, 0xf7, 0x32, 0x5, 0xfb, 0xf6,\n                                                       0x6, 0xe, 0x7d, 0xae, 0xde, 0xb1, 0xf8, 0x30,\n                                                       0xad, 0xdd, 0x4c, 0xa, 0xf7, 0x2e, 0xc5, 0x71,\n                                                       0xd9, 0xf7, 0x1d, 0xbd, 0x60, 0xe3, 0xf7, 0x2d,\n                                                       0xae, 0x13, 0xfc, 0xc0, 0xf7, 0xd7, 0xf7, 0xfe,\n                                                       0x15, 0x55, 0x6c, 0x5e, 0x6a, 0x46, 0x1a, 0x2f,\n                                                       0xde, 0x6a, 0xd9, 0xe3, 0xe8, 0xc0, 0xeb, 0xd5,\n                                                       0x5c, 0xaf, 0x4e, 0xa9, 0x1e, 0x13, 0xbb, 0x40,\n                                                       0xb1, 0xa4, 0xa4, 0xa4, 0xbd, 0x1a, 0xd1, 0x49,\n                                                       0xa4, 0x51, 0x1e, 0x42, 0x47, 0x5d, 0x3c, 0x5a,\n                                                       0xa8, 0x6e, 0xb1, 0x74, 0x1f, 0xf0, 0xbb, 0x15,\n                                                       0x5b, 0xa4, 0x61, 0x9d, 0xb4, 0x1a, 0xae, 0xa8,\n                                                       0xa4, 0xad, 0x1e, 0x13, 0x99, 0x40, 0xb4, 0xac,\n                                                       0x74, 0x60, 0x69, 0x79, 0x6f, 0x6e, 0x7b, 0x1f,\n                                                       0x48, 0x48, 0x15, 0x13, 0xdc, 0xc0, 0xa0, 0x7f,\n                                                       0x9e, 0x81, 0x9a, 0x81, 0x8, 0xb8, 0x6f, 0xa0,\n                                                       0x76, 0x6a, 0x1a, 0x54, 0x62, 0x6b, 0x57, 0x53,\n                                                       0x5c, 0xb6, 0xc2, 0xb4, 0xb2, 0xb5, 0xaf, 0x9f,\n                                                       0x1e, 0xfb, 0xd6, 0x8e, 0x37, 0xa, 0x13, 0x8,\n                                                       0x0, 0x33, 0xa, 0x1f, 0xe, 0x7d, 0xae, 0xde,\n                                                       0xac, 0x6a, 0xf7, 0x26, 0xb4, 0xba, 0x98, 0x77,\n                                                       0xf7, 0x72, 0xae, 0xdd, 0x4c, 0xa, 0xf7, 0x2d,\n                                                       0xdc, 0x4c, 0xe8, 0xf7, 0x24, 0xf7, 0x1, 0x23,\n                                                       0xf3, 0x25, 0xf1, 0xf7, 0x18, 0xae, 0x13, 0xcf,\n                                                       0x94, 0x2e, 0xa, 0xf7, 0x5b, 0xf7, 0x5a, 0x25,\n                                                       0xa, 0xfb, 0x5a, 0xfb, 0x5b, 0x2a, 0xa, 0xae,\n                                                       0x16, 0x40, 0xa, 0xf7, 0x25, 0xf7, 0x48, 0xf7,\n                                                       0x47, 0x2f, 0xa, 0xfb, 0x47, 0xfb, 0x48, 0x36,\n                                                       0xa, 0x1e, 0xf8, 0x31, 0x90, 0x15, 0x13, 0xcf,\n                                                       0x4c, 0x8d, 0x6, 0x22, 0x8e, 0x7a, 0xfb, 0x1,\n                                                       0x32, 0x1b, 0x77, 0x69, 0x95, 0xa3, 0x1f, 0x94,\n                                                       0x91, 0x96, 0x98, 0x1a, 0x13, 0xb7, 0x54, 0xa4,\n                                                       0x78, 0xa0, 0x72, 0x6d, 0x78, 0x72, 0x6e, 0x48,\n                                                       0xe2, 0x72, 0xc1, 0xcd, 0xbd, 0x9b, 0xc4, 0xb2,\n                                                       0x1e, 0xae, 0xbf, 0x9a, 0xce, 0xc9, 0x1a, 0xf7,\n                                                       0xa, 0x49, 0xf7, 0x4, 0xfb, 0x16, 0x1e, 0x13,\n                                                       0xd7, 0xa4, 0x2a, 0x44, 0x4f, 0x23, 0x39, 0xbc,\n                                                       0x58, 0xdb, 0x1f, 0x13, 0xcf, 0x94, 0xbf, 0xbc,\n                                                       0x9c, 0xb6, 0xa9, 0x1f, 0xfb, 0x47, 0xe6, 0x15,\n                                                       0xc2, 0xa3, 0xc3, 0xca, 0x1e, 0x13, 0xd7, 0xa4,\n                                                       0xc1, 0xac, 0x57, 0x5a, 0x53, 0x70, 0x51, 0x4c,\n                                                       0x50, 0x72, 0xc0, 0xbe, 0x1f, 0xe, 0x7d, 0xae,\n                                                       0xe4, 0xaf, 0xf7, 0xee, 0x9b, 0xb0, 0xad, 0xe6,\n                                                       0x4c, 0xa, 0xf7, 0x42, 0xdf, 0xba, 0xeb, 0xf2,\n                                                       0xeb, 0xbc, 0xae, 0x17, 0xf8, 0xb, 0xf7, 0xea,\n                                                       0x15, 0x13, 0xff, 0xc0, 0x22, 0x9d, 0xfb, 0x13,\n                                                       0xf7, 0x15, 0xf7, 0x16, 0x9d, 0xf7, 0x10, 0xf7,\n                                                       0x0, 0xe9, 0x7a, 0xf7, 0x23, 0xfb, 0x11, 0xfb,\n                                                       0x1b, 0x79, 0xfb, 0x16, 0x20, 0x1e, 0xeb, 0x16,\n                                                       0xb3, 0x8a, 0xf7, 0x37, 0xc0, 0xc1, 0x88, 0xfb,\n                                                       0x38, 0x64, 0x66, 0x8c, 0xfb, 0x33, 0x57, 0x55,\n                                                       0x8d, 0xf7, 0x32, 0xb1, 0x1e, 0xfc, 0x48, 0x8f,\n                                                       0x21, 0xa, 0xf7, 0x8, 0x6b, 0xa, 0xf7, 0x5c,\n                                                       0xad, 0x6, 0x80, 0x8c, 0x5, 0x5a, 0x8f, 0x8d,\n                                                       0x91, 0x9d, 0x1a, 0xf8, 0x2b, 0x54, 0x7, 0x6f,\n                                                       0x5b, 0x69, 0x75, 0x58, 0x88, 0x8, 0x7b, 0xa5,\n                                                       0x7, 0x13, 0x2, 0x0, 0xab, 0xa5, 0x8f, 0x64,\n                                                       0x1f, 0xfb, 0xaf, 0x7, 0x76, 0x83, 0x86, 0x78,\n                                                       0x8a, 0x1e, 0x6c, 0x89, 0x5, 0xe, 0xfb, 0xb6,\n                                                       0x58, 0xa3, 0xb8, 0x76, 0xf7, 0x7c, 0x9a, 0x92,\n                                                       0x9a, 0xf7, 0xa, 0x9a, 0xb6, 0xa3, 0xf7, 0x57,\n                                                       0xa4, 0x86, 0xa3, 0x12, 0xf7, 0x1e, 0xa4, 0xc2,\n                                                       0x99, 0xae, 0x9a, 0x8b, 0x9b, 0xa1, 0x9b, 0xa9,\n                                                       0xa4, 0xac, 0xa4, 0x80, 0xa3, 0x13, 0xfd, 0xfe,\n                                                       0xea, 0x88, 0x15, 0x6a, 0xa4, 0xae, 0x7c, 0xaf,\n                                                       0x1b, 0xab, 0xab, 0x95, 0x9e, 0xa6, 0x1f, 0xbc,\n                                                       0xf7, 0x1e, 0xb1, 0xb1, 0xb7, 0xd4, 0xbb, 0xa6,\n                                                       0x90, 0xb2, 0x75, 0xb6, 0x8f, 0xb3, 0x90, 0xc4,\n                                                       0x6e, 0xaa, 0x6c, 0x8f, 0x74, 0x7f, 0xa1, 0xf7,\n                                                       0x5b, 0x5, 0xab, 0x8f, 0x76, 0x9d, 0x74, 0x1b,\n                                                       0x77, 0x76, 0x7f, 0x70, 0x84, 0x1f, 0x5b, 0xfb,\n                                                       0x56, 0x71, 0xe6, 0x79, 0xdb, 0x5, 0x13, 0xfe,\n                                                       0xfd, 0xa4, 0x85, 0x82, 0x9d, 0x6d, 0x1b, 0x6b,\n                                                       0x87, 0x6a, 0x7a, 0x8c, 0x1f, 0x98, 0xfb, 0x8b,\n                                                       0x74, 0x88, 0x72, 0x74, 0x78, 0xfb, 0x21, 0xba,\n                                                       0xfb, 0x7, 0x5, 0xf7, 0x68, 0xf7, 0x29, 0x15,\n                                                       0xba, 0xaa, 0x75, 0x7d, 0xa9, 0x9e, 0xa4, 0x95,\n                                                       0x18, 0x94, 0x9a, 0x9a, 0x6e, 0x88, 0x78, 0x81,\n                                                       0x86, 0x65, 0x7e, 0x5b, 0x76, 0x86, 0xa5, 0x19,\n                                                       0xfb, 0x6b, 0xfb, 0x92, 0x15, 0xa9, 0xf6, 0x5a,\n                                                       0xf7, 0x8, 0x9c, 0xf7, 0x12, 0x99, 0x97, 0xf7,\n                                                       0x1a, 0xa0, 0x98, 0x89, 0x93, 0x7d, 0x81, 0x7d,\n                                                       0x19, 0x79, 0x72, 0x61, 0x7b, 0x6e, 0x80, 0x60,\n                                                       0xa2, 0x18, 0x85, 0x7d, 0xb3, 0x77, 0xa2, 0x72,\n                                                       0x94, 0x6c, 0x91, 0x61, 0x19, 0x99, 0x8e, 0x85,\n                                                       0xb3, 0x85, 0xa8, 0x77, 0xa5, 0x19, 0xaa, 0x96,\n                                                       0xb3, 0x9b, 0x9e, 0xa5, 0x8, 0x91, 0x93, 0x8d,\n                                                       0x95, 0x93, 0x1a, 0x9a, 0x80, 0x98, 0x77, 0x8c,\n                                                       0x1e, 0x29, 0x7c, 0x7e, 0xf7, 0x92, 0x5, 0x9d,\n                                                       0x8a, 0x91, 0x90, 0x90, 0x1b, 0x97, 0x8f, 0x88,\n                                                       0x77, 0x8f, 0x1f, 0x9d, 0x3b, 0xb1, 0xfb, 0x19,\n                                                       0x5, 0xa6, 0x6, 0xc6, 0xf7, 0x80, 0x5, 0x13,\n                                                       0xfd, 0xfe, 0x98, 0x8e, 0x94, 0x92, 0x94, 0x1b,\n                                                       0x95, 0x94, 0x83, 0x7c, 0x89, 0x1f, 0x70, 0xfb,\n                                                       0x8a, 0xc5, 0xaa, 0x99, 0x89, 0x9b, 0x79, 0x86,\n                                                       0x5d, 0x86, 0x61, 0x7e, 0x76, 0xfb, 0x0, 0x5b,\n                                                       0x85, 0x8c, 0x85, 0x8e, 0x89, 0x91, 0x19, 0x85,\n                                                       0x9d, 0xb5, 0xa2, 0x9c, 0x98, 0xb0, 0xcb, 0x18,\n                                                       0x7f, 0x91, 0x56, 0x5c, 0x9b, 0x7c, 0x5, 0x81,\n                                                       0x84, 0x5c, 0x71, 0x72, 0x1a, 0x88, 0x8b, 0x88,\n                                                       0x8c, 0x88, 0x1e, 0x80, 0x8f, 0x99, 0x82, 0x98,\n                                                       0x1b, 0xa1, 0x93, 0x5, 0x76, 0x8c, 0x98, 0x82,\n                                                       0x9d, 0x1b, 0x95, 0x97, 0x8d, 0x8f, 0x98, 0x1f,\n                                                       0x64, 0x49, 0x63, 0x65, 0x5c, 0xfb, 0x1e, 0x5,\n                                                       0x7f, 0x78, 0x71, 0x83, 0x72, 0x1b, 0x70, 0x71,\n                                                       0x94, 0x9f, 0x7a, 0x1f, 0xe, 0x7d, 0xef, 0xf8,\n                                                       0x9c, 0xee, 0x1, 0xf7, 0xf4, 0xf0, 0x26, 0xa,\n                                                       0xf7, 0x74, 0xfb, 0x98, 0x15, 0xac, 0x7, 0xc1,\n                                                       0x8e, 0xad, 0x8d, 0x91, 0xad, 0x8a, 0xa6, 0x19,\n                                                       0xf7, 0x98, 0x7, 0xb7, 0x8c, 0x8e, 0x5e, 0x1e,\n                                                       0x4a, 0x9f, 0x6, 0xd0, 0x95, 0xa4, 0xa8, 0xb2,\n                                                       0xc2, 0x8, 0xd8, 0xfc, 0x39, 0x6, 0x4a, 0x9b,\n                                                       0x90, 0xc9, 0x86, 0x1e, 0x9f, 0x8a, 0x5, 0x6a,\n                                                       0x7, 0xe, 0x7d, 0xef, 0xf8, 0xa3, 0xe7, 0x12,\n                                                       0xae, 0xf7, 0x43, 0xfb, 0x43, 0xf7, 0x58, 0xf7,\n                                                       0xe8, 0xf7, 0x4b, 0xfb, 0x3f, 0xf7, 0x3f, 0x13,\n                                                       0xe8, 0x23, 0xa, 0xf7, 0x43, 0xfb, 0x98, 0x15,\n                                                       0x89, 0xf6, 0xc2, 0xc6, 0xc8, 0xb8, 0x8, 0xc7,\n                                                       0xb8, 0xd1, 0xc0, 0xde, 0x1a, 0xb7, 0x7c, 0xbd,\n                                                       0x56, 0x7b, 0x65, 0x79, 0x77, 0x1e, 0x7e, 0x92,\n                                                       0x80, 0x7d, 0x1a, 0x6e, 0x73, 0x74, 0x6e, 0x1e,\n                                                       0x13, 0xd8, 0x69, 0x76, 0xa6, 0xac, 0xd9, 0xe3,\n                                                       0xaa, 0xcc, 0xe2, 0xef, 0x67, 0x25, 0x2f, 0x43,\n                                                       0x63, 0x42, 0x68, 0x1f, 0x54, 0x72, 0x42, 0x63,\n                                                       0x74, 0x51, 0x8, 0xf7, 0x75, 0x6, 0x9b, 0x8a,\n                                                       0x9c, 0x8b, 0x92, 0x9c, 0xa4, 0xe0, 0x18, 0x13,\n                                                       0xe4, 0x9d, 0xfb, 0x5c, 0x6, 0xe, 0x7d, 0xe6,\n                                                       0xf7, 0xa9, 0x77, 0xba, 0xde, 0x38, 0xf7, 0x55,\n                                                       0xb2, 0xe7, 0x12, 0xae, 0xf7, 0x3c, 0xfb, 0x3c,\n                                                       0xf7, 0x53, 0xe7, 0xf7, 0x2e, 0xfb, 0x24, 0xf7,\n                                                       0xf, 0xf2, 0xf7, 0x5c, 0xfb, 0x37, 0xf7, 0x37,\n                                                       0x13, 0xdc, 0xc0, 0x23, 0xa, 0xf7, 0xaa, 0x94,\n                                                       0x15, 0xa5, 0xa3, 0x7, 0xc9, 0xbf, 0xb4, 0xcc,\n                                                       0xbb, 0x74, 0xb2, 0x55, 0x69, 0x7a, 0x76, 0x82,\n                                                       0x1f, 0x83, 0x90, 0x8a, 0x78, 0x1a, 0x13, 0xea,\n                                                       0xc0, 0x70, 0x74, 0x72, 0x70, 0x6c, 0x76, 0xa0,\n                                                       0xa9, 0xd8, 0xf6, 0xa0, 0xc6, 0xd5, 0xe3, 0x74,\n                                                       0x31, 0x4a, 0x61, 0x6d, 0x53, 0x7a, 0x1e, 0x88,\n                                                       0x8a, 0x7e, 0x89, 0x87, 0x1a, 0x85, 0x93, 0x8a,\n                                                       0x8f, 0x99, 0xb5, 0x7e, 0x85, 0x97, 0x1e, 0x13,\n                                                       0xdd, 0x20, 0xb8, 0x76, 0xa5, 0x62, 0x5a, 0x1a,\n                                                       0xfb, 0x5, 0xfb, 0x5, 0x55, 0x28, 0x65, 0x64,\n                                                       0x91, 0x9c, 0x69, 0x1e, 0x6a, 0x9c, 0x6b, 0xaa,\n                                                       0xb4, 0x1a, 0xb1, 0xa0, 0xa1, 0xb3, 0xac, 0xa0,\n                                                       0x74, 0x6b, 0x1e, 0x7e, 0x84, 0x80, 0x7e, 0x1a,\n                                                       0x71, 0xac, 0x82, 0xa0, 0xcd, 0xb4, 0xcd, 0xc8,\n                                                       0xcd, 0x65, 0xb2, 0x48, 0x79, 0x79, 0x90, 0x87,\n                                                       0x79, 0x1e, 0xe, 0x7d, 0xef, 0x8b, 0xd3, 0xf8,\n                                                       0x54, 0xee, 0x12, 0xae, 0xf8, 0xb3, 0xfb, 0x2,\n                                                       0xf7, 0xb2, 0x13, 0xf0, 0x29, 0xa, 0x1e, 0x13,\n                                                       0xe8, 0x24, 0xa, 0x1f, 0x13, 0xf0, 0x27, 0xa,\n                                                       0x1f, 0xf7, 0xd, 0xfb, 0x13, 0x15, 0xac, 0x7,\n                                                       0xf7, 0x6d, 0xf7, 0xf6, 0x5, 0x13, 0xe8, 0xea,\n                                                       0xfb, 0xe1, 0x6, 0x13, 0xf0, 0xf7, 0x2, 0x55,\n                                                       0x6, 0x13, 0xe8, 0xfb, 0x2, 0x4c, 0x6, 0x78,\n                                                       0x93, 0x84, 0x9b, 0x88, 0x1e, 0xbe, 0x82, 0x5,\n                                                       0x6b, 0xfb, 0xa0, 0xab, 0x7, 0xd2, 0x94, 0x5,\n                                                       0xa0, 0x8e, 0x8e, 0xa0, 0x92, 0x1a, 0xc8, 0x7,\n                                                       0xfb, 0x2b, 0xc1, 0x15, 0xf7, 0x2b, 0xf7, 0x97,\n                                                       0x6, 0xe, 0x7b, 0xe7, 0x31, 0xe7, 0xf7, 0xab,\n                                                       0x77, 0xce, 0xe8, 0xe9, 0xf7, 0x6, 0x12, 0xae,\n                                                       0xf7, 0x2e, 0xfb, 0x2e, 0xf7, 0x57, 0xd5, 0xf7,\n                                                       0x26, 0xf7, 0x12, 0xf7, 0x46, 0x13, 0xbd, 0x80,\n                                                       0x3b, 0xa, 0x13, 0x7d, 0x80, 0x2c, 0xa, 0x13,\n                                                       0xbb, 0x80, 0xf7, 0x57, 0x74, 0x15, 0x8c, 0xf7,\n                                                       0xb7, 0x5, 0x7d, 0xcc, 0xda, 0x82, 0xc8, 0x1b,\n                                                       0xb8, 0xb9, 0x8e, 0x99, 0xb6, 0x1f, 0x85, 0x72,\n                                                       0x79, 0x58, 0x78, 0x7d, 0x8, 0x6f, 0x66, 0x47,\n                                                       0x90, 0x5f, 0x1b, 0x23, 0x8f, 0x5, 0xfb, 0x1a,\n                                                       0x7, 0xa7, 0xac, 0xbf, 0x96, 0xb4, 0x1b, 0xb4,\n                                                       0xb4, 0x82, 0x72, 0xac, 0x1f, 0xb0, 0x71, 0xa3,\n                                                       0x61, 0x5d, 0x1a, 0x13, 0x7d, 0x80, 0xfb, 0x7,\n                                                       0xfb, 0x2, 0x4c, 0x23, 0x4d, 0xfb, 0x3, 0xa6,\n                                                       0xdb, 0xac, 0x9f, 0xa7, 0xaf, 0xaa, 0xa7, 0x7a,\n                                                       0x69, 0x1e, 0x78, 0x81, 0x81, 0x7e, 0x1a, 0x71,\n                                                       0xae, 0x82, 0x9f, 0xcc, 0xaf, 0xd0, 0xc4, 0xc1,\n                                                       0x70, 0xc6, 0x4d, 0x67, 0x6d, 0x71, 0x70, 0x76,\n                                                       0x1e, 0xe, 0x7d, 0xe7, 0xf7, 0xa9, 0x77, 0xd3,\n                                                       0xb9, 0x5d, 0xf7, 0x3f, 0xae, 0xe7, 0x12, 0xae,\n                                                       0xf7, 0x29, 0xf7, 0x7, 0xf7, 0x55, 0x6a, 0xf2,\n                                                       0x8b, 0xf7, 0x54, 0xfb, 0x3a, 0xf7, 0x3a, 0x13,\n                                                       0xee, 0x40, 0x23, 0xa, 0xf7, 0x97, 0x76, 0x15,\n                                                       0xbc, 0xaa, 0xc3, 0xac, 0xc5, 0x1b, 0xe3, 0xc8,\n                                                       0x49, 0x31, 0xfb, 0x3, 0x34, 0x4d, 0x22, 0x49,\n                                                       0x52, 0xa0, 0xc0, 0x63, 0x1f, 0x65, 0xbe, 0x80,\n                                                       0xcc, 0xca, 0x1a, 0xcb, 0x93, 0xcf, 0xad, 0xc2,\n                                                       0x1e, 0xcf, 0xb5, 0xc4, 0xa6, 0xda, 0x1b, 0x13,\n                                                       0xed, 0x80, 0xc7, 0xed, 0x72, 0x40, 0x6b, 0x7a,\n                                                       0x6f, 0x68, 0x6e, 0x75, 0x9f, 0xa8, 0x1f, 0x98,\n                                                       0x91, 0x99, 0x96, 0x1a, 0x13, 0xde, 0x40, 0xa5,\n                                                       0x63, 0x97, 0x76, 0x56, 0x7c, 0x6d, 0x5e, 0x78,\n                                                       0x1e, 0x7c, 0x5a, 0x8b, 0x45, 0x83, 0x50, 0x8,\n                                                       0x90, 0x33, 0x15, 0x4e, 0xa6, 0x4f, 0xd1, 0xcd,\n                                                       0xa9, 0xcb, 0xc5, 0xbf, 0x72, 0xcc, 0x4e, 0x48,\n                                                       0x63, 0x55, 0x4b, 0x1e, 0xe, 0x7d, 0xe8, 0xf8,\n                                                       0xa4, 0xed, 0x1, 0xae, 0xf7, 0x38, 0x26, 0xa,\n                                                       0xf7, 0x38, 0xd5, 0x15, 0x8c, 0xf7, 0x4f, 0x5,\n                                                       0xf8, 0x1e, 0x6, 0x25, 0xfb, 0x44, 0x5, 0x68,\n                                                       0x4e, 0x56, 0x3f, 0x42, 0x71, 0x94, 0x6c, 0x77,\n                                                       0x1a, 0x64, 0x72, 0x71, 0x64, 0x5f, 0x73, 0xaa,\n                                                       0xb5, 0xcf, 0xc2, 0xd7, 0xb4, 0xbf, 0x1e, 0xf7,\n                                                       0xa, 0xf7, 0x34, 0x5, 0xfb, 0x6b, 0x6, 0x76,\n                                                       0x80, 0x84, 0x71, 0x84, 0x1f, 0x79, 0x54, 0x5,\n                                                       0xe, 0x7d, 0xe7, 0xf8, 0xab, 0xe7, 0x12, 0xae,\n                                                       0xf7, 0x3f, 0xd7, 0xf7, 0x61, 0xfb, 0x34, 0xf7,\n                                                       0x2c, 0xf4, 0xf7, 0x3e, 0x13, 0xec, 0x23, 0xa,\n                                                       0xf7, 0xad, 0x9d, 0x15, 0x60, 0xa5, 0x75, 0xab,\n                                                       0xc2, 0x1a, 0xe1, 0xcd, 0xbd, 0xdb, 0xcb, 0xd5,\n                                                       0x6c, 0x3e, 0x53, 0x6f, 0x73, 0x61, 0x70, 0x1e,\n                                                       0xce, 0x6a, 0xbf, 0x63, 0x3a, 0x1a, 0x20, 0x29,\n                                                       0x50, 0x2a, 0x35, 0x2a, 0xb0, 0xf1, 0xd7, 0xbc,\n                                                       0xb0, 0xc8, 0xad, 0x1e, 0xf7, 0x4, 0xbf, 0x15,\n                                                       0xaa, 0x9e, 0x9f, 0xaa, 0xb0, 0x1a, 0xbb, 0x66,\n                                                       0xa5, 0x5e, 0x66, 0x6a, 0x66, 0x65, 0x5f, 0xb7,\n                                                       0x7f, 0xac, 0x7a, 0x1e, 0x58, 0x34, 0x15, 0x13,\n                                                       0xf4, 0x61, 0x75, 0x6e, 0x5d, 0x5b, 0x1a, 0x50,\n                                                       0xb5, 0x5c, 0xc7, 0xc4, 0xb9, 0xaf, 0xc7, 0xbc,\n                                                       0x60, 0xa5, 0x66, 0xa0, 0x1e, 0xe, 0x7d, 0xe7,\n                                                       0xb0, 0xf7, 0x3e, 0x5e, 0xb8, 0xf7, 0xdc, 0xe7,\n                                                       0x12, 0xae, 0xf7, 0x36, 0xfb, 0x36, 0xf7, 0x51,\n                                                       0xd1, 0xf7, 0x55, 0xf7, 0x6, 0xf7, 0x2d, 0x13,\n                                                       0xbb, 0x23, 0xa, 0xf8, 0x5e, 0x90, 0x15, 0x5e,\n                                                       0x6a, 0x54, 0x76, 0x54, 0x1b, 0x30, 0x4d, 0xd3,\n                                                       0xe9, 0xf7, 0x0, 0xe4, 0xc1, 0xf3, 0xf7, 0x27,\n                                                       0xcb, 0xfb, 0xf, 0xfb, 0x1c, 0x47, 0x82, 0x4a,\n                                                       0x65, 0x52, 0x1f, 0x49, 0x61, 0x51, 0x77, 0x3f,\n                                                       0x1b, 0x13, 0xb7, 0x4f, 0x2d, 0xa7, 0xd5, 0xab,\n                                                       0xa0, 0xa7, 0xad, 0xa6, 0xa0, 0x73, 0x70, 0x1f,\n                                                       0x7d, 0x85, 0x7f, 0x81, 0x1a, 0x13, 0xdb, 0x70,\n                                                       0xab, 0x80, 0xa0, 0xee, 0x9f, 0xf7, 0x1b, 0xd7,\n                                                       0x1e, 0xfb, 0x5b, 0xf7, 0x13, 0x15, 0x52, 0xa7,\n                                                       0x50, 0xcb, 0xd1, 0xaa, 0xcb, 0xc8, 0xc2, 0x66,\n                                                       0xc5, 0x4f, 0x45, 0x71, 0x4e, 0x4e, 0x1e, 0xe,\n                                                       0x7d, 0xe7, 0x2f, 0xef, 0xf8, 0x4c, 0xf7, 0x47,\n                                                       0x28, 0xee, 0x2f, 0xe7, 0x12, 0xae, 0xf7, 0x55,\n                                                       0xe8, 0xc4, 0xf1, 0xf7, 0x5, 0xeb, 0xcc, 0x13,\n                                                       0x67, 0x80, 0x23, 0xa, 0xf7, 0x15, 0xfb, 0x98,\n                                                       0x15, 0xb0, 0x7, 0xad, 0x8e, 0x5, 0xb0, 0x8d,\n                                                       0x84, 0xa1, 0xa9, 0x1a, 0xf7, 0xb5, 0x7, 0xb5,\n                                                       0x72, 0x87, 0x67, 0x1e, 0x6b, 0x9e, 0x6, 0x13,\n                                                       0x57, 0x80, 0xc4, 0x8e, 0x9b, 0xa3, 0xaa, 0xc0,\n                                                       0x8, 0xdd, 0xfc, 0x3e, 0x6, 0x56, 0x88, 0x8e,\n                                                       0xc2, 0x86, 0x1e, 0x98, 0x89, 0x5, 0x66, 0x7,\n                                                       0x83, 0xf7, 0x93, 0x15, 0x13, 0x8f, 0x80, 0xf7,\n                                                       0xa, 0x93, 0xf7, 0x2e, 0xf7, 0x2a, 0xf7, 0x1e,\n                                                       0x9a, 0xfb, 0x3c, 0x23, 0xfb, 0x0, 0x7e, 0xfb,\n                                                       0x2f, 0xfb, 0x1f, 0xfb, 0x29, 0x81, 0xf7, 0x22,\n                                                       0xf7, 0xd, 0x1e, 0xf1, 0x16, 0x60, 0x89, 0xfb,\n                                                       0x48, 0xc6, 0xc4, 0x8a, 0xf7, 0x4b, 0xb3, 0x1e,\n                                                       0xf7, 0x45, 0x80, 0x81, 0xc4, 0x67, 0x1b, 0x54,\n                                                       0x8a, 0xfb, 0x57, 0x64, 0x1f, 0xe, 0x9b, 0xae,\n                                                       0x76, 0xc3, 0xa4, 0x86, 0xa5, 0xab, 0x9a, 0x97,\n                                                       0xa3, 0x96, 0x9d, 0xf7, 0x6, 0xf7, 0x3d, 0x67,\n                                                       0xa5, 0x79, 0xa8, 0x70, 0xf7, 0x32, 0x12, 0x9e,\n                                                       0xa4, 0xf8, 0x3b, 0x9a, 0xf7, 0x7b, 0x9b, 0xb3,\n                                                       0xa4, 0x13, 0xbc, 0xbc, 0xcf, 0xb5, 0x15, 0xf7,\n                                                       0x1f, 0xc2, 0x5, 0x13, 0xdc, 0xbc, 0x80, 0xaa,\n                                                       0xb3, 0x7b, 0xac, 0x1b, 0xb5, 0xb5, 0x9d, 0xa2,\n                                                       0xb4, 0x1f, 0xd0, 0x70, 0xc9, 0xad, 0xc4, 0x97,\n                                                       0xa6, 0x67, 0xae, 0x78, 0xb6, 0xa9, 0x19, 0x8c,\n                                                       0x8e, 0x8e, 0x86, 0xdc, 0x32, 0x94, 0x91, 0x68,\n                                                       0xf7, 0x5, 0x73, 0xb5, 0x9a, 0x8e, 0x98, 0x94,\n                                                       0x90, 0x9c, 0x19, 0x86, 0xf7, 0x24, 0xfb, 0xc,\n                                                       0xf7, 0x18, 0x54, 0x9f, 0x61, 0x8e, 0x5, 0x13,\n                                                       0xbc, 0x7c, 0x3a, 0xf7, 0x20, 0x5, 0x40, 0x6,\n                                                       0xda, 0xfb, 0x1b, 0x25, 0x91, 0x58, 0x7a, 0xfb,\n                                                       0x87, 0xfb, 0x34, 0x58, 0x80, 0x5, 0x73, 0x66,\n                                                       0x83, 0x53, 0x5f, 0x1a, 0x5c, 0x9f, 0x4b, 0xa8,\n                                                       0x67, 0x1e, 0x13, 0xbe, 0x3c, 0xf8, 0xec, 0xf7,\n                                                       0xc0, 0x15, 0x3d, 0xf7, 0x1b, 0xa0, 0x8a, 0xba,\n                                                       0x79, 0xf7, 0x2, 0xfb, 0xc, 0x8e, 0xfb, 0x16,\n                                                       0x86, 0x82, 0x83, 0x8a, 0x83, 0x8c, 0x19, 0x69,\n                                                       0xc5, 0x5, 0x94, 0x95, 0x8f, 0x98, 0x97, 0x1a,\n                                                       0xa2, 0x78, 0x9f, 0x73, 0x8f, 0x1e, 0x59, 0xfb,\n                                                       0x4b, 0x15, 0x78, 0xd3, 0xb2, 0x93, 0xc3, 0x29,\n                                                       0x86, 0x7a, 0x6b, 0x79, 0x74, 0xaa, 0x7b, 0xa1,\n                                                       0x19, 0xfb, 0x20, 0x8c, 0x15, 0x81, 0x93, 0x87,\n                                                       0x93, 0x92, 0x1a, 0x99, 0x96, 0x97, 0x9e, 0x94,\n                                                       0x1e, 0x8b, 0xc7, 0x91, 0xa9, 0x90, 0x1e, 0x9e,\n                                                       0x44, 0x54, 0x7f, 0x5, 0xfc, 0x7a, 0x44, 0x15,\n                                                       0x75, 0xaf, 0x7d, 0xb0, 0xb7, 0x1a, 0xb8, 0x8e,\n                                                       0xaf, 0x9e, 0xac, 0x1e, 0xb9, 0x95, 0x5, 0x13,\n                                                       0xbd, 0x3c, 0xf7, 0x87, 0xf7, 0x36, 0xb8, 0x98,\n                                                       0xf7, 0x5, 0x85, 0xd5, 0xfb, 0x14, 0x5a, 0x93,\n                                                       0x39, 0xad, 0x92, 0xac, 0x79, 0x8e, 0x7b, 0x44,\n                                                       0xfb, 0x24, 0x7d, 0x8c, 0x7c, 0xf7, 0x6a, 0x9f,\n                                                       0xf7, 0x4c, 0x70, 0x5, 0x9e, 0x88, 0x95, 0x7b,\n                                                       0x7b, 0x1a, 0x81, 0x88, 0x81, 0x82, 0x84, 0x1e,\n                                                       0x77, 0x42, 0x2a, 0x7d, 0x4f, 0x1b, 0x6d, 0x98,\n                                                       0x65, 0x59, 0x43, 0x69, 0x4a, 0x89, 0x3e, 0x9d,\n                                                       0x19, 0x88, 0x7c, 0xd7, 0x79, 0xca, 0x8d, 0xd1,\n                                                       0xa8, 0x19, 0xa6, 0x63, 0x5, 0x13, 0xdc, 0xbc,\n                                                       0x79, 0x6a, 0x63, 0x78, 0x65, 0x1b, 0x6c, 0x5f,\n                                                       0x9d, 0x95, 0x6e, 0x1f, 0xf7, 0x7b, 0x99, 0x15,\n                                                       0x6f, 0xb4, 0x8e, 0x8d, 0xa0, 0xa6, 0xbe, 0x92,\n                                                       0x5, 0x82, 0x83, 0x82, 0x81, 0x7b, 0x1a, 0x7b,\n                                                       0x95, 0x7f, 0x98, 0x82, 0x1e, 0xbf, 0x81, 0x64,\n                                                       0x76, 0x5, 0xe, 0x7d, 0xae, 0xf8, 0x52, 0xa0,\n                                                       0xf7, 0x4a, 0x74, 0xa, 0xf7, 0xbe, 0xc9, 0xf7,\n                                                       0xb5, 0xae, 0x3, 0x22, 0xa, 0xf7, 0xbe, 0x6b,\n                                                       0xa, 0xc9, 0xf8, 0x6a, 0x51, 0x6, 0x7e, 0x4a,\n                                                       0x71, 0x70, 0x4d, 0x8a, 0x8, 0x76, 0xec, 0x7,\n                                                       0xe, 0x7d, 0xae, 0xe5, 0xbe, 0xf8, 0xb, 0xbd,\n                                                       0xde, 0x74, 0xa, 0xf7, 0x3f, 0xc7, 0xf7, 0x47,\n                                                       0xcc, 0xf7, 0x42, 0xae, 0x3, 0x22, 0xa, 0xf7,\n                                                       0x46, 0x6b, 0xa, 0xf7, 0xbe, 0xbe, 0xfb, 0x7e,\n                                                       0x6, 0x9a, 0xae, 0xae, 0xa0, 0xa9, 0x9f, 0x8,\n                                                       0xd7, 0xbe, 0xd8, 0xbb, 0xf2, 0x1a, 0xe4, 0x44,\n                                                       0xc5, 0x35, 0x38, 0x4a, 0x4d, 0xfb, 0x1, 0x8c,\n                                                       0x1e, 0xc7, 0x86, 0x5, 0xd5, 0xa3, 0xbf, 0xc9,\n                                                       0xc6, 0xad, 0x5e, 0x52, 0x3d, 0x50, 0x66, 0x51,\n                                                       0x65, 0x1e, 0x54, 0x68, 0x4e, 0x58, 0x45, 0x1a,\n                                                       0xe, 0x7d, 0xae, 0xde, 0xbf, 0xf8, 0x15, 0xba,\n                                                       0xdd, 0x4c, 0xa, 0xf8, 0x25, 0xc9, 0x5b, 0xc8,\n                                                       0xf7, 0x41, 0xae, 0x13, 0xfb, 0x22, 0xa, 0xf7,\n                                                       0x4b, 0x30, 0x15, 0xfb, 0x3, 0x8a, 0xcf, 0x63,\n                                                       0xd3, 0x1b, 0xdb, 0xd5, 0xc0, 0xdf, 0xc2, 0x71,\n                                                       0xb9, 0x54, 0x99, 0x1f, 0x8d, 0x7, 0x13, 0xfd,\n                                                       0xba, 0x9d, 0xa0, 0xa8, 0xbe, 0x1a, 0xdb, 0x47,\n                                                       0xbf, 0x40, 0x40, 0x50, 0x5c, 0x3f, 0x8d, 0x1e,\n                                                       0xc1, 0x85, 0x5, 0xbc, 0x89, 0xa5, 0xac, 0xc0,\n                                                       0x1b, 0xc1, 0xa7, 0x6b, 0x56, 0x53, 0x5e, 0x71,\n                                                       0x58, 0x1f, 0x72, 0x8c, 0x5, 0x63, 0x7, 0x13,\n                                                       0xfb, 0xc8, 0x92, 0xd5, 0x6f, 0x42, 0x1a, 0x52,\n                                                       0x66, 0x6f, 0x53, 0x56, 0x64, 0xb7, 0xc2, 0x92,\n                                                       0x1e, 0xe, 0x7d, 0xae, 0xf7, 0x64, 0xc0, 0xf8,\n                                                       0x18, 0x74, 0xa, 0xf7, 0xe6, 0xc2, 0xf7, 0x94,\n                                                       0xae, 0x3, 0x22, 0xa, 0xf7, 0x16, 0xfb, 0x9,\n                                                       0x15, 0xf7, 0x64, 0xfb, 0xa, 0xc2, 0xf7, 0xa,\n                                                       0xda, 0xc0, 0x3c, 0xf7, 0xc5, 0x6, 0x58, 0x8c,\n                                                       0xfb, 0x68, 0xfb, 0xc6, 0x5, 0xc3, 0x16, 0xf7,\n                                                       0x2c, 0xf7, 0x75, 0x5, 0xfb, 0x75, 0x7, 0xe,\n                                                       0x7d, 0xae, 0xde, 0xbd, 0xf7, 0x70, 0xc2, 0xee,\n                                                       0xc0, 0xe4, 0x4c, 0xa, 0xf7, 0x54, 0xbf, 0x5e,\n                                                       0xbe, 0xf7, 0x41, 0xca, 0xf7, 0x37, 0xae, 0x13,\n                                                       0xfe, 0xc0, 0x22, 0xa, 0xf7, 0x54, 0xfb, 0xe,\n                                                       0x15, 0x42, 0x8f, 0xc5, 0x5c, 0xd3, 0x1b, 0xf2,\n                                                       0xc4, 0xd4, 0xec, 0xdc, 0x55, 0xd5, 0x35, 0x1f,\n                                                       0x13, 0xfd, 0xc0, 0x66, 0x63, 0x82, 0x69, 0x78,\n                                                       0x1f, 0xf7, 0x22, 0xf7, 0x76, 0xc0, 0xfb, 0xa9,\n                                                       0xfb, 0xab, 0x7, 0x13, 0xfe, 0xc0, 0xb8, 0x6,\n                                                       0xb9, 0x93, 0xa9, 0xa5, 0xbd, 0x1b, 0xc9, 0xa8,\n                                                       0x60, 0x54, 0x48, 0x77, 0x54, 0x3d, 0x5f, 0x64,\n                                                       0xb0, 0xb8, 0x8d, 0x1f, 0xe, 0x7d, 0xae, 0xde,\n                                                       0xb9, 0xf7, 0x67, 0xbf, 0xf7, 0x10, 0xbe, 0xdd,\n                                                       0x4c, 0xa, 0xf7, 0x37, 0xc3, 0x53, 0xcd, 0xf7,\n                                                       0x45, 0xc3, 0xf7, 0x4f, 0xae, 0x13, 0xfe, 0xc0,\n                                                       0x22, 0xa, 0xf7, 0x6f, 0x8a, 0x15, 0xe6, 0x9f,\n                                                       0xf0, 0xe1, 0xbc, 0x9b, 0x70, 0x61, 0x94, 0x1e,\n                                                       0xbd, 0x98, 0x5, 0xcf, 0x81, 0x5f, 0xb2, 0x46,\n                                                       0x1b, 0x53, 0x53, 0x65, 0x58, 0x73, 0x1f, 0x75,\n                                                       0x5b, 0x86, 0x54, 0x57, 0x1a, 0x59, 0x8f, 0x4c,\n                                                       0xa1, 0x5e, 0x1e, 0x58, 0xa3, 0xbd, 0x6c, 0xc4,\n                                                       0x1b, 0xe4, 0xc0, 0xda, 0xde, 0xd9, 0x5a, 0xd0,\n                                                       0x38, 0x73, 0x74, 0x86, 0x7f, 0x78, 0x1f, 0x77,\n                                                       0x80, 0x7c, 0x7a, 0x81, 0x74, 0x8, 0x13, 0xfd,\n                                                       0xc0, 0x95, 0x3b, 0x15, 0xbf, 0xac, 0xb7, 0xc2,\n                                                       0xcb, 0xa4, 0x5d, 0x53, 0x56, 0x76, 0x53, 0x4d,\n                                                       0x4b, 0x6d, 0xc3, 0xc6, 0x1e, 0xe, 0x7d, 0xae,\n                                                       0xf8, 0x8e, 0xc1, 0xe4, 0x74, 0xa, 0xf7, 0x3b,\n                                                       0xf7, 0xcc, 0xf7, 0x3e, 0xae, 0x3, 0x22, 0xa,\n                                                       0xf7, 0x72, 0x6b, 0xa, 0xce, 0x6, 0xa4, 0xf7,\n                                                       0x2e, 0xd7, 0xf7, 0x1f, 0xe4, 0xf7, 0x13, 0x8,\n                                                       0xbd, 0xfb, 0xcc, 0x55, 0xf7, 0x89, 0x7, 0x29,\n                                                       0xfb, 0xb, 0x48, 0xfb, 0x23, 0x72, 0xfb, 0x2e,\n                                                       0x8, 0xe, 0x7d, 0xae, 0xe8, 0xbf, 0xf7, 0x37,\n                                                       0xc1, 0xf7, 0x32, 0xba, 0xdd, 0x4c, 0xa, 0xf7,\n                                                       0x44, 0xc3, 0x64, 0xc3, 0xf7, 0x35, 0xbf, 0x5e,\n                                                       0xc3, 0xf7, 0x44, 0xae, 0x13, 0xfe, 0x60, 0xf7,\n                                                       0xe3, 0xf7, 0xfb, 0x15, 0x55, 0x7c, 0x68, 0x64,\n                                                       0x50, 0x1a, 0x39, 0xc9, 0x59, 0xdc, 0xdc, 0xd4,\n                                                       0xb6, 0xe1, 0xc4, 0x6d, 0xb6, 0x54, 0x9b, 0x1e,\n                                                       0x8d, 0x7, 0x13, 0xfd, 0xa0, 0xbc, 0x9a, 0xa4,\n                                                       0xae, 0xc0, 0x1a, 0xd5, 0x50, 0xbd, 0x43, 0x43,\n                                                       0x49, 0x5b, 0x3e, 0x5c, 0xa7, 0x63, 0xb7, 0x7c,\n                                                       0x1e, 0x7b, 0xf2, 0x15, 0xba, 0xab, 0xa9, 0xba,\n                                                       0xbd, 0xab, 0x6f, 0x5a, 0x58, 0x6b, 0x6d, 0x58,\n                                                       0x56, 0x72, 0xaa, 0xbd, 0x1e, 0x13, 0xfe, 0x60,\n                                                       0x7a, 0xfb, 0x74, 0x15, 0xbe, 0xad, 0xb1, 0xc0,\n                                                       0xc4, 0xb4, 0x74, 0x4f, 0x52, 0x69, 0x74, 0x51,\n                                                       0x56, 0x63, 0xa0, 0xc0, 0x1e, 0xfb, 0x9f, 0xf5,\n                                                       0x21, 0xa, 0xe, 0x7d, 0xae, 0xde, 0xbd, 0xf7,\n                                                       0x13, 0xbf, 0xf7, 0x67, 0xb7, 0xdd, 0x4c, 0xa,\n                                                       0xf7, 0x42, 0xc3, 0x67, 0xbc, 0xf7, 0x39, 0xcd,\n                                                       0x53, 0xc3, 0xf7, 0x43, 0xae, 0x13, 0xfd, 0x60,\n                                                       0x22, 0xa, 0xf7, 0x56, 0xfb, 0x20, 0x15, 0x4a,\n                                                       0x93, 0xb6, 0x66, 0xce, 0x1b, 0xc9, 0xc1, 0xb5,\n                                                       0xc2, 0xa2, 0x1f, 0x9c, 0xb3, 0x91, 0xd1, 0xb7,\n                                                       0x1a, 0xf1, 0x71, 0xf7, 0x17, 0xfb, 0x14, 0x1e,\n                                                       0x13, 0xfe, 0x60, 0x32, 0x52, 0x41, 0x36, 0x3b,\n                                                       0xba, 0x47, 0xe0, 0xbd, 0xb6, 0xa1, 0xb9, 0x9e,\n                                                       0x1f, 0x43, 0x83, 0xfb, 0xf, 0x29, 0x1e, 0x13,\n                                                       0xfd, 0xa0, 0x67, 0x70, 0xa7, 0xad, 0x85, 0x1f,\n                                                       0xd7, 0xf7, 0x9, 0x15, 0x13, 0xfe, 0xa0, 0x4e,\n                                                       0x6f, 0xb3, 0xc3, 0xc8, 0xa0, 0xc1, 0xd1, 0xc4,\n                                                       0xa9, 0x53, 0x58, 0x52, 0x70, 0x5c, 0x4d, 0x1f,\n                                                       0xe, 0x7d, 0xae, 0xdd, 0xb8, 0xf8, 0x1e, 0xb8,\n                                                       0xde, 0x74, 0xa, 0xf7, 0x3a, 0xc8, 0xbc, 0xc3,\n                                                       0xf7, 0x44, 0xc3, 0xe0, 0xae, 0x3, 0xf8, 0x26,\n                                                       0x4d, 0xa, 0xc4, 0x93, 0xf7, 0x1f, 0xdd, 0xe2,\n                                                       0x8a, 0xfb, 0x1b, 0x4e, 0x53, 0x85, 0xfb, 0x22,\n                                                       0x3b, 0x35, 0x87, 0xf7, 0x1d, 0xc8, 0x1e, 0x53,\n                                                       0x16, 0x34, 0xab, 0xfb, 0x30, 0xf7, 0x6, 0xf7,\n                                                       0x17, 0x96, 0xf7, 0x23, 0xef, 0xeb, 0x79, 0xf7,\n                                                       0x25, 0xfb, 0x10, 0xfb, 0x18, 0x7d, 0xfb, 0x21,\n                                                       0x27, 0x1e, 0xfb, 0xcb, 0x16, 0x20, 0xa, 0xf7,\n                                                       0x3a, 0x6b, 0xa, 0xc8, 0xf8, 0x6a, 0x58, 0x6,\n                                                       0x85, 0x56, 0x65, 0x69, 0x5b, 0x8c, 0x8, 0x6d,\n                                                       0xdd, 0x7, 0xe, 0xd3, 0xa0, 0x76, 0xf7, 0x5a,\n                                                       0x96, 0xf8, 0x51, 0x77, 0x1, 0xf3, 0xf9, 0x2c,\n                                                       0x3, 0xf8, 0xaa, 0xf2, 0x15, 0xf7, 0x73, 0x24,\n                                                       0x96, 0x96, 0xfb, 0x10, 0xf7, 0x74, 0xfc, 0x37,\n                                                       0xf8, 0x37, 0x75, 0x75, 0xf8, 0x39, 0xfc, 0x39,\n                                                       0x6f, 0x89, 0xfc, 0x2c, 0xf8, 0x2c, 0x80, 0x81,\n                                                       0xf8, 0x2b, 0xfc, 0x2b, 0x7d, 0x68, 0xfc, 0x36,\n                                                       0xf8, 0x35, 0x5b, 0x5a, 0x5, 0xf8, 0x5c, 0xfc,\n                                                       0x17, 0x15, 0xa0, 0x97, 0x9a, 0xb2, 0xac, 0x8e,\n                                                       0xd8, 0xfb, 0x17, 0x82, 0x82, 0x5, 0xe, 0x7d,\n                                                       0x72, 0xa, 0x1, 0xf7, 0xf6, 0xe5, 0x26, 0xa,\n                                                       0xf7, 0xd3, 0x6b, 0xa, 0xf7, 0xf8, 0x2a, 0xae,\n                                                       0x7, 0xd2, 0x8c, 0xa8, 0xa1, 0x97, 0xd1, 0x8,\n                                                       0xd6, 0xfc, 0x78, 0x6, 0xe, 0x7d, 0xf7, 0x11,\n                                                       0xf8, 0x7e, 0xf3, 0x12, 0xae, 0xf7, 0x54, 0xfb,\n                                                       0x54, 0xf7, 0x5c, 0xdb, 0xf7, 0x2c, 0xe7, 0xf7,\n                                                       0x57, 0x13, 0xec, 0x23, 0xa, 0x13, 0xdc, 0xf7,\n                                                       0x5c, 0x6b, 0xa, 0x89, 0xec, 0xce, 0xbf, 0xc5,\n                                                       0xb0, 0x8, 0xc2, 0xae, 0xc1, 0xaf, 0xd4, 0x1a,\n                                                       0xbd, 0x72, 0xb1, 0x54, 0x54, 0x79, 0x5e, 0x46,\n                                                       0x8c, 0x1e, 0x13, 0xec, 0x33, 0x93, 0x5, 0xf7,\n                                                       0x8, 0xd5, 0xc9, 0xe3, 0xe6, 0xda, 0x4a, 0x2c,\n                                                       0x22, 0x37, 0x5c, 0x3d, 0x57, 0x1e, 0x74, 0x7c,\n                                                       0x6a, 0x77, 0x80, 0x71, 0x8, 0xf7, 0x7a, 0x4a,\n                                                       0x6, 0xe, 0x7d, 0xf7, 0xa, 0xcd, 0xf7, 0x36,\n                                                       0xc3, 0xf7, 0x25, 0xd0, 0xf2, 0x1, 0xf7, 0xd4,\n                                                       0xf7, 0x2b, 0xe3, 0xf7, 0x57, 0x26, 0xa, 0xf7,\n                                                       0x60, 0x40, 0x15, 0xdc, 0x8c, 0x5, 0x4e, 0x8f,\n                                                       0x61, 0xcf, 0x8c, 0x1e, 0xbf, 0x8c, 0xa6, 0xab,\n                                                       0xbd, 0x1a, 0xc3, 0x66, 0xa2, 0x58, 0x1e, 0x5c,\n                                                       0x88, 0x5, 0xc9, 0x7, 0xb2, 0x88, 0x5, 0xbd,\n                                                       0xac, 0xa4, 0xbf, 0xb3, 0x79, 0xa7, 0x5f, 0x50,\n                                                       0x7e, 0x6b, 0x59, 0x8d, 0x1f, 0x39, 0x94, 0x5,\n                                                       0xe8, 0x89, 0xce, 0xbc, 0xe3, 0x1b, 0xd7, 0xd5,\n                                                       0x56, 0x3a, 0x5c, 0x79, 0x68, 0x60, 0x75, 0x1f,\n                                                       0xbc, 0x71, 0xa3, 0x6e, 0x4f, 0x1a, 0x30, 0x3e,\n                                                       0x55, 0x36, 0x3f, 0x39, 0xb4, 0xe1, 0x1e, 0xe,\n                                                       0x7d, 0xf7, 0x11, 0xf8, 0x80, 0xf1, 0x12, 0xf7,\n                                                       0x4e, 0xf7, 0xb7, 0xfb, 0x5e, 0xf7, 0xb, 0x13,\n                                                       0xd0, 0x23, 0xa, 0x13, 0xe0, 0xf7, 0x2b, 0xfb,\n                                                       0x9, 0x15, 0xc7, 0x7, 0xf7, 0x5f, 0xf7, 0xce,\n                                                       0x5, 0xe3, 0xfb, 0xc7, 0xdf, 0x48, 0x37, 0xfb,\n                                                       0xa, 0x6, 0x13, 0xd0, 0x38, 0xf7, 0xa, 0x6,\n                                                       0x13, 0xe0, 0x13, 0xd0, 0xfb, 0xb, 0xce, 0x15,\n                                                       0xf7, 0xb, 0xf7, 0x56, 0x6, 0xe, 0x7d, 0xf7,\n                                                       0xa, 0xf7, 0xf1, 0xd6, 0xce, 0xf7, 0x2, 0x1,\n                                                       0xf8, 0xce, 0xf7, 0x4c, 0x26, 0xa, 0xf7, 0x69,\n                                                       0xfb, 0x2, 0x15, 0xda, 0x9d, 0x5, 0x61, 0x87,\n                                                       0xa5, 0x66, 0xb9, 0x1b, 0xd0, 0x9b, 0xc8, 0xc5,\n                                                       0xbb, 0x74, 0xb4, 0x54, 0x5a, 0x77, 0x6e, 0x61,\n                                                       0x84, 0x1f, 0x44, 0xf7, 0xaf, 0xf7, 0xbf, 0x48,\n                                                       0xfb, 0x70, 0x2d, 0x6, 0x97, 0xa4, 0xa2, 0x92,\n                                                       0xa7, 0x1b, 0xef, 0xc7, 0x44, 0x2a, 0x27, 0x42,\n                                                       0x3a, 0x26, 0x3c, 0x49, 0xbd, 0xdd, 0x88, 0x1f,\n                                                       0xe, 0x7d, 0xf7, 0xa, 0xd1, 0xf7, 0x4e, 0xce,\n                                                       0xf5, 0xd0, 0xf2, 0x1, 0xae, 0xf7, 0x4c, 0xe5,\n                                                       0xf7, 0x2e, 0x26, 0xa, 0xf7, 0xa0, 0xb9, 0x15,\n                                                       0xa4, 0xa9, 0xa7, 0x95, 0xb2, 0x1b, 0xe4, 0xc4,\n                                                       0x47, 0x34, 0x31, 0x4d, 0x3d, 0x2d, 0xfb, 0x20,\n                                                       0x6c, 0xf7, 0x1a, 0xf7, 0x5, 0xf7, 0x4, 0xb2,\n                                                       0xf7, 0x1f, 0xf7, 0x1e, 0xd7, 0xbf, 0x61, 0x40,\n                                                       0x95, 0x1f, 0x3f, 0x76, 0x5, 0xb0, 0x81, 0x86,\n                                                       0xab, 0x5a, 0x1b, 0x45, 0x78, 0x36, 0x53, 0x89,\n                                                       0x1f, 0x91, 0xfb, 0xc, 0x15, 0x58, 0xa5, 0x5c,\n                                                       0xc5, 0xc2, 0x9a, 0xb9, 0xb8, 0xbb, 0x79, 0xba,\n                                                       0x51, 0x59, 0x6f, 0x5f, 0x5f, 0x1e, 0xe, 0x7d,\n                                                       0x72, 0xa, 0x1, 0xf7, 0x73, 0xf7, 0xe8, 0x26,\n                                                       0xa, 0xf7, 0x9a, 0x6b, 0xa, 0xa2, 0xf7, 0x2c,\n                                                       0xc1, 0xf7, 0x21, 0xed, 0xf7, 0xf, 0x8, 0xfb,\n                                                       0x8d, 0xcf, 0xf7, 0xe8, 0x4d, 0x6, 0x32, 0xfb,\n                                                       0x17, 0x3d, 0xfb, 0x18, 0x73, 0xfb, 0x33, 0x8,\n                                                       0xe, 0x7d, 0xf7, 0xa, 0xd0, 0xf7, 0x2a, 0xda,\n                                                       0xf7, 0x16, 0xd0, 0xf3, 0x12, 0xae, 0xf7, 0x59,\n                                                       0xde, 0xf7, 0x33, 0xfb, 0x24, 0xf7, 0x1c, 0xe6,\n                                                       0xf7, 0x59, 0x13, 0xfb, 0x23, 0xa, 0xf7, 0xab,\n                                                       0xa0, 0x15, 0x64, 0x9c, 0x72, 0xb5, 0xb4, 0x1a,\n                                                       0xdf, 0xd4, 0xbd, 0xd9, 0xd7, 0xd0, 0x56, 0x3a,\n                                                       0x5b, 0x76, 0x6a, 0x5e, 0x78, 0x1e, 0xbe, 0x6f,\n                                                       0xa5, 0x6d, 0x4d, 0x1a, 0x34, 0x3d, 0x53, 0x38,\n                                                       0x33, 0x3f, 0xbc, 0xe9, 0xc1, 0xaa, 0xbb, 0xbe,\n                                                       0x9d, 0x1e, 0x9b, 0xef, 0x15, 0x62, 0xa2, 0x73,\n                                                       0xb7, 0xb9, 0xa2, 0xa1, 0xb6, 0xb5, 0x75, 0xa2,\n                                                       0x5e, 0x5b, 0x76, 0x75, 0x60, 0x1e, 0x13, 0xfd,\n                                                       0x7c, 0xfb, 0x70, 0x15, 0x5c, 0xaa, 0x70, 0xbc,\n                                                       0xc0, 0xa5, 0xa4, 0xbc, 0xbb, 0x6f, 0xa7, 0x5a,\n                                                       0x56, 0x6e, 0x72, 0x58, 0x1e, 0xe, 0x7d, 0xf7,\n                                                       0xa, 0xd1, 0xf6, 0xcf, 0xf7, 0x4d, 0xce, 0xf3,\n                                                       0x1, 0xae, 0xf7, 0x57, 0xdf, 0xf7, 0x32, 0xe0,\n                                                       0xf7, 0x59, 0x26, 0xa, 0xf7, 0x6a, 0xfb, 0x14,\n                                                       0x15, 0xd7, 0x99, 0x5, 0x6c, 0x90, 0x9b, 0x70,\n                                                       0xaf, 0x1b, 0xd4, 0x99, 0xe0, 0xc2, 0x8e, 0x1f,\n                                                       0x73, 0x72, 0x67, 0x82, 0x68, 0x1b, 0x30, 0x54,\n                                                       0xce, 0xe3, 0xe7, 0xcc, 0xd4, 0xea, 0xf7, 0x18,\n                                                       0xae, 0xfb, 0xe, 0xfb, 0x3, 0x58, 0x86, 0x3b,\n                                                       0x72, 0x5e, 0x1f, 0x52, 0x6c, 0x54, 0x6c, 0x4b,\n                                                       0x1b, 0x45, 0x57, 0xb7, 0xd1, 0x85, 0x1f, 0xcc,\n                                                       0xf7, 0x68, 0x15, 0x5c, 0xa3, 0x69, 0xbe, 0xc3,\n                                                       0xa1, 0xb4, 0xbc, 0xbc, 0x71, 0xb9, 0x53, 0x4e,\n                                                       0x81, 0x51, 0x5d, 0x1e, 0xe, 0x7d, 0xf7, 0x9,\n                                                       0xfb, 0x9, 0x72, 0xa, 0x23, 0xf3, 0x12, 0xae,\n                                                       0xf7, 0x4f, 0xf7, 0x53, 0xf7, 0x29, 0xdf, 0xf7,\n                                                       0x0, 0x13, 0x6e, 0xf7, 0x72, 0xf7, 0x3, 0x15,\n                                                       0xf7, 0xf6, 0x39, 0xad, 0x7, 0xc1, 0x8a, 0xad,\n                                                       0xb0, 0x90, 0xc7, 0x8, 0xd9, 0xfc, 0x78, 0x6,\n                                                       0xfb, 0xa8, 0xf7, 0x7f, 0x15, 0x2c, 0xa, 0xf7,\n                                                       0xbb, 0x97, 0x15, 0x13, 0x9e, 0xf7, 0x2, 0x9d,\n                                                       0xf7, 0x19, 0xf7, 0x21, 0xf7, 0x1a, 0xa2, 0xfb,\n                                                       0x1d, 0x21, 0xfb, 0x2, 0x7a, 0xfb, 0x25, 0xfb,\n                                                       0x20, 0xfb, 0xe, 0x66, 0xf7, 0x33, 0xeb, 0x1e,\n                                                       0xde, 0x16, 0x59, 0x8e, 0xfb, 0x26, 0xd4, 0xce,\n                                                       0x91, 0xf7, 0x2a, 0xb9, 0xbf, 0x8c, 0xf7, 0x1c,\n                                                       0x41, 0x46, 0x84, 0xfb, 0x1f, 0x5a, 0x1e, 0xe,\n                                                       0xe9, 0xf7, 0x89, 0xd0, 0x49, 0xf7, 0xb, 0x6c,\n                                                       0xce, 0x7c, 0xaa, 0x1, 0xa2, 0xf7, 0x8c, 0x15,\n                                                       0xf8, 0xf5, 0x6, 0xf7, 0x7a, 0xe0, 0x5, 0x9a,\n                                                       0x7, 0xfb, 0x8a, 0xd2, 0x5, 0xfc, 0xe5, 0x6c,\n                                                       0xf8, 0xe8, 0x6, 0x78, 0x76, 0x5, 0xfc, 0xd5,\n                                                       0x7c, 0xf8, 0xd3, 0x6, 0x9a, 0x68, 0x5, 0xfc,\n                                                       0xe2, 0x6, 0xf8, 0xe8, 0x77, 0x15, 0x92, 0xa2,\n                                                       0x7a, 0xb2, 0xa0, 0xa4, 0xf7, 0x27, 0x65, 0x5,\n                                                       0x7e, 0x7, 0xe, 0xc2, 0xa3, 0x76, 0xf7, 0xb9,\n                                                       0xe2, 0xf7, 0xba, 0x77, 0x1, 0xc1, 0xf9, 0xb9,\n                                                       0x3, 0xc1, 0xf7, 0xb5, 0x15, 0xf7, 0xc4, 0x9a,\n                                                       0x5, 0xfb, 0xc0, 0x7, 0x8d, 0x8a, 0xf8, 0x87,\n                                                       0xf7, 0xe4, 0x75, 0xa, 0xfc, 0x87, 0xf7, 0xe4,\n                                                       0x89, 0x8a, 0x5, 0xfb, 0xc0, 0x7, 0xfb, 0xc4,\n                                                       0x9a, 0x5, 0xe, 0x8a, 0xf7, 0x41, 0x76, 0xf7,\n                                                       0x4b, 0xa2, 0xf7, 0x4a, 0x54, 0xa, 0xf7, 0xe3,\n                                                       0x15, 0xf8, 0xbe, 0x6, 0x61, 0x57, 0x65, 0x4d,\n                                                       0x8e, 0x46, 0xca, 0xe2, 0xf7, 0x12, 0xd1, 0xf1,\n                                                       0xb0, 0x25, 0xb0, 0xfb, 0x10, 0xd1, 0x4a, 0xe2,\n                                                       0x8a, 0x4c, 0xab, 0x3e, 0xb9, 0x61, 0x8, 0xfc,\n                                                       0xbe, 0x6, 0xe, 0x49, 0xa, 0xf7, 0xba, 0xfb,\n                                                       0x8c, 0x5, 0xfb, 0x4b, 0xfb, 0x44, 0x15, 0xf7,\n                                                       0x78, 0xf7, 0x44, 0x5, 0xf8, 0x39, 0x6, 0xe,\n                                                       0xf7, 0x45, 0xf7, 0x41, 0x76, 0xf7, 0x4b, 0xa2,\n                                                       0xf7, 0x4a, 0x77, 0x1, 0xad, 0x4d, 0xa, 0xf2,\n                                                       0x65, 0xed, 0x45, 0xcc, 0x35, 0x8c, 0xca, 0x6b,\n                                                       0xd6, 0x5d, 0xb8, 0x8, 0xf8, 0xce, 0x6, 0x61,\n                                                       0x57, 0x64, 0x4d, 0x8f, 0x46, 0xca, 0xe2, 0xf0,\n                                                       0xd1, 0xf0, 0xb0, 0x25, 0xaf, 0x29, 0xd2, 0x4a,\n                                                       0xe2, 0x8a, 0x4c, 0xaa, 0x3d, 0xba, 0x62, 0x8,\n                                                       0xfc, 0xce, 0x6, 0xb5, 0xbd, 0xb1, 0xc9, 0x88,\n                                                       0xd1, 0x4c, 0x33, 0x26, 0x45, 0x25, 0x67, 0x8,\n                                                       0xe, 0xfc, 0x11, 0x23, 0x76, 0xfa, 0x45, 0x77,\n                                                       0x1, 0xf7, 0x6d, 0xa2, 0x3, 0xae, 0xf7, 0x1e,\n                                                       0x15, 0xe2, 0x4c, 0xd1, 0x28, 0xb0, 0x26, 0xaf,\n                                                       0xf1, 0xd2, 0xeb, 0xe1, 0xcc, 0x4d, 0x8c, 0x3d,\n                                                       0x6c, 0x61, 0x5c, 0x8, 0xf8, 0xce, 0x7, 0xbe,\n                                                       0x61, 0xc9, 0x65, 0xd0, 0x8e, 0x34, 0xca, 0x45,\n                                                       0xf0, 0x67, 0xf1, 0x65, 0x24, 0x45, 0x29, 0x35,\n                                                       0x4a, 0xca, 0x8a, 0xd6, 0xab, 0xb7, 0xb9, 0x8,\n                                                       0xfc, 0xce, 0x7, 0x58, 0xb5, 0x4d, 0xb2, 0x46,\n                                                       0x87, 0x8, 0xe, 0xe0, 0xcb, 0x76, 0xf7, 0x97,\n                                                       0xd5, 0xf7, 0x98, 0x77, 0x1, 0xc3, 0xf9, 0xcc,\n                                                       0x3, 0xc3, 0xf7, 0xbc, 0x15, 0xf8, 0x12, 0x98,\n                                                       0x5, 0xfb, 0x9d, 0x7, 0x8c, 0x8a, 0xf8, 0x4d,\n                                                       0xf7, 0xbc, 0x75, 0xa, 0xfc, 0x4d, 0xf7, 0xbb,\n                                                       0x8a, 0x8a, 0x5, 0xfb, 0x9d, 0x7, 0xfc, 0x12,\n                                                       0x98, 0x5, 0xe, 0xda, 0xf7, 0xdb, 0xa5, 0x71,\n                                                       0xa6, 0x7f, 0x94, 0x12, 0x9f, 0xfa, 0x3, 0x13,\n                                                       0x90, 0xc3, 0xf7, 0xd9, 0x15, 0xf9, 0x1c, 0x8f,\n                                                       0x3c, 0x7a, 0xfb, 0x0, 0x57, 0x75, 0x58, 0x19,\n                                                       0x7d, 0x85, 0x8c, 0x82, 0x8f, 0x1b, 0x8d, 0x8f,\n                                                       0x8e, 0x8e, 0x8d, 0x1f, 0xca, 0xe0, 0xf7, 0x5a,\n                                                       0xb4, 0xf3, 0x9a, 0x8, 0x8d, 0x8c, 0x8c, 0x8d,\n                                                       0x8c, 0x1f, 0x13, 0x30, 0x8e, 0x8d, 0x8e, 0x8e,\n                                                       0x95, 0x1b, 0x92, 0x8c, 0x94, 0x8e, 0x8e, 0x1a,\n                                                       0x8c, 0x88, 0x8c, 0x88, 0x1e, 0xfb, 0x19, 0x95,\n                                                       0xfb, 0x2f, 0xb1, 0x46, 0xe6, 0x8, 0x8d, 0x89,\n                                                       0x89, 0x8e, 0x8a, 0x1b, 0x89, 0x8d, 0x81, 0x80,\n                                                       0x8f, 0x1f, 0xa2, 0x53, 0xdd, 0x67, 0xd7, 0x6d,\n                                                       0x8, 0x13, 0x50, 0xfc, 0xf7, 0x8d, 0x5, 0x70,\n                                                       0x66, 0x94, 0x8d, 0x78, 0x1f, 0x88, 0x8c, 0x87,\n                                                       0x89, 0x88, 0x1a, 0x88, 0x8e, 0x88, 0x90, 0x86,\n                                                       0x1e, 0x90, 0x86, 0x95, 0x7e, 0x9a, 0x84, 0x8,\n                                                       0xe, 0xe3, 0xc0, 0x76, 0xf7, 0x7c, 0xf7, 0x38,\n                                                       0xf7, 0x7c, 0x77, 0x12, 0xae, 0xf9, 0xed, 0x17,\n                                                       0xf8, 0xda, 0xf7, 0x9c, 0x15, 0x4d, 0x4d, 0x5,\n                                                       0x76, 0x74, 0x7d, 0x74, 0x6a, 0x1a, 0x57, 0xb3,\n                                                       0x64, 0xbe, 0xaf, 0xa4, 0xa3, 0xa4, 0xa0, 0x1e,\n                                                       0x13, 0x30, 0xf7, 0x7e, 0xf7, 0x9d, 0xfb, 0x81,\n                                                       0xf7, 0xa1, 0x5, 0xa3, 0x77, 0x72, 0xa0, 0x6a,\n                                                       0x1b, 0x13, 0x50, 0x56, 0x64, 0x61, 0x56, 0x6f,\n                                                       0xa1, 0x70, 0x9e, 0x78, 0x1f, 0xc3, 0x4c, 0x5,\n                                                       0xfc, 0x48, 0x6, 0x51, 0x56, 0x7a, 0x4a, 0x47,\n                                                       0xbf, 0x7d, 0xc6, 0x1f, 0xe, 0xe4, 0xf7, 0x2a,\n                                                       0x76, 0xf7, 0x5c, 0xac, 0xf7, 0x5c, 0x54, 0xa,\n                                                       0xf9, 0xec, 0x3, 0xae, 0xf7, 0xdd, 0x15, 0xf8,\n                                                       0xff, 0xfb, 0x5c, 0x6, 0xf7, 0x81, 0xf7, 0x6d,\n                                                       0xfb, 0x81, 0xf7, 0x6c, 0x5, 0xfb, 0x5c, 0xfc,\n                                                       0xff, 0x7, 0xe, 0xe4, 0xf7, 0x29, 0x76, 0xf7,\n                                                       0x34, 0xf7, 0x8, 0xf7, 0x33, 0x54, 0xa, 0xf9,\n                                                       0xee, 0x3, 0xae, 0xf7, 0xb4, 0x15, 0xf8, 0xff,\n                                                       0xfb, 0x34, 0x6, 0xf7, 0x83, 0xf7, 0x6e, 0xfb,\n                                                       0x83, 0xf7, 0x6d, 0x5, 0xfb, 0x33, 0xfc, 0xff,\n                                                       0x7, 0xe, 0xf5, 0x43, 0x76, 0xf9, 0xd6, 0x77,\n                                                       0x1, 0x34, 0xa, 0xfc, 0x7d, 0xfc, 0xc3, 0x15,\n                                                       0xb5, 0x64, 0xf7, 0xc, 0xd6, 0xf7, 0x25, 0xaf,\n                                                       0xf7, 0x1f, 0x99, 0x19, 0xbc, 0xf7, 0x58, 0xcb,\n                                                       0xd9, 0xf7, 0x11, 0xf7, 0x2e, 0x8, 0x8e, 0x94,\n                                                       0x8d, 0x93, 0x94, 0x1a, 0xb6, 0x61, 0xb8, 0x5d,\n                                                       0x7b, 0x7b, 0x86, 0x7e, 0x7b, 0x1e, 0xfb, 0x19,\n                                                       0xfb, 0x1e, 0x21, 0x36, 0xfb, 0x32, 0xfb, 0x0,\n                                                       0x6a, 0x31, 0x4d, 0xfb, 0x7, 0x4e, 0x41, 0x8,\n                                                       0xb1, 0x95, 0x15, 0xa3, 0xa9, 0xa7, 0xb3, 0x9b,\n                                                       0xa8, 0xa7, 0xbd, 0xa4, 0xbe, 0x9e, 0xbf, 0xe0,\n                                                       0xc5, 0xde, 0xc8, 0xd8, 0xce, 0xbe, 0xb7, 0xba,\n                                                       0xba, 0xba, 0xbb, 0x8, 0x95, 0x95, 0x8f, 0x90,\n                                                       0x9b, 0x1b, 0xa9, 0xad, 0x6d, 0x6d, 0x81, 0x87,\n                                                       0x85, 0x86, 0x84, 0x1f, 0x72, 0x6b, 0x70, 0x6b,\n                                                       0x73, 0x6a, 0x3d, 0x24, 0x61, 0x38, 0x6a, 0xfb,\n                                                       0x11, 0xfb, 0x0, 0x7f, 0xfb, 0xa, 0x6e, 0x26,\n                                                       0x5b, 0x7b, 0x84, 0x78, 0x80, 0x81, 0x84, 0x8a,\n                                                       0x8c, 0x18, 0xf7, 0x21, 0xf7, 0x2a, 0x5, 0xa8,\n                                                       0xab, 0xae, 0xa7, 0x92, 0x84, 0x93, 0x83, 0x6e,\n                                                       0x65, 0x68, 0x6d, 0x90, 0x1f, 0xfb, 0x1d, 0xfb,\n                                                       0x2c, 0x5, 0xe, 0x86, 0xf7, 0x44, 0x76, 0xf2,\n                                                       0xf7, 0x44, 0xf2, 0x54, 0xa, 0xa4, 0xcb, 0xba,\n                                                       0xaf, 0xd9, 0x3, 0xf7, 0xca, 0xf7, 0x96, 0x15,\n                                                       0xf7, 0x99, 0x24, 0x6, 0xf7, 0x78, 0xf7, 0x53,\n                                                       0xfb, 0x78, 0xf7, 0x53, 0x5, 0x24, 0xfb, 0x99,\n                                                       0x7, 0x24, 0xfb, 0x44, 0x15, 0xd9, 0xf7, 0x44,\n                                                       0x3d, 0x6, 0x38, 0xfb, 0x44, 0x15, 0xba, 0xf7,\n                                                       0x44, 0x5c, 0x6, 0x32, 0xfb, 0x44, 0x15, 0xa4,\n                                                       0xf7, 0x44, 0x72, 0x6, 0xe, 0xad, 0xf7, 0x6,\n                                                       0x76, 0xf8, 0x8e, 0x54, 0xa, 0xa2, 0xd3, 0xab,\n                                                       0xc6, 0xbe, 0xb1, 0xd5, 0x3, 0xf8, 0x2c, 0xf7,\n                                                       0x5b, 0x15, 0xf7, 0x3a, 0x21, 0x92, 0x6, 0xb7,\n                                                       0xf7, 0xb, 0xf4, 0xe3, 0xf7, 0x0, 0xb9, 0xfb,\n                                                       0x2, 0xba, 0xfb, 0x0, 0xe6, 0x64, 0xf7, 0x7,\n                                                       0x8, 0x84, 0x21, 0xfb, 0x3a, 0x6, 0x29, 0xfb,\n                                                       0xba, 0x15, 0xd5, 0xf7, 0xba, 0x41, 0x6, 0x32,\n                                                       0xfb, 0xba, 0x15, 0xbe, 0xf7, 0xba, 0x58, 0x6,\n                                                       0x30, 0xfb, 0xba, 0x15, 0xab, 0xf7, 0xba, 0x6b,\n                                                       0x6, 0x2c, 0xfb, 0xba, 0x15, 0xa2, 0xf7, 0xba,\n                                                       0x74, 0x6, 0xe, 0x80, 0xf7, 0x11, 0x76, 0xf8,\n                                                       0x78, 0x54, 0xa, 0xf9, 0x88, 0x3, 0xae, 0xf7,\n                                                       0x5d, 0x15, 0xf8, 0x8b, 0x2a, 0x6, 0xf7, 0x91,\n                                                       0xf7, 0x86, 0xfb, 0x91, 0xf7, 0x86, 0x5, 0x2a,\n                                                       0xfc, 0x8b, 0x7, 0xe, 0x49, 0xa, 0xf7, 0xbc,\n                                                       0xfb, 0x8c, 0x5, 0xb8, 0x16, 0xfb, 0x70, 0xf7,\n                                                       0x44, 0xf9, 0x13, 0xfb, 0x44, 0x5, 0xe, 0xd9,\n                                                       0x3d, 0xa, 0xf9, 0xe3, 0x7a, 0xa, 0xf9, 0xe3,\n                                                       0xf7, 0xee, 0xfd, 0xe3, 0xf7, 0xee, 0xf7, 0x67,\n                                                       0xfb, 0xee, 0x5, 0xe, 0xe6, 0xf4, 0x76, 0xf7,\n                                                       0xaf, 0xd8, 0xf7, 0x38, 0x54, 0xa, 0xb3, 0x3,\n                                                       0xf8, 0xb5, 0xdf, 0x15, 0x76, 0xa, 0x23, 0xfb,\n                                                       0xcb, 0x7, 0x25, 0x8a, 0x52, 0xa8, 0xf7, 0x1c,\n                                                       0x1a, 0x63, 0xfb, 0x85, 0x6, 0x8c, 0x4e, 0x8b,\n                                                       0x6f, 0xb8, 0x5c, 0x8, 0x62, 0xb1, 0xb9, 0x87,\n                                                       0xc0, 0x1b, 0xf7, 0xdb, 0x6, 0xe, 0xe7, 0xf4,\n                                                       0x76, 0xf7, 0x37, 0xf7, 0x97, 0xf1, 0x54, 0xa,\n                                                       0xb3, 0x3, 0xae, 0xdf, 0x15, 0xb3, 0x6, 0xf7,\n                                                       0x1c, 0xc5, 0xa7, 0xf1, 0x8a, 0x1e, 0xf7, 0xca,\n                                                       0x24, 0x6, 0x76, 0xa, 0x25, 0xfb, 0xdb, 0x7,\n                                                       0x56, 0x5e, 0x86, 0x62, 0x64, 0x1f, 0x5f, 0x5d,\n                                                       0x8a, 0x6e, 0x8a, 0x4f, 0x8, 0xe, 0xfc, 0xc,\n                                                       0x3d, 0x76, 0xfa, 0xe, 0x54, 0xa, 0xf8, 0x1e,\n                                                       0x3, 0xae, 0xc2, 0x15, 0xf7, 0x14, 0xfb, 0x2e,\n                                                       0x6, 0xf7, 0x9e, 0xf8, 0x51, 0xfb, 0x9e, 0xf8,\n                                                       0x51, 0x5, 0xfb, 0x2e, 0xfb, 0x14, 0x7, 0xe,\n                                                       0xb7, 0xe7, 0x76, 0xf8, 0xbc, 0x77, 0x1, 0xf8,\n                                                       0x42, 0x96, 0x3, 0xae, 0xf7, 0x38, 0x15, 0xf8,\n                                                       0x1f, 0x2e, 0x96, 0x6, 0xae, 0xd2, 0xf7, 0x7e,\n                                                       0xf7, 0x71, 0xf7, 0x1e, 0x77, 0x8, 0x94, 0x7,\n                                                       0xfb, 0x3d, 0x9f, 0xfb, 0x29, 0xf6, 0x32, 0xf7,\n                                                       0x24, 0x8, 0x80, 0x2d, 0xfc, 0x1f, 0x6, 0xe,\n                                                       0x88, 0xb7, 0xa0, 0x76, 0x6c, 0xa, 0x76, 0xa0,\n                                                       0x12, 0xae, 0xa5, 0xf7, 0xe4, 0xa5, 0x13, 0xb7,\n                                                       0xae, 0xf7, 0x5d, 0x15, 0xf7, 0xfe, 0x6, 0x13,\n                                                       0x4b, 0xfb, 0x31, 0xf7, 0x28, 0x7, 0xf7, 0x95,\n                                                       0xf7, 0xc2, 0xfb, 0x95, 0xf7, 0xc2, 0x5, 0xfb,\n                                                       0x28, 0x6, 0x13, 0xb7, 0xfb, 0x31, 0xfb, 0xfe,\n                                                       0x7, 0xa5, 0xfb, 0x9d, 0x15, 0xf7, 0x84, 0xf7,\n                                                       0xfe, 0xf7, 0x35, 0x7, 0xf7, 0x8e, 0xfb, 0xad,\n                                                       0xfb, 0x8e, 0x7d, 0xa, 0xf7, 0x1b, 0x50, 0x76,\n                                                       0xf8, 0x57, 0xf7, 0x47, 0x8b, 0xb3, 0x8b, 0xa0,\n                                                       0xf7, 0x16, 0x77, 0x1, 0xc6, 0xf9, 0xde, 0x3,\n                                                       0x34, 0xa, 0xfc, 0x6f, 0xfc, 0xc1, 0x15, 0x96,\n                                                       0x83, 0xf7, 0x2b, 0xf7, 0x3b, 0x5, 0xa9, 0x86,\n                                                       0xb1, 0xae, 0xa8, 0x1b, 0x93, 0x92, 0x83, 0x84,\n                                                       0x6f, 0x6b, 0x68, 0x6e, 0x1f, 0xfb, 0x30, 0xfb,\n                                                       0x3a, 0x93, 0x83, 0xf7, 0x6, 0xd2, 0xf7, 0x2b,\n                                                       0xb0, 0xf7, 0x15, 0x99, 0x19, 0xb8, 0xf7, 0x4a,\n                                                       0xca, 0xdd, 0xf7, 0x9, 0xf7, 0x24, 0x8, 0x89,\n                                                       0x6, 0xbd, 0x91, 0x6f, 0xbd, 0x52, 0x1b, 0x83,\n                                                       0x83, 0x89, 0x8a, 0x83, 0x1f, 0x6b, 0x69, 0xfb,\n                                                       0x1, 0xfb, 0x5, 0xfb, 0x10, 0x2e, 0xfb, 0x15,\n                                                       0x33, 0x19, 0x6f, 0x3e, 0x4c, 0xfb, 0xf, 0x50,\n                                                       0x44, 0x8, 0xe, 0xa7, 0x90, 0xf9, 0x4e, 0x1,\n                                                       0xc5, 0xf9, 0x73, 0x3, 0xf3, 0xf7, 0xbe, 0x15,\n                                                       0xbc, 0xf7, 0x44, 0xf7, 0x8f, 0x64, 0x5, 0x8b,\n                                                       0xc8, 0xf7, 0x51, 0x88, 0x1a, 0x88, 0x8a, 0xf7,\n                                                       0xa7, 0xfb, 0x86, 0x8b, 0x1a, 0x88, 0x7, 0x8e,\n                                                       0xfc, 0x28, 0xfb, 0x75, 0x8b, 0x1e, 0x8a, 0xb9,\n                                                       0xf7, 0x48, 0x8b, 0x1e, 0xfb, 0xd5, 0xfb, 0x16,\n                                                       0x15, 0xf7, 0x92, 0xb4, 0x6b, 0xfb, 0x16, 0x88,\n                                                       0xfb, 0x0, 0xf8, 0x98, 0xf7, 0xad, 0x5, 0xf5,\n                                                       0x7, 0xfb, 0xee, 0xf7, 0xcb, 0x44, 0xfb, 0x6e,\n                                                       0xfb, 0x91, 0xb2, 0x4d, 0xfb, 0x76, 0x5, 0xe,\n                                                       0xfb, 0x23, 0xcc, 0x76, 0xe4, 0xe4, 0xf7, 0xb8,\n                                                       0xa8, 0xf4, 0x54, 0xa, 0xa7, 0xf7, 0x78, 0xa5,\n                                                       0x3, 0xf7, 0xd, 0xf7, 0x19, 0x15, 0xf7, 0x3e,\n                                                       0x71, 0x6, 0xd7, 0x4c, 0xf7, 0xba, 0xf7, 0xb0,\n                                                       0xfc, 0x6, 0xf7, 0xd4, 0x5, 0x22, 0xfb, 0x94,\n                                                       0xfb, 0xe6, 0x7, 0xa7, 0x9c, 0x15, 0xf7, 0xb8,\n                                                       0xf7, 0x92, 0xd6, 0x7, 0xf7, 0x96, 0xfb, 0x72,\n                                                       0xfb, 0x96, 0xfb, 0x88, 0x5, 0xee, 0x7, 0xe,\n                                                       0xae, 0xed, 0x76, 0xeb, 0xcf, 0xf7, 0x99, 0xa5,\n                                                       0xe6, 0x77, 0x1, 0xf8, 0xb6, 0xa3, 0x3, 0xf3,\n                                                       0xf7, 0x41, 0x15, 0xf8, 0x4e, 0x66, 0x6, 0xc9,\n                                                       0x50, 0xf7, 0x7c, 0xf7, 0x8a, 0xfb, 0xba, 0xf7,\n                                                       0xbc, 0x5, 0x30, 0xfc, 0x91, 0x7, 0xd8, 0xfb,\n                                                       0x31, 0x3c, 0xfb, 0x16, 0x5, 0xa7, 0x16, 0xd9,\n                                                       0xf7, 0x16, 0x4b, 0xf7, 0x17, 0x5, 0xf8, 0x81,\n                                                       0xc7, 0x6, 0xf7, 0x4e, 0xfb, 0x53, 0xfb, 0x4e,\n                                                       0xfb, 0x4b, 0x5, 0xc0, 0x7, 0xe, 0x3c, 0x9c,\n                                                       0x76, 0xf9, 0x43, 0x77, 0x1, 0xb6, 0xf7, 0x3c,\n                                                       0x3, 0xb6, 0xf7, 0xe8, 0x15, 0xfb, 0x52, 0xf7,\n                                                       0x2b, 0xfb, 0x2e, 0xf7, 0x4e, 0xf7, 0x4e, 0xf7,\n                                                       0x2b, 0xf7, 0x2e, 0xf7, 0x52, 0xf7, 0x52, 0xfb,\n                                                       0x2b, 0xf7, 0x2d, 0xfb, 0x4e, 0xfb, 0x4e, 0xfb,\n                                                       0x2b, 0xfb, 0x2d, 0xfb, 0x52, 0x1e, 0xf7, 0x3c,\n                                                       0xfb, 0xb4, 0x15, 0xf8, 0xd4, 0x7, 0x8c, 0x8c,\n                                                       0xf8, 0x87, 0xfb, 0xb4, 0x80, 0xa, 0xfc, 0x87,\n                                                       0xfb, 0xb4, 0x5, 0xe, 0xf6, 0xf7, 0xb, 0x76,\n                                                       0xf7, 0xd, 0xad, 0xd2, 0xab, 0xd2, 0xad, 0xf7,\n                                                       0xd, 0x77, 0x1, 0xf9, 0x3a, 0xac, 0x3, 0xb2,\n                                                       0xf7, 0x6f, 0x15, 0xf7, 0xed, 0x6, 0xec, 0xf4,\n                                                       0x5, 0xf7, 0x59, 0xfb, 0x76, 0x6, 0xf7, 0x7d,\n                                                       0xf7, 0x86, 0xfb, 0x7d, 0xf7, 0x86, 0x5, 0xfb,\n                                                       0x76, 0xfb, 0x59, 0x7, 0x2a, 0xf4, 0x5, 0xfb,\n                                                       0xed, 0x6, 0xf7, 0x6, 0xfb, 0xd, 0x5, 0xf8,\n                                                       0xc2, 0xfb, 0x3b, 0x15, 0xf7, 0xe2, 0x7, 0xf7,\n                                                       0x32, 0xfb, 0x3b, 0x5, 0xfd, 0x8b, 0x34, 0x15,\n                                                       0xdf, 0xe2, 0x37, 0xe2, 0x5, 0xf7, 0x9f, 0x6,\n                                                       0xda, 0x34, 0x3c, 0x34, 0x5, 0xe, 0xa5, 0xf8,\n                                                       0x87, 0xf7, 0xda, 0x15, 0xf7, 0x2d, 0x6, 0x71,\n                                                       0x69, 0x8b, 0x5c, 0xaa, 0x6a, 0xb3, 0xc7, 0xce,\n                                                       0xb4, 0xcd, 0xb2, 0x48, 0xa6, 0x49, 0xb3, 0x63,\n                                                       0xc8, 0x69, 0x6e, 0x8e, 0x54, 0xa5, 0x6d, 0x8,\n                                                       0xfb, 0x2d, 0x6, 0xfc, 0x64, 0xfb, 0x33, 0x15,\n                                                       0xf7, 0xe8, 0x6, 0xf7, 0xb, 0xf7, 0xb, 0x5,\n                                                       0xfb, 0xe6, 0x6, 0xb3, 0x4, 0xf7, 0xe6, 0x6,\n                                                       0x90, 0xfb, 0x11, 0xf7, 0x7, 0x8b, 0x1f, 0xfb,\n                                                       0xe7, 0x6, 0xe, 0xf7, 0x14, 0xf7, 0x25, 0x76,\n                                                       0xf7, 0x61, 0xad, 0xf7, 0x61, 0x77, 0x1, 0xf7,\n                                                       0x4a, 0xf8, 0x73, 0x3, 0xae, 0xf7, 0x23, 0x15,\n                                                       0xf7, 0xe6, 0x6, 0x91, 0xc0, 0xa0, 0xd2, 0xb6,\n                                                       0xaa, 0x8, 0xa9, 0xb5, 0xd8, 0x8c, 0xbd, 0x1b,\n                                                       0xe7, 0x6, 0x56, 0x53, 0x88, 0x31, 0x98, 0x50,\n                                                       0xd5, 0xe6, 0xe2, 0xe2, 0xf7, 0x2, 0xb7, 0xfb,\n                                                       0x2, 0xb9, 0x30, 0xdd, 0x45, 0xe9, 0x7e, 0x64,\n                                                       0x90, 0xfb, 0x7, 0xbe, 0x58, 0x8, 0x2f, 0x6,\n                                                       0x4f, 0x4e, 0x8b, 0xb5, 0x5b, 0x1f, 0x65, 0xab,\n                                                       0x70, 0xc8, 0x86, 0xbe, 0x8, 0xfb, 0xe6, 0x6,\n                                                       0x97, 0x30, 0xbb, 0x3d, 0xe2, 0x69, 0x35, 0x6c,\n                                                       0x56, 0x37, 0x83, 0x33, 0x8, 0xe, 0x83, 0xf7,\n                                                       0xb, 0x76, 0xf7, 0x64, 0xd3, 0x5b, 0xa1, 0xf7,\n                                                       0x7c, 0x77, 0x12, 0xa3, 0xf9, 0xa3, 0x13, 0xb8,\n                                                       0xf9, 0x7e, 0xf7, 0xde, 0x15, 0x60, 0x71, 0xfb,\n                                                       0x6, 0x45, 0x45, 0x62, 0x8, 0x63, 0x74, 0x83,\n                                                       0x7b, 0x75, 0x1a, 0x72, 0xa3, 0x82, 0x95, 0x9e,\n                                                       0x93, 0x94, 0xa7, 0xa5, 0x1e, 0xcd, 0xd1, 0xf4,\n                                                       0xe9, 0xd9, 0xb6, 0x8, 0x89, 0x7, 0x8d, 0x7,\n                                                       0x3b, 0xb6, 0x23, 0xe6, 0x49, 0xd2, 0x8, 0xa7,\n                                                       0x71, 0x82, 0x94, 0x78, 0x1b, 0x81, 0x75, 0x82,\n                                                       0x72, 0x75, 0x94, 0x7b, 0xb3, 0x74, 0x1f, 0xd1,\n                                                       0x63, 0xf7, 0x7, 0x44, 0xb4, 0x71, 0x8, 0x13,\n                                                       0xd8, 0xfb, 0xaf, 0xfb, 0xb5, 0xa5, 0x2f, 0x1b,\n                                                       0x64, 0x78, 0x7d, 0x74, 0x72, 0xa0, 0x81, 0xb1,\n                                                       0x1f, 0x13, 0xb8, 0xea, 0xf7, 0xbc, 0xa3, 0xf7,\n                                                       0xa4, 0x1b, 0xe, 0xad, 0xdc, 0x76, 0xf7, 0x9f,\n                                                       0xa3, 0xf7, 0xa5, 0x77, 0x1, 0xf9, 0xab, 0xf7,\n                                                       0xdb, 0x15, 0x5e, 0x71, 0xfb, 0x7, 0x55, 0x35,\n                                                       0x71, 0x8, 0x4d, 0x78, 0x8e, 0x58, 0x66, 0x1a,\n                                                       0x62, 0xc1, 0x7e, 0xb4, 0x9c, 0xa9, 0xa1, 0x9d,\n                                                       0x98, 0x1e, 0xc9, 0xe0, 0xc6, 0xf7, 0x3, 0xdd,\n                                                       0xb7, 0x38, 0xb8, 0x42, 0xf7, 0xf, 0x4c, 0xe1,\n                                                       0x8, 0x9c, 0x7f, 0x6f, 0x98, 0x7a, 0x1b, 0x5c,\n                                                       0x5f, 0x70, 0x62, 0x63, 0xa4, 0x61, 0xb6, 0x7a,\n                                                       0x1f, 0xde, 0x6c, 0xf7, 0xa, 0x5a, 0xb7, 0x71,\n                                                       0x8, 0xfb, 0xbb, 0xfb, 0x96, 0xe7, 0x2b, 0x1b,\n                                                       0x54, 0x52, 0x41, 0x6d, 0x64, 0xc3, 0x4b, 0xc4,\n                                                       0x1f, 0xee, 0xf7, 0x9f, 0xe6, 0xf7, 0xaf, 0x1b,\n                                                       0xe, 0xe3, 0xf7, 0x5f, 0xf7, 0xa6, 0x1, 0xa9,\n                                                       0xf9, 0xf8, 0x3, 0xa9, 0xf7, 0x5f, 0x15, 0xf9,\n                                                       0x19, 0x6, 0xf7, 0x73, 0xf7, 0x1c, 0x75, 0xa,\n                                                       0xfb, 0x73, 0xf7, 0x1c, 0x5, 0xfd, 0x19, 0x6,\n                                                       0xf7, 0x18, 0xfb, 0x1c, 0x80, 0xa, 0xe, 0x37,\n                                                       0x93, 0x76, 0xf9, 0x62, 0x77, 0x1, 0xad, 0xf9,\n                                                       0x43, 0x3, 0xf8, 0x66, 0xf8, 0xb6, 0x15, 0xfb,\n                                                       0xf2, 0xfb, 0x7f, 0x7b, 0x74, 0x81, 0x1b, 0x80,\n                                                       0x82, 0xa7, 0x93, 0x88, 0x1f, 0xca, 0x71, 0x89,\n                                                       0x9c, 0x77, 0x1b, 0x71, 0x6d, 0x7a, 0x7c, 0x76,\n                                                       0x1f, 0x7e, 0x82, 0x81, 0x83, 0x7a, 0x1a, 0x59,\n                                                       0xb2, 0x27, 0xa1, 0x5d, 0x1e, 0x92, 0x7d, 0x90,\n                                                       0x7d, 0x95, 0x84, 0x8, 0x86, 0x92, 0x9a, 0x8b,\n                                                       0xab, 0x1b, 0x99, 0xa7, 0x8c, 0x90, 0x92, 0x1f,\n                                                       0x94, 0x91, 0xf7, 0xf3, 0xf8, 0xd0, 0xf7, 0xb,\n                                                       0xf7, 0x5, 0xa1, 0xa0, 0x18, 0x55, 0x33, 0x77,\n                                                       0x63, 0x67, 0x1f, 0xe, 0xf7, 0x17, 0xd4, 0xf8,\n                                                       0xaa, 0x1, 0xa9, 0xf9, 0xf8, 0x3, 0xa9, 0xd4,\n                                                       0x15, 0xf9, 0x19, 0x6, 0xf7, 0x73, 0xf7, 0x9e,\n                                                       0x75, 0xa, 0xfb, 0x73, 0xf7, 0x9e, 0x5, 0xfd,\n                                                       0x19, 0x6, 0xf7, 0x18, 0xfb, 0x9e, 0x80, 0xa,\n                                                       0xe, 0xda, 0x91, 0xf9, 0x30, 0x1, 0xe4, 0xf9,\n                                                       0xa2, 0x3, 0xe4, 0x91, 0x15, 0xf9, 0xa2, 0xf7,\n                                                       0xe1, 0x75, 0xa, 0xfd, 0xa2, 0xf7, 0xe1, 0x5,\n                                                       0x38, 0x7, 0xf8, 0xe7, 0xfb, 0x8e, 0x80, 0xa,\n                                                       0xfc, 0xe7, 0xfb, 0x8e, 0x5, 0x95, 0xf7, 0x16,\n                                                       0x15, 0xf7, 0xe1, 0xf7, 0xc, 0x75, 0xa, 0xfb,\n                                                       0xe1, 0xf7, 0xc, 0x5, 0xe, 0x30, 0xbb, 0x76,\n                                                       0xf8, 0x87, 0x77, 0x1, 0xd4, 0xf8, 0xef, 0x3,\n                                                       0xf7, 0x12, 0xdd, 0x15, 0xf7, 0x63, 0xf7, 0x38,\n                                                       0xf7, 0x2f, 0xfb, 0x6e, 0x8c, 0x8a, 0xf7, 0x4f,\n                                                       0xf8, 0x87, 0x5, 0x8a, 0x6, 0xfc, 0xa9, 0x81,\n                                                       0x8c, 0x8a, 0xf7, 0x2d, 0xfb, 0x6e, 0xfb, 0x73,\n                                                       0xfb, 0x1f, 0x5, 0xe, 0x88, 0xb7, 0x6c, 0xa,\n                                                       0x12, 0xae, 0xf7, 0x4, 0xf7, 0x81, 0xf7, 0xb,\n                                                       0x13, 0x6c, 0xae, 0xf7, 0x5d, 0x15, 0xf7, 0xf1,\n                                                       0x6, 0x13, 0x9c, 0xfb, 0x31, 0xf7, 0x1a, 0x7,\n                                                       0xf7, 0xb0, 0xf7, 0xc2, 0xfb, 0xb0, 0xf7, 0xc2,\n                                                       0x5, 0xfb, 0x1a, 0x6, 0x13, 0xac, 0xfb, 0x31,\n                                                       0xfb, 0xf1, 0x7, 0xf7, 0x4, 0xfb, 0x9d, 0x15,\n                                                       0xf7, 0x84, 0xf7, 0xf8, 0xf7, 0x35, 0x7, 0xf7,\n                                                       0x9c, 0xfb, 0xad, 0xfb, 0x9c, 0x7d, 0xa, 0x47,\n                                                       0xc5, 0x76, 0xf8, 0x91, 0xea, 0x99, 0x77, 0x12,\n                                                       0xf8, 0xee, 0xe0, 0x13, 0xb0, 0xf8, 0x7e, 0xf8,\n                                                       0x3d, 0x15, 0xf7, 0x4, 0xe7, 0x8f, 0x63, 0xb4,\n                                                       0x6d, 0xb3, 0x80, 0x19, 0x88, 0xe5, 0xaa, 0xcf,\n                                                       0xa0, 0xc8, 0x8, 0x13, 0xd0, 0x45, 0x77, 0x3b,\n                                                       0x7c, 0x44, 0xa0, 0x8c, 0x66, 0xa7, 0x56, 0xad,\n                                                       0x86, 0xfb, 0x4, 0x2f, 0x18, 0xfc, 0x44, 0xfb,\n                                                       0x63, 0x15, 0xf7, 0x3d, 0x7e, 0xf7, 0x97, 0xf7,\n                                                       0x6e, 0xfb, 0x3b, 0x99, 0x5, 0x36, 0xfc, 0x41,\n                                                       0x15, 0xf7, 0x98, 0xf7, 0x6e, 0x5, 0xcd, 0x92,\n                                                       0xbf, 0x94, 0xbc, 0x1e, 0xfb, 0x98, 0xfb, 0x6e,\n                                                       0x5, 0xe, 0xbc, 0x8d, 0x76, 0xf7, 0xf1, 0xf7,\n                                                       0x39, 0xf7, 0x6d, 0x77, 0x12, 0xf9, 0x46, 0xec,\n                                                       0x13, 0xb0, 0xad, 0xf7, 0xb8, 0x15, 0x5e, 0xba,\n                                                       0xc7, 0x6e, 0xcd, 0x1b, 0xa3, 0xa3, 0x8f, 0x94,\n                                                       0xa2, 0x1f, 0x78, 0x68, 0x83, 0x68, 0x64, 0x1a,\n                                                       0x5a, 0x9d, 0x59, 0xa5, 0x61, 0x1e, 0xf7, 0x97,\n                                                       0xf7, 0x6d, 0x5, 0x13, 0xd0, 0x72, 0xb2, 0x7d,\n                                                       0xba, 0xb9, 0x1a, 0xd7, 0xc0, 0xb7, 0xbf, 0xb8,\n                                                       0x1e, 0xd1, 0xc4, 0x8a, 0x3a, 0xbc, 0x49, 0xbc,\n                                                       0x66, 0x19, 0xf7, 0x28, 0x9b, 0xee, 0xbd, 0xec,\n                                                       0x1e, 0xfb, 0x6, 0x68, 0xfb, 0xd, 0x95, 0xfb,\n                                                       0x8, 0xa0, 0xaa, 0x4f, 0xc4, 0x4e, 0xd9, 0x82,\n                                                       0x43, 0x51, 0x18, 0x68, 0x62, 0x57, 0x63, 0x53,\n                                                       0x1b, 0x58, 0x4a, 0xa8, 0xae, 0x65, 0x1f, 0xe,\n                                                       0x30, 0xed, 0x76, 0xf8, 0x4d, 0x77, 0xd9, 0x77,\n                                                       0x1, 0xce, 0xf8, 0xf1, 0x3, 0xf7, 0x20, 0xde,\n                                                       0x15, 0xf8, 0xa8, 0x85, 0x75, 0xa, 0xfb, 0x54,\n                                                       0xf8, 0x85, 0x80, 0xa, 0xfb, 0x2c, 0xfb, 0x6e,\n                                                       0xfb, 0x64, 0xf7, 0x36, 0x56, 0x40, 0xf7, 0x75,\n                                                       0xfb, 0x1f, 0xfb, 0x2c, 0xfb, 0x70, 0x5, 0xe,\n                                                       0x47, 0xc5, 0x76, 0xa3, 0xdc, 0xf8, 0x95, 0x77,\n                                                       0x1, 0xf8, 0xe9, 0xe5, 0x3, 0xf8, 0x66, 0xf7,\n                                                       0x82, 0x15, 0xf6, 0x2b, 0x69, 0x86, 0x74, 0x5a,\n                                                       0x8a, 0x66, 0x19, 0x93, 0xa4, 0xa7, 0x8d, 0xa6,\n                                                       0x1b, 0xbb, 0xbd, 0x80, 0x7e, 0xb6, 0x1f, 0x76,\n                                                       0xc8, 0x6c, 0xcf, 0x8e, 0xe5, 0x63, 0x80, 0x5d,\n                                                       0x69, 0x87, 0x63, 0x20, 0xeb, 0x18, 0xfb, 0x57,\n                                                       0x62, 0x15, 0xf7, 0x3b, 0x99, 0xfb, 0x97, 0xf7,\n                                                       0x6e, 0xfb, 0x3d, 0x7e, 0x5, 0xf7, 0x54, 0xb6,\n                                                       0x15, 0xf7, 0x98, 0xfb, 0x6e, 0x5, 0x8f, 0x88,\n                                                       0x77, 0xf7, 0x3e, 0x8b, 0x1a, 0xfb, 0x98, 0xf7,\n                                                       0x6e, 0x5, 0xe, 0xbc, 0x8d, 0x76, 0xa2, 0xf7,\n                                                       0x7, 0xf8, 0xe5, 0x77, 0x1, 0xf9, 0x3f, 0xf3,\n                                                       0x3, 0xf7, 0xb9, 0xf7, 0x4c, 0x15, 0xae, 0xb1,\n                                                       0xcc, 0xa8, 0xbe, 0x1b, 0xc3, 0xbf, 0x63, 0x68,\n                                                       0xb4, 0x1f, 0xcc, 0x55, 0x3d, 0x82, 0x57, 0x48,\n                                                       0x6e, 0x51, 0x19, 0x96, 0xc6, 0xc9, 0x93, 0xc7,\n                                                       0x1b, 0xc5, 0xc3, 0x85, 0x7a, 0xc3, 0x1f, 0x59,\n                                                       0xec, 0x7b, 0xee, 0xf7, 0x28, 0x1a, 0x5f, 0x70,\n                                                       0x4e, 0x43, 0x8c, 0x3a, 0x4c, 0xc0, 0x18, 0x57,\n                                                       0xb8, 0x56, 0xb7, 0xd7, 0x1a, 0xb9, 0x99, 0xba,\n                                                       0xa4, 0xb2, 0x1e, 0xfb, 0x97, 0xf7, 0x6d, 0x5,\n                                                       0x71, 0x61, 0x79, 0x59, 0x5a, 0x1a, 0x64, 0x93,\n                                                       0x68, 0x9e, 0x68, 0x1e, 0x94, 0x74, 0x73, 0x8f,\n                                                       0x73, 0x1b, 0x49, 0x4f, 0x6e, 0x5e, 0x5c, 0x1f,\n                                                       0xe, 0xa7, 0xa4, 0x76, 0xf8, 0x89, 0x77, 0xf7,\n                                                       0x6d, 0x77, 0x1, 0xbb, 0xf9, 0x9b, 0x3, 0xf7,\n                                                       0x18, 0xf7, 0x7d, 0x15, 0x63, 0xf7, 0x44, 0xf7,\n                                                       0xad, 0x69, 0x5, 0x8b, 0x5d, 0xf7, 0x48, 0x8a,\n                                                       0x8b, 0xf8, 0x1d, 0xfb, 0x75, 0x8e, 0x1a, 0x88,\n                                                       0x7, 0x8b, 0xfb, 0xaa, 0xfb, 0x86, 0x8e, 0x8a,\n                                                       0x1e, 0x88, 0x5f, 0xf7, 0x51, 0x8b, 0x1e, 0xfb,\n                                                       0xc2, 0x32, 0x15, 0xf7, 0xa4, 0xb2, 0xc0, 0xfb,\n                                                       0x6e, 0xf7, 0xf4, 0xf7, 0xcb, 0xba, 0xec, 0xfc,\n                                                       0x7a, 0xf7, 0xb6, 0x4d, 0xfb, 0x0, 0xaf, 0xfb,\n                                                       0x16, 0xfb, 0x5d, 0xb4, 0x4d, 0x2b, 0x5, 0xe,\n                                                       0xf7, 0xe, 0xee, 0xb3, 0xf0, 0xf7, 0x50, 0x44,\n                                                       0x77, 0xf7, 0x55, 0xb3, 0x12, 0xf9, 0x96, 0xf7,\n                                                       0xa, 0x8b, 0xbb, 0x13, 0xdc, 0xf9, 0x39, 0xf7,\n                                                       0xed, 0x15, 0xb7, 0x9e, 0xbc, 0xa0, 0xc1, 0x93,\n                                                       0xbd, 0x9f, 0x19, 0xac, 0x98, 0xa8, 0xa4, 0xb2,\n                                                       0x1a, 0xbc, 0x5d, 0xaa, 0x5d, 0x51, 0x68, 0x5e,\n                                                       0x59, 0x78, 0x1e, 0x7a, 0x5d, 0x80, 0x7b, 0x5f,\n                                                       0x73, 0x8, 0xfd, 0x1e, 0xf7, 0x1d, 0x15, 0xf8,\n                                                       0xf0, 0xfb, 0x85, 0xc1, 0x75, 0xb1, 0x7a, 0xa3,\n                                                       0x52, 0x19, 0x58, 0xa1, 0xb1, 0x64, 0xc5, 0x1b,\n                                                       0xb9, 0xb7, 0xaa, 0xbc, 0xb2, 0x6c, 0xa6, 0x69,\n                                                       0x97, 0x1f, 0x57, 0x9e, 0x54, 0x92, 0x59, 0xa1,\n                                                       0x55, 0xa3, 0x18, 0x75, 0xc1, 0xfd, 0x8, 0xf7,\n                                                       0x31, 0x5, 0x93, 0xfc, 0x34, 0x15, 0xf8, 0xb7,\n                                                       0xf7, 0x31, 0x5, 0x8c, 0x7, 0xfb, 0x6, 0xb8,\n                                                       0xfc, 0x47, 0xfb, 0x54, 0x5, 0xf9, 0x84, 0xf7,\n                                                       0xe8, 0x15, 0xab, 0xae, 0xa2, 0xa9, 0xa5, 0xa6,\n                                                       0x7a, 0x6e, 0x6a, 0x6a, 0x74, 0x6c, 0x70, 0x70,\n                                                       0x9d, 0xa8, 0x1e, 0x8d, 0xfb, 0xaf, 0x15, 0xa9,\n                                                       0xa4, 0x9d, 0xa7, 0xa9, 0xaf, 0x78, 0x6a, 0x6e,\n                                                       0x76, 0x77, 0x6e, 0x6e, 0x63, 0x9f, 0xac, 0x1e,\n                                                       0xfb, 0x50, 0xf7, 0x28, 0x15, 0x13, 0xbc, 0x94,\n                                                       0x93, 0x93, 0x94, 0x94, 0x93, 0x83, 0x82, 0x82,\n                                                       0x83, 0x83, 0x82, 0x82, 0x83, 0x93, 0x94, 0x1e,\n                                                       0xe, 0x92, 0x3a, 0xa, 0xaf, 0xf9, 0x9b, 0x3,\n                                                       0xc2, 0xf3, 0x15, 0x87, 0x69, 0xa9, 0x74, 0xa2,\n                                                       0x78, 0x8, 0x81, 0x98, 0xb4, 0x6b, 0xb0, 0x1b,\n                                                       0xa5, 0xea, 0xe3, 0xa2, 0xa4, 0x1f, 0xf8, 0x4f,\n                                                       0xf8, 0x5d, 0x5, 0xa1, 0xa1, 0x90, 0x8b, 0xa8,\n                                                       0x1a, 0xcc, 0x7, 0xa8, 0x8b, 0x91, 0x6b, 0x79,\n                                                       0x83, 0x87, 0x81, 0x7e, 0x1e, 0xfb, 0x71, 0xfb,\n                                                       0x5f, 0x5, 0xfb, 0x71, 0xfb, 0x76, 0x83, 0x83,\n                                                       0x83, 0x1b, 0x6b, 0x87, 0xac, 0xa3, 0x87, 0x1f,\n                                                       0x82, 0xc1, 0x5, 0x88, 0x9f, 0x84, 0xad, 0x9f,\n                                                       0x1a, 0xbe, 0x4d, 0x85, 0x69, 0x7f, 0x1e, 0x76,\n                                                       0x84, 0x78, 0x72, 0x7e, 0x7b, 0x8, 0x6a, 0x64,\n                                                       0x8b, 0x92, 0x57, 0x1a, 0x5f, 0x8b, 0x6a, 0x90,\n                                                       0x60, 0x1e, 0xe, 0xfb, 0x23, 0xcc, 0x76, 0xf4,\n                                                       0xa8, 0xf7, 0xb8, 0xe4, 0xe4, 0x54, 0xa, 0xa7,\n                                                       0xf7, 0x78, 0xa5, 0x3, 0xae, 0xf7, 0x29, 0x15,\n                                                       0xf7, 0x94, 0x22, 0x6, 0xf8, 0x6, 0xf7, 0xd9,\n                                                       0xfb, 0xb9, 0xf7, 0xab, 0x3e, 0x4c, 0x5, 0x71,\n                                                       0xfb, 0x3e, 0x7, 0x35, 0x43, 0x5, 0xa7, 0xfb,\n                                                       0xc9, 0x15, 0xf7, 0xb8, 0xf7, 0x92, 0xee, 0x7,\n                                                       0xf7, 0x96, 0xfb, 0x88, 0xfb, 0x96, 0xfb, 0x72,\n                                                       0x5, 0xd6, 0x7, 0xe, 0xae, 0xe9, 0x76, 0xe6,\n                                                       0xa5, 0xf7, 0x99, 0xcf, 0xeb, 0x77, 0x1, 0xf8,\n                                                       0xb8, 0xa3, 0x3, 0xb0, 0xf7, 0x38, 0x15, 0xf8,\n                                                       0x93, 0x30, 0x6, 0xf7, 0xb8, 0xf7, 0xba, 0xfb,\n                                                       0x7c, 0xf7, 0x8c, 0x4f, 0x56, 0x5, 0x60, 0xfc,\n                                                       0x50, 0x7, 0x46, 0x47, 0xd0, 0xfb, 0x16, 0x5,\n                                                       0x70, 0xfb, 0x17, 0x15, 0xc1, 0xf7, 0x17, 0x47,\n                                                       0xf7, 0x16, 0x5, 0xf8, 0x91, 0xc0, 0x6, 0xf7,\n                                                       0x4e, 0xfb, 0x4b, 0xfb, 0x4e, 0xfb, 0x53, 0x5,\n                                                       0xc7, 0x7, 0xe, 0xf7, 0x1b, 0xec, 0xb3, 0xf7,\n                                                       0x6b, 0xa6, 0xeb, 0xae, 0xb1, 0x77, 0x12, 0xf9,\n                                                       0x32, 0xb1, 0x65, 0xf7, 0x15, 0x9f, 0xb5, 0xbf,\n                                                       0xbb, 0x13, 0xf7, 0xf9, 0x36, 0xf8, 0xe, 0x15,\n                                                       0xb2, 0x88, 0x5, 0x87, 0xc2, 0xc4, 0x78, 0xc0,\n                                                       0x1b, 0xb6, 0xb3, 0xa3, 0xba, 0xbc, 0x59, 0xb1,\n                                                       0x5d, 0x67, 0x6a, 0x77, 0x73, 0x72, 0x1f, 0x68,\n                                                       0x6a, 0x7a, 0x83, 0x5b, 0x89, 0x8, 0xfc, 0x61,\n                                                       0xf4, 0x15, 0xf7, 0x31, 0x6, 0xf7, 0x76, 0xfb,\n                                                       0x50, 0xb6, 0x67, 0xa7, 0x71, 0x91, 0x50, 0x19,\n                                                       0x4d, 0x91, 0xaf, 0x4f, 0xd1, 0x1b, 0xb4, 0xb1,\n                                                       0xa7, 0xb6, 0xa8, 0x79, 0xa3, 0x75, 0x9c, 0x1f,\n                                                       0x61, 0xab, 0x5a, 0xa1, 0x64, 0xaf, 0x61, 0xb2,\n                                                       0x18, 0x87, 0xc2, 0xfb, 0x3d, 0xf5, 0x5, 0xf7,\n                                                       0x38, 0x9f, 0xfc, 0x42, 0x6, 0xfb, 0x63, 0x2c,\n                                                       0x15, 0xf8, 0xb0, 0x2c, 0x5, 0x8c, 0x7, 0x23,\n                                                       0xe2, 0xfc, 0x45, 0x9d, 0x5, 0xf9, 0xad, 0x6b,\n                                                       0x15, 0xa9, 0xa6, 0x98, 0xa5, 0xa9, 0xaa, 0x7a,\n                                                       0x6a, 0x6e, 0x73, 0x7a, 0x70, 0x6d, 0x6a, 0x9f,\n                                                       0xac, 0x1e, 0xfb, 0x6e, 0x67, 0x15, 0x94, 0x92,\n                                                       0x91, 0x94, 0x93, 0x94, 0x84, 0x83, 0x82, 0x82,\n                                                       0x84, 0x82, 0x82, 0x85, 0x93, 0x93, 0x1e, 0x13,\n                                                       0xfb, 0xf7, 0x13, 0xfb, 0x5c, 0x15, 0xa4, 0xa2,\n                                                       0x9e, 0xa3, 0xa8, 0xae, 0x71, 0x6c, 0x72, 0x77,\n                                                       0x76, 0x72, 0x6e, 0x66, 0xa7, 0xaa, 0x1e, 0xe,\n                                                       0x3e, 0x8b, 0xa9, 0xf8, 0xab, 0xa7, 0x6f, 0xf7,\n                                                       0x13, 0x12, 0xae, 0xa8, 0xf8, 0xa9, 0xa7, 0x6f,\n                                                       0xf7, 0x16, 0x13, 0xd8, 0xae, 0x16, 0xf8, 0xe2,\n                                                       0xf5, 0x6, 0x13, 0xb4, 0xf1, 0xf8, 0xde, 0xfc,\n                                                       0xdb, 0x6, 0x13, 0xd8, 0x28, 0xfb, 0x1, 0x7,\n                                                       0xa8, 0xfc, 0xc7, 0x15, 0xf8, 0xab, 0xf8, 0xa9,\n                                                       0xfc, 0xab, 0x7, 0xe, 0x3b, 0x8b, 0xab, 0xf8,\n                                                       0xad, 0xf7, 0xf, 0x1, 0xae, 0xaa, 0xf8, 0xa8,\n                                                       0xf7, 0x13, 0x7a, 0xa, 0xf8, 0xcd, 0x6, 0xf7,\n                                                       0xd, 0xf7, 0xb, 0x5, 0xf8, 0xd1, 0xfc, 0xc6,\n                                                       0x7, 0xfb, 0x14, 0xfb, 0x7, 0x5, 0xaa, 0xfc,\n                                                       0xb5, 0x6d, 0xa, 0x66, 0xa, 0xaf, 0xf7, 0xe9,\n                                                       0x15, 0xe6, 0x54, 0xf7, 0x3f, 0xfb, 0x1f, 0xf7,\n                                                       0x34, 0xfb, 0x5b, 0x9a, 0x96, 0x18, 0x5f, 0xf7,\n                                                       0xb, 0x33, 0xf7, 0x3d, 0x47, 0xe9, 0xca, 0xdf,\n                                                       0xe8, 0xf7, 0x65, 0xad, 0xde, 0x80, 0x98, 0x18,\n                                                       0xfb, 0x38, 0xfb, 0x56, 0xfb, 0x42, 0xfb, 0x27,\n                                                       0x3d, 0x5b, 0x8, 0xe, 0xfc, 0x41, 0x38, 0xa,\n                                                       0xf7, 0x1b, 0x8b, 0x3, 0xf7, 0x1b, 0x16, 0xf7,\n                                                       0x84, 0x6, 0x27, 0xf7, 0xee, 0xef, 0xf7, 0xee,\n                                                       0x5, 0xfb, 0x84, 0x6, 0x27, 0xfb, 0xee, 0x5,\n                                                       0xe, 0x3e, 0x8f, 0xf9, 0x3f, 0x1, 0xab, 0xf9,\n                                                       0x4e, 0x3, 0xb1, 0x93, 0x15, 0xa4, 0x90, 0xd6,\n                                                       0xa0, 0x9d, 0x95, 0xa3, 0x97, 0xd4, 0xd0, 0xed,\n                                                       0xf5, 0x91, 0x91, 0x9d, 0x89, 0x90, 0x85, 0xce,\n                                                       0x41, 0xda, 0x40, 0xa3, 0x73, 0x8, 0x64, 0xb3,\n                                                       0xab, 0x7e, 0xa3, 0x1b, 0x94, 0xcb, 0x95, 0x91,\n                                                       0x93, 0x1f, 0x8e, 0x97, 0x69, 0xa5, 0xfb, 0x42,\n                                                       0xf7, 0x45, 0x40, 0xe7, 0x19, 0xf7, 0x3c, 0xf7,\n                                                       0x4c, 0xd8, 0xf7, 0x3, 0x9f, 0xb1, 0x84, 0x99,\n                                                       0x18, 0x5b, 0x85, 0x38, 0x7d, 0x87, 0x83, 0x63,\n                                                       0x4e, 0x3f, 0x26, 0x3c, 0x39, 0x59, 0xb3, 0xfb,\n                                                       0x2f, 0xf7, 0x50, 0x6f, 0xc4, 0x8, 0x80, 0x6,\n                                                       0x7f, 0x82, 0x68, 0x5e, 0x81, 0x78, 0x84, 0x78,\n                                                       0x8b, 0x83, 0xa0, 0x65, 0x9d, 0x6c, 0xd9, 0x34,\n                                                       0xee, 0xfb, 0x2, 0x90, 0x84, 0x8b, 0x80, 0x86,\n                                                       0x84, 0x67, 0x5e, 0xfb, 0x4d, 0xfb, 0x5c, 0x6d,\n                                                       0x70, 0x8, 0xe, 0x3d, 0xa5, 0x76, 0xf9, 0x21,\n                                                       0x99, 0xa5, 0x77, 0x1, 0xa8, 0xf9, 0x53, 0x3,\n                                                       0xae, 0x94, 0x15, 0xa7, 0x8e, 0xea, 0x9a, 0xaf,\n                                                       0xa2, 0x9f, 0x97, 0xb2, 0xa6, 0xe0, 0xf6, 0x90,\n                                                       0x92, 0x9c, 0x89, 0x94, 0x82, 0xba, 0x58, 0xc1,\n                                                       0x4e, 0xa4, 0x74, 0x8, 0x64, 0xb6, 0xa9, 0x7e,\n                                                       0xa3, 0x1b, 0x97, 0xf7, 0x8, 0x94, 0x90, 0x95,\n                                                       0x1f, 0x8d, 0x9a, 0x66, 0xad, 0xfb, 0x32, 0xf7,\n                                                       0x4f, 0x49, 0xe5, 0x19, 0xe0, 0xe2, 0xf7, 0x31,\n                                                       0xf7, 0x4d, 0x9b, 0xb4, 0x82, 0x99, 0x18, 0x63,\n                                                       0x88, 0xfb, 0x13, 0x7a, 0x87, 0x84, 0x6c, 0x5a,\n                                                       0x42, 0x2a, 0x55, 0x55, 0x46, 0xd0, 0x2e, 0xf7,\n                                                       0x14, 0x6e, 0xc3, 0x8, 0x7d, 0x6, 0x73, 0x80,\n                                                       0x3b, 0x38, 0x83, 0x79, 0x84, 0x79, 0x8d, 0x7a,\n                                                       0xa0, 0x66, 0x9d, 0x6b, 0xc3, 0x47, 0xe6, 0x24,\n                                                       0x90, 0x85, 0x89, 0x7c, 0x86, 0x86, 0x67, 0x5d,\n                                                       0xfb, 0x32, 0xfb, 0x50, 0x6d, 0x70, 0x8, 0xe,\n                                                       0xfb, 0xa0, 0x5c, 0x76, 0xf9, 0x6d, 0x77, 0x1,\n                                                       0xf7, 0x50, 0xf7, 0x98, 0x3, 0xf7, 0xb4, 0xf7,\n                                                       0x96, 0x15, 0xfb, 0x34, 0xee, 0x9f, 0x67, 0x98,\n                                                       0x1b, 0x97, 0x9e, 0x98, 0x97, 0x8d, 0x1f, 0x89,\n                                                       0x8f, 0x88, 0x91, 0x8f, 0x1a, 0x91, 0x9b, 0x91,\n                                                       0x8f, 0x8f, 0x1e, 0x93, 0x7, 0x92, 0x8e, 0x8f,\n                                                       0x8f, 0x8e, 0x92, 0xfb, 0x1, 0xf7, 0x79, 0x18,\n                                                       0xe3, 0xf7, 0x13, 0xe3, 0xf3, 0x96, 0x95, 0x8,\n                                                       0x8f, 0x8f, 0x92, 0x91, 0x91, 0x1a, 0x92, 0x7b,\n                                                       0x96, 0x87, 0x95, 0x1e, 0x8d, 0x8a, 0x89, 0x91,\n                                                       0x88, 0x1b, 0x88, 0x85, 0x84, 0x88, 0x89, 0x1f,\n                                                       0x80, 0x81, 0x5, 0x90, 0x85, 0x67, 0x86, 0x85,\n                                                       0x1b, 0xfb, 0x31, 0xfb, 0x41, 0x3f, 0xf7, 0x2a,\n                                                       0x5, 0x93, 0x87, 0x88, 0x95, 0x80, 0x1b, 0x80,\n                                                       0x83, 0x7b, 0x81, 0x82, 0x89, 0x8, 0x8f, 0x86,\n                                                       0x87, 0x90, 0x84, 0x1b, 0x79, 0x7d, 0x82, 0x82,\n                                                       0x84, 0x1a, 0x82, 0x93, 0x7a, 0x8e, 0x83, 0x1e,\n                                                       0xd7, 0xfb, 0x54, 0x49, 0x3c, 0x3d, 0x25, 0x62,\n                                                       0x43, 0x19, 0x6c, 0x56, 0x7a, 0x73, 0x7e, 0x1a,\n                                                       0x88, 0x8e, 0x89, 0x8d, 0x89, 0x1e, 0x92, 0x85,\n                                                       0x87, 0x85, 0x89, 0x83, 0x8, 0x89, 0x85, 0x8a,\n                                                       0x87, 0x85, 0x1a, 0x80, 0x94, 0x80, 0x91, 0x82,\n                                                       0x1e, 0x81, 0x91, 0x8d, 0x81, 0x98, 0x1b, 0x99,\n                                                       0xa5, 0x8e, 0x94, 0x97, 0x1f, 0xe, 0xfb, 0x36,\n                                                       0x93, 0x76, 0xf9, 0x62, 0x77, 0x1, 0xf7, 0x5f,\n                                                       0xf7, 0x64, 0x3, 0xf3, 0x93, 0x15, 0x9e, 0x76,\n                                                       0x5, 0x98, 0x6, 0x92, 0x94, 0xf7, 0x26, 0xf7,\n                                                       0x58, 0xb1, 0x5a, 0xa9, 0x53, 0xb7, 0x5e, 0x19,\n                                                       0x8e, 0x8e, 0x89, 0x8d, 0x9b, 0xa0, 0xad, 0x90,\n                                                       0x1b, 0x8e, 0x93, 0x83, 0x8a, 0x8d, 0x1f, 0x88,\n                                                       0x8f, 0x91, 0x85, 0x90, 0x1b, 0x90, 0x93, 0x94,\n                                                       0x8e, 0x8e, 0x1f, 0x92, 0x91, 0x94, 0x8e, 0x87,\n                                                       0x95, 0x8, 0x91, 0x89, 0x96, 0x99, 0x8d, 0x1b,\n                                                       0x93, 0x6, 0x94, 0x97, 0xa4, 0x91, 0x8e, 0x1f,\n                                                       0x92, 0x97, 0x8b, 0x8a, 0x8d, 0x98, 0xfb, 0x28,\n                                                       0xf7, 0x4b, 0x18, 0xf7, 0x4b, 0xf7, 0x70, 0xbb,\n                                                       0x89, 0xb5, 0x1a, 0x7c, 0xae, 0x86, 0x92, 0x8b,\n                                                       0x8c, 0x84, 0x89, 0x19, 0x7f, 0x88, 0x87, 0xab,\n                                                       0x90, 0x1a, 0x8e, 0x8d, 0x8d, 0x8d, 0x8d, 0x1e,\n                                                       0x96, 0x92, 0x59, 0x92, 0x89, 0x1b, 0x7f, 0xfb,\n                                                       0x5b, 0xfb, 0x65, 0x70, 0x74, 0x1f, 0xfb, 0xa,\n                                                       0xf7, 0x45, 0x5, 0x92, 0x87, 0x83, 0x96, 0x82,\n                                                       0x1b, 0x7e, 0x7d, 0x80, 0x7e, 0x8c, 0x1f, 0x82,\n                                                       0x88, 0x81, 0x80, 0x88, 0x7d, 0x9d, 0x8c, 0x86,\n                                                       0x1e, 0x7d, 0x7e, 0x7e, 0x7d, 0x82, 0x7a, 0xa6,\n                                                       0x2f, 0xb7, 0x35, 0xb8, 0x37, 0xfb, 0x3b, 0xfb,\n                                                       0x5b, 0x18, 0x7e, 0x9b, 0x7b, 0x81, 0x7e, 0x7f,\n                                                       0x85, 0x84, 0x1a, 0x87, 0x93, 0x82, 0x8d, 0x88,\n                                                       0x1e, 0x92, 0x7f, 0x93, 0x7a, 0x98, 0x85, 0x8,\n                                                       0x8e, 0x93, 0x92, 0x90, 0x94, 0x1b, 0x8d, 0x8e,\n                                                       0x89, 0x88, 0x1f, 0x87, 0x88, 0x85, 0x87, 0x1a,\n                                                       0xe, 0x3f, 0x86, 0xb0, 0xf7, 0x7a, 0xaf, 0xdc,\n                                                       0xb0, 0xf7, 0x77, 0xb0, 0x1, 0xbc, 0xb0, 0xf7,\n                                                       0x6c, 0xae, 0xe3, 0xb0, 0xf7, 0x6b, 0xb0, 0x3,\n                                                       0xbc, 0xf7, 0x9a, 0x15, 0xf7, 0x91, 0xfb, 0x9f,\n                                                       0xf7, 0x34, 0xf7, 0x9f, 0xf7, 0x90, 0xf7, 0x2e,\n                                                       0xfb, 0x91, 0x6, 0x8c, 0xf7, 0x9c, 0x5, 0xfb,\n                                                       0x35, 0xfb, 0x9c, 0xfb, 0x90, 0x6, 0xb0, 0xfb,\n                                                       0xa, 0x15, 0xdc, 0xf7, 0x90, 0xf7, 0x9c, 0xe2,\n                                                       0xfb, 0x9c, 0xf7, 0x90, 0x3a, 0xfb, 0x90, 0xfb,\n                                                       0x9e, 0x33, 0xf7, 0x9e, 0x7, 0xe, 0x3c, 0xa0,\n                                                       0x76, 0xf7, 0x7c, 0xf7, 0x7a, 0xf7, 0x7a, 0x77,\n                                                       0x1, 0xf7, 0x9b, 0xf7, 0x7c, 0x3, 0xae, 0xf7,\n                                                       0x7c, 0x15, 0xf7, 0x78, 0xfb, 0x7c, 0xf7, 0x7c,\n                                                       0xf7, 0x7c, 0xf7, 0x7b, 0xf7, 0x7a, 0xfb, 0x7b,\n                                                       0xf7, 0x7a, 0xfb, 0x7c, 0xfb, 0x7a, 0xfb, 0x78,\n                                                       0x6, 0xe, 0x3b, 0xa0, 0x76, 0xf7, 0xb2, 0xf7,\n                                                       0xc, 0xf7, 0xb2, 0x77, 0x1, 0xf7, 0xd5, 0xf7,\n                                                       0x9, 0x3, 0xae, 0xf7, 0xa8, 0x15, 0xf7, 0xa8,\n                                                       0xfb, 0xa8, 0xf7, 0x1d, 0xf7, 0xa8, 0xf7, 0xa9,\n                                                       0xf7, 0x20, 0xfb, 0xa9, 0xf7, 0xa8, 0xfb, 0x1d,\n                                                       0xfb, 0xa8, 0xfb, 0xa8, 0x6, 0xf7, 0xa8, 0xfb,\n                                                       0x20, 0x15, 0xf7, 0x20, 0xf7, 0x1d, 0xfb, 0x20,\n                                                       0x7, 0xe, 0x36, 0xa0, 0x76, 0xf7, 0x7f, 0xf7,\n                                                       0x6d, 0xf7, 0x84, 0x77, 0x1, 0xf7, 0x9e, 0xf7,\n                                                       0x70, 0x3, 0xae, 0xf7, 0x7f, 0x15, 0xf7, 0x7b,\n                                                       0xfb, 0x7f, 0xf7, 0x71, 0xf7, 0x7f, 0xf7, 0x7d,\n                                                       0xf7, 0x6d, 0xfb, 0x7d, 0xf7, 0x84, 0xfb, 0x71,\n                                                       0xfb, 0x84, 0xfb, 0x7b, 0x6, 0xf7, 0x7b, 0xfb,\n                                                       0x6d, 0x15, 0xf7, 0x6d, 0xf7, 0x70, 0xfb, 0x6d,\n                                                       0x7, 0xe, 0x56, 0x7b, 0x76, 0xf7, 0xb9, 0xac,\n                                                       0x6a, 0xad, 0xaf, 0xa9, 0xaf, 0xae, 0xf7, 0xb6,\n                                                       0x77, 0x12, 0xf7, 0xcb, 0xad, 0xa2, 0xa9, 0xb8,\n                                                       0xaf, 0x69, 0xad, 0x13, 0xdf, 0x80, 0xf8, 0xe,\n                                                       0xf7, 0xc3, 0x15, 0x86, 0x53, 0x7b, 0x63, 0x7b,\n                                                       0x69, 0x8, 0x7a, 0x65, 0x7a, 0x6c, 0x64, 0x1a,\n                                                       0x6c, 0x98, 0x78, 0xa5, 0x79, 0x1e, 0x98, 0x83,\n                                                       0x9d, 0x81, 0x91, 0x85, 0x8, 0x89, 0x8d, 0x8f,\n                                                       0x83, 0x8f, 0x1b, 0x8f, 0x8f, 0x93, 0x8d, 0x8d,\n                                                       0x1f, 0x91, 0x91, 0x9d, 0x95, 0x98, 0x93, 0x8,\n                                                       0xa5, 0x9d, 0x98, 0x9e, 0xaa, 0x1a, 0xb7, 0x79,\n                                                       0xab, 0x79, 0xb2, 0x1e, 0x7c, 0xac, 0x7c, 0xb1,\n                                                       0x86, 0xbf, 0x95, 0x90, 0x93, 0x93, 0x90, 0x96,\n                                                       0xbe, 0x86, 0xb1, 0x7d, 0xab, 0x7c, 0x8, 0x78,\n                                                       0xb5, 0xab, 0x77, 0xb5, 0x1b, 0xaa, 0x9e, 0x98,\n                                                       0xa5, 0x9d, 0x1f, 0x93, 0x98, 0x95, 0x9d, 0x91,\n                                                       0x91, 0x8, 0x8d, 0x8d, 0x93, 0x8f, 0x8f, 0x1a,\n                                                       0x8f, 0x83, 0x8f, 0x89, 0x8d, 0x1e, 0x85, 0x91,\n                                                       0x81, 0x9d, 0x83, 0x98, 0x8, 0xa5, 0x79, 0x75,\n                                                       0x99, 0x6c, 0x1b, 0x5a, 0x6a, 0x74, 0x77, 0x5d,\n                                                       0x1f, 0x6e, 0x7e, 0x69, 0x80, 0x5e, 0x87, 0x87,\n                                                       0x94, 0x83, 0x93, 0x82, 0x8e, 0x8f, 0xbd, 0x98,\n                                                       0xb0, 0x99, 0xaa, 0x8, 0x9e, 0xb7, 0xa0, 0xac,\n                                                       0xb7, 0x1a, 0xaa, 0x7e, 0x9e, 0x71, 0x9d, 0x1e,\n                                                       0x7e, 0x93, 0x79, 0x95, 0x85, 0x91, 0x8, 0x8d,\n                                                       0x89, 0x87, 0x93, 0x87, 0x1b, 0x87, 0x87, 0x83,\n                                                       0x89, 0x89, 0x1f, 0x85, 0x85, 0x79, 0x81, 0x7e,\n                                                       0x83, 0x8, 0x71, 0x79, 0x7e, 0x78, 0x6c, 0x1a,\n                                                       0x5e, 0x9e, 0x6a, 0x9e, 0x62, 0x1e, 0x99, 0x6b,\n                                                       0x9a, 0x66, 0x8f, 0x58, 0x81, 0x87, 0x84, 0x84,\n                                                       0x87, 0x82, 0x53, 0x90, 0x64, 0x9b, 0x69, 0x9a,\n                                                       0x8, 0x9d, 0x64, 0x6c, 0x9c, 0x63, 0x1b, 0x6c,\n                                                       0x78, 0x7d, 0x71, 0x79, 0x1f, 0x83, 0x7e, 0x81,\n                                                       0x79, 0x85, 0x85, 0x8, 0x89, 0x89, 0x83, 0x87,\n                                                       0x87, 0x1a, 0x87, 0x93, 0x87, 0x8d, 0x89, 0x1e,\n                                                       0x91, 0x85, 0x95, 0x79, 0x93, 0x7e, 0x8, 0x71,\n                                                       0x9d, 0x9f, 0x80, 0xa9, 0x1b, 0xb5, 0xab, 0x9b,\n                                                       0x9c, 0xb0, 0x1f, 0xad, 0x9a, 0xb1, 0x9c, 0xc2,\n                                                       0x90, 0x8f, 0x81, 0x93, 0x83, 0x95, 0x86, 0x8,\n                                                       0x96, 0xf7, 0x7f, 0x15, 0x89, 0xa0, 0x7f, 0x96,\n                                                       0x80, 0x94, 0x8, 0x7f, 0x95, 0x80, 0x93, 0x9b,\n                                                       0x1a, 0x9c, 0x94, 0x96, 0x9b, 0x96, 0x1e, 0x92,\n                                                       0x8f, 0x96, 0x92, 0x8f, 0x8f, 0x8, 0x8b, 0x8f,\n                                                       0x93, 0x8c, 0x1e, 0x8d, 0x89, 0x8f, 0x87, 0x8c,\n                                                       0x8a, 0x8e, 0x87, 0x96, 0x84, 0x91, 0x86, 0x8,\n                                                       0x9b, 0x80, 0x92, 0x82, 0x7a, 0x1a, 0x77, 0x7b,\n                                                       0x83, 0x7d, 0x7d, 0x1e, 0x82, 0x82, 0x83, 0x81,\n                                                       0x89, 0x7a, 0x8, 0xf7, 0x59, 0xfb, 0x59, 0x15,\n                                                       0x8a, 0x8f, 0x9e, 0x8e, 0x96, 0x94, 0x94, 0x95,\n                                                       0x19, 0x98, 0x97, 0x93, 0x98, 0x9c, 0x1b, 0x9c,\n                                                       0x97, 0x83, 0x7b, 0x96, 0x1f, 0x8e, 0x84, 0x93,\n                                                       0x81, 0x8f, 0x87, 0x8c, 0x8a, 0x8f, 0x87, 0x8d,\n                                                       0x89, 0x8, 0x8a, 0x85, 0x88, 0x89, 0x8a, 0x1e,\n                                                       0x87, 0x87, 0x85, 0x7f, 0x86, 0x85, 0x8, 0x13,\n                                                       0xbf, 0x40, 0x7b, 0x80, 0x83, 0x84, 0x79, 0x1b,\n                                                       0x79, 0x83, 0x99, 0x98, 0x80, 0x1f, 0x82, 0x96,\n                                                       0x80, 0x95, 0x77, 0x8d, 0x8, 0xfc, 0x1f, 0x87,\n                                                       0x15, 0x79, 0x88, 0x81, 0x83, 0x82, 0x82, 0x8,\n                                                       0x7e, 0x7f, 0x83, 0x7d, 0x79, 0x1b, 0x78, 0x81,\n                                                       0x93, 0x9b, 0x80, 0x1f, 0x87, 0x92, 0x84, 0x96,\n                                                       0x87, 0x8f, 0x8, 0x8b, 0x85, 0x8e, 0x8c, 0x8d,\n                                                       0x1e, 0x8a, 0x8d, 0x91, 0x8e, 0x8b, 0x1a, 0x8f,\n                                                       0x90, 0x92, 0x95, 0x8f, 0x92, 0x8, 0x13, 0xdf,\n                                                       0x40, 0x9b, 0x96, 0x94, 0x92, 0x9c, 0x1b, 0x9c,\n                                                       0x93, 0x7e, 0x7f, 0x96, 0x1f, 0x95, 0x80, 0x97,\n                                                       0x80, 0xa0, 0x88, 0x8, 0xf7, 0x59, 0xfb, 0x59,\n                                                       0x15, 0x8f, 0x8d, 0x8e, 0x79, 0x93, 0x80, 0x94,\n                                                       0x82, 0x19, 0x98, 0x7e, 0x9a, 0x82, 0x8a, 0x79,\n                                                       0x8, 0x79, 0x83, 0x81, 0x7b, 0x80, 0x1e, 0x84,\n                                                       0x88, 0x80, 0x82, 0x88, 0x88, 0x8, 0x89, 0x89,\n                                                       0x88, 0x87, 0x8a, 0x1b, 0x8a, 0x86, 0x91, 0x8b,\n                                                       0x1f, 0x86, 0x8f, 0x82, 0x93, 0x83, 0x90, 0x8,\n                                                       0x7c, 0x95, 0x83, 0x93, 0x9c, 0x1a, 0x9d, 0x99,\n                                                       0x93, 0x98, 0x97, 0x1e, 0x96, 0x94, 0x95, 0x97,\n                                                       0x8e, 0x9e, 0x8, 0xe, 0xf7, 0x21, 0xee, 0xb3,\n                                                       0xef, 0xf7, 0x52, 0x42, 0x77, 0xf7, 0x58, 0xb2,\n                                                       0x12, 0xf9, 0x9b, 0xf7, 0xa, 0x8b, 0xbc, 0x13,\n                                                       0xdc, 0xf9, 0x3c, 0xf7, 0xef, 0x15, 0xb7, 0x9e,\n                                                       0xbd, 0xa1, 0xc2, 0x90, 0xbd, 0xa0, 0x19, 0xac,\n                                                       0x99, 0xa9, 0xa5, 0xb2, 0x1a, 0xbc, 0x5c, 0xa8,\n                                                       0x5e, 0x51, 0x67, 0x5f, 0x59, 0x78, 0x1e, 0x79,\n                                                       0x5d, 0x7f, 0x7a, 0x5f, 0x74, 0x8, 0xfd, 0x1c,\n                                                       0xf7, 0x20, 0x15, 0xf8, 0xf1, 0xfb, 0x8b, 0xc1,\n                                                       0x75, 0xaf, 0x7a, 0xa4, 0x52, 0x19, 0x58, 0xa1,\n                                                       0xb0, 0x65, 0xc6, 0x1b, 0xb9, 0xb8, 0xaa, 0xbc,\n                                                       0xb1, 0x6a, 0xa6, 0x6a, 0x97, 0x1f, 0x57, 0x9d,\n                                                       0x54, 0x93, 0x59, 0xa1, 0x55, 0xa3, 0x18, 0x76,\n                                                       0xc1, 0xfd, 0x8, 0xf7, 0x36, 0x5, 0x92, 0xfc,\n                                                       0x3a, 0x15, 0xf8, 0xb8, 0xf7, 0x33, 0x8a, 0x8c,\n                                                       0xfb, 0x2, 0xb7, 0xfc, 0x4b, 0xfb, 0x55, 0x5,\n                                                       0xf9, 0x84, 0xf7, 0xeb, 0x15, 0xab, 0xae, 0xa3,\n                                                       0xa9, 0xa5, 0xa6, 0x7a, 0x6e, 0x69, 0x6c, 0x74,\n                                                       0x6a, 0x71, 0x6f, 0x9d, 0xa8, 0x1e, 0x8e, 0xfb,\n                                                       0xb1, 0x15, 0xa9, 0xa4, 0x9d, 0xa7, 0xa9, 0xae,\n                                                       0x78, 0x6a, 0x6e, 0x77, 0x78, 0x6e, 0x6e, 0x63,\n                                                       0x9d, 0xad, 0x1e, 0xfc, 0xf2, 0xf7, 0xbc, 0x15,\n                                                       0xf8, 0x5a, 0xfb, 0x10, 0x9d, 0x5b, 0xc1, 0x74,\n                                                       0x7a, 0x7f, 0x7a, 0x95, 0x79, 0x93, 0x79, 0x92,\n                                                       0x19, 0xfc, 0x5d, 0xf7, 0x49, 0x5, 0x90, 0xfb,\n                                                       0xc2, 0x15, 0xf7, 0xb3, 0xf7, 0xe, 0xbd, 0x75,\n                                                       0xfb, 0xe4, 0x26, 0x5, 0xf8, 0x31, 0xf7, 0x31,\n                                                       0x15, 0x82, 0x92, 0x84, 0x94, 0x94, 0x92, 0x92,\n                                                       0x94, 0x1e, 0x13, 0xbc, 0x94, 0x84, 0x92, 0x82,\n                                                       0x82, 0x84, 0x84, 0x82, 0x1e, 0xe, 0x9e, 0xc2,\n                                                       0xea, 0xc2, 0x58, 0xf7, 0xa, 0xec, 0xf7, 0x2,\n                                                       0x5a, 0xc2, 0x54, 0xc3, 0xe9, 0xc2, 0x12, 0xd6,\n                                                       0xc2, 0x56, 0xc0, 0xeb, 0xc2, 0x58, 0xf7, 0x6,\n                                                       0xea, 0xf7, 0x8, 0x5a, 0xc3, 0x54, 0xc2, 0xe9,\n                                                       0xc2, 0x13, 0xd3, 0x52, 0xf7, 0x7e, 0xf7, 0x64,\n                                                       0x15, 0x95, 0x7a, 0x78, 0x91, 0x77, 0x1b, 0x52,\n                                                       0x5d, 0x5d, 0x52, 0x52, 0xb9, 0x5e, 0xc4, 0xc4,\n                                                       0xb9, 0xb9, 0xc4, 0x9f, 0x86, 0x9e, 0x80, 0x9b,\n                                                       0x1f, 0xd9, 0xd8, 0x94, 0x86, 0x94, 0x87, 0x95,\n                                                       0x89, 0x19, 0x13, 0xb2, 0xca, 0x98, 0x45, 0x5,\n                                                       0x9d, 0x6, 0x98, 0xd1, 0x96, 0x8d, 0x95, 0x8f,\n                                                       0x94, 0x91, 0x19, 0xd9, 0x3d, 0x5, 0x80, 0x7a,\n                                                       0x85, 0x78, 0x77, 0x1a, 0x53, 0xb8, 0x5d, 0xc4,\n                                                       0xc4, 0xb9, 0xb9, 0xc4, 0x1e, 0x13, 0xca, 0xd2,\n                                                       0xc3, 0x5d, 0xb9, 0x53, 0x78, 0x78, 0x85, 0x81,\n                                                       0x7b, 0x1e, 0x3d, 0xd9, 0x91, 0x94, 0x8e, 0x95,\n                                                       0x8e, 0x95, 0x19, 0xcd, 0x97, 0x5, 0x9d, 0x7,\n                                                       0x4b, 0x97, 0x89, 0x96, 0x87, 0x96, 0x85, 0x95,\n                                                       0x19, 0xd6, 0xd7, 0x5, 0x81, 0x9c, 0x9e, 0x85,\n                                                       0x9f, 0x1b, 0xc4, 0xb9, 0xb9, 0xc4, 0xc4, 0x5d,\n                                                       0xb8, 0x52, 0x1f, 0x13, 0xd2, 0xc6, 0x53, 0x5c,\n                                                       0x5e, 0x52, 0x78, 0x91, 0x78, 0x95, 0x7a, 0x1f,\n                                                       0x3e, 0x40, 0x81, 0x92, 0x81, 0x90, 0x7f, 0x8d,\n                                                       0x19, 0x7f, 0xc9, 0x5, 0x79, 0x6, 0x7f, 0x4c,\n                                                       0x80, 0x88, 0x81, 0x87, 0x81, 0x85, 0x19, 0x41,\n                                                       0xd6, 0x5, 0x95, 0x9b, 0x90, 0x9e, 0x9e, 0x1a,\n                                                       0xc4, 0x5d, 0xb9, 0x52, 0x52, 0x5e, 0x5e, 0x52,\n                                                       0x1e, 0x13, 0xc6, 0xa6, 0x52, 0xb8, 0x5d, 0xc4,\n                                                       0x9e, 0x9f, 0x91, 0x95, 0x9b, 0x1e, 0xd6, 0x3f,\n                                                       0x85, 0x81, 0x87, 0x80, 0x89, 0x80, 0x19, 0x48,\n                                                       0x7f, 0x5, 0x79, 0x7, 0xd0, 0x7e, 0x8e, 0x81,\n                                                       0x8e, 0x82, 0x91, 0x82, 0x19, 0xf7, 0x8f, 0xf7,\n                                                       0x9e, 0x15, 0xa6, 0x9f, 0x9f, 0xa6, 0xa6, 0x9f,\n                                                       0x77, 0x70, 0x70, 0x77, 0x77, 0x70, 0x70, 0x77,\n                                                       0x9f, 0xa6, 0x1e, 0xfb, 0x6e, 0xfb, 0x68, 0x15,\n                                                       0x13, 0xb2, 0xb2, 0xa5, 0xa0, 0xa1, 0xa5, 0xa5,\n                                                       0xa1, 0x75, 0x71, 0x71, 0x75, 0x74, 0x71, 0x71,\n                                                       0x76, 0xa3, 0xa4, 0x1e, 0xf7, 0x6d, 0xfb, 0x6f,\n                                                       0x15, 0x13, 0xca, 0xd2, 0xa5, 0xa1, 0xa1, 0xa5,\n                                                       0xa5, 0xa0, 0x75, 0x71, 0x71, 0x76, 0x76, 0x71,\n                                                       0x71, 0x75, 0xa0, 0xa5, 0x1e, 0xfc, 0x43, 0xf8,\n                                                       0x43, 0x15, 0xa5, 0xa1, 0xa0, 0x69, 0xa, 0xa1,\n                                                       0xa5, 0x1e, 0xfc, 0x43, 0x4, 0xa5, 0xa1, 0xa1,\n                                                       0x69, 0xa, 0xa0, 0xa5, 0x1e, 0xe, 0x9f, 0xf7,\n                                                       0x18, 0xfb, 0x4, 0x76, 0xf7, 0x77, 0xc8, 0x6c,\n                                                       0xf7, 0x15, 0x69, 0xd0, 0x48, 0xce, 0xea, 0xf7,\n                                                       0x10, 0xfb, 0x10, 0xf7, 0x11, 0x12, 0xd5, 0xf7,\n                                                       0x13, 0xfb, 0x12, 0xf7, 0x12, 0xea, 0xcd, 0x49,\n                                                       0xce, 0x6a, 0xf7, 0x14, 0x6b, 0xcb, 0x4d, 0xc9,\n                                                       0xea, 0xf7, 0x15, 0xfb, 0x15, 0xf7, 0x16, 0x13,\n                                                       0xa5, 0xa2, 0x80, 0xf7, 0xc4, 0xf7, 0xaa, 0x15,\n                                                       0x9e, 0x72, 0x6d, 0x95, 0x6c, 0x1b, 0x3c, 0x4a,\n                                                       0x4b, 0x3c, 0x3c, 0xcc, 0x4a, 0xda, 0xda, 0xcc,\n                                                       0xc9, 0xdb, 0xaa, 0x80, 0xaa, 0x79, 0xa4, 0x1f,\n                                                       0x13, 0x51, 0x55, 0x0, 0x9f, 0x9a, 0xa1, 0x92,\n                                                       0xa3, 0x1b, 0xa6, 0x9c, 0x83, 0x78, 0x9d, 0x1f,\n                                                       0x78, 0x72, 0x80, 0x6c, 0x6c, 0x1a, 0x3c, 0xce,\n                                                       0x4b, 0xd9, 0xda, 0xcb, 0xcb, 0xda, 0xda, 0x4a,\n                                                       0xcc, 0x3c, 0x6d, 0x6d, 0x81, 0x79, 0x73, 0x1e,\n                                                       0x13, 0xaa, 0x48, 0x80, 0x76, 0x9e, 0x84, 0x99,\n                                                       0xa8, 0x1a, 0xa4, 0x94, 0x9d, 0x9d, 0x9d, 0x1e,\n                                                       0x78, 0xa4, 0xaa, 0x80, 0xaa, 0x1b, 0xda, 0xcb,\n                                                       0xce, 0xd9, 0xda, 0x4b, 0xcb, 0x3c, 0x1f, 0x13,\n                                                       0x91, 0x52, 0x80, 0x3c, 0x4a, 0x49, 0x3c, 0x6d,\n                                                       0x95, 0x6d, 0x9d, 0x73, 0x1f, 0x78, 0x79, 0x7a,\n                                                       0x85, 0x71, 0x1b, 0x73, 0x77, 0x91, 0x9e, 0x7a,\n                                                       0x1f, 0x9d, 0xa4, 0x96, 0xa9, 0xaa, 0x1a, 0xda,\n                                                       0x4a, 0xcc, 0x3c, 0x3c, 0x4a, 0x4b, 0x3c, 0x1e,\n                                                       0x13, 0xa5, 0x48, 0x80, 0x3c, 0xcd, 0x4a, 0xda,\n                                                       0xa9, 0xa9, 0x95, 0x9d, 0xa3, 0x1e, 0x9d, 0x79,\n                                                       0x93, 0x7b, 0x71, 0x1a, 0x6f, 0x85, 0x7c, 0x77,\n                                                       0x77, 0x1e, 0x13, 0xa5, 0x52, 0x80, 0xf7, 0x4e,\n                                                       0xf7, 0x65, 0x42, 0xa, 0xfb, 0xb5, 0xf7, 0xb4,\n                                                       0x42, 0xa, 0xe, 0x5a, 0x8b, 0xf7, 0xc, 0x6d,\n                                                       0xf6, 0x22, 0xa7, 0xbf, 0x93, 0x83, 0x95, 0xb2,\n                                                       0xe8, 0x30, 0xe9, 0x66, 0xf7, 0xb, 0x39, 0xbd,\n                                                       0x63, 0xa4, 0x72, 0xf7, 0x17, 0x2f, 0xac, 0x6c,\n                                                       0xe5, 0xa3, 0xa7, 0x6f, 0xf6, 0x31, 0x96, 0xc0,\n                                                       0xa3, 0xe7, 0x77, 0x12, 0xf7, 0x24, 0xab, 0x6e,\n                                                       0xf4, 0x71, 0x95, 0xb4, 0xe8, 0x30, 0xf7, 0x20,\n                                                       0x38, 0xae, 0x68, 0xf7, 0xb, 0x35, 0xbd, 0x59,\n                                                       0xf7, 0x26, 0xfb, 0x18, 0xa4, 0x97, 0xe7, 0xa5,\n                                                       0xf5, 0x2f, 0x98, 0xbe, 0xa9, 0x7e, 0xa, 0xf8,\n                                                       0x4d, 0xf8, 0x14, 0x79, 0xa, 0x93, 0x9c, 0x86,\n                                                       0x90, 0x86, 0x92, 0x78, 0x81, 0x7c, 0x7b, 0x7b,\n                                                       0x7a, 0x83, 0x7a, 0x90, 0x86, 0x8, 0x9e, 0xfb,\n                                                       0x14, 0x78, 0xa, 0x83, 0x9c, 0x7b, 0x9c, 0x7c,\n                                                       0x9b, 0x78, 0x94, 0x86, 0x86, 0x86, 0x85, 0x93,\n                                                       0x7a, 0x9b, 0x7b, 0x8, 0xfb, 0x28, 0xf7, 0x28,\n                                                       0x78, 0xa, 0x82, 0x9c, 0x7b, 0x9c, 0x7c, 0x9b,\n                                                       0x78, 0x95, 0x86, 0x84, 0x86, 0x86, 0x94, 0x7a,\n                                                       0x9b, 0x7b, 0x8, 0xd2, 0xfb, 0x74, 0x15, 0x13,\n                                                       0x44, 0x54, 0xea, 0xb, 0x94, 0x7f, 0x78, 0x93,\n                                                       0x7d, 0x1b, 0x6a, 0x71, 0x74, 0x6c, 0x70, 0x9f,\n                                                       0x71, 0xab, 0x1f, 0x13, 0x34, 0x54, 0xe8, 0x83,\n                                                       0x90, 0x91, 0x8c, 0x8c, 0x90, 0x1f, 0x8c, 0x8d,\n                                                       0x8b, 0x8c, 0x1b, 0x87, 0x85, 0x80, 0x80, 0x77,\n                                                       0x1a, 0x13, 0x94, 0x54, 0xe8, 0x83, 0x6d, 0xa6,\n                                                       0x72, 0xab, 0xac, 0xa6, 0xa4, 0xa9, 0xa0, 0x83,\n                                                       0x92, 0x87, 0x93, 0x1e, 0x93, 0x89, 0x5, 0x89,\n                                                       0x93, 0x92, 0x8b, 0x92, 0x1b, 0x13, 0x44, 0x54,\n                                                       0xe8, 0x23, 0xa7, 0x99, 0xa7, 0xa8, 0x1f, 0x13,\n                                                       0x44, 0x54, 0xe8, 0x83, 0xaa, 0x70, 0xa1, 0x6a,\n                                                       0x1e, 0x13, 0x8a, 0x24, 0xec, 0x1c, 0x7d, 0x74,\n                                                       0x85, 0x82, 0x81, 0x1f, 0x8c, 0xb5, 0x89, 0xc7,\n                                                       0xa1, 0xa1, 0xa4, 0xa4, 0xc4, 0x8b, 0xb7, 0x87,\n                                                       0x8, 0x81, 0x81, 0x84, 0x76, 0x7d, 0x1a, 0x6a,\n                                                       0xa3, 0x71, 0xaa, 0xa4, 0xa5, 0xa0, 0xa8, 0x91,\n                                                       0x8a, 0x91, 0x8a, 0x91, 0x1e, 0x8c, 0x8b, 0x8e,\n                                                       0x8c, 0x1a, 0x13, 0x91, 0x4, 0xec, 0x1b, 0x87,\n                                                       0x93, 0x95, 0x7f, 0x9d, 0x1b, 0xaa, 0xa4, 0xa7,\n                                                       0xab, 0xac, 0x72, 0xa5, 0x6c, 0x77, 0x86, 0x83,\n                                                       0x87, 0x83, 0x1f, 0x8c, 0x94, 0x5, 0x8c, 0x90,\n                                                       0x8b, 0x90, 0x90, 0x1a, 0x13, 0x94, 0x24, 0xec,\n                                                       0x1c, 0xac, 0x73, 0x99, 0x6a, 0x6d, 0x75, 0x72,\n                                                       0x6a, 0x1e, 0x13, 0x94, 0x51, 0xec, 0x1b, 0x7b,\n                                                       0x90, 0x77, 0x94, 0x7f, 0x1e, 0x54, 0x8a, 0x5e,\n                                                       0x8b, 0x74, 0xa2, 0x71, 0xa5, 0x91, 0xc8, 0x8a,\n                                                       0xb1, 0x8, 0x13, 0x94, 0x52, 0x6c, 0x1b, 0x82,\n                                                       0x95, 0xa0, 0x83, 0x98, 0x1b, 0xac, 0xa6, 0xa2,\n                                                       0xaa, 0xa6, 0x76, 0xa5, 0x6c, 0x1f, 0x13, 0x94,\n                                                       0x54, 0xe9, 0x1b, 0x86, 0x86, 0x8a, 0x8a, 0x85,\n                                                       0x1f, 0x88, 0x8a, 0x8b, 0x8a, 0x1b, 0x8f, 0x92,\n                                                       0x96, 0x96, 0x9e, 0x1a, 0xa9, 0x71, 0xa4, 0x6a,\n                                                       0x6b, 0x70, 0x72, 0x6d, 0x76, 0x92, 0x84, 0x8f,\n                                                       0x83, 0x1e, 0x83, 0x8d, 0x5, 0x8d, 0x84, 0x85,\n                                                       0x8b, 0x86, 0x1b, 0x7e, 0xa, 0x6d, 0x7d, 0x70,\n                                                       0x6d, 0x6c, 0xa4, 0x75, 0xac, 0x9b, 0x9f, 0x91,\n                                                       0x94, 0x97, 0x1f, 0x8a, 0x69, 0x92, 0x4e, 0x6f,\n                                                       0x6f, 0x7a, 0x7a, 0x45, 0x85, 0x65, 0x8c, 0x8,\n                                                       0x13, 0x91, 0x4, 0xd4, 0x1b, 0x94, 0x97, 0x92,\n                                                       0x9e, 0x99, 0x1a, 0xac, 0x74, 0xa5, 0x6d, 0x72,\n                                                       0x70, 0x79, 0x6f, 0x84, 0x8a, 0x84, 0x8d, 0x83,\n                                                       0x1e, 0x8a, 0x8b, 0x8a, 0x88, 0x1a, 0x8f, 0x83,\n                                                       0x83, 0x97, 0x77, 0x1b, 0x6c, 0x72, 0x70, 0x6a,\n                                                       0x6a, 0xa4, 0x71, 0xaa, 0xa0, 0x91, 0x93, 0x8f,\n                                                       0x91, 0x1f, 0x7e, 0xa, 0x8a, 0x82, 0x5, 0x8a,\n                                                       0x86, 0x8b, 0x87, 0x87, 0x1a, 0x69, 0xa2, 0x7c,\n                                                       0xad, 0x1e, 0x13, 0x92, 0x54, 0xd4, 0x1b, 0xaa,\n                                                       0xa0, 0xa4, 0xac, 0x9b, 0x86, 0x9f, 0x82, 0x97,\n                                                       0x1f, 0xb3, 0x8e, 0xc4, 0x8d, 0xa5, 0x71, 0x8,\n                                                       0xa4, 0x72, 0x88, 0x49, 0x68, 0x1a, 0x30, 0xc3,\n                                                       0x79, 0xa, 0x94, 0x9c, 0x86, 0x91, 0x86, 0x90,\n                                                       0x78, 0x82, 0x7c, 0x7b, 0x7b, 0x7a, 0x82, 0x7a,\n                                                       0x90, 0x86, 0x8, 0xf7, 0xa5, 0xf5, 0x50, 0xa,\n                                                       0x1e, 0x13, 0x94, 0x8c, 0xe8, 0x4b, 0x51, 0xa,\n                                                       0xfb, 0x58, 0xf7, 0x56, 0x44, 0xa, 0xfb, 0x56,\n                                                       0xfb, 0x58, 0x44, 0xa, 0xf7, 0x59, 0xfb, 0x56,\n                                                       0x44, 0xa, 0xe, 0x5d, 0x9b, 0x76, 0xf7, 0xd1,\n                                                       0xc3, 0xf7, 0xd1, 0x77, 0x1, 0xf8, 0x6, 0xbf,\n                                                       0x3, 0xf7, 0x94, 0xf7, 0x57, 0x15, 0xf7, 0x20,\n                                                       0xfb, 0x5c, 0xf7, 0x20, 0xf7, 0x5c, 0xf7, 0x6f,\n                                                       0xf7, 0x25, 0xfb, 0x6f, 0xf7, 0x25, 0xfb, 0x20,\n                                                       0xf7, 0x5c, 0xfb, 0x20, 0xfb, 0x5c, 0xfb, 0x6f,\n                                                       0xfb, 0x25, 0x5, 0xf8, 0x15, 0xad, 0x15, 0xa3,\n                                                       0xc2, 0xc8, 0xa4, 0x90, 0x8f, 0x88, 0x86, 0x72,\n                                                       0x4f, 0x51, 0x73, 0x87, 0x8a, 0x8d, 0x8f, 0x1e,\n                                                       0x52, 0x85, 0x15, 0x73, 0x4f, 0xc5, 0xa4, 0x90,\n                                                       0x8f, 0x8e, 0x90, 0xa4, 0xc2, 0x4e, 0x73, 0x87,\n                                                       0x8a, 0x89, 0x87, 0x1f, 0xc4, 0x4d, 0x15, 0x8f,\n                                                       0x8c, 0x8d, 0x8f, 0xa3, 0xc7, 0x51, 0x72, 0x86,\n                                                       0x87, 0x88, 0x86, 0x72, 0x54, 0xc8, 0xa3, 0x1e,\n                                                       0xfb, 0x21, 0x3e, 0x15, 0xa4, 0xc7, 0xc5, 0xa3,\n                                                       0x8f, 0x8c, 0x89, 0x87, 0x73, 0x54, 0x4e, 0x72,\n                                                       0x86, 0x87, 0x8e, 0x90, 0x1e, 0xe, 0x5e, 0x78,\n                                                       0xf9, 0x54, 0x1, 0xb1, 0xf9, 0x62, 0x3, 0xf7,\n                                                       0x99, 0xf7, 0x58, 0x15, 0xf7, 0x1c, 0xfb, 0x6b,\n                                                       0xf7, 0x27, 0xf7, 0x73, 0xf7, 0x68, 0xf7, 0x1c,\n                                                       0xfb, 0x6e, 0xf7, 0x22, 0xfb, 0x21, 0xf7, 0x5f,\n                                                       0xfb, 0x1e, 0xfb, 0x5f, 0xfb, 0x71, 0xfb, 0x22,\n                                                       0x5, 0xf7, 0x7e, 0xfb, 0x1a, 0x15, 0x9e, 0xca,\n                                                       0xfb, 0x36, 0xbc, 0x92, 0x9d, 0x83, 0x9d, 0xf7,\n                                                       0x33, 0xc7, 0x79, 0xc6, 0xc4, 0x78, 0xbc, 0xf7,\n                                                       0x37, 0xa1, 0x7e, 0xa0, 0x99, 0xbf, 0xfb, 0x33,\n                                                       0xc8, 0x9a, 0x79, 0x52, 0xf7, 0x35, 0x55, 0x84,\n                                                       0x78, 0x95, 0x7a, 0xfb, 0x33, 0x55, 0x9e, 0x4d,\n                                                       0x4f, 0xa1, 0x4f, 0xfb, 0x37, 0x77, 0x93, 0x79,\n                                                       0x82, 0x5c, 0xf7, 0x32, 0x5, 0xe, 0x74, 0x3a,\n                                                       0xa, 0xf7, 0xd6, 0xf7, 0x78, 0x3, 0xf7, 0x45,\n                                                       0x7d, 0x15, 0xf7, 0x7b, 0xf7, 0x3d, 0xf7, 0x7c,\n                                                       0xfb, 0x3d, 0x31, 0xf7, 0xa9, 0xf7, 0x7c, 0xf7,\n                                                       0x41, 0x5, 0xfb, 0xb5, 0x6, 0x36, 0xf7, 0xa1,\n                                                       0x35, 0xfb, 0xa1, 0x5, 0xfb, 0xb3, 0x6, 0xf7,\n                                                       0x7e, 0xfb, 0x41, 0x5, 0xe, 0x7b, 0x92, 0x76,\n                                                       0xf8, 0x4c, 0xa6, 0xf7, 0x90, 0x54, 0xa, 0xf9,\n                                                       0x84, 0x3, 0xf7, 0x46, 0x7d, 0x15, 0xf7, 0x7d,\n                                                       0xf7, 0x2d, 0xf7, 0x7d, 0xfb, 0x2d, 0x45, 0xf7,\n                                                       0xa3, 0xf7, 0x69, 0xf7, 0x4f, 0xfb, 0xa8, 0x9e,\n                                                       0x27, 0xf7, 0x86, 0x27, 0xfb, 0x86, 0xfb, 0xa8,\n                                                       0x78, 0xf7, 0x60, 0xfb, 0x4f, 0x5, 0x63, 0xfb,\n                                                       0x86, 0x15, 0xe6, 0xf7, 0x8e, 0xfb, 0x71, 0xf7,\n                                                       0x3b, 0xf7, 0xa1, 0x80, 0xd4, 0xf7, 0x90, 0xd4,\n                                                       0xfb, 0x90, 0xf7, 0xa1, 0x96, 0xfb, 0x78, 0xfb,\n                                                       0x3b, 0xec, 0xfb, 0x8e, 0xfb, 0x67, 0xf7, 0x44,\n                                                       0x5, 0xe, 0x59, 0x92, 0x76, 0xf9, 0x45, 0xa9,\n                                                       0x8b, 0x54, 0xa, 0xb9, 0xf9, 0xd, 0xb3, 0x3,\n                                                       0xae, 0xf7, 0xec, 0x15, 0xfb, 0x5b, 0xf7, 0x37,\n                                                       0xfb, 0x33, 0xf7, 0x59, 0xf7, 0x5b, 0xf7, 0x34,\n                                                       0xf7, 0x36, 0xf7, 0x5a, 0xf7, 0x5a, 0xfb, 0x34,\n                                                       0xf7, 0x35, 0xfb, 0x5a, 0xfb, 0x5d, 0xfb, 0x34,\n                                                       0xfb, 0x35, 0xfb, 0x5c, 0x1e, 0xf7, 0x32, 0xfb,\n                                                       0xa3, 0x15, 0xda, 0xf7, 0x7e, 0xfb, 0x53, 0xf7,\n                                                       0x24, 0x5, 0xf7, 0x84, 0x6, 0xd6, 0xf7, 0x74,\n                                                       0xd7, 0xfb, 0x74, 0x5, 0xf7, 0x86, 0x6, 0xfb,\n                                                       0x59, 0xfb, 0x24, 0xd4, 0xfb, 0x7e, 0xfb, 0x56,\n                                                       0xf7, 0x25, 0x5, 0xe, 0x8d, 0x92, 0x76, 0xf7,\n                                                       0x53, 0xad, 0x8b, 0xf7, 0x4f, 0xf7, 0xc7, 0x77,\n                                                       0x1, 0xf7, 0xb1, 0xac, 0x8b, 0xf7, 0x50, 0x8b,\n                                                       0xaf, 0x3, 0xf7, 0x49, 0x7d, 0x15, 0xf7, 0x7e,\n                                                       0xf7, 0x53, 0xf7, 0x84, 0xfb, 0x53, 0xfb, 0x5,\n                                                       0xf7, 0xb0, 0xf7, 0x9d, 0xf7, 0x26, 0xfb, 0xcc,\n                                                       0x89, 0x36, 0xf7, 0xb7, 0x3b, 0xfb, 0xb7, 0xfb,\n                                                       0xbb, 0x8d, 0xf7, 0x8e, 0xfb, 0x26, 0x5, 0xac,\n                                                       0xb3, 0x15, 0xbf, 0xb6, 0xaf, 0xbf, 0xbd, 0xb6,\n                                                       0x66, 0x58, 0x59, 0x63, 0x5a, 0x56, 0x58, 0x5f,\n                                                       0xb9, 0xc0, 0x1e, 0xe, 0x7b, 0xb2, 0x76, 0xf7,\n                                                       0x7b, 0xf7, 0x4a, 0x86, 0xb0, 0xf7, 0xa7, 0x77,\n                                                       0x12, 0xf7, 0xd4, 0xf7, 0x4a, 0x13, 0xb8, 0xf7,\n                                                       0x45, 0x35, 0xa, 0xec, 0x15, 0x13, 0xd8, 0x59,\n                                                       0xb4, 0x62, 0xbd, 0xbd, 0xb4, 0xb4, 0xbd, 0xbd,\n                                                       0x62, 0xb4, 0x59, 0x59, 0x62, 0x62, 0x59, 0x1e,\n                                                       0xe, 0xfb, 0xc, 0xc6, 0xa8, 0xf7, 0x5c, 0xc7,\n                                                       0x9e, 0xe1, 0xb3, 0xaf, 0x75, 0x77, 0xf7, 0x39,\n                                                       0x77, 0x12, 0xf8, 0xae, 0xa2, 0xce, 0xa5, 0x13,\n                                                       0xef, 0xf8, 0xae, 0xf8, 0x6a, 0x15, 0x90, 0x8d,\n                                                       0x97, 0x90, 0x8e, 0x8f, 0x8f, 0x9a, 0x8b, 0xa1,\n                                                       0x8a, 0x9c, 0x7b, 0x7b, 0x73, 0x82, 0x7e, 0x88,\n                                                       0x8, 0x8b, 0x9f, 0x71, 0x95, 0x80, 0x1e, 0xfc,\n                                                       0xc, 0x97, 0x15, 0x97, 0x96, 0xd0, 0xb5, 0xdb,\n                                                       0xaf, 0xbb, 0xa1, 0xc7, 0xa2, 0xa6, 0x94, 0x8,\n                                                       0x9c, 0x91, 0x94, 0x8d, 0x90, 0x1a, 0x94, 0x52,\n                                                       0x90, 0x7e, 0x7e, 0x4d, 0x73, 0x68, 0x3b, 0x1e,\n                                                       0x3b, 0x68, 0x34, 0x5f, 0x7f, 0x1a, 0x80, 0xa4,\n                                                       0x83, 0x99, 0x85, 0x1e, 0x99, 0x85, 0x92, 0x8d,\n                                                       0x95, 0x94, 0x8, 0xfb, 0xe, 0x4c, 0x15, 0x75,\n                                                       0x95, 0xaf, 0x6d, 0xaf, 0x1b, 0xaf, 0xbd, 0xaf,\n                                                       0x96, 0x93, 0x1f, 0x91, 0x98, 0x95, 0xa2, 0x9e,\n                                                       0x99, 0x9e, 0x98, 0xb2, 0xa1, 0xab, 0x9b, 0xa2,\n                                                       0x97, 0xb3, 0x9f, 0xb1, 0x8c, 0x9c, 0x8c, 0xa1,\n                                                       0x85, 0x9c, 0x78, 0xa2, 0x91, 0xb0, 0x9c, 0x8a,\n                                                       0x95, 0x8, 0xa3, 0x8a, 0x6f, 0xbd, 0x7e, 0x1b,\n                                                       0x82, 0x26, 0x66, 0x6a, 0x42, 0x1f, 0x42, 0x6a,\n                                                       0x47, 0x5c, 0x83, 0x86, 0x8, 0x86, 0x83, 0x7b,\n                                                       0x79, 0x81, 0x1b, 0x81, 0x79, 0x94, 0x90, 0x7e,\n                                                       0x1f, 0x83, 0x8e, 0x79, 0x97, 0x83, 0x95, 0x7e,\n                                                       0x7f, 0x81, 0x7d, 0x80, 0x5c, 0x8, 0xf7, 0xf,\n                                                       0xfb, 0x29, 0x15, 0x8b, 0xf7, 0x7c, 0xfb, 0x4d,\n                                                       0x97, 0x81, 0x1e, 0x81, 0x97, 0x9a, 0x85, 0x92,\n                                                       0x1b, 0x92, 0x90, 0x8e, 0x92, 0x96, 0x1f, 0x96,\n                                                       0x92, 0xf7, 0x2c, 0xf4, 0x96, 0x94, 0x8, 0x96,\n                                                       0x94, 0x8f, 0x9d, 0x98, 0x98, 0x8c, 0x94, 0x9d,\n                                                       0x1a, 0x9d, 0x86, 0x9b, 0x7a, 0xa3, 0x1e, 0x7a,\n                                                       0xa3, 0x29, 0xf7, 0x9, 0x80, 0x98, 0x83, 0x95,\n                                                       0x7f, 0xa0, 0x7a, 0x94, 0x8, 0x13, 0xf7, 0x83,\n                                                       0x8f, 0x82, 0x8f, 0x7d, 0x8a, 0x77, 0x8a, 0x66,\n                                                       0x7e, 0x6d, 0x7b, 0x78, 0x81, 0x61, 0x77, 0x72,\n                                                       0x78, 0x77, 0x7b, 0x84, 0x72, 0x88, 0x74, 0x84,\n                                                       0x54, 0x87, 0x79, 0x84, 0x83, 0x80, 0x7e, 0x73,\n                                                       0x7d, 0x78, 0x87, 0x8, 0xfb, 0x15, 0xf7, 0x11,\n                                                       0x15, 0x8c, 0x7a, 0x8d, 0x6b, 0x90, 0x75, 0x8,\n                                                       0x77, 0x97, 0xb3, 0x77, 0xa9, 0x1b, 0xa9, 0xa8,\n                                                       0x94, 0x9e, 0x9e, 0x1f, 0x92, 0xa1, 0x8f, 0xa9,\n                                                       0x8e, 0xa2, 0x8, 0x80, 0x81, 0x67, 0x6b, 0x5d,\n                                                       0x1b, 0x5d, 0x6c, 0xaf, 0x9a, 0x7e, 0x1f, 0xf8,\n                                                       0x44, 0x8e, 0x15, 0x76, 0xa2, 0xae, 0xa0, 0x9f,\n                                                       0x74, 0x5, 0x87, 0x54, 0x15, 0x79, 0xa0, 0xac,\n                                                       0xa0, 0x9c, 0x76, 0x5, 0x88, 0x55, 0x15, 0x79,\n                                                       0x9e, 0xaa, 0xa1, 0x9d, 0x77, 0x5, 0x53, 0x4,\n                                                       0x77, 0xa2, 0xa9, 0xa0, 0x9f, 0x77, 0x5, 0xfb,\n                                                       0x40, 0xb9, 0x15, 0x75, 0xa2, 0xaf, 0xa3, 0xa1,\n                                                       0x73, 0x5, 0x86, 0x51, 0x15, 0x77, 0xa0, 0xae,\n                                                       0xa3, 0xa0, 0x75, 0x5, 0x86, 0x50, 0x15, 0x78,\n                                                       0x9f, 0xaf, 0xa4, 0x9d, 0x78, 0x5, 0x86, 0x50,\n                                                       0x15, 0x76, 0xa3, 0xad, 0xa4, 0xa0, 0x73, 0x5,\n                                                       0xfb, 0x91, 0xf1, 0x15, 0x97, 0x93, 0xf7, 0x17,\n                                                       0xd9, 0x94, 0x90, 0x8, 0x90, 0x94, 0x94, 0x8f,\n                                                       0x92, 0x1b, 0x92, 0x8c, 0x88, 0x86, 0x86, 0x84,\n                                                       0x88, 0x7e, 0x83, 0x1f, 0x6e, 0x7a, 0x22, 0x4d,\n                                                       0x81, 0x85, 0x8, 0x84, 0x80, 0x7e, 0x7e, 0x80,\n                                                       0x1b, 0x85, 0x88, 0x8b, 0x91, 0x93, 0x90, 0x8e,\n                                                       0x9d, 0x97, 0x1f, 0xd7, 0x58, 0x15, 0x78, 0xa2,\n                                                       0xab, 0x9f, 0x9f, 0x74, 0x5, 0x8e, 0x51, 0x15,\n                                                       0x76, 0xa2, 0xa8, 0xa0, 0xa1, 0x74, 0x5, 0x8c,\n                                                       0x53, 0x15, 0x79, 0xa0, 0xa8, 0x9e, 0x9d, 0x78,\n                                                       0x5, 0x8a, 0x54, 0x15, 0x77, 0xa2, 0xa9, 0xa1,\n                                                       0xa1, 0x72, 0x5, 0x42, 0x48, 0x15, 0x83, 0x95,\n                                                       0x2f, 0xf4, 0x7c, 0x9c, 0x7c, 0x9c, 0x8c, 0x94,\n                                                       0x8f, 0x8e, 0x90, 0x8f, 0x9c, 0x7c, 0x93, 0x82,\n                                                       0x95, 0x80, 0xe6, 0x20, 0x92, 0x84, 0x8, 0x84,\n                                                       0x92, 0x93, 0x87, 0x8f, 0x1b, 0x8f, 0x95, 0x91,\n                                                       0x90, 0x92, 0x1f, 0x92, 0x90, 0xf7, 0x6, 0xd8,\n                                                       0x92, 0x90, 0x8, 0x90, 0x92, 0x94, 0x92, 0x8f,\n                                                       0x1b, 0x8f, 0x91, 0x88, 0x86, 0x86, 0x82, 0x84,\n                                                       0x82, 0x86, 0x1f, 0x82, 0x86, 0xfb, 0x16, 0x33,\n                                                       0x84, 0x86, 0x84, 0x86, 0x89, 0x89, 0x89, 0x85,\n                                                       0x89, 0x85, 0x8c, 0x70, 0x8a, 0x82, 0x8, 0x78,\n                                                       0x88, 0x8b, 0x79, 0x86, 0x1b, 0x86, 0x88, 0x95,\n                                                       0x9b, 0x93, 0x88, 0x9e, 0x8a, 0x9d, 0x1f, 0x8a,\n                                                       0x95, 0x86, 0x94, 0x83, 0x95, 0x8, 0xe, 0x85,\n                                                       0xb2, 0x76, 0xf8, 0x2, 0xb5, 0x8b, 0xb0, 0xf7,\n                                                       0xa7, 0x77, 0x1, 0xf7, 0x4a, 0x35, 0xa, 0x6e,\n                                                       0x15, 0xe6, 0xd7, 0xe6, 0x3f, 0x5f, 0xf7, 0x3,\n                                                       0xf0, 0xca, 0xfb, 0xb, 0x83, 0x6e, 0xf7, 0x7,\n                                                       0x6e, 0xfb, 0x7, 0xfb, 0xb, 0x93, 0xf0, 0x4c,\n                                                       0x5, 0xe, 0x74, 0xb2, 0x76, 0xf7, 0x75, 0xa9,\n                                                       0xf7, 0x19, 0xa5, 0x85, 0xb0, 0xf7, 0xa7, 0x77,\n                                                       0x12, 0x13, 0xe8, 0xf7, 0x42, 0x4f, 0xa, 0x5,\n                                                       0x13, 0xd8, 0x32, 0xa, 0xfb, 0x10, 0x42, 0x15,\n                                                       0xf7, 0x10, 0xf2, 0xf7, 0x10, 0x24, 0x4f, 0xf7,\n                                                       0x29, 0xf7, 0x1c, 0xe1, 0xfb, 0x34, 0x81, 0x63,\n                                                       0xf7, 0x30, 0x63, 0xfb, 0x30, 0xfb, 0x34, 0x95,\n                                                       0xf7, 0x1c, 0x35, 0x5, 0xe, 0x83, 0x92, 0x76,\n                                                       0xf8, 0x3f, 0xa0, 0xf7, 0xa3, 0x77, 0x1, 0xf8,\n                                                       0x38, 0xd9, 0x3, 0xf7, 0x3f, 0x7d, 0x15, 0xf7,\n                                                       0x8d, 0xf7, 0x44, 0xf7, 0x95, 0xfb, 0x44, 0x25,\n                                                       0xf7, 0xae, 0xf7, 0x71, 0xf7, 0x3a, 0x5, 0xfb,\n                                                       0xad, 0x6, 0x2c, 0xf7, 0xa3, 0x2a, 0xfb, 0xa3,\n                                                       0x5, 0xfb, 0xb4, 0x6, 0xf7, 0x7d, 0xfb, 0x3a,\n                                                       0x5, 0xf7, 0x2c, 0xba, 0x15, 0x38, 0xed, 0xde,\n                                                       0xf7, 0x8d, 0x5, 0xfb, 0xef, 0x4, 0xd9, 0xed,\n                                                       0x5, 0xf7, 0x92, 0x6, 0xfc, 0x61, 0xfb, 0x1f,\n                                                       0x15, 0xfb, 0x69, 0xf7, 0x24, 0xf7, 0xea, 0x24,\n                                                       0x5, 0x8b, 0x4, 0xf7, 0x19, 0x62, 0xf2, 0xfb,\n                                                       0x9f, 0x5, 0xfc, 0x61, 0x95, 0x15, 0xf7, 0x75,\n                                                       0xf7, 0xbd, 0x5, 0xfb, 0x16, 0x7, 0xe, 0xdf,\n                                                       0x92, 0x76, 0xf8, 0x47, 0xa0, 0xf7, 0x9b, 0x77,\n                                                       0x1, 0xf7, 0xd3, 0xf7, 0xed, 0x3, 0xf7, 0x43,\n                                                       0x92, 0x15, 0xf7, 0xd, 0x76, 0xf7, 0x47, 0xf7,\n                                                       0x17, 0xf7, 0x35, 0xfb, 0x12, 0xf7, 0xf, 0x86,\n                                                       0x2c, 0xf7, 0xa9, 0xf7, 0x74, 0xf7, 0x32, 0x4e,\n                                                       0xa0, 0x5, 0xfb, 0x73, 0x6, 0x37, 0xf7, 0x89,\n                                                       0xfb, 0x4, 0x9d, 0x32, 0xfb, 0x9b, 0x5, 0xfb,\n                                                       0xb0, 0x6, 0xf7, 0x76, 0xfb, 0x41, 0x5, 0x55,\n                                                       0xfb, 0x7c, 0x15, 0xdb, 0xf7, 0x86, 0xfb, 0x53,\n                                                       0xf7, 0x22, 0x5, 0xf7, 0x84, 0x6, 0xdc, 0xf7,\n                                                       0x8b, 0xdd, 0xfb, 0x8b, 0x5, 0xf7, 0x8c, 0x6,\n                                                       0xfb, 0x5f, 0xfb, 0x22, 0xda, 0xfb, 0x91, 0xfb,\n                                                       0x62, 0xf7, 0x38, 0x5, 0xe, 0x2c, 0x9d, 0x76,\n                                                       0xf9, 0x4b, 0x77, 0x1, 0xbf, 0xf9, 0x14, 0x3,\n                                                       0xd2, 0xf7, 0x3, 0x15, 0xf7, 0x82, 0xf7, 0x9,\n                                                       0xf7, 0x2d, 0xfb, 0x7b, 0xa0, 0x98, 0x68, 0xf7,\n                                                       0xa0, 0xf7, 0x88, 0xd6, 0x5, 0xa3, 0x7, 0xfb,\n                                                       0x8c, 0xb3, 0xa2, 0xf7, 0x9e, 0x70, 0x94, 0xfb,\n                                                       0x1e, 0xfb, 0x86, 0xfb, 0x7f, 0xf7, 0x14, 0x7c,\n                                                       0x76, 0xf7, 0x38, 0xfb, 0x71, 0xfb, 0x36, 0xfb,\n                                                       0x5d, 0x5, 0xe, 0xfb, 0x8, 0x9a, 0x76, 0xf7,\n                                                       0x99, 0xf7, 0x3f, 0xf7, 0x9b, 0x77, 0x1, 0xf7,\n                                                       0x85, 0x96, 0x8b, 0xf7, 0x3c, 0x3, 0xc4, 0xf7,\n                                                       0x3, 0x15, 0xf7, 0x91, 0xf7, 0x20, 0xf7, 0x2f,\n                                                       0xfb, 0x95, 0x9e, 0x99, 0x4f, 0xf7, 0xac, 0xf7,\n                                                       0x9b, 0xc9, 0x5, 0xa7, 0x7, 0xfb, 0xa2, 0x9e,\n                                                       0xb8, 0xf7, 0xab, 0x6f, 0x98, 0xfb, 0x16, 0xfb,\n                                                       0xa0, 0xfb, 0x8f, 0xf7, 0x2e, 0x7a, 0x76, 0xf7,\n                                                       0x61, 0xfb, 0x71, 0xfb, 0x5a, 0xfb, 0x5c, 0x5,\n                                                       0xf7, 0x65, 0xf7, 0x64, 0x15, 0xb9, 0xb0, 0xb2,\n                                                       0xbb, 0xba, 0xaf, 0x64, 0x5d, 0x5c, 0x67, 0x64,\n                                                       0x5c, 0x5b, 0x66, 0xb2, 0xba, 0x1e, 0xe, 0x31,\n                                                       0xa0, 0x76, 0xf9, 0x30, 0x77, 0x1, 0xb3, 0xf9,\n                                                       0x31, 0x3, 0xf7, 0x4, 0xf7, 0x10, 0x15, 0xf7,\n                                                       0x83, 0xf7, 0x45, 0xfb, 0x5, 0xfb, 0xa8, 0xb2,\n                                                       0x8a, 0xa4, 0x85, 0xb1, 0x79, 0x19, 0xb4, 0xf7,\n                                                       0xb8, 0xf7, 0x9, 0xfb, 0xa5, 0xa7, 0xa5, 0xa2,\n                                                       0x9b, 0xb1, 0x95, 0x19, 0xfb, 0x48, 0xf7, 0x82,\n                                                       0xf7, 0xa9, 0xfb, 0x3, 0x88, 0xaa, 0x99, 0xb2,\n                                                       0x99, 0xa8, 0x19, 0xfb, 0xb9, 0xb5, 0xf7, 0xa6,\n                                                       0xf7, 0x9, 0x74, 0xa3, 0x76, 0xb0, 0x82, 0xa6,\n                                                       0x19, 0xfb, 0x82, 0xfb, 0x45, 0xf7, 0x4, 0xf7,\n                                                       0xa8, 0x6c, 0x8c, 0x62, 0x96, 0x6f, 0x98, 0x19,\n                                                       0x60, 0xfb, 0xb8, 0xfb, 0x8, 0xf7, 0xa5, 0x77,\n                                                       0x79, 0x68, 0x76, 0x6a, 0x7e, 0x19, 0x8c, 0x6,\n                                                       0xf7, 0x45, 0xfb, 0x82, 0xfb, 0xa8, 0xf7, 0x3,\n                                                       0x5, 0x64, 0x80, 0x70, 0x7c, 0x6a, 0x1e, 0xf7,\n                                                       0xb9, 0x60, 0xfb, 0xa5, 0xfb, 0x8, 0xa4, 0x6f,\n                                                       0x98, 0x74, 0x99, 0x66, 0x19, 0xe, 0x5a, 0x9f,\n                                                       0x76, 0xf8, 0x8f, 0x77, 0xae, 0x77, 0xf7, 0x46,\n                                                       0x77, 0x12, 0xc2, 0xf9, 0x3c, 0x13, 0xd8, 0xeb,\n                                                       0xf7, 0x31, 0x15, 0xf7, 0x8b, 0xf7, 0x6, 0x5c,\n                                                       0xfb, 0xa1, 0x9d, 0x88, 0xe7, 0xf7, 0x93, 0xf7,\n                                                       0x31, 0xfb, 0x73, 0x99, 0x94, 0xfb, 0x7, 0xf7,\n                                                       0x8b, 0xf7, 0xa2, 0x5c, 0x8e, 0x9b, 0xfb, 0x93,\n                                                       0xe9, 0xf7, 0x73, 0xf7, 0x30, 0x5, 0x13, 0xb8,\n                                                       0x80, 0x9a, 0xfb, 0x89, 0xfb, 0x6, 0xba, 0xf7,\n                                                       0xa1, 0x79, 0x8e, 0x2d, 0xfb, 0x93, 0xfb, 0x2f,\n                                                       0xf7, 0x73, 0x7c, 0x82, 0xf7, 0x8, 0xfb, 0x8b,\n                                                       0xfb, 0xa2, 0xba, 0x88, 0x7b, 0xf7, 0x93, 0x2d,\n                                                       0xfb, 0x73, 0xfb, 0x30, 0x5, 0xe, 0x5c, 0x78,\n                                                       0x60, 0xa, 0x8e, 0xbe, 0x7e, 0x67, 0xa, 0x95,\n                                                       0x77, 0xb8, 0xcf, 0x48, 0xcf, 0xd7, 0xa7, 0x8c,\n                                                       0x77, 0x12, 0xb0, 0x60, 0xa, 0x95, 0xbe, 0x77,\n                                                       0x67, 0xa, 0xae, 0xcf, 0x48, 0xcf, 0xd7, 0xa7,\n                                                       0x13, 0xec, 0x52, 0xb4, 0x55, 0x40, 0xf7, 0x8a,\n                                                       0xa1, 0x15, 0x73, 0xa6, 0x7f, 0xb9, 0xae, 0x1a,\n                                                       0xb8, 0x9d, 0xb5, 0xab, 0xab, 0x1e, 0x8d, 0x89,\n                                                       0x5, 0x81, 0x7a, 0x85, 0x76, 0x78, 0x1a, 0x61,\n                                                       0xa3, 0x6c, 0xb4, 0x82, 0x1e, 0x49, 0x97, 0xbf,\n                                                       0x4e, 0xd2, 0x1b, 0xa5, 0xa3, 0x95, 0x9d, 0x9e,\n                                                       0x1f, 0x79, 0x8c, 0x79, 0x92, 0x7b, 0x93, 0x4f,\n                                                       0xa9, 0x65, 0xc3, 0x8a, 0xcf, 0x8e, 0x8c, 0x18,\n                                                       0x64, 0x94, 0xaf, 0x64, 0xb6, 0x1b, 0x9b, 0x9b,\n                                                       0x91, 0x93, 0x98, 0x1f, 0x78, 0xa7, 0xad, 0x80,\n                                                       0xad, 0x1b, 0xc9, 0xc0, 0xb2, 0xcc, 0x8e, 0x1f,\n                                                       0x73, 0x70, 0x5d, 0x7f, 0x68, 0x1b, 0x5e, 0x61,\n                                                       0x9d, 0xab, 0x6b, 0x7f, 0xa, 0x13, 0xd1, 0x52,\n                                                       0xb9, 0x21, 0x40, 0x81, 0x9c, 0xa0, 0x85, 0x9e,\n                                                       0x1b, 0xb5, 0xaa, 0xa3, 0xb4, 0x94, 0x1f, 0xcd,\n                                                       0x97, 0xc8, 0xbf, 0xd2, 0x1a, 0xa5, 0x81, 0xa3,\n                                                       0x79, 0x9e, 0x1e, 0x8a, 0x79, 0x84, 0x79, 0x83,\n                                                       0x7b, 0x6d, 0x4f, 0x53, 0x65, 0x47, 0x8a, 0x8a,\n                                                       0x8e, 0x18, 0xb2, 0x94, 0xb2, 0xaf, 0xb6, 0x1a,\n                                                       0x9b, 0x85, 0x9b, 0x83, 0x98, 0x1e, 0x13, 0xe5,\n                                                       0x52, 0xb9, 0x54, 0xc0, 0x9e, 0xa7, 0x96, 0xad,\n                                                       0xad, 0x1a, 0x13, 0xe5, 0x52, 0xb9, 0x21, 0x40,\n                                                       0xc9, 0x64, 0xc0, 0x4a, 0x8e, 0x1e, 0x13, 0xe5,\n                                                       0x52, 0xb9, 0x54, 0xc0, 0xa3, 0x70, 0x97, 0x5d,\n                                                       0x68, 0x1a, 0x5e, 0x79, 0x61, 0x6b, 0x6b, 0x1e,\n                                                       0x89, 0x8d, 0x5, 0x13, 0xe4, 0x82, 0xb9, 0x49,\n                                                       0x40, 0x95, 0x9c, 0x91, 0xa0, 0x9e, 0x1a, 0xb5,\n                                                       0x73, 0xaa, 0x62, 0x94, 0x1e, 0x13, 0xe5, 0x46,\n                                                       0x79, 0x49, 0x40, 0xcd, 0x7f, 0x57, 0xc8, 0x44,\n                                                       0x1b, 0x71, 0x73, 0x81, 0x79, 0x78, 0x1f, 0x9d,\n                                                       0x8a, 0x9d, 0x84, 0x9b, 0x83, 0xc7, 0x6d, 0xb1,\n                                                       0x53, 0x8c, 0x47, 0x88, 0x8a, 0x18, 0xb2, 0x82,\n                                                       0x67, 0xb2, 0x60, 0x1b, 0x7b, 0x7b, 0x85, 0x83,\n                                                       0x7e, 0x1f, 0x13, 0xe5, 0x51, 0xb9, 0x55, 0x40,\n                                                       0x9e, 0x6f, 0x69, 0x96, 0x69, 0x1b, 0x6e, 0xa,\n                                                       0x4d, 0x56, 0x64, 0x4a, 0x88, 0x1f, 0x13, 0xe5,\n                                                       0x51, 0xb9, 0x55, 0x40, 0xa3, 0xa6, 0xb9, 0x97,\n                                                       0xae, 0x1b, 0xb8, 0xb5, 0x79, 0x6b, 0xab, 0x1f,\n                                                       0x89, 0x89, 0x5, 0x13, 0xe8, 0x22, 0xb9, 0x55,\n                                                       0x40, 0x95, 0x7a, 0x76, 0x91, 0x78, 0x1b, 0x61,\n                                                       0x6c, 0x73, 0x62, 0x82, 0x1f, 0x49, 0x7f, 0x4e,\n                                                       0x57, 0x44, 0x1a, 0x71, 0x95, 0x73, 0x9d, 0x78,\n                                                       0x1e, 0x8c, 0x9d, 0x92, 0x9d, 0x93, 0x9b, 0xa9,\n                                                       0xc7, 0xc3, 0xb1, 0xcf, 0x8c, 0x8c, 0x88, 0x18,\n                                                       0x64, 0x82, 0x64, 0x67, 0x60, 0x1a, 0x7b, 0x91,\n                                                       0x7b, 0x93, 0x7e, 0x1e, 0x78, 0x6f, 0x80, 0x69,\n                                                       0x69, 0x1a, 0x4d, 0xb2, 0x56, 0xcc, 0x88, 0x1e,\n                                                       0xc6, 0xf7, 0x6, 0x15, 0x81, 0x9b, 0x87, 0x9e,\n                                                       0x9e, 0x1a, 0x13, 0xe3, 0x52, 0xb9, 0x55, 0x40,\n                                                       0xb6, 0xa1, 0xbc, 0xb4, 0x9d, 0x1e, 0x8a, 0x8d,\n                                                       0x5, 0x8e, 0x7f, 0x7e, 0x8d, 0x7f, 0x1b, 0x65,\n                                                       0x4c, 0x79, 0x6e, 0x70, 0x1f, 0x6e, 0xa, 0xbd,\n                                                       0x98, 0xc2, 0xb1, 0xbd, 0x1b, 0x96, 0x96, 0x89,\n                                                       0x87, 0x95, 0x1f, 0x8c, 0x8d, 0x73, 0xb6, 0x42,\n                                                       0xb8, 0x59, 0x8a, 0x19, 0x13, 0xe5, 0x4a, 0xb2,\n                                                       0x15, 0x40, 0x95, 0x9b, 0x9e, 0x8f, 0x9e, 0x1b,\n                                                       0x13, 0xe5, 0x52, 0xb8, 0xd5, 0x40, 0xb6, 0xbc,\n                                                       0x75, 0x62, 0x9d, 0x1f, 0x8d, 0x8c, 0x5, 0x8e,\n                                                       0x97, 0x8d, 0x98, 0x97, 0x1a, 0xb1, 0x79, 0xca,\n                                                       0x6e, 0xa6, 0x1e, 0x13, 0xe5, 0x52, 0xb9, 0x21,\n                                                       0x40, 0xbd, 0x7e, 0xb1, 0x54, 0x59, 0x1a, 0x80,\n                                                       0x89, 0x80, 0x87, 0x81, 0x1e, 0x8d, 0x8a, 0xb6,\n                                                       0xa3, 0xb8, 0xd4, 0x8a, 0xbd, 0x19, 0x13, 0xc8,\n                                                       0x82, 0xb9, 0x53, 0x40, 0x95, 0x7b, 0x8f, 0x78,\n                                                       0x78, 0x1a, 0x60, 0x75, 0x5a, 0x62, 0x79, 0x1e,\n                                                       0x8c, 0x89, 0x5, 0x88, 0x97, 0x98, 0x89, 0x97,\n                                                       0x1b, 0xb1, 0xca, 0x9d, 0xa8, 0xa6, 0x1f, 0x59,\n                                                       0x7e, 0x54, 0x65, 0x59, 0x1b, 0x80, 0x80, 0x8d,\n                                                       0x8f, 0x81, 0x1f, 0x8a, 0x89, 0x5, 0x13, 0xe5,\n                                                       0x52, 0xb9, 0x55, 0x40, 0xa3, 0x60, 0xd4, 0x5e,\n                                                       0xbd, 0x8c, 0x8, 0x13, 0xe5, 0x52, 0xb2, 0x21,\n                                                       0x40, 0x81, 0x7b, 0x78, 0x87, 0x78, 0x1b, 0x60,\n                                                       0x5a, 0xa1, 0xb4, 0x79, 0x1f, 0x89, 0x8a, 0x5,\n                                                       0x88, 0x7f, 0x89, 0x7e, 0x7f, 0x1a, 0x65, 0x9d,\n                                                       0x4c, 0xa8, 0x70, 0x1e, 0x59, 0x98, 0x65, 0xc2,\n                                                       0xbd, 0x1a, 0x96, 0x8d, 0x96, 0x8f, 0x95, 0x1e,\n                                                       0x89, 0x8c, 0x5, 0x13, 0xe5, 0x52, 0xb9, 0x55,\n                                                       0x40, 0x60, 0x73, 0x5e, 0x42, 0x8c, 0x59, 0x8,\n                                                       0xd1, 0xf7, 0x39, 0x15, 0xa4, 0x97, 0xa6, 0x86,\n                                                       0x87, 0xa6, 0x98, 0xa4, 0x70, 0x8f, 0x78, 0x9f,\n                                                       0x7e, 0x73, 0x5, 0x6e, 0xa, 0x72, 0x7f, 0x9f,\n                                                       0x77, 0x5, 0xe, 0xfb, 0x24, 0x92, 0x76, 0xf9,\n                                                       0x64, 0x77, 0x1, 0xb2, 0xf8, 0xfd, 0x3, 0xb2,\n                                                       0xf7, 0x3e, 0x15, 0xf7, 0x8d, 0xd7, 0xc6, 0xfb,\n                                                       0x98, 0xc7, 0xf7, 0x98, 0xf7, 0x8d, 0x3e, 0xfb,\n                                                       0x5a, 0xf7, 0x44, 0xf7, 0x5f, 0xf7, 0x44, 0xfb,\n                                                       0x92, 0x3c, 0x51, 0xf7, 0x9c, 0x4e, 0xfb, 0x9c,\n                                                       0xfb, 0x91, 0xda, 0xf7, 0x5e, 0xfb, 0x44, 0x5,\n                                                       0xe, 0x59, 0x4c, 0xa2, 0xf7, 0x6a, 0xa8, 0xf8,\n                                                       0x8a, 0x77, 0x1, 0xf7, 0x51, 0xcd, 0x15, 0x81,\n                                                       0x7c, 0x87, 0x79, 0x79, 0x1a, 0x5b, 0xa4, 0x6d,\n                                                       0xbc, 0xa7, 0xa8, 0x95, 0x97, 0xa5, 0x1e, 0xc0,\n                                                       0xa4, 0xba, 0xb1, 0xb5, 0xb3, 0x8, 0xb4, 0xb6,\n                                                       0xdb, 0xd2, 0xca, 0x1b, 0xa2, 0x9e, 0x82, 0x79,\n                                                       0x99, 0x1f, 0x8f, 0x9c, 0x9d, 0x8e, 0x5, 0xa3,\n                                                       0x7a, 0x72, 0x97, 0x6e, 0x1b, 0x4c, 0x46, 0x56,\n                                                       0x61, 0x5f, 0x1f, 0x5a, 0x58, 0xfb, 0x2, 0x28,\n                                                       0x40, 0x1b, 0x6e, 0x6d, 0xa1, 0xaa, 0x97, 0x8f,\n                                                       0x97, 0x90, 0x96, 0x1f, 0x84, 0x92, 0x99, 0x7d,\n                                                       0x95, 0x1b, 0x90, 0x8e, 0x8d, 0x8f, 0x8e, 0x1f,\n                                                       0xe8, 0xf7, 0x13, 0x5, 0x8f, 0x91, 0x8c, 0x98,\n                                                       0x92, 0x1a, 0x94, 0x89, 0x9f, 0x84, 0x91, 0x1e,\n                                                       0x81, 0x94, 0x77, 0x9b, 0x9a, 0x1a, 0xad, 0xc4,\n                                                       0xe0, 0x9f, 0xa7, 0x1e, 0xa5, 0x9e, 0xb7, 0xc8,\n                                                       0xb1, 0xac, 0xa5, 0x71, 0x95, 0x1b, 0x90, 0x8f,\n                                                       0x8f, 0x8f, 0x8e, 0x1f, 0xe7, 0xf7, 0x13, 0x5,\n                                                       0x8f, 0x90, 0x8b, 0x97, 0x91, 0x1a, 0x93, 0x8b,\n                                                       0x9d, 0x84, 0x91, 0x1e, 0xa0, 0x73, 0x54, 0x9b,\n                                                       0x6c, 0x1b, 0x7c, 0x7d, 0x88, 0x83, 0x7f, 0x1f,\n                                                       0x4a, 0x60, 0x32, 0xfb, 0x5, 0x5c, 0x4a, 0x59,\n                                                       0x46, 0x41, 0xfb, 0x0, 0x72, 0x39, 0x8, 0x88,\n                                                       0x80, 0x89, 0x7e, 0x7f, 0x1a, 0x65, 0x9d, 0x67,\n                                                       0xa2, 0x6e, 0x1e, 0xa8, 0xb3, 0x15, 0x72, 0x9d,\n                                                       0x74, 0xb1, 0xaa, 0x1a, 0xbb, 0xf7, 0x8, 0xf7,\n                                                       0x3f, 0xaa, 0xb6, 0x1e, 0xba, 0xcc, 0xd9, 0xf4,\n                                                       0xcc, 0xb8, 0x8, 0x92, 0x95, 0x97, 0x8d, 0x97,\n                                                       0x1b, 0xa4, 0xad, 0x80, 0x7c, 0x9f, 0x1f, 0x8e,\n                                                       0x88, 0x8f, 0x88, 0x86, 0x1a, 0x83, 0x4d, 0x3a,\n                                                       0x82, 0x7f, 0x1e, 0x88, 0x89, 0x87, 0x87, 0x87,\n                                                       0x84, 0x79, 0x9d, 0x79, 0x1b, 0x7b, 0x7e, 0x85,\n                                                       0x82, 0x7e, 0x1f, 0x54, 0x66, 0x37, 0xfb, 0x16,\n                                                       0x6e, 0x4c, 0x8, 0x87, 0x82, 0x7d, 0x6e, 0x81,\n                                                       0x7e, 0xb0, 0x73, 0x83, 0x1a, 0x81, 0x4a, 0x37,\n                                                       0x81, 0x7e, 0x1e, 0x88, 0x89, 0x88, 0x89, 0x87,\n                                                       0x1b, 0x87, 0x88, 0x8d, 0x8d, 0x88, 0x1f, 0xe,\n                                                       0x4c, 0x9a, 0x76, 0xf9, 0x55, 0x54, 0xa, 0xf9,\n                                                       0x56, 0x3, 0xf7, 0xad, 0xf7, 0x86, 0x15, 0x62,\n                                                       0xfb, 0x7d, 0x5, 0x7e, 0x89, 0x8c, 0x89, 0x8c,\n                                                       0x1b, 0x91, 0x92, 0x95, 0x8f, 0x8e, 0x1f, 0xf7,\n                                                       0x16, 0xf7, 0x4c, 0xf7, 0x1b, 0xfb, 0x53, 0x5,\n                                                       0x85, 0x90, 0x8c, 0x8a, 0x8d, 0x1b, 0x8f, 0x8e,\n                                                       0x8d, 0x93, 0x89, 0x1f, 0x5e, 0xf7, 0x82, 0xf7,\n                                                       0x7b, 0x5f, 0x5, 0x9d, 0x88, 0x8e, 0x8c, 0x8d,\n                                                       0x1a, 0x90, 0x7f, 0x93, 0x89, 0x8c, 0x1e, 0xfb,\n                                                       0x53, 0xf7, 0x1b, 0xf7, 0x51, 0xf7, 0x17, 0x5,\n                                                       0x94, 0x91, 0x92, 0x93, 0x8f, 0x1a, 0x90, 0x7c,\n                                                       0x8b, 0x81, 0x88, 0x1e, 0xfb, 0x77, 0x62, 0xb4,\n                                                       0xf7, 0x6e, 0x5, 0x9f, 0x8f, 0x8b, 0x8f, 0x89,\n                                                       0x1b, 0x81, 0x82, 0x7b, 0x8a, 0x8a, 0x1f, 0xfb,\n                                                       0x12, 0xfb, 0x49, 0xfb, 0x16, 0xf7, 0x4c, 0x5,\n                                                       0x8d, 0x8a, 0x84, 0x97, 0x87, 0x1b, 0x81, 0x91,\n                                                       0x7a, 0x87, 0x1f, 0xb4, 0xfb, 0x71, 0xfb, 0x74,\n                                                       0xb4, 0x5, 0x86, 0x8c, 0x7a, 0x90, 0x82, 0x1a,\n                                                       0x85, 0x97, 0x85, 0x8d, 0x89, 0x1e, 0xf7, 0x50,\n                                                       0xfb, 0x1a, 0xfb, 0x4f, 0xfb, 0x12, 0x5, 0x87,\n                                                       0x88, 0x80, 0x84, 0x87, 0x1a, 0x84, 0x9c, 0x8e,\n                                                       0x8f, 0x8c, 0x1e, 0xe, 0x44, 0x99, 0x76, 0xf9,\n                                                       0x56, 0x54, 0xa, 0xf9, 0x4f, 0x3, 0xae, 0xf7,\n                                                       0x58, 0x15, 0xf7, 0x6c, 0xa8, 0x70, 0xfb, 0x7c,\n                                                       0xf7, 0x32, 0xf7, 0x3d, 0xf7, 0x32, 0xfb, 0x3d,\n                                                       0x72, 0xf7, 0x7c, 0xf7, 0x6f, 0x6e, 0xfb, 0x3d,\n                                                       0xf7, 0x31, 0xf7, 0x39, 0xf7, 0x31, 0xfb, 0x6b,\n                                                       0x6e, 0xa4, 0xf7, 0x6e, 0xfb, 0x32, 0xfb, 0x3d,\n                                                       0xfb, 0x32, 0xf7, 0x3d, 0xa6, 0xfb, 0x6e, 0xfb,\n                                                       0x6c, 0xa8, 0xf7, 0x3c, 0xfb, 0x31, 0x5, 0xe,\n                                                       0x5c, 0x3a, 0xa, 0xdf, 0xf9, 0x7, 0x3, 0xdf,\n                                                       0xf7, 0x35, 0x15, 0xf7, 0x48, 0xbb, 0x5b, 0xfb,\n                                                       0x41, 0xf7, 0x18, 0xf7, 0x16, 0xc7, 0xfb, 0x48,\n                                                       0xb5, 0xf7, 0x41, 0xf7, 0x14, 0xfb, 0xf, 0x5b,\n                                                       0xf7, 0x3f, 0xf7, 0x49, 0x63, 0xfb, 0x14, 0xf7,\n                                                       0x18, 0xf7, 0x42, 0xb9, 0xfb, 0x41, 0xba, 0xf7,\n                                                       0x17, 0xf7, 0x10, 0xfb, 0x50, 0x62, 0xb9, 0xf7,\n                                                       0x47, 0xfb, 0x12, 0xfb, 0x14, 0x5b, 0xf7, 0x47,\n                                                       0x5a, 0xfb, 0x43, 0xfb, 0x15, 0xf7, 0x12, 0xb8,\n                                                       0xfb, 0x49, 0xfb, 0x4a, 0xba, 0xf7, 0x19, 0xfb,\n                                                       0x19, 0xfb, 0x4a, 0x56, 0xf7, 0x44, 0x5c, 0x5,\n                                                       0xe, 0x3b, 0x9c, 0x76, 0xa3, 0x76, 0xf7, 0xa4,\n                                                       0x7c, 0xa, 0xe6, 0x77, 0xa0, 0x77, 0xf7, 0x5f,\n                                                       0x77, 0x12, 0xf7, 0xcb, 0x7c, 0xa, 0x13, 0x6e,\n                                                       0xd8, 0xf7, 0x7, 0xf7, 0xb, 0x15, 0x99, 0x82,\n                                                       0xa0, 0x76, 0x94, 0x7d, 0xf7, 0x49, 0xf7, 0x63,\n                                                       0x18, 0x8c, 0x8a, 0xfb, 0xe, 0xfb, 0x8b, 0x9c,\n                                                       0x88, 0xa6, 0x81, 0x99, 0x80, 0x19, 0xe3, 0xf7,\n                                                       0x99, 0x5, 0x8d, 0x6, 0x13, 0xae, 0xd8, 0x79,\n                                                       0xfb, 0xa7, 0x9c, 0x8f, 0xa7, 0x8b, 0x9c, 0x87,\n                                                       0x19, 0x79, 0xf7, 0xa7, 0x5, 0x8c, 0x6, 0xe4,\n                                                       0xfb, 0x99, 0x99, 0x96, 0xa5, 0x95, 0x9c, 0x8e,\n                                                       0x19, 0xfb, 0xe, 0xf7, 0x8b, 0x8d, 0x8c, 0xf7,\n                                                       0x49, 0xfb, 0x63, 0x94, 0x99, 0xa0, 0xa0, 0x99,\n                                                       0x94, 0x19, 0xfb, 0x63, 0xf7, 0x49, 0x8c, 0x8c,\n                                                       0xf7, 0x8b, 0xfb, 0xe, 0x8e, 0x9c, 0x95, 0xa6,\n                                                       0x96, 0x99, 0x19, 0xfb, 0x99, 0xe3, 0x75, 0xa,\n                                                       0xf7, 0xa7, 0x79, 0x87, 0x9c, 0x8b, 0xa7, 0x8f,\n                                                       0x9c, 0x19, 0xfb, 0xa7, 0x79, 0x5, 0x8c, 0x7,\n                                                       0xf7, 0x99, 0xe4, 0x80, 0x99, 0x81, 0xa5, 0x88,\n                                                       0x9c, 0x19, 0xfb, 0x8b, 0xfb, 0xe, 0x8a, 0x8d,\n                                                       0xf7, 0x63, 0xf7, 0x49, 0x7d, 0x94, 0x76, 0xa0,\n                                                       0x82, 0x99, 0x19, 0xfb, 0x49, 0xfb, 0x63, 0x8a,\n                                                       0x8c, 0xf7, 0xe, 0xf7, 0x8b, 0x7a, 0x8e, 0x70,\n                                                       0x95, 0x7d, 0x96, 0x19, 0x33, 0xfb, 0x99, 0x5,\n                                                       0x89, 0x6, 0x9d, 0xf7, 0xa7, 0x7a, 0x87, 0x6f,\n                                                       0x8b, 0x7a, 0x8f, 0x19, 0x9d, 0xfb, 0xa7, 0x5,\n                                                       0x8a, 0x6, 0x32, 0xf7, 0x99, 0x5, 0x7d, 0x7e,\n                                                       0x71, 0x81, 0x79, 0x1b, 0xf7, 0xe, 0xfb, 0x8b,\n                                                       0x89, 0x8a, 0xfb, 0x49, 0xf7, 0x63, 0x82, 0x7d,\n                                                       0x76, 0x76, 0x7d, 0x82, 0x19, 0xf7, 0x63, 0xfb,\n                                                       0x49, 0x8a, 0x8a, 0x5, 0x13, 0x75, 0xe8, 0xfb,\n                                                       0x8b, 0xf7, 0xe, 0x88, 0x7a, 0x81, 0x70, 0x80,\n                                                       0x7d, 0x19, 0xf7, 0x99, 0x33, 0x80, 0xa, 0xfb,\n                                                       0xa7, 0x9d, 0x8f, 0x7a, 0x8b, 0x6f, 0x87, 0x7a,\n                                                       0x19, 0xf7, 0xa7, 0x9d, 0x5, 0x8a, 0x7, 0xfb,\n                                                       0x99, 0x32, 0x96, 0x7d, 0x95, 0x71, 0x8e, 0x7a,\n                                                       0x19, 0xf7, 0x8b, 0xf7, 0xe, 0x8c, 0x89, 0x5,\n                                                       0x8e, 0xb3, 0x15, 0xa9, 0xa4, 0xa4, 0xa9, 0xa9,\n                                                       0xa4, 0x72, 0x6d, 0x6d, 0x72, 0x72, 0x6d, 0x6d,\n                                                       0x72, 0xa4, 0xa9, 0x1e, 0xe, 0xfb, 0x18, 0xac,\n                                                       0x76, 0xf7, 0xc8, 0xa0, 0x89, 0xa0, 0xf7, 0xc8,\n                                                       0x77, 0x12, 0xf7, 0xe1, 0xa0, 0x89, 0xa0, 0x13,\n                                                       0xb8, 0xa4, 0xf7, 0x99, 0x15, 0x47, 0xf7, 0x8,\n                                                       0xaa, 0xaa, 0x99, 0x1e, 0xa3, 0x96, 0xa4, 0x99,\n                                                       0xa4, 0x99, 0xa4, 0x99, 0xa5, 0x99, 0xa0, 0x97,\n                                                       0x8, 0x8d, 0x8f, 0x8e, 0x8c, 0x8d, 0x1b, 0x8f,\n                                                       0x8d, 0x89, 0x87, 0x89, 0x8a, 0x88, 0x89, 0x87,\n                                                       0x1f, 0x7f, 0x74, 0x7c, 0x71, 0x7c, 0x70, 0x8,\n                                                       0x71, 0x5e, 0x6d, 0x5a, 0x57, 0x1a, 0x6e, 0x93,\n                                                       0x61, 0xad, 0xae, 0xa6, 0xbe, 0xa7, 0x92, 0x1e,\n                                                       0x94, 0xac, 0x8d, 0xb9, 0xb9, 0xa8, 0x8c, 0xa7,\n                                                       0xa4, 0x1a, 0x93, 0x8e, 0x90, 0x8f, 0x8e, 0x8f,\n                                                       0x88, 0x86, 0x8e, 0x1e, 0x99, 0x75, 0x9a, 0x71,\n                                                       0x9b, 0x70, 0xa2, 0x65, 0xa3, 0x64, 0xa1, 0x75,\n                                                       0xa4, 0x72, 0xc1, 0x6d, 0xa6, 0xa6, 0xa6, 0xa6,\n                                                       0x6d, 0xc1, 0x72, 0xa4, 0x73, 0xa3, 0x64, 0xa4,\n                                                       0x63, 0xa2, 0x72, 0x9a, 0x72, 0x9a, 0x76, 0x97,\n                                                       0x8, 0x86, 0x8e, 0x88, 0x8f, 0x8e, 0x1a, 0x8f,\n                                                       0x90, 0x8e, 0x93, 0x1e, 0x8c, 0xa5, 0xa9, 0x8b,\n                                                       0xaa, 0x1b, 0xb8, 0x8c, 0xb7, 0x8d, 0xaa, 0x93,\n                                                       0x8, 0xa9, 0x93, 0xbc, 0xa4, 0xaf, 0x1a, 0x13,\n                                                       0xd4, 0x99, 0x83, 0x95, 0x7f, 0x92, 0x1e, 0x67,\n                                                       0xa1, 0x57, 0x7e, 0x67, 0x7b, 0x73, 0x80, 0x70,\n                                                       0x7d, 0x71, 0x7c, 0x72, 0x7d, 0x72, 0x7d, 0x75,\n                                                       0x7f, 0x8, 0x89, 0x87, 0x88, 0x8a, 0x89, 0x1b,\n                                                       0x87, 0x89, 0x8d, 0x8f, 0x8d, 0x8c, 0x8e, 0x8d,\n                                                       0x8f, 0x1f, 0x97, 0xa2, 0x9a, 0xa5, 0x9a, 0xa6,\n                                                       0x9a, 0xa5, 0x99, 0xa6, 0x95, 0xa3, 0x8, 0xaa,\n                                                       0x99, 0xa4, 0xf7, 0x1, 0x4b, 0x1b, 0x66, 0x74,\n                                                       0x5a, 0x6d, 0x82, 0x1f, 0x82, 0x6a, 0x89, 0x5d,\n                                                       0x5d, 0x6e, 0x8a, 0x6f, 0x72, 0x1a, 0x83, 0x88,\n                                                       0x86, 0x87, 0x88, 0x87, 0x8e, 0x90, 0x88, 0x1e,\n                                                       0x7d, 0xa1, 0x7c, 0xa5, 0x7b, 0xa6, 0x74, 0xb1,\n                                                       0x73, 0xb2, 0x75, 0xa1, 0x72, 0xa4, 0x55, 0xa9,\n                                                       0x70, 0x70, 0x70, 0x70, 0xa9, 0x55, 0xa4, 0x72,\n                                                       0xa3, 0x73, 0xb2, 0x72, 0xb3, 0x74, 0xa4, 0x7c,\n                                                       0xa4, 0x7c, 0xa0, 0x7f, 0x8, 0x90, 0x88, 0x8e,\n                                                       0x87, 0x88, 0x1a, 0x87, 0x86, 0x88, 0x83, 0x1e,\n                                                       0x8a, 0x71, 0x6d, 0x8b, 0x6c, 0x1b, 0x5e, 0x8a,\n                                                       0x5f, 0x89, 0x6c, 0x83, 0x8, 0x13, 0xd8, 0x6c,\n                                                       0x83, 0x5b, 0x71, 0x68, 0x1a, 0xe, 0xfb, 0x17,\n                                                       0xae, 0x76, 0xf7, 0x64, 0xf7, 0x8, 0x63, 0xb3,\n                                                       0x94, 0xf7, 0xa, 0xf7, 0x63, 0x77, 0x12, 0xf7,\n                                                       0x80, 0xf7, 0xa, 0x9d, 0xf7, 0xc, 0x13, 0xde,\n                                                       0xa4, 0xf7, 0x9a, 0x15, 0x6b, 0xbe, 0x83, 0xa3,\n                                                       0x1e, 0x13, 0xbe, 0xda, 0xc2, 0xd7, 0xb6, 0x1b,\n                                                       0x9d, 0x9a, 0x7d, 0x79, 0x1f, 0x6e, 0x3f, 0x45,\n                                                       0x3c, 0x1a, 0x73, 0x92, 0x59, 0xac, 0xad, 0xa7,\n                                                       0xbd, 0xa7, 0x93, 0x1e, 0x91, 0x9f, 0x8d, 0xa0,\n                                                       0xa0, 0xa2, 0x88, 0xa0, 0xa2, 0x1a, 0xa2, 0x8d,\n                                                       0xa5, 0xaa, 0x97, 0x93, 0x86, 0x81, 0x92, 0x1e,\n                                                       0xa8, 0x61, 0x95, 0x61, 0xb3, 0x63, 0x8, 0x77,\n                                                       0x9f, 0xac, 0x79, 0xa7, 0x1b, 0xa1, 0x99, 0x97,\n                                                       0xa2, 0xa7, 0x77, 0xad, 0x78, 0x9e, 0x1f, 0x64,\n                                                       0xb2, 0x62, 0x96, 0x5f, 0xa7, 0x8, 0x81, 0x92,\n                                                       0x84, 0x94, 0x98, 0x1a, 0xa4, 0xa1, 0x91, 0xa0,\n                                                       0x1e, 0xa2, 0xa2, 0x89, 0xa2, 0x1b, 0xa2, 0xa2,\n                                                       0x8d, 0x91, 0xa1, 0x1f, 0xa7, 0x93, 0xbd, 0xa7,\n                                                       0xad, 0x1a, 0xac, 0x59, 0x94, 0x72, 0x1e, 0x3e,\n                                                       0x44, 0x3c, 0x6c, 0x1b, 0x7a, 0x7d, 0x9a, 0x9c,\n                                                       0x1f, 0xa9, 0xd9, 0xd6, 0xd6, 0x1a, 0xa3, 0x82,\n                                                       0xbd, 0x6b, 0x69, 0x6d, 0x59, 0x6f, 0x84, 0x1e,\n                                                       0x84, 0x71, 0x8a, 0x71, 0x70, 0x74, 0x8d, 0x74,\n                                                       0x75, 0x1a, 0x79, 0x81, 0x79, 0x77, 0x7e, 0x81,\n                                                       0x94, 0x95, 0x84, 0x1e, 0x85, 0x95, 0x85, 0x97,\n                                                       0x86, 0x96, 0x7a, 0xac, 0x79, 0xac, 0x71, 0xa5,\n                                                       0x8, 0x9e, 0x78, 0x6b, 0x9e, 0x6f, 0x1b, 0x74,\n                                                       0x7d, 0x7d, 0x74, 0x6f, 0x9e, 0x6b, 0x9e, 0x78,\n                                                       0x1f, 0xb0, 0x66, 0xb8, 0x7b, 0xb6, 0x71, 0x8,\n                                                       0x95, 0x85, 0x94, 0x81, 0x7e, 0x1a, 0x76, 0x74,\n                                                       0x81, 0x79, 0x1e, 0x72, 0x73, 0x8d, 0x72, 0x1b,\n                                                       0x75, 0x74, 0x8a, 0x85, 0x76, 0x1f, 0x6f, 0x83,\n                                                       0x57, 0x6e, 0x69, 0x1a, 0xf7, 0xa5, 0xda, 0x15,\n                                                       0xaa, 0xa4, 0xa4, 0xaa, 0xaa, 0xa4, 0x72, 0x6c,\n                                                       0x6c, 0x72, 0x72, 0x6c, 0x6c, 0x72, 0xa4, 0xaa,\n                                                       0x1e, 0xe, 0xfb, 0x31, 0x3f, 0xa, 0x12, 0xf7,\n                                                       0x9d, 0xf7, 0x2f, 0x2f, 0xa3, 0x13, 0xd0, 0xae,\n                                                       0xf7, 0x49, 0x15, 0xc2, 0x52, 0xd6, 0x96, 0xb2,\n                                                       0xc4, 0x8, 0x13, 0xe0, 0xae, 0xbb, 0xb0, 0xc1,\n                                                       0xbf, 0xa9, 0x8, 0x56, 0x7b, 0x5d, 0x7b, 0x63,\n                                                       0x1e, 0x73, 0x4d, 0x84, 0x76, 0x73, 0x1a, 0x5b,\n                                                       0xae, 0x6b, 0xb6, 0x7f, 0x1e, 0x13, 0xd0, 0xb7,\n                                                       0x97, 0xac, 0xac, 0xbe, 0x1a, 0x67, 0xf5, 0x7c,\n                                                       0xae, 0x79, 0xbc, 0x8c, 0xbf, 0x19, 0xbe, 0x6e,\n                                                       0xaf, 0x57, 0xad, 0x5d, 0xa7, 0x4a, 0xec, 0x83,\n                                                       0xbc, 0xc2, 0x8, 0xd3, 0x6d, 0xb1, 0x48, 0x94,\n                                                       0x1e, 0x20, 0x9a, 0x60, 0x98, 0x64, 0x9f, 0xc0,\n                                                       0xab, 0xc9, 0x92, 0xc7, 0x94, 0x8, 0xd5, 0x94,\n                                                       0xb0, 0xb0, 0xe1, 0x1a, 0x4a, 0xb4, 0x4b, 0x7b,\n                                                       0x5e, 0x53, 0x3b, 0x2b, 0x6f, 0x72, 0x7e, 0x86,\n                                                       0x89, 0xcb, 0x98, 0xa8, 0xa3, 0xc4, 0x8, 0x94,\n                                                       0xa0, 0xa2, 0xc4, 0xa2, 0x1a, 0xb5, 0x63, 0xaa,\n                                                       0x67, 0x97, 0x1e, 0x5f, 0x7f, 0x66, 0x6c, 0x5a,\n                                                       0x1a, 0x6c, 0x9d, 0x67, 0x96, 0x70, 0x1e, 0x9a,\n                                                       0x68, 0xa1, 0x53, 0x50, 0x1a, 0x5e, 0xa0, 0x67,\n                                                       0xbe, 0x6f, 0xb3, 0x61, 0xc7, 0x50, 0xaf, 0x38,\n                                                       0x59, 0x8, 0xfb, 0xc, 0xd0, 0x84, 0xcc, 0x81,\n                                                       0x1e, 0xbe, 0x84, 0xbf, 0x81, 0xba, 0x70, 0x67,\n                                                       0x75, 0x5e, 0x7f, 0x2a, 0x7d, 0x8, 0x45, 0x82,\n                                                       0x67, 0x79, 0x31, 0x1a, 0xe, 0xfb, 0x1e, 0x95,\n                                                       0xc3, 0x87, 0xb4, 0xef, 0xa7, 0x7c, 0xcc, 0x57,\n                                                       0xdb, 0xa0, 0x96, 0x89, 0x96, 0x91, 0x77, 0xaf,\n                                                       0xda, 0x57, 0xcd, 0x7c, 0xa6, 0xa5, 0x77, 0xea,\n                                                       0xb3, 0x87, 0xc3, 0x12, 0x90, 0xcc, 0xb0, 0xab,\n                                                       0xb2, 0xa4, 0xe6, 0xd1, 0x66, 0xb5, 0x65, 0xb5,\n                                                       0x68, 0xcf, 0xe8, 0xa2, 0xb1, 0xac, 0xb1, 0xcb,\n                                                       0x13, 0xa4, 0x9b, 0xa7, 0xf7, 0x8, 0x5b, 0xa,\n                                                       0x62, 0x86, 0x99, 0xfb, 0x12, 0x58, 0xa, 0x13,\n                                                       0x64, 0x9b, 0x8f, 0x59, 0xa, 0xad, 0x81, 0xae,\n                                                       0x7f, 0xab, 0x7f, 0xa, 0x13, 0x8c, 0x37, 0x97,\n                                                       0x43, 0xa, 0x71, 0xa, 0x19, 0x4e, 0xa, 0x13,\n                                                       0xa4, 0x9b, 0xc7, 0x57, 0xa, 0x69, 0x95, 0x68,\n                                                       0x3c, 0xa, 0xf7, 0xa9, 0xf7, 0xbf, 0x15, 0x8f,\n                                                       0x96, 0x8d, 0x97, 0x97, 0x1a, 0x9e, 0x86, 0x7b,\n                                                       0xa, 0x97, 0x1a, 0x13, 0x8c, 0x37, 0xc7, 0xa5,\n                                                       0xad, 0x9a, 0xa1, 0xb0, 0xb5, 0x6c, 0x64, 0x68,\n                                                       0x6a, 0x90, 0x75, 0x80, 0x1e, 0x75, 0x80, 0x78,\n                                                       0x74, 0x83, 0x74, 0x8, 0xcf, 0x30, 0x15, 0x92,\n                                                       0x7, 0xb8, 0x94, 0x9d, 0xa6, 0x98, 0xa1, 0x8,\n                                                       0x9b, 0x95, 0x93, 0x99, 0x9b, 0x1b, 0xae, 0xa2,\n                                                       0x61, 0x6c, 0x72, 0x7a, 0x60, 0x6d, 0x79, 0x7e,\n                                                       0xa2, 0x94, 0x7b, 0x1f, 0x13, 0xa1, 0x9b, 0xc7,\n                                                       0x95, 0x79, 0x76, 0x90, 0x77, 0x1b, 0x86, 0x86,\n                                                       0x8b, 0x8a, 0x86, 0x1f, 0x96, 0xe5, 0x15, 0x7b,\n                                                       0x67, 0x76, 0x5f, 0x62, 0x7e, 0x8, 0x13, 0x92,\n                                                       0x9b, 0xa7, 0x8a, 0x88, 0x87, 0x8a, 0x87, 0x1b,\n                                                       0x55, 0xa, 0x47, 0xa, 0x13, 0x52, 0x5b, 0x97,\n                                                       0x61, 0xa, 0xfb, 0x78, 0xf7, 0x23, 0x15, 0xa2,\n                                                       0x77, 0x6e, 0x99, 0x6d, 0x1b, 0x7e, 0x7f, 0x8b,\n                                                       0x8d, 0x81, 0x1f, 0x7e, 0x8e, 0x82, 0x94, 0xa2,\n                                                       0x1a, 0xb6, 0xb3, 0xac, 0xb4, 0x9e, 0xa4, 0x81,\n                                                       0x74, 0x1e, 0x7d, 0x83, 0x7e, 0x7c, 0x1a, 0x72,\n                                                       0x94, 0x70, 0x9b, 0x78, 0x1e, 0xf7, 0x1d, 0xfb,\n                                                       0x4b, 0x15, 0x91, 0x8f, 0x5, 0x74, 0x9f, 0xa8,\n                                                       0x7d, 0xa9, 0x1b, 0xa9, 0xa6, 0x8e, 0x63, 0x60,\n                                                       0x63, 0x6a, 0x62, 0x78, 0x72, 0x95, 0xa2, 0x1f,\n                                                       0x99, 0x93, 0x98, 0x9a, 0x1a, 0xa4, 0x82, 0xa6,\n                                                       0x7b, 0x9e, 0x1e, 0xfb, 0x71, 0xf7, 0x26, 0x15,\n                                                       0x8d, 0x9a, 0x9b, 0x8d, 0x9a, 0x1b, 0x13, 0xa1,\n                                                       0x9b, 0xa7, 0xa2, 0xc8, 0x7d, 0x6e, 0x1f, 0x13,\n                                                       0xa4, 0x9b, 0x97, 0x77, 0xa, 0x1e, 0x48, 0xa,\n                                                       0x9b, 0xaf, 0xa0, 0xb7, 0xb4, 0x98, 0x8, 0x8c,\n                                                       0x8e, 0x8f, 0x8c, 0x8f, 0x1b, 0x5d, 0xa, 0x97,\n                                                       0xdf, 0x15, 0x66, 0x84, 0x79, 0x78, 0x7e, 0x78,\n                                                       0x8, 0x75, 0x7c, 0x84, 0x76, 0x77, 0x1b, 0x68,\n                                                       0x74, 0xb6, 0xaa, 0xa4, 0x9c, 0xb5, 0xa9, 0x98,\n                                                       0x95, 0x7e, 0x7e, 0x9c, 0x1f, 0x80, 0x99, 0x9e,\n                                                       0x81, 0xaa, 0x1b, 0x91, 0x90, 0x8b, 0x8c, 0x91,\n                                                       0x1f, 0xd0, 0x2f, 0x15, 0x91, 0x88, 0x5, 0x13,\n                                                       0xa4, 0x9b, 0x8f, 0x87, 0x7f, 0x89, 0x7e, 0x7f,\n                                                       0x1a, 0x75, 0x92, 0x7c, 0x92, 0x7e, 0x1e, 0x93,\n                                                       0x7c, 0x94, 0x80, 0x80, 0x1a, 0x71, 0x69, 0x7c,\n                                                       0x75, 0x66, 0x61, 0xaa, 0xb2, 0xae, 0xac, 0x85,\n                                                       0xa1, 0x97, 0x1e, 0xa0, 0x96, 0x9f, 0xa2, 0x93,\n                                                       0xa2, 0x8, 0xe, 0x7e, 0xaa, 0x76, 0xf7, 0x6f,\n                                                       0xbf, 0xbc, 0x96, 0x89, 0x96, 0xbc, 0xbf, 0xbf,\n                                                       0x77, 0xf7, 0x4f, 0x77, 0x12, 0xf8, 0x1a, 0xb5,\n                                                       0x65, 0xb5, 0x83, 0xf7, 0x31, 0xfb, 0x12, 0x95,\n                                                       0x13, 0xef, 0x20, 0xf7, 0x47, 0x5b, 0xa, 0x8a,\n                                                       0x83, 0x8b, 0x83, 0x83, 0x1a, 0x65, 0x9a, 0x22,\n                                                       0xbe, 0xb7, 0xc1, 0xbe, 0xac, 0xa4, 0x1e, 0x53,\n                                                       0xa, 0x8f, 0x9c, 0x8d, 0x9e, 0x63, 0xa, 0xc2,\n                                                       0x75, 0xb7, 0x1b, 0xb6, 0x95, 0xaa, 0xb0, 0xad,\n                                                       0x81, 0xaf, 0x7f, 0xaa, 0x7f, 0xa, 0x5c, 0xa,\n                                                       0x77, 0x99, 0x77, 0x39, 0xa, 0x5, 0x13, 0xee,\n                                                       0x40, 0x71, 0xa, 0x8, 0xb3, 0x8f, 0x7f, 0xf7,\n                                                       0x13, 0x62, 0xa, 0x13, 0xde, 0xa0, 0x52, 0xa,\n                                                       0x87, 0x7a, 0x89, 0x78, 0x64, 0xa, 0x54, 0xa1,\n                                                       0x5f, 0x1b, 0x60, 0x81, 0x6c, 0x66, 0x69, 0x95,\n                                                       0x67, 0x97, 0x6c, 0x4a, 0xa, 0x9f, 0x7d, 0x9f,\n                                                       0x81, 0x8, 0x65, 0x7a, 0x3b, 0x45, 0xa, 0xf7,\n                                                       0xfe, 0xf7, 0xbb, 0x15, 0x7a, 0x65, 0x78, 0x63,\n                                                       0x61, 0x7c, 0x8, 0x8a, 0x87, 0x88, 0x8a, 0x87,\n                                                       0x1b, 0x13, 0xef, 0x20, 0x55, 0xa, 0x13, 0xee,\n                                                       0x40, 0x47, 0xa, 0x13, 0xde, 0xa0, 0x61, 0xa,\n                                                       0xfb, 0xc6, 0xf7, 0x2, 0x15, 0x8d, 0x9a, 0x9b,\n                                                       0x8d, 0x9a, 0x1b, 0x13, 0xef, 0x20, 0xa2, 0xc8,\n                                                       0x7d, 0x6e, 0x77, 0xa, 0x1f, 0x48, 0xa, 0x9c,\n                                                       0xb1, 0x9e, 0xb3, 0xb5, 0x9a, 0x8, 0x8c, 0x8f,\n                                                       0x8e, 0x8c, 0x8f, 0x1b, 0x13, 0xee, 0xa0, 0x5d,\n                                                       0xa, 0xe, 0x73, 0x95, 0xb3, 0x97, 0xa9, 0xf7,\n                                                       0xf, 0xaa, 0x7a, 0x9c, 0xc1, 0xdb, 0x75, 0x77,\n                                                       0xeb, 0x9c, 0x7a, 0xaa, 0xb1, 0x77, 0xf4, 0xa9,\n                                                       0x97, 0xb3, 0x12, 0xca, 0xb5, 0xc7, 0xa7, 0xb6,\n                                                       0xa2, 0xbf, 0xb0, 0x8f, 0x9c, 0x86, 0x9d, 0x7d,\n                                                       0xdb, 0x7d, 0x9d, 0x86, 0x9c, 0x8f, 0xb0, 0x66,\n                                                       0xf7, 0x4b, 0x2d, 0xa2, 0xb6, 0xa7, 0xc7, 0xb5,\n                                                       0x13, 0xda, 0xff, 0x14, 0x80, 0xf7, 0x42, 0x5b,\n                                                       0xa, 0x63, 0x86, 0x99, 0xfb, 0x13, 0x58, 0xa,\n                                                       0x59, 0xa, 0xae, 0x81, 0xad, 0x7f, 0xab, 0x7f,\n                                                       0xa, 0x43, 0xa, 0x5, 0x13, 0xd6, 0xff, 0x2b,\n                                                       0x80, 0x71, 0xa, 0x8, 0x4e, 0xa, 0x57, 0xa,\n                                                       0x68, 0x95, 0x69, 0x3c, 0xa, 0xf7, 0xa8, 0xf7,\n                                                       0xc1, 0x15, 0x8f, 0x96, 0x8d, 0x96, 0x97, 0x1a,\n                                                       0x9d, 0x87, 0x7b, 0xa, 0x96, 0x1a, 0xab, 0xbd,\n                                                       0xa5, 0xa7, 0xb1, 0x9e, 0x5e, 0x6a, 0x71, 0x81,\n                                                       0x84, 0x73, 0x86, 0x1e, 0x6b, 0x84, 0x6f, 0x6e,\n                                                       0x80, 0x6d, 0x8, 0xd3, 0x2f, 0x15, 0x8a, 0x92,\n                                                       0xad, 0x90, 0xa5, 0xa1, 0x9a, 0xa9, 0x19, 0x92,\n                                                       0x99, 0x90, 0x95, 0x9b, 0x8e, 0x8, 0x8c, 0x8e,\n                                                       0x8d, 0x8b, 0x8e, 0x1b, 0xab, 0xb8, 0x6c, 0x69,\n                                                       0x6e, 0x66, 0x5f, 0x6d, 0x7f, 0x82, 0x98, 0x97,\n                                                       0x7c, 0x1f, 0x97, 0x7d, 0x78, 0x96, 0x6a, 0x1b,\n                                                       0x85, 0x85, 0x8a, 0x8a, 0x85, 0x1f, 0xfb, 0x55,\n                                                       0xd3, 0x15, 0x13, 0xe9, 0xff, 0x2b, 0x80, 0xa3,\n                                                       0x78, 0x6c, 0x98, 0x6c, 0x85, 0x86, 0x8b, 0x85,\n                                                       0x1b, 0x6b, 0x83, 0xa7, 0xa6, 0xb0, 0x9b, 0xaa,\n                                                       0xb4, 0xa2, 0xb9, 0x7f, 0x6e, 0x1f, 0x7c, 0x83,\n                                                       0x7c, 0x7b, 0x1a, 0x73, 0x94, 0x71, 0x9b, 0x78,\n                                                       0x1e, 0xfb, 0x13, 0xfb, 0x90, 0x15, 0xaa, 0xca,\n                                                       0xa8, 0xc1, 0xcf, 0xaa, 0x8a, 0x8d, 0x18, 0x43,\n                                                       0x94, 0x5d, 0xb6, 0x5b, 0xbd, 0x8, 0x8c, 0x9d,\n                                                       0x9e, 0x8c, 0x9d, 0x1b, 0xbe, 0xb7, 0x82, 0x6d,\n                                                       0xb5, 0x1f, 0x8c, 0x8d, 0x5, 0x80, 0xa4, 0x87,\n                                                       0xa7, 0xa7, 0x1a, 0xb2, 0x95, 0xb0, 0x96, 0xb1,\n                                                       0x1e, 0xad, 0x58, 0xaa, 0x5a, 0x4b, 0x1a, 0x84,\n                                                       0x8b, 0x84, 0x8a, 0x84, 0x1e, 0x8d, 0x6, 0xb7,\n                                                       0xc5, 0xc8, 0x9e, 0xce, 0x9b, 0x6c, 0x4c, 0x6e,\n                                                       0x55, 0x47, 0x6c, 0x8c, 0x89, 0x18, 0xd3, 0x82,\n                                                       0xb9, 0x60, 0xbb, 0x59, 0x8, 0x8a, 0x79, 0x78,\n                                                       0x8a, 0x79, 0x1b, 0x58, 0x5f, 0x94, 0xa9, 0x61,\n                                                       0x1f, 0x8a, 0x89, 0x5, 0x96, 0x72, 0x8f, 0x6f,\n                                                       0x6f, 0x1a, 0x13, 0xea, 0xfe, 0x9b, 0x80, 0x64,\n                                                       0x81, 0x66, 0x80, 0x65, 0x1e, 0x69, 0xbe, 0x6c,\n                                                       0xbc, 0xcb, 0x1a, 0x92, 0x8b, 0x92, 0x8c, 0x92,\n                                                       0x1e, 0x89, 0x6, 0x5f, 0x51, 0x4e, 0x78, 0x48,\n                                                       0x7b, 0x8, 0xf7, 0xa3, 0xcf, 0x15, 0x90, 0x8f,\n                                                       0x5, 0x73, 0x9e, 0xaa, 0x7e, 0xaa, 0x91, 0x90,\n                                                       0x8b, 0x91, 0x1b, 0xab, 0x93, 0x6f, 0x70, 0x66,\n                                                       0x7b, 0x6c, 0x62, 0x74, 0x5d, 0x97, 0xa8, 0x1f,\n                                                       0x9a, 0x93, 0x9a, 0x9b, 0x1a, 0xa3, 0x82, 0xa5,\n                                                       0x7b, 0x9e, 0x1e, 0xfb, 0x4f, 0xd0, 0x15, 0x69,\n                                                       0x86, 0x71, 0x75, 0x7c, 0x6d, 0x84, 0x7d, 0x86,\n                                                       0x81, 0x7b, 0x88, 0x8, 0x6a, 0x80, 0x57, 0xb6,\n                                                       0xab, 0x1a, 0xa8, 0xb0, 0xb7, 0xa9, 0x94, 0x92,\n                                                       0x84, 0x82, 0x94, 0x1e, 0x7d, 0x9a, 0xa0, 0x79,\n                                                       0xb4, 0x1b, 0x91, 0x91, 0x8c, 0x8c, 0x91, 0x1f,\n                                                       0xd3, 0x2f, 0x15, 0x13, 0xda, 0xfe, 0xab, 0x80,\n                                                       0x91, 0x88, 0x5, 0x87, 0x80, 0x89, 0x80, 0x7f,\n                                                       0x1a, 0x75, 0x92, 0x7b, 0x92, 0x7d, 0x1e, 0x93,\n                                                       0x7c, 0x93, 0x80, 0x82, 0x1a, 0x6b, 0x59, 0x71,\n                                                       0x6f, 0x65, 0x78, 0xb8, 0xac, 0xa5, 0x95, 0x92,\n                                                       0xa3, 0x90, 0x1e, 0xab, 0x92, 0xa7, 0xa8, 0x96,\n                                                       0xa9, 0x8, 0x13, 0xda, 0xfe, 0x4b, 0x80, 0x8f,\n                                                       0xf7, 0x0, 0x15, 0x75, 0x9d, 0x79, 0xa1, 0xa1,\n                                                       0x9d, 0x9d, 0xa1, 0xa1, 0x79, 0x9d, 0x75, 0x75,\n                                                       0x79, 0x79, 0x75, 0x1e, 0xe, 0xfb, 0xed, 0xa0,\n                                                       0x76, 0xf8, 0x36, 0xea, 0xf7, 0x47, 0x77, 0x1,\n                                                       0xf7, 0x5c, 0xeb, 0x3, 0xf7, 0x5c, 0x16, 0xeb,\n                                                       0xf8, 0x36, 0xf7, 0x38, 0xea, 0xfb, 0x38, 0xf7,\n                                                       0x47, 0x2b, 0xfb, 0x47, 0xfb, 0x39, 0x2c, 0xf7,\n                                                       0x39, 0x6, 0xe, 0x59, 0x83, 0x56, 0xa, 0x8d,\n                                                       0x77, 0xb4, 0x5e, 0xa, 0x12, 0xb9, 0x56, 0xa,\n                                                       0xa2, 0x5e, 0xa, 0x13, 0xb2, 0x9a, 0x96, 0x96,\n                                                       0xa0, 0xb9, 0xf8, 0x19, 0x15, 0x57, 0xb2, 0x70,\n                                                       0xbb, 0xa3, 0xa3, 0x92, 0x90, 0xa2, 0x1e, 0x90,\n                                                       0xa6, 0xa7, 0x8f, 0xa6, 0x1b, 0x92, 0xa1, 0x8b,\n                                                       0x81, 0x1f, 0x13, 0x74, 0x9a, 0x95, 0xa, 0xa0,\n                                                       0x84, 0x7a, 0x82, 0x85, 0x89, 0x1e, 0x74, 0x81,\n                                                       0x73, 0x83, 0x72, 0x84, 0x8, 0x56, 0x7d, 0x3f,\n                                                       0x80, 0x43, 0x1a, 0x61, 0xaf, 0x69, 0xb5, 0xbf,\n                                                       0xa5, 0xbe, 0xb0, 0xa4, 0x1e, 0x98, 0x9f, 0x9a,\n                                                       0x9d, 0x9b, 0x9d, 0x8, 0x92, 0x91, 0x99, 0x9b,\n                                                       0x95, 0x1b, 0x13, 0xb4, 0x9a, 0x96, 0x56, 0x60,\n                                                       0x8f, 0x8f, 0x88, 0x86, 0x85, 0x87, 0x81, 0x89,\n                                                       0x85, 0x1f, 0x82, 0x73, 0x80, 0x74, 0x7e, 0x75,\n                                                       0x8, 0x78, 0x6a, 0x71, 0x6a, 0x63, 0x1a, 0x61,\n                                                       0xac, 0x6a, 0xb5, 0xbf, 0xa6, 0xb2, 0xbb, 0xa3,\n                                                       0x84, 0xa3, 0x86, 0xa2, 0x1e, 0x86, 0xa6, 0x87,\n                                                       0xa7, 0xa6, 0x1a, 0x13, 0xb2, 0x9a, 0x96, 0x56,\n                                                       0x88, 0x92, 0x8b, 0xa1, 0x95, 0x1e, 0x13, 0xa8,\n                                                       0x2a, 0x96, 0x56, 0xa0, 0x92, 0x94, 0x7a, 0x85,\n                                                       0x8d, 0x1f, 0x95, 0x74, 0x93, 0x73, 0x92, 0x72,\n                                                       0x8, 0x65, 0xa, 0x56, 0x99, 0x96, 0x3f, 0xd3,\n                                                       0x1b, 0x70, 0xa, 0xb5, 0xad, 0xaf, 0xb5, 0xbf,\n                                                       0x58, 0xa5, 0x66, 0xa4, 0x1f, 0x77, 0x98, 0x79,\n                                                       0x9a, 0x79, 0x9b, 0x8, 0x13, 0xb2, 0x9a, 0x96,\n                                                       0x56, 0x90, 0x86, 0x90, 0x79, 0x9b, 0x93, 0x1a,\n                                                       0x13, 0xb2, 0x99, 0x96, 0x56, 0xa0, 0x8f, 0x8f,\n                                                       0x90, 0x8f, 0x91, 0x95, 0x87, 0x89, 0x91, 0x1e,\n                                                       0xa3, 0x82, 0xa2, 0x80, 0xa1, 0x7e, 0x8, 0x78,\n                                                       0xac, 0xac, 0x71, 0xb3, 0x1b, 0xb5, 0xac, 0xac,\n                                                       0xb5, 0xbf, 0x64, 0xa6, 0x5b, 0x1f, 0x70, 0xa,\n                                                       0x73, 0x73, 0x84, 0x86, 0x74, 0x1f, 0x86, 0x70,\n                                                       0x6f, 0x87, 0x70, 0x1b, 0x13, 0xb2, 0x9a, 0x36,\n                                                       0x56, 0xa0, 0x84, 0x75, 0x8b, 0x95, 0x1f, 0x13,\n                                                       0xb2, 0x9a, 0x96, 0x60, 0xa0, 0x92, 0x9c, 0x94,\n                                                       0x91, 0x8d, 0x1e, 0xa2, 0x95, 0xa3, 0x93, 0xa4,\n                                                       0x92, 0x8, 0xc0, 0x99, 0xd7, 0x96, 0xd3, 0x1a,\n                                                       0x6f, 0xa, 0xb5, 0x67, 0xad, 0x61, 0x57, 0x71,\n                                                       0x58, 0x66, 0x72, 0x1e, 0x7e, 0x77, 0x7c, 0x79,\n                                                       0x7b, 0x79, 0x8, 0x13, 0xb2, 0x9a, 0x56, 0x56,\n                                                       0xa0, 0x84, 0x85, 0x7d, 0x7b, 0x81, 0x1b, 0x87,\n                                                       0x87, 0x8e, 0x90, 0x91, 0x8f, 0x95, 0x8d, 0x91,\n                                                       0x1f, 0x94, 0xa3, 0x96, 0xa2, 0x98, 0xa1, 0x8,\n                                                       0x9e, 0xac, 0xa5, 0xac, 0xb3, 0x1a, 0xb5, 0x6a,\n                                                       0xac, 0x61, 0x57, 0x70, 0x64, 0x5b, 0x1e, 0x6f,\n                                                       0xa, 0x73, 0x92, 0x73, 0x90, 0x74, 0x1e, 0x90,\n                                                       0x70, 0x8f, 0x6f, 0x70, 0x1a, 0x84, 0x8b, 0x75,\n                                                       0x81, 0x1e, 0x13, 0xb3, 0x2, 0x8e, 0x96, 0xa0,\n                                                       0x84, 0x82, 0x9c, 0x91, 0x89, 0x1f, 0x81, 0xa2,\n                                                       0x83, 0xa3, 0x84, 0xa4, 0x8, 0xc0, 0x7d, 0x80,\n                                                       0xd7, 0x43, 0x1b, 0x61, 0x69, 0x67, 0x61, 0x57,\n                                                       0xbe, 0x71, 0xb0, 0x72, 0x1f, 0x9f, 0x7e, 0x9d,\n                                                       0x7c, 0x9d, 0x7b, 0x8, 0x91, 0x85, 0x9c, 0x7c,\n                                                       0x82, 0x1a, 0x86, 0x87, 0x88, 0x87, 0x85, 0x81,\n                                                       0x8f, 0x8d, 0x85, 0x1e, 0x73, 0x94, 0x74, 0x96,\n                                                       0x75, 0x98, 0x8, 0x9e, 0x6a, 0x6a, 0xa5, 0x63,\n                                                       0x1b, 0x61, 0x6a, 0x6a, 0x61, 0x1f, 0xf8, 0x2c,\n                                                       0x8c, 0x15, 0xa3, 0xa0, 0xa2, 0xa0, 0x9e, 0xa4,\n                                                       0x8, 0x13, 0xb2, 0x99, 0x96, 0x56, 0xa0, 0xa4,\n                                                       0x9e, 0xa4, 0xb2, 0xaf, 0x1b, 0x13, 0xb2, 0x9a,\n                                                       0x96, 0x56, 0x90, 0x9e, 0x9c, 0x7a, 0x78, 0x65,\n                                                       0x51, 0x7a, 0x6e, 0x81, 0x1f, 0x6c, 0x81, 0x6e,\n                                                       0x7d, 0x6f, 0x7c, 0x8, 0x4f, 0xb0, 0x15, 0x8d,\n                                                       0xaa, 0x8c, 0xab, 0x87, 0xaa, 0x8, 0x89, 0x9b,\n                                                       0x88, 0x9c, 0x9b, 0x1a, 0x13, 0xb2, 0x9a, 0x36,\n                                                       0x56, 0xa0, 0xa5, 0x94, 0xaf, 0xab, 0x1e, 0x70,\n                                                       0xa, 0xa4, 0x97, 0x7b, 0x73, 0x6d, 0x7e, 0x76,\n                                                       0x7e, 0x71, 0x1f, 0x7d, 0x6e, 0x7f, 0x6d, 0x82,\n                                                       0x6c, 0x8, 0xc5, 0x2d, 0x15, 0x8d, 0x96, 0xaa,\n                                                       0x89, 0xab, 0x8a, 0xaa, 0x8f, 0x19, 0x8d, 0x9b,\n                                                       0x9c, 0x8e, 0x9b, 0x1b, 0x13, 0xb4, 0x9a, 0x96,\n                                                       0x56, 0x88, 0xa5, 0xaf, 0x82, 0x6b, 0x72, 0x7b,\n                                                       0x7f, 0x73, 0x6d, 0x76, 0x98, 0x98, 0x71, 0x1f,\n                                                       0x6e, 0x99, 0x6d, 0x97, 0x6c, 0x94, 0x8, 0xfb,\n                                                       0x12, 0xd9, 0x15, 0x76, 0xa3, 0x76, 0xa2, 0x72,\n                                                       0x9e, 0x8, 0x72, 0x9e, 0x64, 0xa4, 0xaf, 0x1a,\n                                                       0x13, 0xb2, 0x9a, 0x56, 0x56, 0xa0, 0x9e, 0x9c,\n                                                       0x9c, 0x9e, 0xb1, 0x9c, 0x51, 0x6e, 0x95, 0x1e,\n                                                       0x95, 0x6c, 0x99, 0x6e, 0x9a, 0x6f, 0x8, 0x13,\n                                                       0xb3, 0x2, 0x96, 0x56, 0xa0, 0x89, 0x2a, 0x15,\n                                                       0x8e, 0xa0, 0x5, 0x65, 0xa, 0x7f, 0x9d, 0x9c,\n                                                       0x98, 0x5, 0x13, 0xb2, 0x9a, 0x96, 0x60, 0xa0,\n                                                       0x90, 0xa0, 0xa0, 0x88, 0x9d, 0x97, 0x98, 0x7a,\n                                                       0x5, 0x13, 0xa8, 0x2a, 0x96, 0x56, 0xa0, 0xa0,\n                                                       0x86, 0x5, 0x65, 0xa, 0x88, 0x76, 0x97, 0x79,\n                                                       0x7a, 0x7e, 0x5, 0x13, 0xb2, 0x9a, 0x95, 0xa,\n                                                       0xa0, 0x86, 0x76, 0x76, 0x8e, 0x79, 0x7f, 0x7e,\n                                                       0x9c, 0x5, 0x13, 0xb3, 0x2, 0x96, 0x56, 0xa0,\n                                                       0xca, 0x6b, 0x15, 0x94, 0x92, 0xa0, 0x73, 0xa0,\n                                                       0x74, 0xa4, 0x78, 0x19, 0x13, 0x72, 0x9a, 0x96,\n                                                       0x56, 0x60, 0xa4, 0x78, 0xb2, 0x72, 0x67, 0x1a,\n                                                       0x78, 0x7a, 0x7a, 0x78, 0x65, 0x7a, 0xc5, 0xa8,\n                                                       0x81, 0x1e, 0x81, 0xaa, 0x7d, 0xa8, 0x7c, 0xa7,\n                                                       0x8, 0xfb, 0xb, 0xd5, 0x15, 0x65, 0xa, 0x8c,\n                                                       0x7b, 0x7b, 0x8c, 0x7b, 0x1b, 0x7c, 0x7b, 0x8a,\n                                                       0x89, 0x7c, 0x1f, 0x89, 0x7b, 0x7a, 0x88, 0x7b,\n                                                       0x1b, 0x71, 0x67, 0x94, 0xab, 0x1f, 0x6f, 0xa,\n                                                       0xa4, 0x9b, 0x97, 0xa3, 0xa9, 0xa0, 0x7e, 0x7e,\n                                                       0xa5, 0x1e, 0xa8, 0x7d, 0xa9, 0x7f, 0xaa, 0x82,\n                                                       0x8, 0xc5, 0x2d, 0x15, 0x96, 0x89, 0x89, 0x6c,\n                                                       0x8a, 0x6b, 0x8f, 0x6c, 0x19, 0x8d, 0x7b, 0x8e,\n                                                       0x7a, 0x7b, 0x1a, 0x13, 0xb2, 0x9a, 0x8e, 0x96,\n                                                       0xa0, 0x71, 0x82, 0x67, 0x6b, 0x72, 0x7f, 0x9b,\n                                                       0xa3, 0xa9, 0x98, 0xa0, 0x98, 0xa5, 0x1e, 0x99,\n                                                       0xa8, 0x97, 0xa9, 0x94, 0xaa, 0x8, 0x5a, 0xae,\n                                                       0x15, 0x92, 0x82, 0x73, 0x76, 0x74, 0x76, 0x78,\n                                                       0x72, 0x19, 0x72, 0x78, 0x72, 0x64, 0x67, 0x1b,\n                                                       0x78, 0x7a, 0x9c, 0x9e, 0xb1, 0xc5, 0x9c, 0xa8,\n                                                       0x95, 0x1f, 0xaa, 0x95, 0xa8, 0x99, 0xa7, 0x9a,\n                                                       0x8, 0xe, 0x59, 0x94, 0x76, 0xa9, 0x76, 0xf7,\n                                                       0x6d, 0x9e, 0xf7, 0x69, 0x9e, 0xf7, 0x7a, 0x77,\n                                                       0x12, 0xf7, 0xa3, 0x9b, 0xf7, 0x6b, 0x9c, 0x13,\n                                                       0xbe, 0xf7, 0x2c, 0xdf, 0x15, 0xf7, 0x55, 0xf7,\n                                                       0x16, 0xb8, 0xfb, 0x76, 0x5, 0x13, 0x7e, 0x9c,\n                                                       0x94, 0x5, 0x87, 0xb9, 0xf7, 0x6e, 0x8b, 0x1f,\n                                                       0xf7, 0x50, 0xfb, 0x11, 0x98, 0x91, 0xfb, 0x17,\n                                                       0xf7, 0x54, 0xf7, 0x75, 0xb9, 0x91, 0x98, 0xfb,\n                                                       0x7b, 0xb7, 0xf7, 0x11, 0xf7, 0x4f, 0x86, 0x9c,\n                                                       0xfb, 0x56, 0xfb, 0x16, 0x5d, 0xf7, 0x7a, 0x7e,\n                                                       0x85, 0x5e, 0xfb, 0x75, 0xfb, 0x4e, 0xf7, 0x10,\n                                                       0x7c, 0x85, 0xf7, 0x17, 0xfb, 0x54, 0xfb, 0x71,\n                                                       0x5f, 0x80, 0x7d, 0xf7, 0x7c, 0x5e, 0xfb, 0x10,\n                                                       0xfb, 0x4b, 0x5, 0xf7, 0x20, 0xf7, 0x80, 0x15,\n                                                       0xc6, 0xbc, 0xba, 0xc6, 0xc6, 0xbb, 0x5c, 0x50,\n                                                       0x50, 0x5a, 0x5b, 0x50, 0x50, 0x5b, 0xbb, 0xc6,\n                                                       0x1e, 0xe, 0xfb, 0x18, 0x97, 0xc3, 0x92, 0xd6,\n                                                       0xae, 0xac, 0x6a, 0xe6, 0x77, 0x9f, 0x97, 0xc1,\n                                                       0x64, 0x9f, 0x9a, 0xc1, 0x68, 0x9f, 0xa6, 0x9f,\n                                                       0x77, 0xe6, 0x6a, 0xac, 0x94, 0x77, 0xb0, 0x77,\n                                                       0xa8, 0xd6, 0x92, 0xc3, 0x12, 0xa0, 0xd1, 0x8d,\n                                                       0xb4, 0xc8, 0xa1, 0x85, 0xcd, 0x73, 0x9f, 0xa2,\n                                                       0xb5, 0x65, 0xa5, 0x80, 0xaa, 0x99, 0xaa, 0x74,\n                                                       0xb5, 0x6d, 0xa5, 0xa2, 0xcd, 0x4d, 0x9f, 0xaf,\n                                                       0xa1, 0xc8, 0xb4, 0x8d, 0xd1, 0x13, 0xec, 0xd7,\n                                                       0xec, 0x33, 0xf8, 0x8, 0xf8, 0x30, 0x15, 0x8e,\n                                                       0x8f, 0x92, 0x8d, 0x8c, 0x1f, 0x95, 0x9c, 0x98,\n                                                       0x9a, 0x9a, 0x98, 0x98, 0x97, 0x9a, 0x94, 0x9b,\n                                                       0x92, 0x8, 0x8d, 0x8c, 0x90, 0x8e, 0x8e, 0x1a,\n                                                       0x13, 0xea, 0xcb, 0xea, 0x53, 0x8e, 0x85, 0x8b,\n                                                       0x89, 0x63, 0x56, 0x67, 0x60, 0x89, 0x8b, 0x80,\n                                                       0x8f, 0x1e, 0xc0, 0x58, 0x15, 0x87, 0x95, 0x8b,\n                                                       0x8d, 0x9f, 0x9e, 0x87, 0x85, 0x9e, 0x1e, 0x9c,\n                                                       0x85, 0x9a, 0x83, 0x99, 0x81, 0x8, 0x89, 0x8d,\n                                                       0x8e, 0x8a, 0x8e, 0x1b, 0x8d, 0x8c, 0x8b, 0x8d,\n                                                       0x8e, 0x89, 0x8f, 0x89, 0x8d, 0x1f, 0xa5, 0x7a,\n                                                       0x68, 0x9f, 0x6c, 0x1b, 0x83, 0x6b, 0x85, 0x81,\n                                                       0x1f, 0xfb, 0x13, 0xa9, 0x15, 0x8d, 0x8b, 0x8c,\n                                                       0x8d, 0x1f, 0x13, 0xec, 0xd7, 0xec, 0x93, 0x8e,\n                                                       0x89, 0x8f, 0x89, 0x8e, 0x1e, 0x81, 0x9c, 0x85,\n                                                       0x9f, 0x87, 0x9e, 0x8, 0x89, 0x96, 0x8a, 0x96,\n                                                       0x97, 0x92, 0x8c, 0x91, 0x92, 0x1a, 0x8d, 0x8b,\n                                                       0x90, 0x88, 0x80, 0x84, 0x5e, 0x82, 0x70, 0x95,\n                                                       0x6e, 0xa3, 0x7c, 0x1e, 0x89, 0x8e, 0x90, 0x88,\n                                                       0x8e, 0x1b, 0x13, 0xec, 0xd7, 0xd4, 0x33, 0xfb,\n                                                       0xa9, 0xfb, 0x4, 0x15, 0x4c, 0xcf, 0x6c, 0xc1,\n                                                       0xcb, 0xc2, 0xb0, 0xb7, 0xb6, 0x1e, 0x93, 0x93,\n                                                       0x95, 0x92, 0x97, 0x1b, 0x9b, 0x94, 0x7e, 0x7c,\n                                                       0x1f, 0x13, 0xeb, 0x57, 0xec, 0x8f, 0x73, 0x80,\n                                                       0x6c, 0x7c, 0x79, 0x1e, 0x78, 0x74, 0x72, 0x7e,\n                                                       0x6e, 0x87, 0x8, 0x69, 0x86, 0x7b, 0x71, 0x6a,\n                                                       0x1a, 0x63, 0xa9, 0x73, 0xb2, 0xca, 0xbc, 0xcc,\n                                                       0xc4, 0x95, 0x1e, 0x8e, 0x9a, 0x8c, 0x9a, 0x9b,\n                                                       0x1a, 0xa7, 0x85, 0xa5, 0x84, 0xa6, 0x1e, 0x8a,\n                                                       0x90, 0x8a, 0x91, 0x91, 0x1a, 0x9b, 0x94, 0x98,\n                                                       0x9c, 0x1e, 0x13, 0xeb, 0x27, 0xe9, 0x53, 0x91,\n                                                       0x8f, 0x8a, 0x88, 0x90, 0x1f, 0xac, 0x76, 0xa3,\n                                                       0x66, 0x63, 0x6f, 0x7d, 0x78, 0x77, 0x1a, 0x6a,\n                                                       0xb0, 0x6d, 0xab, 0xb7, 0xa4, 0xbb, 0xb2, 0xb7,\n                                                       0x74, 0xb8, 0x69, 0xa7, 0x1e, 0x67, 0xaa, 0x69,\n                                                       0x98, 0x5e, 0x97, 0x8, 0x7d, 0x8f, 0x7a, 0x94,\n                                                       0x9c, 0x1a, 0xa9, 0xbe, 0x94, 0xa2, 0x1e, 0xda,\n                                                       0x8e, 0x49, 0xbb, 0x1b, 0xae, 0xaf, 0xa5, 0xb0,\n                                                       0xca, 0x47, 0xaa, 0x55, 0x4b, 0x54, 0x66, 0x5f,\n                                                       0x60, 0x1f, 0x13, 0xec, 0xd7, 0xea, 0x93, 0x83,\n                                                       0x83, 0x81, 0x84, 0x7f, 0x1b, 0x7b, 0x82, 0x98,\n                                                       0x9a, 0x1f, 0x13, 0xec, 0xd7, 0xe9, 0x93, 0xa3,\n                                                       0x96, 0xaa, 0x9a, 0x9d, 0x1e, 0x9e, 0xa2, 0xa4,\n                                                       0x98, 0xa8, 0x8f, 0x8, 0xad, 0x90, 0x9b, 0xa5,\n                                                       0xac, 0x1a, 0xb3, 0x6d, 0xa3, 0x64, 0x4c, 0x5a,\n                                                       0x4a, 0x52, 0x81, 0x1e, 0x88, 0x7c, 0x8a, 0x7c,\n                                                       0x7b, 0x1a, 0x6f, 0x91, 0x71, 0x92, 0x70, 0x1e,\n                                                       0x8c, 0x86, 0x8c, 0x85, 0x85, 0x1a, 0x7b, 0x82,\n                                                       0x7e, 0x7a, 0x1e, 0x13, 0xd4, 0xd7, 0xd4, 0x93,\n                                                       0x85, 0x87, 0x8c, 0x8e, 0x86, 0x1f, 0x6a, 0xa0,\n                                                       0x73, 0xb0, 0xb3, 0xa7, 0x99, 0x9e, 0x9f, 0x1a,\n                                                       0xac, 0x66, 0xa9, 0x6b, 0x5f, 0x72, 0x5b, 0x64,\n                                                       0x5f, 0xa2, 0x5e, 0xad, 0x6f, 0x1e, 0xaf, 0x6c,\n                                                       0xad, 0x7e, 0xb8, 0x7f, 0x8, 0x99, 0x87, 0x9c,\n                                                       0x82, 0x7a, 0x1a, 0x6d, 0x58, 0x82, 0x74, 0x56,\n                                                       0x78, 0xa9, 0x9f, 0x76, 0x1e, 0x94, 0x81, 0x80,\n                                                       0x92, 0x7b, 0x1b, 0x68, 0x67, 0x71, 0x66, 0x1f,\n                                                       0x13, 0xec, 0xd7, 0xec, 0x33, 0xf8, 0x15, 0x92,\n                                                       0x15, 0x13, 0xec, 0xd7, 0xec, 0x4f, 0x88, 0x8d,\n                                                       0x87, 0x8d, 0x88, 0x1e, 0x95, 0x7a, 0x91, 0x77,\n                                                       0x8f, 0x78, 0x8, 0x8d, 0x80, 0x8c, 0x80, 0x7f,\n                                                       0x84, 0x8a, 0x85, 0x84, 0x1a, 0x89, 0x8b, 0x86,\n                                                       0x8e, 0x96, 0x92, 0xb8, 0x94, 0xa6, 0x81, 0xa8,\n                                                       0x73, 0x9a, 0x1e, 0x8d, 0x88, 0x86, 0x8e, 0x88,\n                                                       0x1b, 0x13, 0xea, 0xd7, 0xd4, 0x33, 0x89, 0x8b,\n                                                       0x8a, 0x89, 0x1f, 0xfb, 0x8c, 0xca, 0x15, 0x71,\n                                                       0x9c, 0xae, 0x77, 0xaa, 0x1b, 0x93, 0xab, 0x91,\n                                                       0x95, 0x8f, 0x81, 0x8b, 0x89, 0x77, 0x78, 0x8f,\n                                                       0x91, 0x78, 0x1f, 0x7a, 0x91, 0x7c, 0x93, 0x7d,\n                                                       0x95, 0x8, 0x8d, 0x89, 0x88, 0x8c, 0x88, 0x1b,\n                                                       0x89, 0x8a, 0x8b, 0x89, 0x88, 0x8d, 0x87, 0x8d,\n                                                       0x89, 0x1f, 0xda, 0xfb, 0x3e, 0x15, 0x88, 0x91,\n                                                       0x8b, 0x8d, 0xb3, 0xc0, 0xaf, 0xb6, 0x8d, 0x8b,\n                                                       0x96, 0x87, 0x1e, 0x13, 0xeb, 0x57, 0xea, 0x33,\n                                                       0x88, 0x87, 0x84, 0x89, 0x8a, 0x1f, 0x81, 0x7a,\n                                                       0x7e, 0x7c, 0x7c, 0x7e, 0x7e, 0x7f, 0x7c, 0x82,\n                                                       0x7b, 0x84, 0x8, 0x89, 0x8a, 0x86, 0x88, 0x88,\n                                                       0x1a, 0xf7, 0x68, 0xf7, 0x88, 0x15, 0xa6, 0xa8,\n                                                       0xb3, 0x97, 0xb2, 0x1b, 0xa3, 0xad, 0x81, 0x6d,\n                                                       0x79, 0x7f, 0x7f, 0x79, 0x82, 0x84, 0x8e, 0x90,\n                                                       0x84, 0x1f, 0x6d, 0xa3, 0x5e, 0x91, 0x67, 0x7f,\n                                                       0x8, 0xfb, 0xe, 0xba, 0x15, 0x89, 0x95, 0x8a,\n                                                       0x94, 0x95, 0x1a, 0xb0, 0xa3, 0xdc, 0xb9, 0x9b,\n                                                       0x9c, 0x7e, 0x7a, 0x7e, 0x7f, 0x7e, 0x80, 0x86,\n                                                       0x1e, 0x6a, 0x7e, 0x69, 0x65, 0x86, 0x67, 0x8,\n                                                       0xf7, 0x1f, 0xfb, 0x3a, 0x15, 0xb4, 0x7e, 0xc5,\n                                                       0x58, 0x5c, 0x1a, 0x77, 0x7f, 0x7a, 0x76, 0x79,\n                                                       0x7f, 0x9c, 0x9c, 0x1e, 0x13, 0xec, 0xd7, 0xec,\n                                                       0x2f, 0x91, 0x8d, 0x91, 0x91, 0x1a, 0xaa, 0x7b,\n                                                       0xb5, 0x72, 0x9e, 0x1e, 0xfb, 0x81, 0xe3, 0x15,\n                                                       0x62, 0x98, 0x51, 0xbe, 0xba, 0x1a, 0x9f, 0x97,\n                                                       0x9c, 0xa0, 0x9d, 0x97, 0x7a, 0x7a, 0x1e, 0x85,\n                                                       0x89, 0x85, 0x85, 0x1a, 0x6c, 0x9b, 0x61, 0xa4,\n                                                       0x78, 0x1e, 0xf7, 0x21, 0xfb, 0x3f, 0x15, 0x8d,\n                                                       0x81, 0x8c, 0x82, 0x81, 0x1a, 0x66, 0x73, 0x3a,\n                                                       0x5d, 0x1e, 0x13, 0xec, 0xd7, 0xd2, 0x93, 0x7b,\n                                                       0x7a, 0x98, 0x9c, 0x98, 0x97, 0x98, 0x96, 0x90,\n                                                       0x1f, 0xac, 0x98, 0xad, 0xb1, 0x90, 0xaf, 0x8,\n                                                       0xfb, 0x7, 0xb4, 0x15, 0x70, 0x6e, 0x63, 0x7f,\n                                                       0x64, 0x1b, 0x73, 0x69, 0x95, 0xa9, 0x9d, 0x97,\n                                                       0x97, 0x9d, 0x94, 0x92, 0x88, 0x86, 0x92, 0x1f,\n                                                       0x7a, 0xa0, 0xa7, 0x84, 0xa6, 0x1b, 0x97, 0x97,\n                                                       0x8c, 0x90, 0x96, 0x1f, 0xe, 0xfb, 0x2c, 0x99,\n                                                       0x76, 0xf9, 0x4a, 0x77, 0x1, 0xf7, 0xda, 0xaf,\n                                                       0x3, 0xd1, 0xf7, 0xd, 0x15, 0xae, 0x81, 0xa3,\n                                                       0xdf, 0xc3, 0xab, 0x70, 0x2b, 0xae, 0x81, 0xb0,\n                                                       0xf7, 0x18, 0xdc, 0xba, 0x9a, 0x82, 0x5, 0x2e,\n                                                       0x7, 0x2b, 0x29, 0xa5, 0x71, 0xd1, 0xd3, 0x5,\n                                                       0x4a, 0x7, 0x4e, 0x4c, 0xa5, 0x72, 0xc0, 0xc1,\n                                                       0xc0, 0x55, 0xa5, 0xa4, 0x4e, 0xca, 0x5, 0xcc,\n                                                       0x7, 0xd1, 0x43, 0xa5, 0xa5, 0x2b, 0xed, 0x5,\n                                                       0xe8, 0x7, 0x9a, 0x94, 0xdc, 0x5c, 0xb0, 0xfb,\n                                                       0x18, 0xae, 0x95, 0x70, 0xeb, 0xc3, 0x6b, 0xa3,\n                                                       0x37, 0xae, 0x95, 0x77, 0xd4, 0xd4, 0x9d, 0x82,\n                                                       0xae, 0x36, 0x76, 0x53, 0xac, 0xec, 0xa3, 0x82,\n                                                       0xaf, 0xfb, 0x19, 0x69, 0x3a, 0xb9, 0x5, 0x9d,\n                                                       0x7, 0xdc, 0xb9, 0xf7, 0x19, 0x69, 0x94, 0xaf,\n                                                       0x2a, 0xa3, 0xc3, 0xac, 0xe0, 0x76, 0x94, 0xae,\n                                                       0x42, 0x9e, 0x9f, 0xd3, 0x68, 0x95, 0x73, 0x37,\n                                                       0x53, 0x6b, 0xa6, 0xeb, 0x68, 0x95, 0x66, 0xfb,\n                                                       0x18, 0x3a, 0x5c, 0x7c, 0x94, 0x5, 0xe8, 0x7,\n                                                       0xeb, 0xed, 0x71, 0xa5, 0x45, 0x43, 0x5, 0xcc,\n                                                       0x7, 0xc8, 0xca, 0x71, 0xa4, 0x56, 0x55, 0x56,\n                                                       0xc1, 0x71, 0x72, 0xc8, 0x4c, 0x5, 0x4a, 0x7,\n                                                       0x45, 0xd3, 0x71, 0x71, 0xeb, 0x29, 0x5, 0x2e,\n                                                       0x7, 0x7c, 0x82, 0x3a, 0xba, 0x66, 0xf7, 0x18,\n                                                       0x68, 0x81, 0xa6, 0x2b, 0x53, 0xab, 0x73, 0xdf,\n                                                       0x68, 0x81, 0x9f, 0x43, 0x42, 0x78, 0x94, 0x68,\n                                                       0xe0, 0xa0, 0xc3, 0x6a, 0x2a, 0x73, 0x94, 0x67,\n                                                       0xf7, 0x19, 0xad, 0xdc, 0x5d, 0x5, 0x79, 0x7,\n                                                       0x3a, 0x5d, 0xfb, 0x19, 0xad, 0x82, 0x67, 0xec,\n                                                       0x73, 0x53, 0x6a, 0x36, 0xa0, 0x82, 0x68, 0xd4,\n                                                       0x78, 0x5, 0xe, 0xfb, 0x23, 0x9e, 0x76, 0xf9,\n                                                       0x40, 0x77, 0x12, 0xf7, 0x71, 0xb0, 0xd0, 0xb3,\n                                                       0x64, 0xb3, 0xcf, 0xb0, 0x67, 0xb0, 0x13, 0xf2,\n                                                       0xdb, 0xf7, 0xc, 0x15, 0xb1, 0x7f, 0xa3, 0xe5,\n                                                       0xdd, 0xba, 0x86, 0x27, 0xa4, 0x7d, 0x5, 0x13,\n                                                       0xea, 0xdf, 0xc1, 0x5, 0x2d, 0x7, 0x49, 0x49,\n                                                       0xa8, 0x70, 0xc4, 0xc4, 0xc4, 0x52, 0xa8, 0xa6,\n                                                       0x49, 0xcd, 0x5, 0xe9, 0x7, 0xdf, 0x55, 0xa4,\n                                                       0x99, 0x86, 0xef, 0xdd, 0x5c, 0xa3, 0x31, 0xb1,\n                                                       0x97, 0x76, 0xd9, 0xd9, 0x9f, 0x82, 0xb2, 0x31,\n                                                       0x73, 0x39, 0xba, 0xe4, 0xb9, 0x5, 0xa7, 0x7,\n                                                       0x32, 0xb9, 0xdd, 0xba, 0xe5, 0x73, 0x94, 0xb2,\n                                                       0x3d, 0xa0, 0xa0, 0xd8, 0x65, 0x97, 0x73, 0x31,\n                                                       0x39, 0x5c, 0x90, 0xef, 0x72, 0x99, 0x37, 0x55,\n                                                       0x5, 0xe9, 0x7, 0xcd, 0xcd, 0x6e, 0xa6, 0x52,\n                                                       0x52, 0x52, 0xc4, 0x6e, 0x70, 0xcd, 0x49, 0x5,\n                                                       0x2d, 0x7, 0x37, 0xc1, 0x72, 0x7d, 0x90, 0x27,\n                                                       0x39, 0xba, 0x73, 0xe5, 0x65, 0x7f, 0xa0, 0x3e,\n                                                       0x3d, 0x76, 0x94, 0x64, 0xe5, 0xa3, 0xdd, 0x5c,\n                                                       0x32, 0x5d, 0x5, 0x6f, 0x7, 0xe4, 0x5d, 0x39,\n                                                       0x5c, 0x31, 0xa3, 0x82, 0x64, 0xd9, 0x76, 0x5,\n                                                       0xf7, 0x9f, 0xf7, 0x46, 0x15, 0xd9, 0x7, 0xd2,\n                                                       0xb7, 0x5, 0x13, 0xf4, 0x88, 0x38, 0x5, 0x13,\n                                                       0xea, 0x5b, 0x41, 0x15, 0xcf, 0xb2, 0xd5, 0x64,\n                                                       0x41, 0x64, 0x5, 0xfb, 0x14, 0xd5, 0x15, 0x47,\n                                                       0xb2, 0x88, 0xde, 0xd2, 0x5f, 0x5, 0xb3, 0xfb,\n                                                       0x76, 0x15, 0xd9, 0x7, 0x13, 0xf4, 0xcf, 0x64,\n                                                       0x8e, 0x38, 0x5, 0x13, 0xea, 0xfb, 0x5b, 0xf7,\n                                                       0xa, 0x15, 0x41, 0xb2, 0xd5, 0xb2, 0xcf, 0x64,\n                                                       0x5, 0x58, 0xfb, 0x31, 0x15, 0x8e, 0xde, 0xcf,\n                                                       0xb2, 0x5, 0x3d, 0x7, 0xe, 0xfb, 0x2a, 0x9b,\n                                                       0x76, 0xf9, 0x46, 0x77, 0x1, 0xf7, 0xd2, 0xbf,\n                                                       0x3, 0xd3, 0xf7, 0xe, 0x15, 0xbd, 0x7d, 0xa3,\n                                                       0xe2, 0xac, 0x9e, 0x74, 0x35, 0xbc, 0x7e, 0xb0,\n                                                       0xf7, 0x1c, 0xd4, 0xb5, 0x8e, 0x8a, 0x5, 0x36,\n                                                       0x7, 0x28, 0x27, 0xaf, 0x67, 0xca, 0xca, 0x5,\n                                                       0x65, 0x7, 0x4b, 0x4b, 0xb0, 0x66, 0xc0, 0xbf,\n                                                       0xc0, 0x57, 0xb0, 0xb0, 0x4b, 0xcb, 0x5, 0xb1,\n                                                       0x7, 0xca, 0x4c, 0xaf, 0xaf, 0x28, 0xef, 0x5,\n                                                       0xe0, 0x7, 0x8e, 0x8c, 0xd4, 0x61, 0xb0, 0xfb,\n                                                       0x1c, 0xbc, 0x98, 0x74, 0xe1, 0xac, 0x78, 0xa3,\n                                                       0x34, 0xbd, 0x99, 0x79, 0xd3, 0xd2, 0x9e, 0x7e,\n                                                       0xbe, 0x33, 0x74, 0x6a, 0x9e, 0xe1, 0xa2, 0x7e,\n                                                       0xbc, 0xfb, 0x1c, 0x67, 0x42, 0xb6, 0x75, 0xa,\n                                                       0xd4, 0xb6, 0xf7, 0x1c, 0x67, 0x98, 0xbc, 0x35,\n                                                       0xa2, 0xac, 0x9e, 0xe3, 0x74, 0x98, 0xbe, 0x44,\n                                                       0x9f, 0x9d, 0xd2, 0x59, 0x99, 0x73, 0x34, 0x6a,\n                                                       0x78, 0xa2, 0xe1, 0x5a, 0x98, 0x66, 0xfb, 0x1c,\n                                                       0x42, 0x61, 0x88, 0x8c, 0x5, 0xe0, 0x7, 0xee,\n                                                       0xef, 0x67, 0xaf, 0x4c, 0x4c, 0x5, 0xb1, 0x7,\n                                                       0xcb, 0xcb, 0x66, 0xb0, 0x56, 0x57, 0x56, 0xbf,\n                                                       0x66, 0x66, 0xcb, 0x4b, 0x5, 0x65, 0x7, 0x4c,\n                                                       0xca, 0x67, 0x67, 0xee, 0x27, 0x5, 0x36, 0x7,\n                                                       0x88, 0x8a, 0x42, 0xb5, 0x66, 0xf7, 0x1c, 0x5a,\n                                                       0x7e, 0xa2, 0x35, 0x6a, 0x9e, 0x73, 0xe2, 0x59,\n                                                       0x7d, 0x9d, 0x44, 0x44, 0x77, 0x98, 0x58, 0xe3,\n                                                       0xa2, 0xac, 0x78, 0x35, 0x74, 0x98, 0x5a, 0xf7,\n                                                       0x1c, 0xaf, 0xd4, 0x60, 0x80, 0xa, 0x42, 0x60,\n                                                       0xfb, 0x1c, 0xaf, 0x7e, 0x5a, 0xe1, 0x74, 0x6a,\n                                                       0x78, 0x33, 0xa2, 0x7e, 0x58, 0xd2, 0x77, 0x5,\n                                                       0xe, 0x56, 0x97, 0x76, 0xa5, 0x76, 0xf7, 0xdc,\n                                                       0xaa, 0xf7, 0xe2, 0x77, 0x12, 0xf8, 0xd, 0xaa,\n                                                       0x13, 0xb8, 0xf8, 0x30, 0xf8, 0x13, 0x15, 0x94,\n                                                       0x86, 0xf7, 0x3d, 0xf7, 0x8f, 0x76, 0x8f, 0x81,\n                                                       0x91, 0x7d, 0x9b, 0x19, 0xfb, 0x1, 0xfb, 0xbc,\n                                                       0x15, 0xf7, 0xa4, 0xf7, 0x19, 0x7b, 0x99, 0x85,\n                                                       0x95, 0x87, 0xa0, 0x19, 0xfb, 0x8f, 0xfb, 0x3d,\n                                                       0x5, 0x60, 0x9e, 0x15, 0x95, 0x6, 0xa0, 0xf7,\n                                                       0xc2, 0x5, 0x88, 0x82, 0x83, 0x89, 0x83, 0x1b,\n                                                       0x83, 0x83, 0x8c, 0x8f, 0x80, 0x1f, 0xd4, 0xfb,\n                                                       0xf6, 0x15, 0xf7, 0xc2, 0x76, 0x5, 0x87, 0x95,\n                                                       0x8a, 0x93, 0x93, 0x1a, 0x93, 0x8c, 0x93, 0x8f,\n                                                       0x95, 0x1e, 0xfb, 0xc2, 0x76, 0x5, 0x40, 0xac,\n                                                       0x15, 0x94, 0x90, 0xfb, 0x19, 0xf7, 0xa4, 0x7d,\n                                                       0x7b, 0x81, 0x85, 0x76, 0x87, 0x19, 0xf7, 0x7f,\n                                                       0xfb, 0xd1, 0x15, 0xf7, 0x8f, 0xfb, 0x3d, 0x8f,\n                                                       0xa0, 0x91, 0x95, 0x9b, 0x99, 0x19, 0xfb, 0xa4,\n                                                       0xf7, 0x19, 0x5, 0x35, 0xb1, 0x15, 0x90, 0x94,\n                                                       0xfb, 0x8f, 0xf7, 0x3d, 0x87, 0x76, 0x85, 0x81,\n                                                       0x7b, 0x7d, 0x19, 0xf7, 0xe2, 0xfb, 0x57, 0x15,\n                                                       0xf7, 0x19, 0xfb, 0xa4, 0x99, 0x9b, 0x95, 0x91,\n                                                       0xa0, 0x8f, 0x19, 0xfb, 0x3d, 0xf7, 0x8f, 0x5,\n                                                       0xfc, 0xd, 0x97, 0x15, 0xf7, 0xc2, 0xa0, 0x5,\n                                                       0x95, 0x7, 0xfb, 0xc2, 0xa0, 0x5, 0x8f, 0x80,\n                                                       0x8c, 0x84, 0x82, 0x1a, 0x83, 0x89, 0x83, 0x88,\n                                                       0x82, 0x1e, 0xf7, 0xd7, 0xfb, 0xd7, 0x15, 0x13,\n                                                       0x78, 0x8e, 0x95, 0x93, 0x8d, 0x93, 0x1b, 0x13,\n                                                       0xb8, 0x93, 0x93, 0x89, 0x88, 0x95, 0x1f, 0x76,\n                                                       0xf7, 0xc2, 0x5, 0x81, 0x6, 0xfb, 0xb0, 0xfb,\n                                                       0x2a, 0x15, 0xf7, 0x8f, 0xf7, 0x3d, 0x86, 0x94,\n                                                       0xfb, 0xa4, 0xfb, 0x19, 0x9b, 0x7d, 0x91, 0x81,\n                                                       0x8f, 0x76, 0x19, 0xe7, 0x2f, 0x15, 0xa0, 0x87,\n                                                       0x95, 0x85, 0x99, 0x7b, 0xf7, 0x19, 0xf7, 0xa4,\n                                                       0x18, 0x82, 0x90, 0x5, 0xe, 0x57, 0x97, 0x76,\n                                                       0xa5, 0x76, 0xf9, 0x49, 0x77, 0x12, 0xb7, 0xf9,\n                                                       0x4e, 0x13, 0xb0, 0xf8, 0x35, 0xf8, 0x7, 0x15,\n                                                       0xf7, 0x55, 0xf7, 0x8b, 0x78, 0x8e, 0x55, 0xaa,\n                                                       0x7f, 0x9a, 0x19, 0xfb, 0x9, 0xfb, 0xb7, 0x5,\n                                                       0xa0, 0x76, 0x15, 0xf7, 0xb7, 0xf7, 0x9, 0x7c,\n                                                       0x97, 0x6c, 0xc1, 0x88, 0x9e, 0x19, 0xfb, 0x8b,\n                                                       0xfb, 0x55, 0x5, 0x67, 0x9a, 0x15, 0x95, 0x6,\n                                                       0xb7, 0xf7, 0xca, 0x5, 0x87, 0x82, 0x77, 0x8a,\n                                                       0x77, 0x1b, 0x77, 0x77, 0x8c, 0x8f, 0x82, 0x1f,\n                                                       0xe3, 0xfb, 0xf6, 0x15, 0xf7, 0xca, 0x5f, 0x5,\n                                                       0x87, 0x94, 0x8a, 0xa0, 0x9f, 0x1a, 0x9f, 0x8d,\n                                                       0x9e, 0x8e, 0x94, 0x1e, 0xfb, 0xca, 0x5f, 0x5,\n                                                       0x4c, 0xa5, 0x15, 0x94, 0x90, 0xfb, 0x9, 0xf7,\n                                                       0xb7, 0x7f, 0x7c, 0x55, 0x6c, 0x78, 0x88, 0x19,\n                                                       0xf7, 0x8c, 0xfb, 0xc2, 0x15, 0xf7, 0x8b, 0xfb,\n                                                       0x55, 0x8e, 0x9e, 0xaa, 0xc1, 0x9a, 0x97, 0x19,\n                                                       0xfb, 0xb7, 0xf7, 0x9, 0x5, 0x43, 0xa9, 0x15,\n                                                       0x90, 0x94, 0xfb, 0x8b, 0xf7, 0x55, 0x88, 0x78,\n                                                       0x6c, 0x55, 0x7c, 0x7f, 0x19, 0xf8, 0x5f, 0xfc,\n                                                       0x5f, 0x15, 0x97, 0x9a, 0xc1, 0xaa, 0x9e, 0x8e,\n                                                       0xfb, 0x55, 0xf7, 0x8b, 0x18, 0x82, 0x86, 0x5,\n                                                       0xfc, 0x0, 0x7e, 0x15, 0xf7, 0xca, 0xb7, 0x5,\n                                                       0x95, 0x7, 0xfb, 0xca, 0xb7, 0x5, 0x8f, 0x82,\n                                                       0x8c, 0x76, 0x77, 0x1a, 0x77, 0x89, 0x78, 0x88,\n                                                       0x82, 0x1e, 0xf7, 0xc0, 0xfb, 0xc0, 0x15, 0x13,\n                                                       0x70, 0x8e, 0x94, 0x9e, 0x8d, 0x9f, 0x1b, 0x13,\n                                                       0xb0, 0x9f, 0xa0, 0x8a, 0x87, 0x94, 0x1f, 0x5f,\n                                                       0xf7, 0xca, 0x5, 0x81, 0x6, 0xfb, 0xa5, 0xfb,\n                                                       0x46, 0x15, 0xf7, 0x8b, 0xf7, 0x55, 0x86, 0x94,\n                                                       0xfb, 0xb7, 0xfb, 0x9, 0x9a, 0x7f, 0xaa, 0x55,\n                                                       0x8e, 0x78, 0x19, 0xc8, 0x4e, 0x15, 0x9e, 0x88,\n                                                       0xc1, 0x6c, 0x97, 0x7c, 0xf7, 0x9, 0xf7, 0xb7,\n                                                       0x18, 0x82, 0x90, 0x5, 0xe, 0xfb, 0x12, 0x92,\n                                                       0x76, 0xf7, 0x1f, 0xf7, 0x43, 0xe6, 0xf7, 0x42,\n                                                       0xf7, 0x15, 0x77, 0x12, 0xae, 0xf7, 0x45, 0xc5,\n                                                       0xf7, 0x42, 0x22, 0xae, 0xf7, 0x14, 0xf7, 0x44,\n                                                       0x13, 0xfb, 0xf7, 0xe7, 0xf7, 0x35, 0x15, 0x66,\n                                                       0x7f, 0x6b, 0x6b, 0x61, 0x1a, 0x59, 0xaf, 0x64,\n                                                       0xbe, 0xbd, 0xb0, 0xb3, 0xbc, 0xb6, 0x6b, 0xaa,\n                                                       0x65, 0x97, 0x1e, 0xf7, 0x30, 0x7, 0xf7, 0x18,\n                                                       0x3e, 0x5, 0x89, 0x83, 0x89, 0x83, 0x82, 0x1a,\n                                                       0x5a, 0xb3, 0x62, 0xbc, 0x1e, 0x13, 0xfd, 0xbd,\n                                                       0xb0, 0xb1, 0xbc, 0xba, 0x65, 0xb4, 0x5a, 0x6f,\n                                                       0x76, 0x7f, 0x78, 0x77, 0x1f, 0x13, 0xfb, 0xfb,\n                                                       0x16, 0xd7, 0xf7, 0x16, 0xd7, 0x5, 0x76, 0xa0,\n                                                       0x9f, 0x82, 0xa9, 0x1b, 0xbc, 0xaf, 0xb6, 0xba,\n                                                       0xbd, 0x62, 0xad, 0x5b, 0x5e, 0x61, 0x63, 0x5e,\n                                                       0x81, 0x8c, 0x80, 0x8e, 0x83, 0x1f, 0xfb, 0x18,\n                                                       0x3d, 0x5, 0xf7, 0x31, 0x7, 0xb1, 0x96, 0xab,\n                                                       0xab, 0xb5, 0x1a, 0xbd, 0x66, 0xb3, 0x59, 0x59,\n                                                       0x66, 0x63, 0x59, 0x61, 0xaa, 0x6b, 0xb1, 0x80,\n                                                       0x1e, 0xfb, 0x31, 0x7, 0xfb, 0x18, 0xd9, 0x5,\n                                                       0x8e, 0x92, 0x8d, 0x93, 0x95, 0x1a, 0xbc, 0x63,\n                                                       0xb3, 0x5a, 0x1e, 0x13, 0xfd, 0x59, 0x65, 0x66,\n                                                       0x59, 0x5c, 0xb2, 0x62, 0xbb, 0xa8, 0xa0, 0x97,\n                                                       0x9e, 0x9f, 0x1f, 0x13, 0xfb, 0xf7, 0x16, 0x3f,\n                                                       0xfb, 0x16, 0x3f, 0x5, 0xa1, 0x76, 0x77, 0x94,\n                                                       0x6c, 0x1b, 0x5a, 0x67, 0x5f, 0x5c, 0x59, 0xb5,\n                                                       0x69, 0xbb, 0xb7, 0xb6, 0xb3, 0xb8, 0x96, 0x7e,\n                                                       0x99, 0x93, 0x90, 0x1f, 0xf7, 0x18, 0xd8, 0x5,\n                                                       0xe, 0x5b, 0x97, 0x76, 0xf7, 0x83, 0xf7, 0xf,\n                                                       0x71, 0xf7, 0xf, 0xf7, 0x83, 0x77, 0x12, 0xf7,\n                                                       0xb2, 0xf7, 0xf, 0x71, 0xf7, 0xf, 0x13, 0xd4,\n                                                       0xf8, 0x39, 0xf7, 0xf1, 0x15, 0xbf, 0xaf, 0xbb,\n                                                       0x9f, 0xc7, 0x9b, 0xa8, 0x93, 0xa9, 0x92, 0xa4,\n                                                       0x9d, 0x9a, 0x95, 0x8b, 0x9e, 0x8c, 0x9e, 0x8c,\n                                                       0x95, 0x8b, 0x96, 0x8f, 0x94, 0x8, 0x8c, 0x8d,\n                                                       0x8b, 0x8d, 0x8d, 0x1a, 0x93, 0x84, 0x8c, 0x84,\n                                                       0x81, 0x81, 0x8e, 0x8e, 0x82, 0x1e, 0x8e, 0x81,\n                                                       0x81, 0x8f, 0x81, 0x1b, 0x6f, 0x67, 0x56, 0x76,\n                                                       0x7c, 0x1f, 0x6f, 0x63, 0x6e, 0x68, 0x65, 0x6c,\n                                                       0x82, 0x84, 0x82, 0x85, 0x82, 0x85, 0x8, 0x78,\n                                                       0x91, 0x15, 0x98, 0x88, 0x96, 0xc9, 0xa0, 0xbb,\n                                                       0xaa, 0xc1, 0x19, 0x98, 0xa2, 0xa2, 0xb3, 0xa6,\n                                                       0x1a, 0x98, 0x83, 0x93, 0x83, 0x94, 0x1e, 0x81,\n                                                       0x96, 0x83, 0x94, 0x84, 0x98, 0x8, 0x8e, 0x8a,\n                                                       0x88, 0x90, 0x87, 0x1b, 0x86, 0x8b, 0x89, 0x88,\n                                                       0x87, 0x1f, 0x7f, 0x80, 0x80, 0x87, 0x82, 0x86,\n                                                       0x8, 0x77, 0x81, 0x7e, 0x85, 0x61, 0x1a, 0x75,\n                                                       0x8f, 0x76, 0x8f, 0x76, 0x1e, 0x91, 0x6b, 0x8f,\n                                                       0x6b, 0x6a, 0x1a, 0x71, 0x89, 0x71, 0x86, 0x71,\n                                                       0x1e, 0xa5, 0x65, 0x15, 0xc9, 0x80, 0xbb, 0x76,\n                                                       0xc1, 0x6c, 0x8, 0x7e, 0xa2, 0xb3, 0x74, 0xa6,\n                                                       0x1b, 0x98, 0x94, 0x93, 0x93, 0x93, 0x1f, 0x96,\n                                                       0x95, 0x94, 0x93, 0x98, 0x92, 0x8, 0x8e, 0x8c,\n                                                       0x90, 0x8e, 0x8f, 0x1a, 0x90, 0x89, 0x8b, 0x88,\n                                                       0x8f, 0x1e, 0x82, 0x96, 0x85, 0x94, 0x87, 0x94,\n                                                       0x8, 0xa1, 0x80, 0x87, 0x99, 0x5f, 0x1b, 0x75,\n                                                       0x76, 0x87, 0x87, 0x76, 0x1f, 0x85, 0x6b, 0x6b,\n                                                       0x87, 0x6a, 0x1b, 0x71, 0x71, 0x8d, 0x90, 0x71,\n                                                       0x1f, 0x5b, 0x9a, 0x15, 0x97, 0x93, 0x67, 0xbf,\n                                                       0x77, 0xbb, 0x7b, 0xc7, 0x19, 0x83, 0xa8, 0x84,\n                                                       0xa9, 0x79, 0xa4, 0x82, 0x98, 0x7c, 0x8d, 0x7b,\n                                                       0x8c, 0x7e, 0x8c, 0x7e, 0x8b, 0x7f, 0x8f, 0x8,\n                                                       0x8c, 0x89, 0x89, 0x8b, 0x89, 0x1b, 0x83, 0x8a,\n                                                       0x84, 0x84, 0x80, 0x88, 0x80, 0x87, 0x81, 0x1f,\n                                                       0x88, 0x82, 0x88, 0x82, 0x82, 0x1a, 0x6f, 0xc0,\n                                                       0x67, 0xa0, 0x7c, 0x1e, 0xb3, 0x6f, 0xae, 0x6e,\n                                                       0xaa, 0x65, 0x92, 0x82, 0x91, 0x82, 0x91, 0x82,\n                                                       0x8, 0xa9, 0x61, 0x15, 0xaf, 0x57, 0x9f, 0x5b,\n                                                       0x9b, 0x4f, 0x93, 0x6e, 0x92, 0x6d, 0x9d, 0x72,\n                                                       0x94, 0x7d, 0x9c, 0x8a, 0x9c, 0x8a, 0x97, 0x8a,\n                                                       0x97, 0x8b, 0x96, 0x87, 0x8, 0x8a, 0x8d, 0x8d,\n                                                       0x8b, 0x8d, 0x1b, 0x93, 0x8c, 0x92, 0x92, 0x94,\n                                                       0x8d, 0x93, 0x8e, 0x94, 0x1f, 0x8f, 0x96, 0x8f,\n                                                       0x96, 0x96, 0x1a, 0xa7, 0x56, 0xaf, 0x76, 0x9a,\n                                                       0x1e, 0x63, 0xa7, 0x68, 0xa8, 0x6c, 0xb1, 0x84,\n                                                       0x94, 0x85, 0x94, 0x85, 0x94, 0x8, 0x5b, 0x9a,\n                                                       0x15, 0x8e, 0x98, 0x4d, 0x96, 0x5b, 0xa0, 0x55,\n                                                       0xaa, 0x19, 0x13, 0xb8, 0x98, 0x74, 0x63, 0xa2,\n                                                       0x70, 0x1b, 0x7e, 0x82, 0x83, 0x83, 0x83, 0x1f,\n                                                       0x80, 0x81, 0x82, 0x83, 0x7e, 0x84, 0x8, 0x88,\n                                                       0x8a, 0x86, 0x88, 0x87, 0x1a, 0x86, 0x8d, 0x8b,\n                                                       0x8e, 0x87, 0x1e, 0x95, 0x80, 0x91, 0x80, 0x8f,\n                                                       0x82, 0x8, 0x76, 0x95, 0x90, 0x7e, 0xb6, 0x1b,\n                                                       0xa1, 0xa0, 0x8f, 0x8f, 0xa0, 0x1f, 0x91, 0xab,\n                                                       0xab, 0x8f, 0xac, 0x1b, 0xa5, 0xa5, 0x89, 0x86,\n                                                       0xa5, 0x1f, 0x9b, 0x75, 0x15, 0x80, 0x4d, 0x76,\n                                                       0x5b, 0x6c, 0x55, 0x8, 0x7e, 0x74, 0x74, 0x63,\n                                                       0x70, 0x1a, 0x7e, 0x93, 0x82, 0x93, 0x83, 0x1e,\n                                                       0x95, 0x80, 0x93, 0x82, 0x92, 0x7e, 0x8, 0x88,\n                                                       0x8c, 0x8e, 0x86, 0x8f, 0x1b, 0x90, 0x8b, 0x8d,\n                                                       0x8e, 0x8f, 0x1f, 0x94, 0x93, 0x93, 0x90, 0x93,\n                                                       0x8f, 0x8, 0xa3, 0x97, 0x9b, 0x8d, 0xba, 0x1a,\n                                                       0xa1, 0x87, 0xa0, 0x87, 0xa0, 0x1e, 0x85, 0xab,\n                                                       0x87, 0xab, 0xac, 0x1a, 0xa5, 0x8d, 0xa5, 0x90,\n                                                       0xa5, 0x1e, 0x78, 0x91, 0x15, 0x83, 0x97, 0x57,\n                                                       0x67, 0x5b, 0x77, 0x4f, 0x7b, 0x19, 0x6e, 0x83,\n                                                       0x6d, 0x84, 0x72, 0x79, 0x7e, 0x82, 0x89, 0x7b,\n                                                       0x8a, 0x7a, 0x8a, 0x7f, 0x8b, 0x7e, 0x87, 0x80,\n                                                       0x8, 0x8a, 0x89, 0x8b, 0x89, 0x89, 0x1a, 0x83,\n                                                       0x92, 0x8a, 0x92, 0x95, 0x95, 0x88, 0x88, 0x95,\n                                                       0x1e, 0x88, 0x95, 0x94, 0x87, 0x95, 0x1b, 0xa7,\n                                                       0xaf, 0xc0, 0xa0, 0x9a, 0x1f, 0xa7, 0xb3, 0xa8,\n                                                       0xae, 0xb1, 0xaa, 0x94, 0x92, 0x94, 0x91, 0x94,\n                                                       0x91, 0x8, 0xe, 0xfb, 0xb3, 0x8b, 0xcd, 0xf7,\n                                                       0xb6, 0xd1, 0xe7, 0xa4, 0xf7, 0xf, 0xa5, 0x1,\n                                                       0xae, 0xa4, 0xf7, 0xf, 0xa6, 0xe8, 0xd3, 0xd4,\n                                                       0xd0, 0x3, 0xf7, 0x4b, 0xc8, 0x15, 0xe4, 0x4e,\n                                                       0x5, 0xf2, 0xf7, 0xf8, 0xf7, 0x22, 0xf7, 0x9,\n                                                       0x6, 0x4b, 0xd1, 0x5, 0x3d, 0xd7, 0x6, 0x46,\n                                                       0xd4, 0x5, 0xfb, 0xf, 0xfb, 0x29, 0xfb, 0x28,\n                                                       0xfb, 0xd, 0x6, 0xe6, 0x49, 0x5, 0xc4, 0x6,\n                                                       0xa6, 0xfb, 0xb6, 0x15, 0xf7, 0xfc, 0xfb, 0x2a,\n                                                       0xe7, 0xf7, 0x2a, 0xf7, 0x28, 0xe8, 0xfb, 0x28,\n                                                       0xf7, 0x25, 0x2f, 0xfb, 0x25, 0xfb, 0xfc, 0x7,\n                                                       0xe, 0x55, 0x3a, 0xa, 0xf7, 0xdf, 0xf7, 0xc9,\n                                                       0x15, 0xfb, 0x33, 0xfb, 0x3, 0x72, 0x7a, 0x7d,\n                                                       0x7a, 0x86, 0x73, 0x19, 0x69, 0x84, 0xa6, 0x6d,\n                                                       0xad, 0x1b, 0xa3, 0x9a, 0xa2, 0xaa, 0xa4, 0x1f,\n                                                       0xf7, 0x2, 0xf7, 0x2e, 0x9e, 0x83, 0x64, 0xfb,\n                                                       0x66, 0x5, 0x65, 0x84, 0xa1, 0x61, 0xb6, 0x1b,\n                                                       0xba, 0x9b, 0xb4, 0xb2, 0x83, 0x1f, 0x65, 0xf7,\n                                                       0x66, 0x9d, 0x93, 0xf7, 0x4, 0xfb, 0x32, 0x5,\n                                                       0x70, 0x9f, 0x98, 0x74, 0xb1, 0x1b, 0xac, 0xa1,\n                                                       0xa9, 0xaa, 0xa4, 0x7d, 0x99, 0x77, 0x98, 0x1f,\n                                                       0xfb, 0x46, 0xf7, 0xc, 0x93, 0x9f, 0xf7, 0x51,\n                                                       0x6d, 0x5, 0xb4, 0x85, 0xc5, 0x86, 0xc5, 0x1a,\n                                                       0xca, 0x51, 0x89, 0x60, 0x84, 0x1e, 0xfb, 0x4f,\n                                                       0x67, 0x83, 0x9f, 0xf7, 0x44, 0xf7, 0xd, 0x5,\n                                                       0x8b, 0xab, 0xa7, 0xa4, 0x1a, 0xa9, 0x72, 0xa9,\n                                                       0x6c, 0x6c, 0x7e, 0x7c, 0x74, 0x7b, 0x1e, 0xfb,\n                                                       0xa, 0xfb, 0x40, 0x79, 0x94, 0xab, 0xf7, 0x4d,\n                                                       0x5, 0xb5, 0x92, 0x8a, 0xc8, 0x50, 0x1b, 0x5d,\n                                                       0x78, 0x69, 0x46, 0x97, 0x1f, 0xb1, 0xfb, 0x4d,\n                                                       0x78, 0x82, 0xfb, 0x2, 0xf7, 0x29, 0x5, 0xa1,\n                                                       0x7b, 0x79, 0xab, 0x6c, 0x1b, 0x6a, 0x6f, 0x74,\n                                                       0x69, 0x65, 0xa7, 0x7e, 0xa6, 0x78, 0x1f, 0xf7,\n                                                       0x30, 0x26, 0x83, 0x78, 0xfb, 0x4e, 0xaf, 0x5,\n                                                       0x60, 0x93, 0x51, 0x8a, 0x4e, 0x1a, 0x4e, 0xc6,\n                                                       0x94, 0xb4, 0x91, 0x1e, 0xf7, 0x4f, 0xa7, 0x5,\n                                                       0xe, 0x5b, 0x3a, 0xa, 0xae, 0xf9, 0x66, 0x3,\n                                                       0x3b, 0xa, 0xfb, 0x5c, 0xf7, 0x37, 0xfb, 0x34,\n                                                       0xf7, 0x5b, 0xf7, 0x5a, 0xf7, 0x36, 0xf7, 0x36,\n                                                       0xf7, 0x5a, 0xf7, 0x5a, 0xfb, 0x36, 0xf7, 0x35,\n                                                       0xfb, 0x5a, 0xfb, 0x5b, 0xfb, 0x37, 0xfb, 0x33,\n                                                       0xfb, 0x5c, 0x1e, 0xe, 0xad, 0x7d, 0xae, 0xf9,\n                                                       0x1c, 0xaf, 0x1, 0xae, 0x9f, 0xf9, 0x1e, 0xf7,\n                                                       0x19, 0x3, 0xae, 0xf7, 0xec, 0x15, 0xfb, 0x75,\n                                                       0xf7, 0x49, 0xfb, 0x19, 0xf7, 0x6a, 0xf7, 0x6b,\n                                                       0xf7, 0x55, 0xf7, 0x13, 0xf7, 0x7b, 0xf7, 0x77,\n                                                       0xfb, 0x52, 0xf7, 0x1a, 0xfb, 0x69, 0xfb, 0x69,\n                                                       0xfb, 0x4f, 0xfb, 0x1b, 0xfb, 0x76, 0x1e, 0x9f,\n                                                       0x16, 0xf7, 0x48, 0xf7, 0x28, 0x41, 0xa, 0xf7,\n                                                       0x46, 0xf7, 0x25, 0xfb, 0x27, 0xfb, 0x46, 0xfb,\n                                                       0x46, 0xfb, 0x25, 0x3e, 0xa, 0xfb, 0x49, 0xfb,\n                                                       0x25, 0xf7, 0x23, 0xf7, 0x48, 0x1e, 0xe, 0x3d,\n                                                       0x3d, 0xa, 0xf9, 0x47, 0x7a, 0xa, 0xf9, 0x47,\n                                                       0xf9, 0x48, 0xfd, 0x47, 0x6, 0xe, 0x3e, 0x8b,\n                                                       0xf7, 0x12, 0x6e, 0xa8, 0xf8, 0xac, 0xa9, 0x12,\n                                                       0xae, 0xa8, 0xf8, 0xa9, 0xa8, 0x13, 0x78, 0xae,\n                                                       0xec, 0x15, 0xf7, 0x0, 0x6, 0x13, 0xb8, 0x2a,\n                                                       0xf8, 0xdc, 0xf8, 0xde, 0x26, 0xf5, 0xfc, 0xe3,\n                                                       0x7, 0x13, 0x78, 0xa8, 0xfc, 0xca, 0x15, 0xf8,\n                                                       0xac, 0xf8, 0xa9, 0xfc, 0xac, 0x7, 0xe, 0x3b,\n                                                       0x8b, 0xf7, 0xf, 0xf8, 0xad, 0xab, 0x1, 0xae,\n                                                       0xaa, 0xf8, 0xa8, 0xf7, 0x13, 0x3, 0xae, 0xf7,\n                                                       0x7, 0x15, 0xf7, 0xa, 0xfb, 0x7, 0x5, 0xf8,\n                                                       0xd0, 0xf8, 0xc7, 0x6, 0xfb, 0xd, 0xf7, 0x15,\n                                                       0x5, 0xfc, 0xcd, 0x6, 0xaa, 0xfc, 0xcd, 0x6d,\n                                                       0xa, 0xc0, 0xa0, 0x76, 0xf9, 0x55, 0x54, 0xa,\n                                                       0xf9, 0xcb, 0x7a, 0xa, 0xf9, 0xcb, 0x6, 0xfc,\n                                                       0x30, 0xf9, 0x55, 0x5, 0xe, 0xc0, 0x92, 0x76,\n                                                       0xf9, 0x56, 0x54, 0xa, 0xf9, 0xcb, 0x3, 0xf8,\n                                                       0x52, 0x7d, 0x15, 0xf8, 0x30, 0xf9, 0x56, 0x5,\n                                                       0xfd, 0xcb, 0x6, 0xe, 0x3a, 0xa, 0xa3, 0xf9,\n                                                       0x63, 0x3, 0x3b, 0xa, 0xf7, 0xfb, 0xfb, 0xfc,\n                                                       0xf7, 0xfc, 0xf7, 0xfc, 0xfb, 0xfc, 0xf7, 0xfb,\n                                                       0x5, 0xe, 0x54, 0x3f, 0xa, 0x12, 0xaf, 0xf9,\n                                                       0x5d, 0xfc, 0x8e, 0xf7, 0xc6, 0x13, 0xd0, 0xf8,\n                                                       0x1c, 0xf8, 0x21, 0x15, 0xf7, 0x2d, 0xf7, 0x2d,\n                                                       0xfb, 0x2d, 0xf7, 0x2f, 0xfb, 0x2d, 0xfb, 0x2e,\n                                                       0x5, 0xf7, 0x5f, 0xfb, 0x5f, 0x15, 0xf7, 0x2c,\n                                                       0xfb, 0x2c, 0x5, 0x13, 0xe0, 0xf7, 0x2f, 0xf7,\n                                                       0x25, 0xfb, 0x2d, 0xf7, 0x35, 0x5, 0xfb, 0xf9,\n                                                       0xfb, 0xfb, 0x15, 0xf7, 0x2d, 0xfb, 0x31, 0xf7,\n                                                       0x30, 0xf7, 0x31, 0xfb, 0x30, 0xf7, 0x2f, 0x5,\n                                                       0xfb, 0x5f, 0x25, 0x15, 0xf7, 0x2d, 0xf7, 0x2c,\n                                                       0xfb, 0x2f, 0xf7, 0x2e, 0xfb, 0x2b, 0xfb, 0x2e,\n                                                       0x5, 0xe, 0xfb, 0xc2, 0x8b, 0xa4, 0xf7, 0xdb,\n                                                       0xa2, 0xaa, 0xda, 0xaa, 0xa4, 0xf7, 0x12, 0xa4,\n                                                       0x1, 0xae, 0xa3, 0xf7, 0x6, 0xa4, 0xaa, 0xdc,\n                                                       0xa9, 0xa3, 0xf7, 0x6, 0xa4, 0x3, 0xf7, 0x41,\n                                                       0x16, 0xf7, 0x53, 0xf7, 0xf4, 0xf7, 0x1f, 0xf7,\n                                                       0x51, 0xfb, 0x1f, 0xf7, 0x2b, 0xfb, 0x53, 0xfb,\n                                                       0x2b, 0xfb, 0x1e, 0xfb, 0x51, 0xf7, 0x1e, 0x6,\n                                                       0xa4, 0xfb, 0xdb, 0x15, 0xf7, 0xf2, 0xfb, 0x1f,\n                                                       0xf7, 0x21, 0xf7, 0x1f, 0xf7, 0x2b, 0xf7, 0x22,\n                                                       0xfb, 0x2b, 0xf7, 0x1e, 0xfb, 0x21, 0xfb, 0x1e,\n                                                       0xfb, 0xf2, 0x7, 0xfb, 0x3, 0xa9, 0x15, 0xdc,\n                                                       0xf7, 0xf3, 0xf7, 0x1d, 0xda, 0xfb, 0x1d, 0xf7,\n                                                       0x2a, 0x3a, 0xfb, 0x2a, 0xfb, 0x1f, 0x3c, 0xf7,\n                                                       0x1f, 0x6, 0xe, 0xfc, 0x25, 0x3a, 0xa, 0xae,\n                                                       0xf8, 0x4, 0x3, 0xae, 0x7d, 0x15, 0xf7, 0x66,\n                                                       0xf7, 0x32, 0xf7, 0x35, 0xf7, 0x5c, 0xf7, 0x5c,\n                                                       0xfb, 0x37, 0xf7, 0x32, 0xfb, 0x61, 0x1f, 0xfd,\n                                                       0x63, 0x7, 0xe, 0xfd, 0x51, 0x3d, 0xa, 0xd0,\n                                                       0x7a, 0xa, 0xd0, 0xf9, 0x48, 0x46, 0x6, 0xe,\n                                                       0xfc, 0xc6, 0x5a, 0xa, 0xae, 0x16, 0xf7, 0x63,\n                                                       0xf9, 0x48, 0xfb, 0x63, 0x6, 0xe, 0xfc, 0x3c,\n                                                       0x3d, 0xa, 0xf7, 0xed, 0x7a, 0xa, 0xf7, 0xed,\n                                                       0xf9, 0x48, 0xfb, 0xed, 0x6, 0xe, 0x66, 0xa,\n                                                       0xb9, 0x64, 0x15, 0x96, 0x7e, 0xf7, 0x38, 0xf7,\n                                                       0x56, 0xf7, 0x42, 0xf7, 0x27, 0xd9, 0xbb, 0x19,\n                                                       0x30, 0xc2, 0xfb, 0x3f, 0xf7, 0x1f, 0xfb, 0x34,\n                                                       0xf7, 0x5b, 0x7c, 0x80, 0x18, 0xb7, 0xfb, 0xb,\n                                                       0xe3, 0xfb, 0x3d, 0xcf, 0x2d, 0x4c, 0x37, 0x2e,\n                                                       0xfb, 0x65, 0x69, 0x38, 0x8, 0xe, 0xfc, 0x41,\n                                                       0x3d, 0xa, 0xf7, 0xe8, 0x7a, 0xa, 0xf7, 0x84,\n                                                       0x6, 0xef, 0xf7, 0xee, 0x27, 0xf7, 0xee, 0x5,\n                                                       0xfb, 0x84, 0x6, 0xef, 0xfb, 0xee, 0x5, 0xe,\n                                                       0xfc, 0xf1, 0x3a, 0xa, 0xae, 0xc7, 0x3, 0xae,\n                                                       0xd3, 0x15, 0xf7, 0x22, 0x35, 0xa1, 0xa0, 0x23,\n                                                       0xd2, 0x5, 0xf8, 0xaf, 0x7, 0xf3, 0xcf, 0x75,\n                                                       0x9f, 0xfb, 0x22, 0x33, 0x5, 0xe, 0xfc, 0xf1,\n                                                       0x3a, 0xa, 0xf7, 0x1e, 0xc8, 0x3, 0xae, 0x93,\n                                                       0x15, 0xa0, 0x75, 0xf7, 0x23, 0xe1, 0x5, 0xf8,\n                                                       0xb5, 0x7, 0xfb, 0x23, 0xe3, 0x76, 0x77, 0xf2,\n                                                       0x47, 0x5, 0xfc, 0xae, 0x7, 0xe, 0xfc, 0x55,\n                                                       0x3a, 0xa, 0xae, 0xf7, 0x10, 0x3, 0xf7, 0xf2,\n                                                       0x7d, 0x15, 0x91, 0x96, 0x5, 0xfb, 0x25, 0xbc,\n                                                       0x57, 0xf7, 0x32, 0xf7, 0x21, 0x1a, 0xf7, 0x1e,\n                                                       0xc3, 0xf7, 0x38, 0xf7, 0x21, 0xba, 0x1e, 0x83,\n                                                       0x96, 0x5, 0xfb, 0x52, 0x54, 0xfb, 0xf, 0x20,\n                                                       0xfb, 0x5a, 0x1a, 0xfb, 0x5b, 0xf7, 0x1a, 0xfb,\n                                                       0x2, 0xf7, 0x49, 0x59, 0x1e, 0xe, 0xfb, 0x9a,\n                                                       0xf3, 0xa2, 0xf7, 0x55, 0xb3, 0xf7, 0x69, 0xa2,\n                                                       0x1, 0xae, 0xa2, 0xf7, 0x66, 0xb4, 0xf7, 0x66,\n                                                       0xa2, 0x14, 0x1c, 0xf4, 0xf3, 0x15, 0xf8, 0x4,\n                                                       0x6, 0x81, 0xa2, 0x5, 0x21, 0x5b, 0xe2, 0xf7,\n                                                       0x4, 0x1f, 0xf7, 0xa, 0xe7, 0x5c, 0x20, 0x1f,\n                                                       0xa2, 0x81, 0x5, 0xf8, 0x4, 0x7, 0x74, 0x81,\n                                                       0x8e, 0xfb, 0x5, 0xfb, 0x0, 0x65, 0x22, 0x88,\n                                                       0x19, 0xf2, 0xb6, 0xf7, 0x2, 0xf7, 0x3, 0x85,\n                                                       0x1e, 0x95, 0xa2, 0x5, 0xfc, 0x4, 0x6, 0x95,\n                                                       0x74, 0x5, 0xf6, 0x88, 0xb9, 0x31, 0xfb, 0x6,\n                                                       0x1a, 0xfb, 0x2, 0x22, 0xbb, 0xf5, 0x90, 0x1f,\n                                                       0x74, 0x95, 0x5, 0xfc, 0x4, 0x7, 0xa2, 0x95,\n                                                       0x8c, 0xf6, 0xf7, 0x0, 0xc4, 0xf0, 0x81, 0x19,\n                                                       0x22, 0x63, 0x29, 0xfb, 0x5, 0x8f, 0x1e, 0xe,\n                                                       0xfc, 0x55, 0x3a, 0xa, 0xf7, 0x7c, 0xf7, 0xf,\n                                                       0x3, 0xae, 0x88, 0x15, 0x92, 0x80, 0x5, 0xf7,\n                                                       0x50, 0xbf, 0xf7, 0x11, 0xf7, 0x0, 0xf7, 0x5b,\n                                                       0x1a, 0xf7, 0x59, 0xfb, 0xf, 0xf7, 0x0, 0xfb,\n                                                       0x52, 0xc2, 0x1e, 0x84, 0x80, 0x5, 0xf7, 0x20,\n                                                       0x5b, 0xc4, 0xfb, 0x37, 0xfb, 0x1e, 0x1a, 0xfb,\n                                                       0x21, 0x56, 0xfb, 0x32, 0xfb, 0x24, 0x5a, 0x1e,\n                                                       0xe, 0xfc, 0xc7, 0x5a, 0xa, 0xf7, 0x19, 0x16,\n                                                       0xf7, 0x1, 0x6, 0x26, 0xf7, 0xed, 0xf0, 0xf7,\n                                                       0xef, 0x5, 0x22, 0x6, 0x25, 0xfb, 0xef, 0x5,\n                                                       0xe, 0xfc, 0xc7, 0x5a, 0xa, 0xae, 0x16, 0xf5,\n                                                       0x6, 0xf0, 0xf7, 0xed, 0x24, 0xf7, 0xef, 0x5,\n                                                       0x23, 0x6, 0xef, 0xfb, 0xef, 0x5, 0xe, 0xfc,\n                                                       0x9e, 0x3d, 0xa, 0xf7, 0x34, 0x3, 0xf7, 0x4c,\n                                                       0x16, 0xee, 0x6, 0x54, 0xf7, 0x4, 0x6a, 0xf7,\n                                                       0x4, 0xf7, 0x11, 0x1a, 0xf7, 0x12, 0xa9, 0xed,\n                                                       0xbd, 0xf7, 0xb, 0x1e, 0x2b, 0x6, 0x3a, 0x29,\n                                                       0x4c, 0xfb, 0xc, 0xfb, 0x14, 0x1a, 0xfb, 0x12,\n                                                       0xcc, 0xfb, 0x13, 0xdf, 0x2e, 0x1e, 0xe, 0xfc,\n                                                       0x9e, 0x38, 0xa, 0xf7, 0xc, 0xf7, 0x37, 0x7a,\n                                                       0xa, 0xee, 0x6, 0xde, 0xe7, 0xcd, 0xf7, 0x14,\n                                                       0xf7, 0x11, 0x1a, 0xf7, 0x16, 0x4b, 0xf7, 0x9,\n                                                       0x3b, 0xef, 0x1e, 0x28, 0x6, 0xc0, 0xfb, 0xc,\n                                                       0xa6, 0x2a, 0xfb, 0x12, 0x1a, 0xfb, 0x10, 0x6c,\n                                                       0xfb, 0x5, 0x55, 0xfb, 0x4, 0x1e, 0xe, 0xfc,\n                                                       0x8d, 0x38, 0xa, 0xe1, 0xf7, 0x1b, 0x3, 0xf7,\n                                                       0xbf, 0x16, 0x99, 0x7, 0x3d, 0x8b, 0xc1, 0xc1,\n                                                       0xf7, 0x2e, 0x8f, 0xc0, 0x38, 0x9c, 0x1f, 0xde,\n                                                       0x9d, 0x87, 0xc6, 0xf7, 0x24, 0x1a, 0xd7, 0x8b,\n                                                       0xaf, 0xd9, 0x1e, 0x98, 0x61, 0x7, 0x67, 0x39,\n                                                       0x8b, 0x7c, 0x76, 0x1f, 0x6c, 0x75, 0x87, 0x70,\n                                                       0x68, 0x1a, 0x91, 0xfb, 0x3e, 0x5, 0x64, 0x7f,\n                                                       0x6d, 0x61, 0x83, 0x1e, 0xb5, 0x83, 0x97, 0x6f,\n                                                       0x63, 0x1a, 0x85, 0xfb, 0x3d, 0x5, 0x68, 0x8c,\n                                                       0x69, 0xaf, 0x79, 0x1e, 0x7f, 0xa3, 0xd2, 0x89,\n                                                       0xaf, 0x1b, 0xe, 0xfc, 0x8d, 0x38, 0xa, 0xf7,\n                                                       0x5, 0xf7, 0x1b, 0x7a, 0xa, 0xbb, 0x6, 0xaf,\n                                                       0xdc, 0x8b, 0x99, 0x99, 0x1f, 0xaf, 0x9d, 0x8c,\n                                                       0xad, 0xae, 0x1a, 0x85, 0xf7, 0x3d, 0x8a, 0xb4,\n                                                       0x98, 0xa6, 0xb5, 0x93, 0x19, 0x61, 0x93, 0x7d,\n                                                       0xa0, 0x8d, 0xbb, 0x91, 0xf7, 0x3e, 0x18, 0xae,\n                                                       0x88, 0xa7, 0x6b, 0xa0, 0x1e, 0x9a, 0x74, 0x3b,\n                                                       0x8b, 0x67, 0x1b, 0x61, 0x7e, 0x6, 0xd9, 0x8b,\n                                                       0x54, 0x56, 0x1f, 0x37, 0x7, 0x45, 0x87, 0x56,\n                                                       0xdd, 0x79, 0x1e, 0x39, 0x7a, 0x8f, 0x56, 0x45,\n                                                       0x1a, 0x37, 0x7, 0x55, 0x8b, 0x55, 0x3d, 0x1e,\n                                                       0xe, 0xfc, 0x53, 0x73, 0xa, 0xf0, 0x26, 0xf7,\n                                                       0xd0, 0x13, 0xa0, 0xf7, 0xcc, 0xf9, 0x3a, 0x15,\n                                                       0x86, 0xa0, 0x5, 0xfb, 0x13, 0x7a, 0xfb, 0x23,\n                                                       0x4b, 0xfb, 0x5b, 0x1a, 0x36, 0xc6, 0x21, 0xf2,\n                                                       0xeb, 0xc5, 0xd4, 0xd2, 0xc3, 0x71, 0xac, 0x75,\n                                                       0x97, 0x1e, 0x7e, 0x91, 0x7a, 0x8f, 0x7c, 0x86,\n                                                       0x8, 0x86, 0x78, 0x81, 0x86, 0x70, 0x1b, 0x13,\n                                                       0xc0, 0x63, 0x71, 0xa0, 0xb5, 0xbd, 0xaf, 0xcc,\n                                                       0xf7, 0x1e, 0xab, 0x1f, 0xe, 0xfc, 0x53, 0x73,\n                                                       0xa, 0xf7, 0xd0, 0x26, 0xf0, 0x13, 0xc0, 0xde,\n                                                       0xf7, 0x78, 0x15, 0xf7, 0x13, 0x9c, 0xf7, 0x23,\n                                                       0xcb, 0xf7, 0x5b, 0x1a, 0xe0, 0x50, 0xf5, 0x24,\n                                                       0x2b, 0x51, 0x42, 0x44, 0x53, 0xa5, 0x6a, 0xa1,\n                                                       0x7f, 0x1e, 0x97, 0x85, 0x9a, 0x87, 0x9d, 0x90,\n                                                       0x8, 0x90, 0x9e, 0x95, 0x90, 0xa6, 0x1b, 0x13,\n                                                       0xa0, 0xb3, 0xa5, 0x76, 0x61, 0x59, 0x67, 0x4a,\n                                                       0xfb, 0x1e, 0x6b, 0x1f, 0x90, 0x76, 0x5, 0xe,\n                                                       0xfb, 0x3f, 0xf8, 0xec, 0xf9, 0x3a, 0x15, 0x87,\n                                                       0xa0, 0x5, 0xfb, 0xc, 0x5f, 0xa, 0x73, 0xac,\n                                                       0x76, 0x97, 0x1e, 0x80, 0x91, 0x7c, 0x8f, 0x7a,\n                                                       0x86, 0x8, 0x86, 0x7a, 0x81, 0x86, 0x72, 0x1b,\n                                                       0x65, 0x73, 0xa0, 0xb5, 0xbd, 0xac, 0xcc, 0xf7,\n                                                       0x16, 0xab, 0x1f, 0xfb, 0xc4, 0x16, 0x86, 0xa0,\n                                                       0x5, 0xfb, 0xb, 0x5f, 0xa, 0x72, 0xac, 0x76,\n                                                       0x97, 0x1e, 0x80, 0x91, 0x7d, 0x8f, 0x7a, 0x86,\n                                                       0x8, 0x86, 0x79, 0x82, 0x86, 0x71, 0x1b, 0x66,\n                                                       0x72, 0xa0, 0xb5, 0xbd, 0xad, 0xcc, 0xf7, 0x16,\n                                                       0xab, 0x1f, 0xe, 0xfc, 0xc5, 0xe, 0x7d, 0x99,\n                                                       0xf7, 0xee, 0x98, 0xf7, 0xe1, 0x98, 0x6, 0x1e,\n                                                       0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xa7, 0xa,\n                                                       0xe5, 0xb, 0xf9, 0xa8, 0x14, 0xf9, 0xdb, 0x15,\n                                                       0xa7, 0x13, 0x0, 0x61, 0x2, 0x0, 0x1, 0x0,\n                                                       0x7, 0x0, 0xb, 0x0, 0x11, 0x0, 0x18, 0x0,\n                                                       0x1f, 0x0, 0x2c, 0x0, 0x30, 0x0, 0x39, 0x0,\n                                                       0x3e, 0x0, 0x43, 0x0, 0x4b, 0x0, 0x52, 0x0,\n                                                       0x5a, 0x0, 0x5f, 0x0, 0x64, 0x0, 0x69, 0x0,\n                                                       0x78, 0x0, 0x7f, 0x0, 0xba, 0x0, 0xbf, 0x1,\n                                                       0xb, 0x1, 0x11, 0x1, 0x18, 0x1, 0x1d, 0x1,\n                                                       0x24, 0x1, 0x3e, 0x1, 0x42, 0x1, 0x46, 0x1,\n                                                       0x55, 0x1, 0x59, 0x1, 0x5e, 0x1, 0x64, 0x1,\n                                                       0x69, 0x1, 0x6e, 0x1, 0x85, 0x1, 0x8d, 0x1,\n                                                       0x92, 0x1, 0xa5, 0x1, 0xaa, 0x1, 0xc7, 0x1,\n                                                       0xe2, 0x1, 0xfc, 0x2, 0xb, 0x2, 0x16, 0x2,\n                                                       0x1b, 0x2, 0x1f, 0x2, 0x29, 0x2, 0x37, 0x2,\n                                                       0x41, 0x2, 0x4b, 0x2, 0x58, 0x2, 0x65, 0x2,\n                                                       0x69, 0x2, 0x7f, 0x2, 0x95, 0x2, 0xa4, 0x2,\n                                                       0xaf, 0x2, 0xbe, 0x2, 0xc4, 0x2, 0xcf, 0x2,\n                                                       0xda, 0x2, 0xec, 0x2, 0xfe, 0x3, 0xf, 0x3,\n                                                       0x20, 0x3, 0x2f, 0x3, 0x38, 0x3, 0x41, 0x3,\n                                                       0x4a, 0x3, 0x51, 0x3, 0x5e, 0x3, 0x6b, 0x3,\n                                                       0x77, 0x3, 0x83, 0x3, 0x89, 0x3, 0x8d, 0x3,\n                                                       0x98, 0x3, 0xa1, 0x3, 0xa8, 0x3, 0xaf, 0x3,\n                                                       0xb6, 0x3, 0xbd, 0x3, 0xc4, 0x3, 0xcb, 0x3,\n                                                       0xd0, 0x3, 0xd4, 0x3, 0xde, 0x3, 0xe8, 0x3,\n                                                       0xf2, 0x3, 0xfc, 0x4, 0x0, 0x4, 0x9, 0x4,\n                                                       0x12, 0x4, 0x19, 0x4, 0x1f, 0x4, 0x24, 0x4,\n                                                       0x28, 0x30, 0xa, 0x33, 0xa, 0x1e, 0xb, 0x15,\n                                                       0x20, 0xa, 0xb, 0xae, 0xf7, 0xee, 0x21, 0xa,\n                                                       0xb, 0xae, 0xf7, 0xee, 0x15, 0x2c, 0xa, 0xb,\n                                                       0xf7, 0x5b, 0x25, 0xa, 0xfb, 0x5b, 0xb, 0xf7,\n                                                       0x35, 0xf7, 0x35, 0xf7, 0x5b, 0xf7, 0x5a, 0xfb,\n                                                       0x35, 0xf7, 0x35, 0xb, 0x3, 0x23, 0xa, 0xb,\n                                                       0xfb, 0x5a, 0xfb, 0x35, 0xfb, 0x35, 0xfb, 0x5a,\n                                                       0xb, 0xf7, 0x48, 0x2d, 0xa, 0xb, 0x2e, 0xa,\n                                                       0xf7, 0x5a, 0xb, 0xfb, 0x35, 0xfb, 0x35, 0xfb,\n                                                       0x5a, 0x1e, 0xb, 0xfb, 0x5b, 0xf7, 0x35, 0xfb,\n                                                       0x35, 0xb, 0x46, 0xa, 0x24, 0xa, 0x27, 0xa,\n                                                       0x1e, 0xb, 0xf7, 0x25, 0x31, 0xa, 0xb, 0x3b,\n                                                       0xa, 0x2b, 0xa, 0xb, 0x2d, 0xa, 0xfb, 0x25,\n                                                       0xb, 0x2c, 0xa, 0xae, 0x16, 0x40, 0xa, 0x41,\n                                                       0xa, 0xf7, 0x48, 0x2f, 0xa, 0xfb, 0x48, 0xb,\n                                                       0x3e, 0xa, 0xfb, 0x48, 0xfb, 0x25, 0xb, 0xf7,\n                                                       0x7e, 0xf7, 0x3e, 0x5, 0xfb, 0xb5, 0x6, 0x32,\n                                                       0xf7, 0xa7, 0x32, 0xfb, 0xa7, 0x5, 0xfb, 0xb5,\n                                                       0x6, 0xf7, 0x7e, 0xfb, 0x3e, 0x5, 0x68, 0xfb,\n                                                       0x5b, 0x15, 0xe1, 0xf7, 0x6c, 0xfb, 0x58, 0xf7,\n                                                       0x10, 0xf7, 0x7c, 0x7c, 0xc4, 0xf7, 0x75, 0xc4,\n                                                       0xfb, 0x75, 0xf7, 0x7c, 0x9a, 0xfb, 0x58, 0xfb,\n                                                       0x10, 0xe1, 0xfb, 0x6c, 0xfb, 0x47, 0xf7, 0x29,\n                                                       0x5, 0xb, 0xfb, 0x47, 0x36, 0xa, 0xb, 0xf8,\n                                                       0xaa, 0xf8, 0x8d, 0x15, 0xaf, 0xae, 0x5, 0xa2,\n                                                       0x98, 0xa9, 0xa6, 0xac, 0x1b, 0xba, 0xc5, 0x5f,\n                                                       0x4d, 0x71, 0x75, 0x6b, 0x70, 0x7a, 0x1f, 0x6e,\n                                                       0x65, 0xc1, 0x8e, 0xb3, 0xbe, 0x93, 0xb6, 0x19,\n                                                       0xf7, 0x12, 0xe9, 0x71, 0xf7, 0x2e, 0xfb, 0x23,\n                                                       0xfb, 0x1b, 0x7d, 0x98, 0x7a, 0x95, 0x77, 0x92,\n                                                       0x19, 0xf7, 0x5, 0xf7, 0x16, 0x5, 0x7a, 0x65,\n                                                       0x87, 0x83, 0x7d, 0x1f, 0x2f, 0xfb, 0x4, 0x5,\n                                                       0x52, 0x84, 0x61, 0x50, 0x68, 0x87, 0x8b, 0x88,\n                                                       0x87, 0x1a, 0xb, 0x4f, 0xa, 0x32, 0xa, 0x30,\n                                                       0xb, 0xfb, 0x25, 0xf7, 0x25, 0xf7, 0x48, 0xb,\n                                                       0x15, 0x30, 0xa, 0x1e, 0xb, 0xa0, 0x76, 0xf9,\n                                                       0x48, 0x77, 0x1, 0xb, 0x95, 0x8, 0xb2, 0x9c,\n                                                       0xda, 0xc4, 0xba, 0x1a, 0xbd, 0x26, 0xa7, 0x64,\n                                                       0x90, 0x1e, 0x8a, 0x8e, 0x97, 0x9b, 0x97, 0x9c,\n                                                       0x95, 0x9c, 0x19, 0x87, 0x8e, 0xb, 0x3f, 0xa,\n                                                       0x1, 0xb, 0xae, 0x4d, 0xa, 0xb, 0x97, 0x6b,\n                                                       0x4a, 0xa, 0x9e, 0x7d, 0xa0, 0x81, 0x8, 0x64,\n                                                       0x7a, 0x3c, 0x45, 0xa, 0xb, 0x38, 0xa, 0xae,\n                                                       0xb, 0xfb, 0x25, 0xfb, 0x47, 0xb, 0x92, 0x76,\n                                                       0xf9, 0x63, 0x77, 0xb, 0xf7, 0x47, 0xf7, 0x25,\n                                                       0xb, 0xf7, 0x25, 0xf7, 0x47, 0xb, 0x15, 0xa6,\n                                                       0x9f, 0xa0, 0xa6, 0xa6, 0xa0, 0x76, 0x4b, 0xa,\n                                                       0xfb, 0xb4, 0x4, 0xa6, 0x9f, 0x9f, 0xa6, 0xa6,\n                                                       0xa0, 0x77, 0x4b, 0xa, 0xb, 0x5c, 0xa, 0x78,\n                                                       0x99, 0x76, 0x39, 0xa, 0xb, 0x50, 0xa, 0x51,\n                                                       0xa, 0xb, 0x52, 0x5c, 0x1a, 0x59, 0xf0, 0x6f,\n                                                       0xb2, 0x86, 0x1e, 0x8c, 0x88, 0x7f, 0x7b, 0x7f,\n                                                       0x7a, 0x81, 0x7a, 0x19, 0xb, 0x2b, 0xa, 0xf7,\n                                                       0x5a, 0xb, 0xa1, 0x6e, 0xa1, 0x6d, 0x65, 0x1a,\n                                                       0x7f, 0x88, 0x73, 0x7b, 0x72, 0x82, 0xc3, 0x9e,\n                                                       0x9f, 0x90, 0x9e, 0x8f, 0x9e, 0x1e, 0x6a, 0xa,\n                                                       0x89, 0x7c, 0x7b, 0x89, 0x7c, 0x1b, 0xb, 0x6a,\n                                                       0xa, 0x75, 0xa8, 0x75, 0xa9, 0xb1, 0x1a, 0x97,\n                                                       0x8e, 0xa3, 0x9b, 0xa4, 0x94, 0x53, 0x78, 0x77,\n                                                       0x86, 0x78, 0x87, 0x78, 0x1e, 0xfb, 0x2d, 0xc2,\n                                                       0x15, 0xb, 0xe0, 0xf7, 0xb, 0x76, 0xf7, 0x8c,\n                                                       0x77, 0xf7, 0xa0, 0x54, 0xa, 0xf9, 0xea, 0x3,\n                                                       0xae, 0xed, 0x15, 0xf9, 0xea, 0xf7, 0x8c, 0xfd,\n                                                       0xea, 0xf7, 0x8c, 0xb, 0x1f, 0x89, 0x89, 0x5,\n                                                       0x8e, 0x77, 0x76, 0x8c, 0x77, 0x1b, 0x86, 0x7,\n                                                       0x9c, 0x7c, 0xb, 0x70, 0x70, 0x76, 0x77, 0x70,\n                                                       0x70, 0x77, 0x9f, 0xa6, 0x1e, 0xb, 0xae, 0x12,\n                                                       0xae, 0xae, 0xb, 0xf7, 0xee, 0x15, 0xb, 0xb4,\n                                                       0x8f, 0x7f, 0xf7, 0x12, 0x62, 0xa, 0x52, 0xa,\n                                                       0xb, 0x9d, 0x15, 0xf7, 0x7e, 0xf7, 0x3e, 0xf7,\n                                                       0x7e, 0xfb, 0x3e, 0x31, 0xf7, 0xa7, 0xb, 0x15,\n                                                       0x7d, 0x96, 0x80, 0x99, 0x99, 0x96, 0x96, 0x99,\n                                                       0xb, 0x99, 0x80, 0x96, 0x7d, 0x7d, 0x80, 0x80,\n                                                       0x7d, 0x1e, 0xb, 0x88, 0x8c, 0x84, 0x9e, 0x81,\n                                                       0x9d, 0x81, 0x9c, 0x19, 0x87, 0x89, 0x5, 0xb,\n                                                       0x8e, 0x8a, 0x92, 0x78, 0x95, 0x79, 0x95, 0x7a,\n                                                       0x19, 0x8f, 0x8d, 0x5, 0xb, 0x77, 0x1, 0xae,\n                                                       0xb, 0x83, 0x83, 0x90, 0x94, 0x91, 0x8d, 0x90,\n                                                       0x8e, 0x90, 0x1f, 0xa2, 0xb3, 0xaf, 0x97, 0xb4,\n                                                       0x98, 0x8, 0xfb, 0x2d, 0xc2, 0x15, 0xb, 0xcc,\n                                                       0x77, 0xc8, 0x92, 0xc1, 0xc4, 0xb8, 0x5e, 0xf7,\n                                                       0x2e, 0xfb, 0x1, 0xb0, 0x70, 0xae, 0x8f, 0xf7,\n                                                       0x2e, 0xfb, 0x1b, 0x9d, 0xb, 0x87, 0x79, 0x89,\n                                                       0x79, 0x64, 0xa, 0x55, 0xa1, 0x5e, 0x1b, 0x60,\n                                                       0x81, 0x6c, 0x66, 0xb, 0xc3, 0x1b, 0xb7, 0xc1,\n                                                       0xbe, 0xac, 0xa4, 0x1f, 0x53, 0xa, 0xb, 0x8f,\n                                                       0x9d, 0x8d, 0x9d, 0x63, 0xa, 0xc1, 0x75, 0xb8,\n                                                       0x1b, 0xb6, 0x95, 0xaa, 0xb0, 0xb, 0x3d, 0xa,\n                                                       0xf7, 0x63, 0x3, 0xb, 0xf7, 0x27, 0x15, 0xa1,\n                                                       0x92, 0xa0, 0x95, 0x9e, 0x98, 0x8, 0xb, 0x88,\n                                                       0x9f, 0xa0, 0x8a, 0x9f, 0x1b, 0x90, 0x7, 0x7a,\n                                                       0x9a, 0xb, 0x93, 0x93, 0x86, 0x82, 0x85, 0x89,\n                                                       0x86, 0x88, 0x86, 0x1f, 0x74, 0x63, 0x67, 0x7f,\n                                                       0x62, 0x7e, 0x8, 0xb, 0xae, 0x70, 0xb0, 0x8b,\n                                                       0xb8, 0x62, 0xb8, 0xc0, 0xc1, 0x59, 0xc1, 0x8e,\n                                                       0xc8, 0x52, 0xc8, 0x77, 0xcc, 0xb, 0x7a, 0xfb,\n                                                       0x1b, 0x4b, 0xfb, 0x5b, 0x1a, 0x36, 0xc3, 0x21,\n                                                       0xec, 0xe5, 0xc2, 0xd4, 0xd2, 0xc3, 0xb, 0xa7,\n                                                       0xd8, 0xcf, 0xaf, 0xb8, 0x5e, 0xf7, 0xa, 0xfb,\n                                                       0xa, 0xf7, 0x22, 0x38, 0xc6, 0x83, 0x92, 0xb,\n                                                       0x74, 0x4e, 0x99, 0xa8, 0x98, 0x99, 0x8d, 0x95,\n                                                       0xbb, 0xa3, 0x72, 0x6e, 0xad, 0x1f, 0xb, 0x52,\n                                                       0x1b, 0x5f, 0x55, 0x58, 0x6a, 0x72, 0x1f, 0xb,\n                                                       0x9d, 0x90, 0x8a, 0x90, 0x90, 0x1a, 0x71, 0xaf,\n                                                       0xb, 0x79, 0x86, 0x8c, 0x86, 0x86, 0x1a, 0xa5,\n                                                       0x67, 0xb, 0x13, 0xb2, 0x5a, 0x96, 0x56, 0xa0,\n                                                       0xb, 0xfb, 0xde, 0x6c, 0x76, 0xf9, 0xa2, 0x77,\n                                                       0x1, 0xaf, 0xf8, 0x49, 0x3, 0xb, 0xf7, 0x22,\n                                                       0xfb, 0xb, 0xc6, 0x51, 0xf7, 0xa, 0x5d, 0xb8,\n                                                       0x5f, 0xb8, 0xb, 0x9c, 0xf7, 0x1b, 0xcb, 0xf7,\n                                                       0x5b, 0x1a, 0xe0, 0x53, 0xf5, 0x2a, 0xb, 0xa5,\n                                                       0xa5, 0xa1, 0x76, 0x71, 0x71, 0x75, 0x75, 0x71,\n                                                       0x71, 0x75, 0xb, 0xf7, 0x4a, 0xfb, 0x6b, 0x15,\n                                                       0xb, 0xfb, 0x7f, 0x15, 0xb, 0xf7, 0x4a, 0x72,\n                                                       0xa4, 0xf7, 0x84, 0xa4, 0x72, 0xf7, 0x4a, 0xb,\n                                                       0x15, 0xf8, 0xad, 0xf8, 0xa8, 0xfc, 0xad, 0x7,\n                                                       0xe, 0x13, 0xe4, 0x82, 0xb9, 0x55, 0x40, 0xb,\n                                                       0x13, 0xb2, 0x96, 0x96, 0x56, 0xa0, 0xb, 0x13,\n                                                       0xb2, 0x9a, 0x96, 0x55, 0xa0, 0xb, 0x75, 0x84,\n                                                       0x76, 0x81, 0x78, 0x7e, 0xb, 0xf7, 0x11, 0xf8,\n                                                       0x78, 0xf7, 0x2, 0xb, 0xf7, 0x78, 0xf8, 0x6b,\n                                                       0x12, 0xb0, 0xb, 0xae, 0x1, 0xae, 0xae, 0xb,\n                                                       0x5, 0x8d, 0x7, 0xb, 0xf7, 0xf3, 0xf7, 0x7c,\n                                                       0xfb, 0xf3, 0xf7, 0x7c, 0x5, 0xb, 0x7e, 0x7d,\n                                                       0x89, 0x81, 0x5b, 0x73, 0xa4, 0xa8, 0x69, 0xb,\n                                                       0x15, 0x9b, 0x7b, 0x9d, 0x82, 0x90, 0x90, 0x90,\n                                                       0x90, 0xb, 0x15, 0x90, 0x86, 0x9d, 0x94, 0x9b,\n                                                       0x9b, 0x9b, 0x9b, 0xb, 0x3, 0xae, 0x16, 0xb,\n                                                       0x9a, 0x85, 0x97, 0x1e, 0x82, 0x9d, 0x80, 0x98,\n                                                       0xb, 0x99, 0x8b, 0xf7, 0x2, 0x3e, 0xb7, 0xac,\n                                                       0x99, 0xb, 0xfb, 0xad, 0x5, 0xf7, 0x35, 0x7,\n                                                       0xe, 0x13, 0x94, 0x54, 0xec, 0x1b, 0xb, 0x1f,\n                                                       0x8d, 0x8d, 0x5, 0xb, 0x5, 0x89, 0x7, 0xb\n                                                      };\n"
  },
  {
    "path": "core/src/fxge/fontdata/chromefontdata/FoxitFixed.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nconst unsigned char g_FoxitFixedFontData [17597] = {0x1,\n                                                    0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0xe,\n                                                    0x43, 0x68, 0x72, 0x6f, 0x6d, 0x46, 0x69, 0x78,\n                                                    0x65, 0x64, 0x4f, 0x54, 0x46, 0x0, 0x1, 0x1,\n                                                    0x1, 0x23, 0xf8, 0x10, 0x0, 0xf8, 0x2a, 0x1,\n                                                    0xf8, 0x2b, 0x2, 0xf8, 0x2b, 0x3, 0xf8, 0x18,\n                                                    0x4, 0x6f, 0xfb, 0x8d, 0xf9, 0x8, 0xf9, 0xb7,\n                                                    0x5, 0xf7, 0x85, 0xf, 0xf9, 0x6c, 0x11, 0xaa,\n                                                    0x1c, 0x3e, 0x6b, 0x12, 0x0, 0x11, 0x1, 0x1,\n                                                    0x5, 0xb, 0xd, 0x11, 0x19, 0x22, 0x2b, 0x34,\n                                                    0x3e, 0x45, 0x4b, 0x4d, 0x51, 0x5d, 0x65, 0x8f,\n                                                    0x9e, 0x45, 0x75, 0x72, 0x6f, 0x47, 0x63, 0x61,\n                                                    0x72, 0x6f, 0x6e, 0x49, 0x4a, 0x49, 0x64, 0x6f,\n                                                    0x74, 0x53, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c,\n                                                    0x61, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x62, 0x6f,\n                                                    0x74, 0x68, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64,\n                                                    0x6f, 0x77, 0x6e, 0x61, 0x72, 0x72, 0x6f, 0x77,\n                                                    0x6c, 0x65, 0x66, 0x74, 0x61, 0x72, 0x72, 0x6f,\n                                                    0x77, 0x72, 0x69, 0x67, 0x68, 0x74, 0x61, 0x72,\n                                                    0x72, 0x6f, 0x77, 0x75, 0x70, 0x67, 0x63, 0x61,\n                                                    0x72, 0x6f, 0x6e, 0x69, 0x6a, 0x6c, 0x69, 0x72,\n                                                    0x61, 0x70, 0x72, 0x65, 0x73, 0x63, 0x72, 0x69,\n                                                    0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x63, 0x65,\n                                                    0x64, 0x69, 0x6c, 0x6c, 0x61, 0x20, 0x20, 0x20,\n                                                    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                    0x20, 0x20, 0x68, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43,\n                                                    0x68, 0x72, 0x6f, 0x6d, 0x20, 0x46, 0x69, 0x78,\n                                                    0x65, 0x64, 0x20, 0x4f, 0x54, 0x46, 0x0, 0x0,\n                                                    0x0, 0x0, 0x22, 0x0, 0x8a, 0x0, 0xab, 0x0,\n                                                    0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf, 0x0,\n                                                    0xb0, 0x0, 0x23, 0x0, 0x24, 0x0, 0xb1, 0x0,\n                                                    0x25, 0x0, 0x26, 0x0, 0xb2, 0x0, 0xb3, 0x0,\n                                                    0xb4, 0x0, 0xb5, 0x0, 0x9a, 0x1, 0x87, 0x0,\n                                                    0x27, 0x0, 0x28, 0x1, 0x88, 0x0, 0x29, 0x0,\n                                                    0x2a, 0x1, 0x89, 0x0, 0xb6, 0x0, 0xb7, 0x0,\n                                                    0xb8, 0x1, 0x8a, 0x0, 0xb9, 0x0, 0x2b, 0x0,\n                                                    0x2c, 0x0, 0x2d, 0x0, 0x8c, 0x0, 0x2e, 0x0,\n                                                    0x2f, 0x0, 0xba, 0x0, 0x30, 0x0, 0x8e, 0x0,\n                                                    0xbb, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0,\n                                                    0x8d, 0x0, 0xbf, 0x0, 0x31, 0x0, 0x32, 0x0,\n                                                    0x33, 0x0, 0x34, 0x0, 0xc0, 0x1, 0x8b, 0x0,\n                                                    0x35, 0x0, 0x9d, 0x0, 0x36, 0x0, 0xc1, 0x0,\n                                                    0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0x37, 0x0,\n                                                    0x38, 0x0, 0x39, 0x0, 0x3a, 0x0, 0xc5, 0x0,\n                                                    0xc6, 0x0, 0x3b, 0x0, 0xc7, 0x0, 0x42, 0x0,\n                                                    0xc8, 0x0, 0xc9, 0x0, 0x7d, 0x0, 0xca, 0x0,\n                                                    0x90, 0x0, 0xcb, 0x0, 0x7, 0x0, 0xcc, 0x1,\n                                                    0x8c, 0x1, 0x8d, 0x1, 0x8e, 0x1, 0x8f, 0x1,\n                                                    0x90, 0x0, 0x3f, 0x0, 0x5f, 0x0, 0xb, 0x0,\n                                                    0x21, 0x0, 0xcd, 0x0, 0x43, 0x0, 0x3d, 0x0,\n                                                    0x5d, 0x0, 0x5c, 0x0, 0x5e, 0x0, 0x3c, 0x0,\n                                                    0x3e, 0x0, 0x81, 0x0, 0xa0, 0x0, 0x74, 0x0,\n                                                    0x44, 0x0, 0x88, 0x0, 0xce, 0x0, 0x85, 0x0,\n                                                    0x61, 0x0, 0x7e, 0x0, 0x1b, 0x0, 0xd, 0x0,\n                                                    0xaa, 0x0, 0x67, 0x0, 0x45, 0x0, 0x70, 0x0,\n                                                    0x71, 0x0, 0xa1, 0x0, 0x83, 0x0, 0x9f, 0x0,\n                                                    0x5, 0x0, 0x82, 0x0, 0x91, 0x0, 0x46, 0x0,\n                                                    0xcf, 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0,\n                                                    0x19, 0x0, 0x79, 0x0, 0x89, 0x0, 0x6f, 0x0,\n                                                    0x1e, 0x0, 0xa7, 0x0, 0x2, 0x0, 0x60, 0x0,\n                                                    0x47, 0x0, 0x6d, 0x0, 0x16, 0x0, 0x6e, 0x0,\n                                                    0x65, 0x0, 0x15, 0x0, 0x63, 0x0, 0x48, 0x1,\n                                                    0x91, 0x0, 0x95, 0x0, 0x7c, 0x0, 0x1f, 0x0,\n                                                    0x6a, 0x0, 0x78, 0x0, 0x6b, 0x0, 0x6c, 0x0,\n                                                    0x49, 0x0, 0x86, 0x0, 0xe, 0x0, 0x4a, 0x0,\n                                                    0xd3, 0x0, 0xd4, 0x0, 0xd5, 0x0, 0xd6, 0x1,\n                                                    0x92, 0x0, 0x4b, 0x0, 0x4c, 0x0, 0x4d, 0x0,\n                                                    0x1d, 0x1, 0x93, 0x0, 0x97, 0x0, 0x92, 0x0,\n                                                    0x4e, 0x0, 0x80, 0x0, 0xa6, 0x0, 0x98, 0x0,\n                                                    0xa8, 0x0, 0x4f, 0x0, 0x1a, 0x0, 0xd7, 0x0,\n                                                    0x4, 0x0, 0x50, 0x0, 0xd8, 0x0, 0xd9, 0x0,\n                                                    0xda, 0x0, 0x94, 0x0, 0x87, 0x0, 0xdb, 0x0,\n                                                    0x12, 0x0, 0x9b, 0x0, 0x9e, 0x0, 0x96, 0x0,\n                                                    0x8b, 0x0, 0x8f, 0x0, 0x93, 0x0, 0xdc, 0x0,\n                                                    0x51, 0x0, 0x73, 0x0, 0x9, 0x0, 0xa, 0x0,\n                                                    0x6, 0x0, 0xf, 0x0, 0x72, 0x0, 0x7a, 0x0,\n                                                    0xc, 0x0, 0x9c, 0x1, 0x94, 0x0, 0x52, 0x0,\n                                                    0x20, 0x0, 0x7b, 0x0, 0x3, 0x0, 0x76, 0x0,\n                                                    0x69, 0x0, 0x77, 0x0, 0x41, 0x0, 0x8, 0x0,\n                                                    0x75, 0x0, 0x68, 0x0, 0x53, 0x0, 0xa5, 0x0,\n                                                    0x84, 0x0, 0x54, 0x0, 0xdd, 0x1, 0x95, 0x0,\n                                                    0x66, 0x0, 0x1c, 0x0, 0x18, 0x0, 0x17, 0x0,\n                                                    0x10, 0x0, 0x1, 0x0, 0x62, 0x0, 0x55, 0x0,\n                                                    0xa2, 0x0, 0x14, 0x0, 0xa3, 0x0, 0xa9, 0x0,\n                                                    0x7f, 0x0, 0x99, 0x0, 0x13, 0x0, 0xa4, 0x0,\n                                                    0x56, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, 0x0,\n                                                    0xe1, 0x0, 0x40, 0x0, 0x57, 0x0, 0x58, 0x0,\n                                                    0x59, 0x0, 0x5a, 0x0, 0xe2, 0x0, 0xe3, 0x0,\n                                                    0x64, 0x0, 0x5b, 0x0, 0xe4, 0x0, 0x11, 0x0,\n                                                    0xf4, 0x2, 0x0, 0x1, 0x0, 0x2, 0x0, 0x4e,\n                                                    0x0, 0xa8, 0x0, 0xc5, 0x0, 0xf1, 0x1, 0x22,\n                                                    0x1, 0x41, 0x1, 0x8a, 0x1, 0xd7, 0x2, 0x3b,\n                                                    0x2, 0x86, 0x3, 0x4, 0x3, 0x3e, 0x3, 0x79,\n                                                    0x3, 0x92, 0x3, 0xbf, 0x3, 0xf5, 0x4, 0xa,\n                                                    0x4, 0x57, 0x4, 0xd4, 0x5, 0xb, 0x5, 0x3c,\n                                                    0x5, 0x71, 0x5, 0xac, 0x5, 0xc9, 0x6, 0x15,\n                                                    0x6, 0x32, 0x6, 0x5b, 0x6, 0x78, 0x6, 0xa1,\n                                                    0x6, 0xbd, 0x6, 0xef, 0x7, 0x39, 0x7, 0x5b,\n                                                    0x7, 0x95, 0x7, 0xd5, 0x8, 0x7, 0x8, 0x7a,\n                                                    0x8, 0xc3, 0x9, 0x1c, 0x9, 0x39, 0x9, 0x4b,\n                                                    0x9, 0x6d, 0x9, 0x88, 0xa, 0x1, 0xa, 0x47,\n                                                    0xa, 0x8b, 0xb, 0x27, 0xb, 0x83, 0xb, 0xfa,\n                                                    0xc, 0x80, 0xd, 0x26, 0xd, 0x5f, 0xd, 0xb9,\n                                                    0xd, 0xf8, 0xe, 0x15, 0xe, 0x25, 0xe, 0x46,\n                                                    0xe, 0x61, 0xe, 0x92, 0xe, 0xd8, 0xf, 0x1d,\n                                                    0xf, 0x5a, 0xf, 0x78, 0xf, 0x9e, 0xf, 0xc9,\n                                                    0x10, 0x10, 0x10, 0x73, 0x10, 0x89, 0x10, 0xab,\n                                                    0x10, 0xbd, 0x10, 0xf4, 0x11, 0x88, 0x11, 0x9e,\n                                                    0x12, 0x1d, 0x12, 0x5b, 0x12, 0x79, 0x12, 0xa1,\n                                                    0x12, 0xae, 0x12, 0xc6, 0x12, 0xec, 0x13, 0x1b,\n                                                    0x13, 0x5f, 0x13, 0x95, 0x14, 0x31, 0x14, 0x84,\n                                                    0x14, 0xe3, 0x14, 0xfb, 0x15, 0x10, 0x15, 0x61,\n                                                    0x15, 0xb3, 0x15, 0xd1, 0x15, 0xed, 0x16, 0x11,\n                                                    0x16, 0x2e, 0x16, 0x4f, 0x16, 0x96, 0x16, 0xb8,\n                                                    0x17, 0x37, 0x17, 0x77, 0x17, 0xd2, 0x17, 0xf7,\n                                                    0x18, 0xb, 0x18, 0x1e, 0x18, 0xa6, 0x19, 0x15,\n                                                    0x19, 0x73, 0x19, 0x96, 0x19, 0xda, 0x1a, 0x13,\n                                                    0x1a, 0x35, 0x1a, 0x58, 0x1a, 0xdf, 0x1a, 0xf1,\n                                                    0x1b, 0x7, 0x1b, 0x5b, 0x1b, 0x71, 0x1b, 0x93,\n                                                    0x1b, 0xa5, 0x1b, 0xc1, 0x1c, 0x36, 0x1c, 0x82,\n                                                    0x1c, 0x94, 0x1c, 0xa7, 0x1c, 0xc6, 0x1d, 0x38,\n                                                    0x1d, 0x70, 0x1d, 0x9f, 0x1d, 0xe4, 0x1e, 0x17,\n                                                    0x1e, 0x6b, 0x1e, 0x98, 0x1e, 0xf6, 0x1f, 0x2c,\n                                                    0x1f, 0x41, 0x1f, 0x7b, 0x1f, 0xc1, 0x20, 0x4a,\n                                                    0x20, 0x5b, 0x20, 0x82, 0x20, 0xb1, 0x20, 0xe2,\n                                                    0x21, 0x2, 0x21, 0x23, 0x21, 0x67, 0x21, 0x7d,\n                                                    0x21, 0x90, 0x21, 0xb5, 0x21, 0xcd, 0x21, 0xf6,\n                                                    0x22, 0x15, 0x22, 0x2d, 0x22, 0x85, 0x22, 0xc6,\n                                                    0x23, 0xc, 0x23, 0x25, 0x23, 0x4a, 0x23, 0xeb,\n                                                    0x24, 0x2, 0x24, 0x36, 0x24, 0x91, 0x24, 0xa6,\n                                                    0x24, 0xb9, 0x25, 0xa, 0x25, 0x36, 0x25, 0x76,\n                                                    0x25, 0xc8, 0x26, 0x55, 0x26, 0xb1, 0x26, 0xf3,\n                                                    0x27, 0xc, 0x27, 0x33, 0x27, 0x53, 0x27, 0xd5,\n                                                    0x28, 0x4, 0x28, 0x1d, 0x28, 0x41, 0x28, 0xac,\n                                                    0x29, 0xf, 0x29, 0x33, 0x29, 0x8f, 0x29, 0xca,\n                                                    0x2a, 0x3f, 0x2a, 0x92, 0x2a, 0xe1, 0x2b, 0xb,\n                                                    0x2b, 0x3e, 0x2b, 0x71, 0x2b, 0xb3, 0x2b, 0xcc,\n                                                    0x2b, 0xed, 0x2c, 0x52, 0x2c, 0x77, 0x2c, 0xa7,\n                                                    0x2d, 0x19, 0x2d, 0x66, 0x2d, 0xab, 0x2e, 0x7,\n                                                    0x2e, 0x1e, 0x2e, 0x26, 0x2e, 0x48, 0x2e, 0x50,\n                                                    0x2e, 0x5e, 0x2e, 0x6c, 0x2e, 0x7a, 0x2e, 0x90,\n                                                    0x2e, 0xda, 0x2f, 0x66, 0x2f, 0x9f, 0x30, 0xc,\n                                                    0x30, 0x94, 0x31, 0x3a, 0x31, 0xe9, 0x32, 0x9,\n                                                    0x32, 0x27, 0x32, 0x79, 0x32, 0x90, 0x32, 0x91,\n                                                    0x33, 0x25, 0x33, 0x63, 0x33, 0xbd, 0x34, 0x1f,\n                                                    0x34, 0xb8, 0x35, 0x15, 0x35, 0x56, 0x35, 0x9a,\n                                                    0x35, 0xe0, 0x36, 0x1f, 0x36, 0x64, 0x36, 0x7b,\n                                                    0x36, 0x9b, 0x36, 0xcd, 0x36, 0xe4, 0x36, 0xf4,\n                                                    0x37, 0x25, 0x37, 0x65, 0x37, 0xb2, 0x37, 0xec,\n                                                    0x38, 0x36, 0x38, 0x8f, 0x38, 0xe7, 0x39, 0x10,\n                                                    0x39, 0x5a, 0x39, 0xa7, 0xe, 0x8b, 0xc1, 0xf7,\n                                                    0x4, 0xc1, 0xf7, 0xb4, 0xc1, 0x1, 0x8e, 0xf7,\n                                                    0x63, 0xab, 0xee, 0xbf, 0xf7, 0x60, 0x3, 0x8e,\n                                                    0x16, 0xf7, 0x63, 0xc1, 0x33, 0x6, 0xb6, 0xf7,\n                                                    0x4, 0x5, 0xf7, 0xaa, 0x6, 0xb7, 0xfb, 0x4,\n                                                    0x5, 0x2d, 0x55, 0xf7, 0x60, 0xc1, 0x56, 0x6,\n                                                    0xfb, 0x5f, 0xf8, 0x90, 0x5, 0xfb, 0x81, 0x55,\n                                                    0xf7, 0x1e, 0x6, 0xfb, 0x46, 0xfc, 0x5a, 0x5,\n                                                    0x4e, 0x6, 0xf7, 0x4a, 0xf7, 0x3a, 0x15, 0xf7,\n                                                    0x7, 0xf7, 0xba, 0xf7, 0xf, 0xfb, 0xba, 0x5,\n                                                    0xe, 0x8b, 0xc2, 0xf7, 0x3, 0xc2, 0xac, 0xc2,\n                                                    0xf7, 0x5b, 0xc1, 0x1, 0xdc, 0xc4, 0xf7, 0xa,\n                                                    0xc3, 0x8b, 0xc2, 0xdc, 0xc1, 0x9c, 0xc2, 0x3,\n                                                    0xa5, 0x16, 0xf7, 0x5a, 0xc2, 0x35, 0x6, 0xb7,\n                                                    0xf7, 0x3, 0x5, 0xf7, 0x16, 0xfb, 0x3a, 0xf7,\n                                                    0x9a, 0xf7, 0x2e, 0x54, 0x28, 0xfb, 0x2c, 0xf7,\n                                                    0x5b, 0xdc, 0x53, 0xc1, 0xf7, 0x3a, 0x55, 0x54,\n                                                    0x3a, 0xf7, 0x5b, 0xf7, 0x2c, 0x25, 0xc2, 0xf7,\n                                                    0x30, 0xfc, 0x2c, 0x55, 0xe5, 0x6, 0xfb, 0x43,\n                                                    0xfc, 0x59, 0x5, 0x54, 0x6, 0xf7, 0x44, 0xf7,\n                                                    0x3a, 0x15, 0xf7, 0x2, 0xf7, 0xb2, 0x5, 0xfb,\n                                                    0xb2, 0x7, 0xe, 0x4d, 0xa, 0xf7, 0x78, 0x77,\n                                                    0x1, 0x54, 0xa, 0x3, 0x8e, 0x16, 0x24, 0xa,\n                                                    0xfb, 0x95, 0xf8, 0x18, 0x15, 0xf7, 0xac, 0xf0,\n                                                    0x6a, 0xd4, 0xfb, 0x96, 0xfb, 0x24, 0x5, 0xe,\n                                                    0x4d, 0xa, 0xf7, 0x2f, 0xc2, 0x1, 0x54, 0xa,\n                                                    0x3, 0xf7, 0x2d, 0xf8, 0xf1, 0x15, 0xf7, 0x26,\n                                                    0xf7, 0x7, 0xf7, 0x22, 0xfb, 0x7, 0xb3, 0x9d,\n                                                    0xfb, 0x24, 0xf7, 0x2c, 0x5, 0x3d, 0x6, 0xfb,\n                                                    0x25, 0xfb, 0x2c, 0x5, 0xfb, 0x3, 0xfd, 0x3,\n                                                    0x15, 0x24, 0xa, 0xe, 0x8b, 0xc1, 0xf7, 0x11,\n                                                    0xc1, 0xf7, 0xaa, 0xc1, 0xda, 0xf7, 0x9, 0x12,\n                                                    0x8e, 0xf7, 0x63, 0x73, 0xdc, 0xca, 0xdc, 0x79,\n                                                    0xf7, 0x60, 0x13, 0xf6, 0xf7, 0xde, 0xf9, 0x18,\n                                                    0x72, 0xa, 0xfb, 0x24, 0xfb, 0x9, 0x72, 0xa,\n                                                    0xfb, 0x4b, 0xfd, 0x8d, 0x15, 0x2d, 0xa, 0x6,\n                                                    0x13, 0xe9, 0x39, 0xa, 0xe, 0x4d, 0xa, 0x12,\n                                                    0x54, 0xa, 0x17, 0x8e, 0x16, 0x25, 0xa, 0x13,\n                                                    0x40, 0xf7, 0x3, 0xf7, 0xbb, 0xf7, 0xb, 0xfb,\n                                                    0xbb, 0x5, 0xfb, 0x9f, 0xf8, 0x7d, 0x79, 0xa,\n                                                    0xf7, 0x24, 0x5, 0xe, 0x4d, 0xa, 0xb0, 0xbd,\n                                                    0xdb, 0xbe, 0x12, 0x8e, 0xf7, 0x63, 0x83, 0xbe,\n                                                    0xdb, 0xc0, 0x92, 0xf7, 0x60, 0x13, 0xfb, 0x80,\n                                                    0xf7, 0x5e, 0xf9, 0x47, 0x15, 0x58, 0xb4, 0x65,\n                                                    0xbe, 0xbe, 0xb4, 0xb1, 0xbe, 0xbe, 0x62, 0xb4,\n                                                    0x58, 0x58, 0x62, 0x62, 0x58, 0x1e, 0xbe, 0x8c,\n                                                    0x15, 0xa1, 0x9d, 0x9d, 0xa1, 0xa1, 0x9d, 0x79,\n                                                    0x75, 0x75, 0x79, 0x79, 0x75, 0x75, 0x79, 0x9d,\n                                                    0xa1, 0x1e, 0x13, 0xfd, 0x80, 0xfb, 0x8e, 0xfd,\n                                                    0x48, 0x15, 0x24, 0xa, 0xe, 0x8b, 0xc1, 0xf7,\n                                                    0xb, 0xc1, 0xf7, 0xa7, 0xc1, 0xdd, 0xbc, 0x1,\n                                                    0x54, 0xa, 0x3, 0xf7, 0x31, 0xf9, 0x17, 0x15,\n                                                    0x9e, 0x93, 0x9e, 0xb4, 0xbc, 0x1b, 0xa1, 0x9d,\n                                                    0x7e, 0x7c, 0xa0, 0x1f, 0x79, 0xa4, 0xa7, 0x78,\n                                                    0xb2, 0x1b, 0xcf, 0xad, 0xca, 0xb1, 0x96, 0x1f,\n                                                    0x58, 0x94, 0x5, 0x73, 0x83, 0x72, 0x66, 0x65,\n                                                    0x1b, 0x75, 0x7a, 0x9d, 0x9c, 0x75, 0x1f, 0x9a,\n                                                    0x77, 0x72, 0x9a, 0x63, 0x1b, 0x52, 0x5b, 0x5d,\n                                                    0x56, 0x78, 0x1f, 0x23, 0xfd, 0x21, 0x15, 0x24,\n                                                    0xa, 0xe, 0x8b, 0xc1, 0xf7, 0x5b, 0xc2, 0xf7,\n                                                    0x5c, 0xc1, 0x12, 0xf7, 0xb, 0xc2, 0xf7, 0xb0,\n                                                    0xc9, 0x74, 0xc8, 0x13, 0xf4, 0xb5, 0x16, 0xf7,\n                                                    0xbd, 0x6, 0xf7, 0x17, 0xe3, 0xb6, 0xf7, 0x0,\n                                                    0xd8, 0x4b, 0xb5, 0x4b, 0x97, 0x1f, 0x13, 0xf8,\n                                                    0xc0, 0x9b, 0xb0, 0xc7, 0xc1, 0x1a, 0xf7, 0xb,\n                                                    0x34, 0xaa, 0xfb, 0xc, 0x1e, 0xfb, 0xa3, 0x55,\n                                                    0xd8, 0xfc, 0x5a, 0x3e, 0x6, 0xf7, 0x18, 0xf7,\n                                                    0x8f, 0x15, 0xf7, 0x5f, 0x7, 0xf7, 0x2d, 0xf7,\n                                                    0x17, 0x92, 0x24, 0x32, 0x34, 0x79, 0x55, 0x1f,\n                                                    0xfb, 0x23, 0xfb, 0x8f, 0x15, 0xf7, 0x58, 0x7,\n                                                    0x13, 0xf4, 0xf7, 0x5d, 0xf7, 0xe, 0x7c, 0x36,\n                                                    0x37, 0x2e, 0x7f, 0x4a, 0x1f, 0xe, 0x79, 0xc1,\n                                                    0xf8, 0x7e, 0xc1, 0x1, 0xb9, 0xc3, 0xf8, 0x13,\n                                                    0xc1, 0x3, 0xf8, 0x9b, 0xf5, 0x15, 0x64, 0x56,\n                                                    0x39, 0x6c, 0x47, 0x1b, 0xfb, 0x9, 0x2a, 0xe9,\n                                                    0xf7, 0x32, 0xf7, 0x3f, 0xf7, 0x1f, 0xce, 0xd6,\n                                                    0xcb, 0xd5, 0x64, 0x59, 0xaa, 0x1f, 0x31, 0xc1,\n                                                    0xf7, 0x7d, 0x55, 0x4e, 0x7, 0xbd, 0x56, 0x4c,\n                                                    0x96, 0x56, 0x1b, 0xfb, 0x31, 0xfb, 0x5, 0xfb,\n                                                    0x1f, 0xfb, 0x2d, 0xfb, 0x39, 0xec, 0xfb, 0x21,\n                                                    0xf7, 0x41, 0xda, 0xe8, 0xa9, 0xb8, 0xc8, 0x1f,\n                                                    0xe, 0xfb, 0x16, 0x76, 0xf7, 0x3f, 0xbf, 0xf8,\n                                                    0x5d, 0xbe, 0x1, 0xbd, 0xc4, 0xf8, 0x15, 0xc4,\n                                                    0x3, 0xf7, 0x7c, 0xfb, 0xb, 0x15, 0x83, 0x92,\n                                                    0xa2, 0x73, 0xa7, 0x1b, 0xad, 0xb0, 0xa0, 0xc5,\n                                                    0xab, 0x7a, 0xa8, 0x6f, 0x94, 0x1f, 0x8d, 0xa1,\n                                                    0x5, 0xe6, 0xd9, 0xa3, 0xb5, 0xc9, 0x1f, 0x73,\n                                                    0xbb, 0x5, 0x66, 0x55, 0x47, 0x72, 0x46, 0x1b,\n                                                    0xfb, 0x15, 0x29, 0xe1, 0xf7, 0x28, 0xf7, 0x43,\n                                                    0xf7, 0x1f, 0xbb, 0xd7, 0xcc, 0xc7, 0x6e, 0x5f,\n                                                    0xb8, 0x1f, 0x35, 0xc4, 0xf7, 0x66, 0x52, 0x52,\n                                                    0x7, 0xbd, 0x43, 0x59, 0x92, 0x54, 0x1b, 0xfb,\n                                                    0x33, 0x21, 0xfb, 0x11, 0xfb, 0x24, 0xfb, 0x1e,\n                                                    0xd4, 0xfb, 0xe, 0xf7, 0x28, 0x70, 0x1f, 0x82,\n                                                    0x42, 0x5, 0x8f, 0x94, 0x94, 0x8b, 0x94, 0x1b,\n                                                    0x9a, 0x97, 0x7d, 0x7f, 0x76, 0x7d, 0x81, 0x7c,\n                                                    0x7d, 0x7b, 0x90, 0x9a, 0x82, 0x1f, 0xe, 0x46,\n                                                    0xa, 0xf7, 0x3, 0xc4, 0xf7, 0xe6, 0xc6, 0x3,\n                                                    0xad, 0x16, 0xf7, 0x7a, 0x6, 0xf7, 0x21, 0xf7,\n                                                    0x34, 0xc4, 0xf7, 0x7b, 0xf7, 0x62, 0xfb, 0x1c,\n                                                    0xcf, 0xfb, 0x39, 0x1f, 0xfb, 0x7a, 0x54, 0xd8,\n                                                    0xfc, 0x58, 0x3e, 0x6, 0xf7, 0x1a, 0x16, 0xf8,\n                                                    0x58, 0xeb, 0x7, 0xf7, 0x31, 0xe0, 0x47, 0xfb,\n                                                    0x2b, 0xfb, 0x35, 0x31, 0x43, 0xfb, 0x2c, 0x1f,\n                                                    0xe, 0x8b, 0xc0, 0xf7, 0x5c, 0xc1, 0xf7, 0x5d,\n                                                    0xc1, 0x1, 0xf7, 0x1a, 0xc3, 0xf7, 0x7, 0xc4,\n                                                    0xef, 0xc3, 0x3, 0xbf, 0x16, 0xf8, 0x66, 0xf7,\n                                                    0x4f, 0x53, 0xfb, 0x1a, 0xfb, 0xa4, 0xf7, 0x5c,\n                                                    0xf7, 0x7, 0x39, 0xc4, 0xf7, 0x6f, 0x52, 0x38,\n                                                    0xfb, 0x7, 0xf7, 0x5d, 0xf7, 0xa4, 0xfb, 0x1a,\n                                                    0xc3, 0xf7, 0x50, 0xfc, 0x66, 0x55, 0xdd, 0xfc,\n                                                    0x5b, 0x39, 0x6, 0xe, 0x47, 0xa, 0xf7, 0x58,\n                                                    0xf8, 0xfe, 0x15, 0xf7, 0xb8, 0xf0, 0x69, 0xd5,\n                                                    0xfb, 0xa3, 0xfb, 0x25, 0x5, 0xfb, 0x18, 0xfd,\n                                                    0x1c, 0x15, 0x2f, 0xa, 0xe, 0x4e, 0xa, 0xf7,\n                                                    0x7a, 0x77, 0x12, 0x61, 0xa, 0x17, 0xf7, 0x36,\n                                                    0xf9, 0x5, 0x15, 0x13, 0xfe, 0xf7, 0x2d, 0xf7,\n                                                    0x7, 0xf7, 0x29, 0xfb, 0x7, 0xb5, 0x9d, 0xfb,\n                                                    0x2b, 0xf7, 0x2c, 0x5, 0x39, 0x6, 0xfb, 0x2b,\n                                                    0xfb, 0x2b, 0x5, 0x44, 0xfd, 0x18, 0x15, 0x2f,\n                                                    0xa, 0xe, 0x4e, 0xa, 0xe5, 0xf7, 0x8, 0x12,\n                                                    0xf7, 0x1a, 0xc2, 0x93, 0xe0, 0xcb, 0xe1, 0x3c,\n                                                    0xc4, 0xdd, 0xc3, 0x13, 0xfe, 0x80, 0xf7, 0xee,\n                                                    0xf9, 0x23, 0x15, 0xe1, 0xf7, 0x8, 0x35, 0x6,\n                                                    0xfb, 0x29, 0xfb, 0x8, 0x15, 0xe0, 0xf7, 0x8,\n                                                    0x36, 0x6, 0xfb, 0x26, 0xfd, 0x97, 0x15, 0x40,\n                                                    0xa, 0x6, 0x13, 0xfd, 0x80, 0x2e, 0xa, 0xe,\n                                                    0x47, 0xa, 0xbe, 0x16, 0x2f, 0xa, 0xf8, 0x27,\n                                                    0xf8, 0xc9, 0x15, 0x96, 0xa9, 0xfb, 0xa4, 0xf7,\n                                                    0x24, 0x69, 0x42, 0x5, 0xe, 0x8b, 0xc1, 0xf7,\n                                                    0x56, 0xc0, 0xf7, 0x63, 0xc1, 0x1, 0xf7, 0x1,\n                                                    0xc3, 0xf7, 0xeb, 0xcb, 0x3, 0xa7, 0x16, 0xf7,\n                                                    0x8d, 0x6, 0xf7, 0x35, 0xf7, 0x1a, 0xc4, 0xf7,\n                                                    0x7f, 0xf7, 0x68, 0xfb, 0x33, 0xc5, 0xfb, 0x37,\n                                                    0x1f, 0xfb, 0x72, 0x55, 0xdc, 0xfb, 0x63, 0x3d,\n                                                    0x56, 0xd9, 0xfb, 0x56, 0x3a, 0x6, 0xf7, 0x1d,\n                                                    0x16, 0xf7, 0x56, 0xf7, 0x4d, 0xc0, 0xfb, 0x4d,\n                                                    0xf7, 0x63, 0xe0, 0x7, 0xf7, 0x37, 0xea, 0x4c,\n                                                    0xfb, 0x2d, 0xfb, 0x3b, 0x41, 0x44, 0xfb, 0x31,\n                                                    0x1f, 0xe, 0x8b, 0xbf, 0xf7, 0x27, 0xbf, 0xc3,\n                                                    0xc0, 0xf7, 0x2b, 0xbe, 0x1, 0xd8, 0xc7, 0xf8,\n                                                    0x25, 0xc6, 0x3, 0x8e, 0xf7, 0x57, 0x15, 0xe0,\n                                                    0x6, 0xfb, 0x9, 0xaa, 0xe8, 0x3d, 0xf7, 0x30,\n                                                    0x1b, 0xde, 0xdc, 0xa6, 0xb6, 0xcc, 0x1f, 0x71,\n                                                    0xb8, 0x5, 0x65, 0x53, 0x44, 0x72, 0x44, 0x1b,\n                                                    0x20, 0x35, 0xb8, 0xed, 0x6b, 0x1f, 0xf7, 0x83,\n                                                    0x6, 0xa1, 0xbf, 0x5, 0xfb, 0xa4, 0x6, 0x9b,\n                                                    0x89, 0xa7, 0x8d, 0x9b, 0x1e, 0xf7, 0xb7, 0x6,\n                                                    0x9f, 0xc0, 0x5, 0xfb, 0xc1, 0x6, 0xe4, 0xa4,\n                                                    0xd8, 0xc9, 0xf0, 0x1b, 0xd5, 0xd5, 0x73, 0x64,\n                                                    0xb3, 0x1f, 0x3e, 0xc6, 0xf7, 0x53, 0x50, 0x5a,\n                                                    0x7, 0xac, 0x56, 0x54, 0x9b, 0x3e, 0x1b, 0xfb,\n                                                    0x1f, 0x28, 0x33, 0xfb, 0x6, 0x6e, 0x1f, 0x4e,\n                                                    0x6, 0x75, 0x56, 0x5, 0xd5, 0x6, 0x70, 0x8c,\n                                                    0x75, 0x8c, 0x80, 0x1e, 0x55, 0x6, 0xe, 0x8b,\n                                                    0xc2, 0xf7, 0x5f, 0xc2, 0xf7, 0x56, 0xc2, 0x1,\n                                                    0xf7, 0x18, 0xc2, 0xf7, 0x35, 0xc2, 0xe3, 0xc2,\n                                                    0x3, 0xc1, 0x16, 0xf7, 0x9c, 0xc2, 0xfb, 0x17,\n                                                    0xf7, 0x5f, 0xf7, 0x35, 0x38, 0xc2, 0xf7, 0x72,\n                                                    0x54, 0x37, 0xfb, 0x35, 0xf7, 0x56, 0xf7, 0xc4,\n                                                    0xfb, 0x11, 0xc2, 0xf7, 0x48, 0xfc, 0x80, 0x54,\n                                                    0xd9, 0xfc, 0x58, 0x3d, 0x6, 0xe, 0x79, 0xc2,\n                                                    0xf7, 0x39, 0xc2, 0xf7, 0xa0, 0xc2, 0x1, 0xad,\n                                                    0xc5, 0xf8, 0x12, 0xc2, 0x3, 0xf7, 0xcc, 0x7c,\n                                                    0xa, 0x7b, 0x6a, 0x48, 0x79, 0x54, 0x1b, 0xfb,\n                                                    0x23, 0x37, 0xf7, 0x8, 0xf7, 0x12, 0xf7, 0x44,\n                                                    0xf7, 0x2, 0x43, 0xa, 0x23, 0xfb, 0x1d, 0xfb,\n                                                    0x37, 0xfb, 0x21, 0xdd, 0x53, 0xa, 0xe, 0x79,\n                                                    0xc2, 0xf7, 0x3b, 0xc2, 0xf7, 0x9e, 0xc2, 0x1,\n                                                    0xa7, 0xc5, 0xf8, 0x11, 0xc2, 0x3, 0xf7, 0xc5,\n                                                    0x7c, 0xa, 0x76, 0x4b, 0x67, 0x7e, 0x54, 0x1b,\n                                                    0xfb, 0x23, 0x38, 0xf7, 0x8, 0xf7, 0x12, 0xf7,\n                                                    0x44, 0xf7, 0x1, 0x43, 0xa, 0x24, 0xfb, 0x1d,\n                                                    0xfb, 0x37, 0xfb, 0x21, 0xdc, 0x53, 0xa, 0x68,\n                                                    0xf8, 0x6, 0x37, 0xa, 0x8b, 0xc2, 0xf7, 0x5a,\n                                                    0xc2, 0xf7, 0x5b, 0xc2, 0x1, 0xf7, 0x1, 0xc1,\n                                                    0xf7, 0xa6, 0xc1, 0x3, 0xab, 0x16, 0xf7, 0x70,\n                                                    0xc2, 0x32, 0xf7, 0x5a, 0xf7, 0xa6, 0xfb, 0x5a,\n                                                    0x33, 0x54, 0xf7, 0x6f, 0xc2, 0x3e, 0xf8, 0x58,\n                                                    0xd8, 0xc2, 0xfb, 0x65, 0x54, 0xd9, 0xfb, 0x5b,\n                                                    0xfb, 0xa6, 0xf7, 0x5b, 0xda, 0xc2, 0xfb, 0x66,\n                                                    0x54, 0xd8, 0xfc, 0x58, 0x3e, 0x6, 0xe, 0x46,\n                                                    0xa, 0xf7, 0xa3, 0xc2, 0x3, 0xeb, 0x16, 0xf8,\n                                                    0x2c, 0xc2, 0xfb, 0x46, 0xf8, 0x58, 0xf7, 0x38,\n                                                    0xc2, 0xfc, 0x11, 0x54, 0xf7, 0x36, 0xfc, 0x58,\n                                                    0xfb, 0x43, 0x6, 0xe, 0x79, 0xc3, 0xf8, 0x68,\n                                                    0xc3, 0x1, 0xec, 0xc5, 0xf7, 0xd, 0xc2, 0xf7,\n                                                    0x22, 0xc4, 0x3, 0xa3, 0x79, 0x15, 0xf7, 0x62,\n                                                    0xc3, 0x40, 0xf8, 0x68, 0xd1, 0xc3, 0xfb, 0x5c,\n                                                    0x53, 0xd3, 0xfc, 0x68, 0x42, 0x6, 0xf7, 0x90,\n                                                    0xa0, 0x15, 0x85, 0x8c, 0xaa, 0x44, 0xf1, 0x1b,\n                                                    0xf7, 0xb, 0x8c, 0xf7, 0x24, 0xc2, 0x1f, 0x8c,\n                                                    0xf7, 0xda, 0x5, 0xb7, 0xc2, 0xfb, 0x4c, 0x54,\n                                                    0xde, 0x6, 0x8a, 0xfb, 0xd9, 0x5, 0x6f, 0x8e,\n                                                    0xfb, 0xc, 0x45, 0x71, 0x5a, 0x95, 0x7f, 0xa,\n                                                    0x6c, 0xa, 0x1, 0xf7, 0xa3, 0xc5, 0x3, 0xf7,\n                                                    0x48, 0xf8, 0xfe, 0x15, 0xf7, 0xc7, 0xf2, 0x68,\n                                                    0xd3, 0xfb, 0xb1, 0xfb, 0x25, 0x5, 0x44, 0xfd,\n                                                    0x1c, 0x15, 0x32, 0xa, 0xe, 0x6c, 0xa, 0x1,\n                                                    0xf7, 0xa3, 0xc5, 0x3, 0xf7, 0x25, 0xf8, 0xfb,\n                                                    0x15, 0xf7, 0x2e, 0xf7, 0x7, 0xf7, 0x30, 0xfb,\n                                                    0x7, 0xb7, 0x9d, 0xfb, 0x31, 0xf7, 0x2c, 0x5,\n                                                    0x35, 0x6, 0xfb, 0x2f, 0xfb, 0x2c, 0x5, 0x86,\n                                                    0xfd, 0xd, 0x15, 0x32, 0xa, 0xe, 0x6c, 0xa,\n                                                    0xe3, 0xf7, 0x8, 0x1, 0xf7, 0xa3, 0xc5, 0x3,\n                                                    0xf7, 0xe6, 0xf9, 0x20, 0x76, 0xa, 0xfb, 0x31,\n                                                    0xfb, 0x8, 0x76, 0xa, 0x36, 0xfd, 0x94, 0x15,\n                                                    0x32, 0xa, 0xe, 0x8b, 0xc1, 0xf8, 0x5e, 0xc1,\n                                                    0xcd, 0xf7, 0x8, 0x12, 0xf7, 0x95, 0xe5, 0x3f,\n                                                    0xc5, 0x13, 0xe8, 0xeb, 0x16, 0xf8, 0x2c, 0xc1,\n                                                    0xfb, 0x43, 0xf8, 0x5e, 0x42, 0xa, 0xfc, 0x5e,\n                                                    0xfb, 0x43, 0x6, 0x13, 0xf0, 0xf7, 0x35, 0xf8,\n                                                    0xd6, 0x76, 0xa, 0xe, 0x6c, 0xa, 0x1, 0x8b,\n                                                    0xa0, 0xf7, 0x8e, 0xc5, 0x3, 0xeb, 0x16, 0x32,\n                                                    0xa, 0xb9, 0xf9, 0x2d, 0x15, 0xf7, 0xc8, 0x26,\n                                                    0x97, 0xa9, 0xfb, 0xaf, 0xf7, 0x25, 0x5, 0xe,\n                                                    0x79, 0xba, 0xf8, 0x72, 0xc2, 0x1, 0xb7, 0xc2,\n                                                    0xf7, 0xa2, 0xc0, 0x3, 0xb7, 0xca, 0x15, 0x4c,\n                                                    0xc8, 0xd7, 0x79, 0xd0, 0x1b, 0xf7, 0x31, 0x9a,\n                                                    0xf4, 0xe9, 0x1f, 0xf7, 0xda, 0xf7, 0x1a, 0xc2,\n                                                    0xfc, 0x15, 0x54, 0xf7, 0x5a, 0xfb, 0xd9, 0x7,\n                                                    0x36, 0x80, 0x47, 0xfb, 0x6, 0x50, 0x35, 0x9a,\n                                                    0x7f, 0xa, 0x8b, 0xc1, 0xf8, 0x59, 0xc2, 0x1,\n                                                    0xf6, 0xc0, 0xf7, 0x47, 0xf7, 0x59, 0x3, 0xa7,\n                                                    0x16, 0xf7, 0x71, 0xc1, 0x32, 0xf7, 0x38, 0x6,\n                                                    0xdd, 0xdd, 0xe6, 0xfb, 0xa, 0xbd, 0x2d, 0xb6,\n                                                    0x33, 0x19, 0xf7, 0x26, 0xc1, 0xfb, 0x6, 0x6,\n                                                    0x5e, 0xea, 0x4c, 0xf0, 0x44, 0xde, 0xf7, 0x4d,\n                                                    0xf7, 0x42, 0x18, 0xd3, 0xc2, 0xfb, 0x59, 0x54,\n                                                    0xc5, 0x6, 0xfb, 0x81, 0xfb, 0x73, 0x5, 0xf7,\n                                                    0x73, 0xd9, 0xc2, 0xfb, 0x66, 0x54, 0xda, 0xfc,\n                                                    0x59, 0x3c, 0x7, 0xe, 0x46, 0xa, 0xf7, 0x2c,\n                                                    0xc2, 0xf7, 0xb7, 0xc2, 0x3, 0xb9, 0x16, 0xf8,\n                                                    0x8f, 0xf7, 0x8b, 0x54, 0xfb, 0x54, 0xfb, 0xb7,\n                                                    0xf8, 0x58, 0xf7, 0x11, 0xc2, 0xfb, 0xb2, 0x54,\n                                                    0xf5, 0xfc, 0x58, 0x21, 0x6, 0xe, 0x75, 0xa,\n                                                    0xf7, 0x2d, 0xc3, 0xf7, 0xb4, 0xc3, 0x3, 0xb9,\n                                                    0x16, 0xf8, 0x8f, 0xf7, 0x91, 0x53, 0xfb, 0x5b,\n                                                    0xfb, 0xb4, 0xf7, 0x4e, 0x6, 0xf7, 0x43, 0xd1,\n                                                    0x5, 0xc2, 0x7, 0xfb, 0x43, 0x44, 0x5, 0xf7,\n                                                    0x6a, 0xf7, 0x12, 0xc1, 0xfb, 0xb5, 0x55, 0xf6,\n                                                    0xfb, 0x80, 0x7, 0x37, 0x69, 0x5, 0x55, 0x7,\n                                                    0xdf, 0xad, 0x5, 0xfb, 0x38, 0x20, 0x7, 0xe,\n                                                    0x46, 0xa, 0xd1, 0xc3, 0xf7, 0xf2, 0xc3, 0x3,\n                                                    0xa0, 0x16, 0xf7, 0x3a, 0xc2, 0x4e, 0xf8, 0x58,\n                                                    0x93, 0x6, 0xf7, 0x26, 0xfc, 0xe, 0x5, 0xb6,\n                                                    0x6, 0xf7, 0x23, 0xf8, 0xe, 0x5, 0x95, 0xfc,\n                                                    0x58, 0x52, 0x54, 0xf7, 0x34, 0xc2, 0x5c, 0xf8,\n                                                    0x58, 0xb9, 0xc2, 0xfb, 0x25, 0x6, 0xfb, 0x16,\n                                                    0xfb, 0xeb, 0xfb, 0x19, 0xf7, 0xeb, 0x5, 0xfb,\n                                                    0x29, 0x54, 0xbc, 0xfc, 0x58, 0x5a, 0x6, 0xe,\n                                                    0x46, 0xa, 0xe4, 0xc4, 0xf7, 0xcd, 0xc3, 0x3,\n                                                    0x92, 0x16, 0xf7, 0x8d, 0xc2, 0xfb, 0x2, 0xf8,\n                                                    0x41, 0x6, 0xf7, 0xba, 0xfc, 0x78, 0x5, 0xd6,\n                                                    0xf8, 0x8f, 0xd9, 0xc2, 0xfb, 0x93, 0x54, 0xf7,\n                                                    0xd, 0xfc, 0x44, 0x6, 0xfb, 0xb9, 0xf8, 0x7b,\n                                                    0x5, 0xfb, 0x33, 0x54, 0xdd, 0xfc, 0x58, 0x39,\n                                                    0x6, 0xe, 0x8c, 0xbf, 0xf8, 0x5b, 0xc0, 0xd7,\n                                                    0xbf, 0x99, 0xbc, 0x1, 0xe4, 0xc4, 0xf7, 0xcd,\n                                                    0xc3, 0x3, 0x92, 0x8c, 0x15, 0xf7, 0x8d, 0xbf,\n                                                    0xfb, 0x2, 0xf8, 0x45, 0x6, 0xf7, 0xba, 0xfc,\n                                                    0x79, 0x5, 0xd6, 0xf8, 0x8f, 0xd9, 0xc0, 0xfb,\n                                                    0x88, 0x56, 0xf7, 0x2, 0xfc, 0x47, 0x6, 0xfb,\n                                                    0xb9, 0xf8, 0x7c, 0x5, 0xfb, 0x33, 0x56, 0xdd,\n                                                    0xfc, 0x5b, 0x39, 0x6, 0xf7, 0x2e, 0xf8, 0xe0,\n                                                    0x15, 0x9f, 0x93, 0x9f, 0xb5, 0xbd, 0x1b, 0xa5,\n                                                    0xa1, 0x78, 0x79, 0xa4, 0x1f, 0x7a, 0xa3, 0xa5,\n                                                    0x7f, 0xaf, 0x1b, 0xd2, 0xae, 0xca, 0xb3, 0x96,\n                                                    0x1f, 0x57, 0x94, 0x5, 0x72, 0x81, 0x72, 0x68,\n                                                    0x64, 0x1b, 0x71, 0x7b, 0x9c, 0x9e, 0x71, 0x1f,\n                                                    0x99, 0x77, 0x72, 0x98, 0x64, 0x1b, 0x50, 0x59,\n                                                    0x5d, 0x55, 0x78, 0x1f, 0xe, 0x79, 0xc2, 0xf8,\n                                                    0x7c, 0xc2, 0x1, 0xb6, 0xc2, 0xf8, 0x22, 0xc8,\n                                                    0x3, 0xb6, 0xf7, 0xa7, 0x15, 0xfb, 0x38, 0xeb,\n                                                    0xfb, 0x15, 0xf7, 0x32, 0xf7, 0x36, 0xed, 0xf7,\n                                                    0x12, 0xf7, 0x3b, 0xf7, 0x16, 0x4b, 0xf7, 0x43,\n                                                    0xfb, 0x57, 0xfb, 0x45, 0x3d, 0xfb, 0x38, 0xfb,\n                                                    0x21, 0x1e, 0xc2, 0x16, 0xee, 0xb9, 0xf7, 0x2b,\n                                                    0xf7, 0x2d, 0xf7, 0x2d, 0xb9, 0xfb, 0x2e, 0x2b,\n                                                    0xfb, 0x1e, 0x3d, 0x27, 0xfb, 0xd, 0xfb, 0x9,\n                                                    0x39, 0xec, 0xf7, 0x21, 0x1e, 0xe, 0x87, 0xc1,\n                                                    0xf7, 0x4f, 0xc2, 0xf7, 0x6c, 0xc1, 0x12, 0x9f,\n                                                    0xc3, 0xf7, 0x81, 0xc3, 0xd2, 0xc2, 0xa8, 0xc3,\n                                                    0x17, 0xf8, 0x5, 0xbd, 0x15, 0xf7, 0x60, 0xd2,\n                                                    0x4a, 0xc2, 0xf7, 0x4c, 0x54, 0x4b, 0x44, 0xf7,\n                                                    0x5b, 0x7, 0x13, 0xfa, 0xf7, 0x2f, 0x27, 0xc3,\n                                                    0xf7, 0x2e, 0xfb, 0xac, 0x6, 0xfb, 0x64, 0x43,\n                                                    0xfb, 0x1a, 0xfb, 0x2b, 0xfb, 0x1d, 0xd3, 0xfb,\n                                                    0x24, 0xf7, 0x56, 0x1f, 0xf7, 0xba, 0xf7, 0x32,\n                                                    0x53, 0x23, 0x6, 0xfb, 0x67, 0x16, 0xfb, 0x1a,\n                                                    0x87, 0x24, 0xd3, 0xf7, 0x34, 0x1a, 0xf7, 0x3e,\n                                                    0xf2, 0xcd, 0xf7, 0x1a, 0x85, 0x1e, 0xe, 0x64,\n                                                    0xa, 0xf7, 0x6d, 0x77, 0x57, 0xa, 0xf7, 0x51,\n                                                    0xf8, 0xfe, 0x15, 0xf7, 0xb0, 0xf0, 0x6a, 0xd5,\n                                                    0xfb, 0x9b, 0xfb, 0x25, 0x5, 0xfb, 0x1a, 0xfc,\n                                                    0x5, 0x20, 0xa, 0xe, 0x64, 0xa, 0xd1, 0x76,\n                                                    0x57, 0xa, 0xf7, 0x32, 0xf9, 0x5, 0x49, 0xa,\n                                                    0x41, 0xfb, 0xff, 0x20, 0xa, 0xe, 0x64, 0xa,\n                                                    0xcf, 0xf7, 0x9, 0x1, 0xb6, 0xc1, 0xe9, 0xde,\n                                                    0xca, 0xde, 0xdc, 0xc3, 0x3, 0xf7, 0xe5, 0xf9,\n                                                    0x18, 0x62, 0xa, 0xfb, 0x26, 0xfb, 0x9, 0x62,\n                                                    0xa, 0xfb, 0x28, 0xfc, 0x76, 0x20, 0xa, 0xe,\n                                                    0x64, 0xa, 0xf7, 0x49, 0x77, 0x57, 0xa, 0xb6,\n                                                    0xf7, 0xab, 0x20, 0xa, 0xc6, 0xf8, 0x2f, 0x15,\n                                                    0xf7, 0xb0, 0x45, 0x96, 0xa9, 0xfb, 0x9a, 0xf7,\n                                                    0x1, 0x5, 0xe, 0x7a, 0x76, 0xa5, 0xc2, 0xf8,\n                                                    0x7b, 0xc2, 0x9c, 0x77, 0x12, 0xb2, 0xc2, 0xf8,\n                                                    0x2d, 0xc4, 0x13, 0xdc, 0xc1, 0x85, 0x15, 0xb6,\n                                                    0x6b, 0xc2, 0xd6, 0x5, 0x6c, 0xb4, 0xbe, 0x79,\n                                                    0xc5, 0x1b, 0xf7, 0x36, 0xeb, 0xf7, 0x1b, 0xf7,\n                                                    0x38, 0xbf, 0x7c, 0xe1, 0x5a, 0xcd, 0x1f, 0xc5,\n                                                    0xd9, 0x60, 0xac, 0x56, 0x44, 0x5, 0x13, 0xec,\n                                                    0xab, 0x65, 0x59, 0xa1, 0x48, 0x1b, 0xfb, 0x45,\n                                                    0x34, 0xfb, 0x31, 0xfb, 0x21, 0x38, 0xa5, 0x3f,\n                                                    0xba, 0x55, 0x1f, 0xd4, 0x93, 0x15, 0xf7, 0xa8,\n                                                    0xf7, 0xff, 0x5, 0xad, 0x56, 0x93, 0x49, 0x62,\n                                                    0x1a, 0xfb, 0x13, 0x46, 0xfb, 0x7, 0xfb, 0x17,\n                                                    0x5d, 0x63, 0x9a, 0xa3, 0x6b, 0x1e, 0x65, 0xb1,\n                                                    0x15, 0x69, 0xb7, 0x78, 0xc6, 0xc9, 0x1a, 0xe4,\n                                                    0xc0, 0xf7, 0x30, 0xf7, 0x2e, 0xc0, 0xb3, 0x7a,\n                                                    0x71, 0xa9, 0x1e, 0xe, 0x64, 0xa, 0xcc, 0xbc,\n                                                    0x98, 0xbc, 0x57, 0xa, 0xf7, 0x3c, 0xf9, 0x15,\n                                                    0x15, 0x9f, 0x92, 0x9e, 0xb5, 0xbc, 0x1b, 0xa9,\n                                                    0x9f, 0x7c, 0x79, 0xa1, 0x1f, 0x7b, 0xa0, 0xa2,\n                                                    0x7e, 0xb0, 0x1b, 0xcf, 0xad, 0xc6, 0xb2, 0x96,\n                                                    0x1f, 0x58, 0x94, 0x5, 0x73, 0x82, 0x75, 0x69,\n                                                    0x65, 0x1b, 0x73, 0x7b, 0x9a, 0x9d, 0x75, 0x1f,\n                                                    0x9a, 0x78, 0x72, 0x99, 0x61, 0x1b, 0x52, 0x5b,\n                                                    0x52, 0x55, 0x78, 0x1f, 0x41, 0xfb, 0xfe, 0x20,\n                                                    0xa, 0xe, 0x8b, 0xc2, 0xf7, 0x1c, 0xc1, 0xf7,\n                                                    0x9b, 0xc1, 0x1, 0xf7, 0x1e, 0xc2, 0xf7, 0xb7,\n                                                    0xc2, 0x3, 0xc7, 0x16, 0xf7, 0xb2, 0xc2, 0xfb,\n                                                    0x2d, 0xf7, 0x1c, 0xf7, 0x1a, 0x6, 0xf7, 0x5,\n                                                    0xee, 0xca, 0xf7, 0xe, 0xe1, 0x50, 0xef, 0xfb,\n                                                    0x2c, 0x1f, 0xfb, 0xa0, 0x55, 0xd9, 0xfc, 0x59,\n                                                    0x3d, 0x6, 0xf7, 0x19, 0xf7, 0x52, 0x15, 0xf7,\n                                                    0x9b, 0xf7, 0x18, 0x7, 0xdb, 0xda, 0x6a, 0x28,\n                                                    0x27, 0x37, 0x6c, 0x42, 0x1f, 0xe, 0xfb, 0x9,\n                                                    0x76, 0xb6, 0xf7, 0x11, 0x56, 0xc0, 0xf8, 0x86,\n                                                    0xbf, 0x12, 0xb6, 0xc2, 0xf8, 0x26, 0xc4, 0x13,\n                                                    0xdc, 0xf7, 0x16, 0x31, 0x15, 0xa0, 0x5e, 0x5,\n                                                    0xa3, 0xb8, 0xaf, 0x9b, 0xb9, 0x1b, 0xaa, 0xa6,\n                                                    0x7f, 0x80, 0xa4, 0x1f, 0x81, 0xa2, 0xa5, 0x81,\n                                                    0xb0, 0x1b, 0xae, 0xae, 0x98, 0xa1, 0xa5, 0x1f,\n                                                    0x76, 0xb8, 0x5, 0x7d, 0x76, 0x71, 0x81, 0x72,\n                                                    0x1b, 0x72, 0x74, 0x95, 0x95, 0x73, 0x1f, 0x96,\n                                                    0x72, 0x71, 0x95, 0x6e, 0x1b, 0x7c, 0x7c, 0x86,\n                                                    0x89, 0x7c, 0x1f, 0x13, 0xbc, 0x99, 0x92, 0x97,\n                                                    0x92, 0x97, 0x96, 0x8, 0xf7, 0x2a, 0xf7, 0x8,\n                                                    0xf7, 0xc, 0xf7, 0x42, 0xf7, 0x32, 0x3f, 0xf7,\n                                                    0x2b, 0xfb, 0x4a, 0xfb, 0x33, 0x2a, 0xfb, 0x2a,\n                                                    0xfb, 0x33, 0xfb, 0x24, 0xcf, 0xfb, 0x0, 0xf7,\n                                                    0x10, 0x66, 0x1f, 0x70, 0x70, 0x5f, 0x70, 0x69,\n                                                    0x79, 0x8, 0x6b, 0xf7, 0xfd, 0x15, 0xf7, 0x16,\n                                                    0xe0, 0xf7, 0x13, 0xf7, 0x7, 0xf7, 0x13, 0xd6,\n                                                    0xfb, 0xf, 0xfb, 0x1a, 0xfb, 0x4a, 0xfb, 0x1d,\n                                                    0x50, 0x49, 0x48, 0xfb, 0x18, 0xc1, 0xf7, 0x4f,\n                                                    0x1e, 0xe, 0x8b, 0xc2, 0xf7, 0x55, 0xc2, 0xf7,\n                                                    0x60, 0xc2, 0x1, 0xf5, 0xc2, 0xf7, 0xac, 0xc2,\n                                                    0x3, 0xa4, 0x16, 0xf7, 0x6e, 0xc2, 0x39, 0xf7,\n                                                    0x55, 0xf7, 0x8, 0x6, 0xb2, 0x5c, 0xe4, 0xfb,\n                                                    0x19, 0xb2, 0x47, 0x8, 0xf7, 0x17, 0xc2, 0x24,\n                                                    0x6, 0x6a, 0xc1, 0x4f, 0xe8, 0x63, 0xbb, 0x8,\n                                                    0xce, 0x90, 0xe5, 0xab, 0xf7, 0xc, 0x1a, 0xdf,\n                                                    0x5b, 0xd2, 0xfb, 0xe, 0x1e, 0xfb, 0xc1, 0x54,\n                                                    0xdc, 0xfc, 0x58, 0x3a, 0x6, 0xf7, 0x1c, 0xf7,\n                                                    0x8c, 0x15, 0xf7, 0x60, 0xf7, 0x26, 0x7, 0xd2,\n                                                    0xca, 0x74, 0x3c, 0x20, 0x24, 0x90, 0x41, 0x1f,\n                                                    0x69, 0x68, 0x8b, 0x69, 0x1b, 0xe, 0x77, 0xbf,\n                                                    0x76, 0x76, 0xf8, 0xae, 0xbf, 0x7e, 0x77, 0x12,\n                                                    0xd3, 0xc2, 0x6e, 0xc1, 0xf7, 0xc2, 0xc1, 0x67,\n                                                    0xc2, 0x13, 0x6a, 0xd3, 0x81, 0x15, 0xc2, 0xb3,\n                                                    0x6, 0x13, 0xa5, 0x60, 0xc9, 0xd8, 0x84, 0xb9,\n                                                    0x1b, 0xf7, 0x4, 0xf2, 0xc1, 0xf7, 0x9, 0xf7,\n                                                    0xd, 0xfb, 0x2, 0x9a, 0x28, 0x9a, 0x1f, 0x42,\n                                                    0x97, 0x2e, 0xaa, 0xd8, 0x1a, 0xcb, 0xcc, 0xb5,\n                                                    0xe5, 0x1e, 0x13, 0x9a, 0xbf, 0xc6, 0x75, 0x68,\n                                                    0xaf, 0x1f, 0x32, 0xc1, 0xf7, 0x4d, 0x55, 0x6d,\n                                                    0x7, 0x13, 0xa5, 0xa7, 0x64, 0x50, 0x9a, 0x57,\n                                                    0x1b, 0xfb, 0x23, 0x4c, 0x3a, 0x37, 0xfb, 0xe,\n                                                    0xf7, 0x14, 0x67, 0xdf, 0x80, 0x1f, 0xdd, 0x80,\n                                                    0xdb, 0x80, 0x3a, 0x1a, 0x4a, 0x4a, 0x5d, 0x23,\n                                                    0x1e, 0x13, 0x6a, 0x4c, 0x4b, 0x9f, 0xb3, 0x5a,\n                                                    0x1f, 0xd9, 0x54, 0x7, 0xe, 0x77, 0xc3, 0x73,\n                                                    0x76, 0xf8, 0xac, 0xc3, 0x7f, 0x77, 0xab, 0xb7,\n                                                    0xf7, 0x46, 0x77, 0x12, 0xd2, 0xc3, 0x6d, 0xc2,\n                                                    0xf7, 0xc1, 0xc2, 0x62, 0xc8, 0x13, 0x6e, 0x80,\n                                                    0xd2, 0x82, 0x15, 0xc3, 0xbe, 0x6, 0x13, 0xad,\n                                                    0x40, 0x5f, 0xca, 0xd9, 0x79, 0xba, 0x1b, 0xf7,\n                                                    0x5, 0xef, 0xc2, 0xf7, 0xa, 0xf7, 0x9, 0xfb,\n                                                    0xe, 0x9b, 0x2e, 0x95, 0x1f, 0x44, 0x93, 0x31,\n                                                    0x9e, 0xe4, 0x1a, 0xcc, 0xcd, 0xbd, 0xe7, 0x1e,\n                                                    0x13, 0x9e, 0x80, 0xbf, 0xc1, 0x6f, 0x67, 0xb0,\n                                                    0x1f, 0x3b, 0xc2, 0xf7, 0x50, 0x54, 0x62, 0x7,\n                                                    0x13, 0xad, 0x40, 0xa8, 0x63, 0x55, 0xa3, 0x57,\n                                                    0x1b, 0xfb, 0x26, 0x4b, 0x28, 0x36, 0xfb, 0x11,\n                                                    0xf7, 0x1c, 0x73, 0xe2, 0x82, 0x1f, 0xd8, 0x83,\n                                                    0xd1, 0x7e, 0x3f, 0x1a, 0x49, 0x53, 0x61, 0x22,\n                                                    0x1e, 0x13, 0x6e, 0x80, 0x4b, 0x4a, 0xa7, 0xb4,\n                                                    0x59, 0x1f, 0xd0, 0x53, 0x7, 0xf7, 0x5d, 0xf8,\n                                                    0x59, 0x37, 0xa, 0xfb, 0x16, 0x76, 0xf7, 0x47,\n                                                    0xca, 0xf7, 0x48, 0xc9, 0xf7, 0x49, 0xcd, 0x12,\n                                                    0xd2, 0xc6, 0x57, 0xc5, 0xf7, 0x1e, 0xef, 0xd1,\n                                                    0xc6, 0x63, 0xcc, 0x13, 0xfa, 0x80, 0xd2, 0xa7,\n                                                    0x15, 0xc6, 0xcd, 0x6, 0xb6, 0x73, 0xb5, 0x6e,\n                                                    0xc8, 0x81, 0x88, 0x3f, 0x18, 0x8e, 0x92, 0x95,\n                                                    0x8c, 0x94, 0x1b, 0x99, 0x98, 0x7f, 0x7a, 0x77,\n                                                    0x7a, 0x80, 0x78, 0x7e, 0x7d, 0x90, 0x95, 0x81,\n                                                    0x1f, 0x7c, 0x60, 0x5, 0x7c, 0x9c, 0xa2, 0x84,\n                                                    0x9e, 0x1b, 0xb4, 0xaf, 0xb2, 0xbd, 0xb5, 0x72,\n                                                    0xa2, 0x77, 0x8d, 0x1f, 0xa2, 0x7, 0xf7, 0x9,\n                                                    0x8d, 0xdd, 0xce, 0xf2, 0x1a, 0xe5, 0x3f, 0xb1,\n                                                    0x3f, 0x90, 0x1e, 0x13, 0xf7, 0x0, 0x40, 0x92,\n                                                    0xfb, 0x39, 0x7a, 0xf2, 0x1a, 0xd6, 0xec, 0x98,\n                                                    0xba, 0xc7, 0xc5, 0x6b, 0x6a, 0xb9, 0x1e, 0x51,\n                                                    0xc6, 0xf7, 0x51, 0x50, 0x4f, 0x7, 0xac, 0x5a,\n                                                    0x52, 0xa6, 0x4d, 0x1b, 0xfb, 0xb, 0x3c, 0x4d,\n                                                    0x24, 0xfb, 0x22, 0xf7, 0x42, 0x8d, 0xe3, 0x87,\n                                                    0x1f, 0x13, 0xfa, 0x80, 0xbf, 0x89, 0xd2, 0x86,\n                                                    0x43, 0x1a, 0x33, 0xfb, 0x5, 0x7e, 0x63, 0x46,\n                                                    0x50, 0xb1, 0xb7, 0x57, 0x1e, 0xc6, 0x50, 0x7,\n                                                    0xe, 0x8b, 0xc2, 0xf7, 0xd3, 0xf7, 0x50, 0x54,\n                                                    0xc2, 0x12, 0xb0, 0xc3, 0xf7, 0x46, 0xc3, 0xf7,\n                                                    0x47, 0xc3, 0x13, 0xbc, 0xf7, 0x26, 0x16, 0xf7,\n                                                    0xc6, 0xc2, 0xfb, 0x11, 0xf8, 0x58, 0xf7, 0x47,\n                                                    0x6, 0x13, 0xdc, 0xfb, 0x19, 0xc3, 0xf7, 0x50,\n                                                    0xfc, 0xa1, 0xfb, 0x50, 0xc3, 0x7, 0x13, 0xbc,\n                                                    0xf7, 0x19, 0xf7, 0x46, 0xfc, 0x58, 0xfb, 0x11,\n                                                    0x7, 0xe, 0x8b, 0xc1, 0xf5, 0xc1, 0xf7, 0x42,\n                                                    0xc1, 0xf7, 0x12, 0xc1, 0x1, 0xf7, 0x40, 0xbc,\n                                                    0xf7, 0x95, 0xbe, 0x3, 0xf7, 0xf9, 0x16, 0xc1,\n                                                    0xfb, 0x1c, 0xf5, 0xf7, 0x1a, 0x7, 0xf7, 0x15,\n                                                    0xb8, 0xc5, 0xde, 0xe6, 0x5f, 0xbd, 0xfb, 0x18,\n                                                    0x1f, 0xfb, 0x18, 0xf7, 0x12, 0xee, 0xc1, 0xfb,\n                                                    0x8e, 0x55, 0xf1, 0xfc, 0x96, 0x25, 0x55, 0x6,\n                                                    0xf7, 0x2b, 0xf8, 0x18, 0x15, 0xf7, 0x18, 0x6,\n                                                    0xaf, 0xa9, 0x85, 0x80, 0xa2, 0x1f, 0xa3, 0x80,\n                                                    0x97, 0x73, 0x66, 0x1a, 0x68, 0x7f, 0x74, 0x73,\n                                                    0x80, 0x1e, 0x80, 0x74, 0x6e, 0x86, 0x68, 0x1b,\n                                                    0xfb, 0x1a, 0x6, 0xe, 0x79, 0xbe, 0xf8, 0x6e,\n                                                    0xc2, 0x1, 0xec, 0xbf, 0xf7, 0xc5, 0xbf, 0x3,\n                                                    0x9c, 0xf8, 0x8f, 0x15, 0xdb, 0xfb, 0xd1, 0x6,\n                                                    0xfb, 0x17, 0xc1, 0x3e, 0xf7, 0x2c, 0xf7, 0x12,\n                                                    0xd8, 0xd4, 0xf7, 0x1b, 0x1e, 0xf7, 0xd1, 0xd8,\n                                                    0xc2, 0xfb, 0x7c, 0x54, 0xf2, 0xfb, 0xd1, 0x7,\n                                                    0xfb, 0xf, 0x42, 0x69, 0x3c, 0x21, 0x5c, 0xb8,\n                                                    0xf7, 0x4, 0x1e, 0xf7, 0xd1, 0xf5, 0xc2, 0xfb,\n                                                    0x82, 0x7, 0xe, 0x6b, 0xa, 0xf7, 0x7a, 0x77,\n                                                    0x55, 0xa, 0xf7, 0x52, 0xf8, 0xfe, 0x15, 0xf7,\n                                                    0xab, 0xf0, 0x6b, 0xd5, 0xfb, 0x97, 0xfb, 0x25,\n                                                    0x5, 0xfb, 0x35, 0xfb, 0x20, 0x34, 0xa, 0xe,\n                                                    0x6b, 0xa, 0x5b, 0xa, 0xfb, 0x14, 0xd5, 0x2a,\n                                                    0x30, 0xa, 0xf7, 0x21, 0xc9, 0x49, 0xa, 0xe,\n                                                    0x6b, 0xa, 0xf7, 0x10, 0xf7, 0x9, 0x5b, 0xa,\n                                                    0xfb, 0x1b, 0xcf, 0x31, 0xf7, 0x1f, 0x31, 0xa,\n                                                    0xbf, 0xf7, 0xc, 0x4f, 0xa, 0xf7, 0xd0, 0xdc,\n                                                    0x62, 0xa, 0xfb, 0x22, 0xfb, 0x9, 0x62, 0xa,\n                                                    0xe, 0x6b, 0xa, 0xf7, 0x7a, 0x77, 0x1, 0xeb,\n                                                    0xbf, 0xf7, 0xc6, 0xbf, 0x3, 0x9c, 0xf8, 0x90,\n                                                    0x34, 0xa, 0xf7, 0x1e, 0xf7, 0x30, 0x79, 0xa,\n                                                    0xf7, 0x25, 0x5, 0xe, 0x93, 0x76, 0xf8, 0x9c,\n                                                    0xc2, 0x1, 0x87, 0xf7, 0x77, 0xf7, 0x31, 0xf7,\n                                                    0x74, 0x3, 0xf7, 0x9b, 0x7e, 0x15, 0xd4, 0x6,\n                                                    0xf7, 0x5c, 0xf8, 0x9c, 0x5, 0xcf, 0xc2, 0xfb,\n                                                    0x74, 0x54, 0xeb, 0x6, 0xfb, 0x45, 0xfc, 0x61,\n                                                    0xfb, 0x43, 0xf8, 0x61, 0x5, 0xee, 0xc2, 0xfb,\n                                                    0x77, 0x54, 0xcb, 0x6, 0xe, 0x96, 0x76, 0xf8,\n                                                    0x63, 0x77, 0xd5, 0xc2, 0x1, 0x9f, 0xf7, 0x5a,\n                                                    0xf7, 0x37, 0xf7, 0x5b, 0x3, 0xf7, 0x10, 0x81,\n                                                    0x15, 0xca, 0x6, 0xf7, 0x5, 0xf7, 0xfd, 0xf7,\n                                                    0xa, 0xfb, 0xfd, 0x5, 0xc8, 0x6, 0xc4, 0xf8,\n                                                    0x99, 0x5, 0xb7, 0xc2, 0xfb, 0x5b, 0x54, 0xee,\n                                                    0x6, 0x63, 0xfc, 0x36, 0xfb, 0xa, 0xf8, 0x0,\n                                                    0x5, 0x62, 0x6, 0xfb, 0x8, 0xfc, 0x2, 0x5e,\n                                                    0xf8, 0x38, 0x5, 0xed, 0xc2, 0xfb, 0x5a, 0x54,\n                                                    0xb9, 0x6, 0xe, 0x46, 0xa, 0xa2, 0x16, 0xf7,\n                                                    0x7e, 0xc2, 0x22, 0x6, 0xf7, 0x2a, 0xf7, 0x58,\n                                                    0xf7, 0x26, 0xfb, 0x58, 0x5, 0x2d, 0x54, 0xf7,\n                                                    0x73, 0xc2, 0x4a, 0x6, 0xfb, 0x46, 0xf7, 0x84,\n                                                    0xf7, 0x32, 0xf7, 0x68, 0x5, 0xcd, 0xc2, 0xfb,\n                                                    0x53, 0x54, 0xc8, 0x6, 0xfb, 0x13, 0xfb, 0x3f,\n                                                    0xfb, 0x14, 0xf7, 0x3f, 0x5, 0xcf, 0xc2, 0xfb,\n                                                    0x5a, 0x54, 0xce, 0x6, 0xf7, 0x32, 0xfb, 0x68,\n                                                    0xfb, 0x48, 0xfb, 0x84, 0x5, 0x4a, 0x6, 0xe,\n                                                    0x75, 0xa, 0xa3, 0xf7, 0x5f, 0xbb, 0xc3, 0xb9,\n                                                    0xf7, 0x5b, 0x3, 0xf7, 0x27, 0x16, 0xf7, 0xcb,\n                                                    0xc1, 0xfb, 0x13, 0xf7, 0x43, 0x6, 0xf7, 0x46,\n                                                    0xf7, 0xab, 0x5, 0xce, 0xc1, 0xfb, 0x5b, 0x55,\n                                                    0xd2, 0x6, 0xfb, 0x25, 0xfb, 0x76, 0xfb, 0x28,\n                                                    0xf7, 0x76, 0x5, 0xd3, 0xc1, 0xfb, 0x5f, 0x55,\n                                                    0xd0, 0x6, 0xf7, 0x4a, 0xfb, 0xab, 0x5, 0xfb,\n                                                    0x43, 0xfb, 0x14, 0x7, 0xe, 0x8b, 0xc1, 0xf8,\n                                                    0x5d, 0xc1, 0xf7, 0x78, 0x77, 0x81, 0xa, 0xf7,\n                                                    0x27, 0x16, 0x36, 0xa, 0xb0, 0xf8, 0xc9, 0x15,\n                                                    0xf7, 0xba, 0xf0, 0x69, 0xd4, 0xfb, 0xa4, 0xfb,\n                                                    0x24, 0x5, 0xe, 0x8b, 0xc1, 0xf8, 0x5d, 0xc1,\n                                                    0xf7, 0xe, 0xf7, 0x15, 0x81, 0xa, 0xf7, 0xe5,\n                                                    0xf9, 0x43, 0x15, 0xe1, 0xf7, 0x15, 0x35, 0x6,\n                                                    0xfb, 0x2b, 0xfb, 0x15, 0x15, 0xe0, 0xf7, 0x15,\n                                                    0x36, 0x6, 0x64, 0xfd, 0xc4, 0x15, 0x36, 0xa,\n                                                    0xe, 0x75, 0xa, 0xf7, 0xa, 0xbf, 0xf7, 0xb5,\n                                                    0xc2, 0x3, 0xe1, 0x16, 0xf8, 0x40, 0xf7, 0x5f,\n                                                    0x54, 0xfb, 0x29, 0xfb, 0xc1, 0x6, 0xf7, 0xf8,\n                                                    0xf8, 0x5d, 0x5, 0xbe, 0xfc, 0x20, 0xfb, 0x51,\n                                                    0xbf, 0xf7, 0x1b, 0xf7, 0xa3, 0x7, 0xfb, 0xf7,\n                                                    0xfc, 0x5b, 0x5, 0xe, 0x8b, 0xc2, 0xf8, 0x63,\n                                                    0xc2, 0x1, 0xf7, 0xa, 0xbf, 0xf7, 0xb7, 0xc0,\n                                                    0x3, 0xe1, 0x16, 0xf8, 0x40, 0xf7, 0x78, 0x56,\n                                                    0xfb, 0x41, 0xfb, 0xc2, 0x6, 0xf7, 0xf7, 0xf8,\n                                                    0x66, 0x5, 0xbf, 0xfc, 0x20, 0xfb, 0x68, 0xbf,\n                                                    0xf7, 0x31, 0xf7, 0xa4, 0x7, 0xfb, 0xf8, 0xfc,\n                                                    0x64, 0x5, 0xf7, 0x52, 0xf8, 0xd2, 0x15, 0xd9,\n                                                    0x6, 0xf7, 0x21, 0xf7, 0x33, 0x63, 0x9d, 0xfb,\n                                                    0x20, 0xfb, 0xb, 0xfb, 0x23, 0xf7, 0xb, 0x64,\n                                                    0x78, 0x5, 0xe, 0x88, 0xc2, 0xf7, 0x33, 0xc1,\n                                                    0xf7, 0xb, 0xc4, 0x1, 0xba, 0xc4, 0xf7, 0xca,\n                                                    0xc2, 0x3, 0xf1, 0xf7, 0xe1, 0x15, 0xd2, 0xa9,\n                                                    0xcf, 0xa1, 0xbc, 0x8a, 0xdf, 0x8a, 0xbb, 0x6b,\n                                                    0x83, 0x28, 0x8, 0x95, 0x5e, 0x5b, 0x8e, 0x5d,\n                                                    0x1b, 0xfb, 0xd, 0x20, 0x5c, 0x29, 0x4a, 0xc0,\n                                                    0x45, 0xf7, 0x8, 0xea, 0xd7, 0xc2, 0xb4, 0xa7,\n                                                    0x1f, 0x37, 0xf7, 0x1e, 0xc2, 0x37, 0xf7, 0x85,\n                                                    0x7, 0xf4, 0x49, 0xb6, 0xfb, 0x7, 0x40, 0x3b,\n                                                    0x6e, 0x71, 0x5c, 0x1e, 0xf7, 0xdc, 0xfb, 0x83,\n                                                    0x15, 0x4f, 0x58, 0x46, 0x55, 0x39, 0x1b, 0x4c,\n                                                    0x5e, 0xbb, 0xb1, 0xd2, 0xdd, 0xa0, 0xe3, 0xbc,\n                                                    0xc0, 0x88, 0x80, 0xb1, 0x1f, 0xe, 0x3e, 0xa,\n                                                    0xf7, 0x30, 0xf8, 0x83, 0x15, 0xf7, 0xbb, 0xf2,\n                                                    0x69, 0xd5, 0xfb, 0xa5, 0xfb, 0x26, 0x5, 0x5a,\n                                                    0xfb, 0x44, 0x23, 0xa, 0x3e, 0xa, 0xf7, 0x16,\n                                                    0xf8, 0x74, 0x15, 0xf7, 0x2d, 0xf7, 0xa, 0xf7,\n                                                    0x2a, 0xfb, 0xa, 0xb6, 0x9c, 0xfb, 0x2c, 0xf7,\n                                                    0x31, 0x5, 0x38, 0x6, 0xfb, 0x2d, 0xfb, 0x31,\n                                                    0x5, 0x92, 0xfb, 0x27, 0x23, 0xa, 0x6e, 0xa,\n                                                    0xf7, 0x61, 0xf8, 0x85, 0x15, 0xf7, 0x64, 0xf1,\n                                                    0x5e, 0xd4, 0xfb, 0x4a, 0xfb, 0x24, 0x5, 0xe,\n                                                    0x7c, 0xc3, 0x6a, 0xc3, 0xf7, 0x2b, 0xc3, 0xf7,\n                                                    0x7, 0xc3, 0xe3, 0xf7, 0x7, 0x12, 0xba, 0xc5,\n                                                    0xbf, 0xe2, 0xcc, 0xe1, 0x9e, 0xc3, 0x13, 0x7f,\n                                                    0x80, 0xf7, 0xc9, 0xf8, 0xa6, 0x15, 0xe1, 0xf7,\n                                                    0x7, 0x35, 0x6, 0xfb, 0x2c, 0x60, 0xa, 0x4d,\n                                                    0xfb, 0xbb, 0x28, 0xa, 0x1f, 0x13, 0xbf, 0x80,\n                                                    0x3d, 0xa, 0x1e, 0x29, 0xa, 0x2a, 0xa, 0x7c,\n                                                    0xc1, 0xf7, 0x42, 0xc2, 0xf7, 0xa, 0xc2, 0x1,\n                                                    0xa3, 0xc4, 0xf7, 0x4e, 0xc3, 0x3, 0xf7, 0xba,\n                                                    0xd7, 0x15, 0x58, 0x9f, 0xbf, 0x63, 0xda, 0x1b,\n                                                    0xb8, 0xb9, 0x96, 0x96, 0xb2, 0x1f, 0x7f, 0xc1,\n                                                    0x5, 0x82, 0x6b, 0x65, 0x7e, 0x67, 0x1b, 0x2e,\n                                                    0x62, 0xda, 0xde, 0x1f, 0x97, 0xf7, 0x8f, 0x7,\n                                                    0xf4, 0x8c, 0x76, 0xf7, 0xf, 0xfb, 0x13, 0x1b,\n                                                    0x53, 0x6a, 0x71, 0x62, 0x70, 0x1f, 0x99, 0x85,\n                                                    0x7d, 0xc0, 0x2b, 0x1b, 0x54, 0x58, 0x7e, 0x7b,\n                                                    0x5f, 0x1f, 0x96, 0x56, 0x5, 0x98, 0xad, 0xbe,\n                                                    0x99, 0xb4, 0x1b, 0xd2, 0x99, 0x68, 0x53, 0x1f,\n                                                    0x70, 0x7, 0xfb, 0x7, 0x8c, 0xfb, 0x14, 0x75,\n                                                    0xfb, 0x1e, 0x1a, 0x34, 0xcd, 0x66, 0xc9, 0xa5,\n                                                    0xc4, 0x90, 0xe1, 0xc6, 0x1e, 0xaa, 0xf7, 0x54,\n                                                    0x15, 0xcb, 0x8f, 0xb3, 0xc1, 0xc9, 0x1b, 0xd6,\n                                                    0x91, 0x49, 0x57, 0x92, 0x1f, 0xfb, 0x90, 0xfb,\n                                                    0x21, 0x15, 0x75, 0x7f, 0x64, 0x49, 0x4b, 0x1b,\n                                                    0x63, 0x6c, 0xa6, 0xb9, 0xf0, 0xf7, 0x0, 0x8b,\n                                                    0xd9, 0x1f, 0xe, 0x3e, 0xa, 0xf7, 0x1a, 0xf8,\n                                                    0xe8, 0x15, 0xf7, 0xbd, 0x24, 0x96, 0xaa, 0xfb,\n                                                    0xa5, 0xf7, 0x28, 0x5, 0x41, 0xfb, 0xd6, 0x23,\n                                                    0xa, 0x86, 0xc0, 0x64, 0xc2, 0xf7, 0x3e, 0xc1,\n                                                    0xf7, 0x5f, 0xbf, 0x1, 0xc9, 0xc2, 0x91, 0xbf,\n                                                    0x3, 0xf7, 0xf4, 0xbb, 0x15, 0xae, 0x59, 0x5,\n                                                    0xf7, 0x2a, 0xc2, 0xfb, 0x11, 0x6, 0x72, 0xb0,\n                                                    0xa6, 0xb0, 0xa1, 0xc0, 0x91, 0xc2, 0x19, 0xd8,\n                                                    0xc1, 0xfb, 0xd, 0x6, 0x60, 0x7b, 0x43, 0x71,\n                                                    0x63, 0x1e, 0xfb, 0x22, 0xf7, 0x5e, 0x87, 0x8f,\n                                                    0x69, 0xb8, 0x8a, 0xb2, 0x19, 0xc0, 0x89, 0xc2,\n                                                    0x99, 0xb5, 0x1b, 0xb9, 0xa9, 0x74, 0x7a, 0x9a,\n                                                    0x1f, 0xa9, 0xb7, 0x5, 0xa7, 0x6e, 0x5d, 0x9f,\n                                                    0x5e, 0x1b, 0x40, 0x42, 0x68, 0x42, 0x5f, 0xa4,\n                                                    0x5c, 0xa6, 0x64, 0x1f, 0x20, 0x50, 0x85, 0x38,\n                                                    0x6b, 0x1a, 0x50, 0xb0, 0x34, 0xf6, 0xc3, 0xc0,\n                                                    0xa2, 0xb3, 0xb0, 0x1e, 0x6e, 0xb7, 0x15, 0x75,\n                                                    0x73, 0x6e, 0x6b, 0x54, 0x1b, 0x59, 0x5b, 0xa7,\n                                                    0xd8, 0xc3, 0xbb, 0xbd, 0xb0, 0x9b, 0x1f, 0xe,\n                                                    0x41, 0xa, 0xc8, 0xf7, 0x38, 0x12, 0xba, 0xc5,\n                                                    0xe6, 0xf7, 0x46, 0xb3, 0xc3, 0x13, 0xbf, 0xf7,\n                                                    0x58, 0xf8, 0xe4, 0x15, 0x5d, 0xb2, 0x67, 0xbd,\n                                                    0xbd, 0xb2, 0xaf, 0xb9, 0xb9, 0x64, 0xaf, 0x59,\n                                                    0x59, 0x64, 0x67, 0x5d, 0x1e, 0xc1, 0x16, 0x9d,\n                                                    0x9b, 0x99, 0x9e, 0x9e, 0x9b, 0x7d, 0x79, 0x7a,\n                                                    0x7b, 0x7c, 0x78, 0x78, 0x7b, 0x9a, 0x9c, 0x1e,\n                                                    0xfb, 0x2f, 0xfb, 0x86, 0x2c, 0xa, 0xf7, 0xa4,\n                                                    0xbe, 0x1, 0x6f, 0xf9, 0x24, 0x3, 0xf7, 0x5d,\n                                                    0x70, 0xa, 0xf8, 0x55, 0x80, 0xa, 0xa7, 0x5e,\n                                                    0xf7, 0x7a, 0xf7, 0x4b, 0xfb, 0x7a, 0x78, 0xa,\n                                                    0xfc, 0x59, 0x5d, 0xa, 0x7c, 0xf9, 0x3, 0x1,\n                                                    0xf7, 0xa8, 0xbe, 0x3, 0xf7, 0x8, 0xf7, 0x66,\n                                                    0x15, 0xf7, 0x4d, 0xfb, 0x75, 0xf7, 0x4b, 0xf7,\n                                                    0x7b, 0x5e, 0xa7, 0xfb, 0x4, 0xfb, 0x2e, 0x5,\n                                                    0xf8, 0x9a, 0x58, 0xfc, 0x9c, 0x7, 0xfb, 0xf,\n                                                    0xf7, 0x2f, 0x5, 0xe, 0x7d, 0xa, 0xf7, 0x61,\n                                                    0x70, 0xa, 0xf8, 0xb5, 0xbe, 0xfc, 0xb7, 0x5d,\n                                                    0xa, 0x7d, 0xa, 0x73, 0xf7, 0xa4, 0x15, 0xf8,\n                                                    0xb5, 0x80, 0xa, 0xa7, 0x5e, 0xf7, 0x79, 0xf7,\n                                                    0x4b, 0xfb, 0x79, 0x78, 0xa, 0xfc, 0xb7, 0x6,\n                                                    0xe, 0xf8, 0x1c, 0xf7, 0x14, 0x1, 0xf7, 0xa8,\n                                                    0xbe, 0x3, 0xf7, 0xa8, 0x16, 0xbe, 0xf8, 0x9a,\n                                                    0x6, 0xf7, 0x4, 0xfb, 0x2e, 0xb8, 0xa7, 0xfb,\n                                                    0x4b, 0xf7, 0x75, 0xfb, 0x4d, 0xfb, 0x75, 0xb0,\n                                                    0x6f, 0xf7, 0xf, 0xf7, 0x30, 0x5, 0xe, 0xf8,\n                                                    0xb, 0x76, 0xf7, 0xa0, 0x77, 0x1, 0xe9, 0xf8,\n                                                    0x30, 0x3, 0xe9, 0xf7, 0xf6, 0x15, 0xd8, 0xa6,\n                                                    0xd2, 0xc6, 0xc5, 0xc5, 0xc7, 0x4e, 0xd0, 0x53,\n                                                    0xd8, 0x71, 0x8, 0xba, 0x7, 0x2a, 0xd6, 0x5e,\n                                                    0xb9, 0x63, 0xee, 0x8, 0x58, 0x6, 0x68, 0x2d,\n                                                    0x5a, 0x53, 0x2c, 0x44, 0x8, 0xe, 0xf7, 0x5b,\n                                                    0xbe, 0x9e, 0xbe, 0x12, 0xc8, 0xf8, 0x71, 0x17,\n                                                    0xf6, 0xf7, 0x59, 0x15, 0xaa, 0xa1, 0xa6, 0xb4,\n                                                    0xb2, 0x1b, 0xb1, 0xaa, 0x77, 0x78, 0xac, 0x1f,\n                                                    0x7a, 0xa9, 0xaa, 0x7b, 0xb1, 0x1b, 0xcd, 0xb6,\n                                                    0xba, 0xb8, 0xac, 0x1f, 0x5f, 0xaa, 0x5, 0x77,\n                                                    0x7d, 0x5e, 0x57, 0x65, 0x1b, 0x71, 0x73, 0x9b,\n                                                    0x9b, 0x6f, 0x1f, 0x13, 0xe0, 0x9e, 0x6a, 0x64,\n                                                    0xa0, 0x53, 0x1b, 0x4c, 0x6b, 0x5e, 0x62, 0x68,\n                                                    0x1f, 0xe, 0xf7, 0x95, 0xf7, 0xf2, 0x1, 0xf7,\n                                                    0xa0, 0xcb, 0x3, 0xf7, 0x37, 0xf7, 0xc0, 0x15,\n                                                    0xcc, 0x60, 0xd5, 0xf7, 0x16, 0xd5, 0xfb, 0x16,\n                                                    0xc8, 0xb5, 0x2a, 0xf7, 0x9, 0xf7, 0x24, 0xa6,\n                                                    0x79, 0xcf, 0xfb, 0x20, 0x57, 0x98, 0xf7, 0x28,\n                                                    0x5, 0x40, 0x6, 0x94, 0xfb, 0x29, 0xfb, 0x1d,\n                                                    0xc0, 0x77, 0x47, 0xf7, 0x26, 0x6f, 0x5, 0xe,\n                                                    0x7c, 0xb1, 0xde, 0xb1, 0xf7, 0x68, 0xb5, 0xf7,\n                                                    0x1, 0xb2, 0x1, 0xb0, 0xb6, 0xe5, 0xb3, 0xf7,\n                                                    0x24, 0xb7, 0xf7, 0xd, 0xb7, 0x3, 0xf7, 0xf6,\n                                                    0xf7, 0x40, 0x15, 0x6e, 0x93, 0xa0, 0x66, 0xb9,\n                                                    0x1b, 0xdc, 0xc0, 0xe9, 0xf7, 0x0, 0xf7, 0x23,\n                                                    0xfb, 0x1, 0xea, 0xfb, 0x24, 0xfb, 0x47, 0x2d,\n                                                    0xfb, 0x15, 0xfb, 0x31, 0xfb, 0x3a, 0xf7, 0x0,\n                                                    0xfb, 0x1, 0xf7, 0x44, 0xdf, 0xd0, 0xa7, 0xb3,\n                                                    0xcc, 0x1f, 0x77, 0xb3, 0x5, 0x76, 0x6e, 0x2c,\n                                                    0x5a, 0x41, 0x1b, 0xfb, 0x11, 0xfb, 0x8, 0xdd,\n                                                    0xf7, 0x2f, 0xf7, 0xe, 0xd2, 0xf7, 0x11, 0xf7,\n                                                    0x33, 0xf7, 0xb, 0xe5, 0x36, 0xfb, 0x5, 0x3e,\n                                                    0x67, 0x33, 0x58, 0x59, 0x91, 0xd9, 0xb6, 0x95,\n                                                    0x1f, 0xac, 0xf7, 0x1c, 0x5, 0x5f, 0x6, 0x7f,\n                                                    0x5a, 0x5, 0xb6, 0x76, 0x72, 0x8e, 0x6c, 0x1b,\n                                                    0x3d, 0x59, 0x2a, 0x2a, 0x5e, 0x99, 0x56, 0xce,\n                                                    0xb4, 0xb6, 0xac, 0xac, 0x9e, 0x1f, 0xfb, 0x24,\n                                                    0xa9, 0x15, 0xc1, 0xa6, 0xef, 0xc8, 0xbd, 0x91,\n                                                    0x67, 0x79, 0x4a, 0x64, 0x30, 0x51, 0x69, 0x7e,\n                                                    0xad, 0xa1, 0x1e, 0xe, 0x7c, 0xc3, 0x5f, 0xc3,\n                                                    0xf7, 0x34, 0xc3, 0xf7, 0x1c, 0xc3, 0xc7, 0xbd,\n                                                    0x9b, 0xbc, 0x12, 0xba, 0xc5, 0xf7, 0xc9, 0xc3,\n                                                    0x13, 0xbf, 0xf7, 0x15, 0xf8, 0xa1, 0x15, 0x99,\n                                                    0x8f, 0x9f, 0xbb, 0xaf, 0x1b, 0xa7, 0x9d, 0x7d,\n                                                    0x7c, 0x9f, 0x1f, 0x79, 0xa2, 0xa6, 0x78, 0xb9,\n                                                    0x1b, 0xcb, 0xbc, 0xb9, 0xc3, 0x9e, 0x1f, 0x58,\n                                                    0x94, 0x5, 0x72, 0x82, 0x6e, 0x67, 0x66, 0x1b,\n                                                    0x70, 0x78, 0x9b, 0x9d, 0x74, 0x1f, 0x9b, 0x76,\n                                                    0x73, 0x9a, 0x65, 0x1b, 0x57, 0x55, 0x67, 0x4a,\n                                                    0x75, 0x1f, 0x9d, 0xfb, 0x4d, 0x2c, 0xa, 0x7c,\n                                                    0xc2, 0x60, 0xc3, 0xf7, 0xea, 0xc3, 0x12, 0xf5,\n                                                    0xc4, 0xf7, 0xf9, 0xc7, 0x13, 0x78, 0x9e, 0x88,\n                                                    0x15, 0xf7, 0x24, 0xd1, 0x6, 0x13, 0xb8, 0x7b,\n                                                    0x99, 0xb5, 0x49, 0xf7, 0x18, 0x1b, 0xf7, 0x1e,\n                                                    0xe6, 0xf7, 0xa, 0xf7, 0x2, 0xf7, 0x2b, 0x27,\n                                                    0xe2, 0xfb, 0x13, 0xfb, 0x4, 0x4f, 0x4c, 0x72,\n                                                    0x79, 0x1f, 0xf7, 0x9e, 0xfb, 0x24, 0x54, 0xe2,\n                                                    0x7, 0x13, 0x78, 0xfc, 0x9d, 0x34, 0x7, 0xf7,\n                                                    0x25, 0xf7, 0x3d, 0x15, 0xf5, 0xe4, 0xce, 0xe4,\n                                                    0xf7, 0xc, 0xc6, 0x36, 0x2a, 0x8a, 0x1e, 0x13,\n                                                    0xb8, 0x24, 0x8a, 0x34, 0x45, 0x31, 0x1b, 0x38,\n                                                    0x2c, 0xc5, 0xf7, 0x10, 0x1f, 0xe, 0xfb, 0x1d,\n                                                    0xf9, 0xce, 0x1, 0xcf, 0xf8, 0x64, 0x3, 0xf8,\n                                                    0x7b, 0xfb, 0x1d, 0x15, 0xb8, 0xa3, 0xfc, 0x37,\n                                                    0xf9, 0xb6, 0x5e, 0x70, 0x5, 0xe, 0xfb, 0x79,\n                                                    0x76, 0xfa, 0x7c, 0x77, 0x68, 0xa, 0xbe, 0x3,\n                                                    0xf7, 0xa6, 0xfb, 0x8e, 0x15, 0xbe, 0xfa, 0x7c,\n                                                    0x58, 0x6, 0xe, 0xfb, 0x78, 0xbf, 0xf9, 0xf1,\n                                                    0xc4, 0x1, 0xf7, 0x9f, 0xc5, 0x3, 0xf7, 0x40,\n                                                    0xf7, 0x82, 0x15, 0xd9, 0x72, 0x9c, 0x75, 0x2b,\n                                                    0x1a, 0xfb, 0x50, 0x7, 0x49, 0xae, 0x46, 0xf7,\n                                                    0x11, 0x1e, 0xbf, 0x7, 0x4e, 0x8e, 0x62, 0xae,\n                                                    0xbb, 0x1a, 0xf7, 0x4d, 0x7, 0xcc, 0x8a, 0xc7,\n                                                    0x3a, 0xb0, 0x1e, 0xdc, 0xb4, 0x8c, 0xbe, 0xd1,\n                                                    0x1a, 0xf7, 0x5c, 0x7, 0xbb, 0xb4, 0x9a, 0xc8,\n                                                    0x8e, 0x1e, 0xc4, 0x7, 0xfb, 0x17, 0x6e, 0x4e,\n                                                    0x41, 0x1f, 0xfb, 0x50, 0x7, 0x2b, 0x77, 0x75,\n                                                    0x40, 0x72, 0x1e, 0xe, 0xfb, 0x78, 0xbf, 0xf9,\n                                                    0xf5, 0xc0, 0x68, 0xa, 0xc5, 0x3, 0xf7, 0x40,\n                                                    0xfb, 0x44, 0x15, 0x57, 0x7, 0xf7, 0x11, 0xae,\n                                                    0xd0, 0xcd, 0x1f, 0xf7, 0x50, 0x7, 0xeb, 0x9c,\n                                                    0xa1, 0xd9, 0xa4, 0x1e, 0xb1, 0x7, 0x40, 0xa4,\n                                                    0x77, 0xa1, 0xeb, 0x1a, 0xf7, 0x50, 0x7, 0xd5,\n                                                    0x6e, 0xc8, 0xfb, 0x17, 0x1e, 0x56, 0x7, 0xc8,\n                                                    0x88, 0xb4, 0x78, 0x5b, 0x1a, 0xfb, 0x5c, 0x7,\n                                                    0x45, 0x8c, 0x58, 0xdc, 0x62, 0x1e, 0x3a, 0x66,\n                                                    0x8a, 0x4f, 0x4a, 0x1a, 0xfb, 0x4d, 0x7, 0x5b,\n                                                    0x62, 0x68, 0x4e, 0x88, 0x1e, 0xe, 0x3d, 0x77,\n                                                    0x9f, 0xc1, 0xf9, 0x2, 0xc1, 0x1, 0xf7, 0x69,\n                                                    0xc2, 0x3, 0xf7, 0x69, 0x3d, 0x15, 0xf7, 0x41,\n                                                    0xc1, 0xfb, 0xa, 0xf9, 0x2, 0xf7, 0xa, 0xc1,\n                                                    0xfb, 0x41, 0x6, 0xe, 0x3d, 0xc1, 0xf9, 0x2,\n                                                    0xc1, 0x1, 0xf7, 0xdf, 0xc2, 0x3, 0xf7, 0x69,\n                                                    0x73, 0x15, 0x55, 0xf7, 0x41, 0xf9, 0x6e, 0xfb,\n                                                    0x41, 0x55, 0xf7, 0xa, 0xfd, 0x2, 0x7, 0xe,\n                                                    0xf8, 0x89, 0xb2, 0x1, 0xf7, 0x2d, 0xf8, 0xf5,\n                                                    0x15, 0x3b, 0xaf, 0xc3, 0x6f, 0xc4, 0x1b, 0xd5,\n                                                    0xc0, 0xbc, 0xc6, 0x9d, 0x1f, 0x61, 0x6, 0x6d,\n                                                    0x80, 0x64, 0x64, 0x55, 0x1b, 0x60, 0x63, 0xa5,\n                                                    0xb6, 0x78, 0x1f, 0xe, 0xfb, 0x2e, 0x76, 0xf9,\n                                                    0xe6, 0x77, 0x68, 0xa, 0xbe, 0x3, 0xf7, 0xa6,\n                                                    0xf7, 0xaf, 0x15, 0xbe, 0xf8, 0x1c, 0x58, 0x6,\n                                                    0xfd, 0xe6, 0x4, 0xbe, 0xf8, 0x1c, 0x58, 0x6,\n                                                    0xe, 0xf7, 0x16, 0xf7, 0x91, 0x1, 0xf7, 0x40,\n                                                    0xf7, 0x94, 0x3, 0xf7, 0x40, 0xf7, 0x95, 0x15,\n                                                    0x45, 0xc4, 0x52, 0xd2, 0xd3, 0xc3, 0xc4, 0xd1,\n                                                    0xd1, 0x53, 0xc3, 0x43, 0x44, 0x52, 0x53, 0x45,\n                                                    0x1e, 0xe, 0x7c, 0xc0, 0xf7, 0xef, 0xc3, 0x1,\n                                                    0xcf, 0xc1, 0xf7, 0xe4, 0xc1, 0x3, 0xf8, 0x89,\n                                                    0xf7, 0x8, 0x15, 0x76, 0x74, 0x34, 0x52, 0x3b,\n                                                    0x1b, 0xfb, 0x19, 0x53, 0xe7, 0xdf, 0xe4, 0xd4,\n                                                    0xdd, 0xf7, 0x4, 0xc4, 0xbf, 0x73, 0x67, 0xb5,\n                                                    0x1f, 0x46, 0xc1, 0xf7, 0x4d, 0x55, 0x5b, 0x7,\n                                                    0xaa, 0x5e, 0x5c, 0x9c, 0x51, 0x1b, 0xfb, 0x3e,\n                                                    0x45, 0xfb, 0x19, 0x30, 0xfb, 0x28, 0xec, 0x37,\n                                                    0xf7, 0x24, 0xeb, 0xcb, 0xab, 0xbb, 0xc9, 0x1f,\n                                                    0xe, 0xf8, 0x80, 0xc3, 0x1, 0xf7, 0x10, 0xf7,\n                                                    0xf4, 0x3, 0xf7, 0x9c, 0xf8, 0x80, 0x15, 0xd6,\n                                                    0x6, 0xf7, 0x1d, 0xf7, 0x31, 0x64, 0x9f, 0xfb,\n                                                    0x1c, 0xfb, 0xd, 0xfb, 0x1f, 0xf7, 0xc, 0x65,\n                                                    0x77, 0x5, 0xe, 0xfb, 0x21, 0x76, 0xf7, 0x40,\n                                                    0xbd, 0xf7, 0xdc, 0xc0, 0x12, 0xcf, 0xc2, 0xf7,\n                                                    0x2d, 0xe9, 0x5d, 0xb9, 0xea, 0xc2, 0x13, 0xfa,\n                                                    0xf7, 0xab, 0x95, 0x15, 0x86, 0x44, 0x5, 0x9c,\n                                                    0x92, 0xac, 0x8b, 0x71, 0x1a, 0x13, 0x72, 0x6d,\n                                                    0x5d, 0x85, 0x74, 0xa1, 0x1e, 0x7d, 0x65, 0x5,\n                                                    0x13, 0x76, 0x79, 0xa9, 0x9d, 0x8a, 0x93, 0x1b,\n                                                    0xb2, 0xad, 0xad, 0xb7, 0xb0, 0x73, 0x9f, 0x78,\n                                                    0x8d, 0x1f, 0xa3, 0x7, 0xde, 0x8f, 0xcd, 0xa8,\n                                                    0xc2, 0xb4, 0x75, 0xbf, 0x18, 0x76, 0x72, 0x3c,\n                                                    0x54, 0x3a, 0x1b, 0xfb, 0x31, 0x56, 0xf5, 0xc8,\n                                                    0xdf, 0xdd, 0xd8, 0xf7, 0x7, 0xc4, 0xc0, 0x7e,\n                                                    0x69, 0xb7, 0x1f, 0x41, 0xc2, 0xf7, 0x42, 0x54,\n                                                    0x7, 0x13, 0x4, 0x5e, 0x7, 0xa8, 0x5c, 0x5b,\n                                                    0x9b, 0x51, 0x1b, 0xfb, 0x43, 0x46, 0xfb, 0x11,\n                                                    0x35, 0xfb, 0x14, 0xec, 0x3a, 0xf7, 0x6, 0x80,\n                                                    0x1f, 0xe, 0xfb, 0x2b, 0xb3, 0xbb, 0xb3, 0x12,\n                                                    0xf7, 0xa5, 0xbd, 0x87, 0xbd, 0x13, 0xd0, 0xf7,\n                                                    0x7b, 0xfb, 0x1b, 0x15, 0x80, 0x9c, 0x9d, 0x86,\n                                                    0x9e, 0x1b, 0xb6, 0xb4, 0xa7, 0xb8, 0x1f, 0x13,\n                                                    0xe0, 0xae, 0x71, 0x9d, 0x77, 0x8d, 0x1e, 0xac,\n                                                    0x59, 0x7, 0x83, 0x3d, 0x5, 0x8f, 0x98, 0x94,\n                                                    0x8c, 0x93, 0x1b, 0x9e, 0x90, 0x7e, 0x80, 0x7a,\n                                                    0x7c, 0x84, 0x7a, 0x7c, 0x7b, 0x90, 0x93, 0x81,\n                                                    0x1f, 0xe, 0x6f, 0x76, 0xf7, 0x22, 0xc2, 0xf7,\n                                                    0x94, 0xc2, 0x1, 0xed, 0xc1, 0xf7, 0x8, 0xc3,\n                                                    0xf7, 0x1, 0xc1, 0x3, 0xf7, 0xa0, 0x5a, 0x15,\n                                                    0xc3, 0xf7, 0x22, 0x6, 0xd0, 0x8d, 0xd3, 0xa7,\n                                                    0xaf, 0xaa, 0x75, 0xbd, 0x18, 0x6b, 0x57, 0x56,\n                                                    0x73, 0x4b, 0x1b, 0xfb, 0xb, 0x64, 0xd2, 0xbe,\n                                                    0xd3, 0xc3, 0xc9, 0xed, 0xb8, 0xb3, 0x82, 0x71,\n                                                    0xb5, 0x1f, 0x55, 0xc1, 0xf7, 0x3c, 0x55, 0x56,\n                                                    0x7, 0x61, 0xa1, 0x6e, 0x8e, 0x65, 0x8f, 0x8,\n                                                    0xf7, 0x32, 0x53, 0xfb, 0x32, 0x7, 0x42, 0x84,\n                                                    0x2a, 0x52, 0xfb, 0xf, 0x1a, 0xfb, 0x8, 0xe1,\n                                                    0x51, 0xdf, 0x86, 0x1e, 0xe, 0xf8, 0xe9, 0xc4,\n                                                    0x1, 0xf7, 0x10, 0xf7, 0xf4, 0x3, 0xf7, 0x36,\n                                                    0xf8, 0x71, 0x15, 0xf7, 0x1e, 0xf7, 0xc, 0xf7,\n                                                    0x1d, 0xfb, 0xc, 0xb2, 0x9d, 0xfb, 0x1e, 0xf7,\n                                                    0x33, 0x5, 0x40, 0x6, 0xfb, 0x1f, 0xfb, 0x33,\n                                                    0x5, 0xe, 0xf4, 0xf7, 0xe, 0xf7, 0x30, 0xf7,\n                                                    0xe, 0x7a, 0xa, 0xf8, 0x50, 0x15, 0x52, 0xa,\n                                                    0xfb, 0xaa, 0x4, 0x52, 0xa, 0xe, 0xf7, 0x6e,\n                                                    0xf7, 0x37, 0x3, 0xf7, 0x6e, 0xfb, 0x4, 0x15,\n                                                    0xca, 0x6, 0xef, 0xf7, 0x7e, 0x5, 0x2e, 0x6,\n                                                    0xe, 0x79, 0xb9, 0xe2, 0xc0, 0xf7, 0x84, 0xbb,\n                                                    0xdb, 0xb7, 0x1, 0x8b, 0xb9, 0xf2, 0xba, 0xf7,\n                                                    0xfb, 0xb8, 0x3, 0xf7, 0xab, 0x4, 0xfb, 0x38,\n                                                    0xf7, 0x1a, 0xfb, 0x19, 0xf7, 0x3b, 0xf7, 0x35,\n                                                    0xf7, 0x1e, 0xf7, 0xe, 0xf7, 0x43, 0xf7, 0x4b,\n                                                    0xfb, 0x21, 0xf7, 0xa, 0xfb, 0x32, 0xfb, 0x2f,\n                                                    0xfb, 0x26, 0xfb, 0xb, 0xfb, 0x4a, 0x1e, 0xb9,\n                                                    0x16, 0xf7, 0x18, 0xee, 0xf7, 0x11, 0xf7, 0x30,\n                                                    0xf7, 0x21, 0xf7, 0x5, 0xfb, 0xc, 0xfb, 0x1d,\n                                                    0xfb, 0x22, 0xfb, 0x4, 0xfb, 0x1, 0xfb, 0x22,\n                                                    0xfb, 0x1b, 0xfb, 0xc, 0xf7, 0x1, 0xf7, 0x22,\n                                                    0x1e, 0xf8, 0x7, 0x43, 0x15, 0x6f, 0x71, 0x64,\n                                                    0x80, 0x65, 0x1b, 0x4f, 0x51, 0xb6, 0xd2, 0xda,\n                                                    0xc3, 0xba, 0xc9, 0xa6, 0xb2, 0x81, 0x75, 0x9e,\n                                                    0x1f, 0xac, 0xac, 0x5, 0xad, 0x6a, 0x5d, 0x98,\n                                                    0x64, 0x1b, 0x33, 0x3e, 0x3f, 0x29, 0x20, 0xdc,\n                                                    0x4f, 0xdf, 0xbc, 0xbe, 0x9e, 0xb2, 0xae, 0x1f,\n                                                    0xe, 0xd7, 0xba, 0xf7, 0xd2, 0xba, 0x1, 0xe9,\n                                                    0xba, 0xf7, 0xd2, 0xbb, 0x3, 0xd4, 0xe1, 0x15,\n                                                    0xab, 0x6f, 0xcc, 0xca, 0x5, 0x63, 0xc0, 0xb9,\n                                                    0x86, 0xaa, 0x1b, 0xbd, 0xba, 0x9b, 0xa8, 0xb1,\n                                                    0x1f, 0xc9, 0x4c, 0xa9, 0xa8, 0x4b, 0xcb, 0x5,\n                                                    0xa8, 0xb1, 0x9a, 0xba, 0xbb, 0x1a, 0xba, 0x7d,\n                                                    0xba, 0x6d, 0xae, 0x1e, 0xcb, 0xcb, 0x6c, 0xa8,\n                                                    0x4d, 0x4c, 0x5, 0xaa, 0x66, 0x5d, 0x99, 0x5b,\n                                                    0x1b, 0x59, 0x59, 0x7b, 0x6d, 0x67, 0x1f, 0x4c,\n                                                    0xcb, 0x6c, 0x6c, 0xcd, 0x4c, 0x5, 0x68, 0x5f,\n                                                    0x81, 0x5f, 0x63, 0x1a, 0x5b, 0x9a, 0x5b, 0xaa,\n                                                    0x67, 0x1e, 0x8c, 0xf7, 0x16, 0x15, 0xda, 0xc9,\n                                                    0xdb, 0xee, 0xe9, 0xca, 0x3e, 0x39, 0x2a, 0x40,\n                                                    0x4d, 0x38, 0x33, 0x43, 0xd1, 0xe4, 0x1e, 0xe,\n                                                    0x7c, 0xc2, 0x61, 0xc2, 0xf7, 0xe1, 0xc7, 0xf7,\n                                                    0x14, 0xc2, 0x12, 0xa6, 0xc4, 0xf7, 0xf3, 0xc3,\n                                                    0x13, 0x7c, 0xf8, 0x47, 0x89, 0x15, 0xf7, 0x1e,\n                                                    0xc2, 0x39, 0xf8, 0xd4, 0xfb, 0x4d, 0x54, 0xf7,\n                                                    0x15, 0xfb, 0x70, 0x6, 0xd7, 0x5e, 0x40, 0x9b,\n                                                    0x54, 0x1b, 0xfb, 0x1f, 0x2d, 0x27, 0xfb, 0x15,\n                                                    0x1f, 0x13, 0xbc, 0xfb, 0x8, 0xda, 0xfb, 0x8,\n                                                    0xf7, 0x2a, 0xd3, 0xce, 0xa8, 0xc5, 0xb3, 0x1e,\n                                                    0x13, 0x7c, 0xfb, 0xf3, 0xf7, 0x25, 0x15, 0xe7,\n                                                    0xd1, 0xd8, 0xf2, 0xf7, 0xf, 0xbd, 0x2b, 0x46,\n                                                    0x1e, 0x13, 0xbc, 0x21, 0x45, 0x40, 0x24, 0xfb,\n                                                    0x5, 0x4f, 0xe5, 0xe2, 0x1e, 0xe, 0xf7, 0xfc,\n                                                    0xc2, 0xf7, 0x39, 0x77, 0x1, 0xf7, 0xa5, 0xc2,\n                                                    0x3, 0xf7, 0xa5, 0x3c, 0x15, 0xc2, 0xf8, 0x4b,\n                                                    0xf7, 0x17, 0xc2, 0xfb, 0x17, 0xf7, 0x39, 0x54,\n                                                    0xfb, 0x39, 0xfb, 0x18, 0x54, 0xf7, 0x18, 0x6,\n                                                    0xe, 0xd0, 0xf7, 0xc9, 0xfb, 0x8e, 0xf7, 0xca,\n                                                    0x12, 0xf7, 0x21, 0xf7, 0x52, 0x13, 0xa0, 0xf7,\n                                                    0x21, 0xd0, 0x15, 0xf7, 0x15, 0xfb, 0x27, 0xc8,\n                                                    0xf7, 0x27, 0xf7, 0x14, 0x6, 0x13, 0x60, 0xc6,\n                                                    0xfb, 0x14, 0x7, 0x13, 0xa0, 0xf7, 0x8e, 0xf7,\n                                                    0x14, 0x7, 0x13, 0x60, 0xc7, 0xfb, 0x14, 0xf7,\n                                                    0x22, 0x4e, 0xfb, 0x22, 0xfb, 0x15, 0x7, 0x13,\n                                                    0xa0, 0x4f, 0xf7, 0x15, 0x7, 0x13, 0x60, 0xfb,\n                                                    0x8e, 0xfb, 0x15, 0x7, 0xe, 0xf7, 0xa4, 0xc9,\n                                                    0xf7, 0x76, 0xc9, 0x1, 0xf7, 0xf, 0xc9, 0xf7,\n                                                    0x77, 0xcc, 0x3, 0xf7, 0xf, 0xf8, 0x51, 0x15,\n                                                    0x2c, 0xd6, 0x3a, 0xf1, 0xeb, 0xdc, 0xd3, 0xf6,\n                                                    0xd8, 0x58, 0xec, 0xfb, 0x10, 0x25, 0x3e, 0x3b,\n                                                    0x2a, 0x1e, 0xc9, 0x16, 0xbc, 0xb0, 0xcd, 0xdb,\n                                                    0xe0, 0xa4, 0x3d, 0x66, 0x49, 0x59, 0x5b, 0x4d,\n                                                    0x46, 0x5d, 0xc5, 0xc3, 0x1e, 0xe, 0xf8, 0x80,\n                                                    0xf2, 0x1, 0xf7, 0x27, 0xf7, 0x4, 0xdc, 0xf7,\n                                                    0x4, 0x3, 0xf7, 0x27, 0xf8, 0x80, 0x15, 0xf7,\n                                                    0x4, 0xf2, 0xfb, 0x4, 0x6, 0xf7, 0x55, 0x24,\n                                                    0x15, 0xf7, 0x4, 0xf2, 0xfb, 0x4, 0x6, 0xe,\n                                                    0xbb, 0xf3, 0xd5, 0xca, 0xd5, 0xf3, 0x1, 0xf7,\n                                                    0x8a, 0xf3, 0x14, 0xe0, 0xe2, 0xf7, 0x76, 0x15,\n                                                    0xf8, 0x3e, 0xca, 0xfc, 0x3e, 0x6, 0xf7, 0x33,\n                                                    0xf7, 0x12, 0x15, 0x51, 0xa, 0xfb, 0xcf, 0x4,\n                                                    0x51, 0xa, 0xe, 0x22, 0x76, 0xf7, 0x20, 0xbb,\n                                                    0xf8, 0x4b, 0xbf, 0x9a, 0x77, 0xf7, 0x4, 0x77,\n                                                    0x12, 0xf7, 0x0, 0xc0, 0xf7, 0x2, 0xc2, 0xec,\n                                                    0xc1, 0x62, 0xc3, 0x13, 0xee, 0x80, 0xf6, 0x99,\n                                                    0x15, 0xc1, 0xbb, 0x6, 0xab, 0x73, 0xa0, 0x7b,\n                                                    0xc4, 0x83, 0x8, 0xfb, 0x20, 0xc2, 0xf7, 0x20,\n                                                    0x7, 0xf7, 0x4, 0x94, 0xc1, 0xd3, 0xd8, 0x1a,\n                                                    0xf7, 0x0, 0xfb, 0x20, 0xa2, 0x48, 0x9f, 0x1e,\n                                                    0x66, 0x96, 0x34, 0xa9, 0xbf, 0x1a, 0xc7, 0xcb,\n                                                    0xa4, 0xce, 0x1e, 0x13, 0xdf, 0x0, 0xc0, 0xc1,\n                                                    0x7c, 0x70, 0xa3, 0x1f, 0x58, 0xc1, 0xf7, 0x34,\n                                                    0x55, 0x5b, 0x7, 0x13, 0xee, 0x80, 0x74, 0xa0,\n                                                    0x60, 0x94, 0x6b, 0x8e, 0x8, 0xf6, 0x54, 0x20,\n                                                    0x7, 0x4b, 0x29, 0x64, 0x24, 0x1f, 0x8b, 0x7,\n                                                    0x43, 0xcf, 0x62, 0xee, 0x70, 0x1e, 0xd5, 0x76,\n                                                    0xe2, 0x74, 0x50, 0x1a, 0x47, 0x51, 0x65, 0x45,\n                                                    0x4f, 0x53, 0xa5, 0xb0, 0x6c, 0x1e, 0xc3, 0x55,\n                                                    0x7, 0xe, 0xf8, 0x71, 0xf2, 0x1, 0xf7, 0x8c,\n                                                    0xf2, 0x3, 0xf7, 0x8c, 0xf8, 0x71, 0x15, 0xf2,\n                                                    0xf2, 0x24, 0x6, 0xe, 0x74, 0xa, 0xf7, 0xa6,\n                                                    0x73, 0xa, 0xc1, 0xfb, 0x44, 0xf8, 0x8, 0xfb,\n                                                    0x5b, 0x55, 0xf7, 0x24, 0xfb, 0xd2, 0xfb, 0x47,\n                                                    0x6, 0xe, 0x7f, 0xc1, 0xf7, 0x3c, 0xc2, 0xf7,\n                                                    0x12, 0xc3, 0x1, 0xca, 0xc4, 0x3, 0xf7, 0xc,\n                                                    0xf7, 0x66, 0x15, 0xf8, 0x2e, 0x6, 0xf7, 0x12,\n                                                    0x48, 0xf7, 0x3, 0xfb, 0x35, 0xfb, 0x19, 0x21,\n                                                    0x2f, 0xfb, 0x1e, 0xfb, 0xa, 0xd0, 0xfb, 0x3,\n                                                    0xf7, 0x43, 0xdc, 0xdf, 0x99, 0xac, 0xcb, 0x1e,\n                                                    0x7a, 0xc0, 0x5, 0x64, 0x41, 0x39, 0x84, 0x5c,\n                                                    0x1b, 0x5c, 0x5e, 0x91, 0xa3, 0x65, 0x1f, 0x67,\n                                                    0xa2, 0x6d, 0xc1, 0xc0, 0x1a, 0x8d, 0xca, 0x15,\n                                                    0xc6, 0x93, 0xc6, 0xce, 0xf7, 0x5, 0x1b, 0xf7,\n                                                    0x1e, 0xaa, 0x26, 0x72, 0x1f, 0xe, 0x5a, 0xa,\n                                                    0xf7, 0x46, 0xf8, 0x81, 0x15, 0xf7, 0xb9, 0xf2,\n                                                    0x69, 0xd7, 0xfb, 0xa3, 0xfb, 0x28, 0x5, 0x5a,\n                                                    0xfb, 0xd9, 0x22, 0xa, 0x5a, 0xa, 0xf7, 0x2c,\n                                                    0xf8, 0x7d, 0x15, 0xf7, 0x2c, 0xf7, 0xa, 0xf7,\n                                                    0x29, 0xfb, 0xa, 0xb6, 0x9d, 0xfb, 0x2c, 0xf7,\n                                                    0x31, 0x5, 0x3a, 0x6, 0xfb, 0x2d, 0xfb, 0x31,\n                                                    0x5, 0x92, 0xfb, 0xc8, 0x22, 0xa, 0x5e, 0xa,\n                                                    0xdc, 0xf7, 0x7, 0x56, 0xa, 0xf7, 0xde, 0xf8,\n                                                    0xa6, 0x59, 0xa, 0x4d, 0xfc, 0x52, 0x22, 0xa,\n                                                    0x7c, 0x82, 0xa, 0xf7, 0x1f, 0xc3, 0x56, 0xa,\n                                                    0xf7, 0x31, 0xf8, 0xe8, 0x15, 0xf7, 0xb9, 0x24,\n                                                    0x97, 0xaa, 0xfb, 0xa3, 0xf7, 0x28, 0x5, 0x41,\n                                                    0xfc, 0x6d, 0x22, 0xa, 0x7c, 0xbd, 0xf7, 0x8a,\n                                                    0xc2, 0xf7, 0x7e, 0xbf, 0x12, 0xf1, 0xc4, 0x61,\n                                                    0xc5, 0xf7, 0x8c, 0xc6, 0x61, 0xc5, 0x13, 0xf2,\n                                                    0xf7, 0x56, 0xf7, 0xcc, 0x15, 0x75, 0x7e, 0x45,\n                                                    0x5c, 0x2b, 0x1a, 0x30, 0xc7, 0x3b, 0xf7, 0x1c,\n                                                    0xf7, 0x15, 0xd2, 0xd5, 0xee, 0xea, 0x4b, 0xb7,\n                                                    0x67, 0x9a, 0x1e, 0x13, 0xec, 0xaa, 0x96, 0xc0,\n                                                    0xb9, 0xe2, 0x1a, 0xc9, 0x5e, 0xf3, 0xfb, 0x1b,\n                                                    0x22, 0x3b, 0x49, 0x27, 0x4a, 0xb8, 0x50, 0xab,\n                                                    0x77, 0x1e, 0x13, 0xf2, 0x68, 0xfb, 0x2e, 0x15,\n                                                    0xcf, 0xc9, 0xc2, 0xd9, 0xd9, 0xca, 0x54, 0x47,\n                                                    0x47, 0x4c, 0x54, 0x3d, 0x3d, 0x4d, 0xc2, 0xcf,\n                                                    0x1e, 0x13, 0xec, 0x9b, 0xf7, 0xbe, 0x15, 0xcd,\n                                                    0xc3, 0xbb, 0xcf, 0xcf, 0xc3, 0x5b, 0x49, 0x49,\n                                                    0x53, 0x55, 0x47, 0x47, 0x53, 0xc1, 0xcd, 0x1e,\n                                                    0xe, 0x7c, 0xf7, 0x12, 0x1, 0xb0, 0xf7, 0x11,\n                                                    0xd4, 0xf7, 0x14, 0xd4, 0xf7, 0x13, 0x3, 0xf8,\n                                                    0x48, 0xba, 0x15, 0x6c, 0xa4, 0x6c, 0xb3, 0xa9,\n                                                    0xab, 0xa5, 0xae, 0xac, 0x72, 0xab, 0x65, 0x67,\n                                                    0x6f, 0x6e, 0x68, 0x1e, 0xfb, 0x5d, 0x16, 0x6c,\n                                                    0xa4, 0x6c, 0xb4, 0xaa, 0xaa, 0xa5, 0xae, 0xac,\n                                                    0x73, 0xab, 0x65, 0x65, 0x6f, 0x6e, 0x68, 0x1e,\n                                                    0xfb, 0x5a, 0x16, 0x6c, 0xa3, 0x6c, 0xb3, 0xaa,\n                                                    0xa9, 0xa5, 0xae, 0xac, 0x73, 0xab, 0x65, 0x67,\n                                                    0x70, 0x6e, 0x68, 0x1e, 0xe, 0xf7, 0x7b, 0xc1,\n                                                    0x1, 0x8b, 0xf8, 0xec, 0x3, 0xf7, 0x7b, 0x4,\n                                                    0xf8, 0xec, 0xc1, 0xfc, 0xec, 0x6, 0xe, 0xf7,\n                                                    0x7b, 0xc1, 0x1, 0xd6, 0xf8, 0x56, 0x3, 0xd6,\n                                                    0xf7, 0x7b, 0x15, 0xf8, 0x56, 0xc1, 0xfc, 0x56,\n                                                    0x6, 0xe, 0xf7, 0x1e, 0xc7, 0xf7, 0x8, 0xc8,\n                                                    0x1, 0xe5, 0xf8, 0x37, 0x3, 0xe5, 0xf7, 0xcf,\n                                                    0x15, 0xf8, 0x37, 0xc8, 0xfc, 0x37, 0x6, 0xfb,\n                                                    0x82, 0x4, 0xf8, 0x37, 0xc7, 0xfc, 0x37, 0x6,\n                                                    0xe, 0x7c, 0xbf, 0xf7, 0xe3, 0xbf, 0x1, 0xc9,\n                                                    0xc0, 0xf8, 0x0, 0xc6, 0x3, 0xf7, 0x6f, 0xf8,\n                                                    0x59, 0x15, 0xf4, 0xd1, 0xd5, 0x5c, 0xb1, 0x3a,\n                                                    0x91, 0x7e, 0x19, 0xa9, 0x67, 0x4f, 0x97, 0x58,\n                                                    0x1b, 0xfb, 0x36, 0x44, 0xfb, 0xd, 0x28, 0xfb,\n                                                    0x1b, 0xf1, 0x37, 0xf7, 0x1a, 0xf7, 0x3a, 0xd3,\n                                                    0xf7, 0x7, 0xf7, 0xd, 0x8d, 0x1f, 0x8e, 0x7,\n                                                    0xe5, 0x65, 0xf7, 0x2c, 0xfb, 0x11, 0xe6, 0x1e,\n                                                    0xe1, 0xc5, 0x71, 0xb9, 0xfb, 0x2, 0x42, 0x66,\n                                                    0x9e, 0x53, 0x96, 0x61, 0x91, 0x19, 0x79, 0x5c,\n                                                    0xaa, 0x88, 0xb3, 0x82, 0xa9, 0x7e, 0x19, 0x3b,\n                                                    0x51, 0x5, 0x3d, 0xfb, 0xb6, 0x15, 0xea, 0xcc,\n                                                    0xd4, 0xf7, 0x2, 0xf7, 0x2c, 0xb0, 0x22, 0x4d,\n                                                    0x26, 0x3f, 0x48, 0x23, 0xfb, 0x2, 0x41, 0xd6,\n                                                    0xe7, 0x1e, 0xe, 0x7c, 0xf7, 0x14, 0xf8, 0x64,\n                                                    0x77, 0x12, 0xf7, 0x80, 0xf7, 0x14, 0x2c, 0xcd,\n                                                    0x13, 0xd0, 0xf7, 0xaa, 0xf7, 0x49, 0x15, 0xbb,\n                                                    0x6, 0x9d, 0xf8, 0x18, 0x5, 0x37, 0x6, 0x13,\n                                                    0xe0, 0x73, 0xfc, 0x9d, 0x15, 0x6c, 0xa4, 0x6b,\n                                                    0xb2, 0x1e, 0xb3, 0xa3, 0xaa, 0xac, 0xab, 0x6d,\n                                                    0xab, 0x6b, 0x1f, 0x13, 0x60, 0x60, 0x74, 0x69,\n                                                    0x6c, 0x1f, 0xe, 0xfb, 0x1c, 0x76, 0xf8, 0x67,\n                                                    0xf7, 0xc, 0x1, 0xf7, 0xa2, 0xc8, 0x3, 0xf7,\n                                                    0x80, 0xf8, 0x5, 0x15, 0x6b, 0xa7, 0x70, 0xaf,\n                                                    0xb5, 0xa1, 0xa9, 0xa9, 0xa9, 0x71, 0xa9, 0x64,\n                                                    0x63, 0x74, 0x6f, 0x6a, 0x1e, 0xa4, 0xfc, 0xa2,\n                                                    0x15, 0xd9, 0x6, 0x7b, 0xf8, 0x21, 0x5, 0x5f,\n                                                    0x6, 0xe, 0x8b, 0xc2, 0xf7, 0xd8, 0xc2, 0xf7,\n                                                    0x1f, 0xc2, 0x1, 0xf7, 0x58, 0xc3, 0x3, 0xe6,\n                                                    0x16, 0xf8, 0xd, 0xc2, 0xfb, 0x6c, 0xf7, 0xd8,\n                                                    0xf7, 0x62, 0xc2, 0xfb, 0x62, 0x6, 0x8c, 0xf7,\n                                                    0x11, 0x8a, 0x98, 0xf7, 0x7, 0x8c, 0x8, 0xb1,\n                                                    0xc9, 0x81, 0x85, 0xaf, 0x1f, 0x90, 0xc3, 0x5,\n                                                    0x90, 0x6a, 0x45, 0x95, 0x63, 0x1b, 0xfb, 0x20,\n                                                    0x8c, 0x6f, 0x6a, 0x8a, 0xfb, 0x36, 0x8, 0x22,\n                                                    0x54, 0xf4, 0xfb, 0xd8, 0x22, 0x6, 0xe, 0x8b,\n                                                    0xc0, 0xf7, 0xd5, 0xc0, 0xde, 0xf7, 0xd, 0x1,\n                                                    0xf7, 0x1, 0xc2, 0xf7, 0xa3, 0xc2, 0x3, 0xf8,\n                                                    0x37, 0xf8, 0x92, 0x15, 0xd2, 0xf7, 0xb, 0x44,\n                                                    0x6, 0x33, 0xfd, 0x9, 0x15, 0xf7, 0x9e, 0xc0,\n                                                    0x20, 0xf8, 0xa, 0xfb, 0x1c, 0x56, 0xdc, 0xfb,\n                                                    0xd5, 0x23, 0x6, 0xfb, 0xdc, 0x56, 0x48, 0xa,\n                                                    0x4a, 0xa, 0x7c, 0xc3, 0xf7, 0xa5, 0xc9, 0xf7,\n                                                    0x40, 0xc6, 0x1, 0xf7, 0x14, 0xc9, 0xf7, 0x8d,\n                                                    0xc9, 0x3, 0xec, 0xa7, 0x15, 0x6c, 0xd2, 0xc5,\n                                                    0x7f, 0xc2, 0x1b, 0xf7, 0x1c, 0xe0, 0xdc, 0xf7,\n                                                    0x9, 0x8a, 0x1f, 0xf7, 0xc, 0x8a, 0x38, 0xd4,\n                                                    0xfb, 0x5, 0x1b, 0x63, 0x6b, 0x80, 0x76, 0x61,\n                                                    0x1f, 0xf7, 0x60, 0xf7, 0xa8, 0xc6, 0xfb, 0xe6,\n                                                    0xfb, 0xd5, 0x7, 0xb5, 0x73, 0x5, 0xaf, 0xb6,\n                                                    0xbb, 0x9b, 0xb6, 0x1b, 0xd6, 0xc7, 0x5b, 0x35,\n                                                    0x2b, 0x42, 0x61, 0x36, 0x8a, 0x1f, 0x55, 0x8a,\n                                                    0x51, 0x9a, 0x58, 0xaa, 0x8, 0xe, 0x8b, 0xc2,\n                                                    0xf7, 0xd3, 0xc0, 0xf7, 0x26, 0xc3, 0x8d, 0x77,\n                                                    0x12, 0xf7, 0x1, 0xc2, 0xf7, 0xa5, 0xc1, 0x13,\n                                                    0xec, 0xf7, 0xdf, 0x16, 0xf7, 0x9e, 0xc2, 0x21,\n                                                    0xf8, 0xd2, 0xfb, 0x25, 0x53, 0xe6, 0xfc, 0x9a,\n                                                    0x21, 0x6, 0xfb, 0xdc, 0x54, 0x48, 0xa, 0x13,\n                                                    0xdc, 0x4a, 0xa, 0xfb, 0x23, 0xc6, 0xf8, 0x4b,\n                                                    0xc4, 0xf7, 0x2d, 0xc4, 0x1, 0xab, 0xf8, 0xab,\n                                                    0x3, 0xbf, 0x37, 0x15, 0x77, 0x50, 0x5, 0xd0,\n                                                    0x6, 0xf7, 0x2c, 0x9c, 0xc7, 0xf7, 0x2, 0x9f,\n                                                    0x1f, 0xc6, 0xf7, 0xdc, 0x5, 0xf6, 0x6, 0x92,\n                                                    0xc4, 0x5, 0x23, 0x6, 0xf7, 0x7, 0xa2, 0x84,\n                                                    0xb1, 0xf7, 0x5, 0x1b, 0x9d, 0xa8, 0x88, 0x8a,\n                                                    0x9d, 0x1f, 0x99, 0xc5, 0x4f, 0x8e, 0x5, 0x54,\n                                                    0x52, 0x86, 0x64, 0x66, 0x1f, 0x62, 0x61, 0x88,\n                                                    0x4b, 0x80, 0x4f, 0x8, 0xfb, 0x0, 0x6, 0x85,\n                                                    0x52, 0x5, 0xf3, 0x6, 0x51, 0xfb, 0xd5, 0x77,\n                                                    0xfb, 0x6, 0x59, 0x78, 0xfb, 0x5, 0x9a, 0x19,\n                                                    0xe, 0x95, 0xc3, 0xf7, 0x16, 0xc7, 0xf8, 0x2,\n                                                    0x77, 0x1, 0xf7, 0xfe, 0xc9, 0x3, 0xe4, 0xf7,\n                                                    0x4f, 0x15, 0xf7, 0xa5, 0xfb, 0x17, 0xfb, 0x2,\n                                                    0x53, 0xf7, 0x97, 0xc3, 0x34, 0xf7, 0x17, 0xe2,\n                                                    0xc7, 0x34, 0xf8, 0xb, 0x34, 0x6, 0xfb, 0x8c,\n                                                    0xfc, 0x11, 0x5, 0xcc, 0x91, 0x15, 0xf7, 0x64,\n                                                    0xf7, 0xd1, 0x5, 0xfb, 0xd1, 0x7, 0xe, 0x52,\n                                                    0xf9, 0x66, 0x1, 0xe6, 0xf8, 0x35, 0x3, 0xe6,\n                                                    0x66, 0x15, 0xb3, 0x77, 0xf8, 0xd, 0xf9, 0x50,\n                                                    0x64, 0xa1, 0x5, 0xe, 0xfb, 0x31, 0xbe, 0xf7,\n                                                    0x37, 0xbf, 0xf7, 0xac, 0xbf, 0x7f, 0x77, 0x12,\n                                                    0xb2, 0xc0, 0xf7, 0xf5, 0xc0, 0x13, 0xdc, 0xde,\n                                                    0x3c, 0x15, 0x80, 0x59, 0x50, 0xa, 0x41, 0x7,\n                                                    0x13, 0xec, 0xbc, 0x70, 0x43, 0xb0, 0x44, 0xa,\n                                                    0x70, 0x31, 0x48, 0x2c, 0x9b, 0x96, 0x57, 0x1e,\n                                                    0x94, 0xf7, 0xda, 0x15, 0xe0, 0xde, 0xc4, 0xe9,\n                                                    0xf7, 0x8, 0xc4, 0x69, 0xa, 0xe, 0xfb, 0x31,\n                                                    0xbe, 0x8b, 0xf7, 0x37, 0x8b, 0xbf, 0xf7, 0xac,\n                                                    0xbf, 0x7f, 0x77, 0xab, 0xbd, 0x12, 0xb2, 0xc0,\n                                                    0xf7, 0xf5, 0xc0, 0x13, 0xef, 0xde, 0x43, 0x15,\n                                                    0x80, 0x52, 0x50, 0xa, 0x55, 0x7, 0x13, 0xf7,\n                                                    0xae, 0x6a, 0x49, 0xaa, 0x44, 0xa, 0x6f, 0x31,\n                                                    0x8c, 0x1e, 0x48, 0x8c, 0x2c, 0x9f, 0x57, 0x96,\n                                                    0x8, 0x94, 0xf7, 0xd5, 0x15, 0xe0, 0xde, 0xc4,\n                                                    0xe9, 0xf7, 0x1e, 0xae, 0x69, 0xa, 0xf7, 0x43,\n                                                    0xf7, 0x88, 0x37, 0xa, 0x7c, 0xc0, 0x63, 0xc3,\n                                                    0xf7, 0xdf, 0xc2, 0xf7, 0x1a, 0xc2, 0x12, 0xf7,\n                                                    0x3, 0xc2, 0xd9, 0xc4, 0xf7, 0x17, 0xc2, 0xa7,\n                                                    0xc2, 0x13, 0x7f, 0xa9, 0x89, 0x15, 0xf7, 0x1c,\n                                                    0xf8, 0x77, 0x6, 0xde, 0xa1, 0x95, 0xf2, 0xd8,\n                                                    0xcb, 0x88, 0x56, 0x59, 0x5e, 0x88, 0x55, 0x72,\n                                                    0x1e, 0x5e, 0x77, 0x5f, 0x72, 0x58, 0x1a, 0x4d,\n                                                    0xc1, 0x6f, 0xbb, 0x78, 0x1e, 0xf7, 0x17, 0x59,\n                                                    0xb1, 0x80, 0x5d, 0x1a, 0x13, 0xbf, 0x4f, 0x4f,\n                                                    0x70, 0x48, 0x88, 0x1e, 0x45, 0x88, 0x41, 0xa7,\n                                                    0x74, 0xa4, 0x75, 0x54, 0x18, 0x6d, 0xb2, 0xd2,\n                                                    0x79, 0xd0, 0x1b, 0xec, 0xea, 0xb8, 0xf4, 0xd7,\n                                                    0x38, 0xaa, 0x40, 0xa4, 0x1f, 0x4f, 0x9f, 0x58,\n                                                    0x9a, 0xb4, 0x1a, 0xb3, 0xbb, 0x97, 0xbd, 0x9f,\n                                                    0x1e, 0xc4, 0xa2, 0xaa, 0x9a, 0xce, 0x1a, 0xdf,\n                                                    0x35, 0xa4, 0x2b, 0xfb, 0x3a, 0x6f, 0x6b, 0xfb,\n                                                    0x31, 0x1e, 0x3a, 0x54, 0xdc, 0x6, 0x13, 0x7f,\n                                                    0xfb, 0xdf, 0x3a, 0x7, 0xe, 0x6e, 0xa, 0xf8,\n                                                    0x20, 0xf8, 0x85, 0x15, 0x9c, 0xa8, 0xfb, 0x49,\n                                                    0xf7, 0x26, 0x5d, 0x46, 0x5, 0xe, 0xb5, 0xd0,\n                                                    0xf7, 0xbf, 0xc9, 0x1, 0xf8, 0x44, 0xce, 0x3,\n                                                    0xf8, 0x87, 0xf7, 0xbd, 0x15, 0xfc, 0x22, 0xf7,\n                                                    0x43, 0x5, 0x4d, 0x7, 0xf7, 0xdf, 0xfb, 0x2b,\n                                                    0xfb, 0xdf, 0xfb, 0x28, 0x5, 0x46, 0x7, 0xf8,\n                                                    0x22, 0xf7, 0x46, 0x5, 0xe, 0x7b, 0xa, 0xf7,\n                                                    0x95, 0xf7, 0x96, 0x15, 0xf7, 0x7e, 0xfb, 0x50,\n                                                    0x9c, 0xba, 0xfb, 0x3d, 0xf7, 0x21, 0xf7, 0x3d,\n                                                    0xf7, 0x21, 0x78, 0xba, 0x5, 0xfc, 0x21, 0xfb,\n                                                    0x50, 0x15, 0xf7, 0x79, 0xfb, 0x50, 0xa0, 0xba,\n                                                    0xfb, 0x40, 0xf7, 0x21, 0xf7, 0x3d, 0xf7, 0x1f,\n                                                    0x75, 0xbc, 0x5, 0xe, 0x7b, 0xa, 0xf7, 0x2,\n                                                    0xd1, 0x15, 0xf7, 0x7d, 0xf7, 0x50, 0xfb, 0x7d,\n                                                    0xf7, 0x50, 0x79, 0x5c, 0xf7, 0x3d, 0xfb, 0x21,\n                                                    0xfb, 0x3d, 0xfb, 0x21, 0x5, 0xf7, 0x51, 0x5c,\n                                                    0x15, 0xf7, 0x77, 0xf7, 0x50, 0xfb, 0x73, 0xf7,\n                                                    0x50, 0x73, 0x5a, 0xf7, 0x3d, 0xfb, 0x1f, 0xfb,\n                                                    0x40, 0xfb, 0x21, 0x5, 0xe, 0xd1, 0xf8, 0xc,\n                                                    0x1, 0xf7, 0x2b, 0xf7, 0xbd, 0x3, 0xf7, 0x2b,\n                                                    0xf7, 0x96, 0x15, 0xf7, 0xa3, 0xfb, 0x50, 0xa5,\n                                                    0xb3, 0xfb, 0x66, 0xf7, 0x28, 0xf7, 0x66, 0xf7,\n                                                    0x27, 0x71, 0xb4, 0x5, 0xe, 0xd1, 0xf8, 0xc,\n                                                    0x1, 0xf7, 0x2f, 0xf7, 0xba, 0x3, 0xf7, 0x46,\n                                                    0xd1, 0x15, 0xf7, 0xa3, 0xf7, 0x50, 0xfb, 0xa3,\n                                                    0xf7, 0x50, 0x70, 0x62, 0xf7, 0x67, 0xfb, 0x27,\n                                                    0xfb, 0x63, 0xfb, 0x28, 0x5, 0xe, 0x8b, 0xc2,\n                                                    0xf7, 0xf0, 0xc2, 0xf7, 0x8, 0xc2, 0x1, 0xf5,\n                                                    0xc3, 0xf7, 0xab, 0xc3, 0x3, 0x9e, 0x16, 0xf7,\n                                                    0x83, 0xc2, 0x2b, 0xf7, 0x99, 0x6, 0xb6, 0xbb,\n                                                    0xcb, 0xb7, 0xce, 0x1b, 0xe0, 0x9a, 0x59, 0x54,\n                                                    0x1f, 0xfb, 0x87, 0x36, 0x54, 0xf7, 0x76, 0xc2,\n                                                    0x36, 0xf7, 0x9d, 0x7, 0xca, 0x6e, 0xd6, 0xfb,\n                                                    0x13, 0x4a, 0x4e, 0x66, 0x5e, 0x56, 0x1e, 0xf7,\n                                                    0x91, 0xfb, 0x24, 0x54, 0xe3, 0xfc, 0x9b, 0x34,\n                                                    0x7, 0xe, 0xf8, 0x85, 0xf7, 0x43, 0x1, 0xf7,\n                                                    0x17, 0xf7, 0xe6, 0x3, 0xf7, 0x17, 0xf8, 0x9d,\n                                                    0x71, 0xa, 0x7d, 0xfb, 0x2b, 0x71, 0xa, 0xe,\n                                                    0xf7, 0x7b, 0xc1, 0x1, 0xf2, 0xf8, 0x1e, 0x3,\n                                                    0xf2, 0xf7, 0x7b, 0x15, 0xf8, 0x1e, 0xc1, 0xfc,\n                                                    0x1e, 0x6, 0xe, 0x8b, 0xc2, 0xf7, 0xd9, 0xc2,\n                                                    0xed, 0xf7, 0x10, 0x81, 0xa, 0xf7, 0x95, 0x7e,\n                                                    0xa, 0xfb, 0x36, 0xfd, 0x25, 0x15, 0xf8, 0x2e,\n                                                    0xc2, 0xfb, 0x43, 0xf8, 0x10, 0xfb, 0x5d, 0x54,\n                                                    0xf7, 0x24, 0xfb, 0xd9, 0xfb, 0x46, 0x6, 0xe,\n                                                    0x6f, 0xa, 0xf7, 0x31, 0xf8, 0x82, 0x15, 0xf7,\n                                                    0xb7, 0xf1, 0x69, 0xd7, 0xfb, 0xa1, 0xfb, 0x27,\n                                                    0x5, 0x59, 0xfc, 0xa1, 0x15, 0x35, 0xa, 0xe,\n                                                    0x8b, 0xc2, 0xf7, 0xdd, 0x82, 0xa, 0x68, 0xa,\n                                                    0xc3, 0x3, 0xe9, 0xf8, 0x86, 0x15, 0xb4, 0x79,\n                                                    0xf7, 0x29, 0xf7, 0xa, 0xf7, 0x27, 0xfb, 0xa,\n                                                    0xb6, 0x9d, 0xfb, 0x29, 0xf7, 0x30, 0x5, 0x3a,\n                                                    0x6, 0xfb, 0x29, 0xfd, 0x22, 0x15, 0x35, 0xa,\n                                                    0xe, 0x8b, 0xc2, 0xf7, 0xdb, 0xc2, 0xe8, 0xf7,\n                                                    0x7, 0x12, 0xf7, 0x3a, 0xe2, 0xa0, 0xc3, 0x7e,\n                                                    0xe0, 0x13, 0xf8, 0xea, 0x16, 0x35, 0xa, 0x13,\n                                                    0xf4, 0xf7, 0x72, 0xf8, 0x6f, 0x59, 0xa, 0xe,\n                                                    0x6f, 0xa, 0xf7, 0x1c, 0xf8, 0xe8, 0x15, 0xf7,\n                                                    0xb9, 0x25, 0x96, 0xaa, 0xfb, 0xa2, 0xf7, 0x27,\n                                                    0x5, 0x40, 0xfd, 0x34, 0x15, 0x35, 0xa, 0xe,\n                                                    0xfb, 0x31, 0xc1, 0xf8, 0x76, 0xc5, 0xee, 0xf7,\n                                                    0x10, 0x1, 0xf7, 0x18, 0xc4, 0xf7, 0xa9, 0xc7,\n                                                    0x3, 0xf7, 0x8, 0x7e, 0xa, 0x60, 0xfd, 0x8c,\n                                                    0x15, 0x55, 0xf7, 0x3f, 0xc1, 0x54, 0xf8, 0xae,\n                                                    0x25, 0x54, 0xb8, 0xfc, 0x77, 0x7, 0xf7, 0xbc,\n                                                    0xf9, 0x17, 0x15, 0xd5, 0xf7, 0x9, 0x41, 0x6,\n                                                    0xfb, 0x2, 0xfd, 0x7a, 0x15, 0x7c, 0x55, 0x5,\n                                                    0x85, 0x91, 0xb6, 0x7f, 0xbf, 0x1b, 0xef, 0xa1,\n                                                    0xbd, 0xf7, 0xc, 0x1f, 0xf8, 0x3c, 0xfb, 0x32,\n                                                    0x51, 0xed, 0xfb, 0xf4, 0x7, 0x32, 0x88, 0x62,\n                                                    0x50, 0x56, 0x89, 0x93, 0x95, 0x6c, 0x1e, 0xe,\n                                                    0xfb, 0x31, 0xc1, 0xf8, 0x7b, 0xc0, 0xf2, 0xf7,\n                                                    0x9, 0x1, 0xf8, 0x28, 0xc7, 0x3, 0xf8, 0x2,\n                                                    0xf8, 0xb0, 0x15, 0xd5, 0xf7, 0x9, 0x41, 0x6,\n                                                    0xfb, 0x70, 0xfd, 0x7a, 0x15, 0x81, 0x53, 0x5,\n                                                    0x82, 0xb5, 0xbf, 0x84, 0xbf, 0x1b, 0xef, 0xdd,\n                                                    0xbd, 0xf7, 0xc, 0x1f, 0xf8, 0x3c, 0xfb, 0xd2,\n                                                    0x56, 0xf7, 0x96, 0xfb, 0xf9, 0x7, 0x32, 0x53,\n                                                    0x62, 0x49, 0x56, 0x5b, 0x96, 0x92, 0x68, 0x1e,\n                                                    0xe, 0x8b, 0xc2, 0xf7, 0xda, 0xc2, 0xf7, 0x1e,\n                                                    0xc2, 0x1, 0xf7, 0xa, 0xc3, 0x3, 0xaa, 0x16,\n                                                    0xf7, 0x23, 0xf7, 0x5a, 0x6, 0xc5, 0xb5, 0xb4,\n                                                    0x6a, 0xe0, 0x32, 0xbd, 0x4c, 0x19, 0x52, 0x54,\n                                                    0xf7, 0x6d, 0xc2, 0x2c, 0x6, 0x4d, 0xda, 0x4b,\n                                                    0xd3, 0x3f, 0xc9, 0xf7, 0x33, 0xf7, 0x5, 0x18,\n                                                    0xee, 0xc2, 0xfb, 0x72, 0x54, 0xba, 0x6, 0xfb,\n                                                    0x48, 0xfb, 0x14, 0x5, 0xf8, 0xc, 0xfb, 0x23,\n                                                    0x54, 0xe2, 0xfc, 0x9b, 0x34, 0x7, 0xe, 0x8b,\n                                                    0xc2, 0xf8, 0x9b, 0xc2, 0x68, 0xa, 0x73, 0xa,\n                                                    0xc2, 0xfb, 0x44, 0xf8, 0xd2, 0xfb, 0x6b, 0x54,\n                                                    0xf7, 0x34, 0xfc, 0x9b, 0xfb, 0x47, 0x6, 0xe,\n                                                    0xb5, 0xc9, 0xf7, 0xbf, 0xd0, 0x1, 0xf0, 0xce,\n                                                    0x3, 0xf0, 0xf7, 0x6d, 0x15, 0xf8, 0x22, 0xfb,\n                                                    0x43, 0x5, 0xc9, 0x7, 0xfb, 0xdf, 0xf7, 0x2b,\n                                                    0xf7, 0xdf, 0xf7, 0x28, 0x5, 0xd0, 0x7, 0xfc,\n                                                    0x22, 0xfb, 0x46, 0x5, 0xe, 0x76, 0xbe, 0xf7,\n                                                    0x37, 0xc3, 0xd7, 0xc5, 0xf7, 0x3e, 0xc5, 0x1,\n                                                    0xf7, 0x39, 0xc2, 0x3, 0xd6, 0xaa, 0x15, 0xa5,\n                                                    0x57, 0xa8, 0x94, 0xd8, 0xac, 0xb0, 0x8a, 0x19,\n                                                    0xaf, 0x8a, 0x90, 0x8c, 0xad, 0x7a, 0x8, 0x81,\n                                                    0x9f, 0x9f, 0x7d, 0xbc, 0x1b, 0xb6, 0xb6, 0x9d,\n                                                    0xa7, 0xaa, 0x1f, 0x76, 0xb8, 0x5, 0x7f, 0x7a,\n                                                    0x61, 0x6f, 0x68, 0x1b, 0x69, 0x81, 0x93, 0x9f,\n                                                    0x6c, 0x1f, 0x99, 0x75, 0x73, 0x90, 0x7c, 0x1b,\n                                                    0x6a, 0x6f, 0x84, 0x7a, 0x67, 0x1f, 0xc3, 0xb7,\n                                                    0x9b, 0xa9, 0x86, 0xcd, 0x8, 0xf7, 0x19, 0xc3,\n                                                    0xfb, 0x1d, 0x6, 0x87, 0x97, 0x88, 0xaf, 0x88,\n                                                    0xa7, 0x8, 0xf7, 0x27, 0xc5, 0x6, 0xfb, 0x2d,\n                                                    0x8c, 0x5, 0x89, 0xa3, 0x89, 0x97, 0x97, 0x1a,\n                                                    0xe8, 0xc6, 0xa7, 0xbe, 0xbe, 0xbd, 0x72, 0x59,\n                                                    0xa4, 0x1e, 0xc0, 0x9e, 0x5, 0xc4, 0x70, 0x50,\n                                                    0xc4, 0x2f, 0x1b, 0x22, 0x4e, 0x3f, 0x36, 0x7b,\n                                                    0x8d, 0x78, 0x8e, 0x6c, 0x1f, 0x2e, 0x4f, 0xef,\n                                                    0x6, 0x8f, 0x6f, 0x8b, 0x69, 0x8f, 0x7e, 0x8,\n                                                    0xfb, 0x0, 0x53, 0xf7, 0x4, 0x6, 0x96, 0x4c,\n                                                    0x53, 0x5a, 0x46, 0x59, 0x8, 0xe, 0xf7, 0xc7,\n                                                    0xc9, 0x1, 0xf8, 0x54, 0xc2, 0x3, 0xf8, 0x54,\n                                                    0xf7, 0xc7, 0x15, 0xfb, 0x5b, 0xc2, 0xf7, 0x99,\n                                                    0xfc, 0x3e, 0x4d, 0x7, 0xe, 0x8b, 0xc3, 0xf8,\n                                                    0x99, 0xc3, 0x1, 0xf7, 0xa5, 0x73, 0xa, 0xc3,\n                                                    0xfb, 0x45, 0xf7, 0x88, 0x6, 0xf7, 0x18, 0xc0,\n                                                    0x5, 0xc3, 0x7, 0xfb, 0x18, 0x55, 0x5, 0xf7,\n                                                    0xa6, 0xfb, 0x78, 0x53, 0xf7, 0x41, 0xfb, 0x84,\n                                                    0x7, 0xfb, 0x19, 0x55, 0x5, 0x54, 0x7, 0xf7,\n                                                    0x19, 0xc1, 0x5, 0xfb, 0x72, 0xfb, 0x46, 0x7,\n                                                    0xe, 0x8b, 0xc2, 0xf7, 0xdf, 0xc2, 0x1, 0xc2,\n                                                    0xc4, 0xf7, 0x3c, 0xc3, 0xf7, 0x2c, 0xc4, 0x3,\n                                                    0xc2, 0x16, 0xf7, 0xd, 0xc1, 0x4b, 0xf7, 0xa2,\n                                                    0x6, 0xa7, 0x9f, 0xa1, 0xad, 0xba, 0x1b, 0xd0,\n                                                    0x95, 0x40, 0x81, 0x1f, 0xfb, 0xc1, 0xf7, 0xd,\n                                                    0xc2, 0x4a, 0xf7, 0x96, 0x7, 0x96, 0xa7, 0xca,\n                                                    0xc4, 0xc9, 0x90, 0x54, 0x75, 0x1e, 0xfb, 0xca,\n                                                    0xf7, 0x4, 0xc2, 0x54, 0xf7, 0x96, 0x7, 0xcd,\n                                                    0x6a, 0xc9, 0x3d, 0x56, 0x6e, 0x68, 0x68, 0x6f,\n                                                    0x1e, 0xaf, 0x7c, 0x62, 0xad, 0x55, 0x1b, 0x5e,\n                                                    0x6f, 0x6f, 0x6e, 0x6e, 0x1f, 0xb7, 0xfb, 0x4,\n                                                    0x55, 0xc2, 0x7, 0xe, 0xf8, 0xa1, 0xb3, 0x1,\n                                                    0xf7, 0xc, 0xf7, 0xfc, 0x3, 0xf7, 0xc, 0xf8,\n                                                    0xa1, 0x15, 0xf7, 0xfc, 0xb3, 0xfb, 0xfc, 0x6,\n                                                    0xe, 0xf7, 0x7c, 0xbe, 0x1, 0xdb, 0xf8, 0x4c,\n                                                    0x3, 0xdb, 0xf7, 0x7c, 0x15, 0xf8, 0x4c, 0xbe,\n                                                    0xfc, 0x4c, 0x6, 0xe, 0xfb, 0x1c, 0x76, 0xf7,\n                                                    0x2c, 0xbf, 0x62, 0xb4, 0x62, 0xc1, 0xf7, 0xcd,\n                                                    0xc0, 0x12, 0xf7, 0x3, 0xc2, 0xf7, 0x9f, 0xc2,\n                                                    0x13, 0xce, 0xf7, 0x3a, 0xae, 0x15, 0x6f, 0xa7,\n                                                    0xb1, 0x7f, 0xb3, 0x1b, 0xc8, 0xcb, 0xae, 0xc5,\n                                                    0xaf, 0x1f, 0x13, 0xae, 0x39, 0xf7, 0x1d, 0x7,\n                                                    0x13, 0x9e, 0xc1, 0x39, 0xf8, 0x2, 0xfb, 0x1d,\n                                                    0x56, 0xdd, 0xfb, 0x18, 0x7, 0x13, 0xce, 0x5a,\n                                                    0x68, 0xfb, 0x25, 0xfb, 0x11, 0x49, 0x62, 0xb8,\n                                                    0xc6, 0x1e, 0xf7, 0xa7, 0xfb, 0x1d, 0x56, 0xdd,\n                                                    0xfc, 0xa6, 0xc2, 0x7, 0xe, 0xc9, 0x76, 0x1,\n                                                    0xe1, 0xdb, 0x15, 0xaf, 0x65, 0xf7, 0x45, 0xf7,\n                                                    0x43, 0xf7, 0x44, 0xfb, 0x42, 0xb2, 0xb2, 0xfb,\n                                                    0x44, 0xf7, 0x43, 0xf7, 0x44, 0xf7, 0x44, 0x69,\n                                                    0xb4, 0xfb, 0x49, 0xfb, 0x46, 0xfb, 0x43, 0xf7,\n                                                    0x42, 0x65, 0x64, 0xf7, 0x43, 0xfb, 0x43, 0x5,\n                                                    0xe, 0x8b, 0xc2, 0xf7, 0xe0, 0xc2, 0x1, 0xf7,\n                                                    0x1, 0xc2, 0xf7, 0xa5, 0xc2, 0x3, 0xa4, 0x16,\n                                                    0xf7, 0x73, 0xc2, 0x37, 0xf7, 0x85, 0x6, 0xb8,\n                                                    0xb5, 0xd0, 0xb9, 0xc9, 0x1b, 0xb7, 0xc3, 0x7e,\n                                                    0x47, 0x1f, 0xfb, 0x8f, 0x38, 0x54, 0xf7, 0x70,\n                                                    0xc2, 0x39, 0xf7, 0x90, 0x7, 0xe1, 0x5a, 0xbc,\n                                                    0x21, 0x45, 0x45, 0x5e, 0x62, 0x6a, 0x1e, 0xe1,\n                                                    0xfb, 0x1f, 0x54, 0xdf, 0xfb, 0xe0, 0x37, 0x7,\n                                                    0xe, 0x7c, 0xc4, 0xf7, 0x4a, 0xc9, 0xf7, 0xa9,\n                                                    0xc6, 0x1, 0xf5, 0xc7, 0xf7, 0xa2, 0xc5, 0x3,\n                                                    0xf5, 0x7c, 0x15, 0xf7, 0x8d, 0xf7, 0x1f, 0xf7,\n                                                    0x5, 0xf7, 0x7c, 0xf7, 0x62, 0x2d, 0xe1, 0xfb,\n                                                    0x6, 0x23, 0x3f, 0x27, 0x20, 0x28, 0xcb, 0x2f,\n                                                    0xf7, 0x2, 0xd9, 0xbc, 0xb9, 0xb3, 0xa8, 0x1f,\n                                                    0xfb, 0x5a, 0xfb, 0x34, 0x3d, 0xfb, 0x3e, 0x93,\n                                                    0x1e, 0xf7, 0xd9, 0xf7, 0xf2, 0x15, 0x54, 0x70,\n                                                    0x59, 0x58, 0x4a, 0x1b, 0x43, 0x58, 0xc0, 0xd9,\n                                                    0xc5, 0xab, 0xe3, 0xe3, 0xe2, 0xc1, 0x2d, 0x3e,\n                                                    0x8f, 0x1f, 0xe, 0x8b, 0xbf, 0xf7, 0xed, 0xc0,\n                                                    0x5b, 0xc0, 0xc7, 0xbb, 0x8c, 0xbc, 0x12, 0xa4,\n                                                    0xf7, 0x20, 0x54, 0xc2, 0xf7, 0xa5, 0xc1, 0x13,\n                                                    0xbd, 0xeb, 0xf8, 0xa1, 0x15, 0xbe, 0x81, 0x5,\n                                                    0x99, 0x8f, 0x9f, 0xae, 0xaf, 0x1b, 0xad, 0xaa,\n                                                    0x85, 0x7c, 0xa1, 0x1f, 0x7c, 0xa1, 0x9b, 0x7e,\n                                                    0xb4, 0x1b, 0xc9, 0xb6, 0xb6, 0xc2, 0x9e, 0x1f,\n                                                    0x59, 0x94, 0x5, 0x72, 0x82, 0x6e, 0x69, 0x67,\n                                                    0x1b, 0x76, 0x7a, 0x97, 0x98, 0x78, 0x1f, 0x9c,\n                                                    0x73, 0x71, 0x93, 0x5f, 0x1b, 0x58, 0x56, 0x74,\n                                                    0x4a, 0x75, 0x1f, 0x44, 0xfc, 0xa1, 0x15, 0xf7,\n                                                    0x73, 0xbf, 0x38, 0xf7, 0x93, 0x6, 0xb7, 0xb5,\n                                                    0xd0, 0xbe, 0xc8, 0x1b, 0xb7, 0xc4, 0x7f, 0x49,\n                                                    0x1f, 0xfb, 0xa4, 0x38, 0x57, 0xf7, 0x6f, 0xbf,\n                                                    0x39, 0xf7, 0xa5, 0x7, 0xdd, 0x62, 0xbb, 0x2a,\n                                                    0x45, 0x47, 0x65, 0x5f, 0x58, 0x1e, 0x13, 0xdd,\n                                                    0xd0, 0xfb, 0x20, 0x56, 0x7, 0x13, 0xdb, 0xe0,\n                                                    0xfb, 0xe5, 0x6, 0x13, 0xdd, 0x36, 0x6, 0xe,\n                                                    0xf7, 0x1f, 0xc1, 0xf7, 0x35, 0xc1, 0x1, 0xf7,\n                                                    0x3b, 0x3d, 0x15, 0xbd, 0x6, 0x95, 0xf7, 0x6d,\n                                                    0x5, 0xf7, 0x23, 0x6, 0x86, 0xfb, 0x6d, 0x5,\n                                                    0xbd, 0x6, 0x91, 0xf7, 0x6d, 0x5, 0xef, 0xc1,\n                                                    0x2b, 0x6, 0x8f, 0xf7, 0x35, 0x5, 0xe7, 0xc1,\n                                                    0x32, 0x6, 0x90, 0xf7, 0x6f, 0x5, 0x58, 0x6,\n                                                    0x87, 0xfb, 0x6f, 0x5, 0xfb, 0x25, 0x6, 0x8e,\n                                                    0xf7, 0x6f, 0x5, 0x57, 0x6, 0x88, 0xfb, 0x6f,\n                                                    0x5, 0x20, 0x55, 0xf4, 0x6, 0x86, 0xfb, 0x35,\n                                                    0x5, 0x27, 0x55, 0xec, 0x6, 0xc1, 0xc1, 0x15,\n                                                    0x90, 0xf7, 0x35, 0x5, 0xf7, 0x24, 0x6, 0x86,\n                                                    0xfb, 0x35, 0x5, 0xe, 0x7a, 0xc2, 0xf7, 0xf2,\n                                                    0xc2, 0x1, 0xc7, 0xc1, 0xf8, 0x2, 0xc6, 0x3,\n                                                    0xc7, 0xf7, 0x67, 0x15, 0xfb, 0x1f, 0xf6, 0x32,\n                                                    0xf7, 0x18, 0xf7, 0x1e, 0xf1, 0xe6, 0xf7, 0x1e,\n                                                    0xf7, 0x22, 0x24, 0xe4, 0xfb, 0x1d, 0xfb, 0x1f,\n                                                    0x27, 0x34, 0xfb, 0x25, 0x1e, 0xc1, 0x16, 0xf7,\n                                                    0x6, 0xd8, 0xca, 0xf5, 0xf5, 0xd8, 0x4d, 0xfb,\n                                                    0x6, 0xfb, 0xa, 0x43, 0x53, 0xfb, 0x3, 0x22,\n                                                    0x3d, 0xc5, 0xf7, 0x7, 0x1e, 0xe, 0x63, 0xa,\n                                                    0x58, 0xa, 0xf7, 0x4c, 0xf8, 0x95, 0x15, 0xf7,\n                                                    0xa6, 0xde, 0x6b, 0xd7, 0xfb, 0x92, 0xfb, 0x13,\n                                                    0x5, 0xfb, 0x2, 0xfb, 0xdd, 0x21, 0xa, 0x63,\n                                                    0xa, 0xf7, 0x62, 0x77, 0x58, 0xa, 0xf7, 0x32,\n                                                    0xf8, 0x7d, 0x15, 0xf7, 0x22, 0xf7, 0x3, 0xf7,\n                                                    0x20, 0xfb, 0x3, 0xb3, 0x9d, 0xfb, 0x22, 0xf7,\n                                                    0x27, 0x5, 0x3f, 0x6, 0xfb, 0x23, 0xfb, 0x27,\n                                                    0x5, 0x52, 0xfb, 0xb7, 0x21, 0xa, 0x63, 0xa,\n                                                    0xd2, 0xf7, 0x8, 0x58, 0xa, 0xf7, 0xf6, 0xf8,\n                                                    0x9b, 0x15, 0xda, 0xf7, 0x8, 0x3c, 0x6, 0xfb,\n                                                    0x54, 0xfb, 0x8, 0x15, 0xdd, 0xf7, 0x8, 0x39,\n                                                    0x6, 0x27, 0xfc, 0x37, 0x21, 0xa, 0x7c, 0xc2,\n                                                    0xf7, 0x2c, 0xc6, 0xf7, 0x1b, 0xc2, 0x1, 0xa9,\n                                                    0xc1, 0xf7, 0x59, 0xc0, 0xf7, 0x4b, 0xbf, 0x3,\n                                                    0xf7, 0xc8, 0xd3, 0x15, 0x58, 0xa4, 0xb2, 0x67,\n                                                    0xe0, 0x1b, 0xb6, 0xac, 0x96, 0x97, 0xaf, 0x1f,\n                                                    0x81, 0xc1, 0x5, 0x81, 0x6f, 0x65, 0x7f, 0x68,\n                                                    0x1b, 0x3f, 0x55, 0xbb, 0xf3, 0x91, 0x1f, 0xf7,\n                                                    0x7f, 0x6, 0xec, 0x8c, 0x82, 0xf7, 0x2c, 0xfb,\n                                                    0x14, 0x1b, 0x48, 0x66, 0x5a, 0x6d, 0x7d, 0x1f,\n                                                    0xb9, 0x76, 0x63, 0xac, 0x4b, 0x1b, 0xfb, 0x1d,\n                                                    0x74, 0xfb, 0x21, 0xfb, 0x3, 0xfb, 0x51, 0xf7,\n                                                    0x9, 0x7b, 0xad, 0xe3, 0xa9, 0xcb, 0xa3, 0x94,\n                                                    0x1f, 0xa6, 0xf7, 0x47, 0x15, 0xcb, 0x81, 0xba,\n                                                    0xcf, 0xc5, 0x1b, 0xd1, 0x9c, 0x3b, 0x57, 0x1f,\n                                                    0xfc, 0x45, 0x52, 0x15, 0xe3, 0x9d, 0xf3, 0xdf,\n                                                    0xd9, 0x9c, 0x35, 0x49, 0x47, 0x90, 0xfb, 0x12,\n                                                    0x24, 0x31, 0x82, 0xf7, 0x12, 0xa7, 0x1e, 0xe,\n                                                    0xfb, 0x2b, 0xc1, 0x1, 0xf7, 0x78, 0xcd, 0x3,\n                                                    0xf7, 0xb9, 0x16, 0x67, 0x7b, 0x6e, 0x6a, 0x67,\n                                                    0x1a, 0x61, 0xaf, 0x73, 0xb1, 0xa1, 0xa1, 0x93,\n                                                    0x9a, 0x9c, 0x1e, 0x93, 0xc3, 0x5, 0x7c, 0x82,\n                                                    0x75, 0x81, 0x79, 0x1b, 0x7b, 0x7f, 0x95, 0x9f,\n                                                    0xb1, 0xba, 0x9d, 0xa4, 0x96, 0x1f, 0xe, 0x63,\n                                                    0xa, 0x58, 0xa, 0xf7, 0x36, 0xf8, 0xe7, 0x15,\n                                                    0xf7, 0xa8, 0x24, 0x96, 0xaa, 0xfb, 0x93, 0xf7,\n                                                    0x29, 0x5, 0xfb, 0x18, 0xfc, 0x5c, 0x21, 0xa,\n                                                    0x8b, 0xc2, 0xf8, 0xcb, 0x77, 0x1, 0xf7, 0xa9,\n                                                    0xc2, 0x3, 0xea, 0x16, 0xf8, 0x2d, 0xc2, 0xfb,\n                                                    0x40, 0xf8, 0xcb, 0x6, 0xfb, 0x71, 0x58, 0x5,\n                                                    0x54, 0x7, 0xf7, 0x3a, 0xaf, 0x5, 0xfc, 0x85,\n                                                    0xfb, 0x4a, 0x7, 0xe, 0x5d, 0xc1, 0x5f, 0x76,\n                                                    0xf7, 0xd4, 0xc0, 0x7c, 0xc1, 0xf7, 0xca, 0x77,\n                                                    0x12, 0xf0, 0xc0, 0xf8, 0x3, 0xbe, 0x13, 0x5e,\n                                                    0xb9, 0x6e, 0x15, 0xb0, 0x6f, 0xf8, 0x9a, 0xf9,\n                                                    0x46, 0x66, 0xab, 0x5, 0xfc, 0xc8, 0xfc, 0x0,\n                                                    0x15, 0xf7, 0x94, 0xc1, 0x25, 0xf7, 0xc6, 0x6,\n                                                    0xfb, 0x25, 0x73, 0x5, 0x55, 0x7, 0xe7, 0x99,\n                                                    0x5, 0xfb, 0x86, 0x26, 0x7, 0xf7, 0xfa, 0xfb,\n                                                    0xf2, 0x15, 0x13, 0xae, 0x58, 0xf7, 0x6a, 0xc1,\n                                                    0xfb, 0x22, 0x7, 0xf1, 0xe5, 0xb3, 0xb0, 0xd2,\n                                                    0x1a, 0xc3, 0x69, 0xc1, 0x46, 0x65, 0x67, 0x78,\n                                                    0x69, 0x73, 0x1e, 0x4c, 0xb8, 0x7, 0xb0, 0x84,\n                                                    0xa9, 0xa5, 0xa9, 0x1b, 0xae, 0x9c, 0x6c, 0x69,\n                                                    0x59, 0x24, 0x39, 0x4f, 0x4e, 0x1f, 0xe, 0x5e,\n                                                    0xc1, 0x5e, 0x76, 0xf7, 0xf, 0xc3, 0xf7, 0x47,\n                                                    0xc1, 0xf7, 0xc6, 0x77, 0x12, 0xef, 0xbc, 0xf7,\n                                                    0xcc, 0xbd, 0x13, 0xbe, 0xf7, 0xd6, 0xc8, 0x15,\n                                                    0xf7, 0x1f, 0x57, 0x54, 0x55, 0xf7, 0x2b, 0xc1,\n                                                    0x5d, 0xbf, 0xb9, 0xc3, 0x5d, 0xf7, 0x55, 0x51,\n                                                    0x6, 0xfb, 0x17, 0xfb, 0x66, 0x5, 0xca, 0x9c,\n                                                    0x15, 0xd7, 0xf7, 0x8, 0x5, 0xfb, 0x8, 0x7,\n                                                    0xfc, 0x14, 0xfb, 0x24, 0x15, 0x13, 0x7e, 0xb3,\n                                                    0x6d, 0xf8, 0x77, 0xf9, 0x47, 0x63, 0x9f, 0x5,\n                                                    0xfc, 0xc4, 0xfb, 0xf5, 0x15, 0xf7, 0x87, 0xc1,\n                                                    0x2d, 0xf7, 0xc6, 0x6, 0xfb, 0x19, 0x73, 0x5,\n                                                    0x55, 0x7, 0xdf, 0x99, 0x5, 0xfb, 0x86, 0x27,\n                                                    0x7, 0xe, 0xf7, 0x8d, 0xc3, 0xf7, 0xd1, 0x77,\n                                                    0x68, 0xa, 0xc1, 0x3, 0xf7, 0x40, 0xf7, 0x8d,\n                                                    0x15, 0xf7, 0x94, 0xc3, 0x27, 0xf7, 0xd1, 0x6,\n                                                    0xfb, 0x25, 0x71, 0x5, 0x53, 0x7, 0xe6, 0x9a,\n                                                    0x5, 0xfb, 0x8e, 0x25, 0x7, 0xe, 0xf7, 0x8d,\n                                                    0xbf, 0xe7, 0xbe, 0xe4, 0xba, 0x1, 0xf7, 0xf1,\n                                                    0xb7, 0x3, 0xf7, 0xf2, 0xf7, 0x95, 0x15, 0xe8,\n                                                    0xc2, 0x59, 0xf7, 0x27, 0x6, 0xd6, 0x75, 0xb9,\n                                                    0x3e, 0x5f, 0x5b, 0x7a, 0x7c, 0x69, 0x1e, 0x96,\n                                                    0x5b, 0x5, 0xa8, 0xc0, 0xb0, 0x8f, 0xa8, 0x1b,\n                                                    0xac, 0x9d, 0x6a, 0x58, 0x1f, 0x7e, 0x7, 0x8f,\n                                                    0x75, 0x73, 0x8f, 0x73, 0x1b, 0x26, 0x76, 0x4a,\n                                                    0x69, 0x5c, 0xac, 0x5a, 0xc2, 0xb3, 0xaf, 0xa6,\n                                                    0xad, 0xa8, 0x1f, 0x8a, 0xcf, 0x15, 0x5f, 0x72,\n                                                    0x66, 0x6a, 0x64, 0x1b, 0x70, 0x76, 0x9e, 0xa4,\n                                                    0xa4, 0xa4, 0xa2, 0xba, 0xb1, 0xb2, 0x7c, 0x8b,\n                                                    0x1f, 0xe, 0xf7, 0x8d, 0xc1, 0xf7, 0x75, 0xbf,\n                                                    0x1, 0xf7, 0x31, 0xc2, 0xf7, 0x44, 0xc2, 0x3,\n                                                    0xf7, 0x31, 0xf8, 0x34, 0x15, 0xfb, 0x13, 0xed,\n                                                    0x63, 0xb8, 0xc3, 0xe2, 0xba, 0xf7, 0xa, 0xe5,\n                                                    0x55, 0xd7, 0x34, 0x4b, 0x3a, 0x59, 0xfb, 0x6,\n                                                    0x1e, 0xc2, 0x16, 0xc5, 0xad, 0xc1, 0xc4, 0xd1,\n                                                    0x9a, 0x3b, 0x6b, 0x45, 0x63, 0x60, 0x5d, 0x5f,\n                                                    0x5d, 0xb7, 0xd0, 0x1e, 0xe, 0x7f, 0xbd, 0x69,\n                                                    0x76, 0xf8, 0x33, 0xbd, 0x8e, 0x77, 0x12, 0xc8,\n                                                    0xbf, 0xf8, 0x0, 0xc2, 0x13, 0x6c, 0xc8, 0xa3,\n                                                    0x15, 0xaf, 0x62, 0xc0, 0xbe, 0x5, 0x13, 0x9c,\n                                                    0x69, 0xb7, 0xc1, 0x7f, 0xbe, 0x1b, 0xf7, 0x12,\n                                                    0xf6, 0xdd, 0xf7, 0x29, 0xbf, 0x7e, 0xbf, 0x6c,\n                                                    0xb1, 0x1f, 0xbd, 0xbc, 0x67, 0xb4, 0x57, 0x58,\n                                                    0x5, 0x13, 0xac, 0xac, 0x60, 0x57, 0x9a, 0x54,\n                                                    0x1b, 0xfb, 0x2d, 0x35, 0x22, 0xfb, 0x11, 0x55,\n                                                    0x9c, 0x54, 0xac, 0x65, 0x1f, 0xda, 0x8d, 0x15,\n                                                    0xf7, 0x96, 0xf7, 0x8d, 0x5, 0x98, 0x77, 0x9b,\n                                                    0x69, 0x4b, 0x1a, 0x50, 0x5a, 0x20, 0xfb, 0x16,\n                                                    0x64, 0x65, 0x99, 0xa0, 0x6c, 0x1e, 0x63, 0xb0,\n                                                    0x15, 0x73, 0xa7, 0x7e, 0xb3, 0xb3, 0x1a, 0xf6,\n                                                    0xdd, 0xd4, 0xf3, 0xa9, 0xb7, 0x7f, 0x72, 0xb0,\n                                                    0x1e, 0xe, 0x63, 0xa, 0xc9, 0xbd, 0x9c, 0xbc,\n                                                    0x12, 0xc9, 0xc5, 0xf7, 0xfa, 0xc7, 0x17, 0xf7,\n                                                    0x0, 0xf8, 0xa1, 0x15, 0xbb, 0x80, 0x5, 0x9a,\n                                                    0x8f, 0x9e, 0xbb, 0xad, 0x1b, 0xad, 0x9e, 0x76,\n                                                    0x79, 0xa3, 0x1f, 0x13, 0xfc, 0x7c, 0x9e, 0xa0,\n                                                    0x7e, 0xad, 0x1b, 0x13, 0xec, 0xc6, 0xb9, 0xbb,\n                                                    0xc2, 0x9d, 0x1f, 0x5c, 0x94, 0x5, 0x73, 0x82,\n                                                    0x70, 0x65, 0x69, 0x1b, 0x77, 0x7c, 0x94, 0x96,\n                                                    0x7c, 0x1f, 0x13, 0xdc, 0x9e, 0x71, 0x72, 0xa6,\n                                                    0x61, 0x1b, 0x5b, 0x59, 0x67, 0x4a, 0x76, 0x1f,\n                                                    0x5d, 0xfb, 0xc9, 0x21, 0xa, 0x66, 0xa, 0xe7,\n                                                    0xc2, 0xf7, 0xf1, 0xc4, 0x13, 0xdc, 0x92, 0x21,\n                                                    0x15, 0x58, 0xf7, 0xbd, 0xbe, 0xfb, 0x31, 0xf7,\n                                                    0x5f, 0x7, 0x67, 0xac, 0xc3, 0x62, 0xea, 0x1b,\n                                                    0xf7, 0x11, 0xec, 0xe8, 0xf7, 0x12, 0xf7, 0x4,\n                                                    0x2b, 0xde, 0xfb, 0xe, 0x33, 0x4d, 0x70, 0x60,\n                                                    0x65, 0x1f, 0x13, 0xec, 0xcc, 0xfb, 0x20, 0x58,\n                                                    0xe0, 0xfc, 0x78, 0x7, 0xc6, 0xf7, 0xe4, 0x15,\n                                                    0x13, 0xdc, 0xe4, 0xd8, 0xca, 0xeb, 0xeb, 0xd7,\n                                                    0x4c, 0x32, 0x32, 0x3f, 0x43, 0x2b, 0x2b, 0x3e,\n                                                    0xd3, 0xe4, 0x1e, 0xe, 0xf8, 0xa8, 0xa9, 0x1,\n                                                    0xf7, 0xd1, 0xb7, 0xd9, 0xb6, 0x3, 0xf7, 0xd1,\n                                                    0x3d, 0x15, 0xb7, 0xf8, 0xf6, 0xd9, 0xfc, 0xf6,\n                                                    0xb6, 0xf8, 0xf6, 0xbb, 0xa9, 0xfb, 0x6e, 0x6,\n                                                    0xfb, 0x38, 0x3c, 0x4f, 0xfb, 0xa, 0x4d, 0xc2,\n                                                    0x2a, 0xf7, 0x55, 0x8a, 0x1f, 0xe, 0xfb, 0x0,\n                                                    0xf9, 0x6e, 0x1, 0xf7, 0x6a, 0xc2, 0x3, 0xf8,\n                                                    0x16, 0xf9, 0x2, 0x15, 0x56, 0x6, 0x51, 0x31,\n                                                    0x4e, 0xfb, 0x29, 0xfb, 0x27, 0x1a, 0x26, 0xbb,\n                                                    0xfb, 0x1a, 0xd1, 0xfb, 0x1, 0x1e, 0xc1, 0x6,\n                                                    0x4e, 0xf7, 0x7, 0x53, 0xe5, 0xf7, 0x1f, 0x1a,\n                                                    0xf7, 0x3a, 0xd1, 0xf7, 0x1c, 0xba, 0xdf, 0x1e,\n                                                    0xe, 0xfb, 0x0, 0xf9, 0x6e, 0x1, 0xf7, 0xdf,\n                                                    0xc2, 0x3, 0xf7, 0x6a, 0xfb, 0x0, 0x15, 0xc0,\n                                                    0x6, 0xc5, 0xe5, 0xc8, 0xf7, 0x29, 0xf7, 0x27,\n                                                    0x1a, 0xf0, 0x5b, 0xf7, 0x1a, 0x45, 0xf7, 0x1,\n                                                    0x1e, 0x55, 0x6, 0xc8, 0xfb, 0x7, 0xc3, 0x31,\n                                                    0xfb, 0x1f, 0x1a, 0xfb, 0x3a, 0x45, 0xfb, 0x1c,\n                                                    0x5c, 0x37, 0x1e, 0xe, 0x7c, 0xc1, 0xf7, 0x22,\n                                                    0xc4, 0xf7, 0x20, 0xc1, 0xf7, 0x19, 0xc4, 0x12,\n                                                    0xf7, 0x1, 0xc3, 0xc3, 0xc3, 0xa9, 0xc2, 0xc4,\n                                                    0xc2, 0x17, 0xf0, 0xf7, 0x5d, 0x15, 0xf8, 0x35,\n                                                    0xf7, 0x3c, 0x78, 0xba, 0xfc, 0x36, 0xfb, 0x38,\n                                                    0x5, 0xf7, 0x58, 0xfb, 0x22, 0x65, 0xa, 0x64,\n                                                    0x6b, 0xab, 0xb2, 0x1e, 0x4b, 0xa, 0x53, 0xf8,\n                                                    0x13, 0x65, 0xa, 0x1e, 0x13, 0x3a, 0x64, 0x6b,\n                                                    0xab, 0xb2, 0x1f, 0x4b, 0xa, 0xe, 0x7c, 0xf7,\n                                                    0x10, 0x7a, 0xa, 0xb7, 0x15, 0x65, 0xab, 0x76,\n                                                    0xb1, 0xab, 0xb3, 0xa0, 0xb1, 0xb2, 0x6b, 0xa5,\n                                                    0x63, 0x65, 0x6b, 0x73, 0x62, 0x1e, 0xe, 0xf7,\n                                                    0x51, 0xf7, 0x1e, 0x1, 0xf7, 0x72, 0xf7, 0x30,\n                                                    0x3, 0xf7, 0x72, 0xf7, 0x95, 0x15, 0x69, 0xaa,\n                                                    0x69, 0xbc, 0xb1, 0xb1, 0xa7, 0xb2, 0xaf, 0x6d,\n                                                    0xae, 0x5c, 0x5f, 0x68, 0x6c, 0x64, 0x1e, 0xe,\n                                                    0x7c, 0xc2, 0xf7, 0x21, 0xc1, 0xf7, 0x1d, 0xc2,\n                                                    0xf7, 0x21, 0xc1, 0x12, 0xa4, 0xc3, 0x7d, 0xc3,\n                                                    0xf2, 0xc1, 0x7f, 0xc1, 0xa0, 0xc3, 0xf7, 0x25,\n                                                    0xc1, 0x13, 0xfa, 0xc0, 0xa4, 0xf8, 0x84, 0x15,\n                                                    0x49, 0xbd, 0x51, 0xd9, 0xd4, 0xc1, 0xc4, 0xcf,\n                                                    0xcd, 0x62, 0xc6, 0x33, 0x3e, 0x5a, 0x4f, 0x49,\n                                                    0x1e, 0xc3, 0x8a, 0x15, 0xb6, 0xa7, 0xa9, 0xb9,\n                                                    0xb8, 0xa5, 0x6a, 0x64, 0x69, 0x72, 0x68, 0x5d,\n                                                    0x61, 0x6b, 0xa5, 0xb5, 0x1e, 0xf7, 0x9a, 0xfc,\n                                                    0x15, 0x3a, 0xa, 0x13, 0xf5, 0xc0, 0xfb, 0xe0,\n                                                    0x8c, 0x3a, 0xa, 0x27, 0xf2, 0x15, 0x13, 0x0,\n                                                    0x0, 0xf8, 0x46, 0xf7, 0x47, 0x75, 0xbe, 0xfc,\n                                                    0x46, 0xfb, 0x47, 0x5, 0xe, 0xcc, 0x76, 0xf7,\n                                                    0x5a, 0xc1, 0xf7, 0x42, 0x77, 0x68, 0xa, 0xc1,\n                                                    0x3, 0xdb, 0xf7, 0x86, 0x15, 0xf7, 0x56, 0xfb,\n                                                    0x5a, 0xc1, 0xf7, 0x5a, 0xf7, 0x54, 0xc1, 0xfb,\n                                                    0x54, 0xf7, 0x42, 0x55, 0xfb, 0x42, 0xfb, 0x56,\n                                                    0x6, 0xe, 0xb7, 0xc2, 0xf7, 0x76, 0xc2, 0xf7,\n                                                    0x46, 0x77, 0x68, 0xa, 0xc2, 0x3, 0xf7, 0xa6,\n                                                    0xf7, 0x1e, 0x15, 0xc2, 0xf7, 0x4f, 0xf7, 0x4c,\n                                                    0xc2, 0xfb, 0x4c, 0xf7, 0x46, 0x54, 0xfb, 0x46,\n                                                    0xfb, 0x4f, 0x54, 0xf7, 0x4f, 0x6, 0xfb, 0x4f,\n                                                    0xfb, 0xad, 0x15, 0xf8, 0x3e, 0xc2, 0xfc, 0x3e,\n                                                    0x6, 0xe, 0x7c, 0xc2, 0xf7, 0x5c, 0xc2, 0xf7,\n                                                    0x68, 0xc2, 0x1, 0xf5, 0xc2, 0xf7, 0xab, 0xc2,\n                                                    0x3, 0xa4, 0x7c, 0x15, 0xf7, 0x6d, 0xc2, 0x3a,\n                                                    0xf7, 0x5c, 0xf7, 0x8, 0x6, 0xa2, 0x6d, 0xb5,\n                                                    0x4e, 0xb1, 0x4f, 0x47, 0x47, 0x18, 0xaf, 0x67,\n                                                    0xc7, 0xc7, 0x98, 0x74, 0x98, 0x77, 0x94, 0x7a,\n                                                    0x19, 0xf7, 0x18, 0xc2, 0x23, 0x6, 0x83, 0x97,\n                                                    0x83, 0x9a, 0x81, 0x9a, 0xd5, 0xd5, 0x18, 0x67,\n                                                    0xaf, 0x4a, 0x4a, 0x70, 0xb5, 0x6d, 0xb7, 0x74,\n                                                    0xa8, 0x19, 0xcf, 0x90, 0xe4, 0xac, 0xf7, 0xf,\n                                                    0x1a, 0xe1, 0x5b, 0xd4, 0xfb, 0xe, 0x1e, 0xfb,\n                                                    0xc0, 0x54, 0xdc, 0xfc, 0x67, 0x3a, 0x6, 0xf7,\n                                                    0x1c, 0xf7, 0x93, 0x15, 0xf7, 0x68, 0xf7, 0x26,\n                                                    0x7, 0xd1, 0xca, 0x72, 0x3a, 0xfb, 0x2, 0x24,\n                                                    0x8f, 0x42, 0x1f, 0xe, 0x66, 0xa, 0xba, 0xc4,\n                                                    0xf7, 0xf1, 0xc2, 0x13, 0xec, 0xf7, 0xbc, 0x21,\n                                                    0x15, 0x58, 0xf7, 0xbd, 0xbe, 0x36, 0xf8, 0x78,\n                                                    0xe0, 0xbe, 0xfb, 0x20, 0x4a, 0x7, 0x13, 0xdc,\n                                                    0xb6, 0x65, 0x4d, 0xa6, 0x33, 0x1b, 0xfb, 0xe,\n                                                    0x2b, 0x38, 0xfb, 0x4, 0xfb, 0x12, 0xec, 0x2e,\n                                                    0xf7, 0x11, 0xea, 0xc3, 0xb4, 0xaf, 0xac, 0x1f,\n                                                    0xfb, 0x5f, 0x7, 0x87, 0xf7, 0xe4, 0x15, 0x32,\n                                                    0x3e, 0x43, 0x2b, 0x2b, 0x3f, 0xd3, 0xe4, 0xe4,\n                                                    0xd7, 0xca, 0xeb, 0xeb, 0xd8, 0x4c, 0x32, 0x1e,\n                                                    0xe, 0x7c, 0xf7, 0xb, 0xf8, 0x34, 0xbf, 0x1,\n                                                    0xf7, 0xa, 0xc1, 0xaa, 0xf7, 0x19, 0xe7, 0xc0,\n                                                    0x3, 0xf7, 0x86, 0xf7, 0x44, 0x15, 0xc2, 0xcd,\n                                                    0x6, 0xcc, 0x8f, 0xf7, 0xb, 0xb3, 0xf7, 0xc,\n                                                    0x1a, 0xf7, 0x6, 0x2c, 0xbf, 0x27, 0x4f, 0x4d,\n                                                    0x79, 0x69, 0x5d, 0x1e, 0x27, 0xc1, 0xc9, 0x7,\n                                                    0xa7, 0xb0, 0xb4, 0x95, 0xb1, 0x1b, 0xd7, 0xcb,\n                                                    0x5c, 0x4a, 0x29, 0xfb, 0x5, 0x7c, 0x42, 0x7d,\n                                                    0x1f, 0x64, 0xfb, 0x81, 0x4c, 0xa, 0xfb, 0x31,\n                                                    0xc1, 0xf7, 0xb, 0x76, 0xf7, 0xd2, 0xf7, 0x9,\n                                                    0x1, 0xf7, 0xa, 0xc0, 0xe6, 0xf7, 0x1b, 0xa9,\n                                                    0xc1, 0x3, 0xf7, 0x9a, 0xf8, 0x9, 0x15, 0x6c,\n                                                    0xa5, 0x6e, 0xb4, 0xb1, 0xa9, 0xa5, 0xac, 0xa8,\n                                                    0x70, 0xa8, 0x61, 0x6a, 0x6a, 0x73, 0x6a, 0x1e,\n                                                    0xb4, 0xfb, 0x52, 0x15, 0x40, 0x77, 0xfb, 0x2,\n                                                    0x67, 0xfb, 0xb, 0x1a, 0x21, 0xea, 0x50, 0xf1,\n                                                    0xc6, 0xc7, 0x9b, 0x9c, 0xba, 0x1e, 0xf7, 0xb,\n                                                    0x55, 0x44, 0x7, 0x7b, 0x68, 0x63, 0x80, 0x63,\n                                                    0x1b, 0xfb, 0x5, 0x6f, 0xd3, 0xb0, 0xec, 0xf7,\n                                                    0x6, 0xa0, 0xd4, 0x98, 0x1f, 0xf7, 0x6, 0x54,\n                                                    0x7, 0xe, 0xf8, 0xc2, 0x77, 0x1, 0xf7, 0x58,\n                                                    0xca, 0xdc, 0xca, 0x3, 0xf7, 0x62, 0xf7, 0xc7,\n                                                    0x77, 0xa, 0xf7, 0x37, 0xfb, 0x8f, 0x77, 0xa,\n                                                    0xe, 0xfb, 0x1a, 0x6d, 0xa, 0xfb, 0x1a, 0x45,\n                                                    0xa, 0xf7, 0xdc, 0xf7, 0x7e, 0x8b, 0x77, 0x1,\n                                                    0xf7, 0x1c, 0xf7, 0xdc, 0x3, 0xf8, 0x29, 0xf7,\n                                                    0xdc, 0x15, 0xc6, 0x6, 0x46, 0xf7, 0x7e, 0x5,\n                                                    0x2e, 0x6, 0x4a, 0xfb, 0x7e, 0x15, 0xc8, 0x6,\n                                                    0x45, 0x5c, 0xa, 0xf7, 0xdc, 0x6d, 0xa, 0xf7,\n                                                    0xdc, 0x45, 0xa, 0xf7, 0xdc, 0x5f, 0xa, 0xf7,\n                                                    0xd6, 0xf7, 0xdc, 0x15, 0xc6, 0x6, 0x44, 0x5c,\n                                                    0xa, 0xf7, 0xdc, 0x5f, 0xa, 0xf7, 0x6e, 0xf7,\n                                                    0xdc, 0x15, 0xc6, 0x6, 0xf3, 0x5c, 0xa, 0xfb,\n                                                    0x1a, 0x5f, 0xa, 0xf7, 0x6e, 0xfb, 0x1a, 0x15,\n                                                    0xc6, 0x6, 0xf3, 0x5c, 0xa, 0xf8, 0xc6, 0x77,\n                                                    0x1, 0xf7, 0x97, 0xdd, 0x3, 0xf7, 0xae, 0xf7,\n                                                    0xc7, 0x15, 0xae, 0x6, 0xa3, 0xf7, 0x93, 0x5,\n                                                    0x39, 0x6, 0xe, 0x8b, 0xc1, 0xf7, 0xd4, 0xc1,\n                                                    0x63, 0xc0, 0x12, 0xbd, 0xf7, 0x4a, 0x54, 0xc2,\n                                                    0x13, 0xb0, 0xbd, 0x16, 0xf8, 0xf, 0xc1, 0xfb,\n                                                    0x59, 0xf7, 0x51, 0x6, 0xf1, 0xf7, 0x2, 0xc2,\n                                                    0xb6, 0xb6, 0x1b, 0xa4, 0x9e, 0x85, 0x69, 0x92,\n                                                    0x1f, 0xc5, 0x90, 0x5, 0xbf, 0x88, 0x6a, 0xaf,\n                                                    0x54, 0x1b, 0x2c, 0x3f, 0x36, 0x57, 0x54, 0x1f,\n                                                    0x13, 0xd0, 0xf7, 0x10, 0xfb, 0x4a, 0x55, 0x7,\n                                                    0x13, 0xc8, 0xf7, 0x13, 0xfb, 0xd4, 0x6, 0x13,\n                                                    0xd0, 0xfb, 0x13, 0x6, 0xe, 0x79, 0xb9, 0xf8,\n                                                    0x7, 0xba, 0xe4, 0xb8, 0x1, 0x8b, 0xb9, 0xf7,\n                                                    0x2f, 0xbb, 0xf7, 0xd, 0xbe, 0xf7, 0x17, 0xbb,\n                                                    0x3, 0xf7, 0xaa, 0x4, 0xfb, 0x37, 0xf7, 0x1c,\n                                                    0xfb, 0x19, 0xf7, 0x3b, 0xf7, 0x36, 0xf7, 0x1b,\n                                                    0xf7, 0x14, 0xf7, 0x43, 0xf7, 0x3b, 0xfb, 0x1e,\n                                                    0xf7, 0x14, 0xfb, 0x33, 0xfb, 0x2f, 0xfb, 0x28,\n                                                    0xfb, 0xc, 0xfb, 0x4a, 0x1e, 0xb9, 0x8d, 0x15,\n                                                    0xf7, 0x16, 0xf1, 0xf7, 0x11, 0xf7, 0x30, 0xf7,\n                                                    0x22, 0xf5, 0xfb, 0x8, 0xfb, 0x1d, 0xfb, 0x22,\n                                                    0xfb, 0x1, 0xfb, 0x4, 0xfb, 0x21, 0xfb, 0x1b,\n                                                    0xfb, 0xd, 0xf7, 0x2, 0xf7, 0x22, 0x1e, 0xf7,\n                                                    0x2f, 0xfb, 0x30, 0x15, 0xbb, 0xf7, 0xe, 0xc0,\n                                                    0x6, 0xd4, 0xfb, 0xe, 0x5, 0xc6, 0x6, 0x3d,\n                                                    0xf7, 0x1a, 0x5, 0xb1, 0x99, 0xa6, 0xba, 0xae,\n                                                    0x1a, 0xd1, 0x4f, 0xa1, 0x52, 0x1e, 0x24, 0x6,\n                                                    0xbb, 0xfb, 0x2d, 0x15, 0xf5, 0xc1, 0x7, 0xb8,\n                                                    0xa1, 0x71, 0x74, 0x65, 0x67, 0x78, 0x6d, 0x1f,\n                                                    0xe, 0xf8, 0x63, 0xbd, 0xab, 0x8b, 0xab, 0xbd,\n                                                    0x1, 0xf7, 0x6e, 0xbd, 0xcb, 0xbd, 0x14, 0xe0,\n                                                    0xf7, 0x6e, 0xf8, 0xb5, 0x15, 0x5d, 0xaf, 0x67,\n                                                    0xb9, 0xb9, 0xaf, 0xaf, 0xb9, 0xb9, 0x67, 0xaf,\n                                                    0x5d, 0x5d, 0x67, 0x67, 0x5d, 0x1e, 0xbd, 0x16,\n                                                    0x9d, 0x99, 0x99, 0x9d, 0x9d, 0x99, 0x7d, 0x79,\n                                                    0x79, 0x7d, 0x7d, 0x79, 0x79, 0x7d, 0x99, 0x9d,\n                                                    0x1e, 0xe, 0x7e, 0xc2, 0xf7, 0x2b, 0xc0, 0xf7,\n                                                    0x20, 0xc2, 0x12, 0xdf, 0xc2, 0x5a, 0xc1, 0xf7,\n                                                    0xba, 0xc1, 0x69, 0xc5, 0x13, 0xf4, 0xdf, 0x7f,\n                                                    0x15, 0xc2, 0xb8, 0x6, 0x74, 0xbc, 0xc5, 0x75,\n                                                    0xdb, 0x1b, 0x13, 0xea, 0xf7, 0x3, 0xda, 0xc4,\n                                                    0xe1, 0xf7, 0xb, 0xfb, 0x28, 0x80, 0x32, 0x92,\n                                                    0x1f, 0x5f, 0x8e, 0x30, 0x99, 0xc1, 0x1a, 0xc9,\n                                                    0xee, 0x92, 0xb6, 0xc2, 0xc2, 0x7a, 0x70, 0xb5,\n                                                    0x1e, 0x50, 0xc1, 0xf7, 0x32, 0x55, 0x63, 0x7,\n                                                    0xa6, 0x5e, 0x55, 0x98, 0x53, 0x1b, 0xfb, 0x2,\n                                                    0x38, 0x5c, 0x35, 0x33, 0xf7, 0xc, 0x72, 0xce,\n                                                    0x89, 0x1f, 0xc1, 0x89, 0xf7, 0x13, 0x85, 0x4f,\n                                                    0x1a, 0x45, 0x20, 0x7f, 0x66, 0x4c, 0x4b, 0x9e,\n                                                    0xb0, 0x5b, 0x1e, 0xc6, 0x54, 0x7, 0xe, 0x7c,\n                                                    0xc2, 0x8b, 0xf7, 0x27, 0x8b, 0xc1, 0x8b, 0xf7,\n                                                    0x2b, 0x8b, 0xc2, 0x8b, 0xb7, 0x12, 0xde, 0xc3,\n                                                    0xf7, 0xbd, 0xc2, 0x17, 0xf7, 0x96, 0xf8, 0x7f,\n                                                    0x15, 0xdd, 0x6, 0xf7, 0x2a, 0xf7, 0x32, 0x60,\n                                                    0x9f, 0xfb, 0x28, 0xfb, 0xe, 0xfb, 0x2d, 0xf7,\n                                                    0xd, 0x61, 0x77, 0x5, 0x76, 0xfd, 0x2b, 0x15,\n                                                    0xc3, 0xc2, 0x6, 0x74, 0xbd, 0xbe, 0x6b, 0xdd,\n                                                    0x1b, 0xf7, 0x5, 0xdc, 0xc4, 0xe2, 0xdf, 0x3f,\n                                                    0xa2, 0x44, 0x90, 0x1f, 0x44, 0x90, 0xfb, 0x2c,\n                                                    0x7b, 0xe1, 0x1a, 0xca, 0xe6, 0x98, 0xb7, 0x1e,\n                                                    0x13, 0xef, 0xc3, 0xc3, 0x70, 0x70, 0xb6, 0x1f,\n                                                    0x59, 0xc2, 0xf7, 0x33, 0x54, 0x59, 0x7, 0xa6,\n                                                    0x5d, 0x54, 0xa2, 0x51, 0x1b, 0xfb, 0x4, 0x41,\n                                                    0x56, 0x34, 0xfb, 0xa, 0xf7, 0x2a, 0x8c, 0xdd,\n                                                    0x88, 0x1f, 0xbc, 0x89, 0xdf, 0x91, 0x47, 0x1a,\n                                                    0x40, 0xfb, 0x1, 0x83, 0x65, 0x4b, 0x52, 0xa9,\n                                                    0xb0, 0x5a, 0x1e, 0xbc, 0x53, 0x7, 0xe, 0xfb,\n                                                    0x2b, 0xf7, 0x5a, 0x56, 0xc0, 0xf7, 0x22, 0xbd,\n                                                    0xf7, 0x29, 0xc0, 0x12, 0xde, 0xc3, 0x5a, 0xc2,\n                                                    0xf7, 0xb6, 0xc3, 0x6c, 0xc3, 0x13, 0x7a, 0xde,\n                                                    0x85, 0x15, 0xc3, 0xc0, 0x6, 0xb3, 0x78, 0xb3,\n                                                    0x73, 0xc4, 0x83, 0x89, 0x4a, 0x18, 0x8e, 0x92,\n                                                    0x95, 0x8c, 0x95, 0x1b, 0x98, 0x96, 0x84, 0x7e,\n                                                    0x7b, 0x7c, 0x82, 0x7a, 0x7d, 0x7d, 0x8e, 0x94,\n                                                    0x81, 0x1f, 0x7d, 0x68, 0x5, 0x13, 0xba, 0x7f,\n                                                    0x9b, 0xa0, 0x85, 0x9e, 0x1b, 0xb1, 0xae, 0xab,\n                                                    0xb3, 0xad, 0x73, 0x9e, 0x77, 0x8c, 0x1f, 0x13,\n                                                    0x75, 0x9e, 0x7, 0xf7, 0x3, 0x8c, 0xda, 0xb4,\n                                                    0xde, 0x1a, 0xdc, 0x4f, 0xae, 0x43, 0x8f, 0x1e,\n                                                    0x45, 0x90, 0xfb, 0x3d, 0x85, 0xde, 0x1a, 0xc8,\n                                                    0xe6, 0x91, 0xb7, 0x1e, 0x13, 0xb6, 0xc4, 0xc2,\n                                                    0x70, 0x70, 0xb6, 0x1f, 0x5c, 0xc3, 0xf7, 0x2e,\n                                                    0x53, 0x5b, 0x7, 0xa5, 0x5d, 0x55, 0xa1, 0x50,\n                                                    0x1b, 0xfb, 0x4, 0x41, 0x5d, 0x38, 0xfb, 0x7,\n                                                    0xf7, 0x2e, 0x86, 0xdd, 0x88, 0x1f, 0x13, 0xb9,\n                                                    0xbd, 0x89, 0xdf, 0x83, 0x48, 0x1a, 0x44, 0xfb,\n                                                    0x5, 0x91, 0x65, 0x4a, 0x53, 0xa7, 0xaf, 0x5a,\n                                                    0x1e, 0xb1, 0x53, 0x7, 0xe, 0x3e, 0xc0, 0xf8,\n                                                    0xa3, 0xc0, 0x1, 0xf7, 0x16, 0xc0, 0xf7, 0x74,\n                                                    0xc0, 0x3, 0xf7, 0x16, 0xdd, 0x15, 0xfb, 0x33,\n                                                    0xf7, 0x53, 0x7, 0xa5, 0xa7, 0x8c, 0x8f, 0xa0,\n                                                    0x1f, 0xa5, 0x91, 0xac, 0x9e, 0xb7, 0x1a, 0xa7,\n                                                    0x7a, 0xa7, 0x74, 0x9e, 0x1e, 0x8b, 0x7c, 0x96,\n                                                    0x84, 0x92, 0x1e, 0xe3, 0x9e, 0x8c, 0xc6, 0xa2,\n                                                    0x1a, 0x8c, 0x7, 0xad, 0x72, 0xa6, 0x71, 0x9f,\n                                                    0x1e, 0xfb, 0x67, 0xf7, 0x33, 0x5, 0x74, 0x9d,\n                                                    0x84, 0x93, 0x96, 0x1a, 0xa9, 0xae, 0x8f, 0x9f,\n                                                    0x1e, 0xf7, 0x36, 0x21, 0xc0, 0xf7, 0x33, 0xfb,\n                                                    0x47, 0x6, 0x69, 0x68, 0x8a, 0x81, 0x6e, 0x1f,\n                                                    0x6e, 0x82, 0x7a, 0x70, 0x6d, 0x1a, 0x6c, 0x9f,\n                                                    0x76, 0xa1, 0x77, 0x1e, 0x9e, 0x7a, 0x5, 0x6d,\n                                                    0x83, 0x59, 0x6b, 0x52, 0x1a, 0x69, 0x9e, 0x6d,\n                                                    0xa3, 0x79, 0x1e, 0xf7, 0x65, 0xfb, 0x32, 0x5,\n                                                    0xa8, 0x76, 0x8e, 0x7d, 0x80, 0x1a, 0x81, 0x86,\n                                                    0x76, 0x6a, 0x1e, 0xfb, 0x49, 0xf5, 0x6, 0xf7,\n                                                    0x3f, 0xbb, 0x15, 0xfb, 0x2c, 0xf7, 0x6, 0x5,\n                                                    0x7d, 0x96, 0x7a, 0x9b, 0xa0, 0x1a, 0xb0, 0xb5,\n                                                    0xa2, 0xa5, 0x1e, 0xf7, 0x31, 0xfb, 0x5, 0x5,\n                                                    0x9b, 0x7e, 0x9f, 0x7a, 0x75, 0x1a, 0x7c, 0x80,\n                                                    0x61, 0x48, 0x1e, 0xe, 0xa8, 0x76, 0xf7, 0x8e,\n                                                    0xf7, 0x15, 0x8b, 0xf7, 0xb, 0x1, 0xf7, 0x99,\n                                                    0xf7, 0x19, 0x3, 0xf7, 0x61, 0x93, 0x15, 0xcb,\n                                                    0x6, 0xf1, 0xf7, 0x8e, 0x5, 0x2b, 0x6, 0x7d,\n                                                    0xf7, 0x50, 0x4c, 0xa, 0xa0, 0x76, 0xf8, 0xbb,\n                                                    0xc3, 0x1, 0xee, 0xc3, 0x3, 0xf7, 0x8a, 0x16,\n                                                    0xc8, 0x6, 0xf7, 0x55, 0xf8, 0xb8, 0x5, 0xc6,\n                                                    0xfc, 0x25, 0xfb, 0x28, 0xc3, 0xe7, 0xf7, 0xb3,\n                                                    0x7, 0xe, 0x7c, 0xc6, 0xf7, 0xa9, 0xc9, 0xf7,\n                                                    0x4a, 0xc4, 0x1, 0xf1, 0xc5, 0xf7, 0xaa, 0xc7,\n                                                    0x3, 0xf7, 0x34, 0xf7, 0xbd, 0x15, 0xf7, 0x72,\n                                                    0xf7, 0x39, 0xb9, 0xf7, 0x37, 0x1e, 0xc4, 0x7,\n                                                    0xfb, 0x8d, 0xfb, 0x1d, 0x38, 0xfb, 0x9a, 0xfb,\n                                                    0x62, 0xe8, 0x35, 0xf7, 0x6, 0xf3, 0xe0, 0xef,\n                                                    0xf6, 0xee, 0x42, 0xe7, 0xfb, 0x2, 0x3d, 0x5b,\n                                                    0x5d, 0x63, 0x6e, 0x1f, 0x8e, 0x39, 0x15, 0xc2,\n                                                    0xa6, 0xbe, 0xbe, 0xcc, 0x1b, 0xd3, 0xc7, 0x56,\n                                                    0x3d, 0x51, 0x62, 0x33, 0x2c, 0x34, 0x5b, 0xe9,\n                                                    0xd8, 0x87, 0x1f, 0xe, 0x3b, 0xf9, 0x59, 0x1,\n                                                    0xf7, 0x11, 0xf7, 0xf2, 0x3, 0xf7, 0x11, 0x4d,\n                                                    0x15, 0xb3, 0x79, 0xf7, 0xca, 0xf9, 0x46, 0x63,\n                                                    0x9e, 0x5, 0xe, 0xe, 0x76, 0xc5, 0x70, 0xc4,\n                                                    0xf7, 0x64, 0xc5, 0xf7, 0x71, 0xc4, 0x12, 0xf7,\n                                                    0x25, 0xc1, 0x89, 0xc0, 0x13, 0xb8, 0xf7, 0xa,\n                                                    0xaa, 0x15, 0xa3, 0x57, 0x5, 0x13, 0x78, 0xa4,\n                                                    0xc3, 0xb5, 0x91, 0xad, 0x1b, 0x13, 0xb8, 0xc8,\n                                                    0xae, 0x6c, 0xae, 0x1b, 0xb6, 0xb2, 0x9d, 0xa6,\n                                                    0xaa, 0x1f, 0x76, 0xb9, 0x5, 0x7f, 0x7a, 0x6e,\n                                                    0x76, 0x68, 0x1b, 0x13, 0x74, 0x6e, 0x8a, 0x5f,\n                                                    0xa9, 0x50, 0x8c, 0x8, 0x6e, 0x69, 0x86, 0x77,\n                                                    0x66, 0x1f, 0x88, 0x6, 0xb6, 0xc1, 0xa3, 0xb7,\n                                                    0x8d, 0xb8, 0x8c, 0xa8, 0x88, 0xa8, 0x81, 0xab,\n                                                    0x8, 0xf7, 0x61, 0xc5, 0xfb, 0x73, 0x6, 0x13,\n                                                    0xb8, 0x80, 0xa3, 0x81, 0xbb, 0xa2, 0x1a, 0xdd,\n                                                    0xbf, 0xb7, 0xd8, 0xbe, 0xb9, 0x67, 0x5a, 0xa4,\n                                                    0x1e, 0xc0, 0xa9, 0x5, 0xc3, 0x70, 0x52, 0xc3,\n                                                    0x31, 0x1b, 0xfb, 0xb, 0x4a, 0x38, 0x2f, 0x69,\n                                                    0x93, 0x67, 0x9c, 0x6a, 0x1f, 0x32, 0x51, 0xf4,\n                                                    0x6, 0x13, 0xb4, 0x93, 0x73, 0x8e, 0x73, 0x74,\n                                                    0x1a, 0x48, 0x6d, 0x51, 0x5a, 0x5b, 0x1e, 0xe,\n                                                    0x7c, 0xc2, 0xf7, 0xe4, 0xc2, 0xf7, 0x16, 0x77,\n                                                    0x1, 0xf7, 0x2a, 0xc1, 0x3, 0xd9, 0xf8, 0xc,\n                                                    0x15, 0xd3, 0xfb, 0x98, 0x6, 0xfb, 0x5, 0xf7,\n                                                    0x0, 0x79, 0xbf, 0xd5, 0xd5, 0xa8, 0xa6, 0xca,\n                                                    0x1e, 0x85, 0xc1, 0x5, 0x77, 0x57, 0x41, 0x68,\n                                                    0x47, 0x1b, 0x3f, 0x62, 0x9d, 0xdd, 0x1f, 0xf7,\n                                                    0x80, 0xf7, 0x8c, 0xc2, 0xfb, 0x8c, 0xf7, 0x16,\n                                                    0x55, 0xfb, 0x16, 0x43, 0x7, 0xe, 0xfb, 0x31,\n                                                    0xc0, 0xf7, 0x16, 0xc1, 0xf7, 0xe1, 0xc1, 0xf7,\n                                                    0x1, 0xc0, 0x1, 0xf6, 0xc3, 0xf7, 0xfb, 0xc5,\n                                                    0x3, 0x9e, 0x23, 0x15, 0x56, 0xf7, 0xc5, 0xc0,\n                                                    0xfb, 0x35, 0xf7, 0x65, 0x7, 0x64, 0xab, 0xc6,\n                                                    0x63, 0xea, 0x1b, 0xf7, 0x14, 0xf2, 0xea, 0xf7,\n                                                    0x15, 0xf7, 0x14, 0xfb, 0x2, 0xe4, 0xfb, 0x8,\n                                                    0x31, 0x4b, 0x67, 0x5e, 0x66, 0x1f, 0xf7, 0x87,\n                                                    0xfb, 0x24, 0x56, 0xe3, 0xfd, 0x3c, 0x7, 0xc6,\n                                                    0xf7, 0xf4, 0x15, 0xe2, 0xd0, 0xd9, 0xf7, 0x4,\n                                                    0xf7, 0x1e, 0xb0, 0xfb, 0x1, 0x54, 0x21, 0x45,\n                                                    0x4c, 0x20, 0x2a, 0x39, 0xcf, 0xef, 0x1e, 0xe,\n                                                    0x7c, 0xbf, 0xf7, 0x7e, 0xc6, 0xf7, 0x7c, 0xc7,\n                                                    0x12, 0xf8, 0x2b, 0xc9, 0x6b, 0xc5, 0x13, 0xe8,\n                                                    0xf3, 0xa6, 0x15, 0x70, 0xbc, 0xcd, 0x7c, 0xca,\n                                                    0x1b, 0xf7, 0x2, 0xf2, 0xbb, 0xf7, 0x11, 0xf7,\n                                                    0x1, 0x33, 0xae, 0x65, 0x91, 0x1f, 0x13, 0xf0,\n                                                    0xb6, 0x9e, 0xc4, 0xc8, 0xd6, 0x1a, 0xf7, 0x3,\n                                                    0x31, 0xbb, 0x32, 0x4d, 0x4a, 0x70, 0x67, 0x5a,\n                                                    0x1e, 0xa8, 0x58, 0x5, 0xae, 0xb4, 0xc0, 0x9e,\n                                                    0xba, 0x1b, 0xcd, 0xc4, 0x74, 0x3d, 0x55, 0x49,\n                                                    0x3e, 0x30, 0x1f, 0x88, 0x50, 0x6, 0x13, 0xe8,\n                                                    0xd2, 0x8a, 0xf7, 0xb, 0x79, 0x2f, 0x1a, 0x35,\n                                                    0x42, 0x66, 0x3a, 0x53, 0x4f, 0x9c, 0xa9, 0x61,\n                                                    0x1e, 0xe, 0x62, 0xc2, 0x5a, 0x76, 0xf7, 0xd,\n                                                    0xc1, 0xf7, 0x47, 0xc2, 0xf7, 0x99, 0xbf, 0x12,\n                                                    0xf7, 0x44, 0xc1, 0x6a, 0xbf, 0xf7, 0x64, 0xbf,\n                                                    0x13, 0xbd, 0xf7, 0xca, 0xcc, 0x15, 0xf7, 0x27,\n                                                    0x58, 0x50, 0x54, 0xf7, 0x34, 0xc2, 0x5a, 0xbe,\n                                                    0xbc, 0xc1, 0x5a, 0xf7, 0x56, 0x4e, 0x6, 0xfb,\n                                                    0x1e, 0xfb, 0x65, 0x5, 0xce, 0x9a, 0x15, 0xdb,\n                                                    0xf7, 0x8, 0x5, 0xfb, 0x8, 0x7, 0xfc, 0x32,\n                                                    0xfb, 0x24, 0x15, 0x13, 0x7b, 0xb6, 0x6c, 0xf8,\n                                                    0x8e, 0xf9, 0x47, 0x60, 0xaa, 0x5, 0xfc, 0xb2,\n                                                    0xfb, 0xe7, 0x15, 0x7c, 0xa8, 0xbb, 0x7d, 0xb3,\n                                                    0x1b, 0xca, 0xc9, 0xb3, 0xce, 0xc0, 0x74, 0x9d,\n                                                    0x6f, 0x99, 0x1f, 0x13, 0xbd, 0xa0, 0x9d, 0x96,\n                                                    0x9f, 0xad, 0x1a, 0xcb, 0x5d, 0xb3, 0x4e, 0x63,\n                                                    0x61, 0x7b, 0x75, 0x6d, 0x1e, 0x9f, 0x57, 0x5,\n                                                    0xa2, 0x9b, 0xb5, 0x9a, 0xae, 0x1b, 0xa7, 0xa3,\n                                                    0x7b, 0x68, 0x69, 0x72, 0x74, 0x47, 0x8d, 0x1f,\n                                                    0x56, 0x7, 0x13, 0xbb, 0xbb, 0xcd, 0x8b, 0x59,\n                                                    0x68, 0x67, 0x7a, 0x63, 0x65, 0x61, 0x94, 0xa0,\n                                                    0x77, 0x1f, 0xe, 0xf7, 0x84, 0xc2, 0xf7, 0xa3,\n                                                    0xc3, 0x12, 0xf7, 0xf3, 0xc3, 0x63, 0xc5, 0x13,\n                                                    0xd0, 0xf7, 0x42, 0xf7, 0xa2, 0x15, 0x7c, 0xaa,\n                                                    0xbd, 0x7c, 0xb4, 0x1b, 0xcc, 0xcb, 0xb3, 0xd2,\n                                                    0xc2, 0x73, 0x9d, 0x6f, 0x99, 0x1f, 0x13, 0xe0,\n                                                    0xa5, 0xa2, 0x93, 0xab, 0xaa, 0x1a, 0xbe, 0x60,\n                                                    0xba, 0x48, 0x60, 0x5e, 0x7a, 0x73, 0x6b, 0x1e,\n                                                    0xa2, 0x5d, 0x5, 0xa0, 0xa4, 0xb4, 0x95, 0xa7,\n                                                    0x1b, 0xaa, 0xa5, 0x7b, 0x67, 0x69, 0x6f, 0x72,\n                                                    0x45, 0x8d, 0x1f, 0x55, 0x7, 0x13, 0xd0, 0xbd,\n                                                    0x8c, 0xcb, 0x88, 0x59, 0x1a, 0x63, 0x67, 0x7b,\n                                                    0x61, 0x66, 0x62, 0x97, 0x9f, 0x75, 0x1e, 0xe,\n                                                    0xf8, 0x7d, 0xbc, 0x9d, 0xbd, 0x1, 0xf0, 0xf8,\n                                                    0x8c, 0x15, 0xbe, 0x80, 0x5, 0x99, 0x8f, 0xa4,\n                                                    0xbc, 0xaf, 0x1b, 0xa9, 0x9d, 0x77, 0x79, 0xa3,\n                                                    0x1f, 0x7c, 0x9f, 0xa2, 0x7d, 0xb1, 0x1b, 0xc9,\n                                                    0xbb, 0xba, 0xc3, 0x9e, 0x1f, 0x59, 0x95, 0x82,\n                                                    0x72, 0x6e, 0x65, 0x62, 0x8a, 0x19, 0x73, 0x7a,\n                                                    0x97, 0x99, 0x7a, 0x1f, 0x9e, 0x74, 0x74, 0xa2,\n                                                    0x63, 0x1b, 0x58, 0x57, 0x66, 0x4a, 0x75, 0x1f,\n                                                    0xe, 0xf7, 0xb0, 0x76, 0xf7, 0x93, 0xb7, 0x1,\n                                                    0xf7, 0x10, 0xb8, 0xf7, 0x3, 0xb7, 0xf7, 0x4a,\n                                                    0xb7, 0x3, 0xf7, 0xac, 0xf7, 0x9b, 0x15, 0xb7,\n                                                    0xf7, 0x98, 0x6, 0xcb, 0xfb, 0x98, 0x5, 0xc4,\n                                                    0x6, 0xc8, 0xf7, 0x97, 0x5, 0xfb, 0x97, 0xb7,\n                                                    0xf7, 0xbf, 0x39, 0x7, 0x56, 0xfb, 0x7c, 0x55,\n                                                    0xf7, 0x7c, 0x5, 0x3a, 0x6, 0xfb, 0x30, 0xfb,\n                                                    0xbf, 0x15, 0xb8, 0xf7, 0x93, 0xd7, 0xb7, 0xfb,\n                                                    0x58, 0x5f, 0xd6, 0x6, 0xe, 0x8b, 0xc2, 0xf8,\n                                                    0x1f, 0x77, 0xf7, 0x1a, 0xc5, 0x1, 0xf8, 0x4c,\n                                                    0xc7, 0x3, 0xee, 0x16, 0xf8, 0x25, 0xf7, 0x24,\n                                                    0x51, 0x32, 0xfb, 0x9d, 0x6, 0xf7, 0x6d, 0xf7,\n                                                    0x44, 0xf5, 0xde, 0xf7, 0x4, 0x1a, 0xf7, 0x17,\n                                                    0x3b, 0xcc, 0xfb, 0x1, 0x37, 0x4b, 0x66, 0x3f,\n                                                    0x61, 0x1e, 0x50, 0xc1, 0x7, 0xd2, 0xc4, 0xb6,\n                                                    0xd9, 0xdd, 0xbb, 0x5d, 0x2f, 0x3f, 0x2f, 0x3f,\n                                                    0x6e, 0x72, 0x1e, 0x42, 0x4c, 0x41, 0x46, 0x42,\n                                                    0x4d, 0x8, 0xe, 0xf7, 0x8d, 0xc2, 0xf7, 0x9c,\n                                                    0xc1, 0x1, 0xf7, 0x53, 0xbf, 0xf7, 0x14, 0xbf,\n                                                    0x3, 0xf7, 0x44, 0xf7, 0x8d, 0x15, 0xf7, 0x8b,\n                                                    0xc2, 0xfb, 0x38, 0x6, 0xf7, 0x9, 0xe8, 0xba,\n                                                    0xb3, 0xd3, 0x1a, 0xc5, 0x64, 0xc2, 0x3b, 0x60,\n                                                    0x5c, 0x80, 0x4a, 0x74, 0x1e, 0x55, 0xbf, 0x7,\n                                                    0xc3, 0x83, 0xb0, 0x9f, 0xab, 0x1b, 0xb5, 0xa4,\n                                                    0x6b, 0x68, 0x55, 0xfb, 0x1f, 0x26, 0x53, 0x5e,\n                                                    0x1f, 0xe, 0x7c, 0xc0, 0x62, 0xc1, 0xf7, 0xd5,\n                                                    0xc1, 0x12, 0xf7, 0x4, 0xc0, 0xf7, 0xa2, 0xc0,\n                                                    0x13, 0xb8, 0xa8, 0xf8, 0x8, 0x15, 0xde, 0xfb,\n                                                    0x8b, 0x6, 0x31, 0xcf, 0x59, 0xe3, 0xb2, 0xbf,\n                                                    0x9b, 0xd3, 0xd7, 0x1e, 0x13, 0x78, 0x3f, 0xf7,\n                                                    0x1b, 0xc1, 0x39, 0xf8, 0xb, 0xfb, 0x1c, 0x55,\n                                                    0xde, 0xfb, 0x71, 0x7, 0x13, 0xb8, 0x5a, 0x62,\n                                                    0x54, 0x4b, 0x4f, 0x1b, 0x42, 0x62, 0xb5, 0xd3,\n                                                    0x1f, 0xf7, 0xa6, 0xfb, 0x1c, 0x7, 0xe, 0x3f,\n                                                    0xa, 0xf7, 0x41, 0xf8, 0x82, 0x15, 0xf7, 0xb3,\n                                                    0xf3, 0x6a, 0xd5, 0xfb, 0x9e, 0xfb, 0x26, 0x5,\n                                                    0xfb, 0x18, 0xfb, 0x25, 0x2b, 0xa, 0x3f, 0xa,\n                                                    0xf7, 0x0, 0xf8, 0x8f, 0x15, 0xb3, 0x79, 0xf7,\n                                                    0x27, 0xf7, 0xb, 0xf7, 0x26, 0xfb, 0xb, 0xb4,\n                                                    0x9d, 0xfb, 0x27, 0xf7, 0x31, 0x5, 0x3c, 0x6,\n                                                    0xfb, 0x77, 0xfb, 0xaf, 0x2b, 0xa, 0x7c, 0xc1,\n                                                    0x61, 0x67, 0xa, 0xe7, 0xf7, 0x9, 0x12, 0xf7,\n                                                    0x4, 0xc0, 0x94, 0xe0, 0xca, 0xdc, 0xaa, 0xc0,\n                                                    0x13, 0xbf, 0xf7, 0xd6, 0xf8, 0xa4, 0x72, 0xa,\n                                                    0xfb, 0x28, 0xfb, 0x9, 0x15, 0xe0, 0xf7, 0x9,\n                                                    0x36, 0x6, 0xfb, 0x25, 0xfb, 0x9c, 0x38, 0xa,\n                                                    0x13, 0x7f, 0x3b, 0xa, 0x13, 0xbf, 0x33, 0xa,\n                                                    0x3f, 0xa, 0xf7, 0x2c, 0xf8, 0xe8, 0x15, 0xf7,\n                                                    0xb3, 0x24, 0x96, 0xaa, 0xfb, 0x9c, 0xf7, 0x28,\n                                                    0x5, 0xfb, 0x31, 0xfb, 0xb7, 0x2b, 0xa, 0xfb,\n                                                    0x11, 0xbd, 0x1, 0x8b, 0xf8, 0xec, 0x3, 0x40,\n                                                    0x4, 0x59, 0xf8, 0xec, 0xbd, 0x7, 0xe, 0x96,\n                                                    0x76, 0xf8, 0x11, 0xc2, 0x1, 0x9a, 0xf7, 0x68,\n                                                    0xf7, 0x25, 0xf7, 0x69, 0x3, 0xf7, 0x9e, 0x81,\n                                                    0x15, 0xcc, 0x6, 0xf7, 0x45, 0xf8, 0x11, 0x5,\n                                                    0xd8, 0xc2, 0xfb, 0x69, 0x54, 0xd5, 0x6, 0xfb,\n                                                    0x27, 0xfb, 0xd1, 0xfb, 0x28, 0xf7, 0xd1, 0x5,\n                                                    0xd7, 0xc2, 0xfb, 0x68, 0x54, 0xd4, 0x6, 0xe,\n                                                    0x96, 0x76, 0xf8, 0x11, 0xc2, 0x1, 0x98, 0xf7,\n                                                    0x39, 0xf7, 0x8c, 0xf7, 0x34, 0x3, 0xf7, 0x31,\n                                                    0x81, 0x15, 0xca, 0x6, 0xdc, 0xf7, 0x9b, 0xdb,\n                                                    0xfb, 0x9b, 0x5, 0xc9, 0x6, 0xf6, 0xf8, 0x11,\n                                                    0x5, 0xaf, 0xc2, 0xfb, 0x34, 0x54, 0xce, 0x6,\n                                                    0x39, 0xfb, 0xc4, 0x34, 0xf7, 0xb0, 0x5, 0x5c,\n                                                    0x6, 0x35, 0xfb, 0xae, 0x33, 0xf7, 0xc2, 0x5,\n                                                    0xd6, 0xc2, 0xfb, 0x39, 0x54, 0xad, 0x6, 0xe,\n                                                    0x74, 0xa, 0xb0, 0xf7, 0x5b, 0xf7, 0x18, 0xf7,\n                                                    0x50, 0x3, 0x9f, 0x16, 0xf7, 0x6d, 0xc1, 0x43,\n                                                    0x6, 0xf7, 0x1a, 0xf7, 0x1b, 0xf7, 0x1a, 0xfb,\n                                                    0x1b, 0x5, 0x43, 0x55, 0xf7, 0x6f, 0xc1, 0x3f,\n                                                    0x6, 0xfb, 0x40, 0xf7, 0x3e, 0xf7, 0x28, 0xf7,\n                                                    0x28, 0x5, 0xd7, 0xc1, 0xfb, 0x50, 0x55, 0xb6,\n                                                    0x6, 0xfb, 0x5, 0xfb, 0x5, 0xfb, 0x4, 0xf7,\n                                                    0x5, 0x5, 0xbd, 0xc1, 0xfb, 0x5b, 0x55, 0xdb,\n                                                    0x6, 0xf7, 0x28, 0xfb, 0x27, 0xfb, 0x40, 0xfb,\n                                                    0x3f, 0x5, 0x42, 0x6, 0xe, 0xfb, 0x31, 0xbe,\n                                                    0xf8, 0x75, 0xbe, 0x6a, 0xa, 0x13, 0xe8, 0x13,\n                                                    0xd8, 0xc0, 0x21, 0x15, 0x58, 0xf7, 0x9a, 0xbe,\n                                                    0x32, 0x7, 0xf7, 0xc1, 0xf8, 0x75, 0x5, 0xcc,\n                                                    0xbe, 0xfb, 0x4b, 0x58, 0xc4, 0x6, 0xfb, 0x3d,\n                                                    0xfb, 0xa1, 0xfb, 0x34, 0xf7, 0xa1, 0x5, 0xcd,\n                                                    0xbe, 0xfb, 0x58, 0x58, 0xd0, 0x6, 0xf7, 0x53,\n                                                    0xfb, 0xd3, 0x25, 0xfb, 0x36, 0x5, 0xe, 0xfb,\n                                                    0x31, 0xc0, 0xf8, 0x87, 0xc0, 0x6a, 0xa, 0x13,\n                                                    0xd8, 0xf7, 0x3e, 0xf8, 0x89, 0x15, 0xf7, 0xbc,\n                                                    0xee, 0x69, 0xd3, 0xfb, 0xa6, 0xfb, 0x21, 0x5,\n                                                    0x22, 0xfd, 0xf, 0x15, 0x56, 0xf7, 0x9a, 0xc0,\n                                                    0x32, 0x7, 0xf7, 0xc1, 0xf8, 0x87, 0x5, 0xcc,\n                                                    0xc0, 0xfb, 0x4b, 0x56, 0xc4, 0x6, 0xfb, 0x3c,\n                                                    0xfb, 0xab, 0xfb, 0x35, 0xf7, 0xab, 0x5, 0x13,\n                                                    0xe8, 0xcd, 0xc0, 0xfb, 0x58, 0x56, 0xd0, 0x6,\n                                                    0xf7, 0x54, 0xfb, 0xe0, 0x24, 0xfb, 0x3b, 0x5,\n                                                    0xe, 0xfb, 0x31, 0xbd, 0xf8, 0x66, 0xbc, 0xd6,\n                                                    0xf7, 0x4, 0x12, 0x92, 0xf7, 0x58, 0x6b, 0xe2,\n                                                    0xce, 0xe0, 0x8a, 0xf7, 0x4b, 0x13, 0xec, 0xf7,\n                                                    0xd9, 0xf8, 0x77, 0x15, 0xe0, 0xf7, 0x4, 0x36,\n                                                    0x80, 0xa, 0x15, 0xe2, 0xf7, 0x4, 0x34, 0x6,\n                                                    0x13, 0xd2, 0xfb, 0xa, 0xfd, 0x52, 0x15, 0x59,\n                                                    0xf7, 0x9a, 0xbd, 0x32, 0x7, 0xf7, 0xc1, 0xf8,\n                                                    0x66, 0x5, 0xcc, 0xbc, 0xfb, 0x4b, 0x5a, 0xc4,\n                                                    0x6, 0xfb, 0x3c, 0xfb, 0x99, 0xfb, 0x35, 0xf7,\n                                                    0x99, 0x5, 0xcd, 0xbc, 0xfb, 0x58, 0x5a, 0xd0,\n                                                    0x6, 0xf7, 0x54, 0xfb, 0xc9, 0x24, 0xfb, 0x31,\n                                                    0x5, 0xe, 0x8b, 0xc1, 0xd8, 0xc1, 0xd1, 0xc2,\n                                                    0xf7, 0x5a, 0xc1, 0x1, 0xa5, 0xf7, 0x60, 0xb9,\n                                                    0xc1, 0xb4, 0xf7, 0x5f, 0x3, 0xf7, 0x3c, 0x16,\n                                                    0xf7, 0xa1, 0xc1, 0x20, 0xd8, 0xf7, 0x15, 0xc1,\n                                                    0xfb, 0x15, 0xd1, 0xf7, 0x15, 0xc2, 0xfb, 0xd,\n                                                    0x6, 0xf7, 0x47, 0xf7, 0x5a, 0x5, 0xc4, 0xc1,\n                                                    0xfb, 0x5f, 0x55, 0xce, 0x6, 0xfb, 0x1d, 0xfb,\n                                                    0x2b, 0xfb, 0x1d, 0xf7, 0x2b, 0x5, 0xcd, 0xc1,\n                                                    0xfb, 0x60, 0x55, 0xca, 0x6, 0xf7, 0x43, 0xfb,\n                                                    0x5a, 0x5, 0xfb, 0x9, 0x54, 0xf7, 0x15, 0x45,\n                                                    0xfb, 0x15, 0x55, 0xf7, 0x15, 0x3e, 0xfb, 0x0,\n                                                    0x6, 0xe, 0x74, 0xa, 0xf7, 0x4, 0xc1, 0xf7,\n                                                    0xad, 0xc1, 0x3, 0xed, 0x16, 0xf8, 0x27, 0xf7,\n                                                    0x2e, 0x55, 0x27, 0xfb, 0xa3, 0x6, 0xf7, 0xd9,\n                                                    0xf7, 0xd6, 0x5, 0xbd, 0xfc, 0x19, 0xfb, 0x2b,\n                                                    0xc1, 0xec, 0xf7, 0x94, 0x7, 0xfb, 0xd8, 0xfb,\n                                                    0xd5, 0x5, 0xe, 0x8b, 0x67, 0xa, 0xbf, 0xc4,\n                                                    0x1, 0xf7, 0x3, 0xc1, 0xf7, 0xad, 0xc2, 0x3,\n                                                    0xf7, 0x9e, 0xf8, 0x7f, 0x15, 0xda, 0x6, 0xf7,\n                                                    0x27, 0xf7, 0x32, 0x62, 0x9f, 0xfb, 0x26, 0xfb,\n                                                    0xd, 0xfb, 0x28, 0xf7, 0xc, 0x62, 0x77, 0x5,\n                                                    0x79, 0xfd, 0x1c, 0x15, 0xf8, 0x27, 0xf7, 0x31,\n                                                    0x54, 0x25, 0xfb, 0xa3, 0x6, 0xf7, 0xda, 0xf7,\n                                                    0xdd, 0x5, 0xc2, 0xfc, 0x1a, 0xfb, 0x32, 0xc1,\n                                                    0x7, 0x8c, 0xf2, 0x5, 0xf7, 0x98, 0x6, 0xfb,\n                                                    0xdc, 0xfb, 0xe0, 0x5, 0xe, 0x7d, 0xc1, 0xf8,\n                                                    0xa3, 0xc2, 0x1, 0xf5, 0xc4, 0xf7, 0xa5, 0xc5,\n                                                    0x3, 0xf5, 0xf7, 0xc4, 0x15, 0xfb, 0x29, 0xa2,\n                                                    0xfb, 0x3d, 0xf7, 0x40, 0xf7, 0x45, 0x9b, 0xf7,\n                                                    0x40, 0xf7, 0x26, 0xf7, 0x1b, 0x78, 0xf7, 0x4b,\n                                                    0xfb, 0x41, 0xfb, 0x41, 0x74, 0xfb, 0x49, 0xfb,\n                                                    0x1d, 0x1e, 0xc4, 0x16, 0xf7, 0xf, 0x9e, 0xf7,\n                                                    0x20, 0xf7, 0xc, 0xf7, 0x3, 0xa2, 0xfb, 0x1f,\n                                                    0xfb, 0x10, 0xfb, 0x17, 0x78, 0xfb, 0x19, 0xfb,\n                                                    0xa, 0xfb, 0x6, 0x75, 0xf7, 0x17, 0xf7, 0x19,\n                                                    0x1e, 0xe, 0x79, 0x9d, 0xf8, 0x3e, 0x9a, 0xf7,\n                                                    0xd, 0x9d, 0xa9, 0x97, 0x6, 0xfb, 0x31, 0x8b,\n                                                    0x7, 0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9,\n                                                    0xc2, 0xa, 0xc2, 0xb, 0xf8, 0xec, 0x14, 0xaa,\n                                                    0x13, 0x0, 0x63, 0x2, 0x0, 0x1, 0x0, 0x3d,\n                                                    0x0, 0x70, 0x0, 0xae, 0x0, 0xb8, 0x0, 0xbd,\n                                                    0x0, 0xc2, 0x0, 0xc8, 0x0, 0xe5, 0x0, 0xff,\n                                                    0x1, 0x18, 0x1, 0x2e, 0x1, 0x38, 0x1, 0x42,\n                                                    0x1, 0x55, 0x1, 0x71, 0x1, 0x76, 0x1, 0x80,\n                                                    0x1, 0x9a, 0x1, 0xa9, 0x1, 0xba, 0x1, 0xc6,\n                                                    0x1, 0xd8, 0x2, 0x7, 0x2, 0x1c, 0x2, 0x2c,\n                                                    0x2, 0x33, 0x2, 0x5a, 0x2, 0x69, 0x2, 0x73,\n                                                    0x2, 0x7d, 0x2, 0x88, 0x2, 0x97, 0x2, 0xa3,\n                                                    0x2, 0xae, 0x2, 0xb7, 0x2, 0xcf, 0x2, 0xe7,\n                                                    0x2, 0xfd, 0x3, 0x4, 0x3, 0xe, 0x3, 0x24,\n                                                    0x3, 0x3a, 0x3, 0x4e, 0x3, 0x63, 0x3, 0x76,\n                                                    0x3, 0x7f, 0x3, 0x88, 0x3, 0x91, 0x3, 0xa5,\n                                                    0x3, 0xb7, 0x3, 0xc9, 0x3, 0xdb, 0x3, 0xe3,\n                                                    0x3, 0xeb, 0x3, 0xf3, 0x3, 0xfb, 0x4, 0x3,\n                                                    0x4, 0xe, 0x4, 0x13, 0x4, 0x1e, 0x4, 0x24,\n                                                    0x4, 0x31, 0x4, 0x38, 0x4, 0x41, 0x4, 0x4a,\n                                                    0x4, 0x53, 0x4, 0x5a, 0x4, 0x60, 0x4, 0x66,\n                                                    0x4, 0x74, 0x4, 0x81, 0x4, 0x86, 0x4, 0x8a,\n                                                    0x4, 0x96, 0x4, 0xa2, 0x4, 0xa8, 0x4, 0xae,\n                                                    0x4, 0xb9, 0x4, 0xc4, 0x4, 0xce, 0x4, 0xd9,\n                                                    0x4, 0xe4, 0x4, 0xeb, 0x4, 0xf2, 0x4, 0xf9,\n                                                    0x5, 0x0, 0x5, 0x7, 0x5, 0x11, 0x5, 0x1b,\n                                                    0x5, 0x24, 0x5, 0x2d, 0x5, 0x36, 0x5, 0x3f,\n                                                    0x5, 0x48, 0x5, 0x51, 0x5, 0x58, 0x5, 0x5e,\n                                                    0x5, 0x64, 0x5, 0x69, 0x15, 0xfb, 0x37, 0xf3,\n                                                    0xfb, 0x1a, 0xf7, 0x30, 0xf7, 0x34, 0xe9, 0xf7,\n                                                    0x1a, 0xf7, 0x37, 0xe9, 0x5a, 0xf7, 0x5f, 0xfb,\n                                                    0x60, 0xfb, 0x43, 0x35, 0xfb, 0x31, 0xfb, 0x20,\n                                                    0x1e, 0xc1, 0x89, 0x15, 0xe4, 0xc1, 0xf7, 0x31,\n                                                    0xf7, 0x2b, 0xf7, 0x2c, 0xba, 0xfb, 0x3d, 0x3e,\n                                                    0xfb, 0x13, 0x47, 0xfb, 0x7, 0xfb, 0x15, 0xfb,\n                                                    0x15, 0x3d, 0xf7, 0x7, 0xf7, 0x13, 0x1e, 0xb,\n                                                    0x15, 0xfb, 0x1b, 0xe2, 0x2b, 0xf7, 0x2a, 0xf7,\n                                                    0x25, 0xe9, 0xed, 0xf7, 0x19, 0xf7, 0x20, 0x2f,\n                                                    0xe7, 0xfb, 0x25, 0xfb, 0x1b, 0x23, 0x33, 0xfb,\n                                                    0x24, 0x1e, 0xc5, 0x8a, 0x15, 0xe9, 0xc9, 0xdd,\n                                                    0xf7, 0xb, 0xf7, 0xe, 0xc2, 0x38, 0x2e, 0x39,\n                                                    0x4b, 0x2f, 0xfb, 0x8, 0xfb, 0xa, 0x4f, 0xe7,\n                                                    0xdd, 0x1e, 0xe, 0x15, 0xf8, 0x36, 0x6, 0xf7,\n                                                    0x14, 0x45, 0xf7, 0xe, 0xfb, 0x3b, 0xfb, 0x1c,\n                                                    0x24, 0x24, 0xfb, 0x1f, 0xfb, 0xc, 0xd1, 0x25,\n                                                    0xf7, 0x47, 0xdd, 0xe0, 0xa6, 0xb0, 0xcd, 0x1e,\n                                                    0x7a, 0xc0, 0x5, 0x5f, 0x3b, 0x3c, 0x79, 0x5b,\n                                                    0x1b, 0x2a, 0x24, 0xb8, 0xf7, 0x6, 0x1f, 0x8d,\n                                                    0xc3, 0x15, 0xc7, 0x93, 0xc2, 0xd9, 0xf7, 0x8,\n                                                    0x1b, 0xf7, 0x19, 0xa9, 0x2e, 0x5e, 0x96, 0x1f,\n                                                    0xe, 0x26, 0xa, 0x13, 0x7c, 0x29, 0xa, 0x13,\n                                                    0xbc, 0x2a, 0xa, 0x25, 0xa, 0x3c, 0xa, 0xb,\n                                                    0x2d, 0xa, 0x27, 0xa, 0xb, 0x28, 0xa, 0x3d,\n                                                    0xa, 0x1f, 0xb, 0xf7, 0x60, 0xc1, 0x57, 0x6,\n                                                    0xfb, 0x60, 0xf8, 0x93, 0x5, 0xfb, 0x82, 0x55,\n                                                    0xf7, 0x20, 0x6, 0xfb, 0x48, 0xfc, 0x5d, 0x5,\n                                                    0x4f, 0x6, 0xf7, 0x4e, 0xf7, 0x45, 0x15, 0xb,\n                                                    0x15, 0x9a, 0xab, 0xe0, 0xa7, 0xd1, 0x1b, 0xd7,\n                                                    0xc3, 0x8b, 0x21, 0x1f, 0x6b, 0x7, 0x92, 0x5e,\n                                                    0x59, 0x92, 0x59, 0x1b, 0xfb, 0x3c, 0x55, 0x33,\n                                                    0x50, 0xb, 0x36, 0xf7, 0x1e, 0xc3, 0x38, 0xf7,\n                                                    0x88, 0x7, 0xeb, 0x59, 0xc3, 0xfb, 0x14, 0x45,\n                                                    0x3a, 0x77, 0x73, 0x4f, 0x1e, 0xf7, 0xe1, 0xfb,\n                                                    0x94, 0x15, 0xb, 0x4e, 0x58, 0x46, 0x5c, 0x38,\n                                                    0x1b, 0x4c, 0x60, 0xb4, 0xb2, 0xe1, 0xf7, 0x6,\n                                                    0x91, 0xcb, 0xb8, 0xb6, 0x85, 0x83, 0xb6, 0x1f,\n                                                    0xe, 0x38, 0xa, 0x13, 0x78, 0x3b, 0xa, 0x13,\n                                                    0xb8, 0x33, 0xa, 0x26, 0xa, 0x13, 0x7f, 0x29,\n                                                    0xa, 0x13, 0xbf, 0x2a, 0xa, 0xf7, 0x63, 0xc1,\n                                                    0x32, 0x6, 0xb9, 0xf7, 0xf, 0x5, 0xf7, 0xa6,\n                                                    0x6, 0xba, 0xfb, 0xf, 0x5, 0x2c, 0x55, 0xb,\n                                                    0xf7, 0x38, 0x39, 0xc4, 0xf7, 0x6f, 0x52, 0x38,\n                                                    0xfb, 0x38, 0xf7, 0x5e, 0xf7, 0xc2, 0xfb, 0x1b,\n                                                    0xc4, 0xf7, 0x51, 0xfc, 0x85, 0x55, 0xde, 0xfc,\n                                                    0x5d, 0x38, 0x6, 0xb, 0x40, 0xa, 0x2e, 0xa,\n                                                    0xb, 0xf7, 0x19, 0x31, 0xa, 0xb7, 0xf7, 0x14,\n                                                    0x4f, 0xa, 0xb, 0xf7, 0x11, 0xd9, 0xd6, 0xf7,\n                                                    0x27, 0x1e, 0xf7, 0xc4, 0xd8, 0xc2, 0xfb, 0x7c,\n                                                    0x54, 0xf2, 0xfb, 0xc3, 0x7, 0xfb, 0xe, 0x42,\n                                                    0x5d, 0x3c, 0x31, 0x4b, 0xb, 0xf8, 0x2c, 0xc1,\n                                                    0xfb, 0x43, 0xf8, 0x5c, 0x42, 0xa, 0xfc, 0x5c,\n                                                    0xfb, 0x43, 0x6, 0xb, 0x58, 0x63, 0x57, 0x54,\n                                                    0x4b, 0x1b, 0x42, 0x63, 0xb6, 0xd5, 0x1f, 0xf7,\n                                                    0xac, 0xfb, 0x1c, 0x7, 0xe, 0x15, 0xda, 0xfb,\n                                                    0xc1, 0x6, 0xfb, 0x1a, 0xd5, 0x30, 0x30, 0xa,\n                                                    0xb, 0xf8, 0x2e, 0xc2, 0xfb, 0x43, 0xf8, 0x12,\n                                                    0xfb, 0x5c, 0x54, 0xf7, 0x24, 0xfb, 0xdb, 0xfb,\n                                                    0x47, 0x6, 0xb, 0xf7, 0xc8, 0xc1, 0xfb, 0x11,\n                                                    0xf7, 0x43, 0x6, 0xf7, 0x45, 0xf7, 0xae, 0x5,\n                                                    0xd0, 0xc1, 0xfb, 0x5c, 0x55, 0xd1, 0x6, 0xfb,\n                                                    0x25, 0xfb, 0x78, 0xfb, 0x27, 0xf7, 0x78, 0x5,\n                                                    0xd2, 0xc1, 0xfb, 0x5d, 0x55, 0xcf, 0x6, 0xf7,\n                                                    0x49, 0xfb, 0xae, 0x5, 0xfb, 0x43, 0xfb, 0x12,\n                                                    0x7, 0xb, 0x15, 0xdd, 0x6, 0xf7, 0x2a, 0xf7,\n                                                    0x34, 0x60, 0x9d, 0xfb, 0x27, 0xfb, 0xd, 0xfb,\n                                                    0x2c, 0xf7, 0xd, 0x62, 0x78, 0x5, 0xe, 0x15,\n                                                    0xde, 0xfb, 0x90, 0x6, 0x2e, 0xcf, 0x58, 0xe2,\n                                                    0xb3, 0xbe, 0x9b, 0xd5, 0xd7, 0x1e, 0xb, 0x27,\n                                                    0xa, 0x13, 0x40, 0x3c, 0xa, 0xb, 0x15, 0x48,\n                                                    0xbd, 0x51, 0xd9, 0xd4, 0xc1, 0xc4, 0xd0, 0xcc,\n                                                    0x62, 0xc6, 0x33, 0x3e, 0x5a, 0x4f, 0x4a, 0x1e,\n                                                    0xc3, 0x8a, 0x15, 0xb5, 0xa6, 0xa9, 0xb9, 0xb8,\n                                                    0xa6, 0x6a, 0x65, 0x68, 0x71, 0x68, 0x5d, 0x61,\n                                                    0x6c, 0xa5, 0xb6, 0x1e, 0xb, 0x3d, 0xf7, 0x1c,\n                                                    0xc2, 0x38, 0xf8, 0x14, 0xfb, 0x1c, 0x54, 0xde,\n                                                    0xfb, 0x80, 0x7, 0xb, 0xf7, 0x3, 0xf7, 0xbb,\n                                                    0xf7, 0xb, 0xfb, 0xbb, 0x5, 0xb, 0x49, 0xc5,\n                                                    0x44, 0xf4, 0xd9, 0xd2, 0xb7, 0xc0, 0xc3, 0xb,\n                                                    0x41, 0xa, 0x12, 0xba, 0xc5, 0xf7, 0xc9, 0xc3,\n                                                    0x13, 0xbc, 0xb, 0x7c, 0xc1, 0x61, 0x67, 0xa,\n                                                    0x12, 0xf7, 0x4, 0xc0, 0xf7, 0xa1, 0xc0, 0x13,\n                                                    0xb8, 0xb, 0xf8, 0x85, 0xf7, 0x51, 0x53, 0xfb,\n                                                    0x1b, 0xfb, 0xc3, 0xf7, 0x5d, 0xb, 0x7c, 0xc3,\n                                                    0x5f, 0xc3, 0xf7, 0x34, 0xc3, 0xf7, 0x10, 0xc3,\n                                                    0xb, 0xf7, 0x3e, 0xc1, 0xfc, 0x24, 0x55, 0xf7,\n                                                    0x40, 0xb, 0xd1, 0xee, 0xcf, 0xc8, 0x67, 0x5b,\n                                                    0xb7, 0x1f, 0x40, 0xc2, 0xf7, 0x6a, 0x54, 0x49,\n                                                    0x7, 0xae, 0x65, 0x4f, 0xaa, 0x40, 0x1b, 0xfb,\n                                                    0x37, 0xb, 0x3c, 0x1b, 0xfb, 0x2a, 0x3d, 0x22,\n                                                    0x32, 0x30, 0xd3, 0x28, 0xf7, 0x2f, 0xcc, 0xd5,\n                                                    0xa1, 0xba, 0xb3, 0x1f, 0xfb, 0x9, 0x7, 0x33,\n                                                    0x51, 0xb, 0x15, 0xc3, 0x6, 0xef, 0xf7, 0x7e,\n                                                    0x5, 0x31, 0x6, 0xe7, 0xfb, 0x7e, 0x15, 0xc6,\n                                                    0x6, 0xec, 0xf7, 0x7e, 0x5, 0x32, 0x6, 0xe,\n                                                    0x8b, 0xc2, 0xf8, 0x58, 0xc2, 0x1, 0xb, 0x4e,\n                                                    0xa, 0xf7, 0x78, 0x77, 0x1, 0x61, 0xa, 0x3,\n                                                    0xb, 0x15, 0xf7, 0x9f, 0xc0, 0x21, 0xf7, 0xd5,\n                                                    0xf5, 0xc0, 0x21, 0xcd, 0x6, 0xdb, 0xce, 0x9e,\n                                                    0xde, 0x74, 0x1e, 0x94, 0xbe, 0x5, 0xb, 0x15,\n                                                    0xf7, 0x27, 0xe9, 0xf7, 0x24, 0x2d, 0xb4, 0x9c,\n                                                    0xfb, 0x26, 0xf7, 0x19, 0x5, 0x3b, 0x6, 0xfb,\n                                                    0x27, 0xfb, 0x19, 0x5, 0xb, 0x92, 0x72, 0x71,\n                                                    0x8f, 0x74, 0x1b, 0x3c, 0x4e, 0x62, 0x30, 0x1f,\n                                                    0x43, 0x21, 0x56, 0xf5, 0xfb, 0xd5, 0x21, 0x7,\n                                                    0xe, 0x53, 0x8c, 0x15, 0x46, 0xc4, 0x52, 0xd0,\n                                                    0xd0, 0xc5, 0xc4, 0xd0, 0xd0, 0x51, 0xc5, 0x46,\n                                                    0x46, 0x52, 0x51, 0x46, 0x1e, 0xb, 0x15, 0x6d,\n                                                    0xa6, 0x6e, 0xb5, 0xab, 0xab, 0xa3, 0xad, 0xaa,\n                                                    0x72, 0xa9, 0x63, 0x65, 0x6d, 0x70, 0x6a, 0x1e,\n                                                    0xe, 0x8b, 0xc1, 0xf7, 0xf, 0xc1, 0xf7, 0xac,\n                                                    0xc1, 0xb, 0x8b, 0xc1, 0xf7, 0x5d, 0xc1, 0xf7,\n                                                    0x5e, 0xc1, 0xb, 0x1e, 0xf7, 0xbf, 0xf5, 0xc2,\n                                                    0xfb, 0x81, 0x7, 0xb, 0x5, 0x80, 0xbf, 0xe8,\n                                                    0x7a, 0xdd, 0x1b, 0xf7, 0xe, 0xd8, 0xc0, 0xf0,\n                                                    0x1f, 0xf8, 0x11, 0xc9, 0xbe, 0xfb, 0x7, 0xb,\n                                                    0x6e, 0xa2, 0x74, 0xa8, 0xa8, 0xa2, 0xa2, 0xa8,\n                                                    0xa8, 0x74, 0xa2, 0x6e, 0x6e, 0x74, 0x74, 0x6e,\n                                                    0x1e, 0xb, 0x64, 0xab, 0x75, 0xb2, 0xb2, 0xab,\n                                                    0xa1, 0xb2, 0xb2, 0x6b, 0xa1, 0x64, 0x64, 0x6b,\n                                                    0x75, 0x64, 0x1e, 0xb, 0xfb, 0x31, 0xf7, 0x60,\n                                                    0xd4, 0xd4, 0xa0, 0xa5, 0xca, 0x1f, 0xf7, 0x41,\n                                                    0xbd, 0xc2, 0xfb, 0x9f, 0x7, 0xb, 0x8e, 0xf7,\n                                                    0x63, 0xf7, 0x4b, 0xf7, 0x60, 0xb, 0x1, 0xeb,\n                                                    0xbf, 0xf7, 0xc6, 0xbf, 0x3, 0xb, 0x1, 0xc6,\n                                                    0xc5, 0xf7, 0xf7, 0xca, 0x3, 0xb, 0x1, 0xb6,\n                                                    0xc1, 0xf8, 0x28, 0xc3, 0x3, 0xb, 0x1, 0xc9,\n                                                    0xc5, 0xf7, 0xfa, 0xc7, 0x3, 0xb, 0x15, 0xe0,\n                                                    0xf7, 0x7, 0x36, 0x6, 0xfb, 0x2b, 0x60, 0xa,\n                                                    0xb, 0x5e, 0xa, 0x56, 0xa, 0xb, 0x55, 0xa,\n                                                    0x9c, 0xf8, 0x90, 0x15, 0xda, 0xfb, 0xc1, 0x6,\n                                                    0xb, 0xf7, 0x7e, 0x5, 0x2f, 0x6, 0xe, 0x6,\n                                                    0xf7, 0x30, 0xf7, 0xf, 0x6f, 0xb0, 0xfb, 0x79,\n                                                    0xfb, 0x4d, 0x5, 0xe, 0x7c, 0x82, 0xa, 0xf7,\n                                                    0x1e, 0xc3, 0xb, 0xf7, 0x7e, 0x1, 0xf7, 0x6e,\n                                                    0xf7, 0x37, 0x3, 0xb, 0xfb, 0x7, 0x15, 0xe2,\n                                                    0xf7, 0x7, 0x34, 0x6, 0xb, 0xf7, 0x1a, 0xc2,\n                                                    0xf7, 0x38, 0xc4, 0xdd, 0xc3, 0xb, 0x15, 0xde,\n                                                    0xf7, 0x9, 0x38, 0x6, 0xb, 0x7c, 0xc3, 0xf7,\n                                                    0xf2, 0xc4, 0xb, 0x79, 0xc0, 0xf8, 0x7c, 0xc0,\n                                                    0xb, 0x15, 0xb2, 0xab, 0xab, 0xb2, 0xb2, 0xab,\n                                                    0x6b, 0x64, 0x64, 0x6b, 0x6b, 0x64, 0xb, 0xfb,\n                                                    0x31, 0xbe, 0xf7, 0x12, 0xbc, 0xf7, 0xc9, 0xbe,\n                                                    0x5c, 0xbf, 0x12, 0xb, 0xc2, 0xf7, 0xdd, 0xc2,\n                                                    0xb, 0x1, 0xf7, 0xa6, 0xb, 0x32, 0x58, 0x3a,\n                                                    0x3e, 0x50, 0x29, 0x27, 0x40, 0xc9, 0xd7, 0x1e,\n                                                    0xb, 0x12, 0x92, 0xf7, 0x58, 0xfb, 0x2a, 0xf7,\n                                                    0x9a, 0xe9, 0xf7, 0x4b, 0xb, 0x79, 0xc2, 0xf8,\n                                                    0x6b, 0xc2, 0xb, 0x8b, 0xc1, 0xf8, 0x5c, 0xc1,\n                                                    0xb, 0xf7, 0x7e, 0x1, 0xf7, 0x23, 0xf7, 0xce,\n                                                    0x3, 0xf7, 0x23, 0xb, 0xf8, 0x85, 0xf7, 0x43,\n                                                    0x1, 0xf7, 0x4e, 0xf7, 0x77, 0x3, 0xb, 0x8b,\n                                                    0xc2, 0xf7, 0xdb, 0xc2, 0x68, 0xa, 0xc3, 0x3,\n                                                    0xb, 0xf7, 0x7, 0x15, 0xa7, 0xb8, 0xfb, 0x2e,\n                                                    0xf7, 0x4, 0x5, 0xb, 0x15, 0xa7, 0x73, 0xf7,\n                                                    0x3e, 0xf7, 0x10, 0x5f, 0xbe, 0x5, 0xb, 0x15,\n                                                    0xdc, 0xf7, 0x9, 0x3a, 0x6, 0xb, 0xc2, 0x3,\n                                                    0xea, 0x16, 0xf8, 0x2e, 0xb, 0x8b, 0xc1, 0xf7,\n                                                    0xd2, 0xc1, 0x1, 0xb, 0x8b, 0xc1, 0xf8, 0x5a,\n                                                    0xc1, 0x1, 0xb, 0x15, 0xe5, 0xf7, 0x8, 0x31,\n                                                    0x6, 0xb, 0x15, 0xb7, 0x6, 0x9d, 0xf7, 0x8f,\n                                                    0x5, 0x3a, 0x6, 0xb, 0xf7, 0x4d, 0x6f, 0x66,\n                                                    0xf7, 0x30, 0xfb, 0xf, 0x5, 0xb, 0x15, 0xf7,\n                                                    0xac, 0x26, 0x96, 0xa9, 0xfb, 0x96, 0xb, 0x1,\n                                                    0xf7, 0x79, 0xf7, 0x22, 0x3, 0xf7, 0x79, 0xb,\n                                                    0xd1, 0xf8, 0xc, 0x1, 0xe7, 0xf8, 0x34, 0x3,\n                                                    0xb, 0xf7, 0x5e, 0x15, 0xf7, 0x36, 0xfb, 0x17,\n                                                    0x6, 0xb, 0xf7, 0xa4, 0xbe, 0x1, 0x73, 0xf9,\n                                                    0x1c, 0x3, 0xb, 0xf8, 0xa9, 0x15, 0xd4, 0xf7,\n                                                    0x10, 0x42, 0x6, 0xb, 0xf7, 0xf, 0x1e, 0xf0,\n                                                    0x54, 0x7, 0xe, 0x6, 0xfb, 0x2e, 0xfb, 0x4,\n                                                    0xb, 0x1, 0xf7, 0xa5, 0xc4, 0x3, 0xb, 0xc2,\n                                                    0xf7, 0x33, 0xc3, 0xb\n                                                   };\n"
  },
  {
    "path": "core/src/fxge/fontdata/chromefontdata/FoxitFixedBold.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nconst unsigned char g_FoxitFixedBoldFontData [18055] = {0x1,\n                                                        0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x13,\n                                                        0x43, 0x68, 0x72, 0x6f, 0x6d, 0x46, 0x69, 0x78,\n                                                        0x65, 0x64, 0x4f, 0x54, 0x46, 0x2d, 0x42, 0x6f,\n                                                        0x6c, 0x64, 0x0, 0x1, 0x1, 0x1, 0x24, 0xf8,\n                                                        0x10, 0x0, 0xf8, 0x2a, 0x1, 0xf8, 0x2b, 0x2,\n                                                        0xf8, 0x2c, 0x3, 0xf8, 0x14, 0x4, 0xfb, 0x5,\n                                                        0xfb, 0x8d, 0xf9, 0x5d, 0xf9, 0xbf, 0x5, 0xf7,\n                                                        0xa0, 0xf, 0xf9, 0x6, 0x11, 0xae, 0x1c, 0x40,\n                                                        0xc8, 0x12, 0x0, 0x12, 0x1, 0x1, 0x5, 0x7,\n                                                        0x9, 0x11, 0x19, 0x1f, 0x25, 0x29, 0x2d, 0x39,\n                                                        0x42, 0x49, 0x53, 0x5c, 0x65, 0x8f, 0xa3, 0xb2,\n                                                        0x49, 0x64, 0x6f, 0x74, 0x49, 0x4a, 0x69, 0x6a,\n                                                        0x53, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c, 0x61,\n                                                        0x73, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c, 0x61,\n                                                        0x47, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x67, 0x63,\n                                                        0x61, 0x72, 0x6f, 0x6e, 0x6c, 0x69, 0x72, 0x61,\n                                                        0x45, 0x75, 0x72, 0x6f, 0x70, 0x72, 0x65, 0x73,\n                                                        0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n                                                        0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x65, 0x66,\n                                                        0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x75, 0x70,\n                                                        0x61, 0x72, 0x72, 0x6f, 0x77, 0x72, 0x69, 0x67,\n                                                        0x68, 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64,\n                                                        0x6f, 0x77, 0x6e, 0x61, 0x72, 0x72, 0x6f, 0x77,\n                                                        0x62, 0x6f, 0x74, 0x68, 0x20, 0x20, 0x20, 0x20,\n                                                        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x68,\n                                                        0x72, 0x6f, 0x6d, 0x20, 0x46, 0x69, 0x78, 0x65,\n                                                        0x64, 0x20, 0x4f, 0x54, 0x46, 0x20, 0x42, 0x6f,\n                                                        0x6c, 0x64, 0x43, 0x68, 0x72, 0x6F, 0x6D, 0x20,\n                                                        0x46, 0x69, 0x78, 0x65, 0x64, 0x20, 0x4f, 0x54,\n                                                        0x46, 0x0, 0x0, 0x1, 0x0, 0x1, 0x6, 0x0,\n                                                        0x68, 0x0, 0x0, 0x9, 0x37, 0x0, 0x7c, 0x0,\n                                                        0x0, 0x42, 0x20, 0x0, 0x67, 0x0, 0x0, 0x64,\n                                                        0x0, 0x0, 0xa0, 0x0, 0x0, 0x66, 0x0, 0x0,\n                                                        0x83, 0x0, 0x0, 0xaa, 0x0, 0x0, 0x8b, 0x0,\n                                                        0x0, 0x6a, 0x0, 0x0, 0x97, 0x0, 0x0, 0xa5,\n                                                        0x0, 0x0, 0x80, 0x0, 0x0, 0xa1, 0x0, 0x0,\n                                                        0x9c, 0x0, 0x0, 0xa4, 0x0, 0x0, 0xa9, 0x0,\n                                                        0x0, 0x7d, 0x0, 0x0, 0x98, 0x0, 0x0, 0x73,\n                                                        0x0, 0x0, 0x72, 0x0, 0x0, 0x85, 0x0, 0x0,\n                                                        0x96, 0x0, 0x0, 0x8f, 0x0, 0x0, 0x78, 0x0,\n                                                        0x0, 0x9e, 0x0, 0x0, 0x9b, 0x0, 0x0, 0xa3,\n                                                        0x0, 0x0, 0x7b, 0x0, 0x0, 0xae, 0x0, 0x0,\n                                                        0xab, 0x1, 0x0, 0xb0, 0x0, 0x0, 0xad, 0x0,\n                                                        0x0, 0xaf, 0x0, 0x0, 0x8a, 0x0, 0x0, 0xb1,\n                                                        0x0, 0x0, 0xb5, 0x0, 0x0, 0xb2, 0x2, 0x0,\n                                                        0xb9, 0x0, 0x0, 0xb6, 0x2, 0x0, 0x9a, 0x0,\n                                                        0x0, 0xba, 0x0, 0x0, 0xbe, 0x0, 0x0, 0xbb,\n                                                        0x1, 0x0, 0xbf, 0x0, 0x0, 0xbd, 0x0, 0x0,\n                                                        0xa8, 0x0, 0x0, 0x8d, 0x0, 0x0, 0xc4, 0x0,\n                                                        0x0, 0xc1, 0x2, 0x0, 0xc5, 0x0, 0x0, 0x9d,\n                                                        0x0, 0x0, 0x95, 0x0, 0x0, 0xcb, 0x0, 0x0,\n                                                        0xc8, 0x1, 0x0, 0xcd, 0x0, 0x0, 0xca, 0x0,\n                                                        0x0, 0xcc, 0x0, 0x0, 0x90, 0x0, 0x0, 0xce,\n                                                        0x0, 0x0, 0xd2, 0x0, 0x0, 0xcf, 0x2, 0x0,\n                                                        0xd6, 0x0, 0x0, 0xd3, 0x2, 0x0, 0xa7, 0x0,\n                                                        0x0, 0xd7, 0x0, 0x0, 0xdb, 0x0, 0x0, 0xd8,\n                                                        0x1, 0x0, 0xdc, 0x0, 0x0, 0xda, 0x0, 0x0,\n                                                        0x9f, 0x0, 0x0, 0x93, 0x0, 0x0, 0xe1, 0x0,\n                                                        0x0, 0xde, 0x2, 0x0, 0xe2, 0x0, 0x0, 0xa2,\n                                                        0x0, 0x0, 0xe3, 0x0, 0x1, 0x87, 0x0, 0x0,\n                                                        0x91, 0x0, 0x1, 0x88, 0x1, 0x0, 0x8c, 0x0,\n                                                        0x0, 0x92, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x94,\n                                                        0x0, 0x1, 0x8a, 0x1, 0x0, 0xc0, 0x0, 0x0,\n                                                        0xdd, 0x0, 0x0, 0xc6, 0x1, 0x0, 0xe4, 0x0,\n                                                        0x0, 0x65, 0x0, 0x1, 0x8c, 0x1, 0x0, 0x7e,\n                                                        0x0, 0x0, 0x88, 0x0, 0x0, 0x81, 0x1, 0x0,\n                                                        0x84, 0x0, 0x0, 0x87, 0x0, 0x0, 0x7f, 0x0,\n                                                        0x0, 0x86, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89,\n                                                        0x0, 0x0, 0x41, 0x0, 0x0, 0x8, 0x0, 0x0,\n                                                        0x75, 0x0, 0x0, 0x69, 0x0, 0x0, 0x77, 0x0,\n                                                        0x0, 0x76, 0x0, 0x0, 0x70, 0x1, 0x0, 0x74,\n                                                        0x0, 0x0, 0x79, 0x1, 0x0, 0x6b, 0x1, 0x0,\n                                                        0x63, 0x0, 0x1, 0x8e, 0x2, 0x0, 0x99, 0x0,\n                                                        0x1, 0x91, 0x4, 0x0, 0xa6, 0x0, 0x0, 0x6d,\n                                                        0x1, 0x0, 0xf4, 0x2, 0x0, 0x1, 0x0, 0x2,\n                                                        0x0, 0x3, 0x0, 0x34, 0x0, 0x60, 0x0, 0xc1,\n                                                        0x1, 0x42, 0x1, 0xcc, 0x2, 0x52, 0x2, 0x68,\n                                                        0x2, 0x9d, 0x2, 0xd2, 0x3, 0x2, 0x3, 0x26,\n                                                        0x3, 0x39, 0x3, 0x4e, 0x3, 0x67, 0x3, 0x7e,\n                                                        0x3, 0xc4, 0x3, 0xe8, 0x4, 0x2f, 0x4, 0x8e,\n                                                        0x4, 0xc1, 0x5, 0xf, 0x5, 0x77, 0x5, 0x96,\n                                                        0x6, 0xc, 0x6, 0x73, 0x6, 0x86, 0x6, 0xa9,\n                                                        0x6, 0xc6, 0x6, 0xe4, 0x7, 0x1, 0x7, 0x5f,\n                                                        0x7, 0xff, 0x8, 0x3d, 0x8, 0xa0, 0x8, 0xee,\n                                                        0x9, 0x22, 0x9, 0x69, 0x9, 0xb0, 0x9, 0xd8,\n                                                        0xa, 0x12, 0xa, 0x26, 0xa, 0x57, 0xa, 0x94,\n                                                        0xa, 0xb6, 0xa, 0xf8, 0xb, 0x2d, 0xb, 0x76,\n                                                        0xb, 0xb7, 0xc, 0x32, 0xc, 0x86, 0xc, 0xfa,\n                                                        0xd, 0x26, 0xd, 0x64, 0xd, 0x94, 0xd, 0xcc,\n                                                        0xe, 0xf, 0xe, 0x45, 0xe, 0x6f, 0xe, 0x8b,\n                                                        0xe, 0x9f, 0xe, 0xbb, 0xe, 0xea, 0xe, 0xf6,\n                                                        0xf, 0xc, 0xf, 0x73, 0xf, 0xd4, 0x10, 0x1d,\n                                                        0x10, 0x7c, 0x10, 0xc8, 0x11, 0x6, 0x11, 0x43,\n                                                        0x11, 0x90, 0x11, 0xc3, 0x12, 0x7, 0x12, 0x43,\n                                                        0x12, 0x56, 0x12, 0xb6, 0x12, 0xfd, 0x13, 0x39,\n                                                        0x13, 0x97, 0x13, 0xdd, 0x14, 0x1d, 0x14, 0x95,\n                                                        0x14, 0xd4, 0x15, 0x29, 0x15, 0x51, 0x15, 0x91,\n                                                        0x15, 0xd0, 0x16, 0x7, 0x16, 0x3f, 0x16, 0xa5,\n                                                        0x16, 0xb5, 0x17, 0x1b, 0x17, 0x62, 0x17, 0x94,\n                                                        0x17, 0xe6, 0x18, 0x64, 0x18, 0xd4, 0x19, 0x29,\n                                                        0x19, 0x41, 0x19, 0xe1, 0x1a, 0x7, 0x1a, 0x90,\n                                                        0x1a, 0xf6, 0x1b, 0x29, 0x1b, 0x44, 0x1b, 0xd1,\n                                                        0x1b, 0xe4, 0x1c, 0x1e, 0x1c, 0x4b, 0x1c, 0x95,\n                                                        0x1c, 0xfe, 0x1d, 0x14, 0x1d, 0x76, 0x1d, 0xa3,\n                                                        0x1d, 0xbf, 0x1d, 0xf9, 0x1e, 0x25, 0x1e, 0x5f,\n                                                        0x1e, 0x93, 0x1e, 0xf6, 0x1f, 0x64, 0x1f, 0xff,\n                                                        0x20, 0x60, 0x20, 0x81, 0x20, 0xa0, 0x20, 0xca,\n                                                        0x21, 0x23, 0x21, 0x4c, 0x21, 0x8d, 0x21, 0xf8,\n                                                        0x22, 0x7b, 0x22, 0x8e, 0x22, 0xc1, 0x22, 0xf5,\n                                                        0x23, 0x31, 0x23, 0x49, 0x23, 0x68, 0x23, 0x93,\n                                                        0x23, 0xc1, 0x24, 0xc, 0x24, 0x7f, 0x24, 0xa0,\n                                                        0x24, 0xba, 0x24, 0xdf, 0x25, 0x33, 0x25, 0x5a,\n                                                        0x25, 0x89, 0x26, 0x6, 0x26, 0x1e, 0x26, 0x35,\n                                                        0x26, 0x5d, 0x26, 0x92, 0x26, 0xdd, 0x27, 0x26,\n                                                        0x27, 0xb4, 0x27, 0xd5, 0x27, 0xf6, 0x28, 0x26,\n                                                        0x28, 0x8b, 0x28, 0xcc, 0x29, 0x8, 0x29, 0xb0,\n                                                        0x2a, 0x2c, 0x2a, 0x46, 0x2a, 0x5f, 0x2a, 0x83,\n                                                        0x2a, 0xa2, 0x2a, 0xb8, 0x2a, 0xcd, 0x2a, 0xf5,\n                                                        0x2b, 0x3a, 0x2b, 0xab, 0x2c, 0x35, 0x2c, 0x54,\n                                                        0x2c, 0x70, 0x2c, 0x95, 0x2c, 0xe7, 0x2d, 0xa,\n                                                        0x2d, 0x29, 0x2d, 0xbd, 0x2d, 0xd4, 0x2d, 0xea,\n                                                        0x2e, 0xe, 0x2e, 0x5a, 0x2e, 0x86, 0x2e, 0xe6,\n                                                        0x2f, 0x21, 0x2f, 0x4b, 0x2f, 0x5c, 0x2f, 0xa1,\n                                                        0x30, 0x14, 0x30, 0x4e, 0x30, 0x7b, 0x30, 0xe8,\n                                                        0x31, 0x65, 0x32, 0x14, 0x32, 0xc5, 0x33, 0x60,\n                                                        0x33, 0xf4, 0x34, 0x57, 0x34, 0xa2, 0x34, 0xf2,\n                                                        0x35, 0x4f, 0x35, 0x9b, 0x35, 0xeb, 0x36, 0xe,\n                                                        0x36, 0x1b, 0x36, 0x4a, 0x36, 0x61, 0x36, 0x96,\n                                                        0x36, 0xca, 0x37, 0x9, 0x37, 0x31, 0x37, 0x44,\n                                                        0x37, 0x57, 0x37, 0x6e, 0x37, 0x80, 0x37, 0x94,\n                                                        0x37, 0xa2, 0x37, 0xb7, 0x37, 0xce, 0x37, 0xee,\n                                                        0x38, 0x22, 0x38, 0x43, 0x38, 0x90, 0x39, 0x34,\n                                                        0x39, 0x4d, 0x39, 0x6b, 0x39, 0x82, 0x3a, 0x8,\n                                                        0x3a, 0x89, 0x3a, 0xf0, 0x3b, 0x34, 0x3b, 0x41,\n                                                        0x3b, 0x63, 0x3b, 0x71, 0x3b, 0x94, 0x3b, 0xa8,\n                                                        0x3b, 0xb4, 0x3c, 0x11, 0x3c, 0x6a, 0xe, 0xe,\n                                                        0x7c, 0xf7, 0x31, 0xf8, 0x44, 0x77, 0x1, 0xf7,\n                                                        0x7e, 0xf7, 0x17, 0x3, 0xf7, 0x89, 0xf7, 0x4b,\n                                                        0x15, 0xf7, 0x2, 0x6, 0x9f, 0xf8, 0x19, 0x5,\n                                                        0xfb, 0x2b, 0x6, 0x75, 0xfc, 0x90, 0x15, 0x5f,\n                                                        0xb7, 0x68, 0xc1, 0xc1, 0xb7, 0xae, 0xb7, 0xb7,\n                                                        0x5f, 0xad, 0x55, 0x55, 0x5f, 0x69, 0x5f, 0x1e,\n                                                        0xe, 0xf7, 0xb8, 0x76, 0xf7, 0xb7, 0x77, 0x1,\n                                                        0xf7, 0x28, 0xf7, 0x6, 0xd6, 0xf7, 0x5, 0x3,\n                                                        0xf7, 0xe5, 0xf7, 0xa9, 0x15, 0xf7, 0x5, 0x6,\n                                                        0x9a, 0x59, 0xa, 0xfb, 0x22, 0x6, 0xfb, 0x43,\n                                                        0xfb, 0xb1, 0x15, 0xf7, 0x6, 0x6, 0x9b, 0x59,\n                                                        0xa, 0xfb, 0x23, 0x6, 0xe, 0x5e, 0x76, 0xf7,\n                                                        0x75, 0xe6, 0xf3, 0xe6, 0xf7, 0x54, 0x77, 0x1,\n                                                        0xf7, 0x24, 0xe3, 0xf3, 0xe7, 0x3, 0xf7, 0x1d,\n                                                        0x5e, 0x15, 0xe4, 0x6, 0x98, 0xf7, 0x60, 0x5,\n                                                        0xf4, 0x6, 0x7c, 0xfb, 0x60, 0x5, 0xe8, 0x6,\n                                                        0x98, 0xf7, 0x60, 0x5, 0xf7, 0x1, 0xe6, 0x24,\n                                                        0x6, 0x91, 0xf3, 0x5, 0xec, 0xe6, 0x30, 0x6,\n                                                        0x92, 0xf7, 0x62, 0x5, 0x31, 0x6, 0x83, 0xfb,\n                                                        0x62, 0x5, 0x24, 0x6, 0x92, 0xf7, 0x62, 0x5,\n                                                        0x32, 0x6, 0x82, 0xfb, 0x62, 0x5, 0xfb, 0x4,\n                                                        0x30, 0xf6, 0x6, 0x84, 0x23, 0x5, 0x27, 0x30,\n                                                        0xea, 0x6, 0xe9, 0xe6, 0x15, 0x93, 0xf3, 0x5,\n                                                        0xf1, 0x6, 0x85, 0x23, 0x5, 0xe, 0x22, 0x76,\n                                                        0xf7, 0x13, 0xf7, 0x54, 0xf7, 0x56, 0xf7, 0x53,\n                                                        0x20, 0xf7, 0x57, 0x12, 0xe0, 0xef, 0xcb, 0xef,\n                                                        0xbf, 0xee, 0x3a, 0xee, 0x13, 0xdd, 0xdc, 0x8c,\n                                                        0x15, 0xef, 0xa9, 0x6, 0x84, 0x9f, 0xa6, 0x86,\n                                                        0xa0, 0x1b, 0xfb, 0x25, 0xef, 0xf7, 0x24, 0x7,\n                                                        0xb1, 0x92, 0xf7, 0x17, 0xa1, 0xf7, 0x13, 0x1a,\n                                                        0xf3, 0x37, 0x9e, 0x20, 0xa7, 0x1e, 0x62, 0x97,\n                                                        0x26, 0x9d, 0xc1, 0x1a, 0xc0, 0xd9, 0x94, 0xaa,\n                                                        0x1e, 0x13, 0xee, 0xb0, 0xb0, 0x81, 0x7c, 0xac,\n                                                        0x1f, 0x50, 0xee, 0xf7, 0x53, 0x28, 0x6c, 0x7,\n                                                        0x7b, 0x93, 0x7a, 0x91, 0x78, 0x8e, 0x8, 0x13,\n                                                        0xdd, 0xf1, 0x27, 0x26, 0x7, 0x46, 0x82, 0x2c,\n                                                        0x67, 0xfb, 0x7, 0x1a, 0x21, 0xde, 0x76, 0xf7,\n                                                        0xe, 0x69, 0x1e, 0xb6, 0x80, 0xe1, 0x83, 0x56,\n                                                        0x1a, 0x55, 0x25, 0x87, 0x6f, 0x66, 0x67, 0x91,\n                                                        0x9a, 0x68, 0x1e, 0xc5, 0x27, 0x7, 0xe, 0x91,\n                                                        0x76, 0xf7, 0x5f, 0xd1, 0xdd, 0xd0, 0xf7, 0x1c,\n                                                        0xd2, 0x12, 0xc7, 0xd2, 0xf7, 0x9, 0xd2, 0x64,\n                                                        0xd1, 0xf7, 0xa, 0xd2, 0x13, 0xfb, 0xc7, 0xf8,\n                                                        0x71, 0x15, 0x42, 0xc3, 0x4c, 0xe3, 0x8a, 0x1e,\n                                                        0xdb, 0xcd, 0xc5, 0xdb, 0xd1, 0x52, 0xcf, 0x34,\n                                                        0x36, 0x4e, 0x48, 0x43, 0x1f, 0xd2, 0x8c, 0x15,\n                                                        0xae, 0xa5, 0xab, 0xba, 0x1e, 0x13, 0xeb, 0xba,\n                                                        0xa8, 0x6c, 0x67, 0x5d, 0x64, 0x74, 0x65, 0x5e,\n                                                        0x70, 0xac, 0xaf, 0x1f, 0x13, 0xfd, 0xf7, 0x9,\n                                                        0xfb, 0xf7, 0x15, 0x43, 0xc5, 0x4a, 0xe3, 0x8a,\n                                                        0x1e, 0x13, 0x45, 0xda, 0xcd, 0xc5, 0xdc, 0xd2,\n                                                        0x52, 0xce, 0x35, 0x36, 0x4c, 0x49, 0x42, 0x1f,\n                                                        0xd2, 0x8c, 0x15, 0xad, 0xa6, 0xad, 0xbb, 0x1e,\n                                                        0x13, 0x5, 0xb9, 0xa7, 0x6a, 0x68, 0x5c, 0x66,\n                                                        0x76, 0x65, 0x5d, 0x6f, 0xab, 0xaf, 0x1f, 0xfb,\n                                                        0x6b, 0xb3, 0x15, 0x13, 0x0, 0xf8, 0x46, 0xf7,\n                                                        0x63, 0x6f, 0xcf, 0xfc, 0x47, 0xfb, 0x6a, 0x5,\n                                                        0xe, 0x7c, 0xe7, 0x3b, 0xe8, 0xf7, 0xa, 0xe8,\n                                                        0xf7, 0x28, 0xe9, 0x12, 0xb8, 0xec, 0x68, 0xec,\n                                                        0x13, 0xb8, 0xf7, 0x2f, 0xf7, 0xc4, 0x15, 0x4d,\n                                                        0x6d, 0x5b, 0x4f, 0x45, 0x1a, 0x46, 0xbd, 0x31,\n                                                        0xf7, 0xb, 0xdb, 0xad, 0xad, 0x9d, 0xa3, 0x1e,\n                                                        0x13, 0x74, 0xb3, 0x63, 0x5, 0xf7, 0x37, 0xe8,\n                                                        0xfb, 0xc, 0x6, 0x6f, 0xa4, 0x9f, 0xa8, 0x97,\n                                                        0xac, 0x98, 0xaa, 0x19, 0xde, 0xe8, 0xfb, 0x27,\n                                                        0x6, 0x86, 0x73, 0x77, 0x52, 0x7c, 0x71, 0x30,\n                                                        0xf7, 0xd, 0x18, 0x7c, 0x9f, 0x65, 0xbd, 0xa2,\n                                                        0x1a, 0xaa, 0xa8, 0x95, 0xae, 0xb5, 0xbe, 0x73,\n                                                        0x79, 0x98, 0x1e, 0xc2, 0xd0, 0x5, 0xb3, 0x66,\n                                                        0x4b, 0xa6, 0x4f, 0x1b, 0x38, 0x3d, 0x63, 0x2e,\n                                                        0x5a, 0xb2, 0x64, 0x93, 0x7b, 0x1f, 0xbe, 0x43,\n                                                        0x15, 0xe7, 0x6a, 0xa, 0x13, 0xb8, 0x74, 0x77,\n                                                        0x6d, 0x7d, 0x6c, 0x1b, 0x54, 0x78, 0xb5, 0xa9,\n                                                        0xb8, 0xb1, 0xa4, 0xa4, 0x9a, 0x1f, 0xe, 0x4c,\n                                                        0xa, 0xf7, 0x7d, 0xf7, 0x19, 0x3, 0xf7, 0x84,\n                                                        0xf7, 0xa9, 0x15, 0xf7, 0xb, 0x6, 0x99, 0x59,\n                                                        0xa, 0xfb, 0x26, 0x6, 0xe, 0x3a, 0x76, 0xf9,\n                                                        0x62, 0x77, 0x1, 0xf7, 0x47, 0xf7, 0x1, 0x3,\n                                                        0xf7, 0xd3, 0x25, 0x15, 0xf1, 0x6, 0x53, 0xe2,\n                                                        0x3e, 0xf7, 0xf, 0xf7, 0x52, 0x1a, 0xf7, 0x2b,\n                                                        0xc4, 0xc0, 0xd7, 0xf7, 0x6, 0x1e, 0x29, 0x6,\n                                                        0x32, 0x27, 0x54, 0x27, 0xfb, 0xb, 0x1a, 0xfb,\n                                                        0x17, 0xa0, 0xfb, 0x0, 0xf7, 0xb, 0xfb, 0x34,\n                                                        0x1e, 0xe, 0x3a, 0x76, 0xf9, 0x62, 0x77, 0x1,\n                                                        0xf7, 0xcc, 0xf7, 0x1, 0x3, 0xf7, 0x47, 0x25,\n                                                        0x15, 0xf1, 0x6, 0xf7, 0xb, 0xf7, 0x34, 0xa0,\n                                                        0xf7, 0x0, 0xf7, 0x17, 0x1a, 0xf7, 0xb, 0x54,\n                                                        0xef, 0x32, 0xef, 0x1e, 0x29, 0x6, 0xd7, 0xfb,\n                                                        0x6, 0xc4, 0x56, 0xfb, 0x2b, 0x1a, 0xfb, 0x52,\n                                                        0x3e, 0xfb, 0xf, 0x53, 0x34, 0x1e, 0xe, 0xf7,\n                                                        0x8e, 0xf1, 0x3, 0xf7, 0x22, 0xf7, 0xac, 0x15,\n                                                        0xdf, 0x4e, 0xd6, 0xf7, 0xc, 0xd6, 0xfb, 0xb,\n                                                        0xdf, 0xc8, 0x33, 0xf2, 0xf7, 0x1d, 0xad, 0x69,\n                                                        0xed, 0xfb, 0x14, 0x59, 0x95, 0xf7, 0x1b, 0x5,\n                                                        0x6b, 0xa, 0x93, 0xfb, 0x19, 0xfb, 0x13, 0xbb,\n                                                        0x67, 0x28, 0xf7, 0x20, 0x6a, 0x5, 0xe, 0xc7,\n                                                        0x76, 0xf7, 0x41, 0xe9, 0xf7, 0x40, 0x67, 0xa,\n                                                        0xed, 0x3, 0xd2, 0xf7, 0x68, 0x15, 0xf7, 0x48,\n                                                        0xfb, 0x41, 0xed, 0xf7, 0x41, 0xf7, 0x48, 0xe9,\n                                                        0xfb, 0x48, 0xf7, 0x40, 0x29, 0xfb, 0x40, 0xfb,\n                                                        0x48, 0x6, 0xe, 0x31, 0x45, 0xa, 0xf7, 0x39,\n                                                        0xfb, 0x3, 0x15, 0xf7, 0x14, 0x6, 0xf7, 0x22,\n                                                        0x59, 0xa, 0xfb, 0x3d, 0x6, 0xe, 0xf7, 0x5f,\n                                                        0xf7, 0x2, 0x1, 0xef, 0xf8, 0x24, 0x3, 0xef,\n                                                        0xf7, 0x5f, 0x15, 0xf8, 0x24, 0xf7, 0x2, 0xfc,\n                                                        0x24, 0x6, 0xe, 0x7c, 0xf7, 0x4e, 0x6d, 0xa,\n                                                        0xd9, 0x15, 0x58, 0xbc, 0x61, 0xc6, 0xc6, 0xbc,\n                                                        0xb5, 0xbe, 0xbe, 0x5a, 0xb5, 0x50, 0x50, 0x5a,\n                                                        0x61, 0x58, 0x1e, 0xe, 0x53, 0x76, 0xf9, 0x53,\n                                                        0x77, 0x1, 0xed, 0xf8, 0x28, 0x3, 0xed, 0x5d,\n                                                        0x15, 0xd0, 0x6c, 0xf7, 0xe3, 0xf9, 0x34, 0x45,\n                                                        0xaa, 0x5, 0xe, 0x7c, 0xe8, 0xf8, 0x51, 0xe8,\n                                                        0x1, 0xe2, 0xed, 0xf7, 0x7c, 0xeb, 0x3, 0xe2,\n                                                        0xf7, 0xbe, 0x15, 0x42, 0x99, 0xfb, 0x84, 0xf7,\n                                                        0x5c, 0xf7, 0x60, 0x93, 0xf7, 0x84, 0xd5, 0xd4,\n                                                        0x78, 0xf7, 0x88, 0xfb, 0x53, 0xfb, 0x66, 0x85,\n                                                        0xfb, 0x86, 0x3f, 0x1e, 0xed, 0x8c, 0x15, 0xc6,\n                                                        0x8d, 0x90, 0xf7, 0x39, 0xf7, 0x1, 0x1b, 0xf7,\n                                                        0x3, 0x90, 0xfb, 0x3c, 0x50, 0x3b, 0x7c, 0xfb,\n                                                        0x1e, 0x28, 0x20, 0x80, 0xf7, 0x1f, 0xdd, 0x1f,\n                                                        0xe, 0x8b, 0xe8, 0xf8, 0x9f, 0x77, 0x1, 0xf7,\n                                                        0x91, 0xec, 0x3, 0xd2, 0x16, 0xf8, 0x5e, 0xe8,\n                                                        0xfb, 0x47, 0xf8, 0x9f, 0x6, 0xfb, 0x9e, 0x56,\n                                                        0x5, 0x30, 0x7, 0xf7, 0x3d, 0xad, 0x5, 0xfc,\n                                                        0x31, 0xfb, 0x4a, 0x7, 0xe, 0x8b, 0xea, 0x2c,\n                                                        0xf7, 0x34, 0xf7, 0xfe, 0xe9, 0x12, 0xf2, 0xed,\n                                                        0xf7, 0x6f, 0xee, 0x13, 0x78, 0xdc, 0x16, 0xf8,\n                                                        0x4a, 0xf7, 0x34, 0x2c, 0x6, 0x13, 0xb8, 0x4a,\n                                                        0xfb, 0x4c, 0x7, 0xf7, 0x1, 0xe8, 0xf7, 0x3e,\n                                                        0xf7, 0x17, 0xef, 0x1a, 0xef, 0x42, 0xec, 0xfb,\n                                                        0x1d, 0x39, 0x43, 0x69, 0x4d, 0x57, 0x1e, 0x34,\n                                                        0xed, 0x7, 0xdf, 0xe1, 0x90, 0xa6, 0xca, 0xb6,\n                                                        0x68, 0x48, 0x58, 0xfb, 0xb, 0x28, 0xfb, 0x70,\n                                                        0xfb, 0x45, 0x1e, 0xe, 0x7c, 0xe8, 0xf7, 0x50,\n                                                        0xe8, 0xf7, 0x37, 0xe9, 0x12, 0xf8, 0x1b, 0xf2,\n                                                        0x44, 0xeb, 0x13, 0xe8, 0xdc, 0xb3, 0x15, 0x79,\n                                                        0xbe, 0xcc, 0x66, 0xed, 0x1b, 0xdb, 0xf7, 0x24,\n                                                        0xb7, 0xf7, 0x23, 0xe1, 0x5e, 0xaa, 0x5b, 0xac,\n                                                        0x1f, 0x13, 0xf0, 0xba, 0xa1, 0xa1, 0xc4, 0xc1,\n                                                        0x1a, 0xf7, 0x6, 0x8a, 0x2a, 0xba, 0x23, 0x1b,\n                                                        0x40, 0x6a, 0x6f, 0x66, 0x4f, 0x1f, 0xad, 0x42,\n                                                        0x5, 0xb2, 0xd3, 0x9f, 0x90, 0xb6, 0x1b, 0xc8,\n                                                        0xb0, 0x77, 0x50, 0x3e, 0x33, 0x84, 0x4e, 0x1f,\n                                                        0x2e, 0x7, 0x13, 0xe8, 0xe6, 0xe4, 0x7f, 0x39,\n                                                        0x4d, 0x4f, 0x6b, 0x46, 0x57, 0x56, 0x9b, 0xaf,\n                                                        0x40, 0x1f, 0xe, 0x8b, 0xe9, 0xdf, 0xe9, 0xf7,\n                                                        0xec, 0x77, 0x1, 0xf7, 0xe3, 0xeb, 0x3, 0xd4,\n                                                        0xf7, 0x46, 0x15, 0xf7, 0x9a, 0x37, 0x23, 0x2d,\n                                                        0xf7, 0xbc, 0xe9, 0x2b, 0xdf, 0xe8, 0xe9, 0x2e,\n                                                        0xf7, 0xec, 0x24, 0x6, 0xfb, 0x93, 0xfb, 0xf9,\n                                                        0x5, 0xf7, 0x2, 0x98, 0x15, 0xf7, 0x2c, 0xf7,\n                                                        0x73, 0x5, 0xfb, 0x73, 0x7, 0xe, 0x7c, 0xe7,\n                                                        0xf7, 0x75, 0xe5, 0xf7, 0x8, 0xe8, 0x1, 0xf7,\n                                                        0x9, 0xeb, 0xf7, 0x6c, 0xeb, 0x3, 0xd5, 0xaf,\n                                                        0x15, 0x7b, 0xb1, 0xeb, 0x68, 0xe1, 0x1b, 0xf7,\n                                                        0x31, 0xd5, 0xee, 0xf6, 0xf7, 0x7, 0x3f, 0xe1,\n                                                        0xfb, 0xa, 0x67, 0x63, 0x89, 0x7e, 0x61, 0x1f,\n                                                        0xf7, 0x17, 0xf7, 0xb2, 0xe8, 0xfc, 0x12, 0xfb,\n                                                        0xaf, 0x7, 0xbc, 0x52, 0xb3, 0xa8, 0xbd, 0x98,\n                                                        0xb8, 0x8a, 0x19, 0xd0, 0x8a, 0xc6, 0x64, 0x41,\n                                                        0x1a, 0x4c, 0x5b, 0x5b, 0x36, 0x48, 0x4d, 0xa3,\n                                                        0xa1, 0x51, 0x1e, 0xe, 0x7c, 0xe4, 0xf7, 0x69,\n                                                        0xe9, 0xf7, 0x1c, 0xe6, 0x1, 0xdf, 0xf7, 0x2,\n                                                        0xf7, 0x6a, 0xec, 0x3, 0xf7, 0x51, 0xf7, 0xee,\n                                                        0x15, 0xf7, 0x19, 0xa5, 0xf7, 0x1, 0xb1, 0xf7,\n                                                        0xd, 0x1b, 0xa0, 0xa0, 0x8f, 0x87, 0xa0, 0x1f,\n                                                        0x92, 0xe9, 0x5, 0x8e, 0x73, 0x73, 0x85, 0x75,\n                                                        0x1b, 0xfb, 0xf, 0x31, 0x6c, 0x40, 0x46, 0x1f,\n                                                        0x5f, 0x59, 0x68, 0x32, 0x30, 0x1a, 0xfb, 0x21,\n                                                        0xce, 0xfb, 0x26, 0xf7, 0x30, 0xf6, 0xe6, 0xde,\n                                                        0xf7, 0x3, 0xf7, 0x12, 0x45, 0xd7, 0xfb, 0x16,\n                                                        0x56, 0x75, 0x7f, 0x74, 0x62, 0x1e, 0x90, 0xfb,\n                                                        0x17, 0x15, 0x8b, 0xa2, 0xd3, 0xdf, 0xdc, 0xa5,\n                                                        0x5a, 0x53, 0x48, 0x5e, 0x62, 0x51, 0x43, 0x64,\n                                                        0xd6, 0xcd, 0x1e, 0xe, 0xa0, 0x76, 0xf8, 0x90,\n                                                        0xe8, 0x1, 0xe5, 0xed, 0x3, 0xf7, 0x5d, 0x16,\n                                                        0xf6, 0x6, 0xf7, 0x5c, 0xf8, 0x8e, 0x8c, 0xea,\n                                                        0x5, 0xfc, 0x37, 0xfb, 0x48, 0xed, 0xe2, 0xf7,\n                                                        0x6e, 0x6, 0xe, 0x7c, 0xe8, 0xf7, 0x53, 0xe9,\n                                                        0xf7, 0x22, 0xe9, 0x12, 0xde, 0xee, 0x32, 0xee,\n                                                        0xf7, 0x6c, 0xec, 0x36, 0xec, 0x13, 0xf2, 0xf7,\n                                                        0x3d, 0xf7, 0xd5, 0x15, 0x58, 0x69, 0x68, 0x57,\n                                                        0x4d, 0x1a, 0xfb, 0x13, 0xf7, 0x9, 0x4e, 0xef,\n                                                        0xf7, 0x10, 0xe8, 0xc7, 0xf7, 0x12, 0xcc, 0x6c,\n                                                        0xbc, 0x55, 0xb0, 0x1e, 0x13, 0xec, 0xb7, 0xac,\n                                                        0xa8, 0xb8, 0xc9, 0x1a, 0xf0, 0x34, 0xc5, 0xfb,\n                                                        0xa, 0xfb, 0x16, 0x3e, 0x43, 0x31, 0x54, 0xa7,\n                                                        0x5c, 0xbb, 0x67, 0x1e, 0xa2, 0xf7, 0x19, 0x15,\n                                                        0xbb, 0xb7, 0xaa, 0xcb, 0xe0, 0xa2, 0x6b, 0x5d,\n                                                        0x51, 0x54, 0x6c, 0x56, 0x50, 0x5a, 0xae, 0xc0,\n                                                        0x1e, 0x13, 0xf2, 0x81, 0xfb, 0xaf, 0x15, 0xc0,\n                                                        0xc2, 0xb8, 0xca, 0xde, 0xb0, 0x57, 0x5d, 0x4f,\n                                                        0x69, 0x6d, 0x37, 0x3e, 0x60, 0xb6, 0xba, 0x1e,\n                                                        0xe, 0x7c, 0xe8, 0xf7, 0x1a, 0xed, 0xf7, 0x68,\n                                                        0xe9, 0x1, 0xe5, 0xf1, 0xf7, 0x6d, 0xf5, 0x3,\n                                                        0xdf, 0x81, 0x15, 0x88, 0xa6, 0xa5, 0x89, 0xa4,\n                                                        0x1b, 0xf7, 0x3c, 0xf7, 0xf, 0xcd, 0xf7, 0x28,\n                                                        0xb7, 0x1f, 0x97, 0xb3, 0x91, 0xb8, 0xbf, 0x1a,\n                                                        0xf7, 0x3, 0x6d, 0xf7, 0x42, 0xfb, 0x4e, 0xfb,\n                                                        0xb, 0x31, 0x2d, 0x26, 0xfb, 0x0, 0xd8, 0x23,\n                                                        0xf7, 0x13, 0xb6, 0xac, 0x9c, 0x9a, 0xa4, 0x1e,\n                                                        0xfb, 0xd, 0x6f, 0x3b, 0x5c, 0xfb, 0x14, 0x1b,\n                                                        0x75, 0x74, 0x8d, 0x8d, 0x73, 0x1f, 0xf7, 0xd3,\n                                                        0xf7, 0xcd, 0x15, 0x87, 0x8c, 0x6f, 0x3c, 0x37,\n                                                        0x1b, 0x50, 0x5c, 0xb8, 0xd1, 0xd4, 0xca, 0xa6,\n                                                        0xb9, 0xe1, 0x97, 0x42, 0x50, 0x95, 0x1f, 0xe,\n                                                        0x7c, 0xf7, 0x44, 0xe1, 0xf7, 0x44, 0x6d, 0xa,\n                                                        0xf7, 0xe5, 0x15, 0x37, 0xa, 0xfb, 0x9c, 0x4,\n                                                        0x37, 0xa, 0xe, 0x31, 0x76, 0xf8, 0x7, 0xf7,\n                                                        0x44, 0x1, 0xf7, 0x76, 0xf7, 0x6c, 0x3, 0xf7,\n                                                        0x31, 0xfb, 0x3, 0x15, 0xf7, 0x1c, 0x6, 0xf7,\n                                                        0x29, 0xf7, 0xad, 0x5, 0xfb, 0x46, 0x6, 0x65,\n                                                        0xf7, 0x3b, 0x15, 0x37, 0xa, 0xe, 0x5e, 0xa,\n                                                        0xf7, 0x5c, 0x15, 0xf8, 0x5d, 0xfb, 0x4d, 0x5,\n                                                        0xe9, 0x7, 0xfb, 0xf6, 0xf7, 0x2a, 0xf7, 0xf6,\n                                                        0xf7, 0x28, 0x5, 0xe9, 0x7, 0xfc, 0x5d, 0xfb,\n                                                        0x4c, 0x5, 0xe, 0xf7, 0xa, 0xf1, 0xd7, 0xf1,\n                                                        0x1, 0xd2, 0xf8, 0x5e, 0x3, 0xd2, 0xf7, 0xbc,\n                                                        0x15, 0xf8, 0x5e, 0xf1, 0xfc, 0x5e, 0x6, 0xfb,\n                                                        0xac, 0x4, 0xf8, 0x5e, 0xf1, 0xfc, 0x5e, 0x6,\n                                                        0xe, 0x5e, 0xa, 0x9a, 0x15, 0xf8, 0x5d, 0xf7,\n                                                        0x4d, 0x5, 0xf7, 0x9, 0x7, 0xfc, 0x5d, 0xf7,\n                                                        0x4c, 0x5, 0x2d, 0x7, 0xf7, 0xf9, 0xfb, 0x28,\n                                                        0xfb, 0xf9, 0xfb, 0x2a, 0x5, 0xe, 0x80, 0xf7,\n                                                        0x2a, 0xf7, 0xf1, 0xe7, 0x12, 0xed, 0xec, 0x7e,\n                                                        0xf7, 0x41, 0xbd, 0xeb, 0x13, 0xe8, 0xf7, 0x70,\n                                                        0xf7, 0x45, 0x15, 0xec, 0xc8, 0x6, 0xc0, 0x97,\n                                                        0xf7, 0x17, 0xb0, 0xf7, 0x10, 0x1a, 0xf7, 0x1,\n                                                        0x2b, 0xc7, 0xfb, 0xd, 0x53, 0x3e, 0x7d, 0x77,\n                                                        0x56, 0x1e, 0xfb, 0x23, 0xec, 0xd6, 0x7, 0xa8,\n                                                        0x92, 0xae, 0x8f, 0xad, 0x8a, 0x8, 0xc6, 0x8a,\n                                                        0xc0, 0x76, 0x54, 0x1a, 0x13, 0x90, 0x40, 0x2b,\n                                                        0x7a, 0x32, 0x7d, 0x1e, 0x13, 0xd8, 0x65, 0xfb,\n                                                        0x88, 0x15, 0x62, 0xb1, 0x69, 0xbb, 0xbb, 0xb2,\n                                                        0xad, 0xb4, 0xb4, 0x64, 0xad, 0x5b, 0x5b, 0x65,\n                                                        0x69, 0x62, 0x1e, 0xe, 0x79, 0xd3, 0xd2, 0xd4,\n                                                        0xf7, 0x85, 0x77, 0xe6, 0xd0, 0x1, 0x9e, 0xdf,\n                                                        0xcc, 0xd0, 0xf7, 0x9b, 0xdb, 0x3, 0xf7, 0xea,\n                                                        0xf7, 0x3b, 0x15, 0x6a, 0xa1, 0xaf, 0x82, 0x9d,\n                                                        0x1b, 0xc8, 0xf0, 0xc0, 0xf7, 0x26, 0xbd, 0x81,\n                                                        0xbc, 0x72, 0xb3, 0x1f, 0xde, 0x57, 0x2f, 0xac,\n                                                        0x30, 0x1b, 0xfb, 0x2d, 0xfb, 0x1e, 0x23, 0xfb,\n                                                        0x5d, 0xfb, 0x1, 0xbf, 0xfb, 0x4b, 0xf7, 0x78,\n                                                        0xf7, 0x13, 0xd4, 0xc4, 0xa4, 0xb1, 0x1f, 0x6f,\n                                                        0xcf, 0x5, 0x54, 0x3d, 0x4c, 0x74, 0x3f, 0x1b,\n                                                        0xfb, 0x2d, 0x67, 0xf7, 0x1b, 0xe3, 0xc9, 0xa2,\n                                                        0xf7, 0x3f, 0xf7, 0x4c, 0xf7, 0xb, 0xd2, 0x44,\n                                                        0x23, 0x3c, 0x69, 0x51, 0x63, 0x7d, 0x77, 0x91,\n                                                        0xa3, 0x90, 0x8b, 0x8f, 0x8d, 0x91, 0x1f, 0xbe,\n                                                        0xf7, 0x52, 0x5, 0x46, 0x6, 0x85, 0x79, 0x5,\n                                                        0xa3, 0x74, 0x7e, 0x8b, 0x7d, 0x1b, 0xfb, 0x4,\n                                                        0x63, 0xfb, 0xe, 0x3a, 0x35, 0xbe, 0x72, 0xad,\n                                                        0xac, 0xab, 0x9c, 0xa4, 0xa3, 0x1f, 0x22, 0xd0,\n                                                        0x15, 0xc3, 0xa5, 0xd4, 0xbc, 0xa3, 0x8d, 0x74,\n                                                        0x82, 0x70, 0x77, 0xfb, 0x0, 0x4f, 0x7b, 0x86,\n                                                        0x9d, 0x9f, 0x1e, 0xe, 0x8b, 0xe6, 0xd8, 0xe6,\n                                                        0xf7, 0x68, 0xe6, 0x1, 0x82, 0x16, 0xf7, 0x8d,\n                                                        0xe6, 0x31, 0x6, 0xab, 0xd8, 0x5, 0xf7, 0x80,\n                                                        0x6, 0xae, 0x3e, 0x5, 0x35, 0x30, 0xf7, 0x86,\n                                                        0xe6, 0x52, 0x6, 0xfb, 0x62, 0xf8, 0x6b, 0x5,\n                                                        0xfb, 0x90, 0x30, 0xf7, 0x15, 0x6, 0xfb, 0x3f,\n                                                        0xfc, 0x10, 0x5, 0x4e, 0x6, 0xf7, 0x7c, 0xf7,\n                                                        0x3c, 0x15, 0xdb, 0xf7, 0x40, 0xd7, 0xfb, 0x40,\n                                                        0x5, 0xe, 0x8b, 0xe6, 0xf7, 0x2e, 0xe6, 0xf7,\n                                                        0x1b, 0xe6, 0x12, 0xf7, 0x2, 0xeb, 0xf7, 0x7f,\n                                                        0xea, 0x4e, 0xeb, 0x13, 0xf4, 0xa7, 0x16, 0xf7,\n                                                        0xc4, 0x6, 0xf7, 0x49, 0xc5, 0xcf, 0xeb, 0xb8,\n                                                        0x78, 0xb5, 0x3f, 0xb7, 0x1f, 0x13, 0xf8, 0xb2,\n                                                        0xa8, 0xa0, 0xb4, 0xb7, 0x1a, 0xcd, 0x5a, 0xe2,\n                                                        0xfb, 0x2d, 0x1e, 0xfb, 0xc6, 0x30, 0xdd, 0xfc,\n                                                        0x10, 0x39, 0x6, 0xf7, 0x46, 0xf7, 0x89, 0x15,\n                                                        0xf7, 0x1b, 0xf7, 0x12, 0x7, 0xe6, 0x9d, 0x67,\n                                                        0x6e, 0x4d, 0x3e, 0x83, 0x6b, 0x1f, 0xfb, 0x12,\n                                                        0xfb, 0x89, 0x15, 0xf7, 0x2e, 0xf7, 0x12, 0x7,\n                                                        0x13, 0xf4, 0xa4, 0xf7, 0xa, 0x8a, 0x3b, 0x4a,\n                                                        0x55, 0x83, 0x32, 0x1f, 0xe, 0x79, 0xe7, 0xf8,\n                                                        0x33, 0xe6, 0x1, 0xaa, 0xec, 0xf7, 0xed, 0xeb,\n                                                        0x3, 0xf8, 0x95, 0xf7, 0x20, 0x15, 0x74, 0x6a,\n                                                        0x40, 0x60, 0x37, 0x1b, 0xfb, 0x1c, 0x52, 0xf3,\n                                                        0xf5, 0xf7, 0x2e, 0xf7, 0x8, 0xbe, 0xd6, 0xc1,\n                                                        0xc1, 0x77, 0x70, 0xb9, 0x1f, 0x22, 0xeb, 0xf7,\n                                                        0x87, 0x2b, 0x61, 0x7, 0x95, 0x7d, 0x55, 0xab,\n                                                        0x34, 0x1b, 0xfb, 0x3a, 0xfb, 0xd, 0xfb, 0x10,\n                                                        0xfb, 0x3f, 0xfb, 0x8, 0xcf, 0xfb, 0x4f, 0xf7,\n                                                        0x75, 0xda, 0xe0, 0x90, 0xd1, 0xdb, 0x1f, 0x8c,\n                                                        0x8a, 0x5, 0xe, 0x32, 0xa, 0xf0, 0xeb, 0xf7,\n                                                        0xaf, 0xf1, 0x3, 0x9d, 0x16, 0xf7, 0x87, 0x6,\n                                                        0xf7, 0x30, 0xf7, 0x39, 0xce, 0xf7, 0x75, 0xf7,\n                                                        0x47, 0xfb, 0x9, 0xe6, 0xfb, 0x45, 0x1f, 0xfb,\n                                                        0xa2, 0x7a, 0xa, 0x6, 0xf7, 0x47, 0x16, 0xf8,\n                                                        0x10, 0x7, 0xf7, 0x90, 0xaa, 0x39, 0x26, 0xfb,\n                                                        0x1d, 0x41, 0x4f, 0xfb, 0x65, 0x1f, 0xe, 0x8b,\n                                                        0xe6, 0x30, 0xf7, 0x58, 0xb8, 0xe5, 0xac, 0xf7,\n                                                        0x5a, 0x30, 0xe6, 0x12, 0xf7, 0x7, 0xef, 0xf7,\n                                                        0x3, 0xee, 0xb6, 0xee, 0x13, 0x77, 0xb1, 0x16,\n                                                        0xf8, 0xa5, 0xf7, 0x58, 0x28, 0x6, 0x13, 0xaf,\n                                                        0x22, 0xfb, 0x91, 0xf7, 0x2a, 0xf7, 0x3, 0x4a,\n                                                        0xee, 0xf7, 0x70, 0x28, 0x4a, 0xfb, 0x3, 0xf7,\n                                                        0x20, 0xf7, 0x91, 0x7, 0x13, 0xb7, 0x20, 0xee,\n                                                        0xf7, 0x5a, 0xfc, 0xa5, 0x7, 0x13, 0xaf, 0x30,\n                                                        0xd8, 0xfc, 0x10, 0x3e, 0x7, 0xe, 0x8b, 0xe6,\n                                                        0xf7, 0x28, 0xe6, 0xae, 0xf7, 0x58, 0x31, 0xe5,\n                                                        0x90, 0x77, 0x12, 0xf7, 0x6, 0xed, 0xf7, 0x8,\n                                                        0xed, 0xb2, 0xef, 0x13, 0xd7, 0xad, 0x16, 0xf7,\n                                                        0xd5, 0xe6, 0xfb, 0x23, 0xf7, 0x28, 0xf7, 0x8,\n                                                        0x4b, 0xed, 0xf7, 0x70, 0x29, 0x4a, 0xfb, 0x8,\n                                                        0xf7, 0x21, 0xf7, 0x91, 0x6, 0x13, 0xe7, 0x21,\n                                                        0xef, 0x7, 0x13, 0xcf, 0xf7, 0x5d, 0x7, 0x13,\n                                                        0xd7, 0xfc, 0xa7, 0x2b, 0x6, 0xdb, 0x8c, 0x5,\n                                                        0xfc, 0x10, 0x3b, 0x7, 0xe, 0x79, 0xe9, 0xf1,\n                                                        0xea, 0xf7, 0x6c, 0xe6, 0x1, 0x99, 0xed, 0xf7,\n                                                        0xc7, 0xed, 0x3, 0x46, 0xa, 0xda, 0xf7, 0x17,\n                                                        0xf7, 0x21, 0xe6, 0xc9, 0xed, 0x41, 0xa, 0xfb,\n                                                        0x5, 0xfb, 0x4d, 0xfb, 0x62, 0xf7, 0x33, 0x2d,\n                                                        0xf7, 0x36, 0x58, 0xa, 0xe, 0x8b, 0xe6, 0xf7,\n                                                        0x23, 0xe6, 0xf7, 0x26, 0xe6, 0x1, 0xec, 0xe8,\n                                                        0xf7, 0x70, 0xe8, 0x3, 0x9f, 0x16, 0xf7, 0x8c,\n                                                        0xe6, 0x3d, 0xf7, 0x23, 0xf7, 0x70, 0xfb, 0x23,\n                                                        0x3e, 0x30, 0xf7, 0x8b, 0xe6, 0x3e, 0xf8, 0x10,\n                                                        0xd8, 0xe6, 0xfb, 0x88, 0x30, 0xd5, 0xfb, 0x26,\n                                                        0xfb, 0x70, 0xf7, 0x26, 0xd7, 0xe6, 0xfb, 0x8a,\n                                                        0x30, 0xd8, 0xfc, 0x10, 0x3e, 0x6, 0xe, 0x32,\n                                                        0xa, 0xf7, 0x8f, 0xf0, 0x60, 0xa, 0xe6, 0xfb,\n                                                        0x3f, 0xf8, 0x10, 0x74, 0xa, 0xfc, 0x10, 0xfb,\n                                                        0x42, 0x6, 0xe, 0x79, 0xe5, 0xf8, 0x22, 0xe7,\n                                                        0x1, 0x9d, 0xed, 0xf7, 0x85, 0xeb, 0x3, 0x9d,\n                                                        0xbd, 0x15, 0x7a, 0xab, 0xef, 0x58, 0xf5, 0x1b,\n                                                        0xf7, 0x12, 0xd2, 0xd5, 0xf7, 0x1f, 0x1f, 0xf7,\n                                                        0xa7, 0xf7, 0x15, 0xe7, 0xfc, 0x24, 0x2f, 0xf7,\n                                                        0x43, 0xfb, 0xa8, 0x7, 0x49, 0x80, 0x53, 0x2e,\n                                                        0x3d, 0x50, 0x78, 0xa, 0x32, 0xa, 0xe9, 0xee,\n                                                        0x3, 0x96, 0x16, 0xf7, 0x9c, 0xe6, 0x39, 0xf7,\n                                                        0x2, 0x6, 0xc6, 0xc0, 0xcf, 0x34, 0xc5, 0x2a,\n                                                        0xbe, 0x45, 0x19, 0xf7, 0x34, 0xe6, 0x20, 0x6,\n                                                        0x5d, 0xce, 0x4c, 0xe1, 0x54, 0xcf, 0xf7, 0x44,\n                                                        0xf7, 0x33, 0x18, 0xcf, 0xe6, 0xfb, 0x86, 0x30,\n                                                        0xb6, 0x6, 0xfb, 0x3e, 0xfb, 0x2d, 0x5, 0xf7,\n                                                        0x2d, 0xda, 0xe6, 0xfb, 0x99, 0x7a, 0xa, 0x7,\n                                                        0xe, 0x32, 0xa, 0xf7, 0x17, 0xec, 0xf7, 0x86,\n                                                        0xee, 0x3, 0xa9, 0x16, 0xf8, 0xaf, 0xf7, 0x92,\n                                                        0x28, 0xfb, 0x37, 0xfb, 0x86, 0xf8, 0x10, 0xf7,\n                                                        0x14, 0xe6, 0xfb, 0xda, 0x30, 0xf0, 0xfc, 0x10,\n                                                        0x26, 0x6, 0xe, 0x32, 0xa, 0xd2, 0xe7, 0xf7,\n                                                        0xab, 0xe7, 0x3, 0x89, 0x16, 0xf7, 0x90, 0xe6,\n                                                        0x2c, 0x6, 0x9b, 0xf7, 0xce, 0xf1, 0xfb, 0xa2,\n                                                        0x5, 0xc6, 0x6, 0xf4, 0xf7, 0x9f, 0x96, 0xfb,\n                                                        0xcb, 0x5, 0x32, 0x30, 0xf7, 0x86, 0xe6, 0x4d,\n                                                        0x6, 0x81, 0xf8, 0x10, 0x5, 0xd4, 0xe6, 0xfb,\n                                                        0x52, 0x6, 0x20, 0xfb, 0xac, 0x25, 0xf7, 0xac,\n                                                        0x5, 0xfb, 0x5f, 0x30, 0xda, 0x6, 0x7b, 0xfc,\n                                                        0x10, 0x5, 0x4a, 0x6, 0xe, 0x7f, 0xe8, 0xf8,\n                                                        0x18, 0xe8, 0x1, 0xd8, 0xe8, 0xf7, 0x9a, 0xe5,\n                                                        0x3, 0x8a, 0x7f, 0x15, 0xf7, 0x8e, 0xe8, 0x3c,\n                                                        0xf7, 0xd1, 0x6, 0xf7, 0x9a, 0xfc, 0x2e, 0x5,\n                                                        0xe5, 0xf8, 0x75, 0xda, 0xe8, 0xfb, 0x96, 0x2e,\n                                                        0xe0, 0xfb, 0xc5, 0x6, 0xfb, 0x8b, 0xf8, 0x22,\n                                                        0x5, 0xfb, 0x4a, 0x2e, 0xd9, 0xfc, 0x18, 0x3d,\n                                                        0x6, 0xe, 0x79, 0xe7, 0xf8, 0x30, 0xe9, 0x1,\n                                                        0xa1, 0xee, 0xf7, 0xfd, 0xeb, 0x3, 0xa1, 0xf7,\n                                                        0xab, 0x15, 0xfb, 0x5c, 0xf7, 0x25, 0x2a, 0xf7,\n                                                        0x1a, 0xf2, 0xf7, 0x42, 0xd5, 0xf7, 0x76, 0xf7,\n                                                        0x21, 0x2f, 0xf7, 0x31, 0xfb, 0x4d, 0xfb, 0x42,\n                                                        0x22, 0xfb, 0x25, 0xfb, 0x30, 0x1e, 0xeb, 0x8e,\n                                                        0x15, 0xe9, 0xca, 0xf7, 0x2, 0xf7, 0xc, 0xf7,\n                                                        0x1d, 0xb9, 0xfb, 0x16, 0x44, 0x38, 0x5a, 0xfb,\n                                                        0x14, 0xfb, 0x1a, 0xfb, 0xd, 0x4d, 0xf7, 0x0,\n                                                        0xef, 0x1e, 0xe, 0x8b, 0xe6, 0xef, 0xe7, 0xf7,\n                                                        0x50, 0xe6, 0x1, 0xf7, 0x13, 0xed, 0xf7, 0x7d,\n                                                        0xec, 0x3, 0xb7, 0x16, 0xf7, 0xca, 0xe6, 0xfb,\n                                                        0x15, 0xef, 0x6, 0xf7, 0x8d, 0xdc, 0xbd, 0xf7,\n                                                        0x17, 0xf7, 0x5f, 0xfb, 0x36, 0x78, 0xfb, 0xf1,\n                                                        0x91, 0x1f, 0x7a, 0xa, 0x7, 0xf7, 0x49, 0xf7,\n                                                        0x54, 0x15, 0xf7, 0x50, 0x7, 0xf7, 0x20, 0x84,\n                                                        0xe8, 0x99, 0x24, 0x1a, 0x26, 0x25, 0x9b, 0xfb,\n                                                        0x17, 0x84, 0x1e, 0xe, 0xfb, 0x9, 0x76, 0xb8,\n                                                        0xf7, 0x49, 0xf8, 0x24, 0xe7, 0x12, 0xa6, 0xeb,\n                                                        0xf7, 0xf7, 0xea, 0x17, 0xf7, 0xa, 0x46, 0x15,\n                                                        0xb6, 0x46, 0x5, 0xab, 0xc7, 0xa5, 0x98, 0xaf,\n                                                        0x1b, 0xa9, 0xa4, 0x80, 0x81, 0xa4, 0x1f, 0x81,\n                                                        0xa3, 0xa4, 0x82, 0xa8, 0x1b, 0xc2, 0xaa, 0xa6,\n                                                        0xb8, 0xb9, 0x1f, 0x51, 0xca, 0x5, 0x68, 0x66,\n                                                        0x7e, 0x83, 0x79, 0x1b, 0x73, 0x70, 0x9b, 0xa1,\n                                                        0x6b, 0x1f, 0xf7, 0x26, 0xb1, 0xca, 0xf7, 0xf,\n                                                        0xf7, 0x10, 0x1a, 0xde, 0x5a, 0xf7, 0x6b, 0xfb,\n                                                        0x75, 0xfb, 0x1f, 0xfb, 0x19, 0x27, 0xfb, 0x56,\n                                                        0xfb, 0x20, 0xd1, 0x2f, 0xf0, 0x62, 0x1e, 0x40,\n                                                        0xf7, 0xa6, 0x15, 0xf7, 0x2e, 0xf6, 0xba, 0xd0,\n                                                        0x1e, 0x13, 0x58, 0xf7, 0xb, 0xc7, 0x24, 0x25,\n                                                        0x1f, 0x13, 0x50, 0xfb, 0x2c, 0x21, 0x60, 0x41,\n                                                        0x3b, 0x2c, 0xbc, 0xf7, 0x2a, 0x1e, 0xe, 0x8b,\n                                                        0xe6, 0xf7, 0x18, 0xe6, 0xf7, 0x31, 0xe6, 0x1,\n                                                        0xec, 0xef, 0xf7, 0x7a, 0xee, 0x3, 0x97, 0x16,\n                                                        0xf7, 0x9d, 0xe6, 0x3b, 0xf7, 0x18, 0xde, 0x6,\n                                                        0xe4, 0xfb, 0x9, 0xb6, 0x4d, 0xa9, 0x5f, 0x8,\n                                                        0xf7, 0x25, 0xe6, 0x33, 0x6, 0xfb, 0x4, 0xf7,\n                                                        0x2a, 0x5, 0xf6, 0x9d, 0xab, 0xcf, 0xd1, 0x1a,\n                                                        0xf7, 0x8, 0x27, 0xbc, 0xfb, 0x8, 0x1e, 0xfb,\n                                                        0xba, 0x30, 0xdc, 0xfc, 0x10, 0x36, 0x6, 0xf7,\n                                                        0x4d, 0xf7, 0x73, 0x15, 0xf7, 0x31, 0x7, 0xf7,\n                                                        0x49, 0xbc, 0x92, 0x39, 0x31, 0x39, 0x93, 0xfb,\n                                                        0x28, 0x1f, 0xe, 0x8b, 0xe3, 0xf8, 0x17, 0xe3,\n                                                        0x94, 0x77, 0x12, 0xd3, 0xe6, 0x41, 0xe7, 0xf7,\n                                                        0x80, 0xe6, 0x45, 0xe5, 0x13, 0xd2, 0xd3, 0x16,\n                                                        0xe6, 0xae, 0x6, 0x81, 0x9f, 0xb9, 0x72, 0xd5,\n                                                        0x1b, 0xf7, 0xe, 0xf2, 0xcc, 0xf5, 0xf7, 0x24,\n                                                        0xfb, 0x2a, 0x87, 0x21, 0x9a, 0x1f, 0x13, 0xcc,\n                                                        0x72, 0x8f, 0x49, 0x95, 0xc5, 0x1a, 0xb5, 0xb9,\n                                                        0xae, 0xdc, 0xb2, 0xb0, 0x88, 0x7d, 0xac, 0x1e,\n                                                        0x2e, 0xe6, 0x7, 0x13, 0xb4, 0xf7, 0x63, 0x30,\n                                                        0x76, 0x7, 0x13, 0xca, 0x99, 0x6a, 0x64, 0x89,\n                                                        0x62, 0x1b, 0xfb, 0x22, 0x42, 0x32, 0x3d, 0xfb,\n                                                        0x22, 0xf7, 0x1d, 0x81, 0xf7, 0x6, 0x82, 0x1f,\n                                                        0xbd, 0x87, 0xbb, 0x78, 0x62, 0x1a, 0x5b, 0x64,\n                                                        0x68, 0x2b, 0x1e, 0x13, 0xd4, 0x58, 0x5c, 0x9b,\n                                                        0xa3, 0x61, 0x1f, 0xd3, 0x30, 0x7, 0xe, 0x32,\n                                                        0xa, 0xb4, 0xee, 0xf7, 0x3, 0xed, 0xf7, 0x3,\n                                                        0xee, 0x14, 0x38, 0xf7, 0xe, 0x16, 0xf7, 0xe6,\n                                                        0xe6, 0xfb, 0x3, 0xf8, 0x10, 0xf7, 0x3, 0xfb,\n                                                        0x5, 0xee, 0xf7, 0x60, 0xfc, 0x9a, 0xfb, 0x60,\n                                                        0xee, 0xf7, 0x5, 0xf7, 0x3, 0xfc, 0x10, 0xfb,\n                                                        0x15, 0x6, 0xe, 0x79, 0xe7, 0xf8, 0x20, 0xe7,\n                                                        0x1, 0xde, 0xe9, 0xf7, 0x8b, 0xe9, 0x3, 0x8f,\n                                                        0xf8, 0x6a, 0x15, 0xda, 0xfb, 0xa2, 0x6, 0xfb,\n                                                        0x28, 0xd2, 0x45, 0xf7, 0x25, 0xf7, 0x13, 0xe7,\n                                                        0xc4, 0xf7, 0x21, 0x1e, 0xf7, 0xb6, 0xd9, 0xe7,\n                                                        0xfb, 0x96, 0x2f, 0xe1, 0xfb, 0x9a, 0x7, 0x35,\n                                                        0x73, 0x5b, 0x24, 0xfb, 0x4, 0x83, 0xcb, 0xc0,\n                                                        0x1e, 0xf7, 0xab, 0xdf, 0xe7, 0xfb, 0x95, 0x7,\n                                                        0xe, 0xa0, 0x76, 0xf8, 0x6b, 0xe6, 0x1, 0x7e,\n                                                        0xf7, 0x8a, 0xf7, 0x1a, 0xf7, 0x8a, 0x3, 0xf7,\n                                                        0x90, 0x16, 0xeb, 0x6, 0xf7, 0x58, 0xf8, 0x6b,\n                                                        0x5, 0xd0, 0xe6, 0xfb, 0x8a, 0x30, 0xde, 0x6,\n                                                        0xfb, 0x28, 0xfb, 0xf4, 0xfb, 0x1f, 0xf7, 0xf4,\n                                                        0x5, 0xd1, 0xe6, 0xfb, 0x8a, 0x30, 0xd8, 0x6,\n                                                        0xe, 0xa0, 0x76, 0xf8, 0x6b, 0xe6, 0x1, 0xed,\n                                                        0x16, 0xde, 0x6, 0xf7, 0xa, 0xf7, 0xbc, 0xf7,\n                                                        0xc, 0xfb, 0xbc, 0x5, 0xdd, 0x6, 0xcf, 0xf8,\n                                                        0x6b, 0x5, 0xbc, 0xe6, 0xfb, 0x78, 0x30, 0xe1,\n                                                        0x6, 0x69, 0xfb, 0xab, 0x21, 0xf7, 0x94, 0x5,\n                                                        0x45, 0x6, 0x23, 0xfb, 0x96, 0x67, 0xf7, 0xad,\n                                                        0x5, 0xe0, 0xe6, 0xfb, 0x79, 0x30, 0xbc, 0x6,\n                                                        0xe, 0x32, 0xa, 0x97, 0x16, 0xf7, 0x8c, 0xe6,\n                                                        0x45, 0x6, 0xf7, 0x1, 0xf7, 0x1b, 0xf7, 0x1,\n                                                        0xfb, 0x1b, 0x5, 0x4d, 0x30, 0xf7, 0x86, 0xe6,\n                                                        0x47, 0x6, 0xfb, 0x37, 0xf7, 0x5f, 0xf7, 0x23,\n                                                        0xf7, 0x45, 0x5, 0xd1, 0xe6, 0xfb, 0x77, 0x30,\n                                                        0xbb, 0x6, 0x34, 0xfb, 0x0, 0x32, 0xf7, 0x0,\n                                                        0x5, 0xb7, 0xe6, 0xfb, 0x7a, 0x30, 0xd2, 0x6,\n                                                        0xf7, 0x25, 0xfb, 0x45, 0xfb, 0x39, 0xfb, 0x5f,\n                                                        0x5, 0x47, 0x6, 0xe, 0x32, 0xa, 0xf7, 0x8e,\n                                                        0xec, 0x3, 0xf7, 0x12, 0x16, 0xf7, 0xec, 0xe6,\n                                                        0xfb, 0xf, 0xf7, 0x1c, 0x6, 0xf7, 0x35, 0xf7,\n                                                        0x88, 0x5, 0xdb, 0xe6, 0xfb, 0x81, 0x30, 0xc2,\n                                                        0x6, 0x22, 0xfb, 0x31, 0x22, 0xf7, 0x31, 0x5,\n                                                        0xc0, 0xe6, 0xfb, 0x82, 0x30, 0xda, 0x6, 0xf7,\n                                                        0x34, 0xfb, 0x88, 0x5, 0xfb, 0x1c, 0xfb, 0x10,\n                                                        0x7, 0xe, 0x32, 0xa, 0xcc, 0xed, 0xf7, 0xaa,\n                                                        0xec, 0x3, 0xc8, 0x16, 0xf8, 0x71, 0xf7, 0x70,\n                                                        0x2a, 0xfb, 0x15, 0xfb, 0x8d, 0x6, 0xf7, 0xd6,\n                                                        0xf8, 0x2a, 0x5, 0xcc, 0xfc, 0x55, 0xfb, 0x61,\n                                                        0xed, 0xf7, 0x6, 0xf7, 0x6c, 0x7, 0xfb, 0xd2,\n                                                        0xfc, 0x25, 0x5, 0xe, 0x25, 0xe7, 0xf8, 0xaa,\n                                                        0xe7, 0x1, 0xf7, 0x4d, 0xed, 0x3, 0xf7, 0x4d,\n                                                        0x25, 0x15, 0xf7, 0x7a, 0xe7, 0xfb, 0x18, 0xf8,\n                                                        0xaa, 0xf7, 0x18, 0xe7, 0xfb, 0x7a, 0x6, 0xe,\n                                                        0x53, 0x76, 0xf9, 0x53, 0x77, 0x1, 0xf8, 0x43,\n                                                        0x3e, 0x15, 0xd2, 0xa8, 0xfb, 0xe1, 0xf9, 0x36,\n                                                        0x44, 0x6e, 0x5, 0xe, 0x25, 0xe7, 0xf8, 0xaa,\n                                                        0xe7, 0x1, 0xf7, 0xd2, 0xec, 0x3, 0xf7, 0x4d,\n                                                        0x81, 0x15, 0x2f, 0xf7, 0x7a, 0xf9, 0x62, 0xfb,\n                                                        0x7a, 0x2f, 0xf7, 0x19, 0xfc, 0xaa, 0x7, 0xe,\n                                                        0xf7, 0xa3, 0x76, 0xf8, 0x2, 0x77, 0x1, 0xf7,\n                                                        0x0, 0xf7, 0x8e, 0x15, 0xd3, 0xb1, 0xce, 0xcc,\n                                                        0xc1, 0xd8, 0xc2, 0x3a, 0xcb, 0x4e, 0xd3, 0x66,\n                                                        0x8, 0xcb, 0x7, 0x30, 0xf7, 0x2, 0x6c, 0xc2,\n                                                        0x66, 0xf7, 0x1c, 0x8, 0x47, 0x6, 0x6b, 0xfb,\n                                                        0x14, 0x68, 0x45, 0x31, 0x23, 0x8, 0xe, 0xfb,\n                                                        0x11, 0xbd, 0x1, 0x40, 0x4, 0x59, 0xf8, 0xec,\n                                                        0xbd, 0x7, 0xe, 0xf8, 0xa5, 0x76, 0xf7, 0x2d,\n                                                        0x77, 0x1, 0xf7, 0x3c, 0xf8, 0xcd, 0x15, 0xf7,\n                                                        0x89, 0x4e, 0x9d, 0xbb, 0xfb, 0x7b, 0xf4, 0x5,\n                                                        0xe, 0x7c, 0xe9, 0x3a, 0xe9, 0xf1, 0xed, 0xd0,\n                                                        0xe8, 0x34, 0xa, 0x13, 0xbc, 0xf4, 0xf7, 0xcf,\n                                                        0x15, 0x9a, 0xa8, 0xe6, 0xaa, 0xd3, 0x1b, 0xbe,\n                                                        0xb4, 0x75, 0x5c, 0x1f, 0x7f, 0x7, 0x92, 0x67,\n                                                        0x68, 0x90, 0x6c, 0x1b, 0xfb, 0x33, 0x2b, 0x48,\n                                                        0x2d, 0x2d, 0xeb, 0x57, 0xed, 0xc8, 0xc9, 0x9e,\n                                                        0xb4, 0xb3, 0x1f, 0x13, 0x7a, 0x5c, 0xf7, 0x46,\n                                                        0xe9, 0x7, 0x13, 0x7c, 0x38, 0xf7, 0x3a, 0x6,\n                                                        0xf7, 0x11, 0x6e, 0xd2, 0xfb, 0x29, 0x31, 0x28,\n                                                        0x67, 0x75, 0x58, 0x1e, 0xf7, 0xd7, 0xfb, 0x83,\n                                                        0x15, 0x13, 0xbc, 0x60, 0x5b, 0x4f, 0x68, 0x47,\n                                                        0x1b, 0x60, 0x62, 0x9e, 0xab, 0xb8, 0xd7, 0x9e,\n                                                        0xc6, 0xc6, 0xb6, 0x86, 0x89, 0xa2, 0x1f, 0xe,\n                                                        0x7c, 0xe8, 0x3b, 0xe9, 0xf7, 0x9d, 0xe7, 0xde,\n                                                        0xe9, 0x12, 0x93, 0xf7, 0x4c, 0x28, 0xee, 0xf7,\n                                                        0xbf, 0xf0, 0x13, 0x7a, 0x94, 0x89, 0x15, 0xf7,\n                                                        0x4b, 0xb1, 0x6, 0x13, 0xba, 0x68, 0xbb, 0xc2,\n                                                        0x7b, 0xc0, 0x1b, 0xf7, 0x12, 0xf7, 0xa, 0xea,\n                                                        0xf7, 0x1f, 0xf7, 0x1b, 0xfb, 0x7, 0xea, 0xfb,\n                                                        0x12, 0x55, 0x53, 0x7d, 0x67, 0x5a, 0x1f, 0xf7,\n                                                        0x77, 0xfb, 0x4c, 0x2d, 0x7, 0x13, 0x76, 0xe0,\n                                                        0xfc, 0x4c, 0x37, 0x6, 0xf7, 0x48, 0xf7, 0x10,\n                                                        0x15, 0xd6, 0xb8, 0xcd, 0xf7, 0x0, 0xf7, 0x0,\n                                                        0xb4, 0x34, 0x59, 0x1e, 0x13, 0xba, 0x3e, 0x4b,\n                                                        0x4a, 0x34, 0x5d, 0x22, 0xa6, 0xf7, 0x3, 0x1e,\n                                                        0xe, 0x7c, 0xe9, 0xf7, 0xb2, 0xe9, 0x1, 0xba,\n                                                        0xeb, 0xf7, 0xab, 0xeb, 0x3, 0xf8, 0x3a, 0xf7,\n                                                        0x8b, 0x15, 0xeb, 0xf7, 0x68, 0x2b, 0x78, 0x6,\n                                                        0x98, 0x68, 0x65, 0x91, 0x65, 0x1b, 0xfb, 0x49,\n                                                        0x38, 0xfb, 0x11, 0xfb, 0x4, 0xfb, 0x2b, 0xf7,\n                                                        0x11, 0x35, 0xf7, 0x12, 0xeb, 0xe4, 0xb4, 0xc2,\n                                                        0xd0, 0x1f, 0x55, 0xd5, 0x5, 0x62, 0x52, 0x54,\n                                                        0x68, 0x3c, 0x1b, 0x39, 0x39, 0xbb, 0xe9, 0xdc,\n                                                        0xcb, 0xca, 0xf3, 0xb2, 0xb3, 0x81, 0x7a, 0xab,\n                                                        0x1f, 0xe, 0x7c, 0xe9, 0x3a, 0xe9, 0xf7, 0x9d,\n                                                        0xe9, 0xdc, 0xe9, 0x12, 0x99, 0xec, 0xf7, 0xbe,\n                                                        0xec, 0x2a, 0xf7, 0x44, 0x13, 0x7a, 0xf8, 0x2f,\n                                                        0x89, 0x15, 0xf7, 0x42, 0xe9, 0x3c, 0x6, 0x13,\n                                                        0x7c, 0xf8, 0xaa, 0xfb, 0x72, 0x2d, 0xf7, 0x11,\n                                                        0xfb, 0x17, 0x7, 0xad, 0x65, 0x52, 0x9b, 0x53,\n                                                        0x1b, 0xfb, 0x24, 0x27, 0xfb, 0x3, 0xfb, 0xe,\n                                                        0xfb, 0x11, 0xf4, 0xfb, 0x0, 0xf7, 0x23, 0x1f,\n                                                        0x13, 0xbc, 0xc2, 0xc1, 0x9c, 0xab, 0xb3, 0x1f,\n                                                        0xfb, 0xc0, 0xf7, 0x4e, 0x15, 0xd9, 0xcd, 0xc6,\n                                                        0xe2, 0xe6, 0xc1, 0x4c, 0x3e, 0xfb, 0xd, 0xfb,\n                                                        0x7, 0x7a, 0x69, 0x3a, 0x47, 0xc8, 0xdb, 0x1e,\n                                                        0xe, 0x7c, 0xe8, 0xee, 0xea, 0xe3, 0xe9, 0x1,\n                                                        0xf7, 0x22, 0xf7, 0x45, 0x15, 0xf8, 0x22, 0x6,\n                                                        0xf7, 0x3a, 0x9f, 0x29, 0xf7, 0x3, 0xfb, 0x37,\n                                                        0x1b, 0xfb, 0xe, 0xfb, 0x1f, 0x3c, 0xfb, 0x32,\n                                                        0xfb, 0xe, 0xe4, 0xfb, 0x2, 0xf7, 0x41, 0xe8,\n                                                        0xe7, 0xaa, 0xb6, 0xd7, 0x1f, 0x5f, 0xda, 0x5,\n                                                        0x6c, 0x4a, 0x44, 0x6e, 0x3d, 0x1b, 0xfb, 0x10,\n                                                        0x6b, 0xcc, 0xad, 0x86, 0x1f, 0x8d, 0xea, 0x15,\n                                                        0xc5, 0xa0, 0xce, 0xa9, 0xc9, 0x1b, 0xc9, 0xc9,\n                                                        0x78, 0x46, 0x9e, 0x1f, 0xe, 0x7c, 0xa, 0xe8,\n                                                        0xeb, 0xe7, 0x1, 0xf7, 0x44, 0xf5, 0x3, 0xcf,\n                                                        0x16, 0xf8, 0x50, 0xe9, 0xfb, 0x7a, 0xf7, 0x8f,\n                                                        0xf7, 0x7a, 0xe8, 0xfb, 0x7a, 0xae, 0x6, 0xb1,\n                                                        0x8d, 0xa2, 0xdb, 0xbd, 0xa9, 0x84, 0x80, 0xb9,\n                                                        0x1e, 0xb5, 0xe7, 0x5, 0x96, 0x35, 0x4d, 0x92,\n                                                        0x5a, 0x1b, 0x24, 0x53, 0x51, 0x24, 0x1f, 0x70,\n                                                        0xfb, 0x0, 0x2e, 0xf7, 0x0, 0xfb, 0x8f, 0xfb,\n                                                        0x0, 0x7, 0xe, 0xfb, 0x26, 0xe4, 0xf1, 0xe3,\n                                                        0xf7, 0x71, 0xe4, 0x3e, 0xe3, 0x69, 0xa, 0x13,\n                                                        0xec, 0x50, 0xa, 0xe9, 0xf2, 0x1f, 0xf7, 0xc3,\n                                                        0x7, 0x13, 0xea, 0xd7, 0xe4, 0xfb, 0x3c, 0x6e,\n                                                        0x6, 0x13, 0xdc, 0x5a, 0xa, 0xfb, 0x9, 0xee,\n                                                        0x36, 0xf7, 0x21, 0xc0, 0xbe, 0x94, 0xa7, 0xb1,\n                                                        0x1f, 0x67, 0x7, 0x51, 0x88, 0x5e, 0x42, 0xa,\n                                                        0x63, 0x33, 0x43, 0x44, 0xb7, 0xd2, 0x1e, 0xe,\n                                                        0x8b, 0xe9, 0xf7, 0x8b, 0xe8, 0xed, 0xe9, 0x12,\n                                                        0x91, 0xf7, 0x48, 0x2a, 0xec, 0xf7, 0x77, 0xec,\n                                                        0x13, 0xf4, 0x91, 0x16, 0xf7, 0x96, 0xe9, 0x3d,\n                                                        0xf7, 0x61, 0x6, 0xbd, 0xd5, 0xc2, 0x94, 0xa8,\n                                                        0x1b, 0xc3, 0x98, 0x6a, 0x69, 0x1f, 0xfb, 0x59,\n                                                        0x3d, 0x2d, 0xf7, 0x96, 0xe9, 0x38, 0xf7, 0x52,\n                                                        0x7, 0xd8, 0x71, 0xe5, 0xfb, 0x1f, 0x4e, 0x5b,\n                                                        0x75, 0x71, 0x59, 0x1e, 0xf7, 0x73, 0xfb, 0x48,\n                                                        0x2d, 0x7, 0x13, 0xec, 0xde, 0xfc, 0x4a, 0x6,\n                                                        0x13, 0xf4, 0x38, 0x6, 0xe, 0x8b, 0xea, 0xf7,\n                                                        0x92, 0xeb, 0xd1, 0xf7, 0x23, 0x12, 0xf7, 0x83,\n                                                        0xf7, 0x3, 0x29, 0xed, 0x13, 0xf0, 0xf7, 0x83,\n                                                        0xf8, 0x97, 0x79, 0xa, 0x6b, 0xa, 0xfb, 0x36,\n                                                        0xfd, 0x26, 0x15, 0xf8, 0x52, 0xea, 0xfb, 0x41,\n                                                        0xf7, 0xf2, 0xfb, 0x7f, 0x2b, 0x6, 0x13, 0xe8,\n                                                        0xf7, 0x1d, 0xfb, 0x92, 0xfb, 0x43, 0x6, 0xe,\n                                                        0xfb, 0x26, 0xe7, 0xf8, 0x37, 0xe6, 0xc5, 0xf7,\n                                                        0x24, 0x12, 0xf7, 0xf4, 0xf7, 0xa, 0x35, 0xf3,\n                                                        0x13, 0xf0, 0xf7, 0xf4, 0xf8, 0x96, 0x73, 0xa,\n                                                        0xfb, 0x6d, 0xfd, 0x49, 0x15, 0x73, 0x30, 0x5,\n                                                        0x81, 0xc2, 0xc4, 0x81, 0xc4, 0x1b, 0x13, 0xe8,\n                                                        0xf7, 0x63, 0x8c, 0xf7, 0x1b, 0xc6, 0x1f, 0xf8,\n                                                        0x2c, 0xfc, 0x2, 0x30, 0xf7, 0x9a, 0xfb, 0xcd,\n                                                        0x7, 0x46, 0x81, 0x66, 0x31, 0x55, 0x4d, 0x98,\n                                                        0x91, 0x6a, 0x1e, 0xe, 0x7c, 0xa, 0xe9, 0xe8,\n                                                        0xe9, 0x1, 0xec, 0xed, 0x3, 0x9c, 0x16, 0xf7,\n                                                        0x46, 0xf7, 0x3e, 0x6, 0xaf, 0xa2, 0xf7, 0xe,\n                                                        0x28, 0x5, 0x70, 0x2d, 0xf7, 0x94, 0xe9, 0xfb,\n                                                        0x0, 0x6, 0xfb, 0x41, 0xf7, 0x25, 0xf7, 0x37,\n                                                        0xf5, 0x5, 0xda, 0xe9, 0xfb, 0xb1, 0x2d, 0xd2,\n                                                        0x6, 0xfb, 0x1a, 0x39, 0x5, 0xf7, 0xff, 0xfb,\n                                                        0x46, 0x2d, 0xdb, 0xfc, 0x4a, 0x3b, 0x7, 0xe,\n                                                        0x8b, 0xe9, 0xf8, 0x4a, 0x40, 0xa, 0xf8, 0xa8,\n                                                        0xfb, 0x92, 0x2d, 0xf7, 0x2f, 0xfc, 0x4a, 0xfb,\n                                                        0x41, 0x6, 0xe, 0x90, 0xe9, 0xf7, 0x99, 0xe9,\n                                                        0x1, 0xc1, 0xe9, 0xf7, 0x3, 0xe6, 0xf7, 0x5,\n                                                        0xe7, 0x3, 0x73, 0x16, 0xf7, 0x8e, 0xe9, 0x3d,\n                                                        0xf7, 0x7b, 0x6, 0x9e, 0x9d, 0xa2, 0x9b, 0xa3,\n                                                        0x1b, 0xb1, 0x93, 0x6a, 0x77, 0x1f, 0xfb, 0xc7,\n                                                        0xf7, 0x38, 0xe9, 0x42, 0xf7, 0x73, 0x7, 0xad,\n                                                        0xa4, 0xa6, 0x94, 0x9c, 0x1b, 0xac, 0x96, 0x6d,\n                                                        0x81, 0x1f, 0xfb, 0xd4, 0xf7, 0x35, 0xe9, 0x46,\n                                                        0xf7, 0x72, 0x7, 0xd7, 0x5a, 0xc9, 0x38, 0x62,\n                                                        0x61, 0x79, 0x6c, 0x71, 0x1e, 0xb5, 0x72, 0x66,\n                                                        0x92, 0x73, 0x1b, 0x6c, 0x6d, 0x7f, 0x74, 0x78,\n                                                        0x1f, 0xa1, 0xfb, 0x40, 0x2d, 0xd9, 0xfb, 0x91,\n                                                        0x3d, 0x7, 0xe, 0x8b, 0xe9, 0xf7, 0x91, 0xe9,\n                                                        0x3b, 0xe8, 0x12, 0x98, 0xf7, 0x48, 0xf7, 0x75,\n                                                        0xea, 0x13, 0xb8, 0x9a, 0x16, 0xf7, 0x97, 0xe9,\n                                                        0x3a, 0xf7, 0x67, 0x6, 0xb7, 0xbd, 0xcf, 0x97,\n                                                        0xa9, 0x1b, 0xd1, 0x92, 0x55, 0x64, 0x1f, 0xfb,\n                                                        0x42, 0x46, 0x2d, 0xf7, 0x82, 0xe9, 0x41, 0xf7,\n                                                        0x42, 0x7, 0xf7, 0x12, 0x60, 0xc7, 0xfb, 0xc,\n                                                        0x52, 0x51, 0x79, 0x6f, 0x61, 0x1e, 0x13, 0xd0,\n                                                        0xac, 0xfb, 0x48, 0x2d, 0xde, 0xfb, 0x91, 0x3a,\n                                                        0x7, 0xe, 0x7c, 0xe9, 0xf7, 0xad, 0xe9, 0x4b,\n                                                        0xa, 0xa9, 0xf7, 0x6d, 0x15, 0xfb, 0x40, 0xf7,\n                                                        0x2f, 0x4f, 0xf7, 0x6, 0xf7, 0xe, 0xf7, 0x29,\n                                                        0xce, 0xf7, 0x39, 0xf7, 0x31, 0xfb, 0x18, 0xdb,\n                                                        0xfb, 0x1f, 0xfb, 0x1d, 0xfb, 0x18, 0x3b, 0xfb,\n                                                        0x31, 0x1e, 0xef, 0x16, 0xe2, 0xd6, 0xc3, 0xe9,\n                                                        0xe7, 0xdb, 0x50, 0x37, 0x28, 0x36, 0x64, 0x34,\n                                                        0x3c, 0x31, 0xb2, 0xee, 0x1e, 0xe, 0xfb, 0x22,\n                                                        0xe3, 0xd6, 0xe2, 0xf7, 0x89, 0xe3, 0x40, 0xe3,\n                                                        0x12, 0x9c, 0xf7, 0x43, 0x2c, 0xea, 0xf7, 0xbd,\n                                                        0xeb, 0x13, 0xda, 0x9c, 0x55, 0x15, 0x33, 0xf7,\n                                                        0xcc, 0xe3, 0xfb, 0x1d, 0xf7, 0xe, 0x7, 0x7d,\n                                                        0xa1, 0xc1, 0x6a, 0xd9, 0x1b, 0xf7, 0x1f, 0xef,\n                                                        0xed, 0xf7, 0xd, 0xf7, 0x28, 0xfb, 0x21, 0xcd,\n                                                        0x25, 0x56, 0x52, 0x7b, 0x6d, 0x63, 0x1f, 0x13,\n                                                        0xe6, 0xac, 0xfb, 0x46, 0x33, 0xde, 0xfc, 0x2b,\n                                                        0x7, 0x13, 0xda, 0xe6, 0xf7, 0xb8, 0x15, 0xf7,\n                                                        0x1, 0xf7, 0x4, 0x9e, 0xb4, 0xd9, 0xd1, 0x5e,\n                                                        0x38, 0x3c, 0x43, 0x58, 0x3e, 0x5f, 0xfb, 0x0,\n                                                        0xa4, 0xf4, 0x1e, 0xe, 0xf8, 0xda, 0x55, 0x15,\n                                                        0x33, 0xfb, 0xcc, 0xe3, 0xf7, 0x1d, 0xf7, 0xe,\n                                                        0x7, 0x7d, 0x75, 0x55, 0x6a, 0x3d, 0x1b, 0xfb,\n                                                        0x1f, 0x27, 0xed, 0xf7, 0xd, 0xf7, 0x28, 0xf7,\n                                                        0x21, 0xcd, 0xf1, 0xc0, 0xc4, 0x7b, 0x6d, 0xb3,\n                                                        0x1f, 0xac, 0xf7, 0x46, 0x33, 0x38, 0xfc, 0x2b,\n                                                        0x7, 0x30, 0xf7, 0xb8, 0x15, 0xf7, 0x1, 0xfb,\n                                                        0x4, 0x9e, 0x62, 0x3d, 0x45, 0x5e, 0x38, 0x3c,\n                                                        0xd3, 0x58, 0xd8, 0xb7, 0xf7, 0x0, 0xa4, 0xf4,\n                                                        0x1e, 0xe, 0x8b, 0xe9, 0xf7, 0x90, 0xe9, 0x3b,\n                                                        0xe9, 0x12, 0xf7, 0x28, 0xee, 0x13, 0xb0, 0xac,\n                                                        0x16, 0xf8, 0x21, 0xe9, 0xfb, 0x4b, 0xf7, 0x35,\n                                                        0x6, 0xae, 0xba, 0xd1, 0xd1, 0xd6, 0x1b, 0xa5,\n                                                        0x8f, 0x81, 0x71, 0x8e, 0x1f, 0xe9, 0x99, 0x5,\n                                                        0xb3, 0x89, 0x77, 0xd7, 0x22, 0x1b, 0x41, 0x4b,\n                                                        0x5e, 0x63, 0x55, 0x1f, 0x13, 0xd0, 0xd2, 0xfb,\n                                                        0x6a, 0x2d, 0xf7, 0x7, 0xfb, 0x90, 0xfb, 0x7,\n                                                        0x7, 0xe, 0x7a, 0xeb, 0xeb, 0xe3, 0x9b, 0xf7,\n                                                        0x48, 0x2b, 0xeb, 0x12, 0xcd, 0xed, 0x36, 0xe0,\n                                                        0x36, 0xea, 0xf7, 0x84, 0xee, 0x40, 0xea, 0x13,\n                                                        0xe8, 0x80, 0xcd, 0x7a, 0x15, 0xed, 0xad, 0x6,\n                                                        0x72, 0xb9, 0xc1, 0x82, 0xc2, 0x1b, 0xf7, 0xb,\n                                                        0xea, 0xc4, 0xe6, 0xf5, 0x21, 0x9f, 0x35, 0x91,\n                                                        0x1f, 0x13, 0xd3, 0x0, 0x2b, 0x93, 0x44, 0x91,\n                                                        0xb2, 0x1a, 0xb5, 0xe5, 0x90, 0xa2, 0xb7, 0xc2,\n                                                        0x80, 0x72, 0xa7, 0x1e, 0x13, 0xe5, 0x0, 0x5b,\n                                                        0xee, 0xf7, 0x48, 0x28, 0x69, 0x7, 0xa0, 0x6e,\n                                                        0x50, 0x98, 0x5c, 0x1b, 0x2e, 0x20, 0x64, 0x25,\n                                                        0xfb, 0x12, 0xf7, 0x2a, 0x81, 0xd6, 0x84, 0x1f,\n                                                        0x13, 0xe8, 0x80, 0xaf, 0x88, 0xed, 0x8a, 0x63,\n                                                        0x1a, 0x69, 0x47, 0x79, 0x53, 0x44, 0x54, 0x96,\n                                                        0x9e, 0x73, 0x1e, 0x13, 0xe9, 0x0, 0xd0, 0x29,\n                                                        0x7, 0xe, 0x7c, 0xe6, 0xf7, 0x99, 0xe8, 0xf7,\n                                                        0x18, 0x77, 0x1, 0xf7, 0x11, 0xee, 0x3, 0xc4,\n                                                        0xf7, 0xe5, 0x15, 0xcf, 0xfb, 0x57, 0x6, 0xfb,\n                                                        0x1d, 0xf7, 0x0, 0x77, 0xd7, 0xdc, 0xdd, 0xab,\n                                                        0xa6, 0xd1, 0x1e, 0x7a, 0xe8, 0x5, 0x7a, 0x65,\n                                                        0xfb, 0x0, 0x5f, 0x47, 0x1b, 0x39, 0x86, 0xb7,\n                                                        0xb6, 0x1f, 0xf7, 0x42, 0xf7, 0x9e, 0xe8, 0xfb,\n                                                        0x9e, 0xf7, 0x18, 0x28, 0xfb, 0x18, 0x47, 0x7,\n                                                        0xe, 0x7c, 0xe7, 0x3c, 0xe9, 0xf7, 0x91, 0xe9,\n                                                        0x12, 0x9a, 0xf7, 0x43, 0x2c, 0xea, 0xf7, 0x22,\n                                                        0xf7, 0x42, 0x2b, 0xeb, 0x2b, 0xf7, 0x43, 0x13,\n                                                        0xb4, 0x9a, 0xf7, 0xed, 0x15, 0x13, 0xaa, 0xdb,\n                                                        0xfb, 0x4e, 0x6, 0xfb, 0x5, 0xd0, 0x4e, 0xf7,\n                                                        0x1, 0xc0, 0xc2, 0xa6, 0xa7, 0xa8, 0x1e, 0x13,\n                                                        0x71, 0x61, 0xf7, 0x43, 0xe9, 0x7, 0x13, 0x74,\n                                                        0x3c, 0xf7, 0xef, 0xfb, 0x42, 0x2d, 0x6, 0x13,\n                                                        0xb2, 0xd9, 0xfb, 0x56, 0x6, 0x6c, 0x69, 0x65,\n                                                        0x60, 0x4d, 0x1b, 0x38, 0x88, 0xc4, 0xa2, 0x1f,\n                                                        0xf7, 0xae, 0xfb, 0x43, 0x7, 0xe, 0xa0, 0x76,\n                                                        0xf7, 0xed, 0xe9, 0x1, 0xf7, 0x98, 0x16, 0xe3,\n                                                        0x6, 0xf7, 0x3c, 0xf7, 0xed, 0x5, 0xe0, 0xe9,\n                                                        0xfb, 0x86, 0x2d, 0xc8, 0x6, 0xfb, 0x7, 0xfb,\n                                                        0x82, 0xfb, 0x8, 0xf7, 0x82, 0x5, 0xcf, 0xe9,\n                                                        0xfb, 0x96, 0x2d, 0xe0, 0x6, 0xe, 0xa0, 0x76,\n                                                        0xf7, 0xed, 0xe9, 0x1, 0x79, 0xf7, 0x6d, 0xf7,\n                                                        0x64, 0xf7, 0x67, 0x3, 0xf7, 0x24, 0x16, 0xda,\n                                                        0x6, 0xd5, 0xf7, 0x68, 0xe1, 0xfb, 0x68, 0x5,\n                                                        0xd7, 0x6, 0xf7, 0x2, 0xf7, 0xed, 0x5, 0xbc,\n                                                        0xe9, 0xfb, 0x67, 0x2d, 0xd3, 0x6, 0x4f, 0xfb,\n                                                        0x57, 0x36, 0xf7, 0x6f, 0x5, 0x49, 0x6, 0x3d,\n                                                        0xfb, 0x6f, 0x4e, 0xf7, 0x57, 0x5, 0xd1, 0xe9,\n                                                        0xfb, 0x6d, 0x2d, 0xbc, 0x6, 0xe, 0x7c, 0xa,\n                                                        0xe9, 0x1, 0x91, 0x16, 0xf7, 0x91, 0xe9, 0x62,\n                                                        0x6, 0xda, 0xd8, 0xdd, 0x3e, 0x5, 0x64, 0x2d,\n                                                        0xf7, 0x92, 0xe9, 0x37, 0x6, 0xfb, 0x28, 0xf7,\n                                                        0x1c, 0xf7, 0x10, 0xf7, 0x7, 0x5, 0xdc, 0xe9,\n                                                        0xfb, 0x75, 0x2d, 0x9e, 0x6, 0x4f, 0x52, 0x49,\n                                                        0xc4, 0x5, 0xa1, 0xe9, 0xfb, 0x82, 0x2d, 0xe1,\n                                                        0x6, 0xf7, 0x14, 0xfb, 0x9, 0xfb, 0x22, 0xfb,\n                                                        0x1a, 0x5, 0x36, 0x6, 0xe, 0xfb, 0x22, 0xe3,\n                                                        0xf8, 0x29, 0xe3, 0x12, 0x13, 0xc0, 0xb4, 0x55,\n                                                        0x15, 0x33, 0xf7, 0xb4, 0xe3, 0x48, 0x7, 0xf7,\n                                                        0x9e, 0xf8, 0x29, 0x5, 0xd6, 0xe3, 0xfb, 0x80,\n                                                        0x33, 0xc3, 0x6, 0xfb, 0x14, 0xfb, 0x55, 0xfb,\n                                                        0x6, 0xf7, 0x55, 0x5, 0xc6, 0xe3, 0xfb, 0x86,\n                                                        0x33, 0xd7, 0x6, 0xf7, 0x3b, 0xfb, 0xa8, 0x35,\n                                                        0xfb, 0x15, 0x5, 0xe, 0x8b, 0xe9, 0x2d, 0xf7,\n                                                        0x51, 0xd4, 0xf7, 0x45, 0x2e, 0xe8, 0x12, 0xea,\n                                                        0xec, 0xf7, 0x7a, 0xec, 0x13, 0x6c, 0xdb, 0x16,\n                                                        0xf8, 0x4b, 0xf7, 0x51, 0x2a, 0x6, 0x13, 0xac,\n                                                        0x2c, 0xfb, 0x51, 0x7, 0xf7, 0xb2, 0xf7, 0xa9,\n                                                        0x5, 0xcf, 0xfc, 0x3c, 0xfb, 0x45, 0xec, 0x7,\n                                                        0x13, 0x9c, 0xdf, 0xf7, 0x41, 0x7, 0xfb, 0xb1,\n                                                        0xfb, 0xa6, 0x5, 0xe, 0xf7, 0x86, 0xe4, 0x3,\n                                                        0xf8, 0x6b, 0xfb, 0x88, 0x15, 0xe8, 0x7, 0x65,\n                                                        0x64, 0x8b, 0x95, 0x69, 0x1f, 0x75, 0x92, 0x84,\n                                                        0xa5, 0xa1, 0x1a, 0xf7, 0x28, 0x7, 0xd4, 0x6a,\n                                                        0xde, 0x4d, 0xae, 0x1e, 0xc9, 0xae, 0xac, 0xdc,\n                                                        0xd4, 0x1a, 0xf7, 0x28, 0x7, 0xa1, 0x92, 0xa5,\n                                                        0xa1, 0x92, 0x1e, 0x95, 0xad, 0xb2, 0x8b, 0xb1,\n                                                        0x1b, 0xe8, 0x7, 0x5b, 0x4f, 0x8b, 0x79, 0x5d,\n                                                        0x1f, 0x56, 0x76, 0x75, 0x52, 0x5c, 0x1a, 0xfb,\n                                                        0x9, 0x7, 0xfb, 0x0, 0x82, 0x49, 0x22, 0x7c,\n                                                        0x1e, 0x2d, 0x7, 0xf4, 0x7c, 0x94, 0x49, 0xfb,\n                                                        0x0, 0x1a, 0xfb, 0x9, 0x7, 0x5c, 0xa1, 0x52,\n                                                        0xc0, 0x76, 0x1e, 0x79, 0xb9, 0xc7, 0x8b, 0xbb,\n                                                        0x1b, 0xe, 0xfb, 0x79, 0x76, 0xfa, 0x7c, 0x6e,\n                                                        0xa, 0xfb, 0x8e, 0x15, 0xe5, 0xfa, 0x7c, 0x31,\n                                                        0x6, 0xe, 0xf7, 0xa0, 0xe4, 0x3, 0xf7, 0x14,\n                                                        0xfb, 0x2c, 0x15, 0x2f, 0x7, 0xbb, 0xc6, 0x8b,\n                                                        0x9d, 0xba, 0x1f, 0xbf, 0x9f, 0xa2, 0xc5, 0xba,\n                                                        0x1a, 0xf7, 0x9, 0x7, 0xf7, 0x0, 0x94, 0xcc,\n                                                        0xf4, 0x9b, 0x1e, 0xe9, 0x7, 0x22, 0x9b, 0x82,\n                                                        0xcc, 0xf7, 0x0, 0x1a, 0xf7, 0x9, 0x7, 0xba,\n                                                        0x75, 0xc5, 0x56, 0x9f, 0x1e, 0x9d, 0x5c, 0x50,\n                                                        0x8b, 0x5b, 0x1b, 0x2e, 0x7, 0xb2, 0xb0, 0x8b,\n                                                        0x81, 0xae, 0x1f, 0xa2, 0x84, 0x91, 0x72, 0x74,\n                                                        0x1a, 0xfb, 0x28, 0x7, 0x43, 0xac, 0x39, 0xc9,\n                                                        0x68, 0x1e, 0x4d, 0x68, 0x6a, 0x38, 0x42, 0x1a,\n                                                        0xfb, 0x28, 0x7, 0x74, 0x85, 0x72, 0x74, 0x84,\n                                                        0x1e, 0x80, 0x67, 0x67, 0x8b, 0x64, 0x1b, 0xe,\n                                                        0xf7, 0x45, 0xef, 0x62, 0xf0, 0x12, 0x13, 0x40,\n                                                        0xd1, 0xf7, 0x67, 0x15, 0xcc, 0x51, 0x5, 0xab,\n                                                        0xa0, 0x9d, 0xbe, 0xb3, 0x1b, 0xa8, 0xb2, 0x75,\n                                                        0x7a, 0xb2, 0x1f, 0x13, 0x80, 0x80, 0xa4, 0xa5,\n                                                        0x82, 0xa3, 0x1b, 0xb4, 0xc3, 0xaf, 0xe0, 0xaf,\n                                                        0x1f, 0x4e, 0xc5, 0x5, 0x75, 0x7d, 0x6b, 0x52,\n                                                        0x71, 0x1b, 0x73, 0x74, 0x97, 0x99, 0x71, 0x1f,\n                                                        0x13, 0x40, 0x9b, 0x6b, 0x67, 0x9d, 0x5d, 0x1b,\n                                                        0x47, 0x65, 0x45, 0x53, 0x6a, 0x1f, 0xe, 0xfb,\n                                                        0x11, 0x76, 0xf8, 0x4a, 0xf7, 0x31, 0x1, 0xf7,\n                                                        0x7e, 0xf7, 0x17, 0x3, 0xf7, 0x74, 0xfb, 0x26,\n                                                        0x15, 0xf7, 0x2b, 0x6, 0x77, 0xf8, 0x22, 0x5,\n                                                        0xfb, 0x2, 0x6, 0x60, 0xf7, 0xa, 0x15, 0x5f,\n                                                        0xb7, 0x69, 0xc1, 0xc1, 0xb7, 0xad, 0xb7, 0xb7,\n                                                        0x5f, 0xae, 0x55, 0x55, 0x5f, 0x68, 0x5f, 0x1e,\n                                                        0xe, 0x6f, 0x76, 0x1, 0xd5, 0xec, 0xd9, 0xec,\n                                                        0xc8, 0xe9, 0x3, 0xf7, 0x8d, 0x5a, 0x15, 0xec,\n                                                        0xf7, 0x14, 0x6, 0xce, 0x95, 0xc5, 0xaf, 0xc2,\n                                                        0xb2, 0x5e, 0xd2, 0x18, 0x61, 0x41, 0x60, 0x73,\n                                                        0x4a, 0x1b, 0xfb, 0x6, 0x7d, 0xe7, 0xa2, 0xc9,\n                                                        0xc0, 0xca, 0xda, 0xaf, 0xb1, 0x7c, 0x7a, 0xa9,\n                                                        0x1f, 0x54, 0xe9, 0xf7, 0x44, 0x2d, 0x6c, 0x7,\n                                                        0x7b, 0x97, 0x72, 0x94, 0x77, 0x8e, 0x8, 0xf2,\n                                                        0x2a, 0x25, 0x7, 0xfb, 0xb, 0x72, 0x53, 0x2e,\n                                                        0x31, 0x1a, 0xfb, 0x24, 0xf7, 0x12, 0x5c, 0xbc,\n                                                        0x7e, 0x1e, 0xe, 0x84, 0x76, 0xf7, 0xb9, 0xe8,\n                                                        0xf7, 0x34, 0xe8, 0x12, 0xf7, 0xf, 0xe9, 0x5d,\n                                                        0xec, 0x13, 0xe8, 0xdf, 0xaf, 0x15, 0xbe, 0x4b,\n                                                        0x5, 0x93, 0x97, 0xce, 0xb0, 0xbb, 0x1b, 0xa1,\n                                                        0xac, 0x82, 0x83, 0xa6, 0x1f, 0x84, 0xa2, 0xa3,\n                                                        0x85, 0x9f, 0x1b, 0xd3, 0xb2, 0xb6, 0x71, 0xa,\n                                                        0x70, 0x79, 0x64, 0xa, 0x75, 0x94, 0x7c, 0x1b,\n                                                        0x78, 0x61, 0x84, 0x85, 0x7f, 0x1f, 0x9f, 0xac,\n                                                        0x9b, 0xab, 0xae, 0x1a, 0xa1, 0x8b, 0xa3, 0x84,\n                                                        0xa5, 0x1e, 0xf7, 0x5f, 0xd8, 0xfb, 0x74, 0x6,\n                                                        0x13, 0xf0, 0x7f, 0xa4, 0x86, 0xb4, 0xa2, 0x6c,\n                                                        0xa, 0xbd, 0x7c, 0x5e, 0xa0, 0x1f, 0xd5, 0xb9,\n                                                        0x5, 0xb9, 0x70, 0x5d, 0xc8, 0x63, 0xa, 0x76,\n                                                        0x8f, 0x66, 0x93, 0x77, 0x1e, 0x3d, 0x3e, 0xef,\n                                                        0x6, 0x13, 0xe8, 0x92, 0x76, 0x8c, 0x76, 0x75,\n                                                        0x1a, 0x8a, 0x49, 0x66, 0x49, 0x60, 0x6a, 0x8,\n                                                        0xe, 0xcf, 0xe3, 0xf7, 0x92, 0xe3, 0x1, 0xdc,\n                                                        0xe5, 0xf7, 0x97, 0xe5, 0x3, 0xc1, 0xf5, 0x15,\n                                                        0xc8, 0x52, 0xc8, 0xc4, 0x5, 0x71, 0xae, 0xb8,\n                                                        0x7f, 0xb9, 0x1b, 0xb8, 0xb7, 0x98, 0xa5, 0xad,\n                                                        0x1f, 0xc9, 0x51, 0xc6, 0xc6, 0x4c, 0xc5, 0x5,\n                                                        0xa3, 0xaa, 0x98, 0xb5, 0xb5, 0x1a, 0xb7, 0x7f,\n                                                        0xb7, 0x72, 0xac, 0x1e, 0xca, 0xc5, 0x51, 0xc4,\n                                                        0x4e, 0x50, 0x68, 0xa7, 0x5a, 0x98, 0x5b, 0x8a,\n                                                        0x19, 0x5f, 0x8a, 0x60, 0x7f, 0x6a, 0x72, 0x4e,\n                                                        0xc4, 0x18, 0x4f, 0x50, 0xca, 0x51, 0x5, 0x73,\n                                                        0x6a, 0x7f, 0x60, 0x61, 0x1a, 0x61, 0x97, 0x60,\n                                                        0xa4, 0x6b, 0x1e, 0xc0, 0xf7, 0xa, 0x15, 0xd0,\n                                                        0xc4, 0xc5, 0xd3, 0xd3, 0xc5, 0x51, 0x46, 0x45,\n                                                        0x51, 0x52, 0x43, 0x43, 0x52, 0xc4, 0xd1, 0x1e,\n                                                        0xe, 0x8b, 0xe2, 0xc4, 0xc1, 0xb5, 0xc0, 0xf7,\n                                                        0x4a, 0xe2, 0x1, 0x95, 0xf7, 0x84, 0xf3, 0xf7,\n                                                        0x80, 0x3, 0xf7, 0x22, 0x16, 0xf7, 0xd3, 0xe2,\n                                                        0xfb, 0x5, 0xc3, 0xf7, 0x25, 0xc1, 0xfb, 0x25,\n                                                        0xb6, 0xf7, 0x25, 0xc0, 0xfb, 0x20, 0x6, 0xf7,\n                                                        0x34, 0xf7, 0x4a, 0x5, 0xd8, 0xe2, 0xfb, 0x80,\n                                                        0x34, 0xb7, 0x6, 0x2b, 0xfb, 0x7, 0x2a, 0xf7,\n                                                        0x7, 0x5, 0xb8, 0xe2, 0xfb, 0x84, 0x34, 0xdc,\n                                                        0x6, 0xf7, 0x36, 0xfb, 0x4a, 0x5, 0xfb, 0x24,\n                                                        0x56, 0xf7, 0x26, 0x60, 0xfb, 0x26, 0x55, 0xf7,\n                                                        0x26, 0x53, 0xfb, 0x5, 0x6, 0xe, 0xfb, 0x2e,\n                                                        0x76, 0xf9, 0xe6, 0x6e, 0xa, 0xf7, 0xb1, 0x15,\n                                                        0xe5, 0xf8, 0x1a, 0x31, 0x6, 0xfd, 0xe6, 0x4,\n                                                        0xe5, 0xf8, 0x1b, 0x31, 0x6, 0xe, 0x45, 0xe8,\n                                                        0x2e, 0xf7, 0x40, 0xf7, 0xd5, 0xf7, 0x40, 0xfb,\n                                                        0x1, 0xe9, 0x12, 0xe3, 0xf1, 0xf7, 0x60, 0xf1,\n                                                        0x13, 0x9c, 0xe3, 0x45, 0x15, 0xf7, 0x84, 0x6,\n                                                        0xe8, 0xcd, 0xa4, 0xd4, 0xb1, 0x7d, 0x9f, 0x75,\n                                                        0x9f, 0x1f, 0xa5, 0x96, 0xb3, 0xaa, 0xc1, 0x1a,\n                                                        0xaf, 0x74, 0xab, 0x6b, 0xa2, 0x1e, 0xfb, 0x91,\n                                                        0xf7, 0x41, 0x5, 0x8b, 0x86, 0x8e, 0x90, 0x1a,\n                                                        0x96, 0x98, 0x8c, 0xa2, 0x1e, 0xf7, 0x2e, 0x4c,\n                                                        0x6, 0x13, 0xac, 0xf1, 0xf7, 0x40, 0xfb, 0x88,\n                                                        0x6, 0x49, 0x36, 0x78, 0x26, 0x6e, 0xa0, 0x74,\n                                                        0xa1, 0x78, 0x1f, 0x73, 0x7b, 0x66, 0x72, 0x50,\n                                                        0x1a, 0x59, 0xa7, 0x71, 0xbb, 0x6b, 0x1e, 0xf7,\n                                                        0x5e, 0xfb, 0x1d, 0x5, 0xa1, 0x7d, 0x8e, 0x88,\n                                                        0x82, 0x1a, 0x82, 0x7e, 0x8a, 0x7a, 0x1e, 0xfb,\n                                                        0x3a, 0xda, 0x6, 0x13, 0x6c, 0x25, 0x6, 0xf7,\n                                                        0xac, 0xcc, 0x15, 0xfb, 0x37, 0xf7, 0x1, 0x5,\n                                                        0x80, 0x92, 0x82, 0x97, 0x97, 0x1a, 0xa0, 0xa5,\n                                                        0x95, 0x98, 0x92, 0x1e, 0xf7, 0x48, 0xfb, 0xd,\n                                                        0x5, 0x94, 0x86, 0x92, 0x83, 0x82, 0x1a, 0x71,\n                                                        0x68, 0x84, 0x7a, 0x89, 0x1e, 0xe, 0xf8, 0x79,\n                                                        0xf7, 0x20, 0x1, 0xf7, 0x14, 0xf7, 0x17, 0xde,\n                                                        0xf7, 0x16, 0x3, 0xf7, 0xea, 0xf8, 0x79, 0x15,\n                                                        0xf7, 0x16, 0xf7, 0x20, 0xfb, 0x16, 0x6, 0xfb,\n                                                        0x6a, 0xfb, 0x20, 0x15, 0xf7, 0x17, 0xf7, 0x20,\n                                                        0xfb, 0x17, 0x6, 0xe, 0x79, 0xb8, 0xe7, 0xb9,\n                                                        0xf7, 0x8d, 0xba, 0xd5, 0xb8, 0x1, 0x8b, 0xb8,\n                                                        0xf3, 0xb9, 0xf7, 0xfc, 0xb8, 0x3, 0xf7, 0xad,\n                                                        0x4, 0xfb, 0x39, 0xf7, 0x1a, 0xfb, 0x1a, 0xf7,\n                                                        0x39, 0xf7, 0x3a, 0xf7, 0x1b, 0xf7, 0x1a, 0xf7,\n                                                        0x39, 0xf7, 0x39, 0xfb, 0x1b, 0xf7, 0x1a, 0xfb,\n                                                        0x3a, 0xfb, 0x39, 0xfb, 0x1a, 0xfb, 0x1a, 0xfb,\n                                                        0x39, 0x1e, 0xb8, 0x16, 0xf7, 0x21, 0xf7, 0x5,\n                                                        0xf7, 0x5, 0xf7, 0x21, 0xf7, 0x21, 0xf7, 0x7,\n                                                        0xfb, 0x5, 0xfb, 0x21, 0xfb, 0x21, 0xfb, 0x7,\n                                                        0xfb, 0x5, 0xfb, 0x21, 0xfb, 0x21, 0xfb, 0x5,\n                                                        0xf7, 0x5, 0xf7, 0x21, 0x1e, 0xf8, 0x9, 0x49,\n                                                        0x15, 0x71, 0x73, 0x61, 0x73, 0x64, 0x1b, 0x46,\n                                                        0x5a, 0xc7, 0xcc, 0xcd, 0xc0, 0xc5, 0xcb, 0xae,\n                                                        0xa7, 0x79, 0x75, 0xa1, 0x1f, 0xb1, 0xb2, 0x5,\n                                                        0xa8, 0x6a, 0x5f, 0x9e, 0x5e, 0x1b, 0x37, 0x3b,\n                                                        0x43, 0x29, 0x35, 0xcd, 0x35, 0xf2, 0xc4, 0xc9,\n                                                        0xb7, 0xa0, 0x9b, 0x1f, 0xe, 0xf7, 0x58, 0xde,\n                                                        0xf7, 0x71, 0xdb, 0x12, 0xf7, 0x27, 0xcf, 0xf7,\n                                                        0xd, 0xce, 0x48, 0xf7, 0x9, 0x13, 0xe8, 0xf7,\n                                                        0xe4, 0xf7, 0x60, 0x15, 0xf7, 0x9, 0xdd, 0x59,\n                                                        0x6, 0x13, 0xf0, 0xf7, 0x23, 0x7, 0xde, 0x86,\n                                                        0xcf, 0xfb, 0x8, 0x5c, 0x59, 0x7c, 0x77, 0x6d,\n                                                        0x1e, 0x9f, 0x47, 0x5, 0x99, 0xa5, 0xc6, 0x94,\n                                                        0xa2, 0x1b, 0xad, 0x9e, 0x7e, 0x62, 0x1f, 0x94,\n                                                        0x77, 0x75, 0x8e, 0x76, 0x1b, 0x24, 0x74, 0x3d,\n                                                        0x5b, 0x44, 0xb8, 0x4a, 0xce, 0xa7, 0xa7, 0xa0,\n                                                        0xa8, 0xa0, 0x1f, 0xf7, 0x12, 0x4, 0x63, 0x80,\n                                                        0x6b, 0x56, 0x67, 0x1b, 0x6d, 0x7f, 0xa4, 0x9d,\n                                                        0xb8, 0xb6, 0x95, 0xb1, 0x9a, 0x9a, 0x88, 0x89,\n                                                        0x95, 0x1f, 0xe, 0x7b, 0xa, 0xba, 0xf8, 0x8b,\n                                                        0x3, 0xf7, 0xa3, 0xf7, 0x98, 0x15, 0xf7, 0x77,\n                                                        0xfb, 0x52, 0xc1, 0xc9, 0xfb, 0x2d, 0xf7, 0x13,\n                                                        0xf7, 0x2b, 0xf7, 0x10, 0x54, 0xca, 0x5, 0xfc,\n                                                        0x54, 0xfb, 0x4e, 0x15, 0xf7, 0x6c, 0xfb, 0x52,\n                                                        0xc2, 0xc9, 0xfb, 0x28, 0xf7, 0x13, 0xf7, 0x26,\n                                                        0xf7, 0x10, 0x53, 0xca, 0x5, 0xe, 0xf7, 0x10,\n                                                        0x76, 0xf7, 0x5d, 0xf7, 0x1, 0x1, 0xf8, 0x45,\n                                                        0xeb, 0x3, 0xd2, 0xf7, 0xc4, 0x15, 0xf7, 0xfe,\n                                                        0xfb, 0x5d, 0xeb, 0xf7, 0xca, 0xfc, 0x5e, 0x6,\n                                                        0xe, 0x79, 0xb8, 0xf7, 0xf6, 0xb9, 0xf7, 0x0,\n                                                        0xb8, 0x1, 0x8b, 0xb8, 0xf7, 0x2f, 0xbb, 0xf7,\n                                                        0x5, 0xbd, 0xf7, 0x24, 0xb8, 0x3, 0xf7, 0xad,\n                                                        0x4, 0xfb, 0x39, 0xf7, 0x1b, 0xfb, 0x1a, 0xf7,\n                                                        0x39, 0xf7, 0x3a, 0xf7, 0x1a, 0xf7, 0x1a, 0xf7,\n                                                        0x39, 0xf7, 0x39, 0xfb, 0x1a, 0xf7, 0x1a, 0xfb,\n                                                        0x3a, 0xfb, 0x39, 0xfb, 0x1b, 0xfb, 0x1a, 0xfb,\n                                                        0x39, 0x1e, 0xb8, 0x16, 0xf7, 0x20, 0xf7, 0x7,\n                                                        0xf7, 0x6, 0xf7, 0x20, 0xf7, 0x22, 0xf7, 0x5,\n                                                        0xfb, 0x6, 0xfb, 0x20, 0xfb, 0x20, 0xfb, 0x5,\n                                                        0xfb, 0x6, 0xfb, 0x22, 0xfb, 0x20, 0xfb, 0x7,\n                                                        0xf7, 0x6, 0xf7, 0x20, 0x1e, 0xf7, 0x2f, 0xfb,\n                                                        0x27, 0x15, 0xbb, 0xf7, 0x8, 0xc1, 0x6, 0xbe,\n                                                        0xfb, 0x8, 0x5, 0xc5, 0x6, 0x54, 0xf7, 0x13,\n                                                        0x5, 0x9e, 0x91, 0xaf, 0xa4, 0xc7, 0x1a, 0xed,\n                                                        0x42, 0x86, 0xfb, 0x1e, 0x8d, 0x1e, 0xbb, 0xfb,\n                                                        0x29, 0x15, 0xf2, 0x7, 0xde, 0xa9, 0x83, 0x5f,\n                                                        0x5f, 0x64, 0x84, 0x41, 0x1f, 0xe, 0xf8, 0x8d,\n                                                        0xdb, 0x1, 0xe3, 0xf8, 0x3c, 0x3, 0xe3, 0xf8,\n                                                        0x8d, 0x15, 0xf8, 0x3c, 0xdb, 0xfc, 0x3c, 0x6,\n                                                        0xe, 0xf7, 0x87, 0xe6, 0xf7, 0x53, 0xe6, 0x1,\n                                                        0xf5, 0xea, 0xf7, 0x5b, 0xe9, 0x3, 0xf5, 0xf8,\n                                                        0x41, 0x15, 0x24, 0xe1, 0x38, 0xf7, 0x0, 0xf7,\n                                                        0x1, 0xe0, 0xde, 0xf2, 0xf3, 0x36, 0xde, 0xfb,\n                                                        0x1, 0xfb, 0x0, 0x35, 0x38, 0x23, 0x1e, 0xea,\n                                                        0x16, 0xc1, 0xb6, 0xb5, 0xc3, 0xc4, 0xb6, 0x61,\n                                                        0x55, 0x56, 0x60, 0x61, 0x52, 0x53, 0x60, 0xb5,\n                                                        0xc0, 0x1e, 0xe, 0xa3, 0xdc, 0xf7, 0x4a, 0xe3,\n                                                        0xf7, 0x20, 0x67, 0xa, 0xeb, 0x3, 0xd2, 0xf7,\n                                                        0xb3, 0x15, 0xf7, 0x48, 0xfb, 0x27, 0xeb, 0xf7,\n                                                        0x27, 0xf7, 0x4a, 0xe3, 0xfb, 0x4a, 0xf7, 0x20,\n                                                        0x2b, 0xfb, 0x20, 0xfb, 0x48, 0x6, 0xfb, 0xf3,\n                                                        0x4, 0xf8, 0x5e, 0xdc, 0xfc, 0x5e, 0x6, 0xe,\n                                                        0xf7, 0x7a, 0xd6, 0xf7, 0x39, 0xf7, 0x26, 0x3e,\n                                                        0xd8, 0x12, 0xf8, 0x0, 0xdd, 0x13, 0xb0, 0xf7,\n                                                        0x2d, 0xf7, 0x7a, 0x15, 0xf7, 0xb9, 0xd6, 0xfb,\n                                                        0x38, 0x6, 0xf7, 0x1, 0xe0, 0x5, 0xa7, 0xa0,\n                                                        0xa5, 0xb0, 0xb7, 0x1a, 0xae, 0x6e, 0xe4, 0xfb,\n                                                        0x5, 0x54, 0x57, 0x73, 0x56, 0x6c, 0x1e, 0x13,\n                                                        0xd0, 0x46, 0xde, 0x7, 0x13, 0xb0, 0xa1, 0x87,\n                                                        0xba, 0xc6, 0xa4, 0xaf, 0x82, 0x64, 0x78, 0x82,\n                                                        0x7c, 0x79, 0x7c, 0x1e, 0xfb, 0x4c, 0xfb, 0x27,\n                                                        0x5, 0xe, 0xf7, 0x72, 0xd6, 0xee, 0xd4, 0xf7,\n                                                        0x27, 0x77, 0x12, 0xf7, 0x83, 0xf7, 0x50, 0x3b,\n                                                        0xdb, 0x4e, 0xdc, 0x13, 0xe4, 0xf7, 0x2c, 0xf7,\n                                                        0x96, 0x15, 0x71, 0xcb, 0xb2, 0x81, 0xb3, 0x1b,\n                                                        0xe9, 0xc5, 0xc6, 0xce, 0xae, 0x7a, 0xae, 0x6d,\n                                                        0xa2, 0x1f, 0x13, 0xe8, 0x97, 0x97, 0x9a, 0xa1,\n                                                        0xab, 0x1a, 0xd7, 0x50, 0xac, 0x4a, 0x57, 0x54,\n                                                        0x78, 0x6a, 0x69, 0x1e, 0xb5, 0x4b, 0x5, 0x9d,\n                                                        0xaa, 0xaf, 0xa1, 0xaf, 0x1b, 0x9c, 0xa2, 0x84,\n                                                        0x70, 0x70, 0x75, 0x80, 0x70, 0x1f, 0x13, 0xf0,\n                                                        0x88, 0x7b, 0x8c, 0x63, 0x1b, 0x42, 0xce, 0x7,\n                                                        0x13, 0xe4, 0xb6, 0x9c, 0x74, 0x72, 0x6e, 0x73,\n                                                        0x75, 0x64, 0x1f, 0x5e, 0x8c, 0x66, 0x99, 0x67,\n                                                        0x9d, 0x8, 0xe, 0xf8, 0xa5, 0x76, 0xf7, 0x2d,\n                                                        0x77, 0x1, 0xf7, 0x4e, 0xf8, 0x90, 0x15, 0xf7,\n                                                        0x89, 0xcc, 0x6b, 0xe3, 0xfb, 0x7b, 0x24, 0x5,\n                                                        0xe, 0xfb, 0xd, 0x76, 0xf7, 0x36, 0xd9, 0x3d,\n                                                        0xe5, 0xf7, 0x83, 0xe5, 0x12, 0x9a, 0xf7, 0x45,\n                                                        0x2a, 0xec, 0xf7, 0x1c, 0xf7, 0x46, 0x2a, 0xec,\n                                                        0x2a, 0xf7, 0x44, 0x13, 0xd9, 0x0, 0xea, 0xfb,\n                                                        0x22, 0x15, 0xec, 0xf7, 0x51, 0x6, 0x77, 0x9e,\n                                                        0xaa, 0x83, 0xab, 0x1b, 0xc0, 0xc6, 0xa1, 0xa9,\n                                                        0xa2, 0x1f, 0x58, 0x7, 0x13, 0xb8, 0x80, 0xf7,\n                                                        0x44, 0xe5, 0x6, 0x13, 0xba, 0x0, 0x3c, 0xf7,\n                                                        0xdd, 0xfb, 0x46, 0x31, 0x6, 0x13, 0xd9, 0x0,\n                                                        0xdc, 0xfb, 0x56, 0x6, 0x6b, 0x71, 0x55, 0x72,\n                                                        0x5c, 0x1b, 0x5b, 0x61, 0xa0, 0xca, 0x1f, 0xf7,\n                                                        0x95, 0xfb, 0x45, 0x31, 0x7, 0x13, 0xd6, 0x0,\n                                                        0xdb, 0x6, 0xe, 0x5a, 0x76, 0xf9, 0x0, 0xa9,\n                                                        0x1, 0xf7, 0xd4, 0xc2, 0xeb, 0xc0, 0x3, 0xf7,\n                                                        0xd4, 0x45, 0x15, 0xc2, 0xf9, 0x0, 0xeb, 0xfd,\n                                                        0x0, 0xc0, 0xf9, 0x0, 0xc8, 0xa9, 0xfb, 0x98,\n                                                        0x6, 0xfb, 0x60, 0x21, 0x4f, 0xfb, 0xc, 0xfb,\n                                                        0x2, 0xf5, 0x57, 0xf7, 0x5b, 0x8a, 0x1f, 0xe,\n                                                        0xf7, 0x39, 0xf7, 0x4e, 0x1, 0xf7, 0x58, 0xf7,\n                                                        0x96, 0x15, 0x58, 0xba, 0x61, 0xc4, 0xc4, 0xba,\n                                                        0xb5, 0xbe, 0xbe, 0x5c, 0xb5, 0x52, 0x52, 0x5c,\n                                                        0x61, 0x58, 0x1e, 0xe, 0xfb, 0x4d, 0x76, 0xf7,\n                                                        0x62, 0x77, 0x12, 0xf7, 0x91, 0x16, 0x80, 0x2d,\n                                                        0x5, 0x8f, 0x92, 0x9a, 0x8d, 0x99, 0x1b, 0x9d,\n                                                        0x9b, 0x85, 0x77, 0x7d, 0x7e, 0x83, 0x7b, 0x1f,\n                                                        0x13, 0xc0, 0x7c, 0x74, 0x90, 0x94, 0x82, 0x1f,\n                                                        0x70, 0x53, 0x5, 0x79, 0xa4, 0xa6, 0x81, 0xa9,\n                                                        0x1b, 0xc9, 0xb1, 0xb8, 0xc2, 0xc8, 0x60, 0x9a,\n                                                        0x7b, 0x8f, 0x1f, 0xa5, 0x7, 0xe, 0xf7, 0x7a,\n                                                        0xd8, 0xf7, 0xc9, 0x77, 0x12, 0xf7, 0x3a, 0xf7,\n                                                        0x45, 0x3b, 0xdb, 0x13, 0xe0, 0xf7, 0x2d, 0xf7,\n                                                        0x7a, 0x15, 0xf7, 0xba, 0xd8, 0x23, 0xf7, 0xc9,\n                                                        0x6, 0xfb, 0x45, 0x75, 0x5, 0x3f, 0x7, 0x13,\n                                                        0xd0, 0xec, 0x91, 0x5, 0xfb, 0x6d, 0xfb, 0x2,\n                                                        0x7, 0xe, 0xf7, 0x58, 0xde, 0xf7, 0x6e, 0xde,\n                                                        0x1, 0xf7, 0x27, 0xcf, 0xf7, 0x3f, 0xce, 0x3,\n                                                        0xf7, 0x27, 0xf8, 0x18, 0x15, 0x21, 0xca, 0x35,\n                                                        0xe7, 0xda, 0xd3, 0xd6, 0xf7, 0x9, 0xe9, 0x53,\n                                                        0xed, 0x29, 0x2a, 0x54, 0x24, 0x32, 0x1e, 0xcf,\n                                                        0x89, 0x15, 0xbe, 0xa7, 0xc7, 0xc5, 0xc5, 0xa6,\n                                                        0x4c, 0x5d, 0x49, 0x66, 0x60, 0x5b, 0x53, 0x6d,\n                                                        0xbe, 0xc3, 0x1e, 0xe, 0x7b, 0xa, 0xbc, 0xf8,\n                                                        0x8b, 0x3, 0xf0, 0xd1, 0x15, 0xf7, 0x77, 0xf7,\n                                                        0x52, 0xfb, 0x74, 0xf7, 0x4e, 0x54, 0x4c, 0xf7,\n                                                        0x2b, 0xfb, 0x10, 0xfb, 0x2d, 0xfb, 0x13, 0x5,\n                                                        0xf7, 0xb5, 0x4d, 0x15, 0xf7, 0x6c, 0xf7, 0x52,\n                                                        0xfb, 0x69, 0xf7, 0x4e, 0x53, 0x4c, 0xf7, 0x26,\n                                                        0xfb, 0x10, 0xfb, 0x28, 0xfb, 0x13, 0x5, 0xe,\n                                                        0x64, 0x76, 0xa2, 0xc4, 0x5a, 0x76, 0xf7, 0x6,\n                                                        0xca, 0xf7, 0x43, 0xd0, 0x8b, 0xf7, 0x4f, 0xe1,\n                                                        0x77, 0x12, 0xbf, 0xd5, 0xf8, 0x8, 0xd7, 0x13,\n                                                        0xdf, 0x80, 0xf7, 0xf0, 0xcb, 0x15, 0xf7, 0x2a,\n                                                        0x5f, 0x3f, 0x52, 0xf7, 0x59, 0xc4, 0x5e, 0xb7,\n                                                        0xb8, 0xca, 0x5e, 0xf7, 0x41, 0x42, 0x6, 0xfb,\n                                                        0x2d, 0xfb, 0x52, 0x5, 0xe3, 0x9c, 0x15, 0xc9,\n                                                        0xd7, 0x5, 0x3f, 0x7, 0xfc, 0x71, 0xfb, 0x10,\n                                                        0x15, 0x13, 0x3f, 0x80, 0x65, 0xa, 0x50, 0xc6,\n                                                        0x5, 0xfd, 0x12, 0xfb, 0xea, 0x15, 0xf7, 0xa0,\n                                                        0xd0, 0x2d, 0xf7, 0xa4, 0x6, 0xfb, 0x37, 0x78,\n                                                        0x5, 0x47, 0x7, 0xe4, 0x90, 0x5, 0xfb, 0x52,\n                                                        0x27, 0x7, 0xe, 0x51, 0xce, 0xf7, 0x33, 0xf7,\n                                                        0x16, 0x47, 0xcf, 0x8a, 0xd1, 0x8b, 0xf7, 0x52,\n                                                        0xe2, 0x77, 0xb0, 0x77, 0x12, 0xbc, 0xd1, 0x13,\n                                                        0xcb, 0xf8, 0x20, 0x97, 0x15, 0x51, 0xf7, 0x90,\n                                                        0xce, 0xfb, 0x22, 0x7, 0xf7, 0xa, 0xeb, 0xa2,\n                                                        0xaa, 0xb3, 0x1a, 0xa9, 0x71, 0xdb, 0x29, 0x5d,\n                                                        0x62, 0x75, 0x67, 0x6d, 0x1e, 0x43, 0xd2, 0x7,\n                                                        0x13, 0xab, 0x9e, 0x87, 0xb6, 0xbd, 0xa1, 0xac,\n                                                        0x82, 0x69, 0x79, 0x82, 0x7e, 0xfb, 0x41, 0xfb,\n                                                        0x24, 0x1e, 0x13, 0x9b, 0xfc, 0x4f, 0xf7, 0xb1,\n                                                        0x15, 0xf7, 0x91, 0xd1, 0x34, 0xf7, 0xa8, 0x6,\n                                                        0x13, 0x9d, 0xfb, 0x2e, 0x78, 0x5, 0x46, 0x7,\n                                                        0xdf, 0x90, 0x5, 0xfb, 0x55, 0x2b, 0x7, 0xc7,\n                                                        0xfc, 0x0, 0x15, 0x65, 0xa, 0x50, 0xc6, 0x5,\n                                                        0xe, 0x5e, 0xc4, 0x58, 0x76, 0xaa, 0x76, 0xf5,\n                                                        0xcb, 0xf7, 0x3c, 0xd0, 0xe5, 0xcb, 0xc8, 0xcd,\n                                                        0x91, 0x77, 0xb0, 0x77, 0x12, 0x13, 0x5e, 0x80,\n                                                        0xf7, 0xe7, 0xc3, 0x15, 0xf7, 0x29, 0x6, 0x13,\n                                                        0x9e, 0x80, 0x5f, 0x41, 0x52, 0xf7, 0x56, 0xc4,\n                                                        0x5d, 0xb7, 0xb9, 0xcb, 0x5d, 0xf7, 0x46, 0x45,\n                                                        0x7, 0xfb, 0x2d, 0xfb, 0x56, 0x5, 0xe3, 0x9b,\n                                                        0x15, 0xc8, 0xd9, 0x5, 0x3d, 0x7, 0xfc, 0xa8,\n                                                        0xf7, 0x5f, 0x15, 0x71, 0xc7, 0xaf, 0x82, 0xb3,\n                                                        0x1b, 0xe1, 0xbe, 0xc1, 0xc9, 0xaa, 0x7c, 0xaa,\n                                                        0x70, 0x9f, 0x1f, 0x96, 0x95, 0x98, 0xa0, 0xa9,\n                                                        0x1a, 0xc9, 0x56, 0xa8, 0x4f, 0x5b, 0x57, 0x7b,\n                                                        0x6d, 0x6b, 0x1e, 0xb4, 0x56, 0x5, 0x9d, 0x99,\n                                                        0xad, 0x9a, 0xb0, 0x1b, 0xa4, 0x9f, 0x83, 0x79,\n                                                        0x71, 0x76, 0x82, 0x73, 0x1f, 0x55, 0x4b, 0xca,\n                                                        0x6, 0xb2, 0x9a, 0x76, 0x75, 0x71, 0x75, 0x76,\n                                                        0x69, 0x1f, 0x89, 0x6, 0x61, 0x8c, 0x69, 0x98,\n                                                        0x69, 0x9a, 0x8, 0xa8, 0xfc, 0x13, 0x15, 0x13,\n                                                        0x3e, 0x80, 0x65, 0xa, 0x5, 0x13, 0x5d, 0x0,\n                                                        0x50, 0xc6, 0x5, 0xe, 0xfb, 0x26, 0xe7, 0xf7,\n                                                        0xf1, 0xf7, 0x2e, 0x12, 0xed, 0xec, 0xba, 0xf7,\n                                                        0x44, 0x7c, 0xed, 0x13, 0xe8, 0xf7, 0xad, 0xf7,\n                                                        0x59, 0x15, 0x57, 0x7f, 0xfb, 0x17, 0x66, 0xfb,\n                                                        0xf, 0x1a, 0xfb, 0x2, 0xeb, 0x4e, 0xf7, 0xd,\n                                                        0xc2, 0xd9, 0x9a, 0x9f, 0xc0, 0x1e, 0xf7, 0x24,\n                                                        0x29, 0x3f, 0x7, 0x85, 0x6f, 0x6d, 0x86, 0x6e,\n                                                        0x1b, 0x48, 0x55, 0xa3, 0xc2, 0xd5, 0xe9, 0x9c,\n                                                        0xe4, 0x99, 0x1f, 0xf7, 0x13, 0x7, 0x13, 0x50,\n                                                        0x2a, 0x6, 0x13, 0xf0, 0x64, 0xf7, 0x7, 0x15,\n                                                        0x60, 0xb2, 0x69, 0xbc, 0x1e, 0x13, 0x50, 0xbc,\n                                                        0xb2, 0xad, 0xb6, 0xb6, 0x64, 0xad, 0x5a, 0x5a,\n                                                        0x64, 0x69, 0x60, 0x1f, 0xe, 0x8b, 0xe5, 0xcc,\n                                                        0xe5, 0xf7, 0x7a, 0xe5, 0xf7, 0x6f, 0x77, 0x44,\n                                                        0xa, 0xf7, 0x19, 0xf9, 0x3c, 0x15, 0xf7, 0xcf,\n                                                        0x40, 0xa5, 0xc5, 0xfb, 0xbe, 0xf7, 0xd, 0x5,\n                                                        0xfb, 0x4d, 0xfd, 0xa4, 0x22, 0xa, 0x8b, 0xe5,\n                                                        0xcc, 0xe5, 0xf7, 0x6d, 0xe5, 0xf7, 0x7c, 0x77,\n                                                        0x44, 0xa, 0x82, 0x16, 0x20, 0xa, 0xfb, 0x60,\n                                                        0xf7, 0xfc, 0x15, 0xf7, 0xd2, 0xd5, 0x62, 0xf4,\n                                                        0xfb, 0xbd, 0x6a, 0xa, 0xe, 0x8b, 0xe4, 0xcd,\n                                                        0xe4, 0xf7, 0x6d, 0xe4, 0xf7, 0x7a, 0x77, 0x44,\n                                                        0xa, 0xf7, 0x20, 0xf8, 0xef, 0x15, 0xf7, 0x2c,\n                                                        0xf1, 0xf7, 0x2b, 0x25, 0xc7, 0xaf, 0xfb, 0x36,\n                                                        0xf7, 0x21, 0x5, 0x2a, 0x6, 0xfb, 0x39, 0xfb,\n                                                        0x20, 0x5, 0x33, 0xfd, 0x14, 0x22, 0xa, 0x8b,\n                                                        0xe5, 0xcc, 0xe5, 0xf7, 0x6d, 0xe5, 0xc7, 0xde,\n                                                        0x74, 0xde, 0x8f, 0x77, 0x12, 0x82, 0xf7, 0x97,\n                                                        0xf4, 0xf7, 0x92, 0x13, 0xeb, 0xde, 0xf9, 0x10,\n                                                        0x15, 0xe3, 0x71, 0x5, 0xaf, 0x99, 0x98, 0xa5,\n                                                        0xa7, 0x1b, 0xaf, 0x9f, 0x78, 0x7b, 0xa4, 0x1f,\n                                                        0x13, 0xf7, 0x7e, 0x9f, 0xa1, 0x7f, 0xae, 0x1b,\n                                                        0xd9, 0xbd, 0xc6, 0xca, 0x9a, 0x1f, 0x35, 0xa4,\n                                                        0x5, 0x75, 0x84, 0x7d, 0x61, 0x66, 0x1b, 0x6d,\n                                                        0x76, 0x99, 0x9a, 0x75, 0x1f, 0x13, 0xeb, 0x9a,\n                                                        0x74, 0x73, 0x9b, 0x66, 0x1b, 0x38, 0x5e, 0x49,\n                                                        0x56, 0x7c, 0x1f, 0x2f, 0xfd, 0x10, 0x22, 0xa,\n                                                        0x8b, 0xe3, 0xcc, 0xe3, 0xf7, 0x69, 0xe3, 0xdf,\n                                                        0xf7, 0xe, 0x44, 0xa, 0xf7, 0xda, 0xf9, 0x10,\n                                                        0x15, 0xf7, 0x3, 0xf7, 0xe, 0x6b, 0xa, 0xfb,\n                                                        0x4b, 0xfb, 0xe, 0x15, 0xf7, 0x5, 0xf7, 0xe,\n                                                        0xfb, 0x5, 0x6, 0xfb, 0x2c, 0xfd, 0x8a, 0x22,\n                                                        0xa, 0x8b, 0xe8, 0xcf, 0xe9, 0xf7, 0x7e, 0xe8,\n                                                        0x9e, 0xc9, 0xd7, 0xc9, 0x1, 0xf7, 0x4d, 0xcc,\n                                                        0xdb, 0xcb, 0x3, 0xf7, 0x4d, 0xf9, 0x51, 0x15,\n                                                        0x54, 0xba, 0x5e, 0xc5, 0xc4, 0xba, 0xb8, 0xc2,\n                                                        0xc2, 0x5c, 0xb8, 0x52, 0x51, 0x5c, 0x5e, 0x54,\n                                                        0x1e, 0xcd, 0x16, 0xa0, 0x9c, 0x9c, 0xa1, 0xa1,\n                                                        0x9d, 0x7a, 0x76, 0x76, 0x79, 0x7a, 0x75, 0x75,\n                                                        0x7a, 0x9c, 0xa0, 0x1e, 0xfb, 0x98, 0xfd, 0x51,\n                                                        0x22, 0xa, 0x8b, 0xe5, 0x31, 0xf7, 0x40, 0x7e,\n                                                        0xe6, 0x48, 0xf7, 0x50, 0x9d, 0xf7, 0x41, 0x31,\n                                                        0xe5, 0x12, 0xf7, 0xbe, 0xed, 0xb5, 0xda, 0x9d,\n                                                        0xdc, 0x13, 0xab, 0x80, 0x7c, 0x16, 0xf7, 0x89,\n                                                        0xe5, 0x3e, 0x6, 0xa9, 0xd0, 0x5, 0xf7, 0x7,\n                                                        0xfb, 0x33, 0xf7, 0xd2, 0x6, 0x13, 0x5b, 0x80,\n                                                        0xf7, 0x40, 0x3a, 0x7, 0x13, 0x97, 0x80, 0x39,\n                                                        0xfb, 0x1f, 0xf7, 0x22, 0xb5, 0x5a, 0xda, 0xf7,\n                                                        0x50, 0x3c, 0x5a, 0x61, 0xf7, 0x2a, 0xf7, 0x1f,\n                                                        0x7, 0x13, 0xab, 0x80, 0x38, 0xdc, 0xf7, 0x41,\n                                                        0xfc, 0x7b, 0x7, 0x13, 0xa7, 0x80, 0x31, 0xea,\n                                                        0x7, 0xfb, 0x40, 0xfc, 0x12, 0x5, 0x48, 0x6,\n                                                        0xf7, 0x83, 0xf7, 0x34, 0x15, 0xd5, 0xf7, 0x39,\n                                                        0x5, 0xfb, 0x39, 0x7, 0xe, 0xfb, 0x4d, 0x76,\n                                                        0xf7, 0x54, 0xe7, 0xf8, 0x2e, 0xe7, 0x1, 0xaa,\n                                                        0xec, 0xf7, 0x16, 0xf7, 0x22, 0xcb, 0xec, 0x3,\n                                                        0xf7, 0x9b, 0x82, 0x15, 0x82, 0x2e, 0x5, 0x8e,\n                                                        0x98, 0x9f, 0x8e, 0x97, 0x1b, 0x94, 0x99, 0x84,\n                                                        0x7f, 0x7c, 0x80, 0x84, 0x7d, 0x7d, 0x79, 0x91,\n                                                        0x95, 0x7d, 0x1f, 0x6f, 0x52, 0x5, 0x71, 0xac,\n                                                        0xa0, 0x89, 0xa1, 0x1b, 0xc2, 0xb9, 0xac, 0xca,\n                                                        0x98, 0x8b, 0xc3, 0x4f, 0x99, 0x1f, 0x8c, 0x98,\n                                                        0xe3, 0x8f, 0xcf, 0xb2, 0xd3, 0xb9, 0x19, 0x52,\n                                                        0xcf, 0x5, 0x72, 0x60, 0x4a, 0x63, 0x36, 0x1b,\n                                                        0xfb, 0x21, 0x59, 0xf7, 0x15, 0xd7, 0xf7, 0x2f,\n                                                        0xf7, 0x6, 0xbd, 0xd7, 0xc1, 0xbd, 0x78, 0x71,\n                                                        0xb5, 0x1f, 0x21, 0xec, 0xf7, 0x87, 0x2a, 0x60,\n                                                        0x7, 0xa4, 0x6a, 0x55, 0x9d, 0x4e, 0x1b, 0xfb,\n                                                        0x1e, 0xfb, 0x27, 0x2a, 0xfb, 0x5e, 0xfb, 0x21,\n                                                        0xea, 0xfb, 0x13, 0xf7, 0x1d, 0x75, 0x1f, 0xe,\n                                                        0x48, 0xa, 0xc1, 0xed, 0x3, 0xb1, 0x16, 0x35,\n                                                        0xa, 0xf6, 0xf8, 0xe2, 0x15, 0xf7, 0xd2, 0x40,\n                                                        0xa6, 0x77, 0xa, 0x48, 0xa, 0xbf, 0xee, 0x3,\n                                                        0xb1, 0x16, 0xf8, 0xa5, 0x6, 0x8a, 0xf7, 0x5e,\n                                                        0x5, 0x28, 0xfb, 0x4, 0xfb, 0x91, 0x38, 0xa,\n                                                        0xf7, 0x91, 0xfb, 0x6, 0xee, 0xf7, 0x60, 0xfc,\n                                                        0xa1, 0x31, 0xd7, 0xfc, 0x8, 0x3c, 0x6, 0xf7,\n                                                        0x2b, 0xf8, 0x97, 0x15, 0xf7, 0xd8, 0xd5, 0x61,\n                                                        0xf4, 0xfb, 0xc3, 0x6a, 0xa, 0xe, 0x8b, 0xe4,\n                                                        0xf7, 0x26, 0xe4, 0xf7, 0x1d, 0xe4, 0xf7, 0x7a,\n                                                        0x77, 0x1, 0xf7, 0x9, 0xec, 0xf1, 0xee, 0xc0,\n                                                        0xee, 0x3, 0xf7, 0x2b, 0xf8, 0xef, 0x15, 0xf7,\n                                                        0x2d, 0xf1, 0xf7, 0x2d, 0x25, 0xc8, 0xaf, 0xfb,\n                                                        0x37, 0xf7, 0x21, 0x5, 0x27, 0x6, 0xfb, 0x3b,\n                                                        0xfb, 0x20, 0x5, 0x59, 0xfd, 0x14, 0x15, 0x35,\n                                                        0xa, 0xe, 0x8b, 0xe3, 0xf7, 0x24, 0xe2, 0xf7,\n                                                        0x1b, 0xe3, 0xdf, 0xf7, 0xe, 0x12, 0xf7, 0x9,\n                                                        0xec, 0x4f, 0xf7, 0x6, 0xbb, 0xee, 0x40, 0xf7,\n                                                        0x4, 0x9c, 0xed, 0x13, 0xf5, 0x80, 0xf7, 0xe8,\n                                                        0xf9, 0x10, 0x15, 0xf7, 0x4, 0xf7, 0xe, 0xfb,\n                                                        0x4, 0x56, 0xa, 0xfb, 0x8, 0xfd, 0x8a, 0x15,\n                                                        0xf8, 0xa5, 0xf7, 0x5e, 0x29, 0xfb, 0x4, 0x6,\n                                                        0x13, 0xfa, 0x80, 0x2d, 0xa, 0xe, 0x8b, 0xe5,\n                                                        0xf8, 0x8, 0x5f, 0xa, 0xf7, 0x90, 0xef, 0x3,\n                                                        0xd8, 0x16, 0x31, 0xa, 0xcd, 0xf8, 0xe2, 0x15,\n                                                        0xf7, 0xd4, 0x40, 0xa5, 0x77, 0xa, 0x8b, 0xe5,\n                                                        0xf8, 0x8, 0x5f, 0xa, 0xf7, 0x90, 0xef, 0x3,\n                                                        0xf7, 0x50, 0xf8, 0xf1, 0x15, 0xf7, 0xd9, 0xd5,\n                                                        0x60, 0xf4, 0xfb, 0xc2, 0x6a, 0xa, 0x30, 0xfd,\n                                                        0x2c, 0x15, 0x31, 0xa, 0xe, 0x8b, 0xe4, 0xf8,\n                                                        0x8, 0xe4, 0xf7, 0x7a, 0x67, 0xa, 0xef, 0x3,\n                                                        0xf7, 0x29, 0xf8, 0xef, 0x15, 0xf7, 0x2e, 0xf1,\n                                                        0xf7, 0x2d, 0x25, 0xc8, 0xaf, 0xfb, 0x38, 0xf7,\n                                                        0x21, 0x5, 0x28, 0x6, 0xfb, 0x3c, 0xfb, 0x20,\n                                                        0x5, 0x82, 0xfd, 0x14, 0x15, 0x31, 0xa, 0xe,\n                                                        0x8b, 0xe3, 0xf8, 0x2, 0xe3, 0xdf, 0xf7, 0xe,\n                                                        0x12, 0xf7, 0x2d, 0xf7, 0x6, 0x7c, 0xef, 0x7e,\n                                                        0xf7, 0x5, 0x13, 0xf4, 0xf7, 0xe7, 0xf9, 0x10,\n                                                        0x15, 0xf7, 0x5, 0xf7, 0xe, 0xfb, 0x5, 0x56,\n                                                        0xa, 0x3f, 0xfd, 0x8a, 0x15, 0xf8, 0x52, 0xe5,\n                                                        0x6, 0x13, 0xe8, 0x30, 0xa, 0xe, 0x8b, 0xe6,\n                                                        0xf7, 0x30, 0xce, 0xf7, 0x31, 0xe6, 0x1, 0xf0,\n                                                        0xeb, 0xf7, 0xb5, 0xeb, 0x3, 0x9d, 0x16, 0xf7,\n                                                        0xa1, 0x6, 0xf7, 0x2f, 0xf7, 0x20, 0xce, 0xf7,\n                                                        0x75, 0xf7, 0x39, 0x39, 0xf4, 0xfb, 0x4e, 0x1f,\n                                                        0xfb, 0xbc, 0x30, 0xde, 0xfb, 0x31, 0x43, 0x48,\n                                                        0xd3, 0xfb, 0x30, 0x38, 0x6, 0xf7, 0x47, 0x16,\n                                                        0xf7, 0x30, 0xf7, 0x12, 0xce, 0xfb, 0x12, 0xf7,\n                                                        0x31, 0xf7, 0xb, 0x7, 0xf7, 0xf, 0xba, 0x38,\n                                                        0x27, 0xfb, 0x12, 0x46, 0x44, 0xfb, 0x1a, 0x1f,\n                                                        0xe, 0x7f, 0xe7, 0xf8, 0x13, 0xe7, 0xc1, 0xdf,\n                                                        0x12, 0xd9, 0xe8, 0xf7, 0x97, 0xe8, 0x17, 0x8a,\n                                                        0x7f, 0x15, 0xf7, 0x99, 0xe7, 0x32, 0xf7, 0xd6,\n                                                        0x6, 0xf7, 0x9b, 0xfc, 0x32, 0x5, 0xe4, 0xf8,\n                                                        0x79, 0xd9, 0xe7, 0xfb, 0x9e, 0x2f, 0xea, 0xfb,\n                                                        0xcb, 0x6, 0xfb, 0x8b, 0xf8, 0x27, 0x5, 0xfb,\n                                                        0x4c, 0x2f, 0xda, 0xfc, 0x1d, 0x3c, 0x6, 0xe8,\n                                                        0xf8, 0xc7, 0x15, 0xe0, 0x71, 0x5, 0xaf, 0x9a,\n                                                        0x97, 0xa6, 0xa7, 0x1b, 0xb2, 0x9f, 0x79, 0x7a,\n                                                        0xa2, 0x1f, 0x13, 0x60, 0x7d, 0x9e, 0x9f, 0x7f,\n                                                        0xac, 0x1b, 0xd7, 0xbb, 0xc7, 0xcb, 0x9a, 0x1f,\n                                                        0x38, 0xa5, 0x5, 0x75, 0x84, 0x7c, 0x5f, 0x68,\n                                                        0x1b, 0x6f, 0x7b, 0x99, 0x99, 0x79, 0x1f, 0x9b,\n                                                        0x77, 0x73, 0x9c, 0x5c, 0x1b, 0x3a, 0x5f, 0x48,\n                                                        0x55, 0x7c, 0x1f, 0xe, 0x61, 0xa, 0xf7, 0x72,\n                                                        0x54, 0xa, 0xa1, 0xf7, 0xa2, 0x2f, 0xa, 0xf7,\n                                                        0x2b, 0x2e, 0xf7, 0x1f, 0x26, 0xa, 0xa3, 0xf8,\n                                                        0x2a, 0x15, 0xf7, 0xd0, 0x40, 0xa5, 0xc5, 0xfb,\n                                                        0xbf, 0xf7, 0xe, 0x5, 0xe, 0x61, 0xa, 0xf7,\n                                                        0x72, 0x54, 0xa, 0xa1, 0xf7, 0xa2, 0x25, 0xa,\n                                                        0xd0, 0xf7, 0xdf, 0x15, 0xf7, 0xd4, 0xd5, 0x61,\n                                                        0xf5, 0xfb, 0xbe, 0xfb, 0xd, 0x5, 0xe, 0x61,\n                                                        0xa, 0xf7, 0x6e, 0x54, 0xa, 0xf7, 0x2b, 0xf8,\n                                                        0xee, 0x15, 0xf7, 0x2c, 0xf2, 0xf7, 0x2c, 0x24,\n                                                        0xc6, 0xaf, 0xfb, 0x35, 0xf7, 0x22, 0x5, 0x29,\n                                                        0x6, 0xfb, 0x3a, 0xfb, 0x21, 0x5, 0x48, 0xfc,\n                                                        0x5, 0x25, 0xa, 0xe, 0x61, 0xa, 0xbb, 0xdf,\n                                                        0x73, 0xdf, 0x90, 0x77, 0x12, 0xa1, 0xed, 0xf7,\n                                                        0xff, 0xea, 0x13, 0xd6, 0xe7, 0xf9, 0xe, 0x15,\n                                                        0xe3, 0x71, 0x5, 0xae, 0x99, 0x99, 0xa6, 0xa6,\n                                                        0x1b, 0xac, 0x9e, 0x7d, 0x7d, 0xa0, 0x1f, 0x13,\n                                                        0xee, 0x7d, 0xa0, 0xa2, 0x79, 0xb6, 0x1b, 0xd9,\n                                                        0xbe, 0xc6, 0xcb, 0x9a, 0x1f, 0x36, 0xa5, 0x5,\n                                                        0x75, 0x83, 0x7c, 0x60, 0x66, 0x1b, 0x6a, 0x7c,\n                                                        0x9d, 0x9b, 0x74, 0x1f, 0x13, 0xd6, 0x98, 0x78,\n                                                        0x72, 0x98, 0x5f, 0x1b, 0x39, 0x5e, 0x49, 0x55,\n                                                        0x7b, 0x1f, 0x45, 0xfc, 0x0, 0x25, 0xa, 0xe,\n                                                        0x79, 0xe4, 0xf8, 0x15, 0xe6, 0xd8, 0xf7, 0x10,\n                                                        0x1, 0xa1, 0xed, 0xae, 0xf7, 0x5, 0xd1, 0xf7,\n                                                        0x5, 0xab, 0xea, 0x3, 0xf7, 0xe6, 0xf9, 0xe,\n                                                        0x53, 0xa, 0xfb, 0x4b, 0xfb, 0x10, 0x53, 0xa,\n                                                        0xfb, 0x19, 0xfc, 0x7c, 0x25, 0xa, 0xe, 0xc7,\n                                                        0x76, 0xf8, 0x4b, 0x77, 0x1, 0xdc, 0xef, 0x15,\n                                                        0xc8, 0x4e, 0xf7, 0x32, 0xf7, 0x33, 0xf7, 0x32,\n                                                        0xfb, 0x33, 0xc8, 0xc8, 0xfb, 0x31, 0xf7, 0x32,\n                                                        0xf7, 0x30, 0xf7, 0x30, 0x4f, 0xc8, 0xfb, 0x33,\n                                                        0xfb, 0x30, 0xfb, 0x32, 0xf7, 0x33, 0x4e, 0x4f,\n                                                        0xf7, 0x33, 0xfb, 0x33, 0x5, 0xe, 0x7c, 0xe6,\n                                                        0x3e, 0x76, 0xf8, 0x93, 0xe8, 0x8d, 0x77, 0x12,\n                                                        0xa1, 0xee, 0xf8, 0x2, 0xe6, 0x13, 0x6c, 0xad,\n                                                        0xa3, 0x15, 0xcc, 0x5d, 0xba, 0xbf, 0x5, 0x13,\n                                                        0x9c, 0x6d, 0xbb, 0xc1, 0x7c, 0xc2, 0x1b, 0xf2,\n                                                        0xf7, 0x40, 0xd1, 0xf7, 0x76, 0xce, 0x78, 0xd3,\n                                                        0x61, 0xc4, 0x1f, 0xbc, 0xc6, 0x4b, 0xbb, 0x62,\n                                                        0x58, 0x5, 0x13, 0xac, 0xa9, 0x61, 0x56, 0x9e,\n                                                        0x4c, 0x1b, 0xfb, 0x44, 0x8a, 0x22, 0xfb, 0x24,\n                                                        0xfb, 0x30, 0x1a, 0x38, 0xa3, 0x4b, 0xb2, 0x5a,\n                                                        0x1e, 0xcd, 0xda, 0x15, 0x77, 0xa9, 0x81, 0xb9,\n                                                        0xb4, 0x1a, 0xe9, 0xc7, 0xf7, 0x6, 0xf7, 0xe,\n                                                        0xb2, 0xab, 0x80, 0x7a, 0xa4, 0x1e, 0xfb, 0x54,\n                                                        0xfb, 0xfa, 0x15, 0xf7, 0x8a, 0xf7, 0xbd, 0x5,\n                                                        0xa1, 0x6a, 0x97, 0x54, 0x6c, 0x1a, 0x38, 0x58,\n                                                        0xfb, 0xe, 0xfb, 0x19, 0x65, 0x6a, 0x95, 0x9c,\n                                                        0x72, 0x1e, 0xe, 0x4f, 0xa, 0xf7, 0x20, 0xf9,\n                                                        0x3b, 0x15, 0xf7, 0xca, 0x41, 0xa5, 0xc5, 0xfb,\n                                                        0xb9, 0xf7, 0xd, 0x5, 0xfb, 0x47, 0xfb, 0xd8,\n                                                        0x15, 0x27, 0xa, 0x4f, 0xa, 0xf7, 0x4d, 0xf8,\n                                                        0xf1, 0x15, 0xf7, 0xcd, 0xd4, 0x62, 0xf5, 0xfb,\n                                                        0xb9, 0x6a, 0xa, 0xfb, 0x34, 0xfb, 0x60, 0x15,\n                                                        0x27, 0xa, 0x79, 0xe6, 0xf8, 0x16, 0xe5, 0xf7,\n                                                        0x7b, 0x52, 0xa, 0xf7, 0x26, 0xf8, 0xef, 0x15,\n                                                        0xf7, 0x2a, 0xf1, 0xf7, 0x28, 0x25, 0xc5, 0xae,\n                                                        0xfb, 0x32, 0xf7, 0x22, 0x5, 0x2c, 0x6, 0xfb,\n                                                        0x37, 0xfb, 0x21, 0x5, 0x39, 0xfb, 0x47, 0x15,\n                                                        0x27, 0xa, 0x79, 0xe4, 0xf8, 0x11, 0xe3, 0xe1,\n                                                        0xf7, 0xe, 0x12, 0xdf, 0xea, 0x6d, 0xf7, 0x3,\n                                                        0xd0, 0xf7, 0x2, 0x7c, 0xea, 0x13, 0xec, 0xf7,\n                                                        0xdd, 0xf9, 0x10, 0x15, 0xf7, 0x2, 0xf7, 0xe,\n                                                        0xfb, 0x2, 0x6, 0xfb, 0x48, 0xfb, 0xe, 0x15,\n                                                        0xf7, 0x3, 0xf7, 0xe, 0x6b, 0xa, 0xfb, 0x25,\n                                                        0xfb, 0xbe, 0x15, 0x13, 0xf2, 0x27, 0xa, 0x8b,\n                                                        0xe5, 0xf8, 0x9, 0xe5, 0xf7, 0x7b, 0x77, 0x1,\n                                                        0xf7, 0x8e, 0xec, 0x3, 0xf7, 0x12, 0x16, 0xf7,\n                                                        0xeb, 0xe5, 0xfb, 0xe, 0xf7, 0x6, 0x6, 0xf7,\n                                                        0x34, 0xf7, 0x97, 0x5, 0xdc, 0xe5, 0xfb, 0x82,\n                                                        0x31, 0xc2, 0x6, 0x21, 0xfb, 0x41, 0x24, 0xf7,\n                                                        0x41, 0x5, 0xc0, 0xe5, 0xfb, 0x82, 0x31, 0xda,\n                                                        0x6, 0xf7, 0x34, 0xfb, 0x97, 0x5, 0xfb, 0x6,\n                                                        0xfb, 0x10, 0x7, 0xc9, 0xf8, 0x98, 0x15, 0xf7,\n                                                        0xce, 0xd4, 0x62, 0xf4, 0xfb, 0xbb, 0xfb, 0xb,\n                                                        0x5, 0xe, 0x8b, 0xe6, 0xbe, 0xdb, 0xf7, 0x9,\n                                                        0xdb, 0xbf, 0xe6, 0x1, 0xf7, 0x2a, 0xde, 0xf7,\n                                                        0x81, 0xdf, 0x3, 0xb8, 0x16, 0xf7, 0xc5, 0xe6,\n                                                        0xfb, 0x9, 0xbe, 0xf7, 0xf, 0x6, 0xee, 0xee,\n                                                        0x9c, 0xf7, 0x13, 0xf7, 0x29, 0xfb, 0x1d, 0x7b,\n                                                        0x28, 0x1f, 0x36, 0xbf, 0xf7, 0xb, 0xe6, 0xfb,\n                                                        0xc5, 0x30, 0xf2, 0xfc, 0x10, 0x22, 0x6, 0xf7,\n                                                        0x50, 0xf7, 0x17, 0x15, 0xf7, 0x9, 0xf7, 0x16,\n                                                        0x7, 0xb1, 0xd0, 0x8c, 0x50, 0x48, 0x47, 0x93,\n                                                        0x6a, 0x1f, 0xe, 0x7c, 0xe9, 0x39, 0xe9, 0xf7,\n                                                        0x90, 0xe9, 0xea, 0xe9, 0x12, 0x98, 0xf7, 0x46,\n                                                        0x2b, 0xeb, 0xf7, 0x78, 0xeb, 0x72, 0xec, 0x13,\n                                                        0x7a, 0x98, 0x88, 0x15, 0xf7, 0x46, 0xf8, 0x56,\n                                                        0x6, 0xdc, 0xab, 0x8f, 0xcf, 0xd7, 0xbf, 0x87,\n                                                        0x70, 0x6e, 0x55, 0x7d, 0x62, 0x75, 0x1e, 0x66,\n                                                        0x77, 0x63, 0x6e, 0x5a, 0x1a, 0x38, 0xd4, 0x71,\n                                                        0xd9, 0x6f, 0x1e, 0x13, 0xb9, 0xab, 0x80, 0xc7,\n                                                        0x7f, 0x62, 0x1a, 0x69, 0x5a, 0x73, 0x4e, 0x66,\n                                                        0x42, 0x97, 0xa5, 0x73, 0x1e, 0x6e, 0x34, 0x5,\n                                                        0x67, 0xc8, 0xb3, 0x82, 0xc1, 0x1b, 0xf7, 0x18,\n                                                        0xde, 0xd4, 0xe0, 0xe5, 0x3d, 0xa2, 0x42, 0xa3,\n                                                        0x1f, 0x5b, 0x9b, 0x5f, 0x9b, 0xa4, 0x1a, 0xa1,\n                                                        0xaf, 0x9b, 0xb0, 0x9c, 0x1e, 0x13, 0xb6, 0xc6,\n                                                        0xa6, 0xb2, 0x9f, 0xcb, 0x1a, 0xd5, 0x51, 0xbc,\n                                                        0xfb, 0x40, 0xfb, 0x3a, 0x73, 0x4a, 0xfb, 0x10,\n                                                        0x1e, 0x13, 0xba, 0x39, 0x2d, 0x6, 0x13, 0x76,\n                                                        0xdd, 0xfb, 0x90, 0x6, 0x13, 0x7a, 0x39, 0x6,\n                                                        0xe, 0x39, 0xa, 0xf7, 0x78, 0x77, 0x3b, 0xa,\n                                                        0xf7, 0x13, 0xf8, 0xc1, 0x15, 0xf7, 0xd5, 0x3f,\n                                                        0xa2, 0xc5, 0xfb, 0xc2, 0xf7, 0xe, 0x5, 0x42,\n                                                        0xfb, 0xf8, 0x51, 0xa, 0xaa, 0x70, 0x5b, 0x8a,\n                                                        0x21, 0xa, 0x39, 0xa, 0xf7, 0x78, 0x77, 0x3b,\n                                                        0xa, 0xf7, 0x42, 0xf8, 0x75, 0x15, 0xf7, 0xd5,\n                                                        0xd7, 0x61, 0xf3, 0xfb, 0xc2, 0xfb, 0xe, 0x5,\n                                                        0x54, 0xfb, 0x7e, 0x51, 0xa, 0xab, 0x70, 0x5b,\n                                                        0x89, 0x21, 0xa, 0x39, 0xa, 0xf7, 0x74, 0x77,\n                                                        0x3b, 0xa, 0xf7, 0x1a, 0xf8, 0x72, 0x15, 0xf7,\n                                                        0x2c, 0xf3, 0xf7, 0x2d, 0x23, 0xc7, 0xae, 0xfb,\n                                                        0x36, 0xf7, 0x24, 0x5, 0x27, 0x6, 0xfb, 0x3a,\n                                                        0xfb, 0x23, 0x5, 0xa4, 0xfb, 0x65, 0x15, 0x9b,\n                                                        0xa9, 0xf4, 0xa4, 0xd7, 0x1b, 0xbf, 0xa9, 0x70,\n                                                        0x5b, 0x21, 0xa, 0x39, 0xa, 0xf7, 0x7, 0xe0,\n                                                        0x8e, 0x77, 0x34, 0xa, 0x13, 0xbb, 0x0, 0xf7,\n                                                        0x32, 0xf8, 0x7a, 0x15, 0xa3, 0x98, 0x94, 0xb1,\n                                                        0xb1, 0x1b, 0xa0, 0xa8, 0x7a, 0x7b, 0xa9, 0x1f,\n                                                        0x7d, 0xa5, 0xa6, 0x7f, 0xa4, 0x1b, 0xf2, 0xac,\n                                                        0xe3, 0xad, 0x96, 0x1f, 0x13, 0xb7, 0x0, 0x35,\n                                                        0xa4, 0x5, 0x61, 0x78, 0x80, 0x76, 0x6e, 0x1b,\n                                                        0x77, 0x74, 0x96, 0x98, 0x74, 0x1f, 0x13, 0xbb,\n                                                        0x0, 0x9c, 0x6d, 0x6b, 0x9e, 0x6c, 0x1b, 0x28,\n                                                        0x6c, 0x3d, 0x5f, 0x79, 0x1f, 0xa4, 0xfb, 0x62,\n                                                        0x15, 0x9b, 0xa9, 0xf4, 0xa4, 0xd7, 0x1b, 0x3d,\n                                                        0xa, 0x13, 0x7a, 0x80, 0x4d, 0xa, 0x13, 0x7b,\n                                                        0x0, 0x2b, 0xa, 0x13, 0xbb, 0x0, 0x29, 0xa,\n                                                        0x39, 0xa, 0xcf, 0xf7, 0x10, 0x12, 0xab, 0xec,\n                                                        0x90, 0xf7, 0x5, 0xd4, 0xf7, 0x4, 0x60, 0xea,\n                                                        0x2c, 0xf7, 0x46, 0x13, 0xbf, 0x0, 0xf7, 0xd4,\n                                                        0xf8, 0x89, 0x15, 0xf7, 0x4, 0xf7, 0x10, 0xfb,\n                                                        0x4, 0x6, 0xfb, 0x4e, 0xfb, 0x10, 0x53, 0xa,\n                                                        0x65, 0xfb, 0xd4, 0x3f, 0xa, 0x13, 0xbe, 0x80,\n                                                        0x3d, 0xa, 0x13, 0x7e, 0x40, 0x4d, 0xa, 0x13,\n                                                        0x7e, 0x80, 0x2b, 0xa, 0x13, 0xbe, 0x80, 0x29,\n                                                        0xa, 0x39, 0xa, 0xba, 0xf7, 0x5a, 0x3b, 0xa,\n                                                        0xf7, 0x46, 0xf8, 0xe0, 0x15, 0x55, 0xbc, 0x62,\n                                                        0xc8, 0xc8, 0xbc, 0xb4, 0xc1, 0xc1, 0x5a, 0xaf,\n                                                        0x4e, 0x4e, 0x5a, 0x67, 0x55, 0x1e, 0xcc, 0x16,\n                                                        0xa0, 0xa0, 0x95, 0xa3, 0xa4, 0x9e, 0x81, 0x76,\n                                                        0x75, 0x78, 0x7e, 0x72, 0x73, 0x76, 0x98, 0xa1,\n                                                        0x1e, 0xfb, 0x27, 0xfb, 0xaf, 0x51, 0xa, 0xa6,\n                                                        0x70, 0x5b, 0x8e, 0x21, 0xa, 0x7c, 0xed, 0x3f,\n                                                        0x76, 0xf7, 0x53, 0xe8, 0x40, 0xe6, 0xd5, 0xe9,\n                                                        0x12, 0x89, 0xec, 0xf7, 0x29, 0xee, 0x13, 0xae,\n                                                        0xf7, 0xb9, 0xc5, 0x15, 0x52, 0xa6, 0xc6, 0x7b,\n                                                        0xcc, 0x1b, 0xc0, 0xc6, 0x99, 0xa0, 0xba, 0x1f,\n                                                        0x6b, 0xe7, 0x5, 0x73, 0x4d, 0x62, 0x86, 0x74,\n                                                        0x1b, 0x37, 0x7d, 0xd1, 0xa0, 0x1f, 0x8e, 0xf7,\n                                                        0x89, 0x7, 0x8d, 0x9f, 0x8c, 0x9e, 0x9e, 0x1a,\n                                                        0xf7, 0x11, 0x5d, 0xe9, 0xfb, 0xa, 0x5f, 0x5b,\n                                                        0x78, 0x68, 0x6e, 0x1e, 0x7f, 0xb0, 0x5b, 0x9a,\n                                                        0x54, 0x8c, 0x48, 0x8c, 0x3e, 0x78, 0x6e, 0x74,\n                                                        0xa5, 0x39, 0x18, 0x9b, 0xb5, 0xc0, 0x99, 0xb6,\n                                                        0x1b, 0xbb, 0x97, 0x7a, 0x4d, 0x89, 0x1f, 0x13,\n                                                        0x5e, 0x8d, 0x73, 0x78, 0x8e, 0x66, 0x1b, 0xfb,\n                                                        0xb, 0x5c, 0x31, 0x44, 0x3d, 0xc4, 0x4e, 0xe1,\n                                                        0xd3, 0xbb, 0xb9, 0xa5, 0xab, 0x1f, 0x13, 0xae,\n                                                        0xbd, 0xf7, 0x68, 0x15, 0xc8, 0x8f, 0xb3, 0xa8,\n                                                        0xb5, 0x1b, 0xc4, 0x96, 0x47, 0x75, 0x8d, 0x1f,\n                                                        0xfb, 0x93, 0xfb, 0x1d, 0x15, 0x6e, 0x6f, 0x69,\n                                                        0x73, 0x62, 0x1b, 0x79, 0x6f, 0x98, 0xad, 0x1f,\n                                                        0x13, 0x9e, 0xb0, 0xa3, 0xaa, 0xc3, 0x9e, 0xa2,\n                                                        0x88, 0x84, 0xa6, 0x1e, 0xe, 0xfb, 0x4d, 0x76,\n                                                        0xf7, 0x5b, 0xe7, 0xf7, 0xa2, 0xe9, 0x12, 0xba,\n                                                        0xec, 0xf7, 0x13, 0xf7, 0x21, 0x95, 0xeb, 0x17,\n                                                        0xf7, 0x80, 0xfb, 0x45, 0x15, 0x7a, 0xa0, 0xa6,\n                                                        0x7f, 0xaa, 0x1b, 0xcc, 0xab, 0xbe, 0xbd, 0xa6,\n                                                        0x82, 0xb7, 0x5a, 0x97, 0x1f, 0x9d, 0x7, 0xd5,\n                                                        0x97, 0xd0, 0xad, 0xc2, 0xb7, 0x55, 0xd4, 0x18,\n                                                        0x62, 0x51, 0x55, 0x6a, 0x3c, 0x1b, 0x39, 0x3a,\n                                                        0xb8, 0xe9, 0xdb, 0xca, 0xbe, 0xf3, 0xb2, 0xb3,\n                                                        0x8b, 0x7c, 0xab, 0x1f, 0x30, 0xeb, 0xf7, 0x5c,\n                                                        0x2b, 0x82, 0x7, 0x95, 0x68, 0x65, 0x8a, 0x65,\n                                                        0x1b, 0xfb, 0x49, 0x38, 0xfb, 0x4, 0xfb, 0x3,\n                                                        0xfb, 0x21, 0xf7, 0x3, 0x39, 0xf7, 0x9, 0x81,\n                                                        0x1f, 0x84, 0x2e, 0x5, 0x8c, 0x95, 0xa0, 0x91,\n                                                        0x9b, 0x1b, 0x97, 0x94, 0x85, 0x7c, 0x7d, 0x80,\n                                                        0x84, 0x7d, 0x7a, 0x77, 0x8f, 0x94, 0x82, 0x1f,\n                                                        0xe, 0x55, 0xa, 0xf7, 0x77, 0x77, 0x1, 0xf7,\n                                                        0x1e, 0xf8, 0xc3, 0x15, 0xf7, 0xd2, 0x3f, 0xa1,\n                                                        0xc6, 0xfb, 0xbd, 0xf7, 0xb, 0x5, 0x5e, 0xfc,\n                                                        0x7f, 0x24, 0xa, 0x55, 0xa, 0xf7, 0x77, 0x77,\n                                                        0x1, 0xf7, 0x4d, 0xf8, 0x76, 0x15, 0xf7, 0xd3,\n                                                        0xd7, 0x60, 0xf2, 0xfb, 0xbf, 0x6a, 0xa, 0x71,\n                                                        0xfc, 0x7, 0x24, 0xa, 0x55, 0xa, 0xf7, 0x73,\n                                                        0x77, 0x1, 0xf7, 0x23, 0xf8, 0x73, 0x15, 0xf7,\n                                                        0x2c, 0xf2, 0xf7, 0x2c, 0x24, 0xc7, 0xad, 0xfb,\n                                                        0x36, 0xf7, 0x24, 0x5, 0x28, 0x6, 0xfb, 0x39,\n                                                        0xfb, 0x23, 0x5, 0xc2, 0xfb, 0xec, 0x24, 0xa,\n                                                        0x55, 0xa, 0xcc, 0xf7, 0x12, 0x1, 0xf7, 0x24,\n                                                        0xf7, 0x4, 0xd2, 0xf7, 0x4, 0x3, 0xf7, 0xdb,\n                                                        0xf8, 0x87, 0x72, 0xa, 0xfb, 0x4b, 0xfb, 0x12,\n                                                        0x72, 0xa, 0x83, 0xfc, 0x5b, 0x24, 0xa, 0x57,\n                                                        0xa, 0xf7, 0x17, 0xf8, 0xc2, 0x15, 0xf7, 0xd4,\n                                                        0x40, 0xa3, 0xc5, 0xfb, 0xc1, 0xf7, 0xc, 0x5,\n                                                        0x2a, 0xfd, 0x29, 0x33, 0xa, 0x57, 0xa, 0xf7,\n                                                        0x48, 0xf8, 0x77, 0x15, 0xf7, 0xd2, 0xd6, 0x61,\n                                                        0xf2, 0xfb, 0xc0, 0x6a, 0xa, 0x3c, 0xfc, 0xb1,\n                                                        0x33, 0xa, 0x8b, 0xe5, 0xf7, 0x84, 0xe6, 0xf7,\n                                                        0x80, 0x77, 0x1, 0xf7, 0x8d, 0xf1, 0x3, 0xd1,\n                                                        0xf8, 0x98, 0x15, 0xcb, 0x67, 0xf7, 0x31, 0xf1,\n                                                        0xf7, 0x31, 0x25, 0xc9, 0xae, 0xfb, 0x3b, 0xf7,\n                                                        0x22, 0x5, 0x24, 0x6, 0xfb, 0x30, 0xfd, 0x25,\n                                                        0x33, 0xa, 0x8b, 0xe6, 0xf7, 0x86, 0xe6, 0xd7,\n                                                        0xf7, 0x11, 0x12, 0xf7, 0x20, 0xf7, 0x4, 0x8a,\n                                                        0xec, 0x72, 0xf7, 0x5, 0x13, 0xf4, 0xf7, 0xd7,\n                                                        0xf8, 0x88, 0x15, 0xf7, 0x5, 0xf7, 0x11, 0xfb,\n                                                        0x5, 0x6, 0xfb, 0x4b, 0xfb, 0x11, 0x15, 0xf7,\n                                                        0x4, 0xf7, 0x11, 0xfb, 0x4, 0x6, 0x4c, 0xfd,\n                                                        0x5, 0x15, 0xf8, 0x52, 0xe6, 0x6, 0x13, 0xe8,\n                                                        0xfb, 0x43, 0xf7, 0xe1, 0xfb, 0x7e, 0x30, 0xf7,\n                                                        0x1d, 0xfb, 0x86, 0xfb, 0x42, 0x6, 0xe, 0x70,\n                                                        0xe3, 0xf7, 0x96, 0xe4, 0xf7, 0x6e, 0x77, 0x1,\n                                                        0xc4, 0xe8, 0xf7, 0xc1, 0xe6, 0x3, 0xf7, 0x51,\n                                                        0xf8, 0x48, 0x15, 0xf7, 0x5, 0xc2, 0xd1, 0x62,\n                                                        0xb7, 0x47, 0x8c, 0x87, 0x19, 0x9d, 0x6d, 0x77,\n                                                        0x97, 0x4c, 0x1b, 0xfb, 0x39, 0x39, 0xfb, 0x0,\n                                                        0xfb, 0x3, 0xfb, 0x0, 0xdd, 0xfb, 0x0, 0xf7,\n                                                        0x37, 0xf7, 0x3a, 0xd5, 0xf7, 0x3, 0xf7, 0x17,\n                                                        0xf7, 0x44, 0xfb, 0xa, 0xf6, 0x59, 0xaa, 0x1f,\n                                                        0xea, 0xb5, 0x6c, 0xc1, 0xfb, 0x15, 0x4e, 0x6f,\n                                                        0x9d, 0x3c, 0xb0, 0x63, 0x92, 0x19, 0x70, 0x4f,\n                                                        0xad, 0x83, 0xad, 0x7b, 0xab, 0x7d, 0x19, 0x3b,\n                                                        0x65, 0x5, 0x86, 0xfb, 0xc2, 0x15, 0xe7, 0xdb,\n                                                        0xb2, 0xd1, 0xf5, 0xb8, 0x49, 0x4c, 0x30, 0x3d,\n                                                        0x65, 0x45, 0x40, 0x3d, 0xb0, 0xe5, 0x1e, 0xe,\n                                                        0x8b, 0xe7, 0xf7, 0x97, 0xe5, 0x31, 0xe7, 0xf7,\n                                                        0x55, 0x77, 0x12, 0x98, 0xf7, 0x46, 0x2b, 0xeb,\n                                                        0xf7, 0x72, 0xeb, 0x13, 0xda, 0xe8, 0xf8, 0x95,\n                                                        0x15, 0xe1, 0x71, 0x96, 0x9f, 0x93, 0xad, 0xa1,\n                                                        0x8d, 0x19, 0xa1, 0x8d, 0xa4, 0x82, 0xb1, 0x77,\n                                                        0x8, 0x7e, 0xa4, 0xa8, 0x7e, 0xac, 0x1b, 0xf0,\n                                                        0xab, 0xe3, 0xad, 0x97, 0x1f, 0x35, 0xa3, 0x5,\n                                                        0x62, 0x79, 0x81, 0x76, 0x6e, 0x1b, 0x79, 0x77,\n                                                        0x94, 0x96, 0x77, 0x1f, 0x9c, 0x6b, 0x6a, 0xa2,\n                                                        0x6a, 0x1b, 0x2a, 0x6d, 0x3d, 0x60, 0x79, 0x1f,\n                                                        0x3c, 0xfc, 0x95, 0x15, 0xf7, 0x95, 0xe7, 0x3b,\n                                                        0xf7, 0x56, 0x6, 0xb6, 0xbd, 0xce, 0xa1, 0xa9,\n                                                        0x1b, 0xd0, 0x91, 0x6c, 0x64, 0x1f, 0xfb, 0x51,\n                                                        0x3d, 0x2f, 0xf7, 0x90, 0xe7, 0x3d, 0xf7, 0x66,\n                                                        0x7, 0xe6, 0x43, 0xbb, 0x31, 0x53, 0x51, 0x70,\n                                                        0x70, 0x61, 0x1e, 0x13, 0xba, 0xc3, 0xfb, 0x46,\n                                                        0x2f, 0x7, 0x13, 0xb6, 0xdd, 0xfb, 0x97, 0x3a,\n                                                        0x6, 0xe, 0x7b, 0xe7, 0xf7, 0xa0, 0xe7, 0xf7,\n                                                        0x75, 0x77, 0x4b, 0xa, 0xf7, 0x24, 0xf8, 0xc1,\n                                                        0x15, 0xf7, 0xda, 0x40, 0xa2, 0xc5, 0xfb, 0xc7,\n                                                        0xf7, 0xd, 0x5, 0xfb, 0x30, 0xfc, 0x5a, 0x23,\n                                                        0xa, 0x62, 0xa, 0xf7, 0x75, 0x77, 0x4b, 0xa,\n                                                        0xf7, 0x53, 0xf8, 0x76, 0x15, 0xf7, 0xda, 0xd6,\n                                                        0x61, 0xf3, 0xfb, 0xc7, 0xfb, 0xd, 0x5, 0xfb,\n                                                        0x1e, 0xfb, 0xe1, 0x23, 0xa, 0x62, 0xa, 0xf7,\n                                                        0x71, 0x77, 0x4b, 0xa, 0xf7, 0x2a, 0xf8, 0x72,\n                                                        0x15, 0xf7, 0x30, 0xf3, 0xf7, 0x2f, 0x23, 0xc7,\n                                                        0xad, 0xfb, 0x38, 0xf7, 0x25, 0x5, 0x24, 0x6,\n                                                        0xfb, 0x3b, 0xfb, 0x23, 0x5, 0x52, 0xfb, 0xc7,\n                                                        0x23, 0xa, 0x62, 0xa, 0xf7, 0x5, 0xe0, 0x8d,\n                                                        0x77, 0x12, 0xa9, 0xef, 0xf7, 0xe9, 0xee, 0x13,\n                                                        0xec, 0xe3, 0xf8, 0x94, 0x15, 0xe4, 0x71, 0x5,\n                                                        0xa5, 0x96, 0x98, 0xb0, 0xae, 0x1b, 0x9f, 0xa0,\n                                                        0x7e, 0x7d, 0xa3, 0x1f, 0x7b, 0xa7, 0xa9, 0x7a,\n                                                        0xb0, 0x1b, 0xf5, 0xac, 0xe4, 0xad, 0x95, 0x1f,\n                                                        0x13, 0xdc, 0x33, 0xa3, 0x5, 0x62, 0x79, 0x81,\n                                                        0x76, 0x6d, 0x1b, 0x74, 0x71, 0x99, 0x9a, 0x70,\n                                                        0x1f, 0x13, 0xec, 0x9a, 0x6f, 0x6e, 0x9b, 0x6f,\n                                                        0x1b, 0x26, 0x6b, 0x3d, 0x5f, 0x7a, 0x1f, 0x51,\n                                                        0xfb, 0xc5, 0x23, 0xa, 0x62, 0xa, 0xca, 0xf7,\n                                                        0x12, 0x1, 0xa9, 0xef, 0xa0, 0xf7, 0x6, 0xd5,\n                                                        0xf7, 0x6, 0x9d, 0xee, 0x3, 0xf7, 0xe7, 0xf8,\n                                                        0x87, 0x70, 0xa, 0xfb, 0x50, 0xfb, 0x12, 0x70,\n                                                        0xa, 0xfb, 0xd, 0xfc, 0x36, 0x23, 0xa, 0x9b,\n                                                        0xf7, 0x1d, 0xbd, 0xf7, 0x2, 0xbd, 0xf7, 0x1d,\n                                                        0x1, 0xf7, 0x79, 0xf7, 0x28, 0x14, 0xe0, 0x5c,\n                                                        0xa, 0xf7, 0x32, 0xf7, 0xa, 0x15, 0x49, 0xa,\n                                                        0xfb, 0xef, 0x4, 0x49, 0xa, 0xe, 0x7a, 0xe9,\n                                                        0x3b, 0x76, 0xf8, 0x1c, 0xea, 0x12, 0xa9, 0xed,\n                                                        0xf7, 0xed, 0xec, 0x13, 0x78, 0xb2, 0xa9, 0x15,\n                                                        0x8d, 0xc1, 0x56, 0x8a, 0x8d, 0x1f, 0x8b, 0xa1,\n                                                        0x9e, 0xaa, 0xa7, 0x1e, 0x13, 0xb8, 0x72, 0xb6,\n                                                        0xbe, 0x7c, 0xc3, 0x1b, 0xf7, 0x29, 0xf7, 0xd,\n                                                        0xf6, 0xf7, 0x18, 0xc0, 0x77, 0xbd, 0x69, 0xb3,\n                                                        0x1f, 0xa7, 0xa6, 0x9b, 0x9c, 0x8b, 0x8b, 0x53,\n                                                        0xbf, 0x8a, 0x1a, 0x8b, 0x77, 0x7f, 0x6c, 0x6e,\n                                                        0x1e, 0xa6, 0x60, 0x56, 0x9c, 0x52, 0x1b, 0xfb,\n                                                        0x29, 0xfb, 0xd, 0xfb, 0x1, 0xfb, 0x18, 0x53,\n                                                        0xa0, 0x59, 0xaf, 0x62, 0x1f, 0x6d, 0x6f, 0x79,\n                                                        0x7a, 0x8b, 0x1a, 0xf7, 0xa, 0xf7, 0x3, 0x15,\n                                                        0x78, 0xa2, 0x81, 0xa6, 0xa9, 0x1a, 0xdb, 0xd8,\n                                                        0xce, 0xea, 0xa7, 0xa7, 0x83, 0x81, 0xa3, 0x1e,\n                                                        0x45, 0x4a, 0x36, 0x3b, 0x47, 0x4b, 0x8, 0xcd,\n                                                        0x5a, 0x15, 0xd0, 0xcb, 0xe1, 0xdb, 0xce, 0xca,\n                                                        0x8, 0x9d, 0x75, 0x95, 0x70, 0x6e, 0x1a, 0x3b,\n                                                        0x3d, 0x4b, 0x2c, 0x6f, 0x71, 0x90, 0x95, 0x74,\n                                                        0x1e, 0xe, 0x3c, 0xa, 0xf7, 0x17, 0xf8, 0xc3,\n                                                        0x15, 0xf7, 0xcc, 0x3d, 0xa2, 0xc7, 0xfb, 0xbc,\n                                                        0xf7, 0xc, 0x5, 0xfb, 0x2f, 0xfb, 0xde, 0x28,\n                                                        0xa, 0x3c, 0xa, 0xf7, 0x43, 0xf8, 0x76, 0x15,\n                                                        0xf7, 0xcf, 0xd7, 0x62, 0xf2, 0xfb, 0xbd, 0x6a,\n                                                        0xa, 0xfb, 0x1d, 0xfb, 0x66, 0x28, 0xa, 0x4a,\n                                                        0xa, 0xf7, 0x7f, 0x36, 0xa, 0xf7, 0x1d, 0xf8,\n                                                        0x71, 0x15, 0xf7, 0x2a, 0xf4, 0xf7, 0x29, 0x22,\n                                                        0xc6, 0xae, 0xfb, 0x34, 0xf7, 0x25, 0x5, 0x2b,\n                                                        0x6, 0xfb, 0x37, 0xfb, 0x24, 0x5, 0x4e, 0xfb,\n                                                        0x4a, 0x28, 0xa, 0x4a, 0xa, 0xd9, 0xf7, 0x11,\n                                                        0x12, 0x9a, 0xf7, 0x42, 0x2e, 0xe8, 0x5a, 0xf7,\n                                                        0x2, 0xd0, 0xf7, 0x2, 0x29, 0xf7, 0x41, 0x2d,\n                                                        0xe9, 0x2d, 0xf7, 0x43, 0x13, 0xb3, 0x0, 0xf7,\n                                                        0xd3, 0xf8, 0x88, 0x6f, 0xa, 0xfb, 0x47, 0xfb,\n                                                        0x11, 0x6f, 0xa, 0x13, 0xb9, 0x0, 0xfb, 0x11,\n                                                        0xfb, 0xba, 0x15, 0x13, 0xb4, 0x40, 0x2e, 0xa,\n                                                        0x13, 0x78, 0x20, 0x64, 0xf7, 0x43, 0xe6, 0x7,\n                                                        0x13, 0x78, 0x80, 0x3a, 0xf7, 0xe1, 0xfb, 0x41,\n                                                        0x30, 0x6, 0x13, 0xb8, 0x40, 0x2c, 0xa, 0xfb,\n                                                        0x22, 0xe2, 0xf8, 0x26, 0xe2, 0xf7, 0x77, 0x77,\n                                                        0x1, 0xf7, 0x59, 0xf8, 0x7f, 0x15, 0xf7, 0xcf,\n                                                        0xd2, 0x62, 0xee, 0xfb, 0xbe, 0xfb, 0x7, 0x5,\n                                                        0xfb, 0x19, 0xfc, 0xed, 0x15, 0x34, 0xf7, 0xc9,\n                                                        0xe2, 0x33, 0x3a, 0xa, 0xfb, 0xa7, 0x35, 0xfb,\n                                                        0x13, 0x5, 0xe, 0xfb, 0x22, 0xe4, 0xe0, 0xe3,\n                                                        0xf7, 0x9a, 0xe4, 0xcd, 0xe4, 0x12, 0x93, 0xf7,\n                                                        0x49, 0x29, 0xed, 0xf7, 0xc4, 0xee, 0x13, 0xfa,\n                                                        0x93, 0x56, 0x15, 0x32, 0xf7, 0xe1, 0xe4, 0xfb,\n                                                        0x2c, 0xf7, 0x18, 0x7, 0x7d, 0xa1, 0xc3, 0x6a,\n                                                        0xde, 0x1b, 0xf7, 0x21, 0xf0, 0xee, 0xf7, 0x10,\n                                                        0xf7, 0x2b, 0xfb, 0x23, 0xcc, 0x24, 0x51, 0x51,\n                                                        0x7b, 0x6d, 0x62, 0x1f, 0xf7, 0x5d, 0xfb, 0x49,\n                                                        0x32, 0x7, 0x13, 0xf6, 0xde, 0xfc, 0xe2, 0x6,\n                                                        0x13, 0xfa, 0xe9, 0xf7, 0xc6, 0x15, 0xf7, 0x2,\n                                                        0xf7, 0x9, 0x9e, 0xb4, 0xdb, 0xd1, 0x5d, 0x38,\n                                                        0x3b, 0x43, 0x56, 0x3c, 0x5c, 0xfb, 0x2, 0xa5,\n                                                        0xf6, 0x1e, 0xe, 0xfb, 0x22, 0xe1, 0xf8, 0x26,\n                                                        0xe2, 0xd3, 0xf7, 0xc, 0x1, 0xf7, 0x31, 0xf7,\n                                                        0x3, 0xd2, 0xf7, 0x3, 0x3, 0xf7, 0xe7, 0xf8,\n                                                        0x8d, 0x15, 0xf7, 0x3, 0xf7, 0xc, 0x6b, 0xa,\n                                                        0xfb, 0x4a, 0xfb, 0xc, 0x15, 0xf7, 0x3, 0xf7,\n                                                        0xc, 0x6b, 0xa, 0xfb, 0x9, 0xfd, 0x3d, 0x15,\n                                                        0x35, 0xf7, 0xbf, 0xe1, 0x3d, 0x3a, 0xa, 0xfb,\n                                                        0xa5, 0x35, 0xfb, 0x15, 0x5, 0xe, 0x8b, 0xe6,\n                                                        0xf7, 0xf2, 0xe6, 0x4e, 0xe6, 0xb6, 0xf7, 0x23,\n                                                        0x12, 0xf7, 0x8f, 0xf0, 0x13, 0xb8, 0x66, 0xa,\n                                                        0xe6, 0xfb, 0x3f, 0x6, 0x13, 0xd8, 0xf7, 0xf2,\n                                                        0x74, 0xa, 0xfb, 0xf2, 0xfb, 0x42, 0x7, 0xf7,\n                                                        0x3d, 0xf8, 0x96, 0x79, 0xa, 0x6b, 0xa, 0xe,\n                                                        0x7c, 0xa, 0x40, 0xa, 0xf7, 0xed, 0xfb, 0x7f,\n                                                        0x2d, 0xf7, 0x1c, 0xfb, 0x8f, 0xfb, 0x41, 0x6,\n                                                        0xe, 0x79, 0xe6, 0xf8, 0x22, 0xe6, 0x1, 0xcb,\n                                                        0xf0, 0xf3, 0xed, 0xf0, 0xeb, 0x3, 0x7c, 0x79,\n                                                        0x15, 0xf7, 0x99, 0xe6, 0x3a, 0xf8, 0x22, 0xd9,\n                                                        0xe6, 0xfb, 0x95, 0x30, 0xd9, 0xfc, 0x22, 0x3c,\n                                                        0x6, 0xf7, 0xb0, 0x74, 0x15, 0x78, 0x9e, 0xa2,\n                                                        0x5a, 0xf5, 0x1b, 0xf7, 0x12, 0xa0, 0xd5, 0xf7,\n                                                        0x1f, 0x1f, 0xf7, 0xa7, 0xbe, 0xe7, 0xfb, 0x9a,\n                                                        0x2f, 0xf7, 0x7, 0xfb, 0xa8, 0x7, 0x49, 0x8a,\n                                                        0x53, 0x56, 0x5b, 0x8c, 0x78, 0xa, 0xfb, 0x23,\n                                                        0xe4, 0x32, 0xea, 0xf8, 0x31, 0xe6, 0x80, 0x77,\n                                                        0xe4, 0xf7, 0x24, 0x12, 0xae, 0xf7, 0x25, 0xfb,\n                                                        0x3, 0xf7, 0x3, 0x29, 0xed, 0xf7, 0x9f, 0xf7,\n                                                        0xa, 0x13, 0xac, 0x80, 0xd0, 0xf8, 0x97, 0x79,\n                                                        0xa, 0x6, 0x13, 0x5a, 0x80, 0x6b, 0xa, 0x56,\n                                                        0xfd, 0x56, 0x15, 0x2c, 0xf7, 0x77, 0xea, 0x4c,\n                                                        0xf8, 0x81, 0x7, 0x13, 0x9c, 0x80, 0xfb, 0x25,\n                                                        0x2b, 0x6, 0x13, 0x69, 0x80, 0xba, 0xfc, 0x21,\n                                                        0x6, 0xf8, 0x1, 0xf8, 0xc6, 0x73, 0xa, 0xfb,\n                                                        0x24, 0xfd, 0x49, 0x15, 0x73, 0x30, 0x5, 0x87,\n                                                        0xa9, 0x9a, 0x7b, 0xc8, 0x1b, 0xf7, 0x63, 0x82,\n                                                        0xf7, 0x1b, 0xc6, 0x1f, 0xf8, 0x2c, 0xfb, 0x80,\n                                                        0x30, 0xf7, 0x18, 0xfb, 0xcd, 0x7, 0x46, 0x81,\n                                                        0x66, 0x3b, 0x64, 0x7d, 0x94, 0x95, 0x6a, 0x1e,\n                                                        0xe, 0x32, 0xa, 0xf7, 0x17, 0xed, 0xf7, 0x85,\n                                                        0xee, 0x3, 0xa9, 0x16, 0xf8, 0xaf, 0xf7, 0x9c,\n                                                        0x28, 0xfb, 0x41, 0xfb, 0x85, 0xf7, 0x2e, 0x6,\n                                                        0xf7, 0x36, 0xbb, 0x5, 0xc9, 0x7, 0xfb, 0x36,\n                                                        0x5d, 0x5, 0xf7, 0x36, 0xf7, 0x13, 0xe6, 0xfb,\n                                                        0xda, 0x30, 0xf0, 0xfb, 0x50, 0x7, 0x36, 0x73,\n                                                        0x5, 0x4c, 0x7, 0xe0, 0xa1, 0x5, 0xfb, 0x13,\n                                                        0x26, 0x7, 0xe, 0x8b, 0xe9, 0xf8, 0x4a, 0x40,\n                                                        0xa, 0xf7, 0x68, 0x6, 0xf7, 0x12, 0xaf, 0x5,\n                                                        0xcd, 0x7, 0xfb, 0x12, 0x67, 0x5, 0xf7, 0x92,\n                                                        0xfb, 0x9e, 0x2d, 0xf7, 0x3b, 0xfb, 0x4f, 0x7,\n                                                        0xfb, 0x9, 0x69, 0x5, 0x4b, 0x7, 0xf7, 0x9,\n                                                        0xab, 0x5, 0xfb, 0x4d, 0xfb, 0x41, 0x7, 0xe,\n                                                        0x8b, 0xe6, 0x30, 0xf7, 0x3e, 0xa0, 0xf7, 0x4f,\n                                                        0x94, 0xf7, 0x43, 0x30, 0xe6, 0x12, 0x81, 0xe9,\n                                                        0xf7, 0x6f, 0xea, 0xaf, 0xd6, 0xa5, 0xd6, 0x13,\n                                                        0xaf, 0x80, 0xf8, 0x22, 0xe6, 0x15, 0xf7, 0x2b,\n                                                        0xaf, 0x58, 0xd6, 0xf7, 0x4f, 0x40, 0x5d, 0x67,\n                                                        0xf7, 0x1f, 0xf7, 0x1d, 0x7, 0x13, 0xb7, 0x80,\n                                                        0x37, 0xd6, 0xf7, 0x43, 0xfc, 0x16, 0x7, 0xfb,\n                                                        0xe, 0xfb, 0x4, 0xfb, 0x7, 0xfb, 0x43, 0xfb,\n                                                        0x43, 0xf7, 0x5, 0x2a, 0xf2, 0x1f, 0xf8, 0x28,\n                                                        0x6, 0x13, 0x77, 0x80, 0xf7, 0x3e, 0x40, 0x7,\n                                                        0x13, 0xaf, 0x80, 0x3c, 0x7, 0xfb, 0x7c, 0xbc,\n                                                        0x15, 0x5c, 0x5d, 0x89, 0x79, 0x23, 0x58, 0xd3,\n                                                        0xf7, 0x1, 0xf7, 0xf, 0xd2, 0xd7, 0xe8, 0x9b,\n                                                        0xb2, 0x8a, 0x66, 0x1e, 0xe, 0x7c, 0xe9, 0xec,\n                                                        0xea, 0xe3, 0xea, 0x1, 0x7d, 0xed, 0xf7, 0x3a,\n                                                        0xed, 0x3, 0xf7, 0xf5, 0xf7, 0x44, 0x15, 0xf7,\n                                                        0x8f, 0x6, 0xf7, 0xf, 0x9d, 0x61, 0xf7, 0x2f,\n                                                        0xfb, 0x23, 0x1b, 0x5c, 0x60, 0x78, 0x68, 0x6a,\n                                                        0x1f, 0xb1, 0x6a, 0x58, 0x9b, 0x57, 0x1b, 0xfb,\n                                                        0x18, 0x4f, 0x22, 0xfb, 0x1c, 0x49, 0x9b, 0xfb,\n                                                        0x36, 0xf7, 0x39, 0xd1, 0xba, 0xb8, 0xa2, 0x9d,\n                                                        0x1f, 0x6a, 0xaa, 0xa8, 0x68, 0xe5, 0x1b, 0xc4,\n                                                        0xbe, 0x9a, 0xa0, 0xc2, 0x1f, 0x73, 0xe6, 0x5,\n                                                        0x73, 0x4d, 0x53, 0x82, 0x74, 0x1b, 0x38, 0x7d,\n                                                        0xd6, 0x9f, 0x1f, 0x86, 0xec, 0x15, 0xb3, 0x8f,\n                                                        0xa7, 0xbb, 0xc1, 0x1b, 0xcf, 0x93, 0x48, 0x76,\n                                                        0x8c, 0x1f, 0xfc, 0x3f, 0x51, 0x15, 0xab, 0x8b,\n                                                        0xf7, 0x6, 0xe6, 0xd3, 0x8e, 0xfb, 0x2, 0x67,\n                                                        0x67, 0x87, 0x29, 0x3a, 0x47, 0x7e, 0xef, 0xad,\n                                                        0x1e, 0xe, 0xfb, 0x4d, 0x76, 0xf7, 0x7d, 0xf4,\n                                                        0xf7, 0xc, 0xf1, 0xf7, 0xa, 0xf7, 0x2, 0x12,\n                                                        0xba, 0xf7, 0x0, 0x30, 0xf1, 0xd9, 0xf7, 0x2e,\n                                                        0xa5, 0xf6, 0x39, 0xf3, 0x13, 0xfa, 0x80, 0xba,\n                                                        0xa6, 0x15, 0xf7, 0x0, 0xb9, 0x6, 0xa6, 0x80,\n                                                        0xa9, 0x7e, 0xab, 0x82, 0x8, 0xfb, 0x13, 0x7,\n                                                        0x8d, 0x95, 0x9c, 0x92, 0x9d, 0x1b, 0x9d, 0x95,\n                                                        0x81, 0x78, 0x7c, 0x7e, 0x7e, 0x7d, 0x8a, 0x1f,\n                                                        0x74, 0x89, 0x78, 0x93, 0x81, 0x94, 0x6e, 0x55,\n                                                        0x18, 0x79, 0xa1, 0xa9, 0x7e, 0xac, 0x1b, 0xd0,\n                                                        0xae, 0xc2, 0xc0, 0xa8, 0x81, 0xbb, 0x57, 0x97,\n                                                        0x1f, 0x8c, 0xaf, 0x5, 0xf7, 0xc, 0x90, 0xeb,\n                                                        0xcd, 0xf2, 0x1a, 0xf7, 0x11, 0xfb, 0xc, 0xaa,\n                                                        0x2f, 0x88, 0x1e, 0x13, 0xf7, 0x0, 0x28, 0x92,\n                                                        0x3f, 0x93, 0xb7, 0x1a, 0xbf, 0xed, 0x92, 0xa3,\n                                                        0xb9, 0xbf, 0x73, 0x75, 0xb1, 0x1e, 0x54, 0xf6,\n                                                        0xf7, 0x67, 0x20, 0x63, 0x7, 0x9b, 0x62, 0x55,\n                                                        0xa3, 0x59, 0x1b, 0x27, 0xfb, 0x7, 0x5d, 0xfb,\n                                                        0xd, 0xfb, 0x25, 0xf7, 0x35, 0x7f, 0xdb, 0x85,\n                                                        0x1f, 0x13, 0xfa, 0x80, 0xb3, 0x88, 0xf3, 0x98,\n                                                        0x4e, 0x1a, 0x62, 0x43, 0x6f, 0x4f, 0x3e, 0x52,\n                                                        0xb3, 0x96, 0x6f, 0x1e, 0xd2, 0xfb, 0x0, 0x7,\n                                                        0xe, 0xfb, 0x4d, 0x76, 0xf7, 0x59, 0xe3, 0xf1,\n                                                        0xe1, 0x99, 0xf7, 0x46, 0x2e, 0xe8, 0x12, 0xcd,\n                                                        0xef, 0x35, 0xe1, 0x35, 0xea, 0xd3, 0xf7, 0x23,\n                                                        0xa3, 0xee, 0x3f, 0xeb, 0x13, 0xf4, 0xa0, 0xcd,\n                                                        0x82, 0x15, 0xef, 0xb1, 0x6, 0xa4, 0x82, 0xa6,\n                                                        0x80, 0xa8, 0x84, 0x8, 0xfb, 0x0, 0x7, 0x8d,\n                                                        0x95, 0x9a, 0x91, 0x9b, 0x1b, 0x9d, 0x93, 0x82,\n                                                        0x7c, 0x7e, 0x80, 0x80, 0x7d, 0x8a, 0x1f, 0x76,\n                                                        0x89, 0x7a, 0x92, 0x81, 0x93, 0x71, 0x5d, 0x18,\n                                                        0x7c, 0x9f, 0xa7, 0x80, 0xa9, 0x1b, 0xcc, 0xab,\n                                                        0xb9, 0xb8, 0xa3, 0x82, 0xb4, 0x5b, 0x95, 0x1f,\n                                                        0x8c, 0xaa, 0x5, 0xf7, 0x2, 0x90, 0xe4, 0xc2,\n                                                        0xe1, 0x1a, 0xf5, 0xfb, 0x3, 0xa6, 0x36, 0x88,\n                                                        0x1e, 0x13, 0xe9, 0xc0, 0x2f, 0x91, 0x45, 0x92,\n                                                        0xaf, 0x1a, 0xb8, 0xe5, 0x90, 0xa2, 0xb6, 0xbb,\n                                                        0x77, 0x79, 0xae, 0x1e, 0x13, 0xf2, 0xc0, 0x5c,\n                                                        0xee, 0xf7, 0x46, 0x28, 0x69, 0x7, 0x99, 0x65,\n                                                        0x59, 0x9f, 0x5d, 0x1b, 0x2e, 0x20, 0x64, 0x24,\n                                                        0xfb, 0xe, 0xf7, 0x2a, 0x82, 0xd5, 0x86, 0x1f,\n                                                        0x13, 0xf4, 0xa0, 0xaf, 0x88, 0xec, 0x95, 0x58,\n                                                        0x1a, 0x69, 0x48, 0x73, 0x53, 0x44, 0x58, 0xae,\n                                                        0x94, 0x71, 0x1e, 0x13, 0xf4, 0xc0, 0xc7, 0x27,\n                                                        0x7, 0xe, 0x75, 0xe6, 0x8b, 0xf7, 0x27, 0xf7,\n                                                        0x97, 0xe6, 0x8b, 0xb6, 0x6d, 0xb6, 0xf7, 0x3c,\n                                                        0x77, 0x12, 0xba, 0xf1, 0x36, 0xe0, 0x36, 0xf2,\n                                                        0xf7, 0x99, 0xf1, 0x3d, 0xf0, 0x13, 0xed, 0x20,\n                                                        0xba, 0x75, 0x15, 0xf1, 0xae, 0x6, 0x82, 0xa1,\n                                                        0xbc, 0x71, 0xdc, 0x1b, 0xf7, 0x1d, 0xf7, 0x7,\n                                                        0xcc, 0xf7, 0x0, 0xe7, 0x3e, 0xb5, 0x3a, 0x98,\n                                                        0x1f, 0x13, 0xf4, 0xc0, 0x53, 0x93, 0xfb, 0x40,\n                                                        0x7e, 0xe7, 0x1a, 0xb5, 0xbc, 0xbb, 0xe6, 0xb6,\n                                                        0xb5, 0x7f, 0x7c, 0xaf, 0x1e, 0x22, 0xf1, 0xf7,\n                                                        0x73, 0x25, 0x73, 0x7, 0x9a, 0x67, 0x5f, 0x94,\n                                                        0x5e, 0x1b, 0xfb, 0x32, 0x3a, 0x26, 0x3b, 0xfb,\n                                                        0x2e, 0xf7, 0x48, 0x85, 0xf7, 0xa, 0x82, 0x1f,\n                                                        0x13, 0xed, 0x20, 0xc3, 0x87, 0xad, 0x79, 0x60,\n                                                        0x1a, 0x5b, 0x60, 0x69, 0xfb, 0x0, 0x54, 0x57,\n                                                        0x9a, 0xa4, 0x5e, 0x1e, 0xde, 0x7, 0x13, 0xee,\n                                                        0x40, 0x25, 0x6, 0x13, 0xf5, 0x40, 0xf7, 0x62,\n                                                        0xf8, 0x35, 0x15, 0xf5, 0x6, 0xf7, 0x3e, 0xf7,\n                                                        0x24, 0x4c, 0xaf, 0xfb, 0x35, 0x24, 0xfb, 0x31,\n                                                        0xf3, 0x49, 0x69, 0x5, 0xe, 0x7a, 0xe1, 0xed,\n                                                        0xdf, 0x8b, 0xeb, 0x3a, 0xf7, 0x41, 0x2f, 0xe7,\n                                                        0x7d, 0xb9, 0x12, 0xcd, 0xed, 0x37, 0xdf, 0x37,\n                                                        0xea, 0xf7, 0x83, 0xee, 0x40, 0xea, 0x13, 0xe6,\n                                                        0x20, 0xf7, 0x99, 0xf8, 0x79, 0x15, 0xf0, 0x6,\n                                                        0xf7, 0x38, 0xf7, 0x25, 0x4d, 0xb0, 0xfb, 0x2e,\n                                                        0x22, 0xfb, 0x2e, 0xf4, 0x4c, 0x67, 0x5, 0x70,\n                                                        0xfd, 0x1c, 0x15, 0xed, 0xb1, 0x6, 0x7b, 0xb9,\n                                                        0xc3, 0x75, 0xc0, 0x1b, 0xf7, 0xb, 0xea, 0xc2,\n                                                        0xe2, 0xf2, 0xfb, 0x3, 0xa5, 0x36, 0x88, 0x1f,\n                                                        0x13, 0xe4, 0xc0, 0x30, 0x92, 0x44, 0x91, 0xaf,\n                                                        0x1a, 0x13, 0xea, 0x40, 0xb5, 0xe6, 0x90, 0xa1,\n                                                        0xb6, 0xba, 0x78, 0x7a, 0xaf, 0x1e, 0x13, 0xd1,\n                                                        0x40, 0x5e, 0xee, 0xf7, 0x41, 0x28, 0x6a, 0x7,\n                                                        0x99, 0x64, 0x5a, 0x9e, 0x5d, 0x1b, 0x2e, 0x20,\n                                                        0x65, 0x28, 0xfb, 0xc, 0xf7, 0x2a, 0x82, 0xd5,\n                                                        0x85, 0x1f, 0x13, 0xe6, 0x20, 0xaf, 0x88, 0xed,\n                                                        0x96, 0x59, 0x1a, 0x6a, 0x47, 0x74, 0x53, 0x45,\n                                                        0x56, 0xab, 0x94, 0x70, 0x1e, 0xc6, 0x29, 0x7,\n                                                        0xe, 0x8b, 0xe3, 0xf8, 0x1b, 0xe8, 0xe3, 0xf7,\n                                                        0x15, 0x12, 0x99, 0xf7, 0x80, 0x2b, 0xf7, 0x4,\n                                                        0xd1, 0xf7, 0x4, 0x28, 0xf7, 0x80, 0x13, 0xec,\n                                                        0xf7, 0x13, 0x16, 0xf7, 0xe9, 0xe8, 0xfb, 0xe,\n                                                        0xf7, 0x14, 0x6, 0xf7, 0x34, 0xf7, 0x96, 0x5,\n                                                        0x13, 0xea, 0xda, 0xe8, 0xfb, 0x80, 0x2e, 0xc3,\n                                                        0x6, 0x22, 0xfb, 0x3d, 0x23, 0xf7, 0x3d, 0x5,\n                                                        0x13, 0xf4, 0xc1, 0xe8, 0xfb, 0x80, 0x2e, 0xd8,\n                                                        0x6, 0xf7, 0x34, 0xfb, 0x96, 0x5, 0xfb, 0x14,\n                                                        0xfb, 0x10, 0x7, 0xf7, 0x62, 0xf8, 0xcb, 0x15,\n                                                        0xf7, 0x1, 0xf7, 0x15, 0xfb, 0x1, 0x6, 0xfb,\n                                                        0x48, 0xfb, 0x15, 0x15, 0xf7, 0x2, 0xf7, 0x15,\n                                                        0xfb, 0x2, 0x6, 0xe, 0x8b, 0xe6, 0xf8, 0xc,\n                                                        0xe5, 0x8b, 0xc1, 0xf7, 0x47, 0x77, 0x12, 0xcd,\n                                                        0xed, 0xf7, 0xa8, 0xed, 0x17, 0xc8, 0x16, 0xf8,\n                                                        0x71, 0xf7, 0x6e, 0x29, 0xfb, 0x13, 0xfb, 0x8a,\n                                                        0x6, 0xf7, 0xd5, 0xf8, 0x26, 0x5, 0x13, 0x78,\n                                                        0xcb, 0xfc, 0x55, 0xfb, 0x5f, 0xed, 0xf7, 0x5,\n                                                        0xf7, 0x6d, 0x7, 0xfb, 0xd4, 0xfc, 0x22, 0x5,\n                                                        0xf7, 0x4f, 0xf8, 0xb2, 0x15, 0xf0, 0x6, 0xf7,\n                                                        0x36, 0xf7, 0x22, 0x51, 0xaf, 0xfb, 0x30, 0x25,\n                                                        0xfb, 0x2b, 0xf2, 0x4d, 0x69, 0x5, 0xe, 0x8b,\n                                                        0xe7, 0xf7, 0x2f, 0xf7, 0x43, 0x30, 0xe6, 0x8b,\n                                                        0xc8, 0xf7, 0x4c, 0x77, 0x12, 0xe9, 0xee, 0xf7,\n                                                        0x79, 0xec, 0x13, 0xde, 0xf7, 0x94, 0xf8, 0x77,\n                                                        0x15, 0xf0, 0x6, 0xf7, 0x36, 0xf7, 0x26, 0x4e,\n                                                        0xb1, 0xfb, 0x2c, 0x21, 0xfb, 0x2e, 0xf5, 0x4c,\n                                                        0x66, 0x5, 0x82, 0xfd, 0xa, 0x15, 0xf8, 0x4b,\n                                                        0xf7, 0x4e, 0x2a, 0x2d, 0xfb, 0x51, 0x6, 0xf7,\n                                                        0xb2, 0xf7, 0x9c, 0x5, 0xcd, 0xfc, 0x3d, 0xfb,\n                                                        0x43, 0xee, 0x7, 0x13, 0xbe, 0xdf, 0xf7, 0x40,\n                                                        0x7, 0xfb, 0xb1, 0xfb, 0x98, 0x5, 0xe, 0xfb,\n                                                        0x17, 0xe9, 0xf8, 0x9, 0xe8, 0xeb, 0xe6, 0x1,\n                                                        0xa4, 0x6c, 0x15, 0x71, 0x2f, 0x5, 0x87, 0xb1,\n                                                        0xab, 0x87, 0xb7, 0x1b, 0xdd, 0xde, 0xa9, 0xf2,\n                                                        0x9f, 0x1f, 0xd1, 0xf7, 0xe2, 0x5, 0xf6, 0x6,\n                                                        0x9d, 0xe8, 0x5, 0xfb, 0x1, 0x6, 0xe5, 0x93,\n                                                        0xad, 0x91, 0xd7, 0x1b, 0xab, 0xaa, 0x87, 0x89,\n                                                        0x9f, 0x1f, 0x9b, 0xe5, 0x5, 0x8d, 0x68, 0x67,\n                                                        0x90, 0x66, 0x1b, 0xfb, 0x10, 0x8a, 0x4b, 0x5f,\n                                                        0x7b, 0xfb, 0x22, 0x8, 0x25, 0x6, 0x78, 0x2e,\n                                                        0x5, 0xf3, 0x6, 0x4f, 0xfb, 0xae, 0x5, 0x3d,\n                                                        0x7d, 0x79, 0x7e, 0x51, 0x1b, 0x73, 0x5a, 0x8f,\n                                                        0x8d, 0x73, 0x1f, 0xe, 0x79, 0xe9, 0x8b, 0xf1,\n                                                        0x8b, 0xea, 0x8b, 0xd1, 0xf7, 0x26, 0xe6, 0x8b,\n                                                        0xaf, 0xf7, 0x42, 0x77, 0x12, 0x99, 0xed, 0xf7,\n                                                        0xdd, 0xea, 0x35, 0xed, 0x13, 0xff, 0x80, 0x46,\n                                                        0xa, 0xd0, 0xf7, 0x17, 0xf7, 0x21, 0xe6, 0xd3,\n                                                        0xed, 0x1f, 0x13, 0xff, 0x40, 0x41, 0xa, 0xfb,\n                                                        0xf, 0xfb, 0x4d, 0xfb, 0x62, 0xf7, 0x33, 0x37,\n                                                        0xf7, 0x36, 0x1f, 0x13, 0xff, 0x80, 0x58, 0xa,\n                                                        0x64, 0xf7, 0xeb, 0x15, 0xe7, 0x6, 0xf7, 0x29,\n                                                        0xf7, 0x1e, 0x5, 0x13, 0xff, 0x40, 0x3e, 0xa,\n                                                        0xfb, 0x26, 0xe4, 0xed, 0xe3, 0x3d, 0xe3, 0xf7,\n                                                        0x6b, 0xe4, 0x3e, 0xe3, 0x8b, 0xb2, 0xf7, 0x42,\n                                                        0x77, 0x69, 0xa, 0x13, 0xd7, 0x80, 0x50, 0xa,\n                                                        0xf3, 0xf2, 0x1f, 0xf7, 0xb9, 0x7, 0x13, 0xd7,\n                                                        0x40, 0xd7, 0xe4, 0xfb, 0x3c, 0x6e, 0x6, 0x13,\n                                                        0xcf, 0x80, 0x5a, 0xa, 0x1f, 0x13, 0xaf, 0x80,\n                                                        0xfb, 0x9, 0xee, 0x3c, 0xf7, 0x21, 0xc0, 0xbe,\n                                                        0x98, 0xa7, 0xb1, 0x1e, 0x67, 0x7, 0x51, 0x88,\n                                                        0x54, 0x42, 0xa, 0x69, 0x33, 0x43, 0x44, 0xb1,\n                                                        0xd2, 0x1e, 0xf7, 0x1d, 0xf7, 0x89, 0x43, 0xa,\n                                                        0xf8, 0x8c, 0x76, 0xf7, 0x42, 0x77, 0x1, 0xf7,\n                                                        0x35, 0xf8, 0x77, 0x15, 0xf7, 0x20, 0xf7, 0x2,\n                                                        0xf7, 0x20, 0xfb, 0x2, 0xc3, 0xac, 0xfb, 0x29,\n                                                        0xf7, 0x21, 0x5, 0x2e, 0x6, 0xfb, 0x2c, 0xfb,\n                                                        0x20, 0x5, 0xe, 0xf8, 0x96, 0x76, 0xf7, 0x42,\n                                                        0x77, 0x1, 0xf7, 0x94, 0xf8, 0x81, 0x43, 0xa,\n                                                        0xf8, 0x68, 0xde, 0x38, 0xf7, 0x37, 0x12, 0x13,\n                                                        0x40, 0xde, 0xf9, 0xb, 0x15, 0x43, 0x98, 0xcb,\n                                                        0x30, 0xf7, 0x21, 0x1b, 0xf7, 0x32, 0xbd, 0xf7,\n                                                        0x4, 0xbe, 0x93, 0x1f, 0x2e, 0x6, 0x13, 0x80,\n                                                        0x63, 0x7a, 0x70, 0x63, 0x3c, 0x1b, 0x13, 0x40,\n                                                        0x3d, 0x66, 0xb6, 0xb0, 0x83, 0x1f, 0xe, 0xf8,\n                                                        0x79, 0xf7, 0x20, 0x1, 0xf7, 0x7a, 0xf7, 0x20,\n                                                        0x3, 0xf7, 0x7a, 0xf8, 0x79, 0x15, 0xf7, 0x20,\n                                                        0xf7, 0x20, 0xfb, 0x20, 0x6, 0xe, 0xf8, 0x75,\n                                                        0xf7, 0x59, 0x1, 0xf7, 0x5a, 0xc8, 0xdd, 0xc8,\n                                                        0x3, 0xf7, 0x5a, 0xf8, 0xd7, 0x15, 0x56, 0xb9,\n                                                        0x5e, 0xc2, 0xc4, 0xb9, 0xb8, 0xc0, 0xc1, 0x5d,\n                                                        0xb8, 0x52, 0x54, 0x5d, 0x5e, 0x55, 0x1e, 0xc8,\n                                                        0x16, 0xa2, 0x9d, 0x9d, 0xa1, 0xa3, 0x9d, 0x79,\n                                                        0x74, 0x75, 0x79, 0x79, 0x73, 0x75, 0x79, 0x9d,\n                                                        0xa1, 0x1e, 0xe, 0xfb, 0x5b, 0xf7, 0x5b, 0x12,\n                                                        0xf7, 0x5d, 0xe4, 0x32, 0xf7, 0x51, 0x13, 0xc0,\n                                                        0xf7, 0xbe, 0x16, 0x7d, 0x88, 0x38, 0x68, 0x42,\n                                                        0x1a, 0x5d, 0xaf, 0x61, 0xc0, 0x1e, 0x13, 0xa0,\n                                                        0xab, 0xb9, 0x9e, 0xa0, 0xa1, 0x1f, 0xd7, 0x7,\n                                                        0x13, 0xc0, 0x79, 0x73, 0x39, 0x60, 0xc5, 0x1a,\n                                                        0xb6, 0xde, 0xad, 0xa5, 0x9a, 0x1e, 0xe, 0xe3,\n                                                        0xf8, 0x3b, 0x3, 0xe3, 0xf8, 0x9a, 0x15, 0xdc,\n                                                        0x72, 0x5, 0xa3, 0x98, 0x95, 0xae, 0xac, 0x1b,\n                                                        0x9e, 0xa0, 0x7e, 0x7d, 0xa2, 0x1f, 0x7d, 0xa4,\n                                                        0xa7, 0x7c, 0xab, 0x1b, 0xec, 0xaa, 0xdf, 0xab,\n                                                        0x95, 0x1f, 0x3a, 0xa3, 0x5, 0x64, 0x78, 0x83,\n                                                        0x76, 0x6e, 0x1b, 0x78, 0x76, 0x96, 0x97, 0x75,\n                                                        0x1f, 0x9b, 0x6f, 0x6e, 0x9d, 0x6e, 0x1b, 0x2d,\n                                                        0x6f, 0x41, 0x62, 0x7b, 0x1f, 0xe, 0xf8, 0x8f,\n                                                        0x76, 0xf7, 0x43, 0x77, 0x1, 0xb3, 0xf8, 0x9c,\n                                                        0x3, 0xf7, 0x93, 0xf8, 0x8f, 0x15, 0xc8, 0x76,\n                                                        0xf7, 0x88, 0xf7, 0x25, 0x28, 0xa9, 0x5, 0xfc,\n                                                        0x39, 0xfb, 0x2e, 0x15, 0xc8, 0x76, 0xf7, 0x8a,\n                                                        0xf7, 0x25, 0x28, 0xa9, 0x5, 0xe, 0xf7, 0x5f,\n                                                        0xef, 0x1, 0xcc, 0xf8, 0x6a, 0x3, 0xcc, 0xf7,\n                                                        0x5f, 0x15, 0xf8, 0x6a, 0xef, 0xfc, 0x6a, 0x6,\n                                                        0xe, 0xf7, 0x5f, 0xef, 0x1, 0x81, 0xf9, 0x0,\n                                                        0x3, 0x81, 0xf7, 0x5f, 0x15, 0xf9, 0x0, 0xef,\n                                                        0xfd, 0x0, 0x6, 0xe, 0xf7, 0xbe, 0x76, 0xf7,\n                                                        0xb5, 0x77, 0x1, 0xf7, 0xc7, 0xf7, 0xa9, 0x15,\n                                                        0xf7, 0xa, 0x6, 0x2b, 0xf7, 0xb5, 0x5, 0xfb,\n                                                        0x2e, 0x6, 0xe, 0x4c, 0xa, 0xf7, 0x42, 0xf7,\n                                                        0xa9, 0x15, 0xf7, 0xa, 0x6, 0xf7, 0x1a, 0x59,\n                                                        0xa, 0xfb, 0x30, 0x6, 0xe, 0xfb, 0xd, 0x45,\n                                                        0xa, 0xf7, 0x42, 0xfb, 0x22, 0x15, 0xf7, 0xd,\n                                                        0x6, 0xf7, 0x17, 0x59, 0xa, 0xfb, 0x2f, 0x6,\n                                                        0xe, 0x4c, 0xa, 0xf8, 0x33, 0xf7, 0xa9, 0x5d,\n                                                        0xa, 0x36, 0xfb, 0xb1, 0x5d, 0xa, 0xe, 0x4c,\n                                                        0xa, 0xf7, 0xad, 0xf7, 0xa9, 0x15, 0xf7, 0xb,\n                                                        0x6, 0xf7, 0x18, 0x59, 0xa, 0xfb, 0x2d, 0x6,\n                                                        0xfb, 0xcb, 0x4e, 0xa, 0xfb, 0xd, 0x45, 0xa,\n                                                        0xf7, 0xad, 0xfb, 0x22, 0x15, 0xf7, 0xa, 0x6,\n                                                        0xf7, 0x19, 0x59, 0xa, 0xfb, 0x2e, 0x6, 0xfb,\n                                                        0xca, 0x4e, 0xa, 0xf7, 0xdc, 0xed, 0x1, 0xf7,\n                                                        0x8e, 0xef, 0x3, 0xf7, 0x8e, 0x45, 0x15, 0xef,\n                                                        0xf8, 0x29, 0xf7, 0x24, 0xed, 0xfb, 0x24, 0xf7,\n                                                        0x1d, 0x27, 0xfb, 0x1d, 0xfb, 0x24, 0x29, 0xf7,\n                                                        0x24, 0x6, 0xe, 0x5a, 0x76, 0xf7, 0x53, 0xed,\n                                                        0xf6, 0xed, 0xf7, 0x30, 0x77, 0x1, 0xf7, 0x90,\n                                                        0xee, 0x3, 0xf5, 0xf7, 0xd, 0x15, 0xf7, 0x26,\n                                                        0xfb, 0x53, 0xee, 0xf7, 0x53, 0xf7, 0x23, 0xed,\n                                                        0xfb, 0x23, 0xf6, 0xf7, 0x23, 0xed, 0xfb, 0x23,\n                                                        0xf7, 0x30, 0x28, 0xfb, 0x30, 0xfb, 0x26, 0x29,\n                                                        0xf7, 0x26, 0x20, 0xfb, 0x26, 0x6, 0xe, 0xf7,\n                                                        0xc, 0xf7, 0xfe, 0x1, 0xf7, 0xc, 0xf7, 0xfc,\n                                                        0x3, 0xf8, 0x74, 0xf7, 0xc1, 0x15, 0xef, 0x3b,\n                                                        0xdc, 0x27, 0x27, 0x3b, 0x3a, 0x27, 0x27, 0xdb,\n                                                        0x3a, 0xef, 0xef, 0xdb, 0xdc, 0xef, 0x1e, 0xe,\n                                                        0x7c, 0xf7, 0x17, 0x1, 0xa5, 0xf7, 0x1c, 0xd1,\n                                                        0xf7, 0x1c, 0xd1, 0xf7, 0x1c, 0x14, 0x70, 0xf8,\n                                                        0x4a, 0xbd, 0x15, 0x6c, 0xa3, 0x69, 0xb9, 0xb6,\n                                                        0xa2, 0xad, 0xab, 0xad, 0x75, 0xaa, 0x5e, 0x5a,\n                                                        0x77, 0x66, 0x6e, 0x1e, 0xfb, 0x62, 0x16, 0x6c,\n                                                        0xa3, 0x69, 0xb9, 0xb7, 0xa1, 0xad, 0xab, 0xad,\n                                                        0x75, 0xaa, 0x5e, 0x5b, 0x76, 0x66, 0x6e, 0x1e,\n                                                        0xfb, 0x62, 0x16, 0x6c, 0xa4, 0x69, 0xb8, 0xb7,\n                                                        0xa1, 0xad, 0xab, 0xad, 0x76, 0xaa, 0x5d, 0x5b,\n                                                        0x76, 0x66, 0x6e, 0x1e, 0xe, 0x7c, 0xd1, 0xf7,\n                                                        0x1d, 0xd1, 0xd9, 0xd1, 0xf7, 0x1c, 0xd1, 0x12,\n                                                        0xfb, 0x5, 0xd8, 0xf3, 0xd7, 0x74, 0xd7, 0xf3,\n                                                        0xd8, 0xa3, 0xd7, 0xf7, 0x32, 0xd8, 0x13, 0xfb,\n                                                        0xc0, 0xf8, 0x26, 0xf7, 0xf, 0x15, 0x43, 0xc6,\n                                                        0x4a, 0xeb, 0x8a, 0x1e, 0xe1, 0xd1, 0xc6, 0xdb,\n                                                        0xd2, 0x4f, 0xce, 0x2d, 0x2f, 0x4a, 0x68, 0xa,\n                                                        0xc0, 0xbd, 0xa8, 0x6b, 0x67, 0x5c, 0x63, 0x75,\n                                                        0x63, 0x58, 0x70, 0xac, 0xaf, 0x1e, 0xfc, 0xe3,\n                                                        0xf7, 0xf5, 0x15, 0x43, 0xc6, 0x4b, 0xea, 0x8a,\n                                                        0x1e, 0xe2, 0xd0, 0xc6, 0xda, 0xd2, 0x50, 0xce,\n                                                        0x2c, 0x2f, 0x4b, 0x49, 0x42, 0x1f, 0xd8, 0x8c,\n                                                        0x15, 0xae, 0xa4, 0xac, 0xbf, 0xbe, 0xa8, 0x6b,\n                                                        0x67, 0x5d, 0x64, 0x75, 0x61, 0x5a, 0x70, 0xab,\n                                                        0xaf, 0x1e, 0x13, 0xfd, 0xc0, 0xf3, 0xfb, 0xf7,\n                                                        0x15, 0x43, 0xc5, 0x4a, 0xea, 0x8a, 0x1e, 0xe2,\n                                                        0xd1, 0xc6, 0xdb, 0xd2, 0x4f, 0xce, 0x2c, 0x2f,\n                                                        0x4c, 0x68, 0xa, 0xbe, 0xbe, 0xa8, 0x6b, 0x67,\n                                                        0x5c, 0x64, 0x75, 0x61, 0x5a, 0x70, 0xac, 0xaf,\n                                                        0x1e, 0xfb, 0x5b, 0xc0, 0x15, 0xf8, 0x55, 0xf7,\n                                                        0x52, 0x6c, 0xca, 0xfc, 0x56, 0xfb, 0x51, 0x5,\n                                                        0xe, 0x7b, 0xa, 0xf7, 0x21, 0xf7, 0x96, 0x15,\n                                                        0xf7, 0x9f, 0xfb, 0x50, 0xbc, 0xca, 0xfb, 0x4b,\n                                                        0xf7, 0x15, 0xf7, 0x4b, 0xf7, 0xd, 0x5a, 0xca,\n                                                        0x5, 0xe, 0x7b, 0xa, 0xf7, 0x21, 0xf7, 0xd0,\n                                                        0x3, 0xf7, 0x52, 0xf8, 0x52, 0x15, 0x5a, 0x4c,\n                                                        0xf7, 0x4b, 0xfb, 0xd, 0xfb, 0x4b, 0xfb, 0x15,\n                                                        0xbc, 0x4c, 0xf7, 0x9f, 0xf7, 0x50, 0x5, 0xe,\n                                                        0x64, 0x76, 0xf9, 0x65, 0x77, 0x1, 0xa3, 0xf8,\n                                                        0xbb, 0x3, 0xa3, 0x83, 0x15, 0xd1, 0x57, 0xf8,\n                                                        0x75, 0xf9, 0x34, 0x44, 0xbc, 0x5, 0xe, 0x84,\n                                                        0x76, 0xf7, 0x5f, 0xd4, 0xba, 0xd4, 0xf7, 0x2b,\n                                                        0xe8, 0x1, 0xf7, 0xf, 0xe9, 0x3, 0xc7, 0xaf,\n                                                        0x15, 0xbe, 0x4b, 0x5, 0x93, 0x97, 0xec, 0xb0,\n                                                        0xbb, 0x1b, 0xa1, 0xa6, 0x82, 0x83, 0xa6, 0x1f,\n                                                        0x84, 0xa2, 0xad, 0x85, 0x9f, 0x1b, 0xd3, 0xa8,\n                                                        0xbd, 0x71, 0xa, 0x7a, 0x72, 0x64, 0xa, 0x6b,\n                                                        0x94, 0x7c, 0x1b, 0x7a, 0x50, 0x86, 0x85, 0x7c,\n                                                        0x1f, 0xa6, 0x9a, 0x93, 0xb7, 0x89, 0xa0, 0x8,\n                                                        0xf7, 0x45, 0xd4, 0xfb, 0x50, 0x6, 0x88, 0x93,\n                                                        0x87, 0xa3, 0x8a, 0x9a, 0x8, 0xf7, 0x58, 0xd4,\n                                                        0xfb, 0x5a, 0x6, 0x89, 0xa8, 0x8a, 0xa4, 0x94,\n                                                        0x6c, 0xa, 0xba, 0x72, 0x5e, 0xa0, 0x1f, 0xde,\n                                                        0xaf, 0x5, 0xb9, 0x70, 0x57, 0xdc, 0x63, 0xa,\n                                                        0x83, 0x8b, 0x77, 0x8d, 0x73, 0x1e, 0x47, 0x42,\n                                                        0xd0, 0x6, 0x8e, 0x75, 0x8b, 0x79, 0x8d, 0x84,\n                                                        0x8, 0x41, 0x42, 0xe1, 0x6, 0x91, 0x59, 0x63,\n                                                        0x4d, 0x5a, 0x70, 0x8, 0xe, 0x8b, 0xde, 0xe5,\n                                                        0xd5, 0xc1, 0xd4, 0xf4, 0xde, 0x1, 0xd8, 0xee,\n                                                        0xf7, 0xdd, 0xed, 0x3, 0x82, 0xf7, 0x4c, 0x15,\n                                                        0xef, 0x6, 0xfb, 0xe, 0xae, 0xf7, 0x8, 0x4d,\n                                                        0xf7, 0xd, 0x1b, 0xe3, 0xe1, 0xaa, 0xbc, 0xd3,\n                                                        0x1f, 0x53, 0xc3, 0x5, 0x63, 0x65, 0x3a, 0x79,\n                                                        0x48, 0x1b, 0x46, 0x8c, 0x44, 0xb3, 0x6d, 0xcc,\n                                                        0x8, 0xf7, 0x40, 0x6, 0xa5, 0xd5, 0x5, 0xfb,\n                                                        0x6e, 0x6, 0x8a, 0x91, 0x8b, 0x94, 0x91, 0x92,\n                                                        0x8c, 0x93, 0x92, 0x1a, 0xf7, 0x7b, 0x6, 0xa6,\n                                                        0xd4, 0x5, 0xfb, 0x83, 0x6, 0xd5, 0xa3, 0xd5,\n                                                        0xaa, 0xd3, 0x1b, 0xbf, 0x8a, 0xbf, 0x79, 0xae,\n                                                        0x63, 0x8, 0x47, 0xed, 0xf7, 0x66, 0x29, 0x5c,\n                                                        0x7, 0xaa, 0x5e, 0x56, 0x9b, 0x54, 0x1b, 0xfb,\n                                                        0xa, 0xfb, 0x3, 0x43, 0xfb, 0x8, 0x6a, 0x1f,\n                                                        0x43, 0x6, 0x70, 0x42, 0x5, 0xe1, 0x79, 0x6,\n                                                        0x8c, 0x72, 0x5, 0x4f, 0x6, 0xe, 0x7c, 0xe8,\n                                                        0xf7, 0x1c, 0xe8, 0xf7, 0x36, 0xe8, 0x1, 0xec,\n                                                        0xee, 0xf7, 0x7b, 0xed, 0x3, 0x97, 0x7c, 0x15,\n                                                        0xf7, 0x9c, 0xe8, 0x3b, 0xf7, 0x1c, 0xde, 0x6,\n                                                        0xad, 0x5d, 0xb0, 0x5d, 0xa1, 0x6b, 0x5b, 0x55,\n                                                        0x18, 0xd1, 0x58, 0xaa, 0xa9, 0x95, 0x7c, 0x8d,\n                                                        0x88, 0x93, 0x7f, 0x19, 0xf7, 0x22, 0xe8, 0x32,\n                                                        0x6, 0x7f, 0x9f, 0xcc, 0xe4, 0x44, 0xbc, 0x5c,\n                                                        0x4a, 0x5d, 0xc8, 0x5, 0xf5, 0x9e, 0xab, 0xd1,\n                                                        0xd3, 0x1a, 0xf7, 0xb, 0x28, 0xbd, 0xfb, 0x8,\n                                                        0x1e, 0xfb, 0xba, 0x2e, 0xdc, 0xfc, 0x1b, 0x36,\n                                                        0x6, 0xf7, 0x4c, 0xf7, 0x79, 0x15, 0xf7, 0x36,\n                                                        0x7, 0xf7, 0x4a, 0xbc, 0x92, 0x37, 0x2e, 0x39,\n                                                        0x93, 0xfb, 0x29, 0x1f, 0xe, 0xf7, 0x8f, 0x76,\n                                                        0xf7, 0xae, 0xbc, 0x1, 0xf7, 0x4, 0xbb, 0xf7,\n                                                        0xb, 0xba, 0xf7, 0x58, 0xbb, 0x3, 0xf7, 0xab,\n                                                        0xf7, 0x7a, 0x15, 0xba, 0xf7, 0xb5, 0x6, 0xd1,\n                                                        0xfb, 0xb5, 0x5, 0xc7, 0x6, 0xcd, 0xf7, 0xb4,\n                                                        0x5, 0xfb, 0xb4, 0xbb, 0xf7, 0xe0, 0x32, 0x7,\n                                                        0x52, 0xfb, 0x97, 0x51, 0xf7, 0x97, 0x5, 0x34,\n                                                        0x6, 0xfb, 0x3b, 0xfb, 0xe0, 0x15, 0xbb, 0xf7,\n                                                        0xae, 0xdd, 0xbc, 0xfb, 0x69, 0x5a, 0xde, 0x6,\n                                                        0xe, 0x75, 0xa, 0xf7, 0x33, 0x76, 0xa, 0xf8,\n                                                        0x7e, 0xe1, 0xfc, 0x79, 0x5b, 0xa, 0x8e, 0xf9,\n                                                        0x3, 0x1, 0xf7, 0x92, 0xe1, 0x3, 0xf7, 0x92,\n                                                        0x8e, 0x15, 0xe1, 0xf8, 0x5b, 0x6, 0xbf, 0x45,\n                                                        0xcb, 0xbd, 0xfb, 0x31, 0xf7, 0x50, 0xfb, 0x2f,\n                                                        0xfb, 0x4d, 0xca, 0x58, 0xba, 0xca, 0x5, 0xe,\n                                                        0x75, 0xa, 0x6e, 0xf7, 0x96, 0x15, 0xf8, 0x7e,\n                                                        0x47, 0xa, 0xfc, 0x79, 0x6, 0xe, 0x91, 0x76,\n                                                        0x1, 0xf7, 0x92, 0xe1, 0x3, 0xf7, 0x24, 0xf7,\n                                                        0x3e, 0x15, 0xf7, 0x2f, 0xfb, 0x4d, 0xf7, 0x31,\n                                                        0xf7, 0x50, 0x4b, 0xbd, 0x57, 0x45, 0x5, 0xf8,\n                                                        0x5b, 0x35, 0xfc, 0x56, 0x7, 0x5c, 0xca, 0x5,\n                                                        0xe, 0xf7, 0x96, 0xe1, 0x1, 0x73, 0xf9, 0x1c,\n                                                        0x3, 0xf7, 0x38, 0x76, 0xa, 0xf7, 0xcc, 0x47,\n                                                        0xa, 0xfb, 0xc2, 0x5b, 0xa, 0xf7, 0x5f, 0xf7,\n                                                        0x2, 0x1, 0xd2, 0xf8, 0x5e, 0x3, 0x5c, 0xa,\n                                                        0xe, 0x8b, 0xe5, 0xf7, 0x87, 0xe5, 0xd7, 0xf7,\n                                                        0x13, 0x73, 0x77, 0x12, 0xf4, 0xe5, 0xf7, 0x12,\n                                                        0xf7, 0x42, 0x2f, 0xe7, 0x13, 0xea, 0xf8, 0x27,\n                                                        0xf8, 0x87, 0x15, 0xe7, 0xf7, 0x13, 0x2f, 0x6,\n                                                        0x2f, 0xfd, 0x6, 0x15, 0xf7, 0xab, 0xe5, 0x2c,\n                                                        0xf7, 0xe1, 0x6, 0x13, 0xec, 0xfb, 0x42, 0x31,\n                                                        0x6, 0x13, 0xda, 0xdd, 0xfb, 0x87, 0x2f, 0x6,\n                                                        0xfb, 0xc2, 0x31, 0x15, 0xf7, 0xae, 0xe5, 0x2b,\n                                                        0xf7, 0x87, 0xeb, 0xe5, 0x2b, 0xbf, 0x6, 0xb4,\n                                                        0xdf, 0x87, 0xa4, 0x1e, 0x8e, 0xe5, 0x5, 0x21,\n                                                        0x2b, 0x8c, 0xfb, 0x1d, 0x1f, 0x60, 0x2b, 0x31,\n                                                        0xeb, 0xfb, 0x87, 0x2b, 0x7, 0xe, 0x8b, 0xe8,\n                                                        0xf7, 0x90, 0xe8, 0xea, 0xe5, 0x8e, 0x77, 0x12,\n                                                        0xf4, 0xe5, 0xf7, 0x3d, 0xf7, 0x17, 0x31, 0xe5,\n                                                        0x13, 0xdc, 0xf7, 0xcc, 0x16, 0xf7, 0xaa, 0xe8,\n                                                        0x2c, 0xf8, 0xa9, 0xfb, 0x17, 0x6, 0x13, 0xec,\n                                                        0x2e, 0x7, 0x13, 0xea, 0xb4, 0xfc, 0x4c, 0x2e,\n                                                        0x6, 0xfb, 0xc3, 0x2e, 0x15, 0xf7, 0xac, 0xe8,\n                                                        0x2d, 0xf7, 0x90, 0xe9, 0xe8, 0x2d, 0xbe, 0x6,\n                                                        0xab, 0xb6, 0x96, 0xb1, 0x8c, 0x1e, 0xa5, 0x8c,\n                                                        0xa3, 0x8b, 0x91, 0x89, 0x8c, 0xe6, 0x18, 0x20,\n                                                        0xfb, 0xd, 0x8b, 0xfb, 0x20, 0x1f, 0x5e, 0x2b,\n                                                        0x2e, 0xeb, 0xfb, 0x90, 0x2b, 0x7, 0xe, 0x79,\n                                                        0x9d, 0xf8, 0x4b, 0x9f, 0xf2, 0x9d, 0x9f, 0x95,\n                                                        0x95, 0x95, 0x6, 0xfb, 0x26, 0x8f, 0x7, 0x1e,\n                                                        0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xe8, 0xa,\n                                                        0xe8, 0xb, 0x8c, 0xc, 0xe, 0xf8, 0xec, 0x14,\n                                                        0xae, 0x13, 0x0, 0x5d, 0x2, 0x0, 0x1, 0x0,\n                                                        0x35, 0x0, 0x43, 0x0, 0x47, 0x0, 0x7a, 0x0,\n                                                        0xba, 0x0, 0xc4, 0x0, 0xe9, 0x1, 0x17, 0x1,\n                                                        0x34, 0x1, 0x4c, 0x1, 0x65, 0x1, 0x7d, 0x1,\n                                                        0x94, 0x1, 0xa8, 0x1, 0xbb, 0x1, 0xca, 0x1,\n                                                        0xdc, 0x1, 0xe2, 0x1, 0xe9, 0x1, 0xfc, 0x2,\n                                                        0x6, 0x2, 0x10, 0x2, 0x24, 0x2, 0x36, 0x2,\n                                                        0x43, 0x2, 0x4c, 0x2, 0x6c, 0x2, 0x71, 0x2,\n                                                        0x78, 0x2, 0x7f, 0x2, 0x8d, 0x2, 0x95, 0x2,\n                                                        0xa0, 0x2, 0xb8, 0x2, 0xcf, 0x2, 0xd8, 0x2,\n                                                        0xe1, 0x2, 0xe7, 0x2, 0xfa, 0x3, 0xd, 0x3,\n                                                        0x1c, 0x3, 0x2e, 0x3, 0x36, 0x3, 0x3e, 0x3,\n                                                        0x43, 0x3, 0x49, 0x3, 0x57, 0x3, 0x61, 0x3,\n                                                        0x71, 0x3, 0x75, 0x3, 0x7e, 0x3, 0x87, 0x3,\n                                                        0x90, 0x3, 0x97, 0x3, 0xa5, 0x3, 0xb1, 0x3,\n                                                        0xbf, 0x3, 0xc3, 0x3, 0xd0, 0x3, 0xdb, 0x3,\n                                                        0xe7, 0x3, 0xf2, 0x3, 0xfe, 0x4, 0x4, 0x4,\n                                                        0x8, 0x4, 0xe, 0x4, 0x14, 0x4, 0x1f, 0x4,\n                                                        0x2a, 0x4, 0x31, 0x4, 0x36, 0x4, 0x3b, 0x4,\n                                                        0x45, 0x4, 0x4f, 0x4, 0x53, 0x4, 0x57, 0x4,\n                                                        0x60, 0x4, 0x69, 0x4, 0x72, 0x4, 0x7b, 0x4,\n                                                        0x84, 0x4, 0x8d, 0x4, 0x96, 0x4, 0x9f, 0x4,\n                                                        0xa8, 0x4, 0xb1, 0x4, 0xba, 0x4, 0xc1, 0x4,\n                                                        0xc8, 0x4, 0xce, 0x4, 0xd4, 0x4, 0xd9, 0x4,\n                                                        0xde, 0xf7, 0x97, 0xe5, 0x27, 0x6, 0xa9, 0xcc,\n                                                        0x5, 0xf7, 0x86, 0x6, 0xa9, 0x4a, 0x5, 0x2a,\n                                                        0x31, 0xf7, 0x92, 0xe5, 0x51, 0x6, 0xfb, 0x62,\n                                                        0xf8, 0x62, 0x5, 0xfb, 0x8f, 0x31, 0xf7, 0x15,\n                                                        0x6, 0xfb, 0x3f, 0xfc, 0x8, 0x5, 0x4e, 0x6,\n                                                        0xf7, 0x7a, 0xf7, 0x2f, 0x15, 0xdc, 0xf7, 0x47,\n                                                        0xdc, 0xfb, 0x47, 0x5, 0xb, 0x2a, 0xa, 0x13,\n                                                        0x7d, 0x4d, 0xa, 0x13, 0x7e, 0x2b, 0xa, 0x13,\n                                                        0xbe, 0x29, 0xa, 0x15, 0x20, 0xa, 0xe, 0x15,\n                                                        0xfb, 0x39, 0xf7, 0x2a, 0x51, 0xf7, 0xa, 0xf7,\n                                                        0xf, 0xf7, 0x29, 0xcb, 0xf7, 0x33, 0xf7, 0x24,\n                                                        0xfb, 0x6, 0xe0, 0xfb, 0x32, 0xfb, 0x21, 0xfb,\n                                                        0x13, 0x3d, 0xfb, 0x2b, 0x1e, 0xef, 0x16, 0xdf,\n                                                        0xd4, 0xc0, 0xea, 0xf7, 0x7, 0xc5, 0x52, 0x3b,\n                                                        0x34, 0x28, 0x5b, 0x41, 0x47, 0x27, 0xb7, 0xe6,\n                                                        0x1e, 0xe, 0x15, 0xf8, 0x23, 0x6, 0xf7, 0x1c,\n                                                        0xa5, 0x32, 0xf7, 0x14, 0xfb, 0x43, 0x1b, 0xfb,\n                                                        0xc, 0xfb, 0x1f, 0x3f, 0xfb, 0x2b, 0xfb, 0x8,\n                                                        0xe3, 0x21, 0xf7, 0x41, 0xe5, 0xeb, 0xa9, 0xb4,\n                                                        0xd7, 0x1f, 0x5f, 0xda, 0x5, 0x6d, 0x4b, 0x3b,\n                                                        0x6d, 0x41, 0x1b, 0xfb, 0x10, 0x69, 0xc7, 0xae,\n                                                        0x86, 0x1f, 0x92, 0xe6, 0x15, 0xc3, 0xa0, 0xce,\n                                                        0xa4, 0xc8, 0x1b, 0xc7, 0xca, 0x7a, 0x4b, 0x9e,\n                                                        0x1f, 0xe, 0x2f, 0xa, 0xf7, 0x2e, 0x2e, 0xf7,\n                                                        0x1c, 0x26, 0xa, 0xb, 0xfb, 0x4c, 0xfb, 0x42,\n                                                        0x22, 0xfb, 0x21, 0xfb, 0x2b, 0x1e, 0xed, 0x8e,\n                                                        0x15, 0xe6, 0xc8, 0xf6, 0xf7, 0xc, 0xf7, 0x1c,\n                                                        0xb9, 0xfb, 0x13, 0x47, 0x3a, 0x5a, 0xfb, 0x10,\n                                                        0xfb, 0x19, 0xfb, 0xd, 0x4f, 0xf3, 0xed, 0x1e,\n                                                        0xb, 0xdb, 0xfb, 0xa2, 0x6, 0xfb, 0x11, 0xd3,\n                                                        0x38, 0xf7, 0x25, 0xf7, 0x11, 0xe8, 0xdc, 0xf7,\n                                                        0x12, 0x1e, 0xf7, 0xa3, 0xd8, 0xe6, 0xfb, 0x96,\n                                                        0x30, 0xe1, 0xfb, 0x8d, 0x7, 0x35, 0x74, 0x57,\n                                                        0x25, 0xfb, 0x4, 0x83, 0xe2, 0xc0, 0x1e, 0xf7,\n                                                        0x8b, 0xdf, 0xe6, 0xfb, 0x97, 0x7, 0xe, 0x15,\n                                                        0x13, 0xb5, 0x0, 0x2e, 0xa, 0x13, 0x78, 0x80,\n                                                        0x64, 0xf7, 0x43, 0xe6, 0x7, 0x13, 0x7a, 0x0,\n                                                        0x3a, 0xf7, 0xe1, 0xfb, 0x41, 0x30, 0x6, 0x13,\n                                                        0xb9, 0x0, 0x2c, 0xa, 0x61, 0x5b, 0x4f, 0x69,\n                                                        0x47, 0x1b, 0x60, 0x62, 0x9c, 0xab, 0xb7, 0xbf,\n                                                        0x9d, 0xc6, 0x8c, 0x1f, 0xc7, 0x8c, 0xcd, 0x85,\n                                                        0xa2, 0x89, 0x8, 0xe, 0x1f, 0x8f, 0x67, 0x63,\n                                                        0x8e, 0x66, 0x1b, 0xfb, 0x7f, 0x82, 0xfb, 0x19,\n                                                        0x78, 0x4b, 0xcb, 0x3e, 0xf7, 0xa, 0xda, 0xb0,\n                                                        0xa1, 0xae, 0xc6, 0x1f, 0xb, 0x38, 0xf7, 0x37,\n                                                        0x6, 0xf7, 0xe, 0x5d, 0xc8, 0xfb, 0x10, 0xfb,\n                                                        0x0, 0xfb, 0xe, 0x66, 0x7f, 0x7a, 0x1e, 0xf7,\n                                                        0xd6, 0xfb, 0x7c, 0x15, 0xb, 0xda, 0xfb, 0x4f,\n                                                        0x6, 0x75, 0x63, 0x52, 0x71, 0x59, 0x8a, 0x8,\n                                                        0x5a, 0x8a, 0x60, 0xa0, 0xbf, 0x1a, 0xf7, 0xa5,\n                                                        0xfb, 0x42, 0x7, 0xe, 0xfb, 0x93, 0x38, 0xa,\n                                                        0xf7, 0x93, 0xfb, 0x6, 0xed, 0xf7, 0x60, 0xfc,\n                                                        0xa2, 0x31, 0xd7, 0xfc, 0x8, 0x3c, 0x6, 0xb,\n                                                        0xdc, 0xfb, 0x48, 0x6, 0xfb, 0x2, 0xc7, 0x54,\n                                                        0xf7, 0xa, 0x8a, 0x1e, 0xbf, 0xbe, 0xa1, 0xa9,\n                                                        0xac, 0x1f, 0xb, 0x15, 0xfb, 0x56, 0xf7, 0x25,\n                                                        0x2d, 0xf7, 0x1a, 0xf3, 0xf7, 0x41, 0xd2, 0xf7,\n                                                        0x6f, 0xb, 0xfb, 0x3f, 0xf8, 0x8, 0xf7, 0x36,\n                                                        0xe5, 0xfc, 0x3f, 0x31, 0xf7, 0x39, 0xfc, 0x8,\n                                                        0xfb, 0x43, 0x6, 0xb, 0xf8, 0x52, 0xe5, 0x30,\n                                                        0xa, 0xb, 0x8b, 0xe6, 0xf8, 0x10, 0xe6, 0x1,\n                                                        0xb, 0x15, 0xf8, 0x52, 0xe6, 0xfb, 0x43, 0xf7,\n                                                        0xe0, 0xfb, 0x7e, 0x30, 0xf7, 0x1d, 0xfb, 0x85,\n                                                        0xfb, 0x42, 0x6, 0xe, 0x12, 0xab, 0xec, 0xf7,\n                                                        0x98, 0xea, 0x2c, 0xf7, 0x46, 0xb, 0xf8, 0xa5,\n                                                        0xf7, 0x5e, 0x29, 0xfb, 0x4, 0x2d, 0xa, 0xb,\n                                                        0x77, 0x12, 0x9a, 0xf7, 0x42, 0x2e, 0xe8, 0xf7,\n                                                        0x22, 0xf7, 0x41, 0x2d, 0xe9, 0x2d, 0xf7, 0x43,\n                                                        0x13, 0xba, 0x0, 0xb, 0x5a, 0xbb, 0x64, 0xc7,\n                                                        0xc7, 0xbb, 0xb2, 0xbc, 0xbc, 0x5b, 0xb2, 0x4f,\n                                                        0x4f, 0x5b, 0x64, 0x5a, 0x1e, 0xb, 0xf7, 0x27,\n                                                        0xf1, 0x4b, 0xee, 0xf7, 0x6c, 0x28, 0x4b, 0x25,\n                                                        0xf7, 0x1d, 0xb, 0x7c, 0xe6, 0x3c, 0xe5, 0xf0,\n                                                        0xe5, 0xcf, 0xe2, 0xb, 0x7, 0xf7, 0x9e, 0xf8,\n                                                        0x26, 0x5, 0xd7, 0xe2, 0xfb, 0x76, 0x34, 0xb8,\n                                                        0x6, 0xfb, 0x14, 0xfb, 0x54, 0xfb, 0x6, 0xf7,\n                                                        0x54, 0x5, 0xbc, 0xe2, 0xfb, 0x7b, 0x34, 0xd7,\n                                                        0x6, 0xf7, 0x3a, 0xb, 0x34, 0xa, 0x13, 0xbe,\n                                                        0xb, 0x4a, 0xa, 0xf7, 0x83, 0x36, 0xa, 0xb,\n                                                        0xbf, 0xa9, 0x70, 0x5b, 0x2a, 0xa, 0xb, 0x53,\n                                                        0xaf, 0xfb, 0x20, 0xfb, 0x1, 0xfb, 0x20, 0xf7,\n                                                        0x1, 0x51, 0x68, 0x5, 0xe, 0x15, 0x9b, 0xa9,\n                                                        0xf4, 0xa4, 0xd7, 0x1b, 0xb, 0xe9, 0x1, 0xf7,\n                                                        0x8e, 0xee, 0x60, 0xa, 0xe9, 0xfb, 0x42, 0xb,\n                                                        0xc9, 0xaf, 0x75, 0x6d, 0xbe, 0x1f, 0x2d, 0xed,\n                                                        0xf7, 0x81, 0x29, 0x5c, 0x7, 0xa5, 0x62, 0x66,\n                                                        0xa0, 0x41, 0x1b, 0xfb, 0x32, 0xfb, 0x12, 0xb,\n                                                        0xfb, 0xa, 0x42, 0x39, 0xa3, 0x95, 0x64, 0x1e,\n                                                        0xa7, 0xf7, 0xa3, 0x15, 0xd2, 0xcd, 0xba, 0xd9,\n                                                        0xdf, 0xc6, 0x5f, 0x3f, 0x42, 0x53, 0xb, 0x15,\n                                                        0xe7, 0x6, 0xf7, 0x29, 0xf7, 0x1e, 0x3e, 0xa,\n                                                        0x1, 0x82, 0xf7, 0x97, 0xf4, 0xf7, 0x92, 0x3,\n                                                        0xb, 0x76, 0xf7, 0xb1, 0x77, 0x1, 0xb, 0xf7,\n                                                        0xc4, 0xf7, 0x46, 0x15, 0xf7, 0x1d, 0x32, 0x6,\n                                                        0x81, 0x62, 0x64, 0x88, 0x67, 0x1b, 0xfb, 0x14,\n                                                        0x36, 0xb, 0x6, 0x45, 0x57, 0xbd, 0x4c, 0xf7,\n                                                        0x50, 0xf7, 0x30, 0xfb, 0x4d, 0xf7, 0x30, 0x58,\n                                                        0x4c, 0xca, 0x5b, 0x5, 0xb, 0x8b, 0xe5, 0xf7,\n                                                        0x27, 0xe3, 0xf7, 0x1d, 0x5f, 0xa, 0xf7, 0x9,\n                                                        0xec, 0xf1, 0xee, 0xb, 0x66, 0xac, 0x6c, 0xb4,\n                                                        0xb4, 0xac, 0xaa, 0xb0, 0xb2, 0x6a, 0xa9, 0x62,\n                                                        0x62, 0x6a, 0x6d, 0x64, 0x1e, 0xb, 0x7c, 0xe7,\n                                                        0x3c, 0xe6, 0xf7, 0x86, 0xe6, 0xb, 0x1, 0xa9,\n                                                        0xef, 0xf7, 0xe9, 0xee, 0x3, 0xb, 0xf7, 0xbe,\n                                                        0x45, 0xa, 0xb, 0x5e, 0xf7, 0x46, 0xe5, 0x7,\n                                                        0xb, 0xfb, 0xb1, 0x15, 0xf7, 0x9, 0x6, 0xf7,\n                                                        0x1a, 0x59, 0xa, 0xfb, 0x2e, 0x6, 0xe, 0x79,\n                                                        0xe6, 0xf8, 0x17, 0xe6, 0xf7, 0x7d, 0x52, 0xa,\n                                                        0xb, 0xe7, 0x74, 0x15, 0x75, 0x32, 0x5, 0x79,\n                                                        0xdf, 0xc8, 0x7b, 0xd5, 0x1b, 0xf7, 0x50, 0xa1,\n                                                        0xb, 0x3f, 0xa, 0xbf, 0xb, 0x77, 0x1, 0xdf,\n                                                        0xea, 0xf7, 0x89, 0xea, 0x3, 0xb, 0x15, 0xf7,\n                                                        0x5, 0xf7, 0x10, 0xfb, 0x5, 0x6, 0xb, 0x77,\n                                                        0x1, 0xa1, 0xed, 0xf7, 0xff, 0xea, 0x3, 0xb,\n                                                        0x7c, 0xe5, 0xea, 0xe6, 0xdc, 0xe7, 0xb, 0x6,\n                                                        0xfb, 0x4e, 0xfb, 0xe, 0x15, 0xf7, 0x6, 0xf7,\n                                                        0xe, 0xfb, 0x6, 0x6, 0xb, 0x8b, 0xe6, 0xf7,\n                                                        0x85, 0xe6, 0xf7, 0x82, 0x67, 0xa, 0xec, 0x3,\n                                                        0xb, 0xd2, 0xd2, 0x9c, 0xaa, 0xc6, 0x1f, 0xf7,\n                                                        0x28, 0xbd, 0xea, 0xfb, 0xae, 0x7, 0xb, 0xf7,\n                                                        0xb1, 0x5, 0xb, 0xa7, 0x66, 0x5a, 0x97, 0x56,\n                                                        0x1b, 0xfb, 0x23, 0x27, 0x30, 0xfb, 0x8, 0xb,\n                                                        0x6, 0xca, 0xbb, 0x58, 0xca, 0xfb, 0x4d, 0xfb,\n                                                        0x30, 0x5, 0xe, 0xd2, 0xf7, 0x5f, 0x15, 0xf8,\n                                                        0x5e, 0xf7, 0x2, 0xfc, 0x5e, 0x6, 0xb, 0x15,\n                                                        0xf7, 0x9, 0x6, 0x2b, 0x59, 0xa, 0xfb, 0x2c,\n                                                        0x6, 0xb, 0xaf, 0x76, 0xf8, 0x7a, 0x77, 0x1,\n                                                        0xd2, 0xf8, 0x5d, 0x3, 0xd2, 0xb, 0xe5, 0xf7,\n                                                        0x7c, 0x77, 0x1, 0xb, 0x3, 0x66, 0xa, 0xb,\n                                                        0x79, 0xe4, 0xf8, 0x24, 0xe6, 0xb, 0x7c, 0xe7,\n                                                        0xf7, 0x9f, 0xe7, 0xb, 0xfb, 0x12, 0x1b, 0xfb,\n                                                        0x1b, 0x45, 0x2b, 0x2c, 0x8c, 0x1f, 0xb, 0x67,\n                                                        0x1b, 0x81, 0x7c, 0x8f, 0x91, 0x7b, 0x1f, 0x92,\n                                                        0x76, 0xb, 0xc3, 0x56, 0xf8, 0xd0, 0xf9, 0xf,\n                                                        0xb, 0xd8, 0x16, 0xf8, 0x52, 0xb, 0x77, 0x1,\n                                                        0xf7, 0x8f, 0xb, 0x49, 0x42, 0x1f, 0xd7, 0x8c,\n                                                        0x15, 0xae, 0xa5, 0xac, 0xb, 0x12, 0xa4, 0xea,\n                                                        0xf7, 0xb3, 0xe7, 0x2f, 0xf7, 0x3c, 0xb, 0xfb,\n                                                        0xc, 0x5, 0xb, 0xfb, 0x3, 0x6, 0xb, 0x1a,\n                                                        0xbc, 0x8a, 0xb2, 0xb1, 0xd5, 0x1b, 0xbf, 0xb,\n                                                        0x1, 0xf7, 0x54, 0xf7, 0x6c, 0x3, 0xf7, 0x54,\n                                                        0xb, 0x77, 0x1, 0xf7, 0x93, 0xe5, 0x3, 0xf7,\n                                                        0x93, 0xb, 0x15, 0xf7, 0x2, 0xf7, 0x11, 0xfb,\n                                                        0x2, 0x6, 0xb, 0x15, 0xf7, 0x6, 0xf7, 0x12,\n                                                        0xfb, 0x6, 0x6, 0xb, 0xa4, 0xa0, 0x1f, 0x53,\n                                                        0xca, 0x5, 0x77, 0x71, 0xb, 0x15, 0xf7, 0x4,\n                                                        0xf7, 0x12, 0xfb, 0x4, 0x6, 0xb, 0x15, 0xf7,\n                                                        0xa, 0xf7, 0x24, 0xfb, 0xa, 0x6, 0xb, 0xf7,\n                                                        0x3c, 0xe6, 0xfc, 0x4c, 0x30, 0xf7, 0x3f, 0xb,\n                                                        0xf7, 0x96, 0xe1, 0x1, 0x6e, 0xf9, 0x26, 0x3,\n                                                        0xb, 0xf7, 0x23, 0x15, 0xbd, 0xca, 0x45, 0xbf,\n                                                        0x5, 0xb, 0xc5, 0xfb, 0xc3, 0xf7, 0xd, 0x5,\n                                                        0xe, 0xa1, 0xd8, 0x1e, 0xf6, 0x29, 0x7, 0xe,\n                                                        0x15, 0xf7, 0x3, 0xf7, 0x23, 0xb, 0x30, 0xde,\n                                                        0xfc, 0x10, 0x38, 0xb, 0xd1, 0xf8, 0xc, 0x1,\n                                                        0xb, 0x8b, 0xe9, 0xf7, 0x8f, 0xb\n                                                       };\n"
  },
  {
    "path": "core/src/fxge/fontdata/chromefontdata/FoxitFixedBoldItalic.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nconst unsigned char g_FoxitFixedBoldItalicFontData [19151] = {0x1,\n                                                              0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x19,\n                                                              0x43, 0x68, 0x72, 0x6f, 0x6d, 0x46, 0x69, 0x78,\n                                                              0x65, 0x64, 0x4f, 0x54, 0x46, 0x2d, 0x42, 0x6f,\n                                                              0x6c, 0x64, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63,\n                                                              0x0, 0x1, 0x1, 0x1, 0x24, 0xf8, 0x10, 0x0,\n                                                              0xf8, 0x2a, 0x1, 0xf8, 0x2b, 0x2, 0xf8, 0x2c,\n                                                              0x3, 0xf8, 0x14, 0x4, 0xfb, 0xa, 0xfb, 0x8d,\n                                                              0xf9, 0x49, 0xf9, 0xbf, 0x5, 0xf7, 0xad, 0xf,\n                                                              0xf9, 0x94, 0x11, 0xac, 0x1c, 0x44, 0x2e, 0x12,\n                                                              0x0, 0x12, 0x1, 0x1, 0x5, 0xb, 0xd, 0x11,\n                                                              0x19, 0x22, 0x2b, 0x34, 0x3e, 0x45, 0x4b, 0x4d,\n                                                              0x51, 0x5d, 0x65, 0x8f, 0xaa, 0xb9, 0x45, 0x75,\n                                                              0x72, 0x6f, 0x47, 0x63, 0x61, 0x72, 0x6f, 0x6e,\n                                                              0x49, 0x4a, 0x49, 0x64, 0x6f, 0x74, 0x53, 0x63,\n                                                              0x65, 0x64, 0x69, 0x6c, 0x6c, 0x61, 0x61, 0x72,\n                                                              0x72, 0x6f, 0x77, 0x62, 0x6f, 0x74, 0x68, 0x61,\n                                                              0x72, 0x72, 0x6f, 0x77, 0x64, 0x6f, 0x77, 0x6e,\n                                                              0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x65, 0x66,\n                                                              0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x72, 0x69,\n                                                              0x67, 0x68, 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77,\n                                                              0x75, 0x70, 0x67, 0x63, 0x61, 0x72, 0x6f, 0x6e,\n                                                              0x69, 0x6a, 0x6c, 0x69, 0x72, 0x61, 0x70, 0x72,\n                                                              0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,\n                                                              0x6f, 0x6e, 0x73, 0x63, 0x65, 0x64, 0x69, 0x6c,\n                                                              0x6c, 0x61, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                              0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                              0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                              0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                              0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                              0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f,\n                                                              0x6d, 0x20, 0x46, 0x69, 0x78, 0x65, 0x64, 0x20,\n                                                              0x4f, 0x54, 0x46, 0x20, 0x42, 0x6f, 0x6c, 0x64,\n                                                              0x20, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x43,\n                                                              0x68, 0x72, 0x6F, 0x68, 0x20, 0x46, 0x69, 0x78,\n                                                              0x65, 0x64, 0x20, 0x4f, 0x54, 0x46, 0x0, 0x0,\n                                                              0x0, 0x0, 0x22, 0x0, 0x8a, 0x0, 0xab, 0x0,\n                                                              0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf, 0x0,\n                                                              0xb0, 0x0, 0x23, 0x0, 0x24, 0x0, 0xb1, 0x0,\n                                                              0x25, 0x0, 0x26, 0x0, 0xb2, 0x0, 0xb3, 0x0,\n                                                              0xb4, 0x0, 0xb5, 0x0, 0x9a, 0x1, 0x87, 0x0,\n                                                              0x27, 0x0, 0x28, 0x1, 0x88, 0x0, 0x29, 0x0,\n                                                              0x2a, 0x1, 0x89, 0x0, 0xb6, 0x0, 0xb7, 0x0,\n                                                              0xb8, 0x1, 0x8a, 0x0, 0xb9, 0x0, 0x2b, 0x0,\n                                                              0x2c, 0x0, 0x2d, 0x0, 0x8c, 0x0, 0x2e, 0x0,\n                                                              0x2f, 0x0, 0xba, 0x0, 0x30, 0x0, 0x8e, 0x0,\n                                                              0xbb, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0,\n                                                              0x8d, 0x0, 0xbf, 0x0, 0x31, 0x0, 0x32, 0x0,\n                                                              0x33, 0x0, 0x34, 0x0, 0xc0, 0x1, 0x8b, 0x0,\n                                                              0x35, 0x0, 0x9d, 0x0, 0x36, 0x0, 0xc1, 0x0,\n                                                              0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0x37, 0x0,\n                                                              0x38, 0x0, 0x39, 0x0, 0x3a, 0x0, 0xc5, 0x0,\n                                                              0xc6, 0x0, 0x3b, 0x0, 0xc7, 0x0, 0x42, 0x0,\n                                                              0xc8, 0x0, 0xc9, 0x0, 0x7d, 0x0, 0xca, 0x0,\n                                                              0x90, 0x0, 0xcb, 0x0, 0x7, 0x0, 0xcc, 0x1,\n                                                              0x8c, 0x1, 0x8d, 0x1, 0x8e, 0x1, 0x8f, 0x1,\n                                                              0x90, 0x0, 0x3f, 0x0, 0x5f, 0x0, 0xb, 0x0,\n                                                              0x21, 0x0, 0xcd, 0x0, 0x43, 0x0, 0x3d, 0x0,\n                                                              0x5d, 0x0, 0x5c, 0x0, 0x5e, 0x0, 0x3c, 0x0,\n                                                              0x3e, 0x0, 0x81, 0x0, 0xa0, 0x0, 0x74, 0x0,\n                                                              0x44, 0x0, 0x88, 0x0, 0xce, 0x0, 0x85, 0x0,\n                                                              0x61, 0x0, 0x7e, 0x0, 0x1b, 0x0, 0xd, 0x0,\n                                                              0xaa, 0x0, 0x67, 0x0, 0x45, 0x0, 0x70, 0x0,\n                                                              0x71, 0x0, 0xa1, 0x0, 0x83, 0x0, 0x9f, 0x0,\n                                                              0x5, 0x0, 0x82, 0x0, 0x91, 0x0, 0x46, 0x0,\n                                                              0xcf, 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0,\n                                                              0x19, 0x0, 0x79, 0x0, 0x89, 0x0, 0x6f, 0x0,\n                                                              0x1e, 0x0, 0xa7, 0x0, 0x2, 0x0, 0x60, 0x0,\n                                                              0x47, 0x0, 0x6d, 0x0, 0x16, 0x0, 0x6e, 0x0,\n                                                              0x65, 0x0, 0x15, 0x0, 0x63, 0x0, 0x48, 0x1,\n                                                              0x91, 0x0, 0x95, 0x0, 0x7c, 0x0, 0x1f, 0x0,\n                                                              0x6a, 0x0, 0x78, 0x0, 0x6b, 0x0, 0x6c, 0x0,\n                                                              0x49, 0x0, 0x86, 0x0, 0xe, 0x0, 0x4a, 0x0,\n                                                              0xd3, 0x0, 0xd4, 0x0, 0xd5, 0x0, 0xd6, 0x1,\n                                                              0x92, 0x0, 0x4b, 0x0, 0x4c, 0x0, 0x4d, 0x0,\n                                                              0x1d, 0x1, 0x93, 0x0, 0x97, 0x0, 0x92, 0x0,\n                                                              0x4e, 0x0, 0x80, 0x0, 0xa6, 0x0, 0x98, 0x0,\n                                                              0xa8, 0x0, 0x4f, 0x0, 0x1a, 0x0, 0xd7, 0x0,\n                                                              0x4, 0x0, 0x50, 0x0, 0xd8, 0x0, 0xd9, 0x0,\n                                                              0xda, 0x0, 0x94, 0x0, 0x87, 0x0, 0xdb, 0x0,\n                                                              0x12, 0x0, 0x9b, 0x0, 0x9e, 0x0, 0x96, 0x0,\n                                                              0x8b, 0x0, 0x8f, 0x0, 0x93, 0x0, 0xdc, 0x0,\n                                                              0x51, 0x0, 0x73, 0x0, 0x9, 0x0, 0xa, 0x0,\n                                                              0x6, 0x0, 0xf, 0x0, 0x72, 0x0, 0x7a, 0x0,\n                                                              0xc, 0x0, 0x9c, 0x1, 0x94, 0x0, 0x52, 0x0,\n                                                              0x20, 0x0, 0x7b, 0x0, 0x3, 0x0, 0x76, 0x0,\n                                                              0x69, 0x0, 0x77, 0x0, 0x41, 0x0, 0x8, 0x0,\n                                                              0x75, 0x0, 0x68, 0x0, 0x53, 0x0, 0xa5, 0x0,\n                                                              0x84, 0x0, 0x54, 0x0, 0xdd, 0x1, 0x95, 0x0,\n                                                              0x66, 0x0, 0x1c, 0x0, 0x18, 0x0, 0x17, 0x0,\n                                                              0x10, 0x0, 0x1, 0x0, 0x62, 0x0, 0x55, 0x0,\n                                                              0xa2, 0x0, 0x14, 0x0, 0xa3, 0x0, 0xa9, 0x0,\n                                                              0x7f, 0x0, 0x99, 0x0, 0x13, 0x0, 0xa4, 0x0,\n                                                              0x56, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, 0x0,\n                                                              0xe1, 0x0, 0x40, 0x0, 0x57, 0x0, 0x58, 0x0,\n                                                              0x59, 0x0, 0x5a, 0x0, 0xe2, 0x0, 0xe3, 0x0,\n                                                              0x64, 0x0, 0x5b, 0x0, 0xe4, 0x0, 0x11, 0x0,\n                                                              0xf4, 0x2, 0x0, 0x1, 0x0, 0x2, 0x0, 0x44,\n                                                              0x0, 0xc1, 0x0, 0xdc, 0x1, 0x2, 0x1, 0x26,\n                                                              0x1, 0x40, 0x1, 0x76, 0x1, 0xbf, 0x2, 0x29,\n                                                              0x2, 0x78, 0x2, 0xfe, 0x3, 0x37, 0x3, 0x84,\n                                                              0x3, 0xa1, 0x3, 0xc9, 0x3, 0xed, 0x4, 0x13,\n                                                              0x4, 0x6e, 0x4, 0xf0, 0x5, 0x3a, 0x5, 0x9a,\n                                                              0x6, 0x8, 0x6, 0x5e, 0x6, 0x83, 0x6, 0xdb,\n                                                              0x6, 0xf4, 0x7, 0x1d, 0x7, 0x38, 0x7, 0x6e,\n                                                              0x7, 0x84, 0x7, 0xc1, 0x8, 0x19, 0x8, 0x45,\n                                                              0x8, 0x85, 0x8, 0xc9, 0x8, 0xf8, 0x9, 0x6e,\n                                                              0x9, 0xb6, 0xa, 0x36, 0xa, 0x52, 0xa, 0x75,\n                                                              0xa, 0x9a, 0xa, 0xbb, 0xb, 0x3c, 0xb, 0x86,\n                                                              0xb, 0xd0, 0xc, 0x48, 0xc, 0xa7, 0xd, 0x1b,\n                                                              0xd, 0x8b, 0xe, 0x2b, 0xe, 0x5c, 0xe, 0xba,\n                                                              0xf, 0x17, 0xf, 0x33, 0xf, 0x59, 0xf, 0x81,\n                                                              0xf, 0x9a, 0xf, 0xcb, 0x10, 0xd, 0x10, 0x56,\n                                                              0x10, 0x8f, 0x10, 0xe0, 0x11, 0x4b, 0x11, 0x7d,\n                                                              0x11, 0xce, 0x12, 0x48, 0x12, 0x67, 0x12, 0x9b,\n                                                              0x12, 0xaf, 0x12, 0xdd, 0x13, 0x88, 0x13, 0xa6,\n                                                              0x14, 0x29, 0x14, 0x62, 0x14, 0x83, 0x14, 0xa5,\n                                                              0x14, 0xc3, 0x14, 0xdc, 0x15, 0x0, 0x15, 0x32,\n                                                              0x15, 0x7e, 0x15, 0xad, 0x16, 0x4c, 0x16, 0xaa,\n                                                              0x17, 0x8, 0x17, 0x21, 0x17, 0x3b, 0x17, 0xb4,\n                                                              0x18, 0x2c, 0x18, 0x4c, 0x18, 0x70, 0x18, 0x94,\n                                                              0x18, 0xbd, 0x18, 0xde, 0x19, 0x29, 0x19, 0x44,\n                                                              0x19, 0xc2, 0x19, 0xfe, 0x1a, 0x5d, 0x1a, 0x7a,\n                                                              0x1a, 0xb5, 0x1a, 0xd3, 0x1b, 0x5a, 0x1b, 0xd7,\n                                                              0x1c, 0x39, 0x1c, 0x6a, 0x1c, 0xaf, 0x1c, 0xeb,\n                                                              0x1d, 0x15, 0x1d, 0x3f, 0x1d, 0xd5, 0x1d, 0xee,\n                                                              0x1e, 0xd, 0x1e, 0x5d, 0x1e, 0x73, 0x1e, 0x9e,\n                                                              0x1e, 0xc0, 0x1e, 0xe9, 0x1f, 0x63, 0x1f, 0x88,\n                                                              0x1f, 0x9e, 0x1f, 0xb4, 0x1f, 0xd9, 0x20, 0x4c,\n                                                              0x20, 0x7d, 0x20, 0xad, 0x20, 0xff, 0x21, 0x5c,\n                                                              0x21, 0xa9, 0x22, 0x9, 0x22, 0x6d, 0x22, 0xae,\n                                                              0x22, 0xbf, 0x23, 0x2f, 0x23, 0xa9, 0x24, 0x38,\n                                                              0x24, 0x4c, 0x24, 0x6c, 0x24, 0x85, 0x24, 0xbe,\n                                                              0x24, 0xde, 0x24, 0xf9, 0x25, 0x4d, 0x25, 0x75,\n                                                              0x25, 0x8d, 0x25, 0xc1, 0x25, 0xda, 0x25, 0xff,\n                                                              0x26, 0x27, 0x26, 0x40, 0x26, 0xb0, 0x26, 0xf8,\n                                                              0x27, 0x45, 0x27, 0x67, 0x27, 0x87, 0x27, 0xec,\n                                                              0x28, 0xa, 0x28, 0x44, 0x28, 0xc6, 0x28, 0xdc,\n                                                              0x28, 0xeb, 0x29, 0x3d, 0x29, 0x6a, 0x29, 0xc9,\n                                                              0x2a, 0x25, 0x2a, 0xc0, 0x2b, 0x2d, 0x2b, 0x6f,\n                                                              0x2b, 0x86, 0x2b, 0xb0, 0x2b, 0xc9, 0x2c, 0x4a,\n                                                              0x2c, 0x78, 0x2c, 0x8f, 0x2c, 0xb2, 0x2d, 0x2e,\n                                                              0x2d, 0x9e, 0x2d, 0xc6, 0x2e, 0x2f, 0x2e, 0x6d,\n                                                              0x2e, 0xe8, 0x2f, 0x32, 0x2f, 0x92, 0x2f, 0xcc,\n                                                              0x2f, 0xff, 0x30, 0x32, 0x30, 0x60, 0x30, 0x7f,\n                                                              0x30, 0xa0, 0x30, 0xed, 0x31, 0x1c, 0x31, 0x5e,\n                                                              0x31, 0xca, 0x32, 0x26, 0x32, 0x81, 0x32, 0xdd,\n                                                              0x33, 0x4, 0x33, 0x25, 0x33, 0x46, 0x33, 0x70,\n                                                              0x33, 0x82, 0x33, 0x9e, 0x33, 0xb7, 0x33, 0xd1,\n                                                              0x34, 0xd, 0x34, 0x97, 0x34, 0xce, 0x35, 0x41,\n                                                              0x35, 0xca, 0x36, 0x73, 0x37, 0xe, 0x37, 0x41,\n                                                              0x37, 0x65, 0x37, 0xc8, 0x37, 0xdd, 0x37, 0xde,\n                                                              0x38, 0x2f, 0x38, 0x7d, 0x38, 0xe4, 0x39, 0x44,\n                                                              0x39, 0xf0, 0x3a, 0x51, 0x3a, 0x94, 0x3a, 0xe9,\n                                                              0x3b, 0x3a, 0x3b, 0x88, 0x3b, 0xde, 0x3b, 0xff,\n                                                              0x3c, 0x26, 0x3c, 0x4a, 0x3c, 0x61, 0x3c, 0x72,\n                                                              0x3c, 0xa1, 0x3c, 0xe1, 0x3d, 0x2c, 0x3d, 0x78,\n                                                              0x3d, 0xba, 0x3e, 0xe, 0x3e, 0x76, 0x3e, 0xac,\n                                                              0x3f, 0x0, 0x3f, 0x42, 0xe, 0x8b, 0xe6, 0xd8,\n                                                              0xe6, 0xf7, 0x68, 0xe6, 0x1, 0x63, 0x16, 0xf7,\n                                                              0x8d, 0x34, 0xa, 0x31, 0x6, 0xba, 0xd8, 0x5,\n                                                              0xf7, 0x82, 0x6, 0x9e, 0x3e, 0x5, 0x34, 0x36,\n                                                              0xa, 0xf7, 0x8a, 0x42, 0xa, 0x50, 0x6, 0xfb,\n                                                              0x0, 0xf8, 0x6b, 0x5, 0xfb, 0x92, 0x4b, 0xa,\n                                                              0xf7, 0x15, 0x6, 0xfb, 0x8d, 0x7d, 0xa, 0x4c,\n                                                              0x6, 0xf7, 0x9e, 0xf7, 0x3c, 0x15, 0xf7, 0x9,\n                                                              0xf7, 0x41, 0xb5, 0xfb, 0x41, 0x5, 0xe, 0x8b,\n                                                              0xe5, 0x31, 0xf7, 0x40, 0x7e, 0xe6, 0x52, 0xf7,\n                                                              0x50, 0x93, 0xf7, 0x41, 0x31, 0xe5, 0x12, 0x13,\n                                                              0xa8, 0xfb, 0xa, 0x16, 0xf7, 0x85, 0x6, 0x9f,\n                                                              0xe5, 0x5, 0x3d, 0x6, 0xb8, 0xd0, 0x5, 0xf7,\n                                                              0x4, 0x6, 0x6a, 0xfb, 0x33, 0x5, 0xf7, 0xcc,\n                                                              0x6, 0x13, 0x58, 0xaf, 0xf7, 0x40, 0x5, 0x3c,\n                                                              0x6, 0x13, 0x94, 0x7a, 0x39, 0x5, 0xfb, 0x1e,\n                                                              0x6, 0xab, 0xf7, 0x2c, 0x5, 0xb1, 0x6, 0x81,\n                                                              0x5a, 0x5c, 0xa, 0xb3, 0xf7, 0x50, 0x5, 0x3c,\n                                                              0x6, 0x82, 0x5a, 0x5, 0x64, 0x6, 0xa8, 0x97,\n                                                              0xa, 0xf7, 0x1e, 0x6, 0x13, 0xa8, 0x7a, 0x38,\n                                                              0x5c, 0xa, 0xaf, 0xf7, 0x41, 0x5, 0xfc, 0x6f,\n                                                              0x6, 0x13, 0xa4, 0x77, 0x31, 0x5, 0xe8, 0x6,\n                                                              0xfb, 0x8e, 0xfc, 0x12, 0x5, 0x4a, 0x6, 0xf7,\n                                                              0xa0, 0xf7, 0x34, 0x15, 0xf5, 0xf7, 0x39, 0x69,\n                                                              0xfb, 0x39, 0x5, 0xe, 0x40, 0xa, 0xf7, 0x7a,\n                                                              0x77, 0x1, 0xf7, 0xb6, 0xf8, 0xf3, 0x15, 0xf7,\n                                                              0xef, 0xd5, 0x77, 0xf2, 0xfb, 0xe4, 0xfb, 0xa,\n                                                              0x5, 0xfb, 0xc2, 0xfd, 0x2e, 0x23, 0xa, 0x40,\n                                                              0xa, 0xf7, 0x76, 0x77, 0x1, 0xf7, 0x91, 0xf8,\n                                                              0xee, 0x15, 0xf7, 0x42, 0xf7, 0x4, 0xf7, 0x13,\n                                                              0xfb, 0x4, 0xcd, 0xae, 0xfb, 0x16, 0xf7, 0x23,\n                                                              0x66, 0xa, 0xfb, 0x55, 0xfb, 0x22, 0x5, 0xfb,\n                                                              0x71, 0xfd, 0x12, 0x23, 0xa, 0x40, 0xa, 0xd3,\n                                                              0xf7, 0xe, 0x1, 0xf8, 0x57, 0xf9, 0x6, 0x6d,\n                                                              0xa, 0xa5, 0xf7, 0xe, 0x5, 0xfb, 0x4, 0x6,\n                                                              0xfb, 0x66, 0xfb, 0xe, 0x5a, 0xa, 0xa5, 0xf7,\n                                                              0xe, 0x4c, 0xa, 0xfb, 0xd0, 0xfd, 0x80, 0x23,\n                                                              0xa, 0x40, 0xa, 0xf7, 0x7a, 0x77, 0x1, 0x76,\n                                                              0x16, 0x20, 0xa, 0xfb, 0x31, 0xf8, 0x44, 0x15,\n                                                              0xf7, 0xc2, 0x3a, 0xb2, 0xc5, 0xfb, 0xa7, 0xf7,\n                                                              0xb, 0x5, 0xe, 0x40, 0xa, 0xba, 0xf7, 0x5c,\n                                                              0x1, 0xf7, 0xd1, 0xf9, 0x3f, 0x15, 0x5d, 0xae,\n                                                              0x67, 0xbf, 0xce, 0xc7, 0xc1, 0xc9, 0xba, 0x69,\n                                                              0xb0, 0x57, 0x4d, 0x49, 0x58, 0x48, 0x1e, 0xce,\n                                                              0x95, 0x15, 0xa5, 0x9e, 0x9f, 0xa8, 0x9e, 0x9a,\n                                                              0x7d, 0x79, 0x73, 0x70, 0x77, 0x75, 0x79, 0x7c,\n                                                              0x99, 0x9b, 0x1e, 0xfc, 0x29, 0xfd, 0x49, 0x23,\n                                                              0xa, 0x40, 0xa, 0xc5, 0x77, 0xf7, 0x3b, 0x77,\n                                                              0x1, 0xf7, 0x50, 0xf9, 0x10, 0x15, 0xd6, 0x72,\n                                                              0x5, 0xae, 0xa1, 0x9c, 0xa5, 0xa6, 0x1b, 0xa2,\n                                                              0x9d, 0x7d, 0x7d, 0x9f, 0x1f, 0x7b, 0xa1, 0xa2,\n                                                              0x7b, 0xaa, 0x1b, 0xd3, 0xc6, 0xc6, 0xca, 0xa6,\n                                                              0x1f, 0x3f, 0xa4, 0x5, 0x76, 0x80, 0x75, 0x61,\n                                                              0x69, 0x1b, 0x7a, 0x7b, 0x93, 0x96, 0x7b, 0x1f,\n                                                              0x9c, 0x70, 0x70, 0xa2, 0x69, 0x1b, 0x3d, 0x55,\n                                                              0x49, 0x56, 0x73, 0x1f, 0xfb, 0x65, 0xfd, 0x10,\n                                                              0x23, 0xa, 0x8b, 0xe6, 0xf7, 0x36, 0xe6, 0xf7,\n                                                              0x13, 0xe6, 0x12, 0xf8, 0x64, 0xed, 0x3c, 0xeb,\n                                                              0x13, 0xf0, 0x77, 0x16, 0xf7, 0xee, 0x6, 0xf7,\n                                                              0x17, 0xf4, 0xdc, 0xed, 0x1f, 0x8c, 0xb1, 0x77,\n                                                              0xaf, 0x6a, 0xa1, 0x6e, 0x9e, 0x18, 0x13, 0xe8,\n                                                              0xc8, 0xab, 0xb0, 0xb1, 0xce, 0x1a, 0xc9, 0x66,\n                                                              0xd0, 0xfb, 0x1f, 0x1e, 0xfb, 0xc6, 0x36, 0xa,\n                                                              0xdd, 0x74, 0xa, 0x39, 0x6, 0xf7, 0x79, 0xf7,\n                                                              0x91, 0x15, 0xa8, 0xf7, 0x13, 0x5, 0xf7, 0x20,\n                                                              0x6, 0xc8, 0xa3, 0x70, 0x71, 0x8c, 0x1f, 0x44,\n                                                              0x23, 0x88, 0x71, 0x1e, 0xfb, 0x43, 0xfb, 0x91,\n                                                              0x15, 0xaa, 0xf7, 0x36, 0x5, 0xf6, 0x6, 0x13,\n                                                              0xf0, 0xb3, 0xf7, 0x0, 0x80, 0x4d, 0x4f, 0x38,\n                                                              0x6e, 0x6d, 0x1f, 0xe, 0x79, 0xe8, 0xf8, 0x1d,\n                                                              0xe7, 0x1, 0xa9, 0xec, 0x3, 0xf8, 0x7a, 0xf7,\n                                                              0x1e, 0x15, 0x76, 0x65, 0x38, 0x61, 0x39, 0x1b,\n                                                              0xfb, 0x0, 0x5b, 0xcb, 0xdb, 0xf7, 0x41, 0xf7,\n                                                              0x24, 0xd7, 0xe7, 0xc2, 0xbc, 0x77, 0x6f, 0xb2,\n                                                              0x1f, 0x76, 0x22, 0x5, 0xea, 0x6, 0xbc, 0xf7,\n                                                              0x89, 0x7a, 0xa, 0x83, 0x60, 0x5, 0x96, 0x80,\n                                                              0x5c, 0xab, 0x34, 0x1b, 0xfb, 0x4d, 0xfb, 0x39,\n                                                              0xfb, 0x25, 0xfb, 0x59, 0xfb, 0x2, 0xc0, 0xfb,\n                                                              0x12, 0xf7, 0x4c, 0xb4, 0xf7, 0x16, 0x9d, 0xd1,\n                                                              0xe7, 0x1f, 0xe, 0xfb, 0x4d, 0x76, 0xf7, 0x56,\n                                                              0xe5, 0xf8, 0x19, 0xe7, 0x8c, 0x77, 0x12, 0x8b,\n                                                              0xee, 0x13, 0xe8, 0xf7, 0x0, 0xfb, 0x46, 0x15,\n                                                              0x71, 0xa7, 0xa0, 0x89, 0xa0, 0x1b, 0xc9, 0xca,\n                                                              0xb5, 0xd5, 0xa1, 0x84, 0xad, 0x64, 0x94, 0x1f,\n                                                              0x8f, 0x98, 0x5, 0xe8, 0xd7, 0xba, 0xb3, 0xd7,\n                                                              0x1f, 0x60, 0xcf, 0x5, 0x72, 0x5b, 0x42, 0x63,\n                                                              0x37, 0x1b, 0xfb, 0x1d, 0x75, 0xed, 0xd7, 0xf7,\n                                                              0x2b, 0xf7, 0x2e, 0xcb, 0xe0, 0xc1, 0xba, 0x79,\n                                                              0x70, 0xb0, 0x1f, 0x76, 0x24, 0x5, 0xeb, 0x6,\n                                                              0x13, 0xd8, 0xbc, 0xf7, 0x85, 0x7a, 0xa, 0x83,\n                                                              0x60, 0x5, 0x13, 0xe8, 0xa4, 0x6f, 0x58, 0x9c,\n                                                              0x4e, 0x1b, 0xfb, 0x42, 0xfb, 0x4a, 0x25, 0xfb,\n                                                              0x84, 0xfb, 0x8, 0xd6, 0x2e, 0xf7, 0x1, 0x7a,\n                                                              0x1f, 0x70, 0x2e, 0x5, 0x8e, 0x95, 0x9e, 0x8e,\n                                                              0x9b, 0x1b, 0x94, 0x95, 0x85, 0x80, 0x7f, 0x7e,\n                                                              0x81, 0x7c, 0x80, 0x7d, 0x8f, 0x95, 0x7c, 0x1f,\n                                                              0xe, 0x3a, 0xa, 0xf8, 0x78, 0xeb, 0x3, 0x55,\n                                                              0x16, 0xf7, 0xa2, 0x6, 0xf7, 0x57, 0xf7, 0x3d,\n                                                              0xf4, 0xf7, 0x91, 0xf7, 0xc, 0x40, 0xdf, 0xfb,\n                                                              0x27, 0x1f, 0xfb, 0xbc, 0x36, 0xa, 0xdf, 0x74,\n                                                              0xa, 0x38, 0x6, 0xf7, 0x48, 0x16, 0xda, 0xf8,\n                                                              0x10, 0x5, 0xf7, 0xb, 0x6, 0xea, 0xb9, 0x59,\n                                                              0x46, 0xfb, 0x28, 0x2d, 0xfb, 0x5, 0xfb, 0x1d,\n                                                              0x1f, 0xe, 0x8b, 0xe6, 0xd6, 0xf7, 0x39, 0x31,\n                                                              0xe5, 0xf7, 0x20, 0xe6, 0x12, 0x13, 0xb0, 0x75,\n                                                              0x16, 0xf8, 0xa4, 0x6, 0xb5, 0xf7, 0x59, 0x66,\n                                                              0xa, 0x73, 0x21, 0x5, 0xfb, 0x9a, 0x6, 0xa9,\n                                                              0xf7, 0x2a, 0x5, 0xf7, 0x10, 0x6, 0x13, 0xd0,\n                                                              0x7b, 0x40, 0x56, 0xa, 0xbc, 0xf7, 0x84, 0x4e,\n                                                              0xa, 0x7c, 0x40, 0x5, 0xfb, 0xe, 0x6, 0xa8,\n                                                              0x97, 0xa, 0xf7, 0x9a, 0x6, 0x76, 0x25, 0x96,\n                                                              0xa, 0xb3, 0xf7, 0x55, 0x5, 0xfc, 0xa2, 0x4b,\n                                                              0xa, 0xd1, 0x74, 0xa, 0x43, 0x6, 0xe, 0x54,\n                                                              0xa, 0xf7, 0x7a, 0x77, 0x12, 0x13, 0xb8, 0xf7,\n                                                              0x99, 0xf8, 0xf3, 0x15, 0xf7, 0xe4, 0xd5, 0x77,\n                                                              0xf2, 0xfb, 0xd9, 0xfb, 0xa, 0x5, 0xfb, 0xa6,\n                                                              0xfd, 0x2e, 0x28, 0xa, 0x54, 0xa, 0xf7, 0x76,\n                                                              0x77, 0x12, 0x13, 0xb8, 0xf7, 0x73, 0xf8, 0xee,\n                                                              0x15, 0xf7, 0x44, 0xf7, 0x4, 0xf7, 0x13, 0xfb,\n                                                              0x4, 0xcf, 0xae, 0xfb, 0x18, 0xf7, 0x23, 0x4e,\n                                                              0xa, 0xfb, 0x58, 0xfb, 0x22, 0x5, 0xfb, 0x52,\n                                                              0xfd, 0x12, 0x28, 0xa, 0x54, 0xa, 0xd4, 0xf7,\n                                                              0xd, 0x12, 0x13, 0xb8, 0xf8, 0x34, 0xf9, 0x7,\n                                                              0x92, 0xa, 0xa5, 0xf7, 0xd, 0x4c, 0xa, 0xfb,\n                                                              0x66, 0xfb, 0xd, 0x6d, 0xa, 0xa5, 0xf7, 0xd,\n                                                              0x65, 0xa, 0xfb, 0xac, 0xfd, 0x80, 0x28, 0xa,\n                                                              0x8b, 0xe5, 0xf7, 0x27, 0xe4, 0xa1, 0x8b, 0x1,\n                                                              0xdc, 0xea, 0xf7, 0x14, 0xed, 0xbd, 0xeb, 0x3,\n                                                              0x75, 0x16, 0x33, 0xa, 0x2a, 0xa, 0xf7, 0x7f,\n                                                              0xf8, 0xe4, 0x15, 0xf7, 0xc0, 0x40, 0xb1, 0xc5,\n                                                              0xfb, 0xa5, 0xf7, 0xb, 0x5, 0xe, 0x8b, 0xe6,\n                                                              0xf7, 0x30, 0xce, 0xf7, 0x31, 0xe6, 0x1, 0xf8,\n                                                              0x86, 0xee, 0x3, 0x70, 0x16, 0xf7, 0xa2, 0x6,\n                                                              0xf7, 0x36, 0xf7, 0x54, 0xf3, 0xf7, 0x8f, 0xf7,\n                                                              0xd, 0x4c, 0xe1, 0xfb, 0x28, 0x1f, 0xfb, 0xbc,\n                                                              0x36, 0xa, 0xde, 0x6, 0x6a, 0xfb, 0x31, 0x5,\n                                                              0x4d, 0x6, 0x7e, 0x48, 0x5, 0xc8, 0x6, 0x6b,\n                                                              0xfb, 0x30, 0x5, 0x38, 0x6, 0xf7, 0x48, 0x16,\n                                                              0xac, 0xf7, 0x30, 0x5, 0xf7, 0x12, 0x6, 0x99,\n                                                              0xce, 0x5, 0xfb, 0x12, 0x6, 0xaa, 0xf7, 0x31,\n                                                              0x5, 0xf7, 0xc, 0x6, 0xec, 0xaa, 0x57, 0x44,\n                                                              0xfb, 0x28, 0x39, 0xfb, 0x1, 0xfb, 0x33, 0x1f,\n                                                              0xe, 0x8b, 0xdd, 0xe9, 0xd3, 0xc1, 0xd3, 0xf5,\n                                                              0xdd, 0x1, 0xf8, 0x7b, 0xe4, 0x3, 0x77, 0xf7,\n                                                              0x44, 0x15, 0xe7, 0x6, 0x23, 0x91, 0xca, 0x43,\n                                                              0xf7, 0x25, 0x1b, 0xb2, 0xf7, 0x5, 0x9e, 0xc9,\n                                                              0xe2, 0x1f, 0x61, 0xc8, 0x5, 0x77, 0x68, 0x47,\n                                                              0x63, 0x3d, 0x1b, 0x45, 0x5a, 0xa9, 0xcb, 0x7d,\n                                                              0x1f, 0xf7, 0x32, 0x6, 0xb2, 0xd3, 0x5, 0xfb,\n                                                              0x5d, 0x6, 0x8c, 0x9b, 0x8f, 0xa3, 0x90, 0x99,\n                                                              0x8, 0xf7, 0x6a, 0x6, 0xb3, 0xd3, 0x5, 0xfb,\n                                                              0x71, 0x6, 0xcd, 0xae, 0xc7, 0xb3, 0xdd, 0x1b,\n                                                              0xbe, 0xbe, 0x6f, 0x6a, 0x98, 0x1f, 0x7e, 0x48,\n                                                              0x5, 0xe4, 0x6, 0xb7, 0xf7, 0x66, 0x5, 0x31,\n                                                              0x6, 0x81, 0x5c, 0x5, 0xaa, 0x6c, 0x59, 0x9b,\n                                                              0x5e, 0x1b, 0xfb, 0x10, 0x22, 0x40, 0xfb, 0x5,\n                                                              0x55, 0x1f, 0x48, 0x6, 0x63, 0x43, 0x5, 0xda,\n                                                              0x6, 0x85, 0x71, 0x89, 0x79, 0x8a, 0x81, 0x8,\n                                                              0x54, 0x6, 0xe, 0x8b, 0xe6, 0xdf, 0xf7, 0x2f,\n                                                              0xf7, 0x21, 0xe6, 0x1, 0xd8, 0xec, 0xf7, 0x18,\n                                                              0xed, 0xd5, 0xed, 0x3, 0x75, 0x16, 0xf7, 0xc7,\n                                                              0x6, 0x9f, 0xe6, 0x5, 0xfb, 0x17, 0x6, 0xaa,\n                                                              0xf7, 0x28, 0x5, 0xf7, 0x6, 0x6, 0x7e, 0x4b,\n                                                              0x56, 0xa, 0xb9, 0xf7, 0x70, 0x4e, 0xa, 0x7c,\n                                                              0x4a, 0x65, 0xa, 0xa9, 0xf7, 0x21, 0x88, 0xa,\n                                                              0x70, 0xfb, 0x12, 0x56, 0xa, 0xb9, 0xf7, 0x6d,\n                                                              0x5, 0xfc, 0xa2, 0x4b, 0xa, 0xda, 0x6, 0x3b,\n                                                              0x7d, 0xa, 0x3b, 0x6, 0xe, 0x79, 0xe8, 0xf5,\n                                                              0xe9, 0xf7, 0x56, 0xe5, 0x1, 0x9f, 0xee, 0x3,\n                                                              0xf7, 0xa7, 0xf7, 0x49, 0x15, 0xf7, 0x32, 0x6,\n                                                              0x7c, 0x3f, 0x5, 0x78, 0x65, 0x56, 0x80, 0x58,\n                                                              0x1b, 0x3a, 0x3f, 0xb1, 0xeb, 0xf7, 0x33, 0xf7,\n                                                              0xc, 0xf4, 0xf7, 0x9, 0xc9, 0xaa, 0x87, 0x6d,\n                                                              0xb9, 0x1f, 0x77, 0x2d, 0x96, 0xa, 0xba, 0xf7,\n                                                              0x6e, 0x66, 0xa, 0x82, 0x65, 0x5, 0xa1, 0x71,\n                                                              0x62, 0x9b, 0x41, 0x1b, 0xfb, 0x38, 0xfb, 0x50,\n                                                              0xfb, 0x23, 0xfb, 0x64, 0xfb, 0x2b, 0xf7, 0x1,\n                                                              0x3c, 0xf7, 0x1f, 0xeb, 0xf7, 0x5, 0xb6, 0x94,\n                                                              0xa3, 0x1f, 0xa7, 0xf7, 0x27, 0x5, 0xba, 0x55,\n                                                              0xa, 0xfb, 0xc1, 0x6, 0xe, 0x79, 0xe2, 0x8b,\n                                                              0xee, 0xa6, 0xe3, 0x70, 0xcd, 0xf7, 0x70, 0xcd,\n                                                              0x12, 0x8b, 0xee, 0x13, 0xec, 0xf7, 0x93, 0xf7,\n                                                              0x3c, 0x15, 0xf7, 0x32, 0x6, 0x7c, 0x44, 0x5,\n                                                              0x7a, 0x67, 0x59, 0x80, 0x5a, 0x1b, 0x37, 0x3b,\n                                                              0xac, 0xe8, 0xf7, 0x29, 0xf7, 0xc, 0xf7, 0x4,\n                                                              0xf7, 0x9, 0xc9, 0xaa, 0x78, 0x6f, 0xb9, 0x1f,\n                                                              0x13, 0xdc, 0x77, 0x34, 0x96, 0xa, 0xba, 0xf7,\n                                                              0x70, 0x66, 0xa, 0x82, 0x60, 0x5, 0xa2, 0x67,\n                                                              0x6c, 0x9f, 0x41, 0x1b, 0xfb, 0x42, 0xfb, 0x46,\n                                                              0xfb, 0x2a, 0xfb, 0x57, 0xfb, 0x21, 0xf7, 0x1,\n                                                              0x41, 0xf7, 0x1f, 0xeb, 0xf7, 0x5, 0xb3, 0x94,\n                                                              0xa3, 0x1f, 0xa7, 0xf7, 0x1d, 0x5, 0xba, 0x6,\n                                                              0x9f, 0xe3, 0x5, 0xfb, 0xc1, 0x6, 0xab, 0xf7,\n                                                              0xf4, 0x48, 0xa, 0x8b, 0xe6, 0xf7, 0x23, 0xe6,\n                                                              0xf7, 0x26, 0xe6, 0x1, 0xc4, 0xe9, 0xf7, 0x72,\n                                                              0xea, 0x3, 0x64, 0x16, 0xf7, 0x90, 0x34, 0xa,\n                                                              0x3a, 0x6, 0xa8, 0xf7, 0x23, 0x5, 0xf7, 0x72,\n                                                              0x6, 0x6e, 0xfb, 0x23, 0x5, 0x3b, 0x6, 0x79,\n                                                              0x30, 0x5, 0xf7, 0x8f, 0x34, 0xa, 0x3e, 0x6,\n                                                              0xd7, 0xf8, 0x10, 0x5, 0xd9, 0x42, 0xa, 0xfb,\n                                                              0x8f, 0x36, 0xa, 0xdb, 0x6, 0x6d, 0xfb, 0x26,\n                                                              0x5, 0xfb, 0x72, 0x6, 0xa9, 0xf7, 0x26, 0x5,\n                                                              0xdc, 0x6, 0x9d, 0xe6, 0x5, 0xfb, 0x90, 0x36,\n                                                              0xa, 0xd8, 0x6, 0x3f, 0x7d, 0xa, 0x3d, 0x6,\n                                                              0xe, 0x3a, 0xa, 0xf7, 0x67, 0xf0, 0x3, 0x9c,\n                                                              0x16, 0xf8, 0x54, 0x6, 0x9f, 0xe6, 0x5, 0xfb,\n                                                              0x41, 0x6, 0xdb, 0xf8, 0x10, 0x5, 0xf7, 0x3f,\n                                                              0x34, 0xa, 0xfc, 0x51, 0x36, 0xa, 0xf7, 0x41,\n                                                              0x6, 0x3b, 0xfc, 0x10, 0x43, 0xa, 0x79, 0xe6,\n                                                              0xf8, 0x22, 0xe6, 0x1, 0x41, 0x79, 0x15, 0xf7,\n                                                              0xaa, 0x6, 0x9f, 0xe6, 0x5, 0x2e, 0x6, 0xdb,\n                                                              0xf8, 0x22, 0x5, 0xe6, 0x34, 0xa, 0xfb, 0xa7,\n                                                              0x36, 0xa, 0xde, 0x6, 0x3b, 0xfc, 0x22, 0x5,\n                                                              0x36, 0x6, 0xf7, 0xd3, 0x72, 0x15, 0x76, 0xa2,\n                                                              0xa4, 0x5e, 0xe9, 0x1b, 0xf7, 0x1e, 0x87, 0x8c,\n                                                              0xa, 0xac, 0x5b, 0xa, 0xfb, 0xa6, 0x6, 0x79,\n                                                              0x2f, 0x5, 0xf7, 0x25, 0x6, 0x53, 0xfb, 0xa8,\n                                                              0x5, 0x40, 0x7c, 0x84, 0x5c, 0x5e, 0x1b, 0x73,\n                                                              0x83, 0x97, 0x9e, 0x9d, 0x91, 0xa3, 0x91, 0xa4,\n                                                              0x1f, 0xa1, 0xec, 0x4e, 0xa, 0xe, 0x68, 0xa,\n                                                              0xf7, 0x90, 0xf8, 0xf3, 0x15, 0xf7, 0xde, 0xd5,\n                                                              0x78, 0xf2, 0xfb, 0xd3, 0xfb, 0xa, 0x5, 0xfb,\n                                                              0x77, 0xfd, 0x2e, 0x15, 0x2b, 0xa, 0xe, 0x75,\n                                                              0xa, 0xf7, 0x76, 0x77, 0x62, 0xa, 0xf7, 0x6b,\n                                                              0xf8, 0xf0, 0x15, 0xf7, 0x49, 0xf7, 0x2, 0xf7,\n                                                              0xa, 0xfb, 0x2, 0xcf, 0xae, 0xfb, 0x16, 0xf7,\n                                                              0x21, 0x66, 0xa, 0xfb, 0x56, 0xfb, 0x20, 0x5,\n                                                              0xfb, 0x24, 0xfd, 0x14, 0x15, 0x2b, 0xa, 0xe,\n                                                              0x75, 0xa, 0xd2, 0xf7, 0xf, 0x62, 0xa, 0xf8,\n                                                              0x34, 0xf9, 0x5, 0x4a, 0xa, 0xfb, 0x69, 0xfb,\n                                                              0xf, 0x4a, 0xa, 0xfb, 0x84, 0xfd, 0x80, 0x15,\n                                                              0x2b, 0xa, 0xe, 0x8b, 0xe3, 0xf8, 0x2, 0xe3,\n                                                              0xde, 0xf7, 0xf, 0x62, 0xa, 0xf7, 0xca, 0xf9,\n                                                              0x5, 0x4a, 0xa, 0xfb, 0xd4, 0xfd, 0x80, 0x15,\n                                                              0xf8, 0x55, 0x6, 0x9e, 0xe3, 0x5, 0xfb, 0x40,\n                                                              0x6, 0xdb, 0xf8, 0x2, 0x5, 0xf7, 0x3e, 0x6,\n                                                              0x9e, 0xe3, 0x5, 0xfc, 0x51, 0x6, 0x78, 0x33,\n                                                              0x5, 0xf7, 0x41, 0x6, 0x3b, 0xfc, 0x2, 0x43,\n                                                              0xa, 0x68, 0xa, 0x9c, 0x16, 0x2b, 0xa, 0xf7,\n                                                              0x56, 0xf8, 0xe6, 0x15, 0xf7, 0xc5, 0x3e, 0xb3,\n                                                              0xc5, 0xfb, 0xac, 0xf7, 0xb, 0x5, 0xe, 0x79,\n                                                              0xe5, 0xf8, 0x22, 0xe7, 0x1, 0x9a, 0xed, 0xf7,\n                                                              0x73, 0xe8, 0x3, 0x6d, 0xbb, 0x15, 0x76, 0xa2,\n                                                              0xf7, 0xa, 0x5e, 0xe9, 0x1b, 0xf7, 0x1e, 0xc8,\n                                                              0x8c, 0xa, 0xf7, 0x11, 0x5b, 0xa, 0xfc, 0x29,\n                                                              0x6, 0x79, 0x2f, 0x5, 0xf7, 0x4c, 0x6, 0x53,\n                                                              0xfb, 0xa8, 0x5, 0x40, 0x7c, 0x67, 0x5c, 0x3a,\n                                                              0x1b, 0x45, 0x50, 0xa1, 0xd7, 0x9b, 0x1f, 0xa1,\n                                                              0xec, 0x4e, 0xa, 0xe, 0x3a, 0xa, 0xcf, 0xed,\n                                                              0xf7, 0x8e, 0xf7, 0x17, 0x3, 0x68, 0x16, 0xf7,\n                                                              0x9d, 0x34, 0xa, 0x38, 0x6, 0xa0, 0xf0, 0xd1,\n                                                              0xc0, 0x9f, 0x70, 0xa1, 0x66, 0x9a, 0x71, 0x19,\n                                                              0xa6, 0x56, 0xa6, 0x58, 0x9b, 0x58, 0x8, 0xf7,\n                                                              0x34, 0x34, 0xa, 0x20, 0x6, 0x7b, 0xb7, 0x76,\n                                                              0xa6, 0x75, 0xb5, 0x7e, 0xa8, 0x66, 0xc0, 0x80,\n                                                              0x9c, 0xf7, 0x67, 0xf7, 0x3c, 0x18, 0xd0, 0x34,\n                                                              0xa, 0xfb, 0x87, 0x6e, 0xa, 0xb7, 0x6, 0xfb,\n                                                              0x61, 0xfb, 0x36, 0xae, 0xf7, 0x36, 0x5, 0xdd,\n                                                              0x34, 0xa, 0xfb, 0x9c, 0x6e, 0xa, 0xdf, 0x74,\n                                                              0xa, 0x37, 0x6, 0xe, 0x3a, 0xa, 0xf7, 0xf,\n                                                              0xed, 0x3, 0x8d, 0x16, 0xf8, 0xb4, 0x6, 0xbf,\n                                                              0xf7, 0x92, 0x5, 0x27, 0x6, 0x6b, 0xfb, 0x37,\n                                                              0x5, 0xfb, 0x89, 0x6, 0xdd, 0xf8, 0x10, 0x5,\n                                                              0xf7, 0x14, 0x34, 0xa, 0xfb, 0xdd, 0x36, 0xa,\n                                                              0xf0, 0x6, 0x3b, 0x7d, 0xa, 0x26, 0x6, 0xe,\n                                                              0x3a, 0xa, 0xf7, 0xe, 0xed, 0x3, 0x8d, 0x16,\n                                                              0xf8, 0xb1, 0x6, 0xc2, 0xf7, 0x9c, 0x7b, 0xa,\n                                                              0x66, 0xfb, 0x41, 0x5, 0xfb, 0x86, 0x6, 0xae,\n                                                              0xf7, 0x37, 0xf7, 0x34, 0xb4, 0x9a, 0xc9, 0xfb,\n                                                              0x36, 0x63, 0xac, 0xf7, 0x2e, 0x5, 0xf7, 0x14,\n                                                              0x34, 0xa, 0xfb, 0xdc, 0x36, 0xa, 0xf0, 0x6,\n                                                              0x66, 0xfb, 0x47, 0x30, 0x74, 0x7f, 0x4b, 0xe4,\n                                                              0xa2, 0x6e, 0xfb, 0x1d, 0x5, 0x26, 0x6, 0xe,\n                                                              0x3a, 0xa, 0x4e, 0x16, 0xf7, 0x77, 0x34, 0xa,\n                                                              0x3e, 0x6, 0xda, 0xf7, 0xce, 0xc5, 0xfb, 0xac,\n                                                              0x5, 0xc7, 0x6, 0xf7, 0x2b, 0xf7, 0xa4, 0x5b,\n                                                              0xfb, 0xc6, 0x5, 0x41, 0x6, 0x7a, 0x30, 0x5,\n                                                              0xf7, 0x71, 0x42, 0xa, 0x55, 0x6, 0xc9, 0xf8,\n                                                              0x10, 0x5, 0xdb, 0x42, 0xa, 0xfb, 0x61, 0x6,\n                                                              0xfb, 0x32, 0xfb, 0xb6, 0x5b, 0xf7, 0xb6, 0x5,\n                                                              0xfb, 0x5f, 0x4b, 0xa, 0xd7, 0x6, 0x2e, 0x7d,\n                                                              0xa, 0x53, 0x6, 0xe, 0x7f, 0xe8, 0xf8, 0x18,\n                                                              0xe8, 0x1, 0x4f, 0x7f, 0x15, 0xf7, 0xa4, 0x94,\n                                                              0xa, 0x28, 0x6, 0xc9, 0xf7, 0xd1, 0xf7, 0x4a,\n                                                              0xfc, 0x2e, 0x5, 0xe7, 0x6, 0xeb, 0xf8, 0x75,\n                                                              0x6c, 0xa, 0xea, 0x6, 0x4e, 0xfb, 0xd0, 0xfb,\n                                                              0x3e, 0xf8, 0x2d, 0x7e, 0xa, 0xfc, 0x18, 0x5,\n                                                              0x3c, 0x6, 0xe, 0x7f, 0xe7, 0xf8, 0x13, 0xe8,\n                                                              0xc1, 0xe0, 0x73, 0xdf, 0x8f, 0x77, 0x12, 0x13,\n                                                              0xd0, 0x4f, 0x7f, 0x15, 0xf7, 0xa5, 0x5b, 0xa,\n                                                              0x27, 0x6, 0xca, 0xf7, 0xcd, 0xf7, 0x4c, 0xfc,\n                                                              0x29, 0x5, 0xe5, 0x6, 0xea, 0xf8, 0x6f, 0x6c,\n                                                              0xa, 0xeb, 0x6, 0x4e, 0xfb, 0xc6, 0xfb, 0x3e,\n                                                              0xf8, 0x23, 0x7e, 0xa, 0xfc, 0x13, 0x5, 0x3b,\n                                                              0x6, 0xf7, 0x62, 0xf8, 0xbe, 0x15, 0xdb, 0x72,\n                                                              0x5, 0xae, 0xa0, 0x9e, 0xa6, 0xa7, 0x1b, 0xa6,\n                                                              0xa0, 0x79, 0x7b, 0xa3, 0x1f, 0x13, 0xe8, 0x7d,\n                                                              0xa0, 0xa1, 0x7e, 0xa8, 0x1b, 0xd6, 0xca, 0xc7,\n                                                              0xcb, 0xa6, 0x1f, 0x3c, 0xa4, 0x5, 0x76, 0x7f,\n                                                              0x74, 0x60, 0x67, 0x1b, 0x77, 0x79, 0x95, 0x98,\n                                                              0x78, 0x1f, 0x13, 0xd0, 0x9c, 0x72, 0x70, 0x9f,\n                                                              0x6a, 0x1b, 0x39, 0x52, 0x48, 0x55, 0x71, 0x1f,\n                                                              0xe, 0x79, 0xe7, 0xf8, 0x1f, 0xe9, 0x1, 0xa2,\n                                                              0xf1, 0xf7, 0xff, 0xec, 0x3, 0xa2, 0xf7, 0x57,\n                                                              0x15, 0xfb, 0x24, 0xf3, 0x46, 0xf7, 0x6, 0xf7,\n                                                              0x4f, 0xf7, 0x31, 0xf7, 0xe, 0xf7, 0x8d, 0xf7,\n                                                              0xb, 0x45, 0xe6, 0xfb, 0x2d, 0xfb, 0x5d, 0xfb,\n                                                              0x1e, 0xfb, 0x49, 0xfb, 0x4f, 0x1e, 0xf1, 0x9a,\n                                                              0x15, 0xf7, 0xc, 0xd4, 0xf7, 0x1f, 0xf7, 0x24,\n                                                              0xf7, 0x0, 0xb1, 0x4d, 0x46, 0x23, 0x3e, 0xfb,\n                                                              0x34, 0xfb, 0x2c, 0x2f, 0x61, 0xc9, 0xd5, 0x1e,\n                                                              0xe, 0x8b, 0xe6, 0x30, 0xf7, 0x3d, 0xa4, 0xf7,\n                                                              0x4f, 0x92, 0xf7, 0x42, 0x30, 0xe6, 0x12, 0x66,\n                                                              0xea, 0x13, 0xac, 0xf7, 0xe2, 0xe6, 0x15, 0xaa,\n                                                              0xf7, 0x2b, 0x5, 0xaf, 0x6, 0x81, 0x58, 0x5,\n                                                              0xd4, 0x6, 0xb1, 0xf7, 0x4f, 0x5, 0x41, 0x6,\n                                                              0x83, 0x5d, 0x5, 0x65, 0x6, 0xa7, 0xf7, 0x1f,\n                                                              0x5, 0xf7, 0x1a, 0x6, 0x13, 0xb4, 0x7b, 0x38,\n                                                              0x5, 0xd5, 0x6, 0xae, 0xf7, 0x42, 0x5, 0xfc,\n                                                              0x10, 0x6, 0xfb, 0x1e, 0xfb, 0x30, 0xfb, 0xf,\n                                                              0xfb, 0x7a, 0xfb, 0x1c, 0xe2, 0x42, 0xe4, 0x1f,\n                                                              0xf8, 0x16, 0x6, 0x13, 0x74, 0xae, 0xf7, 0x3d,\n                                                              0x5, 0x40, 0x6, 0x13, 0xac, 0x7a, 0x3d, 0x5,\n                                                              0xfc, 0x2e, 0xf7, 0x25, 0x15, 0xf7, 0x8, 0xed,\n                                                              0xf7, 0xb, 0xf6, 0x99, 0xb2, 0x8a, 0x66, 0x84,\n                                                              0x1e, 0x50, 0xfb, 0xb9, 0x5, 0x5c, 0x82, 0x67,\n                                                              0x89, 0x7a, 0x1b, 0x30, 0x64, 0xc3, 0xe4, 0x1f,\n                                                              0xe, 0x77, 0xa, 0xf7, 0x71, 0x77, 0x58, 0xa,\n                                                              0xf7, 0x8d, 0xf8, 0xf0, 0x15, 0xf7, 0xe4, 0xd8,\n                                                              0x76, 0xf2, 0xfb, 0xd7, 0xfb, 0xd, 0x5, 0xfb,\n                                                              0x72, 0xfc, 0x61, 0x24, 0xa, 0x77, 0xa, 0xf7,\n                                                              0x6d, 0x77, 0x58, 0xa, 0xf7, 0x3f, 0xf9, 0x13,\n                                                              0x15, 0xc0, 0x66, 0xf7, 0x46, 0xf3, 0xf7, 0xa,\n                                                              0x22, 0xcc, 0xaf, 0xfb, 0x14, 0xf7, 0x23, 0x5,\n                                                              0x2c, 0x6, 0xfb, 0xeb, 0xfc, 0xd6, 0x24, 0xa,\n                                                              0x77, 0xa, 0xc9, 0xf7, 0xf, 0x58, 0xa, 0xf8,\n                                                              0x38, 0xf9, 0x5, 0x5a, 0xa, 0xa4, 0xf7, 0xf,\n                                                              0x4c, 0xa, 0xfb, 0x65, 0xfb, 0xf, 0x5a, 0xa,\n                                                              0xa5, 0xf7, 0xf, 0x5, 0xfb, 0x4, 0x6, 0xfb,\n                                                              0x88, 0xfc, 0xb6, 0x24, 0xa, 0x79, 0xe4, 0xf8,\n                                                              0x21, 0xe6, 0x1, 0x9e, 0xf1, 0xf7, 0xee, 0xed,\n                                                              0x3, 0xf7, 0x81, 0xf9, 0x3d, 0x15, 0xf7, 0xc2,\n                                                              0x40, 0xb2, 0xc5, 0xfb, 0xa7, 0xf7, 0xc, 0x5,\n                                                              0xfb, 0xb0, 0xfc, 0xda, 0x24, 0xa, 0x7c, 0xe6,\n                                                              0x3e, 0x76, 0xf8, 0x93, 0xe6, 0x8f, 0x77, 0x12,\n                                                              0x97, 0xf2, 0xf8, 0x5, 0xeb, 0x13, 0x6c, 0x7f,\n                                                              0xa7, 0x15, 0xbf, 0x59, 0xc1, 0xbf, 0x5, 0x13,\n                                                              0x9c, 0x6d, 0xb5, 0xbe, 0x7c, 0xbf, 0x1b, 0xf7,\n                                                              0x62, 0xf7, 0x1c, 0xf7, 0x2c, 0xf7, 0x7b, 0x8a,\n                                                              0x1f, 0xb2, 0x81, 0xb0, 0x7a, 0xac, 0x1e, 0xc6,\n                                                              0xc6, 0x57, 0xbb, 0x56, 0x58, 0x5, 0x13, 0xac,\n                                                              0xa9, 0x68, 0x59, 0x9c, 0x4c, 0x1b, 0xfb, 0x92,\n                                                              0x2e, 0xfb, 0x6e, 0xfb, 0x2f, 0x5b, 0x97, 0x62,\n                                                              0x9e, 0x6a, 0x1f, 0xdd, 0xda, 0x15, 0x83, 0x9e,\n                                                              0x88, 0xa5, 0x8c, 0xa5, 0x8, 0xf7, 0x3, 0xe4,\n                                                              0xf7, 0x23, 0xf7, 0x1b, 0xb3, 0xaa, 0x80, 0x7a,\n                                                              0xa1, 0x1e, 0xfb, 0x9b, 0xfb, 0xfa, 0x15, 0xf7,\n                                                              0xc4, 0xf7, 0xbd, 0x5, 0x93, 0x78, 0x8e, 0x74,\n                                                              0x74, 0x1a, 0x27, 0x41, 0xfb, 0x33, 0xfb, 0x2d,\n                                                              0x67, 0x6c, 0x95, 0x9c, 0x76, 0x1e, 0xe, 0x77,\n                                                              0xa, 0xbb, 0xdf, 0xcb, 0x77, 0x58, 0xa, 0xf7,\n                                                              0x2c, 0xf9, 0xf, 0x15, 0xd9, 0x71, 0xa0, 0xaf,\n                                                              0x9d, 0xa6, 0xa6, 0x8a, 0x19, 0xa4, 0x8a, 0x9e,\n                                                              0x80, 0x9b, 0x80, 0x8, 0x7a, 0xa3, 0xa0, 0x77,\n                                                              0xaf, 0x1b, 0xd5, 0xc6, 0xc6, 0xcb, 0xa6, 0x1f,\n                                                              0x3f, 0xa4, 0x5, 0x76, 0x80, 0x73, 0x60, 0x69,\n                                                              0x1b, 0x74, 0x7a, 0x9a, 0x9a, 0x76, 0x1f, 0x9a,\n                                                              0x77, 0x73, 0x9a, 0x68, 0x1b, 0x3c, 0x53, 0x48,\n                                                              0x56, 0x72, 0x1f, 0xfb, 0x19, 0xfc, 0x45, 0x24,\n                                                              0xa, 0x8b, 0xe7, 0xe5, 0xe6, 0xf7, 0x59, 0xe7,\n                                                              0x1, 0xf8, 0x7d, 0xed, 0x3, 0x84, 0x16, 0xf7,\n                                                              0xca, 0x5b, 0xa, 0xfb, 0x15, 0x46, 0xa, 0xf7,\n                                                              0x11, 0x6, 0xf7, 0x3b, 0xdf, 0xe6, 0xf7, 0x16,\n                                                              0x1f, 0xf3, 0x8a, 0x3a, 0xc2, 0xfb, 0xa, 0x1b,\n                                                              0xfb, 0xa8, 0x6, 0x78, 0x2f, 0x5, 0xde, 0x6,\n                                                              0x3b, 0xfc, 0xe, 0x5, 0x38, 0x6, 0xf7, 0x6f,\n                                                              0xf7, 0x49, 0x15, 0xb3, 0xf7, 0x59, 0x5, 0xeb,\n                                                              0x6, 0xc5, 0xcb, 0x73, 0x51, 0x20, 0x2b, 0x83,\n                                                              0x3d, 0x1f, 0xe, 0xfb, 0x9, 0x76, 0xc1, 0xf7,\n                                                              0x40, 0xf8, 0x11, 0xe6, 0x1, 0xba, 0xec, 0xf7,\n                                                              0xfd, 0xe9, 0x3, 0xd7, 0x45, 0x15, 0xa8, 0x47,\n                                                              0x5, 0xab, 0xcb, 0xa8, 0xa1, 0xaf, 0x1b, 0xa7,\n                                                              0xa1, 0x7e, 0x7e, 0xa2, 0x1f, 0x7f, 0xa1, 0xa1,\n                                                              0x80, 0xa7, 0x1b, 0xc3, 0xac, 0xa6, 0xb8, 0xc3,\n                                                              0x1f, 0x5f, 0xca, 0x5, 0x67, 0x60, 0x7c, 0x83,\n                                                              0x78, 0x1b, 0x73, 0x76, 0x9b, 0xa2, 0x6f, 0x1f,\n                                                              0xf7, 0x3f, 0xb5, 0xed, 0xf7, 0x28, 0xf7, 0x27,\n                                                              0x1a, 0xeb, 0x5e, 0xf7, 0x16, 0xfb, 0x3d, 0xfb,\n                                                              0x37, 0xfb, 0x43, 0xfb, 0x11, 0xfb, 0x6c, 0xfb,\n                                                              0x7, 0xbd, 0x48, 0xd4, 0x73, 0x1e, 0x69, 0x62,\n                                                              0x5, 0x93, 0xf7, 0x95, 0x15, 0xf7, 0x3b, 0xf7,\n                                                              0x22, 0xd4, 0xdb, 0xec, 0xb5, 0x40, 0x3a, 0xfb,\n                                                              0x13, 0xfb, 0x1c, 0x29, 0x37, 0x47, 0x42, 0xb0,\n                                                              0xf3, 0x1e, 0xe, 0x8b, 0xe7, 0xf7, 0xe, 0xe7,\n                                                              0xf7, 0x38, 0xe7, 0x1, 0xf5, 0xed, 0xf7, 0xb8,\n                                                              0xee, 0x3, 0x8e, 0x16, 0xf7, 0x98, 0x5b, 0xa,\n                                                              0x3d, 0x6, 0xa4, 0xf7, 0xe, 0x5, 0xdd, 0x6,\n                                                              0xd2, 0xfb, 0x2, 0x9d, 0x6a, 0x9b, 0x67, 0x95,\n                                                              0x68, 0x19, 0xf7, 0x22, 0x5b, 0xa, 0x3c, 0x6,\n                                                              0x2e, 0x97, 0xa, 0xf7, 0xa, 0x9d, 0xc9, 0xdf,\n                                                              0xe6, 0x1a, 0xe9, 0x3b, 0xb6, 0x26, 0x1e, 0xfb,\n                                                              0xb5, 0x6, 0x78, 0x2f, 0x8a, 0xa, 0x3b, 0xfc,\n                                                              0xe, 0x5, 0x37, 0x6, 0xf7, 0x77, 0xf7, 0x6a,\n                                                              0x15, 0xad, 0xf7, 0x38, 0x5, 0xf7, 0x18, 0x6,\n                                                              0xa2, 0xc5, 0x83, 0x5b, 0x2c, 0x25, 0x7e, 0x59,\n                                                              0x1f, 0xe, 0x75, 0xe9, 0xf8, 0x34, 0xe9, 0x12,\n                                                              0xeb, 0xf6, 0xf7, 0x81, 0xf4, 0x13, 0xe0, 0x82,\n                                                              0x75, 0x15, 0xf2, 0x6, 0x95, 0xba, 0x5, 0x80,\n                                                              0x9a, 0xdb, 0x67, 0xd2, 0x1b, 0x13, 0x70, 0xf7,\n                                                              0x41, 0xf1, 0xc3, 0xf7, 0x1e, 0xf7, 0x3, 0xfb,\n                                                              0x1c, 0x99, 0x33, 0x9d, 0x1f, 0x4c, 0x98, 0x54,\n                                                              0xac, 0xb4, 0x1a, 0xc7, 0xca, 0xa5, 0xee, 0xb6,\n                                                              0xb1, 0x76, 0x7b, 0xac, 0x1e, 0x13, 0xe0, 0x79,\n                                                              0x33, 0x5, 0xf2, 0x6, 0xb8, 0xf7, 0x6f, 0x5,\n                                                              0x24, 0x6, 0x85, 0x69, 0x5, 0x9b, 0x69, 0x55,\n                                                              0x9d, 0x5f, 0x1b, 0xfb, 0x45, 0x2c, 0x41, 0xfb,\n                                                              0xc, 0x34, 0xf0, 0x4d, 0xea, 0x81, 0x1f, 0xc1,\n                                                              0x84, 0xe9, 0x81, 0x55, 0x1a, 0x58, 0x4c, 0x68,\n                                                              0xfb, 0x0, 0x54, 0x5b, 0xa5, 0xa4, 0x61, 0x1e,\n                                                              0x9a, 0xcf, 0x5, 0x24, 0x6, 0xe, 0x75, 0xe6,\n                                                              0xf8, 0x2b, 0xe6, 0x1, 0xe4, 0xef, 0xf7, 0x6e,\n                                                              0xee, 0x3, 0x82, 0x75, 0x15, 0xec, 0x6, 0x95,\n                                                              0xb9, 0x5, 0x79, 0x9f, 0xbc, 0x6f, 0xd8, 0x1b,\n                                                              0xf7, 0x3a, 0xeb, 0xcb, 0xf7, 0x3, 0xf7, 0x2,\n                                                              0x41, 0xa5, 0x31, 0x98, 0x1f, 0x62, 0x90, 0xfb,\n                                                              0x4, 0x95, 0xcd, 0x1a, 0xb5, 0xcd, 0xbe, 0xe1,\n                                                              0xb2, 0xae, 0x75, 0x7c, 0xaa, 0x1e, 0x7c, 0x36,\n                                                              0x96, 0xa, 0xb5, 0xf7, 0x69, 0x7a, 0xa, 0x84,\n                                                              0x69, 0x5, 0x9a, 0x6b, 0x66, 0x9e, 0x61, 0x1b,\n                                                              0xfb, 0x36, 0x22, 0x3c, 0xfb, 0x13, 0x31, 0xdb,\n                                                              0x65, 0xdb, 0x82, 0x1f, 0xbf, 0x86, 0xf5, 0x83,\n                                                              0x51, 0x1a, 0x59, 0x45, 0x69, 0x35, 0x56, 0x64,\n                                                              0x99, 0xb0, 0x62, 0x1e, 0x97, 0xcb, 0x7a, 0xa,\n                                                              0xf7, 0xb1, 0xf8, 0x3c, 0x48, 0xa, 0xa1, 0xf7,\n                                                              0x57, 0xf7, 0xaa, 0xe2, 0x1, 0xea, 0xf6, 0xf7,\n                                                              0x7d, 0xf4, 0x3, 0xf7, 0x42, 0x2f, 0x15, 0x8e,\n                                                              0x96, 0xa0, 0x8f, 0x9e, 0x1b, 0x94, 0x96, 0x84,\n                                                              0x7f, 0x7e, 0x7c, 0x80, 0x7b, 0x7f, 0x7b, 0x8f,\n                                                              0x96, 0x7a, 0x1f, 0x59, 0x4c, 0x5, 0x6f, 0xab,\n                                                              0xa2, 0x89, 0xa2, 0x1b, 0xd1, 0xd1, 0xb9, 0xdc,\n                                                              0xa4, 0x83, 0xb0, 0x60, 0x95, 0x1f, 0x95, 0xa8,\n                                                              0x5, 0xf7, 0x30, 0x93, 0xe3, 0xc6, 0xee, 0x1a,\n                                                              0xf4, 0x3c, 0xa4, 0x2b, 0x97, 0x1e, 0x5f, 0x90,\n                                                              0xfb, 0xb, 0x94, 0xca, 0x1a, 0xb4, 0xd3, 0xba,\n                                                              0xe6, 0xb4, 0xb1, 0x76, 0x7d, 0xac, 0x1e, 0x7a,\n                                                              0x3b, 0x5, 0xf2, 0x6, 0xb9, 0xf7, 0x5e, 0x5,\n                                                              0x25, 0x6, 0x84, 0x6b, 0x5, 0x99, 0x68, 0x64,\n                                                              0x9d, 0x5e, 0x1b, 0xfb, 0x40, 0xfb, 0x6, 0x40,\n                                                              0xfb, 0xc, 0x35, 0xe0, 0x67, 0xe1, 0x82, 0x1f,\n                                                              0xc2, 0x86, 0xf7, 0x6, 0x83, 0x54, 0x1a, 0x5b,\n                                                              0x40, 0x6b, 0x2f, 0x53, 0x61, 0x98, 0xae, 0x60,\n                                                              0x1e, 0x97, 0xc8, 0x5, 0x25, 0x6, 0x5d, 0xfb,\n                                                              0x58, 0x5, 0xf2, 0x6, 0x96, 0xb6, 0x9c, 0x7e,\n                                                              0xad, 0x78, 0xc0, 0x83, 0x19, 0xe, 0x3a, 0xa,\n                                                              0xc6, 0x16, 0xf7, 0xf3, 0x34, 0xa, 0xfb, 0x12,\n                                                              0x6, 0xd9, 0xf8, 0x10, 0x5, 0xf7, 0x14, 0x6,\n                                                              0x75, 0xfb, 0x5, 0x56, 0xa, 0xb4, 0xf7, 0x60,\n                                                              0x5, 0xfc, 0xbb, 0x6, 0x62, 0xfb, 0x60, 0x96,\n                                                              0xa, 0xa3, 0xf7, 0x5, 0x5, 0xf7, 0x15, 0x6,\n                                                              0x3d, 0x7d, 0xa, 0xfb, 0x15, 0x6, 0xe, 0x8b,\n                                                              0xe6, 0xb4, 0xe5, 0xf7, 0x9, 0xe5, 0xb5, 0xe6,\n                                                              0x1, 0xf7, 0x26, 0xe0, 0xf7, 0xa0, 0xe1, 0x3,\n                                                              0x99, 0x16, 0xf7, 0xd4, 0x6, 0x9c, 0xe6, 0x5,\n                                                              0xfb, 0xc, 0x6, 0x92, 0xb4, 0x5, 0xf7, 0x9,\n                                                              0x6, 0xf7, 0x14, 0xf1, 0xaf, 0xf7, 0x28, 0xe6,\n                                                              0x45, 0xa1, 0x36, 0x1f, 0xfb, 0x1e, 0x6, 0x92,\n                                                              0xb5, 0x5, 0xf7, 0xf, 0x6, 0x9b, 0xe6, 0x5,\n                                                              0xfb, 0xd4, 0x6, 0x7a, 0x30, 0x5, 0xf7, 0x6,\n                                                              0x6, 0x46, 0x7d, 0xa, 0xfb, 0x7, 0x6, 0xf7,\n                                                              0x73, 0xf7, 0x17, 0x15, 0xa1, 0xf7, 0x9, 0x5,\n                                                              0xf7, 0x10, 0x6, 0xaa, 0xcf, 0x8a, 0x60, 0x3c,\n                                                              0x38, 0x91, 0x6c, 0x1f, 0xe, 0x79, 0xe7, 0xf8,\n                                                              0x20, 0xe7, 0x1, 0xd6, 0xea, 0xf7, 0x8a, 0xea,\n                                                              0x3, 0x84, 0xf8, 0x6a, 0x15, 0xdd, 0x6, 0x54,\n                                                              0xfb, 0xa3, 0x5, 0x87, 0x77, 0x88, 0x79, 0x7a,\n                                                              0x1a, 0xfb, 0x1, 0x8c, 0xc2, 0x56, 0xf7, 0x12,\n                                                              0x1b, 0xf7, 0x15, 0xf1, 0xc3, 0xf7, 0x2e, 0xab,\n                                                              0x1f, 0xc0, 0xf7, 0xaa, 0x5c, 0xa, 0x9d, 0xe7,\n                                                              0x5, 0xfb, 0xa0, 0x6, 0x78, 0x2f, 0x5, 0xeb,\n                                                              0x6, 0x57, 0xfb, 0x9b, 0x5, 0x35, 0x7a, 0x6a,\n                                                              0x5c, 0x25, 0x1b, 0x35, 0x7a, 0xaf, 0xb4, 0x8a,\n                                                              0x1f, 0x98, 0x8e, 0x98, 0x8d, 0x98, 0x1e, 0xc4,\n                                                              0xf7, 0xac, 0x5, 0xe9, 0x5b, 0xa, 0xfb, 0xa4,\n                                                              0x6, 0xe, 0x79, 0xa, 0xf7, 0x7e, 0x77, 0x59,\n                                                              0xa, 0xf7, 0x61, 0xf8, 0xf0, 0x15, 0xf7, 0xdc,\n                                                              0xd7, 0x77, 0xf3, 0xfb, 0xd0, 0xfb, 0xd, 0x8f,\n                                                              0xa, 0xfb, 0x5f, 0x25, 0xa, 0xe, 0x79, 0xa,\n                                                              0xf7, 0x7a, 0x77, 0x59, 0xa, 0xf7, 0x3a, 0xf8,\n                                                              0xed, 0x15, 0xf7, 0x41, 0xf5, 0xf7, 0x11, 0x21,\n                                                              0xcd, 0xaf, 0xfb, 0x15, 0xf7, 0x23, 0x5, 0x2c,\n                                                              0x6, 0xfb, 0x55, 0xfb, 0x22, 0x5, 0x31, 0xfb,\n                                                              0x46, 0x25, 0xa, 0xe, 0x79, 0xa, 0xd6, 0xf7,\n                                                              0xf, 0x59, 0xa, 0xf7, 0xf8, 0xf9, 0x5, 0x15,\n                                                              0xf7, 0x1, 0x6, 0xa5, 0xf7, 0xf, 0x86, 0xa,\n                                                              0xfb, 0x62, 0xfb, 0xf, 0x15, 0xf7, 0x2, 0x6,\n                                                              0xa6, 0xf7, 0xf, 0x86, 0xa, 0xfb, 0x47, 0xfb,\n                                                              0xb4, 0x25, 0xa, 0xe, 0x79, 0xa, 0x59, 0xa,\n                                                              0xa2, 0xf8, 0x60, 0x25, 0xa, 0xf7, 0x1a, 0xf7,\n                                                              0x17, 0x15, 0xf7, 0xbb, 0x3e, 0xb0, 0xc5, 0xfb,\n                                                              0xa0, 0xf7, 0xe, 0x5, 0xe, 0xf8, 0x6b, 0xe6,\n                                                              0x1, 0xf7, 0x2b, 0xec, 0xf7, 0x55, 0xe9, 0x3,\n                                                              0xf7, 0x2b, 0x89, 0x15, 0xec, 0x6, 0xf7, 0xb3,\n                                                              0xf8, 0x6d, 0x5, 0xd1, 0x34, 0xa, 0xfb, 0x96,\n                                                              0x36, 0xa, 0xe9, 0x6, 0xfb, 0x6a, 0xfc, 0x0,\n                                                              0x40, 0xf8, 0x0, 0x5, 0xdc, 0x34, 0xa, 0xfb,\n                                                              0x95, 0x36, 0xa, 0xd8, 0x6, 0xe, 0xa0, 0x76,\n                                                              0xf8, 0x5e, 0x77, 0xac, 0xe6, 0x1, 0x93, 0xed,\n                                                              0x3, 0x84, 0x16, 0xdd, 0x6, 0xf7, 0x49, 0xf7,\n                                                              0xc6, 0xc3, 0xfb, 0xc6, 0x5, 0xdd, 0x6, 0xf7,\n                                                              0x39, 0xf8, 0x6b, 0x5, 0xbc, 0x34, 0xa, 0xfb,\n                                                              0x82, 0x36, 0xa, 0xec, 0x6, 0x2e, 0xfb, 0xab,\n                                                              0x59, 0xf7, 0x9e, 0x5, 0x47, 0x6, 0xfb, 0x34,\n                                                              0xfb, 0xa0, 0xa0, 0xf7, 0xad, 0x5, 0xeb, 0x34,\n                                                              0xa, 0xfb, 0x83, 0x36, 0xa, 0xbd, 0x6, 0xe,\n                                                              0x3a, 0xa, 0x65, 0x16, 0xf7, 0x97, 0x34, 0xa,\n                                                              0x3b, 0x6, 0xf7, 0x1b, 0xf7, 0x11, 0xdf, 0xfb,\n                                                              0x11, 0x5, 0x4c, 0x6e, 0xa, 0xf7, 0x89, 0x34,\n                                                              0xa, 0x47, 0x6, 0xfb, 0x11, 0xf7, 0x55, 0xf7,\n                                                              0x4b, 0xf7, 0x4f, 0x5, 0xd1, 0x34, 0xa, 0xfb,\n                                                              0x76, 0x6e, 0xa, 0xba, 0x6, 0xfb, 0x5, 0xfb,\n                                                              0xa, 0x4b, 0xf7, 0xa, 0x5, 0xc2, 0x34, 0xa,\n                                                              0xfb, 0x84, 0x36, 0xa, 0xd2, 0x6, 0xf5, 0xfb,\n                                                              0x4f, 0xfb, 0x62, 0xfb, 0x55, 0x5, 0x47, 0x6,\n                                                              0xe, 0x3a, 0xa, 0x9d, 0x16, 0xf7, 0xf0, 0x42,\n                                                              0xa, 0xfb, 0x10, 0x6, 0xa7, 0xf7, 0x1c, 0xf7,\n                                                              0x68, 0xf7, 0x88, 0x5, 0xdc, 0x42, 0xa, 0xfb,\n                                                              0x83, 0x36, 0xa, 0xc3, 0x6, 0xfb, 0x1e, 0xfb,\n                                                              0x31, 0x41, 0xf7, 0x31, 0x5, 0xc2, 0x34, 0xa,\n                                                              0xfb, 0x85, 0x4b, 0xa, 0xda, 0x6, 0xf7, 0x3,\n                                                              0xfb, 0x88, 0x70, 0xfb, 0x1c, 0x5, 0xfb, 0x11,\n                                                              0x6, 0xe, 0x8b, 0xe5, 0xf8, 0x8, 0xe5, 0x1,\n                                                              0x9c, 0x16, 0xf7, 0xef, 0x6, 0x9f, 0xe5, 0x5,\n                                                              0xfb, 0x11, 0x6, 0xa7, 0xf7, 0x19, 0xf7, 0x69,\n                                                              0xf7, 0x83, 0x5, 0xdc, 0x46, 0xa, 0xfb, 0x84,\n                                                              0x6, 0x79, 0x31, 0x5, 0xc2, 0x6, 0xfb, 0x1f,\n                                                              0xfb, 0x2d, 0x43, 0xf7, 0x2d, 0x5, 0xc1, 0x46,\n                                                              0xa, 0xfb, 0x83, 0x6, 0x79, 0x31, 0x5c, 0xa,\n                                                              0xf7, 0x5, 0xfb, 0x83, 0x6d, 0xfb, 0x19, 0x5,\n                                                              0xfb, 0x10, 0x6, 0xf7, 0x3e, 0xf8, 0x97, 0x15,\n                                                              0xf7, 0xe1, 0xd8, 0x77, 0xf1, 0xfb, 0xd5, 0xfb,\n                                                              0xc, 0x5, 0xe, 0x8b, 0xe3, 0xf8, 0x1b, 0xe8,\n                                                              0xe3, 0xf7, 0x15, 0x12, 0xf7, 0x38, 0xeb, 0x3b,\n                                                              0xf7, 0x2, 0xd1, 0xf7, 0x3, 0x13, 0xf4, 0xa0,\n                                                              0x16, 0xf7, 0xec, 0x6, 0x9d, 0xe8, 0x5, 0xfb,\n                                                              0xf, 0x6, 0xa5, 0xf7, 0x14, 0xf7, 0x69, 0xf7,\n                                                              0x96, 0x5, 0xda, 0x94, 0xa, 0xfb, 0x82, 0x6,\n                                                              0x79, 0x2e, 0x5, 0xc3, 0x6, 0xfb, 0x20, 0xfb,\n                                                              0x3d, 0x45, 0xf7, 0x3d, 0x5, 0xc1, 0x6, 0x9d,\n                                                              0xe8, 0x5, 0xfb, 0x81, 0x82, 0xa, 0xd9, 0x6,\n                                                              0xf7, 0x1, 0xfb, 0x96, 0x71, 0xfb, 0x14, 0x5,\n                                                              0xfb, 0x11, 0x6, 0xf7, 0xd5, 0xf8, 0xcb, 0x92,\n                                                              0xa, 0xa5, 0xf7, 0x15, 0x4c, 0xa, 0x13, 0xec,\n                                                              0xfb, 0x62, 0xfb, 0x15, 0x15, 0xf7, 0x2, 0x6,\n                                                              0xa5, 0xf7, 0x15, 0x86, 0xa, 0xe, 0x3a, 0xa,\n                                                              0xe4, 0xec, 0x3, 0x98, 0x16, 0xf8, 0x74, 0x6,\n                                                              0xbc, 0xf7, 0x70, 0x66, 0xa, 0x6c, 0xfb, 0x15,\n                                                              0x5, 0xfb, 0x8e, 0x6, 0xf8, 0x2e, 0xf8, 0x2a,\n                                                              0x98, 0xcc, 0x5, 0xfc, 0x58, 0x6, 0x5d, 0xfb,\n                                                              0x61, 0x96, 0xa, 0xa7, 0xf7, 0x6, 0x5, 0xf7,\n                                                              0x6e, 0x6, 0xfc, 0x28, 0xfc, 0x25, 0x5, 0xe,\n                                                              0x8b, 0xe4, 0xf8, 0xd, 0xe5, 0x1, 0xd7, 0xea,\n                                                              0xf7, 0x8d, 0xea, 0x3, 0x8c, 0x16, 0xf8, 0x68,\n                                                              0x6, 0xb9, 0xf7, 0x6d, 0x5, 0x2c, 0x6, 0x71,\n                                                              0xfb, 0x14, 0x5, 0xfb, 0x89, 0x6, 0xf8, 0x23,\n                                                              0xf8, 0x27, 0x99, 0xcb, 0x5, 0xfc, 0x4d, 0x6,\n                                                              0x5e, 0xfb, 0x5f, 0x5, 0xea, 0x6, 0xa5, 0xf7,\n                                                              0x5, 0x5, 0xf7, 0x6a, 0x6, 0xfc, 0x20, 0xfc,\n                                                              0x23, 0x5, 0xf7, 0xbd, 0xf8, 0xb3, 0x15, 0xed,\n                                                              0x6, 0xf7, 0x50, 0xf7, 0x23, 0x58, 0xaf, 0xfb,\n                                                              0x42, 0x21, 0xfb, 0x11, 0xf6, 0x46, 0x69, 0x5,\n                                                              0xe, 0x7c, 0xea, 0x35, 0xea, 0xf5, 0xe9, 0xd0,\n                                                              0xeb, 0x12, 0xaf, 0xed, 0xf7, 0xbd, 0xed, 0x13,\n                                                              0x7c, 0xf8, 0x6, 0x85, 0x15, 0xf7, 0x44, 0x6,\n                                                              0x9e, 0xea, 0x5, 0x3a, 0x6, 0xad, 0xf7, 0x3f,\n                                                              0x92, 0xa7, 0x90, 0xaa, 0x8a, 0xa7, 0x19, 0xee,\n                                                              0xfb, 0x1e, 0x93, 0x6f, 0x3d, 0x2c, 0x71, 0x6e,\n                                                              0x42, 0x1e, 0xa0, 0x3a, 0x5, 0xa2, 0xcb, 0xd6,\n                                                              0x9c, 0xc9, 0x1b, 0xa2, 0xd0, 0x8a, 0x61, 0x80,\n                                                              0x89, 0x80, 0x8a, 0x80, 0x1f, 0x8f, 0x67, 0x64,\n                                                              0x8e, 0x65, 0x1b, 0xfb, 0x8c, 0x6c, 0xfb, 0x25,\n                                                              0x68, 0x1f, 0x13, 0xbc, 0x4e, 0xbc, 0x4c, 0xf5,\n                                                              0xdc, 0xb5, 0xa2, 0xae, 0xcc, 0x1e, 0x13, 0x7c,\n                                                              0xa3, 0xf7, 0x5, 0x15, 0x13, 0xbc, 0x5f, 0x51,\n                                                              0x48, 0x6b, 0x47, 0x1b, 0x66, 0x64, 0x96, 0xa4,\n                                                              0xc7, 0xed, 0x9e, 0xbc, 0xc6, 0xb1, 0x85, 0x89,\n                                                              0xab, 0x1f, 0xe, 0x41, 0xa, 0xf7, 0x75, 0x77,\n                                                              0x12, 0xa6, 0xeb, 0x13, 0x7c, 0xf7, 0x87, 0xf8,\n                                                              0x77, 0x15, 0xf7, 0xde, 0xd7, 0x77, 0xf1, 0xfb,\n                                                              0xd4, 0xfb, 0xd, 0x5, 0xf7, 0xe, 0xfc, 0xb3,\n                                                              0x21, 0xa, 0x8b, 0xe5, 0xee, 0xe4, 0xcc, 0xe6,\n                                                              0x1, 0xae, 0xe9, 0xf7, 0x7e, 0xef, 0x3, 0xf7,\n                                                              0x61, 0xf8, 0x73, 0x15, 0xf7, 0x3f, 0xf4, 0xf7,\n                                                              0x10, 0x22, 0xcc, 0xae, 0xfb, 0x14, 0xf7, 0x23,\n                                                              0x66, 0xa, 0xfb, 0x50, 0xfb, 0x22, 0x5, 0xf7,\n                                                              0x67, 0xfc, 0x9a, 0x22, 0xa, 0x3b, 0xa, 0x1f,\n                                                              0xa1, 0xf7, 0x1, 0x15, 0x2c, 0xa, 0xf7, 0x35,\n                                                              0xf7, 0xb2, 0x3, 0xf7, 0x35, 0xf8, 0x90, 0x15,\n                                                              0xf7, 0xb2, 0xca, 0x7a, 0xe5, 0xfb, 0xaa, 0x23,\n                                                              0x5, 0xe, 0x41, 0xa, 0xca, 0xf7, 0x12, 0x12,\n                                                              0xb3, 0xeb, 0x13, 0x7c, 0xf8, 0x35, 0xf8, 0x87,\n                                                              0x15, 0xf7, 0x8, 0x6, 0xa4, 0xf7, 0x12, 0x5,\n                                                              0xfb, 0x8, 0x6, 0xfb, 0x6a, 0xfb, 0x12, 0x15,\n                                                              0xf7, 0x6, 0x6, 0xa6, 0xf7, 0x12, 0x5, 0xfb,\n                                                              0x9, 0x6, 0xf7, 0x8, 0xfd, 0x8, 0x21, 0xa,\n                                                              0x7c, 0xea, 0xe0, 0xeb, 0x39, 0xec, 0xde, 0xea,\n                                                              0x12, 0x13, 0xd0, 0xf7, 0xa4, 0xc5, 0x15, 0x71,\n                                                              0x97, 0xad, 0x5c, 0xe6, 0x1b, 0xc3, 0xbc, 0x99,\n                                                              0xa0, 0xc7, 0x1f, 0x7d, 0xe7, 0x5, 0x74, 0x47,\n                                                              0x64, 0x82, 0x73, 0x1b, 0x36, 0x8b, 0xcb, 0x9e,\n                                                              0x8e, 0x1f, 0x8c, 0x8d, 0x5, 0xf7, 0x89, 0x6,\n                                                              0x98, 0xb2, 0x94, 0xb3, 0xb4, 0x1a, 0xde, 0x6c,\n                                                              0xe1, 0x2b, 0x60, 0x56, 0x78, 0x68, 0x67, 0x1e,\n                                                              0xb1, 0x77, 0x72, 0x9b, 0x47, 0x1b, 0x42, 0x2d,\n                                                              0x66, 0x89, 0x86, 0x1f, 0x94, 0x2d, 0x5, 0x9c,\n                                                              0xba, 0xc0, 0xa0, 0xb7, 0x1b, 0xac, 0x9b, 0x7f,\n                                                              0x6c, 0x81, 0x8a, 0x80, 0x88, 0x7d, 0x1f, 0x89,\n                                                              0x81, 0x5, 0x13, 0xb0, 0x8d, 0x72, 0x79, 0x8e,\n                                                              0x67, 0x1b, 0xfb, 0x14, 0x40, 0x2c, 0x34, 0x1f,\n                                                              0x4d, 0x8c, 0xb7, 0x5c, 0xd6, 0x1b, 0xd3, 0xc4,\n                                                              0xba, 0xa5, 0xb1, 0x1f, 0x13, 0xd0, 0xe7, 0xf7,\n                                                              0x5f, 0x15, 0xc6, 0x9a, 0xba, 0xb2, 0xb4, 0x1b,\n                                                              0xc5, 0x87, 0x3e, 0x76, 0x89, 0x1f, 0xfb, 0xae,\n                                                              0xfb, 0x1e, 0x15, 0x6e, 0x6a, 0x63, 0x7d, 0x63,\n                                                              0x1b, 0x79, 0x78, 0x95, 0xae, 0x1f, 0x13, 0xb0,\n                                                              0x95, 0x9a, 0xb7, 0xe3, 0x96, 0xab, 0x8a, 0x87,\n                                                              0x9a, 0x1e, 0xe, 0x41, 0xa, 0xf7, 0x75, 0x77,\n                                                              0x12, 0xae, 0xeb, 0x13, 0x7c, 0xf7, 0x74, 0xf8,\n                                                              0xc6, 0x15, 0xf7, 0xc4, 0x3b, 0xb0, 0xc5, 0xfb,\n                                                              0xa9, 0xf7, 0xd, 0x5, 0xd6, 0xfd, 0x2c, 0x21,\n                                                              0xa, 0x7c, 0xe9, 0x39, 0xe9, 0xf7, 0x17, 0xe9,\n                                                              0xf7, 0x18, 0xea, 0x12, 0xad, 0xf2, 0x9b, 0xed,\n                                                              0x13, 0x7c, 0xf7, 0xda, 0xb0, 0x15, 0xa0, 0x63,\n                                                              0x5, 0xf7, 0x45, 0x3f, 0xa, 0xfb, 0x19, 0x6,\n                                                              0x7f, 0xa1, 0xa5, 0xa8, 0x9d, 0xbc, 0xa0, 0xaa,\n                                                              0x19, 0xdf, 0x3f, 0xa, 0xfb, 0x2a, 0x6, 0x81,\n                                                              0x74, 0x6c, 0x44, 0x76, 0x71, 0x8, 0x3c, 0xf7,\n                                                              0x22, 0x73, 0xb3, 0xab, 0x1a, 0xa7, 0xab, 0x94,\n                                                              0xa9, 0x8c, 0x1e, 0xb9, 0x8c, 0xc3, 0x74, 0x9c,\n                                                              0x76, 0xd2, 0xd0, 0x18, 0xb1, 0x64, 0x4b, 0xaa,\n                                                              0x4d, 0x1b, 0x2c, 0x31, 0x4c, 0x34, 0x64, 0xa3,\n                                                              0x6c, 0x8f, 0x7d, 0x1f, 0x89, 0x7, 0x39, 0x69,\n                                                              0x4a, 0x3e, 0x34, 0x1a, 0x13, 0xbc, 0x4e, 0xb4,\n                                                              0x4c, 0xf1, 0xda, 0xb5, 0xad, 0x9d, 0xa7, 0x1e,\n                                                              0x62, 0xd9, 0x15, 0x74, 0x72, 0x6b, 0x7e, 0x6c,\n                                                              0x1b, 0x5f, 0x7b, 0xa5, 0xa4, 0xbf, 0xbd, 0xb2,\n                                                              0xaa, 0x9a, 0x1f, 0xe, 0x41, 0xa, 0xf7, 0x4b,\n                                                              0x77, 0x12, 0xb3, 0xeb, 0x13, 0x7c, 0xf7, 0xb1,\n                                                              0xf8, 0xc4, 0x15, 0x5e, 0xb0, 0x68, 0xc0, 0xcd,\n                                                              0xd0, 0xc0, 0xca, 0xb9, 0x65, 0xaf, 0x55, 0x49,\n                                                              0x48, 0x54, 0x4c, 0x1e, 0xcf, 0x91, 0x15, 0xa7,\n                                                              0xa6, 0xa4, 0xa5, 0xa0, 0x9b, 0x7d, 0x79, 0x72,\n                                                              0x70, 0x75, 0x70, 0x77, 0x7b, 0x96, 0x9a, 0x1e,\n                                                              0x9a, 0xfc, 0xcd, 0x21, 0xa, 0xf7, 0xa2, 0xcf,\n                                                              0x1, 0x73, 0xf9, 0x1c, 0x3, 0xf7, 0x3, 0xf7,\n                                                              0x23, 0x15, 0xc9, 0xbf, 0x48, 0xd7, 0xf8, 0x1,\n                                                              0x8a, 0x2c, 0x4b, 0x6a, 0xa, 0x4a, 0x5, 0xfb,\n                                                              0xeb, 0x6, 0xdd, 0xc1, 0x8e, 0xa, 0x9b, 0x76,\n                                                              0xf8, 0xef, 0x77, 0x1, 0xf7, 0x95, 0x86, 0x15,\n                                                              0xf7, 0x5f, 0xf7, 0x36, 0x58, 0xc0, 0x38, 0x40,\n                                                              0xf7, 0xe, 0xf8, 0x5a, 0x44, 0x94, 0xfb, 0xe,\n                                                              0xfc, 0x5f, 0x5a, 0xd4, 0x49, 0x5c, 0x5, 0xe,\n                                                              0xf7, 0x99, 0xd1, 0x1, 0x69, 0xf9, 0x26, 0x3,\n                                                              0xf0, 0xf7, 0x23, 0x15, 0xc9, 0xbf, 0x51, 0xcd,\n                                                              0x5, 0xf8, 0x9b, 0x6, 0x95, 0xd1, 0x5, 0xfc,\n                                                              0x96, 0x6, 0xe9, 0xc8, 0x8e, 0xa, 0xf7, 0x9f,\n                                                              0xd1, 0x1, 0x69, 0xf9, 0x30, 0x3, 0x69, 0xf7,\n                                                              0x9f, 0x15, 0xf8, 0x96, 0x6, 0x2d, 0x4e, 0x6a,\n                                                              0xa, 0x49, 0x5, 0xfc, 0x9b, 0x6, 0xe, 0xa1,\n                                                              0xf8, 0x3b, 0x1, 0xf7, 0x2d, 0xd1, 0x3, 0xf7,\n                                                              0x2d, 0xa1, 0x15, 0xd1, 0x82, 0xf7, 0xe, 0xf8,\n                                                              0x5e, 0xbc, 0x42, 0xcd, 0xba, 0xfb, 0x9, 0xf7,\n                                                              0x3f, 0xfb, 0x5f, 0xfb, 0x37, 0xbe, 0x56, 0xde,\n                                                              0xd6, 0x5, 0xe, 0xf7, 0x8f, 0xf8, 0x1, 0x1,\n                                                              0xf7, 0x0, 0xf8, 0xc, 0x3, 0xf7, 0x0, 0xf7,\n                                                              0x8e, 0x15, 0xd7, 0xb1, 0xd9, 0xdb, 0xca, 0xd8,\n                                                              0xb5, 0x3a, 0xbf, 0x3f, 0xcc, 0x66, 0x93, 0xcb,\n                                                              0x18, 0x41, 0xf7, 0x2, 0x6a, 0xc2, 0x78, 0xf7,\n                                                              0x1c, 0x8, 0x5c, 0x6, 0x5b, 0xfb, 0x15, 0x56,\n                                                              0x46, 0x25, 0x23, 0x8, 0xe, 0xf7, 0x3a, 0xf2,\n                                                              0x2c, 0x76, 0xde, 0xf3, 0x9b, 0x77, 0x12, 0xcc,\n                                                              0xf8, 0x69, 0x13, 0x68, 0xf7, 0xc, 0xf7, 0x2d,\n                                                              0x15, 0xab, 0xa3, 0xa7, 0xbe, 0xb4, 0x1b, 0x9a,\n                                                              0xaa, 0x76, 0x7a, 0xae, 0x1f, 0x7f, 0xa3, 0xa5,\n                                                              0x81, 0xa4, 0x1b, 0xb6, 0xd2, 0xad, 0xdf, 0xbe,\n                                                              0x1f, 0x13, 0x98, 0x58, 0xc9, 0x5, 0x75, 0x7c,\n                                                              0x65, 0x54, 0x61, 0x1b, 0x74, 0x73, 0x96, 0x98,\n                                                              0x73, 0x1f, 0x13, 0x68, 0x9c, 0x6b, 0x6c, 0x9f,\n                                                              0x71, 0x1b, 0x44, 0x59, 0x48, 0x55, 0x61, 0x1f,\n                                                              0xe, 0xf7, 0x4e, 0xf0, 0x3, 0xf7, 0x4e, 0xf7,\n                                                              0x6f, 0x15, 0xf0, 0xf7, 0x7, 0xbd, 0xfb, 0x6,\n                                                              0xec, 0xc7, 0x52, 0xf3, 0xf7, 0x18, 0xad, 0x7c,\n                                                              0xee, 0xfb, 0x1d, 0x56, 0xb0, 0xf7, 0x1d, 0x4c,\n                                                              0xa, 0x78, 0xfb, 0x19, 0xfb, 0xb, 0xbc, 0x55,\n                                                              0x27, 0xf7, 0x16, 0x6a, 0x20, 0x22, 0x5, 0xe,\n                                                              0x79, 0xd3, 0xd2, 0xd4, 0xf7, 0x3b, 0xd5, 0xd2,\n                                                              0xd0, 0x1, 0x91, 0xe1, 0xc6, 0xd2, 0xf7, 0xb4,\n                                                              0xdb, 0x3, 0xf7, 0xcf, 0xf7, 0x3b, 0x15, 0x6a,\n                                                              0x9b, 0xad, 0x82, 0x9d, 0x1b, 0xf7, 0x0, 0xee,\n                                                              0xf7, 0x1c, 0xf7, 0xe, 0xf7, 0x16, 0x25, 0xcd,\n                                                              0xfb, 0x10, 0xfb, 0x3b, 0xfb, 0x53, 0xfb, 0x22,\n                                                              0xfb, 0x75, 0x22, 0xb6, 0xfb, 0x11, 0xf7, 0x50,\n                                                              0xf7, 0x13, 0xdf, 0xc4, 0xa4, 0xb5, 0x1f, 0x7d,\n                                                              0xcf, 0x5, 0x54, 0x32, 0x47, 0x74, 0x3f, 0x1b,\n                                                              0xfb, 0xb, 0x6b, 0xdd, 0xd8, 0xe5, 0xd6, 0xf7,\n                                                              0x63, 0xf7, 0x4b, 0xf2, 0xc4, 0x55, 0x39, 0x3a,\n                                                              0x54, 0x2c, 0x59, 0x7d, 0x79, 0x91, 0xa3, 0x8f,\n                                                              0x1f, 0x8c, 0x90, 0x8c, 0x8f, 0x8e, 0x91, 0xe2,\n                                                              0xf7, 0x48, 0x18, 0x46, 0x6, 0x82, 0x79, 0x5,\n                                                              0xa3, 0x78, 0x7e, 0x8b, 0x7d, 0x1b, 0x25, 0x2f,\n                                                              0xfb, 0x1d, 0x30, 0x51, 0xb1, 0x79, 0xa8, 0xac,\n                                                              0xaf, 0x9c, 0xa4, 0xa7, 0x1f, 0xa8, 0xf7, 0x3a,\n                                                              0x15, 0x70, 0x85, 0x62, 0xfb, 0x0, 0x4f, 0x1b,\n                                                              0x80, 0x87, 0x93, 0x97, 0xc5, 0xd1, 0xe4, 0xab,\n                                                              0xa3, 0x88, 0x74, 0x82, 0x8a, 0x1f, 0xe, 0x41,\n                                                              0xa, 0xf7, 0x1e, 0x77, 0xdd, 0x77, 0x12, 0x95,\n                                                              0xeb, 0x13, 0x7e, 0xf7, 0x12, 0xf8, 0x95, 0x15,\n                                                              0xdb, 0x71, 0x9a, 0x9f, 0x94, 0xa2, 0xa3, 0x98,\n                                                              0x19, 0xa3, 0x98, 0xa9, 0x7a, 0xaa, 0x79, 0x8,\n                                                              0x7c, 0xa6, 0xa7, 0x7b, 0xa4, 0x1b, 0xf0, 0xbf,\n                                                              0xe3, 0xad, 0x9d, 0x1f, 0x39, 0xa3, 0x5, 0x62,\n                                                              0x70, 0x7d, 0x76, 0x6f, 0x1b, 0x79, 0x79, 0x94,\n                                                              0x97, 0x78, 0x1f, 0x9c, 0x6f, 0x6f, 0xa1, 0x6b,\n                                                              0x1b, 0x29, 0x5c, 0x3d, 0x60, 0x72, 0x1f, 0xf7,\n                                                              0x68, 0xfc, 0x98, 0x22, 0xa, 0x1f, 0x13, 0xbe,\n                                                              0x3b, 0xa, 0x1e, 0x13, 0x7e, 0xa1, 0xf7, 0x1,\n                                                              0x15, 0x13, 0xbe, 0x2c, 0xa, 0x7c, 0xe8, 0x3a,\n                                                              0xe9, 0xf7, 0x9d, 0xe9, 0xdd, 0xe9, 0x12, 0xf8,\n                                                              0x94, 0xef, 0x13, 0x78, 0x80, 0x88, 0x15, 0xf7,\n                                                              0x47, 0x6, 0x94, 0xbb, 0x5, 0x13, 0xb8, 0x70,\n                                                              0xad, 0xb2, 0x6a, 0xd7, 0x1b, 0xf7, 0x5a, 0xe3,\n                                                              0xf7, 0x18, 0xf7, 0x1e, 0xf3, 0x42, 0xe6, 0xfb,\n                                                              0x14, 0x53, 0x54, 0x84, 0x69, 0x5b, 0x1f, 0xb8,\n                                                              0xf7, 0x6d, 0x5, 0xfb, 0x49, 0x44, 0xa, 0xdd,\n                                                              0x6, 0x13, 0x78, 0x32, 0xfc, 0x4d, 0x5, 0x3a,\n                                                              0x6, 0xf7, 0x5b, 0xef, 0x15, 0xe6, 0xc7, 0xd5,\n                                                              0xf7, 0xd, 0xe8, 0xa9, 0x48, 0x58, 0x1e, 0x13,\n                                                              0xb8, 0x35, 0x2d, 0x41, 0x34, 0x63, 0x38, 0xa5,\n                                                              0xe2, 0x1e, 0xe, 0xfb, 0x1d, 0xf9, 0x8f, 0x1,\n                                                              0xf7, 0x37, 0xf7, 0xa5, 0x3, 0xf7, 0xfe, 0xfb,\n                                                              0x1d, 0x15, 0xd5, 0xa8, 0xfb, 0x5b, 0xf9, 0x72,\n                                                              0x41, 0x6e, 0x5, 0xe, 0xfb, 0x73, 0x76, 0xfa,\n                                                              0x7c, 0x77, 0x1, 0xf7, 0x1a, 0xe3, 0x3, 0xf7,\n                                                              0x1a, 0xfb, 0x88, 0x15, 0xe3, 0x6, 0xf7, 0x88,\n                                                              0xfa, 0x7c, 0x5, 0x33, 0x6, 0xe, 0xf7, 0x34,\n                                                              0xdc, 0x3, 0xd5, 0xf7, 0x71, 0x15, 0xdc, 0x7f,\n                                                              0x95, 0x60, 0x61, 0x1a, 0x85, 0x80, 0x45, 0x74,\n                                                              0xfb, 0x19, 0x1e, 0x83, 0x5c, 0x97, 0x52, 0xbd,\n                                                              0x76, 0x8, 0x79, 0xb6, 0xc7, 0x8b, 0xbc, 0x1b,\n                                                              0x9d, 0xe8, 0x5, 0x64, 0x63, 0x8b, 0x95, 0x6b,\n                                                              0x1f, 0x76, 0x92, 0x89, 0xa4, 0x8f, 0xa2, 0x9e,\n                                                              0xf7, 0x9, 0x95, 0xcb, 0x8c, 0x96, 0x8, 0x8c,\n                                                              0x97, 0x8b, 0x93, 0x90, 0x1a, 0xb3, 0x74, 0xc3,\n                                                              0x63, 0xa5, 0x1e, 0xd0, 0xae, 0xbd, 0xdd, 0x98,\n                                                              0xd3, 0xa7, 0xf7, 0x28, 0x18, 0x8f, 0xa2, 0x96,\n                                                              0xa5, 0xa3, 0x91, 0x8, 0x95, 0xb2, 0xaf, 0x8b,\n                                                              0xb2, 0x1b, 0x9e, 0xe8, 0x5, 0x5a, 0x51, 0x8b,\n                                                              0x79, 0x57, 0x1f, 0x52, 0x77, 0x67, 0x51, 0x83,\n                                                              0x5c, 0x75, 0xfb, 0x9, 0x18, 0x76, 0xfb, 0x0,\n                                                              0x77, 0x4a, 0xfb, 0x3, 0x7b, 0x8, 0xe, 0xf8,\n                                                              0x2, 0xda, 0x3, 0xd5, 0xfb, 0x78, 0x15, 0xbc,\n                                                              0xc5, 0x8b, 0x9d, 0xbf, 0x1f, 0xc4, 0x9f, 0xaf,\n                                                              0xc5, 0x93, 0xba, 0xa1, 0xf7, 0x9, 0x18, 0xa0,\n                                                              0xf7, 0x0, 0x9f, 0xcc, 0xf7, 0x3, 0x9b, 0x9c,\n                                                              0xe9, 0x18, 0x3a, 0x97, 0x81, 0xb6, 0xb5, 0x1a,\n                                                              0x91, 0x96, 0xd1, 0xa2, 0xf7, 0x19, 0x1e, 0x93,\n                                                              0xba, 0x7f, 0xc4, 0x59, 0xa0, 0x8, 0x9d, 0x60,\n                                                              0x4f, 0x8b, 0x5a, 0x1b, 0x79, 0x2e, 0x5, 0xb2,\n                                                              0xb3, 0x8b, 0x81, 0xab, 0x1f, 0xa0, 0x84, 0x8d,\n                                                              0x72, 0x87, 0x74, 0x78, 0xfb, 0x9, 0x81, 0x4b,\n                                                              0x8a, 0x7f, 0x8, 0x8a, 0x80, 0x8b, 0x83, 0x86,\n                                                              0x1a, 0x63, 0xa2, 0x53, 0xb3, 0x71, 0x1e, 0x46,\n                                                              0x68, 0x59, 0x39, 0x7e, 0x43, 0x6f, 0xfb, 0x28,\n                                                              0x18, 0x87, 0x74, 0x80, 0x71, 0x73, 0x85, 0x8,\n                                                              0x81, 0x64, 0x67, 0x8b, 0x64, 0x1b, 0xe, 0x25,\n                                                              0xe7, 0xf8, 0xaa, 0xe7, 0x1, 0xf7, 0x0, 0x25,\n                                                              0x15, 0xf7, 0x7c, 0x6, 0x9f, 0xe7, 0x5, 0xfb,\n                                                              0x1b, 0x6, 0xf7, 0x5, 0xf8, 0xaa, 0x5, 0xf7,\n                                                              0x1a, 0x5b, 0xa, 0xfb, 0x7c, 0x6, 0xe, 0x25,\n                                                              0xe7, 0xf8, 0xaa, 0xe7, 0x1, 0xf7, 0x13, 0x81,\n                                                              0x15, 0x78, 0x2f, 0x5, 0xf7, 0x7b, 0x6, 0xf7,\n                                                              0x2c, 0xf9, 0x62, 0x5, 0xfb, 0x7c, 0x6, 0x77,\n                                                              0x2f, 0x5, 0xf7, 0x1b, 0x6, 0xfb, 0x6, 0xfc,\n                                                              0xaa, 0x5, 0xe, 0xf8, 0x68, 0xd5, 0x1, 0xdf,\n                                                              0xf9, 0xb, 0x15, 0x44, 0xb7, 0x2f, 0xf7, 0x22,\n                                                              0xf7, 0x31, 0xd3, 0xf7, 0x5, 0xbd, 0x9d, 0x1e,\n                                                              0x2f, 0x6, 0x3d, 0x64, 0x41, 0x80, 0x70, 0x1b,\n                                                              0x3c, 0x71, 0xc0, 0xaf, 0x8a, 0x1f, 0xe, 0xfb,\n                                                              0x2e, 0x76, 0xf9, 0xe6, 0x77, 0x1, 0xf7, 0x39,\n                                                              0xc6, 0xf7, 0x2c, 0xc6, 0x3, 0xf7, 0xac, 0xf7,\n                                                              0xb0, 0x15, 0xc6, 0x6, 0xeb, 0xf8, 0x1b, 0x5,\n                                                              0x50, 0x6, 0xfb, 0x67, 0xfd, 0xe6, 0x15, 0xc6,\n                                                              0x6, 0xed, 0xf8, 0x1a, 0x5, 0x50, 0x6, 0xe,\n                                                              0xf7, 0x18, 0xf7, 0xbe, 0x1, 0xf7, 0x1d, 0xf7,\n                                                              0xd9, 0x3, 0xf7, 0x1d, 0xf7, 0x8c, 0x15, 0x48,\n                                                              0xbf, 0x5a, 0xd8, 0xed, 0xed, 0xdb, 0xeb, 0xd1,\n                                                              0x57, 0xbf, 0x3c, 0x23, 0x31, 0x38, 0x28, 0x1e,\n                                                              0xe, 0x7c, 0xea, 0xf7, 0xb0, 0xea, 0x1, 0xae,\n                                                              0xf2, 0x3, 0xf8, 0x89, 0xf7, 0x2e, 0x15, 0x62,\n                                                              0x46, 0x4c, 0x6a, 0x38, 0x1b, 0x3e, 0x44, 0xb0,\n                                                              0xd5, 0xee, 0xe5, 0xd5, 0xf7, 0xd, 0xb3, 0xb3,\n                                                              0x80, 0x7c, 0xab, 0x1f, 0x77, 0x30, 0x5, 0xef,\n                                                              0x6, 0xb7, 0xf7, 0x68, 0x7b, 0xa, 0x86, 0x78,\n                                                              0x5, 0x98, 0x69, 0x65, 0x91, 0x62, 0x1b, 0xfb,\n                                                              0x64, 0xfb, 0x11, 0xfb, 0x27, 0xfb, 0x20, 0xfb,\n                                                              0xc, 0xf4, 0x48, 0xf7, 0xa, 0xf0, 0xf0, 0xb3,\n                                                              0xc3, 0xdf, 0x1f, 0xe, 0xf7, 0x79, 0xe6, 0x3,\n                                                              0xf7, 0x79, 0xf8, 0x81, 0x15, 0xe6, 0x6, 0xf7,\n                                                              0x45, 0xf7, 0x1e, 0x5b, 0xaf, 0xfb, 0x36, 0x25,\n                                                              0xfb, 0xc, 0xf1, 0x4b, 0x68, 0x5, 0xe, 0xfb,\n                                                              0x4d, 0x76, 0xf7, 0x58, 0xe8, 0xf7, 0xae, 0xe9,\n                                                              0x1, 0xa4, 0xf1, 0x3, 0xf7, 0x23, 0xfb, 0x46,\n                                                              0x15, 0x7b, 0x9e, 0xa6, 0x7f, 0xac, 0x1b, 0xd3,\n                                                              0xc0, 0xc2, 0xc5, 0xa5, 0x85, 0xac, 0x62, 0x95,\n                                                              0x1f, 0x8f, 0x9c, 0xdd, 0x98, 0xda, 0xad, 0xcf,\n                                                              0xb7, 0x19, 0x60, 0xd4, 0x5, 0x61, 0x46, 0x4c,\n                                                              0x6b, 0x38, 0x1b, 0x3f, 0x43, 0xaf, 0xd2, 0xee,\n                                                              0xe4, 0xd7, 0xf7, 0xe, 0xb5, 0xb2, 0x81, 0x7b,\n                                                              0xaa, 0x1f, 0x77, 0x31, 0x5, 0xef, 0x6, 0xb8,\n                                                              0xf7, 0x66, 0x5, 0x27, 0x6, 0x87, 0x78, 0x5,\n                                                              0x98, 0x69, 0x64, 0x91, 0x62, 0x1b, 0xfb, 0x62,\n                                                              0xfb, 0x12, 0xfb, 0x26, 0xfb, 0x1d, 0xfb, 0x4,\n                                                              0xe4, 0x4a, 0xf6, 0x82, 0x1f, 0x70, 0x31, 0x5,\n                                                              0x8c, 0x95, 0x9f, 0x91, 0x9c, 0x1b, 0x96, 0x95,\n                                                              0x87, 0x7d, 0x7c, 0x79, 0x83, 0x79, 0x7b, 0x7b,\n                                                              0x91, 0x93, 0x83, 0x1f, 0xe, 0xfb, 0x62, 0xd1,\n                                                              0xb4, 0xea, 0x1, 0xf7, 0xae, 0xd9, 0x3, 0xf7,\n                                                              0x5d, 0xfb, 0x46, 0x15, 0x79, 0xa1, 0xa3, 0x81,\n                                                              0xa9, 0x1b, 0xce, 0xc2, 0xc0, 0xca, 0xb8, 0x6b,\n                                                              0x9a, 0x80, 0x8f, 0x1f, 0x8f, 0xa5, 0x5, 0x3d,\n                                                              0x6, 0x6b, 0x24, 0x5, 0x8d, 0x94, 0xa4, 0x91,\n                                                              0x9c, 0x1b, 0x95, 0x92, 0x86, 0x81, 0x78, 0x78,\n                                                              0x84, 0x75, 0x7e, 0x7f, 0x91, 0x93, 0x84, 0x1f,\n                                                              0xe, 0x6f, 0x76, 0xf7, 0xfd, 0xf7, 0x4e, 0xf7,\n                                                              0x8, 0x77, 0x1, 0xc5, 0xf0, 0x3, 0xf7, 0x43,\n                                                              0x5a, 0x15, 0xed, 0x6, 0xa5, 0xf7, 0x1d, 0xd1,\n                                                              0x95, 0xcc, 0xa4, 0xca, 0xb2, 0x19, 0x6c, 0xd3,\n                                                              0x5, 0x60, 0x37, 0x5b, 0x72, 0x49, 0x1b, 0x33,\n                                                              0x76, 0xc1, 0xb0, 0xd6, 0xd2, 0xd3, 0xe6, 0xaf,\n                                                              0xae, 0x80, 0x7c, 0xa8, 0x1f, 0x7c, 0x49, 0x96,\n                                                              0xa, 0xb1, 0xf7, 0x4e, 0x7a, 0xa, 0x85, 0x6c,\n                                                              0x78, 0x91, 0x76, 0x90, 0x78, 0x8e, 0x19, 0xa6,\n                                                              0xf7, 0x19, 0x66, 0xa, 0x70, 0xfb, 0x18, 0x5,\n                                                              0xfb, 0x23, 0x6c, 0x39, 0x2b, 0xfb, 0x9, 0x1a,\n                                                              0xfb, 0x0, 0xf2, 0x6e, 0xb5, 0x7f, 0x1e, 0xe,\n                                                              0xf7, 0xaf, 0xe7, 0x3, 0xf7, 0x2d, 0xf8, 0x77,\n                                                              0x15, 0xf7, 0x37, 0xf2, 0xf7, 0xa, 0x24, 0xca,\n                                                              0xad, 0xfb, 0xe, 0x97, 0xa, 0x2f, 0x6, 0xfb,\n                                                              0x48, 0xfb, 0x1f, 0x5, 0xe, 0x7c, 0xf7, 0x41,\n                                                              0xe9, 0xf7, 0x41, 0x1, 0xf7, 0x6f, 0xf7, 0xd4,\n                                                              0x15, 0x6e, 0xa3, 0x64, 0xd0, 0xcf, 0xc3, 0xbc,\n                                                              0xc8, 0xac, 0x6c, 0xa9, 0x51, 0x48, 0x4e, 0x56,\n                                                              0x57, 0x1e, 0x53, 0xfb, 0x9e, 0x15, 0x6e, 0xa4,\n                                                              0x63, 0xd0, 0xc8, 0xbf, 0xb3, 0xb9, 0x96, 0x1e,\n                                                              0x8c, 0x90, 0x8b, 0x91, 0x90, 0x1a, 0xaf, 0x70,\n                                                              0xae, 0x4c, 0x4a, 0x4b, 0x58, 0x56, 0x1e, 0xe,\n                                                              0xfb, 0x3, 0xf7, 0xb5, 0x1, 0xf7, 0x1a, 0xf7,\n                                                              0x13, 0xac, 0xf7, 0x3f, 0x3, 0xf7, 0x1a, 0xfb,\n                                                              0x3, 0x15, 0xf7, 0x13, 0x6, 0xf7, 0x60, 0xf7,\n                                                              0xb5, 0x5, 0xfb, 0x3f, 0x6, 0xe, 0x79, 0xb8,\n                                                              0xe9, 0xb9, 0xf7, 0x8c, 0xb9, 0xd5, 0xb8, 0x1,\n                                                              0x84, 0xb9, 0xf7, 0x2, 0xb9, 0xf8, 0x1, 0xba,\n                                                              0x3, 0x84, 0xf7, 0x6d, 0x15, 0xfb, 0x18, 0xf6,\n                                                              0x24, 0xf7, 0x21, 0xf7, 0x78, 0xf7, 0x1e, 0xf7,\n                                                              0x44, 0xf7, 0x48, 0xf7, 0x1d, 0x25, 0xf4, 0xfb,\n                                                              0x24, 0xfb, 0x4d, 0xfb, 0x4b, 0xfb, 0x1c, 0xfb,\n                                                              0x77, 0x1e, 0xb9, 0x9c, 0x15, 0xf7, 0x35, 0xf7,\n                                                              0x2f, 0xf7, 0x20, 0xf7, 0x30, 0xf7, 0x13, 0xde,\n                                                              0x30, 0xfb, 0xc, 0xfb, 0x32, 0xfb, 0x28, 0xfb,\n                                                              0x1f, 0xfb, 0x35, 0xfb, 0x11, 0x34, 0xe5, 0xf7,\n                                                              0x9, 0x1e, 0xf7, 0xfd, 0x77, 0x15, 0x72, 0x6f,\n                                                              0x62, 0x75, 0x63, 0x1b, 0x4e, 0x69, 0xb8, 0xc3,\n                                                              0x8a, 0x1f, 0xd6, 0xd4, 0xd3, 0xd2, 0xae, 0xaf,\n                                                              0x7a, 0x76, 0x9d, 0x1e, 0xae, 0xab, 0x5, 0xa9,\n                                                              0x72, 0x61, 0xa1, 0x5d, 0x1b, 0x2b, 0x22, 0x36,\n                                                              0xfb, 0x9, 0x42, 0xbb, 0x4a, 0xe4, 0xcc, 0xc7,\n                                                              0xaf, 0x9e, 0x9f, 0x1f, 0xe, 0xce, 0xe4, 0x35,\n                                                              0x76, 0xf7, 0xfd, 0xe3, 0x9e, 0x77, 0x12, 0xd7,\n                                                              0xe7, 0xf7, 0x9e, 0xe7, 0x13, 0x6c, 0x9c, 0xf5,\n                                                              0x15, 0xbe, 0x52, 0xd2, 0xc4, 0x5, 0x13, 0xac,\n                                                              0x6f, 0xac, 0xb7, 0x80, 0xb9, 0x1b, 0xb8, 0xba,\n                                                              0x9a, 0xa4, 0xaf, 0x1f, 0x13, 0x5c, 0xbe, 0x51,\n                                                              0xd2, 0xc6, 0x58, 0xc5, 0x5, 0xb2, 0xb2, 0xa5,\n                                                              0xc7, 0xc4, 0x1a, 0xa7, 0x86, 0xa7, 0x7f, 0xa3,\n                                                              0x1e, 0xd5, 0xc5, 0x5e, 0xc4, 0x40, 0x50, 0x5,\n                                                              0x13, 0xac, 0xa7, 0x6b, 0x5f, 0x97, 0x5e, 0x1b,\n                                                              0x5c, 0x5a, 0x7d, 0x73, 0x67, 0x1f, 0x13, 0x9c,\n                                                              0x5a, 0xc4, 0x43, 0x50, 0xbd, 0x51, 0x5, 0x67,\n                                                              0x63, 0x70, 0x51, 0x53, 0x1a, 0x6e, 0x8f, 0x70,\n                                                              0x98, 0x72, 0x1e, 0xd6, 0xec, 0x15, 0x13, 0xac,\n                                                              0xda, 0xdc, 0xd0, 0xd8, 0xcb, 0xb7, 0x5d, 0x50,\n                                                              0x3b, 0x3a, 0x46, 0x3d, 0x4b, 0x60, 0xb9, 0xc7,\n                                                              0x1e, 0xe, 0x7c, 0xe9, 0x39, 0xe9, 0xf7, 0x7f,\n                                                              0xe9, 0xf7, 0x4, 0xe9, 0x12, 0x9d, 0xef, 0x13,\n                                                              0x78, 0xf8, 0xe, 0x88, 0x15, 0xf7, 0x46, 0x3f,\n                                                              0xa, 0x3c, 0x6, 0xf4, 0xf8, 0xab, 0x5, 0xfb,\n                                                              0x73, 0x87, 0xa, 0xf7, 0x11, 0x6, 0x70, 0xfb,\n                                                              0x1c, 0x5, 0xac, 0x6a, 0x53, 0x91, 0x53, 0x1b,\n                                                              0xfb, 0x32, 0xfb, 0x1d, 0xfb, 0x16, 0xfb, 0x24,\n                                                              0x1f, 0x13, 0xb8, 0x24, 0xde, 0x42, 0xf7, 0x13,\n                                                              0xc1, 0xc6, 0xa5, 0xab, 0xba, 0x1e, 0x13, 0x78,\n                                                              0xfb, 0xa2, 0xf7, 0x20, 0x15, 0xe6, 0xe3, 0xce,\n                                                              0xea, 0xd9, 0xba, 0x68, 0x52, 0x1e, 0x13, 0xb8,\n                                                              0xfb, 0x18, 0xfb, 0x1e, 0x65, 0x5f, 0x44, 0x54,\n                                                              0xb1, 0xcd, 0x1e, 0xe, 0xf7, 0xcf, 0xed, 0xf7,\n                                                              0x3b, 0x77, 0x1, 0xf7, 0x3a, 0xee, 0x3, 0xf7,\n                                                              0x3a, 0x45, 0x15, 0xee, 0x6, 0xd6, 0xf8, 0x15,\n                                                              0x5, 0xf7, 0x26, 0x6, 0x9e, 0xed, 0x5, 0xfb,\n                                                              0x26, 0x6, 0xad, 0xf7, 0x3b, 0x7b, 0xa, 0x69,\n                                                              0xfb, 0x3b, 0x5, 0xfb, 0x26, 0x6, 0x78, 0x29,\n                                                              0x5, 0xf7, 0x25, 0x6, 0xe, 0xf7, 0x4, 0xee,\n                                                              0xf7, 0x9, 0xec, 0xf7, 0x2f, 0x77, 0x1, 0xf7,\n                                                              0x4b, 0xf0, 0x3, 0xcf, 0xf7, 0xe, 0x15, 0xf7,\n                                                              0x2e, 0x6, 0x64, 0xfb, 0x54, 0x5, 0xf0, 0x6,\n                                                              0xaf, 0xf7, 0x54, 0x70, 0xa, 0x9f, 0xee, 0x85,\n                                                              0xa, 0xa3, 0xf6, 0x70, 0xa, 0x9f, 0xec, 0x85,\n                                                              0xa, 0xa9, 0xf7, 0x2f, 0x66, 0xa, 0x68, 0xfb,\n                                                              0x2f, 0x5, 0xfb, 0x2a, 0x6, 0x77, 0x2a, 0x5,\n                                                              0xf7, 0x2a, 0x6, 0x77, 0x20, 0x5, 0xfb, 0x2e,\n                                                              0x6, 0xe, 0xf7, 0x87, 0xe6, 0xf7, 0x53, 0xe6,\n                                                              0x1, 0xf1, 0xed, 0xf7, 0x5e, 0xeb, 0x3, 0xf1,\n                                                              0xf8, 0x15, 0x15, 0x39, 0xcf, 0x4f, 0xe8, 0xf7,\n                                                              0x21, 0xe9, 0xf4, 0xf7, 0xd, 0xe2, 0x4a, 0xc7,\n                                                              0x2d, 0xfb, 0xa, 0xfb, 0xb, 0x2d, 0xfb, 0x1d,\n                                                              0x1e, 0xed, 0xa1, 0x15, 0xcc, 0xc1, 0xc0, 0xcd,\n                                                              0xbf, 0xa9, 0x6a, 0x5e, 0x4e, 0x51, 0x57, 0x4d,\n                                                              0x5a, 0x6a, 0xab, 0xb4, 0x1e, 0xe, 0xf8, 0x79,\n                                                              0xf7, 0x20, 0x1, 0xf7, 0x12, 0xf7, 0xe, 0xd8,\n                                                              0xf7, 0xf, 0x3, 0xf7, 0xd9, 0xf8, 0x79, 0x15,\n                                                              0xf7, 0xf, 0x6, 0xa5, 0x97, 0xa, 0xfb, 0xe,\n                                                              0x6, 0xfb, 0x76, 0xfb, 0x20, 0x15, 0xf7, 0xe,\n                                                              0x6, 0xa6, 0x97, 0xa, 0xfb, 0xf, 0x6, 0xe,\n                                                              0x9b, 0xf7, 0x2b, 0xaf, 0xf7, 0x2, 0xaf, 0xf7,\n                                                              0x2b, 0x12, 0xf7, 0x57, 0xf7, 0x23, 0x4d, 0xf7,\n                                                              0x23, 0x14, 0xe0, 0x13, 0xe8, 0xf7, 0xa8, 0xf8,\n                                                              0x29, 0x4f, 0xa, 0xfb, 0x6d, 0xfb, 0x5e, 0x73,\n                                                              0xa, 0x13, 0xf0, 0xf7, 0x9, 0xfb, 0x85, 0x4f,\n                                                              0xa, 0xe, 0x22, 0x76, 0xf7, 0x8, 0xf7, 0x4a,\n                                                              0xf7, 0x75, 0xf7, 0x49, 0x20, 0xe9, 0x2d, 0xf7,\n                                                              0x57, 0x12, 0xf7, 0x4, 0xf5, 0xf7, 0x4e, 0xf0,\n                                                              0x13, 0xce, 0xa8, 0x81, 0x15, 0xf0, 0x6, 0x93,\n                                                              0xbe, 0x5, 0x7b, 0x9c, 0xa4, 0x85, 0xa0, 0x1b,\n                                                              0x6e, 0xfb, 0x25, 0x5, 0xf0, 0x6, 0xa9, 0xf7,\n                                                              0x24, 0x5, 0xd5, 0x8c, 0xf7, 0x14, 0xbb, 0xf7,\n                                                              0x1f, 0x1a, 0xda, 0x31, 0xa1, 0x31, 0xa5, 0x1e,\n                                                              0x68, 0x94, 0x43, 0x9f, 0xb1, 0x1a, 0xcf, 0xe0,\n                                                              0x8e, 0xb1, 0xb0, 0xa5, 0x82, 0x71, 0xb1, 0x1e,\n                                                              0x13, 0xe6, 0x83, 0x64, 0x5, 0xee, 0x6, 0xb1,\n                                                              0xf7, 0x49, 0x5, 0x27, 0x6, 0x83, 0x62, 0x80,\n                                                              0x9e, 0x79, 0x90, 0x79, 0x8e, 0x19, 0x13, 0xce,\n                                                              0xa1, 0xf1, 0x5, 0x24, 0x6, 0x13, 0xd6, 0x77,\n                                                              0x26, 0x5, 0x3c, 0x8a, 0xfb, 0x10, 0x54, 0xfb,\n                                                              0x11, 0x1a, 0x8a, 0x3c, 0xd7, 0x6c, 0xf3, 0x6d,\n                                                              0x8, 0xb1, 0x81, 0xd6, 0x82, 0x56, 0x1a, 0x56,\n                                                              0xfb, 0x6, 0x86, 0x6f, 0x65, 0x69, 0x93, 0xa2,\n                                                              0x6c, 0x1e, 0x93, 0xa6, 0x5, 0x26, 0x6, 0xe,\n                                                              0xf8, 0x79, 0xf7, 0x20, 0x1, 0xf7, 0x78, 0xf7,\n                                                              0x9, 0x3, 0xf7, 0x78, 0xf8, 0x79, 0x15, 0xf7,\n                                                              0x9, 0x6, 0xa6, 0x97, 0xa, 0xfb, 0x9, 0x6,\n                                                              0xe, 0x7f, 0xa, 0xcd, 0xf8, 0x55, 0x3, 0xcd,\n                                                              0x16, 0xf8, 0x55, 0x6, 0x9e, 0xe9, 0x3e, 0xa,\n                                                              0xd1, 0xf7, 0xed, 0x5, 0xfb, 0x80, 0x6f, 0xa,\n                                                              0xf7, 0x1e, 0x6, 0x58, 0xfb, 0x8f, 0x43, 0xa,\n                                                              0x7c, 0xea, 0xe0, 0xeb, 0xec, 0xeb, 0x1, 0xf8,\n                                                              0x65, 0xea, 0x3, 0xf7, 0x26, 0xf7, 0x48, 0x15,\n                                                              0xf8, 0x23, 0x6, 0x91, 0xa0, 0x94, 0xb5, 0xa8,\n                                                              0x1a, 0xf4, 0x34, 0xd8, 0xfb, 0xc, 0xfb, 0x1a,\n                                                              0xfb, 0x49, 0x35, 0xfb, 0x5c, 0x26, 0xdb, 0x39,\n                                                              0xf7, 0x30, 0xe7, 0xe7, 0xab, 0xb2, 0xda, 0x1e,\n                                                              0x6d, 0xda, 0x5, 0x66, 0x44, 0x49, 0x79, 0x3e,\n                                                              0x1b, 0xfb, 0x11, 0x74, 0xbd, 0xae, 0x8c, 0x1f,\n                                                              0xa7, 0xeb, 0x15, 0xd1, 0xaa, 0xd9, 0xa6, 0xc7,\n                                                              0x1b, 0xcb, 0xc4, 0x6c, 0x49, 0x8c, 0x1f, 0xe,\n                                                              0x5f, 0xa, 0xf7, 0x82, 0xf8, 0x76, 0x15, 0xf7,\n                                                              0xd9, 0xd9, 0x77, 0xf0, 0xfb, 0xcf, 0xfb, 0xc,\n                                                              0x5, 0x34, 0xfc, 0x13, 0x32, 0xa, 0x61, 0xa,\n                                                              0xf7, 0x73, 0x77, 0x76, 0xa, 0xf7, 0x5c, 0xf8,\n                                                              0x73, 0x15, 0xf7, 0x40, 0xf4, 0xf7, 0x11, 0x22,\n                                                              0xcc, 0xad, 0xfb, 0x14, 0xf7, 0x24, 0x66, 0xa,\n                                                              0xfb, 0x52, 0xfb, 0x23, 0x5, 0x85, 0xfb, 0xf8,\n                                                              0x35, 0xa, 0xfb, 0x49, 0x93, 0xa, 0xd2, 0x31,\n                                                              0xa, 0x61, 0xa, 0xce, 0xf7, 0x10, 0x76, 0xa,\n                                                              0xf8, 0x25, 0xf8, 0x89, 0x6d, 0xa, 0xa5, 0xf7,\n                                                              0x10, 0x83, 0xa, 0xfb, 0x66, 0xfb, 0x10, 0x5a,\n                                                              0xa, 0xa4, 0xf7, 0x10, 0x65, 0xa, 0x28, 0xfc,\n                                                              0x67, 0x32, 0xa, 0x5f, 0xa, 0xf7, 0x6e, 0xf8,\n                                                              0xc3, 0x15, 0xf7, 0xc3, 0x3e, 0xaf, 0xc5, 0xfb,\n                                                              0xa7, 0xf7, 0xd, 0x5, 0xfb, 0x21, 0xfc, 0x8b,\n                                                              0x35, 0xa, 0xfb, 0x4a, 0x93, 0xa, 0xd3, 0x3c,\n                                                              0xf7, 0x2a, 0xea, 0xd9, 0xa0, 0xb5, 0xdd, 0x1f,\n                                                              0x81, 0xdc, 0x2f, 0xa, 0x7c, 0xe7, 0xf7, 0x49,\n                                                              0xea, 0xf7, 0x3e, 0xe8, 0x12, 0xc2, 0xf0, 0x6e,\n                                                              0xed, 0xf7, 0x45, 0xeb, 0x56, 0xee, 0x13, 0xf4,\n                                                              0xf7, 0x47, 0xf7, 0xc9, 0x15, 0x46, 0x62, 0x54,\n                                                              0x49, 0x3d, 0x1a, 0x2c, 0xf0, 0x5f, 0xe3, 0xf7,\n                                                              0x3d, 0xdf, 0xf7, 0x6, 0xe3, 0x8c, 0x1e, 0x8c,\n                                                              0xbe, 0x7b, 0xb3, 0x60, 0xab, 0x8, 0x13, 0xea,\n                                                              0xc9, 0xb0, 0xb5, 0xc7, 0xd4, 0x1a, 0xdb, 0x45,\n                                                              0xc3, 0x23, 0xfb, 0x1c, 0x20, 0x29, 0x25, 0x61,\n                                                              0x9c, 0x67, 0xae, 0x6e, 0x1e, 0xb9, 0xf7, 0x0,\n                                                              0x15, 0xc5, 0xc1, 0xbb, 0xd2, 0xd5, 0xa1, 0x67,\n                                                              0x6a, 0x8a, 0x1e, 0x4b, 0x47, 0x66, 0x51, 0x58,\n                                                              0x60, 0xa3, 0xb3, 0x1e, 0x13, 0xf4, 0x46, 0xfb,\n                                                              0x9b, 0x15, 0xc8, 0xd4, 0xb6, 0xcf, 0xd2, 0xaa,\n                                                              0x6c, 0x67, 0x8e, 0x1e, 0x46, 0x42, 0x5e, 0x4e,\n                                                              0x48, 0x5e, 0xaf, 0xb4, 0x1e, 0xe, 0x7c, 0xf7,\n                                                              0x17, 0x1, 0xa3, 0xf7, 0x21, 0xca, 0xf7, 0x21,\n                                                              0xcc, 0xf7, 0x21, 0x3, 0xa3, 0xaf, 0x15, 0x60,\n                                                              0xa, 0xa7, 0x7a, 0xa5, 0x63, 0x54, 0x6e, 0x5f,\n                                                              0x67, 0x1e, 0xf8, 0x2e, 0x50, 0xa, 0xfb, 0x62,\n                                                              0x50, 0xa, 0xe, 0xf7, 0x5f, 0xef, 0x1, 0x75,\n                                                              0xf9, 0x5, 0x3, 0x75, 0xf7, 0x5f, 0x15, 0xf9,\n                                                              0x5, 0x6, 0x9e, 0xef, 0x5, 0xfd, 0x5, 0x6,\n                                                              0xe, 0xf7, 0x5f, 0xef, 0x1, 0xc0, 0xf8, 0x6f,\n                                                              0x3, 0xc0, 0xf7, 0x5f, 0x15, 0xf8, 0x6f, 0x6,\n                                                              0x9e, 0xef, 0x5, 0xfc, 0x6f, 0x6, 0xe, 0xf7,\n                                                              0xa, 0xf2, 0xd5, 0xf2, 0x1, 0xb4, 0xf8, 0x64,\n                                                              0x3, 0xd6, 0xf7, 0xbb, 0x15, 0xf8, 0x65, 0x6,\n                                                              0x9e, 0xf2, 0x5, 0xfc, 0x64, 0x6, 0x55, 0xfb,\n                                                              0xac, 0x15, 0xf8, 0x64, 0x6, 0x9f, 0xf2, 0x5,\n                                                              0xfc, 0x65, 0x6, 0xe, 0x70, 0xe2, 0xf7, 0x95,\n                                                              0xe1, 0x91, 0xa, 0x9b, 0xf7, 0x0, 0xf7, 0xed,\n                                                              0xf7, 0x7, 0x3, 0xf7, 0x80, 0xf8, 0x42, 0x15,\n                                                              0xf7, 0x1d, 0xc1, 0xd0, 0x62, 0xa8, 0x4a, 0x8c,\n                                                              0x87, 0x19, 0x9d, 0x6d, 0x78, 0x96, 0x44, 0x1b,\n                                                              0xfb, 0x5c, 0xfb, 0x1c, 0xfb, 0x1, 0xfb, 0x2c,\n                                                              0x31, 0xd5, 0x3c, 0xf7, 0x35, 0xf7, 0x80, 0xec,\n                                                              0xf7, 0x2c, 0xf7, 0x41, 0xf7, 0x10, 0x39, 0xd4,\n                                                              0x63, 0xa5, 0x1f, 0xf7, 0xb, 0xbf, 0x74, 0xc0,\n                                                              0xfb, 0x2d, 0x46, 0x6c, 0x9d, 0x3f, 0xa7, 0x60,\n                                                              0x93, 0x19, 0x4f, 0x58, 0xb1, 0x84, 0xbc, 0x77,\n                                                              0xac, 0x7d, 0x19, 0x22, 0x5d, 0x5, 0x35, 0xfb,\n                                                              0xd0, 0x15, 0xf7, 0x0, 0xf7, 0x7, 0xbf, 0xe4,\n                                                              0xf2, 0xb1, 0x58, 0x55, 0x23, 0xfb, 0x7, 0x5b,\n                                                              0x39, 0x3e, 0x44, 0xa8, 0xcf, 0x1e, 0xe, 0x7c,\n                                                              0xf7, 0x2e, 0xf8, 0x45, 0x77, 0x1, 0xf7, 0x34,\n                                                              0xf7, 0x5d, 0x3, 0xf7, 0x80, 0xf7, 0x48, 0x15,\n                                                              0xee, 0x6, 0xf3, 0xf8, 0x1c, 0x5, 0xfb, 0x1e,\n                                                              0x6, 0xfb, 0x21, 0xfc, 0xa1, 0x15, 0x5f, 0xbf,\n                                                              0x79, 0xac, 0xc9, 0xc1, 0xb2, 0xc3, 0xab, 0x6b,\n                                                              0xa6, 0x56, 0x43, 0x5f, 0x5b, 0x5f, 0x1e, 0xe,\n                                                              0xfb, 0x11, 0x76, 0xf8, 0x4b, 0xf7, 0x30, 0x1,\n                                                              0xf7, 0x83, 0xf7, 0x5d, 0x3, 0xf7, 0x83, 0xf7,\n                                                              0xf9, 0x15, 0x69, 0xa9, 0x6d, 0xc0, 0xd4, 0xb8,\n                                                              0xb1, 0xc0, 0xbb, 0x57, 0x9c, 0x6a, 0x4e, 0x54,\n                                                              0x66, 0x54, 0x1e, 0x3c, 0xfc, 0x8b, 0x15, 0xf7,\n                                                              0x1f, 0x6, 0xcb, 0xf8, 0x22, 0x7b, 0xa, 0xe,\n                                                              0x8b, 0xe9, 0xf7, 0x90, 0xe8, 0xea, 0xe6, 0x1,\n                                                              0xf7, 0x87, 0xf3, 0x3, 0xb6, 0x16, 0xf8, 0x49,\n                                                              0x55, 0xa, 0xfb, 0x77, 0x6, 0xc0, 0xf7, 0x90,\n                                                              0x5, 0xf7, 0x78, 0x89, 0xa, 0xfb, 0x77, 0x6,\n                                                              0xd5, 0x9c, 0x93, 0xa0, 0xdb, 0x1b, 0xbc, 0xc0,\n                                                              0x82, 0x83, 0xb8, 0x1f, 0xb1, 0xe8, 0x3e, 0x95,\n                                                              0x52, 0x91, 0x5c, 0x8a, 0x19, 0x58, 0x8a, 0x65,\n                                                              0x83, 0x66, 0x78, 0x55, 0x6d, 0x7c, 0x5a, 0x80,\n                                                              0x58, 0x84, 0x6f, 0x18, 0x21, 0x6, 0x77, 0x2e,\n                                                              0x5, 0xf5, 0x6, 0x55, 0xfb, 0x90, 0x5, 0x21,\n                                                              0x6, 0xe, 0xf8, 0x75, 0xf8, 0x74, 0x15, 0xf5,\n                                                              0x6, 0xa8, 0xf7, 0x26, 0x5, 0x21, 0x6, 0xfb,\n                                                              0x68, 0xfd, 0x6, 0x15, 0xf7, 0xb4, 0x37, 0xa,\n                                                              0x29, 0x6, 0xcc, 0xf7, 0xd8, 0x5, 0xfb, 0x48,\n                                                              0x3c, 0xa, 0xe1, 0x6, 0x5e, 0xfb, 0x7e, 0x66,\n                                                              0xa, 0xfb, 0xe0, 0x31, 0x15, 0xf7, 0xb6, 0x37,\n                                                              0xa, 0x28, 0x6, 0xb9, 0xf7, 0x7e, 0x5, 0xee,\n                                                              0x37, 0xa, 0x28, 0x6, 0x99, 0xc9, 0x99, 0xc2,\n                                                              0xe1, 0x7c, 0xad, 0x88, 0x19, 0xab, 0xe5, 0xfb,\n                                                              0x2, 0x90, 0xfb, 0xe, 0x88, 0x6d, 0xfb, 0x1e,\n                                                              0x19, 0x7f, 0x56, 0x5, 0x29, 0x3c, 0xa, 0xed,\n                                                              0x6, 0x5e, 0xfb, 0x7e, 0x4e, 0xa, 0xe, 0x7c,\n                                                              0xe7, 0xf7, 0x7e, 0xe7, 0xf4, 0xe8, 0x1, 0xf8,\n                                                              0x37, 0xef, 0x3, 0xa7, 0xaf, 0x15, 0x7d, 0xad,\n                                                              0xe6, 0x66, 0xe3, 0x1b, 0xf7, 0x43, 0xf2, 0xf7,\n                                                              0xe, 0xf7, 0x17, 0xde, 0x55, 0xdd, 0xfb, 0x10,\n                                                              0x6a, 0x5c, 0x85, 0x77, 0x75, 0x1f, 0xa6, 0xf7,\n                                                              0x17, 0x5, 0xf7, 0xb3, 0x94, 0xa, 0xfc, 0x15,\n                                                              0x6, 0x4b, 0xfb, 0xd8, 0xcd, 0x71, 0x5, 0xc7,\n                                                              0xbb, 0xb4, 0x8b, 0xa6, 0x1b, 0xcb, 0xbd, 0x61,\n                                                              0x52, 0x3f, 0x4b, 0x50, 0x2d, 0x49, 0x4f, 0x9d,\n                                                              0xa1, 0x53, 0x1f, 0xe, 0x8b, 0xe8, 0xf7, 0x86,\n                                                              0xe9, 0xef, 0xe8, 0x8f, 0x77, 0x12, 0x13, 0xd0,\n                                                              0xf7, 0xbf, 0x16, 0xf7, 0xb8, 0x94, 0xa, 0x27,\n                                                              0x6, 0xf5, 0xf8, 0xa9, 0x5, 0xfb, 0x1b, 0x82,\n                                                              0xa, 0xb5, 0x6, 0x34, 0xfc, 0x4c, 0x7b, 0xa,\n                                                              0xfb, 0xe1, 0x2e, 0x15, 0xf7, 0xb9, 0x6, 0x9d,\n                                                              0xe8, 0x5, 0x27, 0x6, 0xbc, 0xf7, 0x86, 0x5,\n                                                              0xee, 0x6, 0x9d, 0xe9, 0x5, 0x27, 0x6, 0x9a,\n                                                              0xc2, 0x5, 0x13, 0xe0, 0x97, 0xc3, 0xe9, 0x7e,\n                                                              0xad, 0x8d, 0xaa, 0xe8, 0x18, 0xfb, 0x16, 0x8e,\n                                                              0xfb, 0x0, 0x8a, 0x6e, 0xfb, 0x22, 0x80, 0x56,\n                                                              0x18, 0x27, 0x44, 0xa, 0xef, 0x6, 0x5b, 0xfb,\n                                                              0x86, 0x7b, 0xa, 0xe, 0xfb, 0x17, 0xea, 0xf8,\n                                                              0x6, 0xea, 0xe8, 0xe9, 0x1, 0xf7, 0xc3, 0xee,\n                                                              0x3, 0x8d, 0x6d, 0x15, 0x3b, 0x2e, 0x5, 0x88,\n                                                              0xa7, 0xc0, 0x86, 0xbd, 0x1b, 0xdc, 0xe8, 0xa8,\n                                                              0xf1, 0xb3, 0x1f, 0xf7, 0x1b, 0xf7, 0xe2, 0x5,\n                                                              0xf7, 0x3, 0x6, 0xb1, 0xea, 0x65, 0xa, 0xd0,\n                                                              0xaa, 0xa3, 0xa3, 0xc2, 0x1b, 0xa4, 0xaa, 0x87,\n                                                              0x88, 0xa0, 0x1f, 0xc1, 0xe9, 0x5, 0x90, 0x5e,\n                                                              0x8b, 0x8d, 0x65, 0x1b, 0xfb, 0x10, 0x43, 0x5c,\n                                                              0x22, 0x5f, 0x1f, 0x7b, 0x68, 0x5, 0x20, 0x6,\n                                                              0x64, 0x2c, 0x5, 0xf7, 0x1, 0x6, 0xfb, 0x5,\n                                                              0xfb, 0xae, 0x5, 0x3e, 0x6d, 0x74, 0x80, 0x50,\n                                                              0x1b, 0x71, 0x70, 0x8f, 0x8d, 0x74, 0x1f, 0xe,\n                                                              0x8b, 0xe8, 0xd6, 0xe8, 0xf7, 0xf7, 0x77, 0x1,\n                                                              0xf7, 0xd0, 0xef, 0x3, 0xc9, 0xf7, 0x3c, 0x15,\n                                                              0xf7, 0xa4, 0x6, 0x79, 0x40, 0x5, 0xfb, 0x0,\n                                                              0x82, 0xa, 0xf7, 0xbd, 0x89, 0xa, 0x31, 0x6,\n                                                              0x9c, 0xd6, 0x5, 0xe0, 0x89, 0xa, 0x35, 0x6,\n                                                              0xd4, 0xf7, 0xf7, 0x5, 0xfb, 0x0, 0x6, 0xfb,\n                                                              0xe5, 0xfc, 0x4, 0x5, 0xf7, 0x6, 0x98, 0x15,\n                                                              0xf7, 0x62, 0xf7, 0x7d, 0x5b, 0xfb, 0x7d, 0x5,\n                                                              0xe, 0x61, 0xf9, 0x41, 0x3, 0x61, 0x83, 0x15,\n                                                              0xc8, 0x57, 0xf9, 0x4, 0xf9, 0x34, 0x4b, 0xbc,\n                                                              0x5, 0xe, 0xfb, 0x26, 0xe5, 0xea, 0xe3, 0xf7,\n                                                              0x6f, 0xe4, 0x45, 0xe4, 0x12, 0xb1, 0xed, 0x13,\n                                                              0xe8, 0xb8, 0x73, 0x15, 0x62, 0x31, 0x5, 0x79,\n                                                              0xdb, 0xd0, 0x7d, 0xd5, 0x1b, 0xf7, 0x50, 0xb4,\n                                                              0xe7, 0xf2, 0xa0, 0x1f, 0xc9, 0xf7, 0xbd, 0x5c,\n                                                              0xa, 0x9e, 0xe4, 0x5, 0xfb, 0x3d, 0x6, 0x83,\n                                                              0x6b, 0x5, 0x13, 0xd8, 0xa8, 0x6a, 0x5f, 0xa1,\n                                                              0x58, 0x1b, 0xfb, 0x2e, 0xfb, 0x1f, 0xfb, 0x0,\n                                                              0xfb, 0x1b, 0x27, 0xd6, 0x43, 0xf7, 0x14, 0xbe,\n                                                              0xc0, 0x8e, 0xa9, 0xb8, 0x1f, 0x2c, 0x77, 0x81,\n                                                              0x6a, 0xfb, 0x9, 0x1b, 0x41, 0x33, 0xa0, 0x96,\n                                                              0x67, 0x1f, 0xe6, 0xf7, 0x8e, 0x15, 0xdb, 0xe1,\n                                                              0xc6, 0xe1, 0xd4, 0xb9, 0x60, 0x4e, 0x8a, 0x1e,\n                                                              0x33, 0x41, 0x5d, 0x2c, 0x4a, 0x53, 0xb2, 0xc7,\n                                                              0x1e, 0xe, 0xfb, 0x26, 0xde, 0xe3, 0xdc, 0xf7,\n                                                              0x70, 0xdd, 0x1, 0x9d, 0xed, 0x3, 0xa4, 0x6a,\n                                                              0x15, 0x62, 0x38, 0x5, 0x7a, 0xdb, 0xd0, 0x7e,\n                                                              0xd5, 0x1b, 0xf7, 0x50, 0xb4, 0xe0, 0xea, 0xa0,\n                                                              0x1f, 0xc9, 0xf7, 0xae, 0x5c, 0xa, 0x9e, 0xdd,\n                                                              0x5, 0xfb, 0x3d, 0x6, 0x83, 0x66, 0x5, 0xa6,\n                                                              0x6a, 0x5f, 0x9f, 0x58, 0x1b, 0xfb, 0x2e, 0xfb,\n                                                              0x1f, 0x27, 0xfb, 0x10, 0x2e, 0xd6, 0x49, 0xf7,\n                                                              0x14, 0xbe, 0xc0, 0x8e, 0xa6, 0xb8, 0x1f, 0x34,\n                                                              0x77, 0x81, 0x6c, 0xfb, 0x9, 0x1b, 0x41, 0x33,\n                                                              0x9e, 0x96, 0x67, 0x1f, 0xe6, 0xf7, 0x7a, 0x15,\n                                                              0xd5, 0xe1, 0xc2, 0xe1, 0xd4, 0xb9, 0x63, 0x53,\n                                                              0x8a, 0x1e, 0x39, 0x41, 0x61, 0x2c, 0x4a, 0x53,\n                                                              0xaf, 0xc2, 0x1e, 0xf7, 0x65, 0xf7, 0xb5, 0x15,\n                                                              0xee, 0x6, 0xf7, 0x54, 0xf7, 0x24, 0x57, 0xaf,\n                                                              0xfb, 0x46, 0x5e, 0xa, 0x7c, 0xe9, 0x39, 0xe9,\n                                                              0xf7, 0x90, 0xe9, 0xf5, 0xde, 0x12, 0xf7, 0xb1,\n                                                              0xed, 0xf7, 0xe, 0xed, 0x13, 0x7c, 0x88, 0x88,\n                                                              0x15, 0xf7, 0x45, 0x6, 0xe6, 0xf8, 0x56, 0x5,\n                                                              0xdf, 0x9b, 0xad, 0x97, 0xdd, 0x1b, 0xbe, 0xb7,\n                                                              0x82, 0x6a, 0x6b, 0x40, 0x77, 0x74, 0x86, 0x1f,\n                                                              0x4d, 0x7d, 0x5c, 0x56, 0x46, 0x1a, 0x4f, 0xc9,\n                                                              0x74, 0xcb, 0x73, 0x1e, 0xaa, 0x80, 0xca, 0x81,\n                                                              0x6f, 0x1a, 0x13, 0xbc, 0x69, 0x4d, 0x64, 0x4d,\n                                                              0x66, 0x62, 0x9d, 0x97, 0x70, 0x1e, 0x46, 0x46,\n                                                              0x5, 0x67, 0xc2, 0xb0, 0x78, 0xc2, 0x1b, 0xf7,\n                                                              0x1f, 0xf7, 0x2, 0xda, 0xf6, 0xca, 0x46, 0xa4,\n                                                              0x4c, 0xa0, 0x1f, 0x71, 0x93, 0x4d, 0x99, 0xad,\n                                                              0x1a, 0xa3, 0xbc, 0x9e, 0xa7, 0x94, 0x1e, 0xcd,\n                                                              0xa0, 0xc9, 0xa1, 0xd3, 0x1a, 0xd6, 0x77, 0xbb,\n                                                              0xfb, 0x3f, 0xfb, 0x2f, 0x5c, 0x55, 0xfb, 0x5,\n                                                              0x74, 0x1e, 0x86, 0x75, 0x5, 0x3b, 0x6f, 0xa,\n                                                              0xdd, 0x6, 0x13, 0x7c, 0x59, 0xfb, 0x90, 0x5,\n                                                              0x38, 0x6, 0xe, 0xf7, 0x4c, 0xf7, 0x7b, 0x3,\n                                                              0xf7, 0x4c, 0xf8, 0xcf, 0x15, 0xf7, 0x63, 0x4c,\n                                                              0xa3, 0xbc, 0xfb, 0x50, 0xf3, 0x5, 0xe, 0xaf,\n                                                              0x76, 0xf8, 0x7a, 0x77, 0x1, 0xc1, 0x9a, 0x15,\n                                                              0xf8, 0x6b, 0xf7, 0x4b, 0xa0, 0xf7, 0xa, 0xfc,\n                                                              0x25, 0xf7, 0x4d, 0x7a, 0x2d, 0xf7, 0xd1, 0xfb,\n                                                              0x2a, 0xfc, 0xa, 0xfb, 0x28, 0x5, 0xe, 0xd1,\n                                                              0xc5, 0xf7, 0x96, 0xc7, 0x1, 0xc5, 0xf7, 0x5,\n                                                              0xf7, 0x2, 0xf7, 0x5, 0x3, 0xc5, 0xf7, 0x9b,\n                                                              0x51, 0xa, 0x9c, 0xfb, 0x4b, 0x51, 0xa, 0xe,\n                                                              0xe6, 0x76, 0xf8, 0xc, 0x77, 0x1, 0xf7, 0x86,\n                                                              0xf7, 0xa, 0xd0, 0xf7, 0x5, 0x3, 0xc5, 0xf7,\n                                                              0x19, 0x15, 0xaf, 0x4c, 0xf7, 0x9e, 0xf7, 0x4e,\n                                                              0xfb, 0x5e, 0xf7, 0x52, 0x53, 0x4d, 0xf7, 0x20,\n                                                              0xfb, 0x13, 0x5, 0x9a, 0xfb, 0x10, 0x15, 0xae,\n                                                              0x4c, 0xf7, 0x8e, 0xf7, 0x4e, 0xfb, 0x4c, 0xf7,\n                                                              0x52, 0x53, 0x4d, 0xf7, 0x13, 0xfb, 0x13, 0x5,\n                                                              0xe, 0xd1, 0xf8, 0xc, 0x1, 0xf7, 0x12, 0xf7,\n                                                              0xbd, 0x3, 0xf7, 0x12, 0xf7, 0x97, 0x15, 0xf7,\n                                                              0x7f, 0xfb, 0x51, 0xc9, 0xbf, 0xfb, 0x3f, 0xf7,\n                                                              0x1c, 0xf7, 0x72, 0xf7, 0x11, 0x65, 0xca, 0x5,\n                                                              0xe, 0xd1, 0xf8, 0xc, 0x1, 0xf7, 0x12, 0xf7,\n                                                              0x18, 0x15, 0xb2, 0x4d, 0xf7, 0xc9, 0xf7, 0x51,\n                                                              0xfb, 0x7a, 0xf7, 0x4f, 0x4b, 0x56, 0xf7, 0x3d,\n                                                              0xfb, 0x12, 0x5, 0xe, 0x81, 0xa, 0xf1, 0xec,\n                                                              0x3, 0x8d, 0x16, 0xf7, 0x94, 0x55, 0xa, 0x3c,\n                                                              0x6, 0xb2, 0xf7, 0x57, 0x5, 0xbc, 0xdc, 0xc4,\n                                                              0x94, 0xa7, 0x1b, 0xb1, 0x9f, 0x7b, 0x76, 0x82,\n                                                              0x89, 0x81, 0x89, 0x81, 0x1f, 0x66, 0xfb, 0x4f,\n                                                              0x5, 0x3b, 0x6f, 0xa, 0xf7, 0x96, 0x3f, 0xa,\n                                                              0x3a, 0x6, 0xaf, 0xf7, 0x48, 0x5, 0x8f, 0x9c,\n                                                              0x8f, 0x9d, 0x9d, 0x1a, 0xc5, 0x77, 0xc2, 0xfb,\n                                                              0x8, 0x4f, 0x57, 0x76, 0x71, 0x55, 0x1e, 0xbb,\n                                                              0xf7, 0x7d, 0x5, 0xfb, 0x46, 0x44, 0xa, 0xdd,\n                                                              0x6, 0x31, 0xfc, 0x4a, 0x5, 0x3a, 0x6, 0xe,\n                                                              0xf8, 0x7c, 0xf7, 0x41, 0x1, 0xba, 0xc2, 0xf7,\n                                                              0x34, 0xc2, 0x3, 0xf7, 0x9a, 0xf8, 0x8f, 0x15,\n                                                              0xc2, 0x78, 0xf7, 0x80, 0xf7, 0x23, 0x31, 0xa9,\n                                                              0x5, 0xfc, 0x34, 0xfb, 0x2e, 0x15, 0xc2, 0x78,\n                                                              0xf7, 0x82, 0xf7, 0x23, 0x31, 0xa9, 0x5, 0xe,\n                                                              0xf7, 0x5f, 0xf7, 0x2, 0x1, 0xe3, 0xf8, 0x25,\n                                                              0x3, 0xe3, 0xf7, 0x5f, 0x15, 0xf8, 0x25, 0x6,\n                                                              0xa2, 0xf7, 0x2, 0x5, 0xfc, 0x25, 0x6, 0xe,\n                                                              0x8b, 0xea, 0xf7, 0x93, 0xea, 0xc9, 0xf7, 0x2b,\n                                                              0x1, 0xf7, 0xf3, 0xf7, 0x4, 0x3, 0xf7, 0xd4,\n                                                              0x69, 0xa, 0xfb, 0xbb, 0xfd, 0x26, 0x15, 0xf8,\n                                                              0x54, 0x6, 0x9f, 0xea, 0x8f, 0xa, 0x6, 0xd1,\n                                                              0xf7, 0xf2, 0x5, 0xfb, 0x7f, 0x6, 0x77, 0x2c,\n                                                              0x5, 0xf7, 0x1d, 0x6, 0x59, 0xfb, 0x93, 0x5,\n                                                              0xfb, 0x44, 0x6, 0xe, 0x78, 0xa, 0x91, 0xa,\n                                                              0xf7, 0x7e, 0xf8, 0x77, 0x15, 0xf7, 0xdf, 0xd8,\n                                                              0x78, 0xf0, 0xfb, 0xd6, 0xfb, 0xc, 0x5, 0xfb,\n                                                              0x48, 0xfc, 0xb1, 0x2e, 0xa, 0x78, 0xa, 0xf7,\n                                                              0x6f, 0x77, 0x1, 0xf7, 0x5f, 0xf8, 0x74, 0x15,\n                                                              0xf7, 0x37, 0xf3, 0xf7, 0x9, 0x23, 0xc8, 0xae,\n                                                              0xfb, 0xc, 0xf7, 0x22, 0x5, 0x30, 0x6, 0xfb,\n                                                              0x48, 0xfb, 0x21, 0x5, 0xfb, 0x1, 0xfc, 0x98,\n                                                              0x2e, 0xa, 0x78, 0xa, 0xc9, 0xf7, 0x11, 0x1,\n                                                              0xf8, 0x27, 0xf8, 0x89, 0x15, 0xf7, 0x1, 0x89,\n                                                              0xa4, 0xf7, 0x12, 0x86, 0xa, 0xfb, 0x5e, 0xfb,\n                                                              0x10, 0x15, 0xf7, 0x0, 0x6, 0xa4, 0xf7, 0x10,\n                                                              0x5, 0xfb, 0x1, 0x6, 0xfb, 0x61, 0xfd, 0x5,\n                                                              0x2e, 0xa, 0x78, 0xa, 0x91, 0xa, 0xf7, 0x73,\n                                                              0xf8, 0xc4, 0x15, 0xf7, 0xaa, 0x3e, 0xac, 0xc5,\n                                                              0xfb, 0x90, 0xf7, 0xc, 0x5, 0xfb, 0x82, 0xfd,\n                                                              0x29, 0x2e, 0xa, 0xfb, 0x26, 0xea, 0xf8, 0x35,\n                                                              0xe6, 0xbd, 0xf7, 0x2b, 0xfb, 0x25, 0xf7, 0x25,\n                                                              0x12, 0x13, 0xe0, 0xf7, 0x20, 0x69, 0xa, 0xfb,\n                                                              0x61, 0xfd, 0x59, 0x15, 0x77, 0x2c, 0x5, 0xf7,\n                                                              0x82, 0x6, 0x9f, 0xea, 0x5, 0x41, 0x6, 0xf7,\n                                                              0x2, 0xf8, 0x84, 0x5, 0xfb, 0x39, 0x6, 0x77,\n                                                              0x2c, 0x5, 0xce, 0x6, 0x31, 0xfc, 0x25, 0x5,\n                                                              0x13, 0xd0, 0xf8, 0x69, 0xf8, 0xc8, 0x15, 0xf7,\n                                                              0xc, 0x6, 0xac, 0xf7, 0x25, 0x5, 0xfb, 0xd,\n                                                              0x6, 0xfb, 0xa1, 0xfd, 0x4a, 0x15, 0x5e, 0x30,\n                                                              0x5, 0x86, 0x9a, 0xa4, 0x7d, 0xc5, 0x1b, 0xf7,\n                                                              0x4b, 0x9e, 0x8b, 0xa, 0xfb, 0x67, 0x6e, 0xa,\n                                                              0xf4, 0x6, 0x44, 0xfb, 0xce, 0x5, 0x45, 0x7b,\n                                                              0x6c, 0x66, 0x61, 0x1b, 0x57, 0x7f, 0x9a, 0x8f,\n                                                              0x81, 0x1f, 0xe, 0xfb, 0x26, 0xe6, 0xf8, 0x39,\n                                                              0xe6, 0xc3, 0xf7, 0x25, 0x1, 0xf7, 0xc5, 0xf4,\n                                                              0x3, 0xf8, 0xf, 0xf8, 0x95, 0x15, 0xf7, 0xb,\n                                                              0x6, 0xac, 0xf7, 0x25, 0x5, 0xfb, 0xc, 0x6,\n                                                              0xfc, 0xe, 0xfd, 0x4a, 0x15, 0x5e, 0x30, 0x5,\n                                                              0x82, 0xc1, 0xc2, 0x81, 0xc5, 0x1b, 0xf7, 0x66,\n                                                              0xab, 0x8b, 0xa, 0xfc, 0x7, 0x6e, 0xa, 0xf7,\n                                                              0x9d, 0x6, 0x44, 0xfb, 0xce, 0x5, 0x45, 0x7b,\n                                                              0x6a, 0x66, 0x3b, 0x1b, 0x57, 0x5d, 0x93, 0x96,\n                                                              0x5e, 0x1f, 0xe, 0x8b, 0xe9, 0x1, 0xe9, 0xd9,\n                                                              0xf7, 0x15, 0xf7, 0x91, 0x3, 0x87, 0x16, 0xf7,\n                                                              0x44, 0x6, 0xae, 0xf7, 0x3d, 0xb2, 0xa3, 0xb1,\n                                                              0x72, 0xae, 0x68, 0xa7, 0x64, 0x19, 0x6f, 0x87,\n                                                              0xa, 0xf7, 0x91, 0x6, 0x9d, 0xe9, 0x5, 0x21,\n                                                              0x6, 0x6a, 0xbd, 0x44, 0xcc, 0x68, 0xac, 0xf7,\n                                                              0x2a, 0xf2, 0x18, 0xf7, 0x0, 0x55, 0xa, 0xfb,\n                                                              0xa3, 0x6f, 0xa, 0x9f, 0x6, 0x20, 0x43, 0xd3,\n                                                              0xf7, 0xf5, 0x5, 0xfb, 0x44, 0x6f, 0xa, 0xdb,\n                                                              0x6, 0x32, 0xfc, 0x4a, 0x5, 0x3c, 0x6, 0xe,\n                                                              0x81, 0xa, 0xf7, 0x98, 0xee, 0x3, 0xcd, 0x16,\n                                                              0xf8, 0x54, 0x6, 0x9f, 0xe9, 0x3e, 0xa, 0xf7,\n                                                              0x1, 0xf8, 0xa8, 0x5, 0xfb, 0x94, 0x87, 0xa,\n                                                              0xf7, 0x30, 0x6, 0x31, 0xfc, 0x4a, 0x8f, 0xa,\n                                                              0x6, 0xe, 0xaf, 0x76, 0xf8, 0x7a, 0x77, 0x1,\n                                                              0xc1, 0xf7, 0x5c, 0x15, 0xf8, 0x25, 0xfb, 0x4d,\n                                                              0x9c, 0xe9, 0xfb, 0xd1, 0xf7, 0x2a, 0xf8, 0x9,\n                                                              0xf7, 0x28, 0x9c, 0xe9, 0xfc, 0x6a, 0xfb, 0x4b,\n                                                              0x5, 0xe, 0x84, 0x76, 0xb0, 0x76, 0xf7, 0x46,\n                                                              0xde, 0xce, 0xde, 0xf7, 0xb, 0xe8, 0x12, 0xf7,\n                                                              0x3f, 0xea, 0x13, 0xbc, 0x52, 0xa, 0x13, 0x7c,\n                                                              0x3d, 0xa, 0x7c, 0x7f, 0x88, 0x83, 0x7f, 0x1f,\n                                                              0x9c, 0x9a, 0xa8, 0xbe, 0x89, 0x8e, 0x8, 0xf7,\n                                                              0x47, 0x6, 0x9f, 0xde, 0x5, 0xfb, 0x3e, 0x6,\n                                                              0x89, 0x92, 0x91, 0xa8, 0x8a, 0xaa, 0x8, 0xf7,\n                                                              0x27, 0x6, 0x9f, 0xde, 0x5, 0xfb, 0x3a, 0x92,\n                                                              0x6, 0xcb, 0xab, 0x47, 0xa, 0x3f, 0x3e, 0xfb,\n                                                              0x10, 0x1f, 0x80, 0x3b, 0x7, 0x78, 0x38, 0x5,\n                                                              0xeb, 0x6, 0x6c, 0x83, 0x6e, 0x8c, 0x84, 0x1e,\n                                                              0x27, 0x6, 0x78, 0x38, 0x5, 0xe8, 0x6, 0x8c,\n                                                              0x6f, 0x67, 0x56, 0x43, 0x5a, 0x8, 0xe, 0xf7,\n                                                              0xc0, 0xf7, 0x5, 0x1, 0xf8, 0x18, 0xee, 0x3,\n                                                              0xc6, 0xf7, 0xc0, 0x15, 0xf7, 0xff, 0x6, 0x69,\n                                                              0xfb, 0x59, 0x5, 0xee, 0x6, 0xc1, 0xf7, 0xca,\n                                                              0x5, 0xfc, 0x63, 0x6, 0xe, 0x81, 0xa, 0xf7,\n                                                              0x91, 0xf4, 0x3, 0xbc, 0x16, 0xf8, 0x6d, 0x55,\n                                                              0xa, 0xfb, 0x4c, 0x6, 0xbb, 0xf7, 0x73, 0xf7,\n                                                              0x16, 0xaa, 0x99, 0xcd, 0xfb, 0x15, 0x6b, 0xc0,\n                                                              0xf7, 0x88, 0x5, 0xfb, 0xae, 0x6, 0x76, 0x2d,\n                                                              0x5, 0xf7, 0x46, 0x6, 0x64, 0xfb, 0x45, 0xfb,\n                                                              0x18, 0x6a, 0x7e, 0x4a, 0xf7, 0x17, 0xab, 0x60,\n                                                              0xfb, 0x57, 0x5, 0xfb, 0x4b, 0x6, 0xe, 0x8b,\n                                                              0xea, 0xf7, 0x90, 0xea, 0x1, 0xd4, 0xdd, 0xf5,\n                                                              0xee, 0x3, 0x76, 0x16, 0xf7, 0x8a, 0x6, 0x9c,\n                                                              0xea, 0x5, 0x34, 0x6, 0xb6, 0xf7, 0x7b, 0x5,\n                                                              0x9c, 0xa0, 0xb0, 0x9b, 0xa1, 0x1b, 0xaa, 0x96,\n                                                              0x77, 0x78, 0x86, 0x8b, 0x87, 0x8a, 0x87, 0x1f,\n                                                              0x51, 0xfb, 0xc7, 0x5, 0xf7, 0x35, 0x6, 0x9b,\n                                                              0xea, 0x5, 0x3d, 0x6, 0xb6, 0xf7, 0x73, 0x5,\n                                                              0xab, 0xa7, 0xae, 0x94, 0x9b, 0x1b, 0xad, 0x97,\n                                                              0x6f, 0x81, 0x89, 0x1f, 0x4f, 0xfb, 0xd5, 0x5,\n                                                              0xf7, 0x1f, 0x6, 0x9b, 0xea, 0x5, 0x53, 0x6,\n                                                              0xb7, 0xf7, 0x72, 0x5, 0x8d, 0x95, 0x8c, 0x96,\n                                                              0x94, 0x1a, 0xc9, 0x65, 0xb8, 0x46, 0x62, 0x5f,\n                                                              0x79, 0x6c, 0x6a, 0x1e, 0xb5, 0x7b, 0x66, 0x92,\n                                                              0x75, 0x1b, 0x6c, 0x6c, 0x7f, 0x73, 0x73, 0x1f,\n                                                              0x8e, 0xa3, 0x5, 0xfb, 0x3b, 0x6, 0x79, 0x2c,\n                                                              0x5c, 0xa, 0x5a, 0xfb, 0x90, 0x5, 0x3d, 0x6,\n                                                              0xe, 0xf8, 0x8d, 0xdb, 0x1, 0xda, 0xf8, 0x3b,\n                                                              0x3, 0xda, 0xf8, 0x8d, 0x15, 0xf8, 0x3b, 0x6,\n                                                              0x9d, 0xdb, 0x5, 0xfc, 0x3b, 0x6, 0xe, 0xf7,\n                                                              0x5f, 0xf7, 0x2, 0x1, 0xc6, 0xf8, 0x63, 0x3,\n                                                              0xc6, 0xf7, 0x5f, 0x73, 0xa, 0xe, 0xfb, 0xd,\n                                                              0x76, 0xf7, 0x2a, 0xe0, 0x42, 0xe4, 0xf7, 0x85,\n                                                              0xe4, 0x12, 0x13, 0xd0, 0xa8, 0xfb, 0x22, 0x15,\n                                                              0xeb, 0x6, 0xb1, 0xf7, 0x48, 0x5, 0x7d, 0x98,\n                                                              0x9d, 0x7b, 0xb2, 0x1b, 0xcc, 0xb8, 0xab, 0xab,\n                                                              0xb7, 0x1f, 0x13, 0xb0, 0x7f, 0x57, 0x5, 0xf7,\n                                                              0x44, 0x6, 0x9e, 0xe4, 0x5, 0x3b, 0x6, 0xcf,\n                                                              0xf7, 0xde, 0x8d, 0xa, 0x63, 0xfb, 0x57, 0x5,\n                                                              0x13, 0xd0, 0x68, 0x5c, 0x62, 0x70, 0x50, 0x1b,\n                                                              0x5f, 0x74, 0xa1, 0xad, 0x92, 0x8b, 0x94, 0x8d,\n                                                              0x93, 0x1f, 0xc1, 0xf7, 0x9e, 0x8d, 0xa, 0xe,\n                                                              0xbc, 0xf8, 0x4e, 0x3, 0xbc, 0xef, 0x15, 0xbc,\n                                                              0x4e, 0xf7, 0x52, 0xf7, 0x35, 0xf7, 0x15, 0xfb,\n                                                              0x35, 0xd5, 0xc8, 0xfb, 0x15, 0xf7, 0x33, 0xf7,\n                                                              0x50, 0xf7, 0x30, 0x5b, 0xc7, 0xfb, 0x53, 0xfb,\n                                                              0x31, 0xfb, 0x13, 0xf7, 0x34, 0x41, 0x4f, 0xf7,\n                                                              0x16, 0xfb, 0x33, 0x5, 0xe, 0x8b, 0xe9, 0xf7,\n                                                              0x90, 0xea, 0x3b, 0xe8, 0x12, 0x13, 0xa0, 0x8d,\n                                                              0x16, 0xf7, 0x96, 0x3f, 0xa, 0x39, 0x6, 0xb4,\n                                                              0xf7, 0x5d, 0x5, 0xb6, 0xc6, 0xd3, 0xa2, 0xaa,\n                                                              0x1b, 0xbd, 0x9a, 0x7a, 0x72, 0x82, 0x89, 0x81,\n                                                              0x89, 0x80, 0x1f, 0x64, 0xfb, 0x57, 0x5, 0x3c,\n                                                              0x44, 0xa, 0xf7, 0x93, 0x3f, 0xa, 0x3b, 0x6,\n                                                              0xb7, 0xf7, 0x6d, 0x5, 0x13, 0xc0, 0x8e, 0x98,\n                                                              0x8d, 0x96, 0x96, 0x1a, 0x13, 0xa0, 0xd0, 0x4d,\n                                                              0xb2, 0x3e, 0x52, 0x4b, 0x6f, 0x6f, 0x5a, 0x1e,\n                                                              0x13, 0xc0, 0x93, 0xb6, 0x5, 0xfb, 0x46, 0x6,\n                                                              0x78, 0x2c, 0x5, 0xde, 0x6, 0x58, 0xfb, 0x90,\n                                                              0x5, 0x3b, 0x6, 0xe, 0x7c, 0xe4, 0xf7, 0x1b,\n                                                              0xe8, 0xf7, 0x70, 0xe9, 0x1, 0xf7, 0x1d, 0xf1,\n                                                              0xf7, 0x77, 0xe7, 0x3, 0xb5, 0x82, 0x15, 0x87,\n                                                              0xaa, 0xb5, 0x89, 0xbd, 0x1b, 0xf7, 0x5a, 0xf7,\n                                                              0x57, 0xf7, 0x28, 0xf7, 0xb0, 0xf2, 0x62, 0xeb,\n                                                              0xfb, 0x1a, 0xfb, 0x15, 0xfb, 0x9, 0xfb, 0x5,\n                                                              0xfb, 0xa, 0x1f, 0x2e, 0x89, 0xce, 0x38, 0xf1,\n                                                              0x1b, 0xb6, 0xb5, 0x9d, 0x9b, 0xa8, 0x1f, 0xfb,\n                                                              0xc, 0x6a, 0xfb, 0x1e, 0x5a, 0xfb, 0x48, 0x1b,\n                                                              0xf8, 0x23, 0xf7, 0xc6, 0x15, 0x86, 0x53, 0x42,\n                                                              0x37, 0x56, 0x69, 0xb1, 0xc4, 0xdf, 0xdb, 0xb4,\n                                                              0xbe, 0xe3, 0x97, 0x3d, 0x4b, 0x87, 0x1e, 0xe,\n                                                              0x8b, 0xe7, 0xf7, 0x89, 0xe7, 0xf7, 0xc, 0xe0,\n                                                              0x1, 0xf7, 0x38, 0xf8, 0x95, 0x15, 0xda, 0x71,\n                                                              0x5, 0xa4, 0x9a, 0x9c, 0xb0, 0xaf, 0x1b, 0xa1,\n                                                              0xa1, 0x7a, 0x7b, 0xa3, 0x1f, 0x7d, 0xa1, 0xa1,\n                                                              0x7e, 0xa4, 0x1b, 0xed, 0xbc, 0xe3, 0xaf, 0x9c,\n                                                              0x1f, 0x3d, 0xa2, 0x5, 0x62, 0x71, 0x7e, 0x75,\n                                                              0x6e, 0x1b, 0x78, 0x77, 0x98, 0x98, 0x77, 0x1f,\n                                                              0x9c, 0x72, 0x72, 0x9d, 0x6f, 0x1b, 0x2d, 0x5d,\n                                                              0x3d, 0x60, 0x72, 0x1f, 0xfb, 0x44, 0xfc, 0x95,\n                                                              0x15, 0xf7, 0x8c, 0x6, 0x9c, 0xe7, 0x5, 0x3d,\n                                                              0x6, 0xb1, 0xf7, 0x56, 0x5, 0xb6, 0xc4, 0xd1,\n                                                              0xa1, 0xa7, 0x1b, 0xba, 0x9b, 0x7c, 0x75, 0x81,\n                                                              0x8a, 0x80, 0x89, 0x7f, 0x1f, 0x66, 0xfb, 0x51,\n                                                              0x5, 0x3f, 0x6, 0x78, 0x2f, 0x5, 0xf7, 0x88,\n                                                              0x6, 0x9d, 0xe7, 0x5, 0x40, 0x6, 0xb4, 0xf7,\n                                                              0x66, 0x5, 0x8e, 0x98, 0x8c, 0x97, 0x97, 0x1a,\n                                                              0xcd, 0x50, 0xb0, 0x42, 0x55, 0x4b, 0x6f, 0x70,\n                                                              0x5e, 0x1e, 0x94, 0xb5, 0x5, 0xfb, 0x40, 0x6,\n                                                              0x79, 0x2f, 0x8a, 0xa, 0x5a, 0xfb, 0x89, 0x5,\n                                                              0x3e, 0x6, 0xe, 0xf7, 0x29, 0xe6, 0xf7, 0x6,\n                                                              0xe6, 0x12, 0xf7, 0x4, 0xe9, 0x84, 0xe5, 0x9f,\n                                                              0xe7, 0x81, 0xe9, 0x13, 0xe8, 0xce, 0x5e, 0x15,\n                                                              0xe2, 0x6, 0xbf, 0xf7, 0x56, 0x5, 0xf2, 0x6,\n                                                              0x56, 0x98, 0xa, 0xea, 0x6, 0xbd, 0xf7, 0x56,\n                                                              0x5, 0xf7, 0x5, 0x34, 0xa, 0x21, 0x6, 0xab,\n                                                              0xf7, 0x6, 0x5, 0xed, 0x34, 0xa, 0x13, 0xd4,\n                                                              0x30, 0x6, 0xc1, 0xf7, 0x62, 0x5, 0x30, 0x6,\n                                                              0x52, 0xfb, 0x62, 0x5, 0x25, 0x6, 0xc2, 0xf7,\n                                                              0x62, 0x5, 0x32, 0x6, 0x53, 0xfb, 0x62, 0x5,\n                                                              0xfb, 0x5, 0x36, 0xa, 0xf6, 0x6, 0x6b, 0xfb,\n                                                              0x6, 0x5, 0x28, 0x36, 0xa, 0x13, 0xe8, 0xe3,\n                                                              0x6, 0xf7, 0xb, 0xe6, 0x15, 0xab, 0xf7, 0x6,\n                                                              0x5, 0xf3, 0x6, 0x6b, 0xfb, 0x6, 0x5, 0xe,\n                                                              0x7c, 0xeb, 0xf7, 0xa9, 0xeb, 0x1, 0xa4, 0xf1,\n                                                              0xf7, 0xef, 0xf0, 0x3, 0xa4, 0xf7, 0x3c, 0x15,\n                                                              0xfb, 0x1b, 0xf7, 0x17, 0x5b, 0xf4, 0xf7, 0x31,\n                                                              0xf7, 0x31, 0xe5, 0xf7, 0x4d, 0xee, 0x4b, 0xea,\n                                                              0xfb, 0x35, 0xfb, 0x2e, 0xfb, 0x3f, 0x22, 0xfb,\n                                                              0x49, 0x1e, 0xf1, 0x9b, 0x15, 0xf3, 0xe8, 0xd1,\n                                                              0xf6, 0xf7, 0x3, 0xaf, 0x51, 0x54, 0xfb, 0x5,\n                                                              0xfb, 0x1, 0x58, 0x33, 0x54, 0x2c, 0x9e, 0xdf,\n                                                              0x1e, 0xe, 0x5d, 0xa, 0xf7, 0x88, 0xf8, 0x77,\n                                                              0x15, 0xf7, 0xdf, 0xd8, 0x77, 0xf0, 0xfb, 0xd6,\n                                                              0xfb, 0xc, 0x5, 0xfb, 0x65, 0xfc, 0x12, 0x29,\n                                                              0xa, 0x63, 0xa, 0xf7, 0x71, 0x77, 0x45, 0xa,\n                                                              0xf7, 0x2b, 0xf8, 0x95, 0x15, 0xc0, 0x67, 0xf7,\n                                                              0x45, 0xf7, 0x0, 0xf7, 0x13, 0xfb, 0x0, 0xce,\n                                                              0xae, 0xfb, 0x18, 0xf7, 0x25, 0x4e, 0xa, 0xfb,\n                                                              0xd5, 0xfc, 0x86, 0x30, 0xa, 0xfb, 0x3, 0xfb,\n                                                              0x3a, 0x2d, 0xa, 0x63, 0xa, 0xcc, 0xf7, 0x10,\n                                                              0x45, 0xa, 0xf8, 0x21, 0xf8, 0x89, 0x72, 0xa,\n                                                              0xfb, 0x68, 0xfb, 0x10, 0x72, 0xa, 0xfb, 0x69,\n                                                              0xfc, 0x66, 0x29, 0xa, 0x7c, 0xea, 0xe0, 0xea,\n                                                              0xed, 0xeb, 0x1, 0x76, 0xef, 0x3, 0xf7, 0xab,\n                                                              0xc1, 0x15, 0x69, 0xa3, 0xa1, 0x68, 0xe7, 0x1b,\n                                                              0xc3, 0xbc, 0x99, 0xa0, 0xc6, 0x1f, 0x7e, 0xe7,\n                                                              0x5, 0x74, 0x46, 0x62, 0x82, 0x73, 0x1b, 0x4a,\n                                                              0x77, 0xb0, 0xa6, 0x94, 0x8c, 0x92, 0x8e, 0x90,\n                                                              0x1f, 0xf7, 0x8a, 0x6, 0x97, 0xad, 0x95, 0xb9,\n                                                              0xb8, 0x1a, 0xde, 0x6c, 0xdc, 0x2c, 0x5c, 0x5a,\n                                                              0x78, 0x68, 0x63, 0x1e, 0xb1, 0x71, 0x5c, 0x9b,\n                                                              0x58, 0x1b, 0xfb, 0x32, 0x29, 0xfb, 0x32, 0xfb,\n                                                              0x32, 0x44, 0xa8, 0x39, 0xf7, 0xe, 0xd2, 0xc1,\n                                                              0xb8, 0xa3, 0xa3, 0x1f, 0xe1, 0xf7, 0x62, 0x15,\n                                                              0xb3, 0x97, 0xb6, 0xc5, 0xbf, 0x1b, 0xd0, 0x7d,\n                                                              0x3f, 0x75, 0x88, 0x1f, 0xfc, 0x51, 0xfb, 0xc,\n                                                              0x15, 0xc2, 0xb1, 0xf7, 0x37, 0xea, 0xbb, 0x96,\n                                                              0x66, 0x6b, 0x41, 0x60, 0xfb, 0x1b, 0x38, 0x60,\n                                                              0x74, 0xa1, 0xb1, 0x1e, 0xe, 0xfb, 0x5b, 0xd4,\n                                                              0x1, 0xf7, 0x59, 0xe2, 0x3, 0xf7, 0xc9, 0x8a,\n                                                              0x15, 0x78, 0x2e, 0x56, 0x40, 0x64, 0xa5, 0x6c,\n                                                              0xb7, 0xa9, 0xa9, 0x97, 0xa0, 0xa5, 0x1f, 0xa7,\n                                                              0xdd, 0x5, 0x7b, 0x80, 0x64, 0x71, 0x72, 0x1b,\n                                                              0x7e, 0x82, 0x91, 0x9e, 0xb1, 0xe7, 0xba, 0xa6,\n                                                              0x9a, 0x1f, 0xe, 0x5d, 0xa, 0xf7, 0x6d, 0xf8,\n                                                              0xc3, 0x15, 0xf7, 0xc9, 0x3e, 0xae, 0xc6, 0xfb,\n                                                              0xab, 0xf7, 0xc, 0x5, 0xfb, 0x96, 0xfc, 0x8a,\n                                                              0x29, 0xa, 0x8b, 0xe8, 0x1, 0xf7, 0x9c, 0xeb,\n                                                              0x3, 0xcd, 0x16, 0xf8, 0x55, 0x94, 0xa, 0xfb,\n                                                              0x42, 0x6, 0xf5, 0xf8, 0x9f, 0xfb, 0xa3, 0x56,\n                                                              0x78, 0x30, 0xf7, 0x3f, 0xad, 0x38, 0xfc, 0x31,\n                                                              0x5, 0xfb, 0x47, 0x6, 0xe, 0x5d, 0xce, 0x4f,\n                                                              0x76, 0xf7, 0xb7, 0xcf, 0x8a, 0xd0, 0xf7, 0xba,\n                                                              0x77, 0x12, 0xc4, 0xcf, 0xf7, 0x7d, 0xce, 0xeb,\n                                                              0xcf, 0x13, 0xaf, 0xf7, 0xc6, 0x5d, 0x15, 0xf7,\n                                                              0x82, 0x6, 0x98, 0xce, 0x5, 0xfb, 0x1a, 0x6,\n                                                              0xf1, 0xd8, 0x5, 0xac, 0xa0, 0xaa, 0xb4, 0xb9,\n                                                              0x1a, 0xaf, 0x7b, 0xc4, 0x3b, 0x5f, 0x5e, 0x75,\n                                                              0x68, 0x68, 0x1e, 0x80, 0x4c, 0x5, 0xce, 0x6,\n                                                              0xa4, 0x90, 0x91, 0xa6, 0xb6, 0x1b, 0x9f, 0xa1,\n                                                              0x81, 0x75, 0x79, 0x7e, 0x73, 0x79, 0x7e, 0x1f,\n                                                              0xfb, 0x41, 0xfb, 0x19, 0x5, 0xfb, 0xfe, 0x77,\n                                                              0x15, 0x13, 0x5f, 0xc5, 0x58, 0xf9, 0xd, 0xf9,\n                                                              0x35, 0x4d, 0xbb, 0x5, 0xfd, 0xa, 0xfb, 0xff,\n                                                              0x15, 0xf7, 0x83, 0x6, 0x99, 0xd0, 0x5, 0x39,\n                                                              0x6, 0xbf, 0xf7, 0xa9, 0xfb, 0x22, 0x6e, 0x7e,\n                                                              0x46, 0xd4, 0x9a, 0x65, 0x98, 0xa, 0x32, 0x6,\n                                                              0xe, 0x5c, 0xc4, 0x5a, 0x76, 0xf7, 0x6, 0xca,\n                                                              0xf7, 0x48, 0xd0, 0xf7, 0xbb, 0x77, 0x12, 0x13,\n                                                              0xb8, 0xf7, 0x96, 0xc1, 0x15, 0xf7, 0x19, 0x6,\n                                                              0x84, 0x5f, 0x5, 0x52, 0x6, 0x80, 0x52, 0x5,\n                                                              0xf7, 0x37, 0x6, 0x96, 0xc4, 0x5, 0x63, 0x6,\n                                                              0x93, 0xb7, 0x5, 0xb3, 0x6, 0x98, 0xca, 0x5,\n                                                              0x63, 0x6, 0xac, 0xf7, 0x46, 0x5, 0x4c, 0x6,\n                                                              0xfb, 0x41, 0x98, 0xa, 0xdd, 0x9b, 0x15, 0xd0,\n                                                              0xdc, 0x7c, 0x3a, 0x5, 0xfc, 0x52, 0xfb, 0x12,\n                                                              0x15, 0x13, 0x78, 0xc6, 0x58, 0xf9, 0x9, 0xf9,\n                                                              0x34, 0x4c, 0xbc, 0x5, 0xfd, 0x9, 0xfc, 0x0,\n                                                              0x15, 0xf7, 0x82, 0x6, 0x99, 0xd0, 0x5, 0x38,\n                                                              0x6, 0xbf, 0xf7, 0xa8, 0xfb, 0x1f, 0x6e, 0x7e,\n                                                              0x47, 0xd2, 0x9a, 0x66, 0x98, 0xa, 0x32, 0x6,\n                                                              0xe, 0xf7, 0x70, 0xd7, 0xf7, 0xd4, 0x77, 0x1,\n                                                              0xf7, 0xa4, 0xda, 0x3, 0xf7, 0x29, 0xf7, 0x70,\n                                                              0x15, 0xf7, 0xb0, 0x6, 0x9c, 0xd7, 0x7b, 0xa,\n                                                              0xc9, 0xf7, 0xd4, 0xfb, 0x3b, 0x6a, 0x7b, 0x3f,\n                                                              0xe0, 0x9c, 0x60, 0xfb, 0x78, 0x5, 0x21, 0x6,\n                                                              0xe, 0xf7, 0x58, 0xde, 0xed, 0xda, 0xb4, 0xde,\n                                                              0x1, 0xf7, 0x17, 0xd8, 0x3, 0xf7, 0xd6, 0xf7,\n                                                              0x60, 0x15, 0xf7, 0x17, 0x6, 0x9a, 0xdd, 0x5,\n                                                              0x53, 0x6, 0xa4, 0xf7, 0x22, 0x5, 0x8f, 0xa1,\n                                                              0x8d, 0xa5, 0xa1, 0x1a, 0xc9, 0x51, 0x9f, 0x53,\n                                                              0x55, 0x4e, 0x7b, 0x7d, 0x67, 0x1e, 0x9a, 0x3c,\n                                                              0x5, 0x99, 0xb2, 0xc3, 0x97, 0xb1, 0x1b, 0xaa,\n                                                              0x98, 0x77, 0x6c, 0x87, 0x1f, 0x92, 0x75, 0x74,\n                                                              0x8e, 0x73, 0x1b, 0xfb, 0x13, 0x64, 0x32, 0x4b,\n                                                              0x51, 0xb2, 0x5a, 0xcb, 0xab, 0xae, 0xa0, 0xa7,\n                                                              0xa7, 0x1f, 0xa2, 0xf7, 0x12, 0x15, 0x63, 0x76,\n                                                              0x60, 0x57, 0x63, 0x1b, 0x69, 0x85, 0xa0, 0x9e,\n                                                              0xb3, 0xbd, 0x9d, 0xb2, 0xa1, 0xac, 0x85, 0x8b,\n                                                              0x1f, 0xe, 0xf7, 0x58, 0xde, 0xf7, 0x6e, 0xde,\n                                                              0x1, 0xf7, 0x10, 0xd9, 0xf7, 0x58, 0xd9, 0x3,\n                                                              0xf7, 0x10, 0xf8, 0x3, 0x15, 0x35, 0xbf, 0x36,\n                                                              0xe6, 0xf7, 0x3, 0xed, 0xf7, 0xa, 0xf7, 0x14,\n                                                              0xdc, 0x5e, 0xe9, 0x2b, 0xfb, 0x16, 0x3a, 0xfb,\n                                                              0x26, 0x23, 0x1e, 0xd9, 0x99, 0x15, 0xc5, 0xb3,\n                                                              0xea, 0xd7, 0xc4, 0xa2, 0x4b, 0x61, 0x41, 0x54,\n                                                              0x40, 0x4c, 0x56, 0x72, 0xc4, 0xb8, 0x1e, 0xe,\n                                                              0x7d, 0xea, 0x37, 0x76, 0xf8, 0x18, 0xea, 0x8f,\n                                                              0x77, 0x12, 0xac, 0xf0, 0xf7, 0xe4, 0xec, 0x13,\n                                                              0x6c, 0x94, 0xa7, 0x15, 0xba, 0x57, 0xc6, 0xbb,\n                                                              0x5, 0x13, 0x9c, 0x70, 0xb7, 0xc1, 0x80, 0xbb,\n                                                              0x1b, 0xf7, 0x14, 0xf7, 0x46, 0xea, 0xf7, 0x4e,\n                                                              0x1f, 0x8c, 0xaf, 0x83, 0xae, 0x78, 0xaa, 0xbd,\n                                                              0xb4, 0x18, 0x5d, 0xc0, 0x56, 0x60, 0x5, 0x13,\n                                                              0xac, 0xa3, 0x68, 0x5c, 0x9a, 0x4d, 0x1b, 0xfb,\n                                                              0x29, 0xfb, 0x3a, 0x20, 0xfb, 0x48, 0x63, 0x96,\n                                                              0x6a, 0x9d, 0x70, 0x1f, 0xf7, 0x20, 0xa1, 0x15,\n                                                              0xf7, 0x93, 0xf7, 0x64, 0x5, 0x93, 0x7d, 0x90,\n                                                              0x7b, 0x7b, 0x1a, 0xfb, 0x5, 0xfb, 0x3, 0x4d,\n                                                              0x39, 0x76, 0x6e, 0x8e, 0x95, 0x72, 0x1e, 0x53,\n                                                              0xb8, 0x15, 0x7e, 0xa0, 0x8c, 0xa5, 0x9f, 0x1a,\n                                                              0xe9, 0xf0, 0xcb, 0xe7, 0xab, 0xa4, 0x86, 0x82,\n                                                              0x9f, 0x1e, 0xe, 0x63, 0xa, 0xf7, 0x1e, 0x77,\n                                                              0xdd, 0x77, 0x45, 0xa, 0xf7, 0x1b, 0xf8, 0x95,\n                                                              0x15, 0xd9, 0x71, 0x5, 0xa0, 0x9c, 0x99, 0xb4,\n                                                              0xad, 0x1b, 0x9e, 0x9f, 0x81, 0x7e, 0x9f, 0x1f,\n                                                              0x7a, 0xa5, 0xa6, 0x78, 0xa9, 0x1b, 0xee, 0xbc,\n                                                              0xe3, 0xad, 0x9c, 0x1f, 0x3d, 0xa3, 0x5, 0x62,\n                                                              0x70, 0x7e, 0x76, 0x6e, 0x1b, 0x76, 0x77, 0x98,\n                                                              0x99, 0x76, 0x1f, 0x9b, 0x73, 0x72, 0x9c, 0x70,\n                                                              0x1b, 0x2c, 0x5d, 0x3d, 0x60, 0x73, 0x1f, 0xfb,\n                                                              0x3, 0xfb, 0xf6, 0x29, 0xa, 0xfb, 0x22, 0xe3,\n                                                              0xea, 0x76, 0xf7, 0xe1, 0xe3, 0x40, 0xe3, 0x12,\n                                                              0xb7, 0xe9, 0xf7, 0xf6, 0xee, 0x13, 0xdc, 0x67,\n                                                              0x90, 0xa, 0x9e, 0xe3, 0x85, 0xa, 0xa2, 0xf7,\n                                                              0x3, 0x5, 0x7d, 0x9d, 0xbd, 0x74, 0xdb, 0x1b,\n                                                              0xf7, 0x39, 0xf7, 0xf, 0xf7, 0x7, 0xf7, 0x24,\n                                                              0xf7, 0x7, 0x3b, 0xc7, 0xfb, 0x1, 0x54, 0x44,\n                                                              0x72, 0x6c, 0x5b, 0x1f, 0x13, 0xec, 0x94, 0xb6,\n                                                              0x3e, 0xa, 0x79, 0x33, 0x8a, 0xa, 0x35, 0xfc,\n                                                              0x2b, 0x5, 0xf7, 0x29, 0xf7, 0x8f, 0x15, 0x13,\n                                                              0xdc, 0xf7, 0xe, 0xf7, 0x18, 0xae, 0xc0, 0xce,\n                                                              0xba, 0x6a, 0x56, 0x39, 0x2f, 0x3a, 0x3d, 0x63,\n                                                              0x32, 0x99, 0xd9, 0x1e, 0xe, 0xf8, 0xba, 0xa9,\n                                                              0x1, 0xf7, 0xb, 0xbf, 0xea, 0xc0, 0x3, 0xf7,\n                                                              0xb, 0x45, 0x15, 0xbf, 0x6, 0xf7, 0x7a, 0xf9,\n                                                              0x0, 0x5, 0xea, 0x6, 0xfb, 0x7a, 0xfd, 0x0,\n                                                              0x5, 0xc0, 0x6, 0xf7, 0x78, 0xf9, 0x0, 0x5,\n                                                              0xc8, 0x6, 0x96, 0xa9, 0x5, 0xfb, 0x97, 0x6,\n                                                              0xfb, 0x4e, 0xfb, 0x55, 0x59, 0xfb, 0x2a, 0x47,\n                                                              0xce, 0x49, 0xf7, 0x4a, 0x81, 0x1f, 0xe, 0x3a,\n                                                              0x76, 0xf9, 0x62, 0x77, 0x1, 0xf7, 0x1d, 0xf2,\n                                                              0x3, 0xf7, 0x5b, 0x25, 0x15, 0xec, 0x6, 0x6e,\n                                                              0xd1, 0x70, 0xec, 0xf6, 0x1a, 0xf7, 0x46, 0xf7,\n                                                              0xe, 0xf7, 0x23, 0xf0, 0xf7, 0xf, 0x1e, 0x2b,\n                                                              0x6, 0xfb, 0x1a, 0xfb, 0x23, 0x2b, 0xfb, 0x26,\n                                                              0xfb, 0x46, 0x1a, 0x48, 0x98, 0x32, 0xbc, 0x2c,\n                                                              0x1e, 0xe, 0x3a, 0x76, 0xf9, 0x62, 0x77, 0x1,\n                                                              0xf7, 0xfc, 0xf2, 0x3, 0xf7, 0x1c, 0x25, 0x15,\n                                                              0xeb, 0x6, 0xf7, 0x1a, 0xf7, 0x23, 0xec, 0xf7,\n                                                              0x26, 0xf7, 0x46, 0x1a, 0xce, 0x7e, 0xe4, 0x5a,\n                                                              0xea, 0x1e, 0x2a, 0x6, 0xa8, 0x45, 0xa6, 0x2a,\n                                                              0x20, 0x1a, 0xfb, 0x46, 0xfb, 0xf, 0xfb, 0x23,\n                                                              0x26, 0xfb, 0xf, 0x1e, 0xe, 0x7c, 0xd1, 0xf7,\n                                                              0x1c, 0xd1, 0xda, 0xd1, 0xf7, 0x1c, 0xd1, 0x1,\n                                                              0xc3, 0xdc, 0xd5, 0xdc, 0x9b, 0xdc, 0xd5, 0xdc,\n                                                              0x3, 0xc3, 0xf8, 0x5a, 0x39, 0xa, 0xd5, 0xfb,\n                                                              0xfd, 0x39, 0xa, 0xfb, 0x69, 0xce, 0x15, 0xf8,\n                                                              0x5e, 0xf7, 0x4a, 0x7a, 0xcb, 0xfc, 0x5f, 0xfb,\n                                                              0x4c, 0x5, 0xe, 0x7c, 0xf7, 0x4e, 0x1, 0xf7,\n                                                              0x52, 0xf7, 0x6f, 0x3, 0xf7, 0x52, 0xcb, 0x15,\n                                                              0x68, 0xa3, 0x5f, 0xd1, 0xc7, 0xcc, 0xb2, 0xcf,\n                                                              0xb3, 0x6d, 0xb2, 0x4d, 0x4b, 0x4c, 0x60, 0x4b,\n                                                              0x1e, 0xe, 0xf7, 0x39, 0xf7, 0x4e, 0x1, 0xf7,\n                                                              0x56, 0xf7, 0x68, 0x3, 0xf7, 0x56, 0xf7, 0x87,\n                                                              0x15, 0x6c, 0x9f, 0x5c, 0xd3, 0xc9, 0xc5, 0xbc,\n                                                              0xc5, 0xb3, 0x72, 0xb2, 0x4c, 0x49, 0x51, 0x55,\n                                                              0x55, 0x1e, 0xe, 0x7c, 0xd1, 0xf7, 0x1b, 0xd1,\n                                                              0xdb, 0xd1, 0xf7, 0x1c, 0xd1, 0x1, 0x3f, 0xd9,\n                                                              0xab, 0xd9, 0xc2, 0xd7, 0xad, 0xd7, 0xa0, 0xd9,\n                                                              0xf7, 0x39, 0xd7, 0x3, 0x3f, 0xf8, 0x57, 0x49,\n                                                              0xa, 0xc0, 0x3a, 0xfb, 0xa, 0x42, 0x3c, 0x35,\n                                                              0x1e, 0xd9, 0x95, 0x15, 0xb7, 0xaf, 0xb4, 0xc8,\n                                                              0xb5, 0xa5, 0x72, 0x53, 0xa, 0x3f, 0xfb, 0xaa,\n                                                              0x15, 0xf8, 0x77, 0xf7, 0x4f, 0x7a, 0xc9, 0xfc,\n                                                              0x79, 0xfb, 0x50, 0x5, 0xf8, 0x67, 0xfb, 0x28,\n                                                              0x38, 0xa, 0xfc, 0x36, 0x81, 0x38, 0xa, 0xe,\n                                                              0xf7, 0x68, 0xe9, 0xf7, 0x40, 0x77, 0x1, 0xf7,\n                                                              0x62, 0xed, 0x3, 0xc6, 0xf7, 0x68, 0x15, 0xf7,\n                                                              0x4a, 0x6, 0x68, 0xfb, 0x3d, 0x56, 0xa, 0xae,\n                                                              0xf7, 0x3d, 0x5, 0xf7, 0x4b, 0x3f, 0xa, 0xfb,\n                                                              0x4a, 0x6, 0xae, 0xf7, 0x40, 0x4e, 0xa, 0x68,\n                                                              0xfb, 0x40, 0x5, 0xfb, 0x4b, 0x6, 0xe, 0xa9,\n                                                              0xdc, 0xf7, 0x43, 0xdc, 0xf7, 0x28, 0x77, 0x1,\n                                                              0xf7, 0x82, 0xed, 0x3, 0xf7, 0x82, 0xf7, 0x1e,\n                                                              0x15, 0xed, 0x6, 0xad, 0xf7, 0x28, 0x5, 0xf7,\n                                                              0x48, 0x6, 0x9e, 0xdc, 0x5, 0xfb, 0x48, 0x6,\n                                                              0xae, 0xf7, 0x28, 0x4e, 0xa, 0x69, 0xfb, 0x28,\n                                                              0x5, 0xfb, 0x47, 0x6, 0x78, 0x3a, 0x5, 0xf7,\n                                                              0x47, 0x6, 0xfb, 0x86, 0xfb, 0x9a, 0x15, 0xf8,\n                                                              0x5c, 0x6, 0x9e, 0xdc, 0x5, 0xfc, 0x5c, 0x6,\n                                                              0xe, 0x7c, 0xe9, 0xf7, 0x12, 0xe9, 0xf7, 0x3d,\n                                                              0xe9, 0x1, 0xf8, 0x89, 0xf1, 0x3, 0xf7, 0xdc,\n                                                              0xb0, 0x15, 0xc8, 0x57, 0xb5, 0xb7, 0x96, 0x7c,\n                                                              0x95, 0x7d, 0x90, 0x7c, 0x19, 0xf7, 0xa, 0x55,\n                                                              0xa, 0x3a, 0x6, 0x7d, 0xa0, 0xdb, 0xdd, 0x54,\n                                                              0xbf, 0x46, 0x46, 0x65, 0xc5, 0x5, 0xf7, 0xd,\n                                                              0x9e, 0xcb, 0xe1, 0xe8, 0x1a, 0xec, 0x39, 0xb7,\n                                                              0x23, 0x1e, 0xfb, 0xbc, 0x44, 0xa, 0xdd, 0x6,\n                                                              0x39, 0xfc, 0x19, 0x5, 0x34, 0x44, 0xa, 0xf7,\n                                                              0x9f, 0x3f, 0xa, 0x3b, 0x6, 0xa5, 0xf7, 0x12,\n                                                              0x5, 0xdf, 0x6, 0xd3, 0xfb, 0x4, 0x5, 0xfb,\n                                                              0x1c, 0xf7, 0x62, 0x15, 0xae, 0xf7, 0x3d, 0x5,\n                                                              0xf7, 0x1b, 0x6, 0xa3, 0xc6, 0x82, 0x5a, 0x2a,\n                                                              0x23, 0x7d, 0x58, 0x1f, 0xe, 0xfb, 0x22, 0xe3,\n                                                              0xd6, 0xe1, 0xf7, 0x8c, 0xe3, 0x3f, 0xe2, 0x12,\n                                                              0x81, 0xf1, 0x13, 0xe8, 0xf7, 0x4a, 0x90, 0xa,\n                                                              0xa0, 0xe3, 0x5, 0x3b, 0x6, 0xe3, 0xf8, 0x2d,\n                                                              0x5c, 0xa, 0x9f, 0xe3, 0x3e, 0xa, 0x7f, 0x5e,\n                                                              0x5, 0x13, 0xd8, 0xad, 0x69, 0x5c, 0xa1, 0x53,\n                                                              0x1b, 0xfb, 0x31, 0xfb, 0x21, 0xfb, 0xf, 0xfb,\n                                                              0x18, 0x29, 0xd7, 0x3b, 0xf7, 0x14, 0xc1, 0xc2,\n                                                              0x90, 0xa9, 0xbb, 0x1f, 0x75, 0xfb, 0x2, 0x5,\n                                                              0xfb, 0x81, 0xf7, 0x9c, 0x15, 0xe1, 0xdc, 0xd2,\n                                                              0xf0, 0xed, 0xa0, 0x49, 0x56, 0xfb, 0x11, 0xfb,\n                                                              0x1a, 0x7b, 0x5e, 0x46, 0x56, 0xb4, 0xc9, 0x1e,\n                                                              0xe, 0x7d, 0xf7, 0x2c, 0xf7, 0xf2, 0xe7, 0x1,\n                                                              0xeb, 0xf7, 0x54, 0xf7, 0x8, 0xef, 0x3, 0xf7,\n                                                              0x3d, 0xf7, 0x4a, 0x15, 0xed, 0x6, 0x98, 0xc5,\n                                                              0x5, 0xe3, 0x9a, 0xf7, 0x1c, 0xc2, 0xf7, 0x1a,\n                                                              0x1a, 0xe4, 0x3c, 0xba, 0xfb, 0x0, 0x53, 0x3c,\n                                                              0x7d, 0x77, 0x52, 0x1e, 0x6e, 0xfb, 0x24, 0x5,\n                                                              0xee, 0x6, 0x99, 0xd7, 0x5, 0x91, 0xa7, 0xa9,\n                                                              0x8f, 0xa7, 0x1b, 0xc6, 0xbd, 0x7a, 0x62, 0x30,\n                                                              0xfb, 0x2, 0x79, 0x28, 0x7c, 0x1f, 0x28, 0xfb,\n                                                              0x9e, 0x15, 0x6a, 0xae, 0x76, 0xba, 0xd8, 0xac,\n                                                              0xbd, 0xb6, 0xa2, 0x7b, 0xaf, 0x4c, 0x4a, 0x5b,\n                                                              0x5c, 0x58, 0x1e, 0xe, 0xfb, 0x26, 0xe8, 0xf7,\n                                                              0xf2, 0xf7, 0x2c, 0x1, 0xeb, 0xed, 0xf7, 0xc,\n                                                              0xf7, 0x52, 0x3, 0xf7, 0xce, 0xf8, 0x2, 0x15,\n                                                              0x78, 0x8a, 0x90, 0x59, 0xd6, 0x1b, 0xce, 0xb7,\n                                                              0xb8, 0xbb, 0xaf, 0x6a, 0xa2, 0x5b, 0x44, 0x65,\n                                                              0x5d, 0x66, 0x1f, 0x8e, 0xfb, 0x3e, 0x15, 0x4b,\n                                                              0x85, 0xfb, 0x31, 0x4a, 0xfb, 0x1b, 0x1a, 0x33,\n                                                              0xd9, 0x5b, 0xf6, 0xc1, 0xdf, 0x99, 0x9f, 0xc4,\n                                                              0x1e, 0xa7, 0xf7, 0x1a, 0x66, 0xa, 0x7d, 0x49,\n                                                              0x5, 0x86, 0x6e, 0x68, 0x87, 0x6e, 0x1b, 0x51,\n                                                              0x5b, 0x9c, 0xb4, 0xe7, 0xf7, 0x2, 0x9d, 0xec,\n                                                              0x9a, 0x1f, 0xa4, 0xf7, 0x13, 0x66, 0xa, 0xe,\n                                                              0xf8, 0xc6, 0x77, 0x1, 0xf7, 0x6, 0xf7, 0x4,\n                                                              0xd5, 0xf7, 0x2, 0x3, 0xf7, 0xc0, 0xf7, 0xa9,\n                                                              0x15, 0xf7, 0x2, 0x6, 0xd7, 0x71, 0xa, 0xfb,\n                                                              0x20, 0x6, 0xfb, 0x7c, 0xfb, 0xb1, 0x5a, 0xa,\n                                                              0xd7, 0x71, 0xa, 0xfb, 0x20, 0x6, 0xe, 0xfb,\n                                                              0x22, 0xf7, 0xb1, 0x1, 0xf7, 0x90, 0xfb, 0x22,\n                                                              0x15, 0xf7, 0x9, 0x80, 0xa, 0xfb, 0x31, 0x6,\n                                                              0xfc, 0x3, 0xfb, 0xb1, 0x15, 0xf7, 0x7, 0x6,\n                                                              0xf7, 0x57, 0x71, 0xa, 0xfb, 0x32, 0x6, 0xe,\n                                                              0xf7, 0x46, 0xf7, 0x5, 0xed, 0xf7, 0x5, 0x3,\n                                                              0xf8, 0x19, 0xf7, 0xa9, 0x6d, 0xa, 0x63, 0x71,\n                                                              0xa, 0xfb, 0x2d, 0x6, 0xfb, 0x17, 0xfb, 0xb1,\n                                                              0x6d, 0xa, 0x64, 0x71, 0xa, 0xfb, 0x2e, 0x6,\n                                                              0xe, 0xf7, 0xbe, 0x76, 0xf7, 0xb1, 0x77, 0x1,\n                                                              0xb1, 0xf7, 0x8, 0xee, 0xf7, 0xa, 0x3, 0xf7,\n                                                              0x91, 0xf7, 0xa9, 0x15, 0xf7, 0xa, 0x6, 0xf7,\n                                                              0x53, 0x71, 0xa, 0xfb, 0x32, 0x6, 0xfc, 0x2,\n                                                              0xfb, 0xb1, 0x15, 0xf7, 0x8, 0x80, 0xa, 0xfb,\n                                                              0x33, 0x6, 0xe, 0xf7, 0xa9, 0xf7, 0xb1, 0x1,\n                                                              0xf7, 0xaf, 0xf7, 0xa9, 0x5a, 0xa, 0x65, 0x71,\n                                                              0xa, 0xfb, 0x2c, 0x6, 0xe, 0xf7, 0xbe, 0x76,\n                                                              0xf7, 0xb1, 0x77, 0x1, 0xf7, 0x24, 0xf7, 0xa,\n                                                              0x3, 0xf7, 0x24, 0xf7, 0xa9, 0x15, 0xf7, 0xa,\n                                                              0x6, 0xf7, 0x56, 0x71, 0xa, 0xfb, 0x35, 0x6,\n                                                              0xe, 0xfb, 0xd, 0x76, 0xf7, 0xae, 0x77, 0x1,\n                                                              0xf7, 0x24, 0xf7, 0xb, 0x3, 0xf7, 0x24, 0xfb,\n                                                              0x22, 0x15, 0xf7, 0xb, 0x80, 0xa, 0xfb, 0x34,\n                                                              0x6, 0xe, 0xf7, 0xbb, 0x76, 0xf7, 0xb4, 0x77,\n                                                              0x1, 0xf7, 0x62, 0xf7, 0x5, 0x3, 0xf7, 0x62,\n                                                              0xf7, 0xa6, 0x6d, 0xa, 0xd6, 0xf7, 0xb4, 0x5,\n                                                              0xfb, 0x20, 0x6, 0xe, 0x7f, 0xa, 0xf7, 0x2b,\n                                                              0xee, 0x3, 0x9c, 0x16, 0xf8, 0x2c, 0x3f, 0xa,\n                                                              0xfb, 0x56, 0x6, 0xac, 0xf7, 0x2b, 0x5, 0xc2,\n                                                              0xcd, 0xcc, 0xc7, 0xdf, 0x1b, 0xa4, 0x8d, 0x81,\n                                                              0x72, 0x8a, 0x1f, 0xed, 0x99, 0x5, 0xcb, 0x8b,\n                                                              0xbe, 0x22, 0x41, 0x40, 0x53, 0x63, 0x4e, 0x1e,\n                                                              0x98, 0xdc, 0x5, 0xfb, 0x6b, 0x87, 0xa, 0xf7,\n                                                              0x7, 0x6, 0x58, 0xfb, 0x8f, 0x83, 0xa, 0xe,\n                                                              0x79, 0xb8, 0xf6, 0xf7, 0x37, 0xf2, 0xba, 0xe3,\n                                                              0xb8, 0x1, 0x84, 0xba, 0xf7, 0xe5, 0xba, 0xf7,\n                                                              0x1d, 0xb9, 0x3, 0x84, 0xf7, 0x6e, 0x15, 0xfb,\n                                                              0x1a, 0xf5, 0x25, 0xf7, 0x24, 0xf7, 0x4c, 0xf7,\n                                                              0x48, 0xf7, 0x3b, 0xf7, 0x51, 0xf7, 0x1d, 0x25,\n                                                              0xf4, 0xfb, 0x25, 0xfb, 0x4f, 0xfb, 0x48, 0xfb,\n                                                              0x3f, 0xfb, 0x53, 0x1e, 0xba, 0x9e, 0x15, 0xf7,\n                                                              0x32, 0xf7, 0x34, 0xf7, 0x20, 0xf7, 0x2b, 0xf7,\n                                                              0x13, 0xde, 0x2e, 0xfb, 0xc, 0xfb, 0x31, 0xfb,\n                                                              0x34, 0xfb, 0x1e, 0xfb, 0x2a, 0xfb, 0x12, 0x36,\n                                                              0xe6, 0xf7, 0xb, 0x1e, 0xf7, 0x18, 0x24, 0x15,\n                                                              0xbb, 0x6, 0xa5, 0xf7, 0x8, 0x5, 0xbf, 0x6,\n                                                              0xa6, 0xfb, 0x8, 0x5, 0xc5, 0x6, 0x6e, 0xf7,\n                                                              0x13, 0x5, 0xb6, 0x95, 0xa6, 0xb4, 0xc4, 0x1a,\n                                                              0xcf, 0x53, 0x95, 0x4e, 0x1e, 0x41, 0x6, 0xa1,\n                                                              0xfb, 0x2a, 0x15, 0x9b, 0xf2, 0x5, 0xbb, 0x6,\n                                                              0xa8, 0xa8, 0x83, 0x6f, 0x55, 0x61, 0x7e, 0x6c,\n                                                              0x1f, 0xe, 0xf8, 0x75, 0xc6, 0xda, 0xc6, 0x1,\n                                                              0xf7, 0x57, 0xc9, 0xdf, 0xca, 0x3, 0xf7, 0x57,\n                                                              0xf8, 0xc5, 0x15, 0x5e, 0xad, 0x68, 0xbd, 0xcf,\n                                                              0xc4, 0xc4, 0xcb, 0xb6, 0x69, 0xac, 0x5a, 0x49,\n                                                              0x4f, 0x54, 0x4d, 0x1e, 0xc9, 0x96, 0x15, 0xa5,\n                                                              0xa3, 0xa0, 0xa6, 0x9f, 0x98, 0x7f, 0x7a, 0x71,\n                                                              0x76, 0x73, 0x6f, 0x76, 0x7d, 0x99, 0x9d, 0x1e,\n                                                              0xe, 0x7a, 0xe6, 0xf4, 0xd9, 0xa0, 0xf7, 0x49,\n                                                              0x2b, 0xeb, 0x12, 0xf7, 0x2, 0xe9, 0xf7, 0x76,\n                                                              0xed, 0x13, 0xdc, 0xa9, 0x7a, 0x15, 0xed, 0x6,\n                                                              0x93, 0xb2, 0x5, 0x76, 0xb5, 0xbe, 0x79, 0xc0,\n                                                              0x1b, 0xf7, 0x1e, 0xf7, 0x0, 0xab, 0xf7, 0x1,\n                                                              0xe8, 0x33, 0xab, 0x40, 0x93, 0x1f, 0xfb, 0x5,\n                                                              0x96, 0x5b, 0x97, 0xac, 0x1a, 0xb6, 0xef, 0x92,\n                                                              0xa2, 0xb6, 0xb7, 0x7c, 0x75, 0xab, 0x1e, 0x13,\n                                                              0xec, 0x81, 0x5b, 0x56, 0xa, 0xaf, 0xf7, 0x49,\n                                                              0x4e, 0xa, 0x85, 0x69, 0x5, 0x9a, 0x66, 0x5f,\n                                                              0x9e, 0x5c, 0x1b, 0xfb, 0x13, 0x26, 0x5b, 0x24,\n                                                              0x2b, 0xf7, 0xf, 0x70, 0xd4, 0x85, 0x1f, 0xad,\n                                                              0x88, 0xe5, 0x83, 0x57, 0x1a, 0x67, 0x3e, 0x85,\n                                                              0x52, 0x45, 0x5d, 0xa3, 0x9c, 0x71, 0x1e, 0x98,\n                                                              0xc8, 0x7b, 0xa, 0xe, 0x7a, 0xe0, 0xf7, 0x57,\n                                                              0xf7, 0x40, 0x1, 0xe8, 0xe4, 0xf7, 0x6c, 0xe6,\n                                                              0x3, 0xf7, 0xc1, 0xf8, 0x79, 0x15, 0xeb, 0x6,\n                                                              0xf7, 0x4d, 0xf7, 0x25, 0x58, 0xb0, 0xfb, 0x3d,\n                                                              0xfb, 0x0, 0xfb, 0x10, 0xf7, 0x0, 0x48, 0x67,\n                                                              0x5, 0xfb, 0x2e, 0xfd, 0x1c, 0x15, 0xe8, 0x6,\n                                                              0x93, 0xb1, 0x5, 0x7b, 0xb4, 0xc2, 0x75, 0xbf,\n                                                              0x1b, 0xf7, 0x24, 0xda, 0xc1, 0xe3, 0xdd, 0x4c,\n                                                              0xaf, 0x38, 0x92, 0x1f, 0x26, 0x93, 0x4f, 0x91,\n                                                              0xaf, 0x1a, 0xbf, 0xe5, 0x8b, 0xa2, 0xb4, 0xb9,\n                                                              0x73, 0x7a, 0xa9, 0x1e, 0x82, 0x5e, 0x5, 0xe9,\n                                                              0x6, 0xad, 0xf7, 0x40, 0x5, 0x2e, 0x6, 0x84,\n                                                              0x6b, 0x5, 0x98, 0x68, 0x5d, 0x9e, 0x5e, 0x1b,\n                                                              0x28, 0xfb, 0x4, 0x72, 0xfb, 0x3, 0x8a, 0x1f,\n                                                              0x2a, 0xf7, 0x9, 0x6b, 0xd0, 0x85, 0x1e, 0xac,\n                                                              0x88, 0xe1, 0x8f, 0x60, 0x1a, 0x6a, 0x4a, 0x73,\n                                                              0x55, 0x48, 0x57, 0xac, 0x94, 0x74, 0x1e, 0x95,\n                                                              0xc6, 0x5, 0x2d, 0x6, 0xe, 0xfb, 0x62, 0xce,\n                                                              0xf7, 0xe, 0xf7, 0x57, 0x81, 0xe2, 0xa4, 0xf7,\n                                                              0x47, 0x12, 0xf7, 0x2, 0xe8, 0x9f, 0xcd, 0xf7,\n                                                              0x26, 0xed, 0x13, 0xde, 0xa9, 0x7a, 0x15, 0xed,\n                                                              0x6, 0x93, 0xb3, 0xa4, 0x81, 0xa9, 0x7e, 0xab,\n                                                              0x84, 0x19, 0x6b, 0x26, 0x5, 0x8e, 0x94, 0x9d,\n                                                              0x8e, 0x9a, 0x1b, 0x93, 0x94, 0x85, 0x81, 0x80,\n                                                              0x7e, 0x81, 0x7e, 0x81, 0x7e, 0x8f, 0x94, 0x7c,\n                                                              0x1f, 0x62, 0x55, 0x5, 0x73, 0xa6, 0x9e, 0x89,\n                                                              0x9d, 0x1b, 0xc6, 0xc5, 0xb3, 0xd0, 0xa1, 0x85,\n                                                              0xab, 0x67, 0x93, 0x1f, 0x90, 0x9d, 0x5, 0xf7,\n                                                              0x2b, 0x8a, 0xe0, 0xc4, 0xe8, 0x1a, 0x13, 0xbe,\n                                                              0xe1, 0x49, 0xb1, 0x34, 0x92, 0x1e, 0x21, 0x93,\n                                                              0x4c, 0x92, 0xb0, 0x1a, 0xc2, 0xea, 0x8a, 0xa3,\n                                                              0xb6, 0xbb, 0x73, 0x79, 0xaa, 0x1e, 0x82, 0x5c,\n                                                              0x56, 0xa, 0xb0, 0xf7, 0x47, 0x4e, 0xa, 0x84,\n                                                              0x69, 0x5, 0x99, 0x66, 0x5b, 0x9f, 0x5c, 0x1b,\n                                                              0x23, 0xfb, 0xa, 0x72, 0xfb, 0x9, 0x8a, 0x1f,\n                                                              0x26, 0xf7, 0xe, 0x69, 0xd4, 0x85, 0x1e, 0xad,\n                                                              0x88, 0xe5, 0x8f, 0x5e, 0x1a, 0x68, 0x47, 0x72,\n                                                              0x53, 0x44, 0x55, 0xae, 0x94, 0x73, 0x1e, 0x13,\n                                                              0xde, 0x95, 0xc9, 0x4e, 0xa, 0xe, 0x45, 0xe9,\n                                                              0xf8, 0x62, 0xe8, 0x1, 0xcc, 0xf2, 0xf7, 0x9b,\n                                                              0xf1, 0x3, 0xa6, 0x45, 0x15, 0xf7, 0x82, 0x6,\n                                                              0xe6, 0xe7, 0xa7, 0xdf, 0xa8, 0x85, 0x9d, 0x7c,\n                                                              0x9c, 0x1f, 0xad, 0x95, 0xc1, 0xbe, 0xc5, 0x1a,\n                                                              0x8a, 0xa6, 0x7d, 0xa3, 0x74, 0x9d, 0xfb, 0x6c,\n                                                              0xf7, 0x41, 0x18, 0x8b, 0x88, 0x8e, 0x8f, 0x1a,\n                                                              0x96, 0x9c, 0x8c, 0x91, 0x1e, 0xf7, 0x3c, 0x6,\n                                                              0x79, 0x35, 0x5, 0xf1, 0x6, 0xb2, 0xf7, 0x48,\n                                                              0xfb, 0x88, 0x8a, 0x5, 0x32, 0x37, 0x76, 0x38,\n                                                              0x6f, 0x96, 0x75, 0x9d, 0x78, 0x1f, 0x56, 0x76,\n                                                              0x68, 0x60, 0x5c, 0x1a, 0x6b, 0x9d, 0x68, 0xb2,\n                                                              0x6c, 0x1e, 0xf7, 0x42, 0xfb, 0x1e, 0x5, 0x9c,\n                                                              0x7d, 0x8d, 0x88, 0x83, 0x1a, 0x82, 0x7b, 0x8a,\n                                                              0x87, 0x1e, 0xfb, 0x45, 0x6, 0x9e, 0xe3, 0x5,\n                                                              0x24, 0x6, 0xf7, 0xb7, 0xc3, 0x15, 0xfb, 0x1f,\n                                                              0xf7, 0x1, 0x5, 0x82, 0x92, 0x87, 0x97, 0x97,\n                                                              0x1a, 0xa0, 0xab, 0x95, 0x99, 0x92, 0x1e, 0xf7,\n                                                              0x30, 0xfb, 0xd, 0x5, 0x92, 0x86, 0x8d, 0x83,\n                                                              0x82, 0x1a, 0x71, 0x61, 0x84, 0x7a, 0x89, 0x1e,\n                                                              0xe, 0x31, 0x76, 0xf7, 0xfc, 0xf7, 0x44, 0x1,\n                                                              0xf7, 0xa5, 0xf7, 0x6d, 0x3, 0xf7, 0xa5, 0xf7,\n                                                              0xd6, 0x15, 0x6e, 0x9f, 0x5f, 0xd3, 0xce, 0xc5,\n                                                              0xbc, 0xc6, 0xae, 0x6e, 0xac, 0x4e, 0x45, 0x52,\n                                                              0x58, 0x57, 0x1e, 0xfb, 0x38, 0xfc, 0x45, 0x15,\n                                                              0xf7, 0x12, 0x6, 0xf7, 0x5d, 0xf7, 0xac, 0x5,\n                                                              0xfb, 0x3b, 0x6, 0xe, 0xa0, 0x76, 0xf8, 0x39,\n                                                              0xf7, 0x48, 0x1, 0xf4, 0xf5, 0x3, 0xf4, 0x16,\n                                                              0xf5, 0x6, 0xf7, 0xcc, 0xf8, 0xa9, 0x99, 0xcf,\n                                                              0x5, 0xfc, 0x4a, 0x6, 0x66, 0xfb, 0x48, 0x56,\n                                                              0xa, 0x9d, 0xe2, 0x5, 0xf7, 0x80, 0x6, 0xe,\n                                                              0x7c, 0xe6, 0xf7, 0x74, 0xe8, 0xf7, 0x1e, 0xdf,\n                                                              0x8a, 0x77, 0x12, 0xf8, 0x3, 0xed, 0x13, 0xe8,\n                                                              0xf7, 0x48, 0xf7, 0xfb, 0x15, 0xf7, 0x19, 0xda,\n                                                              0xf7, 0x6, 0xb2, 0xf7, 0x33, 0x1b, 0x13, 0xd8,\n                                                              0xa5, 0xde, 0x5, 0x13, 0xe8, 0x75, 0x69, 0x8c,\n                                                              0x5b, 0x1b, 0xfb, 0x5d, 0x8c, 0xfb, 0x67, 0xfb,\n                                                              0x50, 0xfb, 0x89, 0x1a, 0x20, 0xd3, 0x30, 0xf7,\n                                                              0xc, 0xf7, 0x7, 0xf7, 0x8, 0xf7, 0x7, 0xf7,\n                                                              0x8, 0xe3, 0x5b, 0xe4, 0xfb, 0x6, 0x56, 0x73,\n                                                              0x7f, 0x75, 0x5d, 0x1e, 0x65, 0xfb, 0x1c, 0x15,\n                                                              0x8b, 0xc0, 0xd8, 0xdf, 0xd3, 0x9b, 0x53, 0x60,\n                                                              0x40, 0x46, 0x59, 0x51, 0x41, 0x65, 0xe0, 0xc9,\n                                                              0x99, 0x1e, 0xe, 0xf9, 0x6, 0x77, 0x1, 0xab,\n                                                              0xf8, 0x69, 0x3, 0xab, 0x5d, 0x15, 0xcb, 0x6c,\n                                                              0xf8, 0x6b, 0xf9, 0x32, 0x49, 0xac, 0x5, 0xe,\n                                                              0xe, 0x84, 0x76, 0xb0, 0x76, 0xf7, 0xaa, 0xe8,\n                                                              0xf7, 0x33, 0xe8, 0x12, 0xf7, 0x21, 0xea, 0x36,\n                                                              0xed, 0x13, 0xb8, 0x52, 0xa, 0x13, 0x74, 0x3d,\n                                                              0xa, 0x7b, 0x7d, 0x87, 0x81, 0x7e, 0x1f, 0xb6,\n                                                              0xc1, 0xa0, 0xbb, 0xd1, 0x1a, 0xf7, 0x69, 0x89,\n                                                              0xa, 0xfb, 0x84, 0x6, 0x13, 0xb8, 0x86, 0x9b,\n                                                              0x8a, 0x9b, 0x9a, 0x1a, 0xcb, 0xc9, 0x47, 0xa,\n                                                              0x21, 0x3e, 0xfb, 0x10, 0x7a, 0x89, 0x7a, 0x8d,\n                                                              0x7a, 0x1f, 0x3b, 0x82, 0xa, 0x13, 0xb4, 0xf7,\n                                                              0x1, 0x6, 0x8a, 0x2e, 0x59, 0x33, 0x43, 0x5a,\n                                                              0x8, 0xe, 0x7c, 0xe7, 0xf7, 0x96, 0xe8, 0xf7,\n                                                              0x1a, 0x77, 0x1, 0xf4, 0xf7, 0xe3, 0x15, 0xd1,\n                                                              0x6, 0x62, 0x98, 0xa, 0x88, 0x7b, 0x89, 0x7e,\n                                                              0x7e, 0x1a, 0x29, 0xe9, 0x7b, 0xcf, 0xe0, 0xe6,\n                                                              0xab, 0xa6, 0xda, 0x1e, 0x8e, 0xe7, 0x5, 0x7c,\n                                                              0x5f, 0xfb, 0xc, 0x5f, 0x43, 0x1b, 0x53, 0x76,\n                                                              0x9f, 0xa4, 0x98, 0x8d, 0x99, 0x8e, 0x99, 0x1f,\n                                                              0xb2, 0xf7, 0x40, 0x5, 0xf7, 0x91, 0x89, 0xa,\n                                                              0xfb, 0x93, 0x6, 0xa9, 0xf7, 0x1a, 0x5, 0x23,\n                                                              0x6, 0x6f, 0xfb, 0x1a, 0x5, 0x44, 0x6, 0xe,\n                                                              0xfb, 0x22, 0xe4, 0xd5, 0xe4, 0xf7, 0xa6, 0xe5,\n                                                              0xca, 0xe4, 0x1, 0xd5, 0xe9, 0xf7, 0xfd, 0xed,\n                                                              0x3, 0x85, 0x56, 0x15, 0x77, 0x32, 0x5, 0xf7,\n                                                              0xd7, 0x6, 0x9e, 0xe4, 0x85, 0xa, 0xa9, 0xf7,\n                                                              0x18, 0x5, 0x7c, 0x9c, 0xb7, 0x60, 0xdb, 0x1b,\n                                                              0xf7, 0x2d, 0xf7, 0x1b, 0xf7, 0x13, 0xf7, 0x24,\n                                                              0xf7, 0xa, 0xfb, 0x1, 0xbf, 0x30, 0x55, 0x52,\n                                                              0x84, 0x6c, 0x5c, 0x1f, 0xb6, 0xf7, 0x5e, 0x5,\n                                                              0xfb, 0x45, 0x6, 0x78, 0x32, 0x5, 0xdd, 0x6,\n                                                              0xfb, 0x10, 0xfc, 0xe2, 0x5, 0xf7, 0x2e, 0xf7,\n                                                              0xa3, 0x15, 0xf7, 0x13, 0xf7, 0x10, 0xa6, 0xc3,\n                                                              0xce, 0xc1, 0x67, 0x49, 0x2f, 0x2e, 0x47, 0x36,\n                                                              0x64, 0x38, 0xa6, 0xdc, 0x8a, 0x1e, 0xe, 0x7c,\n                                                              0xe8, 0xf7, 0x2b, 0xe9, 0xf7, 0x5b, 0xe9, 0x12,\n                                                              0xf8, 0x3c, 0xef, 0x3f, 0xf0, 0x13, 0xf0, 0xbd,\n                                                              0xb3, 0x15, 0x79, 0xba, 0xd0, 0x66, 0xee, 0x1b,\n                                                              0xf7, 0x0, 0xf7, 0x2b, 0xc6, 0xf7, 0x31, 0xcb,\n                                                              0x6b, 0xa7, 0x66, 0xa9, 0x1f, 0x13, 0xe8, 0xb2,\n                                                              0x9f, 0xc2, 0xc8, 0xd4, 0x1a, 0xe0, 0x44, 0xc1,\n                                                              0x2b, 0x3f, 0x47, 0x68, 0x65, 0x47, 0x1e, 0xac,\n                                                              0x42, 0x5, 0xb2, 0xdb, 0xb1, 0x98, 0xb6, 0x1b,\n                                                              0xaf, 0xbb, 0x7c, 0x60, 0x29, 0xfb, 0xc, 0x5f,\n                                                              0x50, 0x8c, 0x1f, 0x78, 0x2d, 0x5, 0x13, 0xf0,\n                                                              0xdd, 0xe7, 0xaa, 0x50, 0x3f, 0x3b, 0x5c, 0x44,\n                                                              0x57, 0x6d, 0x95, 0xab, 0x34, 0x1f, 0xe, 0x5e,\n                                                              0xc4, 0x58, 0x76, 0xf7, 0x9, 0xca, 0xf7, 0x3d,\n                                                              0xce, 0xe6, 0xcb, 0x4b, 0xf7, 0x57, 0x49, 0x77,\n                                                              0xf4, 0x77, 0x12, 0x13, 0xbb, 0xf7, 0x98, 0xc4,\n                                                              0x15, 0xf7, 0x19, 0x6, 0x82, 0x5e, 0x5, 0x52,\n                                                              0x6, 0x80, 0x52, 0x5, 0xf7, 0x39, 0x6, 0x96,\n                                                              0xc4, 0x5, 0x62, 0x6, 0x93, 0xb8, 0x5, 0xb5,\n                                                              0x6, 0x97, 0xca, 0x5, 0x62, 0x6, 0xae, 0xf7,\n                                                              0x46, 0x5, 0x4a, 0x6, 0xfb, 0x41, 0x98, 0xa,\n                                                              0xdc, 0x9b, 0x15, 0xd0, 0xda, 0x7d, 0x3c, 0x5,\n                                                              0xfc, 0x56, 0xfb, 0x12, 0x15, 0x13, 0x7b, 0xc6,\n                                                              0x55, 0xf9, 0xb, 0xf9, 0x34, 0x4d, 0xbc, 0x5,\n                                                              0xfc, 0xfd, 0xfb, 0xe6, 0x15, 0x71, 0xbc, 0xaa,\n                                                              0x83, 0xad, 0x1b, 0xdf, 0xce, 0xc7, 0xd2, 0x1f,\n                                                              0x8c, 0xa4, 0x82, 0xa3, 0x79, 0x9c, 0x8, 0x9b,\n                                                              0x95, 0xa0, 0xaf, 0xa9, 0x1a, 0x13, 0xb4, 0xba,\n                                                              0x6b, 0xac, 0x51, 0x5f, 0x61, 0x77, 0x72, 0x64,\n                                                              0x1e, 0xa5, 0x51, 0x5, 0x13, 0xbb, 0x9b, 0xa7,\n                                                              0xad, 0xa0, 0xa9, 0x1b, 0x98, 0x9a, 0x86, 0x78,\n                                                              0x6e, 0x71, 0x7f, 0x73, 0x1f, 0x5c, 0x8c, 0x7e,\n                                                              0x4a, 0x5, 0xc3, 0x6, 0xac, 0x96, 0x7a, 0x78,\n                                                              0x6d, 0x70, 0x72, 0x67, 0x65, 0x70, 0x9a, 0x9a,\n                                                              0x6e, 0x1f, 0xe, 0xf7, 0x72, 0xd6, 0xf0, 0xd4,\n                                                              0xf7, 0x25, 0x77, 0x1, 0xf8, 0x5, 0xdd, 0x3,\n                                                              0xf7, 0x1a, 0xf7, 0x98, 0x15, 0x6f, 0xc5, 0xb0,\n                                                              0x81, 0xb4, 0x1b, 0xe8, 0xe3, 0xcc, 0xd8, 0x1f,\n                                                              0x8d, 0xa9, 0x81, 0xa7, 0x74, 0x9e, 0x8, 0x9f,\n                                                              0x97, 0xa5, 0xb3, 0xae, 0x1a, 0xbe, 0x62, 0xb0,\n                                                              0x46, 0x57, 0x5a, 0x74, 0x6f, 0x5a, 0x1e, 0xaa,\n                                                              0x4b, 0x5, 0x9d, 0xad, 0xb3, 0xa2, 0xb0, 0x1b,\n                                                              0x99, 0x9e, 0x84, 0x79, 0x8c, 0x1f, 0x69, 0x69,\n                                                              0x7f, 0x6b, 0x1e, 0x58, 0x6, 0x7c, 0x42, 0x5,\n                                                              0xcd, 0x6, 0xb2, 0x99, 0x79, 0x76, 0x68, 0x69,\n                                                              0x70, 0x62, 0x1f, 0x89, 0x6, 0x60, 0x69, 0x9c,\n                                                              0x9b, 0x69, 0x1f, 0xe, 0xf8, 0x84, 0xdb, 0x1,\n                                                              0xda, 0xf8, 0x4e, 0x3, 0xda, 0xf8, 0x99, 0x15,\n                                                              0xd8, 0x73, 0x5, 0xa1, 0x9d, 0x9e, 0xb5, 0xae,\n                                                              0x1b, 0xa0, 0x9f, 0x7d, 0x7b, 0xa0, 0x1f, 0x7c,\n                                                              0xa0, 0xa2, 0x7b, 0xa4, 0x1b, 0xec, 0xbb, 0xdf,\n                                                              0xad, 0x9c, 0x1f, 0x3e, 0xa1, 0x5, 0x63, 0x71,\n                                                              0x7f, 0x77, 0x6f, 0x1b, 0x78, 0x78, 0x96, 0x98,\n                                                              0x77, 0x1f, 0x9b, 0x72, 0x71, 0x9d, 0x6f, 0x1b,\n                                                              0x2e, 0x5f, 0x40, 0x61, 0x72, 0x1f, 0xe, 0xf8,\n                                                              0x95, 0xbc, 0x12, 0xad, 0xbf, 0xf7, 0x14, 0xbe,\n                                                              0xf7, 0x43, 0xcb, 0x6e, 0xbe, 0x13, 0xf0, 0xf7,\n                                                              0x6a, 0xf7, 0x7a, 0x15, 0xbe, 0x6, 0xc8, 0xf7,\n                                                              0xc0, 0x98, 0xfb, 0xc0, 0x5, 0xcd, 0x6, 0xf7,\n                                                              0x16, 0xf7, 0xbf, 0x5, 0x13, 0xe8, 0x4f, 0xfb,\n                                                              0xbf, 0x5, 0xbe, 0x6, 0xcf, 0xf7, 0xe0, 0x7a,\n                                                              0xa, 0xfb, 0x5, 0xfb, 0xa1, 0x82, 0xf7, 0xa1,\n                                                              0x5, 0x2e, 0x6, 0xfb, 0x8d, 0xfb, 0xe0, 0x15,\n                                                              0xbf, 0x6, 0xc4, 0xf7, 0xaf, 0x5, 0xe3, 0x6,\n                                                              0x96, 0xbc, 0x5, 0xfb, 0x77, 0x6, 0x81, 0x5a,\n                                                              0x5, 0xe2, 0x6, 0xe, 0xe9, 0x77, 0xf8, 0x55,\n                                                              0xe8, 0x1, 0xf7, 0x1e, 0xee, 0xf7, 0x7a, 0xee,\n                                                              0x3, 0xad, 0x16, 0xf8, 0x49, 0x6, 0xad, 0xf7,\n                                                              0x35, 0x5, 0x2d, 0x6, 0x7d, 0x48, 0x5, 0xfb,\n                                                              0x4e, 0x6, 0xf7, 0x2e, 0xf7, 0x5, 0x5, 0xf7,\n                                                              0x0, 0xda, 0xe8, 0xc9, 0xf7, 0xe, 0x1a, 0xdb,\n                                                              0x51, 0xcd, 0xfb, 0xd, 0x39, 0x45, 0x77, 0x36,\n                                                              0x3c, 0x1e, 0x79, 0x33, 0x5, 0xee, 0x6, 0xf1,\n                                                              0x9b, 0xf6, 0x89, 0x91, 0x1b, 0xc1, 0xba, 0x6f,\n                                                              0x57, 0x53, 0x6c, 0x6a, 0x45, 0x57, 0x1f, 0xfb,\n                                                              0xd1, 0xfb, 0x74, 0x5, 0xe, 0xf7, 0x70, 0xd6,\n                                                              0xf7, 0x88, 0xd8, 0x1, 0xf7, 0x50, 0xde, 0xf7,\n                                                              0xc, 0xde, 0x3, 0xf7, 0x11, 0xf7, 0x70, 0x15,\n                                                              0xf7, 0xb8, 0x6, 0x9b, 0xd6, 0x5, 0xfb, 0x38,\n                                                              0x6, 0xf7, 0x14, 0xea, 0x5, 0xae, 0xa3, 0xb5,\n                                                              0xba, 0xbe, 0x1a, 0xb4, 0x75, 0xca, 0x2b, 0x55,\n                                                              0x55, 0x72, 0x62, 0x5f, 0x1e, 0x7b, 0x3b, 0x5,\n                                                              0xde, 0x6, 0x8e, 0x96, 0x5, 0x9c, 0x8f, 0x94,\n                                                              0xb4, 0xc0, 0x1b, 0xa1, 0xa8, 0x85, 0x6f, 0x71,\n                                                              0x80, 0x78, 0x71, 0x79, 0x1f, 0xfb, 0x6c, 0xfb,\n                                                              0x27, 0x5, 0xe, 0x7c, 0xe8, 0x3a, 0xea, 0xf7,\n                                                              0x90, 0xea, 0x12, 0x13, 0xa0, 0xb2, 0xf7, 0xec,\n                                                              0x15, 0xdc, 0x6, 0x67, 0xfb, 0x4d, 0x5, 0x85,\n                                                              0x74, 0x89, 0x76, 0x79, 0x1a, 0x37, 0xd0, 0x6f,\n                                                              0xde, 0xbe, 0xc0, 0xa7, 0xa5, 0xb7, 0x1e, 0x13,\n                                                              0x60, 0x81, 0x61, 0x5, 0xf7, 0x43, 0x6, 0x9e,\n                                                              0xea, 0x5, 0x3b, 0x6, 0xd0, 0xf7, 0xef, 0x8f,\n                                                              0xa, 0x6, 0x78, 0x2c, 0x5, 0xda, 0x6, 0x65,\n                                                              0x98, 0xa, 0x13, 0xa0, 0x6b, 0x63, 0x5b, 0x63,\n                                                              0x4d, 0x1b, 0x54, 0x7a, 0xa4, 0xa2, 0x97, 0x8c,\n                                                              0x96, 0x8c, 0x93, 0x1f, 0xc3, 0xf7, 0xae, 0x43,\n                                                              0xa, 0x67, 0xa, 0xf7, 0x78, 0xf8, 0x75, 0x15,\n                                                              0xf7, 0xe9, 0xd9, 0x76, 0xf1, 0xfb, 0xde, 0xfb,\n                                                              0xb, 0x5, 0xfb, 0x47, 0xfb, 0x53, 0x15, 0xdc,\n                                                              0x6, 0x67, 0xfb, 0x5b, 0x5, 0x8a, 0x78, 0x84,\n                                                              0x26, 0xa, 0x57, 0xa, 0xf7, 0x6b, 0x77, 0x12,\n                                                              0x13, 0xb0, 0xf7, 0x52, 0xf8, 0x70, 0x15, 0xf7,\n                                                              0x44, 0xf7, 0x0, 0xf7, 0x14, 0xfb, 0x0, 0xcc,\n                                                              0xb0, 0xfb, 0x16, 0xf7, 0x24, 0x4e, 0xa, 0xfb,\n                                                              0x57, 0xfb, 0x23, 0x5, 0x2a, 0xfb, 0x37, 0x27,\n                                                              0xa, 0x57, 0xa, 0xc6, 0xf7, 0x10, 0x12, 0x13,\n                                                              0xb0, 0xf8, 0xe, 0xf8, 0x89, 0x92, 0xa, 0xa3,\n                                                              0xf7, 0x10, 0x86, 0xa, 0xfb, 0x62, 0xfb, 0x10,\n                                                              0x92, 0xa, 0xa4, 0xf7, 0x10, 0x4c, 0xa, 0xfb,\n                                                              0x4b, 0xfb, 0xa6, 0x27, 0xa, 0x67, 0xa, 0xf7,\n                                                              0x5d, 0xf8, 0xc6, 0x15, 0xf7, 0xbf, 0x3b, 0xae,\n                                                              0xc6, 0xfb, 0xa3, 0xf7, 0xc, 0x5, 0xfb, 0x75,\n                                                              0xfb, 0xca, 0x27, 0xa, 0xfb, 0x11, 0xbd, 0x1,\n                                                              0x90, 0x40, 0x15, 0x81, 0x59, 0x5, 0xf8, 0xed,\n                                                              0x6, 0x95, 0xbd, 0x5, 0xe, 0xa0, 0x76, 0xf7,\n                                                              0xed, 0xe9, 0x1, 0xf7, 0x4d, 0xdb, 0x3, 0xf7,\n                                                              0x4d, 0x16, 0xdb, 0x6, 0xf7, 0x87, 0xf7, 0xed,\n                                                              0x5, 0xe0, 0x3f, 0xa, 0xfb, 0x87, 0x87, 0xa,\n                                                              0xc7, 0x6, 0xfb, 0x34, 0xfb, 0x82, 0x44, 0xf7,\n                                                              0x82, 0x5, 0xce, 0x55, 0xa, 0xfb, 0x98, 0x44,\n                                                              0xa, 0xe1, 0x6, 0xe, 0xa0, 0x76, 0xf7, 0xed,\n                                                              0xe9, 0x1, 0xf7, 0x24, 0x16, 0xf7, 0x9, 0xf7,\n                                                              0x67, 0xb8, 0xfb, 0x67, 0x5, 0xd7, 0x6, 0xf7,\n                                                              0x47, 0xf7, 0xed, 0x5, 0xbc, 0x3f, 0xa, 0xfb,\n                                                              0x67, 0x44, 0xa, 0xd2, 0x6, 0x2b, 0xfb, 0x4d,\n                                                              0x5f, 0xf7, 0x65, 0x5, 0x48, 0x6, 0xfb, 0xc,\n                                                              0xfb, 0x65, 0x72, 0xf7, 0x4d, 0x5, 0xd1, 0x55,\n                                                              0xa, 0xfb, 0x6e, 0x44, 0xa, 0xbc, 0x6, 0xb8,\n                                                              0xfb, 0xed, 0x5, 0xe, 0x7f, 0xa, 0xd6, 0xf7,\n                                                              0x15, 0xf7, 0x39, 0xf7, 0x1a, 0x3, 0x6b, 0x16,\n                                                              0xf7, 0x8b, 0x55, 0xa, 0x6c, 0x6, 0xe7, 0xce,\n                                                              0xd4, 0x48, 0x5, 0x6f, 0x6f, 0xa, 0xf7, 0x8c,\n                                                              0x3f, 0xa, 0x36, 0x6, 0xfb, 0x17, 0xf7, 0x11,\n                                                              0xf7, 0x30, 0xf7, 0x12, 0x5, 0xe0, 0x3f, 0xa,\n                                                              0xfb, 0x79, 0x44, 0xa, 0x9d, 0x6, 0x3a, 0x48,\n                                                              0x5c, 0xce, 0x5, 0xa0, 0x3f, 0xa, 0xfb, 0x85,\n                                                              0x44, 0xa, 0xe2, 0x6, 0xef, 0xfb, 0x14, 0xfb,\n                                                              0x3a, 0xfb, 0xf, 0x5, 0x33, 0x6, 0xe, 0xfb,\n                                                              0x22, 0xe3, 0xf8, 0x29, 0xe3, 0x1, 0xe3, 0xf7,\n                                                              0x3, 0xf7, 0x8f, 0xf7, 0x1, 0x3, 0x67, 0x55,\n                                                              0x15, 0x76, 0x33, 0x5, 0xf7, 0xc0, 0x6, 0xa0,\n                                                              0xe3, 0x5, 0x45, 0x6, 0xf8, 0x1, 0xf8, 0x29,\n                                                              0x5c, 0xa, 0x9f, 0xe3, 0x5, 0xfb, 0x7f, 0x6,\n                                                              0x77, 0x33, 0x5, 0xbb, 0x6, 0xfb, 0x3c, 0xfb,\n                                                              0x4d, 0x38, 0xf7, 0x4d, 0x5, 0xbd, 0x6, 0x9f,\n                                                              0xe3, 0x5, 0xfb, 0x83, 0x6, 0x77, 0x33, 0x5c,\n                                                              0xa, 0xf7, 0xb, 0xfb, 0xa0, 0xfb, 0x11, 0xfb,\n                                                              0x1d, 0x5, 0xe, 0xfb, 0x22, 0xe2, 0xf8, 0x25,\n                                                              0xe3, 0x1, 0xe2, 0xf7, 0x4, 0xf7, 0x8e, 0xf7,\n                                                              0x2, 0x3, 0xf7, 0x8c, 0xf8, 0x7f, 0x15, 0xf7,\n                                                              0xec, 0xd4, 0x76, 0xec, 0xfb, 0xe2, 0xfb, 0x6,\n                                                              0x5, 0xfb, 0xa5, 0xfc, 0xee, 0x6b, 0xa, 0xf8,\n                                                              0x1, 0xf8, 0x25, 0x5, 0xd9, 0x84, 0xa, 0xfb,\n                                                              0x80, 0x6, 0x77, 0x34, 0x5, 0xbb, 0x6, 0xfb,\n                                                              0x40, 0xfb, 0x4a, 0x4d, 0xa, 0xfb, 0x9d, 0xfb,\n                                                              0xe, 0xfb, 0x1d, 0x5, 0xe, 0xfb, 0x22, 0xe2,\n                                                              0xf8, 0x26, 0xe2, 0xd4, 0xf7, 0xa, 0x1, 0xe2,\n                                                              0xf7, 0x4, 0xf7, 0x8f, 0xf7, 0x2, 0x3, 0xf8,\n                                                              0x24, 0xf8, 0x8f, 0x15, 0xf7, 0x9, 0x6, 0xa4,\n                                                              0xf7, 0xa, 0x5, 0xfb, 0x8, 0x6, 0xfb, 0x6b,\n                                                              0xfb, 0xa, 0x15, 0xf7, 0x8, 0x6, 0xa5, 0xf7,\n                                                              0xa, 0x5, 0xfb, 0x8, 0x6, 0xfb, 0xa5, 0xfd,\n                                                              0x3c, 0x6b, 0xa, 0xf8, 0x2, 0xf8, 0x26, 0x5,\n                                                              0xd8, 0x84, 0xa, 0xfb, 0x7f, 0x6, 0x77, 0x34,\n                                                              0x5, 0xbb, 0x6, 0xfb, 0x41, 0xfb, 0x4b, 0x4d,\n                                                              0xa, 0xfb, 0x9e, 0xfb, 0xe, 0xfb, 0x1c, 0x5,\n                                                              0xe, 0x8b, 0xe2, 0xbe, 0xbd, 0xc3, 0xbc, 0xf7,\n                                                              0x4a, 0xe2, 0x1, 0xa3, 0x16, 0xf7, 0xdb, 0x6,\n                                                              0x9e, 0xe2, 0x5, 0xfb, 0xa, 0x6, 0x97, 0xbe,\n                                                              0x70, 0xa, 0x95, 0xbd, 0x5, 0xfb, 0x29, 0x6,\n                                                              0x9a, 0xc3, 0x70, 0xa, 0x97, 0xbc, 0x5, 0xfb,\n                                                              0x22, 0x6, 0xf7, 0x5f, 0xf7, 0x4a, 0x5c, 0xa,\n                                                              0x9e, 0xe2, 0x5, 0xfb, 0x83, 0x6, 0x77, 0x34,\n                                                              0x5, 0xb8, 0x6, 0xfb, 0x11, 0xfb, 0x8, 0x41,\n                                                              0xf7, 0x8, 0x5, 0xb9, 0x6, 0x9e, 0xe2, 0x5,\n                                                              0xfb, 0x88, 0x6, 0x78, 0x34, 0x5, 0xdd, 0x6,\n                                                              0xf7, 0x10, 0xfb, 0x4a, 0x5, 0xfb, 0x26, 0x6,\n                                                              0x81, 0x5a, 0x70, 0xa, 0x7c, 0x53, 0x85, 0xa,\n                                                              0x82, 0x59, 0x70, 0xa, 0x7f, 0x58, 0x83, 0xa,\n                                                              0xe, 0x8b, 0xe9, 0xf7, 0x90, 0xe8, 0x1, 0xf2,\n                                                              0xed, 0xf7, 0x6c, 0xed, 0x3, 0xad, 0x16, 0xf8,\n                                                              0x4e, 0x6, 0xb2, 0xf7, 0x50, 0x5, 0x29, 0x44,\n                                                              0xa, 0xfb, 0x55, 0x6, 0xf7, 0xef, 0xf7, 0xa9,\n                                                              0x99, 0xcf, 0x5, 0xfc, 0x3f, 0x6, 0x67, 0xfb,\n                                                              0x46, 0x56, 0xa, 0x9c, 0xe0, 0x5, 0xf7, 0x43,\n                                                              0x6, 0xfb, 0xec, 0xfb, 0xa6, 0x5, 0xe, 0x8b,\n                                                              0xe6, 0xf7, 0x89, 0xe5, 0xc7, 0xd5, 0x1, 0xe8,\n                                                              0xea, 0xf7, 0x5d, 0xe9, 0x3, 0xf7, 0xb9, 0xf8,\n                                                              0x7a, 0x15, 0xec, 0x6, 0xf7, 0x4d, 0xf7, 0x24,\n                                                              0x58, 0xb0, 0xfb, 0x3f, 0x20, 0xfb, 0xf, 0xf6,\n                                                              0x46, 0x67, 0x5, 0xfb, 0x1d, 0xfd, 0xb, 0x15,\n                                                              0xf8, 0x3d, 0x6, 0xad, 0xf7, 0x3c, 0x5, 0x2d,\n                                                              0x6, 0x7a, 0x3e, 0x5, 0xfb, 0x49, 0x6, 0xf7,\n                                                              0xde, 0xf7, 0xa2, 0x98, 0xcc, 0x5, 0xfc, 0x2d,\n                                                              0x6, 0x6b, 0xfb, 0x2d, 0x5, 0xea, 0x6, 0x98,\n                                                              0xca, 0x5, 0xf7, 0x3a, 0x6, 0xfb, 0xdd, 0xfb,\n                                                              0x9e, 0x5, 0xe, 0x7c, 0xe9, 0xf8, 0x4f, 0xe9,\n                                                              0x1, 0xd3, 0xec, 0xf7, 0x9b, 0xeb, 0x3, 0xd3,\n                                                              0xf7, 0x50, 0x15, 0x2b, 0xa9, 0x20, 0xf7, 0x1b,\n                                                              0xf7, 0x91, 0xb1, 0xf7, 0xe3, 0xf7, 0xd, 0xe5,\n                                                              0x61, 0xe0, 0xfb, 0xc, 0xfb, 0x88, 0x59, 0xfb,\n                                                              0xd2, 0xfb, 0x2, 0x1e, 0xec, 0x9d, 0x15, 0xf7,\n                                                              0x10, 0xd1, 0xf7, 0x54, 0xf5, 0xee, 0x7f, 0x31,\n                                                              0x56, 0x3e, 0x58, 0xfb, 0x73, 0xfb, 0xe, 0x3b,\n                                                              0x81, 0xca, 0xcb, 0x1e, 0xe, 0x79, 0x9d, 0xf8,\n                                                              0x4b, 0x9f, 0xf6, 0x99, 0x9f, 0x9f, 0x6, 0xfb,\n                                                              0x26, 0x8f, 0x7, 0x1e, 0xa0, 0x39, 0x63, 0xff,\n                                                              0xc, 0x9, 0xe8, 0xa, 0xe8, 0xb, 0x8c, 0xc,\n                                                              0xe, 0xf8, 0xec, 0x14, 0xac, 0x13, 0x0, 0x79,\n                                                              0x2, 0x0, 0x1, 0x0, 0x3b, 0x0, 0x4d, 0x0,\n                                                              0x89, 0x0, 0x8d, 0x0, 0xcb, 0x1, 0x15, 0x1,\n                                                              0x51, 0x1, 0x5d, 0x1, 0x65, 0x1, 0x6c, 0x1,\n                                                              0x94, 0x1, 0xb0, 0x1, 0xc5, 0x1, 0xdd, 0x1,\n                                                              0xf8, 0x2, 0x16, 0x2, 0x2e, 0x2, 0x3b, 0x2,\n                                                              0x44, 0x2, 0x59, 0x2, 0x5e, 0x2, 0x72, 0x2,\n                                                              0x77, 0x2, 0x7c, 0x2, 0x93, 0x2, 0xba, 0x2,\n                                                              0xc1, 0x2, 0xcb, 0x2, 0xd0, 0x2, 0xf2, 0x2,\n                                                              0xf7, 0x2, 0xfc, 0x3, 0x4, 0x3, 0xd, 0x3,\n                                                              0x12, 0x3, 0x15, 0x3, 0x1a, 0x3, 0x22, 0x3,\n                                                              0x27, 0x3, 0x3c, 0x3, 0x49, 0x3, 0x55, 0x3,\n                                                              0x5c, 0x3, 0x61, 0x3, 0x66, 0x3, 0x77, 0x3,\n                                                              0x7b, 0x3, 0x8e, 0x3, 0x9b, 0x3, 0xae, 0x3,\n                                                              0xc1, 0x3, 0xcc, 0x3, 0xd7, 0x3, 0xdc, 0x3,\n                                                              0xe0, 0x3, 0xe8, 0x3, 0xf0, 0x3, 0xf8, 0x3,\n                                                              0xfd, 0x4, 0x2, 0x4, 0x6, 0x4, 0xe, 0x4,\n                                                              0x16, 0x4, 0x1e, 0x4, 0x27, 0x4, 0x2e, 0x4,\n                                                              0x34, 0x4, 0x3a, 0x4, 0x40, 0x4, 0x45, 0x4,\n                                                              0x49, 0x4, 0x52, 0x4, 0x5a, 0x4, 0x66, 0x4,\n                                                              0x74, 0x4, 0x7f, 0x4, 0x8a, 0x4, 0x8f, 0x4,\n                                                              0x94, 0x4, 0x99, 0x4, 0x9e, 0x4, 0xa2, 0x4,\n                                                              0xa9, 0x4, 0xb5, 0x4, 0xba, 0x4, 0xc0, 0x4,\n                                                              0xc6, 0x4, 0xcc, 0x4, 0xd2, 0x4, 0xd8, 0x4,\n                                                              0xdc, 0x4, 0xe0, 0x4, 0xe4, 0x4, 0xe8, 0x4,\n                                                              0xf3, 0x4, 0xfa, 0x5, 0x0, 0x5, 0x7, 0x5,\n                                                              0xc, 0x5, 0x11, 0x5, 0x16, 0x5, 0x1b, 0x5,\n                                                              0x20, 0x5, 0x25, 0x5, 0x2a, 0x5, 0x2f, 0x5,\n                                                              0x33, 0x5, 0x3d, 0x5, 0x47, 0x5, 0x50, 0x5,\n                                                              0x58, 0x5, 0x5c, 0x5, 0x65, 0x5, 0x6a, 0x5,\n                                                              0x6f, 0x5, 0x74, 0x5, 0x79, 0x5, 0x7e, 0x5,\n                                                              0x82, 0x5, 0x86, 0x5, 0x8a, 0xf7, 0x8d, 0x6,\n                                                              0x9f, 0xe5, 0x5, 0x30, 0x6, 0xb9, 0xd7, 0x5,\n                                                              0xf7, 0x84, 0x6, 0x9f, 0x3f, 0x5, 0x33, 0x3c,\n                                                              0xa, 0xf7, 0x88, 0x37, 0xa, 0x51, 0x6, 0xfb,\n                                                              0x1, 0xf8, 0x64, 0x5, 0xfb, 0x91, 0x3c, 0xa,\n                                                              0xf7, 0x15, 0x6, 0xfb, 0x8e, 0x7c, 0xa, 0x4e,\n                                                              0x6, 0xf7, 0x9d, 0xf7, 0x3a, 0x15, 0xf7, 0xa,\n                                                              0xf7, 0x3d, 0xb6, 0xfb, 0x3d, 0x5, 0xb, 0x22,\n                                                              0xa, 0x1f, 0x13, 0xbc, 0x3b, 0xa, 0x1e, 0x13,\n                                                              0x7c, 0xa1, 0xf7, 0x1, 0x15, 0x13, 0xbc, 0x2c,\n                                                              0xa, 0x15, 0xf7, 0x41, 0x42, 0xa, 0x3c, 0x6,\n                                                              0xac, 0xf7, 0x36, 0x5, 0x91, 0xa8, 0x90, 0xaa,\n                                                              0xa7, 0x1a, 0xcf, 0x46, 0xa9, 0x46, 0x2e, 0xfb,\n                                                              0x6, 0x6f, 0x74, 0x51, 0x1e, 0x9f, 0x3c, 0x5,\n                                                              0x9c, 0xa6, 0xef, 0xa1, 0xd6, 0x1b, 0xbc, 0xb0,\n                                                              0x7b, 0x69, 0x84, 0x8a, 0x83, 0x88, 0x83, 0x1f,\n                                                              0x8f, 0x68, 0x64, 0x8e, 0x67, 0x1b, 0xfb, 0x8a,\n                                                              0x6e, 0xfb, 0x20, 0x64, 0xb, 0x15, 0x20, 0xa,\n                                                              0xe, 0x15, 0xfb, 0x28, 0xf7, 0x1, 0x43, 0xf7,\n                                                              0x8, 0xf7, 0x44, 0xf7, 0x34, 0xf7, 0x9, 0xf7,\n                                                              0x89, 0xf7, 0x6, 0x48, 0xf4, 0xfb, 0x29, 0xfb,\n                                                              0x57, 0xfb, 0x2a, 0xfb, 0x2f, 0xfb, 0x62, 0x1e,\n                                                              0xef, 0x9e, 0x15, 0xf7, 0x4, 0x8a, 0xe4, 0xf7,\n                                                              0x1f, 0xf7, 0x1e, 0x1b, 0xf7, 0x5, 0xa6, 0x33,\n                                                              0x46, 0x8a, 0x1f, 0x2a, 0x3d, 0xfb, 0x27, 0xfb,\n                                                              0x23, 0x29, 0x5d, 0xd2, 0xda, 0x1e, 0xe, 0x15,\n                                                              0xdc, 0x6, 0x54, 0xfb, 0x9c, 0x5, 0x86, 0x73,\n                                                              0x89, 0x75, 0x77, 0x1a, 0x2d, 0xc8, 0x55, 0xf7,\n                                                              0xd, 0xf7, 0x15, 0xe9, 0xac, 0xf7, 0x48, 0xb0,\n                                                              0x1e, 0xc2, 0xf7, 0x9d, 0x5, 0xdb, 0x46, 0xa,\n                                                              0xfb, 0xa2, 0x6, 0x79, 0x31, 0x5, 0xeb, 0x6,\n                                                              0x57, 0xfb, 0x95, 0x5, 0x36, 0x79, 0x6b, 0x5e,\n                                                              0x24, 0x1b, 0x3b, 0x75, 0xab, 0xb0, 0x8a, 0x1f,\n                                                              0x9a, 0x8d, 0x9a, 0x8e, 0x9a, 0x1e, 0xc3, 0xf7,\n                                                              0xa5, 0x5, 0xea, 0x46, 0xa, 0xfb, 0xa2, 0x6,\n                                                              0xb, 0x7a, 0x7b, 0x1a, 0x43, 0xd0, 0x60, 0xdd,\n                                                              0xbf, 0xc0, 0xa6, 0xa5, 0xb7, 0x1e, 0x13, 0x70,\n                                                              0x81, 0x62, 0x5, 0xf7, 0x43, 0x37, 0xa, 0x3b,\n                                                              0x6, 0xd0, 0xf7, 0xf7, 0x8f, 0xa, 0x36, 0xa,\n                                                              0xda, 0x6, 0x65, 0xfb, 0x63, 0x5, 0x13, 0xb0,\n                                                              0x6c, 0x63, 0x5b, 0x64, 0x4d, 0x1b, 0x54, 0x7a,\n                                                              0xa2, 0xa1, 0x97, 0x8c, 0x96, 0x8c, 0x93, 0x1f,\n                                                              0xc3, 0xf7, 0xb8, 0x43, 0xa, 0x15, 0xdc, 0x6,\n                                                              0x67, 0xfb, 0x5b, 0x5, 0x85, 0x78, 0x89, 0x26,\n                                                              0xa, 0x15, 0x33, 0xa, 0x13, 0xd8, 0x2a, 0xa,\n                                                              0xe, 0x30, 0xa, 0x26, 0xfb, 0x44, 0x2d, 0xa,\n                                                              0x7b, 0x42, 0x56, 0xa, 0xbc, 0xf7, 0x80, 0x4e,\n                                                              0xa, 0x7c, 0x41, 0x4c, 0xa, 0xa7, 0xf7, 0x1e,\n                                                              0x88, 0xa, 0x72, 0xfb, 0x8, 0x56, 0xa, 0xb6,\n                                                              0xf7, 0x62, 0x5, 0xfc, 0xa1, 0x6, 0x79, 0x31,\n                                                              0x8a, 0xa, 0x3d, 0x7c, 0xa, 0x37, 0x6, 0xb,\n                                                              0xf8, 0x55, 0x37, 0xa, 0xfb, 0x40, 0x6, 0xdb,\n                                                              0xf8, 0xa, 0x5, 0xf7, 0x3e, 0x37, 0xa, 0xfc,\n                                                              0x51, 0x3c, 0xa, 0xf7, 0x41, 0x6, 0x3b, 0xfc,\n                                                              0xa, 0x3e, 0xa, 0xb, 0x61, 0x53, 0x49, 0x6a,\n                                                              0x48, 0x1b, 0x66, 0x65, 0x98, 0xa4, 0xc3, 0xe4,\n                                                              0x9d, 0xc3, 0xc5, 0xb1, 0x84, 0x89, 0xa8, 0x1f,\n                                                              0xe, 0x1e, 0xf1, 0xa2, 0x15, 0xef, 0xea, 0xca,\n                                                              0xf5, 0xf7, 0x3, 0xb0, 0x54, 0x56, 0x20, 0xfb,\n                                                              0x5, 0x55, 0x35, 0x53, 0x2d, 0xa3, 0xdd, 0x1e,\n                                                              0xe, 0x15, 0x9d, 0xe6, 0x5, 0xf7, 0x33, 0x6,\n                                                              0xdb, 0xf7, 0x94, 0x5, 0xfb, 0x35, 0x34, 0xa,\n                                                              0xf7, 0x98, 0x6, 0x25, 0xfb, 0xef, 0x5, 0xf7,\n                                                              0x4d, 0x4b, 0xa, 0xe, 0x5, 0x6d, 0x44, 0x3c,\n                                                              0x74, 0x3f, 0x1b, 0xfb, 0xf, 0x82, 0xb9, 0xaf,\n                                                              0x87, 0x1f, 0x9b, 0xe6, 0x15, 0xc4, 0xac, 0xd5,\n                                                              0xb0, 0xc8, 0x1b, 0xca, 0xd8, 0x6e, 0x4a, 0x8c,\n                                                              0x1f, 0xe, 0x15, 0xfb, 0x12, 0xf7, 0x18, 0x5b,\n                                                              0xf3, 0xf7, 0x1a, 0xf7, 0x49, 0xe6, 0xf7, 0x49,\n                                                              0xe9, 0x48, 0xe0, 0xfb, 0x32, 0xfb, 0x32, 0xfb,\n                                                              0x3c, 0xb, 0x3c, 0xf7, 0x2a, 0xea, 0xe0, 0xa1,\n                                                              0xb5, 0xdd, 0x1f, 0x7a, 0xdb, 0x2f, 0xa, 0x35,\n                                                              0xa, 0xfb, 0x4a, 0x93, 0xa, 0xd3, 0x31, 0xa,\n                                                              0xf8, 0xa4, 0x6, 0xb5, 0xf7, 0x5e, 0x7a, 0xa,\n                                                              0x73, 0xfb, 0x4, 0x95, 0xa, 0xab, 0xf7, 0x27,\n                                                              0x5, 0xf7, 0x4, 0x6, 0xb, 0x6, 0x9e, 0xe6,\n                                                              0x5, 0xb, 0x15, 0xf8, 0x21, 0x6, 0x94, 0xa3,\n                                                              0x97, 0xc0, 0xa9, 0x1a, 0xee, 0x89, 0x30, 0xd1,\n                                                              0xfb, 0x9, 0x1b, 0xfb, 0x17, 0xb, 0x6, 0x78,\n                                                              0x30, 0x5, 0xb, 0x6, 0x9e, 0xe5, 0x5, 0xb,\n                                                              0x49, 0xa, 0xbf, 0x3a, 0xfb, 0xa, 0x42, 0x3d,\n                                                              0x35, 0x1e, 0xd9, 0x95, 0x15, 0xb7, 0xaf, 0xb3,\n                                                              0xc8, 0xb5, 0xa5, 0x73, 0x53, 0xa, 0xb, 0x15,\n                                                              0x4d, 0xba, 0x57, 0xe3, 0xed, 0xef, 0xd2, 0xe9,\n                                                              0xc7, 0x58, 0xbe, 0x37, 0x27, 0x29, 0x3f, 0x35,\n                                                              0x1e, 0xdc, 0x91, 0x15, 0xba, 0xb2, 0xb2, 0xc7,\n                                                              0xba, 0xa4, 0x72, 0x6c, 0x56, 0x52, 0x70, 0x5e,\n                                                              0x62, 0x6f, 0xa3, 0xa5, 0x1e, 0xb, 0x8b, 0xe6,\n                                                              0xf8, 0x10, 0xe6, 0x1, 0xb, 0x52, 0xbf, 0x51,\n                                                              0xf0, 0xda, 0xb6, 0xa2, 0xae, 0xca, 0xb, 0x6,\n                                                              0x78, 0x31, 0x5, 0xb, 0x84, 0xa3, 0xa3, 0x83,\n                                                              0xa1, 0x1b, 0xd5, 0xc5, 0xbd, 0xa4, 0xa6, 0x1f,\n                                                              0x5f, 0xca, 0x5, 0x77, 0x6e, 0x69, 0x72, 0x67,\n                                                              0x1b, 0x7a, 0x76, 0x91, 0x92, 0x76, 0x1f, 0x92,\n                                                              0x75, 0x75, 0x92, 0x76, 0x1b, 0xb, 0x5, 0xfb,\n                                                              0x43, 0x6, 0xb, 0x6, 0x9e, 0xe9, 0x5, 0xb,\n                                                              0x8b, 0xe5, 0xd7, 0xe5, 0xf7, 0x64, 0xe5, 0xb,\n                                                              0x7c, 0xe7, 0x3b, 0xe6, 0xf0, 0xe5, 0xcd, 0xe6,\n                                                              0xb, 0x6, 0x9d, 0xe6, 0x5, 0xb, 0x3e, 0xa,\n                                                              0xe, 0x6, 0x78, 0x2d, 0x5, 0xb, 0x1, 0xa3,\n                                                              0xf1, 0xf7, 0xf1, 0xef, 0x3, 0xb, 0x6, 0x9d,\n                                                              0xe5, 0x5, 0xb, 0xbb, 0xd5, 0xbf, 0xb5, 0x73,\n                                                              0x5c, 0x99, 0x1e, 0xe6, 0xb0, 0x5, 0xb9, 0x78,\n                                                              0x69, 0xdc, 0xfb, 0x15, 0x1b, 0xfb, 0x22, 0xb,\n                                                              0x15, 0xee, 0x6, 0xf7, 0x53, 0xf7, 0x25, 0x57,\n                                                              0xaf, 0xfb, 0x45, 0x5e, 0xa, 0x15, 0x4f, 0xbb,\n                                                              0x58, 0xde, 0xf1, 0xe1, 0xd2, 0xe7, 0xc7, 0x5c,\n                                                              0xb, 0x64, 0xa, 0xf7, 0xf, 0x65, 0xa, 0xb,\n                                                              0x6, 0x79, 0x30, 0x5, 0xb, 0x5, 0xfb, 0x3,\n                                                              0x6, 0xb, 0x3d, 0xf7, 0x4b, 0x5, 0xbd, 0x84,\n                                                              0xa, 0xfb, 0x84, 0x6, 0x77, 0x34, 0x5c, 0xa,\n                                                              0xf7, 0x8, 0xb, 0x5, 0x29, 0x6, 0xb, 0x15,\n                                                              0x6b, 0xa2, 0x73, 0xad, 0xb7, 0xb5, 0xb5, 0xba,\n                                                              0xbb, 0x72, 0x99, 0x6a, 0x5a, 0x67, 0x5e, 0x59,\n                                                              0x1e, 0xb, 0x16, 0x60, 0xa, 0xa8, 0x7a, 0xa4,\n                                                              0x63, 0x54, 0x6e, 0x5f, 0x67, 0x1e, 0xb, 0x15,\n                                                              0xf7, 0x62, 0xfb, 0x55, 0xc0, 0xc5, 0xfb, 0x26,\n                                                              0xf7, 0x1b, 0xf7, 0x26, 0xf7, 0xf, 0x56, 0xc7,\n                                                              0x5, 0xb, 0xa7, 0xaf, 0x15, 0xb2, 0x4b, 0x5,\n                                                              0x93, 0x99, 0xcd, 0xb1, 0xbc, 0x1b, 0xa0, 0xa3,\n                                                              0x84, 0x83, 0xa4, 0x1f, 0xb, 0x6d, 0x55, 0x56,\n                                                              0x70, 0x5d, 0x61, 0x73, 0xa2, 0xa7, 0x1e, 0xb,\n                                                              0x8b, 0xe5, 0xd5, 0xf7, 0x36, 0x32, 0xe4, 0xf7,\n                                                              0x1e, 0xe5, 0xb, 0x6, 0x9f, 0xe9, 0x5, 0xb,\n                                                              0x5, 0xed, 0x6, 0xb, 0x7c, 0xe4, 0x3e, 0xe5,\n                                                              0xf7, 0x9c, 0xe6, 0xb, 0x1, 0x9e, 0xef, 0xf8,\n                                                              0x1, 0xeb, 0x3, 0xb, 0x1, 0xf3, 0xe9, 0xf7,\n                                                              0x8b, 0xe9, 0x3, 0xb, 0x15, 0xf7, 0x4, 0x6,\n                                                              0xb, 0x6, 0x9e, 0xe7, 0x5, 0xb, 0x5, 0xd9,\n                                                              0x6, 0xb, 0x63, 0xa, 0xf7, 0x75, 0x77, 0x45,\n                                                              0xa, 0xb, 0x22, 0xfb, 0x10, 0xf5, 0x45, 0x69,\n                                                              0x5, 0xe, 0x61, 0xa, 0xf7, 0x77, 0x77, 0x76,\n                                                              0xa, 0xb, 0x71, 0xa2, 0x72, 0xb1, 0xba, 0xac,\n                                                              0xb3, 0xb0, 0xb, 0x7c, 0xe6, 0xdd, 0xe6, 0xe9,\n                                                              0xe6, 0xb, 0x1, 0xf7, 0x67, 0xf1, 0x3, 0xb,\n                                                              0x7c, 0xe6, 0xf7, 0xa1, 0xe6, 0xb, 0x15, 0xf7,\n                                                              0x6, 0x6, 0xa5, 0xb, 0x5, 0xfb, 0x5, 0x6,\n                                                              0xb, 0x5, 0x2a, 0x6, 0xb, 0x57, 0xa, 0xf7,\n                                                              0x6f, 0x77, 0x12, 0x13, 0xb0, 0xb, 0x75, 0xa,\n                                                              0xf7, 0x7a, 0x77, 0x62, 0xa, 0xb, 0xf8, 0x8f,\n                                                              0x5a, 0xa, 0xaa, 0xf7, 0x2b, 0x5, 0xfb, 0x4,\n                                                              0x6, 0xb, 0xb1, 0x4c, 0xf7, 0x66, 0xf7, 0x2e,\n                                                              0xfb, 0x1b, 0xf7, 0x32, 0x4d, 0x57, 0xc5, 0xb,\n                                                              0x15, 0x76, 0x34, 0x5, 0xf7, 0xc0, 0x84, 0xa,\n                                                              0x46, 0x6, 0xb, 0x5, 0xda, 0x6, 0x9d, 0xe8,\n                                                              0x5, 0xfb, 0xa0, 0x82, 0xa, 0xb, 0x15, 0xf7,\n                                                              0x5, 0x6, 0xb, 0x6, 0x77, 0x30, 0x5, 0xb,\n                                                              0x6, 0x77, 0x2d, 0x5, 0xb, 0x5, 0xf7, 0x28,\n                                                              0x6, 0xb, 0xf7, 0xb1, 0x5, 0xb, 0x64, 0xa,\n                                                              0xf7, 0x10, 0x83, 0xa, 0xb, 0x15, 0xf8, 0x63,\n                                                              0x6, 0x9e, 0xf7, 0x2, 0x5, 0xfc, 0x63, 0x6,\n                                                              0xb, 0x6, 0x3c, 0x7d, 0xa, 0xb, 0x8b, 0xe5,\n                                                              0xf8, 0xa, 0xe5, 0xb, 0x1, 0xf8, 0x66, 0xe8,\n                                                              0x3, 0xb, 0x79, 0xe4, 0xf8, 0x25, 0xe6, 0xb,\n                                                              0x8b, 0xe6, 0xf7, 0x94, 0xe6, 0xb, 0x79, 0xe6,\n                                                              0xf8, 0x17, 0xe5, 0xb, 0x5, 0x2b, 0x6, 0xb,\n                                                              0x5, 0x28, 0x6, 0xb, 0xfc, 0xa, 0x5, 0xb,\n                                                              0xfc, 0x10, 0x5, 0xb, 0x5, 0xfb, 0x4c, 0x6,\n                                                              0x79, 0x2e, 0x5, 0xd8, 0x6, 0x3f, 0xb, 0x8b,\n                                                              0xe9, 0xf7, 0x8f, 0xe9, 0x1, 0xb, 0x6, 0xf7,\n                                                              0x55, 0x71, 0xa, 0xb, 0x8b, 0xe9, 0xf8, 0x4a,\n                                                              0xe9, 0x1, 0xb, 0x6, 0x78, 0x2e, 0x5, 0xb,\n                                                              0x5, 0xfb, 0x6, 0x6, 0xb, 0x6, 0x9f, 0xe2,\n                                                              0x5, 0xb, 0x5, 0xfb, 0x28, 0x6, 0xb, 0x5,\n                                                              0xfb, 0x2, 0x6, 0xb, 0x6, 0x79, 0x2d, 0x5,\n                                                              0xb, 0x5, 0xf7, 0x8f, 0x6, 0xb, 0x6, 0x9f,\n                                                              0xe8, 0x5, 0xb, 0x5, 0xdb, 0x6, 0xb, 0xf7,\n                                                              0x1b, 0xc5, 0x98, 0x1f, 0xe7, 0xf8, 0x2e, 0x5,\n                                                              0xb, 0xda, 0xf7, 0xb, 0xa4, 0x1f, 0xc5, 0xf7,\n                                                              0xb6, 0x5, 0xb, 0x5, 0xfb, 0x45, 0x6, 0x79,\n                                                              0x32, 0x8a, 0xa, 0xb, 0x65, 0xca, 0xfb, 0x66,\n                                                              0xfb, 0x2e, 0x5, 0xe, 0x5, 0xfb, 0x42, 0xb,\n                                                              0x55, 0x15, 0x77, 0x33, 0x5, 0xf7, 0xd7, 0x6,\n                                                              0xb, 0xf7, 0x73, 0x77, 0x1, 0xb, 0x15, 0xf7,\n                                                              0x3, 0x6, 0xb, 0x28, 0xfb, 0x42, 0x2a, 0xb,\n                                                              0x6, 0x9e, 0xe8, 0x5, 0xb, 0x5, 0xfb, 0x90,\n                                                              0x6, 0xb, 0x5, 0xec, 0x6, 0xb, 0xf7, 0x20,\n                                                              0x5, 0xb, 0xfb, 0x56, 0x5, 0xb\n                                                             };\n"
  },
  {
    "path": "core/src/fxge/fontdata/chromefontdata/FoxitFixedItalic.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nconst unsigned char g_FoxitFixedItalicFontData [18746] = {0x1,\n                                                          0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x15,\n                                                          0x43, 0x68, 0x72, 0x6f, 0x6d, 0x46, 0x69, 0x78,\n                                                          0x65, 0x64, 0x4f, 0x54, 0x46, 0x2d, 0x49, 0x74,\n                                                          0x61, 0x6c, 0x69, 0x63, 0x0, 0x1, 0x1, 0x1,\n                                                          0x23, 0xf8, 0x10, 0x0, 0xf8, 0x2a, 0x1, 0xf8,\n                                                          0x2b, 0x2, 0xf8, 0x2c, 0x3, 0xf8, 0x18, 0x4,\n                                                          0x5b, 0xfb, 0x8d, 0xf9, 0x2b, 0xf9, 0xb7, 0x5,\n                                                          0xf7, 0xa3, 0xf, 0xf9, 0xc, 0x11, 0xaa, 0x1c,\n                                                          0x42, 0x78, 0x12, 0x0, 0x12, 0x1, 0x1, 0x5,\n                                                          0x7, 0x9, 0x11, 0x19, 0x1f, 0x25, 0x29, 0x2d,\n                                                          0x39, 0x42, 0x49, 0x53, 0x5c, 0x65, 0x8f, 0xa5,\n                                                          0xb4, 0x49, 0x64, 0x6f, 0x74, 0x49, 0x4a, 0x69,\n                                                          0x6a, 0x53, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c,\n                                                          0x61, 0x73, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c,\n                                                          0x61, 0x47, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x67,\n                                                          0x63, 0x61, 0x72, 0x6f, 0x6e, 0x6c, 0x69, 0x72,\n                                                          0x61, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x72, 0x65,\n                                                          0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,\n                                                          0x6e, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x65,\n                                                          0x66, 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x75,\n                                                          0x70, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x72, 0x69,\n                                                          0x67, 0x68, 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77,\n                                                          0x64, 0x6f, 0x77, 0x6e, 0x61, 0x72, 0x72, 0x6f,\n                                                          0x77, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x20, 0x20,\n                                                          0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                          0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                          0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                          0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                          0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43,\n                                                          0x68, 0x72, 0x6f, 0x6d, 0x20, 0x46, 0x69, 0x78,\n                                                          0x65, 0x64, 0x20, 0x4f, 0x54, 0x46, 0x20, 0x49,\n                                                          0x74, 0x61, 0x6c, 0x69, 0x63, 0x43, 0x68, 0x72,\n                                                          0x6F, 0x6D, 0x20, 0x46, 0x69, 0x78, 0x65, 0x64,\n                                                          0x20, 0x4f, 0x54, 0x46, 0x0, 0x0, 0x1, 0x0,\n                                                          0x1, 0x6, 0x0, 0x68, 0x0, 0x0, 0x9, 0x37,\n                                                          0x0, 0x7c, 0x0, 0x0, 0x42, 0x20, 0x0, 0x67,\n                                                          0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0, 0x0,\n                                                          0x66, 0x0, 0x0, 0x83, 0x0, 0x0, 0xaa, 0x0,\n                                                          0x0, 0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x97,\n                                                          0x0, 0x0, 0xa5, 0x0, 0x0, 0x80, 0x0, 0x0,\n                                                          0xa1, 0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4, 0x0,\n                                                          0x0, 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x98,\n                                                          0x0, 0x0, 0x73, 0x0, 0x0, 0x72, 0x0, 0x0,\n                                                          0x85, 0x0, 0x0, 0x96, 0x0, 0x0, 0x8f, 0x0,\n                                                          0x0, 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x9b,\n                                                          0x0, 0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0, 0x0,\n                                                          0xae, 0x0, 0x0, 0xab, 0x1, 0x0, 0xb0, 0x0,\n                                                          0x0, 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x8a,\n                                                          0x0, 0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0, 0x0,\n                                                          0xb2, 0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6, 0x2,\n                                                          0x0, 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0, 0xbe,\n                                                          0x0, 0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0, 0x0,\n                                                          0xbd, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d, 0x0,\n                                                          0x0, 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0, 0xc5,\n                                                          0x0, 0x0, 0x9d, 0x0, 0x0, 0x95, 0x0, 0x0,\n                                                          0xcb, 0x0, 0x0, 0xc9, 0x0, 0x0, 0xc8, 0x0,\n                                                          0x0, 0xcd, 0x0, 0x0, 0xca, 0x0, 0x0, 0xcc,\n                                                          0x0, 0x0, 0x90, 0x0, 0x0, 0xce, 0x0, 0x0,\n                                                          0xd2, 0x0, 0x0, 0xcf, 0x2, 0x0, 0xd6, 0x0,\n                                                          0x0, 0xd3, 0x2, 0x0, 0xa7, 0x0, 0x0, 0xd7,\n                                                          0x0, 0x0, 0xdb, 0x0, 0x0, 0xd8, 0x1, 0x0,\n                                                          0xdc, 0x0, 0x0, 0xda, 0x0, 0x0, 0x9f, 0x0,\n                                                          0x0, 0x93, 0x0, 0x0, 0xe1, 0x0, 0x0, 0xde,\n                                                          0x2, 0x0, 0xe2, 0x0, 0x0, 0xa2, 0x0, 0x0,\n                                                          0xe3, 0x0, 0x1, 0x87, 0x0, 0x0, 0x91, 0x0,\n                                                          0x1, 0x88, 0x1, 0x0, 0x8c, 0x0, 0x0, 0x92,\n                                                          0x0, 0x0, 0x8e, 0x0, 0x0, 0x94, 0x0, 0x1,\n                                                          0x8a, 0x1, 0x0, 0xc0, 0x0, 0x0, 0xdd, 0x0,\n                                                          0x0, 0xc6, 0x1, 0x0, 0xe4, 0x0, 0x0, 0x65,\n                                                          0x0, 0x1, 0x8c, 0x1, 0x0, 0x7e, 0x0, 0x0,\n                                                          0x88, 0x0, 0x0, 0x81, 0x1, 0x0, 0x84, 0x0,\n                                                          0x0, 0x87, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x86,\n                                                          0x0, 0x0, 0x6f, 0x0, 0x0, 0x89, 0x0, 0x0,\n                                                          0x41, 0x0, 0x0, 0x8, 0x0, 0x0, 0x75, 0x0,\n                                                          0x0, 0x69, 0x0, 0x0, 0x77, 0x0, 0x0, 0x76,\n                                                          0x0, 0x0, 0x70, 0x1, 0x0, 0x74, 0x0, 0x0,\n                                                          0x79, 0x1, 0x0, 0x6b, 0x1, 0x0, 0x63, 0x0,\n                                                          0x1, 0x8e, 0x2, 0x0, 0x99, 0x0, 0x1, 0x91,\n                                                          0x4, 0x0, 0xa6, 0x0, 0x0, 0x6d, 0x1, 0x0,\n                                                          0xf4, 0x2, 0x0, 0x1, 0x0, 0x2, 0x0, 0x3,\n                                                          0x0, 0x2f, 0x0, 0x62, 0x0, 0xd0, 0x1, 0x55,\n                                                          0x1, 0xb1, 0x2, 0x3c, 0x2, 0x50, 0x2, 0x87,\n                                                          0x2, 0xbe, 0x2, 0xf5, 0x3, 0x21, 0x3, 0x2f,\n                                                          0x3, 0x43, 0x3, 0x52, 0x3, 0x67, 0x3, 0xab,\n                                                          0x3, 0xd2, 0x4, 0x22, 0x4, 0x80, 0x4, 0xc1,\n                                                          0x5, 0x11, 0x5, 0x67, 0x5, 0x8f, 0x6, 0x0,\n                                                          0x6, 0x57, 0x6, 0x6f, 0x6, 0x8f, 0x6, 0xb2,\n                                                          0x6, 0xd4, 0x6, 0xf7, 0x7, 0x5b, 0x7, 0xf8,\n                                                          0x8, 0x32, 0x8, 0x9f, 0x8, 0xf3, 0x9, 0x2e,\n                                                          0x9, 0x77, 0x9, 0xc3, 0x9, 0xd7, 0xa, 0x28,\n                                                          0xa, 0x48, 0xa, 0x84, 0xa, 0xd7, 0xb, 0x1,\n                                                          0xb, 0x48, 0xb, 0x83, 0xb, 0xcd, 0xc, 0x1a,\n                                                          0xc, 0xb7, 0xd, 0x19, 0xd, 0x88, 0xd, 0xbc,\n                                                          0xe, 0x12, 0xe, 0x3d, 0xe, 0x7f, 0xe, 0xd2,\n                                                          0xf, 0x7, 0xf, 0x3e, 0xf, 0x5e, 0xf, 0x81,\n                                                          0xf, 0xa4, 0xf, 0xd4, 0xf, 0xe5, 0xf, 0xf5,\n                                                          0x10, 0x45, 0x10, 0xaa, 0x10, 0xfe, 0x11, 0x65,\n                                                          0x11, 0xb9, 0x12, 0xa, 0x12, 0x1f, 0x12, 0x6b,\n                                                          0x12, 0xa0, 0x12, 0xe2, 0x13, 0x30, 0x13, 0x53,\n                                                          0x13, 0xca, 0x14, 0x29, 0x14, 0x70, 0x14, 0xd7,\n                                                          0x15, 0x3f, 0x15, 0x84, 0x15, 0xed, 0x16, 0x39,\n                                                          0x16, 0x8f, 0x16, 0xbb, 0x16, 0xff, 0x17, 0x52,\n                                                          0x17, 0x92, 0x17, 0xc4, 0x18, 0x2b, 0x18, 0x45,\n                                                          0x18, 0xac, 0x18, 0xea, 0x19, 0x19, 0x19, 0x77,\n                                                          0x19, 0xe6, 0x1a, 0x67, 0x1a, 0xca, 0x1a, 0xe9,\n                                                          0x1b, 0x82, 0x1b, 0x9e, 0x1c, 0x23, 0x1c, 0x8a,\n                                                          0x1c, 0xbd, 0x1c, 0xd8, 0x1d, 0x60, 0x1d, 0x73,\n                                                          0x1d, 0xb0, 0x1d, 0xee, 0x1e, 0x31, 0x1e, 0x97,\n                                                          0x1e, 0xa9, 0x1e, 0xee, 0x1f, 0x27, 0x1f, 0x48,\n                                                          0x1f, 0x84, 0x1f, 0xa8, 0x1f, 0xe7, 0x20, 0x1c,\n                                                          0x20, 0x89, 0x20, 0xfc, 0x21, 0xaa, 0x22, 0x9,\n                                                          0x22, 0x27, 0x22, 0x4e, 0x22, 0x7b, 0x22, 0xc6,\n                                                          0x22, 0xe9, 0x23, 0x2f, 0x23, 0x9f, 0x24, 0x22,\n                                                          0x24, 0x40, 0x24, 0x63, 0x24, 0x89, 0x24, 0xb7,\n                                                          0x24, 0xd4, 0x25, 0x14, 0x25, 0x3e, 0x25, 0x6d,\n                                                          0x25, 0xc8, 0x26, 0x49, 0x26, 0x67, 0x26, 0x88,\n                                                          0x26, 0xae, 0x26, 0xff, 0x27, 0x31, 0x27, 0x60,\n                                                          0x27, 0xe8, 0x27, 0xfd, 0x28, 0x16, 0x28, 0x3f,\n                                                          0x28, 0x61, 0x28, 0x80, 0x28, 0xd1, 0x29, 0x5b,\n                                                          0x29, 0x71, 0x29, 0x97, 0x29, 0xad, 0x2a, 0x13,\n                                                          0x2a, 0x36, 0x2a, 0x7f, 0x2b, 0x2d, 0x2b, 0xaf,\n                                                          0x2b, 0xcd, 0x2b, 0xea, 0x2c, 0x19, 0x2c, 0x4a,\n                                                          0x2c, 0x65, 0x2c, 0x96, 0x2c, 0xba, 0x2c, 0xda,\n                                                          0x2d, 0x51, 0x2d, 0xf4, 0x2e, 0xc, 0x2e, 0x23,\n                                                          0x2e, 0x49, 0x2e, 0x92, 0x2e, 0xb9, 0x2e, 0xeb,\n                                                          0x2f, 0x6a, 0x2f, 0x89, 0x2f, 0xa8, 0x2f, 0xd0,\n                                                          0x2f, 0xf8, 0x30, 0x4b, 0x30, 0xb6, 0x31, 0x1b,\n                                                          0x31, 0x40, 0x31, 0x66, 0x31, 0xc3, 0x32, 0x29,\n                                                          0x32, 0x65, 0x32, 0x9f, 0x33, 0x0, 0x33, 0x8c,\n                                                          0x34, 0x39, 0x34, 0xe5, 0x35, 0x70, 0x36, 0x2,\n                                                          0x36, 0x2d, 0x36, 0x71, 0x36, 0xb3, 0x37, 0xa,\n                                                          0x37, 0x28, 0x37, 0x49, 0x37, 0x6b, 0x37, 0x8d,\n                                                          0x37, 0xb6, 0x37, 0xc6, 0x37, 0xfd, 0x38, 0x2e,\n                                                          0x38, 0x6f, 0x38, 0x8e, 0x38, 0x9e, 0x38, 0xae,\n                                                          0x38, 0xbf, 0x38, 0xd5, 0x38, 0xe4, 0x39, 0x7,\n                                                          0x39, 0x24, 0x39, 0x40, 0x39, 0x70, 0x39, 0xb6,\n                                                          0x39, 0xd4, 0x39, 0xf4, 0x3a, 0x2f, 0x3a, 0x4e,\n                                                          0x3a, 0x6e, 0x3a, 0x81, 0x3b, 0x1, 0x3b, 0x88,\n                                                          0x3c, 0x0, 0x3c, 0x53, 0x3c, 0x74, 0x3c, 0x9e,\n                                                          0x3c, 0xbe, 0x3c, 0xe3, 0x3d, 0x1d, 0x3d, 0x2c,\n                                                          0x3d, 0xa7, 0x3e, 0x14, 0xe, 0xe, 0x7c, 0xf7,\n                                                          0xc, 0x1, 0xf7, 0x9f, 0xb7, 0x3, 0xf7, 0x9f,\n                                                          0xf7, 0x49, 0x15, 0xb7, 0x6, 0xee, 0xf8, 0x1b,\n                                                          0x5, 0x3d, 0x6, 0xfb, 0x22, 0xfc, 0xab, 0x15,\n                                                          0x6e, 0x9d, 0x74, 0xb0, 0xb3, 0xb3, 0xa8, 0xb3,\n                                                          0xaa, 0x72, 0x9f, 0x68, 0x66, 0x65, 0x69, 0x69,\n                                                          0x1e, 0xe, 0xf7, 0xdc, 0xf7, 0x7e, 0x12, 0xf7,\n                                                          0x3e, 0xb6, 0x7d, 0xdb, 0xb5, 0xb5, 0x7e, 0xda,\n                                                          0x13, 0xd0, 0xf7, 0xd5, 0xf7, 0xdc, 0x15, 0x13,\n                                                          0xc8, 0xa8, 0x64, 0xa, 0xda, 0x6, 0x13, 0xd0,\n                                                          0x49, 0xfb, 0x7e, 0x5, 0xfb, 0x55, 0x16, 0x13,\n                                                          0xb0, 0xa8, 0x64, 0xa, 0xdb, 0x6, 0x13, 0xd0,\n                                                          0x49, 0xfb, 0x7e, 0x5, 0xe, 0xf7, 0x5e, 0xf7,\n                                                          0x34, 0xbf, 0xf7, 0x75, 0x1, 0xf7, 0x2a, 0xf7,\n                                                          0x1a, 0xbb, 0xf7, 0x39, 0x3, 0xf2, 0x4c, 0x15,\n                                                          0xba, 0x6, 0xc1, 0xf7, 0x69, 0x5, 0xf7, 0x16,\n                                                          0x6, 0x59, 0xfb, 0x69, 0x5, 0xbb, 0x6, 0xbf,\n                                                          0xf7, 0x69, 0x5, 0xf2, 0x6, 0x95, 0xbf, 0x5,\n                                                          0x27, 0x6, 0xb4, 0xf7, 0x34, 0x5, 0xe3, 0x6,\n                                                          0x95, 0xbf, 0x5, 0x33, 0x6, 0xc1, 0xf7, 0x75,\n                                                          0x5, 0x5b, 0x6, 0x54, 0xfb, 0x75, 0x83, 0xa,\n                                                          0xc1, 0xf7, 0x75, 0x5, 0x5b, 0x6, 0x51, 0xfb,\n                                                          0x75, 0x5, 0x25, 0x6, 0x81, 0x57, 0x5, 0xf1,\n                                                          0x6, 0x64, 0xfb, 0x34, 0x5, 0x2f, 0x6, 0x81,\n                                                          0x57, 0x5, 0xe5, 0x6, 0xca, 0xbf, 0x15, 0xb1,\n                                                          0xf7, 0x34, 0x5, 0xf7, 0x17, 0x6, 0x66, 0xfb,\n                                                          0x34, 0x5, 0xe, 0x22, 0x76, 0xf7, 0x2b, 0xc0,\n                                                          0xf8, 0x40, 0xbf, 0x1, 0xc3, 0xc0, 0xf7, 0xb,\n                                                          0xc3, 0xf7, 0x28, 0xc5, 0x3, 0xc3, 0x9c, 0x15,\n                                                          0xc0, 0x6, 0x96, 0xbe, 0xab, 0x77, 0xa9, 0x7d,\n                                                          0xb9, 0x81, 0x19, 0x6d, 0xfb, 0x2a, 0x51, 0xa,\n                                                          0xa9, 0xf7, 0x2b, 0x5, 0xf7, 0x0, 0xec, 0xbd,\n                                                          0xee, 0x8c, 0x1f, 0xd4, 0x45, 0xb1, 0x47, 0xa6,\n                                                          0x1e, 0x52, 0xa0, 0x2f, 0xa4, 0x89, 0xbc, 0x8,\n                                                          0xcd, 0xd9, 0xac, 0xcc, 0xba, 0xb6, 0x72, 0x75,\n                                                          0xad, 0x1e, 0x83, 0x66, 0x6a, 0xa, 0xa8, 0xf7,\n                                                          0x29, 0x5, 0x55, 0x6, 0x80, 0x54, 0x70, 0x9a,\n                                                          0x6e, 0x9d, 0x69, 0x8f, 0x19, 0x9f, 0xf7, 0x1,\n                                                          0x71, 0xa, 0x77, 0x23, 0x5, 0x57, 0x8a, 0xfb,\n                                                          0x21, 0x71, 0xfb, 0x1d, 0x1a, 0x45, 0xe6, 0x6c,\n                                                          0xd1, 0x72, 0x1e, 0xcb, 0x74, 0xce, 0x6c, 0x59,\n                                                          0x1a, 0x51, 0x3e, 0x6f, 0x29, 0x59, 0x5e, 0xa0,\n                                                          0xaa, 0x6d, 0x1e, 0x94, 0xb9, 0x52, 0xa, 0xe,\n                                                          0x7c, 0xc4, 0xf7, 0x28, 0xc2, 0xf7, 0x12, 0xc4,\n                                                          0xf7, 0x1f, 0xc2, 0x12, 0xf7, 0x13, 0xc4, 0xac,\n                                                          0xc4, 0xc3, 0xc5, 0xab, 0xc5, 0x17, 0xf7, 0x13,\n                                                          0xf8, 0x6b, 0x6d, 0xa, 0xba, 0x42, 0x35, 0x47,\n                                                          0x44, 0x3b, 0x1e, 0xc4, 0x94, 0x15, 0xbc, 0xae,\n                                                          0xb1, 0xc1, 0xad, 0xa2, 0x70, 0x72, 0xa, 0xfb,\n                                                          0x5, 0xfb, 0xb3, 0x15, 0xf8, 0x61, 0xf7, 0x43,\n                                                          0x5, 0x13, 0xc5, 0x86, 0xc1, 0xfc, 0x60, 0xfb,\n                                                          0x45, 0x5, 0xf7, 0x2a, 0xfb, 0x34, 0x6d, 0xa,\n                                                          0xc3, 0x42, 0x35, 0x47, 0x3b, 0x3b, 0x1e, 0xc4,\n                                                          0x94, 0x15, 0xbc, 0xae, 0xba, 0xc1, 0xad, 0xa2,\n                                                          0x67, 0x72, 0xa, 0xe, 0x7c, 0xbd, 0x67, 0xc3,\n                                                          0xf7, 0x38, 0xc3, 0xf7, 0x6d, 0xbe, 0x12, 0xc0,\n                                                          0xc0, 0xce, 0xc1, 0x13, 0x7c, 0xf7, 0xe1, 0xbd,\n                                                          0x15, 0xa6, 0x58, 0x5, 0xf7, 0x2b, 0x6, 0x95,\n                                                          0xc3, 0x5, 0xfb, 0x11, 0x6, 0x78, 0xae, 0xaf,\n                                                          0xaf, 0xa5, 0xbd, 0x9b, 0xb6, 0x19, 0xdc, 0x6,\n                                                          0x95, 0xc3, 0x5, 0xfb, 0xf, 0x6, 0x83, 0x60,\n                                                          0x72, 0x54, 0x67, 0x63, 0x21, 0xf7, 0x62, 0x18,\n                                                          0x88, 0x8f, 0x7a, 0xac, 0x8a, 0xab, 0x8, 0xc0,\n                                                          0xc1, 0xa6, 0xcf, 0xaf, 0xb2, 0x7d, 0x72, 0x9d,\n                                                          0x1e, 0xa7, 0xbb, 0x5, 0xab, 0x6d, 0x5d, 0x95,\n                                                          0x5d, 0x1b, 0x39, 0x2e, 0x60, 0x3d, 0x1f, 0x88,\n                                                          0x65, 0x9c, 0x67, 0x9b, 0x67, 0x8, 0xfb, 0x18,\n                                                          0x39, 0x79, 0x4b, 0x45, 0x1a, 0x13, 0xbc, 0x57,\n                                                          0xab, 0x50, 0xe2, 0xc2, 0xc7, 0xa3, 0xb4, 0xb9,\n                                                          0x1e, 0x76, 0xb9, 0x15, 0x75, 0x6e, 0x60, 0x64,\n                                                          0x54, 0x1b, 0x60, 0x68, 0xa2, 0xbe, 0x8a, 0x1f,\n                                                          0xd8, 0xd4, 0xc2, 0xbb, 0xa3, 0x1e, 0xe, 0xf7,\n                                                          0xee, 0x76, 0xf7, 0x81, 0x77, 0x1, 0xf7, 0x86,\n                                                          0xf7, 0xd9, 0x15, 0xb9, 0x6, 0xd0, 0xf7, 0x81,\n                                                          0x7b, 0xa, 0xe, 0x34, 0x76, 0xf9, 0x6e, 0x77,\n                                                          0x1, 0xf7, 0x3e, 0xbe, 0x3, 0xf7, 0x6e, 0xfb,\n                                                          0x0, 0x15, 0xbe, 0x6, 0x75, 0xc6, 0x71, 0xe2,\n                                                          0xeb, 0x1a, 0xf7, 0x4f, 0xee, 0xf7, 0x33, 0xf7,\n                                                          0x1, 0xf7, 0x22, 0x1e, 0x7a, 0x79, 0x8b, 0x7a,\n                                                          0x1b, 0xfb, 0x18, 0xfb, 0x37, 0x40, 0xfb, 0x29,\n                                                          0xfb, 0x46, 0x1a, 0x2c, 0xa1, 0x36, 0xa5, 0x4f,\n                                                          0x1e, 0xe, 0x34, 0x76, 0xf9, 0x6e, 0x77, 0x1,\n                                                          0xf8, 0xd, 0xbf, 0x3, 0xf7, 0x3e, 0xfb, 0x0,\n                                                          0x15, 0x9c, 0x9d, 0x8b, 0x9c, 0x1b, 0xf7, 0x18,\n                                                          0xf7, 0x37, 0xd6, 0xf7, 0x29, 0xf7, 0x46, 0x1a,\n                                                          0xea, 0x74, 0xe0, 0x71, 0xc7, 0x1e, 0x58, 0x6,\n                                                          0xa1, 0x50, 0xa5, 0x34, 0x2b, 0x1a, 0xfb, 0x4f,\n                                                          0x29, 0xfb, 0x33, 0xfb, 0x1, 0xfb, 0x22, 0x1e,\n                                                          0xe, 0xf7, 0x95, 0xf7, 0xf2, 0x1, 0xf7, 0x8,\n                                                          0xf8, 0x4, 0x3, 0xf7, 0x1d, 0xf7, 0xb5, 0x15,\n                                                          0xc0, 0x6b, 0xee, 0xf7, 0xe, 0xbb, 0xfb, 0xe,\n                                                          0xca, 0xab, 0x4a, 0xf7, 0x12, 0xf7, 0x29, 0xa7,\n                                                          0x82, 0xcd, 0xfb, 0x24, 0x5e, 0xae, 0xf7, 0x23,\n                                                          0x5, 0x46, 0x6, 0x74, 0xfb, 0x1d, 0xfb, 0x16,\n                                                          0xb2, 0x6f, 0x49, 0xf7, 0x17, 0x6e, 0x5, 0xe,\n                                                          0xf7, 0x79, 0xc1, 0x1, 0xf7, 0x79, 0xc3, 0x3,\n                                                          0xd5, 0xf7, 0x79, 0x15, 0xf7, 0x55, 0x6, 0x65,\n                                                          0xfb, 0x4d, 0x51, 0xa, 0xb1, 0xf7, 0x4d, 0x5,\n                                                          0xf7, 0x54, 0x4d, 0xa, 0xfb, 0x54, 0x6, 0xb1,\n                                                          0xf7, 0x4f, 0x71, 0xa, 0x65, 0xfb, 0x4f, 0x5,\n                                                          0xfb, 0x55, 0x6, 0xe, 0x30, 0x76, 0xf7, 0x7e,\n                                                          0x77, 0x1, 0xf7, 0x55, 0xfb, 0x4, 0x15, 0xcb,\n                                                          0x75, 0xa, 0xf7, 0x7b, 0xc1, 0x1, 0xec, 0xf8,\n                                                          0x2a, 0x3, 0xec, 0xf7, 0x7b, 0x15, 0xf8, 0x1e,\n                                                          0x47, 0xa, 0xfc, 0x1e, 0x6, 0xe, 0x7c, 0xf7,\n                                                          0x10, 0x1, 0xf7, 0x78, 0xf7, 0x24, 0x3, 0xf7,\n                                                          0x78, 0xae, 0x35, 0xa, 0xe, 0x3b, 0xf9, 0x59,\n                                                          0x1, 0xc1, 0xf8, 0x80, 0x3, 0xc1, 0x4f, 0x15,\n                                                          0xb6, 0x77, 0xf8, 0x55, 0xf9, 0x44, 0x63, 0xa0,\n                                                          0x5, 0xe, 0x7c, 0xc5, 0xf8, 0x77, 0xc1, 0x1,\n                                                          0xe5, 0xc0, 0xf7, 0xc8, 0xc6, 0x3, 0xe5, 0xf7,\n                                                          0x46, 0x15, 0x2f, 0xa8, 0x26, 0xf7, 0xe, 0xf7,\n                                                          0x78, 0xb4, 0xf7, 0xbe, 0xf7, 0xb, 0xe4, 0x67,\n                                                          0xe4, 0xfb, 0x3, 0xfb, 0x5a, 0x40, 0xfb, 0x8f,\n                                                          0xfb, 0x2b, 0x1e, 0xc0, 0x8e, 0x15, 0xf7, 0x13,\n                                                          0xd0, 0xf7, 0x6e, 0xf7, 0x1d, 0xdf, 0x9d, 0x41,\n                                                          0x4f, 0xfb, 0x46, 0x3b, 0xfb, 0x43, 0xfb, 0xd,\n                                                          0x39, 0x72, 0xd3, 0xd1, 0x1e, 0xe, 0x8b, 0xc2,\n                                                          0x54, 0xc6, 0xf8, 0x9f, 0x77, 0x1, 0xf7, 0xad,\n                                                          0xc2, 0x3, 0xe6, 0x16, 0xf8, 0x2a, 0x36, 0xa,\n                                                          0xfb, 0x40, 0x6, 0xf2, 0xf8, 0xa3, 0xfb, 0x7c,\n                                                          0x58, 0x80, 0x53, 0xf7, 0x42, 0xb0, 0x32, 0x7a,\n                                                          0xa, 0xfb, 0x47, 0x6, 0xe, 0x8b, 0xc2, 0x54,\n                                                          0xc6, 0xf8, 0x6b, 0xc0, 0x12, 0xf7, 0x34, 0xc3,\n                                                          0xf7, 0xaa, 0xc2, 0x13, 0xb8, 0xbe, 0x16, 0xf8,\n                                                          0x31, 0x6, 0xa3, 0xf7, 0x13, 0x52, 0xa, 0x7e,\n                                                          0x43, 0x5, 0xfb, 0xa9, 0x6, 0xf7, 0xff, 0xf7,\n                                                          0x7a, 0xb6, 0xb8, 0xf7, 0x9, 0x1a, 0xd3, 0x39,\n                                                          0xc8, 0x37, 0x3e, 0x4a, 0x7f, 0x43, 0x49, 0x1e,\n                                                          0x7c, 0x43, 0x51, 0xa, 0xe5, 0x99, 0xdb, 0x98,\n                                                          0xc4, 0x1b, 0xd3, 0xc2, 0x65, 0x53, 0x1f, 0x13,\n                                                          0x78, 0xfb, 0x7, 0xfb, 0x8b, 0xfb, 0xd, 0xfb,\n                                                          0x4d, 0xfb, 0x1e, 0x1e, 0xe, 0x7c, 0xc2, 0xf7,\n                                                          0x63, 0xc7, 0xf7, 0x96, 0xc4, 0x1, 0xf8, 0x31,\n                                                          0xc3, 0x3, 0xd3, 0xa2, 0x15, 0x71, 0xcc, 0xd0,\n                                                          0x7f, 0xce, 0x1b, 0xf7, 0x10, 0xf7, 0x0, 0xd0,\n                                                          0xf7, 0x17, 0xd5, 0x4d, 0xa3, 0x6d, 0x92, 0x1f,\n                                                          0xbd, 0xa4, 0xcc, 0xbb, 0xec, 0x1a, 0xda, 0x38,\n                                                          0xb3, 0x33, 0x8c, 0x1e, 0x4b, 0x49, 0x79, 0x6a,\n                                                          0x61, 0x1f, 0x9a, 0x58, 0x5, 0xa4, 0xa8, 0xcb,\n                                                          0xa3, 0xc9, 0x1b, 0xc6, 0xc2, 0x76, 0x53, 0x4a,\n                                                          0x39, 0x41, 0x20, 0x1f, 0x88, 0x6, 0x80, 0x4b,\n                                                          0x5, 0xc8, 0x8e, 0xf7, 0xb, 0x88, 0x43, 0x1a,\n                                                          0x32, 0x32, 0x59, 0x26, 0x50, 0x57, 0x97, 0xa3,\n                                                          0x5a, 0x1e, 0xe, 0x8b, 0xc7, 0xf3, 0xc6, 0xf7,\n                                                          0xa8, 0xcc, 0x1, 0xf7, 0xe8, 0xcd, 0x3, 0xde,\n                                                          0xf7, 0x38, 0x15, 0xf7, 0xa9, 0x6, 0x77, 0xfb,\n                                                          0x0, 0x5, 0x20, 0x60, 0xa, 0xf7, 0x91, 0x3c,\n                                                          0xa, 0x3b, 0x6, 0x9e, 0xf7, 0x0, 0x5, 0xdb,\n                                                          0x6, 0x96, 0xc6, 0x89, 0xa, 0xcf, 0xf7, 0xe9,\n                                                          0x5, 0x30, 0x6, 0xfb, 0xd4, 0xfb, 0xf0, 0x5,\n                                                          0xd8, 0x92, 0x15, 0xf7, 0x96, 0xf7, 0xa8, 0x51,\n                                                          0xfb, 0xa8, 0x5, 0xe, 0x7c, 0xc6, 0xf7, 0x9f,\n                                                          0xc6, 0xf7, 0x1e, 0xc3, 0x1, 0xf7, 0x1e, 0xcb,\n                                                          0xf7, 0x5d, 0xca, 0x3, 0xc2, 0xa5, 0x15, 0x6f,\n                                                          0xc4, 0xc7, 0x7e, 0xc3, 0x1b, 0xf7, 0x27, 0xf7,\n                                                          0x12, 0xd6, 0xf7, 0x22, 0xde, 0x45, 0xc8, 0x3a,\n                                                          0x5c, 0x54, 0x87, 0x72, 0x5d, 0x1f, 0xb2, 0xf7,\n                                                          0x53, 0x5, 0xf7, 0xb9, 0x3c, 0xa, 0xfb, 0xf1,\n                                                          0x6, 0x51, 0xfb, 0xc1, 0xb0, 0x81, 0x5, 0x9e,\n                                                          0xb5, 0xcb, 0x9d, 0xba, 0x1b, 0xd0, 0xb4, 0x63,\n                                                          0x54, 0x2d, 0x23, 0x50, 0x20, 0x55, 0x54, 0x96,\n                                                          0xa8, 0x62, 0x1f, 0xe, 0x7c, 0xc6, 0xf7, 0x99,\n                                                          0x76, 0xf7, 0x84, 0xc3, 0x1, 0xca, 0xc6, 0xf7,\n                                                          0x9f, 0xc9, 0x3, 0xf7, 0x16, 0xf7, 0x9c, 0x15,\n                                                          0xf7, 0x25, 0xa5, 0xf7, 0x4e, 0xf7, 0x7, 0xf7,\n                                                          0x4a, 0x1b, 0x98, 0xc3, 0x5, 0xfb, 0xa5, 0xfb,\n                                                          0x5d, 0xfb, 0x2f, 0xfb, 0x7c, 0xfb, 0x28, 0xd8,\n                                                          0x4f, 0xe8, 0xf7, 0x1d, 0xdc, 0xec, 0xf7, 0xc,\n                                                          0xe6, 0x34, 0xbb, 0x38, 0x4e, 0x50, 0x67, 0x62,\n                                                          0x6c, 0x1f, 0x83, 0x46, 0x15, 0xbc, 0xa0, 0xc9,\n                                                          0xb3, 0xca, 0x1b, 0xce, 0xc1, 0x6e, 0x44, 0x45,\n                                                          0x4e, 0x41, 0x2f, 0x36, 0x63, 0xd9, 0xd8, 0x96,\n                                                          0x1f, 0xe, 0xa0, 0x76, 0xf8, 0x91, 0xc2, 0x1,\n                                                          0xe0, 0xc0, 0xf7, 0xc8, 0xc5, 0x3, 0xf7, 0x32,\n                                                          0x16, 0xc6, 0x6, 0xf7, 0xb3, 0xf8, 0x8d, 0x96,\n                                                          0xc6, 0x5, 0xfc, 0x1d, 0x6, 0x66, 0xfb, 0x29,\n                                                          0x5, 0xc0, 0x6, 0xa6, 0xe9, 0x5, 0xf7, 0xad,\n                                                          0x6, 0xe, 0x7c, 0xc2, 0xf7, 0x6d, 0xc8, 0xf7,\n                                                          0x5f, 0xc6, 0x1, 0xd3, 0xcb, 0xf7, 0x9b, 0xc9,\n                                                          0x3, 0xf7, 0x60, 0xf7, 0xb9, 0x15, 0x64, 0x85,\n                                                          0x2e, 0x4a, 0x31, 0x1a, 0x2b, 0xcf, 0x58, 0xf6,\n                                                          0xf7, 0x25, 0xea, 0xd8, 0xf7, 0xb, 0xd0, 0x5a,\n                                                          0xa8, 0x6d, 0x99, 0x1e, 0xc0, 0x93, 0xce, 0xc9,\n                                                          0xea, 0x1a, 0xc3, 0x54, 0xcd, 0x23, 0xfb, 0x8,\n                                                          0xfb, 0x3, 0x44, 0xfb, 0xc, 0x1e, 0x8c, 0x5f,\n                                                          0xa4, 0x6b, 0xaf, 0x77, 0x8, 0x89, 0xec, 0x15,\n                                                          0xf7, 0x5, 0xf7, 0x6, 0xa1, 0xb0, 0xcf, 0xb9,\n                                                          0x63, 0x62, 0x41, 0x42, 0x57, 0x39, 0x6d, 0x3b,\n                                                          0x95, 0xc9, 0x1e, 0x49, 0xfb, 0xa1, 0x15, 0xf7,\n                                                          0x6, 0xf7, 0xa, 0xa5, 0xba, 0xcb, 0xc7, 0x61,\n                                                          0x5b, 0x2e, 0x28, 0x62, 0x47, 0x62, 0x3a, 0xa4,\n                                                          0xc6, 0x1e, 0xe, 0x7d, 0xc7, 0xf7, 0x41, 0xc4,\n                                                          0xf7, 0x8e, 0xc1, 0x1, 0xf7, 0x25, 0xc4, 0xf7,\n                                                          0xab, 0xc6, 0x3, 0xc6, 0x7d, 0x15, 0xf8, 0x9,\n                                                          0xf7, 0x0, 0xf7, 0x55, 0xf7, 0x78, 0xe9, 0x58,\n                                                          0xda, 0xfb, 0x5, 0xfb, 0x18, 0x28, 0x20, 0xfb,\n                                                          0x4, 0x1f, 0x42, 0x8c, 0xbf, 0x46, 0xf3, 0x1b,\n                                                          0xc6, 0xca, 0x93, 0xb6, 0xb4, 0x1f, 0x66, 0xfb,\n                                                          0xe, 0x26, 0xfb, 0x0, 0xfb, 0x94, 0x8d, 0x8,\n                                                          0xf8, 0x2e, 0xf7, 0xce, 0x15, 0x64, 0x71, 0x4c,\n                                                          0x62, 0x42, 0x1b, 0x43, 0x5e, 0xb4, 0xbf, 0xe2,\n                                                          0xd9, 0xd1, 0xe7, 0xe9, 0xa5, 0x30, 0x3c, 0x80,\n                                                          0x1f, 0xe, 0x7c, 0xf7, 0x10, 0xf7, 0x2c, 0xf7,\n                                                          0x10, 0x1, 0xf7, 0x5a, 0xf7, 0x24, 0x3, 0xf7,\n                                                          0x5a, 0xae, 0x35, 0xa, 0xc6, 0xf7, 0xa8, 0x35,\n                                                          0xa, 0xe, 0xf7, 0x99, 0xf7, 0x10, 0x1, 0xf7,\n                                                          0x32, 0xcb, 0xd7, 0xf7, 0x24, 0x3, 0xf7, 0x32,\n                                                          0xfb, 0x4, 0x15, 0xcb, 0x6, 0xf7, 0x2a, 0xf7,\n                                                          0x8f, 0x5, 0x2e, 0x6, 0x9e, 0xf7, 0x40, 0x35,\n                                                          0xa, 0xe, 0xca, 0x76, 0xf7, 0xfe, 0xcf, 0x1,\n                                                          0xd4, 0xd5, 0x3, 0xd4, 0xf7, 0x6c, 0x15, 0xf7,\n                                                          0xfa, 0xfb, 0x42, 0x9c, 0xc9, 0xfb, 0xc1, 0xf7,\n                                                          0x2d, 0xf8, 0x3, 0xf7, 0x27, 0x98, 0xcf, 0xfc,\n                                                          0x48, 0xfb, 0x42, 0x5, 0xe, 0xf7, 0x1e, 0xc8,\n                                                          0xf7, 0x7, 0xc9, 0x1, 0xe0, 0xf7, 0xce, 0x15,\n                                                          0xf8, 0x56, 0x6, 0x95, 0xc9, 0x5, 0xfc, 0x55,\n                                                          0x6, 0x61, 0xfb, 0x82, 0x15, 0xf8, 0x54, 0x6,\n                                                          0x97, 0xc8, 0x5, 0xfc, 0x55, 0x6, 0xe, 0xb5,\n                                                          0xcf, 0xf7, 0xc0, 0xc9, 0x1, 0xf8, 0x59, 0xd5,\n                                                          0x3, 0xd4, 0xb5, 0x15, 0xf8, 0x48, 0xf7, 0x42,\n                                                          0x9d, 0xdd, 0xfb, 0xfa, 0xf7, 0x42, 0x7a, 0x4d,\n                                                          0xf7, 0xc1, 0xfb, 0x2d, 0xfc, 0x3, 0xfb, 0x27,\n                                                          0x5, 0xe, 0x7c, 0xf7, 0xa, 0xf7, 0x44, 0xf7,\n                                                          0x23, 0xeb, 0xc1, 0x12, 0xf7, 0xb, 0xc1, 0x9c,\n                                                          0xc3, 0xf7, 0x48, 0xc1, 0x17, 0xf7, 0x52, 0xf7,\n                                                          0x44, 0x15, 0xc3, 0x6, 0x96, 0xc5, 0x5, 0xda,\n                                                          0x9b, 0xf7, 0x24, 0xc6, 0xf7, 0x17, 0x1a, 0xe0,\n                                                          0x43, 0xba, 0x2c, 0x50, 0x4b, 0x73, 0x7a, 0x59,\n                                                          0x1e, 0x13, 0xf4, 0x76, 0xfb, 0x1, 0x5, 0xc1,\n                                                          0x6, 0x97, 0xc9, 0x5, 0x9a, 0xb1, 0xb5, 0x9e,\n                                                          0xb3, 0x1b, 0xe7, 0xa8, 0x5e, 0x65, 0x2d, 0xfb,\n                                                          0x17, 0x5a, 0x36, 0x7e, 0x1f, 0x36, 0xfb, 0x8f,\n                                                          0x15, 0x70, 0x8c, 0x9f, 0x7b, 0xad, 0x1b, 0xae,\n                                                          0xb9, 0xa9, 0xb3, 0xa3, 0x75, 0xa3, 0x69, 0x62,\n                                                          0x63, 0x67, 0x64, 0x8c, 0x1f, 0xe, 0x7d, 0xb0,\n                                                          0xdf, 0xaf, 0xf7, 0x6e, 0xb0, 0xf7, 0x0, 0xb0,\n                                                          0x1, 0xb1, 0xb0, 0xeb, 0xb0, 0xf7, 0xe6, 0xb1,\n                                                          0x3, 0xf7, 0xe4, 0xf7, 0x3e, 0x15, 0x6e, 0x8a,\n                                                          0xa3, 0x69, 0xba, 0x1b, 0xf0, 0xd8, 0xf7, 0x18,\n                                                          0xf7, 0xb, 0xf7, 0xb, 0x2c, 0xcd, 0xfb, 0x6,\n                                                          0xfb, 0x58, 0xfb, 0x21, 0xfb, 0x34, 0xfb, 0x4d,\n                                                          0x21, 0xbd, 0x21, 0xf7, 0x32, 0xdf, 0xe7, 0xa9,\n                                                          0xb2, 0xd4, 0x1f, 0x83, 0xaf, 0x5, 0x58, 0x29,\n                                                          0x42, 0x7a, 0x49, 0x1b, 0x20, 0x47, 0xd1, 0xf5,\n                                                          0xf7, 0x1c, 0xe4, 0xf7, 0x3f, 0xf7, 0x5a, 0xf0,\n                                                          0xde, 0x5a, 0x20, 0x2d, 0x4b, 0xfb, 0x5, 0x49,\n                                                          0x71, 0x74, 0x9f, 0xae, 0x91, 0x1f, 0x90, 0xa2,\n                                                          0x99, 0xa3, 0x95, 0xa0, 0xc6, 0xf7, 0x12, 0x18,\n                                                          0x66, 0x6, 0x73, 0x59, 0x5, 0xc2, 0x85, 0x6b,\n                                                          0x8c, 0x7e, 0x1b, 0x2d, 0x37, 0x23, 0xfb, 0x11,\n                                                          0x6a, 0x9e, 0x6e, 0xb1, 0xb4, 0xb5, 0xa9, 0xac,\n                                                          0xa4, 0x1f, 0xad, 0xf7, 0x19, 0x15, 0x4a, 0x7e,\n                                                          0x50, 0x2c, 0x51, 0x1b, 0x71, 0x85, 0xa1, 0x9f,\n                                                          0xd8, 0xcd, 0xee, 0xca, 0xb0, 0x8a, 0x62, 0x7a,\n                                                          0x88, 0x1f, 0xe, 0x8b, 0xc1, 0xf6, 0xc1, 0xf7,\n                                                          0xb4, 0xc1, 0x1, 0x89, 0xf7, 0x65, 0xf7, 0x48,\n                                                          0xf7, 0x60, 0x3, 0x89, 0x16, 0xf7, 0x65, 0x2a,\n                                                          0xa, 0x32, 0x6, 0xca, 0xf7, 0x4, 0x5, 0xf7,\n                                                          0xab, 0x6, 0xa2, 0xfb, 0x4, 0x2c, 0xa, 0xf8,\n                                                          0x90, 0x32, 0xa, 0x58, 0xa, 0x4f, 0x6, 0xf7,\n                                                          0x6c, 0xf7, 0x3a, 0x15, 0xf7, 0x3f, 0xf7, 0xba,\n                                                          0xcb, 0xfb, 0xba, 0x5, 0xe, 0x8b, 0xc1, 0xf7,\n                                                          0x50, 0xc2, 0xf7, 0x67, 0xc1, 0x12, 0xf5, 0xc3,\n                                                          0xf7, 0xec, 0xc8, 0x62, 0xc7, 0x13, 0xe8, 0x13,\n                                                          0xe4, 0x98, 0x16, 0xf7, 0xc8, 0x6, 0xf7, 0x1a,\n                                                          0xf7, 0x5, 0xbd, 0xf7, 0x18, 0x8a, 0x1f, 0xbe,\n                                                          0x58, 0xae, 0x58, 0x95, 0x1e, 0x13, 0xe8, 0xd2,\n                                                          0x9e, 0xbd, 0xbb, 0xe9, 0x1a, 0xe8, 0x2c, 0xa9,\n                                                          0x2a, 0x1e, 0xfb, 0x9e, 0x45, 0xa, 0xdd, 0x6,\n                                                          0x2f, 0xfc, 0x5a, 0x6b, 0xa, 0xf7, 0x51, 0xf7,\n                                                          0x87, 0x15, 0xb5, 0xf7, 0x67, 0x5, 0xf7, 0x1d,\n                                                          0xf7, 0x1a, 0x89, 0x40, 0x2e, 0x24, 0x62, 0x37,\n                                                          0x1f, 0xfb, 0x45, 0xfb, 0x87, 0x15, 0xb3, 0xf7,\n                                                          0x50, 0x5, 0xf7, 0x1e, 0x6, 0x13, 0xf8, 0xc7,\n                                                          0xf5, 0x83, 0x4c, 0x30, 0xfb, 0x3, 0x71, 0x41,\n                                                          0x1f, 0xe, 0x79, 0xc2, 0xf8, 0x7d, 0xc1, 0x8a,\n                                                          0x77, 0x12, 0xbc, 0xc5, 0x13, 0xd0, 0xf8, 0x6e,\n                                                          0xf2, 0x15, 0x64, 0x4d, 0x42, 0x70, 0x46, 0x1b,\n                                                          0x22, 0x51, 0xc9, 0xf7, 0x2, 0xf7, 0x5a, 0xf7,\n                                                          0x12, 0xf7, 0xb, 0xf7, 0xe, 0xcc, 0xc1, 0x6b,\n                                                          0x5c, 0xaf, 0x1f, 0x78, 0x30, 0x6a, 0xa, 0x13,\n                                                          0xb0, 0xb8, 0xf7, 0x73, 0x52, 0xa, 0x7f, 0x4e,\n                                                          0x5, 0x13, 0xd0, 0xb9, 0x4a, 0x5d, 0x9b, 0x55,\n                                                          0x1b, 0xfb, 0x54, 0xfb, 0xa, 0xfb, 0x38, 0xfb,\n                                                          0x61, 0xfb, 0x15, 0xbd, 0x27, 0xf7, 0x2f, 0xdb,\n                                                          0xdf, 0xa8, 0xb8, 0xd2, 0x1f, 0xe, 0x3e, 0xa,\n                                                          0xf8, 0xab, 0xc3, 0x3, 0x80, 0x16, 0xf7, 0x87,\n                                                          0x6, 0xf7, 0x48, 0xf7, 0x47, 0xd7, 0xf7, 0xb6,\n                                                          0xf7, 0x37, 0xfb, 0x0, 0xac, 0xfb, 0x18, 0x1f,\n                                                          0xfb, 0x8b, 0x45, 0xa, 0xdb, 0x5e, 0xa, 0x3a,\n                                                          0x6, 0xf7, 0x1c, 0x16, 0xe6, 0x87, 0xa, 0xf7,\n                                                          0x5a, 0x85, 0xf7, 0x2, 0x9f, 0xfb, 0x3e, 0x1a,\n                                                          0xfb, 0x42, 0x23, 0xfb, 0x10, 0xfb, 0x4a, 0x1e,\n                                                          0xe, 0x8b, 0xc1, 0xf7, 0x5b, 0x61, 0xa, 0x1,\n                                                          0x88, 0x16, 0xf8, 0x87, 0x6, 0xb1, 0xf7, 0x4f,\n                                                          0x62, 0xa, 0x70, 0xfb, 0x19, 0x5, 0xfb, 0xc4,\n                                                          0x6, 0xb3, 0xf7, 0x5b, 0x5, 0xf7, 0x39, 0x6,\n                                                          0x7a, 0x3a, 0x51, 0xa, 0xba, 0xf7, 0x6d, 0x62,\n                                                          0xa, 0x79, 0x39, 0x5, 0xfb, 0x39, 0x6, 0xb4,\n                                                          0xf7, 0x5d, 0x81, 0xa, 0x70, 0xfb, 0x1a, 0x5,\n                                                          0xc4, 0x6, 0xb1, 0xf7, 0x50, 0x5, 0xfc, 0x82,\n                                                          0x45, 0xa, 0xdf, 0x6, 0x2f, 0xfc, 0x5a, 0x6b,\n                                                          0xa, 0xe, 0x8b, 0xc1, 0xf7, 0x5b, 0x61, 0xa,\n                                                          0x1, 0xe3, 0xc4, 0xf7, 0x54, 0xc3, 0xf7, 0x6,\n                                                          0xc4, 0x3, 0x88, 0x16, 0xf7, 0xa3, 0x6, 0x97,\n                                                          0xc1, 0x55, 0xa, 0xb3, 0xf7, 0x5b, 0x5, 0xf7,\n                                                          0x3a, 0x6, 0x7d, 0x43, 0x51, 0xa, 0xb4, 0xf7,\n                                                          0x5b, 0x62, 0xa, 0x7c, 0x42, 0x5, 0xfb, 0x3a,\n                                                          0x6, 0xb3, 0xf7, 0x5d, 0x5, 0xf7, 0xc0, 0x6,\n                                                          0x6e, 0xfb, 0x23, 0x5, 0xc4, 0x6, 0xb3, 0xf7,\n                                                          0x59, 0x5, 0xfc, 0x80, 0x45, 0xa, 0xdb, 0x6,\n                                                          0x2f, 0xfc, 0x5a, 0x89, 0xa, 0xe, 0x79, 0xc2,\n                                                          0xf7, 0x39, 0xc2, 0xf7, 0xa0, 0xc2, 0x1, 0x9e,\n                                                          0xc4, 0xf8, 0x2b, 0xc3, 0x3, 0x34, 0xa, 0x3d,\n                                                          0xa, 0xe, 0x8b, 0xc1, 0xf7, 0x60, 0xc1, 0xf7,\n                                                          0x58, 0xc1, 0x1, 0xcb, 0xc1, 0xf7, 0xa8, 0xc1,\n                                                          0x3, 0x70, 0x16, 0xf7, 0x6a, 0x2a, 0xa, 0x3b,\n                                                          0x6, 0xb4, 0xf7, 0x60, 0x5, 0xf7, 0xa7, 0x6,\n                                                          0x63, 0xfb, 0x60, 0x5, 0x3c, 0x2d, 0xa, 0xf7,\n                                                          0x68, 0x2a, 0xa, 0x3c, 0x6, 0xe5, 0x87, 0xa,\n                                                          0xda, 0x2a, 0xa, 0xfb, 0x68, 0x2d, 0xa, 0xda,\n                                                          0x6, 0x64, 0xfb, 0x58, 0x5, 0xfb, 0xa7, 0x6,\n                                                          0xb1, 0xf7, 0x58, 0x5, 0xdb, 0x2a, 0xa, 0xfb,\n                                                          0x6a, 0x2d, 0xa, 0xdb, 0x6, 0x31, 0xfc, 0x5a,\n                                                          0x89, 0xa, 0xe, 0x3e, 0xa, 0xaf, 0x16, 0xf8,\n                                                          0x2e, 0x47, 0xa, 0xfb, 0x44, 0x6, 0xec, 0x87,\n                                                          0xa, 0xf7, 0x40, 0x47, 0xa, 0xfc, 0x2a, 0x45,\n                                                          0xa, 0xf7, 0x43, 0x6, 0x2a, 0x58, 0xa, 0xfb,\n                                                          0x43, 0x6, 0xe, 0x79, 0xc1, 0xf8, 0x6b, 0xc2,\n                                                          0x1, 0xa2, 0xc3, 0xf7, 0xec, 0xc1, 0x3, 0x7b,\n                                                          0xb4, 0x15, 0x65, 0xe2, 0xca, 0x76, 0xce, 0x1b,\n                                                          0xf7, 0x22, 0xbb, 0x7c, 0xa, 0xf7, 0x15, 0x36,\n                                                          0xa, 0xfc, 0x12, 0x38, 0xa, 0xf7, 0x5b, 0x6,\n                                                          0x4b, 0xfb, 0xdc, 0x5, 0x3a, 0x7b, 0x5f, 0x4d,\n                                                          0x2d, 0x1b, 0x71, 0xfb, 0x1f, 0x91, 0xf7, 0xe,\n                                                          0xa3, 0x1f, 0x9a, 0xe6, 0x71, 0xa, 0xe, 0x3e,\n                                                          0xa, 0xd7, 0xc1, 0xf7, 0xec, 0xcf, 0x3, 0x7b,\n                                                          0x16, 0xf7, 0x6d, 0x2a, 0xa, 0x39, 0x6, 0xab,\n                                                          0xf7, 0x2d, 0xef, 0xdd, 0xa5, 0x5f, 0xb6, 0x41,\n                                                          0xae, 0x38, 0xa4, 0x33, 0x19, 0xf7, 0x2a, 0x2a,\n                                                          0xa, 0xfb, 0x9, 0x6, 0x76, 0xd2, 0x65, 0xdd,\n                                                          0x62, 0xcc, 0x8, 0x8b, 0x76, 0xad, 0x82, 0x9a,\n                                                          0x1e, 0xf7, 0x81, 0xf7, 0x4f, 0x5, 0xcb, 0x43,\n                                                          0xa, 0xd2, 0x6, 0xfb, 0xbf, 0xfb, 0x7f, 0xc3,\n                                                          0xf7, 0x7f, 0x5, 0xd0, 0x2a, 0xa, 0xfb, 0x6b,\n                                                          0x2d, 0xa, 0xe7, 0x6, 0x26, 0x58, 0xa, 0x3a,\n                                                          0x6, 0xe, 0x3e, 0xa, 0xf7, 0xb, 0xc3, 0x3,\n                                                          0x8b, 0x4, 0xf8, 0x96, 0x6, 0xb9, 0xf7, 0x87,\n                                                          0x71, 0xa, 0x68, 0xfb, 0x51, 0x5, 0xfb, 0xba,\n                                                          0x6, 0xe7, 0x87, 0xa, 0xf7, 0x14, 0x2a, 0xa,\n                                                          0xfb, 0xb9, 0x2d, 0xa, 0xf7, 0x0, 0x5e, 0xa,\n                                                          0xfb, 0x0, 0x6, 0xe, 0x3e, 0xa, 0x9f, 0xc3,\n                                                          0xf7, 0xfc, 0xc3, 0x3, 0x63, 0x16, 0xf7, 0x3c,\n                                                          0x47, 0xa, 0x4b, 0x6, 0xe6, 0x87, 0xa, 0x94,\n                                                          0x6, 0xd4, 0xfc, 0xf, 0x5, 0xb7, 0x6, 0xf7,\n                                                          0x73, 0xf8, 0xf, 0x5, 0x96, 0x5e, 0xa, 0x4f,\n                                                          0x5f, 0xa, 0xf7, 0x36, 0x2a, 0xa, 0x5c, 0x6,\n                                                          0xe6, 0x87, 0xa, 0xb9, 0x47, 0xa, 0xfb, 0x28,\n                                                          0x6, 0xfb, 0x5e, 0xfb, 0xec, 0x48, 0xf7, 0xec,\n                                                          0x5, 0xfb, 0x2b, 0x5f, 0xa, 0xbb, 0x5e, 0xa,\n                                                          0x5b, 0x6, 0xe, 0x8a, 0xc2, 0xf8, 0x59, 0xc2,\n                                                          0x1, 0x5e, 0x8a, 0x15, 0xf7, 0x80, 0x36, 0xa,\n                                                          0x28, 0x6, 0xe1, 0xf8, 0x41, 0xf7, 0x54, 0xfc,\n                                                          0x78, 0x5, 0xd6, 0x6, 0xf0, 0xf8, 0x90, 0x5,\n                                                          0xd8, 0x36, 0xa, 0xfb, 0x7b, 0x38, 0xa, 0xed,\n                                                          0x6, 0x35, 0xfc, 0x44, 0xfb, 0x53, 0xf8, 0x7b,\n                                                          0x5, 0xfb, 0x31, 0x56, 0xa, 0xdd, 0x6, 0x31,\n                                                          0xfc, 0x59, 0x5, 0x3a, 0x6, 0xe, 0x79, 0xc2,\n                                                          0xf8, 0x7c, 0xc2, 0x1, 0xad, 0xc2, 0xf8, 0x38,\n                                                          0xc3, 0x3, 0xad, 0xf7, 0x6c, 0x15, 0xfb, 0x19,\n                                                          0xd5, 0x26, 0xf7, 0x1c, 0xf7, 0x4b, 0xf7, 0x1e,\n                                                          0xf7, 0x4f, 0xf7, 0x50, 0xee, 0x5c, 0xf7, 0x10,\n                                                          0xfb, 0x33, 0xfb, 0x5a, 0xfb, 0x13, 0xfb, 0x5c,\n                                                          0xfb, 0x38, 0x1e, 0xc2, 0x89, 0x15, 0xf7, 0x3,\n                                                          0xdd, 0xf7, 0x5c, 0xf7, 0x43, 0xf7, 0x10, 0xb2,\n                                                          0x2e, 0x3c, 0xfb, 0x24, 0xfb, 0xb, 0xfb, 0x40,\n                                                          0xfb, 0x1b, 0x20, 0x50, 0xd9, 0xee, 0x1e, 0xe,\n                                                          0x8b, 0xc1, 0xf7, 0x31, 0xc1, 0xf7, 0x87, 0xc1,\n                                                          0x1, 0xf6, 0xc5, 0xf7, 0xfa, 0xc6, 0x3, 0x9c,\n                                                          0x16, 0xf7, 0xba, 0x2a, 0xa, 0xfb, 0x31, 0x6,\n                                                          0xab, 0xf7, 0x31, 0x5, 0xf7, 0x1a, 0x6, 0xf7,\n                                                          0x31, 0xe9, 0xcf, 0xf7, 0x27, 0xd2, 0x5c, 0xcc,\n                                                          0xfb, 0x15, 0x1f, 0xfb, 0xa7, 0x2d, 0xa, 0xdb,\n                                                          0x6, 0x2e, 0x58, 0xa, 0x3c, 0x6, 0xf7, 0x47,\n                                                          0xf7, 0x67, 0x15, 0xbc, 0xf7, 0x87, 0x5, 0xf7,\n                                                          0x1b, 0x6, 0xd0, 0xca, 0x6b, 0x52, 0xfb, 0x11,\n                                                          0x20, 0x6e, 0x4a, 0x1f, 0xe, 0xfb, 0x1e, 0xf7,\n                                                          0x41, 0xfb, 0x15, 0xf7, 0x15, 0x54, 0xc2, 0xf8,\n                                                          0x7e, 0xc2, 0x12, 0xae, 0xc7, 0xf8, 0x2f, 0xc6,\n                                                          0x13, 0x5c, 0xd9, 0x3f, 0x15, 0x91, 0x54, 0x5,\n                                                          0xaa, 0xb4, 0xb2, 0x91, 0xb2, 0x1b, 0xaa, 0xaa,\n                                                          0x7c, 0x80, 0xab, 0x1f, 0x13, 0x9c, 0x82, 0xa6,\n                                                          0xa6, 0x82, 0xa6, 0x1b, 0xae, 0xaf, 0x9b, 0x9f,\n                                                          0xa7, 0x1f, 0x7b, 0xba, 0x5, 0x7f, 0x73, 0x6f,\n                                                          0x7d, 0x70, 0x1b, 0x75, 0x75, 0x94, 0x94, 0x75,\n                                                          0x1f, 0x94, 0x74, 0x74, 0x98, 0x70, 0x1b, 0x7c,\n                                                          0x7a, 0x8c, 0x86, 0x7a, 0x1f, 0x13, 0x3c, 0xa9,\n                                                          0x9a, 0x8d, 0x8b, 0x95, 0x95, 0x8, 0xf7, 0x5f,\n                                                          0x8a, 0xf7, 0x12, 0xf7, 0x4a, 0xf7, 0x64, 0x1a,\n                                                          0xf7, 0x1, 0x5e, 0xf1, 0xfb, 0x33, 0xfb, 0x4f,\n                                                          0xfb, 0x1f, 0xfb, 0x5d, 0xfb, 0x4c, 0x23, 0xbd,\n                                                          0x3e, 0xeb, 0x6e, 0x1e, 0x6a, 0x70, 0x6a, 0x7a,\n                                                          0x66, 0x7a, 0x8, 0x9c, 0xf7, 0xa3, 0x15, 0xf7,\n                                                          0x2b, 0xf7, 0x1, 0xf7, 0x47, 0xf7, 0x25, 0xf1,\n                                                          0xc2, 0x4c, 0x36, 0xfb, 0x60, 0xfb, 0x26, 0xfb,\n                                                          0x1e, 0xfb, 0x0, 0x40, 0x39, 0xb0, 0xf7, 0xf,\n                                                          0x1e, 0xe, 0x8b, 0xc1, 0xf7, 0x45, 0xbf, 0xf7,\n                                                          0x75, 0xc1, 0x1, 0xf7, 0x4, 0xc2, 0xf7, 0xf9,\n                                                          0xc3, 0x3, 0x9f, 0x16, 0xf7, 0x6c, 0x2a, 0xa,\n                                                          0x3b, 0x6, 0xae, 0xf7, 0x43, 0x5, 0xf7, 0x7,\n                                                          0x6, 0xa8, 0x5c, 0xcc, 0xfb, 0x6, 0xa4, 0x47,\n                                                          0x8, 0xf7, 0x18, 0x2a, 0xa, 0x24, 0x6, 0x73,\n                                                          0xc1, 0x60, 0xd6, 0x6d, 0xbb, 0x8, 0xe5, 0x8e,\n                                                          0xf7, 0x3, 0xb6, 0xf7, 0x33, 0x1a, 0xcb, 0x59,\n                                                          0xc9, 0x29, 0x1e, 0xfb, 0xbf, 0x2d, 0xa, 0xdc,\n                                                          0x5e, 0xa, 0x3a, 0x6, 0xf7, 0x4a, 0xf7, 0x79,\n                                                          0x15, 0xb8, 0xf7, 0x75, 0x5, 0xf7, 0x24, 0x6,\n                                                          0xd6, 0xba, 0x6c, 0x60, 0xfb, 0x26, 0xfb, 0x1c,\n                                                          0x86, 0x42, 0x1f, 0xe, 0x77, 0xc5, 0xf8, 0x7b,\n                                                          0xc2, 0x1, 0xf7, 0xc, 0xc7, 0xf7, 0xbc, 0xc7,\n                                                          0x3, 0x98, 0x7f, 0x15, 0xc5, 0x6, 0x95, 0xbf,\n                                                          0x5, 0x65, 0xc1, 0xd6, 0x75, 0xd5, 0x1b, 0xf7,\n                                                          0x8, 0xf7, 0x1c, 0xbe, 0xf7, 0x5, 0xf7, 0x5,\n                                                          0x2d, 0x9f, 0x31, 0x95, 0x1f, 0x3d, 0x93, 0x2d,\n                                                          0xaa, 0xcf, 0x1a, 0xdf, 0xe3, 0xba, 0xf2, 0xc3,\n                                                          0xbc, 0x6f, 0x68, 0xab, 0x1e, 0x7a, 0x3b, 0x5,\n                                                          0xc5, 0x6, 0xb1, 0xf7, 0x4f, 0x62, 0xa, 0x82,\n                                                          0x63, 0x5, 0xa6, 0x68, 0x58, 0xa3, 0x54, 0x1b,\n                                                          0xfb, 0x3a, 0x2d, 0x3a, 0x20, 0xfb, 0x6, 0xf7,\n                                                          0xd, 0x6d, 0xe5, 0x7d, 0x1f, 0xc8, 0x80, 0xdf,\n                                                          0x82, 0x43, 0x1a, 0x47, 0x24, 0x67, 0x2f, 0x42,\n                                                          0x41, 0xa1, 0xb5, 0x63, 0x1e, 0x9a, 0xd0, 0x5,\n                                                          0x50, 0x6, 0xe, 0x3e, 0xa, 0xf7, 0x54, 0xc2,\n                                                          0x3, 0xc5, 0x16, 0xf7, 0xc2, 0x2a, 0xa, 0xfb,\n                                                          0x10, 0x6, 0xe5, 0x87, 0xa, 0xf7, 0x43, 0x6,\n                                                          0x6d, 0xfb, 0x2d, 0x6a, 0xa, 0xb4, 0xf7, 0x63,\n                                                          0x5, 0xfc, 0x98, 0x6, 0x62, 0xfb, 0x63, 0x6a,\n                                                          0xa, 0xa9, 0xf7, 0x2d, 0x5, 0xf7, 0x43, 0x6,\n                                                          0x32, 0x58, 0xa, 0xfb, 0xf, 0x6, 0xe, 0x79,\n                                                          0xbf, 0xf8, 0x6d, 0xc2, 0x1, 0xd2, 0xc0, 0x3,\n                                                          0xbf, 0xf8, 0x8f, 0x85, 0xa, 0x56, 0xfb, 0x8c,\n                                                          0x81, 0x46, 0x68, 0x1a, 0x22, 0xb3, 0x47, 0xf7,\n                                                          0x16, 0xf7, 0x11, 0xe2, 0xc4, 0xf7, 0x2d, 0xa8,\n                                                          0x1e, 0x9f, 0xf4, 0x9e, 0xf4, 0x9f, 0xf4, 0x8,\n                                                          0xd8, 0x36, 0xa, 0xfb, 0x7c, 0x67, 0xa, 0xad,\n                                                          0xae, 0x8b, 0xad, 0x1b, 0x77, 0x22, 0x78, 0x23,\n                                                          0x77, 0x22, 0x8, 0xfb, 0xe, 0x73, 0x3c, 0x66,\n                                                          0x3d, 0x1b, 0x32, 0x66, 0xb7, 0xdb, 0xbf, 0xb4,\n                                                          0xf7, 0x49, 0x9f, 0xf7, 0x8, 0x1f, 0xf5, 0x36,\n                                                          0xa, 0xfb, 0x83, 0x6, 0xe, 0x93, 0x76, 0xf8,\n                                                          0x9c, 0xc2, 0x1, 0xf7, 0x31, 0x7e, 0x85, 0xa,\n                                                          0xf7, 0xbb, 0xf8, 0x9c, 0x5, 0xcb, 0x36, 0xa,\n                                                          0xfb, 0x70, 0x38, 0xa, 0xe5, 0x6, 0xfb, 0x99,\n                                                          0xfc, 0x64, 0x3a, 0xf8, 0x64, 0x5, 0xe6, 0x46,\n                                                          0xa, 0xfb, 0x77, 0x38, 0xa, 0xd3, 0x6, 0xe,\n                                                          0x93, 0x76, 0xf8, 0x9c, 0xc2, 0x1, 0xb1, 0xc5,\n                                                          0x3, 0x9c, 0x7e, 0x15, 0xcb, 0x6, 0xf7, 0x4b,\n                                                          0xf8, 0x0, 0xbe, 0xfc, 0x0, 0x5, 0xc6, 0x6,\n                                                          0xf7, 0x32, 0xf8, 0x9c, 0x5, 0xb7, 0x46, 0xa,\n                                                          0xfb, 0x5d, 0x56, 0xa, 0xf2, 0x6, 0xfb, 0xe,\n                                                          0xfc, 0x36, 0x58, 0xf8, 0x0, 0x5, 0x63, 0x6,\n                                                          0xfb, 0x4f, 0xfc, 0x2, 0xaf, 0xf8, 0x38, 0x5,\n                                                          0xef, 0x36, 0xa, 0xfb, 0x5d, 0x56, 0xa, 0xba,\n                                                          0x6, 0xe, 0x3e, 0xa, 0x71, 0xf7, 0x76, 0xf7,\n                                                          0x9, 0xf7, 0x6a, 0x3, 0x71, 0x16, 0xf7, 0x76,\n                                                          0x2a, 0xa, 0x2b, 0x6, 0xf7, 0x53, 0xf7, 0x50,\n                                                          0xf7, 0x0, 0xfb, 0x50, 0x5, 0x35, 0x2d, 0xa,\n                                                          0xf7, 0x6a, 0x2a, 0xa, 0x4a, 0x6, 0xfb, 0x18,\n                                                          0xf7, 0x7b, 0xf7, 0x5f, 0xf7, 0x73, 0x5, 0xce,\n                                                          0x2a, 0xa, 0xfb, 0x55, 0x2d, 0xa, 0xca, 0x6,\n                                                          0xfb, 0x37, 0xfb, 0x49, 0x2c, 0xf7, 0x49, 0x5,\n                                                          0xd8, 0x2a, 0xa, 0xfb, 0x64, 0x45, 0xa, 0xcf,\n                                                          0x6, 0xf7, 0x9, 0xfb, 0x73, 0xfb, 0x79, 0xfb,\n                                                          0x7b, 0x5, 0x49, 0x6, 0xe, 0x3e, 0xa, 0xb4,\n                                                          0x16, 0xf7, 0xc8, 0x2a, 0xa, 0xfb, 0x11, 0x6,\n                                                          0xab, 0xf7, 0x42, 0xf7, 0x7f, 0xf7, 0xac, 0x5,\n                                                          0xcf, 0x2a, 0xa, 0xfb, 0x5b, 0x2d, 0xa, 0xd2,\n                                                          0x6, 0xfb, 0x54, 0xfb, 0x77, 0x27, 0xf7, 0x77,\n                                                          0x5, 0xd3, 0x43, 0xa, 0xd1, 0x6, 0xf7, 0xe,\n                                                          0xfb, 0xac, 0x6b, 0xfb, 0x42, 0x5, 0xfb, 0x12,\n                                                          0x6, 0xe, 0x3e, 0xa, 0xba, 0xd3, 0xf7, 0xda,\n                                                          0xc0, 0x3, 0xb1, 0x16, 0xf8, 0x38, 0x6, 0xb3,\n                                                          0xf7, 0x5f, 0x5, 0x56, 0x6, 0x6e, 0xfb, 0x29,\n                                                          0x5, 0xfb, 0xbd, 0x6, 0xf8, 0x46, 0xf8, 0x5d,\n                                                          0x94, 0xbe, 0x5, 0xfc, 0x19, 0x6, 0x66, 0xfb,\n                                                          0x50, 0x5, 0xbe, 0x6, 0xa5, 0xf7, 0x1a, 0x5,\n                                                          0xf7, 0xa0, 0x6, 0xfc, 0x46, 0xfc, 0x5b, 0x5,\n                                                          0xe, 0xfb, 0x0, 0xc1, 0xf9, 0x2, 0xc1, 0x1,\n                                                          0xf7, 0x1c, 0xfb, 0x0, 0x15, 0xf7, 0x4e, 0x2a,\n                                                          0xa, 0xfb, 0x19, 0x6, 0xf7, 0xc, 0xf9, 0x2,\n                                                          0x5, 0xf7, 0x19, 0x2a, 0xa, 0xfb, 0x4e, 0x6,\n                                                          0xe, 0x23, 0xf9, 0x60, 0xfd, 0x33, 0x76, 0xf9,\n                                                          0x59, 0x77, 0x12, 0x13, 0x60, 0xf8, 0xb, 0xfb,\n                                                          0xd, 0x15, 0x13, 0x80, 0xba, 0x9c, 0x5, 0x13,\n                                                          0x60, 0xfb, 0x5a, 0xf9, 0x71, 0x5, 0x13, 0x80,\n                                                          0x5c, 0x7a, 0x5, 0xe, 0xfb, 0x0, 0xc1, 0xf9,\n                                                          0x2, 0xc1, 0x1, 0xf7, 0x27, 0x55, 0x15, 0x80,\n                                                          0x55, 0x5, 0xf7, 0x4e, 0x6, 0xf7, 0x22, 0xf9,\n                                                          0x6e, 0x5, 0xfb, 0x4e, 0x2d, 0xa, 0xf7, 0x19,\n                                                          0x6, 0xfb, 0xc, 0xfd, 0x2, 0x5, 0xe, 0xf7,\n                                                          0xf7, 0xf7, 0x9f, 0x12, 0xf2, 0xf8, 0x27, 0x17,\n                                                          0xe9, 0xf7, 0xf6, 0x15, 0xdc, 0xa6, 0xe1, 0xc6,\n                                                          0xce, 0xc4, 0xb9, 0x4f, 0xc1, 0x53, 0xd0, 0x71,\n                                                          0x94, 0xba, 0x18, 0x3b, 0xd7, 0x7c, 0xb8, 0x78,\n                                                          0xee, 0x8, 0x58, 0x6, 0x13, 0x40, 0x58, 0x2d,\n                                                          0x3c, 0x54, 0xfb, 0x0, 0x43, 0x8, 0xe, 0xfb,\n                                                          0x11, 0xbd, 0x1, 0x90, 0x40, 0x15, 0x81, 0x59,\n                                                          0x5, 0xf8, 0xed, 0x6, 0x95, 0xbd, 0x5, 0xe,\n                                                          0x65, 0xa, 0xf7, 0x61, 0xf8, 0xeb, 0x15, 0xf7,\n                                                          0x46, 0x25, 0x97, 0xaa, 0xfb, 0x31, 0x79, 0xa,\n                                                          0xf8, 0x20, 0x87, 0x15, 0xf7, 0x1f, 0x36, 0xa,\n                                                          0x36, 0x6, 0xbf, 0xf7, 0x97, 0x8b, 0x9e, 0x9b,\n                                                          0x1a, 0xc7, 0x5a, 0xaf, 0x25, 0x46, 0x36, 0x77,\n                                                          0x73, 0x4b, 0x1e, 0x39, 0xa, 0xc8, 0xc1, 0x8c,\n                                                          0x54, 0x77, 0x87, 0x5c, 0x85, 0x73, 0x1f, 0x92,\n                                                          0x5f, 0x5a, 0x92, 0x5a, 0x1b, 0xfb, 0x45, 0x41,\n                                                          0x38, 0x3f, 0x52, 0xb9, 0x56, 0xe6, 0xd8, 0xda,\n                                                          0xaf, 0xc0, 0xcd, 0x1f, 0x98, 0xd2, 0x15, 0x50,\n                                                          0x4b, 0x3e, 0x5d, 0x38, 0x1b, 0x56, 0x66, 0xa8,\n                                                          0xab, 0xdb, 0xf7, 0x7, 0x9c, 0xdb, 0x40, 0xa,\n                                                          0x7c, 0xc2, 0x5f, 0xc3, 0xf7, 0xe8, 0xc3, 0xf7,\n                                                          0x12, 0xc2, 0x12, 0xf8, 0xb0, 0xc5, 0x13, 0x78,\n                                                          0x8d, 0x87, 0x15, 0xf7, 0x21, 0x6, 0x9a, 0xdb,\n                                                          0x5, 0x13, 0xb8, 0x7b, 0x96, 0xa8, 0x40, 0xf7,\n                                                          0x14, 0x1b, 0xf7, 0x33, 0xf7, 0x5, 0xf7, 0x18,\n                                                          0xf7, 0x2f, 0xf7, 0x7, 0x32, 0xc8, 0x30, 0xfb,\n                                                          0x1, 0x46, 0x56, 0x72, 0x75, 0x1f, 0xbe, 0xf7,\n                                                          0x97, 0x66, 0xa, 0xe0, 0x6, 0x13, 0x78, 0x24,\n                                                          0xfc, 0x9e, 0x5, 0x35, 0x6, 0xf7, 0x48, 0xf7,\n                                                          0x45, 0x15, 0xf5, 0xa0, 0xed, 0xc4, 0xe4, 0x1b,\n                                                          0xea, 0xb7, 0x4c, 0x48, 0x1f, 0x13, 0xb8, 0xfb,\n                                                          0xe, 0xfb, 0x1, 0x27, 0x26, 0x3a, 0x3a, 0xcb,\n                                                          0xf7, 0x11, 0xa4, 0x1e, 0xe, 0x7c, 0xc0, 0xf7,\n                                                          0xf0, 0xc2, 0x12, 0xbc, 0xc5, 0xf7, 0xf5, 0xc2,\n                                                          0x17, 0xf8, 0x71, 0xf7, 0x9, 0x15, 0x76, 0x6d,\n                                                          0x31, 0x51, 0x3a, 0x1b, 0xfb, 0xe, 0x5c, 0xcd,\n                                                          0xc8, 0x1f, 0x13, 0x50, 0xf7, 0x5, 0xe8, 0xf7,\n                                                          0x0, 0xf7, 0x17, 0xc4, 0xbe, 0x7c, 0x67, 0xaf,\n                                                          0x1e, 0x7c, 0x3c, 0x6a, 0xa, 0x13, 0xe0, 0xaf,\n                                                          0xf7, 0x4d, 0x52, 0xa, 0x82, 0x5c, 0x5, 0xa9,\n                                                          0x63, 0x5d, 0x9c, 0x51, 0x1b, 0xfb, 0x5b, 0x2c,\n                                                          0xfb, 0x29, 0xfb, 0x15, 0xfb, 0x5, 0xe5, 0x4a,\n                                                          0xf7, 0x2, 0xe8, 0xd8, 0xab, 0xb9, 0xd0, 0x1f,\n                                                          0xe, 0x7c, 0xc2, 0x61, 0xc2, 0xf7, 0xe7, 0xc2,\n                                                          0xf7, 0x13, 0xc2, 0x12, 0xa1, 0xc5, 0x13, 0x78,\n                                                          0xf8, 0x1f, 0x89, 0x15, 0xf7, 0x1f, 0x36, 0xa,\n                                                          0x39, 0x6, 0xf7, 0x6, 0xf8, 0xd4, 0x5, 0xfb,\n                                                          0x58, 0x38, 0xa, 0xf7, 0x20, 0x6, 0x65, 0xfb,\n                                                          0x57, 0x5, 0xc9, 0x64, 0x46, 0x91, 0x54, 0x1b,\n                                                          0xfb, 0x33, 0xfb, 0x14, 0xfb, 0x16, 0xfb, 0x2c,\n                                                          0x1f, 0x13, 0xb8, 0x2a, 0xca, 0x38, 0xf7, 0x14,\n                                                          0xd4, 0xd8, 0xac, 0xc9, 0xbb, 0x1e, 0x13, 0x78,\n                                                          0xfb, 0xdf, 0xf7, 0x0, 0x15, 0xf4, 0xf3, 0xee,\n                                                          0xf7, 0x3, 0xf7, 0x0, 0xb2, 0x53, 0x52, 0x1e,\n                                                          0x13, 0xb8, 0xfb, 0xd, 0xfb, 0x1, 0xfb, 0xa,\n                                                          0xfb, 0x0, 0x26, 0x5f, 0xd1, 0xd9, 0x1e, 0xe,\n                                                          0x7c, 0xc0, 0xf7, 0x31, 0xc2, 0xf7, 0x21, 0xbd,\n                                                          0x1, 0xe4, 0xf7, 0x57, 0x15, 0xf8, 0x3b, 0x6,\n                                                          0x90, 0xa4, 0x8d, 0xa4, 0x8a, 0xa3, 0x8, 0xea,\n                                                          0x88, 0x51, 0xd8, 0xfb, 0x17, 0x1b, 0xfb, 0x35,\n                                                          0xfb, 0x1e, 0xfb, 0x19, 0xfb, 0x3d, 0x35, 0xd3,\n                                                          0x47, 0xf7, 0x21, 0xde, 0xe5, 0xa5, 0xaf, 0xd4,\n                                                          0x1f, 0x84, 0xbf, 0x5, 0x60, 0x32, 0x38, 0x79,\n                                                          0x5c, 0x1b, 0xfb, 0x7, 0x30, 0xc0, 0xf3, 0xae,\n                                                          0x1f, 0x9c, 0xc3, 0x15, 0xc6, 0x9f, 0xda, 0xdc,\n                                                          0xf7, 0x7, 0x1b, 0xf7, 0x21, 0x92, 0xfb, 0x8,\n                                                          0x72, 0x86, 0x1f, 0xe, 0x8b, 0xc2, 0xf7, 0xd9,\n                                                          0xc3, 0xf7, 0x1e, 0xc2, 0x1, 0xf7, 0x26, 0xc5,\n                                                          0x3, 0xa5, 0x16, 0xf8, 0x18, 0x36, 0xa, 0xfb,\n                                                          0x71, 0x6, 0xcb, 0xf7, 0xd9, 0x5, 0xf7, 0x71,\n                                                          0x3c, 0xa, 0xfb, 0x71, 0x6, 0xf7, 0x11, 0xab,\n                                                          0x87, 0x98, 0xf7, 0x9, 0x1b, 0xb2, 0xc3, 0x85,\n                                                          0x85, 0xaf, 0x1f, 0x9e, 0xc1, 0x5, 0x90, 0x6a,\n                                                          0x49, 0x93, 0x61, 0x1b, 0x3d, 0x31, 0x82, 0x3f,\n                                                          0x79, 0x1f, 0x71, 0xfb, 0x0, 0x5, 0xfb, 0x1,\n                                                          0x6, 0x81, 0x53, 0x5, 0xf7, 0x1, 0x6, 0x4a,\n                                                          0xfb, 0xd9, 0x57, 0xa, 0xe, 0xfb, 0x31, 0xbd,\n                                                          0xf7, 0x38, 0xbe, 0xf7, 0xae, 0xbe, 0x1, 0xab,\n                                                          0xc3, 0xf7, 0xca, 0xbf, 0x3, 0x3f, 0xa, 0x30,\n                                                          0xa, 0xe, 0x8b, 0xc2, 0xf7, 0xca, 0xc2, 0xf7,\n                                                          0x2e, 0xc2, 0x1, 0x9f, 0x16, 0xf7, 0x72, 0x36,\n                                                          0xa, 0x38, 0x6, 0xbf, 0xf7, 0x99, 0x5, 0xb6,\n                                                          0xc3, 0xd2, 0xb7, 0xcc, 0x1b, 0xdf, 0x90, 0x59,\n                                                          0x54, 0x81, 0x1f, 0x5a, 0xfb, 0x87, 0x5, 0x37,\n                                                          0x38, 0xa, 0xf7, 0x6f, 0x36, 0xa, 0x3a, 0x6,\n                                                          0xc0, 0xf7, 0x9d, 0x5, 0xca, 0x97, 0x85, 0xd6,\n                                                          0xfb, 0xa, 0x1b, 0x45, 0x40, 0x66, 0x5e, 0x4f,\n                                                          0x1f, 0xba, 0xf7, 0x91, 0x66, 0xa, 0xe2, 0x6,\n                                                          0x25, 0xfc, 0x9b, 0x7b, 0xa, 0xe, 0x8b, 0xc2,\n                                                          0xf7, 0xda, 0xc2, 0xed, 0xf7, 0xf, 0x1, 0xf7,\n                                                          0xe6, 0xf8, 0xaa, 0x15, 0xd1, 0x6, 0xa4, 0xf7,\n                                                          0xf, 0x5, 0x44, 0x6, 0xfb, 0xb8, 0xfd, 0x25,\n                                                          0x15, 0xf8, 0x2d, 0x36, 0xa, 0xfb, 0x42, 0x6,\n                                                          0xd4, 0xf8, 0x11, 0x5, 0xfb, 0x5b, 0x38, 0xa,\n                                                          0xf7, 0x25, 0x6, 0x4b, 0xfb, 0xda, 0x5, 0xfb,\n                                                          0x47, 0x6, 0xe, 0xfb, 0x31, 0xc1, 0xf8, 0x84,\n                                                          0xbf, 0xe9, 0xf7, 0xa, 0x1, 0xf8, 0x50, 0xf8,\n                                                          0xaf, 0x54, 0xa, 0xfc, 0x23, 0xfd, 0x80, 0x15,\n                                                          0x76, 0x59, 0x5, 0x82, 0xbe, 0xbe, 0x84, 0xbb,\n                                                          0x1b, 0xf6, 0xe0, 0xb6, 0xf7, 0x12, 0xaf, 0x1f,\n                                                          0xea, 0xf8, 0x45, 0x5, 0xfb, 0xe2, 0x82, 0xa,\n                                                          0xf7, 0xa5, 0x6, 0x39, 0xfc, 0x3, 0x5, 0xfb,\n                                                          0x9, 0x61, 0x46, 0x7f, 0x5c, 0x1b, 0x51, 0x5c,\n                                                          0x91, 0x91, 0x68, 0x1f, 0xe, 0x8b, 0xc2, 0xf7,\n                                                          0xd9, 0xc2, 0xf7, 0x1f, 0xc2, 0x1, 0x97, 0x16,\n                                                          0xf7, 0x20, 0x6, 0xb1, 0xf7, 0x5a, 0xcd, 0xb5,\n                                                          0xad, 0x6a, 0xcd, 0x31, 0xb0, 0x4d, 0x19, 0x53,\n                                                          0x38, 0xa, 0xf7, 0x6a, 0x46, 0xa, 0x2b, 0x6,\n                                                          0x6d, 0xba, 0x6d, 0xc5, 0x67, 0xb3, 0x4f, 0xcf,\n                                                          0x18, 0xf7, 0x47, 0xf7, 0x4, 0x5, 0xed, 0x77,\n                                                          0xa, 0xfb, 0x70, 0x6, 0x82, 0x54, 0x5, 0xb9,\n                                                          0x6, 0xfb, 0x5f, 0xfb, 0x13, 0xd5, 0xf8, 0xc,\n                                                          0x66, 0xa, 0xe1, 0x6, 0x26, 0xfc, 0x9b, 0x5,\n                                                          0x36, 0x6, 0xe, 0x8b, 0xc2, 0xf8, 0x9b, 0xc2,\n                                                          0x1, 0xe5, 0x16, 0xf8, 0x2d, 0x36, 0xa, 0xfb,\n                                                          0x43, 0x6, 0xf7, 0x1, 0xf8, 0xd2, 0x5, 0xfb,\n                                                          0x6b, 0x38, 0xa, 0xf7, 0x34, 0x6, 0x29, 0xfc,\n                                                          0x9b, 0x5, 0xfb, 0x47, 0x6, 0xe, 0x8b, 0xc1,\n                                                          0xf7, 0xe0, 0xc2, 0x7e, 0x77, 0x12, 0x13, 0xc0,\n                                                          0x91, 0x16, 0xf7, 0x11, 0x47, 0xa, 0x49, 0x6,\n                                                          0xc5, 0xf7, 0xa2, 0x5, 0xa7, 0xa6, 0xac, 0xad,\n                                                          0xbb, 0x1b, 0xbc, 0x96, 0x6d, 0x72, 0x7d, 0x88,\n                                                          0x7f, 0x8a, 0x87, 0x1f, 0x4c, 0xfb, 0xc1, 0x5,\n                                                          0xf7, 0x12, 0x2a, 0xa, 0x49, 0x6, 0xc2, 0xf7,\n                                                          0x97, 0x5, 0x96, 0x8d, 0xca, 0xcb, 0xc0, 0x1b,\n                                                          0xb3, 0x97, 0x77, 0x72, 0x78, 0x86, 0x74, 0x87,\n                                                          0x78, 0x1f, 0x50, 0xfb, 0xae, 0x5, 0xf7, 0x7,\n                                                          0x2a, 0xa, 0x53, 0x6, 0xc5, 0xf7, 0xa5, 0x8d,\n                                                          0x9b, 0x99, 0x1a, 0xba, 0x6d, 0xb0, 0x4c, 0x55,\n                                                          0x5a, 0x69, 0x67, 0x66, 0x1e, 0xb0, 0x83, 0x6e,\n                                                          0xac, 0x55, 0x1b, 0x5b, 0x64, 0x69, 0x74, 0x68,\n                                                          0x1f, 0x13, 0xa0, 0x93, 0xb7, 0x5, 0xfb, 0x7,\n                                                          0x5f, 0xa, 0xc3, 0x6, 0xe, 0x8b, 0xc1, 0xf7,\n                                                          0xc8, 0xc2, 0x6d, 0xc1, 0x12, 0xf7, 0x7, 0xc1,\n                                                          0xf7, 0xa5, 0xc1, 0x13, 0xd8, 0x9f, 0x16, 0xf7,\n                                                          0x72, 0x2a, 0xa, 0x37, 0x6, 0xbb, 0xf7, 0x86,\n                                                          0x5, 0x13, 0xb8, 0xbf, 0xc9, 0xe1, 0xb2, 0xd6,\n                                                          0x1b, 0xb5, 0x97, 0x79, 0x6a, 0x82, 0x8a, 0x81,\n                                                          0x89, 0x80, 0x1f, 0x5a, 0xfb, 0x90, 0x5, 0x38,\n                                                          0x2d, 0xa, 0xf7, 0x70, 0x2a, 0xa, 0x38, 0x6,\n                                                          0xbd, 0xf7, 0x91, 0x5, 0x8f, 0x9e, 0x8c, 0x9c,\n                                                          0x9b, 0x1a, 0xbf, 0x62, 0xa9, 0x40, 0x45, 0x3f,\n                                                          0x63, 0x5e, 0x4f, 0x1e, 0x99, 0xd3, 0x5, 0xfb,\n                                                          0x1e, 0x38, 0xa, 0xde, 0x6, 0x4d, 0xfb, 0xd3,\n                                                          0x5, 0x37, 0x6, 0xe, 0x7c, 0xc1, 0xf7, 0xf0,\n                                                          0xc1, 0x1, 0xc4, 0xc2, 0xf8, 0xb, 0xc3, 0x3,\n                                                          0xc4, 0xf7, 0x3b, 0x15, 0xfb, 0x0, 0xd5, 0x41,\n                                                          0xf7, 0x17, 0xf7, 0x39, 0xf7, 0x8, 0xf7, 0x13,\n                                                          0xf7, 0x2c, 0xde, 0x5d, 0xe9, 0xfb, 0x2b, 0xfb,\n                                                          0x28, 0xfb, 0x21, 0xfb, 0x2, 0xfb, 0x38, 0x1e,\n                                                          0xc2, 0x92, 0x15, 0xf7, 0x1, 0xea, 0xf3, 0xf7,\n                                                          0x14, 0xf7, 0xd, 0xaa, 0x40, 0x51, 0xfb, 0x9,\n                                                          0x2b, 0x29, 0xfb, 0xc, 0xfb, 0x1, 0x59, 0xcd,\n                                                          0xd0, 0x1e, 0xe, 0xfb, 0x31, 0xbe, 0xf7, 0xa,\n                                                          0xbf, 0xf7, 0xc5, 0xbf, 0x6a, 0xc0, 0x12, 0xf8,\n                                                          0x90, 0xc4, 0x13, 0xd8, 0x6a, 0x21, 0x15, 0x80,\n                                                          0x58, 0x5, 0xf7, 0xbb, 0x78, 0xa, 0xfb, 0x30,\n                                                          0x6, 0xb2, 0xf7, 0x4d, 0x5, 0x65, 0xa3, 0xbd,\n                                                          0x6e, 0xe7, 0x1b, 0xf7, 0x20, 0xf7, 0x6, 0xf7,\n                                                          0xa, 0xf7, 0x27, 0xe7, 0x4d, 0xd3, 0x21, 0x33,\n                                                          0x50, 0x60, 0x5f, 0x5d, 0x1f, 0x13, 0xe8, 0x9a,\n                                                          0xce, 0x5, 0xfb, 0x1f, 0x6, 0x81, 0x57, 0x5,\n                                                          0xdf, 0x6, 0x25, 0xfc, 0x6f, 0x5, 0xf7, 0xb,\n                                                          0xf7, 0xb2, 0x15, 0x13, 0xd8, 0xed, 0xe5, 0xf7,\n                                                          0x2, 0xf7, 0xe, 0xf3, 0xa0, 0x4d, 0x55, 0xfb,\n                                                          0xe, 0x2b, 0x35, 0x2d, 0x37, 0x4c, 0xb2, 0xd8,\n                                                          0x1e, 0xe, 0xfb, 0x31, 0xbf, 0xf7, 0xb, 0xbe,\n                                                          0xf7, 0xcd, 0xbe, 0x63, 0xbf, 0x12, 0xb4, 0xc4,\n                                                          0x13, 0xe8, 0xf7, 0x6b, 0x22, 0x15, 0x80, 0x57,\n                                                          0x5, 0xf7, 0xbf, 0x6, 0x96, 0xbf, 0x5, 0x35,\n                                                          0x6, 0xf4, 0xf8, 0x77, 0x5, 0xe0, 0x6, 0x95,\n                                                          0xbe, 0x5, 0xfb, 0x20, 0x6, 0x78, 0x42, 0x5,\n                                                          0x13, 0xd8, 0xb2, 0x75, 0x53, 0xb9, 0x36, 0x1b,\n                                                          0xfb, 0x1b, 0xfb, 0x16, 0xfb, 0x6, 0xfb, 0x24,\n                                                          0x27, 0xcc, 0x46, 0xf7, 0x2, 0xcb, 0xd2, 0x98,\n                                                          0xc1, 0xc7, 0x1f, 0x65, 0xfb, 0x4e, 0x5, 0xfb,\n                                                          0xa7, 0xf7, 0xbf, 0x15, 0xd3, 0xbc, 0xf7, 0xf,\n                                                          0xf7, 0x2a, 0xef, 0xba, 0x49, 0x3f, 0xfb, 0xb,\n                                                          0xfb, 0x12, 0x4c, 0x32, 0x40, 0x53, 0xbb, 0xdc,\n                                                          0x1e, 0xe, 0x8b, 0xc1, 0xf7, 0xe2, 0xc1, 0x1,\n                                                          0xf7, 0x32, 0xc4, 0x3, 0x9f, 0x16, 0xf7, 0xfe,\n                                                          0x2a, 0xa, 0xfb, 0x46, 0x6, 0xb4, 0xf7, 0x64,\n                                                          0x5, 0xf2, 0xf7, 0x18, 0xbc, 0xa2, 0xc1, 0x1b,\n                                                          0xa4, 0xa0, 0x85, 0x69, 0x8c, 0x1f, 0xc4, 0x90,\n                                                          0x5, 0xbe, 0x8c, 0x79, 0xb0, 0x51, 0x1b, 0x2a,\n                                                          0x3e, 0x4c, 0x54, 0x3f, 0x1f, 0x9f, 0xf4, 0x5,\n                                                          0xfb, 0x4c, 0x5f, 0xa, 0xf7, 0x13, 0x6, 0x4a,\n                                                          0xfb, 0xd4, 0x5, 0xfb, 0x13, 0x6, 0xe, 0x7c,\n                                                          0xc1, 0xf7, 0xf0, 0xc1, 0x1, 0xf7, 0xa, 0xca,\n                                                          0xf7, 0xaa, 0xc5, 0x3, 0xba, 0x7c, 0x15, 0xc4,\n                                                          0x3c, 0xa, 0x72, 0xb2, 0xbe, 0x6c, 0xdd, 0x1b,\n                                                          0xf7, 0x10, 0xf5, 0xba, 0xf3, 0xcc, 0x52, 0xa5,\n                                                          0x53, 0x94, 0x1f, 0x54, 0x94, 0xfb, 0x3c, 0x9c,\n                                                          0xbf, 0x1a, 0xd8, 0xea, 0x87, 0xbf, 0xc4, 0xbf,\n                                                          0x71, 0x70, 0xb1, 0x1e, 0x81, 0x5a, 0x51, 0xa,\n                                                          0xab, 0xf7, 0x30, 0x71, 0xa, 0x80, 0x5b, 0x5,\n                                                          0xa5, 0x62, 0x58, 0xa1, 0x51, 0x1b, 0xfb, 0x19,\n                                                          0x36, 0x67, 0x2a, 0x42, 0xf7, 0x21, 0x60, 0xd6,\n                                                          0x85, 0x1f, 0xb9, 0x87, 0xda, 0x83, 0x5b, 0x1a,\n                                                          0x30, 0xfb, 0x19, 0x8f, 0x62, 0x4a, 0x50, 0xa8,\n                                                          0xb2, 0x6a, 0x1e, 0x95, 0xbb, 0x62, 0xa, 0xe,\n                                                          0x7c, 0xc2, 0xf7, 0xe4, 0xc2, 0xf7, 0x16, 0x77,\n                                                          0x1, 0xf7, 0x17, 0xc6, 0x3, 0xf7, 0x5, 0xf8,\n                                                          0xc, 0x15, 0xd4, 0x6, 0x54, 0xfb, 0xa7, 0x8b,\n                                                          0x7f, 0x7f, 0x1a, 0x3d, 0x8c, 0xe9, 0x7d, 0xb9,\n                                                          0x1b, 0xd8, 0xdd, 0xa8, 0xa6, 0xd2, 0x1f, 0x8f,\n                                                          0xc1, 0x5, 0x77, 0x51, 0x37, 0x68, 0x45, 0x1b,\n                                                          0x51, 0x5d, 0x92, 0xc7, 0x1f, 0xbf, 0xf7, 0xa1,\n                                                          0x5, 0xf7, 0x93, 0x77, 0xa, 0xfb, 0x93, 0x6,\n                                                          0xa5, 0xf7, 0x16, 0x71, 0xa, 0x71, 0xfb, 0x16,\n                                                          0x5, 0x42, 0x6, 0xe, 0x7c, 0xc0, 0x63, 0xc1,\n                                                          0xf7, 0xd4, 0xc1, 0x12, 0x13, 0xa0, 0xcb, 0xf8,\n                                                          0x8, 0x85, 0xa, 0x58, 0xfb, 0x96, 0x8a, 0x80,\n                                                          0x81, 0x1a, 0x45, 0xc2, 0x65, 0xd7, 0xb2, 0xc0,\n                                                          0x9c, 0xd2, 0xe3, 0x1e, 0x13, 0x60, 0x7c, 0x40,\n                                                          0x5, 0xf7, 0x1a, 0x2a, 0xa, 0x3a, 0x6, 0xd3,\n                                                          0xf8, 0xa, 0x55, 0xa, 0x82, 0x55, 0x5, 0xdc,\n                                                          0x6, 0x5e, 0xfb, 0x7a, 0x5, 0x13, 0xa0, 0x59,\n                                                          0x5b, 0x4d, 0x55, 0x4d, 0x1b, 0x56, 0x62, 0xa1,\n                                                          0xb2, 0x90, 0x8b, 0x90, 0x8c, 0x90, 0x1f, 0x9e,\n                                                          0xf3, 0x9d, 0xf3, 0x9e, 0xf3, 0x8, 0xfb, 0x1b,\n                                                          0x6, 0xe, 0x96, 0x76, 0xf8, 0x11, 0xc2, 0x1,\n                                                          0xf7, 0x52, 0x81, 0x15, 0xcc, 0x6, 0xf7, 0x8d,\n                                                          0xf8, 0x11, 0x5, 0xdc, 0x77, 0xa, 0xfb, 0x6a,\n                                                          0x67, 0xa, 0xd5, 0x6, 0xfb, 0x68, 0xfb, 0xd7,\n                                                          0x38, 0xf7, 0xd7, 0x5, 0xd7, 0x77, 0xa, 0xfb,\n                                                          0x72, 0x67, 0xa, 0xe2, 0x6, 0xe, 0x96, 0x76,\n                                                          0xf8, 0x11, 0xc2, 0x1, 0xcb, 0xc0, 0x3, 0xdc,\n                                                          0x81, 0x15, 0xcb, 0x6, 0xf7, 0x11, 0xf7, 0x9b,\n                                                          0xaa, 0xfb, 0x9b, 0x5, 0xc8, 0x6, 0xf7, 0x44,\n                                                          0xf8, 0x11, 0x5, 0xb0, 0x77, 0xa, 0xfb, 0x32,\n                                                          0x38, 0xa, 0xd3, 0x6, 0xfb, 0x23, 0xfb, 0xc5,\n                                                          0x6b, 0xf7, 0xb2, 0x5, 0x5b, 0x6, 0xfb, 0x1b,\n                                                          0xfb, 0xb0, 0x71, 0xf7, 0xc3, 0x5, 0xd4, 0x6,\n                                                          0x94, 0xc2, 0x5, 0xfb, 0x36, 0x67, 0xa, 0xac,\n                                                          0x6, 0xe, 0x8b, 0xc1, 0xf7, 0xd3, 0xc0, 0x1,\n                                                          0x7a, 0x16, 0xf7, 0x68, 0x47, 0xa, 0x48, 0x6,\n                                                          0xf7, 0x3b, 0xf7, 0x16, 0xf7, 0x2, 0xfb, 0x16,\n                                                          0x5, 0x4c, 0x2d, 0xa, 0xf7, 0x69, 0x47, 0xa,\n                                                          0x3b, 0x6, 0xfb, 0x21, 0xf7, 0x38, 0xf7, 0x48,\n                                                          0xf7, 0x2f, 0x5, 0xdc, 0x6, 0x95, 0xc0, 0x5,\n                                                          0xfb, 0x55, 0x68, 0xa, 0xb6, 0x6, 0xfb, 0x1f,\n                                                          0xfb, 0xc, 0x30, 0xf7, 0xc, 0x5, 0xbf, 0x6,\n                                                          0x95, 0xc0, 0x5, 0xfb, 0x5e, 0x68, 0xa, 0xdb,\n                                                          0x6, 0xf7, 0xd, 0xfb, 0x2e, 0xfb, 0x64, 0xfb,\n                                                          0x39, 0x5, 0x3e, 0x6, 0xe, 0xfb, 0x31, 0xbe,\n                                                          0xf8, 0x75, 0xbe, 0x1, 0x6c, 0x21, 0x15, 0x7f,\n                                                          0x58, 0x5, 0xf7, 0xa2, 0x78, 0xa, 0x32, 0x6,\n                                                          0xf8, 0x35, 0xf8, 0x75, 0x5, 0xce, 0x78, 0xa,\n                                                          0xfb, 0x53, 0x6, 0x80, 0x58, 0x5, 0xc7, 0x6,\n                                                          0xfb, 0x7c, 0xfb, 0xa1, 0x21, 0xf7, 0xa1, 0x5,\n                                                          0xce, 0x78, 0xa, 0xfb, 0x5f, 0x6, 0x80, 0x58,\n                                                          0x5, 0xd3, 0x6, 0xf7, 0x13, 0xfb, 0xd2, 0xfb,\n                                                          0x22, 0xfb, 0x37, 0x5, 0xe, 0x8b, 0xc1, 0xf7,\n                                                          0xd2, 0xc1, 0x1, 0xc0, 0x16, 0xf8, 0x2d, 0x6,\n                                                          0xaa, 0xf7, 0x1a, 0x52, 0xa, 0x76, 0x3b, 0x5,\n                                                          0xfb, 0xa7, 0x6, 0xf8, 0x1f, 0xf7, 0xd6, 0x95,\n                                                          0xbd, 0x5, 0xfc, 0x1f, 0x6, 0x6b, 0xfb, 0x18,\n                                                          0x5, 0xc1, 0x6, 0xa2, 0xd9, 0x5, 0xf7, 0x98,\n                                                          0x6, 0xfc, 0x1e, 0xfb, 0xd5, 0x5, 0xe, 0xfb,\n                                                          0x70, 0xc0, 0xf9, 0xf1, 0xc0, 0x1, 0xf7, 0x53,\n                                                          0xba, 0x3, 0xf7, 0xa, 0xf7, 0x81, 0x15, 0xbe,\n                                                          0x73, 0x9e, 0x78, 0x8a, 0x53, 0x8, 0x74, 0x86,\n                                                          0x6d, 0x82, 0x65, 0x1e, 0x7a, 0x3b, 0x84, 0x55,\n                                                          0x65, 0x1a, 0x4c, 0xb1, 0x7b, 0xe4, 0x7b, 0x1e,\n                                                          0x95, 0xc0, 0x5, 0x59, 0x93, 0x67, 0x96, 0xad,\n                                                          0x1a, 0xa9, 0x92, 0xbb, 0xa0, 0xde, 0x1e, 0x91,\n                                                          0xa4, 0x8f, 0xb9, 0xb5, 0x1a, 0xb5, 0x7e, 0xb4,\n                                                          0x6e, 0xa1, 0x1e, 0xe6, 0xc2, 0xa1, 0xf7, 0x0,\n                                                          0x92, 0xb9, 0x8, 0xf7, 0x5f, 0xb0, 0xab, 0x9c,\n                                                          0xdf, 0x1b, 0x97, 0xc0, 0x5, 0xfb, 0x23, 0x74,\n                                                          0x5d, 0xfb, 0x71, 0x59, 0x1f, 0x6f, 0xfb, 0x14,\n                                                          0x72, 0x6e, 0x38, 0x6a, 0x8, 0xe, 0xfb, 0x79,\n                                                          0x76, 0xfa, 0x7c, 0x77, 0x1, 0xf7, 0x3c, 0xbe,\n                                                          0x3, 0xf7, 0x3c, 0xfb, 0x8e, 0x15, 0xbe, 0x6,\n                                                          0xf7, 0x68, 0xfa, 0x7c, 0x5, 0x58, 0x6, 0xe,\n                                                          0xfb, 0x71, 0xc0, 0xf9, 0xf1, 0xc0, 0x1, 0xf7,\n                                                          0xaf, 0xbe, 0x3, 0xf8, 0x75, 0xf7, 0xb5, 0x15,\n                                                          0x58, 0xa3, 0x78, 0x9e, 0x8c, 0xc3, 0x8, 0xa2,\n                                                          0x8f, 0xa9, 0x94, 0xb1, 0x1e, 0x9c, 0xdb, 0x93,\n                                                          0xc1, 0xb1, 0x1a, 0xca, 0x65, 0x9b, 0x32, 0x9b,\n                                                          0x1e, 0x81, 0x56, 0x5, 0xbd, 0x83, 0xaf, 0x80,\n                                                          0x69, 0x1a, 0x6d, 0x81, 0x59, 0x7c, 0x3a, 0x1e,\n                                                          0x86, 0x72, 0x83, 0x5d, 0x61, 0x1a, 0x61, 0x98,\n                                                          0x62, 0xa8, 0x75, 0x1e, 0x30, 0x54, 0x75, 0xfb,\n                                                          0x0, 0x84, 0x5d, 0x8, 0xfb, 0x5f, 0x66, 0x6b,\n                                                          0x7a, 0x37, 0x1b, 0x7f, 0x56, 0x5, 0xf7, 0x23,\n                                                          0xa2, 0xb9, 0xf7, 0x71, 0xbd, 0x1f, 0xa7, 0xf7,\n                                                          0x14, 0xa4, 0xa8, 0xde, 0xac, 0x8, 0xe, 0xf7,\n                                                          0x59, 0xc8, 0x91, 0xc3, 0x12, 0xf0, 0xf7, 0x59,\n                                                          0x15, 0xaa, 0xa7, 0xaf, 0xaf, 0xb1, 0x1b, 0xb0,\n                                                          0xa6, 0x78, 0x7a, 0xa7, 0x1f, 0x7b, 0xa4, 0xa5,\n                                                          0x7c, 0xae, 0x1b, 0xcd, 0xbf, 0xaf, 0xb7, 0xb6,\n                                                          0x1f, 0x64, 0xb6, 0x5, 0x77, 0x78, 0x4f, 0x61,\n                                                          0x66, 0x1b, 0x6e, 0x77, 0x97, 0x99, 0x75, 0x1f,\n                                                          0x9c, 0x70, 0x6e, 0x9e, 0x53, 0x1b, 0x4b, 0x62,\n                                                          0x5e, 0x67, 0x62, 0x1f, 0xe, 0xfb, 0x1c, 0x76,\n                                                          0xf8, 0x67, 0xf7, 0xc, 0x1, 0xf7, 0x9f, 0xf7,\n                                                          0x23, 0x3, 0xf7, 0x9f, 0xf7, 0xf8, 0x15, 0x71,\n                                                          0xa7, 0x77, 0xa8, 0xba, 0xb2, 0xae, 0xaf, 0xa5,\n                                                          0x74, 0xa2, 0x66, 0x5b, 0x68, 0x69, 0x63, 0x1e,\n                                                          0x3e, 0xfc, 0x95, 0x85, 0xa, 0xc9, 0xf8, 0x1e,\n                                                          0x5, 0x5d, 0x6, 0xe, 0xe9, 0xc2, 0xf7, 0xa1,\n                                                          0xc2, 0x1, 0xdc, 0xc4, 0xf7, 0x4f, 0xc2, 0x3,\n                                                          0xf7, 0x56, 0x5a, 0x15, 0xc2, 0x6, 0xa6, 0xf7,\n                                                          0x23, 0xd3, 0x8f, 0xc7, 0xa7, 0xc7, 0xad, 0x19,\n                                                          0x85, 0xb9, 0x5, 0x6b, 0x50, 0x4b, 0x72, 0x49,\n                                                          0x1b, 0x29, 0x66, 0xc2, 0xbb, 0xe1, 0xdd, 0xdb,\n                                                          0xf3, 0xb8, 0xc1, 0x7b, 0x6c, 0x9d, 0x1f, 0x81,\n                                                          0x59, 0x6a, 0xa, 0xab, 0xf7, 0x36, 0x5, 0x55,\n                                                          0x6, 0x81, 0x58, 0x6c, 0xa3, 0x6a, 0x99, 0x66,\n                                                          0x8f, 0x19, 0xa6, 0xf7, 0x20, 0x52, 0xa, 0x70,\n                                                          0xfb, 0x21, 0x5, 0x34, 0x8a, 0xfb, 0x16, 0x2c,\n                                                          0xfb, 0x18, 0x1a, 0x2e, 0xcf, 0x58, 0xd3, 0x84,\n                                                          0x1e, 0xe, 0x76, 0xc5, 0xf7, 0x82, 0xc4, 0xf7,\n                                                          0x71, 0xc5, 0x12, 0xf7, 0x33, 0xc1, 0x61, 0xbf,\n                                                          0x13, 0xe8, 0xbe, 0xaa, 0x15, 0x9b, 0x57, 0x5,\n                                                          0xa1, 0xc0, 0xe0, 0x93, 0x9b, 0x1b, 0xa1, 0x9d,\n                                                          0x82, 0x83, 0xa0, 0x1f, 0x84, 0x9d, 0x9f, 0x85,\n                                                          0xa4, 0x53, 0xa, 0x74, 0x7b, 0x91, 0x92, 0x7b,\n                                                          0x1f, 0x94, 0x77, 0x79, 0x94, 0x70, 0x1b, 0x69,\n                                                          0x67, 0x81, 0x7c, 0x69, 0x1f, 0x8e, 0x6, 0xea,\n                                                          0xe0, 0x8c, 0xc8, 0x8c, 0xe1, 0x8, 0xf7, 0x6e,\n                                                          0x6, 0x96, 0xc4, 0x5, 0xfb, 0x7f, 0x6, 0x13,\n                                                          0xf0, 0x89, 0xa3, 0x88, 0xa5, 0x8c, 0xa5, 0x8,\n                                                          0x42, 0xa, 0x6c, 0x8f, 0x6d, 0x8d, 0x6e, 0x8,\n                                                          0x2c, 0x6, 0x80, 0x52, 0x5, 0x13, 0xe8, 0xf7,\n                                                          0x5, 0x6, 0x23, 0x64, 0x3f, 0x3a, 0x4b, 0x1e,\n                                                          0xe, 0xd7, 0xb9, 0x60, 0x76, 0xf8, 0x14, 0xb9,\n                                                          0x9d, 0x77, 0x12, 0xe1, 0xbb, 0xf7, 0xdf, 0xbc,\n                                                          0x13, 0x6c, 0xac, 0xeb, 0x15, 0xa9, 0x65, 0xda,\n                                                          0xc5, 0x5, 0x13, 0xac, 0x64, 0xb9, 0xb0, 0x8a,\n                                                          0xac, 0x1b, 0xbd, 0xbe, 0x9b, 0xa7, 0xb7, 0x1f,\n                                                          0x13, 0x5c, 0xbe, 0x4d, 0xae, 0xa8, 0x58, 0xcb,\n                                                          0x5, 0xbe, 0xb3, 0xa4, 0xd6, 0xc1, 0x1a, 0x8c,\n                                                          0xaf, 0x86, 0xa4, 0x7a, 0xa5, 0xd5, 0xc9, 0x18,\n                                                          0x6c, 0xb0, 0x42, 0x50, 0x5, 0x13, 0xac, 0xa9,\n                                                          0x6c, 0x62, 0x96, 0x5a, 0x1b, 0x59, 0x55, 0x7b,\n                                                          0x6e, 0x61, 0x1f, 0x13, 0x9c, 0x57, 0xca, 0x66,\n                                                          0x6c, 0xc0, 0x4c, 0x5, 0x57, 0x51, 0x75, 0x5d,\n                                                          0x4c, 0x1a, 0x8a, 0x68, 0x92, 0x6e, 0x9c, 0x71,\n                                                          0x8, 0xa4, 0xe4, 0x15, 0x13, 0xac, 0xea, 0xe2,\n                                                          0xf2, 0xf7, 0x3, 0xdb, 0xc0, 0x52, 0x48, 0xfb,\n                                                          0x4, 0x21, 0x37, 0x30, 0x3f, 0x51, 0xbe, 0xd2,\n                                                          0x1e, 0xe, 0x8b, 0xc1, 0xd9, 0xc1, 0xcf, 0xc2,\n                                                          0xf7, 0x5b, 0xc1, 0x1, 0xc3, 0x16, 0xf7, 0xa9,\n                                                          0x2a, 0xa, 0xfb, 0x2, 0x6, 0x9a, 0xd9, 0x5,\n                                                          0xf7, 0x18, 0x47, 0xa, 0xfb, 0x19, 0x6, 0x98,\n                                                          0xcf, 0x5, 0xf7, 0x19, 0x46, 0xa, 0xfb, 0x12,\n                                                          0x6, 0xf7, 0x5f, 0xf7, 0x5b, 0x5, 0xdb, 0x2a,\n                                                          0xa, 0xfb, 0x64, 0x2d, 0xa, 0xd0, 0x6, 0xfb,\n                                                          0x45, 0xfb, 0x40, 0x22, 0xf7, 0x40, 0x5, 0xcf,\n                                                          0x2a, 0xa, 0xfb, 0x65, 0x2d, 0xa, 0xdc, 0x6,\n                                                          0xf7, 0xe, 0xfb, 0x5b, 0x5, 0xfb, 0xb, 0x38,\n                                                          0xa, 0xf7, 0x17, 0x6, 0x7e, 0x47, 0x5, 0xfb,\n                                                          0x17, 0x45, 0xa, 0xf7, 0x18, 0x6, 0x7b, 0x3d,\n                                                          0x5, 0xfb, 0x2, 0x6, 0xe, 0xf7, 0x4c, 0xbc,\n                                                          0x3, 0xf7, 0xad, 0xf7, 0xaf, 0x15, 0xbd, 0x6,\n                                                          0xdf, 0xf8, 0x1c, 0x5, 0x59, 0x6, 0xfb, 0x49,\n                                                          0xfd, 0xe6, 0x15, 0xbc, 0x6, 0xe0, 0xf8, 0x1d,\n                                                          0x5, 0x59, 0x6, 0xe, 0x3d, 0xc2, 0xf7, 0xb,\n                                                          0xb4, 0xf8, 0x18, 0xc2, 0x1, 0xe3, 0xc4, 0xf7,\n                                                          0x71, 0xc4, 0x3, 0xc4, 0x3d, 0x15, 0xf7, 0x87,\n                                                          0x6, 0xcd, 0xc4, 0xac, 0xbc, 0xa6, 0x7e, 0xaa,\n                                                          0x68, 0xad, 0x1f, 0xe3, 0x8a, 0xa7, 0xde, 0xb0,\n                                                          0x1a, 0xa8, 0x7a, 0xa3, 0x75, 0x9d, 0x1e, 0xfb,\n                                                          0x65, 0xf7, 0x4c, 0x87, 0x93, 0x96, 0x1a, 0xaf,\n                                                          0x8c, 0xb7, 0x8b, 0xa0, 0x1b, 0xf7, 0x3f, 0x6,\n                                                          0x75, 0x26, 0x5, 0xc4, 0x6, 0xab, 0xf7, 0x30,\n                                                          0x5, 0xfb, 0x50, 0x6, 0x48, 0x24, 0x85, 0x35,\n                                                          0x70, 0x9a, 0x76, 0xab, 0x6a, 0x1f, 0x5a, 0x4a,\n                                                          0x56, 0x52, 0x73, 0x9d, 0x6a, 0xa0, 0x79, 0x1f,\n                                                          0xf7, 0x4e, 0xfb, 0x39, 0x5, 0x99, 0x7f, 0x94,\n                                                          0x77, 0x7b, 0x1a, 0x79, 0x7d, 0x7d, 0x6d, 0x1e,\n                                                          0xfb, 0x5a, 0x6, 0xa0, 0xf0, 0x62, 0xa, 0xf7,\n                                                          0x93, 0xc6, 0x15, 0xfb, 0x1d, 0xf7, 0xb, 0x5,\n                                                          0x7c, 0x99, 0x85, 0x9a, 0x9a, 0x1a, 0xaf, 0xb6,\n                                                          0xab, 0xb2, 0x8c, 0x1e, 0xf7, 0x22, 0xfb, 0x9,\n                                                          0x5, 0x9a, 0x7d, 0x96, 0x7f, 0x74, 0x1a, 0x7c,\n                                                          0x75, 0x58, 0x45, 0x1e, 0xe, 0xf8, 0x80, 0xf2,\n                                                          0x1, 0xf7, 0xd9, 0xf8, 0x80, 0x15, 0xef, 0x6,\n                                                          0xa8, 0xf2, 0x5, 0x27, 0x6, 0xfb, 0x64, 0x24,\n                                                          0x15, 0xf2, 0x6, 0xa8, 0xf2, 0x5, 0x24, 0x6,\n                                                          0xe, 0x79, 0xb9, 0xe6, 0xb8, 0xf7, 0x8f, 0xb8,\n                                                          0xd7, 0xb7, 0x1, 0x84, 0xb9, 0xf7, 0x0, 0xba,\n                                                          0xf8, 0x3, 0xb9, 0x3, 0x84, 0xf7, 0x66, 0x15,\n                                                          0xfb, 0x18, 0xf5, 0x2b, 0xf7, 0x23, 0xf7, 0x59,\n                                                          0xf7, 0x3c, 0xf7, 0x38, 0xf7, 0x5d, 0xf7, 0x1d,\n                                                          0x20, 0xeb, 0xfb, 0x1f, 0xfb, 0x41, 0xfb, 0x57,\n                                                          0xfb, 0x35, 0xfb, 0x65, 0x1e, 0xb9, 0x9c, 0x15,\n                                                          0xf7, 0x2f, 0xf7, 0x20, 0xf7, 0x2e, 0xf7, 0x43,\n                                                          0xf7, 0x11, 0xdd, 0x39, 0xfb, 0x8, 0xfb, 0x37,\n                                                          0xfb, 0x2e, 0xfb, 0x27, 0xfb, 0x31, 0xfb, 0xa,\n                                                          0x2e, 0xde, 0xf7, 0x8, 0x1e, 0xf7, 0xfc, 0x7d,\n                                                          0x15, 0x6b, 0x69, 0x63, 0x7a, 0x68, 0x1b, 0x51,\n                                                          0x65, 0xb5, 0xc0, 0xe3, 0xd7, 0xcf, 0xd3, 0xaa,\n                                                          0xb1, 0x7c, 0x77, 0x9f, 0x1f, 0xad, 0xae, 0x5,\n                                                          0xab, 0x66, 0x6e, 0x98, 0x5d, 0x1b, 0xfb, 0x7,\n                                                          0x30, 0x27, 0x20, 0x39, 0xca, 0x57, 0xd2, 0xbd,\n                                                          0xc5, 0xa3, 0xab, 0xb2, 0x1f, 0xe, 0xf7, 0x8d,\n                                                          0xc7, 0xda, 0xc5, 0xda, 0xc2, 0x1, 0xf7, 0xeb,\n                                                          0xf7, 0x95, 0x15, 0xee, 0x6, 0x94, 0xc6, 0x5,\n                                                          0x56, 0x6, 0xa0, 0xf7, 0x25, 0x5, 0x8d, 0x9a,\n                                                          0x8d, 0x99, 0x95, 0x1a, 0xc8, 0x5c, 0x9e, 0x58,\n                                                          0x5b, 0x54, 0x7a, 0x7c, 0x6d, 0x1e, 0x8e, 0x50,\n                                                          0x5, 0x9d, 0xa6, 0xc1, 0x9d, 0xb4, 0x1b, 0xac,\n                                                          0xa2, 0x84, 0x61, 0x80, 0x89, 0x7f, 0x87, 0x7b,\n                                                          0x1f, 0x90, 0x75, 0x71, 0x8f, 0x71, 0x1b, 0xfb,\n                                                          0x8, 0x6e, 0x43, 0x5d, 0x62, 0xa8, 0x65, 0xbd,\n                                                          0xb6, 0xb9, 0xa7, 0xac, 0xae, 0x1f, 0x93, 0xd1,\n                                                          0x15, 0x5f, 0x6a, 0x5e, 0x70, 0x62, 0x1b, 0x71,\n                                                          0x78, 0x94, 0x9f, 0xab, 0xa7, 0x9d, 0xc1, 0xb4,\n                                                          0xb4, 0x83, 0x8b, 0x1f, 0xe, 0xda, 0x76, 0xf8,\n                                                          0x18, 0x77, 0x1, 0xf7, 0x86, 0xf7, 0x93, 0x15,\n                                                          0xf7, 0x4b, 0xfb, 0x4d, 0xab, 0xba, 0xfb, 0x15,\n                                                          0xf7, 0x1e, 0xf7, 0x59, 0xf7, 0x24, 0x6e, 0xba,\n                                                          0x5, 0xfc, 0x39, 0xfb, 0x53, 0x15, 0xf7, 0x3e,\n                                                          0xfb, 0x4d, 0xb1, 0xbc, 0xfb, 0x14, 0xf7, 0x1c,\n                                                          0xf7, 0x52, 0xf7, 0x24, 0x6c, 0xba, 0x5, 0xe,\n                                                          0xf7, 0x15, 0x76, 0xf7, 0x5b, 0xc9, 0x1, 0xdd,\n                                                          0xf7, 0xc7, 0x15, 0xf8, 0x7, 0x6, 0x68, 0xfb,\n                                                          0x5b, 0x6a, 0xa, 0xb8, 0xf7, 0x99, 0x5, 0xfc,\n                                                          0x3e, 0x6, 0xe, 0x79, 0xb9, 0xf7, 0x7, 0xf7,\n                                                          0x37, 0xe8, 0xbb, 0xe4, 0xb7, 0x1, 0x84, 0xbb,\n                                                          0xf7, 0xde, 0xbd, 0xf7, 0x1f, 0xba, 0x3, 0x84,\n                                                          0xf7, 0x74, 0x15, 0xfb, 0x1e, 0xf1, 0x23, 0xf7,\n                                                          0x27, 0xf7, 0x48, 0xf7, 0x4d, 0xf7, 0x35, 0xf7,\n                                                          0x5d, 0xf7, 0x1e, 0x21, 0xed, 0xfb, 0x20, 0xfb,\n                                                          0x3a, 0xfb, 0x5e, 0xfb, 0x2a, 0xfb, 0x62, 0x1e,\n                                                          0xbb, 0x93, 0x15, 0xf7, 0x1d, 0xf7, 0x22, 0xf7,\n                                                          0x3b, 0xf7, 0x3f, 0xf7, 0xe, 0xdf, 0x33, 0xfb,\n                                                          0x4, 0xfb, 0x30, 0xfb, 0x33, 0xfb, 0x2c, 0xfb,\n                                                          0x2b, 0xfb, 0xc, 0x32, 0xe0, 0xf7, 0xb, 0x1e,\n                                                          0xf7, 0x17, 0x32, 0x15, 0xba, 0x6, 0xa1, 0xf5,\n                                                          0x5, 0xbf, 0x6, 0xa9, 0x21, 0x5, 0xc6, 0x6,\n                                                          0x6d, 0xf7, 0x9, 0x5, 0xbf, 0x9d, 0x9c, 0xba,\n                                                          0xbc, 0x1a, 0xb8, 0x63, 0xa7, 0x5e, 0x1e, 0x23,\n                                                          0x6, 0x9d, 0xfb, 0x21, 0x15, 0x9f, 0xe8, 0x6a,\n                                                          0xa, 0xa8, 0x9c, 0x79, 0x7b, 0x59, 0x71, 0x82,\n                                                          0x65, 0x1f, 0xe, 0xf8, 0xa1, 0xb3, 0x1, 0xf7,\n                                                          0x8, 0xf8, 0xa1, 0x15, 0xf7, 0xfc, 0x6, 0x93,\n                                                          0xb3, 0x5, 0xfb, 0xfc, 0x6, 0xe, 0xf7, 0x9e,\n                                                          0xc9, 0xf7, 0x7c, 0xc9, 0x1, 0xf7, 0xb, 0xca,\n                                                          0xf7, 0x80, 0xca, 0x3, 0xf7, 0xb, 0xf8, 0x28,\n                                                          0x15, 0x3f, 0xc6, 0x4d, 0xe2, 0xf7, 0x1, 0xf6,\n                                                          0xf2, 0xf7, 0x11, 0xca, 0x5f, 0xcc, 0x28, 0xfb,\n                                                          0xb, 0x27, 0x23, 0xfb, 0x6, 0x1e, 0xca, 0x9a,\n                                                          0x15, 0xbf, 0xc1, 0xe4, 0xe4, 0xd0, 0xa3, 0x5d,\n                                                          0x67, 0x4f, 0x46, 0x31, 0x43, 0x4f, 0x68, 0xb6,\n                                                          0xbb, 0x1e, 0xe, 0xb7, 0xc0, 0xf7, 0x79, 0xc0,\n                                                          0xf7, 0x47, 0x77, 0x1, 0xf7, 0x97, 0xc2, 0x3,\n                                                          0xf7, 0x97, 0xf7, 0x26, 0x15, 0xc2, 0x6, 0xb0,\n                                                          0xf7, 0x48, 0x5, 0xf7, 0x4f, 0x80, 0xa, 0xfb,\n                                                          0x4f, 0x6, 0xaf, 0xf7, 0x47, 0x52, 0xa, 0x67,\n                                                          0xfb, 0x47, 0x5, 0xfb, 0x4f, 0x6, 0x80, 0x56,\n                                                          0x5, 0xf7, 0x4f, 0x6, 0xfb, 0x89, 0xfb, 0xae,\n                                                          0x15, 0xf8, 0x41, 0x80, 0xa, 0xfc, 0x41, 0x6,\n                                                          0xe, 0xf7, 0x8d, 0xc3, 0xf7, 0x9b, 0xc1, 0x1,\n                                                          0xf8, 0x1f, 0xc4, 0x3, 0xf7, 0x27, 0xf7, 0x8d,\n                                                          0x15, 0xf7, 0x91, 0x3c, 0xa, 0xfb, 0x3d, 0x6,\n                                                          0xf7, 0x17, 0xdf, 0xda, 0xbb, 0xef, 0x1a, 0xb9,\n                                                          0x68, 0xb2, 0x48, 0x5f, 0x4a, 0x74, 0x58, 0x73,\n                                                          0x1e, 0x82, 0x52, 0x5, 0xc0, 0x6, 0xb2, 0x8a,\n                                                          0xba, 0xb1, 0xaa, 0x1b, 0xae, 0xa1, 0x75, 0x71,\n                                                          0x5c, 0x62, 0x63, 0x68, 0x74, 0x1f, 0xfb, 0x36,\n                                                          0xfb, 0x1, 0x5, 0xe, 0xf7, 0x84, 0xc3, 0xf5,\n                                                          0xc2, 0xf7, 0x2, 0xc2, 0x12, 0xf8, 0xa, 0xc5,\n                                                          0x5e, 0xc4, 0x13, 0xf0, 0xf7, 0x30, 0xf7, 0xa3,\n                                                          0x15, 0x7c, 0xa8, 0xbb, 0x7b, 0xb6, 0x1b, 0xd7,\n                                                          0xdb, 0xc0, 0xde, 0xae, 0x79, 0x9a, 0x75, 0x97,\n                                                          0x1f, 0x13, 0xe8, 0xae, 0xa1, 0x9c, 0xb2, 0xb4,\n                                                          0x1a, 0xbc, 0x65, 0xac, 0x54, 0x60, 0x5c, 0x77,\n                                                          0x75, 0x64, 0x1e, 0x96, 0x57, 0x5, 0x9d, 0xab,\n                                                          0xac, 0xa0, 0xad, 0x1b, 0xa6, 0xa7, 0x7d, 0x71,\n                                                          0x5e, 0x5a, 0x72, 0x4b, 0x1f, 0x87, 0x79, 0x87,\n                                                          0x78, 0x87, 0x79, 0x8, 0x99, 0x9f, 0x8b, 0x9f,\n                                                          0x1b, 0x13, 0xf0, 0xa9, 0xa7, 0x81, 0x6e, 0x6a,\n                                                          0x71, 0x69, 0x4b, 0x66, 0x67, 0x99, 0x9d, 0x6f,\n                                                          0x1f, 0xe, 0x65, 0xa, 0xf7, 0x42, 0xf8, 0x85,\n                                                          0x15, 0xf7, 0x96, 0xf0, 0x7b, 0xd5, 0xfb, 0x8c,\n                                                          0xfb, 0x24, 0x5, 0xe, 0xf7, 0x22, 0xac, 0x15,\n                                                          0x75, 0x9a, 0xa9, 0x78, 0xbb, 0x1b, 0xbe, 0xdf,\n                                                          0xab, 0xca, 0xbc, 0x1f, 0x7b, 0x39, 0x5, 0xf7,\n                                                          0x1c, 0x2a, 0xa, 0x39, 0x6, 0xd3, 0xf8, 0x3,\n                                                          0x5, 0xfb, 0x1c, 0x68, 0xa, 0xdd, 0x6, 0x70,\n                                                          0xfb, 0x18, 0x5, 0x35, 0x7b, 0x51, 0xfb, 0x2,\n                                                          0xfb, 0x11, 0x1b, 0x4b, 0x6a, 0xb9, 0xc6, 0x96,\n                                                          0x1f, 0xc2, 0xf7, 0xa8, 0x5, 0xfb, 0x1d, 0x68,\n                                                          0xa, 0xdd, 0x6, 0x23, 0xfc, 0xa6, 0x6a, 0xa,\n                                                          0xe, 0xf8, 0xa9, 0xa8, 0x1, 0xf7, 0x28, 0xba,\n                                                          0xda, 0xb6, 0x3, 0xf7, 0x28, 0x3d, 0x15, 0xba,\n                                                          0x6, 0xf7, 0x52, 0xf8, 0xf7, 0x5, 0xda, 0x6,\n                                                          0xfb, 0x52, 0xfc, 0xf7, 0x5, 0xb6, 0x6, 0xf7,\n                                                          0x52, 0xf8, 0xf7, 0x5, 0xbc, 0x6, 0x94, 0xa8,\n                                                          0x5, 0xfb, 0x6f, 0x6, 0xfb, 0x34, 0xfb, 0x2b,\n                                                          0x4c, 0xfb, 0x21, 0x53, 0xb9, 0x3e, 0xf7, 0x35,\n                                                          0x1f, 0xe, 0xf7, 0x51, 0xf7, 0x1e, 0x1, 0xf7,\n                                                          0x70, 0xf7, 0x33, 0x3, 0xf7, 0x70, 0xf7, 0x87,\n                                                          0x15, 0x6e, 0xa6, 0x72, 0xb4, 0xb7, 0xba, 0xaf,\n                                                          0xb9, 0xa9, 0x73, 0xa5, 0x63, 0x58, 0x5f, 0x65,\n                                                          0x5d, 0x1e, 0xe, 0xfb, 0x2, 0xb9, 0x1, 0xf7,\n                                                          0xbf, 0xba, 0x3, 0xf7, 0x76, 0xfb, 0x1a, 0x15,\n                                                          0x88, 0x90, 0xa3, 0x7d, 0xa4, 0x1b, 0xbc, 0xb7,\n                                                          0xb0, 0xba, 0xa4, 0x78, 0x9c, 0x7c, 0x8d, 0x1f,\n                                                          0x92, 0xac, 0x5, 0x5c, 0x6, 0x73, 0x41, 0x5,\n                                                          0x8c, 0x93, 0x91, 0x8b, 0x91, 0x1b, 0x9d, 0x93,\n                                                          0x83, 0x83, 0x8c, 0x1f, 0x78, 0x79, 0x7f, 0x7b,\n                                                          0x7d, 0x7c, 0x8e, 0x94, 0x81, 0x1e, 0xe, 0xf7,\n                                                          0x8d, 0xc3, 0x1, 0xf7, 0xab, 0xc0, 0x3, 0xf7,\n                                                          0x3e, 0xf7, 0x8d, 0x15, 0xf7, 0x8d, 0x3c, 0xa,\n                                                          0x29, 0x6, 0xc5, 0xf7, 0xd1, 0xfb, 0x26, 0x72,\n                                                          0x80, 0x53, 0xe6, 0x9a, 0x5e, 0xfb, 0x8f, 0x5,\n                                                          0x29, 0x6, 0xe, 0xf7, 0x8d, 0xc6, 0xf7, 0x69,\n                                                          0xc6, 0x1, 0xf7, 0x1d, 0xc1, 0xf7, 0x6d, 0xc1,\n                                                          0x3, 0xf7, 0x1d, 0xf8, 0xc, 0x15, 0x2c, 0xe5,\n                                                          0x6b, 0xb6, 0xd4, 0xf7, 0xb, 0xd2, 0xf7, 0x17,\n                                                          0xd4, 0x5a, 0xc3, 0x39, 0x36, 0xfb, 0x1, 0x40,\n                                                          0xfb, 0x15, 0x1e, 0xc1, 0x9a, 0x15, 0xd1, 0xbf,\n                                                          0xc7, 0xd9, 0xcf, 0x9d, 0x5d, 0x68, 0x8c, 0x1e,\n                                                          0x3c, 0x4a, 0x56, 0x4e, 0x5c, 0x5f, 0xa9, 0xc0,\n                                                          0x1e, 0xe, 0xe6, 0x76, 0xf8, 0xc, 0x77, 0x1,\n                                                          0x8c, 0xf8, 0xc4, 0x3, 0xf3, 0xd1, 0x15, 0xf7,\n                                                          0x92, 0xf7, 0x53, 0xfb, 0x4b, 0xf7, 0x4d, 0x6b,\n                                                          0x5c, 0xf7, 0x15, 0xfb, 0x1e, 0xfb, 0x59, 0xfb,\n                                                          0x24, 0x5, 0xf7, 0x48, 0x16, 0xaa, 0x5c, 0xf7,\n                                                          0x83, 0xf7, 0x53, 0xfb, 0x3e, 0xf7, 0x4d, 0x65,\n                                                          0x5a, 0xf7, 0x14, 0xfb, 0x1c, 0x5, 0xe, 0x60,\n                                                          0xc1, 0x5c, 0x76, 0xf3, 0xc2, 0xf7, 0x5d, 0xc0,\n                                                          0xf7, 0xc9, 0x77, 0x12, 0x13, 0xb8, 0xf7, 0x8d,\n                                                          0xba, 0x15, 0xf7, 0x14, 0x6, 0x82, 0x67, 0x5,\n                                                          0x5a, 0x5f, 0xa, 0xf7, 0x20, 0x76, 0xa, 0x61,\n                                                          0x6, 0x93, 0xaf, 0x5, 0xb6, 0x6, 0x94, 0xc2,\n                                                          0x5, 0x60, 0x6, 0xac, 0xf7, 0x65, 0x52, 0xa,\n                                                          0xfb, 0x30, 0xfb, 0x65, 0x5, 0xc9, 0x16, 0xe4,\n                                                          0xf7, 0x19, 0x76, 0xfb, 0x19, 0x5, 0xfc, 0x19,\n                                                          0xfb, 0x14, 0x15, 0x13, 0x78, 0xac, 0x6c, 0xf8,\n                                                          0xd4, 0xf9, 0x47, 0x69, 0xaa, 0x5, 0xfc, 0xd3,\n                                                          0xfb, 0xfe, 0x15, 0xf7, 0x6e, 0x6, 0x94, 0xc0,\n                                                          0x5, 0x36, 0x6, 0xbe, 0xf7, 0xc6, 0xfb, 0x14,\n                                                          0x73, 0x82, 0x55, 0xdb, 0x99, 0x62, 0xfb, 0x86,\n                                                          0x5, 0x35, 0x6, 0xe, 0x5f, 0xc1, 0x5d, 0x76,\n                                                          0xf7, 0xd5, 0xc0, 0x7c, 0xc1, 0xf7, 0xc9, 0x77,\n                                                          0x12, 0xf8, 0x65, 0xbb, 0x13, 0x5c, 0x89, 0x71,\n                                                          0x15, 0xad, 0x6c, 0xf8, 0xce, 0xf9, 0x47, 0x67,\n                                                          0xaa, 0x5, 0xfc, 0xb5, 0xfb, 0xff, 0x15, 0xf7,\n                                                          0x70, 0x76, 0xa, 0x34, 0x6, 0xbe, 0xf7, 0xc4,\n                                                          0xfb, 0x13, 0x74, 0x82, 0x55, 0xda, 0x99, 0x64,\n                                                          0xfb, 0x85, 0x5, 0x34, 0x6, 0x13, 0xac, 0xf7,\n                                                          0x73, 0xfc, 0x24, 0x15, 0xf7, 0x6b, 0x76, 0xa,\n                                                          0xfb, 0x23, 0x6, 0xf7, 0xb, 0xee, 0xc6, 0xa8,\n                                                          0xe1, 0x1a, 0xbc, 0x72, 0xb7, 0x4d, 0x65, 0x63,\n                                                          0x78, 0x69, 0x6c, 0x1e, 0x81, 0x4c, 0x5, 0xb9,\n                                                          0x6, 0xb0, 0x89, 0xae, 0xa5, 0xaa, 0x1b, 0xaa,\n                                                          0x9c, 0x73, 0x6e, 0x62, 0x68, 0x6a, 0x6d, 0x74,\n                                                          0x1f, 0xfb, 0x1e, 0xfb, 0x0, 0x5, 0xe, 0x61,\n                                                          0xc1, 0x5c, 0x76, 0xf7, 0xb, 0xc2, 0xf7, 0x42,\n                                                          0xc2, 0xf7, 0xb3, 0x76, 0xc0, 0x77, 0x12, 0xf7,\n                                                          0x67, 0xba, 0x65, 0xbb, 0x13, 0xbe, 0xf7, 0x90,\n                                                          0xca, 0x15, 0xf7, 0x11, 0x6, 0x83, 0x58, 0x5,\n                                                          0x59, 0x6, 0x82, 0x55, 0x5, 0xf7, 0x1c, 0x76,\n                                                          0xa, 0x62, 0x6, 0x92, 0xbe, 0x5, 0xb6, 0x6,\n                                                          0x94, 0xc2, 0x5, 0x61, 0x6, 0xab, 0xf7, 0x57,\n                                                          0x5, 0x56, 0x6, 0xfb, 0x2c, 0xfb, 0x66, 0x5,\n                                                          0xc7, 0x9a, 0x15, 0xe3, 0xf7, 0x8, 0x78, 0xfb,\n                                                          0x8, 0x5, 0xfc, 0x10, 0xfb, 0x25, 0x15, 0x13,\n                                                          0x7e, 0xab, 0x6e, 0xf8, 0xbe, 0xf9, 0x47, 0x6a,\n                                                          0xaa, 0x5, 0xfc, 0xa1, 0xfb, 0xe8, 0x15, 0x7d,\n                                                          0xa2, 0xb1, 0x77, 0xae, 0x1b, 0xc4, 0xd1, 0xc2,\n                                                          0xd5, 0x1f, 0x8e, 0xb3, 0x7a, 0x9a, 0x78, 0x97,\n                                                          0x8, 0x13, 0xbd, 0xa6, 0xa0, 0x9b, 0xb1, 0xb1,\n                                                          0x1a, 0xbc, 0x6c, 0xab, 0x5d, 0x69, 0x66, 0x79,\n                                                          0x75, 0x6b, 0x1e, 0x94, 0x58, 0x5, 0x9d, 0xa5,\n                                                          0xa5, 0x9f, 0xa7, 0x1b, 0xa0, 0x9f, 0x7d, 0x72,\n                                                          0x8d, 0x1f, 0x64, 0x69, 0x6f, 0x57, 0x1e, 0x85,\n                                                          0x6, 0x82, 0x56, 0x5, 0x13, 0xbe, 0xb2, 0xc0,\n                                                          0x87, 0x6a, 0x6d, 0x73, 0x63, 0x59, 0x6d, 0x6e,\n                                                          0x9c, 0x9c, 0x76, 0x1f, 0xe, 0xfb, 0x31, 0xc1,\n                                                          0xf8, 0x33, 0xf7, 0xa, 0x12, 0xf7, 0xc, 0xc2,\n                                                          0xf7, 0x45, 0xc2, 0x9e, 0xc1, 0x17, 0xf7, 0xe5,\n                                                          0xf7, 0xf7, 0x15, 0x73, 0xa1, 0x78, 0xac, 0xb8,\n                                                          0xad, 0xad, 0xb3, 0xa2, 0x75, 0xa0, 0x68, 0x68,\n                                                          0x61, 0x69, 0x62, 0x1e, 0x8e, 0xfb, 0x41, 0x15,\n                                                          0x38, 0x7a, 0xfb, 0x1d, 0x5e, 0xfb, 0x22, 0x1a,\n                                                          0x31, 0xd6, 0x5e, 0xe5, 0xc6, 0xc9, 0x9a, 0x9c,\n                                                          0xbe, 0x1e, 0x13, 0xb8, 0xa2, 0xf7, 0xb, 0x5,\n                                                          0x55, 0x6, 0x7d, 0x44, 0x5, 0x7b, 0x66, 0x61,\n                                                          0x81, 0x63, 0x1b, 0x2f, 0x71, 0xba, 0xb1, 0xf7,\n                                                          0x2, 0xf7, 0x1f, 0xac, 0xd3, 0x96, 0x1f, 0xa0,\n                                                          0xf3, 0x52, 0xa, 0xe, 0x8b, 0xc1, 0xf7, 0x10,\n                                                          0xc1, 0xf7, 0xb1, 0xc1, 0x1, 0x89, 0x4f, 0xa,\n                                                          0x89, 0x16, 0x20, 0xa, 0xfb, 0x43, 0xf8, 0x7d,\n                                                          0x15, 0xf7, 0x9a, 0x26, 0x9b, 0xa9, 0xfb, 0x7b,\n                                                          0x79, 0xa, 0x8b, 0xc1, 0xf7, 0xf, 0xc2, 0xf7,\n                                                          0xab, 0xc1, 0x84, 0xa, 0x72, 0xf7, 0x74, 0xf7,\n                                                          0x5a, 0xf7, 0x71, 0x3, 0xf7, 0xc2, 0xf8, 0xff,\n                                                          0x15, 0xf7, 0xd7, 0xf0, 0x77, 0xd4, 0xfb, 0xc9,\n                                                          0xfb, 0x24, 0x5, 0xfb, 0xd5, 0xfd, 0x1d, 0x23,\n                                                          0xa, 0x8b, 0xc0, 0xf7, 0xc, 0xc0, 0xf7, 0xb1,\n                                                          0xc1, 0xf7, 0x66, 0x77, 0x1, 0x89, 0x4f, 0xa,\n                                                          0xf7, 0x7a, 0xf9, 0x3, 0x15, 0xb0, 0x79, 0xf7,\n                                                          0x3b, 0xf7, 0x7, 0xf7, 0xd, 0xfb, 0x7, 0xb5,\n                                                          0x9d, 0xfb, 0x5, 0xf7, 0x2c, 0x5, 0x3c, 0x6,\n                                                          0xfc, 0x2b, 0xfd, 0x9b, 0x23, 0xa, 0x7e, 0xa,\n                                                          0xd3, 0xbc, 0x9c, 0xbc, 0x1, 0x71, 0x4f, 0xa,\n                                                          0xf7, 0x6c, 0xf9, 0x20, 0x15, 0xbc, 0x81, 0x5,\n                                                          0x9e, 0x97, 0xa6, 0xb5, 0xbc, 0x1b, 0xa4, 0x9b,\n                                                          0x7b, 0x7b, 0x9e, 0x1f, 0x7a, 0x9f, 0xa1, 0x7a,\n                                                          0xb1, 0x1b, 0xd0, 0xb9, 0xca, 0xb1, 0x9e, 0x1f,\n                                                          0x5b, 0x94, 0x5, 0x73, 0x7d, 0x69, 0x66, 0x66,\n                                                          0x1b, 0x76, 0x7e, 0x99, 0x9b, 0x7a, 0x1f, 0x9c,\n                                                          0x79, 0x75, 0x9e, 0x61, 0x1b, 0x52, 0x51, 0x5c,\n                                                          0x56, 0x6d, 0x1f, 0xfb, 0x86, 0xfd, 0x20, 0x23,\n                                                          0xa, 0x7e, 0xa, 0xdb, 0xf7, 0x8, 0x1, 0x89,\n                                                          0x4f, 0xa, 0xf8, 0x55, 0xf9, 0x19, 0x15, 0xdd,\n                                                          0x5c, 0xa, 0x38, 0x6, 0xfb, 0x3c, 0xfb, 0x8,\n                                                          0x15, 0xdd, 0x5c, 0xa, 0x39, 0x6, 0xfb, 0xe0,\n                                                          0xfd, 0x8d, 0x23, 0xa, 0x8b, 0xbf, 0xf7, 0x20,\n                                                          0xc1, 0xf7, 0xaa, 0xc1, 0xaa, 0xc4, 0xd2, 0xc3,\n                                                          0x1, 0x89, 0xf7, 0x63, 0xf7, 0x11, 0xc6, 0xd4,\n                                                          0xc7, 0x3, 0xf7, 0xde, 0xf9, 0x3d, 0x15, 0x5d,\n                                                          0xb1, 0x71, 0xb7, 0xc8, 0xbc, 0xbf, 0xc5, 0xab,\n                                                          0x7f, 0xb5, 0x4a, 0x4c, 0x57, 0x58, 0x4e, 0x1e,\n                                                          0xc6, 0x93, 0x15, 0xa3, 0x97, 0xa3, 0xac, 0xad,\n                                                          0x85, 0x6f, 0x86, 0x75, 0x77, 0x7b, 0x76, 0x85,\n                                                          0x71, 0x8b, 0xa2, 0x1e, 0xfc, 0x1b, 0xfd, 0x45,\n                                                          0x23, 0xa, 0x8b, 0xc1, 0xeb, 0xc1, 0xbc, 0x61,\n                                                          0xa, 0x1, 0x71, 0xf7, 0x56, 0xe2, 0xcd, 0xf6,\n                                                          0xc1, 0x93, 0xc2, 0x3, 0x71, 0x16, 0xf7, 0x56,\n                                                          0x2a, 0xa, 0x35, 0x6, 0xc8, 0xf7, 0x3, 0x5,\n                                                          0xf7, 0x19, 0x6, 0x6b, 0xfb, 0x39, 0x5, 0xf7,\n                                                          0x97, 0x6, 0xaa, 0xf7, 0x2d, 0x52, 0xa, 0x78,\n                                                          0x28, 0x5, 0xfb, 0x2a, 0x6, 0xb1, 0xf7, 0x5c,\n                                                          0x5, 0xdb, 0x6, 0x80, 0x52, 0x5, 0xc1, 0x6,\n                                                          0xab, 0xf7, 0x3b, 0x5, 0x57, 0x60, 0xa, 0x39,\n                                                          0x6, 0xb3, 0xf7, 0x5c, 0x5, 0xf7, 0x2b, 0x6,\n                                                          0x78, 0x26, 0x6a, 0xa, 0xa9, 0xf7, 0x2f, 0x5,\n                                                          0xfc, 0x2a, 0x2d, 0xa, 0xe4, 0x6, 0xfb, 0x99,\n                                                          0x58, 0xa, 0x57, 0x6, 0xf7, 0x5b, 0xf7, 0x39,\n                                                          0x15, 0xf7, 0x3e, 0xf7, 0xb4, 0x52, 0xfb, 0xb4,\n                                                          0x5, 0xe, 0xfb, 0x2b, 0xc2, 0xe7, 0xbe, 0xf8,\n                                                          0x76, 0xbe, 0x1, 0x9c, 0xc5, 0xf7, 0x3, 0xbb,\n                                                          0xf7, 0x8b, 0xc3, 0x3, 0xf7, 0x5, 0xfb, 0x13,\n                                                          0x15, 0x84, 0x90, 0xa3, 0x7a, 0xa7, 0x1b, 0xb3,\n                                                          0xc2, 0xa2, 0xcb, 0xab, 0x7c, 0xa2, 0x77, 0x93,\n                                                          0x1f, 0x8f, 0x88, 0x5, 0xe7, 0xdc, 0xbe, 0xb5,\n                                                          0xd3, 0x1f, 0x7b, 0xb7, 0x5, 0x66, 0x4d, 0x45,\n                                                          0x5a, 0x44, 0x1b, 0xfb, 0x5, 0x43, 0xe5, 0xf7,\n                                                          0x9, 0xf7, 0x43, 0xf7, 0x44, 0xef, 0xeb, 0xcc,\n                                                          0xc5, 0x6d, 0x60, 0xaa, 0x1f, 0x77, 0x36, 0x51,\n                                                          0xa, 0xb8, 0xf7, 0x65, 0x52, 0xa, 0x7e, 0x51,\n                                                          0x5, 0xb7, 0x49, 0x60, 0x99, 0x55, 0x1b, 0xfb,\n                                                          0x54, 0xfb, 0x22, 0xfb, 0x3d, 0xfb, 0x44, 0x22,\n                                                          0xd1, 0x30, 0xee, 0x7c, 0x1f, 0x78, 0x42, 0x5,\n                                                          0x8f, 0x92, 0x94, 0x8b, 0x92, 0x1b, 0x98, 0x96,\n                                                          0x83, 0x81, 0x80, 0x85, 0x75, 0x6e, 0x7d, 0x7e,\n                                                          0x93, 0x92, 0x81, 0x1f, 0xe, 0x5b, 0xa, 0x1,\n                                                          0xe4, 0xc2, 0xf7, 0x52, 0xc3, 0xc6, 0xb8, 0x3,\n                                                          0x88, 0x16, 0x28, 0xa, 0xf8, 0x9d, 0xf8, 0xc9,\n                                                          0x15, 0x9a, 0xa9, 0xfb, 0xc9, 0xf7, 0x24, 0x6f,\n                                                          0x42, 0x5, 0xe, 0x5b, 0xa, 0x84, 0xa, 0xe5,\n                                                          0xc3, 0xf7, 0x55, 0xc4, 0xc7, 0xb9, 0x3, 0xf7,\n                                                          0xa0, 0xf8, 0xff, 0x15, 0xf7, 0xd5, 0xf0, 0x78,\n                                                          0xd4, 0xfb, 0xc9, 0xfb, 0x24, 0x5, 0xfb, 0x9c,\n                                                          0xfd, 0x1d, 0x15, 0x28, 0xa, 0xe, 0x5b, 0xa,\n                                                          0x1, 0xe4, 0xc2, 0x3, 0xf7, 0x54, 0xf9, 0xd,\n                                                          0x15, 0xb2, 0x79, 0xf7, 0x45, 0xf7, 0x7, 0xf7,\n                                                          0x14, 0xfb, 0x7, 0xb9, 0x9d, 0xfb, 0xb, 0xf7,\n                                                          0x2c, 0x5, 0x36, 0x6, 0xfc, 0x11, 0xfd, 0xa5,\n                                                          0x15, 0x28, 0xa, 0xe, 0x8b, 0xbe, 0xf7, 0x75,\n                                                          0x76, 0xf7, 0xca, 0x77, 0xf7, 0x2, 0xf7, 0x8,\n                                                          0x1, 0xe4, 0xc2, 0x3, 0xf8, 0x3d, 0xf9, 0x23,\n                                                          0x15, 0xe2, 0x5c, 0xa, 0x34, 0x6, 0xfb, 0x46,\n                                                          0xfb, 0x8, 0x15, 0xe2, 0x6, 0xa5, 0x88, 0xa,\n                                                          0x34, 0x6, 0xfb, 0xc1, 0xfd, 0x97, 0x15, 0x28,\n                                                          0xa, 0xe, 0x8b, 0xc1, 0xf8, 0x5c, 0xc2, 0x84,\n                                                          0xa, 0xf7, 0x74, 0xc6, 0x3, 0xaf, 0x16, 0x2f,\n                                                          0xa, 0xf7, 0x50, 0xf9, 0x2e, 0x15, 0xf7, 0xb5,\n                                                          0x26, 0x9e, 0xa9, 0xfb, 0x94, 0x79, 0xa, 0x8b,\n                                                          0xc1, 0xf8, 0x5d, 0xc2, 0xf7, 0x77, 0x77, 0x1,\n                                                          0xf7, 0x6c, 0xc5, 0x3, 0xf7, 0x88, 0xf9, 0x0,\n                                                          0x15, 0xf7, 0xdb, 0xef, 0x78, 0xd4, 0xfb, 0xcf,\n                                                          0xfb, 0x23, 0x5, 0xfb, 0x64, 0xfd, 0x1e, 0x15,\n                                                          0xf8, 0x2d, 0x2a, 0xa, 0xfb, 0x43, 0x6, 0xeb,\n                                                          0xf8, 0x5d, 0x5, 0xf7, 0x40, 0x46, 0xa, 0xfc,\n                                                          0x29, 0x6, 0x7e, 0x54, 0x5, 0xf7, 0x42, 0x6,\n                                                          0x2d, 0x7a, 0xa, 0xfb, 0x44, 0x6, 0xe, 0x8b,\n                                                          0xc0, 0xf8, 0x5d, 0xc2, 0x1, 0xf7, 0x74, 0xc6,\n                                                          0x3, 0xf7, 0x3f, 0xf9, 0xb, 0x15, 0xb2, 0x7a,\n                                                          0xf7, 0x47, 0xf7, 0x8, 0xf7, 0x14, 0xfb, 0x8,\n                                                          0xb9, 0x9c, 0xfb, 0xd, 0xf7, 0x2e, 0x5, 0x36,\n                                                          0x6, 0xfb, 0xd5, 0xfd, 0xa5, 0x15, 0x2f, 0xa,\n                                                          0xe, 0x8b, 0xbe, 0xf8, 0x5f, 0xc2, 0xf7, 0x62,\n                                                          0x77, 0x1, 0xf7, 0x74, 0xc6, 0x3, 0xf8, 0x35,\n                                                          0xf9, 0x22, 0x15, 0xe7, 0x6, 0xa5, 0xf7, 0x9,\n                                                          0x5, 0x31, 0x6, 0xfb, 0x4e, 0xfb, 0x9, 0x15,\n                                                          0xe5, 0x6, 0xa6, 0xf7, 0x9, 0x5, 0x31, 0x6,\n                                                          0xfb, 0x8e, 0xfd, 0x97, 0x15, 0x2f, 0xa, 0xe,\n                                                          0x8b, 0xc1, 0xf7, 0x57, 0xbf, 0xf7, 0x63, 0xc1,\n                                                          0x1, 0xf8, 0xad, 0xcb, 0x3, 0x8a, 0x16, 0xf7,\n                                                          0x6f, 0x6, 0xf7, 0x56, 0xf7, 0x49, 0xe1, 0xf7,\n                                                          0xaf, 0xf7, 0x22, 0x28, 0xbe, 0xfb, 0x1a, 0x1f,\n                                                          0xfb, 0x8c, 0x2d, 0xa, 0xda, 0x6, 0x63, 0xfb,\n                                                          0x63, 0x5, 0x3f, 0x6, 0x7f, 0x57, 0x5, 0xd8,\n                                                          0x6, 0x64, 0xfb, 0x57, 0x89, 0xa, 0xf7, 0x1b,\n                                                          0x16, 0xb1, 0xf7, 0x57, 0x5, 0xf7, 0x55, 0x6,\n                                                          0x96, 0xbf, 0x5, 0xfb, 0x54, 0x6, 0xb4, 0xf7,\n                                                          0x63, 0x5, 0xf0, 0x6, 0xf7, 0x2a, 0xb5, 0x60,\n                                                          0xfb, 0x16, 0xfb, 0x1a, 0x21, 0xfb, 0x27, 0xfb,\n                                                          0x3a, 0x1f, 0xe, 0x7e, 0xbf, 0xf8, 0x4e, 0xbf,\n                                                          0xdf, 0xbc, 0x9b, 0xbd, 0x1, 0x61, 0x7e, 0x15,\n                                                          0xf7, 0x8f, 0x6, 0x96, 0xbf, 0x5, 0xfb, 0x3,\n                                                          0x6, 0xe2, 0xf8, 0x37, 0xf7, 0x5a, 0xfc, 0x6b,\n                                                          0x5, 0xd7, 0x6, 0xf1, 0xf8, 0x82, 0x5, 0xdb,\n                                                          0x6, 0x96, 0xbf, 0x5, 0xfb, 0x8b, 0x82, 0xa,\n                                                          0xf7, 0x2, 0x6, 0x34, 0xfc, 0x3b, 0xfb, 0x58,\n                                                          0xf8, 0x6f, 0x5, 0xfb, 0x34, 0x6, 0x7f, 0x57,\n                                                          0x5, 0xde, 0x6, 0x30, 0xfc, 0x4e, 0x7b, 0xa,\n                                                          0xf7, 0x6c, 0xf8, 0xe5, 0x15, 0xbe, 0x80, 0x5,\n                                                          0x9f, 0x97, 0xa8, 0xb4, 0xbe, 0x1b, 0xac, 0x9e,\n                                                          0x78, 0x7a, 0xa1, 0x1f, 0x7c, 0x9e, 0x9f, 0x7d,\n                                                          0xac, 0x1b, 0xd2, 0xbb, 0xcb, 0xb2, 0x9f, 0x1f,\n                                                          0x58, 0x94, 0x5, 0x73, 0x7d, 0x6d, 0x64, 0x64,\n                                                          0x1b, 0x70, 0x7c, 0x99, 0x9a, 0x7b, 0x1f, 0x9d,\n                                                          0x78, 0x76, 0x9e, 0x5e, 0x1b, 0x50, 0x4e, 0x5d,\n                                                          0x55, 0x6c, 0x1f, 0xe, 0x79, 0xc1, 0xf8, 0x7b,\n                                                          0xc1, 0xf7, 0x6c, 0x7d, 0xa, 0xf7, 0x82, 0xf9,\n                                                          0x64, 0x15, 0xf7, 0xa0, 0x27, 0x9b, 0xa9, 0xfb,\n                                                          0x7f, 0xf7, 0x23, 0x5, 0xfb, 0x91, 0xfc, 0xd9,\n                                                          0x25, 0xa, 0x79, 0xc1, 0xf8, 0x7a, 0xc1, 0x1,\n                                                          0xaa, 0xc2, 0xf8, 0x45, 0xc3, 0x3, 0xf7, 0x97,\n                                                          0xf8, 0xff, 0x15, 0xf7, 0xbb, 0xef, 0x78, 0xd5,\n                                                          0xfb, 0xb5, 0xfb, 0x25, 0x5, 0xfb, 0x68, 0xfc,\n                                                          0x48, 0x25, 0xa, 0x79, 0xc1, 0xf8, 0x7b, 0xc1,\n                                                          0xf7, 0x5a, 0x7d, 0xa, 0xf7, 0x4b, 0xf9, 0x2,\n                                                          0x15, 0xb1, 0x7a, 0xf7, 0x40, 0xf7, 0x7, 0xf7,\n                                                          0xf, 0xfb, 0x7, 0xb6, 0x9c, 0xfb, 0x8, 0xf7,\n                                                          0x2d, 0x89, 0xa, 0xfb, 0xdd, 0xfc, 0xc7, 0x25,\n                                                          0xa, 0x79, 0xbf, 0xf8, 0x7d, 0xc1, 0xd1, 0xbc,\n                                                          0x9c, 0xbc, 0x1, 0x9e, 0xc6, 0xf8, 0x36, 0xc1,\n                                                          0x3, 0xf7, 0x2e, 0xf9, 0x2a, 0x15, 0xbd, 0x80,\n                                                          0x5, 0x9f, 0x97, 0xa7, 0xb5, 0xbb, 0x1b, 0xae,\n                                                          0x9c, 0x7a, 0x7a, 0x9d, 0x1f, 0x7b, 0x9c, 0x9e,\n                                                          0x7b, 0xb0, 0x1b, 0xd1, 0xbb, 0xca, 0xb2, 0x9e,\n                                                          0x1f, 0x58, 0x94, 0x5, 0x73, 0x7e, 0x6b, 0x65,\n                                                          0x66, 0x1b, 0x73, 0x7e, 0x97, 0x99, 0x7d, 0x1f,\n                                                          0x9d, 0x79, 0x76, 0xa1, 0x5b, 0x1b, 0x52, 0x4f,\n                                                          0x5d, 0x55, 0x6d, 0x1f, 0xfb, 0xc, 0xfc, 0x56,\n                                                          0x25, 0xa, 0x79, 0xbe, 0xf8, 0x7e, 0xc1, 0xce,\n                                                          0xf7, 0x9, 0x1, 0xad, 0xc2, 0xf7, 0x40, 0xdf,\n                                                          0xc9, 0xde, 0x9e, 0xc3, 0x3, 0xf8, 0x2b, 0xf9,\n                                                          0x18, 0x15, 0xde, 0x6, 0xa5, 0xf7, 0x9, 0x5,\n                                                          0x37, 0x6, 0xfb, 0x3f, 0xfb, 0x9, 0x15, 0xdf,\n                                                          0x6, 0xa4, 0xf7, 0x9, 0x7b, 0xa, 0xfb, 0x91,\n                                                          0xfc, 0xb9, 0x25, 0xa, 0xcb, 0x76, 0xf8, 0x3f,\n                                                          0x77, 0x1, 0xbb, 0xe4, 0x15, 0xb9, 0x5d, 0xf7,\n                                                          0x5b, 0xf7, 0x3d, 0xf7, 0x1e, 0xfb, 0x3d, 0xbb,\n                                                          0xb2, 0xfb, 0x20, 0xf7, 0x3e, 0xf7, 0x69, 0xf7,\n                                                          0x41, 0x63, 0xb8, 0xfb, 0x67, 0xfb, 0x41, 0xfb,\n                                                          0x1f, 0xf7, 0x40, 0x5d, 0x64, 0xf7, 0x1e, 0xfb,\n                                                          0x3d, 0x5, 0xe, 0x82, 0xbf, 0x5d, 0x76, 0xf8,\n                                                          0xae, 0xc0, 0x12, 0x13, 0x60, 0xf8, 0xbd, 0xf7,\n                                                          0xab, 0x15, 0x95, 0xbe, 0x8d, 0xde, 0x67, 0xca,\n                                                          0xc3, 0xc6, 0x18, 0x68, 0xab, 0x59, 0x57, 0x5,\n                                                          0xaa, 0x6c, 0x5f, 0xa0, 0x4a, 0x1b, 0xfb, 0x3f,\n                                                          0xfb, 0x7, 0xfb, 0x2b, 0xfb, 0x1d, 0x71, 0x1f,\n                                                          0x7b, 0x3b, 0x96, 0x41, 0xae, 0x58, 0x4c, 0x48,\n                                                          0x18, 0xaf, 0x6c, 0xc6, 0xc9, 0x5, 0x13, 0xa0,\n                                                          0x6d, 0xad, 0xb9, 0x7a, 0xc4, 0x1b, 0xf7, 0x31,\n                                                          0xf7, 0xa, 0xf7, 0x16, 0xf7, 0x32, 0xaa, 0x1f,\n                                                          0x55, 0x89, 0x15, 0xfb, 0xe, 0x73, 0x30, 0xfb,\n                                                          0x4, 0xfb, 0x13, 0x1b, 0x5f, 0x67, 0x9a, 0xa3,\n                                                          0x71, 0x1f, 0xf7, 0xe3, 0xf7, 0xf2, 0xa2, 0x57,\n                                                          0x88, 0x4c, 0x84, 0x63, 0x19, 0x63, 0xf7, 0x57,\n                                                          0x15, 0xfb, 0xe6, 0xfb, 0xf6, 0x72, 0xb6, 0x84,\n                                                          0xc3, 0x96, 0xc7, 0x19, 0xe1, 0x9d, 0xdb, 0xf7,\n                                                          0x2b, 0xf7, 0x29, 0x1b, 0xbf, 0xaf, 0x7b, 0x71,\n                                                          0xa3, 0x1f, 0xe, 0x59, 0xa, 0x96, 0xf8, 0x91,\n                                                          0x26, 0xa, 0xf7, 0x3c, 0xf7, 0x2f, 0x15, 0xf7,\n                                                          0x99, 0x26, 0x9c, 0xa9, 0xfb, 0x7b, 0x79, 0xa,\n                                                          0x59, 0xa, 0xf7, 0x6c, 0xf8, 0xfa, 0x15, 0xf7,\n                                                          0xb3, 0xf7, 0x0, 0x7a, 0xd2, 0xfb, 0xb2, 0xfb,\n                                                          0x25, 0x5, 0xfb, 0x51, 0xfb, 0x1f, 0x26, 0xa,\n                                                          0xe, 0x70, 0xa, 0xf7, 0x4d, 0xc2, 0x50, 0xa,\n                                                          0xf7, 0x42, 0xf9, 0xe, 0x15, 0xf7, 0x3d, 0xf7,\n                                                          0x8, 0xf7, 0xa, 0xfb, 0x8, 0xb5, 0x9c, 0xfb,\n                                                          0x4, 0xf7, 0x2e, 0x5, 0x3c, 0x6, 0xfb, 0x43,\n                                                          0xfb, 0x2e, 0x5, 0xfb, 0x12, 0xfb, 0x22, 0x26,\n                                                          0xa, 0xe, 0x70, 0xa, 0x50, 0xa, 0xf7, 0xf8,\n                                                          0xf9, 0x21, 0x15, 0xdc, 0x6, 0xa4, 0xf7, 0xa,\n                                                          0x6b, 0xa, 0xfb, 0x3b, 0xfb, 0xa, 0x85, 0xa,\n                                                          0xa3, 0xf7, 0xa, 0x6b, 0xa, 0xfb, 0x76, 0xfb,\n                                                          0x9a, 0x26, 0xa, 0xe, 0x8b, 0xc1, 0xf8, 0x5d,\n                                                          0xc1, 0x84, 0xa, 0xf7, 0x47, 0xc3, 0x3, 0xb4,\n                                                          0x16, 0x31, 0xa, 0xf7, 0x34, 0xf8, 0xc7, 0x15,\n                                                          0xf7, 0xc3, 0xf1, 0x79, 0xd5, 0xfb, 0xc1, 0xfb,\n                                                          0x24, 0x5, 0xe, 0x8b, 0xc1, 0xd1, 0x61, 0xa,\n                                                          0xd6, 0xc1, 0x1, 0xf8, 0x92, 0xc0, 0x3, 0xaf,\n                                                          0x16, 0xf7, 0xba, 0x4d, 0xa, 0xfb, 0x21, 0x6,\n                                                          0x98, 0xd1, 0x5, 0xf7, 0x15, 0x6, 0xf7, 0x1,\n                                                          0xf7, 0x5, 0xb5, 0xf7, 0x32, 0xd3, 0x46, 0xb0,\n                                                          0x37, 0x1f, 0xfb, 0x24, 0x6, 0x99, 0xd6, 0x5,\n                                                          0xf3, 0x76, 0xa, 0xfb, 0x95, 0x5f, 0xa, 0xf4,\n                                                          0x6, 0x3a, 0x58, 0xa, 0x23, 0x6, 0xf7, 0x44,\n                                                          0xf7, 0x10, 0x15, 0xae, 0xf7, 0x5d, 0x5, 0xf7,\n                                                          0x1a, 0x6, 0xc0, 0xcd, 0x7d, 0x5a, 0x28, 0x41,\n                                                          0x64, 0x38, 0x1f, 0xe, 0x7c, 0xc2, 0x60, 0xc3,\n                                                          0xf7, 0xda, 0xc3, 0xf7, 0x1f, 0xc2, 0x12, 0xf7,\n                                                          0xc4, 0xc0, 0xf7, 0x34, 0xc1, 0x5f, 0xc4, 0x13,\n                                                          0x7c, 0x9a, 0x88, 0x15, 0xf7, 0x1c, 0x6, 0xe8,\n                                                          0xf8, 0x76, 0x5, 0xd1, 0x99, 0xa5, 0xa4, 0xf2,\n                                                          0x1b, 0xd8, 0xc0, 0x8a, 0x54, 0x1f, 0x28, 0xfb,\n                                                          0x69, 0xb9, 0xfb, 0x23, 0x1a, 0x41, 0xf7, 0x17,\n                                                          0x73, 0xad, 0x7c, 0x1e, 0x13, 0xba, 0xb8, 0x76,\n                                                          0x98, 0x74, 0x74, 0x1a, 0x43, 0xfb, 0x26, 0x6d,\n                                                          0x6d, 0x59, 0x5f, 0xa4, 0xab, 0x69, 0x1e, 0x6b,\n                                                          0x53, 0x5, 0x6d, 0xb4, 0xc0, 0x71, 0xc4, 0x1b,\n                                                          0xde, 0xf7, 0x33, 0xb3, 0xf7, 0x1a, 0xb9, 0x5c,\n                                                          0xac, 0x5c, 0x9f, 0x1f, 0x53, 0xa5, 0x3e, 0x95,\n                                                          0xae, 0x1a, 0x13, 0x7c, 0xe2, 0xf7, 0x6a, 0x5d,\n                                                          0xf7, 0x25, 0x1a, 0xe8, 0x48, 0xa0, 0xfb, 0x9,\n                                                          0x2b, 0x35, 0x6f, 0xfb, 0x1f, 0x79, 0x1e, 0x85,\n                                                          0x70, 0x7b, 0xa, 0x81, 0x53, 0x5, 0xde, 0x6,\n                                                          0x4c, 0xfb, 0xda, 0x6b, 0xa, 0xe, 0x4b, 0xa,\n                                                          0xf7, 0x80, 0xf8, 0xe7, 0x15, 0xf7, 0xa5, 0x24,\n                                                          0x9d, 0xaa, 0xfb, 0x85, 0xf7, 0x29, 0x5, 0xf4,\n                                                          0xfd, 0x37, 0x21, 0xa, 0x3b, 0xa, 0xf7, 0x61,\n                                                          0x77, 0x4a, 0xa, 0x13, 0x7e, 0xf7, 0x3c, 0xf8,\n                                                          0x85, 0x15, 0xb1, 0x79, 0xf7, 0x43, 0xf7, 0xb,\n                                                          0xf7, 0x10, 0xfb, 0xb, 0xba, 0x9d, 0xfb, 0xc,\n                                                          0xf7, 0x31, 0x5, 0x3a, 0x6, 0xb3, 0xfd, 0x25,\n                                                          0x21, 0xa, 0x4b, 0xa, 0xf8, 0xa0, 0xf8, 0xe7,\n                                                          0x15, 0x72, 0xd8, 0xfb, 0x9e, 0xfb, 0x29, 0x9d,\n                                                          0x6c, 0x5, 0xf7, 0x20, 0xfc, 0x83, 0x21, 0xa,\n                                                          0x3b, 0xa, 0xc6, 0xbd, 0x9e, 0xbc, 0x90, 0x76,\n                                                          0x4a, 0xa, 0x13, 0xbd, 0x80, 0xf7, 0x21, 0xf8,\n                                                          0x9e, 0x15, 0xbd, 0x81, 0x5, 0x9a, 0x92, 0xba,\n                                                          0xbd, 0xb0, 0x1b, 0xb1, 0x9e, 0x71, 0x77, 0xa5,\n                                                          0x1f, 0x7e, 0x9b, 0x9e, 0x81, 0xa7, 0x1b, 0x13,\n                                                          0xbb, 0x80, 0xcc, 0xbe, 0xba, 0xc2, 0xab, 0x1f,\n                                                          0x8a, 0x6, 0x5a, 0x94, 0x5, 0x73, 0x7c, 0x68,\n                                                          0x66, 0x65, 0x1b, 0x72, 0x7d, 0x94, 0x97, 0x7e,\n                                                          0x1f, 0x13, 0x7d, 0x80, 0x9f, 0x75, 0x7a, 0xa6,\n                                                          0x55, 0x1b, 0x56, 0x4c, 0x64, 0x4a, 0x67, 0x1f,\n                                                          0xf7, 0x8e, 0xfc, 0xa1, 0x22, 0xa, 0x13, 0xbd,\n                                                          0x80, 0x3a, 0xa, 0x13, 0x7d, 0x80, 0x98, 0xce,\n                                                          0x15, 0x13, 0xbd, 0x80, 0x2b, 0xa, 0x3b, 0xa,\n                                                          0xd1, 0xf7, 0x8, 0x4a, 0xa, 0x13, 0x7e, 0xf8,\n                                                          0x1f, 0xf8, 0x9b, 0x15, 0xdf, 0x5c, 0xa, 0x36,\n                                                          0x6, 0xfb, 0x42, 0xfb, 0x8, 0x15, 0xe0, 0x5c,\n                                                          0xa, 0x36, 0x6, 0xf7, 0xd, 0xfd, 0x12, 0x21,\n                                                          0xa, 0x3b, 0xa, 0xb1, 0xf7, 0x48, 0x6a, 0x76,\n                                                          0x4a, 0xa, 0x13, 0xbb, 0xf7, 0xb2, 0xf8, 0xc1,\n                                                          0x15, 0x63, 0xae, 0x6d, 0xba, 0xc6, 0xc7, 0xbc,\n                                                          0xc5, 0xb5, 0x6a, 0xaa, 0x5b, 0x4d, 0x51, 0x59,\n                                                          0x4f, 0x1e, 0xc9, 0x95, 0x15, 0x13, 0x77, 0xa4,\n                                                          0xa1, 0xa0, 0xa3, 0x9c, 0x9a, 0x81, 0x7d, 0x72,\n                                                          0x74, 0x75, 0x73, 0x7b, 0x7c, 0x97, 0x98, 0x1e,\n                                                          0xb6, 0xfc, 0xce, 0x22, 0xa, 0x13, 0xbb, 0x3a,\n                                                          0xa, 0x13, 0x7b, 0x98, 0xce, 0x15, 0x13, 0xbb,\n                                                          0x2b, 0xa, 0x7c, 0xc1, 0xf7, 0x39, 0xc2, 0xf7,\n                                                          0x13, 0xc2, 0x1, 0x93, 0xc6, 0x3, 0xf7, 0xa5,\n                                                          0xd7, 0x15, 0x58, 0x93, 0xb7, 0x63, 0xda, 0x1b,\n                                                          0xb8, 0xbb, 0x96, 0x96, 0xb3, 0x1f, 0x8a, 0xc1,\n                                                          0x5, 0x82, 0x6a, 0x62, 0x7e, 0x67, 0x1b, 0x3e,\n                                                          0x6c, 0xbc, 0xcc, 0x8d, 0x1f, 0x97, 0x8f, 0x98,\n                                                          0x8c, 0x98, 0x1e, 0x8c, 0x98, 0x5, 0xf7, 0x91,\n                                                          0x6, 0x93, 0xad, 0x90, 0xa4, 0xaf, 0x1a, 0xd4,\n                                                          0x6f, 0xd0, 0x33, 0x54, 0x65, 0x71, 0x62, 0x68,\n                                                          0x1e, 0x99, 0x88, 0x88, 0xc0, 0x2b, 0x1b, 0x55,\n                                                          0x5f, 0x7e, 0x7b, 0x5c, 0x1f, 0x56, 0x7, 0x98,\n                                                          0xb0, 0xb6, 0x99, 0xb4, 0x1b, 0xbf, 0x9c, 0x78,\n                                                          0x6a, 0x8c, 0x1f, 0x80, 0x8b, 0x73, 0x87, 0x7c,\n                                                          0x1e, 0x85, 0x72, 0x5, 0x8f, 0x76, 0x75, 0x83,\n                                                          0x76, 0x1b, 0x2c, 0x8a, 0xfb, 0x7, 0x59, 0xfb,\n                                                          0xe, 0x1a, 0x48, 0xbe, 0x6d, 0xc1, 0xa5, 0xe0,\n                                                          0x90, 0xe1, 0xbc, 0x1e, 0xce, 0xf7, 0x4b, 0x15,\n                                                          0xcb, 0x9b, 0xbe, 0xca, 0xc9, 0x1b, 0xd5, 0x87,\n                                                          0x3e, 0x59, 0x87, 0x1f, 0xfb, 0xad, 0xfb, 0x18,\n                                                          0x15, 0x75, 0x7b, 0x58, 0x49, 0x4b, 0x1b, 0x68,\n                                                          0x76, 0xa0, 0xaf, 0xd7, 0xd7, 0xa7, 0xc5, 0x8c,\n                                                          0x1f, 0xa7, 0xaa, 0x92, 0x87, 0x96, 0x1f, 0xe,\n                                                          0xfb, 0x1c, 0x76, 0xf7, 0x3a, 0xbe, 0xf7, 0xdc,\n                                                          0xc0, 0x8a, 0x77, 0x12, 0xb9, 0xc5, 0x13, 0xe8,\n                                                          0xf7, 0x26, 0xfb, 0x1e, 0x15, 0x7c, 0xa1, 0x9f,\n                                                          0x87, 0x9d, 0x1b, 0xbe, 0xb3, 0xaa, 0xbf, 0xa3,\n                                                          0x78, 0xa9, 0x7d, 0x90, 0x1f, 0x90, 0xa3, 0xe1,\n                                                          0x8f, 0xd3, 0xa9, 0xcb, 0xb3, 0x19, 0x80, 0xbf,\n                                                          0x5, 0x76, 0x6c, 0x31, 0x55, 0x38, 0x1b, 0xfb,\n                                                          0x1c, 0x67, 0xda, 0xc8, 0xe3, 0xf2, 0xef, 0xf7,\n                                                          0x10, 0xc5, 0xbe, 0x7f, 0x69, 0xb0, 0x1f, 0x7b,\n                                                          0x40, 0x51, 0xa, 0x13, 0xd8, 0xb0, 0xf7, 0x41,\n                                                          0x71, 0xa, 0x82, 0x60, 0x5, 0x13, 0xe8, 0xa8,\n                                                          0x62, 0x5d, 0x9a, 0x50, 0x1b, 0xfb, 0x58, 0x26,\n                                                          0xfb, 0x1b, 0xfb, 0x10, 0x26, 0xd7, 0x4d, 0xee,\n                                                          0x81, 0x1f, 0x77, 0x44, 0x5, 0x8d, 0x90, 0x92,\n                                                          0x8c, 0x93, 0x1b, 0x98, 0x98, 0x7e, 0x80, 0x77,\n                                                          0x79, 0x7d, 0x77, 0x7f, 0x77, 0x91, 0x96, 0x82,\n                                                          0x1f, 0xe, 0x7c, 0xc2, 0xf7, 0x34, 0xc4, 0x7f,\n                                                          0xa, 0xc5, 0x3, 0xf7, 0x7d, 0xf8, 0xe9, 0x15,\n                                                          0xf7, 0xa8, 0x25, 0x9d, 0xa9, 0xfb, 0x88, 0xf7,\n                                                          0x27, 0x5, 0xfb, 0x39, 0xfc, 0x6b, 0x27, 0xa,\n                                                          0x7c, 0xc2, 0xf7, 0x33, 0xc5, 0x7f, 0xa, 0xc7,\n                                                          0x3, 0xf7, 0x78, 0xf8, 0x82, 0x15, 0xf7, 0xd0,\n                                                          0xf2, 0x77, 0xd6, 0xfb, 0xc2, 0xfb, 0x26, 0x5,\n                                                          0x23, 0xfb, 0xd9, 0x27, 0xa, 0x7c, 0xc2, 0xf7,\n                                                          0x34, 0xc4, 0xf7, 0x2c, 0xc4, 0xf7, 0x18, 0xc3,\n                                                          0x1, 0xc1, 0xc5, 0xf8, 0xb, 0xc6, 0x3, 0xf7,\n                                                          0x3b, 0xf8, 0x86, 0x15, 0xb1, 0x79, 0xf7, 0x41,\n                                                          0xf7, 0xa, 0xf7, 0xf, 0xfb, 0xa, 0xb8, 0x9d,\n                                                          0xfb, 0x9, 0xf7, 0x30, 0x89, 0xa, 0xfb, 0x7b,\n                                                          0xfc, 0x59, 0x27, 0xa, 0x7c, 0xbd, 0xf7, 0x38,\n                                                          0xc5, 0xf7, 0x32, 0x76, 0xf7, 0x1c, 0xf7, 0x7,\n                                                          0x1, 0xc1, 0xc5, 0xf7, 0x16, 0xe3, 0xcc, 0xe2,\n                                                          0x90, 0xc6, 0x3, 0xf8, 0x1f, 0xf8, 0xa6, 0x15,\n                                                          0xe2, 0x6e, 0xa, 0x33, 0x6, 0xfb, 0x45, 0xfb,\n                                                          0x7, 0x15, 0xe3, 0x6e, 0xa, 0x33, 0x6, 0xfb,\n                                                          0x29, 0xfc, 0x50, 0x27, 0xa, 0x6f, 0xa, 0xf7,\n                                                          0x7f, 0x77, 0x1, 0xf7, 0x82, 0xf8, 0xe8, 0x15,\n                                                          0xf7, 0x93, 0x25, 0x9c, 0xab, 0xfb, 0x75, 0xf7,\n                                                          0x26, 0x5, 0xfb, 0x61, 0xfd, 0x34, 0x33, 0xa,\n                                                          0x6f, 0xa, 0xf7, 0x7f, 0x77, 0x1, 0xdb, 0x16,\n                                                          0xf8, 0x13, 0x46, 0xa, 0xfb, 0x3a, 0x6, 0xd2,\n                                                          0xf8, 0x12, 0x5, 0xfb, 0x4f, 0x67, 0xa, 0xf7,\n                                                          0x1b, 0x6, 0x4e, 0xfb, 0xdb, 0x5, 0xfb, 0x3b,\n                                                          0x6, 0xf7, 0x2f, 0xf8, 0x4b, 0x15, 0xf7, 0xa7,\n                                                          0xf1, 0x70, 0xd7, 0xfb, 0x9d, 0xfb, 0x26, 0x5,\n                                                          0xe, 0x6f, 0xa, 0xf7, 0x6d, 0x77, 0x1, 0xf7,\n                                                          0x36, 0xf8, 0x86, 0x15, 0xaf, 0x79, 0xf7, 0x3c,\n                                                          0xf7, 0xa, 0xf7, 0x9, 0xfb, 0xa, 0xb8, 0x9d,\n                                                          0xfb, 0x5, 0xf7, 0x30, 0x5, 0x3e, 0x6, 0xfb,\n                                                          0x96, 0xfd, 0x22, 0x33, 0xa, 0x6f, 0xa, 0xde,\n                                                          0xf7, 0x7, 0x1, 0xf8, 0x2c, 0xf8, 0x9c, 0x15,\n                                                          0xe4, 0x6e, 0xa, 0x32, 0x6, 0xfb, 0x4b, 0xfb,\n                                                          0x7, 0x15, 0xe6, 0x6e, 0xa, 0x31, 0x6, 0xfb,\n                                                          0x58, 0xfd, 0xf, 0x33, 0xa, 0x7c, 0xbe, 0xf7,\n                                                          0xc6, 0xbf, 0xf7, 0x7f, 0x77, 0x1, 0xaa, 0xc6,\n                                                          0xf8, 0x2f, 0xce, 0x3, 0xf7, 0x9b, 0xf8, 0x50,\n                                                          0x15, 0xf7, 0x13, 0xc6, 0xd2, 0x5d, 0xad, 0x28,\n                                                          0x8e, 0x7d, 0x19, 0xaa, 0x69, 0x4c, 0x9e, 0x53,\n                                                          0x1b, 0xfb, 0x66, 0x23, 0xfb, 0x11, 0xfb, 0x11,\n                                                          0x22, 0xe5, 0x55, 0xf7, 0x15, 0xf7, 0x6e, 0xef,\n                                                          0xf7, 0x26, 0xf7, 0x35, 0xd9, 0x6c, 0xef, 0x37,\n                                                          0xcb, 0x1f, 0xf2, 0xbd, 0x78, 0xb8, 0xfb, 0x18,\n                                                          0x4b, 0x66, 0x9d, 0x62, 0xa2, 0x5d, 0x90, 0x19,\n                                                          0x5e, 0x5d, 0xac, 0x88, 0xaf, 0x79, 0xa9, 0x7f,\n                                                          0x19, 0x31, 0x5f, 0x5, 0xfb, 0x2f, 0xfb, 0xe7,\n                                                          0x15, 0xf7, 0x7, 0xf7, 0x1, 0xd9, 0xf7, 0x11,\n                                                          0x1e, 0x92, 0x6, 0xf7, 0x18, 0xb1, 0x5c, 0x52,\n                                                          0x22, 0xfb, 0xa, 0x2a, 0xfb, 0xe, 0x27, 0x44,\n                                                          0xb6, 0xd1, 0x1f, 0xe, 0x8b, 0xbf, 0xf7, 0xc5,\n                                                          0xc0, 0xdb, 0xbb, 0x9b, 0xbf, 0x1, 0xea, 0xc3,\n                                                          0xf7, 0xa9, 0xc3, 0x3, 0xf7, 0x45, 0xf8, 0x96,\n                                                          0x15, 0xbb, 0x7d, 0x5, 0x9a, 0x92, 0xb9, 0xbc,\n                                                          0xaf, 0x1b, 0xaa, 0x9b, 0x79, 0x7a, 0x9d, 0x1f,\n                                                          0x7c, 0x9b, 0x9e, 0x7d, 0xae, 0x1b, 0xcb, 0xc6,\n                                                          0xb9, 0xc2, 0xa9, 0x1f, 0x59, 0x97, 0x5, 0x73,\n                                                          0x7d, 0x5e, 0x62, 0x65, 0x1b, 0x73, 0x7e, 0x9a,\n                                                          0x9a, 0x7c, 0x1f, 0x9d, 0x7a, 0x78, 0x9f, 0x62,\n                                                          0x1b, 0x56, 0x4e, 0x65, 0x4b, 0x68, 0x1f, 0xfb,\n                                                          0x46, 0xfc, 0x96, 0x15, 0xf7, 0x76, 0x6, 0x97,\n                                                          0xbf, 0x5, 0x35, 0x6, 0xbb, 0xf7, 0x7c, 0x5,\n                                                          0xb6, 0xc0, 0xda, 0xb7, 0xca, 0x1b, 0xb1, 0xbc,\n                                                          0x82, 0x5f, 0x84, 0x8b, 0x82, 0x89, 0x82, 0x1f,\n                                                          0x58, 0xfb, 0x85, 0x5, 0x37, 0x82, 0xa, 0xf7,\n                                                          0x73, 0x6, 0x97, 0xbf, 0x5, 0x37, 0x6, 0xbd,\n                                                          0xf7, 0x86, 0x5, 0x8e, 0x98, 0x8d, 0x97, 0x96,\n                                                          0x1a, 0xc5, 0x8c, 0x67, 0xae, 0x38, 0x1b, 0x44,\n                                                          0x3e, 0x65, 0x5f, 0x4d, 0x1f, 0x9a, 0xd0, 0x5,\n                                                          0xfb, 0x21, 0x6, 0x80, 0x56, 0x5, 0xe0, 0x6,\n                                                          0x4b, 0xfb, 0xc5, 0x5, 0x36, 0x6, 0xe, 0x5a,\n                                                          0xa, 0xf7, 0x7d, 0xf8, 0xe7, 0x15, 0xf7, 0x93,\n                                                          0x23, 0x9a, 0xaa, 0xfb, 0x73, 0xf7, 0x2a, 0x5,\n                                                          0xfb, 0x73, 0xfc, 0x90, 0x29, 0xa, 0xe, 0x5a,\n                                                          0xa, 0xc4, 0xf7, 0x38, 0x29, 0xa, 0xf7, 0x15,\n                                                          0xf7, 0xcc, 0x15, 0xf7, 0xba, 0xea, 0x7b, 0xe1,\n                                                          0xfb, 0xb9, 0xfb, 0x2a, 0x5, 0xe, 0x5d, 0xa,\n                                                          0xf7, 0x62, 0x77, 0x49, 0xa, 0xf7, 0x43, 0xf8,\n                                                          0x85, 0x15, 0xae, 0x79, 0xf7, 0x38, 0xf7, 0xb,\n                                                          0xf7, 0x8, 0xfb, 0xb, 0xb7, 0x9d, 0xfb, 0x4,\n                                                          0xf7, 0x31, 0x5, 0x3f, 0x6, 0xfb, 0xb5, 0xfc,\n                                                          0x7e, 0x29, 0xa, 0xe, 0x5d, 0xa, 0xc9, 0xbd,\n                                                          0x9c, 0xbc, 0x49, 0xa, 0xf7, 0x2c, 0xf8, 0xa1,\n                                                          0x15, 0xbb, 0x80, 0x5, 0x9a, 0x91, 0xb6, 0xbb,\n                                                          0xaf, 0x1b, 0xa3, 0x9c, 0x7c, 0x7b, 0x9d, 0x1f,\n                                                          0x7a, 0x9f, 0x9f, 0x78, 0xaa, 0x1b, 0xc8, 0xc5,\n                                                          0xbb, 0xc2, 0xa8, 0x1f, 0x5b, 0x94, 0x5, 0x73,\n                                                          0x7d, 0x63, 0x65, 0x67, 0x1b, 0x75, 0x7b, 0x99,\n                                                          0x98, 0x7c, 0x1f, 0x9e, 0x75, 0x76, 0x9f, 0x69,\n                                                          0x1b, 0x59, 0x50, 0x67, 0x4a, 0x69, 0x1f, 0x2c,\n                                                          0xfb, 0xfd, 0x29, 0xa, 0xe, 0x5d, 0xa, 0xd3,\n                                                          0xf7, 0x7, 0x49, 0xa, 0xf8, 0x11, 0xf8, 0x9c,\n                                                          0x15, 0xda, 0x6, 0xa3, 0xf7, 0x7, 0x89, 0xa,\n                                                          0xfb, 0x38, 0xfb, 0x7, 0x15, 0xdc, 0x6, 0xa2,\n                                                          0xf7, 0x7, 0x5, 0x3a, 0x6, 0xfb, 0x62, 0xfc,\n                                                          0x6b, 0x29, 0xa, 0xe, 0xc6, 0x76, 0xf7, 0x55,\n                                                          0xc6, 0xf7, 0x45, 0x77, 0x1, 0xf7, 0xad, 0xf8,\n                                                          0x2e, 0x6c, 0xa, 0x9f, 0x75, 0x71, 0x6f, 0x70,\n                                                          0x6d, 0x1e, 0xfb, 0x5c, 0xfb, 0x47, 0x15, 0xf8,\n                                                          0x3e, 0x6, 0x96, 0xc6, 0x5, 0xfc, 0x3e, 0x6,\n                                                          0xf7, 0x1b, 0xfb, 0x64, 0x6c, 0xa, 0x9d, 0x75,\n                                                          0x71, 0x6f, 0x72, 0x6d, 0x1e, 0xe, 0x7f, 0xc3,\n                                                          0x63, 0x76, 0xf8, 0x2e, 0xc2, 0x8e, 0x77, 0x12,\n                                                          0x13, 0x60, 0xa3, 0xa3, 0x15, 0xa7, 0x62, 0xcb,\n                                                          0xbe, 0x5, 0x13, 0x90, 0x69, 0xb1, 0xc0, 0x7f,\n                                                          0xbd, 0x1b, 0xf7, 0x14, 0xf7, 0xf, 0xdd, 0xf7,\n                                                          0x29, 0xa6, 0x1f, 0x95, 0xbf, 0x86, 0xbf, 0x72,\n                                                          0xb1, 0xc8, 0xbc, 0x18, 0x6f, 0xb4, 0x4c, 0x58,\n                                                          0x5, 0x13, 0xa0, 0xac, 0x65, 0x5a, 0x9a, 0x53,\n                                                          0x1b, 0xfb, 0x2d, 0x21, 0x22, 0xfb, 0x11, 0x73,\n                                                          0x1f, 0x82, 0x55, 0x91, 0x54, 0xa6, 0x65, 0x8,\n                                                          0xdb, 0x8d, 0x15, 0xf7, 0xc6, 0xf7, 0x8d, 0x9c,\n                                                          0x6e, 0x8f, 0x66, 0x83, 0x65, 0x19, 0x7e, 0x5d,\n                                                          0x5, 0x68, 0x7d, 0x52, 0x2e, 0xfb, 0x18, 0x1b,\n                                                          0x65, 0x66, 0x93, 0xa0, 0x6f, 0x1f, 0x69, 0xb0,\n                                                          0x15, 0x78, 0xa7, 0x86, 0xb3, 0x92, 0xb3, 0x8,\n                                                          0xf6, 0x9f, 0xea, 0xcf, 0xf3, 0x1b, 0xaa, 0xb6,\n                                                          0x84, 0x72, 0xab, 0x1f, 0xe, 0x4e, 0xa, 0xf7,\n                                                          0x80, 0x77, 0x12, 0xe8, 0xc6, 0x13, 0xb8, 0xf7,\n                                                          0x75, 0xf8, 0xea, 0x15, 0xf7, 0x9c, 0x21, 0x9b,\n                                                          0xad, 0xfb, 0x7c, 0xf7, 0x26, 0x5, 0xfb, 0x65,\n                                                          0xfb, 0xb8, 0x24, 0xa, 0x4e, 0xa, 0xf7, 0x80,\n                                                          0x77, 0x12, 0xdd, 0xc6, 0x13, 0xb8, 0xf7, 0x77,\n                                                          0xf8, 0x81, 0x15, 0xf7, 0xd4, 0xf3, 0x77, 0xd6,\n                                                          0xfb, 0xc7, 0xfb, 0x20, 0x5, 0xfb, 0x3b, 0xfb,\n                                                          0x2c, 0x24, 0xa, 0x4e, 0xa, 0xf7, 0x82, 0x77,\n                                                          0x12, 0xe8, 0xc6, 0x13, 0xb8, 0xf7, 0x39, 0xf8,\n                                                          0x98, 0x15, 0xaf, 0x7a, 0xf7, 0x3d, 0xf7, 0xb,\n                                                          0xf7, 0xc, 0xfb, 0xb, 0xb8, 0x9c, 0xfb, 0x7,\n                                                          0xf7, 0x32, 0x5, 0x3d, 0x6, 0xfb, 0xaa, 0xfb,\n                                                          0xba, 0x24, 0xa, 0x4e, 0xa, 0xe8, 0xf7, 0x8,\n                                                          0x12, 0xe8, 0xc6, 0x13, 0xb8, 0xf8, 0x10, 0xf8,\n                                                          0xa5, 0x15, 0xdc, 0x6, 0xa3, 0xf7, 0x8, 0x6b,\n                                                          0xa, 0xfb, 0x3d, 0xfb, 0x8, 0x15, 0xdf, 0x6,\n                                                          0xa2, 0xf7, 0x8, 0x7b, 0xa, 0xfb, 0x56, 0xfb,\n                                                          0x9d, 0x24, 0xa, 0xfb, 0x31, 0xc1, 0xf8, 0x72,\n                                                          0xc1, 0x1, 0xe0, 0xcb, 0xf7, 0xf6, 0xcb, 0x3,\n                                                          0xf7, 0x70, 0xf8, 0x89, 0x15, 0xf7, 0xdb, 0xef,\n                                                          0x76, 0xd2, 0xfb, 0xcc, 0xfb, 0x20, 0x5, 0xfb,\n                                                          0x89, 0xfd, 0xf, 0x15, 0x7f, 0x55, 0x5, 0xf7,\n                                                          0xa3, 0x2a, 0xa, 0x31, 0x6, 0xf8, 0x36, 0xf8,\n                                                          0x72, 0x5, 0xce, 0x4d, 0xa, 0xfb, 0x52, 0x5f,\n                                                          0xa, 0xc6, 0x6, 0xfb, 0x82, 0xfb, 0xa1, 0x26,\n                                                          0xf7, 0xa1, 0x5, 0xcf, 0x4d, 0xa, 0xfb, 0x5f,\n                                                          0x2d, 0xa, 0xd3, 0x6, 0xf7, 0xf, 0xfb, 0xd6,\n                                                          0xfb, 0x1e, 0xfb, 0x30, 0x5, 0xe, 0xfb, 0x31,\n                                                          0xc0, 0xf7, 0xc, 0xc1, 0xf7, 0xe1, 0xc1, 0xf7,\n                                                          0xb, 0xc0, 0x1, 0xdc, 0xc2, 0xf8, 0x3a, 0xc4,\n                                                          0x3, 0x88, 0x23, 0x15, 0x80, 0x56, 0x5, 0xf7,\n                                                          0xba, 0x80, 0xa, 0xfb, 0x2f, 0x6, 0xb6, 0xf7,\n                                                          0x64, 0x5, 0x65, 0xa3, 0xb9, 0x59, 0xe7, 0x1b,\n                                                          0xf7, 0x22, 0xf7, 0x18, 0xf7, 0x11, 0xf7, 0x2a,\n                                                          0xf3, 0x37, 0xc9, 0x2c, 0x34, 0x49, 0x71, 0x5e,\n                                                          0x5e, 0x1f, 0xbc, 0xf7, 0x87, 0x5, 0xfb, 0x1e,\n                                                          0x6, 0x7f, 0x56, 0x5, 0xdf, 0x6, 0xfb, 0x20,\n                                                          0xfd, 0x3c, 0x5, 0xf7, 0x17, 0xf7, 0xf3, 0x15,\n                                                          0xe2, 0x9d, 0xdb, 0xd0, 0xf7, 0x1, 0x1b, 0xf7,\n                                                          0x5, 0xa5, 0x3c, 0x52, 0xfb, 0xa, 0xfb, 0xf,\n                                                          0x3c, 0x34, 0x2d, 0x4c, 0xd8, 0xef, 0xa0, 0x1f,\n                                                          0xe, 0xfb, 0x31, 0xbd, 0xf8, 0x64, 0xbc, 0xd8,\n                                                          0xf7, 0x4, 0x1, 0xf8, 0x15, 0xf8, 0x81, 0x15,\n                                                          0xe3, 0x6, 0xa4, 0xf7, 0x4, 0x5, 0x33, 0x6,\n                                                          0xfb, 0x4b, 0xfb, 0x4, 0x15, 0xe6, 0x6, 0xa4,\n                                                          0xf7, 0x4, 0x5, 0x31, 0x6, 0xfb, 0xb0, 0xfd,\n                                                          0x5c, 0x15, 0x7f, 0x59, 0x5, 0xf7, 0xa2, 0x6,\n                                                          0x97, 0xbd, 0x5, 0x30, 0x6, 0xf8, 0x36, 0xf8,\n                                                          0x64, 0x5, 0xce, 0x6, 0x96, 0xbc, 0x5, 0xfb,\n                                                          0x51, 0x6, 0x7f, 0x5a, 0x5, 0xc6, 0x6, 0xfb,\n                                                          0x80, 0xfb, 0x97, 0x24, 0xf7, 0x97, 0x5, 0xd0,\n                                                          0x6, 0x95, 0xbc, 0x5, 0xfb, 0x5f, 0x6, 0x81,\n                                                          0x5a, 0x5, 0xd2, 0x6, 0xf7, 0xf, 0xfb, 0xc8,\n                                                          0xfb, 0x1e, 0xfb, 0x30, 0x5, 0xe, 0x8b, 0xc1,\n                                                          0xf8, 0x3e, 0xc2, 0xcf, 0xf7, 0x5, 0x1, 0xaf,\n                                                          0x16, 0x44, 0xa, 0xf8, 0x3e, 0x37, 0xa, 0xfc,\n                                                          0x3e, 0x5, 0xfb, 0x45, 0x6, 0xf7, 0xa8, 0xf8,\n                                                          0xb9, 0x15, 0xe6, 0x6, 0xa4, 0xf7, 0x5, 0x5,\n                                                          0x31, 0x6, 0xe, 0x8b, 0xc1, 0xf7, 0xd2, 0xc1,\n                                                          0x1, 0xf7, 0xab, 0xc3, 0x3, 0xe5, 0x16, 0xf8,\n                                                          0x2d, 0x2a, 0xa, 0xfb, 0x43, 0x6, 0xd4, 0xf8,\n                                                          0x8, 0x5, 0xfb, 0x5b, 0x5f, 0xa, 0xf7, 0x24,\n                                                          0x6, 0x4b, 0xfb, 0xd2, 0x5, 0xfb, 0x46, 0x6,\n                                                          0xe, 0x7a, 0xc1, 0x69, 0x76, 0xf8, 0xa2, 0xc1,\n                                                          0x12, 0xf7, 0x23, 0xc6, 0xf7, 0xd5, 0xc1, 0x13,\n                                                          0xb8, 0x68, 0x7a, 0x15, 0xf7, 0x56, 0x47, 0xa,\n                                                          0x49, 0x6, 0xec, 0xf8, 0x6b, 0x5, 0xc9, 0x47,\n                                                          0xa, 0xfb, 0x4e, 0x45, 0xa, 0xcc, 0x6, 0x2a,\n                                                          0xfc, 0x6b, 0x5, 0x46, 0x6, 0xf7, 0x92, 0xa0,\n                                                          0x15, 0x13, 0x78, 0x67, 0xa3, 0xa8, 0x63, 0xce,\n                                                          0x1b, 0xf7, 0x13, 0x98, 0x7c, 0xa, 0xba, 0x36,\n                                                          0xa, 0xfb, 0x66, 0x38, 0xa, 0xf7, 0x1, 0x6,\n                                                          0x4b, 0xfb, 0xdc, 0x5, 0x3a, 0x7b, 0x88, 0x4d,\n                                                          0x36, 0x1b, 0x71, 0x5b, 0x91, 0xf7, 0xe, 0xa2,\n                                                          0x1f, 0x9a, 0xe6, 0x71, 0xa, 0xe, 0xfb, 0x31,\n                                                          0xc1, 0xf8, 0x84, 0xc4, 0xe4, 0xf7, 0xa, 0x1,\n                                                          0xf8, 0x7f, 0xf8, 0xaf, 0x54, 0xa, 0xfb, 0xa2,\n                                                          0xfd, 0xb2, 0x15, 0x81, 0xa8, 0xa1, 0x85, 0xa8,\n                                                          0x1b, 0xf6, 0x92, 0xb6, 0xf7, 0x12, 0xad, 0x1f,\n                                                          0xea, 0xf8, 0x45, 0x5, 0xfb, 0x25, 0x82, 0xa,\n                                                          0xdf, 0x6, 0x39, 0xfc, 0x3, 0x74, 0x2e, 0x83,\n                                                          0x69, 0x5c, 0x89, 0x19, 0x6c, 0x8a, 0x7c, 0x91,\n                                                          0x73, 0x92, 0x8, 0xfb, 0x93, 0x81, 0x15, 0x80,\n                                                          0x55, 0x5, 0xf7, 0x3c, 0x6, 0x98, 0xc1, 0x5,\n                                                          0x4e, 0x6, 0xf7, 0x1, 0xf8, 0x84, 0x5, 0xc3,\n                                                          0x46, 0xa, 0xfb, 0x3e, 0x38, 0xa, 0xc1, 0x6,\n                                                          0xfb, 0x1, 0xfc, 0x84, 0x5, 0xf7, 0x17, 0xf9,\n                                                          0x14, 0x54, 0xa, 0xe, 0x3e, 0xa, 0x9f, 0x16,\n                                                          0xf8, 0x91, 0x6, 0xbe, 0xf7, 0x91, 0x71, 0xa,\n                                                          0x5f, 0xfb, 0x5b, 0x5, 0xfb, 0xb2, 0x6, 0xb0,\n                                                          0xf7, 0x4e, 0xf7, 0x53, 0xd1, 0x96, 0xc2, 0xfb,\n                                                          0x53, 0x44, 0xb6, 0xf7, 0x6a, 0x5, 0xf7, 0x13,\n                                                          0x2a, 0xa, 0xfb, 0xb6, 0x45, 0xa, 0xf7, 0x0,\n                                                          0x6, 0x5c, 0xfb, 0x80, 0x30, 0x69, 0x80, 0x55,\n                                                          0xe6, 0xad, 0x6b, 0xfb, 0x38, 0x57, 0xa, 0xe,\n                                                          0x8b, 0xc2, 0xf8, 0x9b, 0xc2, 0x1, 0xc3, 0x16,\n                                                          0xf8, 0x57, 0x6, 0x98, 0xc2, 0x5, 0xfb, 0x56,\n                                                          0x6, 0xbf, 0xf7, 0x89, 0xf7, 0x2e, 0xc0, 0x97,\n                                                          0xc2, 0xfb, 0x2d, 0x56, 0xc5, 0xf7, 0xa6, 0x5,\n                                                          0xfb, 0x90, 0x56, 0xa, 0xf7, 0x53, 0x6, 0x58,\n                                                          0xfb, 0x85, 0xfb, 0x33, 0x55, 0x80, 0x55, 0xf7,\n                                                          0x32, 0xc0, 0x59, 0xfb, 0x73, 0x5, 0xfb, 0x57,\n                                                          0x6, 0xe, 0x8b, 0xc1, 0xf7, 0x5b, 0xc2, 0xf7,\n                                                          0x5c, 0xc1, 0x1, 0x85, 0xc3, 0x3, 0xf7, 0xc2,\n                                                          0xc1, 0x15, 0xb2, 0xf7, 0x5b, 0x5, 0xda, 0x60,\n                                                          0xa, 0xc1, 0x6, 0xac, 0xf7, 0x3a, 0x5, 0x55,\n                                                          0x38, 0xa, 0x3c, 0x6, 0xb2, 0xf7, 0x5c, 0x5,\n                                                          0xf7, 0x2a, 0x6, 0x78, 0x27, 0x6a, 0xa, 0xa9,\n                                                          0xf7, 0x2e, 0x5, 0xfb, 0xa5, 0x6, 0xfb, 0x3f,\n                                                          0xfb, 0x3d, 0xfb, 0x21, 0xfb, 0x6a, 0xfb, 0x3,\n                                                          0xc3, 0x2b, 0xf7, 0x32, 0x1f, 0xf7, 0xb5, 0x6,\n                                                          0xaa, 0xf7, 0x2c, 0x52, 0xa, 0x77, 0x29, 0x5,\n                                                          0xfb, 0x62, 0x16, 0xfb, 0x25, 0x57, 0xc9, 0xf2,\n                                                          0xf7, 0x3e, 0xf7, 0x2c, 0xf7, 0xc, 0xf7, 0x1a,\n                                                          0x8a, 0x1f, 0xe, 0x7c, 0xc2, 0xf7, 0x38, 0xc1,\n                                                          0xf7, 0x14, 0xc2, 0x1, 0x9e, 0xc2, 0xf7, 0x65,\n                                                          0xba, 0xf7, 0x57, 0xc2, 0x3, 0xf7, 0xad, 0xd3,\n                                                          0x15, 0x57, 0x9b, 0xaa, 0x68, 0xd5, 0x1b, 0xb6,\n                                                          0xba, 0x97, 0x96, 0xb2, 0x1f, 0xc2, 0x7, 0x82,\n                                                          0x6d, 0x62, 0x7d, 0x68, 0x1b, 0x4c, 0x64, 0xad,\n                                                          0xd6, 0x99, 0x8e, 0xa5, 0x8f, 0x9a, 0x1f, 0xf7,\n                                                          0x80, 0x6, 0x94, 0xaa, 0x90, 0xa2, 0xae, 0x1a,\n                                                          0xd6, 0x78, 0xd4, 0x36, 0x46, 0x5f, 0x5a, 0x6d,\n                                                          0x76, 0x1e, 0xba, 0x80, 0x69, 0xab, 0x4b, 0x1b,\n                                                          0xfb, 0x2f, 0x50, 0xfb, 0x5c, 0xfb, 0x11, 0xfb,\n                                                          0xc, 0xe3, 0x80, 0xa8, 0xe3, 0xb7, 0xcb, 0xa2,\n                                                          0x98, 0x1f, 0xc7, 0xf7, 0x4e, 0x15, 0xcb, 0x9b,\n                                                          0xbe, 0xcb, 0xc7, 0x1b, 0xd1, 0x82, 0x3d, 0x59,\n                                                          0x87, 0x1f, 0xfc, 0x57, 0xfb, 0xf, 0x15, 0xe9,\n                                                          0xbe, 0xf7, 0x31, 0xec, 0xe2, 0x7e, 0x29, 0x4c,\n                                                          0x7e, 0x1e, 0x47, 0x7f, 0x75, 0xfb, 0x9, 0x23,\n                                                          0x1b, 0x4d, 0x82, 0xbc, 0xb9, 0x1f, 0xe, 0xfb,\n                                                          0x16, 0x76, 0xf7, 0x70, 0xc6, 0xf7, 0x36, 0xc4,\n                                                          0xf7, 0x3a, 0xc8, 0x91, 0x77, 0x12, 0xeb, 0xce,\n                                                          0xf7, 0xd0, 0xcf, 0x13, 0xf6, 0x98, 0xcf, 0x15,\n                                                          0xcc, 0x6, 0x97, 0xc7, 0xba, 0x75, 0xb8, 0x6c,\n                                                          0xd8, 0x85, 0x19, 0x78, 0x38, 0x5, 0x90, 0x94,\n                                                          0x95, 0x8c, 0x94, 0x1b, 0x9b, 0x98, 0x80, 0x7d,\n                                                          0x7d, 0x84, 0x6d, 0x68, 0x7a, 0x79, 0x8f, 0x94,\n                                                          0x7f, 0x1f, 0x6c, 0x50, 0x5, 0x82, 0x91, 0xa6,\n                                                          0x78, 0xad, 0x1b, 0xbb, 0xc9, 0xb5, 0xe1, 0xa6,\n                                                          0x7e, 0xaf, 0x73, 0x96, 0x1f, 0x8e, 0x9d, 0x5,\n                                                          0xf7, 0x20, 0x91, 0xe2, 0xba, 0xf6, 0x1a, 0xcf,\n                                                          0x3c, 0xb8, 0x34, 0x90, 0x1e, 0x3c, 0x8f, 0xfb,\n                                                          0x1f, 0x7f, 0xe5, 0x1a, 0xc7, 0xf7, 0xc, 0xa3,\n                                                          0xbc, 0xcc, 0xc8, 0x73, 0x6e, 0xb7, 0x1e, 0x7e,\n                                                          0x52, 0x5, 0xc9, 0x6, 0x13, 0xee, 0xaf, 0xf7,\n                                                          0x45, 0x5, 0x4d, 0x6, 0x82, 0x54, 0x5, 0x13,\n                                                          0xf6, 0xa8, 0x5b, 0x4e, 0x9f, 0x4a, 0x1b, 0xfb,\n                                                          0x16, 0xfb, 0x8, 0x50, 0x30, 0xfb, 0x16, 0xf7,\n                                                          0x1f, 0x8b, 0xf3, 0x87, 0x1f, 0xdf, 0x88, 0xc3,\n                                                          0x75, 0x5a, 0x1a, 0x35, 0xfb, 0x22, 0x89, 0x56,\n                                                          0x40, 0x53, 0xad, 0xb4, 0x5b, 0x1e, 0x96, 0xc0,\n                                                          0x5, 0x4b, 0x6, 0xe, 0xfb, 0x16, 0x76, 0xf7,\n                                                          0x47, 0xba, 0xf7, 0x17, 0xb9, 0xf7, 0x1b, 0xbd,\n                                                          0x8f, 0x77, 0x12, 0xf7, 0xa, 0xc8, 0xf7, 0xac,\n                                                          0xc7, 0x13, 0xf6, 0xba, 0xa6, 0x15, 0xc2, 0x6,\n                                                          0x96, 0xbb, 0xb5, 0x7a, 0xb5, 0x76, 0xcd, 0x82,\n                                                          0x19, 0x7b, 0x47, 0x5, 0x8e, 0x92, 0x92, 0x8d,\n                                                          0x92, 0x1b, 0x9a, 0x99, 0x82, 0x7f, 0x80, 0x85,\n                                                          0x73, 0x6c, 0x7c, 0x7b, 0x8e, 0x92, 0x80, 0x1f,\n                                                          0x70, 0x5c, 0x5, 0x83, 0x90, 0xa3, 0x7c, 0xa9,\n                                                          0x1b, 0xb5, 0xc2, 0xac, 0xd0, 0x1f, 0x8a, 0xa1,\n                                                          0x81, 0xaa, 0x76, 0x94, 0x8d, 0x9a, 0x18, 0xf7,\n                                                          0x11, 0x90, 0xd8, 0xb0, 0xe2, 0x1a, 0x8c, 0xc2,\n                                                          0x44, 0xaf, 0x3d, 0x8f, 0x8, 0x45, 0x8e, 0xfb,\n                                                          0xe, 0x82, 0xd4, 0x1a, 0xbc, 0xf5, 0x9e, 0xb6,\n                                                          0xc4, 0xc2, 0x78, 0x73, 0xb2, 0x1e, 0x80, 0x5d,\n                                                          0x5, 0xc1, 0x6, 0x13, 0xee, 0xaa, 0xf7, 0x23,\n                                                          0x5, 0x55, 0x6, 0x83, 0x5f, 0x5, 0x13, 0xf6,\n                                                          0xa2, 0x61, 0x54, 0x9c, 0x52, 0x1b, 0xfb, 0x7,\n                                                          0x23, 0x5b, 0x41, 0x21, 0xf7, 0x10, 0x8b, 0xe7,\n                                                          0x88, 0x1f, 0xd5, 0x89, 0xbe, 0x79, 0x63, 0x1a,\n                                                          0x46, 0xfb, 0x13, 0x89, 0x5c, 0x49, 0x59, 0xa7,\n                                                          0xac, 0x60, 0x1e, 0x95, 0xb6, 0x62, 0xa, 0xe,\n                                                          0x77, 0xc2, 0xf8, 0x7d, 0xc2, 0x8b, 0xb9, 0xf7,\n                                                          0x48, 0x77, 0x12, 0xf4, 0xc7, 0xf7, 0xa7, 0xc8,\n                                                          0x17, 0x8c, 0x81, 0x15, 0xc4, 0x78, 0xa, 0x5f,\n                                                          0xc1, 0xe9, 0x7a, 0xb9, 0x1b, 0xf7, 0x9, 0xf7,\n                                                          0xd, 0xae, 0xf7, 0x21, 0xe6, 0x38, 0xa8, 0x3a,\n                                                          0x9f, 0x1f, 0x45, 0x9c, 0x25, 0x98, 0xde, 0x1a,\n                                                          0xd7, 0xcd, 0xb2, 0xee, 0xc1, 0xcf, 0x71, 0x68,\n                                                          0xab, 0x1e, 0x7a, 0x3a, 0x5, 0xc6, 0x6, 0xad,\n                                                          0xf7, 0x50, 0x71, 0xa, 0x83, 0x63, 0x5, 0x13,\n                                                          0xfc, 0xa7, 0x69, 0x45, 0xa0, 0x56, 0x1b, 0xfb,\n                                                          0x33, 0x40, 0x4c, 0xfb, 0x3, 0xfb, 0xf, 0xf7,\n                                                          0x10, 0x74, 0xdc, 0x79, 0x1f, 0xce, 0x7d, 0xca,\n                                                          0x6c, 0x61, 0x1a, 0x49, 0x4e, 0x56, 0xfb, 0x6,\n                                                          0x4a, 0x3e, 0xa7, 0xb3, 0x60, 0x1e, 0x99, 0xd1,\n                                                          0x62, 0xa, 0xf7, 0xbb, 0xf8, 0x58, 0x15, 0xde,\n                                                          0x6, 0xf7, 0x4b, 0xf7, 0x36, 0x62, 0x9d, 0xfb,\n                                                          0x3c, 0xfb, 0xd, 0xfb, 0x1b, 0xf7, 0xd, 0x5d,\n                                                          0x78, 0x5, 0xe, 0x7c, 0xc2, 0x8b, 0xf7, 0x25,\n                                                          0x8b, 0xbf, 0x8b, 0xf7, 0x2a, 0x8b, 0xc2, 0x8b,\n                                                          0xbc, 0xf7, 0x46, 0x77, 0x1, 0xf3, 0xc4, 0xf7,\n                                                          0xa5, 0xc6, 0x3, 0xf7, 0xc5, 0xf8, 0x7f, 0x85,\n                                                          0xa, 0xf7, 0x49, 0xf7, 0x32, 0x64, 0x9f, 0xfb,\n                                                          0x3d, 0xfb, 0x4, 0xfb, 0x17, 0xf7, 0x3, 0x5e,\n                                                          0x77, 0x5, 0xfb, 0x2c, 0xfd, 0x2b, 0x15, 0xc3,\n                                                          0x36, 0xa, 0x74, 0xb8, 0xb5, 0x6b, 0xdd, 0x1b,\n                                                          0xf7, 0x1e, 0xe2, 0xb5, 0xf2, 0x1f, 0x8c, 0xc8,\n                                                          0x46, 0xb5, 0x40, 0x8f, 0x8, 0x47, 0x8f, 0xfb,\n                                                          0xd, 0x80, 0xdc, 0x1a, 0xc1, 0xf3, 0xa1, 0xb6,\n                                                          0xc3, 0xbf, 0x75, 0x70, 0xb1, 0x1e, 0x80, 0x58,\n                                                          0x5, 0xc1, 0x6, 0xab, 0xf7, 0x34, 0x5, 0x55,\n                                                          0x6, 0x82, 0x59, 0x5, 0xa6, 0x62, 0x57, 0x9d,\n                                                          0x52, 0x1b, 0xfb, 0x4, 0x27, 0x56, 0x38, 0xfb,\n                                                          0x9, 0xf7, 0xc, 0x8b, 0xe5, 0x87, 0x1f, 0xd4,\n                                                          0x88, 0xba, 0x78, 0x5f, 0x1a, 0x3e, 0xfb, 0xe,\n                                                          0x89, 0x5d, 0x4a, 0x5b, 0xa8, 0xb1, 0x62, 0x1e,\n                                                          0x94, 0xbc, 0x52, 0xa, 0xe, 0x8b, 0xc1, 0xf8,\n                                                          0x5d, 0xc1, 0xee, 0xf7, 0x9, 0x1, 0xf7, 0xfb,\n                                                          0xf9, 0x2c, 0x15, 0xe2, 0x6, 0xa4, 0xf7, 0x9,\n                                                          0x5, 0x35, 0x6, 0xfb, 0x44, 0xfb, 0x9, 0x15,\n                                                          0xe0, 0x6, 0xa6, 0xf7, 0x9, 0x5, 0x34, 0x6,\n                                                          0xfb, 0x55, 0xfd, 0xa1, 0x15, 0x31, 0xa, 0xe,\n                                                          0x8b, 0xc2, 0xf8, 0x63, 0xc2, 0x8b, 0xc1, 0x8b,\n                                                          0xc5, 0x1, 0xf7, 0x6, 0xc3, 0xf7, 0xa1, 0xc0,\n                                                          0x3, 0xa0, 0x16, 0xf8, 0x41, 0x6, 0xb5, 0xf7,\n                                                          0x63, 0x5, 0x56, 0x6, 0x6b, 0xfb, 0x2c, 0x5,\n                                                          0xfb, 0xc4, 0x6, 0xf8, 0x4f, 0xf8, 0x66, 0x95,\n                                                          0xbf, 0x5, 0xfc, 0x26, 0x6, 0x63, 0xfb, 0x55,\n                                                          0x51, 0xa, 0xa9, 0xf7, 0x1e, 0x5, 0xf7, 0xa5,\n                                                          0x6, 0xfc, 0x4e, 0xfc, 0x64, 0x5, 0xf7, 0xbd,\n                                                          0xf8, 0xd1, 0x48, 0xa, 0x8b, 0xc2, 0xf7, 0xd8,\n                                                          0xc2, 0x8b, 0xc3, 0xf7, 0x47, 0x77, 0x12, 0xf7,\n                                                          0xc4, 0xf8, 0x7e, 0x4c, 0xa, 0xfb, 0x28, 0xfd,\n                                                          0x1c, 0x15, 0xf8, 0x2b, 0x6, 0xaa, 0xf7, 0x31,\n                                                          0x52, 0xa, 0x77, 0x25, 0x5, 0xfb, 0xa7, 0x6,\n                                                          0xf8, 0x1d, 0xf7, 0xdc, 0x95, 0xbe, 0x5, 0x13,\n                                                          0x60, 0xfc, 0x1a, 0x6, 0x6d, 0xfb, 0x2e, 0x5,\n                                                          0xc1, 0x6, 0x9f, 0xee, 0x5, 0xf7, 0x95, 0x6,\n                                                          0xfc, 0x1c, 0xfb, 0xdb, 0x5, 0xe, 0xfb, 0x23,\n                                                          0xc6, 0xf8, 0x4f, 0xc5, 0xf7, 0x2d, 0xbf, 0x1,\n                                                          0x7f, 0x37, 0x15, 0x67, 0x50, 0x5, 0xf7, 0x75,\n                                                          0x9f, 0xb3, 0xf7, 0x19, 0xbd, 0x1f, 0xf7, 0x11,\n                                                          0xf7, 0xdd, 0x5, 0xf7, 0x2, 0x6, 0x9e, 0xc5,\n                                                          0x57, 0xa, 0xf7, 0x8, 0xba, 0x97, 0xb0, 0xf2,\n                                                          0x1b, 0x9e, 0x9f, 0x88, 0x8a, 0x9e, 0x1f, 0xaf,\n                                                          0xc3, 0x5, 0x61, 0x65, 0x8b, 0x6e, 0x1b, 0xfb,\n                                                          0x1f, 0x80, 0x4b, 0xfb, 0x21, 0x55, 0x1f, 0xfb,\n                                                          0x5, 0x6, 0x7a, 0x51, 0x5, 0xf7, 0x0, 0x6,\n                                                          0xfb, 0xf, 0xfb, 0xd7, 0x5, 0x20, 0x63, 0x55,\n                                                          0x7e, 0xfb, 0x1, 0x1b, 0xe, 0x79, 0xc2, 0x8b,\n                                                          0xf7, 0x39, 0x8b, 0xc2, 0xf7, 0xa0, 0xc2, 0x8b,\n                                                          0xba, 0xf7, 0x46, 0x77, 0x12, 0x9e, 0xc4, 0x17,\n                                                          0x34, 0xa, 0x13, 0xfe, 0x3d, 0xa, 0xa8, 0xf8,\n                                                          0x6, 0x48, 0xa, 0xfb, 0x31, 0xbd, 0x8b, 0xf7,\n                                                          0x38, 0x8b, 0xbe, 0xf7, 0xae, 0xbe, 0x8b, 0xbc,\n                                                          0xf7, 0x47, 0x77, 0x12, 0xab, 0xc3, 0x17, 0x3f,\n                                                          0xa, 0x13, 0xfe, 0x30, 0xa, 0xf7, 0x6f, 0xf7,\n                                                          0xa0, 0x4c, 0xa, 0xe, 0xf8, 0xe2, 0xcb, 0x1,\n                                                          0xf7, 0x10, 0xf7, 0xf4, 0x3, 0xf7, 0x10, 0xf8,\n                                                          0x83, 0x15, 0xad, 0x79, 0xf7, 0x36, 0xf7, 0x5,\n                                                          0xf7, 0x5, 0xfb, 0x5, 0xb6, 0x9d, 0xfb, 0x1,\n                                                          0xf7, 0x33, 0x5, 0x40, 0x6, 0xe, 0xf8, 0x80,\n                                                          0xc9, 0x1, 0xf7, 0x10, 0xf7, 0xf4, 0x3, 0xf7,\n                                                          0x7f, 0xf8, 0x80, 0x15, 0xd5, 0x6, 0xf7, 0x3b,\n                                                          0xf7, 0x31, 0x67, 0x9f, 0xfb, 0x32, 0xfb, 0x7,\n                                                          0xfb, 0x9, 0xf7, 0x6, 0x62, 0x77, 0x5, 0xe,\n                                                          0xf8, 0x89, 0xb2, 0x1, 0xf7, 0x2b, 0xf7, 0xbd,\n                                                          0x3, 0xf7, 0x2b, 0xf8, 0xf5, 0x15, 0x3c, 0xa1,\n                                                          0xbf, 0x6e, 0xc4, 0x1b, 0xd7, 0xc8, 0xbc, 0xc6,\n                                                          0xa8, 0x1f, 0x60, 0x6, 0x6d, 0x7b, 0x5c, 0x64,\n                                                          0x55, 0x1b, 0x60, 0x64, 0xa5, 0xb6, 0x80, 0x1f,\n                                                          0xe, 0xf8, 0x71, 0xf2, 0x1, 0xf7, 0x8b, 0xf8,\n                                                          0x71, 0x15, 0xde, 0x6, 0xa2, 0xf2, 0x7b, 0xa,\n                                                          0xe, 0xf8, 0x63, 0xbe, 0xca, 0xbd, 0x1, 0xf7,\n                                                          0x6c, 0xbe, 0xcd, 0xbe, 0x3, 0xf7, 0x6c, 0xf8,\n                                                          0xa3, 0x15, 0x67, 0xa6, 0x6f, 0xb4, 0xbf, 0xbb,\n                                                          0xb9, 0xbf, 0xb1, 0x6f, 0xa7, 0x62, 0x57, 0x5c,\n                                                          0x5c, 0x56, 0x1e, 0xbe, 0x96, 0x15, 0xa0, 0x9d,\n                                                          0x9d, 0x9f, 0x9b, 0x97, 0x81, 0x7d, 0x77, 0x79,\n                                                          0x78, 0x76, 0x7b, 0x80, 0x96, 0x98, 0x1e, 0xe,\n                                                          0xfb, 0x28, 0xbf, 0xeb, 0x77, 0x1, 0xf7, 0x79,\n                                                          0xcc, 0x3, 0xf7, 0xc4, 0x16, 0x64, 0x78, 0x67,\n                                                          0x65, 0x61, 0x1a, 0x6f, 0x9d, 0x76, 0xae, 0xa0,\n                                                          0xa1, 0x92, 0x99, 0x9f, 0x1e, 0x9b, 0xc2, 0x5,\n                                                          0x7d, 0x83, 0x73, 0x81, 0x7a, 0x1b, 0x81, 0x83,\n                                                          0x90, 0x96, 0xb2, 0xbd, 0xa5, 0xa5, 0x9a, 0x1f,\n                                                          0xe, 0xf8, 0x7d, 0xbd, 0x9d, 0xbc, 0x1, 0xe6,\n                                                          0xf8, 0x8c, 0x15, 0xbc, 0x80, 0x5, 0x9a, 0x92,\n                                                          0xae, 0xbc, 0xae, 0x1b, 0xa5, 0x9f, 0x78, 0x79,\n                                                          0xa2, 0x1f, 0x7b, 0x9f, 0xa1, 0x7c, 0xa9, 0x1b,\n                                                          0xc9, 0xc5, 0xbb, 0xc3, 0xa9, 0x1f, 0x5a, 0x95,\n                                                          0x5, 0x71, 0x7d, 0x5d, 0x65, 0x67, 0x1b, 0x75,\n                                                          0x7b, 0x99, 0x9b, 0x78, 0x1f, 0x9d, 0x76, 0x73,\n                                                          0x9e, 0x6a, 0x1b, 0x58, 0x58, 0x67, 0x49, 0x68,\n                                                          0x1f, 0xe, 0x65, 0xa, 0xf7, 0xa5, 0xf8, 0x99,\n                                                          0x15, 0xad, 0x77, 0xf7, 0x52, 0xf7, 0x22, 0x55,\n                                                          0xac, 0x5, 0xfb, 0xe8, 0xfb, 0x2f, 0x15, 0xad,\n                                                          0x77, 0xf7, 0x56, 0xf7, 0x22, 0x52, 0xac, 0x5,\n                                                          0xe, 0xf7, 0x7b, 0xc1, 0x1, 0xd0, 0xf7, 0x7b,\n                                                          0x15, 0xf8, 0x57, 0x2a, 0xa, 0xfc, 0x57, 0x6,\n                                                          0xe, 0xf7, 0x7b, 0xc1, 0x1, 0x85, 0xf7, 0x7b,\n                                                          0x15, 0xf8, 0xed, 0x2a, 0xa, 0xfc, 0xed, 0x6,\n                                                          0xe, 0xf7, 0xbb, 0xc9, 0x3, 0xf7, 0xbb, 0xf7,\n                                                          0xdc, 0x15, 0xc9, 0x6, 0x72, 0x64, 0xa, 0x32,\n                                                          0x6, 0xe, 0xf8, 0xc6, 0x77, 0x1, 0xf7, 0x56,\n                                                          0xc9, 0x3, 0xf7, 0x56, 0xf7, 0xdc, 0x15, 0xc9,\n                                                          0x6, 0xf7, 0x2a, 0x64, 0xa, 0x30, 0x6, 0xe,\n                                                          0xef, 0x77, 0x1, 0xf7, 0x56, 0xca, 0x3, 0xf7,\n                                                          0x56, 0xfb, 0x1a, 0x15, 0xca, 0x75, 0xa, 0xf8,\n                                                          0xc6, 0x77, 0x1, 0xf7, 0x68, 0xc9, 0xf4, 0xc7,\n                                                          0x3, 0xf8, 0xf, 0xf7, 0xdc, 0x15, 0xc7, 0x6,\n                                                          0x72, 0x64, 0xa, 0x32, 0x6, 0xfb, 0x5, 0xfb,\n                                                          0x7e, 0x15, 0xc9, 0x6, 0x73, 0x64, 0xa, 0x31,\n                                                          0x6, 0xe, 0xf8, 0xc6, 0x74, 0xa, 0xf7, 0xdc,\n                                                          0x15, 0xc7, 0x6, 0xf7, 0x21, 0x64, 0xa, 0x35,\n                                                          0x6, 0xfb, 0xa9, 0xfb, 0x7e, 0x15, 0xc6, 0x6,\n                                                          0xf7, 0x23, 0x64, 0xa, 0x35, 0x6, 0xe, 0xef,\n                                                          0x74, 0xa, 0xfb, 0x1a, 0x15, 0xc7, 0x6, 0xf7,\n                                                          0x21, 0x64, 0xa, 0x34, 0x6, 0xfb, 0xa8, 0xfb,\n                                                          0x7e, 0x15, 0xc6, 0x6, 0xf7, 0x22, 0x64, 0xa,\n                                                          0x34, 0x6, 0xe, 0xf7, 0xfb, 0xc6, 0xf7, 0x36,\n                                                          0x77, 0x1, 0xf7, 0x40, 0xc6, 0x3, 0xf7, 0x40,\n                                                          0x3d, 0x15, 0xc6, 0x6, 0xe5, 0xf8, 0x4f, 0x5,\n                                                          0xf7, 0x17, 0x6, 0x97, 0xc0, 0x83, 0xa, 0xae,\n                                                          0xf7, 0x36, 0x5, 0x50, 0x6, 0x69, 0xfb, 0x36,\n                                                          0x5, 0xfb, 0x14, 0x6, 0x80, 0x56, 0x5, 0xf7,\n                                                          0x14, 0x6, 0xe, 0xf2, 0xc6, 0xf7, 0x64, 0xc5,\n                                                          0xf7, 0x2c, 0x77, 0x1, 0xec, 0xf2, 0x15, 0xf7,\n                                                          0x18, 0x6, 0x64, 0xfb, 0x49, 0x5, 0xcb, 0x6,\n                                                          0xb2, 0xf7, 0x49, 0x5, 0xf7, 0x18, 0x6, 0x97,\n                                                          0xc6, 0x5, 0xfb, 0x17, 0x6, 0xb6, 0xf7, 0x64,\n                                                          0x5, 0xf7, 0x16, 0x6, 0x97, 0xc5, 0x5, 0xfb,\n                                                          0x16, 0x6, 0xab, 0xf7, 0x2c, 0x5, 0x4b, 0x6,\n                                                          0x6b, 0xfb, 0x2c, 0x83, 0xa, 0x81, 0x51, 0x5,\n                                                          0xf7, 0x17, 0x6, 0x5f, 0xfb, 0x64, 0x83, 0xa,\n                                                          0xe, 0xf7, 0x2b, 0x76, 0xf7, 0x91, 0x77, 0x1,\n                                                          0xf7, 0x3d, 0xf7, 0x7c, 0x15, 0x52, 0xb5, 0x5e,\n                                                          0xc9, 0xd7, 0xdc, 0xd2, 0xd9, 0xc6, 0x5f, 0xb8,\n                                                          0x4c, 0x3c, 0x40, 0x45, 0x3a, 0x1e, 0xe, 0x7c,\n                                                          0xf7, 0x12, 0x1, 0xae, 0xf7, 0x15, 0xd2, 0xf7,\n                                                          0x15, 0xd2, 0xf7, 0x15, 0x14, 0x70, 0xf7, 0x7f,\n                                                          0xb1, 0x15, 0x41, 0xa, 0xfb, 0x5c, 0x16, 0x41,\n                                                          0xa, 0xf8, 0x24, 0x16, 0x41, 0xa, 0xe, 0x7c,\n                                                          0xc2, 0xf7, 0x21, 0xc1, 0xf7, 0x1d, 0xc2, 0xf7,\n                                                          0x21, 0xc1, 0x12, 0xaa, 0xc4, 0xf7, 0x57, 0xc4,\n                                                          0x77, 0xc4, 0xf7, 0x2a, 0xc4, 0x13, 0xfd, 0xd7,\n                                                          0xf8, 0x6e, 0x2e, 0xa, 0xfb, 0x5, 0xfb, 0x94,\n                                                          0x15, 0xf8, 0x6c, 0xf7, 0x38, 0x87, 0xc0, 0xfc,\n                                                          0x6c, 0xfb, 0x3a, 0x5, 0x13, 0xfb, 0xf7, 0xc4,\n                                                          0xfb, 0x51, 0x2e, 0xa, 0xfb, 0xee, 0x84, 0x2e,\n                                                          0xa, 0xe, 0xf8, 0x52, 0x77, 0x1, 0xf7, 0x18,\n                                                          0xe8, 0x3, 0xf7, 0x18, 0xf7, 0x95, 0x15, 0xf7,\n                                                          0x84, 0xfb, 0x4f, 0xa9, 0xba, 0xfb, 0x45, 0xf7,\n                                                          0x1d, 0xf7, 0x87, 0xf7, 0x1c, 0x82, 0xc3, 0x5,\n                                                          0xe, 0xf8, 0x52, 0x77, 0x1, 0xf8, 0x6, 0xed,\n                                                          0x3, 0xf7, 0x21, 0xd1, 0x15, 0xf7, 0xdb, 0xf7,\n                                                          0x4f, 0xfb, 0x84, 0xf7, 0x51, 0x6c, 0x5c, 0xf7,\n                                                          0x41, 0xfb, 0x1a, 0xfb, 0x82, 0xfb, 0x20, 0x5,\n                                                          0xe, 0x67, 0x76, 0xf9, 0x66, 0x77, 0x1, 0x9e,\n                                                          0x6e, 0x15, 0xab, 0x6f, 0xf8, 0xa6, 0xf9, 0x4a,\n                                                          0x6b, 0xa7, 0x5, 0xe, 0x76, 0xc5, 0xf7, 0x28,\n                                                          0xc4, 0xdb, 0xc3, 0xf7, 0x43, 0xc5, 0x1, 0xf7,\n                                                          0x36, 0xc1, 0x3, 0xbb, 0xaa, 0x15, 0x9b, 0x57,\n                                                          0x5, 0xa1, 0xc0, 0xe6, 0x93, 0x9b, 0x1b, 0x9f,\n                                                          0x9d, 0x87, 0x84, 0x9e, 0x1f, 0x83, 0x9e, 0xa0,\n                                                          0x80, 0xa6, 0x53, 0xa, 0x71, 0x79, 0x97, 0x93,\n                                                          0x79, 0x1f, 0x93, 0x7a, 0x7a, 0x8e, 0x73, 0x1b,\n                                                          0x6e, 0x6d, 0x84, 0x80, 0x6e, 0x1f, 0xc8, 0xb0,\n                                                          0x9f, 0xc2, 0x8e, 0xb6, 0x8, 0xf7, 0x48, 0x6,\n                                                          0x99, 0xc4, 0x5, 0xfb, 0x5c, 0x6, 0x8a, 0x96,\n                                                          0x8a, 0xae, 0x8a, 0xad, 0x8, 0xf7, 0x66, 0x6,\n                                                          0x9b, 0xc3, 0x5, 0xfb, 0x77, 0xa9, 0x6, 0x42,\n                                                          0xa, 0x82, 0x8b, 0x7b, 0x8c, 0x78, 0x8, 0x4a,\n                                                          0x6, 0x7d, 0x53, 0x5, 0xdb, 0x6, 0x8c, 0x6a,\n                                                          0x8d, 0x69, 0x8c, 0x7e, 0x8, 0x29, 0x6, 0x7b,\n                                                          0x52, 0x5, 0xf7, 0x8, 0x6, 0x55, 0x63, 0x67,\n                                                          0x3a, 0x4b, 0x1e, 0xe, 0x8b, 0xbf, 0xf7, 0x22,\n                                                          0xbf, 0xc8, 0xbf, 0xf7, 0x2b, 0xbf, 0x1, 0xe0,\n                                                          0xc2, 0xf8, 0x8, 0xbe, 0x3, 0x89, 0xf7, 0x56,\n                                                          0x15, 0xd7, 0x6, 0xfb, 0x7, 0x90, 0xcf, 0x3c,\n                                                          0xf7, 0x1f, 0x1b, 0xd6, 0xda, 0xa7, 0xb5, 0xcd,\n                                                          0x1f, 0x7d, 0xb7, 0x5, 0x67, 0x52, 0x45, 0x71,\n                                                          0x4a, 0x1b, 0x2c, 0x49, 0xb9, 0xeb, 0x81, 0x1f,\n                                                          0xf7, 0x6b, 0x6, 0xa7, 0xbf, 0x5, 0xfb, 0x87,\n                                                          0x6, 0x8e, 0x9f, 0x8e, 0xa2, 0x90, 0x9d, 0x8,\n                                                          0xf7, 0x98, 0x6, 0xa9, 0xbf, 0x5, 0xfb, 0xa4,\n                                                          0x6, 0xe5, 0xb4, 0xdc, 0xc8, 0xe5, 0x1b, 0xcf,\n                                                          0xc8, 0x73, 0x66, 0xa8, 0x1f, 0x7b, 0x3d, 0x5,\n                                                          0xbe, 0x6, 0xb2, 0xf7, 0x53, 0x5, 0x58, 0x6,\n                                                          0x80, 0x59, 0x5, 0xac, 0x63, 0x5b, 0x9c, 0x47,\n                                                          0x1b, 0xfb, 0x12, 0xfb, 0x0, 0x32, 0xfb, 0x6,\n                                                          0x5c, 0x1f, 0x54, 0x6, 0x6d, 0x57, 0x5, 0xce,\n                                                          0x6, 0x86, 0x73, 0x89, 0x76, 0x89, 0x7b, 0x8,\n                                                          0x5a, 0x6, 0xe, 0x7c, 0xc2, 0xf7, 0x49, 0xc1,\n                                                          0xf7, 0x7c, 0xc2, 0x1, 0xf8, 0xac, 0xc6, 0x3,\n                                                          0x90, 0x7c, 0x15, 0xf7, 0x79, 0x36, 0xa, 0x37,\n                                                          0x6, 0xb1, 0xf7, 0x48, 0x5, 0xf7, 0xc, 0x6,\n                                                          0x9d, 0x6e, 0xaa, 0x57, 0xa7, 0x56, 0x40, 0x44,\n                                                          0x18, 0xba, 0x6d, 0xc1, 0xbd, 0x94, 0x79, 0x92,\n                                                          0x7a, 0x91, 0x7c, 0x19, 0xf7, 0x1f, 0x6, 0x96,\n                                                          0xc2, 0x57, 0xa, 0x78, 0xb1, 0xda, 0xd5, 0x5c,\n                                                          0xa9, 0x51, 0x54, 0x77, 0xae, 0x77, 0xac, 0x7a,\n                                                          0xa5, 0x19, 0xea, 0x8e, 0xf7, 0x8, 0xb8, 0xf7,\n                                                          0x37, 0x1a, 0xcd, 0x57, 0xcb, 0x23, 0x1e, 0xfb,\n                                                          0xce, 0x38, 0xa, 0xe1, 0x6, 0x2a, 0xfc, 0x67,\n                                                          0x5, 0x34, 0x6, 0xf7, 0x56, 0xf7, 0x7f, 0x15,\n                                                          0xba, 0xf7, 0x7c, 0x5, 0xf7, 0x2c, 0x6, 0xd9,\n                                                          0xbc, 0x6b, 0x5f, 0xfb, 0x2b, 0xfb, 0x23, 0x86,\n                                                          0x3f, 0x1f, 0xe, 0xf7, 0xb0, 0x76, 0xf7, 0x93,\n                                                          0xb7, 0x1, 0xb6, 0xbe, 0xf7, 0x10, 0xbb, 0xf7,\n                                                          0x60, 0xbd, 0x3, 0xf7, 0x6e, 0xf7, 0x9b, 0x15,\n                                                          0xbb, 0x6, 0xc7, 0xf7, 0xa2, 0x97, 0xfb, 0xa2,\n                                                          0x5, 0xcb, 0x6, 0xf7, 0x14, 0xf7, 0xa1, 0x4f,\n                                                          0xfb, 0xa1, 0x5, 0xbd, 0x6, 0xcd, 0xf7, 0xbf,\n                                                          0x5, 0x30, 0x6, 0xfb, 0x6, 0xfb, 0x87, 0x84,\n                                                          0xf7, 0x87, 0x5, 0x31, 0x6, 0xfb, 0x85, 0xfb,\n                                                          0xbf, 0x15, 0xbe, 0x6, 0xc2, 0xf7, 0x93, 0x5,\n                                                          0xe1, 0x6, 0x95, 0xb7, 0x5, 0xfb, 0x71, 0x6,\n                                                          0x81, 0x5f, 0x5, 0xe0, 0x6, 0xe, 0x73, 0xa,\n                                                          0xf7, 0x11, 0xf7, 0x7, 0x15, 0xa9, 0xba, 0x2f,\n                                                          0xf7, 0x3, 0x5, 0xf8, 0xbd, 0x6, 0x96, 0xbd,\n                                                          0x5, 0xfc, 0xae, 0x6, 0xf7, 0x18, 0xf3, 0x82,\n                                                          0xc3, 0xfb, 0x82, 0xfb, 0x4e, 0x5, 0xe, 0xa0,\n                                                          0x76, 0xf9, 0x3, 0x77, 0x1, 0xf7, 0x88, 0xbd,\n                                                          0x3, 0xf7, 0x38, 0x9c, 0x15, 0xf7, 0x18, 0xf8,\n                                                          0x80, 0xfb, 0x1a, 0x26, 0x58, 0xa2, 0xf7, 0x84,\n                                                          0xf7, 0x49, 0xf7, 0x1e, 0xfb, 0x54, 0x55, 0x7a,\n                                                          0x37, 0xf7, 0xa, 0xfb, 0x1b, 0xfc, 0x8e, 0x5,\n                                                          0xe, 0x73, 0xa, 0x70, 0xf7, 0xa7, 0x15, 0x96,\n                                                          0xbd, 0x5, 0xf8, 0xbf, 0x6, 0x2f, 0xf7, 0x3,\n                                                          0xa9, 0xba, 0xf7, 0x2a, 0xfb, 0x4a, 0xfb, 0x81,\n                                                          0xfb, 0x4e, 0x82, 0xc3, 0xf7, 0x18, 0xf3, 0x5,\n                                                          0xe, 0x9a, 0x76, 0xf8, 0xea, 0x77, 0x1, 0xf7,\n                                                          0x3, 0xf7, 0x4f, 0x15, 0xc0, 0x9c, 0xdd, 0xfb,\n                                                          0x9, 0xf7, 0x1c, 0xf8, 0x8d, 0xbe, 0x88, 0xfb,\n                                                          0x18, 0xfc, 0x7e, 0xf7, 0x1c, 0xef, 0xbf, 0x74,\n                                                          0xfb, 0x86, 0xfb, 0x4a, 0x5, 0xe, 0xf7, 0x1c,\n                                                          0x76, 0xf7, 0x32, 0xbf, 0xf7, 0x32, 0x77, 0x1,\n                                                          0xf7, 0x10, 0xf7, 0x7, 0x15, 0xfb, 0x2c, 0xf7,\n                                                          0x4a, 0xf7, 0x83, 0xf7, 0x4e, 0x94, 0x53, 0xfb,\n                                                          0x18, 0x25, 0x5, 0xf8, 0x58, 0x6, 0x31, 0xf7,\n                                                          0x3, 0xa9, 0xba, 0xf7, 0x28, 0xfb, 0x4a, 0xfb,\n                                                          0x7f, 0xfb, 0x4e, 0x82, 0xc3, 0xf7, 0x16, 0xf2,\n                                                          0xfc, 0x58, 0x8a, 0xe7, 0xfb, 0x3, 0x5, 0xe,\n                                                          0xf7, 0x7c, 0xbe, 0x1, 0xd5, 0xf7, 0x7c, 0x15,\n                                                          0xf8, 0x57, 0xbe, 0xfc, 0x57, 0x6, 0xe, 0x8b,\n                                                          0xc0, 0xf7, 0xc1, 0xc0, 0xf1, 0xf7, 0xc, 0x1,\n                                                          0xf7, 0x0, 0xc1, 0xf7, 0xa7, 0xc1, 0x3, 0xf8,\n                                                          0x96, 0xf8, 0x91, 0x15, 0xd2, 0x6, 0xa2, 0xf7,\n                                                          0xc, 0x5, 0x44, 0x6, 0xfb, 0x6d, 0xfd, 0x9,\n                                                          0x15, 0xf7, 0xa1, 0x80, 0xa, 0xfb, 0x1, 0x6,\n                                                          0xd3, 0xf7, 0xf6, 0x5, 0xfb, 0x1c, 0x68, 0xa,\n                                                          0xdd, 0x6, 0x4d, 0xfb, 0xc1, 0x5, 0x21, 0x6,\n                                                          0xfb, 0xe7, 0x56, 0x15, 0xf7, 0x9e, 0x6, 0x97,\n                                                          0xc0, 0x57, 0xa, 0xc9, 0xf7, 0xc1, 0x5, 0xf6,\n                                                          0x6, 0x96, 0xc0, 0x57, 0xa, 0xa6, 0xed, 0x5,\n                                                          0x9f, 0x90, 0x96, 0xa2, 0xd4, 0x1b, 0xa1, 0xa1,\n                                                          0x87, 0x87, 0x9e, 0x1f, 0xa0, 0xbf, 0x5, 0x8f,\n                                                          0x71, 0x5e, 0x90, 0x78, 0x1b, 0x5a, 0x43, 0x7e,\n                                                          0x38, 0x77, 0x1f, 0x73, 0x29, 0x5, 0x20, 0x68,\n                                                          0xa, 0xf6, 0x6, 0x4e, 0xfb, 0xc1, 0x5, 0x22,\n                                                          0x6, 0xe, 0x8b, 0xc2, 0xf7, 0xcf, 0xc2, 0xf7,\n                                                          0x29, 0xc2, 0x1, 0xf7, 0x2, 0xc1, 0xf7, 0xa8,\n                                                          0xc3, 0x3, 0xf7, 0xd5, 0x16, 0xf7, 0xa2, 0x36,\n                                                          0xa, 0x21, 0x6, 0xf7, 0x4, 0xf8, 0xd2, 0x5,\n                                                          0xfb, 0x27, 0x56, 0xa, 0xe8, 0x6, 0x25, 0xfc,\n                                                          0x9b, 0x57, 0xa, 0xfb, 0xe8, 0x54, 0x15, 0xf7,\n                                                          0xa0, 0x6, 0x97, 0xc2, 0x57, 0xa, 0xc9, 0xf7,\n                                                          0xcf, 0x5, 0xf6, 0x6, 0x96, 0xc2, 0x57, 0xa,\n                                                          0x9c, 0xe0, 0x5, 0xa1, 0x8f, 0x97, 0xb5, 0xde,\n                                                          0x1b, 0xa2, 0xa0, 0x86, 0x86, 0xa0, 0x1f, 0x9f,\n                                                          0xc1, 0x5, 0x90, 0x71, 0x6f, 0x91, 0x6f, 0x1b,\n                                                          0x30, 0x58, 0x5a, 0x45, 0x7e, 0x1f, 0x79, 0x36,\n                                                          0x5, 0xfb, 0x1, 0x67, 0xa, 0xf7, 0x1, 0x6,\n                                                          0x4d, 0xfb, 0xcf, 0x5, 0x20, 0x6, 0xe, 0x79,\n                                                          0x9d, 0xf8, 0x3e, 0x9a, 0xf7, 0xd, 0x9d, 0xa9,\n                                                          0x97, 0x6, 0xfb, 0x31, 0x8b, 0x7, 0x1e, 0xa0,\n                                                          0x39, 0x63, 0xff, 0xc, 0x9, 0xc2, 0xa, 0xc2,\n                                                          0xb, 0xf8, 0xec, 0x14, 0xaa, 0x13, 0x0, 0x6a,\n                                                          0x2, 0x0, 0x1, 0x0, 0x29, 0x0, 0x38, 0x0,\n                                                          0x69, 0x0, 0x6d, 0x0, 0xb9, 0x0, 0xf5, 0x1,\n                                                          0x3b, 0x1, 0x83, 0x1, 0xc3, 0x1, 0xf8, 0x1,\n                                                          0xfd, 0x2, 0xe, 0x2, 0x1a, 0x2, 0x1f, 0x2,\n                                                          0x46, 0x2, 0x53, 0x2, 0x93, 0x2, 0xc4, 0x2,\n                                                          0xce, 0x2, 0xe8, 0x3, 0x19, 0x3, 0x2c, 0x3,\n                                                          0x31, 0x3, 0x3f, 0x3, 0x44, 0x3, 0x4e, 0x3,\n                                                          0x59, 0x3, 0x64, 0x3, 0x69, 0x3, 0x8e, 0x3,\n                                                          0x95, 0x3, 0xb8, 0x3, 0xbf, 0x3, 0xd1, 0x3,\n                                                          0xed, 0x3, 0xf4, 0x3, 0xff, 0x4, 0x4, 0x4,\n                                                          0x9, 0x4, 0xe, 0x4, 0x23, 0x4, 0x2b, 0x4,\n                                                          0x32, 0x4, 0x3c, 0x4, 0x51, 0x4, 0x56, 0x4,\n                                                          0x5e, 0x4, 0x66, 0x4, 0x6e, 0x4, 0x72, 0x4,\n                                                          0x76, 0x4, 0x87, 0x4, 0x91, 0x4, 0x96, 0x4,\n                                                          0x9b, 0x4, 0x9f, 0x4, 0xa3, 0x4, 0xab, 0x4,\n                                                          0xb3, 0x4, 0xba, 0x4, 0xbf, 0x4, 0xc5, 0x4,\n                                                          0xca, 0x4, 0xcf, 0x4, 0xd4, 0x4, 0xd9, 0x4,\n                                                          0xdd, 0x4, 0xe1, 0x4, 0xe5, 0x4, 0xed, 0x4,\n                                                          0xf3, 0x4, 0xf8, 0x4, 0xfd, 0x5, 0x1, 0x5,\n                                                          0x5, 0x5, 0x9, 0x5, 0x15, 0x5, 0x21, 0x5,\n                                                          0x27, 0x5, 0x2d, 0x5, 0x33, 0x5, 0x37, 0x5,\n                                                          0x42, 0x5, 0x4d, 0x5, 0x58, 0x5, 0x60, 0x5,\n                                                          0x65, 0x5, 0x69, 0x5, 0x6e, 0x5, 0x72, 0x5,\n                                                          0x76, 0x5, 0x7a, 0x5, 0x83, 0x5, 0x8c, 0x5,\n                                                          0x95, 0x5, 0x9e, 0x5, 0xa3, 0x5, 0xa8, 0x5,\n                                                          0xad, 0x5, 0xb2, 0x5, 0xb7, 0x5, 0xbb, 0x5,\n                                                          0xbf, 0x5, 0xc3, 0x5, 0xc7, 0x5, 0xcb, 0xf7,\n                                                          0x63, 0x4d, 0xa, 0x33, 0x6, 0xcc, 0xf7, 0xf,\n                                                          0x5, 0xf7, 0xaa, 0x6, 0xa3, 0xfb, 0xf, 0x2c,\n                                                          0xa, 0xf8, 0x93, 0x32, 0xa, 0x7a, 0xa, 0x4f,\n                                                          0x6, 0xf7, 0x6b, 0xf7, 0x45, 0x15, 0xf7, 0x40,\n                                                          0xf7, 0xbb, 0xca, 0xfb, 0xbb, 0x5, 0xb, 0x22,\n                                                          0xa, 0x13, 0xbe, 0x3a, 0xa, 0x13, 0x7e, 0x98,\n                                                          0xce, 0x15, 0x13, 0xbe, 0x2b, 0xa, 0x15, 0xf7,\n                                                          0x1e, 0x3c, 0xa, 0x37, 0x6, 0xbe, 0xf7, 0x9a,\n                                                          0x8c, 0x9b, 0x9a, 0x1a, 0xcb, 0x8a, 0x5e, 0xb2,\n                                                          0x22, 0x1b, 0x46, 0x36, 0x77, 0x72, 0x4b, 0x1f,\n                                                          0x39, 0xa, 0xa8, 0xe1, 0x9c, 0x33, 0x1f, 0x81,\n                                                          0x49, 0x5, 0x92, 0x5f, 0x5a, 0x92, 0x5a, 0x1b,\n                                                          0xfb, 0x51, 0x4c, 0x2c, 0x3f, 0x1f, 0xb, 0x15,\n                                                          0x20, 0xa, 0xe, 0x15, 0xdb, 0x6, 0x5a, 0xfb,\n                                                          0x91, 0x5, 0x88, 0x7e, 0x8c, 0x7f, 0x80, 0x1a,\n                                                          0x45, 0xc3, 0x67, 0xd6, 0xb2, 0xc1, 0x9a, 0xd5,\n                                                          0xe3, 0x1e, 0x13, 0x78, 0x7c, 0x3d, 0x5, 0xf7,\n                                                          0x1a, 0x36, 0xa, 0x3a, 0x6, 0xd3, 0xf8, 0x15,\n                                                          0x55, 0xa, 0x82, 0x53, 0x5, 0xdc, 0x6, 0x5e,\n                                                          0xfb, 0x77, 0x5, 0x13, 0xb8, 0x59, 0x5b, 0x4d,\n                                                          0x4b, 0x4c, 0x1b, 0x4e, 0x6c, 0xa8, 0xbe, 0x8a,\n                                                          0x1f, 0x96, 0x8c, 0x96, 0x8d, 0x98, 0x1e, 0xc0,\n                                                          0xf7, 0xae, 0x5, 0xfb, 0x1a, 0x6, 0xe, 0x15,\n                                                          0xfb, 0x15, 0xd7, 0x26, 0xf7, 0x1a, 0xf7, 0x4d,\n                                                          0xf7, 0x1c, 0xf7, 0x4d, 0xf7, 0x4f, 0xed, 0x5f,\n                                                          0xf7, 0x11, 0xfb, 0x35, 0xfb, 0x60, 0xfb, 0xe,\n                                                          0xfb, 0x5c, 0xfb, 0x39, 0x1e, 0xc2, 0x93, 0x15,\n                                                          0xf7, 0x2, 0xea, 0xf7, 0x55, 0xf7, 0x3c, 0xf7,\n                                                          0x1a, 0xa4, 0x20, 0x3a, 0xfb, 0x13, 0xfb, 0xf,\n                                                          0xfb, 0x40, 0xfb, 0x19, 0xfb, 0x1, 0x52, 0xdf,\n                                                          0xef, 0x1e, 0xe, 0x15, 0xdc, 0x6, 0x55, 0xfb,\n                                                          0xb5, 0x5, 0x85, 0x6b, 0x88, 0x6d, 0x70, 0x1a,\n                                                          0x30, 0xbd, 0x51, 0xf7, 0xc, 0xf7, 0x12, 0xe2,\n                                                          0xc1, 0xf7, 0x30, 0xa7, 0x1e, 0xc7, 0xf7, 0xd1,\n                                                          0x5, 0xd8, 0x3c, 0xa, 0xfb, 0x7b, 0x60, 0xa,\n                                                          0xf1, 0x6, 0x50, 0xfb, 0xca, 0x63, 0xa, 0x76,\n                                                          0x53, 0x54, 0x23, 0x1b, 0x32, 0x65, 0xb4, 0xdc,\n                                                          0x9d, 0x8e, 0x9e, 0x8f, 0xa0, 0x1f, 0xc3, 0xf7,\n                                                          0xb9, 0x5, 0xf4, 0x3c, 0xa, 0xfb, 0x82, 0x6,\n                                                          0xb, 0x15, 0xf8, 0x38, 0x89, 0x5, 0x8f, 0xa1,\n                                                          0x8f, 0xaa, 0xa0, 0x1a, 0xe8, 0x51, 0xe0, 0xfb,\n                                                          0x1c, 0xfb, 0x34, 0xfb, 0x1e, 0xfb, 0x9, 0xfb,\n                                                          0x48, 0x2c, 0xc5, 0x41, 0xf7, 0x2c, 0xe0, 0xe5,\n                                                          0xa8, 0xb0, 0xd5, 0x1e, 0x84, 0xc1, 0x5, 0x5e,\n                                                          0x32, 0x37, 0x77, 0x5a, 0x1b, 0x44, 0x26, 0xa1,\n                                                          0xe3, 0x9b, 0x8b, 0x9c, 0x91, 0x9d, 0x1f, 0x9b,\n                                                          0xc3, 0x15, 0xc6, 0xa0, 0xd0, 0xd9, 0xf7, 0x9,\n                                                          0x1b, 0xf7, 0x22, 0x8f, 0xfb, 0x4, 0x72, 0x1f,\n                                                          0xe, 0xf8, 0x85, 0x6, 0xb1, 0xf7, 0x51, 0x71,\n                                                          0xa, 0x70, 0xfb, 0x1b, 0x5, 0xfb, 0xc5, 0x6,\n                                                          0xb4, 0xf7, 0x5d, 0x5, 0xf7, 0x39, 0x6, 0x7b,\n                                                          0x39, 0x51, 0xa, 0xb8, 0xf7, 0x6f, 0x62, 0xa,\n                                                          0x7a, 0x38, 0x5, 0xfb, 0x38, 0x6, 0xb3, 0xf7,\n                                                          0x5e, 0x81, 0xa, 0x71, 0xfb, 0x1b, 0x5, 0xc4,\n                                                          0x6, 0xb1, 0xf7, 0x51, 0x5, 0xfc, 0x83, 0x45,\n                                                          0xa, 0xdf, 0x6, 0x2f, 0xfc, 0x5d, 0x6b, 0xa,\n                                                          0xb, 0x15, 0x20, 0xd7, 0x43, 0xf7, 0x15, 0xf7,\n                                                          0x38, 0xf7, 0x9, 0xf7, 0x14, 0xf7, 0x2e, 0xdf,\n                                                          0x5b, 0xec, 0xfb, 0x2a, 0xfb, 0x2b, 0xfb, 0x1d,\n                                                          0xfb, 0x9, 0xfb, 0x3b, 0x1e, 0xc9, 0x9a, 0x15,\n                                                          0xf5, 0xe8, 0xf6, 0xf7, 0xe, 0xf7, 0x16, 0x9d,\n                                                          0x34, 0x4f, 0x28, 0x2c, 0x21, 0xfb, 0x9, 0xfb,\n                                                          0x7, 0x67, 0xcc, 0xd5, 0x1e, 0xb, 0x6, 0x96,\n                                                          0xc1, 0x5, 0xb, 0x4e, 0x4b, 0x3e, 0x5c, 0x38,\n                                                          0x1b, 0x57, 0x64, 0xa8, 0xab, 0xed, 0xf7, 0x1d,\n                                                          0x97, 0xc6, 0x40, 0xa, 0x5, 0x2b, 0x2d, 0xa,\n                                                          0xf7, 0x60, 0x2a, 0xa, 0x57, 0x6, 0x21, 0xb,\n                                                          0x6, 0x80, 0x55, 0x5, 0xb, 0x15, 0x52, 0xb2,\n                                                          0x5e, 0xcf, 0xdf, 0xd4, 0xd3, 0xdb, 0xc1, 0x6c,\n                                                          0xb7, 0x3d, 0x38, 0x43, 0x42, 0x40, 0x1e, 0xc4,\n                                                          0x92, 0x15, 0xbc, 0xb3, 0xb1, 0xbe, 0xb3, 0x9e,\n                                                          0x73, 0x6c, 0x61, 0x6a, 0x5f, 0x55, 0x66, 0x71,\n                                                          0x9f, 0xad, 0x1e, 0xb, 0x44, 0xa, 0xf8, 0x5c,\n                                                          0x37, 0xa, 0xfc, 0x5c, 0x5, 0xfb, 0x45, 0x6,\n                                                          0xb, 0xad, 0x71, 0x53, 0xb4, 0x3c, 0x1b, 0xfb,\n                                                          0x33, 0xfb, 0x9, 0xfb, 0x9, 0x22, 0x39, 0xc1,\n                                                          0x3b, 0xf7, 0x21, 0xcc, 0xd6, 0x98, 0xb8, 0xbd,\n                                                          0x1f, 0x78, 0x20, 0x5, 0x34, 0x79, 0x52, 0x6f,\n                                                          0xfb, 0xb, 0x1b, 0x48, 0x4b, 0x9c, 0x96, 0x59,\n                                                          0x1f, 0xcc, 0xf7, 0xc1, 0x15, 0xee, 0xf7, 0x1,\n                                                          0xd0, 0xf0, 0xf7, 0x6, 0xab, 0x4c, 0x4b, 0x2c,\n                                                          0x25, 0x4f, 0x23, 0x31, 0x4f, 0xbd, 0xcb, 0x1e,\n                                                          0xb, 0xf7, 0xc9, 0x2a, 0xa, 0xfb, 0x12, 0x6,\n                                                          0xad, 0xf7, 0x43, 0xf7, 0x7e, 0xf7, 0xae, 0x5,\n                                                          0xce, 0x2a, 0xa, 0xfb, 0x5a, 0x2d, 0xa, 0xd1,\n                                                          0x6, 0xfb, 0x52, 0xfb, 0x78, 0x26, 0xf7, 0x78,\n                                                          0x5, 0xd2, 0x43, 0xa, 0xd1, 0x6, 0xf7, 0x10,\n                                                          0xfb, 0xae, 0x69, 0xfb, 0x43, 0x5, 0xfb, 0x12,\n                                                          0x6, 0xb, 0x5, 0xfb, 0x82, 0x2d, 0xa, 0x86,\n                                                          0xa, 0xfb, 0x9d, 0xb, 0x15, 0x69, 0xa, 0xf7,\n                                                          0x3b, 0x6, 0xc8, 0xf7, 0xdb, 0x5, 0xfb, 0x1b,\n                                                          0x77, 0xa, 0xf7, 0x4f, 0x6, 0x44, 0xfc, 0x12,\n                                                          0x5, 0xf7, 0x3a, 0x56, 0xa, 0xe, 0xf7, 0xb5,\n                                                          0xf7, 0x5e, 0x15, 0xf7, 0x37, 0x6, 0x72, 0xfb,\n                                                          0x18, 0x5, 0x76, 0x46, 0x64, 0x7f, 0x54, 0x1b,\n                                                          0xfb, 0x18, 0x53, 0xd8, 0xeb, 0xf7, 0x74, 0xf7,\n                                                          0x2a, 0xe6, 0xf7, 0x7, 0xd0, 0xc0, 0x68, 0x5b,\n                                                          0xae, 0x1f, 0x7c, 0x3f, 0x51, 0xa, 0xb5, 0xf7,\n                                                          0x6a, 0x52, 0xa, 0x7e, 0x49, 0x5, 0xb, 0x15,\n                                                          0x71, 0xa3, 0x73, 0xb1, 0xb2, 0xb6, 0xa9, 0xb3,\n                                                          0xa8, 0x75, 0xa4, 0x67, 0x60, 0x60, 0x69, 0x63,\n                                                          0x1e, 0xb, 0x6, 0x96, 0xc2, 0x5, 0xb, 0x5,\n                                                          0xf7, 0x41, 0x46, 0xa, 0xfc, 0x2b, 0x38, 0xa,\n                                                          0xf7, 0x42, 0x6, 0x2c, 0xb, 0x6, 0x80, 0x54,\n                                                          0x5, 0xb, 0x8f, 0x55, 0x5, 0x9a, 0xae, 0xe4,\n                                                          0xa6, 0xd0, 0x1b, 0xb, 0x51, 0xb9, 0x54, 0xe7,\n                                                          0xd8, 0xda, 0xb6, 0xc1, 0xcd, 0x1e, 0xb, 0x7c,\n                                                          0xc3, 0x5f, 0xc3, 0xf7, 0x33, 0xc4, 0xf7, 0xf,\n                                                          0xc4, 0xb, 0x6, 0x96, 0xc3, 0x5, 0xb, 0xb4,\n                                                          0x62, 0x4d, 0xa4, 0x46, 0x1b, 0xfb, 0x3f, 0xfb,\n                                                          0x2b, 0xfb, 0x24, 0xfb, 0x7c, 0xfb, 0x8, 0xce,\n                                                          0x21, 0xf7, 0x3d, 0xd4, 0xd9, 0x9f, 0xa5, 0xcf,\n                                                          0x1f, 0xac, 0xf7, 0x42, 0x5, 0xbf, 0x36, 0xa,\n                                                          0xfb, 0xa2, 0x6, 0xb, 0x8b, 0xc1, 0xf8, 0x5a,\n                                                          0xc1, 0x1, 0xb, 0xa2, 0x3c, 0x15, 0x76, 0x59,\n                                                          0x5, 0x80, 0xbd, 0xdc, 0x7a, 0xdd, 0x1b, 0xf7,\n                                                          0x10, 0xe3, 0xbf, 0xf0, 0xa2, 0x1f, 0xd9, 0xf8,\n                                                          0x12, 0x5, 0xc7, 0x6, 0x95, 0xbe, 0x5, 0xfb,\n                                                          0x6, 0x6, 0x7c, 0x4c, 0x5, 0xb, 0xb8, 0xb5,\n                                                          0x85, 0x84, 0xb5, 0x1f, 0xe, 0x70, 0xa0, 0x71,\n                                                          0xae, 0xb0, 0xaf, 0xab, 0xb4, 0xaa, 0x73, 0xa1,\n                                                          0x6c, 0x65, 0x67, 0x68, 0x65, 0x1e, 0xb, 0xf3,\n                                                          0xef, 0xb4, 0xc8, 0xc0, 0xbd, 0x75, 0x59, 0x9b,\n                                                          0x1e, 0xc2, 0x9c, 0x5, 0xc3, 0x79, 0x6d, 0xc4,\n                                                          0xfb, 0x9, 0x1b, 0xfb, 0xc, 0x23, 0x32, 0x27,\n                                                          0x1f, 0x8a, 0xb, 0x2a, 0xa, 0xfb, 0x5f, 0x2d,\n                                                          0xa, 0xb, 0xf8, 0x2f, 0x6, 0x98, 0xc1, 0x5,\n                                                          0xfb, 0x45, 0x6, 0xea, 0xb, 0x6, 0x7f, 0x55,\n                                                          0x5, 0xb, 0x6, 0x97, 0xc2, 0x5, 0xb, 0x6,\n                                                          0x97, 0xc1, 0x5, 0xb, 0x15, 0xd9, 0x6, 0xf7,\n                                                          0x40, 0xf7, 0x33, 0x65, 0x9d, 0xfb, 0x33, 0xfb,\n                                                          0xb, 0xfb, 0x11, 0xf7, 0xc, 0x5f, 0x78, 0x5,\n                                                          0xe, 0x1, 0xc4, 0xc9, 0xf7, 0xff, 0xc8, 0x3,\n                                                          0xb, 0x12, 0xba, 0xc5, 0xf7, 0xee, 0xc4, 0xb,\n                                                          0x3b, 0xa, 0xf7, 0x73, 0x77, 0x4a, 0xa, 0x13,\n                                                          0x7e, 0xb, 0x15, 0xdb, 0x6, 0xf7, 0x46, 0xf7,\n                                                          0x33, 0x65, 0x9f, 0xfb, 0x3d, 0xfb, 0xf, 0xfb,\n                                                          0x12, 0xf7, 0xe, 0x5f, 0x77, 0x5, 0xb, 0x6,\n                                                          0x95, 0xc1, 0x5, 0xb, 0x7c, 0xc1, 0x60, 0xc2,\n                                                          0xf7, 0xdd, 0xc3, 0xb, 0xf7, 0x63, 0xf7, 0x4a,\n                                                          0xf7, 0x60, 0x3, 0xb, 0x1, 0xe7, 0xbf, 0xf7,\n                                                          0xc4, 0xbf, 0x3, 0xb, 0x5, 0xc3, 0x6, 0xb,\n                                                          0x5, 0x54, 0x6, 0xb, 0x1b, 0xb7, 0xb9, 0x9d,\n                                                          0xa7, 0xb1, 0x1f, 0x7d, 0xb8, 0x5, 0x7f, 0x77,\n                                                          0x53, 0x76, 0x67, 0x1b, 0xb, 0x15, 0xda, 0x6,\n                                                          0xa5, 0xf7, 0xa, 0x5, 0x3d, 0x6, 0xb, 0x5,\n                                                          0xfb, 0x1b, 0x6, 0xb, 0x6, 0x7f, 0x54, 0x5,\n                                                          0xb, 0x63, 0xa, 0x6, 0xb, 0xfc, 0x5a, 0x5,\n                                                          0xb, 0x70, 0xa, 0xf7, 0x78, 0x77, 0x50, 0xa,\n                                                          0xb, 0x5d, 0xa, 0xf7, 0x74, 0x77, 0x49, 0xa,\n                                                          0xb, 0x8b, 0x61, 0xa, 0xf7, 0x5e, 0xc1, 0xb,\n                                                          0x6, 0xa4, 0x88, 0xa, 0xb, 0x7c, 0xc2, 0xf7,\n                                                          0xf4, 0xc3, 0xb, 0x6, 0x30, 0x58, 0xa, 0xb,\n                                                          0x6, 0x81, 0x55, 0x5, 0xb, 0x6, 0x80, 0x53,\n                                                          0x5, 0xb, 0xc1, 0xf7, 0x5d, 0xc1, 0xb, 0x5,\n                                                          0x52, 0x6, 0xb, 0x5, 0xfb, 0x0, 0xb, 0xf7,\n                                                          0x7e, 0x5, 0xb, 0xf8, 0x9a, 0x76, 0xf7, 0x43,\n                                                          0x77, 0x1, 0xb, 0x5, 0xfb, 0x21, 0x38, 0xa,\n                                                          0xb, 0x6, 0x81, 0x54, 0x5, 0xb, 0x6, 0x81,\n                                                          0x56, 0x5, 0xb, 0x95, 0xc2, 0x5, 0xb, 0x5,\n                                                          0xc2, 0x6, 0xb, 0x5, 0x39, 0x6, 0xb, 0x15,\n                                                          0x74, 0x97, 0x76, 0xa4, 0xa6, 0xa5, 0xa8, 0xa9,\n                                                          0xa1, 0x7d, 0xb, 0x15, 0x57, 0xb4, 0x5b, 0xcd,\n                                                          0xdf, 0xd1, 0xd3, 0xdd, 0xbd, 0x69, 0xb, 0x6,\n                                                          0xa4, 0xf7, 0x7, 0x5, 0xb, 0x8b, 0xc2, 0xf7,\n                                                          0xdb, 0xc2, 0xb, 0x79, 0xc1, 0xf8, 0x6d, 0xc3,\n                                                          0xb, 0x5, 0x53, 0x6, 0xb, 0x71, 0x5f, 0x6c,\n                                                          0x61, 0x55, 0x68, 0x71, 0xa1, 0xa9, 0x1e, 0xb,\n                                                          0xf7, 0x1c, 0x76, 0xf7, 0x32, 0xbd, 0xf7, 0x34,\n                                                          0x77, 0x1, 0xb, 0x77, 0x1, 0xf7, 0xa, 0xc6,\n                                                          0xf2, 0xc7, 0x3, 0xf7, 0xac, 0xb, 0x6, 0xf7,\n                                                          0x29, 0x64, 0xa, 0x2f, 0x6, 0xe, 0x6, 0x94,\n                                                          0xc1, 0x5, 0xb, 0x6, 0x69, 0xa, 0xb, 0x6,\n                                                          0x96, 0xbe, 0x5, 0xb, 0xf7, 0x24, 0x5, 0xe,\n                                                          0xfc, 0x5d, 0x5, 0xb, 0x5, 0x38, 0x6, 0xb,\n                                                          0xe2, 0xdd, 0x9b, 0x1f, 0xd1, 0xf7, 0xf8, 0x5,\n                                                          0xb, 0x77, 0x1, 0xad, 0xc1, 0xf8, 0x3a, 0xc2,\n                                                          0x3, 0xb, 0x8b, 0xbe, 0xf7, 0x12, 0xc1, 0xf7,\n                                                          0xac, 0xc1, 0xb, 0xf7, 0x1d, 0xc4, 0xf7, 0x71,\n                                                          0x77, 0x1, 0xc1, 0xb, 0x6, 0x96, 0xc0, 0x5,\n                                                          0xb, 0x5, 0xf7, 0xbe, 0x6, 0xb, 0x6, 0x80,\n                                                          0x57, 0x5, 0xb, 0x5, 0xfb, 0x18, 0x6, 0xb,\n                                                          0xf7, 0x78, 0x77, 0x1, 0xb, 0x15, 0xdd, 0x6,\n                                                          0xb, 0xf7, 0x1f, 0x6, 0xb, 0xf8, 0x5a, 0x5,\n                                                          0xb, 0xf7, 0x8, 0x5, 0xb, 0x5, 0x3b, 0x6,\n                                                          0xb\n                                                         };\n"
  },
  {
    "path": "core/src/fxge/fontdata/chromefontdata/FoxitSans.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nconst unsigned char g_FoxitSansFontData [15025] = {0x1,\n                                                   0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0xd,\n                                                   0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x61, 0x6e,\n                                                   0x73, 0x4f, 0x54, 0x46, 0x0, 0x1, 0x1, 0x1,\n                                                   0x24, 0xf8, 0x10, 0x0, 0xf8, 0x1c, 0x1, 0xf8,\n                                                   0x1d, 0x2, 0xf8, 0x1d, 0x3, 0xf8, 0x18, 0x4,\n                                                   0xfb, 0x3a, 0xfb, 0x75, 0xfa, 0x7c, 0xfa, 0x45,\n                                                   0x5, 0xf7, 0x16, 0xf, 0xf8, 0xe1, 0x11, 0xab,\n                                                   0x1c, 0x34, 0xa2, 0x12, 0x0, 0x3, 0x1, 0x1,\n                                                   0x5, 0x2f, 0x3d, 0x45, 0x75, 0x72, 0x6f, 0x20,\n                                                   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                   0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20, 0x53,\n                                                   0x61, 0x6e, 0x73, 0x20, 0x4f, 0x54, 0x46, 0x0,\n                                                   0x0, 0x0, 0x0, 0x22, 0x0, 0x8a, 0x0, 0xab,\n                                                   0x0, 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf,\n                                                   0x0, 0xb0, 0x0, 0x23, 0x0, 0x24, 0x0, 0xb1,\n                                                   0x0, 0x25, 0x0, 0x26, 0x0, 0xb2, 0x0, 0xb3,\n                                                   0x0, 0xb4, 0x0, 0xb5, 0x0, 0x9a, 0x1, 0x87,\n                                                   0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a,\n                                                   0x0, 0xb6, 0x0, 0xb7, 0x0, 0xb8, 0x0, 0xb9,\n                                                   0x0, 0x2b, 0x0, 0x2c, 0x0, 0x2d, 0x0, 0x8c,\n                                                   0x0, 0x2e, 0x0, 0x2f, 0x0, 0xba, 0x0, 0x30,\n                                                   0x0, 0x8e, 0x0, 0xbb, 0x0, 0xbc, 0x0, 0xbd,\n                                                   0x0, 0xbe, 0x0, 0x8d, 0x0, 0xbf, 0x0, 0x31,\n                                                   0x0, 0x32, 0x0, 0x33, 0x0, 0x34, 0x0, 0xc0,\n                                                   0x0, 0x35, 0x0, 0x9d, 0x0, 0x36, 0x0, 0xc1,\n                                                   0x0, 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0x37,\n                                                   0x0, 0x38, 0x0, 0x39, 0x0, 0x3a, 0x0, 0xc5,\n                                                   0x0, 0xc6, 0x0, 0x3b, 0x0, 0xc7, 0x0, 0x42,\n                                                   0x0, 0xc8, 0x0, 0xc9, 0x0, 0x7d, 0x0, 0xca,\n                                                   0x0, 0x90, 0x0, 0xcb, 0x0, 0x7, 0x0, 0xcc,\n                                                   0x0, 0x3f, 0x0, 0x5f, 0x0, 0xb, 0x0, 0x21,\n                                                   0x0, 0xcd, 0x0, 0x43, 0x0, 0x3d, 0x0, 0x5d,\n                                                   0x0, 0x5c, 0x0, 0x5e, 0x0, 0x3c, 0x0, 0x3e,\n                                                   0x0, 0x81, 0x0, 0xa0, 0x0, 0x74, 0x0, 0x44,\n                                                   0x0, 0x88, 0x0, 0xce, 0x0, 0x85, 0x0, 0x61,\n                                                   0x0, 0x7e, 0x0, 0x1b, 0x0, 0xd, 0x0, 0xaa,\n                                                   0x0, 0x67, 0x0, 0x45, 0x0, 0x70, 0x0, 0x71,\n                                                   0x0, 0xa1, 0x0, 0x83, 0x0, 0x9f, 0x0, 0x5,\n                                                   0x0, 0x82, 0x0, 0x91, 0x0, 0x46, 0x0, 0xcf,\n                                                   0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0, 0x19,\n                                                   0x0, 0x79, 0x0, 0x89, 0x0, 0x6f, 0x0, 0x1e,\n                                                   0x0, 0xa7, 0x0, 0x2, 0x0, 0x60, 0x0, 0x47,\n                                                   0x0, 0x6d, 0x0, 0x16, 0x0, 0x6e, 0x0, 0x65,\n                                                   0x0, 0x15, 0x0, 0x63, 0x0, 0x48, 0x0, 0x95,\n                                                   0x0, 0x7c, 0x0, 0x1f, 0x0, 0x6a, 0x0, 0x78,\n                                                   0x0, 0x6b, 0x0, 0x6c, 0x0, 0x49, 0x0, 0x86,\n                                                   0x0, 0xe, 0x0, 0x4a, 0x0, 0xd3, 0x0, 0xd4,\n                                                   0x0, 0xd5, 0x0, 0xd6, 0x0, 0x4b, 0x0, 0x4c,\n                                                   0x0, 0x4d, 0x0, 0x1d, 0x0, 0x97, 0x0, 0x92,\n                                                   0x0, 0x4e, 0x0, 0x80, 0x0, 0xa6, 0x0, 0x98,\n                                                   0x0, 0xa8, 0x0, 0x4f, 0x0, 0x1a, 0x0, 0xd7,\n                                                   0x0, 0x4, 0x0, 0x50, 0x0, 0xd8, 0x0, 0xd9,\n                                                   0x0, 0xda, 0x0, 0x94, 0x0, 0x87, 0x0, 0xdb,\n                                                   0x0, 0x12, 0x0, 0x9b, 0x0, 0x9e, 0x0, 0x96,\n                                                   0x0, 0x8b, 0x0, 0x8f, 0x0, 0x93, 0x0, 0xdc,\n                                                   0x0, 0x51, 0x0, 0x73, 0x0, 0x9, 0x0, 0xa,\n                                                   0x0, 0x6, 0x0, 0xf, 0x0, 0x72, 0x0, 0x7a,\n                                                   0x0, 0xc, 0x0, 0x9c, 0x0, 0x52, 0x0, 0x20,\n                                                   0x0, 0x7b, 0x0, 0x3, 0x0, 0x76, 0x0, 0x69,\n                                                   0x0, 0x77, 0x0, 0x41, 0x0, 0x8, 0x0, 0x75,\n                                                   0x0, 0x68, 0x0, 0x53, 0x0, 0xa5, 0x0, 0x84,\n                                                   0x0, 0x54, 0x0, 0xdd, 0x0, 0x66, 0x0, 0x1c,\n                                                   0x0, 0x18, 0x0, 0x17, 0x0, 0x10, 0x0, 0x1,\n                                                   0x0, 0x62, 0x0, 0x55, 0x0, 0xa2, 0x0, 0x14,\n                                                   0x0, 0xa3, 0x0, 0xa9, 0x0, 0x7f, 0x0, 0x99,\n                                                   0x0, 0x13, 0x0, 0xa4, 0x0, 0x56, 0x0, 0xde,\n                                                   0x0, 0xdf, 0x0, 0xe0, 0x0, 0xe1, 0x0, 0x40,\n                                                   0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a,\n                                                   0x0, 0xe2, 0x0, 0xe3, 0x0, 0x64, 0x0, 0x5b,\n                                                   0x0, 0xe4, 0x0, 0x11, 0x0, 0xe6, 0x2, 0x0,\n                                                   0x1, 0x0, 0x4, 0x0, 0x36, 0x0, 0x75, 0x0,\n                                                   0x8a, 0x0, 0xa2, 0x0, 0xc2, 0x0, 0xd3, 0x1,\n                                                   0x4, 0x1, 0x32, 0x1, 0x92, 0x1, 0xe1, 0x2,\n                                                   0x5b, 0x2, 0x9d, 0x2, 0xc0, 0x2, 0xcd, 0x2,\n                                                   0xd9, 0x2, 0xeb, 0x2, 0xfc, 0x3, 0x47, 0x3,\n                                                   0xc2, 0x3, 0xe1, 0x4, 0x42, 0x4, 0x68, 0x4,\n                                                   0x77, 0x4, 0x87, 0x4, 0xa4, 0x4, 0xbf, 0x4,\n                                                   0xd0, 0x5, 0x1, 0x5, 0x2f, 0x5, 0x44, 0x5,\n                                                   0x71, 0x5, 0xa7, 0x5, 0xcc, 0x6, 0x16, 0x6,\n                                                   0x68, 0x6, 0xd7, 0x6, 0xe8, 0x6, 0xf9, 0x7,\n                                                   0x8, 0x7, 0x21, 0x7, 0xa4, 0x7, 0xdf, 0x8,\n                                                   0x1c, 0x8, 0x98, 0x8, 0xf0, 0x9, 0x58, 0x9,\n                                                   0xc6, 0x9, 0xe1, 0xa, 0x25, 0xa, 0x58, 0xa,\n                                                   0x60, 0xa, 0x67, 0xa, 0x74, 0xa, 0x7b, 0xa,\n                                                   0x96, 0xa, 0xcf, 0xb, 0x3, 0xb, 0x2a, 0xb,\n                                                   0x4e, 0xb, 0x76, 0xb, 0x90, 0xb, 0xb2, 0xc,\n                                                   0x31, 0xc, 0x40, 0xc, 0x4e, 0xc, 0x5c, 0xc,\n                                                   0x6a, 0xd, 0x12, 0xd, 0x37, 0xd, 0xcd, 0xe,\n                                                   0xa, 0xe, 0x2c, 0xe, 0x74, 0xe, 0xc8, 0xf,\n                                                   0x7c, 0xf, 0xb4, 0x10, 0xb, 0x10, 0x21, 0x10,\n                                                   0x37, 0x10, 0x85, 0x10, 0xd3, 0x10, 0xf1, 0x11,\n                                                   0xe, 0x11, 0x32, 0x11, 0x4f, 0x11, 0x70, 0x11,\n                                                   0xba, 0x11, 0xd1, 0x12, 0x42, 0x12, 0x76, 0x12,\n                                                   0xed, 0x13, 0x3, 0x13, 0x1c, 0x13, 0x40, 0x13,\n                                                   0xd1, 0x14, 0x41, 0x14, 0x90, 0x14, 0xb4, 0x14,\n                                                   0xe5, 0x15, 0x1d, 0x15, 0x39, 0x15, 0x62, 0x15,\n                                                   0xe9, 0x15, 0xfd, 0x16, 0xb, 0x16, 0x5c, 0x16,\n                                                   0x6f, 0x16, 0x81, 0x16, 0xcb, 0x16, 0xe6, 0x17,\n                                                   0x5a, 0x17, 0x81, 0x17, 0x91, 0x17, 0x9f, 0x17,\n                                                   0xbb, 0x18, 0x2e, 0x18, 0x56, 0x18, 0x7e, 0x18,\n                                                   0xae, 0x18, 0xc2, 0x19, 0x15, 0x19, 0x25, 0x19,\n                                                   0x87, 0x19, 0xb7, 0x19, 0xcf, 0x1a, 0x40, 0x1a,\n                                                   0xa3, 0x1a, 0xba, 0x1a, 0xd6, 0x1b, 0x8, 0x1b,\n                                                   0x3a, 0x1b, 0x54, 0x1b, 0x6e, 0x1b, 0xa4, 0x1b,\n                                                   0xb8, 0x1b, 0xc9, 0x1b, 0xe0, 0x1b, 0xf1, 0x1c,\n                                                   0xe, 0x1c, 0x29, 0x1c, 0x3a, 0x1c, 0x6b, 0x1c,\n                                                   0x92, 0x1c, 0x9a, 0x1c, 0xb7, 0x1c, 0xcb, 0x1c,\n                                                   0xe9, 0x1d, 0x3b, 0x1d, 0x4c, 0x1d, 0x58, 0x1d,\n                                                   0x9b, 0x1d, 0xd1, 0x1e, 0x1, 0x1e, 0x62, 0x1e,\n                                                   0xd1, 0x1f, 0x38, 0x1f, 0x7d, 0x1f, 0x8f, 0x1f,\n                                                   0xa1, 0x1f, 0xb5, 0x20, 0x40, 0x20, 0x73, 0x20,\n                                                   0x8c, 0x20, 0xb0, 0x21, 0x2d, 0x21, 0x85, 0x21,\n                                                   0xad, 0x22, 0x24, 0x22, 0x66, 0x22, 0xdf, 0x23,\n                                                   0x25, 0x23, 0x6e, 0x23, 0x9e, 0x23, 0xd2, 0x24,\n                                                   0x8, 0x24, 0x9d, 0x24, 0xac, 0x24, 0xc3, 0x25,\n                                                   0x37, 0x25, 0x59, 0x25, 0x89, 0x25, 0xd3, 0x26,\n                                                   0x29, 0x26, 0x7f, 0x26, 0x9a, 0x26, 0xb5, 0x26,\n                                                   0xd1, 0x26, 0xf2, 0x27, 0x16, 0x27, 0x38, 0x27,\n                                                   0x5a, 0x27, 0x77, 0x27, 0xa8, 0x28, 0x45, 0x28,\n                                                   0x7d, 0x28, 0xd4, 0x29, 0x32, 0x29, 0xcd, 0x29,\n                                                   0xf8, 0x2a, 0x24, 0x2a, 0x87, 0x2a, 0x9d, 0x2a,\n                                                   0xa0, 0x2b, 0x31, 0x2b, 0x6b, 0x2b, 0xc2, 0x2c,\n                                                   0x21, 0x2c, 0xba, 0x2d, 0x14, 0x2d, 0x50, 0x2d,\n                                                   0x9d, 0x2d, 0xeb, 0x2e, 0x36, 0x2e, 0x6b, 0x2e,\n                                                   0x7a, 0x2e, 0x88, 0x2e, 0xbc, 0x2e, 0xd8, 0x2e,\n                                                   0xe4, 0x2f, 0x0, 0x2f, 0x33, 0x2f, 0x62, 0x2f,\n                                                   0xa0, 0x2f, 0xb3, 0x2f, 0xcb, 0x30, 0x12, 0x30,\n                                                   0x23, 0x30, 0x3c, 0x30, 0x85, 0xfc, 0x31, 0xe,\n                                                   0x5f, 0xa, 0xf7, 0x70, 0xd6, 0xf8, 0x3b, 0x77,\n                                                   0x1, 0x99, 0x16, 0xea, 0x6, 0xd8, 0xf7, 0x70,\n                                                   0x5, 0xf7, 0xb2, 0x6, 0xdb, 0xfb, 0x70, 0x5,\n                                                   0xf1, 0x6, 0xfb, 0xaa, 0xf9, 0x62, 0x5, 0x28,\n                                                   0x6, 0x49, 0xfc, 0x3b, 0x15, 0xf7, 0x4, 0xf7,\n                                                   0xef, 0x5, 0x8d, 0x6, 0xf7, 0xb, 0xfb, 0xef,\n                                                   0x5, 0xe, 0xf7, 0xc9, 0x8b, 0xdf, 0xf7, 0xf,\n                                                   0xdf, 0xaf, 0xdf, 0xf7, 0x72, 0xe0, 0x1, 0xf8,\n                                                   0x78, 0xea, 0x3, 0x93, 0x16, 0xf2, 0x6, 0xec,\n                                                   0xf7, 0x63, 0x5, 0xf7, 0xa8, 0xfb, 0x63, 0xf8,\n                                                   0x67, 0xdf, 0xfc, 0x8, 0xf7, 0x87, 0xf7, 0xdf,\n                                                   0xdf, 0xfb, 0xdf, 0xf7, 0x72, 0xf8, 0x7, 0xe0,\n                                                   0xfc, 0xea, 0x6, 0x23, 0xfc, 0x3f, 0x15, 0xf7,\n                                                   0x39, 0xf7, 0xea, 0x5, 0xd2, 0xfb, 0xea, 0x6,\n                                                   0xe, 0x46, 0xa, 0xf8, 0x7f, 0xf7, 0x19, 0x1,\n                                                   0x27, 0xa, 0xfb, 0x44, 0xf8, 0x7f, 0x4c, 0xa,\n                                                   0xf7, 0x0, 0xf7, 0x19, 0x59, 0xa, 0x35, 0xa,\n                                                   0xfb, 0x9d, 0xf8, 0x7f, 0x15, 0xef, 0x6, 0xc3,\n                                                   0xda, 0xc0, 0x3c, 0x5, 0xef, 0x6, 0xfb, 0x2,\n                                                   0xf7, 0x19, 0x5, 0x2e, 0x6, 0xe, 0x46, 0xa,\n                                                   0xf8, 0x86, 0xed, 0x1, 0xf7, 0x5a, 0xe5, 0xe6,\n                                                   0xe5, 0x3, 0x27, 0xa, 0xfb, 0x8a, 0xf8, 0x86,\n                                                   0x15, 0xe5, 0xed, 0x31, 0x6, 0xf7, 0x49, 0x29,\n                                                   0x15, 0xe5, 0xed, 0x31, 0x6, 0xe, 0x35, 0xa,\n                                                   0xfb, 0x11, 0xf8, 0x7a, 0x15, 0xd0, 0x6, 0x4c,\n                                                   0xf7, 0x1e, 0x5, 0xfb, 0x1, 0x6, 0xe, 0x46,\n                                                   0xa, 0xf8, 0x65, 0xaf, 0xf2, 0xaf, 0x1, 0xf7,\n                                                   0x85, 0xaf, 0xf3, 0xaf, 0x3, 0x27, 0xa, 0xfb,\n                                                   0x5f, 0xf8, 0xbe, 0x64, 0xa, 0xaf, 0x5a, 0x5a,\n                                                   0x65, 0x67, 0x5a, 0x1e, 0xaf, 0x16, 0xa5, 0xa1,\n                                                   0xa3, 0xa9, 0xa9, 0xa1, 0x75, 0x6f, 0x6e, 0x74,\n                                                   0x73, 0x6e, 0x70, 0x72, 0xa0, 0xab, 0x1e, 0xe,\n                                                   0x46, 0xa, 0xf8, 0x87, 0x75, 0xa, 0x13, 0xe0,\n                                                   0x27, 0xa, 0xfb, 0xa6, 0xf8, 0x87, 0x6b, 0xa,\n                                                   0xa3, 0xa2, 0x80, 0x7f, 0xa1, 0x1f, 0x80, 0xa0,\n                                                   0x9f, 0x7f, 0x53, 0xa, 0x7e, 0x7b, 0x92, 0x93,\n                                                   0x79, 0x1f, 0x13, 0xd0, 0x97, 0x72, 0x70, 0x99,\n                                                   0x6d, 0x1b, 0x13, 0xe0, 0x73, 0xa, 0x73, 0x8b,\n                                                   0xe0, 0xf7, 0x8a, 0xe0, 0xf7, 0x6d, 0xe0, 0x1,\n                                                   0xd5, 0xea, 0xf7, 0xd2, 0xe8, 0x3, 0xd5, 0x16,\n                                                   0xf7, 0x82, 0x6, 0xf7, 0x18, 0xf7, 0x4b, 0xa5,\n                                                   0xf7, 0x4a, 0xc3, 0x67, 0xdf, 0xfb, 0x2, 0xac,\n                                                   0x1f, 0xe8, 0xba, 0x91, 0xce, 0xa5, 0x1a, 0xf7,\n                                                   0x32, 0xfb, 0x26, 0xb2, 0xfb, 0xe, 0x1e, 0xfb,\n                                                   0x82, 0x6, 0xea, 0xfd, 0xd, 0x15, 0xf7, 0x8a,\n                                                   0xf7, 0x23, 0x7, 0xc5, 0xf7, 0x33, 0x8b, 0xfb,\n                                                   0xf, 0xfb, 0x10, 0xfb, 0x3b, 0x8c, 0x59, 0x1f,\n                                                   0xfb, 0x23, 0xf7, 0xdf, 0x15, 0xf7, 0x6d, 0xf7,\n                                                   0x23, 0x7, 0xda, 0xeb, 0x89, 0xfb, 0x2, 0x21,\n                                                   0xfb, 0x4, 0x8c, 0x4c, 0x1f, 0xe, 0xaa, 0x78,\n                                                   0xde, 0xf8, 0xe2, 0xde, 0x1, 0xc3, 0xee, 0x3,\n                                                   0xf8, 0xde, 0xf7, 0x8d, 0x15, 0x32, 0x78, 0x53,\n                                                   0x2b, 0xfb, 0x1d, 0x1b, 0xfb, 0x40, 0x50, 0xf7,\n                                                   0x47, 0xf7, 0xc, 0xf7, 0xa, 0xab, 0xf7, 0x41,\n                                                   0xf7, 0x5b, 0xf7, 0x19, 0xbc, 0x2c, 0x50, 0x9e,\n                                                   0x1f, 0xe9, 0xa1, 0x5, 0xf7, 0x2b, 0x60, 0xfb,\n                                                   0xf, 0xcb, 0xfb, 0x15, 0x1b, 0xfb, 0x45, 0xfb,\n                                                   0x2d, 0xfb, 0x8, 0xfb, 0x96, 0xfb, 0x57, 0xe1,\n                                                   0xfb, 0x4f, 0xf7, 0x88, 0xd9, 0xf7, 0x41, 0xa2,\n                                                   0xf7, 0x70, 0xc3, 0x1f, 0xe, 0xaa, 0xfb, 0x60,\n                                                   0x76, 0xf7, 0x67, 0xda, 0xf8, 0xe1, 0xde, 0x1,\n                                                   0xb7, 0xee, 0xf7, 0x85, 0xe1, 0x3, 0xf7, 0xda,\n                                                   0x7d, 0x15, 0x72, 0x3f, 0x5, 0xbf, 0x8a, 0xaa,\n                                                   0x80, 0x70, 0x1a, 0x65, 0xfb, 0x7, 0x91, 0x78,\n                                                   0x8a, 0x1e, 0x87, 0x4c, 0x5, 0xf7, 0x2d, 0xd2,\n                                                   0x9e, 0xd8, 0xae, 0x75, 0xb0, 0x4e, 0x92, 0x1f,\n                                                   0x91, 0xac, 0x5, 0xf7, 0x1e, 0xf7, 0x0, 0xd8,\n                                                   0xf7, 0x3a, 0xb5, 0x1f, 0x2b, 0xa4, 0x5, 0x2f,\n                                                   0x75, 0x59, 0x2d, 0xfb, 0x1e, 0x1b, 0xfb, 0x42,\n                                                   0x51, 0xf7, 0x2d, 0xf7, 0x21, 0xf7, 0x1a, 0xbc,\n                                                   0xf7, 0x35, 0xf7, 0x52, 0xf7, 0x19, 0xb4, 0x2e,\n                                                   0x50, 0x9d, 0x1f, 0xe9, 0xa1, 0x5, 0xf7, 0x2c,\n                                                   0x60, 0xfb, 0x7, 0xc8, 0xfb, 0x13, 0x1b, 0xfb,\n                                                   0x31, 0xfb, 0x4a, 0x28, 0xfb, 0xab, 0xfb, 0x38,\n                                                   0xd0, 0xfb, 0x65, 0xf7, 0x69, 0x1f, 0xe, 0xaa,\n                                                   0x8b, 0xe0, 0xf8, 0xb8, 0xe0, 0x12, 0xdc, 0xea,\n                                                   0xf8, 0x24, 0xed, 0x17, 0xdc, 0x16, 0xf7, 0x8a,\n                                                   0x6, 0xf7, 0x6e, 0xf7, 0x15, 0xf7, 0x10, 0xf7,\n                                                   0x82, 0x1f, 0x13, 0xe0, 0xf7, 0x9a, 0xfb, 0x24,\n                                                   0xe9, 0xfb, 0x5f, 0x1e, 0xfb, 0x8a, 0x6, 0xea,\n                                                   0xfd, 0xd, 0x15, 0xf8, 0xb8, 0x7, 0x13, 0xd0,\n                                                   0xf7, 0x2b, 0x6, 0xf7, 0x2e, 0xea, 0x21, 0xfb,\n                                                   0x39, 0xfb, 0xac, 0xfb, 0x39, 0x8e, 0x37, 0x1f,\n                                                   0xe, 0x73, 0x8b, 0xe0, 0xf7, 0x86, 0xe0, 0xf7,\n                                                   0x71, 0xe0, 0x6e, 0xa, 0x3, 0xe1, 0x16, 0xf9,\n                                                   0x62, 0xf8, 0x85, 0x36, 0xfc, 0x26, 0xfb, 0x71,\n                                                   0xf8, 0x15, 0x36, 0xfc, 0x15, 0xfb, 0x86, 0xf8,\n                                                   0x26, 0x36, 0x7, 0xe, 0x43, 0xa, 0xc3, 0xf7,\n                                                   0x1d, 0x36, 0xa, 0xf7, 0x54, 0xc3, 0x2f, 0xa,\n                                                   0xe, 0x43, 0xa, 0xf7, 0x55, 0x77, 0x36, 0xa,\n                                                   0xf2, 0xc3, 0x2c, 0xa, 0xe, 0x43, 0xa, 0xcc,\n                                                   0xef, 0x6e, 0xa, 0xa6, 0xe5, 0xe6, 0xe5, 0x30,\n                                                   0xa, 0xf7, 0xe, 0xcc, 0x2e, 0xa, 0xe, 0x43,\n                                                   0xa, 0xc7, 0xf7, 0x19, 0x36, 0xa, 0xf7, 0x8f,\n                                                   0xc7, 0x4c, 0xa, 0x4a, 0xf7, 0x19, 0x59, 0xa,\n                                                   0xaa, 0x8b, 0xe0, 0xf7, 0x7b, 0xe0, 0xf7, 0x7c,\n                                                   0xe0, 0x1, 0xdb, 0xea, 0xf8, 0x25, 0xed, 0x3,\n                                                   0xdb, 0x16, 0xf7, 0x89, 0x6, 0xf7, 0x5a, 0xf7,\n                                                   0x2b, 0xf7, 0xc, 0xf7, 0x86, 0xf7, 0x9a, 0xfb,\n                                                   0x26, 0xe9, 0xfb, 0x5f, 0x1f, 0xfb, 0x89, 0xfb,\n                                                   0xd1, 0x3b, 0x36, 0xdb, 0x6, 0xea, 0xfb, 0x7b,\n                                                   0x15, 0xf7, 0x7b, 0xf7, 0x57, 0xe0, 0xfb, 0x57,\n                                                   0xf7, 0x7c, 0xf7, 0x2a, 0x7, 0xf7, 0x34, 0xe6,\n                                                   0x46, 0xfb, 0x5e, 0xfb, 0xab, 0xfb, 0x3b, 0x8d,\n                                                   0x37, 0x1f, 0xe, 0x73, 0x8b, 0xda, 0xf7, 0x43,\n                                                   0xcb, 0xdf, 0xcb, 0xf7, 0x41, 0xda, 0x1, 0x99,\n                                                   0xf7, 0x93, 0x15, 0xf4, 0x6, 0xfb, 0x40, 0xb7,\n                                                   0xe4, 0x38, 0xf7, 0x6b, 0x1b, 0xc1, 0xc9, 0x94,\n                                                   0x9d, 0xbb, 0x1f, 0xed, 0x7, 0x68, 0x5e, 0x50,\n                                                   0x80, 0x4f, 0x1b, 0xfb, 0x20, 0x31, 0xcb, 0xf7,\n                                                   0x4, 0x73, 0x1f, 0xf7, 0xe4, 0x6, 0x9a, 0xcb,\n                                                   0x5, 0xfb, 0xff, 0x6, 0x8a, 0x99, 0x8b, 0xae,\n                                                   0x8c, 0xac, 0x8, 0xf8, 0xf, 0x6, 0x9a, 0xcb,\n                                                   0x5, 0xfc, 0x15, 0x6, 0xf7, 0x6, 0xa2, 0xf7,\n                                                   0x2, 0xc7, 0xf7, 0x19, 0x1b, 0xc5, 0xbf, 0x7b,\n                                                   0x6c, 0xb8, 0x1f, 0xa2, 0xe2, 0x5, 0xa7, 0x56,\n                                                   0x4b, 0x96, 0x4e, 0x1b, 0xfb, 0x5b, 0xfb, 0x12,\n                                                   0x32, 0xfb, 0x38, 0x66, 0x1f, 0x37, 0x6, 0x7b,\n                                                   0x4b, 0x5, 0xe7, 0x6, 0x8a, 0x77, 0x8c, 0x61,\n                                                   0x8c, 0x77, 0x8, 0x3e, 0x6, 0xe, 0x3b, 0xa0,\n                                                   0x76, 0xf7, 0xd8, 0xe0, 0xf7, 0x74, 0xe0, 0x6e,\n                                                   0xa, 0x3, 0xe1, 0x16, 0xea, 0xf7, 0xd8, 0xf7,\n                                                   0xdb, 0xe0, 0xfb, 0xdb, 0xf7, 0x74, 0xf8, 0x26,\n                                                   0xe0, 0xfc, 0x85, 0x6, 0xe, 0xe2, 0x78, 0xe2,\n                                                   0xf7, 0x66, 0xe2, 0xf7, 0xb5, 0xde, 0x12, 0xbb,\n                                                   0xea, 0xf8, 0x6a, 0xe6, 0x17, 0xf8, 0x29, 0xf7,\n                                                   0xaa, 0x15, 0xf7, 0x64, 0xfb, 0x1c, 0x6, 0x7d,\n                                                   0x7a, 0x39, 0x4f, 0x20, 0x1b, 0x13, 0x30, 0xfb,\n                                                   0x3c, 0x2b, 0xf7, 0xc, 0xf7, 0x3b, 0xd2, 0xa2,\n                                                   0xf7, 0x78, 0xf7, 0x83, 0x1f, 0x13, 0xf8, 0xf7,\n                                                   0x35, 0xa9, 0xfb, 0x5, 0x5d, 0x98, 0x1f, 0xdf,\n                                                   0xa3, 0x5, 0xc0, 0x7e, 0x64, 0xf7, 0x39, 0xfb,\n                                                   0x80, 0x1b, 0xfb, 0xb4, 0x46, 0xfb, 0x82, 0xfb,\n                                                   0x24, 0xfb, 0x7b, 0xf7, 0x24, 0xfb, 0x23, 0xf7,\n                                                   0x6b, 0xf7, 0x2d, 0xf5, 0xdd, 0xaa, 0xb1, 0x1f,\n                                                   0xf7, 0xa3, 0xfb, 0xbf, 0x7, 0xe, 0xaa, 0xa0,\n                                                   0x76, 0xf7, 0xe5, 0xe0, 0xf7, 0xbc, 0x77, 0x1,\n                                                   0xd8, 0xea, 0xf8, 0xf, 0xea, 0x3, 0xd8, 0x16,\n                                                   0xea, 0xf7, 0xe5, 0xf8, 0xf, 0xfb, 0xe5, 0xea,\n                                                   0xf9, 0x62, 0x2c, 0xfb, 0xbc, 0xfc, 0xf, 0xf7,\n                                                   0xbc, 0x2c, 0x6, 0xe, 0xfc, 0x31, 0x39, 0xa,\n                                                   0xe6, 0xec, 0x3, 0xe6, 0x16, 0xec, 0xf9, 0x62,\n                                                   0x2a, 0x6, 0xe, 0x61, 0xa, 0xd2, 0xf9, 0xab,\n                                                   0x4c, 0xa, 0xf7, 0x15, 0xf7, 0x1e, 0x38, 0xa,\n                                                   0x48, 0x51, 0xa, 0x4b, 0xa, 0xf9, 0xac, 0xf7,\n                                                   0x1d, 0x1, 0xe5, 0xea, 0x3, 0x85, 0xf9, 0xac,\n                                                   0x15, 0xef, 0x6, 0xba, 0xde, 0xb8, 0x38, 0x5,\n                                                   0xee, 0x6, 0x26, 0x42, 0xa, 0x8a, 0x51, 0xa,\n                                                   0x4b, 0xa, 0xf9, 0xb5, 0xef, 0x12, 0x98, 0xe5,\n                                                   0x7e, 0xea, 0x82, 0xe5, 0x13, 0xd0, 0xe5, 0x16,\n                                                   0xea, 0xf9, 0x60, 0x2c, 0x6, 0x13, 0xe8, 0x3e,\n                                                   0xe0, 0x58, 0xa, 0x61, 0xa, 0xf7, 0x1e, 0xf9,\n                                                   0xaa, 0x15, 0xd1, 0x6, 0x35, 0xf7, 0x1f, 0x38,\n                                                   0xa, 0xde, 0x51, 0xa, 0xfb, 0x53, 0x78, 0xe0,\n                                                   0xf9, 0x20, 0x77, 0x1, 0x9c, 0xe1, 0xf7, 0x7a,\n                                                   0xea, 0x3, 0x9c, 0xf7, 0x5b, 0x15, 0xfb, 0x4c,\n                                                   0xf7, 0x19, 0x69, 0xd2, 0xf7, 0x49, 0xa5, 0xf7,\n                                                   0x13, 0xf7, 0x3, 0x1e, 0xf8, 0x87, 0x2c, 0xfc,\n                                                   0x87, 0x7, 0x50, 0x86, 0x2d, 0x20, 0x27, 0x7b,\n                                                   0xeb, 0xbc, 0x89, 0x1e, 0xe, 0x73, 0x39, 0xa,\n                                                   0xd7, 0xea, 0x3, 0xd7, 0x16, 0xea, 0xf7, 0x8c,\n                                                   0x6, 0xf7, 0xa, 0xf7, 0x6, 0xf7, 0x8d, 0xfb,\n                                                   0xfe, 0x5, 0xf7, 0x11, 0x6, 0xfb, 0xc8, 0xf8,\n                                                   0x3e, 0xf7, 0xbf, 0xf7, 0xb8, 0x5, 0xfb, 0x14,\n                                                   0x6, 0xfb, 0xf7, 0xfb, 0xf9, 0x5, 0xf7, 0xf9,\n                                                   0x2c, 0x7, 0xe, 0x8b, 0xe0, 0xf9, 0xd, 0x77,\n                                                   0x1, 0xd7, 0xea, 0x3, 0xd7, 0x16, 0xf8, 0x61,\n                                                   0xe0, 0xfc, 0x2, 0xf9, 0xd, 0x2c, 0x6, 0xe,\n                                                   0x8b, 0xe0, 0xf9, 0xd, 0x77, 0x1, 0xd6, 0xea,\n                                                   0x3, 0xd6, 0x16, 0xf8, 0x62, 0xe0, 0xfc, 0x3,\n                                                   0xf7, 0xa4, 0x6, 0xf7, 0x35, 0x5a, 0xa, 0xdd,\n                                                   0x7, 0xfb, 0x35, 0xfb, 0x1e, 0x5, 0xf7, 0xac,\n                                                   0x2c, 0xfb, 0xfc, 0x7, 0x2c, 0x38, 0x5, 0x3a,\n                                                   0x7, 0xea, 0xdd, 0x5, 0xe, 0xf7, 0x22, 0x39,\n                                                   0xa, 0xd4, 0xe5, 0xf8, 0x90, 0xe5, 0x3, 0xd4,\n                                                   0x16, 0xe5, 0xf8, 0xf7, 0x8e, 0x6, 0xf7, 0x64,\n                                                   0xfc, 0xf7, 0x5, 0xe0, 0x6, 0xf7, 0x66, 0xf8,\n                                                   0xed, 0x5, 0x8d, 0xfc, 0xed, 0xe5, 0xf9, 0x62,\n                                                   0xfb, 0x16, 0x6, 0xfb, 0x65, 0xfc, 0xfb, 0x5,\n                                                   0x89, 0x6, 0xfb, 0x5e, 0xf8, 0xfb, 0x5, 0xfb,\n                                                   0x25, 0x6, 0xe, 0xaa, 0x39, 0xa, 0xd7, 0xe5,\n                                                   0xf8, 0x1a, 0xe5, 0x3, 0xd7, 0x16, 0xe5, 0xf8,\n                                                   0xc8, 0x8d, 0x6, 0xf8, 0x11, 0xfc, 0xc8, 0x5,\n                                                   0xec, 0xf9, 0x62, 0x31, 0xfc, 0xc8, 0x89, 0x6,\n                                                   0xfc, 0x11, 0xf8, 0xc8, 0x5, 0x2a, 0x6, 0xe,\n                                                   0xaa, 0xa0, 0x76, 0xf8, 0xd7, 0xf7, 0x2e, 0xf7,\n                                                   0x22, 0xb5, 0x1, 0xd7, 0xe5, 0xf8, 0x1a, 0xe5,\n                                                   0x3, 0xd7, 0x16, 0xe5, 0xf8, 0xc6, 0x8d, 0x6,\n                                                   0xf8, 0x11, 0xfc, 0xc6, 0x5, 0xec, 0xf9, 0x60,\n                                                   0x31, 0xfc, 0xc6, 0x6, 0xfc, 0x13, 0xf8, 0xc6,\n                                                   0x5, 0x2a, 0x6, 0xf7, 0x18, 0xe3, 0x6b, 0xa,\n                                                   0xa1, 0xa1, 0x7f, 0x80, 0xa1, 0x1f, 0x7f, 0xa1,\n                                                   0xa1, 0x80, 0x53, 0xa, 0x87, 0x78, 0x94, 0x95,\n                                                   0x73, 0x1f, 0x96, 0x72, 0x6c, 0x96, 0x71, 0x1b,\n                                                   0x73, 0xa, 0xe2, 0x78, 0xde, 0xf8, 0xe2, 0xde,\n                                                   0x1, 0xc7, 0xef, 0xf8, 0x5f, 0xef, 0x3, 0xb2,\n                                                   0xf7, 0xf8, 0x15, 0xfb, 0x4f, 0xf7, 0xd, 0xfb,\n                                                   0x50, 0xf7, 0x78, 0xf7, 0x57, 0xf7, 0x30, 0xf7,\n                                                   0x1f, 0xf7, 0x80, 0xf7, 0x7f, 0xfb, 0x2c, 0xf7,\n                                                   0x26, 0xfb, 0x5b, 0xfb, 0x4c, 0xfb, 0x39, 0xfb,\n                                                   0xe, 0xfb, 0x97, 0x1e, 0xef, 0x16, 0xf7, 0x18,\n                                                   0xcf, 0xf7, 0x3a, 0xf7, 0x49, 0xf7, 0x10, 0xf7,\n                                                   0x13, 0x32, 0xfb, 0x65, 0xfb, 0x5c, 0xfb, 0xa,\n                                                   0x2f, 0xfb, 0x19, 0xfb, 0x28, 0x26, 0xf7, 0xd,\n                                                   0xf7, 0x3f, 0x1e, 0xe, 0xf7, 0xc9, 0x78, 0xd7,\n                                                   0x4c, 0xe0, 0xf7, 0x8d, 0xe0, 0xf7, 0x79, 0xe0,\n                                                   0x49, 0xd7, 0x12, 0xcd, 0xed, 0xf8, 0x2, 0xe3,\n                                                   0x13, 0x76, 0xf8, 0xa6, 0x85, 0x15, 0xf8, 0x47,\n                                                   0xe0, 0xfb, 0xef, 0xf7, 0x8d, 0xf7, 0xc7, 0xe0,\n                                                   0xfb, 0xc7, 0xf7, 0x79, 0xf7, 0xe0, 0xe0, 0xfc,\n                                                   0x39, 0x2a, 0x89, 0x6, 0x13, 0x8e, 0xe2, 0x59,\n                                                   0x39, 0x9f, 0x43, 0x1b, 0xfb, 0x66, 0x3e, 0xfb,\n                                                   0x48, 0xfb, 0x57, 0xfb, 0x3b, 0xca, 0xfb, 0x6a,\n                                                   0xf7, 0x74, 0xb5, 0xf1, 0x92, 0xf7, 0x1, 0xc8,\n                                                   0x1f, 0x8d, 0x6, 0xfc, 0x20, 0xf7, 0x9d, 0x15,\n                                                   0xf7, 0xf, 0xac, 0xf7, 0x44, 0xf7, 0x30, 0xf7,\n                                                   0x2f, 0xb9, 0xfb, 0x5d, 0x29, 0xfb, 0xe, 0x58,\n                                                   0xfb, 0x4b, 0xfb, 0x2a, 0x25, 0x34, 0xf2, 0xf7,\n                                                   0x5e, 0x1e, 0xe, 0x4f, 0xa, 0xbd, 0xf7, 0x1d,\n                                                   0x45, 0xa, 0xf7, 0xe2, 0xf9, 0xac, 0x2f, 0xa,\n                                                   0xfb, 0xf2, 0x26, 0xa, 0x4f, 0xa, 0xf7, 0x4f,\n                                                   0x77, 0x45, 0xa, 0xf7, 0x7f, 0xf9, 0xac, 0x2c,\n                                                   0xa, 0xfb, 0xb8, 0x26, 0xa, 0x4f, 0xa, 0x45,\n                                                   0xa, 0xbc, 0xf7, 0xf9, 0x21, 0xa, 0xf4, 0xf8,\n                                                   0x50, 0x2e, 0xa, 0xe, 0x4f, 0xa, 0xb9, 0xf7,\n                                                   0x21, 0x45, 0xa, 0xf8, 0x12, 0xf9, 0xa8, 0x15,\n                                                   0xd5, 0x6, 0x49, 0xf7, 0x21, 0x5, 0xfb, 0xa,\n                                                   0x6, 0xfb, 0x73, 0x26, 0xa, 0xe2, 0x87, 0xda,\n                                                   0x42, 0x76, 0xf9, 0x28, 0xda, 0x9c, 0x77, 0x12,\n                                                   0xb8, 0xed, 0xf8, 0x7c, 0xed, 0x13, 0x6c, 0xb2,\n                                                   0xa0, 0x15, 0xbc, 0x63, 0xdc, 0xe5, 0x5, 0x13,\n                                                   0x9c, 0x6c, 0xb6, 0xc4, 0x5f, 0xf7, 0xb, 0x1b,\n                                                   0xf7, 0x48, 0xf7, 0x35, 0xf7, 0x10, 0xf7, 0x80,\n                                                   0xf7, 0x17, 0x60, 0xcd, 0x6a, 0xbb, 0x1f, 0xe2,\n                                                   0xeb, 0x5a, 0xb3, 0x39, 0x30, 0x5, 0x13, 0xac,\n                                                   0xab, 0x60, 0x4e, 0xb5, 0xfb, 0x9, 0x1b, 0xfb,\n                                                   0x65, 0xfb, 0x1a, 0xfb, 0x25, 0xfb, 0x6d, 0xfb,\n                                                   0xf, 0xb2, 0x52, 0xb4, 0x4d, 0x1f, 0xc8, 0xce,\n                                                   0x15, 0x76, 0xb3, 0x75, 0xb3, 0xea, 0x1a, 0xf7,\n                                                   0x75, 0xf7, 0x21, 0xc5, 0xf3, 0xdd, 0xb3, 0x6f,\n                                                   0x6c, 0xb3, 0x1e, 0xfb, 0xd7, 0xfc, 0x53, 0x15,\n                                                   0xf8, 0x0, 0xf8, 0x21, 0x5, 0xa4, 0x5d, 0x9a,\n                                                   0x52, 0x42, 0x1a, 0xfb, 0x48, 0x24, 0x26, 0xfb,\n                                                   0x20, 0x34, 0x5c, 0xb2, 0xa0, 0x70, 0x1e, 0xe,\n                                                   0x4f, 0xa, 0x45, 0xa, 0xf7, 0x76, 0xf9, 0xb8,\n                                                   0x15, 0xcc, 0x6, 0xbb, 0xab, 0x8a, 0x90, 0x9e,\n                                                   0xa2, 0x82, 0x80, 0xa3, 0x1e, 0x7f, 0xa7, 0xa3,\n                                                   0x7d, 0x96, 0x1b, 0xa0, 0xd6, 0x86, 0xf7, 0x9,\n                                                   0x56, 0xa, 0x87, 0x78, 0x94, 0x96, 0x73, 0x1f,\n                                                   0x72, 0x96, 0x6d, 0x96, 0x70, 0x8a, 0x8, 0x5a,\n                                                   0x59, 0x67, 0x3f, 0x1f, 0xfb, 0x45, 0xfc, 0x53,\n                                                   0x21, 0xa, 0xe, 0x5f, 0xa, 0xf7, 0xb6, 0xe0,\n                                                   0xf7, 0x96, 0xe0, 0x6e, 0xa, 0xf7, 0xda, 0xed,\n                                                   0x3, 0xe1, 0x16, 0xea, 0xf7, 0xb6, 0xf7, 0x44,\n                                                   0x6, 0xf7, 0x18, 0xf7, 0x19, 0xbb, 0xf7, 0x3c,\n                                                   0xf7, 0x39, 0xfb, 0x15, 0xba, 0xfb, 0x1c, 0x1f,\n                                                   0xfb, 0xa3, 0x6, 0xea, 0xfb, 0xeb, 0x15, 0xf7,\n                                                   0x96, 0xf7, 0x44, 0x7, 0xeb, 0xd2, 0x71, 0x26,\n                                                   0xfb, 0x12, 0xfb, 0x7, 0x86, 0x57, 0x1f, 0xe,\n                                                   0xe2, 0x68, 0x76, 0xb7, 0xdd, 0xf8, 0xdd, 0xdd,\n                                                   0x1, 0xc3, 0xed, 0xf8, 0x6f, 0xed, 0x3, 0xf8,\n                                                   0xc2, 0xab, 0x15, 0x6c, 0x53, 0x50, 0x7e, 0x4e,\n                                                   0x1b, 0xfb, 0x5c, 0xfb, 0x23, 0xf7, 0x2e, 0xf7,\n                                                   0x70, 0xf7, 0x68, 0xf7, 0x13, 0xf7, 0x37, 0xf7,\n                                                   0x6c, 0xf7, 0x5a, 0xf7, 0x27, 0xfb, 0x27, 0xfb,\n                                                   0x78, 0x37, 0x77, 0xfb, 0x7, 0x33, 0x36, 0x1f,\n                                                   0xb0, 0x70, 0xb3, 0x74, 0xb6, 0x7a, 0x70, 0x48,\n                                                   0x18, 0x58, 0x9e, 0x58, 0xa8, 0x57, 0xb3, 0x8,\n                                                   0xfb, 0x29, 0xf7, 0x3c, 0x15, 0xd7, 0x76, 0xae,\n                                                   0x71, 0xa3, 0x74, 0x8, 0xd3, 0xcb, 0x98, 0xef,\n                                                   0xcf, 0x1a, 0xf7, 0x60, 0xfb, 0xe, 0xe4, 0xfb,\n                                                   0x11, 0x26, 0xfb, 0x24, 0x50, 0xfb, 0x7e, 0xfb,\n                                                   0x6b, 0xf7, 0x13, 0x3e, 0xf7, 0xa, 0xbe, 0xaf,\n                                                   0x99, 0x90, 0x96, 0x1e, 0x6c, 0x9e, 0x6f, 0x99,\n                                                   0x68, 0x93, 0x8, 0xe, 0xaa, 0xa0, 0x76, 0xf7,\n                                                   0xd0, 0xe0, 0xf7, 0x82, 0xda, 0x1, 0xe3, 0xea,\n                                                   0xf7, 0xec, 0xed, 0x3, 0xe3, 0x16, 0xea, 0xf7,\n                                                   0xd0, 0xcb, 0x6, 0xda, 0xb6, 0x84, 0xfb, 0x35,\n                                                   0xf1, 0x1f, 0xe9, 0xfb, 0x28, 0x5, 0xf7, 0xb,\n                                                   0x6, 0xfb, 0xd, 0xf7, 0x43, 0x53, 0xe2, 0x5c,\n                                                   0xb9, 0x67, 0x9c, 0x19, 0x8d, 0x7, 0xf7, 0xe,\n                                                   0x9b, 0xda, 0xcb, 0xf7, 0x7, 0x1a, 0xf7, 0x2c,\n                                                   0xfb, 0x25, 0xb7, 0xfb, 0x15, 0x1e, 0xfb, 0x9b,\n                                                   0x6, 0xea, 0xfb, 0xd1, 0x15, 0xf7, 0x82, 0xf7,\n                                                   0x3c, 0x7, 0xd5, 0xf1, 0x72, 0x2f, 0x24, 0x2a,\n                                                   0x79, 0x3c, 0x1f, 0xe, 0x73, 0x78, 0xe2, 0xf8,\n                                                   0xda, 0xe2, 0x1, 0xd7, 0xe6, 0xf7, 0xf5, 0xe6,\n                                                   0x3, 0xbc, 0xf7, 0x79, 0x15, 0xfb, 0x27, 0x9b,\n                                                   0xd2, 0x26, 0xf7, 0x6b, 0x1b, 0xf7, 0x37, 0xf5,\n                                                   0xe6, 0xf7, 0xd, 0xf7, 0x35, 0xfb, 0x2a, 0xb5,\n                                                   0xfb, 0x17, 0xa8, 0x1f, 0xfb, 0x18, 0xa9, 0x63,\n                                                   0x9c, 0xcb, 0x1a, 0xe6, 0xee, 0xa2, 0xc9, 0xf7,\n                                                   0x29, 0xa4, 0x35, 0x56, 0x90, 0x1e, 0xe7, 0x92,\n                                                   0x5, 0xf7, 0x24, 0x86, 0xfb, 0x3, 0xd6, 0xfb,\n                                                   0x2f, 0x1b, 0xfb, 0x33, 0x2e, 0x33, 0xfb, 0x5,\n                                                   0xfb, 0x26, 0xf7, 0x22, 0x69, 0xe8, 0x74, 0x1f,\n                                                   0xf7, 0x26, 0x68, 0xd3, 0x78, 0x35, 0x1a, 0x3a,\n                                                   0x3c, 0x5f, 0x28, 0x41, 0xfb, 0xe, 0xab, 0xf7,\n                                                   0x1d, 0x7b, 0x1e, 0xe, 0x73, 0x78, 0xe0, 0xf8,\n                                                   0xcc, 0xe0, 0x1, 0xd9, 0xe5, 0xf7, 0xef, 0xe6,\n                                                   0x3, 0xbc, 0xf7, 0x74, 0x15, 0xfb, 0x10, 0xa1,\n                                                   0xcd, 0xfb, 0xb, 0xf7, 0x6a, 0x1b, 0xf7, 0x37,\n                                                   0xf5, 0xe4, 0xf7, 0xb, 0xf7, 0x31, 0xfb, 0x2a,\n                                                   0xb4, 0xfb, 0x17, 0xa8, 0x1f, 0xfb, 0x17, 0xa8,\n                                                   0x63, 0x9c, 0xc9, 0x1a, 0xe4, 0xee, 0xa3, 0xc9,\n                                                   0xf7, 0x28, 0xa4, 0x36, 0x57, 0x90, 0x1e, 0xe6,\n                                                   0x92, 0x5, 0xf7, 0x21, 0x86, 0xfb, 0x2, 0xd5,\n                                                   0xfb, 0x2e, 0x1b, 0xfb, 0x33, 0x2f, 0x34, 0xfb,\n                                                   0x3, 0xfb, 0x23, 0xf7, 0x21, 0x6a, 0xe8, 0x75,\n                                                   0x1f, 0xf7, 0x25, 0x68, 0xd3, 0x79, 0x37, 0x1a,\n                                                   0x3b, 0x3c, 0x60, 0x28, 0x42, 0xfb, 0x6, 0xad,\n                                                   0xf7, 0x18, 0x72, 0x1e, 0xf7, 0x2a, 0xf8, 0xc4,\n                                                   0x37, 0xa, 0x3b, 0xa0, 0x76, 0xf9, 0xd, 0xe0,\n                                                   0x1, 0xf7, 0x95, 0xea, 0x3, 0xf7, 0x95, 0x16,\n                                                   0xea, 0xf9, 0xd, 0xf7, 0x89, 0xe0, 0xfc, 0xdb,\n                                                   0x36, 0xf7, 0x87, 0x6, 0xe, 0x5f, 0xa, 0xf7,\n                                                   0x25, 0xe0, 0xf7, 0x94, 0xe0, 0xf7, 0x27, 0x77,\n                                                   0x6e, 0xa, 0xf7, 0xeb, 0xed, 0x3, 0xe1, 0x16,\n                                                   0xea, 0xf7, 0x25, 0xf7, 0x39, 0x6, 0xf7, 0x18,\n                                                   0xf7, 0x24, 0xb9, 0xf7, 0x3d, 0xf7, 0x35, 0xfb,\n                                                   0x1b, 0xbd, 0xfb, 0x21, 0x1f, 0xfb, 0x39, 0xf7,\n                                                   0x27, 0x2c, 0x6, 0xea, 0xfc, 0x7c, 0x15, 0xf7,\n                                                   0x94, 0xf7, 0x39, 0x7, 0xe5, 0xe3, 0x79, 0xfb,\n                                                   0x0, 0xfb, 0x13, 0xfb, 0x15, 0x88, 0x5a, 0x1f,\n                                                   0xe, 0xaa, 0x78, 0xe0, 0xf9, 0x20, 0x77, 0x41,\n                                                   0xa, 0xf9, 0x62, 0x15, 0xfc, 0x3a, 0x7, 0xfb,\n                                                   0x13, 0x91, 0xfb, 0x50, 0xf7, 0xa3, 0xf7, 0xac,\n                                                   0x93, 0xf7, 0x70, 0xea, 0x1e, 0xf8, 0x3a, 0x2c,\n                                                   0xfc, 0x3a, 0x7, 0xfb, 0x15, 0x7a, 0x26, 0xfb,\n                                                   0x44, 0xfb, 0x48, 0x89, 0xf7, 0x23, 0xe2, 0x1e,\n                                                   0xf8, 0x3a, 0x7, 0xe, 0x2b, 0xa, 0xf7, 0x18,\n                                                   0xda, 0x2f, 0xa, 0xe, 0x2b, 0xa, 0xac, 0xda,\n                                                   0x2c, 0xa, 0xe, 0xaa, 0x78, 0xe0, 0xf9, 0x6e,\n                                                   0xef, 0x2a, 0xa, 0xbf, 0xe3, 0x2e, 0xa, 0xe,\n                                                   0x2b, 0xa, 0xf7, 0x3f, 0xda, 0x5e, 0xa, 0x73,\n                                                   0x39, 0xa, 0xf7, 0xb5, 0x16, 0xe8, 0x6, 0xf7,\n                                                   0x9d, 0xf9, 0x62, 0x5, 0x30, 0x6, 0xfb, 0x71,\n                                                   0xfd, 0x13, 0xfb, 0x6e, 0xf9, 0x13, 0x5, 0x2a,\n                                                   0x6, 0xe, 0xf7, 0x91, 0x39, 0xa, 0xf7, 0x62,\n                                                   0x16, 0xea, 0x6, 0xf7, 0x3c, 0xf9, 0xc, 0x5,\n                                                   0x8c, 0x6, 0xf7, 0x40, 0xfd, 0xc, 0x5, 0xe5,\n                                                   0x6, 0xf7, 0x58, 0xf9, 0x62, 0x5, 0x2d, 0x6,\n                                                   0xfb, 0x27, 0xfc, 0xfe, 0xfb, 0x32, 0xf8, 0xfe,\n                                                   0x5, 0xfb, 0x2, 0x6, 0xfb, 0x3a, 0xfc, 0xfe,\n                                                   0x5, 0x89, 0x6, 0xfb, 0x1f, 0xf8, 0xfe, 0x5,\n                                                   0x2b, 0x6, 0xe, 0x73, 0x39, 0xa, 0x9e, 0x16,\n                                                   0xf7, 0x1, 0x6, 0xf7, 0x61, 0xf7, 0xc4, 0x5,\n                                                   0x8c, 0x6, 0xf7, 0x5e, 0xfb, 0xc4, 0x5, 0xf7,\n                                                   0x4, 0x6, 0xfb, 0x98, 0xf8, 0x10, 0xf7, 0x85,\n                                                   0xf7, 0xe6, 0x5, 0x32, 0x6, 0xfb, 0x5f, 0xfb,\n                                                   0xa5, 0xfb, 0x47, 0xf7, 0xa5, 0x5, 0xfb, 0x0,\n                                                   0x6, 0xf7, 0x7f, 0xfb, 0xec, 0x5, 0xe, 0x73,\n                                                   0x39, 0xa, 0xf7, 0xaf, 0xe8, 0x3, 0xf7, 0xaf,\n                                                   0x16, 0xe8, 0xf7, 0xc3, 0x6, 0xf7, 0xa9, 0xf8,\n                                                   0x33, 0x5, 0x20, 0x6, 0xfb, 0x67, 0xfb, 0xe7,\n                                                   0xfb, 0x65, 0xf7, 0xe7, 0x5, 0xfb, 0x4, 0x6,\n                                                   0xf7, 0xa1, 0xfc, 0x33, 0x5, 0xe, 0x5f, 0xa,\n                                                   0xf9, 0xac, 0xf7, 0x1d, 0x1, 0xf7, 0xad, 0xea,\n                                                   0x3, 0x57, 0xa, 0xfb, 0x65, 0xfb, 0xe2, 0xfb,\n                                                   0x60, 0xf7, 0xe2, 0x5, 0xfb, 0x8, 0x6, 0xf7,\n                                                   0x9f, 0xfc, 0x2e, 0x5, 0x88, 0xf8, 0x7d, 0x2f,\n                                                   0xa, 0xe, 0x5f, 0xa, 0xf9, 0xb5, 0xef, 0x12,\n                                                   0xf7, 0x5a, 0xe5, 0x84, 0xea, 0x8e, 0xe5, 0x13,\n                                                   0xd8, 0x57, 0xa, 0xfb, 0x6a, 0xfb, 0xe2, 0xfb,\n                                                   0x5c, 0xf7, 0xe2, 0x38, 0xa, 0xf7, 0x9f, 0xfc,\n                                                   0x2e, 0x5, 0x13, 0xe8, 0x38, 0xf8, 0x86, 0x2e,\n                                                   0xa, 0xe, 0x3b, 0x8b, 0xe0, 0xf8, 0xb8, 0xe0,\n                                                   0x6a, 0xa, 0xf8, 0x4f, 0xf8, 0xb8, 0x5, 0xe0,\n                                                   0xfc, 0x93, 0x36, 0xf8, 0x22, 0x7, 0xfc, 0x4b,\n                                                   0xfc, 0xb4, 0x5, 0xe, 0x3b, 0x8b, 0xe0, 0xf8,\n                                                   0xb3, 0xe0, 0xf7, 0x6c, 0x77, 0x6a, 0xa, 0xf8,\n                                                   0x51, 0xf8, 0xb3, 0x5, 0xe0, 0xfc, 0x95, 0x36,\n                                                   0xf8, 0x24, 0x7, 0xfc, 0x4d, 0xfc, 0xaf, 0x5,\n                                                   0xf7, 0x82, 0xf9, 0x53, 0x37, 0xa, 0x7c, 0xd0,\n                                                   0xf8, 0x30, 0xd3, 0x1, 0xaf, 0xe9, 0xf7, 0xa0,\n                                                   0xe3, 0x3, 0xbe, 0xf8, 0xd, 0x15, 0xe1, 0x80,\n                                                   0x5, 0xb6, 0x96, 0x9b, 0xc4, 0xf7, 0x2, 0x1b,\n                                                   0xf7, 0x15, 0x88, 0x3a, 0x53, 0x89, 0x1f, 0x59,\n                                                   0x79, 0x2e, 0x81, 0x7e, 0x89, 0x8, 0x52, 0x84,\n                                                   0xfb, 0x29, 0x7a, 0xfb, 0x1e, 0x1a, 0x35, 0xcc,\n                                                   0x49, 0xf7, 0x6, 0xc3, 0xc6, 0x98, 0xca, 0xd5,\n                                                   0x1e, 0x8d, 0x7e, 0x9d, 0x73, 0x99, 0x70, 0x8,\n                                                   0xe7, 0x6, 0x6f, 0xbd, 0x7b, 0x92, 0xf7, 0x19,\n                                                   0x1a, 0xf7, 0x28, 0x7, 0xe5, 0x80, 0xf7, 0x5,\n                                                   0xfb, 0x5d, 0xfb, 0x5c, 0x7e, 0xfb, 0x7, 0x5d,\n                                                   0x81, 0x1e, 0xf7, 0xef, 0xfb, 0x9, 0x15, 0x40,\n                                                   0x87, 0x5f, 0x68, 0x65, 0x1e, 0x5f, 0x62, 0x3d,\n                                                   0x86, 0x72, 0x1b, 0x3c, 0x85, 0xbb, 0xb0, 0xd1,\n                                                   0xc5, 0x95, 0xc1, 0x93, 0x1f, 0xb9, 0x92, 0xd7,\n                                                   0x98, 0xad, 0x98, 0x8, 0xe, 0x40, 0xa, 0xce,\n                                                   0xf7, 0x1d, 0x49, 0xa, 0x3f, 0xa, 0xfb, 0x1f,\n                                                   0xfc, 0xb, 0x20, 0xa, 0x40, 0xa, 0xf7, 0x60,\n                                                   0x77, 0x49, 0xa, 0x3a, 0xa, 0x3a, 0xfc, 0xb,\n                                                   0x20, 0xa, 0x54, 0xa, 0xf7, 0xe, 0xf8, 0xe5,\n                                                   0x4c, 0xa, 0xf7, 0x11, 0xf7, 0x21, 0x59, 0xa,\n                                                   0x40, 0xa, 0xd7, 0xef, 0x49, 0xa, 0x3e, 0xa,\n                                                   0xfb, 0x43, 0xfb, 0xef, 0x20, 0xa, 0xf7, 0x5a,\n                                                   0x7c, 0xd4, 0xf7, 0x47, 0xd3, 0xf7, 0x31, 0xd3,\n                                                   0x1, 0xaf, 0xe9, 0xf7, 0x94, 0xe4, 0x3, 0xbc,\n                                                   0xf8, 0x4, 0x15, 0xe1, 0x81, 0x5, 0xba, 0x95,\n                                                   0xb0, 0xc8, 0xe6, 0x1b, 0xf6, 0x95, 0x50, 0x3b,\n                                                   0x87, 0x1f, 0x64, 0x7f, 0x58, 0x88, 0x50, 0x83,\n                                                   0x8, 0x25, 0x7d, 0x28, 0x3f, 0x3e, 0x1a, 0x63,\n                                                   0xa4, 0xfb, 0x4, 0xf7, 0x2d, 0xed, 0xcc, 0xbd,\n                                                   0xbd, 0xbd, 0x1e, 0x3d, 0xc7, 0xcc, 0x75, 0xce,\n                                                   0x1b, 0xf7, 0x1e, 0xcb, 0xe2, 0xe2, 0xa4, 0x1f,\n                                                   0x30, 0x97, 0x5, 0x65, 0x82, 0x69, 0x40, 0x2e,\n                                                   0x1b, 0x2b, 0x50, 0xdd, 0xec, 0x96, 0x1f, 0xf8,\n                                                   0x8, 0x6, 0xf7, 0x38, 0x51, 0xf7, 0x1d, 0xfb,\n                                                   0x3e, 0x25, 0x5f, 0x5a, 0x76, 0x77, 0x1e, 0xa1,\n                                                   0x7e, 0x6d, 0xbb, 0xfb, 0x1d, 0x1b, 0xfb, 0x4e,\n                                                   0x71, 0xfb, 0xc, 0x59, 0x7f, 0x1f, 0xf7, 0xe7,\n                                                   0xfb, 0x0, 0x15, 0xfb, 0x12, 0xa2, 0x3e, 0x3c,\n                                                   0xfb, 0xc, 0x1b, 0x33, 0x8f, 0xc8, 0xa3, 0xb6,\n                                                   0xd2, 0xb0, 0xaf, 0x91, 0x1f, 0xbf, 0x93, 0xc8,\n                                                   0x94, 0xb1, 0x9c, 0x8, 0xe2, 0xbc, 0x15, 0xd5,\n                                                   0x90, 0xb4, 0xde, 0xed, 0x1b, 0xf7, 0x14, 0x93,\n                                                   0xfb, 0x11, 0x6b, 0x8e, 0x1f, 0xe, 0x40, 0xa,\n                                                   0xcf, 0xf7, 0x1c, 0x12, 0xba, 0xe9, 0xf7, 0x8d,\n                                                   0xe3, 0x13, 0xbc, 0xf7, 0x9a, 0xf8, 0xea, 0x4c,\n                                                   0xa, 0x4a, 0xf7, 0x1c, 0x38, 0xa, 0x86, 0xfc,\n                                                   0xb, 0x24, 0xa, 0x13, 0x7c, 0x25, 0xa, 0x13,\n                                                   0xbc, 0x28, 0xa, 0x73, 0x7c, 0xda, 0xf8, 0xda,\n                                                   0xd3, 0x12, 0xb7, 0xe8, 0x87, 0xe5, 0xf7, 0x38,\n                                                   0xe5, 0x13, 0xe8, 0xf7, 0x69, 0xf8, 0x2b, 0x15,\n                                                   0xfb, 0x12, 0x4e, 0x60, 0x42, 0x3b, 0x1a, 0x2f,\n                                                   0xd4, 0xfb, 0x8, 0xf7, 0x2d, 0xde, 0xcd, 0xab,\n                                                   0xca, 0xc3, 0x1e, 0x99, 0x7c, 0xb7, 0x5f, 0xc0,\n                                                   0x68, 0xc6, 0xce, 0x18, 0x64, 0xa7, 0x62, 0xaf,\n                                                   0x6a, 0xb5, 0xa8, 0xb7, 0x9e, 0xbb, 0x9b, 0xca,\n                                                   0x30, 0x9e, 0x18, 0x88, 0x7f, 0x81, 0x5e, 0x76,\n                                                   0x60, 0xfb, 0x15, 0xf7, 0x38, 0x18, 0xea, 0xbd,\n                                                   0xb3, 0xbe, 0xcd, 0x1a, 0xdd, 0x44, 0xd3, 0x27,\n                                                   0x1e, 0x13, 0xd8, 0x22, 0x47, 0x45, 0x37, 0x5f,\n                                                   0x9d, 0x62, 0xc9, 0x43, 0x1f, 0xb9, 0x52, 0x15,\n                                                   0xf7, 0x35, 0xfb, 0x5c, 0x5, 0x5c, 0x6c, 0x4f,\n                                                   0x64, 0x51, 0x1b, 0x13, 0xe8, 0x2d, 0x63, 0xe1,\n                                                   0xba, 0xcf, 0xc7, 0xba, 0xc9, 0xb1, 0x1f, 0xb1,\n                                                   0xf2, 0x15, 0x13, 0xd8, 0x47, 0xdb, 0x85, 0x97,\n                                                   0x9e, 0x1a, 0xbe, 0xb7, 0xaa, 0xb2, 0xb2, 0xb5,\n                                                   0x70, 0x54, 0x4d, 0x5d, 0x74, 0x5f, 0x71, 0x1e,\n                                                   0xe, 0x40, 0xa, 0xbb, 0xaf, 0xf5, 0xaf, 0x12,\n                                                   0xba, 0xe9, 0xbd, 0xaf, 0xf3, 0xaf, 0xa2, 0xe3,\n                                                   0x13, 0x7f, 0x80, 0xf7, 0x53, 0xf9, 0x2f, 0x64,\n                                                   0xa, 0xb3, 0x5a, 0x5a, 0x65, 0x63, 0x5a, 0x1e,\n                                                   0xaf, 0x8c, 0x15, 0xa6, 0xa0, 0xa4, 0xaa, 0xaa,\n                                                   0xa0, 0x72, 0x6f, 0x6e, 0x74, 0x73, 0x6e, 0x70,\n                                                   0x72, 0xa1, 0xab, 0x1e, 0x3d, 0xfb, 0xc9, 0x22,\n                                                   0xa, 0x13, 0xbf, 0x80, 0x28, 0xa, 0xfb, 0x72,\n                                                   0xf7, 0xb1, 0x76, 0xf8, 0x3c, 0x77, 0x1, 0x7d,\n                                                   0xf7, 0x9c, 0x15, 0xe5, 0x6, 0xf7, 0x32, 0xf7,\n                                                   0xd9, 0xf7, 0x34, 0xfb, 0xd9, 0x5, 0xe4, 0x6,\n                                                   0xfb, 0x69, 0xf8, 0x3c, 0x5, 0x44, 0x6, 0xe,\n                                                   0x20, 0xf7, 0x49, 0xe1, 0x49, 0x76, 0xc6, 0xe1,\n                                                   0x8c, 0x77, 0x12, 0x13, 0x60, 0xc8, 0xf7, 0x48,\n                                                   0x15, 0xa6, 0xa8, 0xae, 0xab, 0xc1, 0x1b, 0xbc,\n                                                   0xaf, 0x7a, 0x7b, 0xb0, 0x1f, 0x13, 0x90, 0x7e,\n                                                   0xa9, 0xa9, 0x7f, 0xb1, 0x1b, 0xc9, 0xae, 0xa5,\n                                                   0xa3, 0xa6, 0x1f, 0xea, 0x7, 0x82, 0x83, 0x59,\n                                                   0x59, 0x51, 0x1b, 0x6e, 0x69, 0x96, 0x97, 0x69,\n                                                   0x1f, 0x13, 0x60, 0x9b, 0x5e, 0x5e, 0x9e, 0x69,\n                                                   0x1b, 0x64, 0x59, 0x7f, 0x63, 0x67, 0x1f, 0xe,\n                                                   0xfb, 0xc2, 0xf8, 0x58, 0x76, 0xf7, 0xb3, 0x77,\n                                                   0x1, 0xf7, 0x16, 0xf8, 0x43, 0x15, 0x9f, 0xa5,\n                                                   0x99, 0xa0, 0xa7, 0xbf, 0xa3, 0x63, 0x98, 0x74,\n                                                   0xa6, 0x67, 0xc4, 0xb3, 0x18, 0x86, 0x8f, 0x54,\n                                                   0xcb, 0x75, 0x9e, 0xaf, 0x8f, 0xbf, 0x97, 0xa9,\n                                                   0x94, 0x75, 0xcd, 0x18, 0x72, 0x83, 0x59, 0x79,\n                                                   0x67, 0x79, 0x8, 0x93, 0xbf, 0x8d, 0xb3, 0xa0,\n                                                   0x1a, 0x48, 0x6, 0x6c, 0x8d, 0x79, 0x93, 0x4a,\n                                                   0x1e, 0x83, 0x84, 0x3d, 0xb7, 0x75, 0x93, 0x75,\n                                                   0x49, 0x18, 0xb3, 0x81, 0xaf, 0x83, 0xb1, 0x84,\n                                                   0x3d, 0x34, 0x18, 0xe, 0xf7, 0xd8, 0x5c, 0xc8,\n                                                   0x4e, 0xf7, 0x4e, 0x82, 0xcc, 0xf7, 0xdb, 0xca,\n                                                   0xf7, 0x1, 0xc7, 0x12, 0xf7, 0x1c, 0xc6, 0xe8,\n                                                   0xd6, 0xf8, 0x5e, 0xc6, 0x13, 0xbf, 0xf8, 0xc3,\n                                                   0xf7, 0x5c, 0x15, 0x71, 0x8e, 0x90, 0x5f, 0xd1,\n                                                   0x1b, 0xf7, 0xc, 0xf7, 0xf, 0xf7, 0x1c, 0xf7,\n                                                   0x38, 0xf7, 0x33, 0xfb, 0xb, 0xf7, 0x39, 0xfb,\n                                                   0x7a, 0xfb, 0xc5, 0x31, 0xfb, 0x99, 0xfb, 0x3a,\n                                                   0xfb, 0x5a, 0xf7, 0x7, 0xfb, 0x44, 0xf7, 0xb8,\n                                                   0x1f, 0x13, 0x5f, 0xf7, 0x97, 0xe3, 0xf7, 0x39,\n                                                   0xa0, 0x95, 0x1f, 0x42, 0x6, 0x13, 0xbf, 0x62,\n                                                   0x6d, 0x3e, 0x37, 0xfb, 0x45, 0x1b, 0xfb, 0x3d,\n                                                   0xfb, 0x47, 0xd0, 0xf7, 0x88, 0xf7, 0x54, 0xf7,\n                                                   0x15, 0xf7, 0x43, 0xf7, 0x63, 0xf7, 0x35, 0xf7,\n                                                   0x15, 0x20, 0xfb, 0x31, 0xfb, 0x24, 0xfb, 0x4,\n                                                   0x34, 0x5f, 0x7f, 0x7a, 0x94, 0x9e, 0x1f, 0xd1,\n                                                   0xf7, 0xed, 0x5, 0x43, 0x6, 0x7d, 0x4a, 0x5,\n                                                   0xd3, 0x60, 0x53, 0x91, 0x74, 0x1b, 0xfb, 0x4,\n                                                   0x29, 0xfb, 0x28, 0xfb, 0x10, 0x22, 0xcb, 0x3e,\n                                                   0xde, 0xc7, 0xb6, 0xb8, 0xa3, 0xa0, 0x1f, 0xfb,\n                                                   0x58, 0xf7, 0x5, 0x15, 0xd4, 0xb3, 0xf7, 0x1c,\n                                                   0xea, 0xbc, 0xba, 0x64, 0x3b, 0xfb, 0x6, 0x32,\n                                                   0x2d, 0x45, 0x63, 0x6b, 0xad, 0xdf, 0x1e, 0xe,\n                                                   0x40, 0xa, 0xda, 0xf7, 0x5, 0x49, 0xa, 0xf7,\n                                                   0x48, 0xf8, 0xf5, 0x15, 0xbb, 0xab, 0x8a, 0x90,\n                                                   0xa7, 0xa0, 0x80, 0x80, 0x9e, 0x1e, 0x7f, 0x9f,\n                                                   0x9d, 0x7f, 0xa2, 0x1b, 0xa0, 0xd6, 0x92, 0xf4,\n                                                   0x56, 0xa, 0x8f, 0x79, 0x94, 0x96, 0x70, 0x1f,\n                                                   0x96, 0x6f, 0x66, 0x96, 0x74, 0x1b, 0x5a, 0x59,\n                                                   0x66, 0x3f, 0x1f, 0xad, 0xfb, 0x8e, 0x20, 0xa,\n                                                   0x7c, 0xd3, 0xf8, 0x25, 0xd3, 0xf7, 0x50, 0x77,\n                                                   0x12, 0xc5, 0xdc, 0x3a, 0xe3, 0xf7, 0xa5, 0xe5,\n                                                   0x13, 0xec, 0xc5, 0x16, 0xdd, 0xcc, 0x8d, 0x6,\n                                                   0x41, 0xbb, 0xd5, 0x85, 0xa1, 0x1b, 0xde, 0xf7,\n                                                   0x28, 0xc3, 0xf7, 0x6f, 0xf7, 0x29, 0x30, 0xf7,\n                                                   0xd, 0xfb, 0x20, 0x35, 0x63, 0x57, 0x79, 0x7f,\n                                                   0x1f, 0x89, 0xf7, 0x96, 0x33, 0x6, 0x13, 0xf4,\n                                                   0xdc, 0xfc, 0x5e, 0x15, 0xf4, 0xc3, 0xe8, 0xe6,\n                                                   0xe6, 0xbd, 0x37, 0xfb, 0x6, 0xfb, 0x22, 0x44,\n                                                   0x4e, 0x45, 0x5a, 0x5e, 0xaa, 0xb3, 0x70, 0x1e,\n                                                   0x7f, 0x9d, 0x7d, 0xa5, 0xe3, 0x1a, 0xe, 0xfc,\n                                                   0x31, 0x8d, 0x76, 0xf9, 0x88, 0x77, 0x1, 0xf7,\n                                                   0x74, 0x78, 0x15, 0xd2, 0x6, 0xfb, 0x85, 0xf9,\n                                                   0x88, 0x5, 0x44, 0x6, 0xe, 0xfc, 0x43, 0xfb,\n                                                   0x50, 0x76, 0xfa, 0x46, 0x77, 0x1, 0xe9, 0xd4,\n                                                   0x3, 0xe9, 0xfb, 0x65, 0x15, 0xd4, 0xfa, 0x46,\n                                                   0x42, 0x6, 0xe, 0xfb, 0xf9, 0xfb, 0x58, 0xd5,\n                                                   0xf7, 0xee, 0xda, 0xf7, 0xed, 0xd5, 0x1, 0xf7,\n                                                   0x18, 0xd3, 0x3, 0xb5, 0xf7, 0x74, 0x15, 0xe4,\n                                                   0x89, 0x8b, 0x33, 0x8c, 0x2d, 0x8, 0xfb, 0x4c,\n                                                   0x8a, 0x9e, 0x57, 0xf7, 0x22, 0x1b, 0xd5, 0x7,\n                                                   0x33, 0x8d, 0x93, 0xf7, 0x2e, 0xf7, 0x6, 0x7a,\n                                                   0xd5, 0x40, 0xae, 0x1f, 0xe5, 0xbb, 0x8d, 0x8b,\n                                                   0xf7, 0x44, 0x1a, 0xe2, 0x89, 0xd5, 0xe3, 0x1e,\n                                                   0xd5, 0x7, 0xfb, 0x22, 0x79, 0x31, 0xfb, 0x25,\n                                                   0x1f, 0x8a, 0x2c, 0x8b, 0x34, 0x32, 0x89, 0x8,\n                                                   0xe, 0xfb, 0xf9, 0xfb, 0x58, 0xd5, 0xf7, 0xed,\n                                                   0xda, 0xf7, 0xee, 0xd5, 0x1, 0xf7, 0x15, 0xd3,\n                                                   0x3, 0xb5, 0xfb, 0xe, 0x15, 0x41, 0x7, 0xde,\n                                                   0xd7, 0x99, 0xf7, 0x33, 0x1f, 0x8c, 0xeb, 0x8d,\n                                                   0xf7, 0x28, 0xe3, 0x8d, 0x8, 0xda, 0x7, 0x33,\n                                                   0x8d, 0x88, 0xdb, 0xea, 0x1a, 0xf7, 0x29, 0x86,\n                                                   0xe9, 0xfb, 0x2e, 0x1e, 0x41, 0x7, 0xe2, 0x8b,\n                                                   0x73, 0xfb, 0x25, 0xfb, 0x7, 0x9a, 0x49, 0xd6,\n                                                   0x68, 0x1f, 0x31, 0x5b, 0x8b, 0x4d, 0xfb, 0x44,\n                                                   0x1a, 0x34, 0x79, 0x7f, 0x46, 0x1e, 0xe, 0x69,\n                                                   0xa, 0xca, 0xe3, 0x33, 0xf7, 0x4f, 0x13, 0xe0,\n                                                   0xf7, 0x2b, 0xfb, 0xf, 0x15, 0xf9, 0x98, 0x7,\n                                                   0x13, 0xd0, 0xee, 0xd4, 0xfb, 0x4f, 0xfe, 0x2a,\n                                                   0xf7, 0x4f, 0xd4, 0x6, 0xe, 0x69, 0xa, 0xa7,\n                                                   0xf7, 0x4f, 0x33, 0xe3, 0x13, 0xe0, 0xa7, 0xfb,\n                                                   0xf, 0x15, 0x42, 0xf7, 0x4f, 0xfa, 0x2a, 0xfb,\n                                                   0x4f, 0x42, 0x7, 0x13, 0xd0, 0xee, 0xfd, 0x98,\n                                                   0x6, 0xe, 0xfb, 0xfa, 0xf8, 0xe7, 0xcc, 0xd2,\n                                                   0x77, 0x1, 0x98, 0xf9, 0x6f, 0x15, 0x2c, 0xe3,\n                                                   0x62, 0xcd, 0xce, 0xe2, 0xb6, 0xe8, 0x1e, 0x4b,\n                                                   0x6, 0x6a, 0x84, 0x7e, 0x65, 0x45, 0x1b, 0x43,\n                                                   0x7d, 0xbf, 0x9e, 0x87, 0x1f, 0xe, 0xfc, 0x43,\n                                                   0x8d, 0x76, 0xf9, 0x88, 0x77, 0x1, 0xe9, 0xd4,\n                                                   0x3, 0xe9, 0xf8, 0x3f, 0x15, 0xd4, 0xf7, 0xca,\n                                                   0x42, 0x6, 0xfd, 0x88, 0x4, 0xd4, 0xf7, 0xc9,\n                                                   0x42, 0x6, 0xe, 0xfb, 0xe9, 0xf7, 0x5e, 0xf7,\n                                                   0xcf, 0x1, 0x9d, 0xf7, 0xcf, 0x3, 0x9d, 0xf7,\n                                                   0xfb, 0x15, 0x33, 0xd2, 0x46, 0xe1, 0xe1, 0xd3,\n                                                   0xd0, 0xe3, 0xe4, 0x43, 0xd0, 0x35, 0x35, 0x44,\n                                                   0x46, 0x32, 0x1e, 0xe, 0xfb, 0x53, 0x7c, 0xd3,\n                                                   0xf8, 0x29, 0xd7, 0x1, 0xbb, 0xe5, 0xf7, 0x9b,\n                                                   0xe0, 0x3, 0xf8, 0x24, 0xf7, 0x52, 0x15, 0x71,\n                                                   0x88, 0x7a, 0x20, 0xfb, 0x4, 0x1b, 0xfb, 0xf,\n                                                   0x7c, 0xf7, 0x18, 0xd0, 0xc8, 0x93, 0xf7, 0x23,\n                                                   0xf7, 0x1d, 0xc1, 0xc1, 0x6f, 0x40, 0x9d, 0x1f,\n                                                   0xe0, 0x98, 0x5, 0xf4, 0xfb, 0x8, 0xc8, 0x2c,\n                                                   0x24, 0xfb, 0x18, 0x4b, 0xfb, 0x6c, 0xfb, 0x1e,\n                                                   0xc4, 0xfb, 0x1b, 0xf7, 0x3f, 0xb7, 0xf7, 0x27,\n                                                   0x9e, 0xf7, 0x43, 0xa7, 0x1e, 0xe, 0x54, 0xa,\n                                                   0xf7, 0xc, 0xf8, 0xe5, 0x15, 0xeb, 0x6, 0xeb,\n                                                   0xf7, 0x21, 0x5, 0x31, 0x6, 0x57, 0x34, 0x50,\n                                                   0xe2, 0x5, 0x31, 0x6, 0xe, 0xfb, 0x53, 0xfb,\n                                                   0x60, 0x76, 0xf7, 0x5b, 0xd6, 0xf8, 0x32, 0xd6,\n                                                   0x1, 0xa9, 0xe4, 0x3, 0xf7, 0x67, 0x76, 0x15,\n                                                   0x7b, 0x3d, 0x5, 0x9b, 0xc0, 0x86, 0x69, 0x8d,\n                                                   0x1f, 0x78, 0x8c, 0x48, 0x84, 0x60, 0x1b, 0x89,\n                                                   0x4e, 0x5, 0xf7, 0x13, 0xcb, 0xb2, 0xbb, 0xc2,\n                                                   0x5d, 0xa0, 0x6a, 0x1f, 0x91, 0xaf, 0xda, 0x91,\n                                                   0xf1, 0xb6, 0xa2, 0xf7, 0x2a, 0x19, 0x36, 0x96,\n                                                   0x5, 0x71, 0x87, 0x7a, 0xfb, 0x1, 0xfb, 0x2,\n                                                   0x1b, 0xfb, 0x23, 0x8c, 0xf7, 0x3d, 0xad, 0xd9,\n                                                   0x9c, 0xf7, 0x19, 0xf7, 0x13, 0xc2, 0xba, 0x6d,\n                                                   0x3c, 0x9c, 0x1f, 0xe0, 0x9a, 0x5, 0xf7, 0x7,\n                                                   0x7c, 0x3a, 0xc1, 0xfb, 0x0, 0x1b, 0xfb, 0x43,\n                                                   0x51, 0xfb, 0x21, 0xfb, 0x25, 0xfb, 0x2c, 0xd0,\n                                                   0x27, 0xf7, 0x4, 0x76, 0x1f, 0xe, 0xfb, 0xfa,\n                                                   0xfb, 0x60, 0x76, 0xf7, 0x75, 0x77, 0x1, 0xeb,\n                                                   0xf2, 0x3, 0xf7, 0x1a, 0x16, 0x6a, 0x2c, 0x5,\n                                                   0xa5, 0xbe, 0x85, 0x6b, 0x58, 0x2c, 0x9a, 0x6a,\n                                                   0x91, 0x1f, 0x86, 0x52, 0x5, 0x87, 0xa1, 0x92,\n                                                   0x8a, 0xa1, 0x1b, 0xf7, 0x5, 0xbd, 0xb8, 0xba,\n                                                   0xb6, 0x64, 0xa3, 0x5f, 0x90, 0x1f, 0xa2, 0xc8,\n                                                   0x5, 0xe, 0x2d, 0x76, 0xf1, 0xd2, 0xf8, 0x25,\n                                                   0xd3, 0xe7, 0x77, 0x1, 0xbe, 0xe5, 0x3, 0xf7,\n                                                   0x4a, 0x95, 0x15, 0x69, 0xfb, 0x1, 0xc2, 0x7b,\n                                                   0xae, 0xf7, 0x0, 0x5, 0x88, 0x98, 0x98, 0x88,\n                                                   0xa2, 0x1b, 0xcd, 0xf7, 0x18, 0xad, 0xf7, 0x33,\n                                                   0xa7, 0x1f, 0x37, 0x95, 0x5, 0x2f, 0x7e, 0x45,\n                                                   0x63, 0x50, 0x1b, 0x7d, 0x84, 0x8d, 0x8d, 0x82,\n                                                   0x1f, 0xf7, 0x1, 0xf8, 0xa, 0xad, 0x6f, 0x93,\n                                                   0x68, 0x8f, 0x77, 0x19, 0xe1, 0x98, 0x84, 0xac,\n                                                   0x7d, 0xd4, 0x32, 0xb2, 0x19, 0xa5, 0xeb, 0x56,\n                                                   0x9b, 0x6f, 0x2b, 0x5, 0x8f, 0x6c, 0x7f, 0x8b,\n                                                   0x85, 0x1b, 0x52, 0xfb, 0x44, 0x6f, 0xfb, 0x8b,\n                                                   0xfb, 0x12, 0xc3, 0x37, 0xd6, 0x67, 0x1f, 0xa2,\n                                                   0xd7, 0x15, 0x56, 0xac, 0x80, 0xea, 0xb5, 0x1a,\n                                                   0xd5, 0xa1, 0xf7, 0x22, 0xf7, 0x2b, 0x7e, 0x1e,\n                                                   0xe, 0x54, 0xa, 0xa0, 0xf8, 0xe5, 0x15, 0xe9,\n                                                   0x6, 0xc1, 0xe2, 0xbc, 0x34, 0x5, 0xe9, 0x6,\n                                                   0x24, 0xf7, 0x21, 0x5, 0x34, 0x6, 0xe, 0xfc,\n                                                   0x31, 0x8b, 0xee, 0xf7, 0xd2, 0xee, 0x1, 0xe2,\n                                                   0xf3, 0x3, 0xe2, 0x16, 0xf3, 0xee, 0x23, 0x6,\n                                                   0xf7, 0xd2, 0x4, 0xf3, 0xee, 0x23, 0x6, 0xe,\n                                                   0xfc, 0x31, 0xfb, 0x12, 0x76, 0xf7, 0x91, 0x77,\n                                                   0x1, 0xe3, 0xf1, 0x3, 0xe3, 0x8d, 0x15, 0xbe,\n                                                   0x6, 0x61, 0x85, 0x5a, 0x5d, 0x76, 0x1e, 0xa2,\n                                                   0x66, 0x5, 0xce, 0xa1, 0x98, 0xe8, 0xad, 0x1a,\n                                                   0xf3, 0x25, 0x7, 0xe, 0xb9, 0x78, 0xca, 0xed,\n                                                   0xc7, 0xf7, 0xce, 0xc3, 0xf1, 0xca, 0x1, 0x7d,\n                                                   0xcb, 0xf7, 0xa, 0xd1, 0xf8, 0x57, 0xca, 0x3,\n                                                   0xf8, 0x80, 0xf7, 0xbe, 0x15, 0x35, 0x75, 0x3e,\n                                                   0x81, 0x70, 0x1b, 0x46, 0x50, 0xbb, 0xf5, 0xd7,\n                                                   0xa9, 0xdf, 0xed, 0x9c, 0xd4, 0x8a, 0x40, 0xa9,\n                                                   0x1f, 0xc8, 0x99, 0x5, 0xdd, 0x72, 0x3e, 0xaf,\n                                                   0x3c, 0x1b, 0xfb, 0x14, 0x45, 0x37, 0xfb, 0x18,\n                                                   0xfb, 0x1c, 0xdc, 0x3d, 0xf7, 0x9, 0xdb, 0xe0,\n                                                   0xb6, 0xea, 0xa2, 0x1f, 0xfc, 0xcc, 0xd7, 0x15,\n                                                   0xfb, 0x65, 0xf7, 0x3c, 0xfb, 0x3a, 0xf7, 0x68,\n                                                   0xf7, 0x68, 0xf7, 0x42, 0xf7, 0x3b, 0xf7, 0x64,\n                                                   0xf7, 0x67, 0xfb, 0x44, 0xf7, 0x3e, 0xfb, 0x66,\n                                                   0xfb, 0x66, 0xfb, 0x3e, 0xfb, 0x3d, 0xfb, 0x68,\n                                                   0x1e, 0xcb, 0x16, 0xf7, 0x44, 0xf7, 0x1f, 0xf7,\n                                                   0x22, 0xf7, 0x45, 0xf7, 0x45, 0xf7, 0x26, 0xfb,\n                                                   0x22, 0xfb, 0x44, 0xfb, 0x42, 0xfb, 0x26, 0xfb,\n                                                   0x1e, 0xfb, 0x45, 0xfb, 0x45, 0xfb, 0x1f, 0xf7,\n                                                   0x1e, 0xf7, 0x42, 0x1e, 0xe, 0xf7, 0xc, 0x76,\n                                                   0xae, 0xdf, 0xf7, 0x9e, 0xdf, 0xae, 0x77, 0x1,\n                                                   0xe1, 0xee, 0x15, 0xd2, 0xd2, 0x5, 0x71, 0xb2,\n                                                   0xb6, 0x81, 0xb2, 0x1b, 0xb1, 0xb7, 0x95, 0xa5,\n                                                   0xb2, 0x1f, 0xd2, 0x44, 0xc5, 0xc8, 0x44, 0xd0,\n                                                   0x5, 0xaa, 0xbd, 0x91, 0xb9, 0xa5, 0x1a, 0xa6,\n                                                   0x85, 0xb8, 0x6c, 0xbc, 0x1e, 0xd2, 0xd1, 0x51,\n                                                   0xc8, 0x44, 0x44, 0x5, 0xa5, 0x64, 0x5f, 0x95,\n                                                   0x65, 0x1b, 0x64, 0x60, 0x81, 0x71, 0x64, 0x1f,\n                                                   0x44, 0xd2, 0x51, 0x4e, 0xd2, 0x45, 0x5, 0x6c,\n                                                   0x5a, 0x85, 0x5e, 0x70, 0x1a, 0x71, 0x91, 0x5d,\n                                                   0xaa, 0x59, 0x1e, 0x44, 0x46, 0x5, 0xf7, 0xa,\n                                                   0xf7, 0x53, 0x15, 0xd4, 0xc5, 0xc7, 0xd5, 0xce,\n                                                   0xcc, 0x52, 0x3f, 0x41, 0x50, 0x50, 0x42, 0x41,\n                                                   0x51, 0xc6, 0xd5, 0x1e, 0xe, 0x7c, 0xd3, 0xf8,\n                                                   0x23, 0xd5, 0xf7, 0x50, 0x77, 0x1, 0xae, 0xe5,\n                                                   0xf7, 0xa7, 0xe3, 0x3, 0xf8, 0x35, 0x16, 0xdd,\n                                                   0xf9, 0x62, 0x33, 0xfb, 0x97, 0x89, 0x6, 0xb4,\n                                                   0x70, 0x4d, 0xa9, 0x4a, 0x1b, 0xfb, 0x16, 0x31,\n                                                   0xfb, 0x2, 0xfb, 0x3d, 0xfb, 0x3a, 0xec, 0x27,\n                                                   0xf7, 0xf, 0x9e, 0xe9, 0x8e, 0xd9, 0xbc, 0x1f,\n                                                   0xfb, 0xb8, 0xf7, 0x4d, 0x15, 0xb1, 0x89, 0xf7,\n                                                   0x3b, 0xf7, 0x18, 0xf6, 0xc4, 0x23, 0x26, 0xfb,\n                                                   0x46, 0xfb, 0x1c, 0x7b, 0x6f, 0x58, 0x3c, 0xaa,\n                                                   0xf7, 0x37, 0x1e, 0xe, 0xfb, 0x1e, 0x76, 0xf8,\n                                                   0xe0, 0xd9, 0xf7, 0x67, 0x77, 0x1, 0xf7, 0x7e,\n                                                   0xe3, 0x3, 0xf7, 0x7e, 0xfb, 0x33, 0x15, 0xe3,\n                                                   0xf8, 0xe0, 0x78, 0xa, 0xf7, 0x67, 0x33, 0xfb,\n                                                   0x67, 0xfb, 0x53, 0x3d, 0xf7, 0x53, 0x6, 0xe,\n                                                   0xfb, 0x1e, 0x76, 0xf7, 0x4c, 0xd9, 0xf7, 0xf5,\n                                                   0xd9, 0xf7, 0x4c, 0x77, 0x1, 0xf7, 0x7e, 0xe3,\n                                                   0x3, 0xb6, 0xa4, 0x15, 0xf7, 0x53, 0xfb, 0x4c,\n                                                   0xe3, 0xf7, 0x4c, 0x78, 0xa, 0xf7, 0xf5, 0x78,\n                                                   0xa, 0xf7, 0x4c, 0x33, 0xfb, 0x4c, 0xfb, 0x53,\n                                                   0x3d, 0xf7, 0x53, 0xfb, 0xf5, 0xfb, 0x53, 0x6,\n                                                   0xe, 0xfb, 0xb7, 0xf8, 0x2f, 0xc4, 0xf7, 0x46,\n                                                   0xc4, 0x1, 0xc1, 0xc5, 0xf7, 0x44, 0xc5, 0x3,\n                                                   0xc1, 0xf8, 0xc2, 0x15, 0x39, 0xcc, 0x4a, 0xdb,\n                                                   0xdc, 0xcd, 0xcc, 0xdd, 0xda, 0x4a, 0xcd, 0x39,\n                                                   0x3a, 0x4b, 0x4a, 0x3b, 0x1e, 0xc5, 0x16, 0xbb,\n                                                   0xb1, 0xb3, 0xbc, 0xbd, 0xb2, 0x63, 0x5b, 0x59,\n                                                   0x63, 0x63, 0x5a, 0x5b, 0x64, 0xb3, 0xbd, 0x1e,\n                                                   0xe, 0xfb, 0xfa, 0xf8, 0xf0, 0xf1, 0x1, 0xb3,\n                                                   0xe5, 0xd4, 0xe5, 0x3, 0xb3, 0xf8, 0xf0, 0x15,\n                                                   0xe5, 0xf1, 0x31, 0x6, 0xf7, 0x37, 0x25, 0x15,\n                                                   0xe5, 0xf1, 0x31, 0x6, 0xe, 0x20, 0x78, 0xed,\n                                                   0xf7, 0x1e, 0xdd, 0xf7, 0x14, 0xec, 0x1, 0xf7,\n                                                   0x86, 0xef, 0x3, 0xb2, 0xf7, 0x6c, 0x15, 0xf8,\n                                                   0x8e, 0xdd, 0xfc, 0x8e, 0x6, 0xf7, 0x5f, 0xf7,\n                                                   0x15, 0x15, 0xef, 0xec, 0x27, 0x6, 0xfc, 0xb3,\n                                                   0x4, 0xef, 0xed, 0x27, 0x6, 0xe, 0x2d, 0x76,\n                                                   0xfa, 0xe, 0x77, 0x1, 0xbb, 0xe6, 0xf7, 0x5,\n                                                   0xc0, 0xf7, 0xf, 0xe7, 0x3, 0xab, 0xf7, 0x52,\n                                                   0x15, 0x98, 0xfb, 0x52, 0xf7, 0x2b, 0x7a, 0xc3,\n                                                   0x83, 0x8, 0x31, 0xc0, 0xe6, 0x7, 0xf7, 0x22,\n                                                   0x90, 0xd4, 0xee, 0xf5, 0x1a, 0xf7, 0x39, 0xfb,\n                                                   0x23, 0xb0, 0x43, 0x9b, 0x1e, 0xf7, 0x93, 0x7,\n                                                   0xa7, 0x85, 0xc6, 0x7e, 0x9b, 0x2a, 0xe9, 0x98,\n                                                   0x18, 0x78, 0xf7, 0x8, 0x3d, 0xc1, 0x27, 0x93,\n                                                   0x8, 0xb4, 0x56, 0x62, 0x7, 0x22, 0x86, 0x2d,\n                                                   0x4f, 0x86, 0xfb, 0x17, 0x88, 0x42, 0xda, 0xfb,\n                                                   0x13, 0xf7, 0x14, 0x83, 0x8, 0xfb, 0xad, 0x7,\n                                                   0x20, 0x96, 0x71, 0xf7, 0x9, 0x88, 0xa8, 0x8,\n                                                   0xf7, 0x1c, 0xf7, 0x65, 0x15, 0x26, 0xa8, 0x7f,\n                                                   0xc1, 0xb5, 0x1a, 0xbf, 0xac, 0xc2, 0xdb, 0x98,\n                                                   0x1e, 0xc0, 0xfc, 0xf7, 0x15, 0xf7, 0xa1, 0x7,\n                                                   0xcd, 0x76, 0xc4, 0x73, 0x36, 0x1a, 0x2d, 0x40,\n                                                   0x63, 0x5b, 0x86, 0x1e, 0xe, 0xfb, 0xfa, 0xf8,\n                                                   0xf0, 0xf1, 0x1, 0xf7, 0xd, 0xe6, 0x3, 0xf7,\n                                                   0xd, 0xf8, 0xf0, 0x15, 0xe6, 0xf1, 0x30, 0x6,\n                                                   0xe, 0xfc, 0x31, 0x68, 0xa, 0xea, 0xe3, 0x3,\n                                                   0xea, 0x16, 0xe3, 0xf8, 0x9f, 0x7a, 0xa, 0x7c,\n                                                   0xd3, 0xf7, 0x48, 0xd3, 0xf7, 0x2e, 0xd6, 0x1,\n                                                   0xc3, 0xe5, 0xf7, 0x91, 0xe5, 0x3, 0xf7, 0x16,\n                                                   0xf7, 0x81, 0x15, 0xf8, 0x16, 0x6, 0xf7, 0x9c,\n                                                   0xfb, 0x34, 0xb0, 0x41, 0xfb, 0x32, 0x37, 0xfb,\n                                                   0x11, 0xfb, 0x32, 0xfb, 0x34, 0xdc, 0xfb, 0x2,\n                                                   0xf7, 0x35, 0xf7, 0x14, 0xd8, 0xd4, 0xed, 0xa5,\n                                                   0x1e, 0x31, 0x96, 0x5, 0x6d, 0x80, 0x6c, 0x3b,\n                                                   0x28, 0x1b, 0x3d, 0x48, 0xc3, 0xf7, 0x10, 0x84,\n                                                   0x1f, 0x90, 0xd3, 0x15, 0xcf, 0x90, 0xb7, 0xe1,\n                                                   0xed, 0x1b, 0xe7, 0xbf, 0x3d, 0x3f, 0x1f, 0xe,\n                                                   0x4a, 0xa, 0xce, 0xf7, 0x1d, 0x1, 0xf8, 0x34,\n                                                   0xe5, 0x3, 0x3f, 0xa, 0xfb, 0x28, 0xfc, 0x85,\n                                                   0x29, 0xa, 0xe, 0x4a, 0xa, 0xf7, 0x60, 0x77,\n                                                   0x1, 0xf8, 0x34, 0xe5, 0x3, 0x3a, 0xa, 0x31,\n                                                   0xfc, 0x85, 0x29, 0xa, 0xe, 0x4a, 0xa, 0xd7,\n                                                   0xef, 0x1, 0xf7, 0xae, 0x8b, 0xf7, 0x1a, 0xe5,\n                                                   0x3, 0x3e, 0xa, 0xfb, 0x4c, 0xfc, 0x69, 0x15,\n                                                   0xf8, 0x2, 0x6, 0xf7, 0x1c, 0x65, 0xd8, 0x56,\n                                                   0xb0, 0x1e, 0xb0, 0x56, 0x52, 0x91, 0x74, 0x1b,\n                                                   0xfb, 0x38, 0x4c, 0xfb, 0xa, 0xfb, 0x31, 0x86,\n                                                   0x1f, 0x2d, 0xa, 0x7b, 0x7c, 0x3a, 0x23, 0x1b,\n                                                   0x37, 0x5e, 0xc2, 0xf7, 0x11, 0x7e, 0x1f, 0x90,\n                                                   0xd3, 0x15, 0xcf, 0x96, 0xa2, 0xdc, 0xf2, 0x1b,\n                                                   0xec, 0xab, 0x42, 0x3f, 0x90, 0x1f, 0xe, 0x4a,\n                                                   0xa, 0xcf, 0xf7, 0x1c, 0x1, 0xf8, 0x34, 0xe5,\n                                                   0x3, 0xf7, 0x20, 0xf7, 0x81, 0x29, 0xa, 0xfb,\n                                                   0x2e, 0xf7, 0xb5, 0x4c, 0xa, 0x4a, 0xf7, 0x1c,\n                                                   0x59, 0xa, 0x78, 0xd2, 0xf7, 0xb2, 0xaf, 0x67,\n                                                   0xd1, 0xf7, 0x74, 0xd2, 0x12, 0xc1, 0xe7, 0xf7,\n                                                   0x9d, 0xe7, 0x13, 0xdc, 0xf7, 0x45, 0xf8, 0xa,\n                                                   0x15, 0x31, 0x5a, 0xfb, 0x10, 0x56, 0xfb, 0xc,\n                                                   0xe6, 0x2b, 0xf7, 0x28, 0xf7, 0x27, 0xe8, 0xeb,\n                                                   0xf7, 0x9, 0xed, 0x52, 0xc5, 0x3b, 0xa3, 0x1f,\n                                                   0x8d, 0x7, 0xab, 0x96, 0xd6, 0xb0, 0xec, 0x1a,\n                                                   0xe9, 0x3f, 0xe3, 0xfb, 0x1c, 0xfb, 0x18, 0x40,\n                                                   0x39, 0x29, 0x21, 0xd9, 0x6c, 0xaa, 0x81, 0x1e,\n                                                   0x7a, 0xf7, 0x2a, 0x15, 0xc2, 0xb6, 0xbe, 0xd4,\n                                                   0xcf, 0xbe, 0x5c, 0x4b, 0x1e, 0x13, 0xbc, 0x4c,\n                                                   0x58, 0x59, 0x48, 0x51, 0x50, 0xb3, 0xd9, 0x1e,\n                                                   0x6d, 0xfb, 0xde, 0x15, 0xd3, 0xbe, 0xd1, 0xe9,\n                                                   0xdb, 0xd1, 0x53, 0x33, 0x33, 0x48, 0x55, 0x3a,\n                                                   0x31, 0x52, 0xcc, 0xda, 0x1e, 0xe, 0xf7, 0xc9,\n                                                   0x8b, 0xf5, 0x1, 0xf7, 0x7, 0xef, 0xf7, 0x7d,\n                                                   0xef, 0xf7, 0x81, 0xef, 0x3, 0xf7, 0x7, 0x16,\n                                                   0xef, 0xf5, 0x27, 0x6, 0xf7, 0xe1, 0x21, 0x15,\n                                                   0xef, 0xf5, 0x27, 0x6, 0xf7, 0xe5, 0x21, 0x15,\n                                                   0xef, 0xf5, 0x27, 0x6, 0xe, 0xf7, 0xc9, 0xf7,\n                                                   0x84, 0xd4, 0x1, 0xf7, 0x84, 0x4, 0xfa, 0x7c,\n                                                   0xd4, 0xfe, 0x7c, 0x6, 0xe, 0xf7, 0x84, 0xd4,\n                                                   0x1, 0xf7, 0x84, 0x4, 0xf8, 0xc0, 0xd4, 0xfc,\n                                                   0xc0, 0x6, 0xe, 0x20, 0xf7, 0x7, 0xdb, 0xf7,\n                                                   0x7, 0xdb, 0x1, 0xb2, 0xf7, 0xca, 0x15, 0xf8,\n                                                   0x8e, 0xdb, 0xfc, 0x8e, 0x6, 0xfb, 0xa7, 0x4,\n                                                   0xf8, 0x8e, 0xdb, 0xfc, 0x8e, 0x6, 0xe, 0x7c,\n                                                   0xd5, 0xf8, 0x1d, 0xda, 0xf7, 0x62, 0x77, 0x1,\n                                                   0xae, 0xe6, 0xf7, 0xc5, 0xe6, 0x3, 0xf7, 0x41,\n                                                   0xf8, 0xc0, 0x15, 0xf7, 0xc, 0xc4, 0xb0, 0x61,\n                                                   0x97, 0x76, 0xa1, 0x5f, 0x19, 0x98, 0x6f, 0x6b,\n                                                   0x97, 0x59, 0x1b, 0x30, 0xfb, 0x14, 0x50, 0xfb,\n                                                   0x6c, 0xfb, 0x71, 0xf7, 0x15, 0x59, 0xea, 0xf7,\n                                                   0x27, 0xf7, 0x8, 0xf4, 0xf7, 0x3a, 0xf7, 0x27,\n                                                   0x4e, 0xf7, 0x12, 0x29, 0xf7, 0x8, 0x1f, 0xe4,\n                                                   0xb6, 0x72, 0xbc, 0x21, 0x58, 0x75, 0xa0, 0x83,\n                                                   0x90, 0x6b, 0xa4, 0x19, 0xfb, 0x0, 0x6, 0xb6,\n                                                   0x6d, 0x9d, 0x7f, 0xb5, 0x62, 0x20, 0x5a, 0x18,\n                                                   0x76, 0xfb, 0xf1, 0x15, 0xf7, 0x21, 0xd3, 0xc2,\n                                                   0xc9, 0xea, 0xd7, 0x64, 0xfb, 0x31, 0xfb, 0x30,\n                                                   0x22, 0x62, 0x48, 0x6b, 0x26, 0x99, 0xf7, 0x4b,\n                                                   0x1e, 0xe, 0xfc, 0x31, 0x8b, 0xef, 0xf7, 0x88,\n                                                   0xef, 0xf7, 0xa6, 0x77, 0xb7, 0x77, 0x1, 0xe5,\n                                                   0xec, 0x35, 0xd7, 0x3, 0xe5, 0x16, 0xec, 0xef,\n                                                   0x2a, 0x6, 0xa2, 0xdb, 0x15, 0xc1, 0x6, 0x9f,\n                                                   0xf8, 0xf, 0x5, 0xf7, 0x33, 0x2a, 0xfb, 0x33,\n                                                   0x7, 0xe, 0xfb, 0xfa, 0xfb, 0x42, 0x76, 0xf8,\n                                                   0xfe, 0xef, 0x1, 0xf7, 0xa, 0xec, 0x33, 0xd8,\n                                                   0x3, 0xf7, 0xa, 0xf8, 0x3b, 0x15, 0xec, 0xef,\n                                                   0x2a, 0x6, 0xfc, 0xc6, 0x4, 0xfb, 0x30, 0xec,\n                                                   0xf7, 0x30, 0x7, 0x75, 0xf8, 0xf, 0x5, 0x53,\n                                                   0x6, 0xe, 0x4b, 0xa, 0xf8, 0x56, 0xcf, 0xf7,\n                                                   0x66, 0x77, 0x1, 0xd7, 0xe3, 0x3, 0xd7, 0x16,\n                                                   0xe3, 0xf8, 0x56, 0xed, 0xcf, 0x29, 0xbc, 0x6,\n                                                   0xc2, 0xa7, 0xb4, 0xc3, 0x76, 0x1e, 0x98, 0xd8,\n                                                   0x5, 0x8b, 0x72, 0x94, 0x7a, 0xfb, 0x23, 0x8b,\n                                                   0xfb, 0x3, 0x59, 0x1e, 0x5a, 0x4d, 0x47, 0xc9,\n                                                   0x7, 0xe, 0x5b, 0xa, 0xf7, 0x3d, 0x3b, 0xa,\n                                                   0xf7, 0x95, 0xfc, 0x56, 0x15, 0xe3, 0xf8, 0x9a,\n                                                   0x33, 0x6, 0xed, 0x4, 0x6d, 0xa, 0x78, 0xd2,\n                                                   0xf7, 0xe0, 0xd8, 0xf7, 0x3f, 0xdf, 0x12, 0xf8,\n                                                   0x2a, 0xeb, 0x17, 0xab, 0xf7, 0x46, 0x15, 0xfb,\n                                                   0x2e, 0x99, 0xf7, 0x16, 0x60, 0xe5, 0x1b, 0xf7,\n                                                   0x36, 0xe1, 0xf7, 0x9, 0xf7, 0x13, 0xf7, 0x2f,\n                                                   0xfb, 0x25, 0xdc, 0x23, 0x59, 0x61, 0x78, 0x72,\n                                                   0x74, 0x1f, 0xb3, 0xf7, 0x4f, 0x5, 0xf7, 0xb6,\n                                                   0xdf, 0xfb, 0xfd, 0x6, 0x43, 0xfb, 0xfe, 0xe0,\n                                                   0x81, 0x5, 0xb1, 0xa3, 0xba, 0xa9, 0xc8, 0x1b,\n                                                   0xdf, 0xd1, 0x56, 0x21, 0x30, 0x54, 0x39, 0x2a,\n                                                   0x1f, 0x6f, 0x2f, 0x92, 0xf7, 0x12, 0x77, 0x1f,\n                                                   0xe, 0x5b, 0xa, 0xf7, 0x3b, 0x3b, 0xa, 0xf7,\n                                                   0x93, 0xfc, 0x56, 0x15, 0xe3, 0xf9, 0x58, 0x7a,\n                                                   0xa, 0xfb, 0x4e, 0x76, 0xf9, 0x22, 0xcf, 0xf7,\n                                                   0x20, 0xdd, 0x1, 0x90, 0xfb, 0xb, 0x15, 0x7b,\n                                                   0x3f, 0x5, 0x7f, 0xca, 0xa0, 0x8b, 0x92, 0x1b,\n                                                   0xda, 0xbe, 0xb3, 0xe2, 0x9a, 0x1f, 0xe9, 0xf8,\n                                                   0xa3, 0x5, 0xef, 0x6, 0x97, 0xcf, 0x5, 0x27,\n                                                   0x6, 0x98, 0xc8, 0x5, 0xbf, 0x95, 0x94, 0xa6,\n                                                   0xba, 0x1b, 0xa0, 0x9c, 0x87, 0x83, 0xaf, 0x1f,\n                                                   0x9c, 0xd6, 0x5, 0x95, 0x68, 0x7a, 0x94, 0x64,\n                                                   0x1b, 0xfb, 0x4, 0x6c, 0x27, 0x4e, 0x7e, 0x1f,\n                                                   0x7f, 0x4e, 0x5, 0x28, 0x6, 0x80, 0x47, 0x5,\n                                                   0xed, 0x6, 0x33, 0xfc, 0x8a, 0x5, 0x5f, 0x84,\n                                                   0x73, 0x6c, 0x6c, 0x1b, 0x7b, 0x76, 0x8e, 0x93,\n                                                   0x65, 0x1f, 0xe, 0xa0, 0x76, 0xf7, 0x3d, 0xda,\n                                                   0xf8, 0x5b, 0x77, 0x1, 0xf7, 0xb3, 0xe3, 0x3,\n                                                   0xa4, 0xf7, 0x3d, 0x15, 0xf7, 0xcd, 0xfb, 0x3d,\n                                                   0xe3, 0xf7, 0x3d, 0xec, 0xda, 0x2a, 0xf8, 0x5b,\n                                                   0x43, 0x6, 0xfb, 0xdd, 0xfc, 0x5b, 0x5, 0xe2,\n                                                   0x16, 0xf7, 0x73, 0xf7, 0xd3, 0x5, 0x8e, 0xfb,\n                                                   0xd3, 0x6, 0xe, 0xfc, 0xa0, 0x8d, 0x76, 0xf9,\n                                                   0x66, 0x77, 0x1, 0x32, 0x78, 0x15, 0xf8, 0x3a,\n                                                   0xf9, 0x66, 0x5, 0x3f, 0x6, 0xfc, 0x3b, 0xfd,\n                                                   0x66, 0x5, 0xe, 0xfb, 0x70, 0xd4, 0xf7, 0x1c,\n                                                   0xd3, 0xf8, 0x29, 0xd3, 0x12, 0xcb, 0xe5, 0xf7,\n                                                   0x94, 0xe4, 0x39, 0xdd, 0x13, 0xf8, 0xc9, 0x55,\n                                                   0x15, 0xfb, 0x28, 0x87, 0xf7, 0x23, 0x79, 0xcc,\n                                                   0x1b, 0xf7, 0x47, 0xc1, 0xf7, 0x2, 0xf7, 0x3d,\n                                                   0x1f, 0xf8, 0x66, 0x3a, 0x4d, 0x89, 0x7, 0xd2,\n                                                   0x54, 0x49, 0x8f, 0x6e, 0x1b, 0xfb, 0x36, 0x4b,\n                                                   0xfb, 0x34, 0xfb, 0x12, 0xfb, 0x20, 0xdc, 0xfb,\n                                                   0xf, 0xf7, 0x25, 0x1f, 0x13, 0xb8, 0xb4, 0xc1,\n                                                   0x95, 0xc5, 0xbc, 0x1f, 0x24, 0x8e, 0x26, 0xfb,\n                                                   0x27, 0x24, 0x7f, 0xc0, 0xa6, 0x87, 0x1e, 0x7a,\n                                                   0xf7, 0xd3, 0x15, 0xf7, 0x11, 0xc5, 0xe4, 0xd9,\n                                                   0x1e, 0x13, 0xf4, 0xc8, 0xe5, 0x49, 0xfb, 0x28,\n                                                   0x2c, 0x67, 0x2b, 0xfb, 0x7, 0x26, 0x68, 0xf7,\n                                                   0x15, 0xc9, 0x1f, 0xe, 0x3b, 0x7c, 0xd3, 0xf8,\n                                                   0xeb, 0xd3, 0x12, 0xce, 0xe3, 0xf7, 0x22, 0xe5,\n                                                   0x80, 0xe0, 0x9f, 0xe5, 0x13, 0xec, 0xce, 0x16,\n                                                   0xe3, 0xf8, 0x7e, 0x6, 0xce, 0x93, 0xee, 0xf7,\n                                                   0x7, 0xc3, 0xb5, 0x6a, 0x5f, 0x1e, 0x13, 0xf4,\n                                                   0x57, 0x3c, 0x30, 0x4e, 0x44, 0xf7, 0x4c, 0x38,\n                                                   0x3c, 0x1a, 0x5d, 0x62, 0x64, 0x5a, 0x6e, 0x69,\n                                                   0x97, 0xd0, 0x66, 0x1e, 0x3f, 0x67, 0x5, 0x67,\n                                                   0x9c, 0xbf, 0x3a, 0xf7, 0x1, 0x1b, 0xf7, 0x0,\n                                                   0xd1, 0xd2, 0xe1, 0x1f, 0xf7, 0x14, 0xfb, 0x4c,\n                                                   0xc0, 0xbf, 0x1a, 0x13, 0xec, 0xc2, 0xd5, 0xe9,\n                                                   0xc2, 0x1a, 0xd2, 0x4b, 0xd9, 0xfb, 0x9, 0xfb,\n                                                   0x21, 0x43, 0x35, 0xfb, 0x2c, 0x1e, 0xe, 0xfb,\n                                                   0xfa, 0xf8, 0xf8, 0x76, 0xf7, 0x25, 0x77, 0x1,\n                                                   0xf7, 0x29, 0xf8, 0xe5, 0x15, 0xc9, 0x6, 0x2f,\n                                                   0xf7, 0x21, 0x5, 0x22, 0x6, 0xe, 0x71, 0xa,\n                                                   0x96, 0x15, 0xf8, 0x7c, 0xf7, 0x5c, 0x5, 0xdd,\n                                                   0x7, 0xfc, 0x7c, 0xf7, 0x5e, 0x5, 0x34, 0x7,\n                                                   0xf8, 0x1a, 0xfb, 0x30, 0xfc, 0x1a, 0xfb, 0x2e,\n                                                   0x5, 0xe, 0x3c, 0x52, 0xa, 0xf7, 0x93, 0xf7,\n                                                   0x16, 0x15, 0xd9, 0x6, 0xfb, 0xc, 0xf7, 0x5e,\n                                                   0xf7, 0xc, 0xf7, 0x5f, 0x5, 0x3d, 0x6, 0xfb,\n                                                   0x27, 0xfb, 0x5f, 0x5, 0xf7, 0xd1, 0xfb, 0x5e,\n                                                   0x15, 0xdb, 0x6, 0xfb, 0xe, 0xf7, 0x5e, 0xf7,\n                                                   0xe, 0xf7, 0x5f, 0x5, 0x3b, 0x6, 0xfb, 0x27,\n                                                   0xfb, 0x5f, 0x5, 0xe, 0x3c, 0x52, 0xa, 0xf7,\n                                                   0xa9, 0xf7, 0x16, 0x15, 0xdc, 0x6, 0xf7, 0x27,\n                                                   0xf7, 0x5e, 0xfb, 0x27, 0xf7, 0x5f, 0x5, 0x3a,\n                                                   0x6, 0xf7, 0xd, 0xfb, 0x5f, 0x5, 0xfb, 0xb7,\n                                                   0xfb, 0x5e, 0x15, 0xda, 0x6, 0xf7, 0x28, 0xf7,\n                                                   0x5e, 0xfb, 0x28, 0xf7, 0x5f, 0x5, 0x3c, 0x6,\n                                                   0xf7, 0xd, 0xfb, 0x5f, 0x5, 0xe, 0xfb, 0xfa,\n                                                   0x52, 0xa, 0xf7, 0x6b, 0xf7, 0x16, 0x15, 0xc1,\n                                                   0x6, 0x36, 0xf7, 0x5e, 0xe0, 0xf7, 0x5f, 0x5,\n                                                   0x55, 0x6, 0xfb, 0xa, 0xfb, 0x5f, 0x5, 0xe,\n                                                   0xfb, 0xd9, 0x52, 0xa, 0xec, 0xf7, 0x16, 0x15,\n                                                   0xc3, 0x6, 0xf7, 0x8, 0xf7, 0x60, 0xfb, 0x8,\n                                                   0xf7, 0x5d, 0x5, 0x53, 0x6, 0xe2, 0xfb, 0x5d,\n                                                   0x5, 0xe, 0xa0, 0x76, 0xf8, 0x5a, 0xd7, 0xf7,\n                                                   0x50, 0x77, 0x1, 0xcc, 0xe3, 0xf7, 0x8e, 0xe3,\n                                                   0x3, 0xcc, 0x16, 0xe3, 0xf7, 0xaf, 0x6, 0xdd,\n                                                   0xb2, 0xe4, 0xf4, 0xf7, 0x1, 0x88, 0x2a, 0x6d,\n                                                   0x1e, 0xfb, 0xdb, 0xe3, 0xf7, 0xdb, 0x7, 0xf7,\n                                                   0x8, 0x49, 0xe2, 0xfb, 0x14, 0x66, 0x59, 0x85,\n                                                   0x4a, 0x52, 0x1e, 0xf7, 0x97, 0x33, 0x7, 0xe,\n                                                   0xfb, 0xfa, 0xf8, 0xe5, 0xf7, 0x21, 0x1, 0xf7,\n                                                   0x58, 0xf8, 0xe5, 0x60, 0xa, 0xfb, 0x9b, 0xfb,\n                                                   0x21, 0x60, 0xa, 0xe, 0xfb, 0xfa, 0xf7, 0x7c,\n                                                   0xe5, 0x1, 0xb7, 0xf7, 0x7c, 0x15, 0xf7, 0x89,\n                                                   0xe5, 0xfb, 0x89, 0x6, 0xe, 0xfc, 0x69, 0xa0,\n                                                   0x76, 0xf9, 0x1, 0xec, 0x1, 0xf7, 0x24, 0xe3,\n                                                   0x3, 0xce, 0x16, 0xe3, 0xf8, 0x98, 0x33, 0x6,\n                                                   0xf4, 0x4, 0x6d, 0xa, 0x62, 0xa, 0xcc, 0xf8,\n                                                   0xe3, 0x15, 0xd2, 0x6, 0xf7, 0x12, 0xf7, 0x23,\n                                                   0x38, 0xa, 0x57, 0x50, 0xa, 0x4b, 0xa, 0xf8,\n                                                   0xe9, 0xf7, 0x1d, 0x1, 0xea, 0xe3, 0x3, 0x85,\n                                                   0xf8, 0xe9, 0x15, 0xee, 0x6, 0xbb, 0xde, 0xb6,\n                                                   0x38, 0x5, 0xf0, 0x6, 0x26, 0x42, 0xa, 0x8f,\n                                                   0x50, 0xa, 0x4b, 0xa, 0xf8, 0xf2, 0xef, 0x12,\n                                                   0x98, 0xe5, 0x83, 0xe3, 0x84, 0xe5, 0x13, 0xd0,\n                                                   0xea, 0x16, 0xe3, 0xf8, 0x99, 0x33, 0x6, 0x13,\n                                                   0xe8, 0x39, 0xe4, 0x58, 0xa, 0x62, 0xa, 0xf7,\n                                                   0x17, 0xf8, 0xea, 0x15, 0xd4, 0x6, 0x39, 0xf7,\n                                                   0x1c, 0x38, 0xa, 0xe3, 0x50, 0xa, 0xfc, 0x69,\n                                                   0xfb, 0x51, 0x76, 0xf9, 0xd3, 0xec, 0x1, 0xce,\n                                                   0xe3, 0x3, 0x8c, 0xfb, 0x12, 0x15, 0x7a, 0x40,\n                                                   0x5, 0x85, 0xa2, 0x9e, 0x88, 0x9c, 0x1b, 0xdc,\n                                                   0xaa, 0xc7, 0xf7, 0xe, 0x1f, 0xf8, 0xb5, 0x33,\n                                                   0xfc, 0xb5, 0x7, 0x2d, 0x72, 0x7d, 0x62, 0x95,\n                                                   0x1e, 0xcd, 0xf9, 0x7f, 0x15, 0x6d, 0xa, 0xfb,\n                                                   0x53, 0x44, 0xa, 0xf7, 0x62, 0x6, 0xca, 0xc6,\n                                                   0xf7, 0x43, 0xfb, 0x9d, 0x5, 0xf7, 0x0, 0x6,\n                                                   0xfb, 0x71, 0xf7, 0xda, 0xf7, 0x5a, 0xf7, 0x54,\n                                                   0x5, 0xfb, 0x6, 0x6, 0xfb, 0x65, 0xfb, 0x66,\n                                                   0x5, 0xf8, 0x2e, 0x33, 0x7, 0xe, 0xfc, 0x69,\n                                                   0x44, 0xa, 0xf9, 0x62, 0x7a, 0xa, 0x71, 0xa,\n                                                   0xf7, 0x69, 0x15, 0xf8, 0x7c, 0xfb, 0x5e, 0x5,\n                                                   0xe2, 0x7, 0xfc, 0x1a, 0xf7, 0x30, 0xf8, 0x1a,\n                                                   0xf7, 0x2e, 0x5, 0xe2, 0x7, 0xfc, 0x7c, 0xfb,\n                                                   0x5c, 0x5, 0xe, 0x20, 0xf7, 0x15, 0x76, 0x1,\n                                                   0xb2, 0xf7, 0xc8, 0x15, 0xf8, 0x27, 0xfb, 0x5c,\n                                                   0xde, 0xf7, 0xae, 0xfc, 0x7a, 0x6, 0xe, 0xfc,\n                                                   0x69, 0x44, 0xa, 0xf7, 0xf9, 0x6, 0xe2, 0xd6,\n                                                   0x5, 0xd8, 0x7, 0x34, 0x40, 0x5, 0xf7, 0xb0,\n                                                   0x33, 0xfb, 0xfb, 0x7, 0x34, 0x43, 0x5, 0x3e,\n                                                   0x7, 0xe2, 0xd3, 0x5, 0xe, 0xf7, 0x22, 0x6f,\n                                                   0xa, 0xf7, 0x70, 0xe3, 0xf7, 0x70, 0xe3, 0x17,\n                                                   0xcc, 0x16, 0xe3, 0xf7, 0xa1, 0x6, 0xcc, 0x9c,\n                                                   0xf7, 0x14, 0xf7, 0x2, 0xe1, 0x92, 0x3f, 0x5a,\n                                                   0x1e, 0xfb, 0xe5, 0xe3, 0xf7, 0xc1, 0x7, 0xdc,\n                                                   0xb2, 0xdb, 0xe3, 0xe8, 0x8b, 0x36, 0x59, 0x1e,\n                                                   0xfb, 0xdb, 0xe3, 0xf7, 0xf3, 0x7, 0xb0, 0x76,\n                                                   0xf7, 0x2a, 0xfb, 0x34, 0x2a, 0x72, 0x4c, 0x6f,\n                                                   0x79, 0x1e, 0xc7, 0x76, 0x42, 0xaa, 0x41, 0x1b,\n                                                   0x40, 0x6c, 0x5e, 0x5d, 0x6f, 0x1f, 0x13, 0xf8,\n                                                   0x89, 0x8a, 0x5, 0xd3, 0x3c, 0x7, 0xe, 0xfb,\n                                                   0xfa, 0xf9, 0x7, 0xc4, 0x1, 0x95, 0xf9, 0x7,\n                                                   0x15, 0xf7, 0xcd, 0xc4, 0xfb, 0xcd, 0x6, 0xe,\n                                                   0x20, 0xb2, 0xf7, 0x6c, 0x15, 0xf8, 0x8e, 0xd4,\n                                                   0xfc, 0x8e, 0x6, 0xe, 0xfb, 0x4e, 0x76, 0xf7,\n                                                   0x57, 0xda, 0x48, 0xce, 0xf8, 0x5c, 0x77, 0x4e,\n                                                   0xa, 0x13, 0xdc, 0xf7, 0x33, 0xbf, 0x15, 0x6f,\n                                                   0x9f, 0xa8, 0x67, 0xd4, 0x1b, 0xdd, 0xa9, 0xb9,\n                                                   0xa6, 0x9b, 0x1f, 0x8d, 0x6, 0x13, 0xbc, 0x4e,\n                                                   0xd9, 0xf8, 0x9f, 0x33, 0xfb, 0x75, 0x7, 0xfb,\n                                                   0x10, 0x8a, 0x20, 0xfb, 0xb, 0xfb, 0x11, 0x8b,\n                                                   0xf7, 0xf, 0xf7, 0x1, 0x1e, 0xf7, 0x74, 0x33,\n                                                   0xfd, 0x6e, 0xe4, 0xf7, 0x97, 0x7, 0xe, 0x20,\n                                                   0xa0, 0x76, 0xf8, 0x8e, 0x77, 0x1, 0xb3, 0xd1,\n                                                   0xf8, 0x1, 0xd0, 0x3, 0xb2, 0xd1, 0x15, 0xd1,\n                                                   0x45, 0xf7, 0x4c, 0xf7, 0x4b, 0xf7, 0x4a, 0xfb,\n                                                   0x4b, 0xd1, 0xd2, 0xfb, 0x49, 0xf7, 0x4a, 0xf7,\n                                                   0x48, 0xf7, 0x49, 0x46, 0xd2, 0xfb, 0x49, 0xfb,\n                                                   0x4c, 0xfb, 0x4c, 0xf7, 0x4d, 0x45, 0x43, 0xf7,\n                                                   0x4a, 0xfb, 0x4a, 0x5, 0xe, 0x6f, 0xa, 0xf7,\n                                                   0x8e, 0xe3, 0x17, 0xcc, 0x16, 0xe3, 0xf7, 0xaf,\n                                                   0x6, 0xe0, 0xac, 0xe9, 0xf7, 0x0, 0xf7, 0x0,\n                                                   0x8c, 0x25, 0x5e, 0x1e, 0xfb, 0xcf, 0xe3, 0xf7,\n                                                   0xcf, 0x7, 0xf7, 0xe, 0x4a, 0xf0, 0xfb, 0x18,\n                                                   0x68, 0x4d, 0x7c, 0x3d, 0x58, 0x1e, 0x13, 0xf0,\n                                                   0x89, 0xd4, 0x3c, 0x6, 0xe, 0x78, 0xd2, 0xf7,\n                                                   0x47, 0xd7, 0xf7, 0xdd, 0xd4, 0x1, 0xc6, 0xe5,\n                                                   0xf7, 0x9d, 0xec, 0x3, 0xc2, 0xf7, 0x30, 0x15,\n                                                   0xfb, 0x3b, 0xa0, 0xf7, 0x30, 0x83, 0xb2, 0x1b,\n                                                   0xf7, 0x86, 0x8c, 0xf7, 0xc0, 0xd9, 0xf7, 0x61,\n                                                   0x4e, 0xf7, 0x1f, 0xfb, 0x4a, 0xfb, 0x18, 0x2a,\n                                                   0x23, 0xfb, 0x20, 0xfb, 0x27, 0xf7, 0xb, 0x3a,\n                                                   0xf7, 0x2, 0xe0, 0xb8, 0xc0, 0xb3, 0xa3, 0x1f,\n                                                   0x8d, 0x6, 0x47, 0x8c, 0x88, 0xfb, 0x60, 0xfb,\n                                                   0x2e, 0x1b, 0x29, 0x6e, 0xdf, 0xa6, 0x86, 0x1f,\n                                                   0x84, 0xf7, 0xbc, 0x15, 0xe7, 0xc2, 0xda, 0xdf,\n                                                   0xde, 0xca, 0x39, 0x32, 0x38, 0x56, 0x46, 0x2e,\n                                                   0x3d, 0x4e, 0xc6, 0xe8, 0x1e, 0xe, 0xa0, 0x76,\n                                                   0xf8, 0x5a, 0xd7, 0xdc, 0x75, 0xa, 0xcc, 0xe3,\n                                                   0xf7, 0x8e, 0xe3, 0x13, 0xec, 0xcc, 0x16, 0xe3,\n                                                   0xf7, 0xc2, 0x6, 0xdf, 0xac, 0xcf, 0xf7, 0x0,\n                                                   0xf7, 0x0, 0x8c, 0x20, 0x5e, 0x1e, 0xfb, 0xc2,\n                                                   0xe3, 0xf7, 0xc2, 0x7, 0xf7, 0x19, 0x52, 0xea,\n                                                   0xfb, 0x20, 0x68, 0x4d, 0x83, 0x3e, 0x58, 0x1e,\n                                                   0x89, 0xd4, 0x3c, 0x6, 0xbd, 0xe8, 0x15, 0xcc,\n                                                   0x6, 0xbb, 0xab, 0x8a, 0x90, 0x9f, 0xa4, 0x7f,\n                                                   0x7f, 0xa3, 0x1e, 0x80, 0xa2, 0x9f, 0x80, 0x9c,\n                                                   0x1b, 0xa1, 0xd0, 0x90, 0xf6, 0x90, 0x1f, 0x4b,\n                                                   0x6, 0x13, 0xdc, 0x68, 0x87, 0x80, 0x84, 0x77,\n                                                   0x1b, 0x86, 0x78, 0x95, 0x96, 0x70, 0x1f, 0x13,\n                                                   0xec, 0x96, 0x72, 0x6d, 0x94, 0x74, 0x1b, 0x5a,\n                                                   0x59, 0x68, 0x3e, 0x1f, 0xe, 0xa0, 0x76, 0xf7,\n                                                   0x55, 0xcb, 0xf7, 0x3a, 0xce, 0xf7, 0x5a, 0x77,\n                                                   0x1, 0xa7, 0xf8, 0x89, 0x3, 0xcb, 0x16, 0xd0,\n                                                   0x6, 0xb3, 0xf7, 0x55, 0x5, 0xf7, 0x25, 0x6,\n                                                   0x62, 0xfb, 0x55, 0x5, 0xd1, 0x6, 0xb3, 0xf7,\n                                                   0x55, 0x5, 0xf7, 0x22, 0xcb, 0xfb, 0x14, 0x6,\n                                                   0xad, 0xf7, 0x3a, 0x5, 0xe9, 0xce, 0x3b, 0x6,\n                                                   0xb2, 0xf7, 0x5a, 0x5, 0x47, 0x6, 0x62, 0xfb,\n                                                   0x5a, 0x5, 0xfb, 0x24, 0x6, 0xb3, 0xf7, 0x5a,\n                                                   0x5, 0x46, 0x6, 0x62, 0xfb, 0x5a, 0x5, 0xfb,\n                                                   0x1d, 0x48, 0xf7, 0x10, 0x6, 0x68, 0xfb, 0x3a,\n                                                   0x5, 0x32, 0x4b, 0xd7, 0x6, 0xd9, 0xcb, 0x15,\n                                                   0xae, 0xf7, 0x3b, 0x5, 0xf7, 0x2e, 0x6, 0x67,\n                                                   0xfb, 0x3b, 0x5, 0xe, 0x7d, 0xd3, 0xf8, 0x2c,\n                                                   0xd3, 0x1, 0xbb, 0xe5, 0xf7, 0xa8, 0xe5, 0x3,\n                                                   0xae, 0xf7, 0xa0, 0x15, 0xfb, 0x2e, 0xd1, 0xfb,\n                                                   0x14, 0xf7, 0x41, 0xf7, 0x30, 0xe2, 0xf1, 0xf7,\n                                                   0x48, 0xf7, 0x5a, 0xfb, 0x1a, 0xd3, 0xfb, 0x1,\n                                                   0xfb, 0x3c, 0x40, 0xfb, 0x13, 0xfb, 0x23, 0x1e,\n                                                   0xe5, 0x16, 0xf7, 0x3c, 0xed, 0xa9, 0xc2, 0xda,\n                                                   0xd5, 0x4f, 0xfb, 0x1e, 0x39, 0x6f, 0xfb, 0x14,\n                                                   0xfb, 0x11, 0x57, 0x26, 0xb4, 0xf7, 0x3d, 0x1e,\n                                                   0xe, 0x76, 0xa, 0xc8, 0xf7, 0x1d, 0x1, 0x77,\n                                                   0xa, 0x3, 0x3f, 0xa, 0xfb, 0x87, 0xfc, 0x6a,\n                                                   0x23, 0xa, 0xe, 0x76, 0xa, 0xf7, 0x5a, 0x77,\n                                                   0x1, 0x77, 0xa, 0x3, 0x3a, 0xa, 0xfb, 0x4d,\n                                                   0xfc, 0x6a, 0x23, 0xa, 0xe, 0x7d, 0xd3, 0xf8,\n                                                   0x34, 0xd3, 0xc7, 0xef, 0x1, 0x77, 0xa, 0x3,\n                                                   0x3e, 0xa, 0xfb, 0xab, 0xfc, 0x4e, 0x23, 0xa,\n                                                   0xe, 0xf7, 0x91, 0x7c, 0xd4, 0xf7, 0x46, 0xd3,\n                                                   0xf7, 0x32, 0xd3, 0x1, 0xae, 0xe5, 0xf7, 0xc8,\n                                                   0xe7, 0xf7, 0xb1, 0xe7, 0x3, 0xf8, 0x6f, 0xde,\n                                                   0x15, 0x3d, 0xbf, 0xd4, 0x77, 0xca, 0x1b, 0xc8,\n                                                   0xf7, 0x18, 0x9f, 0xf7, 0x2b, 0xb3, 0x1f, 0x3c,\n                                                   0x98, 0x5, 0x77, 0x85, 0x5e, 0x30, 0x24, 0x1b,\n                                                   0x2e, 0x5c, 0xd8, 0xf0, 0x8a, 0x1f, 0xf8, 0x10,\n                                                   0x6, 0xf7, 0xaa, 0xfb, 0x41, 0xa3, 0x49, 0x3d,\n                                                   0x49, 0x68, 0x4b, 0x5f, 0x1e, 0xc8, 0x61, 0x5a,\n                                                   0xb1, 0x21, 0x1b, 0xfb, 0xd, 0xfb, 0xe, 0x2c,\n                                                   0xfb, 0x49, 0xfb, 0x47, 0xf7, 0x1, 0x29, 0xf7,\n                                                   0x1a, 0xa9, 0xea, 0x8e, 0xea, 0xd3, 0x1f, 0xfb,\n                                                   0xf2, 0xf7, 0x47, 0x15, 0xf6, 0xc7, 0xec, 0xe8,\n                                                   0xe0, 0xd1, 0x3c, 0xfb, 0x11, 0xfb, 0x1d, 0x3e,\n                                                   0x48, 0x3d, 0x63, 0xfb, 0x5, 0xa2, 0xf7, 0x49,\n                                                   0x1e, 0xf8, 0x24, 0xb9, 0x15, 0xf7, 0x4, 0x94,\n                                                   0xcf, 0xb5, 0xc8, 0x1b, 0xd7, 0xc8, 0x61, 0xfb,\n                                                   0x4, 0x95, 0x1f, 0xe, 0xfb, 0xfa, 0xfb, 0x75,\n                                                   0xc7, 0xf7, 0x39, 0x77, 0x1, 0xd4, 0xc9, 0xc9,\n                                                   0xe5, 0x3, 0xe8, 0x16, 0x7a, 0x4f, 0x88, 0x6e,\n                                                   0x76, 0x1a, 0x3d, 0xc1, 0x66, 0xc6, 0xae, 0xb0,\n                                                   0x97, 0x9d, 0xa8, 0x1e, 0xc2, 0x7, 0x78, 0x6d,\n                                                   0x6a, 0x85, 0x70, 0x1b, 0x67, 0x71, 0xa1, 0xba,\n                                                   0x91, 0x88, 0xb9, 0x9e, 0xb7, 0x1f, 0xe, 0x76,\n                                                   0xa, 0xca, 0xf7, 0x1b, 0x1, 0x77, 0xa, 0x3,\n                                                   0xb8, 0xf7, 0x9c, 0x23, 0xa, 0xf7, 0x13, 0xf7,\n                                                   0xe3, 0x4c, 0xa, 0x4a, 0xf7, 0x1b, 0x59, 0xa,\n                                                   0xa0, 0x76, 0xf8, 0xbe, 0xf7, 0x33, 0x1, 0xf7,\n                                                   0xa3, 0xe3, 0x3, 0xf7, 0xa3, 0x16, 0xe3, 0xf9,\n                                                   0x53, 0x48, 0x6, 0x67, 0x42, 0x44, 0x47, 0x37,\n                                                   0x64, 0x8, 0x36, 0x7, 0xab, 0x97, 0xdd, 0xb3,\n                                                   0xc3, 0xc1, 0x8, 0xe, 0xf7, 0x23, 0x81, 0xc3,\n                                                   0x5f, 0x76, 0xf7, 0xc6, 0xc3, 0xf7, 0xfb, 0x77,\n                                                   0xa0, 0x77, 0x12, 0xf7, 0x2a, 0xd1, 0xf8, 0x6f,\n                                                   0xd7, 0x13, 0x76, 0xf7, 0x2a, 0xf7, 0xf1, 0x15,\n                                                   0xd1, 0xf7, 0xf5, 0x57, 0x6, 0x68, 0x60, 0x53,\n                                                   0x69, 0x69, 0x80, 0x8, 0x51, 0x7, 0xb0, 0x94,\n                                                   0xb4, 0xa0, 0xa8, 0xa3, 0x8, 0x50, 0xfd, 0x9,\n                                                   0x15, 0xd7, 0x6, 0x13, 0x6e, 0xf8, 0xa3, 0xf9,\n                                                   0x66, 0x5, 0x40, 0x6, 0x13, 0xb6, 0xfb, 0x24,\n                                                   0xfd, 0x5d, 0x15, 0xf7, 0xbe, 0xc3, 0xfb, 0x4d,\n                                                   0x6, 0xd3, 0xc3, 0x5, 0xcf, 0xba, 0xb6, 0xa4,\n                                                   0xc8, 0x1a, 0xe9, 0xfb, 0xc, 0x99, 0x76, 0xfb,\n                                                   0xb, 0x79, 0x46, 0x6a, 0x83, 0x1e, 0xd3, 0x84,\n                                                   0x5, 0xa6, 0x94, 0x95, 0xa5, 0xc1, 0x1b, 0xb3,\n                                                   0xa4, 0x79, 0x69, 0x6b, 0x74, 0x7a, 0x41, 0x57,\n                                                   0x1f, 0x4c, 0x5e, 0x55, 0x5c, 0x85, 0x57, 0x8,\n                                                   0xe, 0xf7, 0x23, 0x8d, 0x76, 0xdc, 0xbe, 0xf8,\n                                                   0xe2, 0x77, 0x1, 0xf7, 0x43, 0xce, 0xf8, 0x24,\n                                                   0xcd, 0x3, 0xf8, 0x67, 0xc9, 0x15, 0xf7, 0x43,\n                                                   0x44, 0xcd, 0xd2, 0xbb, 0xbe, 0x5b, 0xf7, 0x78,\n                                                   0x53, 0x6, 0xfb, 0x4d, 0xfb, 0x71, 0x5, 0xd1,\n                                                   0x84, 0x15, 0xf4, 0xf7, 0xf, 0x5, 0xfb, 0xf,\n                                                   0x7, 0xfc, 0x67, 0xf7, 0x83, 0x15, 0xce, 0xf7,\n                                                   0xf3, 0x59, 0x6, 0x6a, 0x60, 0x56, 0x69, 0x6a,\n                                                   0x81, 0x8, 0x51, 0x7, 0xaf, 0x94, 0xb1, 0x9f,\n                                                   0xa7, 0xa3, 0x8, 0x5d, 0xfd, 0xa, 0x15, 0xd4,\n                                                   0x6, 0xf8, 0x8d, 0xf9, 0x63, 0x5, 0x44, 0x6,\n                                                   0xe, 0xfb, 0xfa, 0xf7, 0xe0, 0x76, 0xf8, 0x3a,\n                                                   0x77, 0x1, 0xf7, 0x2b, 0xd2, 0x3, 0xf7, 0x2b,\n                                                   0xf7, 0xcb, 0x15, 0xd2, 0xf8, 0x3a, 0x56, 0x6,\n                                                   0x68, 0x5e, 0x53, 0x68, 0x68, 0x80, 0x8, 0x4e,\n                                                   0x7, 0xb1, 0x95, 0xb3, 0xa0, 0xa9, 0xa4, 0x8,\n                                                   0xe, 0xfb, 0xd5, 0xf7, 0xc4, 0xd1, 0xf7, 0xbe,\n                                                   0xcc, 0x1, 0xa3, 0xd3, 0xf7, 0x38, 0xce, 0x3,\n                                                   0xf7, 0xa6, 0xf7, 0xcf, 0x4c, 0xa, 0x78, 0xa7,\n                                                   0x8b, 0xb3, 0xd6, 0x1a, 0xf7, 0x1e, 0x7, 0xf7,\n                                                   0x11, 0x3d, 0x9b, 0x48, 0xfb, 0x9, 0x74, 0x3b,\n                                                   0x62, 0x86, 0x1e, 0xcc, 0x77, 0x5, 0xc9, 0x93,\n                                                   0xb1, 0x99, 0xad, 0x1b, 0xd6, 0x8e, 0x56, 0x64,\n                                                   0x1f, 0x82, 0x85, 0x3b, 0x7f, 0x7b, 0x87, 0x8,\n                                                   0x5a, 0x84, 0x39, 0x7d, 0x22, 0x1a, 0x27, 0xd2,\n                                                   0x6f, 0xb8, 0xbe, 0xb7, 0xab, 0xa9, 0xa8, 0x1e,\n                                                   0x75, 0x8f, 0x7d, 0x91, 0x7c, 0x1e, 0x7c, 0xf7,\n                                                   0x5b, 0x15, 0x5b, 0x8a, 0x7d, 0x81, 0x77, 0x1e,\n                                                   0x65, 0x79, 0x64, 0x77, 0x68, 0x1b, 0x6a, 0x70,\n                                                   0x9f, 0xb1, 0xb9, 0xa6, 0x93, 0xcb, 0x97, 0x1f,\n                                                   0xb7, 0x94, 0x96, 0x8c, 0x9c, 0x91, 0x8, 0xe,\n                                                   0xfb, 0xda, 0xf7, 0xc4, 0xd0, 0xf7, 0xbb, 0xd0,\n                                                   0x1, 0xa4, 0xcb, 0xf7, 0x50, 0xcb, 0x3, 0xa4,\n                                                   0xf8, 0x9e, 0x15, 0xfb, 0x9, 0xc0, 0x26, 0xf4,\n                                                   0xf7, 0xe, 0xaf, 0xf7, 0x15, 0xe4, 0xe2, 0x68,\n                                                   0xf7, 0x14, 0xfb, 0xf, 0xfb, 0xd, 0x66, 0xfb,\n                                                   0xc, 0x2c, 0x1e, 0xcb, 0x16, 0xb2, 0x97, 0xf6,\n                                                   0xdd, 0xe1, 0x93, 0xfb, 0x12, 0x77, 0x68, 0x83,\n                                                   0xfb, 0x6, 0x35, 0x35, 0x83, 0xf7, 0x13, 0xa1,\n                                                   0x1e, 0xe, 0x3b, 0x8a, 0x76, 0xa6, 0xd0, 0xf8,\n                                                   0x10, 0xd0, 0xa1, 0x77, 0x1, 0xa7, 0xd3, 0xf7,\n                                                   0xf8, 0xdc, 0x3, 0xb0, 0x97, 0x15, 0xbb, 0x69,\n                                                   0xc1, 0xcc, 0x5, 0x7d, 0xa3, 0xaf, 0x73, 0xdc,\n                                                   0x1b, 0xf7, 0x39, 0xe7, 0xf7, 0x3, 0xf7, 0x27,\n                                                   0xf7, 0x1, 0x69, 0xb7, 0x71, 0xab, 0x1f, 0xc2,\n                                                   0xcb, 0x5a, 0xac, 0x58, 0x4f, 0x5, 0x9b, 0x6e,\n                                                   0x5c, 0xa1, 0x3f, 0x1b, 0xfb, 0x3a, 0x35, 0xfb,\n                                                   0x8, 0xfb, 0x24, 0x2e, 0xaa, 0x53, 0xad, 0x68,\n                                                   0x1f, 0xba, 0xc6, 0x15, 0x6e, 0xa6, 0x80, 0xb8,\n                                                   0xbe, 0x1a, 0xf7, 0x3a, 0xf7, 0x17, 0xa6, 0xbc,\n                                                   0xbe, 0xad, 0x78, 0x7e, 0x9e, 0x1e, 0xfb, 0x60,\n                                                   0xfb, 0xdc, 0x15, 0xf7, 0x86, 0xf7, 0xaf, 0x5,\n                                                   0xa1, 0x6f, 0x97, 0x72, 0x4e, 0x1a, 0xfb, 0x34,\n                                                   0xfb, 0x8, 0x6e, 0x4f, 0x59, 0x6c, 0x91, 0x99,\n                                                   0x78, 0x1e, 0xe, 0x7d, 0xd3, 0xf8, 0x34, 0xd3,\n                                                   0xca, 0x75, 0xa, 0x77, 0xa, 0x13, 0xec, 0xf7,\n                                                   0x7, 0xf8, 0xf5, 0x15, 0xcc, 0x6, 0xbb, 0xac,\n                                                   0x8a, 0x8f, 0xa2, 0xa4, 0x7f, 0x7f, 0xa2, 0x1e,\n                                                   0x80, 0xa2, 0x9f, 0x80, 0x9a, 0x1b, 0xa0, 0xd6,\n                                                   0x8d, 0xf7, 0x2, 0x56, 0xa, 0x87, 0x79, 0x92,\n                                                   0x96, 0x74, 0x1f, 0x13, 0xdc, 0x70, 0x96, 0x6b,\n                                                   0x98, 0x72, 0x8a, 0x8, 0x13, 0xec, 0x5a, 0x59,\n                                                   0x66, 0x40, 0x1f, 0x45, 0xfb, 0xed, 0x23, 0xa,\n                                                   0xe, 0x66, 0xa, 0xc7, 0xe3, 0xf7, 0x98, 0xe5,\n                                                   0x3, 0xf7, 0x28, 0xc8, 0x15, 0x68, 0xa5, 0xb3,\n                                                   0x6c, 0xc9, 0x1b, 0xf7, 0x6, 0xf7, 0x13, 0xe0,\n                                                   0xf7, 0x4c, 0xf7, 0x25, 0x2d, 0xf7, 0x15, 0xfb,\n                                                   0x27, 0x2d, 0x70, 0x54, 0x73, 0x7c, 0x1f, 0x89,\n                                                   0xce, 0x3b, 0xfd, 0x71, 0xe3, 0xf7, 0xa0, 0x6,\n                                                   0x82, 0xf7, 0x5e, 0x15, 0xf7, 0xd, 0xc2, 0xe0,\n                                                   0xdf, 0xcd, 0xe0, 0x50, 0xfb, 0x26, 0xfb, 0x3e,\n                                                   0x28, 0x70, 0x57, 0x4f, 0x3c, 0xb3, 0xf7, 0x30,\n                                                   0x1e, 0xe, 0xfb, 0x2e, 0xfb, 0x2c, 0x76, 0xf9,\n                                                   0xba, 0xe0, 0x1, 0x9d, 0xf7, 0xa2, 0xdd, 0xd0,\n                                                   0x3, 0xf7, 0x6c, 0xfb, 0x41, 0x15, 0xd3, 0xf9,\n                                                   0xba, 0xdd, 0xfd, 0xba, 0xd0, 0xf9, 0xba, 0xc5,\n                                                   0xe0, 0xfb, 0x8b, 0x6, 0xfb, 0xf, 0xfb, 0x1,\n                                                   0x48, 0xfb, 0x1d, 0x27, 0xca, 0x2d, 0xf7, 0x1b,\n                                                   0x1f, 0xe, 0x70, 0xa, 0x1, 0xcf, 0xe6, 0x3,\n                                                   0xf7, 0x88, 0xfb, 0x63, 0x15, 0xc2, 0x6, 0x21,\n                                                   0xf7, 0x3e, 0x69, 0xf7, 0x30, 0xf7, 0x23, 0x1a,\n                                                   0xf7, 0x6d, 0xd4, 0xf7, 0x1f, 0xce, 0xf7, 0x7,\n                                                   0x1e, 0x4a, 0x6, 0x21, 0xfb, 0x1f, 0x4f, 0xfb,\n                                                   0x37, 0xfb, 0x3d, 0x1a, 0xfb, 0x7f, 0xf7, 0x1d,\n                                                   0xfb, 0x4d, 0xb2, 0x5a, 0x1e, 0xe, 0x70, 0xa,\n                                                   0x12, 0xf7, 0x42, 0xe6, 0x17, 0xad, 0xfb, 0x61,\n                                                   0x15, 0xc6, 0x89, 0x5, 0xf5, 0xf7, 0x1f, 0xcd,\n                                                   0xf7, 0x35, 0xf7, 0x3d, 0x1a, 0xf7, 0x7f, 0xfb,\n                                                   0x16, 0xf7, 0x4f, 0x64, 0xbc, 0x1e, 0x4d, 0x6,\n                                                   0x13, 0x20, 0xf5, 0xfb, 0x3e, 0xad, 0xfb, 0x32,\n                                                   0xfb, 0x23, 0x1a, 0xfb, 0x6d, 0x3d, 0xfb, 0x26,\n                                                   0x4d, 0x23, 0x1e, 0xe, 0xf7, 0x5a, 0x79, 0xc5,\n                                                   0x65, 0x76, 0xf7, 0xc5, 0xc4, 0x89, 0xc5, 0xf7,\n                                                   0x8a, 0xc4, 0x8c, 0x77, 0x12, 0xb2, 0xde, 0xf7,\n                                                   0x3a, 0xdd, 0xf7, 0x29, 0xdd, 0xf7, 0x3b, 0xdd,\n                                                   0x13, 0x9b, 0xc0, 0xb2, 0xf8, 0x9d, 0x15, 0xfb,\n                                                   0x37, 0xf7, 0x2, 0x7a, 0xc0, 0xce, 0xf0, 0xb2,\n                                                   0xf7, 0x21, 0xf7, 0x27, 0x26, 0xad, 0x48, 0x1e,\n                                                   0xfb, 0xa, 0x5e, 0x29, 0x38, 0x1f, 0xde, 0x16,\n                                                   0xae, 0x89, 0xe4, 0xdd, 0xdf, 0x8d, 0x28, 0x72,\n                                                   0x68, 0x89, 0x34, 0x37, 0x1e, 0x13, 0xa6, 0xc0,\n                                                   0x39, 0x8d, 0xed, 0xa3, 0x1f, 0xf8, 0x21, 0xfb,\n                                                   0xfa, 0x15, 0xfb, 0x37, 0xf7, 0x2, 0x79, 0xc0,\n                                                   0xce, 0xf0, 0xb3, 0xf7, 0x21, 0x1e, 0x13, 0xab,\n                                                   0xc0, 0xf7, 0x26, 0x26, 0xad, 0x48, 0xfb, 0xb,\n                                                   0x5f, 0x2a, 0x38, 0x1e, 0xdd, 0x16, 0xae, 0x89,\n                                                   0xe3, 0xde, 0xdf, 0x8d, 0x29, 0x72, 0x68, 0x89,\n                                                   0x33, 0x37, 0x38, 0x8d, 0xee, 0xa3, 0x1e, 0x13,\n                                                   0x67, 0xc0, 0xfc, 0x2b, 0xfb, 0x4a, 0x15, 0xda,\n                                                   0x6, 0xf8, 0x3b, 0xf9, 0x66, 0x5, 0x3e, 0x6,\n                                                   0xe, 0xfc, 0x31, 0x8b, 0xf5, 0x1, 0xe2, 0xf3,\n                                                   0x3, 0xe2, 0x16, 0xf3, 0xf5, 0x23, 0x6, 0xe,\n                                                   0xfc, 0x31, 0xf7, 0x52, 0xf7, 0x11, 0x1, 0xd8,\n                                                   0xf7, 0x11, 0x3, 0xd8, 0xf7, 0x52, 0x15, 0xf7,\n                                                   0x11, 0xf7, 0x11, 0xfb, 0x11, 0x6, 0xe, 0xf7,\n                                                   0xc9, 0x78, 0xc5, 0xf7, 0x86, 0xc5, 0x88, 0xc6,\n                                                   0xf7, 0x85, 0xc4, 0x95, 0x77, 0x12, 0x92, 0xd5,\n                                                   0xf7, 0x1f, 0xd4, 0xd9, 0xd4, 0xf7, 0x1f, 0xd5,\n                                                   0xbe, 0xd4, 0xf7, 0x1f, 0xd5, 0x13, 0xb7, 0xe0,\n                                                   0x92, 0xf8, 0x98, 0x15, 0x52, 0x97, 0xfb, 0xf,\n                                                   0xf7, 0x16, 0xf7, 0x23, 0x8c, 0xf7, 0x1b, 0xb8,\n                                                   0xb2, 0x86, 0xf7, 0x1e, 0xfb, 0x1f, 0xfb, 0x1a,\n                                                   0x83, 0xfb, 0x16, 0x5c, 0x1e, 0xd5, 0x16, 0xb1,\n                                                   0x8a, 0xdd, 0xd0, 0xc4, 0x99, 0x53, 0x4b, 0x5d,\n                                                   0x83, 0x40, 0x4c, 0x48, 0x8a, 0xd7, 0xb8, 0x1e,\n                                                   0xf7, 0xb6, 0xfb, 0xf8, 0x15, 0x5d, 0xa, 0x1e,\n                                                   0x13, 0xcf, 0xe0, 0x3c, 0xa, 0xf7, 0x9c, 0x16,\n                                                   0x5d, 0xa, 0x3c, 0xa, 0xfd, 0xb, 0xfb, 0x45,\n                                                   0x15, 0xcd, 0x6, 0xf7, 0xbf, 0xf9, 0x64, 0x5,\n                                                   0x49, 0x6, 0xe, 0x20, 0xf7, 0x82, 0xe4, 0x1,\n                                                   0xf7, 0x8d, 0xe4, 0x3, 0xb2, 0xf7, 0x82, 0x15,\n                                                   0xf7, 0x66, 0xfb, 0x64, 0xe4, 0xf7, 0x64, 0xf7,\n                                                   0x63, 0xe4, 0xfb, 0x63, 0xf7, 0x64, 0x32, 0xfb,\n                                                   0x64, 0xfb, 0x66, 0x6, 0xe, 0x20, 0x8b, 0xd9,\n                                                   0xf7, 0x57, 0xd8, 0xf7, 0x30, 0x77, 0x1, 0xf7,\n                                                   0x8b, 0xe4, 0x3, 0xb2, 0xf7, 0xa5, 0x15, 0xf7,\n                                                   0x64, 0xfb, 0x2e, 0xe4, 0xf7, 0x2e, 0xf7, 0x65,\n                                                   0xd8, 0xfb, 0x65, 0xf7, 0x30, 0x32, 0xfb, 0x30,\n                                                   0xfb, 0x64, 0x6, 0xfb, 0xf2, 0x4, 0xf8, 0x8e,\n                                                   0xd9, 0xfc, 0x8e, 0x6, 0xe, 0x66, 0xa, 0xbe,\n                                                   0xe5, 0xf7, 0xa6, 0xda, 0x3, 0xf8, 0x28, 0xc8,\n                                                   0x15, 0x8d, 0xfb, 0xa0, 0xe3, 0xf9, 0x71, 0x3b,\n                                                   0x48, 0x89, 0x6, 0xa3, 0x7c, 0x5b, 0xc2, 0x2d,\n                                                   0x1b, 0xfb, 0x27, 0x42, 0xfb, 0x10, 0xfb, 0x25,\n                                                   0xfb, 0x4c, 0xf5, 0x31, 0xf7, 0x6, 0xc9, 0xc8,\n                                                   0xaa, 0xae, 0xa5, 0x1f, 0xfb, 0xab, 0xf7, 0x64,\n                                                   0x15, 0xf7, 0x26, 0xcb, 0xc1, 0xcd, 0xdf, 0xd7,\n                                                   0x3c, 0xfb, 0xd, 0xfb, 0x30, 0x27, 0x5d, 0x4f,\n                                                   0x57, 0x3d, 0xab, 0xf7, 0x3e, 0x1e, 0xe, 0x8b,\n                                                   0xef, 0xf8, 0xbf, 0xd3, 0x12, 0xf7, 0x71, 0xeb,\n                                                   0x31, 0xdc, 0xec, 0xe2, 0x13, 0xd8, 0xf7, 0x77,\n                                                   0xf7, 0x44, 0x15, 0xdc, 0x6, 0x8d, 0xed, 0x97,\n                                                   0x9a, 0xce, 0xc8, 0x8, 0xc6, 0xc2, 0xb7, 0xb4,\n                                                   0xdc, 0x1a, 0xf7, 0x4, 0x30, 0xe3, 0xfb, 0x16,\n                                                   0x26, 0xfb, 0x6, 0x33, 0xfb, 0xa, 0x1e, 0xd8,\n                                                   0x81, 0x5, 0xe0, 0x99, 0xb4, 0xc6, 0xdf, 0x1b,\n                                                   0xd8, 0xc3, 0x4d, 0x49, 0x59, 0x6f, 0x6e, 0x62,\n                                                   0x66, 0x1f, 0x38, 0x40, 0x6c, 0x67, 0x90, 0xfb,\n                                                   0x10, 0x8, 0x13, 0xe8, 0x85, 0xfb, 0x44, 0x15,\n                                                   0xeb, 0xef, 0x2b, 0x6, 0xe, 0x3b, 0xfb, 0x5d,\n                                                   0xd3, 0xf8, 0xbf, 0xee, 0x12, 0xe6, 0xe5, 0xe0,\n                                                   0xef, 0x31, 0xdf, 0xe0, 0xdd, 0x13, 0xec, 0xf7,\n                                                   0xa8, 0xf7, 0xea, 0x15, 0x89, 0x29, 0x85, 0x86,\n                                                   0x46, 0x4e, 0x8, 0x4d, 0x54, 0x5d, 0x5c, 0x3a,\n                                                   0x1a, 0xfb, 0x4, 0xea, 0x37, 0xf7, 0x1b, 0xcc,\n                                                   0xf7, 0x21, 0xb8, 0xf7, 0x37, 0x1e, 0x39, 0x95,\n                                                   0x5, 0x3f, 0x8c, 0x63, 0x45, 0x35, 0x1b, 0x3b,\n                                                   0x50, 0xc5, 0xcd, 0xbd, 0xa9, 0xae, 0xb5, 0xb0,\n                                                   0x1f, 0xe1, 0xd6, 0xa5, 0xa5, 0x86, 0xf7, 0x10,\n                                                   0x8, 0x13, 0xf4, 0x2d, 0xdf, 0x15, 0xef, 0xee,\n                                                   0x27, 0x6, 0xe, 0xfb, 0xe4, 0xf8, 0x78, 0x76,\n                                                   0xf7, 0x93, 0x77, 0x1, 0xd1, 0xd8, 0xc8, 0xd8,\n                                                   0x3, 0xf7, 0x74, 0xf8, 0x63, 0x5c, 0xa, 0xfb,\n                                                   0xe, 0xfb, 0x1e, 0x5c, 0xa, 0xe, 0xfb, 0xfa,\n                                                   0xfb, 0x14, 0x76, 0xf7, 0x22, 0xf7, 0x5, 0x1,\n                                                   0xdb, 0xbb, 0xf7, 0xb, 0xbb, 0x3, 0xad, 0x84,\n                                                   0x48, 0xa, 0xf7, 0x3b, 0xfb, 0x5, 0x48, 0xa,\n                                                   0xe, 0xfb, 0xfa, 0xf8, 0x6a, 0xf7, 0x6, 0xf7,\n                                                   0x21, 0x77, 0x1, 0xb1, 0xbb, 0xf7, 0xb, 0xbb,\n                                                   0x3, 0xf7, 0x61, 0xf8, 0x6a, 0x47, 0xa, 0xfb,\n                                                   0x3b, 0x2f, 0x47, 0xa, 0xe, 0xfb, 0xfa, 0xf8,\n                                                   0x78, 0x76, 0xf7, 0x21, 0xf7, 0x6, 0x12, 0xdb,\n                                                   0xbb, 0xf7, 0xb, 0xbb, 0x17, 0xbb, 0xf8, 0x63,\n                                                   0x15, 0x13, 0xf0, 0x4d, 0xa, 0xf7, 0x51, 0x69,\n                                                   0x15, 0x13, 0x50, 0x4d, 0xa, 0xe, 0xfc, 0x69,\n                                                   0xf8, 0x6a, 0xef, 0xf7, 0x2f, 0x77, 0x1, 0xcc,\n                                                   0xba, 0x3, 0xcc, 0xf8, 0x6a, 0x15, 0xe8, 0xef,\n                                                   0x5d, 0x6, 0x8c, 0xa7, 0x90, 0xd3, 0xbe, 0xa0,\n                                                   0x75, 0xad, 0x18, 0x3b, 0x67, 0x89, 0x2f, 0x5a,\n                                                   0x1a, 0xe, 0xfc, 0x69, 0xf8, 0x78, 0x76, 0x1,\n                                                   0xf7, 0x2, 0xba, 0x3, 0xd6, 0xf8, 0x63, 0x15,\n                                                   0xdb, 0xaf, 0x8d, 0xd6, 0xbc, 0x1a, 0xea, 0x2e,\n                                                   0xfb, 0x9, 0xb9, 0x7, 0x8a, 0x6f, 0x86, 0x54,\n                                                   0x58, 0x76, 0x8, 0xe, 0xfc, 0x69, 0x85, 0xf7,\n                                                   0x4, 0x1, 0xf7, 0x1, 0xbb, 0x3, 0xca, 0x85,\n                                                   0x15, 0xb9, 0x6, 0x8a, 0x6f, 0x87, 0x4f, 0x58,\n                                                   0x76, 0xa1, 0x69, 0x18, 0xdb, 0xaf, 0x8d, 0xdb,\n                                                   0xbc, 0x1a, 0xe5, 0x2d, 0x7, 0xe, 0xfc, 0x88,\n                                                   0xf8, 0x78, 0x76, 0xf7, 0x93, 0x77, 0x1, 0xc6,\n                                                   0xd4, 0x3, 0xdb, 0xf8, 0x63, 0x15, 0xa9, 0x6,\n                                                   0xa1, 0xf7, 0x1e, 0x5, 0xf7, 0x9, 0x42, 0xfb,\n                                                   0x9, 0x7, 0xe, 0xfb, 0xfa, 0xa0, 0x76, 0xf8,\n                                                   0x55, 0xe4, 0x12, 0x85, 0xe3, 0x17, 0xd8, 0x16,\n                                                   0xe3, 0xf7, 0xac, 0x6, 0xd7, 0x9b, 0xe8, 0xc3,\n                                                   0xa2, 0xa0, 0x8a, 0x78, 0xa0, 0x1e, 0xa9, 0xdd,\n                                                   0x5, 0x92, 0x82, 0x78, 0x9f, 0x5e, 0x1b, 0x4c,\n                                                   0x7a, 0x5f, 0x63, 0x77, 0x1f, 0x13, 0xe0, 0x89,\n                                                   0xd4, 0x3b, 0x6, 0xe, 0xb9, 0x78, 0xca, 0xf7,\n                                                   0xab, 0xc3, 0xf7, 0xe, 0xc2, 0xf7, 0xa, 0xca,\n                                                   0x1, 0x7d, 0xca, 0xf7, 0x2e, 0xcd, 0xf7, 0x49,\n                                                   0xd2, 0xf7, 0x3c, 0xca, 0x3, 0xf7, 0x5f, 0xf7,\n                                                   0x2a, 0x15, 0xcd, 0xf7, 0x41, 0xb3, 0x6, 0xc0,\n                                                   0x9e, 0x76, 0x33, 0xbd, 0x1f, 0xb0, 0x4b, 0x5,\n                                                   0xdc, 0x6, 0x59, 0xda, 0x58, 0xdc, 0x7a, 0x97,\n                                                   0x73, 0x95, 0x19, 0x9d, 0xeb, 0x94, 0xef, 0xec,\n                                                   0x2a, 0x9d, 0x3c, 0x1f, 0xfb, 0x22, 0x6, 0xcd,\n                                                   0xfb, 0x45, 0x15, 0xf7, 0xe, 0xd7, 0x7, 0xb4,\n                                                   0xcb, 0x8b, 0x4f, 0x4d, 0x41, 0x8b, 0x6c, 0x1f,\n                                                   0xfb, 0xfb, 0x78, 0x15, 0xfb, 0x66, 0xf7, 0x41,\n                                                   0xfb, 0x3d, 0xf7, 0x68, 0xf7, 0x68, 0xf7, 0x3d,\n                                                   0xf7, 0x3e, 0xf7, 0x65, 0xf7, 0x65, 0xfb, 0x3f,\n                                                   0xf7, 0x3c, 0xfb, 0x66, 0xfb, 0x66, 0xfb, 0x43,\n                                                   0xfb, 0x3b, 0xfb, 0x66, 0x1e, 0xca, 0x16, 0xf7,\n                                                   0x42, 0xf7, 0x25, 0xf7, 0x20, 0xf7, 0x44, 0xf7,\n                                                   0x44, 0xf7, 0x23, 0xfb, 0x20, 0xfb, 0x42, 0xfb,\n                                                   0x43, 0xfb, 0x23, 0xfb, 0x21, 0xfb, 0x44, 0xfb,\n                                                   0x44, 0xfb, 0x25, 0xf7, 0x21, 0xf7, 0x43, 0x1e,\n                                                   0xe, 0xfb, 0xfa, 0xf8, 0xd0, 0xb1, 0xf7, 0x0,\n                                                   0xb1, 0x1, 0xd6, 0xb1, 0xf7, 0x0, 0xb1, 0x3,\n                                                   0xd6, 0xf9, 0x2e, 0x15, 0x57, 0xb3, 0x61, 0xbe,\n                                                   0xbf, 0xb4, 0xb5, 0xbf, 0xbe, 0x62, 0xb2, 0x57,\n                                                   0x58, 0x63, 0x64, 0x58, 0x1e, 0xb1, 0x16, 0xa6,\n                                                   0xa1, 0xa4, 0xaa, 0xab, 0xa2, 0x74, 0x6e, 0x6c,\n                                                   0x73, 0x72, 0x6c, 0x6f, 0x72, 0xa1, 0xad, 0x1e,\n                                                   0xe, 0xfb, 0x53, 0x7c, 0xd3, 0xf8, 0x2d, 0xd3,\n                                                   0x1, 0xc8, 0xe0, 0xf7, 0x78, 0xe5, 0x3, 0xab,\n                                                   0xf7, 0x2f, 0x15, 0x57, 0x94, 0xa3, 0xfb, 0xa,\n                                                   0xf7, 0x50, 0x1b, 0xf7, 0x1b, 0xd7, 0xd3, 0xe1,\n                                                   0xf6, 0x3f, 0xa9, 0xfb, 0x1c, 0xae, 0x1f, 0x36,\n                                                   0xa1, 0x66, 0x91, 0xb7, 0x1a, 0xc6, 0xd2, 0x9f,\n                                                   0xae, 0xae, 0xd5, 0x83, 0x6c, 0xa, 0xf6, 0xfb,\n                                                   0x4a, 0x1b, 0xfb, 0x11, 0x49, 0x44, 0x3b, 0xfb,\n                                                   0x0, 0xf1, 0x73, 0xda, 0x78, 0x1f, 0xf7, 0x2,\n                                                   0x70, 0xb1, 0x73, 0x61, 0x1a, 0x68, 0x6c, 0x58,\n                                                   0x30, 0x38, 0x62, 0xb5, 0xd0, 0x82, 0x1e, 0xe,\n                                                   0xfb, 0x53, 0x7c, 0xd3, 0xf8, 0x22, 0xd3, 0xf7,\n                                                   0x63, 0x77, 0x1, 0xb9, 0xe0, 0xf7, 0x87, 0xe5,\n                                                   0x3, 0xab, 0xf7, 0x2c, 0x15, 0x57, 0x94, 0xa3,\n                                                   0xfb, 0x7, 0xf7, 0x50, 0x1b, 0xf7, 0x1b, 0xd7,\n                                                   0xd0, 0xe1, 0xf6, 0x40, 0x9c, 0xfb, 0x1c, 0xae,\n                                                   0x1f, 0x36, 0xa1, 0x66, 0xa2, 0xb7, 0x1a, 0xc6,\n                                                   0xd2, 0x93, 0xae, 0xae, 0xd5, 0x85, 0x6c, 0xa,\n                                                   0xf4, 0xfb, 0x4a, 0x1b, 0xfb, 0x11, 0x49, 0x46,\n                                                   0x3b, 0xfb, 0x0, 0xf1, 0x70, 0xda, 0x78, 0x1f,\n                                                   0xf7, 0x2, 0x70, 0xb0, 0x7c, 0x61, 0x1a, 0x68,\n                                                   0x6d, 0x5b, 0x30, 0x38, 0x61, 0xb2, 0xd0, 0x82,\n                                                   0x1e, 0xe2, 0xf8, 0x44, 0x37, 0xa, 0xfb, 0x53,\n                                                   0xd4, 0xf9, 0xa4, 0xd2, 0x1, 0xd4, 0x7a, 0x15,\n                                                   0xfb, 0x10, 0x9b, 0xe6, 0x59, 0xf4, 0x1b, 0xf7,\n                                                   0x9, 0xd7, 0xd0, 0xe4, 0xd8, 0x4f, 0xb8, 0x79,\n                                                   0x99, 0x1f, 0xb5, 0x9c, 0xd1, 0x98, 0xe7, 0x1a,\n                                                   0xe7, 0x3f, 0xc6, 0x27, 0xc6, 0x1e, 0x49, 0xb3,\n                                                   0x2d, 0xbf, 0xc4, 0x1a, 0xb2, 0xaa, 0xb6, 0xc8,\n                                                   0xe0, 0x9e, 0x46, 0x66, 0x92, 0x1e, 0xe6, 0x95,\n                                                   0x5, 0xf7, 0x8, 0xfb, 0x15, 0xbe, 0x47, 0xfb,\n                                                   0x14, 0x52, 0x32, 0x4b, 0x50, 0xb0, 0x68, 0xa7,\n                                                   0x73, 0x1e, 0x3f, 0x74, 0x69, 0x4f, 0x54, 0x1a,\n                                                   0x2a, 0xe2, 0x55, 0xda, 0x5c, 0x1e, 0xda, 0x5a,\n                                                   0xb0, 0x6f, 0xa2, 0x79, 0x8, 0xaf, 0x6f, 0x91,\n                                                   0x76, 0x77, 0x1a, 0x6d, 0x73, 0x55, 0x3a, 0x28,\n                                                   0x7b, 0xd5, 0xb2, 0x82, 0x1e, 0xf7, 0x57, 0xf7,\n                                                   0x20, 0x15, 0x78, 0x99, 0x6f, 0x9c, 0x4b, 0xb0,\n                                                   0x8, 0x3b, 0xba, 0x60, 0xa5, 0xbf, 0x1a, 0xbf,\n                                                   0xba, 0xb0, 0xa6, 0x9a, 0x1e, 0xa3, 0x77, 0xab,\n                                                   0x76, 0xb5, 0x71, 0x8, 0xd9, 0x5b, 0xc3, 0x62,\n                                                   0x58, 0x1a, 0x70, 0x79, 0x67, 0x55, 0x70, 0x1e,\n                                                   0xe, 0xfc, 0x31, 0xfb, 0x12, 0x76, 0xf8, 0xc8,\n                                                   0xee, 0x1, 0xe3, 0xf2, 0x3, 0xe3, 0x85, 0x15,\n                                                   0xc8, 0x6, 0x8a, 0x61, 0x7d, 0x62, 0x5c, 0x76,\n                                                   0xa3, 0x66, 0x18, 0xd2, 0xa4, 0x94, 0xdd, 0xad,\n                                                   0x1a, 0xee, 0x24, 0x7, 0xf7, 0xd8, 0x4, 0xf2,\n                                                   0xee, 0x24, 0x6, 0xe, 0xa0, 0x76, 0xf9, 0xa,\n                                                   0xdc, 0x1, 0xf7, 0x23, 0xe9, 0x3, 0xf7, 0x23,\n                                                   0x16, 0xe9, 0x6, 0xa2, 0xf7, 0xcc, 0xf7, 0x54,\n                                                   0xf7, 0x85, 0xd2, 0xd2, 0x8, 0xcb, 0xfc, 0x7a,\n                                                   0x3a, 0xf8, 0x3, 0x7, 0xfb, 0x3b, 0xfb, 0x46,\n                                                   0x2f, 0xfb, 0x9e, 0x89, 0xfb, 0x37, 0x8, 0xe,\n                                                   0x78, 0xd2, 0xf7, 0xd8, 0xd7, 0xf7, 0x48, 0xd2,\n                                                   0x1, 0xc4, 0xf3, 0xf7, 0x9d, 0xe7, 0x3, 0xf7,\n                                                   0x14, 0xf7, 0xfa, 0x15, 0xf7, 0x4, 0xb3, 0xf7,\n                                                   0x36, 0xf7, 0xd, 0xed, 0xa3, 0x36, 0x70, 0x91,\n                                                   0x1e, 0xe5, 0x93, 0x5, 0xf7, 0x1b, 0x78, 0xfb,\n                                                   0x6, 0xb3, 0x36, 0x1b, 0xfb, 0x88, 0x84, 0xfb,\n                                                   0xb4, 0x30, 0xfb, 0x43, 0xb6, 0xfb, 0x3c, 0xf7,\n                                                   0x64, 0xf7, 0x2d, 0xd7, 0xf7, 0xa, 0xf7, 0xa,\n                                                   0xf7, 0x20, 0xfb, 0x6, 0xea, 0xfb, 0x7, 0x40,\n                                                   0x5d, 0x69, 0x4f, 0x65, 0x1f, 0x97, 0xfb, 0x1c,\n                                                   0x15, 0xf1, 0xd8, 0xbf, 0xd1, 0xe3, 0xbc, 0x45,\n                                                   0x32, 0x38, 0x5b, 0x39, 0x32, 0x31, 0x52, 0xdc,\n                                                   0xe4, 0x1e, 0xe, 0xfc, 0x31, 0x8d, 0x76, 0x1,\n                                                   0x7a, 0xf7, 0xcc, 0x3, 0x7a, 0x78, 0x15, 0xd2,\n                                                   0x6, 0xf7, 0x85, 0xf9, 0x88, 0x5, 0x4c, 0x6,\n                                                   0xe, 0xfc, 0x31, 0xe, 0x7b, 0xda, 0x6a, 0xd3,\n                                                   0xf7, 0x6c, 0xd2, 0xf7, 0x96, 0xd2, 0x12, 0xe8,\n                                                   0xe3, 0x67, 0xe7, 0x13, 0x78, 0xac, 0xd0, 0x15,\n                                                   0xac, 0x37, 0x5, 0xa7, 0xb5, 0xc4, 0x9c, 0xbb,\n                                                   0x1b, 0x13, 0xb8, 0xca, 0xe3, 0x5d, 0xc7, 0x1b,\n                                                   0xb5, 0xab, 0x98, 0x9c, 0xb4, 0x1f, 0x6f, 0xdb,\n                                                   0x5, 0x83, 0x7a, 0x64, 0x74, 0x68, 0x1b, 0x13,\n                                                   0x74, 0x43, 0x54, 0xb2, 0x41, 0x1b, 0x6d, 0x73,\n                                                   0x85, 0x86, 0x7e, 0x1f, 0x89, 0x8d, 0x5, 0xbb,\n                                                   0xbc, 0xb2, 0xca, 0xd1, 0x1a, 0xa0, 0x86, 0x95,\n                                                   0x86, 0x97, 0x1e, 0xf7, 0x1b, 0xd2, 0xfb, 0x2a,\n                                                   0x6, 0x13, 0xb8, 0x7e, 0xb1, 0x79, 0xbf, 0xb0,\n                                                   0x1a, 0xc6, 0xbd, 0xd3, 0xd8, 0xc9, 0xc2, 0x60,\n                                                   0x39, 0x95, 0x1e, 0xe1, 0x98, 0x5, 0xf7, 0x4,\n                                                   0x84, 0x26, 0xd2, 0x22, 0x1b, 0x20, 0xfb, 0x0,\n                                                   0x4c, 0xfb, 0x1f, 0x67, 0x92, 0x6d, 0x9c, 0x4e,\n                                                   0x1f, 0x42, 0x44, 0xe8, 0x6, 0x13, 0xb4, 0x8f,\n                                                   0x7b, 0x8f, 0x7c, 0x6e, 0x1a, 0xfb, 0xc, 0x34,\n                                                   0x54, 0x72, 0x7d, 0x1e, 0xe, 0xfc, 0x31, 0x99,\n                                                   0x76, 0xf8, 0x52, 0xcf, 0xf7, 0x36, 0x77, 0x1,\n                                                   0xdc, 0xe3, 0x3, 0xf7, 0x95, 0x8c, 0x15, 0x7f,\n                                                   0xd9, 0x5, 0x54, 0x7e, 0x76, 0x93, 0xd4, 0x1a,\n                                                   0xf7, 0xb8, 0xe3, 0xcf, 0x33, 0xf7, 0x36, 0x7,\n                                                   0x33, 0x56, 0x5, 0xfb, 0x1, 0x48, 0x47, 0xce,\n                                                   0xfb, 0xb8, 0x7, 0x35, 0x90, 0x47, 0xf7, 0x6,\n                                                   0xa8, 0x98, 0x90, 0x8e, 0x9a, 0x1e, 0xe, 0xfb,\n                                                   0x4e, 0x76, 0xf7, 0x57, 0xd4, 0xf8, 0x20, 0xd4,\n                                                   0xf7, 0x50, 0x77, 0x12, 0xc5, 0xda, 0x3c, 0xe3,\n                                                   0xf7, 0xad, 0xe5, 0x13, 0xf6, 0xf7, 0x26, 0xc1,\n                                                   0x15, 0x6c, 0xa8, 0xaf, 0x68, 0xd6, 0x1b, 0xf7,\n                                                   0x2, 0xf7, 0xd, 0xdd, 0xf7, 0x4e, 0xf7, 0x25,\n                                                   0x37, 0xf7, 0x15, 0xfb, 0x27, 0x3c, 0x6d, 0x6a,\n                                                   0x6a, 0x6c, 0x1f, 0xf7, 0x92, 0x33, 0xfe, 0x31,\n                                                   0xe3, 0x7, 0x13, 0xfa, 0x82, 0xf8, 0x63, 0x15,\n                                                   0xf7, 0xd, 0xcc, 0xdb, 0xdf, 0xcd, 0xd6, 0x53,\n                                                   0xfb, 0x25, 0xfb, 0x3e, 0x32, 0x72, 0x57, 0x4f,\n                                                   0x32, 0xb2, 0xf7, 0x30, 0x1e, 0xe, 0x78, 0xd2,\n                                                   0xf8, 0xd8, 0xd2, 0x1, 0xf8, 0x29, 0xe9, 0x3,\n                                                   0xad, 0xf7, 0x47, 0x15, 0x28, 0x95, 0xd8, 0x28,\n                                                   0xf7, 0x2b, 0x1b, 0xf7, 0x13, 0xf7, 0xf, 0xdd,\n                                                   0xf7, 0x1e, 0xd2, 0x4f, 0xf0, 0x3b, 0x1f, 0x8d,\n                                                   0x7, 0xe4, 0xb0, 0x99, 0xd2, 0xb0, 0x1a, 0xf1,\n                                                   0x30, 0xdc, 0xfb, 0x12, 0x3d, 0xfb, 0xa, 0x6a,\n                                                   0xfb, 0x2a, 0x6e, 0x1e, 0xe7, 0x7b, 0x5, 0xd1,\n                                                   0x96, 0xb3, 0xc5, 0xdf, 0x1b, 0xc5, 0xca, 0x66,\n                                                   0x40, 0x24, 0xfb, 0x6, 0x77, 0x57, 0x90, 0x1f,\n                                                   0x80, 0x3f, 0x5, 0xf4, 0xad, 0xf4, 0x51, 0x24,\n                                                   0x1a, 0x38, 0x48, 0x4b, 0x36, 0xfb, 0x9, 0x75,\n                                                   0xf3, 0xae, 0x84, 0x1e, 0xe, 0xf7, 0x23, 0x8d,\n                                                   0x76, 0xdc, 0xbe, 0xf7, 0x77, 0xc2, 0xf7, 0x6,\n                                                   0xf7, 0x56, 0x56, 0xc0, 0x12, 0xf7, 0x8f, 0xd7,\n                                                   0x50, 0xd7, 0xf7, 0xec, 0xd1, 0x13, 0xf3, 0xf8,\n                                                   0x89, 0xc9, 0x15, 0xf7, 0x4f, 0x43, 0xd1, 0xd3,\n                                                   0xbf, 0xbe, 0x57, 0xf7, 0x78, 0x4f, 0x6, 0xfb,\n                                                   0x59, 0xfb, 0x71, 0x5, 0xd6, 0x84, 0x15, 0xf7,\n                                                   0x4, 0xf7, 0x10, 0x5, 0xfb, 0x10, 0x7, 0xfd,\n                                                   0x17, 0xf7, 0xdc, 0x15, 0x51, 0x97, 0xae, 0x60,\n                                                   0xee, 0x1b, 0xef, 0xc0, 0xc1, 0xc2, 0xbd, 0x68,\n                                                   0xa7, 0x5a, 0x96, 0x1f, 0x8d, 0x7, 0x13, 0xed,\n                                                   0xbb, 0x97, 0x9e, 0xa3, 0xab, 0x1a, 0xe3, 0xfb,\n                                                   0x8, 0x92, 0x78, 0x31, 0x70, 0x68, 0x54, 0x75,\n                                                   0x1e, 0xd1, 0x80, 0x5, 0xa7, 0x96, 0x99, 0x9f,\n                                                   0xb7, 0x1b, 0xb5, 0x9c, 0x77, 0x75, 0x63, 0x59,\n                                                   0x83, 0x70, 0x1f, 0x13, 0xf3, 0x81, 0x58, 0x5,\n                                                   0xc1, 0x8d, 0xbd, 0x7d, 0x5b, 0x1a, 0x65, 0x69,\n                                                   0x7b, 0x60, 0x53, 0x7e, 0xae, 0x9d, 0x85, 0x1e,\n                                                   0xa5, 0xfc, 0x67, 0x15, 0xd8, 0x6, 0xf8, 0xaf,\n                                                   0xf9, 0x66, 0x5, 0x3f, 0x6, 0xe, 0xfb, 0xfa,\n                                                   0xf7, 0xa2, 0xcd, 0xf7, 0xc4, 0xca, 0x1, 0xf7,\n                                                   0x76, 0xdc, 0x3, 0x90, 0xf8, 0x1c, 0x15, 0x46,\n                                                   0x98, 0xb1, 0x56, 0xf5, 0x1b, 0xf5, 0xc4, 0xcc,\n                                                   0xcd, 0xc7, 0x66, 0xac, 0x56, 0x98, 0x1f, 0x8d,\n                                                   0x7, 0xbf, 0x9a, 0x9f, 0xa8, 0xb0, 0x1a, 0xf4,\n                                                   0xfb, 0x11, 0x93, 0x77, 0x2b, 0x6f, 0x62, 0x49,\n                                                   0x74, 0x1e, 0xd5, 0x7f, 0x5, 0xab, 0x97, 0x99,\n                                                   0xa3, 0xba, 0x1b, 0xb8, 0x9e, 0x73, 0x71, 0x5b,\n                                                   0x55, 0x82, 0x6f, 0x1f, 0x80, 0x4e, 0x5, 0xc5,\n                                                   0x8c, 0xc0, 0x7c, 0x52, 0x1a, 0x5e, 0x67, 0x77,\n                                                   0x5d, 0x4f, 0x7c, 0xb6, 0xa0, 0x85, 0x1e, 0xe,\n                                                   0xfb, 0xfa, 0xf9, 0x37, 0xba, 0x1, 0x87, 0xf8,\n                                                   0xf2, 0x15, 0xce, 0x6, 0xbb, 0xad, 0x8b, 0x8f,\n                                                   0xa0, 0x9f, 0x81, 0x80, 0x9f, 0x1e, 0x7f, 0xa2,\n                                                   0xa2, 0x7d, 0xa2, 0x1b, 0xa1, 0xdf, 0x91, 0xf7,\n                                                   0x1, 0x1f, 0x49, 0x6, 0x68, 0x87, 0x7c, 0x7f,\n                                                   0x76, 0x1b, 0x78, 0x7b, 0x92, 0x94, 0x7c, 0x1f,\n                                                   0x98, 0x73, 0x74, 0x9c, 0x6a, 0x1b, 0x59, 0x54,\n                                                   0x66, 0x3d, 0x1f, 0xe, 0xf7, 0xc9, 0xf7, 0xdb,\n                                                   0x76, 0xf7, 0xf5, 0xc6, 0x1, 0xf7, 0x5b, 0xcd,\n                                                   0xf7, 0x8b, 0xc8, 0xf7, 0xa1, 0xc8, 0x3, 0xf7,\n                                                   0x5b, 0xf7, 0xc6, 0x15, 0xcd, 0xf7, 0xf5, 0xf7,\n                                                   0x2f, 0xc6, 0xfc, 0xa, 0x50, 0xf7, 0x2d, 0x6,\n                                                   0xf7, 0xcd, 0xfb, 0xf5, 0x15, 0xc8, 0xf7, 0xf5,\n                                                   0x8d, 0x6, 0xf4, 0xfb, 0xf5, 0x5, 0xc7, 0x6,\n                                                   0xef, 0xf7, 0xf0, 0x5, 0x8d, 0xfb, 0xf0, 0xc8,\n                                                   0xf8, 0x30, 0x2b, 0x6, 0x2b, 0xfb, 0xe0, 0x5,\n                                                   0x89, 0x6, 0x28, 0xf7, 0xe0, 0x5, 0x29, 0x6,\n                                                   0xe, 0x8b, 0xde, 0xf8, 0xbc, 0xd4, 0x1, 0xf8,\n                                                   0x32, 0xe6, 0x3, 0xa5, 0x16, 0xf8, 0x75, 0xde,\n                                                   0xfb, 0xfa, 0x6, 0x97, 0x9e, 0x97, 0xa3, 0xdb,\n                                                   0xc9, 0x8, 0xf7, 0x25, 0xf7, 0x4, 0xf6, 0xf5,\n                                                   0xf1, 0x1a, 0xe1, 0x4c, 0xf7, 0x1, 0xfb, 0x38,\n                                                   0xfb, 0xe, 0x2b, 0x49, 0xfb, 0x1c, 0x7d, 0x1e,\n                                                   0xe6, 0x81, 0x5, 0xf7, 0x20, 0x8c, 0xf7, 0x11,\n                                                   0x8a, 0x9a, 0x1b, 0xda, 0xc4, 0x5a, 0x44, 0x37,\n                                                   0xfb, 0x0, 0x2d, 0x3d, 0x4f, 0x1f, 0x38, 0x4a,\n                                                   0xfb, 0xb, 0x2d, 0xfb, 0x5, 0x1a, 0xe, 0xfb,\n                                                   0xfa, 0xf7, 0xa0, 0xcd, 0xf7, 0xc7, 0xc9, 0x1,\n                                                   0xf7, 0x84, 0xdb, 0x3, 0x8f, 0xf7, 0xad, 0x15,\n                                                   0xf7, 0xd3, 0xcd, 0xfb, 0x5d, 0x6, 0x95, 0x96,\n                                                   0x95, 0x95, 0xc5, 0xbb, 0x8, 0xd3, 0xc4, 0xbb,\n                                                   0xa8, 0xd3, 0x1a, 0xf7, 0x4, 0x2b, 0x9c, 0x54,\n                                                   0xfb, 0x11, 0x77, 0x38, 0x64, 0x81, 0x1e, 0xd5,\n                                                   0x83, 0x5, 0xab, 0x95, 0x95, 0xaf, 0xc4, 0x1b,\n                                                   0xb6, 0xab, 0x70, 0x63, 0x65, 0x72, 0x78, 0x3d,\n                                                   0x4b, 0x1f, 0x47, 0x55, 0x50, 0x53, 0x85, 0x4d,\n                                                   0x8, 0xe, 0x7c, 0xd7, 0x63, 0x76, 0xf8, 0x9f,\n                                                   0x77, 0x4e, 0xa, 0x13, 0x78, 0xf8, 0x2e, 0x16,\n                                                   0xda, 0xf8, 0x9f, 0x33, 0xfb, 0xb8, 0x6, 0x13,\n                                                   0xb8, 0x33, 0x5b, 0x39, 0x30, 0x36, 0x76, 0xd9,\n                                                   0xe3, 0x1e, 0xf7, 0xbc, 0x33, 0xfb, 0xda, 0x7,\n                                                   0xfb, 0x8, 0xca, 0x2b, 0xf7, 0x17, 0xa4, 0xcc,\n                                                   0x91, 0xe0, 0xc3, 0x1e, 0x8d, 0x6, 0xe, 0x79,\n                                                   0xa, 0xf8, 0xec, 0xf7, 0x1d, 0x34, 0xa, 0xfb,\n                                                   0x4f, 0xf8, 0xa0, 0x2f, 0xa, 0xe, 0x79, 0xa,\n                                                   0xf9, 0x75, 0x77, 0x34, 0xa, 0xfb, 0xb2, 0xf8,\n                                                   0xa0, 0x2c, 0xa, 0xe, 0x79, 0xa, 0xf8, 0xf5,\n                                                   0xef, 0x12, 0xcf, 0xe3, 0x7e, 0xe5, 0xe6, 0xe5,\n                                                   0x7e, 0xe3, 0x3c, 0xda, 0x13, 0x71, 0xf8, 0x2e,\n                                                   0x88, 0x15, 0xda, 0xf8, 0x9c, 0x6, 0x13, 0xb2,\n                                                   0x33, 0xfb, 0xa8, 0x6, 0x32, 0xa, 0x1e, 0x13,\n                                                   0x69, 0x65, 0xa, 0x1f, 0xfb, 0x9f, 0xf8, 0xa9,\n                                                   0x31, 0xa, 0x13, 0xb4, 0xf7, 0x49, 0x72, 0xa,\n                                                   0x79, 0xa, 0xf8, 0xec, 0xf7, 0x1d, 0x3d, 0xa,\n                                                   0x33, 0x6, 0x13, 0xb8, 0xfb, 0xa8, 0x7, 0x32,\n                                                   0xa, 0x65, 0xa, 0x1e, 0x13, 0xb4, 0xfb, 0x28,\n                                                   0xf8, 0xa0, 0x5e, 0xa, 0xfb, 0x11, 0xbd, 0x1,\n                                                   0x40, 0x4, 0x59, 0xf8, 0xc0, 0xbd, 0x7, 0xe,\n                                                   0xfb, 0x53, 0x68, 0xa, 0xf7, 0x64, 0x16, 0xdd,\n                                                   0x6, 0xf7, 0x5e, 0xf8, 0x9f, 0x5, 0x31, 0x6,\n                                                   0xfb, 0x2d, 0xfc, 0x38, 0xfb, 0x28, 0xf8, 0x38,\n                                                   0x5, 0x2e, 0x6, 0xe, 0xaa, 0x68, 0xa, 0xf7,\n                                                   0x41, 0x16, 0xe7, 0x6, 0xe9, 0xf8, 0x28, 0x5,\n                                                   0x8d, 0x6, 0xf1, 0xfc, 0x28, 0x5, 0xe6, 0x6,\n                                                   0xf7, 0x2f, 0xf8, 0x9f, 0x5, 0x35, 0x6, 0xfb,\n                                                   0x2, 0xfc, 0x28, 0x5, 0x89, 0x6, 0x25, 0xf8,\n                                                   0x28, 0x5, 0x31, 0x6, 0x26, 0xfc, 0x33, 0xfb,\n                                                   0x5, 0xf8, 0x33, 0x5, 0x30, 0x6, 0xe, 0xfb,\n                                                   0x53, 0x68, 0xa, 0x96, 0x16, 0xf4, 0x6, 0xf7,\n                                                   0x1b, 0xf7, 0x60, 0xf7, 0x18, 0xfb, 0x60, 0x5,\n                                                   0xf6, 0x6, 0xfb, 0x52, 0xf7, 0xa6, 0xf7, 0x44,\n                                                   0xf7, 0x8d, 0x5, 0x23, 0x6, 0xfb, 0x10, 0xfb,\n                                                   0x4d, 0xfb, 0x7, 0xf7, 0x4d, 0x5, 0x20, 0x6,\n                                                   0xf7, 0x3f, 0xfb, 0x92, 0x5, 0xe, 0xfb, 0x53,\n                                                   0xfb, 0x6a, 0xdd, 0xf9, 0x23, 0x77, 0x1, 0xba,\n                                                   0xfb, 0x10, 0x15, 0x94, 0x3b, 0x55, 0xa, 0xa4,\n                                                   0xf7, 0x0, 0xf2, 0xbe, 0x1f, 0xf7, 0x5d, 0xf8,\n                                                   0xa2, 0x5, 0x32, 0x6, 0xfb, 0x28, 0xfc, 0x37,\n                                                   0x5, 0x89, 0x6, 0xfb, 0x24, 0xf8, 0x37, 0x5,\n                                                   0x2c, 0x6, 0xf7, 0x58, 0xfc, 0x9a, 0x5, 0x43,\n                                                   0x71, 0x81, 0x4a, 0x41, 0x1b, 0x76, 0x7b, 0x8f,\n                                                   0x8f, 0x7e, 0x1f, 0xe, 0xfb, 0x53, 0xfb, 0x6a,\n                                                   0xda, 0xf9, 0x70, 0xf7, 0x1d, 0x1, 0x33, 0xa,\n                                                   0xf7, 0x27, 0xf9, 0x62, 0x2f, 0xa, 0xe, 0xfb,\n                                                   0x53, 0xfb, 0x6a, 0xda, 0xf9, 0x79, 0xef, 0x1,\n                                                   0x96, 0xea, 0x94, 0xe5, 0xe6, 0xe5, 0x3, 0x33,\n                                                   0xa, 0xce, 0xf9, 0x6b, 0x2e, 0xa, 0xe, 0xa0,\n                                                   0x76, 0xf7, 0x39, 0xcf, 0xe3, 0xcf, 0xf7, 0xbf,\n                                                   0x77, 0x1, 0xf7, 0x7f, 0xe3, 0x3, 0xab, 0xf7,\n                                                   0x39, 0x15, 0xf7, 0x5f, 0xfb, 0x39, 0xe3, 0xf7,\n                                                   0x39, 0xf7, 0x5d, 0xcf, 0xfb, 0x5d, 0xe3, 0xf7,\n                                                   0x5d, 0xcf, 0xfb, 0x2f, 0x6, 0xf7, 0x4c, 0xf7,\n                                                   0xbf, 0x5, 0x23, 0x6, 0xfb, 0x40, 0xfb, 0xbf,\n                                                   0xfb, 0x44, 0xf7, 0xbf, 0x5, 0x29, 0x6, 0xf7,\n                                                   0x4d, 0xfb, 0xbf, 0x5, 0xfb, 0x30, 0x47, 0xf7,\n                                                   0x5f, 0x33, 0xfb, 0x5f, 0x6, 0xe, 0xfb, 0x53,\n                                                   0x8b, 0xd7, 0xf8, 0xb, 0xd3, 0x63, 0xa, 0xf8,\n                                                   0x1a, 0x67, 0xa, 0xfc, 0x10, 0x5, 0xe, 0xfb,\n                                                   0x53, 0x8b, 0xd7, 0xf8, 0x6, 0xd3, 0xf7, 0x6c,\n                                                   0x77, 0x63, 0xa, 0xf8, 0x15, 0x67, 0xa, 0xfc,\n                                                   0xb, 0x5, 0xf7, 0x43, 0xf8, 0xa2, 0x37, 0xa,\n                                                   0x78, 0xd2, 0xf8, 0xd8, 0xd2, 0x1, 0xbe, 0xe8,\n                                                   0xf7, 0xa6, 0xe8, 0x3, 0xb1, 0xf7, 0xec, 0x15,\n                                                   0x37, 0x92, 0xfb, 0xab, 0xf7, 0x7e, 0xf7, 0x7d,\n                                                   0x91, 0xf7, 0xb3, 0xd7, 0xd9, 0x88, 0xf7, 0xad,\n                                                   0xfb, 0x81, 0xfb, 0x71, 0x78, 0xfb, 0xaf, 0x3f,\n                                                   0x1e, 0xe7, 0x16, 0xf7, 0x21, 0xa1, 0xf7, 0x27,\n                                                   0xf7, 0x12, 0xf7, 0x1c, 0x96, 0xfb, 0x38, 0xfb,\n                                                   0x10, 0xfb, 0xd, 0x7e, 0xfb, 0x3f, 0xfb, 0x19,\n                                                   0xfb, 0x1c, 0x7e, 0xf7, 0x42, 0xf7, 0xa, 0x1e,\n                                                   0xe, 0x76, 0xa0, 0xf8, 0x9f, 0x9a, 0xf7, 0x48,\n                                                   0x9e, 0x6, 0xfb, 0x70, 0x98, 0x7, 0x1e, 0xa0,\n                                                   0x39, 0x63, 0xff, 0xc, 0x9, 0xd2, 0xa, 0xe2,\n                                                   0xb, 0xf8, 0xc0, 0x14, 0xf9, 0x47, 0x15, 0xab,\n                                                   0x13, 0x0, 0x5b, 0x2, 0x0, 0x1, 0x0, 0x7,\n                                                   0x0, 0x68, 0x0, 0x6d, 0x0, 0xbc, 0x0, 0xf0,\n                                                   0x1, 0x1e, 0x1, 0x23, 0x1, 0x4c, 0x1, 0x72,\n                                                   0x1, 0xac, 0x1, 0xd9, 0x1, 0xdf, 0x1, 0xee,\n                                                   0x2, 0xb, 0x2, 0x13, 0x2, 0x1c, 0x2, 0x34,\n                                                   0x2, 0x3a, 0x2, 0x50, 0x2, 0x84, 0x2, 0x96,\n                                                   0x2, 0x9f, 0x2, 0xa4, 0x2, 0xb4, 0x2, 0xb9,\n                                                   0x2, 0xc0, 0x2, 0xc7, 0x2, 0xee, 0x3, 0xf,\n                                                   0x3, 0x1d, 0x3, 0x24, 0x3, 0x2b, 0x3, 0x33,\n                                                   0x3, 0x3c, 0x3, 0x41, 0x3, 0x4b, 0x3, 0x54,\n                                                   0x3, 0x5c, 0x3, 0x62, 0x3, 0x78, 0x3, 0x8e,\n                                                   0x3, 0x97, 0x3, 0xa0, 0x3, 0xa5, 0x3, 0xa9,\n                                                   0x3, 0xbd, 0x3, 0xc4, 0x3, 0xcb, 0x3, 0xd3,\n                                                   0x3, 0xdc, 0x3, 0xe4, 0x3, 0xf5, 0x3, 0xff,\n                                                   0x4, 0x9, 0x4, 0x13, 0x4, 0x23, 0x4, 0x29,\n                                                   0x4, 0x2c, 0x4, 0x30, 0x4, 0x3e, 0x4, 0x4c,\n                                                   0x4, 0x59, 0x4, 0x5e, 0x4, 0x62, 0x4, 0x6c,\n                                                   0x4, 0x76, 0x4, 0x80, 0x4, 0x8c, 0x4, 0x98,\n                                                   0x4, 0x9e, 0x4, 0xa9, 0x4, 0xb4, 0x4, 0xbb,\n                                                   0x4, 0xc5, 0x4, 0xcf, 0x4, 0xd9, 0x4, 0xe3,\n                                                   0x4, 0xe7, 0x4, 0xeb, 0x4, 0xf4, 0x4, 0xfd,\n                                                   0x5, 0x6, 0x5, 0xa, 0x5, 0x11, 0x5, 0x15,\n                                                   0x5, 0x1b, 0x5, 0x21, 0x5, 0x27, 0x5, 0x2d,\n                                                   0x5, 0x32, 0x5, 0x35, 0x22, 0xa, 0x13, 0xbc,\n                                                   0x28, 0xa, 0x15, 0x2b, 0xa9, 0x2e, 0xc6, 0x44,\n                                                   0x1e, 0x46, 0xc6, 0xd7, 0x5c, 0xf7, 0x7, 0x1b,\n                                                   0xf7, 0x4f, 0xf7, 0x2b, 0xf7, 0x1a, 0xf7, 0x86,\n                                                   0x8e, 0x1f, 0xf6, 0x64, 0xf1, 0x52, 0xcf, 0x1e,\n                                                   0xd0, 0x53, 0x32, 0xb2, 0x27, 0x1b, 0x2c, 0x32,\n                                                   0x6a, 0x4a, 0x52, 0x1f, 0x53, 0x4a, 0x61, 0x24,\n                                                   0xfb, 0xb, 0x1a, 0xef, 0x16, 0xc0, 0x9c, 0xdd,\n                                                   0xb3, 0xc7, 0x1e, 0xc8, 0xb3, 0xbe, 0xb7, 0xe6,\n                                                   0x1b, 0xca, 0xcb, 0x73, 0x58, 0xb3, 0x1f, 0xb4,\n                                                   0x58, 0xac, 0x3a, 0x2e, 0x1a, 0x85, 0xfb, 0x61,\n                                                   0x2b, 0x35, 0xfb, 0x1f, 0x8a, 0x8, 0x40, 0x58,\n                                                   0xa9, 0xbe, 0x5f, 0x1f, 0x5f, 0xbf, 0x72, 0xd3,\n                                                   0xe2, 0x1a, 0xb, 0x24, 0xa, 0x25, 0xa, 0xb,\n                                                   0x15, 0x47, 0x9c, 0x45, 0xb2, 0x57, 0x1e, 0x57,\n                                                   0xb2, 0xbb, 0x67, 0xde, 0x1b, 0xf7, 0x24, 0xeb,\n                                                   0xec, 0xf7, 0x49, 0xee, 0x68, 0xcd, 0x5a, 0xb3,\n                                                   0x1f, 0xb4, 0x5a, 0x57, 0x9c, 0x54, 0x1b, 0x3c,\n                                                   0x5b, 0x6d, 0x5b, 0x63, 0x1f, 0x64, 0x5b, 0x77,\n                                                   0x4a, 0x43, 0x1a, 0xe5, 0x16, 0xf7, 0x27, 0x90,\n                                                   0xd2, 0xb7, 0xc7, 0x1b, 0xd2, 0xd7, 0x56, 0xfb,\n                                                   0x1e, 0x8e, 0x1f, 0x62, 0x82, 0x57, 0x73, 0x62,\n                                                   0x1e, 0x62, 0x73, 0x6d, 0x6c, 0x4c, 0x1b, 0x51,\n                                                   0x43, 0xc2, 0xf7, 0x2b, 0x85, 0x1f, 0xb, 0x15,\n                                                   0x90, 0xa0, 0x91, 0xa4, 0x9e, 0x9e, 0x8, 0x9f,\n                                                   0x9e, 0xa0, 0x99, 0xc2, 0x1b, 0xcb, 0xa1, 0x78,\n                                                   0x72, 0x9b, 0x1f, 0x9b, 0x73, 0x8a, 0x6a, 0x8a,\n                                                   0x6f, 0x54, 0x77, 0x40, 0x85, 0x79, 0x87, 0x8,\n                                                   0x60, 0x85, 0xfb, 0x2d, 0x78, 0xfb, 0x1d, 0x1a,\n                                                   0x33, 0xd9, 0x4b, 0xe8, 0xc3, 0xbb, 0x9b, 0xca,\n                                                   0xd6, 0x1e, 0xb, 0x8e, 0x7e, 0x99, 0x73, 0x9a,\n                                                   0x70, 0x8, 0xe7, 0x6, 0x6e, 0xbd, 0x7e, 0xad,\n                                                   0xf7, 0x19, 0x1a, 0xf7, 0xa, 0x7, 0x90, 0xe5,\n                                                   0x6e, 0xf3, 0xfb, 0x48, 0x8c, 0x8, 0x2b, 0x60,\n                                                   0x6f, 0x68, 0x6a, 0x1f, 0x6e, 0x68, 0x87, 0x64,\n                                                   0x85, 0x74, 0x8, 0xf7, 0xdb, 0xfb, 0x22, 0x15,\n                                                   0xb, 0xfc, 0xd0, 0x21, 0xa, 0xe, 0x99, 0x16,\n                                                   0xeb, 0x6, 0xd7, 0xf7, 0x77, 0x5, 0xf7, 0xb2,\n                                                   0x6, 0xdb, 0xfb, 0x77, 0x5, 0xf1, 0x6, 0xfb,\n                                                   0xab, 0xf9, 0x7c, 0x5, 0x2a, 0x6, 0x49, 0xfc,\n                                                   0x4b, 0x15, 0xf7, 0x4, 0xf7, 0xfd, 0x5, 0x8c,\n                                                   0x6, 0xf7, 0xb, 0xfb, 0xfd, 0x5, 0xb, 0x27,\n                                                   0x85, 0x45, 0x4c, 0x2a, 0x1b, 0x78, 0x7a, 0x92,\n                                                   0x9a, 0x7a, 0x1f, 0x7b, 0x9b, 0x84, 0x9c, 0x9e,\n                                                   0x1a, 0xae, 0x99, 0x9f, 0xa0, 0x97, 0x1e, 0xa0,\n                                                   0x97, 0x9d, 0x90, 0xa6, 0x8f, 0xbd, 0x94, 0xc7,\n                                                   0x94, 0xb1, 0x9a, 0x8, 0xe, 0x15, 0xf8, 0x2,\n                                                   0x6, 0xf7, 0x1c, 0x66, 0xd8, 0x55, 0xb0, 0x1e,\n                                                   0xb1, 0x55, 0x53, 0x90, 0x74, 0x1b, 0xfb, 0x38,\n                                                   0x8a, 0x4c, 0xfb, 0x8, 0x86, 0xfb, 0x32, 0x8,\n                                                   0x2d, 0xa, 0x7a, 0x7e, 0x3a, 0x22, 0x1b, 0x38,\n                                                   0x5d, 0xc3, 0xf7, 0x10, 0x7e, 0x1f, 0x90, 0xd3,\n                                                   0x15, 0x96, 0xce, 0xa2, 0xde, 0xf2, 0x8a, 0xec,\n                                                   0x8c, 0xab, 0x40, 0x90, 0x40, 0x8, 0xb, 0x41,\n                                                   0xa, 0xf9, 0x5d, 0x15, 0xfc, 0x2f, 0x7, 0xfb,\n                                                   0x13, 0x8f, 0xfb, 0x56, 0xf7, 0xa3, 0xf7, 0xac,\n                                                   0x95, 0xf7, 0x76, 0xea, 0x1e, 0xf8, 0x2f, 0x2c,\n                                                   0xfc, 0x2f, 0x7, 0xfb, 0x15, 0x78, 0x20, 0xfb,\n                                                   0x44, 0xfb, 0x48, 0x8b, 0xf7, 0x29, 0xe2, 0x1e,\n                                                   0xf8, 0x2f, 0x7, 0xb, 0xaa, 0x78, 0xe0, 0x2a,\n                                                   0xa, 0xb, 0x15, 0xef, 0x6, 0xc3, 0xde, 0xc0,\n                                                   0x38, 0x5, 0xef, 0x6, 0xfb, 0x2, 0x42, 0xa,\n                                                   0xb, 0x3b, 0x9f, 0x48, 0xb3, 0x5b, 0x1e, 0x5b,\n                                                   0xb4, 0xbe, 0x70, 0xdb, 0x1b, 0xcb, 0xb5, 0x9d,\n                                                   0xaa, 0xb0, 0x1f, 0xb2, 0xaa, 0xa4, 0xb5, 0x98,\n                                                   0xbc, 0x36, 0x96, 0x18, 0x6e, 0xb, 0x31, 0xa,\n                                                   0xf7, 0x49, 0x27, 0x31, 0xa, 0xb, 0x4c, 0xa,\n                                                   0xf7, 0x0, 0xf7, 0x1d, 0x38, 0xa, 0xb, 0x3,\n                                                   0xe1, 0x16, 0xf8, 0xa6, 0xe0, 0xfc, 0x47, 0xf7,\n                                                   0x90, 0xf8, 0x13, 0xe0, 0xfc, 0x13, 0xf7, 0x79,\n                                                   0xf8, 0x38, 0xe0, 0xfc, 0x97, 0x6, 0xb, 0x15,\n                                                   0xe5, 0xef, 0x31, 0x6, 0xb, 0x33, 0x6d, 0x2f,\n                                                   0x20, 0x24, 0x86, 0xdd, 0xe3, 0x1e, 0xf7, 0xb2,\n                                                   0x33, 0xfb, 0xd4, 0x7, 0xfb, 0x8, 0xcc, 0x2b,\n                                                   0xf7, 0x17, 0xb, 0xbb, 0xfb, 0xd, 0x15, 0x94,\n                                                   0x38, 0x55, 0xa, 0xa5, 0xec, 0xf2, 0xbe, 0x1f,\n                                                   0xf7, 0x5b, 0xf8, 0xa2, 0x5, 0x32, 0x6, 0xfb,\n                                                   0x27, 0xfc, 0x37, 0x5, 0x89, 0x6, 0xfb, 0x25,\n                                                   0xf8, 0x37, 0x5, 0x2c, 0x6, 0xf7, 0x59, 0xfc,\n                                                   0x9a, 0x5, 0x43, 0x71, 0x80, 0x52, 0x41, 0x1b,\n                                                   0x76, 0x7c, 0x95, 0x8f, 0x7e, 0x1f, 0xb, 0x3d,\n                                                   0xa, 0x6, 0x13, 0xb8, 0x33, 0xfb, 0xa8, 0x6,\n                                                   0x32, 0xa, 0x1e, 0x13, 0x74, 0x65, 0xa, 0x1f,\n                                                   0xb, 0x46, 0xa, 0xf9, 0x4, 0x77, 0x1, 0x27,\n                                                   0xa, 0xb, 0x6e, 0xa, 0x30, 0xa, 0xb, 0x15,\n                                                   0xe8, 0x6, 0xf5, 0x5a, 0xa, 0x27, 0x6, 0x53,\n                                                   0x38, 0x56, 0xde, 0x5, 0x27, 0x6, 0xe, 0x5,\n                                                   0xfb, 0x7, 0x6, 0xb, 0xa0, 0x76, 0xf9, 0x62,\n                                                   0x77, 0x1, 0xb, 0xf7, 0x10, 0xf8, 0xe9, 0x2c,\n                                                   0xa, 0xb, 0xe3, 0x3, 0xe4, 0x16, 0xe3, 0xf8,\n                                                   0x56, 0xf0, 0xcf, 0x26, 0xc0, 0x6, 0xc7, 0xb4,\n                                                   0xa5, 0xe0, 0x7c, 0x1e, 0x99, 0xd5, 0x5, 0x94,\n                                                   0x6f, 0x74, 0x8d, 0x74, 0x1b, 0xfb, 0x3, 0x60,\n                                                   0x2a, 0x4e, 0x1f, 0x58, 0x40, 0x47, 0xd6, 0x7,\n                                                   0xb, 0xb2, 0x86, 0xf7, 0x20, 0xfb, 0x1f, 0xfb,\n                                                   0x1a, 0x83, 0xfb, 0x19, 0x5d, 0x1e, 0xd4, 0x16,\n                                                   0xb1, 0x8a, 0xde, 0xd1, 0xc4, 0x98, 0x52, 0x4b,\n                                                   0x5d, 0x84, 0x40, 0x4c, 0x47, 0x8a, 0xd7, 0xb8,\n                                                   0x1e, 0xb, 0x4e, 0xa, 0x3c, 0xda, 0x13, 0x74,\n                                                   0xf8, 0x2e, 0x88, 0x15, 0xda, 0xf8, 0x9c, 0xb,\n                                                   0xf7, 0x23, 0xf8, 0xf2, 0x2e, 0xa, 0xb, 0xf7,\n                                                   0x73, 0xf8, 0xe9, 0x2f, 0xa, 0xb, 0x7d, 0xda,\n                                                   0x5f, 0x76, 0xf8, 0x5e, 0xd3, 0xb, 0x1, 0xda,\n                                                   0xea, 0xf8, 0xb, 0xea, 0x3, 0xda, 0xb, 0x5a,\n                                                   0xa, 0x2e, 0x6, 0xb, 0x73, 0x8b, 0xe0, 0xf7,\n                                                   0x90, 0xe0, 0xf7, 0x79, 0xe0, 0xb, 0x39, 0xa,\n                                                   0xce, 0xe3, 0x3, 0xce, 0x16, 0xe3, 0xb, 0x1,\n                                                   0xbc, 0xef, 0xf8, 0x74, 0xef, 0x3, 0xb, 0x5f,\n                                                   0xa, 0xf7, 0x77, 0xd9, 0xb, 0x15, 0xe9, 0xf7,\n                                                   0x6, 0x5d, 0x6, 0x8c, 0xa7, 0x8d, 0xc5, 0xbe,\n                                                   0xa0, 0x75, 0xad, 0x18, 0x3b, 0x67, 0x8b, 0x3d,\n                                                   0x5a, 0x1a, 0xb, 0x15, 0xb9, 0x6, 0x8a, 0x6f,\n                                                   0x89, 0x50, 0x58, 0x76, 0xa1, 0x69, 0x18, 0xdb,\n                                                   0xaf, 0x8b, 0xda, 0xbc, 0x1a, 0xe6, 0x2d, 0x7,\n                                                   0xb, 0x12, 0xba, 0xe9, 0xf7, 0x8d, 0xe3, 0x13,\n                                                   0x7c, 0xb, 0x7c, 0xd3, 0xf7, 0x48, 0xd3, 0xf7,\n                                                   0x29, 0xd3, 0xb, 0xfc, 0x31, 0xa0, 0x76, 0xb,\n                                                   0x15, 0xd3, 0x6, 0xb, 0xdb, 0xaf, 0x8b, 0xd9,\n                                                   0xbc, 0x1a, 0xe7, 0x2d, 0xfb, 0x6, 0xb9, 0x7,\n                                                   0x8a, 0x6f, 0x89, 0x51, 0x58, 0x76, 0x8, 0xb,\n                                                   0x12, 0xcf, 0xe3, 0xf7, 0x89, 0xe3, 0xb, 0xe2,\n                                                   0x78, 0xdf, 0xf8, 0xe4, 0xe0, 0xb, 0xfd, 0x72,\n                                                   0x15, 0xe3, 0xf8, 0x99, 0x7a, 0xa, 0xfe, 0x35,\n                                                   0x15, 0xea, 0xf9, 0x60, 0x2c, 0x6, 0xe, 0xf7,\n                                                   0x2b, 0x76, 0xf8, 0x29, 0x77, 0x1, 0xb, 0x9e,\n                                                   0x1b, 0xa0, 0xd2, 0x91, 0xf5, 0x8f, 0x1f, 0x4b,\n                                                   0x6, 0x69, 0x87, 0x80, 0x83, 0x77, 0x1b, 0xb,\n                                                   0xfb, 0xfa, 0xf8, 0xfa, 0x76, 0xf7, 0x21, 0x77,\n                                                   0x1, 0xb, 0x5, 0x87, 0x99, 0x8d, 0x85, 0xa4,\n                                                   0x1b, 0xf7, 0x7, 0xb, 0x1f, 0x4b, 0x6, 0x68,\n                                                   0x87, 0x80, 0x84, 0x77, 0x1b, 0xb, 0xf7, 0xad,\n                                                   0x16, 0xea, 0xf7, 0xc3, 0x6, 0xf7, 0xa9, 0xf8,\n                                                   0x2e, 0x5, 0xfb, 0x2, 0x6, 0xb, 0x31, 0xa,\n                                                   0xf7, 0x37, 0x72, 0xa, 0x38, 0xa, 0xe, 0xf7,\n                                                   0x1d, 0x5, 0xb, 0xfb, 0x53, 0xa0, 0x76, 0xf8,\n                                                   0x56, 0xcf, 0xf7, 0x10, 0xd5, 0x1, 0xe4, 0xe3,\n                                                   0xb, 0x15, 0xb7, 0x6, 0x9c, 0xf7, 0x1e, 0x5,\n                                                   0xf7, 0x9, 0x3e, 0xfb, 0x9, 0x7, 0xb, 0x69,\n                                                   0x8a, 0xfb, 0x25, 0xf7, 0x23, 0xf7, 0x23, 0x8c,\n                                                   0xf7, 0x1a, 0xb8, 0xb, 0x4c, 0xa, 0x4a, 0x74,\n                                                   0xa, 0x73, 0xa0, 0x76, 0xb, 0x15, 0xc9, 0x6,\n                                                   0xf7, 0x2b, 0xf7, 0x21, 0x38, 0xa, 0xb, 0x4b,\n                                                   0xa, 0xfa, 0x35, 0x77, 0x1, 0xe5, 0xea, 0x3,\n                                                   0xb, 0x4b, 0xa, 0xf9, 0x72, 0x77, 0x1, 0xea,\n                                                   0xe3, 0x3, 0xb, 0x1, 0xaa, 0x16, 0xf8, 0x4a,\n                                                   0xd7, 0xfb, 0xde, 0x6, 0xf7, 0xce, 0xb, 0x15,\n                                                   0x5a, 0xb1, 0x63, 0xbc, 0xbc, 0xb3, 0xb3, 0xbc,\n                                                   0xbc, 0x63, 0xb, 0xa6, 0xc7, 0x8e, 0xe0, 0xc6,\n                                                   0xb, 0xfb, 0x4e, 0x76, 0xf7, 0x5e, 0xd3, 0xf8,\n                                                   0x26, 0xd0, 0x1, 0xb, 0x5, 0xc4, 0xfc, 0x28,\n                                                   0x43, 0xf7, 0xb7, 0x7, 0xfb, 0xc9, 0xb, 0xa0,\n                                                   0x76, 0xf8, 0x9f, 0x77, 0x1, 0xb, 0xfc, 0x31,\n                                                   0xfb, 0x58, 0xd4, 0xf9, 0x98, 0xd4, 0x12, 0xb,\n                                                   0x1, 0xa2, 0x16, 0xf8, 0xc9, 0xe0, 0xfc, 0x5c,\n                                                   0x6, 0xb, 0x15, 0xcc, 0x6, 0xba, 0x8a, 0xad,\n                                                   0x8b, 0x8f, 0x1b, 0xb, 0x3c, 0x96, 0x1e, 0xe1,\n                                                   0x97, 0x5, 0xb3, 0x84, 0x7a, 0xb, 0xe3, 0xec,\n                                                   0x7a, 0xa, 0x1, 0xe1, 0xea, 0xb, 0xa0, 0x76,\n                                                   0xf8, 0x62, 0xd7, 0x12, 0xcc, 0xe3, 0xb, 0xfb,\n                                                   0xfa, 0xfb, 0x4e, 0x76, 0xfa, 0x40, 0x77, 0xb,\n                                                   0x20, 0xab, 0x76, 0xf8, 0x78, 0x77, 0x1, 0xbb,\n                                                   0xb, 0x27, 0x31, 0xa, 0xe, 0x5a, 0x58, 0x68,\n                                                   0x3e, 0x8c, 0x1f, 0xe, 0xf7, 0x1d, 0x59, 0xa,\n                                                   0xf7, 0x5, 0x8a, 0x77, 0x12, 0xb, 0x7d, 0xd3,\n                                                   0xf8, 0x2a, 0xd3, 0xb, 0xb8, 0xe5, 0xf7, 0xb2,\n                                                   0xe5, 0xb, 0xf7, 0x54, 0xd9, 0xfb, 0x54, 0xb,\n                                                   0x7c, 0xd7, 0x60, 0x76, 0xb, 0x33, 0x6, 0xe\n                                                  };\n"
  },
  {
    "path": "core/src/fxge/fontdata/chromefontdata/FoxitSansBold.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nconst unsigned char g_FoxitSansBoldFontData [16344] = {0x1,\n                                                       0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x12,\n                                                       0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x61, 0x6e,\n                                                       0x73, 0x4f, 0x54, 0x46, 0x2d, 0x42, 0x6f, 0x6c,\n                                                       0x64, 0x0, 0x1, 0x1, 0x1, 0x24, 0xf8, 0x10,\n                                                       0x0, 0xf8, 0x1c, 0x1, 0xf8, 0x1d, 0x2, 0xf8,\n                                                       0x1e, 0x3, 0xf8, 0x14, 0x4, 0xfb, 0x3e, 0xfb,\n                                                       0x78, 0xfa, 0x7e, 0xfa, 0x56, 0x5, 0xf7, 0x2f,\n                                                       0xf, 0xf8, 0x8f, 0x11, 0xb5, 0x1c, 0x39, 0x77,\n                                                       0x12, 0x0, 0x4, 0x1, 0x1, 0x5, 0x2f, 0x42,\n                                                       0x50, 0x45, 0x75, 0x72, 0x6f, 0x20, 0x20, 0x20,\n                                                       0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                       0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                       0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                       0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                       0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43,\n                                                       0x68, 0x72, 0x6f, 0x6d, 0x20, 0x53, 0x61, 0x6e,\n                                                       0x73, 0x20, 0x4f, 0x54, 0x46, 0x20, 0x42, 0x6f,\n                                                       0x6c, 0x64, 0x43, 0x68, 0x72, 0x6F, 0x6D, 0x20,\n                                                       0x53, 0x61, 0x6e, 0x73, 0x20, 0x4f, 0x54, 0x46,\n                                                       0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x81,\n                                                       0x1, 0x0, 0x84, 0x0, 0x0, 0x86, 0x2, 0x0,\n                                                       0x91, 0x0, 0x0, 0x63, 0x0, 0x0, 0x6d, 0x1,\n                                                       0x0, 0x8c, 0x0, 0x0, 0x92, 0x0, 0x0, 0xc7,\n                                                       0x0, 0x0, 0xe4, 0x0, 0x0, 0x2, 0x5, 0x0,\n                                                       0x68, 0x0, 0x0, 0x9, 0x37, 0x0, 0x7c, 0x0,\n                                                       0x0, 0x42, 0x1d, 0x1, 0x87, 0x0, 0x0, 0x75,\n                                                       0x0, 0x0, 0x65, 0x0, 0x0, 0x76, 0x0, 0x0,\n                                                       0x79, 0x0, 0x0, 0x70, 0x1, 0x0, 0x7e, 0x0,\n                                                       0x0, 0x7a, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x6b,\n                                                       0x0, 0x0, 0x8e, 0x0, 0x0, 0x41, 0x0, 0x0,\n                                                       0x8, 0x0, 0x0, 0x69, 0x0, 0x0, 0x77, 0x0,\n                                                       0x0, 0x74, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89,\n                                                       0x0, 0x0, 0x7f, 0x0, 0x0, 0x99, 0x0, 0x0,\n                                                       0xdd, 0x0, 0x0, 0x6c, 0x0, 0x0, 0x94, 0x0,\n                                                       0x0, 0xc6, 0x0, 0x0, 0x60, 0x2, 0x0, 0x67,\n                                                       0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0, 0x0,\n                                                       0x66, 0x0, 0x0, 0x83, 0x0, 0x0, 0xaa, 0x0,\n                                                       0x0, 0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x97,\n                                                       0x0, 0x0, 0xa6, 0x0, 0x0, 0xa5, 0x0, 0x0,\n                                                       0x80, 0x0, 0x0, 0xa1, 0x0, 0x0, 0x9c, 0x0,\n                                                       0x0, 0xa4, 0x0, 0x0, 0xa9, 0x0, 0x0, 0x7d,\n                                                       0x0, 0x0, 0x98, 0x0, 0x0, 0x73, 0x0, 0x0,\n                                                       0x72, 0x0, 0x0, 0x85, 0x0, 0x0, 0x96, 0x0,\n                                                       0x0, 0x8f, 0x0, 0x0, 0x78, 0x0, 0x0, 0x9e,\n                                                       0x0, 0x0, 0x9b, 0x0, 0x0, 0xa3, 0x0, 0x0,\n                                                       0x7b, 0x0, 0x0, 0xae, 0x0, 0x0, 0xab, 0x1,\n                                                       0x0, 0xb0, 0x0, 0x0, 0xad, 0x0, 0x0, 0xaf,\n                                                       0x0, 0x0, 0x8a, 0x0, 0x0, 0xb1, 0x0, 0x0,\n                                                       0xb5, 0x0, 0x0, 0xb2, 0x2, 0x0, 0xb9, 0x0,\n                                                       0x0, 0xb6, 0x2, 0x0, 0x9a, 0x0, 0x0, 0xba,\n                                                       0x0, 0x0, 0xbe, 0x0, 0x0, 0xbb, 0x1, 0x0,\n                                                       0xbf, 0x0, 0x0, 0xbd, 0x0, 0x0, 0xa8, 0x0,\n                                                       0x0, 0x8d, 0x0, 0x0, 0xc4, 0x0, 0x0, 0xc1,\n                                                       0x2, 0x0, 0xc5, 0x0, 0x0, 0x9d, 0x0, 0x0,\n                                                       0x95, 0x0, 0x0, 0xcb, 0x0, 0x0, 0xc8, 0x1,\n                                                       0x0, 0xcd, 0x0, 0x0, 0xca, 0x0, 0x0, 0xcc,\n                                                       0x0, 0x0, 0x90, 0x0, 0x0, 0xce, 0x0, 0x0,\n                                                       0xd2, 0x0, 0x0, 0xcf, 0x2, 0x0, 0xd6, 0x0,\n                                                       0x0, 0xd3, 0x2, 0x0, 0xa7, 0x0, 0x0, 0xd7,\n                                                       0x0, 0x0, 0xdb, 0x0, 0x0, 0xd8, 0x1, 0x0,\n                                                       0xdc, 0x0, 0x0, 0xda, 0x0, 0x0, 0x9f, 0x0,\n                                                       0x0, 0x93, 0x0, 0x0, 0xe1, 0x0, 0x0, 0xde,\n                                                       0x2, 0x0, 0xe2, 0x0, 0x0, 0xa2, 0x0, 0x0,\n                                                       0xe3, 0x0, 0x0, 0xe6, 0x2, 0x0, 0x1, 0x0,\n                                                       0x4, 0x0, 0x7, 0x0, 0x2c, 0x0, 0x41, 0x0,\n                                                       0x75, 0x0, 0x84, 0x0, 0xb3, 0x0, 0xce, 0x0,\n                                                       0xd9, 0x0, 0xf1, 0x1, 0x30, 0x1, 0x6b, 0x1,\n                                                       0x9a, 0x1, 0xc3, 0x1, 0xf1, 0x2, 0x32, 0x2,\n                                                       0x5e, 0x2, 0x8a, 0x2, 0xed, 0x3, 0x76, 0x4,\n                                                       0x7, 0x4, 0xa5, 0x4, 0xc4, 0x4, 0xfb, 0x5,\n                                                       0x33, 0x5, 0x66, 0x5, 0x8c, 0x5, 0xbb, 0x5,\n                                                       0xcc, 0x5, 0xdf, 0x5, 0xf5, 0x6, 0x3f, 0x6,\n                                                       0x69, 0x6, 0xbc, 0x7, 0x1e, 0x7, 0x55, 0x7,\n                                                       0xa7, 0x8, 0xa, 0x8, 0x3e, 0x8, 0xaf, 0x9,\n                                                       0x14, 0x9, 0x34, 0x9, 0x6d, 0x9, 0x8c, 0x9,\n                                                       0xab, 0x9, 0xc9, 0xa, 0x2e, 0xa, 0xda, 0xb,\n                                                       0xd, 0xb, 0x6c, 0xb, 0xbc, 0xb, 0xfb, 0xc,\n                                                       0x24, 0xc, 0x48, 0xc, 0xc3, 0xc, 0xef, 0xd,\n                                                       0x2, 0xd, 0x33, 0xd, 0x64, 0xd, 0x78, 0xd,\n                                                       0xb8, 0xd, 0xdb, 0xe, 0x52, 0xe, 0x88, 0xf,\n                                                       0x1a, 0xf, 0x73, 0xf, 0xdc, 0xf, 0xfb, 0x10,\n                                                       0x32, 0x10, 0x50, 0x10, 0x93, 0x10, 0xc5, 0x10,\n                                                       0xdf, 0x10, 0xf9, 0x11, 0x13, 0x11, 0x2a, 0x11,\n                                                       0x44, 0x11, 0x65, 0x11, 0x72, 0x11, 0x88, 0x11,\n                                                       0xed, 0x12, 0x48, 0x12, 0x92, 0x12, 0xed, 0x13,\n                                                       0x43, 0x13, 0x79, 0x13, 0xe7, 0x14, 0x23, 0x14,\n                                                       0x3c, 0x14, 0x80, 0x14, 0xaf, 0x14, 0xba, 0x15,\n                                                       0x19, 0x15, 0x58, 0x15, 0xa2, 0x15, 0xef, 0x16,\n                                                       0x43, 0x16, 0x82, 0x16, 0xe4, 0x17, 0x1e, 0x17,\n                                                       0x60, 0x17, 0x85, 0x17, 0xc1, 0x17, 0xf3, 0x18,\n                                                       0x22, 0x18, 0x48, 0x18, 0x8c, 0x18, 0xa4, 0x18,\n                                                       0xea, 0x19, 0x2c, 0x19, 0xa7, 0x19, 0xcf, 0x1a,\n                                                       0x33, 0x1a, 0x70, 0x1a, 0xa3, 0x1a, 0xcd, 0x1b,\n                                                       0x5, 0x1b, 0x19, 0x1b, 0xcf, 0x1c, 0x49, 0x1c,\n                                                       0x5f, 0x1c, 0xda, 0x1d, 0x5, 0x1d, 0x2e, 0x1d,\n                                                       0x7f, 0x1d, 0xb8, 0x1d, 0xdb, 0x1d, 0xea, 0x1d,\n                                                       0xfa, 0x1e, 0x3e, 0x1e, 0x8c, 0x1f, 0x4, 0x1f,\n                                                       0x19, 0x1f, 0xaf, 0x1f, 0xda, 0x20, 0xa, 0x20,\n                                                       0x88, 0x21, 0x14, 0x21, 0x8e, 0x21, 0xd3, 0x21,\n                                                       0xf2, 0x22, 0x9b, 0x22, 0xab, 0x23, 0x1b, 0x23,\n                                                       0x95, 0x23, 0xa3, 0x23, 0xbd, 0x23, 0xcf, 0x24,\n                                                       0x4d, 0x24, 0x60, 0x24, 0x99, 0x24, 0xc7, 0x25,\n                                                       0x9, 0x25, 0x61, 0x25, 0x74, 0x25, 0xba, 0x25,\n                                                       0xec, 0x26, 0x4, 0x26, 0x3b, 0x26, 0x61, 0x26,\n                                                       0xa4, 0x26, 0xb1, 0x27, 0x19, 0x27, 0x96, 0x28,\n                                                       0x2f, 0x28, 0x85, 0x28, 0x9d, 0x28, 0xb6, 0x28,\n                                                       0xd5, 0x29, 0x1b, 0x29, 0x3d, 0x29, 0x71, 0x29,\n                                                       0xb8, 0x2a, 0x49, 0x2a, 0x59, 0x2a, 0x6a, 0x2a,\n                                                       0x91, 0x2a, 0xb8, 0x2a, 0xcd, 0x2a, 0xe1, 0x2a,\n                                                       0xfc, 0x2b, 0x15, 0x2b, 0x63, 0x2b, 0xbb, 0x2b,\n                                                       0xe9, 0x2c, 0xd, 0x2c, 0x3a, 0x2c, 0x87, 0x2c,\n                                                       0xaf, 0x2c, 0xdf, 0x2d, 0x5f, 0x2d, 0x7c, 0x2d,\n                                                       0x98, 0x2d, 0xbf, 0x2d, 0xea, 0x2e, 0x1a, 0x2e,\n                                                       0x5d, 0x2e, 0xcc, 0x2e, 0xe3, 0x2e, 0xfa, 0x2f,\n                                                       0x1b, 0x2f, 0x77, 0x2f, 0x9f, 0x2f, 0xe5, 0x30,\n                                                       0x8f, 0x31, 0x1c, 0x31, 0x36, 0x31, 0x51, 0x31,\n                                                       0x73, 0x31, 0x97, 0x31, 0xae, 0x31, 0xc5, 0x31,\n                                                       0xe4, 0x32, 0x3, 0x32, 0x7c, 0x32, 0xf4, 0x33,\n                                                       0x11, 0x33, 0x24, 0x33, 0x42, 0x33, 0x80, 0x33,\n                                                       0xa8, 0x33, 0xd7, 0x34, 0x55, 0x34, 0x6b, 0x34,\n                                                       0x81, 0x34, 0xa8, 0x34, 0xd6, 0x35, 0x13, 0x35,\n                                                       0x67, 0x35, 0xac, 0xfc, 0x15, 0xe, 0xfc, 0x15,\n                                                       0xe, 0xf8, 0xf0, 0xcb, 0xdd, 0x77, 0x1, 0x89,\n                                                       0xf9, 0x82, 0x15, 0x22, 0x95, 0xd9, 0x62, 0xdb,\n                                                       0x1b, 0xda, 0xdb, 0xb3, 0xf5, 0x95, 0x1f, 0x4b,\n                                                       0x6, 0x78, 0x8a, 0x7b, 0x4c, 0x33, 0x1b, 0x4a,\n                                                       0x6a, 0xb2, 0xb6, 0x85, 0x1f, 0xe, 0xf8, 0xfa,\n                                                       0xf7, 0x7, 0x1, 0xf3, 0xf7, 0x12, 0x3, 0xf3,\n                                                       0xf8, 0xfa, 0x15, 0xf7, 0x12, 0xf7, 0x7, 0xfb,\n                                                       0x12, 0x6, 0xe, 0xf8, 0xcc, 0xc4, 0xe9, 0xc4,\n                                                       0x1, 0xc6, 0xc6, 0xed, 0xc6, 0x3, 0xc6, 0xf9,\n                                                       0x35, 0x15, 0x51, 0xbc, 0x5c, 0xc7, 0xc4, 0xbd,\n                                                       0xb8, 0xc7, 0xc6, 0x5a, 0xb7, 0x51, 0x4d, 0x5c,\n                                                       0x5e, 0x51, 0x1e, 0xc6, 0x16, 0xa5, 0xa0, 0x9f,\n                                                       0xa8, 0xa5, 0xa1, 0x78, 0x70, 0x70, 0x75, 0x76,\n                                                       0x71, 0x6f, 0x75, 0xa0, 0xa6, 0x1e, 0xe, 0xf8,\n                                                       0xf0, 0x84, 0xa, 0x94, 0xf8, 0xf0, 0x6b, 0xa,\n                                                       0xef, 0xfb, 0x26, 0x6b, 0xa, 0xe, 0xfb, 0x78,\n                                                       0xd8, 0xf7, 0x2b, 0x77, 0x1, 0xd2, 0xe2, 0x3,\n                                                       0xe5, 0x16, 0x80, 0x61, 0x83, 0x6a, 0x67, 0x1a,\n                                                       0x35, 0xdd, 0x6c, 0xcc, 0x9c, 0xa5, 0x8e, 0x9c,\n                                                       0xb6, 0x1e, 0xd0, 0x7, 0x87, 0x80, 0x61, 0x83,\n                                                       0x6a, 0x1b, 0x53, 0x87, 0xac, 0xb8, 0xa3, 0x8e,\n                                                       0xa7, 0x93, 0xa0, 0x1f, 0xe, 0xf8, 0xf0, 0xd1,\n                                                       0x1, 0xed, 0xf8, 0xf0, 0x15, 0xf7, 0x1b, 0x6,\n                                                       0xf7, 0x2, 0x83, 0xa, 0xfb, 0xa, 0x6, 0x52,\n                                                       0x3f, 0x4e, 0xd7, 0x5, 0xfb, 0x9, 0x6, 0xe,\n                                                       0xfc, 0x15, 0x73, 0xa, 0xd3, 0x63, 0xa, 0xf8,\n                                                       0xa8, 0x6d, 0xa, 0xfc, 0x84, 0x8d, 0x76, 0xf9,\n                                                       0x6d, 0x77, 0x1, 0x2f, 0x78, 0x15, 0xf8, 0x40,\n                                                       0xf9, 0x6d, 0x5, 0x3d, 0x6, 0xfc, 0x40, 0xfd,\n                                                       0x6d, 0x5, 0xe, 0x57, 0x76, 0xa, 0xd2, 0xf7,\n                                                       0x13, 0x1, 0xe2, 0xf7, 0x20, 0xf7, 0x43, 0x7d,\n                                                       0xa, 0xe2, 0x16, 0xf7, 0x20, 0xf8, 0x2c, 0xf4,\n                                                       0xf7, 0x1, 0x22, 0x6, 0xf4, 0xc5, 0x96, 0xca,\n                                                       0x78, 0x1e, 0x9f, 0xeb, 0x5, 0x98, 0x5f, 0x73,\n                                                       0x8f, 0x6f, 0x1b, 0xfb, 0x37, 0x6f, 0xa, 0xf7,\n                                                       0xcf, 0xfc, 0x2c, 0x15, 0xf7, 0x20, 0xf8, 0x99,\n                                                       0x68, 0xa, 0xd2, 0x4, 0xf7, 0x20, 0xf7, 0x13,\n                                                       0x6d, 0xa, 0x57, 0x76, 0xa, 0xf7, 0x66, 0x77,\n                                                       0x1, 0xe2, 0xf7, 0x20, 0xf7, 0x44, 0xf7, 0x1f,\n                                                       0x3, 0xf8, 0x27, 0x16, 0xf7, 0x1f, 0xf9, 0x5f,\n                                                       0xfb, 0x1f, 0x6, 0xfb, 0xd0, 0xfd, 0x5f, 0x15,\n                                                       0xf7, 0x20, 0xf8, 0x2c, 0xf3, 0xf7, 0x1, 0x23,\n                                                       0x6, 0xdf, 0xb1, 0xab, 0xde, 0x78, 0x1e, 0x9e,\n                                                       0xeb, 0x5, 0x98, 0x5f, 0x74, 0x8f, 0x6e, 0x1b,\n                                                       0xfb, 0x36, 0x6f, 0xa, 0xe, 0x86, 0xa, 0xa7,\n                                                       0xf7, 0x16, 0x3, 0xc6, 0x16, 0xf8, 0xa0, 0xf7,\n                                                       0xe, 0xfc, 0x1e, 0xf7, 0x7c, 0x6, 0xf7, 0x3b,\n                                                       0xf7, 0x1a, 0x5, 0xf7, 0xc, 0x7, 0xfb, 0x3b,\n                                                       0xfb, 0x1c, 0x5, 0xf7, 0x8a, 0xfb, 0x16, 0xfb,\n                                                       0xf9, 0x7, 0x3c, 0x4a, 0x5, 0xfb, 0x9, 0x7,\n                                                       0xda, 0xcb, 0x5, 0xe, 0xfc, 0x15, 0x3f, 0xa,\n                                                       0xd1, 0xf7, 0xa, 0x3, 0xd1, 0x16, 0xf7, 0xa,\n                                                       0xf7, 0xfa, 0x6, 0xf7, 0x0, 0xd8, 0x5, 0xe9,\n                                                       0x7, 0xfb, 0x0, 0x3d, 0x5, 0xf7, 0x9f, 0xfb,\n                                                       0xa, 0xfb, 0xf6, 0x7, 0x33, 0x48, 0x5, 0x2d,\n                                                       0x7, 0xe3, 0xcf, 0x5, 0xe, 0x57, 0x8b, 0xf7,\n                                                       0xd, 0xf8, 0x6e, 0x82, 0xa, 0xa4, 0x16, 0xf8,\n                                                       0xc5, 0xf7, 0xd, 0x87, 0xa, 0xf7, 0x5, 0xfc,\n                                                       0x8e, 0xfb, 0xd, 0x8c, 0xa, 0xf7, 0x6e, 0xf9,\n                                                       0x2d, 0x15, 0xf7, 0xf, 0x6, 0xee, 0xf7, 0x21,\n                                                       0x5, 0x20, 0x6, 0x58, 0x42, 0x54, 0xd4, 0x5,\n                                                       0x21, 0x6, 0xe, 0xfb, 0x37, 0x8b, 0xf7, 0xd,\n                                                       0xf7, 0xaf, 0xf7, 0x6, 0xe5, 0xf7, 0x22, 0x1,\n                                                       0x9f, 0x16, 0xf8, 0x60, 0xf7, 0xd, 0xfb, 0xad,\n                                                       0x6, 0xf7, 0x9d, 0xf7, 0xc0, 0x5, 0xec, 0xfc,\n                                                       0x3d, 0xfb, 0x6, 0x7, 0xf7, 0x88, 0x8c, 0xfb,\n                                                       0x9b, 0xfb, 0xbe, 0x5, 0xf7, 0x3b, 0xf8, 0x89,\n                                                       0x15, 0xf7, 0x12, 0x6, 0xf1, 0xf7, 0x22, 0x5,\n                                                       0xfb, 0x2, 0x6, 0x56, 0x42, 0x53, 0xd4, 0x5,\n                                                       0xfb, 0x1, 0x6, 0xe, 0x8b, 0xf7, 0x1d, 0xf8,\n                                                       0xd9, 0x77, 0x12, 0xe5, 0xf7, 0x28, 0xfb, 0x28,\n                                                       0xf7, 0x2e, 0x13, 0xe0, 0xe8, 0x16, 0xf7, 0x25,\n                                                       0xf7, 0x1d, 0xfb, 0x25, 0x6, 0xab, 0xbc, 0x15,\n                                                       0xdd, 0x6, 0x13, 0xd0, 0xb0, 0xf8, 0x0, 0x5,\n                                                       0xf7, 0x3c, 0xfb, 0x2e, 0xfb, 0x3c, 0x7, 0xe,\n                                                       0xfb, 0x51, 0xf8, 0x68, 0x76, 0xf7, 0xa3, 0x77,\n                                                       0x1, 0xf7, 0xb3, 0xf8, 0x53, 0x15, 0xd3, 0x6,\n                                                       0x9c, 0x67, 0xa, 0xf7, 0x14, 0xfb, 0x1, 0xfb,\n                                                       0x14, 0x7, 0xfb, 0x2a, 0xfb, 0x23, 0x15, 0xd4,\n                                                       0x6, 0x9b, 0x67, 0xa, 0xf7, 0x14, 0xfb, 0x0,\n                                                       0xfb, 0x14, 0x7, 0xe, 0x20, 0xa0, 0x76, 0xf7,\n                                                       0x47, 0xf2, 0xf7, 0x1c, 0xf2, 0xf7, 0x45, 0x77,\n                                                       0x1, 0xb8, 0x16, 0xf6, 0x6, 0xb0, 0xf7, 0x47,\n                                                       0x5, 0xf4, 0x6, 0x67, 0xfb, 0x47, 0x5, 0xf4,\n                                                       0x6, 0xb1, 0xf7, 0x47, 0x5, 0xf7, 0x1d, 0xf2,\n                                                       0xfb, 0x7, 0x6, 0xa7, 0xf7, 0x1c, 0x5, 0xe2,\n                                                       0xf2, 0x49, 0x6, 0xb1, 0xf7, 0x45, 0x5, 0xfb,\n                                                       0x2, 0x6, 0x66, 0xfb, 0x45, 0x5, 0x24, 0x6,\n                                                       0xaf, 0xf7, 0x45, 0x5, 0x22, 0x6, 0x65, 0xfb,\n                                                       0x45, 0x5, 0xfb, 0x1b, 0x24, 0xf7, 0x6, 0x6,\n                                                       0x6e, 0xfb, 0x1c, 0x5, 0x36, 0x24, 0xcb, 0x6,\n                                                       0xf7, 0x14, 0xf2, 0x15, 0xa7, 0xf7, 0x1c, 0x5,\n                                                       0xf4, 0x6, 0x6f, 0xfb, 0x1c, 0x5, 0xe, 0x20,\n                                                       0x2d, 0x76, 0xfa, 0xe, 0x77, 0x12, 0xf7, 0x85,\n                                                       0xd4, 0xdf, 0xf7, 0x11, 0x17, 0xa9, 0xf7, 0x54,\n                                                       0x15, 0x9b, 0x24, 0xc2, 0x2a, 0xf7, 0x20, 0x7b,\n                                                       0x8, 0x30, 0xd4, 0xe8, 0x7, 0xf7, 0x44, 0xa4,\n                                                       0xac, 0xf7, 0x7, 0xd0, 0x1a, 0xf7, 0x34, 0xfb,\n                                                       0x19, 0xc0, 0x3f, 0xa0, 0x1e, 0xf7, 0x56, 0x7,\n                                                       0xbb, 0x77, 0x94, 0x62, 0x8e, 0x79, 0xf7, 0x13,\n                                                       0x9b, 0x18, 0x71, 0xf7, 0x2e, 0xfb, 0x13, 0x9a,\n                                                       0x69, 0x8f, 0x8, 0x13, 0x70, 0xbd, 0x7, 0x42,\n                                                       0x59, 0x6, 0x24, 0x81, 0x34, 0x46, 0xfb, 0xe,\n                                                       0x1a, 0xfb, 0x32, 0xf7, 0x17, 0x5c, 0xc6, 0x7b,\n                                                       0x1e, 0xfb, 0x64, 0x7, 0x74, 0x96, 0x60, 0xab,\n                                                       0x7e, 0xcf, 0x8, 0xf7, 0x2c, 0xfb, 0xa, 0x15,\n                                                       0xf7, 0x56, 0x7, 0xa1, 0x85, 0xc9, 0x79, 0x44,\n                                                       0x1a, 0x60, 0x6f, 0x5d, 0x53, 0x81, 0x1e, 0x42,\n                                                       0xf7, 0xf9, 0x15, 0x4a, 0xa7, 0x8a, 0xb5, 0x94,\n                                                       0x1a, 0xad, 0xa1, 0xb7, 0xb7, 0x99, 0x1e, 0xe,\n                                                       0xf7, 0x76, 0x78, 0xd5, 0xf7, 0x69, 0xd5, 0x90,\n                                                       0xd5, 0xf7, 0x69, 0xd5, 0x8d, 0x77, 0x12, 0xa7,\n                                                       0xf7, 0x4, 0xf3, 0xf7, 0x4, 0xf7, 0x45, 0xf7,\n                                                       0x4, 0xf3, 0xf7, 0x4, 0x13, 0xf7, 0x80, 0xf7,\n                                                       0x20, 0xf8, 0xa4, 0x15, 0xd2, 0x98, 0xae, 0xb2,\n                                                       0xb3, 0x97, 0x67, 0x45, 0x42, 0x7f, 0x69, 0x63,\n                                                       0x63, 0x7f, 0xaf, 0xd2, 0x1e, 0xfb, 0x4, 0x16,\n                                                       0x2d, 0xaf, 0x34, 0xf7, 0x14, 0xf7, 0x29, 0x9a,\n                                                       0xf7, 0xd, 0xc7, 0xf6, 0x5e, 0xd4, 0xfb, 0xb,\n                                                       0xfb, 0x28, 0x7b, 0xfb, 0xd, 0x50, 0x1e, 0xf7,\n                                                       0x3b, 0xfc, 0xb7, 0x15, 0xf6, 0x6, 0x13, 0xef,\n                                                       0x80, 0xf8, 0x1f, 0xf9, 0x6d, 0x5, 0x24, 0x6,\n                                                       0x4e, 0xfc, 0xba, 0x15, 0x2d, 0xb0, 0x36, 0xf7,\n                                                       0x15, 0xf7, 0x27, 0x9a, 0xf7, 0xb, 0xc9, 0xf6,\n                                                       0x5e, 0xd4, 0xfb, 0xa, 0xfb, 0x2a, 0x7c, 0xfb,\n                                                       0xd, 0x4e, 0x1e, 0xf7, 0x4, 0x8e, 0x15, 0xd3,\n                                                       0x97, 0xac, 0xb3, 0xb3, 0x97, 0x68, 0x45, 0x43,\n                                                       0x7f, 0x67, 0x63, 0x63, 0x7f, 0xb0, 0xd2, 0x1e,\n                                                       0xe, 0xc6, 0x7e, 0xf7, 0x4, 0x2a, 0x76, 0xf9,\n                                                       0x15, 0xeb, 0x12, 0xc1, 0xf7, 0x1e, 0x59, 0xf7,\n                                                       0x17, 0x13, 0x68, 0xf8, 0x8e, 0xca, 0x15, 0xa5,\n                                                       0x72, 0xb5, 0x69, 0xb9, 0x74, 0xdc, 0xf5, 0x18,\n                                                       0x75, 0x94, 0x52, 0xb3, 0x6c, 0xa9, 0x9c, 0xa1,\n                                                       0x9c, 0xa7, 0xa5, 0xeb, 0xfb, 0xd, 0xa6, 0x18,\n                                                       0x87, 0x7a, 0x81, 0x69, 0x7c, 0x6d, 0x29, 0xf7,\n                                                       0x16, 0x18, 0xda, 0xbe, 0xbc, 0xb8, 0xd4, 0x1a,\n                                                       0xe5, 0x42, 0xd2, 0xfb, 0xd, 0xfb, 0xe, 0x42,\n                                                       0x40, 0x35, 0x57, 0xa7, 0x5e, 0xb7, 0x59, 0x1e,\n                                                       0x13, 0xb0, 0x68, 0x79, 0xfb, 0x11, 0x4c, 0xfb,\n                                                       0x1c, 0x1a, 0x54, 0xa6, 0xfb, 0x2b, 0xf7, 0x6b,\n                                                       0xf7, 0x4, 0xc7, 0xb4, 0xae, 0xb1, 0x1e, 0x36,\n                                                       0xe5, 0x15, 0x76, 0x71, 0x64, 0x6a, 0x4f, 0x1b,\n                                                       0x43, 0x6b, 0xb8, 0xbc, 0xb5, 0xa3, 0xc0, 0xcf,\n                                                       0xae, 0x1f, 0xbd, 0xf7, 0x29, 0x15, 0x6c, 0xaf,\n                                                       0x5, 0x13, 0xa8, 0x89, 0x8e, 0x6f, 0x8f, 0xb5,\n                                                       0x1a, 0xa5, 0x9e, 0xb2, 0xb8, 0xbf, 0xa3, 0x66,\n                                                       0x6f, 0x74, 0x7c, 0x7e, 0x7a, 0x7d, 0x1e, 0x7a,\n                                                       0x7c, 0x77, 0x7e, 0x81, 0x84, 0x8, 0xe, 0xfc,\n                                                       0x3d, 0xf8, 0x68, 0x76, 0xf7, 0xa3, 0x77, 0x1,\n                                                       0x7e, 0x85, 0xa, 0xc3, 0xf8, 0x53, 0x15, 0xf7,\n                                                       0x8, 0x6, 0x9b, 0xf7, 0x22, 0x5, 0xf7, 0x15,\n                                                       0xfb, 0x28, 0xfb, 0x15, 0x7, 0xe, 0xfb, 0x4f,\n                                                       0x76, 0xfa, 0x42, 0x77, 0x1, 0xae, 0x85, 0xa,\n                                                       0xf7, 0x63, 0xfb, 0x64, 0x15, 0xf5, 0x6, 0x61,\n                                                       0xdb, 0x33, 0xf7, 0x39, 0xf7, 0x73, 0x1a, 0xf7,\n                                                       0x52, 0xc0, 0xf7, 0x16, 0xd9, 0xf7, 0x2e, 0x1e,\n                                                       0x22, 0x6, 0x34, 0xfb, 0x4, 0x34, 0xfb, 0x39,\n                                                       0xfb, 0x59, 0x1a, 0xfb, 0x3b, 0xd0, 0xfb, 0x35,\n                                                       0xf2, 0xfb, 0x20, 0x1e, 0xe, 0xfb, 0x4f, 0x76,\n                                                       0xfa, 0x42, 0x77, 0x1, 0xf7, 0x29, 0xf7, 0x29,\n                                                       0x3, 0x9e, 0xfb, 0x64, 0x15, 0xf4, 0x6, 0xe2,\n                                                       0xf7, 0x4, 0xe2, 0xf7, 0x35, 0xf7, 0x59, 0x1a,\n                                                       0xf7, 0x3b, 0x46, 0xf7, 0x39, 0x24, 0xf7, 0x20,\n                                                       0x1e, 0x21, 0x6, 0xb5, 0x3b, 0xe2, 0xfb, 0x3d,\n                                                       0xfb, 0x73, 0x1a, 0xfb, 0x52, 0x57, 0xfb, 0x12,\n                                                       0x3d, 0xfb, 0x2e, 0x1e, 0xe, 0xfb, 0xa6, 0x4d,\n                                                       0xa, 0xf7, 0x30, 0xd2, 0x3, 0xf7, 0x13, 0xf8,\n                                                       0x17, 0x15, 0xcc, 0xf7, 0x1, 0xc9, 0x21, 0xd1,\n                                                       0xbb, 0x3a, 0xeb, 0xf7, 0xb, 0xa2, 0x72, 0xe1,\n                                                       0xfb, 0x8, 0x57, 0x97, 0xf7, 0x13, 0x5, 0x39,\n                                                       0x6, 0x96, 0xfb, 0x12, 0xfb, 0x1, 0xc2, 0x71,\n                                                       0x38, 0xf7, 0x9, 0x6d, 0x34, 0x2f, 0x5, 0xe,\n                                                       0x3c, 0xa0, 0x76, 0xf7, 0x52, 0xf7, 0x15, 0xf7,\n                                                       0x4f, 0x90, 0xa, 0xf7, 0x52, 0x15, 0xf7, 0x50,\n                                                       0xfb, 0x52, 0xf7, 0x13, 0xf7, 0x52, 0xf7, 0x51,\n                                                       0xf7, 0x15, 0xfb, 0x51, 0xf7, 0x4f, 0xfb, 0x13,\n                                                       0xfb, 0x4f, 0xfb, 0x50, 0x6, 0xe, 0xfc, 0x15,\n                                                       0xfb, 0x27, 0x76, 0xf7, 0x51, 0x76, 0xf7, 0x26,\n                                                       0x77, 0x12, 0xd7, 0xf7, 0x1e, 0x44, 0xd2, 0x13,\n                                                       0xf0, 0xd7, 0x16, 0x13, 0xe8, 0xce, 0x6, 0x89,\n                                                       0x38, 0x58, 0x7c, 0x71, 0x82, 0xa6, 0x4e, 0x18,\n                                                       0xf7, 0xf, 0xba, 0x8b, 0xec, 0xcd, 0x1a, 0xf3,\n                                                       0x7, 0x13, 0xf0, 0x81, 0xa, 0xf7, 0x6b, 0xf7,\n                                                       0x16, 0x1, 0xa6, 0xf7, 0x6b, 0x15, 0xf7, 0xab,\n                                                       0xf7, 0x16, 0xfb, 0xab, 0x6, 0xe, 0xfc, 0x15,\n                                                       0x8b, 0x84, 0xa, 0xcb, 0xf7, 0x2a, 0x3, 0xcb,\n                                                       0x16, 0xf7, 0x2a, 0xf7, 0x26, 0xfb, 0x2a, 0x6,\n                                                       0xe, 0xfc, 0x15, 0x86, 0x76, 0xf9, 0x8f, 0x77,\n                                                       0x1, 0x76, 0xf7, 0x11, 0x3, 0x6a, 0x78, 0x15,\n                                                       0xf7, 0x11, 0x6, 0xf7, 0x6f, 0x93, 0xa, 0x79,\n                                                       0xa, 0xf8, 0x89, 0xf7, 0x6, 0x1, 0xab, 0xf7,\n                                                       0x2c, 0xf7, 0x50, 0xf7, 0x2c, 0x3, 0xab, 0xf7,\n                                                       0xf5, 0x15, 0xfb, 0x21, 0xa2, 0xfb, 0x7b, 0xf7,\n                                                       0x74, 0xf7, 0x6d, 0xa7, 0xf7, 0x7d, 0xf7, 0x1d,\n                                                       0xf7, 0x20, 0x72, 0xf7, 0x6f, 0xfb, 0x72, 0xfb,\n                                                       0x70, 0x72, 0xfb, 0x6f, 0xfb, 0x1e, 0x1e, 0xf7,\n                                                       0x2c, 0x89, 0x15, 0xf7, 0x53, 0xa4, 0xc1, 0xcf,\n                                                       0xd1, 0xa4, 0x54, 0xfb, 0x52, 0xfb, 0x52, 0x72,\n                                                       0x49, 0x45, 0x47, 0x72, 0xcc, 0xf7, 0x53, 0x1e,\n                                                       0xe, 0x20, 0xa0, 0x76, 0xf9, 0x5a, 0x77, 0x1,\n                                                       0xf7, 0x87, 0xf7, 0x1b, 0x3, 0xf7, 0x87, 0x16,\n                                                       0xf7, 0x1b, 0xf9, 0x5a, 0xfb, 0x2, 0x6, 0x61,\n                                                       0xfb, 0xc, 0xfb, 0x23, 0x56, 0x7d, 0x86, 0x8,\n                                                       0xfb, 0xe, 0x7, 0xe1, 0xa7, 0xc5, 0xba, 0xa9,\n                                                       0xa7, 0x8, 0xe, 0x20, 0x8b, 0xf7, 0x12, 0xf8,\n                                                       0x6b, 0xf7, 0x5, 0x1, 0xb5, 0xf7, 0x1e, 0xf7,\n                                                       0x55, 0xf7, 0x1e, 0x3, 0xa5, 0x16, 0xf8, 0x79,\n                                                       0xf7, 0x12, 0xfb, 0xa7, 0x6, 0x9e, 0xab, 0xa2,\n                                                       0xa0, 0xd2, 0xcb, 0x8, 0xd1, 0xca, 0xe7, 0xd5,\n                                                       0xf7, 0x10, 0x1a, 0xe3, 0x4a, 0xf7, 0xa, 0xfb,\n                                                       0x3b, 0xfb, 0x17, 0x21, 0x2d, 0xfb, 0x7, 0x1e,\n                                                       0xf7, 0x1e, 0x7d, 0x5, 0xd3, 0x90, 0xa9, 0xb1,\n                                                       0xcb, 0x1b, 0xc8, 0xac, 0x63, 0x56, 0x43, 0x5b,\n                                                       0x64, 0x2b, 0x33, 0x1f, 0xfb, 0x1e, 0xfb, 0x12,\n                                                       0x55, 0x41, 0x80, 0x22, 0x8, 0xe, 0x79, 0xa,\n                                                       0xf8, 0x83, 0xf7, 0x6, 0x1, 0xf7, 0xe6, 0xf7,\n                                                       0x25, 0x3, 0xa6, 0xf7, 0x4a, 0x15, 0x25, 0x97,\n                                                       0xda, 0x28, 0xf7, 0x2a, 0x1b, 0xf7, 0x1d, 0xf7,\n                                                       0x3, 0xeb, 0xf7, 0x16, 0xe1, 0x56, 0xcd, 0x35,\n                                                       0x9c, 0x1f, 0x8d, 0x7, 0xa5, 0x97, 0xda, 0xae,\n                                                       0xe9, 0x1a, 0xdf, 0x3b, 0xf6, 0xfb, 0x22, 0xfb,\n                                                       0x4f, 0x72, 0xfb, 0x22, 0x5f, 0x80, 0x1e, 0xf7,\n                                                       0x17, 0x75, 0x5, 0xd4, 0x94, 0xb9, 0xa0, 0xb0,\n                                                       0x1b, 0xbd, 0xaa, 0x6c, 0x5d, 0x43, 0x4c, 0x75,\n                                                       0x55, 0x8c, 0x1f, 0x7c, 0xfb, 0x3, 0x5, 0xdd,\n                                                       0xad, 0xdb, 0x56, 0x32, 0x1a, 0x55, 0x6c, 0x51,\n                                                       0x43, 0x48, 0x6c, 0xc0, 0xbd, 0x85, 0x1e, 0xe,\n                                                       0x20, 0xa0, 0x76, 0xf7, 0x23, 0xf7, 0xc, 0xf8,\n                                                       0x53, 0x77, 0x1, 0xf7, 0xcc, 0xf7, 0x14, 0x3,\n                                                       0xa6, 0xf7, 0x23, 0x15, 0xf7, 0xb1, 0xfb, 0x23,\n                                                       0xf7, 0x14, 0xf7, 0x23, 0xe1, 0xf7, 0xc, 0x35,\n                                                       0xf8, 0x53, 0x7c, 0xa, 0xfb, 0xc1, 0xfc, 0x54,\n                                                       0x5, 0xf7, 0x11, 0x8c, 0x15, 0xf7, 0x32, 0xf7,\n                                                       0x86, 0x5, 0x8d, 0xfb, 0x86, 0x6, 0xe, 0x79,\n                                                       0xa, 0xf8, 0x7f, 0xf7, 0x11, 0x1, 0xf8, 0x3f,\n                                                       0xf7, 0x23, 0x3, 0xa6, 0xf7, 0x48, 0x15, 0xfb,\n                                                       0x11, 0x9b, 0xec, 0x41, 0xf7, 0x13, 0x1b, 0xf7,\n                                                       0x3e, 0xda, 0xf7, 0x1e, 0xf7, 0x7, 0x1f, 0x8a,\n                                                       0xf7, 0x5e, 0xfb, 0x38, 0xe8, 0xfb, 0x2c, 0x46,\n                                                       0xa1, 0xf7, 0x19, 0x18, 0xf7, 0x9b, 0xf7, 0x11,\n                                                       0xfc, 0x5, 0x6, 0x44, 0xfc, 0x11, 0xf7, 0x5,\n                                                       0x7b, 0xbb, 0xbf, 0xc1, 0x96, 0xb4, 0x7a, 0x19,\n                                                       0xb6, 0x7a, 0xa9, 0x53, 0x4f, 0x1a, 0x23, 0x54,\n                                                       0x68, 0x58, 0x5c, 0x60, 0xa6, 0xd3, 0x80, 0x1e,\n                                                       0xe, 0x79, 0xa, 0xf7, 0x99, 0xef, 0xf7, 0x20,\n                                                       0xf7, 0x6, 0x1, 0xaa, 0xf7, 0x31, 0x3, 0xf7,\n                                                       0x44, 0xf8, 0x23, 0x15, 0xd5, 0x90, 0x96, 0xf7,\n                                                       0xf, 0xee, 0x1b, 0xd2, 0x92, 0x4d, 0x7b, 0x8d,\n                                                       0x1f, 0xf7, 0x1b, 0x99, 0x5, 0xf6, 0x77, 0x3f,\n                                                       0xd2, 0xfb, 0xb, 0x1b, 0xfb, 0x8a, 0x7d, 0xfb,\n                                                       0xc4, 0x4a, 0xfb, 0x4d, 0xe6, 0xfb, 0x43, 0xf7,\n                                                       0x3d, 0xf7, 0x20, 0xe4, 0xee, 0xf7, 0x22, 0xf7,\n                                                       0x22, 0xfb, 0x6, 0xe7, 0xfb, 0x7, 0x52, 0x5e,\n                                                       0x6f, 0x6e, 0x7e, 0x1f, 0x97, 0xfb, 0x45, 0x15,\n                                                       0xf7, 0x7, 0xdf, 0x9e, 0x9e, 0xec, 0x85, 0xfb,\n                                                       0x9, 0x7a, 0x77, 0x8a, 0x20, 0x31, 0x48, 0x67,\n                                                       0xc4, 0xd1, 0x1e, 0xe, 0x20, 0xa0, 0x76, 0xf8,\n                                                       0xe1, 0xf7, 0x10, 0x12, 0xf7, 0x14, 0xf7, 0x22,\n                                                       0x17, 0xf7, 0x14, 0x16, 0xf7, 0x22, 0x6, 0x13,\n                                                       0xe0, 0xf7, 0x6e, 0xf7, 0x12, 0xf7, 0x9c, 0xf7,\n                                                       0x18, 0xf7, 0xd, 0x1e, 0xea, 0xfc, 0x8b, 0xfb,\n                                                       0x10, 0xf7, 0xe3, 0x7, 0xfb, 0xb, 0xfb, 0x1d,\n                                                       0xfb, 0x5, 0xfb, 0x6f, 0xfb, 0x6e, 0x1a, 0xe,\n                                                       0x20, 0x78, 0xf7, 0x2, 0xf8, 0x8d, 0xf7, 0x2,\n                                                       0x1, 0xab, 0xf7, 0x23, 0xf7, 0x62, 0xf7, 0x23,\n                                                       0x3, 0xf7, 0x31, 0xf8, 0xe, 0x15, 0x3b, 0x6a,\n                                                       0x5e, 0x57, 0x36, 0x1a, 0xfb, 0x21, 0xf7, 0x4,\n                                                       0x35, 0xf7, 0x18, 0xf7, 0x1e, 0xf7, 0x2, 0xe3,\n                                                       0xf7, 0x1f, 0xc7, 0x72, 0xd1, 0x25, 0xb3, 0x1e,\n                                                       0xd1, 0xa9, 0xab, 0xc0, 0xc9, 0x1a, 0xe6, 0x4a,\n                                                       0xeb, 0xfb, 0x32, 0xfb, 0x34, 0x4c, 0x2b, 0x30,\n                                                       0x36, 0xc0, 0x64, 0xbe, 0x76, 0x1e, 0xa8, 0xf7,\n                                                       0x25, 0x15, 0xb3, 0xa4, 0xb0, 0xcc, 0xbc, 0xb4,\n                                                       0x74, 0x55, 0x3c, 0x47, 0x7c, 0x75, 0x77, 0x45,\n                                                       0x99, 0xdb, 0x1e, 0x80, 0xfb, 0xcf, 0x15, 0xa9,\n                                                       0x9a, 0xdc, 0xe1, 0xd4, 0xab, 0x51, 0x56, 0x2c,\n                                                       0x48, 0x75, 0x65, 0x59, 0x58, 0xac, 0xdf, 0x1e,\n                                                       0xe, 0x79, 0xa, 0xf7, 0x20, 0xef, 0xf7, 0x99,\n                                                       0xf7, 0x6, 0x1, 0xa9, 0xf7, 0x1f, 0xf7, 0x41,\n                                                       0xf7, 0x33, 0x3, 0xb7, 0xf7, 0x33, 0x15, 0x25,\n                                                       0x8e, 0xdd, 0x3f, 0xf7, 0x10, 0x1b, 0xf7, 0xa1,\n                                                       0x8b, 0xf7, 0xc4, 0xcc, 0xf7, 0x4e, 0x46, 0xf7,\n                                                       0x42, 0xfb, 0x55, 0xfb, 0x21, 0x32, 0x28, 0xfb,\n                                                       0x22, 0xfb, 0x22, 0xf7, 0x2, 0x2f, 0xf7, 0x8,\n                                                       0xa6, 0xb8, 0x90, 0xc1, 0xb9, 0x1f, 0x8d, 0x89,\n                                                       0x5, 0x41, 0x86, 0x78, 0xfb, 0xf, 0x28, 0x1b,\n                                                       0x44, 0x8b, 0xc9, 0x9b, 0x89, 0x1f, 0x80, 0xf7,\n                                                       0xbc, 0x15, 0x9f, 0x8b, 0xf6, 0xe6, 0xce, 0xaf,\n                                                       0x47, 0x44, 0xfb, 0x7, 0x33, 0x84, 0x78, 0x2a,\n                                                       0x95, 0xf7, 0x9, 0x9c, 0x1e, 0xe, 0x8b, 0xf7,\n                                                       0x19, 0xf7, 0x89, 0xf7, 0x1a, 0x1, 0xe7, 0xf7,\n                                                       0x2a, 0x3, 0xe7, 0x16, 0xf7, 0x2a, 0xf7, 0x19,\n                                                       0xfb, 0x2a, 0x6, 0xf7, 0x89, 0x4, 0xf7, 0x2a,\n                                                       0xf7, 0x1a, 0xfb, 0x2a, 0x6, 0xe, 0xfb, 0x27,\n                                                       0x76, 0xf7, 0x4a, 0x76, 0xf8, 0x12, 0xf7, 0x1d,\n                                                       0x12, 0xf3, 0xf7, 0x1e, 0x44, 0xd2, 0x13, 0xf0,\n                                                       0xf3, 0x84, 0x15, 0x13, 0xe8, 0xce, 0x6, 0x2c,\n                                                       0x56, 0x8b, 0x71, 0x82, 0x1e, 0xa6, 0x52, 0x5,\n                                                       0xf7, 0xf, 0xb7, 0x8b, 0xe9, 0xc9, 0x1a, 0xed,\n                                                       0x7, 0x13, 0xf0, 0xfb, 0x1e, 0x6, 0xf7, 0x89,\n                                                       0x4, 0xf7, 0x1e, 0xf7, 0x1d, 0x81, 0xa, 0x91,\n                                                       0xa, 0xf7, 0x58, 0x15, 0xf8, 0x90, 0xfb, 0x60,\n                                                       0x5, 0xf7, 0x18, 0x7, 0xfb, 0xf6, 0xf7, 0x14,\n                                                       0xf7, 0xf6, 0xf7, 0x15, 0x5, 0xf7, 0x19, 0x7,\n                                                       0xfc, 0x90, 0xfb, 0x62, 0x5, 0xe, 0x3c, 0xe2,\n                                                       0xf7, 0xe, 0xe4, 0x82, 0xa, 0xb3, 0xf8, 0x8c,\n                                                       0x3, 0xb3, 0xe2, 0x15, 0xf8, 0x8c, 0xf7, 0xe,\n                                                       0xfc, 0x8c, 0x6, 0xe4, 0x4, 0xf8, 0x8c, 0xf7,\n                                                       0xd, 0xfc, 0x8c, 0x6, 0xe, 0x91, 0xa, 0x83,\n                                                       0x15, 0xf8, 0x90, 0xf7, 0x62, 0x5, 0xf7, 0x4,\n                                                       0x7, 0xfc, 0x90, 0xf7, 0x60, 0x5, 0xfb, 0x18,\n                                                       0x7, 0xf7, 0xf5, 0xfb, 0x14, 0xfb, 0xf5, 0xfb,\n                                                       0x15, 0x5, 0xe, 0x57, 0x8b, 0xf7, 0x1e, 0xf8,\n                                                       0x77, 0xf5, 0x12, 0xf7, 0x87, 0xf7, 0xc, 0xfb,\n                                                       0xc, 0xf7, 0x19, 0xbe, 0xf7, 0x15, 0x13, 0xe8,\n                                                       0xf7, 0x87, 0xf7, 0x4e, 0x15, 0xf7, 0xd, 0x6,\n                                                       0x8a, 0x92, 0x8b, 0x93, 0x8f, 0x1a, 0xbf, 0x91,\n                                                       0x9e, 0xc3, 0xba, 0x1e, 0xe8, 0xdb, 0xb1, 0xba,\n                                                       0xd2, 0x1a, 0xf7, 0x5, 0x25, 0xe8, 0xfb, 0x27,\n                                                       0xfb, 0x37, 0x3d, 0xfb, 0x4, 0x29, 0x85, 0x1e,\n                                                       0xf7, 0xe, 0x7b, 0x5, 0xd7, 0x9a, 0xb1, 0xb7,\n                                                       0xd3, 0x1b, 0xc4, 0xca, 0x6b, 0x4a, 0x60, 0x75,\n                                                       0x79, 0x49, 0x52, 0x1f, 0x2d, 0x3d, 0x87, 0x5e,\n                                                       0x8d, 0x2a, 0x8, 0xfb, 0x4e, 0x4, 0x13, 0xd8,\n                                                       0xf7, 0x19, 0xf7, 0x1e, 0xfb, 0x19, 0x6, 0xe,\n                                                       0xf8, 0x2d, 0x46, 0xda, 0xf7, 0x0, 0xda, 0xf7,\n                                                       0xca, 0xdb, 0xec, 0xda, 0x1, 0xf7, 0x16, 0xd8,\n                                                       0xdc, 0xf7, 0x1, 0xf8, 0x53, 0xd7, 0x3, 0xf8,\n                                                       0xc8, 0xf7, 0x3b, 0x15, 0x79, 0x90, 0x93, 0x6c,\n                                                       0xcb, 0x1b, 0xf7, 0x40, 0xf6, 0xf7, 0x37, 0xf7,\n                                                       0x28, 0xf7, 0x4c, 0xfb, 0x17, 0xf7, 0x2a, 0xfb,\n                                                       0x79, 0xfb, 0xc8, 0xfb, 0xe, 0xfb, 0x89, 0xfb,\n                                                       0x5b, 0xfb, 0x9e, 0xf7, 0x7d, 0xfb, 0xe, 0xf7,\n                                                       0x5c, 0xf7, 0x18, 0xf7, 0x41, 0xb4, 0xf7, 0x2e,\n                                                       0xd5, 0x1f, 0x32, 0x6, 0x66, 0x6f, 0x47, 0x3c,\n                                                       0xfb, 0x56, 0x1b, 0xfb, 0xa9, 0x3c, 0xf7, 0x41,\n                                                       0xf7, 0x1c, 0xf7, 0x11, 0xc7, 0xf7, 0x84, 0xf7,\n                                                       0xb9, 0xf7, 0x72, 0xc9, 0xfb, 0x30, 0x28, 0xfb,\n                                                       0x1d, 0x20, 0x35, 0x62, 0x75, 0x91, 0xa9, 0xa8,\n                                                       0x90, 0x1f, 0xca, 0xf7, 0xcb, 0x5, 0xfb, 0x2,\n                                                       0x6, 0x81, 0x5b, 0x5, 0xc0, 0x6a, 0x56, 0x91,\n                                                       0x72, 0x1b, 0xfb, 0x2b, 0x3d, 0xfb, 0x3a, 0xfb,\n                                                       0xd, 0x27, 0xc8, 0x39, 0xf0, 0xcd, 0xb0, 0xb1,\n                                                       0x96, 0x96, 0x1f, 0xfb, 0x3b, 0xf7, 0x19, 0x15,\n                                                       0xc8, 0xa0, 0xf7, 0x26, 0xee, 0xd0, 0x9d, 0x43,\n                                                       0x6f, 0x51, 0x6b, 0xfb, 0x2c, 0x28, 0x50, 0x7a,\n                                                       0xc0, 0xbd, 0x1e, 0xe, 0x69, 0xa, 0xf7, 0x37,\n                                                       0xf7, 0xe, 0xf8, 0x45, 0x77, 0x1, 0x9f, 0xf9,\n                                                       0x3e, 0x3, 0x9f, 0x16, 0xf7, 0x26, 0x6, 0xc3,\n                                                       0xf7, 0x37, 0x5, 0xf7, 0xa3, 0x6, 0xc6, 0xfb,\n                                                       0x37, 0x5, 0xf7, 0x2a, 0x6, 0xfb, 0xa4, 0xf9,\n                                                       0x62, 0x40, 0xa, 0x76, 0xfc, 0x45, 0x15, 0xe7,\n                                                       0xf7, 0x9e, 0xe9, 0xfb, 0x9e, 0x5, 0xe, 0xc6,\n                                                       0x8c, 0xf7, 0xd, 0xf7, 0x51, 0xf7, 0xe, 0xf7,\n                                                       0x38, 0x7b, 0xa, 0xf7, 0x22, 0xf7, 0xa9, 0xf7,\n                                                       0x1f, 0x3, 0xd7, 0x8d, 0x15, 0xf7, 0xa7, 0x6,\n                                                       0xf7, 0x30, 0xf7, 0x36, 0x89, 0xf7, 0x5f, 0xb4,\n                                                       0x7e, 0xf0, 0xfb, 0xd, 0xb1, 0x1f, 0xcd, 0xa8,\n                                                       0xac, 0xba, 0xca, 0x1a, 0xf7, 0x33, 0xfb, 0x22,\n                                                       0xb0, 0xfb, 0x21, 0x1e, 0xfb, 0xa7, 0x6, 0xf7,\n                                                       0x22, 0xfb, 0xb1, 0x15, 0xf7, 0x38, 0xf7, 0x19,\n                                                       0x7, 0xc8, 0xde, 0x8c, 0x3f, 0x3f, 0x2a, 0x7e,\n                                                       0x5c, 0x1f, 0xfb, 0x19, 0xfb, 0xcb, 0x15, 0xf7,\n                                                       0x51, 0xf7, 0x19, 0x7, 0xef, 0xd2, 0x82, 0x28,\n                                                       0x47, 0x3d, 0x7e, 0x2e, 0x1f, 0xe, 0xc6, 0x78,\n                                                       0xf7, 0x13, 0xf8, 0x8a, 0xf7, 0x13, 0x1, 0xb7,\n                                                       0xf7, 0x2d, 0x3, 0xf8, 0xb0, 0xf7, 0x9a, 0x15,\n                                                       0x3b, 0x79, 0x5d, 0x41, 0x29, 0x1b, 0xfb, 0x2b,\n                                                       0x6d, 0xf7, 0xc, 0xf7, 0x11, 0xba, 0x89, 0xf7,\n                                                       0x66, 0xf7, 0x4b, 0xd7, 0xca, 0x60, 0x3c, 0x9d,\n                                                       0x1f, 0xf7, 0x27, 0xad, 0x5, 0xf7, 0xa, 0x71,\n                                                       0xfb, 0x17, 0xec, 0xfb, 0x27, 0x1b, 0xfb, 0x83,\n                                                       0x2c, 0xfb, 0x49, 0xfb, 0x5f, 0xfb, 0x78, 0xf7,\n                                                       0x1b, 0xfb, 0x24, 0xf7, 0x5b, 0xf7, 0x84, 0xbe,\n                                                       0xf7, 0x47, 0xc4, 0x9a, 0x1f, 0xe, 0xc6, 0x8b,\n                                                       0xf7, 0xd, 0xf8, 0x70, 0x7b, 0xa, 0xf7, 0x26,\n                                                       0xf7, 0xcc, 0xf7, 0x2b, 0x3, 0xd7, 0x16, 0xf7,\n                                                       0x7c, 0x6, 0xf7, 0x9e, 0xf7, 0x3, 0xf7, 0x23,\n                                                       0xf7, 0x65, 0xf7, 0xb0, 0xfb, 0x36, 0xdd, 0xfb,\n                                                       0x6b, 0x1f, 0xfb, 0x7c, 0x6, 0xf7, 0x26, 0xfc,\n                                                       0xe9, 0x15, 0xf8, 0x70, 0xe1, 0x7, 0xf7, 0xe,\n                                                       0xf3, 0x85, 0xfb, 0x83, 0xfb, 0x7b, 0xfb, 0x5,\n                                                       0x8b, 0xfb, 0x5, 0x1f, 0xe, 0x8f, 0x8b, 0xf7,\n                                                       0xd, 0xf7, 0x57, 0xf7, 0xd, 0xf7, 0x34, 0x7b,\n                                                       0xa, 0xf7, 0x24, 0x3, 0xd7, 0x16, 0xf8, 0xb5,\n                                                       0xf7, 0xd, 0xfc, 0x25, 0xf7, 0x57, 0xf7, 0xf3,\n                                                       0xf7, 0xd, 0xfb, 0xf3, 0xf7, 0x34, 0xf8, 0x18,\n                                                       0xf7, 0xd, 0xfc, 0xa8, 0x6, 0xe, 0x57, 0xa0,\n                                                       0x76, 0xf7, 0xc5, 0xf7, 0xd, 0xf7, 0x3f, 0x7b,\n                                                       0xa, 0xf7, 0x2a, 0x3, 0xd7, 0x16, 0xf7, 0x2a,\n                                                       0xf7, 0xc5, 0xf7, 0xc2, 0xf7, 0xd, 0xfb, 0xc2,\n                                                       0xf7, 0x3f, 0xf7, 0xfd, 0xf7, 0xd, 0xfc, 0x93,\n                                                       0x6, 0xe, 0xf7, 0x7, 0x78, 0xf7, 0x13, 0xf7,\n                                                       0x2e, 0xf7, 0x10, 0xf7, 0x60, 0xf7, 0x13, 0x1,\n                                                       0xc5, 0xf7, 0x29, 0xf7, 0xfc, 0xf7, 0x26, 0x3,\n                                                       0xf8, 0x22, 0xf7, 0x9a, 0x15, 0xf7, 0x3d, 0x2f,\n                                                       0x6, 0x7d, 0x78, 0x49, 0x5b, 0x37, 0x1b, 0xfb,\n                                                       0x3c, 0x66, 0xf7, 0x25, 0xf7, 0x0, 0xa0, 0x8f,\n                                                       0xa4, 0x94, 0xa9, 0x1f, 0x94, 0xaa, 0x97, 0xa5,\n                                                       0x9c, 0xa1, 0x8, 0xb8, 0xae, 0xbe, 0xa8, 0xcf,\n                                                       0x1b, 0xb6, 0xe5, 0x7c, 0x27, 0xa8, 0x1f, 0xf7,\n                                                       0x24, 0xa6, 0x5, 0xf7, 0x48, 0x63, 0xfb, 0x29,\n                                                       0xae, 0xfb, 0x9, 0x1b, 0xfb, 0x15, 0x32, 0x5a,\n                                                       0x43, 0x53, 0x1f, 0x6f, 0x67, 0x77, 0x63, 0x7e,\n                                                       0x5e, 0x8, 0x7e, 0x5e, 0x85, 0x65, 0x6c, 0x1a,\n                                                       0xfb, 0x54, 0xea, 0xfb, 0x50, 0xf7, 0x97, 0xf7,\n                                                       0x26, 0xf7, 0x12, 0xd4, 0xb3, 0xb6, 0x1e, 0xf7,\n                                                       0xb8, 0xfb, 0xcf, 0x7, 0xe, 0x69, 0xa, 0xf7,\n                                                       0xcf, 0xf7, 0xe, 0xf7, 0xad, 0x77, 0x1, 0xd2,\n                                                       0xf7, 0x26, 0xf7, 0xb4, 0xf7, 0x26, 0x3, 0xd2,\n                                                       0x16, 0xf7, 0x26, 0xf7, 0xcf, 0xf7, 0xb4, 0xfb,\n                                                       0xcf, 0xf7, 0x26, 0xf9, 0x62, 0xfb, 0x26, 0xfb,\n                                                       0xad, 0xfb, 0xb4, 0xf7, 0xad, 0xfb, 0x26, 0x6,\n                                                       0xe, 0xfc, 0x15, 0x3f, 0xa, 0xf7, 0x10, 0xf7,\n                                                       0x2a, 0x3, 0xcb, 0x16, 0xf7, 0x2a, 0xf9, 0x62,\n                                                       0xfb, 0x2a, 0x6, 0xe, 0x20, 0x79, 0xf7, 0x12,\n                                                       0xf8, 0xf6, 0x77, 0x1, 0xf7, 0xe7, 0xf7, 0x25,\n                                                       0x3, 0xa1, 0xf7, 0x70, 0x15, 0xfb, 0x38, 0xdb,\n                                                       0x41, 0xf7, 0x23, 0xf7, 0x41, 0xcd, 0xf7, 0xb,\n                                                       0xf7, 0x2b, 0x1e, 0xf8, 0x66, 0xfb, 0x25, 0xfc,\n                                                       0x66, 0x7, 0x44, 0x86, 0x42, 0x32, 0x36, 0x8f,\n                                                       0xdf, 0xb9, 0x87, 0x1e, 0xe, 0xc6, 0x3f, 0xa,\n                                                       0xe2, 0xf7, 0x22, 0x3, 0xe2, 0x16, 0xf7, 0x22,\n                                                       0xf7, 0x6e, 0x6, 0xf7, 0x8, 0xf7, 0xc, 0xf7,\n                                                       0x55, 0xfb, 0xe6, 0x5, 0xf7, 0x4c, 0x6, 0xfb,\n                                                       0xab, 0xf8, 0x4c, 0xf7, 0x9c, 0xf7, 0xaa, 0x5,\n                                                       0xfb, 0x52, 0x6, 0xfb, 0xb4, 0xfb, 0xd1, 0x5,\n                                                       0xf7, 0xd1, 0xfb, 0x22, 0x7, 0xe, 0x86, 0xa,\n                                                       0xd7, 0xf7, 0x25, 0x3, 0xd7, 0x16, 0xf8, 0x8f,\n                                                       0xf7, 0xe, 0xfb, 0xfe, 0xf8, 0xe8, 0xfb, 0x25,\n                                                       0x6, 0xe, 0xf7, 0x3e, 0xa0, 0x76, 0xf8, 0xc9,\n                                                       0xf7, 0x2d, 0x1, 0xd0, 0xf7, 0x1b, 0xf8, 0x3e,\n                                                       0xf7, 0x1b, 0x3, 0xd0, 0x16, 0xf7, 0x1b, 0xf8,\n                                                       0xc9, 0x8d, 0x6, 0xf7, 0x22, 0xfc, 0xc9, 0x5,\n                                                       0xf7, 0x20, 0x6, 0xf7, 0x20, 0xf8, 0xc9, 0x5,\n                                                       0x8d, 0xfc, 0xc9, 0xf7, 0x1b, 0xf9, 0x62, 0xfb,\n                                                       0x6f, 0x6, 0xfb, 0x13, 0xfc, 0x7c, 0x5, 0x88,\n                                                       0x6, 0xfb, 0x15, 0xf8, 0x7c, 0x5, 0xfb, 0x6e,\n                                                       0x6, 0xe, 0xc6, 0xa0, 0x76, 0xf9, 0x62, 0x5c,\n                                                       0xa, 0xf8, 0x67, 0x8d, 0x6, 0xf7, 0xbb, 0xfc,\n                                                       0x67, 0x5, 0xf7, 0x2a, 0xf9, 0x62, 0xfb, 0x1e,\n                                                       0xfc, 0x72, 0x89, 0x6, 0xfb, 0xc1, 0xf8, 0x72,\n                                                       0x5, 0xfb, 0x24, 0x6, 0xe, 0xf7, 0x7, 0x78,\n                                                       0xf7, 0x13, 0xf8, 0x76, 0xf7, 0x13, 0x1, 0xd0,\n                                                       0xf7, 0x28, 0xf7, 0xf8, 0x85, 0xa, 0xb7, 0xf7,\n                                                       0xea, 0x15, 0x7c, 0x8d, 0x75, 0x90, 0x6d, 0x1e,\n                                                       0x94, 0x4f, 0xa0, 0x53, 0xae, 0x58, 0x8, 0x40,\n                                                       0xbe, 0xe5, 0x57, 0xf7, 0x18, 0x1b, 0xf7, 0x10,\n                                                       0xe2, 0xba, 0xd2, 0xc2, 0x1f, 0xa6, 0xaf, 0x9f,\n                                                       0xb4, 0x98, 0xb8, 0x8, 0x98, 0xb9, 0x91, 0xb3,\n                                                       0xae, 0x1a, 0xf7, 0x69, 0x3d, 0xa, 0xfb, 0x20,\n                                                       0xfb, 0x7f, 0x1e, 0xf7, 0x28, 0x16, 0xf7, 0x0,\n                                                       0xac, 0xf7, 0x20, 0xf7, 0x38, 0xf7, 0x44, 0xa0,\n                                                       0xfb, 0x39, 0x38, 0x76, 0x87, 0x72, 0x84, 0x6c,\n                                                       0x1e, 0x84, 0x6c, 0x80, 0x70, 0x7c, 0x74, 0x8,\n                                                       0x5c, 0x6c, 0x59, 0x6e, 0x43, 0x1b, 0x3f, 0x5a,\n                                                       0xa9, 0x89, 0xa, 0xaa, 0x8, 0x85, 0xaa, 0x88,\n                                                       0xa5, 0xa0, 0x1a, 0xe, 0x8f, 0xa0, 0x76, 0xf7,\n                                                       0xac, 0xf7, 0xd, 0xf7, 0x58, 0xf7, 0xd, 0x60,\n                                                       0xa, 0xf7, 0xac, 0xdb, 0x6, 0xf7, 0x31, 0xf7,\n                                                       0x3d, 0x7e, 0xf7, 0x7a, 0xf7, 0x6c, 0xfb, 0x26,\n                                                       0x90, 0xfb, 0x48, 0x1f, 0xfb, 0x75, 0x6, 0xf7,\n                                                       0x25, 0xfb, 0xd1, 0x15, 0xf7, 0x58, 0xdb, 0x7,\n                                                       0xf4, 0xd2, 0x89, 0x27, 0x24, 0x26, 0x94, 0x40,\n                                                       0x1f, 0xe, 0xf7, 0x7, 0x6c, 0x76, 0xc6, 0xf7,\n                                                       0xf, 0xf8, 0x6f, 0xf7, 0xe, 0x1, 0xd1, 0xf7,\n                                                       0x23, 0xf7, 0xe7, 0xf7, 0x23, 0x3, 0xf8, 0xa8,\n                                                       0xb0, 0x15, 0xc4, 0x64, 0xb5, 0x68, 0xc2, 0x7c,\n                                                       0xbe, 0xf0, 0x18, 0x4f, 0xa2, 0x68, 0xa5, 0x7b,\n                                                       0x96, 0x8, 0xa6, 0xa7, 0xc5, 0xe2, 0xf7, 0x20,\n                                                       0x1a, 0xf7, 0x67, 0xfb, 0x3, 0xf7, 0x2c, 0xfb,\n                                                       0x73, 0xfb, 0x6b, 0xfb, 0xa, 0xfb, 0x20, 0xfb,\n                                                       0x73, 0x38, 0xa0, 0x2c, 0xbf, 0x47, 0x1e, 0x48,\n                                                       0xc0, 0xde, 0x5f, 0xf7, 0x10, 0x1b, 0xd3, 0xc7,\n                                                       0x9e, 0x96, 0xa2, 0x1f, 0xfb, 0x50, 0xf7, 0x23,\n                                                       0x15, 0xab, 0x7f, 0xb2, 0x76, 0x9a, 0x80, 0x8,\n                                                       0x88, 0x80, 0x80, 0x88, 0x6c, 0x1b, 0x44, 0x5c,\n                                                       0xa8, 0x89, 0xa, 0xac, 0x8, 0x85, 0xac, 0x88,\n                                                       0xa4, 0x9e, 0x1a, 0xf7, 0x7, 0xac, 0xf7, 0x12,\n                                                       0xf7, 0x31, 0xf7, 0x32, 0xac, 0xfb, 0x21, 0x27,\n                                                       0x6a, 0x81, 0x50, 0x7f, 0x6e, 0x1e, 0x80, 0x6f,\n                                                       0x7e, 0x7a, 0x84, 0x82, 0x6a, 0xa4, 0x5d, 0xa8,\n                                                       0x56, 0x9e, 0x8, 0xe, 0x69, 0xa, 0xf7, 0xc0,\n                                                       0xf7, 0x6, 0xf7, 0x4b, 0x7b, 0xa, 0xf7, 0x1b,\n                                                       0xf7, 0xa5, 0xf7, 0x1f, 0x3, 0xd7, 0x16, 0xf7,\n                                                       0x1b, 0xf7, 0xc0, 0xa6, 0x6, 0xe5, 0xa1, 0x81,\n                                                       0xfb, 0x16, 0xdc, 0x1f, 0xdf, 0xfb, 0x34, 0x5,\n                                                       0xf7, 0x36, 0x6, 0x3a, 0xf7, 0x20, 0x47, 0xf7,\n                                                       0x8, 0x71, 0xa5, 0x53, 0xad, 0x19, 0x8d, 0x7,\n                                                       0xf0, 0x92, 0xd7, 0xdb, 0xf7, 0x3, 0x1a, 0xf7,\n                                                       0x52, 0xfb, 0x1b, 0x97, 0xfb, 0x45, 0x1e, 0xfb,\n                                                       0x7f, 0x6, 0xf7, 0x1b, 0xfb, 0xc4, 0x15, 0xf7,\n                                                       0x4b, 0xef, 0x7, 0xf5, 0xce, 0x94, 0x28, 0x2c,\n                                                       0x30, 0x8d, 0x39, 0x1f, 0xe, 0x8f, 0x78, 0xf7,\n                                                       0x10, 0xf7, 0x64, 0xf7, 0x1b, 0xf7, 0x3b, 0xf7,\n                                                       0xe, 0x1, 0xcc, 0xf7, 0x21, 0xf7, 0x96, 0xf7,\n                                                       0x26, 0x3, 0xb2, 0xf7, 0x7b, 0x15, 0xfb, 0x87,\n                                                       0x72, 0xa, 0xbe, 0xf7, 0x42, 0xf7, 0x48, 0xfb,\n                                                       0x2a, 0xae, 0xfb, 0x3, 0xa6, 0x1f, 0xfb, 0x9,\n                                                       0xa6, 0x5e, 0x96, 0xba, 0x1a, 0xc6, 0xda, 0xa2,\n                                                       0xb6, 0xf7, 0x8, 0x96, 0x47, 0x65, 0x91, 0x1e,\n                                                       0xf7, 0x28, 0x91, 0x5, 0xf7, 0x3a, 0x85, 0xfb,\n                                                       0x18, 0xc3, 0xfb, 0x23, 0x1b, 0xfb, 0x69, 0x59,\n                                                       0xfb, 0x11, 0x3c, 0xfb, 0x36, 0xf7, 0x35, 0x63,\n                                                       0xd3, 0x79, 0x1f, 0xf7, 0x1a, 0x6a, 0xbe, 0x7e,\n                                                       0x4e, 0x1a, 0x5c, 0x61, 0x55, 0x25, 0xfb, 0x18,\n                                                       0x78, 0xf1, 0xb1, 0x84, 0x1e, 0xe, 0x57, 0xa0,\n                                                       0x76, 0xf8, 0xe8, 0xf7, 0xe, 0x1, 0xf7, 0x7c,\n                                                       0x85, 0xa, 0xf7, 0x7c, 0x16, 0xf7, 0x28, 0xf8,\n                                                       0xe8, 0xf7, 0x6e, 0xf7, 0xe, 0xfc, 0xdc, 0xfb,\n                                                       0xe, 0xf7, 0x6e, 0x6, 0xe, 0xc6, 0x78, 0xf7,\n                                                       0x12, 0xf8, 0xf7, 0x77, 0x42, 0xa, 0xd3, 0xf9,\n                                                       0x62, 0x15, 0xfc, 0x22, 0x7, 0xfb, 0x3c, 0xb7,\n                                                       0xfb, 0x3f, 0xf7, 0x8d, 0xf7, 0x6d, 0xd0, 0xf7,\n                                                       0x1, 0xf7, 0x7a, 0x1e, 0xf8, 0x22, 0xfb, 0x26,\n                                                       0xfc, 0x22, 0x7, 0xfb, 0x11, 0x8b, 0x33, 0xfb,\n                                                       0x20, 0xfb, 0x16, 0x7a, 0xdc, 0xf7, 0x18, 0x1e,\n                                                       0xf8, 0x22, 0x7, 0xe, 0x8f, 0x3f, 0xa, 0xf7,\n                                                       0x98, 0x16, 0xf7, 0x26, 0x6, 0xf7, 0x86, 0xf9,\n                                                       0x62, 0x40, 0xa, 0xfb, 0x39, 0xfc, 0xa7, 0x6e,\n                                                       0xa, 0xfb, 0x3d, 0xf8, 0xa7, 0x5, 0xfb, 0x28,\n                                                       0x6, 0xe, 0xf7, 0xad, 0xa0, 0x76, 0xf8, 0xaf,\n                                                       0x77, 0xf7, 0x5b, 0x77, 0x1, 0xf7, 0x4a, 0x16,\n                                                       0xf7, 0x2d, 0x6, 0xf7, 0x1d, 0xf8, 0xaf, 0x5,\n                                                       0x8c, 0x6, 0xf7, 0x1d, 0xfc, 0xaf, 0x5, 0xf7,\n                                                       0x2a, 0x6, 0xf7, 0x3d, 0xf9, 0x62, 0x5, 0xfb,\n                                                       0x22, 0x6, 0x22, 0xfc, 0x88, 0x6e, 0xa, 0xfb,\n                                                       0xd, 0xf8, 0x88, 0x5, 0xfb, 0x3b, 0x6, 0xfb,\n                                                       0x12, 0xfc, 0x80, 0x6e, 0xa, 0x23, 0xf8, 0x80,\n                                                       0x5, 0xfb, 0x24, 0x6, 0xe, 0x8f, 0x3f, 0xa,\n                                                       0x99, 0x16, 0xf7, 0x3b, 0x6, 0xf7, 0x2c, 0xf7,\n                                                       0x8d, 0xf7, 0x2d, 0xfb, 0x8d, 0x5, 0xf7, 0x3b,\n                                                       0x6, 0xfb, 0x7f, 0xf8, 0x7, 0xf7, 0x6a, 0xf7,\n                                                       0xef, 0x5, 0xfb, 0x35, 0x6, 0xfb, 0x1b, 0xfb,\n                                                       0x7c, 0xfb, 0x1e, 0xf7, 0x7c, 0x5, 0xfb, 0x36,\n                                                       0x6, 0xf7, 0x69, 0xfb, 0xe9, 0x5, 0xe, 0x8f,\n                                                       0x3f, 0xa, 0xf7, 0x9d, 0xf7, 0x1d, 0x3, 0xf7,\n                                                       0x9d, 0x16, 0xf7, 0x1d, 0xf7, 0xc2, 0x6, 0xf7,\n                                                       0x8f, 0xf8, 0x34, 0x4f, 0xa, 0xfc, 0x33, 0x5,\n                                                       0xe, 0x57, 0x8b, 0xf7, 0xe, 0xf8, 0x6e, 0xf7,\n                                                       0xe, 0x1, 0xa4, 0x16, 0xf8, 0xc5, 0xf7, 0xe,\n                                                       0x87, 0xa, 0xf7, 0x6, 0xfc, 0x8e, 0xfb, 0xe,\n                                                       0x8c, 0xa, 0xe, 0x7f, 0xa, 0xca, 0xf7, 0x19,\n                                                       0x3, 0xf7, 0x58, 0x33, 0x15, 0xf9, 0x52, 0xf7,\n                                                       0x5, 0xf7, 0x0, 0xfb, 0x8a, 0xfe, 0x2a, 0xf7,\n                                                       0x8a, 0xf7, 0x0, 0x7, 0xe, 0xfc, 0x15, 0x8d,\n                                                       0x76, 0xf9, 0x88, 0x77, 0x1, 0x4e, 0xf7, 0xec,\n                                                       0x3, 0xf7, 0x4e, 0x78, 0x15, 0xf7, 0x11, 0x6,\n                                                       0xfb, 0x6d, 0x93, 0xa, 0x7f, 0xa, 0xf7, 0x1d,\n                                                       0xf7, 0x19, 0x3, 0xa3, 0x33, 0x15, 0xfb, 0x0,\n                                                       0xf7, 0x8a, 0xfa, 0x2a, 0xfb, 0x8a, 0xfb, 0x0,\n                                                       0xf7, 0x5, 0xfd, 0x52, 0x7, 0xe, 0x3c, 0xf7,\n                                                       0xec, 0x76, 0xf7, 0x79, 0x84, 0xa, 0xc9, 0xf7,\n                                                       0xd7, 0x15, 0xf7, 0x1c, 0x6, 0xe9, 0xf7, 0x79,\n                                                       0xea, 0xfb, 0x79, 0x5, 0xf7, 0x1b, 0x6, 0xfb,\n                                                       0x42, 0xf8, 0xb, 0x5, 0x20, 0x6, 0xe, 0x20,\n                                                       0xfb, 0x11, 0xbd, 0x1, 0x40, 0x4, 0x59, 0xf8,\n                                                       0xc0, 0xbd, 0x7, 0xe, 0xf8, 0xf0, 0x84, 0xa,\n                                                       0x74, 0xf7, 0x8c, 0x3, 0xf7, 0x13, 0xf8, 0xf0,\n                                                       0x15, 0xed, 0x6, 0x3f, 0x83, 0xa, 0xfb, 0x40,\n                                                       0x6, 0xe, 0x20, 0x7d, 0xef, 0x48, 0x76, 0xf8,\n                                                       0x4c, 0xf7, 0x0, 0x12, 0xa8, 0xf7, 0x1a, 0xf7,\n                                                       0x58, 0xf7, 0x1d, 0x13, 0x78, 0xf8, 0x6, 0xc4,\n                                                       0x30, 0xa, 0x77, 0xb8, 0x83, 0xa3, 0x38, 0xa,\n                                                       0xad, 0x1a, 0xeb, 0x8a, 0xf4, 0xfb, 0x73, 0xfb,\n                                                       0x32, 0x5b, 0x49, 0x35, 0x73, 0x1e, 0xf7, 0x13,\n                                                       0x73, 0x5, 0xa6, 0x2d, 0xa, 0x7f, 0x6e, 0x83,\n                                                       0x3c, 0x7d, 0x8, 0x41, 0x7c, 0xfb, 0xc, 0x73,\n                                                       0xfb, 0x17, 0x1a, 0x13, 0xb8, 0x2e, 0xd1, 0x4a,\n                                                       0x37, 0xa, 0xf7, 0x5b, 0x15, 0x6f, 0x7, 0x3c,\n                                                       0x97, 0x5d, 0x4c, 0x3d, 0x1b, 0x55, 0x6d, 0xa7,\n                                                       0xa9, 0xbd, 0xca, 0xa9, 0xa4, 0x90, 0x1f, 0xa9,\n                                                       0x92, 0xc8, 0x95, 0x9c, 0x95, 0x8, 0xe, 0x57,\n                                                       0x7d, 0xf7, 0x2, 0x3e, 0x76, 0xf8, 0x41, 0xf5,\n                                                       0xf7, 0x4d, 0x77, 0x12, 0xde, 0xf7, 0x20, 0xf7,\n                                                       0x5a, 0xf7, 0x24, 0x13, 0x7c, 0xc8, 0x89, 0x15,\n                                                       0xf7, 0x17, 0xd8, 0x8d, 0x6, 0x13, 0xbc, 0x3d,\n                                                       0xc1, 0xd8, 0x80, 0xaa, 0x1b, 0xf7, 0x7, 0xf6,\n                                                       0xe0, 0xf7, 0x50, 0xf7, 0x4c, 0x22, 0xe5, 0xfb,\n                                                       0xa, 0x35, 0x5b, 0x5a, 0x74, 0x77, 0x1f, 0xf7,\n                                                       0x95, 0xfb, 0x20, 0x7, 0x13, 0x7c, 0xf7, 0x1f,\n                                                       0xfc, 0x52, 0x15, 0xf5, 0xbf, 0xbc, 0xcc, 0xf3,\n                                                       0x98, 0xfb, 0x2, 0x51, 0x1e, 0x13, 0xbc, 0xfb,\n                                                       0x16, 0x4c, 0x6a, 0x5b, 0x31, 0x6a, 0xda, 0xec,\n                                                       0x1e, 0xe, 0x20, 0x7d, 0xf7, 0x8, 0xf7, 0xe1,\n                                                       0xf7, 0x3, 0x1, 0xb9, 0xf7, 0x21, 0x3, 0xf8,\n                                                       0x1a, 0xf7, 0x5e, 0x15, 0x6c, 0x85, 0x76, 0x46,\n                                                       0x3b, 0x1b, 0x3c, 0x6e, 0xc6, 0xf7, 0x5, 0xac,\n                                                       0x86, 0xf7, 0x14, 0xf7, 0x5, 0xce, 0xa4, 0x5c,\n                                                       0x66, 0x92, 0x1f, 0xf7, 0x1b, 0xa4, 0x5, 0xd2,\n                                                       0x77, 0x5a, 0xee, 0xfb, 0x39, 0x1b, 0xfb, 0x59,\n                                                       0x57, 0xfb, 0x28, 0xfb, 0x10, 0x31, 0xae, 0xfb,\n                                                       0x5a, 0xf7, 0x6a, 0xf7, 0x17, 0xdc, 0xc9, 0xf7,\n                                                       0x18, 0xa8, 0x1f, 0xe, 0x57, 0x7d, 0xf7, 0x2,\n                                                       0x3e, 0x76, 0xf8, 0x3f, 0xf5, 0xf7, 0x4f, 0x77,\n                                                       0x12, 0xad, 0xf7, 0x24, 0xf7, 0x6d, 0xf7, 0x20,\n                                                       0x13, 0x7c, 0xf8, 0x38, 0x89, 0x15, 0xf7, 0x17,\n                                                       0xf9, 0x64, 0xfb, 0x20, 0xfb, 0x97, 0x6, 0xa2,\n                                                       0x77, 0x5b, 0xbc, 0x35, 0x1b, 0xfb, 0xa, 0x22,\n                                                       0x36, 0xfb, 0x4c, 0x1f, 0x13, 0xbc, 0xfb, 0x50,\n                                                       0xf6, 0x33, 0xf7, 0x7, 0xe9, 0xae, 0xb7, 0xb7,\n                                                       0xae, 0x1e, 0x13, 0x7c, 0xfb, 0x86, 0xf7, 0x50,\n                                                       0x15, 0xc5, 0x98, 0xf4, 0xf3, 0xcc, 0xbf, 0x51,\n                                                       0x22, 0x1e, 0x13, 0xbc, 0x2a, 0x6a, 0x46, 0x31,\n                                                       0x5b, 0x4c, 0xb0, 0xf7, 0x15, 0x1e, 0xe, 0x20,\n                                                       0x7d, 0xf7, 0x0, 0xf7, 0x17, 0xe1, 0xf7, 0x2b,\n                                                       0xf7, 0x0, 0x1, 0xa9, 0xf7, 0x28, 0xf7, 0x64,\n                                                       0xf7, 0x22, 0x3, 0xf7, 0x3c, 0xf7, 0x76, 0x15,\n                                                       0xf7, 0xfc, 0x6, 0xf7, 0x33, 0x57, 0xf7, 0x35,\n                                                       0xfb, 0x5e, 0xfb, 0x3e, 0x3a, 0xfb, 0x1e, 0xfb,\n                                                       0x25, 0xfb, 0x3b, 0xf1, 0xfb, 0x2, 0xf7, 0x29,\n                                                       0xf7, 0x46, 0xc3, 0xf7, 0x12, 0xac, 0x97, 0x1e,\n                                                       0xfb, 0x22, 0xa3, 0x5, 0x72, 0x83, 0x6d, 0x59,\n                                                       0x49, 0x1b, 0x3a, 0x74, 0xcf, 0xcb, 0x89, 0x1f,\n                                                       0x8e, 0xe1, 0x15, 0xce, 0xaf, 0xc6, 0xce, 0xd3,\n                                                       0xb3, 0x4d, 0x4b, 0x1e, 0xe, 0x76, 0xa, 0xf4,\n                                                       0xf4, 0x1, 0xd8, 0xf7, 0x14, 0x3, 0xd8, 0x16,\n                                                       0xf7, 0x14, 0xf8, 0x2c, 0xde, 0xf7, 0x1, 0x38,\n                                                       0xb0, 0x6, 0xa9, 0x8b, 0xb1, 0xbd, 0x93, 0x9c,\n                                                       0x89, 0x85, 0xa1, 0x1e, 0x9b, 0xeb, 0x5, 0x98,\n                                                       0x65, 0x76, 0x8f, 0x73, 0x1b, 0xfb, 0x21, 0x7a,\n                                                       0xfb, 0x1, 0x4e, 0x1f, 0x63, 0x48, 0xfb, 0x1,\n                                                       0xce, 0x7, 0xe, 0x57, 0xfb, 0x6d, 0xf7, 0x0,\n                                                       0xf7, 0x1, 0xf7, 0x7, 0xf7, 0xd7, 0xf7, 0x0,\n                                                       0x1, 0xb3, 0xf7, 0x23, 0xf7, 0x7b, 0xf7, 0x1f,\n                                                       0x3, 0xc5, 0x67, 0x15, 0xfb, 0x40, 0xf7, 0x10,\n                                                       0x82, 0xf7, 0xe, 0xf7, 0x79, 0x9f, 0xf7, 0xf,\n                                                       0xf7, 0x28, 0x1e, 0xf8, 0x74, 0xfb, 0x16, 0x40,\n                                                       0x89, 0x7, 0xa3, 0x7c, 0x5c, 0xca, 0x2a, 0x1b,\n                                                       0x35, 0xfb, 0x1c, 0x55, 0xfb, 0x70, 0xfb, 0x2c,\n                                                       0xde, 0xfb, 0xc, 0xf7, 0x1a, 0xca, 0xc4, 0xae,\n                                                       0xbe, 0xae, 0x1f, 0x8d, 0x3d, 0x6, 0x4d, 0x8b,\n                                                       0x54, 0xfb, 0x7, 0x50, 0x7d, 0x9c, 0xb0, 0x82,\n                                                       0x1e, 0x69, 0xf7, 0xdb, 0x15, 0xb3, 0x94, 0xf7,\n                                                       0x12, 0xf5, 0xea, 0xa1, 0x29, 0x47, 0xfb, 0x1f,\n                                                       0x38, 0x79, 0x66, 0x32, 0x74, 0xdf, 0xd4, 0x1e,\n                                                       0xe, 0x57, 0xa0, 0x76, 0xf8, 0x3e, 0xf4, 0xf7,\n                                                       0x4f, 0x77, 0x1, 0xcc, 0xf7, 0x20, 0xf7, 0x5d,\n                                                       0x7d, 0xa, 0xcc, 0x16, 0xf7, 0x20, 0xf7, 0x99,\n                                                       0x6, 0xc4, 0x8b, 0xf7, 0x0, 0xf7, 0x6, 0xe2,\n                                                       0x8b, 0x3e, 0x33, 0x1e, 0xfb, 0x99, 0xf7, 0x20,\n                                                       0xf7, 0x99, 0x7, 0xf7, 0x44, 0x4f, 0xe9, 0xfb,\n                                                       0xc, 0x6e, 0x47, 0x88, 0x40, 0x4b, 0x1e, 0xf7,\n                                                       0x9d, 0xfb, 0x20, 0x7, 0xe, 0x4c, 0xa, 0xf8,\n                                                       0xa1, 0x77, 0xe9, 0xf7, 0x12, 0x1, 0xf7, 0x22,\n                                                       0x63, 0xa, 0xf8, 0xa1, 0x68, 0xa, 0xd5, 0x4,\n                                                       0xf7, 0x20, 0xf7, 0x12, 0x6d, 0xa, 0xfc, 0x15,\n                                                       0xfb, 0x6a, 0xf7, 0x16, 0xf8, 0xf5, 0x77, 0xe9,\n                                                       0xf7, 0x12, 0x1, 0xf7, 0x8, 0xf7, 0x1b, 0x3,\n                                                       0xa7, 0x3b, 0x15, 0x73, 0xfb, 0xb, 0x5, 0x88,\n                                                       0x97, 0xb4, 0x7f, 0xb3, 0x1b, 0xf7, 0x22, 0x97,\n                                                       0xf7, 0x9, 0xf7, 0x5, 0x1f, 0xf8, 0x91, 0xfb,\n                                                       0x1b, 0xfc, 0x89, 0x7, 0x42, 0x8c, 0x68, 0x52,\n                                                       0x7c, 0x7f, 0x8e, 0x8c, 0x86, 0x1e, 0xe3, 0xf9,\n                                                       0x3b, 0x15, 0xf7, 0x1b, 0xf7, 0x12, 0xfb, 0x1b,\n                                                       0x6, 0xe, 0x20, 0x3f, 0xa, 0xd0, 0xf7, 0x21,\n                                                       0x3, 0xd0, 0x16, 0xf7, 0x21, 0xf7, 0x3b, 0x6,\n                                                       0xcd, 0xcf, 0xf7, 0x1a, 0xfb, 0x7f, 0x5, 0xf7,\n                                                       0x2c, 0x6, 0xfb, 0x57, 0xf7, 0xdf, 0xf7, 0x4b,\n                                                       0xf7, 0x53, 0x5, 0xfb, 0x42, 0x6, 0xfb, 0x3a,\n                                                       0xfb, 0x4c, 0x5, 0xf8, 0x10, 0xfb, 0x21, 0x7,\n                                                       0xe, 0xfc, 0x15, 0x3f, 0xa, 0xd0, 0x63, 0xa,\n                                                       0xf9, 0x62, 0x6d, 0xa, 0xf7, 0x76, 0xa0, 0x76,\n                                                       0xf8, 0x4a, 0xf7, 0x0, 0x7f, 0x77, 0x12, 0xdc,\n                                                       0xf7, 0x1d, 0xf7, 0x33, 0xf7, 0x1c, 0xf7, 0x44,\n                                                       0xf7, 0x1d, 0x13, 0xdc, 0xcb, 0x16, 0xf7, 0x1d,\n                                                       0xf7, 0xb1, 0x6, 0xe6, 0x9f, 0xc9, 0xe0, 0xd3,\n                                                       0x8a, 0x4f, 0x30, 0x1e, 0xfb, 0xb3, 0xf7, 0x1c,\n                                                       0xf7, 0xb3, 0x7, 0xd8, 0xa3, 0xd5, 0xda, 0xd4,\n                                                       0x8b, 0x33, 0x4c, 0x1e, 0xfb, 0xb3, 0xf7, 0x1d,\n                                                       0xf7, 0xb7, 0x7, 0xc5, 0x8b, 0xf7, 0x59, 0xfb,\n                                                       0x3e, 0x36, 0x59, 0x53, 0x6f, 0x74, 0x1e, 0xa1,\n                                                       0x7e, 0x69, 0xc9, 0x28, 0x1b, 0x66, 0x4d, 0x85,\n                                                       0x3d, 0x4f, 0x1f, 0x13, 0xbc, 0x89, 0xd3, 0xfb,\n                                                       0x13, 0x6, 0xe, 0x57, 0xa0, 0x76, 0xf8, 0x4a,\n                                                       0xeb, 0x2b, 0xf7, 0x0, 0x12, 0x7a, 0xf7, 0x20,\n                                                       0xf7, 0xaf, 0xf7, 0x20, 0x13, 0xb8, 0xcc, 0x16,\n                                                       0xf7, 0x20, 0xf7, 0x8f, 0x6, 0xe3, 0x94, 0xee,\n                                                       0xf6, 0xe0, 0x8b, 0x28, 0x33, 0x1e, 0xfb, 0x8f,\n                                                       0xf7, 0x20, 0xf7, 0x8f, 0x7, 0xf7, 0x18, 0x72,\n                                                       0xf7, 0x37, 0xfb, 0x2b, 0x55, 0x48, 0x78, 0x43,\n                                                       0x57, 0x1e, 0x13, 0xd8, 0x89, 0xda, 0xfb, 0x16,\n                                                       0x6, 0xe, 0x57, 0x7d, 0xf7, 0x8, 0xf7, 0xdc,\n                                                       0xf7, 0x8, 0x1, 0xac, 0xf7, 0x23, 0xf7, 0x95,\n                                                       0xf7, 0x23, 0x3, 0xad, 0xf7, 0xa1, 0x15, 0xfb,\n                                                       0x8e, 0xf7, 0x50, 0x6a, 0xde, 0xf7, 0x3e, 0xf2,\n                                                       0xf7, 0x1a, 0xf7, 0x29, 0xf7, 0x1c, 0x32, 0xf7,\n                                                       0x21, 0xfb, 0x4c, 0xfb, 0x4f, 0x37, 0xfb, 0x2a,\n                                                       0xfb, 0x13, 0x1e, 0xf7, 0x23, 0x16, 0xf7, 0x5,\n                                                       0xc8, 0xbb, 0xce, 0xd3, 0xc5, 0x56, 0xfb, 0x0,\n                                                       0xfb, 0xc, 0x49, 0x5c, 0x4b, 0x49, 0x4d, 0xbf,\n                                                       0xf7, 0x7, 0x1e, 0xe, 0x5a, 0xa, 0xe5, 0xf7,\n                                                       0x17, 0xf7, 0x60, 0xf7, 0x24, 0x13, 0xec, 0xf7,\n                                                       0x5e, 0xc6, 0x15, 0x73, 0x9f, 0xbb, 0x59, 0xe1,\n                                                       0x1b, 0xf7, 0x9, 0xf4, 0xdf, 0xf7, 0x51, 0xf7,\n                                                       0x55, 0x20, 0xea, 0xfb, 0x6, 0x6b, 0x3f, 0x80,\n                                                       0x3b, 0x55, 0x1f, 0x89, 0x6, 0x13, 0xdc, 0xda,\n                                                       0xfb, 0x17, 0xfd, 0x79, 0xf7, 0x20, 0x7, 0x8a,\n                                                       0xf8, 0x65, 0x15, 0x13, 0xec, 0xee, 0xab, 0xd7,\n                                                       0xe5, 0xbb, 0xca, 0x61, 0xfb, 0x19, 0x4f, 0x7e,\n                                                       0x22, 0x24, 0x4a, 0x57, 0xc3, 0xf7, 0x1, 0x1e,\n                                                       0xe, 0x5a, 0xa, 0xad, 0xf7, 0x24, 0xf7, 0x7e,\n                                                       0xf7, 0x20, 0xfb, 0x17, 0xf7, 0x17, 0x13, 0xdc,\n                                                       0xf8, 0x30, 0xc6, 0x15, 0xfb, 0x9e, 0xf7, 0x20,\n                                                       0xf9, 0x79, 0x7, 0x13, 0xda, 0xfb, 0x17, 0x3c,\n                                                       0x89, 0x6, 0x13, 0xec, 0xdb, 0x55, 0x3e, 0x96,\n                                                       0x6b, 0x1b, 0xfb, 0x7, 0x20, 0x2c, 0xfb, 0x55,\n                                                       0xfb, 0x51, 0xf4, 0x37, 0xf7, 0xa, 0xe1, 0xbb,\n                                                       0xbd, 0xa3, 0xa0, 0x1f, 0xfb, 0x7e, 0xf7, 0x5b,\n                                                       0x15, 0xf7, 0x19, 0xcb, 0xb5, 0xbb, 0xe5, 0xac,\n                                                       0x3f, 0x28, 0xfb, 0x1, 0x57, 0x53, 0x49, 0x24,\n                                                       0x7d, 0xf4, 0xc7, 0x1e, 0xe, 0xfb, 0xa6, 0xa0,\n                                                       0x76, 0xf8, 0x37, 0xf7, 0x7, 0xfb, 0x7, 0xf7,\n                                                       0x13, 0x12, 0xb9, 0xf7, 0x12, 0xf7, 0x35, 0xb3,\n                                                       0x13, 0xb8, 0xcb, 0x16, 0xf7, 0x12, 0xf7, 0x39,\n                                                       0x6, 0xf7, 0x28, 0x96, 0xf5, 0xdd, 0xa3, 0x9b,\n                                                       0x7c, 0x84, 0x95, 0x1e, 0xb3, 0xf7, 0xc, 0x5,\n                                                       0x9a, 0x75, 0x62, 0x99, 0x70, 0x1b, 0x55, 0x64,\n                                                       0x66, 0x58, 0x84, 0x1f, 0x13, 0xd0, 0x89, 0xd7,\n                                                       0xfb, 0x9, 0x6, 0xe, 0x20, 0x7d, 0xf0, 0xf7,\n                                                       0xfa, 0xf0, 0x1, 0xcb, 0xf7, 0x14, 0xf7, 0x51,\n                                                       0xf7, 0x1e, 0x3, 0xa9, 0xf7, 0x2b, 0x15, 0xfb,\n                                                       0x2a, 0x9e, 0xf7, 0x32, 0x7c, 0xd4, 0x1b, 0xf7,\n                                                       0x40, 0xce, 0xd7, 0xdf, 0xf7, 0xa, 0x20, 0xba,\n                                                       0x2f, 0xa2, 0x1f, 0x66, 0x94, 0x21, 0x99, 0xb6,\n                                                       0x1a, 0xb7, 0xcf, 0x8c, 0xa2, 0xa4, 0xc6, 0x89,\n                                                       0x4c, 0x9c, 0x1e, 0xf7, 0x17, 0xa3, 0x5, 0xf6,\n                                                       0x6d, 0x3d, 0xae, 0xfb, 0x10, 0x1b, 0xfb, 0x1,\n                                                       0xfb, 0x2, 0x62, 0xfb, 0xf, 0xfb, 0x13, 0xf6,\n                                                       0x77, 0xf7, 0x32, 0x68, 0x1f, 0xab, 0x84, 0xae,\n                                                       0x7b, 0x6c, 0x1a, 0x51, 0x32, 0x8a, 0x7f, 0x5e,\n                                                       0x58, 0x9a, 0xd2, 0x7b, 0x1e, 0xe, 0x9a, 0x76,\n                                                       0xf8, 0x26, 0xf3, 0xf7, 0x44, 0x77, 0x1, 0xe4,\n                                                       0xf7, 0x1a, 0x3, 0xf7, 0xc9, 0x99, 0x15, 0x7f,\n                                                       0xf0, 0x5, 0x46, 0x71, 0x75, 0x8c, 0xe5, 0x1a,\n                                                       0xf7, 0x6c, 0xe6, 0xf3, 0x30, 0xf7, 0x44, 0x7,\n                                                       0xfb, 0x1a, 0x3e, 0x5, 0x28, 0x4d, 0x23, 0xc9,\n                                                       0xfb, 0x6c, 0x7, 0xfb, 0x7, 0x95, 0x44, 0xf7,\n                                                       0xd, 0x99, 0xbb, 0x8d, 0x9d, 0xb7, 0x1e, 0xe,\n                                                       0x57, 0x7d, 0xf7, 0x0, 0x2b, 0xeb, 0xf8, 0x4a,\n                                                       0x77, 0x12, 0xd5, 0xf7, 0x1f, 0xf7, 0x55, 0xf7,\n                                                       0x1f, 0x13, 0x78, 0xf8, 0x34, 0x89, 0x15, 0xf7,\n                                                       0x15, 0xf8, 0xaa, 0xfb, 0x1f, 0xfb, 0xbb, 0x6,\n                                                       0x5c, 0x8d, 0x2b, 0xfb, 0x7, 0x2f, 0x8f, 0xde,\n                                                       0xc7, 0x1e, 0xf7, 0xbb, 0xfb, 0x1f, 0xfb, 0xbb,\n                                                       0x7, 0x13, 0xb8, 0xfb, 0x37, 0xba, 0x33, 0xf7,\n                                                       0x14, 0xcf, 0xce, 0xad, 0xc6, 0xb1, 0x1e, 0x8d,\n                                                       0x6, 0xe, 0x20, 0x73, 0xa, 0x98, 0xf8, 0xa6,\n                                                       0x3, 0xf7, 0x6f, 0x16, 0xf7, 0xd, 0x6, 0xf7,\n                                                       0x5f, 0xf8, 0xa8, 0x5, 0xfb, 0x1f, 0x6, 0xfb,\n                                                       0x11, 0xfb, 0xfd, 0x5, 0x8a, 0x6, 0xfb, 0xf,\n                                                       0xf7, 0xfd, 0x5, 0xfb, 0x22, 0x6, 0xe, 0xf7,\n                                                       0x7, 0x73, 0xa, 0x95, 0xf9, 0x8b, 0x3, 0xf7,\n                                                       0x40, 0x16, 0xf7, 0x17, 0x6, 0xe0, 0xf7, 0xec,\n                                                       0x5, 0x8d, 0x6, 0xe1, 0xfb, 0xec, 0x5, 0xf7,\n                                                       0x16, 0x6, 0xf7, 0x37, 0xf8, 0xa8, 0x5, 0xfb,\n                                                       0x19, 0x6, 0x2b, 0xfb, 0xf0, 0x6e, 0xa, 0x38,\n                                                       0xf7, 0xf0, 0x5, 0xfb, 0x17, 0x6, 0x35, 0xfb,\n                                                       0xf0, 0x6e, 0xa, 0x2d, 0xf7, 0xf0, 0x5, 0xfb,\n                                                       0x18, 0x6, 0xe, 0x20, 0x73, 0xa, 0x9a, 0xf8,\n                                                       0xa2, 0x3, 0x9a, 0x16, 0xf7, 0x30, 0x6, 0xf3,\n                                                       0xf7, 0x3a, 0xf2, 0xfb, 0x3a, 0x5, 0xf7, 0x37,\n                                                       0x6, 0xfb, 0x4f, 0xf7, 0xad, 0xf7, 0x3f, 0xf7,\n                                                       0x8f, 0x5, 0xfb, 0x30, 0x6, 0x2d, 0xfb, 0x25,\n                                                       0x32, 0xf7, 0x25, 0x5, 0xfb, 0x37, 0x6, 0xf7,\n                                                       0x42, 0xfb, 0x95, 0x5, 0xe, 0x20, 0xfb, 0x55,\n                                                       0x76, 0xf9, 0x7e, 0x77, 0x1, 0xb6, 0x2b, 0x15,\n                                                       0x97, 0xfb, 0x2, 0x52, 0xa, 0xf7, 0x1, 0xf7,\n                                                       0x12, 0xc8, 0x1f, 0xf7, 0x4a, 0xf8, 0x93, 0x78,\n                                                       0xa, 0xfc, 0xd, 0x6e, 0xa, 0xfb, 0xe, 0xf8,\n                                                       0xd, 0x40, 0xa, 0xf7, 0x58, 0xfc, 0xa8, 0x5,\n                                                       0x29, 0x48, 0xa, 0xe, 0xfb, 0x37, 0x8b, 0xf7,\n                                                       0x10, 0xf7, 0xb7, 0xf7, 0x9, 0x1, 0x9f, 0x16,\n                                                       0xf8, 0x60, 0xf7, 0x10, 0xfb, 0xae, 0x6, 0xf7,\n                                                       0x9e, 0xf7, 0xc8, 0x5, 0xef, 0xfc, 0x3d, 0xfb,\n                                                       0x9, 0xf7, 0x88, 0x7, 0xfb, 0x9b, 0xfb, 0xc5,\n                                                       0x5, 0xe, 0x5b, 0xa, 0xf7, 0x2a, 0xf7, 0xc,\n                                                       0x14, 0xe0, 0xbb, 0xf7, 0x61, 0x15, 0xe8, 0x94,\n                                                       0x3f, 0xfb, 0x4, 0xfb, 0x2f, 0xbd, 0x51, 0xf7,\n                                                       0x20, 0x1f, 0xa4, 0xf7, 0x7, 0x6, 0x47, 0x70,\n                                                       0x8e, 0xcc, 0xf7, 0x4f, 0x78, 0xbc, 0x48, 0xb3,\n                                                       0x1f, 0xca, 0xb5, 0xa2, 0xab, 0xf7, 0x5d, 0x1a,\n                                                       0xcb, 0x9e, 0x90, 0xd7, 0x1e, 0xf7, 0x7, 0x72,\n                                                       0x7, 0xfb, 0x52, 0x8b, 0x32, 0xfb, 0x23, 0xfb,\n                                                       0x8, 0x7d, 0x56, 0x33, 0x1f, 0xe, 0xfc, 0x13,\n                                                       0xfb, 0x5a, 0x76, 0xfa, 0x50, 0x77, 0x1, 0xdf,\n                                                       0xf7, 0x4, 0x3, 0xdf, 0xfb, 0x6f, 0x15, 0xf7,\n                                                       0x4, 0xfa, 0x50, 0x7c, 0xa, 0xe, 0x5b, 0xa,\n                                                       0xf7, 0xb, 0xf7, 0xc, 0x14, 0xe0, 0xa3, 0x3a,\n                                                       0x15, 0xfb, 0x7, 0xa4, 0x7, 0xf7, 0x52, 0x8b,\n                                                       0xe4, 0xf7, 0x23, 0xf7, 0x8, 0x92, 0xc0, 0xea,\n                                                       0x1f, 0xf7, 0x8, 0x7, 0x29, 0x87, 0xd7, 0xf7,\n                                                       0x4, 0xf7, 0x2f, 0x59, 0xc5, 0xfb, 0x20, 0x1f,\n                                                       0x72, 0xfb, 0x7, 0x6, 0xcf, 0xa6, 0x88, 0x4a,\n                                                       0xfb, 0x4f, 0x9e, 0x5a, 0xce, 0x63, 0x1f, 0x4c,\n                                                       0x61, 0x74, 0x6b, 0xfb, 0x5d, 0x1a, 0x4b, 0x78,\n                                                       0x86, 0x3f, 0x1e, 0xe, 0x3c, 0xf7, 0x73, 0xf7,\n                                                       0xc, 0x1, 0xce, 0xf8, 0x62, 0x3, 0xc8, 0xf7,\n                                                       0x37, 0x15, 0xc2, 0xbf, 0xb3, 0x91, 0xa6, 0x1b,\n                                                       0xb4, 0xae, 0x7b, 0x7b, 0xae, 0x1f, 0x7d, 0xac,\n                                                       0xab, 0x7d, 0xb0, 0x1b, 0xd0, 0xbf, 0xbc, 0x95,\n                                                       0x94, 0x1f, 0xf7, 0xc, 0x7, 0x4d, 0x53, 0x56,\n                                                       0x89, 0x81, 0x1b, 0x72, 0x6b, 0x99, 0x98, 0x69,\n                                                       0x1f, 0x9b, 0x64, 0x61, 0x9c, 0x60, 0x1b, 0x76,\n                                                       0x56, 0x8b, 0x4e, 0x55, 0x1f, 0xe, 0xc6, 0x8b,\n                                                       0xf7, 0xb, 0xf7, 0xa4, 0xd5, 0xf7, 0x19, 0xf7,\n                                                       0xc, 0x1, 0x9f, 0xf7, 0x93, 0x15, 0xf7, 0x1,\n                                                       0x6, 0xfb, 0x2e, 0xae, 0xf7, 0x2b, 0x26, 0xf7,\n                                                       0x53, 0x1b, 0xcd, 0xc6, 0x95, 0xa0, 0xbc, 0x1f,\n                                                       0xf7, 0x25, 0x7, 0x66, 0x5f, 0x51, 0x77, 0x40,\n                                                       0x1b, 0x28, 0xfb, 0xa, 0xc2, 0xdc, 0x7a, 0x1f,\n                                                       0xf8, 0xf, 0x6, 0x9e, 0xd5, 0x5, 0xfc, 0x30,\n                                                       0x6, 0x9e, 0x89, 0xa5, 0x8d, 0x9c, 0x1e, 0xf8,\n                                                       0x3f, 0x6, 0x9f, 0xd5, 0x5, 0xfc, 0x46, 0x6,\n                                                       0xdb, 0x9f, 0xf7, 0xb, 0xc0, 0xef, 0x1b, 0xca,\n                                                       0xba, 0x7e, 0x70, 0xac, 0x1f, 0xae, 0xf7, 0x17,\n                                                       0x5, 0x9e, 0x5b, 0x4a, 0x95, 0x4a, 0x1b, 0xfb,\n                                                       0x58, 0xfb, 0x21, 0x29, 0xfb, 0x2f, 0x64, 0x1f,\n                                                       0x2e, 0x6, 0x79, 0x41, 0x5, 0xee, 0x6, 0x8a,\n                                                       0x7b, 0x8a, 0x6e, 0x8d, 0x7a, 0x8, 0x3a, 0x6,\n                                                       0xe, 0xfc, 0x15, 0xfb, 0x11, 0x76, 0x12, 0xdb,\n                                                       0xf7, 0x15, 0x48, 0xce, 0x13, 0xc0, 0xdb, 0x8a,\n                                                       0x15, 0x13, 0xa0, 0xc9, 0x6, 0x89, 0x43, 0x5c,\n                                                       0x7f, 0x73, 0x83, 0xa4, 0x56, 0x18, 0xf7, 0x7,\n                                                       0x45, 0xa, 0x7, 0x13, 0xc0, 0xfb, 0x15, 0x6,\n                                                       0xe, 0x20, 0xfb, 0x66, 0xf7, 0xa, 0xf8, 0x91,\n                                                       0xf4, 0xdc, 0xf7, 0x5, 0x1, 0x9b, 0x3b, 0x15,\n                                                       0x71, 0xfb, 0x3, 0x5, 0x7d, 0xb5, 0xa8, 0x86,\n                                                       0xa9, 0x1b, 0xf7, 0xb, 0xb6, 0xd4, 0xd9, 0x98,\n                                                       0x1f, 0xd9, 0xf8, 0x70, 0x5, 0xe7, 0x6, 0x9c,\n                                                       0xf4, 0x5, 0x2d, 0x6, 0x90, 0xa7, 0x5, 0xb1,\n                                                       0x92, 0x90, 0xa8, 0xb7, 0x1b, 0xa7, 0xa9, 0x81,\n                                                       0x87, 0x98, 0x1f, 0xa4, 0xf7, 0x5, 0x5, 0x9e,\n                                                       0x52, 0x6f, 0x8d, 0x80, 0x1b, 0xfb, 0x14, 0x67,\n                                                       0x48, 0xfb, 0x28, 0x73, 0x1f, 0x30, 0x6, 0x7a,\n                                                       0x22, 0x5, 0xe6, 0x6, 0x47, 0xfc, 0x3c, 0x5,\n                                                       0x4f, 0x82, 0x87, 0x72, 0x60, 0x1b, 0x77, 0x7b,\n                                                       0x8d, 0x95, 0x64, 0x1f, 0xe, 0xfb, 0x37, 0xfb,\n                                                       0x11, 0x76, 0xf7, 0x26, 0xf7, 0x13, 0x12, 0xd7,\n                                                       0xf7, 0x1a, 0x46, 0xd0, 0xe7, 0xf7, 0x1a, 0x45,\n                                                       0xd1, 0x13, 0xe8, 0xf7, 0xc2, 0x16, 0x13, 0xe4,\n                                                       0xcb, 0x6, 0x98, 0xa, 0x72, 0x83, 0xa5, 0x56,\n                                                       0x18, 0xf7, 0xc, 0x61, 0xa, 0xfb, 0x76, 0xfb,\n                                                       0x13, 0x15, 0x13, 0xd8, 0xcc, 0x6, 0x98, 0xa,\n                                                       0x71, 0x83, 0xa6, 0x56, 0x18, 0xf7, 0xb, 0x61,\n                                                       0xa, 0xe, 0xf7, 0xe5, 0x8b, 0x84, 0xa, 0xe7,\n                                                       0xf7, 0x1f, 0xf7, 0x5b, 0xf7, 0x20, 0xf7, 0x5b,\n                                                       0xf7, 0x1f, 0x14, 0x70, 0xf9, 0x95, 0x16, 0xf7,\n                                                       0x1f, 0xf7, 0x26, 0xfb, 0x1f, 0x6, 0xfd, 0x39,\n                                                       0xfb, 0x26, 0x15, 0xf7, 0x1f, 0xf7, 0x26, 0xfb,\n                                                       0x1f, 0x6, 0xf7, 0xe6, 0xfb, 0x26, 0x15, 0xf7,\n                                                       0x20, 0xf7, 0x26, 0x6d, 0xa, 0x20, 0xfb, 0x2a,\n                                                       0x76, 0xf8, 0xda, 0xf7, 0x7, 0xf7, 0x54, 0x77,\n                                                       0x1, 0xf7, 0x6b, 0xf7, 0x15, 0x3, 0xf7, 0x6b,\n                                                       0xfb, 0x3f, 0x15, 0xf7, 0x15, 0xf8, 0xda, 0x74,\n                                                       0xa, 0xf7, 0x54, 0xfb, 0x15, 0xfb, 0x54, 0xfb,\n                                                       0x47, 0xfb, 0x7, 0xf7, 0x47, 0x6, 0xe, 0x20,\n                                                       0xfb, 0x2a, 0x76, 0xf7, 0x3e, 0xf7, 0x7, 0xf7,\n                                                       0xd3, 0xf7, 0x7, 0xf7, 0x3e, 0x77, 0x1, 0xf7,\n                                                       0x6b, 0xf7, 0x15, 0x3, 0xaf, 0x8a, 0x15, 0xf7,\n                                                       0x47, 0xfb, 0x3e, 0xf7, 0x15, 0xf7, 0x3e, 0x74,\n                                                       0xa, 0xf7, 0xd3, 0x74, 0xa, 0xf7, 0x3e, 0xfb,\n                                                       0x15, 0xfb, 0x3e, 0xfb, 0x47, 0xfb, 0x7, 0xf7,\n                                                       0x47, 0xfb, 0xd3, 0xfb, 0x47, 0x6, 0xe, 0xf9,\n                                                       0x39, 0xd4, 0x1, 0x81, 0xf8, 0xf0, 0x95, 0xa,\n                                                       0xd4, 0xc8, 0x42, 0x77, 0xa, 0x83, 0xa, 0xfb,\n                                                       0x1b, 0x6, 0xe, 0xf7, 0xe5, 0x78, 0xd4, 0x5a,\n                                                       0x76, 0xf7, 0xab, 0xd4, 0x99, 0xd4, 0xf7, 0x64,\n                                                       0xd4, 0x91, 0x77, 0x12, 0x88, 0xeb, 0xe6, 0xeb,\n                                                       0xf7, 0x1, 0xeb, 0xe7, 0xea, 0xba, 0xeb, 0xe6,\n                                                       0xeb, 0x13, 0x7b, 0xf0, 0xe8, 0xf8, 0xa8, 0x15,\n                                                       0xcc, 0x93, 0xad, 0xb0, 0xaf, 0x96, 0x6b, 0x48,\n                                                       0x8a, 0x1e, 0x48, 0x8a, 0x82, 0x61, 0x67, 0x1b,\n                                                       0x66, 0x83, 0xb7, 0xcc, 0x1f, 0x2b, 0x16, 0x51,\n                                                       0x92, 0xfb, 0x10, 0xf7, 0x1a, 0xf7, 0x18, 0x95,\n                                                       0xf7, 0x10, 0xc5, 0xd1, 0x72, 0xf1, 0xfb, 0x9,\n                                                       0xfb, 0x10, 0x7a, 0xfb, 0x5, 0x50, 0x1e, 0xf7,\n                                                       0x1d, 0xfc, 0xb8, 0x15, 0xec, 0x6, 0x13, 0x77,\n                                                       0xf0, 0xf7, 0xc1, 0xf9, 0x6a, 0x5, 0x2a, 0x6,\n                                                       0x5d, 0xfc, 0xb2, 0x15, 0x13, 0xbb, 0xf0, 0x50,\n                                                       0x91, 0xfb, 0x14, 0xf7, 0x1b, 0xf7, 0x1c, 0x91,\n                                                       0xf7, 0x1f, 0xbb, 0xd0, 0x72, 0xee, 0xfb, 0x9,\n                                                       0x71, 0xa, 0x94, 0xa9, 0xaf, 0xb2, 0x93, 0x6d,\n                                                       0x4a, 0x48, 0x83, 0x5d, 0x64, 0x67, 0x82, 0xb9,\n                                                       0xce, 0x1e, 0xf7, 0x7e, 0x16, 0x50, 0x92, 0xfb,\n                                                       0x14, 0xf7, 0x1a, 0xf7, 0x1b, 0x92, 0xf7, 0x1f,\n                                                       0xbb, 0xd0, 0x73, 0xee, 0xfb, 0xa, 0x71, 0xa,\n                                                       0x93, 0xa9, 0xb0, 0xaf, 0x95, 0x6d, 0x4a, 0x4e,\n                                                       0x85, 0x56, 0x63, 0x5e, 0x8b, 0xc9, 0xbf, 0x1e,\n                                                       0xe, 0x8f, 0x78, 0xf7, 0xe, 0xf8, 0x8c, 0xf7,\n                                                       0xb, 0x1, 0xcc, 0xf7, 0x21, 0xf7, 0xa9, 0xf7,\n                                                       0x26, 0x3, 0xb2, 0xf7, 0x78, 0x15, 0xfb, 0x84,\n                                                       0x72, 0xa, 0xbd, 0xf7, 0x40, 0xf7, 0x45, 0xfb,\n                                                       0x2a, 0xae, 0xfb, 0x3, 0xa5, 0x1f, 0xfb, 0x9,\n                                                       0xa7, 0x5e, 0x95, 0xb9, 0x1a, 0xc5, 0xda, 0xa3,\n                                                       0xb6, 0xf7, 0x8, 0x96, 0x47, 0x66, 0x91, 0x1e,\n                                                       0xf7, 0x28, 0x91, 0x5, 0xf7, 0x37, 0x85, 0xfb,\n                                                       0x18, 0xc2, 0xfb, 0x23, 0x1b, 0xfb, 0x69, 0x59,\n                                                       0xfb, 0xe, 0x3c, 0xfb, 0x33, 0xf7, 0x35, 0x64,\n                                                       0xd3, 0x78, 0x1f, 0xf7, 0x1a, 0x6b, 0xbe, 0x7e,\n                                                       0x4f, 0x1a, 0x5c, 0x61, 0x56, 0x25, 0xfb, 0x18,\n                                                       0x78, 0xf0, 0xb0, 0x84, 0x1e, 0xe3, 0xf8, 0xbd,\n                                                       0x15, 0xf7, 0x14, 0x6, 0xf4, 0xf7, 0x22, 0x5,\n                                                       0xfb, 0x5, 0x6, 0x56, 0x41, 0x51, 0xd5, 0x5,\n                                                       0x7c, 0xa, 0xe, 0x5d, 0xa, 0xf7, 0x49, 0xd7,\n                                                       0x15, 0xd0, 0x6, 0x39, 0xf7, 0x64, 0xdd, 0xf7,\n                                                       0x5c, 0x5, 0x46, 0x6, 0x29, 0xfb, 0x5c, 0x5,\n                                                       0xe, 0xf7, 0xe5, 0x78, 0xf7, 0x13, 0xfb, 0x7,\n                                                       0xf7, 0x10, 0xf7, 0x59, 0xf7, 0x10, 0xf7, 0x37,\n                                                       0xf7, 0x10, 0xfb, 0x7, 0xf7, 0x13, 0x12, 0xb0,\n                                                       0xf7, 0x27, 0xf7, 0xcd, 0xf7, 0x19, 0x13, 0x76,\n                                                       0xf8, 0x8e, 0x84, 0x15, 0xf8, 0x5b, 0xf7, 0x10,\n                                                       0xfb, 0xdf, 0xf7, 0x59, 0xf7, 0xad, 0xf7, 0x10,\n                                                       0xfb, 0xad, 0xf7, 0x37, 0xf7, 0xd1, 0xf7, 0x10,\n                                                       0xfc, 0x4d, 0x3a, 0x89, 0x6, 0x13, 0xae, 0xc2,\n                                                       0x64, 0x5e, 0xb1, 0x37, 0x1b, 0xfb, 0x48, 0xfb,\n                                                       0xb, 0xfb, 0x26, 0xfb, 0x71, 0xfb, 0x7c, 0xeb,\n                                                       0xfb, 0x31, 0xf7, 0x55, 0xc0, 0xdb, 0x99, 0xdf,\n                                                       0xba, 0x1f, 0x13, 0x6e, 0xfb, 0xd6, 0xf7, 0xb7,\n                                                       0x15, 0xf7, 0x21, 0xaf, 0xee, 0xf7, 0x8, 0xf7,\n                                                       0x0, 0xc0, 0x3c, 0xfb, 0x35, 0x1e, 0x13, 0xb6,\n                                                       0xfb, 0x5b, 0x3d, 0x4c, 0x2e, 0x29, 0x5f, 0xcf,\n                                                       0xf7, 0x56, 0x1e, 0xe, 0xfc, 0x15, 0xf8, 0x6f,\n                                                       0x76, 0xf7, 0xa5, 0x77, 0x12, 0xd0, 0xf7, 0x15,\n                                                       0x17, 0xd0, 0xf8, 0x5a, 0x15, 0xf7, 0x15, 0xf7,\n                                                       0x10, 0x6, 0x13, 0xe0, 0x4d, 0x6, 0x8d, 0xd4,\n                                                       0xba, 0x9a, 0xa3, 0x93, 0x72, 0xc0, 0x18, 0xfb,\n                                                       0x7, 0x62, 0x8b, 0x35, 0x51, 0x1a, 0xe, 0xfc,\n                                                       0x15, 0xf8, 0x66, 0x76, 0xf7, 0xa5, 0x77, 0x12,\n                                                       0xdb, 0xf7, 0x15, 0x48, 0xce, 0x13, 0xe0, 0xe9,\n                                                       0xf8, 0x51, 0x15, 0xf7, 0x7, 0x45, 0xa, 0xfb,\n                                                       0x15, 0xfb, 0x13, 0x7, 0x13, 0xd0, 0xc9, 0x6,\n                                                       0x89, 0x42, 0x5c, 0x7f, 0x73, 0x83, 0x8, 0xe,\n                                                       0xfb, 0x37, 0xf8, 0x5a, 0xf7, 0x10, 0xf7, 0x29,\n                                                       0x77, 0x12, 0xcb, 0xd1, 0x45, 0xf7, 0x1a, 0xe7,\n                                                       0xd0, 0x46, 0xf7, 0x1a, 0x13, 0xd8, 0xcb, 0xf8,\n                                                       0x5a, 0x15, 0xf7, 0x1a, 0xf7, 0x10, 0x6, 0x13,\n                                                       0xd4, 0x4b, 0x6, 0x8d, 0xd4, 0xbc, 0x9a, 0xa4,\n                                                       0x93, 0x71, 0xc0, 0x18, 0xfb, 0xc, 0x62, 0x8b,\n                                                       0x34, 0x52, 0x1a, 0xf7, 0x76, 0x33, 0x15, 0xf7,\n                                                       0x1a, 0xf7, 0x10, 0x6, 0x13, 0xe4, 0x4a, 0x6,\n                                                       0x8d, 0xd4, 0xbc, 0x9a, 0xa5, 0x93, 0x70, 0xc0,\n                                                       0x18, 0xfb, 0xb, 0x62, 0x8b, 0x34, 0x52, 0x1a,\n                                                       0xe, 0xfb, 0x37, 0xf8, 0x66, 0x76, 0xf7, 0x26,\n                                                       0xf7, 0x13, 0x1, 0xd7, 0xf7, 0x1a, 0xe7, 0xf7,\n                                                       0x1a, 0x3, 0xf7, 0xd0, 0xf8, 0x51, 0x15, 0xf7,\n                                                       0xc, 0x45, 0xa, 0xfb, 0x1a, 0xfb, 0x13, 0xcb,\n                                                       0x7, 0x98, 0xa, 0x72, 0x83, 0x8, 0xfb, 0x5b,\n                                                       0x56, 0x15, 0xf7, 0xb, 0x45, 0xa, 0xfb, 0x1a,\n                                                       0xfb, 0x13, 0xcc, 0x7, 0x98, 0xa, 0x71, 0x83,\n                                                       0x8, 0xe, 0xfb, 0xcd, 0xf7, 0x6b, 0x76, 0xf7,\n                                                       0xde, 0x77, 0x1, 0x95, 0xf7, 0xde, 0x3, 0x95,\n                                                       0xf7, 0xfb, 0x15, 0x30, 0xd5, 0x41, 0xe5, 0xe6,\n                                                       0xd6, 0xd4, 0xe7, 0xe8, 0x40, 0xd3, 0x30, 0x30,\n                                                       0x42, 0x42, 0x2f, 0x1e, 0xe, 0x20, 0xf7, 0x77,\n                                                       0xf5, 0x1, 0xf7, 0x77, 0x4, 0xf8, 0xc0, 0xf5,\n                                                       0xfc, 0xc0, 0x6, 0xe, 0xf7, 0xe5, 0xf7, 0x77,\n                                                       0xf5, 0x1, 0xf7, 0x77, 0x4, 0xfa, 0x7c, 0xf5,\n                                                       0xfe, 0x7c, 0x6, 0xe, 0xf8, 0xf8, 0xf7, 0x11,\n                                                       0x21, 0x76, 0xb7, 0xde, 0x8a, 0x77, 0x12, 0x13,\n                                                       0x60, 0x7a, 0xf8, 0xf6, 0x15, 0xcf, 0x65, 0xa,\n                                                       0xab, 0xaf, 0x1b, 0xab, 0xa6, 0x81, 0x80, 0xa6,\n                                                       0x1f, 0x13, 0x80, 0x81, 0xa6, 0xa5, 0x80, 0xa8,\n                                                       0x1b, 0xe9, 0x8b, 0xee, 0xa5, 0x1f, 0x46, 0x7a,\n                                                       0xa, 0x6d, 0x66, 0x1b, 0x7f, 0x71, 0x95, 0x96,\n                                                       0x6d, 0x1f, 0x13, 0x50, 0x96, 0x6d, 0x69, 0x96,\n                                                       0x71, 0x1b, 0x44, 0x71, 0x59, 0x3f, 0x1f, 0xe,\n                                                       0xf7, 0xe5, 0xf7, 0xdb, 0x76, 0xf7, 0xe7, 0xd4,\n                                                       0x1, 0xf7, 0x5b, 0xe3, 0xf7, 0x54, 0xdf, 0xf7,\n                                                       0xca, 0xde, 0x3, 0xf7, 0x5b, 0xf7, 0xc6, 0x15,\n                                                       0xe3, 0xf7, 0xe7, 0xf7, 0x2b, 0xd4, 0xfc, 0x1e,\n                                                       0x42, 0xf7, 0x2f, 0x6, 0xf7, 0xac, 0xfb, 0xe7,\n                                                       0x15, 0xdf, 0xf7, 0xdc, 0x8d, 0x6, 0xf7, 0x5,\n                                                       0xfb, 0xdc, 0x5, 0xda, 0x6, 0xf7, 0x5, 0xf7,\n                                                       0xdc, 0x5, 0x8e, 0xfb, 0xdc, 0xde, 0xf8, 0x30,\n                                                       0xfb, 0x1e, 0x6, 0x28, 0xfb, 0xaf, 0x6e, 0xa,\n                                                       0x27, 0xf7, 0xaf, 0x5, 0x81, 0xa, 0x20, 0x7d,\n                                                       0xed, 0xf8, 0xa1, 0xf7, 0x21, 0x1, 0xbc, 0xf7,\n                                                       0x15, 0xf7, 0x5f, 0xf7, 0x1e, 0x3, 0xa9, 0xf7,\n                                                       0x26, 0x15, 0xfb, 0x1c, 0x9e, 0xf7, 0x33, 0x73,\n                                                       0xd4, 0x1b, 0xf7, 0x40, 0xcd, 0xe8, 0xdc, 0xf7,\n                                                       0x6, 0x22, 0xa6, 0x2e, 0xa1, 0x1f, 0x66, 0x94,\n                                                       0x21, 0x98, 0xb5, 0x1a, 0xb5, 0xd2, 0x8c, 0xa2,\n                                                       0xa4, 0xc3, 0x89, 0x4e, 0x9c, 0x1e, 0xf7, 0x18,\n                                                       0xa3, 0x5, 0xf2, 0x6d, 0x3d, 0xad, 0xfb, 0x11,\n                                                       0x1b, 0xfb, 0x2, 0xfb, 0x2, 0x63, 0xfb, 0xb,\n                                                       0xfb, 0xf, 0xf2, 0x75, 0xf7, 0x33, 0x69, 0x1f,\n                                                       0xab, 0x84, 0xb1, 0x7f, 0x6d, 0x1a, 0x53, 0x33,\n                                                       0x8a, 0x7f, 0x5e, 0x58, 0x99, 0xd0, 0x7a, 0x1e,\n                                                       0xb5, 0xf8, 0x4e, 0x15, 0xf7, 0x14, 0x6, 0xf3,\n                                                       0xf7, 0x21, 0x5, 0x7c, 0xa, 0x56, 0x42, 0x51,\n                                                       0xd4, 0x5, 0xfb, 0x3, 0x6, 0xe, 0x5d, 0xa,\n                                                       0xde, 0xd7, 0x15, 0xcf, 0x6, 0xee, 0xf7, 0x5f,\n                                                       0x28, 0xf7, 0x61, 0x5, 0x47, 0x6, 0xdc, 0xfb,\n                                                       0x61, 0x5, 0xe, 0xf7, 0xad, 0x7d, 0xf7, 0x0,\n                                                       0xfb, 0x0, 0xf7, 0x8, 0xf7, 0xf, 0xe4, 0xf7,\n                                                       0x8, 0xf7, 0x8, 0x24, 0xf2, 0x12, 0xad, 0xf7,\n                                                       0x24, 0xf7, 0x8b, 0xf7, 0x1f, 0x13, 0xb6, 0xf8,\n                                                       0x7c, 0xc7, 0x15, 0x41, 0xd4, 0xe3, 0x8b, 0x9c,\n                                                       0x1b, 0xe4, 0xf7, 0x3, 0xb1, 0xf7, 0x10, 0xb2,\n                                                       0x1f, 0xfb, 0x1c, 0xa2, 0x5, 0x6f, 0x81, 0x70,\n                                                       0x5a, 0x49, 0x1b, 0x4b, 0x6a, 0xbb, 0xde, 0x86,\n                                                       0x1f, 0xf7, 0xf0, 0x6, 0xf7, 0x82, 0x29, 0xde,\n                                                       0xfb, 0x28, 0xfb, 0x0, 0x57, 0x52, 0x7a, 0x7a,\n                                                       0x1e, 0xd0, 0x46, 0x35, 0x90, 0x6c, 0x1b, 0xfb,\n                                                       0x4c, 0x36, 0xfb, 0x18, 0xfb, 0x24, 0xfb, 0x20,\n                                                       0xe7, 0xfb, 0x24, 0xf7, 0x45, 0xef, 0xc5, 0xbc,\n                                                       0xa4, 0xa6, 0x1f, 0xfb, 0xca, 0xf7, 0x66, 0x15,\n                                                       0xf7, 0xc, 0xc0, 0xb3, 0xd3, 0xce, 0xc2, 0x53,\n                                                       0x23, 0x1e, 0x13, 0x6e, 0xfb, 0x2c, 0x2e, 0x7b,\n                                                       0x6e, 0x2c, 0x6d, 0xf7, 0x8, 0xbf, 0x1e, 0xf8,\n                                                       0x17, 0xb7, 0x15, 0xa6, 0x8d, 0x91, 0xf1, 0xe8,\n                                                       0x1b, 0xf0, 0x94, 0xfb, 0x0, 0x76, 0x8c, 0x1f,\n                                                       0xe, 0x8f, 0xa0, 0x76, 0xf9, 0xb2, 0xf7, 0x9,\n                                                       0x12, 0xf7, 0x45, 0xf7, 0x5, 0x72, 0xf7, 0x1d,\n                                                       0x73, 0xf7, 0x5, 0x13, 0xd0, 0x70, 0xa, 0xf8,\n                                                       0x33, 0x4f, 0xa, 0xfc, 0x32, 0x5, 0x13, 0xe8,\n                                                       0x33, 0xf8, 0x85, 0x8b, 0xa, 0xf7, 0x5d, 0xfb,\n                                                       0x9, 0x8b, 0xa, 0xe, 0xfb, 0x39, 0x76, 0xf8,\n                                                       0xd9, 0xf7, 0x1d, 0x12, 0xe5, 0xf7, 0x2e, 0xfb,\n                                                       0x28, 0xf7, 0x22, 0x13, 0xd0, 0xeb, 0xf8, 0x1f,\n                                                       0x15, 0xf7, 0x22, 0xf7, 0x1d, 0xfb, 0x22, 0x6,\n                                                       0x13, 0xe0, 0x85, 0xfc, 0xba, 0x15, 0xfb, 0x3c,\n                                                       0xf7, 0x2e, 0xf7, 0x3c, 0x7, 0x65, 0xf8, 0x0,\n                                                       0x5, 0x38, 0x6, 0xe, 0x20, 0x2a, 0x76, 0xf3,\n                                                       0xf7, 0x1, 0xf7, 0xcf, 0xf5, 0xf7, 0x4, 0x77,\n                                                       0x1, 0xad, 0xf7, 0x1a, 0x3, 0xf7, 0x42, 0x90,\n                                                       0x15, 0x6c, 0x21, 0xc6, 0x7a, 0xab, 0xf7, 0x0,\n                                                       0x5, 0x89, 0x94, 0x9b, 0x89, 0xa4, 0x1b, 0xf7,\n                                                       0x18, 0xdb, 0xc8, 0xf7, 0xe, 0xa7, 0x1f, 0xfb,\n                                                       0x1b, 0xa2, 0x5, 0x6e, 0x86, 0x77, 0x47, 0x3b,\n                                                       0x1b, 0x7f, 0x8a, 0x8c, 0x8c, 0x87, 0x1f, 0xe5,\n                                                       0xf7, 0xb4, 0x9d, 0x78, 0x90, 0x74, 0x8d, 0x7f,\n                                                       0x19, 0xf7, 0x1b, 0xa2, 0x70, 0xe8, 0x58, 0xad,\n                                                       0x5c, 0x9d, 0x19, 0xb2, 0xf7, 0x4, 0x4f, 0x9c,\n                                                       0x64, 0xfb, 0x7, 0x5, 0x8c, 0x81, 0x7d, 0x8d,\n                                                       0x75, 0x1b, 0xfb, 0x62, 0x5d, 0xfb, 0x35, 0x25,\n                                                       0x3a, 0xb7, 0xfb, 0x25, 0xeb, 0x75, 0x1f, 0xb1,\n                                                       0xf7, 0xc, 0x15, 0x67, 0xb4, 0x83, 0xce, 0x9f,\n                                                       0x1a, 0xab, 0x92, 0xf7, 0x1c, 0xf7, 0x11, 0x80,\n                                                       0x1e, 0xe, 0x20, 0x7b, 0xf7, 0xf, 0xf7, 0x50,\n                                                       0xf7, 0x1, 0xf7, 0x62, 0xf7, 0x0, 0x1, 0xdd,\n                                                       0xf7, 0x14, 0x3, 0xd9, 0x7b, 0x15, 0x9b, 0xa2,\n                                                       0xb0, 0xa5, 0xc3, 0x1b, 0xab, 0xb8, 0x82, 0x81,\n                                                       0xb4, 0x1f, 0x80, 0xb9, 0xb4, 0x7f, 0x97, 0x1b,\n                                                       0xbc, 0xbd, 0x9d, 0x9c, 0xaa, 0x1f, 0x58, 0xf7,\n                                                       0x7, 0x5, 0x81, 0x74, 0x67, 0x7a, 0x66, 0x1b,\n                                                       0x72, 0x79, 0x92, 0x92, 0x75, 0x1f, 0x91, 0x77,\n                                                       0x73, 0x91, 0x67, 0x1b, 0x83, 0x6c, 0x8b, 0x7d,\n                                                       0x73, 0x1f, 0x89, 0x8d, 0xb1, 0xb4, 0xb4, 0xbd,\n                                                       0x83, 0xde, 0x19, 0xf7, 0x11, 0xf7, 0x1, 0xfb,\n                                                       0x27, 0x6, 0x82, 0xa4, 0x7d, 0xc2, 0xae, 0x1a,\n                                                       0xb2, 0xa5, 0xbf, 0xc8, 0xd4, 0x98, 0x42, 0x73,\n                                                       0x90, 0x1e, 0xf7, 0x13, 0x9e, 0x5, 0xf7, 0x3f,\n                                                       0x73, 0xfb, 0x1b, 0x9a, 0x50, 0x1b, 0xfb, 0x1c,\n                                                       0x3c, 0x2e, 0x22, 0x7e, 0x8c, 0x5a, 0x9d, 0x55,\n                                                       0x1f, 0x42, 0xfb, 0x1, 0xec, 0x6, 0x98, 0x3d,\n                                                       0x5b, 0x45, 0x4d, 0x5d, 0x8, 0xe, 0x20, 0xec,\n                                                       0x76, 0xb5, 0xf7, 0x16, 0xf7, 0x6c, 0xf7, 0x16,\n                                                       0xb5, 0x77, 0x1, 0xb2, 0xf7, 0x17, 0xf7, 0x6e,\n                                                       0xf7, 0x16, 0x3, 0xe6, 0xd8, 0x15, 0xd2, 0xd2,\n                                                       0x5, 0x78, 0xae, 0xb3, 0x80, 0xb4, 0x1b, 0xb7,\n                                                       0xb5, 0x97, 0x9e, 0xaa, 0x1f, 0xd5, 0x42, 0xe5,\n                                                       0xe6, 0x43, 0xd3, 0x5, 0x9e, 0xae, 0x97, 0xb3,\n                                                       0xb5, 0x1a, 0xab, 0x83, 0xb5, 0x74, 0xb6, 0x1e,\n                                                       0xd3, 0xd3, 0x30, 0xe6, 0x42, 0x42, 0x5, 0x95,\n                                                       0x78, 0x66, 0xa0, 0x4e, 0x1b, 0x4e, 0x63, 0x76,\n                                                       0x81, 0x7a, 0x1f, 0x42, 0xd4, 0x31, 0x2b, 0xd2,\n                                                       0x46, 0x5, 0x78, 0x68, 0x81, 0x64, 0x62, 0x1a,\n                                                       0x71, 0x8f, 0x60, 0xa6, 0x5b, 0x1e, 0x44, 0x45,\n                                                       0x5, 0xf7, 0x3f, 0xf7, 0x4f, 0x15, 0xc7, 0xbb,\n                                                       0xbb, 0xc7, 0xc7, 0xbd, 0x5b, 0x4f, 0x4f, 0x59,\n                                                       0x5b, 0x4f, 0x4f, 0x5b, 0xbb, 0xc7, 0x1e, 0xe,\n                                                       0x20, 0xa0, 0x76, 0xf9, 0x4e, 0x77, 0x1, 0xf7,\n                                                       0x61, 0xf7, 0x23, 0x3, 0x9b, 0xf7, 0x2a, 0x15,\n                                                       0xf7, 0x51, 0xfb, 0x2a, 0xf7, 0x23, 0xf7, 0x2a,\n                                                       0xf7, 0x54, 0xf5, 0xfb, 0x54, 0xd0, 0xf7, 0x54,\n                                                       0xf5, 0xfb, 0xa, 0x6, 0xf7, 0x23, 0xf7, 0x9f,\n                                                       0x96, 0xa, 0xfb, 0x16, 0xfb, 0xa0, 0x6e, 0xa,\n                                                       0xfb, 0x14, 0xf7, 0xa0, 0x96, 0xa, 0xf7, 0x22,\n                                                       0xfb, 0x9f, 0x5, 0xfb, 0x9, 0x21, 0xf7, 0x51,\n                                                       0x46, 0xfb, 0x51, 0x6, 0xe, 0xfc, 0x13, 0x8d,\n                                                       0x76, 0xf9, 0x88, 0x77, 0x1, 0xdf, 0xf7, 0x4,\n                                                       0x3, 0xdf, 0x78, 0x15, 0xf7, 0x4, 0xf7, 0xcb,\n                                                       0x7c, 0xa, 0xf7, 0x1b, 0x4, 0xf7, 0x4, 0xf7,\n                                                       0xca, 0x7c, 0xa, 0xe, 0x20, 0xfb, 0x4c, 0xf1,\n                                                       0xf9, 0x57, 0xf1, 0x12, 0xad, 0xf7, 0x10, 0x38,\n                                                       0xf7, 0x1c, 0xf7, 0x27, 0xf7, 0x1a, 0x32, 0xf7,\n                                                       0xb, 0x13, 0xe8, 0xc8, 0x7f, 0x15, 0xfb, 0x7,\n                                                       0x9b, 0xe6, 0x52, 0xf7, 0x8, 0x1b, 0xf7, 0x2d,\n                                                       0xc2, 0xe3, 0xd7, 0xaf, 0x7e, 0xb7, 0x5e, 0xb5,\n                                                       0x1f, 0x13, 0xd4, 0xa9, 0x9e, 0xc5, 0xb7, 0xe0,\n                                                       0x1a, 0xd0, 0x67, 0xc0, 0x23, 0xcd, 0x1e, 0x57,\n                                                       0xab, 0xfb, 0xb, 0xcb, 0xba, 0x1a, 0x9f, 0x95,\n                                                       0xa3, 0xbb, 0xba, 0xaa, 0x71, 0x5d, 0x8d, 0x1e,\n                                                       0xf7, 0x19, 0x9a, 0x5, 0xc5, 0x83, 0x60, 0xf0,\n                                                       0xfb, 0x36, 0x1b, 0xfb, 0xe, 0x43, 0x49, 0x35,\n                                                       0x53, 0xad, 0x67, 0x99, 0x7c, 0x1f, 0x13, 0xe8,\n                                                       0x44, 0x61, 0x79, 0x48, 0x60, 0x1a, 0x24, 0xb6,\n                                                       0x6d, 0xf7, 0x1e, 0x36, 0x1e, 0xbd, 0x6c, 0xe8,\n                                                       0x5f, 0x59, 0x1a, 0x65, 0x63, 0x7a, 0x69, 0x4c,\n                                                       0x77, 0xb8, 0xb3, 0x83, 0x1e, 0xf7, 0x3c, 0xf7,\n                                                       0x30, 0x15, 0xfb, 0x1f, 0xe7, 0x5, 0x61, 0xa8,\n                                                       0x75, 0xa8, 0xac, 0x1a, 0xaf, 0xa9, 0xa3, 0x96,\n                                                       0x90, 0x1e, 0xf7, 0x18, 0x2d, 0x5, 0x13, 0xe4,\n                                                       0xb8, 0x6a, 0xa6, 0x78, 0x6b, 0x1a, 0x72, 0x7a,\n                                                       0x75, 0x72, 0x74, 0x1e, 0xe, 0xf8, 0xfa, 0xf7,\n                                                       0x7, 0x1, 0x91, 0xf7, 0x7, 0xe6, 0xf7, 0x7,\n                                                       0x3, 0x91, 0x44, 0xa, 0xe, 0xd5, 0x78, 0xd6,\n                                                       0xe7, 0xd2, 0xf7, 0xab, 0xd2, 0xe8, 0xd6, 0x1,\n                                                       0x80, 0xd6, 0xf7, 0xb, 0xe2, 0xf8, 0x28, 0xd6,\n                                                       0x3, 0xcb, 0xf7, 0xfb, 0x15, 0xf7, 0x3c, 0xf7,\n                                                       0x1d, 0xf7, 0x1b, 0xf7, 0x3d, 0x58, 0xa, 0xfb,\n                                                       0x3d, 0xfb, 0x1d, 0xf7, 0x1b, 0xf7, 0x3c, 0x1e,\n                                                       0xf8, 0x22, 0x53, 0x15, 0x76, 0x84, 0x78, 0x4c,\n                                                       0x45, 0x1b, 0x5e, 0x58, 0xad, 0xf5, 0xbd, 0x99,\n                                                       0xe4, 0xe4, 0xc9, 0x9e, 0x5b, 0x77, 0x92, 0x1f,\n                                                       0xdb, 0x9e, 0x5, 0xaf, 0x7e, 0x66, 0xdf, 0xfb,\n                                                       0xa, 0x1b, 0xfb, 0x10, 0x49, 0x36, 0xfb, 0x11,\n                                                       0xfb, 0x2f, 0xeb, 0x53, 0xe2, 0xcc, 0xdc, 0xa9,\n                                                       0xed, 0xa8, 0x1f, 0xfc, 0xbc, 0xde, 0x15, 0xfb,\n                                                       0x65, 0xf7, 0x3e, 0xfb, 0x3d, 0xf7, 0x67, 0x57,\n                                                       0xa, 0xfb, 0x67, 0x80, 0xa, 0xfb, 0xb9, 0xf7,\n                                                       0xa8, 0xe7, 0xf7, 0xa5, 0xeb, 0x1, 0xa1, 0xef,\n                                                       0xf7, 0x4, 0xed, 0x3, 0xf7, 0x93, 0xf7, 0xb3,\n                                                       0x15, 0xe7, 0x6, 0x7c, 0xaf, 0x8b, 0xa0, 0xd3,\n                                                       0x1a, 0xf7, 0x27, 0x7, 0xf0, 0x8b, 0xd4, 0xfb,\n                                                       0x29, 0x3a, 0x5a, 0x6b, 0x2f, 0x7a, 0x1e, 0xe6,\n                                                       0x73, 0x5, 0x8c, 0x8d, 0x8f, 0x8c, 0x8e, 0x1e,\n                                                       0xa5, 0x93, 0x93, 0x9d, 0xb1, 0x1b, 0xba, 0x8c,\n                                                       0x79, 0x5a, 0x8d, 0x1f, 0x78, 0x83, 0x73, 0x85,\n                                                       0x79, 0x86, 0x8, 0x35, 0x74, 0x4a, 0x7f, 0xfb,\n                                                       0x0, 0x1a, 0x41, 0xb5, 0x4d, 0xd6, 0xc1, 0xaf,\n                                                       0xae, 0x9e, 0x9a, 0x1e, 0x8d, 0x80, 0x8e, 0x7b,\n                                                       0x91, 0x7b, 0x8, 0x76, 0xf7, 0x62, 0x15, 0x72,\n                                                       0x7, 0x30, 0x5a, 0x82, 0x7c, 0x69, 0x7d, 0xa4,\n                                                       0x9e, 0xb3, 0xaa, 0x9a, 0xbd, 0x97, 0x1e, 0x9f,\n                                                       0x90, 0x8f, 0x8f, 0x92, 0x90, 0x8, 0xe, 0x20,\n                                                       0x5d, 0xa, 0xf8, 0x10, 0xd7, 0x53, 0xa, 0x61,\n                                                       0xfb, 0x64, 0x53, 0xa, 0xe, 0x3c, 0xf7, 0x15,\n                                                       0x76, 0x1, 0xf8, 0x20, 0xf7, 0x13, 0x3, 0xb3,\n                                                       0xf7, 0xc6, 0x15, 0xf7, 0xf9, 0xfb, 0x5a, 0xf7,\n                                                       0x13, 0xf7, 0xcb, 0xfc, 0x78, 0x6, 0xe, 0x3c,\n                                                       0xf7, 0x59, 0xf7, 0x4, 0x1, 0xb3, 0xf7, 0x59,\n                                                       0x15, 0xf8, 0x8c, 0xf7, 0x4, 0xfc, 0x8c, 0x6,\n                                                       0xe, 0xd5, 0x78, 0xd6, 0xf7, 0x9e, 0xca, 0xf7,\n                                                       0x1, 0xcb, 0xf3, 0xd6, 0x1, 0x80, 0xd6, 0xf7,\n                                                       0x19, 0xdc, 0xf7, 0x32, 0xe2, 0xf7, 0x2a, 0xd6,\n                                                       0x3, 0xf7, 0x59, 0xf7, 0x31, 0x15, 0xdc, 0xf7,\n                                                       0x39, 0xab, 0x6, 0xb4, 0x9e, 0x85, 0x2e, 0xbb,\n                                                       0x1f, 0xa7, 0x49, 0x5, 0xf0, 0x6, 0x5c, 0xdc,\n                                                       0x67, 0xc7, 0x7f, 0x9f, 0x66, 0x99, 0x19, 0x8d,\n                                                       0x7, 0xdd, 0x96, 0xa5, 0xc3, 0xb8, 0x1a, 0xf0,\n                                                       0x34, 0x96, 0xfb, 0x13, 0x1e, 0x7c, 0xa, 0xdc,\n                                                       0xfb, 0x41, 0x15, 0xf7, 0x1, 0xac, 0x7, 0xd2,\n                                                       0xc1, 0x8b, 0x56, 0x53, 0x57, 0x8b, 0x42, 0x1f,\n                                                       0xfb, 0x8b, 0x71, 0x15, 0xf7, 0x3c, 0xf7, 0x1d,\n                                                       0xf7, 0x1b, 0xf7, 0x3c, 0x58, 0xa, 0xfb, 0x3c,\n                                                       0xfb, 0x1d, 0xf7, 0x1b, 0xf7, 0x3c, 0x1e, 0x40,\n                                                       0x16, 0xfb, 0x65, 0xf7, 0x3e, 0xfb, 0x3d, 0xf7,\n                                                       0x66, 0x57, 0xa, 0xfb, 0x66, 0x80, 0xa, 0xf8,\n                                                       0xf0, 0xd5, 0x1, 0x85, 0xf7, 0xed, 0x3, 0x85,\n                                                       0xf8, 0xf0, 0x15, 0xf7, 0xed, 0xd5, 0xfb, 0xed,\n                                                       0x6, 0xe, 0xfb, 0x9b, 0xf8, 0x3e, 0xd6, 0xf7,\n                                                       0x1c, 0xd6, 0x1, 0xc4, 0xd5, 0xf7, 0x1e, 0xd5,\n                                                       0x3, 0xc4, 0xf8, 0xcf, 0x15, 0x3b, 0xca, 0x4a,\n                                                       0xda, 0xda, 0xcc, 0xcc, 0xdb, 0xdb, 0x4a, 0xc8,\n                                                       0x3c, 0x3c, 0x4c, 0x4e, 0x3b, 0x1e, 0xd5, 0x8a,\n                                                       0x15, 0xb1, 0xaa, 0xa8, 0xb1, 0xb1, 0xaa, 0x6f,\n                                                       0x64, 0x65, 0x6c, 0x6c, 0x65, 0x65, 0x6c, 0xaa,\n                                                       0xb1, 0x1e, 0xe, 0x3c, 0x8b, 0xe6, 0xf7, 0x42,\n                                                       0xf7, 0x6, 0xf7, 0x13, 0x90, 0xa, 0x16, 0xf8,\n                                                       0x8c, 0xe6, 0xfc, 0x8c, 0x6, 0xf7, 0x50, 0xb7,\n                                                       0x15, 0xf7, 0x13, 0xf7, 0x16, 0xf7, 0x51, 0xf7,\n                                                       0x6, 0xfb, 0x51, 0xf7, 0x13, 0xfb, 0x13, 0xfb,\n                                                       0x13, 0xfb, 0x50, 0xfb, 0x6, 0xf7, 0x50, 0x6,\n                                                       0xe, 0xf7, 0xaf, 0xdc, 0xf7, 0x9d, 0xdc, 0x1,\n                                                       0xf7, 0x76, 0xed, 0x3, 0x94, 0xf7, 0xaf, 0x15,\n                                                       0xf7, 0xcf, 0xdc, 0xfb, 0x46, 0x6, 0xf7, 0x9,\n                                                       0xe4, 0xc8, 0xbc, 0xdc, 0x1a, 0xbd, 0x64, 0xd8,\n                                                       0xfb, 0x4, 0xfb, 0x21, 0x83, 0x27, 0x67, 0x87,\n                                                       0x1e, 0xed, 0x82, 0x5, 0xa7, 0x8d, 0x90, 0xaf,\n                                                       0xbb, 0x1b, 0x92, 0xb9, 0x8b, 0x5d, 0x67, 0x73,\n                                                       0x78, 0x4b, 0x54, 0x1f, 0x28, 0x36, 0x6d, 0x69,\n                                                       0x44, 0x1a, 0xe, 0xf7, 0xa3, 0xdd, 0xf7, 0xa7,\n                                                       0xdd, 0x1, 0xf7, 0x61, 0xee, 0x3, 0x93, 0xf8,\n                                                       0x27, 0x15, 0xfb, 0xf, 0x9a, 0xf7, 0x2, 0x82,\n                                                       0xab, 0x1b, 0xe9, 0xce, 0xca, 0xd6, 0xbd, 0x70,\n                                                       0xae, 0x5e, 0x9d, 0x1f, 0xad, 0xa1, 0x9b, 0xa6,\n                                                       0xa9, 0x1a, 0xc8, 0x53, 0xc5, 0x34, 0xfb, 0xe,\n                                                       0x7b, 0x37, 0x63, 0x82, 0x1e, 0xea, 0x7d, 0x5,\n                                                       0xa0, 0x8d, 0x8f, 0xae, 0xb9, 0x1b, 0x9e, 0xa4,\n                                                       0x83, 0x6e, 0x5c, 0x50, 0x8c, 0x7d, 0x1f, 0x7f,\n                                                       0x38, 0x5, 0xb8, 0x9f, 0xc5, 0x79, 0x54, 0x1a,\n                                                       0x6f, 0x7a, 0x6f, 0x62, 0x57, 0x87, 0xb5, 0x9d,\n                                                       0x87, 0x1e, 0xe, 0xf8, 0xf0, 0x84, 0xa, 0xf7,\n                                                       0x0, 0xf8, 0xf0, 0x15, 0xed, 0x6, 0xf7, 0x2a,\n                                                       0x83, 0xa, 0xfb, 0x40, 0x6, 0xe, 0x57, 0xfb,\n                                                       0x4e, 0x76, 0xf7, 0x53, 0xf7, 0x5, 0x27, 0xef,\n                                                       0xf8, 0x47, 0x77, 0x49, 0xa, 0x13, 0xdc, 0xf7,\n                                                       0x61, 0xc9, 0x15, 0x8d, 0x6, 0x68, 0x9c, 0x9e,\n                                                       0x60, 0xcb, 0x1b, 0xbc, 0xb1, 0xaf, 0xb5, 0xa0,\n                                                       0x1f, 0x8d, 0x6, 0x13, 0xbc, 0x4a, 0xf7, 0x14,\n                                                       0xf8, 0xab, 0xfb, 0x1f, 0xfb, 0x87, 0x7, 0x3e,\n                                                       0x87, 0xfb, 0x7, 0x2c, 0x2c, 0x84, 0xf7, 0x8,\n                                                       0xd9, 0x1e, 0xf7, 0x85, 0xfb, 0x1f, 0xfd, 0x77,\n                                                       0xf7, 0x1f, 0x7, 0xe, 0x20, 0xfb, 0x3e, 0x76,\n                                                       0xf9, 0x92, 0xf7, 0x11, 0x1, 0xf8, 0x6, 0xf7,\n                                                       0x6, 0x3, 0xf7, 0x4a, 0xfb, 0x53, 0x15, 0xf7,\n                                                       0x7, 0xf9, 0x92, 0xd4, 0xfd, 0x92, 0xf7, 0x6,\n                                                       0xf9, 0x92, 0xc2, 0xf7, 0x11, 0xfb, 0xb4, 0x6,\n                                                       0xfb, 0x2e, 0x22, 0x5f, 0xfb, 0x2d, 0x5a, 0xa1,\n                                                       0xfb, 0x27, 0xf7, 0x3c, 0x1f, 0xe, 0xfc, 0x15,\n                                                       0xf7, 0x40, 0xf7, 0x36, 0x1, 0xf7, 0x8, 0xf7,\n                                                       0x36, 0x3, 0xc5, 0xf7, 0x40, 0x15, 0xf7, 0x36,\n                                                       0xf7, 0x36, 0xfb, 0x36, 0x6, 0xe, 0xfb, 0x78,\n                                                       0xd0, 0xee, 0xc7, 0x1, 0xc6, 0x7c, 0x15, 0x7f,\n                                                       0x54, 0x5, 0x90, 0x99, 0xa3, 0x90, 0x9f, 0x1b,\n                                                       0xba, 0x94, 0x6e, 0x79, 0x69, 0x6e, 0x79, 0x60,\n                                                       0x67, 0x71, 0x8e, 0x8f, 0x76, 0x1f, 0x48, 0x7,\n                                                       0x84, 0xa1, 0xb7, 0x89, 0x9e, 0x1b, 0xd5, 0xdb,\n                                                       0xac, 0xe5, 0xd2, 0x57, 0xad, 0x4f, 0x7a, 0x69,\n                                                       0x86, 0x81, 0x74, 0x1f, 0xe, 0xf7, 0xc4, 0x76,\n                                                       0xf8, 0x3f, 0x77, 0x1, 0xf7, 0x1e, 0xee, 0x3,\n                                                       0xf7, 0x1e, 0xf7, 0xaf, 0x15, 0xee, 0xf8, 0x3f,\n                                                       0x3b, 0x6, 0x6f, 0x42, 0x31, 0x6f, 0x7e, 0x88,\n                                                       0x8, 0x34, 0x7, 0xa5, 0x92, 0xa5, 0x90, 0xc7,\n                                                       0xb5, 0x8, 0xe, 0xfb, 0xbe, 0xf7, 0xa8, 0xf4,\n                                                       0xf7, 0x92, 0xf1, 0x1, 0x91, 0xf7, 0x0, 0xf7,\n                                                       0x1e, 0xf7, 0x0, 0x3, 0x91, 0xf8, 0x94, 0x15,\n                                                       0xfb, 0x1a, 0xc7, 0x25, 0xf7, 0x7, 0xf7, 0x8,\n                                                       0xca, 0xf0, 0xf7, 0x1b, 0xf7, 0x12, 0x51, 0xee,\n                                                       0xfb, 0xd, 0xfb, 0x6, 0x4e, 0x30, 0xfb, 0x1a,\n                                                       0x1e, 0xf7, 0x0, 0x16, 0xbb, 0x93, 0xd6, 0xc6,\n                                                       0xc6, 0x97, 0x4f, 0x4c, 0x54, 0x80, 0x3f, 0x4f,\n                                                       0x51, 0x82, 0xda, 0xbf, 0x1e, 0xe, 0x20, 0x5d,\n                                                       0xa, 0xe3, 0xd7, 0x50, 0xa, 0xcb, 0xfb, 0x5f,\n                                                       0x50, 0xa, 0xe, 0xf7, 0x3f, 0x8d, 0x76, 0xa7,\n                                                       0x76, 0xd0, 0xcf, 0xf8, 0xdc, 0x77, 0xa0, 0x77,\n                                                       0x12, 0xa5, 0xf7, 0x57, 0xf8, 0x2c, 0xe1, 0x13,\n                                                       0x6e, 0xf8, 0x5b, 0xc4, 0x15, 0xf7, 0x42, 0x46,\n                                                       0xe1, 0xd0, 0xbe, 0xcf, 0x58, 0xf7, 0x71, 0x3f,\n                                                       0x6, 0xfb, 0x4c, 0xfb, 0x72, 0x5, 0xe1, 0x8c,\n                                                       0x15, 0xe1, 0xf6, 0x5, 0x8d, 0x20, 0x6, 0x13,\n                                                       0xae, 0xfc, 0x77, 0xfb, 0x24, 0x15, 0xd7, 0x6,\n                                                       0xf8, 0x38, 0xf9, 0x6d, 0x5, 0x3f, 0x6, 0xfc,\n                                                       0x48, 0xfb, 0xfa, 0x15, 0xe6, 0x6, 0x13, 0x76,\n                                                       0xf7, 0xf9, 0x41, 0x7, 0x72, 0x4e, 0x37, 0x74,\n                                                       0x7f, 0x88, 0x8, 0x42, 0x7, 0x8f, 0x8c, 0x91,\n                                                       0x8c, 0x8d, 0x8c, 0x96, 0x8e, 0xae, 0x94, 0xb9,\n                                                       0xa9, 0x8, 0xe, 0xf7, 0x3f, 0x7d, 0xd6, 0x50,\n                                                       0x76, 0xf7, 0x8a, 0xf7, 0xb, 0xf8, 0x0, 0x77,\n                                                       0x12, 0xa5, 0xf7, 0x5b, 0xf8, 0x71, 0xe7, 0x13,\n                                                       0x7c, 0xf7, 0x29, 0x78, 0x15, 0xd8, 0x6, 0xf8,\n                                                       0x3f, 0xf9, 0x6d, 0x5, 0x3e, 0x6, 0xfc, 0x50,\n                                                       0xfb, 0xfb, 0x15, 0xe8, 0xf7, 0xf8, 0x40, 0x6,\n                                                       0x71, 0x4e, 0x35, 0x76, 0x7f, 0x88, 0x8, 0x42,\n                                                       0x7, 0xa3, 0x91, 0xa4, 0x90, 0xc4, 0xae, 0x8,\n                                                       0x13, 0xbc, 0xf8, 0x0, 0xfc, 0xf5, 0x15, 0xf7,\n                                                       0xbe, 0xd6, 0xfb, 0x2e, 0x6, 0x94, 0x94, 0x91,\n                                                       0x91, 0x94, 0x90, 0x8, 0xf5, 0xd4, 0xa3, 0xb0,\n                                                       0xba, 0x1a, 0xb5, 0x69, 0xcd, 0x21, 0xfb, 0x18,\n                                                       0x80, 0x37, 0x6c, 0x87, 0x1e, 0xe7, 0x84, 0x5,\n                                                       0xa3, 0x8d, 0x90, 0xa9, 0xb8, 0x1b, 0x92, 0xb7,\n                                                       0x8a, 0x64, 0x6d, 0x73, 0x7b, 0x4f, 0x5e, 0x1f,\n                                                       0x2f, 0x41, 0x75, 0x6c, 0x83, 0x53, 0x8, 0xe,\n                                                       0xf7, 0x3f, 0x8d, 0x76, 0xa5, 0x76, 0xd0, 0xcf,\n                                                       0xf7, 0x71, 0xcf, 0xf7, 0x79, 0xcf, 0x8c, 0x77,\n                                                       0x12, 0xf7, 0x5c, 0xe8, 0xf8, 0x2, 0xe2, 0x13,\n                                                       0x7b, 0xf8, 0x75, 0xc2, 0x15, 0xf7, 0x46, 0x46,\n                                                       0xe2, 0xd0, 0xc0, 0xcf, 0x56, 0xf7, 0x71, 0x3e,\n                                                       0x6, 0xfb, 0x50, 0xfb, 0x72, 0x5, 0xe3, 0x8c,\n                                                       0x15, 0xe3, 0xf6, 0x5, 0x8d, 0x20, 0x6, 0x13,\n                                                       0xb7, 0xfc, 0x77, 0xfb, 0x22, 0x15, 0xd9, 0x6,\n                                                       0xf8, 0x42, 0xf9, 0x6d, 0x5, 0x3d, 0x6, 0xfc,\n                                                       0xe2, 0xfb, 0x94, 0x15, 0x25, 0x99, 0xf2, 0x83,\n                                                       0xa8, 0x1b, 0xe3, 0xca, 0xbf, 0xca, 0xb4, 0x72,\n                                                       0xa8, 0x60, 0x9a, 0x1f, 0xac, 0x9d, 0x9a, 0xa4,\n                                                       0xa4, 0x1a, 0x13, 0x7b, 0xbd, 0x56, 0xba, 0x39,\n                                                       0xfb, 0x5, 0x7c, 0x45, 0x6a, 0x83, 0x1e, 0xe3,\n                                                       0x7f, 0x5, 0x9d, 0x8d, 0x8f, 0xa8, 0xb5, 0x1b,\n                                                       0x9e, 0xa2, 0x86, 0x73, 0x64, 0x54, 0x8a, 0x7e,\n                                                       0x1f, 0x80, 0x46, 0x5, 0x90, 0x9e, 0x96, 0x8d,\n                                                       0x9a, 0x1b, 0xac, 0x9d, 0x71, 0x72, 0x73, 0x7b,\n                                                       0x74, 0x64, 0x5b, 0x87, 0xae, 0x9a, 0x88, 0x1f,\n                                                       0xe, 0x57, 0xfb, 0x57, 0xf5, 0xf8, 0x48, 0x77,\n                                                       0x1, 0xc2, 0xf7, 0x15, 0xbe, 0xf7, 0x19, 0x3,\n                                                       0xf7, 0x8b, 0xf7, 0xef, 0x15, 0x8e, 0x4b, 0x8a,\n                                                       0x76, 0x4c, 0x57, 0x8, 0x2e, 0x3a, 0x65, 0x5c,\n                                                       0x44, 0x1a, 0xfb, 0x5, 0xec, 0x2e, 0xf7, 0x27,\n                                                       0xf7, 0x37, 0xde, 0xf7, 0x4, 0xed, 0x91, 0x1e,\n                                                       0xfb, 0xc, 0x9c, 0x5, 0x3e, 0x7c, 0x5f, 0x5f,\n                                                       0x42, 0x1b, 0x52, 0x51, 0xab, 0xcc, 0xb7, 0xa1,\n                                                       0x9d, 0xcd, 0xc3, 0x1f, 0xe9, 0xda, 0x8f, 0xb8,\n                                                       0x89, 0xec, 0x8, 0xfb, 0x19, 0xbb, 0x15, 0xf7,\n                                                       0x19, 0xf7, 0x1d, 0xfb, 0x19, 0x6, 0xe, 0x35,\n                                                       0xa, 0xd3, 0xf7, 0x28, 0x1, 0xf7, 0xf2, 0xf9,\n                                                       0xa8, 0x15, 0xde, 0x6, 0x4a, 0xf7, 0x28, 0x40,\n                                                       0xa, 0xfb, 0x5f, 0xfe, 0x3c, 0x28, 0xa, 0x35,\n                                                       0xa, 0xd3, 0xf7, 0x28, 0x1, 0xf7, 0xb7, 0xf9,\n                                                       0xa8, 0x15, 0xde, 0x6, 0xf7, 0x13, 0xf7, 0x28,\n                                                       0x40, 0xa, 0xfb, 0xe4, 0xfe, 0x3c, 0x28, 0xa,\n                                                       0x35, 0xa, 0xd5, 0x84, 0xa, 0xf7, 0x61, 0xf9,\n                                                       0xaa, 0x15, 0xf4, 0x6, 0xbe, 0xd4, 0xc1, 0x42,\n                                                       0x5, 0xf3, 0x6, 0x2b, 0x83, 0xa, 0xfb, 0xc,\n                                                       0x6, 0xfb, 0xaf, 0xfe, 0x3c, 0x28, 0xa, 0x35,\n                                                       0xa, 0xf7, 0xf, 0xdf, 0x8a, 0x77, 0x12, 0x13,\n                                                       0xf0, 0xf7, 0x5e, 0xf9, 0xaf, 0x15, 0xc6, 0x65,\n                                                       0xa, 0xab, 0xaa, 0x1b, 0xa6, 0xa1, 0x82, 0x82,\n                                                       0x9f, 0x1f, 0x80, 0xa6, 0xa3, 0x7e, 0xa6, 0x1b,\n                                                       0xdd, 0x8b, 0xef, 0xa5, 0x1f, 0x4f, 0x7a, 0xa,\n                                                       0x6d, 0x6b, 0x1b, 0x81, 0x78, 0x95, 0x95, 0x73,\n                                                       0x1f, 0x13, 0xe8, 0x97, 0x72, 0x6d, 0x96, 0x6e,\n                                                       0x1b, 0x4d, 0x71, 0x5a, 0x3d, 0x8e, 0x1f, 0xfb,\n                                                       0x4a, 0xfd, 0xaf, 0x28, 0xa, 0x35, 0xa, 0xda,\n                                                       0xf7, 0xc, 0x1, 0xf7, 0x62, 0xf9, 0xaf, 0x15,\n                                                       0xf7, 0x4, 0xf7, 0xc, 0x7c, 0xa, 0xf7, 0x5c,\n                                                       0xfb, 0xc, 0x15, 0xf7, 0x4, 0xf7, 0xc, 0x7c,\n                                                       0xa, 0xfc, 0x16, 0xfe, 0x27, 0x28, 0xa, 0x35,\n                                                       0xa, 0xc0, 0xf7, 0x55, 0x1, 0x9f, 0x16, 0x27,\n                                                       0xa, 0xfb, 0x47, 0xf8, 0xd3, 0x15, 0x56, 0xb4,\n                                                       0x5f, 0xbd, 0xbc, 0xb5, 0xb5, 0xc2, 0xc3, 0x62,\n                                                       0xb3, 0x59, 0x58, 0x63, 0x62, 0x54, 0x1e, 0xbd,\n                                                       0x16, 0xa4, 0x9d, 0x9d, 0xa2, 0xa1, 0x9e, 0x7a,\n                                                       0x71, 0x73, 0x78, 0x77, 0x75, 0x75, 0x78, 0x9f,\n                                                       0xa3, 0x1e, 0xe, 0xf7, 0xe5, 0x8b, 0xf7, 0xe,\n                                                       0xba, 0xf7, 0x12, 0xa0, 0xf7, 0xe, 0xf7, 0x35,\n                                                       0xf7, 0xb, 0x1, 0xf8, 0x66, 0xf7, 0x1d, 0x3,\n                                                       0x90, 0x16, 0xf7, 0x2d, 0x6, 0xd1, 0xf7, 0x3d,\n                                                       0x5, 0xf7, 0x81, 0xfb, 0x3d, 0xf8, 0x7d, 0xf7,\n                                                       0xe, 0xfb, 0xf3, 0xf7, 0x56, 0xf7, 0xc2, 0xf7,\n                                                       0xe, 0xfb, 0xc2, 0xf7, 0x35, 0xf7, 0xe7, 0xf7,\n                                                       0xb, 0xfc, 0xfe, 0x6, 0x5e, 0xfc, 0x3b, 0x15,\n                                                       0xf7, 0x1a, 0xf7, 0xd0, 0x5, 0xc0, 0xfb, 0xd0,\n                                                       0x6, 0xe, 0xc6, 0xfb, 0x78, 0xc9, 0xe4, 0xbe,\n                                                       0x8d, 0xf7, 0x13, 0xf8, 0x8e, 0xf7, 0x14, 0x1,\n                                                       0xb7, 0xf7, 0x2d, 0xf7, 0x68, 0xea, 0x3, 0xf7,\n                                                       0x7c, 0xfb, 0x35, 0x15, 0x4f, 0x7, 0x85, 0xa7,\n                                                       0xbd, 0x8a, 0x8f, 0x1b, 0xf6, 0xde, 0xb1, 0xd2,\n                                                       0xb0, 0x78, 0xba, 0x30, 0x94, 0x1f, 0x8d, 0x7,\n                                                       0xf7, 0x65, 0xca, 0xf7, 0x40, 0xcc, 0x9d, 0x1f,\n                                                       0xfb, 0x24, 0xb9, 0x5, 0x3a, 0x79, 0x5d, 0x40,\n                                                       0x29, 0x1b, 0xfb, 0x26, 0x68, 0xf7, 0x11, 0xf7,\n                                                       0xe, 0xbb, 0x8b, 0xf7, 0x67, 0xf7, 0x4b, 0xd7,\n                                                       0xc8, 0x60, 0x3b, 0x9d, 0x1f, 0xf7, 0x27, 0xae,\n                                                       0x5, 0xf7, 0x40, 0x4d, 0xfb, 0x1b, 0xb7, 0x22,\n                                                       0x1b, 0xfb, 0x83, 0x2a, 0xfb, 0x4a, 0xfb, 0x61,\n                                                       0xfb, 0x7a, 0xf7, 0x20, 0xfb, 0x24, 0xf7, 0x45,\n                                                       0x1f, 0x89, 0x7, 0x8c, 0x7, 0x75, 0x8a, 0x76,\n                                                       0x88, 0x72, 0x82, 0x7d, 0x5a, 0x18, 0x8f, 0x9b,\n                                                       0xa6, 0x91, 0xa2, 0x1b, 0xc0, 0x96, 0x6f, 0x7d,\n                                                       0x61, 0x54, 0x86, 0x63, 0x6d, 0x86, 0x8b, 0x90,\n                                                       0x5c, 0x1f, 0xe, 0x33, 0xa, 0xf7, 0x8a, 0xbb,\n                                                       0x15, 0xe3, 0x6, 0x46, 0xf7, 0x28, 0x5, 0xfb,\n                                                       0x2d, 0x6, 0xe, 0x33, 0xa, 0xf7, 0x4c, 0xbb,\n                                                       0x15, 0xe2, 0x6, 0xf7, 0x1b, 0xf7, 0x28, 0x5,\n                                                       0xfb, 0x2e, 0x6, 0xe, 0x3a, 0xa, 0xbd, 0x84,\n                                                       0xa, 0xd7, 0xf7, 0x24, 0x3, 0xf7, 0x3d, 0xf9,\n                                                       0xaa, 0x15, 0xf7, 0x3, 0x6, 0xc0, 0xd4, 0xc5,\n                                                       0x42, 0x5, 0xf7, 0x2, 0x6, 0x26, 0x83, 0xa,\n                                                       0xfb, 0x14, 0x6, 0xfb, 0x58, 0xfe, 0x3c, 0x15,\n                                                       0x2e, 0xa, 0xe, 0x3a, 0xa, 0xc3, 0xf7, 0xb,\n                                                       0x12, 0xd7, 0xf7, 0x24, 0x59, 0xf7, 0xa, 0xe9,\n                                                       0xf7, 0xa, 0x13, 0xf6, 0xf7, 0x3e, 0xf9, 0xb0,\n                                                       0x8e, 0xa, 0xf7, 0x68, 0xfb, 0xb, 0x8e, 0xa,\n                                                       0x13, 0xfa, 0xfb, 0xc6, 0xfe, 0x27, 0x15, 0x2e,\n                                                       0xa, 0xe, 0x4c, 0xa, 0xf9, 0xad, 0xf7, 0x23,\n                                                       0x94, 0xa, 0xe9, 0xf9, 0xad, 0x15, 0xe2, 0x6,\n                                                       0x3d, 0x75, 0xa, 0xf7, 0xb, 0x46, 0xa, 0x4c,\n                                                       0xa, 0xfa, 0x3c, 0x77, 0x94, 0xa, 0xcb, 0xf9,\n                                                       0xad, 0x15, 0xe2, 0x6, 0xf7, 0x46, 0x75, 0xa,\n                                                       0x20, 0x46, 0xa, 0x4c, 0xa, 0xf9, 0xaf, 0xf7,\n                                                       0x21, 0x94, 0xa, 0x66, 0xf9, 0xaf, 0x95, 0xa,\n                                                       0xd1, 0xc8, 0x45, 0x77, 0xa, 0xf7, 0x21, 0x5,\n                                                       0xfb, 0x1b, 0x6, 0x87, 0x46, 0xa, 0x4c, 0xa,\n                                                       0xf9, 0xb3, 0xf7, 0x8, 0x1, 0xd0, 0x63, 0xa,\n                                                       0xf9, 0x60, 0x68, 0xa, 0x31, 0xde, 0x92, 0xa,\n                                                       0xf7, 0x62, 0xfb, 0x8, 0x92, 0xa, 0xe, 0xc6,\n                                                       0x8b, 0xf7, 0xd, 0xf8, 0x70, 0x82, 0xa, 0xd2,\n                                                       0xf7, 0x27, 0xf7, 0xcc, 0xf7, 0x2f, 0x3, 0xf7,\n                                                       0x6e, 0xf7, 0xd, 0x15, 0xf7, 0x4f, 0xf7, 0x31,\n                                                       0xef, 0xfb, 0x31, 0xf7, 0x51, 0xf7, 0x0, 0x7,\n                                                       0xf7, 0x24, 0xc7, 0x8b, 0xfb, 0x86, 0xfb, 0x7a,\n                                                       0x2e, 0x87, 0xfb, 0x0, 0x1f, 0xfb, 0x96, 0xfb,\n                                                       0xd, 0x15, 0xf7, 0x96, 0x6, 0xf7, 0x8e, 0xf5,\n                                                       0xf7, 0x46, 0xf7, 0x42, 0xf7, 0x9d, 0xfb, 0x1,\n                                                       0xf0, 0xfb, 0x8e, 0x1f, 0xfb, 0x93, 0xfb, 0xca,\n                                                       0x3f, 0x27, 0xd7, 0x6, 0xe, 0x69, 0xa, 0xf9,\n                                                       0x74, 0x77, 0xf7, 0x62, 0x5c, 0xa, 0xf8, 0x74,\n                                                       0x8d, 0x6, 0xf7, 0xbb, 0xfc, 0x74, 0x5, 0xf7,\n                                                       0x2a, 0xf9, 0x74, 0xfb, 0x1e, 0xfc, 0x7f, 0x89,\n                                                       0x6, 0xfb, 0xc1, 0xf8, 0x7f, 0x5, 0xfb, 0x24,\n                                                       0x6, 0xf7, 0xb, 0xc6, 0x15, 0xcb, 0x65, 0xa,\n                                                       0xab, 0xad, 0x1b, 0xaa, 0xa2, 0x80, 0x81, 0xa3,\n                                                       0x1f, 0x81, 0xa4, 0xa4, 0x80, 0xab, 0x1b, 0xe3,\n                                                       0x8b, 0xef, 0xa5, 0x1f, 0x4a, 0x7a, 0xa, 0x6d,\n                                                       0x68, 0x1b, 0x80, 0x77, 0x95, 0x95, 0x71, 0x1f,\n                                                       0x97, 0x71, 0x69, 0x96, 0x6a, 0x1b, 0x48, 0x70,\n                                                       0x5a, 0x3d, 0x8e, 0x1f, 0xe, 0x59, 0xa, 0xd1,\n                                                       0xf7, 0x23, 0x1, 0xc6, 0xf7, 0x28, 0xf8, 0x0,\n                                                       0x85, 0xa, 0xb7, 0xf7, 0xf4, 0x29, 0xa, 0xfb,\n                                                       0x22, 0x51, 0x22, 0xfb, 0x1f, 0xfb, 0x2c, 0x5e,\n                                                       0xf7, 0x4, 0xf7, 0x1b, 0x1e, 0xf7, 0x4d, 0xf8,\n                                                       0x4d, 0x15, 0xe1, 0x6, 0x47, 0x67, 0xa, 0xfb,\n                                                       0x2c, 0x6, 0xe, 0x5f, 0xa, 0xf8, 0x82, 0xf7,\n                                                       0x10, 0xd1, 0xf7, 0x23, 0x7e, 0xa, 0xf7, 0xcf,\n                                                       0xf9, 0xad, 0x15, 0xe1, 0x6, 0xf7, 0x1a, 0x67,\n                                                       0xa, 0xfb, 0x2c, 0x6, 0xfb, 0xe7, 0x31, 0xa,\n                                                       0x54, 0xfb, 0xb, 0xfb, 0x22, 0x41, 0xa, 0x5f,\n                                                       0xa, 0xf8, 0x82, 0xf7, 0x10, 0xd3, 0xf7, 0x21,\n                                                       0x7e, 0xa, 0xf7, 0x74, 0xf9, 0xaf, 0x15, 0xf7,\n                                                       0x3, 0x6, 0xc0, 0xd1, 0xc3, 0x45, 0x5, 0xf7,\n                                                       0x2, 0x6, 0x26, 0xf7, 0x21, 0x5, 0xfb, 0x12,\n                                                       0x6, 0xfb, 0xaf, 0x31, 0xa, 0x4f, 0xfb, 0xb,\n                                                       0xfb, 0x1d, 0x41, 0xa, 0x59, 0xa, 0xd8, 0x64,\n                                                       0xa, 0xd1, 0xf7, 0x28, 0xf7, 0xf1, 0xf7, 0x28,\n                                                       0x13, 0xd6, 0xf7, 0x71, 0xf9, 0xb2, 0x15, 0xc9,\n                                                       0x6a, 0xa, 0x9f, 0x1f, 0x13, 0xe6, 0x80, 0xa3,\n                                                       0xa1, 0x80, 0xad, 0x1b, 0xe1, 0x8b, 0xed, 0xa4,\n                                                       0x1f, 0x4c, 0x7a, 0xa, 0x6e, 0x69, 0x1b, 0x81,\n                                                       0x79, 0x93, 0x94, 0x75, 0x1f, 0x13, 0xce, 0x97,\n                                                       0x70, 0x67, 0x98, 0x6c, 0x1b, 0x4a, 0x70, 0x5b,\n                                                       0x3f, 0x8e, 0x1f, 0xfb, 0x45, 0xfc, 0x52, 0x29,\n                                                       0xa, 0xfb, 0x2c, 0x4f, 0x2c, 0xfb, 0x1d, 0x41,\n                                                       0xa, 0x59, 0xa, 0xd6, 0xf7, 0x9, 0x1, 0xc6,\n                                                       0xf7, 0x28, 0xf8, 0x1, 0x85, 0xa, 0xf7, 0x75,\n                                                       0xf9, 0xb2, 0x8d, 0xa, 0xf7, 0x66, 0xfb, 0x9,\n                                                       0x8d, 0xa, 0xfc, 0x1b, 0xfc, 0xc7, 0x29, 0xa,\n                                                       0xfb, 0x11, 0x54, 0xfb, 0xe, 0xfb, 0x22, 0x41,\n                                                       0xa, 0x3c, 0xa1, 0x76, 0xf8, 0x8c, 0x77, 0x1,\n                                                       0xb4, 0xec, 0x15, 0xe9, 0x2c, 0xf7, 0x30, 0xf7,\n                                                       0x31, 0xf7, 0x32, 0xfb, 0x32, 0xeb, 0xec, 0xfb,\n                                                       0x32, 0xf7, 0x31, 0xf7, 0x30, 0xf7, 0x2f, 0x2e,\n                                                       0xea, 0xfb, 0x31, 0xfb, 0x31, 0xfb, 0x31, 0xf7,\n                                                       0x31, 0x2b, 0x2b, 0xf7, 0x32, 0xfb, 0x30, 0x5,\n                                                       0xe, 0xf7, 0x7, 0x85, 0x76, 0xa6, 0xf7, 0xe,\n                                                       0xf8, 0x74, 0xf7, 0xe, 0xa0, 0x77, 0x1, 0xbc,\n                                                       0xf7, 0x27, 0xf8, 0x7, 0xf7, 0x27, 0x3, 0xac,\n                                                       0xab, 0x15, 0xcf, 0x50, 0xd9, 0xe2, 0x5, 0x5a,\n                                                       0xce, 0xd5, 0x80, 0xcd, 0x1b, 0xf7, 0x8a, 0xed,\n                                                       0xf7, 0x56, 0xf7, 0x43, 0xab, 0x89, 0xf7, 0x2,\n                                                       0x4a, 0xe1, 0x1f, 0xdc, 0xe4, 0x48, 0xc6, 0x3f,\n                                                       0x36, 0x5, 0x9f, 0x71, 0x4c, 0xb7, 0xfb, 0x12,\n                                                       0x1b, 0xfb, 0x88, 0x2a, 0xfb, 0x40, 0xfb, 0x4b,\n                                                       0xfb, 0x18, 0xb1, 0x44, 0xab, 0x60, 0x1f, 0xee,\n                                                       0xf7, 0x2, 0x15, 0x7d, 0xad, 0x83, 0xbc, 0xc0,\n                                                       0x1a, 0xf7, 0x12, 0xc6, 0xf6, 0xf7, 0x1b, 0xb8,\n                                                       0xba, 0x80, 0x6e, 0xad, 0x1e, 0xfb, 0x87, 0xfc,\n                                                       0x25, 0x15, 0xf7, 0xbb, 0xf7, 0xda, 0x5, 0x95,\n                                                       0x72, 0x94, 0x64, 0x55, 0x1a, 0xfb, 0x47, 0x2a,\n                                                       0x47, 0x27, 0x6e, 0x63, 0x8e, 0xaf, 0x5b, 0x1e,\n                                                       0xe, 0x54, 0xa, 0xd3, 0xf9, 0x5e, 0x5e, 0xa,\n                                                       0xb5, 0xfb, 0x48, 0xf7, 0x8f, 0xf7, 0x7a, 0xc3,\n                                                       0x2b, 0xa, 0xf7, 0x18, 0xd9, 0x15, 0xe4, 0x6,\n                                                       0x45, 0xf7, 0x24, 0x97, 0xa, 0xe, 0x54, 0xa,\n                                                       0xf7, 0xb3, 0xf9, 0xac, 0x15, 0xe3, 0x6, 0xf7,\n                                                       0x1c, 0xf7, 0x24, 0x97, 0xa, 0xfb, 0xb0, 0xfb,\n                                                       0x72, 0x5e, 0xa, 0xa1, 0xfb, 0x48, 0xf7, 0xa3,\n                                                       0x2f, 0xa, 0xc6, 0x78, 0xf7, 0x11, 0xf9, 0x44,\n                                                       0xf7, 0x22, 0x42, 0xa, 0xf7, 0x57, 0xf9, 0xae,\n                                                       0x15, 0xf7, 0x4, 0x6, 0xc1, 0xd1, 0xc5, 0x45,\n                                                       0x5, 0xf7, 0x3, 0x6, 0x25, 0xf7, 0x22, 0x5,\n                                                       0xfb, 0x15, 0x6, 0xfb, 0x77, 0xfb, 0x72, 0x34,\n                                                       0xa, 0xc6, 0x78, 0xf7, 0x11, 0xf9, 0x48, 0xf7,\n                                                       0x9, 0x12, 0xd3, 0xf7, 0x26, 0x75, 0xf7, 0xb,\n                                                       0xea, 0xf7, 0xb, 0x73, 0xf7, 0x26, 0x13, 0xd8,\n                                                       0xf7, 0x58, 0xf9, 0xb2, 0x8f, 0xa, 0xf7, 0x6a,\n                                                       0xfb, 0x9, 0x8f, 0xa, 0x13, 0xe4, 0xfb, 0xe6,\n                                                       0xfb, 0x5d, 0x34, 0xa, 0x8f, 0xa0, 0x76, 0x1,\n                                                       0xf7, 0x9d, 0xf7, 0x1d, 0x3, 0x70, 0xa, 0xf8,\n                                                       0x34, 0x5, 0xfb, 0x32, 0x6, 0xfb, 0x33, 0xfb,\n                                                       0xaf, 0xfb, 0x34, 0xf7, 0xaf, 0x5, 0xfb, 0x35,\n                                                       0x6, 0xf7, 0x8e, 0xfc, 0x33, 0x5, 0x89, 0xf8,\n                                                       0x80, 0x15, 0xde, 0x6, 0xf7, 0x14, 0x67, 0xa,\n                                                       0xfb, 0x26, 0x6, 0xe, 0x8f, 0xa0, 0x76, 0xf7,\n                                                       0x1b, 0xf7, 0xe, 0xf7, 0x60, 0xf7, 0xe, 0xf7,\n                                                       0x1b, 0x77, 0x60, 0xa, 0xf7, 0x1b, 0xd1, 0x6,\n                                                       0xcc, 0xf1, 0x8c, 0xa3, 0xbe, 0x1f, 0xb9, 0xa1,\n                                                       0xd3, 0xbf, 0xf7, 0x12, 0x1a, 0xf7, 0x73, 0xfb,\n                                                       0x2f, 0x8b, 0xfb, 0x49, 0x1e, 0x45, 0xf7, 0x1b,\n                                                       0xfb, 0x25, 0x6, 0xf7, 0x25, 0xfc, 0x61, 0x15,\n                                                       0xf7, 0x60, 0xd1, 0x7, 0xf4, 0xdc, 0x88, 0x29,\n                                                       0x24, 0xfb, 0x3, 0x8b, 0x40, 0x1f, 0xe, 0x57,\n                                                       0x92, 0x76, 0xf9, 0x11, 0xf7, 0x0, 0x1, 0xd0,\n                                                       0xf7, 0x1e, 0xf7, 0x7e, 0xf7, 0x1e, 0x3, 0xd0,\n                                                       0x84, 0x15, 0xf7, 0x1e, 0xf8, 0x6b, 0x6, 0xe3,\n                                                       0x8b, 0xd2, 0xd6, 0xe6, 0x68, 0x36, 0x4c, 0x6d,\n                                                       0x1e, 0x75, 0x5e, 0x81, 0x6d, 0x72, 0x1a, 0x64,\n                                                       0xa6, 0x6e, 0xc3, 0x56, 0x1e, 0xcf, 0x49, 0x99,\n                                                       0x7d, 0x6d, 0x1a, 0x6a, 0x73, 0x79, 0x72, 0x76,\n                                                       0x76, 0x97, 0xa6, 0x83, 0x1e, 0x2b, 0x53, 0x5,\n                                                       0x4e, 0xa8, 0xcd, 0x6e, 0xcc, 0x1b, 0xe3, 0xe0,\n                                                       0xc3, 0xf7, 0x0, 0xc0, 0x76, 0xb5, 0x4a, 0xcd,\n                                                       0x1f, 0x57, 0xc0, 0x75, 0x9c, 0xa3, 0x1a, 0x9c,\n                                                       0x97, 0x9f, 0xa1, 0xb4, 0x1e, 0xf7, 0x2, 0xc6,\n                                                       0x7a, 0xf7, 0x1e, 0xfb, 0x67, 0x1b, 0xfb, 0x59,\n                                                       0x79, 0xfb, 0x3d, 0x29, 0x1f, 0xe, 0x39, 0xa,\n                                                       0xc4, 0xf7, 0x29, 0x51, 0xa, 0xf7, 0x9b, 0xf8,\n                                                       0xed, 0x15, 0xe4, 0x6, 0x45, 0xf7, 0x29, 0x96,\n                                                       0xa, 0xf7, 0x89, 0x22, 0xa, 0x39, 0xa, 0xc5,\n                                                       0xf7, 0x28, 0x51, 0xa, 0xf7, 0x5b, 0xf8, 0xee,\n                                                       0x15, 0xe4, 0x6, 0xf7, 0x1e, 0xf7, 0x28, 0x96,\n                                                       0xa, 0xf0, 0x22, 0xa, 0x39, 0xa, 0xc6, 0xf7,\n                                                       0x27, 0x51, 0xa, 0xf5, 0xf8, 0xef, 0x15, 0xf7,\n                                                       0x6, 0x6, 0xc1, 0xd4, 0xc5, 0x42, 0x5, 0xf7,\n                                                       0x5, 0x6, 0x24, 0xf7, 0x27, 0x5, 0xfb, 0x17,\n                                                       0x6, 0xf7, 0x33, 0x22, 0xa, 0x39, 0xa, 0xcd,\n                                                       0xf7, 0x13, 0x37, 0xdf, 0x8a, 0x77, 0x66, 0xa,\n                                                       0x49, 0xcd, 0xf7, 0x52, 0xf7, 0x1d, 0x13, 0xa9,\n                                                       0x80, 0xf2, 0xf8, 0xf4, 0x15, 0xca, 0x6, 0x98,\n                                                       0x8c, 0x8b, 0xab, 0xad, 0x1b, 0xb0, 0xa4, 0x7e,\n                                                       0x80, 0xa3, 0x1f, 0x13, 0xb2, 0x80, 0x82, 0xa1,\n                                                       0xa0, 0x81, 0xa9, 0x1b, 0xe3, 0x8b, 0xf0, 0xa5,\n                                                       0x1f, 0x4b, 0x6, 0x7d, 0x88, 0x87, 0x6d, 0x69,\n                                                       0x1b, 0x80, 0x78, 0x94, 0x95, 0x73, 0x1f, 0x13,\n                                                       0x65, 0x80, 0x97, 0x70, 0x68, 0x97, 0x6a, 0x1b,\n                                                       0x48, 0x70, 0x5a, 0x3c, 0x8e, 0x1f, 0xf7, 0x9f,\n                                                       0xfc, 0xbb, 0x21, 0xa, 0x13, 0xb2, 0x80, 0x32,\n                                                       0xa, 0x39, 0xa, 0xce, 0xf7, 0xa, 0x66, 0xa,\n                                                       0x4d, 0xf7, 0xd, 0xea, 0xf7, 0xd, 0x36, 0xf7,\n                                                       0x1d, 0x13, 0x76, 0xf6, 0xf8, 0xf7, 0x8a, 0xa,\n                                                       0xf7, 0x6c, 0xfb, 0xa, 0x8a, 0xa, 0xba, 0xfd,\n                                                       0x34, 0x30, 0xa, 0x13, 0xb9, 0x20, 0xa, 0x32,\n                                                       0xa, 0x39, 0xa, 0xb1, 0xf7, 0x56, 0x56, 0x77,\n                                                       0x66, 0xa, 0x9e, 0xf7, 0x58, 0x72, 0xf7, 0x1d,\n                                                       0x13, 0xb6, 0xf7, 0x50, 0xf9, 0x3b, 0x15, 0x56,\n                                                       0xb7, 0x5f, 0xc1, 0xbf, 0xb9, 0xb5, 0xc2, 0xc3,\n                                                       0x5e, 0xb4, 0x56, 0x54, 0x60, 0x61, 0x54, 0x1e,\n                                                       0xc0, 0x16, 0x13, 0x6d, 0xa4, 0x9f, 0x9e, 0xa4,\n                                                       0xa3, 0x9f, 0x79, 0x71, 0x73, 0x77, 0x77, 0x73,\n                                                       0x73, 0x76, 0x9f, 0xa3, 0x1e, 0xf7, 0x15, 0xfd,\n                                                       0x2, 0x24, 0xa, 0x13, 0xb5, 0x26, 0xa, 0xf7,\n                                                       0x76, 0x7d, 0xf7, 0x0, 0xf7, 0x17, 0xe4, 0xf7,\n                                                       0x10, 0xf7, 0x0, 0x1, 0xa8, 0xf7, 0x22, 0xf7,\n                                                       0x50, 0xf7, 0x21, 0xf7, 0x6c, 0xf7, 0x22, 0x3,\n                                                       0xf8, 0x39, 0xc7, 0x15, 0x52, 0xc8, 0xca, 0x7a,\n                                                       0xc8, 0x1b, 0xf7, 0x47, 0xbf, 0xf7, 0xc, 0xb2,\n                                                       0x99, 0x1f, 0xfb, 0x1f, 0xa3, 0x5, 0x7a, 0x84,\n                                                       0x72, 0x51, 0x41, 0x1b, 0x2b, 0x84, 0xf2, 0xa7,\n                                                       0x88, 0x1f, 0xf7, 0xfa, 0x6, 0xf4, 0x77, 0xf7,\n                                                       0x6c, 0xfb, 0x7c, 0x4c, 0x5a, 0x78, 0x6c, 0x63,\n                                                       0x1e, 0x9a, 0x7b, 0x4f, 0xae, 0x21, 0x1b, 0xfb,\n                                                       0x2d, 0x61, 0x59, 0x26, 0x6a, 0x1f, 0xf7, 0x15,\n                                                       0x73, 0x5, 0x9d, 0x90, 0x9a, 0xbc, 0xda, 0x1b,\n                                                       0xe3, 0x8b, 0x53, 0x75, 0x1f, 0x7e, 0x7, 0x7a,\n                                                       0x85, 0x78, 0x89, 0x59, 0x7d, 0x8, 0x24, 0x6e,\n                                                       0xfb, 0x22, 0x88, 0xfb, 0x29, 0x1a, 0x43, 0xbb,\n                                                       0x35, 0xf7, 0x1a, 0xf0, 0xd9, 0xb9, 0xa7, 0xaa,\n                                                       0x1e, 0x4d, 0xf7, 0x57, 0x15, 0x42, 0x8b, 0x63,\n                                                       0x6c, 0x71, 0x1e, 0x56, 0x5f, 0x23, 0x93, 0xd7,\n                                                       0x1a, 0xb9, 0xb5, 0x99, 0xb8, 0x97, 0x1e, 0xf7,\n                                                       0x88, 0xe1, 0x15, 0x9b, 0x8a, 0x92, 0xf7, 0x0,\n                                                       0xed, 0x1b, 0xf0, 0x92, 0x2f, 0x6b, 0x8d, 0x1f,\n                                                       0xe, 0x20, 0xfb, 0x78, 0xc2, 0xe4, 0xf7, 0x40,\n                                                       0xfb, 0xa, 0xf7, 0xa, 0xf7, 0xec, 0xf7, 0x6,\n                                                       0x12, 0xad, 0xf7, 0x21, 0xf7, 0x23, 0xdd, 0x13,\n                                                       0xdc, 0xf7, 0x5a, 0x2f, 0x15, 0x92, 0xaa, 0x9c,\n                                                       0x8c, 0x92, 0x1b, 0xc4, 0x93, 0x6d, 0x7e, 0x5d,\n                                                       0x45, 0x8b, 0x6c, 0x6a, 0x79, 0x8e, 0x8c, 0x83,\n                                                       0x1f, 0x56, 0x7, 0x85, 0xb2, 0x9d, 0x8b, 0x8d,\n                                                       0x1b, 0xf7, 0x11, 0xc5, 0xc7, 0xb9, 0xc1, 0x5b,\n                                                       0xaa, 0x5f, 0x90, 0x1f, 0x13, 0xbc, 0x8d, 0x7,\n                                                       0xf7, 0x3f, 0x91, 0xaf, 0xf7, 0x2b, 0x94, 0xb5,\n                                                       0xfb, 0x1b, 0xa3, 0x18, 0x69, 0x85, 0x7e, 0x44,\n                                                       0x3a, 0x1b, 0x36, 0x6e, 0xcd, 0xf3, 0xad, 0x89,\n                                                       0xf7, 0x20, 0xf7, 0x5, 0xda, 0x99, 0x47, 0x78,\n                                                       0x8e, 0x1f, 0xf7, 0x1b, 0xa4, 0x5, 0xd4, 0x77,\n                                                       0x5e, 0xf2, 0xfb, 0x3a, 0x1b, 0xfb, 0x5e, 0x59,\n                                                       0xfb, 0x3b, 0xfb, 0xd, 0x3a, 0xa5, 0xfb, 0x56,\n                                                       0xf7, 0x5f, 0x7e, 0x1f, 0x89, 0x7, 0x7c, 0x8a,\n                                                       0x7e, 0x8a, 0x75, 0x85, 0x8, 0xe, 0x3c, 0xa,\n                                                       0xc8, 0xf7, 0x28, 0x43, 0xa, 0xf7, 0x9d, 0xf8,\n                                                       0xee, 0x15, 0xe6, 0x6, 0x44, 0xf7, 0x28, 0x5,\n                                                       0xfb, 0x33, 0x6, 0xb6, 0xfc, 0xa2, 0x25, 0xa,\n                                                       0x3c, 0xa, 0xc7, 0xf7, 0x29, 0x43, 0xa, 0xf7,\n                                                       0x5c, 0xf8, 0xed, 0x15, 0xe6, 0x6, 0xf7, 0x20,\n                                                       0xf7, 0x29, 0x5, 0xfb, 0x34, 0x6, 0x25, 0xfc,\n                                                       0xa2, 0x25, 0xa, 0x3c, 0xa, 0xc9, 0xf7, 0x27,\n                                                       0x43, 0xa, 0xf4, 0xf8, 0xef, 0x15, 0xf7, 0x8,\n                                                       0x6, 0xc3, 0xd4, 0xc6, 0x42, 0x5, 0xf7, 0x7,\n                                                       0x6, 0x21, 0xf7, 0x27, 0x5, 0xfb, 0x18, 0x6,\n                                                       0x5f, 0xfc, 0xa2, 0x25, 0xa, 0x3c, 0xa, 0xd1,\n                                                       0xf7, 0xa, 0x43, 0xa, 0xf5, 0xf8, 0xf7, 0x15,\n                                                       0xf7, 0x10, 0xf7, 0xa, 0xfb, 0x10, 0x6, 0xf7,\n                                                       0x71, 0xfb, 0xa, 0x15, 0xf7, 0xf, 0xf7, 0xa,\n                                                       0xfb, 0xf, 0x6, 0xfb, 0x32, 0xfc, 0x8d, 0x25,\n                                                       0xa, 0x62, 0xa, 0xf7, 0x23, 0xf8, 0xf2, 0x15,\n                                                       0xe1, 0x6, 0x20, 0xf7, 0x24, 0x5, 0xfb, 0x2c,\n                                                       0x6, 0xf5, 0xfd, 0x82, 0x15, 0x55, 0xa, 0xe,\n                                                       0x62, 0xa, 0xbc, 0xf8, 0xf1, 0x15, 0xe2, 0x6,\n                                                       0xf7, 0x41, 0xf7, 0x25, 0x5, 0xfb, 0x2c, 0x6,\n                                                       0x3a, 0xfd, 0x82, 0x15, 0x55, 0xa, 0xe, 0x4c,\n                                                       0xa, 0xf8, 0xf3, 0xf7, 0x23, 0x1, 0xd7, 0xf7,\n                                                       0x13, 0x3, 0xd7, 0x16, 0x55, 0xa, 0xfb, 0x5,\n                                                       0xe1, 0x95, 0xa, 0xd3, 0xc8, 0x43, 0x77, 0xa,\n                                                       0x67, 0xa, 0xfb, 0x1b, 0x6, 0xe, 0x4c, 0xa,\n                                                       0xf8, 0xfa, 0xf7, 0x7, 0x12, 0x76, 0xf7, 0x7,\n                                                       0x79, 0xf7, 0x13, 0x79, 0xf7, 0x7, 0x13, 0xe8,\n                                                       0x76, 0x44, 0xa, 0x13, 0xd0, 0xfb, 0x1, 0xfd,\n                                                       0x6d, 0x15, 0x55, 0xa, 0xe, 0x57, 0x7d, 0xf7,\n                                                       0x8, 0xf7, 0xd4, 0xf7, 0x3, 0xf7, 0x60, 0x77,\n                                                       0x1, 0xad, 0xf7, 0x26, 0xf7, 0x90, 0xf7, 0x26,\n                                                       0x3, 0xf7, 0x65, 0xf8, 0xc7, 0x15, 0xeb, 0xb8,\n                                                       0xb0, 0x5b, 0x95, 0x7b, 0xa4, 0x60, 0x19, 0x89,\n                                                       0x89, 0x5, 0x9b, 0x70, 0x6b, 0x9d, 0x5a, 0x1b,\n                                                       0xfb, 0x1, 0xfb, 0x10, 0x22, 0xfb, 0x3b, 0xfb,\n                                                       0x26, 0xec, 0xfb, 0x15, 0xf7, 0x40, 0xf7, 0x31,\n                                                       0xf7, 0xa, 0xea, 0xf7, 0x48, 0xf7, 0x26, 0x3e,\n                                                       0xf7, 0x23, 0x26, 0xf2, 0x1f, 0xd2, 0xad, 0x75,\n                                                       0xbd, 0x30, 0x60, 0x75, 0x9d, 0x85, 0x8f, 0x72,\n                                                       0xa0, 0x19, 0xfb, 0x26, 0x6, 0xbe, 0x66, 0x9a,\n                                                       0x81, 0xb5, 0x63, 0x3a, 0x65, 0x18, 0x85, 0xfb,\n                                                       0xf3, 0x15, 0xf7, 0x4, 0xcc, 0xbc, 0xc5, 0xce,\n                                                       0xc9, 0x54, 0x21, 0x27, 0x52, 0x50, 0x44, 0x52,\n                                                       0x48, 0xb2, 0xf7, 0xc, 0x1e, 0xe, 0x57, 0xa0,\n                                                       0x76, 0xf8, 0xfa, 0x64, 0xa, 0xcc, 0xf7, 0x16,\n                                                       0x58, 0xc8, 0xf7, 0x5d, 0xf7, 0x20, 0x13, 0xca,\n                                                       0xcc, 0x16, 0x13, 0xc6, 0xf7, 0x20, 0xf7, 0x7f,\n                                                       0x6, 0xe2, 0x90, 0xf2, 0xf7, 0x3, 0xe0, 0x8b,\n                                                       0x22, 0x36, 0x1e, 0xfb, 0x7f, 0xf7, 0x20, 0xf7,\n                                                       0xd6, 0x7, 0xf7, 0x6, 0x3e, 0xe9, 0x28, 0x55,\n                                                       0x48, 0x79, 0x45, 0x57, 0x1e, 0x13, 0xca, 0x89,\n                                                       0xd7, 0xfb, 0x16, 0x6, 0x13, 0xa6, 0xda, 0xe9,\n                                                       0x15, 0xca, 0x65, 0xa, 0xaa, 0xad, 0x1b, 0xa9,\n                                                       0xa1, 0x82, 0x82, 0xa0, 0x1f, 0x13, 0xca, 0x80,\n                                                       0xa5, 0xa3, 0x7f, 0xae, 0x1b, 0xdf, 0x8f, 0xed,\n                                                       0xa4, 0x1f, 0x4b, 0x6, 0x7d, 0x88, 0x87, 0x6e,\n                                                       0x69, 0x1b, 0x13, 0x96, 0x80, 0x73, 0x96, 0x96,\n                                                       0x70, 0x1f, 0x95, 0x71, 0x6e, 0x95, 0x6c, 0x1b,\n                                                       0x49, 0x72, 0x6a, 0x30, 0x1f, 0xe, 0x3e, 0xa,\n                                                       0xd7, 0xf7, 0x25, 0x1, 0x56, 0xa, 0x3, 0xf7,\n                                                       0xb9, 0xf8, 0xf1, 0x15, 0xe4, 0x6, 0x46, 0xf7,\n                                                       0x25, 0x5, 0xfb, 0x30, 0x6, 0xfb, 0xf, 0xfc,\n                                                       0x7a, 0x23, 0xa, 0x47, 0xa, 0xf7, 0x77, 0xf8,\n                                                       0xf3, 0x15, 0xe2, 0x6, 0xf7, 0x1a, 0x75, 0xa,\n                                                       0xfb, 0x99, 0xfc, 0x7a, 0x23, 0xa, 0x47, 0xa,\n                                                       0xf7, 0x1e, 0xf8, 0xf3, 0x15, 0xf7, 0x5, 0x6,\n                                                       0xc0, 0xd2, 0xc5, 0x44, 0x5, 0xf7, 0x4, 0x6,\n                                                       0x25, 0x67, 0xa, 0xfb, 0x16, 0x6, 0xfb, 0x64,\n                                                       0xfc, 0x7a, 0x23, 0xa, 0x3e, 0xa, 0xe0, 0x64,\n                                                       0xa, 0x56, 0xa, 0x13, 0xd6, 0xf7, 0x1b, 0xf8,\n                                                       0xf8, 0x15, 0xca, 0x6a, 0xa, 0xa3, 0x1f, 0x13,\n                                                       0xe6, 0x80, 0xa4, 0xa3, 0x80, 0xaa, 0x1b, 0xe2,\n                                                       0x8b, 0xed, 0xa4, 0x1f, 0x4b, 0x7a, 0xa, 0x6e,\n                                                       0x69, 0x1b, 0x13, 0xce, 0x7f, 0x75, 0x96, 0x96,\n                                                       0x71, 0x1f, 0x95, 0x71, 0x6d, 0x95, 0x6b, 0x1b,\n                                                       0x49, 0x73, 0x5a, 0x40, 0x1f, 0x26, 0xfb, 0xf0,\n                                                       0x23, 0xa, 0x3e, 0xa, 0xe0, 0xf7, 0x7, 0x12,\n                                                       0xad, 0xf7, 0x23, 0x65, 0xf7, 0xc, 0xe9, 0xf7,\n                                                       0xc, 0x65, 0xf7, 0x23, 0x13, 0xec, 0xf7, 0x1f,\n                                                       0xf8, 0xfa, 0x4a, 0xa, 0xf7, 0x6a, 0xfb, 0x7,\n                                                       0x4a, 0xa, 0x13, 0xf2, 0xfb, 0xd3, 0xfc, 0x65,\n                                                       0x23, 0xa, 0x3c, 0x61, 0xf7, 0x1f, 0xe9, 0xf7,\n                                                       0x13, 0xe9, 0xf7, 0x1c, 0x1, 0xf7, 0x73, 0xf7,\n                                                       0x1e, 0x3, 0xb3, 0xf7, 0x53, 0x15, 0xf8, 0x8c,\n                                                       0xf7, 0x13, 0xfc, 0x8c, 0x6, 0xf7, 0x4b, 0xe9,\n                                                       0x15, 0xf7, 0x1e, 0xf7, 0x1c, 0xfb, 0x1e, 0x6,\n                                                       0xfc, 0xe2, 0x4, 0xf7, 0x1e, 0xf7, 0x1f, 0x81,\n                                                       0xa, 0x57, 0x83, 0x76, 0xa3, 0xf7, 0x6, 0xf7,\n                                                       0xd5, 0xf7, 0x6, 0x9b, 0x77, 0x12, 0xb2, 0xf7,\n                                                       0x26, 0xf7, 0x89, 0xf7, 0x24, 0x13, 0xdc, 0xab,\n                                                       0x9e, 0x15, 0xc4, 0x5b, 0xc4, 0xcb, 0x5, 0x71,\n                                                       0xbb, 0xc8, 0x7d, 0xbd, 0x1b, 0xf7, 0x41, 0xf7,\n                                                       0x3, 0xf7, 0x13, 0xf7, 0x28, 0xd4, 0x6d, 0xd0,\n                                                       0x68, 0xb4, 0x1f, 0xc5, 0xc9, 0x50, 0xb8, 0x54,\n                                                       0x4f, 0x5, 0x13, 0xec, 0x95, 0x7a, 0x55, 0xad,\n                                                       0x2f, 0x1b, 0xfb, 0x47, 0x23, 0xfb, 0x15, 0xfb,\n                                                       0x25, 0x41, 0x9e, 0x4e, 0xbc, 0x56, 0x1f, 0xeb,\n                                                       0xf7, 0x0, 0x15, 0x7b, 0xb1, 0x89, 0xac, 0x94,\n                                                       0x1a, 0xf7, 0x7, 0xd2, 0xb8, 0xcd, 0xb6, 0xa2,\n                                                       0x7c, 0x82, 0x96, 0x1e, 0xfb, 0x29, 0xfb, 0xa7,\n                                                       0x15, 0xf7, 0x56, 0xf7, 0x69, 0x5, 0x91, 0x7b,\n                                                       0x97, 0x6c, 0x70, 0x1a, 0x37, 0x5d, 0x3e, 0x2d,\n                                                       0x60, 0x7b, 0x99, 0x93, 0x7e, 0x1e, 0xe, 0x4e,\n                                                       0xa, 0xf8, 0x34, 0x89, 0x2a, 0xa, 0x13, 0x78,\n                                                       0xfb, 0xf, 0xf8, 0xa4, 0x15, 0xe3, 0x6, 0x46,\n                                                       0xf7, 0x25, 0x97, 0xa, 0xe, 0x4e, 0xa, 0xf7,\n                                                       0x7a, 0xf8, 0xf1, 0x15, 0xe3, 0x6, 0xf7, 0x1c,\n                                                       0xf7, 0x25, 0x97, 0xa, 0xf7, 0x9, 0xfd, 0x84,\n                                                       0x2a, 0xa, 0xe, 0x6c, 0xa, 0xf8, 0x97, 0xf7,\n                                                       0x23, 0x49, 0xa, 0x13, 0x78, 0xf7, 0x1d, 0xf8,\n                                                       0xf3, 0x15, 0xf7, 0x5, 0x6, 0xc1, 0xd2, 0xc5,\n                                                       0x44, 0x5, 0xf7, 0x4, 0x6, 0x24, 0x67, 0xa,\n                                                       0xfb, 0x15, 0x6, 0xf7, 0x42, 0xfd, 0x84, 0x2a,\n                                                       0xa, 0xe, 0x6c, 0xa, 0xf8, 0x9e, 0xf7, 0x7,\n                                                       0x12, 0xcd, 0xf7, 0x1f, 0x48, 0xf7, 0xc, 0xea,\n                                                       0xf7, 0xc, 0x48, 0xf7, 0x1f, 0x13, 0x6c, 0xf7,\n                                                       0x1e, 0xf8, 0xfa, 0x4a, 0xa, 0xf7, 0x6b, 0xfb,\n                                                       0x7, 0x4a, 0xa, 0xca, 0xfd, 0x6f, 0x15, 0x13,\n                                                       0x72, 0x2c, 0xa, 0x13, 0xac, 0x36, 0xa, 0xe,\n                                                       0x20, 0xfb, 0x55, 0x76, 0xf9, 0xc8, 0xf7, 0x24,\n                                                       0x1, 0xb6, 0x28, 0x15, 0x97, 0x20, 0x52, 0xa,\n                                                       0xf5, 0xf7, 0xf, 0xc8, 0x1f, 0xf7, 0x4a, 0xf8,\n                                                       0x89, 0x78, 0xa, 0xfc, 0x5, 0x6e, 0xa, 0xfb,\n                                                       0xe, 0xf8, 0x5, 0x40, 0xa, 0xf7, 0x58, 0xfc,\n                                                       0x9d, 0x5, 0x2b, 0x48, 0xa, 0xf7, 0x35, 0xf9,\n                                                       0x55, 0x15, 0xe1, 0x6, 0xf7, 0x19, 0xf7, 0x24,\n                                                       0x5, 0xfb, 0x2c, 0x6, 0xe, 0x57, 0xfb, 0x4f,\n                                                       0x76, 0xf7, 0x50, 0xf7, 0x3, 0xf7, 0xe2, 0xf6,\n                                                       0xf7, 0x4e, 0x77, 0x1, 0xc9, 0xf7, 0x20, 0xf7,\n                                                       0x7c, 0xf7, 0x24, 0x3, 0xf7, 0x5e, 0xc5, 0x15,\n                                                       0x6c, 0xa7, 0xb8, 0x5c, 0xdd, 0x1b, 0xf7, 0x10,\n                                                       0xec, 0xef, 0xf7, 0x43, 0xf7, 0x49, 0x21, 0xeb,\n                                                       0xfb, 0x7, 0x39, 0x64, 0x64, 0x69, 0x69, 0x1f,\n                                                       0xf7, 0x97, 0xfb, 0x20, 0xfe, 0x32, 0xf7, 0x20,\n                                                       0x7, 0x8a, 0xf8, 0x63, 0x15, 0xf6, 0xbf, 0xca,\n                                                       0xcc, 0xf2, 0x98, 0xfb, 0x3, 0x50, 0xfb, 0x16,\n                                                       0x4c, 0x69, 0x5b, 0x36, 0x66, 0xd1, 0xe9, 0x1e,\n                                                       0xe, 0x20, 0xfb, 0x55, 0x76, 0xf9, 0xcf, 0xf7,\n                                                       0x8, 0x1, 0xf7, 0x6, 0xf7, 0x9, 0xe8, 0xf7,\n                                                       0x9, 0x3, 0xf7, 0x6, 0xf8, 0xf9, 0x88, 0xa,\n                                                       0xf7, 0x66, 0xfb, 0x8, 0x88, 0xa, 0xfb, 0xad,\n                                                       0xfd, 0xcf, 0x15, 0x97, 0xfb, 0x0, 0x52, 0xa,\n                                                       0xf6, 0xf7, 0x10, 0xc8, 0x1f, 0xf7, 0x4a, 0xf8,\n                                                       0x8d, 0x78, 0xa, 0xfc, 0x8, 0x6e, 0xa, 0xfb,\n                                                       0xe, 0xf8, 0x8, 0x40, 0xa, 0xf7, 0x58, 0xfc,\n                                                       0xa1, 0x5, 0x2a, 0x48, 0xa, 0xe, 0x76, 0xa0,\n                                                       0xf8, 0x9f, 0x9a, 0xf7, 0x48, 0x9e, 0x6, 0xfb,\n                                                       0x70, 0x98, 0x7, 0x1e, 0xa0, 0x39, 0x63, 0xff,\n                                                       0xc, 0x9, 0xf7, 0x11, 0xa, 0xf7, 0x20, 0xb,\n                                                       0xf7, 0x0, 0x9c, 0xc, 0xc, 0x8c, 0xc, 0xe,\n                                                       0xf7, 0xe1, 0x14, 0xf9, 0x2b, 0x15, 0xb5, 0x13,\n                                                       0x0, 0x79, 0x2, 0x0, 0x1, 0x0, 0x23, 0x0,\n                                                       0x28, 0x0, 0x30, 0x0, 0x65, 0x0, 0x6a, 0x0,\n                                                       0xaa, 0x0, 0xca, 0x0, 0xed, 0x0, 0xf1, 0x1,\n                                                       0x19, 0x1, 0x21, 0x1, 0x3e, 0x1, 0x5b, 0x1,\n                                                       0x69, 0x1, 0x81, 0x1, 0x87, 0x1, 0x93, 0x1,\n                                                       0xc7, 0x1, 0xcb, 0x1, 0xda, 0x1, 0xe3, 0x1,\n                                                       0xed, 0x1, 0xfc, 0x2, 0x5, 0x2, 0xe, 0x2,\n                                                       0x18, 0x2, 0x25, 0x2, 0x2e, 0x2, 0x39, 0x2,\n                                                       0x44, 0x2, 0x4d, 0x2, 0x52, 0x2, 0x57, 0x2,\n                                                       0x60, 0x2, 0x6a, 0x2, 0x74, 0x2, 0x7f, 0x2,\n                                                       0x86, 0x2, 0x8f, 0x2, 0x99, 0x2, 0xa5, 0x2,\n                                                       0xae, 0x2, 0xb7, 0x2, 0xc0, 0x2, 0xc5, 0x2,\n                                                       0xca, 0x2, 0xd5, 0x2, 0xe8, 0x2, 0xfb, 0x3,\n                                                       0x4, 0x3, 0xf, 0x3, 0x21, 0x3, 0x2c, 0x3,\n                                                       0x34, 0x3, 0x3c, 0x3, 0x4d, 0x3, 0x5e, 0x3,\n                                                       0x65, 0x3, 0x75, 0x3, 0x85, 0x3, 0x94, 0x3,\n                                                       0x9b, 0x3, 0xa2, 0x3, 0xa8, 0x3, 0xb6, 0x3,\n                                                       0xbf, 0x3, 0xca, 0x3, 0xd1, 0x3, 0xd9, 0x3,\n                                                       0xde, 0x3, 0xe3, 0x3, 0xe7, 0x3, 0xeb, 0x3,\n                                                       0xef, 0x3, 0xf9, 0x4, 0x4, 0x4, 0xa, 0x4,\n                                                       0xd, 0x4, 0x11, 0x4, 0x1c, 0x4, 0x27, 0x4,\n                                                       0x32, 0x4, 0x3d, 0x4, 0x44, 0x4, 0x4b, 0x4,\n                                                       0x51, 0x4, 0x58, 0x4, 0x5f, 0x4, 0x66, 0x4,\n                                                       0x6b, 0x4, 0x70, 0x4, 0x74, 0x4, 0x78, 0x4,\n                                                       0x7c, 0x4, 0x85, 0x4, 0x8f, 0x4, 0x97, 0x4,\n                                                       0x9b, 0x4, 0x9f, 0x4, 0xa3, 0x4, 0xa7, 0x4,\n                                                       0xab, 0x4, 0xb4, 0x4, 0xbd, 0x4, 0xc6, 0x4,\n                                                       0xcf, 0x4, 0xd8, 0x4, 0xe1, 0x4, 0xea, 0x4,\n                                                       0xf3, 0x4, 0xfc, 0x5, 0x5, 0x5, 0xe, 0x5,\n                                                       0x17, 0x5, 0x20, 0x5, 0x27, 0x5, 0x2c, 0x5,\n                                                       0x32, 0x5, 0x37, 0x5, 0x3c, 0x5, 0x41, 0x77,\n                                                       0xb8, 0x83, 0xa2, 0x38, 0xa, 0xac, 0x1a, 0xeb,\n                                                       0x80, 0xf4, 0xfb, 0x73, 0xfb, 0x32, 0x65, 0x49,\n                                                       0x35, 0x73, 0x1e, 0xf7, 0x13, 0x74, 0x5, 0xa5,\n                                                       0x2d, 0xa, 0x80, 0x6e, 0x82, 0x3c, 0x7d, 0x8,\n                                                       0xb, 0x30, 0xa, 0x20, 0xa, 0xb, 0xfd, 0x49,\n                                                       0x24, 0xa, 0x13, 0xbc, 0x26, 0xa, 0x15, 0xfb,\n                                                       0x84, 0xf7, 0x50, 0x65, 0xde, 0xf7, 0x3e, 0xf2,\n                                                       0xf7, 0x1b, 0xf7, 0x23, 0xf7, 0x18, 0x32, 0xf7,\n                                                       0x19, 0xfb, 0x4c, 0xfb, 0x4f, 0x37, 0xfb, 0x21,\n                                                       0xfb, 0x10, 0x1e, 0xf7, 0x23, 0x16, 0xf7, 0x2,\n                                                       0xc8, 0xb6, 0xce, 0xd3, 0xc5, 0x5b, 0x22, 0xfb,\n                                                       0x7, 0x49, 0x58, 0x4b, 0x49, 0x4d, 0xc3, 0xf7,\n                                                       0x2, 0x1e, 0xe, 0x21, 0xa, 0x3b, 0xa, 0xb,\n                                                       0x15, 0xf7, 0xfb, 0x6, 0xf7, 0x34, 0x5a, 0xf7,\n                                                       0x31, 0xfb, 0x60, 0xfb, 0x3f, 0x3a, 0xfb, 0x1d,\n                                                       0xfb, 0x23, 0xfb, 0x42, 0xf7, 0x20, 0x26, 0xf7,\n                                                       0xe, 0xf7, 0x47, 0xb8, 0xf7, 0x11, 0xac, 0x97,\n                                                       0x1e, 0xfb, 0x23, 0xa2, 0x5, 0x73, 0x83, 0x79,\n                                                       0x5a, 0x48, 0x1b, 0x3a, 0x6a, 0xcd, 0xcb, 0x89,\n                                                       0x1f, 0x8e, 0xe1, 0x15, 0xd1, 0x8a, 0xb0, 0xc1,\n                                                       0xce, 0x1b, 0xda, 0xab, 0x55, 0x45, 0x1f, 0xe,\n                                                       0x2e, 0xd1, 0x45, 0x37, 0xa, 0xf7, 0x59, 0x15,\n                                                       0x70, 0x7, 0x3d, 0x72, 0x4c, 0x34, 0x55, 0x73,\n                                                       0xac, 0xa9, 0xbc, 0xc4, 0xa4, 0xa4, 0x90, 0x1e,\n                                                       0xa9, 0x92, 0xc8, 0x95, 0x9c, 0x94, 0x8, 0xe,\n                                                       0xf7, 0x26, 0x6, 0xc3, 0xf7, 0x3b, 0x5, 0xf7,\n                                                       0xa3, 0x6, 0xc6, 0xfb, 0x3b, 0x5, 0xf7, 0x2a,\n                                                       0x6, 0xfb, 0xa4, 0xf9, 0x74, 0x40, 0xa, 0x76,\n                                                       0xfc, 0x51, 0x15, 0xe7, 0xf7, 0xa5, 0xe9, 0xfb,\n                                                       0xa5, 0x5, 0xb, 0x15, 0x27, 0xa, 0xe, 0x15,\n                                                       0xfb, 0x3a, 0xd8, 0xfb, 0x61, 0xf7, 0xa0, 0xf7,\n                                                       0x8d, 0xeb, 0xf7, 0x4b, 0xf7, 0x50, 0xf7, 0x65,\n                                                       0x3d, 0xa, 0xfb, 0x22, 0xfb, 0x79, 0x1e, 0xf7,\n                                                       0x28, 0x16, 0xf4, 0xac, 0xf7, 0x21, 0xf7, 0x38,\n                                                       0xf7, 0x43, 0xa1, 0xfb, 0x39, 0x3a, 0xb, 0x15,\n                                                       0x2c, 0xa, 0x13, 0xb8, 0x36, 0xa, 0xb, 0xf7,\n                                                       0x3, 0xf7, 0x80, 0x1e, 0xf8, 0x16, 0xfb, 0x26,\n                                                       0xfc, 0x16, 0x7, 0xfb, 0xf, 0x8b, 0x28, 0xfb,\n                                                       0x20, 0xfb, 0x1a, 0x7e, 0xe4, 0xf7, 0x19, 0x1e,\n                                                       0xf8, 0x16, 0x7, 0xb, 0xf7, 0x15, 0xf8, 0x9e,\n                                                       0xfb, 0x1f, 0xfb, 0x67, 0x6, 0xfb, 0x15, 0x8d,\n                                                       0x33, 0xfb, 0x7, 0x2a, 0x94, 0xe1, 0xf7, 0x17,\n                                                       0x1e, 0xf7, 0x67, 0xfb, 0x1f, 0xfb, 0xdd, 0x7,\n                                                       0xb, 0x95, 0x99, 0xb4, 0xd0, 0x1b, 0xeb, 0x8b,\n                                                       0x5d, 0x68, 0x1f, 0x82, 0x7, 0x6f, 0xb, 0xf8,\n                                                       0xb5, 0xf7, 0x11, 0xfc, 0x25, 0xf7, 0x5c, 0xf7,\n                                                       0xfd, 0xf7, 0x11, 0xfb, 0xfd, 0xf7, 0x39, 0xf8,\n                                                       0x18, 0xf7, 0x11, 0xfc, 0xa8, 0x6, 0xb, 0xf7,\n                                                       0x79, 0xc4, 0x2b, 0xa, 0xe, 0x15, 0x98, 0x5f,\n                                                       0x8e, 0x84, 0x8e, 0x83, 0x8, 0xf7, 0x1e, 0x6,\n                                                       0xb, 0xfc, 0xdc, 0x15, 0xfb, 0x39, 0xd8, 0xfb,\n                                                       0x62, 0xf7, 0xa0, 0xf7, 0x8d, 0xeb, 0xf7, 0x4c,\n                                                       0xf7, 0x4f, 0xf7, 0x66, 0xfb, 0x5, 0xf7, 0x35,\n                                                       0xfb, 0x7c, 0xfb, 0x72, 0xfb, 0xf, 0xfb, 0x21,\n                                                       0xfb, 0x7a, 0x1e, 0xf7, 0x28, 0x16, 0xf4, 0xac,\n                                                       0xf7, 0x22, 0xf7, 0x38, 0xf7, 0x43, 0xa1, 0xfb,\n                                                       0x3a, 0x3a, 0xfb, 0x14, 0xb, 0x3b, 0xa, 0x26,\n                                                       0xa, 0x3a, 0xa, 0xbb, 0xf7, 0x28, 0x1, 0xd7,\n                                                       0xf7, 0x24, 0x3, 0xd7, 0x16, 0x2e, 0xa, 0xb,\n                                                       0x5e, 0xa, 0xa4, 0xfb, 0x48, 0xf7, 0xa0, 0x2f,\n                                                       0xa, 0x69, 0xa, 0xf7, 0x3b, 0xf7, 0x10, 0xf8,\n                                                       0x51, 0x77, 0xb, 0xfb, 0x8, 0xba, 0x32, 0xf7,\n                                                       0x14, 0xcf, 0xce, 0xac, 0xc5, 0xb1, 0x1e, 0x8d,\n                                                       0x6, 0xb, 0xf5, 0xe1, 0xbf, 0xb6, 0xa7, 0xa6,\n                                                       0x1e, 0x80, 0xb, 0x88, 0xd1, 0x8, 0x8a, 0xa9,\n                                                       0x8d, 0xf7, 0x24, 0xb, 0x20, 0x7d, 0xef, 0x48,\n                                                       0x76, 0xf8, 0x4a, 0xf7, 0x0, 0xb, 0x8f, 0x8b,\n                                                       0xf7, 0x11, 0xf7, 0x5c, 0xf7, 0x11, 0xf7, 0x39,\n                                                       0xf7, 0x11, 0xb, 0x41, 0x7d, 0xfb, 0xc, 0x78,\n                                                       0xfb, 0x16, 0x1a, 0xb, 0x20, 0x7d, 0xf7, 0x0,\n                                                       0xf7, 0x16, 0xe1, 0xf7, 0x10, 0xf6, 0xb, 0xfb,\n                                                       0x5, 0xf7, 0x36, 0xfb, 0x7c, 0xfb, 0x72, 0xfb,\n                                                       0xf, 0xb, 0x57, 0x7d, 0xf7, 0x4, 0xf7, 0xd3,\n                                                       0xf7, 0x4, 0xb, 0xa0, 0x76, 0x4d, 0xa, 0xb,\n                                                       0x5, 0xfb, 0x25, 0x6, 0xb, 0xfb, 0x2c, 0x5e,\n                                                       0xf7, 0x5, 0xf7, 0x1a, 0x1e, 0xe, 0x1, 0xd3,\n                                                       0xf7, 0x26, 0xf7, 0xb3, 0xf7, 0x26, 0x3, 0xb,\n                                                       0x1, 0xa2, 0xf7, 0x29, 0xf7, 0x6a, 0xf7, 0x22,\n                                                       0x3, 0xb, 0xf8, 0xfa, 0x4b, 0xa, 0xf7, 0x62,\n                                                       0xfb, 0x7, 0x4b, 0xa, 0xb, 0xb4, 0x8b, 0xde,\n                                                       0xc5, 0x1a, 0xe6, 0xb, 0xfe, 0x3c, 0x15, 0xf7,\n                                                       0x20, 0xf9, 0x60, 0x6d, 0xa, 0x3e, 0xa, 0xd9,\n                                                       0xf7, 0x23, 0x1, 0x56, 0xa, 0x3, 0xb, 0x70,\n                                                       0x5b, 0x87, 0x6c, 0x1b, 0x76, 0x7f, 0x8c, 0x90,\n                                                       0x73, 0x1f, 0xb, 0x12, 0xcd, 0xf7, 0x1f, 0xf7,\n                                                       0x5d, 0xf7, 0x1f, 0xb, 0x15, 0xf7, 0xc, 0xf7,\n                                                       0x7, 0xfb, 0xc, 0x6, 0xb, 0x15, 0xf7, 0x7,\n                                                       0xf7, 0x7, 0xfb, 0x7, 0x6, 0xb, 0xfc, 0x15,\n                                                       0xa0, 0x76, 0xb, 0xf9, 0x62, 0x77, 0x1, 0xb,\n                                                       0x6c, 0xa, 0xf8, 0x95, 0xf7, 0x25, 0x49, 0xa,\n                                                       0x13, 0x78, 0xb, 0x5, 0xfb, 0x32, 0x6, 0xfb,\n                                                       0x33, 0xfb, 0xae, 0xfb, 0x34, 0xf7, 0xae, 0x5,\n                                                       0xfb, 0x35, 0x6, 0xf7, 0x8e, 0xb, 0x15, 0xe3,\n                                                       0x6, 0xf7, 0x11, 0xf7, 0x5f, 0xfb, 0x11, 0xf7,\n                                                       0x61, 0x5, 0x33, 0x6, 0xf2, 0xfb, 0x61, 0x5,\n                                                       0xb, 0x66, 0xa, 0xf7, 0x52, 0xf7, 0x1d, 0x13,\n                                                       0x7c, 0xb, 0x5, 0x87, 0x9e, 0x82, 0x87, 0xae,\n                                                       0x1b, 0xf7, 0x41, 0xa2, 0xb, 0x15, 0xe3, 0x6,\n                                                       0x24, 0xf7, 0x64, 0xf2, 0xf7, 0x5c, 0x5, 0x33,\n                                                       0x6, 0xfb, 0x11, 0xfb, 0x5c, 0x5, 0xb, 0xc6,\n                                                       0x78, 0xf7, 0x11, 0xf9, 0x42, 0xf7, 0x24, 0x42,\n                                                       0xa, 0xb, 0xf7, 0x13, 0xf8, 0x9d, 0xfb, 0x13,\n                                                       0x6, 0xb, 0xad, 0xf7, 0x23, 0xf7, 0x96, 0xf7,\n                                                       0x23, 0xb, 0xf7, 0x66, 0xf7, 0x3d, 0xf7, 0x3d,\n                                                       0xf7, 0x65, 0xf7, 0x65, 0xfb, 0x3d, 0xf7, 0x3d,\n                                                       0xfb, 0x66, 0xb, 0xf7, 0x3c, 0xf7, 0x1c, 0xfb,\n                                                       0x1b, 0xfb, 0x3c, 0xfb, 0x3c, 0xfb, 0x1c, 0xfb,\n                                                       0x1b, 0xfb, 0x3c, 0xb, 0x5f, 0xa, 0xf8, 0x81,\n                                                       0xf7, 0x11, 0xb, 0x57, 0xfb, 0x4e, 0x76, 0xf7,\n                                                       0x54, 0xf7, 0x0, 0xf7, 0xe8, 0xf7, 0x5, 0x7f,\n                                                       0x77, 0x12, 0xb, 0xfb, 0xa6, 0xfb, 0x58, 0xf7,\n                                                       0x7, 0xf7, 0xb2, 0xf7, 0x8, 0xf7, 0xb2, 0xf7,\n                                                       0x7, 0x1, 0xb, 0x77, 0x1, 0xd0, 0xf7, 0x1e,\n                                                       0xf7, 0xc9, 0xf7, 0x1e, 0x3, 0xd0, 0x16, 0xf7,\n                                                       0x1e, 0xb, 0xec, 0x76, 0xf8, 0x2c, 0x77, 0x1,\n                                                       0xb, 0x15, 0xfc, 0x16, 0x7, 0xfb, 0x3b, 0xb,\n                                                       0xf7, 0x7, 0x78, 0xf7, 0x10, 0xb, 0x1, 0xd7,\n                                                       0xf7, 0x25, 0xf7, 0x94, 0xf7, 0x2a, 0x3, 0xd7,\n                                                       0x16, 0xf7, 0x25, 0xb, 0x45, 0xa, 0x7, 0x13,\n                                                       0xe8, 0xfb, 0x1a, 0x6, 0xb, 0x4c, 0xa, 0xf9,\n                                                       0x82, 0x77, 0x1, 0xd7, 0xf7, 0x13, 0x3, 0xb,\n                                                       0x7d, 0xa, 0xd0, 0x16, 0xf7, 0x20, 0xb, 0xf7,\n                                                       0xf, 0x39, 0xdd, 0x8a, 0x77, 0x12, 0xb, 0x6,\n                                                       0x97, 0x8c, 0x8b, 0xb, 0x12, 0xa8, 0xf7, 0x20,\n                                                       0xb, 0xf7, 0x23, 0x5, 0xb, 0xfb, 0x20, 0x6,\n                                                       0xb, 0xc6, 0xa0, 0x76, 0xb, 0x65, 0xa, 0xaa,\n                                                       0xac, 0x1b, 0xaa, 0xa2, 0x82, 0x81, 0xb, 0x15,\n                                                       0xe9, 0x6, 0xf7, 0x45, 0x83, 0xa, 0xfb, 0x39,\n                                                       0x6, 0xb, 0x57, 0x7d, 0xf5, 0x2d, 0xe9, 0xb,\n                                                       0x68, 0xa, 0xe, 0x5, 0x89, 0x6, 0xb, 0x75,\n                                                       0xfb, 0x1, 0x26, 0x1f, 0x3e, 0xfb, 0x1, 0xd8,\n                                                       0x6, 0xb, 0xf7, 0x9d, 0x16, 0xf7, 0x1d, 0xf7,\n                                                       0xc0, 0x6, 0xf7, 0x8f, 0xb, 0xfb, 0x10, 0x7a,\n                                                       0xfb, 0x3, 0x52, 0x1e, 0xeb, 0x16, 0xcc, 0xb,\n                                                       0xa7, 0xf7, 0x55, 0x84, 0xda, 0x1b, 0xf7, 0xd,\n                                                       0xf7, 0x3d, 0xb, 0xa0, 0x76, 0xf8, 0xa8, 0x77,\n                                                       0x1, 0xb, 0xf7, 0x44, 0xf7, 0x7, 0xfb, 0x44,\n                                                       0xb, 0x67, 0xa, 0xfb, 0x2d, 0x6, 0xb, 0xa0,\n                                                       0x76, 0xf8, 0x2c, 0xf7, 0x1, 0xb, 0x5, 0xf7,\n                                                       0x9, 0x6, 0xfb, 0x0, 0xb, 0x5, 0xfb, 0x21,\n                                                       0x6, 0xfb, 0xb, 0xb, 0x20, 0x78, 0xf7, 0x6,\n                                                       0xb, 0x6, 0x7d, 0x89, 0x87, 0xb, 0x82, 0xa,\n                                                       0xd7, 0xb, 0xfb, 0x4, 0x6, 0xb, 0xf7, 0x20,\n                                                       0x3, 0xb, 0x1, 0xcb, 0xf7, 0x28, 0xf7, 0xfc,\n                                                       0x85, 0xa, 0xb, 0xfb, 0x58, 0xf7, 0x0, 0xf9,\n                                                       0x52, 0xf7, 0x0, 0x1, 0xb, 0xfb, 0x3e, 0xfb,\n                                                       0x3d, 0xfb, 0x65, 0x1e, 0xe, 0xfb, 0x1e, 0x6,\n                                                       0xe, 0xf7, 0xd, 0x1, 0xb, 0xf7, 0x26, 0x5,\n                                                       0xb, 0xf7, 0x26, 0x1, 0xb, 0xf7, 0x28, 0x3,\n                                                       0xb, 0x57, 0x8b, 0xf7, 0xe, 0xf8, 0xe8, 0x77,\n                                                       0x1, 0xb, 0xfc, 0x1d, 0x6, 0xf8, 0xf, 0xf8,\n                                                       0x76, 0x5, 0xb, 0x15, 0xf7, 0x9, 0xf7, 0x8,\n                                                       0xfb, 0x9, 0x6, 0xb, 0xb8, 0x6c, 0x1f, 0x7c,\n                                                       0xa2, 0x81, 0xa6, 0x84, 0xb, 0x15, 0xf7, 0xd,\n                                                       0xf7, 0xa, 0xfb, 0xd, 0x6, 0xb, 0x15, 0xf7,\n                                                       0x5, 0xf7, 0x9, 0xfb, 0x5, 0x6, 0xb, 0xf7,\n                                                       0xd6, 0x7, 0xfb, 0xff, 0xfc, 0x65, 0x5, 0xb,\n                                                       0x15, 0xf7, 0xa, 0xf7, 0x9, 0xfb, 0xa, 0x6,\n                                                       0xb, 0x15, 0xf7, 0xa, 0xf7, 0xb, 0xfb, 0xa,\n                                                       0x6, 0xb, 0x15, 0xf7, 0xb, 0xf7, 0x9, 0xfb,\n                                                       0xb, 0x6, 0xb, 0x77, 0x1, 0xf7, 0x78, 0xf7,\n                                                       0x13, 0x3, 0xb3, 0xb, 0x3c, 0x98, 0x76, 0xf8,\n                                                       0x9e, 0x77, 0x1, 0xb1, 0xb, 0x15, 0xf7, 0x7,\n                                                       0xf7, 0x8, 0xfb, 0x7, 0x6, 0xb, 0xf9, 0x88,\n                                                       0x5, 0xfb, 0x13, 0x6, 0xe, 0x1, 0xd0, 0x7d,\n                                                       0xa, 0xb, 0x15, 0xf7, 0xa, 0x6, 0xc4, 0xb,\n                                                       0x5, 0xfb, 0x31, 0x6, 0xb, 0x5, 0xfb, 0x2f,\n                                                       0x6, 0xb, 0x89, 0x42, 0x5a, 0x7f, 0xb\n                                                      };\n"
  },
  {
    "path": "core/src/fxge/fontdata/chromefontdata/FoxitSansBoldItalic.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nconst unsigned char g_FoxitSansBoldItalicFontData [16418] = {0x1,\n                                                             0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x17,\n                                                             0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x61, 0x6e,\n                                                             0x73, 0x50, 0x53, 0x2d, 0x42, 0x6f, 0x6c, 0x64,\n                                                             0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x0, 0x1,\n                                                             0x1, 0x1, 0x27, 0xf8, 0x10, 0x0, 0xf8, 0x1c,\n                                                             0x1, 0xf8, 0x1d, 0x2, 0xf8, 0x1e, 0x3, 0xf8,\n                                                             0x14, 0x4, 0x7f, 0xc, 0x2, 0xfb, 0x42, 0xfb,\n                                                             0x78, 0xfa, 0xee, 0xfa, 0x56, 0x5, 0xf7, 0x3c,\n                                                             0xf, 0xf8, 0x9c, 0x11, 0xb1, 0x1c, 0x39, 0xfc,\n                                                             0x12, 0x0, 0x4, 0x1, 0x1, 0x5, 0x2f, 0x48,\n                                                             0x55, 0x45, 0x75, 0x72, 0x6f, 0x20, 0x20, 0x20,\n                                                             0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                             0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                             0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                             0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                             0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43,\n                                                             0x68, 0x72, 0x6f, 0x6d, 0x20, 0x53, 0x61, 0x6e,\n                                                             0x73, 0x20, 0x50, 0x53, 0x20, 0x42, 0x6f, 0x6c,\n                                                             0x64, 0x20, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63,\n                                                             0x43, 0x68, 0x72, 0x6F, 0x6D, 0x20, 0x53, 0x61,\n                                                             0x6e, 0x73, 0x20, 0x50, 0x53, 0x0, 0x0, 0x1,\n                                                             0x0, 0x1, 0x0, 0x0, 0x81, 0x1, 0x0, 0x84,\n                                                             0x0, 0x0, 0x86, 0x2, 0x0, 0x91, 0x0, 0x0,\n                                                             0x63, 0x0, 0x0, 0x6d, 0x1, 0x0, 0x8c, 0x0,\n                                                             0x0, 0x92, 0x0, 0x0, 0xc7, 0x0, 0x0, 0xe4,\n                                                             0x0, 0x0, 0x2, 0x5, 0x0, 0x68, 0x0, 0x0,\n                                                             0x9, 0x37, 0x0, 0x7c, 0x0, 0x0, 0x42, 0x1d,\n                                                             0x1, 0x87, 0x0, 0x0, 0x75, 0x0, 0x0, 0x65,\n                                                             0x0, 0x0, 0x76, 0x0, 0x0, 0x79, 0x0, 0x0,\n                                                             0x70, 0x1, 0x0, 0x7e, 0x0, 0x0, 0x7a, 0x0,\n                                                             0x0, 0xc0, 0x0, 0x0, 0x6b, 0x0, 0x0, 0x8e,\n                                                             0x0, 0x0, 0x41, 0x0, 0x0, 0x8, 0x0, 0x0,\n                                                             0x69, 0x0, 0x0, 0x77, 0x0, 0x0, 0x74, 0x0,\n                                                             0x0, 0x6f, 0x0, 0x0, 0x89, 0x0, 0x0, 0x7f,\n                                                             0x0, 0x0, 0x99, 0x0, 0x0, 0xdd, 0x0, 0x0,\n                                                             0x6c, 0x0, 0x0, 0x94, 0x0, 0x0, 0xc6, 0x0,\n                                                             0x0, 0x60, 0x2, 0x0, 0x67, 0x0, 0x0, 0x64,\n                                                             0x0, 0x0, 0xa0, 0x0, 0x0, 0x66, 0x0, 0x0,\n                                                             0x83, 0x0, 0x0, 0xaa, 0x0, 0x0, 0x8b, 0x0,\n                                                             0x0, 0x6a, 0x0, 0x0, 0x97, 0x0, 0x0, 0xa6,\n                                                             0x0, 0x0, 0xa5, 0x0, 0x0, 0x80, 0x0, 0x0,\n                                                             0xa1, 0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4, 0x0,\n                                                             0x0, 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x98,\n                                                             0x0, 0x0, 0x73, 0x0, 0x0, 0x72, 0x0, 0x0,\n                                                             0x85, 0x0, 0x0, 0x96, 0x0, 0x0, 0x8f, 0x0,\n                                                             0x0, 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x9b,\n                                                             0x0, 0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0, 0x0,\n                                                             0xae, 0x0, 0x0, 0xab, 0x1, 0x0, 0xb0, 0x0,\n                                                             0x0, 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x8a,\n                                                             0x0, 0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0, 0x0,\n                                                             0xb2, 0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6, 0x2,\n                                                             0x0, 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0, 0xbe,\n                                                             0x0, 0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0, 0x0,\n                                                             0xbd, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d, 0x0,\n                                                             0x0, 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0, 0xc5,\n                                                             0x0, 0x0, 0x9d, 0x0, 0x0, 0x95, 0x0, 0x0,\n                                                             0xcb, 0x0, 0x0, 0xc8, 0x1, 0x0, 0xcd, 0x0,\n                                                             0x0, 0xca, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x90,\n                                                             0x0, 0x0, 0xce, 0x0, 0x0, 0xd2, 0x0, 0x0,\n                                                             0xcf, 0x2, 0x0, 0xd6, 0x0, 0x0, 0xd3, 0x2,\n                                                             0x0, 0xa7, 0x0, 0x0, 0xd7, 0x0, 0x0, 0xdb,\n                                                             0x0, 0x0, 0xd8, 0x1, 0x0, 0xdc, 0x0, 0x0,\n                                                             0xda, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x93, 0x0,\n                                                             0x0, 0xe1, 0x0, 0x0, 0xde, 0x2, 0x0, 0xe2,\n                                                             0x0, 0x0, 0xa2, 0x0, 0x0, 0xe3, 0x0, 0x0,\n                                                             0xe6, 0x2, 0x0, 0x1, 0x0, 0x4, 0x0, 0x7,\n                                                             0x0, 0x37, 0x0, 0x4c, 0x0, 0x76, 0x0, 0x89,\n                                                             0x0, 0xb9, 0x0, 0xcf, 0x0, 0xde, 0x0, 0xf6,\n                                                             0x1, 0x48, 0x1, 0x94, 0x1, 0xbc, 0x1, 0xe0,\n                                                             0x2, 0x2b, 0x2, 0x70, 0x2, 0x99, 0x2, 0xd3,\n                                                             0x3, 0x39, 0x3, 0xc9, 0x4, 0x5a, 0x5, 0x4,\n                                                             0x5, 0x21, 0x5, 0x5f, 0x5, 0x97, 0x5, 0xcc,\n                                                             0x5, 0xf3, 0x6, 0x1a, 0x6, 0x2e, 0x6, 0x40,\n                                                             0x6, 0x55, 0x6, 0x9e, 0x6, 0xca, 0x7, 0x1f,\n                                                             0x7, 0x83, 0x7, 0xc5, 0x8, 0x25, 0x8, 0x90,\n                                                             0x8, 0xc1, 0x9, 0x35, 0x9, 0x9f, 0x9, 0xc2,\n                                                             0x9, 0xfa, 0xa, 0x1f, 0xa, 0x3f, 0xa, 0x62,\n                                                             0xa, 0xb7, 0xb, 0x65, 0xb, 0x96, 0xb, 0xef,\n                                                             0xc, 0x39, 0xc, 0x6b, 0xc, 0x97, 0xc, 0xba,\n                                                             0xd, 0x1a, 0xd, 0x48, 0xd, 0x58, 0xd, 0x89,\n                                                             0xd, 0xb7, 0xd, 0xc9, 0xe, 0x7, 0xe, 0x2d,\n                                                             0xe, 0x7c, 0xe, 0xb8, 0xf, 0x2d, 0xf, 0x8a,\n                                                             0xf, 0xe6, 0x10, 0xa, 0x10, 0x59, 0x10, 0x74,\n                                                             0x10, 0xb2, 0x10, 0xe1, 0x11, 0x3, 0x11, 0x31,\n                                                             0x11, 0x53, 0x11, 0x6c, 0x11, 0x8d, 0x11, 0xae,\n                                                             0x11, 0xbc, 0x11, 0xcb, 0x12, 0x1d, 0x12, 0x7d,\n                                                             0x12, 0xc7, 0x13, 0x21, 0x13, 0x73, 0x13, 0xb1,\n                                                             0x14, 0x1c, 0x14, 0x64, 0x14, 0x82, 0x14, 0xc6,\n                                                             0x14, 0xf2, 0x14, 0xfe, 0x15, 0x65, 0x15, 0xaf,\n                                                             0x15, 0xc9, 0x16, 0x24, 0x16, 0x80, 0x16, 0xbf,\n                                                             0x17, 0x16, 0x17, 0x5a, 0x17, 0xa8, 0x17, 0xc5,\n                                                             0x18, 0x1, 0x18, 0x2f, 0x18, 0x6b, 0x18, 0x98,\n                                                             0x18, 0xeb, 0x19, 0x4, 0x19, 0x5b, 0x19, 0xa1,\n                                                             0x1a, 0x1c, 0x1a, 0x3e, 0x1a, 0x9e, 0x1a, 0xbd,\n                                                             0x1a, 0xd7, 0x1b, 0xe, 0x1b, 0x58, 0x1b, 0x6c,\n                                                             0x1c, 0xa, 0x1c, 0x8f, 0x1c, 0xa7, 0x1d, 0x32,\n                                                             0x1d, 0x5a, 0x1d, 0x7d, 0x1d, 0xc5, 0x1d, 0xe8,\n                                                             0x1e, 0x7, 0x1e, 0x11, 0x1e, 0x1c, 0x1e, 0x68,\n                                                             0x1e, 0xb8, 0x1f, 0x2e, 0x1f, 0x44, 0x1f, 0xdc,\n                                                             0x20, 0x1b, 0x20, 0x48, 0x20, 0xbc, 0x21, 0x52,\n                                                             0x21, 0xd7, 0x22, 0x2d, 0x22, 0x4d, 0x22, 0xf6,\n                                                             0x23, 0x8, 0x23, 0x98, 0x24, 0x2, 0x24, 0x10,\n                                                             0x24, 0x25, 0x24, 0x37, 0x24, 0xd9, 0x24, 0xf1,\n                                                             0x25, 0x25, 0x25, 0x56, 0x25, 0x9c, 0x25, 0xf2,\n                                                             0x26, 0x2, 0x26, 0x4a, 0x26, 0x78, 0x26, 0x8a,\n                                                             0x26, 0xbd, 0x26, 0xe2, 0x27, 0x26, 0x27, 0x33,\n                                                             0x27, 0x93, 0x28, 0x10, 0x28, 0xaa, 0x29, 0x0,\n                                                             0x29, 0x18, 0x29, 0x33, 0x29, 0x53, 0x29, 0x9e,\n                                                             0x29, 0xc2, 0x29, 0xf9, 0x2a, 0x49, 0x2a, 0xd8,\n                                                             0x2a, 0xed, 0x2b, 0x4, 0x2b, 0x24, 0x2b, 0x49,\n                                                             0x2b, 0x6d, 0x2b, 0x84, 0x2b, 0xa5, 0x2b, 0xbf,\n                                                             0x2c, 0xc, 0x2c, 0x66, 0x2c, 0x72, 0x2c, 0x8e,\n                                                             0x2c, 0xa8, 0x2c, 0xed, 0x2d, 0x13, 0x2d, 0x46,\n                                                             0x2d, 0xbd, 0x2d, 0xca, 0x2d, 0xd0, 0x2d, 0xde,\n                                                             0x2d, 0xee, 0x2e, 0x1e, 0x2e, 0x6a, 0x2e, 0xe8,\n                                                             0x2f, 0x5, 0x2f, 0x2a, 0x2f, 0x4f, 0x2f, 0xa2,\n                                                             0x2f, 0xc2, 0x30, 0x5b, 0x31, 0x8, 0x31, 0x8e,\n                                                             0x31, 0xb1, 0x31, 0xd6, 0x31, 0xfb, 0x32, 0x29,\n                                                             0x32, 0x3f, 0x32, 0x5b, 0x32, 0x7d, 0x32, 0x9e,\n                                                             0x33, 0x1a, 0x33, 0xac, 0x33, 0xbf, 0x33, 0xe4,\n                                                             0x34, 0x1, 0x34, 0x52, 0x34, 0x77, 0x34, 0xa3,\n                                                             0x35, 0x1d, 0x35, 0x2b, 0x35, 0x37, 0x35, 0x45,\n                                                             0x35, 0x58, 0x35, 0x94, 0x35, 0xed, 0x36, 0x24,\n                                                             0xfb, 0xf9, 0xe, 0xfb, 0xf9, 0xe, 0xf8, 0xf0,\n                                                             0xd4, 0x42, 0xf7, 0x26, 0x12, 0x13, 0x40, 0xf7,\n                                                             0x30, 0xf9, 0x82, 0x15, 0x49, 0x94, 0xae, 0x3b,\n                                                             0xf7, 0x4, 0x1b, 0xf7, 0x11, 0xb9, 0xf7, 0x4,\n                                                             0xad, 0x96, 0x1f, 0x43, 0x6, 0x13, 0x80, 0x75,\n                                                             0x80, 0x6c, 0x58, 0x4b, 0x1b, 0x13, 0x40, 0x55,\n                                                             0x76, 0xad, 0xb2, 0x81, 0x1f, 0xe, 0xf8, 0xfa,\n                                                             0xf7, 0x7, 0x1, 0xf7, 0x7f, 0xf8, 0xfa, 0x15,\n                                                             0xf7, 0x10, 0x6, 0xa5, 0xf7, 0x7, 0x5, 0xfb,\n                                                             0x10, 0x6, 0xe, 0xf7, 0x5c, 0xf9, 0x36, 0x15,\n                                                             0x51, 0xbd, 0x5b, 0xc8, 0xc5, 0xbe, 0xb9, 0xc7,\n                                                             0xc7, 0x59, 0xb5, 0x50, 0x4c, 0x5b, 0x60, 0x50,\n                                                             0x1e, 0xc7, 0x16, 0xa5, 0xa1, 0x9d, 0xa8, 0xa5,\n                                                             0xa2, 0x7a, 0x70, 0x70, 0x74, 0x76, 0x71, 0x6f,\n                                                             0x74, 0xa0, 0xa6, 0x1e, 0xe, 0x72, 0xa, 0xf7,\n                                                             0x1d, 0xf8, 0xf0, 0x15, 0xf3, 0x52, 0xa, 0xf7,\n                                                             0x6, 0xfb, 0x26, 0x15, 0xf3, 0x52, 0xa, 0xe,\n                                                             0xfb, 0x78, 0xd9, 0xf7, 0x2a, 0x77, 0x1, 0xb4,\n                                                             0xdc, 0x3, 0xd6, 0x16, 0x83, 0x7a, 0x71, 0x4f,\n                                                             0x54, 0x1a, 0x46, 0xb1, 0x70, 0xc3, 0xaf, 0xbe,\n                                                             0x9b, 0x9b, 0xa6, 0x1e, 0x9a, 0xcd, 0x5, 0x89,\n                                                             0x86, 0x55, 0x79, 0x6a, 0x1b, 0x76, 0x6e, 0x95,\n                                                             0xb2, 0x9b, 0x8f, 0xaa, 0xa2, 0xc1, 0x1f, 0xe,\n                                                             0x72, 0xa, 0xf7, 0x68, 0xf8, 0xf0, 0x8e, 0xa,\n                                                             0xf7, 0x2c, 0xf7, 0x26, 0x7a, 0xa, 0x32, 0x34,\n                                                             0x63, 0xe2, 0x5, 0x25, 0x6, 0xe, 0x48, 0xa,\n                                                             0x1, 0xd0, 0x16, 0xf7, 0x23, 0x6, 0xf7, 0x2,\n                                                             0xf8, 0xa8, 0x47, 0xa, 0xe, 0xfc, 0x68, 0x8d,\n                                                             0x76, 0xf9, 0x6d, 0x77, 0x1, 0x29, 0x78, 0x15,\n                                                             0xf8, 0xdd, 0xf9, 0x6d, 0x5, 0x3f, 0x6, 0xfc,\n                                                             0xdd, 0xfd, 0x6d, 0x5, 0xe, 0x84, 0xa, 0xf9,\n                                                             0x6b, 0x77, 0x1, 0xe2, 0x16, 0xf7, 0x21, 0x6,\n                                                             0xe3, 0xf8, 0x33, 0x5, 0xef, 0x6, 0xa1, 0xf1,\n                                                             0x5, 0x27, 0x6, 0xda, 0x9a, 0x9d, 0xa4, 0xb2,\n                                                             0x1b, 0x99, 0x9d, 0x87, 0x7d, 0xb1, 0x1f, 0xa6,\n                                                             0xf0, 0x5, 0x9c, 0x55, 0x59, 0x91, 0x6b, 0x1b,\n                                                             0xfb, 0x17, 0x81, 0x28, 0xfb, 0x3, 0x6a, 0x1f,\n                                                             0x3b, 0x6, 0x76, 0x25, 0x5, 0xda, 0x6, 0xf7,\n                                                             0x79, 0xfc, 0x33, 0x15, 0x9b, 0xa, 0xf7, 0x1,\n                                                             0xf8, 0x99, 0x3d, 0xa, 0x9a, 0xd2, 0x15, 0xf7,\n                                                             0x21, 0x6, 0xa5, 0xf7, 0x13, 0x65, 0xa, 0x84,\n                                                             0xa, 0xf8, 0x33, 0xf1, 0xf7, 0x66, 0x77, 0x1,\n                                                             0xf8, 0x28, 0x16, 0xf7, 0x20, 0x6, 0xf7, 0x2b,\n                                                             0xf9, 0x5f, 0x3d, 0xa, 0xfc, 0x67, 0xfd, 0x5f,\n                                                             0x15, 0x9b, 0xa, 0xe2, 0xf8, 0x33, 0x5, 0xef,\n                                                             0x6, 0xa0, 0xf1, 0x5, 0x27, 0x6, 0xda, 0x9c,\n                                                             0x9a, 0xa4, 0xb2, 0x1b, 0x99, 0x9f, 0x86, 0x7e,\n                                                             0xb0, 0x1f, 0xa6, 0xf0, 0x5, 0x9c, 0x55, 0x5a,\n                                                             0x91, 0x6a, 0x1b, 0xfb, 0x15, 0x80, 0x28, 0xfb,\n                                                             0x3, 0x6a, 0x1f, 0x3c, 0x6, 0x75, 0x25, 0x5,\n                                                             0xda, 0x6, 0xe, 0x87, 0xa, 0xcf, 0x16, 0xf8,\n                                                             0x9a, 0x50, 0xa, 0xfc, 0x4, 0x6, 0xbe, 0xf7,\n                                                             0x84, 0xf7, 0x4c, 0xee, 0xa3, 0xf7, 0x7, 0xfb,\n                                                             0x4c, 0x28, 0xbd, 0xf7, 0x86, 0x94, 0xa, 0x44,\n                                                             0xfb, 0xe0, 0x30, 0x59, 0x73, 0xfb, 0x8, 0xe6,\n                                                             0xbd, 0x5, 0xe, 0xfb, 0xf9, 0x37, 0xa, 0xdc,\n                                                             0x16, 0xf7, 0x20, 0x6, 0xd6, 0xf8, 0x0, 0xe7,\n                                                             0xcc, 0x9e, 0xe9, 0x2e, 0x4a, 0xc2, 0xf7, 0x98,\n                                                             0x5, 0xfb, 0x20, 0x6, 0x44, 0xfb, 0xe8, 0x29,\n                                                             0x48, 0x77, 0x2d, 0xef, 0xcd, 0x5, 0xe, 0x73,\n                                                             0x8b, 0xf7, 0xd, 0xf8, 0x7f, 0xf7, 0x10, 0xbe,\n                                                             0x95, 0xa, 0xa4, 0x16, 0xf8, 0xcb, 0x40, 0xa,\n                                                             0x8c, 0x8a, 0x2c, 0x8b, 0x2b, 0x1b, 0x52, 0x4c,\n                                                             0x8b, 0x8a, 0x44, 0x1f, 0xf8, 0x3e, 0xf8, 0x88,\n                                                             0xa0, 0xf7, 0x8, 0x5, 0xfc, 0xa2, 0x6, 0x71,\n                                                             0xfb, 0x10, 0x5, 0xf7, 0xe8, 0x6, 0xfc, 0x37,\n                                                             0xfc, 0x84, 0x5, 0xf7, 0xc7, 0xf9, 0x33, 0x15,\n                                                             0xf7, 0x19, 0x6, 0xf7, 0x28, 0x67, 0xa, 0xfb,\n                                                             0xa, 0x6, 0x34, 0x31, 0x65, 0xe5, 0x5, 0x27,\n                                                             0x6, 0xe, 0xfb, 0x1b, 0x8b, 0xf7, 0x9, 0xf7,\n                                                             0xc0, 0xf7, 0x5, 0xd0, 0x95, 0xa, 0x9f, 0x16,\n                                                             0xf8, 0x69, 0x6, 0xa5, 0xf7, 0x9, 0x5, 0xfb,\n                                                             0xa8, 0x6, 0xf7, 0xd1, 0xf7, 0xdb, 0x9e, 0xe1,\n                                                             0x5, 0xfc, 0x56, 0x6, 0x72, 0xfb, 0x5, 0x5,\n                                                             0xf7, 0x94, 0x6, 0xfb, 0xce, 0xfb, 0xd3, 0x5,\n                                                             0xf7, 0x83, 0xf8, 0x89, 0x15, 0xf7, 0x25, 0x6,\n                                                             0xf7, 0x34, 0x67, 0xa, 0xfb, 0x14, 0x6, 0x2d,\n                                                             0x31, 0x61, 0xe5, 0x5, 0x20, 0x6, 0xe, 0x8b,\n                                                             0xf7, 0x1b, 0xf8, 0xdb, 0x77, 0x1, 0xe9, 0xf7,\n                                                             0xc3, 0x3, 0xe9, 0x16, 0x7c, 0xa, 0xa8, 0xf7,\n                                                             0x1b, 0x47, 0xa, 0xb1, 0xbb, 0x15, 0xdb, 0x6,\n                                                             0xf7, 0x8, 0xf7, 0xf5, 0xb2, 0xf7, 0x4a, 0x5,\n                                                             0xfb, 0x2d, 0x6, 0x67, 0xfb, 0x4a, 0x5, 0xe,\n                                                             0xfb, 0x35, 0xf8, 0x68, 0x76, 0xf7, 0xa3, 0x77,\n                                                             0x1, 0xf7, 0x55, 0xf7, 0x25, 0xb9, 0xf7, 0x25,\n                                                             0x3, 0xf8, 0x14, 0xf8, 0x53, 0x15, 0xdd, 0x6,\n                                                             0xb5, 0xf7, 0x22, 0xa0, 0xf7, 0x15, 0x7a, 0xa,\n                                                             0x78, 0xfb, 0x15, 0x5, 0xfb, 0x57, 0xfb, 0x22,\n                                                             0x15, 0xdd, 0x6, 0xb7, 0xf7, 0x22, 0x9e, 0xf7,\n                                                             0x15, 0x5, 0xfb, 0xd, 0x6, 0x77, 0xfb, 0x15,\n                                                             0x5, 0xe, 0x3c, 0xa0, 0x76, 0xf8, 0x35, 0xf2,\n                                                             0xf7, 0x46, 0x77, 0x1, 0xe6, 0x16, 0xf7, 0xb,\n                                                             0x6, 0xb5, 0xf7, 0x47, 0x5, 0xf7, 0xb, 0x6,\n                                                             0x61, 0xfb, 0x47, 0x5, 0xf7, 0xb, 0x6, 0xb5,\n                                                             0xf7, 0x47, 0x5, 0xf7, 0x2e, 0xf1, 0xfb, 0x16,\n                                                             0x6, 0xab, 0xf7, 0x1c, 0x5, 0xed, 0xf2, 0x41,\n                                                             0x6, 0xb5, 0xf7, 0x46, 0x5, 0xfb, 0xf, 0x6,\n                                                             0x62, 0xfb, 0x46, 0x5, 0xfb, 0x9, 0x6, 0xb5,\n                                                             0xf7, 0x46, 0x5, 0xfb, 0xb, 0x6, 0x60, 0xfb,\n                                                             0x46, 0x5, 0xfb, 0x2b, 0x24, 0xf7, 0x13, 0x6,\n                                                             0x6c, 0xfb, 0x1c, 0x5, 0x2b, 0x25, 0xd3, 0x6,\n                                                             0xf7, 0x24, 0xf1, 0x15, 0xaa, 0xf7, 0x1c, 0x5,\n                                                             0xf7, 0xa, 0x6, 0x6b, 0xfb, 0x1c, 0x5, 0xe,\n                                                             0x3c, 0x2d, 0x76, 0xe3, 0xf7, 0x3, 0xf9, 0x47,\n                                                             0x77, 0x1, 0xf7, 0x2e, 0xf7, 0xe, 0xf7, 0x46,\n                                                             0xf7, 0xc, 0x3, 0xce, 0xf7, 0x5b, 0x15, 0x93,\n                                                             0xfb, 0x7, 0xcf, 0x3c, 0xec, 0x73, 0x76, 0x2b,\n                                                             0x18, 0xd4, 0x6, 0x9e, 0xe3, 0x5, 0xf7, 0x41,\n                                                             0xe5, 0xf4, 0xf7, 0x5, 0xf7, 0x26, 0xfb, 0x12,\n                                                             0xc9, 0x5f, 0x9c, 0x1f, 0xb6, 0xf7, 0x5b, 0x97,\n                                                             0x85, 0xa7, 0x7b, 0x94, 0x53, 0x19, 0xf7, 0x12,\n                                                             0x93, 0x80, 0xf7, 0x6, 0x42, 0xba, 0x47, 0x9d,\n                                                             0x19, 0x95, 0xbe, 0x5, 0x44, 0x6, 0x81, 0x61,\n                                                             0x5, 0xfb, 0xb, 0xfb, 0x12, 0x4e, 0xfb, 0x1d,\n                                                             0x5b, 0x9f, 0xfb, 0x5, 0xf7, 0x1d, 0x50, 0x1f,\n                                                             0x5c, 0xfb, 0x71, 0x50, 0xa5, 0x84, 0xcd, 0x89,\n                                                             0xa0, 0x19, 0xf7, 0x22, 0xf7, 0x82, 0x15, 0x66,\n                                                             0xa0, 0x72, 0xa7, 0xb4, 0x1a, 0xba, 0xb2, 0xb9,\n                                                             0xc8, 0x89, 0x1e, 0x61, 0xfc, 0xb2, 0x15, 0xb5,\n                                                             0xf7, 0x5c, 0x5, 0xb4, 0x77, 0xb0, 0x76, 0x57,\n                                                             0x1a, 0x63, 0x70, 0x4f, 0x2e, 0x84, 0x1e, 0xe,\n                                                             0xf7, 0x92, 0x7a, 0xdb, 0x4e, 0x76, 0xf7, 0xaf,\n                                                             0xdc, 0x8f, 0xdb, 0xf7, 0x5d, 0xdb, 0x8a, 0x77,\n                                                             0x12, 0xf7, 0xfa, 0xf0, 0xf7, 0xe9, 0xf0, 0x13,\n                                                             0x7b, 0xf7, 0x81, 0xf8, 0x6e, 0x15, 0x90, 0x99,\n                                                             0xf7, 0x2b, 0xce, 0x9d, 0xa1, 0x82, 0x68, 0x76,\n                                                             0x7e, 0xfb, 0x1c, 0x47, 0x63, 0x8b, 0xaa, 0x99,\n                                                             0x1e, 0x47, 0xfc, 0x81, 0x15, 0xf7, 0x2, 0x6,\n                                                             0x13, 0x77, 0xf8, 0xe2, 0xf9, 0x6c, 0x5, 0xfb,\n                                                             0x3, 0x6, 0xfd, 0x2, 0xfb, 0x75, 0x15, 0x4b,\n                                                             0xb0, 0x44, 0xeb, 0xf7, 0x30, 0xad, 0xf7, 0x2f,\n                                                             0xcb, 0x1e, 0x13, 0xbb, 0xc4, 0x71, 0xe0, 0xfb,\n                                                             0x1, 0xfb, 0x1f, 0x5a, 0xfb, 0x1a, 0x2f, 0x1e,\n                                                             0xf8, 0x4e, 0xfc, 0x1, 0x15, 0x4a, 0xb0, 0x44,\n                                                             0xeb, 0xf7, 0x2f, 0xae, 0xf7, 0x30, 0xcb, 0xc4,\n                                                             0x70, 0xe0, 0x20, 0xfb, 0x20, 0x5a, 0xfb, 0x1b,\n                                                             0x30, 0x1e, 0xf0, 0x81, 0x15, 0x91, 0x98, 0xf7,\n                                                             0x29, 0xd0, 0x9b, 0xa2, 0x83, 0x68, 0x76, 0x7d,\n                                                             0xfb, 0x1d, 0x48, 0x63, 0x8b, 0xab, 0x99, 0x1e,\n                                                             0xe, 0xe2, 0x7d, 0xf7, 0x5, 0x2a, 0x76, 0xf9,\n                                                             0x19, 0xe5, 0x12, 0xe4, 0xf7, 0x23, 0x9a, 0xf7,\n                                                             0x19, 0x13, 0x98, 0xf7, 0xac, 0xf8, 0x3b, 0x15,\n                                                             0x4b, 0x6b, 0xfb, 0x13, 0x4e, 0xfb, 0x1f, 0x1a,\n                                                             0x32, 0xcd, 0xfb, 0x8, 0xf7, 0x49, 0xec, 0xd4,\n                                                             0xad, 0xa9, 0xb2, 0x1e, 0x13, 0x58, 0x9f, 0x77,\n                                                             0xb4, 0x69, 0xa6, 0x7c, 0xe7, 0xe6, 0x18, 0x8a,\n                                                             0x8c, 0x86, 0x8f, 0x8c, 0x1a, 0x6d, 0xa2, 0x7d,\n                                                             0x98, 0x72, 0xa2, 0xa7, 0xa5, 0xae, 0xbb, 0x9e,\n                                                             0xae, 0x23, 0xc6, 0x18, 0x68, 0x56, 0x7b, 0x7c,\n                                                             0x81, 0x81, 0x76, 0xa1, 0x58, 0xd1, 0x62, 0xcf,\n                                                             0x8, 0x13, 0x8, 0xf7, 0x2f, 0xd6, 0x9c, 0xe3,\n                                                             0xab, 0x1a, 0x13, 0x28, 0xc7, 0x56, 0xd7, 0xfb,\n                                                             0xc, 0x23, 0x25, 0x54, 0xfb, 0x9, 0x5e, 0x99,\n                                                             0x62, 0x9e, 0x66, 0x1e, 0xbf, 0x2a, 0x15, 0xac,\n                                                             0x52, 0xbf, 0x40, 0xbb, 0x53, 0x8, 0x13, 0x98,\n                                                             0x7c, 0x73, 0x63, 0x73, 0x4f, 0x1b, 0x3e, 0x6b,\n                                                             0xb7, 0xbb, 0xd9, 0xd5, 0xb7, 0xa5, 0x98, 0x1f,\n                                                             0xd1, 0xf7, 0x2f, 0x15, 0x84, 0x98, 0x7c, 0x9f,\n                                                             0xab, 0x1a, 0x13, 0x0, 0xb6, 0xaa, 0xb2, 0xb2,\n                                                             0xac, 0x9f, 0x77, 0x71, 0x5f, 0x50, 0x66, 0x61,\n                                                             0x77, 0x1e, 0xe, 0xfc, 0x21, 0xf8, 0x68, 0x76,\n                                                             0xf7, 0xa3, 0x77, 0x1, 0xf7, 0x39, 0xf8, 0x53,\n                                                             0x15, 0xe4, 0x6, 0xb7, 0xf7, 0x22, 0xa2, 0xf7,\n                                                             0x15, 0x66, 0xa, 0x77, 0xfb, 0x15, 0x5, 0xe,\n                                                             0xfb, 0x4f, 0x76, 0xfa, 0x42, 0x77, 0x1, 0xd7,\n                                                             0xf7, 0x19, 0x3, 0xf7, 0x33, 0xfb, 0x64, 0x15,\n                                                             0xf1, 0x6, 0x8c, 0x89, 0x92, 0x8a, 0x8d, 0x1e,\n                                                             0x6d, 0xed, 0x78, 0xf7, 0x2c, 0xf4, 0x1a, 0xf7,\n                                                             0x9a, 0xf7, 0x2a, 0xf7, 0x76, 0xf7, 0x3, 0xe4,\n                                                             0x1e, 0xfb, 0x5, 0x6, 0x32, 0x2d, 0xfb, 0x54,\n                                                             0xfb, 0x62, 0xfb, 0xa9, 0x1a, 0x50, 0x94, 0xfb,\n                                                             0x22, 0xd5, 0xfb, 0x38, 0x1e, 0xe, 0xfb, 0x4f,\n                                                             0x76, 0xfa, 0x42, 0x77, 0x1, 0xf7, 0x80, 0xf7,\n                                                             0x19, 0x3, 0x72, 0xfb, 0x64, 0x15, 0xf7, 0x5,\n                                                             0x6, 0xe4, 0xe9, 0xf7, 0x54, 0xf7, 0x62, 0xf7,\n                                                             0xa9, 0x1a, 0xc6, 0x82, 0xf7, 0x22, 0x41, 0xf7,\n                                                             0x38, 0x1e, 0x25, 0x6, 0xab, 0x26, 0x9f, 0xfb,\n                                                             0x2d, 0xfb, 0x1, 0x1a, 0xfb, 0xd1, 0xfb, 0x5e,\n                                                             0xfb, 0x6e, 0x50, 0x5f, 0x1e, 0xe, 0xfb, 0x8a,\n                                                             0xf8, 0x2c, 0x76, 0xf7, 0xdf, 0x77, 0x1, 0xf7,\n                                                             0x8c, 0xf8, 0x17, 0x15, 0xcc, 0xf7, 0x2, 0xca,\n                                                             0xfb, 0x2, 0xd0, 0xc1, 0x39, 0xe8, 0xf7, 0xa,\n                                                             0xa4, 0x71, 0xe0, 0xfb, 0x6, 0x57, 0x97, 0xf7,\n                                                             0x12, 0x5, 0x37, 0x6, 0x98, 0xfb, 0x12, 0xfb,\n                                                             0x0, 0xc2, 0x6f, 0x36, 0xf7, 0xa, 0x6f, 0x32,\n                                                             0x2d, 0x5, 0xe, 0x58, 0xf7, 0x52, 0xf7, 0x14,\n                                                             0x1, 0xf7, 0xab, 0xf7, 0x19, 0x3, 0xdd, 0xf7,\n                                                             0x52, 0x15, 0xf7, 0x59, 0xfb, 0x52, 0xf7, 0x19,\n                                                             0xf7, 0x52, 0xf7, 0x5a, 0xf7, 0x14, 0xfb, 0x5a,\n                                                             0xf7, 0x50, 0xfb, 0x19, 0xfb, 0x50, 0xfb, 0x59,\n                                                             0x6, 0xe, 0xfb, 0xf9, 0xfb, 0x27, 0x76, 0xf7,\n                                                             0xce, 0x77, 0x1, 0xc9, 0x8d, 0x15, 0xd0, 0x6,\n                                                             0x7d, 0x4a, 0x70, 0x74, 0x5b, 0x80, 0x7d, 0x44,\n                                                             0x18, 0xf7, 0x2d, 0x8e, 0xa4, 0xf7, 0x16, 0x98,\n                                                             0xca, 0xa5, 0xf7, 0xa, 0x18, 0xfb, 0x2d, 0x6,\n                                                             0xe, 0xf7, 0x6b, 0xf7, 0x16, 0x1, 0xd4, 0xf7,\n                                                             0x6b, 0x15, 0xf7, 0xa9, 0x6, 0xa8, 0xf7, 0x16,\n                                                             0x5, 0xfb, 0xa9, 0x6, 0xe, 0xfb, 0xf9, 0x8b,\n                                                             0xf7, 0x26, 0x1, 0xcb, 0x16, 0xf7, 0x2b, 0x6,\n                                                             0xa9, 0xf7, 0x26, 0x5, 0x97, 0xa, 0xe, 0xfb,\n                                                             0xf9, 0x78, 0xa, 0x76, 0xf8, 0x8d, 0x3, 0x66,\n                                                             0x78, 0x15, 0xef, 0x6, 0xf8, 0x29, 0xf9, 0x88,\n                                                             0x5, 0x25, 0x6, 0xe, 0x3c, 0x78, 0xf7, 0x4,\n                                                             0xf8, 0x8d, 0xf7, 0x4, 0x1, 0xe1, 0xf7, 0xf,\n                                                             0xf7, 0xb0, 0xf7, 0x10, 0x3, 0xe1, 0xf7, 0x63,\n                                                             0x15, 0xfb, 0x3b, 0xea, 0x50, 0xf7, 0x6, 0xf7,\n                                                             0x81, 0xe0, 0xf7, 0xe6, 0xf7, 0x30, 0xf7, 0x3e,\n                                                             0x2d, 0xcc, 0xfb, 0x5, 0xfb, 0x7a, 0x2d, 0xfb,\n                                                             0xe3, 0xfb, 0x3c, 0x1e, 0xf7, 0xf, 0x16, 0xb6,\n                                                             0xc6, 0xf7, 0xf0, 0xf7, 0x1b, 0xc5, 0xab, 0x3c,\n                                                             0x5f, 0x44, 0x52, 0xfb, 0xcb, 0xfb, 0x1b, 0x45,\n                                                             0x75, 0xe6, 0xa2, 0x1e, 0xe, 0x3c, 0xa0, 0x76,\n                                                             0xf9, 0x5a, 0x77, 0x1, 0xf7, 0x41, 0xf7, 0xf8,\n                                                             0x3, 0xf7, 0x9c, 0x16, 0xf7, 0x14, 0x6, 0xf7,\n                                                             0x1d, 0xf9, 0x5a, 0x5, 0x3e, 0x6, 0x39, 0x2c,\n                                                             0xfb, 0x1, 0x56, 0x4b, 0x6c, 0x73, 0xfb, 0x10,\n                                                             0x18, 0xb3, 0x95, 0xdb, 0xa7, 0xcd, 0xba, 0x8,\n                                                             0xe, 0x3c, 0x8b, 0xf7, 0x12, 0xf8, 0x6f, 0xf7,\n                                                             0x1, 0x1, 0xf8, 0x54, 0xf7, 0x20, 0x3, 0xa4,\n                                                             0x16, 0xf8, 0x74, 0x6, 0xa9, 0xf7, 0x12, 0x5,\n                                                             0xfb, 0xa6, 0x6, 0xb0, 0xb5, 0x9b, 0x99, 0xf7,\n                                                             0x10, 0xf2, 0x8, 0xf7, 0x0, 0xe4, 0xb5, 0xd1,\n                                                             0xd7, 0x1a, 0xdf, 0x4f, 0xf5, 0xfb, 0x45, 0xfb,\n                                                             0x15, 0x28, 0x45, 0xfb, 0x19, 0x73, 0x1e, 0xf7,\n                                                             0x21, 0x77, 0x5, 0xbf, 0x96, 0xae, 0xc9, 0xd1,\n                                                             0x1b, 0xc3, 0xaf, 0x61, 0x65, 0x38, 0xfb, 0x14,\n                                                             0x35, 0x40, 0x48, 0x1f, 0xfb, 0x2, 0x2f, 0x2d,\n                                                             0x3f, 0x7b, 0xfb, 0x9, 0x8, 0xe, 0x3c, 0x78,\n                                                             0xf7, 0x6, 0xf7, 0x63, 0xf7, 0x9, 0xf7, 0x46,\n                                                             0xf7, 0x5, 0x1, 0xf8, 0x60, 0xf7, 0x28, 0x3,\n                                                             0xcc, 0xf7, 0x47, 0x15, 0xfb, 0x2b, 0xa0, 0xf7,\n                                                             0x4, 0x5c, 0xf2, 0x1b, 0xf7, 0x3b, 0xf3, 0xf7,\n                                                             0xb, 0xf7, 0x1, 0xc9, 0x68, 0xc5, 0x50, 0xa8,\n                                                             0x1f, 0xcc, 0xa1, 0xcc, 0xc3, 0xe3, 0x1a, 0xe0,\n                                                             0x45, 0xf0, 0xfb, 0x2f, 0xfb, 0x4c, 0x65, 0xfb,\n                                                             0x25, 0x64, 0x7e, 0x1e, 0xf7, 0x1d, 0x71, 0x5,\n                                                             0xc1, 0x9a, 0xa7, 0xb6, 0xc2, 0x1b, 0xaa, 0xb9,\n                                                             0x7c, 0x51, 0x49, 0x4f, 0x64, 0x3d, 0x1f, 0x71,\n                                                             0xfb, 0x9, 0x5, 0xd0, 0xc2, 0x72, 0x47, 0x4e,\n                                                             0x5e, 0x56, 0x42, 0x4b, 0x77, 0xb5, 0xc5, 0x81,\n                                                             0x1f, 0xe, 0x3c, 0xa0, 0x76, 0xf7, 0x25, 0xf7,\n                                                             0xa, 0xf8, 0x38, 0x77, 0x1, 0xc7, 0xf8, 0xae,\n                                                             0x3, 0xc7, 0xf7, 0x25, 0x15, 0xf7, 0xb1, 0x6,\n                                                             0x6b, 0xfb, 0x25, 0x5, 0xf7, 0x1a, 0x6, 0xaa,\n                                                             0xf7, 0x25, 0x5, 0xe3, 0x6, 0xa4, 0xf7, 0xa,\n                                                             0x5, 0x33, 0x6, 0xea, 0xf8, 0x53, 0x7a, 0xa,\n                                                             0xfc, 0x1b, 0xfc, 0x55, 0x5, 0xf7, 0x22, 0x8d,\n                                                             0x15, 0xf7, 0x50, 0xf7, 0x72, 0x8d, 0x89, 0x5c,\n                                                             0xfb, 0x70, 0x5, 0xe, 0x20, 0x78, 0xf7, 0x7,\n                                                             0xf7, 0xab, 0xf2, 0xf7, 0x2, 0xf7, 0x14, 0x1,\n                                                             0xc8, 0xf7, 0x24, 0xf7, 0x73, 0xf7, 0x27, 0x3,\n                                                             0xc8, 0xf7, 0x5a, 0x15, 0xfb, 0x22, 0x8d, 0xf1,\n                                                             0x40, 0xf7, 0x9, 0x1b, 0xf7, 0x44, 0xf7, 0x9,\n                                                             0xf7, 0x27, 0xf7, 0x28, 0xf7, 0x9, 0x3d, 0xe0,\n                                                             0xfb, 0xd, 0x60, 0x73, 0x81, 0x83, 0x78, 0x1f,\n                                                             0xae, 0xf7, 0x2, 0x5, 0xf7, 0x8f, 0x6, 0xa7,\n                                                             0xf7, 0x14, 0x5, 0xfc, 0x11, 0x6, 0xfb, 0x6,\n                                                             0xfc, 0x1, 0xf7, 0xe, 0x82, 0x5, 0xbe, 0xbc,\n                                                             0xbd, 0x8b, 0x94, 0x1b, 0xb7, 0xb8, 0x73, 0x3f,\n                                                             0xfb, 0x9, 0x42, 0x4d, 0x49, 0x4a, 0x75, 0xbc,\n                                                             0xcc, 0x8e, 0x1f, 0xe, 0x3c, 0x78, 0xf7, 0x4,\n                                                             0xf7, 0xb0, 0xe7, 0xf7, 0x15, 0xf7, 0x4, 0x1,\n                                                             0xe0, 0xf7, 0x26, 0xf7, 0x5e, 0xf7, 0x27, 0x3,\n                                                             0xf7, 0xa3, 0xf8, 0x4c, 0x15, 0xb7, 0x98, 0xaf,\n                                                             0xf7, 0x6, 0xe3, 0x1b, 0xc9, 0x90, 0x59, 0x72,\n                                                             0x8d, 0x1f, 0xf7, 0x22, 0x94, 0x5, 0xf7, 0xd,\n                                                             0x7c, 0x45, 0xc4, 0xfb, 0x7, 0x1b, 0xfb, 0x6b,\n                                                             0xfb, 0xb, 0xfb, 0x8f, 0xfb, 0x81, 0xfb, 0x10,\n                                                             0xd7, 0xfb, 0x9, 0xf7, 0x2a, 0xf7, 0x43, 0xe9,\n                                                             0xf7, 0x2a, 0xf7, 0x14, 0xf7, 0x11, 0x3a, 0xe0,\n                                                             0xfb, 0x10, 0x64, 0x6a, 0x82, 0x77, 0x6b, 0x1f,\n                                                             0x63, 0xfb, 0x6e, 0x15, 0xe3, 0xb8, 0xce, 0xd7,\n                                                             0xb0, 0xb7, 0x6d, 0x33, 0xfb, 0x0, 0x54, 0x51,\n                                                             0x4c, 0x47, 0x7b, 0xde, 0xb9, 0x1e, 0xe, 0x3c,\n                                                             0xa0, 0x76, 0xf8, 0xdd, 0xf7, 0x11, 0x1, 0xf7,\n                                                             0x27, 0x16, 0xf7, 0x27, 0x6, 0xa7, 0xf7, 0x1c,\n                                                             0xf7, 0x2d, 0xf7, 0xe7, 0xf7, 0x47, 0xf7, 0x13,\n                                                             0xa1, 0xeb, 0x18, 0xfc, 0x9c, 0x6, 0x6c, 0xfb,\n                                                             0x11, 0x5, 0xf7, 0xe7, 0x6, 0xfb, 0x8e, 0xfb,\n                                                             0x9c, 0x4b, 0xfb, 0xb3, 0x88, 0x75, 0x8, 0xe,\n                                                             0x3c, 0x78, 0xf6, 0xf7, 0x80, 0xf6, 0xf7, 0x38,\n                                                             0xf6, 0x1, 0xd0, 0xf7, 0x2d, 0xf7, 0x65, 0xf7,\n                                                             0x29, 0x3, 0xf7, 0x7c, 0xf8, 0x16, 0x15, 0xfb,\n                                                             0x21, 0x5f, 0x75, 0xfb, 0xd, 0x5d, 0x1a, 0x22,\n                                                             0xdc, 0x32, 0xf7, 0x28, 0xf7, 0x48, 0xf1, 0xf7,\n                                                             0x13, 0xf7, 0x6, 0xee, 0x47, 0xb1, 0x6f, 0x9b,\n                                                             0x1e, 0xac, 0x98, 0xee, 0xa9, 0xf7, 0x0, 0x1a,\n                                                             0xf0, 0x37, 0xde, 0xfb, 0x1e, 0xfb, 0x3e, 0x41,\n                                                             0xfb, 0xd, 0x38, 0x3b, 0xc6, 0x71, 0xa2, 0x7d,\n                                                             0x1e, 0x81, 0xfb, 0x67, 0x15, 0xcf, 0xb3, 0xdc,\n                                                             0xdd, 0xbe, 0xaf, 0x55, 0x5b, 0x60, 0x72, 0x30,\n                                                             0x29, 0x62, 0x5e, 0xa4, 0xc9, 0x1e, 0xcf, 0xf7,\n                                                             0xdf, 0x15, 0xc4, 0xbd, 0xb3, 0xbf, 0xc1, 0xa7,\n                                                             0x65, 0x64, 0x59, 0x5b, 0x5e, 0x53, 0x5b, 0x6b,\n                                                             0xab, 0xb6, 0x1e, 0xe, 0x3c, 0x78, 0xf7, 0x4,\n                                                             0xfb, 0x4, 0xf7, 0x4a, 0xc6, 0xe7, 0xf7, 0xb0,\n                                                             0xf7, 0x4, 0x1, 0xf7, 0x9, 0xf7, 0x28, 0xf7,\n                                                             0x5e, 0xf7, 0x28, 0x3, 0xd9, 0xf7, 0x33, 0x15,\n                                                             0xfb, 0xd, 0x9a, 0xd2, 0x52, 0xf7, 0x7, 0x1b,\n                                                             0xf7, 0x6c, 0xf7, 0xc, 0xf7, 0x90, 0xf7, 0x81,\n                                                             0xf7, 0x10, 0x3f, 0xf7, 0x8, 0xfb, 0x2b, 0xfb,\n                                                             0x44, 0x2c, 0xfb, 0x2f, 0xfb, 0x14, 0xfb, 0x11,\n                                                             0xdd, 0x3b, 0xf7, 0x11, 0xb2, 0xab, 0x94, 0x9f,\n                                                             0xac, 0x1f, 0x5f, 0x7e, 0x67, 0xfb, 0x6, 0x32,\n                                                             0x1b, 0x4d, 0x86, 0xbd, 0xa4, 0x88, 0x1f, 0xb8,\n                                                             0xf7, 0x97, 0x15, 0xf7, 0x0, 0xc2, 0xca, 0xca,\n                                                             0xd0, 0x9a, 0x3a, 0x5d, 0x33, 0x5f, 0x46, 0x3e,\n                                                             0x67, 0x5e, 0xa4, 0xe3, 0x1e, 0xe, 0x8b, 0xf7,\n                                                             0x17, 0xf7, 0x8f, 0xf7, 0x16, 0x1, 0xf7, 0x44,\n                                                             0xf8, 0x12, 0x15, 0xf7, 0x26, 0x6, 0xa8, 0xf7,\n                                                             0x16, 0x93, 0xa, 0xfb, 0x5, 0xfc, 0x94, 0x15,\n                                                             0xf7, 0x26, 0x6, 0xa8, 0xf7, 0x17, 0x93, 0xa,\n                                                             0xe, 0xfb, 0x27, 0x76, 0xf7, 0x47, 0x76, 0xf8,\n                                                             0x19, 0xf7, 0x19, 0x1, 0xc3, 0xf7, 0xbb, 0x3,\n                                                             0xe5, 0x81, 0x15, 0xcf, 0x6, 0x7d, 0x4f, 0x70,\n                                                             0x75, 0x5c, 0x81, 0x7d, 0x49, 0x18, 0xf7, 0x2a,\n                                                             0x8e, 0xa5, 0xf7, 0xd, 0x97, 0xc5, 0xa5, 0xf7,\n                                                             0x2, 0x18, 0x97, 0xa, 0xc2, 0xf7, 0x93, 0x15,\n                                                             0xf7, 0x27, 0x6, 0xa9, 0xf7, 0x19, 0x7b, 0xa,\n                                                             0xe, 0x58, 0x98, 0x76, 0xf8, 0x9e, 0x77, 0x1,\n                                                             0xdd, 0xf7, 0x58, 0x15, 0xf8, 0x8b, 0xfb, 0x60,\n                                                             0x5, 0xf7, 0x17, 0x7, 0xfb, 0xdd, 0xf7, 0x17,\n                                                             0xf7, 0xdd, 0xf7, 0x13, 0x5, 0xf7, 0x19, 0x7,\n                                                             0xfc, 0x8b, 0xfb, 0x60, 0x5, 0xe, 0x58, 0xe2,\n                                                             0xf7, 0xb, 0xe9, 0xf7, 0xb, 0x1, 0xc5, 0xf8,\n                                                             0xd3, 0x3, 0xc5, 0xe2, 0x15, 0xf8, 0xd3, 0xf7,\n                                                             0xb, 0xfc, 0xd3, 0x6, 0xe9, 0x4, 0xf8, 0xd3,\n                                                             0xf7, 0xb, 0xfc, 0xd3, 0x6, 0xe, 0x58, 0x98,\n                                                             0x76, 0xf8, 0x9e, 0x77, 0x1, 0xf5, 0x83, 0x15,\n                                                             0xf8, 0x8b, 0xf7, 0x60, 0x5, 0xf7, 0x6, 0x7,\n                                                             0xfc, 0x8b, 0xf7, 0x60, 0x98, 0xa, 0x7, 0xf7,\n                                                             0xdc, 0xfb, 0x17, 0xfb, 0xdc, 0xfb, 0x13, 0x5,\n                                                             0xe, 0x73, 0x8b, 0xf7, 0x1b, 0xf8, 0x7d, 0xf2,\n                                                             0x1, 0xf7, 0x98, 0xf7, 0x47, 0x15, 0xf7, 0x15,\n                                                             0x6, 0x96, 0xca, 0x9f, 0x9b, 0xdd, 0xce, 0x8,\n                                                             0xf7, 0xa, 0xea, 0xbe, 0xbc, 0xda, 0x1a, 0xdf,\n                                                             0x45, 0xea, 0xfb, 0x35, 0xfb, 0x50, 0x46, 0xfb,\n                                                             0x1b, 0x45, 0x79, 0x1e, 0xf7, 0x17, 0x74, 0x5,\n                                                             0xf7, 0x9, 0xa6, 0xd3, 0x93, 0xb6, 0x1b, 0xd8,\n                                                             0xa1, 0x5f, 0x6b, 0x66, 0x75, 0x79, 0x35, 0x42,\n                                                             0x1f, 0xfb, 0x4, 0x2d, 0x61, 0x5b, 0x7c, 0x28,\n                                                             0x8, 0x5f, 0xfb, 0x47, 0x15, 0xf7, 0x21, 0x6,\n                                                             0xa9, 0xf7, 0x1b, 0x92, 0xa, 0xe, 0xf8, 0x49,\n                                                             0x4d, 0xda, 0xf7, 0x0, 0xda, 0xf7, 0xca, 0xda,\n                                                             0xed, 0xda, 0x1, 0xf7, 0x61, 0xdb, 0xe0, 0xf7,\n                                                             0x5, 0xf8, 0x64, 0xdb, 0x3, 0xf9, 0x25, 0xf7,\n                                                             0x42, 0x15, 0x79, 0x8f, 0x94, 0x6c, 0xce, 0x1b,\n                                                             0xf7, 0x46, 0xf7, 0x4, 0xf7, 0x37, 0xf7, 0x28,\n                                                             0xf7, 0x4c, 0xfb, 0x1b, 0xf7, 0x2a, 0xfb, 0x83,\n                                                             0xfb, 0xd4, 0xfb, 0x14, 0xfb, 0x87, 0xfb, 0x5b,\n                                                             0xfb, 0xa5, 0xf7, 0x7f, 0xfb, 0x9, 0xf7, 0x6c,\n                                                             0xf7, 0x1d, 0xf7, 0x47, 0xb4, 0xf7, 0x2e, 0xd8,\n                                                             0x1f, 0x2f, 0x6, 0x68, 0x6d, 0x46, 0x3a, 0xfb,\n                                                             0x5e, 0x1b, 0xfb, 0xb5, 0x39, 0xf7, 0x41, 0xf7,\n                                                             0x1e, 0xf7, 0xf, 0xca, 0xf7, 0x84, 0xf7, 0xc4,\n                                                             0xf7, 0x7a, 0xcc, 0xfb, 0x2b, 0x28, 0xfb, 0x1d,\n                                                             0xfb, 0x3, 0x30, 0x61, 0x73, 0x91, 0xa9, 0xa8,\n                                                             0x92, 0x1f, 0xcc, 0xf7, 0xcb, 0x5, 0xfb, 0x6,\n                                                             0x6, 0x80, 0x5b, 0x5, 0xc0, 0x67, 0x56, 0x90,\n                                                             0x6f, 0x1b, 0xfb, 0x30, 0x3b, 0xfb, 0x39, 0xfb,\n                                                             0xd, 0x28, 0xc8, 0x38, 0xf5, 0xd0, 0xb3, 0xb1,\n                                                             0x96, 0x96, 0x1f, 0xfb, 0x42, 0xf7, 0x19, 0x15,\n                                                             0xc8, 0xab, 0xf7, 0x26, 0xf0, 0xd2, 0x95, 0x42,\n                                                             0x70, 0x51, 0x6a, 0xfb, 0x2c, 0x24, 0x4f, 0x79,\n                                                             0xbf, 0xbe, 0x1e, 0xe, 0x68, 0xa, 0xf7, 0x33,\n                                                             0xf7, 0xc, 0xf8, 0x4b, 0x77, 0x1, 0x9f, 0x16,\n                                                             0x5e, 0xa, 0xe1, 0xf7, 0x33, 0x5, 0xf7, 0xaf,\n                                                             0x6, 0xa3, 0xfb, 0x33, 0x5, 0xf7, 0x1f, 0x6,\n                                                             0xfb, 0x8, 0xf9, 0x62, 0x43, 0xa, 0x27, 0xfc,\n                                                             0x4b, 0x15, 0xf7, 0x30, 0xf7, 0xb5, 0x5c, 0xa,\n                                                             0xb3, 0xfb, 0xb5, 0x5, 0xe, 0xe2, 0x8b, 0xf7,\n                                                             0xc, 0xf7, 0x50, 0xf7, 0xc, 0xf7, 0x3e, 0x8b,\n                                                             0xa, 0xf7, 0xef, 0x6, 0xf7, 0x27, 0xf7, 0x42,\n                                                             0xb5, 0xf7, 0x4c, 0xc0, 0x6c, 0xd1, 0x32, 0xa3,\n                                                             0x1f, 0x8d, 0x7, 0xa9, 0x93, 0xf7, 0x2, 0x9c,\n                                                             0xf7, 0x12, 0x1a, 0xf7, 0x23, 0x24, 0xbc, 0xfb,\n                                                             0x47, 0x1e, 0xfb, 0x90, 0x6, 0xa2, 0xfc, 0xea,\n                                                             0x15, 0xb3, 0xf7, 0x50, 0x5, 0xf7, 0x48, 0x6,\n                                                             0xa2, 0xe9, 0x8b, 0x39, 0x25, 0x24, 0x87, 0x32,\n                                                             0x1f, 0x3c, 0xf7, 0xc8, 0x15, 0xaf, 0xf7, 0x3e,\n                                                             0x5, 0xf7, 0x9, 0x6, 0xd5, 0xcf, 0x8b, 0x43,\n                                                             0x2d, 0x2b, 0x87, 0x37, 0x1f, 0xe, 0xe2, 0x78,\n                                                             0xf7, 0x12, 0xf8, 0x8c, 0xf7, 0x12, 0x1, 0xf6,\n                                                             0xf7, 0x2c, 0x3, 0xf8, 0xe6, 0xf7, 0x95, 0x15,\n                                                             0xfb, 0xb, 0x64, 0x34, 0x6c, 0x51, 0x1b, 0x27,\n                                                             0x58, 0xe3, 0xef, 0xf7, 0xa, 0x80, 0xa, 0x69,\n                                                             0x92, 0x1f, 0xf7, 0x28, 0x99, 0x5, 0xf7, 0x3d,\n                                                             0x77, 0xfb, 0x16, 0xcd, 0xfb, 0x1c, 0x1b, 0xfb,\n                                                             0x7f, 0xfb, 0x35, 0xfb, 0x54, 0xfb, 0x8e, 0xfb,\n                                                             0x31, 0xce, 0xfb, 0x31, 0xf7, 0x75, 0xf7, 0x62,\n                                                             0xf0, 0xf7, 0x1b, 0xf7, 0x9, 0xb6, 0x1f, 0xe,\n                                                             0x57, 0xa, 0xd7, 0x16, 0xf7, 0x98, 0x6, 0xf7,\n                                                             0x7c, 0xf7, 0x65, 0xf7, 0x24, 0xf7, 0xa7, 0xf7,\n                                                             0x71, 0xfb, 0x3, 0xd9, 0xfb, 0x81, 0x1f, 0xfb,\n                                                             0x58, 0x6, 0xa0, 0xfc, 0xec, 0x15, 0xf3, 0xf8,\n                                                             0x76, 0x5, 0xe1, 0x6, 0xd8, 0xf4, 0x86, 0xfb,\n                                                             0x44, 0xfb, 0x8a, 0xfb, 0x38, 0x54, 0xfb, 0x17,\n                                                             0x1f, 0xe, 0xab, 0x8b, 0xf7, 0xc, 0xf7, 0x56,\n                                                             0xf7, 0xc, 0xf7, 0x38, 0x8b, 0xa, 0xf8, 0xc4,\n                                                             0x6, 0xa5, 0x83, 0xa, 0xfc, 0x31, 0x6, 0xb3,\n                                                             0xf7, 0x56, 0x5, 0xf7, 0xfe, 0x40, 0xa, 0xfb,\n                                                             0xfe, 0x6, 0xad, 0xf7, 0x38, 0x5, 0xf8, 0x14,\n                                                             0x40, 0xa, 0xfc, 0xa7, 0x6, 0xe, 0x84, 0xa,\n                                                             0xf7, 0xc5, 0xf7, 0xc, 0xf7, 0x41, 0x8b, 0xa,\n                                                             0x5e, 0xa, 0xcc, 0xf7, 0xc5, 0x5, 0xf7, 0xeb,\n                                                             0x40, 0xa, 0xfb, 0xea, 0x6, 0xaf, 0xf7, 0x41,\n                                                             0x5, 0xf7, 0xfe, 0x40, 0xa, 0xfc, 0x93, 0x6,\n                                                             0xe, 0x8c, 0xa, 0xf7, 0x2e, 0xf7, 0xf, 0xf7,\n                                                             0x77, 0xf7, 0x12, 0x1, 0xf7, 0x0, 0xf7, 0x25,\n                                                             0x3, 0xf8, 0x4c, 0xf7, 0x99, 0x15, 0xf7, 0x4e,\n                                                             0x6, 0x74, 0xfb, 0x0, 0x5, 0x81, 0x78, 0x3d,\n                                                             0x67, 0x32, 0x1b, 0x4d, 0x25, 0x98, 0xf7, 0x3b,\n                                                             0xf7, 0x28, 0xd1, 0xf7, 0x44, 0xf7, 0x55, 0xd3,\n                                                             0xc9, 0x6d, 0x2f, 0xa7, 0x1f, 0xf7, 0x1f, 0x9a,\n                                                             0x5, 0xf7, 0x3a, 0x71, 0xfb, 0x15, 0xce, 0xfb,\n                                                             0x28, 0x1b, 0xfb, 0xb2, 0xfb, 0xc, 0xfb, 0x97,\n                                                             0xfb, 0x55, 0xfb, 0x49, 0xee, 0xfb, 0xf, 0xf7,\n                                                             0x63, 0xf7, 0x26, 0xf7, 0x9, 0xc4, 0xab, 0xbb,\n                                                             0x1f, 0xcd, 0xf7, 0xce, 0x5, 0xfb, 0xda, 0x6,\n                                                             0xe, 0x68, 0xa, 0xf7, 0xd4, 0xf7, 0xd, 0xf7,\n                                                             0xa9, 0x77, 0x1, 0xd2, 0x16, 0x5e, 0xa, 0xcf,\n                                                             0xf7, 0xd4, 0x5, 0xf7, 0xad, 0x6, 0x47, 0xfb,\n                                                             0xd4, 0x5, 0x5e, 0xa, 0xf7, 0x2c, 0xf9, 0x62,\n                                                             0x53, 0xa, 0x50, 0xfb, 0xa9, 0x5, 0xfb, 0xad,\n                                                             0x6, 0xc5, 0xf7, 0xa9, 0x5a, 0xa, 0xe, 0xfb,\n                                                             0xf9, 0x37, 0xa, 0xcb, 0x16, 0x5e, 0xa, 0xf7,\n                                                             0x2d, 0xf9, 0x62, 0x5, 0x97, 0xa, 0xe, 0x3c,\n                                                             0x79, 0xf7, 0x11, 0xf8, 0xf7, 0x77, 0x1, 0xc7,\n                                                             0xf7, 0x5b, 0x15, 0xfb, 0x20, 0xbb, 0x3e, 0xf7,\n                                                             0x32, 0xf7, 0x5b, 0xb7, 0xf7, 0xd, 0xf7, 0x45,\n                                                             0xb0, 0x1e, 0xe6, 0xf8, 0x4a, 0x7b, 0xa, 0x30,\n                                                             0xfc, 0x4a, 0x85, 0xa, 0x6f, 0x6a, 0x66, 0x4c,\n                                                             0x1b, 0x2f, 0x98, 0xcf, 0xb1, 0x8d, 0x1f, 0xe,\n                                                             0xe2, 0x37, 0xa, 0xe2, 0x16, 0x5e, 0xa, 0xb9,\n                                                             0xf7, 0x70, 0xf7, 0x20, 0xf7, 0xe, 0xf7, 0x48,\n                                                             0xfb, 0xea, 0x5, 0xf7, 0x3d, 0x6, 0xfb, 0x83,\n                                                             0xf8, 0x49, 0xf7, 0xd9, 0xf7, 0xad, 0x5, 0xfb,\n                                                             0x5c, 0x6, 0xfb, 0xe1, 0xfb, 0xc4, 0x89, 0x8d,\n                                                             0xcb, 0xf7, 0xc2, 0x53, 0xa, 0xe, 0x87, 0xa,\n                                                             0xd7, 0x16, 0xf8, 0x92, 0x50, 0xa, 0xfb, 0xff,\n                                                             0x6, 0xf7, 0x10, 0xf8, 0xe9, 0x7b, 0xa, 0xe,\n                                                             0xf7, 0x5a, 0x37, 0xa, 0xf7, 0xe1, 0xf7, 0x3,\n                                                             0x3, 0xd0, 0x16, 0x82, 0xa, 0xf7, 0x6, 0xf8,\n                                                             0xec, 0x5c, 0xa, 0xa6, 0xfc, 0xec, 0x5, 0xf7,\n                                                             0x20, 0x6, 0xf7, 0xb0, 0xf8, 0xe7, 0x8d, 0x89,\n                                                             0xfb, 0x23, 0xfc, 0xe5, 0x5, 0xf7, 0x1c, 0x6,\n                                                             0xf7, 0x2c, 0xf9, 0x62, 0x5, 0xfb, 0x6b, 0x6,\n                                                             0xfb, 0x8a, 0xfc, 0x8b, 0x51, 0xa, 0x76, 0xf8,\n                                                             0x8b, 0x5, 0xfb, 0x69, 0x6, 0xe, 0xe2, 0x37,\n                                                             0xa, 0xd0, 0xf9, 0x76, 0x3, 0x8a, 0xa, 0xf2,\n                                                             0xf8, 0x77, 0x5c, 0xa, 0xf7, 0x59, 0xfc, 0x77,\n                                                             0x5, 0x9b, 0xa, 0xf7, 0x2d, 0xf9, 0x62, 0x3d,\n                                                             0xa, 0x25, 0xfc, 0x74, 0x51, 0xa, 0xfb, 0x5a,\n                                                             0xf8, 0x74, 0x65, 0xa, 0x8c, 0xa, 0xf8, 0x8c,\n                                                             0xf7, 0x12, 0x1, 0xf7, 0x17, 0xf7, 0x2a, 0xf8,\n                                                             0xf, 0xf7, 0x2a, 0x3, 0xf6, 0xf7, 0xb1, 0x15,\n                                                             0xfb, 0x22, 0xe3, 0xfb, 0x36, 0xf7, 0x69, 0xf7,\n                                                             0xb1, 0xf7, 0x16, 0xf7, 0x93, 0xf7, 0x55, 0xf7,\n                                                             0x48, 0xfb, 0x6, 0xf7, 0x14, 0xfb, 0x53, 0xfb,\n                                                             0xc9, 0x25, 0xfb, 0xaf, 0xfb, 0x3d, 0x1e, 0xf7,\n                                                             0x2a, 0x16, 0xf7, 0x37, 0xf0, 0xf7, 0x37, 0xf7,\n                                                             0x29, 0xf7, 0x3, 0xc2, 0x33, 0x2b, 0xfb, 0x9,\n                                                             0x3b, 0xfb, 0x5f, 0xfb, 0x3c, 0x2a, 0x44, 0xd5,\n                                                             0xf3, 0x1e, 0xe, 0xab, 0xa0, 0x76, 0xf7, 0xa6,\n                                                             0xf7, 0xc, 0xf7, 0x60, 0x8b, 0xa, 0xf7, 0x27,\n                                                             0x6, 0xc4, 0xf7, 0xa6, 0x5, 0xea, 0x6, 0xf7,\n                                                             0x51, 0xf7, 0x42, 0xba, 0xf7, 0x60, 0xf7, 0x49,\n                                                             0xfb, 0x3c, 0x97, 0x57, 0x1f, 0xfb, 0xb9, 0x6,\n                                                             0xdb, 0xfb, 0xd8, 0x15, 0xb6, 0xf7, 0x60, 0x5,\n                                                             0xf6, 0x6, 0xd6, 0xc9, 0x8d, 0x40, 0xfb, 0xb,\n                                                             0xfb, 0x19, 0x7f, 0xfb, 0x1, 0x1f, 0xe, 0xf7,\n                                                             0x23, 0x6c, 0x76, 0xdb, 0xf7, 0xa, 0xf8, 0x6d,\n                                                             0xf7, 0xa, 0x36, 0xa, 0xf8, 0xc4, 0xc0, 0x15,\n                                                             0xa4, 0x6b, 0xb3, 0x5e, 0xca, 0x6f, 0xd3, 0xe3,\n                                                             0x18, 0x67, 0x9e, 0x67, 0xa5, 0x6d, 0xa6, 0x8,\n                                                             0xf7, 0x4, 0xe1, 0xc0, 0xf7, 0x1b, 0xf7, 0xb,\n                                                             0x1a, 0xf7, 0x3f, 0xfb, 0x7, 0xf7, 0xa, 0xfb,\n                                                             0x50, 0xfb, 0xd0, 0x2a, 0xfb, 0xa8, 0xfb, 0x29,\n                                                             0xfb, 0x1f, 0xe6, 0xfb, 0x25, 0xf7, 0x66, 0xc1,\n                                                             0xba, 0x92, 0x9d, 0xbe, 0x1e, 0xfb, 0x35, 0xf7,\n                                                             0x35, 0x15, 0xb8, 0x7b, 0xb0, 0x67, 0x85, 0x1a,\n                                                             0x81, 0x5a, 0x8b, 0x86, 0x32, 0x3a, 0xbd, 0xf7,\n                                                             0x8, 0xf7, 0x15, 0xe6, 0xf7, 0x46, 0xf7, 0x33,\n                                                             0xf7, 0x2, 0xc3, 0x3d, 0x2e, 0x5a, 0x75, 0xfb,\n                                                             0x9, 0x3c, 0x3f, 0x1e, 0x62, 0xb8, 0x65, 0xa3,\n                                                             0x65, 0x9d, 0x8, 0xe, 0x68, 0xa, 0xf7, 0xbb,\n                                                             0xf7, 0x4, 0xf7, 0x53, 0x96, 0xa, 0xf9, 0x25,\n                                                             0xf7, 0x27, 0x3, 0xd7, 0x16, 0xf7, 0x29, 0x6,\n                                                             0xca, 0xf7, 0xbb, 0x5, 0xc7, 0x6, 0xb7, 0xa8,\n                                                             0x8b, 0x5d, 0xab, 0x1f, 0xb5, 0x50, 0xce, 0xfb,\n                                                             0x50, 0x89, 0x1a, 0xf7, 0x34, 0x6, 0x60, 0xf7,\n                                                             0x1, 0x51, 0xf7, 0x1f, 0x4b, 0xc4, 0x8, 0xf7,\n                                                             0x0, 0x9a, 0xf7, 0x5, 0xbe, 0xf7, 0x32, 0x1a,\n                                                             0xf7, 0x51, 0xfb, 0x36, 0x8b, 0x47, 0x1e, 0xfb,\n                                                             0xd5, 0x6, 0xde, 0xfb, 0xcb, 0x15, 0xb3, 0xf7,\n                                                             0x53, 0x5, 0xf7, 0x38, 0x6, 0xbc, 0xcf, 0x8b,\n                                                             0x44, 0xfb, 0x4, 0xfb, 0x1c, 0x83, 0x21, 0x1f,\n                                                             0xe, 0xab, 0x78, 0xf7, 0x12, 0xf8, 0x92, 0x96,\n                                                             0xa, 0xdc, 0xf7, 0x7a, 0x15, 0xfb, 0x53, 0xf7,\n                                                             0x28, 0x51, 0xf7, 0x24, 0xf7, 0x67, 0xdf, 0xf7,\n                                                             0x0, 0xf7, 0x0, 0xf7, 0x10, 0x34, 0xc3, 0xfb,\n                                                             0x14, 0xc2, 0x1e, 0x35, 0xae, 0x59, 0x8e, 0xbf,\n                                                             0x1a, 0xd8, 0xe7, 0x9d, 0xa5, 0xd1, 0xcd, 0x70,\n                                                             0x3a, 0x1e, 0xf7, 0x27, 0x92, 0x5, 0xf7, 0x2d,\n                                                             0xfb, 0x1f, 0xcf, 0xfb, 0x23, 0xfb, 0x65, 0x53,\n                                                             0xfb, 0x13, 0x33, 0xfb, 0x12, 0xe5, 0x64, 0xf7,\n                                                             0x15, 0x54, 0x1e, 0xdc, 0x68, 0xb8, 0x79, 0x57,\n                                                             0x1a, 0x3e, 0x32, 0x7e, 0x57, 0xfb, 0x23, 0x88,\n                                                             0xce, 0xca, 0x89, 0x1e, 0xe, 0x84, 0xa, 0xf8,\n                                                             0xe9, 0xf7, 0xd, 0x1, 0xf7, 0x77, 0x16, 0xf7,\n                                                             0x2d, 0x6, 0xf7, 0x15, 0xf8, 0xe9, 0x5, 0xf7,\n                                                             0x6c, 0x6, 0xa5, 0xf7, 0xd, 0x5, 0xfc, 0xdd,\n                                                             0x6, 0x71, 0xfb, 0xd, 0x5, 0xf7, 0x6c, 0x6,\n                                                             0xe, 0xe2, 0x78, 0xf7, 0x11, 0xf8, 0xf8, 0x77,\n                                                             0x1, 0xf7, 0x8, 0xf7, 0x2b, 0x3, 0xf7, 0x66,\n                                                             0xf9, 0x62, 0x15, 0x39, 0xfc, 0x20, 0x5, 0x84,\n                                                             0x67, 0x86, 0x67, 0x65, 0x1a, 0xfb, 0xd, 0x8c,\n                                                             0xc1, 0xfb, 0x2, 0xf7, 0x5f, 0x1b, 0xf7, 0xa5,\n                                                             0xb6, 0xf7, 0x60, 0xf7, 0x1d, 0xa8, 0x1f, 0xe0,\n                                                             0xf8, 0x20, 0x5, 0xfb, 0x2c, 0x6, 0x36, 0xfc,\n                                                             0x20, 0x5, 0xfb, 0x11, 0x71, 0x49, 0x30, 0x2d,\n                                                             0x1b, 0x36, 0x6e, 0xba, 0xc8, 0xb0, 0x8f, 0xb1,\n                                                             0x92, 0xac, 0x1f, 0xdf, 0xf8, 0x20, 0x5, 0xe,\n                                                             0xab, 0x37, 0xa, 0xf7, 0xb6, 0x16, 0xf7, 0x26,\n                                                             0x6, 0xf8, 0x1, 0xf9, 0x62, 0x91, 0xa, 0xfb,\n                                                             0xa6, 0xfc, 0xb3, 0x51, 0xa, 0x39, 0xf8, 0xb3,\n                                                             0x5b, 0xa, 0xe, 0xf7, 0xc9, 0x37, 0xa, 0xf7,\n                                                             0x4a, 0xf7, 0x14, 0xf7, 0xb5, 0xf7, 0x3, 0x3,\n                                                             0xf7, 0x57, 0x16, 0xf7, 0x26, 0x6, 0xf7, 0x8d,\n                                                             0xf8, 0xa0, 0x5c, 0xa, 0x9a, 0xfc, 0xa0, 0x8d,\n                                                             0xa, 0xf7, 0xe0, 0xf9, 0x62, 0x5, 0xfb, 0x1d,\n                                                             0x6, 0xfb, 0x75, 0xfc, 0x85, 0x51, 0xa, 0x7c,\n                                                             0xf8, 0x85, 0x5, 0xfb, 0x2e, 0x6, 0xfb, 0x7e,\n                                                             0xfc, 0x8a, 0x51, 0xa, 0x85, 0xf8, 0x8a, 0x81,\n                                                             0xa, 0xab, 0x37, 0xa, 0x99, 0x16, 0xf7, 0x49,\n                                                             0x6, 0xf7, 0x50, 0xf7, 0x7b, 0xf3, 0xfb, 0x7b,\n                                                             0x5, 0xf7, 0x33, 0x6, 0xfb, 0x3b, 0xf7, 0xe8,\n                                                             0xf7, 0xcc, 0xf8, 0xe, 0x5, 0xfb, 0x45, 0x6,\n                                                             0xfb, 0x5f, 0xfb, 0x8b, 0xfb, 0xa, 0xf7, 0x8b,\n                                                             0x7b, 0xa, 0xf7, 0x3e, 0xfb, 0xf6, 0x5, 0xe,\n                                                             0xab, 0x37, 0xa, 0xf7, 0x3c, 0xf9, 0x12, 0x3,\n                                                             0x64, 0xa, 0xf7, 0x9e, 0xf7, 0xcc, 0xf8, 0x58,\n                                                             0x43, 0xa, 0xfb, 0x5d, 0xfb, 0xc7, 0xfb, 0x10,\n                                                             0xf7, 0xc7, 0x5a, 0xa, 0xf7, 0x51, 0xfc, 0x4a,\n                                                             0x5, 0xe, 0x84, 0xa, 0xf8, 0xe9, 0xf7, 0xd,\n                                                             0x1, 0xa4, 0x16, 0xf8, 0xfb, 0x6, 0xa6, 0xf7,\n                                                             0x9, 0x5, 0x8a, 0xfc, 0x33, 0x8c, 0x8b, 0x1e,\n                                                             0xf8, 0x62, 0xf8, 0x7d, 0xa2, 0xf7, 0x4, 0x5,\n                                                             0xfc, 0xcf, 0x6, 0x6f, 0xfb, 0xd, 0x5, 0xf8,\n                                                             0x5, 0x6, 0xfc, 0x5b, 0xfc, 0x78, 0x5, 0xe,\n                                                             0x7f, 0xa, 0xf7, 0x48, 0x35, 0x15, 0xf7, 0x29,\n                                                             0xf9, 0x4e, 0x5, 0xf7, 0x1, 0x6, 0xa3, 0xf7,\n                                                             0x2, 0x5, 0xfb, 0x89, 0x6, 0xfb, 0x58, 0xfe,\n                                                             0x2a, 0x5, 0xf7, 0x89, 0x6, 0xa3, 0xf7, 0x2,\n                                                             0x5, 0xe, 0xfb, 0xf9, 0x78, 0xa, 0xf7, 0x10,\n                                                             0xf7, 0x87, 0x3, 0xf7, 0x85, 0x78, 0x15, 0xf7,\n                                                             0x12, 0x6, 0xfb, 0x7, 0xf9, 0x88, 0x5, 0xfb,\n                                                             0x14, 0x6, 0xe, 0x7f, 0xa, 0x91, 0x35, 0x15,\n                                                             0x73, 0xfb, 0x2, 0x5, 0xf7, 0x89, 0x6, 0xf7,\n                                                             0x58, 0xfa, 0x2a, 0x5, 0xfb, 0x89, 0x6, 0x73,\n                                                             0xfb, 0x2, 0x5, 0xf7, 0x2, 0x6, 0xfb, 0x29,\n                                                             0xfd, 0x4e, 0x5, 0xe, 0x58, 0xf7, 0xec, 0x76,\n                                                             0xf8, 0xb, 0x77, 0x1, 0xf7, 0x17, 0xf7, 0xd7,\n                                                             0x15, 0xf7, 0x1c, 0x6, 0xe9, 0xf7, 0x79, 0xea,\n                                                             0xfb, 0x79, 0x5, 0x82, 0xa, 0xfb, 0x42, 0xf8,\n                                                             0xb, 0x5, 0x20, 0x6, 0xe, 0x3c, 0xfb, 0x11,\n                                                             0xbd, 0x1, 0x70, 0x40, 0x15, 0x59, 0xf8, 0xcb,\n                                                             0xbd, 0x7, 0xe, 0x72, 0xa, 0xf7, 0x8c, 0xf8,\n                                                             0xf0, 0x15, 0xf4, 0x6, 0x47, 0xf7, 0x26, 0x53,\n                                                             0xa, 0xe, 0x42, 0xa, 0xf7, 0xf1, 0xf2, 0x76,\n                                                             0xa, 0xf8, 0x1a, 0x89, 0x2f, 0xa, 0x13, 0xb0,\n                                                             0x99, 0xa, 0xaa, 0xb2, 0x1a, 0xab, 0x7c, 0xf7,\n                                                             0x3, 0x33, 0xa, 0x80, 0x5, 0xb8, 0x98, 0xb1,\n                                                             0x9b, 0xb8, 0x1b, 0xce, 0xa8, 0x5a, 0x55, 0x70,\n                                                             0x1f, 0x6c, 0x80, 0x54, 0x86, 0x50, 0x86, 0x8,\n                                                             0x42, 0x86, 0xfb, 0x2f, 0x81, 0xfb, 0x34, 0x1a,\n                                                             0x28, 0xd6, 0x50, 0xe1, 0x1e, 0x30, 0xa, 0x99,\n                                                             0xf7, 0x8a, 0x15, 0x60, 0x81, 0x77, 0x20, 0x20,\n                                                             0x1b, 0x5a, 0x77, 0xa1, 0xa7, 0xca, 0xdc, 0xa2,\n                                                             0xe7, 0x97, 0x1f, 0xe, 0x73, 0x7d, 0xf6, 0x41,\n                                                             0x76, 0xf8, 0x45, 0xf0, 0xf7, 0x4e, 0x77, 0x12,\n                                                             0xf7, 0x67, 0xf7, 0x18, 0xf7, 0x36, 0xf7, 0x20,\n                                                             0x13, 0x7c, 0xc8, 0x89, 0x15, 0xf7, 0x18, 0x6,\n                                                             0x9d, 0xe1, 0x5c, 0xa, 0x13, 0xb4, 0x73, 0x96,\n                                                             0xb4, 0x41, 0xf7, 0x7, 0x1b, 0xf7, 0x25, 0xf7,\n                                                             0xc, 0xf7, 0x23, 0xf7, 0x4f, 0xf7, 0x5, 0x57,\n                                                             0xf2, 0xfb, 0x1b, 0x42, 0x5f, 0x6c, 0x73, 0x6b,\n                                                             0x1f, 0xbe, 0xf7, 0x85, 0x44, 0xa, 0x13, 0x74,\n                                                             0xb3, 0xfc, 0x90, 0x15, 0xf7, 0x3, 0xc4, 0xf7,\n                                                             0x2, 0xe6, 0xc1, 0xba, 0x60, 0x3f, 0x1e, 0x13,\n                                                             0xb4, 0x38, 0x5e, 0xfb, 0x1c, 0x25, 0x4c, 0x64,\n                                                             0xc5, 0xc6, 0x1e, 0xe, 0x3c, 0x7d, 0xf7, 0x5,\n                                                             0xf7, 0xe8, 0xf6, 0x1, 0xda, 0xf7, 0x23, 0x3,\n                                                             0xf8, 0x38, 0xf7, 0x5b, 0x15, 0x36, 0x6d, 0x4f,\n                                                             0x7c, 0x70, 0x1b, 0x63, 0x62, 0xb2, 0xd0, 0xe0,\n                                                             0xb3, 0xf7, 0x27, 0xf7, 0x5, 0xd7, 0x93, 0x48,\n                                                             0x77, 0x8d, 0x1f, 0xf7, 0x1e, 0x9a, 0x5, 0xe3,\n                                                             0x83, 0x4d, 0xe6, 0xfb, 0x25, 0x1b, 0xfb, 0x4b,\n                                                             0xfb, 0xe, 0xfb, 0x2f, 0xfb, 0x4c, 0xfb, 0x4,\n                                                             0xc6, 0xfb, 0x1, 0xf7, 0x36, 0xf7, 0x16, 0xe3,\n                                                             0xd6, 0xf7, 0x8, 0xb6, 0x1f, 0xe, 0x73, 0x7d,\n                                                             0xf6, 0x2c, 0xea, 0xf7, 0xde, 0xf7, 0x1, 0xf7,\n                                                             0x4e, 0x77, 0x12, 0x13, 0x70, 0xf8, 0x38, 0x89,\n                                                             0x15, 0xf7, 0x17, 0x6, 0xf7, 0x2d, 0xf9, 0x64,\n                                                             0x47, 0xa, 0x52, 0xfb, 0xa1, 0x5, 0x9e, 0x7e,\n                                                             0x62, 0xcb, 0x20, 0x1b, 0xfb, 0x32, 0x24, 0xfb,\n                                                             0x34, 0xfb, 0x3c, 0x1f, 0x13, 0xb0, 0xfb, 0x20,\n                                                             0xd1, 0x3d, 0xf7, 0x6, 0xe1, 0xbe, 0xb3, 0xa7,\n                                                             0xa6, 0x1e, 0x8d, 0x89, 0x5, 0x13, 0x70, 0xfb,\n                                                             0x67, 0xf7, 0x2c, 0x15, 0xe7, 0xbe, 0xf7, 0x13,\n                                                             0xe7, 0xc8, 0xb4, 0x54, 0x49, 0x3f, 0x62, 0xfb,\n                                                             0x19, 0x22, 0x4b, 0x68, 0xba, 0xcb, 0x1e, 0xe,\n                                                             0x3c, 0xf7, 0x71, 0xe3, 0xf7, 0x1a, 0xf2, 0x7d,\n                                                             0xa, 0xf7, 0x68, 0xf7, 0x71, 0x15, 0xf8, 0x8,\n                                                             0x6, 0x93, 0xae, 0x8c, 0xb8, 0x99, 0x1a, 0xf0,\n                                                             0x5e, 0xf7, 0x16, 0xfb, 0x41, 0xfb, 0x6d, 0x33,\n                                                             0xfb, 0x53, 0xfb, 0x1a, 0xfb, 0x24, 0xeb, 0x30,\n                                                             0xf7, 0x2c, 0xd7, 0xf7, 0x0, 0xa6, 0xf7, 0x15,\n                                                             0xcc, 0x1e, 0xfb, 0x19, 0xa0, 0x5, 0x7b, 0x82,\n                                                             0x6b, 0x51, 0x41, 0x1b, 0x4e, 0x59, 0xbc, 0xde,\n                                                             0x8f, 0x1f, 0x9a, 0xe3, 0x15, 0xbd, 0x96, 0xaf,\n                                                             0xdf, 0xe0, 0x1b, 0xd8, 0xa5, 0x4c, 0x44, 0x88,\n                                                             0x1f, 0xe, 0xa0, 0x76, 0xf8, 0x33, 0xf1, 0xf7,\n                                                             0x66, 0x77, 0x1, 0xe2, 0x16, 0xf7, 0x15, 0x6,\n                                                             0xda, 0xf8, 0x33, 0x5, 0xe6, 0x6, 0x9f, 0xf1,\n                                                             0x5, 0x30, 0x6, 0xda, 0x99, 0x91, 0xa4, 0xae,\n                                                             0x1b, 0x98, 0xa6, 0x86, 0x7e, 0xad, 0x1f, 0xa4,\n                                                             0xf0, 0x5, 0x9c, 0x5a, 0x5e, 0x91, 0x6d, 0x1b,\n                                                             0xfb, 0xa, 0x80, 0x28, 0xfb, 0x3, 0x6d, 0x1f,\n                                                             0x44, 0x6, 0x76, 0x25, 0x5, 0xd4, 0x6, 0xe,\n                                                             0x73, 0xfb, 0x6d, 0xf2, 0xf7, 0x3, 0xf6, 0xf7,\n                                                             0xe7, 0xf2, 0x7e, 0x77, 0x12, 0x13, 0xd0, 0xb1,\n                                                             0x6e, 0x15, 0xfb, 0x46, 0xf7, 0x40, 0x81, 0xca,\n                                                             0xf7, 0x7b, 0xa3, 0xf6, 0xf7, 0x5a, 0xb5, 0x1e,\n                                                             0xeb, 0xf8, 0x51, 0x3d, 0xa, 0x78, 0x2d, 0x51,\n                                                             0xa, 0x13, 0xe0, 0xd3, 0x68, 0x48, 0xae, 0x46,\n                                                             0x1b, 0xfb, 0x1d, 0xfb, 0x14, 0x20, 0xfb, 0x65,\n                                                             0xfb, 0x3d, 0xf2, 0x4b, 0xdd, 0xde, 0xc2, 0xb7,\n                                                             0x9e, 0x9f, 0x1f, 0x8d, 0x89, 0x5, 0xfb, 0x8,\n                                                             0x74, 0x80, 0x53, 0x24, 0x1b, 0x44, 0x80, 0xae,\n                                                             0xa7, 0x8d, 0x1f, 0x9d, 0xf7, 0xac, 0x15, 0xc5,\n                                                             0xb3, 0xf7, 0x30, 0xf4, 0xcb, 0xb4, 0x4d, 0x4a,\n                                                             0x2b, 0x53, 0xfb, 0x8, 0x2c, 0x51, 0x62, 0xb9,\n                                                             0xda, 0x1e, 0xe, 0x84, 0xa, 0xf8, 0x44, 0xef,\n                                                             0xf7, 0x4e, 0x77, 0x1, 0xf8, 0x76, 0xf7, 0x27,\n                                                             0x3, 0xcc, 0x16, 0x7c, 0xa, 0xb7, 0xf7, 0x62,\n                                                             0x5, 0xf4, 0xa2, 0xb2, 0xf7, 0xd, 0xf6, 0x1b,\n                                                             0xba, 0x98, 0x6f, 0x69, 0x76, 0x87, 0x74, 0x86,\n                                                             0x75, 0x1f, 0x49, 0xfb, 0xc4, 0x5, 0x7c, 0xa,\n                                                             0xcc, 0xf7, 0xc4, 0x5, 0x91, 0xa7, 0x92, 0xaf,\n                                                             0xae, 0x1a, 0xcd, 0x6f, 0xca, 0xfb, 0x3, 0x30,\n                                                             0x51, 0x5d, 0x73, 0x6b, 0x1e, 0xc1, 0xf7, 0x94,\n                                                             0x44, 0xa, 0xe, 0x48, 0xa, 0xf8, 0xa1, 0x77,\n                                                             0xe7, 0xf7, 0x14, 0x1, 0xd0, 0x16, 0x9b, 0xa,\n                                                             0xf7, 0x1, 0xf8, 0xa1, 0x92, 0xa, 0x9b, 0xd3,\n                                                             0x15, 0x9b, 0xa, 0xa6, 0xf7, 0x14, 0x92, 0xa,\n                                                             0xe, 0xfb, 0xf9, 0xfb, 0x55, 0x76, 0x1, 0x75,\n                                                             0x3a, 0x15, 0x77, 0xfb, 0xa, 0x5, 0x7c, 0xb6,\n                                                             0xb8, 0x8b, 0x94, 0x1b, 0xf7, 0xe, 0xb1, 0xf7,\n                                                             0x31, 0xf7, 0x1d, 0xa5, 0x1f, 0xdf, 0xf8, 0x51,\n                                                             0x5, 0xfb, 0x16, 0x6, 0x3a, 0xfc, 0x51, 0x5,\n                                                             0xfb, 0x30, 0x6c, 0x7e, 0x7e, 0x63, 0x1b, 0x80,\n                                                             0x7a, 0x8c, 0x92, 0x73, 0x1f, 0xf7, 0x7b, 0xf9,\n                                                             0x3a, 0x15, 0xf7, 0x16, 0x6, 0xa3, 0xf7, 0x14,\n                                                             0x5, 0xfb, 0x16, 0x6, 0xe, 0x3c, 0x37, 0xa,\n                                                             0xd0, 0x16, 0xf7, 0x26, 0x6, 0xae, 0xf7, 0x31,\n                                                             0xed, 0xdf, 0xd6, 0xfb, 0x85, 0x5, 0xf7, 0x26,\n                                                             0x6, 0xfb, 0x8, 0xf7, 0xdf, 0xf7, 0x6d, 0xf7,\n                                                             0x51, 0x5, 0xfb, 0x52, 0x6, 0xfb, 0x50, 0xfb,\n                                                             0x44, 0x89, 0x8d, 0xdd, 0xf8, 0x8, 0x93, 0xa,\n                                                             0xe, 0xfb, 0xf9, 0x37, 0xa, 0x8a, 0xa, 0xf7,\n                                                             0x2c, 0xf9, 0x62, 0x65, 0xa, 0xf7, 0x92, 0xa0,\n                                                             0x76, 0xf8, 0x4f, 0xf2, 0x1, 0xcb, 0x16, 0xf7,\n                                                             0x23, 0x6, 0xbe, 0xf7, 0x89, 0x5, 0xdf, 0x9d,\n                                                             0xa1, 0xf7, 0x6, 0xf2, 0x1b, 0xb5, 0x96, 0x75,\n                                                             0x6e, 0x78, 0x87, 0x75, 0x87, 0x77, 0x1f, 0x45,\n                                                             0xfb, 0xdf, 0x5, 0x7c, 0xa, 0xbe, 0xf7, 0x86,\n                                                             0x5, 0xd2, 0x98, 0xaf, 0xf7, 0x16, 0xed, 0x1b,\n                                                             0xae, 0x94, 0x68, 0x68, 0x7a, 0x89, 0x7a, 0x88,\n                                                             0x7e, 0x1f, 0x47, 0xfb, 0xda, 0x8d, 0xa, 0xd0,\n                                                             0xf7, 0xda, 0x5, 0x8f, 0xa5, 0x8f, 0xa6, 0xa5,\n                                                             0x1a, 0xd5, 0x72, 0xce, 0x23, 0x3a, 0x44, 0x5e,\n                                                             0x59, 0x6a, 0x1e, 0xe1, 0x7b, 0x40, 0x94, 0x60,\n                                                             0x1b, 0x38, 0x61, 0x77, 0x54, 0x63, 0x1f, 0x99,\n                                                             0xc9, 0x91, 0xa, 0xe, 0x84, 0xa, 0xf8, 0x4f,\n                                                             0xe5, 0x31, 0xf2, 0x12, 0x13, 0xa0, 0xcc, 0x16,\n                                                             0x7c, 0xa, 0xba, 0xf7, 0x6f, 0x5, 0xf3, 0xa1,\n                                                             0xa7, 0xf7, 0xc, 0xf7, 0x9, 0x1b, 0xb7, 0x9b,\n                                                             0x6a, 0x76, 0x6d, 0x84, 0x6d, 0x86, 0x71, 0x1f,\n                                                             0x4b, 0xfb, 0xc3, 0x5, 0xf7, 0x25, 0x6, 0xcb,\n                                                             0xf7, 0xc2, 0x5, 0x92, 0xad, 0x91, 0xb3, 0xb0,\n                                                             0x1a, 0xd2, 0x6c, 0xc9, 0xfb, 0x0, 0x34, 0x4f,\n                                                             0x5f, 0x65, 0x61, 0x1e, 0x89, 0x8d, 0x5, 0x13,\n                                                             0xc0, 0x99, 0xce, 0x5b, 0xa, 0xe, 0x73, 0x7d,\n                                                             0xf7, 0x2, 0xf7, 0xe8, 0xf7, 0x2, 0x3f, 0xa,\n                                                             0xdd, 0xf7, 0x71, 0x15, 0xfb, 0x11, 0xde, 0xfb,\n                                                             0x2, 0x38, 0xa, 0xf7, 0x37, 0x26, 0xa, 0xe,\n                                                             0x73, 0xfb, 0x4e, 0x76, 0xf7, 0x54, 0xf7, 0x4,\n                                                             0xf7, 0xe8, 0xeb, 0x2b, 0xf7, 0x1, 0x12, 0xf8,\n                                                             0x8d, 0xf7, 0x20, 0x13, 0xd8, 0x9d, 0xfb, 0x63,\n                                                             0x15, 0x7c, 0xa, 0xc5, 0xf7, 0xaa, 0x5, 0x77,\n                                                             0x98, 0xb4, 0x49, 0xf6, 0x1b, 0xf7, 0x34, 0xf3,\n                                                             0xf7, 0x32, 0xf7, 0x41, 0xf7, 0x23, 0x44, 0xe2,\n                                                             0xfb, 0x6, 0x34, 0x58, 0x62, 0x6e, 0x6f, 0x1f,\n                                                             0x89, 0x8d, 0x5, 0x13, 0xe8, 0x96, 0xc2, 0x5,\n                                                             0xfb, 0x18, 0x6, 0xe2, 0xfb, 0xcb, 0x15, 0xd8,\n                                                             0xb4, 0xf7, 0x1e, 0xf5, 0xcc, 0xae, 0x54, 0x49,\n                                                             0x2d, 0x58, 0xfb, 0x11, 0x2e, 0x4d, 0x62, 0xc3,\n                                                             0xd0, 0x1e, 0xe, 0x73, 0xfb, 0x4e, 0x76, 0xf7,\n                                                             0x54, 0xf2, 0xf7, 0xf1, 0xf7, 0x1, 0x7e, 0x77,\n                                                             0x12, 0xdb, 0xf7, 0x21, 0x13, 0xd8, 0xf8, 0x2,\n                                                             0xfb, 0x63, 0x15, 0xf7, 0x25, 0x6, 0xf7, 0x2e,\n                                                             0xf9, 0x78, 0x66, 0xa, 0x79, 0x34, 0x51, 0xa,\n                                                             0x13, 0xe8, 0xa3, 0x7f, 0x62, 0xd7, 0xfb, 0x7,\n                                                             0x1b, 0xfb, 0x26, 0xfb, 0xc, 0xfb, 0x27, 0xfb,\n                                                             0x54, 0xfb, 0x9, 0xbf, 0x22, 0xf7, 0x1b, 0xd5,\n                                                             0xb7, 0xab, 0xa4, 0xac, 0x1f, 0xfb, 0x59, 0xf7,\n                                                             0x39, 0x15, 0xe0, 0xb7, 0xf7, 0x25, 0xf2, 0xca,\n                                                             0xb2, 0x4f, 0x4e, 0xfb, 0x6, 0x52, 0xfb, 0x6,\n                                                             0x30, 0x54, 0x5d, 0xb4, 0xd9, 0x1e, 0xe, 0xfb,\n                                                             0x8a, 0xa0, 0x76, 0xf8, 0x30, 0xf7, 0xd, 0xfb,\n                                                             0xd, 0xf7, 0x1a, 0x12, 0xd7, 0xf8, 0x3d, 0x13,\n                                                             0xb0, 0xcb, 0x16, 0x82, 0xa, 0xab, 0xf7, 0x3c,\n                                                             0xa6, 0xf7, 0x17, 0xa2, 0xf7, 0x13, 0xf7, 0x30,\n                                                             0x7d, 0x19, 0xbf, 0xf7, 0xb, 0x5, 0x91, 0x7e,\n                                                             0x76, 0x94, 0x6e, 0x1b, 0x49, 0x59, 0x51, 0x51,\n                                                             0x69, 0x1f, 0x89, 0x8d, 0x5, 0x13, 0xc0, 0x9f,\n                                                             0xf0, 0x5, 0xfb, 0x12, 0x6, 0xe, 0x3c, 0x7d,\n                                                             0xef, 0xf7, 0xfc, 0xef, 0x1, 0xca, 0xf7, 0x28,\n                                                             0x15, 0xfb, 0x7, 0xab, 0xe5, 0x5c, 0xf7, 0x17,\n                                                             0x1b, 0xf7, 0x48, 0xc0, 0xf7, 0x8, 0xd3, 0xf4,\n                                                             0x20, 0xab, 0x3f, 0xa3, 0x1f, 0x44, 0xa0, 0x71,\n                                                             0x93, 0xab, 0x1a, 0xa5, 0xa3, 0xa3, 0xc4, 0x9b,\n                                                             0xd0, 0x8b, 0x4b, 0xa0, 0x1e, 0xf7, 0x14, 0xa3,\n                                                             0x5, 0xf7, 0x11, 0x70, 0xfb, 0x6, 0x9a, 0x44,\n                                                             0x1b, 0xfb, 0x32, 0x42, 0x46, 0x38, 0x35, 0xd7,\n                                                             0x4f, 0xe2, 0x6c, 0x1f, 0xe9, 0x69, 0x95, 0x85,\n                                                             0x6e, 0x1a, 0x67, 0x5d, 0x71, 0x5a, 0x41, 0x71,\n                                                             0xb3, 0xb8, 0x7b, 0x1e, 0xe, 0x9a, 0x76, 0xf8,\n                                                             0x2c, 0xee, 0xf7, 0x43, 0x77, 0x1, 0xf7, 0xda,\n                                                             0x85, 0x15, 0xa2, 0xf1, 0x5, 0x87, 0x25, 0x76,\n                                                             0x9b, 0xc7, 0x1f, 0x70, 0x6f, 0x91, 0xa8, 0x91,\n                                                             0x1f, 0xc5, 0xf7, 0xa8, 0x5, 0xe3, 0x6, 0xa1,\n                                                             0xee, 0x5, 0x33, 0x6, 0xb1, 0xf7, 0x43, 0xfb,\n                                                             0x37, 0x2c, 0x7a, 0x3b, 0x5, 0x45, 0x6, 0x75,\n                                                             0x28, 0x5, 0xd0, 0x6, 0x8b, 0x4c, 0xfb, 0xb2,\n                                                             0x73, 0x1a, 0x2e, 0xf7, 0x1b, 0x86, 0xe0, 0x1e,\n                                                             0xe, 0x59, 0xa, 0xf8, 0x4f, 0x77, 0x12, 0xed,\n                                                             0xf7, 0x27, 0x13, 0x70, 0xf8, 0x31, 0x89, 0x15,\n                                                             0xf7, 0x1a, 0x6, 0xf7, 0x3, 0xf8, 0xaa, 0x44,\n                                                             0xa, 0x57, 0xfb, 0x91, 0x5, 0x46, 0x72, 0x82,\n                                                             0xfb, 0xd, 0xfb, 0xe, 0x1b, 0x5d, 0x7c, 0xb0,\n                                                             0xb4, 0x9c, 0x8f, 0x9c, 0x8f, 0x9a, 0x1f, 0xcd,\n                                                             0xf7, 0xd0, 0x47, 0xa, 0x4a, 0xfb, 0xd0, 0x5,\n                                                             0x85, 0x6f, 0x84, 0x67, 0x67, 0x1a, 0x13, 0xb0,\n                                                             0x47, 0xa5, 0x4d, 0xf7, 0x5, 0xcf, 0xce, 0xa9,\n                                                             0xc1, 0xc2, 0x1e, 0x8c, 0x89, 0x5, 0xe, 0x3c,\n                                                             0x79, 0xa, 0xf7, 0x78, 0x16, 0xf7, 0x9, 0x6,\n                                                             0xf7, 0xcb, 0xf8, 0xa8, 0x7b, 0xa, 0xfb, 0x57,\n                                                             0xfb, 0xf8, 0x51, 0xa, 0x57, 0xf7, 0xf8, 0x5,\n                                                             0xfb, 0x1a, 0x6, 0xe, 0xf7, 0x23, 0x79, 0xa,\n                                                             0xf8, 0x79, 0xe5, 0x3, 0xf7, 0x4f, 0x16, 0xf7,\n                                                             0x15, 0x6, 0xf7, 0x2f, 0xf7, 0xea, 0x5c, 0xa,\n                                                             0xa3, 0xfb, 0xea, 0x5, 0xf7, 0x16, 0x6, 0xf7,\n                                                             0x93, 0xf8, 0xa8, 0x54, 0xa, 0xfb, 0x32, 0xfb,\n                                                             0xf7, 0x51, 0xa, 0x7a, 0xf7, 0xf7, 0x5, 0xfb,\n                                                             0x12, 0x6, 0xfb, 0x33, 0xfb, 0xf7, 0x51, 0xa,\n                                                             0x69, 0xf7, 0xf7, 0x5, 0xfb, 0xf, 0x6, 0xe,\n                                                             0x3c, 0x79, 0xa, 0x9a, 0x16, 0xf7, 0x3f, 0x6,\n                                                             0xf7, 0x16, 0xf7, 0x2b, 0xd4, 0xfb, 0x2b, 0x5,\n                                                             0xf7, 0x29, 0x6, 0xfb, 0x17, 0xf7, 0x97, 0xf7,\n                                                             0x85, 0xf7, 0xa5, 0x5, 0xfb, 0x3e, 0x6, 0xfb,\n                                                             0x18, 0xfb, 0x28, 0x41, 0xf7, 0x28, 0x53, 0xa,\n                                                             0xf7, 0x18, 0xfb, 0x96, 0x5, 0xe, 0x3c, 0xfb,\n                                                             0x6a, 0xf7, 0x9, 0xf9, 0x9, 0x77, 0x1, 0xc2,\n                                                             0x34, 0x15, 0x7e, 0xfb, 0x0, 0x5, 0x7e, 0xad,\n                                                             0xaa, 0x85, 0xa6, 0x1b, 0xe2, 0xc5, 0xcd, 0xf0,\n                                                             0xc3, 0x1f, 0xf7, 0xd1, 0xf8, 0xd7, 0x77, 0xa,\n                                                             0xfc, 0x27, 0x51, 0xa, 0x59, 0xf8, 0x27, 0x54,\n                                                             0xa, 0xe5, 0xfc, 0xa3, 0x5, 0x4c, 0x6f, 0x6c,\n                                                             0x64, 0x5c, 0x1b, 0x7d, 0x7b, 0x8e, 0x92, 0x79,\n                                                             0x1f, 0xe, 0xfb, 0x1b, 0x8b, 0xf7, 0xa, 0xf7,\n                                                             0xc1, 0xf7, 0x5, 0x1, 0x9f, 0x16, 0xf8, 0x70,\n                                                             0x6, 0xa5, 0xf7, 0xa, 0x5, 0xfb, 0xac, 0x6,\n                                                             0xf7, 0xd6, 0xf7, 0xdc, 0x9e, 0xe1, 0x5, 0xfc,\n                                                             0x5c, 0x6, 0x71, 0xfb, 0x5, 0x5, 0xf7, 0x98,\n                                                             0x6, 0xfb, 0xd3, 0xfb, 0xd5, 0x5, 0xe, 0x73,\n                                                             0xa, 0xf7, 0xb2, 0xf7, 0x7, 0x1, 0x14, 0xe0,\n                                                             0xe9, 0xf7, 0x61, 0x15, 0xef, 0x79, 0x3f, 0xfb,\n                                                             0x4, 0x74, 0x1f, 0xfb, 0x2f, 0x69, 0xb1, 0x51,\n                                                             0xf7, 0x1e, 0x1b, 0xa3, 0x6, 0xa3, 0xf7, 0x7,\n                                                             0x5, 0x49, 0x72, 0x8e, 0xcc, 0x98, 0x1f, 0xb4,\n                                                             0xf7, 0x4e, 0x82, 0xbd, 0x52, 0xb3, 0xd3, 0xb5,\n                                                             0xa8, 0xac, 0xb7, 0xf7, 0x5c, 0x8, 0xcb, 0x98,\n                                                             0xa0, 0x90, 0xd6, 0x1b, 0xa3, 0xf7, 0x7, 0x5,\n                                                             0x73, 0x6, 0xfb, 0x50, 0x77, 0x32, 0xfb, 0x23,\n                                                             0x6c, 0x1f, 0xfb, 0x9, 0x72, 0x7f, 0x57, 0x27,\n                                                             0x1b, 0xe, 0xfb, 0xf7, 0xfb, 0x50, 0x76, 0xfa,\n                                                             0x46, 0x77, 0x1, 0xbd, 0xfb, 0x65, 0x15, 0xf7,\n                                                             0x3, 0x6, 0xf7, 0x5e, 0xfa, 0x46, 0x5, 0xfb,\n                                                             0x3, 0x6, 0xe, 0x73, 0xa, 0xf8, 0x25, 0x77,\n                                                             0x1, 0x93, 0x3a, 0x15, 0x71, 0xfb, 0x7, 0x5,\n                                                             0xf7, 0x66, 0x9f, 0xe4, 0xf7, 0x23, 0xac, 0x1f,\n                                                             0xf7, 0x9, 0xa5, 0xa8, 0xbf, 0xdd, 0x1b, 0xa4,\n                                                             0xf7, 0x8, 0x5, 0x29, 0x9c, 0xd7, 0xf7, 0x4,\n                                                             0xa4, 0x1f, 0x94, 0xae, 0x8e, 0xa9, 0xa5, 0x1a,\n                                                             0xe3, 0x59, 0xad, 0xfb, 0x10, 0x1e, 0x71, 0xfb,\n                                                             0x7, 0x5, 0xc0, 0xa6, 0x89, 0x67, 0x83, 0x8a,\n                                                             0x82, 0x88, 0x7e, 0x1f, 0x61, 0xfb, 0x4e, 0x94,\n                                                             0x59, 0xc4, 0x63, 0x41, 0x61, 0x6e, 0x6a, 0x5f,\n                                                             0xfb, 0x5c, 0x8, 0x4b, 0x7c, 0x77, 0x86, 0x42,\n                                                             0x1b, 0xe, 0x58, 0xf7, 0x4d, 0x76, 0xf7, 0x47,\n                                                             0x77, 0x1, 0xf7, 0x7, 0xf8, 0x62, 0x3, 0xf7,\n                                                             0x7, 0xf7, 0x37, 0x15, 0xc2, 0xbf, 0xb3, 0x91,\n                                                             0xa6, 0x1b, 0xbc, 0xab, 0x7d, 0x7c, 0xa9, 0x1f,\n                                                             0x7b, 0xaa, 0xa9, 0x7c, 0xb4, 0x1b, 0xd0, 0xbf,\n                                                             0xbc, 0x95, 0x94, 0x1f, 0xf7, 0xc, 0x7, 0x4d,\n                                                             0x53, 0x56, 0x89, 0x81, 0x1b, 0x69, 0x6d, 0x97,\n                                                             0x98, 0x6e, 0x1f, 0x9b, 0x64, 0x66, 0x9e, 0x5d,\n                                                             0x1b, 0x75, 0x57, 0x8b, 0x4e, 0x55, 0x1f, 0xe,\n                                                             0xe2, 0x8b, 0xf7, 0xc, 0xf8, 0x6f, 0xf7, 0xf,\n                                                             0x1, 0xf7, 0x8, 0xf7, 0x1f, 0x3, 0x9f, 0xf7,\n                                                             0x94, 0x15, 0xeb, 0x6, 0xfb, 0x32, 0x9a, 0xec,\n                                                             0x29, 0xf7, 0x4b, 0x1b, 0xbb, 0xba, 0x93, 0x9a,\n                                                             0xb9, 0x1f, 0xaf, 0xf7, 0x25, 0x5, 0x6b, 0x5c,\n                                                             0x53, 0x7b, 0x4c, 0x1b, 0x38, 0x3a, 0xca, 0xd4,\n                                                             0x88, 0x1f, 0xf7, 0xda, 0x6, 0x9b, 0xd4, 0x5,\n                                                             0xfb, 0xe7, 0x6, 0x8f, 0xaa, 0x90, 0xa1, 0x8d,\n                                                             0x94, 0x8, 0xf7, 0xe9, 0x6, 0x9b, 0xd4, 0x5,\n                                                             0xfb, 0xdf, 0x6, 0xe2, 0xb9, 0xdb, 0xb7, 0xeb,\n                                                             0x1b, 0xc4, 0xb5, 0x81, 0x6a, 0xa6, 0x1f, 0xc6,\n                                                             0x55, 0xa, 0xa8, 0x5a, 0x4e, 0x9a, 0x43, 0x1b,\n                                                             0xfb, 0x49, 0xfb, 0x20, 0x23, 0xfb, 0x2a, 0x54,\n                                                             0x1f, 0xfb, 0x0, 0x6, 0x7b, 0x42, 0x5, 0xf4,\n                                                             0x6, 0x87, 0x71, 0x89, 0x76, 0x8a, 0x7c, 0x8,\n                                                             0x39, 0x6, 0xe, 0xfb, 0xf9, 0xfb, 0x11, 0x76,\n                                                             0xf7, 0x3a, 0x76, 0xf7, 0x14, 0x77, 0x1, 0xd3,\n                                                             0x8a, 0x15, 0xc9, 0x6, 0x7e, 0x52, 0x73, 0x7a,\n                                                             0x60, 0x82, 0x7e, 0x4d, 0x18, 0xf7, 0x1d, 0x3e,\n                                                             0xa, 0xfb, 0x1d, 0x6, 0xe, 0x3c, 0xfb, 0x51,\n                                                             0x76, 0xf9, 0xcf, 0x96, 0xa, 0x88, 0x3b, 0x15,\n                                                             0x5c, 0xfb, 0x3, 0x5, 0x7d, 0xb6, 0xc5, 0x86,\n                                                             0xaa, 0x1b, 0xf7, 0x15, 0xbb, 0xf7, 0xf, 0xd9,\n                                                             0xa6, 0x1f, 0xf7, 0x27, 0xf8, 0x3e, 0x5, 0xef,\n                                                             0x6, 0xae, 0xf4, 0x5, 0x27, 0x6, 0xcd, 0xa2,\n                                                             0x96, 0xa8, 0xba, 0x1b, 0xa9, 0xa9, 0x81, 0x87,\n                                                             0x98, 0x1f, 0xba, 0xf7, 0x5, 0x5, 0x9e, 0x50,\n                                                             0x52, 0x8d, 0x80, 0x1b, 0xfb, 0x1e, 0x7b, 0x35,\n                                                             0xfb, 0x15, 0x51, 0x1f, 0x2a, 0x6, 0x67, 0x22,\n                                                             0x5, 0xed, 0x6, 0xfb, 0x26, 0xfc, 0x3c, 0x5,\n                                                             0x4f, 0x77, 0x75, 0x72, 0x6b, 0x1b, 0x77, 0x78,\n                                                             0x8d, 0x95, 0x64, 0x1f, 0xe, 0xfb, 0x1b, 0xfb,\n                                                             0x11, 0x76, 0xf7, 0x25, 0xf7, 0x14, 0x1, 0xf7,\n                                                             0xbd, 0x8a, 0x61, 0xa, 0xf7, 0x1f, 0x3e, 0xa,\n                                                             0xfb, 0x1e, 0x6, 0xfb, 0x96, 0xfb, 0x14, 0x61,\n                                                             0xa, 0x56, 0xa, 0xe, 0xf8, 0x1, 0x8b, 0xf7,\n                                                             0x26, 0x1, 0xf9, 0x92, 0x16, 0x4b, 0xa, 0xfd,\n                                                             0x53, 0xfb, 0x26, 0x15, 0x4b, 0xa, 0xf7, 0xc8,\n                                                             0xfb, 0x26, 0x15, 0x4b, 0xa, 0xe, 0x3c, 0xfb,\n                                                             0x2a, 0x76, 0xf8, 0xdb, 0xf7, 0x3, 0xf7, 0x57,\n                                                             0x77, 0x1, 0xf7, 0x45, 0xfb, 0x3f, 0x15, 0xf7,\n                                                             0x18, 0x6, 0xf7, 0xc, 0xf8, 0xdb, 0x5, 0xf7,\n                                                             0x42, 0x6, 0xa2, 0xf7, 0x3, 0x5, 0xfb, 0x43,\n                                                             0x6, 0xb4, 0xf7, 0x57, 0x66, 0xa, 0x62, 0xfb,\n                                                             0x57, 0x5, 0xfb, 0x48, 0x6, 0x75, 0xfb, 0x3,\n                                                             0x5, 0xf7, 0x48, 0x6, 0xe, 0x3c, 0xfb, 0x2a,\n                                                             0x76, 0xf7, 0x42, 0xf7, 0x3, 0xf7, 0xd7, 0xf7,\n                                                             0x3, 0xf7, 0x3e, 0x77, 0x1, 0xb9, 0x8e, 0x15,\n                                                             0xf7, 0x43, 0x6, 0x69, 0xfb, 0x42, 0x5, 0xf7,\n                                                             0x14, 0x6, 0xad, 0xf7, 0x42, 0x5, 0xf7, 0x3d,\n                                                             0x89, 0xa, 0xcc, 0xf7, 0xd7, 0x5, 0xf7, 0x3e,\n                                                             0x89, 0xa, 0xac, 0xf7, 0x3e, 0x5, 0xfb, 0x13,\n                                                             0x6, 0x69, 0xfb, 0x3e, 0x5, 0xfb, 0x44, 0x6,\n                                                             0x75, 0xfb, 0x3, 0x5, 0xf7, 0x43, 0x6, 0x4b,\n                                                             0xfb, 0xd7, 0x5, 0xfb, 0x44, 0x6, 0xe, 0x72,\n                                                             0xa, 0xf7, 0xa, 0xf8, 0xf0, 0x8f, 0xa, 0xe4,\n                                                             0xe1, 0xb3, 0x35, 0x5, 0xf1, 0x6, 0x4c, 0xf7,\n                                                             0x26, 0x81, 0xa, 0xf8, 0x1, 0x7a, 0xdb, 0x4e,\n                                                             0x76, 0xf9, 0x1d, 0xdb, 0x12, 0x13, 0x60, 0xf7,\n                                                             0x3e, 0xf8, 0x6f, 0x15, 0x9b, 0xa1, 0xf7, 0x1f,\n                                                             0xc3, 0x9b, 0x9e, 0x76, 0x6e, 0x75, 0x77, 0xfb,\n                                                             0x17, 0x4f, 0x6a, 0x8b, 0xaa, 0x9c, 0x1e, 0x47,\n                                                             0xfc, 0x82, 0x15, 0xed, 0x6, 0xf8, 0x6a, 0xf9,\n                                                             0x6d, 0x5, 0x26, 0x6, 0xfc, 0x81, 0xfb, 0x7f,\n                                                             0x15, 0xfb, 0x1, 0xd3, 0x79, 0xba, 0xf7, 0x1c,\n                                                             0xb8, 0xf7, 0x36, 0xd1, 0xb5, 0x79, 0xe3, 0x21,\n                                                             0xfb, 0x2f, 0x76, 0xfb, 0x6b, 0x77, 0x1e, 0xf7,\n                                                             0xd7, 0xfc, 0x1, 0x15, 0x13, 0xa0, 0xfb, 0x1,\n                                                             0xd1, 0x79, 0xbb, 0xf7, 0x1c, 0xb8, 0xf7, 0x3e,\n                                                             0xd0, 0xb5, 0x79, 0xdc, 0x21, 0x74, 0xa, 0xa1,\n                                                             0xf7, 0x1f, 0xc3, 0x9a, 0x9e, 0x7e, 0x6d, 0x76,\n                                                             0x77, 0xfb, 0x1e, 0x51, 0x69, 0x8b, 0xaa, 0x9b,\n                                                             0x1e, 0xf7, 0x8b, 0x16, 0xfb, 0x1, 0xd1, 0x79,\n                                                             0xba, 0xf7, 0x1e, 0xb7, 0xf7, 0x3d, 0xcf, 0xb2,\n                                                             0x7b, 0xe1, 0xfb, 0x0, 0x74, 0xa, 0xa0, 0xf7,\n                                                             0x1f, 0xc4, 0x9a, 0x9e, 0x7c, 0x6d, 0x76, 0x77,\n                                                             0xfb, 0x1c, 0x50, 0x6a, 0x8b, 0xaa, 0x9b, 0x1e,\n                                                             0xe, 0xab, 0x78, 0xf7, 0x14, 0x12, 0xdc, 0xf7,\n                                                             0x26, 0x53, 0xf7, 0x26, 0xf7, 0x5b, 0xf7, 0x2c,\n                                                             0x2a, 0xf7, 0x27, 0x13, 0xd0, 0xdc, 0xf7, 0x7e,\n                                                             0x15, 0xfb, 0x46, 0xf7, 0x28, 0x40, 0xf7, 0x24,\n                                                             0xf7, 0x67, 0xdf, 0xf7, 0x2, 0xf7, 0x1, 0xf7,\n                                                             0x12, 0x34, 0xc4, 0xfb, 0x14, 0xc2, 0x1e, 0x13,\n                                                             0xa8, 0x35, 0xb0, 0x59, 0x8e, 0xc0, 0x1a, 0xd8,\n                                                             0xe7, 0x9e, 0xa5, 0xd1, 0xc5, 0x73, 0x35, 0x93,\n                                                             0x1e, 0xf7, 0x27, 0x92, 0x5, 0xf7, 0x37, 0x80,\n                                                             0xfb, 0x14, 0xc8, 0xfb, 0x23, 0x1b, 0xfb, 0x65,\n                                                             0x53, 0xfb, 0x14, 0x32, 0xfb, 0x15, 0xe5, 0x6e,\n                                                             0xf7, 0x15, 0x53, 0x1f, 0x13, 0xd0, 0xdc, 0x68,\n                                                             0xb8, 0x6e, 0x56, 0x1a, 0x3d, 0x32, 0x7e, 0x57,\n                                                             0xfb, 0x23, 0x88, 0xcf, 0xcb, 0x89, 0x1e, 0xf7,\n                                                             0x3e, 0xf8, 0xb3, 0x15, 0xf7, 0x1d, 0x6, 0xf7,\n                                                             0x2b, 0x5d, 0xa, 0xfb, 0xd, 0x6, 0x32, 0x31,\n                                                             0x64, 0xe5, 0x5, 0x26, 0x6, 0xe, 0x58, 0xa,\n                                                             0xf7, 0x62, 0xd7, 0x15, 0xd0, 0x6, 0x5e, 0xf7,\n                                                             0x65, 0xf7, 0xf, 0xf7, 0x5b, 0x5, 0x39, 0x6,\n                                                             0xfb, 0x21, 0xfb, 0x5b, 0x5, 0xe, 0xf8, 0x1,\n                                                             0x78, 0xf7, 0xd, 0xfb, 0x1, 0xf7, 0x1, 0xfb,\n                                                             0x1, 0xf7, 0xf, 0xf7, 0x5c, 0xf7, 0xf, 0xf7,\n                                                             0x37, 0xf7, 0xf, 0xfb, 0x1, 0xf7, 0xd, 0x12,\n                                                             0xee, 0xf7, 0x19, 0x13, 0x3a, 0xf8, 0x84, 0x84,\n                                                             0x15, 0xf8, 0x88, 0x71, 0xa, 0xfb, 0xfc, 0x6,\n                                                             0xb4, 0xf7, 0x5c, 0x5, 0xf7, 0xc7, 0x71, 0xa,\n                                                             0xfb, 0xc8, 0x6, 0xac, 0xf7, 0x37, 0x5, 0xf7,\n                                                             0xdc, 0x6, 0xa4, 0xf7, 0xf, 0x5, 0xfc, 0x68,\n                                                             0x6, 0x7a, 0x39, 0x5, 0x13, 0x96, 0xd6, 0x62,\n                                                             0x3c, 0x9e, 0x57, 0x1b, 0xfb, 0x52, 0xfb, 0x3c,\n                                                             0xfb, 0x57, 0xfb, 0xab, 0xfb, 0x61, 0xf7, 0x12,\n                                                             0x3e, 0xf7, 0x12, 0xe3, 0xb4, 0xb1, 0xad, 0xa5,\n                                                             0x1f, 0x8d, 0x88, 0x5, 0x13, 0x56, 0xfb, 0xa8,\n                                                             0xf7, 0x69, 0x15, 0xf7, 0x12, 0xc5, 0xf7, 0x77,\n                                                             0xf7, 0x38, 0xe1, 0xb7, 0x4a, 0x3e, 0x4e, 0x76,\n                                                             0xfb, 0x9, 0x6f, 0x42, 0x1e, 0x6f, 0x80, 0x63,\n                                                             0x2e, 0x20, 0x1b, 0x38, 0x4d, 0xc5, 0xf2, 0x1f,\n                                                             0xe, 0xfb, 0xf9, 0xf8, 0x6f, 0x76, 0xf7, 0xa5,\n                                                             0x77, 0x1, 0xf7, 0x39, 0xf8, 0x5a, 0x8e, 0xa,\n                                                             0xa6, 0xf7, 0x15, 0x5, 0x4d, 0x6, 0x97, 0xc4,\n                                                             0xa4, 0x9a, 0xb6, 0x95, 0x98, 0xc9, 0x18, 0xfb,\n                                                             0x1e, 0x88, 0x74, 0xfb, 0x1, 0x7f, 0x54, 0x8,\n                                                             0xe, 0xfb, 0xf9, 0xf8, 0x66, 0x76, 0xf7, 0xa5,\n                                                             0x77, 0x1, 0xf7, 0x3b, 0xf8, 0x51, 0x15, 0xf7,\n                                                             0x1d, 0x3e, 0xa, 0xfb, 0x1d, 0x6, 0x70, 0xfb,\n                                                             0x15, 0x5, 0xc9, 0x6, 0x7e, 0x53, 0x73, 0x7b,\n                                                             0x60, 0x81, 0x8, 0xe, 0xfb, 0x1b, 0xf8, 0x5a,\n                                                             0xf7, 0x14, 0xf7, 0x25, 0x77, 0x1, 0xf7, 0x34,\n                                                             0xf8, 0x5a, 0x15, 0xf7, 0x1f, 0x6, 0xa6, 0xf7,\n                                                             0x14, 0x5, 0x4d, 0x6, 0x97, 0xc3, 0xa4, 0x9d,\n                                                             0xb7, 0x94, 0x97, 0xc9, 0x18, 0xfb, 0x1e, 0x88,\n                                                             0x73, 0xfb, 0x3, 0x7f, 0x55, 0x8, 0xf7, 0x64,\n                                                             0x22, 0x8e, 0xa, 0xa7, 0xf7, 0x14, 0x5, 0x4c,\n                                                             0x6, 0x98, 0xc3, 0xa3, 0x9d, 0xb7, 0x94, 0x98,\n                                                             0xc9, 0x18, 0xfb, 0x1f, 0x88, 0x74, 0xfb, 0x3,\n                                                             0x7f, 0x55, 0x8, 0xe, 0xfb, 0x1b, 0xf8, 0x66,\n                                                             0x76, 0xf7, 0x24, 0xf7, 0x15, 0x1, 0xf8, 0x1c,\n                                                             0xf8, 0x51, 0x15, 0xf7, 0x1f, 0x3e, 0xa, 0xfb,\n                                                             0x1e, 0x6, 0x6f, 0x62, 0xa, 0xfb, 0x87, 0x4d,\n                                                             0x15, 0x56, 0xa, 0x70, 0x62, 0xa, 0xe, 0xfb,\n                                                             0xb1, 0xf7, 0x6b, 0x76, 0xf7, 0xde, 0x77, 0x1,\n                                                             0xde, 0xf7, 0xfd, 0x15, 0x2f, 0xd7, 0x40, 0xe7,\n                                                             0xe7, 0xd8, 0xd5, 0xe8, 0xe9, 0x3e, 0xd0, 0x2f,\n                                                             0x2e, 0x40, 0x44, 0x2f, 0x1e, 0xe, 0x3c, 0x88,\n                                                             0xa, 0xf8, 0xd7, 0xf5, 0xfc, 0xd7, 0x6, 0xe,\n                                                             0xf8, 0x1, 0x88, 0xa, 0xfa, 0x93, 0xf5, 0xfe,\n                                                             0x93, 0x6, 0xe, 0xf8, 0xf6, 0xf7, 0x13, 0x38,\n                                                             0xde, 0x89, 0x77, 0x12, 0x13, 0x80, 0xf7, 0x5,\n                                                             0xf8, 0xf6, 0x15, 0xd4, 0x6, 0x13, 0x40, 0x8f,\n                                                             0x9a, 0x96, 0xa7, 0xae, 0x8c, 0x8, 0xaa, 0xa2,\n                                                             0x81, 0x81, 0xa3, 0x1f, 0x81, 0xa2, 0xa2, 0x80,\n                                                             0xaa, 0x1b, 0xc1, 0xbb, 0xb5, 0xdd, 0x99, 0x1f,\n                                                             0x41, 0x6, 0x72, 0x83, 0x83, 0x7a, 0x74, 0x1b,\n                                                             0x75, 0x75, 0x93, 0x93, 0x72, 0x1f, 0x13, 0x20,\n                                                             0x96, 0x6c, 0x6a, 0x98, 0x69, 0x1b, 0x13, 0x80,\n                                                             0x3d, 0x72, 0x42, 0x57, 0x80, 0x1f, 0xe, 0xf8,\n                                                             0x1, 0xf7, 0xdb, 0x76, 0xf7, 0xe7, 0xd4, 0x1,\n                                                             0xf7, 0x68, 0xe5, 0xf7, 0x58, 0xe0, 0xf7, 0xd0,\n                                                             0xe0, 0x3, 0xf7, 0x68, 0xf7, 0xc6, 0x15, 0xe5,\n                                                             0xf7, 0xe7, 0xf7, 0x2e, 0xd4, 0xfc, 0x26, 0x42,\n                                                             0xf7, 0x32, 0x6, 0xf7, 0xb2, 0xfb, 0xe7, 0x15,\n                                                             0xe0, 0xf7, 0xdc, 0x8d, 0x6, 0xf7, 0x8, 0xfb,\n                                                             0xdc, 0x5, 0xdb, 0x6, 0xf7, 0x7, 0xf7, 0xdc,\n                                                             0x5, 0x8e, 0xfb, 0xdc, 0xe0, 0xf8, 0x30, 0xfb,\n                                                             0x21, 0x6, 0x26, 0xfb, 0xaf, 0x51, 0xa, 0x25,\n                                                             0xf7, 0xaf, 0x5, 0xfb, 0x20, 0x6, 0xe, 0x3c,\n                                                             0x7d, 0xef, 0xf8, 0x94, 0xf7, 0x2c, 0x1, 0xf7,\n                                                             0x24, 0xf7, 0x1c, 0xf7, 0x26, 0xf7, 0x28, 0x3,\n                                                             0xca, 0xf7, 0x28, 0x15, 0xfb, 0x7, 0xad, 0xe9,\n                                                             0x5c, 0xf7, 0x1e, 0x1b, 0xf7, 0x51, 0xc3, 0xe5,\n                                                             0xd3, 0xf4, 0xfb, 0x4, 0xc5, 0x3a, 0xa3, 0x1f,\n                                                             0x41, 0xa1, 0x70, 0x8b, 0xab, 0x1a, 0xa4, 0xa4,\n                                                             0xab, 0xc7, 0x9b, 0xd4, 0x8b, 0x4b, 0xa2, 0x1e,\n                                                             0xf7, 0x1a, 0xa3, 0x5, 0xf7, 0x11, 0x6f, 0xfb,\n                                                             0xc, 0x9b, 0x40, 0x1b, 0xfb, 0x3a, 0x3d, 0x46,\n                                                             0x32, 0x27, 0xdc, 0x69, 0xe6, 0x6c, 0x1f, 0xef,\n                                                             0x69, 0x95, 0x7e, 0x6e, 0x1a, 0x67, 0x5a, 0x71,\n                                                             0x58, 0x3d, 0x70, 0xb3, 0xb8, 0x7a, 0x1e, 0xf7,\n                                                             0x11, 0xf8, 0x3f, 0x15, 0x82, 0xa, 0xf7, 0x2a,\n                                                             0x5d, 0xa, 0xfb, 0xc, 0x6, 0x33, 0x31, 0x64,\n                                                             0xe5, 0x5, 0x27, 0x6, 0xe, 0x58, 0xa, 0xee,\n                                                             0xd7, 0x15, 0xdd, 0x6, 0xf7, 0x21, 0xf7, 0x55,\n                                                             0x3f, 0xf7, 0x6b, 0x5, 0x46, 0x6, 0xb8, 0xfb,\n                                                             0x6b, 0x5, 0xe, 0xf7, 0xc9, 0x7d, 0xf1, 0x25,\n                                                             0xf7, 0x2, 0xf7, 0x10, 0xe3, 0xf7, 0x15, 0xf7,\n                                                             0x1, 0x24, 0xf2, 0x12, 0xdd, 0xf7, 0x21, 0xf7,\n                                                             0x98, 0xf7, 0x15, 0x13, 0xb6, 0xf8, 0xa5, 0xcc,\n                                                             0x15, 0x56, 0xb8, 0xd0, 0x71, 0xd0, 0x1b, 0xf7,\n                                                             0x2a, 0xca, 0xf7, 0x1, 0xb9, 0xa5, 0x1f, 0xfb,\n                                                             0x13, 0xa2, 0x5, 0x69, 0x7b, 0x6a, 0x61, 0x4d,\n                                                             0x1b, 0x68, 0x47, 0xa4, 0xf6, 0x8d, 0x1f, 0xf7,\n                                                             0xf6, 0x6, 0x94, 0xae, 0x8d, 0xb0, 0xaf, 0x1a,\n                                                             0xec, 0x4c, 0xf7, 0xd, 0xfb, 0x2b, 0x74, 0x33,\n                                                             0x89, 0x42, 0x39, 0x1e, 0xca, 0x51, 0x45, 0x97,\n                                                             0x53, 0x1b, 0xfb, 0xaa, 0x71, 0xfb, 0xa5, 0x4a,\n                                                             0xfb, 0xa, 0xcf, 0x23, 0xf7, 0x45, 0xd6, 0xd5,\n                                                             0xa5, 0xc0, 0xc0, 0x1f, 0xec, 0xf7, 0x87, 0x15,\n                                                             0x13, 0xae, 0xa8, 0x92, 0xa4, 0xf5, 0xe9, 0x1b,\n                                                             0xf0, 0x86, 0xfb, 0x4, 0x74, 0x8a, 0x1f, 0xfd,\n                                                             0x4, 0x27, 0x15, 0x13, 0x76, 0xf7, 0x5, 0xc0,\n                                                             0xf7, 0x8, 0xf0, 0xb7, 0xc9, 0x6f, 0x29, 0x43,\n                                                             0x65, 0xfb, 0x23, 0xfb, 0x9, 0x47, 0x66, 0xc1,\n                                                             0xc5, 0x1e, 0xe, 0xab, 0xa0, 0x76, 0xf9, 0x6d,\n                                                             0x77, 0xdf, 0xf7, 0xe, 0x1, 0x64, 0xa, 0xf7,\n                                                             0xa2, 0xf7, 0xcc, 0xf8, 0x5f, 0x43, 0xa, 0xfb,\n                                                             0x5d, 0xfb, 0xcc, 0xfb, 0x10, 0xf7, 0xcc, 0x5a,\n                                                             0xa, 0xf7, 0x51, 0xfc, 0x50, 0x5, 0x8a, 0xf8,\n                                                             0x90, 0x15, 0xf7, 0x6, 0x6, 0xa3, 0x55, 0xa,\n                                                             0xfb, 0x7, 0x6, 0xf7, 0x40, 0xfb, 0xe, 0x15,\n                                                             0xf7, 0x6, 0x6, 0xa3, 0x55, 0xa, 0xfb, 0x6,\n                                                             0x6, 0xe, 0xfb, 0x39, 0x76, 0xf8, 0xab, 0x77,\n                                                             0xcf, 0xf7, 0x1b, 0x1, 0xf7, 0x46, 0xf8, 0x21,\n                                                             0x15, 0xf7, 0x25, 0x6, 0xa9, 0xf7, 0x1b, 0x93,\n                                                             0xa, 0xfb, 0xb, 0xfc, 0xb9, 0x15, 0x65, 0xfb,\n                                                             0x3d, 0x5, 0xf7, 0x2b, 0x6, 0xb0, 0xf7, 0x3d,\n                                                             0xb9, 0xf8, 0x2, 0x5, 0x3a, 0x6, 0xe, 0x3c,\n                                                             0x2a, 0x76, 0xf6, 0xf5, 0xf7, 0xed, 0xe9, 0xe9,\n                                                             0x77, 0x1, 0xda, 0xf7, 0x1b, 0x3, 0xf7, 0x24,\n                                                             0x2c, 0x15, 0xc9, 0x74, 0xbe, 0xf7, 0x3, 0x5,\n                                                             0x89, 0x95, 0x9b, 0x89, 0xa1, 0x1b, 0xf7, 0x2f,\n                                                             0xd5, 0xf7, 0x3, 0xd8, 0xa6, 0x1f, 0xfb, 0x19,\n                                                             0x9f, 0x73, 0x50, 0x64, 0x5c, 0x4b, 0x8f, 0x19,\n                                                             0xf7, 0x1c, 0xf7, 0xd8, 0xa0, 0x79, 0x96, 0x72,\n                                                             0x8d, 0x6d, 0x19, 0xf7, 0x14, 0x99, 0x85, 0xe3,\n                                                             0x4f, 0xbb, 0x54, 0xa0, 0x19, 0xb0, 0xe2, 0x4f,\n                                                             0xa3, 0x61, 0x2b, 0x5, 0x8c, 0x85, 0x81, 0x8c,\n                                                             0x7b, 0x1b, 0xfb, 0x39, 0xfb, 0x1d, 0xfb, 0x20,\n                                                             0xfb, 0x57, 0x2a, 0xb6, 0x4f, 0xd3, 0x6b, 0x1f,\n                                                             0xb9, 0xf7, 0x2, 0x15, 0x82, 0x93, 0x7a, 0x9e,\n                                                             0xbf, 0x1a, 0xd2, 0xab, 0xf7, 0x35, 0xf7, 0x14,\n                                                             0x94, 0x1e, 0xe, 0x3c, 0x90, 0x76, 0xa6, 0x76,\n                                                             0xf7, 0xc8, 0xf7, 0x0, 0xf7, 0x61, 0xf6, 0x12,\n                                                             0xf7, 0x4b, 0xf7, 0x14, 0x13, 0xb8, 0xcb, 0x7b,\n                                                             0x15, 0x9c, 0xaa, 0xc2, 0xa3, 0xc4, 0x1b, 0xbb,\n                                                             0xa9, 0x82, 0x82, 0xaa, 0x1f, 0x13, 0x78, 0x82,\n                                                             0xa9, 0xab, 0x83, 0xbc, 0x1b, 0xc5, 0xaf, 0x9a,\n                                                             0x98, 0xaf, 0x1f, 0x61, 0xf7, 0xb, 0x5, 0x71,\n                                                             0x53, 0x68, 0x8b, 0x78, 0x1b, 0x7e, 0x41, 0x97,\n                                                             0x84, 0xad, 0x1f, 0x86, 0xa4, 0x3e, 0x97, 0x74,\n                                                             0x1b, 0x75, 0x78, 0x87, 0x81, 0x7e, 0x1f, 0x89,\n                                                             0x8d, 0xca, 0xc2, 0xad, 0xbd, 0x90, 0xdd, 0x19,\n                                                             0xe9, 0x6, 0xa2, 0xf7, 0x0, 0x7a, 0xa, 0x87,\n                                                             0xa1, 0x88, 0xa1, 0xa3, 0x1a, 0xe9, 0xc2, 0xb6,\n                                                             0xc0, 0xd7, 0x96, 0x44, 0x72, 0x8f, 0x1e, 0xf7,\n                                                             0x11, 0x98, 0x5, 0xea, 0x84, 0x4f, 0xea, 0xfb,\n                                                             0x23, 0x1b, 0xfb, 0x28, 0x2d, 0xfb, 0x8, 0xfb,\n                                                             0x14, 0x85, 0x8b, 0x75, 0x93, 0x63, 0x1f, 0x3d,\n                                                             0x6, 0x75, 0xfb, 0x0, 0x5, 0xf7, 0x3, 0x6,\n                                                             0x7e, 0xfb, 0x9, 0x23, 0x52, 0x68, 0x7c, 0x8,\n                                                             0xe, 0x3c, 0xec, 0x76, 0xb5, 0xf7, 0x16, 0xf7,\n                                                             0x69, 0xf7, 0x16, 0xb8, 0x77, 0x1, 0xdc, 0xd8,\n                                                             0x15, 0xe6, 0xd2, 0x5, 0x78, 0xa6, 0xad, 0x80,\n                                                             0xb1, 0x1b, 0xb5, 0xb7, 0x97, 0x9e, 0xae, 0x1f,\n                                                             0xb8, 0x42, 0xf7, 0x7, 0xe6, 0x5f, 0xd3, 0xaa,\n                                                             0xae, 0xa4, 0xb4, 0x99, 0xb5, 0x19, 0x92, 0xa0,\n                                                             0x91, 0xa6, 0xa7, 0x1a, 0x98, 0x8b, 0x98, 0x88,\n                                                             0x99, 0x1e, 0xe7, 0xd3, 0x55, 0xe6, 0x2e, 0x42,\n                                                             0x5, 0x95, 0x7d, 0x6e, 0x9d, 0x52, 0x1b, 0x51,\n                                                             0x60, 0x79, 0x81, 0x77, 0x1f, 0x5e, 0xd4, 0xfb,\n                                                             0x8, 0x2b, 0xb5, 0x46, 0x6e, 0x69, 0x74, 0x62,\n                                                             0x7e, 0x62, 0x19, 0x82, 0x71, 0x80, 0x60, 0x93,\n                                                             0x5c, 0x32, 0x44, 0x18, 0xf7, 0x74, 0xf7, 0x51,\n                                                             0x15, 0xc6, 0x9e, 0xc9, 0xb8, 0xc3, 0x1b, 0xb7,\n                                                             0xa8, 0x6f, 0x62, 0x80, 0x89, 0x7f, 0x87, 0x7f,\n                                                             0x1f, 0x4f, 0x77, 0x4b, 0x5a, 0x53, 0x1b, 0x53,\n                                                             0x6e, 0xbc, 0xc7, 0xa0, 0x1f, 0xe, 0x3c, 0xa0,\n                                                             0x76, 0xf7, 0x21, 0xe6, 0xf8, 0x66, 0x77, 0x1,\n                                                             0xc7, 0xf7, 0x21, 0x15, 0xf7, 0x4d, 0x6, 0x6d,\n                                                             0xfb, 0x21, 0x5, 0xf7, 0x20, 0x6, 0xab, 0xf7,\n                                                             0x21, 0x5, 0xf7, 0x4b, 0x6, 0x9f, 0xe6, 0x5,\n                                                             0xfb, 0x4c, 0x6, 0x9c, 0xd7, 0x5, 0xf7, 0x4b,\n                                                             0x6, 0x9f, 0xe7, 0x5, 0xfb, 0x13, 0x6, 0xf7,\n                                                             0x6a, 0xf7, 0xbe, 0x43, 0xa, 0xfb, 0x4b, 0xfb,\n                                                             0xbe, 0x51, 0xa, 0x40, 0xf7, 0xbe, 0x44, 0xa,\n                                                             0xe8, 0xfb, 0xbe, 0x5, 0xfb, 0xf, 0x6, 0x78,\n                                                             0x2f, 0x5, 0xf7, 0x4d, 0x6, 0x7b, 0x3f, 0x5,\n                                                             0xfb, 0x4e, 0x6, 0xe, 0xfb, 0xf7, 0x78, 0xa,\n                                                             0xdb, 0x78, 0x15, 0xf7, 0x0, 0x6, 0xce, 0xf7,\n                                                             0xc9, 0x5, 0xfb, 0x0, 0x6, 0xaa, 0xf7, 0x1d,\n                                                             0x15, 0xf7, 0x0, 0x6, 0xce, 0xf7, 0xca, 0x5,\n                                                             0xfb, 0x0, 0x6, 0xe, 0x3c, 0xfb, 0x4c, 0xe9,\n                                                             0xf9, 0x1e, 0xf7, 0x3b, 0x12, 0xf6, 0xf7, 0xd,\n                                                             0x78, 0xf7, 0x11, 0xa1, 0xf7, 0x16, 0x6b, 0xf7,\n                                                             0xa, 0x13, 0xe8, 0xc8, 0x77, 0x15, 0x35, 0x9c,\n                                                             0xd6, 0x3d, 0xf7, 0x1a, 0x1b, 0xf7, 0x1b, 0xcb,\n                                                             0xd6, 0xd5, 0xbd, 0x6f, 0xb7, 0x7d, 0x9e, 0x1f,\n                                                             0x13, 0xd4, 0xd5, 0xae, 0xc1, 0xc6, 0xd3, 0x1a,\n                                                             0xc6, 0x6e, 0xbe, 0x2f, 0xdb, 0x1e, 0x27, 0xe3,\n                                                             0x7a, 0x92, 0xb1, 0x1a, 0xa5, 0x9c, 0xb3, 0xba,\n                                                             0xcf, 0x8f, 0x4f, 0x78, 0x8d, 0x1e, 0xf7, 0x12,\n                                                             0x97, 0x5, 0xc4, 0x84, 0x72, 0xf3, 0xfb, 0x36,\n                                                             0x1b, 0xfb, 0x28, 0x5c, 0x30, 0x46, 0x75, 0x90,\n                                                             0x6d, 0xa3, 0x65, 0x1f, 0x13, 0xe8, 0x67, 0x79,\n                                                             0x2c, 0x63, 0x22, 0x1a, 0x76, 0x89, 0x4a, 0xe1,\n                                                             0x3e, 0x1e, 0xc8, 0x55, 0xf3, 0x48, 0x4a, 0x1a,\n                                                             0x83, 0x87, 0x5c, 0x4d, 0x60, 0x64, 0x9f, 0xd9,\n                                                             0x77, 0x1e, 0xf7, 0x57, 0xf7, 0x1c, 0x15, 0xfb,\n                                                             0x9, 0xf7, 0x2, 0x5, 0x65, 0xaf, 0x8b, 0x98,\n                                                             0x96, 0x1a, 0xb9, 0xad, 0xaa, 0xab, 0x9d, 0x1e,\n                                                             0x86, 0xe2, 0x40, 0x82, 0x8f, 0x1f, 0x13, 0xe4,\n                                                             0xb6, 0x64, 0xaa, 0x6e, 0x66, 0x1a, 0x5d, 0x51,\n                                                             0x71, 0x7e, 0x87, 0x1e, 0xe, 0xf8, 0xfa, 0xf7,\n                                                             0x7, 0x1, 0xf7, 0x1d, 0xf8, 0xfa, 0x69, 0xa,\n                                                             0xf7, 0x45, 0xfb, 0x7, 0x69, 0xa, 0xe, 0xf1,\n                                                             0x78, 0xd6, 0xe7, 0xd2, 0xf7, 0xab, 0xd2, 0xe8,\n                                                             0xd6, 0x1, 0xc3, 0xd8, 0xf9, 0x5, 0xd8, 0x3,\n                                                             0xf7, 0x19, 0xf7, 0xf8, 0x15, 0xf7, 0x3c, 0xf7,\n                                                             0x1d, 0xf7, 0x1e, 0xf7, 0x41, 0xf7, 0x41, 0xf7,\n                                                             0x22, 0xfb, 0x1e, 0xfb, 0x3c, 0xfb, 0x3c, 0xfb,\n                                                             0x22, 0xfb, 0x18, 0xfb, 0x41, 0xfb, 0x41, 0xfb,\n                                                             0x1d, 0xf7, 0x18, 0xf7, 0x3c, 0x1e, 0xf8, 0x2c,\n                                                             0x56, 0x15, 0x76, 0x83, 0x79, 0x4c, 0x43, 0x1b,\n                                                             0x5c, 0x57, 0xaa, 0xf5, 0xbc, 0x93, 0xe8, 0xe6,\n                                                             0xcb, 0xa4, 0x5b, 0x77, 0x93, 0x1f, 0xdd, 0x9e,\n                                                             0x5, 0xaf, 0x7d, 0x60, 0xdf, 0xfb, 0xe, 0x1b,\n                                                             0xfb, 0x13, 0x4e, 0x33, 0xfb, 0x11, 0xfb, 0x2f,\n                                                             0xed, 0x56, 0xe5, 0xcd, 0xde, 0xa9, 0xed, 0xa9,\n                                                             0x1f, 0xfc, 0xca, 0xdb, 0x15, 0xfb, 0x65, 0xf7,\n                                                             0x40, 0xfb, 0x3a, 0xf7, 0x6b, 0xf7, 0x6b, 0xf7,\n                                                             0x45, 0xf7, 0x3a, 0xf7, 0x65, 0xf7, 0x65, 0xfb,\n                                                             0x45, 0xf7, 0x40, 0xfb, 0x6b, 0xfb, 0x6b, 0xfb,\n                                                             0x40, 0xfb, 0x40, 0xfb, 0x65, 0x1e, 0xe, 0xfb,\n                                                             0x9d, 0xf7, 0xa8, 0xe3, 0xf8, 0x9, 0x77, 0x1,\n                                                             0xf7, 0xd9, 0xf7, 0xb2, 0x15, 0xf5, 0x6, 0x81,\n                                                             0xa6, 0x89, 0xa1, 0x9b, 0xe9, 0xb9, 0xe0, 0xdf,\n                                                             0x1a, 0xf7, 0xf, 0xfb, 0x15, 0x8b, 0x76, 0x6b,\n                                                             0x21, 0x8a, 0xfb, 0x16, 0x5b, 0x1e, 0xf4, 0x7b,\n                                                             0x5, 0xbe, 0xa4, 0xb3, 0x8b, 0x95, 0x1b, 0xaf,\n                                                             0xab, 0x6d, 0x53, 0x70, 0x1f, 0xfb, 0x3, 0x7e,\n                                                             0x78, 0x89, 0x65, 0x80, 0x8, 0x54, 0x7a, 0x68,\n                                                             0x4a, 0x4f, 0x1a, 0x51, 0xad, 0x56, 0xe0, 0xaf,\n                                                             0xb2, 0x98, 0xa4, 0xac, 0x1e, 0x8c, 0x7d, 0x8c,\n                                                             0x87, 0x8f, 0x81, 0x8, 0x8c, 0xf7, 0x4a, 0x15,\n                                                             0x61, 0x82, 0x7e, 0x4d, 0x4e, 0x1b, 0x73, 0x6d,\n                                                             0x9c, 0xa4, 0xb5, 0xbf, 0x94, 0xe0, 0x96, 0x1f,\n                                                             0xe, 0x3c, 0x58, 0xa, 0xf8, 0x23, 0xd7, 0x4a,\n                                                             0xa, 0x35, 0xfb, 0x6d, 0x4a, 0xa, 0xe, 0x58,\n                                                             0xf7, 0x15, 0x76, 0x1, 0xf4, 0xf7, 0xc6, 0x15,\n                                                             0xf8, 0x1, 0xfb, 0x5a, 0xf7, 0x19, 0xf7, 0xcb,\n                                                             0xfc, 0x86, 0x6, 0xe, 0x58, 0xf7, 0x59, 0xf7,\n                                                             0x4, 0x1, 0xdd, 0xf7, 0x59, 0x15, 0xf7, 0x4,\n                                                             0xf8, 0xa4, 0xfb, 0x4, 0x7, 0xe, 0xf1, 0x78,\n                                                             0xd6, 0xf7, 0xa0, 0xca, 0xf7, 0xa7, 0xd6, 0x1,\n                                                             0xc2, 0xd8, 0xf8, 0x32, 0xe4, 0xf7, 0xe, 0xd8,\n                                                             0x3, 0xf7, 0x94, 0xf7, 0x33, 0x15, 0xde, 0x6,\n                                                             0xa4, 0xf7, 0x39, 0x5, 0xa1, 0x6, 0xb5, 0xa4,\n                                                             0x85, 0x2e, 0xae, 0x1f, 0xa3, 0x49, 0x5, 0xf3,\n                                                             0x6, 0x66, 0xdc, 0x71, 0xc7, 0x81, 0x9f, 0x67,\n                                                             0x99, 0x19, 0x8d, 0x7, 0xe1, 0x96, 0xb5, 0xbd,\n                                                             0xb9, 0x1a, 0xf7, 0x15, 0xfb, 0x6, 0x7f, 0xfb,\n                                                             0xc, 0x1e, 0x38, 0x6, 0xc3, 0xfb, 0x41, 0x15,\n                                                             0x9c, 0xf7, 0x1, 0x5, 0xae, 0x6, 0xd4, 0xba,\n                                                             0x8f, 0x52, 0x52, 0x4d, 0x8c, 0x40, 0x1f, 0xfb,\n                                                             0xa9, 0x6f, 0x15, 0xf7, 0x3c, 0xf7, 0x20, 0xf7,\n                                                             0x1b, 0xf7, 0x41, 0xf7, 0x41, 0xf7, 0x1f, 0xfb,\n                                                             0x1b, 0xfb, 0x3c, 0xfb, 0x3c, 0xfb, 0x1f, 0xfb,\n                                                             0x1b, 0xfb, 0x41, 0xfb, 0x41, 0xfb, 0x20, 0xf7,\n                                                             0x1b, 0xf7, 0x3c, 0x1e, 0x3e, 0x16, 0xfb, 0x65,\n                                                             0xf7, 0x43, 0xfb, 0x3d, 0xf7, 0x6b, 0xf7, 0x6b,\n                                                             0xf7, 0x42, 0xf7, 0x3d, 0xf7, 0x65, 0xf7, 0x65,\n                                                             0xfb, 0x42, 0xf7, 0x3d, 0xfb, 0x6b, 0xfb, 0x6b,\n                                                             0xfb, 0x43, 0xfb, 0x3d, 0xfb, 0x65, 0x1e, 0xe,\n                                                             0xf8, 0xf0, 0xd5, 0x1, 0xf7, 0xe, 0xf7, 0xfd,\n                                                             0x3, 0xf7, 0xe, 0xf8, 0xf0, 0x15, 0xf7, 0xe7,\n                                                             0x6, 0xa1, 0xd5, 0x5, 0xfb, 0xe8, 0x6, 0xe,\n                                                             0xfb, 0x7f, 0xf7, 0x43, 0xd7, 0xf7, 0x20, 0xd7,\n                                                             0x3, 0xf7, 0x43, 0xf8, 0xcf, 0x15, 0x3b, 0xcc,\n                                                             0x4a, 0xdb, 0xdc, 0xcd, 0xcc, 0xdb, 0xdb, 0x49,\n                                                             0xc8, 0x3a, 0x3b, 0x4a, 0x4e, 0x3b, 0x1e, 0xd7,\n                                                             0x8a, 0x15, 0xb2, 0xab, 0xa7, 0xb1, 0xb1, 0xab,\n                                                             0x70, 0x63, 0x65, 0x6b, 0x6c, 0x65, 0x65, 0x6b,\n                                                             0xaa, 0xb1, 0x1e, 0xe, 0x58, 0x8b, 0xe7, 0xf7,\n                                                             0x4c, 0xe9, 0xf7, 0x1c, 0x77, 0x1, 0xf7, 0xaa,\n                                                             0xf7, 0x0, 0x3, 0xb3, 0x16, 0xf8, 0xdd, 0xe7,\n                                                             0xfc, 0xdd, 0x6, 0xf7, 0x4c, 0x4, 0xf7, 0x82,\n                                                             0xfb, 0x1f, 0xf7, 0x0, 0xf7, 0x1f, 0xf7, 0x83,\n                                                             0xe9, 0xfb, 0x83, 0xf7, 0x1c, 0xfb, 0x0, 0xfb,\n                                                             0x1c, 0xfb, 0x82, 0x6, 0xe, 0xf7, 0xaf, 0xe4,\n                                                             0xf7, 0x95, 0xdc, 0x1, 0xd0, 0xf7, 0xaf, 0x15,\n                                                             0xf7, 0xd8, 0x6, 0xa2, 0xe4, 0x5, 0xfb, 0x3c,\n                                                             0x6, 0xa0, 0x9c, 0xc4, 0xb1, 0x97, 0x96, 0x8,\n                                                             0xdc, 0xd3, 0xa9, 0xb3, 0xb5, 0x1a, 0xc5, 0x5d,\n                                                             0xc7, 0xfb, 0x7, 0xfb, 0x25, 0x75, 0x22, 0x6f,\n                                                             0x86, 0x1e, 0xf7, 0x4, 0x7d, 0x5, 0xa7, 0x92,\n                                                             0x94, 0xb1, 0xb9, 0x1b, 0xef, 0x30, 0xfb, 0x1,\n                                                             0x52, 0x30, 0x1f, 0x2a, 0x4e, 0x6c, 0x5d, 0x80,\n                                                             0x42, 0x8, 0xe, 0xf7, 0xa3, 0xdd, 0x39, 0xf7,\n                                                             0x1c, 0xf7, 0xc3, 0x77, 0x1, 0xe6, 0xf8, 0x26,\n                                                             0x15, 0x71, 0x8e, 0x9b, 0x22, 0xf7, 0x1b, 0x1b,\n                                                             0xf7, 0x2, 0xca, 0xda, 0xc8, 0x1f, 0xb9, 0x61,\n                                                             0x9e, 0x9f, 0x9c, 0xcc, 0xa6, 0xc0, 0x1a, 0xb8,\n                                                             0x6a, 0xd3, 0x21, 0xfb, 0xa, 0x6c, 0x33, 0x6a,\n                                                             0x7f, 0x1e, 0xed, 0x79, 0x5, 0xb0, 0x95, 0x9c,\n                                                             0x9f, 0xa8, 0x1b, 0x92, 0xad, 0x8a, 0x69, 0x4f,\n                                                             0x46, 0x92, 0x7d, 0x8d, 0x1f, 0x77, 0x34, 0x5,\n                                                             0xab, 0x95, 0xba, 0x83, 0x5d, 0x1a, 0x6d, 0x72,\n                                                             0x6f, 0x61, 0x60, 0x86, 0xaa, 0xa7, 0x86, 0x1e,\n                                                             0xe, 0xf9, 0x5, 0x76, 0xf7, 0x26, 0x77, 0x1,\n                                                             0xf7, 0x80, 0xf8, 0xf0, 0x15, 0xf2, 0x52, 0xa,\n                                                             0xe, 0x73, 0xfb, 0x4e, 0x76, 0xf7, 0x62, 0xeb,\n                                                             0x33, 0x76, 0xf8, 0xb6, 0x77, 0x12, 0x13, 0xb0,\n                                                             0xf7, 0x70, 0xc3, 0x15, 0x70, 0x9a, 0xa4, 0x60,\n                                                             0xc8, 0x1b, 0xb7, 0xa3, 0xa0, 0xb4, 0xb1, 0x1f,\n                                                             0x13, 0xd0, 0x82, 0x5a, 0x5, 0xf7, 0x14, 0x6,\n                                                             0xf7, 0x4, 0xf8, 0xa9, 0x3d, 0xa, 0x4f, 0xfb,\n                                                             0xa9, 0x5, 0x54, 0x80, 0x74, 0x22, 0x33, 0x1b,\n                                                             0x68, 0x5c, 0xa6, 0xcb, 0x1f, 0xce, 0xf7, 0xee,\n                                                             0x92, 0xa, 0xfb, 0x30, 0xfd, 0x77, 0x8d, 0xa,\n                                                             0xe, 0x3c, 0xfb, 0x3e, 0x76, 0xf9, 0x92, 0xf7,\n                                                             0x11, 0x1, 0xf7, 0xc3, 0xfb, 0x53, 0x15, 0xf7,\n                                                             0x10, 0xf9, 0x92, 0xd9, 0xfd, 0x92, 0xf7, 0xc,\n                                                             0xf9, 0x92, 0xca, 0xf7, 0x11, 0xfb, 0xcb, 0x6,\n                                                             0xfb, 0x29, 0xfb, 0x16, 0x5f, 0xfb, 0x2d, 0x5a,\n                                                             0xa4, 0xfb, 0x26, 0xf7, 0x48, 0x1f, 0xe, 0xfb,\n                                                             0xf9, 0xf7, 0x40, 0xf7, 0x36, 0x1, 0xf7, 0x2,\n                                                             0xf7, 0x40, 0x8e, 0xa, 0xa7, 0xf7, 0x36, 0x81,\n                                                             0xa, 0xfb, 0x78, 0xce, 0xf7, 0x35, 0x77, 0x1,\n                                                             0xf7, 0x18, 0xe3, 0x3, 0xbc, 0x80, 0x15, 0x7b,\n                                                             0x53, 0x5, 0x8e, 0x9d, 0x9b, 0x8e, 0x95, 0x1b,\n                                                             0x99, 0xb4, 0x87, 0x66, 0x5c, 0x48, 0x7f, 0x3c,\n                                                             0x1f, 0x74, 0x48, 0x5, 0xf7, 0x2f, 0xf1, 0xae,\n                                                             0xe6, 0xbc, 0x69, 0xc0, 0x41, 0x70, 0x76, 0x86,\n                                                             0x85, 0x7c, 0x1f, 0xe, 0xf7, 0xc4, 0x76, 0xf8,\n                                                             0x3f, 0x77, 0x1, 0xf7, 0x62, 0xf7, 0xaf, 0x15,\n                                                             0xe7, 0x6, 0xe5, 0xf8, 0x3f, 0x5, 0x51, 0x6,\n                                                             0x71, 0x6f, 0x55, 0x5f, 0x3f, 0x6b, 0x71, 0x31,\n                                                             0x18, 0xaf, 0x93, 0xb2, 0x98, 0xb4, 0xa2, 0x8,\n                                                             0xe, 0xfb, 0xa2, 0xf7, 0xa8, 0xf2, 0xf7, 0x93,\n                                                             0xf2, 0x1, 0xe7, 0xf7, 0x6, 0xf7, 0x39, 0xf7,\n                                                             0x6, 0x3, 0xe7, 0xf8, 0x57, 0x15, 0x30, 0xbe,\n                                                             0x37, 0xf7, 0xf, 0xf7, 0x3f, 0xbb, 0xf7, 0x60,\n                                                             0xd8, 0xe9, 0x50, 0xe1, 0xfb, 0xa, 0xfb, 0x2b,\n                                                             0x4a, 0xfb, 0x43, 0xfb, 0x3, 0x1e, 0xf7, 0x6,\n                                                             0x16, 0xc2, 0xa6, 0xf7, 0x14, 0xd8, 0xa8, 0xab,\n                                                             0x74, 0x55, 0x5a, 0x6f, 0xfb, 0x15, 0x3f, 0x62,\n                                                             0x77, 0xad, 0xb1, 0x1e, 0xe, 0x3c, 0x58, 0xa,\n                                                             0xf3, 0xd7, 0x4d, 0xa, 0xaa, 0xfb, 0x59, 0x4d,\n                                                             0xa, 0xe, 0xf7, 0x5b, 0x92, 0x76, 0xf9, 0x68,\n                                                             0x77, 0x1, 0xf8, 0x69, 0xc3, 0x15, 0xf7, 0x31,\n                                                             0x6, 0x7b, 0x45, 0x5, 0xd7, 0x6, 0x9c, 0xd1,\n                                                             0x5, 0xba, 0x6, 0x9b, 0xcd, 0x5, 0x5d, 0x6,\n                                                             0xbd, 0xf7, 0x70, 0x5, 0x41, 0x6, 0xfb, 0x67,\n                                                             0xfb, 0x70, 0x5, 0xdf, 0x16, 0xee, 0xf6, 0x8d,\n                                                             0x89, 0x70, 0x22, 0x5, 0xfc, 0x93, 0xfb, 0x21,\n                                                             0x15, 0xd8, 0x6, 0xf8, 0xe9, 0xf9, 0x6d, 0x5,\n                                                             0x3e, 0x6, 0xfc, 0xa5, 0xfb, 0xfd, 0x15, 0xe2,\n                                                             0x6, 0xdf, 0xf7, 0xfb, 0x5, 0x55, 0x6, 0x72,\n                                                             0x74, 0x58, 0x66, 0x44, 0x70, 0x84, 0x89, 0x18,\n                                                             0x7a, 0x41, 0xac, 0x92, 0xb0, 0x96, 0xb2, 0x9e,\n                                                             0x19, 0xe, 0xf7, 0x5b, 0x7d, 0xd5, 0x51, 0x76,\n                                                             0xf7, 0xbe, 0xcd, 0xf8, 0x1, 0x77, 0x12, 0x13,\n                                                             0x70, 0xf7, 0x18, 0x78, 0x15, 0xdd, 0x6, 0xf9,\n                                                             0xe, 0xf9, 0x6d, 0x5, 0x39, 0x6, 0xfc, 0xb8,\n                                                             0xfb, 0xfd, 0x15, 0xe7, 0x6, 0xe5, 0xf7, 0xfb,\n                                                             0x5, 0x51, 0x6, 0x71, 0x74, 0x55, 0x66, 0x3f,\n                                                             0x70, 0x83, 0x89, 0x18, 0x79, 0x41, 0xaf, 0x92,\n                                                             0xb2, 0x96, 0xb4, 0x9e, 0x19, 0x13, 0xb0, 0xf7,\n                                                             0xaa, 0xfc, 0xe8, 0x15, 0xf7, 0x97, 0x6, 0x9e,\n                                                             0xd5, 0x91, 0xa, 0x9c, 0x9a, 0x94, 0x95, 0x96,\n                                                             0x92, 0x8, 0xf7, 0x1, 0xd9, 0x9a, 0xb3, 0xaf,\n                                                             0x1a, 0xbb, 0x66, 0xbe, 0x2f, 0xfb, 0x8, 0x7a,\n                                                             0x32, 0x74, 0x87, 0x1e, 0xe4, 0x7f, 0x5, 0xa3,\n                                                             0x91, 0x92, 0xad, 0xb0, 0x1b, 0xa5, 0x97, 0x79,\n                                                             0x7c, 0x70, 0x70, 0x76, 0x3e, 0x4e, 0x1f, 0x43,\n                                                             0x51, 0x6d, 0x6b, 0x82, 0x4e, 0x8, 0xe, 0xf7,\n                                                             0x5b, 0x92, 0x76, 0xf7, 0xfa, 0xce, 0xf7, 0xbf,\n                                                             0x77, 0x12, 0xf7, 0xb4, 0xe6, 0x45, 0xe5, 0x13,\n                                                             0xf0, 0xf8, 0x6f, 0xc3, 0x15, 0xf7, 0x38, 0x6,\n                                                             0x7a, 0x45, 0x5, 0xdb, 0x6, 0x9e, 0xd1, 0x5,\n                                                             0xbb, 0x6, 0x9c, 0xcd, 0x5, 0x5b, 0x6, 0xbf,\n                                                             0xf7, 0x70, 0x5, 0x3e, 0x6, 0xfb, 0x72, 0xfb,\n                                                             0x70, 0x5, 0xe3, 0x16, 0xf3, 0xf6, 0x8d, 0x89,\n                                                             0x70, 0x22, 0x5, 0xfc, 0xa2, 0xfb, 0x21, 0x15,\n                                                             0xdd, 0x6, 0xf9, 0x5, 0xf9, 0x6d, 0x5, 0x3b,\n                                                             0x6, 0xfd, 0x28, 0xfb, 0x96, 0x15, 0x76, 0x8e,\n                                                             0x98, 0x34, 0xf7, 0x8, 0x1b, 0xe9, 0xc1, 0xcc,\n                                                             0xbe, 0x1f, 0xb3, 0x67, 0x99, 0x9c, 0x1a, 0x13,\n                                                             0xe8, 0x98, 0xc3, 0x93, 0xc8, 0x1a, 0xb0, 0x6e,\n                                                             0xc5, 0x30, 0x26, 0x71, 0x42, 0x6f, 0x81, 0x1e,\n                                                             0xdf, 0x7d, 0x5, 0xaa, 0x94, 0x99, 0x9b, 0xa4,\n                                                             0x1b, 0x90, 0xa9, 0x8a, 0x6f, 0x59, 0x50, 0x91,\n                                                             0x7e, 0x8c, 0x1f, 0x7a, 0x44, 0x5, 0x13, 0xf0,\n                                                             0xa7, 0x92, 0xb3, 0x85, 0x65, 0x1a, 0x72, 0x76,\n                                                             0x73, 0x67, 0x66, 0x87, 0xa6, 0xa2, 0x87, 0x1e,\n                                                             0xe, 0x73, 0xfb, 0x57, 0xf2, 0xf8, 0x54, 0x77,\n                                                             0xcb, 0xf7, 0x18, 0x1, 0xc0, 0xf7, 0x1a, 0x3,\n                                                             0xf8, 0x40, 0xad, 0x15, 0xfb, 0xa, 0x70, 0x43,\n                                                             0x83, 0x60, 0x1b, 0x3e, 0x75, 0xb3, 0xab, 0xb0,\n                                                             0xa1, 0xa2, 0xe1, 0xd4, 0x1f, 0xf7, 0x4, 0xeb,\n                                                             0xb5, 0xbb, 0x9a, 0xee, 0x8, 0xfb, 0x15, 0x6,\n                                                             0x80, 0x4c, 0x77, 0x7b, 0x39, 0x48, 0x8, 0xfb,\n                                                             0xa, 0x2a, 0x58, 0x55, 0x3c, 0x1a, 0x36, 0xd1,\n                                                             0x31, 0xf7, 0x35, 0xf7, 0x50, 0xd0, 0xf7, 0x1c,\n                                                             0xd1, 0x9d, 0x1e, 0xfb, 0x72, 0xf8, 0x19, 0x15,\n                                                             0x9b, 0xa, 0xa8, 0xf7, 0x18, 0x65, 0xa, 0x34,\n                                                             0xa, 0xd7, 0xf7, 0x27, 0x1, 0xf8, 0x7d, 0xf9,\n                                                             0xa9, 0x15, 0xea, 0x6, 0x4d, 0xf7, 0x27, 0x91,\n                                                             0xa, 0xfc, 0x3, 0xfe, 0x3c, 0x27, 0xa, 0x34,\n                                                             0xa, 0xf7, 0x73, 0x77, 0x1, 0xf8, 0x51, 0xf9,\n                                                             0xa8, 0x15, 0xee, 0x6, 0xf7, 0x3d, 0xf7, 0x28,\n                                                             0x5, 0xfb, 0x33, 0x6, 0xfc, 0xaa, 0xfe, 0x3c,\n                                                             0x27, 0xa, 0x34, 0xa, 0xd6, 0xf7, 0x28, 0x1,\n                                                             0xf7, 0xd5, 0xf9, 0xa8, 0x15, 0xf7, 0x9, 0x6,\n                                                             0xe0, 0xe1, 0xb1, 0x35, 0x5, 0xec, 0x6, 0x4f,\n                                                             0xf7, 0x28, 0x66, 0xa, 0xfc, 0x53, 0xfe, 0x3c,\n                                                             0x27, 0xa, 0x34, 0xa, 0xe3, 0xf7, 0xe, 0x39,\n                                                             0xdd, 0x12, 0x13, 0xe8, 0xf7, 0xed, 0xf9, 0xb2,\n                                                             0x15, 0xcc, 0x6, 0x98, 0x90, 0x94, 0xa9, 0xab,\n                                                             0x1b, 0xaa, 0xa0, 0x82, 0x80, 0x9e, 0x1f, 0x13,\n                                                             0xf0, 0x80, 0xa0, 0x9e, 0x82, 0xa7, 0x1b, 0xbb,\n                                                             0xb6, 0xb4, 0xdc, 0x98, 0x1f, 0x49, 0x6, 0x72,\n                                                             0x83, 0x84, 0x7b, 0x77, 0x1b, 0x74, 0x78, 0x94,\n                                                             0x94, 0x74, 0x1f, 0x96, 0x73, 0x71, 0x95, 0x67,\n                                                             0x1b, 0x46, 0x75, 0x43, 0x58, 0x80, 0x1f, 0xfb,\n                                                             0xd9, 0xfd, 0xb2, 0x27, 0xa, 0x34, 0xa, 0xde,\n                                                             0xf7, 0xb, 0x1, 0xf7, 0xed, 0xf9, 0xb0, 0x8f,\n                                                             0xa, 0xa4, 0xf7, 0xb, 0x5, 0xfb, 0xd, 0x6,\n                                                             0xf7, 0x4a, 0xfb, 0xb, 0x8f, 0xa, 0xa5, 0xf7,\n                                                             0xb, 0x7a, 0xa, 0xfc, 0xc3, 0xfe, 0x27, 0x27,\n                                                             0xa, 0x34, 0xa, 0xf7, 0x58, 0xc0, 0x1, 0x9f,\n                                                             0xf9, 0x3e, 0x3, 0x9f, 0x16, 0x25, 0xa, 0x29,\n                                                             0xf8, 0xdb, 0x15, 0x56, 0xb6, 0x5f, 0xc0, 0xbe,\n                                                             0xb6, 0xb5, 0xc2, 0xc3, 0x61, 0xb1, 0x57, 0x54,\n                                                             0x62, 0x64, 0x54, 0x1e, 0xbf, 0x16, 0xa3, 0x9e,\n                                                             0x9c, 0xa4, 0xa2, 0x9f, 0x7b, 0x72, 0x72, 0x77,\n                                                             0x78, 0x74, 0x73, 0x77, 0x9e, 0xa4, 0x1e, 0xe,\n                                                             0xf8, 0x1, 0x8b, 0xf7, 0xd, 0xc6, 0xf7, 0xc,\n                                                             0x98, 0xf7, 0xd, 0xf7, 0x39, 0xf7, 0xb, 0x1,\n                                                             0x90, 0x16, 0xf7, 0x2c, 0x6, 0xf1, 0xf7, 0x48,\n                                                             0x5, 0xf7, 0x83, 0x6, 0x66, 0xfb, 0x48, 0x5,\n                                                             0xf8, 0x99, 0x50, 0xa, 0xfc, 0x10, 0x6, 0xb3,\n                                                             0xf7, 0x54, 0x5, 0xf7, 0xdd, 0x50, 0xa, 0xfb,\n                                                             0xdd, 0x6, 0xaf, 0xf7, 0x39, 0x5, 0xf7, 0xf3,\n                                                             0x6, 0xa4, 0xf7, 0xb, 0x5, 0xfd, 0x39, 0x6,\n                                                             0x2c, 0xfc, 0x36, 0x15, 0xf7, 0x3e, 0xf7, 0xbf,\n                                                             0x5, 0xe2, 0x6, 0x4d, 0xfb, 0xbf, 0x5, 0xe,\n                                                             0xe2, 0xfb, 0x63, 0x76, 0xf7, 0x27, 0xf7, 0x4b,\n                                                             0xfb, 0x11, 0xf7, 0x11, 0xf8, 0x90, 0xf7, 0x13,\n                                                             0x12, 0xf6, 0xf7, 0x2c, 0xf7, 0x38, 0xed, 0x13,\n                                                             0xbc, 0xf7, 0x88, 0xfb, 0x36, 0x15, 0x70, 0x51,\n                                                             0x5, 0x83, 0xbe, 0xc7, 0x8b, 0x93, 0x1b, 0xf1,\n                                                             0xde, 0xaa, 0xd9, 0xc6, 0x5b, 0xa7, 0x51, 0x91,\n                                                             0x1f, 0x8d, 0x7, 0xf7, 0x61, 0x92, 0xe6, 0xf7,\n                                                             0x23, 0xb1, 0xf3, 0xfb, 0x2f, 0xa2, 0x18, 0xfb,\n                                                             0x9, 0x64, 0x37, 0x69, 0x4e, 0x1b, 0x27, 0x58,\n                                                             0xe6, 0xef, 0xf7, 0xb, 0x80, 0xa, 0x68, 0x92,\n                                                             0x1f, 0xf7, 0x28, 0x99, 0x5, 0xf7, 0x3e, 0x76,\n                                                             0xfb, 0x15, 0xce, 0xfb, 0x1c, 0x1b, 0xfb, 0x84,\n                                                             0xfb, 0x30, 0xfb, 0x5e, 0xfb, 0x86, 0xfb, 0x31,\n                                                             0xcd, 0xfb, 0x33, 0xf7, 0x67, 0x1f, 0x8c, 0x87,\n                                                             0x89, 0x87, 0x1b, 0x5b, 0x82, 0x73, 0x56, 0x5,\n                                                             0x13, 0xdc, 0x8e, 0x99, 0x9d, 0x8e, 0xa0, 0x1b,\n                                                             0xbd, 0x9a, 0x77, 0x79, 0x5c, 0x2e, 0x8b, 0x7c,\n                                                             0x7e, 0x5c, 0x8e, 0x8c, 0x80, 0x1f, 0xe, 0x41,\n                                                             0xa, 0xbb, 0x95, 0xa, 0xd7, 0x16, 0x2c, 0xa,\n                                                             0xf7, 0xa2, 0xbb, 0x15, 0xea, 0x6, 0x4d, 0xf7,\n                                                             0x2b, 0x5b, 0xa, 0xe, 0x41, 0xa, 0xf7, 0x5b,\n                                                             0x77, 0x1, 0xd7, 0x16, 0x2c, 0xa, 0xf7, 0x4f,\n                                                             0xbb, 0x15, 0xe9, 0x6, 0xf7, 0x32, 0xf7, 0x2b,\n                                                             0x53, 0xa, 0xe, 0x41, 0xa, 0xbb, 0x95, 0xa,\n                                                             0xd7, 0xf9, 0x3d, 0x3, 0xd7, 0x16, 0x2c, 0xa,\n                                                             0xe4, 0xbb, 0x15, 0xf7, 0x9, 0x6, 0xe0, 0xe4,\n                                                             0xb1, 0x32, 0x5, 0xec, 0x6, 0x4f, 0xf7, 0x2b,\n                                                             0x66, 0xa, 0xe, 0xab, 0x8b, 0xf7, 0xe, 0xf7,\n                                                             0x5c, 0xf7, 0x10, 0xf7, 0x3c, 0xf7, 0xf, 0x1,\n                                                             0xf7, 0xec, 0xf9, 0xad, 0x15, 0xf7, 0xd, 0x5f,\n                                                             0xa, 0xf7, 0xc, 0x4f, 0xa, 0xfb, 0xc, 0x6,\n                                                             0xfc, 0x87, 0xfe, 0x27, 0x15, 0x2c, 0xa, 0xe,\n                                                             0x4e, 0xa, 0xd0, 0x95, 0xa, 0xf7, 0xbd, 0xf9,\n                                                             0xa5, 0x15, 0xe5, 0x6, 0x50, 0x67, 0xa, 0xfb,\n                                                             0x14, 0x6, 0xfb, 0x1c, 0xfe, 0x3c, 0x15, 0xf7,\n                                                             0x3f, 0xf9, 0x74, 0x5, 0x5e, 0xa, 0xfb, 0x40,\n                                                             0xfd, 0x74, 0x5, 0xe, 0x4e, 0xa, 0xf7, 0x70,\n                                                             0x77, 0x1, 0xcb, 0x16, 0x46, 0xa, 0x90, 0xbc,\n                                                             0x15, 0xf6, 0x6, 0xf7, 0x49, 0x67, 0xa, 0xfb,\n                                                             0x3f, 0x6, 0xe, 0x4e, 0xa, 0xd0, 0x95, 0xa,\n                                                             0xf7, 0xf, 0xf9, 0xa5, 0x15, 0xf7, 0x11, 0x6,\n                                                             0xe6, 0xe4, 0xb4, 0x32, 0x5, 0xf3, 0x6, 0x4b,\n                                                             0xf7, 0x2b, 0x3d, 0xa, 0xfb, 0x6b, 0xfe, 0x3c,\n                                                             0x15, 0x46, 0xa, 0xe, 0x4e, 0xa, 0xd8, 0xf7,\n                                                             0xe, 0x1, 0xf7, 0x1f, 0xf9, 0xad, 0x6a, 0xa,\n                                                             0xf7, 0x4b, 0xfb, 0xe, 0x6a, 0xa, 0xfb, 0xc8,\n                                                             0xfe, 0x27, 0x15, 0x46, 0xa, 0xe, 0x57, 0xa,\n                                                             0xd3, 0x16, 0xf7, 0x99, 0x6, 0xf7, 0x7e, 0xf7,\n                                                             0x66, 0xf7, 0x22, 0xf7, 0xa7, 0xf7, 0x71, 0xfb,\n                                                             0x1a, 0xdb, 0xfb, 0x6c, 0x1f, 0xfb, 0x59, 0x6,\n                                                             0x49, 0xfb, 0xc3, 0x5, 0x3d, 0x6, 0x73, 0xfb,\n                                                             0x4, 0x5, 0xd8, 0x6, 0xf7, 0x5, 0xfb, 0x4d,\n                                                             0x15, 0xb2, 0xf7, 0x4d, 0x5, 0xf7, 0x32, 0x6,\n                                                             0xa3, 0xf7, 0x4, 0x5, 0xfb, 0x31, 0x6, 0xb3,\n                                                             0xf7, 0x4d, 0x5, 0xe1, 0x6, 0xd9, 0xf5, 0x84,\n                                                             0xfb, 0x44, 0xfb, 0x8a, 0xfb, 0x15, 0x56, 0xfb,\n                                                             0x3d, 0x1f, 0xe, 0x68, 0xa, 0xf9, 0x73, 0x77,\n                                                             0x1, 0x8a, 0xa, 0xf2, 0xf8, 0x82, 0x5c, 0xa,\n                                                             0xf7, 0x59, 0xfc, 0x82, 0x5, 0x9b, 0xa, 0xf7,\n                                                             0x2d, 0xf9, 0x73, 0x3d, 0xa, 0x25, 0xfc, 0x80,\n                                                             0x51, 0xa, 0xfb, 0x5a, 0xf8, 0x80, 0x3d, 0xa,\n                                                             0xf7, 0x12, 0xca, 0x15, 0xca, 0x6, 0x8f, 0x99,\n                                                             0x95, 0xaa, 0xaa, 0x89, 0xab, 0x89, 0x9e, 0x81,\n                                                             0x9c, 0x81, 0x9e, 0x81, 0x9b, 0x81, 0xab, 0x8d,\n                                                             0xba, 0x8d, 0xb6, 0xb2, 0x97, 0xdc, 0x8, 0x4a,\n                                                             0x63, 0xa, 0x77, 0x78, 0x93, 0x94, 0x76, 0x1f,\n                                                             0x96, 0x73, 0x70, 0x96, 0x67, 0x1b, 0x47, 0x75,\n                                                             0x43, 0x58, 0x82, 0x1f, 0xe, 0x49, 0xa, 0xf8,\n                                                             0x9e, 0xf9, 0xa4, 0x75, 0xa, 0xfb, 0xca, 0x2b,\n                                                             0xa, 0xf7, 0x23, 0x78, 0xf7, 0x14, 0xf9, 0xcf,\n                                                             0x77, 0x36, 0xa, 0xf8, 0x54, 0xf9, 0xa4, 0x15,\n                                                             0xea, 0x6, 0xf7, 0x37, 0x5d, 0xa, 0xfb, 0x2e,\n                                                             0x6, 0xfc, 0x51, 0x2b, 0xa, 0x49, 0xa, 0xf7,\n                                                             0xef, 0xf9, 0xa4, 0x15, 0xf7, 0xb, 0x6, 0xe2,\n                                                             0xe5, 0xb3, 0x31, 0x5, 0xee, 0x6, 0x4e, 0xf7,\n                                                             0x2c, 0x91, 0xa, 0xfc, 0x19, 0x2b, 0xa, 0xf7,\n                                                             0x23, 0x78, 0xf7, 0x13, 0xf9, 0x70, 0xde, 0x36,\n                                                             0xa, 0xf8, 0xa, 0xf9, 0xb1, 0x15, 0xcb, 0x6,\n                                                             0x99, 0x8f, 0x95, 0xa8, 0xa9, 0x1b, 0xac, 0xa0,\n                                                             0x82, 0x81, 0x9f, 0x1f, 0x80, 0x9e, 0x9d, 0x81,\n                                                             0xa4, 0x1b, 0xbb, 0xb5, 0xb4, 0xdd, 0x97, 0x1f,\n                                                             0x4a, 0x63, 0xa, 0x76, 0x79, 0x94, 0x94, 0x76,\n                                                             0x1f, 0x96, 0x74, 0x70, 0x95, 0x66, 0x1b, 0x47,\n                                                             0x75, 0x43, 0x57, 0x81, 0x1f, 0xfb, 0x9f, 0xfc,\n                                                             0x97, 0x21, 0xa, 0xe, 0x8c, 0xa, 0xf8, 0x8f,\n                                                             0xf7, 0x12, 0x36, 0xa, 0xf6, 0xf7, 0xae, 0x21,\n                                                             0xa, 0xf7, 0xc, 0xf8, 0x92, 0x15, 0xf7, 0xf,\n                                                             0x71, 0xa, 0xfb, 0x10, 0x6, 0xf7, 0x4d, 0xfb,\n                                                             0xf, 0x15, 0xf7, 0x10, 0x71, 0xa, 0xfb, 0x10,\n                                                             0x6, 0xe, 0x58, 0xa1, 0x76, 0xf8, 0x8c, 0x77,\n                                                             0x1, 0xc5, 0xec, 0x15, 0xf7, 0x0, 0x2c, 0xf7,\n                                                             0x46, 0xf7, 0x31, 0xf7, 0x49, 0xfb, 0x32, 0xf7,\n                                                             0x2, 0xec, 0xfb, 0x49, 0xf7, 0x31, 0xf7, 0x47,\n                                                             0xf7, 0x2f, 0x20, 0xea, 0xfb, 0x47, 0xfb, 0x31,\n                                                             0xfb, 0x48, 0xf7, 0x31, 0xfb, 0x2, 0x2b, 0xf7,\n                                                             0x49, 0xfb, 0x30, 0x5, 0xe, 0xf7, 0x23, 0x85,\n                                                             0x76, 0xf9, 0x98, 0x77, 0x1, 0xe0, 0xf7, 0xb,\n                                                             0xf8, 0x21, 0xf7, 0x3, 0x3, 0xf8, 0xea, 0xf8,\n                                                             0x9c, 0x15, 0x98, 0x76, 0x94, 0x55, 0x65, 0x1a,\n                                                             0xfb, 0xf, 0x23, 0xfb, 0x2b, 0xfb, 0x32, 0x5a,\n                                                             0x65, 0x8b, 0x94, 0x7b, 0x1e, 0x4f, 0xca, 0x15,\n                                                             0x80, 0x97, 0x82, 0xb2, 0xb6, 0x1a, 0xf7, 0x14,\n                                                             0xf3, 0xf7, 0x3b, 0xf7, 0x31, 0xc3, 0xb4, 0x89,\n                                                             0x84, 0x93, 0x1e, 0xfc, 0x93, 0xfc, 0xc4, 0x15,\n                                                             0xd1, 0x57, 0xd7, 0xde, 0x5, 0x6c, 0xc0, 0xc5,\n                                                             0x84, 0xc0, 0x1b, 0xf7, 0xac, 0xf7, 0x3, 0xf7,\n                                                             0x62, 0xf7, 0x4b, 0xc4, 0x87, 0xe7, 0x64, 0xc7,\n                                                             0x1f, 0xd3, 0xd8, 0x46, 0xbf, 0x44, 0x3e, 0x5,\n                                                             0xa8, 0x58, 0x4e, 0x97, 0x4e, 0x1b, 0xfb, 0xc1,\n                                                             0x31, 0xfb, 0x8c, 0xfb, 0x36, 0x59, 0x95, 0x3b,\n                                                             0xb4, 0x4f, 0x1f, 0xe, 0x2d, 0xa, 0xf7, 0x30,\n                                                             0xbc, 0x15, 0xed, 0x6, 0x4a, 0xf7, 0x2c, 0x81,\n                                                             0xa, 0x2d, 0xa, 0xb6, 0xc1, 0x60, 0xa, 0xe2,\n                                                             0x78, 0xf7, 0x14, 0xf9, 0x3c, 0xf7, 0x27, 0x24,\n                                                             0xa, 0x68, 0xc1, 0x45, 0xa, 0xe2, 0x78, 0xf7,\n                                                             0x14, 0xf9, 0x6, 0x77, 0xdb, 0xf7, 0xc, 0x24,\n                                                             0xa, 0x85, 0xc7, 0x3a, 0xa, 0xab, 0xa0, 0x76,\n                                                             0xf9, 0x74, 0x77, 0xf7, 0x70, 0x77, 0x1, 0x64,\n                                                             0xa, 0xf7, 0xa5, 0xf7, 0xcc, 0xf8, 0x63, 0x43,\n                                                             0xa, 0xfb, 0x5d, 0xfb, 0xcf, 0xfb, 0x10, 0xf7,\n                                                             0xcf, 0x5a, 0xa, 0xf7, 0x51, 0xfc, 0x55, 0x5,\n                                                             0xcb, 0xf8, 0x86, 0x15, 0xe4, 0x6, 0xf7, 0x2a,\n                                                             0xf7, 0x2b, 0x92, 0xa, 0xe, 0xab, 0xa0, 0x76,\n                                                             0xf7, 0x1d, 0xf7, 0xc, 0xf7, 0x60, 0xf7, 0xc,\n                                                             0xf7, 0x1d, 0x77, 0x1, 0xf8, 0xcc, 0xf7, 0x28,\n                                                             0x3, 0xd7, 0x16, 0xf7, 0x29, 0x6, 0xa8, 0xf7,\n                                                             0x1d, 0x5, 0xeb, 0x6, 0xf7, 0x52, 0xf7, 0x44,\n                                                             0xba, 0xf7, 0x61, 0xf7, 0x48, 0xfb, 0x3e, 0x97,\n                                                             0x57, 0x1f, 0xfb, 0x27, 0x6, 0xa8, 0xf7, 0x1d,\n                                                             0x53, 0xa, 0xbf, 0xfc, 0x61, 0x15, 0xb7, 0xf7,\n                                                             0x60, 0x5, 0xf6, 0x6, 0xd7, 0xc9, 0x8d, 0x41,\n                                                             0xfb, 0xc, 0xfb, 0x1a, 0x7f, 0xfb, 0x1, 0x1f,\n                                                             0xe, 0x73, 0x7d, 0xf7, 0x8, 0x38, 0x76, 0xf9,\n                                                             0x7, 0xf5, 0x12, 0xf8, 0x94, 0xf7, 0x25, 0x13,\n                                                             0x70, 0xd0, 0x89, 0x15, 0xf7, 0x2e, 0x6, 0xf2,\n                                                             0xf8, 0x56, 0x5, 0xe1, 0x9e, 0xa0, 0xe6, 0xe2,\n                                                             0x1b, 0xb4, 0x97, 0x7b, 0x74, 0x73, 0x77, 0x6d,\n                                                             0x79, 0x77, 0x1f, 0x61, 0x5b, 0x79, 0x61, 0x63,\n                                                             0x1a, 0x5e, 0xa4, 0x5e, 0xb2, 0x55, 0x1e, 0x9c,\n                                                             0x72, 0xa2, 0x65, 0x6e, 0x1a, 0x13, 0xb0, 0x72,\n                                                             0x7c, 0x78, 0x5c, 0x65, 0x7c, 0x9f, 0x9b, 0x7e,\n                                                             0x1e, 0xfb, 0x1, 0x53, 0x5, 0x66, 0xa7, 0xcf,\n                                                             0x50, 0xef, 0x1b, 0xf7, 0x1c, 0xbd, 0xd1, 0xdc,\n                                                             0xc1, 0x73, 0xc7, 0x68, 0xb6, 0x1f, 0x6a, 0xb2,\n                                                             0x7b, 0xa0, 0xa3, 0x1a, 0xa2, 0x98, 0x9b, 0xa0,\n                                                             0xaa, 0x1e, 0xac, 0xbb, 0xaf, 0xcf, 0xc4, 0x1a,\n                                                             0xc4, 0x5c, 0xc0, 0xfb, 0x1a, 0xfb, 0x63, 0x5a,\n                                                             0xfb, 0x0, 0xfb, 0x43, 0x61, 0x1e, 0xe, 0x42,\n                                                             0xa, 0xf8, 0x8c, 0xf7, 0x2c, 0x76, 0xa, 0xf8,\n                                                             0x1a, 0x89, 0x20, 0xa, 0x13, 0xb0, 0x2a, 0xa,\n                                                             0x70, 0xf7, 0xf2, 0x15, 0xf2, 0x6, 0x48, 0xf7,\n                                                             0x2c, 0x93, 0xa, 0xe, 0x42, 0xa, 0xf7, 0xf1,\n                                                             0xf3, 0xf7, 0x5f, 0x77, 0x12, 0xc2, 0xf7, 0x2b,\n                                                             0x13, 0x78, 0xf7, 0xe8, 0xf8, 0xea, 0x15, 0xf5,\n                                                             0x6, 0xf7, 0x49, 0x5d, 0xa, 0xfb, 0x3e, 0x6,\n                                                             0x48, 0xfd, 0x84, 0x20, 0xa, 0x13, 0xb8, 0x2e,\n                                                             0xa, 0x42, 0xa, 0xf8, 0x8c, 0xf7, 0x2c, 0x76,\n                                                             0xa, 0xf7, 0x62, 0xf8, 0xea, 0x15, 0xf7, 0x11,\n                                                             0x6, 0xe7, 0xe5, 0xb4, 0x31, 0x5, 0xf3, 0x6,\n                                                             0x4b, 0xf7, 0x2c, 0x92, 0xa, 0xa7, 0xfd, 0x84,\n                                                             0x20, 0xa, 0x13, 0xb0, 0x2e, 0xa, 0x42, 0xa,\n                                                             0xf8, 0xc5, 0xdd, 0x89, 0x77, 0x12, 0xc2, 0xf7,\n                                                             0x2b, 0x13, 0xa8, 0xf7, 0x7f, 0xf8, 0xf7, 0x15,\n                                                             0xd2, 0x6, 0x90, 0x9a, 0x95, 0xa7, 0xad, 0x8c,\n                                                             0xaa, 0x8c, 0xa6, 0x7f, 0xa6, 0x80, 0x8, 0x82,\n                                                             0xa2, 0xa0, 0x82, 0xa1, 0x1b, 0xbf, 0xba, 0xb4,\n                                                             0xdc, 0x99, 0x1f, 0x43, 0x6, 0x72, 0x83, 0x83,\n                                                             0x7b, 0x75, 0x1b, 0x77, 0x79, 0x91, 0x93, 0x76,\n                                                             0x1f, 0x13, 0x58, 0x97, 0x70, 0x6b, 0x98, 0x5e,\n                                                             0x1b, 0x40, 0x72, 0x43, 0x57, 0x80, 0x1f, 0xf7,\n                                                             0x2f, 0xfc, 0xf9, 0x20, 0xa, 0x13, 0xa8, 0x2e,\n                                                             0xa, 0x3c, 0x7d, 0xf6, 0x2c, 0xea, 0x12, 0xc2,\n                                                             0xf7, 0x22, 0x13, 0x60, 0xf7, 0x6d, 0xf8, 0xf3,\n                                                             0x6d, 0xa, 0xf7, 0x56, 0xfb, 0xe, 0x6d, 0xa,\n                                                             0x40, 0xfd, 0x6f, 0x20, 0xa, 0x13, 0xa0, 0x2e,\n                                                             0xa, 0x42, 0xa, 0xf7, 0xba, 0xf7, 0x33, 0x23,\n                                                             0xf3, 0xad, 0xf7, 0x57, 0x56, 0x77, 0x12, 0xc2,\n                                                             0xf7, 0x23, 0x13, 0xaa, 0xf7, 0xb3, 0xf9, 0x3a,\n                                                             0x15, 0x56, 0xba, 0x5f, 0xc4, 0xc3, 0xb9, 0xb5,\n                                                             0xc2, 0xc2, 0x5d, 0xb6, 0x53, 0x4f, 0x5f, 0x60,\n                                                             0x54, 0x1e, 0xc3, 0x16, 0x13, 0x56, 0xa4, 0xa0,\n                                                             0x9f, 0xa6, 0xa4, 0xa0, 0x79, 0x70, 0x73, 0x76,\n                                                             0x77, 0x72, 0x70, 0x76, 0x9f, 0xa3, 0x1e, 0xba,\n                                                             0xfd, 0x3c, 0x32, 0xa, 0x99, 0xca, 0x9a, 0xc0,\n                                                             0x1e, 0x99, 0xa, 0xab, 0xb1, 0x1a, 0xab, 0x7b,\n                                                             0xf7, 0x4, 0xfb, 0x59, 0x27, 0xfb, 0x4, 0x6b,\n                                                             0xfb, 0xd, 0x60, 0x1e, 0xf7, 0x28, 0x7f, 0x5,\n                                                             0xba, 0x98, 0xb1, 0x99, 0xb8, 0x1b, 0xcf, 0xa6,\n                                                             0x5b, 0x54, 0x71, 0x1f, 0x6c, 0x80, 0x55, 0x88,\n                                                             0x4f, 0x84, 0x8, 0x42, 0x87, 0xfb, 0x2f, 0x7d,\n                                                             0xfb, 0x33, 0x1a, 0x28, 0xd6, 0x52, 0xe1, 0x1e,\n                                                             0x13, 0xaa, 0xba, 0xcb, 0x9d, 0xc2, 0xbf, 0x1f,\n                                                             0x8e, 0x70, 0x8b, 0x82, 0x93, 0x72, 0x8, 0x99,\n                                                             0xf7, 0x7b, 0x15, 0x31, 0xa, 0x91, 0xe6, 0x98,\n                                                             0x1f, 0xe, 0xf7, 0x92, 0x7d, 0xf7, 0x1, 0xf7,\n                                                             0x11, 0xe3, 0xf7, 0x1b, 0xf2, 0x1, 0xc3, 0xf7,\n                                                             0x17, 0xf8, 0xef, 0xf7, 0x19, 0x3, 0xf7, 0x7,\n                                                             0xf8, 0x1e, 0x15, 0xf7, 0x1f, 0x7d, 0x5, 0xa4,\n                                                             0x94, 0x99, 0xb1, 0xd0, 0x1b, 0xce, 0xa2, 0x60,\n                                                             0x50, 0x7f, 0x1f, 0x7b, 0x86, 0x7c, 0x84, 0xfb,\n                                                             0x0, 0x82, 0x8, 0x35, 0x83, 0xfb, 0x23, 0x86,\n                                                             0xfb, 0x31, 0x1a, 0x28, 0xd3, 0x4a, 0xec, 0xf7,\n                                                             0x15, 0xd0, 0xe7, 0xac, 0xa3, 0x1e, 0x6e, 0x99,\n                                                             0xb8, 0x2b, 0xf7, 0x22, 0x1b, 0xf7, 0x36, 0xcf,\n                                                             0xf7, 0x11, 0xab, 0x9e, 0x1f, 0xfb, 0x17, 0x9f,\n                                                             0x5, 0x46, 0x64, 0x50, 0x8b, 0x7d, 0x1b, 0x4f,\n                                                             0x5a, 0xbb, 0xd9, 0x88, 0x1f, 0xf8, 0x7, 0x6,\n                                                             0x94, 0xb4, 0x8c, 0xb0, 0x9a, 0x1a, 0xf7, 0x1f,\n                                                             0x37, 0xe9, 0xfb, 0x1b, 0x64, 0x3f, 0x85, 0x4e,\n                                                             0x4b, 0x1e, 0x9f, 0x7f, 0x6d, 0xba, 0xfb, 0x12,\n                                                             0x1b, 0xfb, 0x1b, 0x39, 0x4d, 0x31, 0x72, 0x1f,\n                                                             0xf8, 0x4a, 0x35, 0x15, 0xf7, 0x5, 0xa4, 0xd7,\n                                                             0xa1, 0xb1, 0x1b, 0xcb, 0xb3, 0x5b, 0x34, 0x85,\n                                                             0x1f, 0xfc, 0x15, 0x52, 0x15, 0x43, 0x7c, 0x56,\n                                                             0x37, 0x3a, 0x1b, 0x55, 0x7c, 0xab, 0xa2, 0xbb,\n                                                             0xbf, 0xad, 0xf7, 0x3a, 0x9e, 0x1f, 0xe, 0x3c,\n                                                             0xfb, 0x63, 0x76, 0xf9, 0x2c, 0xf7, 0x2, 0x1,\n                                                             0xda, 0xf7, 0x23, 0xe4, 0xe2, 0x3, 0xf7, 0x8a,\n                                                             0x67, 0x15, 0x72, 0x55, 0x5, 0xa0, 0x8e, 0xd0,\n                                                             0x9b, 0x5d, 0x1a, 0x56, 0x2c, 0x8d, 0x61, 0x8c,\n                                                             0x1e, 0x71, 0x52, 0x5, 0x88, 0x9e, 0xa4, 0x8a,\n                                                             0x9e, 0x1b, 0xa6, 0xf7, 0x34, 0x8b, 0xf7, 0x3,\n                                                             0x97, 0x89, 0xc7, 0x3c, 0x98, 0x1f, 0x8d, 0x7,\n                                                             0xa7, 0x8c, 0xbc, 0x90, 0xbd, 0xad, 0xa3, 0x9a,\n                                                             0xc5, 0xb6, 0xae, 0xed, 0xfb, 0x20, 0xa3, 0x18,\n                                                             0x33, 0x6c, 0x50, 0x7c, 0x6f, 0x1b, 0x64, 0x61,\n                                                             0xb1, 0xd2, 0xe3, 0xb4, 0xf7, 0x2c, 0xf7, 0x4,\n                                                             0xd7, 0x93, 0x46, 0x77, 0x8e, 0x1f, 0xf7, 0x1d,\n                                                             0x9a, 0x5, 0xe3, 0x84, 0x4f, 0xeb, 0xfb, 0x28,\n                                                             0x1b, 0xfb, 0x3f, 0xfb, 0x1a, 0xfb, 0x1e, 0xfb,\n                                                             0x68, 0x22, 0xc9, 0x2d, 0xdd, 0x7a, 0x1f, 0x89,\n                                                             0x96, 0xb2, 0x83, 0x88, 0x1b, 0x89, 0x8a, 0x7f,\n                                                             0x89, 0x81, 0x88, 0x8, 0xe, 0x3c, 0xf7, 0x71,\n                                                             0xe3, 0xf7, 0xb5, 0xf7, 0x2c, 0x1, 0xd1, 0xf7,\n                                                             0x21, 0xf7, 0x8c, 0xf7, 0x1a, 0x3, 0xf7, 0x67,\n                                                             0xf7, 0x71, 0x23, 0xa, 0x35, 0xf7, 0xb5, 0x15,\n                                                             0xef, 0x6, 0x4a, 0xf7, 0x2c, 0x47, 0xa, 0xe,\n                                                             0x3c, 0xf7, 0x71, 0xe3, 0xf8, 0x4d, 0x77, 0x1,\n                                                             0xce, 0xf7, 0x2c, 0xf7, 0x7e, 0xf7, 0x23, 0x3,\n                                                             0xf7, 0xd8, 0xf8, 0xea, 0x15, 0xf3, 0x6, 0xf7,\n                                                             0x46, 0x5d, 0xa, 0xfb, 0x3c, 0x6, 0xfb, 0x77,\n                                                             0xfc, 0xa5, 0x23, 0xa, 0xe, 0x3c, 0x7d, 0xf2,\n                                                             0xf7, 0x18, 0xe3, 0xf7, 0xb5, 0xf7, 0x2c, 0x7d,\n                                                             0xa, 0xf7, 0x4c, 0xf8, 0xea, 0x8f, 0xa, 0xe5,\n                                                             0xe5, 0xb3, 0x31, 0x5, 0xf1, 0x6, 0x4c, 0xf7,\n                                                             0x2c, 0x54, 0xa, 0xfb, 0x12, 0xfc, 0xa5, 0x23,\n                                                             0xa, 0xe, 0x3c, 0x7d, 0xf1, 0xf7, 0x17, 0xe1,\n                                                             0x1, 0xd1, 0xf7, 0x23, 0xf7, 0x8b, 0xf7, 0x1a,\n                                                             0x3, 0xf7, 0x6b, 0xf8, 0xf3, 0x15, 0xf7, 0x13,\n                                                             0x6e, 0xa, 0xfb, 0x13, 0x6, 0xf7, 0x52, 0xfb,\n                                                             0xe, 0x15, 0xf7, 0x13, 0x6e, 0xa, 0xfb, 0x12,\n                                                             0x6, 0xfb, 0x8b, 0xfc, 0x90, 0x23, 0xa, 0xe,\n                                                             0x48, 0xa, 0xf8, 0xeb, 0x95, 0xa, 0xd0, 0x16,\n                                                             0x3c, 0xa, 0xc7, 0xd0, 0x15, 0xe7, 0x6, 0x4f,\n                                                             0x67, 0xa, 0xfb, 0x18, 0x6, 0xe, 0x48, 0xa,\n                                                             0xf9, 0x82, 0x77, 0x1, 0xf7, 0x4a, 0xf8, 0xeb,\n                                                             0x15, 0xf5, 0x6, 0xf7, 0x48, 0x67, 0xa, 0xfb,\n                                                             0x3e, 0x6, 0xfb, 0x79, 0xfd, 0x82, 0x15, 0x3c,\n                                                             0xa, 0xe, 0x48, 0xa, 0xf8, 0xeb, 0x95, 0xa,\n                                                             0xc9, 0xf8, 0xeb, 0x15, 0xf7, 0x15, 0x6, 0xe9,\n                                                             0xe4, 0xb5, 0x32, 0x5, 0xf6, 0x6, 0x49, 0x67,\n                                                             0xa, 0xfb, 0x25, 0x6, 0xfb, 0x2e, 0xfd, 0x82,\n                                                             0x15, 0x3c, 0xa, 0xe, 0x48, 0xa, 0xf8, 0xf3,\n                                                             0xf7, 0xe, 0x1, 0xe6, 0xf8, 0xf3, 0x15, 0xf7,\n                                                             0xe, 0x5f, 0xa, 0xf7, 0xe, 0x6, 0xa4, 0xf7,\n                                                             0xe, 0x5, 0xfb, 0xd, 0x6, 0xfb, 0x93, 0xfd,\n                                                             0x6d, 0x15, 0x3c, 0xa, 0xe, 0x73, 0x7d, 0xf7,\n                                                             0x3, 0xf7, 0xd8, 0xf7, 0x4, 0xf7, 0x60, 0x77,\n                                                             0x1, 0xdd, 0xf7, 0x28, 0xf7, 0xae, 0xf7, 0x2f,\n                                                             0x3, 0xf7, 0xe7, 0xf8, 0xcf, 0x15, 0xf7, 0x13,\n                                                             0xb6, 0xac, 0x52, 0x98, 0x5a, 0x93, 0x68, 0x19,\n                                                             0x88, 0x89, 0x5, 0xa4, 0x76, 0x67, 0xb0, 0x32,\n                                                             0x1b, 0xfb, 0x42, 0xfb, 0x7, 0xfb, 0x26, 0xfb,\n                                                             0x36, 0x26, 0xc2, 0xfb, 0x1e, 0xf7, 0x68, 0xf7,\n                                                             0x87, 0xd6, 0xf7, 0x4e, 0xf7, 0x18, 0xf7, 0x1e,\n                                                             0x68, 0xf7, 0x6, 0x53, 0xed, 0x1f, 0xe9, 0xad,\n                                                             0x7a, 0xbc, 0x20, 0x65, 0x81, 0x9b, 0x87, 0x91,\n                                                             0x7f, 0x9b, 0x19, 0x9a, 0xa, 0xae, 0x64, 0x93,\n                                                             0x82, 0x9c, 0x6f, 0xfb, 0x9, 0x63, 0x18, 0x30,\n                                                             0xfc, 0x20, 0x15, 0xdd, 0xc2, 0xf7, 0x6, 0xf7,\n                                                             0x6, 0xbe, 0xc9, 0x6c, 0x35, 0x57, 0x5f, 0xfb,\n                                                             0x2f, 0xfb, 0x10, 0x3c, 0x68, 0xd1, 0xc5, 0x1e,\n                                                             0xe, 0x84, 0xa, 0xf8, 0xf8, 0xf7, 0x11, 0x39,\n                                                             0xdd, 0x89, 0x77, 0x12, 0xf8, 0x84, 0xf7, 0x2a,\n                                                             0x13, 0xc8, 0xcc, 0x16, 0xf7, 0x29, 0x6, 0xbb,\n                                                             0xf7, 0x6f, 0x9d, 0xdc, 0x91, 0xad, 0xa7, 0xb0,\n                                                             0x19, 0xad, 0xa7, 0xb9, 0xb0, 0xb9, 0x1b, 0xba,\n                                                             0x9a, 0x71, 0x6a, 0x70, 0x85, 0x6c, 0x85, 0x75,\n                                                             0x1f, 0x49, 0xfb, 0xc3, 0x5, 0xf7, 0x29, 0x6,\n                                                             0xcd, 0xf7, 0xc2, 0x5, 0x94, 0xb2, 0x8f, 0xb8,\n                                                             0xb4, 0x1a, 0xc1, 0x65, 0xcb, 0x22, 0x32, 0x4d,\n                                                             0x5f, 0x65, 0x60, 0x1e, 0x89, 0x8d, 0x99, 0xce,\n                                                             0x5, 0xfb, 0x20, 0x6, 0xe3, 0xdb, 0x15, 0xcd,\n                                                             0x6, 0x13, 0xa8, 0x90, 0x99, 0x94, 0xa7, 0xab,\n                                                             0x8c, 0xa6, 0x8c, 0xa0, 0x80, 0xa1, 0x7f, 0xa1,\n                                                             0x81, 0xa0, 0x82, 0xa6, 0x8c, 0xbc, 0x8e, 0xb7,\n                                                             0xb1, 0x98, 0xdc, 0x8, 0x48, 0x6, 0x72, 0x83,\n                                                             0x84, 0x7b, 0x77, 0x1b, 0x78, 0x78, 0x91, 0x93,\n                                                             0x78, 0x1f, 0x13, 0x98, 0x97, 0x70, 0x6d, 0x98,\n                                                             0x65, 0x1b, 0x13, 0xc8, 0x44, 0x74, 0x43, 0x58,\n                                                             0x81, 0x1f, 0xe, 0x4c, 0xa, 0xdd, 0xf7, 0x70,\n                                                             0x22, 0xa, 0xf7, 0x4c, 0xf8, 0xe, 0x15, 0xee,\n                                                             0x6, 0x4b, 0xf7, 0x2c, 0x65, 0xa, 0x73, 0x7d,\n                                                             0xf7, 0x1, 0xf9, 0x23, 0x77, 0x1, 0xdd, 0xf7,\n                                                             0x28, 0xf7, 0x9d, 0xf7, 0x28, 0x3, 0xf7, 0xfe,\n                                                             0xf8, 0xea, 0x15, 0xee, 0x6, 0xf7, 0x3d, 0x5d,\n                                                             0xa, 0xfb, 0x33, 0x6, 0xfc, 0x19, 0xfc, 0xa6,\n                                                             0x22, 0xa, 0xe, 0x4c, 0xa, 0xf7, 0x73, 0xf8,\n                                                             0xea, 0x15, 0xf7, 0xd, 0x6, 0xe4, 0xe5, 0xb3,\n                                                             0x31, 0x5, 0xf0, 0x6, 0x4c, 0xf7, 0x2c, 0x5b,\n                                                             0xa, 0xfb, 0xb9, 0xfc, 0xa6, 0x22, 0xa, 0xe,\n                                                             0x73, 0x7d, 0xf7, 0x1, 0xf8, 0xc4, 0xdd, 0x89,\n                                                             0x77, 0x12, 0xdd, 0xf7, 0x26, 0xf7, 0xa4, 0xf7,\n                                                             0x26, 0x13, 0xd8, 0xf7, 0x9b, 0xf8, 0xf7, 0x15,\n                                                             0xcc, 0x6, 0x8f, 0x9a, 0x94, 0xa7, 0xab, 0x8c,\n                                                             0xa4, 0x8c, 0xa5, 0x7c, 0xa7, 0x80, 0x9f, 0x82,\n                                                             0xa0, 0x84, 0x9e, 0x8c, 0xbb, 0x8e, 0xb6, 0xb1,\n                                                             0x98, 0xdc, 0x8, 0x48, 0x63, 0xa, 0x77, 0x78,\n                                                             0x92, 0x93, 0x76, 0x1f, 0x13, 0xb8, 0x97, 0x70,\n                                                             0x6d, 0x97, 0x6a, 0x1b, 0x45, 0x74, 0x43, 0x57,\n                                                             0x82, 0x1f, 0xfb, 0x49, 0xfc, 0x1b, 0x22, 0xa,\n                                                             0xe, 0x73, 0x7d, 0xf7, 0x0, 0x3f, 0xa, 0xf7,\n                                                             0x91, 0xf8, 0xf3, 0x15, 0xf7, 0x12, 0x6e, 0xa,\n                                                             0xfb, 0x12, 0x6, 0xf7, 0x50, 0xfb, 0xe, 0x15,\n                                                             0xf7, 0x12, 0x6e, 0xa, 0xfb, 0x11, 0x6, 0xfc,\n                                                             0x30, 0xfc, 0x91, 0x22, 0xa, 0xe, 0x58, 0xf7,\n                                                             0x4d, 0xf7, 0x1d, 0x1, 0xf7, 0xa6, 0xf7, 0x24,\n                                                             0x3, 0xdd, 0xf7, 0x4d, 0x15, 0xf8, 0xa4, 0xf7,\n                                                             0x1d, 0xfc, 0xa4, 0x6, 0xf7, 0x54, 0xda, 0x15,\n                                                             0xf7, 0x24, 0xf7, 0x27, 0xfb, 0x24, 0x6, 0xfc,\n                                                             0xe2, 0x4, 0xf7, 0x24, 0xf7, 0x25, 0xfb, 0x24,\n                                                             0x6, 0xe, 0xfb, 0x8, 0x83, 0x76, 0xb1, 0xeb,\n                                                             0xf7, 0xd5, 0xeb, 0xb1, 0x77, 0x1, 0xd3, 0xf7,\n                                                             0xb, 0xf7, 0x68, 0xf7, 0xc, 0x3, 0x9e, 0x9a,\n                                                             0x15, 0xc2, 0x5f, 0xcb, 0xce, 0x5, 0x70, 0xc3,\n                                                             0xc0, 0x89, 0xac, 0x1b, 0xf7, 0x59, 0xeb, 0xf7,\n                                                             0x24, 0xf7, 0x28, 0xbf, 0x7b, 0xd0, 0x73, 0xa8,\n                                                             0x1f, 0xca, 0xcd, 0x52, 0xb6, 0x4b, 0x49, 0x5,\n                                                             0xa6, 0x56, 0x4d, 0x8c, 0x72, 0x1b, 0xfb, 0x97,\n                                                             0x69, 0xfb, 0x6c, 0x32, 0x48, 0x9b, 0x59, 0xa2,\n                                                             0x78, 0x1f, 0xe3, 0xe7, 0x15, 0x88, 0x93, 0x86,\n                                                             0x98, 0xa2, 0x1a, 0xd7, 0xc2, 0xf7, 0x19, 0xf7,\n                                                             0x7, 0xb0, 0x9e, 0x80, 0x87, 0x94, 0x1e, 0xfb,\n                                                             0x47, 0xfb, 0xb8, 0x15, 0xf7, 0x76, 0xf7, 0x82,\n                                                             0x5, 0x8e, 0x80, 0x92, 0x73, 0x76, 0x1a, 0x49,\n                                                             0x5d, 0xfb, 0x16, 0xfb, 0x13, 0x67, 0x7b, 0x94,\n                                                             0x90, 0x80, 0x1e, 0xe, 0x59, 0xa, 0xf8, 0x91,\n                                                             0xf7, 0x2c, 0x29, 0xa, 0x79, 0xf8, 0xa5, 0x75,\n                                                             0xa, 0xe, 0x59, 0xa, 0xf9, 0x29, 0x77, 0x29,\n                                                             0xa, 0x21, 0xf8, 0xaa, 0x60, 0xa, 0x59, 0xa,\n                                                             0xf8, 0x96, 0xf7, 0x27, 0x29, 0xa, 0xfb, 0x74,\n                                                             0xf8, 0xaa, 0x45, 0xa, 0x59, 0xa, 0x12, 0x13,\n                                                             0x40, 0x28, 0xa, 0x13, 0x80, 0x35, 0xa, 0x13,\n                                                             0x40, 0xfb, 0x2f, 0xf8, 0xb0, 0x3a, 0xa, 0x3c,\n                                                             0xfb, 0x55, 0x76, 0xfa, 0x58, 0x77, 0x1, 0xcb,\n                                                             0xf8, 0xf6, 0x3, 0xc2, 0x30, 0x15, 0x7e, 0xfb,\n                                                             0x0, 0x7e, 0xa, 0xcb, 0xee, 0xc2, 0x1f, 0xf7,\n                                                             0xd1, 0xf8, 0xd9, 0x77, 0xa, 0xfc, 0x28, 0x51,\n                                                             0xa, 0x59, 0xf8, 0x28, 0x54, 0xa, 0xe5, 0xfc,\n                                                             0xa4, 0x5, 0x4e, 0x6c, 0xa, 0xf7, 0xa5, 0xf9,\n                                                             0x46, 0x15, 0xe7, 0x6, 0xf7, 0x31, 0xf7, 0x2b,\n                                                             0x94, 0xa, 0xe, 0x73, 0xfb, 0x4f, 0x76, 0xf7,\n                                                             0x51, 0xf6, 0xf7, 0xea, 0xf0, 0xf7, 0x4f, 0x77,\n                                                             0x1, 0x9d, 0xf7, 0x23, 0xf7, 0xec, 0xf7, 0x20,\n                                                             0x3, 0xf7, 0x70, 0xcc, 0x15, 0x3d, 0xbd, 0xd8,\n                                                             0x85, 0xac, 0x1b, 0xf7, 0x2d, 0xf7, 0x4, 0xf7,\n                                                             0x2d, 0xf7, 0x3e, 0xe9, 0x69, 0xf7, 0x19, 0xfb,\n                                                             0x2b, 0x40, 0x58, 0x66, 0x79, 0x73, 0x1f, 0xbd,\n                                                             0xf7, 0x86, 0x47, 0xa, 0xfb, 0x5b, 0xfe, 0x32,\n                                                             0x8d, 0xa, 0xed, 0xf8, 0x3d, 0x15, 0xc0, 0xab,\n                                                             0xf7, 0x34, 0xf7, 0x5, 0xc1, 0xba, 0x60, 0x38,\n                                                             0x4a, 0x67, 0xfb, 0x2b, 0xfb, 0x1, 0x6a, 0x47,\n                                                             0xa2, 0xf5, 0x1e, 0xe, 0x3c, 0xfb, 0x55, 0x76,\n                                                             0xf9, 0xca, 0xf7, 0xd, 0x1, 0xc2, 0x2f, 0x15,\n                                                             0x7e, 0x20, 0x7e, 0xa, 0xca, 0xee, 0xc2, 0x1f,\n                                                             0xf7, 0xd1, 0xf8, 0xd8, 0x77, 0xa, 0xfc, 0x29,\n                                                             0x51, 0xa, 0x59, 0xf8, 0x29, 0x54, 0xa, 0xe5,\n                                                             0xfc, 0xa4, 0x5, 0x4f, 0x6c, 0xa, 0xf7, 0x42,\n                                                             0xf9, 0x50, 0x6b, 0xa, 0xf7, 0x47, 0xfb, 0xd,\n                                                             0x6b, 0xa, 0xe, 0x78, 0x9e, 0xf8, 0xa8, 0x99,\n                                                             0xf7, 0x40, 0x9e, 0x6, 0xfb, 0x6d, 0x95, 0x7,\n                                                             0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xf2,\n                                                             0xa, 0xf7, 0x2a, 0xb, 0xf2, 0x9c, 0x93, 0xc,\n                                                             0xc, 0xf7, 0xe1, 0x14, 0xf9, 0xf, 0x15, 0xb1,\n                                                             0x13, 0x0, 0x7c, 0x2, 0x0, 0x1, 0x0, 0x31,\n                                                             0x0, 0x6d, 0x0, 0x7a, 0x0, 0xc0, 0x1, 0x5,\n                                                             0x1, 0x2a, 0x1, 0x51, 0x1, 0x55, 0x1, 0x87,\n                                                             0x1, 0x93, 0x1, 0xa3, 0x1, 0xa8, 0x1, 0xc7,\n                                                             0x1, 0xd1, 0x1, 0xd4, 0x1, 0xdc, 0x1, 0xea,\n                                                             0x1, 0xf8, 0x2, 0x4, 0x2, 0x11, 0x2, 0x1b,\n                                                             0x2, 0x2a, 0x2, 0x34, 0x2, 0x3b, 0x2, 0x44,\n                                                             0x2, 0x4d, 0x2, 0x56, 0x2, 0x5e, 0x2, 0x67,\n                                                             0x2, 0x6c, 0x2, 0x71, 0x2, 0x7b, 0x2, 0x80,\n                                                             0x2, 0x8d, 0x2, 0x94, 0x2, 0x99, 0x2, 0x9e,\n                                                             0x2, 0xaf, 0x2, 0xb9, 0x2, 0xbe, 0x2, 0xc3,\n                                                             0x2, 0xcf, 0x2, 0xe2, 0x2, 0xea, 0x2, 0xf5,\n                                                             0x3, 0x7, 0x3, 0xd, 0x3, 0x12, 0x3, 0x18,\n                                                             0x3, 0x1c, 0x3, 0x26, 0x3, 0x2b, 0x3, 0x30,\n                                                             0x3, 0x34, 0x3, 0x3e, 0x3, 0x4d, 0x3, 0x54,\n                                                             0x3, 0x5a, 0x3, 0x5f, 0x3, 0x63, 0x3, 0x67,\n                                                             0x3, 0x6b, 0x3, 0x6f, 0x3, 0x7a, 0x3, 0x84,\n                                                             0x3, 0x91, 0x3, 0x9e, 0x3, 0xa6, 0x3, 0xae,\n                                                             0x3, 0xb1, 0x3, 0xb5, 0x3, 0xb9, 0x3, 0xbd,\n                                                             0x3, 0xc9, 0x3, 0xcf, 0x3, 0xd8, 0x3, 0xe4,\n                                                             0x3, 0xef, 0x3, 0xf4, 0x3, 0xfa, 0x4, 0x0,\n                                                             0x4, 0x6, 0x4, 0xc, 0x4, 0x17, 0x4, 0x22,\n                                                             0x4, 0x2c, 0x4, 0x33, 0x4, 0x38, 0x4, 0x3f,\n                                                             0x4, 0x46, 0x4, 0x4b, 0x4, 0x50, 0x4, 0x54,\n                                                             0x4, 0x5e, 0x4, 0x68, 0x4, 0x72, 0x4, 0x7c,\n                                                             0x4, 0x7f, 0x4, 0x83, 0x4, 0x87, 0x4, 0x8b,\n                                                             0x4, 0x8f, 0x4, 0x95, 0x4, 0x9e, 0x4, 0xa7,\n                                                             0x4, 0xb0, 0x4, 0xb6, 0x4, 0xbb, 0x4, 0xc1,\n                                                             0x4, 0xc6, 0x4, 0xcb, 0x4, 0xd0, 0x4, 0xd5,\n                                                             0x4, 0xda, 0x4, 0xde, 0x4, 0xe3, 0x4, 0xe8,\n                                                             0x4, 0xec, 0x4, 0xf0, 0x4, 0xf4, 0x4, 0xf8,\n                                                             0x4, 0xfc, 0x5, 0x0, 0x5, 0x4, 0x2f, 0xa,\n                                                             0x99, 0xa, 0xab, 0xb1, 0x1a, 0xab, 0x7c, 0xf7,\n                                                             0x4, 0x33, 0xa, 0x7f, 0x5, 0xb9, 0x98, 0xb1,\n                                                             0x9a, 0xb8, 0x1b, 0xce, 0xa8, 0x5b, 0x54, 0x70,\n                                                             0x1f, 0x6c, 0x81, 0x54, 0x86, 0x50, 0x85, 0x8,\n                                                             0x42, 0x86, 0xfb, 0x2f, 0x7f, 0xfb, 0x34, 0x1a,\n                                                             0x28, 0xd6, 0x52, 0xe1, 0x1e, 0xb, 0x15, 0xfb,\n                                                             0x23, 0xe3, 0xfb, 0x32, 0xf7, 0x69, 0xf7, 0xb1,\n                                                             0xf7, 0x16, 0xf7, 0x95, 0xf7, 0x56, 0xf7, 0x49,\n                                                             0xfb, 0x6, 0xf7, 0x13, 0xfb, 0x53, 0xfb, 0xc9,\n                                                             0x25, 0xfb, 0xb4, 0xfb, 0x3e, 0x1e, 0xf7, 0x2a,\n                                                             0x16, 0xf7, 0x37, 0xf0, 0xf7, 0x3d, 0xf7, 0x29,\n                                                             0xf7, 0x3, 0xc2, 0x34, 0x2a, 0xfb, 0xa, 0x3b,\n                                                             0xfb, 0x61, 0xfb, 0x3c, 0x2a, 0x44, 0xd1, 0xf4,\n                                                             0x1e, 0xb, 0x15, 0xfb, 0x11, 0xde, 0xfb, 0x1,\n                                                             0x38, 0xa, 0xf7, 0x36, 0x26, 0xa, 0xb, 0x15,\n                                                             0xf8, 0x8, 0x6, 0x94, 0xae, 0x8c, 0xb3, 0x99,\n                                                             0x1a, 0xf0, 0x5d, 0xf7, 0x1c, 0xfb, 0x41, 0xfb,\n                                                             0x6e, 0x35, 0xfb, 0x33, 0xfb, 0x1b, 0xfb, 0x24,\n                                                             0xe9, 0xfb, 0xf, 0xf7, 0x2d, 0xd7, 0xf7, 0x1,\n                                                             0xa6, 0xf7, 0x15, 0xcc, 0x1e, 0xfb, 0x1a, 0xa1,\n                                                             0x5, 0x7a, 0x83, 0x6a, 0x51, 0x41, 0x1b, 0x4d,\n                                                             0x5a, 0xbc, 0xde, 0x8f, 0x1f, 0x9a, 0xe3, 0x15,\n                                                             0xbe, 0x95, 0xaf, 0xde, 0xe1, 0x1b, 0xd8, 0xa6,\n                                                             0x4c, 0x44, 0x88, 0x1f, 0xb, 0x1, 0xf7, 0x8,\n                                                             0xf7, 0x28, 0x3, 0xf7, 0x6b, 0xf9, 0x73, 0x15,\n                                                             0x3a, 0xfc, 0x2a, 0x5, 0x81, 0x5f, 0x83, 0x59,\n                                                             0x5b, 0x1a, 0xfb, 0x1, 0xc2, 0x2a, 0xf7, 0x62,\n                                                             0xf7, 0xa3, 0xb6, 0xf7, 0x64, 0xf7, 0x20, 0xa8,\n                                                             0x1e, 0xdf, 0xf8, 0x2a, 0x5, 0x97, 0xa, 0x37,\n                                                             0xfc, 0x2a, 0x5, 0xfb, 0x13, 0x71, 0x78, 0x2e,\n                                                             0xfb, 0x20, 0x1b, 0x2b, 0x73, 0xb4, 0xc5, 0xaf,\n                                                             0x94, 0xb5, 0x94, 0xb6, 0x1f, 0xdf, 0xf8, 0x2a,\n                                                             0x5, 0xb, 0x5e, 0xa, 0xe1, 0xf7, 0x36, 0x5,\n                                                             0xf7, 0xaf, 0x6, 0xa3, 0xfb, 0x36, 0x5, 0xf7,\n                                                             0x1f, 0x6, 0xfb, 0x8, 0xf9, 0x71, 0x43, 0xa,\n                                                             0x27, 0xfc, 0x54, 0x15, 0xf7, 0x30, 0xf7, 0xba,\n                                                             0x5c, 0xa, 0xb3, 0xfb, 0xba, 0x5, 0xb, 0xf7,\n                                                             0xe, 0x48, 0xf7, 0xa, 0xfb, 0x4f, 0xfb, 0x7d,\n                                                             0x41, 0xfb, 0x4c, 0xfb, 0x21, 0x1e, 0xf7, 0x25,\n                                                             0x16, 0xcb, 0xb0, 0xf7, 0x2b, 0xf7, 0x11, 0xdb,\n                                                             0xa8, 0x3d, 0x57, 0x29, 0x56, 0xfb, 0x4, 0x21,\n                                                             0x3f, 0x67, 0xcb, 0xc8, 0x1e, 0xb, 0x15, 0x25,\n                                                             0xa, 0xe, 0xf8, 0x31, 0x89, 0x15, 0x82, 0xa,\n                                                             0xf7, 0x2, 0xf8, 0xa7, 0x47, 0xa, 0x57, 0xfb,\n                                                             0x8e, 0x5, 0x46, 0x71, 0x7f, 0xfb, 0xd, 0xfb,\n                                                             0xe, 0x1b, 0x5e, 0x7d, 0xa4, 0xad, 0xa1, 0x90,\n                                                             0xa4, 0x91, 0xa0, 0x1f, 0xcc, 0xf7, 0xcd, 0x44,\n                                                             0xa, 0x4d, 0xfb, 0xba, 0x5, 0x85, 0x6a, 0x81,\n                                                             0x60, 0x62, 0x1a, 0xb, 0x12, 0x13, 0x60, 0x28,\n                                                             0xa, 0x13, 0xa0, 0x35, 0xa, 0x13, 0x60, 0xb,\n                                                             0x30, 0xa, 0x9c, 0xf7, 0x8e, 0x15, 0x88, 0x78,\n                                                             0x5, 0x31, 0xa, 0x90, 0xe6, 0x99, 0x1f, 0xb,\n                                                             0xfd, 0x22, 0x21, 0xa, 0xe, 0xf8, 0xc4, 0x6,\n                                                             0xa5, 0xf7, 0x10, 0x5, 0xfc, 0x31, 0x6, 0xb3,\n                                                             0xf7, 0x5a, 0x70, 0xa, 0xf7, 0x10, 0x5, 0xfb,\n                                                             0xfe, 0x6, 0xad, 0xf7, 0x3c, 0x6f, 0xa, 0xf7,\n                                                             0xf, 0x90, 0xa, 0xb, 0xe2, 0x78, 0xf7, 0x14,\n                                                             0xf9, 0x6, 0x77, 0x24, 0xa, 0xb, 0x2a, 0xa,\n                                                             0xe, 0x32, 0xa, 0x9a, 0xca, 0x99, 0xc0, 0x1e,\n                                                             0xb, 0xba, 0xcb, 0x9d, 0xc2, 0xbf, 0x1f, 0x8d,\n                                                             0x70, 0x8c, 0x82, 0x93, 0x72, 0x8, 0xb, 0x5f,\n                                                             0x81, 0x77, 0x30, 0x20, 0x1b, 0x5a, 0x77, 0xab,\n                                                             0xa7, 0xd6, 0xf7, 0xa, 0xb, 0x15, 0xf7, 0x27,\n                                                             0x6, 0x83, 0xa6, 0x87, 0x9e, 0xaa, 0x1a, 0xbc,\n                                                             0xb, 0xfb, 0x5a, 0x27, 0xfb, 0x3, 0x6b, 0xfb,\n                                                             0xd, 0x5f, 0x1e, 0xf7, 0x28, 0xb, 0x68, 0xa,\n                                                             0xf7, 0x36, 0xf7, 0xf, 0xf8, 0x54, 0x77, 0xb,\n                                                             0x46, 0xa6, 0x4c, 0xf7, 0x6, 0xcd, 0xce, 0xa9,\n                                                             0xc2, 0xc2, 0x1e, 0x8d, 0x89, 0x5, 0xb, 0x1,\n                                                             0xf6, 0xf7, 0x2a, 0xf8, 0x34, 0xf7, 0x2a, 0x3,\n                                                             0xb, 0xa0, 0x76, 0xf9, 0x62, 0x77, 0x1, 0xb,\n                                                             0xf7, 0x3d, 0xf7, 0x59, 0xf7, 0x4, 0xf7, 0x31,\n                                                             0xb, 0x15, 0xf7, 0xc, 0x40, 0xa, 0xfb, 0xc,\n                                                             0x6, 0xb, 0x39, 0xa, 0xf7, 0x48, 0xfb, 0xc,\n                                                             0x39, 0xa, 0xe, 0xf7, 0x2, 0x97, 0xc1, 0xa2,\n                                                             0xf5, 0x18, 0xb, 0xf7, 0x1c, 0x6, 0xf4, 0xf8,\n                                                             0xa6, 0x5b, 0xa, 0xb, 0x5, 0xfb, 0x21, 0x6,\n                                                             0xb, 0x8e, 0xa2, 0x3b, 0xa, 0xb, 0x1, 0xdd,\n                                                             0xf7, 0x25, 0xf7, 0xa3, 0xf7, 0x25, 0x3, 0xb,\n                                                             0x6, 0xa4, 0x83, 0xa, 0xb, 0xab, 0x8b, 0xf7,\n                                                             0x10, 0xf7, 0x5a, 0xf7, 0x10, 0xf7, 0x3c, 0xf7,\n                                                             0xf, 0xb, 0x3c, 0x7d, 0xf7, 0x0, 0x2b, 0xeb,\n                                                             0xb, 0x5, 0xfb, 0x37, 0x6, 0xb, 0x5, 0xfb,\n                                                             0x24, 0x6, 0xb, 0x15, 0xf7, 0x8, 0x6, 0xe0,\n                                                             0xe2, 0xb1, 0x34, 0x5, 0xec, 0x6, 0x4f, 0xf7,\n                                                             0x27, 0x66, 0xa, 0xe, 0xf7, 0x29, 0x6, 0xf7,\n                                                             0x40, 0xf9, 0x74, 0x5a, 0xa, 0xb, 0x5, 0xfb,\n                                                             0x23, 0x6, 0xb, 0xfb, 0xf9, 0xa0, 0x76, 0xb,\n                                                             0xf7, 0x23, 0x78, 0xf7, 0x14, 0xf9, 0x37, 0xf7,\n                                                             0x2c, 0x36, 0xa, 0xb, 0x15, 0xdb, 0x6, 0x57,\n                                                             0xf7, 0x65, 0xf7, 0x24, 0xf7, 0x5b, 0x5, 0x2b,\n                                                             0x6, 0xfb, 0x39, 0xfb, 0x53, 0x5, 0xb, 0x7c,\n                                                             0xa, 0xa8, 0xf7, 0x26, 0x44, 0xa, 0xb, 0x73,\n                                                             0x7d, 0xf7, 0x1, 0xf8, 0x8b, 0xf7, 0x2c, 0x3f,\n                                                             0xa, 0xb, 0x15, 0xeb, 0x6, 0xf7, 0x39, 0xf7,\n                                                             0x59, 0x32, 0xf7, 0x67, 0x5, 0x3b, 0x6, 0xbf,\n                                                             0xfb, 0x67, 0x5, 0xb, 0x48, 0xa, 0xf9, 0x74,\n                                                             0x77, 0xb, 0x6, 0xa4, 0x55, 0xa, 0xb, 0x6,\n                                                             0xa4, 0xf7, 0xd, 0x5, 0xb, 0x5, 0x89, 0x6,\n                                                             0xb, 0x6, 0xf7, 0x44, 0xf7, 0x26, 0x5, 0xfb,\n                                                             0x3a, 0x6, 0xb, 0x5, 0xfb, 0x29, 0x6, 0xb,\n                                                             0x5, 0xfb, 0x1e, 0x6, 0xb, 0xf7, 0xe, 0x5,\n                                                             0xb, 0xf7, 0x1e, 0x8e, 0xa3, 0x3b, 0xa, 0xfb,\n                                                             0x1f, 0x6, 0xb, 0xe2, 0x8b, 0xf7, 0xa, 0xf8,\n                                                             0x76, 0xf7, 0xa, 0x1, 0xf9, 0x6, 0xf7, 0x2b,\n                                                             0x3, 0xb, 0xec, 0x76, 0xf8, 0x2c, 0x77, 0x1,\n                                                             0xb, 0x73, 0x7d, 0xf2, 0x30, 0xe6, 0xb, 0x5,\n                                                             0xfb, 0x2a, 0x6, 0xb, 0x85, 0xa, 0x6, 0xb,\n                                                             0x5, 0x8d, 0x6, 0xb, 0xf7, 0x2c, 0x5, 0xb,\n                                                             0xf7, 0x2a, 0x6, 0xb, 0x4f, 0xa, 0xfb, 0xd,\n                                                             0x6, 0xf7, 0x49, 0xfb, 0xe, 0x15, 0xb, 0x15,\n                                                             0xe8, 0x6, 0xf7, 0x32, 0xf7, 0x27, 0x53, 0xa,\n                                                             0xe, 0x15, 0xca, 0x6, 0x7e, 0x52, 0x73, 0x7a,\n                                                             0x5f, 0x82, 0x7e, 0x4d, 0x18, 0xb, 0xfb, 0x15,\n                                                             0x5, 0xca, 0x6, 0x7e, 0x53, 0x73, 0x7b, 0x5f,\n                                                             0x81, 0x8, 0xb, 0x6, 0x72, 0x84, 0x84, 0x7b,\n                                                             0x77, 0x1b, 0xb, 0xf7, 0xc0, 0x16, 0xf7, 0x20,\n                                                             0x6, 0xc1, 0xb, 0x3d, 0xa, 0xe, 0x98, 0xa,\n                                                             0x6, 0xb, 0xf7, 0x2b, 0x5, 0xb, 0xe2, 0xa0,\n                                                             0x76, 0xb, 0x15, 0xf7, 0xa, 0x6, 0xa4, 0xf7,\n                                                             0x7, 0x5, 0xfb, 0xa, 0x6, 0xb, 0x86, 0xa,\n                                                             0xfb, 0xe, 0x6, 0xb, 0x15, 0xf7, 0xb, 0x50,\n                                                             0xa, 0xfb, 0xb, 0x6, 0xb, 0x72, 0x69, 0x63,\n                                                             0x5c, 0x1b, 0x86, 0x79, 0x8b, 0x93, 0x72, 0x1f,\n                                                             0xb, 0x15, 0xf7, 0x15, 0x6, 0xa6, 0x55, 0xa,\n                                                             0xfb, 0x15, 0x6, 0xb, 0x6, 0xa5, 0x55, 0xa,\n                                                             0xb, 0x5, 0xf8, 0x14, 0x6, 0xa4, 0xb, 0x5,\n                                                             0xf7, 0xfe, 0x6, 0xa4, 0xb, 0x6, 0xa5, 0xf7,\n                                                             0xf, 0x5, 0xb, 0xf8, 0xf0, 0xf7, 0x26, 0x1,\n                                                             0xb, 0xfb, 0x8a, 0xfb, 0x58, 0xf7, 0x7, 0xf7,\n                                                             0xb2, 0xf7, 0x8, 0xb, 0xfb, 0x11, 0x59, 0xfb,\n                                                             0x2f, 0x3b, 0x1e, 0xe8, 0x16, 0x9b, 0xb, 0x15,\n                                                             0xec, 0x6, 0x4c, 0x5d, 0xa, 0xfb, 0x1f, 0x6,\n                                                             0xb, 0x12, 0xc2, 0xf7, 0x23, 0x13, 0x70, 0xb,\n                                                             0x94, 0xa, 0xfb, 0x57, 0xb, 0x8d, 0x76, 0xf9,\n                                                             0x88, 0x77, 0x1, 0xb, 0xa0, 0x76, 0xf8, 0xa8,\n                                                             0x77, 0x1, 0xb, 0x5, 0xfb, 0xe, 0x6, 0xb,\n                                                             0x5, 0xfb, 0x27, 0x6, 0xb, 0xf7, 0x24, 0x6,\n                                                             0xb, 0x1, 0xd1, 0xf7, 0x22, 0xf7, 0x8b, 0xf7,\n                                                             0x1a, 0x3, 0xb, 0x5, 0x87, 0x9b, 0xb8, 0x80,\n                                                             0xb2, 0x1b, 0xf2, 0xae, 0xb, 0xfb, 0x58, 0xf7,\n                                                             0x2, 0xf9, 0x4e, 0xf7, 0x2, 0x1, 0xb, 0xcc,\n                                                             0xf7, 0x5a, 0xf7, 0x44, 0xf7, 0x9, 0x9c, 0x32,\n                                                             0xb, 0x54, 0xa, 0xe, 0xf7, 0x1b, 0x6, 0xb,\n                                                             0xf7, 0xc, 0x5, 0xb, 0x73, 0xa0, 0x76, 0xb,\n                                                             0x5, 0xfb, 0x1c, 0xb, 0x15, 0xf7, 0xe, 0x4f,\n                                                             0xa, 0xb, 0x73, 0x8b, 0xf7, 0xd, 0xf8, 0xe9,\n                                                             0x77, 0x1, 0xb, 0xf7, 0x77, 0xf5, 0x1, 0xbb,\n                                                             0xf7, 0x77, 0x15, 0xb, 0x6, 0xa1, 0xf7, 0x3,\n                                                             0x5, 0xfb, 0x3d, 0x6, 0xb, 0xd0, 0x16, 0xf7,\n                                                             0x21, 0x6, 0xb, 0x96, 0xa, 0xd7, 0x16, 0xb,\n                                                             0xf7, 0x23, 0x78, 0xf7, 0x12, 0xb, 0x5, 0xf7,\n                                                             0x23, 0x6, 0xb, 0x15, 0xf7, 0x1e, 0x6, 0xb,\n                                                             0x15, 0xf7, 0xe, 0x6, 0xb, 0x5, 0xfc, 0xa7,\n                                                             0x6, 0xb, 0x5, 0xfb, 0x1b, 0x6, 0xb, 0x5,\n                                                             0x9a, 0xa, 0xb, 0x5, 0xfb, 0x26, 0x6, 0xb,\n                                                             0x5, 0xfb, 0x28, 0x6, 0xb, 0xf7, 0x2b, 0x1,\n                                                             0xb, 0xf7, 0xc, 0x1, 0xb, 0xfb, 0x2b, 0x6,\n                                                             0xb, 0x5, 0xfb, 0x17, 0xb, 0xa0, 0xe8, 0x93,\n                                                             0xb, 0xfb, 0x22, 0x6, 0xb, 0xf7, 0x22, 0x6,\n                                                             0xb\n                                                            };\n"
  },
  {
    "path": "core/src/fxge/fontdata/chromefontdata/FoxitSansItalic.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nconst unsigned char g_FoxitSansItalicFontData [16339] = {0x1,\n                                                         0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x14,\n                                                         0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x61, 0x6e,\n                                                         0x73, 0x4f, 0x54, 0x46, 0x2d, 0x49, 0x74, 0x61,\n                                                         0x6c, 0x69, 0x63, 0x0, 0x1, 0x1, 0x1, 0x27,\n                                                         0xf8, 0x10, 0x0, 0xf8, 0x1c, 0x1, 0xf8, 0x1d,\n                                                         0x2, 0xf8, 0x1e, 0x3, 0xf8, 0x18, 0x4, 0x7f,\n                                                         0xc, 0x2, 0xfb, 0x3e, 0xfb, 0x75, 0xfa, 0xf0,\n                                                         0xfa, 0x4b, 0x5, 0xf7, 0x36, 0xf, 0xf9, 0x1,\n                                                         0x11, 0xc3, 0x1c, 0x3a, 0xfc, 0x12, 0x0, 0x4,\n                                                         0x1, 0x1, 0x5, 0x2f, 0x44, 0x52, 0x45, 0x75,\n                                                         0x72, 0x6f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                         0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                         0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                         0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                         0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                         0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f,\n                                                         0x6d, 0x20, 0x53, 0x61, 0x6e, 0x73, 0x20, 0x4f,\n                                                         0x54, 0x46, 0x20, 0x49, 0x74, 0x61, 0x6c, 0x69,\n                                                         0x63, 0x43, 0x68, 0x72, 0x6F, 0x6D, 0x20, 0x53,\n                                                         0x61, 0x6e, 0x73, 0x20, 0x4f, 0x54, 0x46, 0x0,\n                                                         0x0, 0x0, 0x0, 0x22, 0x0, 0x8a, 0x0, 0xab,\n                                                         0x0, 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf,\n                                                         0x0, 0xb0, 0x0, 0x23, 0x0, 0x24, 0x0, 0xb1,\n                                                         0x0, 0x25, 0x0, 0x26, 0x0, 0xb2, 0x0, 0xb3,\n                                                         0x0, 0xb4, 0x0, 0xb5, 0x0, 0x9a, 0x1, 0x87,\n                                                         0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a,\n                                                         0x0, 0xb6, 0x0, 0xb7, 0x0, 0xb8, 0x0, 0xb9,\n                                                         0x0, 0x2b, 0x0, 0x2c, 0x0, 0x2d, 0x0, 0x8c,\n                                                         0x0, 0x2e, 0x0, 0x2f, 0x0, 0xba, 0x0, 0x30,\n                                                         0x0, 0x8e, 0x0, 0xbb, 0x0, 0xbc, 0x0, 0xbd,\n                                                         0x0, 0xbe, 0x0, 0x8d, 0x0, 0xbf, 0x0, 0x31,\n                                                         0x0, 0x32, 0x0, 0x33, 0x0, 0x34, 0x0, 0xc0,\n                                                         0x0, 0x35, 0x0, 0x9d, 0x0, 0x36, 0x0, 0xc1,\n                                                         0x0, 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0x37,\n                                                         0x0, 0x38, 0x0, 0x39, 0x0, 0x3a, 0x0, 0xc5,\n                                                         0x0, 0xc6, 0x0, 0x3b, 0x0, 0xc7, 0x0, 0x42,\n                                                         0x0, 0xc8, 0x0, 0xc9, 0x0, 0x7d, 0x0, 0xca,\n                                                         0x0, 0x90, 0x0, 0xcb, 0x0, 0x7, 0x0, 0xcc,\n                                                         0x0, 0x3f, 0x0, 0x5f, 0x0, 0xb, 0x0, 0x21,\n                                                         0x0, 0xcd, 0x0, 0x43, 0x0, 0x3d, 0x0, 0x5d,\n                                                         0x0, 0x5c, 0x0, 0x5e, 0x0, 0x3c, 0x0, 0x3e,\n                                                         0x0, 0x81, 0x0, 0xa0, 0x0, 0x74, 0x0, 0x44,\n                                                         0x0, 0x88, 0x0, 0xce, 0x0, 0x85, 0x0, 0x61,\n                                                         0x0, 0x7e, 0x0, 0x1b, 0x0, 0xd, 0x0, 0xaa,\n                                                         0x0, 0x67, 0x0, 0x45, 0x0, 0x70, 0x0, 0x71,\n                                                         0x0, 0xa1, 0x0, 0x83, 0x0, 0x9f, 0x0, 0x5,\n                                                         0x0, 0x82, 0x0, 0x91, 0x0, 0x46, 0x0, 0xcf,\n                                                         0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0, 0x19,\n                                                         0x0, 0x79, 0x0, 0x89, 0x0, 0x6f, 0x0, 0x1e,\n                                                         0x0, 0xa7, 0x0, 0x2, 0x0, 0x60, 0x0, 0x47,\n                                                         0x0, 0x6d, 0x0, 0x16, 0x0, 0x6e, 0x0, 0x65,\n                                                         0x0, 0x15, 0x0, 0x63, 0x0, 0x48, 0x0, 0x95,\n                                                         0x0, 0x7c, 0x0, 0x1f, 0x0, 0x6a, 0x0, 0x78,\n                                                         0x0, 0x6b, 0x0, 0x6c, 0x0, 0x49, 0x0, 0x86,\n                                                         0x0, 0xe, 0x0, 0x4a, 0x0, 0xd3, 0x0, 0xd4,\n                                                         0x0, 0xd5, 0x0, 0xd6, 0x0, 0x4b, 0x0, 0x4c,\n                                                         0x0, 0x4d, 0x0, 0x1d, 0x0, 0x97, 0x0, 0x92,\n                                                         0x0, 0x4e, 0x0, 0x80, 0x0, 0xa6, 0x0, 0x98,\n                                                         0x0, 0xa8, 0x0, 0x4f, 0x0, 0x1a, 0x0, 0xd7,\n                                                         0x0, 0x4, 0x0, 0x50, 0x0, 0xd8, 0x0, 0xd9,\n                                                         0x0, 0xda, 0x0, 0x94, 0x0, 0x87, 0x0, 0xdb,\n                                                         0x0, 0x12, 0x0, 0x9b, 0x0, 0x9e, 0x0, 0x96,\n                                                         0x0, 0x8b, 0x0, 0x8f, 0x0, 0x93, 0x0, 0xdc,\n                                                         0x0, 0x51, 0x0, 0x73, 0x0, 0x9, 0x0, 0xa,\n                                                         0x0, 0x6, 0x0, 0xf, 0x0, 0x72, 0x0, 0x7a,\n                                                         0x0, 0xc, 0x0, 0x9c, 0x0, 0x52, 0x0, 0x20,\n                                                         0x0, 0x7b, 0x0, 0x3, 0x0, 0x76, 0x0, 0x69,\n                                                         0x0, 0x77, 0x0, 0x41, 0x0, 0x8, 0x0, 0x75,\n                                                         0x0, 0x68, 0x0, 0x53, 0x0, 0xa5, 0x0, 0x84,\n                                                         0x0, 0x54, 0x0, 0xdd, 0x0, 0x66, 0x0, 0x1c,\n                                                         0x0, 0x18, 0x0, 0x17, 0x0, 0x10, 0x0, 0x1,\n                                                         0x0, 0x62, 0x0, 0x55, 0x0, 0xa2, 0x0, 0x14,\n                                                         0x0, 0xa3, 0x0, 0xa9, 0x0, 0x7f, 0x0, 0x99,\n                                                         0x0, 0x13, 0x0, 0xa4, 0x0, 0x56, 0x0, 0xde,\n                                                         0x0, 0xdf, 0x0, 0xe0, 0x0, 0xe1, 0x0, 0x40,\n                                                         0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a,\n                                                         0x0, 0xe2, 0x0, 0xe3, 0x0, 0x64, 0x0, 0x5b,\n                                                         0x0, 0xe4, 0x0, 0x11, 0x0, 0xe6, 0x2, 0x0,\n                                                         0x1, 0x0, 0x3, 0x0, 0x36, 0x0, 0x82, 0x0,\n                                                         0x94, 0x0, 0xa7, 0x0, 0xb9, 0x0, 0xd1, 0x1,\n                                                         0x10, 0x1, 0x54, 0x1, 0xb3, 0x2, 0x5, 0x2,\n                                                         0x89, 0x2, 0xc9, 0x2, 0xf6, 0x3, 0x3, 0x3,\n                                                         0x10, 0x3, 0x1c, 0x3, 0x2f, 0x3, 0x87, 0x4,\n                                                         0x6, 0x4, 0x2e, 0x4, 0x8d, 0x4, 0xbc, 0x4,\n                                                         0xca, 0x4, 0xe6, 0x5, 0x6, 0x5, 0x29, 0x5,\n                                                         0x3e, 0x5, 0x72, 0x5, 0xa5, 0x5, 0xbb, 0x5,\n                                                         0xe6, 0x6, 0x17, 0x6, 0x3f, 0x6, 0xa1, 0x6,\n                                                         0xf1, 0x7, 0x77, 0x7, 0x9a, 0x7, 0xc3, 0x7,\n                                                         0xe8, 0x8, 0x5, 0x8, 0x84, 0x8, 0xd2, 0x9,\n                                                         0x12, 0x9, 0x91, 0x9, 0xec, 0xa, 0x59, 0xa,\n                                                         0xdf, 0xa, 0xff, 0xb, 0x47, 0xb, 0x84, 0xb,\n                                                         0xd6, 0xb, 0xf7, 0xc, 0x1f, 0xc, 0x71, 0xc,\n                                                         0x8c, 0xc, 0xc9, 0xc, 0xfa, 0xd, 0x22, 0xd,\n                                                         0x51, 0xd, 0x89, 0xd, 0xb1, 0xd, 0xee, 0xe,\n                                                         0x7c, 0xe, 0x9e, 0xe, 0xc3, 0xe, 0xda, 0xf,\n                                                         0x9, 0xf, 0xbb, 0xf, 0xda, 0x10, 0x79, 0x10,\n                                                         0xc2, 0x10, 0xe4, 0x11, 0x2e, 0x11, 0x63, 0x12,\n                                                         0x19, 0x12, 0x70, 0x12, 0xca, 0x12, 0xe2, 0x12,\n                                                         0xfc, 0x13, 0x4f, 0x13, 0xa6, 0x13, 0xca, 0x13,\n                                                         0xec, 0x14, 0x16, 0x14, 0x38, 0x14, 0x56, 0x14,\n                                                         0xa0, 0x14, 0xb7, 0x15, 0x2a, 0x15, 0x63, 0x15,\n                                                         0xce, 0x15, 0xee, 0x16, 0x6, 0x16, 0x26, 0x16,\n                                                         0xbd, 0x17, 0x35, 0x17, 0x90, 0x17, 0xc8, 0x18,\n                                                         0x16, 0x18, 0x50, 0x18, 0x61, 0x18, 0x92, 0x19,\n                                                         0x1f, 0x19, 0x31, 0x19, 0x42, 0x19, 0x99, 0x19,\n                                                         0xbc, 0x19, 0xe6, 0x1a, 0x4, 0x1a, 0x25, 0x1a,\n                                                         0x96, 0x1a, 0xad, 0x1a, 0xb8, 0x1a, 0xc1, 0x1a,\n                                                         0xe2, 0x1b, 0x51, 0x1b, 0x75, 0x1b, 0xa3, 0x1b,\n                                                         0xde, 0x1c, 0x22, 0x1c, 0x7a, 0x1c, 0xb7, 0x1d,\n                                                         0x16, 0x1d, 0x53, 0x1d, 0x70, 0x1d, 0xdd, 0x1e,\n                                                         0x52, 0x1e, 0x60, 0x1e, 0x89, 0x1e, 0xb7, 0x1e,\n                                                         0xe3, 0x1e, 0xfd, 0x1f, 0x1b, 0x1f, 0x5d, 0x1f,\n                                                         0x6b, 0x1f, 0x82, 0x1f, 0x9f, 0x1f, 0xbb, 0x1f,\n                                                         0xdd, 0x1f, 0xfd, 0x20, 0x13, 0x20, 0x51, 0x20,\n                                                         0x7c, 0x20, 0x8b, 0x20, 0xaf, 0x20, 0xcd, 0x20,\n                                                         0xee, 0x21, 0x52, 0x21, 0x66, 0x21, 0x7a, 0x21,\n                                                         0xcc, 0x21, 0xfd, 0x22, 0x3c, 0x22, 0xa1, 0x23,\n                                                         0x1b, 0x23, 0x72, 0x23, 0xb9, 0x23, 0xd7, 0x23,\n                                                         0xfb, 0x24, 0x23, 0x24, 0xba, 0x24, 0xeb, 0x25,\n                                                         0x3, 0x25, 0x2f, 0x25, 0xb0, 0x26, 0x16, 0x26,\n                                                         0x3c, 0x26, 0xc6, 0x27, 0x6, 0x27, 0x7c, 0x27,\n                                                         0xd3, 0x28, 0x29, 0x28, 0x52, 0x28, 0x88, 0x28,\n                                                         0xbd, 0x29, 0x5d, 0x29, 0x6b, 0x29, 0x7f, 0x2a,\n                                                         0x39, 0x2a, 0x5c, 0x2a, 0x9d, 0x2a, 0xf8, 0x2b,\n                                                         0x4b, 0x2b, 0xa1, 0x2b, 0xd2, 0x2b, 0xfa, 0x2c,\n                                                         0x12, 0x2c, 0x3e, 0x2c, 0x54, 0x2c, 0x6b, 0x2c,\n                                                         0x86, 0x2c, 0x9f, 0x2c, 0xd7, 0x2d, 0x7d, 0x2d,\n                                                         0xb7, 0x2e, 0x17, 0x2e, 0x8e, 0x2f, 0x26, 0x2f,\n                                                         0x55, 0x2f, 0x84, 0x2f, 0xe7, 0x2f, 0xfc, 0x2f,\n                                                         0xfe, 0x30, 0x8c, 0x30, 0xde, 0x31, 0x35, 0x31,\n                                                         0x95, 0x32, 0x30, 0x32, 0x8e, 0x32, 0xe2, 0x33,\n                                                         0x3e, 0x33, 0x8c, 0x33, 0xdc, 0x34, 0x27, 0x34,\n                                                         0x34, 0x34, 0x42, 0x34, 0x4e, 0x34, 0x62, 0x34,\n                                                         0x6f, 0x34, 0x8b, 0x34, 0xc1, 0x34, 0xf0, 0x35,\n                                                         0x27, 0x35, 0x75, 0x35, 0xc2, 0x36, 0x1b, 0x36,\n                                                         0x41, 0x36, 0x7a, 0x36, 0xbf, 0x77, 0xe, 0x35,\n                                                         0xa, 0xf7, 0x62, 0xd5, 0xf8, 0x4a, 0x77, 0x1,\n                                                         0x99, 0x16, 0xf4, 0x6, 0xf7, 0x7, 0xf7, 0x62,\n                                                         0x5, 0xf7, 0xb8, 0x6, 0xae, 0xfb, 0x62, 0x5,\n                                                         0xe8, 0x6, 0xfb, 0xa, 0xf9, 0x62, 0x5, 0xfb,\n                                                         0x5, 0x6, 0xfb, 0x28, 0xfc, 0x4a, 0x15, 0xf7,\n                                                         0x53, 0xf7, 0xfc, 0x48, 0xa, 0xb9, 0xfb, 0xfc,\n                                                         0x5, 0xe, 0xf9, 0x52, 0x8b, 0xdc, 0xf7, 0x10,\n                                                         0xdc, 0xb9, 0xdc, 0xf7, 0x74, 0xdc, 0x1, 0x93,\n                                                         0x16, 0xf7, 0x0, 0x6, 0xf7, 0x10, 0xf7, 0x61,\n                                                         0x5, 0xf7, 0xaa, 0x6, 0x60, 0xfb, 0x61, 0x5,\n                                                         0xf8, 0x98, 0x55, 0xa, 0xfc, 0x33, 0x6, 0xbf,\n                                                         0xf7, 0x8f, 0x5, 0xf8, 0x3, 0x55, 0xa, 0xfc,\n                                                         0x3, 0x6, 0xba, 0xf7, 0x74, 0x5, 0xf8, 0x7,\n                                                         0x55, 0xa, 0xfd, 0x1a, 0x6, 0xfb, 0x35, 0xfc,\n                                                         0x44, 0x15, 0xf7, 0x6b, 0xf7, 0xf3, 0x5, 0xf2,\n                                                         0x6, 0x42, 0xfb, 0xf3, 0x5, 0xe, 0x31, 0xa,\n                                                         0xf9, 0x13, 0x77, 0x1, 0xf8, 0x74, 0xf9, 0xae,\n                                                         0x36, 0xa, 0xfc, 0xc1, 0xfe, 0x35, 0x26, 0xa,\n                                                         0x31, 0xa, 0xf8, 0x8c, 0xf7, 0x1b, 0x1, 0xf7,\n                                                         0xc7, 0xf9, 0xae, 0x30, 0xa, 0xfc, 0x3b, 0xfe,\n                                                         0x35, 0x26, 0xa, 0x31, 0xa, 0xf8, 0x93, 0xef,\n                                                         0x1, 0xf8, 0xb1, 0xf9, 0xb5, 0x2e, 0xa, 0xfc,\n                                                         0x4, 0xfe, 0x19, 0x26, 0xa, 0x31, 0xa, 0xf8,\n                                                         0x87, 0xf7, 0x20, 0x1, 0xf8, 0x78, 0xf9, 0xa9,\n                                                         0x56, 0xa, 0xf7, 0x20, 0x5, 0x20, 0x6, 0xfc,\n                                                         0xb, 0xfe, 0x35, 0x26, 0xa, 0x31, 0xa, 0xf8,\n                                                         0x77, 0xb0, 0xf7, 0x36, 0x76, 0x1, 0xf8, 0x28,\n                                                         0xb0, 0xf3, 0xb0, 0x3, 0xf8, 0x28, 0xf9, 0xf2,\n                                                         0x15, 0x59, 0xb4, 0x64, 0xbb, 0xbb, 0xb4, 0xb2,\n                                                         0xbd, 0xbd, 0x63, 0xb2, 0x5a, 0x5a, 0x63, 0x64,\n                                                         0x59, 0x1e, 0xb0, 0x8a, 0x15, 0xa8, 0xa2, 0xa3,\n                                                         0xa8, 0xa8, 0xa2, 0x74, 0x6d, 0x6e, 0x74, 0x75,\n                                                         0x6e, 0x6f, 0x73, 0xa1, 0xa8, 0x1e, 0xfc, 0x3f,\n                                                         0xfd, 0xf1, 0x26, 0xa, 0x31, 0xa, 0xf8, 0x9a,\n                                                         0xf5, 0x8e, 0x77, 0x12, 0x13, 0xe0, 0xf8, 0x5,\n                                                         0xf9, 0xbc, 0x15, 0xc8, 0x66, 0xa, 0xa3, 0x1b,\n                                                         0xa7, 0xa1, 0x82, 0x82, 0x9e, 0x1f, 0x80, 0xa2,\n                                                         0x9f, 0x7e, 0xa0, 0x1b, 0xc5, 0xac, 0xc1, 0xc0,\n                                                         0x90, 0x1f, 0x50, 0x6, 0x7d, 0x87, 0x85, 0x73,\n                                                         0x5e, 0xa, 0x13, 0xd0, 0x95, 0x73, 0x70, 0x96,\n                                                         0x6e, 0x1b, 0x13, 0xe0, 0x48, 0x7a, 0x58, 0x51,\n                                                         0x7c, 0x1f, 0xfb, 0xf7, 0xfd, 0xbc, 0x26, 0xa,\n                                                         0xf8, 0x5, 0x8b, 0xdc, 0xf7, 0x8d, 0xdd, 0xf7,\n                                                         0x75, 0xdc, 0x1, 0xf8, 0xd4, 0xf1, 0x3, 0xd5,\n                                                         0x16, 0xf7, 0xfd, 0x6, 0xf7, 0x37, 0xec, 0xf7,\n                                                         0xd, 0xf5, 0xe5, 0x4b, 0xb3, 0x52, 0x9e, 0x1f,\n                                                         0xb6, 0x99, 0xea, 0xac, 0xf7, 0xa, 0x1a, 0xf7,\n                                                         0x22, 0xfb, 0x18, 0xae, 0xfb, 0xb, 0x1e, 0xfb,\n                                                         0x7b, 0x6, 0x64, 0xfd, 0x11, 0x15, 0xc1, 0xf7,\n                                                         0x8d, 0x5, 0xf7, 0x52, 0x6, 0xc9, 0xeb, 0x8a,\n                                                         0x25, 0xfb, 0x11, 0xfb, 0x13, 0x76, 0x22, 0x1f,\n                                                         0x29, 0xf7, 0xdf, 0x15, 0xbc, 0xf7, 0x75, 0x5,\n                                                         0xf7, 0x29, 0x6, 0xc7, 0xec, 0x8a, 0x2c, 0xfb,\n                                                         0x3, 0xfb, 0x6, 0x79, 0x31, 0x1f, 0xe, 0xf8,\n                                                         0x3c, 0x78, 0xdc, 0xf8, 0xe6, 0xdc, 0x1, 0xf7,\n                                                         0x14, 0xef, 0x3, 0xf9, 0x1b, 0xf7, 0x8f, 0x15,\n                                                         0x51, 0x79, 0x4a, 0xfb, 0x17, 0xfb, 0x2b, 0x1b,\n                                                         0x3c, 0xfb, 0x12, 0xb4, 0xf7, 0x53, 0xf7, 0x47,\n                                                         0xf2, 0xf7, 0x4b, 0xf7, 0x52, 0xf7, 0x28, 0xaa,\n                                                         0xfb, 0x8, 0x62, 0x92, 0x1f, 0xea, 0x93, 0x5,\n                                                         0xf7, 0x52, 0x75, 0xfb, 0x3a, 0xb3, 0x2e, 0x1b,\n                                                         0xfb, 0x7e, 0xfb, 0x33, 0xfb, 0x5d, 0xfb, 0x86,\n                                                         0xfb, 0x74, 0xf7, 0x1c, 0x32, 0xf7, 0x36, 0xf7,\n                                                         0x3b, 0xf7, 0x8, 0xf2, 0xf7, 0x2d, 0xc5, 0x1f,\n                                                         0xe, 0xf8, 0x3c, 0xfb, 0x75, 0xc6, 0xf7, 0x24,\n                                                         0xdc, 0xf8, 0xe9, 0xdc, 0x1, 0xf7, 0x0, 0xf0,\n                                                         0x3, 0xf7, 0x79, 0xfb, 0x37, 0x15, 0x72, 0x52,\n                                                         0x5, 0x87, 0xa6, 0xad, 0x8a, 0xa6, 0x1b, 0xf7,\n                                                         0x46, 0x9e, 0xd5, 0xa8, 0xc6, 0x53, 0x93, 0x77,\n                                                         0x8e, 0x1f, 0x99, 0xa9, 0xc8, 0x8e, 0xf7, 0x43,\n                                                         0xa6, 0xe0, 0xf7, 0x78, 0x19, 0x27, 0x98, 0x5,\n                                                         0x50, 0x78, 0x4c, 0xfb, 0x17, 0xfb, 0x2c, 0x1b,\n                                                         0x38, 0xfb, 0xe, 0xbe, 0xf7, 0x54, 0xf7, 0x48,\n                                                         0xf0, 0xf7, 0x42, 0xf7, 0x54, 0xf7, 0x28, 0xa8,\n                                                         0xfb, 0x9, 0x62, 0x93, 0x1f, 0xea, 0x93, 0x5,\n                                                         0xf7, 0x54, 0x76, 0xfb, 0x3b, 0xb2, 0x2f, 0x1b,\n                                                         0xfb, 0x7f, 0xfb, 0x33, 0xfb, 0x53, 0xfb, 0x88,\n                                                         0xfb, 0x35, 0xd0, 0xfb, 0x1c, 0xf7, 0x48, 0x73,\n                                                         0x1f, 0x6a, 0x47, 0x5, 0xc4, 0x8a, 0x9d, 0x7b,\n                                                         0x78, 0x1a, 0x5f, 0x43, 0x8c, 0x57, 0x82, 0x87,\n                                                         0x8d, 0x8c, 0x6a, 0x1e, 0xe, 0xf8, 0x3c, 0x8b,\n                                                         0xdc, 0xf8, 0xc0, 0xdc, 0x1, 0xf9, 0x2c, 0xef,\n                                                         0x3, 0xdc, 0x16, 0xf7, 0x9b, 0x6, 0xf7, 0x6a,\n                                                         0xf7, 0x62, 0xf7, 0x12, 0xf7, 0xc0, 0xf7, 0x42,\n                                                         0xfb, 0xb, 0xf7, 0xa, 0xfb, 0x52, 0x1f, 0xfb,\n                                                         0x72, 0x6, 0x66, 0xfd, 0x11, 0x15, 0xf7, 0xa,\n                                                         0xf8, 0xc0, 0x5, 0xf7, 0x17, 0x6, 0xe0, 0xf7,\n                                                         0x1a, 0x87, 0xfb, 0x63, 0xfb, 0x9b, 0xfb, 0x30,\n                                                         0x39, 0xfb, 0x58, 0x1f, 0xe, 0xf8, 0x5, 0x8b,\n                                                         0xdc, 0xf7, 0x8e, 0xdd, 0xf7, 0x74, 0xdc, 0x1,\n                                                         0xe1, 0x16, 0xf8, 0xbe, 0x6b, 0xa, 0xfc, 0x5d,\n                                                         0x6, 0xc2, 0xf7, 0x8e, 0x5, 0xf8, 0x2a, 0x6,\n                                                         0x9c, 0xdd, 0x5, 0xfc, 0x29, 0x6, 0xb7, 0xf7,\n                                                         0x74, 0x5, 0xf8, 0x3e, 0x6b, 0xa, 0xfc, 0xa0,\n                                                         0x6, 0xe, 0x32, 0xa, 0xf7, 0x53, 0x77, 0x2a,\n                                                         0xa, 0xf7, 0x1e, 0xc3, 0x36, 0xa, 0xe, 0x32,\n                                                         0xa, 0xc3, 0xf7, 0x1b, 0x2a, 0xa, 0xf7, 0x1,\n                                                         0xc3, 0x30, 0xa, 0xe, 0x32, 0xa, 0xca, 0xef,\n                                                         0x2a, 0xa, 0xf7, 0xa7, 0xca, 0x2e, 0xa, 0xe,\n                                                         0x32, 0xa, 0xbe, 0xf7, 0x20, 0x2a, 0xa, 0xf7,\n                                                         0x95, 0xbe, 0x56, 0xa, 0xf7, 0x20, 0x5, 0xfb,\n                                                         0x0, 0x6, 0xe, 0xf8, 0x3c, 0x8b, 0xdc, 0xf7,\n                                                         0x8e, 0xdc, 0xf7, 0x75, 0xdc, 0x1, 0xf9, 0x2c,\n                                                         0xef, 0x3, 0xd8, 0x16, 0xf7, 0x9c, 0x6, 0xf7,\n                                                         0x6a, 0xf7, 0x65, 0xf7, 0x12, 0xf7, 0xbf, 0xf7,\n                                                         0x44, 0xfb, 0xb, 0xf7, 0x9, 0xfb, 0x55, 0x1f,\n                                                         0xfb, 0x6f, 0x6, 0x49, 0xfb, 0xc6, 0x5, 0x3a,\n                                                         0x6, 0x7a, 0x3a, 0x5, 0xdb, 0x6, 0xb6, 0xfb,\n                                                         0x8e, 0x15, 0xc2, 0xf7, 0x8e, 0x5, 0xf7, 0x64,\n                                                         0x6b, 0xa, 0xfb, 0x65, 0x6, 0xbd, 0xf7, 0x75,\n                                                         0x5, 0xf7, 0x14, 0x6, 0xe1, 0xf7, 0x1c, 0x86,\n                                                         0xfb, 0x63, 0xfb, 0x9b, 0xfb, 0x33, 0x3a, 0xfb,\n                                                         0x58, 0x1f, 0xe, 0xf8, 0x5, 0x8b, 0xd8, 0xf7,\n                                                         0x50, 0xcb, 0xc9, 0xcb, 0xf7, 0x4e, 0xd8, 0x1,\n                                                         0xd0, 0xf0, 0x3, 0x99, 0xf7, 0x9d, 0x15, 0xc2,\n                                                         0x6, 0xfb, 0x38, 0x97, 0xf2, 0x26, 0xf7, 0x4b,\n                                                         0x1b, 0xb8, 0xb6, 0x92, 0x9a, 0xb2, 0x1f, 0xa3,\n                                                         0xf0, 0x5, 0x6c, 0x62, 0x5b, 0x7c, 0x55, 0x1b,\n                                                         0xfb, 0x12, 0x44, 0xda, 0xf7, 0x1, 0x83, 0x1f,\n                                                         0xf7, 0xcb, 0x6, 0x9a, 0xcb, 0x5, 0xfb, 0xda,\n                                                         0x6, 0x8e, 0x9f, 0x8c, 0xa1, 0x90, 0x9f, 0x8,\n                                                         0xf7, 0xdf, 0x6, 0x9a, 0xcb, 0x5, 0xfb, 0xd9,\n                                                         0x6, 0xf6, 0xb8, 0xdf, 0xda, 0xf7, 0x17, 0x1b,\n                                                         0xc6, 0xc4, 0x7b, 0x5f, 0xae, 0x1f, 0xb6, 0xdc,\n                                                         0x5, 0xb3, 0x54, 0x45, 0x9b, 0x46, 0x1b, 0xfb,\n                                                         0x46, 0xfb, 0x1c, 0xfb, 0x3, 0xfb, 0x2c, 0x56,\n                                                         0x1f, 0x4a, 0x6, 0x7d, 0x4b, 0x5, 0xc9, 0x6,\n                                                         0x87, 0x77, 0x89, 0x75, 0x8a, 0x77, 0x8, 0x62,\n                                                         0x6, 0xe, 0xf7, 0xcd, 0xa0, 0x76, 0xf7, 0xd9,\n                                                         0xdd, 0xf7, 0x7a, 0xdc, 0x1, 0xe1, 0x16, 0xf0,\n                                                         0x6, 0xd3, 0xf7, 0xd9, 0x5, 0xf8, 0x19, 0x6,\n                                                         0x9d, 0xdd, 0x5, 0xfc, 0x19, 0x6, 0xbd, 0xf7,\n                                                         0x7a, 0x5, 0xf8, 0x1b, 0x6b, 0xa, 0xfc, 0x81,\n                                                         0x6, 0xe, 0x6c, 0xa, 0xf7, 0x70, 0xdd, 0xf7,\n                                                         0xb8, 0xdc, 0x1, 0xf7, 0x3, 0xef, 0x3, 0xf8,\n                                                         0x43, 0xf7, 0xae, 0x15, 0xf7, 0x75, 0x6, 0x6a,\n                                                         0xfb, 0x31, 0x5, 0x78, 0x67, 0x37, 0x5f, 0x33,\n                                                         0x1b, 0xfb, 0x15, 0x40, 0xf7, 0x1, 0xf7, 0x6,\n                                                         0xf7, 0x69, 0xf7, 0xc, 0xf7, 0x32, 0xf7, 0x49,\n                                                         0xe5, 0xd8, 0x5f, 0xfb, 0x4, 0xa2, 0x1f, 0xec,\n                                                         0x95, 0x5, 0xf7, 0x26, 0x81, 0xfb, 0x20, 0xdc,\n                                                         0xfb, 0x1a, 0x1b, 0xfb, 0xa6, 0xfb, 0x16, 0xfb,\n                                                         0x87, 0xfb, 0x65, 0x26, 0xb0, 0xfb, 0x5f, 0xf7,\n                                                         0xa0, 0xf7, 0xe, 0xf7, 0x2, 0xbc, 0xb2, 0xc9,\n                                                         0x1f, 0xc9, 0xf7, 0xbb, 0x5, 0xfb, 0xd8, 0x6,\n                                                         0xe, 0xf8, 0x3c, 0xa0, 0x76, 0xf7, 0xe5, 0xdc,\n                                                         0xf7, 0xc0, 0x77, 0x1, 0xd8, 0x16, 0xed, 0x6,\n                                                         0xd1, 0xf7, 0xe5, 0x5, 0xf8, 0xb, 0x6, 0x45,\n                                                         0xfb, 0xe5, 0x5, 0xeb, 0x6, 0xf7, 0x2d, 0xf9,\n                                                         0x62, 0x57, 0xa, 0x4b, 0xfb, 0xc0, 0x5, 0xfc,\n                                                         0xc, 0x6, 0xcb, 0xf7, 0xc0, 0x4d, 0xa, 0xe,\n                                                         0x77, 0x2d, 0xa, 0xe6, 0x16, 0xeb, 0x6, 0xf7,\n                                                         0x2e, 0xf9, 0x62, 0x4d, 0xa, 0xe, 0x54, 0xa,\n                                                         0xf7, 0x6a, 0x77, 0x1, 0xf7, 0x85, 0xf9, 0xa8,\n                                                         0x15, 0xd6, 0x6, 0xf7, 0x23, 0x6d, 0xa, 0xfb,\n                                                         0x8, 0x6, 0xfb, 0x90, 0xfe, 0x35, 0x15, 0x34,\n                                                         0xa, 0xe, 0x54, 0xa, 0xd6, 0xf7, 0x1f, 0x1,\n                                                         0xf7, 0x2f, 0xf9, 0xaa, 0x6e, 0xa, 0xda, 0xe4,\n                                                         0xb2, 0x32, 0x5, 0xd9, 0x6, 0x4e, 0x6f, 0xa,\n                                                         0x2a, 0x6, 0xfb, 0x55, 0xfe, 0x35, 0x15, 0x34,\n                                                         0xa, 0xe, 0x5c, 0xa, 0xf9, 0x6d, 0x77, 0x1,\n                                                         0xf7, 0xed, 0xf9, 0xb4, 0x15, 0xe7, 0x6, 0xa0,\n                                                         0xf0, 0x3d, 0xa, 0xfb, 0x5e, 0x26, 0x15, 0xe7,\n                                                         0x6, 0xa1, 0xf0, 0x5, 0x2e, 0x6, 0x2d, 0xfe,\n                                                         0x19, 0x15, 0x34, 0xa, 0xe, 0x54, 0xa, 0xf7,\n                                                         0x6a, 0x77, 0x1, 0xe6, 0x16, 0x34, 0xa, 0xb9,\n                                                         0xc0, 0x15, 0xce, 0x6, 0x54, 0x6d, 0xa, 0x23,\n                                                         0x6, 0xe, 0xf7, 0x5e, 0x78, 0xdb, 0xf9, 0x25,\n                                                         0x77, 0x1, 0xba, 0xea, 0x3, 0xba, 0xf7, 0x60,\n                                                         0x15, 0xfb, 0x2c, 0xc3, 0x44, 0xf7, 0x15, 0xf7,\n                                                         0x31, 0xbe, 0xf5, 0xf1, 0xa2, 0x1e, 0xf7, 0xa,\n                                                         0xf8, 0xa5, 0x5, 0x24, 0x6, 0xfb, 0x8, 0xfc,\n                                                         0xa5, 0x5, 0x49, 0x7d, 0x61, 0x4d, 0x42, 0x1b,\n                                                         0x5b, 0x60, 0xbe, 0xee, 0x1f, 0xe, 0xf8, 0x5,\n                                                         0x2d, 0xa, 0xf9, 0x1f, 0xf7, 0x21, 0x3, 0xd7,\n                                                         0x16, 0xf0, 0x6, 0xbe, 0xf7, 0x7e, 0xf7, 0x31,\n                                                         0xf7, 0x17, 0xf7, 0x6d, 0xfc, 0x1, 0x5, 0xf7,\n                                                         0x4, 0x6, 0xfb, 0x93, 0xf8, 0x3f, 0xf7, 0xf1,\n                                                         0xf7, 0xb7, 0x5, 0xfb, 0x21, 0x6, 0xfc, 0x30,\n                                                         0xfb, 0xf1, 0xdb, 0xf7, 0xf1, 0x5, 0x26, 0x6,\n                                                         0xe, 0x8b, 0xdc, 0xf9, 0x11, 0x77, 0x1, 0xd7,\n                                                         0x16, 0xf8, 0x62, 0x55, 0xa, 0xfc, 0x2, 0x6,\n                                                         0xf7, 0x19, 0xf9, 0x11, 0x50, 0xa, 0xe, 0x8b,\n                                                         0xdc, 0xf9, 0x11, 0x77, 0x1, 0xd1, 0x16, 0xf8,\n                                                         0x68, 0x55, 0xa, 0xfc, 0x7, 0x6, 0xc4, 0xf7,\n                                                         0xa7, 0xf7, 0x54, 0xf7, 0x0, 0x9c, 0xdc, 0xfb,\n                                                         0x54, 0x21, 0xc6, 0xf7, 0xab, 0x50, 0xa, 0x43,\n                                                         0xfb, 0xe8, 0x30, 0x59, 0x7a, 0x37, 0xe6, 0xbf,\n                                                         0x5, 0xe, 0xf8, 0xab, 0x2d, 0xa, 0xd4, 0x16,\n                                                         0xe9, 0x6, 0xf7, 0xd, 0xf8, 0xf4, 0xe2, 0xfc,\n                                                         0xf4, 0x5, 0xe8, 0x6, 0xf7, 0xf0, 0xf8, 0xf9,\n                                                         0xfb, 0x28, 0xfc, 0xf9, 0x5, 0xea, 0x6, 0xf7,\n                                                         0x2b, 0xf9, 0x62, 0x5, 0xfb, 0xc, 0x6, 0xfb,\n                                                         0xfc, 0xfd, 0x15, 0x30, 0xf9, 0x15, 0x5, 0xfb,\n                                                         0xa, 0x6, 0xe, 0xf8, 0x3c, 0x2d, 0xa, 0xcb,\n                                                         0xf9, 0x67, 0x3, 0xd7, 0x16, 0xea, 0x6, 0xf7,\n                                                         0xb, 0xf8, 0xf4, 0xf7, 0x99, 0xfc, 0xf4, 0x5,\n                                                         0xeb, 0x6, 0xf7, 0x2c, 0xf9, 0x62, 0x4d, 0xa,\n                                                         0xfb, 0xf, 0xfc, 0xf5, 0xfb, 0x97, 0xf8, 0xf5,\n                                                         0x4d, 0xa, 0xe, 0xf8, 0x3c, 0xa0, 0x76, 0xf9,\n                                                         0x6d, 0x77, 0xf7, 0xa, 0x76, 0xf7, 0x3, 0x77,\n                                                         0x12, 0xd7, 0x16, 0xea, 0x6, 0xf7, 0xd, 0xf8,\n                                                         0xfc, 0x48, 0xa, 0xf7, 0x95, 0xfc, 0xfc, 0x5,\n                                                         0xeb, 0x6, 0xf7, 0x2c, 0xf9, 0x6d, 0x4d, 0xa,\n                                                         0xfb, 0xf, 0xfc, 0xfe, 0x4e, 0xa, 0xfb, 0x94,\n                                                         0xf8, 0xfe, 0x4d, 0xa, 0xf7, 0x19, 0xd8, 0x15,\n                                                         0xca, 0x66, 0xa, 0xa4, 0x1b, 0x13, 0x10, 0xa5,\n                                                         0xa0, 0x83, 0x82, 0x9e, 0x1f, 0x7f, 0xa3, 0xa0,\n                                                         0x7e, 0xa4, 0x1b, 0xc6, 0xad, 0xc2, 0xc1, 0x90,\n                                                         0x1f, 0x4e, 0x69, 0xa, 0x5e, 0xa, 0x13, 0x30,\n                                                         0x96, 0x72, 0x6f, 0x96, 0x6d, 0x1b, 0x46, 0x7a,\n                                                         0x57, 0x50, 0x7b, 0x1f, 0xe, 0x6c, 0xa, 0xf8,\n                                                         0xe6, 0xdc, 0x1, 0xf7, 0x18, 0xef, 0xf8, 0x59,\n                                                         0xef, 0x3, 0xf7, 0x21, 0xf7, 0xbb, 0x15, 0xfb,\n                                                         0x40, 0xf5, 0xfb, 0x22, 0xf7, 0x47, 0xf7, 0x60,\n                                                         0xf7, 0x34, 0xf7, 0x54, 0xf7, 0x80, 0xf7, 0x52,\n                                                         0xfb, 0x1, 0xf7, 0x1e, 0xfb, 0x47, 0xfb, 0x55,\n                                                         0xfb, 0x3c, 0xfb, 0x3f, 0xfb, 0xa3, 0x1e, 0xe5,\n                                                         0x16, 0xf7, 0x89, 0xf7, 0x28, 0xf7, 0x8, 0xf7,\n                                                         0xf, 0xf0, 0xec, 0x30, 0xfb, 0x30, 0xfb, 0x46,\n                                                         0xfb, 0x2, 0xfb, 0x3d, 0xfb, 0x31, 0x27, 0x25,\n                                                         0xdc, 0xf7, 0x2c, 0x1e, 0xe, 0xf9, 0x52, 0x78,\n                                                         0xdc, 0x46, 0xd0, 0x46, 0xde, 0xf7, 0x8f, 0xde,\n                                                         0xf7, 0x7b, 0xdf, 0x46, 0xdc, 0x12, 0xed, 0xe8,\n                                                         0x13, 0x3a, 0xf8, 0xa6, 0x84, 0x15, 0xf8, 0x67,\n                                                         0x6, 0x9d, 0xde, 0x5, 0xfc, 0x3, 0x6, 0xc2,\n                                                         0xf7, 0x8f, 0x5, 0xf7, 0xd4, 0x6, 0x9d, 0xde,\n                                                         0x5, 0xfb, 0xd4, 0x6, 0xbd, 0xf7, 0x7b, 0x5,\n                                                         0xf7, 0xdb, 0x6, 0x9d, 0xdf, 0x5, 0xfc, 0x41,\n                                                         0x6, 0x78, 0x34, 0x5, 0x13, 0x96, 0xdb, 0x51,\n                                                         0x3c, 0x9e, 0x52, 0x1b, 0xfb, 0x66, 0xfb, 0x3a,\n                                                         0xfb, 0x4b, 0xfb, 0x93, 0xfb, 0x69, 0xf7, 0xe,\n                                                         0x22, 0xf7, 0x26, 0xf2, 0xba, 0xb6, 0xa0, 0xa5,\n                                                         0x1f, 0x13, 0x56, 0xfb, 0xf3, 0xf7, 0x92, 0x15,\n                                                         0xf7, 0x2c, 0xf7, 0x3, 0xf7, 0x61, 0xf7, 0x39,\n                                                         0xde, 0xdc, 0x4f, 0x25, 0x59, 0x6c, 0xfb, 0x32,\n                                                         0x74, 0x50, 0x1e, 0x6d, 0x80, 0x59, 0xfb, 0x1b,\n                                                         0xfb, 0x21, 0x1b, 0xfb, 0x23, 0x62, 0xef, 0xf7,\n                                                         0x1d, 0x1f, 0xe, 0xf8, 0x74, 0x78, 0xdd, 0xf9,\n                                                         0x7e, 0x76, 0xf7, 0x21, 0x77, 0x1, 0xf4, 0xf0,\n                                                         0xf8, 0x9b, 0xf0, 0x3, 0xf8, 0x51, 0xf9, 0xa8,\n                                                         0x15, 0xda, 0x6, 0xf7, 0x1d, 0x6d, 0xa, 0xfb,\n                                                         0xa, 0x6, 0xfc, 0x4a, 0x28, 0xa, 0xf8, 0x74,\n                                                         0x78, 0xdd, 0xf9, 0xc4, 0xbd, 0x1, 0xf4, 0xf0,\n                                                         0xf7, 0xc4, 0xf2, 0xf7, 0x4, 0xf0, 0x3, 0xf8,\n                                                         0x8, 0xf9, 0xa9, 0x15, 0xec, 0x6, 0xe0, 0xe5,\n                                                         0xb4, 0x31, 0x5, 0xdd, 0x6, 0x4b, 0xf7, 0x20,\n                                                         0x5, 0x24, 0x6, 0xfc, 0x29, 0x28, 0xa, 0x6c,\n                                                         0xa, 0xf9, 0x74, 0xf2, 0x1, 0x68, 0xa, 0x3,\n                                                         0xf4, 0xf7, 0xc1, 0x21, 0xa, 0xf8, 0x1, 0xf8,\n                                                         0x8a, 0x15, 0xec, 0x6, 0xa2, 0xf2, 0x57, 0xa,\n                                                         0xfb, 0x68, 0x24, 0x15, 0xec, 0x6, 0xa1, 0xf2,\n                                                         0x5, 0x2a, 0x6, 0xe, 0xf8, 0x74, 0x78, 0xdd,\n                                                         0xf8, 0xef, 0xdd, 0x1, 0x68, 0xa, 0x3, 0xf8,\n                                                         0x94, 0xf9, 0xa9, 0x15, 0xd4, 0x6, 0x4f, 0xf7,\n                                                         0x20, 0x5, 0xfb, 0x5, 0x6, 0xfb, 0xc7, 0x28,\n                                                         0xa, 0xf8, 0x74, 0x8d, 0x76, 0xae, 0xdf, 0xf8,\n                                                         0x9b, 0xdf, 0xad, 0x77, 0x1, 0xbb, 0xe0, 0xf8,\n                                                         0x97, 0xe5, 0x3, 0xa6, 0x9b, 0x15, 0xba, 0x68,\n                                                         0xdd, 0xe3, 0x5, 0x67, 0xc3, 0xcd, 0x7a, 0xcf,\n                                                         0x1b, 0xf7, 0x77, 0xf7, 0x39, 0xf7, 0x43, 0xf7,\n                                                         0x65, 0xce, 0x81, 0xdd, 0x4e, 0xcb, 0x1f, 0xdf,\n                                                         0xe3, 0x5c, 0xaf, 0x3a, 0x34, 0x5, 0xbe, 0x3b,\n                                                         0x33, 0x8d, 0x6f, 0x1b, 0xfb, 0x84, 0xfb, 0x1f,\n                                                         0xfb, 0x54, 0xfb, 0x5c, 0x4e, 0x92, 0x3e, 0xc3,\n                                                         0x49, 0x1f, 0xc8, 0xc8, 0x15, 0x6c, 0xb2, 0x83,\n                                                         0xc6, 0xba, 0x1a, 0xf7, 0x3b, 0xf7, 0x1a, 0xf7,\n                                                         0x1f, 0xf7, 0x35, 0xc0, 0xc3, 0x81, 0x74, 0xa6,\n                                                         0x1e, 0xfb, 0xf3, 0xfc, 0x5c, 0x15, 0xf8, 0x1b,\n                                                         0xf8, 0x35, 0x5, 0x9e, 0x6e, 0xa4, 0x55, 0x49,\n                                                         0x1a, 0xfb, 0x2c, 0xfb, 0x13, 0xfb, 0x26, 0xfb,\n                                                         0x39, 0x5a, 0x52, 0x8e, 0xa6, 0x66, 0x1e, 0xe,\n                                                         0x6c, 0xa, 0xf9, 0x7b, 0xf7, 0x1, 0x8e, 0x77,\n                                                         0x12, 0x68, 0xa, 0x13, 0xd8, 0xf7, 0xf9, 0xf9,\n                                                         0xb9, 0x15, 0xcb, 0x6, 0xa4, 0x90, 0x97, 0x9c,\n                                                         0xa4, 0x1b, 0xa7, 0xa0, 0x83, 0x82, 0x9e, 0x1f,\n                                                         0x7f, 0xa4, 0xa0, 0x7d, 0xa6, 0x1b, 0xc8, 0xae,\n                                                         0xc2, 0xc2, 0x90, 0x1f, 0x4d, 0x69, 0xa, 0x70,\n                                                         0x1b, 0x13, 0xb8, 0x7b, 0x75, 0x96, 0x96, 0x71,\n                                                         0x1f, 0x95, 0x73, 0x6f, 0x95, 0x6e, 0x1b, 0x13,\n                                                         0xd8, 0x44, 0x79, 0x57, 0x4f, 0x7c, 0x1f, 0xfb,\n                                                         0x90, 0xfc, 0x8c, 0x21, 0xa, 0xe, 0x35, 0xa,\n                                                         0xf7, 0xb6, 0xdc, 0xf7, 0xa0, 0xda, 0x1, 0xf9,\n                                                         0x16, 0xea, 0x3, 0xe1, 0x16, 0xeb, 0x6, 0xc7,\n                                                         0xf7, 0xb6, 0x5, 0xf7, 0x47, 0x6, 0xf7, 0x32,\n                                                         0xf7, 0x32, 0xd7, 0xf7, 0x40, 0xf7, 0x1b, 0x33,\n                                                         0xb8, 0xfb, 0x7, 0x1f, 0xfb, 0xbf, 0x6, 0xa3,\n                                                         0xfb, 0xef, 0x15, 0xc2, 0xf7, 0xa0, 0x5, 0xf7,\n                                                         0x4c, 0x6, 0xd1, 0xd5, 0x8a, 0x27, 0xfb, 0x1c,\n                                                         0xfb, 0x18, 0x6c, 0x2d, 0x1f, 0xe, 0xf8, 0x74,\n                                                         0x68, 0x76, 0xcf, 0xd8, 0xf8, 0xcf, 0xd8, 0x1,\n                                                         0xf7, 0x1c, 0xf0, 0xf8, 0x7c, 0xf0, 0x3, 0xf8,\n                                                         0xcd, 0xb7, 0x15, 0xb0, 0x5f, 0xb0, 0x6c, 0xb1,\n                                                         0x72, 0xb3, 0xc3, 0x18, 0x7d, 0x95, 0x5e, 0xa6,\n                                                         0x69, 0xb5, 0x8, 0xef, 0xd8, 0xc9, 0xf7, 0xf,\n                                                         0xf7, 0x23, 0x1a, 0xf7, 0x4a, 0xfb, 0x1, 0xf7,\n                                                         0x19, 0xfb, 0x49, 0xfb, 0x75, 0xfb, 0x1a, 0xfb,\n                                                         0x67, 0xfb, 0x60, 0xfb, 0xb9, 0xf7, 0x7b, 0x7a,\n                                                         0xcb, 0xb6, 0xb9, 0x95, 0xa1, 0xb7, 0x1e, 0xfb,\n                                                         0x24, 0xf7, 0x10, 0x15, 0xac, 0x7a, 0x9f, 0x7c,\n                                                         0xad, 0x6c, 0x8, 0x80, 0x6d, 0x6c, 0x86, 0x6c,\n                                                         0x1b, 0x53, 0xfb, 0x18, 0xbb, 0xf7, 0x4d, 0xf7,\n                                                         0x52, 0xf7, 0xa, 0xf7, 0x28, 0xf7, 0x2d, 0xe5,\n                                                         0xf5, 0x3d, 0xfb, 0x34, 0x26, 0x60, 0xfb, 0x7,\n                                                         0x37, 0x49, 0x1f, 0x83, 0x94, 0x76, 0x9f, 0x6c,\n                                                         0xad, 0x55, 0xa3, 0x19, 0xe, 0xf8, 0x3c, 0xa0,\n                                                         0x76, 0xf7, 0xd2, 0xd8, 0xf7, 0x88, 0xda, 0x1,\n                                                         0xf9, 0x3d, 0xe7, 0x3, 0xe3, 0x16, 0xeb, 0x6,\n                                                         0xcd, 0xf7, 0xd2, 0x5, 0xf7, 0x2, 0x6, 0xf7,\n                                                         0x10, 0xaf, 0x2f, 0x2e, 0xaf, 0x1f, 0xbf, 0xfb,\n                                                         0x19, 0x5, 0xf6, 0x6, 0x54, 0xf7, 0x19, 0x6d,\n                                                         0xd3, 0x64, 0xd2, 0x4d, 0xb9, 0x19, 0xbe, 0x92,\n                                                         0xf7, 0x55, 0xa4, 0xf7, 0x4f, 0x1a, 0xf7, 0x43,\n                                                         0xfb, 0x25, 0x8d, 0x30, 0x1e, 0xfb, 0xbf, 0x6,\n                                                         0xa8, 0xfb, 0xd7, 0x15, 0xbd, 0xf7, 0x88, 0x5,\n                                                         0xf7, 0x70, 0x6, 0xbe, 0xe8, 0x87, 0x2d, 0xfb,\n                                                         0x27, 0xfb, 0x2a, 0x8c, 0xfb, 0x19, 0x1f, 0xe,\n                                                         0xf8, 0x5, 0x78, 0xdb, 0xf8, 0xe8, 0xdb, 0x12,\n                                                         0xe5, 0xeb, 0x86, 0xea, 0xf7, 0xaf, 0xee, 0x62,\n                                                         0xeb, 0x13, 0xe8, 0xe5, 0xf7, 0x7a, 0x15, 0xfb,\n                                                         0x48, 0xf7, 0x1c, 0x46, 0xf7, 0x28, 0xf7, 0x43,\n                                                         0xf7, 0x1, 0xe6, 0xf7, 0x9, 0xf7, 0xb, 0x36,\n                                                         0xb7, 0xfb, 0x21, 0xc8, 0x1e, 0x13, 0xd4, 0xfb,\n                                                         0x0, 0xba, 0x5b, 0x9d, 0xca, 0x1a, 0xe8, 0xf7,\n                                                         0x4, 0xa2, 0xba, 0xe1, 0xeb, 0x53, 0x2f, 0x1e,\n                                                         0xeb, 0x92, 0x5, 0xe0, 0x49, 0xf7, 0x1c, 0xfb,\n                                                         0x64, 0xfb, 0x2a, 0xfb, 0x0, 0x41, 0xfb, 0xe,\n                                                         0xfb, 0xe, 0xf7, 0x0, 0x5e, 0xf7, 0x0, 0x5c,\n                                                         0x1e, 0x13, 0xe8, 0xf5, 0x5d, 0xc3, 0x70, 0x4a,\n                                                         0x1a, 0x4a, 0x4e, 0x4c, 0xfb, 0xd, 0xfb, 0x40,\n                                                         0x78, 0xe6, 0xe1, 0x1e, 0xe, 0xf8, 0x5, 0x78,\n                                                         0xdd, 0xf8, 0xf1, 0xdd, 0xb2, 0xf7, 0x20, 0x12,\n                                                         0xe5, 0xec, 0x86, 0xeb, 0xf7, 0xb1, 0xef, 0x13,\n                                                         0xf4, 0xe5, 0xf7, 0x7f, 0x15, 0xfb, 0x4c, 0xf7,\n                                                         0x1d, 0x45, 0xf7, 0x29, 0xf7, 0x45, 0xf7, 0x2,\n                                                         0xe6, 0xf7, 0xc, 0xf7, 0xf, 0x35, 0xb6, 0xfb,\n                                                         0x22, 0xcb, 0x1e, 0x13, 0xec, 0xfb, 0x1, 0xbb,\n                                                         0x5b, 0x9c, 0xcc, 0x1a, 0xea, 0xf7, 0x3, 0xa0,\n                                                         0xbc, 0xe1, 0xe7, 0x62, 0xfb, 0x0, 0x1e, 0xec,\n                                                         0x93, 0x5, 0xeb, 0x4e, 0xf7, 0x13, 0xfb, 0x66,\n                                                         0xfb, 0x2b, 0xfb, 0x1, 0x41, 0xfb, 0x10, 0xfb,\n                                                         0x11, 0xf7, 0x1, 0x5d, 0xf7, 0x0, 0x5b, 0x1e,\n                                                         0xf6, 0x5e, 0xc4, 0x6e, 0x48, 0x1a, 0x4a, 0x4e,\n                                                         0x4b, 0xfb, 0xf, 0x1e, 0x13, 0xf4, 0xfb, 0x20,\n                                                         0x5a, 0xe0, 0xea, 0x88, 0x1f, 0xf7, 0x70, 0xf8,\n                                                         0xb6, 0x15, 0xef, 0x6, 0xf7, 0x1b, 0xf7, 0x20,\n                                                         0x5, 0x2d, 0x6, 0x38, 0x31, 0x63, 0xe5, 0x5,\n                                                         0x39, 0x6, 0xe, 0xf7, 0xcd, 0xa0, 0x76, 0xf9,\n                                                         0x11, 0xdc, 0x1, 0xf7, 0x94, 0x16, 0xee, 0x6,\n                                                         0xf7, 0x1c, 0xf9, 0x11, 0x5, 0xf7, 0x85, 0x6b,\n                                                         0xa, 0xfc, 0xdc, 0x6, 0x79, 0x3a, 0x5, 0xf7,\n                                                         0x89, 0x6, 0xe, 0x35, 0xa, 0xf7, 0x26, 0xdc,\n                                                         0xf7, 0xa0, 0xda, 0xf7, 0x24, 0x77, 0x1, 0xf8,\n                                                         0xfd, 0xea, 0x3, 0xe1, 0x16, 0xeb, 0x6, 0xaa,\n                                                         0xf7, 0x26, 0x5, 0xf7, 0x47, 0x6, 0xf7, 0x33,\n                                                         0xf7, 0x35, 0xcd, 0xf7, 0x41, 0xf7, 0x1c, 0x30,\n                                                         0xc0, 0xfb, 0x7, 0x1f, 0xfb, 0x61, 0x6, 0xaa,\n                                                         0xf7, 0x24, 0x50, 0xa, 0x85, 0xfc, 0x7f, 0x15,\n                                                         0xc2, 0xf7, 0xa0, 0x5, 0xf7, 0x4d, 0x6, 0xd1,\n                                                         0xd8, 0x82, 0x26, 0xfb, 0x1d, 0xfb, 0x1b, 0x76,\n                                                         0x2c, 0x1f, 0xe, 0xf8, 0x3c, 0x78, 0xdd, 0xf9,\n                                                         0x23, 0x42, 0xa, 0xf7, 0x77, 0xf9, 0x62, 0x15,\n                                                         0x8f, 0xfb, 0x0, 0xfc, 0x7b, 0x65, 0xfb, 0x22,\n                                                         0xf7, 0x9, 0x45, 0xf7, 0x27, 0xf7, 0x91, 0xbb,\n                                                         0xf7, 0x7a, 0xde, 0x9d, 0x1f, 0xe6, 0xf8, 0x3c,\n                                                         0x57, 0xa, 0x30, 0xfc, 0x3c, 0x5, 0xfb, 0x10,\n                                                         0x72, 0x5c, 0x20, 0xfb, 0x2e, 0x1b, 0x39, 0x3b,\n                                                         0xb7, 0xe1, 0x1f, 0xf4, 0xf8, 0xa1, 0x5, 0xe,\n                                                         0xf8, 0x3c, 0x78, 0xdf, 0xf9, 0x31, 0x77, 0xe9,\n                                                         0x76, 0xf7, 0x22, 0x42, 0xa, 0xf8, 0x49, 0xf9,\n                                                         0xa7, 0x15, 0xd5, 0x6, 0xf7, 0x19, 0xf7, 0x22,\n                                                         0x5, 0xfb, 0x7, 0x6, 0xfb, 0xc1, 0xfb, 0x57,\n                                                         0x15, 0x8b, 0x22, 0xfc, 0x85, 0x64, 0x1a, 0xfb,\n                                                         0x25, 0xf7, 0xa, 0x43, 0xf7, 0x28, 0xf7, 0x90,\n                                                         0xbb, 0xf7, 0x7f, 0xe1, 0x9c, 0x1e, 0xe6, 0xf8,\n                                                         0x44, 0x57, 0xa, 0x32, 0xfc, 0x44, 0x5, 0xfb,\n                                                         0xb, 0x75, 0x48, 0xfb, 0xa, 0xfb, 0x1e, 0x1b,\n                                                         0x3a, 0x39, 0xb8, 0xe3, 0x1f, 0xf4, 0xf8, 0xac,\n                                                         0x5, 0xe, 0xf8, 0x3c, 0x78, 0xdf, 0xf9, 0x32,\n                                                         0x42, 0xa, 0xf8, 0x2, 0xf9, 0xa8, 0x15, 0xe8,\n                                                         0x6, 0xdd, 0xe5, 0xb3, 0x31, 0x5, 0xdb, 0x6,\n                                                         0x4d, 0xf7, 0x21, 0x47, 0xa, 0xfb, 0xa3, 0xfb,\n                                                         0x56, 0x2c, 0xa, 0xf8, 0x3c, 0x78, 0xde, 0xf9,\n                                                         0x2b, 0x77, 0xf7, 0x56, 0x42, 0xa, 0xf8, 0xcb,\n                                                         0xf9, 0xb2, 0x15, 0xe9, 0x6, 0xa0, 0xf2, 0x5,\n                                                         0x2d, 0x6, 0xfb, 0x62, 0x24, 0x15, 0xe9, 0x6,\n                                                         0xa1, 0xf2, 0x5, 0x2d, 0x6, 0xfb, 0x44, 0xfb,\n                                                         0x3a, 0x2c, 0xa, 0xf8, 0x3c, 0x78, 0xdf, 0xf9,\n                                                         0x33, 0x77, 0xd4, 0xf7, 0x20, 0x1, 0xf7, 0xf,\n                                                         0xeb, 0x3, 0xf7, 0x77, 0xf9, 0x74, 0x15, 0x8b,\n                                                         0x23, 0xfc, 0x87, 0x64, 0x1a, 0xfb, 0x25, 0xf7,\n                                                         0x9, 0x43, 0xf7, 0x27, 0xf7, 0x92, 0xbb, 0xf7,\n                                                         0x80, 0xe0, 0x9d, 0x1e, 0xe5, 0xf8, 0x46, 0x57,\n                                                         0xa, 0x33, 0xfc, 0x46, 0x5, 0xfb, 0xb, 0x74,\n                                                         0x48, 0xfb, 0xa, 0xfb, 0x1f, 0x1b, 0x39, 0x3a,\n                                                         0xb8, 0xe3, 0x1f, 0xf4, 0xf8, 0xae, 0x5, 0xf7,\n                                                         0x4e, 0xc0, 0x15, 0xd2, 0x6, 0x50, 0xf7, 0x20,\n                                                         0x5, 0xfb, 0x2, 0x6, 0xe, 0xf8, 0x5, 0x2d,\n                                                         0xa, 0xf7, 0xcc, 0x16, 0xf1, 0x6, 0xf8, 0x16,\n                                                         0xf9, 0x62, 0x5, 0x28, 0x6, 0xfb, 0xd5, 0xfc,\n                                                         0xfd, 0xfb, 0x7, 0xf8, 0xfd, 0x3d, 0xa, 0xe,\n                                                         0xf9, 0x1a, 0x2d, 0xa, 0xf7, 0x52, 0xdf, 0xf7,\n                                                         0xe6, 0xd9, 0xf7, 0xbc, 0xea, 0x3, 0xf7, 0x68,\n                                                         0x16, 0xec, 0x6, 0xf7, 0xb3, 0xf8, 0xd0, 0x48,\n                                                         0xa, 0xa7, 0xfc, 0xd0, 0x5, 0xf0, 0x6, 0xf7,\n                                                         0xf6, 0xf9, 0x62, 0x4d, 0xa, 0xfb, 0xac, 0xfc,\n                                                         0xe5, 0x4e, 0xa, 0x70, 0xf8, 0xe5, 0x5, 0x2a,\n                                                         0x6, 0xfb, 0xb9, 0xfc, 0xde, 0x89, 0x8d, 0x76,\n                                                         0xf8, 0xdc, 0x4d, 0xa, 0xe, 0xf8, 0x5, 0x2d,\n                                                         0xa, 0x9e, 0x16, 0xf7, 0xe, 0x6, 0xf7, 0x92,\n                                                         0xf7, 0xb4, 0xf7, 0x2b, 0xfb, 0xb4, 0x5, 0xef,\n                                                         0x6, 0xfb, 0x51, 0xf7, 0xee, 0xf7, 0xe1, 0xf8,\n                                                         0x8, 0x5, 0xfb, 0xc, 0x6, 0xfb, 0x98, 0xfb,\n                                                         0xbc, 0xfb, 0x30, 0xf7, 0xbc, 0x5, 0x26, 0x6,\n                                                         0xf7, 0x57, 0xfb, 0xf8, 0x5, 0xe, 0xf8, 0x5,\n                                                         0x2d, 0xa, 0xf7, 0x3b, 0xef, 0xf8, 0x40, 0xf7,\n                                                         0x3, 0x3, 0xf7, 0xda, 0x16, 0xe8, 0x6, 0xc2,\n                                                         0xf7, 0xa1, 0xf7, 0xe0, 0xf8, 0x55, 0x51, 0xa,\n                                                         0xfb, 0xf9, 0xfb, 0x3d, 0xf7, 0xf9, 0x47, 0xa,\n                                                         0xf7, 0x6b, 0xfc, 0x4d, 0x5, 0xe, 0x35, 0xa,\n                                                         0xfa, 0x35, 0x77, 0x1, 0xf7, 0xda, 0x16, 0xe7,\n                                                         0x6, 0xc3, 0xf7, 0xaa, 0xf7, 0xe0, 0xf8, 0x5f,\n                                                         0x51, 0xa, 0xfc, 0x0, 0xfb, 0x3d, 0xf8, 0x0,\n                                                         0x47, 0xa, 0xf7, 0x6a, 0xfc, 0x57, 0x5, 0xb1,\n                                                         0xf8, 0x8c, 0x15, 0xd2, 0x6, 0xf7, 0x13, 0x6f,\n                                                         0xa, 0xfb, 0x1, 0x6, 0xe, 0x35, 0xa, 0xf9,\n                                                         0x6d, 0x77, 0xe5, 0xf1, 0x1, 0xf7, 0xda, 0x16,\n                                                         0xe7, 0x6, 0xc3, 0xf7, 0xa6, 0xf7, 0xe0, 0xf8,\n                                                         0x5b, 0x51, 0xa, 0xfb, 0xfd, 0xfb, 0x3d, 0xf7,\n                                                         0xfd, 0x47, 0xa, 0xf7, 0x6a, 0xfc, 0x5b, 0x5,\n                                                         0xf7, 0x36, 0xf8, 0xa1, 0x15, 0xe5, 0x6, 0x9f,\n                                                         0xf1, 0x3f, 0xa, 0xfb, 0x57, 0x25, 0x15, 0xe4,\n                                                         0x6, 0xa0, 0xf1, 0x3e, 0xa, 0xf7, 0xcd, 0x8b,\n                                                         0xdc, 0xf8, 0xc0, 0xdc, 0x1, 0x84, 0x16, 0xf9,\n                                                         0x2, 0x6, 0x9f, 0xdc, 0x5, 0xfc, 0x7f, 0x6,\n                                                         0xf8, 0xe0, 0xf8, 0xc6, 0x94, 0xd6, 0x5, 0xfc,\n                                                         0xd8, 0x6, 0x77, 0x3a, 0xf8, 0x5d, 0x8c, 0xfc,\n                                                         0xe6, 0xfc, 0xca, 0x5, 0xe, 0xf7, 0xcd, 0x8b,\n                                                         0xdf, 0xf9, 0x56, 0xf7, 0x1f, 0x1, 0x84, 0x16,\n                                                         0xf8, 0xf8, 0x6, 0x9f, 0xdf, 0x5, 0xfc, 0x75,\n                                                         0x6, 0xf8, 0xe0, 0xf8, 0xd6, 0x94, 0xd8, 0x5,\n                                                         0xfc, 0xd8, 0x6, 0x77, 0x37, 0xf8, 0x57, 0x8a,\n                                                         0xfc, 0xe0, 0xfc, 0xd8, 0x5, 0xf8, 0x24, 0xf9,\n                                                         0x60, 0x15, 0xf7, 0x6, 0x6, 0xf7, 0x2d, 0x6f,\n                                                         0xa, 0x20, 0x6, 0x2d, 0x31, 0x5d, 0xe5, 0x45,\n                                                         0xa, 0xe, 0x7c, 0xd1, 0x66, 0x76, 0xf7, 0x8b,\n                                                         0xcd, 0xf7, 0x2e, 0xd5, 0x12, 0xc8, 0xe7, 0x13,\n                                                         0x78, 0xf8, 0x3c, 0x88, 0x15, 0xe8, 0x6, 0x85,\n                                                         0xa7, 0x87, 0x9f, 0xa3, 0x1a, 0xae, 0x91, 0xad,\n                                                         0x92, 0xad, 0x1e, 0xaa, 0xf7, 0x17, 0x5, 0x91,\n                                                         0xa4, 0x8d, 0xa4, 0xa2, 0x1a, 0xe7, 0x51, 0xd1,\n                                                         0xfb, 0x25, 0x40, 0xfb, 0x25, 0x60, 0xfb, 0xb,\n                                                         0x73, 0x1e, 0xe9, 0x83, 0x5, 0xd8, 0xa7, 0xc6,\n                                                         0x9e, 0xc6, 0x1b, 0x13, 0xb8, 0xc1, 0xe3, 0x7b,\n                                                         0xfb, 0xb, 0x6a, 0x1f, 0x65, 0x7d, 0x64, 0x89,\n                                                         0x3d, 0x88, 0x8, 0x4d, 0x89, 0xfb, 0x4b, 0x83,\n                                                         0xfb, 0x36, 0x1a, 0x29, 0xd6, 0x54, 0xe6, 0x1e,\n                                                         0xe8, 0xca, 0xc0, 0xa5, 0xa9, 0x1f, 0x8c, 0x7f,\n                                                         0x8d, 0x6e, 0x93, 0x71, 0x8, 0xa2, 0xf7, 0xa1,\n                                                         0x15, 0x82, 0x56, 0x80, 0x5f, 0x71, 0x66, 0x8,\n                                                         0x5a, 0x69, 0x53, 0x6f, 0x53, 0x1b, 0x3c, 0x74,\n                                                         0xb7, 0xb2, 0xe0, 0xe8, 0x9a, 0xc7, 0x91, 0x1f,\n                                                         0xdd, 0x92, 0xa4, 0x8d, 0xad, 0x98, 0x8, 0xe,\n                                                         0x4a, 0xa, 0xf8, 0x39, 0x77, 0x12, 0xc8, 0xea,\n                                                         0xf7, 0xe1, 0xed, 0x13, 0x7c, 0xf7, 0xcf, 0xf8,\n                                                         0xe9, 0x15, 0xda, 0x6, 0xf7, 0x21, 0xf7, 0x1d,\n                                                         0x5, 0xfb, 0xd, 0x6, 0x90, 0xfd, 0x75, 0x22,\n                                                         0xa, 0xe, 0x4a, 0xa, 0xf7, 0xb0, 0xf7, 0x1d,\n                                                         0x12, 0x13, 0x70, 0xf7, 0x7b, 0xf8, 0xe9, 0x15,\n                                                         0xe8, 0x6, 0xdd, 0xe2, 0xb3, 0x34, 0x5, 0xdb,\n                                                         0x6, 0x4d, 0xf7, 0x1d, 0x47, 0xa, 0xc2, 0xfd,\n                                                         0x75, 0x20, 0xa, 0x13, 0xb0, 0x2b, 0xa, 0xae,\n                                                         0xf8, 0xfa, 0x76, 0xf7, 0x21, 0x77, 0x1, 0xf7,\n                                                         0x8c, 0xf8, 0xe5, 0x15, 0xdd, 0x6, 0xf7, 0x25,\n                                                         0x6d, 0xa, 0xfb, 0x11, 0x6, 0xe, 0x7c, 0xd0,\n                                                         0x67, 0x76, 0xf7, 0x8a, 0xcd, 0xf7, 0xbe, 0xee,\n                                                         0x12, 0xc8, 0xe5, 0xf7, 0xcf, 0xe8, 0x13, 0x7c,\n                                                         0xf8, 0x44, 0xf8, 0xf3, 0x15, 0xe9, 0x6, 0xa1,\n                                                         0xee, 0x4d, 0xa, 0xfb, 0x62, 0x28, 0x15, 0xea,\n                                                         0x6, 0xa0, 0xee, 0x5, 0x2d, 0x6, 0xf7, 0x2a,\n                                                         0xfd, 0x59, 0x22, 0xa, 0xe, 0xf8, 0xe3, 0x7c,\n                                                         0xd1, 0xf7, 0x4c, 0xcf, 0xf7, 0x35, 0xd0, 0x8c,\n                                                         0x77, 0x12, 0xc8, 0xe6, 0x13, 0xe8, 0xf8, 0x47,\n                                                         0xf1, 0x15, 0x44, 0xa8, 0xe3, 0x5d, 0xd6, 0x1b,\n                                                         0xf7, 0x39, 0xcc, 0xf7, 0x1b, 0xbb, 0xa2, 0x1f,\n                                                         0x2f, 0x93, 0x5, 0x33, 0x5f, 0x4c, 0x6e, 0x57,\n                                                         0x1b, 0x44, 0x50, 0xcd, 0xf7, 0x6, 0x99, 0x1f,\n                                                         0xf8, 0x19, 0x6, 0x8d, 0x9a, 0x90, 0xad, 0xa9,\n                                                         0x1a, 0xf7, 0x7, 0x46, 0xf3, 0xfb, 0x20, 0x49,\n                                                         0x4b, 0x72, 0x5c, 0x5d, 0x1e, 0x13, 0xd8, 0x9f,\n                                                         0x7c, 0x5f, 0xc0, 0xfb, 0x0, 0x1b, 0xfb, 0x2,\n                                                         0x2c, 0x5c, 0xfb, 0x7, 0x65, 0x1f, 0xe4, 0x84,\n                                                         0x5, 0x13, 0xe8, 0xa6, 0x97, 0xa7, 0xd3, 0xf7,\n                                                         0x4, 0x1b, 0xd7, 0xb9, 0x51, 0x38, 0x65, 0x1f,\n                                                         0x30, 0x76, 0xfb, 0xe, 0x89, 0x58, 0x7c, 0x8,\n                                                         0x2f, 0x6f, 0x75, 0x45, 0x57, 0x1a, 0x48, 0xb2,\n                                                         0x34, 0xf7, 0x16, 0xf6, 0xc0, 0xc4, 0xc7, 0xb8,\n                                                         0x1e, 0x81, 0xf7, 0x30, 0x15, 0x54, 0x82, 0x67,\n                                                         0xfb, 0x28, 0xfb, 0x14, 0x1b, 0x42, 0x70, 0xb6,\n                                                         0xb4, 0xde, 0xdc, 0x96, 0xc9, 0x91, 0x1f, 0xd8,\n                                                         0x92, 0xa3, 0x91, 0xa8, 0x91, 0x8, 0xf4, 0xbc,\n                                                         0x15, 0xec, 0xa6, 0xc8, 0xcb, 0xe1, 0x1b, 0xc8,\n                                                         0xd8, 0x60, 0xfb, 0xa, 0x78, 0x1f, 0xe, 0x4a,\n                                                         0xa, 0xf7, 0xb0, 0xf7, 0x1d, 0x12, 0xc8, 0xe5,\n                                                         0xf7, 0xcf, 0xe8, 0x13, 0x7c, 0xf8, 0x37, 0x88,\n                                                         0x22, 0xa, 0x4a, 0xf7, 0xdc, 0x56, 0xa, 0xf7,\n                                                         0x1d, 0x5, 0xfb, 0x2, 0x6, 0xe, 0xf8, 0x5,\n                                                         0x7e, 0xd9, 0x50, 0x76, 0xf9, 0x2b, 0xd1, 0x12,\n                                                         0xd8, 0xe2, 0xcb, 0xe3, 0xf7, 0x30, 0xe4, 0x13,\n                                                         0xbc, 0xf7, 0x9e, 0xf8, 0x34, 0x15, 0x47, 0x6e,\n                                                         0xfb, 0xd, 0x52, 0xfb, 0x26, 0x1a, 0xfb, 0x7,\n                                                         0xe3, 0x39, 0xf7, 0x14, 0xea, 0xbf, 0xb4, 0xb6,\n                                                         0xbf, 0x1e, 0x13, 0x7c, 0xa9, 0x63, 0xaf, 0x6b,\n                                                         0x9c, 0x7d, 0xcd, 0xbf, 0x18, 0x74, 0xa5, 0x6c,\n                                                         0xac, 0x6f, 0xb0, 0xa6, 0xaa, 0xaf, 0xbb, 0xa4,\n                                                         0xbf, 0x40, 0xae, 0x18, 0x6a, 0x51, 0x76, 0x76,\n                                                         0x7b, 0x79, 0x57, 0xcc, 0x56, 0xea, 0x7c, 0xa6,\n                                                         0x8, 0xdc, 0xb5, 0xed, 0xc3, 0xeb, 0x1a, 0xca,\n                                                         0x58, 0xd3, 0x23, 0xfb, 0x6, 0x4b, 0x2d, 0x3e,\n                                                         0x58, 0x9b, 0x6d, 0x9b, 0x67, 0x1e, 0xf7, 0x4a,\n                                                         0xfb, 0xb9, 0x15, 0x13, 0xbc, 0x55, 0x57, 0x59,\n                                                         0x79, 0x60, 0x1b, 0x46, 0x4b, 0xb6, 0xd7, 0xe7,\n                                                         0xe1, 0xbb, 0xbe, 0xa3, 0x1f, 0xb1, 0x44, 0xcc,\n                                                         0x31, 0xb1, 0x59, 0x8, 0x2e, 0xf7, 0xd2, 0x15,\n                                                         0x6d, 0xc4, 0x88, 0xa6, 0x93, 0x1a, 0xb9, 0xb2,\n                                                         0xc2, 0xbd, 0xb1, 0xa8, 0x6d, 0x66, 0x4a, 0x2d,\n                                                         0x5c, 0x6e, 0x7d, 0x1e, 0xe, 0x7c, 0xd0, 0x67,\n                                                         0x76, 0xf7, 0x88, 0xcc, 0xf7, 0xa3, 0xb1, 0xf3,\n                                                         0xb0, 0x12, 0xc8, 0xe5, 0xf7, 0x22, 0xb0, 0xf6,\n                                                         0xb1, 0x13, 0x7f, 0xf7, 0xb9, 0xf9, 0x2f, 0x15,\n                                                         0x59, 0xb5, 0x63, 0xbc, 0xbc, 0xb5, 0xb3, 0xbd,\n                                                         0xbe, 0x62, 0xb1, 0x59, 0x59, 0x62, 0x65, 0x58,\n                                                         0x1e, 0xb0, 0x8a, 0x15, 0xa8, 0xa3, 0xa3, 0xa9,\n                                                         0xa8, 0xa3, 0x74, 0x6d, 0x6e, 0x73, 0x75, 0x6e,\n                                                         0x6e, 0x72, 0xa1, 0xa8, 0x1e, 0xe4, 0xfd, 0x31,\n                                                         0x20, 0xa, 0x13, 0xbf, 0x2b, 0xa, 0xf7, 0x3f,\n                                                         0xf7, 0xb1, 0x76, 0xf8, 0x3c, 0x77, 0x1, 0xb5,\n                                                         0xf7, 0x9c, 0x15, 0xec, 0x6, 0xf7, 0x2a, 0xf7,\n                                                         0xda, 0xf7, 0x2e, 0xfb, 0xda, 0x5, 0xeb, 0x6,\n                                                         0xfb, 0x63, 0xf8, 0x3c, 0x5, 0x37, 0x6, 0xe,\n                                                         0xf7, 0xb2, 0xf7, 0x49, 0xdf, 0x4b, 0x76, 0xc7,\n                                                         0xe0, 0x8c, 0x77, 0x12, 0x13, 0x60, 0xf7, 0x3,\n                                                         0xf7, 0x48, 0x15, 0xa6, 0xa8, 0xaf, 0xac, 0xc2,\n                                                         0x1b, 0xb6, 0xac, 0x80, 0x7f, 0xa9, 0x1f, 0x13,\n                                                         0x90, 0x7a, 0xb3, 0xae, 0x78, 0xb4, 0x1b, 0xca,\n                                                         0xb0, 0xa5, 0xa4, 0xa6, 0x1f, 0xe9, 0x7, 0x82,\n                                                         0x82, 0x59, 0x57, 0x4f, 0x1b, 0x60, 0x65, 0x9d,\n                                                         0x9c, 0x63, 0x1f, 0x13, 0x60, 0x98, 0x6b, 0x6a,\n                                                         0x97, 0x66, 0x1b, 0x64, 0x58, 0x7e, 0x62, 0x66,\n                                                         0x1f, 0xe, 0xe6, 0xf8, 0x58, 0x76, 0xf7, 0xb3,\n                                                         0x77, 0x1, 0xf7, 0xb6, 0xc5, 0x3, 0xf7, 0x96,\n                                                         0xf8, 0x43, 0x15, 0xc8, 0xee, 0xcb, 0x28, 0xc3,\n                                                         0xb3, 0x3a, 0xe2, 0xf7, 0x9, 0xa4, 0x75, 0xcd,\n                                                         0xfb, 0x2, 0x5f, 0x95, 0xf7, 0x5, 0x47, 0x8a,\n                                                         0x95, 0xfb, 0x5, 0xfb, 0x1, 0xb7, 0x76, 0x49,\n                                                         0xf7, 0x7, 0x73, 0x3d, 0x33, 0x5, 0xe, 0xf9,\n                                                         0xc6, 0x61, 0xcb, 0x4b, 0xf7, 0x56, 0x81, 0xcc,\n                                                         0xf7, 0xe9, 0xca, 0xeb, 0xcb, 0x12, 0xf7, 0x81,\n                                                         0xca, 0xf2, 0xdb, 0xf8, 0x7f, 0xcb, 0x13, 0xbf,\n                                                         0xf9, 0x49, 0xf7, 0x6a, 0x15, 0x70, 0x8e, 0x90,\n                                                         0x5e, 0xd8, 0x1b, 0xf7, 0x12, 0xf7, 0x1a, 0xf7,\n                                                         0x23, 0xf7, 0x3a, 0xf7, 0x3c, 0xfb, 0x12, 0xf7,\n                                                         0x3f, 0xfb, 0x87, 0xfb, 0xdf, 0x26, 0xfb, 0xa6,\n                                                         0xfb, 0x3e, 0xfb, 0x66, 0xf7, 0x19, 0xfb, 0x46,\n                                                         0xf7, 0xc6, 0x1f, 0x13, 0x5f, 0xf7, 0xaa, 0xea,\n                                                         0xf7, 0x3d, 0xa4, 0x97, 0x1f, 0x3d, 0x6, 0x13,\n                                                         0xbf, 0x5f, 0x6d, 0x30, 0x35, 0xfb, 0x4c, 0x1b,\n                                                         0xfb, 0x5e, 0xfb, 0x44, 0xe0, 0xf7, 0x83, 0xf7,\n                                                         0x63, 0xf7, 0x27, 0xf7, 0x41, 0xf7, 0x6d, 0xf7,\n                                                         0x3e, 0xf7, 0x20, 0xfb, 0x4, 0xfb, 0x37, 0xfb,\n                                                         0x2a, 0xfb, 0xd, 0x33, 0x5d, 0x1f, 0x67, 0x83,\n                                                         0x94, 0xca, 0x94, 0xb4, 0xc9, 0xf7, 0xb6, 0x18,\n                                                         0x3e, 0x6, 0x7c, 0x48, 0x5, 0xd5, 0x5e, 0x4c,\n                                                         0x90, 0x73, 0x1b, 0xfb, 0xc, 0x23, 0xfb, 0x26,\n                                                         0xfb, 0x1a, 0x26, 0xca, 0x33, 0xe9, 0xc8, 0xbe,\n                                                         0xbb, 0xa3, 0xa0, 0x1f, 0xfb, 0x66, 0xf7, 0x9,\n                                                         0x15, 0xd9, 0xbf, 0xf7, 0x1f, 0xec, 0xbb, 0xc1,\n                                                         0x6b, 0x2d, 0xfb, 0x6, 0x39, 0x26, 0x40, 0x5d,\n                                                         0x5b, 0xb3, 0xdf, 0x1e, 0xe, 0x7c, 0xd0, 0x67,\n                                                         0x76, 0xf7, 0x89, 0xcd, 0xf0, 0xd5, 0xf7, 0x83,\n                                                         0x77, 0x12, 0xc8, 0xea, 0xf7, 0xe1, 0xee, 0x13,\n                                                         0x7e, 0xf7, 0x7e, 0xf8, 0xf7, 0x15, 0xcd, 0x6,\n                                                         0xa4, 0x91, 0x97, 0x9c, 0xa5, 0x1b, 0xa5, 0xa4,\n                                                         0x82, 0x81, 0xa2, 0x1f, 0x7f, 0xa6, 0xa3, 0x7f,\n                                                         0x9e, 0x1b, 0xca, 0xaf, 0xc2, 0xc1, 0x90, 0x1f,\n                                                         0x4b, 0x6, 0x7d, 0x87, 0x84, 0x72, 0x70, 0x1b,\n                                                         0x7c, 0x77, 0x95, 0x95, 0x74, 0x1f, 0x96, 0x72,\n                                                         0x6e, 0x96, 0x67, 0x1b, 0x42, 0x79, 0x57, 0x50,\n                                                         0x7a, 0x1f, 0xf7, 0x4d, 0xfc, 0xfa, 0x20, 0xa,\n                                                         0x13, 0xae, 0x2b, 0xa, 0x7c, 0xd3, 0x64, 0x76,\n                                                         0xf8, 0x61, 0xd4, 0xf7, 0x4f, 0x77, 0x12, 0xf8,\n                                                         0x80, 0xe7, 0x13, 0x78, 0xc5, 0x88, 0x15, 0xdd,\n                                                         0x6, 0x9f, 0xee, 0x48, 0xa, 0x13, 0xb8, 0x4a,\n                                                         0x9e, 0xce, 0x5d, 0xd3, 0x1b, 0xf7, 0x13, 0xf7,\n                                                         0x1d, 0xf7, 0x19, 0xf7, 0x5a, 0xf7, 0x5a, 0xfb,\n                                                         0x20, 0x9c, 0x66, 0x4c, 0x5d, 0x6e, 0x63, 0x5d,\n                                                         0x1f, 0xc2, 0xf7, 0x94, 0x3d, 0xa, 0x13, 0x78,\n                                                         0x77, 0xfc, 0x8e, 0x15, 0xdd, 0xcd, 0xf7, 0x38,\n                                                         0xf7, 0xa, 0xea, 0x9d, 0x29, 0x5f, 0x1e, 0x13,\n                                                         0xb8, 0x42, 0x60, 0xfb, 0x4e, 0xfb, 0x1d, 0x6a,\n                                                         0x37, 0x98, 0xf7, 0x22, 0x1e, 0xe, 0x77, 0x8d,\n                                                         0x76, 0xf9, 0x88, 0x77, 0x1, 0xf7, 0x20, 0xf7,\n                                                         0x5e, 0x3, 0xf7, 0x90, 0x78, 0x15, 0xe5, 0x6,\n                                                         0xfb, 0x4, 0xf9, 0x88, 0x3e, 0xa, 0x65, 0xfb,\n                                                         0x64, 0x76, 0xfa, 0x5a, 0x77, 0x1, 0xd5, 0xf7,\n                                                         0x74, 0x3, 0xd5, 0xfb, 0x79, 0x15, 0xd7, 0x6,\n                                                         0xf7, 0x28, 0xfa, 0x5a, 0x5, 0x3f, 0x6, 0xe,\n                                                         0xaf, 0xfb, 0x58, 0xd5, 0xf7, 0xee, 0xd9, 0xf7,\n                                                         0xed, 0xd5, 0x1, 0xe7, 0xf7, 0xf5, 0x3, 0xe7,\n                                                         0xf7, 0x74, 0x15, 0xeb, 0x82, 0x31, 0x2c, 0x7e,\n                                                         0x1f, 0xfb, 0x26, 0x76, 0x89, 0x32, 0xf7, 0x3c,\n                                                         0x1b, 0x96, 0xd5, 0x5, 0x29, 0x8b, 0x94, 0xf7,\n                                                         0x2c, 0xa3, 0x1f, 0x9b, 0xf7, 0x6, 0x85, 0xd7,\n                                                         0x3c, 0xad, 0xf6, 0xbb, 0x90, 0x9f, 0xa3, 0xf7,\n                                                         0x44, 0x8, 0xe3, 0x98, 0xa3, 0xbf, 0xdd, 0x1b,\n                                                         0x96, 0xd5, 0x5, 0xfb, 0x36, 0x72, 0x45, 0xfb,\n                                                         0x24, 0x73, 0x1f, 0x2b, 0x7b, 0x79, 0xfb, 0x1,\n                                                         0x2a, 0x1b, 0xe, 0xaf, 0xfb, 0x58, 0xd5, 0xf7,\n                                                         0xee, 0xd9, 0xf8, 0x7, 0xd5, 0x1, 0x8b, 0xf7,\n                                                         0xf6, 0x3, 0x96, 0xfb, 0xe, 0x15, 0x80, 0x41,\n                                                         0x5, 0xf7, 0x24, 0xb9, 0xd7, 0xf7, 0x13, 0x9f,\n                                                         0x1f, 0xea, 0x9a, 0xa2, 0xf7, 0xe, 0xe9, 0x1b,\n                                                         0x97, 0xd9, 0x5, 0x2d, 0x91, 0xdd, 0xea, 0x99,\n                                                         0x1f, 0xf7, 0x28, 0xa1, 0x89, 0xea, 0xfb, 0x38,\n                                                         0x1b, 0x80, 0x41, 0x5, 0xee, 0x89, 0x7c, 0xfb,\n                                                         0x2e, 0x74, 0x1f, 0x7a, 0xfb, 0x6, 0x92, 0x48,\n                                                         0xd9, 0x68, 0xfb, 0x0, 0x5b, 0x86, 0x6b, 0x71,\n                                                         0xfb, 0x44, 0x8, 0x33, 0x7e, 0x71, 0x62, 0x3d,\n                                                         0x1b, 0xe, 0x5f, 0xa, 0xa0, 0xf8, 0x12, 0x3,\n                                                         0xf7, 0xf, 0xfb, 0x14, 0x15, 0xf7, 0x33, 0xf9,\n                                                         0xa2, 0x5, 0xf6, 0x6, 0x99, 0xcf, 0x5, 0xfb,\n                                                         0x59, 0x6, 0xfb, 0x4d, 0xfe, 0x2a, 0x5, 0xf7,\n                                                         0x57, 0x6, 0x9a, 0xcf, 0x5, 0xe, 0x5f, 0xa,\n                                                         0x7d, 0xf8, 0x12, 0x3, 0xfb, 0x14, 0x4, 0x7d,\n                                                         0x47, 0x5, 0xf7, 0x56, 0x6, 0xf7, 0x50, 0xfa,\n                                                         0x2a, 0x5, 0xfb, 0x54, 0x6, 0x7c, 0x47, 0x5,\n                                                         0xf5, 0x6, 0xfb, 0x36, 0xfd, 0xa2, 0x5, 0xe,\n                                                         0xae, 0xf8, 0xe7, 0xca, 0x1, 0xf7, 0x3b, 0xc8,\n                                                         0x3, 0xf7, 0x3b, 0xf9, 0x6f, 0x15, 0x42, 0x8e,\n                                                         0xb9, 0x4c, 0xe5, 0x1b, 0xf7, 0x2, 0xb9, 0xe2,\n                                                         0xbc, 0x99, 0x1f, 0x4e, 0x6, 0x73, 0x81, 0x6f,\n                                                         0x5a, 0x47, 0x1b, 0x53, 0x78, 0xa9, 0xb6, 0x85,\n                                                         0x1f, 0xe, 0x65, 0x8d, 0x76, 0xf9, 0x88, 0x77,\n                                                         0x1, 0xf7, 0x4b, 0xf8, 0x3f, 0x15, 0xd8, 0x6,\n                                                         0xcb, 0xf7, 0xca, 0x5, 0x3e, 0x6, 0xfb, 0x31,\n                                                         0xfd, 0x88, 0x15, 0xd8, 0x6, 0xcb, 0xf7, 0xc9,\n                                                         0x5, 0x3e, 0x6, 0xe, 0xbf, 0xf7, 0x73, 0x76,\n                                                         0xf7, 0xcf, 0x77, 0x1, 0xe6, 0xf7, 0xfd, 0x15,\n                                                         0x34, 0xd3, 0x43, 0xe4, 0xe3, 0xd4, 0xd3, 0xe2,\n                                                         0xe1, 0x42, 0xd1, 0x33, 0x32, 0x43, 0x45, 0x35,\n                                                         0x1e, 0xe, 0xf7, 0x5e, 0x7c, 0xd1, 0xf7, 0xc5,\n                                                         0xf7, 0x46, 0x41, 0xd5, 0x1, 0xd5, 0xea, 0xf7,\n                                                         0xb8, 0xe7, 0x3, 0xf8, 0x3e, 0xf7, 0x52, 0x15,\n                                                         0x54, 0x78, 0x5c, 0x3b, 0x36, 0x1b, 0x72, 0x3a,\n                                                         0x98, 0xf7, 0x12, 0xbf, 0xa0, 0xf7, 0x6e, 0xf7,\n                                                         0x36, 0xa6, 0xdd, 0x84, 0x28, 0x1f, 0xe7, 0x90,\n                                                         0x5, 0xf7, 0x1d, 0xfb, 0x4, 0xb1, 0x3b, 0xfb,\n                                                         0x6d, 0x45, 0xfb, 0x66, 0xfb, 0x1a, 0xfb, 0x26,\n                                                         0xe7, 0x4c, 0xf7, 0x0, 0xf3, 0xe8, 0xc6, 0xf7,\n                                                         0x1d, 0xbb, 0x1e, 0xe, 0x53, 0xa, 0xf7, 0x83,\n                                                         0xf8, 0xe5, 0x15, 0xed, 0x6, 0xf7, 0x17, 0xf7,\n                                                         0x21, 0x3d, 0xa, 0x3a, 0x31, 0x64, 0xe5, 0x5,\n                                                         0x3c, 0x6, 0xe, 0xf7, 0x5e, 0xfb, 0x60, 0x76,\n                                                         0xf7, 0x58, 0xd1, 0xf7, 0xce, 0xf7, 0x4b, 0x40,\n                                                         0xd6, 0x1, 0xd5, 0xea, 0xf7, 0x3, 0xdd, 0xee,\n                                                         0xe6, 0x3, 0xf7, 0x63, 0x2d, 0x15, 0xa7, 0xb8,\n                                                         0x8e, 0x68, 0x5c, 0x3c, 0x91, 0x5b, 0x1f, 0x78,\n                                                         0x53, 0x5, 0x8a, 0x9e, 0xa1, 0x8a, 0x9e, 0x1b,\n                                                         0xb2, 0xf7, 0x15, 0x98, 0xe3, 0x9d, 0x83, 0xbb,\n                                                         0x41, 0x1f, 0x97, 0xa8, 0x5, 0xf7, 0x1, 0xd9,\n                                                         0xe1, 0xf7, 0x6, 0xb3, 0x1f, 0x2f, 0x95, 0x5,\n                                                         0x53, 0x78, 0x5b, 0x37, 0x36, 0x1b, 0x63, 0x49,\n                                                         0xb3, 0xf5, 0xdc, 0xa8, 0xf7, 0x57, 0xf7, 0x2f,\n                                                         0xa6, 0xdc, 0x74, 0x33, 0x1f, 0xe6, 0x91, 0x5,\n                                                         0xf7, 0x20, 0xfb, 0x3, 0xb3, 0x3b, 0xfb, 0x68,\n                                                         0x40, 0xfb, 0x61, 0xfb, 0x26, 0xfb, 0x44, 0xf7,\n                                                         0x11, 0x62, 0xae, 0x8e, 0x1e, 0xe, 0xae, 0xfb,\n                                                         0x60, 0x76, 0xf7, 0x75, 0x77, 0x12, 0xf7, 0x2e,\n                                                         0xd9, 0x17, 0xee, 0x16, 0x78, 0x38, 0x5, 0xb8,\n                                                         0xa8, 0x79, 0x6f, 0x67, 0x4b, 0x8d, 0x7d, 0x66,\n                                                         0x7f, 0x8d, 0x8c, 0x7b, 0x1f, 0x13, 0xe0, 0x82,\n                                                         0x4f, 0x5, 0x87, 0xa2, 0xa9, 0x8a, 0xa2, 0x1b,\n                                                         0xa7, 0xf7, 0x12, 0x90, 0xe6, 0x96, 0x88, 0xc6,\n                                                         0x3d, 0x98, 0x1f, 0x95, 0xb9, 0x5, 0xe, 0xad,\n                                                         0xc1, 0xf7, 0xd8, 0xc5, 0x1, 0xf6, 0x2a, 0x15,\n                                                         0xc4, 0x79, 0xe0, 0xf7, 0x2d, 0x5, 0x89, 0x94,\n                                                         0x9b, 0x89, 0xa4, 0x1b, 0xf2, 0xed, 0xb7, 0xf7,\n                                                         0x1, 0xbd, 0x1f, 0x40, 0x92, 0x5, 0x61, 0x78,\n                                                         0x46, 0x4b, 0x34, 0x1b, 0x82, 0x83, 0x8d, 0x8c,\n                                                         0x87, 0x1f, 0xf7, 0x40, 0xf7, 0xca, 0xb4, 0x75,\n                                                         0x9e, 0x68, 0x8c, 0x78, 0x19, 0xd3, 0x8f, 0x5,\n                                                         0x9f, 0x7d, 0xd7, 0x32, 0xa7, 0x1e, 0xdf, 0xf7,\n                                                         0x2c, 0x53, 0x9d, 0x34, 0xfb, 0x33, 0x5, 0x8c,\n                                                         0x83, 0x82, 0x8c, 0x7a, 0x1b, 0xfb, 0x71, 0x43,\n                                                         0xfb, 0x3a, 0x23, 0x5d, 0x9a, 0x4e, 0xdd, 0x68,\n                                                         0x1f, 0xac, 0xc7, 0x15, 0x79, 0x95, 0x66, 0x9d,\n                                                         0xc1, 0x1a, 0xb7, 0xa9, 0xf7, 0x3c, 0xf7, 0x51,\n                                                         0x1e, 0xe, 0xae, 0xf8, 0xe5, 0xe5, 0x31, 0xf7,\n                                                         0x21, 0x12, 0x13, 0x80, 0xf7, 0x27, 0xf8, 0xe5,\n                                                         0x15, 0xe7, 0x6, 0xdc, 0xe5, 0xb2, 0x31, 0x5,\n                                                         0xda, 0x6, 0x13, 0x40, 0x4d, 0xf7, 0x21, 0x57,\n                                                         0xa, 0xe, 0x77, 0x8b, 0xeb, 0xf7, 0xd8, 0xeb,\n                                                         0x1, 0xe2, 0xf7, 0x6a, 0x3, 0xf7, 0x43, 0xf8,\n                                                         0x38, 0x40, 0xa, 0xfb, 0x2, 0xfc, 0x98, 0x40,\n                                                         0xa, 0xe, 0x77, 0xfb, 0x12, 0x76, 0xf7, 0x91,\n                                                         0x77, 0x1, 0xe2, 0x8e, 0x15, 0xc4, 0x6, 0x78,\n                                                         0x2d, 0x5f, 0x81, 0x7a, 0x87, 0x83, 0x61, 0x18,\n                                                         0x67, 0xa, 0x92, 0xaf, 0x9e, 0xe5, 0x18, 0x22,\n                                                         0x6, 0xe, 0xf8, 0x4b, 0x78, 0xc9, 0xee, 0xc6,\n                                                         0xf7, 0xce, 0xc2, 0xf4, 0xc9, 0x1, 0xc1, 0xcc,\n                                                         0xf9, 0x21, 0xcc, 0x3, 0xf8, 0xcb, 0xf7, 0xbe,\n                                                         0x15, 0x34, 0x6b, 0x41, 0x81, 0x6f, 0x1b, 0x44,\n                                                         0x4f, 0xbb, 0xf6, 0x98, 0x1f, 0xd6, 0x94, 0xb9,\n                                                         0xdf, 0xef, 0x1b, 0x9d, 0xd0, 0x8a, 0x3f, 0xa1,\n                                                         0x1f, 0xcb, 0x99, 0x5, 0xdd, 0x7b, 0x46, 0xaf,\n                                                         0x3a, 0x1b, 0xfb, 0x17, 0x35, 0x37, 0xfb, 0x16,\n                                                         0x7b, 0x1f, 0xfb, 0x1c, 0x7b, 0xd9, 0x3d, 0xf7,\n                                                         0xc, 0x1b, 0xdd, 0xe2, 0xb6, 0xe9, 0xad, 0x1f,\n                                                         0xfc, 0xd3, 0xd8, 0x15, 0xfb, 0x65, 0xf7, 0x45,\n                                                         0xfb, 0x3a, 0xf7, 0x6d, 0xf7, 0x6d, 0xf7, 0x40,\n                                                         0xf7, 0x3b, 0xf7, 0x64, 0xf7, 0x65, 0xfb, 0x42,\n                                                         0xf7, 0x40, 0xfb, 0x6b, 0xfb, 0x6a, 0xfb, 0x48,\n                                                         0xfb, 0x3f, 0xfb, 0x66, 0x1e, 0xcc, 0x16, 0xf7,\n                                                         0x42, 0xf7, 0x29, 0xf7, 0x25, 0xf7, 0x48, 0xf7,\n                                                         0x49, 0xf7, 0x23, 0xfb, 0x25, 0xfb, 0x42, 0xfb,\n                                                         0x42, 0xfb, 0x23, 0xfb, 0x1f, 0xfb, 0x49, 0xfb,\n                                                         0x48, 0xfb, 0x29, 0xf7, 0x1f, 0xf7, 0x42, 0x1e,\n                                                         0xe, 0xf7, 0xc, 0x76, 0xae, 0xdf, 0xf7, 0x9e,\n                                                         0xdf, 0xae, 0x77, 0x1, 0xee, 0xee, 0x15, 0xe3,\n                                                         0xd3, 0x5, 0x70, 0xa9, 0xb0, 0x81, 0xb0, 0x1b,\n                                                         0xb0, 0xbb, 0x95, 0xa6, 0xb7, 0x1f, 0xbb, 0x43,\n                                                         0xd4, 0xc8, 0x5a, 0xd0, 0xb6, 0xbd, 0x9c, 0xb8,\n                                                         0x92, 0xa5, 0x19, 0x92, 0xa7, 0x94, 0xb8, 0x7a,\n                                                         0xbb, 0xe3, 0xd2, 0x18, 0x63, 0xc8, 0x33, 0x43,\n                                                         0x5, 0xa6, 0x6e, 0x63, 0x95, 0x66, 0x1b, 0x66,\n                                                         0x5e, 0x81, 0x70, 0x5e, 0x1f, 0x5b, 0xd3, 0x43,\n                                                         0x4e, 0xbb, 0x44, 0x60, 0x5b, 0x79, 0x5e, 0x84,\n                                                         0x6f, 0x19, 0x84, 0x71, 0x83, 0x5e, 0x9c, 0x59,\n                                                         0x34, 0x46, 0x18, 0xf7, 0x39, 0xf7, 0x52, 0x15,\n                                                         0xd6, 0xa0, 0xd3, 0xc6, 0xd1, 0x1b, 0xd1, 0xb5,\n                                                         0x4f, 0x41, 0x76, 0x1f, 0x42, 0x77, 0x42, 0x50,\n                                                         0x44, 0x1b, 0x46, 0x62, 0xc6, 0xd4, 0x9f, 0x1f,\n                                                         0xe, 0x7c, 0xd3, 0x4f, 0xc7, 0xf8, 0x25, 0xd4,\n                                                         0xf7, 0x4f, 0x77, 0x12, 0xdf, 0xe7, 0x13, 0x78,\n                                                         0xf8, 0x30, 0x88, 0x15, 0xe0, 0x6, 0xf7, 0x2f,\n                                                         0xf9, 0x65, 0x3d, 0xa, 0x50, 0xfb, 0xad, 0x4e,\n                                                         0xa, 0xd5, 0x64, 0x51, 0x9f, 0x55, 0x1b, 0xfb,\n                                                         0x20, 0xfb, 0x10, 0xfb, 0x1c, 0xfb, 0x4a, 0x1f,\n                                                         0x13, 0xb8, 0xfb, 0x3c, 0xf3, 0x4f, 0xd6, 0xd0,\n                                                         0xc0, 0xb2, 0xba, 0xb6, 0x1e, 0x13, 0x78, 0xfb,\n                                                         0x90, 0xf7, 0x22, 0x15, 0xc4, 0xb5, 0xf7, 0x50,\n                                                         0xf7, 0x16, 0xc2, 0xcf, 0x67, 0x2a, 0xfb, 0x1e,\n                                                         0x3a, 0xfb, 0x16, 0x27, 0xfb, 0x6, 0x8b, 0xf7,\n                                                         0x11, 0xaa, 0x1e, 0xe, 0xfb, 0x1e, 0x76, 0xf8,\n                                                         0xe6, 0xd5, 0xf7, 0x65, 0x77, 0x1, 0xf7, 0x1b,\n                                                         0xf8, 0x7b, 0x3, 0xf7, 0x61, 0xfb, 0x33, 0x15,\n                                                         0xe2, 0x6, 0xf7, 0xf, 0xf8, 0xe6, 0x5, 0xf7,\n                                                         0x54, 0x6, 0x9a, 0xd5, 0x5, 0xfb, 0x53, 0x6,\n                                                         0xb6, 0xf7, 0x65, 0x5, 0x33, 0x6, 0x60, 0xfb,\n                                                         0x65, 0x5, 0xfb, 0x55, 0x6, 0x7c, 0x41, 0x5,\n                                                         0xf7, 0x55, 0x6, 0xe, 0xfb, 0x1e, 0x76, 0xf7,\n                                                         0x50, 0xd5, 0xf7, 0xf6, 0xd8, 0xf7, 0x4c, 0x77,\n                                                         0x1, 0xbf, 0xa8, 0x15, 0xf7, 0x53, 0x6, 0x66,\n                                                         0xfb, 0x50, 0x5, 0xe1, 0x6, 0xb0, 0xf7, 0x50,\n                                                         0x5, 0xf7, 0x50, 0x6, 0x9b, 0xd5, 0x5, 0xfb,\n                                                         0x51, 0x6, 0xd5, 0xf7, 0xf6, 0x5, 0xf7, 0x4f,\n                                                         0x6, 0x9d, 0xd8, 0x5, 0xfb, 0x52, 0x6, 0xb0,\n                                                         0xf7, 0x4c, 0x5, 0x35, 0x6, 0x65, 0xfb, 0x4c,\n                                                         0x5, 0xfb, 0x52, 0x6, 0x7b, 0x3e, 0x5, 0xf7,\n                                                         0x53, 0x6, 0x42, 0xfb, 0xf6, 0x5, 0xfb, 0x52,\n                                                         0x6, 0xe, 0xf1, 0xf8, 0x2f, 0xc2, 0xf7, 0x4c,\n                                                         0xc0, 0x1, 0xf7, 0x3d, 0xc1, 0xf7, 0x51, 0xc3,\n                                                         0x3, 0xf7, 0x3d, 0xf8, 0xc3, 0x15, 0x38, 0xcf,\n                                                         0x4a, 0xdc, 0xdd, 0xcf, 0xcc, 0xde, 0xdc, 0x49,\n                                                         0xca, 0x37, 0x38, 0x49, 0x4d, 0x39, 0x1e, 0xc1,\n                                                         0x8c, 0x15, 0xbe, 0xb5, 0xb2, 0xbf, 0xc0, 0xb5,\n                                                         0x64, 0x58, 0x57, 0x60, 0x61, 0x57, 0x58, 0x60,\n                                                         0xb5, 0xbf, 0x1e, 0xe, 0xae, 0xf8, 0xf0, 0xf1,\n                                                         0x1, 0xf7, 0xf9, 0xf9, 0x56, 0x5d, 0xa, 0xfb,\n                                                         0x27, 0xf1, 0x5d, 0xa, 0xe, 0xf7, 0xb2, 0x78,\n                                                         0xec, 0xf7, 0x18, 0xdd, 0xf7, 0x1a, 0xed, 0x1,\n                                                         0xe0, 0xf7, 0x66, 0x15, 0xf8, 0x76, 0x6, 0xb2,\n                                                         0xdd, 0x5, 0xfc, 0x76, 0x6, 0xf7, 0x7c, 0xf7,\n                                                         0x1a, 0x15, 0xf0, 0x6, 0xb9, 0xed, 0x5, 0x25,\n                                                         0x6, 0xfb, 0x61, 0xfc, 0xb3, 0x15, 0xf1, 0x6,\n                                                         0xb8, 0xec, 0x5, 0x26, 0x6, 0xe, 0x2d, 0x76,\n                                                         0xf7, 0x12, 0x76, 0xf9, 0x35, 0xd4, 0xb2, 0x77,\n                                                         0x1, 0xf7, 0x1a, 0xe6, 0xf7, 0xc3, 0xde, 0x3,\n                                                         0xf7, 0x8c, 0x81, 0x15, 0x74, 0x22, 0x5, 0xbf,\n                                                         0x6, 0xa0, 0xee, 0x5, 0xf7, 0x5e, 0xd0, 0xf7,\n                                                         0xb, 0xe5, 0xf7, 0x12, 0xfb, 0xe, 0xc9, 0x50,\n                                                         0xa3, 0x1f, 0xc1, 0xf7, 0x8e, 0x5, 0xc6, 0xa8,\n                                                         0x38, 0x6f, 0x8f, 0x1f, 0xde, 0x91, 0x5, 0xb2,\n                                                         0x4e, 0xf7, 0x1f, 0x29, 0x1e, 0x95, 0xba, 0x5,\n                                                         0x59, 0x6, 0x81, 0x64, 0x5, 0xfb, 0x55, 0x52,\n                                                         0xfb, 0x8, 0x3a, 0xfb, 0x13, 0xf7, 0x5, 0x58,\n                                                         0xbf, 0x76, 0x1f, 0x50, 0xfb, 0xa9, 0x5, 0x65,\n                                                         0x53, 0xb6, 0xf4, 0x83, 0x1f, 0x2e, 0x86, 0x5,\n                                                         0x25, 0x91, 0xca, 0xfb, 0x6, 0xf7, 0x2, 0x1b,\n                                                         0xe9, 0xf8, 0x46, 0x15, 0x62, 0x9e, 0x57, 0xa1,\n                                                         0xd5, 0x1a, 0xda, 0xd9, 0xb8, 0xcd, 0x1e, 0x3c,\n                                                         0xfc, 0xf5, 0x15, 0xc2, 0xf7, 0x9d, 0x5, 0xba,\n                                                         0x77, 0xc8, 0x6e, 0x3e, 0x1a, 0x44, 0x4a, 0x47,\n                                                         0x29, 0x1e, 0xe, 0xae, 0xf8, 0xf0, 0xf1, 0x1,\n                                                         0xf7, 0x8d, 0xf8, 0xf0, 0x15, 0xe7, 0x6, 0xa0,\n                                                         0xf1, 0x5, 0x2e, 0x6, 0xe, 0x77, 0x43, 0xa,\n                                                         0xea, 0xf7, 0x5b, 0x3, 0xea, 0x16, 0xe4, 0x6,\n                                                         0xf7, 0x2, 0xf8, 0x9f, 0x3e, 0xa, 0x7c, 0xd5,\n                                                         0xf7, 0x49, 0xd0, 0xf7, 0x33, 0xd1, 0x1, 0xdf,\n                                                         0xe7, 0xf7, 0xcf, 0xe2, 0x3, 0xf7, 0x44, 0xf7,\n                                                         0x84, 0x15, 0xf8, 0x1f, 0x6, 0x8e, 0x9f, 0x8f,\n                                                         0x9f, 0xb3, 0x1a, 0xe6, 0x5c, 0xf7, 0x13, 0xfb,\n                                                         0x38, 0xfb, 0x5a, 0x36, 0xfb, 0x55, 0xfb, 0x1b,\n                                                         0xfb, 0x27, 0xe8, 0x3d, 0xf7, 0x8, 0xf7, 0x1f,\n                                                         0xe6, 0xf7, 0x2, 0xd4, 0xa1, 0x1e, 0x32, 0x94,\n                                                         0x5, 0x2a, 0x61, 0x39, 0x76, 0x64, 0x1b, 0x43,\n                                                         0x4f, 0xd5, 0xf6, 0x9a, 0x1f, 0x99, 0xd0, 0x15,\n                                                         0xce, 0xa0, 0xc0, 0xe7, 0xf4, 0x1b, 0xd3, 0xc6,\n                                                         0x4c, 0x2b, 0x82, 0x1f, 0xe, 0x7c, 0xd5, 0x41,\n                                                         0xf7, 0x50, 0xcf, 0xd1, 0xf8, 0x3b, 0x77, 0x1,\n                                                         0xdf, 0xe7, 0x3, 0xf7, 0xd7, 0xf8, 0xe7, 0x15,\n                                                         0xd8, 0x6, 0xf7, 0x1d, 0x6f, 0xa, 0xfb, 0xa,\n                                                         0x6, 0xfb, 0x86, 0xfc, 0x81, 0x25, 0xa, 0xe,\n                                                         0x7c, 0xd5, 0xf7, 0x4a, 0xd1, 0xf7, 0xb0, 0xf7,\n                                                         0x1f, 0x1, 0xdf, 0xe6, 0xf7, 0xd0, 0xe2, 0x3,\n                                                         0xf7, 0x8c, 0xf8, 0xe7, 0x15, 0xe9, 0x6, 0xdd,\n                                                         0xe5, 0xb4, 0x31, 0x5, 0xdb, 0x6, 0x4c, 0xf7,\n                                                         0x1f, 0x47, 0xa, 0xfb, 0x61, 0xfc, 0x81, 0x25,\n                                                         0xa, 0xe, 0x7c, 0xd4, 0xf7, 0x48, 0xcf, 0xf7,\n                                                         0xbf, 0xf0, 0x1, 0xdf, 0xe6, 0x3, 0xf8, 0x56,\n                                                         0xf8, 0xf1, 0x63, 0xa, 0xfb, 0x64, 0x26, 0x63,\n                                                         0xa, 0xfb, 0x1, 0xfc, 0x65, 0x25, 0xa, 0xe,\n                                                         0x7c, 0xd5, 0xf7, 0x4a, 0xd1, 0xf7, 0xb1, 0xf7,\n                                                         0x1e, 0x1, 0xdf, 0xe6, 0x3, 0xf7, 0x45, 0xf7,\n                                                         0x85, 0x25, 0xa, 0x29, 0xf7, 0xb1, 0x15, 0xd3,\n                                                         0x6, 0x50, 0xf7, 0x1e, 0x5, 0xfb, 0x3, 0x6,\n                                                         0xe, 0x78, 0xd0, 0xf7, 0xbb, 0xcb, 0xf7, 0x75,\n                                                         0xd0, 0x1, 0xd5, 0xeb, 0xf7, 0xee, 0xe6, 0x3,\n                                                         0xf7, 0x83, 0xf8, 0x15, 0x15, 0xfb, 0x31, 0x63,\n                                                         0x83, 0xfb, 0x2a, 0x6c, 0x1a, 0x23, 0xe0, 0x3c,\n                                                         0xf7, 0x1f, 0xf7, 0x3e, 0xf2, 0xf7, 0xb, 0xf7,\n                                                         0xe, 0xe9, 0x4d, 0xb4, 0x6b, 0x9d, 0x1e, 0xd0,\n                                                         0x9c, 0xc8, 0xcc, 0xd3, 0x1a, 0xca, 0x5c, 0xf7,\n                                                         0x3, 0xfb, 0x3f, 0xfb, 0x39, 0x44, 0xfb, 0xb,\n                                                         0x40, 0x78, 0x8d, 0x4c, 0xdf, 0x61, 0x1e, 0x46,\n                                                         0xfb, 0x71, 0x15, 0xe7, 0xcf, 0xe4, 0xf6, 0xd3,\n                                                         0xc5, 0x55, 0x46, 0x40, 0x4f, 0x2a, 0x20, 0x39,\n                                                         0x53, 0xbc, 0xcc, 0x1e, 0xd8, 0xf7, 0xed, 0x15,\n                                                         0xc2, 0xb2, 0xd1, 0xf2, 0xd4, 0xc1, 0x5d, 0x50,\n                                                         0x54, 0x5f, 0x4a, 0x23, 0x43, 0x5a, 0xb0, 0xca,\n                                                         0x1e, 0xe, 0xf9, 0x52, 0x8b, 0xf5, 0x1, 0xf8,\n                                                         0x57, 0x16, 0x4b, 0xa, 0xf7, 0xcf, 0x21, 0x15,\n                                                         0x4b, 0xa, 0xfd, 0x49, 0x21, 0x15, 0x4b, 0xa,\n                                                         0xe, 0xf9, 0x52, 0x64, 0xa, 0xfa, 0x8c, 0xd4,\n                                                         0xfe, 0x8c, 0x6, 0xe, 0x64, 0xa, 0xf8, 0xd0,\n                                                         0xd4, 0xfc, 0xd0, 0x6, 0xe, 0xf7, 0xb2, 0xf7,\n                                                         0x7, 0xdc, 0xf7, 0x8, 0xd9, 0x1, 0xb5, 0xf8,\n                                                         0xc9, 0x3, 0xca, 0xf7, 0xce, 0x15, 0xf8, 0xc9,\n                                                         0xd7, 0xfc, 0xc9, 0x6, 0xfb, 0xa7, 0x4, 0xf8,\n                                                         0xc9, 0xda, 0xfc, 0xc9, 0x6, 0xe, 0x81, 0xd5,\n                                                         0x1, 0xf8, 0x8e, 0xf0, 0x3, 0xf7, 0xf0, 0xf8,\n                                                         0xd1, 0x15, 0xf7, 0x0, 0xb9, 0xa5, 0x5e, 0xa0,\n                                                         0x5b, 0x94, 0x59, 0x19, 0x89, 0x89, 0x5, 0xa2,\n                                                         0x72, 0x61, 0xae, 0x36, 0x1b, 0xfb, 0x2a, 0xfb,\n                                                         0x13, 0xfb, 0x29, 0xfb, 0x47, 0xfb, 0x7, 0xd2,\n                                                         0x23, 0xf7, 0x32, 0xf7, 0x8c, 0xc6, 0xf7, 0x90,\n                                                         0xf7, 0x8, 0xf7, 0x38, 0x53, 0xe4, 0x6d, 0xb9,\n                                                         0x1f, 0xdd, 0xae, 0x73, 0xbd, 0x2e, 0x65, 0x88,\n                                                         0x90, 0x78, 0x9e, 0x7a, 0x99, 0x19, 0x28, 0x6,\n                                                         0xa5, 0x73, 0x90, 0x85, 0xad, 0x62, 0x28, 0x60,\n                                                         0x18, 0xfb, 0x26, 0xfc, 0x37, 0x15, 0xea, 0xc3,\n                                                         0xf7, 0x33, 0xf7, 0x26, 0xcb, 0xd3, 0x68, 0x21,\n                                                         0x34, 0x4f, 0xfb, 0x3f, 0xfb, 0x24, 0xfb, 0x3,\n                                                         0x74, 0xdf, 0xc8, 0x1e, 0xe, 0x77, 0x8b, 0xef,\n                                                         0xe0, 0x77, 0xf8, 0xbd, 0x77, 0x1, 0xe5, 0x16,\n                                                         0xef, 0x6, 0xa0, 0xef, 0x47, 0xa, 0xb0, 0xe0,\n                                                         0x15, 0xc2, 0x6, 0xf3, 0xf8, 0x4, 0xac, 0xf7,\n                                                         0x39, 0x5, 0x20, 0x6, 0x6c, 0xfb, 0x39, 0x5,\n                                                         0xe, 0xae, 0xfb, 0x42, 0x76, 0xf8, 0xaf, 0x77,\n                                                         0xf0, 0xed, 0x1, 0xd8, 0xf7, 0x8d, 0x3, 0xf7,\n                                                         0x61, 0xf8, 0x3d, 0x15, 0xef, 0x6, 0xa0, 0xed,\n                                                         0x47, 0xa, 0xfb, 0x8, 0xfc, 0xc0, 0x15, 0x6a,\n                                                         0xfb, 0x36, 0x5, 0xf6, 0x6, 0xab, 0xf7, 0x36,\n                                                         0xc1, 0xf8, 0xd, 0x5, 0x54, 0x6, 0xe, 0x77,\n                                                         0x3a, 0xa, 0xf5, 0xf7, 0xde, 0x3, 0xe1, 0x16,\n                                                         0xdb, 0x6, 0xe0, 0xf8, 0x56, 0x5, 0xe5, 0x6,\n                                                         0x98, 0xcf, 0x3f, 0xa, 0xf0, 0x9f, 0x91, 0xa9,\n                                                         0xb5, 0x1b, 0xa7, 0xa8, 0x82, 0x88, 0x98, 0x1f,\n                                                         0x99, 0xd8, 0x5, 0x8f, 0x79, 0x62, 0x95, 0x6c,\n                                                         0x1b, 0x25, 0x80, 0x36, 0x46, 0x7a, 0x1f, 0x7f,\n                                                         0x53, 0x5, 0x43, 0x6, 0x7f, 0x47, 0x5, 0xd2,\n                                                         0x6, 0xe, 0xf7, 0x5e, 0x3a, 0xa, 0xe1, 0x16,\n                                                         0xe5, 0x46, 0xa, 0xa1, 0x8f, 0xa9, 0xba, 0x1b,\n                                                         0xaa, 0xae, 0x82, 0x88, 0x99, 0x1f, 0x9b, 0xd8,\n                                                         0x5, 0x8f, 0x77, 0x62, 0x95, 0x68, 0x1b, 0xfb,\n                                                         0x6, 0x7a, 0x36, 0x46, 0x78, 0x1f, 0x7e, 0x53,\n                                                         0x5, 0x3b, 0x6, 0x7c, 0x47, 0x5, 0xdc, 0x6,\n                                                         0xf7, 0x36, 0xfc, 0x56, 0x15, 0xe5, 0x6, 0xf7,\n                                                         0x3, 0xf8, 0x9a, 0x3f, 0xa, 0x9f, 0xe9, 0x15,\n                                                         0xe5, 0x6, 0xa1, 0xf3, 0x3e, 0xa, 0x78, 0xd0,\n                                                         0xf7, 0xef, 0xd9, 0xf7, 0x2d, 0xdb, 0x1, 0xcf,\n                                                         0xee, 0xf7, 0xb7, 0xeb, 0x3, 0xce, 0xf7, 0x57,\n                                                         0x15, 0x23, 0xd4, 0xfb, 0x2, 0xf7, 0x2e, 0xf7,\n                                                         0x41, 0xf7, 0x10, 0xf7, 0xd, 0xf7, 0x37, 0xf7,\n                                                         0x2c, 0xfb, 0xa, 0xc5, 0x34, 0x41, 0x61, 0x6e,\n                                                         0x7e, 0x73, 0x1e, 0xc6, 0xf7, 0x47, 0x5, 0xf7,\n                                                         0xbd, 0x6, 0x9e, 0xdb, 0x5, 0xfc, 0x12, 0x6,\n                                                         0xfb, 0x9, 0xfb, 0xfe, 0xdf, 0x84, 0x5, 0x9e,\n                                                         0x9b, 0xbc, 0xc2, 0xdf, 0x1b, 0xe7, 0xbb, 0x4c,\n                                                         0x46, 0x23, 0x34, 0xfb, 0x3, 0x20, 0x50, 0x38,\n                                                         0xb8, 0xf7, 0x1, 0x93, 0x1f, 0xe, 0xf7, 0x5e,\n                                                         0x3a, 0xa, 0xe1, 0x16, 0xe4, 0x46, 0xa, 0xa2,\n                                                         0x8f, 0xa9, 0xba, 0x1b, 0xaa, 0xac, 0x82, 0x88,\n                                                         0x9a, 0x1f, 0x9b, 0xd8, 0x5, 0x8f, 0x77, 0x63,\n                                                         0x95, 0x68, 0x1b, 0xfb, 0x5, 0x78, 0x37, 0x46,\n                                                         0x79, 0x1f, 0x7e, 0x52, 0x5, 0x3a, 0x6, 0x7d,\n                                                         0x47, 0x5, 0xdc, 0x6, 0xf7, 0x35, 0xfc, 0x56,\n                                                         0x15, 0xe5, 0x6, 0xf7, 0x2c, 0xf9, 0x60, 0x5,\n                                                         0x32, 0x6, 0xe, 0xfb, 0x63, 0xd9, 0xf8, 0xda,\n                                                         0xd1, 0xf7, 0x17, 0xde, 0x1, 0x77, 0xfb, 0xa,\n                                                         0x15, 0x6b, 0x3e, 0x5, 0x7f, 0xc7, 0xb2, 0x8b,\n                                                         0x92, 0x1b, 0xdb, 0xca, 0xdc, 0xe4, 0xae, 0x1f,\n                                                         0xf7, 0x4d, 0xf8, 0x7e, 0x5, 0xf0, 0x6, 0xa7,\n                                                         0xd1, 0x5, 0x25, 0x6, 0xf3, 0xb6, 0x98, 0xa6,\n                                                         0xbb, 0x1b, 0xa0, 0x9c, 0x87, 0x82, 0xae, 0x1f,\n                                                         0xac, 0xd8, 0x5, 0x95, 0x6a, 0x6d, 0x94, 0x64,\n                                                         0x1b, 0xfb, 0x6, 0x67, 0x27, 0xfb, 0x6, 0x5b,\n                                                         0x1f, 0x27, 0x6, 0x71, 0x45, 0x5, 0xee, 0x6,\n                                                         0xfb, 0x48, 0xfc, 0x7d, 0x5, 0x64, 0x7b, 0x68,\n                                                         0x55, 0x60, 0x1b, 0x7b, 0x76, 0x8e, 0x93, 0x67,\n                                                         0x1f, 0xe, 0xa0, 0x76, 0xf7, 0x48, 0xd9, 0xf7,\n                                                         0xc0, 0xf7, 0x2e, 0x1, 0xcb, 0xf7, 0x48, 0x15,\n                                                         0xf7, 0xd0, 0x6, 0x62, 0xfb, 0x48, 0x5, 0xeb,\n                                                         0x6, 0xb5, 0xf7, 0x48, 0x5, 0xf7, 0x1, 0x6,\n                                                         0x9e, 0xd9, 0x5, 0xfb, 0x2, 0x6, 0xf1, 0xf8,\n                                                         0x51, 0x5, 0x3d, 0x6, 0xfc, 0x46, 0xfc, 0x49,\n                                                         0x5, 0xe8, 0x83, 0x15, 0xf7, 0xb2, 0xf7, 0xb9,\n                                                         0x8d, 0x89, 0x48, 0xfb, 0xb7, 0x5, 0xe, 0xfb,\n                                                         0x17, 0x8d, 0x76, 0xf9, 0x66, 0x77, 0x1, 0xfb,\n                                                         0x3b, 0xf9, 0x20, 0x3, 0x23, 0x78, 0x15, 0xf8,\n                                                         0xde, 0xf9, 0x66, 0x5, 0x43, 0x6, 0xfc, 0xd8,\n                                                         0xfd, 0x66, 0x5, 0xe, 0xfb, 0x70, 0xd5, 0xf7,\n                                                         0x1f, 0xd5, 0xf8, 0x21, 0xd5, 0x7f, 0x77, 0x12,\n                                                         0x13, 0xd0, 0xb5, 0x54, 0x15, 0xfb, 0x30, 0xf7,\n                                                         0x36, 0x82, 0xc0, 0xf7, 0x57, 0xac, 0xf7, 0x2f,\n                                                         0xd6, 0x9b, 0x1e, 0xf7, 0x1, 0xf8, 0x98, 0x5,\n                                                         0x37, 0x6, 0x7b, 0x33, 0x4e, 0xa, 0x13, 0xe0,\n                                                         0xe0, 0x5c, 0x47, 0x9a, 0x5c, 0x1b, 0xfb, 0x28,\n                                                         0xfb, 0xe, 0xfb, 0x26, 0xfb, 0x33, 0xfb, 0x2b,\n                                                         0xe2, 0x32, 0xf4, 0xb5, 0xbf, 0x98, 0xc4, 0xc5,\n                                                         0x1f, 0x82, 0x56, 0x5, 0x2e, 0x7a, 0x61, 0x4c,\n                                                         0x22, 0x1b, 0x25, 0x81, 0xb9, 0xaf, 0x1f, 0xae,\n                                                         0xf7, 0xbd, 0x15, 0xd2, 0xc2, 0xf7, 0x34, 0xf7,\n                                                         0xf, 0xd9, 0xbd, 0x4b, 0x3d, 0x27, 0x4b, 0xfb,\n                                                         0x2f, 0xfb, 0x12, 0x31, 0x71, 0xe6, 0xd6, 0x1e,\n                                                         0xe, 0xf7, 0xcd, 0x7c, 0xd3, 0x64, 0x76, 0xf9,\n                                                         0x2b, 0xcf, 0x12, 0xf8, 0xb8, 0xef, 0x13, 0x70,\n                                                         0xce, 0x88, 0x15, 0xee, 0x6, 0xf7, 0x6, 0xf8,\n                                                         0x84, 0x5, 0xe5, 0xa0, 0xbb, 0xd8, 0xf6, 0x1b,\n                                                         0xe0, 0x81, 0x2a, 0x5a, 0x61, 0x1f, 0x53, 0x4b,\n                                                         0x6b, 0x62, 0x65, 0x1a, 0x66, 0xa7, 0x68, 0xc6,\n                                                         0x59, 0x1e, 0xc0, 0x5c, 0x9c, 0x79, 0x6f, 0x1a,\n                                                         0x13, 0xb0, 0x5d, 0x56, 0x56, 0x4b, 0x4e, 0x6b,\n                                                         0xc4, 0xa6, 0x7c, 0x1e, 0x38, 0x62, 0x5, 0x23,\n                                                         0xd0, 0xd7, 0x80, 0xba, 0x1b, 0xf7, 0x8, 0xef,\n                                                         0xda, 0xe7, 0xc1, 0x6e, 0xa5, 0x4a, 0xc8, 0x1f,\n                                                         0x5f, 0xb4, 0x79, 0xa2, 0xa2, 0x1a, 0xa2, 0xa2,\n                                                         0xa5, 0xb3, 0xb9, 0x1e, 0xec, 0xdf, 0x7f, 0xf7,\n                                                         0x2c, 0xfb, 0x46, 0x1b, 0xfb, 0x3d, 0x3b, 0xfb,\n                                                         0x1, 0xfb, 0x12, 0x6d, 0x1f, 0xe, 0x53, 0xa,\n                                                         0xf7, 0x9f, 0xf8, 0xe5, 0x56, 0xa, 0x6d, 0xa,\n                                                         0xfb, 0x1, 0x6, 0xe, 0xf7, 0xb2, 0xbc, 0x76,\n                                                         0xf8, 0x60, 0x77, 0x1, 0xf7, 0x16, 0xf8, 0x71,\n                                                         0x3, 0xf7, 0xc, 0x96, 0x15, 0xf8, 0x71, 0xf7,\n                                                         0x5c, 0x5, 0xde, 0x7, 0xfc, 0x71, 0xf7, 0x5d,\n                                                         0x5, 0x34, 0x7, 0xf8, 0x0, 0xfb, 0x2f, 0xfc,\n                                                         0x0, 0xfb, 0x2f, 0x5, 0xe, 0x49, 0xa, 0xf8,\n                                                         0x2c, 0xf7, 0x17, 0x15, 0xc6, 0x6, 0x45, 0xf7,\n                                                         0x64, 0xf7, 0x31, 0xf7, 0x5d, 0x5, 0x4a, 0x6,\n                                                         0xfb, 0x3f, 0xfb, 0x5d, 0x5, 0x39, 0xfb, 0x64,\n                                                         0x15, 0xc7, 0x6, 0x45, 0xf7, 0x64, 0xf7, 0x30,\n                                                         0xf7, 0x5d, 0x5, 0x4b, 0x6, 0xfb, 0x40, 0xfb,\n                                                         0x5d, 0x5, 0xe, 0x49, 0xa, 0xf7, 0xc, 0xf7,\n                                                         0x17, 0x15, 0xcc, 0x6, 0xf7, 0x3f, 0xf7, 0x5d,\n                                                         0x31, 0xf7, 0x64, 0x5, 0x51, 0x6, 0xd0, 0xfb,\n                                                         0x64, 0x5, 0x9a, 0xfb, 0x5d, 0x15, 0xcb, 0x6,\n                                                         0xf7, 0x40, 0xf7, 0x5d, 0x31, 0xf7, 0x64, 0x5,\n                                                         0x50, 0x6, 0xd0, 0xfb, 0x64, 0x5, 0xe, 0xbf,\n                                                         0x49, 0xa, 0xf7, 0x75, 0xf7, 0x17, 0x15, 0xc0,\n                                                         0x6, 0x4c, 0xf7, 0x60, 0xf7, 0x22, 0xf7, 0x61,\n                                                         0x5, 0x51, 0x6, 0xfb, 0x2f, 0xfb, 0x61, 0x5,\n                                                         0xe, 0xae, 0xf7, 0x2b, 0x76, 0xf8, 0x29, 0x77,\n                                                         0x1, 0xf7, 0x9, 0xf7, 0x16, 0x15, 0xc5, 0x6,\n                                                         0xf7, 0x2f, 0xf7, 0x55, 0x39, 0xf7, 0x68, 0x5,\n                                                         0x57, 0x6, 0xc8, 0xfb, 0x68, 0x5, 0xe, 0xa0,\n                                                         0x76, 0xf8, 0x5f, 0xd3, 0xf7, 0x4f, 0x77, 0x1,\n                                                         0xcc, 0x16, 0xe7, 0x6, 0xba, 0xf7, 0x73, 0x94,\n                                                         0xb5, 0x9c, 0xd6, 0xad, 0xb8, 0x19, 0xb4, 0xac,\n                                                         0xc0, 0xac, 0xcc, 0x1b, 0xeb, 0x71, 0x2f, 0x4f,\n                                                         0x7d, 0x1f, 0x47, 0xfb, 0xc7, 0x5, 0xe7, 0x6,\n                                                         0xcd, 0xf7, 0xc7, 0x5, 0x91, 0xac, 0x91, 0xaf,\n                                                         0xad, 0x1a, 0xcc, 0x6c, 0xc3, 0x22, 0x34, 0x4f,\n                                                         0x56, 0x69, 0x65, 0x1e, 0xc5, 0xf7, 0xa6, 0x3e,\n                                                         0xa, 0x53, 0xa, 0xf7, 0x31, 0xf8, 0xe5, 0x4f,\n                                                         0xa, 0xdd, 0xfb, 0x21, 0x4f, 0xa, 0xe, 0xae,\n                                                         0xf7, 0x7c, 0xe5, 0x1, 0xe8, 0xf7, 0x9c, 0x3,\n                                                         0xe8, 0xf7, 0x7c, 0x15, 0xf7, 0x8b, 0x6, 0x9c,\n                                                         0xe5, 0x5, 0xfb, 0x8b, 0x6, 0xe, 0x3f, 0xa0,\n                                                         0x76, 0xf8, 0x99, 0x77, 0xf7, 0xe, 0xee, 0x1,\n                                                         0xce, 0x16, 0xe4, 0x6, 0xf7, 0x2, 0xf8, 0x99,\n                                                         0x3f, 0xa, 0xa0, 0xf1, 0x15, 0xe5, 0x6, 0xa0,\n                                                         0xee, 0x3e, 0xa, 0x52, 0xa, 0xf7, 0x77, 0x77,\n                                                         0x1, 0xf7, 0x45, 0xf8, 0xe8, 0x6e, 0xa, 0xf7,\n                                                         0x34, 0xf7, 0x1e, 0x5, 0xfb, 0x1e, 0x6, 0xfb,\n                                                         0x57, 0xfd, 0x72, 0x15, 0x38, 0xa, 0xe, 0x52,\n                                                         0xa, 0xe4, 0xf7, 0x1e, 0x1, 0xf7, 0x2, 0xf8,\n                                                         0xe8, 0x15, 0xea, 0x6, 0xdf, 0xe4, 0xb3, 0x32,\n                                                         0x5, 0xdd, 0x6, 0x4b, 0xf7, 0x1e, 0x5, 0x26,\n                                                         0x6, 0xfb, 0x2b, 0xfd, 0x72, 0x15, 0x38, 0xa,\n                                                         0xe, 0x5c, 0xa, 0xf8, 0xf1, 0xf0, 0x1, 0xf7,\n                                                         0xc4, 0xf8, 0xf1, 0x6e, 0xa, 0xa0, 0xf0, 0x45,\n                                                         0xa, 0xfb, 0x5c, 0x26, 0x6e, 0xa, 0xa0, 0xf0,\n                                                         0x45, 0xa, 0x58, 0xfd, 0x56, 0x15, 0x38, 0xa,\n                                                         0xe, 0x52, 0xa, 0xf7, 0x77, 0x77, 0x1, 0xea,\n                                                         0x16, 0x38, 0xa, 0xb8, 0xd0, 0x15, 0xcd, 0x6,\n                                                         0x54, 0xf7, 0x1e, 0x5, 0x25, 0x6, 0xe, 0x3f,\n                                                         0xfb, 0x51, 0x76, 0xf9, 0x6b, 0x77, 0xf7, 0xe,\n                                                         0xee, 0x1, 0x5d, 0xfb, 0xd, 0x15, 0x7d, 0x3f,\n                                                         0x5, 0x7e, 0xba, 0xa5, 0x8b, 0x92, 0x1b, 0xe7,\n                                                         0xab, 0xf7, 0x10, 0xdf, 0x9c, 0x1f, 0xf7, 0x0,\n                                                         0xf8, 0x9b, 0x5, 0x36, 0x6, 0x24, 0xfc, 0x9b,\n                                                         0x72, 0xfb, 0x11, 0x78, 0x7a, 0x38, 0xa2, 0x19,\n                                                         0xf7, 0x8d, 0xf9, 0x78, 0x15, 0xe0, 0x6, 0x9f,\n                                                         0xee, 0x5, 0x36, 0x6, 0xe, 0xf7, 0x5e, 0x2d,\n                                                         0xa, 0xce, 0x16, 0xe5, 0x6, 0xb1, 0xf7, 0x42,\n                                                         0xf7, 0x2, 0xe9, 0xf4, 0xfb, 0xa0, 0x5, 0xef,\n                                                         0x6, 0xfb, 0x1e, 0xf7, 0xdb, 0xf7, 0x78, 0xf7,\n                                                         0x57, 0x5, 0xfb, 0xc, 0x6, 0xfb, 0x9a, 0xfb,\n                                                         0x8c, 0x89, 0x8d, 0xea, 0xf8, 0x4e, 0x3e, 0xa,\n                                                         0x3f, 0x2d, 0xa, 0xce, 0x16, 0xe5, 0x6, 0xf7,\n                                                         0x2b, 0xf9, 0x62, 0x5, 0x32, 0x6, 0xe, 0xf7,\n                                                         0xb2, 0xab, 0x76, 0xf8, 0x78, 0x77, 0x1, 0xe9,\n                                                         0xf7, 0x68, 0x15, 0xf8, 0x71, 0xfb, 0x5d, 0x5,\n                                                         0xe2, 0x7, 0xfc, 0x0, 0xf7, 0x2f, 0xf8, 0x0,\n                                                         0xf7, 0x2f, 0x5, 0xe2, 0x7, 0xfc, 0x71, 0xfb,\n                                                         0x5d, 0x5, 0xe, 0xf7, 0xb2, 0xf7, 0x15, 0x76,\n                                                         0xf7, 0x60, 0xd9, 0x1, 0xf5, 0xf7, 0xcc, 0x15,\n                                                         0xf8, 0x3b, 0x6, 0x5b, 0xfb, 0x60, 0x5, 0xdd,\n                                                         0x6, 0xcc, 0xf7, 0xae, 0x5, 0xfc, 0x8d, 0x6,\n                                                         0xe, 0x3f, 0x2d, 0xa, 0xc0, 0x16, 0xf1, 0x6,\n                                                         0xe0, 0xf7, 0xfb, 0xe4, 0xb4, 0x9d, 0xd8, 0x32,\n                                                         0x61, 0xcf, 0xf7, 0xaf, 0x5, 0x26, 0x6, 0x3b,\n                                                         0xfb, 0xe4, 0x34, 0x64, 0x7a, 0x3e, 0xe0, 0xb3,\n                                                         0x5, 0xe, 0xf8, 0xab, 0x60, 0xa, 0x13, 0xc0,\n                                                         0xcc, 0x16, 0xe5, 0x6, 0xbf, 0xf7, 0x8d, 0x5,\n                                                         0xe1, 0x9e, 0xbc, 0xf7, 0x16, 0xf7, 0xe, 0x1b,\n                                                         0xd2, 0x83, 0x42, 0x56, 0x7f, 0x1f, 0x41, 0xfb,\n                                                         0xe7, 0x5, 0xe4, 0x6, 0xc1, 0xf7, 0x94, 0x5,\n                                                         0xc9, 0x98, 0xb6, 0xf7, 0x27, 0xf7, 0x16, 0x1b,\n                                                         0xca, 0x91, 0x52, 0x46, 0x7d, 0x1f, 0x41, 0xfb,\n                                                         0xe7, 0x5, 0xe4, 0x6, 0xd3, 0xf7, 0xe7, 0x5,\n                                                         0x90, 0xa3, 0x8d, 0xa0, 0x9f, 0x1a, 0x13, 0xa0,\n                                                         0xdb, 0x5d, 0xc1, 0x38, 0x6c, 0x42, 0x83, 0x31,\n                                                         0x42, 0x1e, 0xdf, 0x78, 0x49, 0x99, 0x62, 0x1b,\n                                                         0x37, 0x59, 0x55, 0x61, 0x63, 0x1f, 0x13, 0xc0,\n                                                         0x9d, 0xdf, 0x5, 0x32, 0x6, 0xe, 0xae, 0xf9,\n                                                         0x7, 0xc4, 0x1, 0xf7, 0x23, 0xf9, 0x7, 0x15,\n                                                         0xf7, 0xca, 0x6, 0x9a, 0xc4, 0x5, 0xfb, 0xcb,\n                                                         0x6, 0xe, 0xf7, 0xb2, 0xf7, 0x6c, 0xd4, 0x1,\n                                                         0xe0, 0xf7, 0x6c, 0x15, 0xf8, 0x6e, 0x6, 0xba,\n                                                         0xd4, 0x5, 0xfc, 0x6e, 0x6, 0xe, 0xfb, 0x4e,\n                                                         0x76, 0xf7, 0x5f, 0xcb, 0x54, 0x76, 0xf8, 0xaf,\n                                                         0x77, 0x12, 0x13, 0xb0, 0xf7, 0x39, 0xb9, 0x15,\n                                                         0x76, 0x9d, 0xac, 0x62, 0xce, 0x1b, 0xcc, 0xb5,\n                                                         0xac, 0xa0, 0xa2, 0x1f, 0x8d, 0x89, 0x5, 0x13,\n                                                         0xd0, 0x83, 0x63, 0x5, 0xde, 0x6, 0xf7, 0x2,\n                                                         0xf8, 0xa3, 0x5, 0x32, 0x6, 0x4f, 0xfb, 0xae,\n                                                         0x5, 0x37, 0x78, 0x68, 0x2a, 0x23, 0x1b, 0xfb,\n                                                         0x0, 0x8d, 0xe3, 0xe8, 0xa0, 0x1f, 0x8c, 0x91,\n                                                         0x90, 0xa4, 0xc0, 0xf7, 0x8f, 0x8, 0x31, 0x6,\n                                                         0xfb, 0x2d, 0xfd, 0x6e, 0x5, 0xe2, 0x6, 0xe,\n                                                         0xf7, 0xb2, 0xa0, 0x76, 0xf8, 0x8e, 0x77, 0x1,\n                                                         0xbd, 0xd2, 0x15, 0xc2, 0x44, 0xf7, 0x81, 0xf7,\n                                                         0x52, 0xf7, 0x22, 0xfb, 0x52, 0xd8, 0xce, 0xfb,\n                                                         0x22, 0xf7, 0x51, 0xf7, 0x73, 0xf7, 0x47, 0x55,\n                                                         0xd1, 0xfb, 0x74, 0xfb, 0x46, 0xfb, 0x23, 0xf7,\n                                                         0x47, 0x3e, 0x4e, 0xf7, 0x23, 0xfb, 0x48, 0x5,\n                                                         0xe, 0x60, 0xa, 0x13, 0xa0, 0xcc, 0x16, 0xe7,\n                                                         0x6, 0xbf, 0xf7, 0x89, 0x5, 0xd5, 0x9a, 0xc6,\n                                                         0xf7, 0x26, 0xf7, 0x18, 0x1b, 0xd9, 0x8b, 0x3d,\n                                                         0x47, 0x7b, 0x1f, 0x43, 0xfb, 0xd3, 0x5, 0xe7,\n                                                         0x6, 0xcf, 0xf7, 0xd3, 0x5, 0x90, 0xa1, 0x8e,\n                                                         0xa0, 0x9e, 0x1a, 0xe4, 0x5e, 0xcf, 0x31, 0x2e,\n                                                         0x44, 0x44, 0x6a, 0x6c, 0x1e, 0x89, 0x8d, 0x5,\n                                                         0x13, 0xc0, 0x9f, 0xe5, 0x5, 0x38, 0x6, 0xe,\n                                                         0x78, 0xd4, 0x42, 0xf7, 0x47, 0xf8, 0x6e, 0xd0,\n                                                         0x1, 0xf7, 0x9, 0xe6, 0xf7, 0xa9, 0xec, 0x3,\n                                                         0xdd, 0xf7, 0x30, 0x15, 0x35, 0x93, 0xbc, 0x32,\n                                                         0xf7, 0x17, 0x1b, 0xf7, 0x97, 0xdb, 0xf7, 0xf3,\n                                                         0xf7, 0x24, 0xf7, 0x4e, 0xfb, 0x12, 0xb4, 0x26,\n                                                         0xfb, 0x30, 0xfb, 0x1, 0xfb, 0x1a, 0xfb, 0x25,\n                                                         0xfb, 0x1b, 0xeb, 0x48, 0xf7, 0x0, 0xd9, 0xc2,\n                                                         0xb3, 0x9f, 0xa3, 0x1f, 0x8d, 0x89, 0x5, 0x69,\n                                                         0x82, 0x4c, 0xfb, 0x54, 0xfb, 0x18, 0x1b, 0x46,\n                                                         0x70, 0xbc, 0xc8, 0x82, 0x1f, 0xb0, 0xf7, 0x98,\n                                                         0x15, 0xee, 0xdf, 0xf7, 0x3, 0xe3, 0xf4, 0xa6,\n                                                         0x34, 0x45, 0xfb, 0xe, 0x33, 0x4b, 0x37, 0x3d,\n                                                         0x55, 0xc0, 0xdb, 0x1e, 0xe, 0xa0, 0x76, 0xf9,\n                                                         0x21, 0xcd, 0x8e, 0x77, 0x12, 0xcc, 0xf8, 0xa3,\n                                                         0x13, 0xd0, 0xcc, 0x16, 0xe8, 0x6, 0xbf, 0xf7,\n                                                         0x88, 0x5, 0xf7, 0xf, 0xa7, 0xe3, 0xeb, 0xe8,\n                                                         0x1b, 0xd3, 0x90, 0x3d, 0x48, 0x7c, 0x1f, 0x42,\n                                                         0xfb, 0xd2, 0x5, 0xe9, 0x6, 0xcf, 0xf7, 0xd2,\n                                                         0x5, 0x91, 0xa5, 0x8d, 0xa4, 0xa2, 0x1a, 0xe0,\n                                                         0x5a, 0xc6, 0x34, 0x2d, 0x44, 0x44, 0x6b, 0x6b,\n                                                         0x1e, 0x89, 0x8d, 0x9f, 0xe4, 0x5, 0x37, 0x6,\n                                                         0xce, 0xe3, 0x15, 0xcb, 0x66, 0xa, 0xa5, 0x1b,\n                                                         0xa8, 0xa2, 0x80, 0x80, 0xa1, 0x1f, 0x81, 0xa0,\n                                                         0x9f, 0x81, 0xa3, 0x1b, 0xc8, 0xae, 0xc1, 0xc1,\n                                                         0x90, 0x1f, 0x4d, 0x6, 0x7d, 0x86, 0x85, 0x73,\n                                                         0x71, 0x1b, 0x7d, 0x75, 0x94, 0x95, 0x73, 0x1f,\n                                                         0x13, 0xa0, 0x96, 0x70, 0x6e, 0x96, 0x70, 0x1b,\n                                                         0x45, 0x79, 0x57, 0x51, 0x7b, 0x1f, 0xe, 0x8c,\n                                                         0x76, 0xf7, 0x69, 0xd5, 0xf7, 0x55, 0xd4, 0xf7,\n                                                         0x60, 0x77, 0x1, 0xf7, 0x7, 0x66, 0x15, 0xd8,\n                                                         0x6, 0xb7, 0xf7, 0x69, 0x5, 0xf7, 0x34, 0x6,\n                                                         0x5f, 0xfb, 0x69, 0x5, 0xd8, 0x6, 0xb7, 0xf7,\n                                                         0x69, 0x5, 0xf7, 0x32, 0xd5, 0xfb, 0x23, 0x6,\n                                                         0xb1, 0xf7, 0x55, 0x5, 0xf4, 0xd4, 0x31, 0x6,\n                                                         0xb7, 0x58, 0xa, 0xfb, 0x33, 0x6, 0xb6, 0x58,\n                                                         0xa, 0xfb, 0x2e, 0x42, 0xf7, 0x20, 0x6, 0x64,\n                                                         0xfb, 0x55, 0x5, 0x26, 0x41, 0xe2, 0x6, 0xe6,\n                                                         0xd5, 0x15, 0xb1, 0xf7, 0x55, 0x5, 0xf7, 0x35,\n                                                         0x6, 0x64, 0xfb, 0x55, 0x5, 0xe, 0x7d, 0xd1,\n                                                         0xf8, 0x30, 0xd1, 0x1, 0xed, 0xe5, 0xf7, 0xb6,\n                                                         0xe5, 0x3, 0xde, 0xf7, 0x67, 0x15, 0xfb, 0x24,\n                                                         0xf1, 0x3a, 0xf7, 0x6, 0xf7, 0x30, 0xf7, 0x16,\n                                                         0xf7, 0x1b, 0xf7, 0x5a, 0xf7, 0x1f, 0x33, 0xdb,\n                                                         0xfb, 0x12, 0xfb, 0x4c, 0x23, 0xfb, 0x26, 0xfb,\n                                                         0x49, 0x1e, 0xe5, 0x16, 0xf7, 0x5, 0xcb, 0xf7,\n                                                         0x24, 0xf7, 0x17, 0xe1, 0xb4, 0x48, 0x3a, 0xfb,\n                                                         0x5, 0x43, 0xfb, 0x2b, 0xfb, 0xf, 0x6e, 0x29,\n                                                         0x98, 0xf7, 0x22, 0x1e, 0xe, 0x7d, 0xd1, 0xf9,\n                                                         0x3a, 0x77, 0x1, 0xe8, 0xe5, 0xf7, 0xc2, 0xe5,\n                                                         0x3, 0xf7, 0xd3, 0xf8, 0xe7, 0x15, 0xd6, 0x6,\n                                                         0xf7, 0x19, 0x6f, 0xa, 0xfb, 0x7, 0x6, 0xfb,\n                                                         0xdd, 0x29, 0xa, 0x7d, 0xd1, 0xf8, 0xaf, 0xf7,\n                                                         0x1f, 0x1, 0xe8, 0xe5, 0xf7, 0xbd, 0xe5, 0x3,\n                                                         0xf7, 0x8c, 0xf8, 0xe7, 0x15, 0xe8, 0x6, 0xdc,\n                                                         0xe5, 0xb3, 0x31, 0x5, 0xdb, 0x6, 0x4d, 0x6f,\n                                                         0xa, 0x28, 0x6, 0xfb, 0xbe, 0x29, 0xa, 0x7d,\n                                                         0xd0, 0xf8, 0xba, 0xf0, 0x1, 0xe8, 0xe5, 0xf7,\n                                                         0xb8, 0xe5, 0x3, 0xde, 0xf7, 0x64, 0x24, 0xa,\n                                                         0xf7, 0xa7, 0xf8, 0x21, 0x15, 0xe9, 0x6, 0xa1,\n                                                         0xf0, 0x4d, 0xa, 0xfb, 0x61, 0x26, 0x15, 0xe9,\n                                                         0x6, 0xa0, 0xf0, 0x5, 0x2d, 0x6, 0xe, 0xf9,\n                                                         0x1a, 0x7c, 0xd4, 0x42, 0xf7, 0x4f, 0xcd, 0xd0,\n                                                         0xf7, 0x36, 0xd0, 0x1, 0xde, 0xe4, 0xf9, 0x53,\n                                                         0xe4, 0x3, 0xf8, 0x8b, 0xe3, 0x15, 0x40, 0xb3,\n                                                         0xd0, 0x6f, 0xd3, 0x1b, 0xf7, 0x11, 0xe1, 0xed,\n                                                         0xe0, 0xb0, 0x1f, 0x2d, 0x94, 0x5, 0x61, 0x79,\n                                                         0x54, 0x3e, 0x3b, 0x1b, 0xfb, 0x2, 0x7d, 0xf7,\n                                                         0xe, 0xc5, 0x93, 0x1f, 0xf8, 0x16, 0x6, 0x8f,\n                                                         0x9e, 0x90, 0xb1, 0xa4, 0x1a, 0xf7, 0x13, 0x3a,\n                                                         0xe6, 0xfb, 0x14, 0xfb, 0x0, 0x53, 0x52, 0x61,\n                                                         0x63, 0x1e, 0xee, 0x53, 0xfb, 0x0, 0x8b, 0x75,\n                                                         0x1b, 0xfb, 0x52, 0x2f, 0xfb, 0x43, 0xfb, 0x32,\n                                                         0xfb, 0x32, 0xf1, 0x4d, 0xf7, 0x0, 0xf7, 0xc,\n                                                         0xc8, 0xd1, 0xac, 0xa8, 0x1f, 0xfb, 0xdf, 0xf7,\n                                                         0x9, 0x15, 0xdd, 0xbb, 0xf7, 0x4a, 0xf7, 0x26,\n                                                         0xea, 0xa7, 0x32, 0x56, 0xfb, 0x1, 0x4b, 0xfb,\n                                                         0x38, 0xfb, 0x17, 0xfb, 0xe, 0x8b, 0xf7, 0xf,\n                                                         0xa7, 0x1e, 0xf8, 0x2f, 0xf1, 0x15, 0xf7, 0x17,\n                                                         0xb7, 0xdb, 0xaa, 0xbc, 0x1b, 0xa0, 0xf7, 0x4,\n                                                         0x87, 0xfb, 0x32, 0x7d, 0x1f, 0xe, 0xae, 0xfb,\n                                                         0x60, 0x76, 0xf7, 0x75, 0x77, 0x1, 0xb6, 0xc9,\n                                                         0x3, 0xda, 0x16, 0x75, 0x5d, 0x7d, 0x5a, 0x64,\n                                                         0x1a, 0x6e, 0x93, 0x4d, 0xdb, 0xbb, 0xb2, 0x9c,\n                                                         0x96, 0x9e, 0x1e, 0x97, 0xc7, 0x5, 0x7c, 0x66,\n                                                         0x70, 0x83, 0x74, 0x1b, 0x81, 0x5c, 0x91, 0xc1,\n                                                         0xae, 0xa1, 0xbd, 0x91, 0x9a, 0x1f, 0xe, 0x7d,\n                                                         0xd1, 0x1, 0xf2, 0xe5, 0xf7, 0xb8, 0xe5, 0x3,\n                                                         0xf8, 0x1c, 0xf8, 0xe7, 0x56, 0xa, 0x6f, 0xa,\n                                                         0xfb, 0x1, 0x6, 0xfb, 0x68, 0x29, 0xa, 0xa0,\n                                                         0x76, 0xf8, 0xa4, 0xf7, 0x43, 0x1, 0xf7, 0x63,\n                                                         0xf7, 0xc1, 0x3, 0xf7, 0xb7, 0x16, 0xdb, 0x6,\n                                                         0xf7, 0x1d, 0xf9, 0x53, 0x5, 0x5c, 0x6, 0x5a,\n                                                         0x35, 0xfb, 0x18, 0x40, 0x51, 0x72, 0x7c, 0x3d,\n                                                         0x18, 0xbd, 0x99, 0xdd, 0xa9, 0xbf, 0xba, 0x8d,\n                                                         0x89, 0x18, 0xe, 0xf8, 0xac, 0x80, 0xc4, 0x5f,\n                                                         0x76, 0xf7, 0xc5, 0xc3, 0xf7, 0xfc, 0x77, 0xa0,\n                                                         0x77, 0x12, 0xf9, 0x92, 0xd1, 0x13, 0x6c, 0xf7,\n                                                         0x6, 0x78, 0x15, 0xd5, 0x6, 0xf9, 0x1f, 0xf9,\n                                                         0x66, 0x5, 0x3a, 0x6, 0x13, 0xb4, 0xfb, 0x7d,\n                                                         0xfd, 0x5e, 0x15, 0xf7, 0xa7, 0x6, 0x96, 0xc4,\n                                                         0x5, 0xfb, 0x43, 0x6, 0x9d, 0xa2, 0xa0, 0x97,\n                                                         0xca, 0xb2, 0x8, 0xc1, 0xac, 0xb7, 0xa9, 0xc5,\n                                                         0x1a, 0xba, 0x6b, 0xc1, 0x2a, 0x3c, 0x5a, 0x6a,\n                                                         0x44, 0x78, 0x1e, 0xd1, 0x85, 0x5, 0xb3, 0x98,\n                                                         0xa4, 0x99, 0xb4, 0x1b, 0xb3, 0x9c, 0x74, 0x75,\n                                                         0x6b, 0x72, 0x7d, 0x5a, 0x6e, 0x1f, 0xfb, 0xf,\n                                                         0x44, 0x6f, 0x55, 0x7b, 0x57, 0x8, 0xfb, 0xaa,\n                                                         0xf7, 0xfd, 0x15, 0xd1, 0x6, 0xd4, 0xf7, 0xf4,\n                                                         0x5, 0x57, 0x6, 0x5d, 0x53, 0x3c, 0x6f, 0x79,\n                                                         0x85, 0x7e, 0x50, 0x18, 0xa8, 0x90, 0xb7, 0x96,\n                                                         0xb7, 0xab, 0x8, 0xe, 0x65, 0xa, 0xf8, 0xe0,\n                                                         0x77, 0xa0, 0x77, 0x12, 0x13, 0x68, 0xf8, 0x6a,\n                                                         0xc7, 0x15, 0xf7, 0x36, 0x6, 0x7e, 0x44, 0x5,\n                                                         0xc6, 0x6, 0x99, 0xd2, 0x5, 0xb4, 0x6, 0x13,\n                                                         0xa8, 0x96, 0xc1, 0x5, 0x61, 0x6, 0xb5, 0xf7,\n                                                         0x77, 0x5, 0x59, 0x6, 0xfb, 0x6a, 0xfb, 0x74,\n                                                         0x5, 0xd0, 0x88, 0x15, 0xf7, 0xb, 0xf7, 0xf,\n                                                         0x70, 0xfb, 0xf, 0x5, 0xfc, 0x7f, 0xfb, 0x19,\n                                                         0x15, 0xce, 0x6, 0xf8, 0xdd, 0xf9, 0x66, 0x5,\n                                                         0x42, 0x6, 0xfc, 0x74, 0xfb, 0xf5, 0x15, 0xcb,\n                                                         0x6, 0x13, 0x70, 0xcc, 0xf7, 0xf4, 0x5, 0x5c,\n                                                         0x6, 0x64, 0x55, 0x41, 0x6c, 0x7b, 0x86, 0x80,\n                                                         0x4f, 0x18, 0xa5, 0x91, 0xb2, 0x95, 0xb3, 0xab,\n                                                         0x8, 0xe, 0xae, 0xf7, 0xc2, 0x76, 0xf8, 0x3a,\n                                                         0x77, 0x1, 0xf7, 0x7a, 0xf7, 0xad, 0x15, 0xd1,\n                                                         0x6, 0xd2, 0xf8, 0x3a, 0x5, 0x58, 0x6, 0x5d,\n                                                         0x48, 0x3d, 0x6b, 0x79, 0x84, 0x7f, 0x43, 0x18,\n                                                         0xa7, 0x92, 0xb6, 0x98, 0xb8, 0xb1, 0x8, 0xe,\n                                                         0xd3, 0xf7, 0xd1, 0x77, 0xa7, 0x76, 0xf7, 0x4d,\n                                                         0xd0, 0xf7, 0x47, 0x77, 0x12, 0xef, 0xd6, 0x13,\n                                                         0xb8, 0xf7, 0xee, 0xf7, 0xd1, 0x15, 0xd3, 0x6,\n                                                         0x84, 0x97, 0x88, 0x95, 0xac, 0x1a, 0x99, 0x89,\n                                                         0x9d, 0xa0, 0xda, 0x1e, 0x96, 0xb4, 0x95, 0xb5,\n                                                         0xb2, 0x1a, 0xd6, 0x6d, 0xc4, 0xfb, 0x4, 0xfb,\n                                                         0xa, 0x63, 0x30, 0x69, 0x7e, 0x1e, 0xd6, 0x7d,\n                                                         0x5, 0xd0, 0xa6, 0xc4, 0x8c, 0x96, 0x1b, 0xad,\n                                                         0xb1, 0x76, 0x63, 0x81, 0x89, 0x7f, 0x86, 0x7c,\n                                                         0x1f, 0x6b, 0x84, 0x7b, 0x87, 0x5f, 0x8a, 0x8,\n                                                         0x53, 0x88, 0xfb, 0xe, 0x82, 0xfb, 0x11, 0x1a,\n                                                         0x13, 0x78, 0x63, 0xa4, 0x3e, 0xe7, 0xc2, 0xbc,\n                                                         0xab, 0x9d, 0x9d, 0x1e, 0x13, 0xb8, 0x8f, 0x74,\n                                                         0x8b, 0x88, 0x8e, 0x80, 0x8, 0x95, 0xf7, 0x50,\n                                                         0x15, 0xfb, 0x16, 0x71, 0x3a, 0x89, 0x7a, 0x1b,\n                                                         0x79, 0x64, 0x97, 0xb6, 0xb9, 0xbb, 0x95, 0xab,\n                                                         0x90, 0x1f, 0xc9, 0x90, 0x94, 0x8e, 0xa9, 0x93,\n                                                         0x8, 0xe, 0xce, 0xf7, 0xc4, 0xd7, 0xf7, 0xad,\n                                                         0xd7, 0x1, 0xef, 0xd8, 0xf7, 0x6a, 0xd8, 0x3,\n                                                         0xef, 0xf8, 0x84, 0x15, 0x27, 0xa9, 0x2f, 0xf7,\n                                                         0x18, 0xf7, 0x10, 0xdd, 0xf7, 0x22, 0xf7, 0x6,\n                                                         0xe7, 0x53, 0xe0, 0xfb, 0x1, 0xfb, 0x23, 0x4f,\n                                                         0xfb, 0x2f, 0x35, 0x1e, 0xd8, 0x8d, 0x15, 0xbe,\n                                                         0xb4, 0xf7, 0x4, 0xe0, 0xbe, 0xb0, 0x61, 0x50,\n                                                         0x3c, 0x5b, 0x26, 0x3a, 0x4e, 0x73, 0xbe, 0xce,\n                                                         0x1e, 0xe, 0xf7, 0xcd, 0x9b, 0xca, 0xf8, 0x2,\n                                                         0xca, 0x1, 0xbc, 0xd6, 0xf7, 0xf0, 0xd8, 0x3,\n                                                         0xb8, 0x94, 0x15, 0xb8, 0x6c, 0xc4, 0xcb, 0x5,\n                                                         0x80, 0x9f, 0xb5, 0x79, 0xca, 0x1b, 0xf7, 0x37,\n                                                         0xf7, 0xb, 0xf7, 0x13, 0xf7, 0x3d, 0xc4, 0x80,\n                                                         0xb9, 0x6e, 0xae, 0x1f, 0xc6, 0xcd, 0x5e, 0xab,\n                                                         0x51, 0x4b, 0x5, 0x93, 0x7e, 0x63, 0xa2, 0x43,\n                                                         0x1b, 0xfb, 0x63, 0x41, 0xfb, 0x3d, 0xfb, 0x18,\n                                                         0x40, 0xa2, 0x67, 0x9b, 0x71, 0x1f, 0xc5, 0xca,\n                                                         0x15, 0x7e, 0xa2, 0x82, 0xa2, 0xa8, 0x1a, 0xec,\n                                                         0xcc, 0xf7, 0x20, 0xf7, 0x1d, 0xba, 0xa2, 0x7a,\n                                                         0x84, 0x93, 0x1e, 0xfb, 0x72, 0xfb, 0xdc, 0x15,\n                                                         0xf7, 0x97, 0xf7, 0xb1, 0x5, 0x90, 0x7c, 0x9b,\n                                                         0x78, 0x64, 0x1a, 0x24, 0x3b, 0xfb, 0x16, 0xfb,\n                                                         0x11, 0x6e, 0x72, 0x93, 0x98, 0x76, 0x1e, 0xe,\n                                                         0x7d, 0xd0, 0xf8, 0x15, 0xcf, 0xf2, 0xf7, 0x0,\n                                                         0x49, 0xcd, 0x8e, 0x77, 0x12, 0xe5, 0xe8, 0xf7,\n                                                         0xb8, 0xe8, 0x13, 0xe6, 0xf7, 0x8b, 0xf8, 0xf7,\n                                                         0x15, 0xcb, 0x6, 0x13, 0xd6, 0xa4, 0x91, 0x96,\n                                                         0x9c, 0xa5, 0x1b, 0xad, 0xa1, 0x7d, 0x7f, 0xa3,\n                                                         0x1f, 0x82, 0x9d, 0x9e, 0x83, 0xa2, 0x1b, 0xc8,\n                                                         0xae, 0xc2, 0xc1, 0x91, 0x1f, 0x4c, 0x69, 0xa,\n                                                         0x70, 0x1b, 0x7c, 0x78, 0x96, 0x95, 0x73, 0x1f,\n                                                         0x13, 0xce, 0x96, 0x73, 0x6e, 0x95, 0x69, 0x1b,\n                                                         0x13, 0xe6, 0x45, 0x79, 0x57, 0x50, 0x7b, 0x1f,\n                                                         0xfb, 0x38, 0xfc, 0x27, 0x24, 0xa, 0xe, 0xfb,\n                                                         0x4e, 0x76, 0xf7, 0x53, 0xd5, 0xf8, 0x2a, 0xc9,\n                                                         0x4d, 0xd5, 0x12, 0xf8, 0x80, 0xe7, 0x13, 0xd8,\n                                                         0xf7, 0x3b, 0xdd, 0x15, 0x4b, 0xad, 0xbb, 0x69,\n                                                         0xd0, 0x1b, 0xf7, 0x1c, 0xf7, 0x16, 0xf7, 0x25,\n                                                         0xf7, 0x53, 0xf7, 0x21, 0x3c, 0xd8, 0x26, 0x45,\n                                                         0x5c, 0x65, 0x5d, 0x5c, 0x1f, 0x13, 0xe8, 0x9b,\n                                                         0xd3, 0x5, 0x35, 0x6, 0xfb, 0x30, 0xfd, 0x71,\n                                                         0x5, 0xe7, 0x6, 0xe5, 0xf8, 0x38, 0x15, 0xe0,\n                                                         0xcb, 0xf7, 0x3a, 0xf7, 0x9, 0xda, 0xaf, 0x43,\n                                                         0x43, 0x3e, 0x5c, 0xfb, 0x4d, 0xfb, 0x17, 0x31,\n                                                         0x6f, 0xda, 0xd7, 0x1e, 0xe, 0xf7, 0x83, 0xfb,\n                                                         0x2c, 0x76, 0xf9, 0xc0, 0xda, 0x1, 0xf7, 0xd2,\n                                                         0xfb, 0x41, 0x15, 0xd9, 0xf9, 0xc0, 0xf6, 0xfd,\n                                                         0xc0, 0xda, 0xf9, 0xc0, 0xcf, 0xda, 0xfb, 0xc0,\n                                                         0x6, 0xfb, 0xb, 0x22, 0x47, 0xfb, 0x19, 0x29,\n                                                         0xd5, 0x2d, 0xf7, 0xa, 0x1f, 0xe, 0x61, 0xa,\n                                                         0xf7, 0x0, 0xe2, 0x3, 0xf7, 0x4d, 0xfb, 0x63,\n                                                         0x15, 0xcd, 0x6, 0x68, 0xf7, 0x0, 0x76, 0xf7,\n                                                         0x6, 0xf7, 0x5, 0x1a, 0xf7, 0xda, 0xf7, 0x74,\n                                                         0xf7, 0x85, 0xae, 0xb1, 0x1e, 0x46, 0x6, 0xfb,\n                                                         0x0, 0xfb, 0x12, 0xfb, 0x3d, 0xfb, 0x4b, 0xfb,\n                                                         0xbc, 0x1a, 0xfb, 0x5, 0xa6, 0xfb, 0x5, 0xbd,\n                                                         0xfb, 0x1, 0x1e, 0xe, 0x61, 0xa, 0xf7, 0x8e,\n                                                         0xe2, 0x3, 0x82, 0xfb, 0x63, 0x15, 0xd0, 0x6,\n                                                         0xf7, 0x0, 0xf7, 0x12, 0xf7, 0x3d, 0xf7, 0x42,\n                                                         0xf7, 0xbc, 0x1a, 0xf7, 0x5, 0x70, 0xf7, 0xe,\n                                                         0x59, 0xf7, 0x1, 0x1e, 0x49, 0x6, 0xae, 0xfb,\n                                                         0x0, 0xa0, 0xfb, 0xf, 0xfb, 0x5, 0x1a, 0xfb,\n                                                         0xda, 0xfb, 0x74, 0xfb, 0x7c, 0x68, 0x65, 0x1e,\n                                                         0xe, 0xf8, 0xe3, 0x78, 0xc3, 0xf7, 0x89, 0xc7,\n                                                         0x86, 0xc4, 0xf7, 0x8a, 0xc4, 0x91, 0x77, 0x12,\n                                                         0xf7, 0x27, 0xd8, 0xf7, 0x3d, 0xd7, 0xee, 0xd7,\n                                                         0xf7, 0x3c, 0xd8, 0x13, 0xd7, 0x80, 0xf8, 0xcc,\n                                                         0xf7, 0x2, 0x15, 0x68, 0x8b, 0x2d, 0xf7, 0x18,\n                                                         0xf7, 0x4f, 0x8d, 0xf7, 0x74, 0x91, 0xf7, 0x1,\n                                                         0x3f, 0xa1, 0x4b, 0x1e, 0xfb, 0x18, 0x5a, 0xfb,\n                                                         0x3c, 0x4b, 0x1f, 0xd7, 0x16, 0xae, 0x9f, 0xf7,\n                                                         0x1d, 0xe3, 0x96, 0xbc, 0x84, 0x4b, 0x7c, 0x80,\n                                                         0xfb, 0x33, 0x28, 0x1e, 0x13, 0x37, 0x0, 0x53,\n                                                         0x89, 0xbe, 0xa1, 0x1f, 0xfc, 0x85, 0xf7, 0xfd,\n                                                         0x15, 0x13, 0xb7, 0x80, 0x68, 0x8b, 0x28, 0xf7,\n                                                         0x18, 0xf7, 0x4f, 0x8e, 0xf7, 0x72, 0x92, 0xf7,\n                                                         0x1, 0x3f, 0xa1, 0x49, 0x1e, 0x13, 0x36, 0x0,\n                                                         0xfb, 0x16, 0x59, 0xfb, 0x36, 0x4b, 0x1f, 0xd8,\n                                                         0x16, 0xad, 0x9f, 0xf7, 0x1b, 0xe2, 0x9f, 0xb5,\n                                                         0x7a, 0x52, 0x7d, 0x80, 0xfb, 0x32, 0x26, 0x1e,\n                                                         0x13, 0x8c, 0x0, 0x54, 0x89, 0xc3, 0xa0, 0x1f,\n                                                         0x5f, 0xfc, 0x7e, 0x15, 0xde, 0x6, 0x13, 0xcf,\n                                                         0x80, 0xf8, 0xe7, 0xf9, 0x66, 0x5, 0x3a, 0x6,\n                                                         0xe, 0x77, 0x8b, 0xf5, 0x1, 0xe2, 0x16, 0xf4,\n                                                         0x6, 0xa1, 0xf5, 0x5, 0x22, 0x6, 0xe, 0x77,\n                                                         0xf7, 0x52, 0xf7, 0x11, 0x1, 0xf7, 0x15, 0xf7,\n                                                         0x52, 0x15, 0xf5, 0x6, 0xa1, 0xf7, 0x11, 0x5,\n                                                         0x21, 0x6, 0xe, 0xf9, 0x52, 0x78, 0xc3, 0xf7,\n                                                         0x8c, 0xc4, 0x8b, 0xc3, 0xf7, 0x8b, 0xc3, 0x8d,\n                                                         0x77, 0x12, 0xe3, 0xd3, 0xf7, 0x31, 0xd3, 0x8e,\n                                                         0xd3, 0x13, 0xf7, 0xf7, 0x34, 0xf8, 0x6b, 0x15,\n                                                         0x95, 0x9a, 0xf7, 0x38, 0xe4, 0xc0, 0x8b, 0x52,\n                                                         0x82, 0x67, 0x75, 0xfb, 0x25, 0x39, 0x56, 0x8b,\n                                                         0xbd, 0xa2, 0x1e, 0x64, 0xfc, 0x7e, 0x15, 0xd4,\n                                                         0x6, 0x13, 0xe8, 0xf8, 0x67, 0xf9, 0x66, 0x5,\n                                                         0x41, 0x6, 0xfc, 0x87, 0xfb, 0x7c, 0x5b, 0xa,\n                                                         0xf7, 0x53, 0xb9, 0x1e, 0x13, 0xf0, 0xd5, 0x5e,\n                                                         0xbb, 0x3d, 0xfb, 0x1a, 0x5f, 0xfb, 0x26, 0x37,\n                                                         0x1e, 0xf7, 0xc4, 0xfb, 0xfd, 0x5b, 0xa, 0xf7,\n                                                         0x51, 0xb9, 0xd6, 0x5e, 0xbb, 0x3d, 0xfb, 0x1a,\n                                                         0x5f, 0xfb, 0x25, 0x37, 0x1e, 0xd3, 0x16, 0x96,\n                                                         0x9a, 0xf7, 0x35, 0xe4, 0xc0, 0x8b, 0x53, 0x81,\n                                                         0x68, 0x75, 0xfb, 0x24, 0x39, 0x1e, 0x13, 0x81,\n                                                         0x56, 0x8b, 0xbd, 0xa2, 0x1f, 0xf7, 0x9d, 0x16,\n                                                         0x74, 0x8b, 0x21, 0xf7, 0x10, 0x1e, 0x13, 0x0,\n                                                         0xf7, 0x2e, 0xa1, 0xf7, 0x53, 0xb7, 0xd7, 0x5d,\n                                                         0xba, 0x3f, 0x1f, 0x13, 0x80, 0xfb, 0xe, 0x53,\n                                                         0xfb, 0x2b, 0x3d, 0x1f, 0xd3, 0x16, 0x96, 0x9a,\n                                                         0xf7, 0x35, 0xe4, 0xbf, 0x8b, 0x53, 0x81, 0x68,\n                                                         0x75, 0xfb, 0x24, 0x3a, 0x1e, 0x13, 0x0, 0x56,\n                                                         0x8b, 0xbd, 0xa2, 0x1f, 0xe, 0xf7, 0xb2, 0xf7,\n                                                         0x64, 0xe2, 0x1, 0xf7, 0xc0, 0xe6, 0x3, 0xe0,\n                                                         0xf7, 0x64, 0x15, 0xf7, 0x6b, 0xfb, 0x64, 0xe6,\n                                                         0xf7, 0x64, 0xf7, 0x6b, 0xe2, 0xfb, 0x6b, 0xf7,\n                                                         0x66, 0x30, 0xfb, 0x66, 0xfb, 0x6b, 0x6, 0xe,\n                                                         0xf7, 0xb2, 0x8b, 0xcf, 0xf7, 0x64, 0xcf, 0xf7,\n                                                         0x36, 0x77, 0x1, 0xf7, 0xa0, 0xf7, 0x6, 0x15,\n                                                         0xdd, 0x6, 0xbf, 0xf7, 0x36, 0x5, 0xf7, 0x55,\n                                                         0x6, 0xa2, 0xcf, 0x5, 0xfb, 0x55, 0x6, 0xbf,\n                                                         0xf7, 0x36, 0x5, 0x3a, 0x6, 0x57, 0xfb, 0x36,\n                                                         0x5, 0xfb, 0x56, 0x6, 0x75, 0x47, 0x5, 0xf7,\n                                                         0x55, 0x6, 0xfb, 0xae, 0xfb, 0xa8, 0x15, 0xf8,\n                                                         0x67, 0x6, 0xa1, 0xcf, 0x5, 0xfc, 0x66, 0x6,\n                                                         0xe, 0xfb, 0x4e, 0x76, 0xf7, 0x53, 0xd4, 0xf8,\n                                                         0x2c, 0xd4, 0x7f, 0x77, 0x12, 0xdf, 0xe7, 0x13,\n                                                         0xd8, 0xf8, 0x31, 0xc1, 0x15, 0x52, 0xfb, 0x99,\n                                                         0x5, 0xe8, 0x6, 0xf7, 0x30, 0xf9, 0x71, 0x5,\n                                                         0x3b, 0x6, 0x77, 0x2a, 0x5, 0x13, 0xe8, 0xf5,\n                                                         0x5b, 0x37, 0x8e, 0x74, 0x1b, 0xfb, 0x26, 0xfb,\n                                                         0xc, 0xfb, 0x1d, 0xfb, 0x52, 0xfb, 0x3c, 0xf4,\n                                                         0x50, 0xd4, 0xb3, 0xba, 0x99, 0xc3, 0xcb, 0x1f,\n                                                         0xfb, 0x81, 0xf7, 0x31, 0x15, 0xd1, 0xb7, 0xf7,\n                                                         0x4c, 0xf7, 0x16, 0xd2, 0xbd, 0x4f, 0x3c, 0xfb,\n                                                         0x4, 0x44, 0xfb, 0x31, 0xfb, 0x3, 0x43, 0x62,\n                                                         0xc1, 0xef, 0x1e, 0xe, 0x8b, 0xef, 0xf8, 0xbf,\n                                                         0xd3, 0x1, 0xf7, 0x86, 0xf3, 0x3, 0xf7, 0x89,\n                                                         0xf7, 0x47, 0x15, 0xe1, 0x6, 0x96, 0xc7, 0x95,\n                                                         0xa4, 0xea, 0xd4, 0x8, 0xe7, 0xd3, 0xd2, 0xc1,\n                                                         0xe5, 0x1a, 0xeb, 0x35, 0xd9, 0xfb, 0x14, 0xfb,\n                                                         0x28, 0x34, 0xfb, 0x9, 0x31, 0x1e, 0xe8, 0x7c,\n                                                         0x5, 0xb0, 0x90, 0x9a, 0xf7, 0x5, 0xf7, 0x10,\n                                                         0x1b, 0xd1, 0xbe, 0x5a, 0x56, 0x4c, 0x49, 0x5c,\n                                                         0x56, 0x61, 0x1f, 0x39, 0x4b, 0x4f, 0x5b, 0x7e,\n                                                         0xfb, 0x2, 0x8, 0x5d, 0xfb, 0x47, 0x15, 0xf3,\n                                                         0x6, 0xa1, 0xef, 0x5, 0x23, 0x6, 0xe, 0xf7,\n                                                         0xcd, 0xfb, 0x5d, 0xd3, 0xf8, 0x73, 0x77, 0xee,\n                                                         0xeb, 0x1, 0xe0, 0xe8, 0x3, 0xf8, 0x56, 0xa2,\n                                                         0x15, 0x86, 0x66, 0x61, 0xfb, 0x6, 0x24, 0x8a,\n                                                         0x8, 0x44, 0x8a, 0x58, 0xb8, 0xc0, 0x1a, 0xcb,\n                                                         0xcd, 0xc0, 0xc0, 0xb5, 0x1e, 0xde, 0xcb, 0xc8,\n                                                         0xbb, 0x98, 0xf7, 0x3, 0x8, 0x34, 0x6, 0x80,\n                                                         0x4e, 0x81, 0x72, 0x2b, 0x42, 0x8, 0x2e, 0x43,\n                                                         0x43, 0x4f, 0x30, 0x1a, 0x2b, 0xe2, 0x42, 0xf7,\n                                                         0x16, 0xf7, 0xd, 0xf7, 0x3, 0xf5, 0xf2, 0x1e,\n                                                         0xfb, 0x35, 0xf8, 0x39, 0x15, 0xf4, 0x6, 0xa1,\n                                                         0xeb, 0x5, 0x22, 0x6, 0xe, 0xc4, 0xf8, 0x78,\n                                                         0x44, 0xa, 0xf7, 0x3c, 0xf7, 0xa2, 0x3, 0xf7,\n                                                         0xd5, 0xf8, 0x63, 0x15, 0xbc, 0x6, 0xb8, 0xf7,\n                                                         0x1f, 0xa2, 0xf7, 0x8, 0x3f, 0xa, 0x74, 0xfb,\n                                                         0x8, 0x5, 0xfb, 0x31, 0xfb, 0x1f, 0x15, 0xbc,\n                                                         0x6, 0xb9, 0xf7, 0x1f, 0xa1, 0xf7, 0x8, 0x3f,\n                                                         0xa, 0x75, 0xfb, 0x8, 0x5, 0xe, 0xae, 0xfb,\n                                                         0x14, 0x76, 0xf7, 0x2a, 0xf4, 0x1, 0xa4, 0x8c,\n                                                         0x15, 0x37, 0xa, 0x83, 0x62, 0x18, 0x67, 0xa,\n                                                         0x93, 0xb0, 0x9d, 0xe6, 0x18, 0x22, 0x6, 0xf7,\n                                                         0x24, 0x22, 0x15, 0x62, 0xa, 0x83, 0x62, 0x18,\n                                                         0xf6, 0x3c, 0xa, 0x22, 0x6, 0xe, 0xae, 0xf8,\n                                                         0x6a, 0xf4, 0xf7, 0x2a, 0x77, 0x1, 0xf7, 0x1e,\n                                                         0xf4, 0x3, 0xf7, 0xc3, 0xf8, 0x6a, 0x33, 0xa,\n                                                         0xfb, 0x4c, 0x30, 0x33, 0xa, 0xe, 0xae, 0xf8,\n                                                         0x78, 0x76, 0xf7, 0x2a, 0xf4, 0x1, 0xf7, 0x10,\n                                                         0xf8, 0x63, 0x15, 0x67, 0xa, 0x93, 0xb0, 0x9d,\n                                                         0xe6, 0x18, 0x22, 0x6, 0x75, 0x22, 0x5, 0x37,\n                                                         0xa, 0x8, 0xf7, 0x32, 0x62, 0x15, 0xf6, 0x3c,\n                                                         0xa, 0x22, 0x6, 0x75, 0x22, 0x5, 0x62, 0xa,\n                                                         0x8, 0xe, 0x3f, 0xf8, 0x7f, 0x44, 0xa, 0xf7,\n                                                         0x39, 0xf8, 0x6a, 0x3b, 0xa, 0xea, 0xb7, 0x95,\n                                                         0x41, 0xa, 0xfb, 0x4, 0x84, 0x66, 0x8, 0xe,\n                                                         0x3f, 0xf8, 0x78, 0x44, 0xa, 0xf7, 0x2b, 0xf8,\n                                                         0x63, 0x15, 0xf7, 0x0, 0x3c, 0xa, 0x21, 0x6,\n                                                         0x75, 0x22, 0x5, 0x37, 0xa, 0x8, 0xe, 0x3f,\n                                                         0xfb, 0x14, 0x44, 0xa, 0xbf, 0x8c, 0x15, 0x37,\n                                                         0xa, 0x83, 0x62, 0x18, 0xf7, 0x0, 0x99, 0xa3,\n                                                         0xf7, 0x5, 0x93, 0xb0, 0x9e, 0xe6, 0x18, 0x21,\n                                                         0x6, 0xe, 0x20, 0xf8, 0x78, 0x44, 0xa, 0xf7,\n                                                         0x31, 0xf8, 0x63, 0x15, 0xc1, 0x6, 0xbc, 0xf7,\n                                                         0x1f, 0xa4, 0xf7, 0x8, 0x57, 0xa, 0x72, 0xfb,\n                                                         0x8, 0x5, 0xe, 0xae, 0xa0, 0x76, 0xf8, 0x59,\n                                                         0xd4, 0x42, 0xe0, 0x12, 0x13, 0xa0, 0xd8, 0x16,\n                                                         0xdb, 0x6, 0xb5, 0xf7, 0x67, 0x5, 0xf7, 0x3,\n                                                         0xa1, 0xc0, 0xf7, 0x17, 0xe4, 0x1b, 0x9c, 0x9b,\n                                                         0x86, 0x7e, 0x9a, 0x1f, 0xae, 0xdf, 0x5, 0x96,\n                                                         0x76, 0x78, 0x93, 0x74, 0x1b, 0x41, 0x56, 0x37,\n                                                         0x68, 0x77, 0x1f, 0x13, 0xc0, 0x9e, 0xf6, 0x5,\n                                                         0x41, 0x6, 0xe, 0xf8, 0x4b, 0x78, 0xca, 0xf7,\n                                                         0xab, 0xc3, 0xf7, 0xe, 0xc2, 0xf7, 0xa, 0xca,\n                                                         0x1, 0xc1, 0xcc, 0xf9, 0x21, 0xcc, 0x3, 0xf7,\n                                                         0x93, 0xf7, 0x2a, 0x15, 0xd0, 0x6, 0xad, 0xf7,\n                                                         0x41, 0x5, 0xb3, 0x6, 0xc1, 0x9c, 0x76, 0x33,\n                                                         0xad, 0x1f, 0xa3, 0x4b, 0x5, 0xde, 0x6, 0x68,\n                                                         0xda, 0x65, 0xdc, 0x7a, 0x98, 0x73, 0x93, 0x19,\n                                                         0x8c, 0x8d, 0xe3, 0x90, 0xb8, 0xc4, 0x94, 0xb9,\n                                                         0x19, 0xec, 0x9d, 0x2d, 0x9d, 0x3a, 0x1b, 0xfb,\n                                                         0x27, 0x6, 0xad, 0xfb, 0x45, 0x15, 0xa4, 0xf7,\n                                                         0xe, 0x5, 0xd9, 0x6, 0xb4, 0xcd, 0x8b, 0x4f,\n                                                         0x7f, 0x1f, 0x4d, 0x7e, 0x45, 0x8b, 0x6b, 0x1b,\n                                                         0xfc, 0x22, 0x78, 0x15, 0xfb, 0x66, 0xf7, 0x44,\n                                                         0xfb, 0x3d, 0xf7, 0x6c, 0xf7, 0x6d, 0xf7, 0x42,\n                                                         0xf7, 0x3e, 0xf7, 0x65, 0xf7, 0x65, 0xfb, 0x45,\n                                                         0xf7, 0x3c, 0xfb, 0x6a, 0xfb, 0x6a, 0xfb, 0x46,\n                                                         0xfb, 0x3b, 0xfb, 0x66, 0x1e, 0xcc, 0x16, 0xf7,\n                                                         0x42, 0xf7, 0x25, 0xf7, 0x20, 0xf7, 0x48, 0xf7,\n                                                         0x4a, 0xf7, 0x26, 0xfb, 0x20, 0xfb, 0x42, 0xfb,\n                                                         0x43, 0xfb, 0x26, 0xfb, 0x21, 0xfb, 0x4a, 0xfb,\n                                                         0x48, 0xfb, 0x25, 0xf7, 0x21, 0xf7, 0x43, 0x1e,\n                                                         0xe, 0xae, 0xf8, 0xd0, 0xb1, 0xf7, 0x0, 0xb1,\n                                                         0x1, 0xf7, 0x6a, 0xb2, 0xf7, 0x2, 0xb2, 0x3,\n                                                         0xf7, 0x6a, 0xf9, 0x2d, 0x15, 0x57, 0xb6, 0x62,\n                                                         0xbe, 0xbe, 0xb6, 0xb4, 0xbf, 0xbe, 0x61, 0xb3,\n                                                         0x57, 0x57, 0x61, 0x63, 0x58, 0x1e, 0xb2, 0x89,\n                                                         0x15, 0xaa, 0xa3, 0xa3, 0xaa, 0xaa, 0xa3, 0x74,\n                                                         0x6b, 0x6d, 0x73, 0x74, 0x6c, 0x6d, 0x72, 0xa2,\n                                                         0xa9, 0x1e, 0xe, 0xf7, 0x5e, 0x7c, 0xd0, 0xf8,\n                                                         0x33, 0xd0, 0x12, 0xf7, 0x1d, 0xde, 0xf7, 0x49,\n                                                         0xe6, 0x57, 0xe4, 0x13, 0xf0, 0xca, 0xf7, 0x46,\n                                                         0x15, 0xfb, 0x49, 0xf7, 0x39, 0x7f, 0xbd, 0xf7,\n                                                         0x27, 0xce, 0xd4, 0xd8, 0xeb, 0x3f, 0xb7, 0x2a,\n                                                         0xb5, 0x1e, 0x49, 0xa7, 0x6a, 0x94, 0xb5, 0x1a,\n                                                         0xaa, 0xac, 0xb5, 0xcc, 0x1e, 0x13, 0xe8, 0x9b,\n                                                         0xf5, 0x81, 0x2e, 0x1f, 0xe4, 0x90, 0x5, 0xf7,\n                                                         0x1c, 0xfb, 0x14, 0xaa, 0x3e, 0xfb, 0x1f, 0x5b,\n                                                         0x3c, 0x4c, 0x34, 0xcd, 0x66, 0xe5, 0x63, 0x1e,\n                                                         0x13, 0xf0, 0xca, 0x6f, 0xb8, 0x75, 0x5c, 0x1a,\n                                                         0x58, 0x56, 0x6d, 0x4a, 0xfb, 0x14, 0x89, 0xf0,\n                                                         0xa8, 0x1e, 0xe, 0xf7, 0x5e, 0x7c, 0xd1, 0xf8,\n                                                         0x36, 0xd1, 0x12, 0xf7, 0x20, 0xe2, 0x9f, 0xde,\n                                                         0xe2, 0xe9, 0x55, 0xe8, 0x13, 0xf8, 0xca, 0xf7,\n                                                         0x47, 0x15, 0xfb, 0x4b, 0xf7, 0x40, 0x80, 0xbf,\n                                                         0xf7, 0x2e, 0xd1, 0xd6, 0xd7, 0xec, 0x3b, 0xb6,\n                                                         0x27, 0xb6, 0x1e, 0x46, 0xa8, 0x68, 0x8a, 0xb5,\n                                                         0x1a, 0xaa, 0xae, 0xc0, 0xcf, 0x1e, 0x13, 0xf4,\n                                                         0x9b, 0xf7, 0x3, 0x8f, 0xfb, 0x0, 0x1f, 0xe8,\n                                                         0x90, 0x5, 0xf7, 0x1e, 0xfb, 0x19, 0xaa, 0x3a,\n                                                         0xfb, 0x27, 0x5a, 0x31, 0x4b, 0x34, 0xd0, 0x6f,\n                                                         0xe9, 0x63, 0x1e, 0x13, 0xf8, 0xce, 0x6e, 0xba,\n                                                         0x77, 0x5a, 0x1a, 0x58, 0x52, 0x6d, 0x48, 0xfb,\n                                                         0x19, 0x88, 0xf1, 0xa8, 0x1e, 0xf7, 0x2f, 0xf8,\n                                                         0x2d, 0x15, 0xf1, 0x6, 0xf7, 0x1e, 0xf7, 0x1f,\n                                                         0x50, 0xa, 0x36, 0x31, 0x62, 0xe5, 0x5, 0x38,\n                                                         0x6, 0xe, 0xfb, 0x53, 0xce, 0xf9, 0xaa, 0xd2,\n                                                         0x1, 0xd7, 0x71, 0x15, 0xfb, 0xb, 0xa4, 0xe7,\n                                                         0x5d, 0xe8, 0x1b, 0xf7, 0xb, 0xd0, 0xdc, 0xd9,\n                                                         0xae, 0x7d, 0xae, 0x6a, 0xb1, 0x1f, 0xed, 0xbb,\n                                                         0xad, 0xbe, 0xc2, 0x1a, 0xc9, 0x68, 0xba, 0x29,\n                                                         0xdb, 0x1e, 0x3b, 0xcd, 0x5a, 0xb4, 0xc2, 0x1a,\n                                                         0xb9, 0xb3, 0xb2, 0xc5, 0x9d, 0xe0, 0x88, 0x27,\n                                                         0x1e, 0xe1, 0x96, 0x5, 0xbd, 0x83, 0x7a, 0xf7,\n                                                         0x5, 0xfb, 0x34, 0x1b, 0xfb, 0xd, 0x4e, 0x40,\n                                                         0x38, 0x66, 0x99, 0x69, 0xa2, 0x70, 0x1f, 0x53,\n                                                         0x6f, 0x3c, 0x5f, 0x29, 0x1a, 0x41, 0xbc, 0x63,\n                                                         0xc8, 0x57, 0x1e, 0xf7, 0x1f, 0xfb, 0x7, 0xa3,\n                                                         0x7a, 0x5e, 0x1a, 0x5d, 0x5f, 0x5d, 0x4d, 0x73,\n                                                         0x39, 0x90, 0xf7, 0x5, 0x73, 0x1e, 0xf7, 0x78,\n                                                         0xf7, 0x14, 0x15, 0x75, 0xa0, 0x5f, 0xae, 0x64,\n                                                         0xaa, 0x8, 0x55, 0xb7, 0x6e, 0x9d, 0xb3, 0x1a,\n                                                         0xcb, 0xcd, 0xbb, 0xa5, 0x9a, 0x1e, 0xac, 0x67,\n                                                         0xbd, 0x5f, 0xbf, 0x60, 0x8, 0xb6, 0x66, 0x98,\n                                                         0x79, 0x6d, 0x1a, 0x73, 0x7c, 0x5d, 0x3b, 0x65,\n                                                         0x1e, 0xe, 0x77, 0xfb, 0x12, 0x76, 0xf7, 0x3b,\n                                                         0x76, 0xf8, 0x39, 0xeb, 0x1, 0xc3, 0xf7, 0x89,\n                                                         0x3, 0xe2, 0x8a, 0x15, 0xc5, 0x6, 0x77, 0x30,\n                                                         0x5f, 0x7f, 0x7b, 0x87, 0x82, 0x64, 0x18, 0xf6,\n                                                         0x98, 0xa4, 0xf7, 0x3, 0x92, 0xae, 0x9d, 0xe2,\n                                                         0x18, 0x23, 0x6, 0xcd, 0xf7, 0xd5, 0x40, 0xa,\n                                                         0xe, 0xa0, 0x76, 0xf9, 0x9, 0xda, 0x1, 0xf7,\n                                                         0x3a, 0x16, 0xf1, 0x6, 0xb9, 0xf7, 0x52, 0xf7,\n                                                         0x1b, 0xf7, 0x94, 0xf7, 0x5d, 0xf7, 0x3b, 0x9e,\n                                                         0xda, 0x18, 0xfc, 0x95, 0x6, 0x78, 0x3c, 0x5,\n                                                         0xf8, 0x24, 0x6, 0xfb, 0x63, 0xfb, 0x51, 0xfb,\n                                                         0x1d, 0xfb, 0xa1, 0x70, 0xfb, 0x2f, 0x8, 0xe,\n                                                         0x78, 0xd0, 0xf7, 0xec, 0xd0, 0xf7, 0x44, 0xd4,\n                                                         0x1, 0xe6, 0xe9, 0xf7, 0xb8, 0xe5, 0x3, 0xf7,\n                                                         0x6f, 0xf8, 0x29, 0x15, 0xac, 0x93, 0xcb, 0xf7,\n                                                         0x54, 0xf7, 0x17, 0x1b, 0xd0, 0xa7, 0x58, 0x50,\n                                                         0x93, 0x1f, 0xe3, 0x93, 0x5, 0xe0, 0x83, 0x5a,\n                                                         0xe5, 0xfb, 0x16, 0x1b, 0xfb, 0x95, 0x3b, 0xfb,\n                                                         0xf2, 0xfb, 0x24, 0xfb, 0x4d, 0xf7, 0x11, 0x60,\n                                                         0xef, 0xf7, 0x30, 0xf7, 0x0, 0xf7, 0x13, 0xf7,\n                                                         0x25, 0xf7, 0x19, 0x2c, 0xd8, 0x20, 0x3d, 0x52,\n                                                         0x64, 0x78, 0x73, 0x1f, 0x69, 0xfb, 0x58, 0x15,\n                                                         0xf7, 0xd, 0xe5, 0xcb, 0xde, 0xd9, 0xc1, 0x4d,\n                                                         0x3c, 0x28, 0x37, 0x23, 0x33, 0x3e, 0x53, 0xe4,\n                                                         0xd1, 0x1e, 0xe, 0x77, 0x8d, 0x76, 0x1, 0x88,\n                                                         0xf8, 0x6d, 0x3, 0x76, 0x78, 0x15, 0xd2, 0x6,\n                                                         0xf8, 0x26, 0xf9, 0x88, 0x5, 0x44, 0x6, 0xe,\n                                                         0x77, 0xe, 0x90, 0x76, 0xf7, 0xdc, 0xd3, 0xf7,\n                                                         0x9c, 0xd1, 0x1, 0xf7, 0x4c, 0xe6, 0x3, 0xc6,\n                                                         0x7b, 0x15, 0xaf, 0xae, 0xb5, 0x95, 0xb8, 0x8a,\n                                                         0xb6, 0x8a, 0xb8, 0x7f, 0xb6, 0x80, 0x8, 0x81,\n                                                         0xb3, 0xb0, 0x81, 0xab, 0x1b, 0x95, 0xb9, 0x8b,\n                                                         0xaf, 0xd7, 0x1f, 0x6f, 0xd9, 0x5, 0x6d, 0x57,\n                                                         0x5d, 0x8b, 0x81, 0x1b, 0x6b, 0x69, 0x96, 0x94,\n                                                         0x65, 0x1f, 0x65, 0x94, 0x61, 0x93, 0x5c, 0x84,\n                                                         0x88, 0x8c, 0x18, 0xc0, 0xb1, 0xc2, 0xc4, 0x88,\n                                                         0xf7, 0xa, 0x8, 0xf7, 0x11, 0x6, 0x9a, 0xd3,\n                                                         0x5, 0xfb, 0x23, 0x6, 0x81, 0xbe, 0x8a, 0xb0,\n                                                         0x98, 0x1a, 0xf7, 0x18, 0xea, 0xaa, 0xc0, 0x9e,\n                                                         0xeb, 0x88, 0xfb, 0x10, 0x9a, 0x1e, 0xdc, 0x93,\n                                                         0x5, 0xf7, 0x30, 0x7a, 0xfb, 0xd, 0xac, 0x43,\n                                                         0x1b, 0xfb, 0x14, 0xfb, 0x4, 0x28, 0xfb, 0x1a,\n                                                         0x5f, 0x8d, 0x7e, 0x92, 0x5f, 0x1f, 0x35, 0x6,\n                                                         0x7c, 0x43, 0x5, 0xf7, 0x1, 0x6, 0x9f, 0xfb,\n                                                         0xa, 0xfb, 0x11, 0x29, 0x5c, 0x70, 0x8, 0xe,\n                                                         0x77, 0x84, 0xd2, 0xf7, 0xfd, 0xcb, 0xf7, 0x48,\n                                                         0x77, 0x1, 0xf7, 0x3, 0xf7, 0x9d, 0x3, 0xf7,\n                                                         0xa2, 0x8d, 0x15, 0x9a, 0xcf, 0x5, 0x87, 0x79,\n                                                         0x79, 0x89, 0x79, 0x1b, 0x65, 0x8b, 0xb2, 0xbd,\n                                                         0x96, 0x1f, 0xc7, 0xf7, 0xa4, 0x5, 0xe4, 0x6,\n                                                         0x9a, 0xcb, 0x5, 0x32, 0x6, 0xb4, 0xf7, 0x48,\n                                                         0x23, 0x51, 0x70, 0xfb, 0xe, 0x5, 0x43, 0x6,\n                                                         0x7d, 0x4b, 0x5, 0xd2, 0x6, 0x4b, 0xfb, 0xa4,\n                                                         0x5, 0x86, 0x72, 0x88, 0x75, 0x77, 0x1a, 0x51,\n                                                         0xa8, 0x68, 0xd6, 0x93, 0xa7, 0x8c, 0x93, 0xa7,\n                                                         0x1e, 0xe, 0xfb, 0x4e, 0x76, 0xf7, 0x51, 0xd4,\n                                                         0xf8, 0x26, 0xd4, 0xf7, 0x50, 0x77, 0x1, 0xb1,\n                                                         0xe7, 0xf7, 0xfe, 0xe7, 0x3, 0xf7, 0x3c, 0xd9,\n                                                         0x15, 0x4d, 0xad, 0xb9, 0x69, 0xd1, 0x1b, 0xf7,\n                                                         0x1c, 0xf7, 0x16, 0xf7, 0x23, 0xf7, 0x52, 0xf7,\n                                                         0x1e, 0x3d, 0xd8, 0x25, 0x57, 0x5d, 0x77, 0x56,\n                                                         0x52, 0x1f, 0xc5, 0xf7, 0x99, 0x5, 0x2e, 0x6,\n                                                         0xfb, 0x5c, 0xfe, 0x31, 0x5, 0xe7, 0x6, 0xe5,\n                                                         0xf8, 0x32, 0x15, 0xdf, 0xca, 0xf7, 0x3a, 0xf7,\n                                                         0xa, 0xd9, 0xb0, 0x45, 0x43, 0x3e, 0x5b, 0xfb,\n                                                         0x4b, 0xfb, 0x16, 0x31, 0x6f, 0xd9, 0xd5, 0x1e,\n                                                         0xe, 0x78, 0xd0, 0xf7, 0xa3, 0xd4, 0xf7, 0x84,\n                                                         0xd0, 0x1, 0xf8, 0x71, 0xeb, 0x3, 0xd6, 0xf7,\n                                                         0x45, 0x15, 0xfb, 0x20, 0x96, 0xf7, 0x8, 0x53,\n                                                         0xf7, 0x3, 0x1b, 0xf7, 0x20, 0xf7, 0xc, 0xe6,\n                                                         0xf7, 0x15, 0xe5, 0x48, 0xbf, 0x75, 0x97, 0x1f,\n                                                         0xe6, 0xb2, 0xae, 0xc3, 0xcf, 0x1a, 0xeb, 0x38,\n                                                         0xe4, 0xfb, 0x19, 0x6f, 0xfb, 0x34, 0x87, 0xfb,\n                                                         0x46, 0x5b, 0x1e, 0xe8, 0x79, 0x5, 0xe8, 0x9d,\n                                                         0xce, 0xb1, 0xc5, 0x1b, 0xd0, 0xc0, 0x58, 0x4a,\n                                                         0x52, 0x46, 0x48, 0xfb, 0x10, 0x1f, 0x7b, 0x42,\n                                                         0x5, 0xe8, 0xd8, 0x61, 0x3d, 0x43, 0x44, 0x3c,\n                                                         0x27, 0xfb, 0xc, 0x7d, 0xf0, 0xb0, 0x86, 0x1f,\n                                                         0xe, 0x65, 0xa, 0xf7, 0x77, 0xc4, 0xf7, 0x92,\n                                                         0xbe, 0x12, 0xf7, 0xe7, 0xd3, 0x55, 0xd1, 0x13,\n                                                         0x7c, 0xf8, 0x79, 0xc7, 0x15, 0xf7, 0x45, 0x6,\n                                                         0x7d, 0x44, 0x5, 0xcb, 0x6, 0x9a, 0xd2, 0x5,\n                                                         0xb8, 0x6, 0x97, 0xc1, 0x5, 0x5e, 0x6, 0xb8,\n                                                         0xf7, 0x77, 0x5, 0x55, 0x6, 0xfb, 0x7e, 0xfb,\n                                                         0x74, 0x5, 0xd6, 0x88, 0x15, 0xf7, 0x14, 0xf7,\n                                                         0x11, 0x8d, 0x89, 0x6e, 0xfb, 0xf, 0x5, 0xfc,\n                                                         0xb2, 0xf7, 0xdc, 0x15, 0x50, 0x9b, 0xbe, 0x61,\n                                                         0xd6, 0x1b, 0xde, 0xc3, 0xbd, 0xc4, 0xc1, 0x66,\n                                                         0x9a, 0x74, 0x95, 0x1f, 0x8d, 0x7, 0x13, 0x7a,\n                                                         0xb7, 0x94, 0xab, 0xa1, 0xbb, 0x1a, 0xc7, 0x51,\n                                                         0xae, 0x47, 0x48, 0x57, 0x6c, 0x50, 0x7b, 0x1e,\n                                                         0xce, 0x82, 0x5, 0x9e, 0x92, 0x97, 0xa8, 0xbc,\n                                                         0x1b, 0xa8, 0xa6, 0x7d, 0x6d, 0x5d, 0x5c, 0x85,\n                                                         0x60, 0x8a, 0x1f, 0x81, 0x58, 0x5, 0x13, 0xbc,\n                                                         0xae, 0xba, 0x82, 0x5c, 0x79, 0x80, 0x6b, 0x51,\n                                                         0x55, 0x7c, 0xb0, 0x9a, 0x85, 0x1f, 0x5d, 0xfc,\n                                                         0x69, 0x15, 0xd4, 0x6, 0xf9, 0x13, 0xf9, 0x66,\n                                                         0x5, 0x3c, 0x6, 0xe, 0xae, 0xf7, 0xa2, 0xcf,\n                                                         0xf7, 0xc4, 0xc8, 0x12, 0xf7, 0xe2, 0xdf, 0x4b,\n                                                         0xdd, 0x13, 0xe0, 0xe5, 0xf8, 0x1b, 0x15, 0x45,\n                                                         0x9d, 0xc5, 0x58, 0xe2, 0x1b, 0xec, 0xcf, 0xc7,\n                                                         0xcf, 0xcb, 0x5f, 0x9d, 0x70, 0x98, 0x1f, 0x8d,\n                                                         0x7, 0x13, 0xd0, 0xbe, 0x97, 0xb1, 0xa7, 0xc5,\n                                                         0x1a, 0xd3, 0x48, 0xb1, 0x3b, 0x3d, 0x4f, 0x66,\n                                                         0x44, 0x77, 0x1e, 0xda, 0x81, 0x5, 0xa2, 0x93,\n                                                         0x98, 0xad, 0xc5, 0x1b, 0xad, 0xaa, 0x7a, 0x67,\n                                                         0x55, 0x55, 0x83, 0x59, 0x8a, 0x1f, 0x7f, 0x4d,\n                                                         0x5, 0x13, 0xe0, 0xb3, 0xc3, 0x8b, 0x53, 0x75,\n                                                         0x7e, 0x5b, 0x47, 0x4c, 0x7a, 0xb8, 0x9c, 0x84,\n                                                         0x1f, 0xe, 0xae, 0xf8, 0xf3, 0xf7, 0x4, 0x2f,\n                                                         0x76, 0xb7, 0xd0, 0x8e, 0x77, 0x12, 0xf7, 0x11,\n                                                         0xce, 0xf7, 0x7d, 0xcc, 0x13, 0x8c, 0xf7, 0x11,\n                                                         0xf8, 0xf3, 0x15, 0xce, 0x6, 0x13, 0x6c, 0xa4,\n                                                         0x91, 0x97, 0x9d, 0xa6, 0x1b, 0xae, 0xa6, 0x7e,\n                                                         0x7f, 0xa3, 0x1f, 0x81, 0x9f, 0x9e, 0x82, 0xa1,\n                                                         0x1b, 0xcb, 0xaf, 0xc4, 0xc3, 0x91, 0x1f, 0x4a,\n                                                         0x6, 0x7c, 0x86, 0x85, 0x72, 0x6f, 0x1b, 0x7a,\n                                                         0x78, 0x91, 0x92, 0x78, 0x1f, 0x13, 0x5c, 0x98,\n                                                         0x6a, 0x69, 0x9c, 0x6d, 0x1b, 0x13, 0x8c, 0x41,\n                                                         0x79, 0x55, 0x4e, 0x7a, 0x1f, 0xe, 0xf9, 0x52,\n                                                         0xf7, 0xdb, 0x76, 0xf7, 0xf3, 0xc8, 0x1, 0xf9,\n                                                         0x33, 0xc8, 0x3, 0xf7, 0x5c, 0xf7, 0xc6, 0x15,\n                                                         0xd2, 0x6, 0xf7, 0x13, 0xf7, 0xf3, 0x5, 0xf7,\n                                                         0x21, 0x6, 0xa0, 0xc8, 0x5, 0xfb, 0xf4, 0x6,\n                                                         0x75, 0x4e, 0x5, 0xf7, 0x21, 0x6, 0xf7, 0x31,\n                                                         0xfb, 0xf3, 0x15, 0xcd, 0x6, 0xf7, 0x12, 0xf7,\n                                                         0xf3, 0x48, 0xa, 0x7e, 0xfb, 0xf3, 0x5, 0xcd,\n                                                         0x6, 0xf7, 0x7d, 0xf7, 0xed, 0x48, 0xa, 0xfb,\n                                                         0x10, 0xfb, 0xed, 0x5, 0xcd, 0x6, 0xf7, 0x28,\n                                                         0xf8, 0x30, 0x5, 0x23, 0x6, 0xfb, 0x73, 0xfb,\n                                                         0xdd, 0x4e, 0xa, 0x96, 0xf7, 0xdd, 0x5, 0x21,\n                                                         0x6, 0xe, 0x8b, 0xda, 0xf8, 0xbd, 0xd7, 0x1,\n                                                         0xf8, 0x63, 0xe9, 0x3, 0xa2, 0x16, 0xf8, 0x58,\n                                                         0x6, 0x9d, 0xda, 0x5, 0xfb, 0xe8, 0x6, 0xe1,\n                                                         0xf7, 0xa, 0xf7, 0x11, 0xc2, 0xcf, 0xc7, 0x8,\n                                                         0xa9, 0xa3, 0xea, 0xe1, 0xe8, 0x1a, 0xee, 0x3d,\n                                                         0xe4, 0xfb, 0x26, 0xfb, 0x31, 0x49, 0x23, 0x29,\n                                                         0x7b, 0x1e, 0xe6, 0x80, 0x5, 0xce, 0x98, 0xb6,\n                                                         0xd1, 0xe7, 0x1b, 0xd3, 0xc5, 0x5e, 0x48, 0x38,\n                                                         0x37, 0x53, 0x36, 0x4b, 0x1f, 0xfb, 0x4a, 0xfb,\n                                                         0x1b, 0x4d, 0x5f, 0x70, 0xfb, 0x19, 0x8, 0xe,\n                                                         0xae, 0xf7, 0xad, 0xcf, 0xf7, 0x76, 0xf7, 0x14,\n                                                         0x47, 0xcf, 0x1, 0xf7, 0xfe, 0xe2, 0x3, 0xcb,\n                                                         0xf7, 0xad, 0x15, 0xf7, 0xe8, 0x6, 0x99, 0xcf,\n                                                         0x5, 0xfb, 0x6d, 0x6, 0xa2, 0xa6, 0xa4, 0x9a,\n                                                         0xda, 0xb9, 0x8, 0xce, 0xb2, 0xc1, 0xb1, 0xd0,\n                                                         0x1a, 0xc2, 0x63, 0xcc, 0xfb, 0xc, 0x2a, 0x4e,\n                                                         0x63, 0x37, 0x73, 0x1e, 0xe2, 0x83, 0x5, 0xbb,\n                                                         0x9c, 0xa7, 0x9b, 0xbd, 0x1b, 0xbd, 0xa2, 0x71,\n                                                         0x71, 0x64, 0x6d, 0x78, 0x4e, 0x6a, 0x1f, 0xfb,\n                                                         0x2c, 0x36, 0x67, 0x4b, 0x78, 0x4d, 0x8, 0xe,\n                                                         0x7c, 0xd5, 0x62, 0x76, 0xf8, 0xa2, 0x77, 0x12,\n                                                         0x13, 0x60, 0xf8, 0x2e, 0x88, 0x15, 0xdd, 0x6,\n                                                         0xf7, 0x0, 0xf8, 0xa2, 0x5, 0x33, 0x6, 0x5c,\n                                                         0xfb, 0x75, 0x7d, 0x44, 0x7d, 0x4c, 0x55, 0x57,\n                                                         0x19, 0x13, 0xa0, 0x62, 0x60, 0x62, 0x7f, 0x69,\n                                                         0x1b, 0x4e, 0x5d, 0x97, 0xf7, 0xa, 0xa9, 0x1f,\n                                                         0xcc, 0xf7, 0xe2, 0x5, 0x38, 0x6, 0x49, 0xfb,\n                                                         0xe2, 0x5, 0x85, 0x6b, 0x87, 0x6b, 0x70, 0x1a,\n                                                         0x4c, 0xb5, 0x59, 0xf2, 0xd9, 0xca, 0xbd, 0xc3,\n                                                         0xbd, 0x1e, 0xe, 0x39, 0xa, 0xf7, 0x78, 0x77,\n                                                         0x27, 0xa, 0x31, 0xf8, 0x8f, 0x36, 0xa, 0xe,\n                                                         0x39, 0xa, 0xe8, 0xf7, 0x1b, 0x27, 0xa, 0xfb,\n                                                         0x40, 0xf8, 0x8f, 0x30, 0xa, 0xe, 0x39, 0xa,\n                                                         0xef, 0xef, 0x27, 0xa, 0x8d, 0xf8, 0x96, 0x2e,\n                                                         0xa, 0xe, 0x39, 0xa, 0xe4, 0xf7, 0x1f, 0x27,\n                                                         0xa, 0x65, 0xf8, 0x8b, 0x15, 0xd3, 0x6, 0x50,\n                                                         0x6f, 0xa, 0xfb, 0x3, 0x6, 0xe, 0xfb, 0x11,\n                                                         0xbd, 0x1, 0x70, 0x40, 0x15, 0x59, 0xf8, 0xcb,\n                                                         0xbd, 0x7, 0xe, 0xf7, 0x5e, 0x43, 0xa, 0xf7,\n                                                         0x61, 0x16, 0xee, 0x6, 0xf7, 0xbf, 0xf8, 0x9f,\n                                                         0x4d, 0xa, 0xfb, 0x83, 0xfc, 0x4e, 0x4e, 0xa,\n                                                         0x4e, 0xf8, 0x4e, 0x5, 0x34, 0x6, 0xe, 0xf8,\n                                                         0x3c, 0x43, 0xa, 0xf8, 0x65, 0xcd, 0x3, 0xf7,\n                                                         0x47, 0x16, 0xe7, 0x6, 0xf7, 0x4a, 0xf8, 0x36,\n                                                         0xa3, 0xfc, 0x36, 0x5, 0xe6, 0x6, 0xf7, 0x90,\n                                                         0xf8, 0x9f, 0x5, 0x34, 0x6, 0xfb, 0x51, 0xfc,\n                                                         0x38, 0x4e, 0xa, 0x76, 0xf8, 0x38, 0x50, 0xa,\n                                                         0xfb, 0x48, 0xfc, 0x3d, 0x4e, 0xa, 0x6a, 0xf8,\n                                                         0x3d, 0x5, 0x36, 0x6, 0xe, 0xf7, 0x5e, 0x43,\n                                                         0xa, 0x96, 0x16, 0xf7, 0xc, 0x6, 0xf7, 0x3a,\n                                                         0xf7, 0x54, 0xec, 0xfb, 0x54, 0x5, 0xf4, 0x6,\n                                                         0xfb, 0x20, 0xf7, 0x98, 0xf7, 0x7f, 0xf7, 0x9b,\n                                                         0x5, 0xfb, 0x9, 0x6, 0xfb, 0x36, 0xfb, 0x52,\n                                                         0x2c, 0xf7, 0x52, 0x5, 0x22, 0x6, 0xf7, 0x20,\n                                                         0xfb, 0x93, 0x5, 0xe, 0xf7, 0x5e, 0xfb, 0x55,\n                                                         0x76, 0xf9, 0x75, 0x77, 0x1, 0x9f, 0xfb, 0xe,\n                                                         0x15, 0x86, 0x36, 0x5, 0x86, 0x9f, 0x9d, 0x89,\n                                                         0x9c, 0x1b, 0xe8, 0xc0, 0xd1, 0xd3, 0xb3, 0x1f,\n                                                         0xf7, 0xec, 0xf8, 0xe7, 0x50, 0xa, 0xfb, 0x86,\n                                                         0xfc, 0x3a, 0x4e, 0xf8, 0x3a, 0x3f, 0xa, 0xe4,\n                                                         0xfc, 0xa3, 0x41, 0xfb, 0x15, 0x74, 0x7e, 0x38,\n                                                         0xa3, 0x19, 0xe, 0xf7, 0x5e, 0xfb, 0x55, 0x76,\n                                                         0xf9, 0x7d, 0x77, 0xf7, 0x73, 0x77, 0x1, 0xf8,\n                                                         0x74, 0xeb, 0x3, 0x9f, 0xfb, 0xb, 0x15, 0x86,\n                                                         0x36, 0x59, 0xa, 0xd8, 0xce, 0xb2, 0x1f, 0xf7,\n                                                         0xec, 0xf8, 0xed, 0x50, 0xa, 0xfb, 0x85, 0xfc,\n                                                         0x3f, 0x4e, 0xa, 0x4f, 0xf8, 0x3f, 0x45, 0xa,\n                                                         0xe5, 0xfc, 0xa8, 0x5, 0xfb, 0x15, 0x53, 0x59,\n                                                         0x8e, 0x78, 0x1b, 0x71, 0x7b, 0x8f, 0x8f, 0x7e,\n                                                         0x1f, 0xf7, 0x97, 0xf9, 0x5f, 0x15, 0xd7, 0x6,\n                                                         0xf7, 0x1c, 0xf7, 0x1e, 0x5, 0xfb, 0x9, 0x6,\n                                                         0xe, 0xf7, 0x5e, 0xfb, 0x6a, 0xe1, 0xf9, 0x71,\n                                                         0xf0, 0x1, 0x9f, 0xfb, 0xc, 0x15, 0x86, 0x37,\n                                                         0x59, 0xa, 0xd7, 0xce, 0xb2, 0x1f, 0xf7, 0xec,\n                                                         0xf8, 0xe6, 0x50, 0xa, 0xfb, 0x85, 0xfc, 0x3a,\n                                                         0x4e, 0xa, 0x4f, 0xf8, 0x3a, 0x45, 0xa, 0xe5,\n                                                         0xfc, 0xa2, 0x5, 0xfb, 0x16, 0x3f, 0x7f, 0x90,\n                                                         0x66, 0x1b, 0x71, 0x7b, 0x8f, 0x8f, 0x7e, 0x1f,\n                                                         0xf8, 0x1b, 0xf9, 0x69, 0x15, 0xeb, 0x6, 0xa1,\n                                                         0xf0, 0x50, 0xa, 0xfb, 0x65, 0x26, 0x15, 0xea,\n                                                         0x6, 0xa1, 0xf0, 0x50, 0xa, 0xe, 0xa0, 0x76,\n                                                         0xf7, 0xbf, 0xcb, 0xf7, 0xd9, 0x77, 0x1, 0xdc,\n                                                         0xf7, 0x2e, 0x15, 0xf7, 0x58, 0x6, 0x6b, 0xfb,\n                                                         0x2e, 0x5, 0xe1, 0x6, 0xac, 0xf7, 0x2e, 0x5,\n                                                         0xf7, 0x56, 0x6, 0x99, 0xcc, 0x5, 0xfb, 0x56,\n                                                         0x6, 0x9b, 0xdb, 0x5, 0xf7, 0x54, 0x6, 0x99,\n                                                         0xcb, 0x5, 0xfb, 0x2c, 0x6, 0xf7, 0x8f, 0xf7,\n                                                         0xd9, 0x5, 0xfb, 0x0, 0x6, 0xfb, 0x77, 0xfb,\n                                                         0xd9, 0x4e, 0xa, 0xfb, 0x9, 0xf7, 0xd9, 0x5,\n                                                         0x33, 0x6, 0xf7, 0x13, 0xfb, 0xd9, 0x5, 0xfb,\n                                                         0x35, 0x6, 0x7e, 0x4b, 0x5, 0xf7, 0x59, 0x6,\n                                                         0x7b, 0x3b, 0x5, 0xfb, 0x58, 0x6, 0xe, 0xf7,\n                                                         0x5e, 0x8b, 0xda, 0xf8, 0x6, 0xd5, 0x1, 0xaa,\n                                                         0xf8, 0xb0, 0x3, 0xaa, 0x16, 0xf8, 0x5e, 0x6,\n                                                         0x9c, 0xda, 0x5, 0xfb, 0xe3, 0x6, 0xf8, 0x18,\n                                                         0xf8, 0x18, 0x5a, 0xa, 0xf7, 0xca, 0x6, 0xfc,\n                                                         0xe, 0xfc, 0x10, 0x5, 0xe, 0xf7, 0x5e, 0x8b,\n                                                         0xdb, 0xf8, 0x98, 0xf7, 0x1e, 0x1, 0xaa, 0x16,\n                                                         0xf8, 0x5e, 0x6, 0x9c, 0xdb, 0x5, 0xfb, 0xe3,\n                                                         0x6, 0xf8, 0x18, 0xf8, 0x1c, 0x5a, 0xa, 0xf7,\n                                                         0xc8, 0x6, 0x8d, 0x89, 0xfc, 0xe, 0xfc, 0x12,\n                                                         0x5, 0xf7, 0x9b, 0xf8, 0xa2, 0x15, 0xf5, 0x6,\n                                                         0xf7, 0x23, 0xf7, 0x1e, 0x47, 0xa, 0x33, 0x32,\n                                                         0x60, 0xe4, 0x5, 0x36, 0x6, 0xe, 0x78, 0xd0,\n                                                         0xf8, 0xdc, 0xd0, 0x1, 0xf7, 0x2, 0xe3, 0xf7,\n                                                         0xd0, 0xe3, 0x3, 0xe8, 0xf7, 0x63, 0x15, 0xfb,\n                                                         0x44, 0xf0, 0x59, 0xec, 0xf7, 0x73, 0xe9, 0xf7,\n                                                         0xbc, 0xf7, 0x50, 0xf7, 0x4f, 0xfb, 0xd, 0xbe,\n                                                         0x3b, 0xfb, 0x6c, 0x29, 0xfb, 0xd7, 0xfb, 0x41,\n                                                         0x1e, 0xe3, 0x16, 0xa2, 0xac, 0xf8, 0x28, 0xf7,\n                                                         0x56, 0xf7, 0x3, 0x8c, 0xfb, 0x1d, 0x6b, 0x38,\n                                                         0x5a, 0xfb, 0xe0, 0xfb, 0x43, 0x49, 0x5a, 0xbd,\n                                                         0xf6, 0x1e, 0xe, 0x78, 0x9e, 0xf8, 0x9f, 0x9a,\n                                                         0xf7, 0x48, 0x9e, 0x6, 0xfb, 0x70, 0x98, 0xf8,\n                                                         0xc0, 0x94, 0x7, 0x78, 0x9e, 0xf8, 0x9f, 0x9a,\n                                                         0xf7, 0x48, 0x9e, 0x8, 0xfb, 0x70, 0x98, 0x9,\n                                                         0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xdc,\n                                                         0xa, 0xe5, 0xb, 0xd5, 0x92, 0xc, 0xc, 0xe5,\n                                                         0x95, 0xc, 0xd, 0xf8, 0xc0, 0x14, 0xf7, 0xbe,\n                                                         0x15, 0xc3, 0x13, 0x0, 0x50, 0x2, 0x0, 0x1,\n                                                         0x0, 0x4e, 0x0, 0x92, 0x0, 0x99, 0x0, 0xc9,\n                                                         0x1, 0x1, 0x1, 0x49, 0x1, 0x72, 0x1, 0xb1,\n                                                         0x1, 0xb6, 0x1, 0xbb, 0x1, 0xde, 0x1, 0xe1,\n                                                         0x2, 0x13, 0x2, 0x1a, 0x2, 0x22, 0x2, 0x2a,\n                                                         0x2, 0x3a, 0x2, 0x40, 0x2, 0x4b, 0x2, 0x58,\n                                                         0x2, 0x61, 0x2, 0x66, 0x2, 0x72, 0x2, 0x7b,\n                                                         0x2, 0x84, 0x2, 0x8c, 0x2, 0x96, 0x2, 0xa0,\n                                                         0x2, 0xa8, 0x2, 0xac, 0x2, 0xaf, 0x2, 0xb3,\n                                                         0x2, 0xbc, 0x2, 0xc5, 0x2, 0xcc, 0x2, 0xd3,\n                                                         0x2, 0xd9, 0x2, 0xdd, 0x2, 0xeb, 0x2, 0xef,\n                                                         0x2, 0xf3, 0x2, 0xfb, 0x3, 0x3, 0x3, 0xa,\n                                                         0x3, 0xf, 0x3, 0x13, 0x3, 0x17, 0x3, 0x22,\n                                                         0x3, 0x26, 0x3, 0x2d, 0x3, 0x33, 0x3, 0x3a,\n                                                         0x3, 0x40, 0x3, 0x45, 0x3, 0x4a, 0x3, 0x4e,\n                                                         0x3, 0x58, 0x3, 0x62, 0x3, 0x6c, 0x3, 0x76,\n                                                         0x3, 0x7a, 0x3, 0x83, 0x3, 0x8c, 0x3, 0x95,\n                                                         0x3, 0x9e, 0x3, 0xa7, 0x3, 0xb0, 0x3, 0xb8,\n                                                         0x3, 0xc1, 0x3, 0xca, 0x3, 0xd0, 0x3, 0xd4,\n                                                         0x3, 0xda, 0x3, 0xe0, 0x3, 0xe5, 0x3, 0xea,\n                                                         0x3, 0xef, 0x3, 0xf3, 0x3, 0xf7, 0x3, 0xfb,\n                                                         0x6e, 0xa, 0x85, 0xa7, 0x87, 0x9f, 0xa4, 0x1a,\n                                                         0xae, 0x91, 0xae, 0x92, 0xad, 0x1e, 0xa9, 0xf7,\n                                                         0x18, 0x5, 0x97, 0xc4, 0x8f, 0xa5, 0x91, 0x1a,\n                                                         0xe3, 0x2d, 0xc8, 0xfb, 0x2, 0x30, 0xfb, 0x11,\n                                                         0x5f, 0xfb, 0xc, 0x73, 0x1e, 0xe1, 0x83, 0x5,\n                                                         0xd8, 0xa6, 0xcc, 0xa0, 0xc5, 0x1b, 0xa4, 0xe5,\n                                                         0x87, 0x44, 0x80, 0x87, 0x6f, 0x83, 0x74, 0x1f,\n                                                         0x67, 0x7c, 0x65, 0x89, 0x3d, 0x88, 0x8, 0x4e,\n                                                         0x89, 0xfb, 0x48, 0x83, 0xfb, 0x37, 0x1a, 0x28,\n                                                         0xd6, 0x53, 0xe4, 0x1e, 0xb, 0x15, 0xfb, 0x41,\n                                                         0xf7, 0xb, 0xfb, 0x27, 0xf7, 0x5b, 0xf7, 0x76,\n                                                         0xf7, 0x45, 0xf7, 0x54, 0xf7, 0x82, 0xf7, 0x54,\n                                                         0xfb, 0xb, 0xf7, 0x1c, 0xfb, 0x5c, 0xfb, 0x6a,\n                                                         0xfb, 0x50, 0xfb, 0x38, 0xfb, 0xa6, 0x1e, 0xef,\n                                                         0x86, 0x15, 0xf7, 0x8b, 0xf7, 0x39, 0xf7, 0x7,\n                                                         0xf7, 0x1d, 0xf7, 0x4, 0xf6, 0x32, 0xfb, 0x32,\n                                                         0xfb, 0x47, 0xfb, 0xd, 0xfb, 0x3e, 0xfb, 0x42,\n                                                         0xfb, 0x4, 0xfb, 0x6, 0xdd, 0xf7, 0x2c, 0x1e,\n                                                         0xb, 0x20, 0xa, 0x13, 0xbc, 0x23, 0xa, 0xb,\n                                                         0xe7, 0xc9, 0xc1, 0xa4, 0xa7, 0x1f, 0x8c, 0x80,\n                                                         0x8d, 0x6d, 0x94, 0x71, 0x8, 0xa1, 0xf7, 0xa4,\n                                                         0x15, 0x82, 0x55, 0x81, 0x5f, 0x71, 0x66, 0x8,\n                                                         0x59, 0x69, 0x54, 0x6e, 0x54, 0x1b, 0x3e, 0x73,\n                                                         0xbd, 0xb2, 0xe1, 0xe7, 0x96, 0xc6, 0x90, 0x1f,\n                                                         0xdd, 0x92, 0xa2, 0x8d, 0xad, 0x99, 0x8, 0xb,\n                                                         0x15, 0xfb, 0x22, 0xf1, 0x3b, 0xf7, 0x7, 0xf7,\n                                                         0x30, 0xf7, 0x15, 0xf7, 0x1a, 0xf7, 0x57, 0xf7,\n                                                         0x1d, 0x34, 0xde, 0xfb, 0x13, 0xfb, 0x4c, 0x23,\n                                                         0xfb, 0x28, 0xfb, 0x47, 0x1e, 0xe5, 0x16, 0xf7,\n                                                         0x3, 0xcb, 0xf7, 0x27, 0xf7, 0x17, 0xe2, 0xb3,\n                                                         0x43, 0x3c, 0xfb, 0x4, 0x43, 0xfb, 0x28, 0xfb,\n                                                         0xe, 0x6d, 0x29, 0x98, 0xf7, 0x20, 0x1e, 0xb,\n                                                         0x15, 0xf8, 0x1e, 0x6, 0x8e, 0x9f, 0x8f, 0xa0,\n                                                         0xb3, 0x1a, 0xe7, 0x5d, 0xf7, 0x15, 0xfb, 0x38,\n                                                         0xfb, 0x5a, 0x35, 0xfb, 0x58, 0xfb, 0x1c, 0xfb,\n                                                         0x29, 0xe9, 0x3e, 0xf7, 0x7, 0xf7, 0x20, 0xe5,\n                                                         0xf7, 0x2, 0xd5, 0xa1, 0x1e, 0x32, 0x94, 0x5,\n                                                         0x29, 0x61, 0x3a, 0x76, 0x63, 0x1b, 0x4c, 0x54,\n                                                         0xbe, 0xf2, 0x96, 0x8c, 0x92, 0x8c, 0x95, 0x1f,\n                                                         0x99, 0xd1, 0x15, 0xcf, 0xa0, 0xbf, 0xe9, 0xf5,\n                                                         0x1b, 0xd2, 0xcd, 0x4b, 0x29, 0x7b, 0x1f, 0xb,\n                                                         0x15, 0xf4, 0x6, 0xf7, 0x8, 0xf7, 0x69, 0x5,\n                                                         0xf7, 0xb6, 0x6, 0xaf, 0xfb, 0x69, 0x5, 0xe8,\n                                                         0x6, 0xfb, 0xb, 0xf9, 0x76, 0x5, 0xfb, 0x5,\n                                                         0x6, 0xfb, 0x26, 0xfc, 0x54, 0x15, 0xf7, 0x51,\n                                                         0xf8, 0x4, 0x48, 0xa, 0xb9, 0xfc, 0x4, 0x5,\n                                                         0xe, 0x12, 0x13, 0x70, 0xf8, 0x27, 0x88, 0x15,\n                                                         0xe0, 0x6, 0xf7, 0x4, 0xf8, 0xa5, 0x45, 0xa,\n                                                         0x5a, 0xfb, 0x76, 0x5, 0x21, 0x75, 0x50, 0xfb,\n                                                         0x1b, 0xfb, 0x12, 0x1b, 0x4b, 0x7a, 0xc5, 0xd4,\n                                                         0x9a, 0x1f, 0xd4, 0xf7, 0xe4, 0x45, 0xa, 0x46,\n                                                         0xfb, 0xe2, 0x5, 0x87, 0x74, 0x89, 0x76, 0x76,\n                                                         0x1a, 0x13, 0xb0, 0x3a, 0xae, 0x4e, 0xec, 0xdc,\n                                                         0xcc, 0xbd, 0xc4, 0xbf, 0x1e, 0x13, 0x70, 0xb,\n                                                         0xfd, 0x8, 0x21, 0xa, 0xe, 0xfc, 0xa2, 0x24,\n                                                         0xa, 0xe, 0x1, 0xe1, 0x16, 0xf8, 0xbe, 0x6a,\n                                                         0xa, 0xfc, 0x5c, 0x6, 0xbf, 0xf7, 0x94, 0x5,\n                                                         0xf8, 0x29, 0x6, 0x9d, 0xde, 0x5, 0xfc, 0x29,\n                                                         0x6, 0xb9, 0xf7, 0x7b, 0x5, 0xf8, 0x40, 0x6a,\n                                                         0xa, 0xfc, 0xa0, 0x6, 0xb, 0x23, 0xa, 0xe,\n                                                         0x15, 0x8b, 0x22, 0xfc, 0x86, 0x64, 0x1a, 0xfb,\n                                                         0x25, 0xf7, 0xb, 0x43, 0xf7, 0x27, 0xf7, 0x91,\n                                                         0xbb, 0xf7, 0x80, 0xe0, 0x9c, 0x1e, 0xe5, 0xf8,\n                                                         0x45, 0x57, 0xa, 0x33, 0xfc, 0x45, 0x5, 0xfb,\n                                                         0xb, 0x74, 0x49, 0xfb, 0xa, 0xfb, 0x1e, 0x1b,\n                                                         0x39, 0x39, 0xb8, 0xe3, 0x1f, 0xf4, 0xf8, 0xad,\n                                                         0x5, 0xe, 0xa0, 0x76, 0xf9, 0x62, 0x77, 0x1,\n                                                         0xb, 0x2f, 0xa, 0xfb, 0x5d, 0x27, 0x2f, 0xa,\n                                                         0xb, 0x15, 0xe7, 0x6, 0xa0, 0xef, 0x3d, 0xa,\n                                                         0xb, 0x6e, 0xa, 0xdb, 0xe2, 0xb2, 0x34, 0x5,\n                                                         0xd9, 0x6, 0x4e, 0xf7, 0x1b, 0x5, 0x2a, 0x6,\n                                                         0xb, 0x35, 0xa, 0xf7, 0x69, 0xd8, 0xb, 0xf8,\n                                                         0x5, 0x8b, 0xdf, 0xf7, 0x94, 0xde, 0xf7, 0x7b,\n                                                         0xdf, 0xb, 0x3b, 0xa, 0xe9, 0xb7, 0x96, 0x41,\n                                                         0xa, 0xfb, 0x5, 0x84, 0x66, 0x8, 0xb, 0xe9,\n                                                         0x6, 0xf7, 0x25, 0xf9, 0x73, 0x3d, 0xa, 0xb,\n                                                         0xf8, 0x5, 0xa0, 0x76, 0xb, 0x15, 0xd4, 0x6,\n                                                         0xf7, 0x16, 0xf7, 0x1b, 0x5, 0xfb, 0x4, 0x6,\n                                                         0xb, 0xc5, 0x6, 0x77, 0x2d, 0x5f, 0x80, 0x7a,\n                                                         0x87, 0xb, 0xdf, 0x6, 0xf4, 0xf8, 0xa3, 0x5,\n                                                         0x36, 0x6, 0xb, 0x7c, 0xd5, 0x4d, 0xc9, 0xf8,\n                                                         0x67, 0x77, 0xb, 0xa0, 0x76, 0xf8, 0x56, 0xcf,\n                                                         0xf7, 0x17, 0xda, 0x1, 0xb, 0x15, 0xf4, 0x6,\n                                                         0xa1, 0xf4, 0x5, 0x52, 0x6, 0x9e, 0xb, 0x4c,\n                                                         0xa, 0x92, 0xb0, 0x9e, 0xe6, 0x18, 0xb, 0x5,\n                                                         0x2f, 0x6, 0xb, 0x3f, 0xa, 0xe, 0x5, 0x31,\n                                                         0x6, 0xb, 0x15, 0xf3, 0x6, 0xa1, 0xeb, 0x5,\n                                                         0x23, 0x6, 0xb, 0x9c, 0x8f, 0x93, 0xb4, 0x18,\n                                                         0x20, 0x7d, 0x72, 0xb, 0x77, 0x1, 0xf7, 0xf,\n                                                         0xec, 0x3, 0xb, 0xa0, 0x76, 0xf8, 0x9f, 0x77,\n                                                         0x1, 0xb, 0x76, 0xf7, 0x93, 0x77, 0x1, 0xb,\n                                                         0x5, 0x30, 0x6, 0xb, 0x6, 0xeb, 0xf8, 0x56,\n                                                         0x5, 0xf0, 0x6, 0x99, 0xcf, 0x5, 0x26, 0x6,\n                                                         0xf0, 0xb, 0x5, 0x27, 0x6, 0xb, 0x5, 0x8d,\n                                                         0x6, 0xb, 0xf7, 0x2c, 0x76, 0xf8, 0x2d, 0x77,\n                                                         0x1, 0xb, 0x7c, 0xd1, 0x66, 0x76, 0xf7, 0x8d,\n                                                         0xce, 0xb, 0xef, 0x6, 0xa0, 0xf5, 0x47, 0xa,\n                                                         0xb, 0x99, 0xa4, 0xf7, 0x5, 0xb, 0x5, 0x2c,\n                                                         0x6, 0xb, 0x5, 0x89, 0x6, 0xb, 0x15, 0xdc,\n                                                         0x6, 0xf7, 0x24, 0x6d, 0xa, 0xfb, 0x10, 0x6,\n                                                         0xb, 0x5, 0x2b, 0x6, 0xb, 0x5, 0xfb, 0x3,\n                                                         0x6, 0xfb, 0x97, 0xb, 0x5c, 0xa, 0xf8, 0xa3,\n                                                         0x77, 0xb, 0xae, 0xf8, 0xe5, 0xf7, 0x21, 0x1,\n                                                         0xb, 0x5c, 0xa, 0xf9, 0x73, 0x77, 0xb, 0x6,\n                                                         0x9c, 0xdc, 0x5, 0xb, 0x15, 0xd1, 0x6, 0x51,\n                                                         0xb, 0x5, 0x29, 0x6, 0xb, 0xf7, 0x60, 0x5,\n                                                         0x3f, 0x6, 0x5e, 0xfb, 0x60, 0x5, 0xb, 0x5,\n                                                         0x82, 0xa5, 0xa1, 0x8a, 0x9a, 0x1b, 0xe9, 0xb8,\n                                                         0xb, 0x97, 0xc3, 0x5, 0xfc, 0x4c, 0x6, 0x7a,\n                                                         0x41, 0x5, 0xb, 0x15, 0x74, 0x8b, 0x21, 0xf7,\n                                                         0x10, 0xf7, 0x2d, 0xa3, 0xb, 0x77, 0xa0, 0x76,\n                                                         0xb, 0x15, 0xe1, 0x6, 0x76, 0x25, 0x5, 0x35,\n                                                         0x6, 0xb, 0x72, 0x1b, 0x7c, 0x78, 0x95, 0x95,\n                                                         0x74, 0x1f, 0xb, 0x77, 0xfb, 0x58, 0xcf, 0xf9,\n                                                         0xa2, 0xcf, 0x1, 0xb, 0xa0, 0x76, 0xf8, 0x65,\n                                                         0xc8, 0x4e, 0xd4, 0x12, 0xb, 0xae, 0xfb, 0x4e,\n                                                         0x76, 0xfa, 0x40, 0x77, 0x1, 0xb, 0xc4, 0x6,\n                                                         0x77, 0x2d, 0x60, 0x80, 0x7a, 0x87, 0xb, 0x15,\n                                                         0xea, 0x6, 0xa1, 0xf0, 0x4d, 0xa, 0xb, 0xf7,\n                                                         0x84, 0xd4, 0x1, 0xbe, 0xf7, 0x84, 0x15, 0xb,\n                                                         0xf8, 0xac, 0x8d, 0x76, 0xa8, 0x76, 0xd2, 0xc1,\n                                                         0xb, 0x6, 0xa3, 0x90, 0x96, 0x9c, 0xb, 0xf6,\n                                                         0x4c, 0xa, 0xb, 0xf4, 0xef, 0xf8, 0x9d, 0xef,\n                                                         0xb, 0x6, 0x7d, 0x87, 0x85, 0x72, 0xb, 0x6,\n                                                         0x9c, 0xdf, 0x5, 0xb, 0x6, 0x9d, 0xdc, 0x5,\n                                                         0xb, 0xf8, 0x74, 0x78, 0xdc, 0xb, 0xf7, 0x21,\n                                                         0x5, 0xb, 0x15, 0xe6, 0x6, 0xb, 0xf7, 0x1f,\n                                                         0x5, 0xb\n                                                        };\n"
  },
  {
    "path": "core/src/fxge/fontdata/chromefontdata/FoxitSansMM.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nconst unsigned char g_FoxitSansMMFontData [66919] = {\n    0x80, 0x01, 0xD2, 0x29, 0x00, 0x00, 0x25, 0x21, 0x50, 0x53, 0x2D, 0x41, 0x64, 0x6F, 0x62, 0x65,\n    0x46, 0x6F, 0x6E, 0x74, 0x2D, 0x31, 0x2E, 0x30, 0x3A, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x53,\n    0x61, 0x6E, 0x73, 0x4D, 0x4D, 0x20, 0x30, 0x30, 0x31, 0x2E, 0x30, 0x30, 0x30, 0x0D, 0x25, 0x25,\n    0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x61, 0x74, 0x65, 0x3A, 0x20, 0x46, 0x72,\n    0x69, 0x20, 0x53, 0x65, 0x70, 0x20, 0x32, 0x39, 0x20, 0x31, 0x36, 0x3A, 0x30, 0x32, 0x3A, 0x35,\n    0x33, 0x20, 0x32, 0x30, 0x30, 0x36, 0x0D, 0x25, 0x25, 0x56, 0x4D, 0x75, 0x73, 0x61, 0x67, 0x65,\n    0x3A, 0x20, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x20, 0x31, 0x35, 0x30, 0x30, 0x30, 0x30, 0x0D,\n    0x31, 0x37, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D, 0x2F, 0x46,\n    0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x20, 0x31, 0x34, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20,\n    0x64, 0x75, 0x70, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D, 0x2F, 0x76, 0x65, 0x72, 0x73, 0x69,\n    0x6F, 0x6E, 0x20, 0x28, 0x30, 0x30, 0x31, 0x2E, 0x30, 0x30, 0x30, 0x29, 0x20, 0x72, 0x65, 0x61,\n    0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x4E, 0x6F, 0x74, 0x69, 0x63,\n    0x65, 0x20, 0x28, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n    0x20, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65,\n    0x66, 0x0D, 0x2F, 0x46, 0x75, 0x6C, 0x6C, 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x28, 0x43, 0x68, 0x72,\n    0x6f, 0x6d, 0x65, 0x20, 0x53, 0x61, 0x6E, 0x73, 0x20, 0x4D, 0x4D, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64,\n    0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x61, 0x6D, 0x69, 0x6C, 0x79,\n    0x4E, 0x61, 0x6D, 0x65, 0x20, 0x28, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x20, 0x53, 0x61, 0x6E, 0x73,\n    0x20, 0x4D, 0x4D, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65,\n    0x66, 0x0D, 0x2F, 0x49, 0x74, 0x61, 0x6C, 0x69, 0x63, 0x41, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x30,\n    0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x69, 0x73, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, 0x69, 0x74,\n    0x63, 0x68, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x55, 0x6E,\n    0x64, 0x65, 0x72, 0x6C, 0x69, 0x6E, 0x65, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x20,\n    0x2D, 0x31, 0x30, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x55, 0x6E, 0x64, 0x65, 0x72, 0x6C,\n    0x69, 0x6E, 0x65, 0x54, 0x68, 0x69, 0x63, 0x6B, 0x6E, 0x65, 0x73, 0x73, 0x20, 0x35, 0x30, 0x20,\n    0x64, 0x65, 0x66, 0x0D, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x41, 0x6C, 0x6C,\n    0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F,\n    0x42, 0x6C, 0x65, 0x6E, 0x64, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x50, 0x6F, 0x73, 0x69, 0x74,\n    0x69, 0x6F, 0x6E, 0x73, 0x20, 0x5B, 0x5B, 0x30, 0x20, 0x30, 0x20, 0x5D, 0x5B, 0x31, 0x20, 0x30,\n    0x20, 0x5D, 0x5B, 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5B, 0x31, 0x20, 0x31, 0x20, 0x5D, 0x5D, 0x20,\n    0x64, 0x65, 0x66, 0x0D, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E,\n    0x4D, 0x61, 0x70, 0x20, 0x5B, 0x5B, 0x5B, 0x35, 0x30, 0x20, 0x30, 0x20, 0x5D, 0x5B, 0x31, 0x34,\n    0x35, 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5D, 0x5B, 0x5B, 0x35, 0x30, 0x20, 0x30, 0x20, 0x5D, 0x5B,\n    0x31, 0x34, 0x35, 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5D, 0x5D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F,\n    0x42, 0x6C, 0x65, 0x6E, 0x64, 0x41, 0x78, 0x69, 0x73, 0x54, 0x79, 0x70, 0x65, 0x73, 0x20, 0x5B,\n    0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x2F, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x5D,\n    0x20, 0x64, 0x65, 0x66, 0x0D, 0x65, 0x6E, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C,\n    0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x56, 0x65, 0x63,\n    0x74, 0x6F, 0x72, 0x20, 0x5B, 0x30, 0x2E, 0x33, 0x31, 0x35, 0x38, 0x20, 0x30, 0x2E, 0x31, 0x33,\n    0x34, 0x39, 0x20, 0x30, 0x2E, 0x33, 0x38, 0x34, 0x39, 0x20, 0x30, 0x2E, 0x31, 0x36, 0x34, 0x34,\n    0x20, 0x5D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x4E, 0x61, 0x6D, 0x65,\n    0x20, 0x2F, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x53, 0x61, 0x6E, 0x73, 0x4D, 0x4D, 0x20, 0x64, 0x65,\n    0x66, 0x0D, 0x2F, 0x45, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x32, 0x35, 0x36, 0x20,\n    0x61, 0x72, 0x72, 0x61, 0x79, 0x0D, 0x30, 0x20, 0x31, 0x20, 0x32, 0x35, 0x35, 0x20, 0x7B, 0x31,\n    0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x2E, 0x6E, 0x6F,\n    0x74, 0x64, 0x65, 0x66, 0x20, 0x70, 0x75, 0x74, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x33, 0x32, 0x20, 0x2F, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x70, 0x75, 0x74,\n    0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x33, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x6C, 0x61, 0x6D, 0x20,\n    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x34, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74,\n    0x65, 0x64, 0x62, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x35, 0x20,\n    0x2F, 0x6E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x33, 0x36, 0x20, 0x2F, 0x64, 0x6F, 0x6C, 0x6C, 0x61, 0x72, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x37, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x63, 0x65,\n    0x6E, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x38, 0x20, 0x2F, 0x61,\n    0x6D, 0x70, 0x65, 0x72, 0x73, 0x61, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,\n    0x20, 0x33, 0x39, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x65,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x30, 0x20, 0x2F, 0x70, 0x61, 0x72,\n    0x65, 0x6E, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34,\n    0x31, 0x20, 0x2F, 0x70, 0x61, 0x72, 0x65, 0x6E, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75,\n    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x32, 0x20, 0x2F, 0x61, 0x73, 0x74, 0x65, 0x72, 0x69,\n    0x73, 0x6B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x33, 0x20, 0x2F, 0x70,\n    0x6C, 0x75, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x34, 0x20, 0x2F,\n    0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x35,\n    0x20, 0x2F, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,\n    0x20, 0x34, 0x36, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x69, 0x6F, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x34, 0x37, 0x20, 0x2F, 0x73, 0x6C, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75,\n    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x38, 0x20, 0x2F, 0x7A, 0x65, 0x72, 0x6F, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x39, 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x30, 0x20, 0x2F, 0x74, 0x77, 0x6F, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x31, 0x20, 0x2F, 0x74, 0x68, 0x72, 0x65, 0x65,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x32, 0x20, 0x2F, 0x66, 0x6F, 0x75,\n    0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x33, 0x20, 0x2F, 0x66, 0x69,\n    0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x34, 0x20, 0x2F, 0x73,\n    0x69, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x35, 0x20, 0x2F, 0x73,\n    0x65, 0x76, 0x65, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x36, 0x20,\n    0x2F, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35,\n    0x37, 0x20, 0x2F, 0x6E, 0x69, 0x6E, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x35, 0x38, 0x20, 0x2F, 0x63, 0x6F, 0x6C, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x35, 0x39, 0x20, 0x2F, 0x73, 0x65, 0x6D, 0x69, 0x63, 0x6F, 0x6C, 0x6F, 0x6E, 0x20,\n    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x30, 0x20, 0x2F, 0x6C, 0x65, 0x73, 0x73,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x31, 0x20, 0x2F, 0x65, 0x71, 0x75,\n    0x61, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x32, 0x20, 0x2F, 0x67,\n    0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36,\n    0x33, 0x20, 0x2F, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x36, 0x34, 0x20, 0x2F, 0x61, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x36, 0x35, 0x20, 0x2F, 0x41, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,\n    0x20, 0x36, 0x36, 0x20, 0x2F, 0x42, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36,\n    0x37, 0x20, 0x2F, 0x43, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x38, 0x20,\n    0x2F, 0x44, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x39, 0x20, 0x2F, 0x45,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x30, 0x20, 0x2F, 0x46, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x31, 0x20, 0x2F, 0x47, 0x20, 0x70, 0x75, 0x74,\n    0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x32, 0x20, 0x2F, 0x48, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x37, 0x33, 0x20, 0x2F, 0x49, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,\n    0x20, 0x37, 0x34, 0x20, 0x2F, 0x4A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37,\n    0x35, 0x20, 0x2F, 0x4B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x36, 0x20,\n    0x2F, 0x4C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x37, 0x20, 0x2F, 0x4D,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x38, 0x20, 0x2F, 0x4E, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x39, 0x20, 0x2F, 0x4F, 0x20, 0x70, 0x75, 0x74,\n    0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x30, 0x20, 0x2F, 0x50, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x38, 0x31, 0x20, 0x2F, 0x51, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,\n    0x20, 0x38, 0x32, 0x20, 0x2F, 0x52, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38,\n    0x33, 0x20, 0x2F, 0x53, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x34, 0x20,\n    0x2F, 0x54, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x35, 0x20, 0x2F, 0x55,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x36, 0x20, 0x2F, 0x56, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x37, 0x20, 0x2F, 0x57, 0x20, 0x70, 0x75, 0x74,\n    0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x38, 0x20, 0x2F, 0x58, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x38, 0x39, 0x20, 0x2F, 0x59, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,\n    0x20, 0x39, 0x30, 0x20, 0x2F, 0x5A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39,\n    0x31, 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x32, 0x20, 0x2F, 0x62, 0x61, 0x63, 0x6B, 0x73,\n    0x6C, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x33, 0x20,\n    0x2F, 0x62, 0x72, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75,\n    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x34, 0x20, 0x2F, 0x61, 0x73, 0x63, 0x69, 0x69, 0x63,\n    0x69, 0x72, 0x63, 0x75, 0x6D, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x35,\n    0x20, 0x2F, 0x75, 0x6E, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6F, 0x72, 0x65, 0x20, 0x70, 0x75, 0x74,\n    0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x36, 0x20, 0x2F, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x37, 0x20, 0x2F, 0x61, 0x20, 0x70, 0x75, 0x74,\n    0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x38, 0x20, 0x2F, 0x62, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x39, 0x39, 0x20, 0x2F, 0x63, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,\n    0x20, 0x31, 0x30, 0x30, 0x20, 0x2F, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x31, 0x30, 0x31, 0x20, 0x2F, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,\n    0x30, 0x32, 0x20, 0x2F, 0x66, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30,\n    0x33, 0x20, 0x2F, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x34,\n    0x20, 0x2F, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x35, 0x20,\n    0x2F, 0x69, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x36, 0x20, 0x2F,\n    0x6A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x37, 0x20, 0x2F, 0x6B,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x38, 0x20, 0x2F, 0x6C, 0x20,\n    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x39, 0x20, 0x2F, 0x6D, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x30, 0x20, 0x2F, 0x6E, 0x20, 0x70, 0x75,\n    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x31, 0x20, 0x2F, 0x6F, 0x20, 0x70, 0x75, 0x74,\n    0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x32, 0x20, 0x2F, 0x70, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x33, 0x20, 0x2F, 0x71, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x31, 0x31, 0x34, 0x20, 0x2F, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x31, 0x31, 0x35, 0x20, 0x2F, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,\n    0x20, 0x31, 0x31, 0x36, 0x20, 0x2F, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x31, 0x31, 0x37, 0x20, 0x2F, 0x75, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,\n    0x31, 0x38, 0x20, 0x2F, 0x76, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31,\n    0x39, 0x20, 0x2F, 0x77, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x30,\n    0x20, 0x2F, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x31, 0x20,\n    0x2F, 0x79, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x32, 0x20, 0x2F,\n    0x7A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x33, 0x20, 0x2F, 0x62,\n    0x72, 0x61, 0x63, 0x65, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,\n    0x20, 0x31, 0x32, 0x34, 0x20, 0x2F, 0x62, 0x61, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x31, 0x32, 0x35, 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x65, 0x72, 0x69, 0x67, 0x68,\n    0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x36, 0x20, 0x2F, 0x61,\n    0x73, 0x63, 0x69, 0x69, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x31, 0x32, 0x38, 0x20, 0x2F, 0x45, 0x75, 0x72, 0x6F, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x30, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x73, 0x69,\n    0x6E, 0x67, 0x6C, 0x62, 0x61, 0x73, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x31, 0x33, 0x31, 0x20, 0x2F, 0x66, 0x6C, 0x6F, 0x72, 0x69, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x32, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x64, 0x62,\n    0x6C, 0x62, 0x61, 0x73, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33,\n    0x33, 0x20, 0x2F, 0x65, 0x6C, 0x6C, 0x69, 0x70, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x34, 0x20, 0x2F, 0x64, 0x61, 0x67, 0x67, 0x65, 0x72, 0x20,\n    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x35, 0x20, 0x2F, 0x64, 0x61, 0x67,\n    0x67, 0x65, 0x72, 0x64, 0x62, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,\n    0x33, 0x36, 0x20, 0x2F, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x37, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x74,\n    0x68, 0x6F, 0x75, 0x73, 0x61, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x31, 0x33, 0x38, 0x20, 0x2F, 0x53, 0x63, 0x61, 0x72, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x39, 0x20, 0x2F, 0x67, 0x75, 0x69, 0x6C, 0x73, 0x69, 0x6E,\n    0x67, 0x6C, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,\n    0x34, 0x30, 0x20, 0x2F, 0x4F, 0x45, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,\n    0x34, 0x35, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75,\n    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x36, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65,\n    0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34,\n    0x37, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x64, 0x62, 0x6C, 0x6C, 0x65, 0x66, 0x74, 0x20,\n    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x38, 0x20, 0x2F, 0x71, 0x75, 0x6F,\n    0x74, 0x65, 0x64, 0x62, 0x6C, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x31, 0x34, 0x39, 0x20, 0x2F, 0x62, 0x75, 0x6C, 0x6C, 0x65, 0x74, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x30, 0x20, 0x2F, 0x65, 0x6E, 0x64, 0x61,\n    0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x31, 0x20, 0x2F,\n    0x65, 0x6D, 0x64, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,\n    0x35, 0x32, 0x20, 0x2F, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x31, 0x35, 0x33, 0x20, 0x2F, 0x74, 0x72, 0x61, 0x64, 0x65, 0x6D, 0x61, 0x72, 0x6B,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x34, 0x20, 0x2F, 0x73, 0x63,\n    0x61, 0x72, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x35,\n    0x20, 0x2F, 0x67, 0x75, 0x69, 0x6C, 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x72, 0x69, 0x67, 0x68, 0x74,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x36, 0x20, 0x2F, 0x6F, 0x65,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x39, 0x20, 0x2F, 0x59, 0x64,\n    0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x31, 0x36, 0x31, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x6C, 0x61, 0x6D, 0x64, 0x6F, 0x77, 0x6E, 0x20,\n    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x32, 0x20, 0x2F, 0x63, 0x65, 0x6E,\n    0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x33, 0x20, 0x2F, 0x73,\n    0x74, 0x65, 0x72, 0x6C, 0x69, 0x6E, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x31, 0x36, 0x34, 0x20, 0x2F, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x63, 0x79, 0x20, 0x70, 0x75,\n    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x35, 0x20, 0x2F, 0x79, 0x65, 0x6E, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x36, 0x20, 0x2F, 0x62, 0x72, 0x6F, 0x6B,\n    0x65, 0x6E, 0x62, 0x61, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36,\n    0x37, 0x20, 0x2F, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x31, 0x36, 0x38, 0x20, 0x2F, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x39, 0x20, 0x2F, 0x63, 0x6F,\n    0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x31, 0x37, 0x30, 0x20, 0x2F, 0x6F, 0x72, 0x64, 0x66, 0x65, 0x6D, 0x69, 0x6E, 0x69, 0x6E, 0x65,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x31, 0x20, 0x2F, 0x67, 0x75,\n    0x69, 0x6C, 0x6C, 0x65, 0x6D, 0x6F, 0x74, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x32, 0x20, 0x2F, 0x6C, 0x6F, 0x67, 0x69, 0x63, 0x61, 0x6C,\n    0x6E, 0x6F, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x34, 0x20,\n    0x2F, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x35, 0x20, 0x2F, 0x6D, 0x61, 0x63, 0x72, 0x6F, 0x6E, 0x20,\n    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x36, 0x20, 0x2F, 0x64, 0x65, 0x67,\n    0x72, 0x65, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x37, 0x20,\n    0x2F, 0x70, 0x6C, 0x75, 0x73, 0x6D, 0x69, 0x6E, 0x75, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x31, 0x37, 0x38, 0x20, 0x2F, 0x74, 0x77, 0x6F, 0x73, 0x75, 0x70, 0x65, 0x72,\n    0x69, 0x6F, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x39, 0x20,\n    0x2F, 0x74, 0x68, 0x72, 0x65, 0x65, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69, 0x6F, 0x72, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x30, 0x20, 0x2F, 0x61, 0x63, 0x75, 0x74,\n    0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x31, 0x20, 0x2F, 0x6D,\n    0x75, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x32, 0x20, 0x2F, 0x70,\n    0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,\n    0x20, 0x31, 0x38, 0x33, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x69, 0x6F, 0x64, 0x63, 0x65, 0x6E, 0x74,\n    0x65, 0x72, 0x65, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x34,\n    0x20, 0x2F, 0x63, 0x65, 0x64, 0x69, 0x6C, 0x6C, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x31, 0x38, 0x35, 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69,\n    0x6F, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x36, 0x20, 0x2F,\n    0x6F, 0x72, 0x64, 0x6D, 0x61, 0x73, 0x63, 0x75, 0x6C, 0x69, 0x6E, 0x65, 0x20, 0x70, 0x75, 0x74,\n    0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x37, 0x20, 0x2F, 0x67, 0x75, 0x69, 0x6C, 0x6C, 0x65,\n    0x6D, 0x6F, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,\n    0x20, 0x31, 0x38, 0x38, 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, 0x72,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x39, 0x20, 0x2F, 0x6F, 0x6E,\n    0x65, 0x68, 0x61, 0x6C, 0x66, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39,\n    0x30, 0x20, 0x2F, 0x74, 0x68, 0x72, 0x65, 0x65, 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, 0x72, 0x73,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x31, 0x20, 0x2F, 0x71, 0x75,\n    0x65, 0x73, 0x74, 0x69, 0x6F, 0x6E, 0x64, 0x6F, 0x77, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x31, 0x39, 0x32, 0x20, 0x2F, 0x41, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x33, 0x20, 0x2F, 0x41, 0x61, 0x63, 0x75,\n    0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x34, 0x20, 0x2F,\n    0x41, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x35, 0x20, 0x2F, 0x41, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20,\n    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x36, 0x20, 0x2F, 0x41, 0x64, 0x69,\n    0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,\n    0x39, 0x37, 0x20, 0x2F, 0x41, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x31, 0x39, 0x38, 0x20, 0x2F, 0x41, 0x45, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x31, 0x39, 0x39, 0x20, 0x2F, 0x43, 0x63, 0x65, 0x64, 0x69, 0x6C, 0x6C, 0x61, 0x20,\n    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x30, 0x20, 0x2F, 0x45, 0x67, 0x72,\n    0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x31, 0x20,\n    0x2F, 0x45, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x32, 0x30, 0x32, 0x20, 0x2F, 0x45, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x33, 0x20, 0x2F, 0x45, 0x64,\n    0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x32, 0x30, 0x34, 0x20, 0x2F, 0x49, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x35, 0x20, 0x2F, 0x49, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20,\n    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x36, 0x20, 0x2F, 0x49, 0x63, 0x69,\n    0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,\n    0x20, 0x32, 0x30, 0x37, 0x20, 0x2F, 0x49, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20,\n    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x38, 0x20, 0x2F, 0x45, 0x74, 0x68,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x39, 0x20, 0x2F, 0x4E, 0x74,\n    0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x30,\n    0x20, 0x2F, 0x4F, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,\n    0x20, 0x32, 0x31, 0x31, 0x20, 0x2F, 0x4F, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74,\n    0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x32, 0x20, 0x2F, 0x4F, 0x63, 0x69, 0x72, 0x63, 0x75,\n    0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31,\n    0x33, 0x20, 0x2F, 0x4F, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x32, 0x31, 0x34, 0x20, 0x2F, 0x4F, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x35, 0x20, 0x2F, 0x6D, 0x75,\n    0x6C, 0x74, 0x69, 0x70, 0x6C, 0x79, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,\n    0x31, 0x36, 0x20, 0x2F, 0x4F, 0x73, 0x6C, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x32, 0x31, 0x37, 0x20, 0x2F, 0x55, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x38, 0x20, 0x2F, 0x55, 0x61, 0x63, 0x75,\n    0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x39, 0x20, 0x2F,\n    0x55, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x30, 0x20, 0x2F, 0x55, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73,\n    0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x31, 0x20, 0x2F,\n    0x59, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,\n    0x32, 0x32, 0x20, 0x2F, 0x54, 0x68, 0x6F, 0x72, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x32, 0x32, 0x33, 0x20, 0x2F, 0x67, 0x65, 0x72, 0x6D, 0x61, 0x6E, 0x64, 0x62, 0x6C,\n    0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x34, 0x20, 0x2F, 0x61,\n    0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32,\n    0x35, 0x20, 0x2F, 0x61, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x32, 0x32, 0x36, 0x20, 0x2F, 0x61, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C,\n    0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x37, 0x20, 0x2F,\n    0x61, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,\n    0x32, 0x38, 0x20, 0x2F, 0x61, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75,\n    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x39, 0x20, 0x2F, 0x61, 0x72, 0x69, 0x6E, 0x67,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x30, 0x20, 0x2F, 0x61, 0x65,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x31, 0x20, 0x2F, 0x63, 0x63,\n    0x65, 0x64, 0x69, 0x6C, 0x6C, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,\n    0x33, 0x32, 0x20, 0x2F, 0x65, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x32, 0x33, 0x33, 0x20, 0x2F, 0x65, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x34, 0x20, 0x2F, 0x65, 0x63, 0x69, 0x72,\n    0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x32, 0x33, 0x35, 0x20, 0x2F, 0x65, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x36, 0x20, 0x2F, 0x69, 0x67, 0x72, 0x61,\n    0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x37, 0x20, 0x2F,\n    0x69, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,\n    0x33, 0x38, 0x20, 0x2F, 0x69, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20,\n    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x39, 0x20, 0x2F, 0x69, 0x64, 0x69,\n    0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,\n    0x34, 0x30, 0x20, 0x2F, 0x65, 0x74, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x32, 0x34, 0x31, 0x20, 0x2F, 0x6E, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x32, 0x20, 0x2F, 0x6F, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20,\n    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x33, 0x20, 0x2F, 0x6F, 0x61, 0x63,\n    0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x34, 0x20,\n    0x2F, 0x6F, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74,\n    0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x35, 0x20, 0x2F, 0x6F, 0x74, 0x69, 0x6C, 0x64, 0x65,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x36, 0x20, 0x2F, 0x6F, 0x64,\n    0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x32, 0x34, 0x37, 0x20, 0x2F, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x38, 0x20, 0x2F, 0x6F, 0x73, 0x6C, 0x61, 0x73, 0x68, 0x20,\n    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x39, 0x20, 0x2F, 0x75, 0x67, 0x72,\n    0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x30, 0x20,\n    0x2F, 0x75, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x32, 0x35, 0x31, 0x20, 0x2F, 0x75, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x32, 0x20, 0x2F, 0x75, 0x64,\n    0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x32, 0x35, 0x33, 0x20, 0x2F, 0x79, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x34, 0x20, 0x2F, 0x74, 0x68, 0x6F, 0x72, 0x6E, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x35, 0x20, 0x2F, 0x79, 0x64, 0x69, 0x65,\n    0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E,\n    0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x50, 0x61, 0x69, 0x6E, 0x74, 0x54, 0x79, 0x70,\n    0x65, 0x20, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x54, 0x79, 0x70,\n    0x65, 0x20, 0x31, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x24, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x20,\n    0x7B, 0x20, 0x30, 0x2E, 0x31, 0x33, 0x34, 0x39, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x65, 0x78, 0x63,\n    0x68, 0x20, 0x30, 0x2E, 0x33, 0x38, 0x34, 0x39, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x61, 0x64, 0x64,\n    0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x30, 0x2E, 0x31, 0x36, 0x34, 0x34, 0x20, 0x6D, 0x75, 0x6C,\n    0x20, 0x61, 0x64, 0x64, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20,\n    0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20,\n    0x5B, 0x20, 0x30, 0x2E, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x20, 0x30, 0x20, 0x30, 0x20,\n    0x30, 0x2E, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x20, 0x30, 0x20, 0x30, 0x20, 0x5D, 0x20,\n    0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F,\n    0x6E, 0x74, 0x42, 0x42, 0x6F, 0x78, 0x20, 0x7B, 0x2D, 0x31, 0x31, 0x39, 0x20, 0x2D, 0x32, 0x35,\n    0x37, 0x20, 0x31, 0x31, 0x35, 0x30, 0x20, 0x38, 0x37, 0x32, 0x7D, 0x20, 0x72, 0x65, 0x61, 0x64,\n    0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x20,\n    0x33, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E,\n    0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x42, 0x42, 0x6F, 0x78, 0x20, 0x7B, 0x7B, 0x20, 0x2D, 0x35,\n    0x35, 0x20, 0x2D, 0x31, 0x31, 0x32, 0x20, 0x2D, 0x31, 0x36, 0x32, 0x20, 0x2D, 0x31, 0x34, 0x35,\n    0x20, 0x7D, 0x20, 0x7B, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x2D,\n    0x32, 0x35, 0x37, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x34, 0x32, 0x34,\n    0x20, 0x31, 0x31, 0x35, 0x36, 0x20, 0x31, 0x33, 0x38, 0x39, 0x20, 0x31, 0x39, 0x38, 0x31, 0x20,\n    0x7D, 0x20, 0x7B, 0x20, 0x38, 0x37, 0x32, 0x20, 0x38, 0x37, 0x32, 0x20, 0x38, 0x37, 0x32, 0x20,\n    0x38, 0x37, 0x32, 0x20, 0x7D, 0x7D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x50, 0x72, 0x69, 0x76,\n    0x61, 0x74, 0x65, 0x20, 0x31, 0x34, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x64, 0x65, 0x66, 0x0D,\n    0x65, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x25, 0x20, 0x43, 0x6F, 0x70, 0x79, 0x72, 0x69,\n    0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x31, 0x39, 0x39, 0x30, 0x2D, 0x31, 0x39, 0x39,\n    0x34, 0x20, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x73, 0x20,\n    0x49, 0x6E, 0x63, 0x6F, 0x72, 0x70, 0x6F, 0x72, 0x61, 0x74, 0x65, 0x64, 0x0D, 0x25, 0x20, 0x41,\n    0x6C, 0x6C, 0x20, 0x52, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76,\n    0x65, 0x64, 0x2E, 0x0D, 0x2F, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x64, 0x69, 0x63, 0x74, 0x20,\n    0x77, 0x68, 0x65, 0x72, 0x65, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x63, 0x75, 0x72, 0x72,\n    0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x73, 0x65, 0x74, 0x73,\n    0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x73, 0x65, 0x74,\n    0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x64, 0x69, 0x63,\n    0x74, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x75, 0x73, 0x65, 0x72, 0x64, 0x69,\n    0x63, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x64, 0x75, 0x70, 0x0D,\n    0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74,\n    0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C,\n    0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x67, 0x65, 0x74, 0x20, 0x64, 0x75,\n    0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x2F, 0x6F, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6F, 0x72,\n    0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61,\n    0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x30, 0x20, 0x67, 0x65, 0x74, 0x20, 0x64, 0x75,\n    0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x2F, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x74,\n    0x79, 0x70, 0x65, 0x20, 0x6E, 0x65, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C,\n    0x73, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x31, 0x31, 0x20, 0x6C, 0x74, 0x20, 0x7D, 0x20, 0x69,\n    0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D,\n    0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65,\n    0x0D, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66,\n    0x6F, 0x6E, 0x74, 0x20, 0x7B, 0x0D, 0x31, 0x31, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x32, 0x20, 0x63,\n    0x6F, 0x70, 0x79, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,\n    0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x67, 0x65,\n    0x74, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65, 0x71, 0x0D, 0x7B, 0x20, 0x64, 0x75,\n    0x70, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D,\n    0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x61, 0x62,\n    0x73, 0x20, 0x2E, 0x30, 0x30, 0x31, 0x20, 0x67, 0x74, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x74, 0x72,\n    0x75, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7B, 0x20, 0x2F, 0x6D,\n    0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x63,\n    0x76, 0x78, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x2F, 0x72, 0x61,\n    0x6E, 0x67, 0x65, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65,\n    0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x75, 0x70, 0x20,\n    0x64, 0x75, 0x70, 0x20, 0x6D, 0x61, 0x78, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x64, 0x69,\n    0x63, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x0D, 0x66, 0x61, 0x6C, 0x73, 0x65,\n    0x20, 0x7B, 0x20, 0x2F, 0x46, 0x49, 0x44, 0x20, 0x2F, 0x55, 0x6E, 0x69, 0x71, 0x75, 0x65, 0x49,\n    0x44, 0x20, 0x2F, 0x58, 0x55, 0x49, 0x44, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x33, 0x20, 0x69, 0x6E,\n    0x64, 0x65, 0x78, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61,\n    0x6C, 0x6C, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B,\n    0x20, 0x64, 0x65, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20,\n    0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x2F, 0x58, 0x55, 0x49, 0x44, 0x20, 0x32, 0x20, 0x63,\n    0x6F, 0x70, 0x79, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x7B, 0x0D, 0x67, 0x65, 0x74, 0x20,\n    0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64,\n    0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x75, 0x62, 0x20, 0x64, 0x75,\n    0x70, 0x20, 0x30, 0x20, 0x67, 0x74, 0x20, 0x7B, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x75,\n    0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x63,\n    0x6F, 0x70, 0x79, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,\n    0x20, 0x7B, 0x20, 0x36, 0x35, 0x35, 0x33, 0x36, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x63, 0x76, 0x69,\n    0x20, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x70, 0x75, 0x74, 0x20, 0x70, 0x6F, 0x70, 0x20,\n    0x31, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x20, 0x70,\n    0x6F, 0x70, 0x20, 0x2F, 0x58, 0x55, 0x49, 0x44, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x65,\n    0x66, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20,\n    0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70,\n    0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7B, 0x20, 0x2F, 0x50,\n    0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66, 0x6F,\n    0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x64, 0x75,\n    0x70, 0x20, 0x6D, 0x61, 0x78, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x64, 0x69, 0x63, 0x74,\n    0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x0D, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7B,\n    0x20, 0x2F, 0x55, 0x6E, 0x69, 0x71, 0x75, 0x65, 0x49, 0x44, 0x20, 0x2F, 0x58, 0x55, 0x49, 0x44,\n    0x20, 0x7D, 0x20, 0x7B, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x71, 0x20,\n    0x6F, 0x72, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x7B, 0x20, 0x70, 0x6F,\n    0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x65, 0x66, 0x20, 0x7D, 0x20,\n    0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x20,\n    0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x6E, 0x64, 0x20,\n    0x64, 0x65, 0x66, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x64, 0x75, 0x70,\n    0x20, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x65,\n    0x78, 0x63, 0x68, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x24, 0x42, 0x6C,\n    0x65, 0x6E, 0x64, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x5B, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20,\n    0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C,\n    0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x2D, 0x31, 0x20, 0x31,\n    0x20, 0x7B, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C,\n    0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x33, 0x20, 0x2D, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20,\n    0x73, 0x75, 0x62, 0x20, 0x67, 0x65, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x65, 0x71,\n    0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x7B,\n    0x20, 0x2F, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x31, 0x20,\n    0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x2F, 0x70, 0x6F, 0x70, 0x20, 0x6C,\n    0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x7D, 0x20, 0x7B,\n    0x20, 0x64, 0x75, 0x70, 0x20, 0x31, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20,\n    0x7D, 0x0D, 0x7B, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x7B, 0x20, 0x2F, 0x65,\n    0x78, 0x63, 0x68, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x34, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C,\n    0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20,\n    0x2F, 0x6D, 0x75, 0x6C, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F,\n    0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x31, 0x20, 0x69, 0x6E,\n    0x64, 0x65, 0x78, 0x20, 0x7B, 0x20, 0x2F, 0x61, 0x64, 0x64, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20,\n    0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x65, 0x78,\n    0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68,\n    0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x0D,\n    0x70, 0x6F, 0x70, 0x20, 0x7B, 0x20, 0x2F, 0x61, 0x64, 0x64, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20,\n    0x7D, 0x20, 0x69, 0x66, 0x0D, 0x5D, 0x20, 0x63, 0x76, 0x78, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x7B,\n    0x20, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65,\n    0x78, 0x63, 0x68, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x6E, 0x65, 0x20, 0x7B, 0x20,\n    0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74,\n    0x20, 0x63, 0x76, 0x78, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x2F,\n    0x74, 0x79, 0x70, 0x65, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78,\n    0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x30, 0x20, 0x30, 0x20, 0x31, 0x20, 0x33, 0x20,\n    0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73,\n    0x75, 0x62, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,\n    0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33,\n    0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20,\n    0x6D, 0x75, 0x6C, 0x20, 0x61, 0x64, 0x64, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x0D, 0x65, 0x78,\n    0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20,\n    0x7D, 0x0D, 0x7B, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64,\n    0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79, 0x70,\n    0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x70, 0x61, 0x63, 0x6B, 0x65,\n    0x64, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72,\n    0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x2F,\n    0x46, 0x6F, 0x72, 0x63, 0x65, 0x42, 0x6F, 0x6C, 0x64, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x35,\n    0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x30, 0x20, 0x30, 0x20, 0x31, 0x20, 0x33, 0x20, 0x69,\n    0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75,\n    0x62, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20,\n    0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x7B, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64,\n    0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x61, 0x64, 0x64, 0x20,\n    0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65,\n    0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20,\n    0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,\n    0x20, 0x2F, 0x46, 0x6F, 0x72, 0x63, 0x65, 0x42, 0x6F, 0x6C, 0x64, 0x54, 0x68, 0x72, 0x65, 0x73,\n    0x68, 0x6F, 0x6C, 0x64, 0x20, 0x67, 0x65, 0x74, 0x20, 0x67, 0x74, 0x20, 0x33, 0x20, 0x63, 0x6F,\n    0x70, 0x79, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x7B, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20,\n    0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x6E,\n    0x65, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20,\n    0x7B, 0x0D, 0x74, 0x72, 0x75, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x74, 0x79,\n    0x70, 0x65, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x74,\n    0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x72, 0x65, 0x61,\n    0x6C, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6F, 0x72,\n    0x20, 0x61, 0x6E, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x7D, 0x20,\n    0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x0D, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20,\n    0x38, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x65, 0x78, 0x65,\n    0x63, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x35, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20,\n    0x35, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x0D, 0x7B,\n    0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68,\n    0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x78,\n    0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x7B, 0x20, 0x63, 0x76, 0x78, 0x20, 0x7D, 0x20, 0x69, 0x66,\n    0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75,\n    0x62, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x31, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,\n    0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78,\n    0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20,\n    0x64, 0x75, 0x70, 0x20, 0x2F, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65,\n    0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x64, 0x61, 0x72,\n    0x72, 0x61, 0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7B, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x36, 0x20, 0x69,\n    0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7B, 0x0D, 0x39, 0x20, 0x69, 0x6E,\n    0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x39, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,\n    0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20,\n    0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,\n    0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x7D, 0x20, 0x69,\n    0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x0D, 0x31, 0x20, 0x69,\n    0x6E, 0x64, 0x65, 0x78, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x53, 0x74, 0x65, 0x6D, 0x53, 0x6E,\n    0x61, 0x70, 0x48, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x53, 0x74, 0x65,\n    0x6D, 0x53, 0x6E, 0x61, 0x70, 0x56, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20,\n    0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x6C, 0x65, 0x20, 0x7B, 0x20, 0x65, 0x78, 0x69,\n    0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x31,\n    0x20, 0x73, 0x75, 0x62, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63,\n    0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64,\n    0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x32, 0x20, 0x63, 0x6F,\n    0x70, 0x79, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x32, 0x20, 0x69, 0x6E,\n    0x64, 0x65, 0x78, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x30, 0x20, 0x70, 0x75,\n    0x74, 0x20, 0x30, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x6C, 0x65, 0x20, 0x7B, 0x20, 0x31, 0x20,\n    0x73, 0x75, 0x62, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20,\n    0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78,\n    0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33, 0x20, 0x69, 0x6E,\n    0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x0D, 0x33, 0x20, 0x69,\n    0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65,\n    0x78, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x75, 0x74,\n    0x0D, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x70, 0x75, 0x74, 0x20, 0x70, 0x6F, 0x70, 0x0D,\n    0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6C, 0x65, 0x6E, 0x67,\n    0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6C, 0x74, 0x20, 0x7B, 0x20, 0x31, 0x20,\n    0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73,\n    0x65, 0x20, 0x7D, 0x20, 0x6C, 0x6F, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x64, 0x75, 0x70,\n    0x20, 0x30, 0x20, 0x67, 0x65, 0x74, 0x20, 0x30, 0x20, 0x6C, 0x65, 0x20, 0x7B, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x30, 0x20, 0x67, 0x74, 0x20,\n    0x7B, 0x20, 0x65, 0x78, 0x69, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x31, 0x20, 0x61, 0x64,\n    0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,\n    0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65, 0x78,\n    0x63, 0x68, 0x20, 0x73, 0x75, 0x62, 0x20, 0x67, 0x65, 0x74, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x76,\n    0x61, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69,\n    0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x70, 0x75, 0x74, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x2F, 0x64,\n    0x69, 0x63, 0x74, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x20, 0x36, 0x20, 0x63,\n    0x6F, 0x70, 0x79, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x67, 0x65, 0x74,\n    0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78,\n    0x65, 0x63, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E,\n    0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x63, 0x76, 0x78, 0x20, 0x65, 0x72, 0x72, 0x6F,\n    0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x2F, 0x74, 0x79, 0x70, 0x65, 0x63, 0x68, 0x65, 0x63, 0x6B,\n    0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C,\n    0x73, 0x65, 0x0D, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x70, 0x6F, 0x70, 0x20,\n    0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x20, 0x70, 0x6F, 0x70,\n    0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x0D, 0x63,\n    0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x42, 0x6C, 0x65, 0x6E, 0x64,\n    0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x63, 0x75,\n    0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x6E, 0x64, 0x0D, 0x7D, 0x20,\n    0x62, 0x69, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x2F, 0x24, 0x66, 0x62, 0x66, 0x20, 0x7B,\n    0x20, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x63,\n    0x6F, 0x75, 0x6E, 0x74, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x33, 0x20, 0x61, 0x64, 0x64,\n    0x20, 0x2D, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x7B,\n    0x0D, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x70, 0x6F, 0x70,\n    0x20, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x5D, 0x20,\n    0x65, 0x78, 0x63, 0x68, 0x20, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x65, 0x78,\n    0x63, 0x68, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F,\n    0x6E, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x45, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67,\n    0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x2F, 0x45, 0x6E,\n    0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x67, 0x65, 0x74, 0x20, 0x70, 0x75, 0x74, 0x20, 0x64,\n    0x65, 0x66, 0x69, 0x6E, 0x65, 0x66, 0x6F, 0x6E, 0x74, 0x0D, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C,\n    0x73, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x2F,\n    0x53, 0x63, 0x61, 0x6C, 0x65, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x67, 0x65, 0x74, 0x20,\n    0x6D, 0x61, 0x6B, 0x65, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73, 0x65, 0x74, 0x66, 0x6F, 0x6E, 0x74,\n    0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x20, 0x7D, 0x20, 0x7B, 0x20,\n    0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65,\n    0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x2F, 0x4E, 0x6F, 0x72, 0x6D, 0x61, 0x6C, 0x69, 0x7A, 0x65,\n    0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x65,\n    0x78, 0x63, 0x68, 0x20, 0x35, 0x30, 0x20, 0x73, 0x75, 0x62, 0x20, 0x31, 0x34, 0x30, 0x30, 0x20,\n    0x64, 0x69, 0x76, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x35, 0x30, 0x20, 0x73, 0x75, 0x62, 0x20,\n    0x31, 0x34, 0x30, 0x30, 0x20, 0x64, 0x69, 0x76, 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20,\n    0x64, 0x65, 0x66, 0x0D, 0x2F, 0x43, 0x6F, 0x6E, 0x76, 0x65, 0x72, 0x74, 0x44, 0x65, 0x73, 0x69,\n    0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x31, 0x20, 0x32, 0x20, 0x69,\n    0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x31, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64,\n    0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72,\n    0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x31, 0x20, 0x32, 0x20,\n    0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33, 0x20,\n    0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,\n    0x20, 0x73, 0x75, 0x62, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6D, 0x75, 0x6C,\n    0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65,\n    0x78, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33, 0x20,\n    0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D,\n    0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x24, 0x6D, 0x6D, 0x66, 0x66,\n    0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x77, 0x68,\n    0x65, 0x72, 0x65, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x73, 0x61, 0x76, 0x65, 0x20, 0x7B,\n    0x20, 0x72, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70,\n    0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x7B,\n    0x20, 0x64, 0x65, 0x66, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D,\n    0x2F, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65,\n    0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20,\n    0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x2F,\n    0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x70,\n    0x6F, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x64, 0x69, 0x63,\n    0x74, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x7B, 0x20, 0x63, 0x75, 0x72,\n    0x72, 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D,\n    0x20, 0x7D, 0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61,\n    0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x73, 0x65, 0x74, 0x73,\n    0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65,\n    0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x64, 0x69, 0x63, 0x74, 0x0D, 0x7D, 0x20, 0x7B, 0x20,\n    0x7B, 0x20, 0x7D, 0x20, 0x75, 0x73, 0x65, 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x7D, 0x20, 0x69,\n    0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D, 0x7D, 0x20, 0x7B, 0x20,\n    0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64,\n    0x69, 0x63, 0x74, 0x20, 0x73, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x66,\n    0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7B, 0x0D,\n    0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20,\n    0x7B, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x73, 0x65, 0x74,\n    0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x73,\n    0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65,\n    0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66,\n    0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x2F, 0x24,\n    0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E,\n    0x74, 0x20, 0x2F, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x6C, 0x6F, 0x61, 0x64,\n    0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x2F, 0x66,\n    0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x46, 0x6F,\n    0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68,\n    0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x46, 0x6F, 0x6E,\n    0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,\n    0x67, 0x65, 0x74, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x67, 0x65,\n    0x74, 0x20, 0x33, 0x20, 0x6E, 0x65, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x53,\n    0x68, 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F,\n    0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x0D, 0x7B, 0x20,\n    0x64, 0x75, 0x70, 0x20, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69,\n    0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74,\n    0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x67, 0x65, 0x74, 0x20, 0x33,\n    0x20, 0x6E, 0x65, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20,\n    0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D,\n    0x7B, 0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64,\n    0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70,\n    0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x63,\n    0x76, 0x73, 0x20, 0x28, 0x5F, 0x29, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x7B, 0x0D,\n    0x63, 0x76, 0x6E, 0x20, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x46, 0x6F, 0x6E, 0x74,\n    0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6B,\n    0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64,\n    0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78,\n    0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x74, 0x72,\n    0x75, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74,\n    0x68, 0x20, 0x37, 0x20, 0x61, 0x64, 0x64, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x64,\n    0x75, 0x70, 0x20, 0x30, 0x20, 0x28, 0x25, 0x66, 0x6F, 0x6E, 0x74, 0x25, 0x29, 0x20, 0x70, 0x75,\n    0x74, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x20,\n    0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x36, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x75, 0x70,\n    0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x63,\n    0x76, 0x73, 0x20, 0x70, 0x75, 0x74, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, 0x0D, 0x7B,\n    0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x7D, 0x20, 0x73, 0x74, 0x6F, 0x70, 0x70, 0x65,\n    0x64, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20,\n    0x69, 0x66, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70,\n    0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x66, 0x61,\n    0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69,\n    0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7B, 0x0D, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72,\n    0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E,\n    0x20, 0x70, 0x6F, 0x70, 0x0D, 0x5B, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x28, 0x5F,\n    0x29, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x63, 0x76, 0x72,\n    0x20, 0x7D, 0x20, 0x73, 0x74, 0x6F, 0x70, 0x70, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70,\n    0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F,\n    0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D,\n    0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x69, 0x74, 0x20, 0x7D, 0x20, 0x69,\n    0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x6C, 0x6F, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C,\n    0x73, 0x65, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x20, 0x77, 0x68, 0x65,\n    0x72, 0x65, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x46, 0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66,\n    0x6F, 0x20, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x41, 0x78, 0x69, 0x73, 0x54, 0x79, 0x70, 0x65,\n    0x73, 0x20, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x7B,\n    0x0D, 0x67, 0x65, 0x74, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x63, 0x6F, 0x75, 0x6E,\n    0x74, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x32, 0x20, 0x73, 0x75, 0x62, 0x20, 0x65, 0x71,\n    0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F,\n    0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D,\n    0x20, 0x69, 0x66, 0x20, 0x7B, 0x0D, 0x4E, 0x6F, 0x72, 0x6D, 0x61, 0x6C, 0x69, 0x7A, 0x65, 0x44,\n    0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x0D, 0x43, 0x6F, 0x6E, 0x76,\n    0x65, 0x72, 0x74, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x0D,\n    0x5D, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x78,\n    0x63, 0x68, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F,\n    0x6E, 0x74, 0x0D, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F,\n    0x46, 0x6F, 0x6E, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x75,\n    0x74, 0x0D, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x7B,\n    0x20, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x24, 0x6D, 0x6D,\n    0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20,\n    0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x65, 0x6E, 0x64, 0x0D, 0x7D, 0x20, 0x7B,\n    0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x24, 0x6D, 0x6D,\n    0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20,\n    0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70,\n    0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66,\n    0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69,\n    0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x33, 0x20, 0x69,\n    0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x2F, 0x53, 0x68, 0x61, 0x72, 0x65,\n    0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x64,\n    0x75, 0x70, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70,\n    0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x30, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x33, 0x20,\n    0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65,\n    0x6C, 0x73, 0x65, 0x0D, 0x65, 0x6E, 0x64, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x70, 0x6F, 0x70,\n    0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63,\n    0x74, 0x20, 0x65, 0x6E, 0x64, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x66, 0x69, 0x6C,\n    0x65, 0x20, 0x65, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x80, 0x02, 0x6D, 0xD9, 0x00, 0x00, 0xE8, 0xDC,\n    0x61, 0x72, 0x80, 0x71, 0xAB, 0xD4, 0xD5, 0xBC, 0xD2, 0x30, 0xC4, 0xE1, 0x86, 0xDC, 0xE0, 0x96,\n    0x54, 0x1C, 0x9C, 0x1F, 0x2E, 0x58, 0x69, 0x40, 0x4E, 0x33, 0xF9, 0xCE, 0xFF, 0x7D, 0x2F, 0xBF,\n    0xEF, 0x5F, 0x26, 0xC7, 0xE1, 0x84, 0x89, 0x54, 0xC7, 0x07, 0x55, 0x24, 0x4E, 0x73, 0x41, 0xB8,\n    0x26, 0x97, 0xE2, 0xE8, 0xEA, 0x9C, 0xE9, 0x13, 0x1D, 0x00, 0x55, 0x78, 0xAB, 0x3D, 0xE1, 0x9F,\n    0xA9, 0xF2, 0xFA, 0xFF, 0x3B, 0xEB, 0x53, 0x17, 0x4A, 0x8E, 0x2F, 0x33, 0xE9, 0xDB, 0xE0, 0x38,\n    0x63, 0x42, 0xF4, 0x0E, 0x5D, 0xF2, 0x5B, 0x7A, 0x88, 0x22, 0xEE, 0x2B, 0x6C, 0xDC, 0xAC, 0x58,\n    0xA9, 0x8F, 0x9B, 0x04, 0x71, 0x44, 0xE3, 0xF6, 0xE7, 0x4A, 0xB6, 0x0C, 0x00, 0xE4, 0x42, 0xE8,\n    0x30, 0xB1, 0x30, 0x30, 0x8A, 0x3F, 0x0E, 0xDF, 0x2C, 0xE6, 0x62, 0x35, 0xF9, 0x21, 0x6D, 0x42,\n    0x0F, 0x23, 0xAC, 0xED, 0xEC, 0x60, 0xA8, 0x8A, 0x73, 0x77, 0x14, 0x62, 0xE1, 0xB2, 0x04, 0x04,\n    0x29, 0x5D, 0x49, 0xBA, 0x8A, 0x8B, 0xCB, 0xF2, 0x04, 0x2A, 0x8D, 0xEB, 0x9A, 0x65, 0xBA, 0xF1,\n    0xC8, 0x24, 0x2F, 0x7E, 0x90, 0xD9, 0x49, 0x63, 0x23, 0x73, 0xF8, 0x43, 0x8F, 0xC1, 0xE7, 0x37,\n    0x37, 0x0B, 0x91, 0x15, 0x08, 0x9D, 0xA7, 0x90, 0xA8, 0x28, 0x50, 0xB6, 0x91, 0xE6, 0xE9, 0xE2,\n    0x79, 0x11, 0x12, 0x36, 0xFF, 0xD7, 0xC7, 0x69, 0xE2, 0x5A, 0x86, 0xDA, 0xFA, 0x47, 0x58, 0x69,\n    0x73, 0xB5, 0x49, 0xF3, 0xB4, 0x9B, 0x15, 0x16, 0x9C, 0x35, 0xF5, 0xDD, 0x2F, 0xD1, 0x4A, 0x95,\n    0x2A, 0x95, 0x04, 0x43, 0x8B, 0xF2, 0x75, 0x99, 0xA4, 0x90, 0xA6, 0xA1, 0x0A, 0x87, 0x35, 0x71,\n    0xEB, 0x17, 0x1A, 0x46, 0x59, 0x3E, 0xC6, 0xF8, 0x99, 0xF7, 0x60, 0x2C, 0x66, 0x27, 0x4A, 0x48,\n    0x63, 0x35, 0xAD, 0xC1, 0xDF, 0x19, 0x26, 0x81, 0x68, 0x9C, 0x17, 0xD4, 0x71, 0x79, 0xEF, 0x5B,\n    0xE3, 0xB5, 0xBE, 0xA9, 0xE5, 0xD2, 0x6C, 0xA2, 0x64, 0x0A, 0x14, 0x44, 0xFE, 0x73, 0x6B, 0x69,\n    0xEF, 0x3D, 0xF3, 0x0A, 0x79, 0x68, 0x5B, 0x61, 0x86, 0xAE, 0x9B, 0x42, 0x80, 0x6E, 0xBF, 0x24,\n    0x85, 0xA9, 0x87, 0x98, 0x59, 0xBB, 0x30, 0x36, 0x38, 0x81, 0x2A, 0x82, 0xB6, 0x05, 0x19, 0x94,\n    0x0A, 0x88, 0x24, 0x8A, 0x57, 0x0C, 0x51, 0x58, 0xE4, 0xAE, 0x1B, 0xE4, 0xDF, 0xD3, 0x2F, 0x92,\n    0xBE, 0xB5, 0xDB, 0x51, 0x5E, 0xA2, 0xC4, 0x58, 0xF0, 0x64, 0xF7, 0x57, 0xFB, 0x61, 0x3E, 0xAA,\n    0x46, 0xE6, 0x33, 0x46, 0x6E, 0x45, 0x4D, 0x33, 0x17, 0x66, 0xE7, 0xD7, 0xCE, 0x92, 0xF0, 0xF6,\n    0xB2, 0xFB, 0x62, 0x7B, 0xAD, 0x7C, 0x68, 0x0A, 0x8E, 0x14, 0x8F, 0xB7, 0x48, 0x3D, 0x84, 0xEF,\n    0x49, 0xDC, 0x52, 0xE3, 0xAA, 0x04, 0xC9, 0xF3, 0x0B, 0x21, 0x41, 0x96, 0x4D, 0x36, 0xC3, 0x3D,\n    0x54, 0xE8, 0x82, 0x69, 0xFF, 0xB1, 0xA8, 0xE3, 0x8A, 0x39, 0xDC, 0xC8, 0x14, 0x0A, 0x49, 0xAC,\n    0x96, 0x33, 0x1E, 0x09, 0xE8, 0x62, 0x64, 0x57, 0x82, 0x68, 0x46, 0xAB, 0xE0, 0xBB, 0xCF, 0xCF,\n    0x8F, 0xCF, 0x9E, 0x08, 0xB0, 0xAD, 0x98, 0x71, 0x33, 0x08, 0xE4, 0x5C, 0xCC, 0x7F, 0x17, 0x09,\n    0x98, 0x65, 0xEE, 0xED, 0x93, 0x84, 0xC9, 0xFD, 0x46, 0x57, 0xB4, 0xF1, 0x98, 0x3A, 0xB5, 0xC2,\n    0x7F, 0xF8, 0xFB, 0x60, 0x78, 0xD7, 0x47, 0xD7, 0x63, 0x58, 0x51, 0xE9, 0xDC, 0xF1, 0x0E, 0xB8,\n    0x59, 0x3B, 0x72, 0x81, 0x31, 0xAF, 0xC8, 0x5B, 0x35, 0x47, 0xF1, 0xBC, 0xCD, 0xED, 0x45, 0xF1,\n    0xFC, 0x6D, 0xFF, 0x2E, 0xAA, 0x6C, 0xC2, 0x65, 0x5F, 0x8F, 0x8F, 0x95, 0x20, 0xBA, 0xCA, 0xF9,\n    0x68, 0xA5, 0x47, 0x7F, 0xCC, 0xD0, 0xA6, 0x3B, 0xAE, 0xA2, 0xE5, 0x11, 0x0D, 0x4E, 0x20, 0x44,\n    0x6B, 0x64, 0xDB, 0x75, 0x68, 0x9D, 0xA4, 0xEC, 0xB2, 0x1D, 0xDF, 0x66, 0xC5, 0x89, 0x4F, 0x94,\n    0x0B, 0x06, 0xD9, 0x11, 0x9C, 0x83, 0x3F, 0x55, 0x21, 0xA0, 0x65, 0x2E, 0x6D, 0x39, 0x6F, 0xCA,\n    0x08, 0xDE, 0x60, 0x7F, 0x47, 0xE8, 0x9D, 0xC2, 0x9E, 0x5F, 0x81, 0x9C, 0xAA, 0xB7, 0x46, 0x0A,\n    0xAC, 0xA0, 0xFD, 0x22, 0x59, 0xE6, 0xCB, 0x78, 0xF6, 0x37, 0x7A, 0xD8, 0x6C, 0x8D, 0x61, 0xF1,\n    0x10, 0xE9, 0x60, 0x74, 0x4C, 0x43, 0xB0, 0x4B, 0x3C, 0x0A, 0x77, 0x6A, 0xF3, 0xF5, 0xAE, 0x16,\n    0x1C, 0xBB, 0x75, 0xDB, 0x81, 0x97, 0xA2, 0xDA, 0x6A, 0x8C, 0xE4, 0xBA, 0xB4, 0xBE, 0x6C, 0xAD,\n    0x24, 0x18, 0x37, 0x3F, 0x05, 0x8A, 0x96, 0x9C, 0x75, 0xD0, 0x97, 0xC5, 0x3B, 0xDB, 0x23, 0xBF,\n    0x62, 0x76, 0xC8, 0xD3, 0xFD, 0x09, 0x57, 0xD7, 0x8B, 0x85, 0x1B, 0x9F, 0x65, 0x79, 0x83, 0x16,\n    0x10, 0x92, 0xE4, 0x10, 0xB3, 0x65, 0xED, 0x7B, 0x42, 0x3B, 0xC6, 0x05, 0x03, 0xF7, 0xFE, 0xEE,\n    0x4B, 0x1E, 0x87, 0x05, 0x65, 0x4E, 0x00, 0xE2, 0x30, 0x67, 0x0A, 0xDB, 0xAB, 0x57, 0x04, 0xB6,\n    0x19, 0x39, 0x24, 0xFA, 0x7F, 0xB8, 0xD9, 0x08, 0x64, 0x38, 0xFA, 0x16, 0xE1, 0xF2, 0x19, 0xB2,\n    0x12, 0xBB, 0x5F, 0xDB, 0xEE, 0x81, 0xDA, 0x96, 0x41, 0x88, 0xE0, 0x9B, 0x41, 0x27, 0x2C, 0x9B,\n    0xB8, 0x27, 0x41, 0x72, 0xC1, 0xE5, 0xD9, 0xE7, 0x8D, 0x1F, 0x94, 0xF9, 0xCD, 0x0F, 0x68, 0x0D,\n    0xD3, 0x24, 0x6B, 0xBB, 0xD5, 0x65, 0x71, 0x8B, 0xE9, 0x10, 0x4F, 0xED, 0x59, 0xCD, 0xEF, 0x1D,\n    0x0E, 0xA7, 0x70, 0xB5, 0x1C, 0x62, 0xE5, 0x05, 0x88, 0x0C, 0xF3, 0x26, 0x5D, 0xD8, 0x78, 0xA1,\n    0xF9, 0x79, 0x06, 0x9C, 0x7A, 0x5A, 0xEA, 0x30, 0xCA, 0x16, 0x0F, 0x4E, 0xBE, 0x5F, 0x97, 0x58,\n    0xAA, 0x3F, 0x9B, 0xB0, 0x32, 0xBE, 0xC8, 0x2C, 0x32, 0x70, 0xA1, 0xC3, 0xD9, 0x4A, 0xEB, 0x00,\n    0xAF, 0xB2, 0x4E, 0x57, 0x7A, 0x2E, 0xE9, 0x68, 0xBD, 0x27, 0x09, 0x91, 0xD6, 0xDC, 0xB5, 0x01,\n    0x5C, 0x6D, 0x1F, 0x98, 0x7C, 0x2E, 0x73, 0x41, 0x8A, 0x09, 0x1D, 0x00, 0xE6, 0x5A, 0x9C, 0x4A,\n    0x6C, 0xEF, 0x59, 0x75, 0x30, 0x70, 0x4C, 0xCF, 0xF1, 0x7F, 0x7B, 0x3F, 0xFA, 0x01, 0x0F, 0xED,\n    0x29, 0x31, 0x5A, 0x5E, 0x62, 0x0D, 0x37, 0x52, 0xAB, 0x92, 0x04, 0x28, 0xA6, 0xA8, 0x88, 0x63,\n    0x24, 0x0A, 0x38, 0x7F, 0x32, 0xCF, 0xC5, 0xC6, 0xC0, 0x7C, 0x00, 0x77, 0x6C, 0x4F, 0x36, 0x82,\n    0xEF, 0x69, 0xF0, 0xEB, 0xCC, 0x8C, 0x6D, 0x08, 0xFF, 0xCB, 0x03, 0x29, 0x8B, 0xEF, 0x0F, 0x45,\n    0x81, 0xA3, 0xDF, 0x22, 0xEE, 0xB4, 0x72, 0x53, 0x20, 0xDC, 0x19, 0x6F, 0x21, 0xEA, 0xF1, 0xF1,\n    0x51, 0x98, 0x3C, 0xA8, 0x48, 0x2E, 0x4C, 0xF9, 0xEB, 0x10, 0x71, 0xFA, 0xF8, 0x87, 0x64, 0xE1,\n    0xBB, 0xAD, 0xD8, 0x12, 0xE2, 0x8A, 0x1E, 0xFE, 0x48, 0x1C, 0x0C, 0xA6, 0x3D, 0xBD, 0x33, 0x54,\n    0x8E, 0xD9, 0x88, 0x53, 0x55, 0x0D, 0x55, 0x62, 0x4F, 0x2D, 0x36, 0xE6, 0xDF, 0x7C, 0x0F, 0xAE,\n    0x0E, 0x78, 0x11, 0xA3, 0x70, 0x65, 0x41, 0xE8, 0x91, 0x36, 0xEE, 0xB6, 0xDD, 0xAB, 0xBA, 0x1F,\n    0x0D, 0x06, 0x48, 0x1F, 0xE0, 0x4C, 0x12, 0xF6, 0xD2, 0x37, 0xC0, 0xBD, 0x5D, 0x34, 0x25, 0xE2,\n    0xAB, 0x93, 0x4B, 0xD6, 0x17, 0x7B, 0x95, 0xD9, 0x2B, 0xFE, 0x60, 0xB0, 0x32, 0xCD, 0x5F, 0x0F,\n    0x0B, 0x81, 0x58, 0xBC, 0x95, 0x9C, 0x4B, 0x81, 0xBF, 0xD2, 0xA0, 0x64, 0xDB, 0xE8, 0xE0, 0x6A,\n    0x49, 0xFB, 0xC4, 0x99, 0x59, 0x2F, 0x2B, 0xED, 0x21, 0x8D, 0xD7, 0xA7, 0x56, 0x04, 0x67, 0xC6,\n    0x0C, 0x89, 0x58, 0x12, 0x5A, 0x5C, 0x27, 0x62, 0x79, 0x0C, 0x5E, 0xC3, 0xCC, 0x99, 0x5A, 0xCF,\n    0x71, 0x99, 0x75, 0x2E, 0xBA, 0x1C, 0x28, 0xAA, 0x64, 0x62, 0x17, 0xF9, 0xCD, 0x38, 0x1A, 0x0B,\n    0xE3, 0xF7, 0xF7, 0x98, 0x4F, 0x0D, 0xB5, 0xF0, 0x03, 0x37, 0x68, 0x5F, 0x3D, 0xE8, 0x13, 0x01,\n    0xE2, 0x36, 0xF9, 0xB6, 0x25, 0x41, 0xDE, 0x4C, 0x53, 0xD2, 0xD5, 0xB1, 0xA1, 0x77, 0x1B, 0x9D,\n    0x3A, 0x67, 0x93, 0xCB, 0x00, 0xB9, 0xA0, 0x50, 0x56, 0x00, 0xFF, 0xA6, 0xCC, 0x17, 0x5A, 0x4A,\n    0x5C, 0x98, 0xFA, 0x98, 0x1E, 0x12, 0x60, 0x50, 0x4B, 0xA9, 0x91, 0x7E, 0x25, 0x9C, 0x30, 0x91,\n    0xA9, 0x39, 0x22, 0xC3, 0xF8, 0x6D, 0xDC, 0xC7, 0xE7, 0x09, 0x4A, 0x56, 0xCA, 0xD8, 0x3B, 0x4F,\n    0x4D, 0x2F, 0xC2, 0x2B, 0x93, 0x32, 0xE5, 0x47, 0xEC, 0x14, 0x03, 0xC8, 0xB7, 0xE2, 0xA0, 0x84,\n    0xF7, 0x99, 0x51, 0x86, 0x68, 0x08, 0x98, 0x02, 0x41, 0x29, 0x07, 0x56, 0x55, 0xE6, 0x6C, 0x74,\n    0xC5, 0x61, 0x7B, 0xDB, 0x33, 0x01, 0xF8, 0xF0, 0xA9, 0x18, 0xFE, 0xC5, 0x35, 0x8C, 0xB2, 0x80,\n    0xDA, 0xD0, 0x84, 0x8A, 0xFC, 0x4C, 0x3C, 0x3A, 0x1F, 0x71, 0xF4, 0x46, 0x63, 0x60, 0x13, 0xF4,\n    0x1D, 0x82, 0xD7, 0xB0, 0x48, 0x4F, 0x2E, 0x79, 0xF7, 0xEC, 0x06, 0x12, 0x7A, 0xD2, 0x94, 0x74,\n    0x91, 0xC9, 0x68, 0x8A, 0xF0, 0x63, 0xD9, 0x18, 0x3C, 0x8B, 0x54, 0x94, 0x12, 0x4F, 0xFE, 0x9F,\n    0x9D, 0x12, 0xFA, 0xAD, 0xEE, 0xD1, 0xFD, 0x56, 0x31, 0x17, 0x5A, 0xC3, 0x09, 0xC1, 0x35, 0x53,\n    0x41, 0xEF, 0xF9, 0x9B, 0x7E, 0xBE, 0xFC, 0xA8, 0x96, 0x6E, 0x8D, 0xFD, 0xB8, 0x42, 0xC3, 0xA7,\n    0x78, 0xCB, 0xF9, 0x9B, 0xFB, 0x01, 0xCB, 0x9F, 0xA4, 0xA2, 0x0C, 0x80, 0xB7, 0x4D, 0x01, 0x50,\n    0x2F, 0xD3, 0xC1, 0xD5, 0x4B, 0x01, 0xEE, 0xDF, 0x08, 0x6A, 0xB2, 0xC6, 0x08, 0x49, 0x71, 0x89,\n    0xB3, 0xF0, 0xC1, 0x50, 0x74, 0xAC, 0xFE, 0x7E, 0x82, 0xE7, 0xA6, 0x10, 0xF2, 0x0C, 0x5A, 0xEC,\n    0xC2, 0xE8, 0x55, 0x40, 0xB0, 0x1E, 0x7F, 0x95, 0xF7, 0x39, 0x1C, 0xA7, 0xEC, 0xEB, 0x81, 0xF4,\n    0xCB, 0x82, 0x1D, 0x94, 0x8C, 0xBF, 0xDA, 0xB7, 0x65, 0x51, 0x05, 0x22, 0x92, 0x3C, 0x7A, 0x38,\n    0xB1, 0xBB, 0x14, 0xAF, 0xB1, 0xFF, 0x8A, 0x98, 0x24, 0x1B, 0xE0, 0x51, 0x0B, 0x72, 0xD1, 0x2E,\n    0x97, 0xE0, 0x4D, 0xA2, 0xFF, 0x0F, 0x30, 0xAC, 0x7A, 0xD2, 0x88, 0x6C, 0xB4, 0xCE, 0x67, 0xC2,\n    0xF7, 0x18, 0x91, 0x1E, 0x1C, 0xF4, 0xFA, 0x0D, 0xDC, 0x42, 0x3B, 0xA4, 0xB8, 0x48, 0xF3, 0x98,\n    0x94, 0x5C, 0x57, 0x98, 0xA9, 0x71, 0x14, 0x5B, 0x79, 0xCF, 0x33, 0xAA, 0xE1, 0x19, 0x49, 0xFC,\n    0x2E, 0x66, 0x2C, 0x6C, 0xEB, 0xB8, 0x71, 0x3B, 0x9C, 0x19, 0x14, 0x5C, 0x95, 0xDB, 0x7D, 0x47,\n    0xB8, 0x54, 0x14, 0xC9, 0xA8, 0x38, 0xA3, 0x3A, 0xF8, 0x40, 0xD6, 0x4F, 0x3E, 0x52, 0x48, 0x66,\n    0xED, 0xE9, 0xB8, 0xB7, 0x03, 0x0E, 0x4B, 0x8F, 0x84, 0xDF, 0xA3, 0xE4, 0x7A, 0x97, 0xA6, 0xB8,\n    0x9C, 0x97, 0xBF, 0x70, 0xDA, 0xAC, 0x71, 0x01, 0xAA, 0xDE, 0x0E, 0xFB, 0xFA, 0xF1, 0xCF, 0x0D,\n    0x9C, 0x93, 0xEB, 0xE4, 0xF4, 0xAF, 0xB6, 0x1D, 0x10, 0xB0, 0x0C, 0xDB, 0x80, 0xF2, 0x9A, 0x8C,\n    0xB5, 0x5F, 0x2C, 0xB1, 0x67, 0xE9, 0x3A, 0xD7, 0xE4, 0xCF, 0x20, 0xE7, 0x06, 0x86, 0xFA, 0x23,\n    0x8E, 0xBF, 0x85, 0x45, 0x2A, 0x4B, 0x53, 0x45, 0xF1, 0xA2, 0x6C, 0x2A, 0x4F, 0x4D, 0x67, 0xED,\n    0x78, 0x15, 0x06, 0x43, 0x94, 0x44, 0xFB, 0x1C, 0xD5, 0xDB, 0x88, 0x95, 0xD5, 0x53, 0x90, 0xBD,\n    0xF8, 0x7A, 0xD8, 0xED, 0xE0, 0x3E, 0x86, 0xC9, 0x9D, 0xFC, 0xA7, 0x29, 0x94, 0x82, 0xC3, 0x71,\n    0xB4, 0xE7, 0x77, 0x35, 0x48, 0x7A, 0xA0, 0x79, 0x8A, 0x68, 0x7F, 0xA2, 0xDF, 0xDA, 0x34, 0x4D,\n    0x72, 0xD2, 0xB3, 0x51, 0xA6, 0x64, 0x84, 0xF5, 0x01, 0x74, 0x87, 0x57, 0xA3, 0x3F, 0x25, 0x28,\n    0xAA, 0x88, 0x75, 0xFC, 0xE6, 0x79, 0x62, 0xBF, 0xF8, 0xD7, 0xBE, 0x22, 0x13, 0xD2, 0xAD, 0x08,\n    0x7D, 0x15, 0xF3, 0x9D, 0x74, 0xB6, 0x49, 0x53, 0xE7, 0x4C, 0xE9, 0x57, 0x80, 0x5A, 0x8F, 0x5D,\n    0x75, 0xDE, 0x04, 0x59, 0x0B, 0x8C, 0xC6, 0x1B, 0x7A, 0xFC, 0xF0, 0x42, 0xC2, 0x6A, 0x17, 0x3A,\n    0x19, 0x92, 0x66, 0xE3, 0x04, 0x28, 0x85, 0x02, 0xA3, 0x2F, 0xA8, 0x3D, 0x92, 0x9F, 0xD4, 0xDF,\n    0x24, 0x57, 0xF9, 0x61, 0x10, 0xD6, 0x6B, 0x32, 0x5F, 0x7F, 0xC6, 0xDD, 0x58, 0x4D, 0x83, 0xF9,\n    0x27, 0x0E, 0xF9, 0x6D, 0x4F, 0x30, 0x32, 0x12, 0x5A, 0xC5, 0xEA, 0x83, 0x35, 0x14, 0x23, 0x58,\n    0x66, 0x79, 0x5B, 0x44, 0x44, 0x9E, 0xBE, 0xBF, 0x2D, 0x02, 0x76, 0x4A, 0x59, 0x2A, 0x1F, 0xC8,\n    0xF6, 0x84, 0xD1, 0x87, 0x55, 0xE5, 0x3D, 0xF2, 0xCC, 0x63, 0xE0, 0x47, 0x1F, 0x14, 0x00, 0x56,\n    0xF1, 0xF1, 0x7B, 0x45, 0xD2, 0xE6, 0xC9, 0x38, 0x1C, 0xE1, 0x29, 0x3D, 0xF4, 0x1D, 0x2B, 0x3E,\n    0x67, 0x9C, 0x67, 0xE4, 0x82, 0x40, 0x29, 0x55, 0xC4, 0x46, 0xBE, 0x6B, 0xA5, 0x2A, 0xDD, 0xFF,\n    0xCA, 0xD0, 0xC9, 0x05, 0x03, 0xA0, 0x4F, 0x0D, 0xA0, 0xA5, 0x04, 0x26, 0x02, 0x92, 0x16, 0x5C,\n    0x2D, 0x68, 0xDF, 0x06, 0x87, 0x79, 0x71, 0xA3, 0x40, 0xB5, 0xCC, 0x1E, 0x71, 0x3C, 0x7F, 0x16,\n    0xFA, 0xA0, 0xA5, 0x58, 0xD9, 0x53, 0x93, 0x31, 0x03, 0x28, 0x0A, 0x94, 0x41, 0xC1, 0xEE, 0x61,\n    0x47, 0xE0, 0x02, 0x8E, 0x39, 0xEF, 0x6D, 0xA9, 0xD3, 0x00, 0xA0, 0x30, 0x95, 0xF5, 0xFC, 0xBF,\n    0xC7, 0x6B, 0x8A, 0x32, 0x16, 0x9E, 0x50, 0xB0, 0xEF, 0x0C, 0xF3, 0x55, 0x61, 0xD0, 0x21, 0xF7,\n    0x6B, 0xA0, 0xB9, 0xC9, 0x69, 0xE7, 0x85, 0xF8, 0xE7, 0x69, 0xC4, 0xB5, 0x27, 0x01, 0x1B, 0xB1,\n    0xAD, 0x09, 0x5A, 0xD0, 0x40, 0xC0, 0x1C, 0x34, 0x51, 0x23, 0x3F, 0xD2, 0xD4, 0x94, 0xBA, 0x42,\n    0xA8, 0xC9, 0x4B, 0x84, 0x2B, 0x82, 0xDD, 0xDA, 0x22, 0x14, 0xE0, 0x24, 0x53, 0x12, 0xD0, 0x67,\n    0x62, 0xC2, 0x4E, 0xF6, 0x7A, 0xBA, 0xCB, 0xF1, 0xF0, 0xE4, 0x51, 0x2A, 0xA5, 0x48, 0x4C, 0xC6,\n    0xC2, 0x30, 0x00, 0xEC, 0xEE, 0xEB, 0xBC, 0xE9, 0x76, 0x4E, 0x23, 0xB1, 0xCE, 0x05, 0x40, 0x1F,\n    0x2D, 0x0E, 0xEB, 0x84, 0x96, 0x38, 0x16, 0x5B, 0xCF, 0x4D, 0xFB, 0x1A, 0xB4, 0x74, 0x61, 0x7C,\n    0x4D, 0x67, 0x95, 0x79, 0xB5, 0x81, 0x88, 0x32, 0xDA, 0x84, 0x9D, 0xC1, 0x53, 0x21, 0xDD, 0x0A,\n    0xDE, 0x3C, 0xB3, 0xB5, 0xB8, 0x1A, 0xFC, 0x72, 0x7A, 0xB8, 0xEB, 0xC8, 0xF6, 0x7A, 0x00, 0xDD,\n    0x2E, 0x7E, 0x52, 0x06, 0x66, 0x0C, 0xFF, 0x3F, 0x8B, 0x16, 0x4B, 0x1A, 0x9B, 0x3C, 0x17, 0x5B,\n    0xD8, 0xCB, 0xA0, 0xCA, 0xF9, 0x41, 0x36, 0xD6, 0xA6, 0x08, 0x6D, 0xFC, 0xD3, 0x77, 0x14, 0x58,\n    0xF1, 0xB5, 0x3E, 0x54, 0xDB, 0xAC, 0x03, 0xAC, 0x11, 0x5C, 0x4D, 0xC6, 0xB5, 0x03, 0x5A, 0xFF,\n    0x52, 0xA8, 0xDF, 0xDC, 0x39, 0xF3, 0x6A, 0xC8, 0xB4, 0x23, 0x0B, 0x0B, 0x67, 0x1B, 0x02, 0xBA,\n    0x79, 0x03, 0x16, 0xB2, 0xA9, 0xC3, 0xA1, 0x62, 0x6B, 0x96, 0x23, 0x14, 0x6D, 0x8F, 0x94, 0xF1,\n    0xD2, 0xEA, 0x5B, 0x3A, 0x48, 0x79, 0x1E, 0x02, 0xCE, 0xE8, 0xF5, 0x2C, 0x6A, 0xB2, 0x08, 0x62,\n    0xC6, 0x85, 0x09, 0x9E, 0x5A, 0xD0, 0xE5, 0x34, 0x75, 0x81, 0xF5, 0xA7, 0x55, 0x6A, 0x31, 0x6E,\n    0x30, 0x08, 0x1B, 0xF9, 0xF1, 0x5A, 0x33, 0x36, 0x3C, 0x7D, 0xA9, 0xB5, 0x91, 0x80, 0x06, 0x34,\n    0x57, 0xD7, 0xC5, 0xA8, 0x74, 0x0F, 0x01, 0x27, 0x4C, 0x82, 0x98, 0xC6, 0x6B, 0x4F, 0xC5, 0x7F,\n    0xFF, 0xAC, 0x13, 0x4A, 0xDA, 0x73, 0x97, 0xBF, 0xEA, 0xA3, 0xF2, 0xBB, 0xE9, 0x51, 0x7D, 0x7E,\n    0xE6, 0xE9, 0x15, 0x85, 0x1D, 0x72, 0x4A, 0xB8, 0xB7, 0x99, 0x3E, 0x9F, 0x71, 0x8F, 0x18, 0x56,\n    0x9C, 0xBF, 0x45, 0x54, 0xB8, 0x14, 0x5C, 0x39, 0x7B, 0x93, 0xD8, 0x41, 0xA7, 0x00, 0x1B, 0x74,\n    0x47, 0x29, 0x29, 0xB4, 0x42, 0xCF, 0x17, 0x69, 0x43, 0xB2, 0x2E, 0x38, 0x1E, 0x11, 0xA7, 0x97,\n    0x6A, 0xB4, 0xB5, 0xDF, 0x40, 0xE6, 0x75, 0x5B, 0xC0, 0xF0, 0x80, 0xC6, 0xFF, 0x73, 0xD5, 0x45,\n    0x03, 0x04, 0x83, 0x17, 0xF4, 0x62, 0xBE, 0xF6, 0x4D, 0x25, 0x84, 0xD6, 0xB2, 0xE3, 0x34, 0x49,\n    0xDE, 0x3D, 0x67, 0xF8, 0x7A, 0x7F, 0xFB, 0xF9, 0xE5, 0x5E, 0xD1, 0x39, 0x8B, 0x9D, 0xFE, 0x7F,\n    0xE3, 0x0B, 0x8B, 0x48, 0xA0, 0x9E, 0x15, 0x82, 0x57, 0xAF, 0xBA, 0xFE, 0x65, 0xFE, 0x07, 0x7A,\n    0x3B, 0x46, 0xDE, 0x94, 0x7B, 0x69, 0x9C, 0xB0, 0x48, 0x68, 0x14, 0x45, 0xF6, 0x85, 0xBB, 0x95,\n    0x94, 0x5E, 0x2D, 0x6C, 0x38, 0x2C, 0xF8, 0x65, 0x13, 0x88, 0xA7, 0xEA, 0x05, 0xE7, 0x25, 0xAF,\n    0x13, 0xC8, 0x0F, 0xA3, 0xDB, 0x1E, 0x58, 0x28, 0x95, 0xBD, 0x34, 0x50, 0x06, 0xEF, 0xBB, 0xC9,\n    0x93, 0xA3, 0xD4, 0x2D, 0x4F, 0x07, 0x4F, 0x1D, 0xB8, 0xAF, 0x42, 0x59, 0x34, 0x8A, 0x33, 0xB0,\n    0xD5, 0x4E, 0x55, 0x79, 0x0E, 0x53, 0xCD, 0xA4, 0xE0, 0x96, 0x23, 0x8B, 0x1A, 0x04, 0xB0, 0x48,\n    0x82, 0xE8, 0xEC, 0xA8, 0xB8, 0x52, 0xAF, 0xD0, 0xFB, 0xD1, 0xF1, 0xD0, 0x50, 0xFC, 0x7B, 0x27,\n    0x38, 0xFC, 0x7A, 0xDE, 0x83, 0x50, 0x7E, 0xD3, 0xE6, 0xF5, 0x45, 0x76, 0xC5, 0x2D, 0x50, 0xB4,\n    0x69, 0xF5, 0x10, 0x91, 0xBD, 0x18, 0xB1, 0x49, 0xE4, 0x6A, 0x17, 0x45, 0xB1, 0xF1, 0x20, 0xC7,\n    0xE0, 0xC2, 0x02, 0x2D, 0x3C, 0x91, 0x16, 0x26, 0x25, 0xDE, 0x49, 0x88, 0xB3, 0xD7, 0x91, 0x7D,\n    0x21, 0xC1, 0x08, 0xDC, 0xEF, 0x52, 0x15, 0xD8, 0xE5, 0x3B, 0x58, 0xC6, 0xD9, 0x97, 0x0E, 0x7E,\n    0xD8, 0x94, 0x4F, 0xCE, 0xCA, 0xD7, 0xC7, 0x3C, 0xEF, 0xD1, 0x34, 0x3D, 0x78, 0xB6, 0x67, 0xA7,\n    0x6A, 0x13, 0x9D, 0x1E, 0x0A, 0x50, 0x67, 0xA0, 0xBF, 0x88, 0xAA, 0x34, 0xB4, 0xAA, 0x47, 0x71,\n    0x48, 0x78, 0x34, 0x42, 0xC8, 0x13, 0x1A, 0x96, 0x3E, 0x29, 0xF9, 0x9B, 0xD3, 0x87, 0xC0, 0x64,\n    0xD6, 0x5C, 0x76, 0xBF, 0xD4, 0xF2, 0x85, 0xE7, 0xB6, 0x64, 0x68, 0x47, 0x54, 0xE8, 0x1C, 0x3A,\n    0x06, 0x06, 0x83, 0xE6, 0xF2, 0x43, 0x53, 0x2A, 0x8F, 0xFE, 0x8C, 0x04, 0xB0, 0xAB, 0x70, 0xE0,\n    0xC7, 0xE3, 0x72, 0x4E, 0xB8, 0x2E, 0xA5, 0x8F, 0x1E, 0xDB, 0x80, 0xE6, 0x46, 0xDD, 0xE5, 0x55,\n    0xAB, 0xBB, 0x1C, 0xB4, 0x98, 0xD3, 0x79, 0xAF, 0xBE, 0x10, 0x9E, 0xB1, 0x33, 0x47, 0xDE, 0xF3,\n    0x46, 0x10, 0xAB, 0xBB, 0xF1, 0xDD, 0x24, 0x4E, 0x91, 0xBF, 0x6E, 0xDD, 0xE5, 0x88, 0x46, 0xDB,\n    0x44, 0x07, 0x69, 0x38, 0x2A, 0x8D, 0x48, 0xEE, 0xF3, 0xF0, 0xBE, 0xEE, 0xA4, 0x67, 0x07, 0x25,\n    0x4D, 0x39, 0x76, 0x74, 0x17, 0xBB, 0x59, 0xA7, 0x99, 0x49, 0xE7, 0x22, 0x73, 0xCD, 0x83, 0x4E,\n    0xA5, 0xDD, 0x65, 0xB7, 0x36, 0x3D, 0xDF, 0x77, 0xF9, 0xB2, 0x5C, 0xD8, 0xC7, 0x0C, 0xCF, 0x7C,\n    0x33, 0x7E, 0x28, 0x32, 0xDD, 0xAB, 0x5C, 0x27, 0x80, 0x54, 0x4C, 0xCF, 0xF4, 0x92, 0xD5, 0xFC,\n    0x28, 0x15, 0x91, 0x7B, 0x77, 0x28, 0x0E, 0x85, 0x63, 0xE2, 0x38, 0x6C, 0x10, 0xAE, 0x55, 0xB1,\n    0x76, 0x69, 0xCA, 0x0E, 0x1E, 0x86, 0x76, 0x6B, 0x40, 0xC3, 0xA9, 0xD5, 0xDC, 0xB3, 0x2E, 0xBE,\n    0x1F, 0xE9, 0x3A, 0x2C, 0xB8, 0x0B, 0xEC, 0xB4, 0xCA, 0x9E, 0x47, 0xCD, 0x0D, 0x49, 0xC3, 0xB9,\n    0x28, 0xD9, 0xBF, 0xCD, 0xB9, 0xFA, 0x66, 0xC5, 0x89, 0xD3, 0xDF, 0x04, 0xC1, 0x06, 0x31, 0xAF,\n    0xA4, 0xBC, 0xEE, 0xEB, 0x33, 0xF6, 0x2B, 0x8B, 0xCB, 0xC4, 0x51, 0x84, 0x8D, 0x94, 0xFD, 0xDC,\n    0xA8, 0xBC, 0x23, 0xDE, 0x48, 0xF1, 0xE6, 0x20, 0x20, 0x6E, 0x88, 0x6C, 0x69, 0xA0, 0x3D, 0x3B,\n    0x7F, 0xE1, 0x35, 0x16, 0x79, 0x23, 0x8E, 0x23, 0xED, 0x54, 0x7A, 0x1C, 0x90, 0x6C, 0x35, 0xD9,\n    0x31, 0xD6, 0x9B, 0xE6, 0x18, 0x41, 0x07, 0x4C, 0x0A, 0xDC, 0x57, 0x8F, 0xEB, 0x04, 0xA2, 0xB9,\n    0xDD, 0xC1, 0xBD, 0xEF, 0xD2, 0x51, 0x3D, 0x9D, 0x8B, 0x3F, 0xEC, 0x34, 0xF3, 0x0D, 0xB3, 0xAD,\n    0xBC, 0xAD, 0x62, 0xAA, 0x02, 0xF8, 0x7C, 0x21, 0xD9, 0x8F, 0x65, 0x08, 0xA1, 0x0E, 0x5F, 0x5D,\n    0xA5, 0x24, 0x5E, 0xF4, 0x9C, 0x8A, 0x24, 0xA8, 0xF7, 0xF6, 0x0A, 0xAD, 0x28, 0xAE, 0x21, 0x50,\n    0xA2, 0x2B, 0x1B, 0x6C, 0xAF, 0xDC, 0x63, 0xC4, 0x88, 0x54, 0xB6, 0x77, 0xE0, 0xC5, 0x27, 0xD6,\n    0xF3, 0x92, 0xE1, 0x81, 0x19, 0x99, 0x0E, 0x83, 0x3A, 0x17, 0x10, 0xF2, 0xB5, 0x74, 0x95, 0xB2,\n    0x87, 0x98, 0xBC, 0x75, 0xFA, 0x54, 0x2C, 0x8B, 0x26, 0xAD, 0xE9, 0xA7, 0xCA, 0x28, 0x89, 0xB9,\n    0x77, 0x5B, 0xF7, 0xC2, 0x75, 0x42, 0x73, 0x76, 0x83, 0xCA, 0x26, 0xF5, 0xB9, 0x70, 0x23, 0x6F,\n    0x5F, 0x35, 0x91, 0xCE, 0x6A, 0x5D, 0x57, 0xB8, 0xE0, 0x3C, 0x91, 0x6F, 0xC4, 0xB7, 0x30, 0x6F,\n    0xDD, 0xBD, 0xD7, 0x5F, 0x1A, 0xD2, 0xE4, 0xE7, 0x0D, 0x2B, 0x02, 0x2F, 0x61, 0x9E, 0x22, 0x4C,\n    0xFE, 0xBD, 0x1A, 0xDD, 0xE5, 0x67, 0xA2, 0x6F, 0x90, 0x4C, 0x31, 0x5E, 0x6A, 0x9F, 0x8E, 0xE8,\n    0xC1, 0xB2, 0x4E, 0xE4, 0xCA, 0x2B, 0xB8, 0x4A, 0xE8, 0xFF, 0x06, 0x91, 0x76, 0x2E, 0x51, 0x3F,\n    0x1B, 0xA5, 0x2A, 0x1C, 0xEB, 0xD4, 0x07, 0x00, 0x03, 0x40, 0x33, 0x6A, 0xD8, 0xB7, 0x5A, 0xF0,\n    0xF8, 0xF7, 0xCD, 0xCB, 0x3D, 0xB8, 0x98, 0xB4, 0x56, 0xE9, 0x20, 0xCC, 0x45, 0x0F, 0xA3, 0x76,\n    0xB1, 0x2D, 0x41, 0x9A, 0x89, 0x24, 0x7C, 0xAC, 0x62, 0xCC, 0xCF, 0xE5, 0xA1, 0xEB, 0x7E, 0x41,\n    0x64, 0x7D, 0x6D, 0xF1, 0x05, 0xC2, 0x65, 0xE9, 0xF8, 0xE8, 0xDB, 0xA0, 0xB8, 0x1A, 0x87, 0x32,\n    0x9C, 0xF7, 0x48, 0xA4, 0x83, 0x66, 0x12, 0xAC, 0x9D, 0x9D, 0xE4, 0x7B, 0xF4, 0x7A, 0x2B, 0x28,\n    0xB7, 0x12, 0x3B, 0xAC, 0x7D, 0xF4, 0xB6, 0x72, 0x87, 0x4C, 0xFC, 0x5F, 0x75, 0x4C, 0xE5, 0xE1,\n    0x6D, 0x10, 0xF8, 0xD5, 0xA2, 0x3F, 0x04, 0xB2, 0x33, 0x6A, 0x0A, 0x3C, 0x45, 0x95, 0x77, 0x5F,\n    0x20, 0x9E, 0x78, 0x91, 0xEB, 0x72, 0x6B, 0x90, 0x78, 0x9C, 0x5D, 0x47, 0xE4, 0x9A, 0xC5, 0x10,\n    0xB8, 0xE1, 0x1D, 0x5A, 0x7D, 0xF3, 0x55, 0x8F, 0x66, 0x54, 0x1D, 0x97, 0x05, 0x3F, 0xFC, 0xDA,\n    0x29, 0x04, 0x57, 0x3F, 0xD0, 0x52, 0x12, 0x3C, 0xBA, 0xF5, 0x52, 0x02, 0xE6, 0x37, 0x3A, 0xF9,\n    0xAD, 0xB7, 0x2F, 0x81, 0x8D, 0x14, 0xCC, 0x1C, 0x8C, 0x3A, 0x9D, 0x54, 0x5D, 0x75, 0xEC, 0x15,\n    0x29, 0xB4, 0xCE, 0x44, 0xDA, 0x71, 0x8B, 0xD1, 0xB6, 0x77, 0x08, 0x2E, 0x80, 0x43, 0x57, 0xF5,\n    0x94, 0x37, 0xFC, 0x11, 0x1C, 0x75, 0x62, 0xA1, 0x17, 0xB2, 0x5E, 0x54, 0xA6, 0xBD, 0xAF, 0x0B,\n    0xB4, 0x38, 0x77, 0xE8, 0x08, 0xC7, 0x93, 0xDD, 0x96, 0x83, 0x91, 0x1D, 0x4B, 0x5F, 0xE5, 0xB3,\n    0xC8, 0x28, 0xA9, 0x51, 0x5D, 0xCB, 0xCE, 0x6F, 0x7E, 0xCF, 0xBE, 0x4D, 0x5D, 0x46, 0xB0, 0x02,\n    0xFA, 0xAF, 0x6E, 0x0A, 0x5B, 0xA4, 0x6D, 0x35, 0xEB, 0x78, 0x31, 0xB3, 0x36, 0x05, 0xD2, 0x84,\n    0xBD, 0xB7, 0x38, 0x47, 0xCA, 0x47, 0x07, 0xA5, 0x9B, 0x67, 0x45, 0x3E, 0x10, 0x82, 0x05, 0xE7,\n    0x7B, 0x80, 0xA9, 0x55, 0x34, 0x44, 0x6A, 0xC7, 0x84, 0x24, 0x4F, 0xAA, 0xD5, 0x7D, 0x78, 0xF7,\n    0x16, 0x43, 0xC1, 0xD5, 0x20, 0x83, 0xD7, 0xB0, 0x51, 0x14, 0xC6, 0xF4, 0xD5, 0xCB, 0x62, 0xDE,\n    0xE4, 0xAD, 0x47, 0xB5, 0xE5, 0x57, 0xCA, 0x9D, 0x76, 0x10, 0x35, 0xDE, 0x8F, 0xDA, 0x2B, 0x0A,\n    0xF8, 0x65, 0x90, 0xDB, 0xF5, 0x3D, 0x2E, 0xDE, 0x1F, 0xF5, 0x6C, 0xF4, 0x2B, 0x2E, 0x18, 0x1C,\n    0xD5, 0x97, 0xC2, 0xDE, 0xC2, 0xD8, 0xE1, 0x79, 0x43, 0xC8, 0xFC, 0x9A, 0x2A, 0xF3, 0x14, 0x28,\n    0x0E, 0xB6, 0x08, 0xE1, 0xE8, 0xF1, 0x76, 0xB9, 0xA5, 0x57, 0x5C, 0x81, 0x19, 0x27, 0xA5, 0x80,\n    0x16, 0x0A, 0x5E, 0xDC, 0xCC, 0xE1, 0xBD, 0x8B, 0xC5, 0xEC, 0x07, 0xFF, 0x53, 0x3B, 0xB1, 0x1D,\n    0xAD, 0x02, 0xAB, 0xB6, 0x04, 0x7B, 0xA1, 0x2E, 0x3F, 0x07, 0x19, 0xD5, 0x82, 0xDA, 0x77, 0x22,\n    0x80, 0x31, 0x20, 0xDA, 0x83, 0xDB, 0x56, 0x22, 0x88, 0x89, 0x44, 0x53, 0x87, 0x67, 0xAE, 0x30,\n    0x50, 0x4C, 0xD0, 0x90, 0x8B, 0x45, 0x23, 0xCE, 0x41, 0x39, 0x03, 0xDE, 0xE6, 0xD3, 0xFC, 0x28,\n    0x19, 0x3E, 0x0B, 0xD2, 0x2E, 0x96, 0xAC, 0x8D, 0xD0, 0x8E, 0x29, 0x48, 0x58, 0xA2, 0xD4, 0x17,\n    0x65, 0x4B, 0x75, 0x4C, 0x48, 0x43, 0x34, 0x43, 0x3A, 0xDD, 0xCE, 0xC5, 0xF0, 0xF4, 0x6C, 0xB8,\n    0xDD, 0xF3, 0x3E, 0x34, 0x50, 0x2A, 0x8C, 0x6C, 0x90, 0x96, 0x1E, 0x21, 0x61, 0x13, 0x42, 0xA5,\n    0x12, 0x0F, 0x73, 0x02, 0xBA, 0x9E, 0xFF, 0x47, 0x83, 0xDB, 0xE4, 0x16, 0x90, 0xD9, 0x0A, 0x40,\n    0x84, 0xCA, 0xD2, 0x03, 0x05, 0xD8, 0x64, 0xB2, 0x3D, 0x8A, 0x42, 0x02, 0x8C, 0x88, 0xDF, 0xEE,\n    0x5A, 0x47, 0xF1, 0xF4, 0x82, 0x6E, 0x61, 0xD5, 0xF5, 0xA3, 0x58, 0x21, 0x6B, 0xEE, 0x8F, 0xE2,\n    0xEB, 0x07, 0x39, 0xA9, 0x71, 0xFC, 0x55, 0x39, 0x37, 0x4D, 0xD2, 0x41, 0xC5, 0x33, 0xF7, 0xF5,\n    0xED, 0x67, 0xA7, 0x42, 0xAD, 0x61, 0xEC, 0xE2, 0x9D, 0xB9, 0x13, 0x4B, 0xF5, 0x14, 0xB0, 0xE1,\n    0x47, 0x06, 0x2B, 0x65, 0xCD, 0x09, 0x31, 0x46, 0x47, 0xFE, 0x1B, 0xB5, 0xD8, 0x53, 0x04, 0x28,\n    0x5C, 0x3F, 0x46, 0x28, 0xCD, 0xB9, 0x87, 0x9A, 0xB0, 0xE2, 0x49, 0xA6, 0xCF, 0x56, 0x8D, 0x52,\n    0xD5, 0x05, 0xCD, 0x0C, 0x3D, 0x45, 0x11, 0x18, 0x84, 0x38, 0x98, 0xD4, 0xD3, 0x2D, 0xD0, 0x2A,\n    0xAD, 0xF4, 0x7A, 0xAB, 0xBF, 0xF4, 0xA8, 0x9F, 0x7A, 0xB7, 0x73, 0xC0, 0xEC, 0xF5, 0x3E, 0x87,\n    0x9F, 0x12, 0xEF, 0xB8, 0xAC, 0x19, 0x34, 0xB9, 0x72, 0xB9, 0x6B, 0xF3, 0xBB, 0x08, 0x8E, 0x7F,\n    0xEC, 0x24, 0x1A, 0xF4, 0x00, 0xC0, 0xD4, 0x27, 0xB1, 0x3B, 0x05, 0x68, 0xD4, 0x30, 0xD2, 0x21,\n    0x63, 0xD8, 0x33, 0x6C, 0xDC, 0xA9, 0x3E, 0x7C, 0xA4, 0xE0, 0x43, 0xC9, 0x80, 0xA3, 0xCA, 0x35,\n    0x72, 0x10, 0xF1, 0xEA, 0xCD, 0xA2, 0xDB, 0x02, 0x5A, 0xEE, 0x52, 0x5E, 0x31, 0x33, 0x2C, 0x68,\n    0x3A, 0xBE, 0x34, 0x5E, 0xCE, 0xF2, 0x23, 0xE7, 0x4D, 0xCF, 0x71, 0xD4, 0x3E, 0x8C, 0x4E, 0x08,\n    0x82, 0xF5, 0x01, 0xE9, 0xF8, 0x35, 0xFC, 0x88, 0xFE, 0xC1, 0x1E, 0x67, 0x95, 0x44, 0x45, 0xF8,\n    0x67, 0xB8, 0x91, 0xF0, 0x8E, 0x6C, 0xE4, 0x57, 0xA6, 0xDB, 0x56, 0xE3, 0x6C, 0x18, 0x37, 0x0C,\n    0x48, 0x49, 0xB5, 0x7E, 0x51, 0x7A, 0x46, 0x0E, 0xD4, 0x8E, 0x2B, 0x93, 0x63, 0x6B, 0xEC, 0xE5,\n    0x5B, 0x72, 0x49, 0xB2, 0x3D, 0x24, 0xAA, 0x59, 0xAF, 0x1B, 0x0A, 0x82, 0xE8, 0x56, 0xC1, 0x56,\n    0x46, 0x9F, 0xB2, 0x5B, 0x8D, 0x4E, 0x45, 0x34, 0x49, 0xE6, 0xDA, 0xEF, 0x43, 0x53, 0x11, 0x41,\n    0x12, 0x82, 0xB9, 0xA8, 0xCC, 0x95, 0x8E, 0x5F, 0xD3, 0xB9, 0xA0, 0x53, 0xC5, 0x6E, 0x75, 0xC0,\n    0x50, 0xF8, 0xC8, 0xA8, 0x19, 0xEE, 0x17, 0x6F, 0xD0, 0xB1, 0xA6, 0xD3, 0xC5, 0x39, 0x5E, 0x68,\n    0xCA, 0x7D, 0x17, 0x17, 0x46, 0x83, 0xF3, 0x84, 0x05, 0x36, 0xB8, 0xE2, 0xD4, 0x20, 0xC0, 0x86,\n    0xCE, 0xB3, 0xC2, 0x4D, 0xE8, 0xE8, 0x1A, 0x7E, 0x06, 0x1C, 0xE1, 0xA9, 0x55, 0xCB, 0x2A, 0x88,\n    0xC5, 0x5A, 0xE1, 0x15, 0x74, 0x1E, 0x31, 0x0E, 0xCE, 0xA9, 0x7D, 0xA4, 0xCB, 0xF1, 0x7B, 0xCD,\n    0x56, 0x54, 0xF2, 0xDC, 0xD7, 0xE8, 0x59, 0x5C, 0xC1, 0x47, 0x6D, 0xB5, 0x3A, 0xB7, 0x4F, 0x30,\n    0x90, 0x10, 0x7F, 0xD7, 0x16, 0xC2, 0xD5, 0xA2, 0x36, 0x10, 0x1A, 0x71, 0x19, 0x4A, 0x6F, 0xFF,\n    0x5E, 0x4E, 0xC1, 0x2B, 0xC1, 0x96, 0xE4, 0x2A, 0x2A, 0xEB, 0x60, 0x9C, 0x4B, 0x11, 0x97, 0xED,\n    0xEA, 0x6E, 0x83, 0xA3, 0x8B, 0x17, 0xEB, 0x42, 0xC8, 0x18, 0x40, 0x61, 0xB0, 0x26, 0x72, 0xAC,\n    0xA2, 0x49, 0xA4, 0x9C, 0xD1, 0x32, 0x8E, 0xCF, 0x80, 0x71, 0xF1, 0x20, 0x47, 0xA5, 0x28, 0xD4,\n    0xC8, 0x1E, 0xF1, 0xB0, 0xD2, 0x15, 0x21, 0xBF, 0x9C, 0x57, 0x88, 0xED, 0x30, 0x6F, 0x69, 0x3A,\n    0xB4, 0x14, 0x16, 0x98, 0x17, 0xC1, 0xC2, 0x36, 0x16, 0x54, 0x02, 0xB7, 0x42, 0x0C, 0x88, 0x45,\n    0x5E, 0x90, 0x89, 0xD6, 0xE3, 0xDB, 0x0F, 0xF6, 0x07, 0xC8, 0x5B, 0x89, 0x8E, 0x24, 0xA0, 0x9D,\n    0xB7, 0xC6, 0xEC, 0x7E, 0xDB, 0xC1, 0xAC, 0x38, 0xB3, 0x26, 0xD9, 0xFE, 0x8A, 0xC2, 0x76, 0xDD,\n    0x01, 0x41, 0x30, 0x2D, 0x75, 0xDC, 0xE8, 0x60, 0x0B, 0xEF, 0xCC, 0xBA, 0x41, 0x85, 0xFC, 0x34,\n    0x59, 0x4C, 0xA4, 0x13, 0x10, 0x7D, 0xF6, 0xE0, 0x00, 0x14, 0x86, 0x95, 0xF0, 0x00, 0x41, 0xDF,\n    0xBD, 0xB5, 0x00, 0xDB, 0xDC, 0x8F, 0x5B, 0x75, 0xDE, 0x5F, 0x75, 0xFC, 0x11, 0x7A, 0xC0, 0x0D,\n    0xA2, 0xDB, 0xB8, 0x53, 0x59, 0x0B, 0xFE, 0xAF, 0x45, 0xDD, 0xB7, 0x72, 0x87, 0x2C, 0x4B, 0x04,\n    0xCE, 0xC3, 0x37, 0x54, 0x9D, 0x62, 0xC3, 0x6A, 0x4D, 0x71, 0xAB, 0xF4, 0x85, 0xA5, 0x89, 0xD1,\n    0xC9, 0xFB, 0x8C, 0x23, 0x70, 0x36, 0x75, 0x74, 0x5A, 0x6C, 0xD4, 0x50, 0x5C, 0xD0, 0x49, 0xCC,\n    0x9B, 0x27, 0x8C, 0x99, 0xC9, 0x55, 0x9C, 0x48, 0xD1, 0x40, 0x91, 0xD9, 0x1F, 0xA2, 0x4F, 0xBB,\n    0x87, 0x42, 0xA5, 0xDA, 0xC5, 0xCB, 0x13, 0xA4, 0x9C, 0xFB, 0xD1, 0xD7, 0xB9, 0x90, 0xEF, 0xF5,\n    0x03, 0x92, 0xCD, 0x7B, 0xF9, 0x76, 0xF4, 0xF8, 0x76, 0x2E, 0x99, 0x13, 0x33, 0x61, 0xE1, 0x72,\n    0x92, 0x4A, 0x9E, 0x8F, 0x20, 0xCE, 0x37, 0xC7, 0x17, 0x0F, 0xFF, 0x25, 0xDF, 0x16, 0xD4, 0xAF,\n    0xD2, 0x47, 0x65, 0x4E, 0x2B, 0x0E, 0xBE, 0x45, 0x58, 0x8D, 0xFA, 0x7D, 0x59, 0x9D, 0xAE, 0x4E,\n    0x7D, 0x9F, 0x8B, 0x40, 0x5E, 0x1D, 0x0C, 0x23, 0xAE, 0xC9, 0xFD, 0x9E, 0x61, 0x38, 0xF8, 0x81,\n    0xC5, 0x71, 0xD4, 0x6B, 0x24, 0xB6, 0x96, 0xDC, 0xC9, 0x1B, 0xD1, 0x7C, 0x84, 0xFD, 0x79, 0xEE,\n    0x7B, 0x34, 0x82, 0xA9, 0x01, 0xB1, 0x76, 0x61, 0x65, 0xDA, 0x74, 0x94, 0x93, 0x38, 0x1D, 0x23,\n    0x3E, 0x69, 0x24, 0x4C, 0xA4, 0x9F, 0x4D, 0x04, 0xDA, 0x99, 0x32, 0x56, 0x81, 0x8D, 0x75, 0xDE,\n    0x53, 0x09, 0x51, 0x6E, 0x31, 0x81, 0x0B, 0x1B, 0x18, 0xA3, 0xFF, 0xDF, 0x76, 0x7D, 0x57, 0x97,\n    0x62, 0x8C, 0x48, 0x3B, 0x99, 0x1C, 0xA2, 0x8A, 0x16, 0xDA, 0x2D, 0x07, 0xEB, 0xE8, 0x2F, 0xAE,\n    0x4E, 0xCF, 0xB4, 0xA1, 0xAD, 0xB2, 0xC5, 0xEB, 0x2C, 0x69, 0x8B, 0x3F, 0x02, 0xD8, 0x8E, 0x17,\n    0x5E, 0xED, 0x51, 0xD9, 0x2A, 0x95, 0xAA, 0x3C, 0x61, 0x18, 0x67, 0x69, 0x8B, 0x1B, 0x5D, 0x60,\n    0x88, 0xCF, 0x6C, 0x61, 0x96, 0xD5, 0x2C, 0xCD, 0xF2, 0x8A, 0xA5, 0x8E, 0x66, 0xC2, 0x18, 0x27,\n    0x51, 0xA6, 0x4E, 0xDE, 0x95, 0x18, 0xBD, 0xC7, 0xDC, 0x52, 0x9F, 0xC0, 0x74, 0xBA, 0xD8, 0xF2,\n    0x1C, 0x2B, 0x5C, 0x01, 0x29, 0xE4, 0x9D, 0xEE, 0xD5, 0xF6, 0xFF, 0x0E, 0x7C, 0x0D, 0x9E, 0x07,\n    0x29, 0xF5, 0xED, 0xD7, 0x37, 0xA0, 0x57, 0x1A, 0x54, 0x3E, 0x15, 0xB6, 0xEC, 0x97, 0x27, 0x32,\n    0xEA, 0x32, 0xC6, 0xB6, 0xBB, 0xF6, 0x2F, 0x0C, 0x12, 0x74, 0x0E, 0xFA, 0x75, 0x94, 0xD0, 0x11,\n    0x79, 0xEE, 0xE4, 0xBD, 0x9C, 0x0E, 0x34, 0xFA, 0xA9, 0x66, 0x14, 0x89, 0xDA, 0x0E, 0x20, 0x65,\n    0x4A, 0x68, 0x5B, 0xE8, 0xAE, 0x51, 0x4F, 0x9E, 0x18, 0x5D, 0x6F, 0x7C, 0x16, 0xD3, 0x76, 0x6C,\n    0xBE, 0x5E, 0x2D, 0x95, 0x95, 0x0B, 0x08, 0x07, 0x35, 0xD3, 0x09, 0xCB, 0x68, 0x31, 0x13, 0x0C,\n    0x5B, 0xED, 0x4A, 0xE2, 0x0F, 0x8B, 0x5B, 0x68, 0xDC, 0x33, 0xA6, 0x83, 0x98, 0x6B, 0x85, 0x06,\n    0x16, 0xF3, 0xFE, 0xED, 0x60, 0x4E, 0x52, 0x6D, 0x71, 0x91, 0x88, 0x43, 0xBE, 0xEF, 0xC4, 0xAD,\n    0x13, 0x42, 0x18, 0x50, 0x71, 0x34, 0x1A, 0x18, 0xE0, 0x83, 0x5F, 0xD0, 0xE3, 0x68, 0xAD, 0x85,\n    0xFB, 0x81, 0x9A, 0xCE, 0x38, 0x25, 0xFE, 0xDF, 0xE8, 0xE9, 0xE4, 0x89, 0xE9, 0x38, 0x6D, 0x99,\n    0xA4, 0x7C, 0x05, 0xB6, 0xB6, 0x5C, 0x96, 0x70, 0xDE, 0x62, 0xE5, 0x6F, 0x91, 0x19, 0xFF, 0x84,\n    0x14, 0x5E, 0xD4, 0xCC, 0xE9, 0x99, 0x89, 0xF5, 0x72, 0x72, 0x83, 0x9D, 0xEF, 0x8B, 0xA3, 0x63,\n    0xEA, 0x76, 0x7A, 0xF2, 0xD5, 0x1D, 0x50, 0xC9, 0x1B, 0xBC, 0x4D, 0x77, 0xB3, 0xDA, 0x1E, 0x8B,\n    0x1B, 0x39, 0x04, 0xB5, 0x1A, 0x42, 0xDD, 0x18, 0xE5, 0xE3, 0x5F, 0xFD, 0x05, 0x9B, 0xBE, 0x01,\n    0xA5, 0xAD, 0x0A, 0x9A, 0x62, 0xBB, 0xE2, 0x43, 0xAB, 0x14, 0x96, 0xD2, 0xCC, 0xBE, 0xA9, 0x0C,\n    0xE8, 0xBF, 0x40, 0x04, 0x01, 0xD5, 0x34, 0x5F, 0x25, 0x25, 0x2B, 0xD2, 0x76, 0xA4, 0x60, 0x6F,\n    0xF2, 0xE6, 0x5C, 0x35, 0x44, 0x06, 0x36, 0x8D, 0xBA, 0xD5, 0xD7, 0x9F, 0x13, 0xC8, 0xF1, 0x0B,\n    0x0A, 0x40, 0xED, 0xD2, 0x40, 0x93, 0xCE, 0x4E, 0x15, 0x78, 0xF1, 0x92, 0x59, 0xDB, 0xE9, 0x1B,\n    0x1E, 0x91, 0xF3, 0xCA, 0x22, 0x00, 0x28, 0xE6, 0xCE, 0xF1, 0x4E, 0x77, 0x2B, 0xF5, 0xFC, 0x2E,\n    0x90, 0xAA, 0xFA, 0x47, 0x00, 0xEC, 0x42, 0x45, 0x8B, 0xD0, 0xD8, 0xAA, 0x06, 0x0A, 0x79, 0xD3,\n    0xBB, 0xAE, 0xDA, 0xE6, 0xF2, 0x7E, 0x15, 0x34, 0xA7, 0x10, 0xB9, 0xAD, 0xC7, 0x24, 0x25, 0xFF,\n    0xF1, 0xDD, 0x12, 0x68, 0xFA, 0x93, 0xAF, 0x55, 0xEB, 0xEC, 0xA0, 0xAB, 0x48, 0x66, 0xBB, 0x2C,\n    0x15, 0x9A, 0x36, 0xD9, 0xC4, 0x6C, 0x6B, 0x9E, 0x8B, 0x55, 0x67, 0x03, 0xE4, 0xAE, 0x23, 0xB0,\n    0x89, 0x92, 0xDD, 0x04, 0x3A, 0xEB, 0xFA, 0x43, 0x00, 0xA5, 0x03, 0x32, 0x25, 0x86, 0x02, 0x37,\n    0xCD, 0xCA, 0xF2, 0x88, 0x22, 0x41, 0x93, 0x31, 0x75, 0x6C, 0xA1, 0x66, 0xD5, 0xC8, 0x26, 0x2C,\n    0x30, 0x4F, 0xED, 0xF2, 0x07, 0xA6, 0x4F, 0x85, 0x0C, 0xBC, 0xEC, 0xA6, 0xE5, 0x8A, 0xBA, 0x1C,\n    0xCA, 0xF6, 0x22, 0x65, 0xDD, 0x7A, 0x65, 0x85, 0x2C, 0x5A, 0xF3, 0xDC, 0xAD, 0xB6, 0xC3, 0xF8,\n    0x03, 0x2A, 0x0B, 0x01, 0xB2, 0x38, 0x96, 0xF7, 0x2F, 0xFA, 0xD6, 0x6B, 0xD9, 0x5C, 0x0C, 0xCD,\n    0x3F, 0xE4, 0xB9, 0x8B, 0xA7, 0x51, 0x23, 0x8A, 0xCE, 0x08, 0xD5, 0xDB, 0x19, 0xF6, 0xF4, 0x92,\n    0xF8, 0xE2, 0x6B, 0xB0, 0xC6, 0x3D, 0x2E, 0xE7, 0xF1, 0x84, 0xA1, 0x12, 0x07, 0x14, 0x50, 0xBB,\n    0x86, 0x8D, 0x59, 0xBD, 0x6C, 0xE3, 0x3B, 0xA6, 0xEF, 0xF9, 0xD4, 0x3B, 0x1F, 0x1D, 0x39, 0xBF,\n    0xB6, 0xFD, 0xF2, 0x22, 0x00, 0xBC, 0xF5, 0xA8, 0x48, 0xFF, 0x65, 0xF4, 0xD0, 0xD5, 0x5E, 0x47,\n    0x47, 0x82, 0xF6, 0xC5, 0x88, 0x95, 0xE7, 0x65, 0xA7, 0x89, 0x2D, 0x6C, 0x1C, 0xCA, 0x2D, 0x30,\n    0xE7, 0xD5, 0x77, 0xBA, 0xA4, 0x08, 0x03, 0x8B, 0x2D, 0x2D, 0x5A, 0xA3, 0xA5, 0x1D, 0x00, 0x62,\n    0x61, 0xC8, 0x6D, 0x9B, 0xF9, 0x61, 0xF1, 0x0A, 0x8C, 0x2B, 0x48, 0x10, 0x66, 0x9D, 0x41, 0xC8,\n    0x5A, 0xE3, 0x7C, 0xC1, 0x24, 0x09, 0x93, 0xE3, 0x71, 0x53, 0x2D, 0x44, 0xA5, 0x9A, 0xE1, 0xCF,\n    0xBE, 0x89, 0x35, 0x1E, 0x7A, 0x22, 0x71, 0xD4, 0x68, 0x4D, 0x7F, 0xBD, 0x4D, 0x67, 0x76, 0x03,\n    0xA8, 0x56, 0x12, 0xC7, 0x6B, 0x84, 0x81, 0xBB, 0x0B, 0x3A, 0x6A, 0xE2, 0x0F, 0x9D, 0xA0, 0xD6,\n    0x2E, 0x88, 0xA9, 0x64, 0xE7, 0xF0, 0x28, 0x78, 0xCD, 0x26, 0xBB, 0x4B, 0xE5, 0xFB, 0xB8, 0xD1,\n    0x63, 0xA2, 0x99, 0x76, 0x50, 0xCE, 0xF6, 0xC1, 0x96, 0xE0, 0x1A, 0x4E, 0x1B, 0xC6, 0x09, 0x58,\n    0x3B, 0xE6, 0xFF, 0x75, 0x96, 0x80, 0x8D, 0x85, 0x2B, 0x90, 0x01, 0x06, 0x8D, 0xB0, 0x42, 0x7E,\n    0xF5, 0x25, 0xAD, 0x24, 0xB1, 0x88, 0x9C, 0x1A, 0x24, 0x8A, 0x68, 0x5A, 0xD5, 0x24, 0x94, 0x78,\n    0xB2, 0x1A, 0xB9, 0xC3, 0xA2, 0x19, 0x92, 0x91, 0x1A, 0x77, 0x66, 0xD6, 0x6B, 0xF5, 0x5A, 0x49,\n    0xC7, 0xAA, 0x44, 0x41, 0x43, 0xF3, 0xE9, 0xC3, 0x5F, 0x16, 0x43, 0x7D, 0x15, 0xF5, 0x0A, 0xC2,\n    0x8A, 0x50, 0x64, 0x01, 0x7B, 0x8C, 0x09, 0x85, 0xDD, 0x22, 0xE3, 0x9E, 0xA9, 0x46, 0x1E, 0x02,\n    0xE4, 0x01, 0xB0, 0x5D, 0xB8, 0xE8, 0x14, 0xEB, 0x4E, 0x29, 0x23, 0xDE, 0xAE, 0x62, 0x45, 0x01,\n    0xC8, 0x25, 0x87, 0x18, 0xB3, 0xF9, 0xAD, 0x03, 0x3E, 0x59, 0x49, 0x71, 0xA9, 0xC7, 0x27, 0xD7,\n    0xBA, 0x65, 0xCD, 0x27, 0x1E, 0x50, 0xE0, 0xD8, 0x8F, 0x84, 0x6B, 0x0F, 0x6C, 0x12, 0x36, 0x04,\n    0x6B, 0x5D, 0xE3, 0x7D, 0xD5, 0x53, 0xAF, 0xBC, 0xB0, 0x82, 0x21, 0x58, 0xC9, 0xFF, 0xDF, 0x87,\n    0x18, 0x09, 0x4B, 0x79, 0x50, 0xB4, 0x5F, 0x9B, 0xF7, 0x94, 0xAA, 0x7F, 0xB5, 0x03, 0x29, 0x58,\n    0x60, 0xD4, 0xC9, 0x39, 0xC1, 0x58, 0x21, 0xE8, 0xF5, 0x2D, 0x49, 0x58, 0xB1, 0x25, 0xE9, 0x82,\n    0x15, 0xB7, 0xDD, 0x8E, 0x3D, 0x28, 0x1F, 0x97, 0xE5, 0xDA, 0x2B, 0x33, 0xB9, 0x2F, 0x08, 0x29,\n    0x80, 0x87, 0xA2, 0xB7, 0x80, 0x33, 0x2A, 0xE5, 0xD5, 0x49, 0x7B, 0x84, 0x13, 0x66, 0x7D, 0xE3,\n    0x1B, 0x92, 0x9F, 0x90, 0xCE, 0x74, 0x67, 0x4C, 0xC3, 0x74, 0xC0, 0x75, 0x86, 0x63, 0x4C, 0x5E,\n    0xA1, 0x42, 0xAC, 0xC7, 0x9B, 0x65, 0x17, 0x23, 0x6D, 0x50, 0x19, 0xF9, 0x99, 0x15, 0xA8, 0x73,\n    0x0E, 0x28, 0xBA, 0x2C, 0x9A, 0xC0, 0x35, 0x13, 0x16, 0xBC, 0x12, 0x09, 0x0F, 0xF3, 0x0C, 0xE3,\n    0xE1, 0x27, 0x63, 0x75, 0x60, 0xD3, 0xA8, 0xB9, 0xAD, 0x10, 0x18, 0xC3, 0x52, 0x36, 0xED, 0xF4,\n    0xA4, 0x22, 0x4C, 0xC0, 0x24, 0x36, 0xD5, 0xBC, 0xDF, 0xD5, 0x5A, 0xC2, 0xA1, 0x23, 0x6F, 0x2F,\n    0x1A, 0xA2, 0x31, 0x97, 0x24, 0xB8, 0x67, 0xD7, 0x4B, 0x53, 0x50, 0x19, 0x6A, 0xDF, 0x40, 0x21,\n    0xCB, 0x2F, 0x43, 0xD1, 0xD2, 0x68, 0x6B, 0x76, 0x07, 0x8B, 0xA4, 0xC8, 0xD0, 0x5E, 0xAF, 0x22,\n    0x51, 0x13, 0x34, 0x1F, 0x26, 0xAC, 0x7D, 0xC2, 0x6E, 0x6D, 0x21, 0x98, 0xFC, 0x3B, 0xC2, 0x95,\n    0xAD, 0x74, 0xCB, 0xF0, 0xC0, 0xB7, 0xD0, 0xAE, 0x86, 0x46, 0x5D, 0x84, 0xED, 0xEB, 0xB8, 0x64,\n    0x66, 0x2A, 0xA7, 0xA1, 0xE3, 0xCB, 0x48, 0x7D, 0xD8, 0x2E, 0xCE, 0x7B, 0x37, 0xD2, 0x24, 0xB5,\n    0x80, 0x31, 0x0C, 0x77, 0x24, 0x4E, 0x96, 0x59, 0x99, 0x05, 0x80, 0xCF, 0x13, 0x15, 0x4A, 0x97,\n    0x43, 0x6F, 0x45, 0xB9, 0xE8, 0x45, 0x46, 0x90, 0x98, 0x49, 0xC1, 0x83, 0x85, 0x4B, 0x67, 0x7E,\n    0x58, 0x78, 0x9E, 0x69, 0x9C, 0xDF, 0x1F, 0xEC, 0xC5, 0x01, 0xB3, 0x5D, 0x51, 0xF9, 0xCE, 0x84,\n    0x19, 0x5C, 0x67, 0xC1, 0xCE, 0x26, 0x4A, 0xAD, 0xBF, 0x23, 0x00, 0x43, 0x78, 0x3C, 0x2A, 0x0C,\n    0xAE, 0xFC, 0x0A, 0x9A, 0x46, 0x2D, 0x37, 0x80, 0xCB, 0xB2, 0xBE, 0x8B, 0x5D, 0xAE, 0x21, 0x11,\n    0xAC, 0xDE, 0x6F, 0xC1, 0x8D, 0xFB, 0xA1, 0xCF, 0xBA, 0x72, 0xCF, 0x81, 0xD7, 0x74, 0x1A, 0x10,\n    0x82, 0x2A, 0x5F, 0xFB, 0xE0, 0x22, 0xD5, 0x7B, 0x5A, 0x62, 0xB3, 0x4B, 0x5D, 0x94, 0x9C, 0xFE,\n    0xFE, 0x7E, 0xFE, 0xC9, 0x1F, 0xA7, 0x9B, 0xBB, 0x8F, 0x42, 0x26, 0x8E, 0x96, 0x70, 0x2C, 0xD0,\n    0x20, 0xE3, 0xC7, 0xC0, 0x29, 0x4C, 0xCE, 0x37, 0x67, 0x77, 0x51, 0x22, 0x43, 0x83, 0xEA, 0x36,\n    0x85, 0xEA, 0xCD, 0x08, 0x28, 0xC7, 0x36, 0x8E, 0xF6, 0x5F, 0x34, 0x65, 0x02, 0x61, 0xAC, 0xB5,\n    0x42, 0xE3, 0xD6, 0x8D, 0x9B, 0xFC, 0x2F, 0x5A, 0xBA, 0xC4, 0x84, 0x10, 0x42, 0xCE, 0xBB, 0x8C,\n    0x48, 0xF6, 0xD1, 0x0A, 0xDA, 0x45, 0x8D, 0x47, 0x6C, 0x18, 0xBB, 0x87, 0xB6, 0x35, 0xDB, 0xDE,\n    0x01, 0x79, 0x5E, 0x0C, 0x94, 0xFC, 0xF0, 0x9B, 0x61, 0x77, 0xEF, 0x6C, 0x36, 0xE9, 0x85, 0x54,\n    0xC8, 0x37, 0x1F, 0x35, 0x85, 0x8B, 0x22, 0x53, 0x02, 0xF4, 0xBA, 0x09, 0x5E, 0xD9, 0x4A, 0x74,\n    0xE5, 0x62, 0x7C, 0xE0, 0x41, 0xC9, 0x02, 0xA2, 0xAB, 0x9E, 0x0B, 0x53, 0xB7, 0x04, 0xAF, 0xBF,\n    0x4A, 0xC3, 0x88, 0x53, 0x13, 0xE5, 0xED, 0xC7, 0x2D, 0x35, 0x4E, 0x7F, 0xA5, 0x34, 0xA7, 0xB3,\n    0x3B, 0xEB, 0x7B, 0x60, 0xB1, 0x0B, 0xB3, 0xA0, 0x32, 0x02, 0xBB, 0x31, 0x34, 0x7B, 0xE5, 0x91,\n    0x1F, 0x48, 0xE0, 0x7F, 0x94, 0x95, 0x3C, 0xA4, 0x36, 0x86, 0x31, 0x3A, 0x77, 0xA0, 0xDA, 0x50,\n    0x15, 0xB9, 0x13, 0xA0, 0x35, 0x27, 0x70, 0xCC, 0x19, 0xF3, 0x89, 0x22, 0x7C, 0x35, 0xF1, 0xF0,\n    0xCE, 0xCF, 0x3B, 0x15, 0x39, 0xB7, 0xE1, 0x11, 0xB4, 0xFC, 0x4E, 0x02, 0x60, 0x05, 0xBB, 0x7E,\n    0x08, 0x01, 0x8B, 0xB5, 0x77, 0x87, 0x70, 0x60, 0xDB, 0x38, 0x52, 0x31, 0x6B, 0x11, 0x41, 0xBF,\n    0x1B, 0xCB, 0x67, 0x84, 0xC9, 0x7B, 0xA1, 0xBA, 0xA3, 0x2F, 0x21, 0xEC, 0x0D, 0x89, 0x5A, 0x75,\n    0x36, 0x20, 0x82, 0xC6, 0xC1, 0x93, 0x12, 0xD6, 0x11, 0x22, 0xBF, 0x9F, 0x0E, 0x59, 0xFC, 0xFB,\n    0xA0, 0x20, 0x47, 0xC7, 0x9A, 0x98, 0xB8, 0x1F, 0x95, 0x1D, 0x4C, 0x5B, 0x97, 0xEF, 0x92, 0x40,\n    0xAB, 0xB7, 0x21, 0x60, 0xE4, 0x65, 0xCF, 0xAC, 0xD8, 0x34, 0x91, 0x83, 0xD2, 0x71, 0xAA, 0xFC,\n    0xAB, 0xA8, 0xF5, 0x6A, 0x05, 0x86, 0x01, 0x56, 0x72, 0x8F, 0x5B, 0xAA, 0x51, 0x6B, 0x3F, 0xA3,\n    0x32, 0xA3, 0xE4, 0x99, 0xED, 0x38, 0x43, 0x46, 0x8D, 0x61, 0x80, 0x88, 0xC3, 0xEF, 0xAA, 0xF6,\n    0xAA, 0x6F, 0x34, 0xA1, 0xD7, 0x81, 0x4C, 0x9C, 0xD7, 0xEC, 0xE0, 0x9E, 0x26, 0x6B, 0x2C, 0xF8,\n    0xC0, 0xD5, 0x0B, 0xA1, 0x73, 0xA7, 0xBD, 0x4B, 0x68, 0xD0, 0xFB, 0x75, 0xF3, 0x1C, 0x9C, 0x26,\n    0xC3, 0x60, 0xB2, 0x11, 0x81, 0xFE, 0x12, 0x13, 0xC4, 0x6B, 0xE5, 0x52, 0x72, 0x00, 0x26, 0x4E,\n    0x7A, 0xFF, 0x2C, 0x20, 0xCB, 0x32, 0xAA, 0xE4, 0xEE, 0x6B, 0x89, 0x52, 0xC5, 0x2B, 0xDC, 0xFA,\n    0x1B, 0x52, 0x4D, 0x8E, 0x02, 0xDB, 0x84, 0x4E, 0x7C, 0x37, 0xBA, 0xFF, 0xDC, 0x8D, 0x3F, 0xC6,\n    0xBE, 0x5C, 0x1D, 0x85, 0xF3, 0xE3, 0x4A, 0x83, 0x28, 0x61, 0xB3, 0xC0, 0xF6, 0x05, 0x8B, 0x8A,\n    0xE8, 0xED, 0x3E, 0x92, 0x70, 0x9A, 0xFB, 0xF3, 0x5B, 0x39, 0x3A, 0x3B, 0x3E, 0x33, 0x25, 0x01,\n    0x15, 0x86, 0x5B, 0x17, 0x14, 0x42, 0xBD, 0x83, 0xD5, 0x8B, 0x7E, 0xA8, 0xFC, 0xF9, 0x26, 0x1D,\n    0xEC, 0xD9, 0xE4, 0x25, 0xCC, 0x3A, 0x3A, 0xD7, 0x07, 0x7C, 0x59, 0x87, 0xC2, 0x4F, 0x7C, 0x7E,\n    0xDD, 0x4F, 0x02, 0x4B, 0x46, 0xBA, 0xFD, 0x1A, 0x26, 0x46, 0x01, 0x3C, 0x26, 0xDF, 0x38, 0x03,\n    0xA5, 0x0E, 0xF0, 0x8B, 0xC8, 0xDD, 0xE1, 0x37, 0xD5, 0xDB, 0x51, 0x1B, 0x9C, 0x7B, 0x81, 0x12,\n    0x15, 0xCA, 0x6D, 0x85, 0xDB, 0x02, 0x2A, 0xA3, 0x2B, 0x52, 0xAA, 0x05, 0xE9, 0xCA, 0x42, 0xCA,\n    0x01, 0x4B, 0xBF, 0x2C, 0x82, 0x5F, 0x4E, 0x9E, 0xE2, 0xCB, 0x2D, 0xAD, 0x64, 0xC4, 0xA6, 0xC1,\n    0xFB, 0xA8, 0xA7, 0x7F, 0x46, 0xC3, 0xA9, 0xF5, 0xC1, 0x68, 0x5F, 0x54, 0x18, 0x2F, 0xD4, 0x5A,\n    0xD1, 0x94, 0x71, 0x52, 0x90, 0x33, 0xD0, 0xD9, 0xF2, 0x05, 0x83, 0x08, 0x42, 0x77, 0xE5, 0x57,\n    0x6D, 0x78, 0xB9, 0x20, 0x92, 0x1C, 0xB0, 0x64, 0x39, 0xE1, 0xC8, 0x27, 0x33, 0xB6, 0x24, 0x3D,\n    0x8E, 0xE3, 0x6D, 0x41, 0x9A, 0x4C, 0x36, 0x11, 0xB2, 0x7D, 0x5C, 0xD3, 0x4B, 0x56, 0x42, 0x1E,\n    0xB3, 0xD4, 0x1E, 0x55, 0xFE, 0x0C, 0x1B, 0x91, 0x30, 0x74, 0x3C, 0x2C, 0x98, 0x58, 0xD7, 0x0D,\n    0xA3, 0xCD, 0x17, 0x07, 0xBD, 0xDC, 0x31, 0x7C, 0xCE, 0x89, 0x9E, 0xDB, 0xDF, 0x39, 0x52, 0x9B,\n    0x8B, 0x02, 0x78, 0xAD, 0xD8, 0xA7, 0xB3, 0xE4, 0x81, 0xE4, 0xFB, 0x41, 0xE6, 0x64, 0x56, 0x8F,\n    0x86, 0x80, 0xF4, 0x67, 0x20, 0x40, 0x72, 0xFD, 0xCC, 0x36, 0x15, 0xDA, 0xB7, 0x2E, 0xD8, 0x4F,\n    0x25, 0x54, 0x50, 0xA9, 0xD0, 0x5B, 0x1A, 0x7D, 0xB0, 0xA6, 0xDF, 0x5D, 0xB4, 0x1B, 0x13, 0x3A,\n    0xA2, 0x46, 0xEF, 0xE7, 0x53, 0x60, 0xF4, 0x20, 0xF1, 0x51, 0x31, 0x5A, 0x36, 0xB1, 0xA6, 0xA7,\n    0xDA, 0x9E, 0x26, 0x73, 0xEC, 0x8B, 0x65, 0xD8, 0x64, 0x85, 0x27, 0x51, 0x27, 0xB1, 0xEB, 0x4B,\n    0xBB, 0x78, 0x0C, 0xD0, 0xF5, 0xE4, 0xEC, 0x52, 0xEB, 0x0E, 0xEB, 0x13, 0x3C, 0x1E, 0xD7, 0x35,\n    0x88, 0x5D, 0x98, 0x11, 0x9D, 0x0B, 0x75, 0xEC, 0xEC, 0x67, 0x42, 0xB5, 0x4C, 0xF6, 0xF0, 0x4C,\n    0xA2, 0xE1, 0x38, 0xF4, 0x55, 0x95, 0xCB, 0x54, 0x0F, 0xD3, 0xE8, 0x3C, 0xF2, 0x39, 0x9E, 0xD6,\n    0x34, 0x46, 0x21, 0x85, 0xD5, 0x63, 0xE8, 0x4B, 0x34, 0xAA, 0x31, 0x6E, 0xA7, 0xD0, 0xA9, 0xC7,\n    0x54, 0x54, 0x62, 0x00, 0x9B, 0xB5, 0x89, 0x94, 0x8F, 0x6C, 0x0C, 0xD5, 0x6C, 0x23, 0x13, 0xCD,\n    0x58, 0x6E, 0xCA, 0x9A, 0xF1, 0x08, 0x24, 0x94, 0xA3, 0x80, 0xD9, 0x2F, 0xA9, 0x32, 0x1D, 0x3A,\n    0x3F, 0x67, 0xCB, 0xD5, 0x7D, 0x4D, 0x89, 0x56, 0x5C, 0xE5, 0xDC, 0x37, 0x99, 0x27, 0x3E, 0x66,\n    0x82, 0x59, 0x3F, 0xF2, 0x68, 0xE2, 0xC4, 0xA9, 0xE9, 0xD8, 0xFB, 0x5E, 0x8E, 0x22, 0x0E, 0x77,\n    0x5F, 0x65, 0x9B, 0x91, 0xDC, 0x59, 0xC4, 0x91, 0x30, 0x44, 0x24, 0x7A, 0x74, 0x49, 0xA3, 0xA1,\n    0x4C, 0x2A, 0xBF, 0xC3, 0xD7, 0x21, 0x21, 0x2A, 0xA9, 0x8C, 0x5F, 0x45, 0xDA, 0x78, 0x5E, 0x55,\n    0x7F, 0x7C, 0x41, 0xD3, 0x6D, 0x0B, 0xBE, 0x83, 0xA8, 0x5E, 0x08, 0xF5, 0xEC, 0xCC, 0xFD, 0x21,\n    0xB3, 0x1D, 0x6A, 0xCC, 0xF9, 0x52, 0xF3, 0x89, 0x96, 0x2A, 0x70, 0xAB, 0x63, 0x62, 0xA3, 0xB4,\n    0xE7, 0x70, 0xE9, 0xDF, 0x4C, 0xED, 0x52, 0xA0, 0x24, 0x38, 0x58, 0xF1, 0xC6, 0x5B, 0x28, 0xA0,\n    0x8F, 0x84, 0x36, 0x60, 0xFB, 0x17, 0xAA, 0x27, 0xB1, 0xA5, 0x71, 0xE8, 0x1E, 0xDF, 0xB9, 0x0A,\n    0x0D, 0x15, 0x83, 0xF6, 0xE1, 0xF2, 0x51, 0x8F, 0x92, 0x67, 0x63, 0xAB, 0xD1, 0x2A, 0x29, 0x77,\n    0x2D, 0xF0, 0x1E, 0x0E, 0x19, 0xCC, 0x4E, 0x9D, 0x8F, 0xAA, 0xDE, 0xC1, 0x15, 0x1A, 0xBD, 0x19,\n    0x79, 0xD0, 0x61, 0x51, 0x2D, 0x23, 0x82, 0x8E, 0x2C, 0xA3, 0x00, 0x9E, 0x91, 0x83, 0xD4, 0x61,\n    0x6E, 0x53, 0x1B, 0x81, 0xBD, 0x07, 0x69, 0x24, 0xE7, 0xF7, 0xD4, 0x5B, 0x65, 0x72, 0xE2, 0x0F,\n    0x05, 0x41, 0xD5, 0xD6, 0x5E, 0x9D, 0xF3, 0xF0, 0xA0, 0xF5, 0x7C, 0xC9, 0x2F, 0x0C, 0x87, 0xEC,\n    0x13, 0xDB, 0x79, 0x70, 0x89, 0x0C, 0x67, 0x40, 0xC9, 0xCA, 0xF3, 0xE0, 0xEA, 0x12, 0xF1, 0x92,\n    0xD4, 0x02, 0x71, 0x79, 0xE6, 0xF7, 0xC6, 0xC5, 0x27, 0x4A, 0x9D, 0xAC, 0x32, 0x6A, 0x44, 0xD9,\n    0x01, 0x8D, 0x01, 0x1F, 0x2A, 0xD7, 0xE5, 0x7F, 0x32, 0x51, 0x9F, 0xB6, 0x36, 0x8A, 0x98, 0x4E,\n    0xA1, 0x0D, 0xA3, 0xCD, 0x3C, 0xF7, 0xDF, 0x30, 0x0A, 0xD9, 0x2A, 0x6A, 0xD6, 0x97, 0x14, 0x34,\n    0x0C, 0xA1, 0xC5, 0x87, 0x1B, 0x63, 0x4D, 0xBA, 0x23, 0x9E, 0x3D, 0x6E, 0x4F, 0x80, 0x3D, 0x32,\n    0x28, 0x1D, 0x51, 0x8F, 0x63, 0xCA, 0xA6, 0x5A, 0x77, 0xB8, 0xB9, 0xA2, 0xE5, 0x05, 0x8C, 0xE9,\n    0xE3, 0xC7, 0xC8, 0xF0, 0x43, 0x14, 0x29, 0x7E, 0x70, 0x23, 0x77, 0x18, 0x2D, 0x3A, 0x20, 0x14,\n    0x1F, 0x26, 0x0F, 0x46, 0x33, 0x0A, 0x6A, 0x6B, 0xCA, 0x62, 0xB0, 0xF0, 0xCB, 0xB4, 0x48, 0xFA,\n    0xB2, 0x84, 0x55, 0x0B, 0x45, 0x35, 0xC2, 0x47, 0x65, 0x72, 0x4B, 0x78, 0x54, 0x29, 0xD3, 0xD6,\n    0x44, 0xF9, 0xA5, 0x83, 0xA7, 0xA7, 0x04, 0x31, 0x34, 0xA8, 0x3B, 0x8B, 0xCD, 0x13, 0xA2, 0x00,\n    0xCB, 0x61, 0x9D, 0x9E, 0x40, 0xE1, 0xDB, 0x75, 0x47, 0x12, 0xE8, 0x89, 0x4C, 0x31, 0xA5, 0x4D,\n    0xDC, 0xA5, 0x6D, 0x79, 0x47, 0x3E, 0x58, 0xB5, 0x91, 0x9B, 0x02, 0xEC, 0x82, 0x28, 0xCF, 0x11,\n    0x5C, 0x12, 0xFA, 0x88, 0xDE, 0x9C, 0x15, 0x4D, 0xCF, 0xD4, 0x24, 0xAD, 0x5F, 0x16, 0xF0, 0xD0,\n    0x88, 0xC0, 0xF9, 0x77, 0x97, 0xE0, 0xC5, 0x69, 0x20, 0x18, 0x4E, 0x9C, 0x2A, 0x19, 0x66, 0x42,\n    0xD5, 0x5C, 0xD3, 0x87, 0x6B, 0xB2, 0xB0, 0xDE, 0x78, 0xB3, 0x8C, 0x5D, 0x90, 0xC3, 0x25, 0x3D,\n    0xA3, 0xCC, 0xB0, 0x4C, 0x97, 0x0F, 0x6D, 0x29, 0x11, 0x42, 0xB3, 0x86, 0x99, 0x87, 0x37, 0x5A,\n    0x45, 0x93, 0xE0, 0x88, 0xC9, 0x35, 0x05, 0x48, 0xCA, 0x84, 0xAB, 0x13, 0xF8, 0x06, 0xA4, 0x0B,\n    0x72, 0x2A, 0x8D, 0xEB, 0xA0, 0x89, 0x3D, 0x0B, 0x00, 0x1A, 0x17, 0x87, 0xCD, 0x95, 0x30, 0x2E,\n    0xC5, 0xF3, 0xA6, 0x42, 0x5C, 0x63, 0x7A, 0xF6, 0xD0, 0xE3, 0x6D, 0x9C, 0xC8, 0xF7, 0x83, 0xC3,\n    0xED, 0x9F, 0xFA, 0xF0, 0xC6, 0xE0, 0xFE, 0xCD, 0xFB, 0xC8, 0x18, 0x83, 0x77, 0xAA, 0xDA, 0x58,\n    0x17, 0xD2, 0x7B, 0x73, 0x62, 0x2D, 0xC0, 0xE1, 0xF8, 0xA9, 0x3E, 0x06, 0x97, 0x3F, 0x9B, 0xF4,\n    0xBB, 0x16, 0x25, 0x31, 0x69, 0x7C, 0xD6, 0xD6, 0xB3, 0x01, 0x35, 0x41, 0x77, 0x25, 0x71, 0xDE,\n    0x2D, 0x2C, 0xEF, 0x9E, 0x9A, 0xD6, 0x4C, 0xD9, 0x8C, 0x0C, 0xD1, 0xD8, 0xA2, 0x48, 0x59, 0x6D,\n    0x41, 0x15, 0xED, 0xAC, 0x98, 0xA8, 0x47, 0x3D, 0x4B, 0x7D, 0xE7, 0x14, 0xB7, 0xAB, 0x7F, 0xA9,\n    0xCD, 0xAA, 0x49, 0x65, 0x48, 0x34, 0x8C, 0x65, 0xD6, 0x38, 0x5D, 0xE1, 0x14, 0xFC, 0x4F, 0xE6,\n    0xE4, 0x87, 0x21, 0xE2, 0x54, 0x08, 0x91, 0x22, 0xED, 0x3E, 0x87, 0xEE, 0x31, 0x9A, 0xC4, 0x40,\n    0x78, 0x46, 0x2E, 0xF9, 0xDB, 0xED, 0x64, 0xD7, 0x10, 0xA4, 0x99, 0x3E, 0x43, 0x43, 0xB2, 0x54,\n    0x20, 0x20, 0x7D, 0x93, 0x34, 0x0D, 0x0C, 0x86, 0x52, 0x1A, 0x9D, 0x19, 0x12, 0x88, 0xDD, 0x14,\n    0xAE, 0x57, 0x72, 0x75, 0x26, 0xDF, 0xC4, 0xA1, 0x90, 0x49, 0xC7, 0x0C, 0xE1, 0xA6, 0x11, 0x2C,\n    0x00, 0xBF, 0xB6, 0xF5, 0xF2, 0x21, 0x4B, 0x14, 0xB4, 0x07, 0xBE, 0x04, 0x72, 0xCB, 0xBE, 0xB6,\n    0x24, 0x27, 0xCF, 0x7D, 0x75, 0x2B, 0x31, 0xD6, 0xA6, 0x84, 0x55, 0x11, 0xD7, 0x91, 0x5A, 0x15,\n    0x9C, 0xB0, 0x9D, 0x7E, 0xB1, 0xC6, 0xB7, 0xA5, 0xE0, 0xB2, 0x88, 0x98, 0x9C, 0x2F, 0x67, 0x29,\n    0xDA, 0x88, 0xC9, 0xA5, 0x27, 0x53, 0x4D, 0x8F, 0x0B, 0xF8, 0x08, 0x2C, 0xE7, 0x88, 0x26, 0x9C,\n    0xD9, 0x10, 0xD9, 0xE4, 0xDB, 0xA4, 0xF7, 0xAD, 0x9F, 0x4E, 0x65, 0x3E, 0xF4, 0xA4, 0x57, 0x18,\n    0x2C, 0xDD, 0x0E, 0x6D, 0x26, 0xA3, 0xC2, 0x66, 0x0D, 0x71, 0x79, 0x22, 0x8E, 0xD5, 0x6A, 0xFC,\n    0xF4, 0x71, 0x83, 0x27, 0xEF, 0x24, 0x50, 0xBA, 0x54, 0x1A, 0xE4, 0x98, 0x84, 0x3F, 0x27, 0xE3,\n    0x29, 0x3E, 0x45, 0xC1, 0xB1, 0x00, 0x88, 0x54, 0x4D, 0xF0, 0x87, 0x7B, 0x30, 0x7B, 0xA1, 0xC7,\n    0x6C, 0xD7, 0x48, 0xA0, 0xFF, 0xCB, 0x89, 0x92, 0x6D, 0x0E, 0x05, 0x3A, 0xCE, 0x95, 0x30, 0x23,\n    0xD7, 0x42, 0x77, 0xA9, 0x5E, 0xF5, 0xD9, 0xEB, 0x5A, 0xB7, 0x83, 0xB9, 0x91, 0x14, 0x51, 0x13,\n    0x96, 0x1E, 0x13, 0x5B, 0x28, 0x56, 0xFB, 0x4C, 0x6C, 0x7B, 0x87, 0x4A, 0xF5, 0x44, 0xD3, 0xC6,\n    0xC0, 0x17, 0x77, 0x45, 0x61, 0x60, 0x5E, 0x1D, 0xA6, 0x0C, 0x19, 0x70, 0x95, 0x46, 0x7D, 0xD2,\n    0x3B, 0x94, 0xD5, 0x9E, 0xD9, 0xB9, 0x1C, 0x02, 0x2D, 0xF5, 0x52, 0xEF, 0x77, 0x84, 0x1A, 0xA0,\n    0x65, 0x7A, 0x61, 0xFF, 0x5A, 0xDD, 0x1E, 0xB6, 0xD5, 0xE7, 0xEC, 0xF6, 0x33, 0x54, 0xB7, 0xE7,\n    0x33, 0x30, 0xB0, 0xB4, 0x61, 0x0F, 0xAA, 0xFE, 0xAC, 0xDB, 0x9D, 0x3A, 0x2B, 0x78, 0x82, 0x93,\n    0x8B, 0x74, 0x86, 0x6A, 0x07, 0xDF, 0x82, 0x1F, 0x35, 0xFA, 0xFD, 0x65, 0x39, 0x52, 0x87, 0xD9,\n    0x20, 0x05, 0xF5, 0x56, 0x85, 0x70, 0xFA, 0x46, 0x54, 0x59, 0xE5, 0xA0, 0xF3, 0x14, 0x09, 0x95,\n    0x5F, 0x9B, 0x56, 0x45, 0xA5, 0x32, 0x64, 0x88, 0x98, 0x4A, 0x1D, 0x91, 0xDF, 0x32, 0x22, 0xAF,\n    0xCD, 0x3D, 0x8B, 0x5E, 0x77, 0x59, 0x41, 0x25, 0xA0, 0xCC, 0x7F, 0xC6, 0x6B, 0x61, 0x60, 0x0F,\n    0xCD, 0x0A, 0xC9, 0x55, 0x6E, 0x0E, 0xB7, 0x6B, 0x85, 0xC8, 0xD9, 0xD6, 0x26, 0x93, 0x0C, 0x3D,\n    0x1C, 0xEE, 0xEB, 0x19, 0x8F, 0x98, 0xF0, 0x90, 0x88, 0x06, 0x05, 0xF0, 0x0D, 0xE7, 0xC9, 0x5B,\n    0x86, 0xE2, 0x7E, 0x2C, 0x4A, 0xD3, 0x80, 0xB6, 0x74, 0x54, 0x7F, 0x03, 0x12, 0x38, 0xB3, 0xA2,\n    0xBB, 0x43, 0x24, 0xDA, 0x41, 0x6D, 0xEE, 0x99, 0x4D, 0xD1, 0xEC, 0x69, 0x37, 0xE7, 0x41, 0xF3,\n    0x9D, 0xAA, 0xD8, 0xC1, 0xA5, 0xE0, 0x11, 0x3F, 0x47, 0xB4, 0x2E, 0xAD, 0x09, 0x84, 0x56, 0x0F,\n    0x4E, 0x0C, 0xB1, 0x78, 0xE6, 0xE0, 0x33, 0xA0, 0x32, 0xDA, 0xF6, 0x67, 0x80, 0xF0, 0xB3, 0xE9,\n    0x2F, 0x41, 0x23, 0xF2, 0x79, 0xE3, 0xD2, 0x59, 0x7A, 0x0D, 0x4A, 0x58, 0x29, 0x90, 0x92, 0xCA,\n    0x6C, 0x70, 0x15, 0x41, 0xCB, 0x72, 0xF4, 0x09, 0x47, 0xB9, 0xE2, 0x98, 0xAB, 0x15, 0xCE, 0x3D,\n    0xA9, 0x9D, 0x0E, 0x44, 0xDD, 0xA9, 0x23, 0x8E, 0x0E, 0x1D, 0x78, 0xBC, 0xEC, 0x5F, 0x48, 0x92,\n    0x22, 0xEC, 0x2A, 0xED, 0x9A, 0x41, 0x8D, 0x14, 0xC8, 0x77, 0x44, 0x36, 0xCE, 0xE6, 0xF5, 0x70,\n    0xF4, 0xC1, 0x50, 0x41, 0xAB, 0x7B, 0x28, 0xFD, 0xB9, 0x00, 0x39, 0x63, 0x8D, 0x20, 0x73, 0x8E,\n    0x42, 0x7E, 0xB8, 0x40, 0x7A, 0xAD, 0x8D, 0x8D, 0x6E, 0xFA, 0x93, 0x24, 0xA5, 0xF6, 0xF7, 0x61,\n    0x72, 0x75, 0xFC, 0xBB, 0xF5, 0xD1, 0xBE, 0xA0, 0x36, 0x91, 0x61, 0x87, 0x7F, 0x7F, 0xFD, 0x2A,\n    0x9B, 0xC8, 0x12, 0xE9, 0xB2, 0xE9, 0xFC, 0xBB, 0x05, 0xA3, 0xA8, 0x21, 0x97, 0x9B, 0x96, 0x3C,\n    0x40, 0x64, 0x7F, 0xA3, 0x51, 0x27, 0x3D, 0x6A, 0xB7, 0x67, 0x15, 0x57, 0x68, 0x4E, 0x87, 0x7D,\n    0xB5, 0x2F, 0x45, 0x8F, 0x77, 0x3E, 0x92, 0x98, 0x10, 0xB7, 0x77, 0xA3, 0x27, 0x20, 0x3C, 0x82,\n    0x42, 0x37, 0xF2, 0xD7, 0xD6, 0xE7, 0xBF, 0x8D, 0xD6, 0xEF, 0x4B, 0x53, 0xEC, 0x0F, 0xCC, 0xA7,\n    0xB0, 0x91, 0x03, 0x27, 0xAC, 0xE1, 0x9A, 0xA6, 0x38, 0x6E, 0x64, 0xF6, 0x4E, 0xE9, 0xD1, 0x78,\n    0x7C, 0x7A, 0xD6, 0xF9, 0x0E, 0xEB, 0x24, 0x2C, 0x01, 0xF3, 0xB1, 0x38, 0x22, 0x22, 0xBF, 0x91,\n    0x19, 0x44, 0xCB, 0xEC, 0x8B, 0xEF, 0x59, 0xF0, 0xA8, 0x3D, 0x5D, 0x66, 0x43, 0xEF, 0x56, 0x6C,\n    0x1A, 0x88, 0x0A, 0xA7, 0x74, 0x48, 0x0B, 0x1A, 0x9E, 0x2D, 0xD5, 0x0B, 0xCC, 0x43, 0xA3, 0x09,\n    0xB9, 0xCD, 0xD7, 0x82, 0x0C, 0x73, 0x29, 0x4F, 0xE7, 0x0B, 0x69, 0x68, 0x82, 0x00, 0x65, 0x4D,\n    0x5F, 0xF8, 0xE6, 0xD7, 0x02, 0x2A, 0x8F, 0x22, 0x99, 0x5E, 0xAA, 0x08, 0x4D, 0xBD, 0x9A, 0xC4,\n    0xEC, 0x32, 0x0E, 0x15, 0x3F, 0xB4, 0x94, 0xBF, 0x01, 0x3A, 0xB1, 0x0C, 0x78, 0x77, 0xDF, 0x72,\n    0x5B, 0x77, 0x0D, 0x33, 0x7A, 0x0B, 0xC1, 0x1E, 0xED, 0x9A, 0xE8, 0x72, 0x68, 0x8D, 0x24, 0xEE,\n    0x97, 0x24, 0xF6, 0xCA, 0x6D, 0xE8, 0x3B, 0x9D, 0xDA, 0x93, 0x40, 0x85, 0xA1, 0x9D, 0x1F, 0xB8,\n    0xC9, 0xE5, 0xEA, 0x59, 0xA0, 0xD4, 0x6D, 0xCB, 0x71, 0x52, 0x75, 0x9D, 0xA2, 0xAF, 0x91, 0x6A,\n    0x4E, 0x0A, 0x6B, 0xB5, 0x67, 0x7B, 0x6C, 0xAC, 0x5E, 0x9B, 0x02, 0x27, 0x4B, 0x3E, 0xCF, 0x19,\n    0x57, 0xCC, 0x74, 0x4B, 0x33, 0xA4, 0x6B, 0x1E, 0x56, 0x6D, 0x0B, 0xA4, 0x84, 0xA3, 0x81, 0xC9,\n    0x89, 0xF7, 0x9E, 0x3F, 0xFE, 0x57, 0x60, 0x4F, 0x79, 0x84, 0x53, 0xEB, 0x80, 0x8F, 0xB9, 0x63,\n    0x29, 0x4F, 0xBD, 0xA0, 0x0C, 0xF0, 0x7F, 0x35, 0xEC, 0x18, 0xC1, 0x22, 0xA3, 0x6D, 0x7F, 0x2E,\n    0xCC, 0x4D, 0x51, 0xFD, 0x76, 0x74, 0x18, 0x19, 0x67, 0x6B, 0x81, 0x07, 0x07, 0x5B, 0x5D, 0xB3,\n    0x98, 0x4D, 0x23, 0xB8, 0x77, 0xD1, 0xEC, 0x3C, 0x0E, 0x10, 0xD0, 0x65, 0x99, 0x29, 0xF1, 0x42,\n    0x83, 0x51, 0x26, 0x18, 0x8C, 0x8E, 0x4F, 0x8D, 0x2A, 0x14, 0x34, 0x6A, 0xC5, 0x71, 0x2F, 0x4C,\n    0xFF, 0xBA, 0x11, 0xD7, 0x76, 0x16, 0x00, 0xEE, 0xBA, 0x26, 0xD9, 0xC2, 0x51, 0xBD, 0xC6, 0x67,\n    0x85, 0x56, 0x98, 0x36, 0x12, 0xC3, 0xF1, 0xCC, 0xFA, 0xFB, 0xF6, 0x5A, 0xD2, 0x7A, 0xFF, 0x1B,\n    0x33, 0xD3, 0x72, 0x05, 0x01, 0x67, 0xA2, 0x42, 0x45, 0x0C, 0x5E, 0x46, 0xAD, 0x26, 0xA7, 0xCE,\n    0x38, 0x30, 0xFB, 0x9B, 0x39, 0x8D, 0x40, 0x61, 0xDF, 0xE5, 0xC5, 0x8A, 0x26, 0xA6, 0x31, 0xFC,\n    0x8B, 0x0B, 0x2E, 0xAD, 0xD8, 0xA5, 0x12, 0x92, 0xD2, 0xCA, 0x86, 0x73, 0x52, 0xA6, 0x19, 0xE7,\n    0x70, 0xD2, 0x31, 0x14, 0x1C, 0xDA, 0x27, 0xC9, 0xB7, 0x6C, 0x98, 0xE9, 0xD9, 0x59, 0x8B, 0x5F,\n    0x27, 0xA6, 0xB3, 0xAC, 0x89, 0xFC, 0x99, 0xF5, 0x6A, 0x56, 0xC1, 0x99, 0xFE, 0x05, 0x3A, 0x0A,\n    0x27, 0x1E, 0xE4, 0xD2, 0x75, 0x98, 0x7C, 0x00, 0x23, 0xD0, 0x19, 0x0B, 0x49, 0xC6, 0x52, 0x48,\n    0x03, 0xB5, 0x24, 0x40, 0x03, 0xA2, 0x18, 0xA2, 0x0A, 0x5D, 0x84, 0xF2, 0xDA, 0xF2, 0x01, 0xF5,\n    0xE7, 0xDD, 0x54, 0x1F, 0x6C, 0x04, 0xBA, 0x74, 0x46, 0x29, 0xA3, 0x08, 0x18, 0xA1, 0xA9, 0x80,\n    0xA3, 0x85, 0x42, 0x49, 0x33, 0x30, 0x79, 0x08, 0x7B, 0x72, 0x32, 0xB7, 0x59, 0x85, 0xA1, 0xB5,\n    0x29, 0xDF, 0x69, 0xDF, 0x2C, 0xC3, 0x5F, 0xD7, 0xA7, 0xE9, 0x97, 0x6A, 0xA4, 0x38, 0x8B, 0x8C,\n    0xDE, 0xB2, 0xA8, 0x27, 0xFE, 0x6E, 0xD5, 0xFF, 0xF6, 0x00, 0x64, 0xB7, 0xBD, 0x14, 0x3C, 0xEC,\n    0x0E, 0x86, 0x83, 0x7A, 0x16, 0xEF, 0x50, 0xBB, 0x3D, 0xBA, 0xA2, 0x43, 0x14, 0x61, 0x06, 0x8B,\n    0x85, 0xCF, 0x86, 0xE6, 0xC9, 0x77, 0xC6, 0x9F, 0x84, 0xF2, 0x1E, 0xD8, 0x51, 0x9F, 0xB6, 0xC8,\n    0x11, 0x56, 0x9A, 0x4B, 0x8B, 0xEA, 0x58, 0x68, 0x18, 0x78, 0x44, 0x8C, 0x36, 0x0B, 0xA0, 0x4C,\n    0x74, 0x2E, 0x14, 0xBD, 0xE8, 0x57, 0xA9, 0x1D, 0x4A, 0x9F, 0xD5, 0x44, 0xB3, 0x15, 0xD6, 0xED,\n    0xAE, 0x7A, 0x4E, 0x7D, 0xA7, 0x3C, 0x30, 0xFF, 0x6F, 0x0C, 0x23, 0xCC, 0x1B, 0x92, 0xC1, 0x48,\n    0xF9, 0x8C, 0x97, 0x47, 0x3E, 0x5E, 0x66, 0x83, 0xE8, 0xB9, 0xF0, 0xD0, 0x1B, 0x79, 0x68, 0x1D,\n    0xA2, 0x35, 0xC7, 0x34, 0x07, 0x8A, 0xCE, 0x68, 0xBD, 0x9B, 0x7C, 0x76, 0x38, 0x7A, 0x23, 0x9B,\n    0x39, 0xD7, 0x04, 0x4A, 0x82, 0xB9, 0x4B, 0xCF, 0xB1, 0x9A, 0xBA, 0x75, 0x6B, 0x04, 0xF5, 0x23,\n    0x8D, 0x36, 0x4F, 0x9A, 0x3E, 0x60, 0xD3, 0xAA, 0xF9, 0x0F, 0x05, 0x5C, 0xA7, 0x28, 0x7E, 0xB4,\n    0xCA, 0x77, 0x92, 0x9B, 0x21, 0x0C, 0x99, 0x84, 0xB0, 0xB1, 0xD2, 0x1C, 0xF7, 0x9A, 0x24, 0x0A,\n    0xD7, 0x8A, 0xE3, 0x08, 0x3F, 0xE1, 0x5A, 0xC6, 0x32, 0xCF, 0xD8, 0xBB, 0x6F, 0x86, 0x62, 0x28,\n    0xDC, 0xC6, 0xF5, 0x00, 0x8C, 0xBE, 0x15, 0x25, 0x53, 0x87, 0x81, 0xAF, 0xDE, 0xAC, 0x6D, 0x59,\n    0x0D, 0x51, 0x1F, 0xF9, 0x76, 0xEA, 0x44, 0x95, 0xFB, 0x1C, 0xC5, 0xB0, 0x0A, 0x29, 0xF2, 0xAE,\n    0x8F, 0x03, 0xE7, 0x41, 0xD1, 0x54, 0x9D, 0xD3, 0xD2, 0xB4, 0x7D, 0x9A, 0xC1, 0x09, 0xDA, 0xC5,\n    0xD8, 0x26, 0x59, 0xC4, 0x35, 0x66, 0xD7, 0xD1, 0xE5, 0xA6, 0xED, 0xBB, 0x82, 0xAD, 0x50, 0x4C,\n    0xE0, 0x01, 0xC9, 0x57, 0x78, 0x66, 0x8E, 0x0E, 0x69, 0xFD, 0x8C, 0xE9, 0x63, 0xA3, 0x21, 0xDA,\n    0xC8, 0x58, 0x1D, 0x6B, 0x76, 0x6F, 0xA4, 0x8F, 0x46, 0xC8, 0x00, 0xB2, 0x1E, 0xEF, 0x93, 0x54,\n    0x89, 0xAB, 0xD9, 0x18, 0x23, 0x95, 0xE6, 0x2A, 0xF8, 0xCC, 0xF2, 0x74, 0xE5, 0x71, 0x60, 0x8C,\n    0xA1, 0x0E, 0x67, 0x14, 0xBA, 0xEF, 0x69, 0xC4, 0x01, 0xFE, 0x93, 0x54, 0x26, 0x0A, 0xE1, 0xC2,\n    0xC1, 0x47, 0xC9, 0x6A, 0xF6, 0x6A, 0xD8, 0xB6, 0xDD, 0xEE, 0x67, 0xB5, 0xA0, 0xD8, 0x5F, 0x58,\n    0x7B, 0x42, 0xFE, 0xD3, 0xD0, 0xCB, 0xFD, 0x5E, 0x22, 0x4F, 0x31, 0xF7, 0xBA, 0x12, 0x6C, 0xEF,\n    0x4A, 0x78, 0x23, 0x85, 0xA3, 0xB1, 0x35, 0x59, 0x13, 0x5D, 0x35, 0xA2, 0x32, 0xF4, 0x6C, 0x07,\n    0x33, 0x56, 0x53, 0xD9, 0xB5, 0x4B, 0x6F, 0xC7, 0x73, 0x01, 0x69, 0x54, 0x7F, 0x95, 0x8C, 0x10,\n    0xD7, 0x11, 0xF1, 0xF5, 0x0C, 0x21, 0x17, 0xE5, 0x23, 0x34, 0xDB, 0x4D, 0xC5, 0xA9, 0x18, 0x54,\n    0xD0, 0x76, 0xB2, 0x74, 0x68, 0x61, 0x00, 0x8D, 0xCA, 0x3A, 0x70, 0xE4, 0x36, 0xDE, 0x2D, 0x9B,\n    0x5F, 0xB0, 0x4E, 0x66, 0x15, 0x7B, 0x92, 0x04, 0x38, 0xBD, 0xC1, 0x61, 0xF2, 0x19, 0xB9, 0xD9,\n    0x71, 0xCF, 0xFB, 0x4D, 0x19, 0x99, 0xE5, 0x2A, 0x50, 0x27, 0x20, 0xC2, 0x18, 0x7B, 0xE9, 0xFA,\n    0x02, 0x13, 0x66, 0x89, 0xE7, 0x72, 0x2A, 0xDC, 0x27, 0x72, 0x91, 0xE7, 0xCF, 0x3A, 0x76, 0x6B,\n    0xFD, 0xAF, 0x6C, 0x68, 0x57, 0x38, 0xEE, 0x97, 0x55, 0x0C, 0xBF, 0xA6, 0xBA, 0xDD, 0xC3, 0x2F,\n    0xDE, 0xD5, 0x39, 0x91, 0x8E, 0xFA, 0xE8, 0xFC, 0x52, 0x87, 0x94, 0x85, 0x24, 0x3A, 0xDE, 0x03,\n    0xBE, 0x02, 0x1B, 0x81, 0xE8, 0x1F, 0xE6, 0x96, 0xAA, 0x38, 0x42, 0x42, 0x2F, 0xDF, 0x4F, 0x13,\n    0x50, 0xD3, 0x77, 0xE4, 0x2C, 0x8E, 0x96, 0x3C, 0x4A, 0x6E, 0x37, 0xAF, 0xE5, 0x03, 0x27, 0x5F,\n    0x71, 0xE1, 0x79, 0xEA, 0xF7, 0xC5, 0x71, 0x4F, 0xAC, 0xFE, 0x36, 0x45, 0x0A, 0x96, 0x60, 0x59,\n    0xD9, 0x52, 0x9F, 0x31, 0xDF, 0x20, 0x6F, 0x33, 0x03, 0x3D, 0x51, 0x57, 0x18, 0xC1, 0xD0, 0xA4,\n    0x7C, 0x33, 0x2E, 0x59, 0x04, 0xF8, 0x3C, 0xF3, 0x58, 0xBB, 0x2F, 0x12, 0xB1, 0x35, 0xC4, 0xF6,\n    0xC4, 0x95, 0x3D, 0xDF, 0x13, 0x09, 0xFC, 0xFB, 0x30, 0xA2, 0xF6, 0x9B, 0xAE, 0xC4, 0xA3, 0xB3,\n    0x2E, 0xFE, 0x29, 0x8D, 0x56, 0x24, 0x37, 0xA4, 0xA4, 0x1E, 0xC3, 0x13, 0x6F, 0x99, 0x3D, 0x35,\n    0xF8, 0xA0, 0x08, 0x7E, 0x4C, 0x7C, 0x59, 0x81, 0xC0, 0xD8, 0x8F, 0xF7, 0x33, 0x8E, 0x67, 0x2F,\n    0xD2, 0x04, 0xE7, 0x4D, 0xB4, 0x90, 0x07, 0xD3, 0xF7, 0x73, 0x18, 0x1D, 0x69, 0x89, 0x49, 0x13,\n    0x08, 0x65, 0x6F, 0xCA, 0xDC, 0x8A, 0x32, 0xBC, 0xCF, 0x5C, 0x6E, 0xDE, 0x23, 0x83, 0x22, 0x94,\n    0xEE, 0x02, 0xC6, 0x44, 0xE8, 0xDE, 0xBD, 0xB4, 0x79, 0xD2, 0xF0, 0x9E, 0x46, 0xCB, 0xF6, 0x5B,\n    0x2B, 0xA3, 0x97, 0x98, 0x05, 0x60, 0x83, 0xE3, 0x74, 0xFA, 0xA5, 0x0A, 0x04, 0xE0, 0x76, 0xB5,\n    0x2B, 0x16, 0xA2, 0x00, 0xE1, 0x0D, 0xAF, 0x5C, 0x8E, 0xB3, 0x5E, 0x24, 0xC4, 0xA3, 0xB5, 0x8B,\n    0xAC, 0x56, 0x13, 0x09, 0x8D, 0xDE, 0xE5, 0xA1, 0x85, 0x49, 0x65, 0xB2, 0xFF, 0xE4, 0xF2, 0x61,\n    0x12, 0xE2, 0x45, 0x48, 0x8D, 0x8A, 0x02, 0x60, 0xBB, 0x2F, 0xF3, 0xFF, 0x10, 0xCD, 0xE3, 0xA7,\n    0xE8, 0xF0, 0xC1, 0x14, 0xB5, 0x0D, 0x65, 0xDE, 0x37, 0x33, 0xFC, 0x2F, 0x22, 0xB9, 0xBF, 0xE0,\n    0x56, 0x0C, 0x44, 0x18, 0xFC, 0xAA, 0xBA, 0xBE, 0x24, 0x0E, 0xA1, 0x31, 0x17, 0x7D, 0x2C, 0x2A,\n    0xA2, 0xAA, 0xF4, 0x65, 0x81, 0x12, 0xB4, 0x7E, 0x0D, 0x13, 0xE3, 0x9B, 0x3F, 0xAD, 0xA1, 0x20,\n    0x19, 0x91, 0x34, 0x92, 0xAD, 0x15, 0x5A, 0x93, 0x65, 0xC1, 0xDD, 0x10, 0xCD, 0x6D, 0xAD, 0x94,\n    0x15, 0xA4, 0x88, 0x30, 0x4A, 0x8B, 0x8C, 0xB0, 0xEB, 0xA9, 0x04, 0x8E, 0xEA, 0x4A, 0xBA, 0x28,\n    0x1F, 0x28, 0xD4, 0x65, 0x85, 0x49, 0xF4, 0x7C, 0x69, 0x13, 0xB4, 0x3E, 0x84, 0x36, 0x77, 0x9E,\n    0x70, 0x36, 0x12, 0x53, 0x1B, 0xD4, 0xD0, 0x2A, 0x17, 0xDC, 0x84, 0x93, 0xC1, 0xDF, 0xB9, 0x44,\n    0x68, 0x0B, 0xF5, 0xEE, 0x3B, 0xB2, 0xA2, 0x8C, 0xCB, 0xB6, 0xA6, 0xD8, 0x97, 0xA8, 0x2C, 0x61,\n    0x7C, 0xB7, 0x21, 0x58, 0x07, 0xC9, 0xD4, 0x5D, 0x54, 0x3A, 0x70, 0xC9, 0xF4, 0x51, 0x00, 0xC6,\n    0x25, 0xFF, 0x1E, 0x1D, 0x94, 0xBA, 0x48, 0xDE, 0x5E, 0x69, 0xB4, 0x87, 0x4F, 0x87, 0x83, 0x64,\n    0x9A, 0xDF, 0x83, 0x93, 0x59, 0x2A, 0x43, 0xD7, 0xCE, 0x35, 0xE7, 0xD5, 0x77, 0x72, 0x23, 0xB5,\n    0xFF, 0x52, 0xA6, 0x11, 0x2A, 0x29, 0x0A, 0xCA, 0x3B, 0xB8, 0xBC, 0xF3, 0xFE, 0x3A, 0x6B, 0x1B,\n    0x13, 0xC9, 0x5D, 0xD1, 0xF5, 0xEE, 0x6A, 0xC4, 0x05, 0x03, 0xAE, 0x04, 0xC5, 0x36, 0x03, 0x56,\n    0x3C, 0x5D, 0xE1, 0x3E, 0x32, 0x45, 0x18, 0x3C, 0x90, 0x46, 0xF3, 0xB0, 0xDA, 0xD4, 0xCC, 0xE0,\n    0xE1, 0xCD, 0x40, 0xAD, 0xC3, 0xFA, 0x6B, 0x2B, 0x74, 0xC5, 0x20, 0xCA, 0xF6, 0xA2, 0xA7, 0xC6,\n    0xD3, 0xA2, 0x38, 0x1E, 0x5C, 0x03, 0xE5, 0xCC, 0x3F, 0x21, 0xED, 0x8E, 0xAE, 0x6B, 0xDE, 0x75,\n    0xF9, 0x67, 0x63, 0xEA, 0x8B, 0x18, 0x06, 0x7A, 0xBD, 0x67, 0x32, 0xA3, 0x89, 0x6D, 0x71, 0x0A,\n    0x43, 0x00, 0x74, 0x6B, 0x19, 0x42, 0x8D, 0x0C, 0x93, 0xAC, 0x4F, 0x69, 0x3B, 0x5C, 0xB0, 0x35,\n    0xAE, 0x7F, 0x54, 0x48, 0x1A, 0x48, 0x36, 0x4A, 0xD4, 0x60, 0x32, 0x16, 0x21, 0x75, 0xF6, 0xAA,\n    0x3A, 0x34, 0x14, 0xC3, 0xC7, 0x0D, 0xB6, 0x3E, 0xF8, 0x7D, 0xDE, 0x17, 0x46, 0xBD, 0xA7, 0x87,\n    0x08, 0xF5, 0x1B, 0x6B, 0x13, 0x0B, 0xCD, 0xA9, 0x4D, 0x9A, 0xD2, 0x39, 0x83, 0xCA, 0xE9, 0x47,\n    0xE1, 0xCF, 0xD6, 0x73, 0xF1, 0x15, 0xCC, 0x50, 0x87, 0xE2, 0xB2, 0x56, 0x04, 0xCC, 0x20, 0x06,\n    0x87, 0x3F, 0x19, 0x8D, 0xE6, 0x45, 0x70, 0xF1, 0x13, 0xB1, 0x32, 0x1C, 0xC2, 0xFF, 0xB9, 0x2F,\n    0xC9, 0x76, 0x2C, 0x0E, 0x81, 0x18, 0xEF, 0x34, 0xA7, 0xD0, 0x85, 0xD1, 0x37, 0xC3, 0x83, 0x44,\n    0xFB, 0x35, 0x2B, 0xB8, 0x38, 0x4A, 0xB8, 0x44, 0x61, 0xE0, 0x65, 0x97, 0x90, 0x2A, 0xFB, 0x09,\n    0x68, 0x1A, 0x8A, 0xF0, 0x56, 0xF7, 0xF7, 0xE4, 0xF5, 0x01, 0x35, 0xD2, 0x92, 0xB5, 0xE0, 0x82,\n    0x2D, 0x39, 0x03, 0x1B, 0x0C, 0xDC, 0x30, 0x8D, 0x7E, 0x55, 0xB4, 0x38, 0x29, 0x93, 0xA0, 0x99,\n    0x85, 0x6E, 0x8B, 0x6B, 0x82, 0x6F, 0x5A, 0x57, 0xC0, 0x04, 0x68, 0xE3, 0x41, 0xB6, 0xF9, 0x5B,\n    0xC7, 0xE9, 0xCF, 0x96, 0x06, 0x86, 0x63, 0x93, 0x12, 0xC1, 0xEC, 0xF3, 0xBB, 0x25, 0x39, 0x8F,\n    0x1F, 0x06, 0x70, 0x08, 0xC6, 0x60, 0x4C, 0xD1, 0x67, 0x89, 0x8A, 0x13, 0x97, 0x67, 0x13, 0x6E,\n    0x08, 0x2B, 0xE5, 0x59, 0x5C, 0xAA, 0xFF, 0x4B, 0xE7, 0x49, 0x81, 0x6E, 0x46, 0x5E, 0x9E, 0x13,\n    0x5C, 0x69, 0xEB, 0x95, 0x36, 0x2A, 0x77, 0xBF, 0xD2, 0xB5, 0xDC, 0x49, 0x33, 0x5F, 0x17, 0x5D,\n    0x1F, 0x1C, 0x78, 0x8B, 0x38, 0x4D, 0x5D, 0xC4, 0x03, 0xF2, 0x58, 0xF4, 0x0A, 0xFD, 0xE4, 0xEF,\n    0x18, 0xF0, 0x8F, 0x31, 0x29, 0x5D, 0x69, 0xEE, 0xA1, 0x31, 0x37, 0xE2, 0x31, 0x5F, 0xF6, 0x92,\n    0x33, 0xDC, 0x70, 0x28, 0xD2, 0x6D, 0xC7, 0x88, 0xC5, 0x86, 0x61, 0x0D, 0xA9, 0x7B, 0x15, 0xA4,\n    0xE5, 0x35, 0x7C, 0xF3, 0xBD, 0xE1, 0x80, 0xDE, 0x9D, 0x7A, 0x7D, 0x98, 0x06, 0xFF, 0x20, 0x6A,\n    0xF4, 0xCD, 0xC8, 0x99, 0x25, 0x64, 0x81, 0xEA, 0xC8, 0x7E, 0x3C, 0x5B, 0x28, 0x06, 0xBD, 0xA5,\n    0xA8, 0xF8, 0x9C, 0xF3, 0x3D, 0x4F, 0xB1, 0xB5, 0x15, 0x1D, 0x50, 0x0C, 0x45, 0x55, 0x48, 0xEA,\n    0x4C, 0x62, 0x5C, 0x11, 0xF3, 0xAE, 0x7E, 0x13, 0xA0, 0x9E, 0x6A, 0xB4, 0x99, 0x88, 0x03, 0x8F,\n    0xC7, 0xAE, 0x20, 0x67, 0x2D, 0x4D, 0x88, 0x11, 0xB5, 0x41, 0x0D, 0x37, 0xA3, 0xAB, 0xD8, 0xE4,\n    0x7C, 0x59, 0xC5, 0x71, 0x74, 0x5E, 0x95, 0xB8, 0x38, 0x95, 0x40, 0xAC, 0x15, 0xD3, 0x7D, 0x21,\n    0xD0, 0xB3, 0x82, 0x40, 0x55, 0x92, 0x43, 0x90, 0xDE, 0x83, 0x62, 0xE7, 0xD4, 0x56, 0x32, 0x72,\n    0x52, 0x0B, 0x2E, 0x09, 0x30, 0x64, 0x4A, 0xAC, 0x5A, 0x67, 0x01, 0x0A, 0xBD, 0x22, 0xF4, 0x58,\n    0xB0, 0xE5, 0x6B, 0x92, 0x69, 0x89, 0x72, 0xE2, 0x91, 0x50, 0x3E, 0x47, 0xBB, 0xE0, 0x23, 0x57,\n    0xBC, 0xA5, 0x5D, 0xEF, 0xA7, 0x39, 0x96, 0x00, 0x99, 0xE4, 0x30, 0x89, 0xCF, 0x0C, 0xA5, 0x22,\n    0x8F, 0x78, 0x5F, 0xAA, 0x69, 0x50, 0xF6, 0xB9, 0x61, 0xA1, 0x3E, 0x1C, 0x65, 0x15, 0xD1, 0x50,\n    0x4B, 0xDF, 0xD0, 0xA0, 0x87, 0xC2, 0xF8, 0xB2, 0xAA, 0x00, 0xB6, 0xFD, 0x7A, 0x4E, 0xA6, 0xEA,\n    0xD8, 0xCE, 0x22, 0x3C, 0x41, 0xFA, 0x6A, 0x05, 0xCA, 0x5F, 0xEC, 0x98, 0x4E, 0xFC, 0xF1, 0x06,\n    0x5E, 0x07, 0xF3, 0x98, 0x73, 0xCF, 0xBD, 0x17, 0xF5, 0xB5, 0x5B, 0x52, 0x29, 0xEF, 0xCC, 0xAE,\n    0x8C, 0x8F, 0x6C, 0xB0, 0x82, 0x9D, 0x1C, 0x15, 0x62, 0x4C, 0xFC, 0x99, 0xFD, 0x3D, 0xD1, 0x7F,\n    0x13, 0xFD, 0x8A, 0xD1, 0x96, 0x50, 0x98, 0x2D, 0x30, 0xE8, 0x57, 0x07, 0xFC, 0xD0, 0x06, 0x24,\n    0xB5, 0x7A, 0xC6, 0xBE, 0xAA, 0x1E, 0xBF, 0xFF, 0xC6, 0x6C, 0x24, 0x70, 0xB7, 0x59, 0xC3, 0xDB,\n    0xC1, 0x3A, 0x79, 0x6F, 0x83, 0xCB, 0x55, 0x84, 0x7E, 0x04, 0xF8, 0xDB, 0x7D, 0x41, 0xAF, 0x5D,\n    0xDB, 0x5A, 0xE6, 0xCE, 0x9B, 0x66, 0x6F, 0x38, 0xF4, 0xEA, 0x20, 0x09, 0x75, 0x75, 0xCD, 0xF8,\n    0x62, 0x74, 0x7E, 0x4A, 0x3E, 0x2E, 0xAE, 0xCC, 0x8D, 0x49, 0xBC, 0xCC, 0x34, 0xE9, 0x9B, 0xC7,\n    0x05, 0x81, 0x9C, 0xBA, 0x00, 0xF2, 0x83, 0xC5, 0xE4, 0x78, 0x85, 0xD0, 0xC5, 0xF3, 0x0F, 0xB0,\n    0x18, 0x30, 0x9B, 0xA3, 0x62, 0x92, 0x72, 0xD5, 0xEA, 0xE1, 0xC0, 0x5B, 0xDA, 0x0C, 0xBC, 0x19,\n    0x46, 0x7F, 0x03, 0xC8, 0x7B, 0x31, 0x13, 0x1B, 0xA0, 0x91, 0xB4, 0x99, 0xC1, 0x9D, 0xB8, 0xE5,\n    0x33, 0xD9, 0x41, 0x53, 0x19, 0x97, 0x99, 0x27, 0x8C, 0x8E, 0x5B, 0xAA, 0x17, 0x85, 0x42, 0xA9,\n    0x47, 0x1C, 0x19, 0x33, 0xCB, 0x88, 0xBE, 0xF4, 0x48, 0x43, 0x66, 0xEB, 0x9F, 0xF6, 0x94, 0x2C,\n    0xC2, 0x74, 0xF8, 0xD7, 0x9B, 0xEB, 0x2F, 0x2F, 0xF3, 0x52, 0x1F, 0x45, 0x9D, 0x9E, 0xB4, 0x86,\n    0x76, 0xAB, 0x43, 0xB9, 0x52, 0x0C, 0x0A, 0x06, 0xD7, 0xF2, 0xA5, 0xFE, 0x9C, 0x0D, 0x8A, 0xE0,\n    0xA4, 0xEA, 0x65, 0x3F, 0x2B, 0x7C, 0x03, 0x31, 0x3A, 0x40, 0x97, 0xA8, 0x56, 0xA2, 0xAD, 0x63,\n    0x7A, 0xE5, 0xDC, 0xFD, 0x8D, 0xA9, 0xF3, 0x55, 0xB5, 0x14, 0xB7, 0x51, 0xBA, 0x00, 0x32, 0x43,\n    0x25, 0xEB, 0x61, 0x78, 0xA6, 0x2A, 0xEA, 0x9D, 0x15, 0x72, 0x5D, 0xD0, 0x0E, 0x0C, 0xB4, 0xC1,\n    0x4B, 0x10, 0x9A, 0xFB, 0x1B, 0x54, 0x33, 0x8D, 0x3A, 0x0B, 0x43, 0x51, 0x6C, 0x22, 0xB8, 0x29,\n    0xC5, 0x11, 0x1F, 0x28, 0xF5, 0x82, 0x5F, 0xCF, 0x0A, 0xB0, 0xBF, 0xDA, 0x90, 0x13, 0xCE, 0x69,\n    0xFF, 0x05, 0x85, 0x9D, 0x80, 0xF3, 0x3D, 0x4B, 0x21, 0xAB, 0xED, 0x73, 0xB9, 0xC4, 0xAD, 0x70,\n    0xEA, 0x17, 0x20, 0x78, 0xCA, 0xCC, 0x4E, 0x47, 0xCA, 0x30, 0xA8, 0xDB, 0x1C, 0x7B, 0x46, 0x3C,\n    0xC0, 0xE2, 0x96, 0xF8, 0x60, 0xDD, 0x43, 0xFE, 0x41, 0x7C, 0xD2, 0x7B, 0xB9, 0x90, 0x97, 0xF6,\n    0x86, 0x62, 0xD5, 0xF3, 0x49, 0x78, 0x81, 0xCF, 0x0C, 0xF1, 0x30, 0xC7, 0x37, 0x16, 0xDE, 0xB4,\n    0x93, 0x6A, 0xE0, 0x9F, 0x5B, 0x17, 0x43, 0x69, 0x7E, 0x54, 0xBB, 0x83, 0x4F, 0x1B, 0xA9, 0x70,\n    0x41, 0x97, 0x5A, 0x5D, 0x6E, 0x51, 0x1F, 0xEA, 0xDF, 0x44, 0xFB, 0x2D, 0x1E, 0xB9, 0xF9, 0xA4,\n    0xCE, 0x11, 0xD5, 0x6C, 0x43, 0xF5, 0xD1, 0x23, 0x7B, 0x7E, 0x30, 0x4B, 0x82, 0xF4, 0x3F, 0x9C,\n    0x53, 0xF5, 0xC8, 0xF6, 0xA1, 0xAB, 0x39, 0xD2, 0x01, 0xD5, 0xEA, 0x01, 0xFF, 0x75, 0xFD, 0x23,\n    0x63, 0xBE, 0x4C, 0x70, 0xC0, 0xF6, 0x78, 0xED, 0x83, 0x79, 0x19, 0x33, 0x58, 0xEA, 0x73, 0xC4,\n    0xE9, 0x0E, 0xF6, 0x89, 0x3C, 0xD4, 0x0C, 0xF6, 0xBE, 0xAC, 0x81, 0x32, 0x70, 0x24, 0x7D, 0xEA,\n    0x70, 0xBF, 0xC4, 0x45, 0x56, 0x8C, 0x49, 0x91, 0xA4, 0x04, 0x76, 0x84, 0x5B, 0x43, 0x11, 0x72,\n    0x74, 0x1C, 0xF5, 0xEB, 0x93, 0x42, 0x87, 0x1D, 0x6B, 0x16, 0x9F, 0xAD, 0xCA, 0x9B, 0xD3, 0x1F,\n    0x78, 0x1A, 0x0A, 0xC5, 0x7D, 0x44, 0xD2, 0xDE, 0x91, 0x0C, 0x3E, 0x12, 0x74, 0xDF, 0x92, 0xF7,\n    0x96, 0xD3, 0x6E, 0x76, 0xD6, 0x98, 0x48, 0x78, 0x77, 0x92, 0xC9, 0x45, 0xD8, 0x75, 0xB3, 0x84,\n    0xDC, 0x1A, 0x2A, 0x0E, 0xAF, 0xD8, 0xB2, 0x6D, 0x88, 0x60, 0xEE, 0x77, 0x4A, 0xFE, 0x4B, 0xC1,\n    0x2E, 0x27, 0x4C, 0x4F, 0x31, 0x51, 0x5B, 0x92, 0x75, 0xC2, 0x41, 0x7F, 0xB0, 0x43, 0x09, 0xC7,\n    0xBA, 0xB0, 0xB3, 0x9B, 0x27, 0x3D, 0xD4, 0x10, 0x59, 0xD3, 0x4F, 0xB8, 0x7C, 0xFF, 0xC8, 0x4C,\n    0x06, 0xCA, 0xB4, 0x5C, 0x37, 0xA4, 0xCD, 0x12, 0x60, 0x5C, 0x15, 0xB2, 0xA2, 0xAA, 0x81, 0x1A,\n    0x17, 0x7D, 0xD9, 0xF6, 0x31, 0xD6, 0xEB, 0xE7, 0xE7, 0x16, 0x85, 0x36, 0x3C, 0xE3, 0x57, 0x76,\n    0xAC, 0x35, 0xE3, 0xEC, 0x0F, 0xB7, 0x9B, 0xD5, 0xD1, 0x8E, 0x63, 0x7F, 0x1A, 0xB8, 0x23, 0x02,\n    0x50, 0x62, 0x06, 0xBF, 0xE5, 0x14, 0x2D, 0xED, 0xF0, 0x68, 0xEF, 0x8B, 0x82, 0x35, 0x29, 0x8A,\n    0xE1, 0x64, 0x14, 0xFB, 0xAA, 0x4B, 0xE3, 0x2B, 0x91, 0x6A, 0x1D, 0x8E, 0xB2, 0x60, 0xC1, 0xC4,\n    0x5A, 0x0B, 0xA5, 0xD6, 0xA1, 0xE8, 0x91, 0x97, 0xA1, 0x51, 0xBD, 0x81, 0xD0, 0xB5, 0x7F, 0x69,\n    0x4A, 0xA8, 0x5D, 0xB5, 0x36, 0x55, 0x22, 0xE2, 0x7E, 0x1C, 0x53, 0xE2, 0x5B, 0x57, 0x17, 0x62,\n    0x96, 0xC8, 0x7E, 0x31, 0xCB, 0xE0, 0xC6, 0x71, 0x5E, 0xC1, 0xB9, 0xD6, 0x54, 0x22, 0x49, 0xEF,\n    0xDD, 0x50, 0xB0, 0x88, 0xC0, 0x0F, 0x16, 0xE7, 0xD6, 0xBA, 0x9A, 0x08, 0xAC, 0xD6, 0x78, 0xDA,\n    0x80, 0xDF, 0x7D, 0x69, 0x97, 0xD4, 0xA7, 0x97, 0xFA, 0xDF, 0x76, 0x54, 0xE4, 0x3B, 0x1D, 0xF1,\n    0x98, 0xC4, 0x68, 0xA6, 0xE8, 0x0B, 0x27, 0xE1, 0x0C, 0x2C, 0xC2, 0x8F, 0x88, 0xB3, 0x31, 0xFF,\n    0x3A, 0xDB, 0x90, 0x1C, 0x59, 0x2A, 0x88, 0x54, 0x26, 0x7E, 0xCB, 0xFF, 0x73, 0x99, 0xE5, 0xCF,\n    0x31, 0x8B, 0x69, 0xDB, 0x8F, 0x28, 0x4D, 0x3B, 0x2F, 0x63, 0xC8, 0xEB, 0x61, 0x3E, 0x95, 0xBC,\n    0x8B, 0x5C, 0x1C, 0xCA, 0xED, 0x43, 0xDF, 0x1A, 0x94, 0xF4, 0xF1, 0xF2, 0x7D, 0x37, 0x71, 0xC2,\n    0x28, 0xE7, 0xFE, 0x69, 0x69, 0x3B, 0x6D, 0x31, 0x3A, 0xE7, 0x0F, 0x26, 0xCE, 0xCD, 0x19, 0xA5,\n    0xE0, 0x66, 0x29, 0x54, 0x65, 0x43, 0x43, 0xB9, 0x22, 0x86, 0x0E, 0x2E, 0xD5, 0x63, 0x55, 0xA8,\n    0x78, 0x05, 0x54, 0xE3, 0x1E, 0xEC, 0x01, 0x67, 0xB4, 0x22, 0xFC, 0x18, 0xDB, 0x53, 0x6F, 0x97,\n    0xC0, 0xEB, 0x58, 0x57, 0x49, 0xDC, 0xBD, 0x76, 0xCA, 0x00, 0x46, 0xE3, 0x7F, 0x4D, 0x53, 0xAC,\n    0xDC, 0x77, 0xF3, 0xAF, 0x4F, 0x5A, 0x85, 0xC8, 0x37, 0x2B, 0x41, 0x63, 0x6F, 0xD7, 0x25, 0x61,\n    0x6D, 0x09, 0x9C, 0xEB, 0x43, 0xE2, 0xE8, 0x49, 0x72, 0xCD, 0x8E, 0x1C, 0xD0, 0x8E, 0xD3, 0x96,\n    0x1F, 0x98, 0xAA, 0x2B, 0xF6, 0x47, 0x4D, 0x92, 0x2A, 0xAA, 0x41, 0xA5, 0xA9, 0x71, 0xFE, 0x6C,\n    0x43, 0x7E, 0xB8, 0x21, 0x4A, 0x58, 0xA4, 0xF7, 0x5D, 0xF8, 0x44, 0xC4, 0xE8, 0x9A, 0xA7, 0xB9,\n    0xAC, 0x97, 0xD4, 0x8D, 0xA6, 0xC4, 0x04, 0x43, 0x30, 0x21, 0x54, 0x16, 0x92, 0x49, 0x77, 0x7D,\n    0xEA, 0xD1, 0x1F, 0xB4, 0x75, 0xF4, 0x1F, 0x73, 0xD0, 0xEA, 0x0F, 0xA6, 0x60, 0x4B, 0xE9, 0xDE,\n    0x79, 0x4C, 0xFF, 0xD9, 0xAB, 0x9D, 0xA6, 0x92, 0xE8, 0x64, 0x25, 0x2F, 0x75, 0x97, 0x5C, 0x7A,\n    0x7E, 0xF1, 0x5A, 0xE1, 0x6D, 0xD7, 0x16, 0x5A, 0x42, 0x83, 0x43, 0xDD, 0x8D, 0x22, 0xEB, 0xEE,\n    0x63, 0xB0, 0x73, 0x67, 0x83, 0x1E, 0xF8, 0x7C, 0xB6, 0x5B, 0xA5, 0xF9, 0xD1, 0xFF, 0x8A, 0xAD,\n    0x9A, 0x75, 0x4A, 0x3D, 0x37, 0x67, 0x40, 0x78, 0xD5, 0x2A, 0xB3, 0xBE, 0xF3, 0x66, 0x3F, 0x51,\n    0x94, 0x79, 0x2D, 0x98, 0xB7, 0x29, 0x81, 0x9B, 0xC3, 0xC4, 0x28, 0x38, 0xB3, 0x99, 0x84, 0xBA,\n    0x50, 0x15, 0x66, 0x68, 0x40, 0x3D, 0xCD, 0xAF, 0x3B, 0xF3, 0x1F, 0xD1, 0xE4, 0x17, 0x80, 0x74,\n    0xE3, 0x14, 0xBF, 0xB3, 0x3D, 0xC3, 0xC2, 0x07, 0x1E, 0x74, 0x57, 0x96, 0xDF, 0xE4, 0x62, 0xBA,\n    0x4C, 0x57, 0x47, 0x0A, 0x09, 0xC2, 0x46, 0x81, 0xF5, 0xBB, 0x77, 0x34, 0x49, 0x3B, 0xBB, 0x02,\n    0xDC, 0xF1, 0x15, 0x99, 0x15, 0xB8, 0xF0, 0xD2, 0x28, 0xD5, 0xC8, 0x79, 0xAB, 0xAF, 0xF8, 0x83,\n    0xE3, 0x57, 0x9A, 0x5E, 0xC0, 0x0C, 0x72, 0x2E, 0xD8, 0xB7, 0xDE, 0xAB, 0x27, 0x49, 0xEC, 0x4E,\n    0x8E, 0xB0, 0x49, 0x65, 0xDD, 0x2F, 0x56, 0xA4, 0xBE, 0x04, 0x90, 0x9C, 0xCA, 0x76, 0x5F, 0x59,\n    0x94, 0x99, 0x5F, 0x97, 0xFD, 0xA7, 0x38, 0xD2, 0x7F, 0x53, 0xBC, 0x7B, 0x0F, 0x6F, 0xC9, 0xE5,\n    0x3A, 0x0F, 0x94, 0x2C, 0xBA, 0x85, 0x6D, 0xAE, 0xF7, 0x21, 0x6A, 0x64, 0xFD, 0xAA, 0x65, 0xD8,\n    0x30, 0xB3, 0x0A, 0x6C, 0x91, 0xC6, 0xB6, 0x29, 0x8D, 0x68, 0xC7, 0x1A, 0x06, 0x9C, 0x58, 0x30,\n    0x3C, 0xF2, 0xC6, 0x15, 0xD3, 0x8A, 0xC9, 0xA0, 0x4D, 0x56, 0x88, 0xC7, 0xC2, 0x4E, 0x47, 0x87,\n    0x9F, 0x20, 0x13, 0x6C, 0xEF, 0xC4, 0x6D, 0x31, 0x47, 0xB3, 0xEB, 0xBC, 0x61, 0x11, 0xE1, 0xA1,\n    0xD8, 0x6E, 0x2B, 0x5C, 0xC1, 0xFD, 0xC3, 0x75, 0xBF, 0x70, 0xBC, 0x77, 0x4E, 0x47, 0x65, 0xE5,\n    0xEC, 0xDD, 0x70, 0x24, 0x63, 0xA9, 0xD6, 0x9C, 0xA9, 0x0C, 0x86, 0xDB, 0xC0, 0x3D, 0x96, 0x65,\n    0xA4, 0x9D, 0x89, 0xF1, 0xB1, 0x65, 0x16, 0x29, 0x3E, 0x8C, 0x97, 0xC0, 0x73, 0xED, 0xD1, 0x96,\n    0x84, 0x17, 0x8D, 0x66, 0x8E, 0x7F, 0x47, 0xD1, 0x64, 0x7F, 0x83, 0x54, 0xE6, 0xD3, 0xA0, 0x6E,\n    0xB7, 0xB0, 0xA5, 0x7E, 0x8E, 0xFE, 0xBD, 0xA9, 0xDE, 0x0B, 0x7E, 0xE9, 0x68, 0x82, 0x2B, 0x59,\n    0xF2, 0xA2, 0x45, 0x86, 0x84, 0xEF, 0x04, 0x18, 0x6E, 0x5F, 0x5D, 0x21, 0xED, 0x8B, 0xAE, 0x65,\n    0x0A, 0xC4, 0xD0, 0xD8, 0x2A, 0x9E, 0x81, 0x85, 0x78, 0x2B, 0x4E, 0x11, 0x47, 0xC6, 0x60, 0x31,\n    0x63, 0xB1, 0x9A, 0xEB, 0x55, 0x34, 0x98, 0x27, 0x9E, 0xCC, 0x7D, 0x28, 0x1B, 0xF9, 0xFF, 0x4D,\n    0x14, 0xF1, 0x48, 0x88, 0x8C, 0x26, 0xDE, 0x1F, 0xF3, 0xE0, 0xCB, 0xD1, 0x4A, 0x06, 0x0C, 0xE0,\n    0x79, 0x07, 0x6F, 0x01, 0xF6, 0x0F, 0x7B, 0x6E, 0x9E, 0x21, 0x0A, 0x7C, 0x8D, 0xDC, 0xAB, 0xE9,\n    0xDB, 0xCB, 0xC8, 0x68, 0x4F, 0x20, 0xBB, 0xDB, 0xF6, 0x3A, 0xEC, 0xD4, 0x52, 0x6F, 0xDF, 0xFF,\n    0x39, 0xAB, 0x30, 0xF9, 0xBF, 0xCB, 0xC6, 0xC6, 0x63, 0x6B, 0xFE, 0x38, 0xF8, 0x50, 0x56, 0x00,\n    0x23, 0xF9, 0xB7, 0x33, 0xE2, 0x93, 0x0A, 0x4A, 0xA1, 0x20, 0x85, 0xEC, 0x88, 0x0E, 0x83, 0x57,\n    0x25, 0x38, 0x91, 0x48, 0x99, 0x0D, 0xAA, 0x28, 0xEA, 0xBF, 0x66, 0x01, 0xC5, 0x08, 0xFF, 0xC6,\n    0x78, 0x37, 0x36, 0x51, 0x0B, 0xF0, 0x63, 0x74, 0xC5, 0x3E, 0x14, 0x9C, 0xE4, 0x4B, 0x3A, 0x71,\n    0x02, 0x96, 0x3F, 0x56, 0xF0, 0x9C, 0xCA, 0x9C, 0xAB, 0xA7, 0x86, 0x7E, 0xB0, 0x9E, 0xFB, 0x58,\n    0xDE, 0xE5, 0x6E, 0x47, 0xEE, 0x80, 0x39, 0x52, 0xD9, 0xCA, 0xE6, 0xC9, 0xA7, 0x9C, 0x89, 0xB0,\n    0x52, 0x68, 0xAB, 0x4B, 0x3F, 0x86, 0xD3, 0x11, 0xE6, 0xFC, 0x2C, 0x77, 0x8C, 0x5C, 0x6E, 0x19,\n    0xD8, 0x53, 0x95, 0xA4, 0x46, 0x08, 0xAC, 0x7D, 0x5D, 0xFB, 0xDE, 0x6C, 0x4D, 0x45, 0xA3, 0x41,\n    0x9D, 0xCE, 0xC5, 0xB1, 0x49, 0xBD, 0x06, 0xF6, 0x74, 0x2F, 0x82, 0xF6, 0x91, 0x4D, 0xDE, 0x8A,\n    0x2D, 0xD8, 0xAF, 0x17, 0xFB, 0xC8, 0x85, 0xE2, 0x19, 0x39, 0xDD, 0x1B, 0x58, 0x2B, 0x4F, 0xB6,\n    0xED, 0x32, 0x35, 0xF6, 0xEB, 0x12, 0xCE, 0x7F, 0xD1, 0x3C, 0xF1, 0x6E, 0xC4, 0xE5, 0xBA, 0x6E,\n    0x92, 0xF7, 0x36, 0xF0, 0x84, 0xB3, 0x36, 0xFE, 0x89, 0x4C, 0xFE, 0xA7, 0x9D, 0x73, 0x98, 0x28,\n    0xBB, 0x01, 0x5A, 0x9B, 0x76, 0x6C, 0x82, 0x81, 0x55, 0x3B, 0xA9, 0x42, 0xD7, 0x7A, 0x37, 0x0C,\n    0x3E, 0x1D, 0x6D, 0xB6, 0xF8, 0xD7, 0xA5, 0xAC, 0x5A, 0xBF, 0x83, 0x16, 0x10, 0x2B, 0x2F, 0x25,\n    0x2D, 0x28, 0x7F, 0xD3, 0xB4, 0xC3, 0x54, 0x1D, 0x7E, 0x36, 0xF1, 0x00, 0x80, 0xD5, 0x50, 0xA0,\n    0xB7, 0x81, 0xAB, 0x6E, 0xA9, 0xEF, 0x7F, 0xB2, 0x1E, 0xA5, 0xE4, 0x62, 0x06, 0x49, 0xB3, 0xA8,\n    0x61, 0xD2, 0x6C, 0xED, 0x4B, 0xF7, 0xAD, 0xD3, 0x4C, 0x1F, 0x23, 0xB1, 0x5B, 0x54, 0x1B, 0xA5,\n    0xAA, 0x5F, 0x92, 0x6D, 0x6D, 0x23, 0xB2, 0x5F, 0x73, 0xC5, 0x1A, 0x1E, 0xD9, 0x17, 0xE5, 0x19,\n    0xAF, 0x30, 0x9B, 0x77, 0x0D, 0xF5, 0xC4, 0xAF, 0xDF, 0x57, 0x72, 0x25, 0xAE, 0xA6, 0x63, 0xFD,\n    0xB3, 0xAF, 0x73, 0x1B, 0x37, 0x12, 0x1F, 0x4C, 0x62, 0x93, 0xC3, 0x3B, 0x07, 0x59, 0xEA, 0x82,\n    0xB5, 0x4D, 0xCF, 0x90, 0xC7, 0x36, 0x08, 0xA4, 0xE7, 0x69, 0xE5, 0xF9, 0x6E, 0x84, 0x68, 0x6D,\n    0x2A, 0x00, 0x27, 0x3B, 0x7E, 0xD4, 0x34, 0x6B, 0x1B, 0xFB, 0x0C, 0x8F, 0xF4, 0x03, 0x31, 0x39,\n    0x79, 0x07, 0x53, 0x04, 0x54, 0xFA, 0x6E, 0x23, 0x0D, 0x95, 0x6D, 0xF9, 0x7D, 0xCA, 0x1B, 0x08,\n    0xDE, 0xD9, 0xC0, 0xFE, 0x99, 0x76, 0x8A, 0xE4, 0x41, 0x33, 0x6F, 0x83, 0xC1, 0x55, 0xDA, 0xE7,\n    0x23, 0xA4, 0x56, 0x0A, 0xC5, 0x06, 0x1E, 0x0D, 0xB1, 0x7F, 0x5B, 0xDB, 0x9A, 0xE5, 0x39, 0x28,\n    0x3B, 0x41, 0xC6, 0x22, 0xAC, 0x23, 0x09, 0x43, 0x3B, 0x16, 0xFF, 0x02, 0xC9, 0x3D, 0xC3, 0x53,\n    0x0E, 0xF9, 0xDB, 0x8A, 0x3B, 0xA0, 0xF5, 0xCC, 0x89, 0x2D, 0x59, 0xFF, 0xB1, 0x39, 0xB1, 0xB4,\n    0x0E, 0x9C, 0x98, 0x8F, 0x27, 0xF7, 0x6F, 0x91, 0x8B, 0x53, 0x67, 0x8B, 0xA2, 0x5E, 0xC0, 0x17,\n    0x84, 0x3C, 0x76, 0xD2, 0xB8, 0x9A, 0x10, 0x8D, 0x0B, 0xAE, 0x3E, 0xA9, 0x51, 0x50, 0xC1, 0x94,\n    0x05, 0xB2, 0x8B, 0x88, 0x67, 0xFE, 0x76, 0x0F, 0xAF, 0xD6, 0x88, 0xFD, 0x38, 0x9F, 0xF8, 0xA9,\n    0x27, 0xB8, 0xB3, 0x99, 0x97, 0x1A, 0xD6, 0x82, 0x8E, 0x92, 0x8E, 0x85, 0x7B, 0x85, 0xD4, 0x94,\n    0xF8, 0x4F, 0x9A, 0xF1, 0xC8, 0xE6, 0x9A, 0x1F, 0xC8, 0xA3, 0xD7, 0x87, 0xAD, 0x0C, 0xF8, 0x34,\n    0x00, 0x7E, 0x30, 0xCC, 0xBE, 0x8E, 0xD9, 0x44, 0xF3, 0xBF, 0x98, 0xCF, 0xBF, 0x0F, 0x78, 0xBA,\n    0x39, 0xD7, 0x20, 0x94, 0x46, 0x4A, 0xE2, 0x8A, 0xB0, 0x22, 0x5C, 0x8E, 0x43, 0xF8, 0xC3, 0x1D,\n    0x4F, 0x6B, 0x4A, 0x14, 0x26, 0x9A, 0xD3, 0x10, 0xD4, 0xD3, 0x99, 0xB6, 0xD4, 0xC8, 0x6A, 0x8E,\n    0x5D, 0x45, 0x09, 0x14, 0x30, 0x28, 0xE6, 0x75, 0xCB, 0x4C, 0x28, 0xB7, 0x27, 0x36, 0x6D, 0x4F,\n    0xFE, 0x25, 0xCB, 0xD5, 0xAF, 0x0B, 0xA1, 0x61, 0x77, 0x7C, 0x64, 0x28, 0xDB, 0x74, 0x65, 0x2C,\n    0xA7, 0x88, 0x3F, 0xF8, 0xA0, 0xFC, 0xD3, 0xCF, 0x99, 0x4B, 0xE8, 0xDE, 0xB7, 0x16, 0xA2, 0x80,\n    0x16, 0x8F, 0xBB, 0x53, 0x27, 0x72, 0x6B, 0x53, 0xAB, 0x80, 0xAB, 0x37, 0xE8, 0x7C, 0x16, 0x31,\n    0xA9, 0x81, 0xDF, 0x36, 0xD3, 0x69, 0xD9, 0xA1, 0xA9, 0x4B, 0x8F, 0x1F, 0x85, 0x64, 0x6E, 0x4D,\n    0x39, 0x79, 0x47, 0x87, 0xF3, 0x0B, 0xB9, 0xF9, 0xE1, 0xF7, 0x6E, 0x5F, 0x29, 0x0B, 0x32, 0xEE,\n    0xBA, 0x79, 0x01, 0x34, 0x1F, 0x1C, 0xF0, 0x03, 0xEE, 0x96, 0x2F, 0x76, 0x4E, 0x2E, 0x0F, 0xD1,\n    0x8B, 0x94, 0x61, 0x9B, 0x33, 0x16, 0xFD, 0xA7, 0x37, 0x6F, 0x6D, 0x6C, 0x5B, 0xCA, 0xA4, 0x9F,\n    0x19, 0x69, 0x4E, 0x17, 0xEC, 0x02, 0xE6, 0x49, 0xAA, 0x7E, 0x8E, 0xC0, 0xE9, 0x15, 0x54, 0x2F,\n    0xA6, 0x01, 0xE9, 0x27, 0x9F, 0x2E, 0x9D, 0x85, 0x4D, 0xFF, 0x3E, 0x78, 0x0B, 0x14, 0xAC, 0x19,\n    0x78, 0x30, 0xCF, 0xA0, 0x24, 0x01, 0x7B, 0x1D, 0x82, 0x43, 0x02, 0xAC, 0xF7, 0x6C, 0x0C, 0xA9,\n    0xC7, 0x74, 0xE3, 0x8E, 0x15, 0xC1, 0xF2, 0xAD, 0x9D, 0x58, 0xDA, 0x50, 0x93, 0x69, 0x4F, 0x74,\n    0x5A, 0xD2, 0xB5, 0xA0, 0x06, 0x08, 0x9D, 0xC0, 0x0F, 0x27, 0x2B, 0x19, 0x82, 0x41, 0x27, 0x32,\n    0x66, 0xBC, 0xAA, 0x4E, 0x90, 0x44, 0x88, 0x33, 0x6E, 0x60, 0xBC, 0x7C, 0xDA, 0x29, 0x04, 0x94,\n    0x19, 0xF7, 0xD8, 0x5E, 0x99, 0x7F, 0xEF, 0xA8, 0xBD, 0x3A, 0xE0, 0x6A, 0xB6, 0xA8, 0x00, 0x15,\n    0x29, 0x04, 0xF1, 0x41, 0x3F, 0x2B, 0xF7, 0x59, 0x3E, 0x8E, 0xAB, 0x8D, 0x84, 0x26, 0x2D, 0xC2,\n    0xAD, 0xA7, 0x33, 0x6C, 0x08, 0xCA, 0xB4, 0x8A, 0xF8, 0x5E, 0xD7, 0x6A, 0x5B, 0x92, 0xCE, 0x70,\n    0x23, 0x01, 0x54, 0x88, 0xDB, 0xD7, 0xF5, 0x24, 0xED, 0xA8, 0x49, 0xDB, 0x5C, 0x4C, 0x25, 0xE1,\n    0xBB, 0xC7, 0x5E, 0x0D, 0x05, 0x0B, 0xD0, 0x26, 0x4F, 0x1D, 0xE4, 0xD6, 0xEB, 0x38, 0x30, 0xC5,\n    0x3F, 0x50, 0xB1, 0x46, 0x91, 0x01, 0x7A, 0xE3, 0x01, 0xD1, 0x17, 0x29, 0x4B, 0x56, 0x34, 0xAC,\n    0x72, 0xA0, 0xA5, 0x0C, 0xBB, 0x69, 0x93, 0x3D, 0x39, 0xE4, 0x8A, 0x94, 0x2C, 0xD9, 0xD0, 0x24,\n    0x24, 0x1C, 0x60, 0xA9, 0x79, 0xD6, 0xF2, 0x33, 0xBD, 0xB3, 0x7A, 0x61, 0x55, 0x7F, 0x66, 0xEF,\n    0xC5, 0xC8, 0xE7, 0x60, 0xFC, 0xA5, 0xAF, 0x44, 0x34, 0x7E, 0x30, 0x17, 0xC5, 0xB1, 0xC4, 0x35,\n    0xC7, 0x62, 0xBF, 0xA4, 0x6C, 0xD9, 0xD2, 0x86, 0xD7, 0xD7, 0x48, 0x5C, 0x8A, 0x67, 0x76, 0xFF,\n    0xBE, 0x34, 0x5B, 0x4E, 0x20, 0xD9, 0x9F, 0xB9, 0xD4, 0x94, 0x30, 0x22, 0x6B, 0xA9, 0x01, 0xBC,\n    0x7B, 0xEF, 0x35, 0xBD, 0x7D, 0x18, 0x68, 0x5B, 0x1D, 0x4A, 0xF5, 0x11, 0x57, 0x1D, 0xE3, 0x66,\n    0x8C, 0xA8, 0x40, 0xD9, 0xFA, 0x55, 0xB8, 0x83, 0xE9, 0x2C, 0xDE, 0x0E, 0xBA, 0xE2, 0x16, 0xEF,\n    0xA6, 0xE3, 0x5E, 0xA6, 0xD9, 0x1F, 0x17, 0x97, 0xCE, 0x78, 0xAC, 0x8A, 0xA0, 0x5C, 0x51, 0x2D,\n    0xF4, 0xDE, 0xCE, 0x14, 0x57, 0xA0, 0x3A, 0x36, 0x0C, 0xAB, 0xF9, 0xEB, 0xC0, 0x91, 0x57, 0xED,\n    0x21, 0x3D, 0x39, 0x87, 0x61, 0x93, 0x8E, 0x3E, 0x55, 0x3A, 0x7A, 0x2F, 0x1B, 0xA1, 0x00, 0x89,\n    0xB5, 0xF7, 0x1C, 0xE0, 0x08, 0x74, 0x00, 0xD8, 0x9B, 0x4A, 0x74, 0x37, 0xE6, 0x24, 0xDB, 0x7B,\n    0xAE, 0xA9, 0xF8, 0x92, 0x35, 0x44, 0x3A, 0x0B, 0xDB, 0xB7, 0xED, 0x65, 0xAA, 0x5F, 0x7F, 0xE3,\n    0x35, 0xD5, 0x2D, 0x24, 0x74, 0x53, 0xA6, 0x1D, 0x55, 0x60, 0x1F, 0xB6, 0x22, 0x9C, 0x14, 0xBA,\n    0x63, 0x52, 0x7F, 0x88, 0xF9, 0x90, 0xBC, 0xE9, 0xDB, 0x80, 0xB5, 0x00, 0x2B, 0x12, 0x50, 0xE4,\n    0x10, 0xC9, 0xBB, 0x18, 0x76, 0x06, 0x8A, 0x93, 0xD3, 0x0B, 0xE4, 0xCB, 0x2E, 0x5C, 0xA3, 0x42,\n    0xC5, 0xFF, 0xCF, 0x9D, 0x53, 0xD1, 0x6B, 0xE7, 0x10, 0x7D, 0x9F, 0x3C, 0xC3, 0xF9, 0xB1, 0x5B,\n    0x8A, 0x15, 0x56, 0x63, 0xD5, 0x27, 0x40, 0x1E, 0x01, 0x1A, 0xDC, 0x0C, 0x6B, 0x7D, 0x42, 0x91,\n    0xDD, 0x63, 0x9D, 0x1A, 0xA9, 0xA8, 0xB0, 0xC5, 0xE4, 0x4A, 0x79, 0x4B, 0x04, 0x29, 0xDF, 0x22,\n    0x59, 0xC1, 0xF3, 0xAB, 0x09, 0x00, 0x51, 0xEE, 0x3A, 0x96, 0xE1, 0x7B, 0xDB, 0xC2, 0x36, 0x41,\n    0x60, 0xB1, 0x84, 0x74, 0x76, 0xB4, 0xA0, 0xD2, 0x2F, 0x95, 0x5A, 0x89, 0x42, 0xB7, 0x57, 0xCD,\n    0xFB, 0x3E, 0x5B, 0x33, 0xDC, 0x0A, 0x62, 0x18, 0x0F, 0x98, 0x71, 0x9B, 0xE6, 0x74, 0x19, 0x39,\n    0xF6, 0xFF, 0x69, 0x4B, 0x5C, 0x24, 0x18, 0xF9, 0x3A, 0xD5, 0x70, 0x1F, 0x7B, 0x5D, 0xAC, 0x01,\n    0xE9, 0xFE, 0xC2, 0x9E, 0xB5, 0x28, 0xB2, 0xFF, 0x5A, 0xCB, 0xA2, 0x1A, 0xF2, 0xEA, 0x7D, 0xA0,\n    0x7A, 0xCC, 0x89, 0xEB, 0x0A, 0x1C, 0x81, 0x2B, 0x8F, 0xF3, 0x2D, 0xF5, 0x67, 0x58, 0xF9, 0x10,\n    0x3A, 0x8F, 0x9E, 0x0A, 0x04, 0xAD, 0x7F, 0xB2, 0x2D, 0xCB, 0xCC, 0x3D, 0x84, 0x38, 0x46, 0x1B,\n    0x9A, 0xE1, 0xAA, 0xB2, 0x7E, 0xA7, 0xF3, 0x5E, 0x43, 0x7B, 0x67, 0x7F, 0xC8, 0x0F, 0x45, 0xC0,\n    0xB8, 0xEE, 0xE6, 0x68, 0x16, 0x1E, 0xBF, 0x14, 0xA5, 0xD1, 0xDA, 0x12, 0x7F, 0x42, 0x3B, 0x18,\n    0xD3, 0x85, 0x8A, 0xEB, 0x2A, 0x47, 0xCF, 0xEB, 0x85, 0xFB, 0xA5, 0x10, 0x98, 0x4C, 0x56, 0x4B,\n    0x63, 0x8A, 0x86, 0xD9, 0x98, 0x36, 0xB5, 0x2B, 0x4A, 0xA1, 0xC9, 0x2B, 0x7F, 0xF9, 0xC9, 0x29,\n    0x9C, 0x90, 0xFE, 0x58, 0x2B, 0x85, 0xD8, 0x01, 0x93, 0x0E, 0x2A, 0x5B, 0x0E, 0xCA, 0xD6, 0xB6,\n    0x8F, 0xE1, 0x49, 0x9C, 0x49, 0xEE, 0x83, 0xAD, 0x28, 0x33, 0x94, 0xFB, 0xA9, 0x2B, 0x47, 0x35,\n    0xCF, 0xBD, 0x1F, 0x06, 0xFB, 0x9E, 0x70, 0xA4, 0xEC, 0x26, 0x79, 0x36, 0x3F, 0x67, 0xCF, 0x71,\n    0x61, 0x00, 0x35, 0xD8, 0xB2, 0x3B, 0x03, 0x02, 0xD7, 0x80, 0x69, 0xE3, 0x22, 0x5F, 0x57, 0xD6,\n    0x0A, 0x12, 0x77, 0xBB, 0x51, 0x93, 0xAC, 0xBF, 0x8A, 0xDC, 0x88, 0x48, 0x77, 0x5F, 0xD9, 0x40,\n    0x01, 0x93, 0x83, 0xAD, 0x71, 0x32, 0xFA, 0xF8, 0xF7, 0x1D, 0x81, 0xE2, 0x6B, 0xB9, 0x39, 0xE3,\n    0xB7, 0x4C, 0x22, 0xEA, 0x38, 0x1B, 0xF5, 0x03, 0x9D, 0xBC, 0x5A, 0x81, 0xA5, 0x87, 0xB8, 0x8D,\n    0x91, 0x59, 0xA8, 0xBE, 0xB0, 0x47, 0x68, 0x14, 0x70, 0xC2, 0xE0, 0x65, 0xBA, 0x4B, 0xF4, 0x18,\n    0x7E, 0xDD, 0xDD, 0x6B, 0xE2, 0xE1, 0x95, 0x14, 0xA0, 0x3E, 0x26, 0xA5, 0x43, 0x54, 0x51, 0xFE,\n    0x26, 0x24, 0x90, 0xA3, 0x32, 0xB3, 0xE6, 0xB4, 0x8D, 0xF0, 0x7A, 0x77, 0x76, 0x2E, 0xE1, 0x0B,\n    0x32, 0x44, 0x7B, 0x5F, 0x6B, 0x3F, 0x3C, 0x1E, 0x03, 0x0C, 0x49, 0x6E, 0x22, 0x5B, 0x18, 0x5F,\n    0x49, 0x72, 0xDA, 0x3E, 0xB4, 0xB8, 0xA4, 0xE4, 0xB9, 0xED, 0xAA, 0xC6, 0xAB, 0xB1, 0x69, 0x80,\n    0x55, 0xCD, 0x9C, 0xDF, 0x03, 0xC1, 0x24, 0xEC, 0xA7, 0xA1, 0x8C, 0x15, 0x6C, 0x1B, 0x3B, 0xBA,\n    0xA5, 0xCF, 0xDF, 0x7B, 0x38, 0x81, 0xDF, 0x40, 0xF1, 0xA4, 0x03, 0x7B, 0x57, 0xAD, 0x75, 0x96,\n    0xE9, 0xC2, 0xEE, 0x76, 0x90, 0x81, 0x3E, 0xE8, 0xD3, 0x23, 0x9B, 0x96, 0x3E, 0xF6, 0xF8, 0xFE,\n    0xC5, 0x52, 0xA3, 0xBB, 0x68, 0x98, 0xFF, 0x92, 0xE7, 0xED, 0xC1, 0xDD, 0xF8, 0x6C, 0xC5, 0xBC,\n    0xC4, 0x6A, 0x50, 0x53, 0x95, 0x28, 0x1D, 0x8D, 0x84, 0x90, 0xEE, 0xB0, 0x27, 0x4C, 0xE9, 0x7C,\n    0x2E, 0x46, 0x94, 0xF5, 0xE3, 0xBB, 0xEB, 0x9F, 0x6E, 0xD1, 0x6B, 0x6F, 0x83, 0xCB, 0x2A, 0x5A,\n    0x22, 0xAC, 0x67, 0xE4, 0x5C, 0xF9, 0x57, 0x20, 0x42, 0xA7, 0xA6, 0x89, 0x22, 0x08, 0x68, 0x92,\n    0x64, 0x1B, 0x4B, 0x82, 0xD3, 0x62, 0xE6, 0x80, 0xAC, 0x84, 0x36, 0x19, 0x24, 0x55, 0x02, 0x4C,\n    0x79, 0x32, 0xAD, 0x22, 0xF4, 0xE0, 0x46, 0x7B, 0x8B, 0x96, 0x9A, 0xEC, 0xC7, 0x67, 0xA1, 0x21,\n    0x8F, 0x5C, 0x48, 0xFC, 0x52, 0xC7, 0x33, 0xA8, 0x22, 0xA0, 0x3D, 0x72, 0x44, 0x7E, 0xEB, 0x8F,\n    0x19, 0xBE, 0x54, 0x98, 0x96, 0x91, 0xA2, 0xCA, 0x72, 0xA6, 0xAE, 0x5E, 0xA8, 0xA6, 0xC9, 0x14,\n    0xB3, 0x09, 0xA4, 0x2B, 0x3B, 0xF8, 0x13, 0x13, 0x1D, 0x51, 0xDC, 0x93, 0x37, 0x1B, 0xFC, 0x18,\n    0xF9, 0xA4, 0xFA, 0x57, 0x3E, 0x8D, 0xF7, 0xF0, 0xD8, 0xBF, 0x8D, 0x83, 0x3F, 0x9B, 0x5A, 0x73,\n    0x63, 0x82, 0x56, 0x94, 0x2E, 0x02, 0x62, 0x61, 0x01, 0x3C, 0x20, 0x86, 0x44, 0xCA, 0xF8, 0xB7,\n    0x2D, 0xDA, 0x99, 0x25, 0xD7, 0x16, 0xE1, 0xEB, 0x71, 0xEB, 0x16, 0xBC, 0xEB, 0x2F, 0x93, 0x6D,\n    0x9F, 0xD2, 0xD0, 0xE8, 0xD4, 0xDD, 0x70, 0x8A, 0x2E, 0x82, 0xF6, 0x23, 0xF3, 0x11, 0x53, 0xC5,\n    0xE3, 0x87, 0x06, 0xF9, 0xE6, 0x0A, 0xEE, 0xBA, 0x7B, 0x2C, 0x03, 0xBB, 0x59, 0x60, 0x1E, 0xD2,\n    0x55, 0x43, 0xE6, 0xC1, 0x0C, 0x9E, 0x8A, 0x3A, 0x69, 0xEB, 0x0F, 0x9E, 0x34, 0x3D, 0x48, 0x5D,\n    0xB4, 0xC1, 0xC0, 0xEF, 0x50, 0x0E, 0xC6, 0x4A, 0xFB, 0xAC, 0x5F, 0x05, 0x03, 0x39, 0xDE, 0x3C,\n    0x09, 0xF4, 0x29, 0xC9, 0x62, 0x90, 0xFB, 0x0F, 0x78, 0x66, 0x31, 0x06, 0x2D, 0xE4, 0x1D, 0x4A,\n    0x80, 0xF0, 0x9E, 0x33, 0xBE, 0x89, 0x35, 0x8F, 0x5D, 0xC0, 0x86, 0x0B, 0xCF, 0x4B, 0xE0, 0xF8,\n    0xEF, 0x43, 0x69, 0x3D, 0x0D, 0xF7, 0x74, 0xC0, 0x42, 0x3A, 0x87, 0x44, 0x1D, 0xE4, 0x15, 0x82,\n    0x54, 0x13, 0xCB, 0x05, 0xFD, 0x1D, 0xE1, 0x34, 0x97, 0x91, 0xFB, 0x4B, 0x9F, 0xB8, 0x42, 0xAC,\n    0x9C, 0x97, 0x01, 0x26, 0x38, 0x76, 0xC5, 0x94, 0xCF, 0xA0, 0xA3, 0x18, 0x1D, 0x4C, 0x10, 0x63,\n    0xEE, 0x20, 0x6A, 0xAD, 0xFD, 0x85, 0xCF, 0x00, 0x9E, 0x3D, 0x63, 0xE9, 0x7F, 0x73, 0x30, 0x65,\n    0x39, 0xF4, 0x5C, 0x25, 0xE5, 0x64, 0x80, 0xE3, 0x42, 0x04, 0xCE, 0x25, 0xCB, 0x4B, 0x7C, 0x47,\n    0x09, 0x76, 0x1B, 0x92, 0xFA, 0x1E, 0x50, 0x66, 0x87, 0x24, 0x9B, 0x12, 0x77, 0x9B, 0xC0, 0x6E,\n    0x26, 0xC8, 0x29, 0x11, 0x29, 0x6E, 0xEC, 0x13, 0x83, 0x7B, 0xD4, 0x73, 0xDE, 0x86, 0x00, 0x08,\n    0xD0, 0xD5, 0xA1, 0xD0, 0xCB, 0xBF, 0x05, 0x1C, 0xBC, 0xBD, 0x6F, 0x65, 0x69, 0x45, 0x22, 0xFF,\n    0xBD, 0x0F, 0x02, 0xC0, 0xFC, 0x9B, 0x68, 0x4A, 0xC0, 0x60, 0xA4, 0x9E, 0x40, 0x50, 0xC5, 0xD2,\n    0x76, 0x08, 0x7E, 0x58, 0xB7, 0xE2, 0x4F, 0xA2, 0xCB, 0x0B, 0xA2, 0x56, 0x10, 0xAF, 0x40, 0xA9,\n    0xF1, 0x89, 0x77, 0xD6, 0xE8, 0xD5, 0x07, 0x9A, 0x77, 0x4D, 0x44, 0xFE, 0x18, 0x71, 0xCC, 0x4D,\n    0x1A, 0x20, 0x5C, 0x1B, 0x44, 0x7B, 0x1E, 0xB4, 0x25, 0x2C, 0xDF, 0xE5, 0x47, 0xD4, 0xA0, 0xC7,\n    0xB1, 0x2E, 0xDA, 0xFA, 0xB1, 0x76, 0xBB, 0xFD, 0xA0, 0x02, 0xEB, 0x4D, 0x04, 0x00, 0xCA, 0xAF,\n    0x45, 0x83, 0x58, 0xC6, 0x52, 0x71, 0x5A, 0x3D, 0x3C, 0xF7, 0xF2, 0x29, 0xA6, 0xA2, 0xA4, 0xF3,\n    0xC0, 0x30, 0xE0, 0x61, 0xB2, 0x55, 0x78, 0x2C, 0x57, 0x84, 0xB4, 0x33, 0xB3, 0xF8, 0xD9, 0x57,\n    0x81, 0x37, 0xA7, 0xC1, 0x14, 0x3F, 0x1C, 0x9B, 0x0B, 0x44, 0x99, 0xDB, 0x7C, 0x0E, 0x87, 0xF2,\n    0xAC, 0xA6, 0x71, 0xFD, 0xC9, 0x29, 0x2E, 0x3C, 0x67, 0x2C, 0x7F, 0xB2, 0xF7, 0xCB, 0x07, 0x82,\n    0x54, 0xC8, 0x92, 0x1A, 0x94, 0xEB, 0x46, 0x96, 0x7D, 0xBB, 0x08, 0x70, 0x8C, 0x8E, 0x5F, 0x7F,\n    0x2F, 0xAF, 0xAA, 0xF3, 0x6A, 0x2B, 0xA9, 0xF8, 0xDC, 0x92, 0x20, 0x9F, 0xC5, 0xFC, 0x18, 0xED,\n    0x03, 0x85, 0xB1, 0x86, 0xF2, 0x74, 0x93, 0x81, 0x5D, 0x07, 0x48, 0xE4, 0xED, 0xDC, 0x67, 0x4F,\n    0x12, 0xA0, 0x3B, 0x2A, 0x85, 0x4C, 0x04, 0xC7, 0xFA, 0x87, 0xC1, 0x25, 0x20, 0x96, 0x17, 0x5D,\n    0x89, 0xC4, 0x0E, 0x36, 0x9B, 0xA6, 0x92, 0x70, 0xFC, 0xF5, 0x1A, 0x5C, 0xAD, 0xED, 0xD8, 0xFD,\n    0xDD, 0x67, 0xC6, 0x3A, 0xF0, 0x5B, 0x16, 0xDF, 0x4E, 0x3F, 0xBF, 0xF9, 0x47, 0x9F, 0x01, 0x47,\n    0x73, 0xE1, 0x5A, 0x38, 0x7E, 0xC0, 0xA9, 0x18, 0x70, 0x00, 0x88, 0xFF, 0x21, 0x2B, 0x12, 0xF4,\n    0xC5, 0x4E, 0xC6, 0x80, 0x7D, 0xC4, 0x11, 0xB9, 0xC3, 0xF9, 0x5C, 0x69, 0x2A, 0x60, 0x6F, 0xE0,\n    0xC6, 0x79, 0x3D, 0x15, 0xC2, 0xE7, 0x23, 0xDA, 0xFB, 0x9B, 0xAB, 0x13, 0x1D, 0x6D, 0xBD, 0xC2,\n    0x6F, 0x3D, 0xF7, 0x44, 0xBD, 0x51, 0xF8, 0xA6, 0xD1, 0x47, 0x7D, 0x8C, 0xA8, 0x52, 0x56, 0xF7,\n    0x01, 0x04, 0xD5, 0x22, 0xE8, 0x16, 0x21, 0x61, 0x27, 0xC8, 0xE2, 0xF9, 0xA1, 0x55, 0x44, 0x5F,\n    0x8F, 0xC3, 0x22, 0x22, 0x3A, 0xCA, 0x2B, 0x05, 0x31, 0xCF, 0x88, 0x8E, 0x3B, 0xB0, 0x99, 0x1C,\n    0xAA, 0x96, 0xF9, 0xDB, 0x41, 0x91, 0x64, 0x0E, 0xE1, 0xF1, 0xE0, 0xB0, 0x50, 0x62, 0x5D, 0x6B,\n    0x36, 0xA7, 0x59, 0xD9, 0x2B, 0x77, 0x36, 0xA2, 0x18, 0xF4, 0x67, 0x74, 0xB8, 0x09, 0x88, 0x91,\n    0x38, 0x9A, 0x01, 0x7D, 0xDE, 0xDF, 0xC3, 0xBB, 0x08, 0x59, 0xE9, 0xAD, 0xA0, 0xEE, 0xC0, 0x4B,\n    0xC2, 0xBC, 0xB0, 0xAB, 0x4C, 0x32, 0xCB, 0x92, 0xC9, 0x97, 0x0D, 0xCF, 0x43, 0x83, 0x9D, 0xED,\n    0x40, 0x98, 0x8E, 0x1B, 0x2D, 0x67, 0x68, 0x7C, 0x68, 0x8A, 0x38, 0x71, 0xC8, 0xCB, 0x81, 0x32,\n    0x95, 0x86, 0x9E, 0x77, 0x5F, 0x9E, 0x85, 0xEE, 0x63, 0xC6, 0x41, 0x49, 0xD2, 0x98, 0xB0, 0x52,\n    0x41, 0xDE, 0x59, 0x54, 0x41, 0x64, 0x6F, 0xE5, 0x1E, 0x73, 0x15, 0xA6, 0x21, 0x51, 0x4A, 0x66,\n    0xAC, 0xB3, 0x0B, 0x69, 0x4C, 0xA3, 0xE5, 0xFA, 0xE5, 0xE3, 0xA9, 0xF5, 0x9A, 0x3A, 0x54, 0x04,\n    0x82, 0x89, 0xF0, 0x33, 0x8F, 0x5C, 0x0E, 0x1E, 0x80, 0x17, 0x8A, 0x0E, 0x2F, 0xF8, 0x2D, 0xF3,\n    0x84, 0xDE, 0xA7, 0x76, 0x1F, 0x4A, 0x39, 0xCA, 0x6C, 0x8E, 0xA6, 0x27, 0x4B, 0x8C, 0xC8, 0xE3,\n    0xFF, 0x60, 0xD9, 0xE0, 0xC2, 0x90, 0xD7, 0x8E, 0x28, 0xA4, 0xD4, 0xC9, 0xA9, 0x05, 0x27, 0xD1,\n    0x7D, 0x0C, 0xEA, 0x9F, 0x4B, 0x45, 0xC5, 0x34, 0xDA, 0xE4, 0xAC, 0x51, 0x23, 0xCC, 0xB0, 0x76,\n    0x41, 0x91, 0x92, 0x6B, 0x7E, 0x19, 0xDD, 0x7C, 0x8D, 0x3D, 0xB9, 0xA1, 0xB3, 0x77, 0xEB, 0xD5,\n    0x62, 0xAF, 0x45, 0x9C, 0xBD, 0x3B, 0xD4, 0x84, 0xAE, 0xA7, 0x8D, 0x3E, 0x47, 0xE1, 0xFB, 0x6C,\n    0xD5, 0x27, 0xC6, 0x39, 0x1F, 0x74, 0x5C, 0x4D, 0x95, 0xE4, 0x7A, 0x79, 0xA9, 0x9D, 0x29, 0x02,\n    0xC0, 0xC8, 0xA1, 0x33, 0xB8, 0xDF, 0x2A, 0x2E, 0xDC, 0x6F, 0x99, 0x9C, 0x49, 0xA3, 0x4C, 0x2A,\n    0x2A, 0xFA, 0x4B, 0x56, 0xE8, 0x84, 0x21, 0xBE, 0x6A, 0xDA, 0x6B, 0x71, 0x98, 0x20, 0x52, 0x32,\n    0xF3, 0xA9, 0xFA, 0x36, 0xC1, 0x42, 0x58, 0x3B, 0xDD, 0x5F, 0x05, 0x73, 0x5F, 0x3A, 0xEB, 0xC9,\n    0x7A, 0x8A, 0x84, 0xC1, 0xDE, 0x50, 0x67, 0x1C, 0x7B, 0x98, 0xCE, 0xD9, 0x9C, 0x12, 0x81, 0x99,\n    0xA5, 0x6B, 0x27, 0x8E, 0x32, 0x43, 0x12, 0xC9, 0xE1, 0x7A, 0x9A, 0x4D, 0xF6, 0x36, 0xAE, 0xF8,\n    0x99, 0x4A, 0xC2, 0x90, 0x77, 0x79, 0xEF, 0x10, 0x1A, 0x4D, 0xD6, 0x71, 0x6F, 0xFB, 0xB8, 0x83,\n    0x4E, 0x3F, 0xF3, 0xF9, 0xE5, 0xEB, 0xEB, 0xF9, 0x6E, 0x1C, 0x89, 0x47, 0x52, 0xED, 0x3F, 0x4D,\n    0xEF, 0x26, 0xA7, 0x3C, 0x4B, 0x46, 0x9A, 0x32, 0x1E, 0x80, 0x70, 0xBC, 0x5C, 0xF2, 0x80, 0x6E,\n    0x62, 0x7C, 0xAE, 0x80, 0xBB, 0x81, 0x82, 0x27, 0xCD, 0xA0, 0x86, 0x34, 0xD0, 0x80, 0x1E, 0x42,\n    0xFE, 0x1B, 0xA4, 0x42, 0xC0, 0x67, 0x4D, 0xBB, 0xFC, 0x08, 0x20, 0x03, 0x6D, 0x62, 0x2F, 0xF2,\n    0x0C, 0x57, 0x77, 0x6A, 0xC1, 0x51, 0x66, 0x74, 0x8D, 0x94, 0xE1, 0xF9, 0xF6, 0xC5, 0x78, 0xCD,\n    0xCC, 0x68, 0xC6, 0x59, 0x2E, 0x3C, 0x94, 0x49, 0x76, 0x74, 0xD8, 0x67, 0x41, 0xF6, 0x30, 0xF2,\n    0x83, 0xF1, 0xA8, 0x31, 0x7B, 0x86, 0x65, 0xED, 0x5F, 0xD3, 0xF3, 0x9A, 0xF3, 0x7C, 0x57, 0x13,\n    0x57, 0x2C, 0x00, 0x49, 0xB6, 0x96, 0xB5, 0x0B, 0x13, 0xE6, 0x2B, 0x17, 0xFA, 0x66, 0xFF, 0x40,\n    0xF9, 0x55, 0xF3, 0x61, 0xB2, 0x85, 0xA6, 0xA7, 0xC3, 0x95, 0xFC, 0x69, 0x48, 0x16, 0x8E, 0x61,\n    0x84, 0x61, 0xCB, 0xF5, 0x5C, 0x51, 0x8E, 0x22, 0xC1, 0x26, 0x3F, 0x65, 0x59, 0xD2, 0x05, 0x23,\n    0xAB, 0xFB, 0x18, 0x09, 0xFF, 0x91, 0x15, 0x21, 0x3E, 0xFD, 0xA3, 0x74, 0x33, 0xB4, 0x32, 0x49,\n    0xA9, 0x3D, 0x73, 0x46, 0xA6, 0xF2, 0x20, 0x4F, 0x93, 0xD8, 0x83, 0xC0, 0xA1, 0x90, 0x28, 0xBD,\n    0x58, 0x94, 0x53, 0x5A, 0xF1, 0x1F, 0xC7, 0x74, 0x9E, 0x6A, 0x6A, 0xD3, 0x11, 0x7A, 0x02, 0x06,\n    0x1F, 0x9C, 0x84, 0x43, 0xAE, 0xE0, 0x92, 0x36, 0xD1, 0x93, 0x81, 0x26, 0xDC, 0x31, 0x6C, 0x0A,\n    0xD7, 0x5B, 0x39, 0xF2, 0x8B, 0xD3, 0xAF, 0xD9, 0x9D, 0xB2, 0xBB, 0x2B, 0xFC, 0x0D, 0x0B, 0x7A,\n    0x71, 0xEA, 0x5E, 0xC9, 0xC5, 0x78, 0xDF, 0xB4, 0x66, 0xAA, 0xB8, 0x49, 0x3E, 0x3C, 0x9D, 0x69,\n    0xA1, 0xC2, 0xED, 0x24, 0xCE, 0xCB, 0x1D, 0x66, 0x05, 0x6B, 0xAF, 0x38, 0x0E, 0xE2, 0x52, 0x26,\n    0x36, 0x9A, 0x78, 0xCC, 0xB1, 0xF5, 0x67, 0xC9, 0xA0, 0x4C, 0x47, 0x82, 0xC0, 0x94, 0xD5, 0x57,\n    0x63, 0xD5, 0xA6, 0x7E, 0x7A, 0x68, 0xCA, 0x62, 0xA1, 0x5D, 0xD5, 0x21, 0x7D, 0x84, 0x1E, 0xA1,\n    0xB5, 0x3A, 0xE3, 0xD4, 0x06, 0x9B, 0xEC, 0xED, 0x19, 0xE3, 0xD3, 0xCA, 0x90, 0x8C, 0xB7, 0x6E,\n    0xDC, 0x1B, 0x58, 0xED, 0x3B, 0x1B, 0x55, 0xE9, 0xAA, 0xED, 0xB9, 0x36, 0x74, 0x46, 0x24, 0xA8,\n    0x30, 0x32, 0xE9, 0x1C, 0x56, 0xFE, 0x80, 0xF6, 0x62, 0x44, 0x99, 0x22, 0x8C, 0xEB, 0x33, 0x8D,\n    0x6F, 0xB2, 0xF9, 0xAA, 0x4D, 0x85, 0x64, 0x9F, 0xCE, 0x9A, 0x02, 0x98, 0x30, 0x94, 0x5F, 0x95,\n    0xD4, 0xD9, 0xDE, 0xC1, 0x3B, 0xC2, 0x74, 0x84, 0xE4, 0x0C, 0x3F, 0xB6, 0xFC, 0x5E, 0xCA, 0x22,\n    0xFE, 0xED, 0xAC, 0x59, 0x08, 0xCD, 0x90, 0x5A, 0xCB, 0x12, 0x8E, 0xE4, 0xD6, 0x87, 0x3B, 0x75,\n    0xB8, 0xB8, 0x8F, 0xFC, 0x20, 0x5F, 0x1B, 0x90, 0xCF, 0x60, 0xF3, 0xF2, 0xBE, 0x86, 0xF4, 0x47,\n    0x50, 0x13, 0xCE, 0xF7, 0xBD, 0x1B, 0x51, 0xE5, 0x75, 0x2A, 0xDB, 0x27, 0xA4, 0x30, 0xF4, 0xE5,\n    0x75, 0xC2, 0x2F, 0x65, 0xC8, 0xAF, 0x65, 0xFE, 0x83, 0x82, 0x1D, 0x3B, 0xA6, 0xA3, 0x62, 0xE7,\n    0x76, 0xD1, 0x03, 0x82, 0x60, 0xB6, 0x50, 0xE5, 0xE0, 0xF1, 0xB6, 0x1F, 0x1C, 0xFE, 0x03, 0x5F,\n    0x33, 0x13, 0xFA, 0x01, 0xF4, 0x56, 0x45, 0xB1, 0xD9, 0x58, 0x8D, 0xC4, 0xE4, 0xAE, 0x68, 0xD1,\n    0x5D, 0xA0, 0x47, 0x4B, 0x3B, 0xCF, 0x60, 0x94, 0xBE, 0x8B, 0xFC, 0xC8, 0x8E, 0x2A, 0x1C, 0xDF,\n    0x09, 0x10, 0x26, 0x92, 0x30, 0x9D, 0x15, 0x67, 0x35, 0xD1, 0xD9, 0xAD, 0x09, 0x50, 0x02, 0xA9,\n    0xC7, 0xD5, 0xCA, 0x8E, 0x88, 0xD7, 0x17, 0x50, 0x0B, 0x76, 0xA4, 0x21, 0xCD, 0xE2, 0x6C, 0xBA,\n    0x36, 0x39, 0x6D, 0xB4, 0xD0, 0xFA, 0x8A, 0x67, 0x68, 0x3D, 0xF1, 0x8D, 0x3A, 0xB7, 0x61, 0x06,\n    0x2A, 0x9D, 0x3B, 0xB0, 0x9B, 0xD1, 0xA1, 0x0A, 0x5A, 0xBD, 0x45, 0xD9, 0x06, 0x17, 0xFD, 0x24,\n    0x63, 0x7E, 0x21, 0x76, 0x85, 0x9B, 0x56, 0x4E, 0x5A, 0xDA, 0x98, 0x2C, 0x63, 0x4C, 0x01, 0xC3,\n    0x1E, 0xE9, 0xA7, 0xEB, 0xB8, 0x8E, 0xE2, 0x2B, 0xB4, 0xFF, 0x6B, 0x09, 0x61, 0xFB, 0xE9, 0xCC,\n    0xDA, 0xE9, 0xEC, 0xA5, 0xFF, 0x43, 0x68, 0x7E, 0xFE, 0x4D, 0x69, 0x49, 0xF7, 0xF2, 0x99, 0xBD,\n    0x56, 0x18, 0xB6, 0x79, 0x98, 0x40, 0x6D, 0xC1, 0x60, 0xF8, 0x09, 0x14, 0x4C, 0xBD, 0xD3, 0xB8,\n    0xF3, 0x0A, 0x7C, 0xF2, 0x98, 0x58, 0x61, 0xA6, 0x30, 0x95, 0xEA, 0xB8, 0x91, 0xF2, 0xD0, 0x30,\n    0x68, 0x62, 0x25, 0xEF, 0xFC, 0x4F, 0xC3, 0x5A, 0x40, 0x3C, 0xC9, 0xCE, 0xD9, 0x31, 0xA4, 0xBB,\n    0x27, 0x59, 0xAA, 0x30, 0xD8, 0x71, 0xD2, 0x95, 0xDC, 0x76, 0x57, 0xCE, 0x35, 0x1B, 0x51, 0x04,\n    0x7F, 0x42, 0x3C, 0xF5, 0x3A, 0xC8, 0xE7, 0x15, 0x36, 0x8E, 0x69, 0x1F, 0x5E, 0x08, 0x40, 0x0E,\n    0x63, 0x12, 0x92, 0x1E, 0x78, 0xF4, 0x49, 0xD0, 0x0A, 0x90, 0xBE, 0x41, 0x3B, 0xBC, 0x8B, 0x50,\n    0x89, 0xFC, 0x88, 0x6C, 0x3C, 0x00, 0xFC, 0xC0, 0x3A, 0x52, 0x59, 0x42, 0xA9, 0xC4, 0x35, 0x71,\n    0x7E, 0x5D, 0x73, 0x53, 0x28, 0xD7, 0xA4, 0x58, 0x09, 0x52, 0x0F, 0xF1, 0xD5, 0xCB, 0xD6, 0x3C,\n    0x6C, 0x5E, 0xF6, 0xF3, 0x0F, 0xE6, 0x07, 0xF0, 0x25, 0xB0, 0x76, 0x5A, 0xF0, 0x53, 0x70, 0xFB,\n    0xF3, 0x3A, 0xDE, 0x52, 0x97, 0x4C, 0x1F, 0x34, 0x7B, 0xEE, 0xD9, 0x4C, 0xFF, 0xAD, 0x53, 0xC6,\n    0xBA, 0x74, 0x82, 0x21, 0x81, 0x2E, 0x00, 0x19, 0x32, 0xAA, 0x3E, 0x52, 0x0E, 0x53, 0x40, 0x1A,\n    0x63, 0xC4, 0x74, 0xF5, 0xA2, 0x33, 0x2D, 0xAB, 0x3F, 0xE4, 0x56, 0xFE, 0x1D, 0x91, 0xF3, 0x8F,\n    0x46, 0x21, 0x10, 0x1D, 0x38, 0x3D, 0x71, 0x85, 0x6C, 0xD3, 0x44, 0xDA, 0x3D, 0x7C, 0x69, 0xEB,\n    0x92, 0xDF, 0xE1, 0x6C, 0x82, 0x88, 0xF5, 0x15, 0x2D, 0xB2, 0x0F, 0x2D, 0xBF, 0x56, 0x6E, 0x8A,\n    0xC8, 0x87, 0x20, 0xA2, 0xA7, 0xBC, 0xFF, 0x2A, 0x4A, 0x1F, 0x2C, 0x5B, 0x0A, 0x84, 0x41, 0x82,\n    0xDE, 0xE2, 0x64, 0x0B, 0x42, 0xA6, 0x76, 0x44, 0x93, 0xDC, 0xD6, 0xDF, 0x26, 0x95, 0x89, 0xEF,\n    0x76, 0x74, 0x34, 0x93, 0x45, 0x49, 0xB1, 0xB4, 0x0B, 0x2F, 0xF6, 0x6F, 0xE0, 0xC9, 0x99, 0x47,\n    0xB1, 0x76, 0x1A, 0xBD, 0x7E, 0xCD, 0x04, 0x7E, 0xBA, 0x50, 0xA6, 0xB7, 0xC8, 0x31, 0x2C, 0x16,\n    0x0E, 0xB9, 0x8A, 0x96, 0xC4, 0x45, 0xB4, 0x06, 0xCE, 0xFF, 0x73, 0x80, 0xED, 0x24, 0xD0, 0x9E,\n    0xA9, 0x24, 0x1B, 0x79, 0x25, 0xA9, 0x3D, 0x86, 0x19, 0x68, 0xBF, 0x31, 0x83, 0x3C, 0x12, 0xB0,\n    0x5B, 0x23, 0x3B, 0x07, 0x23, 0x81, 0xAF, 0xDD, 0x62, 0xE8, 0x55, 0x2D, 0x36, 0xA5, 0x16, 0xB1,\n    0xA4, 0xFB, 0x20, 0x1A, 0x10, 0x3A, 0x0E, 0x7E, 0x97, 0xFC, 0x29, 0x06, 0x78, 0xC1, 0x63, 0xB3,\n    0x6F, 0x64, 0xBE, 0x70, 0x8B, 0x43, 0x70, 0xEB, 0xEB, 0xE9, 0xEF, 0x7C, 0xC3, 0x59, 0x1B, 0xCC,\n    0xAB, 0x5B, 0xE0, 0xBF, 0xF4, 0xC6, 0xD4, 0xE5, 0x07, 0xCF, 0xAB, 0x5E, 0xE8, 0x2F, 0x68, 0xD9,\n    0xF6, 0x3A, 0x36, 0x08, 0xE3, 0xF6, 0xAE, 0x7B, 0xC5, 0x7A, 0xF1, 0x16, 0xC8, 0x46, 0x59, 0xEA,\n    0xD9, 0xAD, 0x65, 0x74, 0xE7, 0x63, 0xA8, 0xF4, 0x5E, 0x01, 0x91, 0xE7, 0xEB, 0xA2, 0x0B, 0x92,\n    0x3C, 0x28, 0x50, 0x9A, 0x54, 0x76, 0x4A, 0xEC, 0x38, 0x0E, 0x52, 0x02, 0xF4, 0xC8, 0x82, 0xC5,\n    0x7D, 0x2D, 0x39, 0x6B, 0x30, 0xB3, 0x68, 0x87, 0x7B, 0x0A, 0x5C, 0x14, 0xDF, 0x5D, 0xF9, 0xF8,\n    0x7E, 0x81, 0x6D, 0x76, 0x27, 0x78, 0x33, 0xBC, 0x9B, 0x9E, 0xEE, 0xDD, 0xFB, 0x24, 0x1B, 0xBD,\n    0x49, 0x4B, 0x5E, 0xEA, 0xC9, 0xDD, 0x2A, 0x04, 0x2D, 0xEB, 0xB3, 0xBD, 0x22, 0xDC, 0x61, 0xC3,\n    0x95, 0xB7, 0x95, 0x92, 0xDC, 0x32, 0x39, 0xC0, 0x18, 0xC1, 0x43, 0x3B, 0x20, 0x20, 0x32, 0x0A,\n    0xB0, 0x51, 0x70, 0x21, 0x59, 0x64, 0x8E, 0x35, 0xFA, 0xD6, 0xF8, 0x75, 0x56, 0x59, 0x96, 0xA8,\n    0xEE, 0x3F, 0xF1, 0x49, 0x64, 0xF1, 0x8F, 0x7C, 0x2B, 0xB9, 0x74, 0xC0, 0x03, 0x55, 0xBF, 0x95,\n    0x9C, 0x31, 0x80, 0xDA, 0x37, 0x61, 0x99, 0x28, 0x8A, 0x45, 0x38, 0xF4, 0x23, 0xC7, 0x55, 0x13,\n    0x79, 0x01, 0xE2, 0x1D, 0xFC, 0x76, 0x64, 0x20, 0x4B, 0x63, 0x74, 0x0B, 0x40, 0x8C, 0x11, 0x52,\n    0xBF, 0xD1, 0x1C, 0xAF, 0x32, 0xAD, 0x92, 0x11, 0x50, 0x61, 0x57, 0x1A, 0xDD, 0x7A, 0x4B, 0x54,\n    0xC3, 0x57, 0x2A, 0xC3, 0xF6, 0x4C, 0xDF, 0x82, 0x6B, 0x5E, 0xD9, 0x7F, 0x06, 0x52, 0x1D, 0xE3,\n    0x78, 0x4E, 0x6C, 0xC3, 0x14, 0x73, 0xF1, 0x10, 0x7D, 0xDC, 0xBE, 0xE0, 0x30, 0x75, 0xCF, 0x24,\n    0x18, 0x44, 0xA2, 0x61, 0xC5, 0x36, 0xD8, 0x44, 0x5E, 0x57, 0x3A, 0x2C, 0xFA, 0xDF, 0x6F, 0x0B,\n    0x75, 0x69, 0xB7, 0x82, 0x53, 0x78, 0x23, 0x8A, 0x46, 0x65, 0xFF, 0x04, 0xC8, 0xBF, 0x7D, 0xF0,\n    0x79, 0xDE, 0x36, 0x78, 0x2B, 0xDF, 0x30, 0x16, 0x25, 0x71, 0xDC, 0xE3, 0x02, 0xD7, 0x49, 0xF7,\n    0x08, 0xB4, 0x9B, 0xC1, 0xEE, 0x73, 0xA5, 0x35, 0x43, 0x9E, 0xB0, 0xEA, 0x11, 0x82, 0xC4, 0xC0,\n    0x14, 0x1D, 0x00, 0xDC, 0xB4, 0x43, 0x41, 0xC2, 0x22, 0xA3, 0xBD, 0x1B, 0x41, 0xEF, 0x9E, 0x3F,\n    0x3A, 0x50, 0x8E, 0x0E, 0xEB, 0x08, 0x5C, 0xAC, 0x66, 0x05, 0x19, 0xF0, 0xCD, 0x3D, 0x84, 0xB8,\n    0x04, 0x0A, 0x22, 0x69, 0xD2, 0xE1, 0x41, 0x9A, 0x9B, 0xFA, 0xAD, 0xB9, 0x84, 0x08, 0xFF, 0xEC,\n    0x50, 0x9B, 0xD2, 0x55, 0xF6, 0x21, 0xA8, 0x4A, 0xF7, 0x19, 0xC4, 0xE9, 0x1B, 0xE7, 0xD6, 0x97,\n    0x0F, 0xCB, 0xA3, 0xE1, 0xF5, 0xEB, 0x48, 0x38, 0x8D, 0xCD, 0x6C, 0x14, 0xC8, 0x30, 0xDD, 0xC6,\n    0x3D, 0xA0, 0xDB, 0x46, 0xB1, 0x07, 0x89, 0x38, 0xF7, 0x2E, 0x30, 0x7F, 0xD8, 0x93, 0x92, 0x32,\n    0x0B, 0xD8, 0x8B, 0xC8, 0x5A, 0x1A, 0x60, 0xAC, 0xD1, 0x41, 0xEC, 0xB5, 0xB5, 0xE3, 0x7B, 0xDE,\n    0x3A, 0x33, 0x24, 0x5E, 0x06, 0x85, 0x2B, 0x65, 0x74, 0xBA, 0x40, 0x7D, 0x60, 0x87, 0xD3, 0xBE,\n    0xD9, 0x88, 0xF8, 0x36, 0xA5, 0x83, 0xB8, 0x83, 0x62, 0x44, 0x20, 0x2F, 0xCB, 0xC7, 0xA1, 0x57,\n    0xA8, 0x32, 0x60, 0xAB, 0x97, 0x6F, 0x70, 0x07, 0x2B, 0x41, 0x71, 0xF8, 0xCE, 0xCD, 0x73, 0x4C,\n    0xB9, 0x04, 0x14, 0x9E, 0xC2, 0x5A, 0x6F, 0x14, 0xD0, 0x83, 0x10, 0xAE, 0x2F, 0x67, 0x10, 0x46,\n    0x5F, 0x6D, 0x40, 0xF5, 0x2F, 0x77, 0x50, 0x82, 0x65, 0x16, 0xAB, 0x82, 0x3F, 0xBA, 0xF1, 0xBC,\n    0x53, 0x2D, 0x86, 0xAA, 0x96, 0x40, 0x14, 0x6D, 0x38, 0x4D, 0x37, 0xD0, 0x0E, 0xFF, 0x2D, 0xBE,\n    0x31, 0x04, 0xC3, 0x78, 0x56, 0x28, 0x7A, 0x92, 0xB6, 0xFD, 0x9D, 0x2D, 0x65, 0x1E, 0x90, 0xFE,\n    0x30, 0x0E, 0xC6, 0x7B, 0x08, 0x27, 0x2E, 0xDC, 0x3A, 0xED, 0x07, 0x74, 0xF0, 0xF2, 0x09, 0xE9,\n    0x1D, 0x96, 0x5B, 0xB2, 0x4D, 0x37, 0x41, 0xA9, 0xB4, 0xA3, 0x71, 0x2A, 0xAB, 0x15, 0x4F, 0x31,\n    0x85, 0xC2, 0xD9, 0x10, 0x22, 0x10, 0xFF, 0xAF, 0xD1, 0x08, 0x36, 0x0F, 0x05, 0x2A, 0xA9, 0xE2,\n    0xBA, 0x0E, 0x07, 0xAB, 0xAC, 0x01, 0xCF, 0xC6, 0xB8, 0xE9, 0x61, 0x45, 0xFB, 0x3F, 0x94, 0x5A,\n    0x0C, 0x6D, 0x7B, 0x0E, 0x57, 0x5D, 0x9D, 0xEB, 0x96, 0x0C, 0x1D, 0xC1, 0x13, 0x24, 0x49, 0xB8,\n    0xA7, 0xE9, 0x5C, 0x9E, 0xED, 0xAD, 0xF3, 0x56, 0xED, 0x91, 0xA0, 0xA1, 0x72, 0x51, 0xDE, 0xCD,\n    0xCC, 0x05, 0x89, 0xD4, 0x01, 0xA4, 0x80, 0x0D, 0x4E, 0x5A, 0xA9, 0x5F, 0xEA, 0x71, 0x27, 0x84,\n    0xE6, 0x70, 0x1D, 0xA2, 0xC9, 0x4C, 0x4C, 0x08, 0xAB, 0xD1, 0x73, 0x9B, 0x5D, 0xE0, 0xB7, 0x5D,\n    0xDE, 0x1F, 0x49, 0x75, 0xD1, 0x92, 0x5B, 0x52, 0x58, 0x3A, 0xCE, 0xA0, 0x25, 0x1F, 0xA7, 0xB1,\n    0xF7, 0xDD, 0x68, 0xD5, 0xA7, 0xB6, 0xAA, 0xEC, 0x57, 0x93, 0x61, 0xF5, 0x67, 0x9E, 0x5B, 0x9C,\n    0xB8, 0xE0, 0x0A, 0xC5, 0x34, 0x35, 0x25, 0xDC, 0x4B, 0xC5, 0xCF, 0x20, 0x47, 0x84, 0x53, 0xDD,\n    0x0B, 0x83, 0x70, 0xD6, 0xF7, 0x2C, 0xF3, 0x55, 0x3A, 0x52, 0xBC, 0x48, 0x0F, 0xCA, 0xFD, 0x4F,\n    0x91, 0x79, 0x57, 0xDD, 0x46, 0xB5, 0xF2, 0xA8, 0x16, 0xC0, 0x06, 0x9B, 0xAF, 0x02, 0x12, 0x15,\n    0xB6, 0xB0, 0x48, 0x1E, 0x95, 0xA4, 0x36, 0xBB, 0xD6, 0xF8, 0xBA, 0x1D, 0x70, 0x50, 0x23, 0xA8,\n    0xF6, 0xBB, 0x61, 0x46, 0x91, 0x24, 0x16, 0x4E, 0x02, 0xD8, 0x73, 0x01, 0x78, 0xDD, 0x42, 0x7A,\n    0xA6, 0x4F, 0xFE, 0x94, 0xF6, 0xEA, 0x1E, 0x62, 0xB0, 0xAC, 0xE4, 0x94, 0x09, 0x0D, 0x43, 0xF4,\n    0xA0, 0xA8, 0x7A, 0xAA, 0x1C, 0x28, 0x49, 0xD7, 0xCC, 0x8B, 0x55, 0xF3, 0xD3, 0x99, 0x9B, 0xEC,\n    0x41, 0x6B, 0x86, 0x85, 0x65, 0x1B, 0xC2, 0x2E, 0xD2, 0xF6, 0x46, 0x9F, 0x46, 0xFF, 0x9A, 0x5F,\n    0xAF, 0x6F, 0x22, 0x29, 0x59, 0x40, 0xE4, 0x2D, 0xBE, 0x4A, 0x8E, 0xF0, 0x2B, 0x48, 0x5F, 0xC1,\n    0x76, 0xA5, 0x2F, 0xEE, 0x03, 0xEB, 0xCF, 0xA7, 0x2E, 0xB0, 0x27, 0xD7, 0x49, 0xB1, 0xB4, 0x01,\n    0x46, 0x00, 0x72, 0xCC, 0x98, 0xD7, 0xA3, 0xBC, 0x4E, 0xF1, 0x32, 0x3D, 0xF1, 0x29, 0x98, 0xA4,\n    0x39, 0xD0, 0xD9, 0xD9, 0x2A, 0x99, 0x14, 0x69, 0xE1, 0x99, 0x70, 0xC8, 0xEE, 0x5D, 0xC9, 0xC3,\n    0x92, 0xF3, 0xB6, 0xE7, 0xA7, 0x14, 0xC3, 0xC4, 0xBB, 0x05, 0x44, 0xDD, 0xDC, 0x77, 0xDB, 0x00,\n    0x73, 0xC9, 0x0B, 0x17, 0x38, 0xAF, 0xCB, 0x7E, 0x5F, 0x4D, 0x3F, 0x79, 0x16, 0x10, 0x75, 0x79,\n    0x69, 0x16, 0xAC, 0x7E, 0xAA, 0x73, 0xC7, 0x71, 0xF6, 0x01, 0x45, 0xC2, 0xA9, 0xB8, 0xC2, 0x77,\n    0x88, 0x45, 0x3A, 0xCC, 0x9E, 0x02, 0xF5, 0xCC, 0x58, 0x4B, 0x98, 0x9B, 0xA4, 0x7F, 0x9F, 0xB2,\n    0xE9, 0x8F, 0x0F, 0x21, 0xA2, 0xA3, 0x30, 0x24, 0x96, 0x8E, 0x45, 0xCA, 0x7E, 0x88, 0x92, 0x8A,\n    0x81, 0xC5, 0xB5, 0x84, 0x99, 0x98, 0x2D, 0x97, 0xAF, 0x75, 0x7D, 0x0E, 0xCB, 0x28, 0x96, 0xD5,\n    0x4D, 0xFE, 0xDD, 0x30, 0xE1, 0xC3, 0x19, 0x3D, 0x04, 0x5A, 0xEA, 0x09, 0x82, 0x66, 0x51, 0xE2,\n    0xE9, 0x03, 0xA3, 0xC2, 0xF7, 0x72, 0x7F, 0xE0, 0x13, 0xF6, 0x29, 0x15, 0xE9, 0x51, 0xF3, 0x12,\n    0xE1, 0xB1, 0xC8, 0xC9, 0x4F, 0xE0, 0x44, 0xA7, 0xE8, 0x80, 0x42, 0x82, 0x98, 0x1D, 0xA9, 0x0F,\n    0x17, 0x29, 0xEF, 0xD6, 0xAB, 0x6D, 0x5F, 0x9D, 0xD3, 0x63, 0x61, 0xF3, 0x63, 0x02, 0xC0, 0xF5,\n    0xB5, 0x75, 0x52, 0x9F, 0x0B, 0xED, 0x8E, 0x37, 0x1C, 0xC4, 0x33, 0x02, 0xD8, 0xF5, 0xE4, 0x57,\n    0x0F, 0xD4, 0x7F, 0x07, 0xFB, 0x7B, 0x98, 0x92, 0x71, 0x17, 0x45, 0xB0, 0x03, 0xD3, 0x62, 0xFF,\n    0x65, 0xDC, 0x5B, 0xA4, 0xA1, 0x8A, 0x3F, 0xF8, 0x0F, 0x34, 0xF8, 0xDF, 0x59, 0x60, 0xE4, 0xC1,\n    0x16, 0xC7, 0xAE, 0x46, 0x88, 0x33, 0x9E, 0xE0, 0xD0, 0xB6, 0x21, 0xB6, 0x4B, 0x77, 0xB0, 0x12,\n    0x3A, 0x15, 0x15, 0x21, 0x5E, 0xC7, 0xC5, 0xE3, 0x90, 0x4E, 0x79, 0x96, 0x1C, 0xCA, 0xEA, 0xC3,\n    0x2D, 0x0B, 0x8C, 0xCE, 0x3E, 0x54, 0x7A, 0x44, 0xBA, 0xE4, 0xCC, 0x23, 0x14, 0xEA, 0x73, 0x96,\n    0x88, 0x54, 0x99, 0xD8, 0x7B, 0x10, 0xB8, 0xB9, 0xD2, 0xA4, 0x57, 0x63, 0x35, 0xDB, 0x8A, 0xFB,\n    0xBE, 0x57, 0xA3, 0x9B, 0x0B, 0x39, 0x35, 0x08, 0x03, 0x9A, 0x22, 0x55, 0x04, 0xE2, 0x14, 0xBF,\n    0xA1, 0xCA, 0x15, 0xAC, 0xA6, 0x6E, 0xF7, 0xEC, 0x7B, 0xE4, 0xE7, 0x9C, 0x22, 0x4C, 0x25, 0x77,\n    0x77, 0x23, 0xEF, 0xF8, 0xB3, 0x52, 0x88, 0xB2, 0x85, 0x65, 0xFC, 0xAE, 0xCA, 0xAB, 0x44, 0x77,\n    0x5B, 0x09, 0xC0, 0xC3, 0xB1, 0x46, 0xAF, 0xEB, 0xEF, 0x50, 0xC4, 0x47, 0x0E, 0xAC, 0xEF, 0x22,\n    0xAF, 0x24, 0x53, 0x51, 0x52, 0xB9, 0x55, 0xD7, 0xA8, 0x1A, 0x1A, 0xC5, 0xDC, 0x64, 0xD4, 0x0C,\n    0x15, 0x37, 0x23, 0xC5, 0xD9, 0x2C, 0x02, 0xC5, 0x53, 0x9D, 0xB4, 0x0C, 0x27, 0xB8, 0x00, 0xA3,\n    0x2E, 0x38, 0xAD, 0xE8, 0xD0, 0x52, 0xB0, 0x37, 0x9A, 0xC8, 0x81, 0x33, 0x87, 0x37, 0x0C, 0xB8,\n    0x17, 0x45, 0x8A, 0xAC, 0xB1, 0xEF, 0xA4, 0xA1, 0x10, 0x4E, 0x88, 0x13, 0x10, 0x28, 0xF0, 0x22,\n    0x55, 0x18, 0x96, 0xB1, 0xDC, 0x54, 0x7B, 0xC3, 0x7A, 0xA1, 0x8C, 0x58, 0x14, 0x9D, 0xB4, 0xC5,\n    0x98, 0xA9, 0xBF, 0xB6, 0x27, 0x4F, 0x7A, 0x1C, 0xF4, 0x03, 0x6B, 0x60, 0x91, 0xB0, 0x1E, 0x9A,\n    0x3B, 0x2B, 0x40, 0x30, 0x22, 0x3F, 0x61, 0x16, 0x8E, 0x4D, 0xC0, 0x8F, 0xED, 0xA5, 0x4F, 0x73,\n    0x10, 0x4A, 0xD2, 0x73, 0xC5, 0xF8, 0x95, 0x25, 0xB0, 0xBC, 0x01, 0x14, 0x37, 0x0D, 0x74, 0x45,\n    0xAA, 0xD6, 0x21, 0x4B, 0x7D, 0x55, 0x93, 0x16, 0x02, 0xBB, 0xBD, 0x77, 0x4F, 0xEE, 0xEA, 0x29,\n    0x3C, 0xDF, 0x45, 0x9A, 0x9B, 0x73, 0xBC, 0x01, 0xF7, 0x18, 0x53, 0x1A, 0x73, 0x2B, 0x3F, 0x78,\n    0x69, 0xB8, 0x45, 0x16, 0x9F, 0x76, 0x09, 0x91, 0x04, 0x21, 0x6B, 0x82, 0xCF, 0xFB, 0x0C, 0xF2,\n    0x15, 0x6A, 0xDD, 0x67, 0x2C, 0x21, 0x39, 0x06, 0x13, 0x6C, 0xD7, 0x58, 0x54, 0xBA, 0xAC, 0x8D,\n    0x1A, 0x13, 0x8F, 0x4F, 0xC3, 0xE8, 0x0A, 0xCC, 0xA0, 0x25, 0xC5, 0xBD, 0x49, 0x95, 0x6D, 0x95,\n    0xA8, 0x6F, 0xCA, 0x85, 0x4F, 0xA1, 0x94, 0x45, 0x86, 0xE2, 0xBA, 0xD6, 0xE3, 0xFA, 0x91, 0xF5,\n    0x03, 0xA2, 0x2C, 0xCD, 0x54, 0x37, 0x61, 0xA6, 0x34, 0xE0, 0x8D, 0x1C, 0xD4, 0xC9, 0x31, 0x4B,\n    0x13, 0x04, 0xA6, 0x52, 0xFC, 0x8F, 0x4F, 0x81, 0x0A, 0x15, 0xB0, 0xB0, 0x33, 0x2F, 0x2A, 0xFC,\n    0xFF, 0x95, 0x87, 0x66, 0xFD, 0x19, 0xDE, 0x77, 0x4C, 0xF9, 0x3A, 0x5D, 0x34, 0x5D, 0x47, 0x0B,\n    0x33, 0x55, 0x9B, 0x90, 0x13, 0x2C, 0xE3, 0xD8, 0xA9, 0xDB, 0xAA, 0xA0, 0x4F, 0x7F, 0x20, 0xF6,\n    0x8C, 0x5A, 0x48, 0x8F, 0x88, 0x95, 0x51, 0x11, 0x95, 0x88, 0x13, 0x31, 0x4D, 0x6F, 0xA2, 0x5A,\n    0x1B, 0xE5, 0x16, 0x6E, 0x9C, 0x24, 0xA2, 0x82, 0x69, 0xAC, 0x0A, 0x54, 0x8B, 0x12, 0x64, 0x4D,\n    0xC4, 0x51, 0x7F, 0xEA, 0x4C, 0x44, 0x58, 0xF2, 0xA1, 0x1E, 0xBF, 0x02, 0x15, 0x75, 0x4C, 0x4A,\n    0xEB, 0x4F, 0x77, 0xE5, 0xB1, 0x3C, 0x26, 0x4F, 0x21, 0xB9, 0xAD, 0x70, 0x36, 0x4C, 0x02, 0x10,\n    0x55, 0x29, 0x7C, 0xA1, 0x01, 0x9F, 0xD9, 0x67, 0xAB, 0xEE, 0x93, 0xD5, 0x91, 0xDF, 0xC5, 0x18,\n    0x48, 0x9B, 0x9D, 0x3C, 0xCB, 0xCF, 0x06, 0x21, 0xA7, 0x5B, 0xE5, 0x83, 0x3B, 0x54, 0xCC, 0x04,\n    0x43, 0x63, 0x60, 0x66, 0x60, 0x0F, 0xA2, 0x23, 0xAE, 0xE1, 0x55, 0x78, 0x09, 0x62, 0x51, 0x0F,\n    0xAE, 0xF1, 0xE5, 0xBE, 0xCB, 0x4E, 0x83, 0xB1, 0xB8, 0x45, 0x0E, 0x85, 0x54, 0x69, 0xCC, 0xFD,\n    0x7C, 0x5C, 0x95, 0xBB, 0x46, 0xF5, 0x21, 0xB9, 0x86, 0x8C, 0x71, 0x10, 0xF3, 0x6C, 0x1E, 0xE5,\n    0xBB, 0x5B, 0xCA, 0x38, 0xAE, 0xF1, 0xB8, 0x73, 0xDB, 0x16, 0x30, 0x28, 0xB6, 0x18, 0xB4, 0xF4,\n    0x01, 0x0A, 0x99, 0xCC, 0x01, 0x14, 0x80, 0xC1, 0xC1, 0xED, 0xC4, 0xE3, 0xE6, 0x92, 0x61, 0x7E,\n    0x18, 0x44, 0xB2, 0x41, 0xE6, 0x41, 0xC5, 0xFB, 0x07, 0x75, 0xD3, 0xFB, 0xA7, 0xA9, 0xE7, 0x3B,\n    0xAA, 0xFE, 0xB8, 0x16, 0x34, 0x9B, 0xA9, 0xEB, 0x75, 0xBA, 0xE6, 0x19, 0x21, 0x4B, 0x3E, 0xF9,\n    0xFF, 0xC7, 0x03, 0x22, 0x42, 0xC4, 0x03, 0x38, 0x83, 0xA9, 0xB0, 0xCE, 0xB7, 0x32, 0x8E, 0x99,\n    0x18, 0x8A, 0x3E, 0xC9, 0x38, 0x23, 0x7E, 0x21, 0x0A, 0xBD, 0x2A, 0x07, 0x3C, 0x05, 0xA6, 0x1E,\n    0x5A, 0x56, 0xD8, 0xC8, 0xE7, 0x5F, 0x5D, 0x6D, 0x4F, 0xA6, 0x6F, 0xB6, 0xE1, 0xEE, 0x65, 0x6A,\n    0x9F, 0xA1, 0xD8, 0x69, 0xC0, 0x9E, 0x6D, 0x4F, 0x64, 0x78, 0x34, 0x21, 0x56, 0x46, 0x98, 0xC4,\n    0x23, 0xE7, 0x4D, 0x25, 0x24, 0x50, 0x86, 0xFC, 0xED, 0xB9, 0x32, 0x1D, 0x81, 0x0E, 0xE1, 0xFD,\n    0x01, 0x67, 0x07, 0xD8, 0xF0, 0x15, 0xFC, 0x67, 0x62, 0x24, 0xD7, 0xB3, 0xAE, 0x48, 0x26, 0xE2,\n    0xBD, 0x98, 0x51, 0xE2, 0x28, 0xC7, 0x54, 0x30, 0xC0, 0x7C, 0xFF, 0xA7, 0x8A, 0x43, 0x19, 0xE0,\n    0xEF, 0x17, 0x1D, 0xF2, 0x15, 0xD5, 0x8E, 0x55, 0xAA, 0x8B, 0x98, 0x13, 0xF8, 0xAA, 0xCB, 0xB8,\n    0x44, 0x74, 0x8E, 0x54, 0x38, 0xA9, 0xB7, 0x2E, 0xCE, 0x69, 0xEE, 0x12, 0x13, 0xEB, 0xA4, 0x73,\n    0xE0, 0x22, 0x0D, 0x1D, 0x38, 0xA5, 0x51, 0x68, 0xFC, 0x8D, 0x1F, 0xF8, 0x97, 0xE9, 0xD9, 0xF6,\n    0xC4, 0x0E, 0x19, 0x8C, 0xB8, 0xB4, 0xE0, 0xB7, 0x9C, 0x88, 0x97, 0x45, 0xA5, 0x09, 0xEC, 0x28,\n    0x6C, 0x84, 0xE6, 0xA2, 0x79, 0xD2, 0x82, 0x08, 0x3E, 0xA4, 0xD5, 0x27, 0x6E, 0x2C, 0x00, 0x3B,\n    0x2C, 0x69, 0x5C, 0x9F, 0x23, 0x98, 0x14, 0x44, 0x73, 0x1C, 0x2B, 0x42, 0x69, 0xAE, 0x77, 0xF3,\n    0xA8, 0x8D, 0xC5, 0xA0, 0x75, 0xD6, 0xDF, 0xDA, 0xC1, 0x72, 0x77, 0x5F, 0x25, 0x7A, 0x76, 0x80,\n    0x8C, 0x78, 0x5D, 0xD4, 0x13, 0xA7, 0x4C, 0x72, 0xB8, 0x8C, 0x0F, 0xE1, 0x10, 0xE2, 0x00, 0xBA,\n    0xE9, 0x7A, 0x50, 0x81, 0xDB, 0x60, 0x98, 0x39, 0x90, 0x58, 0x5B, 0x8E, 0xA7, 0x96, 0x56, 0xB5,\n    0x0A, 0xC7, 0x72, 0x5A, 0x26, 0x53, 0x23, 0x99, 0x52, 0xCB, 0xD5, 0xFE, 0xC9, 0xF8, 0xE3, 0x78,\n    0x16, 0x80, 0xFE, 0xCC, 0x6A, 0x4F, 0x4B, 0x0C, 0xCA, 0x72, 0xCC, 0xF7, 0x23, 0xCA, 0x0E, 0x0E,\n    0x5C, 0xD7, 0xA2, 0xA5, 0xA9, 0x8D, 0xC1, 0xE9, 0x73, 0x7B, 0x84, 0xD6, 0x86, 0x49, 0x45, 0xD2,\n    0xD4, 0x05, 0xEB, 0xA8, 0xD2, 0x5A, 0x69, 0x0F, 0xCB, 0x99, 0x39, 0x26, 0xDD, 0x4F, 0xDC, 0x42,\n    0xFD, 0x8F, 0xC8, 0x0B, 0x29, 0xB8, 0x83, 0x3D, 0xB8, 0x96, 0x6C, 0x8A, 0x5E, 0xC5, 0x28, 0x60,\n    0xE3, 0xC8, 0x9F, 0xFA, 0x0C, 0xC7, 0xAB, 0x67, 0x8D, 0x23, 0x0F, 0x35, 0xAB, 0xCF, 0xBF, 0x7D,\n    0xC2, 0xF6, 0x33, 0xC8, 0xED, 0x53, 0x86, 0x77, 0x28, 0x0B, 0xD5, 0x47, 0x3E, 0x17, 0x54, 0x9F,\n    0x49, 0xD7, 0x29, 0x69, 0x57, 0xC0, 0x70, 0xC9, 0x0E, 0xC1, 0x3A, 0x77, 0x4A, 0x91, 0x2E, 0x23,\n    0xF1, 0x13, 0xD0, 0x61, 0x8F, 0xA3, 0x6A, 0xDE, 0x01, 0x6A, 0xC2, 0x4B, 0x8F, 0xCD, 0x5D, 0x98,\n    0x70, 0x6D, 0xAC, 0xE3, 0xFD, 0x17, 0x77, 0x37, 0x81, 0x4C, 0x31, 0xC0, 0x93, 0x74, 0x27, 0x79,\n    0xA3, 0x65, 0x7F, 0x35, 0x31, 0x9F, 0x4E, 0x21, 0x13, 0xCE, 0x7E, 0xAB, 0x01, 0x85, 0x1D, 0x66,\n    0x95, 0xF5, 0x0C, 0x19, 0x8B, 0x06, 0x3D, 0xB3, 0x14, 0xD9, 0x64, 0x2B, 0x46, 0xB5, 0x8A, 0x47,\n    0x0A, 0x98, 0x6D, 0x4E, 0x7C, 0xE6, 0x26, 0xC8, 0xFA, 0xAB, 0x90, 0xFB, 0x4F, 0x04, 0xCC, 0xB2,\n    0x0C, 0x9D, 0x62, 0x45, 0x55, 0x89, 0x4A, 0x55, 0x9B, 0x76, 0x71, 0x1D, 0x90, 0xE4, 0xCF, 0x46,\n    0xFC, 0x2F, 0x92, 0x88, 0x9B, 0xFA, 0xF0, 0xCE, 0xB1, 0x56, 0xB5, 0xD7, 0x65, 0xBF, 0x8A, 0x63,\n    0x5E, 0x0E, 0x05, 0xDA, 0xD9, 0xFF, 0x26, 0xFD, 0x2A, 0xA0, 0x98, 0x70, 0x32, 0xBC, 0xBC, 0x93,\n    0x22, 0x8C, 0x6E, 0xB1, 0x36, 0xE8, 0x9D, 0x7F, 0xBC, 0xDE, 0xDD, 0x0A, 0x3F, 0x6D, 0xEA, 0xA2,\n    0xDA, 0xAC, 0x7B, 0x77, 0x4E, 0x6D, 0x7A, 0x71, 0xEF, 0x49, 0x6E, 0x31, 0xD1, 0xD6, 0xC9, 0x15,\n    0xBA, 0x1E, 0x18, 0x98, 0x92, 0xF1, 0x21, 0x23, 0xC0, 0xB5, 0x9C, 0x37, 0x15, 0x97, 0xA6, 0x48,\n    0x09, 0x6D, 0x46, 0x6C, 0x45, 0x06, 0xC5, 0x27, 0x64, 0x54, 0x78, 0xF5, 0xFF, 0xD3, 0xD3, 0xAE,\n    0xC8, 0x6E, 0xFC, 0x59, 0xB1, 0xD9, 0x26, 0xE8, 0xEE, 0x3C, 0x1D, 0xC7, 0xCF, 0xC0, 0xE0, 0xAB,\n    0xDC, 0x10, 0x74, 0x48, 0xBA, 0xC2, 0xCA, 0xA1, 0x9C, 0xFB, 0x87, 0x99, 0x7A, 0x6B, 0x37, 0x5C,\n    0x6F, 0x9F, 0x97, 0xCB, 0x90, 0x4F, 0xBC, 0x26, 0x15, 0xAC, 0x0D, 0xC6, 0x72, 0xF6, 0x29, 0xF8,\n    0xDD, 0x57, 0x68, 0x46, 0x35, 0x60, 0xD8, 0x16, 0xE7, 0x3F, 0xC7, 0xEC, 0xDE, 0x6B, 0x8C, 0xF0,\n    0x3D, 0x4A, 0x17, 0x58, 0x55, 0xD5, 0xE8, 0xA8, 0x4A, 0x62, 0x48, 0x8B, 0x52, 0xBD, 0x13, 0x00,\n    0xF7, 0x44, 0xD1, 0x78, 0x3C, 0x1D, 0xAC, 0x34, 0xEE, 0xA5, 0x9B, 0xCC, 0x6D, 0xAD, 0x30, 0x31,\n    0xFC, 0x81, 0x91, 0x50, 0x26, 0x2A, 0x48, 0x30, 0x20, 0xB7, 0xAA, 0x87, 0x02, 0x99, 0xB2, 0xE4,\n    0xAC, 0x83, 0x71, 0x59, 0xDC, 0xD9, 0x5D, 0x6C, 0xB1, 0x03, 0x32, 0x97, 0x97, 0xEE, 0xFD, 0xCC,\n    0xC4, 0xF3, 0xDD, 0x94, 0xC6, 0x43, 0xB9, 0xB7, 0x1D, 0x2F, 0x9C, 0x9D, 0x7F, 0x91, 0x51, 0x1A,\n    0x35, 0xAF, 0xD8, 0x50, 0xFB, 0xBF, 0xD0, 0xA0, 0x28, 0x39, 0x6F, 0x47, 0x96, 0x57, 0x7D, 0x52,\n    0x5C, 0xCD, 0xC9, 0x7F, 0xBB, 0x2C, 0x15, 0xFE, 0x2A, 0x3A, 0xFD, 0x23, 0xB2, 0x91, 0x6F, 0xC7,\n    0x3C, 0xB2, 0x91, 0xB9, 0x59, 0xAA, 0x2E, 0x96, 0x45, 0xC5, 0x30, 0xAC, 0x03, 0x42, 0x78, 0xFD,\n    0x46, 0xD2, 0x2F, 0x7A, 0x46, 0x55, 0x26, 0x49, 0x38, 0x4C, 0xA1, 0xD2, 0x78, 0x17, 0xD6, 0x3D,\n    0x00, 0xCB, 0xF7, 0xB2, 0x68, 0x7D, 0x4A, 0xDA, 0x2E, 0x54, 0xF6, 0x6C, 0xCF, 0xDE, 0x8F, 0xF7,\n    0xFA, 0xF8, 0x87, 0x38, 0xCA, 0xEA, 0xD2, 0x1F, 0xED, 0x04, 0xD0, 0xE9, 0x12, 0xCF, 0x11, 0x18,\n    0xAF, 0xF3, 0x4E, 0x13, 0x3D, 0xBC, 0x30, 0xB4, 0x15, 0x71, 0x8B, 0x2D, 0x63, 0xCA, 0x53, 0x8C,\n    0x20, 0x6D, 0x0C, 0x4E, 0xF8, 0x10, 0xD2, 0x1A, 0xC1, 0x0C, 0xE8, 0xCF, 0xE1, 0xA8, 0x93, 0x7E,\n    0x8B, 0x32, 0x9D, 0x47, 0x03, 0x2B, 0x92, 0x27, 0x73, 0xE9, 0x39, 0xBD, 0x9F, 0x7B, 0x76, 0x8B,\n    0x3C, 0x66, 0xA1, 0x3E, 0x4B, 0x69, 0x36, 0x71, 0x93, 0x02, 0x47, 0x5E, 0x3D, 0x8F, 0x28, 0x72,\n    0x15, 0x85, 0x64, 0x1C, 0x8F, 0x2F, 0x58, 0x8F, 0xDD, 0x25, 0x84, 0x70, 0x0A, 0xD4, 0x8A, 0x3A,\n    0x02, 0x08, 0xC6, 0x91, 0xBD, 0xE9, 0xA9, 0x66, 0xD0, 0x9F, 0xE5, 0x2F, 0xCF, 0xA2, 0x94, 0x7E,\n    0xB8, 0x91, 0x31, 0x90, 0xC8, 0x06, 0x9B, 0x91, 0xCD, 0xE7, 0xDD, 0x1D, 0x6F, 0x57, 0x40, 0x59,\n    0x64, 0x95, 0x49, 0xAA, 0xA6, 0x48, 0x2F, 0x09, 0x78, 0xE8, 0xA5, 0xCF, 0x41, 0x8C, 0x23, 0x38,\n    0xEB, 0xA6, 0x93, 0x7F, 0x33, 0xE1, 0x38, 0x02, 0x64, 0x8C, 0x6A, 0x40, 0x93, 0xD0, 0x4D, 0xA9,\n    0x9A, 0x4C, 0xE4, 0x2F, 0x8C, 0xC4, 0xFE, 0x00, 0xB6, 0x6C, 0xD2, 0x55, 0xA8, 0xB6, 0xF1, 0x44,\n    0x43, 0x07, 0x53, 0x38, 0x12, 0xD3, 0xA3, 0x25, 0x76, 0x13, 0x7E, 0x81, 0x39, 0xAB, 0x87, 0x90,\n    0x15, 0xEC, 0x81, 0xC4, 0x37, 0x08, 0x18, 0xDC, 0xED, 0xE5, 0xF0, 0xA5, 0x68, 0x41, 0x52, 0x92,\n    0xFA, 0x53, 0x70, 0xF6, 0xA0, 0xDC, 0xEF, 0xCF, 0x6C, 0x3F, 0xDE, 0x72, 0x33, 0x3F, 0x43, 0x84,\n    0xB0, 0xA0, 0xC5, 0xEF, 0x1B, 0x45, 0x63, 0x00, 0x6B, 0xDA, 0x3E, 0xCD, 0x84, 0x19, 0xD4, 0xD9,\n    0x0D, 0x8C, 0x27, 0xF0, 0x6E, 0xA2, 0x03, 0xD5, 0xFD, 0xD7, 0x8F, 0x43, 0x46, 0x5E, 0x38, 0x91,\n    0x7B, 0x2E, 0xB8, 0x65, 0xCD, 0x16, 0xC2, 0xB9, 0x50, 0x97, 0x1C, 0xAF, 0x3A, 0xE0, 0xA9, 0x44,\n    0xE7, 0xF6, 0x5E, 0x40, 0x41, 0x55, 0xDD, 0x05, 0xD9, 0xFC, 0x50, 0xB1, 0x1D, 0x51, 0xEE, 0xB0,\n    0x8A, 0x52, 0x38, 0x77, 0x59, 0x36, 0xDE, 0xB2, 0xB9, 0x28, 0x07, 0xE0, 0xC8, 0x44, 0x80, 0x6D,\n    0x91, 0x72, 0x65, 0xD8, 0xC6, 0xA2, 0xFF, 0xF6, 0x61, 0x37, 0x22, 0x1B, 0x98, 0x65, 0xF9, 0x96,\n    0xDB, 0xF9, 0x33, 0xE7, 0xAE, 0x25, 0x07, 0xC2, 0x01, 0x54, 0xF3, 0xA3, 0xFD, 0xC8, 0x25, 0x8E,\n    0x7B, 0x7F, 0x49, 0xD1, 0x55, 0xA3, 0x17, 0x58, 0x53, 0xF0, 0x0F, 0xCA, 0x1F, 0x6D, 0xEF, 0x28,\n    0x46, 0x0B, 0x35, 0x21, 0x66, 0x6C, 0x4F, 0x01, 0x79, 0x92, 0xD2, 0x16, 0x3C, 0x2C, 0xBE, 0x88,\n    0x2E, 0x09, 0xC3, 0x8E, 0x8E, 0x62, 0x0F, 0x5E, 0x4D, 0x3C, 0x0C, 0xFE, 0x02, 0x1A, 0x02, 0xB1,\n    0xF4, 0x86, 0xCA, 0x17, 0x0E, 0x57, 0x00, 0x35, 0x6C, 0xA6, 0xBF, 0x29, 0x35, 0x24, 0x78, 0x30,\n    0x90, 0xF3, 0xBE, 0x0B, 0x9D, 0x88, 0x79, 0x14, 0x92, 0x32, 0x8F, 0xA0, 0xC1, 0xF7, 0x98, 0xFA,\n    0x9B, 0x62, 0x70, 0x84, 0xA6, 0x5A, 0xA6, 0x03, 0xD0, 0x9F, 0xE9, 0x6A, 0x9F, 0x3A, 0xD4, 0xB7,\n    0xE2, 0x83, 0x6A, 0x5B, 0x94, 0x44, 0x01, 0x99, 0x2F, 0x7F, 0x59, 0xA9, 0xF2, 0xAD, 0x74, 0x15,\n    0xC7, 0x31, 0x22, 0x13, 0x76, 0xF4, 0x3D, 0x4A, 0x07, 0xA7, 0xC0, 0x89, 0xFC, 0x7A, 0x83, 0x6D,\n    0xB1, 0xF8, 0xA3, 0x1F, 0xB9, 0x3B, 0xCC, 0x81, 0x32, 0x37, 0x65, 0x46, 0x2D, 0xAF, 0x9A, 0x4E,\n    0x96, 0x14, 0x3D, 0x57, 0x9C, 0xF1, 0x92, 0xB3, 0x0E, 0x54, 0x4F, 0xF0, 0xA0, 0x70, 0x66, 0x65,\n    0x36, 0x8D, 0x11, 0xD0, 0xBD, 0xD6, 0xEB, 0x49, 0x76, 0x79, 0xB4, 0xB7, 0x91, 0xAA, 0x21, 0x2D,\n    0xBA, 0x19, 0x1C, 0xDC, 0x90, 0x16, 0xEC, 0xB7, 0x09, 0xFF, 0x1F, 0xC8, 0xE5, 0x75, 0xDB, 0x42,\n    0x35, 0x53, 0x07, 0x77, 0x1F, 0x0C, 0xA3, 0x77, 0xD0, 0xCA, 0xDE, 0xC5, 0xB8, 0x15, 0xA6, 0xAB,\n    0x5E, 0x2B, 0xC9, 0x3A, 0x1B, 0xDC, 0xDB, 0x4F, 0x1C, 0xA7, 0xF7, 0xD7, 0xBF, 0x27, 0x07, 0x0C,\n    0xF7, 0xFD, 0x64, 0xF1, 0xA1, 0x89, 0x50, 0xE8, 0xA5, 0x94, 0x12, 0xBC, 0x0B, 0x82, 0x3A, 0xDB,\n    0xE4, 0xCC, 0x8C, 0x61, 0x5D, 0xB6, 0xD0, 0x38, 0xC6, 0xF2, 0xE3, 0xE8, 0x6E, 0xDE, 0xA8, 0x5E,\n    0x13, 0x05, 0x08, 0x17, 0x1F, 0xE5, 0x04, 0x51, 0x7E, 0xB8, 0x67, 0x55, 0xEA, 0x3F, 0x09, 0x53,\n    0xE0, 0x02, 0xD4, 0xD7, 0xE5, 0x4B, 0x71, 0x0C, 0x28, 0xF0, 0x84, 0x9A, 0x3C, 0x5E, 0x3D, 0xA2,\n    0x79, 0xDE, 0x75, 0x8B, 0xCF, 0xA6, 0x69, 0xDC, 0xAB, 0x13, 0x92, 0xFE, 0xDA, 0xEC, 0x89, 0x7C,\n    0x88, 0x66, 0x94, 0x14, 0xD2, 0xDB, 0xCC, 0x5E, 0x5D, 0x5D, 0xD6, 0x64, 0x85, 0x17, 0x9A, 0x48,\n    0xD3, 0xCC, 0xD7, 0x4C, 0x43, 0x40, 0x13, 0x56, 0x3C, 0x27, 0x28, 0xDB, 0xDF, 0xF9, 0x7D, 0x10,\n    0xE5, 0xB4, 0xAB, 0x62, 0x79, 0x08, 0xFA, 0x9E, 0xCE, 0xB2, 0x92, 0x27, 0x05, 0x8F, 0x6C, 0x7B,\n    0xCD, 0xC6, 0xAD, 0x7A, 0xBD, 0x89, 0x04, 0x21, 0x32, 0x52, 0xF8, 0x5B, 0xB1, 0x53, 0x5C, 0x0B,\n    0x43, 0x0E, 0xD2, 0x2D, 0x13, 0xC9, 0xFD, 0x33, 0xB7, 0x5D, 0x91, 0xC5, 0xC8, 0x33, 0xB8, 0xDD,\n    0x29, 0x9D, 0x5D, 0xC4, 0x5A, 0xF9, 0x4A, 0x1A, 0xAF, 0x3F, 0x40, 0x0D, 0x53, 0x64, 0x85, 0x51,\n    0xC4, 0xCD, 0xA3, 0x2E, 0x68, 0x57, 0xFD, 0x4E, 0xF6, 0x43, 0x8F, 0x7D, 0x2E, 0x3D, 0x44, 0x14,\n    0xB0, 0xF1, 0xB3, 0x65, 0x95, 0x3E, 0x20, 0xE1, 0x19, 0xCC, 0xFB, 0x54, 0xA7, 0x89, 0x7F, 0xF4,\n    0xD7, 0x4D, 0x61, 0x00, 0xA0, 0x9C, 0x97, 0x03, 0xA0, 0x0E, 0x95, 0xCD, 0xF4, 0xF5, 0xF9, 0xCA,\n    0x2E, 0x3F, 0x23, 0x86, 0xFE, 0xCF, 0xAA, 0x70, 0x26, 0x8E, 0x80, 0x7F, 0xBC, 0x71, 0x16, 0x40,\n    0x92, 0x4D, 0xB3, 0xF7, 0x82, 0x55, 0x60, 0x20, 0xA2, 0x79, 0x88, 0x55, 0x52, 0xD2, 0xD8, 0x62,\n    0x1B, 0x4B, 0xBD, 0x3D, 0x95, 0x35, 0x3B, 0x90, 0x98, 0xE5, 0x90, 0x83, 0xB9, 0x68, 0xF0, 0xD3,\n    0xFF, 0x20, 0xB9, 0x19, 0xCB, 0xE1, 0xD6, 0x30, 0x69, 0xDF, 0xEB, 0x59, 0xDF, 0x89, 0x77, 0xD1,\n    0x49, 0x8C, 0x5A, 0x4E, 0x8D, 0xD9, 0x63, 0xAF, 0xAA, 0x2E, 0xF1, 0x93, 0x9C, 0xAA, 0xB2, 0x7D,\n    0x6C, 0x2C, 0x69, 0x1E, 0xDA, 0x9C, 0x24, 0xAA, 0x56, 0x66, 0x19, 0x03, 0xBE, 0x21, 0x9D, 0xF4,\n    0x36, 0x65, 0x5A, 0x02, 0x6B, 0x91, 0x41, 0xF7, 0x07, 0x68, 0x26, 0xEA, 0x33, 0x1A, 0x79, 0x9D,\n    0xEF, 0x7A, 0xAF, 0x9B, 0x66, 0x8B, 0xA2, 0xA7, 0x8C, 0x17, 0x33, 0xA0, 0x64, 0x2D, 0x3E, 0x84,\n    0xBC, 0x13, 0x74, 0x52, 0xF9, 0x25, 0x22, 0x67, 0x9A, 0xC3, 0x8C, 0x04, 0x56, 0x66, 0xD6, 0x55,\n    0xB7, 0xF5, 0x50, 0xDC, 0x22, 0xB6, 0x0D, 0x80, 0x49, 0xD9, 0xC8, 0x48, 0x3C, 0xEB, 0x37, 0x42,\n    0x9E, 0x2F, 0xE4, 0xD5, 0xA3, 0xD5, 0xBF, 0xD9, 0xBC, 0x3D, 0x99, 0x03, 0xBE, 0x0C, 0x53, 0x18,\n    0x93, 0x0D, 0xCE, 0x59, 0xB4, 0x08, 0xFA, 0x93, 0x93, 0xAD, 0xEC, 0x24, 0xC1, 0x76, 0x07, 0x06,\n    0xFB, 0x78, 0x93, 0x40, 0xB0, 0x40, 0x7C, 0xBA, 0x4E, 0xBE, 0x93, 0x04, 0xD5, 0xF6, 0x6D, 0x72,\n    0x84, 0x09, 0x2D, 0x8A, 0x5C, 0x86, 0xF3, 0xC0, 0x6B, 0x53, 0xE6, 0xDD, 0xA0, 0x34, 0x41, 0x2B,\n    0x46, 0x7C, 0xE3, 0x76, 0x32, 0xD3, 0x3A, 0x8C, 0x46, 0x9C, 0x98, 0xFF, 0x3D, 0x5F, 0xD5, 0xB0,\n    0xA1, 0xF2, 0x0A, 0xAE, 0x52, 0x3D, 0xD1, 0x71, 0xBA, 0x5B, 0x09, 0xB4, 0x52, 0x65, 0xE8, 0x15,\n    0x80, 0xD5, 0x59, 0x68, 0x68, 0xEC, 0x2B, 0x80, 0x72, 0xDA, 0xCB, 0xEB, 0x68, 0xBC, 0x68, 0xD0,\n    0x19, 0xBC, 0x5E, 0xED, 0x1F, 0x80, 0x8F, 0xD1, 0x76, 0x44, 0x46, 0x6E, 0xD9, 0x78, 0x91, 0xED,\n    0x71, 0x9B, 0x4A, 0xCF, 0x1B, 0x1D, 0xDE, 0xC2, 0x4A, 0xEC, 0xF1, 0x2E, 0xC0, 0xC3, 0xEA, 0x7E,\n    0x76, 0x1F, 0x74, 0xCE, 0x9D, 0xF1, 0x6B, 0x94, 0x21, 0x06, 0x00, 0x58, 0x1E, 0x37, 0x6B, 0xFB,\n    0xB6, 0x45, 0xB4, 0x71, 0x35, 0x74, 0x20, 0x83, 0xA1, 0xD8, 0x3A, 0x1F, 0xA4, 0x17, 0x71, 0xEB,\n    0x10, 0x93, 0xD0, 0xD7, 0x6C, 0xD2, 0x43, 0xF2, 0xF3, 0x66, 0xC1, 0x55, 0x07, 0x00, 0x54, 0xA1,\n    0x4A, 0x4E, 0x55, 0xD9, 0x9D, 0x1D, 0xB0, 0x3F, 0x2E, 0x60, 0xF1, 0x5F, 0x30, 0x1E, 0x66, 0xD8,\n    0xE9, 0xCD, 0x99, 0x0B, 0x72, 0x35, 0x99, 0x55, 0x1E, 0x4A, 0xD7, 0xA3, 0x02, 0x87, 0x27, 0x76,\n    0x5A, 0x8D, 0xBC, 0x3D, 0xAA, 0xD6, 0xDA, 0xFA, 0x43, 0xE7, 0xD4, 0xCD, 0x92, 0xF0, 0xAB, 0xEB,\n    0x9F, 0xD2, 0xC8, 0xA4, 0x3A, 0xF6, 0x1F, 0xAE, 0xBC, 0x79, 0xDD, 0xDD, 0x98, 0xE6, 0xA5, 0x11,\n    0x53, 0x35, 0x24, 0xEE, 0x55, 0xC6, 0x86, 0x17, 0x55, 0x57, 0x8A, 0xCB, 0xAC, 0x9B, 0xA3, 0xBA,\n    0x25, 0x24, 0xB6, 0x14, 0xC2, 0x42, 0xB2, 0xDE, 0x42, 0x0A, 0x23, 0x58, 0xCE, 0xBF, 0x21, 0x2A,\n    0xDB, 0xF1, 0xBD, 0x78, 0xD4, 0x18, 0xCC, 0xFE, 0x49, 0xAE, 0x04, 0xD7, 0x94, 0x58, 0x71, 0x6E,\n    0x8F, 0x3B, 0xE1, 0xBF, 0x6A, 0x9C, 0x73, 0x88, 0x9D, 0xD7, 0xAB, 0x7C, 0xE6, 0xAC, 0x31, 0xFB,\n    0xB0, 0x80, 0xD7, 0x47, 0x8E, 0x32, 0x81, 0x61, 0xCF, 0xCF, 0x41, 0x2B, 0xA8, 0x84, 0x2D, 0x4F,\n    0x64, 0x89, 0xC3, 0xC8, 0xEE, 0xFA, 0xF5, 0x6E, 0xB9, 0x62, 0x38, 0xBC, 0xBA, 0xFF, 0x26, 0x75,\n    0xB4, 0xF3, 0x34, 0xB4, 0x94, 0xD1, 0x31, 0x57, 0x87, 0xDF, 0x93, 0xBC, 0x27, 0xE5, 0x34, 0xEF,\n    0xF5, 0x50, 0xD1, 0x52, 0x53, 0x36, 0xAD, 0x7F, 0xF1, 0x7A, 0x0C, 0xAB, 0x29, 0x17, 0x0A, 0xD4,\n    0xD1, 0x18, 0xA0, 0xC5, 0xD9, 0xC9, 0xFB, 0xC6, 0x08, 0x47, 0xD8, 0x2D, 0x8B, 0xA6, 0x06, 0xA0,\n    0xC1, 0xF3, 0xF4, 0x50, 0x65, 0x0F, 0xF2, 0x1B, 0x04, 0x48, 0x3E, 0x9B, 0xC4, 0x70, 0x6A, 0xCC,\n    0xE6, 0x7C, 0x6D, 0x1F, 0x3F, 0x3B, 0x5B, 0xBE, 0x87, 0x60, 0x31, 0x09, 0x3F, 0xF6, 0x37, 0xF3,\n    0xD9, 0xB8, 0x13, 0x20, 0x38, 0x41, 0xF1, 0xF5, 0xE1, 0x2A, 0xDB, 0x33, 0xE4, 0xFA, 0xCE, 0x15,\n    0xA0, 0x9D, 0x59, 0x2C, 0x05, 0x92, 0xC0, 0x87, 0xBE, 0x3C, 0x21, 0x53, 0xEF, 0xF8, 0x63, 0xB5,\n    0x7F, 0x67, 0x7A, 0xA3, 0x5E, 0x76, 0x75, 0x79, 0x90, 0x15, 0xA8, 0x8B, 0x06, 0xB4, 0x91, 0x6B,\n    0xDE, 0x37, 0x0D, 0x31, 0x40, 0xE1, 0x7E, 0xC4, 0x1F, 0x00, 0xDD, 0xBA, 0x62, 0x00, 0xEA, 0x90,\n    0xE5, 0xF2, 0xEE, 0x71, 0x2E, 0x1C, 0xA3, 0xFA, 0xBA, 0x9C, 0x64, 0xFF, 0x11, 0x07, 0xD2, 0xE7,\n    0x00, 0xF1, 0x08, 0xAA, 0x8E, 0x1A, 0x55, 0x29, 0xFB, 0xFB, 0x17, 0x11, 0xC7, 0xA3, 0xA0, 0x7D,\n    0x10, 0x4E, 0x02, 0xFA, 0xBB, 0x12, 0x3D, 0x74, 0xA2, 0x84, 0xE7, 0xBD, 0x78, 0x77, 0x1E, 0x97,\n    0xC9, 0x33, 0x2B, 0x19, 0x5B, 0x5D, 0xDD, 0xF2, 0xE1, 0xD6, 0xB3, 0x08, 0x0D, 0xE0, 0x56, 0x71,\n    0x9D, 0xE2, 0x0C, 0xB9, 0x60, 0xC4, 0x0C, 0x90, 0x54, 0x07, 0xDC, 0x03, 0x92, 0xC6, 0x20, 0x38,\n    0x3D, 0x3D, 0xC5, 0xC9, 0xF6, 0x02, 0x84, 0x7D, 0x84, 0x5C, 0x6A, 0x60, 0xE5, 0xEF, 0xBC, 0x54,\n    0x71, 0x0C, 0xD3, 0xF7, 0xED, 0x3D, 0x76, 0x0F, 0x19, 0x15, 0x50, 0x53, 0xB4, 0x81, 0x8D, 0x0E,\n    0xCF, 0xA1, 0x59, 0x8D, 0xEF, 0xF2, 0x29, 0x21, 0xF2, 0x64, 0xCE, 0x9C, 0xE2, 0x96, 0x4A, 0x0C,\n    0x1B, 0x71, 0x7A, 0x72, 0x45, 0x24, 0x68, 0xC7, 0xD0, 0x6B, 0xD2, 0x3B, 0x5B, 0x16, 0xEC, 0xFE,\n    0x40, 0x84, 0x72, 0xD7, 0x35, 0x7C, 0xA8, 0x80, 0x8C, 0xBA, 0xDA, 0x56, 0xA3, 0xA9, 0xC1, 0xCC,\n    0x98, 0x6C, 0x20, 0x42, 0xBB, 0xB7, 0x1B, 0x0C, 0xCF, 0x98, 0x77, 0x71, 0x07, 0x1D, 0xDA, 0x66,\n    0xA3, 0xD7, 0xE1, 0x2F, 0xB0, 0x70, 0x7B, 0x53, 0xA9, 0x80, 0x76, 0x16, 0x4E, 0xB3, 0x82, 0x0A,\n    0x33, 0xD0, 0x30, 0x2F, 0x76, 0x89, 0x80, 0x76, 0x25, 0x85, 0xA1, 0x29, 0x97, 0xFA, 0xE3, 0xAE,\n    0x6E, 0x44, 0xBD, 0xA2, 0x6A, 0xA5, 0xCA, 0x9C, 0x13, 0x7A, 0xAE, 0x51, 0x8D, 0x7C, 0xC8, 0xE1,\n    0xE6, 0xA8, 0x36, 0x01, 0x34, 0x1D, 0xA6, 0x40, 0x93, 0xF2, 0x2F, 0x7F, 0xCD, 0x29, 0xB5, 0x5B,\n    0x15, 0xEE, 0x59, 0x63, 0xE6, 0xD7, 0x77, 0xBB, 0x77, 0x0A, 0x25, 0x4D, 0xF3, 0x9D, 0x23, 0x0C,\n    0xD4, 0x6D, 0xBB, 0x11, 0x96, 0x4E, 0x96, 0x15, 0xDE, 0xFE, 0xE6, 0x1A, 0xD2, 0x10, 0xE2, 0xA4,\n    0x6B, 0x2F, 0x99, 0xB5, 0xFA, 0xAC, 0xC5, 0xB6, 0x90, 0xFA, 0x6C, 0x90, 0x16, 0x45, 0xB6, 0x93,\n    0x71, 0x6B, 0x80, 0xE1, 0x9C, 0x65, 0x0D, 0x05, 0x84, 0xB0, 0x1B, 0xAC, 0x4E, 0xAE, 0x6A, 0x42,\n    0x80, 0xF5, 0xD7, 0xAA, 0x43, 0x93, 0xE1, 0x3E, 0x51, 0x71, 0x5B, 0x6E, 0xA7, 0x9F, 0x56, 0x9A,\n    0xFC, 0xFD, 0x3B, 0xA5, 0x07, 0x7C, 0xF6, 0x65, 0x22, 0xEA, 0x8E, 0x52, 0xAA, 0x51, 0x5A, 0x41,\n    0x4A, 0x19, 0x7F, 0x92, 0x18, 0x0C, 0x04, 0x6A, 0xFB, 0x23, 0x30, 0xEC, 0xF5, 0x5B, 0x4E, 0xEA,\n    0xE8, 0x4D, 0x3D, 0x87, 0xAE, 0xE7, 0x7C, 0x9A, 0x9F, 0xC0, 0xAC, 0xB8, 0x28, 0xC2, 0xC8, 0x9D,\n    0xB9, 0x45, 0x9E, 0x4C, 0xC6, 0x7F, 0x34, 0x15, 0x2F, 0x58, 0xE5, 0x10, 0x75, 0x5A, 0x44, 0xB2,\n    0xB6, 0x2B, 0xF5, 0x1D, 0x8F, 0xF7, 0xD8, 0xF5, 0xB2, 0xF5, 0xAA, 0x88, 0x16, 0xD0, 0x26, 0xF4,\n    0x32, 0xFC, 0x8E, 0x60, 0xE7, 0x41, 0x6F, 0x9A, 0xCA, 0x51, 0x8E, 0x45, 0xF6, 0x39, 0xFF, 0x8C,\n    0x48, 0x61, 0x40, 0xE1, 0xC9, 0x45, 0x82, 0x04, 0xEF, 0xB2, 0x59, 0x30, 0xA4, 0x2C, 0x62, 0xD9,\n    0x2D, 0xDD, 0xAB, 0xAD, 0x18, 0x81, 0x19, 0x81, 0xCA, 0xCA, 0x75, 0xB3, 0xD0, 0x37, 0x0F, 0xE9,\n    0x5D, 0x54, 0x8E, 0x0B, 0xB2, 0x55, 0x2A, 0x98, 0xC0, 0x75, 0x5A, 0xEB, 0x9D, 0x11, 0x3F, 0x20,\n    0xE2, 0x3E, 0xB0, 0xB7, 0xCA, 0xB1, 0xD8, 0x30, 0x66, 0x4C, 0xBC, 0xEA, 0x8F, 0x76, 0x30, 0xC4,\n    0x9D, 0x03, 0x21, 0x93, 0xEF, 0x54, 0x06, 0xEC, 0x93, 0xFA, 0x89, 0x48, 0xC7, 0x9C, 0x06, 0x22,\n    0x77, 0xBD, 0xD1, 0x5E, 0xCF, 0x60, 0xD6, 0xA5, 0x17, 0x9A, 0x75, 0x50, 0xF3, 0x97, 0xD4, 0x8E,\n    0xE3, 0x17, 0x41, 0xFD, 0xC0, 0x3B, 0xBB, 0x8A, 0xA7, 0x2B, 0x98, 0xF6, 0xBD, 0xE7, 0x14, 0x2D,\n    0xE9, 0xEF, 0xC9, 0x0B, 0x6E, 0xCC, 0xE3, 0x17, 0xF3, 0xB8, 0xDF, 0x06, 0x3A, 0xE1, 0xB3, 0x58,\n    0x22, 0x3D, 0xEF, 0xEA, 0xBA, 0xF1, 0x9D, 0x4F, 0xDB, 0xCC, 0x0C, 0xED, 0x57, 0x39, 0x80, 0x3A,\n    0x3B, 0xBC, 0xEE, 0x29, 0x04, 0x34, 0xA5, 0x08, 0xE9, 0xDF, 0x96, 0xD3, 0x53, 0xC5, 0x4E, 0xF6,\n    0x38, 0xAD, 0xCA, 0x53, 0x77, 0x59, 0xF1, 0x80, 0x9F, 0xA8, 0xB6, 0xDA, 0x5A, 0x56, 0xAA, 0x84,\n    0x6C, 0x0E, 0xA8, 0xB2, 0x10, 0x37, 0xC8, 0x6A, 0xD8, 0x4D, 0x78, 0xAE, 0x36, 0xD0, 0xDC, 0xE7,\n    0x1D, 0x8E, 0x57, 0xAC, 0xDD, 0x15, 0xAB, 0xB5, 0x30, 0x3C, 0xE7, 0xE6, 0x51, 0xD3, 0x26, 0xF6,\n    0x13, 0x1D, 0xC8, 0xFC, 0x28, 0x83, 0x5E, 0x64, 0xA6, 0xCA, 0xA7, 0x67, 0xE6, 0x34, 0x19, 0x66,\n    0xC8, 0x07, 0xB6, 0x74, 0xB2, 0x59, 0xAE, 0xDA, 0x36, 0x3F, 0x1F, 0xF6, 0x81, 0xEB, 0xC7, 0xB3,\n    0x6D, 0x1F, 0x87, 0xA8, 0x90, 0x37, 0xD5, 0x85, 0xC3, 0x17, 0xC5, 0xE5, 0xE8, 0xCE, 0x83, 0xB5,\n    0x73, 0x49, 0xA7, 0x2B, 0x91, 0x28, 0x2D, 0x2A, 0xC2, 0x22, 0xA7, 0x31, 0x18, 0xA6, 0xA4, 0x8C,\n    0x45, 0x68, 0xA5, 0x95, 0xA4, 0x91, 0xA3, 0xEE, 0x4E, 0x2D, 0xE7, 0xEB, 0x20, 0x8E, 0xE5, 0xF6,\n    0x9E, 0x53, 0x15, 0xCE, 0xA9, 0x21, 0x18, 0xE3, 0x9B, 0x75, 0x32, 0x02, 0x3D, 0xFC, 0x2C, 0x9D,\n    0x85, 0x6A, 0xB2, 0xB9, 0x5D, 0x3A, 0xD1, 0x85, 0xFB, 0xD8, 0xB8, 0x8B, 0x48, 0x09, 0xD3, 0xFD,\n    0xED, 0x11, 0xAA, 0x90, 0xB5, 0x25, 0xC8, 0xB9, 0xA5, 0x49, 0xE9, 0x1E, 0xD0, 0x43, 0xBA, 0x7A,\n    0x49, 0xB7, 0xE3, 0x87, 0xBE, 0xE0, 0xF4, 0x83, 0xDA, 0x82, 0x4F, 0x9E, 0xC1, 0x55, 0x57, 0xF2,\n    0x58, 0x20, 0x63, 0xCF, 0x2C, 0x34, 0x61, 0x6C, 0x15, 0xEF, 0x11, 0xB3, 0x7E, 0xA6, 0x13, 0xD9,\n    0x2F, 0xD1, 0xAD, 0x61, 0xDE, 0x69, 0xB9, 0x9D, 0x1A, 0x24, 0x72, 0x5D, 0x4E, 0xA0, 0xB4, 0x7E,\n    0xE9, 0x14, 0x77, 0x4C, 0xD6, 0xAE, 0xF6, 0x35, 0x69, 0x2D, 0x28, 0x98, 0x29, 0x73, 0xDE, 0x1D,\n    0x3D, 0x10, 0x50, 0x8C, 0x55, 0x3D, 0x27, 0x89, 0x57, 0x1F, 0x7B, 0x62, 0xD9, 0x12, 0xF7, 0x8D,\n    0xD3, 0x0F, 0x6B, 0x98, 0x6A, 0x64, 0xF7, 0x62, 0xFB, 0x69, 0x6D, 0x14, 0xF1, 0xF5, 0x6D, 0x5E,\n    0xC1, 0x79, 0x3C, 0x1D, 0xDE, 0x45, 0x95, 0xE4, 0x10, 0x70, 0x68, 0x78, 0x0F, 0x70, 0xBE, 0xAC,\n    0xFE, 0xD3, 0x6E, 0x5B, 0x9F, 0x7E, 0x2C, 0xD3, 0x0E, 0xC2, 0x6A, 0x96, 0x4D, 0x11, 0xEA, 0x62,\n    0x6F, 0xAC, 0xAB, 0xE7, 0x8E, 0x0F, 0xC4, 0xFB, 0x23, 0x06, 0x7E, 0x0A, 0x87, 0x8E, 0x8D, 0xA8,\n    0xE9, 0x90, 0x2D, 0xA2, 0xBF, 0x0B, 0x4C, 0x4C, 0x91, 0xE1, 0x7F, 0x55, 0x7C, 0x01, 0x94, 0xE3,\n    0xA1, 0x08, 0xA0, 0x52, 0x8A, 0x2B, 0x0F, 0x5D, 0xD5, 0x70, 0x5F, 0x65, 0x1C, 0xB9, 0x9B, 0x0C,\n    0x2B, 0xD6, 0x8E, 0x95, 0x29, 0x6C, 0x69, 0x63, 0xEA, 0x50, 0xB1, 0x2F, 0xAE, 0x06, 0x14, 0xDD,\n    0x44, 0x38, 0x59, 0xF4, 0x35, 0xC6, 0x5B, 0xE9, 0xA8, 0x42, 0x10, 0xB1, 0x3C, 0x56, 0x76, 0x33,\n    0x81, 0x88, 0x9D, 0x5B, 0x71, 0xEB, 0xA8, 0x78, 0xA2, 0xC6, 0x37, 0x3E, 0x75, 0xDB, 0x4F, 0xB5,\n    0xE6, 0x9E, 0x53, 0x6C, 0x66, 0x65, 0x4C, 0x9F, 0xF7, 0x52, 0x7A, 0x24, 0x5B, 0x1C, 0xD1, 0x6B,\n    0xFE, 0xD4, 0x05, 0x22, 0x5D, 0x4A, 0x85, 0x88, 0x82, 0xF6, 0xF7, 0x25, 0xF5, 0xED, 0xF0, 0xCC,\n    0x47, 0xDE, 0x79, 0x9A, 0x88, 0xBE, 0xA1, 0x94, 0xF1, 0x4E, 0x2C, 0xFA, 0x8C, 0xE5, 0xE0, 0x8C,\n    0xA1, 0x86, 0xFF, 0x2B, 0x0A, 0x84, 0x1C, 0xBB, 0x38, 0x49, 0x94, 0x33, 0xBD, 0xBA, 0xAB, 0x8B,\n    0x66, 0x6D, 0x2C, 0x08, 0x78, 0x21, 0xB7, 0xDF, 0xAD, 0x17, 0x23, 0xCF, 0x42, 0x4E, 0xBD, 0x4F,\n    0x1B, 0x50, 0x9A, 0x55, 0x60, 0x1D, 0x1D, 0x52, 0xAC, 0x3A, 0x70, 0x8E, 0x20, 0x4C, 0x74, 0x7F,\n    0xBE, 0xC1, 0xFB, 0xF7, 0x0E, 0x03, 0x90, 0x36, 0x25, 0x08, 0x10, 0xAD, 0x02, 0xAB, 0x0E, 0xD0,\n    0x3E, 0xA3, 0xF8, 0x8D, 0x06, 0x73, 0x09, 0x07, 0x81, 0x1B, 0x07, 0x15, 0x56, 0x13, 0xB4, 0x5A,\n    0xBD, 0x88, 0xB5, 0xA8, 0x64, 0xC2, 0x8C, 0x20, 0xDD, 0xA5, 0xD1, 0x3F, 0x43, 0xEA, 0xD1, 0x64,\n    0x70, 0x78, 0x66, 0x0F, 0x14, 0xC8, 0x13, 0x30, 0x74, 0xEE, 0x2D, 0x8C, 0xD3, 0x39, 0x3B, 0xDA,\n    0x21, 0x64, 0x66, 0x0E, 0xC0, 0xC2, 0xCF, 0xF9, 0x27, 0xDD, 0x95, 0xDC, 0xA7, 0x2A, 0x72, 0xE2,\n    0x2C, 0x60, 0x6F, 0x93, 0x45, 0x36, 0x58, 0x7B, 0xD2, 0x47, 0x88, 0xDF, 0xCD, 0xD7, 0x76, 0xEC,\n    0xA6, 0x2C, 0xE4, 0x5E, 0xD9, 0x74, 0xBD, 0x06, 0xC7, 0xBD, 0xBB, 0x09, 0x87, 0x97, 0x2E, 0x2B,\n    0x55, 0x48, 0xC1, 0xCD, 0x58, 0xB0, 0x33, 0x31, 0xD8, 0x19, 0x56, 0x4A, 0x57, 0x33, 0xEA, 0x86,\n    0xA7, 0x68, 0x2A, 0xBB, 0x15, 0xC9, 0xB5, 0x9C, 0xCE, 0x77, 0x82, 0xD5, 0x56, 0xE2, 0x8C, 0xA0,\n    0xC3, 0x86, 0x0A, 0x61, 0xE4, 0xF8, 0xF6, 0x1F, 0xA6, 0xE1, 0xD7, 0x96, 0xC9, 0xD7, 0xD7, 0x12,\n    0xB8, 0x2E, 0xFB, 0x31, 0x8D, 0xFA, 0x13, 0x4C, 0xE7, 0x82, 0x90, 0xBC, 0x41, 0xA5, 0x9B, 0x55,\n    0x24, 0xF5, 0xCE, 0xA6, 0x3D, 0x24, 0xCF, 0xB1, 0x66, 0xF9, 0x51, 0x2C, 0x86, 0xCD, 0x67, 0x82,\n    0x3F, 0xA9, 0x29, 0x6B, 0x33, 0x00, 0xD2, 0xBB, 0x75, 0x12, 0xEC, 0x8F, 0x0E, 0x45, 0x2A, 0x5C,\n    0x2D, 0x79, 0xC8, 0xFD, 0x84, 0xE8, 0x29, 0x61, 0x73, 0xFF, 0x9F, 0xB3, 0x23, 0x9C, 0xD5, 0x56,\n    0x47, 0x72, 0x71, 0xF3, 0x69, 0xC5, 0xD5, 0x48, 0x6B, 0x12, 0xBF, 0x93, 0xB0, 0x2F, 0x6F, 0x31,\n    0xF6, 0xCD, 0x53, 0xAB, 0x9F, 0xA3, 0x61, 0x60, 0x09, 0x44, 0x27, 0x18, 0x75, 0x90, 0xFA, 0x72,\n    0x77, 0xC9, 0xC7, 0xFC, 0x2F, 0x37, 0x9A, 0xC2, 0x94, 0xE9, 0xE0, 0x55, 0x44, 0x15, 0x8A, 0xFC,\n    0xE2, 0x68, 0x93, 0x69, 0x68, 0x79, 0xC3, 0x49, 0xF7, 0x6B, 0xCA, 0xE3, 0xF4, 0x51, 0xDB, 0x05,\n    0x66, 0xBF, 0x95, 0x80, 0x9B, 0xEA, 0xED, 0xE7, 0x9A, 0xB6, 0xFF, 0xA1, 0xBB, 0x2D, 0x4B, 0xF9,\n    0xD1, 0xAC, 0x8C, 0x1B, 0x8A, 0xF5, 0xEE, 0x37, 0xDF, 0xC8, 0xEA, 0x73, 0x23, 0x74, 0xAE, 0xCE,\n    0x5F, 0x9B, 0x08, 0x3D, 0xD9, 0x40, 0xF2, 0x0B, 0x0D, 0x0D, 0x8D, 0x6D, 0x5C, 0xAB, 0x7B, 0xB3,\n    0x12, 0x7E, 0xA1, 0xD5, 0xEA, 0xD5, 0xA8, 0x13, 0xF9, 0x71, 0xE2, 0x3A, 0x5B, 0x35, 0x8C, 0x7A,\n    0x6F, 0x52, 0xB0, 0xB8, 0x0F, 0x78, 0x30, 0xF3, 0xD5, 0x8A, 0x93, 0xF6, 0x24, 0x75, 0xBE, 0x18,\n    0xB1, 0x81, 0x6A, 0xC3, 0xCC, 0x5B, 0x23, 0x55, 0x9D, 0xEB, 0x5F, 0x25, 0x76, 0x5C, 0xCD, 0x9E,\n    0x58, 0x12, 0xFD, 0x49, 0xC5, 0x46, 0xD3, 0x5D, 0x45, 0xAD, 0xCD, 0xC1, 0x4A, 0xA2, 0x7B, 0xF7,\n    0x5D, 0x13, 0x97, 0xCF, 0xB4, 0x94, 0xAA, 0xCD, 0xC9, 0xDC, 0x9C, 0xE4, 0xB1, 0x67, 0xE1, 0x7D,\n    0x11, 0x64, 0x2E, 0x13, 0x59, 0x70, 0xB9, 0x27, 0x33, 0x77, 0xB7, 0xC1, 0xA6, 0x54, 0xAA, 0x43,\n    0x94, 0xA1, 0x06, 0xA4, 0xDE, 0x8F, 0x0A, 0x9B, 0xD5, 0x40, 0xBF, 0x7E, 0x69, 0xAA, 0x5C, 0x0A,\n    0xDC, 0x93, 0xFD, 0x05, 0x04, 0x6F, 0x9D, 0x1F, 0x42, 0x7D, 0x2A, 0x60, 0x77, 0x87, 0xF4, 0x52,\n    0xAB, 0xC3, 0xD5, 0x88, 0xF5, 0x89, 0xA0, 0xC7, 0x6A, 0x48, 0xB9, 0x75, 0xE5, 0x39, 0x7A, 0x39,\n    0xC1, 0x25, 0xC6, 0xF8, 0xF6, 0x96, 0x7B, 0x0F, 0x4B, 0xBC, 0x37, 0x46, 0x9D, 0xA7, 0xA5, 0xDD,\n    0x71, 0x99, 0xDA, 0x12, 0x88, 0x18, 0x80, 0x04, 0xF9, 0x5B, 0xDE, 0x01, 0x2C, 0xA2, 0x97, 0xDF,\n    0xC9, 0xC3, 0xC8, 0xAB, 0x18, 0x80, 0x3D, 0xDA, 0xD0, 0xD6, 0x9C, 0xDC, 0xE6, 0xA1, 0x08, 0xD8,\n    0x63, 0xC0, 0x28, 0x6E, 0x61, 0x33, 0x3F, 0x44, 0xD0, 0x8B, 0xB9, 0x4D, 0xB5, 0x99, 0x53, 0xE9,\n    0x20, 0x02, 0x2F, 0x40, 0xD6, 0x16, 0x32, 0x1E, 0xE7, 0x6D, 0x20, 0xCA, 0x73, 0xC7, 0xCA, 0x3A,\n    0x3C, 0x0C, 0xFE, 0xBB, 0xE8, 0xB4, 0x5F, 0x85, 0xA6, 0x33, 0x9C, 0x3D, 0x4B, 0xD9, 0x94, 0xAA,\n    0x5D, 0x23, 0xDE, 0xC7, 0x8F, 0xDE, 0xF3, 0x94, 0x54, 0x56, 0x36, 0x9A, 0x52, 0x18, 0x6A, 0x91,\n    0x0E, 0x00, 0xD4, 0x2F, 0xBB, 0x2A, 0x2E, 0xEB, 0x11, 0x05, 0xA5, 0xB3, 0xA9, 0x9A, 0xB1, 0x96,\n    0xAB, 0xBB, 0x5F, 0x55, 0x9F, 0x9E, 0xDB, 0x44, 0x44, 0xE7, 0x19, 0x2F, 0x42, 0xAA, 0x66, 0xA1,\n    0x8E, 0xFC, 0x4F, 0xD5, 0xBC, 0x6C, 0x70, 0x65, 0x05, 0x4F, 0x0A, 0xD4, 0xD1, 0x11, 0xA8, 0x24,\n    0x4A, 0xDD, 0x6C, 0x70, 0xA4, 0x62, 0xC6, 0x17, 0xB1, 0x55, 0xF1, 0x2D, 0x7B, 0x3D, 0x8F, 0xF9,\n    0xB6, 0x86, 0xEF, 0xD7, 0xF2, 0x70, 0x2C, 0xF0, 0x82, 0x3F, 0x2E, 0x05, 0xC6, 0xFE, 0xD6, 0x14,\n    0xFA, 0x43, 0xCE, 0x3A, 0xD9, 0xC3, 0x18, 0x42, 0xF8, 0xE3, 0x92, 0x59, 0x90, 0x5C, 0xE1, 0xBE,\n    0x30, 0x36, 0xEF, 0x15, 0x9E, 0xFB, 0x1F, 0xD0, 0x82, 0xCF, 0x34, 0xB8, 0x44, 0xF3, 0x6C, 0x98,\n    0x13, 0x9A, 0x25, 0xEC, 0xD7, 0x8C, 0x1B, 0x7D, 0x92, 0x91, 0xBB, 0x39, 0xD9, 0x5C, 0x76, 0xBA,\n    0x5D, 0x8B, 0xA3, 0xF3, 0x48, 0x72, 0x7D, 0xAE, 0x6E, 0x2B, 0x41, 0x6D, 0xCA, 0xDC, 0xBA, 0xD4,\n    0x01, 0x47, 0x5E, 0x92, 0xDA, 0x8F, 0x06, 0xAF, 0xB5, 0x76, 0xDE, 0xA2, 0xC0, 0x64, 0x1A, 0xB3,\n    0x5F, 0xA1, 0x16, 0xCF, 0x77, 0x48, 0x1E, 0x5C, 0x7F, 0xCD, 0x03, 0xA1, 0x2F, 0x83, 0x8C, 0x1B,\n    0x6B, 0xFD, 0x9B, 0x67, 0x32, 0x7E, 0xBE, 0x9E, 0xE0, 0x82, 0x75, 0x7E, 0xAC, 0xD7, 0x3F, 0x26,\n    0x53, 0xB8, 0x83, 0x15, 0x16, 0x49, 0x70, 0x01, 0x6F, 0x22, 0x3D, 0x9B, 0x56, 0x61, 0x96, 0x59,\n    0x05, 0x98, 0x0F, 0xA5, 0x76, 0x26, 0x5D, 0xFE, 0x92, 0x0E, 0xF4, 0xAC, 0x73, 0x40, 0xEF, 0xEB,\n    0x56, 0x14, 0xCD, 0x8D, 0x94, 0x8E, 0x34, 0xBF, 0x5B, 0xA0, 0xD0, 0xE3, 0xBA, 0xF3, 0x1F, 0x0D,\n    0x40, 0xD0, 0xE4, 0x53, 0x00, 0xCB, 0x30, 0x4A, 0x8C, 0xA2, 0x95, 0xCC, 0xB0, 0x36, 0xE3, 0x51,\n    0x19, 0x00, 0xBE, 0x86, 0x91, 0x7F, 0x15, 0x1B, 0xF1, 0x9D, 0x37, 0x9C, 0x24, 0xCB, 0x7F, 0xFB,\n    0x96, 0x22, 0x49, 0xC0, 0x5F, 0x12, 0xE8, 0x97, 0x00, 0xCB, 0x09, 0x2B, 0x10, 0x82, 0x88, 0xEA,\n    0x83, 0x79, 0x50, 0xA5, 0x78, 0x40, 0x61, 0xD3, 0xB7, 0x28, 0x55, 0xC9, 0x16, 0xFA, 0x31, 0xA0,\n    0x38, 0xCE, 0x89, 0x36, 0xA3, 0x75, 0xC0, 0x13, 0xF0, 0xB1, 0xD9, 0x0B, 0x83, 0x92, 0x84, 0xEC,\n    0xF8, 0x42, 0x26, 0xF8, 0xA1, 0xDE, 0x4F, 0xC1, 0xE9, 0x22, 0x74, 0xA1, 0x11, 0x93, 0x3F, 0x98,\n    0x5C, 0x7D, 0x84, 0xC1, 0x66, 0xD0, 0xDC, 0x7E, 0x5A, 0x9B, 0xF1, 0xBD, 0x46, 0xBA, 0x2B, 0xD9,\n    0xCA, 0x80, 0xDA, 0x3D, 0x04, 0xE1, 0xBE, 0x74, 0x1F, 0x83, 0x6C, 0xD1, 0x1C, 0xC5, 0x6F, 0x1D,\n    0x1E, 0xF3, 0x29, 0x93, 0x12, 0xFB, 0x19, 0xCF, 0xB7, 0xA0, 0xF6, 0x21, 0x24, 0x5E, 0x1D, 0xD9,\n    0x1C, 0x66, 0x21, 0xE9, 0xC8, 0x54, 0xDB, 0x5B, 0x81, 0x4B, 0xDB, 0xE0, 0x36, 0x88, 0xC5, 0x5F,\n    0x0B, 0xA2, 0xBD, 0x8D, 0x6B, 0x14, 0x46, 0xA0, 0xE0, 0x37, 0x1D, 0x11, 0xB0, 0x15, 0x53, 0xF5,\n    0xBF, 0xF8, 0x0F, 0x6E, 0xCB, 0x42, 0xE2, 0xFC, 0xE5, 0xBB, 0xFB, 0x8F, 0x98, 0x23, 0x21, 0xC2,\n    0x69, 0x6D, 0x13, 0x2A, 0x55, 0xEF, 0x32, 0xBF, 0x9E, 0xC3, 0x74, 0x55, 0x0D, 0xA3, 0xF8, 0x56,\n    0xC0, 0xE1, 0x25, 0x91, 0x78, 0x79, 0x6D, 0xEA, 0xEB, 0xCF, 0x48, 0x82, 0xB0, 0xEB, 0x44, 0x0C,\n    0xB6, 0xF6, 0x21, 0x9D, 0xD2, 0xF4, 0x67, 0xC1, 0x93, 0x55, 0x48, 0x35, 0xB3, 0xE0, 0x62, 0x86,\n    0x9C, 0x5C, 0xF1, 0x4C, 0xB5, 0x2A, 0xAF, 0x3D, 0x42, 0xFD, 0x6F, 0x95, 0x4F, 0x00, 0xE9, 0x42,\n    0x20, 0x6E, 0x8B, 0x51, 0xFF, 0xD4, 0xD8, 0xCE, 0x76, 0xE4, 0xE8, 0x9F, 0x2B, 0x0E, 0x47, 0x12,\n    0xC4, 0xEF, 0xAB, 0x91, 0xCF, 0x37, 0x4F, 0x52, 0x29, 0x75, 0xC3, 0xC0, 0xB8, 0xF4, 0x04, 0x9E,\n    0xA9, 0x86, 0x6B, 0x93, 0x21, 0x7A, 0x11, 0x26, 0x33, 0xC0, 0x0A, 0x7B, 0xED, 0x0F, 0x2B, 0x9F,\n    0x91, 0xE3, 0x19, 0x47, 0xD8, 0xD8, 0x0D, 0xCB, 0x6D, 0xC0, 0xAC, 0xEB, 0xEB, 0x59, 0xA6, 0x44,\n    0x56, 0xE3, 0x95, 0xB6, 0x2A, 0xBA, 0xBC, 0x65, 0x5B, 0x0C, 0x9E, 0x04, 0xDE, 0x65, 0x8E, 0x29,\n    0x73, 0x18, 0x0B, 0xC7, 0xA3, 0x76, 0x43, 0xD4, 0x07, 0xF0, 0x3B, 0x09, 0xCC, 0xF7, 0x10, 0x57,\n    0x9C, 0x05, 0x2A, 0xC5, 0x8C, 0x53, 0xE3, 0xA9, 0xA6, 0x20, 0x0B, 0x71, 0xAF, 0x4B, 0x95, 0x8F,\n    0xB1, 0xA6, 0x96, 0xDC, 0xFC, 0x85, 0xC5, 0x94, 0xBF, 0x86, 0xA6, 0x88, 0xC9, 0xEB, 0x04, 0x2A,\n    0x3B, 0xF8, 0x17, 0x07, 0x7D, 0x0F, 0x89, 0x44, 0x3D, 0x97, 0xA1, 0x8A, 0x4E, 0x2E, 0x8F, 0x9C,\n    0xB8, 0x6C, 0xA0, 0x50, 0x5D, 0xC4, 0x22, 0xDF, 0xF0, 0x5A, 0xD2, 0xF4, 0x3F, 0x20, 0xFD, 0xAA,\n    0x6E, 0x04, 0xF3, 0xFA, 0x2E, 0x5D, 0x6F, 0x6B, 0x2A, 0xE9, 0x77, 0x16, 0x65, 0xB7, 0x1B, 0xDC,\n    0x8F, 0x58, 0x2F, 0x32, 0x9D, 0x57, 0xB7, 0x64, 0xD0, 0x77, 0x6E, 0xE7, 0x03, 0x39, 0xB0, 0xDF,\n    0x19, 0x97, 0x29, 0xCA, 0xFE, 0xFC, 0xB6, 0x21, 0xD0, 0x2C, 0x07, 0x36, 0x1D, 0x72, 0x07, 0x9B,\n    0xEB, 0xED, 0x1B, 0xB9, 0xD3, 0x87, 0xF8, 0x33, 0x94, 0x42, 0xAF, 0x91, 0x7C, 0x43, 0x91, 0xAF,\n    0x33, 0x22, 0x5E, 0x48, 0xE6, 0x73, 0xF6, 0xB6, 0x00, 0xAC, 0x29, 0x88, 0xCB, 0x45, 0x31, 0x3D,\n    0xF8, 0x24, 0x98, 0x3F, 0xD9, 0x21, 0xAA, 0x6D, 0xCA, 0x49, 0x53, 0xC5, 0x20, 0x48, 0xA7, 0xCE,\n    0x5B, 0x9C, 0x23, 0x54, 0x51, 0xFC, 0xB6, 0x7A, 0x61, 0x4E, 0xDE, 0xE2, 0x82, 0xE8, 0xE0, 0xEC,\n    0xE3, 0x65, 0xA6, 0xB5, 0x5E, 0x0F, 0x5A, 0xDC, 0xB2, 0x9D, 0x4B, 0x5D, 0x35, 0x71, 0xDB, 0x9F,\n    0x9D, 0x5F, 0xB6, 0x56, 0x17, 0x02, 0x69, 0x65, 0x1C, 0x5E, 0xC2, 0x81, 0x0D, 0x5D, 0x4A, 0x0F,\n    0x25, 0x89, 0x60, 0x06, 0xEB, 0xEB, 0x1C, 0x8D, 0x8C, 0x2F, 0xBD, 0xD2, 0x68, 0xB6, 0xE5, 0x86,\n    0xCA, 0xEC, 0x85, 0x3F, 0x69, 0x90, 0x45, 0xC3, 0x70, 0x57, 0x72, 0x3E, 0xCD, 0xAA, 0xAE, 0xA2,\n    0x46, 0xEE, 0x70, 0xBE, 0x30, 0xEC, 0x6F, 0xA5, 0xC2, 0xCD, 0x5B, 0x1C, 0x9A, 0x4D, 0xAA, 0x23,\n    0xE4, 0xC7, 0x4F, 0x9B, 0xF2, 0x19, 0x67, 0x14, 0x32, 0x66, 0xD8, 0xF2, 0x0D, 0xD6, 0x62, 0xEC,\n    0x95, 0xF5, 0x50, 0xF3, 0x98, 0x75, 0xFA, 0xE2, 0xCA, 0x5D, 0x3F, 0x28, 0x7D, 0xD0, 0xE2, 0x34,\n    0x40, 0x7B, 0xB5, 0x07, 0x1F, 0x52, 0xEF, 0x2C, 0x3D, 0xAB, 0x3A, 0x72, 0x45, 0xC5, 0x47, 0x83,\n    0xFA, 0x5C, 0xE3, 0x66, 0x77, 0x4F, 0x89, 0x7C, 0xFE, 0x9C, 0xDB, 0x4E, 0xA4, 0xB9, 0xE6, 0xE8,\n    0x78, 0x50, 0x43, 0x20, 0x8B, 0x8C, 0x78, 0x27, 0x88, 0x9A, 0x40, 0x89, 0x36, 0x4B, 0x08, 0x2E,\n    0xC2, 0x60, 0x51, 0x9C, 0xE8, 0x96, 0x93, 0x8B, 0x69, 0xF7, 0x2A, 0x7E, 0x9E, 0xF7, 0x4C, 0xFC,\n    0xD2, 0xF5, 0x97, 0xC2, 0x49, 0x9D, 0x1B, 0xB0, 0xAA, 0x61, 0x50, 0xD9, 0x06, 0xE7, 0x9E, 0x61,\n    0x06, 0xB7, 0xD6, 0xDE, 0x64, 0x2A, 0x9D, 0x1E, 0xF3, 0xFB, 0xD4, 0xC1, 0x49, 0x13, 0x4C, 0xC8,\n    0x1C, 0x84, 0x0C, 0xD9, 0xF8, 0x70, 0x7A, 0x57, 0x7B, 0xE5, 0xAA, 0xD7, 0x0C, 0xD8, 0x90, 0xBB,\n    0x10, 0x7D, 0x68, 0x76, 0xD9, 0x70, 0xBE, 0x89, 0x75, 0xF9, 0xE6, 0x67, 0x06, 0x1E, 0x43, 0xAF,\n    0x44, 0xB0, 0x0C, 0xC8, 0x69, 0x9B, 0x07, 0x42, 0xAF, 0xB2, 0x87, 0xCE, 0x39, 0xC6, 0xFE, 0xCF,\n    0xF9, 0x3F, 0xD0, 0xB6, 0xC5, 0x3C, 0xC4, 0xC9, 0x15, 0x04, 0xA7, 0x4B, 0xB2, 0xC2, 0x1F, 0x52,\n    0x08, 0x5E, 0xBB, 0x1C, 0x87, 0x0C, 0xF3, 0xF2, 0x3D, 0xE2, 0xC3, 0xEC, 0xFD, 0xA6, 0x99, 0x6B,\n    0x6D, 0x2F, 0xC6, 0xE0, 0x24, 0xE5, 0xCD, 0xF5, 0x0C, 0x43, 0xDD, 0xDA, 0x85, 0xEF, 0xDD, 0x47,\n    0xDD, 0xB0, 0xE5, 0x56, 0x8E, 0xC7, 0x3E, 0x20, 0x29, 0x0F, 0x36, 0x6C, 0x5C, 0x39, 0x9C, 0x60,\n    0x9B, 0x42, 0xDE, 0x40, 0x6E, 0xC0, 0x27, 0x76, 0x68, 0x5C, 0x35, 0xE5, 0x57, 0x1E, 0x27, 0x38,\n    0x3C, 0x59, 0x17, 0x3E, 0xC1, 0x77, 0x06, 0x45, 0xBD, 0x5E, 0xFD, 0x13, 0x72, 0x2E, 0xCD, 0x62,\n    0x28, 0x63, 0xAF, 0x61, 0x26, 0x67, 0x07, 0x0F, 0xC3, 0xFE, 0xBB, 0x99, 0x17, 0x6F, 0xBB, 0x82,\n    0xCC, 0x6E, 0x99, 0xF1, 0x70, 0xAD, 0x4B, 0x78, 0x1C, 0x44, 0x78, 0x36, 0x05, 0x01, 0x38, 0x1E,\n    0x8E, 0xB1, 0xCE, 0x2F, 0xD2, 0x9F, 0x09, 0x4F, 0x01, 0xB1, 0x12, 0xDD, 0x8E, 0x94, 0x51, 0x43,\n    0xCD, 0x48, 0xE4, 0x62, 0x71, 0xA5, 0x64, 0xDD, 0xB5, 0x25, 0x2B, 0x67, 0x97, 0x17, 0xC8, 0xE5,\n    0xD1, 0x52, 0x0E, 0x2E, 0xD1, 0x7D, 0xA1, 0x0C, 0x2E, 0x16, 0x91, 0xC2, 0x5D, 0xE0, 0x16, 0x41,\n    0x91, 0xA9, 0x27, 0x84, 0x36, 0x1C, 0xC2, 0xAC, 0x10, 0x69, 0x1E, 0x5E, 0x83, 0xE4, 0xA2, 0x9B,\n    0xEE, 0x4F, 0xAE, 0xE5, 0xAF, 0x83, 0x6C, 0xD7, 0xF8, 0x24, 0x41, 0x33, 0x2B, 0x02, 0xD8, 0xBE,\n    0x77, 0x8D, 0xC4, 0x86, 0xBA, 0x2F, 0xE6, 0x0F, 0x46, 0xE8, 0x83, 0x38, 0x8E, 0x17, 0x02, 0x98,\n    0xF7, 0x3B, 0xA0, 0x0C, 0xDD, 0x34, 0x25, 0x0C, 0x19, 0x94, 0x18, 0xF9, 0xA7, 0xCD, 0x33, 0xED,\n    0xD1, 0xA9, 0x8B, 0xB7, 0xEF, 0x6B, 0xF0, 0x1D, 0x71, 0x22, 0x6D, 0xC5, 0x5B, 0xF0, 0xCA, 0x08,\n    0xE0, 0xBE, 0x75, 0x76, 0x5E, 0x50, 0x68, 0xA3, 0xC1, 0x39, 0x08, 0x18, 0x85, 0xA8, 0xC6, 0xDE,\n    0x50, 0x0E, 0xF0, 0x38, 0x8B, 0xA9, 0x16, 0xFB, 0x2D, 0x69, 0x16, 0xA2, 0x55, 0x3D, 0x48, 0x82,\n    0xD3, 0x14, 0xCA, 0x76, 0x26, 0xA3, 0x61, 0x56, 0xC1, 0x0E, 0xF7, 0xAE, 0x61, 0xC4, 0xEC, 0xB8,\n    0x1D, 0x7C, 0x8E, 0x4A, 0x9F, 0xC4, 0x62, 0xB8, 0x5A, 0x42, 0x5E, 0xA9, 0x5E, 0x20, 0x06, 0x66,\n    0xBD, 0x53, 0x49, 0x84, 0x8C, 0xE7, 0xA4, 0xB3, 0xF8, 0x25, 0xA3, 0xF8, 0x49, 0x8B, 0x8F, 0x66,\n    0xEF, 0xC9, 0xBF, 0x88, 0x5A, 0xE9, 0x22, 0xDD, 0x38, 0xEE, 0xED, 0x7B, 0xB7, 0x0C, 0x0A, 0xEC,\n    0x26, 0x72, 0x5A, 0xE8, 0xAF, 0x62, 0xAE, 0x01, 0xFA, 0xA0, 0x91, 0x52, 0x55, 0x49, 0x09, 0x5A,\n    0x4E, 0xC4, 0xB4, 0x78, 0x8C, 0xAE, 0x4F, 0xED, 0x32, 0x88, 0x55, 0xE1, 0x40, 0xDA, 0x77, 0x1A,\n    0x17, 0x00, 0x9C, 0x14, 0xB9, 0x52, 0x94, 0xB3, 0x02, 0x91, 0x03, 0x90, 0xF4, 0xF1, 0x4C, 0x52,\n    0x6C, 0x52, 0x39, 0xC5, 0x92, 0xCE, 0x91, 0x42, 0x27, 0xAE, 0x16, 0x44, 0xCF, 0xE4, 0xB8, 0x51,\n    0x39, 0x03, 0xC0, 0xEE, 0xCE, 0xAB, 0x9F, 0x76, 0x75, 0x53, 0xCD, 0x5E, 0x88, 0x54, 0x9F, 0x61,\n    0x70, 0xFA, 0xDD, 0x36, 0xFA, 0x37, 0x35, 0x6D, 0xF4, 0x0F, 0x29, 0xC2, 0x22, 0x40, 0x7B, 0x86,\n    0x7E, 0xCE, 0x9A, 0xED, 0x1A, 0xDC, 0x49, 0xDE, 0x7A, 0xCD, 0xCB, 0x0F, 0xAB, 0xFC, 0x97, 0xC8,\n    0x8B, 0x3A, 0x0A, 0xAB, 0x23, 0x6D, 0xFC, 0xE9, 0xC4, 0x30, 0x46, 0x30, 0x82, 0x14, 0xFB, 0xBA,\n    0x77, 0x6F, 0x16, 0x32, 0xD7, 0xE8, 0xAA, 0x79, 0x3D, 0x0B, 0x91, 0x11, 0x45, 0x57, 0x05, 0x79,\n    0x99, 0x12, 0x55, 0x36, 0x5B, 0x06, 0xCA, 0xAA, 0x82, 0x51, 0x84, 0x8B, 0x20, 0xE9, 0x6A, 0x3A,\n    0x17, 0x30, 0x30, 0xFD, 0x99, 0xEC, 0xBD, 0x54, 0xCC, 0x3A, 0xC0, 0xFF, 0x5C, 0x49, 0xE0, 0x6C,\n    0x99, 0x0F, 0x48, 0xCD, 0x70, 0x62, 0x7B, 0x69, 0x92, 0x34, 0x2D, 0x44, 0x63, 0x23, 0x9E, 0x1F,\n    0x17, 0x7B, 0x2A, 0xF5, 0x06, 0x02, 0x24, 0x21, 0x51, 0x2E, 0x02, 0x2D, 0x23, 0x51, 0x7C, 0x8E,\n    0xD3, 0x32, 0xE2, 0x28, 0x3B, 0x6B, 0x0E, 0x5B, 0x4B, 0xD5, 0x2B, 0x38, 0x1E, 0x5C, 0xC9, 0x31,\n    0x88, 0x85, 0xB9, 0xD3, 0x6F, 0x37, 0xAF, 0x93, 0x80, 0xD6, 0x19, 0x31, 0x9A, 0x98, 0x45, 0xF9,\n    0x74, 0x30, 0x99, 0x56, 0x29, 0xF3, 0xFA, 0x33, 0x6A, 0xBB, 0x70, 0x58, 0x53, 0x0E, 0x17, 0x27,\n    0xDD, 0x3D, 0xE8, 0x07, 0x85, 0x2A, 0xCB, 0x33, 0x60, 0x23, 0xB0, 0xE9, 0x60, 0x7C, 0xF1, 0x47,\n    0x69, 0xE1, 0x69, 0x57, 0x3E, 0x8C, 0x49, 0x30, 0xA3, 0x7A, 0xD6, 0x79, 0x1F, 0xF9, 0xCF, 0x1C,\n    0xE1, 0x56, 0xF1, 0x92, 0xC0, 0x66, 0xC7, 0x67, 0xF0, 0xC6, 0x78, 0x6A, 0x48, 0x26, 0xD4, 0xE9,\n    0xFA, 0x50, 0x8B, 0xC4, 0xB1, 0x19, 0x96, 0x1F, 0x0C, 0x67, 0x0A, 0xB0, 0x4B, 0x75, 0x1C, 0xBA,\n    0x86, 0x42, 0xE3, 0x2E, 0x0C, 0xF8, 0xFC, 0x19, 0x66, 0x7B, 0x51, 0xDB, 0x3E, 0xBB, 0xA2, 0xC0,\n    0xBF, 0x31, 0x9A, 0x8A, 0x3E, 0x4F, 0x24, 0xA0, 0xD3, 0xDA, 0x15, 0x35, 0x91, 0x10, 0x3F, 0x1B,\n    0x40, 0x9A, 0x79, 0xB7, 0xE4, 0x8B, 0x9E, 0xBB, 0xD8, 0x98, 0x31, 0x8C, 0x69, 0xDE, 0x25, 0xFD,\n    0x0E, 0x87, 0xC3, 0xD9, 0x8C, 0xAD, 0xC0, 0x95, 0x19, 0x15, 0x18, 0xE1, 0xBD, 0xB1, 0x4F, 0xD4,\n    0x94, 0x09, 0x3B, 0xD5, 0x07, 0xC1, 0x72, 0xEE, 0x33, 0xA2, 0x9E, 0xAA, 0x05, 0x4E, 0xD3, 0xD3,\n    0x43, 0x43, 0xB9, 0xE6, 0xBE, 0xCF, 0xE8, 0xE4, 0x00, 0x11, 0x5D, 0xA2, 0x97, 0xAE, 0x1F, 0x3C,\n    0x3C, 0x0F, 0xA5, 0x06, 0xE5, 0xF8, 0xDE, 0x94, 0x00, 0xA0, 0x99, 0xD2, 0x4C, 0x13, 0x05, 0x09,\n    0xB8, 0x08, 0x61, 0x3A, 0x67, 0xBB, 0x77, 0xA8, 0x69, 0xA3, 0x8F, 0xF4, 0xF2, 0x2A, 0x6A, 0x88,\n    0x9E, 0xFD, 0x81, 0xF1, 0x7B, 0xA7, 0xFA, 0x15, 0xCF, 0x32, 0x04, 0x22, 0xD3, 0x62, 0x4C, 0xF4,\n    0x65, 0x76, 0x5C, 0x85, 0x5E, 0x98, 0x18, 0x6A, 0xF8, 0x95, 0xC1, 0x2A, 0x8E, 0xFF, 0xCD, 0x48,\n    0x8E, 0x58, 0xE6, 0xCA, 0x8A, 0x8E, 0xA2, 0x0D, 0x33, 0x35, 0xA0, 0xD3, 0xC6, 0x28, 0x72, 0x63,\n    0xB4, 0xCB, 0x0A, 0xB1, 0x47, 0xF8, 0xFC, 0xF1, 0xC3, 0x7A, 0xAD, 0x56, 0x51, 0x4D, 0xE5, 0x53,\n    0xB1, 0x3F, 0xC4, 0x2C, 0x7E, 0x93, 0xEB, 0x71, 0x91, 0x06, 0x7C, 0xC7, 0x4E, 0x1F, 0xC0, 0x3C,\n    0x70, 0x7C, 0x54, 0x7A, 0xA7, 0x46, 0x92, 0x33, 0x3C, 0x99, 0x32, 0x07, 0xAE, 0x7F, 0xD9, 0xF0,\n    0xEE, 0x4E, 0x26, 0xEE, 0xD7, 0x67, 0xCD, 0xE6, 0x47, 0xD1, 0x1C, 0x17, 0x71, 0x68, 0xAA, 0x07,\n    0xA4, 0xF4, 0xD0, 0x87, 0xA3, 0x65, 0x2D, 0xA8, 0x3A, 0x06, 0x7B, 0x23, 0x6C, 0xA7, 0xD3, 0x4B,\n    0xE3, 0x46, 0x6C, 0x31, 0x5B, 0x4F, 0x8F, 0xBF, 0xEB, 0x17, 0x68, 0x05, 0xF3, 0x3D, 0xD9, 0xA1,\n    0x7B, 0x05, 0x7E, 0x05, 0x14, 0xEF, 0x00, 0xE2, 0xF6, 0xD3, 0xF1, 0x4C, 0x60, 0xC9, 0x71, 0xBD,\n    0x8B, 0x47, 0x84, 0x24, 0x99, 0x94, 0x99, 0x03, 0xB7, 0xE7, 0x1E, 0x8A, 0x56, 0xE0, 0xCB, 0xD8,\n    0x12, 0x73, 0x08, 0x3D, 0x31, 0xCF, 0xE2, 0x46, 0xBF, 0x16, 0x62, 0x13, 0xA3, 0x3B, 0x62, 0x2A,\n    0x6C, 0xF4, 0x77, 0x90, 0x04, 0x7A, 0x95, 0x2C, 0x61, 0xD0, 0xA4, 0x84, 0x3F, 0x32, 0x48, 0xBA,\n    0xE5, 0xCD, 0x39, 0xF5, 0x5D, 0x5A, 0x3E, 0x0A, 0x4C, 0xBF, 0x0A, 0xEC, 0xCF, 0x0B, 0xF2, 0xEA,\n    0x38, 0x17, 0x36, 0xDB, 0xD6, 0x2D, 0x48, 0x78, 0xBB, 0x20, 0x5F, 0x5F, 0xDF, 0x63, 0x6D, 0xF5,\n    0x3D, 0x74, 0xA8, 0xE1, 0xE4, 0x4C, 0x87, 0x65, 0x78, 0x1B, 0x5B, 0xC6, 0xEE, 0x37, 0x69, 0x39,\n    0x8C, 0xD6, 0x3C, 0x24, 0x6B, 0xFE, 0x4A, 0xC9, 0x13, 0xF8, 0x33, 0x2C, 0xDB, 0xA3, 0x7A, 0xE3,\n    0x6C, 0x76, 0x18, 0x01, 0x62, 0x95, 0x67, 0x4A, 0xB5, 0xE7, 0xF4, 0xD7, 0x63, 0x74, 0x2F, 0xE0,\n    0x57, 0x3B, 0x3C, 0x33, 0xC6, 0x06, 0x03, 0xD7, 0x93, 0x0F, 0x8D, 0xDD, 0x57, 0xC3, 0x0C, 0x50,\n    0xBC, 0x08, 0xF6, 0x98, 0xA1, 0x04, 0x1D, 0xC8, 0x46, 0x02, 0x2E, 0x2D, 0x3D, 0xF1, 0xCD, 0x4B,\n    0x9B, 0x3F, 0x0C, 0xBC, 0xD3, 0x2F, 0x87, 0xE7, 0x50, 0xA1, 0x7B, 0x94, 0xC5, 0xCD, 0xEC, 0xE9,\n    0x29, 0xE7, 0x6C, 0xD4, 0xC1, 0x18, 0xA4, 0xCA, 0x4F, 0x00, 0x4E, 0xF9, 0x36, 0x89, 0xFD, 0x07,\n    0x47, 0xE6, 0xD5, 0xB7, 0xAA, 0x34, 0x7C, 0x16, 0x7B, 0xCB, 0x49, 0x92, 0xF2, 0x03, 0x66, 0x8E,\n    0xEF, 0x11, 0xFC, 0x8F, 0x26, 0xA5, 0x78, 0x9A, 0x4B, 0x29, 0xC7, 0x98, 0x15, 0xA1, 0x35, 0x58,\n    0x0C, 0xD5, 0xF8, 0x6F, 0x50, 0x1C, 0xDC, 0x41, 0x20, 0xCC, 0x2A, 0x42, 0xE1, 0xEF, 0x28, 0x22,\n    0x67, 0x89, 0x71, 0x5B, 0x9B, 0xBA, 0x92, 0xED, 0x1C, 0xB6, 0x9C, 0x89, 0xD4, 0x00, 0x21, 0xD3,\n    0xF1, 0xD9, 0x3E, 0x9B, 0x55, 0x71, 0xF7, 0x75, 0x26, 0x5A, 0x13, 0x65, 0xBF, 0x6E, 0x46, 0x90,\n    0x85, 0x7B, 0xD7, 0xD4, 0xDC, 0x90, 0x23, 0x4C, 0x83, 0x12, 0x87, 0x7D, 0x8D, 0xF2, 0x39, 0x4E,\n    0x9A, 0xA0, 0x4A, 0xDE, 0xAB, 0xCA, 0xA7, 0xCB, 0xBD, 0x1A, 0xA5, 0x3F, 0x54, 0x12, 0x92, 0x6F,\n    0xEF, 0x37, 0x88, 0xDD, 0x52, 0xDB, 0xD0, 0x8F, 0xEA, 0xCD, 0x88, 0x69, 0x8C, 0x44, 0x6A, 0xF3,\n    0xD0, 0x61, 0x8B, 0x20, 0x91, 0x17, 0x32, 0x32, 0xBE, 0x39, 0x42, 0xE7, 0x1C, 0x3E, 0x8A, 0x02,\n    0x58, 0x95, 0x76, 0x45, 0x3A, 0x06, 0x28, 0xE0, 0x7A, 0x47, 0x23, 0x87, 0xB1, 0x5F, 0xF0, 0xE1,\n    0x2D, 0x18, 0xA4, 0x9B, 0xE7, 0x90, 0xB3, 0xFC, 0x96, 0x2D, 0xAA, 0x04, 0x72, 0x39, 0xCA, 0xF6,\n    0x8B, 0xFE, 0x5D, 0xF8, 0xAA, 0xFF, 0xBE, 0x94, 0xE3, 0xEF, 0xF2, 0x74, 0x22, 0xD4, 0x8C, 0x82,\n    0x2C, 0x73, 0x8B, 0xB8, 0x39, 0x35, 0xCF, 0xCB, 0x48, 0xE8, 0xAC, 0x05, 0x49, 0xEE, 0x08, 0x30,\n    0xFF, 0x99, 0x48, 0xE1, 0x66, 0xDD, 0x01, 0xD9, 0x39, 0x22, 0xDE, 0x2C, 0x1C, 0x47, 0x08, 0xA3,\n    0x97, 0xFE, 0x02, 0x8C, 0x6B, 0x9E, 0xBF, 0xC4, 0x46, 0xAB, 0x94, 0x6D, 0x86, 0xC2, 0x45, 0x95,\n    0xB9, 0x1D, 0x15, 0x89, 0xA9, 0x76, 0x7A, 0xDD, 0x11, 0xDC, 0x54, 0x4E, 0x37, 0x96, 0x1E, 0x37,\n    0xE2, 0xB4, 0xE0, 0xD8, 0xB6, 0xBC, 0xF8, 0xA4, 0x47, 0xC5, 0x6E, 0x33, 0x8F, 0xC2, 0x5C, 0x3B,\n    0x8E, 0x51, 0x01, 0x10, 0xF1, 0x08, 0x10, 0xD8, 0x47, 0x38, 0xF4, 0x28, 0x22, 0x0E, 0x21, 0x96,\n    0x8B, 0x89, 0xA6, 0x43, 0x6B, 0xDA, 0xBC, 0xD5, 0xDC, 0x74, 0x74, 0xC6, 0x64, 0xCA, 0x6A, 0x42,\n    0x7C, 0x24, 0x80, 0x40, 0x1F, 0x82, 0x19, 0x25, 0xB7, 0x97, 0x40, 0x78, 0x16, 0x18, 0x71, 0x5C,\n    0x44, 0xCD, 0x1B, 0x9F, 0xC9, 0xE0, 0xA6, 0x3F, 0xF4, 0xAA, 0x2B, 0x4E, 0xC2, 0x12, 0x24, 0x3F,\n    0x98, 0xAD, 0x54, 0x84, 0xAF, 0x72, 0xA9, 0xBF, 0x61, 0x85, 0xA1, 0x95, 0xD8, 0xC1, 0x72, 0x4B,\n    0x02, 0x21, 0x38, 0x7E, 0x29, 0xA8, 0x90, 0xBA, 0x9A, 0xF9, 0x4D, 0xB4, 0xFC, 0xAC, 0xB8, 0x27,\n    0x77, 0xA0, 0xBE, 0x1E, 0x45, 0xFE, 0x2B, 0x49, 0x8E, 0x48, 0x66, 0xD5, 0x97, 0x1B, 0x21, 0x65,\n    0x4F, 0xA5, 0x7E, 0xF8, 0x7E, 0x89, 0xB6, 0x1B, 0x4F, 0xB1, 0x2E, 0xC2, 0x84, 0x50, 0xB6, 0xC7,\n    0xD5, 0xBC, 0xEE, 0x86, 0xBE, 0xB7, 0x27, 0xDB, 0xE8, 0xF3, 0x49, 0x02, 0xBF, 0xB1, 0x33, 0x71,\n    0x5D, 0xA3, 0x3D, 0x28, 0x7E, 0x24, 0x76, 0x0E, 0x29, 0xAA, 0x65, 0xC8, 0x0B, 0xD2, 0xE1, 0xF1,\n    0x36, 0x03, 0x2C, 0x28, 0x92, 0x3A, 0x42, 0x5A, 0xF8, 0x20, 0xEE, 0x43, 0xB6, 0x56, 0x12, 0xA9,\n    0x2B, 0x8A, 0xC5, 0x5D, 0x7B, 0x77, 0x76, 0xC3, 0x9B, 0x80, 0xD9, 0x30, 0x7F, 0xE5, 0x0F, 0x2B,\n    0x6A, 0x87, 0x29, 0xEF, 0x51, 0xED, 0x8C, 0x27, 0x2D, 0xD3, 0x9E, 0xEC, 0x4D, 0x3A, 0xDA, 0x65,\n    0xB6, 0x17, 0xD1, 0x73, 0xEE, 0xE7, 0x94, 0x07, 0x12, 0x79, 0x9F, 0xF4, 0xA0, 0x0C, 0x7F, 0x95,\n    0xBB, 0x28, 0xF9, 0xE3, 0x5F, 0x46, 0xB5, 0xC6, 0x0C, 0x4A, 0x18, 0xCB, 0x79, 0xA6, 0x90, 0x36,\n    0xC5, 0xF7, 0x08, 0x36, 0xD2, 0xE7, 0x73, 0x21, 0x59, 0x8F, 0xF5, 0xC8, 0x89, 0xB1, 0x09, 0x11,\n    0x03, 0xCD, 0xA4, 0xB7, 0x64, 0x04, 0x4A, 0xF4, 0x69, 0x06, 0x89, 0x66, 0x9E, 0xB1, 0x96, 0x1C,\n    0x55, 0x22, 0x3F, 0x70, 0xBE, 0x72, 0x3D, 0x7C, 0xBC, 0x18, 0x8F, 0xEF, 0x69, 0x91, 0x76, 0x75,\n    0x21, 0x20, 0x01, 0xAB, 0x44, 0x60, 0x13, 0x6A, 0xBC, 0xB5, 0x0B, 0x95, 0x3E, 0xE4, 0xA3, 0x4E,\n    0x18, 0xD6, 0xBC, 0x51, 0x3C, 0xE2, 0x3D, 0x71, 0x70, 0xFB, 0xBF, 0xAD, 0x5F, 0x57, 0xB6, 0x6E,\n    0x9F, 0xBE, 0x70, 0x69, 0x53, 0xEE, 0x34, 0x53, 0x9D, 0xE5, 0xBD, 0x51, 0x9D, 0x1D, 0xEA, 0xBC,\n    0xD8, 0x89, 0x98, 0xC1, 0x26, 0xCF, 0x0F, 0x65, 0x71, 0xFE, 0x3B, 0x89, 0x9B, 0x5E, 0xAF, 0x6C,\n    0xFD, 0xB2, 0x53, 0x88, 0x42, 0x7C, 0xFB, 0x87, 0x49, 0x69, 0x4D, 0x7D, 0xC9, 0x76, 0xA7, 0x84,\n    0x10, 0xFF, 0xF8, 0x63, 0x64, 0xB1, 0xF2, 0x7D, 0x72, 0x79, 0xD8, 0xF1, 0x8B, 0xB6, 0xA3, 0x80,\n    0xEF, 0x15, 0x92, 0x40, 0xBE, 0x01, 0x05, 0xCB, 0xA8, 0x07, 0x0C, 0xE0, 0xEE, 0x8F, 0xEA, 0xF6,\n    0x62, 0x9B, 0x4C, 0x89, 0xC4, 0x0D, 0xBC, 0x55, 0x32, 0x91, 0xCC, 0x68, 0xD7, 0x40, 0x54, 0x13,\n    0x1D, 0xD9, 0x96, 0x49, 0xB6, 0x63, 0xCB, 0xF3, 0x3E, 0x4C, 0xA1, 0xE3, 0xDA, 0xD1, 0x7C, 0x88,\n    0x2D, 0xB5, 0xED, 0x6F, 0x9D, 0x85, 0x91, 0x3A, 0x5B, 0x80, 0xBB, 0xB8, 0x3B, 0x7E, 0xD2, 0x4B,\n    0xE1, 0xDF, 0x2A, 0x32, 0x5B, 0x2C, 0xED, 0xB4, 0x39, 0xD2, 0x46, 0xB9, 0x3F, 0x4F, 0x98, 0xB5,\n    0xB7, 0xB7, 0x16, 0xE9, 0xB1, 0x2A, 0xD5, 0x3A, 0x1B, 0xC1, 0xC4, 0xA4, 0xEB, 0x15, 0x86, 0x86,\n    0x2E, 0x51, 0xA6, 0xCE, 0x9D, 0xEB, 0x47, 0x15, 0x7F, 0x37, 0x1B, 0x3E, 0x26, 0xED, 0x17, 0xE4,\n    0x23, 0xE2, 0x7E, 0xDA, 0x03, 0xC8, 0x94, 0xE0, 0x50, 0x6C, 0x8C, 0x68, 0xCE, 0x04, 0x24, 0x7F,\n    0x67, 0x0D, 0x2F, 0x77, 0xF7, 0x07, 0x75, 0x33, 0xFE, 0x4C, 0x1B, 0x2C, 0x53, 0x19, 0x47, 0xFA,\n    0x4E, 0x1F, 0x5D, 0x2E, 0x80, 0x2E, 0x9E, 0xE5, 0xA6, 0x4E, 0x41, 0x45, 0x8C, 0x63, 0xA4, 0x4C,\n    0x5E, 0x19, 0x04, 0x51, 0x6A, 0xAF, 0x6E, 0x4F, 0xBB, 0xA8, 0xAB, 0x87, 0xD4, 0xD7, 0x99, 0x59,\n    0x77, 0x54, 0x0E, 0x10, 0xE8, 0x7B, 0xC5, 0x7B, 0x6D, 0x13, 0xA8, 0x58, 0xB7, 0x67, 0xD6, 0x23,\n    0xF1, 0x97, 0xC6, 0xB1, 0xFE, 0x83, 0xE8, 0xBB, 0xC1, 0xD2, 0x26, 0x83, 0xDD, 0x8E, 0x86, 0x4F,\n    0x69, 0xE5, 0xC4, 0x72, 0x56, 0x98, 0x0A, 0xB1, 0x58, 0x03, 0x4E, 0x14, 0xCD, 0x25, 0x65, 0xEF,\n    0x31, 0xD0, 0x68, 0x45, 0x9C, 0x42, 0x84, 0xB8, 0xC9, 0x8F, 0xB0, 0xF8, 0xF1, 0xD2, 0x45, 0x75,\n    0xD3, 0x4F, 0x13, 0x52, 0xD3, 0x8F, 0xF3, 0x8A, 0x3F, 0x73, 0xF0, 0x56, 0x24, 0x1B, 0x77, 0xFC,\n    0xE4, 0xCC, 0x42, 0x57, 0x8F, 0xF8, 0xE8, 0x4C, 0x53, 0x5F, 0x22, 0x35, 0xDD, 0x6E, 0x33, 0x11,\n    0xC8, 0xB2, 0xEB, 0xFF, 0x9B, 0x0F, 0xC7, 0x20, 0xED, 0x6F, 0x70, 0xC8, 0x8D, 0x1E, 0xDE, 0x2F,\n    0x0E, 0x19, 0x50, 0xA2, 0xF1, 0x4F, 0x90, 0x56, 0x07, 0x63, 0x0A, 0x8D, 0xE2, 0x6E, 0xAE, 0x95,\n    0x68, 0xCA, 0xEA, 0x78, 0x0C, 0xB1, 0xA4, 0x30, 0x14, 0x77, 0x48, 0x0C, 0x51, 0xD9, 0xE5, 0x30,\n    0x7C, 0xCE, 0x77, 0xBA, 0xC7, 0x34, 0x9D, 0x25, 0x4D, 0xCF, 0x21, 0xE2, 0xCF, 0x50, 0xBA, 0x2A,\n    0x32, 0xC7, 0x66, 0x07, 0xBA, 0x46, 0xE6, 0x69, 0xDE, 0x46, 0xDF, 0x03, 0x28, 0x51, 0xFE, 0x11,\n    0x1C, 0x33, 0xBC, 0x4F, 0xD4, 0x2E, 0xC3, 0x7A, 0xED, 0x2A, 0xCE, 0xCA, 0x34, 0xE8, 0x4F, 0x65,\n    0x8E, 0xF3, 0x77, 0x05, 0x67, 0xFB, 0xD5, 0x1D, 0x5C, 0x94, 0xB5, 0x27, 0xA9, 0x61, 0xF7, 0x99,\n    0x15, 0x77, 0x2B, 0xA0, 0xB1, 0xB4, 0x3B, 0x72, 0x33, 0x67, 0xA7, 0x70, 0xFB, 0x60, 0x72, 0x04,\n    0xC4, 0x88, 0x4C, 0xA5, 0x1C, 0xEF, 0x17, 0x66, 0x74, 0xAE, 0xBC, 0x01, 0xC3, 0x2F, 0x0D, 0xD6,\n    0x12, 0xDF, 0x4F, 0x2C, 0x63, 0xC1, 0x79, 0xF8, 0x50, 0xC9, 0x52, 0x34, 0xA0, 0x6E, 0x73, 0xBA,\n    0x5A, 0x31, 0x22, 0xF3, 0xC5, 0x98, 0xB0, 0x18, 0xD8, 0x7B, 0x2B, 0x06, 0x47, 0x9D, 0x50, 0xE6,\n    0x16, 0xBF, 0x59, 0xC9, 0x34, 0xF0, 0x51, 0x58, 0x60, 0xD8, 0xEE, 0x83, 0xC8, 0x8B, 0x1E, 0x92,\n    0x8F, 0xF0, 0xDF, 0x12, 0x61, 0xCC, 0x69, 0x21, 0x68, 0xE8, 0x78, 0xB8, 0xF2, 0xF0, 0xDE, 0xE7,\n    0xAB, 0x8A, 0xA4, 0x38, 0x32, 0x06, 0xAE, 0xCD, 0x53, 0x92, 0xE4, 0x9B, 0x2C, 0xC1, 0x63, 0x30,\n    0x29, 0xB5, 0x12, 0x21, 0x99, 0xCA, 0x99, 0x94, 0x92, 0x71, 0xFB, 0x0A, 0x31, 0xEF, 0xBF, 0xE2,\n    0x52, 0x2B, 0xA5, 0xCE, 0x16, 0x5D, 0x15, 0x4A, 0x25, 0xCF, 0x74, 0x96, 0x9A, 0x95, 0x21, 0x2C,\n    0xEA, 0xB7, 0xA1, 0xAE, 0xD4, 0x15, 0x29, 0x38, 0xF9, 0x7B, 0x6C, 0xD7, 0x3A, 0x52, 0xFD, 0x60,\n    0xA2, 0xD0, 0xEE, 0xA5, 0xDF, 0x4C, 0xC6, 0xBF, 0x30, 0x82, 0x20, 0xB6, 0x73, 0x58, 0xC8, 0x7B,\n    0xA8, 0xEA, 0x01, 0x9B, 0xEA, 0x02, 0x89, 0xD0, 0x83, 0x71, 0x14, 0x98, 0xB0, 0x6E, 0x5B, 0x80,\n    0xB4, 0xBA, 0x4D, 0xC5, 0x95, 0x77, 0x5A, 0x44, 0x56, 0x74, 0x12, 0x48, 0xBC, 0xAE, 0x92, 0xCF,\n    0x5A, 0xF9, 0x62, 0xE8, 0x72, 0xA5, 0x72, 0x5B, 0x58, 0xC6, 0x14, 0x29, 0xF1, 0xC4, 0xD6, 0xC6,\n    0x75, 0x71, 0x9C, 0xC4, 0x7D, 0xC5, 0x93, 0x26, 0xA2, 0x9B, 0x1C, 0x30, 0xE8, 0x41, 0xC7, 0x03,\n    0x66, 0x98, 0x2C, 0x10, 0x34, 0x6A, 0x0E, 0xC2, 0x35, 0x53, 0xAA, 0x17, 0x3E, 0xF4, 0xCB, 0x9C,\n    0xC4, 0x1E, 0xB4, 0x79, 0x0B, 0xA0, 0x41, 0x4B, 0xC6, 0xB4, 0xAC, 0x5F, 0xDA, 0x48, 0x01, 0x0D,\n    0xBF, 0xDF, 0x6A, 0x0E, 0x42, 0x16, 0xFC, 0x97, 0x58, 0x98, 0x04, 0xDA, 0x46, 0x1E, 0x37, 0x55,\n    0x77, 0x2A, 0xB8, 0x58, 0x6B, 0x9E, 0x55, 0x2E, 0xF6, 0x52, 0x17, 0x38, 0xE1, 0xA7, 0xD9, 0xA0,\n    0x08, 0xF3, 0x3E, 0x0B, 0xE4, 0x10, 0x37, 0x2A, 0x16, 0x54, 0x63, 0x1E, 0x5A, 0x43, 0xC7, 0xDE,\n    0xA3, 0xE9, 0x3B, 0x85, 0x3A, 0xFB, 0x03, 0xE9, 0xDE, 0xD9, 0x1C, 0xDD, 0x9B, 0x56, 0x4F, 0x70,\n    0x77, 0xDD, 0xF3, 0xBA, 0x0F, 0xA4, 0x0F, 0x12, 0x5A, 0x1C, 0xF4, 0x32, 0xE8, 0x58, 0x6C, 0x23,\n    0xC5, 0x46, 0x2E, 0x1C, 0xCA, 0xE0, 0x99, 0x27, 0x77, 0xC8, 0x14, 0xD3, 0x34, 0xA4, 0xEA, 0xDD,\n    0x76, 0x3C, 0x91, 0x39, 0x96, 0x2A, 0xEE, 0x63, 0x05, 0x6A, 0x2D, 0x65, 0x48, 0x88, 0xE6, 0x9D,\n    0x26, 0xE3, 0x95, 0xD6, 0xFC, 0x86, 0xC8, 0x41, 0xB5, 0x14, 0x99, 0x2C, 0x35, 0x8C, 0xBD, 0xA8,\n    0x28, 0x1D, 0xF7, 0x74, 0x00, 0x36, 0xCA, 0xE8, 0xBB, 0x28, 0x35, 0x03, 0x10, 0x23, 0xEC, 0x82,\n    0x4C, 0x32, 0x59, 0xAB, 0x6B, 0x01, 0x2B, 0x42, 0xEB, 0x67, 0x4D, 0x49, 0x80, 0x47, 0x7C, 0xD0,\n    0xFE, 0x48, 0xB5, 0xC8, 0xB3, 0xF3, 0x06, 0x37, 0x13, 0x65, 0xF1, 0x53, 0x9C, 0x24, 0x00, 0x29,\n    0x41, 0x8E, 0x97, 0xE7, 0x47, 0x21, 0xF8, 0xB6, 0xEF, 0xC1, 0x08, 0xAC, 0x8B, 0xF3, 0xDF, 0xD1,\n    0x9B, 0xED, 0x16, 0xEA, 0x5C, 0x3C, 0x39, 0xF6, 0xB9, 0x0F, 0x0D, 0xC1, 0x0C, 0x79, 0xB4, 0xFA,\n    0xEC, 0x7F, 0xD2, 0xE0, 0x80, 0xEC, 0xF1, 0x88, 0xBE, 0x68, 0xA8, 0xD1, 0x38, 0xB5, 0xFE, 0xB5,\n    0xED, 0x1A, 0xB1, 0x8D, 0xBC, 0x50, 0x9B, 0xA5, 0x40, 0x45, 0xB4, 0x94, 0x25, 0xF8, 0xA5, 0xEB,\n    0x88, 0x00, 0xC8, 0xCA, 0xBA, 0x86, 0xF6, 0xB6, 0xDA, 0xC0, 0xF3, 0x42, 0xDA, 0xE4, 0x16, 0xB1,\n    0x3A, 0xC1, 0xAB, 0x29, 0xF8, 0xD2, 0xCF, 0xB6, 0x24, 0xBD, 0xE9, 0xA7, 0x18, 0xA7, 0xED, 0x80,\n    0x0B, 0x0A, 0x91, 0xD7, 0x8C, 0xC9, 0x60, 0x5F, 0x73, 0xBE, 0x7C, 0x12, 0x26, 0xED, 0xC5, 0xA4,\n    0x55, 0x83, 0x55, 0x93, 0x74, 0xF7, 0x1B, 0x05, 0x8B, 0xBA, 0x88, 0x1D, 0x42, 0x9A, 0x15, 0x78,\n    0x9F, 0xE9, 0x62, 0x95, 0x65, 0xD5, 0x16, 0x02, 0x1F, 0xCA, 0x13, 0xA8, 0x52, 0x84, 0xBF, 0xAD,\n    0xE5, 0xDD, 0xDB, 0x18, 0xB5, 0x37, 0x8D, 0x70, 0x5E, 0xF9, 0xE3, 0xC2, 0x33, 0x1F, 0xCC, 0x97,\n    0x52, 0x35, 0x13, 0xD9, 0xD0, 0x29, 0x44, 0x0B, 0xD8, 0xBD, 0xB2, 0x93, 0x6C, 0x2C, 0xAC, 0x7B,\n    0x14, 0x94, 0x67, 0xCC, 0x65, 0x5E, 0x78, 0x53, 0x82, 0x72, 0xFE, 0xFB, 0xD9, 0x04, 0x5F, 0x90,\n    0x6C, 0xB0, 0xFB, 0x80, 0x6C, 0x7D, 0x0B, 0x62, 0x8B, 0x7B, 0x73, 0x7D, 0x1F, 0x6B, 0x93, 0x7D,\n    0x07, 0x66, 0x98, 0xBB, 0xB2, 0x49, 0xB3, 0x34, 0x10, 0xBB, 0x23, 0x2B, 0x14, 0xA0, 0xB4, 0x4A,\n    0xC1, 0x56, 0x7B, 0x47, 0xD4, 0x49, 0x97, 0x4D, 0x69, 0x9C, 0xFC, 0x7C, 0xF2, 0x87, 0xF4, 0x8B,\n    0xA4, 0xD6, 0xF8, 0xAE, 0x3B, 0x8F, 0x9A, 0x5B, 0x90, 0x29, 0x9C, 0xD9, 0xE2, 0xA9, 0xA2, 0x60,\n    0x52, 0x4A, 0x1F, 0xE5, 0x6E, 0x7C, 0x49, 0xEC, 0x83, 0xA8, 0x0E, 0x79, 0x5B, 0x0A, 0x1F, 0x53,\n    0xDB, 0x6C, 0xEF, 0x78, 0x2D, 0x52, 0xBA, 0x00, 0x3A, 0x49, 0xB2, 0xB1, 0x56, 0x1C, 0x3B, 0x7E,\n    0x99, 0x9C, 0x20, 0xB7, 0xC7, 0x9E, 0x8B, 0x8C, 0x88, 0xF2, 0x15, 0xFF, 0x4F, 0x06, 0xF4, 0x1B,\n    0x6F, 0x02, 0x1E, 0x3A, 0x29, 0xA0, 0x7B, 0xFA, 0x2C, 0x26, 0x58, 0xE3, 0x75, 0x5F, 0xB8, 0x94,\n    0x27, 0x70, 0xF6, 0xA5, 0x79, 0x51, 0x0F, 0x72, 0x52, 0x81, 0xDC, 0xDC, 0x74, 0x93, 0xAF, 0xB4,\n    0xB5, 0x9F, 0xF2, 0x03, 0x4F, 0x79, 0x0A, 0xC5, 0xB9, 0xC7, 0x3E, 0x12, 0x53, 0x3A, 0x63, 0x6A,\n    0x8A, 0x27, 0xB6, 0x9D, 0x4C, 0x84, 0x87, 0x92, 0xBF, 0x7D, 0x49, 0x52, 0xAF, 0x10, 0xCD, 0x6C,\n    0x58, 0xC5, 0xF0, 0xFE, 0x59, 0x5C, 0xA8, 0x5A, 0xDE, 0x0E, 0x19, 0x23, 0x3F, 0x01, 0x87, 0xFD,\n    0x95, 0xA8, 0x61, 0x90, 0x06, 0x49, 0x77, 0xD8, 0xAD, 0xC4, 0x5D, 0x72, 0x65, 0x5D, 0x2A, 0x48,\n    0x70, 0xE1, 0x37, 0x2C, 0x20, 0x50, 0x24, 0xC4, 0xE7, 0x74, 0x91, 0x30, 0x91, 0x0E, 0xA3, 0x8B,\n    0x73, 0x6C, 0x31, 0xE1, 0xAF, 0xC7, 0x8C, 0x37, 0xF8, 0x22, 0x71, 0x36, 0xCA, 0xE0, 0xE1, 0x41,\n    0xF6, 0x74, 0x26, 0x17, 0x08, 0xC2, 0xD9, 0xB5, 0xCE, 0x4A, 0x67, 0x17, 0xC2, 0x54, 0xA0, 0x1F,\n    0x22, 0xFF, 0x8D, 0xB6, 0x60, 0x26, 0x7B, 0x7B, 0x05, 0x0D, 0x69, 0xAE, 0x6F, 0x09, 0x78, 0x9D,\n    0xD0, 0x2C, 0x59, 0xB1, 0xE7, 0xAB, 0x9F, 0x5F, 0x0C, 0xB7, 0xB4, 0x98, 0x47, 0x85, 0x28, 0x24,\n    0x74, 0x05, 0x79, 0xC8, 0x37, 0xDB, 0x2D, 0x71, 0xBA, 0x70, 0x24, 0x1D, 0xC6, 0x4C, 0x23, 0xF6,\n    0xFE, 0xE5, 0x47, 0x33, 0xA2, 0xAE, 0x44, 0xB1, 0x64, 0x5D, 0xAB, 0xA3, 0xD5, 0xF1, 0x91, 0x12,\n    0xA1, 0x12, 0x42, 0xFC, 0xF5, 0xE7, 0x15, 0x57, 0x1F, 0x3F, 0x08, 0x7F, 0xD4, 0x5D, 0x0B, 0x97,\n    0x43, 0x0B, 0xF3, 0x36, 0x54, 0xF6, 0x0A, 0x54, 0xE4, 0x77, 0xBE, 0xDF, 0x8A, 0xCA, 0xC2, 0x43,\n    0x5F, 0x4A, 0x32, 0xBC, 0x9A, 0x20, 0x27, 0xB3, 0xB9, 0x2F, 0xA7, 0x92, 0x8E, 0xDD, 0x12, 0x15,\n    0x27, 0x5A, 0x0D, 0xD6, 0x5E, 0xC7, 0xDE, 0xFB, 0x78, 0xE6, 0x63, 0x5E, 0x07, 0x35, 0xC7, 0xAE,\n    0x04, 0xC0, 0x14, 0xDB, 0x26, 0x45, 0x4D, 0x57, 0x91, 0x4A, 0xB5, 0xDE, 0xF8, 0x40, 0xE1, 0xE4,\n    0x6C, 0x32, 0xCC, 0x37, 0x44, 0x34, 0x05, 0xC8, 0xC3, 0x49, 0x28, 0xFA, 0xED, 0x93, 0x08, 0x10,\n    0xA8, 0x8B, 0x00, 0x8C, 0x4D, 0xF5, 0x23, 0xB1, 0x47, 0x2E, 0x2E, 0x6B, 0xC8, 0x18, 0x89, 0x86,\n    0x59, 0xBA, 0xC7, 0x3F, 0x1C, 0xD5, 0x24, 0x35, 0xBC, 0x37, 0x46, 0x7F, 0xB3, 0x7E, 0xEF, 0x35,\n    0xA9, 0x1C, 0x2D, 0x8F, 0x10, 0x11, 0x07, 0x8B, 0x5C, 0x1C, 0x4C, 0x42, 0xC6, 0xE6, 0x17, 0x32,\n    0xF1, 0xBF, 0x61, 0x7A, 0x75, 0x3E, 0x02, 0x58, 0xE1, 0x6B, 0x59, 0x1E, 0xFF, 0x16, 0xC8, 0x65,\n    0xAF, 0xF1, 0xB1, 0x14, 0x86, 0x84, 0xC1, 0x03, 0x7A, 0x75, 0x7B, 0x9E, 0x6B, 0xD2, 0x4C, 0x39,\n    0xD0, 0x01, 0x71, 0xB7, 0xFA, 0x36, 0x78, 0x59, 0xB5, 0xF0, 0x63, 0xF1, 0x24, 0xD1, 0x10, 0x37,\n    0x92, 0xF6, 0x0F, 0x58, 0x7A, 0xC7, 0xCE, 0xB5, 0xC9, 0x79, 0x1C, 0x38, 0x36, 0x07, 0x34, 0x99,\n    0xCE, 0xC4, 0x97, 0x98, 0x7C, 0xA0, 0xA7, 0xD0, 0x04, 0x2B, 0x5F, 0x10, 0xC9, 0xE8, 0x7A, 0xF6,\n    0x5C, 0xFC, 0xAC, 0xF4, 0x6F, 0x2E, 0x6B, 0xB7, 0xE8, 0xC5, 0x26, 0xC5, 0xB1, 0x38, 0x8E, 0x5B,\n    0x81, 0x90, 0x1C, 0x38, 0xB8, 0x8F, 0xD0, 0x82, 0x1B, 0xF0, 0x4A, 0x0C, 0x46, 0x8B, 0xED, 0x49,\n    0x21, 0xD9, 0x6D, 0x17, 0x29, 0xA1, 0xBB, 0x59, 0xDE, 0x98, 0x24, 0xDF, 0xAE, 0x07, 0xC5, 0x92,\n    0xD2, 0xC9, 0x92, 0x00, 0x8F, 0xB0, 0xB0, 0x36, 0x58, 0xFA, 0xB8, 0xB0, 0x43, 0x17, 0xB0, 0xA3,\n    0x3B, 0xAF, 0x39, 0xB8, 0x31, 0x8A, 0x38, 0xBF, 0xD2, 0xEE, 0x06, 0x0B, 0xB6, 0x99, 0x00, 0x41,\n    0xF5, 0x72, 0x9A, 0x9C, 0x1F, 0xBA, 0xFB, 0x22, 0xB3, 0xA5, 0x8A, 0x11, 0x7B, 0xF2, 0x53, 0xEB,\n    0x90, 0x60, 0x72, 0x3C, 0xC3, 0x56, 0xAC, 0xBD, 0xE2, 0xFA, 0xBF, 0x37, 0xB8, 0x9F, 0xDD, 0x4E,\n    0xF1, 0x05, 0x9E, 0x65, 0x3B, 0x45, 0x89, 0xA5, 0xD3, 0xA3, 0xBA, 0xD4, 0x1C, 0xCA, 0x0C, 0xCE,\n    0xDC, 0x5C, 0x66, 0xFE, 0x4B, 0x44, 0x1A, 0xC9, 0xB0, 0x52, 0x02, 0xCD, 0x47, 0x89, 0x90, 0x2E,\n    0xA4, 0x3F, 0xEC, 0x90, 0xCD, 0x84, 0xF3, 0x58, 0x6B, 0x24, 0xBA, 0x03, 0xBC, 0x57, 0x1B, 0xA2,\n    0xAC, 0xF2, 0x80, 0x0F, 0x26, 0x04, 0x59, 0xA2, 0x74, 0x07, 0x03, 0xFD, 0xC4, 0x57, 0x29, 0xCF,\n    0x90, 0xF7, 0xD3, 0x58, 0x4A, 0x71, 0x69, 0x7C, 0x7F, 0x52, 0x77, 0x1B, 0x0D, 0xFF, 0x0A, 0x59,\n    0x80, 0x4E, 0x3F, 0xE8, 0x82, 0xB6, 0xA5, 0x68, 0x9C, 0x62, 0x3A, 0x6C, 0x71, 0x3A, 0xCA, 0x23,\n    0x6E, 0x03, 0xB1, 0x50, 0x32, 0x13, 0x27, 0x81, 0xCB, 0x68, 0x42, 0x7D, 0x32, 0x23, 0x4F, 0x85,\n    0x39, 0x76, 0x8C, 0x8F, 0xB0, 0x73, 0xD3, 0xED, 0x56, 0xF0, 0xC6, 0x66, 0x01, 0x13, 0xB4, 0x13,\n    0x95, 0x8E, 0x49, 0x22, 0x4F, 0x5D, 0xFF, 0xDB, 0xAE, 0x50, 0x71, 0x6E, 0xC2, 0xA2, 0xA7, 0x70,\n    0xEE, 0xDB, 0xB5, 0x18, 0x1E, 0x4C, 0x0F, 0x57, 0xC7, 0x4E, 0x46, 0xDD, 0x78, 0x5F, 0x1A, 0xEE,\n    0x02, 0xAC, 0x80, 0xE4, 0xA8, 0x38, 0x67, 0xAD, 0x5C, 0xF7, 0x00, 0xC5, 0xCA, 0x0B, 0x52, 0x49,\n    0x94, 0x43, 0x97, 0x90, 0x46, 0xF5, 0x1A, 0xA5, 0x21, 0x7E, 0x05, 0xAC, 0xF1, 0x97, 0x66, 0x42,\n    0xFB, 0x5D, 0x4F, 0x71, 0x4B, 0x8E, 0x3E, 0xC3, 0x9E, 0x14, 0xF7, 0xAD, 0xDE, 0x34, 0xEB, 0x9C,\n    0x06, 0xB1, 0x8A, 0xE2, 0x9D, 0xA6, 0x25, 0xFD, 0x1B, 0x69, 0xDF, 0x41, 0x60, 0xBF, 0xA4, 0x04,\n    0x5C, 0xF7, 0x76, 0xFD, 0x22, 0x30, 0x0C, 0x63, 0xDB, 0xAD, 0x42, 0xA8, 0x0A, 0x97, 0xE7, 0xF0,\n    0x57, 0x9D, 0x17, 0x6B, 0x37, 0x5D, 0x35, 0xC9, 0x5F, 0xAC, 0xF6, 0xB8, 0x89, 0x41, 0xB0, 0x6F,\n    0x49, 0xA8, 0x47, 0x61, 0xB1, 0x63, 0x65, 0x40, 0x07, 0xD8, 0xC5, 0x5A, 0x5D, 0x1D, 0x82, 0x7F,\n    0xCC, 0x6A, 0xF2, 0xA1, 0x36, 0x3C, 0xC0, 0x51, 0x6E, 0xD3, 0x4B, 0x36, 0xE0, 0x07, 0xCE, 0xA3,\n    0x9B, 0xB1, 0x13, 0x04, 0x32, 0x87, 0x75, 0x4A, 0x16, 0x34, 0xB4, 0x75, 0x0F, 0x75, 0x33, 0x7C,\n    0xEC, 0x02, 0x35, 0xA9, 0x49, 0x39, 0xF6, 0x24, 0x03, 0x73, 0xCE, 0x54, 0x45, 0x02, 0x6C, 0x0A,\n    0x53, 0x2B, 0x73, 0x38, 0x3C, 0x81, 0x56, 0xA7, 0xBB, 0xF2, 0x73, 0x0F, 0xC7, 0xB7, 0x0E, 0xAA,\n    0x45, 0x62, 0xA6, 0x29, 0x8C, 0xC9, 0x0D, 0x45, 0x0E, 0xBD, 0xDB, 0xD8, 0x71, 0x5C, 0xD7, 0x18,\n    0xFC, 0xB0, 0x61, 0x89, 0xA2, 0x22, 0xF4, 0xF5, 0x48, 0x38, 0xE8, 0x7F, 0x17, 0x5C, 0x82, 0xF6,\n    0x2D, 0x1F, 0x28, 0x85, 0xD9, 0xB7, 0x16, 0xA4, 0x52, 0x6F, 0x3A, 0xF1, 0xEE, 0xA7, 0x2D, 0x99,\n    0x71, 0xAD, 0xAA, 0x15, 0x24, 0xD8, 0x86, 0x1D, 0x78, 0x90, 0x0B, 0x4C, 0x4E, 0x78, 0xC1, 0xC2,\n    0xD7, 0xED, 0xE6, 0xB4, 0xF0, 0xAC, 0x2A, 0xFD, 0xE6, 0x75, 0xBA, 0xCA, 0x0C, 0xAD, 0xD6, 0x3D,\n    0x38, 0x4D, 0x1F, 0xE9, 0x7D, 0x87, 0xA8, 0xCA, 0x13, 0x1A, 0xFA, 0x72, 0x53, 0x8E, 0xB2, 0x2F,\n    0xE3, 0xAD, 0xAA, 0x8E, 0x7A, 0xBA, 0x6A, 0xBC, 0x2C, 0x8E, 0xBA, 0xD5, 0x0B, 0x3E, 0x2F, 0x4D,\n    0xB3, 0xC4, 0xF6, 0x6F, 0x01, 0xEF, 0x90, 0x60, 0xC9, 0x3D, 0xD2, 0x93, 0x45, 0x03, 0xCB, 0x65,\n    0x11, 0xE1, 0xAD, 0x7A, 0x90, 0xCE, 0xFA, 0x41, 0x05, 0x45, 0x55, 0x10, 0xE9, 0x44, 0xBF, 0x59,\n    0x58, 0xC2, 0x71, 0xDB, 0x00, 0xBA, 0x0C, 0x32, 0x08, 0xF9, 0xB1, 0x58, 0xFA, 0xE6, 0x45, 0xFD,\n    0x0B, 0xBC, 0x23, 0xB7, 0x82, 0xE1, 0x89, 0x3A, 0x1F, 0xA1, 0xDA, 0xD2, 0x27, 0x7A, 0x0C, 0x18,\n    0xA1, 0x1D, 0x02, 0xD0, 0x59, 0xEE, 0xA8, 0x42, 0xF4, 0x67, 0x02, 0x0A, 0xC1, 0xB0, 0xC2, 0x3E,\n    0x8E, 0x86, 0xAD, 0xB5, 0x3B, 0x78, 0x05, 0xBE, 0x51, 0x12, 0xBF, 0x50, 0x58, 0xBD, 0xF3, 0x94,\n    0xFB, 0x02, 0x04, 0x38, 0x5F, 0xFD, 0xDC, 0x7D, 0xCB, 0xDA, 0x26, 0x36, 0x79, 0x5C, 0x89, 0x52,\n    0xB8, 0xF8, 0x96, 0x4B, 0xA9, 0x49, 0x43, 0xB5, 0x32, 0x22, 0x40, 0x27, 0x67, 0xFE, 0x46, 0xB9,\n    0x0B, 0x17, 0x75, 0x4B, 0xEB, 0x08, 0xA1, 0xDE, 0xC6, 0x7E, 0xD5, 0xAF, 0x4A, 0x69, 0xAA, 0x8C,\n    0xA1, 0x74, 0x33, 0x54, 0x33, 0x47, 0x62, 0x00, 0xE8, 0x63, 0x76, 0x4C, 0xE7, 0x76, 0xEE, 0x78,\n    0x5A, 0xB8, 0x44, 0x4A, 0x8F, 0x0D, 0xD7, 0x32, 0xC4, 0xB9, 0xB0, 0x1A, 0xF9, 0x58, 0x8F, 0x9E,\n    0x06, 0x9F, 0x87, 0x9D, 0x29, 0x1E, 0xBF, 0xA5, 0xFD, 0xA6, 0xCD, 0xF9, 0xD8, 0x6D, 0x01, 0xCC,\n    0x0F, 0xF6, 0x52, 0xCB, 0xFA, 0xE0, 0xA5, 0x2D, 0xCC, 0xB9, 0xA0, 0xB1, 0x9D, 0xD3, 0x09, 0x24,\n    0x34, 0xD7, 0x01, 0x15, 0x3D, 0xEB, 0x0F, 0x07, 0xAC, 0x3A, 0x94, 0xCC, 0xAA, 0x52, 0x1E, 0xBD,\n    0x4C, 0x49, 0xCD, 0x22, 0x85, 0x89, 0x47, 0x27, 0x21, 0x4E, 0x96, 0x41, 0x94, 0x6F, 0xFF, 0x2E,\n    0x69, 0x3A, 0x6B, 0xA7, 0x74, 0xBA, 0x9B, 0xEB, 0x25, 0x5E, 0xA9, 0x5A, 0xE0, 0x66, 0x59, 0xF6,\n    0x18, 0x5B, 0x77, 0xDF, 0x8E, 0x56, 0x67, 0x52, 0x2C, 0xDA, 0x0C, 0xB0, 0xF2, 0xF8, 0xB9, 0xE2,\n    0x80, 0xB4, 0x2A, 0x6E, 0xFF, 0x81, 0xC2, 0x72, 0x7C, 0xEE, 0x71, 0xC7, 0x06, 0xF5, 0x61, 0xAC,\n    0xFC, 0x77, 0x84, 0xD4, 0xEB, 0x41, 0x95, 0x7F, 0xEE, 0xD0, 0xDD, 0x91, 0x20, 0xAE, 0xF9, 0xBE,\n    0xF8, 0x30, 0xF3, 0x25, 0x57, 0xA4, 0x1D, 0xDB, 0x0F, 0xD3, 0x5A, 0xA7, 0x93, 0x1B, 0x83, 0x4B,\n    0x62, 0xD4, 0x4C, 0xA1, 0xD6, 0x34, 0x0D, 0xBC, 0x36, 0x00, 0x35, 0x65, 0x61, 0x14, 0x48, 0x03,\n    0x4B, 0xB5, 0xBB, 0xFA, 0x5D, 0xB0, 0x2D, 0xCA, 0x8E, 0x54, 0x2A, 0xBA, 0x77, 0xA4, 0xE4, 0x94,\n    0x31, 0x21, 0x0B, 0xDB, 0x04, 0xA2, 0x6B, 0xEB, 0x80, 0xF2, 0x71, 0xD9, 0x2E, 0xDA, 0x8C, 0x61,\n    0xA5, 0x79, 0x48, 0x7F, 0x70, 0xFB, 0x04, 0xF5, 0xB8, 0xA0, 0xCD, 0x1D, 0xB0, 0xBF, 0x62, 0x29,\n    0xC1, 0xAB, 0xB1, 0xA1, 0xD8, 0x6E, 0x48, 0xC7, 0x0B, 0x20, 0x1A, 0xF6, 0xD6, 0xB2, 0x37, 0xD2,\n    0xA3, 0xCC, 0x84, 0x33, 0xBD, 0x90, 0xFE, 0x23, 0x10, 0x9A, 0x41, 0x0A, 0xBA, 0xB3, 0xE6, 0x75,\n    0x62, 0x7D, 0x91, 0x82, 0x1C, 0x45, 0xBB, 0x24, 0xD3, 0x67, 0xDA, 0xB2, 0xA5, 0xE5, 0x0F, 0xDF,\n    0x0B, 0x58, 0xDA, 0x25, 0xEB, 0x02, 0x66, 0xE1, 0x5C, 0xEA, 0x3E, 0x6B, 0x32, 0xFF, 0xFA, 0x8A,\n    0x6F, 0x91, 0x23, 0x3E, 0x52, 0xD5, 0x84, 0x30, 0xA4, 0x15, 0xB5, 0x04, 0xCC, 0xCE, 0x10, 0x9F,\n    0x04, 0xD2, 0x53, 0x94, 0xB9, 0x01, 0x71, 0x0D, 0xA2, 0xA0, 0xCB, 0x8F, 0x9C, 0xA3, 0x49, 0x6C,\n    0x2A, 0x3E, 0x88, 0xC3, 0x39, 0x05, 0x99, 0x57, 0xAE, 0xEA, 0x38, 0x78, 0xF9, 0x4C, 0x49, 0x1D,\n    0xCE, 0x32, 0x10, 0x4A, 0x10, 0x24, 0x5D, 0x16, 0xBE, 0x82, 0x40, 0x28, 0xC5, 0xC4, 0xC9, 0x4E,\n    0xE0, 0xF9, 0x68, 0xB8, 0x83, 0x68, 0xAC, 0x2F, 0x74, 0xB1, 0x9B, 0x52, 0xFC, 0x0D, 0x31, 0xBB,\n    0xF2, 0xB0, 0x24, 0x94, 0x78, 0x8C, 0x39, 0xEC, 0xA7, 0xDE, 0x3F, 0xF4, 0xC7, 0xC8, 0x4A, 0x3B,\n    0x37, 0x42, 0x41, 0x46, 0x4B, 0x5D, 0x53, 0x6C, 0x45, 0xB2, 0x2A, 0x6E, 0x6A, 0x4A, 0x8F, 0xDD,\n    0x56, 0x1E, 0xAA, 0xB2, 0x41, 0x60, 0xDC, 0xE7, 0x45, 0x86, 0xFD, 0xE2, 0xCE, 0xD9, 0x9B, 0x98,\n    0x39, 0x4E, 0xBE, 0x2B, 0x89, 0x2E, 0xEF, 0xCB, 0xE4, 0x4D, 0xCD, 0x00, 0x0A, 0x8E, 0x69, 0xAD,\n    0x36, 0x0A, 0xBB, 0xCC, 0x5E, 0x8F, 0x5D, 0x12, 0x30, 0x6E, 0xEF, 0xAE, 0x4E, 0xAD, 0xFE, 0xF8,\n    0x3D, 0x71, 0x61, 0x75, 0x37, 0x5B, 0x61, 0xC7, 0x1B, 0x38, 0xFB, 0x16, 0x19, 0xD7, 0x82, 0x5F,\n    0x98, 0x4E, 0xDF, 0x7E, 0xAD, 0x24, 0x38, 0x6E, 0xCF, 0xA6, 0xD0, 0x93, 0xBE, 0x70, 0x16, 0x1C,\n    0x01, 0x29, 0xA9, 0x67, 0xD9, 0x08, 0x22, 0x48, 0xDD, 0x1E, 0x82, 0x13, 0xB7, 0xA7, 0xFD, 0x74,\n    0xAE, 0xA2, 0xE4, 0xEA, 0x60, 0xB8, 0xD1, 0x43, 0xDA, 0x35, 0xFF, 0x76, 0xF8, 0xF5, 0x91, 0x5F,\n    0xB7, 0xEF, 0x21, 0x81, 0xA1, 0x8B, 0x88, 0xE7, 0x4E, 0xA4, 0x12, 0xDC, 0x3C, 0x35, 0xA8, 0x9D,\n    0x27, 0x78, 0x1F, 0x48, 0xE7, 0x54, 0x4C, 0x98, 0x7B, 0x13, 0x1F, 0x42, 0xD4, 0x36, 0x55, 0xDB,\n    0x96, 0x74, 0xE4, 0xDA, 0xF2, 0xE3, 0xCC, 0xC1, 0xC8, 0x23, 0x4D, 0x90, 0x51, 0x77, 0x0B, 0xA3,\n    0x4D, 0x0C, 0xDD, 0x19, 0x87, 0x13, 0x15, 0xDB, 0x4F, 0x39, 0x8B, 0x48, 0x25, 0x85, 0x3B, 0x02,\n    0x1E, 0x73, 0x83, 0xEF, 0xBD, 0x5A, 0x13, 0x06, 0xAD, 0xAB, 0x90, 0xD9, 0x9F, 0xBC, 0x59, 0xE7,\n    0x0A, 0xA8, 0xB6, 0xEF, 0xAD, 0xB5, 0x37, 0x7B, 0x9D, 0xAA, 0xAC, 0x9C, 0xC7, 0x0F, 0x7B, 0x34,\n    0x78, 0x83, 0x51, 0xCB, 0x5B, 0xD3, 0xFE, 0x14, 0x0E, 0xB1, 0x31, 0xAB, 0x78, 0x9F, 0xDE, 0x3F,\n    0xDF, 0x05, 0x96, 0xA4, 0xA3, 0x44, 0x3B, 0x5F, 0x20, 0x80, 0x5C, 0xE5, 0x02, 0xFF, 0xD2, 0xD3,\n    0xB9, 0x0A, 0xFD, 0x39, 0x97, 0x39, 0x68, 0x43, 0x2E, 0x73, 0x18, 0x29, 0xFC, 0x9B, 0x2D, 0x03,\n    0x4B, 0x93, 0xD0, 0x57, 0x82, 0x82, 0x14, 0x4C, 0xD3, 0x87, 0x21, 0x39, 0x9E, 0x2B, 0x15, 0x6C,\n    0xCE, 0xB6, 0xB4, 0x69, 0x17, 0xE9, 0xD5, 0xA0, 0x67, 0xED, 0x47, 0xAF, 0xAE, 0xFD, 0xBC, 0xA6,\n    0xAA, 0xC3, 0xEA, 0x86, 0xF5, 0x5E, 0x2A, 0xA9, 0x41, 0xF9, 0x4D, 0x70, 0x77, 0x43, 0xBF, 0x31,\n    0xCC, 0x02, 0x06, 0x31, 0xCB, 0x9C, 0x47, 0xD6, 0xAF, 0x79, 0x5B, 0xE3, 0x0B, 0xA9, 0xCB, 0xBF,\n    0x42, 0xC4, 0x3E, 0xC2, 0x13, 0x3D, 0x5B, 0x5C, 0x23, 0x82, 0xF3, 0x57, 0x08, 0xA7, 0x0A, 0x06,\n    0x73, 0xC3, 0x13, 0x86, 0xE0, 0x24, 0xAC, 0x45, 0xA6, 0x93, 0x2D, 0x69, 0xA4, 0x13, 0x28, 0x18,\n    0x7D, 0x92, 0xFB, 0x51, 0x3F, 0x9B, 0x62, 0xFD, 0x51, 0xA9, 0xDA, 0xFC, 0x4A, 0xA0, 0x9D, 0xFC,\n    0x15, 0xE1, 0xFA, 0x19, 0x08, 0xD3, 0xB7, 0xE3, 0x1F, 0xA5, 0x53, 0xA1, 0xFE, 0xFF, 0xA5, 0xF3,\n    0x28, 0x9D, 0x26, 0x12, 0xED, 0xD2, 0x3C, 0xFA, 0x7E, 0x7C, 0x20, 0x8D, 0x9D, 0x4E, 0xD8, 0x6A,\n    0xBD, 0xEE, 0xF8, 0x31, 0x29, 0xDF, 0x36, 0xC7, 0x2B, 0x5F, 0x45, 0xB7, 0x9B, 0xAE, 0x33, 0x95,\n    0xE3, 0xE3, 0x9F, 0x0C, 0x9C, 0xEB, 0xCE, 0xD3, 0xF2, 0x05, 0x3D, 0xDC, 0x0A, 0xD5, 0x7C, 0xF8,\n    0x4A, 0xDA, 0xEB, 0xA9, 0x47, 0x90, 0xA1, 0x2B, 0x3E, 0xE3, 0x46, 0xFE, 0x44, 0xE4, 0x90, 0x55,\n    0xD7, 0x3C, 0x36, 0xAF, 0xCE, 0x42, 0x1C, 0xC8, 0xD7, 0xF2, 0xAB, 0x02, 0x4E, 0x6F, 0x3F, 0xA5,\n    0x71, 0x9B, 0xB4, 0x67, 0x65, 0x17, 0x06, 0x4C, 0x7A, 0x0E, 0xF5, 0x22, 0x46, 0x11, 0x55, 0x21,\n    0xD8, 0x27, 0x16, 0x1D, 0xB4, 0xF1, 0xA8, 0x5B, 0x9D, 0xA4, 0x4B, 0xD6, 0xEC, 0xC7, 0x20, 0x37,\n    0x93, 0x20, 0x40, 0x12, 0x88, 0x9A, 0xE9, 0xDA, 0x63, 0x1A, 0xA4, 0xA6, 0xE1, 0x3E, 0x04, 0xE2,\n    0x9C, 0x74, 0xDF, 0x7C, 0x4C, 0x34, 0xED, 0x58, 0xAC, 0x6B, 0x55, 0x85, 0x9A, 0xC6, 0x9E, 0x3F,\n    0x00, 0x2F, 0x2E, 0x03, 0xED, 0x48, 0xDD, 0xC2, 0x49, 0xF5, 0x2B, 0x64, 0x76, 0xD7, 0xF5, 0x2F,\n    0xC3, 0xE0, 0xE8, 0x56, 0x4D, 0xD4, 0x64, 0x1B, 0xBB, 0xD3, 0x1B, 0x21, 0x1F, 0x01, 0x4C, 0x32,\n    0xD2, 0xCC, 0xFD, 0xF5, 0x38, 0x99, 0xBC, 0x40, 0x05, 0xE2, 0x02, 0xCB, 0x28, 0x92, 0xE5, 0x5D,\n    0xFF, 0x2A, 0xBC, 0xFF, 0x98, 0x01, 0x7C, 0xEF, 0x04, 0x36, 0x50, 0xFC, 0x61, 0x35, 0xC6, 0xC1,\n    0xB2, 0x1B, 0xCD, 0x8C, 0x38, 0x42, 0xBD, 0x8F, 0x84, 0x06, 0xBE, 0x4C, 0x3F, 0xBE, 0xF0, 0xA2,\n    0x0A, 0x92, 0x4E, 0xD4, 0x87, 0x7E, 0x8A, 0x11, 0x0B, 0x75, 0xF6, 0x5A, 0xBD, 0x3B, 0xB5, 0x9B,\n    0xFF, 0x39, 0x5E, 0x7E, 0x3C, 0xA1, 0xBD, 0x76, 0xAF, 0xCB, 0x1B, 0xA5, 0x48, 0x35, 0x83, 0x89,\n    0xCF, 0xB4, 0x18, 0x37, 0xFB, 0x95, 0x34, 0x4F, 0x39, 0x29, 0x17, 0x9C, 0xBB, 0xDC, 0xF7, 0x68,\n    0x1B, 0xFB, 0x95, 0x42, 0xED, 0xA6, 0xFE, 0xE2, 0xBE, 0x06, 0xDB, 0xE1, 0x6B, 0xC9, 0x54, 0x2F,\n    0xA3, 0x75, 0x91, 0xBE, 0xE0, 0x55, 0x6B, 0xA5, 0xD8, 0x0E, 0xD0, 0xD0, 0x08, 0x64, 0xEE, 0xFC,\n    0xEE, 0x7E, 0x39, 0xAC, 0x94, 0x9C, 0x3F, 0x77, 0xF2, 0xDA, 0xF5, 0xBE, 0x9F, 0x91, 0x63, 0x68,\n    0xB6, 0xE2, 0x06, 0xAD, 0x8B, 0x1B, 0xDB, 0xE9, 0x0D, 0x87, 0x6F, 0x78, 0x6B, 0x51, 0x86, 0xE1,\n    0x44, 0x91, 0xD7, 0x62, 0x1D, 0x7F, 0x88, 0xE8, 0x2A, 0xAD, 0x19, 0x01, 0x02, 0x76, 0x05, 0x43,\n    0xBE, 0x1A, 0xB8, 0x36, 0xC2, 0x0D, 0x24, 0x90, 0x2E, 0x13, 0xCF, 0xFC, 0x0C, 0x3E, 0x18, 0x9D,\n    0xBF, 0x16, 0x1E, 0xAB, 0x22, 0x5B, 0xF8, 0x72, 0xE0, 0xDF, 0xF9, 0x51, 0x73, 0xB2, 0x54, 0x99,\n    0x32, 0x00, 0x4E, 0x06, 0x3F, 0xAA, 0x1F, 0xE5, 0x6C, 0xF0, 0x1D, 0xF5, 0xA0, 0x10, 0x2B, 0x63,\n    0x1C, 0x65, 0xAA, 0xC6, 0x8C, 0x8D, 0x7D, 0xE5, 0xA8, 0x98, 0xBD, 0x0E, 0xE4, 0xCF, 0x06, 0x28,\n    0x8A, 0xC3, 0xFB, 0x16, 0x2A, 0x29, 0xE7, 0xCA, 0xDC, 0xCC, 0xAB, 0xB3, 0xF1, 0x7B, 0x87, 0x76,\n    0xBA, 0xB3, 0xA2, 0x70, 0x47, 0x08, 0x52, 0x2F, 0x3A, 0xA6, 0x30, 0x0F, 0xA8, 0x66, 0x32, 0xC3,\n    0x0B, 0x7F, 0x19, 0x24, 0x0A, 0xE3, 0x69, 0x09, 0xD4, 0x90, 0x14, 0xE8, 0xF5, 0xD3, 0xAB, 0x7C,\n    0xB4, 0xB4, 0x2B, 0x4C, 0xB8, 0x44, 0x90, 0xCF, 0xE4, 0xB1, 0x5C, 0xEE, 0x0E, 0xC1, 0x19, 0xFF,\n    0x10, 0xC6, 0x9A, 0xD5, 0x32, 0x90, 0x69, 0x9D, 0xCF, 0xD4, 0x7B, 0x65, 0x39, 0x59, 0x19, 0x97,\n    0x30, 0xB8, 0x00, 0xD1, 0xE2, 0x82, 0x61, 0xBF, 0x9C, 0x6E, 0x05, 0x6A, 0xB4, 0x36, 0x42, 0xC2,\n    0x7A, 0xB9, 0x96, 0x6E, 0x62, 0x9C, 0x68, 0x11, 0x71, 0x87, 0x64, 0x87, 0x96, 0x80, 0x56, 0x67,\n    0xFC, 0xDB, 0x71, 0x51, 0x87, 0x4C, 0x5C, 0xFD, 0xA2, 0x90, 0xD2, 0x0E, 0x9C, 0x52, 0xD2, 0xE7,\n    0x49, 0x07, 0x56, 0x12, 0xA6, 0xD8, 0x8A, 0x1C, 0xAD, 0xAF, 0xA7, 0x20, 0x56, 0x1F, 0xD0, 0xCD,\n    0x93, 0xBE, 0x4F, 0xFB, 0x60, 0xA3, 0x10, 0xB5, 0x79, 0xB5, 0x7E, 0x79, 0xF5, 0x2F, 0x57, 0xC2,\n    0xDD, 0x23, 0x23, 0x4E, 0x91, 0xC2, 0xBD, 0x81, 0xDA, 0x48, 0x88, 0xA3, 0xDC, 0x2A, 0xF0, 0xBE,\n    0x08, 0x00, 0xE7, 0xC6, 0xA4, 0x66, 0x16, 0x30, 0x40, 0xA5, 0xF1, 0x40, 0x1C, 0x57, 0x5F, 0x1D,\n    0x96, 0x76, 0xF2, 0xE3, 0x71, 0xD4, 0x2E, 0x76, 0x90, 0x32, 0x4F, 0x2F, 0xF5, 0xED, 0x59, 0x2F,\n    0x20, 0x97, 0x7A, 0x1F, 0xE1, 0xE0, 0xE4, 0x1E, 0x93, 0xF3, 0x79, 0x8B, 0xCD, 0x0B, 0x84, 0x91,\n    0xDF, 0x35, 0x7C, 0x7F, 0xEE, 0xC9, 0x61, 0xF1, 0xFD, 0xBF, 0xFB, 0xA0, 0x09, 0x7A, 0xA1, 0xFF,\n    0xD6, 0x13, 0x14, 0xD7, 0xEB, 0x37, 0x26, 0x31, 0x98, 0x16, 0xD8, 0xA7, 0xCE, 0x6C, 0x64, 0x71,\n    0xE0, 0xE3, 0x5C, 0x33, 0x97, 0x9E, 0x1A, 0x25, 0x13, 0xBF, 0x05, 0x04, 0x0D, 0x11, 0xF3, 0x19,\n    0x20, 0x43, 0x7B, 0x7D, 0x8A, 0x5F, 0x89, 0x05, 0xAC, 0x59, 0xBC, 0xDA, 0x45, 0x57, 0x30, 0xA3,\n    0x68, 0x9F, 0x18, 0x0B, 0x9A, 0x41, 0x7E, 0x7B, 0x85, 0x8E, 0x37, 0xAE, 0x2D, 0xDE, 0x7C, 0xE8,\n    0xB5, 0x37, 0xA7, 0xB9, 0xF0, 0xA9, 0xA4, 0x55, 0x83, 0x3F, 0x8F, 0x1E, 0x01, 0x0C, 0xF9, 0x9E,\n    0x43, 0x5C, 0x60, 0x3F, 0x26, 0xE4, 0xBB, 0x8B, 0xAC, 0x61, 0xFF, 0x2F, 0x43, 0x1E, 0x6B, 0x0B,\n    0xFB, 0xC9, 0x6A, 0x8C, 0x22, 0x36, 0xC1, 0x21, 0x77, 0x44, 0xFF, 0x2C, 0xF8, 0xCF, 0x29, 0x9F,\n    0x6F, 0x3E, 0x43, 0x2B, 0xE2, 0x3F, 0x8E, 0x0F, 0xC1, 0x38, 0x2E, 0x7D, 0x25, 0x76, 0x1A, 0x10,\n    0x19, 0xEE, 0x37, 0x05, 0xEB, 0x7A, 0x4F, 0x07, 0xD8, 0x1D, 0x0F, 0xF3, 0x50, 0x43, 0x4E, 0x67,\n    0x85, 0x26, 0x16, 0xE5, 0x38, 0x3D, 0x3F, 0xEB, 0x4C, 0x87, 0x5E, 0xDE, 0x9E, 0xD2, 0x82, 0x04,\n    0x5B, 0x69, 0x12, 0xEA, 0xB4, 0x8D, 0x73, 0xE0, 0xA9, 0x1A, 0xEB, 0x19, 0x89, 0xEA, 0xBF, 0x6E,\n    0xBA, 0x6D, 0x9D, 0x2B, 0x0B, 0x6A, 0x64, 0x50, 0x9B, 0x79, 0x30, 0xB3, 0x12, 0x30, 0x89, 0x92,\n    0x0B, 0xF8, 0x88, 0x31, 0x7E, 0xB7, 0xD0, 0x2D, 0x84, 0xFD, 0x7D, 0xE0, 0x08, 0x39, 0x84, 0x45,\n    0xD2, 0x5E, 0x1F, 0x42, 0xEE, 0x2C, 0xF3, 0xE5, 0xBA, 0xB5, 0xA5, 0x50, 0xAB, 0xD2, 0xEB, 0xEB,\n    0x72, 0x9A, 0xE7, 0x18, 0x7A, 0x41, 0xFE, 0x8A, 0xBB, 0x4F, 0x0B, 0x2B, 0xB7, 0xF0, 0x12, 0x12,\n    0x58, 0xCC, 0xC1, 0x88, 0x9E, 0x20, 0xF2, 0xFA, 0x0F, 0xE5, 0x36, 0xAD, 0x64, 0x05, 0xB4, 0x1C,\n    0xA4, 0xD8, 0x60, 0x36, 0x7C, 0xD8, 0x1F, 0xED, 0xAA, 0x51, 0x60, 0x2F, 0x1F, 0x76, 0x80, 0xB9,\n    0x02, 0xAA, 0x2C, 0x14, 0x17, 0xE6, 0xD2, 0xFE, 0x26, 0xBA, 0xD2, 0xE5, 0xCB, 0x0B, 0x7D, 0xBE,\n    0xCC, 0x09, 0xD9, 0xEE, 0x8D, 0x23, 0x52, 0xFB, 0x54, 0xF4, 0x9E, 0x3B, 0x2A, 0xEA, 0x91, 0x40,\n    0x6E, 0x3B, 0x03, 0xC0, 0x82, 0x3D, 0x35, 0x72, 0xAD, 0xC5, 0xB9, 0x53, 0xA1, 0x82, 0x4E, 0xE9,\n    0xB6, 0x99, 0x16, 0xF7, 0xE4, 0x98, 0x93, 0x70, 0xAB, 0xEB, 0x91, 0xC6, 0x7E, 0x70, 0x5D, 0x47,\n    0xCF, 0x71, 0x5C, 0xCB, 0x61, 0x90, 0xDA, 0xD8, 0xF1, 0x41, 0xA5, 0x85, 0xA2, 0x4A, 0x9A, 0x15,\n    0xA3, 0x9D, 0x4A, 0xC9, 0x42, 0x9A, 0x41, 0x67, 0x68, 0x02, 0xC1, 0x8D, 0x5F, 0xD5, 0x7F, 0xDF,\n    0x8F, 0x08, 0xE9, 0x96, 0xF9, 0x8A, 0x43, 0x30, 0xA6, 0x2F, 0x46, 0x31, 0xCC, 0x73, 0x16, 0x31,\n    0xF5, 0x56, 0x19, 0x7B, 0x99, 0xC1, 0xF0, 0xA3, 0x54, 0x90, 0xFF, 0x1E, 0x81, 0xCB, 0x88, 0x50,\n    0x64, 0x9F, 0x23, 0xFC, 0xB5, 0x12, 0x24, 0xDC, 0xD2, 0x6B, 0x22, 0x5C, 0xED, 0xA3, 0xF2, 0x8B,\n    0x0E, 0xE9, 0xD4, 0x8B, 0xAF, 0x94, 0x0B, 0xA4, 0x7B, 0x25, 0x88, 0xD8, 0x4A, 0x5E, 0x33, 0x85,\n    0x5B, 0xD0, 0xD4, 0x50, 0xA4, 0xB2, 0xE5, 0x18, 0x7B, 0x7B, 0xEE, 0xCB, 0xF0, 0xDA, 0xF5, 0x18,\n    0xD8, 0x5C, 0x22, 0x0B, 0x11, 0xDE, 0x02, 0x1F, 0xF8, 0xC6, 0x0D, 0x75, 0x36, 0xCA, 0x82, 0xCE,\n    0x46, 0x31, 0x8C, 0x5E, 0x6A, 0x28, 0x3E, 0xD5, 0x3F, 0xB7, 0x16, 0x31, 0x13, 0x6A, 0x14, 0x59,\n    0x88, 0x6A, 0x55, 0x65, 0x8A, 0x21, 0xD5, 0x48, 0xD3, 0x4A, 0xD1, 0x70, 0xF4, 0x3B, 0x72, 0xC2,\n    0x8D, 0x1E, 0x28, 0xAF, 0x41, 0x7B, 0xC2, 0x0C, 0x82, 0x6C, 0x3D, 0xD9, 0x25, 0x48, 0x6C, 0xD9,\n    0x49, 0x0F, 0x8A, 0xDF, 0x27, 0x6E, 0x1E, 0x21, 0xB7, 0x65, 0x5A, 0x8F, 0x89, 0x4E, 0x3F, 0x82,\n    0x47, 0xBF, 0x7C, 0x21, 0x91, 0x75, 0x10, 0x55, 0x54, 0x21, 0x95, 0xE3, 0xDC, 0x4F, 0x12, 0x0C,\n    0x1B, 0x55, 0xC2, 0xBE, 0x85, 0x60, 0x57, 0xB3, 0x70, 0x31, 0x54, 0xD3, 0x53, 0x84, 0xB6, 0x93,\n    0xB5, 0x68, 0xC2, 0x14, 0x80, 0xC9, 0x91, 0x32, 0x87, 0x96, 0xFA, 0x20, 0x03, 0xC2, 0xBE, 0xC2,\n    0x42, 0xDC, 0x4D, 0x28, 0xC4, 0xC1, 0x95, 0x5D, 0xCF, 0x4D, 0xFE, 0xFA, 0x09, 0x43, 0x4F, 0xC2,\n    0x30, 0x65, 0xC4, 0x55, 0xDE, 0x05, 0x6C, 0x29, 0xFA, 0xDD, 0x9C, 0x17, 0x9F, 0x05, 0x89, 0xD9,\n    0xA8, 0x97, 0x46, 0x8C, 0x85, 0x81, 0xFC, 0x99, 0x72, 0x4F, 0x0A, 0xA0, 0x8F, 0xF3, 0x25, 0x89,\n    0xBA, 0xDD, 0x63, 0x53, 0x6B, 0xA7, 0x15, 0x20, 0x14, 0x92, 0x88, 0x51, 0x23, 0x82, 0xA3, 0x9D,\n    0x0D, 0xC2, 0x79, 0xB7, 0xA3, 0x18, 0x88, 0xC9, 0xE0, 0xB0, 0x56, 0x8F, 0x16, 0x16, 0x36, 0xAA,\n    0x40, 0xC9, 0x61, 0x41, 0x30, 0x82, 0x65, 0x2F, 0x81, 0x57, 0xD3, 0x86, 0x90, 0x05, 0xC4, 0x44,\n    0x04, 0x12, 0xC8, 0x1B, 0xB8, 0x4D, 0x6A, 0x06, 0x1B, 0x9F, 0xEF, 0xC0, 0xA3, 0xE9, 0x9B, 0xEA,\n    0x70, 0xC0, 0xCE, 0x73, 0x89, 0x5F, 0x6D, 0x0C, 0x9B, 0x4C, 0x3B, 0x96, 0xB2, 0x8B, 0x6B, 0xF5,\n    0x07, 0x00, 0xE4, 0x30, 0xED, 0xE0, 0xB6, 0xF0, 0xB5, 0xF8, 0x1D, 0xFB, 0xCC, 0xC9, 0x10, 0x66,\n    0x5B, 0xE0, 0x15, 0xFB, 0x1D, 0xB7, 0x5C, 0x67, 0x7F, 0x52, 0xD5, 0xA0, 0xF0, 0x9A, 0x6D, 0x37,\n    0xA7, 0x1B, 0xBD, 0x1F, 0x7B, 0xF9, 0x82, 0x11, 0x98, 0x7D, 0x27, 0x0B, 0xF5, 0x31, 0x5F, 0x20,\n    0x8D, 0x47, 0xA0, 0xB4, 0xD3, 0x59, 0x4B, 0x17, 0xF9, 0xA2, 0x38, 0x66, 0x31, 0x3F, 0x02, 0xCD,\n    0x5D, 0xBE, 0x5B, 0x06, 0x17, 0xD7, 0xEC, 0xC4, 0xD1, 0x67, 0x97, 0x49, 0xBA, 0x1D, 0xE5, 0xCD,\n    0x8E, 0xCF, 0x0D, 0xCD, 0x6B, 0xAB, 0x9A, 0xDA, 0x2F, 0x3F, 0x62, 0xDF, 0xFA, 0xE5, 0xEC, 0x50,\n    0x6D, 0x62, 0xCB, 0x0F, 0x53, 0xC7, 0x8A, 0x33, 0xF5, 0xB2, 0x8D, 0xFD, 0x85, 0x31, 0x06, 0xE3,\n    0xCE, 0x77, 0xB6, 0x8B, 0x2A, 0xC7, 0xC2, 0x72, 0xD5, 0xA9, 0x06, 0xBF, 0xAF, 0x76, 0x6F, 0xC2,\n    0x62, 0x31, 0x9A, 0x89, 0x87, 0xE7, 0x54, 0xD4, 0x8F, 0x32, 0x31, 0x40, 0xE8, 0xAF, 0x82, 0x6C,\n    0x69, 0x18, 0x19, 0x25, 0x74, 0xF0, 0xD1, 0xEB, 0x43, 0x71, 0x50, 0x20, 0xCD, 0x84, 0xE9, 0x94,\n    0x86, 0x17, 0xA0, 0xF9, 0xB8, 0x65, 0xFE, 0x48, 0x81, 0x57, 0xCE, 0x0F, 0xA7, 0xF3, 0x28, 0x3F,\n    0x02, 0x0D, 0xD9, 0x78, 0x7A, 0x2F, 0x9F, 0x36, 0xAD, 0x8D, 0x47, 0x76, 0x51, 0xA7, 0x95, 0xF2,\n    0xE3, 0x20, 0xDB, 0x57, 0x7F, 0xA9, 0x26, 0x29, 0xF1, 0x0F, 0xF7, 0xAB, 0x2F, 0x7B, 0x2F, 0xEB,\n    0x96, 0x6C, 0xFD, 0xAA, 0x25, 0x21, 0x35, 0x38, 0x89, 0xFF, 0xAE, 0xCD, 0x5F, 0xA0, 0xFE, 0x0F,\n    0x57, 0x70, 0xC0, 0x65, 0x49, 0xA6, 0x5E, 0x3F, 0xB5, 0x24, 0x8A, 0x46, 0x32, 0xA1, 0x12, 0xC0,\n    0x79, 0x0B, 0xD6, 0xE4, 0x26, 0x21, 0x90, 0x25, 0xB6, 0x81, 0xE5, 0x84, 0xB9, 0x4E, 0x78, 0xFF,\n    0x44, 0xB7, 0xDB, 0xD5, 0xE2, 0x9B, 0x46, 0xBF, 0xB9, 0x5F, 0xC5, 0x70, 0xCC, 0xD3, 0xA2, 0x77,\n    0xAE, 0xAC, 0xCE, 0x52, 0x08, 0x52, 0x34, 0x6C, 0x41, 0xDA, 0xD6, 0x03, 0x87, 0x71, 0xFB, 0xD6,\n    0x2B, 0xFC, 0x64, 0x89, 0x9F, 0x5D, 0x1C, 0x4E, 0xEE, 0x2F, 0xE5, 0xAC, 0x01, 0x31, 0x46, 0x63,\n    0x12, 0x45, 0x79, 0x41, 0x93, 0x0C, 0x1A, 0x6B, 0x3E, 0x73, 0x25, 0xCE, 0xD9, 0x35, 0x87, 0xBD,\n    0x9F, 0x30, 0xBC, 0x82, 0xA8, 0x47, 0xCE, 0x8F, 0x48, 0x77, 0x26, 0x71, 0xCB, 0x9B, 0xD3, 0x1A,\n    0x79, 0x2A, 0x29, 0x78, 0x7C, 0x6D, 0x5A, 0x72, 0x01, 0x0B, 0xE1, 0x46, 0x32, 0x65, 0x9D, 0x2B,\n    0xD4, 0xD6, 0x28, 0x1F, 0xB2, 0x23, 0xA9, 0xF6, 0x62, 0x2F, 0xCD, 0x99, 0x6C, 0x5D, 0x03, 0x5D,\n    0xA0, 0x7A, 0xC4, 0x05, 0x82, 0x71, 0xB3, 0xC3, 0x2B, 0x9B, 0xC5, 0x47, 0x22, 0x84, 0x29, 0x23,\n    0xB7, 0x7D, 0xAF, 0xFA, 0xB7, 0x00, 0x10, 0xC9, 0xAB, 0xCF, 0xD6, 0xEA, 0x24, 0xE3, 0x4A, 0x29,\n    0xDE, 0xD4, 0x93, 0x95, 0x44, 0xC5, 0xD7, 0xEC, 0xA9, 0x2C, 0x31, 0x82, 0x12, 0x7E, 0x21, 0x47,\n    0x1C, 0x5A, 0xD5, 0xA1, 0x19, 0x9A, 0x57, 0x42, 0x46, 0x70, 0x94, 0x6A, 0xC0, 0xC6, 0x66, 0xA9,\n    0x88, 0xB6, 0x52, 0x5E, 0xB8, 0xB3, 0x09, 0x84, 0xF5, 0x0B, 0xF1, 0x2E, 0x89, 0x0B, 0x01, 0xD0,\n    0x40, 0xFC, 0x97, 0xC4, 0xE4, 0xF0, 0x99, 0x1E, 0x48, 0xA5, 0x20, 0x0B, 0x4F, 0xF4, 0xA7, 0x6E,\n    0xB5, 0x78, 0xB8, 0x80, 0xFB, 0x5C, 0x51, 0x6B, 0xE3, 0x4E, 0x94, 0xF3, 0x94, 0xAC, 0xCC, 0xBB,\n    0xA4, 0x39, 0x78, 0x67, 0xF9, 0x43, 0x73, 0x63, 0x6E, 0xC0, 0x51, 0xFB, 0xEA, 0xEE, 0x85, 0x57,\n    0xD4, 0x16, 0xEB, 0xB0, 0x36, 0x1E, 0x2A, 0x80, 0x8A, 0x63, 0x7B, 0x91, 0xB0, 0x6A, 0xA7, 0xC5,\n    0x59, 0x93, 0x04, 0x1E, 0x44, 0x52, 0x02, 0xB2, 0xBB, 0xEF, 0x23, 0x07, 0x2F, 0x41, 0x93, 0x80,\n    0x4A, 0x3E, 0x2B, 0x4A, 0x83, 0x79, 0x65, 0x1E, 0x02, 0x58, 0xD5, 0x3E, 0x51, 0xFF, 0x5F, 0x8A,\n    0x3E, 0x09, 0x90, 0x02, 0xAF, 0x57, 0xCF, 0x0F, 0x30, 0x78, 0x2F, 0x0D, 0x50, 0x51, 0xA9, 0x24,\n    0xD2, 0x10, 0xB5, 0xE2, 0x3E, 0xD5, 0x53, 0xA2, 0xD9, 0xC6, 0x9C, 0xBC, 0xEB, 0x26, 0xAB, 0xEE,\n    0x3B, 0x0E, 0x26, 0x03, 0x54, 0x73, 0x0E, 0x58, 0xDA, 0x92, 0x00, 0xA7, 0x2A, 0xDC, 0xA7, 0xD2,\n    0x4B, 0x78, 0x20, 0x88, 0x5D, 0x11, 0x43, 0x15, 0x67, 0xB5, 0xC2, 0x31, 0x78, 0xD7, 0xCB, 0x5A,\n    0x1A, 0x04, 0x38, 0xAF, 0x1A, 0xDB, 0x24, 0x90, 0x5F, 0xF0, 0xB3, 0x11, 0xB9, 0x68, 0x9A, 0x8B,\n    0x1B, 0x28, 0xCA, 0x51, 0x63, 0x8C, 0xD2, 0x70, 0xA9, 0x8B, 0x42, 0x69, 0x86, 0x2E, 0x46, 0x5F,\n    0x85, 0xA7, 0x80, 0x4D, 0x70, 0x1E, 0xAE, 0x08, 0xD2, 0xFC, 0xCF, 0x5E, 0xDB, 0x41, 0x9F, 0x21,\n    0xEF, 0xA6, 0x64, 0x38, 0xE7, 0x73, 0xEF, 0xEA, 0xF9, 0x31, 0x61, 0x67, 0xEF, 0xD5, 0x21, 0x44,\n    0xD9, 0x28, 0xB0, 0x6D, 0xD6, 0x11, 0xF9, 0x28, 0x02, 0x99, 0x84, 0x11, 0x8A, 0xFB, 0x56, 0xF8,\n    0x37, 0x98, 0xDC, 0x90, 0x22, 0x13, 0xE3, 0x37, 0xBF, 0x9A, 0xD4, 0x05, 0xBF, 0x69, 0x76, 0xE1,\n    0x70, 0x90, 0x81, 0x72, 0xA5, 0x7A, 0x19, 0x6B, 0x68, 0x13, 0xF1, 0x05, 0xA4, 0xFB, 0xBA, 0x6F,\n    0x13, 0xCB, 0x15, 0xA4, 0x5D, 0x09, 0x47, 0x4A, 0xD0, 0x50, 0x34, 0x00, 0x45, 0xB8, 0xDF, 0x5E,\n    0x89, 0x02, 0x50, 0x42, 0x65, 0xDF, 0xB7, 0x46, 0x59, 0x35, 0x81, 0xD9, 0x7D, 0xB6, 0x1E, 0x84,\n    0x41, 0x08, 0xBA, 0xFA, 0x2B, 0xBB, 0x85, 0x92, 0x0A, 0x9C, 0x9F, 0x9E, 0x8F, 0xE2, 0x7A, 0xF7,\n    0x6F, 0x5D, 0x8D, 0x0B, 0xA8, 0xE1, 0x02, 0x94, 0x54, 0x76, 0xFB, 0xD0, 0x80, 0xEA, 0x66, 0x17,\n    0xE5, 0x76, 0x96, 0xF9, 0xC1, 0xB1, 0xA6, 0x7B, 0x3C, 0x7C, 0xA8, 0x0B, 0x4E, 0x28, 0x8B, 0x46,\n    0xFE, 0x0B, 0xCC, 0x57, 0x41, 0x54, 0x37, 0x49, 0x28, 0x19, 0xD8, 0x43, 0xBF, 0x59, 0x76, 0x59,\n    0x37, 0x71, 0xD5, 0x19, 0x99, 0xD2, 0xA3, 0xD8, 0x0A, 0x09, 0x58, 0xF4, 0xEE, 0xC6, 0xF4, 0x47,\n    0xD7, 0xB3, 0xB4, 0x42, 0x74, 0x71, 0x23, 0xF8, 0xE0, 0x76, 0xA1, 0x91, 0x28, 0xE8, 0xE6, 0xFD,\n    0x38, 0x13, 0x02, 0xD0, 0x07, 0x4C, 0x06, 0x1B, 0xB8, 0x18, 0xA5, 0xB3, 0x0F, 0xBF, 0x06, 0xBB,\n    0x40, 0xD7, 0xE2, 0xE1, 0x54, 0xAC, 0x3F, 0x40, 0x5E, 0x68, 0x08, 0xA6, 0xF2, 0x7B, 0xA7, 0x97,\n    0xFE, 0x05, 0x75, 0x41, 0x99, 0xBB, 0xCB, 0x2D, 0xC9, 0xE9, 0x41, 0x69, 0xA5, 0x69, 0x51, 0xC0,\n    0x85, 0xD9, 0x3D, 0x82, 0x09, 0xF8, 0x91, 0xCB, 0xE1, 0x89, 0xA6, 0xD1, 0x30, 0xBF, 0xF7, 0xFC,\n    0x5E, 0x23, 0xBB, 0x66, 0x65, 0x17, 0x2B, 0x96, 0xF2, 0xA0, 0xF3, 0xA0, 0xDA, 0xF2, 0x5B, 0x2A,\n    0xDA, 0x20, 0x25, 0x1C, 0x7B, 0x3E, 0x42, 0xEC, 0xFC, 0xA0, 0x75, 0x1C, 0xDA, 0x96, 0x37, 0x40,\n    0xF9, 0xD7, 0x6C, 0xA5, 0x2D, 0xE1, 0x9C, 0x69, 0x7D, 0xB3, 0x07, 0x8E, 0xC7, 0xE8, 0x8A, 0x24,\n    0xDF, 0x77, 0x18, 0x4C, 0xCC, 0xAE, 0x1A, 0x5F, 0xF9, 0xC4, 0x21, 0x77, 0xFA, 0x2B, 0xA7, 0x2C,\n    0xC3, 0xB4, 0x85, 0x3B, 0x2D, 0x34, 0xF7, 0x2D, 0xFA, 0xE8, 0x42, 0xDA, 0x7D, 0x4B, 0x18, 0x40,\n    0xC6, 0xC6, 0x4B, 0xE4, 0xCE, 0x64, 0x97, 0x46, 0xC1, 0xA0, 0x32, 0x1C, 0xA4, 0xBB, 0xA0, 0x6C,\n    0x49, 0xE9, 0x80, 0x46, 0x08, 0xA8, 0x1B, 0x30, 0x5E, 0x79, 0x54, 0x74, 0xE2, 0x0C, 0xC3, 0xD5,\n    0x5C, 0x27, 0xD0, 0x0C, 0x30, 0xDC, 0x24, 0x47, 0x51, 0x78, 0xF5, 0x42, 0x37, 0xE2, 0x13, 0x4D,\n    0x6B, 0x1C, 0x3B, 0x92, 0xF6, 0x70, 0xEE, 0x29, 0x04, 0xDF, 0x61, 0x68, 0x7E, 0xC9, 0xF2, 0xA8,\n    0x9B, 0x0A, 0xD3, 0xC8, 0x2E, 0x34, 0x9B, 0x35, 0xE1, 0xD4, 0x7F, 0x15, 0x1B, 0x77, 0xDE, 0xF6,\n    0x17, 0x44, 0xE8, 0xDA, 0xDF, 0x5D, 0xE1, 0xEE, 0xA2, 0x4B, 0xBE, 0x7E, 0x69, 0xFA, 0x01, 0x27,\n    0x3F, 0x2C, 0xA6, 0x59, 0x4C, 0x63, 0x68, 0x48, 0x66, 0xC9, 0x43, 0xAB, 0x2A, 0x44, 0x20, 0xC7,\n    0x04, 0x29, 0x0A, 0xA5, 0x83, 0x8C, 0xD7, 0x84, 0xE0, 0x87, 0xBB, 0x16, 0xBF, 0xC3, 0xBD, 0xC9,\n    0x84, 0x41, 0x15, 0x9A, 0xDC, 0x67, 0xD8, 0x08, 0xB1, 0x89, 0xE1, 0xDC, 0x4C, 0x66, 0xFA, 0x64,\n    0x1E, 0x21, 0xC8, 0x89, 0x1F, 0xC3, 0x74, 0x82, 0xB9, 0x88, 0x2B, 0x05, 0xA4, 0x95, 0xB2, 0x50,\n    0xE6, 0xC2, 0x85, 0xC6, 0x4B, 0xE1, 0x7E, 0xB0, 0x63, 0x29, 0x9C, 0x2E, 0x51, 0x52, 0xB8, 0xB9,\n    0xC6, 0x00, 0xE1, 0x7C, 0xA8, 0xFD, 0x41, 0x6D, 0xF0, 0x6E, 0x20, 0x53, 0xB6, 0x2E, 0x2A, 0x42,\n    0xD7, 0xDF, 0x0F, 0xA5, 0x4E, 0x77, 0xC9, 0xEF, 0xBA, 0x71, 0xA7, 0x51, 0x39, 0xB1, 0xDB, 0xF6,\n    0x81, 0x67, 0x0E, 0x87, 0x87, 0xE6, 0x47, 0x89, 0xC7, 0xF3, 0xDD, 0xB4, 0x6C, 0xA5, 0x53, 0x83,\n    0xBF, 0xD7, 0xEC, 0xBE, 0xED, 0x8A, 0xAD, 0xE2, 0x31, 0x43, 0x9E, 0x2C, 0xBE, 0xAD, 0x0F, 0x60,\n    0xA9, 0xEA, 0xB2, 0x95, 0x0B, 0xBE, 0x13, 0x3C, 0x98, 0x9C, 0xED, 0x0A, 0x04, 0x36, 0xBD, 0x7A,\n    0x9F, 0x21, 0x41, 0x17, 0xA4, 0x89, 0x01, 0x62, 0xD5, 0x3C, 0xCF, 0xF9, 0xD7, 0x68, 0x4B, 0x3A,\n    0xF4, 0x89, 0x10, 0x08, 0x10, 0x0C, 0xC5, 0x7C, 0xAD, 0x97, 0x24, 0x7C, 0xF5, 0x52, 0xB6, 0x65,\n    0xEE, 0x3F, 0x76, 0x81, 0x41, 0xDF, 0x19, 0x8C, 0x75, 0x1D, 0x8E, 0x09, 0xCA, 0x60, 0xBD, 0x29,\n    0x91, 0x68, 0x2C, 0x4C, 0x23, 0x90, 0x75, 0x27, 0x7F, 0xA5, 0x40, 0xB8, 0xAC, 0xE8, 0xFC, 0xDB,\n    0xCB, 0xDD, 0x2A, 0xFA, 0x8A, 0x76, 0x3D, 0x9D, 0xF7, 0x74, 0x16, 0x7C, 0x31, 0x6A, 0x88, 0x93,\n    0x95, 0xD6, 0x5F, 0xE8, 0xBE, 0x1B, 0x0C, 0x4D, 0x65, 0xC1, 0xF6, 0x0D, 0x8E, 0xC9, 0x71, 0x13,\n    0x61, 0x26, 0xBD, 0xB5, 0xFD, 0x16, 0xDF, 0xE1, 0x2E, 0x36, 0x8C, 0xA8, 0x51, 0xB7, 0x9B, 0xB1,\n    0x69, 0x35, 0xD1, 0xF6, 0x09, 0x3D, 0x09, 0xB7, 0xDD, 0xAC, 0x39, 0xBD, 0x3F, 0x1D, 0xA6, 0xB8,\n    0xA2, 0xE8, 0x70, 0x17, 0x9F, 0x49, 0xF9, 0x29, 0x48, 0xDF, 0xA3, 0xBF, 0x95, 0x8C, 0xD2, 0x8E,\n    0x32, 0xD1, 0xDD, 0x98, 0x49, 0xC8, 0xBC, 0xA2, 0xAD, 0x99, 0x5A, 0xB4, 0x33, 0x51, 0x3D, 0xB8,\n    0x6E, 0xA3, 0x72, 0xDD, 0xEF, 0x45, 0x51, 0xEC, 0x06, 0x8D, 0xFE, 0x15, 0xA9, 0x76, 0x69, 0xA1,\n    0xAF, 0x75, 0x1B, 0xE7, 0x8E, 0xDE, 0x4B, 0xF7, 0x49, 0xDC, 0x66, 0xAA, 0xBE, 0xDA, 0x01, 0x18,\n    0xA7, 0x2A, 0x11, 0xA3, 0x16, 0xF7, 0x29, 0x2C, 0x97, 0xCC, 0x2B, 0x54, 0xBC, 0xEF, 0x9F, 0x94,\n    0xC8, 0xA4, 0xB8, 0x87, 0x01, 0x3F, 0x0C, 0x69, 0xD5, 0xE9, 0xB9, 0x71, 0x30, 0x9B, 0xAC, 0x1B,\n    0x1F, 0xB2, 0xC0, 0x67, 0x52, 0x78, 0x91, 0xBA, 0x3F, 0x2F, 0xC3, 0x5C, 0x80, 0x39, 0x70, 0x1C,\n    0x7E, 0x07, 0x71, 0x70, 0x9D, 0x95, 0x6D, 0xE2, 0x0A, 0x5D, 0x1E, 0x19, 0x06, 0x9A, 0x85, 0xE1,\n    0x2E, 0xD5, 0xFA, 0x02, 0x2E, 0x32, 0x53, 0xAD, 0x05, 0x2F, 0xEC, 0x08, 0x7E, 0xDD, 0x71, 0x9D,\n    0x34, 0xFC, 0x9D, 0x0D, 0x44, 0x4E, 0x3E, 0x20, 0x00, 0xA8, 0x76, 0x02, 0xF8, 0xBF, 0x6B, 0x9F,\n    0x4A, 0x60, 0x99, 0xA1, 0x74, 0x4B, 0xB9, 0x91, 0x16, 0x4D, 0x41, 0xC5, 0xA1, 0x33, 0xD3, 0x90,\n    0x8A, 0x2F, 0x83, 0x92, 0x8B, 0x53, 0x1D, 0x29, 0x8F, 0x97, 0xD8, 0xA0, 0x48, 0x63, 0xB4, 0x43,\n    0x20, 0x82, 0xC7, 0xC2, 0x0A, 0x7F, 0xFB, 0x07, 0x74, 0x31, 0x54, 0x2A, 0xCB, 0xCA, 0x7E, 0xD6,\n    0x91, 0x6B, 0x82, 0x73, 0x51, 0x66, 0x7B, 0xDF, 0x63, 0x53, 0x08, 0xFC, 0x17, 0x20, 0xA9, 0x87,\n    0x1D, 0x24, 0xD0, 0x44, 0x45, 0xBC, 0x80, 0x80, 0x4B, 0x52, 0x90, 0x4E, 0xA5, 0xDF, 0xD1, 0x3F,\n    0xA9, 0xCC, 0xD7, 0xD9, 0xAD, 0x1F, 0x65, 0x63, 0xA6, 0x57, 0x85, 0x39, 0x98, 0x33, 0xE8, 0xBC,\n    0xF5, 0xE2, 0xD2, 0x4B, 0xF7, 0xEA, 0x61, 0xE3, 0xFA, 0xF3, 0x73, 0x6C, 0xA2, 0x0A, 0x26, 0xCB,\n    0x09, 0x2E, 0xC4, 0x03, 0x38, 0x97, 0x7A, 0x3A, 0xC7, 0xB0, 0x0C, 0x35, 0x6D, 0x73, 0x14, 0x70,\n    0x01, 0xF6, 0x8F, 0x67, 0xBA, 0xD9, 0x4E, 0xAF, 0xEA, 0x96, 0x3D, 0xC6, 0x7E, 0xE7, 0x2B, 0x29,\n    0x27, 0xAB, 0xFA, 0xA8, 0x08, 0xB1, 0x01, 0x20, 0xF3, 0xD1, 0x45, 0x35, 0x33, 0x56, 0x26, 0x81,\n    0x00, 0xB2, 0x41, 0x01, 0x1A, 0x71, 0x28, 0x35, 0xF4, 0x43, 0x2F, 0x48, 0x59, 0x69, 0x22, 0x5A,\n    0x89, 0x8D, 0xC7, 0x38, 0x5F, 0x12, 0x40, 0x65, 0x7B, 0x89, 0x06, 0x76, 0x74, 0x08, 0xE5, 0xFC,\n    0x83, 0x61, 0x2B, 0xAF, 0xB4, 0xE0, 0xE4, 0x51, 0x4D, 0xF7, 0x31, 0x09, 0x0A, 0xC0, 0xB9, 0x47,\n    0x23, 0xCB, 0xF7, 0x90, 0x86, 0x65, 0x27, 0xF3, 0x65, 0xBF, 0x52, 0xAF, 0x4A, 0x3E, 0xBF, 0x0C,\n    0x9E, 0xC9, 0x6D, 0x4D, 0xD6, 0x64, 0x77, 0x59, 0x2B, 0x88, 0x6B, 0xD7, 0x7E, 0xBF, 0x8F, 0x53,\n    0x48, 0xD8, 0x9E, 0x6E, 0x7E, 0x16, 0x60, 0x4C, 0xE9, 0x33, 0x83, 0x01, 0x74, 0xCD, 0x1F, 0x8B,\n    0x4F, 0x3A, 0xEA, 0xCC, 0x45, 0xEE, 0x8F, 0xEA, 0x0C, 0x40, 0x76, 0xA7, 0xDF, 0x69, 0xFE, 0xD4,\n    0xD3, 0x23, 0x93, 0x07, 0x77, 0x8D, 0xCD, 0x20, 0xE9, 0x71, 0xB7, 0xFA, 0xFB, 0x27, 0x6D, 0x0A,\n    0xBC, 0x1E, 0xFE, 0x49, 0x2B, 0x15, 0x68, 0x9B, 0x58, 0x3A, 0xA7, 0xC5, 0xB8, 0x17, 0xA3, 0xAA,\n    0xCF, 0xF7, 0x91, 0x2E, 0xF2, 0xFC, 0xA4, 0xDC, 0x50, 0xB3, 0x19, 0x5C, 0x85, 0xA2, 0x89, 0x8C,\n    0xBB, 0x9A, 0x12, 0x45, 0xC9, 0x06, 0x36, 0xA3, 0x10, 0x3F, 0x4A, 0x0E, 0x08, 0x7F, 0xF9, 0x45,\n    0x09, 0xBC, 0xD5, 0xAC, 0x56, 0x6F, 0xB4, 0xC1, 0x15, 0x4E, 0xD4, 0x55, 0xD1, 0xF4, 0x97, 0x19,\n    0x7E, 0x88, 0x4E, 0xA7, 0x95, 0x5B, 0x89, 0xF9, 0x4A, 0x7A, 0xDD, 0x69, 0xB9, 0xEF, 0xB6, 0x1D,\n    0x68, 0x98, 0xAB, 0xBE, 0xF9, 0x10, 0x12, 0x79, 0xC0, 0x2E, 0x08, 0x8B, 0xD4, 0xFE, 0xFB, 0x33,\n    0xF5, 0x17, 0x6F, 0x71, 0x71, 0xD9, 0x95, 0x08, 0xBC, 0x05, 0x71, 0x6A, 0x54, 0x99, 0x80, 0x94,\n    0x8A, 0x92, 0x2B, 0x1A, 0x52, 0x60, 0x53, 0xAC, 0xB0, 0x58, 0xE1, 0x97, 0xC6, 0xAB, 0x1A, 0x81,\n    0x89, 0xBE, 0x60, 0xB1, 0x16, 0x79, 0xED, 0x3D, 0xE5, 0x31, 0xA2, 0x35, 0x74, 0x26, 0xAE, 0xFF,\n    0xEB, 0x7D, 0x62, 0xD0, 0x08, 0x00, 0x44, 0x9C, 0xBA, 0x22, 0x1F, 0x4D, 0x12, 0x1C, 0xF6, 0xEF,\n    0x43, 0x31, 0xBA, 0x80, 0xB7, 0x21, 0x2C, 0xAA, 0x0C, 0x47, 0xAA, 0x50, 0xC9, 0xE5, 0x9B, 0x6F,\n    0xAF, 0x69, 0x92, 0xD6, 0x72, 0x73, 0xAE, 0x2D, 0x7B, 0x60, 0x91, 0x0B, 0xC5, 0x48, 0x4D, 0xE4,\n    0x1B, 0x92, 0xC5, 0x60, 0x81, 0xF5, 0x96, 0xD5, 0x19, 0x72, 0x39, 0xF6, 0xC7, 0x47, 0x81, 0x3C,\n    0x2E, 0x5D, 0xDA, 0xBE, 0xAE, 0xF0, 0x04, 0x40, 0x2C, 0x0F, 0x98, 0x91, 0x2A, 0xB3, 0x2B, 0x90,\n    0xCD, 0x31, 0x92, 0x75, 0x9A, 0x93, 0x51, 0x83, 0x74, 0xCD, 0xFE, 0x53, 0x00, 0x99, 0xAE, 0x49,\n    0x47, 0x4B, 0x4F, 0x04, 0x70, 0xEE, 0x58, 0x4D, 0x84, 0x97, 0x7C, 0x75, 0x46, 0xBC, 0x64, 0xC7,\n    0x85, 0xA9, 0x0A, 0x7D, 0x5C, 0x6C, 0x9A, 0x21, 0x0B, 0x2A, 0x16, 0xF6, 0x96, 0xE6, 0x35, 0x6B,\n    0x59, 0xB1, 0xBB, 0xF7, 0xC2, 0x24, 0x33, 0x52, 0x79, 0x55, 0x33, 0x8D, 0xE6, 0xD0, 0xD8, 0xA7,\n    0xE5, 0x18, 0x5F, 0xF3, 0xE1, 0xE4, 0x23, 0xFF, 0xBF, 0x16, 0xDC, 0xFE, 0x5F, 0x32, 0x99, 0x2B,\n    0x22, 0x1A, 0x77, 0x2A, 0xAD, 0x04, 0x07, 0x3C, 0x15, 0xBF, 0x99, 0x53, 0x9C, 0x29, 0x2B, 0x67,\n    0xAF, 0xDD, 0x51, 0x89, 0x03, 0x85, 0xFF, 0x64, 0x2E, 0x1D, 0x0B, 0x03, 0x32, 0xB9, 0x51, 0xB8,\n    0xE4, 0x9F, 0x54, 0x49, 0xC4, 0x32, 0x0F, 0x99, 0x34, 0xB3, 0x51, 0xE9, 0x2D, 0x75, 0xF3, 0xF8,\n    0x04, 0x86, 0x6B, 0x84, 0xB0, 0x97, 0x95, 0xF4, 0x38, 0x4C, 0x8C, 0x88, 0x49, 0x48, 0x9E, 0x59,\n    0x0E, 0x8B, 0xB1, 0xE1, 0x41, 0x66, 0x10, 0x94, 0x59, 0xF9, 0x6E, 0x78, 0xCC, 0x11, 0x80, 0x92,\n    0x33, 0x7E, 0x6A, 0xB8, 0xC9, 0x33, 0xE8, 0xDD, 0x1B, 0x3F, 0x74, 0x79, 0x42, 0x5C, 0x93, 0x00,\n    0x4B, 0x68, 0xDA, 0x70, 0x8A, 0xB5, 0x24, 0xFD, 0x6B, 0x14, 0xF8, 0x1A, 0x26, 0x6A, 0x21, 0x36,\n    0x7C, 0xF6, 0x49, 0x44, 0xB4, 0xA6, 0x59, 0xF3, 0x00, 0x76, 0xC5, 0x8A, 0x30, 0xF4, 0x9C, 0x13,\n    0xC9, 0xB2, 0xCE, 0xF1, 0x3F, 0xAB, 0x75, 0xD6, 0x4F, 0x36, 0xEA, 0x86, 0x12, 0x7A, 0x9A, 0x54,\n    0x68, 0xEA, 0x13, 0xF4, 0x39, 0xC1, 0xC5, 0x70, 0x22, 0x79, 0x21, 0x0D, 0x7B, 0x47, 0x02, 0x97,\n    0x14, 0xFF, 0xD2, 0xBE, 0x99, 0x84, 0x0F, 0x3E, 0xDF, 0xA5, 0x64, 0x98, 0xDF, 0xF8, 0xAA, 0xA2,\n    0xD2, 0xED, 0xE8, 0x6E, 0x41, 0xF4, 0x04, 0x3C, 0xE8, 0x39, 0x80, 0x07, 0xBA, 0x7A, 0xCF, 0x69,\n    0x32, 0xDB, 0x7B, 0x72, 0x56, 0xE4, 0x1A, 0xA9, 0x87, 0xB2, 0x32, 0x3F, 0xD9, 0xF4, 0x3F, 0x4B,\n    0x04, 0xF2, 0xE1, 0x55, 0xD0, 0xED, 0x5D, 0xD9, 0x57, 0x7A, 0x04, 0x08, 0x05, 0x68, 0x15, 0x7B,\n    0x41, 0x61, 0x73, 0x52, 0x7C, 0xC9, 0x23, 0x30, 0x7A, 0x2F, 0xA4, 0xDF, 0x53, 0xEB, 0x99, 0xAF,\n    0x28, 0x89, 0x47, 0x10, 0xC5, 0xFD, 0xE0, 0x72, 0xA3, 0x5D, 0xE1, 0x02, 0x22, 0x49, 0x25, 0xDF,\n    0x00, 0x71, 0x26, 0xE7, 0xC5, 0x16, 0x6C, 0x5F, 0x24, 0x7F, 0xBF, 0x12, 0x2E, 0x71, 0xF1, 0x54,\n    0x15, 0xE3, 0x76, 0xDA, 0x27, 0x41, 0x8E, 0xF8, 0xA0, 0xC0, 0xF9, 0x5F, 0x6D, 0x4F, 0xC5, 0x4B,\n    0x58, 0xB5, 0xAB, 0xC4, 0x40, 0xA4, 0x89, 0x32, 0x08, 0x63, 0x5F, 0x68, 0x93, 0x56, 0x1C, 0x1F,\n    0x6F, 0xDE, 0xF1, 0x63, 0x28, 0x2E, 0x88, 0x52, 0x10, 0x3C, 0xFC, 0xEF, 0x03, 0x87, 0x91, 0xA5,\n    0x22, 0x06, 0x58, 0x88, 0x4F, 0x2C, 0x0B, 0x11, 0xFC, 0x21, 0x23, 0xB8, 0x6A, 0xBD, 0x21, 0x5B,\n    0x0C, 0x59, 0x2D, 0x6C, 0x83, 0x6F, 0x7C, 0xF8, 0x4D, 0x7F, 0x62, 0xBC, 0xD1, 0x7D, 0x39, 0x6E,\n    0x78, 0xCB, 0x88, 0xF2, 0x98, 0xDC, 0xBE, 0xCE, 0x38, 0x45, 0xF5, 0xE9, 0x3F, 0x58, 0x54, 0x62,\n    0xB4, 0x15, 0xE6, 0xF7, 0xE3, 0xCA, 0x91, 0x05, 0x35, 0x8C, 0x6A, 0xE6, 0x08, 0xFC, 0x05, 0x6D,\n    0x64, 0x31, 0x4B, 0xA4, 0x61, 0x21, 0x99, 0x4D, 0x51, 0xF5, 0x98, 0x07, 0x65, 0x3F, 0xD0, 0x6A,\n    0x8F, 0xDB, 0x8B, 0xB2, 0x0E, 0x43, 0x75, 0x49, 0x5D, 0x57, 0xAF, 0x98, 0x51, 0xA8, 0x28, 0x62,\n    0x8B, 0xBA, 0x47, 0x60, 0x90, 0xCC, 0xC8, 0xC2, 0x8D, 0xA7, 0xC0, 0xD5, 0x80, 0x6D, 0x54, 0x7F,\n    0xCD, 0xC6, 0xE6, 0x08, 0x23, 0x84, 0x69, 0x79, 0x29, 0x8F, 0x47, 0xB7, 0x85, 0x78, 0x8F, 0x29,\n    0xE1, 0x53, 0x50, 0xE4, 0x1B, 0x77, 0x66, 0x10, 0x63, 0xBF, 0xA4, 0xC2, 0xDF, 0xB3, 0x2C, 0x87,\n    0x21, 0x34, 0xE4, 0xE6, 0xE4, 0x6F, 0x2F, 0x5D, 0x5E, 0x45, 0xCF, 0x31, 0x7C, 0x4A, 0x5E, 0x99,\n    0xB9, 0x81, 0xAF, 0x9C, 0xCD, 0x24, 0x6B, 0x33, 0xE6, 0x8D, 0xB8, 0xB8, 0xA0, 0xDE, 0x15, 0x41,\n    0xFA, 0xBA, 0x21, 0xFC, 0x5D, 0xD0, 0x85, 0x3E, 0xD2, 0x06, 0x43, 0x3E, 0x93, 0xD6, 0x83, 0x58,\n    0x74, 0x57, 0xE0, 0xBD, 0x11, 0x4E, 0xF4, 0x17, 0xEA, 0x1C, 0x8B, 0x22, 0xB7, 0x6E, 0x89, 0x92,\n    0xC8, 0x48, 0xF9, 0x88, 0xEA, 0x46, 0x83, 0x54, 0x76, 0x94, 0xFD, 0x58, 0xD3, 0xA7, 0xD3, 0x24,\n    0xAF, 0xC9, 0x05, 0x64, 0x76, 0xC9, 0xC5, 0xA6, 0x41, 0x2E, 0xD7, 0xAA, 0x37, 0x72, 0x7A, 0x7C,\n    0x1B, 0x69, 0xBD, 0xA4, 0xD2, 0x43, 0x9D, 0xC6, 0xE4, 0x20, 0x8F, 0x08, 0x31, 0xE7, 0x6E, 0xD4,\n    0xFB, 0x2D, 0x85, 0x3D, 0x5A, 0x21, 0xEC, 0x03, 0xB5, 0x66, 0xFE, 0xF0, 0x24, 0x2A, 0xBF, 0x32,\n    0x6D, 0x5C, 0x4D, 0x9C, 0x4B, 0x22, 0x49, 0xEC, 0x72, 0x9B, 0x9A, 0x36, 0x03, 0x91, 0x8C, 0x7C,\n    0xB9, 0xE9, 0x8D, 0x72, 0xE0, 0xB0, 0x52, 0x63, 0x2E, 0xDB, 0x9C, 0x0D, 0x55, 0x33, 0xA5, 0x17,\n    0x7A, 0x2D, 0xAF, 0x75, 0x69, 0x50, 0x7D, 0xDC, 0xEE, 0x26, 0xC6, 0xE3, 0x26, 0xF9, 0x59, 0xF9,\n    0x10, 0x42, 0x1E, 0xC7, 0x3E, 0x11, 0xCB, 0xFA, 0x4E, 0xE6, 0xAB, 0x6E, 0xA9, 0x1C, 0xD1, 0x76,\n    0x20, 0xB6, 0xD6, 0xBD, 0xD3, 0xCA, 0x9C, 0x82, 0x33, 0xB8, 0x5E, 0xED, 0xCA, 0x2C, 0x50, 0xC3,\n    0x58, 0x13, 0x7A, 0xA7, 0xF0, 0x92, 0x89, 0x04, 0xF8, 0x27, 0x98, 0xE2, 0x1C, 0xF2, 0xDA, 0xF6,\n    0x4D, 0xC0, 0x6A, 0x1C, 0xC5, 0xA5, 0x79, 0x6B, 0x84, 0x37, 0x05, 0x90, 0x6A, 0x0E, 0x2B, 0xAF,\n    0x96, 0x9E, 0x45, 0xDB, 0x79, 0xDA, 0x2F, 0x46, 0x5F, 0xE2, 0xE8, 0xA6, 0xC6, 0x00, 0xF2, 0x8F,\n    0xC2, 0xA0, 0xF9, 0x32, 0x53, 0x63, 0xF9, 0xED, 0x9C, 0x0F, 0x29, 0x8F, 0x5D, 0x6C, 0x56, 0xE9,\n    0xBF, 0x52, 0xB1, 0xB5, 0xD3, 0x8A, 0xE4, 0xE6, 0x1D, 0xB2, 0xC9, 0x0E, 0x8F, 0x28, 0xB0, 0xBF,\n    0x68, 0x91, 0x87, 0x8E, 0x30, 0x6A, 0xF6, 0x5E, 0x44, 0x81, 0x3E, 0xAA, 0xC2, 0x93, 0x9D, 0x41,\n    0xAE, 0x54, 0xF1, 0x96, 0x40, 0x30, 0x5F, 0xAD, 0x44, 0xCF, 0xB4, 0x34, 0x86, 0xE2, 0xF4, 0x97,\n    0x14, 0x21, 0x1D, 0xA5, 0x58, 0xAF, 0x7B, 0x32, 0x5D, 0x63, 0x9A, 0x9D, 0x2A, 0x7C, 0xDA, 0xAD,\n    0xD5, 0xB2, 0xA8, 0x0D, 0x8F, 0xDA, 0x44, 0xCE, 0xB6, 0xA0, 0xC3, 0x3C, 0x73, 0xC5, 0x8C, 0x9B,\n    0x62, 0x0C, 0xF2, 0x79, 0x3C, 0x78, 0xF8, 0xC3, 0xC4, 0x4B, 0xAE, 0x29, 0x5A, 0x30, 0xC9, 0xB9,\n    0x6A, 0xE4, 0x52, 0x09, 0xE1, 0x09, 0x60, 0x8B, 0x56, 0x90, 0x84, 0xE2, 0x5A, 0x07, 0x88, 0x25,\n    0x03, 0xB7, 0x5B, 0x86, 0x1E, 0x68, 0x2C, 0x25, 0x5D, 0xFE, 0xB9, 0x5A, 0xF0, 0xDC, 0x81, 0x1F,\n    0xEE, 0xF7, 0x11, 0x94, 0x67, 0x85, 0x13, 0xEC, 0x65, 0xEC, 0x83, 0x53, 0x81, 0x57, 0xEB, 0x95,\n    0xF5, 0xCE, 0xFF, 0x26, 0xDE, 0x85, 0xDD, 0x7D, 0xA3, 0xFB, 0xA2, 0xB9, 0xD9, 0x33, 0x82, 0x0D,\n    0x43, 0xC9, 0x1B, 0x72, 0x14, 0x39, 0x24, 0x57, 0x2A, 0x8E, 0x36, 0xA6, 0x86, 0xCC, 0xE8, 0x1F,\n    0x6B, 0xAD, 0x7B, 0x0E, 0x89, 0xF9, 0x1C, 0xBB, 0x6E, 0x43, 0x99, 0xD5, 0xAA, 0x59, 0xDF, 0x63,\n    0x12, 0x29, 0x56, 0xCD, 0x55, 0x56, 0xFC, 0x3E, 0xC2, 0x38, 0xD4, 0x65, 0x59, 0xE8, 0x6E, 0x31,\n    0xFE, 0xA8, 0x18, 0xAA, 0xB4, 0x4C, 0x72, 0x3C, 0xB2, 0xBD, 0xA7, 0x54, 0x8B, 0x53, 0xF8, 0xF7,\n    0xB8, 0x80, 0xCE, 0x06, 0x89, 0x5E, 0x9D, 0x19, 0x29, 0xDE, 0x73, 0x01, 0xCF, 0x0C, 0xD2, 0xF8,\n    0xE3, 0x2B, 0x3D, 0x7C, 0x84, 0xFF, 0x4D, 0xE3, 0x2E, 0x33, 0x6F, 0x47, 0x1E, 0x97, 0xB3, 0x55,\n    0x0B, 0x5C, 0xE3, 0xAB, 0x9C, 0xCB, 0x40, 0x82, 0xD6, 0xA3, 0x47, 0x8B, 0xFF, 0xB1, 0x26, 0x44,\n    0xE3, 0x7E, 0x39, 0xDB, 0xDD, 0x1B, 0x35, 0xE6, 0x6E, 0xF2, 0x48, 0x57, 0x09, 0x02, 0xB6, 0xA4,\n    0xD4, 0xB9, 0x7E, 0x20, 0x93, 0x8F, 0x59, 0xE7, 0x2D, 0x0D, 0xB8, 0x82, 0x9A, 0xA4, 0xC7, 0xB2,\n    0x2A, 0x31, 0x88, 0x52, 0x98, 0xDF, 0x4C, 0xF6, 0xD4, 0xB4, 0xD2, 0x71, 0x41, 0xAA, 0x37, 0x52,\n    0x34, 0x70, 0x51, 0x9B, 0x33, 0x2D, 0xA3, 0x71, 0x3E, 0xB4, 0xC2, 0x5B, 0xEC, 0xC4, 0xD4, 0x51,\n    0xF5, 0x8A, 0xD8, 0xB2, 0x87, 0xAE, 0x41, 0xC2, 0xBA, 0x0B, 0x43, 0xEA, 0x83, 0xD8, 0x32, 0x97,\n    0x5C, 0xCA, 0xF6, 0xBD, 0x65, 0x89, 0xF7, 0x92, 0x8E, 0xF9, 0x97, 0x7F, 0xF7, 0x17, 0x28, 0x47,\n    0x45, 0xB3, 0xEB, 0x71, 0x86, 0x16, 0x40, 0x86, 0x28, 0x43, 0x33, 0x92, 0x11, 0x06, 0xED, 0x26,\n    0x5D, 0x8F, 0x35, 0xAB, 0xA7, 0xF6, 0x6C, 0xCE, 0x29, 0x62, 0xD6, 0xBE, 0x16, 0xA3, 0x6B, 0x34,\n    0xAE, 0x40, 0xED, 0x25, 0x2A, 0xA7, 0x84, 0x1A, 0x7F, 0xB0, 0xBE, 0x2E, 0x09, 0x8A, 0x06, 0x90,\n    0x11, 0x2D, 0x54, 0x88, 0x2C, 0x23, 0x78, 0x4A, 0x79, 0x13, 0x39, 0xEA, 0xC5, 0x4F, 0x05, 0x30,\n    0x46, 0xBB, 0x38, 0xF1, 0x47, 0x36, 0xBF, 0xAF, 0xD1, 0x7E, 0x3A, 0x7B, 0x31, 0x54, 0x22, 0x2F,\n    0x3D, 0xA6, 0xAB, 0x10, 0x1A, 0x3B, 0x76, 0x9A, 0xED, 0xCC, 0xD2, 0xD3, 0x29, 0xA5, 0x90, 0xEB,\n    0x57, 0x15, 0x1D, 0xC8, 0xB6, 0xCD, 0xD0, 0x11, 0x44, 0x2C, 0x7B, 0xCF, 0x42, 0xA0, 0x76, 0xE2,\n    0x14, 0x43, 0xC0, 0xBD, 0x53, 0x22, 0x37, 0x4E, 0x83, 0xD2, 0x91, 0x47, 0xDD, 0xCB, 0x8E, 0x5A,\n    0xB0, 0xA6, 0xB0, 0x13, 0x84, 0x81, 0x6A, 0x59, 0xC4, 0xC9, 0x58, 0x1A, 0x3B, 0x41, 0x09, 0x2B,\n    0xC1, 0xCB, 0x39, 0x98, 0xE8, 0xDD, 0x1B, 0x45, 0x5F, 0xB6, 0x86, 0x6B, 0x41, 0x7C, 0x32, 0xDC,\n    0x0E, 0x03, 0xE7, 0xF3, 0xB9, 0x65, 0x8E, 0x3A, 0x69, 0x67, 0x8E, 0xE2, 0x6D, 0x6F, 0xB7, 0xA7,\n    0x2A, 0x93, 0x9D, 0xEA, 0xA7, 0x2E, 0x82, 0x88, 0x67, 0xC6, 0x91, 0x36, 0xDC, 0x93, 0x47, 0x9A,\n    0xCD, 0xF9, 0xF6, 0xFA, 0x2A, 0x3A, 0x85, 0xD1, 0x66, 0x48, 0xFC, 0x1A, 0x9E, 0x64, 0x6C, 0x20,\n    0xD4, 0x19, 0x07, 0xDA, 0xE3, 0xC3, 0x54, 0xD2, 0x45, 0xB5, 0x47, 0x10, 0x2A, 0xB4, 0x00, 0xDF,\n    0x06, 0xF6, 0xE4, 0xBF, 0x47, 0x6C, 0x61, 0xDD, 0xD7, 0x3C, 0xE2, 0x27, 0x3A, 0x4E, 0xEE, 0xCA,\n    0x07, 0x03, 0x7E, 0xFC, 0x41, 0x94, 0x3B, 0xA8, 0xD5, 0x28, 0x65, 0xBE, 0x55, 0x28, 0x69, 0x10,\n    0xF3, 0x91, 0xCE, 0xF8, 0x84, 0x65, 0x45, 0xDC, 0xB0, 0x54, 0x79, 0x1A, 0x17, 0x60, 0x61, 0xBD,\n    0xB6, 0x2C, 0x93, 0x21, 0x8E, 0x19, 0x35, 0x27, 0x9B, 0x5E, 0xFE, 0x8D, 0xB4, 0x1A, 0xD6, 0xD1,\n    0xB2, 0xCE, 0xC6, 0x20, 0x6B, 0x92, 0xEC, 0x78, 0xF8, 0x7D, 0x93, 0x22, 0xF0, 0xD5, 0xD4, 0x5B,\n    0x41, 0xF3, 0xC2, 0x32, 0xB7, 0x58, 0x5E, 0x40, 0x9E, 0x0F, 0x93, 0x2A, 0xBC, 0xBC, 0xD5, 0x33,\n    0x27, 0x13, 0x0E, 0x4B, 0x9B, 0x8F, 0x3D, 0x77, 0x02, 0x24, 0xA4, 0x72, 0xAE, 0x77, 0xE4, 0x1A,\n    0xE8, 0xA3, 0x88, 0x7C, 0xDC, 0x15, 0x23, 0x62, 0xD1, 0x53, 0xF8, 0x2F, 0x42, 0xAB, 0xC1, 0xF9,\n    0x43, 0x4F, 0x5E, 0xAD, 0x44, 0xD3, 0x8B, 0x36, 0x39, 0x5C, 0xAB, 0x52, 0x3D, 0xEB, 0x86, 0x00,\n    0x49, 0x18, 0x3C, 0x3C, 0x5A, 0x2B, 0xD0, 0xD4, 0xEF, 0xD9, 0xEA, 0xC5, 0x51, 0x53, 0xBD, 0xBD,\n    0xBE, 0x42, 0x37, 0x37, 0x74, 0x89, 0xBB, 0x1D, 0x6E, 0x2D, 0x42, 0xD3, 0x73, 0x28, 0x47, 0x2F,\n    0xFD, 0x2C, 0xC0, 0xE0, 0xBE, 0xFD, 0x7D, 0x4E, 0x8A, 0xD8, 0xC6, 0xE0, 0xFE, 0xF5, 0xE0, 0x33,\n    0x2D, 0xB2, 0x38, 0xAC, 0x83, 0xDF, 0x6D, 0x7F, 0x29, 0xAA, 0x0C, 0x12, 0x74, 0xC0, 0x5B, 0xB6,\n    0x7E, 0x7F, 0x07, 0x83, 0xC9, 0x70, 0x2E, 0x89, 0x86, 0x13, 0xE6, 0xBA, 0x83, 0xE6, 0x41, 0xA2,\n    0xC2, 0xFF, 0xE4, 0x33, 0x77, 0xD8, 0x42, 0x80, 0x46, 0xDB, 0x0C, 0x02, 0xF1, 0x4D, 0xAD, 0x82,\n    0x0E, 0x6F, 0xE2, 0x76, 0x3F, 0x5E, 0x16, 0x23, 0xF8, 0xC9, 0x8D, 0x55, 0x91, 0xBA, 0x52, 0xEF,\n    0x8A, 0x49, 0x0E, 0x33, 0x7A, 0xF6, 0xB5, 0x62, 0xD3, 0x79, 0xC4, 0x99, 0x49, 0xE9, 0x81, 0xC1,\n    0xF9, 0x3F, 0x75, 0x9E, 0x24, 0x14, 0x9A, 0x9D, 0x70, 0x62, 0x04, 0x6A, 0xB4, 0x3C, 0xA9, 0xDB,\n    0x46, 0x5C, 0x3C, 0xDE, 0xA3, 0xF4, 0xCE, 0x9D, 0x4C, 0x84, 0x69, 0xDA, 0x0E, 0x29, 0x86, 0x8F,\n    0xF0, 0xD1, 0x3A, 0x33, 0xE4, 0xEE, 0xFC, 0x8D, 0xA9, 0x51, 0x3C, 0x60, 0x27, 0x61, 0x3F, 0x90,\n    0xE4, 0xC9, 0x71, 0xE1, 0xEB, 0xF9, 0x04, 0xEB, 0xA3, 0xB8, 0xAD, 0x04, 0x82, 0x2B, 0x40, 0x13,\n    0x46, 0xC0, 0x47, 0x72, 0xC7, 0x37, 0xD5, 0xCF, 0x0E, 0x93, 0x58, 0x2C, 0xED, 0x03, 0x68, 0xE2,\n    0x78, 0xFD, 0x70, 0xE8, 0x53, 0x27, 0x06, 0x70, 0x7A, 0x7F, 0x85, 0xEF, 0x2B, 0x98, 0x7F, 0xFD,\n    0x34, 0x2B, 0xAC, 0xA0, 0x46, 0x35, 0x56, 0x75, 0x96, 0x0B, 0xF9, 0xEC, 0xE4, 0x9B, 0xBD, 0x1E,\n    0xE0, 0x94, 0x67, 0x86, 0xD3, 0xBB, 0xE4, 0x53, 0x82, 0x28, 0x29, 0xC2, 0x1B, 0x3F, 0x79, 0x86,\n    0x44, 0x6A, 0x50, 0x1E, 0xCE, 0x1B, 0xCC, 0x8C, 0x13, 0x49, 0x32, 0xE3, 0xE6, 0xD1, 0x5B, 0xDD,\n    0x59, 0x33, 0x75, 0x95, 0xF2, 0xC1, 0xC5, 0x77, 0x08, 0x81, 0x47, 0x39, 0xCD, 0xBA, 0x78, 0xA1,\n    0x47, 0xD4, 0x2C, 0xDE, 0x9F, 0xB0, 0x20, 0x55, 0xA1, 0x4B, 0xD9, 0x0A, 0xA8, 0x9C, 0xFE, 0x8C,\n    0x5F, 0x80, 0x2B, 0x90, 0x5D, 0x86, 0xB5, 0x91, 0x31, 0x5C, 0x34, 0x4A, 0xC8, 0x27, 0xFF, 0x2D,\n    0xDA, 0xA8, 0xA3, 0xBE, 0x9A, 0xB3, 0x24, 0x8A, 0xB4, 0x1C, 0xCC, 0xC1, 0x80, 0x75, 0xEB, 0x88,\n    0x79, 0xA2, 0x20, 0xD9, 0x7E, 0x13, 0xCC, 0x6E, 0xE9, 0x2E, 0xA0, 0x3A, 0x46, 0x2F, 0xA1, 0x99,\n    0xDE, 0x57, 0xE4, 0x33, 0x10, 0xB2, 0xC8, 0xE5, 0xCF, 0xC0, 0x75, 0x9E, 0xF7, 0xB9, 0x74, 0xA8,\n    0xD0, 0x56, 0xFF, 0x86, 0x95, 0x73, 0xE1, 0x36, 0xF5, 0xED, 0x89, 0x0C, 0x35, 0x25, 0xDF, 0x05,\n    0xDB, 0xAA, 0x09, 0x54, 0x29, 0xF4, 0x96, 0xD1, 0x82, 0x50, 0xC2, 0x60, 0x2C, 0xE4, 0xCB, 0x86,\n    0xBE, 0xAB, 0xB1, 0x05, 0x1D, 0x85, 0xA6, 0x76, 0xA3, 0xE2, 0x4E, 0x74, 0x71, 0xEB, 0x65, 0xA1,\n    0x53, 0xF6, 0x32, 0x67, 0x3A, 0x56, 0x2A, 0xE3, 0xE1, 0x8E, 0x75, 0xCF, 0xE0, 0xB2, 0xBB, 0x40,\n    0x0A, 0xD1, 0x93, 0x83, 0xA0, 0x21, 0x29, 0x77, 0xC1, 0x8D, 0x67, 0x67, 0x27, 0xF0, 0xB1, 0x9B,\n    0x1C, 0xD2, 0x3F, 0x93, 0x63, 0x86, 0x38, 0x12, 0xB6, 0x33, 0x6D, 0xAB, 0x5B, 0x16, 0xF2, 0xB5,\n    0xAD, 0x30, 0xD6, 0xDD, 0xA7, 0xA1, 0x9F, 0xDD, 0x52, 0xEE, 0xEA, 0x50, 0xD4, 0x36, 0x1E, 0x9C,\n    0x2B, 0xD0, 0x45, 0xEF, 0x7E, 0x43, 0xC7, 0x72, 0xBB, 0x55, 0xF7, 0xF6, 0x32, 0xE8, 0xC4, 0xAE,\n    0x48, 0x1A, 0x6A, 0x8D, 0xE1, 0xA0, 0xBC, 0x83, 0x0F, 0x4A, 0xAC, 0x9C, 0x6F, 0x98, 0x56, 0x8A,\n    0x66, 0x73, 0x15, 0x07, 0xA6, 0x46, 0xD1, 0x6B, 0x07, 0x1C, 0x36, 0x1E, 0xC9, 0x48, 0x8A, 0x05,\n    0xC2, 0x1D, 0x9D, 0x54, 0x37, 0x34, 0x8F, 0x4B, 0xD7, 0x63, 0x1F, 0xC3, 0x02, 0xC2, 0x11, 0x70,\n    0x40, 0x61, 0x4F, 0xE1, 0x17, 0x63, 0xDF, 0x21, 0x50, 0x7D, 0x08, 0x02, 0xB6, 0x97, 0x11, 0x2E,\n    0xF5, 0xE6, 0x0C, 0x94, 0x10, 0x31, 0x5A, 0x51, 0x5D, 0x00, 0x84, 0xC2, 0x86, 0x90, 0xD4, 0xAE,\n    0x34, 0xB7, 0x1E, 0x97, 0x80, 0x3F, 0x85, 0x52, 0x2D, 0x7A, 0xBD, 0x32, 0x03, 0x2B, 0x9F, 0xF5,\n    0xCA, 0x85, 0x6D, 0x9A, 0xF3, 0x65, 0xAF, 0xE2, 0x60, 0xDF, 0x8C, 0x4F, 0x18, 0xD1, 0x85, 0xD3,\n    0x01, 0x6B, 0x07, 0xA0, 0x54, 0xB6, 0xCB, 0x25, 0xB3, 0x92, 0x96, 0xC5, 0x0B, 0xE8, 0xB4, 0xA4,\n    0x60, 0x23, 0x81, 0x47, 0xBA, 0xAD, 0x31, 0x05, 0x58, 0x3D, 0xC4, 0xA9, 0xF7, 0xAB, 0x9E, 0x9F,\n    0xAF, 0x7E, 0xAA, 0x20, 0xB5, 0xA4, 0xA5, 0x9A, 0x46, 0xF7, 0xCC, 0xE8, 0xFE, 0x6B, 0x93, 0x07,\n    0x7B, 0x43, 0x9F, 0x79, 0x55, 0x4E, 0xAB, 0xCD, 0xEF, 0x3A, 0xA1, 0x8E, 0xC4, 0xDE, 0x62, 0x5F,\n    0x0A, 0xFF, 0xC7, 0x1B, 0x4E, 0x53, 0x50, 0x36, 0x93, 0x1C, 0x47, 0xF2, 0x6A, 0x58, 0xD0, 0xBF,\n    0x70, 0x8B, 0x45, 0x34, 0x34, 0x33, 0x9E, 0x44, 0xB9, 0x64, 0xED, 0x9B, 0x6D, 0x07, 0x5F, 0x8C,\n    0x12, 0xEF, 0xDC, 0x26, 0xFF, 0x4C, 0xCE, 0xCE, 0x8D, 0xB9, 0x91, 0xC7, 0x82, 0xBF, 0x08, 0x23,\n    0xA8, 0x9A, 0x8E, 0x21, 0x8C, 0xDE, 0x1C, 0x92, 0x5B, 0xB0, 0x70, 0x69, 0x42, 0xD6, 0xB9, 0x94,\n    0x1A, 0xA2, 0x12, 0x91, 0xF1, 0x54, 0x80, 0x02, 0x0C, 0xD2, 0x54, 0x17, 0x4C, 0x29, 0xEA, 0x31,\n    0xC1, 0x60, 0x94, 0x9F, 0x44, 0xDF, 0x7B, 0x38, 0xFE, 0xD4, 0x32, 0x36, 0x6C, 0xD4, 0x6A, 0xD1,\n    0x3D, 0x6C, 0x73, 0x77, 0x81, 0xDC, 0xE2, 0x9D, 0x48, 0x5A, 0xB2, 0x95, 0x28, 0x40, 0x5F, 0xF5,\n    0x6C, 0x9A, 0x63, 0x4B, 0x24, 0xD5, 0xE3, 0x25, 0x75, 0xD4, 0xAC, 0x87, 0xA4, 0x55, 0x97, 0xA7,\n    0xB0, 0xD7, 0x06, 0x10, 0xD5, 0x0F, 0xC9, 0x8F, 0xC7, 0x6C, 0x63, 0x49, 0x81, 0x14, 0x24, 0xB0,\n    0x2C, 0xAA, 0xDE, 0x01, 0xB0, 0x4E, 0x2C, 0xD8, 0xB7, 0xDF, 0x24, 0x21, 0xF8, 0x07, 0xF6, 0x36,\n    0x93, 0x09, 0x66, 0x1D, 0xBF, 0x6D, 0x76, 0xA7, 0xDC, 0xA2, 0x67, 0xAA, 0x9E, 0x04, 0xB4, 0x9C,\n    0xE9, 0xBC, 0x78, 0xDC, 0xEC, 0x1D, 0x4D, 0xED, 0x5F, 0x9F, 0xAA, 0xFF, 0x75, 0x24, 0x3A, 0x95,\n    0xF8, 0xA2, 0xC0, 0x38, 0x73, 0xEF, 0xFF, 0x11, 0x71, 0xDE, 0xBB, 0x76, 0x19, 0xBA, 0xB9, 0xB0,\n    0xA6, 0x1B, 0x0F, 0x33, 0xFA, 0x3B, 0xB5, 0x4D, 0x32, 0x9F, 0x15, 0x09, 0xC3, 0x22, 0xCE, 0x73,\n    0x31, 0xDD, 0x23, 0xBF, 0x1E, 0x99, 0x57, 0x6D, 0x0B, 0xDF, 0xF8, 0xFD, 0xAC, 0x41, 0xA7, 0x91,\n    0x8B, 0x70, 0x5C, 0x41, 0x02, 0x77, 0x52, 0x1D, 0xAC, 0xBF, 0xBD, 0x03, 0xA3, 0x5A, 0xC4, 0x61,\n    0xA8, 0xE1, 0x00, 0xE1, 0x77, 0x14, 0x7E, 0x5F, 0xDF, 0x11, 0x80, 0x40, 0xBA, 0xA1, 0x07, 0x9F,\n    0xC7, 0xED, 0xC6, 0x77, 0xF4, 0x14, 0x55, 0x99, 0x56, 0x15, 0x6C, 0xF9, 0x34, 0x02, 0x28, 0x69,\n    0x81, 0xDD, 0x0D, 0x9E, 0x5B, 0x35, 0xEA, 0x1D, 0x9C, 0xA9, 0xBB, 0x82, 0x79, 0x1B, 0xE7, 0xF5,\n    0xF8, 0xFD, 0x14, 0xC8, 0xDC, 0xE8, 0x7A, 0x6D, 0x7B, 0xA1, 0x35, 0x7C, 0x0B, 0x13, 0x1B, 0x08,\n    0x2E, 0x8B, 0x04, 0x27, 0x16, 0x04, 0xFC, 0x6C, 0xE4, 0x1E, 0x29, 0x06, 0xF1, 0x05, 0xCD, 0x6C,\n    0x10, 0xB1, 0xBA, 0xB9, 0x7F, 0x97, 0xDD, 0x8C, 0xA5, 0x51, 0xB8, 0xD5, 0xE8, 0xE9, 0xEA, 0x23,\n    0x5D, 0x2C, 0x6A, 0xC2, 0x74, 0x7F, 0x81, 0xB6, 0x47, 0xF9, 0xA5, 0x94, 0x57, 0x31, 0x3B, 0xCE,\n    0xCB, 0x13, 0xA7, 0xED, 0x9A, 0x29, 0x33, 0x4F, 0xE2, 0xB5, 0xAA, 0x41, 0x37, 0x6F, 0xF4, 0x82,\n    0x65, 0x5F, 0x5D, 0xAE, 0x4D, 0x92, 0xD9, 0x03, 0xCC, 0x71, 0xA7, 0x6D, 0x68, 0x46, 0x87, 0xA0,\n    0x79, 0x28, 0x9C, 0x4A, 0x39, 0x7F, 0x5E, 0xA2, 0xD5, 0xB4, 0x8B, 0x35, 0x07, 0x49, 0x66, 0x47,\n    0x08, 0xFB, 0xFF, 0xE4, 0x44, 0x06, 0x3B, 0x7D, 0x99, 0xED, 0xE6, 0x9D, 0xDD, 0x9B, 0x86, 0x27,\n    0x4D, 0x3A, 0x46, 0x42, 0xDA, 0xEC, 0xCD, 0xEA, 0x1E, 0x4F, 0xDA, 0x5F, 0x5F, 0x0E, 0x0C, 0xCF,\n    0x65, 0x64, 0x34, 0x29, 0x4E, 0x14, 0x4B, 0x8A, 0x9A, 0x2C, 0xF6, 0x80, 0xBC, 0x4B, 0xAD, 0xB9,\n    0x24, 0xC3, 0x56, 0x2E, 0x5E, 0x3D, 0xBD, 0xE0, 0x48, 0x96, 0x30, 0x01, 0xD7, 0x4A, 0xEA, 0x0B,\n    0xCD, 0xF2, 0xFA, 0x99, 0x67, 0xA3, 0x98, 0x01, 0xD5, 0x19, 0x0D, 0xD5, 0x6E, 0xB3, 0x18, 0x05,\n    0x62, 0x5C, 0x75, 0xB3, 0xC2, 0x60, 0xCF, 0xF5, 0x22, 0x42, 0x32, 0x73, 0x99, 0x1D, 0x31, 0x94,\n    0xE6, 0x37, 0xC8, 0x74, 0x41, 0xF1, 0xBD, 0x46, 0xBA, 0x0B, 0x2A, 0xA7, 0x4A, 0x28, 0xB8, 0x25,\n    0x48, 0x99, 0xEF, 0xE1, 0xE7, 0x4D, 0xEB, 0x53, 0xBA, 0x76, 0xA2, 0x15, 0x1B, 0xFE, 0x80, 0x6F,\n    0x66, 0x81, 0x15, 0x99, 0x6B, 0x1C, 0x12, 0xB6, 0x61, 0x52, 0xCD, 0xBA, 0x47, 0x79, 0x0D, 0x9A,\n    0xEE, 0xA9, 0x3E, 0xFB, 0xBD, 0x56, 0xA7, 0xBC, 0x41, 0xF1, 0x17, 0x00, 0xC5, 0x0E, 0x58, 0xA7,\n    0x71, 0x42, 0x7D, 0x4A, 0xAF, 0x3C, 0x8E, 0xA6, 0x77, 0x6F, 0x35, 0xEC, 0x92, 0x8A, 0xC9, 0xCC,\n    0xB0, 0x58, 0x74, 0xCE, 0xD3, 0xBB, 0xA0, 0xC1, 0xCD, 0x12, 0xF2, 0x81, 0x1C, 0xA4, 0x26, 0x7C,\n    0x92, 0x8A, 0x27, 0x19, 0x3C, 0x44, 0x2A, 0x7D, 0x0E, 0xD3, 0xEA, 0x15, 0x3A, 0xF9, 0x4B, 0xBF,\n    0x99, 0x8A, 0x7F, 0xAB, 0x13, 0x24, 0x65, 0x46, 0x94, 0x29, 0xBD, 0xB7, 0x2A, 0xEE, 0x65, 0xEF,\n    0x02, 0x34, 0x20, 0xF4, 0xD2, 0xAF, 0xC4, 0x10, 0x93, 0x05, 0xD5, 0x82, 0x71, 0x7C, 0xF8, 0x9D,\n    0x43, 0x72, 0x09, 0xBB, 0x8C, 0xC3, 0x60, 0x21, 0x40, 0xCB, 0x97, 0xA3, 0x47, 0xE1, 0xDF, 0x18,\n    0x5E, 0x22, 0x2F, 0x95, 0x49, 0x3F, 0x89, 0x50, 0xFD, 0x08, 0x3D, 0xC2, 0xE2, 0x5D, 0x5A, 0xA3,\n    0xF2, 0x09, 0x4F, 0x0C, 0x55, 0x38, 0x69, 0xF8, 0x39, 0xC3, 0x94, 0xF7, 0x55, 0x71, 0xA9, 0xC7,\n    0x0F, 0x2C, 0x8E, 0x3C, 0x70, 0x86, 0x57, 0x6F, 0xCF, 0x5D, 0xE9, 0x4B, 0x4F, 0x80, 0x7E, 0x15,\n    0x42, 0x43, 0x7B, 0xEC, 0xCD, 0x4E, 0x92, 0x8D, 0x5C, 0x89, 0xD2, 0x08, 0x5A, 0x32, 0x0F, 0x6E,\n    0x0D, 0x09, 0x29, 0x02, 0x6F, 0xA0, 0x2E, 0x8E, 0x5C, 0x10, 0x16, 0x1E, 0x82, 0xDF, 0xD3, 0xCD,\n    0xB5, 0x93, 0xD6, 0x21, 0x7B, 0x96, 0xC5, 0xFC, 0x79, 0x21, 0x88, 0x99, 0xC9, 0x3C, 0x75, 0x98,\n    0x13, 0x67, 0x62, 0xFD, 0x70, 0xB0, 0x58, 0xDA, 0xCF, 0xDC, 0x9E, 0x92, 0x5F, 0x84, 0x3B, 0x0E,\n    0xD8, 0xE0, 0xCF, 0xF3, 0x90, 0x9E, 0xFC, 0x40, 0xC7, 0x58, 0x2F, 0x11, 0x55, 0x9D, 0x7A, 0xE9,\n    0x9D, 0x5C, 0xD7, 0xDF, 0xEF, 0xC5, 0x87, 0x7E, 0xC5, 0x14, 0xA7, 0xCE, 0xE6, 0xDB, 0x83, 0xD4,\n    0x3A, 0xF7, 0x86, 0xD0, 0xE6, 0x2B, 0xFF, 0x8B, 0x80, 0xF8, 0xD6, 0xFE, 0x55, 0x82, 0xD7, 0x5B,\n    0xEB, 0x29, 0x9C, 0x1D, 0xCD, 0x69, 0x1D, 0xF2, 0xB5, 0x44, 0x09, 0xAD, 0x1D, 0x40, 0xDD, 0xC1,\n    0xFB, 0xDF, 0x79, 0xCA, 0xA4, 0x61, 0xAC, 0x39, 0x80, 0x66, 0xB8, 0x37, 0x91, 0xF6, 0x23, 0xEB,\n    0x82, 0x49, 0x05, 0x41, 0x72, 0x98, 0xA6, 0x1C, 0x21, 0xB1, 0x64, 0x90, 0xDC, 0x68, 0x00, 0x2E,\n    0x61, 0x2A, 0x80, 0x91, 0xEB, 0xCA, 0x04, 0x3D, 0x8E, 0x70, 0x21, 0x60, 0x1E, 0x11, 0x69, 0x4A,\n    0x3B, 0x09, 0x84, 0x90, 0x98, 0x78, 0xF0, 0x9D, 0x5A, 0x92, 0x71, 0xC3, 0xB7, 0x4B, 0x42, 0x98,\n    0x8E, 0xB6, 0x2B, 0x39, 0x59, 0x5F, 0xC1, 0x04, 0xC6, 0x8F, 0x6B, 0x33, 0xF7, 0x9E, 0x0B, 0x32,\n    0x35, 0x60, 0x57, 0x23, 0xA1, 0xCB, 0x73, 0x82, 0xEA, 0x05, 0x3D, 0xDC, 0xF5, 0x36, 0x1B, 0x5E,\n    0x18, 0x1F, 0x37, 0x14, 0xD7, 0x06, 0xAE, 0xDD, 0x46, 0x15, 0x82, 0xA2, 0x9C, 0xAA, 0x41, 0xFE,\n    0x28, 0xB8, 0x3E, 0x2A, 0x7D, 0x78, 0xB8, 0x27, 0xE7, 0x65, 0x52, 0x7D, 0x93, 0x9F, 0x13, 0x9A,\n    0x22, 0xF1, 0xF5, 0xB3, 0x2A, 0x37, 0xB6, 0x81, 0xF7, 0x5D, 0x4C, 0xA3, 0x65, 0x28, 0x13, 0x9E,\n    0x41, 0xD8, 0xC4, 0xA8, 0x10, 0xD5, 0x5D, 0xB0, 0xBA, 0xE5, 0xDF, 0xF3, 0xFF, 0x49, 0xD1, 0xED,\n    0x9D, 0x9E, 0xFA, 0x19, 0xF7, 0x41, 0xDB, 0xC1, 0xBE, 0x8E, 0x72, 0xAD, 0xB2, 0xD5, 0x7A, 0x93,\n    0x6F, 0xF7, 0x25, 0xB9, 0x62, 0xB5, 0xA9, 0x3B, 0x79, 0xF6, 0xA8, 0x56, 0x4A, 0x8F, 0x98, 0x9E,\n    0xC7, 0x4F, 0x42, 0x49, 0xB3, 0x75, 0xFA, 0x73, 0xDD, 0x37, 0xCA, 0xCE, 0xEA, 0x5E, 0xF0, 0x84,\n    0x88, 0x6F, 0x54, 0x54, 0xA5, 0xA0, 0x1D, 0xF9, 0xE7, 0x4E, 0xCB, 0xD6, 0x0A, 0xB4, 0x84, 0xBF,\n    0xD0, 0x2E, 0x2C, 0xF9, 0x12, 0x33, 0x28, 0x91, 0x40, 0x3E, 0xC9, 0x18, 0x9E, 0x84, 0x76, 0xDB,\n    0xEB, 0x21, 0x62, 0x35, 0xAE, 0x98, 0x20, 0x97, 0x2B, 0x8D, 0x6B, 0x86, 0x73, 0x91, 0x00, 0x0C,\n    0xA0, 0xF1, 0xAB, 0xB7, 0x65, 0x94, 0x7A, 0x80, 0x09, 0x28, 0x90, 0x0B, 0xAF, 0x1C, 0x72, 0xCD,\n    0x93, 0x7C, 0xDA, 0xC7, 0xE0, 0x85, 0x72, 0x3F, 0x0A, 0xAA, 0x1E, 0xE7, 0xBF, 0xEA, 0x84, 0xE1,\n    0xF9, 0xB8, 0x2B, 0x41, 0x4E, 0x30, 0x23, 0x99, 0x47, 0xE4, 0x6C, 0x45, 0x86, 0x51, 0xB2, 0xB1,\n    0x2A, 0x11, 0x1B, 0x3E, 0xD1, 0x5A, 0xC4, 0x6C, 0xEF, 0x37, 0xBC, 0xAE, 0x10, 0x0C, 0x28, 0xB0,\n    0x14, 0x6B, 0xB7, 0x34, 0x12, 0x21, 0x12, 0x5D, 0xFC, 0x19, 0x80, 0x72, 0x0B, 0xF3, 0x27, 0x8B,\n    0x3F, 0x14, 0x7B, 0xD5, 0x66, 0xF2, 0x0F, 0xEF, 0x2E, 0xC6, 0x87, 0x49, 0x61, 0xD1, 0xE6, 0xA5,\n    0x00, 0xF9, 0x1A, 0x11, 0xB2, 0x3B, 0xAC, 0x77, 0xBF, 0xFB, 0x6B, 0xB1, 0x9C, 0x25, 0x0D, 0x68,\n    0x2C, 0x2C, 0xA8, 0xE8, 0x67, 0xE7, 0xAF, 0x32, 0x03, 0x6C, 0xAB, 0xF2, 0x27, 0x55, 0xD6, 0xCA,\n    0x36, 0xC4, 0x2A, 0xD7, 0x74, 0x7F, 0xD5, 0xE5, 0x4E, 0x2F, 0x97, 0xA8, 0x21, 0x71, 0xE0, 0xD7,\n    0x96, 0xD3, 0x14, 0xA2, 0x3D, 0x6C, 0xC0, 0x86, 0x17, 0x80, 0xA0, 0x9B, 0x96, 0x3F, 0x42, 0x45,\n    0xCF, 0x34, 0x24, 0x9C, 0xEF, 0x8A, 0xA2, 0x33, 0xB7, 0xEB, 0xF7, 0xB1, 0xE1, 0xE9, 0x9F, 0xDB,\n    0xA9, 0x80, 0xD0, 0xA8, 0xBC, 0x6A, 0x49, 0x86, 0x69, 0xAF, 0x21, 0x82, 0x9B, 0xF1, 0x90, 0x12,\n    0x92, 0x7C, 0xCE, 0x56, 0xB7, 0x31, 0xFF, 0x68, 0xE1, 0x5D, 0x54, 0x17, 0xBC, 0x06, 0x46, 0x56,\n    0xE3, 0x4A, 0x36, 0xAB, 0x7D, 0xBC, 0xE8, 0x34, 0x32, 0x79, 0xEB, 0x96, 0xFC, 0xA5, 0x17, 0x72,\n    0x50, 0x63, 0xCB, 0x6C, 0x4D, 0x0D, 0xBD, 0xEC, 0x78, 0xC7, 0x73, 0x97, 0x7F, 0xA6, 0xF5, 0xCE,\n    0xFC, 0xC7, 0x28, 0x59, 0x62, 0xAF, 0xCC, 0x9F, 0xFB, 0x4F, 0x8D, 0xBE, 0xC6, 0xEF, 0xCF, 0x92,\n    0xDE, 0x56, 0x06, 0xF0, 0xB6, 0xEE, 0x7F, 0xFE, 0x90, 0x59, 0xFF, 0xF1, 0xB2, 0x7A, 0x67, 0xA9,\n    0x16, 0x0B, 0xB9, 0xDB, 0xF8, 0x5B, 0xAB, 0x6C, 0xD0, 0x4F, 0x6A, 0xB1, 0x42, 0x39, 0x2D, 0x71,\n    0x31, 0x30, 0x83, 0xC4, 0x3D, 0x5D, 0xB7, 0x6A, 0xE5, 0xE0, 0x1A, 0x07, 0xC8, 0xA1, 0xCC, 0x5C,\n    0x8B, 0x0E, 0xDA, 0xBA, 0xC5, 0x0E, 0x1D, 0x6D, 0x8C, 0x25, 0x56, 0xAA, 0xA2, 0xC3, 0x1C, 0xB1,\n    0xDE, 0x5E, 0xAA, 0xCA, 0x53, 0xF8, 0x78, 0x69, 0x51, 0x69, 0x03, 0xA4, 0x0F, 0xB7, 0xA7, 0xAA,\n    0xB6, 0x44, 0x59, 0x9F, 0xB8, 0x45, 0x48, 0x19, 0x5F, 0x29, 0x64, 0x66, 0xA7, 0x7B, 0x7F, 0x79,\n    0xF8, 0x9D, 0x15, 0x48, 0x34, 0x57, 0xA1, 0x25, 0x27, 0xCE, 0xBF, 0xD1, 0xC8, 0x5E, 0x96, 0xBF,\n    0xC9, 0xD2, 0xC7, 0x08, 0x75, 0xDB, 0x8D, 0x55, 0x26, 0x92, 0x2C, 0xB2, 0x87, 0xB1, 0x15, 0x37,\n    0x22, 0x9B, 0x61, 0xBC, 0xA8, 0xC7, 0x7E, 0xC3, 0x98, 0x89, 0xBC, 0x44, 0x6B, 0x13, 0x93, 0x30,\n    0xCD, 0x5B, 0x35, 0xB4, 0x9F, 0x5C, 0xB5, 0x2E, 0xB1, 0x23, 0x20, 0xA8, 0xF3, 0xA3, 0x5A, 0x01,\n    0x29, 0x24, 0x54, 0x20, 0xEF, 0x27, 0xCD, 0xF3, 0x56, 0xE0, 0x6B, 0x02, 0x23, 0x0A, 0xD9, 0x6A,\n    0xA6, 0x23, 0xE1, 0xC3, 0x96, 0xEE, 0x06, 0x11, 0x53, 0x9E, 0xD6, 0x80, 0xC1, 0x68, 0x15, 0xA4,\n    0x24, 0x8F, 0xBF, 0xB2, 0x49, 0xC1, 0x2E, 0xE2, 0x6B, 0xD2, 0x48, 0x45, 0x3C, 0xA6, 0xF8, 0x6C,\n    0xC0, 0x55, 0x51, 0xC4, 0xAC, 0x52, 0x8D, 0x44, 0xEF, 0xBC, 0x04, 0x05, 0x69, 0x5C, 0x87, 0x99,\n    0x0C, 0x27, 0xFB, 0x02, 0x6E, 0xD1, 0xF7, 0x5E, 0x07, 0x11, 0x26, 0x5A, 0x59, 0x5A, 0xF8, 0x54,\n    0x12, 0x88, 0x20, 0xBB, 0x38, 0x92, 0x49, 0xF0, 0xE5, 0x82, 0xA3, 0xF6, 0xEE, 0xBD, 0xD7, 0xCC,\n    0x58, 0xDC, 0x3B, 0x8A, 0x13, 0xE8, 0x5F, 0x58, 0x0C, 0x12, 0x64, 0x3C, 0xAF, 0x92, 0xC0, 0xC9,\n    0x11, 0xE9, 0xC1, 0xB8, 0xE7, 0xFA, 0x09, 0xAE, 0x61, 0xA3, 0x70, 0x4C, 0x07, 0x45, 0x7C, 0x61,\n    0x82, 0x1B, 0x64, 0x4C, 0x0F, 0x7D, 0xC2, 0xC5, 0xD9, 0x92, 0x00, 0x35, 0xCC, 0x34, 0x07, 0xBA,\n    0xDD, 0x52, 0xE3, 0x67, 0x76, 0xC6, 0x8B, 0xD5, 0x51, 0xE7, 0xB3, 0x57, 0x7D, 0xF6, 0xA3, 0x82,\n    0xEA, 0x7D, 0x88, 0x09, 0x67, 0x49, 0x2B, 0x37, 0x04, 0x1E, 0xBF, 0x83, 0x76, 0xBA, 0x7F, 0xB4,\n    0xC1, 0x8F, 0xCD, 0xD3, 0x04, 0xD2, 0x89, 0x5F, 0x0E, 0xA7, 0x43, 0x4F, 0x8A, 0x4A, 0x98, 0x48,\n    0x74, 0x83, 0x0B, 0x2E, 0x6E, 0xC4, 0xAF, 0x29, 0x38, 0xBA, 0xD1, 0x67, 0xEA, 0x96, 0x10, 0x35,\n    0x69, 0xFF, 0xD2, 0x43, 0x00, 0x2E, 0x9D, 0x60, 0x08, 0x04, 0xDF, 0xFB, 0xCD, 0x6C, 0x98, 0xCE,\n    0x73, 0x9A, 0xF4, 0x46, 0x23, 0x22, 0x58, 0x0C, 0x1F, 0xE1, 0x5A, 0x43, 0x76, 0x18, 0x81, 0xE3,\n    0xF4, 0xBE, 0x95, 0xBF, 0x61, 0x88, 0x16, 0xF4, 0x7B, 0x01, 0xEB, 0xD4, 0x85, 0xB9, 0xC2, 0x0C,\n    0x22, 0x02, 0x27, 0x8D, 0xB5, 0x7F, 0xC8, 0xA9, 0xAA, 0x8A, 0xF7, 0x91, 0x7A, 0x4A, 0x20, 0x37,\n    0xB7, 0xBE, 0x15, 0x6E, 0x48, 0x2C, 0x50, 0xE3, 0xAE, 0x2B, 0xAE, 0x1E, 0x5C, 0x59, 0x9A, 0x36,\n    0x46, 0x85, 0x04, 0xE8, 0x51, 0xED, 0x1F, 0xB0, 0x38, 0xE3, 0xC7, 0x5D, 0x9A, 0xD1, 0x07, 0x85,\n    0xED, 0xDC, 0x3C, 0x99, 0x35, 0x03, 0x57, 0x85, 0xE2, 0x83, 0xFB, 0x06, 0x81, 0x08, 0xDA, 0xF2,\n    0xFA, 0xF4, 0x9E, 0x5F, 0x2F, 0x82, 0xC2, 0xBA, 0xE3, 0x04, 0x42, 0x59, 0x4B, 0xBD, 0xEB, 0xFD,\n    0x8F, 0x5D, 0x34, 0x37, 0x86, 0x06, 0x6B, 0xCC, 0x8C, 0x48, 0x7C, 0x14, 0xE9, 0x48, 0xF5, 0x28,\n    0x51, 0xF3, 0x7E, 0xC9, 0xC8, 0x73, 0x88, 0x8B, 0x03, 0xAD, 0xEA, 0x37, 0x3F, 0x02, 0x95, 0xB8,\n    0x6A, 0x28, 0xFC, 0x42, 0xD9, 0xAD, 0xFC, 0x4C, 0xE8, 0xEA, 0xDC, 0x4B, 0xD3, 0x9C, 0x74, 0x09,\n    0x44, 0x74, 0x81, 0xB6, 0x36, 0x96, 0x07, 0xFB, 0x48, 0xF5, 0xBA, 0x21, 0xA5, 0xD4, 0xCA, 0x48,\n    0x1E, 0x63, 0xF4, 0x8C, 0x16, 0x4C, 0xDF, 0xC2, 0xAA, 0x11, 0x02, 0xCF, 0xE8, 0x28, 0xEF, 0xB9,\n    0x57, 0x70, 0x6C, 0x2C, 0x43, 0x18, 0x6D, 0xBD, 0x2D, 0xF4, 0x20, 0x54, 0x2A, 0xF3, 0xAE, 0x57,\n    0x46, 0xA4, 0x0E, 0xC8, 0x18, 0xB3, 0x37, 0x6E, 0xFF, 0x99, 0x6A, 0x26, 0xF8, 0x7E, 0xCF, 0x8B,\n    0xDB, 0x43, 0xF3, 0x10, 0x30, 0xA7, 0x27, 0x96, 0x07, 0x8F, 0x50, 0xE0, 0x45, 0x41, 0x16, 0xA6,\n    0xC1, 0x1B, 0xCB, 0x97, 0x00, 0x81, 0x9D, 0x3A, 0x1A, 0x1E, 0xA0, 0x11, 0xFA, 0xBC, 0x89, 0xF5,\n    0x07, 0x66, 0x93, 0x4E, 0xC4, 0x90, 0xF7, 0xA1, 0x65, 0x00, 0xDE, 0x39, 0x9A, 0xED, 0xCC, 0xEA,\n    0x70, 0x57, 0x83, 0x62, 0x68, 0xE0, 0x9C, 0x0A, 0xC5, 0x2F, 0x6E, 0x75, 0xB9, 0x93, 0x15, 0x62,\n    0xAC, 0x7C, 0x8B, 0x23, 0x32, 0xF4, 0xC9, 0x97, 0xBA, 0x7D, 0x7D, 0x9D, 0x19, 0x13, 0x4B, 0x6E,\n    0xEF, 0xDE, 0x2B, 0x9B, 0x30, 0x9B, 0x30, 0xA8, 0x22, 0xBC, 0x7B, 0x63, 0xC8, 0x08, 0x84, 0xA6,\n    0x66, 0xE0, 0x87, 0x0C, 0x4A, 0x1B, 0xC3, 0xE2, 0xE4, 0x3B, 0x45, 0x21, 0x45, 0x36, 0x05, 0x98,\n    0x41, 0xE1, 0x03, 0x82, 0x95, 0x69, 0x0C, 0x6D, 0x4A, 0x13, 0x94, 0x15, 0x66, 0x9C, 0x2F, 0xA5,\n    0x93, 0x3F, 0x59, 0xE0, 0x86, 0xED, 0x13, 0xD5, 0x9A, 0x0A, 0xEB, 0x0C, 0x58, 0xD1, 0xBB, 0x9C,\n    0xD9, 0x16, 0x3C, 0xC7, 0x47, 0x7A, 0x2B, 0x62, 0xC5, 0x29, 0x08, 0x03, 0xC6, 0xCE, 0x7B, 0xAB,\n    0x9B, 0x96, 0x69, 0x42, 0x9A, 0x27, 0x23, 0x0E, 0xAC, 0x69, 0xDA, 0x84, 0xD3, 0xCC, 0xFF, 0x55,\n    0x58, 0x30, 0x45, 0xFD, 0xBE, 0xA2, 0x25, 0xE1, 0x66, 0xF9, 0x70, 0xAE, 0x1E, 0xC3, 0x3E, 0xC6,\n    0xF8, 0xF2, 0x0D, 0xA6, 0x49, 0x1F, 0x73, 0x82, 0xBE, 0x74, 0x8C, 0x3B, 0xD7, 0xF1, 0xDA, 0x94,\n    0x41, 0x20, 0xD4, 0x45, 0xD8, 0xB4, 0x44, 0x97, 0x85, 0x12, 0xE9, 0xB4, 0x4A, 0xDF, 0xD4, 0xED,\n    0xA5, 0x7D, 0xCD, 0x15, 0x08, 0xD2, 0x7C, 0x46, 0xF4, 0x34, 0x0C, 0x0C, 0x56, 0x4A, 0xFA, 0xDB,\n    0x8B, 0xC2, 0xB3, 0x0F, 0xB4, 0xEB, 0x26, 0xB6, 0xA7, 0x0A, 0x0C, 0xB7, 0x19, 0x0A, 0x2C, 0x27,\n    0xC9, 0x1B, 0x83, 0x4B, 0x32, 0xAE, 0xBE, 0x11, 0xA3, 0xBC, 0x3D, 0x94, 0x2B, 0xC8, 0xCB, 0x5D,\n    0x1F, 0xA6, 0x7C, 0xB6, 0x4C, 0x5E, 0xCF, 0xA4, 0x51, 0x90, 0xDB, 0xE2, 0xBA, 0x4D, 0x14, 0x9D,\n    0x22, 0x1E, 0x82, 0x2E, 0x28, 0xB9, 0x94, 0x83, 0x46, 0x63, 0xD6, 0xEA, 0x14, 0x03, 0xDE, 0x74,\n    0x09, 0xD4, 0x21, 0x07, 0xFA, 0xEB, 0x36, 0xB5, 0x76, 0x7D, 0x98, 0xBC, 0x3A, 0x9E, 0xD4, 0xB3,\n    0x24, 0x35, 0x87, 0x0C, 0x70, 0x09, 0x7C, 0xE4, 0x70, 0x46, 0x6C, 0x8C, 0x19, 0xD0, 0x42, 0xE9,\n    0x24, 0x2F, 0xCA, 0x16, 0xAD, 0x21, 0xD1, 0x16, 0xDF, 0x01, 0xEC, 0x23, 0xCA, 0xE3, 0x81, 0xD2,\n    0x53, 0x20, 0x7E, 0xA1, 0x99, 0x8E, 0x88, 0x5D, 0x73, 0xF8, 0xD9, 0x0E, 0x37, 0xB4, 0xF3, 0xE9,\n    0x66, 0x7B, 0x2D, 0xA0, 0x5B, 0x4B, 0x28, 0xE5, 0xE3, 0x6C, 0xA2, 0x82, 0x6C, 0xA9, 0xE7, 0x1C,\n    0xD3, 0x33, 0x2C, 0xB4, 0x7D, 0x95, 0xEA, 0x9F, 0x20, 0xEF, 0x02, 0x38, 0x26, 0x3C, 0x5F, 0x39,\n    0xBB, 0xFA, 0x75, 0x10, 0xBE, 0x00, 0x1A, 0x4B, 0xE8, 0xBC, 0x1B, 0xCE, 0x02, 0x59, 0x97, 0x36,\n    0xD9, 0xE9, 0x03, 0x2B, 0x1A, 0x54, 0x35, 0x31, 0x9E, 0x59, 0xDE, 0x46, 0x56, 0x5D, 0xF6, 0xB5,\n    0x91, 0xBC, 0x52, 0xB6, 0xB5, 0x9A, 0xF6, 0x8B, 0x5B, 0xE4, 0x7D, 0x4F, 0xD6, 0x74, 0x2A, 0x7D,\n    0xC3, 0x85, 0x50, 0xF4, 0xCD, 0x3A, 0x81, 0x3C, 0x2C, 0xA5, 0xF5, 0xAF, 0xE2, 0xA9, 0x9F, 0x97,\n    0xE5, 0x7B, 0x67, 0x64, 0x46, 0xD4, 0x7C, 0x1A, 0x41, 0xD4, 0x2D, 0x7C, 0xE3, 0xD9, 0xFA, 0x2A,\n    0xDE, 0x83, 0x17, 0xEC, 0x78, 0x02, 0x7D, 0xAF, 0x4A, 0x06, 0x53, 0xE3, 0x44, 0x0B, 0x06, 0xEC,\n    0xD4, 0xA7, 0xA5, 0x87, 0x09, 0x23, 0x44, 0x76, 0x3D, 0xD4, 0xA5, 0xEF, 0x5C, 0x75, 0x3A, 0xF7,\n    0x99, 0xC8, 0x21, 0x6A, 0xFB, 0xBF, 0x0D, 0x08, 0xF0, 0xEE, 0xD6, 0x7E, 0xF8, 0x67, 0x02, 0x87,\n    0xCA, 0x94, 0x27, 0x4D, 0x0C, 0x5F, 0xA1, 0x94, 0xC9, 0x1F, 0xE1, 0x4B, 0x93, 0x2D, 0x40, 0xE0,\n    0x25, 0x5A, 0xDB, 0x28, 0xBE, 0x7F, 0xFD, 0x0D, 0x6D, 0x22, 0xF4, 0x31, 0xE5, 0x1C, 0x84, 0x71,\n    0x09, 0x5F, 0x1D, 0x78, 0xE9, 0x64, 0xD9, 0xB9, 0x82, 0x7D, 0xF5, 0x9B, 0x73, 0x4F, 0x74, 0x8B,\n    0xA1, 0xB3, 0xC2, 0x01, 0x30, 0x1E, 0x20, 0x72, 0xB9, 0xB8, 0x92, 0x1A, 0xFE, 0x34, 0xF8, 0x5F,\n    0x69, 0xEC, 0x09, 0x41, 0x50, 0x77, 0x44, 0xF9, 0x68, 0xE4, 0xEC, 0xC7, 0xB5, 0xA3, 0x45, 0x6B,\n    0x03, 0xC4, 0xE8, 0xA0, 0x53, 0xF2, 0x94, 0xB9, 0x49, 0xA0, 0x6D, 0x11, 0xBA, 0x1C, 0x89, 0x87,\n    0x08, 0x72, 0xC0, 0xE3, 0x7B, 0x0C, 0x8D, 0x18, 0xDD, 0xB0, 0x3B, 0x0E, 0xC2, 0x0E, 0xBB, 0x4B,\n    0x61, 0x22, 0x48, 0x64, 0x69, 0x54, 0xE8, 0x29, 0x94, 0x84, 0xE5, 0xD7, 0x1A, 0x5F, 0x4B, 0xBC,\n    0xAD, 0x35, 0x82, 0xF1, 0xFD, 0x40, 0x14, 0xAE, 0xD0, 0x28, 0x0E, 0xE9, 0xEE, 0x2E, 0x88, 0xFF,\n    0xD1, 0xC9, 0xC5, 0x36, 0x39, 0xFB, 0x9F, 0xC9, 0x85, 0x97, 0x2A, 0x58, 0x07, 0xD9, 0x6E, 0x6E,\n    0x83, 0x09, 0x6D, 0xC6, 0x92, 0x1C, 0xBF, 0x50, 0xE3, 0xCB, 0xAD, 0x50, 0x3C, 0xDB, 0xF9, 0xE3,\n    0x32, 0x51, 0x58, 0x20, 0xE6, 0xD8, 0xCA, 0x50, 0xF7, 0x50, 0x05, 0xAF, 0xB6, 0xF7, 0xAB, 0x3E,\n    0x48, 0xB7, 0xA4, 0xB1, 0x52, 0x32, 0x2A, 0xD6, 0xC2, 0x78, 0x62, 0x05, 0x34, 0x96, 0x61, 0xF1,\n    0x21, 0x14, 0x69, 0x6F, 0x10, 0x96, 0xDD, 0xE2, 0x1D, 0xEB, 0xE5, 0x4F, 0xA0, 0x67, 0xA8, 0x46,\n    0x52, 0xBD, 0x2F, 0xA5, 0x59, 0xF8, 0xCB, 0xB2, 0x51, 0x09, 0xD3, 0x13, 0x9C, 0x37, 0xD3, 0x9B,\n    0xD4, 0x5C, 0x8E, 0xF9, 0xF2, 0xE4, 0xBF, 0x69, 0xA2, 0xB2, 0x06, 0xC1, 0xF5, 0x65, 0xB9, 0x0A,\n    0xC6, 0x73, 0x77, 0xEF, 0x4E, 0x50, 0x2D, 0x2C, 0xEE, 0xFF, 0xE9, 0x61, 0x8A, 0x07, 0xC9, 0x64,\n    0x48, 0x27, 0x4B, 0xCE, 0xE1, 0x80, 0xCC, 0x14, 0x8F, 0x42, 0x92, 0x4D, 0x6F, 0x87, 0x48, 0x90,\n    0x29, 0xF4, 0x4E, 0x72, 0x2C, 0xCC, 0x1A, 0xDD, 0x96, 0xDA, 0xFE, 0xD7, 0xCB, 0xEE, 0x6F, 0xA4,\n    0xA0, 0xCB, 0xEE, 0x7F, 0xB3, 0x21, 0x54, 0xBA, 0x6F, 0xC9, 0x53, 0x66, 0x7B, 0x38, 0xEC, 0xF4,\n    0x5F, 0xA0, 0x99, 0x23, 0x5F, 0x79, 0xD7, 0x08, 0xCC, 0x74, 0xDA, 0x02, 0xA1, 0xFC, 0x01, 0xF0,\n    0xF6, 0xA9, 0x9C, 0xA5, 0x85, 0xC6, 0x7E, 0xF6, 0x0F, 0x53, 0x11, 0x91, 0x92, 0x6D, 0x60, 0xC7,\n    0x63, 0xD5, 0x1C, 0x84, 0x7E, 0x91, 0xDA, 0x97, 0x5B, 0xD8, 0x3D, 0xBF, 0x83, 0xC3, 0x42, 0xC1,\n    0xDB, 0xB6, 0xE3, 0xFB, 0x9F, 0x40, 0x36, 0x6E, 0xB9, 0x8F, 0x44, 0xB8, 0x73, 0x2C, 0x14, 0xBD,\n    0x6C, 0x5E, 0x71, 0x76, 0xD2, 0xB9, 0xA2, 0x0B, 0xEC, 0xD4, 0x97, 0x9A, 0x1F, 0xCF, 0x0C, 0x3D,\n    0x5F, 0x49, 0x24, 0x08, 0x3C, 0xEC, 0xCE, 0xA3, 0x16, 0xFC, 0x7B, 0xD9, 0x98, 0x73, 0xEF, 0x74,\n    0x76, 0x0E, 0x51, 0x94, 0xBC, 0x18, 0x71, 0xAB, 0x43, 0xA8, 0x27, 0xA1, 0x5D, 0x69, 0x23, 0xB5,\n    0x5C, 0xFB, 0xFB, 0xD1, 0xBE, 0x59, 0x9C, 0x35, 0x1B, 0x5D, 0x49, 0x58, 0xEB, 0x06, 0xFB, 0x0E,\n    0xFC, 0x3B, 0x4B, 0x47, 0xF9, 0x80, 0xD2, 0x50, 0x97, 0xA1, 0xFB, 0x2F, 0x0D, 0x65, 0x7A, 0x30,\n    0xA3, 0x33, 0x04, 0x44, 0x0B, 0x4A, 0x88, 0xEB, 0x59, 0x1A, 0xA5, 0x96, 0x8C, 0x09, 0x1E, 0x26,\n    0x6A, 0x89, 0x74, 0x0C, 0x97, 0xDE, 0x51, 0x1C, 0x49, 0x16, 0x99, 0xDE, 0x80, 0x95, 0xDA, 0x0B,\n    0xD6, 0x0B, 0x85, 0x83, 0x13, 0x70, 0xCC, 0x60, 0xE3, 0x24, 0xDA, 0xB1, 0xE9, 0x8E, 0x29, 0x04,\n    0x68, 0xE7, 0x85, 0x0F, 0x78, 0x9D, 0x69, 0x9A, 0x3A, 0xFC, 0x1B, 0x34, 0x65, 0x9D, 0x0D, 0x84,\n    0xF5, 0x21, 0x30, 0xF6, 0xDF, 0x4E, 0xC5, 0xEB, 0x8C, 0x9A, 0x5F, 0x00, 0xDE, 0x19, 0x2B, 0x1F,\n    0x7C, 0x86, 0x7D, 0x43, 0xA2, 0x43, 0xC5, 0xA9, 0xDD, 0x84, 0x18, 0x90, 0xAB, 0x4C, 0xD3, 0x0B,\n    0x01, 0xA6, 0xCC, 0x04, 0x24, 0xF0, 0x0C, 0x3A, 0x8B, 0x20, 0x36, 0x1C, 0xBF, 0x40, 0x5E, 0x1F,\n    0x70, 0x7D, 0x69, 0xAA, 0xF6, 0xA8, 0x7B, 0x0F, 0x55, 0x4C, 0x63, 0xB8, 0x28, 0x8B, 0x9F, 0xB1,\n    0xF9, 0x84, 0x20, 0x7C, 0xFD, 0x41, 0x94, 0xAA, 0x92, 0xE0, 0x4E, 0x66, 0x7B, 0x4D, 0xBF, 0x96,\n    0xA3, 0xE9, 0x9B, 0xEC, 0xD5, 0x75, 0x8B, 0x08, 0x8A, 0x1A, 0xFF, 0x0C, 0xF3, 0x9D, 0xFC, 0x92,\n    0x61, 0x19, 0x41, 0x5A, 0x52, 0x5E, 0xC2, 0x91, 0xFE, 0xD8, 0x8F, 0xF2, 0xD6, 0x0B, 0x73, 0x4B,\n    0x1F, 0x63, 0x30, 0xC5, 0x8E, 0x85, 0x8C, 0xE2, 0xEA, 0xE1, 0xDC, 0xBC, 0xDA, 0xF7, 0xA1, 0xBA,\n    0x3F, 0xCC, 0xD7, 0xAC, 0xF8, 0xAD, 0xB8, 0x53, 0x82, 0x3B, 0xD3, 0x69, 0xC1, 0xDD, 0xB7, 0xD5,\n    0x89, 0x89, 0x50, 0xF7, 0x73, 0x56, 0xA7, 0xC5, 0x05, 0xB5, 0xEE, 0xE6, 0x4A, 0x22, 0xF8, 0x33,\n    0xEB, 0xED, 0xF2, 0xDE, 0x73, 0x02, 0x95, 0x3C, 0x0E, 0x4E, 0x5B, 0x0B, 0xE7, 0x6C, 0xF7, 0xE1,\n    0xF8, 0x67, 0x8A, 0xDF, 0x41, 0x3F, 0xCC, 0x5E, 0x0C, 0xD6, 0x6E, 0x96, 0xBF, 0x95, 0x71, 0x4C,\n    0x79, 0x7C, 0x3B, 0x88, 0x46, 0x73, 0x96, 0xA2, 0xDA, 0x6C, 0x71, 0xEC, 0x54, 0x14, 0x79, 0x1E,\n    0x47, 0xF8, 0x94, 0x63, 0x28, 0x4A, 0xFB, 0xBB, 0x82, 0x66, 0x91, 0x99, 0x0E, 0xBE, 0xBB, 0x33,\n    0x4D, 0x55, 0xE2, 0x08, 0xCA, 0xE7, 0x52, 0x4A, 0xED, 0x64, 0xFF, 0xDD, 0xF7, 0xF9, 0xEA, 0x7D,\n    0xD0, 0xBD, 0xB9, 0xAC, 0x62, 0x3B, 0xBC, 0xC6, 0x47, 0xEF, 0xEC, 0xA0, 0x6D, 0x7D, 0x0F, 0xD8,\n    0xC6, 0x10, 0x90, 0x29, 0xCB, 0xF3, 0xA1, 0xC2, 0x2B, 0x1D, 0xDD, 0x43, 0x6A, 0x49, 0xCB, 0x1F,\n    0x8C, 0x29, 0xC4, 0x4A, 0xAB, 0xCB, 0xD3, 0x89, 0xF6, 0x24, 0x73, 0xA3, 0xA0, 0x5C, 0x9E, 0xE2,\n    0x93, 0x2C, 0x18, 0x6A, 0xA1, 0x07, 0x5A, 0x77, 0xAA, 0x26, 0x38, 0x2C, 0xF0, 0xA9, 0xFC, 0x6C,\n    0x94, 0xBE, 0xAF, 0x20, 0xCA, 0x8B, 0xB1, 0x7B, 0x9A, 0x3A, 0xBD, 0x0B, 0xF5, 0x03, 0x73, 0x6D,\n    0x6F, 0x15, 0xB1, 0x8F, 0x85, 0xDE, 0x24, 0x47, 0x94, 0x1B, 0x94, 0x25, 0xA5, 0x85, 0x31, 0x33,\n    0x75, 0xA9, 0x0E, 0x16, 0x90, 0x12, 0x91, 0x72, 0x0F, 0x1E, 0x47, 0x7B, 0x42, 0xB4, 0x99, 0x9E,\n    0xDA, 0xD8, 0xD9, 0xB4, 0x2C, 0xA4, 0x06, 0x05, 0x2F, 0x83, 0xF6, 0xE7, 0x6D, 0x7A, 0x9E, 0x40,\n    0xCE, 0x91, 0x37, 0x6C, 0x2A, 0x90, 0x87, 0x5D, 0x3E, 0xAA, 0xDB, 0x45, 0x55, 0xEC, 0x79, 0x03,\n    0x03, 0x22, 0x3B, 0x61, 0x73, 0xBD, 0x53, 0xF3, 0x5A, 0x9B, 0xD4, 0xB4, 0x0E, 0x2C, 0x68, 0x5F,\n    0x5D, 0x1B, 0xCC, 0xD6, 0x11, 0x7B, 0xA0, 0x4A, 0xB6, 0xD0, 0x56, 0xD0, 0x26, 0xC1, 0xFE, 0x3B,\n    0x05, 0x20, 0x05, 0xC0, 0xBA, 0xF4, 0xB7, 0x2B, 0x55, 0xE7, 0x69, 0x67, 0xB2, 0x7A, 0xB5, 0x59,\n    0x78, 0xB4, 0x3E, 0x80, 0x08, 0x20, 0xD8, 0x75, 0x28, 0xF1, 0x21, 0xFE, 0xA3, 0x86, 0xD1, 0x21,\n    0x76, 0x1F, 0xA6, 0x95, 0x60, 0xA7, 0x5E, 0xB5, 0x68, 0x25, 0xB7, 0x02, 0x56, 0xDA, 0xF8, 0x6D,\n    0xE3, 0x79, 0x31, 0x63, 0x76, 0xC4, 0x9B, 0x16, 0x08, 0xCA, 0xA8, 0xBA, 0xA0, 0x5A, 0x9A, 0x76,\n    0x3D, 0x09, 0x80, 0x54, 0x89, 0x50, 0xFC, 0x4F, 0x04, 0x52, 0x2C, 0xAB, 0x01, 0x3B, 0x52, 0xA7,\n    0x7E, 0x4F, 0x0C, 0x08, 0xE2, 0x18, 0x6F, 0xC6, 0xDF, 0x77, 0x09, 0xE4, 0x21, 0x5E, 0xD7, 0xE2,\n    0x4A, 0x15, 0x1C, 0xB5, 0xFD, 0x6F, 0x4D, 0xC6, 0xC8, 0x97, 0x26, 0x9F, 0x7C, 0x97, 0xE8, 0x05,\n    0x4C, 0x89, 0xC3, 0xA6, 0x89, 0x38, 0x11, 0xAB, 0xEC, 0x7E, 0xF4, 0x4C, 0xE1, 0x3A, 0x37, 0x24,\n    0x57, 0xD9, 0x93, 0xCE, 0x9E, 0xC8, 0x22, 0x78, 0xBB, 0xDB, 0x35, 0x99, 0xFB, 0x82, 0xF4, 0x56,\n    0x3B, 0x4B, 0x72, 0xE3, 0xF1, 0x48, 0xF3, 0xFE, 0x4B, 0x08, 0xAB, 0x33, 0xF7, 0x30, 0x57, 0xB1,\n    0x9E, 0xF0, 0xE1, 0xCD, 0x11, 0x7D, 0xD2, 0x1B, 0x33, 0xE8, 0x22, 0xF2, 0xA4, 0x90, 0xB7, 0xD1,\n    0xFA, 0xA9, 0xB3, 0x23, 0x0F, 0x0F, 0xF4, 0x56, 0x9C, 0x15, 0x31, 0x59, 0x2C, 0x6F, 0xE4, 0xD6,\n    0x3A, 0xB4, 0x06, 0xCF, 0x80, 0xDD, 0xAE, 0x6F, 0x9B, 0x54, 0x74, 0x31, 0x66, 0xF5, 0x1F, 0x41,\n    0x0B, 0x4B, 0x19, 0x11, 0xA7, 0x7B, 0x58, 0x29, 0x96, 0x83, 0x44, 0x54, 0x63, 0xAF, 0x09, 0x6B,\n    0xA4, 0xFE, 0x03, 0xCC, 0xA8, 0xCA, 0x4A, 0xDC, 0xD9, 0x95, 0x56, 0xEB, 0x2E, 0x79, 0x7C, 0xCE,\n    0xDC, 0x14, 0x26, 0xF5, 0x94, 0x9D, 0x9D, 0xD1, 0x95, 0x09, 0x8B, 0x2E, 0x21, 0xA0, 0x96, 0xC5,\n    0x4E, 0x09, 0xA0, 0x35, 0x92, 0xAA, 0x95, 0x3C, 0x30, 0xE7, 0xC7, 0x6A, 0x7B, 0xB1, 0x62, 0x01,\n    0x7D, 0x62, 0x78, 0x77, 0x62, 0xE6, 0x08, 0x63, 0x77, 0x5E, 0xE1, 0x0A, 0xFD, 0xB5, 0x08, 0xE1,\n    0xED, 0x79, 0x27, 0xD9, 0xB8, 0x1D, 0xB6, 0xBA, 0x3D, 0x6C, 0xA0, 0xB5, 0xA6, 0xE1, 0x92, 0x18,\n    0x15, 0xC9, 0x25, 0x25, 0xF6, 0x21, 0x7A, 0x4E, 0x2E, 0x18, 0x08, 0x8D, 0x54, 0x79, 0x35, 0xED,\n    0x76, 0x2F, 0x39, 0xB1, 0x38, 0x38, 0x9F, 0xB6, 0xF4, 0x2D, 0xBF, 0x55, 0x64, 0x3F, 0xEB, 0x49,\n    0x17, 0x5D, 0xEC, 0x07, 0xC1, 0x08, 0x4E, 0x75, 0xE7, 0xE8, 0xF7, 0xA3, 0xB5, 0x63, 0x01, 0x27,\n    0xCF, 0xF5, 0x39, 0xDD, 0x65, 0x38, 0x4C, 0xD4, 0xE3, 0xAA, 0xAD, 0x55, 0xD3, 0x3C, 0x6E, 0xC4,\n    0x99, 0x09, 0x3E, 0xD1, 0xA5, 0x0B, 0xEF, 0xF2, 0x08, 0xA1, 0xBE, 0xD8, 0xE0, 0x7C, 0x58, 0xB9,\n    0x9E, 0x2E, 0x95, 0x4A, 0xAA, 0x1D, 0xEE, 0xE3, 0x2F, 0x6A, 0xE2, 0x94, 0x70, 0xC4, 0x1C, 0x07,\n    0xCC, 0x76, 0xE0, 0x40, 0xEA, 0x6D, 0xB4, 0x83, 0xA0, 0x6A, 0x97, 0x76, 0x84, 0x11, 0x40, 0x9F,\n    0xCA, 0x18, 0x00, 0x6F, 0x7D, 0x07, 0xBE, 0xC9, 0xFC, 0x2D, 0xD7, 0xAF, 0x60, 0x76, 0xC9, 0xD8,\n    0x28, 0xC2, 0xC8, 0xA8, 0xD7, 0x60, 0x90, 0x64, 0x6C, 0xED, 0xEE, 0xFD, 0x2C, 0xD1, 0x3F, 0x35,\n    0xD4, 0xCB, 0xA0, 0x34, 0xAA, 0xB0, 0x3A, 0x91, 0x07, 0x1B, 0xD4, 0xB5, 0x33, 0xD2, 0xD3, 0x9D,\n    0x08, 0xCD, 0x45, 0x01, 0x83, 0x04, 0xB1, 0xE7, 0x0C, 0x1A, 0x57, 0x9F, 0xBB, 0xED, 0x37, 0x46,\n    0xB1, 0x16, 0x87, 0x3C, 0x20, 0xDE, 0x63, 0x10, 0xAF, 0x2D, 0x77, 0x71, 0x56, 0xEF, 0x7C, 0x14,\n    0xD0, 0xE3, 0x1E, 0xFB, 0x1F, 0x77, 0x18, 0x1E, 0xA8, 0xD3, 0x40, 0xA7, 0xD7, 0x1F, 0x36, 0x7D,\n    0x87, 0x1C, 0x42, 0xF6, 0x2F, 0x51, 0xAF, 0x69, 0x2C, 0xCF, 0x79, 0x11, 0xD1, 0x17, 0x47, 0xD3,\n    0x44, 0x86, 0x9D, 0x2B, 0x44, 0xA3, 0x74, 0x1C, 0x83, 0x75, 0xAB, 0xD1, 0xA5, 0xFE, 0x14, 0x0A,\n    0x41, 0x76, 0x89, 0x1B, 0x08, 0x4F, 0x29, 0x30, 0x82, 0xD1, 0xFE, 0xD6, 0x0B, 0x71, 0xCD, 0x2C,\n    0x8E, 0x31, 0x69, 0xAF, 0xD8, 0x67, 0xA6, 0x1A, 0x8E, 0x2A, 0xD4, 0xF1, 0x83, 0xC3, 0xEC, 0x08,\n    0x76, 0x27, 0xA3, 0xB5, 0xF6, 0x7B, 0xC2, 0x6F, 0xEA, 0xD0, 0x52, 0x6C, 0x6E, 0x2F, 0x18, 0xBB,\n    0x23, 0x10, 0x3E, 0x7F, 0x37, 0x90, 0x89, 0x7E, 0xF4, 0xBA, 0x47, 0x09, 0xCE, 0x80, 0x34, 0x5D,\n    0x20, 0x87, 0x1F, 0x76, 0x30, 0xBF, 0xC3, 0xFC, 0x3C, 0xB3, 0x88, 0x89, 0xC9, 0x3D, 0xA4, 0xF4,\n    0xCE, 0x7E, 0x93, 0xA6, 0x88, 0xFA, 0xAC, 0x32, 0x64, 0x19, 0x76, 0xE7, 0xE0, 0xAE, 0x4B, 0x4F,\n    0xC3, 0xAC, 0x82, 0xD9, 0xDB, 0x3D, 0xBE, 0x3E, 0x58, 0x4B, 0xBF, 0xD0, 0x17, 0x43, 0xEC, 0x17,\n    0xEA, 0xFA, 0xA9, 0x6F, 0x9A, 0x33, 0xC2, 0xB9, 0xDC, 0xFF, 0x80, 0x14, 0x9D, 0xD6, 0xA1, 0x41,\n    0x7F, 0xFE, 0x08, 0x57, 0x21, 0xD6, 0xEB, 0xED, 0xEF, 0xA2, 0xAD, 0x5D, 0x9E, 0xC5, 0x31, 0xC6,\n    0xBE, 0x73, 0xB9, 0x7D, 0x58, 0x12, 0x28, 0x35, 0x0A, 0xB7, 0x56, 0x9A, 0x23, 0x61, 0x0B, 0x3B,\n    0x8D, 0x20, 0x35, 0xC7, 0xBF, 0xB1, 0xCE, 0x33, 0x28, 0xEC, 0x2F, 0x71, 0x49, 0xE1, 0x90, 0x36,\n    0x53, 0x9D, 0x19, 0xB1, 0xBB, 0xFF, 0xF4, 0x50, 0x89, 0xE8, 0x69, 0x88, 0xAF, 0xB6, 0x58, 0x46,\n    0xDF, 0x73, 0xEC, 0x5B, 0x82, 0xA6, 0xDC, 0x18, 0x71, 0x81, 0xE3, 0x03, 0x25, 0x71, 0x0E, 0x0B,\n    0xB5, 0x63, 0x67, 0x1A, 0xD1, 0x13, 0x0A, 0xE5, 0xFF, 0x4B, 0x97, 0xEA, 0xBB, 0x75, 0xD7, 0x31,\n    0xCD, 0x4B, 0x06, 0xBD, 0x6E, 0xB1, 0xA1, 0xD9, 0x30, 0x52, 0x8F, 0xF4, 0x4C, 0x51, 0x16, 0x72,\n    0x73, 0x81, 0x48, 0x88, 0x3F, 0x9B, 0x80, 0x40, 0xDD, 0xE7, 0xA4, 0x98, 0xC3, 0xB6, 0x7A, 0xF9,\n    0x91, 0xA1, 0xB1, 0xBB, 0x1D, 0x16, 0x3D, 0x13, 0xF9, 0x7D, 0xD9, 0x31, 0xE6, 0x19, 0x83, 0xCF,\n    0xA6, 0x59, 0xC9, 0x8F, 0xF7, 0x1E, 0xA3, 0x9C, 0x2B, 0x65, 0x9D, 0x21, 0x5B, 0x7C, 0xA4, 0x4D,\n    0x07, 0x24, 0x99, 0xA2, 0x51, 0xDF, 0x4D, 0x5F, 0xB6, 0xB0, 0x17, 0xAA, 0xEF, 0x16, 0xAB, 0x45,\n    0xAA, 0xD2, 0xA0, 0xBC, 0x09, 0x1B, 0x9A, 0x3C, 0x27, 0x86, 0xE0, 0xAD, 0x9E, 0xE4, 0x4D, 0x73,\n    0x09, 0x88, 0xCC, 0x55, 0x2A, 0x8A, 0x33, 0x29, 0x84, 0xD1, 0x8D, 0xF6, 0xE6, 0xDF, 0x27, 0x70,\n    0xA0, 0xD6, 0x5B, 0x31, 0xEE, 0x7E, 0x7A, 0x31, 0x87, 0xF2, 0xCC, 0x4C, 0xBE, 0x63, 0xC1, 0x41,\n    0xC6, 0x39, 0xFA, 0x3B, 0x9A, 0x60, 0x05, 0x29, 0xDF, 0x91, 0x9E, 0x3B, 0x7B, 0xDB, 0x8F, 0x6E,\n    0xFB, 0x0F, 0xF1, 0x20, 0xC7, 0x08, 0x47, 0x2A, 0x14, 0xB4, 0x7C, 0x93, 0xEB, 0x63, 0xE3, 0x03,\n    0xC7, 0x4D, 0x9F, 0x7D, 0x29, 0x7F, 0xC3, 0x03, 0x44, 0x89, 0x22, 0x8D, 0x2D, 0xF1, 0x86, 0xCB,\n    0x28, 0xBE, 0x39, 0xAC, 0x16, 0xBB, 0x73, 0xB2, 0x44, 0xC6, 0xA5, 0x63, 0x06, 0xE2, 0xED, 0x76,\n    0x95, 0x73, 0x02, 0xCE, 0x6A, 0x7E, 0x55, 0x2D, 0x2A, 0x1D, 0x78, 0x30, 0x3B, 0x0A, 0xAB, 0x3A,\n    0xDB, 0x21, 0xD8, 0x6D, 0xA4, 0xBE, 0xAD, 0x07, 0xD1, 0x08, 0xAC, 0x26, 0xBC, 0x4F, 0x50, 0x31,\n    0xA2, 0xDA, 0x18, 0x75, 0xA2, 0xE9, 0x1D, 0x93, 0xB6, 0x34, 0x01, 0xA5, 0xE9, 0xBE, 0x94, 0x7B,\n    0x33, 0x61, 0x7C, 0x71, 0xE3, 0x72, 0x78, 0x45, 0x3D, 0x2A, 0x7A, 0x87, 0x5B, 0x8D, 0x4E, 0xF8,\n    0x79, 0x01, 0xF6, 0x49, 0x5B, 0x9B, 0xBD, 0xB8, 0xC8, 0xAE, 0xBD, 0xC2, 0x5D, 0x14, 0x8B, 0x51,\n    0x4F, 0x86, 0x56, 0xB2, 0xD8, 0xF5, 0x5C, 0x0F, 0x38, 0xDC, 0x30, 0x15, 0x2B, 0x6A, 0x15, 0x98,\n    0x08, 0x23, 0x5A, 0xEA, 0x1E, 0xCA, 0xC7, 0xAC, 0x74, 0x26, 0xD0, 0x7C, 0xC6, 0x75, 0x1A, 0x67,\n    0x1E, 0xD3, 0xD3, 0x26, 0x9F, 0x82, 0x2E, 0x90, 0x5D, 0x50, 0xD1, 0x4F, 0x2B, 0x79, 0x5C, 0xCE,\n    0x4A, 0x8F, 0x9F, 0xBB, 0x60, 0xD4, 0x21, 0x92, 0x63, 0x3E, 0xBC, 0x77, 0x57, 0x0E, 0xC0, 0x56,\n    0x62, 0x6F, 0x47, 0x75, 0x88, 0xF0, 0x87, 0xA3, 0xCC, 0x1F, 0x12, 0xCC, 0xA2, 0x0B, 0x74, 0x19,\n    0xEE, 0xD6, 0x2F, 0x5C, 0x34, 0x06, 0x50, 0x7D, 0xBB, 0xB6, 0x21, 0xDB, 0xB4, 0xB1, 0x8C, 0x88,\n    0x42, 0x8E, 0x3B, 0xBF, 0x89, 0x5F, 0x89, 0x77, 0x5A, 0x46, 0xE4, 0x02, 0xE4, 0x48, 0xBB, 0xA9,\n    0x3F, 0x09, 0xAA, 0x1F, 0x62, 0x98, 0xF8, 0xE6, 0xCD, 0x62, 0xCB, 0xF7, 0xD0, 0x1D, 0xA4, 0x7A,\n    0x18, 0x0A, 0x0D, 0x44, 0x6C, 0x14, 0xDB, 0x97, 0x94, 0xCA, 0x98, 0x7F, 0x60, 0x36, 0x1E, 0x13,\n    0x52, 0xE8, 0x7F, 0x18, 0xEE, 0x99, 0xFA, 0xCB, 0x23, 0x5D, 0xB1, 0x2B, 0xA1, 0xFE, 0xD6, 0xB0,\n    0x77, 0x13, 0xE4, 0x55, 0xCC, 0x56, 0xFA, 0x8E, 0x29, 0x25, 0xA9, 0xDF, 0x81, 0x58, 0xEE, 0xB6,\n    0x3B, 0xC2, 0x29, 0xB4, 0x1E, 0x72, 0xCA, 0x55, 0xD3, 0x7B, 0xA6, 0xDD, 0x48, 0x96, 0x3B, 0x76,\n    0x3A, 0x41, 0xF3, 0x2A, 0x94, 0x13, 0xF3, 0x51, 0xC3, 0x00, 0x09, 0x4F, 0x88, 0xBA, 0x24, 0xD1,\n    0x14, 0x12, 0x14, 0x2D, 0xC1, 0xAB, 0x3B, 0x21, 0x54, 0x8B, 0x4C, 0xDC, 0x17, 0x08, 0x1E, 0xE8,\n    0x83, 0x4A, 0x3E, 0x25, 0x0E, 0x7B, 0xBC, 0xD5, 0xC7, 0xCA, 0x13, 0x31, 0x1B, 0xD8, 0x8F, 0xE2,\n    0x4A, 0x23, 0x24, 0xA9, 0x69, 0xF4, 0x8E, 0x65, 0xB2, 0xEF, 0xA1, 0x83, 0xFF, 0xBF, 0x01, 0xE7,\n    0x8B, 0xFC, 0xD1, 0x92, 0x91, 0xCF, 0x3D, 0xB7, 0x49, 0x3B, 0xF5, 0x81, 0x54, 0xB1, 0xFF, 0xB6,\n    0xD9, 0x2C, 0x31, 0xA1, 0xC0, 0x8F, 0x56, 0x54, 0x52, 0x5B, 0x7D, 0x80, 0x61, 0x44, 0x44, 0x8C,\n    0xC4, 0xFA, 0x8E, 0x59, 0xDE, 0xA1, 0xC5, 0xFB, 0xF7, 0x40, 0xE7, 0xD6, 0x06, 0x55, 0xC3, 0x19,\n    0x73, 0x21, 0xFD, 0x86, 0x8C, 0x68, 0x1B, 0x37, 0x7A, 0xC9, 0xC4, 0x70, 0x07, 0x38, 0x15, 0x03,\n    0xA7, 0x2A, 0xBD, 0x37, 0x8A, 0xD0, 0x63, 0x13, 0x66, 0xEA, 0x9D, 0x65, 0x67, 0x87, 0x78, 0xE8,\n    0xD2, 0x7E, 0xDB, 0x90, 0xA2, 0xAC, 0x9F, 0xAC, 0x7A, 0x81, 0xF1, 0x5F, 0x4C, 0x6C, 0x53, 0x0C,\n    0xD5, 0x9E, 0x64, 0x1D, 0xD1, 0x85, 0x5D, 0x65, 0x54, 0x9C, 0xE5, 0x20, 0xF7, 0xE5, 0x9C, 0x03,\n    0x29, 0x71, 0x9A, 0xE4, 0xC7, 0xD1, 0x91, 0x07, 0x66, 0x60, 0x89, 0x37, 0xF9, 0x3F, 0x58, 0x7D,\n    0x07, 0x06, 0xCC, 0xEE, 0x05, 0x49, 0xEA, 0x50, 0xD7, 0x4A, 0x76, 0x63, 0x16, 0x66, 0xE3, 0x1D,\n    0xDC, 0xCA, 0x3B, 0x0B, 0x89, 0x4C, 0xF8, 0x04, 0xD2, 0x50, 0x62, 0x2C, 0x1B, 0x7E, 0x62, 0x8B,\n    0x7B, 0x55, 0x68, 0x3F, 0xAC, 0xD0, 0x5E, 0xB4, 0xF8, 0x25, 0xE5, 0xEA, 0x40, 0xA4, 0x06, 0x7B,\n    0xA3, 0xC6, 0x8B, 0xE1, 0x4A, 0x83, 0x4B, 0xCC, 0x9C, 0xDA, 0x7C, 0x9F, 0xF6, 0xE7, 0x7A, 0xC2,\n    0xDD, 0x9E, 0x2F, 0xB4, 0x3A, 0x07, 0xBA, 0x47, 0x83, 0x43, 0x79, 0xBE, 0x69, 0x19, 0x02, 0x48,\n    0x03, 0x22, 0x10, 0xAE, 0x99, 0x80, 0xEE, 0xB0, 0xDE, 0xBA, 0xC1, 0x51, 0x4B, 0xF4, 0x2E, 0x61,\n    0xB0, 0xF9, 0x1B, 0x88, 0x6D, 0x92, 0x8B, 0x36, 0x30, 0x92, 0x32, 0x0A, 0xE8, 0xA5, 0x79, 0xAC,\n    0x27, 0x18, 0xE9, 0x67, 0x4B, 0xBC, 0x12, 0xE5, 0xB3, 0x66, 0x19, 0xD8, 0xFC, 0x62, 0x55, 0xF0,\n    0x59, 0xFB, 0x58, 0x57, 0x15, 0xB9, 0x15, 0x89, 0x32, 0xAA, 0xA1, 0x0F, 0xC7, 0xD8, 0xFB, 0xD5,\n    0x6E, 0x94, 0xB8, 0xE3, 0xC7, 0x7B, 0x76, 0x25, 0x0D, 0xB1, 0xD7, 0x2D, 0x26, 0x5E, 0xCA, 0x88,\n    0xA3, 0x96, 0xD8, 0x1C, 0xBC, 0x31, 0x34, 0x6A, 0xBA, 0x99, 0x64, 0x51, 0xEF, 0x4C, 0xB4, 0x6A,\n    0x06, 0xEB, 0x4F, 0x98, 0x95, 0x56, 0x75, 0x6F, 0x74, 0x86, 0x22, 0x53, 0x9C, 0x0A, 0x1E, 0x4D,\n    0xF0, 0xB0, 0xD5, 0x1B, 0x85, 0x8F, 0xD6, 0x37, 0xE1, 0x25, 0x66, 0x5E, 0xE9, 0x89, 0x8F, 0x51,\n    0x51, 0x8D, 0x76, 0x99, 0xD7, 0xBC, 0x17, 0xEE, 0xF6, 0x6B, 0x3F, 0xCF, 0x56, 0x31, 0x50, 0x77,\n    0x84, 0x1E, 0xFB, 0x4D, 0x5A, 0x35, 0xBE, 0xE3, 0xAF, 0x88, 0xC3, 0xAC, 0x22, 0xDF, 0x56, 0x58,\n    0x34, 0x52, 0x8A, 0xCA, 0xE7, 0x9D, 0x76, 0xD4, 0xB8, 0x86, 0xFB, 0xD9, 0xBD, 0x59, 0xEC, 0x84,\n    0x29, 0x06, 0x0E, 0x65, 0x65, 0x18, 0x50, 0x57, 0xE5, 0xCC, 0xA2, 0xBB, 0x1A, 0x85, 0xF6, 0xFD,\n    0xBA, 0x40, 0xA8, 0x1E, 0x52, 0xAD, 0x36, 0x12, 0xC7, 0xF1, 0x9B, 0xEA, 0x50, 0xA0, 0xFA, 0x99,\n    0x54, 0xF5, 0xD0, 0xFA, 0xDA, 0xEC, 0x70, 0xC8, 0x21, 0xA0, 0xEA, 0xEF, 0xC0, 0x51, 0x26, 0x3A,\n    0x13, 0xD6, 0x4C, 0x95, 0xC5, 0x07, 0xA1, 0xA8, 0x3B, 0x63, 0x8A, 0x4E, 0xAE, 0xE8, 0xA4, 0x68,\n    0x8E, 0xA3, 0x13, 0xD9, 0x13, 0xDF, 0xA2, 0xB3, 0xEF, 0x9F, 0x4E, 0x0D, 0x00, 0xB2, 0xC2, 0x40,\n    0xBE, 0x0D, 0xD1, 0x59, 0x20, 0x1F, 0x27, 0x2D, 0x99, 0xEE, 0x1D, 0x05, 0xD7, 0x7D, 0x2A, 0xA3,\n    0x86, 0x44, 0x54, 0x28, 0x8A, 0x31, 0x1C, 0x66, 0xFB, 0x9F, 0x68, 0xE8, 0xCA, 0xEB, 0x74, 0x9A,\n    0xAC, 0x77, 0x2F, 0xF4, 0xCF, 0x9D, 0x48, 0xA9, 0x8F, 0xB2, 0x9F, 0x74, 0x9F, 0x75, 0xE3, 0x88,\n    0x42, 0xB1, 0x5F, 0x7C, 0xEE, 0xED, 0x7E, 0x5A, 0xB0, 0x62, 0xCD, 0x2F, 0x95, 0x68, 0x2F, 0xF2,\n    0x58, 0x29, 0x8A, 0x22, 0x31, 0xC8, 0x82, 0x75, 0x51, 0x9B, 0xF7, 0xE3, 0x59, 0x52, 0xD9, 0x5B,\n    0xDE, 0x49, 0x54, 0x22, 0xD1, 0xF2, 0xF6, 0xB0, 0x0B, 0xB8, 0x4E, 0x08, 0x43, 0xF9, 0xEA, 0x98,\n    0xB4, 0xE3, 0x10, 0xB7, 0x8B, 0x79, 0x2C, 0x86, 0xAC, 0x75, 0x80, 0x6A, 0xC2, 0x18, 0x43, 0x06,\n    0x5E, 0xB9, 0x80, 0xA9, 0x87, 0x02, 0x9A, 0xF5, 0x57, 0x73, 0xA2, 0x68, 0x49, 0x4E, 0xEF, 0x2D,\n    0x48, 0x7F, 0x0B, 0x0C, 0x91, 0x35, 0x8A, 0x20, 0x7F, 0xB2, 0xD8, 0x7A, 0x88, 0x70, 0xC3, 0xA7,\n    0x37, 0xC4, 0x68, 0x21, 0x3E, 0x55, 0x91, 0x88, 0x07, 0x2C, 0x0F, 0xC6, 0xB3, 0x49, 0x7F, 0x85,\n    0xFB, 0xFF, 0x2D, 0x7E, 0x78, 0x13, 0xB7, 0xD5, 0x69, 0x21, 0xB7, 0x7C, 0xAF, 0x20, 0x14, 0xFD,\n    0xD9, 0x9C, 0xA8, 0xB2, 0x2F, 0xFE, 0x28, 0x8B, 0xF3, 0x66, 0xF0, 0xA5, 0xED, 0x8E, 0x1B, 0x1C,\n    0xF8, 0x24, 0x67, 0xB7, 0xE6, 0x06, 0x33, 0xC6, 0x60, 0x28, 0x6A, 0xE6, 0xB8, 0xA1, 0xCF, 0x9B,\n    0x15, 0x41, 0xA4, 0x7A, 0x7F, 0xAD, 0xF4, 0x8A, 0x1F, 0xE1, 0x77, 0x07, 0x51, 0x66, 0x8C, 0x6B,\n    0x35, 0x81, 0x60, 0x66, 0x8D, 0x58, 0xA1, 0xDF, 0xAA, 0x0C, 0x3B, 0x9A, 0x70, 0x0F, 0x1F, 0x06,\n    0x67, 0xC2, 0x0C, 0x6E, 0xD1, 0xFC, 0x93, 0x5C, 0xC7, 0x1F, 0x19, 0x59, 0x70, 0x6C, 0x5C, 0xC8,\n    0xFA, 0x9C, 0xFB, 0xB2, 0x46, 0x98, 0x5F, 0x1F, 0x80, 0x7B, 0x8D, 0x16, 0x2D, 0x2A, 0x03, 0xF6,\n    0x27, 0xCB, 0x11, 0xAE, 0x9D, 0xE5, 0x36, 0xDD, 0x20, 0x52, 0x53, 0xD7, 0x66, 0x22, 0x4F, 0x51,\n    0xE1, 0x2B, 0x7E, 0xF1, 0x9A, 0xAC, 0xBC, 0x8A, 0x6D, 0x78, 0x60, 0x62, 0x20, 0xB3, 0xA2, 0x1E,\n    0xA5, 0x68, 0x1A, 0x29, 0x45, 0x25, 0x7E, 0xF8, 0x50, 0x62, 0xED, 0x4E, 0x06, 0x44, 0x2A, 0x79,\n    0xF4, 0x52, 0xD0, 0x4F, 0x2C, 0x2F, 0xC6, 0xFF, 0x74, 0xE2, 0x5B, 0x13, 0x4C, 0x99, 0xB5, 0x7D,\n    0x0D, 0x01, 0x66, 0x77, 0x3C, 0x74, 0x38, 0x11, 0xFE, 0x1F, 0x31, 0xAA, 0xF4, 0xAF, 0x42, 0x7D,\n    0xC7, 0x62, 0xA1, 0xA2, 0xBB, 0xFE, 0xE9, 0x89, 0x8F, 0x3D, 0x0B, 0xE4, 0xA0, 0x5B, 0xA1, 0x18,\n    0x87, 0x36, 0xA0, 0x75, 0x06, 0xA8, 0x83, 0x00, 0xF3, 0x5B, 0x83, 0x3E, 0x42, 0xFA, 0x09, 0x4C,\n    0x35, 0x27, 0xA7, 0xB0, 0x00, 0xDA, 0x8C, 0x8E, 0x1A, 0x51, 0x9B, 0x5A, 0x8F, 0x05, 0x9A, 0xBD,\n    0xCB, 0x10, 0x12, 0x4D, 0x17, 0xE5, 0x78, 0xDF, 0xE7, 0x49, 0x5D, 0xB0, 0x78, 0x5F, 0x44, 0xE1,\n    0xDB, 0xE9, 0x84, 0xD9, 0x90, 0xAD, 0xBE, 0x86, 0x95, 0x81, 0xC1, 0xCD, 0x1B, 0xD4, 0xCE, 0x6D,\n    0x5E, 0xB3, 0x52, 0xB1, 0x67, 0x5E, 0xF2, 0xE4, 0xC5, 0xCB, 0x5C, 0xC6, 0x57, 0xBE, 0x1C, 0x0E,\n    0xDE, 0x7B, 0xD3, 0xB3, 0x01, 0xDC, 0x1F, 0x11, 0x12, 0xFC, 0x62, 0x9B, 0xFD, 0xF8, 0x8C, 0xDC,\n    0xE4, 0x35, 0x22, 0x61, 0x0E, 0xA0, 0x80, 0xF9, 0x48, 0xFC, 0x1C, 0x36, 0x2A, 0x02, 0x4A, 0xDC,\n    0x55, 0xE2, 0x35, 0xC8, 0xB4, 0x2E, 0xED, 0x43, 0x11, 0x31, 0x6C, 0xFB, 0x77, 0x68, 0x5E, 0xC6,\n    0x72, 0x37, 0x08, 0x5A, 0xC4, 0x98, 0x23, 0x9E, 0x0A, 0xE3, 0x82, 0x1B, 0xCA, 0xDE, 0x3F, 0xBE,\n    0xF0, 0x74, 0x6C, 0x9E, 0x16, 0x9B, 0x41, 0xC9, 0x79, 0xB9, 0x82, 0x9D, 0x66, 0x60, 0x09, 0xBD,\n    0x46, 0x2F, 0xDC, 0xF8, 0xC9, 0xB8, 0x0B, 0xB6, 0xEB, 0x30, 0xD1, 0xAD, 0x93, 0xB4, 0xE3, 0xD1,\n    0xE6, 0x35, 0xE1, 0x6B, 0xC7, 0x49, 0x47, 0xAE, 0xF1, 0x7A, 0x7A, 0x2E, 0xAE, 0xF8, 0xEC, 0x5D,\n    0x62, 0x67, 0xFD, 0x9D, 0x18, 0x74, 0xBA, 0xA6, 0xA8, 0xA8, 0x6E, 0xD8, 0xBF, 0x24, 0xCA, 0x74,\n    0x51, 0xE1, 0x6A, 0x8B, 0xAC, 0x96, 0x43, 0xC5, 0x75, 0x60, 0xAE, 0xA9, 0xCC, 0x89, 0x06, 0xA9,\n    0x6C, 0xEA, 0x47, 0x53, 0x60, 0x21, 0x7A, 0x38, 0xD4, 0xE4, 0x8A, 0xE6, 0x86, 0xAB, 0x36, 0x39,\n    0x2F, 0xEA, 0x08, 0xC1, 0x32, 0xDA, 0xA2, 0xC4, 0xD5, 0xB2, 0xC0, 0x12, 0x37, 0x9E, 0xDC, 0xBA,\n    0xC4, 0xF6, 0x8D, 0xDF, 0xA1, 0x9A, 0x3B, 0x70, 0xE9, 0x9F, 0x4E, 0xD1, 0xE1, 0x27, 0x52, 0x27,\n    0x69, 0x57, 0xFF, 0x63, 0xF6, 0x68, 0xF5, 0xF1, 0x42, 0x31, 0xE5, 0x05, 0xD2, 0xB7, 0xB5, 0x21,\n    0xB9, 0xCE, 0x5D, 0xD4, 0xBB, 0xFE, 0xC5, 0x09, 0x8E, 0x98, 0xAA, 0xE7, 0x9D, 0xE4, 0x92, 0x42,\n    0x7C, 0x2F, 0xC2, 0xC8, 0x05, 0xE0, 0xF7, 0xC5, 0xD5, 0xFA, 0xC7, 0x9E, 0x75, 0x32, 0x7A, 0x7C,\n    0x18, 0x08, 0xB8, 0x90, 0xDE, 0x09, 0xF1, 0x15, 0xA5, 0x6F, 0xFC, 0xE2, 0xAD, 0x97, 0x9A, 0x63,\n    0x55, 0xDB, 0x2E, 0x0A, 0xFC, 0x2C, 0x3B, 0xD0, 0x47, 0xC4, 0xF1, 0x06, 0x32, 0xF0, 0x5D, 0xC9,\n    0xC9, 0x87, 0x13, 0xC0, 0x67, 0xC4, 0x8B, 0x76, 0x80, 0x62, 0x60, 0xC9, 0x3B, 0x0C, 0x81, 0x51,\n    0x00, 0xFD, 0xF6, 0x9B, 0xE4, 0xF9, 0xC1, 0x03, 0xBB, 0x0F, 0x5D, 0xE3, 0xAC, 0xE6, 0x1F, 0x49,\n    0xB5, 0x3C, 0x3E, 0x60, 0xC7, 0xC5, 0xD3, 0xB8, 0xAF, 0x07, 0xDF, 0x60, 0x4B, 0x19, 0xB5, 0x90,\n    0x33, 0x41, 0x61, 0x75, 0xDB, 0x50, 0xD4, 0xB6, 0x63, 0xFA, 0xF9, 0x83, 0x06, 0xBC, 0x4E, 0xF2,\n    0x53, 0xF0, 0xDC, 0xB8, 0xD5, 0x9B, 0x63, 0xEE, 0xF3, 0x92, 0x68, 0xBB, 0xCB, 0xC3, 0x08, 0x7E,\n    0x12, 0x4A, 0x8A, 0x48, 0xF9, 0xED, 0xA7, 0x6A, 0xCE, 0xDE, 0x0D, 0x7A, 0xED, 0x2E, 0xA4, 0x75,\n    0x6C, 0x94, 0xB3, 0x0A, 0xF1, 0x3E, 0xA4, 0xE6, 0x8F, 0x34, 0x13, 0x0E, 0xC7, 0xCE, 0x6B, 0x82,\n    0x5D, 0xD3, 0xD2, 0x79, 0x7B, 0x6F, 0xB5, 0x00, 0x8B, 0xD6, 0x47, 0x95, 0x98, 0xDD, 0x56, 0xBC,\n    0x8C, 0x40, 0x3B, 0x5A, 0x65, 0x88, 0x9F, 0xF5, 0x6F, 0x96, 0x32, 0x40, 0x31, 0xAC, 0x3F, 0x18,\n    0x22, 0xE2, 0xDB, 0xD1, 0xF7, 0xAD, 0x48, 0x20, 0x31, 0x8D, 0x3F, 0xD0, 0xC9, 0x88, 0x7F, 0x94,\n    0x34, 0x69, 0xBC, 0xEE, 0xB2, 0x5B, 0x42, 0x82, 0x31, 0xBC, 0x83, 0xBD, 0x2C, 0x5A, 0x57, 0x74,\n    0x94, 0x29, 0xC4, 0xD0, 0x18, 0x8B, 0x2C, 0xAA, 0x09, 0x14, 0x99, 0x33, 0xD0, 0xDA, 0xD8, 0xCD,\n    0xED, 0x75, 0xBD, 0x69, 0xAA, 0x34, 0xD8, 0x4B, 0x3D, 0xC2, 0xC0, 0x69, 0x7F, 0x2F, 0x0B, 0xDE,\n    0x23, 0xEE, 0xB1, 0x7C, 0xD8, 0x5A, 0x7C, 0x0C, 0x45, 0x89, 0x08, 0x21, 0xE4, 0x23, 0x99, 0x75,\n    0xFC, 0x0C, 0xF1, 0x59, 0x19, 0x07, 0xA9, 0xA9, 0x5E, 0x48, 0xEB, 0xCD, 0x10, 0x61, 0xC2, 0xEB,\n    0x60, 0x74, 0x34, 0x80, 0xC2, 0xAA, 0xEF, 0x35, 0x55, 0x19, 0x8A, 0x95, 0xE4, 0x4A, 0x88, 0x9E,\n    0x70, 0x73, 0x17, 0xA5, 0x75, 0xB6, 0xBC, 0x5E, 0x5E, 0xAC, 0x88, 0xA8, 0x4E, 0x54, 0x71, 0x4F,\n    0xB8, 0x84, 0xC2, 0xA3, 0xB5, 0x9D, 0x6C, 0xA2, 0x9B, 0x6C, 0x6F, 0xA6, 0xD8, 0xE6, 0x83, 0x5D,\n    0xC3, 0x01, 0x2F, 0xB5, 0xE0, 0xFF, 0x62, 0x52, 0xD4, 0x71, 0x8D, 0x2D, 0x72, 0x57, 0xF9, 0x90,\n    0xA7, 0x76, 0x3D, 0x47, 0x76, 0xDE, 0x7E, 0x1B, 0xFB, 0xA4, 0x44, 0x7A, 0xE1, 0xBC, 0xB9, 0x72,\n    0x3C, 0x42, 0xC6, 0x26, 0x0F, 0x70, 0xF1, 0xA6, 0x58, 0x91, 0xB1, 0xE7, 0xA1, 0x70, 0x13, 0x75,\n    0xFE, 0x2C, 0xC2, 0x11, 0x48, 0x19, 0x72, 0xDF, 0xD2, 0x1E, 0x5A, 0x35, 0xC9, 0x2B, 0xE6, 0x8E,\n    0xC6, 0x10, 0x9E, 0x6F, 0x67, 0xCF, 0x40, 0xB8, 0x7D, 0x60, 0x8A, 0xD9, 0x09, 0x59, 0xFD, 0x04,\n    0x51, 0xEB, 0xE7, 0x18, 0x8A, 0x77, 0x2C, 0x94, 0xA3, 0xA2, 0x82, 0xF2, 0x50, 0xA6, 0xD9, 0x9C,\n    0x55, 0x65, 0x94, 0xE9, 0x67, 0xC4, 0xE1, 0x34, 0x04, 0x22, 0x3F, 0x50, 0xAB, 0x1F, 0x0B, 0x94,\n    0xCC, 0x51, 0x35, 0x28, 0xF9, 0x88, 0xA0, 0xA0, 0xA3, 0xF1, 0x97, 0x00, 0xC2, 0x9C, 0x35, 0x01,\n    0xC1, 0x1B, 0x01, 0x49, 0x44, 0x4C, 0x06, 0xC9, 0x35, 0xA2, 0xEA, 0x93, 0x26, 0xF0, 0xCA, 0x07,\n    0x7E, 0x1E, 0xBB, 0xCB, 0x03, 0x27, 0x35, 0x2D, 0xF1, 0xE0, 0x15, 0x1D, 0xBE, 0xCE, 0x89, 0x3A,\n    0x65, 0xDA, 0x5B, 0xB8, 0x3C, 0xF7, 0xF1, 0x3C, 0xDC, 0xFA, 0xAA, 0xD0, 0x43, 0x72, 0x73, 0x94,\n    0x72, 0xD2, 0x10, 0x82, 0x32, 0x10, 0xB6, 0x05, 0x25, 0x16, 0x25, 0xD2, 0x10, 0x73, 0xFD, 0x97,\n    0x7B, 0x7D, 0x31, 0x25, 0x89, 0x26, 0x83, 0xF8, 0x78, 0x1B, 0x32, 0xFF, 0x35, 0x19, 0x91, 0x68,\n    0x3F, 0x1F, 0x78, 0x38, 0x83, 0xA0, 0x49, 0x63, 0x4F, 0x70, 0x04, 0xAD, 0x57, 0xBC, 0x9D, 0x6F,\n    0xBE, 0xDA, 0x56, 0xD1, 0xFF, 0xC2, 0x25, 0xA1, 0xF5, 0x39, 0xB3, 0xA8, 0x69, 0x0A, 0xD2, 0xB1,\n    0xA0, 0x4F, 0x16, 0xB3, 0x15, 0xF4, 0xDD, 0x59, 0x8C, 0xD3, 0x56, 0xDF, 0x11, 0x50, 0x33, 0x6D,\n    0x15, 0xB9, 0xCC, 0x89, 0xC9, 0x81, 0xC2, 0x7A, 0xCD, 0x1F, 0x04, 0x17, 0xDB, 0x2B, 0x80, 0xFA,\n    0xC8, 0x00, 0x94, 0xB1, 0x41, 0x42, 0xA8, 0x0F, 0x6D, 0x72, 0xCB, 0xA9, 0xBA, 0xBC, 0x19, 0x5E,\n    0x42, 0x70, 0x94, 0x1B, 0xA4, 0x16, 0x86, 0x04, 0xF7, 0x06, 0x6E, 0xC2, 0x4A, 0xBE, 0xD5, 0x27,\n    0x2A, 0x61, 0x1F, 0x56, 0x34, 0x31, 0x8D, 0x59, 0x57, 0x2B, 0x86, 0x01, 0xC3, 0x94, 0x62, 0x8A,\n    0x9C, 0x18, 0xB5, 0xDD, 0x52, 0xBC, 0x85, 0xB5, 0x09, 0x25, 0xBC, 0x36, 0x05, 0x3F, 0xE4, 0xA8,\n    0xC9, 0x4A, 0xA1, 0x7C, 0xEB, 0xC1, 0x12, 0x64, 0x05, 0xD4, 0x6A, 0x2D, 0x41, 0xBC, 0xC3, 0xF5,\n    0x57, 0x00, 0x4A, 0xB0, 0xFF, 0xD3, 0xD2, 0x51, 0x76, 0x71, 0x0E, 0xC4, 0x78, 0x01, 0xD8, 0xC1,\n    0xCA, 0xA4, 0x1B, 0xBB, 0xB5, 0x99, 0x50, 0xC7, 0xB9, 0xCD, 0x74, 0xAB, 0x09, 0x89, 0x07, 0x54,\n    0x3A, 0xEA, 0x76, 0xA5, 0xA7, 0xE9, 0x96, 0x3D, 0x8A, 0xFE, 0x24, 0x46, 0x7A, 0x4F, 0x57, 0x8B,\n    0x6D, 0x5B, 0xB2, 0x12, 0xCA, 0x09, 0x7B, 0x45, 0x4D, 0xC1, 0x03, 0x7A, 0x27, 0xFB, 0x2C, 0xE2,\n    0x95, 0xC6, 0x17, 0x46, 0x7B, 0x48, 0xFB, 0x8F, 0x78, 0x5B, 0xC8, 0x3E, 0x54, 0x51, 0x99, 0x71,\n    0xE3, 0xC7, 0x92, 0xED, 0x99, 0xB4, 0x8A, 0x98, 0x86, 0xA8, 0x91, 0x1D, 0x36, 0xB6, 0xB2, 0xC7,\n    0x9C, 0xD6, 0x68, 0x4D, 0x45, 0x9B, 0x4D, 0x37, 0xB5, 0xA0, 0xCE, 0x30, 0x00, 0x13, 0x5A, 0x49,\n    0xE4, 0x52, 0x45, 0x7D, 0x30, 0xEA, 0x74, 0xBE, 0xEE, 0x41, 0x43, 0xBC, 0xB5, 0xC9, 0x0C, 0x40,\n    0x7F, 0x75, 0xC6, 0x57, 0x56, 0x9A, 0x90, 0xF6, 0x56, 0x35, 0x83, 0x99, 0x80, 0x08, 0x69, 0x08,\n    0xB2, 0x59, 0x9F, 0x79, 0x51, 0x5D, 0x9A, 0xE1, 0xCA, 0x16, 0x17, 0x28, 0xFE, 0x2B, 0xD1, 0x9F,\n    0x1B, 0x25, 0x62, 0xC0, 0x5A, 0xF6, 0x26, 0x11, 0x6E, 0xD7, 0xE1, 0xBA, 0x5C, 0xB8, 0x04, 0x7A,\n    0x55, 0xD3, 0x16, 0x59, 0x5C, 0x37, 0x26, 0xD0, 0xB6, 0x09, 0xED, 0x57, 0x88, 0x56, 0x21, 0x5C,\n    0x91, 0xB6, 0xEB, 0xE4, 0xC2, 0x70, 0x8D, 0x2F, 0x5A, 0x9F, 0x07, 0x5B, 0x57, 0x38, 0x9E, 0x3A,\n    0x49, 0xDF, 0x67, 0x18, 0xA5, 0x50, 0x90, 0xDC, 0xBD, 0xA1, 0xA6, 0xE5, 0x33, 0x25, 0xD7, 0xA0,\n    0x25, 0x71, 0x63, 0xD3, 0x8B, 0x89, 0xE2, 0xC0, 0xC5, 0xC8, 0x51, 0xF1, 0x9B, 0x23, 0xD7, 0x35,\n    0xAC, 0x04, 0xD6, 0x8B, 0x5A, 0xDF, 0x9A, 0x9D, 0x98, 0x5E, 0x5B, 0xD0, 0x2B, 0x28, 0xDF, 0x89,\n    0x1B, 0x85, 0xC5, 0xB2, 0xDD, 0x43, 0xEF, 0x14, 0x99, 0x74, 0x8B, 0xAB, 0x49, 0x45, 0xA7, 0x57,\n    0xBF, 0xCD, 0x7E, 0x80, 0xDF, 0x0C, 0x1B, 0x05, 0xB2, 0x1E, 0xD0, 0xFD, 0x72, 0x3E, 0x25, 0xD2,\n    0xE1, 0x0B, 0x1C, 0x17, 0x6C, 0x5B, 0x61, 0xC0, 0x84, 0xCD, 0xFA, 0xB6, 0x07, 0x0A, 0xBE, 0x2B,\n    0xF7, 0x3E, 0xEA, 0x2B, 0x0B, 0x52, 0x33, 0x0A, 0x37, 0xC3, 0x48, 0x0A, 0x93, 0x9C, 0xF7, 0x52,\n    0x45, 0x9B, 0xE5, 0x04, 0xED, 0x3B, 0x5A, 0xFF, 0x8E, 0x4A, 0xFE, 0xD5, 0x76, 0x04, 0xED, 0xA2,\n    0xAE, 0x36, 0x6A, 0xCC, 0x62, 0x7F, 0xB2, 0xBE, 0x3A, 0x30, 0x02, 0x59, 0xF3, 0x2F, 0xDF, 0x94,\n    0x0D, 0x03, 0x22, 0xB6, 0x65, 0xDF, 0x26, 0x8A, 0xCE, 0x9F, 0x32, 0x4B, 0x8D, 0x4E, 0x3B, 0x37,\n    0x24, 0x00, 0x0F, 0xB7, 0xF4, 0x4B, 0x2F, 0x0B, 0xF9, 0x94, 0x14, 0x41, 0x94, 0xD0, 0x66, 0x80,\n    0x66, 0x9F, 0x04, 0x74, 0xB8, 0x90, 0x35, 0xEE, 0xCC, 0x4B, 0xA7, 0xD4, 0x42, 0x7D, 0xD6, 0x23,\n    0x3C, 0x2A, 0x8A, 0xB6, 0xAC, 0x19, 0x92, 0x37, 0xD9, 0x46, 0xDF, 0xE1, 0x75, 0x2D, 0x05, 0x02,\n    0xB1, 0xCA, 0x34, 0x34, 0x1B, 0xB4, 0x67, 0x1F, 0x56, 0xBD, 0x55, 0xCD, 0xEC, 0x9E, 0x3D, 0x4E,\n    0x83, 0x90, 0x5D, 0x66, 0xBA, 0xA6, 0x76, 0x7E, 0x2E, 0xAA, 0x92, 0xD2, 0x80, 0xC5, 0x25, 0x0D,\n    0x91, 0xF5, 0x9B, 0x54, 0x6F, 0x05, 0xCE, 0xE3, 0x4A, 0x55, 0xCB, 0xA6, 0xDD, 0x4C, 0x91, 0x92,\n    0xA0, 0x1C, 0x83, 0xBD, 0x28, 0x05, 0xB9, 0xFC, 0x75, 0x42, 0xEF, 0xB1, 0x7D, 0x2A, 0x17, 0x3E,\n    0x7A, 0xB3, 0xB5, 0xCB, 0xD9, 0x43, 0x0F, 0xAD, 0x4D, 0x36, 0x70, 0x4E, 0x39, 0x3C, 0x91, 0xF6,\n    0x05, 0xDB, 0x0A, 0x43, 0xDC, 0x5B, 0xAF, 0x4C, 0x34, 0x72, 0x9B, 0xF1, 0x2D, 0x89, 0x0F, 0x85,\n    0x1C, 0x90, 0x8B, 0x90, 0x84, 0xCC, 0x1D, 0xD0, 0xAE, 0xF6, 0x58, 0x20, 0x38, 0xE9, 0x44, 0x16,\n    0xB6, 0xCB, 0x90, 0x5C, 0x76, 0x91, 0xB7, 0x1B, 0x15, 0xB6, 0xEF, 0xB1, 0x31, 0xAE, 0xD0, 0x9E,\n    0x78, 0x37, 0xBC, 0x69, 0x3B, 0x2C, 0x22, 0x89, 0x10, 0xE5, 0xBF, 0xA5, 0xAA, 0x32, 0x0F, 0x5F,\n    0xED, 0x7A, 0x85, 0xC2, 0x25, 0x0E, 0x8C, 0x8D, 0xEB, 0x8D, 0xE7, 0x33, 0x84, 0x9B, 0x47, 0xC5,\n    0xD6, 0x49, 0xAB, 0x1D, 0xA1, 0x0A, 0x84, 0x14, 0x1A, 0x90, 0xD8, 0x11, 0x78, 0x4A, 0x1A, 0x01,\n    0xE2, 0x27, 0xC9, 0x49, 0x61, 0x82, 0x62, 0xA2, 0xE0, 0xE4, 0xDF, 0x99, 0xC5, 0x5A, 0x7B, 0x54,\n    0x7B, 0x77, 0xC9, 0xF8, 0xA4, 0xB5, 0xA2, 0xA0, 0x09, 0x42, 0x9F, 0x47, 0x82, 0x6C, 0x79, 0xED,\n    0x5F, 0x79, 0xBD, 0x0C, 0x73, 0x84, 0x88, 0x05, 0x16, 0x17, 0x08, 0x9D, 0x3C, 0xCA, 0xCB, 0x55,\n    0xD4, 0x14, 0x16, 0xD3, 0x83, 0xAE, 0x39, 0x1D, 0x3D, 0x19, 0x51, 0x1A, 0x45, 0x32, 0x19, 0xA0,\n    0xF0, 0xC0, 0xB0, 0x27, 0x4D, 0xC6, 0x6F, 0x75, 0x52, 0x59, 0x14, 0x50, 0xF7, 0xDF, 0x6A, 0x51,\n    0xE5, 0xB0, 0xDC, 0xE8, 0x27, 0x2E, 0x49, 0x7A, 0x53, 0x96, 0x2C, 0x28, 0x9A, 0x65, 0x75, 0x65,\n    0xBE, 0x35, 0x1B, 0x6D, 0x1C, 0x90, 0xCA, 0x80, 0x42, 0xBF, 0xA4, 0x45, 0xA2, 0x5C, 0x93, 0xFC,\n    0xB5, 0x63, 0x30, 0xB2, 0xA7, 0x7B, 0x20, 0x3F, 0x0F, 0x5E, 0xE1, 0x41, 0x61, 0x79, 0xBC, 0xB1,\n    0x07, 0x69, 0x2F, 0xA9, 0x48, 0x99, 0xEE, 0xD3, 0x46, 0xFF, 0x51, 0x54, 0x31, 0xB5, 0xC1, 0xCE,\n    0x87, 0x20, 0xB9, 0x0F, 0x47, 0x77, 0x46, 0xB3, 0x57, 0xAD, 0x3C, 0x1E, 0x03, 0xD0, 0xA5, 0x3D,\n    0x66, 0xB3, 0xC5, 0x28, 0x2E, 0x06, 0xF6, 0x02, 0x49, 0x9D, 0xF9, 0xF5, 0x29, 0x69, 0xF8, 0x16,\n    0x0A, 0x2F, 0xB7, 0xCD, 0xE8, 0xDB, 0x5F, 0xA2, 0x12, 0xAB, 0x7C, 0x09, 0x24, 0x81, 0x9C, 0x04,\n    0x27, 0x51, 0x66, 0x4D, 0xDC, 0xE5, 0x24, 0xE9, 0xE4, 0x53, 0xA9, 0x8B, 0x41, 0x25, 0x47, 0x2B,\n    0x2B, 0xC6, 0xA0, 0x41, 0x81, 0xEB, 0xD1, 0xC6, 0xB3, 0x77, 0x97, 0x90, 0x25, 0x15, 0xFA, 0xB2,\n    0x37, 0x9F, 0xE4, 0xE3, 0xB2, 0x11, 0xEB, 0xF2, 0x72, 0x62, 0xC6, 0x8A, 0x00, 0xF3, 0x99, 0x83,\n    0x11, 0x26, 0x64, 0x82, 0xA6, 0xA2, 0x8B, 0xF2, 0xB0, 0xCE, 0xAE, 0x49, 0xE1, 0x16, 0xC1, 0x6F,\n    0x81, 0x89, 0x61, 0x6F, 0x9E, 0x0A, 0x07, 0xB3, 0xDB, 0x62, 0x45, 0xEF, 0x54, 0x6C, 0x9F, 0x95,\n    0xC5, 0x50, 0xEF, 0xD7, 0x81, 0x0B, 0x8F, 0x67, 0x15, 0xE4, 0xDF, 0xC6, 0xFB, 0xD5, 0x17, 0x8F,\n    0x90, 0x27, 0xE5, 0x3B, 0x86, 0xF4, 0xBC, 0xF1, 0x9D, 0x1D, 0x07, 0xB1, 0x3D, 0x45, 0xE4, 0x62,\n    0x76, 0x6B, 0xFC, 0x2C, 0xE5, 0x31, 0x7E, 0x1D, 0x66, 0x0B, 0x85, 0x27, 0x80, 0xF8, 0xCB, 0xB8,\n    0x2A, 0xA4, 0x23, 0x4B, 0x3D, 0xB7, 0xE3, 0x10, 0x4D, 0xB8, 0xD1, 0xA9, 0x10, 0x33, 0x84, 0xF1,\n    0x07, 0x28, 0xE0, 0x89, 0x4D, 0x9C, 0x4F, 0xA3, 0x84, 0xFA, 0x30, 0xBC, 0x38, 0x72, 0x91, 0x59,\n    0xD5, 0x66, 0x49, 0x2E, 0x62, 0x69, 0x7A, 0x6E, 0xCB, 0x3F, 0x18, 0x9A, 0x24, 0x8A, 0x8A, 0x72,\n    0x1E, 0x2F, 0xF5, 0xD5, 0x23, 0x5D, 0x85, 0x58, 0x22, 0x1D, 0x23, 0x44, 0x82, 0x94, 0x85, 0x66,\n    0x07, 0x4C, 0x1C, 0x85, 0xF8, 0x1C, 0x28, 0x0A, 0x09, 0x39, 0x79, 0xFF, 0xCC, 0xF0, 0x20, 0x84,\n    0xCA, 0x88, 0x77, 0x8F, 0xC3, 0x58, 0x56, 0xDD, 0xB9, 0x06, 0x1C, 0x0D, 0xFB, 0x9B, 0x10, 0xE1,\n    0xDB, 0x23, 0x84, 0xF0, 0xB0, 0x76, 0xC0, 0x0C, 0xF8, 0x28, 0x13, 0xE7, 0x4E, 0xDD, 0xC3, 0x1A,\n    0xBD, 0x9F, 0x5B, 0x47, 0xEC, 0x22, 0x01, 0x0A, 0x8E, 0xFC, 0x4A, 0x36, 0xF7, 0xC6, 0xFC, 0x33,\n    0x1E, 0x29, 0xBB, 0x34, 0xD0, 0xA9, 0x9A, 0x57, 0x17, 0x8E, 0x02, 0x1C, 0x44, 0xB8, 0x33, 0x24,\n    0xD6, 0x8D, 0xB6, 0x3F, 0xDB, 0x1B, 0xAD, 0xC5, 0x5A, 0x98, 0x88, 0xE6, 0x7D, 0x9C, 0x2F, 0xE7,\n    0x0E, 0x14, 0xD3, 0xA1, 0x9A, 0x98, 0xB8, 0x54, 0xE2, 0x90, 0x97, 0x5E, 0x48, 0xDE, 0xCF, 0x3B,\n    0x4F, 0x57, 0x92, 0x66, 0x2D, 0xB4, 0xA7, 0x71, 0x4D, 0x08, 0xB7, 0xA3, 0xF1, 0x5A, 0xAA, 0x7E,\n    0xAD, 0xAD, 0xAC, 0xD2, 0xBD, 0x27, 0x41, 0x51, 0xC1, 0xEA, 0x4F, 0xE0, 0x0D, 0xC7, 0x3B, 0x20,\n    0x84, 0x18, 0x7B, 0xBB, 0x78, 0xB7, 0xCB, 0x6E, 0x5B, 0x83, 0xBF, 0x59, 0x72, 0x2F, 0x74, 0x32,\n    0xA6, 0x55, 0x81, 0x6B, 0xFA, 0xE0, 0xA7, 0x68, 0x0D, 0xB5, 0xCF, 0x02, 0xCB, 0xDD, 0xF0, 0x69,\n    0xB1, 0x74, 0x4A, 0x53, 0x77, 0xF7, 0xD1, 0xC2, 0xCE, 0x2A, 0x59, 0xFD, 0x01, 0xBD, 0xD9, 0x50,\n    0x3E, 0xC4, 0xE6, 0xE0, 0x0C, 0x62, 0x44, 0x64, 0xEE, 0x70, 0x9F, 0x69, 0x81, 0x0D, 0xCE, 0x42,\n    0x87, 0x3A, 0xF2, 0x3A, 0x6B, 0x78, 0xDA, 0x42, 0x99, 0x33, 0xC9, 0xEB, 0x3B, 0x9C, 0xED, 0x3B,\n    0xC7, 0xF2, 0x65, 0xD1, 0x32, 0xB2, 0x3F, 0x9D, 0x80, 0xEC, 0xAC, 0x7D, 0x04, 0xF1, 0xE9, 0xBA,\n    0x52, 0x4A, 0x74, 0x70, 0x8C, 0xCF, 0xB1, 0xB9, 0x91, 0x8C, 0x4F, 0x12, 0x0D, 0xC2, 0x7A, 0x2F,\n    0xB8, 0x86, 0xF2, 0x9B, 0x4D, 0x58, 0xE0, 0xA0, 0x2E, 0xEA, 0x82, 0x17, 0xC1, 0x7E, 0x48, 0xBE,\n    0x56, 0xA5, 0xC7, 0xB9, 0x88, 0xF5, 0x26, 0xA6, 0xC1, 0x60, 0x83, 0xBC, 0x40, 0x7C, 0x36, 0x2B,\n    0x32, 0x57, 0x25, 0xBE, 0x88, 0x38, 0x2B, 0x8D, 0xBE, 0xA0, 0xE0, 0x64, 0x0D, 0x06, 0x2C, 0xD5,\n    0x88, 0x31, 0xCC, 0x79, 0x49, 0x81, 0x19, 0xE5, 0x36, 0x43, 0x3D, 0x74, 0xA3, 0x20, 0x59, 0x3C,\n    0xFD, 0x5B, 0x5C, 0x35, 0x4D, 0xF1, 0x90, 0x26, 0x8A, 0x06, 0xB5, 0x76, 0x87, 0x1D, 0xC6, 0x7D,\n    0x93, 0x8A, 0x35, 0x62, 0x12, 0x23, 0x7E, 0xD7, 0x33, 0x4C, 0x73, 0xEB, 0x01, 0x6D, 0xCB, 0xAF,\n    0xE5, 0xF2, 0x5D, 0x6C, 0x48, 0x73, 0x8E, 0x78, 0xA6, 0xA1, 0x11, 0xAC, 0x91, 0xA1, 0x6D, 0x13,\n    0xAE, 0x2B, 0xA7, 0x7B, 0x03, 0xDA, 0x16, 0x7A, 0xE3, 0x6A, 0x53, 0xF1, 0x82, 0x1F, 0xD0, 0x29,\n    0xA6, 0x99, 0xB0, 0xC1, 0x1A, 0x28, 0xBC, 0x08, 0xC7, 0x6C, 0x3E, 0xD8, 0x3B, 0x7D, 0x31, 0x4F,\n    0xB9, 0xCC, 0x1F, 0x8F, 0x06, 0x85, 0xDE, 0x97, 0xBD, 0x7A, 0x02, 0xA4, 0x16, 0x0E, 0x8F, 0xF2,\n    0x61, 0xAE, 0x02, 0xA2, 0x43, 0x84, 0xE0, 0x9E, 0x1E, 0xA9, 0xDB, 0xF0, 0x7A, 0xC3, 0xA0, 0xDD,\n    0x93, 0xE9, 0x84, 0x8D, 0xC3, 0x79, 0x9C, 0xE5, 0x68, 0xBC, 0x63, 0xB8, 0x82, 0xA0, 0x94, 0x7D,\n    0x7F, 0x5B, 0x73, 0x13, 0x0B, 0x7A, 0x46, 0xBE, 0xEF, 0x70, 0x64, 0xB9, 0x26, 0xB0, 0x86, 0xBB,\n    0x33, 0x8A, 0xCC, 0x81, 0x04, 0x8E, 0x62, 0x7A, 0x34, 0xFA, 0x25, 0x14, 0x0F, 0x0A, 0xD4, 0x0B,\n    0xCF, 0xD6, 0x92, 0x05, 0x88, 0x2C, 0x2D, 0x26, 0xDF, 0x08, 0xD6, 0x19, 0x6A, 0xAB, 0x74, 0x2C,\n    0xB0, 0x08, 0x6B, 0xAB, 0x87, 0xEA, 0x6A, 0x48, 0xB8, 0x73, 0xB6, 0x16, 0x30, 0x33, 0xE7, 0x4B,\n    0x81, 0xBD, 0xEE, 0x67, 0x31, 0x83, 0x4B, 0xCF, 0x83, 0x22, 0x05, 0x8A, 0x81, 0xEB, 0xFA, 0x75,\n    0xBB, 0x54, 0x8E, 0x78, 0x5B, 0x76, 0x70, 0x3F, 0x7D, 0x3F, 0xAA, 0x6C, 0x69, 0x7F, 0x19, 0x68,\n    0xB3, 0x68, 0x51, 0xD1, 0x61, 0xD5, 0x3C, 0x2C, 0x6B, 0xC5, 0x96, 0xE0, 0xDA, 0x26, 0x63, 0xC5,\n    0x0E, 0xA1, 0xF5, 0x59, 0xD5, 0x78, 0x87, 0x81, 0xEF, 0x87, 0x01, 0x88, 0xD4, 0xE1, 0xBD, 0xB8,\n    0x96, 0x1D, 0x5D, 0x85, 0x1C, 0x6F, 0x53, 0xED, 0x6A, 0x6A, 0xC0, 0x2A, 0xB2, 0xF1, 0x6C, 0x7A,\n    0x92, 0xF5, 0x70, 0x6D, 0x94, 0xD5, 0x87, 0x57, 0xE3, 0x26, 0xCD, 0xDA, 0x52, 0x5C, 0x22, 0x03,\n    0xBD, 0xF6, 0x60, 0xA6, 0xC9, 0x64, 0xF0, 0xC6, 0x11, 0xA4, 0x96, 0xB1, 0x27, 0x8B, 0x8E, 0x99,\n    0x3E, 0xC2, 0xC1, 0x43, 0xD4, 0x10, 0x7D, 0xCC, 0x9F, 0xE4, 0x7C, 0xA6, 0x10, 0x1E, 0xE5, 0x59,\n    0x37, 0x58, 0xF0, 0xB3, 0xF6, 0x4F, 0x8B, 0x41, 0xDB, 0x65, 0x01, 0xDD, 0xE3, 0xAB, 0xBD, 0x4C,\n    0x4C, 0x69, 0x2B, 0x82, 0xBA, 0x80, 0xDE, 0x9E, 0x4D, 0xAC, 0x86, 0xDF, 0x34, 0xDB, 0xDF, 0x1C,\n    0xBA, 0x25, 0x03, 0xD0, 0x5E, 0x29, 0x29, 0x4E, 0xFC, 0xF6, 0xC0, 0x10, 0x03, 0xCA, 0xB0, 0xA3,\n    0x22, 0xB0, 0x46, 0xAA, 0xC3, 0xBB, 0xF1, 0xC6, 0x7C, 0xB1, 0xC2, 0x70, 0xCD, 0xAC, 0xE0, 0x6B,\n    0xDD, 0x14, 0xEC, 0xAD, 0x80, 0x09, 0xF9, 0xBD, 0x1F, 0x4A, 0xD7, 0x20, 0xFA, 0x15, 0xCF, 0xDD,\n    0xE5, 0x65, 0x2A, 0x06, 0xBD, 0x88, 0xC0, 0x12, 0x74, 0xC4, 0x8B, 0x3C, 0x50, 0x8D, 0x73, 0xC3,\n    0xF0, 0x36, 0x40, 0x64, 0x39, 0x4C, 0x78, 0x92, 0xD8, 0xDC, 0x93, 0x2A, 0xC0, 0x91, 0x16, 0xB0,\n    0x96, 0x88, 0x70, 0x85, 0x86, 0xEF, 0x38, 0xF5, 0x8E, 0x70, 0x63, 0x3C, 0xE8, 0xDB, 0x26, 0xDF,\n    0x3F, 0xEE, 0x01, 0xB1, 0xF6, 0xF6, 0x8E, 0x1A, 0xEE, 0x6F, 0x42, 0x9B, 0x76, 0x08, 0xF2, 0xE4,\n    0xB5, 0xD8, 0x45, 0x55, 0xCE, 0xF3, 0x89, 0xEC, 0x2D, 0x00, 0xF7, 0xC1, 0xED, 0x4D, 0xD0, 0x04,\n    0xC1, 0xB2, 0x92, 0xE1, 0xE5, 0xEE, 0x44, 0xFD, 0x79, 0xC1, 0x45, 0xAD, 0x1F, 0x99, 0x49, 0xB9,\n    0xC3, 0x79, 0xAF, 0xFC, 0x09, 0x31, 0x3F, 0xBE, 0x15, 0x37, 0xB7, 0x9B, 0xA2, 0xD5, 0xD7, 0xDD,\n    0x1B, 0xBC, 0x69, 0xA3, 0x27, 0x8A, 0x7C, 0xAA, 0xC6, 0x31, 0x2A, 0xA9, 0x6F, 0xA1, 0x3D, 0xFE,\n    0xB6, 0x40, 0xD0, 0x96, 0xBF, 0xEC, 0x37, 0xB1, 0x5C, 0x8E, 0xA8, 0xF7, 0x4B, 0x9D, 0x62, 0x5C,\n    0x33, 0x4E, 0x54, 0xDA, 0x66, 0xF2, 0xFF, 0xEE, 0xE2, 0x19, 0xF3, 0x47, 0x74, 0xD2, 0xC8, 0x8D,\n    0xDB, 0x67, 0xEC, 0x77, 0xD7, 0xC0, 0x1F, 0xC7, 0x4D, 0x7D, 0x03, 0xD1, 0xEB, 0xDD, 0x43, 0xD1,\n    0x25, 0xD8, 0x29, 0x18, 0xCA, 0xE5, 0xF3, 0x89, 0x86, 0xA0, 0x09, 0xD1, 0x4E, 0x0C, 0x69, 0x47,\n    0x1B, 0x89, 0x9B, 0xB2, 0xE9, 0xE3, 0x7E, 0x9C, 0xE4, 0xCD, 0xE8, 0x0A, 0x70, 0xF0, 0x95, 0x81,\n    0x70, 0xF5, 0xAD, 0x6E, 0xD9, 0x41, 0x2D, 0xCD, 0xEC, 0xA3, 0x10, 0x18, 0xF1, 0x34, 0xD3, 0xC1,\n    0x85, 0x5D, 0x07, 0xE5, 0x8C, 0x6A, 0xEF, 0xCC, 0xB0, 0xA7, 0x00, 0xE8, 0x53, 0x5D, 0xD5, 0xE5,\n    0x47, 0x60, 0x94, 0xAB, 0x43, 0x26, 0xCD, 0x0E, 0x02, 0xD3, 0x8C, 0xF1, 0x8F, 0xAC, 0x23, 0x0F,\n    0xDF, 0xB1, 0x3A, 0x8F, 0x99, 0xAF, 0x89, 0xAC, 0x5B, 0xAE, 0x6C, 0x40, 0x6D, 0xC1, 0x20, 0x2A,\n    0x01, 0xFB, 0xC6, 0x02, 0x19, 0xC1, 0x89, 0x98, 0x41, 0x24, 0x9F, 0xCF, 0xA2, 0x43, 0x15, 0x3F,\n    0xA7, 0x8F, 0x6F, 0xC6, 0x47, 0x91, 0x0A, 0xBA, 0x7B, 0xD3, 0x5E, 0xD2, 0xB3, 0x70, 0x00, 0x86,\n    0xAD, 0xD6, 0xF4, 0xC4, 0x1D, 0x76, 0x90, 0x26, 0x47, 0xE3, 0x69, 0xA5, 0x8E, 0x2E, 0xBF, 0xA8,\n    0x9D, 0x72, 0x84, 0x41, 0xC3, 0x8E, 0x4A, 0x6B, 0xE5, 0xA5, 0xB3, 0x05, 0x67, 0xDC, 0x5F, 0xAF,\n    0xF0, 0x06, 0x08, 0x9C, 0x8E, 0x10, 0xDC, 0x73, 0x98, 0x73, 0x9A, 0x9B, 0xA6, 0x3D, 0xCF, 0xC2,\n    0x2E, 0x7F, 0x37, 0xF8, 0xC2, 0xC6, 0x45, 0x6D, 0xD3, 0x01, 0x48, 0x55, 0x4E, 0x62, 0xEF, 0x67,\n    0xD6, 0xAC, 0x7F, 0x6E, 0x9C, 0x0A, 0x1F, 0x5D, 0x9F, 0xB4, 0x55, 0x4F, 0xEB, 0x9D, 0xFC, 0xDD,\n    0x92, 0x45, 0x1D, 0xAE, 0xBD, 0xCA, 0xCB, 0x04, 0xB9, 0x18, 0x3A, 0xBB, 0x2B, 0x8C, 0x8A, 0x80,\n    0x4D, 0x1A, 0x24, 0x39, 0xDA, 0x10, 0x94, 0xDA, 0xC9, 0x4B, 0x2F, 0x0F, 0x86, 0x24, 0x0B, 0x51,\n    0xF5, 0x57, 0xBA, 0x57, 0x23, 0x4D, 0x03, 0xAA, 0xA4, 0xC0, 0x23, 0x7D, 0xF9, 0x13, 0x02, 0x30,\n    0x42, 0x4D, 0xDA, 0xE0, 0x5E, 0x11, 0x8E, 0xA7, 0x21, 0x20, 0xEA, 0x1F, 0x26, 0xF1, 0x5C, 0xCD,\n    0x9C, 0x6F, 0x1E, 0xCC, 0xE8, 0x23, 0xA4, 0xDD, 0x40, 0x36, 0xFC, 0x8A, 0x95, 0x80, 0xFD, 0x91,\n    0xD3, 0x8F, 0x61, 0x75, 0x6B, 0x09, 0xF8, 0x0A, 0xBE, 0x94, 0x25, 0x9C, 0x02, 0xFD, 0x65, 0x50,\n    0x6F, 0x90, 0xA5, 0x9E, 0xDE, 0xD8, 0x98, 0x90, 0xBA, 0x06, 0xEF, 0xF6, 0xDC, 0x37, 0x4F, 0x46,\n    0x3F, 0xF4, 0xD1, 0x91, 0xB2, 0x0D, 0xA7, 0x56, 0x78, 0x76, 0x35, 0xE7, 0x2D, 0x66, 0x2A, 0xF8,\n    0x5B, 0xC5, 0x1F, 0x41, 0xB1, 0x89, 0xB6, 0x7C, 0x43, 0x68, 0x8E, 0x19, 0x44, 0x03, 0x8C, 0xD0,\n    0xCA, 0xEF, 0x64, 0x34, 0x87, 0xC4, 0xEB, 0xD4, 0xCD, 0x33, 0x07, 0x71, 0x57, 0xA7, 0xDC, 0xE5,\n    0x65, 0x2E, 0xD9, 0xE1, 0x7F, 0xAA, 0xCA, 0x11, 0xEC, 0xDF, 0x83, 0xAB, 0xBD, 0x9C, 0x27, 0xAB,\n    0x5C, 0x34, 0x6A, 0x49, 0xDF, 0xAD, 0x68, 0xFA, 0x61, 0x39, 0xDC, 0x49, 0x7D, 0xF5, 0x76, 0xC2,\n    0x3F, 0xD4, 0x48, 0xA2, 0x9C, 0x2D, 0x50, 0x94, 0x3E, 0xF7, 0xB3, 0xBA, 0x71, 0x23, 0x9F, 0x63,\n    0x5F, 0x6D, 0x4D, 0x89, 0xA5, 0x37, 0x03, 0xDB, 0x79, 0x87, 0x27, 0x9E, 0x15, 0x65, 0x1C, 0x9F,\n    0x61, 0x2B, 0x37, 0xFF, 0x87, 0xF4, 0x18, 0xF8, 0xBE, 0xAA, 0x1D, 0x4E, 0xBC, 0x02, 0x26, 0x1A,\n    0xA5, 0x3E, 0x52, 0x97, 0x21, 0xE1, 0xD2, 0xDA, 0xC0, 0x2D, 0x8D, 0x4B, 0x57, 0xFC, 0x08, 0xAA,\n    0x7C, 0x59, 0xF9, 0xBF, 0x3A, 0xF1, 0x96, 0x83, 0xA2, 0x59, 0x70, 0xA4, 0x06, 0x13, 0x6B, 0x15,\n    0xA8, 0xCB, 0xC8, 0x0B, 0x85, 0x31, 0x42, 0x3E, 0x3E, 0x83, 0x0C, 0xAF, 0x40, 0xAC, 0xBE, 0x6C,\n    0x6E, 0x17, 0x9A, 0xC6, 0x45, 0xCE, 0x1B, 0x1B, 0xBC, 0x94, 0xBF, 0xA2, 0x53, 0x5B, 0xDF, 0x95,\n    0xEF, 0x6A, 0x41, 0x93, 0xC4, 0x58, 0xE9, 0x20, 0x68, 0x28, 0xB1, 0xA3, 0x80, 0x80, 0x48, 0xEF,\n    0x7A, 0x7C, 0x11, 0x33, 0x62, 0x18, 0xB7, 0x41, 0x52, 0x36, 0xD5, 0xB6, 0xC0, 0x95, 0xD7, 0x71,\n    0x00, 0x0B, 0x0A, 0x86, 0xE7, 0x13, 0x8D, 0xE6, 0x73, 0x33, 0xB5, 0x8B, 0xEE, 0xC3, 0xCA, 0x24,\n    0x12, 0x96, 0x89, 0x91, 0x90, 0x95, 0xCA, 0x24, 0x30, 0xDB, 0x25, 0x9B, 0x1B, 0xF2, 0x13, 0xCA,\n    0xC3, 0x3A, 0x8A, 0x7E, 0xEA, 0xF9, 0x7D, 0xB1, 0xF0, 0x69, 0xF8, 0xD9, 0xA0, 0xEE, 0x3C, 0xF8,\n    0x02, 0x37, 0x93, 0xB5, 0xE3, 0xD9, 0x7B, 0x54, 0xF1, 0x3A, 0x9D, 0x20, 0xB0, 0xD2, 0xC6, 0xAE,\n    0x61, 0x26, 0x90, 0x4C, 0xA5, 0x9D, 0x20, 0xE1, 0xEF, 0x4A, 0x07, 0xF6, 0xAF, 0xE9, 0x28, 0xF5,\n    0x9B, 0x47, 0xDE, 0xD1, 0x65, 0x76, 0x0C, 0x70, 0x40, 0xBC, 0xA6, 0xA4, 0xE1, 0xF2, 0xEE, 0x0B,\n    0xAA, 0xF3, 0x3A, 0x8E, 0x4F, 0x7D, 0x9F, 0x97, 0xB6, 0x65, 0x54, 0x16, 0x88, 0xAF, 0x5C, 0xCD,\n    0xE3, 0x66, 0xEB, 0xB2, 0xA2, 0xA2, 0x5B, 0xE9, 0x0A, 0x54, 0x9B, 0x0E, 0x50, 0x4F, 0x89, 0xAD,\n    0x67, 0x11, 0x48, 0x33, 0x08, 0x47, 0xA6, 0xE1, 0xB4, 0x03, 0xF5, 0x65, 0x2B, 0xD1, 0xF7, 0xC7,\n    0x48, 0x3D, 0x1A, 0x33, 0xA6, 0x1E, 0x71, 0x1C, 0x02, 0x0A, 0x47, 0x9C, 0xE1, 0x97, 0xB3, 0x14,\n    0xD4, 0xEA, 0xFA, 0xF9, 0xFF, 0x35, 0x67, 0xAA, 0xC3, 0x2E, 0x78, 0x33, 0x3D, 0x03, 0x17, 0x78,\n    0x0B, 0xC7, 0x68, 0xC1, 0x19, 0x4D, 0x21, 0xFE, 0xD7, 0x84, 0xB8, 0xA0, 0x50, 0x36, 0xE6, 0x98,\n    0xE7, 0x5C, 0xF2, 0x0C, 0xAC, 0x8D, 0x9E, 0xB4, 0xC4, 0xFB, 0x29, 0x50, 0x9F, 0xF7, 0x27, 0xEB,\n    0x22, 0xDB, 0xD1, 0x19, 0x8E, 0x1C, 0xC4, 0x8C, 0x84, 0xF8, 0x0D, 0xB4, 0x1F, 0x80, 0x91, 0x70,\n    0xE1, 0xFC, 0x64, 0xE2, 0x5B, 0xD8, 0x07, 0x67, 0x87, 0xA2, 0x7E, 0x37, 0xE4, 0x7A, 0xBF, 0x87,\n    0xE4, 0x1F, 0x05, 0xAE, 0x25, 0xA5, 0x8C, 0xCE, 0xB5, 0x5F, 0x87, 0x77, 0xCF, 0x8E, 0x18, 0xA7,\n    0xAB, 0x4E, 0x16, 0xB1, 0xFC, 0x70, 0x9C, 0x00, 0x4D, 0xC6, 0x9F, 0x92, 0x3F, 0x42, 0xAF, 0xB4,\n    0xD0, 0x36, 0x13, 0xF0, 0xA3, 0xFE, 0x0E, 0x4B, 0xA3, 0xB9, 0xD6, 0xF0, 0x5F, 0xD3, 0x29, 0xDD,\n    0xB0, 0x27, 0x49, 0x13, 0x9F, 0x2B, 0xF8, 0xCB, 0x62, 0xC2, 0xBF, 0x80, 0x1D, 0x62, 0x23, 0x5B,\n    0xCE, 0x19, 0x6F, 0xE1, 0xAA, 0xD9, 0x99, 0x0F, 0x48, 0x72, 0xFE, 0xEF, 0x52, 0x58, 0x39, 0xF6,\n    0x4A, 0x98, 0x4A, 0xEF, 0xCF, 0xA3, 0x71, 0x92, 0xC6, 0xC6, 0x8F, 0x39, 0xED, 0x7D, 0x0B, 0x6C,\n    0x62, 0xE1, 0xA8, 0x0E, 0x62, 0xF7, 0x59, 0xD6, 0xB0, 0x67, 0x82, 0x12, 0x5C, 0xA9, 0xBC, 0x52,\n    0x7F, 0xCF, 0xD3, 0x33, 0x7A, 0x98, 0xFE, 0x8E, 0x70, 0x31, 0xB9, 0x82, 0x37, 0xD2, 0x37, 0xC9,\n    0xEE, 0x1C, 0xBC, 0x76, 0x0B, 0xBD, 0x95, 0xD4, 0xD0, 0x9C, 0xEE, 0x9F, 0x8A, 0x9C, 0xA0, 0x34,\n    0xFE, 0x8D, 0x64, 0xF0, 0xDA, 0x02, 0x17, 0xA3, 0x26, 0x68, 0x4B, 0xE8, 0x54, 0xF7, 0xE1, 0x94,\n    0x6D, 0xA9, 0x5E, 0x8B, 0x86, 0x13, 0xDB, 0x5C, 0x0C, 0xF0, 0x3C, 0x40, 0x4F, 0x0D, 0x15, 0xD7,\n    0xE7, 0x48, 0x3F, 0xC6, 0x33, 0x24, 0x30, 0x83, 0x50, 0x30, 0xBC, 0xD7, 0xE5, 0x25, 0x32, 0x11,\n    0xD0, 0xA7, 0xE3, 0x7C, 0x4D, 0xE4, 0x46, 0xE3, 0xCB, 0xF7, 0x04, 0x49, 0xFF, 0x5F, 0x0C, 0xFE,\n    0x36, 0xEE, 0x39, 0x46, 0x5B, 0x41, 0x7D, 0x1B, 0xF0, 0xCF, 0x90, 0xEF, 0x72, 0x6E, 0x61, 0xE5,\n    0x26, 0xC7, 0xC5, 0x6A, 0xCA, 0x40, 0x7A, 0x30, 0x8E, 0x0A, 0x2F, 0xDD, 0x64, 0x95, 0xF7, 0x19,\n    0x6D, 0x0F, 0xDB, 0x80, 0xFB, 0x9E, 0x6B, 0x36, 0xD6, 0x1E, 0x0A, 0x34, 0x7A, 0x8B, 0x1B, 0xB9,\n    0xA8, 0xBB, 0x49, 0x67, 0xCA, 0x7E, 0xD6, 0x27, 0x6F, 0xAC, 0xED, 0x25, 0x89, 0xFD, 0xB4, 0x11,\n    0x2F, 0x43, 0x74, 0x40, 0x2D, 0x73, 0x20, 0xA1, 0x94, 0x9E, 0x79, 0x5D, 0x20, 0x88, 0xD5, 0x1F,\n    0x13, 0x10, 0x35, 0x7A, 0x4C, 0xF0, 0x5B, 0x09, 0x96, 0x75, 0x6F, 0x5F, 0xED, 0x9D, 0x68, 0xBD,\n    0x0D, 0x77, 0x5C, 0x85, 0x13, 0x3A, 0x11, 0x0D, 0x0A, 0x90, 0x98, 0x8F, 0xCE, 0x4C, 0xE5, 0x46,\n    0x40, 0x86, 0x75, 0xA5, 0x49, 0x5C, 0x12, 0x57, 0xF8, 0x48, 0x86, 0xD4, 0x81, 0xA4, 0x47, 0x39,\n    0x19, 0x42, 0x23, 0x44, 0x7F, 0x57, 0x9C, 0x95, 0xA1, 0xFD, 0x3E, 0xA6, 0x29, 0x84, 0xF6, 0x8F,\n    0x87, 0x79, 0x8B, 0xF6, 0x45, 0x5A, 0x9B, 0x7E, 0xBB, 0xC1, 0xD3, 0xB7, 0xE4, 0x18, 0xB0, 0x61,\n    0x77, 0xB4, 0x12, 0x25, 0xEE, 0x6C, 0x3D, 0x6C, 0xA9, 0xFE, 0x67, 0xDE, 0xCC, 0x8F, 0x11, 0xC1,\n    0x8A, 0xD6, 0x72, 0xAC, 0x45, 0x77, 0xEF, 0xD3, 0x96, 0x41, 0xA7, 0xC1, 0x92, 0x15, 0x93, 0x44,\n    0x18, 0x08, 0x14, 0x7C, 0xAB, 0xCE, 0xBF, 0xFA, 0x89, 0xEF, 0xAD, 0x09, 0x9A, 0xB9, 0x8A, 0x7D,\n    0xD5, 0xA2, 0x82, 0x90, 0x10, 0x4E, 0xD6, 0xCC, 0x04, 0x43, 0x21, 0x6B, 0xDF, 0xE4, 0x56, 0xE9,\n    0x7D, 0x17, 0xCD, 0xC1, 0x3A, 0xC0, 0xA1, 0x83, 0xCE, 0xC8, 0x90, 0x2E, 0xA6, 0x73, 0x44, 0x72,\n    0x10, 0x7B, 0x03, 0xDB, 0x2F, 0xCA, 0x9C, 0x71, 0x44, 0x06, 0xAC, 0xCB, 0x4A, 0x09, 0xF0, 0x08,\n    0x1C, 0x99, 0x49, 0x13, 0x19, 0x6E, 0xEE, 0x4C, 0xA2, 0xE4, 0xB8, 0xA0, 0x36, 0xE2, 0x9C, 0x13,\n    0x7E, 0x6C, 0x9B, 0x3C, 0x74, 0x5A, 0x50, 0x90, 0x8C, 0xE1, 0x24, 0x76, 0x14, 0xF7, 0x2E, 0x77,\n    0x24, 0x64, 0xFA, 0x37, 0x0C, 0xE1, 0x90, 0xDB, 0xB4, 0x4C, 0x9E, 0xC5, 0x26, 0xA8, 0xED, 0x02,\n    0x72, 0x4D, 0xF4, 0x91, 0x94, 0xDF, 0x77, 0x3B, 0x96, 0xB9, 0x42, 0x34, 0xD2, 0xB7, 0x1E, 0x49,\n    0xBD, 0x29, 0xBB, 0x3C, 0xC6, 0x5B, 0x3F, 0x15, 0xE5, 0x8F, 0x0E, 0x23, 0xA5, 0xD5, 0x73, 0x06,\n    0x6F, 0xEF, 0x73, 0x51, 0xB2, 0xC8, 0xD4, 0x44, 0xFC, 0x25, 0x95, 0xA9, 0x44, 0x57, 0xB7, 0x80,\n    0x07, 0xB0, 0xCE, 0x58, 0x12, 0xFF, 0xD3, 0xD9, 0x13, 0xDD, 0x11, 0x26, 0x5B, 0xC3, 0x5B, 0xEE,\n    0xA9, 0x53, 0x19, 0xE9, 0x31, 0x9C, 0x1B, 0x3A, 0x2A, 0x9F, 0xD9, 0x7C, 0x7A, 0x55, 0x52, 0x40,\n    0xE0, 0xEC, 0x11, 0x39, 0x7E, 0x09, 0xD7, 0xE7, 0xCF, 0xC7, 0x67, 0xDB, 0xDE, 0x02, 0x92, 0xEF,\n    0x47, 0x2C, 0x54, 0xFD, 0xE4, 0x37, 0xC6, 0x9F, 0x51, 0x66, 0x96, 0x84, 0x19, 0x94, 0x90, 0xE6,\n    0x4E, 0x43, 0x2A, 0xB9, 0x13, 0x40, 0x9C, 0xE9, 0x89, 0xA2, 0x2B, 0x8E, 0x8C, 0x39, 0x42, 0x42,\n    0xF8, 0xD9, 0x5A, 0x86, 0x0E, 0xA6, 0x3A, 0x9E, 0xA8, 0xA5, 0x23, 0x19, 0x58, 0xDB, 0x4C, 0x46,\n    0xCA, 0x26, 0x50, 0x0B, 0xD2, 0x6A, 0x9B, 0xBE, 0x63, 0x55, 0xF4, 0x42, 0xD8, 0x20, 0xCD, 0x55,\n    0x01, 0xA0, 0x3D, 0xE3, 0x97, 0x23, 0x14, 0xF1, 0x6A, 0x2A, 0x5A, 0xA9, 0xBD, 0x01, 0x5E, 0x56,\n    0x8F, 0xC7, 0x31, 0x6F, 0xBB, 0x78, 0x88, 0x01, 0xF0, 0x00, 0xD2, 0x1B, 0x40, 0x6D, 0x50, 0xD0,\n    0xCB, 0x44, 0x35, 0x3A, 0xBC, 0xBB, 0x6F, 0x6C, 0xF4, 0xDB, 0x6F, 0x54, 0x27, 0x8C, 0x0A, 0x5A,\n    0xE8, 0x56, 0xC9, 0x28, 0x44, 0xBC, 0xF7, 0x70, 0xF0, 0x95, 0x17, 0xA1, 0x0B, 0x91, 0xDF, 0x80,\n    0xF8, 0xF3, 0xF9, 0xB9, 0x1C, 0xEB, 0x81, 0x31, 0x18, 0xE2, 0xB6, 0xF8, 0x80, 0x64, 0x61, 0x1F,\n    0xD9, 0x14, 0x6C, 0x64, 0xE8, 0xDB, 0x45, 0x5E, 0x16, 0xD4, 0xDB, 0xC9, 0x13, 0x70, 0x4B, 0x0E,\n    0x40, 0x80, 0xB9, 0xCA, 0x9E, 0xB7, 0x85, 0x88, 0xDA, 0xF8, 0x13, 0xFE, 0x51, 0x28, 0xB9, 0x6E,\n    0x65, 0x92, 0xAA, 0x45, 0x68, 0xC6, 0x82, 0xCC, 0xBA, 0x28, 0x6E, 0xCF, 0x54, 0x7A, 0xB4, 0x8A,\n    0x8A, 0x92, 0x3C, 0x2F, 0x55, 0x6A, 0xE3, 0x23, 0x27, 0x4B, 0xFA, 0x13, 0x58, 0xB5, 0xAE, 0x9D,\n    0xA3, 0x77, 0x25, 0xFA, 0x70, 0x59, 0x5A, 0x34, 0x4C, 0xF1, 0xA9, 0x9A, 0x37, 0x2B, 0xEF, 0xA0,\n    0x85, 0xB7, 0x97, 0x74, 0x04, 0xD0, 0x08, 0xFE, 0x01, 0x7B, 0x33, 0x44, 0xB8, 0x44, 0x12, 0xE6,\n    0x1D, 0xCF, 0xE0, 0x8D, 0xDE, 0x92, 0x93, 0x49, 0xB8, 0x2B, 0x65, 0x0D, 0x38, 0x55, 0x3B, 0x90,\n    0x89, 0x01, 0x40, 0xEB, 0xF1, 0x33, 0x5C, 0x36, 0xAA, 0xF7, 0x84, 0x75, 0x8A, 0xB1, 0xE4, 0x68,\n    0x6F, 0x3C, 0x7C, 0x84, 0x71, 0x06, 0x57, 0xC4, 0x83, 0x9F, 0x6A, 0x96, 0x8F, 0xEB, 0xA6, 0x59,\n    0xBB, 0x2D, 0x68, 0x35, 0x8F, 0xBF, 0x8D, 0xFE, 0xC8, 0xBC, 0xA7, 0x41, 0x97, 0x17, 0x49, 0x82,\n    0x6E, 0x4D, 0xB0, 0xE8, 0xC9, 0x10, 0x57, 0x7B, 0x9C, 0x03, 0xDD, 0x90, 0xE3, 0x15, 0x30, 0x9A,\n    0x66, 0xAB, 0xF8, 0x9A, 0x69, 0xBE, 0x6E, 0x74, 0x3C, 0xF4, 0xDD, 0x0D, 0x77, 0x77, 0x30, 0x2C,\n    0x3C, 0x2B, 0x7E, 0x01, 0x90, 0xFD, 0xD7, 0xF1, 0x87, 0x03, 0x61, 0x87, 0x8B, 0x46, 0x5C, 0x02,\n    0x20, 0x5C, 0xB0, 0x8C, 0x56, 0x51, 0xA3, 0xFE, 0x15, 0x28, 0x24, 0xC7, 0x43, 0xE9, 0x15, 0x43,\n    0xA7, 0xD7, 0x21, 0x12, 0x88, 0xD5, 0x32, 0xAE, 0x04, 0xC8, 0x3E, 0x28, 0x7E, 0x08, 0xD4, 0x97,\n    0x5E, 0xCF, 0x60, 0xF1, 0x42, 0x96, 0x2B, 0xED, 0xAE, 0x71, 0x43, 0xD0, 0x04, 0x48, 0x65, 0x03,\n    0x9A, 0xFA, 0x77, 0x45, 0x5A, 0xFC, 0x48, 0x12, 0x16, 0xCF, 0xAF, 0x13, 0xE4, 0x03, 0xCC, 0x8F,\n    0xF4, 0xB5, 0x68, 0xB3, 0xF5, 0x53, 0x13, 0x42, 0x26, 0x8F, 0xB5, 0x71, 0x8E, 0x9B, 0xB3, 0x2E,\n    0xF6, 0x9F, 0x1E, 0x4A, 0xBC, 0xB9, 0xD8, 0xA5, 0x77, 0xCE, 0x95, 0x94, 0xE3, 0x9F, 0xD8, 0xAD,\n    0x53, 0x79, 0x03, 0xA6, 0x57, 0xF7, 0x13, 0xD5, 0x66, 0x25, 0x66, 0x88, 0x78, 0xF7, 0xF6, 0x35,\n    0xF9, 0xCC, 0x7F, 0xC6, 0x36, 0xAD, 0xC2, 0x70, 0x34, 0x94, 0xAA, 0xED, 0xCA, 0x4A, 0x14, 0x16,\n    0xF6, 0x6E, 0x46, 0xE8, 0x32, 0x63, 0xDF, 0x88, 0x66, 0x65, 0x6E, 0xA3, 0xCF, 0xDB, 0x1E, 0x5B,\n    0xFD, 0xCB, 0xB1, 0x99, 0x4A, 0x65, 0xD3, 0x24, 0xD8, 0xC9, 0xA1, 0xAA, 0x06, 0xA9, 0x4C, 0xF5,\n    0x7C, 0x9E, 0x98, 0x77, 0x12, 0xC2, 0xA9, 0xF9, 0x8D, 0x5F, 0x43, 0x1B, 0x9D, 0xEB, 0xD2, 0x28,\n    0x2C, 0x54, 0x60, 0x97, 0x5A, 0x70, 0x28, 0x78, 0xCA, 0x43, 0xD1, 0xBA, 0xA3, 0x5F, 0x49, 0x6A,\n    0x0C, 0x2A, 0x53, 0x09, 0xF8, 0x5E, 0x89, 0x5C, 0x6A, 0x5D, 0x2A, 0x8B, 0x58, 0x7D, 0x19, 0x1A,\n    0xF1, 0x1B, 0x5A, 0x12, 0xE7, 0x09, 0x9C, 0x88, 0xD5, 0xD7, 0x15, 0xFB, 0xDF, 0x62, 0xA9, 0x54,\n    0xD7, 0xD5, 0x7A, 0x2B, 0xBF, 0xCA, 0x0B, 0xB9, 0x07, 0xB4, 0xC9, 0x17, 0x81, 0x33, 0x07, 0x25,\n    0xE2, 0x0A, 0x6C, 0xF4, 0xD1, 0xF7, 0xF7, 0x65, 0xDE, 0x71, 0x00, 0x72, 0x9C, 0x2A, 0xBC, 0x31,\n    0xC0, 0x94, 0x85, 0x93, 0x9C, 0x65, 0xA6, 0xF1, 0x2F, 0x01, 0x8B, 0xD8, 0x66, 0x3E, 0x96, 0xB6,\n    0x96, 0xA0, 0x78, 0xA3, 0x85, 0x35, 0x6C, 0x3A, 0x37, 0x09, 0x76, 0x12, 0xB1, 0xA8, 0xC5, 0xE3,\n    0x53, 0xFB, 0x17, 0xB4, 0x10, 0xD1, 0x0F, 0xFA, 0xE7, 0x42, 0x58, 0x20, 0x72, 0x79, 0xC2, 0x94,\n    0xAF, 0xF7, 0x7D, 0x35, 0xD3, 0x48, 0x23, 0x67, 0x0F, 0xD7, 0x65, 0xE0, 0x48, 0x05, 0x7E, 0x09,\n    0xE6, 0x0A, 0x4B, 0xD2, 0xB0, 0xB9, 0x84, 0x12, 0xAF, 0x4B, 0x92, 0xDD, 0x30, 0x4B, 0x9F, 0xDC,\n    0xD5, 0x5D, 0xD4, 0x5A, 0x13, 0xE6, 0xB7, 0x18, 0x18, 0xC0, 0x52, 0x18, 0xBF, 0xC2, 0xB8, 0x7D,\n    0x2B, 0x2A, 0x36, 0x7A, 0x63, 0x6E, 0xF7, 0x59, 0x61, 0xC3, 0x97, 0x31, 0xDD, 0x61, 0x15, 0x1B,\n    0x30, 0xC3, 0xDD, 0xF5, 0x51, 0x2F, 0x77, 0xB4, 0x54, 0x6E, 0x4D, 0x98, 0x13, 0xDB, 0x3E, 0x4C,\n    0xA9, 0xCF, 0x77, 0xC8, 0x2D, 0x8E, 0x49, 0xDA, 0x67, 0xBA, 0x6C, 0x37, 0x54, 0xAB, 0x55, 0x80,\n    0x15, 0x94, 0x5F, 0xB6, 0x4D, 0x6B, 0xB3, 0xA3, 0x13, 0xBD, 0x7C, 0x47, 0xE3, 0xA5, 0x70, 0x9B,\n    0xEC, 0x5C, 0x94, 0x60, 0xC9, 0xEA, 0xD6, 0x64, 0xEE, 0x3B, 0x8F, 0x4E, 0xE2, 0x07, 0x61, 0xC6,\n    0xA4, 0x64, 0x8A, 0xA1, 0xF9, 0x57, 0xC2, 0xEA, 0x89, 0x95, 0x12, 0x67, 0xE0, 0xC6, 0xCF, 0x44,\n    0x40, 0x98, 0x8E, 0xB7, 0xDF, 0xFF, 0xCB, 0xAA, 0xEF, 0xC5, 0x72, 0x8D, 0xD4, 0xC7, 0x58, 0x60,\n    0x9D, 0xE1, 0xD6, 0x1D, 0x3A, 0x12, 0xBA, 0x5E, 0xA9, 0xAB, 0x21, 0xB9, 0x2E, 0xE0, 0x04, 0x47,\n    0x1B, 0xB2, 0x37, 0x28, 0xED, 0x7F, 0x7D, 0x24, 0x63, 0x2D, 0x98, 0x04, 0x4D, 0x1E, 0x6B, 0xE7,\n    0x11, 0x1C, 0xED, 0xB1, 0x02, 0x64, 0x63, 0x51, 0x71, 0x6E, 0xB1, 0x3D, 0xAD, 0xE1, 0xEB, 0x3B,\n    0x23, 0x51, 0xE3, 0x45, 0xA4, 0x83, 0xB2, 0x83, 0xD9, 0x43, 0x5C, 0xF6, 0x99, 0xDE, 0xC8, 0xD2,\n    0xB7, 0x11, 0x26, 0xF3, 0xEA, 0x69, 0xFE, 0x54, 0x22, 0x33, 0xCD, 0xDE, 0xE4, 0x2F, 0x65, 0x19,\n    0xA0, 0x3E, 0xDB, 0x4E, 0xB0, 0x4A, 0xFA, 0x57, 0x47, 0x13, 0x84, 0x7B, 0x73, 0x3B, 0x8E, 0xB1,\n    0x8A, 0x1C, 0x80, 0x0C, 0x9D, 0x67, 0xF3, 0xD5, 0x00, 0xD7, 0xDA, 0x92, 0xA5, 0xF7, 0xE4, 0x8D,\n    0x60, 0x48, 0xD2, 0x5C, 0xF6, 0x9A, 0x0D, 0x94, 0xE4, 0x19, 0x75, 0xCF, 0xE2, 0xCD, 0x22, 0xD5,\n    0x87, 0x9C, 0x36, 0x65, 0xC7, 0x36, 0x0D, 0x5B, 0x5C, 0x7A, 0x08, 0xC7, 0x98, 0xF5, 0xAE, 0x04,\n    0x45, 0xCE, 0x32, 0x1A, 0x25, 0xC9, 0x1F, 0x2E, 0x96, 0x95, 0x62, 0x97, 0x4C, 0x27, 0x82, 0xB9,\n    0x0A, 0xFA, 0x0D, 0xE3, 0xF1, 0xEA, 0xD6, 0x59, 0x3A, 0x6C, 0x9B, 0x28, 0xCA, 0x8A, 0x19, 0x79,\n    0x5C, 0xE9, 0xFF, 0xFD, 0x93, 0x54, 0x26, 0xF4, 0x09, 0x58, 0xB9, 0x41, 0x90, 0x2C, 0x74, 0x98,\n    0x45, 0x9A, 0x71, 0x12, 0x06, 0x52, 0xAA, 0x31, 0xAD, 0xEA, 0x97, 0x81, 0x33, 0xD6, 0xA3, 0x54,\n    0xCA, 0x9D, 0x5E, 0xF1, 0x87, 0xDD, 0xAB, 0x1E, 0xF1, 0x1B, 0xA4, 0xFD, 0x74, 0x60, 0x93, 0xD6,\n    0x01, 0x9F, 0x5C, 0x2D, 0x7D, 0xE7, 0xB8, 0x76, 0x36, 0x80, 0xD0, 0x63, 0x27, 0xC8, 0x94, 0x15,\n    0x4B, 0x1C, 0xC2, 0x6B, 0x67, 0x23, 0xEC, 0xAC, 0xD2, 0xEB, 0xC5, 0x5D, 0x78, 0x81, 0xD6, 0x30,\n    0xDD, 0xA6, 0x2C, 0xEE, 0x16, 0xDA, 0x8B, 0xA0, 0x9D, 0x20, 0xF8, 0x62, 0x87, 0x6D, 0xC2, 0x9C,\n    0x80, 0x53, 0x3C, 0x20, 0x06, 0x78, 0x71, 0xD7, 0xA6, 0x0D, 0xEA, 0xA8, 0x58, 0xA6, 0x21, 0x77,\n    0xCB, 0xD0, 0x6F, 0x05, 0x7A, 0x47, 0x1C, 0xFB, 0xA0, 0x4D, 0xD8, 0x22, 0xD1, 0xE3, 0x9B, 0x14,\n    0x98, 0xF4, 0xAE, 0x20, 0xEC, 0x64, 0xD9, 0xC6, 0xBF, 0xB1, 0x40, 0x1A, 0x4C, 0x66, 0xC3, 0x2B,\n    0xC0, 0xE7, 0xD3, 0x61, 0x4C, 0x6D, 0xF8, 0x5D, 0xC9, 0x33, 0x92, 0xC4, 0x1D, 0xA3, 0xF5, 0x69,\n    0x10, 0xF3, 0x4B, 0x31, 0x1C, 0x1D, 0x11, 0x8E, 0xB0, 0xF8, 0xD9, 0x3A, 0xBF, 0x06, 0xC1, 0xB0,\n    0x27, 0x8B, 0xB6, 0x9E, 0x7C, 0x6E, 0x27, 0x15, 0xF1, 0xE0, 0xE7, 0x31, 0x87, 0x10, 0x94, 0x2C,\n    0x0D, 0xC6, 0x75, 0x54, 0xD2, 0x5A, 0xE4, 0x25, 0xA7, 0xB9, 0x16, 0x4A, 0x93, 0x8E, 0x1D, 0x84,\n    0x06, 0xDC, 0x84, 0xDE, 0x57, 0x9D, 0xF7, 0xC1, 0x68, 0x08, 0x67, 0xFD, 0x5C, 0x38, 0x2A, 0xC9,\n    0x99, 0x28, 0xEC, 0x5D, 0xB4, 0x2A, 0xCA, 0xB3, 0xBC, 0x92, 0x0C, 0xFC, 0xC9, 0xED, 0x22, 0x52,\n    0x79, 0xC4, 0x04, 0x3F, 0xD0, 0x7D, 0x4B, 0xE0, 0x0C, 0x0F, 0x82, 0x00, 0xB8, 0x38, 0x70, 0x06,\n    0xC5, 0x34, 0x1E, 0x0D, 0x96, 0x7E, 0xDC, 0x94, 0x7E, 0x64, 0x47, 0xA9, 0x62, 0xAE, 0xA3, 0x8B,\n    0x6E, 0x0B, 0x1D, 0xB9, 0x8F, 0xE8, 0xAA, 0x57, 0xD7, 0xE3, 0x65, 0x15, 0x28, 0x88, 0xF5, 0x21,\n    0xF3, 0x38, 0xA4, 0xFC, 0xDB, 0x09, 0xC1, 0x7A, 0x7B, 0xA7, 0xFF, 0x0B, 0xA3, 0x18, 0xA2, 0x42,\n    0x28, 0x22, 0xB2, 0x95, 0x25, 0x56, 0x08, 0xFF, 0x3D, 0xB5, 0xF1, 0x41, 0x44, 0x34, 0x64, 0x67,\n    0x2C, 0xD5, 0xF0, 0x40, 0x9B, 0x82, 0x18, 0xAE, 0x8E, 0x74, 0xFE, 0x6D, 0xCC, 0x3E, 0x02, 0x13,\n    0x41, 0xC3, 0x32, 0x33, 0x76, 0x3A, 0x4A, 0x5B, 0xED, 0xFC, 0x64, 0xFB, 0x17, 0x2A, 0xB1, 0x9B,\n    0xF6, 0xB9, 0x45, 0x83, 0xBC, 0x42, 0x12, 0xAB, 0x91, 0xFD, 0x2A, 0x34, 0xE7, 0x56, 0xBA, 0xB8,\n    0x69, 0x81, 0xBA, 0x30, 0x6C, 0x8C, 0x4B, 0xAB, 0x1D, 0x47, 0x57, 0xAA, 0xE7, 0x3F, 0x25, 0x25,\n    0x7E, 0x6A, 0x2D, 0x35, 0x61, 0xB0, 0xC1, 0xAC, 0x81, 0xFE, 0xB5, 0x28, 0x7E, 0xFF, 0x6B, 0x6B,\n    0x71, 0xBA, 0x60, 0x0C, 0x56, 0xCC, 0x6D, 0xA2, 0x23, 0xB2, 0x2B, 0xFB, 0xCB, 0x16, 0x25, 0xFE,\n    0x6C, 0xAC, 0x81, 0x2E, 0xAC, 0x11, 0xB2, 0x79, 0xC8, 0x7A, 0x44, 0x0B, 0x82, 0xF8, 0xC6, 0xE0,\n    0x2D, 0x92, 0x58, 0x73, 0xAF, 0x8A, 0xD7, 0x3D, 0x2C, 0x05, 0x09, 0x54, 0x2F, 0xDE, 0x12, 0x17,\n    0xC5, 0xB1, 0x32, 0xFA, 0x58, 0xE4, 0x0F, 0x74, 0x1E, 0xAA, 0xAC, 0x3B, 0x35, 0xDF, 0x92, 0x9C,\n    0xB2, 0xC2, 0xA6, 0x90, 0x6D, 0xD4, 0xEB, 0x13, 0xA8, 0xEA, 0xC2, 0x61, 0xED, 0x67, 0x65, 0x44,\n    0xAD, 0x46, 0x28, 0x11, 0x0F, 0x46, 0x04, 0x49, 0xE6, 0x2E, 0x1A, 0xD6, 0x67, 0x72, 0x7C, 0x0D,\n    0x6A, 0x8A, 0xFA, 0xDB, 0x94, 0x66, 0x84, 0xF1, 0x31, 0x3F, 0x38, 0x1C, 0x04, 0xCF, 0x09, 0x52,\n    0x2F, 0xDB, 0xF6, 0x6F, 0xEB, 0x69, 0x03, 0x10, 0x92, 0xA0, 0x95, 0x0A, 0xE5, 0x52, 0x4A, 0x9B,\n    0xD7, 0x76, 0x05, 0x80, 0x07, 0x09, 0x4A, 0x3A, 0x37, 0xCD, 0xB3, 0x73, 0x64, 0x1F, 0xAB, 0x14,\n    0x57, 0xA0, 0xFF, 0x9B, 0x0D, 0x34, 0x56, 0x0A, 0x79, 0x79, 0x20, 0x7C, 0x4A, 0x52, 0xD8, 0xB4,\n    0x22, 0x45, 0x88, 0x90, 0xA0, 0x35, 0x36, 0x71, 0x9B, 0xD8, 0x2E, 0xC5, 0x89, 0x20, 0x54, 0x36,\n    0x7A, 0x47, 0x03, 0x45, 0xF8, 0xB2, 0x20, 0xD0, 0xBC, 0x84, 0x05, 0x40, 0xDB, 0xD4, 0xD0, 0x1C,\n    0x9E, 0xF0, 0x37, 0x02, 0x31, 0xD9, 0xDE, 0xBC, 0xBD, 0x87, 0x3E, 0xA7, 0x2A, 0xD9, 0x7E, 0x8B,\n    0xBD, 0xEF, 0x67, 0xC4, 0x06, 0x00, 0x43, 0xA7, 0x89, 0xE6, 0xA8, 0x7B, 0xBD, 0x03, 0xCB, 0xC8,\n    0x2F, 0x46, 0xEF, 0xA5, 0xEF, 0x16, 0x7D, 0xE3, 0xE9, 0x63, 0xCC, 0x89, 0xFC, 0xE5, 0x14, 0x40,\n    0x3A, 0x5A, 0xC8, 0xBC, 0xF6, 0xD9, 0x3D, 0xAC, 0x82, 0xB5, 0x7F, 0xB7, 0xE4, 0x8F, 0x5C, 0x0A,\n    0x5F, 0x6E, 0x0C, 0xF1, 0x7E, 0xAD, 0x12, 0xFA, 0x4E, 0x01, 0xC5, 0x62, 0xBF, 0x10, 0x27, 0xE7,\n    0x72, 0xC0, 0xC3, 0xA6, 0x8B, 0xF7, 0xD8, 0xA5, 0x52, 0x20, 0xA3, 0xEE, 0x70, 0xB0, 0xF6, 0xE2,\n    0x6A, 0x8D, 0x29, 0x73, 0x17, 0xBD, 0x68, 0x45, 0x25, 0x53, 0x68, 0xC5, 0x1B, 0xD5, 0xC1, 0xFF,\n    0x38, 0x17, 0x25, 0x47, 0x0C, 0x2E, 0xD4, 0x3E, 0xF7, 0x91, 0x36, 0x35, 0xAD, 0x72, 0xBE, 0x5A,\n    0x19, 0x04, 0x97, 0x77, 0x51, 0x5D, 0x2E, 0x51, 0xA7, 0xC3, 0x22, 0xEE, 0xE6, 0xC9, 0x9A, 0x3B,\n    0x9D, 0xA2, 0x84, 0xDE, 0x2B, 0x76, 0x62, 0x00, 0x2C, 0x4F, 0xA5, 0x12, 0xC5, 0x43, 0x8B, 0xD0,\n    0x13, 0x9E, 0x88, 0x3D, 0x33, 0xC3, 0xF4, 0x41, 0x6D, 0x00, 0x3B, 0xC3, 0xE1, 0xA1, 0x0A, 0x6A,\n    0x63, 0xE8, 0x42, 0x89, 0x05, 0xAF, 0xAA, 0x2B, 0x07, 0x25, 0x5B, 0xE1, 0xAA, 0xC6, 0xA7, 0xBD,\n    0x72, 0xC5, 0x17, 0x75, 0x53, 0x61, 0x20, 0x76, 0x14, 0xCC, 0x7A, 0x06, 0xF5, 0x21, 0xD2, 0x8F,\n    0x8F, 0x18, 0x5C, 0x50, 0xAA, 0x98, 0xA4, 0xB9, 0x7E, 0xBF, 0xD6, 0xBA, 0xEA, 0x9D, 0x64, 0xF3,\n    0x31, 0x4D, 0x48, 0x18, 0x58, 0xF0, 0x07, 0x23, 0xD6, 0x3E, 0xCA, 0xB4, 0x54, 0xE6, 0x04, 0x19,\n    0x18, 0xD5, 0xC7, 0x54, 0x85, 0x75, 0xA6, 0x58, 0x0E, 0xEB, 0x74, 0xD6, 0xF6, 0xAF, 0xB4, 0x9D,\n    0x70, 0xF0, 0x7B, 0x88, 0x8B, 0x8B, 0x64, 0x2C, 0x20, 0x40, 0x98, 0x5E, 0x2C, 0x64, 0xC6, 0x98,\n    0x26, 0x1D, 0x94, 0x90, 0x01, 0x03, 0x66, 0x5D, 0x6D, 0xC0, 0xBB, 0x5A, 0xC4, 0xF0, 0x0B, 0x78,\n    0x4E, 0x2E, 0x89, 0xA2, 0x86, 0x41, 0x90, 0x7B, 0x1D, 0x2C, 0x76, 0x17, 0xE5, 0x39, 0xE9, 0xF7,\n    0x00, 0xC0, 0x6B, 0x1F, 0x7E, 0xC1, 0xC2, 0x15, 0xA8, 0xA3, 0xF6, 0x7C, 0xF6, 0x19, 0x3F, 0xE0,\n    0xCE, 0xEF, 0x5C, 0x7B, 0x63, 0x63, 0xBE, 0x64, 0x33, 0x0E, 0x03, 0xFE, 0xF9, 0x03, 0xD9, 0xF7,\n    0xDF, 0x99, 0x37, 0x70, 0xAE, 0x6B, 0x90, 0x2A, 0x99, 0x14, 0x1D, 0x0C, 0x83, 0x6A, 0xC9, 0xEA,\n    0x34, 0x8C, 0xAC, 0x51, 0x30, 0x04, 0x4A, 0x71, 0xA8, 0x8E, 0xC6, 0xD8, 0x19, 0x70, 0xB0, 0xE4,\n    0x80, 0x55, 0x52, 0x09, 0x5E, 0x58, 0x22, 0xFF, 0x80, 0xC1, 0xAE, 0x0A, 0x87, 0xC7, 0xBE, 0xC7,\n    0x95, 0xEA, 0x98, 0x5A, 0xC0, 0x67, 0xA3, 0xDA, 0x68, 0xEF, 0xBA, 0x48, 0xF1, 0xA0, 0x2C, 0x33,\n    0x56, 0x1A, 0x45, 0xB8, 0xA3, 0x70, 0xA8, 0xD3, 0xB2, 0xCF, 0x1C, 0xC0, 0x02, 0x1E, 0xDA, 0x14,\n    0x0B, 0x2C, 0x03, 0xEA, 0xEC, 0x2E, 0x2B, 0x21, 0x1C, 0xE1, 0x99, 0xDF, 0x46, 0xD1, 0xC1, 0xE9,\n    0x00, 0x90, 0xB6, 0x7D, 0x79, 0xA2, 0x42, 0xF7, 0x0E, 0x67, 0xE3, 0x8B, 0xE1, 0x42, 0x26, 0x7A,\n    0x69, 0x82, 0x9D, 0x5C, 0x26, 0xFE, 0xE2, 0x6D, 0x51, 0x48, 0x74, 0x4A, 0xE1, 0xA7, 0x77, 0x07,\n    0x09, 0xA3, 0x30, 0x0B, 0x48, 0x4F, 0x64, 0xB1, 0x84, 0x91, 0xFF, 0x81, 0xFF, 0x5C, 0x94, 0x08,\n    0x44, 0xA8, 0xD6, 0x80, 0x5B, 0x26, 0xF7, 0x5A, 0xDC, 0xF0, 0xC1, 0x6D, 0xED, 0xAF, 0xC3, 0x8D,\n    0xFA, 0x54, 0xE4, 0xB1, 0x8F, 0x03, 0x45, 0x01, 0x63, 0x72, 0x17, 0x81, 0x21, 0x1D, 0x1E, 0xF3,\n    0x19, 0x2A, 0xD2, 0x43, 0x4C, 0x6E, 0xC8, 0x83, 0x13, 0x13, 0x4A, 0x00, 0x7E, 0xEF, 0x2D, 0x06,\n    0x07, 0x40, 0x81, 0x0A, 0xC3, 0xE8, 0x13, 0xF6, 0xDC, 0xD7, 0x2C, 0xEB, 0xEC, 0x7C, 0xF9, 0x7B,\n    0xC9, 0xD1, 0x79, 0x3A, 0x18, 0x74, 0xFF, 0xE8, 0xB3, 0xAC, 0x06, 0xDC, 0x68, 0x07, 0x35, 0x0A,\n    0x45, 0x67, 0x5B, 0xC8, 0x1C, 0x3D, 0x4F, 0x77, 0xCD, 0x1D, 0xEF, 0x2E, 0xBD, 0xA7, 0x2E, 0xD4,\n    0xD7, 0x2E, 0x32, 0xEC, 0x89, 0x42, 0x46, 0x4B, 0x68, 0x60, 0x86, 0x72, 0xA9, 0x9B, 0xC3, 0x36,\n    0xDE, 0x00, 0xBF, 0xCF, 0x4A, 0xFD, 0x2C, 0x98, 0xEE, 0x98, 0x6F, 0xD7, 0xA7, 0x7B, 0xE4, 0xDA,\n    0xF6, 0xE2, 0x6E, 0x33, 0x29, 0x7F, 0x7E, 0xA0, 0xE9, 0x6A, 0x07, 0x69, 0xA8, 0xF3, 0x65, 0xC6,\n    0x8F, 0x9D, 0x43, 0x88, 0xDB, 0xF9, 0x7A, 0x81, 0x7C, 0x8F, 0xF0, 0x99, 0xC7, 0x4A, 0x30, 0xC0,\n    0x5C, 0x15, 0x21, 0x00, 0xC7, 0x19, 0x23, 0x48, 0xD7, 0x4E, 0x64, 0x8C, 0xA4, 0x26, 0x94, 0x80,\n    0x24, 0xC1, 0xC1, 0x87, 0xC9, 0x55, 0x51, 0x90, 0x7F, 0x9A, 0xDB, 0x2A, 0x7E, 0x56, 0xCA, 0xE1,\n    0xDF, 0x81, 0xD9, 0x8B, 0x78, 0xAB, 0x7C, 0x65, 0x04, 0x69, 0x49, 0x6C, 0x42, 0x8D, 0x48, 0x24,\n    0x1C, 0xB7, 0x8A, 0x58, 0xAA, 0x18, 0x8E, 0xF3, 0xD1, 0x73, 0xB2, 0x20, 0xD9, 0x46, 0x0C, 0x5A,\n    0xBE, 0x76, 0x2E, 0x86, 0x9F, 0xD5, 0x15, 0xA9, 0x7C, 0x24, 0x09, 0x05, 0x0F, 0xF0, 0x3E, 0xB9,\n    0x9A, 0x12, 0x1A, 0xDC, 0x41, 0x5A, 0x9F, 0x50, 0x3C, 0x76, 0xE5, 0x21, 0x98, 0x33, 0x1A, 0xA1,\n    0x90, 0x2C, 0xF0, 0x22, 0x1A, 0x3D, 0x20, 0x24, 0xC4, 0x96, 0xC9, 0x13, 0xD5, 0x8D, 0x81, 0x89,\n    0xA1, 0x61, 0x88, 0xAA, 0xEC, 0x8C, 0xDC, 0x31, 0x7E, 0x3A, 0xFD, 0x6A, 0xBF, 0x8F, 0x97, 0x03,\n    0x67, 0x58, 0x31, 0xD3, 0x2D, 0x63, 0xFC, 0x67, 0x8D, 0x14, 0xC3, 0xEB, 0xB7, 0xF8, 0x3E, 0x85,\n    0xD3, 0x8F, 0x9E, 0xD7, 0xB4, 0x86, 0x3C, 0xDB, 0xD2, 0x5F, 0x0D, 0xD2, 0xB2, 0xD1, 0xFC, 0xA5,\n    0x95, 0x4E, 0x80, 0x9E, 0x4E, 0x8D, 0x93, 0xAD, 0xB3, 0xCA, 0x8A, 0xE0, 0xBC, 0x54, 0x7F, 0xD6,\n    0xB1, 0x74, 0xC0, 0xE8, 0x4A, 0xF5, 0xC7, 0x72, 0xA7, 0xB7, 0x42, 0x4D, 0xD9, 0x60, 0x15, 0xEB,\n    0xB6, 0x29, 0x02, 0x1F, 0x83, 0x78, 0x58, 0x09, 0x9E, 0x50, 0xA3, 0x39, 0xC6, 0x22, 0x1E, 0xD1,\n    0xE6, 0xB9, 0x5A, 0xA3, 0x6F, 0x80, 0x43, 0xA9, 0x58, 0x0B, 0x8C, 0x60, 0xF4, 0xC2, 0xD2, 0x0F,\n    0x9C, 0x78, 0xFE, 0xB1, 0x33, 0x01, 0x67, 0xFF, 0xEC, 0x93, 0xC1, 0x6C, 0x77, 0x04, 0x1E, 0xD7,\n    0xD2, 0x65, 0xDD, 0xF5, 0xAF, 0x6D, 0xC2, 0x04, 0x33, 0xF9, 0x38, 0x8F, 0xF3, 0xCF, 0x80, 0x7D,\n    0x46, 0xFA, 0x53, 0x58, 0x30, 0xA6, 0x0B, 0x47, 0xAE, 0xF0, 0xCB, 0x31, 0xA2, 0xC2, 0xB4, 0xB9,\n    0xA3, 0x8C, 0xA3, 0xAA, 0x48, 0xF5, 0x0E, 0x8E, 0x45, 0x92, 0x12, 0xFB, 0x17, 0x8F, 0xC3, 0x2C,\n    0x8D, 0xA7, 0x93, 0x2A, 0xB3, 0x76, 0x7B, 0x8D, 0xE6, 0x66, 0xBF, 0x9A, 0x88, 0x64, 0x91, 0x2C,\n    0xD5, 0x9D, 0xE6, 0x28, 0xD6, 0x91, 0x48, 0xAC, 0x5D, 0xCB, 0xE1, 0x9B, 0x1E, 0x9C, 0x73, 0xF4,\n    0xCB, 0x54, 0x3D, 0x72, 0xED, 0xA0, 0xFA, 0x97, 0x00, 0xCB, 0x32, 0x69, 0xCC, 0xB7, 0x00, 0x61,\n    0xE8, 0x97, 0x78, 0x79, 0xBA, 0x3D, 0x7B, 0x98, 0xA8, 0xBF, 0xA0, 0xF2, 0x3B, 0x23, 0x22, 0x02,\n    0x10, 0x16, 0xB2, 0x93, 0xE1, 0x74, 0x95, 0x65, 0xE5, 0x5F, 0x53, 0xEC, 0x70, 0x9F, 0x9F, 0xB6,\n    0xDD, 0x0B, 0xFF, 0xB4, 0x48, 0x34, 0x1F, 0xA1, 0xF6, 0xBF, 0x61, 0x36, 0x4B, 0xF2, 0xCD, 0xE4,\n    0xD6, 0x88, 0x08, 0x4A, 0x17, 0xE9, 0x33, 0xC6, 0xCA, 0x44, 0xD6, 0x00, 0xA1, 0x6D, 0x2C, 0xFD,\n    0x09, 0x80, 0x51, 0xB8, 0xDC, 0xA1, 0xF9, 0x7D, 0x55, 0x87, 0xE1, 0x52, 0x66, 0xF3, 0xA5, 0xF7,\n    0x0E, 0x61, 0xFC, 0x7B, 0xA5, 0xC0, 0x26, 0x82, 0x37, 0x7A, 0x2D, 0xBF, 0xEA, 0x0E, 0xBD, 0xF3,\n    0xCD, 0x50, 0x4C, 0x7E, 0x0F, 0xD2, 0xCC, 0x90, 0x81, 0x25, 0x28, 0xAF, 0xD5, 0x7E, 0x89, 0xA5,\n    0xA8, 0x18, 0x2C, 0x6B, 0x53, 0x07, 0x51, 0xE5, 0x09, 0x07, 0x3E, 0xCF, 0x58, 0xB8, 0x49, 0xCA,\n    0xE7, 0xA3, 0x36, 0x88, 0xAD, 0x46, 0xF4, 0x8F, 0xA9, 0x55, 0x53, 0x02, 0xED, 0x8D, 0xFE, 0x50,\n    0x20, 0xD6, 0x5E, 0xD4, 0xEB, 0x2B, 0x34, 0x3D, 0x04, 0x84, 0x39, 0x20, 0x16, 0xCD, 0xDF, 0x40,\n    0x06, 0x2E, 0xE1, 0xB7, 0x81, 0x13, 0xE3, 0xC2, 0x94, 0x5A, 0xFF, 0xE4, 0x4D, 0xBC, 0x1A, 0x80,\n    0x9A, 0x17, 0xBD, 0x1C, 0xD3, 0x2B, 0x3C, 0xDE, 0xE4, 0x77, 0xA6, 0x59, 0x48, 0x5A, 0x1C, 0xE1,\n    0x81, 0x89, 0xAF, 0x34, 0xBC, 0x2F, 0xC2, 0x69, 0x39, 0x9E, 0xE9, 0xEF, 0x9B, 0x72, 0x56, 0x19,\n    0x90, 0x5E, 0x54, 0x09, 0xF7, 0x5D, 0xBF, 0x04, 0x4F, 0x4D, 0x9A, 0x0B, 0x93, 0x55, 0x09, 0xDB,\n    0x63, 0xB1, 0xF3, 0x7C, 0xD8, 0xB0, 0x8A, 0x69, 0x43, 0x1E, 0x11, 0x3B, 0x57, 0x6C, 0x0B, 0x04,\n    0xC8, 0x38, 0xFF, 0x1F, 0x11, 0x07, 0xF7, 0x05, 0x9E, 0x15, 0x3E, 0xF9, 0x37, 0x34, 0x66, 0x33,\n    0x0B, 0x33, 0x01, 0xBE, 0x7B, 0xD6, 0xDA, 0x54, 0x38, 0xA9, 0x5B, 0x82, 0x83, 0xCC, 0x91, 0xD4,\n    0x89, 0xA2, 0x3F, 0x88, 0x46, 0x4A, 0x38, 0xE7, 0x23, 0x03, 0xCB, 0x80, 0x3B, 0xFA, 0xFE, 0xB9,\n    0x1E, 0xE9, 0x2D, 0x3C, 0x64, 0x60, 0x2D, 0xB6, 0xAC, 0xBA, 0xAB, 0xD6, 0x51, 0x15, 0xB2, 0x1A,\n    0xB6, 0x98, 0xBB, 0x67, 0x2D, 0x04, 0xBB, 0x78, 0x6D, 0xE5, 0xFB, 0x95, 0x8B, 0xE5, 0xCC, 0xAD,\n    0xE4, 0x15, 0xBB, 0x5F, 0xF0, 0x56, 0x41, 0x06, 0x4D, 0x21, 0x10, 0x61, 0x3C, 0x63, 0xAC, 0x59,\n    0x83, 0x2D, 0x4F, 0x0E, 0x52, 0xDB, 0x0A, 0x9D, 0x3B, 0xCB, 0x61, 0xAA, 0x4D, 0x84, 0xB2, 0xC2,\n    0xFC, 0x7E, 0x67, 0xD3, 0x86, 0x3E, 0x83, 0xF2, 0x6B, 0x1C, 0x8D, 0xD2, 0x6C, 0x55, 0x80, 0x14,\n    0x54, 0xC9, 0x14, 0x7E, 0x14, 0xD9, 0x2A, 0xEE, 0x53, 0xAE, 0xB8, 0x27, 0xB3, 0x34, 0x02, 0xD2,\n    0xFE, 0xA3, 0xC8, 0x75, 0x81, 0x6E, 0xC7, 0xCE, 0x83, 0xD5, 0xCB, 0xDF, 0x5C, 0xED, 0xD2, 0x5A,\n    0xCC, 0xA9, 0x4E, 0xD1, 0x0A, 0x50, 0x0C, 0x9D, 0x84, 0x79, 0x84, 0x6D, 0xA4, 0x41, 0x53, 0x69,\n    0x0E, 0x6C, 0x7D, 0x19, 0x66, 0x1D, 0x05, 0xCE, 0xF8, 0xBE, 0xCC, 0xF8, 0xC5, 0x22, 0x0B, 0x8A,\n    0x12, 0xC1, 0xB6, 0xF1, 0x96, 0xC7, 0xEA, 0xDC, 0xAE, 0x8D, 0xE9, 0x4A, 0x88, 0x8B, 0xC0, 0xA9,\n    0xBD, 0xE7, 0xA4, 0x61, 0x3C, 0xE7, 0x8A, 0xB5, 0x60, 0x5C, 0xA3, 0x02, 0x63, 0x6A, 0x3D, 0xE3,\n    0xBB, 0x25, 0x62, 0xA6, 0xC1, 0xFA, 0x37, 0x10, 0x51, 0x24, 0x85, 0x7A, 0x2F, 0x03, 0x07, 0x35,\n    0x0E, 0xDF, 0xFE, 0xA1, 0x81, 0x06, 0xCC, 0xC4, 0xBA, 0xFA, 0xE7, 0x92, 0x1E, 0xCA, 0xB2, 0x2C,\n    0x69, 0x92, 0xAD, 0x10, 0xDF, 0x14, 0xBA, 0xC0, 0xD1, 0xE0, 0x80, 0x56, 0x63, 0xF7, 0x02, 0x63,\n    0x9B, 0x2C, 0xEA, 0xE6, 0x07, 0x14, 0x77, 0x30, 0xD9, 0x9A, 0xA5, 0xEF, 0xE8, 0xF1, 0x69, 0xA9,\n    0x8B, 0x74, 0xD6, 0xCB, 0x4A, 0xAB, 0x3E, 0xD0, 0x05, 0xCF, 0xC7, 0xCB, 0x5F, 0x77, 0x61, 0x0B,\n    0xF3, 0xEF, 0x84, 0x42, 0x63, 0x1A, 0x08, 0x90, 0x38, 0xCC, 0xCC, 0x77, 0x73, 0xF4, 0x10, 0x16,\n    0x3B, 0x88, 0x6A, 0x36, 0x7F, 0x3D, 0x1B, 0x47, 0xA8, 0x43, 0x13, 0xDE, 0x0F, 0x3E, 0xF8, 0x32,\n    0xEB, 0xE0, 0x13, 0x3F, 0xE9, 0x45, 0x64, 0x17, 0xAD, 0x1D, 0x94, 0x00, 0x89, 0x5B, 0xDD, 0x1B,\n    0xD8, 0xCC, 0x3C, 0x2A, 0x48, 0xB3, 0xF8, 0xB8, 0xF1, 0xC1, 0x3D, 0x36, 0x45, 0xB6, 0xDC, 0x29,\n    0x47, 0x8F, 0x1D, 0x5B, 0x3C, 0x11, 0xF1, 0xEC, 0xA0, 0xB6, 0x74, 0xBF, 0xF0, 0x55, 0xC6, 0x52,\n    0x65, 0x24, 0x6E, 0x75, 0xE5, 0xC0, 0x3D, 0xE1, 0x34, 0x50, 0xB2, 0xB1, 0xD2, 0xC4, 0x69, 0xAB,\n    0x31, 0xB5, 0xFD, 0x10, 0xAD, 0x10, 0x00, 0x18, 0x87, 0x0B, 0x63, 0xEC, 0x74, 0x72, 0x07, 0xCC,\n    0x6B, 0xD8, 0x46, 0x69, 0x4A, 0x3A, 0xD1, 0x2B, 0x25, 0x6C, 0xF7, 0x45, 0x84, 0x1D, 0x97, 0x63,\n    0x70, 0x68, 0xF4, 0x8B, 0x33, 0x4A, 0xE5, 0x16, 0x81, 0xD2, 0x50, 0x2B, 0xD8, 0x51, 0xEC, 0x33,\n    0xDB, 0xC8, 0xC0, 0x50, 0xE3, 0xF0, 0x1B, 0x57, 0xFC, 0xC9, 0x7D, 0x7A, 0xC4, 0xA4, 0xF3, 0x39,\n    0x73, 0xAB, 0xAE, 0x42, 0x71, 0x4B, 0xF0, 0xD1, 0xAD, 0xF4, 0x67, 0x3A, 0x9E, 0xFD, 0xA9, 0xA7,\n    0x22, 0xF9, 0x06, 0x93, 0xEE, 0xBA, 0x96, 0xB4, 0x31, 0x69, 0x41, 0x8A, 0x6D, 0x8D, 0x7C, 0xBA,\n    0x03, 0xBB, 0x56, 0x91, 0xAA, 0x63, 0x58, 0xC0, 0x99, 0x61, 0xF8, 0x83, 0x65, 0x9D, 0x0B, 0x95,\n    0x64, 0x6D, 0xD6, 0x24, 0x9D, 0x52, 0x6F, 0x4A, 0x46, 0xDD, 0x77, 0x09, 0x10, 0x4B, 0x4F, 0x94,\n    0x82, 0x3E, 0xA6, 0xB4, 0x48, 0xE9, 0x9D, 0x5E, 0x8D, 0x79, 0x36, 0xDD, 0x4A, 0xF4, 0x23, 0x79,\n    0x10, 0x38, 0xF4, 0x4D, 0x53, 0xA4, 0xB9, 0xD1, 0xC3, 0xF3, 0x79, 0x31, 0xC3, 0x63, 0xBD, 0x71,\n    0x0B, 0x6A, 0x0C, 0x5F, 0x08, 0x6E, 0xB5, 0x36, 0x89, 0x03, 0x16, 0x5D, 0x26, 0xCE, 0x9C, 0xBF,\n    0x8F, 0x7E, 0x8D, 0x9A, 0x0B, 0x01, 0x77, 0xD1, 0x94, 0xA9, 0x39, 0x04, 0x20, 0x02, 0xF0, 0x90,\n    0x4A, 0x89, 0xF0, 0x6F, 0x22, 0xD9, 0xC5, 0x05, 0xDD, 0x2A, 0xB7, 0xDA, 0x78, 0x9A, 0x2C, 0xEB,\n    0xA0, 0x43, 0xE8, 0xAB, 0x82, 0xA4, 0xF2, 0x5F, 0xA2, 0xFA, 0xC3, 0x30, 0x3E, 0x75, 0xCE, 0x2A,\n    0xFC, 0x5B, 0x46, 0x87, 0x94, 0xC8, 0x6E, 0x3A, 0x97, 0x07, 0x31, 0x1D, 0x80, 0xE0, 0xD8, 0xC7,\n    0x80, 0x43, 0x47, 0xC5, 0xA3, 0xBD, 0xFA, 0x47, 0x6B, 0x09, 0x21, 0xF8, 0x2D, 0xA0, 0xFE, 0x41,\n    0x78, 0xC1, 0x44, 0x54, 0xE5, 0xAD, 0x1E, 0xCF, 0x9B, 0x67, 0xED, 0x27, 0x5C, 0x76, 0x1A, 0x16,\n    0x08, 0x8A, 0x70, 0x7D, 0x74, 0x93, 0x0B, 0x01, 0x7A, 0x3E, 0x5E, 0x15, 0xBD, 0x4B, 0xFC, 0x29,\n    0x34, 0x11, 0x43, 0x95, 0x0F, 0xE7, 0x50, 0xCC, 0xAD, 0xE3, 0xD4, 0x1F, 0x53, 0x5B, 0x85, 0x52,\n    0x72, 0x3C, 0x65, 0x2F, 0xFA, 0x34, 0xD7, 0x1C, 0xAF, 0x81, 0x74, 0x7F, 0xCD, 0x2C, 0x14, 0x08,\n    0xD6, 0x72, 0xA6, 0xBF, 0x7F, 0x5B, 0x23, 0x74, 0x55, 0xFD, 0xBF, 0x58, 0x4C, 0x1F, 0x26, 0x4C,\n    0x77, 0xDA, 0x0B, 0x11, 0xDD, 0x11, 0x99, 0x10, 0xB6, 0x9A, 0xE5, 0x77, 0xA5, 0x63, 0x81, 0xF7,\n    0x2B, 0x9D, 0x8E, 0xD1, 0xFE, 0xF8, 0x8D, 0x8E, 0x24, 0x12, 0x5B, 0x7D, 0x3A, 0xDD, 0x49, 0xAD,\n    0x06, 0xEE, 0x1F, 0x8C, 0x95, 0x9A, 0x8F, 0x2C, 0xEF, 0xF5, 0x85, 0x61, 0xAF, 0x09, 0xB0, 0x27,\n    0x16, 0x48, 0xC6, 0x37, 0x2D, 0x0A, 0x17, 0xC4, 0xDA, 0x53, 0x51, 0xEB, 0x42, 0x95, 0xCA, 0x14,\n    0x32, 0x93, 0x5B, 0x40, 0x92, 0x08, 0x6A, 0xE9, 0xB3, 0x66, 0x9D, 0xE0, 0x81, 0x57, 0x9A, 0x38,\n    0x4A, 0x23, 0xFE, 0x8F, 0x02, 0x65, 0x33, 0x35, 0x55, 0xB8, 0xB2, 0x34, 0x9D, 0xD2, 0xDC, 0xD7,\n    0xF4, 0x19, 0x1D, 0x83, 0x2A, 0x91, 0xF0, 0x84, 0xD6, 0x7F, 0x45, 0x63, 0x6E, 0x4F, 0x0E, 0x7E,\n    0x59, 0xBC, 0x22, 0x92, 0xD4, 0xC5, 0xCF, 0xE8, 0xED, 0x15, 0x8C, 0xB5, 0xAA, 0x43, 0x17, 0xE0,\n    0x46, 0x04, 0x7A, 0x80, 0x15, 0x0A, 0x40, 0xE8, 0x6E, 0x4E, 0x53, 0x10, 0x7E, 0xB1, 0x71, 0x43,\n    0x20, 0x14, 0xA3, 0xF5, 0xD2, 0x04, 0x37, 0x90, 0xA8, 0xBF, 0x4C, 0x4E, 0x1E, 0xB7, 0xCE, 0x0F,\n    0x0C, 0xD1, 0x82, 0x64, 0x4B, 0x79, 0x47, 0x12, 0xE6, 0x7A, 0x4E, 0xC1, 0xAD, 0xFD, 0xFE, 0x31,\n    0x09, 0x36, 0x41, 0x24, 0x0A, 0xCF, 0x20, 0x0C, 0xC3, 0x04, 0x57, 0x39, 0xDD, 0x9C, 0x3E, 0x2E,\n    0xED, 0xAD, 0x96, 0x20, 0xBD, 0xC6, 0xB7, 0x18, 0xEC, 0x03, 0x2E, 0xFC, 0x45, 0x93, 0xD2, 0x09,\n    0x13, 0xAE, 0xB8, 0x22, 0xFB, 0x4B, 0xB4, 0x7D, 0x0F, 0x5E, 0x9F, 0xE1, 0xFB, 0x94, 0xA4, 0xC7,\n    0x07, 0x9E, 0x72, 0x48, 0x7F, 0xEC, 0xC5, 0x0A, 0x19, 0xD5, 0x54, 0x2B, 0x77, 0x16, 0x0A, 0xDC,\n    0x22, 0xC7, 0x03, 0x12, 0x9E, 0x11, 0xAC, 0x70, 0x44, 0x1D, 0xA4, 0xC5, 0xE2, 0x19, 0x9B, 0xE3,\n    0xDC, 0x05, 0x36, 0x30, 0x92, 0xCC, 0xC3, 0xF7, 0xCF, 0xD5, 0x67, 0x3C, 0xF7, 0x99, 0x37, 0x16,\n    0xB3, 0x38, 0x38, 0xEE, 0x66, 0x7C, 0x80, 0xFD, 0x02, 0x94, 0xFA, 0x1F, 0x10, 0xD9, 0xA8, 0x45,\n    0x58, 0x91, 0x85, 0xDA, 0x1F, 0xF2, 0x6B, 0xE3, 0x8F, 0x09, 0xB8, 0xA1, 0x17, 0xA2, 0xF0, 0x75,\n    0x5B, 0x5D, 0xEC, 0x39, 0x86, 0x0C, 0x88, 0xAE, 0xF6, 0x99, 0x7F, 0x55, 0x70, 0x52, 0xF0, 0x63,\n    0x66, 0x75, 0x80, 0xF4, 0x87, 0x13, 0x01, 0x26, 0x82, 0x39, 0xE3, 0x2F, 0xE2, 0x5F, 0xCF, 0xFC,\n    0x22, 0x28, 0xE9, 0x75, 0x8F, 0xCD, 0x7A, 0x03, 0x77, 0xB0, 0x4E, 0x19, 0x03, 0x73, 0x2B, 0xFB,\n    0x87, 0xF4, 0x94, 0x18, 0xF8, 0xF7, 0xCB, 0x94, 0x7C, 0xB9, 0x54, 0xD5, 0xED, 0xC5, 0x47, 0x3B,\n    0x12, 0xA1, 0x65, 0x05, 0x39, 0x45, 0x5A, 0x51, 0x75, 0x3B, 0xC8, 0x84, 0x6F, 0x1F, 0x5D, 0x6C,\n    0x7E, 0xBE, 0xE2, 0x42, 0x1A, 0xD8, 0x74, 0x0D, 0x17, 0x62, 0x9B, 0xBE, 0xDF, 0x55, 0x15, 0x50,\n    0xC4, 0xDF, 0x95, 0x92, 0x9D, 0xCD, 0xA2, 0x3F, 0x38, 0x5C, 0x09, 0x51, 0xBB, 0xF4, 0xD8, 0xE9,\n    0xEF, 0xB0, 0x88, 0x0C, 0x92, 0x7F, 0xCB, 0x01, 0x91, 0x13, 0x7A, 0x44, 0xA1, 0x98, 0x2E, 0x0E,\n    0x12, 0x63, 0xA7, 0xBC, 0xD3, 0x0C, 0x07, 0xE0, 0xD4, 0x72, 0xF5, 0x45, 0xCE, 0x44, 0x4D, 0xF8,\n    0x76, 0xF9, 0x1A, 0x1C, 0xF5, 0x80, 0xB2, 0x93, 0x23, 0x93, 0x9B, 0xEE, 0x99, 0x35, 0xE4, 0xBB,\n    0xE9, 0x4D, 0x72, 0xFC, 0xA0, 0xE6, 0x7B, 0x27, 0x67, 0x11, 0x88, 0x9B, 0xAA, 0x38, 0x8D, 0x6C,\n    0x33, 0x52, 0x5D, 0xD6, 0x22, 0xF4, 0xBC, 0xD1, 0xCD, 0x9C, 0x74, 0x3A, 0xEA, 0x2B, 0xB0, 0x20,\n    0x2E, 0xAA, 0x75, 0xF2, 0xD6, 0xDA, 0xFB, 0x93, 0xDB, 0x71, 0xB6, 0x07, 0xD9, 0x85, 0xCA, 0xBB,\n    0x45, 0x97, 0x00, 0x42, 0xA8, 0xD1, 0xA3, 0x44, 0x13, 0x66, 0xAF, 0x0A, 0xA0, 0xEB, 0x2F, 0xA3,\n    0x27, 0x64, 0x78, 0x46, 0x9C, 0xE4, 0x99, 0xA5, 0x47, 0x96, 0xC1, 0xD1, 0x99, 0x5C, 0x9A, 0x6A,\n    0xBA, 0x5E, 0xC6, 0xBA, 0xEB, 0x63, 0x19, 0x6F, 0xC9, 0xDB, 0x36, 0xD8, 0xAD, 0x58, 0x44, 0x30,\n    0x8F, 0x59, 0x19, 0x42, 0xAF, 0x6A, 0x1B, 0x8A, 0xC9, 0xA2, 0xAE, 0x00, 0x5D, 0x5A, 0x09, 0x33,\n    0xAC, 0x02, 0xDA, 0x64, 0xAF, 0xDD, 0xDF, 0x15, 0x2A, 0xA2, 0xD2, 0xA1, 0xA6, 0x93, 0x5C, 0xE1,\n    0x10, 0xC3, 0x6A, 0x10, 0xA5, 0x97, 0x2D, 0x6D, 0xD9, 0xA9, 0xB5, 0x36, 0x71, 0x54, 0xC4, 0xEF,\n    0xC8, 0xC6, 0x17, 0x30, 0xDD, 0xCF, 0x96, 0x86, 0xC8, 0x63, 0x60, 0x21, 0xAB, 0x3D, 0xBA, 0x40,\n    0x8F, 0x30, 0x16, 0xBE, 0xD9, 0xDF, 0x7E, 0x13, 0xCB, 0xBF, 0xF7, 0x0E, 0x33, 0x31, 0x18, 0xED,\n    0x1E, 0x47, 0xD8, 0xF2, 0xCF, 0x42, 0xC8, 0xF3, 0x2C, 0x20, 0x00, 0xB1, 0x8F, 0xB9, 0x1F, 0xEA,\n    0x82, 0x11, 0x03, 0x8D, 0xB5, 0x25, 0xB4, 0x84, 0x79, 0x97, 0xDC, 0x56, 0x3C, 0x8B, 0x41, 0x9A,\n    0x01, 0x63, 0x7A, 0xF7, 0x66, 0x0F, 0x05, 0xF7, 0x4A, 0xDC, 0x05, 0x03, 0x29, 0x5C, 0xF1, 0x89,\n    0x8D, 0x38, 0x19, 0x48, 0x38, 0xBE, 0x82, 0xCD, 0x04, 0x16, 0xEC, 0xD6, 0x68, 0xB8, 0x00, 0x3D,\n    0xC6, 0x6E, 0xDA, 0x10, 0x0F, 0x12, 0x19, 0x18, 0xAE, 0x24, 0x29, 0x2E, 0xD1, 0x5D, 0xD3, 0xA2,\n    0x7A, 0x8A, 0x10, 0x20, 0xB5, 0x8A, 0xD4, 0x41, 0x66, 0x8E, 0x00, 0x9E, 0x29, 0x11, 0x3A, 0xBD,\n    0xEA, 0x66, 0xA6, 0x18, 0x87, 0xD3, 0xEE, 0x0F, 0x17, 0xE5, 0x5B, 0xB9, 0x16, 0x56, 0x22, 0xDD,\n    0x9C, 0xB6, 0x02, 0xBD, 0x6C, 0x19, 0xBA, 0x85, 0x1F, 0x44, 0xB7, 0x88, 0x43, 0x45, 0xBE, 0x29,\n    0x65, 0xA2, 0xBE, 0xC1, 0x4E, 0xCF, 0x25, 0x53, 0xD6, 0xC2, 0x53, 0x59, 0xF9, 0xA3, 0xC3, 0x52,\n    0x9C, 0xEE, 0xE0, 0x92, 0x39, 0x20, 0x97, 0xA0, 0xF7, 0x8C, 0x58, 0x8B, 0x7A, 0xEA, 0x05, 0x7B,\n    0x6B, 0x92, 0x65, 0xAC, 0x63, 0x9C, 0x11, 0x06, 0xB5, 0x2F, 0xC2, 0x5D, 0x97, 0x55, 0x88, 0x25,\n    0x3C, 0x37, 0xE8, 0x8D, 0xBE, 0xB2, 0x3C, 0xFB, 0xC5, 0x0D, 0xD9, 0x6B, 0xA6, 0x7F, 0xD4, 0xD7,\n    0xB9, 0xB8, 0x56, 0xC3, 0x9B, 0xA0, 0x75, 0x7B, 0x3D, 0x5D, 0xF4, 0x53, 0xED, 0xF7, 0xBF, 0xA7,\n    0xD9, 0xD8, 0x0C, 0x14, 0x4F, 0xD6, 0xA4, 0xAC, 0xB3, 0x33, 0x44, 0x62, 0x04, 0x52, 0xB4, 0xA2,\n    0xE3, 0x1E, 0x46, 0x73, 0x78, 0x92, 0x66, 0x24, 0xEB, 0x43, 0x46, 0xEC, 0x6C, 0x1D, 0x7B, 0xA1,\n    0x0B, 0x55, 0xCB, 0xA1, 0xF7, 0x7F, 0xCA, 0x78, 0x46, 0x22, 0x8F, 0xD7, 0xB2, 0x42, 0x86, 0x4A,\n    0xE9, 0xCC, 0xFC, 0x77, 0x88, 0x84, 0x95, 0x0A, 0x24, 0x8B, 0xB5, 0xC2, 0x66, 0x6B, 0xA3, 0x91,\n    0x47, 0xFD, 0x5B, 0x87, 0x9B, 0xE0, 0xBF, 0xB0, 0x49, 0x38, 0xD9, 0x6D, 0x05, 0x7A, 0x53, 0xFF,\n    0xDC, 0xE8, 0x9C, 0xB9, 0xAF, 0x59, 0xFD, 0xE5, 0xD4, 0xE3, 0x3A, 0x58, 0xCD, 0xA7, 0x9C, 0x6F,\n    0xE0, 0x19, 0x17, 0xB4, 0x14, 0xFD, 0x16, 0xD5, 0x39, 0x77, 0x8F, 0xCE, 0x7F, 0xC0, 0xF1, 0x5F,\n    0xE1, 0x69, 0x26, 0x89, 0x4C, 0x43, 0xCA, 0xD7, 0x37, 0x51, 0x12, 0x6B, 0x45, 0x3D, 0x8B, 0xD9,\n    0xD7, 0x8B, 0xDB, 0x22, 0x33, 0x79, 0x34, 0x56, 0xE7, 0xDC, 0x00, 0xBD, 0xD1, 0x98, 0x52, 0xAC,\n    0x1D, 0x47, 0x69, 0xFF, 0x88, 0xBF, 0x15, 0x3F, 0x7D, 0xDF, 0x12, 0x26, 0xF7, 0x1F, 0xBD, 0xD4,\n    0x13, 0x52, 0x86, 0xB5, 0x2F, 0x4F, 0x0F, 0xD2, 0x44, 0x6A, 0xB7, 0x71, 0x67, 0x69, 0x2E, 0x76,\n    0x56, 0x82, 0xFA, 0x88, 0x8B, 0xE2, 0x80, 0x45, 0x31, 0x4E, 0xE8, 0xEF, 0xFC, 0x48, 0xEA, 0x2E,\n    0x10, 0x9C, 0x73, 0x12, 0x89, 0xA6, 0x17, 0x3A, 0xFE, 0x2E, 0x4C, 0x33, 0x97, 0x54, 0x3C, 0x8D,\n    0x0F, 0xAC, 0xA5, 0xD0, 0x71, 0x62, 0x73, 0x97, 0xF8, 0xED, 0xD5, 0xCF, 0xC5, 0x18, 0x67, 0x1A,\n    0x1C, 0xE2, 0xA6, 0x2E, 0xD1, 0x51, 0x74, 0x57, 0xD3, 0xE8, 0x6E, 0x60, 0x00, 0x96, 0x2D, 0x3E,\n    0x7F, 0xD3, 0x05, 0xB0, 0x22, 0xC2, 0x0F, 0xF4, 0x69, 0x73, 0xAF, 0xC2, 0x02, 0x22, 0x40, 0xF9,\n    0x6F, 0x35, 0x13, 0x04, 0xA4, 0x48, 0xD3, 0xE7, 0xEE, 0x88, 0xC4, 0x03, 0xD5, 0x0D, 0x90, 0x48,\n    0x97, 0x8A, 0x9D, 0x12, 0x02, 0xE9, 0x04, 0xD4, 0x2A, 0xA6, 0x13, 0xF6, 0x04, 0x3C, 0x76, 0x0D,\n    0x37, 0xBB, 0xF5, 0x8A, 0x12, 0x04, 0x3A, 0xFE, 0xAC, 0xA7, 0x8D, 0xB8, 0x6E, 0xC4, 0xA5, 0x26,\n    0x84, 0xFF, 0xEA, 0x81, 0x8D, 0x33, 0x2D, 0xF0, 0x9D, 0x0B, 0xFB, 0x04, 0x7B, 0x46, 0x71, 0x57,\n    0xA0, 0x24, 0xD9, 0xF6, 0x8A, 0x44, 0x16, 0xE1, 0x7F, 0x28, 0xD2, 0xC5, 0xC2, 0xEF, 0x8D, 0xA9,\n    0x63, 0x8B, 0x6B, 0x98, 0x50, 0x1A, 0xB4, 0x66, 0xFB, 0xCD, 0x3D, 0x1E, 0x79, 0x86, 0x22, 0xA3,\n    0xB3, 0x78, 0xBF, 0x0D, 0x2E, 0x66, 0x45, 0x0A, 0xA0, 0x58, 0xE9, 0x4D, 0x52, 0x5E, 0x9E, 0x07,\n    0xAD, 0x05, 0x3D, 0x35, 0x17, 0xA2, 0x65, 0x0C, 0xFE, 0x80, 0x56, 0x81, 0x8C, 0x5D, 0x08, 0x0B,\n    0x15, 0x75, 0x0E, 0x88, 0x19, 0x34, 0x2D, 0xB7, 0x88, 0x92, 0x6C, 0xC9, 0xF3, 0xDF, 0x19, 0xB6,\n    0x6D, 0xAB, 0x58, 0x13, 0x6E, 0xCE, 0xC9, 0x9A, 0x07, 0xF9, 0x34, 0x9C, 0x5C, 0x9E, 0x33, 0x8F,\n    0x11, 0xCA, 0xA5, 0x1D, 0xD4, 0xDA, 0xC7, 0x8C, 0x3B, 0x61, 0xBF, 0x8D, 0xCB, 0x69, 0xFF, 0x36,\n    0x8E, 0x0C, 0xAD, 0xF4, 0x32, 0xC3, 0x20, 0x57, 0xCE, 0x19, 0xAD, 0x61, 0xB0, 0x2C, 0xB0, 0xCD,\n    0xA4, 0xBD, 0xE0, 0xFC, 0x73, 0x3F, 0xA6, 0xE9, 0x72, 0x6E, 0xB8, 0x84, 0x2F, 0x6A, 0xE8, 0xAF,\n    0x58, 0xC6, 0x64, 0xD7, 0xA0, 0x3F, 0x36, 0x63, 0x95, 0x72, 0x06, 0x8B, 0xA7, 0xE5, 0xB4, 0x25,\n    0xC7, 0xB7, 0xB7, 0xBD, 0xFA, 0xF2, 0xCD, 0x28, 0xDD, 0xC2, 0x80, 0x7B, 0x45, 0xFA, 0x8D, 0xCF,\n    0xD2, 0x5E, 0xB8, 0x0C, 0xA1, 0x40, 0xC7, 0x40, 0xCB, 0x0D, 0xF4, 0x61, 0xAC, 0x20, 0x45, 0x58,\n    0xB7, 0x56, 0x2A, 0xE6, 0x2E, 0x64, 0xFF, 0xC3, 0xC7, 0xE1, 0xF6, 0xB3, 0xE8, 0x42, 0x3F, 0xB5,\n    0x26, 0x4F, 0x49, 0x02, 0x39, 0x91, 0x2C, 0x49, 0x70, 0xDA, 0x87, 0x86, 0xA4, 0x29, 0x36, 0x62,\n    0xF8, 0x2F, 0xBD, 0xD0, 0xF1, 0x0B, 0xD3, 0xEB, 0x8A, 0x68, 0x13, 0xD6, 0x9C, 0xC8, 0x78, 0x28,\n    0xBD, 0xAA, 0xDF, 0xEA, 0x72, 0xCD, 0x03, 0x83, 0xE9, 0xBB, 0x3C, 0x6F, 0x75, 0x1F, 0xAF, 0x67,\n    0x47, 0x5E, 0x01, 0xC1, 0x88, 0xE9, 0x9B, 0xB0, 0xF9, 0x65, 0xF6, 0x8D, 0x79, 0x2A, 0xA9, 0xC9,\n    0x3C, 0xF3, 0x24, 0x19, 0x22, 0x81, 0x32, 0x9E, 0xBE, 0xFA, 0xB4, 0x53, 0x17, 0x64, 0x02, 0x8C,\n    0x7C, 0x18, 0x21, 0x01, 0xF2, 0x14, 0xE8, 0x6E, 0xAE, 0x3E, 0xAE, 0x60, 0xB1, 0x4C, 0x51, 0x9B,\n    0xBA, 0x28, 0x24, 0xA0, 0xB9, 0xFC, 0xEA, 0xE5, 0x9C, 0xA7, 0x18, 0xE2, 0x35, 0x05, 0x07, 0x19,\n    0xAD, 0xE8, 0x02, 0x71, 0x17, 0x53, 0x20, 0x4A, 0xCD, 0x33, 0xC6, 0xB3, 0x70, 0x9F, 0x46, 0x24,\n    0xEB, 0xA8, 0x18, 0x24, 0x99, 0xD4, 0x87, 0x16, 0x00, 0xBE, 0xF4, 0x41, 0x6C, 0xBF, 0x45, 0xE3,\n    0xF7, 0x6F, 0xD1, 0x0A, 0x4A, 0x6A, 0x23, 0x5D, 0x0B, 0xFA, 0xB5, 0x71, 0x97, 0xE2, 0x6B, 0xD3,\n    0x81, 0xB9, 0x49, 0xBC, 0xC4, 0x3C, 0xB2, 0x0C, 0x15, 0x77, 0x8E, 0x5A, 0xC0, 0x89, 0x5F, 0x9A,\n    0x93, 0x9A, 0x75, 0xB2, 0xA4, 0xE2, 0x7E, 0x5A, 0x9C, 0x0A, 0x7E, 0x8C, 0xDD, 0x9F, 0x31, 0x10,\n    0x95, 0x8D, 0x57, 0x0E, 0xB7, 0xDD, 0x8B, 0xE7, 0x39, 0xAC, 0x79, 0x11, 0x51, 0x3C, 0xBB, 0x21,\n    0x58, 0xD7, 0x23, 0xFA, 0x63, 0xFD, 0x21, 0x85, 0x3F, 0x5F, 0x85, 0xF0, 0x3C, 0xF8, 0xE9, 0x40,\n    0x72, 0x92, 0x79, 0xCF, 0x21, 0x14, 0xED, 0xAB, 0xB9, 0xC3, 0xCF, 0x10, 0x85, 0x28, 0x3B, 0x81,\n    0xB6, 0x6E, 0x99, 0x18, 0x7C, 0xD9, 0x36, 0x11, 0x22, 0x6C, 0xF8, 0x83, 0xB2, 0x51, 0xD3, 0xF7,\n    0x42, 0x37, 0xD4, 0xBA, 0x85, 0xB7, 0x9E, 0x6C, 0x61, 0xB3, 0xDB, 0x6F, 0x79, 0xF2, 0x34, 0xA7,\n    0x29, 0x3C, 0xE9, 0x2B, 0x2B, 0x0B, 0xF4, 0x5F, 0x47, 0x96, 0x14, 0x36, 0xA4, 0x2F, 0x67, 0x54,\n    0x77, 0x48, 0x2B, 0x5F, 0x4A, 0x1F, 0xB2, 0xE5, 0xFF, 0x38, 0xE4, 0xE2, 0xAE, 0x76, 0xB1, 0x66,\n    0x7F, 0x01, 0xE8, 0x31, 0xA4, 0x24, 0xBA, 0x95, 0xAB, 0x0A, 0x9B, 0x1F, 0xC4, 0x04, 0x59, 0x9C,\n    0x0D, 0xD0, 0x3D, 0x2E, 0x7F, 0xCE, 0xBE, 0xD2, 0x93, 0x2A, 0xB0, 0x95, 0x22, 0xA5, 0xE9, 0xE4,\n    0xCA, 0xE2, 0x49, 0x15, 0xDF, 0x64, 0x65, 0xE4, 0xE5, 0xC8, 0x65, 0xA3, 0x18, 0x53, 0x36, 0xD4,\n    0x8B, 0xC7, 0x97, 0xE1, 0x4E, 0xD9, 0x92, 0xE7, 0x4A, 0x01, 0x2F, 0x93, 0xB0, 0x09, 0x40, 0x4E,\n    0x5A, 0x58, 0x7F, 0x2D, 0xDB, 0x7E, 0xA5, 0xAB, 0x8A, 0xA1, 0xFD, 0x4C, 0x9C, 0x55, 0x0F, 0x47,\n    0x64, 0x02, 0x80, 0xCB, 0x57, 0x50, 0xEC, 0xFE, 0xB7, 0xDC, 0xD2, 0x21, 0xD7, 0x0B, 0xF5, 0x0F,\n    0xD3, 0xB2, 0x10, 0xDF, 0x8D, 0x8B, 0x91, 0xE0, 0x9C, 0x44, 0x59, 0x0E, 0x08, 0xF2, 0xAB, 0x94,\n    0x75, 0xF3, 0x56, 0x96, 0xF0, 0x3E, 0x65, 0xA0, 0xBA, 0x4C, 0x10, 0x20, 0xB7, 0xF4, 0x2E, 0xEC,\n    0xE2, 0xC4, 0x03, 0x7D, 0xFB, 0xD9, 0x79, 0xCC, 0x88, 0x1F, 0x77, 0xE8, 0x9D, 0x1B, 0x89, 0xCD,\n    0xBB, 0x3D, 0x63, 0x3D, 0xCC, 0x95, 0x8C, 0xFA, 0x5C, 0x79, 0xC2, 0xE1, 0x83, 0x64, 0xE0, 0xB3,\n    0x52, 0x38, 0x90, 0x49, 0x2A, 0x02, 0x1A, 0x9F, 0x85, 0xC4, 0x45, 0x59, 0xE2, 0xE1, 0xF6, 0x7B,\n    0x61, 0xAF, 0x0A, 0xBA, 0xA3, 0x8F, 0xA0, 0x2D, 0xEE, 0x7C, 0xBE, 0x54, 0x40, 0x15, 0xB5, 0x87,\n    0xA1, 0xEF, 0x7E, 0x09, 0x38, 0x51, 0xED, 0x2D, 0xDE, 0xDB, 0x41, 0xC6, 0xEE, 0x88, 0xAD, 0x1F,\n    0x9C, 0x1C, 0xEC, 0x70, 0x39, 0x38, 0x45, 0xB8, 0x01, 0xB6, 0x58, 0x85, 0x61, 0x48, 0x3A, 0xCB,\n    0xE9, 0x97, 0xB3, 0x96, 0x8C, 0x0B, 0xD7, 0x33, 0x73, 0x73, 0x7F, 0x1D, 0x85, 0xFF, 0xE9, 0x9E,\n    0xCE, 0xD1, 0x1E, 0xFD, 0x1B, 0x7A, 0x63, 0x33, 0x10, 0x47, 0x96, 0xBA, 0x0A, 0x8E, 0xF6, 0x4C,\n    0x70, 0xC1, 0xE1, 0xFD, 0x19, 0x5A, 0xE0, 0x19, 0xE8, 0xD9, 0x0C, 0x31, 0x8E, 0xA7, 0x42, 0x9D,\n    0x50, 0xB2, 0xC9, 0x20, 0xE8, 0x62, 0xD2, 0x27, 0x67, 0x8E, 0xB6, 0x33, 0x8C, 0xD9, 0x38, 0x85,\n    0xDC, 0x4D, 0xCF, 0x72, 0xF3, 0xCF, 0xAF, 0xB6, 0x00, 0xF0, 0x54, 0xAE, 0x27, 0xEC, 0x80, 0x28,\n    0x4B, 0x4B, 0xA8, 0x57, 0x5C, 0xC3, 0xEE, 0x3A, 0x1F, 0x77, 0xAC, 0x9E, 0xA9, 0x11, 0x71, 0x23,\n    0x5B, 0xFB, 0xF6, 0x80, 0x0E, 0x80, 0xCB, 0xC7, 0xE8, 0x1F, 0x8B, 0x09, 0x45, 0xA0, 0xF6, 0x70,\n    0xD1, 0x3D, 0x9D, 0x46, 0x00, 0x80, 0x3E, 0x79, 0x1F, 0x4C, 0xF2, 0x4F, 0xCC, 0x8B, 0x9F, 0x63,\n    0xCC, 0x01, 0x62, 0xD3, 0x30, 0x7D, 0xB1, 0x74, 0xB8, 0xF5, 0xB1, 0x0F, 0x13, 0x57, 0xF7, 0x70,\n    0x7F, 0x16, 0x6C, 0x27, 0x17, 0x16, 0x49, 0xE6, 0x5F, 0x87, 0xA2, 0x52, 0x0E, 0x9C, 0xF9, 0xA9,\n    0xEE, 0x91, 0xF0, 0xB1, 0x9C, 0x32, 0x13, 0x67, 0x08, 0xFA, 0x0C, 0x62, 0xBF, 0x11, 0xB2, 0x81,\n    0x9F, 0xFF, 0xC1, 0x0C, 0xF9, 0x84, 0xBA, 0x85, 0x2E, 0xC2, 0xBC, 0xC0, 0x59, 0x1E, 0x56, 0x62,\n    0x58, 0x39, 0x38, 0x6B, 0xFC, 0xC5, 0xC4, 0x9A, 0x97, 0xBC, 0x15, 0xA3, 0x2E, 0x90, 0xD2, 0x8E,\n    0x18, 0xDF, 0x51, 0x39, 0x61, 0x99, 0xE4, 0x2D, 0xA9, 0x50, 0x70, 0x0B, 0x0F, 0x41, 0x20, 0x89,\n    0x37, 0xFC, 0xE5, 0xD7, 0x3B, 0x57, 0xF5, 0x94, 0x69, 0x4C, 0xEC, 0x56, 0x1B, 0x9B, 0xA3, 0x73,\n    0xC2, 0x6F, 0xA8, 0xFF, 0xF2, 0xEC, 0xD0, 0xD9, 0x79, 0x9F, 0x39, 0x0B, 0x7C, 0xF2, 0xE2, 0x5E,\n    0x52, 0x7A, 0xE0, 0x81, 0xE3, 0x54, 0xC6, 0x2D, 0x86, 0x27, 0x8D, 0x04, 0xC3, 0x63, 0x2E, 0x25,\n    0x6E, 0x05, 0x8F, 0xFB, 0xCA, 0x89, 0x18, 0x4D, 0x9B, 0xB9, 0x20, 0xA1, 0x15, 0xA2, 0x33, 0x56,\n    0xAB, 0x3F, 0x2D, 0x14, 0x5A, 0x04, 0x5D, 0xBB, 0x7E, 0xE8, 0xF7, 0x4B, 0xD6, 0x49, 0xE8, 0xAF,\n    0xE5, 0x10, 0x1F, 0x91, 0x68, 0x7C, 0xA0, 0x55, 0x24, 0x75, 0x46, 0xAF, 0xE1, 0xCD, 0x75, 0x0D,\n    0x36, 0xC7, 0xAB, 0x21, 0xAC, 0xA8, 0x1C, 0xF0, 0x69, 0x6F, 0x38, 0x5E, 0x67, 0x7D, 0x99, 0x72,\n    0xB9, 0x39, 0xE9, 0xFB, 0xCF, 0xCC, 0x24, 0x8C, 0x63, 0x6B, 0x6D, 0xBD, 0x0C, 0xFF, 0x5A, 0x2D,\n    0xD0, 0x3F, 0x62, 0xE9, 0xFE, 0xC3, 0x50, 0x18, 0xC1, 0xE9, 0x07, 0xE8, 0xE5, 0x2E, 0xA5, 0x98,\n    0x53, 0x27, 0x4A, 0x3D, 0xC9, 0xAF, 0x1B, 0x5E, 0x41, 0x4F, 0x67, 0xFE, 0x84, 0xBB, 0x74, 0x0C,\n    0x6C, 0x88, 0x02, 0xFA, 0x37, 0x6A, 0xAD, 0xBC, 0x08, 0xDB, 0xE8, 0xF2, 0xCD, 0xA4, 0xF0, 0xFC,\n    0xCC, 0xAD, 0xB5, 0xE7, 0x95, 0x61, 0x93, 0x99, 0xF1, 0xA3, 0x06, 0xCC, 0x01, 0x8D, 0x45, 0x9E,\n    0xE1, 0xA6, 0x15, 0xDC, 0x4A, 0x99, 0x0F, 0x15, 0x34, 0x1E, 0x7E, 0x4F, 0xE5, 0x42, 0xEC, 0xE9,\n    0xD3, 0xA3, 0xAD, 0xAB, 0x96, 0x5B, 0x89, 0x94, 0x12, 0xD3, 0xB1, 0x64, 0x69, 0x5B, 0x55, 0xC6,\n    0x8C, 0x77, 0xD0, 0x9D, 0x0D, 0xF3, 0x36, 0x79, 0x49, 0x50, 0xE9, 0xBC, 0x61, 0x62, 0xFA, 0x67,\n    0xDE, 0x00, 0x87, 0xC5, 0x95, 0x02, 0xBD, 0xAC, 0x7F, 0x3C, 0x92, 0x49, 0x15, 0xFE, 0xB4, 0x9D,\n    0x44, 0xD9, 0x19, 0x10, 0x88, 0xDE, 0xBB, 0xC9, 0xE1, 0xEF, 0xC0, 0xD6, 0x60, 0xC7, 0x1D, 0x8B,\n    0xE8, 0xE3, 0xD1, 0xE8, 0x28, 0x5D, 0xEC, 0x49, 0xEA, 0x79, 0xE4, 0x61, 0x61, 0x7C, 0x81, 0xBF,\n    0x6D, 0xA1, 0x89, 0x80, 0x63, 0x83, 0x65, 0xF2, 0x5C, 0xF6, 0xBB, 0xAD, 0xD4, 0x3B, 0x2F, 0xFE,\n    0x6F, 0x0A, 0xD6, 0x6E, 0x2D, 0x6E, 0x34, 0xB9, 0x0B, 0xE2, 0x12, 0x8B, 0x40, 0xFE, 0x0E, 0x24,\n    0x6C, 0x67, 0xDE, 0x25, 0xCD, 0x48, 0x34, 0x8A, 0x5B, 0x0D, 0x9B, 0xC4, 0xD3, 0x1C, 0xE6, 0x9D,\n    0x8C, 0x77, 0xB0, 0x2B, 0x0C, 0x77, 0x2C, 0x0D, 0xBE, 0xAD, 0xE1, 0x9D, 0x9F, 0x10, 0x84, 0x34,\n    0x39, 0x52, 0xB0, 0xB8, 0x1C, 0x02, 0x24, 0x3C, 0xD8, 0x80, 0xD4, 0x40, 0x63, 0x59, 0xE6, 0x6C,\n    0x0F, 0xFA, 0xEB, 0xAE, 0xDC, 0x67, 0x47, 0x03, 0x25, 0x80, 0xCD, 0x4B, 0x21, 0x77, 0x17, 0xBB,\n    0x19, 0x8C, 0xC1, 0x09, 0x7E, 0x0F, 0x7D, 0xD7, 0x50, 0xF9, 0xC3, 0xAA, 0x05, 0x10, 0xDD, 0x6B,\n    0xD2, 0x96, 0x46, 0x14, 0xC2, 0xA5, 0xD7, 0xF8, 0xED, 0xDA, 0x58, 0x53, 0xC3, 0x8F, 0xAB, 0x47,\n    0x91, 0x95, 0x48, 0x0C, 0xDE, 0xED, 0x99, 0x04, 0x3A, 0xC7, 0xCC, 0xB5, 0x1C, 0xAC, 0x29, 0xAE,\n    0xFA, 0xA6, 0xA5, 0x57, 0x65, 0x12, 0x86, 0xBE, 0x72, 0xFB, 0x06, 0x93, 0x49, 0xD0, 0x53, 0x43,\n    0xD0, 0xD4, 0xC7, 0x2F, 0x8A, 0x13, 0xEC, 0x95, 0x3B, 0x18, 0xD3, 0x67, 0x2B, 0xA6, 0xCF, 0x0B,\n    0xE6, 0x47, 0xF9, 0x3A, 0x32, 0x41, 0x27, 0xC8, 0xDB, 0xD7, 0xC7, 0xED, 0xB7, 0xCF, 0x75, 0xF1,\n    0x29, 0xC7, 0x28, 0x97, 0x07, 0xBA, 0x74, 0x2C, 0x5A, 0xAE, 0x6E, 0x39, 0x51, 0xF3, 0xD2, 0x07,\n    0xE2, 0x82, 0xFA, 0xE0, 0xD0, 0x22, 0x6B, 0xC7, 0xDA, 0x90, 0x0D, 0x1B, 0xB5, 0x17, 0x8A, 0xFA,\n    0x9E, 0xB5, 0x1A, 0xBD, 0x6F, 0x64, 0x02, 0xF5, 0x14, 0xB4, 0x63, 0x64, 0xFB, 0x42, 0x99, 0x42,\n    0xDE, 0x6A, 0x6C, 0xAB, 0x5B, 0xE5, 0xC4, 0x62, 0x25, 0x66, 0x83, 0xC3, 0x6A, 0x64, 0x4A, 0xD0,\n    0xA7, 0x4F, 0x66, 0x21, 0xF9, 0x7C, 0xCC, 0x15, 0x5F, 0x69, 0xB3, 0x2E, 0x83, 0x26, 0x12, 0xC7,\n    0xE0, 0xE4, 0xAE, 0x92, 0x44, 0xA4, 0x1F, 0xEE, 0xBC, 0x06, 0xAF, 0xC4, 0x5A, 0x14, 0x89, 0xCF,\n    0x46, 0xC2, 0xA8, 0x80, 0x98, 0xF6, 0xCC, 0xA8, 0x7E, 0xDE, 0x94, 0x31, 0x36, 0xBF, 0x80, 0xA9,\n    0x49, 0x62, 0xF9, 0x4B, 0x09, 0xFF, 0x29, 0xCC, 0xB6, 0x5A, 0x84, 0xBC, 0xCB, 0xF4, 0xBB, 0x19,\n    0xC1, 0xA7, 0x09, 0x60, 0xF9, 0xD4, 0x0F, 0x84, 0xE0, 0xDF, 0x9A, 0x0D, 0xCC, 0xCA, 0x14, 0x68,\n    0x39, 0x74, 0x10, 0x63, 0x13, 0xC0, 0xAE, 0xD2, 0x2B, 0x3C, 0x6E, 0xC2, 0x29, 0x51, 0xC9, 0xAF,\n    0x0E, 0x09, 0x87, 0xAD, 0x82, 0x8A, 0xA6, 0x0F, 0x02, 0x4B, 0xAD, 0x1F, 0x63, 0xEE, 0xAE, 0x57,\n    0xE0, 0xE5, 0x51, 0xCC, 0x8C, 0x9A, 0x9E, 0x4F, 0x67, 0xFB, 0xD4, 0x9F, 0xA5, 0x18, 0x13, 0x9F,\n    0x24, 0xF4, 0x9E, 0x2B, 0x52, 0xC0, 0x08, 0xE8, 0x77, 0xEA, 0xBB, 0x01, 0x5A, 0x77, 0x46, 0xEF,\n    0x10, 0xAC, 0xA4, 0x70, 0x56, 0x98, 0x5A, 0xBF, 0x4A, 0x82, 0x72, 0x96, 0xB9, 0xB1, 0x61, 0x78,\n    0x6D, 0x6E, 0xAD, 0x66, 0x6C, 0x67, 0xB3, 0x45, 0x8F, 0xF8, 0xFD, 0x1E, 0xAA, 0x7A, 0x13, 0x0C,\n    0x35, 0x1A, 0x9F, 0x69, 0x5E, 0x13, 0x8A, 0xB5, 0xE7, 0x17, 0x58, 0x7A, 0xF5, 0xB3, 0x06, 0x48,\n    0x16, 0x55, 0xDC, 0xD8, 0xB7, 0x70, 0x3D, 0xB1, 0x04, 0x13, 0xA1, 0x21, 0x60, 0xF2, 0x15, 0xA8,\n    0x09, 0x2A, 0xD2, 0xBC, 0x67, 0xAD, 0x23, 0x01, 0x8E, 0x91, 0xE2, 0x4C, 0x73, 0x41, 0xA4, 0x29,\n    0x9A, 0x09, 0xFD, 0xC6, 0x8C, 0xC2, 0x0D, 0x62, 0xFE, 0x70, 0x53, 0x8B, 0x72, 0x07, 0x26, 0x73,\n    0xC1, 0xED, 0x07, 0xE0, 0xD3, 0x02, 0x9C, 0x10, 0x30, 0x83, 0x83, 0x50, 0xDA, 0x11, 0x36, 0x8B,\n    0x22, 0xE6, 0xF3, 0x90, 0xDE, 0x90, 0x87, 0x6F, 0x10, 0x41, 0x3B, 0x6E, 0x41, 0x87, 0x0A, 0x56,\n    0x27, 0x95, 0xCA, 0xFE, 0xC8, 0xE0, 0x15, 0xD2, 0xEE, 0xB8, 0xBF, 0x35, 0x4F, 0x8B, 0xF3, 0xBA,\n    0x37, 0x6F, 0x16, 0x61, 0x80, 0x7E, 0x95, 0x50, 0x27, 0x7A, 0x46, 0x0F, 0xBF, 0xDC, 0x74, 0xB1,\n    0x73, 0xE0, 0x50, 0x86, 0x6F, 0x92, 0xB6, 0x41, 0x5B, 0x2E, 0xE1, 0xCA, 0x8E, 0xDB, 0x8E, 0xEC,\n    0xD1, 0x8C, 0xF4, 0x74, 0x7C, 0x9C, 0x1E, 0x24, 0x60, 0xF4, 0xD3, 0x5B, 0xA0, 0x3B, 0xE2, 0x5B,\n    0x17, 0xBB, 0x7D, 0x97, 0x57, 0x2A, 0x09, 0x9A, 0x1D, 0x5C, 0x02, 0x63, 0x4A, 0xC0, 0x0E, 0xA1,\n    0xA0, 0x96, 0xE5, 0x4D, 0x6D, 0x91, 0x3C, 0x69, 0x59, 0x80, 0x41, 0x7D, 0xF7, 0x53, 0x93, 0x52,\n    0x58, 0xF9, 0x11, 0x33, 0xFF, 0xDB, 0x7F, 0x26, 0x5E, 0x90, 0x5B, 0xB5, 0x42, 0x16, 0xE0, 0x05,\n    0x4E, 0x5B, 0x23, 0xAE, 0x35, 0x7D, 0x95, 0x79, 0x4C, 0xD1, 0x77, 0x47, 0x77, 0x9B, 0x63, 0xED,\n    0x86, 0x6E, 0x6F, 0x76, 0x54, 0x7C, 0x4A, 0x9D, 0x0F, 0xAE, 0xE7, 0x41, 0xBD, 0x20, 0x1F, 0x04,\n    0xF4, 0xA8, 0x90, 0x48, 0xF7, 0x59, 0xF7, 0x14, 0xCF, 0x1D, 0x18, 0xE5, 0x54, 0x25, 0x4D, 0x87,\n    0xE4, 0x61, 0x84, 0x7B, 0xB5, 0xCB, 0xF5, 0x70, 0x78, 0x80, 0xF1, 0x52, 0x89, 0x2D, 0xEA, 0x72,\n    0xB3, 0xE7, 0x7D, 0x24, 0x59, 0xB7, 0x22, 0x49, 0x9F, 0xDA, 0x7D, 0x81, 0x86, 0xAB, 0xD3, 0x80,\n    0x18, 0x55, 0xF5, 0x21, 0xC6, 0xE4, 0x9E, 0xE5, 0xBB, 0x12, 0x8D, 0x3E, 0xD1, 0xEE, 0x33, 0x56,\n    0xCF, 0x24, 0x37, 0x65, 0x73, 0x41, 0x63, 0xDD, 0x21, 0x4C, 0x85, 0xA3, 0xB1, 0x74, 0x67, 0xFC,\n    0x60, 0xC9, 0x14, 0x0D, 0x4F, 0x31, 0x15, 0x87, 0x70, 0xEA, 0x18, 0x9C, 0xE9, 0x13, 0x09, 0x6A,\n    0xC5, 0xE2, 0x01, 0x08, 0xF3, 0x2A, 0xE0, 0x28, 0x42, 0x1B, 0x80, 0x30, 0xC3, 0x87, 0xF8, 0x31,\n    0xBC, 0x0C, 0xC7, 0xBA, 0x61, 0x77, 0x85, 0xC7, 0x9B, 0x56, 0x29, 0x48, 0xCF, 0x65, 0x18, 0x05,\n    0x2F, 0x8E, 0x23, 0x3D, 0xA3, 0x34, 0xB2, 0x17, 0xAB, 0x42, 0xE6, 0x88, 0x8C, 0x96, 0xB5, 0x5F,\n    0x44, 0x20, 0x47, 0xAB, 0x1F, 0x02, 0xE3, 0xDF, 0xF2, 0xEF, 0xBE, 0x5A, 0xA8, 0x87, 0x98, 0x57,\n    0xCE, 0x73, 0x75, 0xAE, 0xA1, 0x51, 0x16, 0xEC, 0x5A, 0x0F, 0xFA, 0xF0, 0xC6, 0x80, 0xFE, 0x7F,\n    0xE4, 0x3B, 0x02, 0x27, 0x9D, 0x75, 0xE3, 0x41, 0x8C, 0x5C, 0x5B, 0x20, 0x40, 0x22, 0xBF, 0x09,\n    0x79, 0x63, 0xB4, 0xDC, 0x06, 0x44, 0xE4, 0x5B, 0x09, 0x58, 0xC9, 0x51, 0x38, 0x9D, 0x07, 0x10,\n    0x98, 0x75, 0x6A, 0x3B, 0x87, 0x00, 0x76, 0x9D, 0x6C, 0xE9, 0xB0, 0x94, 0x1E, 0x50, 0x48, 0x26,\n    0x5E, 0xFB, 0x2D, 0x10, 0x54, 0x8E, 0xA2, 0x50, 0x03, 0xC6, 0x78, 0x55, 0x86, 0x4E, 0xD4, 0x4B,\n    0xFC, 0x15, 0x61, 0x4C, 0x72, 0xFB, 0xCE, 0x21, 0xC5, 0x89, 0x23, 0x00, 0x16, 0x63, 0x73, 0xAD,\n    0xB0, 0xE1, 0x94, 0x36, 0x43, 0xFE, 0xA4, 0x37, 0x34, 0x3F, 0xE2, 0xB9, 0x75, 0x2D, 0x95, 0x72,\n    0x2C, 0xC8, 0x8A, 0xC5, 0x4B, 0x03, 0x8C, 0xA4, 0xE8, 0x79, 0x15, 0x38, 0x24, 0x8D, 0x92, 0x0B,\n    0x91, 0xA4, 0xF3, 0x94, 0x58, 0x35, 0xD6, 0x6D, 0x14, 0x3E, 0x78, 0x4E, 0x17, 0x21, 0x80, 0x5D,\n    0x95, 0xF0, 0x73, 0x7E, 0xA2, 0xDA, 0x3D, 0xD4, 0x33, 0xF4, 0x0A, 0x80, 0x4A, 0x5C, 0x83, 0x91,\n    0x6E, 0xE7, 0x13, 0x73, 0x26, 0x94, 0x17, 0xD4, 0x13, 0xBD, 0x8B, 0x74, 0x25, 0x06, 0x34, 0xA8,\n    0x98, 0x99, 0x94, 0x1F, 0xC7, 0xDC, 0x3F, 0x36, 0xF8, 0x24, 0x57, 0x1E, 0xB7, 0x9D, 0x29, 0xA4,\n    0xB6, 0x27, 0x1B, 0x31, 0xF3, 0x21, 0x80, 0x60, 0x51, 0xF1, 0x66, 0x10, 0xBD, 0x15, 0xF5, 0xBB,\n    0x47, 0x50, 0xCD, 0xC7, 0xEC, 0x05, 0x48, 0xCB, 0x84, 0x70, 0xB0, 0x58, 0x5F, 0x53, 0x2A, 0x2B,\n    0x02, 0x42, 0x5C, 0x78, 0x1C, 0x7C, 0x56, 0xA2, 0xF2, 0x4B, 0xA0, 0x94, 0x8A, 0x84, 0xB0, 0x2D,\n    0x9B, 0xF5, 0xA8, 0xC2, 0xE2, 0xE3, 0x20, 0xC5, 0xAE, 0xD6, 0x4F, 0x17, 0xDF, 0x52, 0x47, 0x8E,\n    0x6F, 0x6D, 0x41, 0xDB, 0x59, 0xF0, 0xC5, 0x9D, 0x6D, 0xBD, 0xA0, 0xC9, 0x9D, 0x72, 0x2D, 0x2E,\n    0x51, 0x10, 0xAC, 0x37, 0x01, 0xA7, 0xD7, 0x4E, 0xF3, 0x96, 0xD6, 0x79, 0xFD, 0xA0, 0xC4, 0x3F,\n    0x38, 0x68, 0xA4, 0x19, 0x01, 0xE6, 0x0B, 0x96, 0x32, 0xA3, 0x48, 0x8B, 0x4F, 0x77, 0x56, 0x98,\n    0xB6, 0x85, 0x73, 0xA9, 0x2B, 0x04, 0xED, 0x2F, 0x13, 0x6A, 0x32, 0x0C, 0xAB, 0x51, 0x54, 0xBE,\n    0x0B, 0x7F, 0xBD, 0x93, 0x4E, 0xB1, 0xBB, 0xA9, 0xA8, 0xD4, 0x53, 0x64, 0x83, 0x49, 0x63, 0x64,\n    0x5B, 0xD7, 0xB5, 0x02, 0xDD, 0x13, 0x3F, 0xFD, 0x64, 0xF5, 0xC3, 0x18, 0x97, 0xC7, 0xCF, 0x96,\n    0x11, 0x63, 0xB3, 0x20, 0x15, 0x81, 0x3D, 0x9A, 0x52, 0x99, 0xF2, 0xBE, 0x76, 0xD1, 0x1F, 0xF6,\n    0x0E, 0xD3, 0x7C, 0x55, 0x42, 0x55, 0x94, 0x5E, 0x10, 0x96, 0x37, 0x4C, 0x2E, 0xAC, 0x9E, 0x30,\n    0x40, 0xB9, 0xD0, 0xFC, 0x81, 0xA2, 0x87, 0x34, 0x74, 0x82, 0xA2, 0x88, 0xDD, 0x30, 0x4D, 0x50,\n    0xA6, 0x0E, 0x0C, 0x50, 0x0C, 0xB7, 0xB6, 0xC2, 0x33, 0x7D, 0x73, 0x8C, 0x66, 0x90, 0xC2, 0x42,\n    0x87, 0x35, 0xD5, 0x4D, 0xB7, 0xEE, 0x1D, 0x0D, 0xB4, 0xFC, 0xD4, 0x3B, 0xD9, 0xA7, 0xF1, 0x2D,\n    0x02, 0x16, 0x89, 0x1B, 0x32, 0xB2, 0x4D, 0x38, 0x61, 0x6C, 0xD3, 0x3B, 0x53, 0xBF, 0x1E, 0x46,\n    0xA8, 0x6B, 0x1A, 0x83, 0xB8, 0x3A, 0x2C, 0xCD, 0x6E, 0xBF, 0xBB, 0xDD, 0x42, 0x71, 0xB9, 0x71,\n    0x93, 0x4C, 0x3B, 0x24, 0x3B, 0xBD, 0x6A, 0x78, 0x93, 0x42, 0x6B, 0x5A, 0x24, 0xCF, 0x41, 0x10,\n    0xAD, 0x05, 0x3B, 0x7E, 0x90, 0x2C, 0xA7, 0x9C, 0x6B, 0xB5, 0xE0, 0x5E, 0xB5, 0xA0, 0x3C, 0xCB,\n    0xD0, 0xCB, 0x48, 0x75, 0xE3, 0x17, 0x86, 0x42, 0x5A, 0xF7, 0x2E, 0x4C, 0x6C, 0xF2, 0x21, 0x37,\n    0xEE, 0xB4, 0xE5, 0x30, 0x6B, 0xA1, 0x4B, 0x31, 0xDB, 0x8C, 0x86, 0xF9, 0x5C, 0xDA, 0xDA, 0x44,\n    0x95, 0xEA, 0x26, 0x96, 0xD6, 0x26, 0xAE, 0x23, 0x11, 0xEB, 0x21, 0x34, 0xFF, 0xB2, 0x8C, 0x9E,\n    0x9B, 0xBD, 0x27, 0xFB, 0x09, 0x0F, 0xE3, 0x50, 0x73, 0x8E, 0xAC, 0xE0, 0x05, 0x22, 0x20, 0xD5,\n    0xF7, 0x4E, 0x72, 0xD0, 0x4E, 0xF7, 0xC5, 0xC9, 0xE7, 0x25, 0x7F, 0xF9, 0x91, 0x19, 0x68, 0x03,\n    0x17, 0x04, 0xD2, 0xBA, 0x4D, 0x94, 0xAF, 0x95, 0xBC, 0x81, 0x57, 0xB6, 0xD9, 0x56, 0x8F, 0x67,\n    0x40, 0x24, 0x6D, 0xEC, 0xD5, 0xD1, 0x1E, 0x2E, 0xFC, 0xE8, 0xBA, 0xAB, 0x80, 0x63, 0x35, 0xC3,\n    0x38, 0x18, 0x98, 0x71, 0x55, 0xA7, 0xC8, 0x09, 0xAE, 0xA3, 0xA3, 0x37, 0xA3, 0x96, 0xCE, 0x8F,\n    0x0F, 0x12, 0x53, 0xF5, 0x8E, 0x02, 0xB1, 0xBC, 0x56, 0x1E, 0x67, 0x71, 0xFE, 0xAB, 0xF0, 0x04,\n    0x5B, 0x87, 0x93, 0x92, 0xB2, 0xAC, 0x47, 0xB6, 0xEF, 0xBD, 0x55, 0x1D, 0x30, 0xCB, 0xA6, 0x60,\n    0x13, 0x13, 0xFE, 0x82, 0x4E, 0x06, 0xA8, 0xAB, 0x2B, 0x40, 0x2E, 0x7C, 0x66, 0x8F, 0xCC, 0x40,\n    0x36, 0x20, 0xE9, 0xAF, 0xC6, 0x3A, 0xE2, 0xE2, 0xFE, 0x01, 0x97, 0x7E, 0xCA, 0x82, 0x20, 0x58,\n    0x5E, 0xB5, 0x10, 0xE1, 0x99, 0xE3, 0x4F, 0x82, 0xE3, 0x4D, 0x35, 0xB6, 0x7B, 0x28, 0x37, 0x02,\n    0x26, 0x00, 0xA1, 0x6C, 0x7B, 0xA1, 0x48, 0x4F, 0xCB, 0x55, 0x25, 0xB8, 0x6B, 0xDD, 0xB1, 0xAE,\n    0xA0, 0xD3, 0xA1, 0x8B, 0x84, 0x9E, 0xF2, 0xB8, 0x53, 0xDC, 0xE0, 0xE4, 0x6C, 0x5C, 0x63, 0xA8,\n    0xD7, 0x4F, 0x1C, 0xB6, 0x73, 0xF9, 0x50, 0xA7, 0x99, 0x30, 0x42, 0x3E, 0x60, 0x49, 0x6A, 0x7F,\n    0x6F, 0x0A, 0x83, 0xAD, 0x99, 0x90, 0x00, 0xC3, 0x5A, 0xFD, 0x83, 0xDA, 0xDE, 0x0A, 0x37, 0xC0,\n    0x7F, 0xC6, 0x96, 0x61, 0x9A, 0xF8, 0xBF, 0xBF, 0x45, 0x33, 0x3C, 0x17, 0x48, 0x7B, 0x54, 0xB8,\n    0x38, 0xAD, 0x88, 0xD7, 0x7C, 0x1B, 0x08, 0x04, 0xA9, 0x88, 0xDD, 0x1A, 0x7B, 0x53, 0xEF, 0x8F,\n    0x49, 0xBC, 0xBC, 0x64, 0x98, 0x17, 0xA0, 0xB2, 0xAE, 0x63, 0x5B, 0x33, 0xE3, 0xED, 0x93, 0x88,\n    0x5D, 0xB9, 0x3F, 0xF2, 0x8A, 0xD3, 0x38, 0xD9, 0xD6, 0xC9, 0xFE, 0x13, 0x92, 0x3B, 0xF0, 0xA5,\n    0xE4, 0x1A, 0x09, 0x28, 0x70, 0x27, 0x1A, 0xB5, 0x99, 0xBA, 0x39, 0x2A, 0xBA, 0x8E, 0xAE, 0x79,\n    0x6A, 0x21, 0xF7, 0xB7, 0x7D, 0x16, 0x34, 0xA4, 0x5D, 0x0E, 0x97, 0xF5, 0xFC, 0x1A, 0x88, 0xEE,\n    0x4A, 0x9E, 0xB9, 0x64, 0x2B, 0xFF, 0x89, 0xC2, 0x45, 0x34, 0xE7, 0xC4, 0xE0, 0xFC, 0x9E, 0xF8,\n    0xF6, 0x89, 0x5E, 0x68, 0x53, 0xEC, 0xF0, 0x98, 0x63, 0x5E, 0x53, 0xA0, 0xBE, 0x42, 0x8E, 0xD9,\n    0x70, 0x5D, 0x3C, 0xC5, 0x11, 0x11, 0x20, 0xC1, 0x9B, 0xF4, 0x6E, 0x61, 0x63, 0x4A, 0xB3, 0xE7,\n    0x5F, 0x91, 0xC9, 0x2C, 0xFF, 0x1E, 0xCE, 0x25, 0xFE, 0x26, 0x6A, 0xA4, 0x06, 0xE3, 0x30, 0xCF,\n    0xFC, 0x9D, 0xE8, 0x0D, 0xFD, 0x41, 0xC6, 0x9F, 0x20, 0x2E, 0xB0, 0x24, 0x9B, 0xA1, 0xB2, 0x30,\n    0x75, 0x3F, 0xFC, 0x33, 0x68, 0x8E, 0x97, 0x33, 0xE5, 0xFE, 0xF8, 0xEC, 0x28, 0xAC, 0xD4, 0x52,\n    0xA5, 0x97, 0x23, 0x9B, 0x89, 0xDF, 0x42, 0x38, 0xA2, 0xD9, 0x38, 0x7C, 0x59, 0x58, 0x78, 0x2D,\n    0x64, 0x3E, 0xAC, 0xA4, 0x2F, 0x30, 0x55, 0xD2, 0xE3, 0x4C, 0x4E, 0xA5, 0xEC, 0x4E, 0x5A, 0xF9,\n    0xAA, 0xB6, 0xB9, 0xBA, 0xFA, 0x23, 0x41, 0x9D, 0xCA, 0x54, 0xDA, 0x90, 0xDD, 0xC4, 0x68, 0x16,\n    0x2E, 0x4F, 0xB5, 0xDC, 0x9A, 0x25, 0xBF, 0x8B, 0xC0, 0x79, 0x0D, 0xCF, 0xB7, 0xBE, 0xDE, 0x95,\n    0x59, 0xF0, 0x28, 0x8A, 0x14, 0xD9, 0x90, 0x66, 0xAA, 0xEB, 0x5F, 0x64, 0x61, 0xD1, 0x7E, 0x4C,\n    0x45, 0x8E, 0x98, 0x11, 0x7A, 0x84, 0x81, 0x0A, 0xD2, 0xBA, 0x5D, 0x72, 0x09, 0xA0, 0x05, 0x1E,\n    0x16, 0xD4, 0x4A, 0x91, 0xEE, 0xD8, 0x4A, 0x06, 0x4B, 0x5C, 0xEC, 0x79, 0x28, 0xA3, 0xB3, 0x81,\n    0x4C, 0x90, 0xF1, 0xB2, 0x29, 0x02, 0x2B, 0xF2, 0x44, 0x9F, 0xD9, 0x6D, 0x66, 0x33, 0x78, 0x73,\n    0x23, 0x5D, 0x26, 0x2C, 0x86, 0x43, 0x9E, 0x69, 0x0A, 0x97, 0x01, 0x8F, 0x64, 0xDA, 0xF9, 0xCC,\n    0xC7, 0xA0, 0x59, 0xF0, 0x60, 0xD9, 0x46, 0xAA, 0x77, 0x9F, 0xFC, 0xF3, 0xBA, 0x66, 0xD4, 0xBE,\n    0x69, 0x9B, 0xAE, 0x3C, 0xB6, 0x57, 0x8A, 0x30, 0x53, 0xEC, 0xC6, 0xF8, 0x14, 0x76, 0x84, 0x76,\n    0x7F, 0x53, 0xA8, 0x14, 0x8A, 0x55, 0xAE, 0x89, 0xE8, 0x4D, 0x8C, 0x69, 0xC2, 0x56, 0xB7, 0x64,\n    0x2A, 0x57, 0x9A, 0x76, 0xC5, 0x77, 0x8A, 0xC8, 0x01, 0x29, 0xB6, 0xB2, 0xA9, 0x50, 0x43, 0xCD,\n    0x22, 0xD0, 0xE8, 0xDE, 0x6B, 0xB9, 0x87, 0x18, 0x70, 0xEF, 0xCB, 0x72, 0xAA, 0x18, 0xB6, 0x42,\n    0xCE, 0xBD, 0xC4, 0x34, 0x7C, 0x6E, 0xA7, 0x6F, 0x63, 0x29, 0x16, 0x97, 0x3A, 0x19, 0x11, 0xEF,\n    0xB6, 0x47, 0xF0, 0x01, 0xAA, 0x25, 0x4A, 0x50, 0x67, 0xCC, 0x60, 0xF2, 0x36, 0x06, 0x85, 0x7A,\n    0x99, 0x50, 0x11, 0x24, 0xDD, 0xA5, 0xC1, 0x1A, 0xA6, 0x76, 0x62, 0xBB, 0xB6, 0x34, 0xB8, 0x90,\n    0x37, 0x35, 0xAA, 0x96, 0xF3, 0xC5, 0xA2, 0x5E, 0x5D, 0x4F, 0x9C, 0x9F, 0x95, 0x99, 0xEF, 0xDE,\n    0xCC, 0x89, 0xC5, 0x2E, 0x73, 0xC7, 0xF7, 0xAC, 0xFB, 0x87, 0x95, 0xFE, 0x20, 0x99, 0x2B, 0x62,\n    0x5D, 0xDC, 0x61, 0x3B, 0x10, 0x7A, 0x5C, 0xF5, 0x09, 0xCB, 0xE0, 0xB1, 0x41, 0xB0, 0x7A, 0x90,\n    0x49, 0x65, 0x2D, 0x3F, 0x7D, 0x10, 0x6C, 0xDD, 0x5F, 0x04, 0x21, 0x70, 0xCA, 0x13, 0x42, 0x2B,\n    0x71, 0x30, 0xE9, 0x40, 0x80, 0xB4, 0xDD, 0xBF, 0xDF, 0x0D, 0x11, 0x21, 0xC1, 0xE4, 0x51, 0xC8,\n    0x48, 0xAC, 0x37, 0xD3, 0xDE, 0x32, 0xBE, 0xCF, 0x61, 0xF6, 0x8A, 0xEB, 0x8C, 0xE1, 0xF7, 0x1D,\n    0xCD, 0xAA, 0x24, 0x68, 0x4C, 0xA1, 0x33, 0x8A, 0x0B, 0xA5, 0xA4, 0xC6, 0x94, 0xCD, 0x1E, 0x07,\n    0x62, 0xB9, 0x3B, 0x3E, 0xD6, 0x13, 0x6F, 0x54, 0xD9, 0x93, 0x02, 0xD9, 0x1E, 0x72, 0x9C, 0x6C,\n    0xC9, 0x97, 0xEF, 0xB6, 0x96, 0xDA, 0x93, 0x7E, 0x8D, 0x4F, 0x88, 0x0B, 0xA4, 0x7E, 0xF9, 0x0A,\n    0x7E, 0xD3, 0x2D, 0x8D, 0x15, 0xCA, 0xC4, 0x14, 0xDC, 0x0E, 0x1B, 0x93, 0x02, 0xC5, 0x7E, 0x31,\n    0xC8, 0xCC, 0x59, 0x92, 0x9F, 0x66, 0x43, 0xA5, 0x51, 0xFA, 0x76, 0x92, 0xDE, 0x20, 0xCF, 0x5D,\n    0x28, 0xAA, 0x4E, 0x80, 0x61, 0x6D, 0xE2, 0x3C, 0xD3, 0xAE, 0x55, 0xEC, 0xD1, 0xC2, 0x30, 0xEA,\n    0xE3, 0xD7, 0x9D, 0xCE, 0x01, 0x64, 0xD4, 0x85, 0x95, 0xC0, 0x91, 0xBD, 0xB7, 0xAF, 0x78, 0xDB,\n    0xAC, 0x3C, 0xCF, 0x18, 0xE3, 0x07, 0x6C, 0xD4, 0x85, 0xD9, 0x04, 0xF5, 0xFA, 0x43, 0x1C, 0x27,\n    0x85, 0x1A, 0xF1, 0x86, 0xE5, 0xEE, 0x36, 0x83, 0x18, 0xE4, 0x40, 0x88, 0x67, 0xA4, 0xF9, 0x0E,\n    0x2C, 0x6F, 0xA9, 0xB2, 0xD8, 0x58, 0x89, 0xC1, 0xF5, 0x5C, 0xC0, 0x79, 0xDB, 0xF0, 0xA3, 0x92,\n    0xED, 0xBB, 0x7F, 0x76, 0xEE, 0x7D, 0x60, 0x5D, 0x05, 0xB5, 0xBA, 0x4C, 0x6A, 0x58, 0x8A, 0xBD,\n    0xF3, 0x69, 0x68, 0x4F, 0xDE, 0xE3, 0x7F, 0xF2, 0x05, 0x42, 0xC6, 0xDC, 0x7D, 0x04, 0x48, 0x3B,\n    0x1F, 0x99, 0x7E, 0x6C, 0x1E, 0x91, 0x86, 0xC8, 0xDF, 0x10, 0x92, 0x3F, 0xBD, 0xC3, 0x43, 0x39,\n    0xE3, 0xC1, 0x30, 0x7B, 0xBD, 0x02, 0x1F, 0x16, 0xEF, 0x72, 0x07, 0x99, 0xB1, 0x3B, 0x6A, 0x2C,\n    0xBE, 0x41, 0x38, 0xC6, 0xBF, 0xA0, 0xA4, 0xF4, 0xFF, 0x65, 0x4D, 0xF0, 0x76, 0xF2, 0x2F, 0x02,\n    0x87, 0x02, 0x13, 0xFD, 0x19, 0xC6, 0x4F, 0x6B, 0x57, 0x45, 0xCE, 0xDE, 0xEC, 0x24, 0x9E, 0x29,\n    0x0D, 0x9C, 0xF4, 0x16, 0x7A, 0x13, 0x33, 0xB9, 0x1C, 0x9E, 0xC1, 0x6B, 0xE3, 0xAD, 0xFD, 0x06,\n    0x52, 0xDF, 0x8B, 0xAE, 0x35, 0xA6, 0x1B, 0xE7, 0x93, 0x24, 0xB5, 0x5F, 0xD1, 0x77, 0xD5, 0x3E,\n    0xC4, 0x9F, 0x2F, 0x8A, 0x5C, 0x1C, 0x35, 0xAE, 0x08, 0xBE, 0x22, 0x10, 0x54, 0xDD, 0x6C, 0xC4,\n    0x1A, 0xDD, 0xD1, 0x04, 0x16, 0x04, 0x3D, 0x7B, 0x65, 0x92, 0xAC, 0x4B, 0x51, 0x51, 0x12, 0x96,\n    0xAB, 0x10, 0x05, 0x78, 0xD8, 0x77, 0x6D, 0x46, 0x3A, 0x50, 0x3B, 0xB8, 0xB9, 0xF5, 0x64, 0x13,\n    0xDA, 0xAD, 0x17, 0x2A, 0xD5, 0xAA, 0x40, 0x56, 0x7F, 0xC5, 0xF4, 0x73, 0xE5, 0xFC, 0x77, 0x96,\n    0xFD, 0xC5, 0x96, 0xCE, 0x68, 0x2C, 0x95, 0xDB, 0x0B, 0x98, 0xAC, 0x99, 0x3F, 0xF9, 0x22, 0x3D,\n    0xA2, 0xDC, 0x59, 0x30, 0xBF, 0x40, 0x1F, 0x73, 0xB9, 0xBA, 0xE3, 0x09, 0xF2, 0xDD, 0x51, 0x97,\n    0x46, 0x2E, 0xB5, 0x1E, 0xA3, 0x4D, 0x62, 0x9F, 0x20, 0xCA, 0xF5, 0xC3, 0xF5, 0x14, 0xC4, 0xD5,\n    0x5C, 0x06, 0x9A, 0xD7, 0x9B, 0x93, 0xD3, 0x0B, 0xA4, 0xDE, 0xCD, 0xAA, 0xBC, 0xFA, 0x91, 0xD8,\n    0xF5, 0xA2, 0xC1, 0x31, 0xCD, 0x16, 0xE3, 0x5C, 0xFB, 0x33, 0x4C, 0x33, 0x02, 0xD1, 0x17, 0x69,\n    0x29, 0xE1, 0x94, 0x97, 0xC9, 0x6C, 0x0F, 0x73, 0x5D, 0xCE, 0xBC, 0xF1, 0x76, 0xCE, 0x22, 0xBC,\n    0xB5, 0x11, 0xAF, 0x5D, 0x0F, 0x78, 0x54, 0x2E, 0x45, 0xDB, 0x02, 0x58, 0x7C, 0xE3, 0x39, 0x99,\n    0x74, 0x9D, 0x11, 0xFD, 0xF6, 0x87, 0x10, 0x47, 0xA9, 0xF3, 0x3B, 0x08, 0x6E, 0xBC, 0x0C, 0x8E,\n    0x54, 0x5E, 0x04, 0x58, 0xF6, 0xD9, 0x66, 0xEC, 0xD9, 0x11, 0x6D, 0x35, 0xAB, 0xB4, 0xE5, 0xDC,\n    0xF0, 0xB6, 0x1E, 0x71, 0xAC, 0x5D, 0x92, 0xC1, 0x5C, 0xB1, 0xC7, 0xD0, 0x0B, 0x10, 0x6E, 0xE2,\n    0x32, 0xA6, 0x89, 0x42, 0xAD, 0xA6, 0x5C, 0xBA, 0xAD, 0xB2, 0x0F, 0x47, 0x8C, 0xEF, 0xDD, 0x88,\n    0xEA, 0x04, 0x70, 0xB5, 0xFA, 0xD7, 0x22, 0x78, 0xD8, 0xCB, 0x20, 0xDD, 0xE4, 0xFE, 0x84, 0x68,\n    0xFD, 0x86, 0x1E, 0xE3, 0x87, 0x7B, 0x74, 0x61, 0xB2, 0x03, 0xC5, 0xA5, 0x06, 0xED, 0x4E, 0x87,\n    0x4E, 0x31, 0x0C, 0x0A, 0x2B, 0x49, 0x25, 0xD1, 0x33, 0xFF, 0xFE, 0xAC, 0x5E, 0x1F, 0xB2, 0x8D,\n    0xC0, 0x0D, 0x67, 0xAD, 0x92, 0x64, 0x12, 0xCD, 0x4C, 0x80, 0x68, 0x8B, 0x91, 0xA3, 0xBD, 0x88,\n    0xA6, 0x0F, 0xEC, 0x4D, 0x26, 0x1F, 0xD6, 0xB1, 0x8C, 0x5D, 0x6B, 0x25, 0x7A, 0x98, 0xA7, 0x30,\n    0x57, 0x7D, 0x9D, 0x31, 0x8B, 0xE0, 0x61, 0xBC, 0xA1, 0xB5, 0xB6, 0xD3, 0x21, 0xAF, 0x26, 0x7C,\n    0x53, 0xC2, 0xFB, 0x3E, 0x82, 0xEC, 0xB3, 0x17, 0x02, 0x82, 0xD7, 0x00, 0x82, 0x0A, 0x28, 0x4B,\n    0xDE, 0x55, 0x8E, 0x9E, 0x42, 0xB5, 0x93, 0xA6, 0x0C, 0x54, 0x09, 0x59, 0xD0, 0x02, 0x68, 0xBE,\n    0x00, 0x0C, 0x8F, 0x50, 0x73, 0xE9, 0x19, 0x03, 0xBB, 0x47, 0x65, 0xDE, 0x85, 0x23, 0x8C, 0xDC,\n    0xBB, 0x5A, 0xB5, 0x59, 0xC7, 0xA3, 0x1A, 0xDF, 0x10, 0x1E, 0x2C, 0x10, 0xD7, 0x36, 0xAE, 0x1E,\n    0x27, 0x78, 0x4D, 0xEE, 0xE6, 0xC0, 0x30, 0xC3, 0x57, 0x0B, 0x5F, 0xFF, 0x5A, 0xB1, 0x05, 0x73,\n    0xF6, 0x4D, 0x1C, 0x3E, 0x18, 0x3F, 0x01, 0x43, 0x47, 0x23, 0xE2, 0x0F, 0xA9, 0x1C, 0xDE, 0xC5,\n    0xAA, 0x2B, 0x24, 0xAB, 0x8F, 0xE0, 0xEC, 0x3A, 0x57, 0xBD, 0xBD, 0x47, 0xF4, 0x86, 0x53, 0x7A,\n    0xC3, 0x32, 0x20, 0x78, 0x3E, 0x0A, 0xDB, 0xBD, 0x33, 0xA4, 0x62, 0x57, 0x55, 0x5B, 0xB3, 0x33,\n    0x48, 0x2E, 0x24, 0xCD, 0x54, 0xB9, 0xD6, 0x7B, 0x73, 0x51, 0xDB, 0x45, 0xC5, 0x91, 0xDF, 0x49,\n    0xC0, 0x83, 0x22, 0x2C, 0x08, 0x9A, 0xE7, 0x24, 0x31, 0xEF, 0xDA, 0x7E, 0x54, 0xE1, 0xAF, 0x43,\n    0xB3, 0xBB, 0x57, 0x79, 0x4A, 0x07, 0xCC, 0x50, 0x6D, 0x2F, 0x32, 0x46, 0x00, 0xE0, 0xCA, 0x4A,\n    0xE6, 0x2C, 0xE6, 0xCD, 0x41, 0x23, 0xE3, 0xB9, 0x2F, 0x6A, 0x9B, 0xB7, 0xDE, 0x17, 0x50, 0xEA,\n    0x38, 0x58, 0x97, 0x40, 0x34, 0x4A, 0x9A, 0x57, 0x5E, 0x68, 0x1A, 0xA3, 0xF9, 0x53, 0xB3, 0xC3,\n    0x5F, 0xC5, 0x20, 0x37, 0xC9, 0x59, 0xFC, 0xE4, 0xFC, 0x3F, 0xD4, 0x5B, 0xBA, 0xF8, 0xB4, 0xAD,\n    0x50, 0x65, 0xAE, 0xDC, 0x5D, 0xE6, 0xF9, 0x95, 0xF2, 0xAC, 0x41, 0xC2, 0x96, 0x0F, 0x3F, 0x1F,\n    0xE3, 0x33, 0x7A, 0x0B, 0x13, 0x2D, 0x68, 0x34, 0xAA, 0x23, 0x5B, 0xC9, 0x81, 0x9D, 0xD1, 0x97,\n    0x4A, 0x5A, 0x55, 0xD6, 0xF9, 0xCE, 0x7F, 0xA2, 0x05, 0x00, 0x63, 0xF8, 0xF8, 0xE2, 0xD4, 0x43,\n    0x2B, 0x92, 0x63, 0x49, 0x3B, 0xE0, 0x05, 0x60, 0xBA, 0x29, 0x1F, 0x20, 0x09, 0x3E, 0xB9, 0x56,\n    0xF8, 0x8D, 0xBC, 0x23, 0xAA, 0xC8, 0xDB, 0xAE, 0xF7, 0xED, 0x15, 0x6E, 0xFE, 0xA8, 0xBA, 0xFC,\n    0xD5, 0x5B, 0x85, 0xCC, 0x78, 0xC6, 0x50, 0xA1, 0x96, 0xE8, 0x0D, 0x56, 0xBD, 0x45, 0x35, 0xFB,\n    0xF3, 0xF0, 0x1F, 0x87, 0x90, 0xD8, 0x1B, 0x49, 0x3B, 0x8B, 0xB6, 0x44, 0xF5, 0x08, 0xA7, 0xCB,\n    0xE6, 0x29, 0x72, 0x01, 0xC5, 0x73, 0x07, 0xD3, 0x6F, 0x8A, 0x08, 0xBC, 0x35, 0x07, 0x7B, 0xE8,\n    0x3F, 0x85, 0xE4, 0x63, 0x23, 0xF2, 0x99, 0x99, 0x52, 0x6D, 0x4F, 0xEC, 0xAE, 0x92, 0x8A, 0xB1,\n    0x5D, 0x62, 0x20, 0xFE, 0xC6, 0x8B, 0x5B, 0xA1, 0xD9, 0x21, 0x1E, 0xB5, 0x26, 0x6C, 0x53, 0x92,\n    0x9C, 0x82, 0x66, 0xCD, 0xA0, 0x2E, 0xD2, 0x72, 0xE2, 0xEB, 0xB1, 0x21, 0xCD, 0xC6, 0xC2, 0xB0,\n    0xB8, 0x13, 0x96, 0x1B, 0xF3, 0x5E, 0xF8, 0x46, 0xA2, 0xA7, 0x73, 0xFB, 0x67, 0xCB, 0x5E, 0x24,\n    0x1E, 0x1A, 0x40, 0xA2, 0x96, 0x9E, 0x72, 0x44, 0x3F, 0xFA, 0x4C, 0x03, 0x9B, 0x2B, 0x0E, 0x44,\n    0xDB, 0x0F, 0x2F, 0x55, 0x82, 0xAF, 0x08, 0x27, 0x85, 0xFB, 0xFE, 0x55, 0x08, 0x28, 0x85, 0x04,\n    0x92, 0x0D, 0xC7, 0x25, 0x48, 0x2C, 0x2A, 0x49, 0x31, 0x52, 0x65, 0xB4, 0xB4, 0xF2, 0xC0, 0xD2,\n    0x64, 0x0C, 0xB0, 0xEB, 0xC3, 0x6F, 0x11, 0xF6, 0xB3, 0x8B, 0xB1, 0xA8, 0x1F, 0xB2, 0x69, 0x46,\n    0x7E, 0x15, 0xFE, 0xCC, 0xE2, 0x1A, 0xF9, 0x1F, 0x7B, 0x65, 0xDD, 0xA6, 0xD9, 0x10, 0x03, 0xD5,\n    0x37, 0x8C, 0x25, 0x41, 0x0B, 0xFF, 0xFF, 0xF8, 0x46, 0xCE, 0x8A, 0x7A, 0x9F, 0x74, 0x61, 0xD8,\n    0xD4, 0x64, 0xE6, 0xF1, 0x46, 0xC6, 0x04, 0xC0, 0xEA, 0xDB, 0x10, 0x40, 0x6B, 0x9B, 0xD0, 0xC1,\n    0x45, 0x83, 0x1C, 0x74, 0xA8, 0x3B, 0x5F, 0xC9, 0x45, 0x69, 0x70, 0x90, 0xBD, 0x93, 0x79, 0x82,\n    0x71, 0x96, 0x75, 0x23, 0x01, 0x9A, 0x3B, 0x0E, 0xCA, 0x7D, 0xDE, 0x66, 0x49, 0x57, 0x11, 0xB2,\n    0xBF, 0xB4, 0x7E, 0x33, 0xEB, 0xA4, 0x4E, 0xE0, 0x33, 0xCC, 0x44, 0x6F, 0x89, 0xEC, 0xD0, 0x7D,\n    0x75, 0x79, 0x41, 0x96, 0x37, 0x9D, 0x5A, 0x82, 0x7A, 0xAA, 0xE8, 0x1A, 0x43, 0xA3, 0xE8, 0x1A,\n    0x24, 0x14, 0x29, 0x84, 0xE0, 0x2E, 0xD0, 0x7F, 0xAC, 0x35, 0x52, 0xF2, 0xE5, 0xD5, 0xA9, 0x7B,\n    0x9F, 0x55, 0xF3, 0xF1, 0xCB, 0x31, 0x3C, 0xDF, 0x22, 0x4A, 0x1A, 0x47, 0xB7, 0x5E, 0x3A, 0x8C,\n    0x1A, 0xF2, 0xE7, 0x0C, 0x9A, 0xC8, 0xE4, 0xF9, 0xF9, 0x30, 0xC7, 0x00, 0x9F, 0x57, 0xEF, 0x67,\n    0xB4, 0x36, 0x0A, 0xF9, 0xB4, 0x3F, 0xE6, 0x20, 0x66, 0x36, 0x88, 0x60, 0x19, 0x74, 0x8B, 0x29,\n    0x55, 0x64, 0xF2, 0x6C, 0x9D, 0x3B, 0xF4, 0xE9, 0xC8, 0x74, 0x48, 0x48, 0xCA, 0x56, 0xFF, 0x74,\n    0xE7, 0x39, 0x98, 0xD9, 0x1D, 0xCE, 0x22, 0x98, 0x35, 0xB6, 0xF5, 0xA8, 0x70, 0x51, 0xA8, 0x53,\n    0x6C, 0xEB, 0xB7, 0x99, 0xDF, 0x97, 0x34, 0x3C, 0x51, 0x74, 0x4E, 0x1E, 0xB9, 0xF4, 0x11, 0xB6,\n    0x3B, 0xAC, 0x5F, 0x32, 0xA3, 0xB8, 0x3E, 0xB3, 0x78, 0x45, 0xEB, 0x08, 0xB2, 0xAB, 0xA8, 0xD9,\n    0xBD, 0x32, 0x95, 0xD2, 0x5C, 0xAE, 0xF2, 0x86, 0x82, 0x1A, 0x53, 0xBB, 0x97, 0xA4, 0x8E, 0x4E,\n    0xD4, 0x1B, 0x3D, 0x5B, 0x70, 0x4A, 0xCE, 0x7A, 0x1A, 0xBD, 0xAE, 0xF0, 0xE4, 0xF2, 0xC0, 0x9D,\n    0x00, 0xBA, 0xD7, 0xAF, 0xF6, 0x63, 0x7D, 0x7C, 0xA0, 0x58, 0x29, 0x45, 0xBF, 0x96, 0x8F, 0x5D,\n    0xE1, 0x79, 0x75, 0x52, 0x98, 0xBF, 0x8E, 0x2C, 0x9B, 0xAE, 0xA5, 0x1B, 0x2A, 0xB0, 0x8A, 0x89,\n    0x25, 0xFE, 0x4D, 0xDA, 0x12, 0xFE, 0xA5, 0x11, 0xC3, 0x72, 0xEB, 0xE5, 0x91, 0xE0, 0xD8, 0x7E,\n    0x9B, 0xD1, 0x2D, 0xA5, 0x25, 0x3D, 0x18, 0x53, 0x68, 0x5C, 0x22, 0x7D, 0x18, 0x0A, 0x12, 0x3D,\n    0x40, 0x08, 0x40, 0x59, 0xA6, 0x12, 0x5F, 0x1C, 0x3A, 0xC5, 0xF5, 0xDB, 0xF6, 0x8D, 0x04, 0x90,\n    0xF9, 0xB7, 0x43, 0x6D, 0x88, 0x42, 0x0F, 0x5F, 0x97, 0xD0, 0x6E, 0x1B, 0xA3, 0xED, 0x0E, 0xEA,\n    0x68, 0xDE, 0x9C, 0x42, 0x91, 0xE3, 0xC2, 0xFC, 0xB3, 0x06, 0x7F, 0x55, 0x43, 0x07, 0x1B, 0x76,\n    0xC2, 0x8F, 0xFE, 0x55, 0xA9, 0x08, 0x83, 0x7F, 0xC5, 0xD9, 0x69, 0xAB, 0x91, 0xCC, 0x68, 0x6C,\n    0x7C, 0xCA, 0x45, 0x99, 0x72, 0x15, 0xF1, 0x50, 0x47, 0xC6, 0x10, 0xAD, 0xB2, 0x91, 0x93, 0xEA,\n    0x02, 0x57, 0x73, 0x96, 0x91, 0xB3, 0xD1, 0x06, 0x33, 0x2F, 0x73, 0xB0, 0x9F, 0xB1, 0xC3, 0x44,\n    0x48, 0x3F, 0xB0, 0x99, 0xD4, 0xE5, 0x89, 0x03, 0xC6, 0x10, 0x31, 0xBA, 0xD4, 0xD0, 0x93, 0x91,\n    0xBC, 0x21, 0xFA, 0xEA, 0x4B, 0xB1, 0x1A, 0x01, 0x88, 0x0C, 0x30, 0x03, 0x78, 0x8D, 0xF6, 0xF5,\n    0x99, 0x57, 0x1B, 0x00, 0xBB, 0x08, 0x31, 0x23, 0xA4, 0xAD, 0x68, 0x59, 0x80, 0xE5, 0x52, 0x59,\n    0x32, 0xE0, 0xC2, 0x93, 0x3B, 0x99, 0xC2, 0x0E, 0x03, 0x46, 0x4A, 0x5E, 0x12, 0x24, 0x7F, 0xE8,\n    0x35, 0xA5, 0xA3, 0x1A, 0xB6, 0xF6, 0xA5, 0xBE, 0xEA, 0x93, 0x04, 0xFA, 0x06, 0x0A, 0x9B, 0xEB,\n    0x0D, 0x9C, 0x52, 0x57, 0xC7, 0x88, 0x59, 0xAF, 0x2A, 0x72, 0x59, 0x7C, 0xB3, 0xFC, 0x92, 0x1B,\n    0x6E, 0xE4, 0x76, 0x1F, 0xD5, 0xFC, 0x4A, 0xF1, 0x2B, 0xEF, 0x64, 0xF8, 0x48, 0x17, 0x43, 0x7E,\n    0x1A, 0xC0, 0xAE, 0x3B, 0xC1, 0xC2, 0x37, 0x2E, 0xDC, 0x16, 0xAB, 0x8F, 0xE7, 0x54, 0x9D, 0x7C,\n    0xFD, 0x38, 0xC0, 0xE7, 0x7F, 0xF9, 0x5E, 0x54, 0x56, 0x51, 0xE9, 0x37, 0x95, 0x8A, 0x9E, 0xF0,\n    0x8F, 0x86, 0x57, 0xE8, 0x49, 0x1C, 0xCE, 0x26, 0x29, 0x94, 0x8C, 0x31, 0x35, 0xB3, 0xD5, 0x7A,\n    0x22, 0x36, 0xFB, 0x8A, 0x65, 0x21, 0xED, 0x02, 0x0D, 0x97, 0x92, 0xD5, 0x37, 0x6E, 0x25, 0xAC,\n    0x23, 0xC2, 0x92, 0xCF, 0xF4, 0x11, 0x9B, 0x04, 0x58, 0x31, 0x9C, 0xB6, 0xFA, 0xF8, 0x60, 0xDF,\n    0xA1, 0xE0, 0x53, 0x5F, 0x78, 0x5D, 0x27, 0x02, 0xD7, 0x60, 0xD3, 0x78, 0xF6, 0xF8, 0x0D, 0xA7,\n    0x9F, 0x07, 0x91, 0xAB, 0xDC, 0xB6, 0xB4, 0x8E, 0xD3, 0xCE, 0x44, 0x30, 0xEE, 0xEC, 0x94, 0x32,\n    0xB0, 0x0C, 0x49, 0x07, 0x88, 0x76, 0x67, 0xC0, 0xD7, 0x46, 0x84, 0x1F, 0x07, 0xBA, 0x1A, 0xD6,\n    0xB9, 0x3B, 0xBF, 0xD1, 0x81, 0xF0, 0xE0, 0xB8, 0xB4, 0xE8, 0x00, 0x20, 0x74, 0xA2, 0x2D, 0x25,\n    0x40, 0xE6, 0x97, 0x0C, 0xCA, 0xCF, 0xE6, 0xCD, 0x47, 0x9A, 0xAC, 0xD8, 0x68, 0x96, 0x80, 0x3F,\n    0x1C, 0x2E, 0x22, 0x8F, 0x34, 0x37, 0xCC, 0x7A, 0xC5, 0x30, 0x24, 0xB7, 0x98, 0x25, 0x62, 0x41,\n    0x6C, 0x9B, 0x38, 0x51, 0x91, 0x99, 0x98, 0x61, 0x54, 0xE7, 0x56, 0xD0, 0x76, 0x4D, 0xFB, 0xEB,\n    0xE3, 0x7A, 0x85, 0xCF, 0x18, 0x31, 0x6D, 0xD8, 0x58, 0x17, 0x40, 0x18, 0x9F, 0xED, 0x01, 0xBF,\n    0x68, 0x6D, 0x5E, 0x3D, 0xE7, 0x02, 0x37, 0xF8, 0x11, 0x71, 0x2D, 0x1A, 0xD4, 0x7E, 0xC6, 0xBD,\n    0x48, 0xB9, 0xE5, 0xF1, 0xF5, 0x9C, 0x6B, 0x34, 0xC4, 0xB8, 0xB2, 0x24, 0x04, 0x9E, 0xFC, 0x02,\n    0x99, 0x5E, 0xF6, 0x3B, 0x37, 0xAA, 0xA6, 0x54, 0xAB, 0x34, 0x46, 0x26, 0xF5, 0xC7, 0x5E, 0x06,\n    0xFA, 0x6E, 0x6E, 0xB1, 0x6E, 0xBC, 0xF1, 0x64, 0xDB, 0x86, 0x07, 0x69, 0x35, 0x51, 0x72, 0xCE,\n    0x8B, 0x3C, 0xE5, 0x1D, 0xB0, 0x54, 0xCD, 0xDE, 0x29, 0x52, 0x72, 0x7F, 0xDF, 0xA0, 0xE7, 0x75,\n    0xDA, 0xED, 0x05, 0xE9, 0x5E, 0xFE, 0x7F, 0xE5, 0xEF, 0x3B, 0x21, 0x0E, 0xD0, 0x08, 0xE7, 0x7F,\n    0x77, 0x69, 0xF3, 0x5D, 0x00, 0xB1, 0x51, 0xC4, 0x0C, 0xBA, 0x8D, 0xC2, 0x5E, 0x36, 0xE9, 0xF7,\n    0xCC, 0x50, 0xEE, 0xD8, 0xF9, 0x5E, 0x53, 0x26, 0x49, 0x7B, 0xAD, 0xE2, 0x80, 0xDF, 0xBE, 0x0D,\n    0xD1, 0x6A, 0x86, 0x35, 0x34, 0x6D, 0x35, 0x6D, 0x2F, 0xA9, 0xAC, 0x14, 0xE7, 0x06, 0xB5, 0x75,\n    0xED, 0x5A, 0xF5, 0x5B, 0xE1, 0xA5, 0x64, 0x55, 0x0F, 0x72, 0x1A, 0x43, 0x70, 0x48, 0x6B, 0x13,\n    0xC1, 0x18, 0x2C, 0x50, 0xC7, 0xCF, 0x7D, 0x69, 0x2C, 0x20, 0xD3, 0xEE, 0xE0, 0xB7, 0x29, 0x97,\n    0xB2, 0x89, 0xF8, 0xAF, 0x4B, 0x4D, 0xBB, 0x44, 0xFB, 0xC6, 0x28, 0x1D, 0xD3, 0x05, 0xD2, 0xF5,\n    0x59, 0x2D, 0x92, 0x7D, 0xEC, 0xB0, 0x81, 0x76, 0x76, 0x7A, 0xF8, 0x09, 0x8E, 0x67, 0x5A, 0xAC,\n    0x77, 0x4C, 0x64, 0x4D, 0x6B, 0x61, 0xE9, 0x27, 0x85, 0x91, 0x57, 0xF9, 0x45, 0xF0, 0xFC, 0xCC,\n    0x11, 0x0E, 0x6D, 0x84, 0x8F, 0x21, 0xE4, 0xB2, 0xA7, 0x7B, 0x9B, 0x31, 0xF9, 0xEF, 0x45, 0xE1,\n    0x3F, 0x74, 0x10, 0xEA, 0xF5, 0xBF, 0x65, 0x7E, 0xC8, 0xCF, 0x01, 0xBD, 0x40, 0x41, 0x32, 0x9D,\n    0x3E, 0xC0, 0x00, 0xC1, 0x9E, 0x6A, 0xE2, 0x54, 0xA1, 0x0D, 0xB3, 0x84, 0x3A, 0xD4, 0x08, 0xC7,\n    0x4D, 0x6A, 0x01, 0xC5, 0xD3, 0xB9, 0x80, 0xB9, 0x3C, 0xD1, 0x81, 0xB7, 0x5D, 0x8D, 0x37, 0xD4,\n    0x3C, 0x5A, 0xDC, 0xC9, 0xDD, 0x84, 0x4F, 0x56, 0xBC, 0xCC, 0xA5, 0x0D, 0x9A, 0x53, 0x9D, 0xCC,\n    0x7A, 0x52, 0xA7, 0xAE, 0x3A, 0x7F, 0x4E, 0xE1, 0x63, 0xAE, 0xFF, 0x0E, 0xA7, 0x7A, 0x3B, 0x05,\n    0x0A, 0x53, 0xC5, 0xAC, 0xD3, 0x58, 0xB5, 0xB6, 0xE1, 0xC1, 0x8B, 0x1C, 0xEF, 0x77, 0xEB, 0x2A,\n    0xAF, 0x41, 0xDA, 0x4D, 0xBC, 0xC5, 0x37, 0x27, 0xCD, 0x20, 0xBD, 0xA9, 0x83, 0x64, 0xA6, 0x28,\n    0xDE, 0x1C, 0xD7, 0x7A, 0x98, 0xEA, 0x55, 0x3D, 0xE2, 0x59, 0x2F, 0x4E, 0x96, 0xEE, 0xB2, 0xAF,\n    0xAA, 0xD3, 0xC7, 0x03, 0xEB, 0x47, 0x37, 0xF5, 0x3C, 0x6A, 0x07, 0x88, 0x20, 0x9D, 0x2A, 0xD8,\n    0xED, 0x0F, 0x38, 0xB7, 0x55, 0x3E, 0x99, 0x67, 0x8A, 0x80, 0x0F, 0x20, 0x38, 0xC2, 0x3E, 0x21,\n    0x65, 0x07, 0x62, 0x7D, 0x56, 0xE2, 0x61, 0x3E, 0x1F, 0x29, 0x20, 0x06, 0x2E, 0xB4, 0xEA, 0x23,\n    0x72, 0x91, 0xB6, 0x2B, 0x78, 0xB1, 0x01, 0xF0, 0x25, 0x0E, 0x6F, 0xD0, 0x3A, 0x98, 0x14, 0x4B,\n    0xF7, 0x18, 0x27, 0x70, 0xBF, 0x89, 0x29, 0xF2, 0x0C, 0xFA, 0xAC, 0x26, 0x73, 0xBC, 0xAA, 0x21,\n    0x5C, 0x0A, 0xC4, 0xF6, 0x95, 0x10, 0xA3, 0x90, 0x46, 0x49, 0x5C, 0x53, 0x25, 0x95, 0x93, 0x80,\n    0x0F, 0xF3, 0xB5, 0xA1, 0x7F, 0x27, 0xD5, 0xF2, 0x9D, 0x41, 0xA0, 0x34, 0xAB, 0xDC, 0xD2, 0x8F,\n    0xA4, 0xBC, 0xE8, 0x54, 0x06, 0x60, 0x13, 0x6D, 0x9B, 0x74, 0x57, 0x82, 0x1C, 0x0D, 0x1F, 0xDB,\n    0x54, 0xC3, 0x4F, 0x0C, 0xC3, 0x99, 0x0F, 0xF6, 0x6B, 0x6A, 0x72, 0x4F, 0x2C, 0x01, 0x0C, 0x91,\n    0xDC, 0x06, 0x05, 0xA7, 0xCC, 0xD4, 0x6C, 0xB3, 0x35, 0xAF, 0x10, 0xDE, 0xEE, 0xE6, 0x42, 0x93,\n    0x11, 0x41, 0x66, 0x86, 0x2F, 0xD6, 0xCF, 0xC3, 0xA7, 0x61, 0x24, 0xD0, 0xC8, 0x9D, 0x8B, 0x01,\n    0x68, 0xF7, 0x54, 0x10, 0x5C, 0xE7, 0x01, 0x49, 0xA3, 0x4D, 0x5D, 0x97, 0xEA, 0x79, 0xA8, 0xFA,\n    0x09, 0x0F, 0xAD, 0x93, 0x16, 0xCD, 0x75, 0x6B, 0x70, 0x79, 0xDB, 0xC3, 0xC8, 0x04, 0xE1, 0xD6,\n    0xDA, 0x11, 0x8E, 0x4B, 0xB6, 0x6E, 0x60, 0x5D, 0x21, 0xAA, 0xB0, 0xC0, 0xA0, 0xCD, 0xC7, 0x81,\n    0x92, 0x0F, 0xF3, 0xBC, 0xA3, 0x80, 0x5C, 0x54, 0xCA, 0x05, 0x9C, 0x75, 0x5B, 0x80, 0x3E, 0x66,\n    0x76, 0x65, 0xAA, 0x96, 0xE3, 0x6E, 0x9A, 0x6C, 0x09, 0xEC, 0x74, 0xF3, 0x95, 0x7A, 0xA8, 0x0F,\n    0x4D, 0x08, 0x1B, 0x39, 0x7F, 0xA3, 0x27, 0xA3, 0x50, 0x4F, 0xCA, 0x1A, 0xDA, 0x40, 0xFE, 0x6F,\n    0x63, 0xFB, 0xB6, 0xBC, 0x03, 0x8F, 0xBD, 0x4A, 0x95, 0xE2, 0xA1, 0xCE, 0x1E, 0xFA, 0xE6, 0xF0,\n    0x6D, 0x65, 0x7E, 0x03, 0x6C, 0xEF, 0x10, 0x88, 0x2F, 0xC3, 0x35, 0xFC, 0x67, 0xDB, 0xEF, 0xF3,\n    0xA1, 0xBC, 0x5B, 0x12, 0x9C, 0x4C, 0xFF, 0xD9, 0x5E, 0x53, 0x4E, 0xEC, 0x9C, 0x67, 0x9F, 0xED,\n    0x24, 0x75, 0x9D, 0xC5, 0xE0, 0xCB, 0x74, 0x89, 0x0D, 0x0B, 0x3B, 0x85, 0x24, 0x12, 0xAA, 0xF8,\n    0x22, 0x32, 0xAC, 0xDD, 0x3B, 0xC6, 0x90, 0x6F, 0xEF, 0xBB, 0x72, 0xEF, 0xCA, 0x0D, 0xB1, 0x49,\n    0x30, 0x9B, 0xE3, 0xBC, 0x50, 0x8D, 0x8D, 0xE0, 0x21, 0x79, 0x64, 0x89, 0x01, 0x59, 0xEF, 0xD6,\n    0x0C, 0x83, 0xED, 0xA4, 0x23, 0xCB, 0x41, 0xC5, 0x4D, 0x10, 0xC4, 0xCF, 0xC2, 0x2F, 0xC7, 0xA3,\n    0xD9, 0x03, 0xF5, 0x11, 0xD4, 0x2C, 0xC5, 0x31, 0x62, 0xF6, 0xAF, 0x90, 0x39, 0x3D, 0xC8, 0xCB,\n    0x9F, 0x98, 0xCD, 0x00, 0xBD, 0x0E, 0x80, 0xE4, 0xDF, 0xE7, 0x66, 0x00, 0x19, 0xA4, 0x8D, 0x40,\n    0x1A, 0x1E, 0xED, 0x2B, 0xD2, 0xAB, 0xDC, 0x6E, 0x0F, 0x0A, 0xD4, 0xD7, 0x44, 0xC7, 0x74, 0x85,\n    0xC2, 0xF2, 0x63, 0x96, 0x62, 0x90, 0x56, 0x0D, 0x3B, 0x27, 0x1A, 0xB1, 0xBF, 0x9F, 0x58, 0x07,\n    0xF1, 0xF5, 0x3E, 0xAF, 0x07, 0x00, 0x76, 0xA9, 0xB7, 0x38, 0x7A, 0xBC, 0xF8, 0xD7, 0x83, 0xF7,\n    0x17, 0x9F, 0xD5, 0xD5, 0x0A, 0x34, 0xBE, 0x07, 0x28, 0xFB, 0xA9, 0x00, 0xC3, 0x2A, 0xD0, 0x32,\n    0xC6, 0xAD, 0x4A, 0x58, 0x5E, 0xD9, 0xAD, 0x4D, 0x86, 0x14, 0x1D, 0x3E, 0xEB, 0xE9, 0xE5, 0x7D,\n    0xD0, 0x95, 0x33, 0x54, 0xEC, 0xC1, 0x72, 0x8B, 0xD1, 0x5A, 0x23, 0xBF, 0xB8, 0xD0, 0x85, 0x6E,\n    0x38, 0x93, 0xD7, 0xD4, 0xE9, 0x7C, 0x03, 0xC7, 0x21, 0x3F, 0x38, 0x36, 0xFB, 0xF5, 0xAD, 0xF4,\n    0xCA, 0x1A, 0x03, 0x82, 0x9B, 0x3B, 0xEB, 0xB0, 0x0F, 0xE1, 0xEF, 0x98, 0x6D, 0x76, 0x8C, 0x1E,\n    0xDC, 0xBA, 0x45, 0xE0, 0xE9, 0xAE, 0xC7, 0xC9, 0xAC, 0x91, 0xE7, 0xB5, 0xD1, 0x18, 0xFA, 0x56,\n    0x5A, 0xA1, 0x92, 0xF9, 0x2C, 0x9C, 0x06, 0x4F, 0x34, 0xDD, 0x80, 0xB5, 0xF4, 0x5F, 0x7E, 0xE0,\n    0xAF, 0xAB, 0xDE, 0x95, 0x72, 0x7F, 0xCD, 0x5D, 0x29, 0x54, 0x6A, 0xA8, 0x13, 0x5B, 0xDB, 0xCB,\n    0x30, 0xEE, 0x56, 0xD3, 0x45, 0x8E, 0xCB, 0x59, 0xDA, 0x07, 0xED, 0xEC, 0x43, 0x5E, 0x17, 0x44,\n    0xAF, 0xBC, 0x81, 0x5C, 0x4B, 0xDB, 0xAE, 0xA0, 0x46, 0x19, 0xA8, 0x61, 0x35, 0x9F, 0x17, 0xB3,\n    0xAF, 0xCC, 0x22, 0xC6, 0x0B, 0x78, 0x58, 0xE9, 0x87, 0xE2, 0x2D, 0x96, 0xF0, 0xA9, 0x62, 0x12,\n    0x35, 0xD0, 0x46, 0x6C, 0x61, 0xAE, 0xB9, 0x5D, 0x5A, 0xDE, 0x8B, 0x7F, 0xAC, 0x9E, 0x29, 0xA1,\n    0xEA, 0xC7, 0x1B, 0x24, 0x9E, 0x08, 0x48, 0xBD, 0x23, 0xF6, 0xAB, 0x4E, 0xE9, 0xDE, 0xAF, 0x4C,\n    0x79, 0xCC, 0x52, 0xB2, 0xAC, 0xF4, 0x01, 0xA9, 0xA8, 0x02, 0x9B, 0x14, 0x86, 0x4B, 0xEE, 0x94,\n    0xA8, 0x34, 0x6C, 0x00, 0x4F, 0x4C, 0xE1, 0x6D, 0xF9, 0x19, 0x8F, 0x36, 0x5E, 0x22, 0x5D, 0xB7,\n    0x03, 0x62, 0x7C, 0x4D, 0xC4, 0xF0, 0x4C, 0x3C, 0x5F, 0xBD, 0x0E, 0xB0, 0x74, 0x14, 0x08, 0xEE,\n    0x0E, 0x06, 0x65, 0xAB, 0x69, 0x7A, 0x70, 0x67, 0xC2, 0x12, 0x04, 0x45, 0xF2, 0xC8, 0xD7, 0x80,\n    0x7F, 0xDB, 0xB5, 0xD0, 0xF7, 0xAB, 0x62, 0x7A, 0xFA, 0xD6, 0x1A, 0x9E, 0x14, 0x4C, 0x4A, 0x6C,\n    0x75, 0x81, 0x37, 0xEF, 0x68, 0x4A, 0x5D, 0x23, 0xDD, 0x7E, 0xF5, 0xDD, 0x9E, 0xEF, 0xB3, 0xC8,\n    0x3F, 0x18, 0x65, 0x42, 0x14, 0x68, 0x77, 0x56, 0x24, 0x8C, 0xAD, 0x7A, 0xC3, 0x1D, 0xB3, 0xAA,\n    0x3C, 0x90, 0x38, 0x65, 0xA2, 0x6A, 0x42, 0xD9, 0x4D, 0xA1, 0xAA, 0x04, 0xA5, 0xE6, 0x36, 0xF4,\n    0xA3, 0x18, 0xA3, 0x9B, 0x8C, 0x9A, 0x5E, 0xAF, 0x6D, 0xDC, 0x6A, 0xD3, 0x61, 0xB7, 0x59, 0x2C,\n    0xF4, 0xE1, 0x16, 0xFF, 0xFC, 0x3D, 0xBC, 0x2F, 0xD6, 0xC1, 0xEE, 0xBD, 0x9B, 0x48, 0x11, 0x90,\n    0x7B, 0xED, 0x58, 0x9B, 0x84, 0x57, 0x85, 0xB3, 0xB3, 0x65, 0x14, 0x08, 0x14, 0x8F, 0x71, 0xF2,\n    0x50, 0x38, 0x7C, 0xCE, 0xEE, 0x47, 0xBD, 0xFD, 0x27, 0x6B, 0x07, 0xB7, 0xB2, 0xBB, 0x05, 0xB0,\n    0x4F, 0xB5, 0x94, 0xA0, 0x30, 0x89, 0x97, 0xD2, 0x2E, 0xE1, 0xCC, 0xAC, 0xDA, 0x95, 0x2F, 0x2E,\n    0xDD, 0xA9, 0xA9, 0xD0, 0xC6, 0xC3, 0x77, 0xB8, 0xBA, 0x19, 0xD2, 0x66, 0x91, 0xB6, 0xA8, 0x4D,\n    0x34, 0xC5, 0xE3, 0xC9, 0x4B, 0x8C, 0x49, 0x68, 0xD2, 0x47, 0xC5, 0x8C, 0x10, 0xE4, 0xBB, 0x40,\n    0x04, 0x7B, 0x26, 0x34, 0x75, 0x53, 0xC5, 0xA5, 0x57, 0x91, 0x11, 0x81, 0x49, 0x79, 0x0F, 0xE9,\n    0x95, 0x33, 0x6C, 0xF2, 0x2F, 0x2A, 0x07, 0x43, 0x71, 0xAD, 0x7B, 0x2C, 0x99, 0xFD, 0x4E, 0xC0,\n    0x8C, 0xC8, 0x69, 0x12, 0xF9, 0x1F, 0x11, 0xFA, 0x28, 0x80, 0xC7, 0xEE, 0x50, 0x63, 0x6D, 0x08,\n    0x88, 0x9D, 0x6C, 0x2E, 0x05, 0x54, 0xC2, 0x0B, 0x26, 0x69, 0xAB, 0xA5, 0xAD, 0xC1, 0xFD, 0xD9,\n    0x1D, 0xE6, 0x85, 0xD5, 0x71, 0xB6, 0xA9, 0xE9, 0x10, 0xB7, 0x2F, 0x1E, 0x12, 0x9C, 0x41, 0x14,\n    0xAF, 0xE0, 0x07, 0x8C, 0xF2, 0xA3, 0x7F, 0xA4, 0x94, 0x91, 0xF9, 0x41, 0x62, 0x8B, 0xE9, 0xA4,\n    0x11, 0x78, 0x9D, 0x75, 0x33, 0x01, 0xBD, 0x7F, 0x1E, 0x4F, 0x2F, 0x80, 0x7A, 0xF9, 0x70, 0x84,\n    0xE6, 0x45, 0xDE, 0x76, 0xD8, 0x36, 0x5C, 0xC1, 0xB9, 0x42, 0x59, 0x85, 0x9C, 0x60, 0x5F, 0x29,\n    0x03, 0x34, 0xE8, 0x65, 0xEB, 0x99, 0x7B, 0xCD, 0x3A, 0x9C, 0xB6, 0x9E, 0xA9, 0xBA, 0x7D, 0x6D,\n    0x9D, 0x27, 0xDD, 0xBE, 0xD4, 0xF9, 0xB5, 0xF8, 0x66, 0xD5, 0xAC, 0x27, 0x9D, 0x8F, 0x72, 0x04,\n    0x1D, 0xA3, 0x91, 0x9E, 0x3C, 0xBA, 0x4B, 0xF7, 0x58, 0x06, 0xBD, 0xE6, 0x8F, 0xB5, 0xA5, 0x8F,\n    0x7F, 0x1C, 0xF9, 0xD9, 0x2E, 0xD6, 0xB0, 0x52, 0x2D, 0x23, 0x8B, 0x8E, 0xD7, 0xE8, 0xFF, 0x5E,\n    0x04, 0x4A, 0xC4, 0xDA, 0x95, 0xA4, 0x91, 0xFF, 0xCB, 0x36, 0x38, 0xEE, 0x47, 0xB7, 0x51, 0xCD,\n    0x80, 0x37, 0x0D, 0x06, 0xB6, 0x56, 0x19, 0xFB, 0xAF, 0x4E, 0x94, 0x57, 0x12, 0xCC, 0x46, 0xD4,\n    0x16, 0x59, 0xF4, 0x83, 0xEF, 0x3C, 0x7C, 0xE3, 0x50, 0x61, 0x69, 0xB3, 0xC7, 0xB5, 0x96, 0xDB,\n    0x89, 0x6C, 0x27, 0xA6, 0x48, 0x67, 0x9F, 0xE8, 0x31, 0x01, 0x6D, 0x16, 0xD4, 0x8A, 0xFF, 0x93,\n    0x47, 0x9D, 0xC6, 0x2C, 0x53, 0x18, 0x01, 0x09, 0x09, 0x35, 0xFD, 0xAA, 0x43, 0x1B, 0xC0, 0xD7,\n    0x9D, 0x84, 0x01, 0x4D, 0x08, 0x51, 0x76, 0xF0, 0x21, 0x21, 0x74, 0x1D, 0xB6, 0x97, 0x0C, 0xEE,\n    0xC8, 0xCA, 0x00, 0x87, 0x52, 0xD9, 0x50, 0xD3, 0x84, 0xC9, 0xF6, 0xB3, 0x3E, 0x69, 0xB8, 0x7A,\n    0xDF, 0x10, 0x02, 0xE9, 0xB1, 0x4E, 0xF7, 0x81, 0x6D, 0x3A, 0x6E, 0x5B, 0x14, 0x78, 0xBF, 0x0E,\n    0x50, 0xB8, 0x63, 0x8B, 0x1F, 0x5F, 0xEB, 0xEA, 0x5C, 0xBB, 0xE8, 0x87, 0x07, 0x60, 0x50, 0x13,\n    0xE1, 0x36, 0xD9, 0x54, 0xEA, 0xDD, 0x9B, 0x9B, 0x53, 0xEF, 0xFD, 0xD6, 0x92, 0x88, 0x90, 0x50,\n    0x18, 0xD2, 0xAA, 0x67, 0xFF, 0xF4, 0x95, 0x06, 0xC4, 0x36, 0xB1, 0x38, 0x74, 0xAA, 0xFD, 0x05,\n    0xC8, 0x0E, 0x59, 0xB3, 0xBA, 0xD3, 0x83, 0x84, 0x3B, 0x96, 0x9E, 0x8D, 0xF4, 0xE2, 0xCA, 0x2A,\n    0x77, 0x0B, 0xD6, 0xE1, 0x2E, 0x37, 0x88, 0x0E, 0xD9, 0x13, 0xC8, 0xF8, 0x6D, 0xFC, 0x70, 0x95,\n    0xF5, 0x83, 0x02, 0xA2, 0x0F, 0x75, 0xD4, 0xE0, 0xEC, 0xFD, 0x4A, 0x82, 0xDD, 0x87, 0x1D, 0xC4,\n    0x57, 0x96, 0x54, 0xDB, 0x36, 0x07, 0x11, 0x0C, 0x0B, 0x94, 0xD0, 0xF4, 0x97, 0x75, 0xF9, 0x1D,\n    0xC4, 0x5D, 0x34, 0x19, 0x38, 0xE1, 0x2A, 0x23, 0xBD, 0x3B, 0xE6, 0x8F, 0xC2, 0x0A, 0x2B, 0x1D,\n    0xFD, 0x2E, 0x68, 0xBC, 0x11, 0xA4, 0xA1, 0x87, 0x98, 0x4E, 0x71, 0x1C, 0xBE, 0x19, 0x3F, 0xFC,\n    0x17, 0x24, 0x52, 0xA5, 0xA3, 0x16, 0xD1, 0xAD, 0x0F, 0xF8, 0x57, 0x9F, 0x7B, 0x8E, 0xD0, 0xC2,\n    0x3F, 0x78, 0x43, 0xDC, 0x58, 0xEA, 0xE2, 0x5B, 0x71, 0x66, 0x46, 0x20, 0x28, 0x01, 0xFC, 0x41,\n    0xAF, 0x19, 0x55, 0xA8, 0x8F, 0xB0, 0x08, 0x91, 0x9C, 0xA5, 0x4C, 0x10, 0xA1, 0xD5, 0x6C, 0x9E,\n    0x85, 0x68, 0x55, 0x5E, 0x07, 0x7B, 0xF6, 0xA3, 0x91, 0xEC, 0x11, 0xA7, 0xE7, 0x2C, 0x6D, 0xF8,\n    0x73, 0x26, 0x53, 0xB5, 0x44, 0x2C, 0x7E, 0x9B, 0xDD, 0x78, 0x24, 0xBA, 0xB9, 0xE5, 0xB2, 0xD1,\n    0x0E, 0xE6, 0xC8, 0x4D, 0x1F, 0x14, 0x32, 0x76, 0x1C, 0xBC, 0xE5, 0x1F, 0xC6, 0x81, 0x0E, 0x38,\n    0xD9, 0xB0, 0xC3, 0x89, 0xE7, 0x51, 0xE2, 0x6D, 0xB5, 0x4C, 0x10, 0x3B, 0xAE, 0x9F, 0x07, 0x6C,\n    0x88, 0x52, 0x09, 0x06, 0xA5, 0x5C, 0x1A, 0x2D, 0x2F, 0x3F, 0x90, 0x2D, 0xB9, 0xB7, 0x85, 0x2F,\n    0xC0, 0xE0, 0x60, 0x4A, 0x7D, 0x24, 0xC3, 0xCD, 0x9C, 0x15, 0x37, 0x5A, 0xF0, 0x56, 0x58, 0x9B,\n    0xA6, 0xB6, 0x0A, 0xED, 0x9E, 0x21, 0xF3, 0xA8, 0x53, 0x78, 0x8C, 0xB4, 0x84, 0x41, 0x02, 0xC4,\n    0xB7, 0xF5, 0x4B, 0xB2, 0x98, 0x9D, 0x89, 0xB8, 0xAD, 0xE3, 0x5E, 0x84, 0xB9, 0xDB, 0xC7, 0xA8,\n    0xC9, 0x20, 0x91, 0x05, 0x8E, 0x4B, 0x6F, 0x74, 0x1D, 0xC9, 0x6D, 0x2A, 0x4A, 0xF1, 0x5E, 0xD1,\n    0x6B, 0xFA, 0xF2, 0x4B, 0xC6, 0x72, 0xB5, 0x99, 0x05, 0xEF, 0xFF, 0xE3, 0x00, 0x97, 0xE1, 0xB6,\n    0x07, 0x1F, 0xBC, 0x95, 0xCD, 0x1F, 0xDC, 0xD5, 0x93, 0x62, 0x7C, 0xA0, 0xEC, 0xCE, 0x9A, 0xC4,\n    0x55, 0x9C, 0x79, 0x23, 0x2A, 0x61, 0x17, 0x46, 0x86, 0x9E, 0x81, 0xC5, 0x40, 0x0D, 0x63, 0xBC,\n    0xAC, 0x52, 0xE8, 0x69, 0xBE, 0x7C, 0x76, 0xE8, 0x12, 0xB3, 0x66, 0x3F, 0xE7, 0xB9, 0x97, 0xF0,\n    0x32, 0xD9, 0xC6, 0xBF, 0xF3, 0x12, 0xC9, 0x9E, 0x93, 0xD8, 0xF4, 0x2E, 0x17, 0x54, 0xA7, 0x32,\n    0xE2, 0xF6, 0x6C, 0xBE, 0xCA, 0xBA, 0x8D, 0x76, 0x11, 0xA2, 0x48, 0xB7, 0x4E, 0x84, 0x42, 0xE5,\n    0xF4, 0xAF, 0x12, 0x4F, 0x56, 0x98, 0x7B, 0xF3, 0xE0, 0x22, 0x94, 0x1A, 0x64, 0xA3, 0xDD, 0x26,\n    0x13, 0x73, 0x96, 0x84, 0x46, 0xB5, 0x98, 0xE4, 0x91, 0xEC, 0xF3, 0x06, 0x37, 0x21, 0x79, 0x77,\n    0x91, 0x02, 0x2E, 0x18, 0xE0, 0x60, 0x75, 0xB8, 0xC5, 0xAD, 0x9D, 0xB3, 0x56, 0x8B, 0x92, 0x0E,\n    0x01, 0xAB, 0x91, 0xF2, 0xDC, 0x41, 0xBC, 0x25, 0xCE, 0x16, 0x31, 0x1B, 0x24, 0x52, 0xD9, 0x02,\n    0x25, 0x4E, 0x64, 0x8A, 0x11, 0x15, 0xB9, 0x20, 0x33, 0x01, 0xD0, 0x4F, 0x6B, 0x04, 0x67, 0x32,\n    0xB9, 0xEC, 0xD0, 0x77, 0xFC, 0x51, 0x0F, 0x9E, 0x5C, 0xF5, 0x3C, 0x18, 0x0A, 0xF2, 0xD3, 0x4E,\n    0x2C, 0x3B, 0xA7, 0xC0, 0x43, 0x33, 0xE8, 0x59, 0x40, 0xB7, 0xAF, 0x75, 0x38, 0xDC, 0x1D, 0xF3,\n    0x77, 0xAD, 0xD9, 0xF7, 0x3A, 0x5D, 0xF4, 0xD4, 0xB5, 0x54, 0x15, 0x73, 0x7B, 0xE7, 0xA3, 0x2B,\n    0x22, 0xE9, 0x09, 0x2C, 0xDE, 0x60, 0x2A, 0x5B, 0xBB, 0xD9, 0xA1, 0xF6, 0x1E, 0x69, 0x38, 0xC2,\n    0x4B, 0xCD, 0xEC, 0xA2, 0xA3, 0x1D, 0xBA, 0xBE, 0x0C, 0xA4, 0x42, 0x01, 0xE9, 0x1C, 0x4A, 0xC6,\n    0xCF, 0xF8, 0x9A, 0x1B, 0x2B, 0x2B, 0x44, 0x81, 0x50, 0x69, 0x85, 0x08, 0xDD, 0xE7, 0xBE, 0xF9,\n    0xBF, 0x65, 0x59, 0xB3, 0x80, 0x5C, 0x85, 0x5D, 0x68, 0x05, 0xBA, 0xA1, 0xDC, 0x32, 0x9C, 0xA9,\n    0x98, 0x7D, 0x3B, 0x4E, 0x03, 0xA4, 0x28, 0x0A, 0x3F, 0xB3, 0x09, 0xA8, 0x0C, 0x5A, 0x92, 0xA3,\n    0xDF, 0xAE, 0x69, 0xBE, 0x5D, 0xFA, 0x75, 0x49, 0xA4, 0x5C, 0xE5, 0xBB, 0xCD, 0x7C, 0xD8, 0x5A,\n    0xAA, 0x77, 0x7C, 0x81, 0xE3, 0xCA, 0xB9, 0x7C, 0xC8, 0xF9, 0x83, 0x8B, 0x84, 0xB7, 0xE6, 0xEF,\n    0x52, 0xF0, 0xC5, 0xB8, 0xAF, 0x7F, 0xA6, 0xA0, 0x4E, 0xE0, 0x1A, 0x41, 0x93, 0x01, 0xF7, 0xBE,\n    0x0E, 0x58, 0x73, 0xFA, 0x43, 0xE7, 0xC0, 0x72, 0x2B, 0x4F, 0x4A, 0x80, 0xBA, 0xC7, 0x2E, 0x19,\n    0x4C, 0xB5, 0xF1, 0xFD, 0x97, 0x11, 0x8A, 0xD3, 0xB7, 0xC9, 0x73, 0x6D, 0x04, 0x9E, 0xAA, 0xC2,\n    0xD3, 0xEE, 0xB9, 0xC0, 0x98, 0x06, 0x9D, 0xA5, 0x6B, 0x19, 0x5B, 0x95, 0x13, 0x6C, 0x27, 0x9E,\n    0x77, 0xFB, 0x66, 0x7B, 0x7F, 0x1E, 0x9D, 0x5D, 0x38, 0x30, 0xB6, 0x7E, 0xA9, 0x0D, 0xF6, 0x8B,\n    0xAE, 0x58, 0x94, 0xA3, 0x3B, 0x67, 0x95, 0xAD, 0xCD, 0xEE, 0x37, 0xB6, 0x4A, 0xC1, 0x68, 0x2B,\n    0x69, 0x5F, 0x46, 0x9F, 0x7D, 0x29, 0x52, 0xEF, 0x7A, 0xCF, 0xB2, 0x28, 0x8C, 0xCE, 0x3D, 0x71,\n    0xBC, 0x0F, 0x46, 0x7F, 0xC2, 0xB9, 0x86, 0x84, 0x9B, 0x45, 0x21, 0x96, 0x01, 0x1D, 0xD7, 0x03,\n    0x48, 0xC5, 0xBB, 0x55, 0x30, 0x18, 0x8A, 0xDA, 0xE8, 0xFA, 0x72, 0x94, 0xE0, 0xD8, 0x13, 0xF1,\n    0x8B, 0x4C, 0xC3, 0xD5, 0x6D, 0x74, 0x92, 0xD0, 0x21, 0xDE, 0xAF, 0x38, 0x99, 0xB3, 0x7D, 0xCB,\n    0xB3, 0xF4, 0x3C, 0xC8, 0xC3, 0xFA, 0xB6, 0x3F, 0xF8, 0x3E, 0x30, 0x82, 0x55, 0x7F, 0x64, 0x71,\n    0xEE, 0x62, 0x6B, 0xFA, 0x1D, 0x97, 0x7E, 0xBC, 0x89, 0xCD, 0x3C, 0x72, 0x6A, 0xEA, 0xE0, 0xDE,\n    0xB7, 0x10, 0x62, 0x16, 0x00, 0x2A, 0xD9, 0x02, 0x47, 0x51, 0xAA, 0x56, 0x8D, 0x1F, 0xC9, 0x04,\n    0x33, 0x87, 0xE3, 0x1F, 0x0F, 0x19, 0xBC, 0x54, 0x17, 0x9A, 0x3A, 0x88, 0x48, 0x81, 0xC0, 0x68,\n    0xC7, 0x96, 0xBB, 0xB7, 0x24, 0x7B, 0xF2, 0xA0, 0x45, 0x65, 0x30, 0x4A, 0xDA, 0x70, 0x78, 0x77,\n    0xC8, 0x0E, 0x98, 0x7B, 0x4E, 0xC3, 0x04, 0x41, 0xDD, 0x9B, 0xA3, 0xED, 0x1A, 0x88, 0x1E, 0x2A,\n    0xCF, 0x8A, 0xB7, 0xD7, 0x86, 0x2F, 0xC1, 0xBF, 0x67, 0xC2, 0x65, 0x70, 0xDC, 0x77, 0x7B, 0xC5,\n    0xFA, 0x03, 0x57, 0x42, 0xAD, 0x92, 0xCF, 0xCB, 0xD0, 0x11, 0x11, 0x9E, 0x93, 0x5B, 0xCB, 0x78,\n    0xC2, 0x55, 0xD6, 0xAD, 0x95, 0x3A, 0x45, 0x32, 0x42, 0x8F, 0xB1, 0x18, 0x17, 0xAF, 0xF2, 0x94,\n    0x21, 0x08, 0x58, 0x13, 0x19, 0x8F, 0x12, 0x51, 0xB7, 0x95, 0x26, 0x8E, 0xD6, 0x9A, 0x82, 0x78,\n    0x4D, 0x58, 0xEF, 0xC0, 0x89, 0x0D, 0xF7, 0xB6, 0xCF, 0x46, 0x28, 0x3C, 0x97, 0x68, 0x32, 0xC5,\n    0x09, 0x25, 0x18, 0xE5, 0x9E, 0x74, 0x0E, 0x73, 0xD8, 0x98, 0xC6, 0x2D, 0xCA, 0xE4, 0xDF, 0x2B,\n    0x8A, 0xE1, 0x15, 0x8D, 0x9F, 0x70, 0xC0, 0x81, 0xCC, 0x9B, 0x4B, 0x0A, 0xA5, 0x0A, 0x82, 0x5F,\n    0xC0, 0x55, 0x73, 0x47, 0x0D, 0xEE, 0x59, 0xFD, 0xE5, 0xDD, 0x52, 0x74, 0xA2, 0x0F, 0xF1, 0xFC,\n    0xE9, 0x14, 0x9C, 0xF7, 0x03, 0x3F, 0xC3, 0xF5, 0xFD, 0x7D, 0x1C, 0xB4, 0x62, 0x8E, 0xDD, 0x01,\n    0x77, 0x96, 0x4D, 0x23, 0x5D, 0x37, 0x88, 0x83, 0x33, 0xB0, 0x75, 0x1E, 0x9D, 0x15, 0xB5, 0x9F,\n    0x78, 0x04, 0x92, 0x9E, 0x54, 0x40, 0x10, 0x4E, 0xFF, 0x5B, 0xF3, 0xF8, 0xFC, 0x67, 0xEF, 0x85,\n    0x1D, 0xFF, 0x0B, 0x2F, 0x5D, 0x54, 0xE1, 0xEA, 0x8C, 0xB8, 0x41, 0x71, 0x91, 0x2D, 0xEB, 0x14,\n    0x78, 0x78, 0x25, 0x95, 0x73, 0x70, 0xED, 0x24, 0x2F, 0x97, 0x51, 0xE0, 0x8E, 0x6E, 0x43, 0x12,\n    0x2B, 0xCF, 0x88, 0xDE, 0xA1, 0xB0, 0xDB, 0x7F, 0x1C, 0xA1, 0x75, 0xD9, 0x54, 0x1D, 0x9E, 0xE1,\n    0x95, 0x68, 0x7E, 0xD4, 0x47, 0xD1, 0x42, 0x61, 0x60, 0xD9, 0xDE, 0x25, 0xC0, 0xD1, 0x5A, 0xB6,\n    0x72, 0xF5, 0x37, 0xF8, 0x73, 0xC2, 0x05, 0xE3, 0xE1, 0x3B, 0x55, 0x29, 0xCB, 0xB0, 0x2D, 0xBD,\n    0x6A, 0xF8, 0x67, 0xF6, 0xCD, 0x8B, 0xE3, 0x80, 0x49, 0x24, 0x38, 0x22, 0x2E, 0xA6, 0x68, 0x25,\n    0x41, 0xCA, 0xEF, 0x0F, 0x33, 0x53, 0xC0, 0xBB, 0x74, 0xEA, 0xC6, 0xC5, 0xA5, 0x5F, 0x07, 0xE6,\n    0x3B, 0xB4, 0xA0, 0x43, 0xFC, 0xA9, 0x28, 0x9B, 0xD2, 0x11, 0x57, 0x61, 0xD9, 0x79, 0x63, 0x5E,\n    0x7A, 0x7E, 0x9A, 0xDF, 0x77, 0x70, 0x0E, 0x0C, 0xDA, 0xD6, 0xCE, 0x6B, 0x92, 0x71, 0x94, 0x9B,\n    0x2B, 0xEE, 0x3B, 0x99, 0xCB, 0x82, 0x19, 0x55, 0x0E, 0x3E, 0xA3, 0xAF, 0x1D, 0xF4, 0x05, 0x1E,\n    0x50, 0x8F, 0x0E, 0x72, 0x6E, 0x16, 0x28, 0xE3, 0xD1, 0xB2, 0x57, 0xBE, 0x54, 0x9F, 0xE8, 0x7F,\n    0xBE, 0xC2, 0x07, 0x22, 0xD0, 0x3E, 0xE4, 0x1A, 0x50, 0xB5, 0x78, 0x48, 0x93, 0xC3, 0x7E, 0xA8,\n    0x62, 0xD1, 0x92, 0x29, 0x52, 0x70, 0xC5, 0x62, 0x5F, 0x44, 0xE8, 0xD5, 0x27, 0x5A, 0x07, 0xBE,\n    0xE2, 0x01, 0xCB, 0x9F, 0xFF, 0xD4, 0x02, 0x15, 0xD8, 0x9E, 0xB6, 0x19, 0x5A, 0x94, 0x2C, 0x74,\n    0xC9, 0xEE, 0x0B, 0x0D, 0x57, 0x32, 0x0E, 0x3C, 0x75, 0xC3, 0xEE, 0xC4, 0x48, 0x13, 0xB3, 0xD1,\n    0x5F, 0xB4, 0xAA, 0xE4, 0x6F, 0xE9, 0x98, 0xD8, 0x02, 0xF4, 0x00, 0xF5, 0xA5, 0x52, 0xED, 0x27,\n    0x3E, 0x40, 0xB1, 0x84, 0x81, 0x3E, 0x79, 0xF0, 0xF4, 0x09, 0x34, 0x36, 0x01, 0xF3, 0xD5, 0x5D,\n    0x68, 0xE8, 0xE0, 0xEF, 0x36, 0xA6, 0x67, 0xBA, 0xD7, 0xE2, 0xC7, 0x06, 0x6A, 0x43, 0xCD, 0xC5,\n    0xD2, 0x78, 0x45, 0x8A, 0xE8, 0x8D, 0x5F, 0x41, 0x10, 0xCA, 0x38, 0x8B, 0x6D, 0x91, 0xF1, 0x05,\n    0x06, 0xDE, 0x51, 0xE8, 0xF9, 0xC3, 0x68, 0xEE, 0x2D, 0x48, 0x09, 0x58, 0x2E, 0x08, 0x18, 0x0B,\n    0xD3, 0x64, 0x6B, 0xD3, 0xB3, 0xC4, 0x66, 0xB7, 0x29, 0x4B, 0xDB, 0x47, 0x40, 0xB2, 0xC7, 0xBD,\n    0x48, 0x21, 0xA0, 0xCF, 0xBC, 0x23, 0xA1, 0x31, 0x42, 0x48, 0x3E, 0xB2, 0xAF, 0x6F, 0x25, 0x95,\n    0x89, 0xCC, 0x8F, 0xC0, 0x4F, 0xA6, 0x37, 0xCE, 0x0A, 0xF7, 0xF5, 0x93, 0xBE, 0x98, 0x5E, 0x5C,\n    0x37, 0x2B, 0xBD, 0x14, 0xD3, 0xF7, 0x1F, 0x38, 0x27, 0xA8, 0xD1, 0x55, 0x18, 0xDD, 0x16, 0xF1,\n    0x3B, 0xC1, 0x20, 0x75, 0x21, 0x30, 0x0B, 0xC3, 0xC1, 0xD9, 0x78, 0x9E, 0x7A, 0xDD, 0xD0, 0x36,\n    0xEF, 0x97, 0xFC, 0x61, 0x45, 0x9B, 0x49, 0x8D, 0x73, 0x70, 0xC5, 0xEC, 0xB0, 0x45, 0x78, 0x09,\n    0x85, 0x42, 0x68, 0x9F, 0x7F, 0x50, 0x35, 0xE4, 0x2A, 0x5F, 0xEB, 0x30, 0xB5, 0x01, 0x0F, 0x5B,\n    0x2B, 0x48, 0xAE, 0xD4, 0x41, 0x00, 0x69, 0x58, 0x7D, 0xCA, 0x23, 0x0B, 0xC0, 0x32, 0xDC, 0x54,\n    0xBA, 0x26, 0x22, 0xB5, 0xB1, 0xDB, 0xF9, 0x5E, 0x81, 0x6E, 0x48, 0xB8, 0x70, 0x66, 0xAA, 0x7E,\n    0x6B, 0x42, 0xB4, 0x51, 0x25, 0xB5, 0x0D, 0x1B, 0x45, 0x4B, 0x6C, 0x31, 0x45, 0xA3, 0x91, 0x56,\n    0x18, 0x2E, 0x34, 0x1A, 0x67, 0x87, 0xA8, 0xC9, 0x6B, 0x72, 0xD8, 0xE5, 0x91, 0x2D, 0x71, 0xD8,\n    0xC8, 0xA4, 0x95, 0xB1, 0xFD, 0xF8, 0x0F, 0xEA, 0x08, 0x4F, 0x11, 0x2A, 0x39, 0xE7, 0xF6, 0x50,\n    0xCC, 0xF7, 0x64, 0xA1, 0x66, 0xE7, 0xA9, 0xDD, 0x49, 0xAB, 0xBF, 0x5B, 0x99, 0x14, 0xE2, 0xD6,\n    0x91, 0x3A, 0x70, 0x08, 0x67, 0x87, 0x7C, 0xB7, 0x76, 0x21, 0xE5, 0x23, 0x32, 0x9F, 0x6F, 0x88,\n    0xBB, 0x10, 0xB6, 0xBE, 0xA2, 0xB1, 0x3E, 0xDA, 0x64, 0x5C, 0x25, 0x0B, 0x0F, 0x94, 0x39, 0x0E,\n    0x21, 0x91, 0x01, 0x60, 0x8C, 0x9B, 0x3D, 0x9E, 0xEB, 0x3C, 0x05, 0x28, 0x66, 0x58, 0x9A, 0x7D,\n    0xA3, 0x2C, 0x42, 0x13, 0xD7, 0x52, 0x09, 0x0A, 0x12, 0x14, 0xB1, 0x05, 0x4D, 0x7C, 0xE4, 0x04,\n    0x2C, 0xC8, 0x93, 0x98, 0xBB, 0x90, 0x7C, 0xDE, 0x31, 0xD1, 0x21, 0x5C, 0x21, 0x75, 0x94, 0x64,\n    0x62, 0x33, 0xB9, 0xCF, 0xD1, 0x5C, 0x77, 0xC0, 0xAB, 0x0A, 0xF8, 0x03, 0x00, 0x35, 0xA1, 0xE9,\n    0x8D, 0xB5, 0x43, 0x6F, 0x94, 0x82, 0xAA, 0xCE, 0xB3, 0x5E, 0x6C, 0x13, 0x45, 0x6F, 0xD5, 0xE8,\n    0x12, 0xFA, 0x4C, 0x68, 0x3D, 0x04, 0x57, 0x77, 0x87, 0x1D, 0xFC, 0xA6, 0x19, 0xC2, 0x09, 0x5B,\n    0x65, 0xD7, 0x86, 0xE2, 0x8E, 0x14, 0x52, 0x92, 0xA5, 0xC9, 0xCA, 0xFD, 0x42, 0x54, 0x12, 0xF3,\n    0xB9, 0x87, 0x11, 0x71, 0x70, 0x8D, 0x98, 0x85, 0xBB, 0x92, 0x36, 0x42, 0x42, 0x4F, 0x2D, 0xDB,\n    0x8A, 0x77, 0x2A, 0x93, 0x8D, 0xF6, 0x87, 0x5D, 0x8F, 0x52, 0x91, 0x5A, 0x50, 0xC2, 0x9D, 0xE3,\n    0x8C, 0xA6, 0xD2, 0x4C, 0xDF, 0xE6, 0xEC, 0xF7, 0x6E, 0x4C, 0xAF, 0x80, 0x28, 0xF1, 0x1A, 0x80,\n    0x25, 0x15, 0x27, 0xFF, 0xB2, 0x6C, 0x3A, 0x49, 0xC1, 0xF4, 0x8F, 0xCD, 0x82, 0x8A, 0xC7, 0x9F,\n    0x3D, 0x32, 0x6D, 0xDD, 0x36, 0xDB, 0x2F, 0x26, 0x60, 0x2F, 0x21, 0x91, 0xBC, 0x8C, 0x53, 0x7C,\n    0x76, 0xEF, 0x8F, 0xE7, 0xE6, 0x1D, 0xA9, 0x32, 0x2C, 0x23, 0x81, 0xF9, 0x07, 0x88, 0xB3, 0xD7,\n    0xBE, 0x83, 0x1A, 0xE4, 0x02, 0x5A, 0x29, 0x72, 0x73, 0x2A, 0x6A, 0xBE, 0x57, 0x3A, 0x05, 0x89,\n    0xD1, 0xD8, 0x26, 0x9B, 0xCF, 0x01, 0x9F, 0xA4, 0xAB, 0xC1, 0x53, 0x62, 0x83, 0xE9, 0x3D, 0xE5,\n    0x7C, 0xA4, 0x2A, 0x98, 0x95, 0x57, 0x19, 0x45, 0xE3, 0x54, 0x43, 0xD4, 0x39, 0x51, 0x3B, 0x27,\n    0x8E, 0xB9, 0x33, 0x90, 0xEF, 0x0E, 0xAD, 0xD2, 0xE6, 0x7A, 0x2A, 0x00, 0xEB, 0x84, 0x3C, 0xE8,\n    0x97, 0x1F, 0x0A, 0xAB, 0x56, 0x0F, 0x9D, 0xB7, 0xD1, 0x67, 0x64, 0x24, 0xF9, 0x89, 0xE1, 0xB6,\n    0x1B, 0xEE, 0xB7, 0xA8, 0xDD, 0x03, 0x40, 0xB0, 0xEB, 0x2D, 0x29, 0x53, 0x81, 0x8B, 0x0C, 0x67,\n    0x53, 0x5E, 0xD3, 0xD5, 0xC5, 0xE6, 0x7C, 0x12, 0xE6, 0xBB, 0x34, 0x24, 0xF1, 0x5B, 0x05, 0xBA,\n    0x6E, 0x16, 0xA7, 0xA9, 0x31, 0xFB, 0x47, 0xE1, 0xFE, 0x67, 0x07, 0xF9, 0x96, 0x34, 0x5A, 0x3E,\n    0x95, 0xAD, 0x64, 0x16, 0xE9, 0xD8, 0x72, 0x58, 0x90, 0x67, 0x52, 0xFE, 0x08, 0x83, 0x35, 0xEB,\n    0x8A, 0x8C, 0xF2, 0xD0, 0xAA, 0x79, 0x42, 0x33, 0x13, 0x8D, 0x34, 0x76, 0xFD, 0x39, 0x2C, 0xEC,\n    0xCA, 0x74, 0x07, 0xC1, 0xE2, 0x47, 0xF4, 0x5C, 0x65, 0x99, 0xE4, 0xBA, 0xC9, 0x41, 0xA4, 0x48,\n    0x51, 0xEF, 0x99, 0x5E, 0x99, 0x4F, 0x74, 0x56, 0x4C, 0xA6, 0xFA, 0xC7, 0x4C, 0xC2, 0xAD, 0xA4,\n    0x3C, 0xF6, 0xD4, 0x8C, 0xB6, 0x91, 0x6B, 0xB4, 0xCE, 0xFB, 0x34, 0xF7, 0xE3, 0xF6, 0x11, 0xE2,\n    0x56, 0x3E, 0xA2, 0x60, 0xA3, 0x47, 0x59, 0x3E, 0xDF, 0x6A, 0x13, 0xB8, 0xED, 0x03, 0x8B, 0x54,\n    0x12, 0xD1, 0x29, 0xFD, 0x06, 0x26, 0x03, 0xF5, 0x25, 0x69, 0x05, 0x6D, 0x73, 0xE6, 0x1D, 0x28,\n    0xC0, 0x6F, 0x75, 0x67, 0xCE, 0xC4, 0xF7, 0x31, 0xBB, 0x21, 0x61, 0xB1, 0xC4, 0x5D, 0x36, 0x50,\n    0xEC, 0xBE, 0x23, 0xEE, 0x47, 0x62, 0x82, 0x6B, 0xE9, 0x79, 0xCE, 0xAF, 0x76, 0x6A, 0xD1, 0xFC,\n    0x79, 0x5E, 0xE8, 0x1E, 0xD8, 0x8F, 0xF9, 0x63, 0x5F, 0x09, 0x1A, 0x21, 0x93, 0x09, 0x90, 0x15,\n    0x62, 0xDE, 0x69, 0x65, 0x8D, 0xA3, 0xAC, 0x79, 0x71, 0xA1, 0xBB, 0xA9, 0xCF, 0x45, 0x89, 0x15,\n    0x1B, 0x7D, 0x49, 0x37, 0x56, 0x2D, 0x52, 0xF1, 0x66, 0x8F, 0x03, 0xA1, 0xE3, 0x93, 0x8C, 0xAC,\n    0xB3, 0x77, 0x89, 0x69, 0x41, 0x23, 0xE4, 0x17, 0xEE, 0x8E, 0x73, 0x06, 0xE4, 0xDC, 0x95, 0x49,\n    0xA6, 0x30, 0xCD, 0x1B, 0x30, 0x42, 0xD9, 0x06, 0xF9, 0x5C, 0x8A, 0x50, 0xBB, 0xA0, 0xA8, 0xEF,\n    0xD3, 0xA1, 0x83, 0xF1, 0xC1, 0x77, 0x4C, 0x4B, 0x7B, 0xCC, 0xEF, 0xE4, 0xB4, 0x4D, 0x50, 0x01,\n    0x1B, 0x44, 0x33, 0xFD, 0xEF, 0xB5, 0x10, 0x72, 0x92, 0x3E, 0x96, 0x61, 0xAB, 0x20, 0x7C, 0x38,\n    0xCB, 0xD7, 0x79, 0xA3, 0x7A, 0x35, 0x87, 0xFA, 0xC6, 0x5E, 0xB8, 0x9E, 0x2C, 0xE5, 0x96, 0xBA,\n    0x6E, 0xF1, 0xC3, 0x63, 0x92, 0x65, 0xEE, 0x05, 0x5B, 0x13, 0xFA, 0xE8, 0x8B, 0xE7, 0xCB, 0x73,\n    0xB9, 0xC9, 0x0F, 0x60, 0xC6, 0x36, 0x1D, 0x8F, 0x9C, 0xC0, 0x83, 0x1A, 0xB4, 0x34, 0xDE, 0xF6,\n    0x13, 0x4E, 0x58, 0x15, 0x3D, 0xD6, 0x21, 0x5F, 0xE6, 0x21, 0x25, 0x15, 0x07, 0xEF, 0xD7, 0x06,\n    0x5D, 0x9A, 0x59, 0xC2, 0x9F, 0x2D, 0x5A, 0xE4, 0x21, 0x19, 0x02, 0xF2, 0x01, 0x5E, 0xC2, 0x80,\n    0xAB, 0x8D, 0x96, 0x38, 0x0F, 0x43, 0x71, 0x61, 0x17, 0x72, 0x1E, 0x16, 0x3E, 0x4B, 0xE1, 0xA0,\n    0xB5, 0x22, 0xFB, 0x74, 0xED, 0x4F, 0xEF, 0x4E, 0x56, 0x8A, 0x52, 0x5D, 0x76, 0x60, 0x9D, 0xE2,\n    0x8B, 0xC0, 0xEC, 0xF3, 0x05, 0x2F, 0x59, 0xE5, 0xC0, 0x68, 0x02, 0xE9, 0x77, 0x17, 0x86, 0x7D,\n    0xC6, 0x71, 0xA7, 0xF1, 0x44, 0x50, 0xB3, 0xFB, 0xB6, 0x27, 0x23, 0x57, 0x5E, 0xCA, 0x18, 0xAA,\n    0xA7, 0x7C, 0xCD, 0xE7, 0xEA, 0xB9, 0xA9, 0xB8, 0xA0, 0x99, 0xF0, 0xED, 0xF1, 0xF8, 0x4D, 0x11,\n    0xFA, 0x04, 0x75, 0xA7, 0x41, 0xC5, 0xB3, 0xFB, 0x37, 0x46, 0x14, 0xBF, 0x89, 0xAB, 0x33, 0x55,\n    0x86, 0x92, 0x36, 0x2F, 0xF6, 0xF1, 0x7B, 0x60, 0x8D, 0xA9, 0x85, 0x48, 0xF5, 0x49, 0x46, 0xD9,\n    0xB3, 0x18, 0xB9, 0x1E, 0x3F, 0x09, 0x87, 0x33, 0x23, 0x72, 0xE8, 0x4F, 0x48, 0xC9, 0xD7, 0x30,\n    0x1C, 0xF0, 0x7B, 0x88, 0xF9, 0xAE, 0x5C, 0x23, 0x42, 0xC8, 0x3D, 0xD4, 0xA4, 0xA9, 0x8F, 0xBA,\n    0x9E, 0xFD, 0x6F, 0xC7, 0x10, 0x4F, 0xFD, 0xA5, 0xAC, 0xA4, 0xBF, 0xDB, 0x1D, 0xFB, 0x67, 0xAA,\n    0x47, 0xE1, 0x8E, 0x47, 0xCC, 0x51, 0xE3, 0xAD, 0x80, 0x63, 0x2A, 0x5A, 0xEF, 0x3B, 0x6B, 0x7E,\n    0x5B, 0xC6, 0x6F, 0x84, 0x3E, 0xD9, 0xAE, 0x3A, 0x7B, 0x2F, 0xED, 0x23, 0x57, 0x56, 0x59, 0x5A,\n    0x35, 0x11, 0x0D, 0xFD, 0x43, 0x06, 0x6C, 0xB3, 0x26, 0xDA, 0xB4, 0xEA, 0x84, 0x94, 0xB8, 0x4F,\n    0x60, 0xAC, 0x3F, 0x2E, 0x9D, 0xF0, 0x1B, 0xD5, 0xCA, 0xF6, 0x97, 0x82, 0x7A, 0x45, 0x76, 0xCC,\n    0xF2, 0x63, 0x3E, 0xED, 0x80, 0x63, 0xB2, 0x1E, 0x18, 0x21, 0x85, 0x84, 0x89, 0xF8, 0xB0, 0x31,\n    0x4F, 0x12, 0x76, 0x8E, 0x3B, 0x32, 0x54, 0x57, 0x95, 0x26, 0x0E, 0xB0, 0x28, 0x65, 0xC3, 0x31,\n    0x18, 0x5B, 0xD1, 0x8E, 0x32, 0x53, 0x40, 0x57, 0xD5, 0x90, 0x16, 0xE6, 0x23, 0xAE, 0xAF, 0x59,\n    0xD1, 0x8B, 0xDC, 0x3D, 0x34, 0xA5, 0x56, 0xCA, 0x61, 0xF2, 0xEE, 0xF4, 0xD2, 0x67, 0x82, 0x54,\n    0x5F, 0x5A, 0x05, 0x94, 0x24, 0xDF, 0xD9, 0xE3, 0x72, 0x20, 0x30, 0x6C, 0x58, 0x25, 0x66, 0x12,\n    0x81, 0x75, 0x46, 0x51, 0xAB, 0xCB, 0x0F, 0xEC, 0x77, 0x84, 0x3D, 0xB1, 0xA7, 0x4A, 0xF5, 0x35,\n    0xAF, 0xF2, 0x01, 0x6C, 0x7F, 0x42, 0xA9, 0x28, 0x76, 0xE4, 0x6E, 0xF2, 0x4B, 0x7E, 0xD0, 0x7D,\n    0x57, 0x2E, 0x25, 0x4F, 0x90, 0x8A, 0x74, 0xB2, 0x87, 0x4C, 0x9C, 0x75, 0x5A, 0xBE, 0xEF, 0x46,\n    0xA1, 0x0D, 0x20, 0xF5, 0x94, 0x7A, 0xA7, 0x72, 0x0A, 0x6E, 0xBC, 0x80, 0x01, 0x14, 0x02, 0x00,\n    0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x74, 0x6F,\n    0x6D, 0x61, 0x72, 0x6B, 0x0D, 0x80, 0x03,\n};\n"
  },
  {
    "path": "core/src/fxge/fontdata/chromefontdata/FoxitSerif.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nconst unsigned char g_FoxitSerifFontData [19469] = {0x1,\n                                                    0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0xe,\n                                                    0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72,\n                                                    0x69, 0x66, 0x4f, 0x54, 0x46, 0x0, 0x1, 0x1,\n                                                    0x1, 0x26, 0xf8, 0x10, 0x0, 0xf8, 0x1c, 0x1,\n                                                    0xf8, 0x1d, 0x2, 0xf8, 0x1d, 0x3, 0xf8, 0x18,\n                                                    0x4, 0xfb, 0x3c, 0xfb, 0x8e, 0xfa, 0x7c, 0xfa,\n                                                    0x2, 0x5, 0x1c, 0x7, 0x9f, 0xf, 0x1c, 0x8,\n                                                    0xf6, 0x11, 0xb6, 0x1c, 0x44, 0xa3, 0x12, 0x0,\n                                                    0x3, 0x1, 0x1, 0x5, 0x2f, 0x3e, 0x45, 0x75,\n                                                    0x72, 0x6f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                    0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f,\n                                                    0x6d, 0x20, 0x53, 0x65, 0x72, 0x69, 0x66, 0x20,\n                                                    0x4f, 0x54, 0x46, 0x0, 0x7b, 0x2, 0x0, 0x1,\n                                                    0x0, 0x9, 0x0, 0x11, 0x0, 0x24, 0x0, 0x2c,\n                                                    0x0, 0x4a, 0x0, 0x54, 0x0, 0x60, 0x0, 0x68,\n                                                    0x0, 0x71, 0x0, 0x86, 0x0, 0x91, 0x0, 0x9e,\n                                                    0x0, 0xb9, 0x0, 0xc1, 0x0, 0xe2, 0x0, 0xff,\n                                                    0x1, 0xb, 0x1, 0x1d, 0x1, 0x25, 0x1, 0x33,\n                                                    0x1, 0x4e, 0x1, 0x55, 0x1, 0x68, 0x1, 0x7a,\n                                                    0x1, 0x7f, 0x1, 0x90, 0x1, 0x94, 0x1, 0x9d,\n                                                    0x1, 0xa9, 0x1, 0xb9, 0x1, 0xc6, 0x1, 0xfb,\n                                                    0x2, 0x14, 0x2, 0x1a, 0x2, 0x34, 0x2, 0x3c,\n                                                    0x2, 0x48, 0x2, 0x59, 0x2, 0x63, 0x2, 0x71,\n                                                    0x2, 0x84, 0x2, 0x89, 0x2, 0x92, 0x2, 0xac,\n                                                    0x2, 0xb6, 0x2, 0xc2, 0x2, 0xe6, 0x2, 0xf0,\n                                                    0x2, 0xfe, 0x3, 0x11, 0x3, 0x19, 0x3, 0x20,\n                                                    0x3, 0x23, 0x3, 0x2a, 0x3, 0x49, 0x3, 0x53,\n                                                    0x3, 0x71, 0x3, 0x8e, 0x3, 0x9c, 0x3, 0xa2,\n                                                    0x3, 0xa8, 0x3, 0xc0, 0x3, 0xd8, 0x3, 0xef,\n                                                    0x3, 0xf7, 0x3, 0xfe, 0x4, 0x2, 0x4, 0x17,\n                                                    0x4, 0x2a, 0x4, 0x30, 0x4, 0x44, 0x4, 0x57,\n                                                    0x4, 0x62, 0x4, 0x69, 0x4, 0x7b, 0x4, 0x87,\n                                                    0x4, 0x98, 0x4, 0xa3, 0x4, 0xb3, 0x4, 0xb9,\n                                                    0x4, 0xbf, 0x4, 0xc5, 0x4, 0xcb, 0x4, 0xd8,\n                                                    0x4, 0xe7, 0x4, 0xf1, 0x4, 0xfb, 0x5, 0xa,\n                                                    0x5, 0x19, 0x5, 0x22, 0x5, 0x28, 0x5, 0x2d,\n                                                    0x5, 0x3b, 0x5, 0x3f, 0x5, 0x4c, 0x5, 0x59,\n                                                    0x5, 0x5e, 0x5, 0x62, 0x5, 0x6e, 0x5, 0x74,\n                                                    0x5, 0x77, 0x5, 0x82, 0x5, 0x8d, 0x5, 0x94,\n                                                    0x5, 0x99, 0x5, 0x9e, 0x5, 0xa3, 0x5, 0xad,\n                                                    0x5, 0xb7, 0x5, 0xc1, 0x5, 0xcb, 0x5, 0xd3,\n                                                    0x5, 0xdc, 0x5, 0xe5, 0x5, 0xee, 0x5, 0xf7,\n                                                    0x6, 0x0, 0x6, 0x5, 0x6, 0xc, 0x6, 0x12,\n                                                    0x6, 0x18, 0x6, 0x1d, 0x6, 0x21, 0x21, 0xa,\n                                                    0x78, 0x5f, 0x6c, 0x2a, 0x1d, 0xb, 0x15, 0xb3,\n                                                    0x6, 0xf7, 0x2e, 0x22, 0x1d, 0xb, 0xec, 0x5,\n                                                    0x95, 0x91, 0x9f, 0x98, 0xa2, 0x1a, 0x8f, 0x8a,\n                                                    0xa7, 0x6b, 0x7d, 0x84, 0x8b, 0x74, 0x74, 0x1e,\n                                                    0xb, 0x36, 0x1d, 0x26, 0xa, 0x3e, 0x7a, 0xa,\n                                                    0xb, 0x70, 0x1d, 0x88, 0x7f, 0x6c, 0x7c, 0x1e,\n                                                    0x86, 0x82, 0x6c, 0x74, 0x75, 0x1b, 0x66, 0x6e,\n                                                    0xaa, 0xba, 0x1f, 0x8d, 0x7, 0xad, 0x96, 0xc3,\n                                                    0xf7, 0x2b, 0xbd, 0x1e, 0x2a, 0xa, 0xb, 0x2b,\n                                                    0x1d, 0xfb, 0x11, 0xf7, 0x3b, 0x5, 0x4d, 0x6,\n                                                    0xb, 0x37, 0x1d, 0x4e, 0xfb, 0x4d, 0xfb, 0x22,\n                                                    0xd7, 0x39, 0x2b, 0xa, 0xb, 0x2d, 0xa, 0x8a,\n                                                    0x81, 0x1d, 0x9c, 0x57, 0xa, 0x24, 0x1d, 0x40,\n                                                    0xa, 0xef, 0xfb, 0x29, 0x1e, 0xb, 0x70, 0xa,\n                                                    0xfb, 0x1f, 0x69, 0x1d, 0xf7, 0xf, 0x61, 0x1d,\n                                                    0xf7, 0x10, 0x34, 0xa, 0x32, 0x71, 0x1d, 0x3a,\n                                                    0x5e, 0xa, 0xb, 0x4c, 0x74, 0x72, 0x19, 0x79,\n                                                    0x78, 0x7a, 0x7f, 0x2e, 0xa, 0xb, 0x15, 0xad,\n                                                    0x6, 0xf7, 0xd, 0xf2, 0xf7, 0xe, 0x24, 0x5,\n                                                    0xad, 0x6, 0xb, 0x6d, 0x1b, 0x49, 0x82, 0xc9,\n                                                    0x99, 0x1f, 0xf7, 0xda, 0xfb, 0x26, 0x7d, 0x7,\n                                                    0xa9, 0x89, 0xab, 0x7f, 0x4f, 0x1a, 0xfb, 0x86,\n                                                    0x7, 0x21, 0xd9, 0x73, 0xb4, 0xb, 0x2e, 0x1d,\n                                                    0x9e, 0xfb, 0x7c, 0x50, 0x1d, 0xb, 0x15, 0xd7,\n                                                    0x86, 0x99, 0x76, 0x41, 0x1a, 0xfb, 0xc2, 0x7,\n                                                    0x4f, 0x8b, 0xfb, 0x57, 0xf7, 0x8c, 0xf7, 0x97,\n                                                    0x8b, 0xf7, 0x50, 0xdb, 0x1e, 0xf7, 0x8f, 0x7,\n                                                    0xf4, 0x9c, 0xa4, 0xd8, 0x93, 0x1e, 0xb, 0xa8,\n                                                    0xf7, 0x78, 0x15, 0xfb, 0x1b, 0xe5, 0x24, 0x65,\n                                                    0x1d, 0xf7, 0x1f, 0xee, 0xf7, 0x25, 0x2d, 0xe2,\n                                                    0xfb, 0x17, 0xfb, 0x1a, 0x39, 0xfb, 0x1, 0xfb,\n                                                    0xf, 0x1e, 0xe5, 0xb, 0x5b, 0xa, 0xf7, 0x6a,\n                                                    0x77, 0x85, 0xa, 0xf7, 0xe6, 0x29, 0x1d, 0xb,\n                                                    0x9b, 0x16, 0xf7, 0x81, 0x9a, 0x6, 0x46, 0x8f,\n                                                    0x86, 0xa6, 0xcd, 0x1a, 0xf7, 0xed, 0x7, 0x87,\n                                                    0x8e, 0xb, 0x2d, 0x1d, 0x4f, 0x3f, 0xfb, 0x13,\n                                                    0x49, 0x1d, 0xa0, 0x1e, 0xf7, 0x1b, 0x4e, 0xa,\n                                                    0x6, 0x88, 0xf7, 0x23, 0x5, 0xfc, 0xa7, 0xb,\n                                                    0x8c, 0xa, 0x86, 0x83, 0x70, 0x75, 0x1e, 0x7f,\n                                                    0x7c, 0x70, 0x7e, 0x75, 0x1b, 0x66, 0x6e, 0xaa,\n                                                    0xba, 0xaf, 0x96, 0xc3, 0xf7, 0x2b, 0xbd, 0x1f,\n                                                    0x4d, 0xa, 0xb, 0x7d, 0x1d, 0xa1, 0xa1, 0x3d,\n                                                    0xa, 0xb, 0x39, 0x1d, 0x8b, 0xdc, 0x1f, 0xf7,\n                                                    0x65, 0x7, 0xf7, 0x24, 0x89, 0xde, 0x8a, 0xa4,\n                                                    0x7d, 0x97, 0x3b, 0x19, 0xb, 0xe9, 0xf7, 0x9f,\n                                                    0x15, 0xf7, 0xcb, 0x6, 0xf7, 0x17, 0x80, 0x44,\n                                                    0xc9, 0x2d, 0x1b, 0x3b, 0xfb, 0x10, 0xb, 0x8d,\n                                                    0x1b, 0x39, 0xa, 0xb, 0xb8, 0xf7, 0x3d, 0x5,\n                                                    0x6f, 0x6, 0x26, 0x5f, 0x59, 0x6d, 0xfb, 0x11,\n                                                    0x1b, 0xfb, 0x29, 0x8b, 0xb, 0x3b, 0x1d, 0xa2,\n                                                    0xb, 0x15, 0xb3, 0x6, 0xfb, 0x27, 0xf7, 0x28,\n                                                    0x5, 0xb, 0xaa, 0xb1, 0x37, 0xa, 0xbf, 0x89,\n                                                    0xa, 0xbd, 0xac, 0xb0, 0x1e, 0xb, 0x8e, 0xab,\n                                                    0x15, 0xe3, 0x9b, 0xb2, 0xb0, 0xc2, 0x1b, 0xda,\n                                                    0x95, 0x3e, 0x5b, 0x92, 0x1f, 0xb, 0xfb, 0x8,\n                                                    0x5c, 0x44, 0x57, 0x1d, 0x1f, 0x94, 0x86, 0x9a,\n                                                    0x9a, 0x1a, 0xb, 0x3, 0x94, 0x16, 0xf8, 0xc8,\n                                                    0x6, 0xa3, 0xf7, 0x44, 0x5, 0x74, 0x6, 0x42,\n                                                    0x75, 0x6e, 0x4a, 0xfb, 0x17, 0x1b, 0xfb, 0x8b,\n                                                    0x6, 0xf8, 0x44, 0xf8, 0xf5, 0x5, 0x9a, 0xfc,\n                                                    0xa2, 0x7, 0x77, 0xfb, 0x3f, 0x5, 0xa5, 0x6,\n                                                    0xce, 0x98, 0xa1, 0xcd, 0xf7, 0x23, 0x1b, 0xf7,\n                                                    0x67, 0x6, 0xfc, 0x49, 0xfc, 0xf5, 0x5, 0xb,\n                                                    0xf7, 0xb3, 0xf7, 0x9, 0x15, 0x3b, 0xa, 0xf7,\n                                                    0x6, 0xfb, 0x80, 0x18, 0x99, 0x6c, 0xbb, 0x2f,\n                                                    0x7c, 0x1a, 0x7b, 0x63, 0xfb, 0x1e, 0x57, 0x1e,\n                                                    0xb, 0xa7, 0xa7, 0x76, 0x55, 0x1d, 0xb, 0x15,\n                                                    0x6d, 0xb9, 0xf7, 0x2c, 0xfb, 0x38, 0x98, 0x1b,\n                                                    0x91, 0x90, 0x8f, 0x92, 0x98, 0x6f, 0xb3, 0x79,\n                                                    0xa3, 0x1f, 0x75, 0xa9, 0x64, 0xb7, 0x75, 0xa9,\n                                                    0xb, 0x65, 0xad, 0x4d, 0x1d, 0x72, 0x99, 0xa,\n                                                    0xb, 0xfb, 0x7a, 0x1e, 0xf7, 0x6, 0x8c, 0x15,\n                                                    0xf7, 0x78, 0xf7, 0x3, 0xb, 0x7a, 0xae, 0x1f,\n                                                    0x7d, 0xa8, 0xa0, 0x7c, 0x52, 0x1d, 0x63, 0x7a,\n                                                    0x7d, 0x81, 0x70, 0x1b, 0x7c, 0xb, 0x3c, 0xa,\n                                                    0xae, 0x7e, 0xa5, 0x92, 0x91, 0x88, 0x1d, 0xb,\n                                                    0xfc, 0x2a, 0x35, 0xa, 0xfb, 0x87, 0x7, 0x6e,\n                                                    0x73, 0x7c, 0x6e, 0x89, 0x1e, 0xb, 0x51, 0xa,\n                                                    0x6a, 0x98, 0x71, 0x84, 0x83, 0x87, 0x8a, 0x88,\n                                                    0x1e, 0x8a, 0x87, 0x88, 0x8a, 0x89, 0x64, 0xa,\n                                                    0xb, 0x47, 0xa, 0x88, 0xa, 0xe, 0x15, 0x43,\n                                                    0xa, 0xf7, 0x5c, 0x16, 0x43, 0xa, 0xe, 0x9e,\n                                                    0xfb, 0x6f, 0x78, 0x7, 0xaa, 0xb1, 0x89, 0x75,\n                                                    0x1d, 0xfb, 0x76, 0xfb, 0x28, 0xf7, 0x72, 0x75,\n                                                    0xa, 0x8c, 0xb9, 0x8d, 0x1e, 0x9e, 0xfb, 0xac,\n                                                    0xb, 0x1, 0xa8, 0xe5, 0xf7, 0x99, 0xe5, 0x3,\n                                                    0x2f, 0x1d, 0xb, 0x7b, 0xa0, 0xa0, 0xae, 0x9c,\n                                                    0xb0, 0xaa, 0x71, 0xa5, 0x6d, 0x6d, 0xb, 0xb1,\n                                                    0xa5, 0xa1, 0xa5, 0xab, 0x1a, 0xa8, 0x6f, 0xbf,\n                                                    0x37, 0x5f, 0x55, 0x75, 0x42, 0x69, 0x1e, 0xa4,\n                                                    0x79, 0x5, 0xa4, 0x9d, 0x9f, 0xab, 0xbb, 0x1b,\n                                                    0xb5, 0x9a, 0x73, 0x71, 0x65, 0x5c, 0x72, 0x50,\n                                                    0x79, 0x1f, 0xe, 0xe2, 0x81, 0xc5, 0xf7, 0x95,\n                                                    0xf7, 0x2f, 0x73, 0xa3, 0xb, 0x78, 0x7, 0xd1,\n                                                    0x87, 0xa3, 0x70, 0x20, 0x1a, 0xfb, 0x98, 0x7,\n                                                    0xfb, 0x1f, 0xb, 0x7e, 0x1b, 0x85, 0x86, 0x87,\n                                                    0x84, 0x7e, 0xa7, 0x63, 0x9d, 0x73, 0x1f, 0xa1,\n                                                    0x6d, 0xb2, 0x5f, 0xa1, 0x6d, 0xb, 0xaa, 0x1b,\n                                                    0xd9, 0x9d, 0xd3, 0x65, 0xa, 0xb, 0x8d, 0x99,\n                                                    0x1b, 0x9b, 0x9e, 0x8a, 0xb, 0x33, 0xa, 0xe,\n                                                    0xa1, 0x6f, 0x6f, 0x76, 0x62, 0x1d, 0xb, 0x6,\n                                                    0xf7, 0xa1, 0xf8, 0x29, 0x5, 0x9a, 0xfb, 0xef,\n                                                    0x7, 0x88, 0xfb, 0xa, 0x5, 0x9d, 0x6, 0xc1,\n                                                    0x92, 0x99, 0xad, 0xd4, 0x1b, 0xf7, 0x14, 0x6,\n                                                    0xfb, 0x9e, 0xfc, 0x29, 0x5, 0xb, 0x63, 0x7b,\n                                                    0x97, 0x6f, 0xaa, 0xa5, 0x9e, 0xa1, 0xa0, 0xb,\n                                                    0xf7, 0x1, 0x3, 0x9b, 0x16, 0xf7, 0xb0, 0x6,\n                                                    0xf7, 0xc6, 0xda, 0xf7, 0x58, 0xf7, 0x19, 0xf7,\n                                                    0x74, 0xfb, 0x33, 0xf7, 0x1, 0xfb, 0x84, 0x1f,\n                                                    0xfb, 0xa2, 0x78, 0x6, 0xd8, 0xb, 0x5, 0x76,\n                                                    0x6, 0x6a, 0x83, 0x60, 0x8b, 0x86, 0x75, 0x54,\n                                                    0xac, 0x32, 0x1b, 0xfb, 0x40, 0xfb, 0x3c, 0xfb,\n                                                    0xd, 0xfb, 0x74, 0xfb, 0x8d, 0xf7, 0x41, 0x2b,\n                                                    0xf7, 0x35, 0xb, 0x7b, 0xa, 0xf7, 0x17, 0x77,\n                                                    0xdd, 0x77, 0xf7, 0x8, 0xb4, 0xf7, 0x94, 0xb1,\n                                                    0xb, 0x80, 0x1d, 0xf7, 0x6c, 0xb4, 0xb, 0x5b,\n                                                    0x1d, 0xf8, 0x35, 0x77, 0xb, 0xf1, 0x3, 0x97,\n                                                    0x16, 0xf8, 0xae, 0x6, 0xbb, 0xf7, 0x42, 0x5,\n                                                    0x72, 0x6, 0xfb, 0x17, 0x52, 0x4b, 0x87, 0xfb,\n                                                    0x2a, 0x1b, 0x38, 0x79, 0xb, 0x78, 0x7, 0xb8,\n                                                    0x87, 0x9a, 0x88, 0xf1, 0xfb, 0x2a, 0xf7, 0x17,\n                                                    0xfb, 0x54, 0x18, 0xfb, 0x38, 0x7, 0x3f, 0x88,\n                                                    0x6a, 0x29, 0x89, 0x1e, 0xb, 0x6b, 0xac, 0xa7,\n                                                    0x80, 0xb3, 0x1b, 0xf7, 0x1f, 0xd2, 0xf7, 0x20,\n                                                    0xf7, 0x7, 0xf7, 0x19, 0x3f, 0xdd, 0x32, 0x3e,\n                                                    0x5d, 0x5a, 0x6f, 0xb, 0x9f, 0xd9, 0x1a, 0xf8,\n                                                    0x3c, 0x7, 0xdb, 0xb, 0xf7, 0x69, 0xf7, 0x7a,\n                                                    0xfb, 0x37, 0xb, 0x75, 0x6f, 0x1e, 0xb, 0x7d,\n                                                    0x94, 0x5, 0x58, 0x69, 0x66, 0x60, 0x43, 0x1b,\n                                                    0x37, 0x46, 0xd7, 0xf7, 0x7, 0xf7, 0x27, 0xe7,\n                                                    0xaa, 0xb0, 0xc0, 0xb, 0x15, 0x6f, 0xa2, 0x74,\n                                                    0xa7, 0xa7, 0xa2, 0xa2, 0xa7, 0xa7, 0x74, 0xa2,\n                                                    0x6f, 0x6f, 0x74, 0x74, 0x6f, 0x1e, 0xe, 0xf7,\n                                                    0x15, 0xf7, 0x2c, 0xd1, 0xb, 0x7, 0x89, 0xa3,\n                                                    0x9e, 0x8a, 0xa3, 0x1b, 0xf4, 0xcb, 0x9d, 0xb4,\n                                                    0xb6, 0x1f, 0x9c, 0x9b, 0xb7, 0xb4, 0xd9, 0x1a,\n                                                    0xb, 0x7, 0xd2, 0x97, 0xa2, 0xd7, 0x91, 0x1e,\n                                                    0x9e, 0xfb, 0xaa, 0x78, 0x7, 0xd5, 0x85, 0x99,\n                                                    0x77, 0x41, 0x1a, 0xb, 0x15, 0xbc, 0x6, 0xf8,\n                                                    0x56, 0xf9, 0x46, 0x5, 0x5d, 0x6, 0xb, 0xf7,\n                                                    0x49, 0xf7, 0x49, 0xf7, 0x26, 0xb, 0x70, 0xa1,\n                                                    0x75, 0xa6, 0xa6, 0xa2, 0xa1, 0xa6, 0xa6, 0x74,\n                                                    0xa2, 0x70, 0x70, 0x75, 0x74, 0x70, 0x1e, 0xb,\n                                                    0x5b, 0x7a, 0x5a, 0x7d, 0x5b, 0x6f, 0x1d, 0x91,\n                                                    0x95, 0x82, 0xa, 0xb, 0x6f, 0xa1, 0x7d, 0x1d,\n                                                    0xa2, 0xa1, 0xa7, 0xa7, 0x74, 0xa2, 0x6f, 0x6f,\n                                                    0x75, 0x74, 0x6f, 0x1e, 0xb, 0x6f, 0xa0, 0x76,\n                                                    0x9a, 0x1d, 0x95, 0x1d, 0x74, 0x6f, 0x1e, 0xb,\n                                                    0x6f, 0xa1, 0x7d, 0x1d, 0x9f, 0xa1, 0xa7, 0xa7,\n                                                    0x77, 0xa1, 0x6f, 0x6f, 0x75, 0x62, 0x1d, 0xb,\n                                                    0x7e, 0x19, 0x7b, 0x7, 0x8c, 0xb, 0x15, 0xfb,\n                                                    0x1b, 0x7, 0x6d, 0xb, 0xfb, 0x78, 0xfb, 0x70,\n                                                    0x25, 0xb, 0xfb, 0x3, 0xfb, 0x3, 0x25, 0xb,\n                                                    0xa4, 0x9c, 0xcf, 0x8f, 0x1e, 0x9e, 0xfb, 0xae,\n                                                    0x78, 0x7, 0x60, 0xa, 0xb, 0xfb, 0x23, 0xfb,\n                                                    0x2c, 0xfb, 0x1a, 0x8b, 0x66, 0x76, 0x77, 0x8c,\n                                                    0x8d, 0x78, 0x1e, 0xe, 0x6c, 0x7d, 0x84, 0x7f,\n                                                    0x84, 0x80, 0x1f, 0xfb, 0x23, 0xb, 0x81, 0xc7,\n                                                    0xf8, 0x24, 0x77, 0xf7, 0x8c, 0x90, 0xa, 0xb,\n                                                    0x6d, 0x6c, 0x43, 0x44, 0xfb, 0xf, 0x1b, 0xfb,\n                                                    0x12, 0xfb, 0xb, 0xe2, 0xf7, 0x68, 0xb, 0xbc,\n                                                    0xac, 0x69, 0xb7, 0x1b, 0xa6, 0x9e, 0x9c, 0xa5,\n                                                    0xa5, 0x78, 0x9c, 0x70, 0x1f, 0xb, 0xc2, 0xb8,\n                                                    0xb7, 0xc2, 0xc2, 0x5e, 0xb8, 0x54, 0xb, 0x76,\n                                                    0xf9, 0x46, 0x77, 0x1, 0xb, 0x1, 0xad, 0xf7,\n                                                    0x6, 0xb, 0x8f, 0x78, 0x1b, 0x2a, 0x60, 0x49,\n                                                    0x53, 0x41, 0xc2, 0x66, 0xc9, 0x68, 0x1f, 0xb,\n                                                    0x75, 0xa7, 0xa7, 0xb, 0x7, 0xf7, 0x28, 0xf7,\n                                                    0x76, 0xd0, 0xf5, 0xac, 0x8f, 0xaf, 0x8f, 0x19,\n                                                    0xb, 0xb6, 0x1b, 0xbd, 0xa1, 0x5c, 0x6d, 0x6d,\n                                                    0x6c, 0x59, 0x59, 0x53, 0x1f, 0xb, 0xf8, 0x1,\n                                                    0xa0, 0x76, 0xb, 0x6e, 0x89, 0x76, 0xb, 0x66,\n                                                    0x88, 0x1e, 0x7c, 0xf7, 0x64, 0x9a, 0x7, 0x5a,\n                                                    0x8f, 0x7f, 0xb, 0x15, 0xa8, 0x6, 0x9c, 0x91,\n                                                    0xb, 0x87, 0x1e, 0xe, 0xbb, 0xf7, 0xca, 0xc3,\n                                                    0x12, 0xf7, 0x51, 0xd7, 0x54, 0xdc, 0xb, 0xf7,\n                                                    0x69, 0x5, 0x76, 0x6, 0x80, 0x89, 0x7c, 0x74,\n                                                    0x6f, 0xb, 0xe2, 0x81, 0xd0, 0xf7, 0x64, 0xab,\n                                                    0xb, 0x8f, 0x8c, 0x8e, 0x1e, 0xb, 0x1a, 0xfc,\n                                                    0x3c, 0x7, 0xb, 0x76, 0xf9, 0x2a, 0x77, 0xb,\n                                                    0x2e, 0x6f, 0x1e, 0xa4, 0x7d, 0x5, 0xb2, 0x9b,\n                                                    0xa7, 0xb, 0xf7, 0x63, 0x98, 0x76, 0xf8, 0x9e,\n                                                    0x77, 0x1, 0xa7, 0xb, 0xb6, 0x28, 0xee, 0xef,\n                                                    0xb6, 0xee, 0xd9, 0xda, 0x60, 0xb, 0xfb, 0x58,\n                                                    0x76, 0xf7, 0x63, 0xab, 0xf8, 0xe, 0xc7, 0xb,\n                                                    0x85, 0x1a, 0x84, 0x8e, 0x87, 0x93, 0x1e, 0xe,\n                                                    0x73, 0xfb, 0x30, 0x76, 0xf9, 0xe9, 0x77, 0x1,\n                                                    0xb, 0x73, 0xf8, 0x5a, 0x76, 0xf7, 0x87, 0x77,\n                                                    0x1, 0xb, 0x73, 0xf8, 0xa4, 0x76, 0xf7, 0x3f,\n                                                    0x77, 0x1, 0xb, 0x73, 0xfb, 0x30, 0xa4, 0xf9,\n                                                    0x94, 0xa4, 0x1, 0xb, 0xa8, 0x73, 0xa3, 0x6e,\n                                                    0x6e, 0x74, 0x73, 0x6e, 0xb, 0xa1, 0x3d, 0xa,\n                                                    0x77, 0xb, 0x1a, 0x92, 0x88, 0x8f, 0x83, 0x1e,\n                                                    0xe, 0xf7, 0x1f, 0xe8, 0xf7, 0x1f, 0xb, 0xfb,\n                                                    0x13, 0xfb, 0x42, 0x8b, 0xb, 0xf7, 0x5b, 0xa0,\n                                                    0x76, 0xb, 0xa7, 0xa7, 0xa0, 0xb, 0x1, 0x0,\n                                                    0x1, 0x6, 0x0, 0x68, 0x0, 0x0, 0x9, 0x37,\n                                                    0x0, 0x7c, 0x0, 0x0, 0x42, 0x20, 0x0, 0x67,\n                                                    0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0, 0x0,\n                                                    0x66, 0x0, 0x0, 0x83, 0x0, 0x0, 0xaa, 0x0,\n                                                    0x0, 0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x97,\n                                                    0x0, 0x0, 0xa5, 0x0, 0x0, 0x80, 0x0, 0x0,\n                                                    0xa1, 0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4, 0x0,\n                                                    0x0, 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x98,\n                                                    0x0, 0x0, 0x73, 0x0, 0x0, 0x72, 0x0, 0x0,\n                                                    0x85, 0x0, 0x0, 0x96, 0x0, 0x0, 0x8f, 0x0,\n                                                    0x0, 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x9b,\n                                                    0x0, 0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0, 0x0,\n                                                    0xae, 0x0, 0x0, 0xab, 0x1, 0x0, 0xb0, 0x0,\n                                                    0x0, 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x8a,\n                                                    0x0, 0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0, 0x0,\n                                                    0xb2, 0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6, 0x2,\n                                                    0x0, 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0, 0xbe,\n                                                    0x0, 0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0, 0x0,\n                                                    0xbd, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d, 0x0,\n                                                    0x0, 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0, 0xc5,\n                                                    0x0, 0x0, 0x9d, 0x0, 0x0, 0x95, 0x0, 0x0,\n                                                    0xcb, 0x0, 0x0, 0xc8, 0x1, 0x0, 0xcd, 0x0,\n                                                    0x0, 0xca, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x90,\n                                                    0x0, 0x0, 0xce, 0x0, 0x0, 0xd2, 0x0, 0x0,\n                                                    0xcf, 0x2, 0x0, 0xd6, 0x0, 0x0, 0xd3, 0x2,\n                                                    0x0, 0xa7, 0x0, 0x0, 0xd7, 0x0, 0x0, 0xdb,\n                                                    0x0, 0x0, 0xd8, 0x1, 0x0, 0xdc, 0x0, 0x0,\n                                                    0xda, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x93, 0x0,\n                                                    0x0, 0xe1, 0x0, 0x0, 0xde, 0x2, 0x0, 0xe2,\n                                                    0x0, 0x0, 0xa2, 0x0, 0x0, 0xe3, 0x0, 0x0,\n                                                    0x91, 0x0, 0x0, 0x8c, 0x0, 0x0, 0x92, 0x0,\n                                                    0x0, 0x8e, 0x0, 0x0, 0x94, 0x0, 0x0, 0xc0,\n                                                    0x0, 0x0, 0xdd, 0x0, 0x0, 0xc6, 0x1, 0x0,\n                                                    0xe4, 0x0, 0x0, 0x65, 0x0, 0x0, 0x7e, 0x0,\n                                                    0x0, 0x88, 0x0, 0x0, 0x81, 0x1, 0x0, 0x84,\n                                                    0x0, 0x0, 0x87, 0x0, 0x0, 0x7f, 0x0, 0x0,\n                                                    0x86, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89, 0x0,\n                                                    0x0, 0x41, 0x0, 0x0, 0x8, 0x0, 0x0, 0x75,\n                                                    0x0, 0x0, 0x69, 0x0, 0x0, 0x77, 0x0, 0x0,\n                                                    0x76, 0x0, 0x0, 0x70, 0x1, 0x0, 0x74, 0x0,\n                                                    0x0, 0x79, 0x1, 0x0, 0x6b, 0x1, 0x0, 0x63,\n                                                    0x0, 0x1, 0x87, 0x0, 0x0, 0x99, 0x0, 0x0,\n                                                    0xa6, 0x0, 0x0, 0x6d, 0x1, 0x0, 0xe6, 0x2,\n                                                    0x0, 0x1, 0x0, 0x3, 0x0, 0x5, 0x0, 0x47,\n                                                    0x0, 0x61, 0x0, 0xcc, 0x1, 0x51, 0x1, 0xe0,\n                                                    0x2, 0x97, 0x2, 0xaa, 0x2, 0xdd, 0x3, 0x14,\n                                                    0x3, 0xb8, 0x3, 0xdd, 0x4, 0x0, 0x4, 0x10,\n                                                    0x4, 0x1f, 0x4, 0x34, 0x4, 0x7e, 0x4, 0xb4,\n                                                    0x5, 0x3, 0x5, 0x71, 0x5, 0xa1, 0x6, 0x12,\n                                                    0x6, 0x72, 0x6, 0x9b, 0x7, 0x10, 0x7, 0x7d,\n                                                    0x7, 0x98, 0x7, 0xf6, 0x8, 0x1a, 0x8, 0x3e,\n                                                    0x8, 0x5d, 0x8, 0xc5, 0x9, 0x7e, 0x9, 0xc2,\n                                                    0xa, 0x4a, 0xa, 0x7e, 0xa, 0xb5, 0xa, 0xfc,\n                                                    0xb, 0x54, 0xb, 0xc1, 0xc, 0x9, 0xc, 0x11,\n                                                    0xc, 0x5f, 0xc, 0xd3, 0xc, 0xf4, 0xd, 0x4c,\n                                                    0xd, 0x67, 0xd, 0x8f, 0xd, 0xc6, 0xe, 0x30,\n                                                    0xe, 0xa4, 0xe, 0xfe, 0xf, 0x44, 0xf, 0x58,\n                                                    0xf, 0xa3, 0x10, 0x30, 0x10, 0xb0, 0x10, 0xfa,\n                                                    0x11, 0x6, 0x11, 0x27, 0x11, 0x3e, 0x11, 0x60,\n                                                    0x11, 0x7f, 0x11, 0x8f, 0x11, 0xab, 0x12, 0x4,\n                                                    0x12, 0x54, 0x12, 0x94, 0x13, 0x3, 0x13, 0x1c,\n                                                    0x13, 0x6b, 0x14, 0x1a, 0x14, 0x87, 0x14, 0xbb,\n                                                    0x15, 0xd, 0x15, 0x90, 0x15, 0xb2, 0x16, 0x4c,\n                                                    0x16, 0x6a, 0x16, 0xa7, 0x16, 0xeb, 0x17, 0x55,\n                                                    0x17, 0xb0, 0x18, 0x17, 0x18, 0x5f, 0x18, 0x85,\n                                                    0x18, 0xdb, 0x19, 0x6e, 0x19, 0xf4, 0x1a, 0x17,\n                                                    0x1a, 0x28, 0x1a, 0x79, 0x1a, 0x91, 0x1a, 0xdc,\n                                                    0x1b, 0x1c, 0x1b, 0x5e, 0x1b, 0xe1, 0x1c, 0x8e,\n                                                    0x1d, 0x10, 0x1d, 0x94, 0x1d, 0xae, 0x1e, 0x5f,\n                                                    0x1e, 0x75, 0x1e, 0xce, 0x1f, 0x44, 0x1f, 0x5e,\n                                                    0x1f, 0x81, 0x1f, 0xf9, 0x20, 0x9, 0x20, 0x40,\n                                                    0x20, 0x7b, 0x20, 0x99, 0x20, 0xb6, 0x20, 0xbd,\n                                                    0x21, 0x2f, 0x21, 0x5e, 0x21, 0x71, 0x21, 0xb4,\n                                                    0x21, 0xcf, 0x22, 0x8, 0x22, 0x34, 0x22, 0x59,\n                                                    0x22, 0x8c, 0x22, 0xba, 0x23, 0x20, 0x23, 0x3d,\n                                                    0x23, 0x58, 0x23, 0x6b, 0x23, 0xb7, 0x23, 0xd5,\n                                                    0x23, 0xff, 0x24, 0xb1, 0x25, 0xe, 0x25, 0x27,\n                                                    0x25, 0x3c, 0x25, 0x4f, 0x25, 0x83, 0x25, 0x96,\n                                                    0x25, 0xc1, 0x25, 0xf5, 0x26, 0x26, 0x26, 0x66,\n                                                    0x26, 0x99, 0x26, 0xa1, 0x26, 0xa9, 0x26, 0xbb,\n                                                    0x26, 0xf3, 0x27, 0x23, 0x27, 0x5b, 0x27, 0xd6,\n                                                    0x28, 0x32, 0x28, 0x44, 0x28, 0x5a, 0x28, 0x93,\n                                                    0x28, 0xac, 0x28, 0xf0, 0x29, 0x72, 0x29, 0xab,\n                                                    0x29, 0xf5, 0x2a, 0x6, 0x2a, 0x31, 0x2a, 0x5c,\n                                                    0x2a, 0xc0, 0x2b, 0x65, 0x2b, 0xc1, 0x2b, 0xdf,\n                                                    0x2b, 0xf6, 0x2c, 0xe, 0x2c, 0x2d, 0x2c, 0x39,\n                                                    0x2c, 0x44, 0x2c, 0x50, 0x2c, 0x6a, 0x2c, 0xda,\n                                                    0x2d, 0x29, 0x2d, 0x5a, 0x2d, 0x9b, 0x2d, 0xbd,\n                                                    0x2d, 0xfa, 0x2e, 0x2e, 0x2e, 0x60, 0x2e, 0xd8,\n                                                    0x2e, 0xec, 0x2e, 0xfa, 0x2f, 0xf, 0x2f, 0x36,\n                                                    0x2f, 0x51, 0x2f, 0x90, 0x2f, 0xae, 0x2f, 0xb5,\n                                                    0x2f, 0xe8, 0x30, 0x22, 0x30, 0xda, 0x31, 0x68,\n                                                    0x31, 0xbd, 0x32, 0x2c, 0x32, 0x68, 0x32, 0x80,\n                                                    0x32, 0x99, 0x33, 0xc, 0x33, 0x1b, 0x33, 0x23,\n                                                    0x33, 0x4a, 0x33, 0x5b, 0x33, 0x91, 0x33, 0xc3,\n                                                    0x33, 0xe9, 0x34, 0x4, 0x34, 0xd, 0x34, 0x18,\n                                                    0x34, 0x37, 0x34, 0x4e, 0x34, 0x6f, 0x34, 0x89,\n                                                    0x34, 0xa1, 0x34, 0xdc, 0x35, 0x75, 0x36, 0x33,\n                                                    0x36, 0x51, 0x36, 0x85, 0x37, 0x3a, 0x37, 0x50,\n                                                    0x37, 0x70, 0x37, 0x8b, 0x38, 0x1a, 0x38, 0xbf,\n                                                    0x38, 0xd2, 0x39, 0x5c, 0x39, 0xdd, 0x20, 0xe,\n                                                    0x20, 0xe, 0x73, 0x82, 0xf5, 0xf8, 0xd7, 0x77,\n                                                    0x1, 0xf7, 0x16, 0xf7, 0x0, 0x14, 0x20, 0xf7,\n                                                    0x44, 0xf7, 0x44, 0x15, 0x9c, 0x6, 0xa1, 0xf7,\n                                                    0x50, 0xa2, 0xf7, 0xe, 0xd8, 0x1a, 0xca, 0x82,\n                                                    0xbd, 0x5d, 0x5f, 0x82, 0x58, 0x4e, 0x3d, 0xa3,\n                                                    0xfb, 0x10, 0xa1, 0xfb, 0x4e, 0x1e, 0x5d, 0xfb,\n                                                    0x18, 0x15, 0x6e, 0xa3, 0x73, 0xa8, 0xa8, 0xa5,\n                                                    0xa2, 0xa8, 0xa8, 0x71, 0xa4, 0x6e, 0x6e, 0x73,\n                                                    0x73, 0x6e, 0x1e, 0xe, 0xbe, 0xf8, 0x58, 0x76,\n                                                    0xf7, 0x89, 0x77, 0x1, 0xd8, 0xe0, 0xdf, 0xe0,\n                                                    0x3, 0xf7, 0xaa, 0xf8, 0x43, 0x15, 0x44, 0xa,\n                                                    0xfb, 0x3d, 0x16, 0x44, 0xa, 0xe, 0xa0, 0x76,\n                                                    0xf7, 0x6d, 0xbd, 0xf7, 0x21, 0xbc, 0xf7, 0x61,\n                                                    0x77, 0x12, 0x8d, 0xf8, 0x85, 0x17, 0xde, 0x16,\n                                                    0xbf, 0x6, 0xaf, 0xf7, 0x6d, 0x5, 0xf7, 0x1b,\n                                                    0x6, 0x6b, 0xfb, 0x6d, 0x5, 0xc1, 0x6, 0xab,\n                                                    0xf7, 0x6d, 0x5, 0xf7, 0x1, 0xbd, 0x26, 0x6,\n                                                    0x9f, 0xf7, 0x21, 0x5, 0xf7, 0x3, 0xbc, 0x25,\n                                                    0x6, 0xab, 0xf7, 0x61, 0x5, 0x55, 0x6, 0x6c,\n                                                    0xfb, 0x61, 0x5, 0xfb, 0x1c, 0x6, 0xaa, 0xf7,\n                                                    0x61, 0x5, 0x54, 0x6, 0x6b, 0xfb, 0x61, 0x5,\n                                                    0xfb, 0xc, 0x5a, 0xf7, 0x7, 0x6, 0x75, 0xfb,\n                                                    0x21, 0x5, 0xfb, 0xf, 0x59, 0xf7, 0x7, 0x6,\n                                                    0x13, 0x60, 0xc8, 0xbd, 0x15, 0x9f, 0xf7, 0x21,\n                                                    0x5, 0xf7, 0x1c, 0x6, 0x78, 0xfb, 0x21, 0x5,\n                                                    0xe, 0x49, 0x76, 0xe3, 0xa7, 0xf8, 0xf4, 0xa6,\n                                                    0xca, 0x77, 0x12, 0xb7, 0x9a, 0xf7, 0x3f, 0xad,\n                                                    0xf7, 0x26, 0x9a, 0x17, 0xb7, 0xbe, 0x15, 0x7a,\n                                                    0xa6, 0xc7, 0x69, 0xee, 0x1b, 0x34, 0xad, 0xe2,\n                                                    0x7, 0xf4, 0x99, 0xe3, 0xb8, 0xf7, 0x7, 0x1a,\n                                                    0xf7, 0x0, 0x4b, 0xae, 0xfb, 0x15, 0xd5, 0x1e,\n                                                    0xf7, 0x8a, 0x7, 0xbe, 0xd5, 0x70, 0xfb, 0x2,\n                                                    0xa0, 0x1f, 0x9a, 0xf7, 0x3, 0x6, 0xb2, 0x5f,\n                                                    0x45, 0x99, 0x5c, 0x1b, 0xca, 0x69, 0x4c, 0x7,\n                                                    0xfb, 0x13, 0x58, 0x39, 0x44, 0x29, 0xe2, 0x57,\n                                                    0xe6, 0x58, 0x1f, 0xfb, 0xae, 0x7, 0x2d, 0x54,\n                                                    0xbf, 0xf0, 0x75, 0x1f, 0x7c, 0x6, 0xf7, 0x4d,\n                                                    0xf7, 0x76, 0x15, 0x13, 0x64, 0x4f, 0xb3, 0x60,\n                                                    0xab, 0xc0, 0x1a, 0xa1, 0x91, 0xde, 0xec, 0x1e,\n                                                    0xae, 0xfc, 0xf5, 0x15, 0xf7, 0x9d, 0x7, 0x13,\n                                                    0x44, 0xca, 0x64, 0xbe, 0x6b, 0x44, 0x1a, 0x25,\n                                                    0x3a, 0x7c, 0x6a, 0x85, 0x1e, 0xe, 0xf8, 0x70,\n                                                    0x7f, 0xa9, 0x6e, 0x76, 0xf7, 0xc4, 0xa9, 0x9f,\n                                                    0xa9, 0xf7, 0x91, 0xa9, 0x9c, 0x77, 0x12, 0xbc,\n                                                    0xd4, 0xf7, 0x24, 0xd3, 0xde, 0xd4, 0xf7, 0x23,\n                                                    0xd4, 0x13, 0x77, 0xc0, 0xf7, 0x34, 0x82, 0x15,\n                                                    0xa9, 0x74, 0xf8, 0x28, 0xf9, 0x29, 0x6a, 0xa2,\n                                                    0x5, 0x13, 0xbb, 0xc0, 0xfc, 0x94, 0xfb, 0x5b,\n                                                    0x15, 0x3c, 0xb6, 0x25, 0xf1, 0xf1, 0xb5, 0xf1,\n                                                    0xdb, 0xdb, 0x60, 0xf0, 0x27, 0x1e, 0x8a, 0x6,\n                                                    0x25, 0x60, 0x26, 0x3a, 0x1f, 0xd4, 0x8c, 0x15,\n                                                    0xbe, 0x96, 0xef, 0xc8, 0x1e, 0x8c, 0x6, 0xc9,\n                                                    0x94, 0x26, 0x58, 0x5b, 0x82, 0x24, 0x4d, 0x4d,\n                                                    0x80, 0xf0, 0xbe, 0x1f, 0xf7, 0xbf, 0xfb, 0xb1,\n                                                    0x15, 0x3c, 0xb6, 0x25, 0xf1, 0xf0, 0xb6, 0xf1,\n                                                    0xdb, 0xdb, 0x60, 0xf1, 0x27, 0x1e, 0x8a, 0x6,\n                                                    0x25, 0x60, 0x25, 0x3a, 0x1f, 0xd4, 0x8c, 0x15,\n                                                    0xc0, 0x96, 0xee, 0xc7, 0x1e, 0x8c, 0x6, 0xc9,\n                                                    0x94, 0x26, 0x58, 0x5a, 0x82, 0x24, 0x4e, 0x4d,\n                                                    0x80, 0xf1, 0xbd, 0x1f, 0xe, 0xf8, 0x39, 0x7e,\n                                                    0xbf, 0x57, 0xd2, 0xf8, 0x4, 0x77, 0xf7, 0x82,\n                                                    0xab, 0x12, 0xb5, 0xe7, 0xcf, 0xda, 0x8b, 0xf7,\n                                                    0x31, 0x8b, 0xc0, 0x13, 0x7f, 0xf7, 0xd5, 0xf8,\n                                                    0x34, 0x15, 0x77, 0xb4, 0x77, 0xbf, 0xbb, 0x1a,\n                                                    0xc9, 0xb0, 0xa4, 0xb4, 0xb6, 0xaf, 0x69, 0x59,\n                                                    0x38, 0x31, 0x5c, 0x70, 0x7d, 0x1e, 0xf7, 0x0,\n                                                    0xfb, 0xe6, 0x15, 0x6d, 0xa8, 0xc7, 0x4e, 0xdc,\n                                                    0x1b, 0xf5, 0xb7, 0xf7, 0x1, 0x8f, 0x8c, 0x1f,\n                                                    0x7c, 0x96, 0x5, 0x6d, 0x73, 0x77, 0x74, 0x57,\n                                                    0x1b, 0x41, 0x47, 0xdc, 0x99, 0x82, 0x1f, 0xef,\n                                                    0xf7, 0x2d, 0xaf, 0xc3, 0xbe, 0xb1, 0xaf, 0x90,\n                                                    0x19, 0xa0, 0xfb, 0x6c, 0x76, 0x7, 0xb0, 0x88,\n                                                    0xa6, 0x7c, 0x65, 0x1a, 0x55, 0x4d, 0x3c, 0x6e,\n                                                    0x65, 0x1e, 0x58, 0xc9, 0x5e, 0xd3, 0x67, 0xd3,\n                                                    0x8, 0xcb, 0xa9, 0xe6, 0xb7, 0xed, 0x1a, 0xd7,\n                                                    0x4c, 0xb7, 0x42, 0x26, 0x57, 0x36, 0x43, 0x5b,\n                                                    0x98, 0x6a, 0xa1, 0x4e, 0x1e, 0x23, 0x4f, 0x30,\n                                                    0x46, 0x23, 0x1a, 0xfb, 0x17, 0xf3, 0x71, 0xc8,\n                                                    0xf7, 0xb, 0xca, 0xc3, 0xae, 0xb3, 0x1e, 0x72,\n                                                    0xa5, 0x15, 0x13, 0xbf, 0x51, 0x46, 0x5a, 0x84,\n                                                    0x74, 0x1b, 0x44, 0x51, 0xcb, 0xd8, 0xe3, 0xd4,\n                                                    0xb9, 0xb8, 0xa8, 0x1f, 0xb5, 0x3b, 0xbf, 0x32,\n                                                    0xc5, 0x45, 0x8, 0xe, 0xfb, 0x45, 0xf8, 0x58,\n                                                    0x76, 0xf7, 0x89, 0x77, 0x1, 0xbb, 0xe0, 0x3,\n                                                    0xe5, 0xf8, 0x43, 0x15, 0x44, 0xa, 0xe, 0x90,\n                                                    0x1d, 0xbb, 0xdc, 0x3, 0xf7, 0xbb, 0xfb, 0x45,\n                                                    0x15, 0x97, 0x9b, 0x5, 0xfb, 0x24, 0xf7, 0x3,\n                                                    0x69, 0xf7, 0x66, 0xf1, 0x1a, 0xf7, 0x92, 0xf0,\n                                                    0xe0, 0xd5, 0xc6, 0x1e, 0x82, 0x9b, 0x5, 0xfb,\n                                                    0x2f, 0x2f, 0x2f, 0xfb, 0x2a, 0xfb, 0x40, 0x1a,\n                                                    0xfb, 0x73, 0xea, 0x27, 0xf7, 0x2c, 0xfb, 0x8,\n                                                    0x1e, 0xe, 0x90, 0x1d, 0xf7, 0x5e, 0xde, 0x3,\n                                                    0xa8, 0xfb, 0x35, 0x15, 0x94, 0x7b, 0x5, 0xf7,\n                                                    0x2f, 0xf7, 0x1, 0xe7, 0xf7, 0x19, 0xf7, 0x40,\n                                                    0x1a, 0xf7, 0x73, 0x2f, 0xf7, 0x0, 0xfb, 0x2c,\n                                                    0xf7, 0x0, 0x1e, 0x7f, 0x7b, 0x5, 0xf7, 0x3e,\n                                                    0xfb, 0xd, 0x8e, 0xfb, 0x5e, 0x25, 0x1a, 0xfb,\n                                                    0x71, 0xfb, 0x27, 0xfb, 0x31, 0x71, 0x79, 0x1e,\n                                                    0xe, 0xf8, 0x65, 0x90, 0x8b, 0xf7, 0xf, 0xfb,\n                                                    0x8, 0x76, 0xa9, 0x77, 0xb7, 0xf7, 0x13, 0x12,\n                                                    0xf7, 0x73, 0xa9, 0x13, 0x2c, 0xf7, 0x84, 0xf8,\n                                                    0x5c, 0x15, 0x8c, 0x84, 0x5, 0x94, 0x4f, 0x67,\n                                                    0x55, 0x6c, 0x1a, 0x72, 0x9d, 0x7d, 0x9c, 0xa4,\n                                                    0x99, 0xa2, 0x9e, 0x1e, 0xa9, 0x6f, 0x98, 0xee,\n                                                    0x1a, 0x92, 0x7, 0x92, 0x88, 0x5, 0x71, 0xc9,\n                                                    0xa2, 0x3e, 0xb7, 0x1b, 0x9e, 0x9c, 0x97, 0xa3,\n                                                    0x1f, 0x13, 0xc4, 0xc6, 0x40, 0x6c, 0x3a, 0xbe,\n                                                    0x1e, 0x83, 0x90, 0x5, 0xf2, 0xcc, 0xc7, 0x61,\n                                                    0xcb, 0x1a, 0xa7, 0x73, 0x93, 0x7f, 0x66, 0x71,\n                                                    0x47, 0x66, 0x4a, 0x1e, 0x84, 0x87, 0x5, 0x13,\n                                                    0x1c, 0xa5, 0x7, 0xbf, 0xa6, 0xbb, 0xa6, 0x1a,\n                                                    0x98, 0x83, 0xa5, 0x71, 0x84, 0x6d, 0x8b, 0x64,\n                                                    0x1e, 0x5f, 0xa4, 0x7e, 0x3a, 0x1a, 0x7e, 0x7,\n                                                    0xbe, 0x2c, 0x8c, 0xc1, 0x5e, 0x1b, 0x70, 0x85,\n                                                    0x70, 0x84, 0x51, 0xe1, 0xa1, 0xcf, 0x60, 0x1f,\n                                                    0x96, 0x84, 0x5, 0x37, 0x51, 0x3a, 0xac, 0x4c,\n                                                    0x1a, 0x80, 0x93, 0x76, 0xa5, 0xa2, 0x90, 0x91,\n                                                    0xb0, 0xac, 0x1e, 0x13, 0x2c, 0xa4, 0xa7, 0x8b,\n                                                    0x8b, 0xbe, 0xad, 0x8, 0xe, 0xf7, 0x63, 0xa0,\n                                                    0x76, 0xf7, 0x89, 0xb3, 0x1, 0xf7, 0x9a, 0xb5,\n                                                    0x3, 0xa9, 0xf7, 0x7c, 0x15, 0xf7, 0x7c, 0xfb,\n                                                    0x7c, 0xb5, 0xf7, 0x7c, 0xf7, 0x7a, 0xb3, 0xfb,\n                                                    0x7a, 0xf7, 0x7e, 0x61, 0xfb, 0x7e, 0xfb, 0x7c,\n                                                    0x6, 0xe, 0x20, 0x7f, 0xf7, 0x6, 0x38, 0x76,\n                                                    0x12, 0x13, 0x80, 0xd5, 0xfb, 0xe, 0x15, 0x94,\n                                                    0x78, 0x5, 0x3f, 0xa, 0x79, 0x60, 0x5f, 0xb3,\n                                                    0x78, 0xaa, 0x95, 0x1e, 0x13, 0x40, 0x8c, 0x8f,\n                                                    0x94, 0x94, 0x38, 0x1d, 0xe, 0x73, 0xf7, 0x56,\n                                                    0xca, 0x1, 0xb2, 0xf7, 0x56, 0x15, 0xf7, 0x8a,\n                                                    0xca, 0xfb, 0x8a, 0x6, 0xe, 0x20, 0x80, 0xf7,\n                                                    0x3, 0x1, 0xd1, 0xf7, 0x3, 0x3, 0xd1, 0xb6,\n                                                    0x15, 0x43, 0x1d, 0xe, 0x3c, 0x92, 0x7a, 0x1d,\n                                                    0x83, 0xf7, 0xbb, 0x3, 0x83, 0x7d, 0x15, 0xb3,\n                                                    0x6, 0xf7, 0x93, 0xf9, 0x46, 0x5, 0x66, 0x6,\n                                                    0xe, 0x7d, 0xa5, 0xf9, 0x12, 0xa5, 0x1, 0xa3,\n                                                    0xeb, 0xf7, 0x98, 0xeb, 0x3, 0xf7, 0xc, 0xf7,\n                                                    0xdf, 0x15, 0xcf, 0x8d, 0xf7, 0x8f, 0xf7, 0x14,\n                                                    0xf7, 0x14, 0x8d, 0xfb, 0x8f, 0x47, 0x3c, 0x89,\n                                                    0xfb, 0x84, 0xfb, 0x14, 0xfb, 0x14, 0x89, 0xf7,\n                                                    0x82, 0xdc, 0x1e, 0x2b, 0x16, 0xfb, 0xd, 0xb5,\n                                                    0xfb, 0x74, 0xf7, 0x4c, 0xf7, 0x4c, 0xb5, 0xf7,\n                                                    0x74, 0xf7, 0xd, 0xf7, 0xa, 0x61, 0xf7, 0x77,\n                                                    0xfb, 0x4c, 0xfb, 0x4c, 0x61, 0xfb, 0x77, 0xfb,\n                                                    0xa, 0x1e, 0xe, 0xa0, 0x76, 0xf9, 0x38, 0x77,\n                                                    0x1, 0xf7, 0x69, 0xe1, 0x3, 0xf7, 0x3, 0x16,\n                                                    0xf7, 0xaf, 0x9a, 0x6, 0x40, 0x77, 0x99, 0xd6,\n                                                    0x1f, 0xf8, 0xce, 0x7, 0x83, 0x8d, 0xfb, 0x48,\n                                                    0x30, 0x5, 0x7d, 0x7, 0xa1, 0xc3, 0x8b, 0x8b,\n                                                    0x97, 0x1b, 0xad, 0x8b, 0x71, 0x76, 0x1f, 0xfc,\n                                                    0x4f, 0x7, 0x41, 0x5f, 0x7f, 0x51, 0x89, 0x1e,\n                                                    0xe, 0x8b, 0xd7, 0xf8, 0xa2, 0xd5, 0x1, 0xf7,\n                                                    0xe6, 0xe1, 0x3, 0xa9, 0x16, 0xf8, 0x1a, 0x6,\n                                                    0xc2, 0xf7, 0x1d, 0x7e, 0x90, 0x5, 0x4c, 0x64,\n                                                    0x6c, 0x88, 0x66, 0x1b, 0xfb, 0x77, 0x6, 0xf7,\n                                                    0x3c, 0xf7, 0x44, 0x5, 0xb7, 0xba, 0xdf, 0xe6,\n                                                    0xf5, 0x1a, 0xf7, 0x4, 0x31, 0xcf, 0x30, 0x33,\n                                                    0x2c, 0x5b, 0xfb, 0x2b, 0x6d, 0x1e, 0xa1, 0x86,\n                                                    0x5, 0xc1, 0xa1, 0xa9, 0xd7, 0xe6, 0x1b, 0xf7,\n                                                    0xa, 0xa4, 0x2f, 0x58, 0x40, 0x60, 0x31, 0x34,\n                                                    0x2e, 0x1f, 0xfb, 0x46, 0xfb, 0x51, 0x5, 0xe,\n                                                    0x7d, 0xaf, 0xf8, 0xe6, 0xc7, 0x12, 0xf7, 0xfb,\n                                                    0xc5, 0x51, 0xd3, 0x13, 0xd0, 0xf7, 0x2d, 0xf7,\n                                                    0xdc, 0x15, 0xd0, 0x8d, 0xa4, 0x88, 0xaf, 0x78,\n                                                    0x8, 0xcb, 0x6a, 0x97, 0x2b, 0x72, 0x1a, 0x40,\n                                                    0x62, 0x52, 0x2e, 0x6e, 0x73, 0x98, 0x99, 0x75,\n                                                    0x1e, 0x99, 0x74, 0x75, 0x9a, 0x74, 0x1b, 0x7b,\n                                                    0x74, 0x84, 0x6f, 0x57, 0xe2, 0x86, 0xa3, 0xf7,\n                                                    0x31, 0xf7, 0xc, 0xcd, 0xf7, 0x22, 0xf7, 0x18,\n                                                    0x36, 0xc4, 0x61, 0x9d, 0x1f, 0x13, 0x60, 0xcd,\n                                                    0xb6, 0xba, 0xb6, 0xc1, 0x1a, 0xb4, 0x70, 0xe9,\n                                                    0xfb, 0x15, 0x48, 0xfb, 0x3, 0x6c, 0xfb, 0x17,\n                                                    0x63, 0x1e, 0x9c, 0x87, 0x5, 0xa7, 0x9a, 0xcb,\n                                                    0xd9, 0xe6, 0x1b, 0xd5, 0xad, 0x56, 0x58, 0x2f,\n                                                    0x2c, 0x63, 0x30, 0x6e, 0x1f, 0xe, 0xa0, 0x76,\n                                                    0xf7, 0x31, 0xcb, 0xf8, 0x5b, 0x77, 0x1, 0xf7,\n                                                    0xb8, 0xd9, 0x3, 0x97, 0xf7, 0x31, 0x15, 0xf7,\n                                                    0xad, 0xfb, 0x31, 0xd8, 0xf7, 0x31, 0xf1, 0xcb,\n                                                    0x25, 0xf8, 0x5b, 0x5f, 0x6, 0xfb, 0xce, 0xfc,\n                                                    0x5b, 0x5, 0xb3, 0x16, 0xf7, 0x82, 0xf7, 0xf2,\n                                                    0x5, 0x8d, 0xfb, 0xf2, 0x6, 0xe, 0x7d, 0xb0,\n                                                    0xf8, 0xcd, 0xda, 0x12, 0xf7, 0xf8, 0xd1, 0x17,\n                                                    0xf7, 0x1f, 0xf8, 0x79, 0x15, 0xb5, 0xe3, 0x5,\n                                                    0xf7, 0x4e, 0x6, 0x96, 0x9e, 0x8b, 0x94, 0x8e,\n                                                    0x1f, 0xb1, 0xda, 0x82, 0x9c, 0x5, 0x7c, 0x80,\n                                                    0x78, 0x80, 0x71, 0x1b, 0xfb, 0x61, 0x6, 0x24,\n                                                    0xfb, 0x84, 0x5, 0x84, 0x88, 0x8e, 0x85, 0x91,\n                                                    0x1b, 0xf7, 0x0, 0x87, 0xf7, 0x45, 0x69, 0xfb,\n                                                    0x34, 0x1a, 0xfb, 0xe, 0x41, 0x53, 0x4a, 0x70,\n                                                    0x76, 0x9b, 0x9b, 0x75, 0x1e, 0x13, 0xc0, 0x9a,\n                                                    0x76, 0x74, 0x9a, 0x6c, 0x1b, 0x63, 0x8b, 0x6e,\n                                                    0x81, 0x67, 0xba, 0x73, 0xda, 0x1f, 0x13, 0x60,\n                                                    0xf7, 0x32, 0xf7, 0x2, 0xf5, 0xf7, 0x19, 0xe4,\n                                                    0x80, 0x9e, 0x60, 0xbf, 0x1f, 0x13, 0x40, 0x50,\n                                                    0xd3, 0x2d, 0x99, 0x3b, 0x99, 0x8, 0xe, 0x7d,\n                                                    0xa7, 0xf7, 0xe6, 0xb8, 0xf7, 0xb2, 0x77, 0x1,\n                                                    0xbe, 0xe8, 0xf7, 0x77, 0xe5, 0x3, 0xf7, 0x2e,\n                                                    0xf8, 0xd, 0x15, 0x9e, 0xf7, 0xe, 0xf6, 0xe6,\n                                                    0xf7, 0x46, 0xa7, 0x89, 0xaf, 0x18, 0xfb, 0x86,\n                                                    0x83, 0xfb, 0x3e, 0xfb, 0x40, 0xfb, 0x5f, 0x1a,\n                                                    0xfb, 0x66, 0xf1, 0x40, 0xf7, 0xa, 0xf7, 0x46,\n                                                    0xa8, 0xf7, 0x33, 0xd4, 0xf7, 0x1a, 0x44, 0xcd,\n                                                    0x21, 0x53, 0x64, 0x86, 0x67, 0x5e, 0x1e, 0x75,\n                                                    0xfb, 0x21, 0x15, 0xc7, 0x90, 0x9e, 0x97, 0x9c,\n                                                    0x1e, 0xa7, 0x9f, 0xbc, 0x97, 0xad, 0x1b, 0xf5,\n                                                    0xa2, 0x31, 0x24, 0xfb, 0x5, 0x64, 0x57, 0x4c,\n                                                    0x40, 0x43, 0xc1, 0xf7, 0x3c, 0x1f, 0xe, 0x98,\n                                                    0x76, 0xf8, 0xe8, 0xd5, 0x1, 0x9f, 0xf8, 0x41,\n                                                    0x3, 0xf7, 0x40, 0x83, 0x15, 0xcc, 0x6, 0xf7,\n                                                    0x68, 0xf9, 0x22, 0x5, 0x9b, 0xfc, 0x6, 0x7,\n                                                    0x50, 0xfb, 0x27, 0x9c, 0x83, 0x5, 0xbf, 0xac,\n                                                    0xa7, 0xa8, 0xcc, 0x1b, 0xf7, 0x63, 0x6, 0xe,\n                                                    0x7d, 0xa7, 0xf9, 0xe, 0xa7, 0x12, 0xd6, 0xd7,\n                                                    0x45, 0xd1, 0xf7, 0x60, 0xd0, 0x4c, 0xd7, 0x13,\n                                                    0xe4, 0xf7, 0x6c, 0xf7, 0xcc, 0x15, 0xf7, 0x7,\n                                                    0x39, 0xbb, 0x6d, 0x41, 0x1a, 0x45, 0x52, 0x61,\n                                                    0x4c, 0x3a, 0x5d, 0xcc, 0xd8, 0xe6, 0xbf, 0xb2,\n                                                    0xab, 0xa5, 0x1e, 0x71, 0x9f, 0x15, 0x32, 0x47,\n                                                    0x5e, 0x6c, 0x34, 0x1a, 0x3d, 0xcd, 0x39, 0xf7,\n                                                    0x10, 0xf7, 0x3a, 0xb6, 0xf7, 0x4, 0xbf, 0xce,\n                                                    0x7a, 0xc5, 0xfb, 0x1a, 0xeb, 0x1e, 0x13, 0xd8,\n                                                    0xc1, 0xa8, 0xd7, 0xb5, 0xe7, 0x1a, 0xd7, 0x43,\n                                                    0xcd, 0xfb, 0x5, 0x35, 0x26, 0x55, 0x26, 0x3a,\n                                                    0xb7, 0x69, 0xdf, 0x41, 0x1e, 0xd6, 0xc4, 0x15,\n                                                    0x67, 0xa2, 0x2e, 0xc4, 0xd9, 0x1a, 0xbb, 0xab,\n                                                    0xc0, 0xd6, 0xd8, 0xb8, 0x55, 0x54, 0x33, 0x4d,\n                                                    0x66, 0x65, 0x72, 0x1e, 0xe, 0x8b, 0x76, 0xf7,\n                                                    0x74, 0xb6, 0xf8, 0x19, 0xa7, 0x1, 0xa9, 0xe7,\n                                                    0xf7, 0x88, 0xe8, 0x3, 0xc6, 0x75, 0x15, 0xf7,\n                                                    0x91, 0x9b, 0xf7, 0x27, 0xf7, 0x51, 0xf7, 0x69,\n                                                    0x1a, 0xdf, 0x73, 0xc7, 0x63, 0xbb, 0x1e, 0xbc,\n                                                    0x64, 0x54, 0xa8, 0x4e, 0x1b, 0xfb, 0x17, 0x89,\n                                                    0x3c, 0x23, 0xfb, 0x11, 0x1a, 0x38, 0xba, 0x23,\n                                                    0xf7, 0x19, 0xbe, 0xbf, 0x92, 0xb0, 0xb7, 0x1e,\n                                                    0x8c, 0x8a, 0x83, 0x73, 0x58, 0xfb, 0x78, 0xfb,\n                                                    0x87, 0x62, 0x19, 0xf7, 0xc7, 0xf7, 0xf9, 0x15,\n                                                    0x54, 0x4a, 0x82, 0x5b, 0x20, 0x76, 0xee, 0xd7,\n                                                    0xa7, 0x93, 0xbb, 0x9c, 0xae, 0x1e, 0xaf, 0x9e,\n                                                    0xa6, 0xa4, 0xb6, 0x1b, 0xcd, 0xad, 0x5b, 0x52,\n                                                    0x9b, 0x1f, 0x9a, 0x56, 0x8c, 0x59, 0x89, 0x68,\n                                                    0x8, 0xe, 0x3c, 0x80, 0xf7, 0x3, 0xf7, 0x8c,\n                                                    0xf7, 0x3, 0x8b, 0x77, 0x1, 0xdc, 0xf7, 0x3,\n                                                    0x3, 0xdc, 0xf8, 0x26, 0x15, 0x43, 0x1d, 0xfb,\n                                                    0xfb, 0x4, 0x43, 0x1d, 0xe, 0x3c, 0xfb, 0xc,\n                                                    0x76, 0xf7, 0x28, 0x76, 0xf7, 0x8, 0x77, 0xf7,\n                                                    0x9d, 0xf7, 0x4, 0x12, 0xdb, 0xf7, 0x4, 0xfb,\n                                                    0x4, 0xf7, 0x1f, 0x13, 0x94, 0xed, 0xfb, 0xe,\n                                                    0x15, 0x94, 0x78, 0x5, 0x13, 0x74, 0xac, 0x97,\n                                                    0xda, 0xcc, 0xd1, 0x1a, 0xdf, 0x50, 0x97, 0x76,\n                                                    0x80, 0x5b, 0x85, 0x54, 0x66, 0xa3, 0x79, 0xab,\n                                                    0x92, 0x96, 0x94, 0x8c, 0x8e, 0x1e, 0x8c, 0x8f,\n                                                    0x8e, 0x8c, 0x8d, 0x1b, 0x13, 0x18, 0x39, 0xa,\n                                                    0x79, 0xf8, 0xa1, 0x15, 0x13, 0x10, 0x6c, 0xa4,\n                                                    0x72, 0xaa, 0x1e, 0x13, 0x98, 0xaa, 0xa4, 0xa4,\n                                                    0xaa, 0xaa, 0x72, 0xa4, 0x6c, 0x6c, 0x72, 0x72,\n                                                    0x6c, 0x1f, 0xe, 0x8c, 0x1d, 0xf8, 0x90, 0xfc,\n                                                    0x7e, 0xca, 0x3, 0xa7, 0xf7, 0x81, 0x15, 0xf8,\n                                                    0x90, 0xfb, 0x89, 0x5, 0xb8, 0x7, 0xfc, 0x51,\n                                                    0xf7, 0x6c, 0xf8, 0x51, 0xf7, 0x6b, 0x5, 0xb9,\n                                                    0x7, 0xfc, 0x90, 0xfb, 0x8c, 0x5, 0xe, 0xf7,\n                                                    0x63, 0xf7, 0xc, 0xcd, 0xf7, 0x1a, 0xcd, 0x63,\n                                                    0xb3, 0x12, 0x13, 0xa0, 0xa9, 0xf7, 0xee, 0x15,\n                                                    0xf8, 0x8c, 0xb3, 0xfc, 0x8c, 0x6, 0xfb, 0x9e,\n                                                    0x4, 0xf8, 0x8c, 0x6, 0x13, 0xc0, 0xb6, 0xfc,\n                                                    0x8c, 0x7, 0xe, 0x8c, 0x1d, 0x8b, 0x3, 0xa7,\n                                                    0x83, 0x15, 0xf8, 0x90, 0xf7, 0x89, 0x5, 0xa8,\n                                                    0x7, 0xfc, 0x90, 0xf7, 0x8c, 0x5, 0x5d, 0x7,\n                                                    0xf8, 0x51, 0xfb, 0x6b, 0xfc, 0x51, 0xfb, 0x6c,\n                                                    0x5, 0xe, 0xe2, 0x83, 0xf4, 0xf7, 0xfe, 0x77,\n                                                    0xf7, 0x63, 0xa9, 0x12, 0xcf, 0xbe, 0xf7, 0x5f,\n                                                    0xe7, 0x17, 0xf7, 0x77, 0xf7, 0x38, 0x15, 0x9c,\n                                                    0x6, 0x99, 0xe1, 0xa5, 0xb3, 0xc2, 0xcb, 0x8,\n                                                    0xa9, 0xae, 0xb8, 0xd1, 0xbe, 0x1a, 0xf1, 0x44,\n                                                    0xcb, 0xfb, 0x4, 0x46, 0x2d, 0x56, 0x26, 0x69,\n                                                    0x95, 0x6e, 0xb3, 0xa7, 0x96, 0xa3, 0x9c, 0x9c,\n                                                    0x83, 0x97, 0x82, 0x95, 0x1e, 0x81, 0x97, 0x80,\n                                                    0x95, 0x99, 0x1a, 0xac, 0xbe, 0xb1, 0xb5, 0xd8,\n                                                    0xac, 0x48, 0x4f, 0x63, 0x78, 0x46, 0x79, 0x63,\n                                                    0x1e, 0x69, 0x3d, 0x73, 0x46, 0x50, 0x1a, 0x61,\n                                                    0xfb, 0xc, 0x15, 0x6e, 0xa2, 0x74, 0xa8, 0xa8,\n                                                    0xa3, 0xa2, 0xa8, 0x1e, 0x13, 0x80, 0x94, 0x1d,\n                                                    0x1e, 0xe, 0xf8, 0xc8, 0x7d, 0xb2, 0xf7, 0xa,\n                                                    0xac, 0x7f, 0xb7, 0xf7, 0x7a, 0xb7, 0xf7, 0x37,\n                                                    0xaa, 0x12, 0xf7, 0x8, 0xdf, 0xf7, 0xd, 0xd2,\n                                                    0xf8, 0xd, 0xb3, 0x13, 0xbf, 0xf8, 0x1c, 0xf7,\n                                                    0xa3, 0x15, 0xf7, 0xd, 0xe4, 0xd3, 0xbb, 0xa9,\n                                                    0x94, 0x74, 0x61, 0x5a, 0x7d, 0x63, 0x7e, 0x6b,\n                                                    0x1e, 0x4e, 0x72, 0x6a, 0x6d, 0x6f, 0x1b, 0x68,\n                                                    0x6f, 0xa3, 0xc7, 0x1f, 0xf7, 0x22, 0x52, 0x15,\n                                                    0x7e, 0x8a, 0xa3, 0x51, 0xcd, 0x1b, 0xf7, 0xb,\n                                                    0xce, 0xf7, 0x1c, 0xf1, 0xf7, 0x3d, 0xfb, 0x24,\n                                                    0xf7, 0x12, 0xfb, 0x4c, 0xfb, 0x5a, 0xfb, 0x3b,\n                                                    0xfb, 0x25, 0xfb, 0x6c, 0xfb, 0x1a, 0xf7, 0x6,\n                                                    0xfb, 0x57, 0xf7, 0x99, 0xd9, 0xd9, 0xab, 0xa8,\n                                                    0xca, 0x1f, 0x7f, 0xa9, 0x5, 0x71, 0x52, 0x4d,\n                                                    0x71, 0x32, 0x1b, 0xfb, 0x42, 0xfb, 0x8, 0xf7,\n                                                    0x1d, 0xf7, 0x23, 0xf7, 0x72, 0xf7, 0x14, 0xf7,\n                                                    0xa, 0xf7, 0x2d, 0xf7, 0x4b, 0xf4, 0xfb, 0x2b,\n                                                    0xfb, 0x6, 0x1f, 0x13, 0xdf, 0x35, 0x5a, 0xfb,\n                                                    0xa, 0x3a, 0x5e, 0x91, 0xbc, 0x9a, 0x8e, 0x1e,\n                                                    0xcd, 0xf7, 0x9c, 0x5, 0x46, 0x6, 0x80, 0x5b,\n                                                    0x5, 0x13, 0x32, 0xa3, 0x7e, 0x7f, 0xa7, 0x5d,\n                                                    0x1b, 0xfb, 0x1b, 0x4d, 0xfb, 0x3e, 0x45, 0xfb,\n                                                    0x5, 0xcf, 0x80, 0xa7, 0xc5, 0xb9, 0xbf, 0x9d,\n                                                    0x96, 0x1f, 0xe, 0x5c, 0x1d, 0x1, 0x9a, 0x16,\n                                                    0xf7, 0x5a, 0x9e, 0x6, 0x76, 0x51, 0xa4, 0xb2,\n                                                    0x9a, 0x1f, 0xbd, 0xf7, 0x19, 0x5, 0xf7, 0x9a,\n                                                    0x6, 0xba, 0x27, 0x93, 0x7d, 0x8f, 0x7b, 0x8,\n                                                    0x5f, 0x96, 0x60, 0x74, 0x66, 0x1b, 0x78, 0xf7,\n                                                    0x93, 0x9e, 0x7, 0x73, 0x68, 0xa1, 0xb8, 0x77,\n                                                    0x1f, 0xfb, 0x98, 0xf8, 0xe0, 0x5, 0x77, 0x6,\n                                                    0xfb, 0x77, 0xfc, 0xab, 0x78, 0x71, 0x7c, 0x6d,\n                                                    0x73, 0x5c, 0x6c, 0x7b, 0x2e, 0xa, 0xe, 0xf7,\n                                                    0xca, 0x8b, 0xb0, 0xf7, 0xb5, 0xb2, 0xf7, 0x98,\n                                                    0xb0, 0x12, 0xf7, 0x5, 0xf1, 0xf7, 0x86, 0xf1,\n                                                    0x3a, 0xf7, 0x7, 0x13, 0xf4, 0x9c, 0x16, 0xf7,\n                                                    0xe2, 0x6, 0xf7, 0x72, 0x9f, 0xf7, 0x1e, 0xb1,\n                                                    0xf4, 0x3b, 0xbb, 0x34, 0x9d, 0x1f, 0x8d, 0x7,\n                                                    0x13, 0xf8, 0xb8, 0x96, 0xe3, 0xa1, 0xf7, 0x3,\n                                                    0x1a, 0xf7, 0x2f, 0xfb, 0x43, 0x99, 0x34, 0x1e,\n                                                    0xfb, 0xac, 0x78, 0x6, 0xda, 0x9c, 0x66, 0x77,\n                                                    0x1f, 0xfc, 0x86, 0x7, 0x6c, 0x7f, 0x67, 0x37,\n                                                    0x89, 0x1e, 0xf7, 0x5a, 0xf7, 0xc7, 0x15, 0xeb,\n                                                    0xab, 0x86, 0x81, 0xad, 0x1f, 0x13, 0xf4, 0xbf,\n                                                    0x7b, 0xbc, 0x6a, 0x39, 0x1a, 0xfb, 0x1a, 0xfb,\n                                                    0xd, 0x82, 0x49, 0x51, 0x79, 0x99, 0xb0, 0x1e,\n                                                    0xf7, 0xa9, 0x4, 0xf7, 0x70, 0x7, 0x9a, 0x8d,\n                                                    0xa3, 0x9f, 0x1e, 0x95, 0x99, 0x8c, 0xa0, 0x1b,\n                                                    0x13, 0xf8, 0xd2, 0xf3, 0x78, 0xfb, 0xb, 0xfb,\n                                                    0xb, 0xfb, 0xb, 0x89, 0x6f, 0x1f, 0xe, 0xf7,\n                                                    0xca, 0x7d, 0xb7, 0xf8, 0x39, 0x77, 0xf7, 0x61,\n                                                    0xb3, 0x1, 0xa7, 0xf7, 0x8, 0x3, 0xf8, 0xfb,\n                                                    0xf7, 0x17, 0x15, 0x77, 0x1d, 0xf7, 0x57, 0xdb,\n                                                    0xf7, 0x4, 0xf7, 0x2d, 0xf7, 0xf, 0xd3, 0x3b,\n                                                    0x22, 0xa4, 0x1f, 0xa2, 0x6, 0x82, 0xf7, 0x75,\n                                                    0x59, 0x1d, 0xf7, 0x4c, 0xe1, 0xf7, 0x11, 0x8d,\n                                                    0x8c, 0x1f, 0xe, 0xf8, 0x1, 0x8b, 0xb0, 0xf8,\n                                                    0xe0, 0xb0, 0x1, 0xf3, 0xf1, 0xf7, 0xf3, 0x58,\n                                                    0x1d, 0x85, 0x96, 0x72, 0x67, 0x1a, 0xfc, 0x7c,\n                                                    0x7, 0x6c, 0x7f, 0x69, 0x3f, 0x87, 0x1e, 0xf7,\n                                                    0x52, 0xd0, 0x15, 0xf8, 0x7c, 0x7, 0x9f, 0x8b,\n                                                    0xa8, 0x8b, 0xa, 0xfb, 0xa8, 0xfb, 0x8a, 0x7b,\n                                                    0x4b, 0x8c, 0x1e, 0x5b, 0x8c, 0x7f, 0x9b, 0xad,\n                                                    0x1a, 0xe, 0x7b, 0xa, 0xf7, 0xb5, 0xb4, 0xf7,\n                                                    0x9a, 0xb1, 0x12, 0xee, 0xf1, 0xf7, 0x9c, 0xa2,\n                                                    0x17, 0x62, 0xa, 0x96, 0xb4, 0x1f, 0xf7, 0x82,\n                                                    0x7, 0xf7, 0x2e, 0x89, 0xde, 0x8a, 0x9a, 0x7d,\n                                                    0x97, 0x3b, 0x19, 0x6f, 0xa, 0x44, 0x80, 0x81,\n                                                    0x73, 0x32, 0x1b, 0xfb, 0x2e, 0xf7, 0x68, 0x6,\n                                                    0xad, 0x97, 0x95, 0x33, 0x1d, 0x6, 0x13, 0x10,\n                                                    0x78, 0x7, 0xca, 0x86, 0xa3, 0x71, 0x6b, 0x1a,\n                                                    0xfc, 0x7d, 0x7, 0x64, 0x74, 0x6e, 0x4b, 0x84,\n                                                    0x1d, 0x99, 0x1d, 0xf7, 0x7b, 0x77, 0xf7, 0x8,\n                                                    0xb4, 0xf7, 0x9a, 0xb1, 0x1, 0xee, 0xf1, 0xf7,\n                                                    0x8a, 0xa2, 0xb4, 0xa4, 0x3, 0x97, 0x16, 0xf7,\n                                                    0xac, 0x9e, 0x6, 0x44, 0x8e, 0x77, 0xa1, 0xd6,\n                                                    0x1a, 0xf7, 0x65, 0x7, 0xf7, 0x25, 0x89, 0xd6,\n                                                    0x8a, 0xa3, 0x81, 0x96, 0x37, 0x19, 0x6f, 0xa,\n                                                    0x40, 0x81, 0x79, 0x77, 0x39, 0x1b, 0xfb, 0x25,\n                                                    0xf7, 0x68, 0x6, 0xa9, 0x92, 0x99, 0xa4, 0x1e,\n                                                    0xf7, 0x1c, 0x4e, 0xa, 0xf7, 0x23, 0xfc, 0xaa,\n                                                    0x78, 0x6, 0xca, 0x86, 0xa3, 0x71, 0x6b, 0x1a,\n                                                    0xfc, 0x61, 0x7, 0x45, 0x7f, 0x71, 0x40, 0x84,\n                                                    0x1d, 0xf8, 0x1, 0x7d, 0xb3, 0xf7, 0xca, 0x9d,\n                                                    0xf7, 0xae, 0xb3, 0x1, 0xab, 0xf7, 0x6, 0xf8,\n                                                    0x17, 0xec, 0x3, 0xf8, 0x5a, 0xf7, 0xe4, 0x15,\n                                                    0xcf, 0x86, 0x9f, 0x7b, 0x49, 0x98, 0xa, 0x67,\n                                                    0x46, 0x74, 0x47, 0xfb, 0x2f, 0x23, 0xf7, 0x5,\n                                                    0xf7, 0x49, 0xf7, 0x91, 0xf7, 0x27, 0xca, 0xea,\n                                                    0xf7, 0x20, 0xbf, 0x28, 0x43, 0xa6, 0x1e, 0xa2,\n                                                    0x6, 0x83, 0xf7, 0x67, 0x5, 0x75, 0x6, 0x6f,\n                                                    0x85, 0x6a, 0x86, 0x83, 0x6b, 0x5d, 0xac, 0x26,\n                                                    0x1b, 0xfb, 0x68, 0xfb, 0x16, 0xfb, 0x3b, 0xfb,\n                                                    0x3c, 0xfb, 0x80, 0xf7, 0x2a, 0xfb, 0xb, 0xf7,\n                                                    0x6a, 0xf7, 0x2, 0xf7, 0x19, 0xc5, 0x99, 0x1f,\n                                                    0xf7, 0x53, 0x7, 0xd2, 0xa5, 0x97, 0xb7, 0x8f,\n                                                    0x1e, 0x9d, 0xfb, 0x93, 0x7, 0xe, 0x80, 0x1d,\n                                                    0xf7, 0xcf, 0xb7, 0xf7, 0xc3, 0x77, 0x1, 0xf6,\n                                                    0xf1, 0xf7, 0xc3, 0xf1, 0x3, 0x9e, 0x16, 0xf7,\n                                                    0xaa, 0x9e, 0x6, 0x3d, 0x90, 0x81, 0xb3, 0xcd,\n                                                    0x1a, 0xf7, 0x4d, 0xf7, 0xc3, 0xfb, 0x4d, 0x7,\n                                                    0x40, 0x87, 0x6b, 0x37, 0x87, 0x1e, 0x78, 0xf7,\n                                                    0xaa, 0x9e, 0x7, 0x3d, 0x90, 0x81, 0xae, 0xcd,\n                                                    0x1a, 0xf8, 0x36, 0x67, 0x1d, 0xfb, 0x4c, 0xfb,\n                                                    0xc3, 0xf7, 0x4c, 0x67, 0x1d, 0xfc, 0x31, 0x7,\n                                                    0x40, 0x87, 0x6b, 0x37, 0x84, 0x1d, 0x73, 0xa0,\n                                                    0x76, 0xf9, 0x2a, 0x42, 0xa, 0xe, 0xab, 0x6a,\n                                                    0xf7, 0xe, 0xf8, 0xd4, 0x77, 0x1, 0xf7, 0x44,\n                                                    0xf1, 0x3, 0xde, 0xf9, 0x17, 0x15, 0xdc, 0x86,\n                                                    0x97, 0x73, 0x44, 0x1a, 0xfc, 0x53, 0x7, 0x57,\n                                                    0x7c, 0x7d, 0x73, 0x75, 0x8a, 0xa8, 0xa3, 0x81,\n                                                    0x1e, 0x9c, 0x84, 0x7e, 0x99, 0x6f, 0x1b, 0x6e,\n                                                    0x7a, 0x6d, 0x78, 0x7d, 0x91, 0x7b, 0x9b, 0x79,\n                                                    0x1f, 0x7f, 0x96, 0xa4, 0x7e, 0xb5, 0x1b, 0xa6,\n                                                    0xf7, 0x21, 0x8e, 0xf7, 0x56, 0x1f, 0xf7, 0xf6,\n                                                    0x7, 0xd5, 0x99, 0xa0, 0xd9, 0x90, 0x1e, 0x9e,\n                                                    0xfb, 0xb3, 0x7, 0xe, 0xf8, 0x1, 0x83, 0xa,\n                                                    0x1, 0xf7, 0x10, 0xf1, 0x3, 0xad, 0x16, 0xf7,\n                                                    0xae, 0x9e, 0x6, 0x3d, 0x8f, 0x7f, 0xa5, 0xd1,\n                                                    0x1a, 0xf7, 0x45, 0x7, 0xa5, 0xa0, 0xf5, 0x22,\n                                                    0x5, 0xad, 0x69, 0xeb, 0x24, 0x6c, 0x1a, 0x75,\n                                                    0x7a, 0x8a, 0x56, 0x89, 0x1e, 0x78, 0xf7, 0xc5,\n                                                    0x9e, 0x7, 0x52, 0x89, 0x67, 0xbe, 0x4b, 0xc6,\n                                                    0xfb, 0x7d, 0xf7, 0x8e, 0x18, 0xf7, 0x52, 0xf7,\n                                                    0x50, 0xd2, 0xd1, 0xa0, 0x8e, 0xc7, 0x90, 0x19,\n                                                    0x9e, 0xfb, 0x9a, 0x78, 0x7, 0xbc, 0x89, 0x9e,\n                                                    0x89, 0x70, 0x1a, 0x69, 0x6e, 0x70, 0xfb, 0x76,\n                                                    0xfb, 0x5f, 0x1e, 0xf7, 0x57, 0x7, 0xd5, 0x99,\n                                                    0xa0, 0xd9, 0x90, 0x1e, 0x9e, 0xfb, 0xb0, 0x78,\n                                                    0x7, 0xcf, 0x86, 0xa1, 0x7a, 0x3d, 0x1a, 0xfc,\n                                                    0x3a, 0x7, 0x43, 0x7f, 0x71, 0x3d, 0x84, 0x1d,\n                                                    0xf7, 0x92, 0x8b, 0xb2, 0xf7, 0x1b, 0x77, 0xf8,\n                                                    0x90, 0x77, 0x1, 0xf7, 0x13, 0x5d, 0x1d, 0x96,\n                                                    0xb3, 0x1f, 0xf8, 0x59, 0x7, 0xda, 0x73, 0x1d,\n                                                    0xfc, 0x59, 0x7, 0x68, 0x74, 0x6b, 0x4b, 0x84,\n                                                    0x1d, 0xf8, 0xa8, 0x83, 0xa, 0x1, 0xf7, 0x1,\n                                                    0xb7, 0xf8, 0x9d, 0xf1, 0x3, 0x5f, 0xa, 0xf8,\n                                                    0x19, 0x8d, 0x7, 0xf7, 0x8d, 0xfc, 0xb6, 0x5,\n                                                    0x99, 0x6, 0xf7, 0x92, 0xf8, 0xcd, 0x5, 0x8d,\n                                                    0xfc, 0x57, 0x6, 0x4e, 0x7e, 0x69, 0x3d, 0x87,\n                                                    0x1e, 0x78, 0xf7, 0xac, 0x9e, 0x7, 0x4b, 0x8f,\n                                                    0x74, 0x9e, 0xd8, 0x1a, 0xf8, 0x46, 0x7, 0xda,\n                                                    0xa3, 0x91, 0xca, 0x90, 0x1e, 0x9e, 0xfb, 0x5b,\n                                                    0x7, 0xfb, 0x71, 0xfc, 0x8d, 0xfb, 0x7b, 0xf8,\n                                                    0x8d, 0x5, 0xfb, 0x5c, 0x78, 0x6, 0xd5, 0x87,\n                                                    0xa2, 0x83, 0x3d, 0x1a, 0xfc, 0x20, 0x78, 0xa,\n                                                    0xe, 0xf8, 0x1, 0x95, 0x76, 0xab, 0x8a, 0x1d,\n                                                    0x12, 0xf7, 0x1, 0xb7, 0xf8, 0x33, 0xb7, 0x13,\n                                                    0x78, 0x5f, 0xa, 0xf8, 0x10, 0x8d, 0x7, 0x13,\n                                                    0xb8, 0x3a, 0xa, 0xe, 0x5b, 0xa, 0x85, 0xa,\n                                                    0xf7, 0xe4, 0x70, 0xa, 0xfb, 0x1d, 0x69, 0x1d,\n                                                    0xf7, 0xf, 0x61, 0x1d, 0xf7, 0x10, 0x61, 0xa,\n                                                    0xfb, 0x2, 0x44, 0x1d, 0xd6, 0xf1, 0xf1, 0xf7,\n                                                    0x3, 0x32, 0x71, 0x1d, 0x3a, 0x72, 0x1d, 0xea,\n                                                    0xf7, 0x70, 0x1e, 0xe, 0x99, 0x1d, 0xf7, 0xb4,\n                                                    0xb3, 0xf7, 0xbd, 0xb0, 0x6d, 0xa, 0xa5, 0xdc,\n                                                    0x1a, 0xf7, 0x37, 0x66, 0x1d, 0xf7, 0x13, 0xfb,\n                                                    0x10, 0xc0, 0xfb, 0x1e, 0x1e, 0xfb, 0x9c, 0x78,\n                                                    0x6, 0xd4, 0x84, 0x96, 0x6d, 0x74, 0x1a, 0xfc,\n                                                    0x59, 0x8d, 0xa, 0xf7, 0xcc, 0x15, 0xf7, 0x8e,\n                                                    0x7, 0xac, 0x96, 0x96, 0xa9, 0xb7, 0xf7, 0x26,\n                                                    0x89, 0x74, 0x1d, 0xf8, 0x1, 0xfb, 0x46, 0x9e,\n                                                    0xf7, 0x32, 0xa2, 0x8b, 0xf8, 0xfe, 0x8b, 0xaf,\n                                                    0x1, 0xc4, 0xf7, 0x6, 0xf8, 0x16, 0x9a, 0xa,\n                                                    0xf7, 0x93, 0x8a, 0x15, 0xfb, 0x33, 0xf7, 0x21,\n                                                    0xf7, 0x27, 0x79, 0xf7, 0x32, 0x1b, 0x9e, 0x7,\n                                                    0xfb, 0x22, 0x99, 0x53, 0xb9, 0x3e, 0xe7, 0x8,\n                                                    0xf7, 0x0, 0x98, 0xf7, 0x24, 0xf3, 0xf7, 0x70,\n                                                    0x1a, 0xf7, 0x7a, 0xfb, 0x2d, 0xf7, 0x8, 0xfb,\n                                                    0x38, 0xfb, 0x38, 0xfb, 0x2d, 0xfb, 0x9, 0xfb,\n                                                    0x79, 0xfb, 0x69, 0xf7, 0xa, 0x2e, 0xe8, 0x72,\n                                                    0x1e, 0x2a, 0xf7, 0xdf, 0x15, 0xf7, 0x79, 0xf0,\n                                                    0xdc, 0xf1, 0xf1, 0xf0, 0x3a, 0xfb, 0x79, 0xfb,\n                                                    0x6f, 0x2f, 0x32, 0xfb, 0x3, 0xfb, 0x3, 0x2f,\n                                                    0xe4, 0xf7, 0x6f, 0x1e, 0xe, 0xf7, 0xca, 0x8b,\n                                                    0x9e, 0xf7, 0xb3, 0xb0, 0xf7, 0xae, 0xb0, 0x1,\n                                                    0xf1, 0xf1, 0xf7, 0x7e, 0xf7, 0x1, 0x3, 0x9c,\n                                                    0x16, 0xf7, 0xa9, 0x9e, 0x6, 0x3b, 0x8f, 0x81,\n                                                    0xa8, 0xce, 0x1a, 0xf7, 0x4f, 0x7, 0xc3, 0x8d,\n                                                    0xf7, 0x82, 0xfb, 0xc8, 0x5, 0xf7, 0x35, 0x9e,\n                                                    0x6, 0x62, 0x8d, 0x73, 0x9d, 0x75, 0xa6, 0xfb,\n                                                    0x62, 0xf7, 0x91, 0x18, 0xbe, 0x95, 0xf7, 0x16,\n                                                    0xa3, 0xf7, 0x1a, 0x1a, 0xf7, 0x2e, 0xfb, 0x39,\n                                                    0xa0, 0x32, 0x1e, 0xfb, 0xa8, 0x78, 0x6, 0xd1,\n                                                    0x84, 0x9a, 0x6f, 0x6f, 0x1a, 0xfc, 0x63, 0x7,\n                                                    0x4f, 0x87, 0x6a, 0x3a, 0x86, 0x1e, 0xf7, 0x4f,\n                                                    0xf7, 0xd8, 0x15, 0xf7, 0x80, 0x7, 0xa8, 0x94,\n                                                    0x9c, 0xc0, 0xb4, 0xf7, 0x17, 0x88, 0xfb, 0x19,\n                                                    0xfb, 0x23, 0xfb, 0x2a, 0x89, 0x37, 0x8a, 0x1e,\n                                                    0xe, 0xf7, 0x5b, 0x7d, 0xaf, 0xf8, 0xf4, 0xb4,\n                                                    0x12, 0xb5, 0xa1, 0x96, 0xe1, 0xf7, 0x79, 0xf0,\n                                                    0x17, 0xb5, 0x7d, 0x15, 0xa1, 0x6, 0x9b, 0xbd,\n                                                    0x9d, 0xa0, 0x9c, 0x9f, 0x80, 0x81, 0xa8, 0x1e,\n                                                    0x13, 0xf8, 0x84, 0xa0, 0xa5, 0x85, 0xab, 0x1b,\n                                                    0xf7, 0x23, 0xcf, 0xeb, 0xe0, 0xf1, 0x38, 0xc4,\n                                                    0x38, 0xbc, 0x1f, 0x37, 0xbd, 0x37, 0xb5, 0xd6,\n                                                    0x1a, 0xc9, 0xbe, 0xaa, 0xbd, 0xf4, 0xb8, 0x31,\n                                                    0x39, 0x9c, 0x1e, 0xa4, 0x6, 0x88, 0x86, 0x1d,\n                                                    0x1b, 0x7d, 0x77, 0x96, 0x94, 0x71, 0x1f, 0x92,\n                                                    0x77, 0x74, 0x92, 0x71, 0x55, 0xa, 0x13, 0x70,\n                                                    0x74, 0x6, 0xe, 0xf7, 0x92, 0xa0, 0x76, 0xf9,\n                                                    0x0, 0xb5, 0x1, 0xf7, 0x92, 0xf1, 0x3, 0xf7,\n                                                    0x34, 0x16, 0xf7, 0xb8, 0x9e, 0x6, 0x37, 0x8e,\n                                                    0x7f, 0xa8, 0xcf, 0x1a, 0xf8, 0x89, 0xc1, 0x7,\n                                                    0xf7, 0x2, 0xa7, 0x79, 0xfb, 0x2, 0xa0, 0x1f,\n                                                    0xa3, 0x6, 0x85, 0xf7, 0x3e, 0x5, 0xfc, 0xc8,\n                                                    0x6, 0x85, 0xfb, 0x3e, 0x5, 0xa3, 0x6, 0xf7,\n                                                    0x1, 0xa1, 0xa6, 0x9e, 0xf7, 0x2, 0x1b, 0xc1,\n                                                    0xfc, 0x8b, 0x6, 0x4d, 0x88, 0x6b, 0x30, 0x84,\n                                                    0x1d, 0x6e, 0xa, 0x1, 0xf3, 0xf1, 0xf7, 0xfd,\n                                                    0xb7, 0x3, 0x99, 0xf9, 0x17, 0x2d, 0x1d, 0x63,\n                                                    0x3f, 0xfb, 0x27, 0x49, 0x1d, 0xf8, 0x1, 0x95,\n                                                    0x76, 0xf9, 0x35, 0x77, 0x12, 0x9b, 0xf9, 0x3d,\n                                                    0x17, 0xf8, 0x4, 0x80, 0x15, 0x9a, 0x6, 0xf7,\n                                                    0x86, 0xf8, 0xe9, 0x5, 0x13, 0x60, 0x97, 0xa9,\n                                                    0x97, 0xa3, 0xbb, 0x8e, 0x8, 0x9e, 0xfb, 0x61,\n                                                    0x78, 0x7, 0xb1, 0x89, 0xae, 0x7e, 0x62, 0x1a,\n                                                    0xfb, 0x3a, 0xfc, 0x3e, 0x5, 0xfb, 0x42, 0xf8,\n                                                    0xf, 0x79, 0xb4, 0x9a, 0x1a, 0xab, 0x9e, 0x97,\n                                                    0xc3, 0x8e, 0x1e, 0x9e, 0xfb, 0x9e, 0x78, 0x7,\n                                                    0xba, 0x89, 0x9f, 0x77, 0x98, 0x6f, 0x8, 0xe,\n                                                    0xf8, 0xdf, 0x95, 0x76, 0xf9, 0x35, 0x77, 0x9f,\n                                                    0x8b, 0x12, 0x90, 0xfa, 0x33, 0x17, 0xf7, 0xc1,\n                                                    0x80, 0x15, 0x13, 0xf0, 0x9a, 0x6, 0xf7, 0x2e,\n                                                    0xf8, 0x3b, 0xb6, 0xfb, 0x1, 0xdd, 0xfb, 0x66,\n                                                    0xae, 0x23, 0x19, 0x9a, 0x6, 0xc6, 0xf7, 0x55,\n                                                    0xd9, 0xf7, 0x60, 0xd0, 0xf7, 0x4e, 0x99, 0xb2,\n                                                    0x9d, 0xa3, 0xbc, 0x93, 0x8, 0x9e, 0xfb, 0x5a,\n                                                    0x78, 0x7, 0xad, 0x88, 0xac, 0x7d, 0x64, 0x1a,\n                                                    0x76, 0x83, 0x6d, 0x83, 0x76, 0x1e, 0xfb, 0xf,\n                                                    0xfb, 0xdd, 0x5, 0xfb, 0x27, 0xf8, 0x10, 0x7d,\n                                                    0x97, 0x9c, 0x1a, 0xaf, 0xbb, 0x97, 0xaa, 0x1e,\n                                                    0x9e, 0xfb, 0x9f, 0x78, 0x7, 0xc0, 0x8a, 0x98,\n                                                    0x7b, 0xac, 0x38, 0xae, 0x43, 0x18, 0x20, 0xfb,\n                                                    0xae, 0x5, 0xfb, 0x29, 0xf8, 0x19, 0x83, 0x92,\n                                                    0x99, 0x1a, 0xa5, 0xa1, 0x9b, 0xb8, 0x8d, 0x1e,\n                                                    0x9e, 0xfb, 0x89, 0x78, 0x7, 0xc4, 0x86, 0x97,\n                                                    0x64, 0xab, 0x38, 0xb1, 0x27, 0xf5, 0xfb, 0xa6,\n                                                    0xbe, 0xfb, 0x2d, 0x8, 0xe, 0xf8, 0x1, 0x8b,\n                                                    0x9e, 0xf9, 0x4, 0x9e, 0x1, 0x95, 0x16, 0xf7,\n                                                    0x7d, 0x9e, 0x6, 0x64, 0x66, 0x9a, 0xab, 0x9e,\n                                                    0xaa, 0xb2, 0xa0, 0xa5, 0x1f, 0xf7, 0xb, 0xf7,\n                                                    0x1e, 0xea, 0xfb, 0x16, 0x5, 0x9b, 0x74, 0xae,\n                                                    0x55, 0x79, 0x1a, 0x6c, 0x70, 0x7e, 0x59, 0x1e,\n                                                    0x78, 0xf7, 0xbd, 0x9e, 0x7, 0x57, 0x77, 0xa8,\n                                                    0xc2, 0x64, 0x1f, 0xfb, 0x54, 0xf7, 0x9c, 0xf7,\n                                                    0x26, 0xf7, 0x40, 0x5, 0xe2, 0xd1, 0xa5, 0x9c,\n                                                    0xc0, 0x1b, 0x9e, 0xfb, 0x82, 0x78, 0x7, 0xad,\n                                                    0xaf, 0x7f, 0x6c, 0x78, 0x7a, 0x77, 0x74, 0x6e,\n                                                    0x1f, 0xfb, 0x5, 0xfb, 0x14, 0x5, 0xfb, 0x1,\n                                                    0xf7, 0x24, 0x79, 0xac, 0x9f, 0x1a, 0xa9, 0xa3,\n                                                    0x97, 0xbf, 0x1e, 0x9e, 0xfb, 0xc2, 0x78, 0x7,\n                                                    0xc5, 0xa0, 0x7a, 0xfb, 0x2a, 0xf1, 0x1f, 0xf7,\n                                                    0x1, 0xfb, 0x2a, 0x5, 0xfb, 0xac, 0xfb, 0x80,\n                                                    0x80, 0x70, 0x54, 0x1b, 0xe, 0xf8, 0x1, 0xa0,\n                                                    0x76, 0xf9, 0x2a, 0x72, 0xa, 0xa6, 0xd3, 0x1a,\n                                                    0xf7, 0x4c, 0x7, 0xf7, 0x28, 0xf7, 0x6c, 0xd0,\n                                                    0xf5, 0xac, 0x99, 0xaf, 0x8f, 0x19, 0x9e, 0xfb,\n                                                    0x6f, 0x78, 0x7, 0xaa, 0xb1, 0x7f, 0x75, 0x1d,\n                                                    0xfb, 0x6c, 0xfb, 0x28, 0xf7, 0x68, 0x75, 0xa,\n                                                    0x96, 0xb9, 0x8d, 0x1e, 0x9e, 0xfb, 0xac, 0x78,\n                                                    0x7, 0xb8, 0x87, 0x9a, 0x7e, 0xf1, 0xfb, 0x2a,\n                                                    0xf7, 0x17, 0xfb, 0x4a, 0x18, 0xfb, 0x44, 0x7,\n                                                    0x46, 0x88, 0x6f, 0x29, 0x89, 0x1e, 0xe, 0x7b,\n                                                    0xa, 0xf8, 0xde, 0xb1, 0x1, 0x94, 0xf8, 0xe0,\n                                                    0x3f, 0x1d, 0xe, 0x93, 0x1d, 0xe3, 0xd7, 0x3,\n                                                    0xe3, 0xfb, 0x30, 0x15, 0xf7, 0x67, 0xa4, 0x3f,\n                                                    0x6, 0x5a, 0x81, 0xb3, 0x97, 0x1f, 0xf9, 0x34,\n                                                    0x7, 0x99, 0x95, 0xa9, 0xb8, 0x1e, 0xdb, 0xa4,\n                                                    0xfb, 0x67, 0x6, 0xe, 0x3c, 0xfb, 0x23, 0x76,\n                                                    0xf7, 0x3f, 0x7a, 0x1d, 0xf7, 0x7e, 0xfb, 0x38,\n                                                    0x15, 0xb6, 0x6, 0xfb, 0x7c, 0xf9, 0xdc, 0x5,\n                                                    0x60, 0x6, 0xe, 0x93, 0x1d, 0xf7, 0x3d, 0xd7,\n                                                    0x3, 0xad, 0xfb, 0x17, 0x15, 0x72, 0xf7, 0x67,\n                                                    0xf9, 0xc6, 0xfb, 0x67, 0x72, 0xd7, 0x7, 0xbc,\n                                                    0x95, 0x63, 0x7f, 0x1f, 0xfd, 0x34, 0x7, 0x7d,\n                                                    0x81, 0x6d, 0x5e, 0x1e, 0xe, 0xf7, 0x4, 0xf9,\n                                                    0x2a, 0x77, 0x1, 0xa3, 0xf7, 0xbd, 0x15, 0xcf,\n                                                    0x6, 0xf7, 0x23, 0xf7, 0xb5, 0xf7, 0x23, 0xfb,\n                                                    0xb5, 0x5, 0xcf, 0x6, 0xfb, 0x48, 0xf8, 0x1,\n                                                    0x5, 0x4d, 0x6, 0xe, 0xfb, 0x11, 0xbd, 0x1,\n                                                    0x8b, 0xf8, 0x88, 0x3, 0x40, 0x4, 0x59, 0xf8,\n                                                    0x88, 0xbd, 0x7, 0xe, 0x92, 0x1d, 0x9e, 0xf7,\n                                                    0x73, 0x3, 0xf7, 0x5e, 0xf8, 0x8f, 0x15, 0xb3,\n                                                    0x6, 0xfb, 0x1d, 0xf7, 0x24, 0x5, 0xa2, 0x72,\n                                                    0x7e, 0x94, 0xa, 0xa6, 0x79, 0x97, 0x7d, 0xa,\n                                                    0x4f, 0x1d, 0x12, 0xb0, 0xe3, 0x4a, 0xe3, 0xf7,\n                                                    0x1f, 0xdc, 0x13, 0xd4, 0xf7, 0xb3, 0xf7, 0xaa,\n                                                    0x15, 0xfb, 0x2f, 0x7, 0x5d, 0x61, 0x6e, 0x55,\n                                                    0x66, 0x6e, 0xaa, 0xba, 0x1e, 0x8d, 0x7, 0xad,\n                                                    0x96, 0xcd, 0xf7, 0x2b, 0xbd, 0x1e, 0x8c, 0xfb,\n                                                    0x6b, 0x15, 0x43, 0x90, 0xb5, 0x8a, 0x2f, 0xa,\n                                                    0x40, 0xa, 0xef, 0xfb, 0x29, 0x1e, 0x13, 0xcc,\n                                                    0x3e, 0x1d, 0x13, 0xb4, 0xaa, 0xb1, 0x9d, 0xac,\n                                                    0xa9, 0xba, 0x80, 0x43, 0x1e, 0x58, 0x7, 0xfb,\n                                                    0x37, 0x4b, 0x34, 0x5f, 0x27, 0x1a, 0x48, 0xbf,\n                                                    0x66, 0xc1, 0xc2, 0xc0, 0xb3, 0xac, 0xb0, 0x1e,\n                                                    0xe, 0x81, 0xab, 0xf8, 0xb, 0xca, 0xf7, 0x73,\n                                                    0x77, 0x1, 0xd0, 0xdf, 0xf7, 0x77, 0xe3, 0x3,\n                                                    0xf7, 0x2d, 0xd1, 0x15, 0xf7, 0x90, 0x7, 0xc4,\n                                                    0xcf, 0x9d, 0xab, 0xe6, 0xaf, 0x24, 0x2e, 0x49,\n                                                    0x7b, 0xfb, 0x5, 0xfb, 0x7, 0x72, 0x44, 0x98,\n                                                    0xae, 0x1e, 0xf7, 0xc9, 0x4, 0xf7, 0xc2, 0x7,\n                                                    0x86, 0x8d, 0x6b, 0x1d, 0x6c, 0x6d, 0x1f, 0xfc,\n                                                    0x91, 0x7, 0x66, 0xf4, 0x70, 0xbd, 0xf7, 0x4d,\n                                                    0xc6, 0xf7, 0x32, 0xe5, 0xf6, 0x52, 0xf7, 0x7,\n                                                    0xfb, 0xd, 0x3f, 0x56, 0x51, 0x74, 0x85, 0x1e,\n                                                    0xe, 0xe2, 0x81, 0xd3, 0xf8, 0x5, 0xa8, 0x1,\n                                                    0xa4, 0xd8, 0x3, 0xf8, 0x30, 0xf7, 0x27, 0x15,\n                                                    0x63, 0x1d, 0x93, 0x79, 0x6d, 0x93, 0x1f, 0x5f,\n                                                    0x97, 0x99, 0x73, 0xa5, 0x1b, 0xa9, 0x9b, 0xa0,\n                                                    0xa2, 0x9d, 0x81, 0xaa, 0x6d, 0xa0, 0x1f, 0x9b,\n                                                    0x72, 0x5b, 0x9a, 0x67, 0x1b, 0xfb, 0x0, 0xfb,\n                                                    0x8, 0x38, 0xfb, 0x38, 0xfb, 0x32, 0xf6, 0x4a,\n                                                    0xdb, 0xdc, 0xcc, 0xb6, 0xf7, 0x6, 0xc1, 0x1f,\n                                                    0xe, 0x81, 0xbf, 0xf8, 0x1a, 0xa7, 0xf7, 0x78,\n                                                    0x77, 0x1, 0xa6, 0xe1, 0xf7, 0x77, 0xdf, 0x3,\n                                                    0xf7, 0xe8, 0xf1, 0x15, 0x67, 0x83, 0x64, 0x73,\n                                                    0x61, 0x1b, 0x49, 0x43, 0xc3, 0xf7, 0x29, 0xf7,\n                                                    0x1c, 0xcf, 0xbc, 0xc3, 0xba, 0xbc, 0x6b, 0x47,\n                                                    0x92, 0x1f, 0xfb, 0xe7, 0x4, 0x8f, 0x88, 0xc0,\n                                                    0x9e, 0xb9, 0x9b, 0xbb, 0x9c, 0x19, 0x9b, 0x7,\n                                                    0x48, 0x86, 0x8b, 0xa9, 0xb4, 0x1a, 0xf8, 0xc1,\n                                                    0x7, 0x86, 0x8d, 0x5b, 0x7a, 0x5a, 0x7d, 0x59,\n                                                    0x6f, 0x1d, 0x93, 0x95, 0x82, 0xa, 0x6c, 0x6d,\n                                                    0x1f, 0xfb, 0x26, 0x7, 0xa8, 0x6a, 0x6d, 0x99,\n                                                    0x60, 0x1b, 0xfb, 0x4, 0x2c, 0xfb, 0x7, 0xfb,\n                                                    0x17, 0xfb, 0x60, 0xf7, 0x23, 0x77, 0xb2, 0xd5,\n                                                    0xb0, 0xb0, 0xa6, 0x9d, 0x1f, 0x8d, 0x6, 0xe,\n                                                    0x87, 0x1d, 0xf6, 0xaf, 0x1, 0xae, 0xd0, 0xf7,\n                                                    0x5b, 0xf1, 0x3, 0x37, 0x1d, 0x58, 0xfb, 0x4d,\n                                                    0xfb, 0x22, 0xd7, 0x2f, 0x2b, 0xa, 0x3d, 0x1d,\n                                                    0xe, 0x73, 0xa0, 0x76, 0xf8, 0x36, 0xab, 0xf7,\n                                                    0x61, 0xa7, 0x1, 0xf2, 0xdf, 0x3, 0x9f, 0x16,\n                                                    0xf7, 0x98, 0x9a, 0x6, 0x2f, 0x8d, 0x8a, 0xaf,\n                                                    0xc8, 0x1a, 0xf7, 0xc4, 0xf7, 0xe, 0xab, 0xfb,\n                                                    0xf, 0xf7, 0x8, 0x7, 0xb0, 0x90, 0xbf, 0xc2,\n                                                    0xa1, 0x98, 0x7a, 0x79, 0x97, 0x1e, 0x77, 0x98,\n                                                    0x97, 0x77, 0xa1, 0x1b, 0x9f, 0xa2, 0x98, 0xa8,\n                                                    0xad, 0x5f, 0xa6, 0x53, 0xfb, 0x48, 0x8b, 0xfb,\n                                                    0x45, 0x53, 0x1f, 0x38, 0x6b, 0xde, 0xfb, 0xc4,\n                                                    0x6, 0x3e, 0x7a, 0x78, 0x49, 0x88, 0x1e, 0xe,\n                                                    0xfb, 0x6e, 0xc4, 0xf7, 0x26, 0xd4, 0xe6, 0xa4,\n                                                    0xf7, 0x8c, 0xb2, 0x6e, 0xa7, 0x1, 0xa7, 0xd1,\n                                                    0x6e, 0xde, 0xf7, 0x45, 0xd8, 0xa6, 0xa7, 0x3,\n                                                    0xf7, 0x27, 0x89, 0x15, 0x6c, 0x66, 0x79, 0x77,\n                                                    0x6c, 0x1a, 0x6b, 0xa1, 0x64, 0xeb, 0xf7, 0x9,\n                                                    0xef, 0xb8, 0xbf, 0xb8, 0x5a, 0x8c, 0x41, 0x8e,\n                                                    0x1e, 0x2d, 0x8e, 0x76, 0x8a, 0x5b, 0x96, 0x8,\n                                                    0x90, 0xf7, 0xec, 0x15, 0x3b, 0xa6, 0x33, 0xd8,\n                                                    0xcf, 0x90, 0xcf, 0xbe, 0xbe, 0x7a, 0xe3, 0x36,\n                                                    0x67, 0x64, 0x75, 0x47, 0x1e, 0x71, 0xfb, 0xe9,\n                                                    0x15, 0x70, 0x98, 0x71, 0x97, 0xa7, 0x1a, 0x9d,\n                                                    0x8b, 0x96, 0xe4, 0xdb, 0x1e, 0x4f, 0xa6, 0x6a,\n                                                    0xb7, 0xc6, 0x1a, 0xf7, 0xf, 0xe3, 0xb7, 0xe0,\n                                                    0xae, 0xad, 0x83, 0x7c, 0xa6, 0x1e, 0x80, 0x9f,\n                                                    0x9e, 0x8c, 0x9b, 0x1b, 0xd8, 0x64, 0x38, 0x6,\n                                                    0x94, 0x74, 0x95, 0x77, 0x5a, 0x1a, 0xfb, 0x0,\n                                                    0x24, 0x64, 0x53, 0x1e, 0x7e, 0x68, 0x90, 0x85,\n                                                    0x1b, 0x77, 0x88, 0x63, 0x62, 0x78, 0x1a, 0x74,\n                                                    0xbc, 0x87, 0xa8, 0x1e, 0xf7, 0x15, 0x85, 0x5,\n                                                    0xf6, 0x86, 0x99, 0x41, 0x6f, 0x1a, 0xfb, 0x5,\n                                                    0xfb, 0x3a, 0x53, 0x31, 0x26, 0x3f, 0xb7, 0xc0,\n                                                    0xb9, 0xba, 0xb1, 0xbe, 0xb1, 0x1e, 0xe, 0xa0,\n                                                    0x76, 0xf8, 0x2a, 0xc1, 0xf7, 0x73, 0x77, 0x1,\n                                                    0xd4, 0xdf, 0xf7, 0x4e, 0xdf, 0x3, 0x94, 0x16,\n                                                    0xf7, 0x6c, 0x9a, 0x6, 0x5a, 0x90, 0x78, 0x9a,\n                                                    0xd8, 0x1a, 0xf7, 0x7b, 0x7, 0xbb, 0xb4, 0xb2,\n                                                    0x9a, 0xa8, 0x1b, 0xc2, 0xa1, 0x64, 0x48, 0x1f,\n                                                    0xfb, 0x50, 0x7, 0x3e, 0x78, 0x7c, 0x5a, 0x86,\n                                                    0x1e, 0x7c, 0xf7, 0x68, 0x9a, 0x7, 0x59, 0x94,\n                                                    0x81, 0x9a, 0xd4, 0x1a, 0xf7, 0x51, 0x7, 0xb3,\n                                                    0x8a, 0xf7, 0xb, 0xfb, 0xf, 0x4f, 0x5a, 0x6b,\n                                                    0x59, 0x68, 0x1e, 0x89, 0xf7, 0xc2, 0x6, 0x86,\n                                                    0x8e, 0x5b, 0x7a, 0x59, 0x7d, 0x5e, 0x7e, 0x19,\n                                                    0x71, 0x7, 0x8c, 0x8e, 0x96, 0x82, 0xa, 0x76,\n                                                    0x6d, 0x1f, 0xfc, 0x57, 0x7, 0x42, 0x81, 0x7a,\n                                                    0x55, 0x84, 0x1e, 0xe, 0x8f, 0xa, 0xf8, 0xd9,\n                                                    0xf1, 0x12, 0xd9, 0xf0, 0x37, 0xdf, 0x13, 0xe0,\n                                                    0x31, 0x1d, 0x57, 0x78, 0x54, 0x78, 0x57, 0x7a,\n                                                    0x19, 0x7c, 0x7, 0x8d, 0x98, 0x9c, 0x8d, 0x99,\n                                                    0x1b, 0x13, 0xd0, 0x9b, 0x9e, 0x80, 0x50, 0x1f,\n                                                    0xfb, 0x68, 0x7, 0x3d, 0x7a, 0x7b, 0x4d, 0x88,\n                                                    0x1e, 0x13, 0xe0, 0xc9, 0xf8, 0xfd, 0x64, 0x1d,\n                                                    0x3c, 0xfb, 0x6e, 0xad, 0xf9, 0x91, 0xf1, 0x12,\n                                                    0xf3, 0xf0, 0x2b, 0xdf, 0x13, 0xd0, 0xab, 0xf8,\n                                                    0x1a, 0x15, 0x8d, 0x9a, 0x98, 0x8d, 0x99, 0x1b,\n                                                    0x9b, 0x9e, 0x80, 0x50, 0x1f, 0xfc, 0x5, 0x7,\n                                                    0x39, 0x8b, 0x52, 0x59, 0x78, 0x80, 0x9b, 0x9b,\n                                                    0x7e, 0x1e, 0x99, 0x7f, 0x7e, 0x99, 0x76, 0x1b,\n                                                    0x78, 0x76, 0x7c, 0x74, 0x66, 0xb9, 0x78, 0xba,\n                                                    0xf7, 0x15, 0xb4, 0xf0, 0xf7, 0x9, 0x1f, 0x8c,\n                                                    0xf8, 0x5d, 0x85, 0x8e, 0x57, 0x77, 0x57, 0x79,\n                                                    0x57, 0x7b, 0x19, 0x13, 0xe0, 0xc7, 0xf7, 0x76,\n                                                    0x64, 0x1d, 0xa0, 0x76, 0xf8, 0x56, 0x77, 0xf7,\n                                                    0x91, 0x77, 0x1, 0xdd, 0xdf, 0x3, 0x92, 0x16,\n                                                    0xf7, 0x7e, 0x9a, 0x6, 0x77, 0x8c, 0x5, 0x6a,\n                                                    0x8d, 0x75, 0x9d, 0xb4, 0x1a, 0xf7, 0x3f, 0x8d,\n                                                    0x7, 0xf7, 0x1e, 0xfb, 0x4c, 0x5, 0x97, 0x7a,\n                                                    0x94, 0x82, 0x84, 0x1a, 0x7e, 0x7e, 0x88, 0x83,\n                                                    0x1e, 0x78, 0x7c, 0xf7, 0x6e, 0x9a, 0x6, 0x70,\n                                                    0x8d, 0x64, 0x92, 0x58, 0xcb, 0xfb, 0x2d, 0xf7,\n                                                    0x56, 0x18, 0xa8, 0xa6, 0x5, 0xf7, 0x12, 0xf7,\n                                                    0x1b, 0xa7, 0x8b, 0xc0, 0x1b, 0x9a, 0xfb, 0x60,\n                                                    0x7d, 0x7, 0xb5, 0x93, 0x83, 0x80, 0x82, 0x83,\n                                                    0x80, 0x7c, 0x7d, 0x1f, 0x63, 0x69, 0x50, 0x54,\n                                                    0x67, 0x6c, 0x89, 0x8d, 0x18, 0xf8, 0x34, 0x7,\n                                                    0x87, 0x8d, 0x56, 0x7a, 0x56, 0x7d, 0x5a, 0x6f,\n                                                    0x1d, 0x93, 0x94, 0x8c, 0x98, 0x1b, 0xb2, 0x91,\n                                                    0x71, 0x5e, 0x1f, 0xfc, 0x70, 0x7, 0x69, 0x83,\n                                                    0x79, 0x48, 0x80, 0x1e, 0xe, 0x8f, 0xa, 0xf9,\n                                                    0x3f, 0x77, 0x1, 0xed, 0xdf, 0x3, 0x9e, 0x16,\n                                                    0xf7, 0x82, 0x9a, 0x6, 0x51, 0x8e, 0x7a, 0x9d,\n                                                    0xc5, 0x1a, 0xf8, 0xdf, 0x5d, 0xa, 0xfc, 0x67,\n                                                    0x7, 0x54, 0x77, 0x74, 0x50, 0x84, 0x1d, 0xf8,\n                                                    0x39, 0xa0, 0x76, 0xf8, 0x2c, 0xbf, 0x1, 0xe1,\n                                                    0xdf, 0xf7, 0x4c, 0xdf, 0xf7, 0x4c, 0xdf, 0x14,\n                                                    0x38, 0x9b, 0x16, 0xf7, 0x72, 0x9a, 0x6, 0x68,\n                                                    0x8c, 0x6a, 0x98, 0xcb, 0x1a, 0xf7, 0x94, 0x7,\n                                                    0x90, 0xb9, 0xc1, 0xd0, 0xbf, 0x9c, 0x64, 0x49,\n                                                    0x1e, 0xfb, 0x63, 0x7, 0x4a, 0x74, 0x7e, 0x5e,\n                                                    0x88, 0x1e, 0x7c, 0xf7, 0x74, 0x9a, 0x7, 0x62,\n                                                    0x8c, 0x6c, 0x9c, 0xca, 0x1a, 0xf7, 0x8f, 0x7,\n                                                    0xad, 0xa1, 0xad, 0xa6, 0xc2, 0x1b, 0xd3, 0x8c,\n                                                    0x50, 0x58, 0x1f, 0xfb, 0x5d, 0x7, 0x4b, 0x7b,\n                                                    0x7f, 0x59, 0x85, 0x1e, 0x7c, 0xf7, 0x6f, 0x9a,\n                                                    0x7, 0x71, 0x8d, 0x5, 0x5f, 0x92, 0x8c, 0xac,\n                                                    0xb3, 0x1a, 0xf7, 0x4d, 0x7, 0xd5, 0x7d, 0xf3,\n                                                    0x23, 0x3c, 0x4e, 0x4f, 0x73, 0x76, 0x1e, 0xb5,\n                                                    0x80, 0x6c, 0xb5, 0x4a, 0x1b, 0x55, 0x62, 0x6b,\n                                                    0x5e, 0x50, 0x1f, 0xd6, 0x7, 0x84, 0x8d, 0x5d,\n                                                    0x7a, 0x59, 0x7c, 0x5c, 0x7e, 0x19, 0x7a, 0x7,\n                                                    0x8d, 0x93, 0x98, 0x53, 0x1d, 0x4c, 0x1f, 0xfb,\n                                                    0x87, 0x7, 0x48, 0x6d, 0x7f, 0x63, 0x8a, 0x1e,\n                                                    0xe, 0xa0, 0x76, 0xf8, 0x2a, 0xc2, 0x73, 0xa,\n                                                    0xa5, 0xbe, 0x1a, 0xf7, 0x91, 0x7e, 0xa, 0xfb,\n                                                    0x6e, 0x7, 0x50, 0x71, 0x7e, 0x82, 0x1d, 0xa4,\n                                                    0xba, 0x1a, 0xf7, 0x6f, 0x46, 0xa, 0xe, 0x7f,\n                                                    0xa7, 0xf8, 0x35, 0xa7, 0x1, 0xb8, 0xe5, 0xf7,\n                                                    0x82, 0xe5, 0x3, 0xa8, 0xf7, 0x7a, 0x15, 0xfb,\n                                                    0x1b, 0xe5, 0x22, 0x65, 0x1d, 0xf7, 0x1d, 0xee,\n                                                    0xf7, 0x25, 0x2d, 0xe4, 0xfb, 0x17, 0xfb, 0x1a,\n                                                    0x39, 0x20, 0xfb, 0xf, 0x1e, 0xe5, 0xa0, 0x15,\n                                                    0xf3, 0xca, 0xd8, 0xca, 0xe7, 0xb6, 0x37, 0x80,\n                                                    0xa, 0x39, 0x4c, 0x58, 0xfb, 0xc, 0x83, 0xf7,\n                                                    0x33, 0xd5, 0x1e, 0xe, 0x8e, 0x1d, 0x1, 0xd6,\n                                                    0xdf, 0xf7, 0x75, 0xe1, 0x3, 0xf7, 0x33, 0xac,\n                                                    0x15, 0x5f, 0x1d, 0x76, 0x1f, 0x89, 0x8d, 0x5,\n                                                    0xd4, 0x7, 0x85, 0x8d, 0x5b, 0x78, 0x5b, 0x7a,\n                                                    0x5b, 0x7c, 0x19, 0x7b, 0x7, 0x8c, 0x94, 0x95,\n                                                    0x8b, 0x94, 0x1b, 0xae, 0x8e, 0x7a, 0x63, 0x1f,\n                                                    0xfc, 0x5e, 0x7, 0x60, 0x87, 0x6c, 0x49, 0x86,\n                                                    0x1e, 0x7a, 0xf7, 0x86, 0x9d, 0x7, 0x43, 0x7b,\n                                                    0xa1, 0xc5, 0x1f, 0xf7, 0x63, 0x4, 0x5a, 0xa,\n                                                    0xfb, 0x58, 0x76, 0xf7, 0x63, 0xc8, 0xf8, 0x11,\n                                                    0xa7, 0x1, 0xa3, 0xe1, 0xf7, 0x7b, 0xdf, 0x3,\n                                                    0xf7, 0x90, 0xfb, 0x5c, 0x15, 0x7a, 0xf7, 0x80,\n                                                    0x99, 0x7, 0x5e, 0x95, 0x79, 0x9b, 0xc7, 0x1a,\n                                                    0xf8, 0xd1, 0x7, 0x84, 0x8f, 0x51, 0x68, 0x5,\n                                                    0xa1, 0x64, 0x74, 0x98, 0x58, 0x1b, 0xfb, 0x11,\n                                                    0x29, 0xfb, 0x2, 0xfb, 0x1e, 0xfb, 0x2b, 0xd6,\n                                                    0x44, 0xe4, 0xc8, 0xd1, 0xb5, 0xa9, 0x9c, 0x1f,\n                                                    0x90, 0xfb, 0x44, 0x6, 0x59, 0x7d, 0x6a, 0x40,\n                                                    0x88, 0x1e, 0xe4, 0xf7, 0xdb, 0x15, 0x8a, 0x6b,\n                                                    0x8b, 0x7b, 0x57, 0x78, 0x8, 0x84, 0x79, 0x7a,\n                                                    0x89, 0x7c, 0x1b, 0x32, 0x64, 0xea, 0xe7, 0xf7,\n                                                    0xd, 0xc1, 0xd4, 0xdc, 0xea, 0x8c, 0x44, 0x6f,\n                                                    0x1f, 0xe, 0x73, 0xa0, 0x76, 0xf8, 0x21, 0xca,\n                                                    0x55, 0xc1, 0x12, 0xd7, 0xdf, 0x13, 0xd0, 0x90,\n                                                    0x16, 0xf7, 0x84, 0x9a, 0x6, 0x58, 0x8d, 0x69,\n                                                    0x99, 0xd0, 0x1a, 0xf7, 0x6b, 0x7, 0xab, 0xb7,\n                                                    0xbd, 0xa3, 0x98, 0x94, 0x81, 0x82, 0x95, 0x1e,\n                                                    0x83, 0x95, 0x95, 0x83, 0x9c, 0x1b, 0x13, 0xb0,\n                                                    0xa3, 0x99, 0x9e, 0xa4, 0xac, 0x77, 0xa0, 0x69,\n                                                    0x65, 0x69, 0x77, 0x44, 0x5c, 0x1f, 0x89, 0xe4,\n                                                    0x6, 0x86, 0x8d, 0x5a, 0x77, 0x59, 0x79, 0x5a,\n                                                    0x7b, 0x19, 0x7b, 0x7, 0x8d, 0x94, 0x96, 0x53,\n                                                    0x1d, 0x50, 0x1f, 0xfb, 0x7e, 0x7, 0x4b, 0x7b,\n                                                    0x80, 0x54, 0x81, 0x1e, 0xe, 0xab, 0x7d, 0xa1,\n                                                    0xf8, 0x3c, 0xa2, 0x87, 0x77, 0x12, 0xc9, 0xc9,\n                                                    0xf7, 0x2e, 0xd1, 0x57, 0x9a, 0x13, 0xd8, 0xbe,\n                                                    0x81, 0x15, 0x99, 0x91, 0x5, 0x94, 0x91, 0x99,\n                                                    0x8e, 0x97, 0x1b, 0x9c, 0x8c, 0x9d, 0x84, 0xa1,\n                                                    0x86, 0x8, 0x87, 0x9a, 0x9b, 0x88, 0x9d, 0x1b,\n                                                    0xcb, 0xdc, 0xb5, 0xe2, 0xc7, 0x68, 0x66, 0xa,\n                                                    0x1e, 0x13, 0xd4, 0xb7, 0xb4, 0x76, 0x25, 0xa1,\n                                                    0x1f, 0x9a, 0x6, 0x13, 0xb4, 0xf7, 0x1d, 0x80,\n                                                    0x7, 0x87, 0x88, 0x7c, 0x84, 0x82, 0x1b, 0x81,\n                                                    0x80, 0x91, 0x91, 0x7b, 0x1f, 0x8f, 0x7f, 0x7d,\n                                                    0x7c, 0x1d, 0xc5, 0x6a, 0x5, 0x13, 0xd8, 0xab,\n                                                    0x79, 0x9f, 0x73, 0x6b, 0x1a, 0x52, 0x5c, 0x95,\n                                                    0xa, 0x7a, 0x6, 0xe, 0x3c, 0x81, 0xbf, 0xf8,\n                                                    0x2, 0xab, 0x1, 0xd1, 0xdf, 0x3, 0xf7, 0x9e,\n                                                    0xd8, 0x15, 0x7e, 0x80, 0x79, 0x75, 0x6b, 0x1b,\n                                                    0x58, 0x8b, 0xc6, 0xaa, 0x1f, 0xf7, 0xa8, 0xf0,\n                                                    0xab, 0x26, 0xf7, 0x12, 0x7, 0x93, 0x8b, 0x90,\n                                                    0x84, 0x1e, 0x66, 0x56, 0x7c, 0x6b, 0x65, 0x64,\n                                                    0x8, 0x75, 0x75, 0x75, 0x85, 0x7f, 0x1a, 0x88,\n                                                    0x8d, 0x88, 0x8d, 0x8a, 0x1e, 0xc0, 0xfb, 0xb7,\n                                                    0x6, 0x27, 0xb4, 0x70, 0xbe, 0xb9, 0xba, 0xac,\n                                                    0xb6, 0xa3, 0x1e, 0xe, 0x81, 0xc7, 0xf8, 0x24,\n                                                    0x90, 0xa, 0xf7, 0xe6, 0x84, 0x15, 0x8d, 0x89,\n                                                    0xba, 0x9c, 0xb1, 0x99, 0xc1, 0x99, 0x19, 0x32,\n                                                    0xa, 0xfb, 0x75, 0x52, 0xa, 0x7d, 0x2c, 0x1d,\n                                                    0x9d, 0xbb, 0x8f, 0xb2, 0xb2, 0x1e, 0xb6, 0xb6,\n                                                    0x5, 0xe, 0x92, 0x76, 0xf8, 0x64, 0x77, 0x1,\n                                                    0x9e, 0xf8, 0x47, 0x15, 0x9f, 0x8a, 0x9f, 0x7b,\n                                                    0x9a, 0x6d, 0xaf, 0x44, 0xeb, 0xfb, 0x72, 0xa3,\n                                                    0x4d, 0x8, 0x60, 0x9b, 0x8d, 0x87, 0x94, 0x1b,\n                                                    0x92, 0x94, 0xa2, 0xa6, 0x96, 0x1f, 0xf7, 0x14,\n                                                    0xf7, 0xcb, 0xa3, 0xc6, 0x92, 0xa5, 0xad, 0x8e,\n                                                    0x19, 0x9a, 0xfb, 0x1f, 0x7c, 0x7, 0xa4, 0x8a,\n                                                    0xa1, 0x78, 0x74, 0x1a, 0x67, 0x44, 0xfb, 0x26,\n                                                    0x69, 0x2b, 0x1e, 0x25, 0xf7, 0x8a, 0x5, 0x88,\n                                                    0x93, 0x85, 0x9a, 0x97, 0x1a, 0xa4, 0xa1, 0x98,\n                                                    0xa3, 0x8d, 0x1e, 0x9a, 0xfb, 0x58, 0x7, 0xe,\n                                                    0xf8, 0x1, 0x92, 0x76, 0xf8, 0x64, 0x77, 0x12,\n                                                    0xa0, 0xf7, 0x48, 0xf8, 0x6, 0xf7, 0xf, 0x17,\n                                                    0xa0, 0xf8, 0x47, 0x15, 0xa4, 0x89, 0x93, 0x74,\n                                                    0x9f, 0x5b, 0xf7, 0x1b, 0xfb, 0xe0, 0x18, 0x69,\n                                                    0x99, 0x90, 0x81, 0x92, 0x1b, 0x91, 0x90, 0x96,\n                                                    0xa7, 0x99, 0x1f, 0xf7, 0x4, 0xf7, 0x84, 0xe6,\n                                                    0xfb, 0x80, 0x5, 0x67, 0x99, 0x8d, 0x84, 0x93,\n                                                    0x1b, 0x93, 0x8f, 0x95, 0xb2, 0x9b, 0x1f, 0xf7,\n                                                    0x1e, 0xf7, 0xe4, 0x9a, 0xb0, 0x90, 0x9f, 0xa0,\n                                                    0x92, 0x19, 0x13, 0x70, 0x9a, 0xfb, 0xf, 0x7c,\n                                                    0x7, 0xa3, 0x86, 0x9f, 0x7d, 0x73, 0x1a, 0x7f,\n                                                    0x85, 0x70, 0x80, 0x72, 0x1e, 0x31, 0xfb, 0x68,\n                                                    0x3b, 0xf7, 0x6a, 0x5, 0x7c, 0xb2, 0x85, 0x8c,\n                                                    0x9d, 0x1a, 0xa8, 0xa4, 0x98, 0xac, 0x90, 0x1e,\n                                                    0x9a, 0xfb, 0x5f, 0x7c, 0x7, 0xb4, 0x86, 0x96,\n                                                    0x84, 0xb0, 0xfb, 0x5, 0x30, 0xfb, 0x5b, 0x18,\n                                                    0x5d, 0xf7, 0x14, 0x50, 0xf7, 0x9, 0xae, 0x1a,\n                                                    0xa7, 0xa2, 0x99, 0xa2, 0x8d, 0x1e, 0x9a, 0xfb,\n                                                    0x48, 0x7, 0xe, 0xa0, 0x76, 0xf8, 0x59, 0x77,\n                                                    0x12, 0x9c, 0xf7, 0x25, 0xf7, 0x8, 0xf7, 0x5d,\n                                                    0x17, 0x9c, 0x16, 0xf7, 0x25, 0x9a, 0x6, 0x7a,\n                                                    0x76, 0x95, 0x9d, 0x89, 0x1f, 0x96, 0x99, 0xa0,\n                                                    0x91, 0x94, 0x1e, 0x13, 0xf0, 0xda, 0xf7, 0x5,\n                                                    0xdc, 0xfb, 0x6, 0x5, 0x8f, 0x86, 0x97, 0x7f,\n                                                    0x7c, 0x1a, 0x76, 0x82, 0x7d, 0x6c, 0x8a, 0x1e,\n                                                    0x7c, 0xf7, 0x5d, 0x9a, 0x7, 0x7a, 0x8c, 0x70,\n                                                    0x96, 0x65, 0xc5, 0xfb, 0x14, 0xf7, 0x4e, 0x18,\n                                                    0xde, 0xf7, 0x2, 0x93, 0x98, 0xa9, 0xb3, 0xb6,\n                                                    0x8c, 0x19, 0x9a, 0xfb, 0x32, 0x7c, 0x7, 0x9c,\n                                                    0x8a, 0xa2, 0x80, 0x76, 0x1a, 0x80, 0x85, 0x82,\n                                                    0x4e, 0x33, 0x1e, 0x78, 0xa8, 0x62, 0xc8, 0x9d,\n                                                    0x1a, 0xa0, 0xa4, 0x97, 0x9d, 0x1e, 0x9a, 0xfb,\n                                                    0x63, 0x7c, 0x7, 0xac, 0x8c, 0x97, 0x81, 0xb4,\n                                                    0x4e, 0xe9, 0xfb, 0x1a, 0x18, 0xfb, 0x6, 0xfb,\n                                                    0x2f, 0x6b, 0x5d, 0x7d, 0x7f, 0x70, 0x88, 0x19,\n                                                    0xe, 0x96, 0xa, 0xf8, 0xca, 0x77, 0x12, 0x13,\n                                                    0xa0, 0xf7, 0x86, 0xa1, 0x15, 0x68, 0x85, 0x68,\n                                                    0xfb, 0xd, 0x57, 0x1b, 0x13, 0x60, 0x45, 0xa,\n                                                    0x9b, 0xb4, 0x9e, 0x4a, 0xa, 0x3d, 0xfb, 0x68,\n                                                    0x3b, 0xa, 0x8, 0xe, 0xe2, 0x61, 0xa9, 0xf8,\n                                                    0x46, 0xa9, 0x6a, 0xa, 0x7b, 0x6c, 0x21, 0x1b,\n                                                    0xfb, 0x14, 0x56, 0x1d, 0xe, 0x92, 0xa, 0x12,\n                                                    0xf7, 0x47, 0xd5, 0x47, 0xd5, 0x13, 0xe0, 0xef,\n                                                    0xf7, 0x8e, 0x15, 0x13, 0xd0, 0xd0, 0x78, 0x9b,\n                                                    0x5f, 0x4b, 0x98, 0xa, 0xfb, 0xc, 0xc9, 0x77,\n                                                    0xf2, 0x1e, 0x96, 0x7, 0x44, 0x9b, 0x77, 0xb5,\n                                                    0xd0, 0x1a, 0xf7, 0x38, 0x7, 0xd2, 0x7e, 0xb2,\n                                                    0x3d, 0x9c, 0x1e, 0x8d, 0x7, 0xd9, 0x9d, 0x98,\n                                                    0xb2, 0xd2, 0x1a, 0xf7, 0x38, 0x7, 0xd0, 0x9f,\n                                                    0xb5, 0xd2, 0x9b, 0x1e, 0x96, 0x7, 0x24, 0x4d,\n                                                    0x77, 0xfb, 0xb, 0x1f, 0xfb, 0x3b, 0x7, 0x4b,\n                                                    0x7b, 0x61, 0x46, 0x79, 0x1e, 0xe, 0xfb, 0x31,\n                                                    0xfb, 0x2a, 0x76, 0xf7, 0x46, 0x7a, 0x1d, 0xce,\n                                                    0xcd, 0x55, 0xb4, 0x3, 0xda, 0xfb, 0x3f, 0x15,\n                                                    0xb4, 0xf9, 0xe3, 0x62, 0x6, 0xe, 0x92, 0xa,\n                                                    0x1, 0xf7, 0x70, 0xd5, 0x3, 0xf7, 0x16, 0xfb,\n                                                    0x3e, 0x15, 0x80, 0x7, 0xf2, 0xc8, 0x9f, 0xf7,\n                                                    0xc, 0x1f, 0xf7, 0x38, 0x7, 0xcb, 0x9c, 0xb7,\n                                                    0xd0, 0x9e, 0x1e, 0x46, 0x9d, 0x7a, 0xb5, 0xcb,\n                                                    0x1a, 0xf7, 0x3b, 0x7, 0xf7, 0xb, 0x4e, 0x9f,\n                                                    0x24, 0x1e, 0x80, 0x7, 0xd2, 0x7b, 0x9e, 0x61,\n                                                    0x46, 0x98, 0xa, 0x44, 0x98, 0x64, 0xd9, 0x79,\n                                                    0x1e, 0x89, 0x7, 0x3d, 0x7a, 0x7e, 0x64, 0x44,\n                                                    0x98, 0xa, 0x46, 0x78, 0x61, 0x44, 0x7b, 0x1e,\n                                                    0xe, 0xf7, 0x4c, 0xf7, 0x4b, 0xcb, 0x97, 0xcb,\n                                                    0x1, 0xd7, 0xf7, 0x4b, 0x15, 0xae, 0x9b, 0xa3,\n                                                    0xb4, 0xb7, 0x1b, 0xba, 0xa7, 0x79, 0x79, 0xa6,\n                                                    0x1f, 0x77, 0xa8, 0xa9, 0x77, 0xc3, 0x1b, 0xc9,\n                                                    0xac, 0xbb, 0xb5, 0xa9, 0x1f, 0x67, 0xbd, 0x5,\n                                                    0x68, 0x74, 0x72, 0x62, 0x63, 0x1b, 0x6d, 0x6e,\n                                                    0x9e, 0x9e, 0x69, 0x1f, 0x9e, 0x69, 0x64, 0x9e,\n                                                    0x5c, 0x1b, 0x48, 0x67, 0x5b, 0x61, 0x75, 0x1f,\n                                                    0xe, 0x73, 0xfb, 0x59, 0x76, 0xf8, 0xd5, 0xf7,\n                                                    0x0, 0x1, 0xec, 0xf7, 0x0, 0x3, 0xf7, 0x23,\n                                                    0xf7, 0xac, 0x15, 0x98, 0x6, 0xa5, 0xfb, 0x5d,\n                                                    0xa2, 0xfb, 0x48, 0x73, 0x1a, 0x5a, 0x7f, 0x5f,\n                                                    0x5f, 0x61, 0x81, 0xb2, 0xbf, 0xa4, 0xa0, 0xf7,\n                                                    0x49, 0xa4, 0xf7, 0x5d, 0x1e, 0x5d, 0xf7, 0x19,\n                                                    0x15, 0x6d, 0xa3, 0x73, 0xa9, 0xa9, 0xa3, 0xa3,\n                                                    0xa9, 0xa9, 0x73, 0xa3, 0x6d, 0x6d, 0x73, 0x73,\n                                                    0x6d, 0x1e, 0xe, 0x87, 0xd4, 0x52, 0xbf, 0xf7,\n                                                    0xfc, 0xa9, 0x73, 0xa9, 0x12, 0xca, 0xd8, 0x13,\n                                                    0xa8, 0xf7, 0xa, 0xfb, 0x1e, 0x15, 0xad, 0x6,\n                                                    0xbc, 0xf7, 0x1e, 0x5, 0x86, 0x9d, 0x99, 0x87,\n                                                    0xa1, 0x1b, 0xe2, 0xc6, 0xc8, 0xf3, 0xba, 0x1f,\n                                                    0x7e, 0x93, 0x5, 0x13, 0x68, 0x45, 0x5d, 0x62,\n                                                    0x6d, 0x4d, 0x1b, 0x74, 0x7c, 0x90, 0x92, 0x78,\n                                                    0x1f, 0xf0, 0xf7, 0xb7, 0x5, 0x67, 0x9b, 0x9a,\n                                                    0x7b, 0xa8, 0x1b, 0xa2, 0x9d, 0x9e, 0xa5, 0xad,\n                                                    0x6b, 0xaf, 0x60, 0x99, 0x1f, 0xba, 0xf7, 0x1b,\n                                                    0x5, 0x68, 0x6, 0x5f, 0xfb, 0x10, 0x5, 0x13,\n                                                    0x98, 0x8e, 0x78, 0x7b, 0x8d, 0x7b, 0x1b, 0xfb,\n                                                    0x19, 0x34, 0xfb, 0x7, 0xfb, 0xe, 0x1f, 0x13,\n                                                    0x68, 0x3f, 0xac, 0x3c, 0xde, 0x53, 0x1e, 0xa8,\n                                                    0xe1, 0x15, 0x5c, 0xb1, 0x76, 0xbf, 0xce, 0x1a,\n                                                    0x13, 0x98, 0xf7, 0x19, 0xde, 0xb5, 0xbf, 0xa1,\n                                                    0x98, 0x87, 0x86, 0x98, 0x1e, 0xe, 0x83, 0xa7,\n                                                    0x6f, 0xdf, 0x37, 0xf7, 0x1e, 0xf7, 0x5a, 0xb8,\n                                                    0xf7, 0x31, 0xf7, 0x26, 0x70, 0xa6, 0x12, 0xf7,\n                                                    0xf, 0xe0, 0xf7, 0x2b, 0xe4, 0x13, 0x57, 0xf7,\n                                                    0x46, 0xc1, 0x15, 0x6c, 0xb7, 0xba, 0x6c, 0xbe,\n                                                    0x1b, 0xd7, 0xe9, 0xda, 0xcc, 0x90, 0x88, 0x8b,\n                                                    0x88, 0x1f, 0x76, 0x75, 0x4a, 0x2f, 0x1b, 0x6b,\n                                                    0x53, 0x92, 0xa7, 0x4d, 0x1f, 0xa2, 0xed, 0x8e,\n                                                    0xac, 0x89, 0xc6, 0x8a, 0xa6, 0x18, 0xf7, 0x18,\n                                                    0xb8, 0xfb, 0x1b, 0x6, 0x84, 0xc4, 0x87, 0xab,\n                                                    0xbe, 0x1a, 0xae, 0x93, 0xf0, 0xe2, 0x97, 0xb7,\n                                                    0x8b, 0x57, 0x1e, 0x13, 0x3b, 0x6a, 0x8b, 0x69,\n                                                    0xb3, 0xa4, 0xa3, 0x9e, 0xad, 0xb9, 0x5d, 0xba,\n                                                    0x37, 0x22, 0x31, 0x42, 0xfb, 0x37, 0x6b, 0x8e,\n                                                    0x7d, 0x8f, 0x76, 0x1e, 0x20, 0x5e, 0xf7, 0x0,\n                                                    0x6, 0x90, 0x60, 0x90, 0x69, 0x8f, 0x6e, 0x90,\n                                                    0x64, 0x8f, 0x6d, 0x86, 0x6f, 0x8, 0x8f, 0x7d,\n                                                    0x7d, 0x8c, 0x7d, 0x1b, 0x59, 0x5e, 0x72, 0x57,\n                                                    0x60, 0xae, 0x79, 0xab, 0xb9, 0xa5, 0xa9, 0xab,\n                                                    0xa6, 0x1f, 0xfb, 0x20, 0x8d, 0x15, 0xa8, 0xab,\n                                                    0x94, 0xa7, 0xa2, 0xa0, 0x83, 0x82, 0x1e, 0x13,\n                                                    0x9b, 0x81, 0x7b, 0x5c, 0x5b, 0x75, 0x79, 0x9a,\n                                                    0xa0, 0x1e, 0xe, 0xf7, 0x1d, 0xc4, 0xf7, 0xa4,\n                                                    0xc4, 0x12, 0xaf, 0xce, 0x5d, 0xc8, 0xf7, 0x9c,\n                                                    0xc8, 0x5d, 0xce, 0x13, 0xd4, 0xf7, 0xa, 0xf7,\n                                                    0xdf, 0x15, 0xd3, 0xc4, 0xca, 0xd7, 0x1e, 0x13,\n                                                    0xe8, 0xd6, 0xc3, 0x4c, 0x43, 0x41, 0x53, 0x4c,\n                                                    0x40, 0x1f, 0x13, 0xd4, 0x3f, 0x52, 0xca, 0xd5,\n                                                    0x1f, 0x47, 0xfb, 0x8a, 0x15, 0xe2, 0xe3, 0x5,\n                                                    0x74, 0xa5, 0xb6, 0x7e, 0xb6, 0x1b, 0xb7, 0xb7,\n                                                    0x97, 0xa3, 0xa5, 0x1f, 0xe4, 0x33, 0xb6, 0xb8,\n                                                    0x34, 0xe2, 0x5, 0x13, 0xe8, 0xa4, 0xa7, 0x95,\n                                                    0xbb, 0xb9, 0x1a, 0xb3, 0x7e, 0xb2, 0x75, 0xa4,\n                                                    0x1e, 0xe2, 0xe4, 0x60, 0xb6, 0x32, 0x34, 0x5,\n                                                    0xa3, 0x71, 0x5f, 0x96, 0x60, 0x1b, 0x60, 0x5f,\n                                                    0x7f, 0x74, 0x71, 0x1f, 0x34, 0xe2, 0x5e, 0x60,\n                                                    0xe3, 0x32, 0x5, 0x13, 0xd4, 0x74, 0x72, 0x7e,\n                                                    0x62, 0x60, 0x1a, 0x5e, 0x96, 0x5e, 0xa4, 0x70,\n                                                    0x1e, 0x33, 0x34, 0x5, 0xe, 0xa0, 0x76, 0xf7,\n                                                    0x4a, 0xb3, 0xe5, 0xb3, 0xf7, 0xca, 0x77, 0x1,\n                                                    0xf7, 0x52, 0xe0, 0x3, 0xf7, 0x3, 0x16, 0xf7,\n                                                    0x88, 0x9e, 0x6, 0x52, 0x8c, 0x74, 0xa3, 0xd6,\n                                                    0x1a, 0xca, 0xf7, 0x41, 0xb3, 0xfb, 0x41, 0xd7,\n                                                    0x7, 0x92, 0x99, 0x5, 0xf7, 0x3a, 0xb3, 0xfb,\n                                                    0x26, 0x6, 0xe7, 0xf7, 0x42, 0xad, 0xce, 0xaf,\n                                                    0xb4, 0xbb, 0x94, 0x19, 0x9e, 0xfb, 0x57, 0x78,\n                                                    0x7, 0xae, 0x8e, 0xa9, 0x77, 0x73, 0x1a, 0x7b,\n                                                    0x85, 0x7e, 0x83, 0x7c, 0x1e, 0xfb, 0x4, 0xfb,\n                                                    0x66, 0xfb, 0xa, 0xf7, 0x67, 0x5, 0x83, 0x9a,\n                                                    0x86, 0x9c, 0x97, 0x1a, 0xa0, 0x9d, 0x9f, 0xba,\n                                                    0x8a, 0x1e, 0x9e, 0xfb, 0x87, 0x78, 0x7, 0xbe,\n                                                    0x8a, 0xa0, 0x5f, 0xb9, 0x38, 0xea, 0xfb, 0x37,\n                                                    0x18, 0xfb, 0x24, 0x63, 0xf7, 0x3b, 0x6, 0x92,\n                                                    0x7d, 0x5, 0x3f, 0xfb, 0x42, 0x63, 0xf7, 0x42,\n                                                    0x4e, 0x7, 0x53, 0x83, 0x5f, 0x44, 0x89, 0x1e,\n                                                    0xe, 0xfb, 0x31, 0x92, 0x7a, 0x1d, 0xd9, 0xb7,\n                                                    0x3, 0xd9, 0xf8, 0x1d, 0x15, 0xb7, 0xf7, 0xaf,\n                                                    0x5f, 0x6, 0xfd, 0x46, 0x4, 0xb7, 0xf7, 0xa9,\n                                                    0x5f, 0x6, 0xe, 0xfb, 0x29, 0xa0, 0xf7, 0x74,\n                                                    0xa0, 0xf8, 0xd0, 0x77, 0x12, 0xcb, 0xc0, 0xf7,\n                                                    0x67, 0xed, 0x2b, 0xc3, 0x13, 0xf8, 0xf7, 0xbc,\n                                                    0xf7, 0x11, 0x15, 0xe1, 0x83, 0xb7, 0xca, 0xce,\n                                                    0x1a, 0xc6, 0x62, 0xc1, 0x5b, 0xb3, 0x1e, 0xfb,\n                                                    0x1d, 0xf7, 0x5, 0x5, 0x72, 0xa0, 0x82, 0xaa,\n                                                    0x9f, 0x1a, 0xa2, 0x9e, 0xba, 0xc7, 0xb9, 0xa1,\n                                                    0x72, 0x79, 0x87, 0x7f, 0x84, 0x81, 0x7f, 0x1e,\n                                                    0x85, 0x83, 0x85, 0x81, 0x7e, 0x1a, 0x7d, 0x94,\n                                                    0x6e, 0xb1, 0xae, 0x9b, 0xa3, 0xa9, 0x1e, 0x13,\n                                                    0xf4, 0xc5, 0x4e, 0xbc, 0x4b, 0x42, 0x46, 0x65,\n                                                    0x37, 0x48, 0xb5, 0x68, 0xc2, 0x5d, 0x1e, 0x89,\n                                                    0x89, 0x5, 0x38, 0x95, 0x57, 0x51, 0x41, 0x1a,\n                                                    0x5a, 0xa8, 0x51, 0xd0, 0x56, 0x1e, 0xf7, 0x26,\n                                                    0xfb, 0x4, 0x9b, 0x7b, 0x61, 0x1a, 0x59, 0x68,\n                                                    0x6e, 0x5a, 0x54, 0x78, 0xad, 0x96, 0x1e, 0x98,\n                                                    0xad, 0x95, 0xad, 0x1a, 0x9c, 0x7c, 0xa3, 0x6a,\n                                                    0x71, 0x6f, 0x79, 0x67, 0x52, 0xc8, 0x56, 0xda,\n                                                    0xec, 0xb8, 0xca, 0xca, 0xc3, 0x71, 0xac, 0x49,\n                                                    0xc3, 0x1e, 0xfb, 0x3f, 0xf7, 0x56, 0x15, 0xbb,\n                                                    0xb2, 0x9d, 0xa9, 0xc2, 0xf7, 0x13, 0xfb, 0x0,\n                                                    0x50, 0x5f, 0x69, 0x71, 0x66, 0x4c, 0xfb, 0x9,\n                                                    0xed, 0xd4, 0x1e, 0xe, 0x73, 0xf8, 0x9f, 0xef,\n                                                    0x1, 0x9d, 0xed, 0xf0, 0xed, 0x3, 0x9d, 0xf8,\n                                                    0xd1, 0x15, 0x6e, 0x1d, 0xf7, 0x5b, 0x16, 0x6e,\n                                                    0x1d, 0xe, 0xf8, 0x27, 0x7d, 0xb5, 0xf7, 0x2e,\n                                                    0x9f, 0xf7, 0x9f, 0x9f, 0xf7, 0x25, 0xb5, 0x1,\n                                                    0xb1, 0xc2, 0xf1, 0xd8, 0xf7, 0x97, 0x9b, 0xf7,\n                                                    0xc, 0xc2, 0x3, 0xb1, 0xf7, 0xde, 0x3e, 0xa,\n                                                    0x69, 0xa, 0xf8, 0x4a, 0x38, 0x15, 0x5d, 0x77,\n                                                    0x68, 0x63, 0x49, 0x1b, 0x25, 0x61, 0xd8, 0xf4,\n                                                    0x8c, 0x1f, 0xec, 0x8c, 0xb6, 0xd3, 0xe8, 0x1b,\n                                                    0xd9, 0xa7, 0x52, 0x61, 0x8f, 0x1f, 0x9c, 0xdb,\n                                                    0x6, 0xa9, 0x36, 0x94, 0x64, 0xfb, 0x2c, 0x4a,\n                                                    0xfb, 0x2, 0x38, 0xfb, 0x21, 0xea, 0x52, 0xf7,\n                                                    0x7, 0xcc, 0xb0, 0x95, 0xa5, 0xa8, 0x1e, 0x9b,\n                                                    0xd1, 0x5, 0xe, 0x3a, 0xf8, 0x33, 0x76, 0xf7,\n                                                    0x92, 0xa7, 0x12, 0x9b, 0xca, 0xd9, 0xd3, 0x17,\n                                                    0xf7, 0x32, 0xf8, 0xbb, 0x15, 0x48, 0x7, 0x8a,\n                                                    0x85, 0x8b, 0x84, 0x81, 0x82, 0x8, 0x88, 0x85,\n                                                    0x77, 0x79, 0x7d, 0x1b, 0x73, 0x7b, 0x9d, 0xa8,\n                                                    0x9e, 0xa2, 0xa1, 0xcf, 0xa1, 0x1f, 0x93, 0x24,\n                                                    0x15, 0x5f, 0x92, 0xa6, 0x81, 0x97, 0x1b, 0x96,\n                                                    0x9f, 0x8c, 0xa8, 0xa6, 0x1f, 0x9d, 0x7, 0x85,\n                                                    0x84, 0x82, 0x85, 0x7f, 0x1b, 0x7e, 0x8b, 0x97,\n                                                    0xa2, 0x1f, 0xf7, 0x7, 0x7, 0xac, 0x84, 0xca,\n                                                    0x2a, 0x40, 0x69, 0x68, 0x6b, 0x7d, 0x96, 0x7a,\n                                                    0x9f, 0x9f, 0x97, 0x98, 0x98, 0xa5, 0x89, 0x9d,\n                                                    0xb8, 0xa2, 0x97, 0x7a, 0x54, 0x1e, 0x2d, 0x69,\n                                                    0x50, 0x76, 0x4f, 0x1a, 0x13, 0x80, 0x5e, 0xb0,\n                                                    0x75, 0xae, 0xae, 0xae, 0x9f, 0xad, 0x9f, 0x1e,\n                                                    0xe, 0x79, 0xa, 0xb5, 0xf7, 0x77, 0x50, 0xa,\n                                                    0xa4, 0xaf, 0x92, 0x1a, 0x92, 0x89, 0x8f, 0x83,\n                                                    0x1e, 0x78, 0xfb, 0x51, 0x50, 0xa, 0xa5, 0xaf,\n                                                    0x92, 0x96, 0x1d, 0xf7, 0x63, 0xf7, 0x15, 0x76,\n                                                    0xf7, 0x68, 0xcd, 0x63, 0xb3, 0x12, 0xf8, 0x68,\n                                                    0xcd, 0x5e, 0xb8, 0x13, 0xd0, 0x13, 0xa8, 0xa9,\n                                                    0xf7, 0xee, 0x15, 0xf8, 0x5f, 0xfb, 0x82, 0xb8,\n                                                    0xf7, 0xaa, 0xfc, 0x8c, 0x6, 0xe, 0xf8, 0x27,\n                                                    0x7d, 0xb5, 0x7d, 0xf7, 0x49, 0xf7, 0xcd, 0xf7,\n                                                    0x43, 0x12, 0xb1, 0xc2, 0xf7, 0x43, 0xcb, 0xf7,\n                                                    0x4, 0xce, 0xf7, 0x30, 0xc2, 0x13, 0x7e, 0xf7,\n                                                    0x6f, 0xf7, 0x2c, 0x15, 0xf7, 0x36, 0x9a, 0x6,\n                                                    0x59, 0x90, 0x8c, 0x95, 0xb6, 0x1a, 0xda, 0xbb,\n                                                    0x7, 0x2d, 0xcb, 0xa4, 0x51, 0xab, 0x1b, 0xcb,\n                                                    0x93, 0x6, 0x78, 0x9a, 0x6c, 0xad, 0x71, 0xaf,\n                                                    0x52, 0xd0, 0x18, 0xb8, 0x9a, 0xad, 0xb1, 0xbf,\n                                                    0x1a, 0xca, 0x53, 0xb1, 0x50, 0x1e, 0xfb, 0x45,\n                                                    0x7c, 0x6, 0xa1, 0x87, 0xa6, 0x8b, 0x70, 0x1a,\n                                                    0xfb, 0x8d, 0x7, 0x60, 0x8c, 0x81, 0x59, 0x86,\n                                                    0x1e, 0xf7, 0x5, 0xf7, 0x30, 0x15, 0xf7, 0x46,\n                                                    0xb4, 0x7, 0xb2, 0xab, 0x6d, 0x52, 0x56, 0x77,\n                                                    0x65, 0x5a, 0x1f, 0xfb, 0xe5, 0x92, 0x3e, 0xa,\n                                                    0x1e, 0x13, 0xbe, 0x69, 0xa, 0xe, 0x73, 0xf8,\n                                                    0xb7, 0xc1, 0x1, 0x96, 0xf8, 0xb7, 0x15, 0xf7,\n                                                    0xcb, 0xc1, 0xfb, 0xcb, 0x6, 0xe, 0xb6, 0xf8,\n                                                    0x1a, 0xad, 0xf7, 0x6e, 0xad, 0x1, 0xc4, 0xb2,\n                                                    0xf7, 0x64, 0xb2, 0x3, 0xeb, 0xf8, 0xa9, 0x15,\n                                                    0xc5, 0xb9, 0xbe, 0xc5, 0xc5, 0xb9, 0x58, 0x51,\n                                                    0x51, 0x5d, 0x58, 0x51, 0x51, 0x5d, 0xbe, 0xc5,\n                                                    0x1e, 0x64, 0x16, 0x3b, 0xca, 0x4c, 0xdb, 0xdb,\n                                                    0xca, 0xca, 0xdb, 0xdb, 0x4c, 0xca, 0x3b, 0x3b,\n                                                    0x4c, 0x4c, 0x3b, 0x1e, 0xe, 0xf7, 0x63, 0x8b,\n                                                    0xcd, 0xc3, 0x77, 0xf7, 0x48, 0xcd, 0x54, 0xb6,\n                                                    0xf7, 0x3e, 0x77, 0x12, 0xf7, 0x8d, 0xcd, 0x55,\n                                                    0xb3, 0x13, 0xec, 0xa9, 0x16, 0xf8, 0x8c, 0xb5,\n                                                    0xfc, 0x8c, 0x6, 0x13, 0xea, 0xf7, 0x7b, 0xdb,\n                                                    0x15, 0xb3, 0x6, 0x13, 0xda, 0xf7, 0x3f, 0xf7,\n                                                    0x7d, 0xb6, 0xfb, 0x7d, 0xf7, 0x3e, 0x63, 0xfb,\n                                                    0x3e, 0xfb, 0x7b, 0x60, 0xf7, 0x7b, 0x7, 0xe,\n                                                    0x52, 0xf7, 0xa2, 0xcc, 0xf7, 0xaa, 0xca, 0x1,\n                                                    0xf7, 0x4d, 0xe7, 0x3, 0x90, 0xf7, 0xa2, 0x15,\n                                                    0xf7, 0x92, 0x56, 0xa, 0x67, 0x8b, 0x1d, 0xb4,\n                                                    0x7f, 0x1d, 0x28, 0x20, 0x5, 0xe, 0x52, 0xf7,\n                                                    0x9a, 0x85, 0x1d, 0x13, 0xd0, 0xdf, 0xf8, 0x60,\n                                                    0x77, 0xa, 0x79, 0x7c, 0x96, 0x95, 0x7d, 0x1e,\n                                                    0x94, 0x7e, 0x7e, 0x94, 0x7d, 0x63, 0xa, 0x13,\n                                                    0xe0, 0x4e, 0x1d, 0x92, 0x1d, 0xe8, 0xf8, 0x8f,\n                                                    0x24, 0xa, 0xfb, 0x59, 0x76, 0xf7, 0x64, 0xc9,\n                                                    0xf8, 0x22, 0x77, 0x12, 0xaf, 0xe7, 0x47, 0xab,\n                                                    0x6b, 0xe3, 0xf7, 0x56, 0xe3, 0x13, 0xea, 0xe7,\n                                                    0xc5, 0x15, 0x8d, 0x8d, 0x5, 0x4f, 0xab, 0xc1,\n                                                    0x81, 0xaa, 0x1b, 0xbe, 0xbf, 0xb9, 0xbe, 0xa8,\n                                                    0x1f, 0x8d, 0x6, 0x62, 0x9c, 0x53, 0xbf, 0xaf,\n                                                    0xa7, 0x95, 0xba, 0xad, 0x1e, 0x93, 0x7, 0x77,\n                                                    0x76, 0x7d, 0x83, 0x7c, 0x1b, 0x6b, 0x8b, 0xb5,\n                                                    0xa2, 0x1f, 0xf7, 0xfa, 0x33, 0xfb, 0xd9, 0x7,\n                                                    0x72, 0x7f, 0x60, 0x5b, 0x58, 0x1b, 0x13, 0xe6,\n                                                    0x4f, 0x6f, 0xb1, 0xc1, 0x1f, 0xf7, 0xc6, 0x33,\n                                                    0xfc, 0x20, 0x7, 0x13, 0xf2, 0x4d, 0x73, 0x3c,\n                                                    0x4f, 0x1a, 0x5c, 0x95, 0x73, 0xaf, 0xaf, 0x95,\n                                                    0xa3, 0xba, 0x1e, 0x13, 0xea, 0xc7, 0x6d, 0xda,\n                                                    0x85, 0xcd, 0x1e, 0xe, 0xeb, 0xfb, 0x57, 0x76,\n                                                    0xf9, 0xe7, 0xa6, 0x1, 0xf7, 0x7a, 0xaf, 0xe6,\n                                                    0xaf, 0x3, 0xf7, 0x7a, 0xfb, 0x6c, 0x15, 0xaf,\n                                                    0xf9, 0xe7, 0xe6, 0xfd, 0xe7, 0xaf, 0xf9, 0xe7,\n                                                    0xcb, 0xa6, 0xfb, 0x87, 0x6, 0xfb, 0x20, 0x3d,\n                                                    0x4f, 0xfb, 0x11, 0xfb, 0x11, 0xd9, 0x50, 0xf7,\n                                                    0x30, 0x1f, 0xe, 0x20, 0xf7, 0x70, 0x76, 0xf7,\n                                                    0x3, 0x77, 0x1, 0xd1, 0xf7, 0x3, 0x3, 0xd1,\n                                                    0xf7, 0x91, 0x15, 0x43, 0x1d, 0xe, 0x73, 0xfb,\n                                                    0x6b, 0xf7, 0x2d, 0xc9, 0x77, 0x1, 0xf7, 0x4e,\n                                                    0xd6, 0x3, 0xeb, 0x23, 0x15, 0x92, 0x86, 0x5,\n                                                    0x8f, 0x98, 0x9c, 0x8d, 0x9a, 0x1b, 0xa0, 0x9c,\n                                                    0x81, 0x75, 0x68, 0x70, 0x81, 0x6c, 0x76, 0x74,\n                                                    0x91, 0x91, 0x79, 0x1f, 0x7d, 0x6c, 0x5, 0x83,\n                                                    0xac, 0x9e, 0x83, 0xb5, 0x1b, 0xba, 0xcf, 0xb7,\n                                                    0xb2, 0xb8, 0x68, 0xa4, 0x60, 0x80, 0x7f, 0x8a,\n                                                    0x89, 0x80, 0x1f, 0xa4, 0xcc, 0x5, 0x68, 0x6,\n                                                    0xe, 0x52, 0xf7, 0xa2, 0xa3, 0xf8, 0x12, 0x77,\n                                                    0x1, 0xf7, 0x2, 0xdc, 0x3, 0xc4, 0xf7, 0xa2,\n                                                    0x35, 0xa, 0xfb, 0x86, 0x7, 0x69, 0x73, 0x80,\n                                                    0x6e, 0x89, 0x1e, 0xe, 0x5c, 0xf8, 0x1e, 0xac,\n                                                    0xf7, 0x6c, 0xac, 0x1, 0x91, 0xd4, 0xf7, 0x2c,\n                                                    0xd4, 0x3, 0x91, 0xf8, 0xa8, 0x15, 0x3f, 0xc6,\n                                                    0x4d, 0xdf, 0xf7, 0x1, 0xb9, 0xde, 0xcc, 0xdd,\n                                                    0x4d, 0xbf, 0x36, 0x2a, 0x55, 0x4a, 0x3c, 0x1e,\n                                                    0xd4, 0xa4, 0x15, 0xb7, 0xab, 0xb5, 0xb4, 0xbd,\n                                                    0xa8, 0x67, 0x3f, 0x4c, 0x62, 0x62, 0x6a, 0x47,\n                                                    0x81, 0xe3, 0xb5, 0x1e, 0xe, 0x79, 0xa, 0xf7,\n                                                    0x8b, 0xac, 0x15, 0x58, 0xa, 0x7d, 0x79, 0x5c,\n                                                    0x4d, 0x6a, 0x5d, 0x8, 0x78, 0x70, 0x7c, 0x75,\n                                                    0x86, 0x1a, 0x84, 0x8d, 0x87, 0x93, 0x1e, 0xfb,\n                                                    0x54, 0x16, 0x58, 0xa, 0x7e, 0x79, 0x5e, 0x52,\n                                                    0x6a, 0x5e, 0x8, 0x75, 0x6d, 0x7b, 0x73, 0x8f,\n                                                    0x1d, 0xf8, 0x1d, 0x92, 0x76, 0xae, 0x76, 0xe5,\n                                                    0xc4, 0xf7, 0xf, 0xa3, 0xf8, 0x12, 0x77, 0x12,\n                                                    0xe5, 0xdc, 0xf8, 0x3a, 0xd1, 0x13, 0x7e, 0x53,\n                                                    0xa, 0x13, 0xbe, 0xfc, 0x5b, 0xfb, 0x35, 0x68,\n                                                    0x1d, 0xfc, 0xbe, 0x47, 0x1d, 0xe, 0xf8, 0x1d,\n                                                    0x8b, 0xcc, 0x51, 0x76, 0xf7, 0xb0, 0xa3, 0xbc,\n                                                    0xca, 0xf7, 0xa2, 0x77, 0x12, 0xdf, 0xdc, 0xf8,\n                                                    0x6a, 0xe7, 0x13, 0x7e, 0xf0, 0x7d, 0x68, 0x1d,\n                                                    0xfc, 0x9f, 0x47, 0x1d, 0x13, 0xbe, 0xf8, 0x3d,\n                                                    0xfb, 0xba, 0x15, 0xf7, 0x91, 0x56, 0xa, 0x71,\n                                                    0x8b, 0x1d, 0xaa, 0x7f, 0x1d, 0x29, 0x20, 0x5,\n                                                    0xe, 0xf8, 0x1d, 0x92, 0x76, 0xf3, 0xc4, 0xf7,\n                                                    0x7, 0x85, 0x1d, 0xf7, 0xc2, 0xd1, 0x13, 0xf6,\n                                                    0x53, 0xa, 0xfc, 0x5b, 0xfb, 0x35, 0x68, 0x1d,\n                                                    0xfc, 0x8f, 0xfb, 0x6c, 0x77, 0xa, 0x7a, 0x7c,\n                                                    0x95, 0x95, 0x7d, 0x1e, 0x94, 0x7e, 0x7e, 0x95,\n                                                    0x7c, 0x63, 0xa, 0x13, 0xfa, 0x4e, 0x1d, 0xe2,\n                                                    0xfb, 0x6e, 0xa9, 0xf8, 0xb9, 0xf4, 0x12, 0xa9,\n                                                    0xe7, 0xac, 0xf4, 0x17, 0xf7, 0x5c, 0xf7, 0xba,\n                                                    0x15, 0x4e, 0x64, 0x5a, 0x63, 0x59, 0x1e, 0x5f,\n                                                    0x54, 0x5c, 0x53, 0x40, 0x1a, 0x25, 0xd2, 0x4b,\n                                                    0xf7, 0x4, 0xd0, 0xe9, 0xb6, 0xf0, 0xad, 0x81,\n                                                    0xa8, 0x63, 0x6f, 0x76, 0x73, 0x7a, 0x79, 0x94,\n                                                    0x7f, 0x95, 0x80, 0x1e, 0x94, 0x80, 0x95, 0x81,\n                                                    0x7e, 0x1a, 0x6a, 0x62, 0x6f, 0x61, 0x3e, 0x6a,\n                                                    0xce, 0xc7, 0x1e, 0x13, 0x50, 0xb3, 0x9e, 0xd0,\n                                                    0x9d, 0xb3, 0x1e, 0xa7, 0xcb, 0x5, 0x91, 0x99,\n                                                    0xa3, 0xd0, 0xc6, 0x1a, 0x4d, 0xf7, 0xb, 0x15,\n                                                    0x6e, 0xa2, 0x74, 0xa8, 0x1e, 0xa8, 0xa3, 0xa2,\n                                                    0xa8, 0x94, 0x1d, 0x1f, 0xe, 0xf8, 0x1, 0x99,\n                                                    0x76, 0xf7, 0x73, 0xb4, 0xf8, 0x35, 0x77, 0xf7,\n                                                    0x80, 0x77, 0x1, 0x54, 0xf9, 0x47, 0xfd, 0x2,\n                                                    0xf7, 0x5a, 0x3, 0x20, 0x1d, 0x59, 0xf8, 0x62,\n                                                    0x27, 0x1d, 0x5c, 0x1d, 0xf7, 0x80, 0x77, 0x1,\n                                                    0x4c, 0xf9, 0x47, 0xfb, 0x93, 0xf7, 0x93, 0x3,\n                                                    0x21, 0xa, 0x79, 0x5f, 0x6b, 0x2a, 0x1d, 0xfb,\n                                                    0x33, 0xf8, 0x62, 0x24, 0xa, 0x5c, 0x1d, 0xf7,\n                                                    0x7c, 0x77, 0x1, 0x54, 0xf9, 0x47, 0x3, 0x20,\n                                                    0x1d, 0xfb, 0x85, 0xf8, 0x62, 0x25, 0x1d, 0xe,\n                                                    0x5b, 0x1d, 0xf8, 0x7f, 0xf1, 0x5a, 0xbc, 0x12,\n                                                    0x90, 0xf9, 0x47, 0x13, 0xd0, 0x20, 0xa, 0x13,\n                                                    0x58, 0x77, 0x6, 0xfb, 0x64, 0xfc, 0x7f, 0x78,\n                                                    0x5f, 0x6c, 0x2a, 0x1d, 0xfb, 0x8f, 0xf8, 0x7b,\n                                                    0x83, 0x1d, 0x9b, 0xb3, 0xb0, 0x1b, 0xa4, 0xa1,\n                                                    0x80, 0x80, 0x9f, 0x1f, 0x13, 0xe0, 0x7c, 0xa5,\n                                                    0xa1, 0x7b, 0xa1, 0x1b, 0xd9, 0x9d, 0xcf, 0x65,\n                                                    0xa, 0x63, 0x7a, 0x6f, 0x81, 0x72, 0x1b, 0x7c,\n                                                    0x75, 0x98, 0x98, 0x73, 0x1f, 0x97, 0x75, 0x74,\n                                                    0x97, 0x77, 0x54, 0xa, 0x5c, 0x1d, 0xdd, 0xee,\n                                                    0x12, 0x8b, 0xf7, 0x5a, 0x99, 0xee, 0xef, 0xee,\n                                                    0x13, 0xfa, 0x20, 0x1d, 0x67, 0xf8, 0xa4, 0x15,\n                                                    0x6a, 0x1d, 0x13, 0xf6, 0xfb, 0x5b, 0x16, 0x6a,\n                                                    0x1d, 0xe, 0x5b, 0x1d, 0xf8, 0x6f, 0xf7, 0x3a,\n                                                    0x12, 0xf7, 0xb1, 0xf7, 0x18, 0xfb, 0x15, 0xf7,\n                                                    0x3a, 0x13, 0xe8, 0x20, 0x1d, 0xfb, 0x57, 0xf8,\n                                                    0xb1, 0x67, 0xa, 0xac, 0x16, 0xaf, 0xa9, 0x93,\n                                                    0xa, 0x6d, 0x67, 0x1e, 0x13, 0xf0, 0x67, 0x6d,\n                                                    0xa9, 0xaf, 0x1f, 0xe, 0xf8, 0xa8, 0x8b, 0xb1,\n                                                    0xf7, 0x72, 0xb2, 0xa9, 0xb0, 0xf7, 0x98, 0xaf,\n                                                    0x77, 0x9f, 0x12, 0x8b, 0xf7, 0x5b, 0xf7, 0x5b,\n                                                    0xee, 0xf7, 0x87, 0xa0, 0xab, 0xa2, 0x13, 0xf3,\n                                                    0x0, 0x13, 0xeb, 0x0, 0x8b, 0x4, 0xf7, 0x5b,\n                                                    0x9e, 0x6, 0x7e, 0x8d, 0x49, 0x89, 0xa0, 0xd8,\n                                                    0x93, 0xaa, 0xa5, 0xb7, 0xba, 0xe4, 0x8, 0xf7,\n                                                    0x44, 0xfb, 0x22, 0x6, 0x44, 0x7b, 0x78, 0x53,\n                                                    0x84, 0x1e, 0x7a, 0x89, 0x5, 0x78, 0xf8, 0x92,\n                                                    0x7, 0xb7, 0xf7, 0x3c, 0x5, 0x73, 0x6, 0xfb,\n                                                    0x2, 0x52, 0x68, 0x77, 0x22, 0x1b, 0x3f, 0x6,\n                                                    0x49, 0x88, 0x96, 0xcc, 0x1f, 0xf7, 0x6b, 0xf7,\n                                                    0x25, 0x7, 0xe2, 0x90, 0x5c, 0x56, 0x91, 0x1f,\n                                                    0xa0, 0xf7, 0x7e, 0x76, 0x6, 0x44, 0x85, 0x7c,\n                                                    0x71, 0xfb, 0x3, 0x1b, 0xfb, 0x3, 0xf7, 0x7a,\n                                                    0x6, 0xa8, 0x9b, 0x8c, 0x96, 0x1e, 0xe2, 0x6,\n                                                    0xf7, 0x16, 0xb4, 0x84, 0x29, 0x96, 0x1f, 0xa2,\n                                                    0xf7, 0x21, 0xfc, 0xc8, 0x6, 0x13, 0xf7, 0x80,\n                                                    0x77, 0x7, 0xc8, 0xa8, 0x80, 0x73, 0x83, 0x86,\n                                                    0x81, 0x87, 0x83, 0x1f, 0xfb, 0x89, 0xfc, 0x6e,\n                                                    0x68, 0x46, 0x79, 0x7e, 0x68, 0x85, 0x19, 0xf7,\n                                                    0x83, 0xf7, 0xac, 0x15, 0xf7, 0x30, 0xf7, 0xcd,\n                                                    0x5, 0x8e, 0xfb, 0xcd, 0x6, 0xe, 0xf7, 0xca,\n                                                    0xfb, 0x56, 0x76, 0xf7, 0x5d, 0xb7, 0xf8, 0xf2,\n                                                    0xb3, 0x1, 0xa7, 0xf7, 0x8, 0xf7, 0xa4, 0xd6,\n                                                    0xf5, 0xa2, 0x3, 0xf7, 0xae, 0x8e, 0xa, 0xcc,\n                                                    0x8c, 0xce, 0xa9, 0xbf, 0x1a, 0xc3, 0x54, 0xa2,\n                                                    0x52, 0x7f, 0x1e, 0xa0, 0xc1, 0xf7, 0x32, 0x9a,\n                                                    0xd5, 0xf6, 0x8c, 0x8d, 0x19, 0x79, 0x9d, 0x5,\n                                                    0x77, 0x1d, 0xf7, 0x24, 0xb7, 0xcb, 0xb2, 0xb1,\n                                                    0x1f, 0xb4, 0xb5, 0xc5, 0x9f, 0xbd, 0x1b, 0xf7,\n                                                    0xf, 0xd3, 0x31, 0x22, 0xa4, 0x1f, 0xa2, 0x6,\n                                                    0x82, 0xf7, 0x7f, 0x59, 0x1d, 0x1f, 0x8c, 0x6,\n                                                    0x66, 0x33, 0x92, 0x86, 0x5, 0xab, 0x94, 0xbe,\n                                                    0x8c, 0x86, 0xa, 0x5a, 0x1d, 0xf7, 0x78, 0x77,\n                                                    0x12, 0x7f, 0xa, 0x17, 0x97, 0x16, 0xf8, 0xb0,\n                                                    0x6, 0x13, 0xff, 0x80, 0x23, 0x1d, 0xf7, 0xdd,\n                                                    0xf9, 0x50, 0x27, 0x1d, 0x5a, 0x1d, 0xf7, 0x78,\n                                                    0x77, 0x1, 0x7f, 0xa, 0x3, 0xf7, 0x7c, 0xf9,\n                                                    0x63, 0x21, 0x1d, 0xfc, 0x3, 0xfd, 0xf7, 0x2c,\n                                                    0xa, 0x5a, 0x1d, 0xf7, 0x74, 0x77, 0x1, 0x7f,\n                                                    0xa, 0x3, 0xf7, 0x2a, 0x38, 0xa, 0xfb, 0x9a,\n                                                    0xfe, 0xa, 0x2c, 0xa, 0x7b, 0xa, 0xf7, 0xb5,\n                                                    0xb4, 0xf7, 0x94, 0xb1, 0xd3, 0xf0, 0x12, 0xee,\n                                                    0xf1, 0x5d, 0xf0, 0xee, 0xf0, 0x94, 0xa2, 0x13,\n                                                    0xfa, 0x97, 0x16, 0xf8, 0xb0, 0x6, 0x36, 0x1d,\n                                                    0x13, 0x7b, 0x26, 0xa, 0x13, 0x16, 0x3e, 0x7a,\n                                                    0xa, 0x13, 0xf6, 0xf7, 0x23, 0xf9, 0x91, 0x15,\n                                                    0x6c, 0x1d, 0xf7, 0x5c, 0x16, 0x6c, 0x1d, 0xe,\n                                                    0x73, 0x83, 0xa, 0xf7, 0x8c, 0x42, 0xa, 0xf7,\n                                                    0x4c, 0xf9, 0x50, 0x2d, 0xa, 0x89, 0x81, 0x1d,\n                                                    0x9d, 0x57, 0xa, 0x73, 0x83, 0xa, 0xf7, 0x8c,\n                                                    0x77, 0x1, 0xf7, 0x7, 0xf1, 0x3, 0xe8, 0xf9,\n                                                    0x63, 0x21, 0x1d, 0xfb, 0x72, 0xfd, 0xf7, 0x15,\n                                                    0xf7, 0xbf, 0x9e, 0x6, 0x41, 0x8d, 0x71, 0x60,\n                                                    0x1d, 0xa6, 0x9c, 0xd4, 0x8e, 0x1e, 0x9e, 0xfb,\n                                                    0xbf, 0x78, 0x7, 0x49, 0xa, 0xe, 0x73, 0x83,\n                                                    0xa, 0xf7, 0x88, 0x77, 0x1, 0xf7, 0x7, 0xf1,\n                                                    0x3, 0x96, 0x38, 0xa, 0xfb, 0x10, 0xfe, 0xa,\n                                                    0x15, 0xf7, 0xcb, 0x9e, 0x6, 0x41, 0x8d, 0x6c,\n                                                    0x60, 0x1d, 0xab, 0x9c, 0xd4, 0x8e, 0x1e, 0x9e,\n                                                    0xfb, 0xcb, 0x78, 0x7, 0xde, 0x87, 0xa0, 0x75,\n                                                    0x41, 0x89, 0x1d, 0x44, 0x78, 0x70, 0x36, 0x89,\n                                                    0x1e, 0xe, 0x73, 0xa0, 0x76, 0xf9, 0x17, 0x97,\n                                                    0xa, 0x12, 0xad, 0xed, 0x7a, 0xf1, 0x13, 0xd0,\n                                                    0x9d, 0x16, 0xf7, 0xbd, 0x9e, 0x6, 0x13, 0xc8,\n                                                    0x59, 0xa, 0x13, 0xb0, 0x9e, 0xfb, 0xbd, 0x7,\n                                                    0x13, 0xd0, 0x78, 0x7, 0x13, 0xc8, 0x49, 0xa,\n                                                    0xf9, 0x91, 0x4, 0x6d, 0x1d, 0xf7, 0x5b, 0x16,\n                                                    0x6d, 0x1d, 0xe, 0xf8, 0x1, 0x8b, 0xb0, 0xf7,\n                                                    0xaa, 0xb7, 0xf7, 0x9e, 0xb0, 0x1, 0xf3, 0xf1,\n                                                    0xf8, 0x6, 0x58, 0x1d, 0x96, 0x71, 0x41, 0x1f,\n                                                    0xfb, 0x4c, 0x34, 0x5f, 0xe2, 0xfb, 0x58, 0x7,\n                                                    0x45, 0x7f, 0x6d, 0x3f, 0x1e, 0xf7, 0x52, 0xf7,\n                                                    0xbc, 0x15, 0xf7, 0x26, 0xb7, 0xfb, 0x26, 0xf7,\n                                                    0x4b, 0x6, 0xbe, 0x8b, 0xab, 0x8b, 0xa, 0xfb,\n                                                    0xb7, 0xfb, 0x8a, 0x8b, 0x4b, 0x5b, 0x7f, 0x9f,\n                                                    0xc5, 0x1e, 0xe, 0xf8, 0x1, 0x95, 0x76, 0xab,\n                                                    0x76, 0xf7, 0x49, 0x77, 0xf8, 0x89, 0x77, 0xf1,\n                                                    0xf5, 0x12, 0xf7, 0x1, 0xb7, 0xf8, 0x33, 0xb7,\n                                                    0x13, 0x7e, 0x5f, 0xa, 0xf8, 0x10, 0x8d, 0x7,\n                                                    0x13, 0xbe, 0x3a, 0xa, 0x13, 0x7e, 0xf7, 0x4c,\n                                                    0xf9, 0x69, 0x4c, 0xa, 0x9d, 0x67, 0x1f, 0x97,\n                                                    0x74, 0x75, 0x91, 0x76, 0x54, 0xa, 0x30, 0x1d,\n                                                    0xf7, 0x8d, 0xf8, 0x10, 0x27, 0x1d, 0x30, 0x1d,\n                                                    0xf7, 0x20, 0xf8, 0x10, 0x24, 0xa, 0x5b, 0xa,\n                                                    0xf7, 0x66, 0x77, 0x74, 0xa, 0xf7, 0x62, 0x38,\n                                                    0xa, 0xfb, 0xbc, 0xfc, 0xb8, 0x29, 0x1d, 0xe,\n                                                    0x5b, 0xa, 0xcf, 0xf5, 0x85, 0xa, 0xf7, 0xde,\n                                                    0x70, 0xa, 0xfb, 0x17, 0x69, 0x1d, 0xf7, 0x17,\n                                                    0x61, 0x1d, 0xf7, 0x8, 0x61, 0xa, 0xfb, 0x8,\n                                                    0x44, 0x1d, 0xdc, 0xf1, 0xf1, 0xf7, 0x3, 0x3a,\n                                                    0x71, 0x1d, 0x32, 0x72, 0x1d, 0xe4, 0xf7, 0x70,\n                                                    0x1e, 0xbb, 0xf8, 0x31, 0x4c, 0xa, 0x91, 0x7f,\n                                                    0x1f, 0xa3, 0x5c, 0x75, 0x91, 0x76, 0x54, 0xa,\n                                                    0x5b, 0xa, 0xc6, 0xef, 0x7b, 0x1d, 0xca, 0xef,\n                                                    0xef, 0xef, 0xca, 0x9a, 0xa, 0xad, 0xf7, 0xe6,\n                                                    0x70, 0xa, 0xfb, 0x1f, 0x69, 0x1d, 0xf7, 0x10,\n                                                    0x61, 0x1d, 0xf7, 0xf, 0x34, 0xa, 0x33, 0x71,\n                                                    0x1d, 0x39, 0x5e, 0xa, 0xca, 0xf8, 0x52, 0x15,\n                                                    0x30, 0xa, 0xf7, 0x5c, 0x16, 0x30, 0xa, 0xe,\n                                                    0xf7, 0x63, 0xa8, 0x76, 0xac, 0x76, 0xf8, 0x71,\n                                                    0x77, 0x12, 0x13, 0xa0, 0xc5, 0xc3, 0x15, 0xa6,\n                                                    0x6f, 0xf7, 0x59, 0xf7, 0x59, 0x5, 0x13, 0x60,\n                                                    0xf7, 0x61, 0xfb, 0x61, 0xa7, 0xa6, 0xfb, 0x61,\n                                                    0xf7, 0x62, 0xf7, 0x59, 0xf7, 0x58, 0x6f, 0xa7,\n                                                    0xfb, 0x59, 0xfb, 0x59, 0xfb, 0x58, 0xf7, 0x59,\n                                                    0x70, 0x6e, 0xf7, 0x57, 0xfb, 0x57, 0x5, 0xe,\n                                                    0xf8, 0x1, 0x50, 0x76, 0xcd, 0xaf, 0xf8, 0xfe,\n                                                    0xaf, 0xc5, 0x77, 0x74, 0xa, 0xf7, 0x6f, 0xe3,\n                                                    0x15, 0xf7, 0xc8, 0xf8, 0x58, 0x5, 0xa8, 0x5a,\n                                                    0x9d, 0x41, 0x2e, 0x1a, 0xfb, 0x70, 0x25, 0x39,\n                                                    0xfb, 0x3, 0x57, 0x57, 0x9f, 0xb9, 0x65, 0x1e,\n                                                    0x72, 0xae, 0x15, 0x6e, 0xbc, 0x7a, 0xd9, 0xe6,\n                                                    0x1a, 0xf7, 0x78, 0xf7, 0x3, 0xd2, 0xf1, 0xbc,\n                                                    0xbf, 0x78, 0x5d, 0xb3, 0x1e, 0xfc, 0x52, 0xfd,\n                                                    0x23, 0x15, 0xbc, 0x6, 0xda, 0xf7, 0x8, 0x5,\n                                                    0x6a, 0xbe, 0xc8, 0x7a, 0xcc, 0x1b, 0xf7, 0x49,\n                                                    0xf7, 0x26, 0xf7, 0x10, 0xf7, 0x69, 0xf7, 0x11,\n                                                    0x5b, 0xed, 0x45, 0xc5, 0x1f, 0xe3, 0xf7, 0x16,\n                                                    0x5, 0x5a, 0x6, 0x43, 0x20, 0x5, 0xac, 0x56,\n                                                    0x4e, 0x9b, 0x4d, 0x1b, 0xfb, 0x38, 0xfb, 0x37,\n                                                    0x21, 0xfb, 0x7a, 0xfb, 0xb, 0xb8, 0x24, 0xd3,\n                                                    0x50, 0x1f, 0xe, 0x7c, 0xa, 0xf7, 0xfd, 0xb7,\n                                                    0x3, 0x99, 0xf9, 0x17, 0x15, 0xd7, 0x99, 0x71,\n                                                    0x41, 0x1f, 0xfb, 0xc6, 0x7, 0x4a, 0x8b, 0xfb,\n                                                    0x4e, 0xf7, 0x8c, 0xf7, 0x97, 0x8b, 0xf7, 0x47,\n                                                    0xe4, 0x1e, 0xf7, 0x8f, 0x7, 0xf4, 0x9c, 0xab,\n                                                    0xd8, 0x8c, 0x1e, 0x9e, 0xfb, 0x7c, 0x78, 0x7,\n                                                    0xd1, 0x8a, 0xa3, 0x6d, 0x20, 0x1a, 0xfb, 0x98,\n                                                    0x7, 0xfb, 0x11, 0x4f, 0x31, 0x98, 0x1d, 0xf7,\n                                                    0x22, 0xc8, 0x1e, 0xf7, 0xca, 0x7, 0xd2, 0x97,\n                                                    0xa7, 0xda, 0x8c, 0x1e, 0x88, 0xa, 0xf8, 0x13,\n                                                    0xc4, 0x3a, 0x1d, 0x73, 0x87, 0x8b, 0x7b, 0x1b,\n                                                    0x6c, 0x8a, 0x81, 0x1d, 0x9c, 0x57, 0xa, 0x7c,\n                                                    0xa, 0xf7, 0xf6, 0xb7, 0x3, 0xf8, 0x4, 0xf9,\n                                                    0x63, 0x21, 0x1d, 0xfc, 0x89, 0xfb, 0x74, 0x32,\n                                                    0x1d, 0x6e, 0xa, 0xf7, 0x88, 0x77, 0x1, 0xf3,\n                                                    0xf1, 0xf7, 0xf6, 0xb7, 0x3, 0xf7, 0x62, 0x38,\n                                                    0xa, 0xfb, 0xd0, 0xfb, 0x87, 0x32, 0x1d, 0xf8,\n                                                    0x1, 0x7d, 0xb7, 0xf8, 0xf9, 0x97, 0xa, 0xe9,\n                                                    0xee, 0x12, 0xf7, 0x13, 0xf1, 0x7a, 0xee, 0xf0,\n                                                    0xee, 0xb4, 0xb7, 0x13, 0xcb, 0x99, 0xf9, 0x17,\n                                                    0x2e, 0x1d, 0x13, 0xbb, 0x9e, 0xfb, 0x7c, 0x7,\n                                                    0x13, 0xcb, 0x50, 0x1d, 0x4f, 0x3f, 0xfb, 0x13,\n                                                    0x47, 0xa, 0x13, 0xbb, 0x88, 0xa, 0x13, 0xcb,\n                                                    0x13, 0xb7, 0xf7, 0x5a, 0xf7, 0xf, 0x4a, 0x1d,\n                                                    0xf8, 0x1, 0x83, 0xa, 0xf7, 0x8c, 0x72, 0xa,\n                                                    0xa8, 0xde, 0x1a, 0xf7, 0x3f, 0x7e, 0x1d, 0x4b,\n                                                    0x1d, 0x5e, 0x1d, 0xf7, 0x6, 0xf9, 0x50, 0x24,\n                                                    0xa, 0xf7, 0x5b, 0x93, 0x9e, 0xf7, 0x25, 0xb3,\n                                                    0xf7, 0x95, 0xb1, 0xf7, 0x34, 0x77, 0x6d, 0xa,\n                                                    0x98, 0xe9, 0x1a, 0xac, 0x66, 0x1d, 0xf7, 0x6,\n                                                    0x21, 0xcd, 0xfb, 0x2e, 0x1e, 0x3b, 0x6, 0x88,\n                                                    0xe7, 0x9a, 0x97, 0xda, 0x92, 0x8, 0x9e, 0xfb,\n                                                    0xa9, 0x78, 0x7, 0xd4, 0x84, 0x96, 0x7f, 0x44,\n                                                    0x1a, 0xfc, 0x3b, 0x8d, 0xa, 0xf7, 0x4a, 0x15,\n                                                    0xf7, 0x98, 0x7, 0xac, 0x96, 0x8b, 0xa9, 0xb7,\n                                                    0xf7, 0x26, 0x8a, 0x74, 0x1d, 0x82, 0xa8, 0x77,\n                                                    0x9f, 0xf9, 0x10, 0xa6, 0x12, 0xd4, 0xdf, 0xf7,\n                                                    0x45, 0xe2, 0x5c, 0xe9, 0x13, 0x78, 0x97, 0x16,\n                                                    0xf7, 0x25, 0xf8, 0xb9, 0x6, 0x9b, 0x8d, 0xe6,\n                                                    0xe2, 0xbb, 0xb3, 0x5f, 0x2d, 0x1e, 0xfb, 0x38,\n                                                    0xfb, 0x10, 0xc1, 0x69, 0x1a, 0x6e, 0xc4, 0xa5,\n                                                    0xbb, 0x65, 0x1e, 0x13, 0xb4, 0x9c, 0x7d, 0xb5,\n                                                    0x60, 0x23, 0x1a, 0x38, 0x82, 0x46, 0x54, 0x7a,\n                                                    0x85, 0x92, 0x99, 0x87, 0x1e, 0x89, 0x93, 0x8a,\n                                                    0x96, 0x8a, 0x97, 0x8, 0x9f, 0x89, 0x7c, 0x9f,\n                                                    0x72, 0x1b, 0x71, 0x78, 0x77, 0x6e, 0x75, 0x9c,\n                                                    0x59, 0xdd, 0xf7, 0x1, 0xcf, 0xef, 0xe6, 0xf7,\n                                                    0x21, 0xfb, 0x4, 0xbe, 0x46, 0x8d, 0x1f, 0x8d,\n                                                    0x7, 0x13, 0x78, 0xf7, 0x3, 0xbb, 0xa2, 0xb4,\n                                                    0xd0, 0x1a, 0xf6, 0x2c, 0xb3, 0x43, 0xfb, 0x48,\n                                                    0x8a, 0xfb, 0x3a, 0x4c, 0x1e, 0xfb, 0xfc, 0x7,\n                                                    0x4a, 0x73, 0x80, 0x66, 0x88, 0x1e, 0xe, 0x4f,\n                                                    0x1d, 0xf7, 0x6e, 0x77, 0x12, 0xb0, 0xe3, 0x39,\n                                                    0xe3, 0xf7, 0x30, 0xdc, 0x13, 0xda, 0x34, 0x1d,\n                                                    0x1e, 0x13, 0xd6, 0xfb, 0x8, 0x67, 0x44, 0x63,\n                                                    0x7b, 0x8c, 0x6f, 0xaa, 0xa5, 0xa4, 0x97, 0xa0,\n                                                    0x1f, 0x94, 0x80, 0xa4, 0x9a, 0x1a, 0x13, 0xba,\n                                                    0xaa, 0xb1, 0x37, 0xa, 0xcb, 0x89, 0xa, 0xbe,\n                                                    0xab, 0xa4, 0x1e, 0x6d, 0xf8, 0x46, 0x27, 0x1d,\n                                                    0x4f, 0x1d, 0xf7, 0x6e, 0x77, 0x1, 0xaa, 0xe3,\n                                                    0xf7, 0x3c, 0xdc, 0x3, 0x34, 0x1d, 0xfb, 0x8,\n                                                    0x4f, 0x44, 0x63, 0x7b, 0xa4, 0x6f, 0xaa, 0xa5,\n                                                    0x91, 0xa1, 0xa0, 0x1e, 0xb2, 0x7, 0xaa, 0xb9,\n                                                    0x37, 0xa, 0xb3, 0x66, 0xc1, 0xe9, 0xb1, 0xbe,\n                                                    0xab, 0xa4, 0x1e, 0xfb, 0x1f, 0xf8, 0x46, 0x15,\n                                                    0xf7, 0x27, 0xf7, 0x28, 0x5, 0xa2, 0xa2, 0x91,\n                                                    0x8b, 0x9a, 0x1b, 0xab, 0x8c, 0x6f, 0x87, 0x74,\n                                                    0x78, 0x7f, 0x80, 0x84, 0x1f, 0xfb, 0x2e, 0x2a,\n                                                    0x5, 0xe, 0x4f, 0x1d, 0xf7, 0x6a, 0x77, 0x84,\n                                                    0xa, 0xce, 0xf8, 0x8f, 0x25, 0x1d, 0xeb, 0xfc,\n                                                    0x2a, 0x29, 0xa, 0x4f, 0x1d, 0xd3, 0xf5, 0x84,\n                                                    0xa, 0xc4, 0xf8, 0xa8, 0x83, 0x1d, 0x96, 0xaf,\n                                                    0xb1, 0x1b, 0x97, 0x98, 0x84, 0x45, 0x1d, 0x74,\n                                                    0x94, 0x91, 0x7f, 0x1f, 0xa3, 0x5c, 0x77, 0x96,\n                                                    0x76, 0x1b, 0x48, 0x6d, 0x4d, 0x5f, 0x83, 0x1f,\n                                                    0xf7, 0x7a, 0xfb, 0x9c, 0x29, 0xa, 0x4f, 0x1d,\n                                                    0xcb, 0xee, 0x12, 0xb0, 0xe3, 0x46, 0xe3, 0x44,\n                                                    0xee, 0xf0, 0xea, 0x3a, 0xdc, 0x13, 0xd8, 0x80,\n                                                    0xf7, 0xb3, 0xf7, 0xa0, 0x28, 0x1d, 0x13, 0xd5,\n                                                    0x0, 0x3e, 0x1d, 0x13, 0xb8, 0x80, 0x3c, 0x1d,\n                                                    0x13, 0xd3, 0x0, 0xfb, 0x6b, 0xf8, 0x88, 0x4a,\n                                                    0x1d, 0xe2, 0x81, 0xc5, 0xf7, 0x95, 0xf7, 0x2b,\n                                                    0x77, 0xa3, 0xcd, 0xad, 0xf7, 0x17, 0xad, 0x12,\n                                                    0xc3, 0xe3, 0x64, 0xe3, 0x3d, 0xad, 0xf7, 0x7,\n                                                    0xdc, 0x98, 0xae, 0x13, 0xda, 0x40, 0xf7, 0xb3,\n                                                    0xf7, 0xa0, 0x24, 0x1d, 0x13, 0xdc, 0x80, 0x40,\n                                                    0xa, 0xeb, 0xfb, 0x29, 0xfb, 0x8, 0x5c, 0x48,\n                                                    0x57, 0x1d, 0x1e, 0x94, 0x86, 0x9a, 0x9a, 0x1a,\n                                                    0x13, 0xba, 0x40, 0xaa, 0xb1, 0x99, 0xac, 0xa9,\n                                                    0xba, 0x57, 0x43, 0x1e, 0x7b, 0x4f, 0xa, 0xbf,\n                                                    0x89, 0xa, 0xbd, 0xac, 0xb0, 0x1e, 0x13, 0xd9,\n                                                    0x40, 0xfb, 0x39, 0xf8, 0xae, 0x67, 0xa, 0xad,\n                                                    0x16, 0xaf, 0xa8, 0x93, 0xa, 0x6e, 0x67, 0x67,\n                                                    0x6e, 0xa8, 0xaf, 0x1e, 0xe, 0xf7, 0xca, 0x81,\n                                                    0xbb, 0x5b, 0xce, 0xf7, 0x70, 0xa9, 0x88, 0xf7,\n                                                    0x30, 0x73, 0xa3, 0x12, 0xb1, 0xe2, 0x4a, 0xe4,\n                                                    0xf7, 0x10, 0xdc, 0x13, 0x6d, 0xf7, 0xc6, 0xd4,\n                                                    0x15, 0x71, 0x9c, 0xa9, 0x52, 0xe1, 0x1b, 0xb1,\n                                                    0xe9, 0x98, 0xf7, 0x26, 0xc8, 0x1f, 0x7f, 0x90,\n                                                    0x5, 0x56, 0x6a, 0x59, 0x5f, 0x54, 0x1b, 0xfb,\n                                                    0x14, 0x8b, 0xf7, 0xd, 0xee, 0x1f, 0xf7, 0x9a,\n                                                    0x6, 0x13, 0x93, 0xbd, 0x7c, 0xf7, 0x19, 0xfb,\n                                                    0x22, 0x58, 0x6d, 0x7f, 0x6a, 0x62, 0x1e, 0xa0,\n                                                    0x73, 0x6e, 0xa3, 0x49, 0x1b, 0x35, 0x43, 0x5e,\n                                                    0x4d, 0x65, 0xa4, 0x80, 0x9c, 0xba, 0x8b, 0xb5,\n                                                    0xaf, 0x1f, 0x13, 0xad, 0xa8, 0x9e, 0xa4, 0xb8,\n                                                    0xcd, 0x89, 0x57, 0x24, 0x87, 0x1e, 0xfb, 0x35,\n                                                    0x4a, 0x41, 0x6d, 0x31, 0x1a, 0x61, 0xab, 0x4b,\n                                                    0xde, 0xee, 0x92, 0xb7, 0xb2, 0xba, 0x1e, 0x7e,\n                                                    0xa4, 0x15, 0x7d, 0x52, 0x5d, 0x64, 0x54, 0x7a,\n                                                    0xc2, 0xa5, 0xca, 0xa4, 0xa7, 0xf7, 0xf, 0xb6,\n                                                    0x1e, 0x8c, 0x57, 0x5, 0x8c, 0x44, 0x9d, 0x72,\n                                                    0x84, 0x1a, 0xc9, 0xf7, 0x65, 0x15, 0xb5, 0x8d,\n                                                    0x8f, 0xdd, 0xde, 0x1b, 0xd3, 0x90, 0x37, 0x63,\n                                                    0x1f, 0xe, 0xe2, 0xfb, 0x56, 0x76, 0xf7, 0x61,\n                                                    0xd3, 0xf7, 0x91, 0xf7, 0x25, 0x6e, 0xa8, 0x12,\n                                                    0xa4, 0xd8, 0xf7, 0x31, 0xd6, 0x13, 0xdc, 0xf7,\n                                                    0x11, 0x8e, 0xa, 0xcb, 0xcf, 0xaa, 0xbf, 0xc3,\n                                                    0x54, 0xa2, 0x52, 0x7f, 0x1f, 0xa1, 0xc5, 0xcd,\n                                                    0x95, 0xc2, 0xb8, 0xba, 0xee, 0x19, 0x63, 0x1d,\n                                                    0x90, 0x79, 0x6d, 0x93, 0x1f, 0x13, 0xec, 0x5f,\n                                                    0x97, 0x9c, 0x73, 0xa5, 0x1b, 0xa9, 0x9b, 0xa0,\n                                                    0xa2, 0xca, 0x33, 0xb1, 0x4e, 0xfb, 0x0, 0xfb,\n                                                    0x8, 0x38, 0xfb, 0x38, 0xfb, 0x30, 0xf3, 0x4a,\n                                                    0xda, 0x89, 0x1f, 0x65, 0x2e, 0x92, 0x86, 0x5,\n                                                    0xab, 0x94, 0xbd, 0x8d, 0x86, 0xa, 0xe2, 0x81,\n                                                    0xd0, 0xf7, 0x4f, 0xab, 0xf7, 0xd, 0xaf, 0xf7,\n                                                    0x87, 0x77, 0x12, 0xa3, 0xd0, 0xf7, 0x68, 0xf1,\n                                                    0x17, 0x26, 0x1d, 0x13, 0x7c, 0x3d, 0x1d, 0x5e,\n                                                    0xf7, 0x64, 0x27, 0x1d, 0x87, 0x1d, 0xf7, 0x11,\n                                                    0xaf, 0xf7, 0x6e, 0x77, 0x1, 0xac, 0xd0, 0xf7,\n                                                    0x46, 0xf1, 0x3, 0x28, 0xa, 0xfb, 0x6, 0xf7,\n                                                    0x64, 0x24, 0xa, 0x87, 0x1d, 0xf7, 0x11, 0xaf,\n                                                    0xf7, 0x6a, 0x77, 0x1, 0xa4, 0xd0, 0xf7, 0x65,\n                                                    0xf1, 0x3, 0x28, 0xa, 0xfb, 0x80, 0xf7, 0x64,\n                                                    0x25, 0x1d, 0xe, 0xe2, 0x81, 0xd0, 0xf7, 0x58,\n                                                    0xab, 0xf7, 0x1d, 0xaf, 0xca, 0xef, 0x12, 0xa4,\n                                                    0xd0, 0x77, 0xed, 0xf0, 0xed, 0x13, 0xfa, 0x28,\n                                                    0xa, 0x13, 0xf6, 0xfb, 0x79, 0xf7, 0xa6, 0x15,\n                                                    0x4b, 0xa, 0x8f, 0xa, 0xf9, 0x3a, 0x27, 0xa,\n                                                    0xf7, 0x33, 0xf8, 0x80, 0x27, 0x1d, 0x8f, 0xa,\n                                                    0xf9, 0x3a, 0x27, 0xa, 0xbd, 0xf8, 0x80, 0x24,\n                                                    0xa, 0x8f, 0xa, 0xf9, 0x36, 0x27, 0xa, 0x6b,\n                                                    0xf8, 0x80, 0x25, 0x1d, 0xe, 0x8f, 0xa, 0xf8,\n                                                    0xa0, 0xee, 0x1, 0x82, 0xed, 0x91, 0xdf, 0x96,\n                                                    0xed, 0x23, 0xa, 0x72, 0xf8, 0xc2, 0x15, 0x6b,\n                                                    0xa, 0xf7, 0x5b, 0x16, 0x6b, 0xa, 0xe, 0x71,\n                                                    0xa, 0xf7, 0x76, 0x77, 0x1, 0xa8, 0xe5, 0xf7,\n                                                    0x9a, 0xe5, 0x3, 0xf7, 0xb, 0xf7, 0xaa, 0x15,\n                                                    0xf1, 0xc3, 0xbf, 0xca, 0xd4, 0xd1, 0x3d, 0xfb,\n                                                    0x2f, 0xfb, 0x23, 0x48, 0x65, 0x58, 0xfb, 0xc,\n                                                    0x73, 0xf7, 0x4c, 0xd7, 0x1e, 0xf7, 0x89, 0xf7,\n                                                    0x11, 0x15, 0xb4, 0x60, 0x69, 0x9b, 0x61, 0x1b,\n                                                    0xfb, 0x19, 0x38, 0xfb, 0x1, 0xfb, 0x17, 0xfb,\n                                                    0x13, 0xe6, 0x24, 0x65, 0x1d, 0xf7, 0x32, 0xf7,\n                                                    0x1c, 0xf7, 0xb, 0x5e, 0xf7, 0xd, 0x2e, 0xd9,\n                                                    0x1f, 0xe6, 0xbb, 0x6a, 0xa9, 0x2c, 0x59, 0x62,\n                                                    0xa5, 0x57, 0xa5, 0x50, 0x8f, 0x19, 0x61, 0x75,\n                                                    0xbb, 0x84, 0xb8, 0x6d, 0xb3, 0x6e, 0x19, 0xfb,\n                                                    0xd, 0x4b, 0xac, 0x6d, 0xf7, 0xf, 0xcc, 0xbe,\n                                                    0x5a, 0xae, 0x54, 0x95, 0x4f, 0x19, 0xe, 0xa0,\n                                                    0x76, 0xf8, 0x29, 0xc2, 0xd6, 0xf2, 0x73, 0xa,\n                                                    0xb2, 0xb6, 0x1a, 0xf7, 0x8c, 0x7e, 0xa, 0xfb,\n                                                    0x5b, 0x7, 0x3f, 0x71, 0x7c, 0x82, 0x1d, 0xa7,\n                                                    0xce, 0x1a, 0xf7, 0x58, 0x46, 0xa, 0xd0, 0xf8,\n                                                    0x99, 0x15, 0xa8, 0x6, 0xb0, 0x8e, 0xac, 0x9e,\n                                                    0xa3, 0x1b, 0xa6, 0x9f, 0x79, 0x82, 0xa0, 0x1f,\n                                                    0x7e, 0xaa, 0xa2, 0x7e, 0x9e, 0x1b, 0xd9, 0x98,\n                                                    0xd0, 0x65, 0xa, 0x5e, 0x83, 0x7a, 0x80, 0x75,\n                                                    0x1b, 0x77, 0x72, 0x98, 0x95, 0x74, 0x1f, 0x9b,\n                                                    0x66, 0x76, 0x9c, 0x74, 0x54, 0xa, 0x71, 0xa,\n                                                    0xf7, 0x6e, 0x77, 0x1, 0xb9, 0xe5, 0xf7, 0x8a,\n                                                    0xe5, 0x3, 0x2f, 0x1d, 0xa6, 0x15, 0xf3, 0xc2,\n                                                    0xd4, 0xca, 0xe7, 0xbe, 0x34, 0x80, 0xa, 0x46,\n                                                    0x4f, 0x58, 0xfb, 0xc, 0x76, 0xf7, 0x37, 0xd5,\n                                                    0x1e, 0xf7, 0x3b, 0xf7, 0x90, 0x3b, 0x1d, 0x9e,\n                                                    0x74, 0x86, 0x94, 0xa, 0x9c, 0x57, 0xa, 0x71,\n                                                    0xa, 0xf7, 0x6e, 0x77, 0x1, 0xa8, 0xe5, 0xf7,\n                                                    0x99, 0xe5, 0x3, 0xa8, 0xf7, 0x7b, 0x15, 0xfb,\n                                                    0x1b, 0xe5, 0x21, 0x65, 0x1d, 0xf7, 0x1c, 0xee,\n                                                    0xf7, 0x25, 0x2d, 0xe5, 0xfb, 0x17, 0xfb, 0x1a,\n                                                    0x39, 0x21, 0xfb, 0xf, 0x1e, 0xe5, 0xad, 0x15,\n                                                    0xf3, 0xc9, 0xca, 0xca, 0xe7, 0xb7, 0x30, 0x80,\n                                                    0xa, 0x3b, 0x53, 0x58, 0xfb, 0xc, 0x81, 0xf7,\n                                                    0x41, 0xd5, 0x1e, 0xc5, 0xf7, 0x86, 0x24, 0xa,\n                                                    0x71, 0xa, 0xf7, 0x6a, 0x77, 0x4c, 0x1d, 0xa9,\n                                                    0x15, 0xf3, 0xc2, 0xd1, 0xca, 0xe7, 0xbe, 0x3a,\n                                                    0x80, 0xa, 0x44, 0x49, 0x58, 0xfb, 0xc, 0x78,\n                                                    0xf7, 0x3a, 0xd5, 0x1e, 0x73, 0xf7, 0x8d, 0x25,\n                                                    0x1d, 0xe, 0x71, 0xa, 0xd3, 0xf5, 0x4c, 0x1d,\n                                                    0xbb, 0x15, 0xf3, 0xc2, 0xbf, 0xca, 0xe7, 0xbe,\n                                                    0xfb, 0x1, 0x80, 0xa, 0x48, 0x65, 0x58, 0xfb,\n                                                    0xc, 0x74, 0xf7, 0x4c, 0xd5, 0x1e, 0x69, 0xf7,\n                                                    0x94, 0x15, 0xa8, 0x6, 0x91, 0x9c, 0x9b, 0xbb,\n                                                    0xaf, 0x7e, 0x8, 0x71, 0xd1, 0xb0, 0x71, 0x52,\n                                                    0x1d, 0x7a, 0x63, 0x7c, 0x7a, 0x71, 0x92, 0x8,\n                                                    0x9b, 0x51, 0x50, 0xad, 0x76, 0x54, 0xa, 0x71,\n                                                    0xa, 0xca, 0xef, 0x12, 0xa8, 0xe5, 0x79, 0xef,\n                                                    0xee, 0xef, 0x77, 0xe5, 0x13, 0xf2, 0x2f, 0x1d,\n                                                    0xa4, 0x15, 0xf3, 0xc2, 0xd6, 0xca, 0xe7, 0xbe,\n                                                    0x3d, 0x80, 0xa, 0x48, 0x46, 0x58, 0xfb, 0xc,\n                                                    0x74, 0xf7, 0x35, 0xd5, 0x1e, 0x13, 0xec, 0x79,\n                                                    0xf7, 0xd4, 0x15, 0x30, 0xa, 0xf7, 0x5b, 0x16,\n                                                    0x30, 0xa, 0xe, 0xf7, 0x63, 0x96, 0x76, 0xe1,\n                                                    0x77, 0xb9, 0xf7, 0xa, 0x8b, 0xcd, 0x55, 0xb6,\n                                                    0xf7, 0x85, 0x77, 0x12, 0xf7, 0x76, 0xf7, 0x5,\n                                                    0x27, 0xe1, 0x13, 0xee, 0xa9, 0xf7, 0x7c, 0x15,\n                                                    0xf8, 0x8c, 0xb6, 0xfc, 0x8c, 0x6, 0xf7, 0x90,\n                                                    0xfb, 0xb1, 0x15, 0x13, 0xf5, 0x6c, 0xa, 0xf8,\n                                                    0x4c, 0x4, 0x6c, 0xa, 0xe, 0x30, 0x76, 0xf1,\n                                                    0xa7, 0xf8, 0x32, 0xa7, 0xe6, 0x77, 0x1, 0xa8,\n                                                    0xe5, 0xf7, 0x99, 0xe5, 0x3, 0xf7, 0x47, 0xc7,\n                                                    0x15, 0xf7, 0x35, 0xf7, 0xc6, 0x5, 0xa5, 0x60,\n                                                    0x99, 0x4f, 0x4b, 0x1a, 0xfb, 0x23, 0x48, 0x65,\n                                                    0x58, 0x67, 0x70, 0x9b, 0xa5, 0x77, 0x1e, 0xfb,\n                                                    0x13, 0xfb, 0x40, 0x15, 0xb0, 0x6, 0xcc, 0xf7,\n                                                    0xf, 0x5, 0x7d, 0xa8, 0xaa, 0x84, 0xad, 0x1b,\n                                                    0xf7, 0x2c, 0xd1, 0xf7, 0x1f, 0xee, 0xe7, 0x66,\n                                                    0xcf, 0x4e, 0xb1, 0x1f, 0xcc, 0xf7, 0x11, 0x5,\n                                                    0x64, 0x6, 0x52, 0xfb, 0x1, 0x5, 0x97, 0x6e,\n                                                    0x6b, 0x91, 0x68, 0x1b, 0xfb, 0x1a, 0x39, 0xfb,\n                                                    0x1, 0xfb, 0xf, 0x36, 0xaf, 0x42, 0xc7, 0x61,\n                                                    0x1f, 0xac, 0xcb, 0x15, 0x6c, 0xc6, 0x83, 0xdd,\n                                                    0xb6, 0x1a, 0xf3, 0xc2, 0xbf, 0xca, 0xab, 0xa5,\n                                                    0x7e, 0x74, 0xa1, 0x1e, 0xe, 0x76, 0x1d, 0xf7,\n                                                    0xe6, 0xe1, 0x15, 0x2e, 0x7, 0x8d, 0x88, 0x87,\n                                                    0xa, 0x19, 0x22, 0xa, 0x57, 0xf8, 0x39, 0x27,\n                                                    0x1d, 0x76, 0x1d, 0xf7, 0x45, 0xf8, 0x8f, 0x21,\n                                                    0x1d, 0x9b, 0xfd, 0x2d, 0x25, 0xa, 0xe, 0x81,\n                                                    0xc7, 0xf8, 0x24, 0x77, 0xf7, 0x88, 0x90, 0xa,\n                                                    0xea, 0xf8, 0x8f, 0x25, 0x1d, 0xf7, 0xd, 0xfd,\n                                                    0x40, 0x25, 0xa, 0xe, 0x81, 0xc7, 0xf8, 0x13,\n                                                    0xf7, 0x52, 0x27, 0xef, 0x12, 0xd2, 0xdf, 0x55,\n                                                    0xef, 0xed, 0xef, 0x49, 0xdf, 0x13, 0xd2, 0xf7,\n                                                    0xe8, 0x81, 0x25, 0xa, 0x13, 0xac, 0xfb, 0x81,\n                                                    0xf8, 0xd8, 0x15, 0x30, 0xa, 0xf7, 0x5a, 0x16,\n                                                    0x30, 0xa, 0xe, 0x96, 0xa, 0xf8, 0xc2, 0x9a,\n                                                    0xf7, 0x71, 0x77, 0x12, 0xf7, 0xe8, 0xf7, 0x1b,\n                                                    0x13, 0x90, 0x40, 0x1d, 0x13, 0x78, 0x41, 0xa,\n                                                    0xfb, 0x28, 0xf7, 0x46, 0x24, 0xa, 0x8e, 0x1d,\n                                                    0xf7, 0x73, 0x77, 0x1, 0xd6, 0xdf, 0xf7, 0x75,\n                                                    0xe1, 0x3, 0x90, 0xfb, 0x5b, 0x15, 0x79, 0xf7,\n                                                    0x86, 0x9d, 0x7, 0x43, 0x7b, 0xa0, 0xcb, 0x1f,\n                                                    0xf7, 0x27, 0x7, 0x5f, 0x1d, 0x75, 0x1f, 0x89,\n                                                    0x8d, 0x5, 0x8c, 0xf7, 0xbb, 0x6, 0x86, 0x8e,\n                                                    0x6b, 0x1d, 0x76, 0x6d, 0x1f, 0xfd, 0x4a, 0x7,\n                                                    0x60, 0x87, 0x6c, 0x49, 0x87, 0x1e, 0xf7, 0x2e,\n                                                    0xf7, 0xb3, 0x15, 0x5a, 0xa, 0x96, 0xa, 0xf8,\n                                                    0xbb, 0xf7, 0x50, 0x27, 0xef, 0x12, 0xf1, 0xed,\n                                                    0xf0, 0xed, 0x13, 0xac, 0x40, 0x1d, 0x13, 0x6c,\n                                                    0x41, 0xa, 0xfb, 0x9b, 0xf7, 0x88, 0x15, 0x13,\n                                                    0x9c, 0x4b, 0xa, 0x8f, 0xa, 0xf8, 0x60, 0x27,\n                                                    0xa, 0xe, 0xf7, 0x92, 0x8b, 0x9e, 0xf9, 0x4,\n                                                    0x9e, 0x1, 0xee, 0x5d, 0x1d, 0x9b, 0xd4, 0x1f,\n                                                    0xf7, 0x40, 0x7, 0xf7, 0x2f, 0xe9, 0x5, 0xbc,\n                                                    0x7, 0xfb, 0x2f, 0x2c, 0x5, 0xf7, 0x50, 0x7,\n                                                    0xe1, 0x73, 0x1d, 0xfb, 0x88, 0x7, 0x34, 0x55,\n                                                    0x5, 0x5a, 0x7, 0xe2, 0xc0, 0x5, 0xfb, 0xb,\n                                                    0x7, 0x33, 0x7a, 0xa, 0xe, 0x8f, 0xa, 0xf9,\n                                                    0x3, 0x9b, 0xb7, 0x77, 0x1, 0xe1, 0xdf, 0x3,\n                                                    0x9e, 0x16, 0xf7, 0x84, 0x9a, 0x6, 0x51, 0x8e,\n                                                    0x78, 0x9d, 0xc5, 0x1a, 0xf7, 0xcd, 0x7, 0xd8,\n                                                    0xbf, 0x5, 0xb7, 0x7, 0x3e, 0x56, 0x5, 0xf7,\n                                                    0x7b, 0x5d, 0xa, 0xfb, 0x40, 0x7, 0x3c, 0x56,\n                                                    0x5, 0x5f, 0x7, 0xda, 0xbf, 0x5, 0xfb, 0x91,\n                                                    0x7, 0x57, 0x77, 0x74, 0x50, 0x84, 0x1d, 0xf8,\n                                                    0xa8, 0x85, 0xb0, 0x6c, 0xb2, 0xf7, 0xb6, 0xb0,\n                                                    0xf7, 0x9e, 0xa9, 0x6d, 0xaf, 0x6b, 0xaf, 0x12,\n                                                    0xa9, 0xf7, 0x4, 0xf7, 0xb5, 0xef, 0xf7, 0x7b,\n                                                    0xa1, 0x13, 0xa7, 0x0, 0xf8, 0xa7, 0xf7, 0xdd,\n                                                    0x15, 0xf7, 0x2c, 0x88, 0x8a, 0x81, 0xa4, 0x1f,\n                                                    0xab, 0x81, 0x9f, 0x6d, 0x90, 0x5a, 0x8, 0x13,\n                                                    0xa7, 0x80, 0xa1, 0xf7, 0x7e, 0x75, 0x6, 0x2a,\n                                                    0x7d, 0x85, 0x8b, 0xfb, 0x67, 0x1b, 0xf7, 0x80,\n                                                    0x7, 0x9e, 0x8f, 0x90, 0xf7, 0x4, 0xf7, 0x4,\n                                                    0xb8, 0x84, 0x29, 0x96, 0x1e, 0xa2, 0xf7, 0x21,\n                                                    0xfb, 0xda, 0x6, 0x64, 0x66, 0x8d, 0x8c, 0x6e,\n                                                    0x1f, 0x13, 0xab, 0x0, 0x8d, 0x6e, 0x77, 0x8c,\n                                                    0x84, 0x1b, 0xfb, 0x4a, 0xfb, 0x1f, 0x24, 0xfb,\n                                                    0x8f, 0xfb, 0x64, 0xf7, 0x18, 0xfb, 0x4, 0xf7,\n                                                    0x29, 0xa9, 0xa8, 0x8d, 0x8c, 0xa9, 0x1f, 0x13,\n                                                    0x67, 0x0, 0x8d, 0xa9, 0xaa, 0x8c, 0xa9, 0x1b,\n                                                    0xf7, 0xf2, 0x6, 0xb7, 0xf7, 0x3c, 0x5, 0x73,\n                                                    0x6, 0x52, 0xfb, 0x2, 0x5e, 0x7b, 0x5b, 0x89,\n                                                    0xfb, 0x10, 0x89, 0x18, 0x67, 0x77, 0x8d, 0xb7,\n                                                    0x1f, 0x27, 0xba, 0x15, 0x13, 0xb3, 0x0, 0x56,\n                                                    0x7d, 0x5c, 0x37, 0xfb, 0x23, 0x5b, 0xf7, 0x16,\n                                                    0xf7, 0x3d, 0xf7, 0x34, 0xbf, 0xf7, 0x22, 0xf7,\n                                                    0x1e, 0xe3, 0x96, 0x54, 0x59, 0x1e, 0xe, 0xf8,\n                                                    0x1, 0x81, 0xa5, 0x71, 0xce, 0xf7, 0x66, 0xa9,\n                                                    0xf7, 0x1a, 0xa8, 0x12, 0xa9, 0xe5, 0xf7, 0x73,\n                                                    0xd8, 0xf7, 0x33, 0xea, 0x13, 0x7e, 0xf8, 0x13,\n                                                    0xe0, 0x15, 0x4c, 0xa4, 0xb3, 0x6b, 0xcc, 0x1b,\n                                                    0xec, 0xbc, 0xdd, 0xce, 0xaa, 0x1f, 0x80, 0x91,\n                                                    0x5, 0x6e, 0x76, 0x60, 0x50, 0x4b, 0x1b, 0xfb,\n                                                    0xf, 0x85, 0xf7, 0x32, 0xbf, 0x89, 0x1f, 0xf7,\n                                                    0x92, 0x6, 0xf7, 0x36, 0xfb, 0xa, 0xaa, 0x62,\n                                                    0x40, 0x6a, 0x5e, 0x6c, 0x74, 0x1e, 0xd0, 0x54,\n                                                    0x4a, 0x92, 0x6e, 0x1b, 0xfb, 0x43, 0x6d, 0xfb,\n                                                    0x48, 0x50, 0xfb, 0x3e, 0xf7, 0x8, 0x4e, 0xe9,\n                                                    0xa3, 0xd5, 0x8f, 0xe6, 0xb8, 0x1f, 0xfb, 0x9b,\n                                                    0xf7, 0x58, 0x15, 0xf7, 0xc, 0xcc, 0xa9, 0xb5,\n                                                    0xf7, 0x1, 0x92, 0xfb, 0x3c, 0x52, 0x1e, 0x13,\n                                                    0xbe, 0xfb, 0x6, 0x71, 0x3f, 0x3d, 0xfb, 0x7,\n                                                    0x87, 0xf7, 0x4c, 0xdc, 0x1e, 0xf7, 0xbf, 0x9b,\n                                                    0x15, 0xa8, 0x8d, 0xf4, 0xdc, 0xbc, 0xa7, 0x50,\n                                                    0x5b, 0x1e, 0x70, 0x7, 0xe, 0xf7, 0x5b, 0x7d,\n                                                    0xaf, 0x7d, 0x76, 0xf9, 0x1c, 0xb4, 0xf7, 0x66,\n                                                    0x77, 0x12, 0xd2, 0xe1, 0xf7, 0x7d, 0xf0, 0x13,\n                                                    0x7c, 0xd3, 0x7e, 0x15, 0xa1, 0x6, 0x9b, 0x9f,\n                                                    0x9c, 0xa0, 0x1e, 0x13, 0xbc, 0xa9, 0xb2, 0x69,\n                                                    0xd7, 0x1b, 0xf7, 0x23, 0xcf, 0xeb, 0xe0, 0xf5,\n                                                    0x32, 0xc4, 0x35, 0xbd, 0x1f, 0x3a, 0xba, 0x3d,\n                                                    0xb5, 0xd4, 0x1a, 0xc9, 0xbe, 0xaa, 0xbd, 0xf4,\n                                                    0xcb, 0x31, 0x39, 0x9c, 0x1e, 0xa4, 0x6, 0x75,\n                                                    0x86, 0x1d, 0x72, 0x5f, 0xad, 0x4f, 0x55, 0xa,\n                                                    0x74, 0x6, 0x13, 0x7c, 0xf7, 0x61, 0xf8, 0x9c,\n                                                    0x31, 0xa, 0xab, 0x81, 0xa1, 0x90, 0x76, 0xf7,\n                                                    0x30, 0x77, 0xf7, 0xb0, 0xa2, 0x97, 0x77, 0xf7,\n                                                    0x87, 0x77, 0x12, 0xf7, 0xac, 0xd1, 0x13, 0x76,\n                                                    0xbf, 0x87, 0x15, 0x98, 0x6, 0x94, 0x91, 0x99,\n                                                    0x8e, 0x97, 0x1b, 0x9b, 0x8c, 0x9e, 0x84, 0xa0,\n                                                    0x86, 0x8, 0x13, 0xb6, 0x87, 0x9a, 0x9b, 0x88,\n                                                    0x9e, 0x1b, 0xcb, 0xde, 0xb5, 0xe2, 0xc7, 0x66,\n                                                    0x66, 0xa, 0xb7, 0xb8, 0x76, 0x25, 0xa1, 0x1e,\n                                                    0x9a, 0x6, 0x13, 0xae, 0x87, 0xf7, 0x1d, 0x5,\n                                                    0x80, 0x6, 0x87, 0x88, 0x7c, 0x84, 0x82, 0x1b,\n                                                    0x82, 0x80, 0x91, 0x91, 0x7c, 0x1f, 0x13, 0xb6,\n                                                    0x8f, 0x7f, 0x7b, 0x7c, 0x1d, 0xe5, 0x58, 0xa1,\n                                                    0x73, 0x6b, 0x1a, 0x52, 0x5a, 0x95, 0xa, 0x7b,\n                                                    0x6, 0x13, 0x76, 0xf7, 0x3, 0xf7, 0xf7, 0x31,\n                                                    0xa, 0x80, 0x1d, 0xf9, 0x17, 0x97, 0xa, 0xe8,\n                                                    0xef, 0x12, 0xf7, 0x69, 0xed, 0x8f, 0xf1, 0x82,\n                                                    0xed, 0x13, 0xcc, 0x68, 0xa, 0xa3, 0xdd, 0x1a,\n                                                    0xf7, 0x45, 0x7e, 0x1d, 0x13, 0x3c, 0x4b, 0x1d,\n                                                    0x7, 0x13, 0x4c, 0x5e, 0x1d, 0x8a, 0xf9, 0x92,\n                                                    0x15, 0x13, 0x9a, 0x6f, 0x9f, 0x35, 0x1d, 0x77,\n                                                    0x62, 0x1d, 0xf7, 0x5b, 0x16, 0x6f, 0x9f, 0x35,\n                                                    0x1d, 0x77, 0x62, 0x1d, 0xe, 0x7b, 0xa, 0x8b,\n                                                    0x77, 0xf8, 0xf2, 0xb1, 0xf7, 0x74, 0x77, 0x1,\n                                                    0xaa, 0xa5, 0xf8, 0x99, 0xa2, 0x3f, 0x1d, 0xf7,\n                                                    0x9d, 0xf9, 0x54, 0x31, 0xa, 0xe2, 0x8b, 0xa9,\n                                                    0xf8, 0x1a, 0xa9, 0xf7, 0x74, 0x77, 0x6a, 0xa,\n                                                    0x7a, 0x6c, 0x21, 0x1b, 0xfb, 0x13, 0x56, 0x1d,\n                                                    0xf7, 0x38, 0xf8, 0x80, 0x31, 0xa, 0xfb, 0x51,\n                                                    0xa3, 0xf8, 0xb1, 0xaa, 0xf7, 0x84, 0xa8, 0x1,\n                                                    0xeb, 0xf8, 0xc, 0x15, 0xf7, 0xd, 0x6, 0x63,\n                                                    0xfc, 0x3, 0x5, 0x38, 0x84, 0x79, 0x30, 0x50,\n                                                    0x1b, 0x80, 0x83, 0x91, 0x92, 0x1f, 0x95, 0x9a,\n                                                    0x96, 0x9e, 0x1a, 0xa2, 0x7d, 0x99, 0x75, 0x7e,\n                                                    0x6a, 0x83, 0x67, 0x65, 0xa8, 0x6b, 0xbd, 0xeb,\n                                                    0xba, 0xf1, 0xf7, 0x43, 0xac, 0x1e, 0x9a, 0xda,\n                                                    0x93, 0xe4, 0x9c, 0xf7, 0xc, 0x8, 0xf7, 0xc,\n                                                    0x6, 0x95, 0xaa, 0x5, 0xfb, 0x12, 0x6, 0xf7,\n                                                    0x18, 0x97, 0x99, 0xf7, 0x0, 0xcc, 0x1b, 0x96,\n                                                    0x96, 0x89, 0x80, 0x1f, 0x82, 0x7e, 0x7f, 0x7b,\n                                                    0x1a, 0x7f, 0x97, 0x75, 0xa4, 0xa3, 0xa2, 0x9c,\n                                                    0xa9, 0xa8, 0x6c, 0xb0, 0x57, 0xfb, 0x26, 0x6c,\n                                                    0xfb, 0x6f, 0x59, 0x84, 0x1e, 0xfb, 0x9, 0x6,\n                                                    0xe, 0x91, 0xa, 0x96, 0xf8, 0x8f, 0x2b, 0x1d,\n                                                    0xfb, 0xf, 0xf7, 0x3b, 0x5, 0x49, 0x6, 0xe,\n                                                    0x91, 0xa, 0xf7, 0x1b, 0xf8, 0x8f, 0x31, 0xa,\n                                                    0x73, 0xf8, 0x8f, 0xc0, 0xf3, 0x77, 0x1, 0xa5,\n                                                    0xf9, 0x2c, 0x15, 0x6e, 0x9b, 0xfb, 0x14, 0xf7,\n                                                    0xe, 0xf7, 0x14, 0x9a, 0xf7, 0x12, 0xaa, 0x1e,\n                                                    0x6e, 0x6, 0x4e, 0x82, 0x5c, 0x60, 0x53, 0x1b,\n                                                    0x4b, 0x66, 0xb6, 0xc8, 0x81, 0x1f, 0xe, 0x73,\n                                                    0xf8, 0x9f, 0xef, 0x1, 0xf7, 0xa, 0xed, 0x3,\n                                                    0xf7, 0xa, 0xf8, 0xd1, 0x15, 0x36, 0xa, 0xe,\n                                                    0x73, 0xf8, 0x94, 0xad, 0xf7, 0x17, 0xad, 0x12,\n                                                    0xce, 0xf7, 0x5b, 0x69, 0xad, 0x13, 0xe0, 0xce,\n                                                    0xf8, 0xf7, 0x15, 0x55, 0xb5, 0x5e, 0xc4, 0x79,\n                                                    0x1d, 0x53, 0x60, 0x5d, 0x55, 0x1e, 0xad, 0x8c,\n                                                    0x15, 0xa3, 0x9f, 0xb4, 0xb8, 0x1e, 0x13, 0xd0,\n                                                    0xb0, 0xa8, 0x6d, 0x67, 0x67, 0x6e, 0x6e, 0x65,\n                                                    0x5e, 0x78, 0xb4, 0xa4, 0x1f, 0xe, 0x73, 0xfb,\n                                                    0x24, 0x76, 0xf7, 0x39, 0x77, 0x1, 0xcb, 0xc0,\n                                                    0x3, 0xf7, 0xc, 0x16, 0x72, 0x7b, 0x6c, 0x61,\n                                                    0x64, 0x1a, 0x6d, 0xa0, 0x65, 0xc5, 0xb4, 0xbd,\n                                                    0xa9, 0xc2, 0x9a, 0x1e, 0x7b, 0x92, 0x5, 0x6c,\n                                                    0x81, 0x68, 0x7b, 0x6e, 0x1b, 0x73, 0x79, 0x99,\n                                                    0xa8, 0xab, 0xa8, 0xaa, 0x9d, 0x99, 0x1f, 0xe,\n                                                    0x73, 0xf8, 0xa8, 0xf5, 0x1, 0x8c, 0xf8, 0xa8,\n                                                    0x15, 0xa8, 0x6, 0x91, 0x9c, 0x98, 0xb9, 0xaf,\n                                                    0x7f, 0x8, 0x6c, 0xe5, 0x9f, 0x77, 0x52, 0x1d,\n                                                    0x7a, 0x63, 0x7c, 0x79, 0x71, 0x93, 0x8, 0xa2,\n                                                    0x43, 0x5e, 0xa6, 0x76, 0x54, 0xa, 0x73, 0xf8,\n                                                    0x8f, 0xf7, 0x3f, 0x1, 0x88, 0xf8, 0x8f, 0x15,\n                                                    0xb5, 0x6, 0xf7, 0x2c, 0x22, 0x1d, 0x94, 0xfb,\n                                                    0x28, 0x15, 0xb5, 0x6, 0xf7, 0x2c, 0x22, 0x1d,\n                                                    0xe, 0x8a, 0xa, 0xf8, 0x88, 0xb4, 0xfc, 0x88,\n                                                    0x6, 0xe, 0xf9, 0x17, 0x8a, 0xa, 0xfa, 0x7c,\n                                                    0xb4, 0xfe, 0x7c, 0x6, 0xe, 0x91, 0x1d, 0xf7,\n                                                    0x7, 0xf7, 0x1f, 0x3, 0xf7, 0x80, 0xf9, 0x25,\n                                                    0x15, 0x51, 0xa, 0x6b, 0x99, 0x71, 0x84, 0x87,\n                                                    0x88, 0x89, 0x86, 0x1e, 0x89, 0x87, 0x87, 0x8a,\n                                                    0x87, 0x64, 0xa, 0xe, 0x91, 0x1d, 0xda, 0xf7,\n                                                    0x1f, 0x3, 0xf5, 0xf8, 0x45, 0x15, 0x3c, 0xa,\n                                                    0xad, 0x7c, 0xa5, 0x92, 0x92, 0x91, 0x8c, 0x8e,\n                                                    0x1e, 0x54, 0x1d, 0x73, 0xfb, 0xc, 0x76, 0xf7,\n                                                    0x2d, 0x76, 0xa7, 0x76, 0xf3, 0x77, 0x12, 0xda,\n                                                    0xf7, 0x1f, 0x13, 0xd8, 0xec, 0xfb, 0xe, 0x15,\n                                                    0x94, 0x78, 0x5, 0x3c, 0xa, 0xad, 0x7e, 0xa5,\n                                                    0x92, 0x92, 0x5c, 0xa, 0xe2, 0xf8, 0x45, 0xf7,\n                                                    0x3, 0xf7, 0x18, 0x77, 0x1, 0xb6, 0x97, 0x1d,\n                                                    0x3, 0xf7, 0x38, 0xf9, 0x25, 0x15, 0x48, 0x1d,\n                                                    0xf7, 0x7c, 0x16, 0x48, 0x1d, 0xe, 0xe2, 0xf8,\n                                                    0x5a, 0x76, 0xf7, 0x18, 0xf7, 0x3, 0x1, 0xa9,\n                                                    0x97, 0x1d, 0x3, 0xc4, 0xf8, 0x45, 0x48, 0xa,\n                                                    0xf7, 0x85, 0x78, 0x48, 0xa, 0xe, 0xe2, 0xfb,\n                                                    0xc, 0x76, 0xf7, 0x18, 0xf7, 0x3, 0x38, 0x76,\n                                                    0x12, 0xb8, 0x97, 0x1d, 0x13, 0xd8, 0xca, 0xfb,\n                                                    0xe, 0x15, 0x94, 0x78, 0x5, 0x46, 0x1d, 0x13,\n                                                    0xb8, 0x33, 0xa, 0xf7, 0x7c, 0x16, 0x94, 0x78,\n                                                    0x5, 0xa9, 0x95, 0xdd, 0xcd, 0xd2, 0x1a, 0x13,\n                                                    0xd8, 0xde, 0x51, 0x98, 0x74, 0x72, 0x6a, 0x7c,\n                                                    0x60, 0x63, 0xae, 0x7e, 0xa5, 0x92, 0x91, 0x5c,\n                                                    0xa, 0xfb, 0x14, 0x76, 0xf8, 0xbd, 0xe2, 0xf7,\n                                                    0x4d, 0x77, 0x1, 0xf7, 0x84, 0xa2, 0x3, 0xf7,\n                                                    0x85, 0xfb, 0x29, 0x15, 0xa0, 0x6, 0x8c, 0xf7,\n                                                    0x23, 0x5, 0xf7, 0xf, 0xa0, 0xec, 0x9e, 0xb2,\n                                                    0x1e, 0x61, 0xb6, 0x8b, 0xeb, 0xb9, 0x1a, 0xb2,\n                                                    0x88, 0xa2, 0x84, 0x9c, 0x84, 0x8, 0x82, 0xa0,\n                                                    0x98, 0x83, 0xa4, 0x1b, 0x9d, 0xa4, 0x94, 0xae,\n                                                    0xaa, 0x74, 0x97, 0x79, 0x72, 0x7d, 0x81, 0x82,\n                                                    0x76, 0x1f, 0x79, 0x83, 0x75, 0x84, 0x63, 0x8a,\n                                                    0x8, 0xc2, 0x92, 0xaa, 0x93, 0xa1, 0x1e, 0x95,\n                                                    0xa5, 0x96, 0x98, 0xa5, 0x1a, 0xa4, 0x75, 0xa1,\n                                                    0x73, 0x71, 0x76, 0x75, 0x72, 0x71, 0x96, 0x7e,\n                                                    0x95, 0x71, 0x1e, 0x93, 0x75, 0x92, 0x6c, 0x54,\n                                                    0x1a, 0x5f, 0x8c, 0x73, 0x94, 0x78, 0x94, 0x8,\n                                                    0x93, 0x79, 0x7e, 0x93, 0x75, 0x1b, 0x79, 0x74,\n                                                    0x7f, 0x6c, 0x68, 0xa2, 0x82, 0x9d, 0xa1, 0x98,\n                                                    0x91, 0x92, 0x9c, 0x1f, 0x9e, 0x93, 0xa2, 0x95,\n                                                    0xb9, 0x8e, 0x8, 0x5d, 0x8b, 0x2b, 0x61, 0x60,\n                                                    0x1e, 0x9c, 0x64, 0xa2, 0x2a, 0x8d, 0xfb, 0xf,\n                                                    0x8, 0xe, 0xfb, 0x57, 0x76, 0xf7, 0x38, 0xe1,\n                                                    0x7e, 0x76, 0xf8, 0x50, 0xe1, 0xf7, 0x38, 0x77,\n                                                    0x12, 0xcf, 0xf7, 0x54, 0x4f, 0xef, 0x4f, 0x9f,\n                                                    0x77, 0xf7, 0x54, 0x13, 0xd9, 0x0, 0xf7, 0x84,\n                                                    0x16, 0x13, 0xda, 0x0, 0x76, 0xa, 0x13, 0xd9,\n                                                    0x0, 0xb7, 0xac, 0xad, 0xbc, 0x1b, 0x8c, 0x5d,\n                                                    0x62, 0x52, 0x63, 0x1a, 0x13, 0xdc, 0x0, 0x6d,\n                                                    0xa0, 0x72, 0xa8, 0xa8, 0xa0, 0xa4, 0xa9, 0x1e,\n                                                    0x13, 0xb9, 0x0, 0xb3, 0x62, 0xc4, 0x8c, 0xb9,\n                                                    0x1e, 0x78, 0x1d, 0x5f, 0x6a, 0x69, 0x5a, 0x1b,\n                                                    0x13, 0xdc, 0x0, 0x8f, 0xb3, 0x98, 0xa1, 0xa9,\n                                                    0xa0, 0x8, 0x67, 0xb6, 0x80, 0xc6, 0xc1, 0x1a,\n                                                    0xc1, 0x96, 0xc6, 0xaf, 0xb6, 0x1e, 0x13, 0xd9,\n                                                    0x0, 0x6d, 0xa0, 0x7e, 0xa1, 0x87, 0xb3, 0x8,\n                                                    0x13, 0xda, 0x0, 0x78, 0x1d, 0x13, 0xdc, 0x0,\n                                                    0x5f, 0x6a, 0x69, 0x5a, 0x1b, 0x8a, 0xb9, 0xb4,\n                                                    0xc4, 0xb3, 0x1a, 0x13, 0xd8, 0x80, 0xa9, 0x76,\n                                                    0xa4, 0x6e, 0x6e, 0x76, 0x72, 0x6d, 0x1e, 0x13,\n                                                    0xbc, 0x0, 0x63, 0xb4, 0x52, 0x8a, 0x5d, 0x1e,\n                                                    0x76, 0xa, 0xb7, 0xac, 0xad, 0xbc, 0x1b, 0x87,\n                                                    0x63, 0x7e, 0x75, 0x6d, 0x76, 0x8, 0x13, 0xd8,\n                                                    0x80, 0xaf, 0x60, 0x96, 0x50, 0x55, 0x1a, 0x55,\n                                                    0x80, 0x50, 0x67, 0x60, 0x1e, 0x13, 0xd9, 0x0,\n                                                    0xa9, 0x76, 0x98, 0x75, 0x8f, 0x63, 0x8, 0xe,\n                                                    0x84, 0xf7, 0x6d, 0x76, 0xf7, 0xa2, 0x77, 0x1,\n                                                    0xb3, 0xf7, 0xdf, 0x15, 0x40, 0xc7, 0x4f, 0xd6,\n                                                    0xd6, 0xc7, 0xc8, 0xd5, 0xd6, 0x4f, 0xc7, 0x40,\n                                                    0x3f, 0x50, 0x4f, 0x40, 0x1e, 0xe, 0xf9, 0x17,\n                                                    0x80, 0xf7, 0x3, 0x1, 0xf7, 0x3, 0xf7, 0x4,\n                                                    0xf7, 0x70, 0xf7, 0x5, 0xf7, 0x70, 0xf7, 0x4,\n                                                    0x14, 0x70, 0xf7, 0x3, 0xb6, 0x15, 0x65, 0xad,\n                                                    0x81, 0xa, 0x72, 0x99, 0xa, 0xf7, 0xe0, 0x16,\n                                                    0x65, 0xae, 0x81, 0xa, 0x71, 0x99, 0xa, 0xf7,\n                                                    0xe1, 0x16, 0x65, 0xae, 0x4d, 0x1d, 0x71, 0x99,\n                                                    0xa, 0xe, 0xf9, 0x17, 0x7f, 0xa8, 0x6f, 0x76,\n                                                    0xf7, 0xcd, 0xa7, 0x90, 0xa8, 0xf7, 0x9b, 0xa8,\n                                                    0x9c, 0x77, 0x12, 0xb2, 0xd4, 0xf7, 0x1f, 0xd4,\n                                                    0xb7, 0xd4, 0xf7, 0x1f, 0xd4, 0xa9, 0xd3, 0xf7,\n                                                    0x20, 0xd4, 0x13, 0x77, 0xf0, 0xf7, 0xe, 0x82,\n                                                    0x15, 0xaa, 0x74, 0xf8, 0x27, 0xf9, 0x29, 0x6b,\n                                                    0xa2, 0x5, 0x13, 0xbb, 0xf0, 0xfc, 0x79, 0xfb,\n                                                    0x57, 0x15, 0x3e, 0x8d, 0x1d, 0xed, 0x28, 0x1e,\n                                                    0x8a, 0x6, 0x28, 0x60, 0x29, 0x3b, 0x1f, 0xd4,\n                                                    0x8c, 0x15, 0xbe, 0x95, 0xec, 0xc7, 0x1e, 0x8c,\n                                                    0x6, 0xc8, 0x92, 0x28, 0x59, 0x5d, 0x84, 0x25,\n                                                    0x4e, 0x50, 0x7f, 0xf0, 0xbb, 0x1f, 0xf7, 0x94,\n                                                    0xfb, 0xb9, 0x15, 0x3d, 0xb6, 0x28, 0xef, 0xee,\n                                                    0xb6, 0xee, 0xd9, 0xda, 0x60, 0xee, 0x29, 0x1e,\n                                                    0x8a, 0x6, 0x27, 0x60, 0x28, 0x3c, 0x1f, 0xf7,\n                                                    0xcf, 0x16, 0x3d, 0x8d, 0x1d, 0xee, 0x28, 0x1e,\n                                                    0x8a, 0x6, 0x28, 0x60, 0x28, 0x3c, 0x1f, 0xfb,\n                                                    0x86, 0x8c, 0x15, 0xbd, 0x94, 0xed, 0xc8, 0x1e,\n                                                    0x8c, 0x6, 0xc8, 0x92, 0x27, 0x5a, 0x5d, 0x83,\n                                                    0x25, 0x4f, 0x4d, 0x82, 0xf0, 0xbb, 0x1f, 0xf7,\n                                                    0xce, 0x16, 0xbd, 0x96, 0xed, 0xc6, 0x1e, 0x8c,\n                                                    0x6, 0xc9, 0x92, 0x27, 0x5a, 0x5d, 0x83, 0x25,\n                                                    0x4e, 0x4e, 0x81, 0xef, 0xbc, 0x1f, 0xe, 0x73,\n                                                    0x79, 0xa, 0xca, 0xf7, 0x77, 0x42, 0x1d, 0x97,\n                                                    0x9b, 0xb1, 0xbc, 0xab, 0xb6, 0x8, 0xa5, 0xae,\n                                                    0xa0, 0xaa, 0x91, 0x96, 0x1d, 0x73, 0x79, 0xa,\n                                                    0xc6, 0xac, 0x15, 0xf7, 0x67, 0xf7, 0x51, 0x5,\n                                                    0xaa, 0x5e, 0xfb, 0x2d, 0xf7, 0x37, 0x51, 0x1d,\n                                                    0x7e, 0x7a, 0x61, 0x55, 0x6a, 0x5e, 0x8, 0x74,\n                                                    0x6b, 0x79, 0x71, 0x8f, 0x1d, 0xfb, 0x52, 0x92,\n                                                    0x7a, 0x1d, 0xfb, 0x3c, 0xf8, 0x87, 0x3, 0xfb,\n                                                    0xb, 0x7d, 0x15, 0xf8, 0x56, 0xf9, 0x46, 0x5,\n                                                    0x5d, 0x6, 0xfc, 0x59, 0xfd, 0x46, 0x5, 0xe,\n                                                    0xf8, 0x1, 0x8b, 0xc3, 0xf7, 0x57, 0xb3, 0xe4,\n                                                    0xb3, 0xf7, 0x6c, 0xb1, 0x1, 0xf7, 0x26, 0xf7,\n                                                    0x4, 0x2f, 0xf7, 0x4, 0xf8, 0x14, 0xa5, 0x3,\n                                                    0xf7, 0x3a, 0xf7, 0x8f, 0x15, 0xfb, 0x2a, 0x9a,\n                                                    0xf7, 0x1e, 0x26, 0xf7, 0x15, 0x1b, 0xf7, 0xb,\n                                                    0xdc, 0xc9, 0xd9, 0xc5, 0x1f, 0x77, 0x95, 0x5,\n                                                    0x5f, 0x56, 0x59, 0x59, 0x51, 0x1b, 0xfb, 0x6,\n                                                    0xfb, 0x18, 0xc8, 0xf7, 0x1a, 0x8a, 0x1f, 0xf7,\n                                                    0xc3, 0x6, 0x99, 0xb3, 0x5, 0xfb, 0xd2, 0x6,\n                                                    0x89, 0xab, 0x89, 0xa5, 0x8f, 0xaa, 0x8, 0xf7,\n                                                    0xe4, 0x6, 0x9a, 0xb3, 0x5, 0xfb, 0xee, 0x6,\n                                                    0xf7, 0x16, 0xf1, 0xe0, 0xf5, 0x8c, 0x1e, 0xf7,\n                                                    0x11, 0xba, 0x51, 0x2c, 0x1f, 0xa5, 0xf7, 0x26,\n                                                    0x6, 0xa4, 0x49, 0x64, 0x9f, 0x23, 0x1b, 0xfb,\n                                                    0x18, 0xfb, 0x7, 0x68, 0xfb, 0x6f, 0x4d, 0x1f,\n                                                    0xfb, 0xc, 0x6, 0x7c, 0x63, 0x5, 0xf7, 0x16,\n                                                    0x6, 0x88, 0x6d, 0x8a, 0x6e, 0x8d, 0x6d, 0x8,\n                                                    0xfb, 0x5, 0x6, 0x7c, 0x63, 0x5, 0xe, 0xf9,\n                                                    0x3, 0xf7, 0x96, 0x9f, 0x8a, 0x76, 0xf8, 0x16,\n                                                    0x9f, 0x12, 0xf7, 0x3b, 0xd2, 0xf7, 0x8e, 0xa5,\n                                                    0xf7, 0xd0, 0xd2, 0x13, 0xbc, 0xf7, 0x9, 0xf7,\n                                                    0x96, 0x15, 0xf7, 0x3f, 0x9f, 0x6, 0x57, 0x91,\n                                                    0x8d, 0x95, 0xbb, 0x1a, 0xf7, 0xc0, 0xbd, 0x7,\n                                                    0xb4, 0x9c, 0x6c, 0x66, 0x94, 0x1f, 0x9f, 0xe3,\n                                                    0xfb, 0xed, 0x33, 0x9f, 0x6, 0xb0, 0x94, 0x9c,\n                                                    0xaa, 0xb5, 0x1b, 0xbc, 0xfb, 0xc0, 0x6, 0x5b,\n                                                    0x8d, 0x81, 0x57, 0x85, 0x1e, 0xf7, 0xd3, 0x77,\n                                                    0x15, 0xf7, 0x17, 0x9f, 0x6, 0x5e, 0x8f, 0x83,\n                                                    0xa6, 0xb7, 0x1a, 0xf7, 0x65, 0x8d, 0x7, 0x13,\n                                                    0x7c, 0xf7, 0x29, 0xfb, 0xc6, 0x5, 0x96, 0x6,\n                                                    0xf7, 0x2c, 0xf7, 0xc8, 0x5, 0x8d, 0xfb, 0x72,\n                                                    0x6, 0x13, 0xbc, 0x5b, 0x8e, 0x81, 0x57, 0x85,\n                                                    0x1e, 0x77, 0xf7, 0x3e, 0x9f, 0x7, 0x57, 0x91,\n                                                    0x8d, 0x95, 0xbb, 0x1a, 0xf7, 0x89, 0x7, 0xae,\n                                                    0x97, 0x9d, 0xb7, 0x8d, 0x1e, 0x9f, 0x24, 0x7,\n                                                    0xfb, 0x34, 0xfb, 0xc9, 0xfb, 0x2e, 0xf7, 0xc9,\n                                                    0x5, 0xfb, 0xd, 0x77, 0x6, 0xa8, 0xa7, 0x77,\n                                                    0x6d, 0x97, 0x1f, 0xfb, 0x83, 0x7, 0x5f, 0x83,\n                                                    0x70, 0x5f, 0x84, 0x1d, 0xf7, 0x63, 0xf7, 0x70,\n                                                    0xcd, 0x12, 0x13, 0x80, 0xa9, 0xf7, 0x70, 0x15,\n                                                    0xf8, 0x8c, 0xba, 0xfc, 0x8c, 0x6, 0xe, 0x99,\n                                                    0x1d, 0xf8, 0x36, 0xab, 0xf7, 0x64, 0xa4, 0x1,\n                                                    0xee, 0xdf, 0xf7, 0x4f, 0xdf, 0x3, 0xaa, 0x16,\n                                                    0xf7, 0x71, 0x9a, 0x6, 0x48, 0x8e, 0x89, 0xb3,\n                                                    0xb3, 0x1a, 0xf7, 0xd4, 0x7, 0xa0, 0xf7, 0x9,\n                                                    0x89, 0x8a, 0x98, 0x1f, 0xac, 0x86, 0x8e, 0x80,\n                                                    0x65, 0x1a, 0xfb, 0x92, 0x7, 0x4f, 0x89, 0x6f,\n                                                    0x48, 0x87, 0x1e, 0x7c, 0xf7, 0x70, 0x9a, 0x7,\n                                                    0x58, 0x8f, 0x7b, 0x9f, 0xcf, 0x1a, 0xf7, 0x90,\n                                                    0x7, 0xa4, 0x8c, 0xb4, 0x8c, 0xab, 0x1e, 0x87,\n                                                    0x8e, 0x5, 0x85, 0x6a, 0x60, 0x87, 0x66, 0x1b,\n                                                    0xfb, 0x31, 0x6, 0x8a, 0xce, 0x8b, 0xba, 0x97,\n                                                    0xa9, 0x8, 0xa8, 0x97, 0xad, 0xae, 0xba, 0x1b,\n                                                    0xac, 0x9d, 0x7a, 0x78, 0x99, 0x1f, 0x74, 0x9c,\n                                                    0x97, 0x72, 0xa8, 0x1b, 0x9e, 0x9b, 0x9c, 0x9f,\n                                                    0xbf, 0x4e, 0x9f, 0x4a, 0xfb, 0x20, 0x42, 0x36,\n                                                    0xfb, 0x28, 0x86, 0x1f, 0x46, 0x6b, 0xcf, 0xfb,\n                                                    0xd5, 0x6, 0x51, 0x78, 0x74, 0x5a, 0x8a, 0x1e,\n                                                    0xe, 0x99, 0x1d, 0xf8, 0x36, 0xab, 0xf7, 0x62,\n                                                    0xa6, 0x1, 0xf0, 0xdf, 0xf7, 0x50, 0xdf, 0x3,\n                                                    0xab, 0x16, 0xf7, 0x74, 0x9a, 0x6, 0x61, 0x8f,\n                                                    0x6e, 0x9a, 0xc2, 0x1a, 0xf7, 0xdd, 0xf7, 0x50,\n                                                    0xfb, 0xd8, 0x7, 0x4d, 0x6a, 0x7d, 0x69, 0x88,\n                                                    0x1e, 0x7c, 0xf7, 0x6b, 0x9a, 0x7, 0x51, 0x8e,\n                                                    0x85, 0xa6, 0xb9, 0x1a, 0xf8, 0xe2, 0x7, 0x86,\n                                                    0x8d, 0x5, 0x8a, 0x7f, 0x5d, 0x73, 0x7d, 0x1b,\n                                                    0x7c, 0x7e, 0x94, 0x92, 0x76, 0x1f, 0x90, 0x7c,\n                                                    0x78, 0x8f, 0x71, 0x1b, 0x61, 0xfb, 0x11, 0x78,\n                                                    0xfb, 0x6a, 0x8a, 0x1f, 0x44, 0x6b, 0xd0, 0xfb,\n                                                    0xdd, 0x6, 0x69, 0x78, 0x67, 0x59, 0x87, 0x1e,\n                                                    0xf7, 0x2d, 0xf8, 0x47, 0x15, 0xe5, 0x89, 0x89,\n                                                    0xf7, 0x8, 0xd1, 0x1b, 0xa9, 0x96, 0x78, 0x79,\n                                                    0x97, 0x1f, 0x79, 0x97, 0x97, 0x7a, 0xa9, 0x1b,\n                                                    0x94, 0x8e, 0x8f, 0x8e, 0x8e, 0x1f, 0xfb, 0x21,\n                                                    0x7, 0xe, 0x7d, 0x99, 0xf8, 0x56, 0x95, 0xf7,\n                                                    0x5e, 0x99, 0x6, 0xfb, 0x6e, 0x8c, 0x7, 0x1e,\n                                                    0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xa7, 0xa,\n                                                    0xdf, 0xb, 0xa7, 0x93, 0x8d, 0x8e, 0xc, 0xc,\n                                                    0xdf, 0x91, 0x97, 0xc, 0xd, 0xf8, 0x88, 0x14,\n                                                    0xf7, 0xf9, 0x15, 0xb6, 0x13, 0x0, 0x7b, 0x2,\n                                                    0x0, 0x1, 0x0, 0x36, 0x0, 0x3f, 0x0, 0x4f,\n                                                    0x0, 0x69, 0x0, 0x6c, 0x0, 0x75, 0x0, 0x8f,\n                                                    0x0, 0x96, 0x0, 0x9b, 0x0, 0xa6, 0x0, 0xb1,\n                                                    0x0, 0xcc, 0x0, 0xd3, 0x0, 0xdc, 0x0, 0xee,\n                                                    0x0, 0xff, 0x1, 0x7, 0x1, 0x1b, 0x1, 0x30,\n                                                    0x1, 0x37, 0x1, 0x43, 0x1, 0x65, 0x1, 0x6e,\n                                                    0x1, 0x79, 0x1, 0x7e, 0x1, 0x89, 0x1, 0xbd,\n                                                    0x1, 0xda, 0x1, 0xe0, 0x1, 0xe7, 0x2, 0x1c,\n                                                    0x2, 0x29, 0x2, 0x34, 0x2, 0x3c, 0x2, 0x52,\n                                                    0x2, 0x5f, 0x2, 0x78, 0x2, 0x91, 0x2, 0xbb,\n                                                    0x2, 0xcc, 0x2, 0xd2, 0x2, 0xe0, 0x2, 0xf6,\n                                                    0x2, 0xfe, 0x3, 0xc, 0x3, 0x14, 0x3, 0x1e,\n                                                    0x3, 0x28, 0x3, 0x34, 0x3, 0x47, 0x3, 0x52,\n                                                    0x3, 0x74, 0x3, 0x7b, 0x3, 0x9b, 0x3, 0xba,\n                                                    0x3, 0xbe, 0x3, 0xcc, 0x3, 0xd7, 0x3, 0xf1,\n                                                    0x3, 0xf9, 0x3, 0xff, 0x4, 0x14, 0x4, 0x1b,\n                                                    0x4, 0x28, 0x4, 0x2f, 0x4, 0x36, 0x4, 0x3e,\n                                                    0x4, 0x53, 0x4, 0x5f, 0x4, 0x65, 0x4, 0x78,\n                                                    0x4, 0x85, 0x4, 0x90, 0x4, 0xa2, 0x4, 0xb4,\n                                                    0x4, 0xbd, 0x4, 0xcf, 0x4, 0xe1, 0x4, 0xe9,\n                                                    0x4, 0xef, 0x4, 0xf5, 0x4, 0xfb, 0x5, 0x4,\n                                                    0x5, 0x15, 0x5, 0x1c, 0x5, 0x26, 0x5, 0x35,\n                                                    0x5, 0x44, 0x5, 0x4d, 0x5, 0x54, 0x5, 0x5a,\n                                                    0x5, 0x5f, 0x5, 0x68, 0x5, 0x6b, 0x5, 0x78,\n                                                    0x5, 0x80, 0x5, 0x85, 0x5, 0x91, 0x5, 0x97,\n                                                    0x5, 0x9b, 0x5, 0xa6, 0x5, 0xaa, 0x5, 0xb3,\n                                                    0x5, 0xba, 0x5, 0xbf, 0x5, 0xc4, 0x5, 0xce,\n                                                    0x5, 0xd8, 0x5, 0xdf, 0x5, 0xe9, 0x5, 0xf3,\n                                                    0x5, 0xf7, 0x6, 0x0, 0x6, 0x9, 0x6, 0x12,\n                                                    0x6, 0x1b, 0x6, 0x23, 0x6, 0x2c, 0x6, 0x32,\n                                                    0x6, 0x38, 0x6, 0x3d, 0x6, 0x41, 0x6, 0x45,\n                                                    0x9a, 0x16, 0xf7, 0x5a, 0x9e, 0x6, 0x76, 0x5c,\n                                                    0x95, 0xb5, 0x96, 0x8e, 0x99, 0x90, 0x98, 0x1f,\n                                                    0xb9, 0xf6, 0x5, 0xf7, 0x9a, 0x6, 0xb4, 0x35,\n                                                    0x5, 0x91, 0x7d, 0x98, 0x6a, 0x7b, 0x1a, 0x66,\n                                                    0x6a, 0x80, 0x66, 0x1e, 0x78, 0xf7, 0x93, 0x9e,\n                                                    0x7, 0x5f, 0x8e, 0x7d, 0xa0, 0x6b, 0xd4, 0xfb,\n                                                    0x8d, 0xf8, 0xc2, 0x18, 0xb, 0x20, 0xa, 0x77,\n                                                    0x6, 0xfb, 0x64, 0xfc, 0x7f, 0xb, 0x32, 0xa,\n                                                    0xfb, 0x6b, 0x52, 0xa, 0x73, 0x2c, 0x1d, 0xbc,\n                                                    0xc7, 0xb9, 0xbd, 0xb2, 0x1e, 0xb, 0x3, 0x31,\n                                                    0x1d, 0xfb, 0x2f, 0x54, 0x5, 0x7c, 0x7, 0x8d,\n                                                    0x98, 0x98, 0x53, 0x1d, 0x50, 0x1f, 0xfb, 0x72,\n                                                    0x7, 0x3d, 0x7a, 0x7b, 0x4d, 0x88, 0x1e, 0xb,\n                                                    0x21, 0x1d, 0xe, 0x15, 0x87, 0xa, 0x8, 0x22,\n                                                    0xa, 0x2e, 0x7, 0xb, 0x6f, 0xa, 0x44, 0x80,\n                                                    0x77, 0x73, 0x32, 0x1b, 0xfb, 0x24, 0xf7, 0x46,\n                                                    0x6, 0xc2, 0x97, 0xa2, 0x33, 0x1d, 0x78, 0x6,\n                                                    0x60, 0xa, 0xfc, 0x3c, 0x7, 0xb, 0x77, 0x1,\n                                                    0xea, 0xdf, 0x23, 0xa, 0xb, 0x26, 0x1d, 0x3d,\n                                                    0x1d, 0xb, 0x28, 0x1d, 0x13, 0xd6, 0x3e, 0x1d,\n                                                    0x13, 0xba, 0x3c, 0x1d, 0xe, 0x8c, 0xfb, 0x57,\n                                                    0x15, 0x43, 0x90, 0xb5, 0x80, 0x2f, 0xa, 0xb,\n                                                    0xf7, 0x3, 0xf7, 0x24, 0xc5, 0xf7, 0x1c, 0xaa,\n                                                    0x95, 0x1f, 0x7b, 0x92, 0x5, 0x66, 0x74, 0x60,\n                                                    0x47, 0x32, 0x1b, 0x49, 0x3a, 0xaa, 0xf7, 0x45,\n                                                    0x7f, 0x1f, 0xb, 0x15, 0xf8, 0xb0, 0x6, 0x23,\n                                                    0x1d, 0xe, 0x3a, 0x1d, 0x72, 0x88, 0x8b, 0x7b,\n                                                    0x1b, 0x6c, 0xb, 0x7b, 0x8a, 0x8, 0xf7, 0x5d,\n                                                    0xf7, 0x82, 0x15, 0xf7, 0x7, 0xf7, 0xa7, 0xf7,\n                                                    0x8, 0xfb, 0xa7, 0x5, 0xb, 0x9d, 0x1b, 0x9b,\n                                                    0xaa, 0x8c, 0xbc, 0xb5, 0x1f, 0xa5, 0x7, 0x82,\n                                                    0x80, 0x7e, 0x81, 0x76, 0x1b, 0xb, 0x6f, 0xa1,\n                                                    0x35, 0x1d, 0x75, 0x62, 0x1d, 0xb, 0x15, 0xc9,\n                                                    0x6, 0xf7, 0x11, 0xf7, 0x3b, 0x5, 0x69, 0x6,\n                                                    0xfb, 0xe, 0x24, 0xfb, 0xd, 0xf2, 0x5, 0x69,\n                                                    0x6, 0xe, 0x99, 0x7, 0x4f, 0x89, 0x89, 0xa2,\n                                                    0xaf, 0x1a, 0xf7, 0xeb, 0xfb, 0x32, 0x7a, 0x7,\n                                                    0xd1, 0x89, 0x8f, 0x6c, 0x63, 0x1a, 0xb, 0x8c,\n                                                    0x8f, 0x8e, 0x8c, 0x38, 0x1d, 0xb, 0x61, 0xa,\n                                                    0xfb, 0x0, 0x44, 0x1d, 0xd4, 0xf1, 0xf1, 0xf7,\n                                                    0x3, 0xb, 0x15, 0xf7, 0x53, 0xa3, 0x6, 0x65,\n                                                    0x8d, 0x78, 0x9a, 0xa8, 0x1a, 0xf7, 0xe1, 0x7,\n                                                    0x7d, 0x8e, 0xfb, 0xa, 0x54, 0x5, 0x74, 0x7,\n                                                    0x98, 0xaf, 0x8b, 0x8b, 0x93, 0x1b, 0x92, 0x8b,\n                                                    0x7c, 0x7e, 0x1f, 0xb, 0x6f, 0xa0, 0x75, 0x9a,\n                                                    0x1d, 0xa1, 0x41, 0x1d, 0xb, 0x9d, 0xac, 0xa9,\n                                                    0xba, 0x80, 0x43, 0x1e, 0x4e, 0x4f, 0xa, 0xb,\n                                                    0xf9, 0x63, 0x25, 0x1d, 0xb, 0x92, 0x92, 0x86,\n                                                    0x82, 0x78, 0x7b, 0x5e, 0x49, 0x61, 0x1f, 0xb,\n                                                    0xf8, 0x4c, 0xfc, 0xb8, 0x5, 0x9c, 0xf8, 0x98,\n                                                    0x6, 0xf7, 0x9, 0xab, 0x99, 0xca, 0x92, 0x1e,\n                                                    0x9e, 0xfb, 0x7f, 0x78, 0x7, 0xcf, 0x86, 0xa7,\n                                                    0x79, 0xfb, 0x7, 0x1a, 0xfb, 0xd8, 0x89, 0x7,\n                                                    0xfc, 0x13, 0xf8, 0x75, 0x5, 0xfb, 0x3f, 0x78,\n                                                    0x6, 0xb3, 0x9b, 0x86, 0x59, 0xb4, 0x1f, 0xfc,\n                                                    0x43, 0x78, 0xa, 0xb, 0xfb, 0x7, 0xf7, 0x87,\n                                                    0x5, 0x88, 0x92, 0x84, 0x9b, 0x98, 0x1a, 0xa6,\n                                                    0xae, 0x96, 0xa2, 0x8c, 0x1e, 0x9a, 0xfb, 0x62,\n                                                    0x7d, 0x7, 0x98, 0x89, 0xa5, 0x7c, 0x97, 0x72,\n                                                    0xb, 0x3f, 0xa, 0x7c, 0x60, 0x63, 0xb, 0xa7,\n                                                    0xa7, 0x75, 0xa1, 0x6f, 0x6f, 0xb, 0x15, 0xfb,\n                                                    0x53, 0xf7, 0x2a, 0xfb, 0x2d, 0xf7, 0x56, 0xf7,\n                                                    0x53, 0xf7, 0x29, 0xf7, 0x2d, 0xf7, 0x53, 0xf7,\n                                                    0x53, 0xfb, 0x29, 0xf7, 0x2f, 0xfb, 0x53, 0xfb,\n                                                    0x56, 0xfb, 0x2a, 0xfb, 0x2f, 0xfb, 0x53, 0x1e,\n                                                    0xc2, 0x16, 0xf7, 0x35, 0xf7, 0x12, 0xf7, 0x23,\n                                                    0xf7, 0x37, 0xf7, 0x34, 0xf7, 0x11, 0xfb, 0x22,\n                                                    0xfb, 0x36, 0xb, 0xa9, 0x95, 0xdd, 0xcd, 0xd2,\n                                                    0x1a, 0xde, 0x51, 0x98, 0x74, 0x72, 0x6a, 0xb,\n                                                    0x6e, 0x8b, 0xa8, 0xa8, 0x1f, 0xf7, 0x57, 0x7,\n                                                    0xc7, 0x8b, 0xb, 0x45, 0xa, 0x9a, 0xb4, 0x9f,\n                                                    0x4a, 0xa, 0xb, 0x77, 0x1, 0xf7, 0x7, 0xf1,\n                                                    0x3, 0x9d, 0x16, 0xf7, 0xbd, 0x9e, 0x6, 0x59,\n                                                    0xa, 0x9e, 0xfb, 0xbd, 0x78, 0x7, 0x49, 0xa,\n                                                    0xb, 0x6f, 0xa0, 0x76, 0xa7, 0xa7, 0xa1, 0xa0,\n                                                    0xa7, 0xa7, 0x75, 0x55, 0x1d, 0xb, 0xa0, 0x6,\n                                                    0x95, 0xc2, 0xa1, 0xf7, 0x3, 0xa7, 0x1a, 0xa6,\n                                                    0x74, 0xa3, 0x78, 0x77, 0x74, 0x73, 0x70, 0x6f,\n                                                    0xa1, 0xfb, 0x3, 0x95, 0x54, 0x1e, 0xb, 0x7e,\n                                                    0x6c, 0x9d, 0x70, 0x1b, 0x5d, 0x89, 0x65, 0x85,\n                                                    0x71, 0xa2, 0x6b, 0xbd, 0xd6, 0xb7, 0xcd, 0xf7,\n                                                    0x1a, 0xbe, 0x1f, 0xf7, 0x2e, 0xf8, 0x22, 0xb,\n                                                    0x7, 0xf7, 0xf, 0x44, 0xa6, 0x5d, 0x50, 0x65,\n                                                    0x68, 0x5d, 0x5a, 0x1e, 0xda, 0x7, 0x84, 0x8d,\n                                                    0x5d, 0x7a, 0x5c, 0x7c, 0x5e, 0x7e, 0x19, 0x7a,\n                                                    0x7, 0x8d, 0x8f, 0x96, 0x53, 0x1d, 0x4c, 0x1f,\n                                                    0xfb, 0x82, 0x7, 0x50, 0x7a, 0x74, 0x5c, 0x88,\n                                                    0x1e, 0xb, 0xfb, 0x42, 0x8b, 0xf7, 0x1f, 0xcb,\n                                                    0x1e, 0xf7, 0xca, 0x7, 0xd2, 0x97, 0xa2, 0xda,\n                                                    0x91, 0x1e, 0xb, 0x15, 0x46, 0x1d, 0x33, 0xa,\n                                                    0xb, 0xde, 0x87, 0x99, 0x75, 0x41, 0x89, 0x1d,\n                                                    0x44, 0x7f, 0x70, 0x36, 0x89, 0x1e, 0xb, 0x97,\n                                                    0x98, 0x8d, 0x19, 0x9a, 0xfb, 0x1b, 0x7c, 0x7,\n                                                    0xab, 0x8c, 0x9b, 0x77, 0x78, 0x1a, 0x82, 0x7e,\n                                                    0x6b, 0x81, 0x70, 0x1e, 0xb, 0x36, 0xa, 0xf7,\n                                                    0x5b, 0x16, 0x36, 0xa, 0xe, 0x83, 0x1d, 0x96,\n                                                    0xad, 0xb1, 0x1b, 0x97, 0x98, 0x86, 0x45, 0x1d,\n                                                    0x76, 0x99, 0xb, 0x2a, 0xa, 0x40, 0xa, 0xef,\n                                                    0xfb, 0x29, 0xb, 0x6, 0xf7, 0x3, 0xa5, 0x7b,\n                                                    0x32, 0x9a, 0x1f, 0xa4, 0xb, 0x7, 0xfb, 0x37,\n                                                    0x4b, 0x34, 0x69, 0x27, 0x1a, 0x48, 0xb, 0x42,\n                                                    0x1d, 0x96, 0x9a, 0xac, 0xb6, 0xa9, 0xb3, 0x8,\n                                                    0xa8, 0xb2, 0xb, 0x82, 0x9e, 0x5, 0x6d, 0x81,\n                                                    0x39, 0x49, 0x44, 0x1a, 0x38, 0xc5, 0x7e, 0xa2,\n                                                    0xa4, 0xac, 0x9a, 0xb6, 0xb3, 0xb, 0x7, 0x6a,\n                                                    0x84, 0x81, 0x82, 0x83, 0x1e, 0x75, 0x70, 0x6d,\n                                                    0xb, 0xf8, 0x31, 0xe5, 0x15, 0xf7, 0x48, 0x31,\n                                                    0xd1, 0xe5, 0xc2, 0xc4, 0x54, 0xf7, 0x96, 0x5c,\n                                                    0x6, 0xfb, 0x5f, 0xfb, 0x9e, 0x5, 0xb8, 0x93,\n                                                    0x15, 0xf7, 0x19, 0xf7, 0x44, 0x5, 0x8d, 0xfb,\n                                                    0x44, 0x6, 0xb, 0x1b, 0x48, 0x6d, 0x4d, 0x5f,\n                                                    0x7d, 0xa, 0x1b, 0x31, 0x30, 0x53, 0xfb, 0x6,\n                                                    0x28, 0xcb, 0x5f, 0xe7, 0x56, 0x1f, 0xf7, 0x27,\n                                                    0x35, 0x9b, 0x69, 0x52, 0x1a, 0x55, 0x63, 0x52,\n                                                    0x3b, 0xfb, 0x1b, 0x58, 0xf7, 0x16, 0xba, 0x78,\n                                                    0x1e, 0xb, 0x6, 0xb0, 0xe0, 0x7a, 0x92, 0x7c,\n                                                    0x73, 0x7f, 0x89, 0x73, 0x8a, 0x19, 0xfb, 0xd,\n                                                    0x6, 0xe1, 0xe0, 0x5, 0xa8, 0xa7, 0xc2, 0xc1,\n                                                    0xcd, 0x1a, 0xce, 0x52, 0xb4, 0x48, 0x40, 0x5a,\n                                                    0xb, 0x7d, 0x97, 0x7d, 0xa, 0xf7, 0x67, 0xf7,\n                                                    0x51, 0x5, 0xa9, 0x5d, 0xfb, 0x2c, 0xf7, 0x38,\n                                                    0x51, 0x1d, 0xb, 0x41, 0x8d, 0x73, 0x60, 0x1d,\n                                                    0xa4, 0x9c, 0xd4, 0x8e, 0x1e, 0xb, 0xf7, 0x8a,\n                                                    0x7, 0xb1, 0x91, 0xc3, 0xa7, 0xaf, 0x1b, 0xf7,\n                                                    0xe, 0x90, 0xfb, 0x36, 0x74, 0xfb, 0x42, 0x31,\n                                                    0x78, 0x6a, 0x54, 0x5c, 0xb6, 0xa2, 0x1f, 0xe,\n                                                    0xf8, 0x1, 0x7d, 0xaf, 0xf8, 0xfe, 0xaf, 0xb,\n                                                    0x88, 0x1d, 0x13, 0xb8, 0x54, 0x1d, 0x7, 0x87,\n                                                    0x8d, 0x56, 0x7a, 0x56, 0x7d, 0x56, 0x6f, 0x1d,\n                                                    0x97, 0x94, 0x8c, 0x98, 0x1b, 0xb2, 0x91, 0x7b,\n                                                    0x5e, 0x1f, 0xb, 0x72, 0x1d, 0xec, 0xf7, 0x70,\n                                                    0x1e, 0xb, 0x97, 0x16, 0xf7, 0x7f, 0x9e, 0x6,\n                                                    0x42, 0x8e, 0x76, 0xab, 0xf2, 0x1a, 0xb, 0xca,\n                                                    0x86, 0xa3, 0x7b, 0x3c, 0x1a, 0xb, 0xfb, 0x38,\n                                                    0xfb, 0x38, 0xfb, 0x37, 0xb, 0x97, 0x16, 0xf8,\n                                                    0xb0, 0x6, 0x39, 0x1d, 0xb, 0x1b, 0x75, 0x7e,\n                                                    0x78, 0x7a, 0x5b, 0xc8, 0x88, 0x9a, 0xf7, 0x29,\n                                                    0xbe, 0xdd, 0xbc, 0xd7, 0x56, 0xa9, 0x6a, 0x97,\n                                                    0x1f, 0xb, 0x1b, 0x84, 0x84, 0x90, 0x94, 0x9e,\n                                                    0x9b, 0xb8, 0xcd, 0xb5, 0x1f, 0xb, 0xad, 0x94,\n                                                    0x1f, 0x6e, 0x6, 0xb, 0xa7, 0x5a, 0xa9, 0x1f,\n                                                    0xfb, 0x0, 0xcb, 0x5, 0x66, 0xa1, 0x85, 0xa8,\n                                                    0x9f, 0x1a, 0xa5, 0xa0, 0xb2, 0xc2, 0xb, 0x15,\n                                                    0x54, 0xb7, 0x5f, 0xc2, 0x79, 0x1d, 0x54, 0x5f,\n                                                    0x5e, 0x54, 0x1e, 0xb, 0xf7, 0x6a, 0x16, 0xf7,\n                                                    0xc6, 0x9e, 0x6, 0x31, 0x8c, 0x7e, 0xb, 0xfb,\n                                                    0x34, 0xfb, 0x13, 0xfb, 0x22, 0xfb, 0x32, 0xfb,\n                                                    0x36, 0xfb, 0x13, 0xf7, 0x22, 0xf7, 0x34, 0x1e,\n                                                    0xb, 0x1, 0xc0, 0x9d, 0x3, 0xa6, 0x16, 0xf8,\n                                                    0xd, 0x6, 0x99, 0xf7, 0x1b, 0x79, 0x8f, 0x5,\n                                                    0x3d, 0x7b, 0xb, 0x6f, 0xa0, 0x76, 0x9a, 0x1d,\n                                                    0xa0, 0x41, 0x1d, 0xb, 0xa3, 0x9e, 0x9e, 0xa3,\n                                                    0xa3, 0x78, 0x9e, 0x73, 0x73, 0x78, 0x78, 0x73,\n                                                    0x73, 0x9e, 0x78, 0xa3, 0x1f, 0xb, 0x1, 0xef,\n                                                    0xf1, 0xf7, 0x7b, 0xf7, 0x1, 0x3, 0x9b, 0x16,\n                                                    0xf7, 0xac, 0x9e, 0x6, 0x3e, 0x8d, 0x7a, 0xb,\n                                                    0xf8, 0x1, 0x7d, 0xb7, 0xf9, 0xc, 0x77, 0xb,\n                                                    0xa2, 0xf7, 0x7c, 0x74, 0x6, 0xb, 0x15, 0xfb,\n                                                    0x69, 0xf7, 0x26, 0xb, 0x81, 0xa7, 0xf8, 0x32,\n                                                    0xa7, 0xb, 0x77, 0x1, 0xf7, 0xcf, 0xf1, 0x3,\n                                                    0x68, 0xa, 0xb, 0x1, 0xdb, 0xdf, 0xf7, 0x44,\n                                                    0xdf, 0x3, 0x9b, 0x16, 0xf7, 0x6a, 0x9a, 0x6,\n                                                    0x57, 0x8e, 0x7d, 0xb, 0x7b, 0x1d, 0xf8, 0x3e,\n                                                    0x9a, 0xa, 0xb, 0x5, 0x82, 0x98, 0x83, 0x9e,\n                                                    0x96, 0x1a, 0xa7, 0xa4, 0xb, 0x5a, 0x6a, 0xad,\n                                                    0x5f, 0x1b, 0x70, 0x78, 0x7a, 0x71, 0x71, 0x9e,\n                                                    0x7a, 0xa6, 0x1f, 0xb, 0x15, 0xa2, 0x8e, 0x5,\n                                                    0xc6, 0x88, 0xb7, 0x6a, 0x58, 0x1a, 0x72, 0x7e,\n                                                    0x62, 0x4f, 0xb, 0x7, 0xfb, 0x0, 0x76, 0x72,\n                                                    0x3f, 0x86, 0x1e, 0xb, 0xc1, 0x76, 0xf8, 0x13,\n                                                    0x77, 0x1, 0xb, 0x74, 0x78, 0x4b, 0x87, 0x1e,\n                                                    0xb, 0xf7, 0x92, 0x8b, 0xb1, 0xb, 0x6e, 0xa,\n                                                    0xf7, 0x8c, 0x77, 0x1, 0xf3, 0xf1, 0xb, 0x83,\n                                                    0x1f, 0xe, 0x7, 0xb0, 0xb1, 0xaa, 0x9f, 0xa9,\n                                                    0x1b, 0xc6, 0x9d, 0x67, 0x4e, 0x1f, 0xb, 0xee,\n                                                    0xf1, 0xf7, 0x9c, 0xa2, 0xac, 0xa4, 0xb, 0xfb,\n                                                    0x10, 0xfb, 0x23, 0xb, 0x7b, 0xa0, 0xa0, 0xaf,\n                                                    0x9c, 0xb0, 0xaa, 0x70, 0xa5, 0x6d, 0x6d, 0xb,\n                                                    0x8b, 0x91, 0x1b, 0xb7, 0x8b, 0xb, 0xa0, 0x8a,\n                                                    0x1d, 0xb, 0x12, 0xb0, 0xe3, 0x46, 0xe3, 0xf7,\n                                                    0x23, 0xdc, 0x13, 0xda, 0xb, 0x74, 0xa, 0xad,\n                                                    0xb, 0x65, 0x1a, 0x4f, 0x3e, 0x97, 0x60, 0x9a,\n                                                    0x1e, 0xe, 0xba, 0x9c, 0xb1, 0x9a, 0xc1, 0x99,\n                                                    0xb, 0x9e, 0xfb, 0xaf, 0x7, 0xb, 0x66, 0xc1,\n                                                    0xe9, 0x99, 0xb, 0xf7, 0x5d, 0xbc, 0x12, 0x13,\n                                                    0x80, 0xf7, 0x5d, 0x4, 0xb, 0xba, 0xf7, 0x66,\n                                                    0xf7, 0x5, 0xfb, 0x2, 0xfb, 0x4f, 0xb, 0xf7,\n                                                    0xb3, 0xf7, 0xa0, 0x70, 0x1d, 0xb, 0x7, 0x43,\n                                                    0x8b, 0x6a, 0x37, 0x85, 0x1e, 0xf7, 0x4e, 0xb,\n                                                    0xfb, 0x5b, 0x15, 0x80, 0xa0, 0xa7, 0x86, 0xa7,\n                                                    0x1b, 0xb, 0x3c, 0xa0, 0x76, 0xb, 0x77, 0x1,\n                                                    0xd2, 0xdf, 0xf7, 0x46, 0xdf, 0x3, 0xb, 0x73,\n                                                    0xf8, 0xa4, 0x76, 0xf7, 0x3b, 0x77, 0x1, 0xb,\n                                                    0xf7, 0xf, 0xfb, 0x34, 0x76, 0xf9, 0xf1, 0x77,\n                                                    0xb, 0xa9, 0xaf, 0xaf, 0xa9, 0x6d, 0x67, 0x67,\n                                                    0x6d, 0xb, 0x8f, 0x7b, 0x1b, 0x6c, 0x8a, 0x81,\n                                                    0x1d, 0xb, 0x7b, 0x69, 0x29, 0x78, 0xe2, 0xc0,\n                                                    0x7f, 0x1e, 0xb, 0xfb, 0x6e, 0xdf, 0x37, 0xf1,\n                                                    0xb, 0xf7, 0x54, 0xfb, 0x41, 0x77, 0xb, 0x1a,\n                                                    0xfb, 0x38, 0x7, 0xb, 0x72, 0x6b, 0x1e, 0xb,\n                                                    0xf7, 0x6, 0x3, 0xb\n                                                   };\n"
  },
  {
    "path": "core/src/fxge/fontdata/chromefontdata/FoxitSerifBold.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nconst unsigned char g_FoxitSerifBoldFontData [19395] = {0x1,\n                                                        0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x13,\n                                                        0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72,\n                                                        0x69, 0x66, 0x4f, 0x54, 0x46, 0x2d, 0x42, 0x6f,\n                                                        0x6c, 0x64, 0x0, 0x1, 0x1, 0x1, 0x26, 0xf8,\n                                                        0x10, 0x0, 0xf8, 0x1c, 0x1, 0xf8, 0x1d, 0x2,\n                                                        0xf8, 0x1e, 0x3, 0xf8, 0x14, 0x4, 0xfb, 0x3c,\n                                                        0xfb, 0x8e, 0xfa, 0x7c, 0xfa, 0xd, 0x5, 0x1c,\n                                                        0x7, 0x67, 0xf, 0x1c, 0x8, 0xbe, 0x11, 0xaf,\n                                                        0x1c, 0x44, 0x8e, 0x12, 0x0, 0x4, 0x1, 0x1,\n                                                        0x5, 0x2f, 0x43, 0x52, 0x45, 0x75, 0x72, 0x6f,\n                                                        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                        0x20, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20,\n                                                        0x53, 0x65, 0x72, 0x69, 0x66, 0x20, 0x4f, 0x54,\n                                                        0x46, 0x20, 0x42, 0x6f, 0x6c, 0x64, 0x43, 0x68,\n                                                        0x72, 0x6F, 0x6D, 0x20, 0x53, 0x65, 0x72, 0x69,\n                                                        0x66, 0x20, 0x4f, 0x54, 0x46, 0x0, 0x7b, 0x2,\n                                                        0x0, 0x1, 0x0, 0xf, 0x0, 0x4f, 0x0, 0x54,\n                                                        0x0, 0x62, 0x0, 0x6d, 0x0, 0x78, 0x0, 0x96,\n                                                        0x0, 0xbb, 0x0, 0xbe, 0x0, 0xc7, 0x0, 0xd6,\n                                                        0x0, 0xdc, 0x0, 0xef, 0x0, 0xf8, 0x1, 0x5,\n                                                        0x1, 0x12, 0x1, 0x38, 0x1, 0x45, 0x1, 0x53,\n                                                        0x1, 0x5a, 0x1, 0x6b, 0x1, 0x73, 0x1, 0x7e,\n                                                        0x1, 0x87, 0x1, 0x8b, 0x1, 0x9b, 0x1, 0xa6,\n                                                        0x1, 0xab, 0x1, 0xb6, 0x1, 0xce, 0x1, 0xe8,\n                                                        0x1, 0xf3, 0x1, 0xfa, 0x2, 0x21, 0x2, 0x33,\n                                                        0x2, 0x38, 0x2, 0x41, 0x2, 0x4b, 0x2, 0x70,\n                                                        0x2, 0x94, 0x2, 0xa2, 0x2, 0xad, 0x2, 0xcf,\n                                                        0x2, 0xd5, 0x2, 0xe0, 0x2, 0xec, 0x2, 0xf2,\n                                                        0x3, 0x8, 0x3, 0x10, 0x3, 0x17, 0x3, 0x20,\n                                                        0x3, 0x29, 0x3, 0x30, 0x3, 0x37, 0x3, 0x3b,\n                                                        0x3, 0x48, 0x3, 0x53, 0x3, 0x61, 0x3, 0x79,\n                                                        0x3, 0x7f, 0x3, 0x87, 0x3, 0x8f, 0x3, 0x96,\n                                                        0x3, 0x9d, 0x3, 0xb2, 0x3, 0xb6, 0x3, 0xc0,\n                                                        0x3, 0xc6, 0x3, 0xcf, 0x3, 0xd5, 0x3, 0xdb,\n                                                        0x3, 0xef, 0x3, 0xfe, 0x4, 0x9, 0x4, 0x14,\n                                                        0x4, 0x1b, 0x4, 0x2d, 0x4, 0x35, 0x4, 0x41,\n                                                        0x4, 0x47, 0x4, 0x4d, 0x4, 0x5e, 0x4, 0x6f,\n                                                        0x4, 0x79, 0x4, 0x89, 0x4, 0x98, 0x4, 0xa5,\n                                                        0x4, 0xae, 0x4, 0xb3, 0x4, 0xb8, 0x4, 0xc6,\n                                                        0x4, 0xd4, 0x4, 0xe1, 0x4, 0xee, 0x4, 0xf1,\n                                                        0x4, 0xf5, 0x5, 0x1, 0x5, 0xb, 0x5, 0x11,\n                                                        0x5, 0x17, 0x5, 0x20, 0x5, 0x2b, 0x5, 0x36,\n                                                        0x5, 0x41, 0x5, 0x48, 0x5, 0x4d, 0x5, 0x51,\n                                                        0x5, 0x54, 0x5, 0x5e, 0x5, 0x68, 0x5, 0x72,\n                                                        0x5, 0x7c, 0x5, 0x86, 0x5, 0x90, 0x5, 0x9a,\n                                                        0x5, 0x9e, 0x5, 0xa7, 0x5, 0xb0, 0x5, 0xb9,\n                                                        0x5, 0xc0, 0x5, 0xc6, 0x5, 0xcb, 0x5, 0xcf,\n                                                        0x15, 0x3a, 0xa, 0x20, 0xa, 0x7f, 0x6d, 0x88,\n                                                        0x86, 0x55, 0x83, 0x19, 0x31, 0x1d, 0x3c, 0xa,\n                                                        0x71, 0x29, 0x1b, 0x4a, 0x78, 0x97, 0xb7, 0x1f,\n                                                        0xf7, 0x86, 0x7, 0xee, 0xb4, 0x6d, 0xfb, 0x11,\n                                                        0x97, 0x1f, 0xaf, 0xf7, 0xe6, 0x67, 0x6, 0xfb,\n                                                        0x10, 0x7c, 0x62, 0x72, 0x2b, 0x1b, 0xf7, 0x6d,\n                                                        0x7, 0xb6, 0x9d, 0x9e, 0xc2, 0xf7, 0x1b, 0xc8,\n                                                        0x72, 0xfb, 0x22, 0xa2, 0x1e, 0xae, 0xf7, 0x5d,\n                                                        0xfc, 0xd5, 0x53, 0x1d, 0xfc, 0x81, 0x7, 0x4d,\n                                                        0x6c, 0x9b, 0x52, 0x85, 0x1e, 0xb, 0x15, 0xc3,\n                                                        0x22, 0xa, 0xb, 0x32, 0x1d, 0x31, 0xa, 0x2d,\n                                                        0xb6, 0xfb, 0x3, 0xfb, 0x10, 0x51, 0x3a, 0x1d,\n                                                        0xb, 0x29, 0xa, 0x80, 0x7f, 0xa, 0x9a, 0x7c,\n                                                        0xa4, 0x7c, 0x1f, 0xb, 0x27, 0x1d, 0x69, 0x7,\n                                                        0xb4, 0x84, 0x93, 0x7f, 0x38, 0xa, 0xb, 0x3f,\n                                                        0xc9, 0x6c, 0xbb, 0xa3, 0xd1, 0x90, 0xcc, 0xcc,\n                                                        0x1e, 0x8a, 0xb7, 0x15, 0x7b, 0x7d, 0x74, 0x70,\n                                                        0x69, 0x1b, 0x67, 0x7c, 0xaf, 0xaa, 0xe2, 0xee,\n                                                        0xa8, 0xa2, 0x90, 0x1f, 0xb, 0x5e, 0x8c, 0x80,\n                                                        0x9d, 0xb2, 0x1a, 0xf7, 0xfc, 0xfb, 0x5d, 0x69,\n                                                        0x7, 0xad, 0x88, 0xa7, 0x8a, 0x54, 0x1a, 0xfb,\n                                                        0xa5, 0x7, 0x78, 0x78, 0x72, 0x72, 0x65, 0x1b,\n                                                        0x54, 0x8a, 0xb6, 0xa7, 0x1f, 0xf7, 0xe7, 0xfb,\n                                                        0x50, 0xb, 0x22, 0x1d, 0xe, 0x4e, 0xa, 0xed,\n                                                        0xf7, 0x4, 0x29, 0x2e, 0xa, 0xb, 0x67, 0xa8,\n                                                        0x74, 0xa, 0xa8, 0xa8, 0xaf, 0xaf, 0x6e, 0x61,\n                                                        0xa, 0x6e, 0x61, 0x1d, 0xb, 0x34, 0xa, 0x1f,\n                                                        0x39, 0x1d, 0xb, 0x64, 0x8f, 0x83, 0xa1, 0xaa,\n                                                        0x1a, 0xf8, 0x6, 0xfb, 0x54, 0x69, 0x7, 0xb1,\n                                                        0x84, 0x9a, 0x84, 0x5e, 0x1a, 0xb, 0x15, 0x2e,\n                                                        0x1d, 0xf7, 0x66, 0x16, 0x2e, 0x1d, 0xe, 0x67,\n                                                        0xa7, 0x6f, 0xaf, 0xaf, 0xa8, 0xa7, 0xaf, 0xaf,\n                                                        0x6e, 0x6f, 0x1d, 0xb, 0xf7, 0xeb, 0xbf, 0x15,\n                                                        0x4a, 0x7, 0xc4, 0x9e, 0x99, 0x8c, 0x28, 0xa,\n                                                        0xb, 0x33, 0xbc, 0x31, 0xef, 0xef, 0xbc, 0xe5,\n                                                        0xe3, 0xe3, 0x5a, 0xe5, 0x27, 0x27, 0x5a, 0x31,\n                                                        0x33, 0x1e, 0xf7, 0x6, 0x16, 0xd0, 0x8b, 0xe0,\n                                                        0xae, 0xae, 0x8b, 0x36, 0x46, 0x46, 0x8b, 0x36,\n                                                        0x68, 0x68, 0x8b, 0xe0, 0xd0, 0x1e, 0xb, 0xf7,\n                                                        0x48, 0xf7, 0x5d, 0x15, 0xe9, 0xf7, 0x87, 0xf0,\n                                                        0xfb, 0x87, 0x5, 0xe, 0x15, 0x6f, 0x91, 0x93,\n                                                        0x61, 0xd1, 0x1b, 0xb8, 0xb0, 0xa3, 0xac, 0xa7,\n                                                        0x1f, 0xb, 0xc0, 0xa9, 0xf7, 0x5, 0x3d, 0xa,\n                                                        0xb, 0x54, 0x8f, 0x63, 0x8e, 0xcb, 0x1a, 0xf8,\n                                                        0x64, 0x7, 0xcf, 0xbb, 0x8c, 0xba, 0x8d, 0x1e,\n                                                        0xae, 0xb, 0x5c, 0xa, 0xf7, 0x8b, 0x77, 0x27,\n                                                        0xa, 0xb, 0x94, 0x1a, 0x13, 0xbc, 0x3b, 0xa,\n                                                        0x13, 0x8c, 0x24, 0xa, 0xe, 0x2a, 0xa, 0x85,\n                                                        0x93, 0x85, 0x92, 0x94, 0x1a, 0xb, 0x16, 0x2a,\n                                                        0x1d, 0xe, 0x73, 0x99, 0x5, 0x74, 0x78, 0x68,\n                                                        0x5f, 0x50, 0x1b, 0x2c, 0x75, 0xf1, 0xe0, 0x88,\n                                                        0x1f, 0xb, 0x4e, 0x4c, 0x47, 0xc1, 0x8b, 0x97,\n                                                        0xbf, 0x9a, 0xb1, 0x9d, 0xb, 0x3b, 0xa, 0x24,\n                                                        0xa, 0xb, 0x65, 0x1d, 0xf7, 0x7f, 0x45, 0xa,\n                                                        0xfb, 0x25, 0x5f, 0x1d, 0xb, 0x9a, 0x1a, 0xa7,\n                                                        0x97, 0x91, 0xd0, 0x1e, 0xae, 0xfb, 0xe3, 0x68,\n                                                        0x7, 0xbe, 0x88, 0xa3, 0x60, 0x90, 0x82, 0xf7,\n                                                        0x4b, 0xfb, 0xd6, 0x18, 0xb, 0xfc, 0x31, 0x15,\n                                                        0xf7, 0x89, 0xa9, 0x6, 0x4b, 0x85, 0x9b, 0xb3,\n                                                        0x1f, 0xf7, 0xdb, 0x46, 0xa, 0xfb, 0x67, 0x7,\n                                                        0x65, 0x87, 0x74, 0x40, 0x8c, 0x1e, 0xb, 0x9f,\n                                                        0xa1, 0x92, 0x70, 0x53, 0x3a, 0x52, 0x6f, 0x78,\n                                                        0x1f, 0xb, 0x15, 0x2a, 0x1d, 0xf7, 0x66, 0x38,\n                                                        0x1d, 0x15, 0x2e, 0xca, 0x36, 0xf0, 0xf0, 0xca,\n                                                        0xe0, 0xe8, 0xe8, 0x4c, 0xe0, 0x26, 0x26, 0x4c,\n                                                        0x36, 0x2e, 0x1e, 0xf7, 0xe, 0x16, 0xbd, 0x8b,\n                                                        0xef, 0xb5, 0xb5, 0x8b, 0x27, 0x59, 0x59, 0x8b,\n                                                        0x27, 0x61, 0x61, 0x8b, 0xef, 0xbd, 0x1e, 0xb,\n                                                        0xfb, 0x14, 0xf7, 0x8c, 0x7b, 0x9a, 0x3d, 0x1d,\n                                                        0xfb, 0x1d, 0x7, 0x38, 0x73, 0x89, 0x46, 0x84,\n                                                        0x1e, 0xb, 0x33, 0x1d, 0x5d, 0x67, 0xb, 0xfb,\n                                                        0x22, 0x60, 0xfb, 0x13, 0x63, 0x23, 0x1a, 0xb,\n                                                        0x15, 0xb5, 0x6, 0x9d, 0x8c, 0x9b, 0xa8, 0xab,\n                                                        0x1b, 0xb, 0x1b, 0xfb, 0x52, 0x71, 0xfb, 0x1c,\n                                                        0x4e, 0x5d, 0x8b, 0x35, 0xf7, 0x3f, 0x39, 0x1f,\n                                                        0xf7, 0x18, 0x4c, 0xba, 0x73, 0x48, 0x1a, 0x7e,\n                                                        0x82, 0x28, 0xfb, 0xc, 0xfb, 0x13, 0x5f, 0xf7,\n                                                        0x5, 0xf0, 0x77, 0x1e, 0x64, 0x6, 0xb, 0xf7,\n                                                        0x4c, 0xcb, 0xf7, 0xd, 0xe3, 0xf7, 0x1, 0x3f,\n                                                        0xc5, 0x69, 0x9c, 0x1f, 0xfb, 0x7b, 0xf7, 0x7,\n                                                        0x78, 0xa1, 0xc1, 0x1a, 0xcc, 0xc2, 0xa9, 0xbf,\n                                                        0xf7, 0xa, 0xbd, 0xfb, 0x7, 0x45, 0x9d, 0x1e,\n                                                        0xb1, 0x6, 0xb, 0x1e, 0xad, 0xfb, 0x8e, 0x69,\n                                                        0x7, 0xa4, 0x87, 0x90, 0x8b, 0x97, 0x74, 0x8,\n                                                        0xb, 0xfb, 0x5f, 0x7d, 0xd3, 0xf7, 0x4f, 0xb0,\n                                                        0xf7, 0x34, 0xaa, 0xb, 0xa5, 0x9b, 0xb9, 0x1a,\n                                                        0xc3, 0x5c, 0xa3, 0x4d, 0x3e, 0x59, 0x56, 0x65,\n                                                        0x78, 0x1e, 0x9f, 0x84, 0x5, 0x9a, 0x95, 0xa2,\n                                                        0xae, 0xb1, 0x1b, 0xbb, 0xa0, 0x71, 0x68, 0x54,\n                                                        0x56, 0x7c, 0x6c, 0x82, 0x1f, 0xb, 0x54, 0xa,\n                                                        0xf8, 0x5a, 0x77, 0xb, 0x49, 0x1d, 0xf7, 0x84,\n                                                        0x77, 0x98, 0xa, 0x17, 0x4d, 0xa, 0xb, 0xad,\n                                                        0xfb, 0x2b, 0x69, 0x7, 0xa4, 0x8a, 0xa9, 0x8b,\n                                                        0x6b, 0x1a, 0xb, 0x8b, 0xae, 0xf8, 0xf2, 0xae,\n                                                        0xb, 0x96, 0x83, 0x5, 0xa7, 0x94, 0xb9, 0x87,\n                                                        0x66, 0x1a, 0x73, 0x1d, 0x1e, 0x7b, 0x66, 0x5,\n                                                        0x7b, 0xb4, 0xa1, 0x89, 0x97, 0x1b, 0xb, 0x1b,\n                                                        0x2f, 0x78, 0x31, 0x68, 0x84, 0x1f, 0xb, 0xf7,\n                                                        0x17, 0x78, 0xac, 0x93, 0x1d, 0xb, 0x12, 0xa4,\n                                                        0xf7, 0x26, 0xf7, 0xe, 0xf7, 0x1e, 0xb, 0x68,\n                                                        0x6, 0xb9, 0x88, 0xb5, 0x93, 0x49, 0x1a, 0xb,\n                                                        0x7a, 0x85, 0x81, 0x6b, 0x66, 0x1b, 0xb, 0x51,\n                                                        0xa, 0xf7, 0x8b, 0x72, 0xa, 0xb, 0x15, 0xc3,\n                                                        0x6, 0xb, 0x5a, 0xa, 0xf7, 0x68, 0xf7, 0xe9,\n                                                        0x79, 0x1d, 0xf7, 0x3f, 0x66, 0x1d, 0xb, 0x65,\n                                                        0x1d, 0xf7, 0x84, 0x45, 0xa, 0xfb, 0x2a, 0x5f,\n                                                        0x1d, 0xb, 0x5d, 0x90, 0x88, 0xa8, 0xa2, 0x1a,\n                                                        0xf7, 0x95, 0x7, 0x94, 0xb6, 0xbc, 0xb3, 0xb,\n                                                        0x1a, 0xe6, 0x3b, 0xa0, 0x63, 0x2f, 0x65, 0x33,\n                                                        0x69, 0x7e, 0x1e, 0xa3, 0x6, 0xbd, 0xa3, 0xae,\n                                                        0x8f, 0x9a, 0x1b, 0xcd, 0x96, 0x4f, 0x7a, 0xb,\n                                                        0xae, 0xfb, 0x70, 0x68, 0x7, 0xb, 0xae, 0xf7,\n                                                        0x45, 0xf7, 0xf6, 0xf7, 0x45, 0xb, 0xa4, 0xf7,\n                                                        0x27, 0xf7, 0x31, 0xf7, 0x27, 0xb, 0xfb, 0x55,\n                                                        0xfb, 0x55, 0xfb, 0x35, 0xb, 0xf7, 0x61, 0xf7,\n                                                        0x61, 0xf7, 0x29, 0xb, 0xae, 0x1, 0xf4, 0x7f,\n                                                        0x1d, 0x9e, 0x16, 0xf8, 0xd6, 0x6, 0xb4, 0xf7,\n                                                        0x77, 0x5, 0x6e, 0x6, 0xfb, 0x5, 0x5d, 0x53,\n                                                        0xb, 0x6e, 0x67, 0x1e, 0xb, 0x63, 0x1d, 0xb2,\n                                                        0x5c, 0x5b, 0x67, 0x63, 0x5e, 0x1e, 0xe, 0x15,\n                                                        0x5c, 0xaf, 0x64, 0x1d, 0xb, 0x66, 0xbb, 0xba,\n                                                        0xb1, 0xaf, 0xbb, 0xb9, 0x65, 0xb, 0xfb, 0x3f,\n                                                        0xfb, 0x3f, 0x85, 0xb, 0xf7, 0x20, 0xf7, 0x20,\n                                                        0xb0, 0xb, 0xb9, 0xb4, 0x63, 0xba, 0x1b, 0xa4,\n                                                        0xa5, 0xa2, 0xa6, 0xa6, 0x71, 0xa2, 0x72, 0x1f,\n                                                        0x5c, 0x62, 0x63, 0x5d, 0x1b, 0xb, 0x76, 0xf7,\n                                                        0x42, 0xf7, 0x35, 0x12, 0x99, 0x77, 0xa, 0xe1,\n                                                        0x77, 0xa, 0x13, 0xe8, 0xb, 0xf7, 0x4d, 0x16,\n                                                        0xf7, 0xef, 0xae, 0x6, 0x45, 0x92, 0x75, 0xb,\n                                                        0xf7, 0x7e, 0x66, 0x7, 0x72, 0x81, 0x82, 0x76,\n                                                        0x70, 0x1b, 0xb, 0xf7, 0xf, 0x98, 0x8, 0xa2,\n                                                        0x7, 0xb, 0x67, 0xa7, 0x6d, 0xaf, 0xaf, 0xa6,\n                                                        0xa9, 0xaf, 0xaf, 0x70, 0xa7, 0x67, 0x67, 0x6f,\n                                                        0x6f, 0x67, 0x1e, 0xb, 0x67, 0xa6, 0x81, 0x1d,\n                                                        0x70, 0x61, 0x1d, 0xb, 0x67, 0xa7, 0x74, 0xa,\n                                                        0xa6, 0xa8, 0xaf, 0xaf, 0x70, 0x6f, 0x1d, 0xb,\n                                                        0x61, 0xa, 0x6f, 0x61, 0x1d, 0xb, 0xfb, 0x17,\n                                                        0xfb, 0x1f, 0x34, 0xb, 0xa5, 0xf7, 0xe3, 0x15,\n                                                        0xfb, 0x5a, 0xf7, 0x2a, 0xfb, 0x30, 0xf7, 0x5a,\n                                                        0xf7, 0x5a, 0xf7, 0x29, 0xb, 0x9b, 0x16, 0xf7,\n                                                        0x77, 0xae, 0x6, 0x41, 0x93, 0x76, 0x8b, 0xd3,\n                                                        0x1a, 0xf8, 0x2d, 0x8d, 0x7, 0xb, 0x62, 0x5d,\n                                                        0x8b, 0x7f, 0x73, 0x7b, 0x92, 0x92, 0x78, 0xb,\n                                                        0x15, 0xf7, 0x35, 0x34, 0xe9, 0xe2, 0xb4, 0xcd,\n                                                        0x62, 0xf7, 0x98, 0x57, 0x6, 0x4f, 0x43, 0xb,\n                                                        0x99, 0x16, 0xf7, 0x87, 0xad, 0x6, 0x5d, 0x90,\n                                                        0x8a, 0xa8, 0xa2, 0x1a, 0xf7, 0xda, 0xb, 0xfc,\n                                                        0x95, 0x15, 0xcd, 0x6, 0xf8, 0x60, 0xf9, 0x48,\n                                                        0x5, 0x49, 0x6, 0xe, 0xa9, 0x30, 0xf1, 0x70,\n                                                        0xb4, 0x1f, 0xa9, 0xb1, 0xb, 0x15, 0xf7, 0x6,\n                                                        0x90, 0xb, 0x15, 0xf7, 0x26, 0xb0, 0xb, 0xfb,\n                                                        0x57, 0xfb, 0xa6, 0x15, 0x69, 0xf7, 0xa5, 0xaa,\n                                                        0x7, 0x5c, 0x8d, 0x6c, 0xb, 0x8f, 0x85, 0x80,\n                                                        0x79, 0x7e, 0x82, 0x80, 0x1e, 0xfb, 0x5f, 0xfb,\n                                                        0x38, 0x5, 0xb, 0xae, 0x78, 0x15, 0xb2, 0x6,\n                                                        0x9b, 0x8f, 0x90, 0x9d, 0xa0, 0x1b, 0x98, 0xb,\n                                                        0xc5, 0xbb, 0xba, 0xc6, 0xc5, 0x5b, 0xbc, 0x51,\n                                                        0x51, 0x5a, 0x5b, 0x50, 0xb, 0x2e, 0xa, 0xe,\n                                                        0xf7, 0x36, 0x3, 0xb, 0xfb, 0x30, 0xfb, 0x31,\n                                                        0xfb, 0xc, 0xf7, 0x1e, 0xf7, 0x38, 0x1e, 0xb,\n                                                        0x74, 0xa, 0xa7, 0xa8, 0xaf, 0xaf, 0x6f, 0x61,\n                                                        0xa, 0xb, 0x8b, 0xad, 0xf8, 0x8, 0xce, 0xb,\n                                                        0x76, 0xf7, 0x44, 0x77, 0x1, 0xb, 0xf7, 0x1f,\n                                                        0x13, 0xe0, 0x9b, 0x16, 0x99, 0xa, 0xb, 0xf7,\n                                                        0x1f, 0xf7, 0xe, 0xf7, 0x1f, 0xfb, 0xf, 0xf7,\n                                                        0x1f, 0xb, 0xf7, 0x8b, 0xf7, 0x41, 0x6c, 0xaa,\n                                                        0x12, 0xa4, 0xf7, 0x21, 0xb, 0xfb, 0x5f, 0xa0,\n                                                        0x76, 0xf7, 0xe8, 0x76, 0xf7, 0x2, 0xab, 0xb,\n                                                        0x89, 0xd3, 0xfb, 0x53, 0x69, 0x6, 0xb, 0xf7,\n                                                        0xeb, 0xbf, 0x15, 0xb, 0xd6, 0x8b, 0xae, 0xb,\n                                                        0x85, 0x1e, 0xe, 0xa1, 0x8a, 0x8a, 0xaf, 0xcb,\n                                                        0x1b, 0xf7, 0x40, 0xa2, 0xb, 0xfb, 0x91, 0xfb,\n                                                        0x2e, 0x76, 0xf9, 0xfd, 0x77, 0x1, 0xb, 0x6,\n                                                        0x84, 0x6c, 0x6f, 0x49, 0x54, 0x76, 0x69, 0x80,\n                                                        0xb, 0x55, 0x8b, 0x5a, 0xc3, 0x93, 0xc7, 0x8b,\n                                                        0xcb, 0xd3, 0xb, 0xd4, 0x90, 0x28, 0x37, 0x53,\n                                                        0x88, 0xfb, 0x1b, 0x39, 0xb, 0xfb, 0xce, 0xfb,\n                                                        0x29, 0xb6, 0xf9, 0x79, 0xb6, 0x1, 0xb, 0xfb,\n                                                        0xce, 0xfb, 0x27, 0x76, 0xf9, 0xf2, 0x77, 0x1,\n                                                        0xb, 0xf9, 0x18, 0xac, 0xb, 0x86, 0x84, 0x9d,\n                                                        0x1f, 0x81, 0xa5, 0xae, 0x7f, 0xb, 0xfb, 0xac,\n                                                        0x1f, 0xfb, 0xc5, 0x68, 0x6, 0xb2, 0xb, 0xfb,\n                                                        0x2b, 0x1b, 0x48, 0x75, 0x93, 0xbb, 0x1f, 0xb,\n                                                        0x7, 0x73, 0x80, 0x67, 0x63, 0x1e, 0xe, 0x76,\n                                                        0xf7, 0x4d, 0x77, 0x1, 0xb, 0xf7, 0x8b, 0x77,\n                                                        0x1, 0xb, 0xf7, 0x16, 0x12, 0xb, 0x1, 0x0,\n                                                        0x1, 0x6, 0x0, 0x68, 0x0, 0x0, 0x9, 0x37,\n                                                        0x0, 0x7c, 0x0, 0x0, 0x42, 0x20, 0x0, 0x67,\n                                                        0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0, 0x0,\n                                                        0x66, 0x0, 0x0, 0x83, 0x0, 0x0, 0xaa, 0x0,\n                                                        0x0, 0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x97,\n                                                        0x0, 0x0, 0xa5, 0x0, 0x0, 0x80, 0x0, 0x0,\n                                                        0xa1, 0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4, 0x0,\n                                                        0x0, 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x98,\n                                                        0x0, 0x0, 0x73, 0x0, 0x0, 0x72, 0x0, 0x0,\n                                                        0x85, 0x0, 0x0, 0x96, 0x0, 0x0, 0x8f, 0x0,\n                                                        0x0, 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x9b,\n                                                        0x0, 0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0, 0x0,\n                                                        0xae, 0x0, 0x0, 0xab, 0x1, 0x0, 0xb0, 0x0,\n                                                        0x0, 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x8a,\n                                                        0x0, 0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0, 0x0,\n                                                        0xb2, 0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6, 0x2,\n                                                        0x0, 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0, 0xbe,\n                                                        0x0, 0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0, 0x0,\n                                                        0xbd, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d, 0x0,\n                                                        0x0, 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0, 0xc5,\n                                                        0x0, 0x0, 0x9d, 0x0, 0x0, 0x95, 0x0, 0x0,\n                                                        0xcb, 0x0, 0x0, 0xc8, 0x1, 0x0, 0xcd, 0x0,\n                                                        0x0, 0xca, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x90,\n                                                        0x0, 0x0, 0xce, 0x0, 0x0, 0xd2, 0x0, 0x0,\n                                                        0xcf, 0x2, 0x0, 0xd6, 0x0, 0x0, 0xd3, 0x2,\n                                                        0x0, 0xa7, 0x0, 0x0, 0xd7, 0x0, 0x0, 0xdb,\n                                                        0x0, 0x0, 0xd8, 0x1, 0x0, 0xdc, 0x0, 0x0,\n                                                        0xda, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x93, 0x0,\n                                                        0x0, 0xe1, 0x0, 0x0, 0xde, 0x2, 0x0, 0xe2,\n                                                        0x0, 0x0, 0xa2, 0x0, 0x0, 0xe3, 0x0, 0x0,\n                                                        0x91, 0x0, 0x0, 0x8c, 0x0, 0x0, 0x92, 0x0,\n                                                        0x0, 0x8e, 0x0, 0x0, 0x94, 0x0, 0x0, 0xc0,\n                                                        0x0, 0x0, 0xdd, 0x0, 0x0, 0xc6, 0x1, 0x0,\n                                                        0xe4, 0x0, 0x0, 0x65, 0x0, 0x0, 0x7e, 0x0,\n                                                        0x0, 0x88, 0x0, 0x0, 0x81, 0x1, 0x0, 0x84,\n                                                        0x0, 0x0, 0x87, 0x0, 0x0, 0x7f, 0x0, 0x0,\n                                                        0x86, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89, 0x0,\n                                                        0x0, 0x41, 0x0, 0x0, 0x8, 0x0, 0x0, 0x75,\n                                                        0x0, 0x0, 0x69, 0x0, 0x0, 0x77, 0x0, 0x0,\n                                                        0x76, 0x0, 0x0, 0x70, 0x1, 0x0, 0x74, 0x0,\n                                                        0x0, 0x79, 0x1, 0x0, 0x6b, 0x1, 0x0, 0x63,\n                                                        0x0, 0x1, 0x87, 0x0, 0x0, 0x99, 0x0, 0x0,\n                                                        0xa6, 0x0, 0x0, 0x6d, 0x1, 0x0, 0xe6, 0x2,\n                                                        0x0, 0x1, 0x0, 0x4, 0x0, 0x7, 0x0, 0x4b,\n                                                        0x0, 0x78, 0x0, 0xec, 0x1, 0x74, 0x1, 0xa0,\n                                                        0x2, 0x61, 0x2, 0x8c, 0x2, 0xba, 0x2, 0xea,\n                                                        0x3, 0xe4, 0x4, 0x10, 0x4, 0x3e, 0x4, 0x51,\n                                                        0x4, 0x59, 0x4, 0x74, 0x4, 0xc5, 0x4, 0xfb,\n                                                        0x5, 0x4c, 0x5, 0xb5, 0x5, 0xf3, 0x6, 0x51,\n                                                        0x6, 0xb4, 0x6, 0xda, 0x7, 0x5c, 0x7, 0xbb,\n                                                        0x7, 0xe1, 0x8, 0x28, 0x8, 0x45, 0x8, 0x67,\n                                                        0x8, 0x83, 0x8, 0xf4, 0x9, 0xad, 0x9, 0xcd,\n                                                        0xa, 0x4a, 0xa, 0xa9, 0xa, 0xee, 0xb, 0x4c,\n                                                        0xb, 0xab, 0xc, 0x23, 0xc, 0x8c, 0xc, 0x91,\n                                                        0xc, 0xe4, 0xd, 0x50, 0xd, 0x75, 0xd, 0xe6,\n                                                        0xe, 0x0, 0xe, 0x20, 0xe, 0x7d, 0xe, 0xd7,\n                                                        0xf, 0x50, 0xf, 0x78, 0xf, 0xbb, 0x10, 0x3,\n                                                        0x10, 0x46, 0x10, 0xc0, 0x11, 0x3d, 0x11, 0x5f,\n                                                        0x11, 0x65, 0x11, 0x86, 0x11, 0xa1, 0x11, 0xc2,\n                                                        0x11, 0xe3, 0x11, 0xef, 0x11, 0xf7, 0x12, 0x36,\n                                                        0x12, 0x9e, 0x12, 0xe2, 0x13, 0x49, 0x13, 0x76,\n                                                        0x13, 0xcc, 0x14, 0x91, 0x14, 0xc3, 0x14, 0xed,\n                                                        0x15, 0x50, 0x15, 0xb9, 0x15, 0xd7, 0x16, 0x64,\n                                                        0x16, 0xac, 0x16, 0xeb, 0x17, 0x23, 0x17, 0x85,\n                                                        0x17, 0xe0, 0x18, 0x63, 0x18, 0xac, 0x18, 0xbf,\n                                                        0x18, 0xef, 0x19, 0x6c, 0x19, 0xe6, 0x19, 0xfa,\n                                                        0x1a, 0x25, 0x1a, 0x74, 0x1a, 0x8f, 0x1a, 0xde,\n                                                        0x1b, 0x21, 0x1b, 0x70, 0x1b, 0xf8, 0x1c, 0xad,\n                                                        0x1d, 0x20, 0x1d, 0x9f, 0x1d, 0xc1, 0x1e, 0x93,\n                                                        0x1e, 0x9e, 0x1f, 0x19, 0x1f, 0x90, 0x1f, 0xc5,\n                                                        0x1f, 0xe5, 0x20, 0x79, 0x20, 0x8a, 0x20, 0xc2,\n                                                        0x20, 0xff, 0x21, 0x30, 0x21, 0x51, 0x21, 0x6d,\n                                                        0x21, 0xec, 0x22, 0x28, 0x22, 0x32, 0x22, 0x57,\n                                                        0x22, 0x80, 0x22, 0xb8, 0x22, 0xe4, 0x23, 0x18,\n                                                        0x23, 0x60, 0x23, 0x98, 0x24, 0xb, 0x24, 0x1d,\n                                                        0x24, 0x2f, 0x24, 0x41, 0x24, 0x7c, 0x24, 0x9f,\n                                                        0x24, 0xd9, 0x25, 0x78, 0x26, 0x6, 0x26, 0x12,\n                                                        0x26, 0x22, 0x26, 0x36, 0x26, 0x60, 0x26, 0x68,\n                                                        0x26, 0x6f, 0x26, 0x7c, 0x26, 0xae, 0x26, 0xfc,\n                                                        0x27, 0x35, 0x27, 0x57, 0x27, 0x6a, 0x27, 0x8a,\n                                                        0x27, 0xe6, 0x28, 0x5, 0x28, 0x35, 0x28, 0xa9,\n                                                        0x28, 0xba, 0x28, 0xce, 0x28, 0xe2, 0x29, 0x6,\n                                                        0x29, 0x3a, 0x29, 0xdd, 0x2a, 0x81, 0x2a, 0x9c,\n                                                        0x2a, 0xb8, 0x2a, 0xd8, 0x2b, 0x28, 0x2b, 0x46,\n                                                        0x2b, 0x8e, 0x2c, 0x43, 0x2c, 0x9f, 0x2c, 0xb4,\n                                                        0x2c, 0xca, 0x2c, 0xea, 0x2d, 0xf, 0x2d, 0x29,\n                                                        0x2d, 0x48, 0x2d, 0x6d, 0x2d, 0x90, 0x2e, 0x5,\n                                                        0x2e, 0x51, 0x2e, 0xa3, 0x2e, 0xb1, 0x2e, 0xbe,\n                                                        0x2e, 0xe9, 0x2f, 0x6, 0x2f, 0x38, 0x2f, 0xc3,\n                                                        0x2f, 0xde, 0x2f, 0xfe, 0x30, 0x15, 0x30, 0x3b,\n                                                        0x30, 0x78, 0x30, 0xa9, 0x30, 0xcd, 0x30, 0xd6,\n                                                        0x31, 0x14, 0x31, 0x46, 0x31, 0xe0, 0x32, 0x71,\n                                                        0x32, 0xa1, 0x33, 0x19, 0x33, 0x4f, 0x33, 0x61,\n                                                        0x33, 0x93, 0x34, 0x16, 0x34, 0x21, 0x34, 0x39,\n                                                        0x34, 0x64, 0x34, 0x85, 0x34, 0xcc, 0x35, 0x0,\n                                                        0x35, 0x39, 0x35, 0x52, 0x35, 0x60, 0x35, 0x70,\n                                                        0x35, 0x95, 0x35, 0xa1, 0x35, 0xb0, 0x35, 0xd9,\n                                                        0x35, 0xf3, 0x36, 0xc, 0x36, 0xb0, 0x37, 0x19,\n                                                        0x37, 0x38, 0x37, 0x5b, 0x37, 0x96, 0x37, 0xba,\n                                                        0x37, 0xdf, 0x37, 0xf8, 0x38, 0x86, 0x39, 0x2f,\n                                                        0x39, 0x3f, 0x39, 0xa5, 0x3a, 0x0, 0xfc, 0x21,\n                                                        0xe, 0xfc, 0x21, 0xe, 0xfb, 0xce, 0x7e, 0xf7,\n                                                        0x3d, 0xf8, 0xab, 0x77, 0x1, 0xdc, 0xf7, 0x3e,\n                                                        0x3, 0xdc, 0xd2, 0x15, 0x5c, 0xb0, 0x64, 0x1d,\n                                                        0xb2, 0x5c, 0x5b, 0x66, 0x63, 0x5e, 0x1e, 0xd1,\n                                                        0xf7, 0x37, 0x15, 0xa8, 0x6, 0x94, 0xe5, 0x96,\n                                                        0xc7, 0x96, 0xb7, 0x8, 0x9f, 0xdd, 0x9f, 0xa5,\n                                                        0xc2, 0x1a, 0xcb, 0x69, 0xaf, 0x58, 0x57, 0x6a,\n                                                        0x67, 0x4b, 0x54, 0x9f, 0x70, 0x9f, 0x38, 0x1e,\n                                                        0x96, 0x5f, 0x95, 0x4f, 0x94, 0x33, 0x8, 0xe,\n                                                        0x2f, 0xf8, 0x3d, 0x76, 0xf7, 0xb3, 0x77, 0x1,\n                                                        0xde, 0xf7, 0x15, 0xf7, 0x17, 0xf7, 0x15, 0x3,\n                                                        0xf7, 0x13, 0xf8, 0x28, 0x15, 0x6e, 0xa, 0x74,\n                                                        0xa6, 0xfb, 0xc, 0x9c, 0x43, 0x1e, 0xf7, 0x98,\n                                                        0x16, 0x6e, 0xa, 0x1e, 0x8a, 0x74, 0xa7, 0xfb,\n                                                        0xc, 0x9c, 0x43, 0x8, 0xe, 0xa0, 0x76, 0xf7,\n                                                        0x66, 0xcc, 0x4a, 0xd4, 0xf7, 0x20, 0xd4, 0x45,\n                                                        0xcb, 0xf7, 0x66, 0x77, 0x12, 0x13, 0xb4, 0xb5,\n                                                        0x16, 0xce, 0x6, 0xbb, 0xf7, 0x66, 0x5, 0xf7,\n                                                        0x21, 0x6, 0x5d, 0xfb, 0x66, 0x5, 0xce, 0x6,\n                                                        0xb9, 0xf7, 0x66, 0x5, 0xf0, 0x6, 0x13, 0xcc,\n                                                        0x8c, 0xcc, 0x5, 0x35, 0x6, 0xad, 0xf7, 0x2b,\n                                                        0x5, 0xdb, 0x6, 0x8c, 0xcb, 0x5, 0x47, 0x6,\n                                                        0xba, 0xf7, 0x66, 0x5, 0x49, 0x6, 0x5b, 0xfb,\n                                                        0x66, 0x5, 0xfb, 0x22, 0x6, 0xb9, 0xf7, 0x66,\n                                                        0x5, 0x49, 0x6, 0x5c, 0xfb, 0x66, 0x5, 0xfb,\n                                                        0xa, 0x6, 0x8a, 0x4b, 0x5, 0xf2, 0x6, 0x6b,\n                                                        0xfb, 0x2b, 0x5, 0x28, 0x6, 0x8a, 0x4a, 0x5,\n                                                        0xe1, 0x6, 0xdc, 0xcc, 0x15, 0xab, 0xf7, 0x2b,\n                                                        0x5, 0xf7, 0x25, 0x6, 0x69, 0xfb, 0x2b, 0x5,\n                                                        0xe, 0x3d, 0x76, 0xf9, 0xe5, 0x77, 0x12, 0xdc,\n                                                        0xea, 0xbc, 0xc3, 0xe9, 0xf7, 0x2, 0x17, 0xf7,\n                                                        0xa1, 0xa9, 0x15, 0xf7, 0x70, 0x7, 0xc5, 0x6a,\n                                                        0xae, 0x78, 0x51, 0x1a, 0x2e, 0x49, 0x7f, 0x70,\n                                                        0x86, 0x1e, 0xfb, 0x73, 0x98, 0x15, 0xd3, 0x6e,\n                                                        0xa7, 0x80, 0xcf, 0x88, 0x8, 0x28, 0xc2, 0xee,\n                                                        0x7, 0x13, 0x78, 0xf0, 0x9c, 0xf1, 0xaf, 0xf7,\n                                                        0x26, 0x1a, 0xf7, 0xe, 0x2c, 0xbd, 0xfb, 0x0,\n                                                        0xc2, 0x1e, 0xf7, 0x6b, 0x7, 0xeb, 0x7b, 0xa0,\n                                                        0x22, 0x96, 0x64, 0x8, 0xaa, 0xf7, 0x21, 0x6,\n                                                        0x6f, 0x9c, 0x68, 0xa0, 0x2b, 0x99, 0x8, 0xd7,\n                                                        0x54, 0x3d, 0x7, 0x37, 0x87, 0x26, 0x54, 0xfb,\n                                                        0x9, 0x1a, 0xfb, 0xd, 0xf7, 0x5, 0x50, 0xd2,\n                                                        0x68, 0x1e, 0xfb, 0x8f, 0x7, 0x54, 0x95, 0x5e,\n                                                        0xa8, 0x67, 0xf7, 0x14, 0x6c, 0x8d, 0x18, 0xf7,\n                                                        0x3b, 0xf7, 0x93, 0x15, 0x80, 0x8f, 0x3d, 0xa3,\n                                                        0xd2, 0x1a, 0xc9, 0xbb, 0x9f, 0xb4, 0x94, 0x1e,\n                                                        0xe, 0xf7, 0xf5, 0x7d, 0xb9, 0xf7, 0x9a, 0xb9,\n                                                        0x78, 0xbe, 0xf7, 0x97, 0xba, 0x99, 0x77, 0x1,\n                                                        0xf7, 0x10, 0xf7, 0x6, 0xf7, 0x56, 0xac, 0xd1,\n                                                        0xf7, 0x9, 0xf7, 0x54, 0xac, 0x3, 0xf8, 0xee,\n                                                        0xf7, 0x38, 0x41, 0x1d, 0xfd, 0x22, 0xf7, 0xe2,\n                                                        0x41, 0x1d, 0xb9, 0x76, 0x1d, 0xf7, 0x4e, 0x7b,\n                                                        0xd8, 0x3e, 0xf0, 0xf8, 0xd1, 0xac, 0x12, 0xc9,\n                                                        0xf7, 0x1f, 0xf7, 0xe, 0xf7, 0x24, 0x8b, 0xf0,\n                                                        0xd6, 0xf7, 0x24, 0x13, 0x7c, 0xf8, 0x6f, 0xd3,\n                                                        0x15, 0x5c, 0xb1, 0xc6, 0x62, 0xc9, 0x1b, 0xb0,\n                                                        0xad, 0x9d, 0xb1, 0xb1, 0x1f, 0x13, 0x7e, 0x9c,\n                                                        0x9c, 0xa5, 0xc0, 0x8c, 0x8c, 0x77, 0x97, 0x18,\n                                                        0x75, 0x7f, 0x77, 0x7b, 0x72, 0x1b, 0x5c, 0x6c,\n                                                        0xb0, 0xc1, 0x61, 0x1f, 0xc1, 0xd0, 0x96, 0x96,\n                                                        0xc2, 0xe4, 0x9c, 0xa6, 0x9a, 0x94, 0xb8, 0x8f,\n                                                        0x8, 0xad, 0xfb, 0x66, 0x69, 0x7, 0xbf, 0x85,\n                                                        0x99, 0x89, 0x66, 0x1a, 0x5b, 0x5f, 0x5f, 0x6b,\n                                                        0x64, 0x1e, 0xfb, 0x2b, 0xf7, 0x6a, 0x5, 0xcc,\n                                                        0xa1, 0xe2, 0xb6, 0xdd, 0x1a, 0xc1, 0x61, 0xce,\n                                                        0xfb, 0x12, 0xfb, 0x34, 0x25, 0xfb, 0x2c, 0xfb,\n                                                        0x2b, 0xf7, 0xc, 0x1e, 0x49, 0x6b, 0xfb, 0x16,\n                                                        0x4c, 0xfb, 0x17, 0x1a, 0xfb, 0xb, 0xea, 0x50,\n                                                        0xeb, 0xf1, 0xdc, 0xc5, 0xa9, 0xb2, 0x1e, 0x74,\n                                                        0xa7, 0x15, 0x13, 0xbc, 0x77, 0x70, 0x6b, 0x78,\n                                                        0x6c, 0x1b, 0x2d, 0x48, 0xf7, 0x17, 0xcf, 0xb7,\n                                                        0xa0, 0xa3, 0xc0, 0xa9, 0x1f, 0xe3, 0xfb, 0x18,\n                                                        0xbe, 0x3f, 0xb1, 0x59, 0x8, 0x54, 0xf7, 0xf4,\n                                                        0x15, 0x73, 0xa8, 0x59, 0xce, 0xbe, 0x1a, 0xbb,\n                                                        0xa7, 0x96, 0xa4, 0xc4, 0xad, 0x41, 0x59, 0x52,\n                                                        0x60, 0x7b, 0x70, 0x82, 0x1e, 0xe, 0xfc, 0x5,\n                                                        0xf8, 0x3d, 0x76, 0xf7, 0xb3, 0x77, 0x1, 0x5c,\n                                                        0xf7, 0x15, 0x3, 0xf7, 0xb, 0xf8, 0x28, 0x15,\n                                                        0xb4, 0x6, 0x9c, 0xd3, 0xa6, 0xf7, 0x4, 0xa2,\n                                                        0x1a, 0xb6, 0x72, 0xb0, 0x63, 0x63, 0x73, 0x66,\n                                                        0x60, 0x74, 0xa6, 0xfb, 0x4, 0x9c, 0x43, 0x1e,\n                                                        0xe, 0x92, 0x1d, 0xbf, 0xf7, 0x5, 0x3, 0xf7,\n                                                        0xc6, 0xfb, 0x20, 0x15, 0x2a, 0xc6, 0x59, 0xd3,\n                                                        0xf7, 0xa4, 0x1a, 0xf7, 0xc5, 0xcb, 0xb6, 0xde,\n                                                        0xc3, 0x1e, 0xa6, 0x7, 0x54, 0x72, 0xfb, 0x61,\n                                                        0xfb, 0x6, 0xfb, 0xb8, 0x1a, 0x39, 0xa7, 0xfb,\n                                                        0x74, 0xf7, 0x7c, 0xfb, 0x11, 0x1e, 0xe, 0x92,\n                                                        0x1d, 0xf7, 0x42, 0xf7, 0x5, 0x3, 0xa6, 0xfb,\n                                                        0x21, 0x15, 0x70, 0x7, 0xc2, 0xa4, 0xf7, 0x61,\n                                                        0xf7, 0x11, 0xf7, 0xb8, 0x1a, 0xdd, 0x6f, 0xf7,\n                                                        0x69, 0xfb, 0x7c, 0xf7, 0x11, 0x1e, 0x6f, 0x7,\n                                                        0xec, 0x50, 0xbd, 0x4e, 0xfb, 0xa4, 0x1a, 0xfb,\n                                                        0xc5, 0x4b, 0x55, 0x38, 0x53, 0x1e, 0xe, 0xf7,\n                                                        0xa8, 0x76, 0xf4, 0x76, 0xa3, 0x76, 0xf7, 0xf,\n                                                        0x76, 0xf7, 0x8b, 0x77, 0x12, 0xf7, 0x5d, 0xee,\n                                                        0x13, 0xbc, 0xf7, 0x85, 0xf8, 0x55, 0x15, 0x6f,\n                                                        0x88, 0x78, 0x86, 0x7d, 0x1e, 0x80, 0x6a, 0x76,\n                                                        0x85, 0x64, 0x1a, 0x69, 0xa2, 0x76, 0xa4, 0xa3,\n                                                        0xa6, 0xa0, 0xaa, 0x1e, 0x8a, 0xa8, 0x7b, 0x98,\n                                                        0x7e, 0xb3, 0x86, 0x9a, 0x87, 0x9f, 0x89, 0xa4,\n                                                        0x92, 0x90, 0x18, 0xa1, 0x80, 0x94, 0x85, 0x99,\n                                                        0x7a, 0x93, 0x81, 0x94, 0x7d, 0x9a, 0x76, 0x8,\n                                                        0x76, 0x99, 0xa1, 0x7f, 0x9e, 0x1b, 0xa5, 0xa2,\n                                                        0x9a, 0xac, 0xc6, 0x56, 0x7f, 0x4e, 0x97, 0x1f,\n                                                        0x79, 0x8f, 0x78, 0x90, 0x79, 0x95, 0x8, 0x93,\n                                                        0x7, 0xa2, 0x9b, 0x9e, 0x91, 0x9b, 0x8e, 0xa5,\n                                                        0x8f, 0xa0, 0x85, 0xa2, 0x94, 0x8, 0xa7, 0x95,\n                                                        0x98, 0xa1, 0xa0, 0x1a, 0xa4, 0x79, 0xa2, 0x6a,\n                                                        0x63, 0x86, 0x6d, 0x64, 0x6b, 0x1e, 0x7f, 0x7d,\n                                                        0x7a, 0x7b, 0x75, 0x7b, 0x83, 0x8e, 0x18, 0x88,\n                                                        0xb1, 0x94, 0xa0, 0x94, 0x9c, 0x8, 0x96, 0xa0,\n                                                        0x99, 0x99, 0xa8, 0x1a, 0xad, 0x71, 0x9f, 0x71,\n                                                        0x73, 0x73, 0x78, 0x6d, 0x6c, 0x9a, 0x7c, 0x97,\n                                                        0x73, 0x1e, 0x94, 0x7a, 0x90, 0x75, 0x67, 0x1a,\n                                                        0x84, 0x88, 0x6f, 0x98, 0x7d, 0x9c, 0x7f, 0x9b,\n                                                        0x19, 0xac, 0x73, 0x86, 0xac, 0x58, 0x1b, 0x7e,\n                                                        0x6c, 0x80, 0x66, 0x68, 0x9a, 0x81, 0xa5, 0x86,\n                                                        0x1f, 0x9d, 0x88, 0xa1, 0x8a, 0xa4, 0x87, 0x9f,\n                                                        0x87, 0xa0, 0x85, 0xa2, 0x80, 0x8a, 0x84, 0x18,\n                                                        0x73, 0x79, 0x78, 0x85, 0x7a, 0x89, 0x8, 0x89,\n                                                        0x7e, 0x7b, 0x8b, 0x7b, 0x1b, 0x6e, 0x6a, 0x7a,\n                                                        0x67, 0x89, 0x1f, 0x13, 0xdc, 0x71, 0x8a, 0xa1,\n                                                        0x71, 0xa6, 0x1b, 0xb6, 0x8f, 0xab, 0xb2, 0xac,\n                                                        0x1f, 0x97, 0x99, 0x9a, 0x9a, 0xa2, 0x9a, 0x8,\n                                                        0xe, 0x3e, 0xa0, 0x76, 0xf7, 0x74, 0xc6, 0xf7,\n                                                        0x73, 0x77, 0x12, 0xf7, 0x81, 0xe5, 0x3f, 0xcb,\n                                                        0x13, 0xf0, 0xac, 0xf7, 0x76, 0x15, 0x13, 0xe8,\n                                                        0xf7, 0x6e, 0xfb, 0x76, 0xcb, 0xf7, 0x76, 0xf7,\n                                                        0x72, 0xc6, 0xfb, 0x72, 0xf7, 0x71, 0x4b, 0xfb,\n                                                        0x71, 0xfb, 0x6e, 0x6, 0xe, 0xfc, 0x21, 0xfb,\n                                                        0x33, 0x83, 0xa, 0xb2, 0x77, 0xa, 0x13, 0xe0,\n                                                        0xb6, 0xfb, 0x34, 0x15, 0x97, 0x77, 0x5, 0xc0,\n                                                        0xa9, 0xf7, 0x7, 0x3d, 0xa, 0x5d, 0x67, 0x6d,\n                                                        0x57, 0x4c, 0xb9, 0x7b, 0xa7, 0x1e, 0x13, 0xd0,\n                                                        0x9f, 0xa1, 0x92, 0x70, 0x53, 0x37, 0x50, 0x6f,\n                                                        0x78, 0x1f, 0xe, 0xfb, 0xce, 0xf7, 0x3f, 0xf7,\n                                                        0x8, 0x1, 0xb7, 0xf7, 0x3f, 0x15, 0xf7, 0x87,\n                                                        0xf7, 0x8, 0xfb, 0x87, 0x6, 0xe, 0xfc, 0x21,\n                                                        0x7e, 0x93, 0xa, 0xd2, 0x62, 0x1d, 0xfc, 0x5,\n                                                        0x8d, 0x76, 0xf9, 0x4b, 0x77, 0xae, 0x77, 0x12,\n                                                        0x13, 0xc0, 0x84, 0x78, 0x15, 0xd3, 0x6, 0x13,\n                                                        0xa0, 0xf7, 0x78, 0xf9, 0x5a, 0x5, 0x3b, 0x6,\n                                                        0xe, 0x7e, 0xa7, 0xf9, 0x19, 0xa7, 0x1, 0xa3,\n                                                        0xf7, 0x32, 0xf7, 0x1c, 0xf7, 0x32, 0x3, 0xf7,\n                                                        0x4a, 0xf7, 0x72, 0x15, 0xf7, 0x79, 0x7, 0xde,\n                                                        0x8b, 0xf7, 0x12, 0xce, 0xbb, 0xa0, 0x51, 0xfb,\n                                                        0x2b, 0x1e, 0xfb, 0x79, 0x7, 0x3c, 0x8f, 0xfb,\n                                                        0x14, 0x43, 0x57, 0x7b, 0xcb, 0xf7, 0x23, 0x1e,\n                                                        0xfb, 0x32, 0xf7, 0x2, 0x15, 0xfb, 0x5d, 0xed,\n                                                        0xfb, 0x24, 0xf7, 0x14, 0xf7, 0x20, 0xe1, 0xf7,\n                                                        0x39, 0xf7, 0x48, 0xf7, 0x84, 0xfb, 0xe, 0xf7,\n                                                        0x8, 0x22, 0x26, 0xfb, 0x10, 0x23, 0xfb, 0x90,\n                                                        0x1e, 0xe, 0x8b, 0xad, 0xf9, 0x22, 0x77, 0x1,\n                                                        0xf7, 0x4e, 0xf7, 0x28, 0x3, 0xcc, 0x16, 0xf8,\n                                                        0xd, 0xad, 0x6, 0x28, 0x82, 0xa6, 0xce, 0x1f,\n                                                        0xf8, 0xc4, 0x7a, 0x7, 0xfb, 0x90, 0xfb, 0x1,\n                                                        0x5, 0x71, 0x7, 0x98, 0xad, 0xad, 0x97, 0x99,\n                                                        0x1b, 0xb2, 0x8b, 0x5f, 0x72, 0x1f, 0xfc, 0xb,\n                                                        0x7, 0x4d, 0x86, 0x65, 0xfb, 0x8, 0x1e, 0xe,\n                                                        0x8b, 0xf7, 0x19, 0xf8, 0x8, 0x76, 0xe5, 0xf7,\n                                                        0x6, 0x1, 0xf7, 0xc0, 0xf7, 0x1c, 0x3, 0x9c,\n                                                        0x16, 0xf8, 0x34, 0x6, 0xb8, 0xf7, 0x67, 0x5,\n                                                        0x69, 0x6, 0x47, 0x6f, 0x82, 0x81, 0x21, 0x1b,\n                                                        0xfb, 0x21, 0x6, 0xf7, 0xa8, 0xf7, 0x9b, 0x8b,\n                                                        0xd7, 0xa8, 0x1a, 0xf7, 0x2c, 0xfb, 0xf, 0xae,\n                                                        0x4d, 0xfb, 0x21, 0x50, 0xfb, 0x27, 0x52, 0x77,\n                                                        0x1e, 0xa7, 0x6, 0xdf, 0xb0, 0xc9, 0x91, 0xa2,\n                                                        0x1b, 0xf2, 0x9b, 0x27, 0x6f, 0xfb, 0xa, 0xfb,\n                                                        0xd, 0xfb, 0x18, 0xfb, 0x36, 0xfb, 0x41, 0x1f,\n                                                        0xe, 0x7d, 0xbd, 0x59, 0xf7, 0x28, 0xf8, 0x6d,\n                                                        0xdc, 0x12, 0xf7, 0xf6, 0xf7, 0x6, 0x13, 0xb0,\n                                                        0xf7, 0x2d, 0xf7, 0xf8, 0x15, 0xd7, 0x71, 0xf7,\n                                                        0x11, 0x61, 0xfb, 0x19, 0x1a, 0x31, 0x57, 0x6e,\n                                                        0x5b, 0x6d, 0x74, 0xa2, 0xa3, 0x72, 0x1e, 0x13,\n                                                        0x70, 0xa4, 0x71, 0x6e, 0xa5, 0x60, 0x1b, 0x6b,\n                                                        0x6d, 0x74, 0x6a, 0x4c, 0xd2, 0x6e, 0xdb, 0xf7,\n                                                        0x48, 0xf7, 0xd, 0xf7, 0xe, 0xf7, 0x20, 0xd6,\n                                                        0x60, 0xd3, 0x3c, 0xa8, 0x1f, 0xb7, 0xa6, 0xb2,\n                                                        0xa4, 0xd8, 0x1a, 0xe8, 0x43, 0xb5, 0x2b, 0xfb,\n                                                        0xa, 0x3e, 0x31, 0x4c, 0x6e, 0x1e, 0xa0, 0x7f,\n                                                        0x5, 0xa3, 0x9a, 0xae, 0xc7, 0xd0, 0x1b, 0xd4,\n                                                        0xac, 0x5f, 0x50, 0x30, 0x39, 0x72, 0x5b, 0x7c,\n                                                        0x1f, 0xe, 0xa0, 0x76, 0xf7, 0x24, 0xf7, 0x3,\n                                                        0xf7, 0xcf, 0x76, 0xf7, 0x1f, 0x77, 0x1, 0xf7,\n                                                        0xa1, 0xf7, 0x23, 0x3, 0x9e, 0xf7, 0x24, 0x15,\n                                                        0xf7, 0x8c, 0xfb, 0x24, 0xf7, 0x25, 0xf7, 0x24,\n                                                        0xca, 0xf7, 0x3, 0x4c, 0xf8, 0x45, 0x31, 0x6,\n                                                        0x31, 0xfb, 0xe, 0xfb, 0x10, 0xfb, 0x3b, 0x32,\n                                                        0xfb, 0x22, 0x8, 0xb4, 0x89, 0x15, 0xf7, 0x63,\n                                                        0xf7, 0xba, 0x5, 0x8d, 0xfb, 0xba, 0x6, 0xe,\n                                                        0x83, 0xc8, 0x4e, 0xf7, 0x28, 0xf7, 0x53, 0xf7,\n                                                        0x1d, 0xdc, 0xf7, 0x13, 0x12, 0xf8, 0x9, 0xd9,\n                                                        0x13, 0xb8, 0xbe, 0xf7, 0xdf, 0x15, 0xd3, 0x86,\n                                                        0xd7, 0x86, 0xce, 0x6d, 0x8, 0xc0, 0x74, 0xc1,\n                                                        0x59, 0x4e, 0x1a, 0x39, 0x49, 0x75, 0x69, 0x6c,\n                                                        0x6d, 0xa0, 0xa0, 0x6d, 0x1e, 0x13, 0x78, 0xa1,\n                                                        0x6c, 0x6b, 0xa2, 0x68, 0x1b, 0x60, 0x78, 0x6b,\n                                                        0x6f, 0x52, 0xcd, 0x6c, 0xd8, 0xf7, 0x4a, 0xf3,\n                                                        0xf7, 0x2, 0xf7, 0x17, 0xed, 0x50, 0xca, 0x5e,\n                                                        0xa4, 0x1f, 0x48, 0xb1, 0x4d, 0x91, 0x30, 0x90,\n                                                        0xa1, 0xe6, 0x18, 0xf7, 0xaa, 0x6, 0xb6, 0xf7,\n                                                        0x13, 0x5, 0xfb, 0xd6, 0x6, 0xe, 0x7e, 0xa6,\n                                                        0xf7, 0xfe, 0xb8, 0xf7, 0x9f, 0x77, 0x1, 0xa7,\n                                                        0xf7, 0x31, 0xf7, 0x1e, 0xf7, 0x2c, 0x3, 0xf8,\n                                                        0x6a, 0xf9, 0x2a, 0x15, 0xa5, 0x7, 0xfb, 0xc0,\n                                                        0x6d, 0xfb, 0x22, 0xfb, 0x54, 0xfb, 0x4a, 0x1a,\n                                                        0xfb, 0x84, 0xf7, 0x1f, 0x52, 0xe5, 0xf7, 0x48,\n                                                        0xb1, 0xf7, 0x3e, 0xc1, 0xf7, 0x40, 0xfb, 0x4,\n                                                        0xb1, 0x46, 0x5b, 0x79, 0x84, 0x81, 0x73, 0x1e,\n                                                        0xb7, 0xf7, 0x4c, 0xf7, 0xe, 0xc1, 0xef, 0x9f,\n                                                        0x8, 0xfb, 0xa8, 0xfb, 0xbf, 0x15, 0x97, 0x96,\n                                                        0x9c, 0x8c, 0x9b, 0x1b, 0xd0, 0x9b, 0x3f, 0xfb,\n                                                        0x24, 0x3c, 0x8b, 0x4c, 0x4e, 0x4d, 0x7c, 0xc9,\n                                                        0xf7, 0x59, 0xac, 0x93, 0xc3, 0x8c, 0x8c, 0x1f,\n                                                        0xe, 0xa0, 0x76, 0xf8, 0x6f, 0x76, 0xe0, 0xf7,\n                                                        0x1d, 0x1, 0xf7, 0x27, 0x16, 0xea, 0x6, 0xf7,\n                                                        0x7f, 0xf9, 0x38, 0x5, 0xfc, 0x34, 0x6, 0x5f,\n                                                        0xfb, 0x72, 0x5, 0xae, 0x6, 0xe0, 0xa1, 0xbd,\n                                                        0x8b, 0xa5, 0x1b, 0xf7, 0x4f, 0x6, 0xe, 0x7e,\n                                                        0xab, 0xf9, 0x14, 0xa8, 0x12, 0xa7, 0xf7, 0xd,\n                                                        0xfb, 0x2, 0xf7, 0x15, 0xf7, 0x39, 0xf7, 0x1f,\n                                                        0xfb, 0x19, 0xf7, 0xb, 0x13, 0xd4, 0xf7, 0xbe,\n                                                        0xf8, 0x3a, 0x15, 0x81, 0x90, 0xfb, 0xc, 0xc5,\n                                                        0xe8, 0x1a, 0xb4, 0xb0, 0xb3, 0xbc, 0xd5, 0x96,\n                                                        0x44, 0x58, 0x4f, 0x79, 0x73, 0x74, 0x6c, 0x1e,\n                                                        0xfb, 0xc, 0x29, 0x15, 0x13, 0xe8, 0x48, 0x76,\n                                                        0x38, 0x64, 0xfb, 0x1, 0x1a, 0xfb, 0x2, 0xf0,\n                                                        0x51, 0xf7, 0x0, 0xf7, 0x23, 0xe7, 0xd9, 0xf7,\n                                                        0x11, 0xe8, 0x4b, 0xd1, 0x35, 0xbe, 0x1e, 0x13,\n                                                        0xd4, 0xc2, 0x9d, 0xdc, 0xa9, 0xe0, 0x1a, 0xc4,\n                                                        0x57, 0xe9, 0xfb, 0x2c, 0xfb, 0x34, 0x54, 0x36,\n                                                        0x2e, 0x38, 0xcb, 0x4e, 0xd6, 0x61, 0x1e, 0xa1,\n                                                        0x79, 0x15, 0x13, 0xe8, 0xcf, 0x5e, 0xcc, 0x60,\n                                                        0x39, 0x1a, 0x71, 0x84, 0x30, 0x32, 0x4a, 0x74,\n                                                        0xcd, 0xd3, 0xd4, 0xa0, 0xaa, 0xa9, 0xb8, 0x1e,\n                                                        0xe, 0x93, 0x76, 0xf7, 0x9f, 0xb8, 0xf7, 0xfe,\n                                                        0xa6, 0x1, 0xa5, 0xf7, 0x2c, 0xf7, 0x1e, 0xf7,\n                                                        0x31, 0x3, 0xaa, 0x7e, 0x15, 0xf7, 0xc0, 0xa9,\n                                                        0xf7, 0x22, 0xf7, 0x54, 0xf7, 0x4a, 0x1a, 0xf7,\n                                                        0x84, 0xfb, 0x1f, 0xc4, 0x31, 0xfb, 0x48, 0x65,\n                                                        0xfb, 0x3e, 0x55, 0xfb, 0x40, 0xf7, 0x4, 0x65,\n                                                        0xd0, 0xae, 0xa5, 0x8e, 0x9b, 0xaa, 0x1e, 0x58,\n                                                        0xfb, 0x51, 0xfb, 0x9, 0x58, 0x27, 0x77, 0x8,\n                                                        0xf7, 0xa8, 0xf7, 0xbf, 0x15, 0x83, 0x8a, 0x70,\n                                                        0x86, 0x7b, 0x1b, 0x46, 0x7b, 0xd7, 0xf7, 0x24,\n                                                        0xda, 0x90, 0xca, 0xc8, 0xc9, 0x95, 0x42, 0xfb,\n                                                        0x59, 0x74, 0x85, 0x63, 0x88, 0x7b, 0x1f, 0xe,\n                                                        0xfb, 0xce, 0x7e, 0xf7, 0x3a, 0xf7, 0x2f, 0xf7,\n                                                        0x38, 0x1, 0xdd, 0xf7, 0x3d, 0x3, 0xdd, 0xd2,\n                                                        0x63, 0x1d, 0xaf, 0x5c, 0x5b, 0x67, 0x66, 0x5e,\n                                                        0x1e, 0xf7, 0xd6, 0x4, 0x86, 0xa, 0xac, 0x5c,\n                                                        0x5b, 0x67, 0x69, 0x5e, 0x1e, 0xe, 0xfb, 0xce,\n                                                        0xfb, 0x33, 0x76, 0xf7, 0xe3, 0xf7, 0x2c, 0x8b,\n                                                        0xf7, 0x39, 0x12, 0xdd, 0xf7, 0x3d, 0x56, 0xcf,\n                                                        0x13, 0xe8, 0xe4, 0xfb, 0x32, 0x15, 0x96, 0x75,\n                                                        0x5, 0x33, 0x1d, 0x1e, 0x13, 0xf0, 0x5d, 0x67,\n                                                        0x6d, 0x57, 0x3c, 0xd2, 0x8b, 0x8e, 0x1f, 0x13,\n                                                        0xe8, 0xaf, 0x8d, 0x91, 0x80, 0x80, 0x1a, 0x53,\n                                                        0x3a, 0x52, 0x6f, 0x78, 0x1e, 0x13, 0xf0, 0x84,\n                                                        0xf8, 0xba, 0x15, 0x86, 0xa, 0xad, 0x5c, 0x5b,\n                                                        0x67, 0x68, 0x5e, 0x1e, 0xe, 0x95, 0xa, 0xf7,\n                                                        0x6b, 0x15, 0xf8, 0x90, 0xfb, 0x73, 0x5, 0xd4,\n                                                        0x7, 0xfc, 0x38, 0xf7, 0x53, 0xf8, 0x38, 0xf7,\n                                                        0x4d, 0x5, 0xd4, 0x7, 0xfc, 0x90, 0xfb, 0x73,\n                                                        0x5, 0xe, 0x3e, 0xf6, 0xdf, 0xf7, 0xe, 0xe1,\n                                                        0x47, 0xcf, 0x12, 0x13, 0xa0, 0xac, 0xf7, 0xdf,\n                                                        0x15, 0xf8, 0x8c, 0xcf, 0xfc, 0x8c, 0x6, 0xfb,\n                                                        0xb8, 0x4, 0xf8, 0x8c, 0x6, 0x13, 0xc0, 0xcc,\n                                                        0xfc, 0x8c, 0x7, 0xe, 0x95, 0xa, 0x83, 0x15,\n                                                        0xf8, 0x90, 0xf7, 0x73, 0x5, 0xd7, 0x7, 0xfc,\n                                                        0x90, 0xf7, 0x73, 0x5, 0x3f, 0x7, 0xf8, 0x37,\n                                                        0xfb, 0x4b, 0xfc, 0x37, 0xfb, 0x50, 0x5, 0xe,\n                                                        0x7e, 0xf7, 0x3d, 0xf8, 0x85, 0xaf, 0x12, 0xc4,\n                                                        0xf7, 0x17, 0x69, 0xf7, 0x3d, 0x70, 0xf7, 0x29,\n                                                        0x13, 0xe8, 0xf7, 0x73, 0xf7, 0x7b, 0x15, 0xa9,\n                                                        0x6, 0xe2, 0x9a, 0x90, 0xde, 0xbe, 0x1e, 0xc0,\n                                                        0xac, 0xb4, 0xbb, 0xcb, 0x1a, 0xf7, 0x33, 0xfb,\n                                                        0x37, 0x96, 0x6c, 0xfb, 0x38, 0x6d, 0x25, 0x62,\n                                                        0x68, 0x9e, 0x61, 0xbe, 0x9f, 0xb4, 0x97, 0xbf,\n                                                        0xa7, 0x7f, 0x97, 0x81, 0x96, 0x1e, 0x83, 0x93,\n                                                        0x84, 0x93, 0x98, 0x1a, 0xb0, 0xbd, 0x8e, 0x94,\n                                                        0xd9, 0x93, 0x2f, 0x61, 0x51, 0x7b, 0x65, 0x7a,\n                                                        0x6a, 0x1e, 0x71, 0x59, 0x6d, 0x65, 0x9b, 0x44,\n                                                        0x8, 0x13, 0xd0, 0x46, 0xfb, 0x34, 0x15, 0x5c,\n                                                        0xb0, 0x66, 0xbb, 0xb9, 0xb1, 0xaf, 0xbb, 0xb9,\n                                                        0x65, 0xb2, 0x5d, 0x5b, 0x66, 0x63, 0x5e, 0x1e,\n                                                        0xe, 0xf7, 0xaf, 0x6d, 0xb9, 0xf7, 0x13, 0xb0,\n                                                        0x66, 0xbb, 0xf7, 0xa2, 0xbb, 0xf7, 0x23, 0xb2,\n                                                        0x12, 0xeb, 0xe7, 0xf7, 0x25, 0xd8, 0xf8, 0x1,\n                                                        0xba, 0x13, 0xbf, 0xf8, 0x20, 0xf7, 0xac, 0x15,\n                                                        0xf7, 0xd, 0xe3, 0xd1, 0xbc, 0xa9, 0x99, 0x75,\n                                                        0x60, 0x1e, 0x13, 0xaf, 0xfb, 0x25, 0x7d, 0x4e,\n                                                        0x45, 0x5f, 0x1b, 0x69, 0x6f, 0xa8, 0xc7, 0x1f,\n                                                        0xf7, 0x23, 0x4b, 0x15, 0x7e, 0x8a, 0xa3, 0x4f,\n                                                        0xd0, 0x1b, 0xf7, 0xf, 0xcf, 0xf7, 0x1f, 0xf4,\n                                                        0xf7, 0x42, 0xfb, 0x28, 0xf7, 0x16, 0xfb, 0x52,\n                                                        0xfb, 0x5f, 0xfb, 0x41, 0xfb, 0x29, 0xfb, 0x72,\n                                                        0xfb, 0x1e, 0xf7, 0xa, 0xfb, 0x5d, 0xf7, 0xa1,\n                                                        0xdb, 0xd1, 0xa7, 0xab, 0xcd, 0x1f, 0x7e, 0xae,\n                                                        0x5, 0x70, 0x50, 0x55, 0x75, 0x30, 0x1b, 0xfb,\n                                                        0x41, 0xfb, 0xd, 0xf7, 0x25, 0xf7, 0x28, 0xf7,\n                                                        0x78, 0xf7, 0x1a, 0xf3, 0xf7, 0x2a, 0xf7, 0x4c,\n                                                        0xf6, 0xfb, 0x28, 0xfb, 0x9, 0x1f, 0x13, 0xdf,\n                                                        0x33, 0x59, 0xfb, 0xb, 0x3d, 0x60, 0x8f, 0xbc,\n                                                        0x9c, 0x8e, 0x1e, 0xcd, 0xf7, 0x98, 0x5, 0x44,\n                                                        0x6, 0x80, 0x63, 0x5, 0xa5, 0x7d, 0x80, 0xa6,\n                                                        0x5b, 0x1b, 0xfb, 0x1e, 0x4a, 0xfb, 0x36, 0x3e,\n                                                        0x1f, 0x13, 0x0, 0xfb, 0x4, 0xd1, 0x72, 0xa8,\n                                                        0x8c, 0x1e, 0xc8, 0x90, 0xba, 0xbd, 0x96, 0x9c,\n                                                        0x8, 0xe, 0x4b, 0x1d, 0x12, 0x94, 0xf7, 0x5f,\n                                                        0x65, 0x9a, 0x13, 0xf0, 0x94, 0x16, 0x3a, 0xa,\n                                                        0x13, 0xe8, 0x20, 0xa, 0x5, 0x13, 0xf0, 0x7f,\n                                                        0x6d, 0x88, 0x86, 0x55, 0x83, 0x8, 0x13, 0xe8,\n                                                        0x31, 0x1d, 0x9f, 0x8b, 0xb5, 0xf7, 0xc1, 0xa9,\n                                                        0xf7, 0x9b, 0xb3, 0x12, 0xf3, 0xf7, 0x34, 0xf7,\n                                                        0x30, 0xf7, 0x39, 0xfb, 0x1e, 0xf7, 0x40, 0x13,\n                                                        0xf4, 0xf7, 0x9c, 0xf7, 0xeb, 0x15, 0xa9, 0x6,\n                                                        0xcc, 0x88, 0xe3, 0x7c, 0xfb, 0x23, 0x1a, 0x4e,\n                                                        0x7e, 0x3c, 0xfb, 0x2, 0x61, 0x79, 0x9b, 0xb8,\n                                                        0x1e, 0xf7, 0xa2, 0x4, 0xf7, 0x63, 0x7, 0xa2,\n                                                        0x8c, 0x8c, 0xac, 0xbe, 0x1b, 0x13, 0xf8, 0xdc,\n                                                        0xa1, 0x59, 0x45, 0x25, 0x75, 0x62, 0xfb, 0x1a,\n                                                        0x1f, 0xfb, 0x8c, 0xfc, 0x9, 0x15, 0xf7, 0xd6,\n                                                        0x6, 0x13, 0xf4, 0xf7, 0x67, 0xd1, 0xed, 0xdf,\n                                                        0xf7, 0x6, 0x22, 0xc1, 0x37, 0x99, 0x1f, 0x8d,\n                                                        0x7, 0x13, 0xf8, 0xb5, 0x98, 0xf7, 0x5, 0xa5,\n                                                        0xf7, 0x3, 0x1a, 0xf7, 0x30, 0xfb, 0x60, 0x8f,\n                                                        0x53, 0x1e, 0xfb, 0xc9, 0x53, 0x1d, 0xfc, 0x71,\n                                                        0x7, 0x4e, 0x6b, 0x8a, 0x53, 0x8b, 0x1d, 0xd6,\n                                                        0x78, 0xbb, 0x7d, 0xa, 0xfb, 0x44, 0xf7, 0x45,\n                                                        0xf8, 0x2b, 0xae, 0x13, 0xe6, 0xf9, 0x25, 0xf7,\n                                                        0x2c, 0x15, 0x2e, 0x38, 0x38, 0x6d, 0x3d, 0x1b,\n                                                        0x13, 0xea, 0xfb, 0x28, 0x64, 0xf7, 0x46, 0xf7,\n                                                        0x11, 0xf7, 0x3d, 0xb4, 0xf7, 0x31, 0xf7, 0x26,\n                                                        0xf7, 0x6, 0xd3, 0xfb, 0x9, 0x34, 0xae, 0x1f,\n                                                        0xae, 0x6, 0x13, 0xd6, 0x6a, 0x1d, 0x83, 0x80,\n                                                        0x90, 0x92, 0x7c, 0x1f, 0x13, 0xe6, 0x99, 0x6c,\n                                                        0x5c, 0xa2, 0x4e, 0x1b, 0x13, 0xea, 0xfb, 0x66,\n                                                        0xfb, 0x2e, 0xfb, 0x30, 0xfb, 0x5f, 0xfb, 0x4f,\n                                                        0xf7, 0x17, 0xfb, 0x38, 0xf7, 0x7d, 0xf7, 0x14,\n                                                        0xd4, 0xca, 0xde, 0xd4, 0x1f, 0xe, 0x8a, 0x1d,\n                                                        0x68, 0xb8, 0xf8, 0xdf, 0xb7, 0x12, 0xec, 0xf7,\n                                                        0x36, 0xf7, 0x95, 0xf7, 0x42, 0x13, 0xb8, 0x99,\n                                                        0x16, 0xf7, 0xd0, 0x6, 0xf7, 0x90, 0xf7, 0x0,\n                                                        0xf7, 0x38, 0xf7, 0x4c, 0xf7, 0x2e, 0x30, 0xf7,\n                                                        0x42, 0x95, 0x1d, 0x87, 0xb7, 0x89, 0x4e, 0x1a,\n                                                        0xfc, 0x6d, 0x7, 0x66, 0x77, 0x6e, 0x4c, 0x1e,\n                                                        0xf7, 0x89, 0xcd, 0x15, 0xf8, 0x6d, 0x7, 0x8c,\n                                                        0x1d, 0xfb, 0x55, 0x30, 0x1f, 0x13, 0x78, 0x84,\n                                                        0xa, 0x1e, 0xe, 0x9f, 0x8b, 0xb4, 0xf7, 0xb4,\n                                                        0xad, 0xf7, 0xa1, 0xb7, 0x12, 0xf3, 0xf7, 0x36,\n                                                        0xf7, 0x36, 0xa5, 0xf7, 0x6, 0xa4, 0x17, 0x9b,\n                                                        0x16, 0x3c, 0xa, 0x7b, 0x29, 0x1b, 0x4a, 0x78,\n                                                        0x97, 0xb7, 0x1f, 0xf7, 0x7c, 0x7, 0xee, 0xbe,\n                                                        0x6d, 0xfb, 0x11, 0x97, 0x1f, 0xa5, 0xf7, 0xe6,\n                                                        0x71, 0x6, 0xfb, 0x10, 0x7c, 0x58, 0x72, 0x2b,\n                                                        0x1b, 0xf7, 0x63, 0x7, 0xb6, 0x9d, 0x9e, 0xc2,\n                                                        0xf7, 0x1b, 0xd2, 0x7c, 0xfb, 0x22, 0xa2, 0x1e,\n                                                        0xa4, 0xf7, 0x5d, 0xfc, 0xd5, 0x6, 0x13, 0x10,\n                                                        0x68, 0x7, 0xb9, 0x88, 0xb5, 0x89, 0x49, 0x1a,\n                                                        0xfc, 0x6d, 0x7, 0x4d, 0x6c, 0x91, 0x52, 0x8b,\n                                                        0x1d, 0x67, 0x8b, 0xae, 0xf7, 0xba, 0xad, 0xf7,\n                                                        0x19, 0x76, 0xc5, 0x76, 0xf7, 0xc, 0xb7, 0x1,\n                                                        0xf3, 0xf7, 0x36, 0xf7, 0x2d, 0xa4, 0xf7, 0x7,\n                                                        0xa3, 0x3, 0x9b, 0x16, 0xf7, 0xfc, 0xae, 0x6,\n                                                        0x45, 0x8e, 0x63, 0x83, 0xcd, 0x1a, 0xf7, 0x7d,\n                                                        0x7, 0xf7, 0x12, 0x9b, 0x42, 0x39, 0x96, 0x1f,\n                                                        0xa4, 0xf7, 0xe6, 0x72, 0x6, 0x3b, 0x7d, 0x7c,\n                                                        0x46, 0xfb, 0x10, 0x1b, 0xf7, 0x6d, 0x7, 0xb6,\n                                                        0x9d, 0x94, 0xc1, 0xf7, 0x40, 0xa6, 0x56, 0x23,\n                                                        0xa1, 0x1e, 0xa3, 0xf7, 0x5d, 0xfc, 0xcb, 0x68,\n                                                        0x6, 0xba, 0x88, 0xb4, 0x93, 0x49, 0x1a, 0xfc,\n                                                        0x78, 0x7, 0x4d, 0x6c, 0x92, 0x52, 0x8b, 0x1d,\n                                                        0xf7, 0x17, 0x78, 0xac, 0xf7, 0x82, 0xae, 0xf7,\n                                                        0x50, 0x76, 0xf7, 0x60, 0xac, 0x88, 0x77, 0x12,\n                                                        0xb0, 0xf7, 0x45, 0xf7, 0xbf, 0xf7, 0x30, 0x13,\n                                                        0xf6, 0xf8, 0x30, 0xf7, 0x90, 0x15, 0xd0, 0x87,\n                                                        0xab, 0x7d, 0x4b, 0x1a, 0x38, 0x7, 0x60, 0x7b,\n                                                        0x6d, 0x33, 0xfb, 0x51, 0x85, 0xf7, 0x8b, 0xd2,\n                                                        0xf7, 0x40, 0xb5, 0xf7, 0x2e, 0xf7, 0x25, 0xf7,\n                                                        0x6, 0xd3, 0xfb, 0x9, 0x34, 0xae, 0x1e, 0xae,\n                                                        0x6, 0x13, 0xee, 0x6a, 0x1d, 0x84, 0x81, 0x8f,\n                                                        0x90, 0x7f, 0x1f, 0x13, 0xf6, 0x99, 0x6c, 0x5b,\n                                                        0xa5, 0x4a, 0x1b, 0xfb, 0x6c, 0xfb, 0x28, 0xfb,\n                                                        0x36, 0xfb, 0x59, 0xfb, 0x42, 0xf7, 0xe, 0xfb,\n                                                        0x45, 0xf7, 0x8e, 0xe2, 0xf7, 0x11, 0xa7, 0xad,\n                                                        0xbb, 0x1f, 0xf7, 0x13, 0x7, 0xdd, 0xa3, 0x84,\n                                                        0xc9, 0x92, 0x1e, 0xae, 0xfb, 0xeb, 0x7, 0xe,\n                                                        0xf7, 0x17, 0xa0, 0x76, 0xf7, 0xda, 0xba, 0xf7,\n                                                        0xa0, 0xae, 0x1, 0xf5, 0xf7, 0x36, 0xf7, 0x85,\n                                                        0x7f, 0x1d, 0xa0, 0x16, 0xf7, 0xe5, 0xae, 0x6,\n                                                        0x56, 0x91, 0x66, 0x8f, 0xc8, 0x1a, 0xf7, 0x70,\n                                                        0xf7, 0x85, 0xfb, 0x70, 0x7, 0x4e, 0x66, 0x87,\n                                                        0x56, 0x85, 0x1e, 0x68, 0xf7, 0xe8, 0xae, 0x7,\n                                                        0x56, 0x92, 0x68, 0x8f, 0xc7, 0x1a, 0xf8, 0x64,\n                                                        0x7, 0xcc, 0xb8, 0x8e, 0xb6, 0x8e, 0x1e, 0xae,\n                                                        0xfb, 0xe8, 0x68, 0x7, 0xb7, 0x88, 0xb9, 0x89,\n                                                        0x49, 0x1a, 0xfb, 0x59, 0xfb, 0x85, 0xf7, 0x59,\n                                                        0x7, 0xcd, 0xb9, 0x8d, 0xb7, 0x8e, 0x1e, 0xae,\n                                                        0xfb, 0xe5, 0x68, 0x7, 0xb5, 0x87, 0xb6, 0x89,\n                                                        0x4a, 0x7e, 0xa, 0x50, 0x6b, 0x86, 0x56, 0x8b,\n                                                        0xa, 0x5c, 0xa, 0x27, 0xa, 0xe, 0x2b, 0xac,\n                                                        0xb7, 0xac, 0xf9, 0x7, 0xae, 0x1, 0x63, 0xf7,\n                                                        0x23, 0xf7, 0x11, 0x7f, 0x1d, 0xf7, 0x13, 0xf9,\n                                                        0x15, 0x15, 0xc4, 0x89, 0xb7, 0x7f, 0x47, 0x1a,\n                                                        0xfc, 0x5e, 0x7, 0x6c, 0x8b, 0x53, 0x4a, 0x6f,\n                                                        0x7b, 0x99, 0x9c, 0x9b, 0x94, 0x92, 0x93, 0x95,\n                                                        0x1e, 0x90, 0x92, 0x90, 0x94, 0x9b, 0x1a, 0xc2,\n                                                        0x59, 0x9f, 0x75, 0x6e, 0x61, 0x75, 0x54, 0x7a,\n                                                        0x95, 0xfb, 0x2, 0xf7, 0x2a, 0xf2, 0xf7, 0x10,\n                                                        0x9a, 0xf4, 0x1e, 0xf8, 0x5e, 0x7, 0xd0, 0xab,\n                                                        0x94, 0xc4, 0x8f, 0x1e, 0xae, 0xfb, 0xf4, 0x7,\n                                                        0xe, 0xf7, 0x17, 0x4e, 0x1d, 0x1, 0xf7, 0x9,\n                                                        0x7f, 0x1d, 0xa9, 0x16, 0xf7, 0xe5, 0xae, 0x6,\n                                                        0x56, 0x92, 0x68, 0x8f, 0xc7, 0x1a, 0xf7, 0x4e,\n                                                        0x7, 0xa6, 0xa4, 0xf7, 0x4a, 0xfb, 0x6d, 0xb5,\n                                                        0x59, 0x84, 0x7b, 0x31, 0x8c, 0x19, 0x68, 0xf7,\n                                                        0xe4, 0xae, 0x7, 0x77, 0x8c, 0x7d, 0x8d, 0x7c,\n                                                        0x9d, 0xfb, 0xc5, 0xf8, 0x4, 0x18, 0xf7, 0x3c,\n                                                        0xf7, 0x40, 0xbb, 0xb2, 0xf4, 0x91, 0x8, 0xae,\n                                                        0xfb, 0xb5, 0x68, 0x7, 0xf7, 0x0, 0x8a, 0x86,\n                                                        0x6a, 0x55, 0x55, 0xfb, 0x6d, 0xfb, 0x64, 0x18,\n                                                        0xf7, 0x6a, 0x7, 0xe1, 0xad, 0x83, 0xc2, 0x8f,\n                                                        0x1e, 0xae, 0xfb, 0xe6, 0x68, 0x7, 0xb9, 0x88,\n                                                        0xb4, 0x7e, 0x49, 0x1a, 0xfc, 0x59, 0x7, 0x4e,\n                                                        0x6b, 0x87, 0x54, 0x8b, 0x1d, 0x9f, 0x8b, 0xb4,\n                                                        0xf8, 0xec, 0x60, 0x1d, 0x42, 0x96, 0x1d, 0xf8,\n                                                        0x62, 0x7, 0xcf, 0xaa, 0x99, 0xd1, 0x1e, 0xae,\n                                                        0xfb, 0xf1, 0x68, 0x7, 0xb8, 0xb4, 0x7b, 0x49,\n                                                        0x1f, 0xfc, 0x62, 0x7, 0x4e, 0x61, 0x91, 0x5f,\n                                                        0x8b, 0xa, 0xf7, 0xbd, 0x8b, 0xae, 0xf8, 0xf3,\n                                                        0xae, 0x12, 0xb2, 0xf7, 0x17, 0x4a, 0xb5, 0xf8,\n                                                        0x8c, 0xf7, 0x2f, 0x13, 0xd8, 0x99, 0x16, 0xf7,\n                                                        0x7e, 0xae, 0x6, 0x38, 0x90, 0x79, 0x90, 0xd1,\n                                                        0x1a, 0xf8, 0x64, 0x8d, 0x7, 0x13, 0xe8, 0xf7,\n                                                        0x8e, 0xfc, 0xd7, 0x5, 0xa6, 0x6, 0xf7, 0x8e,\n                                                        0xf8, 0xe6, 0x5, 0x8d, 0xfc, 0x78, 0x6, 0x49,\n                                                        0x6e, 0x88, 0x4f, 0x85, 0x1e, 0x68, 0xf7, 0xe0,\n                                                        0xae, 0x7, 0x49, 0x94, 0x75, 0x7d, 0xdb, 0x1a,\n                                                        0xf8, 0x4b, 0x7, 0xe1, 0xab, 0x8d, 0xc3, 0x8f,\n                                                        0x1e, 0xae, 0xfb, 0x90, 0x7, 0x13, 0xd0, 0xfb,\n                                                        0x5c, 0xfc, 0x6c, 0xfb, 0x5c, 0xf8, 0x6c, 0x5,\n                                                        0xfb, 0x91, 0x68, 0x6, 0xd2, 0x86, 0x9d, 0x7d,\n                                                        0x57, 0x1a, 0xfc, 0x5b, 0x7, 0x51, 0x7e, 0x7c,\n                                                        0x3d, 0x8b, 0xa, 0xd6, 0x8e, 0x76, 0xb2, 0x76,\n                                                        0xf8, 0xb5, 0x76, 0xf7, 0x9, 0xae, 0x12, 0xf3,\n                                                        0xb7, 0xf8, 0x43, 0xb7, 0x13, 0x7c, 0x72, 0x1d,\n                                                        0x13, 0xbc, 0x37, 0xa, 0xe, 0x51, 0x1d, 0x1,\n                                                        0xae, 0xf7, 0x45, 0xf7, 0xf6, 0x48, 0xa, 0xfb,\n                                                        0x48, 0x78, 0xa, 0xfb, 0x7b, 0x3c, 0x1d, 0xf7,\n                                                        0x21, 0x5e, 0xa, 0xf7, 0x21, 0x5e, 0x1d, 0xfb,\n                                                        0x1d, 0xfb, 0x6e, 0x1e, 0xe, 0x67, 0xa0, 0x76,\n                                                        0xf7, 0xc3, 0xae, 0xf7, 0xb9, 0xb8, 0x1, 0xef,\n                                                        0xf7, 0x36, 0xf7, 0x3a, 0xf7, 0x40, 0x3, 0x9b,\n                                                        0x16, 0xf7, 0xe2, 0xae, 0x6, 0x46, 0x94, 0x78,\n                                                        0x83, 0xdc, 0x1a, 0xf7, 0x4e, 0x7, 0xf7, 0x3a,\n                                                        0xf7, 0x40, 0xb6, 0xf7, 0x23, 0xf7, 0x3d, 0xfb,\n                                                        0x4a, 0x9d, 0x3b, 0x1f, 0xfb, 0xd6, 0x68, 0x6,\n                                                        0xc0, 0x86, 0xaa, 0x86, 0x62, 0x1a, 0xfc, 0x6d,\n                                                        0x7, 0x31, 0x64, 0x93, 0x5e, 0x1e, 0xf7, 0x8a,\n                                                        0xf7, 0xc3, 0x15, 0xf7, 0x96, 0x7, 0xa1, 0x8c,\n                                                        0x98, 0x98, 0xad, 0x1b, 0xdd, 0xaf, 0x6f, 0xfb,\n                                                        0x6, 0xfb, 0x10, 0x5e, 0x6e, 0xfb, 0xd, 0x8d,\n                                                        0x1f, 0xe, 0xf7, 0x17, 0xfb, 0x44, 0xf7, 0x52,\n                                                        0x93, 0x1d, 0x5a, 0xa, 0xf7, 0xa5, 0x89, 0x15,\n                                                        0xfb, 0x1f, 0xf7, 0x5, 0xf5, 0x68, 0xe1, 0x1b,\n                                                        0xcd, 0xc1, 0x9f, 0x9a, 0xb1, 0x1f, 0x85, 0xa3,\n                                                        0x2d, 0x6d, 0x2f, 0xa4, 0x55, 0xf7, 0x8, 0x19,\n                                                        0xf7, 0x2b, 0xb2, 0xf1, 0xf7, 0x12, 0xf7, 0x42,\n                                                        0x1a, 0xf7, 0x6e, 0xfb, 0x35, 0xf7, 0x20, 0x5e,\n                                                        0x1d, 0xfb, 0x13, 0xfb, 0x7b, 0xfb, 0x14, 0xd8,\n                                                        0xfb, 0x33, 0xf7, 0x35, 0x5b, 0x1e, 0x4e, 0xf7,\n                                                        0xe3, 0x79, 0x1d, 0xf7, 0x47, 0x66, 0x1d, 0xfb,\n                                                        0x47, 0x78, 0xa, 0xfb, 0x7c, 0x65, 0x1d, 0xf7,\n                                                        0x7c, 0xe2, 0x1e, 0xe, 0xd6, 0xa0, 0x76, 0xf9,\n                                                        0xc, 0xb7, 0x68, 0xae, 0x12, 0xf7, 0x6, 0xf7,\n                                                        0x36, 0xf7, 0x4b, 0xf7, 0x3f, 0x13, 0xd8, 0xf7,\n                                                        0xa8, 0xf7, 0xed, 0x15, 0xf7, 0x89, 0x7, 0xaa,\n                                                        0x90, 0x8d, 0x96, 0xc2, 0x1b, 0xdb, 0xb4, 0x6a,\n                                                        0x26, 0xfb, 0x16, 0x57, 0x75, 0xfb, 0x17, 0x8a,\n                                                        0x1f, 0xfb, 0x8e, 0xfb, 0xed, 0x15, 0xf7, 0xe6,\n                                                        0xae, 0x6, 0x49, 0x94, 0x75, 0x8e, 0xdb, 0x1a,\n                                                        0xf7, 0x4e, 0xa6, 0x7, 0xf7, 0x63, 0xfb, 0xcd,\n                                                        0x5, 0xf7, 0x61, 0xae, 0x6, 0x7f, 0x77, 0x8c,\n                                                        0x9d, 0x7d, 0x1f, 0xfb, 0x58, 0xf7, 0xa7, 0x5,\n                                                        0xc1, 0x9c, 0xf2, 0xa8, 0xf7, 0xf, 0x1a, 0xf7,\n                                                        0x3c, 0xfb, 0x68, 0x95, 0x45, 0x1e, 0xfb, 0xd6,\n                                                        0x6, 0x13, 0xb8, 0x68, 0x7, 0xc4, 0x87, 0xaa,\n                                                        0x86, 0x60, 0x1a, 0xfc, 0x62, 0x7, 0x3a, 0x77,\n                                                        0x88, 0x47, 0x83, 0x1e, 0xe, 0x30, 0x78, 0xac,\n                                                        0xf9, 0x1a, 0xaa, 0x8c, 0x8e, 0xa, 0x13, 0xd8,\n                                                        0x7c, 0x1d, 0x97, 0x94, 0x1d, 0xc4, 0x1b, 0x47,\n                                                        0x1d, 0x13, 0xb8, 0x85, 0xa, 0x77, 0x75, 0x92,\n                                                        0x93, 0x73, 0x1f, 0x13, 0xd8, 0x94, 0x70, 0x6e,\n                                                        0x94, 0x6e, 0x46, 0x1d, 0xe, 0x9f, 0x8b, 0xae,\n                                                        0xf8, 0x61, 0x76, 0xf7, 0x3d, 0xab, 0x1, 0xf7,\n                                                        0x91, 0x7f, 0x1d, 0xf7, 0x30, 0x16, 0xf7, 0xf9,\n                                                        0xae, 0x6, 0x41, 0x90, 0x73, 0x8d, 0xe0, 0x1a,\n                                                        0xf8, 0x99, 0x7, 0xd0, 0x87, 0xf2, 0x86, 0x9f,\n                                                        0xfb, 0x34, 0x8, 0xa8, 0x6, 0x89, 0xf7, 0x5d,\n                                                        0x5, 0xfc, 0xef, 0xfb, 0x5d, 0xa8, 0x6, 0x9f,\n                                                        0xf7, 0x34, 0xf2, 0x90, 0xd1, 0x8f, 0x8, 0xfc,\n                                                        0x99, 0x7, 0x37, 0x73, 0x89, 0x42, 0x8b, 0x1d,\n                                                        0x6b, 0xa, 0x63, 0xa, 0x9b, 0xf9, 0x15, 0x15,\n                                                        0xc3, 0x85, 0xa5, 0x8c, 0x37, 0x1a, 0xfb, 0xdb,\n                                                        0x7, 0xfb, 0x4d, 0xf7, 0x1c, 0x50, 0xf7, 0x1c,\n                                                        0xf7, 0x26, 0xf6, 0xe6, 0xf7, 0x2d, 0x1e, 0xf7,\n                                                        0xdb, 0x7, 0xcd, 0xa2, 0x9a, 0x43, 0xa, 0x73,\n                                                        0x4e, 0x1a, 0xfb, 0xdb, 0x7, 0x4b, 0x89, 0xfb,\n                                                        0x17, 0xfb, 0x44, 0xfb, 0x24, 0x8b, 0xf7, 0x1e,\n                                                        0xc4, 0x1e, 0xf7, 0xdb, 0x7, 0xe3, 0xaa, 0x89,\n                                                        0xcd, 0x8e, 0x1e, 0xae, 0xfb, 0xe6, 0x7, 0xe,\n                                                        0xd6, 0x8e, 0x76, 0xf9, 0x27, 0xae, 0x1, 0xf7,\n                                                        0xf8, 0x79, 0x15, 0xa6, 0x6, 0xf7, 0x78, 0xf8,\n                                                        0xd5, 0xa1, 0xc3, 0x98, 0x9e, 0xc2, 0x92, 0x19,\n                                                        0xae, 0xfb, 0x69, 0x68, 0x7, 0xc4, 0x88, 0xa8,\n                                                        0x87, 0x64, 0x1a, 0xfb, 0x27, 0xfc, 0x18, 0x5,\n                                                        0xfb, 0x21, 0xf7, 0xe9, 0x77, 0xab, 0x9e, 0x1a,\n                                                        0xb1, 0xa2, 0x8b, 0xca, 0x8f, 0x1e, 0xae, 0xfb,\n                                                        0xe4, 0x68, 0x7, 0xb6, 0x84, 0x9a, 0x88, 0xa5,\n                                                        0x4f, 0x8, 0xe, 0xf7, 0xf5, 0x91, 0x76, 0xf8,\n                                                        0x7d, 0x76, 0xf7, 0x50, 0xae, 0x1, 0xf7, 0xc0,\n                                                        0x7c, 0x15, 0xa7, 0x6, 0xf7, 0x4a, 0xf8, 0x68,\n                                                        0x5, 0x92, 0x6, 0xf7, 0x3c, 0xfc, 0x68, 0x5,\n                                                        0xa6, 0x6, 0xf7, 0x5c, 0xf8, 0xe4, 0x97, 0xb0,\n                                                        0xa1, 0xa3, 0xae, 0x8e, 0x19, 0xae, 0xfb, 0x4a,\n                                                        0x68, 0x7, 0xad, 0x89, 0xae, 0x8a, 0x62, 0x1a,\n                                                        0xfb, 0xa, 0xfc, 0x8, 0x5, 0x89, 0x6, 0xfb,\n                                                        0x5, 0xf7, 0xf4, 0x83, 0x99, 0x97, 0x1a, 0xad,\n                                                        0xa8, 0x8c, 0xb6, 0x8e, 0x1e, 0xae, 0xfb, 0xcc,\n                                                        0x68, 0x7, 0xbb, 0x89, 0x96, 0x80, 0x98, 0x75,\n                                                        0xae, 0x35, 0x18, 0xfb, 0x9, 0xfb, 0xc5, 0x5,\n                                                        0x89, 0x6, 0xfb, 0xf, 0xf8, 0x8, 0x88, 0x8c,\n                                                        0x96, 0x1a, 0xb0, 0xa7, 0x8d, 0xaf, 0x8e, 0x1e,\n                                                        0xae, 0xfb, 0xba, 0x68, 0x7, 0xb5, 0x85, 0x95,\n                                                        0x81, 0x9c, 0x5b, 0x8, 0xe, 0xd6, 0x4e, 0x1d,\n                                                        0x1, 0x9b, 0xf9, 0x3f, 0x3, 0x9b, 0x16, 0xf7,\n                                                        0x8e, 0xae, 0x6, 0x68, 0x8e, 0x55, 0x8f, 0xae,\n                                                        0x1a, 0xf7, 0x20, 0xf7, 0x56, 0x5, 0xf7, 0x3,\n                                                        0xfb, 0x46, 0x96, 0x7b, 0x81, 0x1a, 0x70, 0x6f,\n                                                        0x89, 0x57, 0x88, 0x1e, 0x68, 0xf7, 0xe8, 0xae,\n                                                        0x7, 0x6f, 0x8d, 0x7b, 0x8d, 0x56, 0xdd, 0xfb,\n                                                        0x4a, 0xf7, 0xa5, 0x18, 0xf7, 0x32, 0xf7, 0x72,\n                                                        0x9e, 0x9c, 0xe6, 0x93, 0x8, 0xae, 0xfb, 0x8e,\n                                                        0x68, 0x7, 0xb7, 0x88, 0xa7, 0x8a, 0x6c, 0x1a,\n                                                        0x70, 0x8b, 0x95, 0xfb, 0x6, 0xfb, 0x32, 0x1e,\n                                                        0xfb, 0x1, 0xf7, 0x3c, 0x88, 0x87, 0x98, 0x1a,\n                                                        0xa8, 0x9f, 0x8b, 0xc6, 0x8f, 0x1e, 0xae, 0xfb,\n                                                        0xee, 0x68, 0x7, 0xb5, 0x89, 0x9c, 0x72, 0xa0,\n                                                        0x6c, 0xf7, 0x5a, 0xfb, 0xad, 0x18, 0xfb, 0x39,\n                                                        0xfb, 0x67, 0x62, 0x55, 0x5b, 0x8b, 0x72, 0x89,\n                                                        0x19, 0xe, 0xd6, 0x4e, 0x1d, 0x1, 0xf7, 0xaa,\n                                                        0xf7, 0x36, 0xf7, 0x1d, 0xf7, 0xe, 0x3, 0x69,\n                                                        0x1d, 0x8d, 0xde, 0x1a, 0xf7, 0x42, 0x66, 0xa,\n                                                        0xcf, 0x7f, 0x7a, 0x6e, 0xfb, 0x38, 0xfb, 0xa0,\n                                                        0x18, 0x42, 0x1d, 0xe, 0x8c, 0xa, 0x1, 0x39,\n                                                        0xa, 0xe, 0x91, 0x1d, 0xce, 0xf3, 0x3, 0xce,\n                                                        0xfb, 0x29, 0x15, 0xf7, 0x7e, 0xb6, 0x3b, 0x6,\n                                                        0x5a, 0x8a, 0xa0, 0xab, 0x1f, 0xf8, 0xfe, 0x7,\n                                                        0xc6, 0x96, 0x96, 0xc3, 0x1e, 0xca, 0xb6, 0xfb,\n                                                        0x7e, 0x6, 0xe, 0xfc, 0x5, 0xfb, 0xa, 0x76,\n                                                        0xf7, 0x21, 0x76, 0xf9, 0x5a, 0x77, 0x1, 0xf7,\n                                                        0x56, 0xfb, 0x1f, 0x15, 0xcf, 0x6, 0xfb, 0x4e,\n                                                        0xf9, 0xd2, 0x5, 0x44, 0x6, 0xe, 0x91, 0x1d,\n                                                        0xf7, 0x36, 0xf3, 0x3, 0xab, 0x21, 0x15, 0x60,\n                                                        0xf7, 0x7e, 0xf9, 0xcf, 0xfb, 0x7e, 0x60, 0xca,\n                                                        0x7, 0xc3, 0x96, 0x80, 0x50, 0x1f, 0xfc, 0xfe,\n                                                        0x7, 0x6a, 0x8b, 0x77, 0x59, 0x1e, 0xe, 0x49,\n                                                        0xf7, 0xe0, 0x76, 0xf8, 0x1, 0x77, 0x1, 0xd4,\n                                                        0xf7, 0xcb, 0x15, 0xe4, 0x6, 0xf7, 0x15, 0xf7,\n                                                        0xa0, 0xf7, 0x15, 0xfb, 0xa0, 0x5, 0xe4, 0x6,\n                                                        0xfb, 0x46, 0xf8, 0x1, 0x5, 0x3b, 0x6, 0xe,\n                                                        0xfb, 0x11, 0xbd, 0x1, 0x40, 0x4, 0x59, 0xf8,\n                                                        0x88, 0xbd, 0x7, 0xe, 0x90, 0xa, 0xf7, 0x52,\n                                                        0xf8, 0xa4, 0x26, 0xa, 0x7d, 0xd1, 0x5a, 0x50,\n                                                        0xa, 0x12, 0xa4, 0xf7, 0x26, 0xfb, 0x13, 0xf7,\n                                                        0x19, 0xf7, 0x8, 0xf7, 0x1e, 0x13, 0x66, 0xf7,\n                                                        0xba, 0xc3, 0x32, 0x1d, 0x13, 0x26, 0x31, 0xa,\n                                                        0x23, 0xb6, 0xfb, 0x3, 0xfb, 0x10, 0x5b, 0x3a,\n                                                        0x1d, 0x1e, 0xb2, 0x6d, 0x93, 0xa0, 0x1a, 0x13,\n                                                        0x5a, 0x9b, 0xac, 0x9f, 0xaf, 0xd5, 0x8f, 0x55,\n                                                        0x58, 0x1e, 0x53, 0x7, 0x44, 0x1d, 0x13, 0x8a,\n                                                        0x26, 0x1d, 0xe, 0x30, 0x7d, 0xab, 0x81, 0x76,\n                                                        0xf8, 0x44, 0xc1, 0xf7, 0x5f, 0x77, 0x12, 0xd3,\n                                                        0xf7, 0x1f, 0xf7, 0x37, 0xf7, 0x27, 0x13, 0x7c,\n                                                        0xd3, 0x7e, 0x15, 0x97, 0x6, 0xda, 0xc3, 0x5,\n                                                        0x13, 0xbc, 0x5e, 0xb9, 0xb2, 0x7f, 0xaa, 0x1b,\n                                                        0xf7, 0x39, 0xd8, 0xf7, 0x5, 0xf7, 0x13, 0xf7,\n                                                        0x17, 0x46, 0xf7, 0x8, 0xfb, 0xb, 0x46, 0x67,\n                                                        0x65, 0x79, 0x7a, 0x1f, 0xf7, 0x97, 0xfb, 0x56,\n                                                        0x69, 0x7, 0xaf, 0x84, 0x9e, 0x87, 0x5c, 0x1a,\n                                                        0x13, 0x7c, 0xf7, 0x1f, 0xfc, 0x7b, 0x15, 0xf7,\n                                                        0x9b, 0x7, 0xa1, 0x94, 0x9a, 0xb0, 0xb9, 0x1b,\n                                                        0xe2, 0x91, 0xfb, 0x1a, 0x50, 0x1f, 0x13, 0xbc,\n                                                        0xfb, 0x31, 0x68, 0x58, 0x4f, 0x54, 0x7e, 0xbe,\n                                                        0xa7, 0x1e, 0xe, 0xfb, 0x5f, 0x7d, 0xce, 0x86,\n                                                        0x1d, 0xf7, 0x12, 0xf7, 0x10, 0x13, 0xb8, 0xf8,\n                                                        0x30, 0xf7, 0x1, 0x15, 0x70, 0x73, 0x71, 0x6e,\n                                                        0x52, 0x1b, 0x3d, 0x4d, 0xb5, 0xf7, 0x20, 0x8c,\n                                                        0x1f, 0xf5, 0x8c, 0x91, 0xf0, 0xd9, 0x1b, 0x9a,\n                                                        0xa5, 0x82, 0x6d, 0x1f, 0x13, 0xd8, 0x8f, 0x1d,\n                                                        0x37, 0xb0, 0x44, 0x2d, 0xfb, 0x22, 0x62, 0xfb,\n                                                        0x59, 0xfb, 0x1f, 0xe1, 0xfb, 0x2, 0xf7, 0x14,\n                                                        0xda, 0xcd, 0xb3, 0xcc, 0xb9, 0x1e, 0xe, 0x30,\n                                                        0x7d, 0xc3, 0xf8, 0xb, 0xc3, 0xf7, 0x3d, 0xad,\n                                                        0x12, 0xa4, 0xf7, 0x28, 0xf7, 0x37, 0xf7, 0x1f,\n                                                        0x17, 0xf7, 0xe7, 0xbf, 0x15, 0x4a, 0x7, 0xc9,\n                                                        0x9c, 0x94, 0x8c, 0xf7, 0x10, 0x9a, 0x8, 0x13,\n                                                        0xf8, 0xac, 0x7, 0x52, 0x8d, 0x89, 0xa8, 0xa6,\n                                                        0x1a, 0xf8, 0xc9, 0xfb, 0x6b, 0x69, 0x7, 0xc2,\n                                                        0x87, 0xa0, 0x8a, 0x56, 0x1a, 0xfb, 0x41, 0x7,\n                                                        0xa5, 0x73, 0x69, 0xaf, 0x4f, 0x1b, 0x2d, 0x28,\n                                                        0x42, 0xfb, 0x42, 0xfb, 0x26, 0xe7, 0x2d, 0xde,\n                                                        0xd6, 0xa7, 0xa7, 0xb1, 0xaf, 0x1f, 0x13, 0xd8,\n                                                        0x88, 0xc7, 0x15, 0x80, 0x66, 0x50, 0x5d, 0x3b,\n                                                        0x8b, 0xf7, 0x12, 0xc5, 0xec, 0x99, 0xe9, 0xd2,\n                                                        0xc3, 0xa1, 0x4e, 0x8a, 0x1e, 0xe, 0x49, 0x1d,\n                                                        0x98, 0xa, 0x17, 0xf7, 0x38, 0xf7, 0xae, 0x15,\n                                                        0x13, 0xe0, 0xf7, 0x1e, 0xa9, 0xa1, 0xb0, 0xdb,\n                                                        0x7d, 0xfb, 0x6, 0x5d, 0x8c, 0x1e, 0xfb, 0x15,\n                                                        0x66, 0x15, 0xf7, 0x90, 0x6, 0x13, 0xf0, 0xc1,\n                                                        0x7b, 0xf7, 0x42, 0xfb, 0x42, 0x1e, 0x13, 0xd0,\n                                                        0x2b, 0x1d, 0xe, 0xfb, 0xce, 0x8b, 0xad, 0xf8,\n                                                        0x13, 0xb7, 0xcf, 0xf7, 0x36, 0x6c, 0xaa, 0x12,\n                                                        0xd2, 0xf7, 0x1f, 0x13, 0xd8, 0x99, 0x16, 0xf7,\n                                                        0xaa, 0xad, 0x6, 0x4a, 0x8d, 0x7a, 0x9a, 0xb6,\n                                                        0x1a, 0xf7, 0xd7, 0xe2, 0xb7, 0x34, 0xf7, 0xe,\n                                                        0x7, 0xa6, 0x86, 0xbd, 0xbb, 0x97, 0xa3, 0x88,\n                                                        0x7b, 0x1e, 0x7c, 0x75, 0x7b, 0x70, 0x1a, 0x13,\n                                                        0xe8, 0x77, 0x9c, 0x69, 0xb5, 0xb3, 0xa2, 0xa6,\n                                                        0xae, 0xd0, 0x40, 0xaa, 0x4e, 0xfb, 0x49, 0x8a,\n                                                        0xfb, 0x19, 0x2a, 0x1e, 0x52, 0x5f, 0xc4, 0xfb,\n                                                        0xd7, 0x6, 0x56, 0x74, 0x88, 0x69, 0x87, 0x1e,\n                                                        0xe, 0xfb, 0x62, 0xf7, 0x3a, 0xfb, 0x2d, 0xab,\n                                                        0xf7, 0x1, 0xf7, 0xb, 0xe2, 0xa7, 0xf7, 0x6c,\n                                                        0xc0, 0x82, 0xaa, 0x12, 0xa7, 0xe3, 0x3c, 0xf7,\n                                                        0x9, 0xfb, 0x9, 0xf7, 0x1d, 0xf7, 0x15, 0xf7,\n                                                        0x1b, 0x69, 0xda, 0x13, 0x7a, 0x20, 0xf7, 0xc,\n                                                        0x63, 0x15, 0x53, 0x86, 0x67, 0x71, 0x63, 0x1a,\n                                                        0x13, 0x79, 0x20, 0x53, 0xd5, 0x64, 0xf7, 0x10,\n                                                        0xf7, 0x11, 0xf7, 0x18, 0xa6, 0xf7, 0x10, 0xf7,\n                                                        0x3, 0xfb, 0x7, 0x95, 0x5a, 0x8c, 0x1e, 0x13,\n                                                        0x79, 0x40, 0xfb, 0x1f, 0x8d, 0x71, 0x8c, 0xad,\n                                                        0x1a, 0xa9, 0xb0, 0x9f, 0x9e, 0xec, 0x8b, 0x8b,\n                                                        0x94, 0xa8, 0x1e, 0xd3, 0xa2, 0xac, 0xc9, 0xc8,\n                                                        0x1a, 0xc7, 0x6d, 0x9e, 0x81, 0x95, 0x1e, 0x13,\n                                                        0x7a, 0x20, 0xdd, 0xc0, 0xfb, 0x17, 0x6, 0x13,\n                                                        0x94, 0xc0, 0x9b, 0x63, 0x67, 0x91, 0x67, 0x1b,\n                                                        0xfb, 0x1d, 0x49, 0x37, 0x3b, 0x43, 0xbb, 0x5a,\n                                                        0xd5, 0x70, 0x1f, 0x89, 0x7, 0x60, 0x7f, 0x41,\n                                                        0x64, 0x4c, 0x1a, 0x57, 0xac, 0x7c, 0xb8, 0x7b,\n                                                        0x1e, 0x13, 0x7a, 0x20, 0xaa, 0x7d, 0x15, 0xf7,\n                                                        0x41, 0x6, 0xbf, 0xa7, 0x7c, 0x67, 0x44, 0xfb,\n                                                        0x1e, 0x8b, 0x63, 0x7a, 0x2e, 0x8a, 0xcb, 0xa1,\n                                                        0x94, 0x9b, 0xa5, 0xa0, 0x1f, 0x13, 0x74, 0xc0,\n                                                        0xa2, 0xf7, 0xfd, 0x15, 0xca, 0x90, 0xd1, 0xc8,\n                                                        0xcd, 0x8b, 0x33, 0x5e, 0x52, 0x88, 0x45, 0x4c,\n                                                        0x50, 0x84, 0xc5, 0xd0, 0x1e, 0xe, 0x30, 0x82,\n                                                        0x1d, 0xf7, 0x5f, 0x77, 0x1, 0xbb, 0xf7, 0x1f,\n                                                        0xf7, 0x2c, 0x8a, 0xa, 0x9b, 0x41, 0xa, 0x8b,\n                                                        0xb3, 0x9c, 0x1f, 0x76, 0xa, 0x57, 0x60, 0x75,\n                                                        0x53, 0x5b, 0x1e, 0xf7, 0xad, 0xfb, 0x54, 0x69,\n                                                        0x7, 0xb2, 0x83, 0x99, 0x88, 0x5c, 0x1a, 0xfc,\n                                                        0x81, 0x7, 0x5a, 0x7a, 0x8a, 0x67, 0x8b, 0xa,\n                                                        0x5d, 0xa, 0x12, 0xb5, 0xf7, 0x2f, 0xfb, 0x1d,\n                                                        0xf7, 0x2f, 0xfb, 0x26, 0x84, 0x1d, 0x13, 0xc8,\n                                                        0x2d, 0xa, 0x13, 0xd0, 0xb7, 0xf8, 0xd7, 0x15,\n                                                        0x60, 0xab, 0x69, 0xb9, 0xb6, 0xad, 0xac, 0xb7,\n                                                        0xb6, 0x69, 0xae, 0x60, 0x5e, 0x6a, 0x67, 0x61,\n                                                        0x1e, 0xe, 0xfb, 0xce, 0xfb, 0x5f, 0xf7, 0x35,\n                                                        0xf8, 0xd6, 0xf7, 0x2f, 0x12, 0xea, 0xf7, 0x2c,\n                                                        0xfb, 0x27, 0xf7, 0x1f, 0x13, 0xd0, 0xc5, 0xf8,\n                                                        0x3f, 0x15, 0xae, 0x88, 0xa7, 0x8a, 0x54, 0x7e,\n                                                        0xa, 0x61, 0x83, 0x69, 0x63, 0x88, 0x6e, 0x8c,\n                                                        0x9b, 0x93, 0x92, 0x95, 0x91, 0x96, 0x1e, 0x90,\n                                                        0x94, 0x90, 0x95, 0x96, 0x1a, 0xa0, 0x79, 0xac,\n                                                        0x62, 0x61, 0x77, 0x6c, 0x6f, 0x41, 0xd6, 0x6f,\n                                                        0xc2, 0xf7, 0x4b, 0x8f, 0xf7, 0x28, 0xc4, 0x1e,\n                                                        0xf8, 0x5f, 0xfb, 0x5e, 0x7, 0x13, 0xe0, 0xbd,\n                                                        0xf7, 0x2c, 0x15, 0x60, 0xaa, 0x69, 0xb9, 0xb6,\n                                                        0xae, 0xac, 0xb7, 0xb6, 0x68, 0xae, 0x60, 0x5e,\n                                                        0x6b, 0x67, 0x61, 0x1e, 0xe, 0x30, 0x8b, 0xad,\n                                                        0xf8, 0x3f, 0x77, 0xf7, 0x7f, 0x77, 0x1, 0xd1,\n                                                        0x8a, 0xa, 0xa1, 0x16, 0x99, 0xa, 0x5b, 0x92,\n                                                        0x87, 0x94, 0xb7, 0x1a, 0xf3, 0x7, 0xa2, 0xa3,\n                                                        0x5, 0xf5, 0xfb, 0x1e, 0x98, 0x77, 0x80, 0x1a,\n                                                        0x7b, 0x6f, 0x88, 0x7d, 0x1e, 0x69, 0xf7, 0x7e,\n                                                        0xad, 0x7, 0x83, 0x84, 0x8c, 0x99, 0x81, 0x1f,\n                                                        0xfb, 0x56, 0xf7, 0x96, 0xa5, 0xaa, 0xc1, 0xb1,\n                                                        0xa1, 0x9d, 0x19, 0xa7, 0xa2, 0x9e, 0x8f, 0xb3,\n                                                        0x92, 0x8, 0xac, 0xfb, 0x6a, 0x6a, 0x7, 0xbb,\n                                                        0x84, 0x96, 0x89, 0x77, 0x1a, 0xfb, 0x29, 0xfb,\n                                                        0x2e, 0x5, 0xf8, 0x43, 0xfb, 0x4f, 0x69, 0x7,\n                                                        0xbb, 0x8b, 0x5c, 0x80, 0x1f, 0xfc, 0x7e, 0x7,\n                                                        0x73, 0x83, 0x67, 0x63, 0x1e, 0xe, 0xfc, 0x5,\n                                                        0x8b, 0xad, 0xf9, 0x16, 0x77, 0x12, 0xc1, 0xf7,\n                                                        0x1f, 0xfb, 0x12, 0x84, 0x1d, 0x13, 0xd0, 0x64,\n                                                        0x81, 0xaa, 0xa8, 0x1f, 0xf8, 0xda, 0x8d, 0xa,\n                                                        0xfc, 0x7e, 0x97, 0x1d, 0xf7, 0x4e, 0x82, 0x1d,\n                                                        0x4c, 0x76, 0xd3, 0x77, 0x12, 0xd2, 0xf7, 0x1f,\n                                                        0xf7, 0x1e, 0x53, 0xa, 0x14, 0xe, 0x13, 0xce,\n                                                        0x9b, 0x16, 0xf7, 0x84, 0xad, 0x6, 0x64, 0x8f,\n                                                        0x84, 0xa1, 0xaa, 0x1a, 0xf7, 0x95, 0x7, 0x93,\n                                                        0xb3, 0xbd, 0xb6, 0xc2, 0x8b, 0x58, 0x6b, 0x1e,\n                                                        0xfb, 0x7c, 0x7, 0x74, 0x8b, 0x6c, 0x5b, 0x88,\n                                                        0x1e, 0x69, 0xf7, 0x7e, 0xad, 0x7, 0x65, 0x8e,\n                                                        0x82, 0xa1, 0xab, 0x1a, 0xf7, 0x95, 0x7, 0x93,\n                                                        0xb5, 0xbd, 0xb5, 0xc1, 0x8b, 0x57, 0x6c, 0x1e,\n                                                        0xfb, 0x7c, 0x7, 0x73, 0x8b, 0x6c, 0x5a, 0x89,\n                                                        0x1e, 0x69, 0xf7, 0x82, 0xad, 0x7, 0x59, 0x8c,\n                                                        0x8b, 0xaa, 0xa4, 0x1a, 0xf7, 0x85, 0x7, 0xf7,\n                                                        0x2, 0x3c, 0xaa, 0x54, 0x51, 0x5e, 0x6f, 0x50,\n                                                        0x5e, 0x1e, 0xab, 0x7c, 0x72, 0xc2, 0x30, 0x1b,\n                                                        0x13, 0xbe, 0x37, 0x5f, 0x4f, 0x73, 0x7d, 0x1f,\n                                                        0x88, 0x1d, 0xa8, 0x87, 0xa5, 0x88, 0x57, 0x1a,\n                                                        0xfb, 0xa6, 0x7, 0x5a, 0x75, 0x86, 0x6a, 0x8b,\n                                                        0x1d, 0x30, 0x82, 0x1d, 0x4c, 0x76, 0xd3, 0x77,\n                                                        0x12, 0xcd, 0xf7, 0x1f, 0xfb, 0x17, 0x85, 0x1d,\n                                                        0x13, 0xca, 0xa0, 0x16, 0xf7, 0x85, 0xad, 0x6,\n                                                        0x13, 0xc6, 0x59, 0x1d, 0x1e, 0x13, 0xc9, 0xc1,\n                                                        0x8c, 0x54, 0x6f, 0x1f, 0x4f, 0xa, 0x8d, 0x8b,\n                                                        0xaa, 0xa3, 0x1a, 0x76, 0xa, 0x1e, 0x13, 0xba,\n                                                        0x36, 0x60, 0x4f, 0x73, 0x7d, 0x1f, 0x88, 0x1d,\n                                                        0x13, 0xc6, 0xb3, 0x85, 0x98, 0x83, 0x5e, 0x1a,\n                                                        0xfb, 0xa6, 0x7, 0x5a, 0x7a, 0x87, 0x67, 0x8b,\n                                                        0xa, 0x65, 0xa, 0x12, 0xa4, 0xf7, 0x27, 0xf7,\n                                                        0x25, 0xf7, 0x27, 0xfb, 0x1b, 0xf7, 0x27, 0x13,\n                                                        0xf0, 0xf7, 0x40, 0xf7, 0x7c, 0x78, 0x1d, 0xeb,\n                                                        0xd5, 0x1e, 0x13, 0xe8, 0xc8, 0x9c, 0x4d, 0x64,\n                                                        0xa, 0x39, 0x46, 0x3b, 0x8b, 0xf6, 0xf7, 0x0,\n                                                        0x1f, 0xfb, 0x27, 0x16, 0xfb, 0x16, 0xe2, 0xfb,\n                                                        0x8, 0x70, 0xa, 0xf6, 0x6f, 0xa, 0xf7, 0x0,\n                                                        0x70, 0x1d, 0xfb, 0x4, 0xfb, 0x15, 0x1e, 0xe,\n                                                        0x7c, 0xa, 0x7f, 0x77, 0x12, 0xd6, 0xf7, 0x1f,\n                                                        0xf7, 0xc, 0xf7, 0x28, 0x21, 0xf7, 0x28, 0x13,\n                                                        0xf6, 0x81, 0xa, 0x1e, 0x13, 0xf5, 0x90, 0x1d,\n                                                        0x54, 0x75, 0xc8, 0x8b, 0x1f, 0x7a, 0x1d, 0x89,\n                                                        0xc8, 0x58, 0xa, 0x7a, 0x1f, 0x89, 0x6, 0x13,\n                                                        0xee, 0xcd, 0xfb, 0x55, 0x69, 0x7, 0xb9, 0x85,\n                                                        0x95, 0x7c, 0x65, 0x1a, 0xfc, 0x75, 0x92, 0xa,\n                                                        0x30, 0xfb, 0x4c, 0x76, 0xf7, 0x53, 0xc1, 0xf8,\n                                                        0x25, 0xab, 0x1, 0xad, 0xf7, 0x26, 0xf7, 0x36,\n                                                        0x8a, 0xa, 0xf7, 0xea, 0xed, 0x15, 0x8d, 0x7a,\n                                                        0x51, 0x56, 0x1b, 0x49, 0x6f, 0xc7, 0xf7, 0x16,\n                                                        0xde, 0x91, 0xf7, 0x14, 0xde, 0xb9, 0xa6, 0x63,\n                                                        0x63, 0x1f, 0x42, 0xfc, 0xa7, 0x15, 0x68, 0xf7,\n                                                        0x9f, 0xad, 0x7, 0x67, 0x92, 0x78, 0x8e, 0xbb,\n                                                        0x1a, 0xf8, 0xde, 0x7c, 0x7, 0x3d, 0x52, 0x5,\n                                                        0xab, 0x67, 0x6c, 0xa4, 0x57, 0x1b, 0xfb, 0x2a,\n                                                        0x36, 0xfb, 0x11, 0xfb, 0xa, 0xfb, 0x3f, 0xe4,\n                                                        0x42, 0xef, 0xa8, 0xbc, 0x96, 0xb8, 0xb4, 0x1f,\n                                                        0xfb, 0x2f, 0x7, 0x5e, 0x79, 0x89, 0x54, 0x81,\n                                                        0x1e, 0xe, 0xfb, 0x5f, 0x8b, 0xad, 0xf7, 0xba,\n                                                        0xf7, 0x25, 0x45, 0x76, 0xa5, 0x76, 0xd5, 0x77,\n                                                        0x12, 0xde, 0xf7, 0x1f, 0x13, 0x9c, 0xa8, 0x16,\n                                                        0xf7, 0x9e, 0xad, 0x6, 0x4e, 0x8e, 0x7f, 0x92,\n                                                        0xbd, 0x1a, 0xf7, 0x5a, 0x7, 0xd4, 0xb7, 0xa1,\n                                                        0x9a, 0x9c, 0x93, 0x79, 0x7b, 0x98, 0x1e, 0x13,\n                                                        0xc4, 0x7e, 0x96, 0x99, 0x7f, 0xa5, 0x1b, 0xbd,\n                                                        0x99, 0xb4, 0xa5, 0xa3, 0x7c, 0xc1, 0x47, 0x1f,\n                                                        0x13, 0xac, 0x4a, 0x5e, 0x4f, 0x6c, 0x76, 0x1f,\n                                                        0x89, 0xda, 0xfb, 0x51, 0x73, 0x6, 0xa9, 0x87,\n                                                        0xa3, 0x86, 0x59, 0x1a, 0xfb, 0xb0, 0x7, 0x59,\n                                                        0x75, 0x87, 0x6b, 0x8b, 0x1d, 0xfb, 0x96, 0x7d,\n                                                        0xad, 0x7f, 0x76, 0xf7, 0xfc, 0x76, 0xf7, 0x6,\n                                                        0xac, 0x89, 0x77, 0x12, 0xa4, 0xef, 0xf7, 0x20,\n                                                        0xeb, 0x13, 0x76, 0xa4, 0x7e, 0x15, 0xae, 0x6,\n                                                        0x9f, 0x95, 0x91, 0x93, 0x96, 0x1b, 0x8d, 0x90,\n                                                        0x89, 0x88, 0x91, 0x1f, 0x13, 0xb6, 0x83, 0x9e,\n                                                        0xae, 0x7b, 0xb0, 0x1b, 0xe8, 0xd8, 0xc6, 0xea,\n                                                        0xdb, 0x52, 0xaf, 0x52, 0xa6, 0x1f, 0x4f, 0xa8,\n                                                        0x4d, 0x9e, 0xbf, 0x1a, 0xaa, 0xa4, 0xa5, 0xaf,\n                                                        0xc4, 0xb4, 0x60, 0x44, 0xa0, 0x1e, 0xae, 0x6,\n                                                        0x13, 0xae, 0xf7, 0x25, 0x6b, 0x7, 0x83, 0x88,\n                                                        0x87, 0x7f, 0x79, 0x1b, 0x83, 0x80, 0x8f, 0x90,\n                                                        0x7e, 0x1f, 0x13, 0xb6, 0x91, 0x7a, 0x75, 0x92,\n                                                        0x71, 0x1b, 0x2f, 0x46, 0x50, 0x33, 0x41, 0xc3,\n                                                        0x66, 0xc5, 0x6e, 0x1f, 0xc9, 0x6c, 0xcb, 0x76,\n                                                        0x5b, 0x1a, 0x6d, 0x73, 0x67, 0x59, 0xfb, 0x3,\n                                                        0x80, 0xf4, 0xa6, 0x85, 0x1e, 0x65, 0x6, 0xe,\n                                                        0xfb, 0xce, 0x7f, 0xd2, 0xf7, 0xfa, 0xb7, 0xf7,\n                                                        0x3d, 0x77, 0x12, 0xc0, 0xf7, 0x1f, 0xfb, 0xc,\n                                                        0xf7, 0x1f, 0x13, 0xf0, 0xf7, 0xc7, 0xf7, 0x3,\n                                                        0x15, 0x76, 0x80, 0x7a, 0x6c, 0x6e, 0x1b, 0x13,\n                                                        0xe8, 0x63, 0x8c, 0xa7, 0x9b, 0x1f, 0xf7, 0xce,\n                                                        0xe9, 0xb7, 0x2d, 0xf7, 0x3d, 0x72, 0x7, 0x47,\n                                                        0x2a, 0x5e, 0x5f, 0x56, 0x5e, 0x8, 0x70, 0xbf,\n                                                        0xfb, 0xce, 0x7, 0x76, 0x8c, 0x8f, 0x2d, 0xf7,\n                                                        0x0, 0x1b, 0xe5, 0xaf, 0xd0, 0xb6, 0xa0, 0x1f,\n                                                        0xe, 0x30, 0x7d, 0xcc, 0xf8, 0x2e, 0x77, 0x12,\n                                                        0xcc, 0x85, 0x1d, 0x13, 0xf0, 0x71, 0xa, 0x13,\n                                                        0xe8, 0x25, 0x1d, 0xe, 0x92, 0x76, 0xf8, 0x4d,\n                                                        0xad, 0x1, 0xa0, 0xf8, 0x64, 0x3, 0xf7, 0x85,\n                                                        0x7d, 0x15, 0xa5, 0x6, 0xf7, 0x34, 0xf8, 0x16,\n                                                        0x9f, 0xbd, 0x99, 0x8d, 0xa3, 0x8e, 0x19, 0x4d,\n                                                        0x1d, 0x38, 0xfb, 0x6d, 0x5, 0x33, 0xf7, 0x6c,\n                                                        0x8b, 0x8e, 0x8f, 0x1a, 0xa2, 0x9f, 0x8c, 0xac,\n                                                        0x8e, 0x48, 0x1d, 0xe, 0xd6, 0x92, 0x76, 0xf7,\n                                                        0xd8, 0x76, 0xf7, 0x40, 0x77, 0x1, 0xf8, 0xd0,\n                                                        0xf7, 0x1b, 0x3, 0xf7, 0x78, 0x7d, 0x15, 0xa3,\n                                                        0x6, 0xf7, 0xe, 0xf7, 0xc3, 0x5, 0x90, 0x6,\n                                                        0xef, 0xfb, 0xc3, 0x5, 0xa2, 0x6, 0xf7, 0x2f,\n                                                        0xf8, 0x1b, 0x9c, 0xb7, 0x99, 0x8d, 0x9e, 0x8f,\n                                                        0x19, 0xad, 0xfb, 0x1b, 0x69, 0x7, 0xa7, 0x88,\n                                                        0x9f, 0x89, 0x6b, 0x1a, 0x75, 0x58, 0xfb, 0x1,\n                                                        0x70, 0x3f, 0x1e, 0x89, 0x6, 0x79, 0xd9, 0x61,\n                                                        0xf7, 0xc, 0xa0, 0x1a, 0xa0, 0xa1, 0x8d, 0xa5,\n                                                        0x8d, 0x1e, 0xad, 0xfb, 0x7e, 0x69, 0x7, 0xa3,\n                                                        0x88, 0x96, 0x8b, 0x94, 0x76, 0x90, 0x7f, 0x91,\n                                                        0x81, 0x95, 0x69, 0x47, 0xfb, 0x3f, 0x18, 0x59,\n                                                        0xf7, 0x1a, 0x69, 0xcd, 0xa0, 0x1a, 0xa5, 0xa3,\n                                                        0x8d, 0x99, 0x8d, 0x1e, 0xad, 0xfb, 0x72, 0x69,\n                                                        0x7, 0xa5, 0x86, 0x90, 0x8e, 0xa5, 0x4a, 0x8,\n                                                        0xe, 0xa0, 0x76, 0xf8, 0x3f, 0xad, 0x1, 0x99,\n                                                        0xf8, 0x6a, 0x3, 0x99, 0x16, 0xf7, 0x3d, 0xad,\n                                                        0x6, 0x7a, 0x8c, 0x5b, 0x90, 0x9a, 0x9f, 0x8,\n                                                        0x9a, 0xa0, 0xcc, 0xe5, 0x8b, 0x1a, 0x8b, 0xc1,\n                                                        0x36, 0xa0, 0x6c, 0x1e, 0x94, 0x7e, 0x6b, 0x84,\n                                                        0x75, 0x8a, 0x8, 0x69, 0xf7, 0x85, 0xad, 0x7,\n                                                        0x7e, 0x8f, 0x83, 0x8e, 0x82, 0x98, 0xfb, 0x28,\n                                                        0xf7, 0x6e, 0x18, 0xf0, 0xf7, 0x8, 0x9d, 0xa2,\n                                                        0xa3, 0x97, 0xa7, 0x8f, 0x19, 0xad, 0xfb, 0x3c,\n                                                        0x69, 0x7, 0xb2, 0x88, 0x97, 0x8a, 0x76, 0x1a,\n                                                        0x7d, 0x8b, 0x95, 0x41, 0x2c, 0x1e, 0x7c, 0x9e,\n                                                        0x53, 0xcf, 0x9c, 0x1a, 0x9b, 0xa2, 0x8f, 0xa3,\n                                                        0x1e, 0xad, 0xfb, 0x8e, 0x69, 0x7, 0xa6, 0x87,\n                                                        0x93, 0x82, 0x9c, 0x71, 0xf7, 0x14, 0xfb, 0x4f,\n                                                        0x18, 0xfb, 0x17, 0xfb, 0x3f, 0x88, 0x94, 0x5f,\n                                                        0x86, 0x8, 0xe, 0xfb, 0x61, 0xf7, 0x23, 0xf8,\n                                                        0x9f, 0x77, 0x1, 0xf7, 0x80, 0x7e, 0x15, 0x79,\n                                                        0x56, 0x5, 0x75, 0x84, 0x2b, 0xa, 0xe, 0x87,\n                                                        0x1d, 0x1, 0xb1, 0xaf, 0x87, 0xa, 0x65, 0x8e,\n                                                        0x1d, 0x6b, 0x8b, 0x62, 0x8c, 0xf7, 0x7f, 0xf8,\n                                                        0x27, 0x18, 0xa5, 0xfc, 0xb, 0x7, 0x84, 0xfb,\n                                                        0x22, 0x5, 0xaf, 0x6, 0xa5, 0xf7, 0x1, 0xb0,\n                                                        0x8b, 0xf7, 0xa, 0x8c, 0xfb, 0x7e, 0xfc, 0x28,\n                                                        0x18, 0xe, 0x8d, 0x1d, 0xf7, 0x15, 0xf4, 0x3,\n                                                        0xa1, 0xf7, 0x99, 0x15, 0xe2, 0x78, 0x9f, 0x5e,\n                                                        0x49, 0x1a, 0xfb, 0x3f, 0x7, 0xfb, 0xd, 0xd9,\n                                                        0x7d, 0xf7, 0x19, 0x1e, 0x97, 0x7, 0x3a, 0x99,\n                                                        0x72, 0xb3, 0xd0, 0x1a, 0xf7, 0x3f, 0x7, 0xd2,\n                                                        0x7a, 0xb3, 0x2a, 0x9d, 0x1e, 0x8d, 0x7, 0xec,\n                                                        0x9d, 0x9c, 0xa5, 0xd2, 0x1a, 0xf7, 0x47, 0x7,\n                                                        0xd1, 0xa4, 0xb8, 0xdc, 0x9a, 0x1e, 0x97, 0x7,\n                                                        0xfb, 0x19, 0x3d, 0x77, 0xfb, 0xe, 0x1f, 0xfb,\n                                                        0x47, 0x7, 0x49, 0x77, 0x6c, 0x34, 0x78, 0x1e,\n                                                        0xe, 0xfc, 0x3f, 0xfb, 0x29, 0x76, 0xf7, 0x40,\n                                                        0x76, 0xf9, 0x5a, 0x77, 0x1, 0xcd, 0xe3, 0x3e,\n                                                        0xd0, 0x3, 0xd8, 0xfb, 0x3e, 0x15, 0xd0, 0xf9,\n                                                        0xf1, 0x46, 0x6, 0xe, 0x8d, 0x1d, 0xf7, 0x34,\n                                                        0xf4, 0x3, 0xc1, 0xfb, 0x37, 0x15, 0x7f, 0x7,\n                                                        0xf7, 0x19, 0xd9, 0x99, 0xf7, 0xe, 0x1f, 0xf7,\n                                                        0x3f, 0x7, 0xcd, 0x9f, 0xb8, 0xe2, 0x9e, 0x1e,\n                                                        0x34, 0x9e, 0x77, 0xaa, 0xcd, 0x1a, 0xf7, 0x47,\n                                                        0x7, 0xf7, 0xd, 0x3d, 0x9f, 0xfb, 0x19, 0x1e,\n                                                        0x7f, 0x7, 0xdc, 0x7d, 0xa4, 0x5d, 0x46, 0x1a,\n                                                        0xfb, 0x47, 0x7, 0x44, 0x9c, 0x71, 0xec, 0x79,\n                                                        0x1e, 0x89, 0x7, 0x2a, 0x79, 0x7a, 0x63, 0x44,\n                                                        0x1a, 0xfb, 0x3f, 0x7, 0x45, 0x72, 0x64, 0x3a,\n                                                        0x7c, 0x1e, 0xe, 0xfb, 0x13, 0xf7, 0x41, 0xf7,\n                                                        0x34, 0x1, 0xa8, 0xf8, 0x62, 0x3, 0xcc, 0xf7,\n                                                        0x41, 0x15, 0xae, 0x9b, 0xa3, 0xb0, 0xb7, 0x1b,\n                                                        0xb1, 0xaa, 0x7e, 0x7c, 0xa8, 0x1f, 0x78, 0xb1,\n                                                        0xae, 0x76, 0xb9, 0x1b, 0xc9, 0xac, 0xb7, 0xb5,\n                                                        0xa9, 0x1f, 0x67, 0xd1, 0x5, 0x68, 0x74, 0x72,\n                                                        0x66, 0x63, 0x1b, 0x6e, 0x68, 0x9b, 0x9b, 0x66,\n                                                        0x1f, 0x9d, 0x64, 0x63, 0x9d, 0x6a, 0x1b, 0x48,\n                                                        0x67, 0x5f, 0x61, 0x75, 0x1f, 0xe, 0xfb, 0xce,\n                                                        0xfb, 0x4a, 0x76, 0xf8, 0xab, 0xf7, 0x3d, 0x12,\n                                                        0xdd, 0xf7, 0x3d, 0x29, 0xa8, 0x13, 0xe0, 0xdd,\n                                                        0xf8, 0x35, 0x15, 0x5d, 0xb1, 0x64, 0xba, 0xbb,\n                                                        0xaf, 0xb3, 0xb8, 0xba, 0x67, 0xb0, 0x5b, 0x5c,\n                                                        0x65, 0x67, 0x5b, 0x1e, 0x13, 0xd0, 0xd2, 0xfb,\n                                                        0x37, 0x15, 0x84, 0x44, 0x83, 0x57, 0x82, 0x62,\n                                                        0x8, 0x75, 0x20, 0x73, 0x71, 0x4e, 0x1a, 0x4b,\n                                                        0xac, 0x68, 0xbe, 0xbf, 0xac, 0xae, 0xcb, 0xc8,\n                                                        0x73, 0xa4, 0x75, 0xf5, 0x1e, 0x82, 0xb4, 0x83,\n                                                        0xc0, 0x84, 0xd3, 0x8, 0xe, 0xfb, 0xb, 0x76,\n                                                        0xf7, 0x27, 0x76, 0xf7, 0xe3, 0x76, 0xf7, 0x22,\n                                                        0xaa, 0xf7, 0x7, 0x77, 0x1, 0xc0, 0xf7, 0x21,\n                                                        0xf7, 0x13, 0xf7, 0xf, 0x3, 0xf7, 0x75, 0xf7,\n                                                        0x14, 0x15, 0x77, 0xb1, 0x80, 0xbe, 0xc4, 0x1a,\n                                                        0xab, 0x90, 0xf7, 0x1c, 0xdb, 0x9c, 0xa4, 0x7f,\n                                                        0x6d, 0x1e, 0x88, 0x7, 0xfb, 0x53, 0xfc, 0xad,\n                                                        0x15, 0xb3, 0x6, 0xba, 0xf7, 0x19, 0x5, 0x86,\n                                                        0x9b, 0x9c, 0x89, 0x9d, 0x1b, 0xac, 0xe2, 0x8b,\n                                                        0xee, 0xd1, 0x1f, 0x79, 0x9d, 0x5, 0x74, 0x78,\n                                                        0x6f, 0x70, 0x4f, 0x1b, 0x6b, 0x70, 0x98, 0xa3,\n                                                        0x75, 0x1f, 0xdd, 0xf7, 0x7a, 0x5, 0x7d, 0x96,\n                                                        0x9c, 0x85, 0x9b, 0x1b, 0x8f, 0xc9, 0x8b, 0xcb,\n                                                        0xb4, 0x70, 0xa8, 0x67, 0x9d, 0x1f, 0xbb, 0xf7,\n                                                        0x1c, 0x5, 0x63, 0x6, 0x5f, 0xfb, 0xf, 0x5,\n                                                        0x90, 0x78, 0x77, 0x8e, 0x78, 0x1b, 0xfb, 0x2,\n                                                        0xfb, 0x10, 0x39, 0xfb, 0x3b, 0xfb, 0x7, 0xc3,\n                                                        0x42, 0xd3, 0x6c, 0x1f, 0xe, 0x7d, 0xaa, 0x6c,\n                                                        0xf7, 0x12, 0x23, 0x76, 0xf7, 0x17, 0xb9, 0xf7,\n                                                        0x24, 0xcc, 0xf7, 0x12, 0xf7, 0x4d, 0x6d, 0xa9,\n                                                        0x12, 0xa0, 0xab, 0xbf, 0xf7, 0x12, 0x13, 0x5b,\n                                                        0x80, 0xf7, 0x71, 0xbc, 0x15, 0x54, 0xc6, 0xad,\n                                                        0x83, 0xaa, 0x1b, 0xf7, 0x7, 0x96, 0xf7, 0xf,\n                                                        0xd5, 0x91, 0x1f, 0x74, 0x6, 0x60, 0x80, 0x7b,\n                                                        0x6f, 0x3f, 0x1b, 0x7f, 0x6c, 0x8d, 0x9f, 0x58,\n                                                        0x1f, 0xa2, 0xc6, 0x8a, 0xc5, 0x87, 0xc4, 0x8,\n                                                        0xf7, 0x1, 0xcc, 0xfb, 0x6, 0x6, 0x87, 0x9a,\n                                                        0x68, 0xf7, 0x3f, 0xa3, 0x1a, 0xac, 0x96, 0xb1,\n                                                        0xb8, 0xb7, 0x8b, 0x69, 0x7f, 0x1e, 0x13, 0x3d,\n                                                        0x80, 0x37, 0x89, 0xa4, 0x72, 0xad, 0x1b, 0xbf,\n                                                        0x9e, 0xad, 0xb1, 0x97, 0x8b, 0xf0, 0xfb, 0x2e,\n                                                        0xfb, 0x2d, 0x5c, 0xfb, 0xa, 0x3c, 0x65, 0x92,\n                                                        0x65, 0x92, 0x65, 0x1f, 0x3b, 0x4a, 0x6, 0x13,\n                                                        0x39, 0x0, 0xed, 0x6, 0x9b, 0x5d, 0xa3, 0x51,\n                                                        0x8c, 0x5c, 0x8, 0x8f, 0x7c, 0x80, 0x8e, 0x71,\n                                                        0x1b, 0x26, 0x87, 0x46, 0x70, 0x43, 0xcc, 0x82,\n                                                        0x9d, 0xd2, 0xa9, 0xb4, 0xa0, 0x9b, 0x1f, 0x63,\n                                                        0xb0, 0x15, 0x13, 0x9d, 0x80, 0x71, 0x84, 0x7e,\n                                                        0x60, 0x55, 0x1b, 0x7a, 0x66, 0x94, 0xb3, 0x99,\n                                                        0x93, 0xb1, 0xb8, 0xb2, 0x9e, 0x7a, 0x7c, 0x9c,\n                                                        0x1f, 0xe, 0xf7, 0x38, 0xd4, 0xf7, 0x5b, 0xd6,\n                                                        0x1, 0xd8, 0xe3, 0xf7, 0x31, 0xe3, 0x3, 0xf7,\n                                                        0x1c, 0xf7, 0xe6, 0x15, 0xca, 0xbb, 0xbf, 0xcc,\n                                                        0xce, 0xbb, 0x57, 0x4c, 0x4a, 0x5b, 0x52, 0x48,\n                                                        0x4a, 0x5b, 0xc4, 0xcc, 0x1e, 0x39, 0xfb, 0x8d,\n                                                        0x15, 0xe1, 0xe3, 0x5, 0x78, 0xa7, 0xb3, 0x7c,\n                                                        0xb4, 0x1b, 0xb6, 0xb3, 0x9a, 0x9e, 0xa7, 0x1f,\n                                                        0xe1, 0x33, 0xbf, 0xbf, 0x33, 0xe3, 0x5, 0xa0,\n                                                        0xa5, 0x97, 0xb3, 0xb6, 0x1a, 0xb6, 0x7d, 0xb1,\n                                                        0x78, 0xa7, 0x1e, 0xe3, 0xe3, 0x57, 0xbd, 0x35,\n                                                        0x35, 0x5, 0x9e, 0x6f, 0x65, 0x95, 0x5e, 0x1b,\n                                                        0x62, 0x63, 0x81, 0x78, 0x6f, 0x1f, 0x35, 0xe1,\n                                                        0x57, 0x59, 0xe3, 0x33, 0x5, 0x78, 0x71, 0x7c,\n                                                        0x63, 0x60, 0x1a, 0x60, 0x98, 0x65, 0xa0, 0x6f,\n                                                        0x1e, 0x33, 0x33, 0x5, 0xe, 0x8b, 0xae, 0xf7,\n                                                        0xb, 0xbd, 0xe8, 0xbd, 0xf7, 0xb9, 0xaf, 0x1,\n                                                        0xf7, 0x4d, 0xf7, 0x16, 0xe0, 0xf7, 0x13, 0x3,\n                                                        0xde, 0x16, 0xf7, 0xdf, 0xae, 0x6, 0x4b, 0x91,\n                                                        0x68, 0x8d, 0xdd, 0x1a, 0xb2, 0xf7, 0x1b, 0xbd,\n                                                        0xfb, 0x1b, 0xce, 0x7, 0x8f, 0x96, 0x5, 0xf7,\n                                                        0x17, 0xbd, 0xfb, 0x3, 0x6, 0xf7, 0x10, 0xf7,\n                                                        0x99, 0x9c, 0xac, 0xaa, 0x8d, 0x9b, 0x8d, 0x19,\n                                                        0xaf, 0xfb, 0x61, 0x67, 0x7, 0xb5, 0x89, 0xaf,\n                                                        0x8a, 0x64, 0x1a, 0x21, 0xfb, 0x92, 0x5, 0x89,\n                                                        0x6, 0x55, 0xf7, 0x2, 0x51, 0xf7, 0x14, 0xa5,\n                                                        0x1a, 0xa3, 0x9d, 0x93, 0xc6, 0x1e, 0xaf, 0xfb,\n                                                        0xc1, 0x67, 0x7, 0xb8, 0x89, 0xa3, 0x74, 0x99,\n                                                        0x6f, 0xf7, 0x2, 0xfb, 0x89, 0x18, 0x28, 0x59,\n                                                        0xf7, 0x10, 0x6, 0x96, 0x76, 0x5, 0x52, 0xfb,\n                                                        0x1b, 0x59, 0xf7, 0x1b, 0x64, 0x7, 0x39, 0x66,\n                                                        0x89, 0x4a, 0x8b, 0x1d, 0xfc, 0x3f, 0x8d, 0x76,\n                                                        0xf8, 0x5d, 0x76, 0xf7, 0xa6, 0x77, 0x1, 0xcd,\n                                                        0xe3, 0x3e, 0xce, 0x3, 0xd8, 0xf8, 0x35, 0x15,\n                                                        0xcd, 0xf7, 0xa6, 0x49, 0x6, 0xfd, 0x5a, 0x4,\n                                                        0xce, 0xf7, 0xae, 0x48, 0x6, 0xe, 0xfb, 0xf,\n                                                        0xa2, 0xf7, 0x93, 0xa4, 0xf7, 0x2d, 0x77, 0xea,\n                                                        0xa2, 0xf7, 0x6a, 0x77, 0x12, 0xb3, 0xd6, 0x56,\n                                                        0xd6, 0x5c, 0xf7, 0x14, 0xf7, 0x0, 0xe0, 0x13,\n                                                        0x8c, 0x80, 0xf7, 0xc5, 0xf7, 0x24, 0x15, 0xb8,\n                                                        0x8c, 0xe8, 0x8e, 0xf7, 0x6, 0xf7, 0x38, 0xfb,\n                                                        0xa2, 0xdc, 0xe4, 0x1a, 0xb9, 0xa7, 0xa5, 0xb4,\n                                                        0xb9, 0xa1, 0x7d, 0x84, 0x84, 0x80, 0x82, 0x80,\n                                                        0x81, 0x1e, 0x81, 0x82, 0x81, 0x7f, 0x7c, 0x1a,\n                                                        0x71, 0xa8, 0x6c, 0xac, 0x9a, 0xbb, 0x9a, 0xbf,\n                                                        0xa6, 0x67, 0xd0, 0xfb, 0x7, 0x1e, 0x13, 0xfc,\n                                                        0x80, 0x3f, 0x48, 0x59, 0x38, 0x51, 0xbb, 0x64,\n                                                        0xbd, 0x5f, 0x1f, 0x89, 0x89, 0x5, 0x13, 0xea,\n                                                        0x80, 0x62, 0x8e, 0x2a, 0x87, 0xfb, 0xf, 0x1a,\n                                                        0x3d, 0xb9, 0x6b, 0xf7, 0xe, 0x24, 0x1e, 0xd8,\n                                                        0x4d, 0x9c, 0x7c, 0x62, 0x1a, 0x65, 0x71, 0x6c,\n                                                        0x53, 0x51, 0x84, 0xa2, 0x91, 0x91, 0x94, 0x90,\n                                                        0x94, 0x91, 0x1e, 0x98, 0x93, 0x9a, 0x95, 0xa2,\n                                                        0x1a, 0x13, 0xf9, 0x80, 0xa1, 0x75, 0xac, 0x5f,\n                                                        0x5c, 0x7c, 0x5e, 0x79, 0x46, 0xe0, 0x6a, 0xc9,\n                                                        0x1e, 0x13, 0xfa, 0x80, 0xf6, 0xc7, 0xc6, 0xd0,\n                                                        0xc8, 0x61, 0xba, 0x52, 0xb1, 0x1f, 0xfb, 0x41,\n                                                        0xf7, 0x57, 0x15, 0xb8, 0xb1, 0x95, 0x9d, 0x1e,\n                                                        0x13, 0x8c, 0x80, 0xba, 0xe2, 0x33, 0x89, 0x8d,\n                                                        0x1f, 0xb1, 0x64, 0x90, 0x80, 0x70, 0x1a, 0x72,\n                                                        0x7d, 0x6a, 0x62, 0x6b, 0x6c, 0xa4, 0xa3, 0x6f,\n                                                        0x1e, 0x48, 0xc3, 0x75, 0x9f, 0xb8, 0x1a, 0xe,\n                                                        0xfb, 0xce, 0xf8, 0xad, 0xf7, 0x16, 0x1, 0x89,\n                                                        0x3f, 0xa, 0xe, 0xef, 0x78, 0xbf, 0xf7, 0x5,\n                                                        0xa2, 0xf7, 0xb0, 0x76, 0xe0, 0xa2, 0xf6, 0xbf,\n                                                        0x1, 0xae, 0xd2, 0xf7, 0x7, 0xf1, 0xf7, 0x4a,\n                                                        0x9e, 0xf7, 0x12, 0xd2, 0x3, 0x71, 0x1d, 0xf7,\n                                                        0x30, 0xf7, 0x5a, 0xf7, 0x5b, 0xfb, 0x29, 0xf7,\n                                                        0x31, 0x55, 0xa, 0xfb, 0x1f, 0xfb, 0x39, 0xfb,\n                                                        0x38, 0xfb, 0xc, 0xfb, 0x1e, 0x80, 0x1d, 0xf8,\n                                                        0x40, 0x3c, 0x15, 0x58, 0x74, 0x64, 0x63, 0x4f,\n                                                        0x1b, 0x2e, 0x6a, 0xd7, 0xf4, 0x8c, 0x1f, 0xef,\n                                                        0x8c, 0xb2, 0xd6, 0xdd, 0x1b, 0xd2, 0xa6, 0x5c,\n                                                        0x61, 0x95, 0x1f, 0x9e, 0xd3, 0x6, 0x94, 0x85,\n                                                        0x92, 0x7b, 0x90, 0x1e, 0x94, 0x70, 0x71, 0x95,\n                                                        0x57, 0x1b, 0xfb, 0x3b, 0x52, 0xfb, 0x5, 0x36,\n                                                        0xfb, 0x1e, 0xef, 0x49, 0xf7, 0x13, 0xba, 0xaa,\n                                                        0x99, 0x8f, 0x9e, 0x1f, 0x9c, 0x92, 0x95, 0x8e,\n                                                        0x8c, 0x97, 0x9b, 0xd5, 0x18, 0xe, 0xfb, 0xef,\n                                                        0xf8, 0x36, 0x76, 0xf7, 0xa0, 0xa2, 0x12, 0x8a,\n                                                        0xed, 0x36, 0xe0, 0xd6, 0xeb, 0x13, 0xd8, 0xf7,\n                                                        0x43, 0xf8, 0x4a, 0x15, 0x7b, 0x8f, 0x90, 0x72,\n                                                        0xb9, 0x1b, 0xa8, 0xa3, 0x99, 0x9f, 0x9d, 0x1f,\n                                                        0x81, 0x97, 0x5, 0x7a, 0x7a, 0x85, 0x9f, 0x8f,\n                                                        0x1a, 0xf7, 0x30, 0x7, 0xc4, 0x51, 0xa4, 0x43,\n                                                        0x36, 0x62, 0x67, 0x65, 0x62, 0xaf, 0x8b, 0x92,\n                                                        0xb0, 0x95, 0xa2, 0x96, 0x1e, 0x9e, 0x77, 0x90,\n                                                        0x98, 0x1a, 0x94, 0x9a, 0x97, 0xa3, 0xb8, 0x92,\n                                                        0x6b, 0x6d, 0x1e, 0x6d, 0x7, 0x13, 0xe8, 0x31,\n                                                        0x74, 0x37, 0x73, 0x4d, 0x1a, 0x13, 0xa8, 0x5a,\n                                                        0xb4, 0x79, 0xab, 0x9a, 0xb9, 0x8d, 0xb2, 0xb5,\n                                                        0x1e, 0x88, 0xa6, 0x15, 0x81, 0x84, 0x7c, 0x7b,\n                                                        0x75, 0x1b, 0x76, 0x81, 0xa1, 0x9d, 0xbf, 0xcb,\n                                                        0x9d, 0x96, 0x8e, 0x1f, 0xe, 0x82, 0xa, 0x1,\n                                                        0xf7, 0x6f, 0xf7, 0x92, 0x3, 0xa2, 0xf7, 0x75,\n                                                        0x88, 0xa, 0x82, 0x95, 0x9b, 0x7d, 0x96, 0x1b,\n                                                        0x91, 0x90, 0x8f, 0x99, 0x77, 0x1d, 0xe1, 0xf6,\n                                                        0xa8, 0x1a, 0x95, 0x88, 0x7b, 0x1d, 0xf7, 0x58,\n                                                        0x87, 0x88, 0xa, 0x82, 0x95, 0x9c, 0x7d, 0x96,\n                                                        0x1b, 0x91, 0x8f, 0x75, 0xa, 0x95, 0x86, 0x7b,\n                                                        0x1d, 0xe, 0x3e, 0xf7, 0x15, 0x76, 0xf7, 0x73,\n                                                        0xcf, 0x12, 0xf8, 0x54, 0xe6, 0x44, 0xd0, 0x13,\n                                                        0xe0, 0xac, 0xf7, 0xdf, 0x15, 0x13, 0xd0, 0xf8,\n                                                        0x47, 0xfb, 0x73, 0xd0, 0xf7, 0xb7, 0xfc, 0x8c,\n                                                        0x6, 0xe, 0xef, 0x78, 0xbf, 0x57, 0xf7, 0x52,\n                                                        0x7e, 0xf7, 0x51, 0x85, 0x76, 0xf7, 0xef, 0xbf,\n                                                        0x12, 0xa5, 0xd2, 0xf7, 0x3e, 0xdb, 0xe4, 0xe0,\n                                                        0xf7, 0x15, 0xd2, 0x13, 0xaf, 0x80, 0x71, 0x1d,\n                                                        0xf7, 0x34, 0xf7, 0x5a, 0xf7, 0x5b, 0xfb, 0x29,\n                                                        0xf7, 0x2d, 0x55, 0xa, 0xfb, 0x1b, 0xfb, 0x39,\n                                                        0xfb, 0x38, 0xfb, 0xc, 0xfb, 0x22, 0x80, 0x1d,\n                                                        0xf7, 0x2, 0xfb, 0x4a, 0x15, 0xf7, 0x40, 0x6,\n                                                        0x13, 0x5f, 0x80, 0x9d, 0x7, 0x5c, 0x8e, 0x8c,\n                                                        0x8f, 0xb0, 0x1a, 0xf4, 0xb0, 0x7, 0x13, 0xaf,\n                                                        0x80, 0x3a, 0xc0, 0xc9, 0x35, 0x88, 0x1b, 0xdc,\n                                                        0x96, 0x6, 0xfb, 0x14, 0xf7, 0x3b, 0x5, 0xbb,\n                                                        0x9b, 0xab, 0xb0, 0xba, 0x1a, 0xcf, 0x56, 0xac,\n                                                        0x4d, 0x1e, 0xfb, 0x55, 0x79, 0x6, 0xba, 0x89,\n                                                        0x8a, 0x87, 0x65, 0x1a, 0xfb, 0x93, 0x7, 0x13,\n                                                        0x5f, 0x80, 0x66, 0x8c, 0x87, 0x5c, 0x88, 0x1e,\n                                                        0x13, 0xaf, 0x80, 0xf7, 0x12, 0xf7, 0x3f, 0x15,\n                                                        0xf7, 0x3c, 0xaf, 0x7, 0xaf, 0xa4, 0x77, 0x50,\n                                                        0x5d, 0x7c, 0x60, 0x5c, 0x1f, 0xe, 0xfb, 0xce,\n                                                        0xf8, 0xc9, 0xd3, 0x1, 0x8c, 0xf8, 0xc9, 0x15,\n                                                        0xf7, 0xde, 0xd3, 0xfb, 0xde, 0x6, 0xe, 0xfb,\n                                                        0x8b, 0xf8, 0x26, 0xaf, 0xf7, 0x6a, 0xaf, 0x1,\n                                                        0xbb, 0xb4, 0xf7, 0x69, 0xb4, 0x3, 0xed, 0xf8,\n                                                        0xb5, 0x15, 0xc4, 0xb8, 0xbd, 0xc4, 0xc4, 0xb8,\n                                                        0x59, 0x52, 0x52, 0x5e, 0x59, 0x52, 0x52, 0x5e,\n                                                        0xbd, 0xc4, 0x1e, 0x62, 0x16, 0x3b, 0xca, 0x4c,\n                                                        0xdb, 0xdb, 0xca, 0xca, 0xdb, 0xdb, 0x4c, 0xca,\n                                                        0x3b, 0x3b, 0x4c, 0x4c, 0x3b, 0x1e, 0xe, 0x3e,\n                                                        0x8b, 0xe1, 0xf7, 0x51, 0xe3, 0x3b, 0xcd, 0xf7,\n                                                        0x31, 0x77, 0x12, 0xf7, 0x85, 0xe3, 0x3e, 0xcd,\n                                                        0x13, 0xd4, 0xf7, 0x90, 0xf7, 0x12, 0x15, 0xcd,\n                                                        0x6, 0x13, 0xb4, 0xf7, 0x31, 0xf7, 0x6f, 0xcd,\n                                                        0xfb, 0x6f, 0xf7, 0x31, 0x49, 0xfb, 0x31, 0xfb,\n                                                        0x6f, 0x49, 0xf7, 0x6f, 0x7, 0xfb, 0x6f, 0xfb,\n                                                        0xaf, 0x15, 0xf8, 0x8c, 0x6, 0x13, 0xd8, 0xcd,\n                                                        0xfc, 0x8c, 0x7, 0xe, 0xfb, 0xef, 0xf7, 0xa7,\n                                                        0xdb, 0xf7, 0x9d, 0xcf, 0x12, 0xf7, 0x4c, 0xe3,\n                                                        0x17, 0xf7, 0xa7, 0x4, 0xf7, 0xa2, 0x6, 0xa9,\n                                                        0xf7, 0x13, 0x5, 0x7b, 0x6, 0x62, 0x79, 0x85,\n                                                        0x85, 0x46, 0x1b, 0x2f, 0x6, 0xf7, 0x25, 0xed,\n                                                        0xa7, 0xe7, 0xaa, 0x5a, 0x1d, 0x1f, 0x44, 0x3c,\n                                                        0x3c, 0x22, 0x23, 0x1e, 0xe, 0xfb, 0xef, 0xf7,\n                                                        0xb5, 0x76, 0xf8, 0x8, 0xbb, 0x12, 0xf7, 0x44,\n                                                        0xea, 0x5a, 0xd6, 0x13, 0xd0, 0xe7, 0xf8, 0x7e,\n                                                        0x40, 0xa, 0x70, 0xb6, 0x56, 0x9d, 0x1e, 0x13,\n                                                        0x60, 0xa7, 0x9a, 0x4a, 0x1d, 0xe, 0x90, 0xa,\n                                                        0xe1, 0xf8, 0xa4, 0x56, 0x1d, 0xf7, 0x1e, 0xe1,\n                                                        0x5, 0xa3, 0x9a, 0x9f, 0x97, 0xa7, 0x1a, 0xaf,\n                                                        0x71, 0x93, 0x79, 0x81, 0x73, 0x89, 0x71, 0x74,\n                                                        0x1e, 0xe, 0x30, 0xfb, 0x4d, 0x76, 0xf9, 0x2f,\n                                                        0x77, 0x12, 0xac, 0xf7, 0x14, 0x2c, 0xf7, 0x1f,\n                                                        0xf7, 0x17, 0xf7, 0x1f, 0x13, 0xd8, 0xf7, 0x15,\n                                                        0x9d, 0x15, 0x8d, 0x8d, 0x5, 0x77, 0xa3, 0xab,\n                                                        0x7e, 0xb9, 0x1b, 0xb2, 0xaa, 0x9d, 0xad, 0xa5,\n                                                        0x1f, 0x64, 0xa0, 0xb1, 0x7e, 0xb6, 0x1b, 0xbd,\n                                                        0xa2, 0x9f, 0xa8, 0xab, 0x1f, 0xa3, 0x7, 0x82,\n                                                        0x86, 0x83, 0x89, 0x83, 0x8c, 0x8, 0x7c, 0x8d,\n                                                        0x76, 0x99, 0xaa, 0x1a, 0xf7, 0xfc, 0xfb, 0x1f,\n                                                        0xfb, 0xfb, 0x7, 0x7d, 0x77, 0x6a, 0x7e, 0x78,\n                                                        0x1b, 0x6f, 0x6c, 0x9f, 0xc1, 0x1f, 0xf7, 0xcc,\n                                                        0xfb, 0x1f, 0xfc, 0x9, 0x7, 0x56, 0x85, 0x62,\n                                                        0x83, 0x6a, 0x1e, 0x13, 0xe8, 0x82, 0x64, 0x81,\n                                                        0x70, 0x74, 0x1a, 0x5d, 0x9e, 0x6b, 0xbc, 0xb4,\n                                                        0x9e, 0xab, 0xb9, 0xa8, 0x7f, 0xa7, 0x82, 0xab,\n                                                        0x1e, 0x86, 0x9d, 0x87, 0x9e, 0x89, 0x9f, 0x8,\n                                                        0xe, 0x20, 0xfb, 0x54, 0x76, 0xf9, 0xd9, 0xb1,\n                                                        0x75, 0xa1, 0x12, 0xf7, 0x9a, 0xbc, 0xe3, 0xbc,\n                                                        0x13, 0xd8, 0xf7, 0x98, 0xfb, 0x69, 0x15, 0xbc,\n                                                        0xf9, 0xd9, 0xed, 0xfd, 0xd9, 0x6, 0x13, 0xb8,\n                                                        0xbc, 0xf9, 0x7a, 0x6, 0xe1, 0x97, 0xa4, 0xd3,\n                                                        0x1e, 0xa1, 0xfb, 0xb2, 0x7, 0xfb, 0x6, 0xfb,\n                                                        0x20, 0x67, 0xfb, 0x4e, 0xfb, 0x33, 0xf7, 0x6,\n                                                        0x44, 0xf7, 0x26, 0x1f, 0xe, 0xfc, 0x21, 0xf7,\n                                                        0x8c, 0x93, 0xa, 0xf7, 0xe0, 0x62, 0x1d, 0xfb,\n                                                        0xce, 0xfb, 0x59, 0x76, 0xf7, 0x6e, 0x77, 0x12,\n                                                        0xf7, 0x5d, 0xe8, 0x17, 0xf7, 0x33, 0x16, 0x60,\n                                                        0x2b, 0x4f, 0x1d, 0x13, 0x60, 0xb1, 0xf7, 0x5,\n                                                        0x8c, 0xdc, 0xc8, 0x4b, 0xa7, 0x52, 0x7a, 0x1f,\n                                                        0xa7, 0xcb, 0x5, 0xe, 0xfb, 0xef, 0xf7, 0xa7,\n                                                        0xa9, 0xbd, 0xa9, 0xf7, 0xc3, 0x77, 0x1, 0xf6,\n                                                        0xeb, 0x3, 0xa9, 0xf7, 0xf7, 0x15, 0xf7, 0x87,\n                                                        0xa9, 0x6, 0x4b, 0x85, 0x9b, 0xb3, 0x1f, 0xf7,\n                                                        0x8b, 0x46, 0xa, 0xfb, 0x17, 0x7, 0x65, 0x89,\n                                                        0x74, 0x40, 0x8c, 0x1e, 0xe, 0xfb, 0xd1, 0xf8,\n                                                        0x21, 0x9f, 0xf7, 0x8e, 0xa0, 0x1, 0x9d, 0xec,\n                                                        0xee, 0xed, 0x3, 0xf7, 0x7, 0xf8, 0xb2, 0x15,\n                                                        0xe7, 0x97, 0xac, 0xb1, 0xb1, 0x96, 0x6a, 0x2f,\n                                                        0x3e, 0x86, 0x5b, 0x5f, 0x5f, 0x85, 0xbb, 0xd8,\n                                                        0x1e, 0x2a, 0x16, 0x3b, 0xc5, 0x4a, 0xe4, 0xe4,\n                                                        0xc5, 0xcc, 0xdb, 0xde, 0x4e, 0xca, 0x35, 0x35,\n                                                        0x4e, 0x4c, 0x38, 0x1e, 0xe, 0x82, 0xa, 0x12,\n                                                        0xf7, 0x25, 0xf7, 0x1c, 0x17, 0xf7, 0x25, 0x91,\n                                                        0xa, 0x81, 0x91, 0x87, 0x91, 0x97, 0x9f, 0x9b,\n                                                        0x91, 0x92, 0x4c, 0xa, 0xf7, 0x58, 0x16, 0x6d,\n                                                        0x65, 0x35, 0x20, 0x6e, 0x1a, 0x80, 0x8f, 0x88,\n                                                        0x91, 0x96, 0x9d, 0x99, 0x93, 0x95, 0x4c, 0xa,\n                                                        0xe, 0xf2, 0x94, 0x76, 0xac, 0x76, 0xe2, 0xcd,\n                                                        0xf7, 0xe, 0xa9, 0xb4, 0x76, 0xf7, 0x1, 0x76,\n                                                        0xf7, 0xa7, 0x77, 0x12, 0xf6, 0xeb, 0xf8, 0x2a,\n                                                        0xe8, 0x13, 0x7f, 0x80, 0xf8, 0x53, 0xe2, 0x74,\n                                                        0x1d, 0x37, 0x23, 0x50, 0x38, 0x73, 0xa, 0x13,\n                                                        0xbf, 0x80, 0xfb, 0xc0, 0xfb, 0x39, 0x69, 0xa,\n                                                        0xfc, 0xdf, 0x3e, 0x1d, 0xe, 0xf2, 0x8b, 0xdb,\n                                                        0x44, 0x76, 0xf7, 0xb3, 0xa9, 0xb3, 0xcf, 0xf7,\n                                                        0xa7, 0x77, 0x12, 0xd3, 0xeb, 0xf8, 0x7f, 0xe3,\n                                                        0x13, 0x7e, 0xf7, 0x18, 0x7f, 0x69, 0xa, 0xfc,\n                                                        0xd8, 0x3e, 0x1d, 0x13, 0xbe, 0xf8, 0x76, 0xfb,\n                                                        0xc5, 0x15, 0xf7, 0xa2, 0x6, 0xa9, 0xf7, 0x13,\n                                                        0x5, 0x71, 0x6, 0x62, 0x79, 0x85, 0x85, 0x46,\n                                                        0x1b, 0x3f, 0x90, 0x6, 0xe8, 0xe2, 0x5, 0xd5,\n                                                        0xcd, 0x8b, 0xb8, 0x9d, 0x5a, 0x1d, 0x44, 0x3c,\n                                                        0x3c, 0x22, 0x23, 0x1f, 0xe, 0xf2, 0x94, 0x76,\n                                                        0xee, 0xcd, 0xf8, 0x7b, 0xbb, 0x12, 0xf7, 0x58,\n                                                        0xea, 0x5a, 0xd6, 0xf7, 0xae, 0xe8, 0x13, 0xec,\n                                                        0xf7, 0x40, 0x7f, 0x69, 0xa, 0xfc, 0x89, 0xfb,\n                                                        0x5a, 0x40, 0xa, 0x6f, 0xb6, 0x5b, 0x9b, 0x1e,\n                                                        0x8f, 0x7, 0x13, 0xf4, 0xa3, 0x98, 0x4a, 0x1d,\n                                                        0xf7, 0xd9, 0xfc, 0x31, 0x74, 0x1d, 0x35, 0x26,\n                                                        0x52, 0x35, 0x73, 0xa, 0xe, 0xfb, 0x5d, 0xaf,\n                                                        0xf8, 0x88, 0xf7, 0x3a, 0x12, 0xc2, 0xf7, 0x29,\n                                                        0x70, 0xf7, 0x3d, 0x69, 0xf7, 0x17, 0x13, 0xe8,\n                                                        0x13, 0xd0, 0xf7, 0x8b, 0xf7, 0x95, 0x15, 0x99,\n                                                        0x3e, 0x59, 0x6a, 0x56, 0x68, 0x8, 0x58, 0x6a,\n                                                        0x57, 0x68, 0x40, 0x1a, 0xfb, 0x33, 0xf7, 0x37,\n                                                        0x80, 0xaa, 0xf7, 0x38, 0xa9, 0xf1, 0xb4, 0xae,\n                                                        0x78, 0xb5, 0x58, 0x77, 0x62, 0x7f, 0x57, 0x70,\n                                                        0x96, 0x7f, 0x95, 0x80, 0x1e, 0x93, 0x82, 0x93,\n                                                        0x83, 0x7e, 0x1a, 0x66, 0x59, 0x88, 0x82, 0x3d,\n                                                        0x83, 0xe4, 0xb5, 0xcf, 0xa1, 0xb5, 0x9f, 0xb1,\n                                                        0x1e, 0xa2, 0xb6, 0xa4, 0xae, 0x7a, 0xcc, 0x8,\n                                                        0x13, 0xe8, 0x27, 0xf7, 0x37, 0x15, 0x5d, 0xb1,\n                                                        0x64, 0xb9, 0xbb, 0xb0, 0xb3, 0xb8, 0xba, 0x66,\n                                                        0xad, 0x5b, 0x5d, 0x65, 0x6a, 0x5b, 0x1e, 0xe,\n                                                        0x4b, 0x1d, 0xf7, 0x91, 0x77, 0x1, 0xf8, 0xe,\n                                                        0xf9, 0x76, 0x24, 0x1d, 0xfb, 0x77, 0xfd, 0xce,\n                                                        0x20, 0x1d, 0x4b, 0x1d, 0xf7, 0x91, 0x77, 0x1,\n                                                        0xf7, 0xa6, 0xf9, 0x76, 0x22, 0x1d, 0xfc, 0x26,\n                                                        0xfe, 0x13, 0x20, 0x1d, 0x4b, 0x1d, 0xf7, 0x88,\n                                                        0x77, 0x1, 0xf7, 0x4e, 0xf9, 0x76, 0x29, 0x1d,\n                                                        0xfb, 0xbf, 0xfe, 0x26, 0x20, 0x1d, 0x54, 0xa,\n                                                        0xf8, 0x9d, 0xd9, 0x80, 0xd9, 0x12, 0x13, 0xd0,\n                                                        0xf7, 0x40, 0xf9, 0x8b, 0x45, 0x1d, 0xa1, 0xa5,\n                                                        0x81, 0x80, 0xa3, 0x1f, 0x13, 0xe0, 0x7e, 0xa9,\n                                                        0xa8, 0x7c, 0xa1, 0x1b, 0x13, 0xd0, 0x44, 0xa,\n                                                        0x13, 0xe0, 0x54, 0x1d, 0x6b, 0x77, 0x96, 0x96,\n                                                        0x77, 0x1f, 0x13, 0xd0, 0x98, 0x74, 0x75, 0x99,\n                                                        0x69, 0x50, 0x1d, 0xfb, 0x37, 0xfd, 0x8b, 0x20,\n                                                        0x1d, 0x4b, 0x1d, 0xd8, 0xf7, 0x16, 0x1, 0xf7,\n                                                        0x4e, 0xf7, 0x13, 0x8b, 0xde, 0x8b, 0xf7, 0x13,\n                                                        0x14, 0xe, 0xf7, 0x4e, 0xf9, 0xc0, 0x15, 0x6e,\n                                                        0x1d, 0xf7, 0x66, 0x16, 0x6e, 0x1d, 0xfc, 0x17,\n                                                        0xfd, 0xc0, 0x20, 0x1d, 0x54, 0xa, 0xf8, 0x5f,\n                                                        0x77, 0xba, 0xbb, 0xf7, 0x15, 0xbb, 0x1, 0xf7,\n                                                        0x84, 0xbb, 0x8b, 0xf7, 0x9, 0x8b, 0xbb, 0x14,\n                                                        0x7, 0xf7, 0x84, 0xf9, 0xd0, 0x15, 0x4f, 0xbc,\n                                                        0x5d, 0xc5, 0x7d, 0x1d, 0x1e, 0xbb, 0x16, 0xac,\n                                                        0xa4, 0xa5, 0xac, 0xac, 0xa5, 0x71, 0x6a, 0x6a,\n                                                        0x71, 0x72, 0x6a, 0x6a, 0x72, 0xa4, 0xac, 0x1e,\n                                                        0xfb, 0xab, 0xfd, 0xd0, 0x20, 0x1d, 0xf7, 0xf5,\n                                                        0x8b, 0xae, 0x68, 0xb7, 0xf7, 0x97, 0xb3, 0x7f,\n                                                        0xab, 0xf7, 0xa0, 0xb8, 0x12, 0xf8, 0x44, 0xf7,\n                                                        0x34, 0x13, 0xac, 0x8f, 0x16, 0xf7, 0x62, 0xae,\n                                                        0x6, 0x59, 0x91, 0x66, 0x8f, 0xac, 0x1a, 0xf7,\n                                                        0xb, 0xf7, 0x75, 0x5, 0xf7, 0x52, 0xfb, 0x60,\n                                                        0x6, 0x64, 0x7d, 0x75, 0x41, 0x88, 0x1e, 0x68,\n                                                        0xf8, 0xca, 0x7, 0xb4, 0xf7, 0x67, 0x5, 0x74,\n                                                        0x6, 0x7e, 0x60, 0x44, 0x6b, 0x6c, 0x1e, 0x13,\n                                                        0x5c, 0x61, 0x5e, 0x62, 0x81, 0x21, 0x1b, 0x4f,\n                                                        0x82, 0x9e, 0xae, 0x1f, 0xf7, 0x7d, 0x7, 0xf7,\n                                                        0x16, 0x86, 0x8a, 0x56, 0x9b, 0x28, 0x8, 0xac,\n                                                        0xf7, 0xe6, 0x6a, 0x6, 0x6f, 0xfb, 0x14, 0x8b,\n                                                        0x81, 0xfb, 0x9, 0x80, 0x8, 0xf7, 0x82, 0x7,\n                                                        0x9e, 0x8b, 0x96, 0xdd, 0xf7, 0x44, 0x90, 0x49,\n                                                        0x31, 0x9e, 0x1e, 0xae, 0xf7, 0x5d, 0xfd, 0xe,\n                                                        0x6b, 0x6, 0xbf, 0x89, 0xae, 0x85, 0x6c, 0x1a,\n                                                        0xfb, 0xbc, 0xfc, 0xac, 0x5, 0x13, 0xac, 0x78,\n                                                        0x68, 0x84, 0x93, 0x67, 0x84, 0x8, 0xf7, 0x98,\n                                                        0xf7, 0xc8, 0x15, 0xf7, 0x35, 0xf7, 0xac, 0x5,\n                                                        0x92, 0xfb, 0xac, 0x6, 0xe, 0xd6, 0xfb, 0x59,\n                                                        0x76, 0xf7, 0x33, 0xb5, 0x8b, 0xb9, 0x7d, 0xa,\n                                                        0xf7, 0x57, 0xe8, 0x13, 0xfb, 0xf7, 0xc4, 0xfb,\n                                                        0x37, 0x15, 0x7b, 0x66, 0x5, 0x7b, 0xb4, 0xb1,\n                                                        0x89, 0x97, 0x1b, 0xb1, 0xec, 0x93, 0xdc, 0xbc,\n                                                        0x64, 0xa0, 0x58, 0x7e, 0x83, 0x89, 0x88, 0x81,\n                                                        0x1f, 0x9f, 0xb8, 0xf7, 0x11, 0x8c, 0xd8, 0xca,\n                                                        0xd3, 0xdd, 0x19, 0x6d, 0xa4, 0x5, 0x2e, 0x38,\n                                                        0x40, 0x6d, 0x3d, 0x1b, 0xfb, 0x2a, 0x5e, 0xf7,\n                                                        0x45, 0xf7, 0x12, 0xf7, 0x3d, 0xaa, 0xf7, 0x31,\n                                                        0xf7, 0x26, 0xf7, 0x6, 0xdd, 0xfb, 0x9, 0x34,\n                                                        0xae, 0x1f, 0xae, 0x6, 0x13, 0xf7, 0x6a, 0x1d,\n                                                        0x7b, 0x6c, 0x9d, 0x99, 0x61, 0x1f, 0x13, 0xfb,\n                                                        0x94, 0x70, 0x6b, 0x93, 0x68, 0x1b, 0xfb, 0x66,\n                                                        0xfb, 0x24, 0xfb, 0x30, 0xfb, 0x5f, 0xfb, 0x44,\n                                                        0xf7, 0x4, 0xfb, 0x30, 0xf7, 0x66, 0x7a, 0x1f,\n                                                        0x68, 0x3c, 0x96, 0x83, 0x5, 0x8d, 0x93, 0x92,\n                                                        0x8d, 0x98, 0x1b, 0xa5, 0x9f, 0x80, 0x72, 0x73,\n                                                        0x1d, 0x1f, 0xe, 0x55, 0x1d, 0x9b, 0x16, 0x21,\n                                                        0x1d, 0xf7, 0xf0, 0xf9, 0x53, 0x26, 0xa, 0x55,\n                                                        0x1d, 0xf7, 0x98, 0xf9, 0x76, 0x22, 0x1d, 0xfc,\n                                                        0x11, 0xfe, 0x13, 0x15, 0x21, 0x1d, 0xe, 0x51,\n                                                        0xa, 0xf7, 0x82, 0x72, 0xa, 0xf7, 0x40, 0xf9,\n                                                        0x76, 0x29, 0x1d, 0xfb, 0xaa, 0xfe, 0x26, 0x15,\n                                                        0x21, 0x1d, 0xe, 0x9f, 0x8b, 0xaa, 0xf7, 0xbe,\n                                                        0xad, 0xf7, 0xab, 0xad, 0xd2, 0x9a, 0x1d, 0xf3,\n                                                        0xf7, 0x36, 0x2c, 0xf7, 0x16, 0xda, 0xf7, 0x16,\n                                                        0x2f, 0xaf, 0x13, 0xf9, 0x9b, 0x16, 0x21, 0x1d,\n                                                        0x13, 0xf6, 0xf7, 0x2f, 0xf9, 0x9d, 0x15, 0x2a,\n                                                        0x1d, 0xf7, 0x65, 0x38, 0x1d, 0x35, 0x1d, 0xf7,\n                                                        0x5a, 0xf9, 0x53, 0x26, 0xa, 0x35, 0x1d, 0xe9,\n                                                        0xf9, 0x53, 0x28, 0x1d, 0x5c, 0xa, 0xf7, 0x82,\n                                                        0x77, 0x27, 0xa, 0x91, 0xf9, 0x53, 0x29, 0x1d,\n                                                        0xe, 0x5c, 0xa, 0xd2, 0x9a, 0x1d, 0x9f, 0xf7,\n                                                        0x1a, 0x62, 0xf7, 0x36, 0x62, 0xf7, 0x16, 0x13,\n                                                        0xf4, 0x9f, 0x16, 0xf7, 0xf2, 0xae, 0x6, 0x13,\n                                                        0xe8, 0x34, 0x1d, 0x7, 0x13, 0xf4, 0xfb, 0xf2,\n                                                        0x68, 0x6, 0x13, 0xe8, 0x4b, 0xa, 0x13, 0xf4,\n                                                        0x4d, 0x64, 0x87, 0x55, 0x86, 0x1e, 0x8f, 0xf9,\n                                                        0x9d, 0x40, 0x1d, 0x8a, 0x1d, 0xf7, 0xb7, 0xba,\n                                                        0xf7, 0xa1, 0xad, 0x1, 0xec, 0xf7, 0x36, 0xf7,\n                                                        0x95, 0xf7, 0x42, 0x3, 0xf7, 0x97, 0xf7, 0xda,\n                                                        0x15, 0xf7, 0x6, 0xba, 0xfb, 0x6, 0xf7, 0x67,\n                                                        0x6, 0x8c, 0x1d, 0xfb, 0x69, 0x30, 0x84, 0xa,\n                                                        0x1f, 0xfb, 0x89, 0x30, 0x15, 0xf7, 0xd0, 0x6,\n                                                        0xf7, 0x90, 0xf7, 0x0, 0xf7, 0x2e, 0xf7, 0x4c,\n                                                        0xf7, 0x2e, 0x30, 0xf7, 0x4c, 0x95, 0x1d, 0xb7,\n                                                        0x8f, 0x4e, 0x1f, 0xfb, 0x67, 0x30, 0x5c, 0xe6,\n                                                        0xfb, 0x7f, 0x7, 0x66, 0x77, 0x78, 0x4c, 0x1e,\n                                                        0xe, 0xd6, 0x8e, 0x76, 0xf9, 0x27, 0xae, 0xdc,\n                                                        0xd9, 0x12, 0xf2, 0xb7, 0xf8, 0x44, 0xb7, 0x17,\n                                                        0x72, 0x1d, 0x37, 0xa, 0xf7, 0x37, 0xf9, 0x68,\n                                                        0x45, 0x1d, 0x13, 0x30, 0xa8, 0xa2, 0x81, 0x80,\n                                                        0xa0, 0x1f, 0x7e, 0xa4, 0xa3, 0x7c, 0xaa, 0x1b,\n                                                        0x42, 0xa, 0x13, 0x10, 0x74, 0x76, 0x98, 0x98,\n                                                        0x72, 0x1f, 0x97, 0x74, 0x71, 0x96, 0x6a, 0x50,\n                                                        0x1d, 0xe, 0x51, 0x1d, 0xf7, 0x7c, 0x77, 0x57,\n                                                        0x1d, 0xfb, 0x48, 0x78, 0xa, 0xfb, 0x7b, 0x58,\n                                                        0x1d, 0xf7, 0x21, 0x5e, 0xa, 0xf7, 0x21, 0x5e,\n                                                        0x1d, 0xfb, 0x18, 0xfb, 0x6e, 0x1e, 0xf8, 0xe,\n                                                        0xf8, 0x21, 0x26, 0xa, 0x51, 0x1d, 0xf7, 0x7c,\n                                                        0x77, 0x1, 0xae, 0xf7, 0x45, 0xf7, 0xf6, 0x30,\n                                                        0xa, 0xf7, 0xa6, 0xf8, 0x26, 0x28, 0x1d, 0x51,\n                                                        0x1d, 0x57, 0x1d, 0xfb, 0x49, 0x78, 0xa, 0xfb,\n                                                        0x7a, 0x58, 0x1d, 0xf7, 0x20, 0x5e, 0xa, 0xf7,\n                                                        0x22, 0x5e, 0x1d, 0xfb, 0x18, 0xfb, 0x6e, 0x1e,\n                                                        0xf7, 0x4e, 0xf8, 0x21, 0x29, 0x1d, 0xe, 0x51,\n                                                        0x1d, 0xcd, 0xd9, 0x6e, 0xd9, 0x12, 0x5c, 0x1d,\n                                                        0x13, 0xdc, 0xf7, 0x68, 0xf7, 0xea, 0x79, 0x1d,\n                                                        0xf7, 0x3e, 0x66, 0x1d, 0xfb, 0x49, 0x78, 0xa,\n                                                        0xfb, 0x7a, 0x65, 0x1d, 0xf7, 0x85, 0x45, 0xa,\n                                                        0xfb, 0x2b, 0x5f, 0x1d, 0xf7, 0x20, 0x5e, 0xa,\n                                                        0xf7, 0x22, 0xfb, 0x55, 0x96, 0xa, 0x1e, 0xf7,\n                                                        0x3a, 0xf8, 0x35, 0x45, 0x1d, 0xa9, 0xa1, 0x80,\n                                                        0x80, 0xa1, 0x1f, 0x13, 0xec, 0x7e, 0xa4, 0xa2,\n                                                        0x7d, 0xaa, 0x1b, 0x13, 0xdc, 0x44, 0xa, 0x13,\n                                                        0xec, 0x54, 0x1d, 0x75, 0x76, 0x98, 0x97, 0x73,\n                                                        0x1f, 0x13, 0xdc, 0x97, 0x74, 0x70, 0x97, 0x69,\n                                                        0x50, 0x1d, 0xe, 0x51, 0x1d, 0xc3, 0xf7, 0x16,\n                                                        0x1, 0xae, 0xf7, 0x45, 0x94, 0xf7, 0x14, 0xdc,\n                                                        0xf7, 0x14, 0x93, 0x30, 0xa, 0xf7, 0x4e, 0xf8,\n                                                        0x70, 0x15, 0x6d, 0xa, 0xf7, 0x65, 0x16, 0x6d,\n                                                        0xa, 0xe, 0x3e, 0xb0, 0x76, 0xf8, 0x6e, 0x77,\n                                                        0x1, 0xbb, 0xca, 0x15, 0xb8, 0x5c, 0xf7, 0x54,\n                                                        0xf7, 0x56, 0xf7, 0x54, 0xfb, 0x56, 0xb8, 0xbb,\n                                                        0xfb, 0x54, 0xf7, 0x51, 0xf7, 0x54, 0xf7, 0x55,\n                                                        0x5b, 0xb7, 0xfb, 0x51, 0xfb, 0x52, 0xfb, 0x51,\n                                                        0xf7, 0x52, 0x5b, 0x5e, 0xf7, 0x53, 0xfb, 0x54,\n                                                        0x5, 0xe, 0xf7, 0x17, 0x56, 0x76, 0xc2, 0xac,\n                                                        0x93, 0x1d, 0xb9, 0x77, 0x5a, 0xa, 0xdc, 0x41,\n                                                        0x15, 0xbd, 0x6, 0xd2, 0xf3, 0x5, 0x6b, 0xc0,\n                                                        0xca, 0x7a, 0xd2, 0x1b, 0xf7, 0x61, 0xf7, 0x29,\n                                                        0xf7, 0x1f, 0xf7, 0x66, 0xf7, 0x12, 0x55, 0xf4,\n                                                        0x39, 0xc8, 0x1f, 0xd9, 0xf7, 0x7, 0x5, 0x59,\n                                                        0x6, 0x4c, 0x2e, 0x5, 0xaa, 0x56, 0x4c, 0x9b,\n                                                        0x48, 0x1b, 0x96, 0xa, 0xfb, 0xd, 0xbd, 0x21,\n                                                        0xdd, 0x4c, 0x1f, 0xce, 0xee, 0x15, 0x76, 0xcf,\n                                                        0x8a, 0xdc, 0xb5, 0x1a, 0xf7, 0x26, 0xb0, 0xf7,\n                                                        0x3e, 0xf7, 0x20, 0xca, 0xb4, 0x68, 0x55, 0xa6,\n                                                        0x1e, 0xfb, 0x9f, 0xfc, 0x65, 0x15, 0xf7, 0xb3,\n                                                        0xf8, 0x38, 0x5, 0x9e, 0x53, 0x92, 0x40, 0x4c,\n                                                        0x1a, 0x34, 0x85, 0xfb, 0x79, 0xfb, 0x3f, 0x46,\n                                                        0x61, 0xb1, 0xbf, 0x72, 0x1e, 0xe, 0x6b, 0xa,\n                                                        0xf7, 0x8b, 0x77, 0x63, 0xa, 0x9b, 0xf9, 0x15,\n                                                        0x21, 0xa, 0xf8, 0x20, 0xc9, 0x26, 0xa, 0x6b,\n                                                        0xa, 0xf7, 0x8b, 0x77, 0x63, 0xa, 0xf7, 0xc8,\n                                                        0xf9, 0x76, 0x22, 0x1d, 0xfc, 0x41, 0xfb, 0x92,\n                                                        0x21, 0xa, 0xe, 0x6b, 0xa, 0xf7, 0x82, 0x77,\n                                                        0x63, 0xa, 0xf7, 0x70, 0xf9, 0x76, 0x29, 0x1d,\n                                                        0xfb, 0xda, 0xfb, 0xa5, 0x21, 0xa, 0xe, 0x6b,\n                                                        0xa, 0xd2, 0x9a, 0x1d, 0xed, 0xf7, 0x33, 0x64,\n                                                        0xf7, 0x16, 0xc8, 0xf7, 0x16, 0x9c, 0xb7, 0x13,\n                                                        0xf6, 0x9b, 0xf9, 0x15, 0x21, 0xa, 0x13, 0xee,\n                                                        0xf7, 0x5e, 0xf7, 0x1c, 0x15, 0x2a, 0x1d, 0xf7,\n                                                        0x67, 0x38, 0x1d, 0xd6, 0x4e, 0x1d, 0xf7, 0x90,\n                                                        0x77, 0x1, 0xf7, 0xaa, 0x7f, 0x1d, 0x69, 0x1d,\n                                                        0x83, 0xde, 0x1a, 0xf7, 0x4c, 0x66, 0xa, 0xb8,\n                                                        0x89, 0x64, 0x1a, 0xfb, 0x32, 0xfb, 0xa0, 0x5,\n                                                        0xfb, 0x14, 0xf7, 0x82, 0x7b, 0xa4, 0x3d, 0x1d,\n                                                        0xfb, 0x27, 0x7, 0x38, 0x73, 0x93, 0x46, 0x84,\n                                                        0x1e, 0xf7, 0x3, 0xf9, 0x58, 0x28, 0x1d, 0x67,\n                                                        0x8f, 0x76, 0xb1, 0x76, 0xf7, 0x41, 0xae, 0x7d,\n                                                        0xae, 0xf7, 0xa6, 0xae, 0x68, 0xf7, 0x41, 0xfb,\n                                                        0x3d, 0xf7, 0x39, 0x8f, 0x77, 0x12, 0xef, 0xf7,\n                                                        0x36, 0xfb, 0x26, 0xf7, 0x36, 0xf7, 0x29, 0xf7,\n                                                        0x40, 0xfb, 0x3f, 0xf7, 0x40, 0x13, 0xa2, 0xa0,\n                                                        0xf7, 0x9a, 0xf7, 0x64, 0x15, 0xf7, 0x98, 0x7,\n                                                        0x13, 0x99, 0x60, 0xa1, 0x8c, 0x98, 0x98, 0xad,\n                                                        0x1b, 0x13, 0x92, 0x50, 0xdd, 0xaf, 0x6d, 0xfb,\n                                                        0x6, 0x1f, 0x13, 0xa2, 0xa0, 0xfb, 0x10, 0x5e,\n                                                        0x70, 0xfb, 0xd, 0x1e, 0x13, 0x52, 0x60, 0xfb,\n                                                        0x8a, 0xfb, 0x64, 0x15, 0xf7, 0xe2, 0xae, 0x6,\n                                                        0x13, 0x92, 0xa0, 0x46, 0x94, 0x78, 0x83, 0xdc,\n                                                        0x1a, 0x13, 0xa2, 0xa0, 0xc3, 0x7, 0x13, 0x92,\n                                                        0x50, 0xf7, 0x3c, 0x8a, 0xf7, 0x3e, 0xb8, 0xf7,\n                                                        0x25, 0x1a, 0x13, 0x99, 0x60, 0xdf, 0x60, 0xe7,\n                                                        0xfb, 0x79, 0x1e, 0x13, 0x99, 0xa0, 0x49, 0x97,\n                                                        0x6, 0xdc, 0x9e, 0x8b, 0xd0, 0x95, 0x1e, 0x13,\n                                                        0x94, 0x60, 0xae, 0xfb, 0xe2, 0x68, 0x7, 0x13,\n                                                        0x92, 0xa0, 0xc0, 0x86, 0xaa, 0x8a, 0x37, 0x1a,\n                                                        0xfc, 0x46, 0x7, 0x31, 0x70, 0x9e, 0x52, 0x80,\n                                                        0x1e, 0xe, 0x30, 0x7f, 0xae, 0x6e, 0xf7, 0x12,\n                                                        0x28, 0x76, 0xf8, 0x9, 0xad, 0xf7, 0x94, 0xa7,\n                                                        0x12, 0xd1, 0xf7, 0x1f, 0xf7, 0x16, 0xf7, 0x1d,\n                                                        0x22, 0xf7, 0x26, 0x13, 0x9e, 0x9e, 0x16, 0xad,\n                                                        0x7, 0x13, 0x5d, 0xb0, 0x91, 0x99, 0x91, 0xbe,\n                                                        0x1a, 0xf8, 0x2e, 0x7, 0xf4, 0xdd, 0xda, 0xf7,\n                                                        0x8, 0xf7, 0x31, 0xbe, 0x2a, 0x55, 0x3b, 0x4b,\n                                                        0x5a, 0x32, 0x7a, 0x1e, 0x89, 0x7, 0xf7, 0x1a,\n                                                        0x68, 0xc7, 0x53, 0xfb, 0x3, 0x1a, 0x36, 0x5b,\n                                                        0x51, 0x57, 0x68, 0x1e, 0x13, 0x9e, 0x7f, 0x83,\n                                                        0x7d, 0x84, 0x7d, 0x8a, 0x6e, 0x89, 0x18, 0x6e,\n                                                        0x6e, 0x94, 0x9e, 0x79, 0x1f, 0x13, 0x3e, 0x7f,\n                                                        0x98, 0x83, 0x9b, 0xa0, 0x1a, 0xa8, 0x9f, 0x9e,\n                                                        0xa7, 0xad, 0x97, 0x72, 0x75, 0x1e, 0x7f, 0x88,\n                                                        0x85, 0x81, 0x1a, 0x7d, 0x96, 0x88, 0x97, 0x1e,\n                                                        0xa4, 0x90, 0x88, 0xa4, 0x7e, 0xbb, 0x8, 0x85,\n                                                        0xa3, 0x8d, 0xa7, 0xab, 0x1a, 0xf7, 0x2e, 0x67,\n                                                        0xa5, 0x49, 0x8e, 0x1e, 0xad, 0x7, 0x13, 0x9d,\n                                                        0xd6, 0x91, 0x86, 0xb6, 0xdf, 0x1a, 0xed, 0x6d,\n                                                        0xa4, 0x62, 0x55, 0x87, 0x57, 0x72, 0x8a, 0x1e,\n                                                        0x13, 0x5e, 0xfc, 0xde, 0x7, 0xe, 0x92, 0x50,\n                                                        0xa, 0x52, 0x1d, 0x13, 0xd8, 0xf7, 0xba, 0xc3,\n                                                        0x2a, 0xa, 0x84, 0x93, 0x86, 0x92, 0x94, 0x1a,\n                                                        0x13, 0xb8, 0x3b, 0x1d, 0x71, 0xf7, 0xaf, 0x26,\n                                                        0xa, 0x92, 0x50, 0xa, 0xd7, 0x76, 0xf7, 0x4d,\n                                                        0x77, 0x52, 0x1d, 0x13, 0xde, 0xf7, 0x37, 0xf8,\n                                                        0xa4, 0x22, 0x1d, 0x85, 0xfd, 0x9, 0x37, 0x1d,\n                                                        0x13, 0xbe, 0x3b, 0x1d, 0xe, 0x92, 0x50, 0xa,\n                                                        0xf7, 0x7b, 0x77, 0x52, 0x1d, 0x13, 0xdc, 0xd6,\n                                                        0xf8, 0xa4, 0x29, 0x1d, 0xec, 0xfd, 0x1c, 0x23,\n                                                        0x1d, 0xa2, 0x81, 0x97, 0x82, 0x96, 0x1e, 0x85,\n                                                        0x92, 0x86, 0x91, 0x36, 0x1d, 0x92, 0x50, 0xa,\n                                                        0xd5, 0xd9, 0x6e, 0xd9, 0x52, 0x1d, 0x13, 0xce,\n                                                        0xc8, 0xf8, 0xb9, 0x45, 0x1d, 0xa7, 0xa2, 0x82,\n                                                        0x80, 0xa1, 0x1f, 0x13, 0xd6, 0x7d, 0xa7, 0xa5,\n                                                        0x7c, 0xa5, 0x1b, 0x13, 0xce, 0x44, 0xa, 0x13,\n                                                        0xd6, 0x54, 0x1d, 0x71, 0x73, 0x96, 0x97, 0x73,\n                                                        0x1f, 0x13, 0xce, 0x98, 0x71, 0x72, 0x98, 0x71,\n                                                        0x50, 0x1d, 0xf7, 0x7d, 0xfc, 0x81, 0x23, 0x1d,\n                                                        0xa2, 0x81, 0x98, 0x82, 0x95, 0x1e, 0x85, 0x92,\n                                                        0x86, 0x91, 0x94, 0x1a, 0x13, 0xb6, 0x3b, 0xa,\n                                                        0x13, 0x86, 0x24, 0xa, 0xe, 0x92, 0x50, 0xa,\n                                                        0xcb, 0xf7, 0x16, 0x52, 0x1d, 0x13, 0xdc, 0xd6,\n                                                        0x3f, 0xa, 0x94, 0xfc, 0xb6, 0x23, 0x1d, 0xa2,\n                                                        0x80, 0x97, 0x83, 0x95, 0x1e, 0x85, 0x92, 0x86,\n                                                        0x92, 0x36, 0x1d, 0x92, 0x76, 0xf7, 0xbb, 0xf7,\n                                                        0x54, 0xc1, 0xbb, 0x5b, 0xf7, 0x38, 0xfb, 0x8,\n                                                        0xf7, 0x8, 0x8b, 0xbc, 0x12, 0xa4, 0xf7, 0x26,\n                                                        0x69, 0xf7, 0x38, 0xfb, 0x8, 0xf7, 0x39, 0x13,\n                                                        0xd5, 0x0, 0xf7, 0x1d, 0x94, 0xa, 0x13, 0xee,\n                                                        0x80, 0x7d, 0x1d, 0x1f, 0xf7, 0x31, 0xfc, 0xd5,\n                                                        0x37, 0x1d, 0x3b, 0x1d, 0xfb, 0x0, 0xf8, 0x18,\n                                                        0x15, 0xab, 0xa5, 0xa5, 0xab, 0xab, 0xa5, 0x71,\n                                                        0x6b, 0x6b, 0x71, 0x71, 0x6b, 0x6b, 0x71, 0xa5,\n                                                        0xab, 0x1e, 0xe, 0xd6, 0x7d, 0xca, 0x4c, 0xd1,\n                                                        0xf7, 0x54, 0xb0, 0x8a, 0xf7, 0x51, 0x6b, 0xab,\n                                                        0x12, 0xac, 0xf7, 0x29, 0xfb, 0x18, 0xf7, 0x18,\n                                                        0xf7, 0x6, 0xf7, 0x1e, 0xf7, 0x1d, 0xf7, 0xd,\n                                                        0x13, 0x6d, 0x80, 0xf7, 0xe5, 0xd6, 0x15, 0x37,\n                                                        0xba, 0xcf, 0x86, 0xb0, 0x1b, 0xde, 0xce, 0xb1,\n                                                        0xe4, 0xc1, 0x1f, 0x76, 0x9a, 0x5, 0x72, 0x77,\n                                                        0x69, 0x5c, 0x42, 0x1b, 0xfb, 0x3, 0x8b, 0xf7,\n                                                        0xf, 0xb9, 0x1f, 0xa2, 0xf7, 0x96, 0x7, 0x13,\n                                                        0x93, 0x80, 0xf7, 0x41, 0x8c, 0xfb, 0x1, 0xbf,\n                                                        0x39, 0x1b, 0x4b, 0x65, 0x73, 0x70, 0x71, 0x1f,\n                                                        0xa0, 0x76, 0x66, 0xa9, 0x29, 0x1b, 0x27, 0x47,\n                                                        0x52, 0x47, 0x5f, 0xae, 0x77, 0xa8, 0xb8, 0xa2,\n                                                        0x9d, 0xb3, 0xa1, 0x83, 0x95, 0x84, 0x93, 0x1f,\n                                                        0x84, 0x92, 0x84, 0x91, 0x97, 0x1a, 0x13, 0xad,\n                                                        0x80, 0xa1, 0xaf, 0x97, 0xa8, 0xdb, 0x89, 0x57,\n                                                        0x6e, 0x1e, 0x3b, 0x7, 0xfb, 0x45, 0x52, 0x35,\n                                                        0x6f, 0x23, 0x1a, 0x46, 0xb6, 0x67, 0xd7, 0xe1,\n                                                        0xc6, 0xbc, 0xad, 0xad, 0x1e, 0x68, 0x97, 0x15,\n                                                        0x6c, 0x6e, 0x79, 0x8a, 0x78, 0x1b, 0x5e, 0x83,\n                                                        0xb7, 0xa7, 0xdb, 0xcb, 0xa7, 0xc2, 0x9e, 0x1f,\n                                                        0xf7, 0x1e, 0xb0, 0x15, 0xcb, 0x8b, 0xe9, 0xcf,\n                                                        0xbf, 0x9c, 0x67, 0x32, 0x1e, 0x6a, 0x7, 0xe,\n                                                        0xfb, 0x5f, 0xfb, 0x59, 0x76, 0xf7, 0x63, 0xcb,\n                                                        0x86, 0x1d, 0xea, 0xe8, 0x4e, 0xf7, 0x10, 0x13,\n                                                        0xdc, 0xf7, 0x44, 0x2b, 0x15, 0x4f, 0x1d, 0xb1,\n                                                        0xf7, 0x5, 0x8e, 0xda, 0xc7, 0x49, 0xa6, 0x54,\n                                                        0x7c, 0x1f, 0xa1, 0xbe, 0xd3, 0x8f, 0xc7, 0xb2,\n                                                        0xb6, 0xc8, 0x19, 0x79, 0x9d, 0x5, 0x70, 0x73,\n                                                        0x71, 0x6e, 0x52, 0x1b, 0x3d, 0x4e, 0xdc, 0xf7,\n                                                        0x20, 0xb8, 0x98, 0xf7, 0xf, 0xd9, 0x1f, 0x13,\n                                                        0xea, 0x9a, 0x9f, 0x82, 0x6d, 0x8f, 0x1d, 0x33,\n                                                        0xb0, 0x44, 0x1f, 0x13, 0x4a, 0x2d, 0xfb, 0x1e,\n                                                        0x4e, 0xfb, 0x59, 0xfb, 0x7, 0xd6, 0x27, 0xf7,\n                                                        0x6, 0x80, 0x1f, 0xe, 0x4c, 0x1d, 0x78, 0xfb,\n                                                        0x4, 0x5b, 0x94, 0x1e, 0xfb, 0x1c, 0x79, 0xa,\n                                                        0x13, 0xd8, 0x2b, 0x1d, 0xde, 0xf7, 0xaf, 0x26,\n                                                        0xa, 0x4c, 0x1d, 0x86, 0xfb, 0x9, 0x60, 0x8d,\n                                                        0x1e, 0xfb, 0x23, 0x80, 0xa, 0x1e, 0x13, 0xd8,\n                                                        0x2b, 0x1d, 0x76, 0xf7, 0xaf, 0x28, 0x1d, 0x49,\n                                                        0x1d, 0xd7, 0x83, 0x1d, 0xa4, 0x8a, 0xa, 0x4d,\n                                                        0xa, 0x82, 0xfb, 0x4, 0x5b, 0x92, 0x1e, 0xfb,\n                                                        0x24, 0x80, 0xa, 0x34, 0xa, 0x1e, 0x39, 0x1d,\n                                                        0xfb, 0x1, 0xf7, 0xaf, 0x29, 0x1d, 0xe, 0x49,\n                                                        0x1d, 0xcb, 0xf7, 0x16, 0x98, 0xa, 0x21, 0xf7,\n                                                        0x16, 0xdb, 0xf7, 0x16, 0x13, 0xfa, 0x4d, 0xa,\n                                                        0x7d, 0xfb, 0x4, 0x5b, 0x92, 0x1e, 0xfb, 0x1f,\n                                                        0x79, 0xa, 0x2b, 0x1d, 0x13, 0xf6, 0xfb, 0x3,\n                                                        0xf7, 0xf9, 0x40, 0x1d, 0x3e, 0xa, 0xfb, 0xa6,\n                                                        0x7, 0x5b, 0x7a, 0x88, 0x67, 0x82, 0x1e, 0xf7,\n                                                        0x1f, 0xf8, 0x82, 0x29, 0xa, 0x81, 0x7f, 0xa,\n                                                        0x99, 0x7c, 0xa4, 0x7c, 0x1f, 0xe, 0x3e, 0xa,\n                                                        0xfb, 0xa9, 0x7, 0x5b, 0x7a, 0x8b, 0x67, 0x82,\n                                                        0x1e, 0xae, 0xf8, 0x82, 0x56, 0x1d, 0xf7, 0x22,\n                                                        0xe3, 0x5, 0xa3, 0x9a, 0x9c, 0x95, 0xa7, 0x1a,\n                                                        0xaf, 0x6b, 0x2c, 0xa, 0xe, 0x5d, 0xa, 0xf7,\n                                                        0x0, 0x83, 0x1d, 0xd0, 0x8a, 0xa, 0x67, 0xf8,\n                                                        0xa4, 0x56, 0x1d, 0xf7, 0x3, 0xed, 0xf7, 0x5,\n                                                        0x29, 0x5, 0xc4, 0x6, 0xfb, 0x10, 0xf7, 0x44,\n                                                        0x5, 0x2f, 0x6, 0x46, 0xfd, 0x54, 0x15, 0x33,\n                                                        0xa, 0xe, 0xfc, 0x5, 0xa0, 0x76, 0xf8, 0xad,\n                                                        0x9a, 0x1d, 0x67, 0xf7, 0x13, 0x75, 0xf7, 0x1f,\n                                                        0x69, 0xf7, 0x13, 0x13, 0xd0, 0x49, 0xa, 0x13,\n                                                        0xe8, 0x57, 0xf8, 0xcd, 0x15, 0x6c, 0x1d, 0xf7,\n                                                        0x66, 0x16, 0x6c, 0x1d, 0xe, 0x65, 0xa, 0xf7,\n                                                        0x6e, 0x77, 0x12, 0x5d, 0x1d, 0xfb, 0x1c, 0xf7,\n                                                        0x27, 0x13, 0xf8, 0xf7, 0x40, 0xf7, 0x83, 0x78,\n                                                        0x1d, 0xe4, 0xd5, 0xc8, 0x9c, 0x5a, 0x64, 0xa,\n                                                        0x2c, 0x46, 0x3b, 0x8b, 0xf7, 0x6, 0xf7, 0x0,\n                                                        0x1e, 0x13, 0xf4, 0xf7, 0x3c, 0xf7, 0x55, 0x15,\n                                                        0xab, 0x73, 0x6b, 0x94, 0x6a, 0x1b, 0xfb, 0x1f,\n                                                        0x34, 0x22, 0xfb, 0x15, 0xfb, 0x16, 0xe2, 0xfb,\n                                                        0xf, 0xf7, 0x1f, 0x1f, 0x13, 0xf8, 0xf7, 0x1c,\n                                                        0xe4, 0xf6, 0xf7, 0x26, 0xf7, 0x36, 0x4e, 0xf7,\n                                                        0x2e, 0x3b, 0xc6, 0x1f, 0xe7, 0xba, 0x5a, 0xa9,\n                                                        0x31, 0x5d, 0x55, 0xa8, 0x51, 0x98, 0x5b, 0x8f,\n                                                        0x19, 0x5d, 0x72, 0xb8, 0x83, 0xb9, 0x78, 0xb5,\n                                                        0x6c, 0x19, 0xfb, 0x9, 0x50, 0xbb, 0x6c, 0xf7,\n                                                        0x2, 0xc3, 0xb1, 0x66, 0xa9, 0x5c, 0x9d, 0x54,\n                                                        0x19, 0xe, 0x30, 0x82, 0x1d, 0xd5, 0xd9, 0x6e,\n                                                        0xd9, 0x12, 0xd5, 0x53, 0xa, 0x13, 0xdc, 0xa0,\n                                                        0x41, 0xa, 0x8d, 0x8b, 0xaa, 0xa3, 0x1a, 0x76,\n                                                        0xa, 0x36, 0x60, 0x4f, 0x73, 0x7d, 0x1e, 0x88,\n                                                        0x1d, 0xb3, 0x85, 0x98, 0x83, 0x5e, 0x1a, 0xfb,\n                                                        0xa9, 0x7, 0x5a, 0x7a, 0x8a, 0x67, 0x84, 0x1e,\n                                                        0xd6, 0xf8, 0x97, 0x45, 0x1d, 0xa6, 0xa3, 0x80,\n                                                        0x80, 0xa3, 0x1f, 0x13, 0xec, 0x7e, 0xa6, 0xa5,\n                                                        0x7d, 0xa4, 0x1b, 0x13, 0x10, 0x42, 0xa, 0x6d,\n                                                        0x8f, 0xa, 0x6d, 0x50, 0x1d, 0xe, 0x65, 0xa,\n                                                        0xd7, 0x98, 0x1d, 0x5d, 0x1d, 0x3, 0xf7, 0x40,\n                                                        0xf7, 0x90, 0x78, 0x1d, 0xd7, 0xd5, 0xc8, 0x9c,\n                                                        0x5f, 0x64, 0xa, 0x27, 0x46, 0x3b, 0x8b, 0xf7,\n                                                        0x13, 0xf7, 0x0, 0x1e, 0xfb, 0x27, 0x75, 0x15,\n                                                        0xfb, 0x16, 0xe2, 0xfb, 0x6, 0x70, 0xa, 0xf7,\n                                                        0x4, 0x6f, 0xa, 0xf2, 0x70, 0x1d, 0xfb, 0x6,\n                                                        0xfb, 0x15, 0x1e, 0xf7, 0x8d, 0xf7, 0xbe, 0x56,\n                                                        0x1d, 0x49, 0xd7, 0x64, 0xbd, 0x70, 0xa6, 0x8,\n                                                        0xaa, 0x6c, 0x7c, 0x8c, 0x80, 0x1b, 0x65, 0x80,\n                                                        0x7f, 0xa, 0xa5, 0x75, 0xa4, 0x7b, 0x1f, 0xe,\n                                                        0x65, 0xa, 0xd7, 0x76, 0xf7, 0x4d, 0x32, 0xa,\n                                                        0xf7, 0x27, 0xf7, 0xbf, 0x28, 0x1d, 0x65, 0xa,\n                                                        0xd7, 0x76, 0xf7, 0x44, 0x32, 0xa, 0xc4, 0xf7,\n                                                        0xbf, 0x60, 0xa, 0x65, 0xa, 0xd5, 0xd9, 0x6e,\n                                                        0xd9, 0x12, 0x5d, 0x1d, 0x13, 0xdc, 0x25, 0xa,\n                                                        0xc0, 0xf7, 0xd4, 0x45, 0x1d, 0xa7, 0xa6, 0x7f,\n                                                        0x7f, 0xa4, 0x1f, 0x13, 0xec, 0x7f, 0xa4, 0xa3,\n                                                        0x7e, 0xa3, 0x1b, 0x13, 0x10, 0x42, 0xa, 0x6c,\n                                                        0x8f, 0xa, 0x6e, 0x50, 0x1d, 0xe, 0x65, 0xa,\n                                                        0xcc, 0xf7, 0x15, 0x12, 0xa4, 0xf7, 0x27, 0x30,\n                                                        0xf7, 0x15, 0xdc, 0xf7, 0x15, 0x30, 0xf7, 0x27,\n                                                        0x13, 0xf2, 0x25, 0xa, 0x13, 0xec, 0xc3, 0xf8,\n                                                        0x9, 0x2d, 0x1d, 0x3e, 0x6c, 0xef, 0x27, 0xf7,\n                                                        0x2a, 0xe5, 0xe2, 0x40, 0xcb, 0xef, 0xf7, 0x2c,\n                                                        0x27, 0xef, 0x12, 0xf7, 0x65, 0xf7, 0x2d, 0xfb,\n                                                        0x13, 0xef, 0x13, 0x5a, 0xad, 0xf7, 0x71, 0x15,\n                                                        0xf8, 0x8b, 0xcb, 0xfc, 0x8b, 0x6, 0x13, 0xa5,\n                                                        0xf7, 0x5d, 0xfb, 0x9e, 0x15, 0x6c, 0xa, 0xf8,\n                                                        0x68, 0x4, 0x6c, 0xa, 0xe, 0x44, 0x76, 0xd9,\n                                                        0xaa, 0xf7, 0xd9, 0x76, 0xf7, 0xd, 0xaa, 0xd7,\n                                                        0x77, 0x12, 0xa2, 0xf7, 0x27, 0xfb, 0x25, 0xf7,\n                                                        0x27, 0xf7, 0x31, 0xf7, 0x27, 0x13, 0xfd, 0xf7,\n                                                        0x41, 0xf7, 0x23, 0x15, 0x13, 0xfb, 0x8a, 0xa5,\n                                                        0x8b, 0xa4, 0xa9, 0x1a, 0xf7, 0x6, 0x90, 0xf3,\n                                                        0xd5, 0xad, 0x9f, 0x78, 0x62, 0x96, 0x1e, 0xfb,\n                                                        0x21, 0xfb, 0x83, 0x5, 0xfb, 0x21, 0xfb, 0x7f,\n                                                        0x15, 0xba, 0x6, 0xca, 0xf4, 0x5, 0x7a, 0xa9,\n                                                        0xb0, 0x81, 0xb3, 0x1b, 0xf7, 0x1c, 0xe4, 0xf4,\n                                                        0xf7, 0x19, 0xde, 0x69, 0xd7, 0x55, 0xb6, 0x1f,\n                                                        0xd4, 0xf7, 0xf, 0x5, 0x5d, 0x6, 0x4f, 0x26,\n                                                        0x5, 0x9b, 0x6e, 0x67, 0x94, 0x64, 0x1b, 0xfb,\n                                                        0x1f, 0x34, 0xfb, 0xc, 0xfb, 0x15, 0x3e, 0xaa,\n                                                        0x49, 0xc1, 0x5e, 0x1f, 0xd4, 0xb7, 0x15, 0xf7,\n                                                        0x22, 0xf7, 0x85, 0x5, 0x8d, 0x6, 0x8c, 0x72,\n                                                        0x8c, 0x67, 0x67, 0x1a, 0xfb, 0x13, 0x83, 0x3b,\n                                                        0x46, 0x64, 0x77, 0xa3, 0xb2, 0x81, 0x1e, 0xe,\n                                                        0x30, 0x7d, 0xcc, 0xf8, 0x2e, 0x77, 0xf7, 0x0,\n                                                        0x98, 0x1d, 0xcc, 0x53, 0xa, 0x3, 0x89, 0x1d,\n                                                        0x49, 0x89, 0xa, 0x8d, 0x28, 0xa, 0x5b, 0xf8,\n                                                        0x70, 0x26, 0xa, 0x30, 0x7d, 0xcc, 0xf8, 0x2e,\n                                                        0x77, 0xf7, 0x0, 0x98, 0x1d, 0xcc, 0x53, 0xa,\n                                                        0x3, 0x71, 0xa, 0x27, 0x1d, 0x6c, 0x7, 0xb4,\n                                                        0x84, 0x93, 0x7c, 0x38, 0xa, 0xfb, 0x2c, 0xf8,\n                                                        0x70, 0x28, 0x1d, 0x30, 0x7d, 0xcc, 0xf8, 0x2e,\n                                                        0x77, 0xf7, 0x0, 0x83, 0x1d, 0xcc, 0x53, 0xa,\n                                                        0x3, 0x2f, 0x1d, 0xfb, 0x84, 0xf8, 0x70, 0x29,\n                                                        0x1d, 0xe, 0x30, 0x7d, 0xcc, 0xf8, 0x7a, 0x9a,\n                                                        0x1d, 0xcc, 0xf7, 0x1f, 0x26, 0xf7, 0x13, 0xde,\n                                                        0xf7, 0x13, 0x29, 0xf7, 0x1f, 0x13, 0xe4, 0x2f,\n                                                        0x1d, 0x13, 0xd8, 0xfb, 0x84, 0xf8, 0xba, 0x15,\n                                                        0x6d, 0x1d, 0xf7, 0x66, 0x16, 0x6d, 0x1d, 0xe,\n                                                        0xfb, 0x61, 0xf7, 0x23, 0xf8, 0x9f, 0x77, 0xf7,\n                                                        0x0, 0x76, 0xf7, 0x4d, 0x77, 0x12, 0x9b, 0xf7,\n                                                        0xe, 0xfb, 0xe, 0xf8, 0x64, 0xfb, 0x2b, 0xf7,\n                                                        0x2b, 0x13, 0x8a, 0x13, 0x4, 0xf7, 0x80, 0x7e,\n                                                        0x15, 0x40, 0x72, 0x2f, 0xa, 0x5, 0x13, 0x72,\n                                                        0x9e, 0xbd, 0x9c, 0x8d, 0xa1, 0x8e, 0x8, 0x13,\n                                                        0x74, 0x4d, 0x1d, 0x13, 0xfa, 0x36, 0xa, 0xf7,\n                                                        0x4, 0xf7, 0x14, 0x28, 0x1d, 0x7c, 0xa, 0xf7,\n                                                        0x5f, 0x77, 0x1, 0xd6, 0xf7, 0x1f, 0xf7, 0x36,\n                                                        0xf7, 0x28, 0x3, 0x81, 0xa, 0x90, 0x1d, 0x6f,\n                                                        0x6a, 0xa0, 0xb3, 0x7b, 0x1e, 0x7a, 0x1d, 0x93,\n                                                        0xbe, 0x58, 0xa, 0x7c, 0x1f, 0x89, 0xf7, 0xad,\n                                                        0xfb, 0x56, 0x69, 0x6, 0xaf, 0x84, 0x9e, 0x87,\n                                                        0x5c, 0x1a, 0xfd, 0x4d, 0x92, 0xa, 0xfb, 0x61,\n                                                        0xf7, 0x23, 0xf8, 0xec, 0xf7, 0x15, 0x12, 0x9b,\n                                                        0xf7, 0x56, 0xfb, 0x15, 0xf7, 0x15, 0xdc, 0xf7,\n                                                        0x15, 0x13, 0xe8, 0xf7, 0x80, 0x7e, 0x15, 0x40,\n                                                        0x72, 0x2b, 0xa, 0x13, 0xd8, 0xa2, 0xf7, 0x5e,\n                                                        0x2d, 0x1d, 0x5d, 0xa, 0x1, 0xd0, 0x8a, 0xa,\n                                                        0x49, 0xa, 0xe, 0x9f, 0x8b, 0xaa, 0xf8, 0xf6,\n                                                        0x60, 0x1d, 0x38, 0x96, 0x1d, 0xf7, 0x59, 0x7,\n                                                        0xf7, 0xf, 0xd7, 0x5, 0xc8, 0x7, 0xfb, 0xf,\n                                                        0x3f, 0x5, 0xf7, 0x6a, 0x7, 0xc7, 0xaa, 0x9e,\n                                                        0xd1, 0x8e, 0x1e, 0xae, 0xfb, 0xf1, 0x68, 0x7,\n                                                        0xb8, 0x88, 0xb4, 0x7e, 0x49, 0x1a, 0xfb, 0xc9,\n                                                        0x7, 0x3a, 0x5a, 0x5, 0x4e, 0x7, 0xdc, 0xbc,\n                                                        0x5, 0x25, 0x7, 0x62, 0x6d, 0x87, 0x53, 0x8b,\n                                                        0xa, 0xfc, 0x5, 0x8b, 0xad, 0xf9, 0x16, 0x77,\n                                                        0x1, 0xce, 0x8a, 0xa, 0x9b, 0x16, 0x99, 0xa,\n                                                        0x64, 0x81, 0xaa, 0xa8, 0x1f, 0xf7, 0xd1, 0x7,\n                                                        0xec, 0xdb, 0x5, 0xbd, 0x7, 0x2a, 0x3b, 0x5,\n                                                        0xf7, 0x6b, 0x8d, 0xa, 0xfb, 0x68, 0x7, 0x32,\n                                                        0x43, 0x5, 0x59, 0x7, 0xe4, 0xd3, 0x5, 0xfb,\n                                                        0x78, 0x97, 0x1d, 0xf7, 0xf5, 0x8b, 0xa6, 0x70,\n                                                        0xae, 0x78, 0x76, 0xf7, 0xe6, 0xac, 0xf7, 0xa7,\n                                                        0xae, 0x73, 0xab, 0x12, 0xa1, 0xf7, 0x3e, 0xf7,\n                                                        0xac, 0xf7, 0x2f, 0x13, 0x97, 0xf8, 0x6c, 0xf7,\n                                                        0x68, 0x15, 0xfb, 0x14, 0x8b, 0x52, 0x21, 0x34,\n                                                        0x34, 0xa7, 0xf7, 0xa1, 0xf7, 0x9, 0x9f, 0xf7,\n                                                        0x67, 0xf7, 0x35, 0xee, 0x8b, 0x51, 0x30, 0x1e,\n                                                        0xf7, 0x2f, 0xfb, 0x3e, 0x15, 0xf7, 0xc, 0x93,\n                                                        0x46, 0x33, 0x98, 0x1f, 0xac, 0xf7, 0xe6, 0x6a,\n                                                        0x6, 0xfb, 0x2, 0x73, 0x8d, 0x65, 0xfb, 0xb,\n                                                        0x1b, 0xf7, 0x8d, 0x7, 0x13, 0x9b, 0xa3, 0x9b,\n                                                        0x8d, 0xc4, 0xf7, 0x43, 0x99, 0x42, 0x2e, 0x9a,\n                                                        0x1e, 0xaf, 0xf7, 0x5d, 0xfc, 0x30, 0x6, 0x13,\n                                                        0x37, 0x79, 0xfb, 0x4, 0x93, 0x79, 0x1b, 0xfb,\n                                                        0xc6, 0x57, 0xfb, 0x86, 0x2c, 0xfb, 0x79, 0xf7,\n                                                        0x19, 0xfb, 0xf, 0xf7, 0x5e, 0x1f, 0x13, 0x9b,\n                                                        0xc3, 0xa7, 0x90, 0xcf, 0x1b, 0xf8, 0x42, 0x6,\n                                                        0xb5, 0xf7, 0x67, 0x5, 0x70, 0x6, 0x13, 0x5b,\n                                                        0xfb, 0x33, 0x47, 0x2c, 0x7a, 0x2b, 0x1b, 0x47,\n                                                        0x8b, 0xa2, 0xa4, 0x1f, 0xe, 0xd6, 0x7d, 0xa9,\n                                                        0x6d, 0xd3, 0xf7, 0x4f, 0xb0, 0xf7, 0x36, 0xa8,\n                                                        0x12, 0xa1, 0xf7, 0x25, 0xf7, 0x1c, 0xf7, 0x1c,\n                                                        0xf7, 0x18, 0xf7, 0x11, 0x13, 0x7e, 0xf8, 0x50,\n                                                        0xf7, 0xae, 0x15, 0xe0, 0x8c, 0x8b, 0xd8, 0xc9,\n                                                        0x1b, 0xc4, 0x8f, 0x4e, 0x26, 0x8e, 0x1f, 0xfb,\n                                                        0x50, 0xfb, 0x8c, 0x15, 0x7a, 0x9a, 0xa5, 0x6c,\n                                                        0xda, 0x1b, 0xf6, 0xbe, 0xd4, 0xbd, 0xae, 0x1f,\n                                                        0x77, 0x9b, 0x5, 0x6a, 0x6e, 0x6e, 0x69, 0x4c,\n                                                        0x1b, 0xfb, 0x1, 0x87, 0xf7, 0xe, 0xcc, 0x8d,\n                                                        0x1f, 0xf7, 0x90, 0x6, 0xf7, 0xe, 0x89, 0x64,\n                                                        0xf5, 0xfb, 0x28, 0x1b, 0x4e, 0x5d, 0x6f, 0x76,\n                                                        0x70, 0x1f, 0x9b, 0x7b, 0x6a, 0xac, 0x38, 0x1b,\n                                                        0xfb, 0x19, 0x35, 0xfb, 0x2, 0xfb, 0x1c, 0xfb,\n                                                        0xd, 0xd9, 0xfb, 0xc, 0xf7, 0x21, 0xe2, 0xae,\n                                                        0xaa, 0x9c, 0x9f, 0x1f, 0x40, 0xf7, 0x7, 0x15,\n                                                        0x13, 0xbe, 0x4b, 0x7c, 0x46, 0x57, 0x5e, 0x6e,\n                                                        0x8b, 0xf7, 0x67, 0xf7, 0x3e, 0xa5, 0xba, 0xbb,\n                                                        0xc0, 0x99, 0x66, 0x2b, 0x1e, 0xe, 0x30, 0x78,\n                                                        0xac, 0xf8, 0x76, 0x76, 0xf7, 0x4d, 0xaa, 0xf7,\n                                                        0x73, 0x8e, 0xa, 0x17, 0x7c, 0x1d, 0x98, 0x94,\n                                                        0x1d, 0xc3, 0x1b, 0x13, 0xfc, 0x47, 0x1d, 0x13,\n                                                        0xbc, 0x85, 0xa, 0x80, 0x7d, 0x90, 0x91, 0x7b,\n                                                        0x1f, 0x95, 0x71, 0x68, 0x97, 0x5a, 0x46, 0x1d,\n                                                        0xf7, 0x59, 0xf8, 0x92, 0x35, 0xa, 0xfb, 0x96,\n                                                        0x7d, 0xad, 0x7f, 0x76, 0xf8, 0x59, 0xac, 0x12,\n                                                        0xa6, 0xef, 0xf7, 0x1e, 0xeb, 0x13, 0x78, 0xa4,\n                                                        0x7e, 0x15, 0xa4, 0x6, 0x9f, 0x95, 0x91, 0x93,\n                                                        0x96, 0x1b, 0x90, 0x9f, 0x82, 0x83, 0xa4, 0x1f,\n                                                        0x13, 0xb8, 0x85, 0x9f, 0xa4, 0x85, 0xa1, 0x1b,\n                                                        0xe8, 0xd5, 0xc6, 0xea, 0x1f, 0xf7, 0x38, 0xfb,\n                                                        0x7e, 0x74, 0xf1, 0x1a, 0xaa, 0xa2, 0xa5, 0xaf,\n                                                        0xc4, 0xbe, 0x60, 0x44, 0xa0, 0x1e, 0xa4, 0xf7,\n                                                        0x25, 0x75, 0x6, 0x83, 0x88, 0x87, 0x7f, 0x79,\n                                                        0x1b, 0x81, 0x7b, 0x91, 0x91, 0x77, 0x1f, 0x90,\n                                                        0x79, 0x76, 0x90, 0x75, 0x1b, 0x2f, 0x48, 0x50,\n                                                        0x33, 0x1f, 0xfb, 0x2e, 0xf7, 0x82, 0x91, 0x2f,\n                                                        0x1a, 0x6d, 0x76, 0x67, 0x59, 0xfb, 0x3, 0x73,\n                                                        0xf4, 0xa6, 0x85, 0x1e, 0x6f, 0x6, 0x13, 0x78,\n                                                        0xf7, 0xf, 0xf8, 0xc, 0x35, 0xa, 0xd6, 0x4e,\n                                                        0x1d, 0xd3, 0xf7, 0x15, 0x12, 0xf7, 0x68, 0xf7,\n                                                        0x15, 0x4c, 0xf7, 0x36, 0x79, 0xf7, 0x15, 0x13,\n                                                        0xe8, 0x69, 0x1d, 0x8d, 0xde, 0x1a, 0xf7, 0x42,\n                                                        0x7, 0xf7, 0x4b, 0xf7, 0xc1, 0x9f, 0xab, 0xb0,\n                                                        0x62, 0xa, 0xb0, 0x89, 0x64, 0x1a, 0xfb, 0x2a,\n                                                        0xfb, 0xa0, 0x5, 0x42, 0x1d, 0x13, 0xf4, 0xa6,\n                                                        0xf9, 0x9d, 0x2d, 0x1d, 0x8c, 0xa, 0xf7, 0x82,\n                                                        0x77, 0x1, 0xa7, 0xf8, 0xf2, 0x3, 0x39, 0xa,\n                                                        0xf7, 0x97, 0xf9, 0x66, 0x35, 0xa, 0x87, 0x1d,\n                                                        0xe3, 0x83, 0x1d, 0xb1, 0xa5, 0x87, 0xa, 0x6f,\n                                                        0x8e, 0x1d, 0x61, 0x8b, 0x62, 0x8c, 0xf7, 0x7b,\n                                                        0xf8, 0x27, 0x18, 0xa5, 0xfc, 0x7, 0x7, 0x84,\n                                                        0xfb, 0x22, 0x5, 0xa5, 0x6, 0xa5, 0xf7, 0x1,\n                                                        0xba, 0x8b, 0xf7, 0xa, 0x8c, 0xfb, 0x7e, 0xfc,\n                                                        0x25, 0x18, 0xf7, 0x2f, 0xf8, 0x88, 0x35, 0xa,\n                                                        0xfb, 0x1a, 0x76, 0xf8, 0xb9, 0xb9, 0xf7, 0x13,\n                                                        0xf7, 0x1f, 0x6d, 0xa9, 0x12, 0x8b, 0xf7, 0x0,\n                                                        0xd6, 0xf7, 0x1f, 0x13, 0xdc, 0xd5, 0xf8, 0x1e,\n                                                        0x15, 0xf7, 0x8, 0x6, 0x7e, 0xfc, 0x2a, 0x5,\n                                                        0x31, 0x88, 0x65, 0x74, 0x73, 0x1b, 0x7f, 0x81,\n                                                        0x93, 0x92, 0x1f, 0x98, 0x9d, 0x8d, 0xa5, 0x1a,\n                                                        0xad, 0x70, 0x9a, 0x70, 0x76, 0x6a, 0x7e, 0x5e,\n                                                        0x6a, 0xa0, 0x5f, 0xd3, 0x1e, 0x13, 0x54, 0xf7,\n                                                        0x1c, 0xc4, 0xf7, 0x23, 0xf7, 0x25, 0x9d, 0x1f,\n                                                        0x96, 0xe2, 0x8a, 0xc6, 0x93, 0xf7, 0x7, 0x8,\n                                                        0xf7, 0xe, 0xb9, 0xfb, 0xe, 0xe5, 0x6, 0xae,\n                                                        0x8b, 0xf7, 0x3, 0xcc, 0x9e, 0x8e, 0x7e, 0x89,\n                                                        0x1e, 0x85, 0x79, 0x77, 0x76, 0x1a, 0x13, 0xec,\n                                                        0x6f, 0xa5, 0x78, 0xa8, 0xa8, 0xa2, 0xa7, 0xab,\n                                                        0x1e, 0x13, 0x60, 0x9a, 0x7d, 0xcb, 0x2a, 0xfb,\n                                                        0x31, 0x73, 0xfb, 0x54, 0x41, 0x7f, 0x1e, 0xfb,\n                                                        0xc, 0x6, 0xe, 0xfb, 0xce, 0xf8, 0xb9, 0x83,\n                                                        0x1d, 0x89, 0xf8, 0xa4, 0x60, 0xa, 0xfb, 0xce,\n                                                        0xf8, 0xb9, 0x83, 0x1d, 0xf7, 0xc, 0xf8, 0xa4,\n                                                        0x52, 0xa, 0x51, 0x6, 0xfb, 0x3, 0x28, 0xfb,\n                                                        0x3, 0xee, 0x5, 0x52, 0x6, 0xe, 0xfb, 0xce,\n                                                        0xf8, 0xa4, 0xd7, 0x3f, 0xf7, 0x37, 0x12, 0x13,\n                                                        0x40, 0x9a, 0xf9, 0x47, 0x15, 0x21, 0xc5, 0x52,\n                                                        0xe8, 0xec, 0xc2, 0xca, 0xef, 0x1e, 0x5f, 0x6,\n                                                        0x13, 0x80, 0x6c, 0x83, 0x7c, 0x53, 0x37, 0x1b,\n                                                        0x13, 0x40, 0x30, 0x7f, 0xc6, 0xa7, 0x86, 0x1f,\n                                                        0xe, 0xfb, 0xce, 0xf8, 0xad, 0xf7, 0x16, 0x1,\n                                                        0xf2, 0xf7, 0x13, 0x3, 0xf2, 0xf8, 0xef, 0x15,\n                                                        0x66, 0xa6, 0x6e, 0xb0, 0xae, 0xa7, 0xa8, 0xb0,\n                                                        0xb0, 0x6f, 0xa6, 0x68, 0x67, 0x6f, 0x6f, 0x67,\n                                                        0x1e, 0xe, 0xfb, 0xce, 0xf8, 0xa3, 0xf7, 0x39,\n                                                        0xfb, 0x9, 0xf7, 0x9, 0xfb, 0x9, 0xf7, 0x39,\n                                                        0x12, 0xc7, 0xf7, 0x3a, 0xfb, 0x9, 0xf7, 0x9,\n                                                        0xfb, 0x9, 0xf7, 0x38, 0x13, 0x90, 0xc7, 0x94,\n                                                        0xa, 0x13, 0x24, 0xc5, 0xbb, 0xba, 0xc6, 0xc5,\n                                                        0x5c, 0xbc, 0x51, 0x1f, 0x13, 0x90, 0x51, 0x59,\n                                                        0x5b, 0x50, 0x1f, 0x13, 0x48, 0xbc, 0x16, 0x6b,\n                                                        0xa6, 0x71, 0xab, 0xab, 0xa5, 0xa5, 0xab, 0xab,\n                                                        0x71, 0xa6, 0x6b, 0x6b, 0x70, 0x70, 0x6b, 0x1e,\n                                                        0xe, 0xfb, 0xce, 0xfb, 0x41, 0xd0, 0xf7, 0x28,\n                                                        0x77, 0x1, 0xe5, 0xdf, 0x3, 0xf7, 0x31, 0xb7,\n                                                        0x15, 0x5b, 0x5f, 0x78, 0x5e, 0x5e, 0x1a, 0x46,\n                                                        0xd2, 0x7d, 0xb3, 0xad, 0xc9, 0xa6, 0xbb, 0xa1,\n                                                        0x1e, 0x75, 0xa1, 0x5, 0x7d, 0x75, 0x7e, 0x7d,\n                                                        0x74, 0x1b, 0x63, 0x72, 0x9d, 0xba, 0xa4, 0x98,\n                                                        0xb2, 0x8f, 0x9e, 0x1f, 0xe, 0xfb, 0xce, 0xf8,\n                                                        0xb7, 0xd9, 0x6e, 0xd9, 0x12, 0x13, 0x80, 0x7b,\n                                                        0xf8, 0xb7, 0x15, 0xb5, 0x6, 0x13, 0x40, 0x9d,\n                                                        0x8c, 0x9b, 0xaa, 0xab, 0x1b, 0xb5, 0xa4, 0x7b,\n                                                        0x7e, 0xa3, 0x1f, 0x80, 0x9e, 0x9d, 0x82, 0xa4,\n                                                        0x1b, 0x42, 0xa, 0x74, 0x74, 0x92, 0x94, 0x75,\n                                                        0x1f, 0x99, 0x68, 0x6c, 0x9e, 0x7a, 0x1b, 0x2f,\n                                                        0x78, 0x2f, 0x68, 0x84, 0x1f, 0xe, 0xfb, 0xce,\n                                                        0xf8, 0xa4, 0xf7, 0x4d, 0x1, 0x7e, 0xf8, 0xa4,\n                                                        0x15, 0xc0, 0x6, 0xf7, 0x25, 0x23, 0xa, 0xcc,\n                                                        0xfb, 0x31, 0x15, 0xc1, 0x22, 0xa, 0xe, 0xf7,\n                                                        0x49, 0xe5, 0x1, 0xf7, 0x49, 0x4, 0xf8, 0x88,\n                                                        0xca, 0xfc, 0x88, 0x6, 0xe, 0xf7, 0xf5, 0xf7,\n                                                        0x49, 0xe5, 0x1, 0xf7, 0x49, 0x4, 0xfa, 0x7c,\n                                                        0xc9, 0xfe, 0x7c, 0x6, 0xe, 0xfb, 0xce, 0xf8,\n                                                        0xd, 0x83, 0xa, 0xd1, 0xcf, 0x47, 0xf7, 0x4c,\n                                                        0x13, 0xd0, 0xf7, 0x8b, 0xf9, 0x31, 0x15, 0x5b,\n                                                        0xa, 0xa5, 0x4d, 0xd4, 0xb9, 0xb2, 0xa9, 0xbf,\n                                                        0xca, 0x5d, 0x9b, 0x6f, 0x1e, 0x13, 0xe0, 0x68,\n                                                        0xa, 0xe, 0xfb, 0xce, 0xf8, 0xd, 0x7b, 0xa,\n                                                        0xec, 0xf7, 0xf8, 0x15, 0x47, 0xa, 0xfb, 0xce,\n                                                        0xfb, 0x33, 0x7b, 0xa, 0xe1, 0xfb, 0x32, 0x15,\n                                                        0x96, 0x75, 0x5, 0x47, 0xa, 0xf7, 0xf8, 0xf7,\n                                                        0x35, 0xf7, 0x42, 0x77, 0x12, 0xab, 0xcf, 0x47,\n                                                        0xf7, 0x4c, 0xe1, 0xcf, 0x47, 0xf7, 0x4c, 0x13,\n                                                        0xd8, 0xf7, 0x65, 0xf9, 0x31, 0x15, 0x57, 0xa,\n                                                        0x13, 0xe4, 0x68, 0xa, 0xf7, 0xa2, 0x16, 0x57,\n                                                        0xa, 0x13, 0xe8, 0x68, 0xa, 0xe, 0xf8, 0xd,\n                                                        0x68, 0x1d, 0xf7, 0xc2, 0xf7, 0xf8, 0x15, 0x5f,\n                                                        0xa, 0x13, 0xe4, 0x3f, 0x1d, 0xfb, 0x97, 0x75,\n                                                        0x15, 0x5f, 0xa, 0x13, 0xd8, 0x3f, 0x1d, 0xe,\n                                                        0xfb, 0x33, 0x68, 0x1d, 0xf7, 0xb7, 0xfb, 0x32,\n                                                        0x15, 0x56, 0xa, 0x13, 0xe4, 0x3f, 0x1d, 0xfb,\n                                                        0xa2, 0x16, 0x56, 0xa, 0x13, 0xd8, 0x3f, 0x1d,\n                                                        0xe, 0xfb, 0x5, 0x76, 0xf8, 0xae, 0xf5, 0xf7,\n                                                        0x49, 0x77, 0x12, 0xf7, 0x56, 0xf7, 0x5, 0x46,\n                                                        0xa7, 0x13, 0xe8, 0xf7, 0x84, 0xfb, 0x1a, 0x15,\n                                                        0xa0, 0x6, 0x90, 0xf7, 0x2e, 0x90, 0xf7, 0x14,\n                                                        0xb4, 0xf6, 0x91, 0x98, 0x19, 0x8e, 0x91, 0x4d,\n                                                        0xa6, 0x8d, 0xf7, 0x25, 0x8, 0xa8, 0xa0, 0x83,\n                                                        0x83, 0x9d, 0x1f, 0x7f, 0xa4, 0x9f, 0x7d, 0xa7,\n                                                        0x1b, 0xaa, 0x9f, 0xa8, 0xa7, 0xa4, 0x7c, 0xa3,\n                                                        0x66, 0x71, 0x79, 0x7d, 0x7f, 0x6f, 0x1f, 0x7a,\n                                                        0x84, 0x76, 0x84, 0x6d, 0x87, 0x8a, 0xb3, 0x91,\n                                                        0xa4, 0x93, 0x9f, 0x8, 0x13, 0xf0, 0x99, 0xad,\n                                                        0x9e, 0x9b, 0xb1, 0x1a, 0xbb, 0x5f, 0x8f, 0x7e,\n                                                        0x61, 0x7d, 0x6a, 0x71, 0x67, 0xa0, 0x84, 0x98,\n                                                        0x62, 0x1e, 0x13, 0xe8, 0x91, 0x78, 0x8f, 0x72,\n                                                        0x65, 0x1a, 0x6d, 0x8d, 0x78, 0x92, 0x7b, 0x92,\n                                                        0x8, 0x98, 0x70, 0x7c, 0x9a, 0x6b, 0x1b, 0x66,\n                                                        0x7c, 0x72, 0x72, 0x6f, 0x9f, 0x6e, 0xaa, 0xae,\n                                                        0x96, 0x9a, 0x98, 0xa8, 0x1f, 0x9a, 0x92, 0x9f,\n                                                        0x91, 0xa9, 0x8d, 0x8, 0xfb, 0x26, 0x53, 0x72,\n                                                        0x8d, 0x85, 0x1e, 0x8e, 0x83, 0xb7, 0xfb, 0x5,\n                                                        0x8f, 0xfb, 0x14, 0x8, 0xe, 0xf7, 0x83, 0x8a,\n                                                        0x15, 0x87, 0x60, 0x63, 0x55, 0x63, 0x1a, 0x6b,\n                                                        0xa1, 0x6f, 0xac, 0xac, 0xa1, 0xa7, 0xab, 0xb3,\n                                                        0x63, 0xc1, 0x87, 0xb6, 0x1e, 0x67, 0x1d, 0x8e,\n                                                        0xad, 0xa0, 0xa9, 0xa7, 0x9e, 0x8, 0x5c, 0xaf,\n                                                        0x87, 0xb9, 0xbb, 0x1a, 0xbb, 0x8f, 0xb9, 0xba,\n                                                        0xaf, 0x1e, 0x6f, 0x9e, 0x76, 0xa9, 0x88, 0xad,\n                                                        0x8, 0x67, 0x1d, 0x8f, 0xb6, 0xb3, 0xc1, 0xb3,\n                                                        0x1a, 0xab, 0x75, 0xa7, 0x6a, 0x6a, 0x75, 0x6f,\n                                                        0x6b, 0x63, 0xb3, 0x55, 0x8f, 0x60, 0x1e, 0x67,\n                                                        0xa, 0x88, 0x69, 0x76, 0x6d, 0x6f, 0x78, 0x8,\n                                                        0xba, 0x67, 0x8f, 0x5d, 0x5b, 0x1a, 0x5b, 0x87,\n                                                        0x5d, 0x5c, 0x67, 0x1e, 0xa7, 0x78, 0xa0, 0x6d,\n                                                        0x8e, 0x69, 0x8, 0x67, 0xa, 0xe, 0xfb, 0xbd,\n                                                        0xf7, 0x6f, 0x76, 0xf7, 0xac, 0x77, 0x1, 0xae,\n                                                        0xf7, 0xe6, 0x15, 0x3c, 0xcb, 0x4e, 0xd7, 0xda,\n                                                        0xc8, 0xc8, 0xda, 0xd8, 0x4e, 0xca, 0x3c, 0x3f,\n                                                        0x4b, 0x4c, 0x3e, 0x1e, 0xe, 0xf7, 0xf5, 0x7e,\n                                                        0xf7, 0x3d, 0x1, 0xdd, 0xf7, 0x3d, 0xf7, 0x38,\n                                                        0xf7, 0x3d, 0xf7, 0x38, 0xf7, 0x3d, 0x14, 0x70,\n                                                        0xdd, 0xd4, 0x15, 0x4a, 0xa, 0xf7, 0xe1, 0x16,\n                                                        0x4a, 0xa, 0xf7, 0xe1, 0x16, 0x4a, 0xa, 0xe,\n                                                        0xf7, 0xf5, 0x7d, 0xa3, 0x87, 0x76, 0xf7, 0xe1,\n                                                        0xa3, 0x8a, 0x76, 0xb8, 0x76, 0xf7, 0xc8, 0xa3,\n                                                        0x8c, 0x77, 0x12, 0xa3, 0x97, 0xa, 0xa1, 0x97,\n                                                        0xa, 0xaf, 0x97, 0xa, 0x13, 0xad, 0xf8, 0xf7,\n                                                        0xec, 0xf7, 0x38, 0x15, 0x30, 0x1d, 0xf7, 0x70,\n                                                        0x16, 0x30, 0x1d, 0x13, 0x9d, 0xf8, 0xfd, 0x94,\n                                                        0xf7, 0xe2, 0x15, 0x30, 0x1d, 0x13, 0x6b, 0xf8,\n                                                        0x47, 0x76, 0x1d, 0xfb, 0xce, 0x82, 0xa, 0x1,\n                                                        0xbe, 0xf7, 0x75, 0x88, 0xa, 0x81, 0x95, 0x9b,\n                                                        0x7e, 0x96, 0x1b, 0x91, 0x90, 0x75, 0xa, 0x96,\n                                                        0x85, 0x8e, 0x85, 0x80, 0x79, 0x7e, 0x82, 0x81,\n                                                        0x1e, 0xfb, 0x5f, 0xfb, 0x38, 0x5, 0xe, 0xfb,\n                                                        0xce, 0x82, 0xa, 0x1, 0xf7, 0x26, 0x91, 0xa,\n                                                        0x80, 0x91, 0x88, 0x91, 0x96, 0x9d, 0x99, 0x93,\n                                                        0x95, 0x59, 0xa, 0x95, 0x81, 0x7b, 0x98, 0x80,\n                                                        0x1b, 0x84, 0x87, 0x86, 0x7e, 0x6d, 0xe6, 0x25,\n                                                        0xa6, 0x62, 0x1f, 0xe, 0xfc, 0x74, 0x94, 0x76,\n                                                        0xf9, 0x50, 0x77, 0x1, 0xfb, 0x2, 0x7f, 0x15,\n                                                        0xf8, 0x4b, 0xf9, 0x50, 0x5, 0x53, 0x6, 0xfc,\n                                                        0x4d, 0xfd, 0x50, 0x5, 0xe, 0xd6, 0x8b, 0xe7,\n                                                        0xf7, 0x3e, 0xb3, 0xe4, 0xb3, 0xe3, 0x76, 0xf7,\n                                                        0x34, 0xab, 0x1, 0xf6, 0xf7, 0x3b, 0x3, 0x94,\n                                                        0xf7, 0x9a, 0x15, 0xed, 0x6, 0xfb, 0x2a, 0x9a,\n                                                        0xf7, 0x31, 0xfb, 0x4, 0xf7, 0x15, 0x1b, 0xf7,\n                                                        0xb, 0xf3, 0xc0, 0xe2, 0xc5, 0x1f, 0x77, 0x95,\n                                                        0x5, 0x64, 0x51, 0x4c, 0x78, 0x51, 0x1b, 0xfb,\n                                                        0x6, 0x2c, 0xca, 0xf6, 0x84, 0x1f, 0xf7, 0xb8,\n                                                        0x6, 0x99, 0xb3, 0x5, 0xfb, 0xc7, 0x6, 0x8a,\n                                                        0x9c, 0x8a, 0x9a, 0x9a, 0x1a, 0x99, 0x8b, 0x98,\n                                                        0x8d, 0x9a, 0x1e, 0xf7, 0xd9, 0x6, 0x9a, 0xb3,\n                                                        0x5, 0xfb, 0xe3, 0x6, 0xf7, 0x20, 0x98, 0xc0,\n                                                        0xe2, 0xf5, 0x1b, 0xf7, 0x11, 0xc8, 0x4a, 0x2c,\n                                                        0x96, 0x1f, 0xa5, 0xf7, 0x26, 0x6, 0xa4, 0x49,\n                                                        0x4b, 0xa0, 0x23, 0x1b, 0xfb, 0x18, 0xfb, 0x1a,\n                                                        0x75, 0xfb, 0x81, 0x4d, 0x1f, 0x34, 0x6, 0x7c,\n                                                        0x63, 0x5, 0xeb, 0x6, 0x8a, 0x7d, 0x8a, 0x7c,\n                                                        0x7d, 0x1a, 0x7c, 0x8b, 0x7c, 0x8c, 0x7b, 0x1e,\n                                                        0x3b, 0x6, 0xe, 0xf7, 0xf5, 0xf7, 0xa4, 0xac,\n                                                        0x7e, 0x76, 0xf8, 0x8, 0xac, 0x73, 0xa3, 0x12,\n                                                        0xf7, 0x32, 0xe8, 0xf7, 0x8a, 0xa8, 0xf7, 0xc4,\n                                                        0xe8, 0x13, 0x9e, 0xf7, 0x0, 0xf7, 0xa4, 0x15,\n                                                        0xf7, 0x56, 0xac, 0x6, 0x57, 0x8f, 0x8c, 0x8f,\n                                                        0xb3, 0x1a, 0xf7, 0xbf, 0xb9, 0x7, 0xb3, 0x9d,\n                                                        0x6e, 0x68, 0x93, 0x1f, 0xa2, 0xe3, 0xfb, 0xfe,\n                                                        0x33, 0xa2, 0x6, 0xae, 0x93, 0x9c, 0xa8, 0xb3,\n                                                        0x1b, 0xb9, 0xfb, 0xbf, 0x6, 0x63, 0x8c, 0x87,\n                                                        0x58, 0x87, 0x1e, 0xf7, 0xe5, 0x6a, 0x15, 0xf7,\n                                                        0x19, 0xac, 0x6, 0x5c, 0x8e, 0x86, 0x91, 0xbd,\n                                                        0x1a, 0xf7, 0x5b, 0x8d, 0x7, 0x13, 0x6e, 0xf7,\n                                                        0x20, 0xfb, 0xb8, 0x5, 0x98, 0x6, 0xf7, 0x27,\n                                                        0xf7, 0xba, 0x5, 0x8d, 0xfb, 0x68, 0x6, 0x13,\n                                                        0xae, 0x63, 0x8d, 0x87, 0x57, 0x87, 0x1e, 0x6a,\n                                                        0xf7, 0x56, 0xac, 0x7, 0x57, 0x8f, 0x8c, 0x8f,\n                                                        0xb3, 0x1a, 0xf7, 0x86, 0x7, 0xab, 0x92, 0x99,\n                                                        0xba, 0x8d, 0x1e, 0xac, 0xfb, 0xa, 0x7, 0xfb,\n                                                        0x2b, 0xfb, 0xb5, 0xfb, 0x22, 0xf7, 0xb5, 0x5,\n                                                        0xfb, 0x1f, 0x6a, 0x6, 0xa8, 0xa6, 0x81, 0x6b,\n                                                        0x99, 0x1f, 0xfb, 0x81, 0x7, 0x59, 0x86, 0x85,\n                                                        0x5c, 0x88, 0x1e, 0xe, 0x3e, 0xf7, 0x65, 0xcb,\n                                                        0x1, 0xac, 0xf7, 0x65, 0x15, 0xf8, 0x8c, 0xcb,\n                                                        0xfc, 0x8c, 0x6, 0xe, 0x30, 0x8b, 0xad, 0xf8,\n                                                        0x13, 0xb7, 0xf7, 0x5c, 0xa9, 0x12, 0xd2, 0xf7,\n                                                        0x1f, 0xf7, 0x1e, 0xf7, 0x10, 0xfb, 0x10, 0xf7,\n                                                        0x1f, 0x13, 0xf8, 0x75, 0x1d, 0xf3, 0x7, 0xa9,\n                                                        0x8f, 0x7e, 0x76, 0x1f, 0xfb, 0xb8, 0x7, 0x73,\n                                                        0x8a, 0x6e, 0x5d, 0x87, 0x6a, 0xa, 0x13, 0xf4,\n                                                        0x65, 0x8c, 0x80, 0x9f, 0xaf, 0x1a, 0xf8, 0x12,\n                                                        0x7, 0x86, 0x56, 0x49, 0x84, 0x57, 0x1b, 0x21,\n                                                        0x6, 0xf7, 0x15, 0x88, 0xd2, 0xe0, 0xb7, 0x9b,\n                                                        0x78, 0x82, 0x1e, 0x87, 0x82, 0x7f, 0x73, 0x1a,\n                                                        0x5c, 0xbc, 0x84, 0x99, 0x1e, 0x13, 0xf8, 0x90,\n                                                        0xc8, 0x8c, 0xc7, 0xdf, 0xfb, 0x3a, 0x92, 0x7d,\n                                                        0xfb, 0x6c, 0x87, 0xfb, 0x38, 0x49, 0x8a, 0x7a,\n                                                        0xa, 0xe, 0x30, 0xa0, 0x76, 0xf8, 0x35, 0xb7,\n                                                        0xf7, 0x59, 0xac, 0x8a, 0x77, 0x12, 0xd2, 0x53,\n                                                        0xa, 0x13, 0xdc, 0x75, 0x1d, 0xf7, 0x1e, 0xfb,\n                                                        0xda, 0x7, 0x78, 0x8a, 0x6b, 0x5d, 0x85, 0x6a,\n                                                        0xa, 0x59, 0x8f, 0x8c, 0xb6, 0x95, 0x1a, 0xf8,\n                                                        0xeb, 0x78, 0x7, 0x5c, 0x6d, 0x5, 0x13, 0xec,\n                                                        0xaa, 0x47, 0x4e, 0x8b, 0x87, 0x1b, 0xfb, 0x52,\n                                                        0x72, 0xfb, 0x1a, 0x2b, 0x89, 0x7a, 0xa, 0xf7,\n                                                        0x58, 0xf8, 0x3f, 0x15, 0xc9, 0x7, 0xc6, 0x87,\n                                                        0xd7, 0xdd, 0xae, 0x9c, 0x84, 0x7b, 0x1e, 0x83,\n                                                        0x7e, 0x79, 0x7d, 0x1a, 0x78, 0x97, 0x7c, 0x94,\n                                                        0x89, 0x1e, 0x29, 0x7, 0xe, 0x78, 0x9e, 0xf8,\n                                                        0x61, 0x97, 0xf7, 0x5f, 0x9a, 0x6, 0xf7, 0xa0,\n                                                        0x92, 0x7, 0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc,\n                                                        0x9, 0xb5, 0xa, 0xf7, 0x1d, 0xb, 0x8c, 0xc,\n                                                        0xe, 0xf8, 0x88, 0x14, 0xf9, 0x1b, 0x15, 0xaf,\n                                                        0x13, 0x0, 0x7a, 0x2, 0x0, 0x1, 0x0, 0x2d,\n                                                        0x0, 0x6e, 0x0, 0x74, 0x0, 0x81, 0x0, 0x86,\n                                                        0x0, 0xb2, 0x0, 0xb5, 0x0, 0xcf, 0x0, 0xd4,\n                                                        0x0, 0xe3, 0x0, 0xec, 0x0, 0xfa, 0x1, 0x3,\n                                                        0x1, 0xf, 0x1, 0x1a, 0x1, 0x40, 0x1, 0x58,\n                                                        0x1, 0x66, 0x1, 0x6e, 0x1, 0x73, 0x1, 0x84,\n                                                        0x1, 0x92, 0x1, 0xa5, 0x1, 0xdc, 0x1, 0xec,\n                                                        0x2, 0x21, 0x2, 0x2c, 0x2, 0x38, 0x2, 0x46,\n                                                        0x2, 0x4f, 0x2, 0x5f, 0x2, 0x88, 0x2, 0xb0,\n                                                        0x2, 0xbf, 0x2, 0xc4, 0x2, 0xcd, 0x2, 0xd6,\n                                                        0x2, 0xe0, 0x2, 0xf4, 0x2, 0xfb, 0x3, 0x9,\n                                                        0x3, 0xe, 0x3, 0x20, 0x3, 0x28, 0x3, 0x3b,\n                                                        0x3, 0x47, 0x3, 0x4c, 0x3, 0x58, 0x3, 0x60,\n                                                        0x3, 0x6f, 0x3, 0x78, 0x3, 0x7f, 0x3, 0x85,\n                                                        0x3, 0x9f, 0x3, 0xac, 0x3, 0xbb, 0x3, 0xd4,\n                                                        0x3, 0xe2, 0x3, 0xe7, 0x3, 0xf4, 0x3, 0xf9,\n                                                        0x4, 0x1, 0x4, 0x8, 0x4, 0x12, 0x4, 0x1a,\n                                                        0x4, 0x1e, 0x4, 0x27, 0x4, 0x30, 0x4, 0x36,\n                                                        0x4, 0x3c, 0x4, 0x47, 0x4, 0x5b, 0x4, 0x66,\n                                                        0x4, 0x71, 0x4, 0x78, 0x4, 0x7f, 0x4, 0x91,\n                                                        0x4, 0x9a, 0x4, 0xac, 0x4, 0xb2, 0x4, 0xb8,\n                                                        0x4, 0xc1, 0x4, 0xcb, 0x4, 0xdb, 0x4, 0xdf,\n                                                        0x4, 0xe8, 0x4, 0xf1, 0x4, 0xf6, 0x4, 0xfb,\n                                                        0x5, 0x9, 0x5, 0x17, 0x5, 0x1f, 0x5, 0x2c,\n                                                        0x5, 0x39, 0x5, 0x3e, 0x5, 0x42, 0x5, 0x4e,\n                                                        0x5, 0x5a, 0x5, 0x60, 0x5, 0x66, 0x5, 0x71,\n                                                        0x5, 0x7c, 0x5, 0x87, 0x5, 0x92, 0x5, 0x99,\n                                                        0x5, 0x9e, 0x5, 0xa2, 0x5, 0xa5, 0x5, 0xaf,\n                                                        0x5, 0xb9, 0x5, 0xc3, 0x5, 0xcd, 0x5, 0xd4,\n                                                        0x5, 0xde, 0x5, 0xe5, 0x5, 0xee, 0x5, 0xf7,\n                                                        0x6, 0x0, 0x6, 0x9, 0x6, 0xf, 0x6, 0x14,\n                                                        0x6, 0x19, 0x9b, 0x9b, 0xaa, 0xa7, 0xd3, 0x1e,\n                                                        0xf7, 0x75, 0x6, 0x99, 0x6b, 0xab, 0x4b, 0x70,\n                                                        0x1a, 0x6a, 0x79, 0x8a, 0x4d, 0x86, 0x1e, 0x68,\n                                                        0xf7, 0xd8, 0xae, 0x7, 0x5b, 0x89, 0x87, 0x95,\n                                                        0x7e, 0xaa, 0xfb, 0x9f, 0xf8, 0xfc, 0x18, 0x6f,\n                                                        0x6, 0xfb, 0x8f, 0xfc, 0xf8, 0xb, 0x15, 0xc3,\n                                                        0x85, 0xa5, 0x96, 0x37, 0x1a, 0xfb, 0xe5, 0x7,\n                                                        0xfb, 0x4d, 0xf7, 0x30, 0x50, 0xf7, 0x1c, 0xf7,\n                                                        0x36, 0xd2, 0xdd, 0xf7, 0x36, 0x1e, 0xf7, 0xe5,\n                                                        0x7, 0xcd, 0xa2, 0x90, 0x43, 0xa, 0x7d, 0x4e,\n                                                        0x1a, 0xfb, 0xe5, 0x7, 0x4b, 0x7e, 0xfb, 0x17,\n                                                        0xfb, 0x44, 0xfb, 0x24, 0x96, 0xf7, 0x1e, 0xc4,\n                                                        0x1e, 0xf7, 0xe5, 0x7, 0xe3, 0xaa, 0x7f, 0xcd,\n                                                        0x8e, 0x1e, 0xae, 0xfb, 0xe6, 0x7, 0xb, 0x6,\n                                                        0xf7, 0x22, 0x23, 0xa, 0xb, 0xe3, 0x5, 0xa3,\n                                                        0x9a, 0x9b, 0x95, 0xa7, 0x1a, 0xaf, 0x6c, 0x2c,\n                                                        0xa, 0xb, 0x44, 0x1d, 0x26, 0x1d, 0xb, 0xf7,\n                                                        0x40, 0xf7, 0x79, 0x78, 0x1d, 0xee, 0xd5, 0xc8,\n                                                        0x9c, 0x50, 0x64, 0xa, 0x36, 0x46, 0x3b, 0x8b,\n                                                        0xf3, 0xf7, 0x0, 0x1e, 0xfb, 0x27, 0x16, 0xfb,\n                                                        0x16, 0xe2, 0xfb, 0x5, 0x70, 0xa, 0xf7, 0x2,\n                                                        0x6f, 0xa, 0xf4, 0x70, 0x1d, 0xfb, 0x7, 0xfb,\n                                                        0x15, 0x1e, 0xb, 0x24, 0x1d, 0xe, 0x1, 0xf7,\n                                                        0x5, 0x7f, 0x1d, 0x9f, 0x16, 0xf7, 0xf2, 0xae,\n                                                        0x6, 0x34, 0x1d, 0xfb, 0xf2, 0x68, 0x7, 0x4b,\n                                                        0xa, 0x4d, 0x64, 0x87, 0x55, 0x86, 0x1e, 0xb,\n                                                        0x6b, 0x1d, 0x25, 0x1d, 0xb, 0x56, 0x1d, 0xfb,\n                                                        0x1d, 0xf7, 0x31, 0x5, 0x98, 0x80, 0x77, 0x9a,\n                                                        0x76, 0x1b, 0x65, 0xb, 0x23, 0x1d, 0xa1, 0x81,\n                                                        0x97, 0x83, 0x95, 0x1e, 0xb, 0x2f, 0xa, 0x9e,\n                                                        0xbd, 0x9c, 0x8d, 0xa1, 0x8e, 0x19, 0x4d, 0x1d,\n                                                        0x36, 0xa, 0xb, 0x93, 0x79, 0x81, 0x78, 0x89,\n                                                        0x71, 0x74, 0x1e, 0xb, 0x2c, 0x1d, 0xfb, 0xa9,\n                                                        0x7, 0x5b, 0x7a, 0x8b, 0x67, 0x82, 0x1e, 0xb,\n                                                        0x5, 0xc4, 0x6, 0xfb, 0xf, 0xf7, 0x44, 0x5,\n                                                        0x2f, 0x6, 0xb, 0x72, 0x4f, 0x69, 0x1b, 0x7f,\n                                                        0x86, 0x97, 0x90, 0x1f, 0x8f, 0x8e, 0x90, 0x94,\n                                                        0x1a, 0x9d, 0x80, 0xac, 0x5e, 0x4f, 0x85, 0x58,\n                                                        0x7d, 0x6b, 0xa6, 0x5d, 0xcc, 0xe9, 0xa0, 0xc4,\n                                                        0xf7, 0x19, 0xbd, 0x1e, 0xf7, 0x29, 0xf8, 0x17,\n                                                        0xb, 0x48, 0xa, 0xfb, 0x44, 0x78, 0xa, 0xfb,\n                                                        0x7f, 0x3c, 0x1d, 0xf7, 0x25, 0x5e, 0xa, 0xf7,\n                                                        0x1d, 0x5e, 0x1d, 0xfb, 0x1d, 0xfb, 0x6e, 0x1e,\n                                                        0xb, 0x7c, 0xa0, 0x5, 0x6c, 0x6c, 0x80, 0xb1,\n                                                        0x8f, 0x1a, 0xf7, 0x99, 0x7, 0xe9, 0xb, 0x77,\n                                                        0x1, 0x5d, 0x1d, 0x3, 0x25, 0xa, 0xb, 0x99,\n                                                        0xa, 0x2d, 0xa, 0xb, 0xfb, 0x7, 0x30, 0x2d,\n                                                        0xfb, 0x28, 0xfb, 0x3f, 0xf1, 0x41, 0xf0, 0xdb,\n                                                        0xc4, 0xab, 0xe8, 0xc8, 0xb, 0x52, 0xa, 0x52,\n                                                        0x6, 0xfb, 0x4, 0x28, 0xfb, 0x4, 0xee, 0x5,\n                                                        0x53, 0x6, 0xe, 0x3c, 0xfb, 0x77, 0x5, 0x3a,\n                                                        0xf7, 0x63, 0x80, 0x9b, 0x95, 0x1a, 0xa3, 0xa6,\n                                                        0x8c, 0xa5, 0x8d, 0x48, 0x1d, 0xb, 0xf8, 0x51,\n                                                        0xfc, 0xb2, 0x5, 0xa7, 0xf8, 0xce, 0x6, 0xbb,\n                                                        0x91, 0xab, 0xd3, 0x94, 0x1e, 0xae, 0xfb, 0x6b,\n                                                        0x68, 0x7, 0xdc, 0x85, 0x97, 0x74, 0x4f, 0x1a,\n                                                        0xfb, 0xc3, 0x89, 0x7, 0xfb, 0xef, 0xf8, 0x3f,\n                                                        0x5, 0xfb, 0x67, 0x72, 0x6, 0x98, 0x9b, 0x88,\n                                                        0x46, 0xc3, 0x1f, 0xfc, 0x64, 0x7, 0x49, 0x6f,\n                                                        0x84, 0x4f, 0x84, 0x1e, 0xb, 0x63, 0x1a, 0xfb,\n                                                        0x8a, 0x7, 0x44, 0xad, 0x4a, 0xf1, 0xce, 0xb9,\n                                                        0xb4, 0xa4, 0xa8, 0x1e, 0xb, 0xa7, 0x16, 0xf8,\n                                                        0xd8, 0x6, 0xa5, 0xf7, 0x85, 0x5, 0x67, 0x6,\n                                                        0x57, 0xfb, 0x66, 0x29, 0x8c, 0xfb, 0x73, 0x8e,\n                                                        0xf8, 0xf, 0xf9, 0x5, 0x18, 0x9b, 0xfc, 0xa0,\n                                                        0x7, 0x76, 0xfb, 0x62, 0x5, 0xb1, 0x6, 0x9d,\n                                                        0xbe, 0x9d, 0xdd, 0xd6, 0xa2, 0xac, 0x95, 0x8b,\n                                                        0x8b, 0xf7, 0x3d, 0x90, 0xfc, 0x12, 0xfd, 0x5,\n                                                        0x18, 0xb, 0xf7, 0x5f, 0xae, 0x6, 0x69, 0x8d,\n                                                        0x5b, 0x8e, 0xb1, 0x1a, 0xb, 0x9b, 0xb6, 0x9f,\n                                                        0xaf, 0xd5, 0x85, 0x55, 0x58, 0x1e, 0x53, 0x7,\n                                                        0xb, 0xf8, 0xdd, 0x6, 0xb3, 0xf7, 0x64, 0x5,\n                                                        0x6f, 0x6, 0xfb, 0x2b, 0x4c, 0x25, 0xb, 0xcc,\n                                                        0xf7, 0x12, 0x1a, 0xbf, 0x6e, 0xc9, 0x42, 0xb,\n                                                        0x5d, 0xa, 0xf7, 0x0, 0x98, 0x1d, 0xd0, 0x8a,\n                                                        0xa, 0x9b, 0x16, 0x99, 0xa, 0x2c, 0x1d, 0xb,\n                                                        0xf8, 0xee, 0x15, 0x72, 0x9f, 0x63, 0xb6, 0xb0,\n                                                        0xa6, 0xa8, 0xae, 0xaf, 0x6e, 0xa9, 0x68, 0x61,\n                                                        0x76, 0x63, 0x72, 0x1e, 0xf7, 0x66, 0x16, 0x72,\n                                                        0x9e, 0x63, 0xb6, 0xb0, 0xa7, 0xa8, 0xae, 0xaf,\n                                                        0x6d, 0xa9, 0x68, 0x61, 0x77, 0x63, 0x72, 0x1e,\n                                                        0xb, 0x15, 0xbc, 0x7b, 0xdc, 0x72, 0x3b, 0x1a,\n                                                        0x5b, 0x6a, 0x7a, 0x6b, 0x76, 0x7c, 0x9b, 0x9a,\n                                                        0x7a, 0x1e, 0x99, 0x7b, 0x78, 0x99, 0x71, 0x1b,\n                                                        0x76, 0x85, 0x78, 0x7d, 0x77, 0x1a, 0x55, 0xe4,\n                                                        0x8a, 0x94, 0xf7, 0x9, 0xda, 0xd4, 0xdf, 0xb8,\n                                                        0xb, 0x16, 0xf7, 0x85, 0xad, 0x6, 0x59, 0x1d,\n                                                        0xc1, 0x8c, 0x54, 0x6f, 0x1e, 0x4f, 0xa, 0xb,\n                                                        0x44, 0xa, 0x54, 0x1d, 0xb, 0xc2, 0x93, 0x1e,\n                                                        0x5b, 0x1d, 0xe1, 0x87, 0x97, 0xb, 0xe4, 0xa2,\n                                                        0xe7, 0xae, 0x94, 0x1f, 0x60, 0x6, 0xb, 0xe2,\n                                                        0x1e, 0xfb, 0x45, 0x16, 0xfb, 0x66, 0xf7, 0x29,\n                                                        0xb, 0x80, 0x7, 0xfb, 0x38, 0x4a, 0x5, 0x76,\n                                                        0x7, 0x93, 0xa1, 0xa1, 0x92, 0x95, 0x1b, 0xa4,\n                                                        0x8b, 0x71, 0x7c, 0x1f, 0xb, 0x5f, 0xa, 0x13,\n                                                        0xd0, 0x3f, 0x1d, 0xe, 0xf7, 0x45, 0x3, 0xf7,\n                                                        0x68, 0xf7, 0xe4, 0x79, 0x1d, 0xf7, 0x44, 0x66,\n                                                        0x1d, 0xb, 0x9b, 0x16, 0x33, 0xa, 0xb, 0x5c,\n                                                        0xaf, 0x64, 0xbb, 0xba, 0xb1, 0xb1, 0xbb, 0xb9,\n                                                        0x65, 0xb0, 0x5c, 0x5b, 0x67, 0x65, 0x5e, 0x1e,\n                                                        0xb, 0xb9, 0x88, 0xba, 0x89, 0x49, 0x7e, 0xa,\n                                                        0xb, 0x59, 0xa, 0x94, 0x81, 0x7b, 0x99, 0x80,\n                                                        0x1b, 0x85, 0x86, 0x87, 0x7d, 0x6d, 0xe6, 0x25,\n                                                        0xa6, 0x62, 0x1f, 0xb, 0xf7, 0x38, 0xf7, 0xae,\n                                                        0x15, 0xf7, 0x1e, 0xad, 0xa1, 0xb0, 0xdb, 0xb,\n                                                        0x56, 0x1d, 0xf7, 0x4, 0xb, 0xfb, 0x7c, 0x7,\n                                                        0x66, 0x7d, 0x7a, 0x6a, 0x88, 0x6a, 0xa, 0x5a,\n                                                        0xb, 0x76, 0xf7, 0xbb, 0xf7, 0x54, 0x6b, 0xab,\n                                                        0xb, 0x9f, 0x8b, 0xaa, 0xf7, 0xbe, 0xad, 0xf7,\n                                                        0x19, 0x76, 0xc5, 0x76, 0xf7, 0x16, 0xad, 0xb,\n                                                        0x15, 0xe7, 0x6, 0xf7, 0xf, 0xf7, 0x44, 0x5,\n                                                        0xb, 0xf7, 0x1f, 0xf7, 0x1e, 0xf7, 0x1f, 0xb,\n                                                        0x8a, 0x1d, 0xf7, 0x36, 0xb2, 0xb, 0xfb, 0x5a,\n                                                        0xfb, 0x5a, 0xfb, 0x2a, 0xfb, 0x31, 0xfb, 0x5b,\n                                                        0x1e, 0xd2, 0x16, 0xf7, 0x39, 0xf7, 0xc, 0xf7,\n                                                        0x1f, 0xf7, 0x31, 0xf7, 0x31, 0xf7, 0xb, 0xb,\n                                                        0x96, 0x75, 0x5, 0x43, 0x1d, 0x6e, 0x57, 0x4c,\n                                                        0xb9, 0x7a, 0xa7, 0x1e, 0xb, 0x5b, 0xa, 0xa8,\n                                                        0x4d, 0xd4, 0xb9, 0xaf, 0xa9, 0xbf, 0xca, 0x5d,\n                                                        0x9b, 0x6f, 0x1e, 0xb, 0x1a, 0xf7, 0x34, 0x7,\n                                                        0x6a, 0xad, 0xa7, 0x70, 0xc3, 0x1b, 0xf1, 0xe5,\n                                                        0xdc, 0xf7, 0x39, 0xf7, 0x36, 0x28, 0xd9, 0x37,\n                                                        0x3b, 0x6d, 0x5e, 0x6a, 0xb, 0x1e, 0xf7, 0x5f,\n                                                        0xf7, 0x38, 0x5, 0x8f, 0x7, 0xfb, 0x62, 0xf7,\n                                                        0x3a, 0x5, 0xb, 0x1, 0x5c, 0x1d, 0x3, 0xb,\n                                                        0x80, 0xa1, 0x5, 0x56, 0x6d, 0xfb, 0x5, 0x4a,\n                                                        0xfb, 0x12, 0x1a, 0x57, 0xb, 0xfb, 0x96, 0x4e,\n                                                        0x1d, 0xb, 0xfc, 0x5, 0xa0, 0x76, 0xf8, 0x61,\n                                                        0x77, 0xb, 0xf7, 0x66, 0xf7, 0x6e, 0xfb, 0x35,\n                                                        0xb, 0x43, 0x1d, 0x6d, 0x57, 0x4c, 0xb9, 0x7b,\n                                                        0xa7, 0x1e, 0xb, 0x4e, 0xa, 0xf1, 0xf7, 0x4,\n                                                        0x25, 0x7e, 0x1d, 0xa8, 0x67, 0x67, 0xb, 0x8f,\n                                                        0x9e, 0x8e, 0x19, 0x5b, 0x1d, 0xba, 0x88, 0xb,\n                                                        0x1, 0xed, 0xf7, 0x33, 0xf7, 0xd6, 0xb7, 0x3,\n                                                        0xb, 0xfb, 0x2e, 0xfb, 0x13, 0x83, 0xb, 0x7d,\n                                                        0xaa, 0xf8, 0x3d, 0xaa, 0xb, 0x7, 0xf7, 0x53,\n                                                        0xf7, 0xc1, 0x9f, 0xab, 0xa8, 0x62, 0xa, 0xb,\n                                                        0x5d, 0x62, 0xb3, 0x5c, 0x1b, 0x72, 0x71, 0x74,\n                                                        0x70, 0x70, 0xa5, 0x74, 0xa4, 0x1f, 0xba, 0xb4,\n                                                        0xb3, 0xb9, 0x1b, 0xb, 0x77, 0x75, 0x84, 0xa6,\n                                                        0xc3, 0xdc, 0xc4, 0xa7, 0x9e, 0x1f, 0xb, 0x15,\n                                                        0xc5, 0x6, 0xf8, 0x4b, 0xf9, 0x50, 0x5, 0x53,\n                                                        0x6, 0xb, 0x1e, 0x69, 0xf7, 0x7f, 0xad, 0x7,\n                                                        0xb, 0xd6, 0x78, 0xbc, 0xf8, 0xf7, 0xae, 0xb,\n                                                        0x6f, 0xa1, 0x75, 0xa7, 0xa7, 0xa1, 0xa1, 0xa7,\n                                                        0xa7, 0x75, 0xa1, 0x6f, 0x6f, 0x75, 0x75, 0x6f,\n                                                        0x1e, 0xb, 0x67, 0xa7, 0x81, 0x1d, 0x6f, 0x6e,\n                                                        0x67, 0x1e, 0xb, 0xb4, 0x6, 0x9c, 0xd3, 0xa6,\n                                                        0xf7, 0xc, 0xa2, 0x1a, 0xb6, 0x72, 0xa8, 0x63,\n                                                        0x63, 0x73, 0x6e, 0x60, 0xb, 0xf7, 0x19, 0xf7,\n                                                        0x1f, 0x2d, 0xb, 0xf7, 0x1f, 0xf7, 0x1c, 0xe4,\n                                                        0xb, 0x89, 0x1d, 0x4a, 0x89, 0xa, 0x8c, 0x6b,\n                                                        0x1d, 0xb, 0x77, 0x1, 0xf3, 0xf7, 0x36, 0xf7,\n                                                        0x2c, 0xaf, 0x3, 0xb, 0x8, 0xa6, 0x8c, 0x15,\n                                                        0xf7, 0x19, 0xf7, 0x3e, 0x5, 0x8d, 0xfb, 0x40,\n                                                        0xfb, 0x1b, 0x6, 0xb, 0x6e, 0xaf, 0xaf, 0xb,\n                                                        0x90, 0x98, 0x77, 0x1d, 0xe3, 0xf6, 0xa8, 0x1a,\n                                                        0xb, 0xf7, 0x7c, 0x7, 0xf7, 0x2, 0x3c, 0xb3,\n                                                        0x54, 0xb, 0xf7, 0x4c, 0x47, 0xcf, 0xb, 0xfb,\n                                                        0x26, 0x34, 0x85, 0xb, 0x66, 0x15, 0xf7, 0x90,\n                                                        0x6, 0xc1, 0x88, 0x7e, 0xf7, 0x42, 0xfb, 0x42,\n                                                        0x1b, 0xb, 0x1f, 0x52, 0x5f, 0xc4, 0xfb, 0xd7,\n                                                        0x6, 0x57, 0x76, 0x88, 0x67, 0x86, 0x1e, 0xb,\n                                                        0x83, 0xa, 0xda, 0x77, 0xa, 0x13, 0xe0, 0xb,\n                                                        0x30, 0xfb, 0x4c, 0x76, 0xf7, 0x54, 0xc2, 0xf8,\n                                                        0xa, 0x76, 0xa0, 0xc4, 0xb, 0xf8, 0x52, 0x76,\n                                                        0xf7, 0x60, 0xac, 0x88, 0x77, 0x12, 0xbc, 0xf7,\n                                                        0x45, 0xb, 0x1a, 0xfc, 0x64, 0x7, 0xb, 0x6d,\n                                                        0x7d, 0x74, 0xb, 0x66, 0x15, 0xf7, 0x95, 0x6,\n                                                        0xc1, 0x76, 0xf7, 0x42, 0xfb, 0x42, 0xb, 0xf7,\n                                                        0x6a, 0xf2, 0x15, 0xf7, 0x87, 0x7, 0x99, 0xb2,\n                                                        0xc3, 0xb8, 0xb, 0xc4, 0x76, 0xf8, 0xf, 0x77,\n                                                        0xb, 0x76, 0xf7, 0xe3, 0x77, 0x12, 0xb, 0xfb,\n                                                        0x83, 0x33, 0x4b, 0xfb, 0x4, 0x5b, 0x82, 0x9b,\n                                                        0xb3, 0xb, 0xf7, 0x6d, 0x63, 0x7, 0x78, 0x86,\n                                                        0x86, 0x7c, 0x74, 0x1b, 0xb, 0x5c, 0xaf, 0x65,\n                                                        0xbb, 0xba, 0xb1, 0xb0, 0xbb, 0xb9, 0x65, 0xb,\n                                                        0x3, 0xa0, 0x16, 0xf8, 0x13, 0x6, 0x9b, 0xf7,\n                                                        0x34, 0x5, 0xb, 0x15, 0xf7, 0x62, 0xfb, 0x3a,\n                                                        0x5, 0xb, 0x7, 0xc4, 0x9e, 0x99, 0xb, 0xf7,\n                                                        0x1f, 0x3, 0xb, 0x84, 0x1e, 0xe, 0x9f, 0x8b,\n                                                        0xae, 0xf8, 0x47, 0x77, 0xf7, 0x53, 0xae, 0xb,\n                                                        0xfb, 0x52, 0x69, 0x7, 0xbc, 0x8d, 0x5c, 0x80,\n                                                        0x1f, 0xb, 0x77, 0x12, 0xb7, 0xf7, 0x1, 0xf7,\n                                                        0x85, 0xf7, 0xb, 0xb, 0x74, 0x93, 0x95, 0x78,\n                                                        0x1f, 0x99, 0x6f, 0x76, 0x9c, 0xb, 0xfb, 0xce,\n                                                        0xf8, 0xb9, 0x98, 0x1d, 0xb, 0xf7, 0x74, 0x15,\n                                                        0x6d, 0x65, 0x33, 0x20, 0x6e, 0x1a, 0xb, 0x7,\n                                                        0x62, 0x81, 0x81, 0x5d, 0x8b, 0xa, 0xf7, 0x3d,\n                                                        0x1, 0xb4, 0xf7, 0x3d, 0x3, 0xb4, 0xb, 0xf9,\n                                                        0xd, 0x15, 0x4f, 0xbc, 0x5d, 0xc5, 0x1e, 0xb,\n                                                        0x3e, 0x98, 0x76, 0xf8, 0x9e, 0x77, 0x1, 0xaa,\n                                                        0xb, 0xfb, 0x55, 0xfb, 0x35, 0xfb, 0x17, 0xfb,\n                                                        0x6e, 0xb, 0xf7, 0x6, 0xd1, 0xf7, 0x6, 0xb,\n                                                        0x12, 0xa4, 0xf7, 0x1f, 0xb, 0xf7, 0x83, 0xad,\n                                                        0x6, 0xb\n                                                       };\n"
  },
  {
    "path": "core/src/fxge/fontdata/chromefontdata/FoxitSerifBoldItalic.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nconst unsigned char g_FoxitSerifBoldItalicFontData [20733] = {0x1,\n                                                              0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x19,\n                                                              0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72,\n                                                              0x69, 0x66, 0x4f, 0x54, 0x46, 0x2d, 0x42, 0x6f,\n                                                              0x6c, 0x64, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63,\n                                                              0x0, 0x1, 0x1, 0x1, 0x29, 0xf8, 0x10, 0x0,\n                                                              0xf8, 0x1c, 0x1, 0xf8, 0x1d, 0x2, 0xf8, 0x1e,\n                                                              0x3, 0xf8, 0x14, 0x4, 0x7d, 0xc, 0x2, 0xfb,\n                                                              0x5c, 0xfb, 0x8e, 0xfa, 0x6e, 0xf9, 0xf9, 0x5,\n                                                              0x1c, 0x6, 0xf6, 0xf, 0x1c, 0x8, 0x4d, 0x11,\n                                                              0xb7, 0x1c, 0x4a, 0x64, 0x12, 0x0, 0x4, 0x1,\n                                                              0x1, 0x5, 0x2f, 0x4a, 0x59, 0x45, 0x75, 0x72,\n                                                              0x6f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                              0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                              0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                              0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                              0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                              0x20, 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d,\n                                                              0x20, 0x53, 0x65, 0x72, 0x69, 0x66, 0x20, 0x4f,\n                                                              0x54, 0x46, 0x20, 0x42, 0x6f, 0x6c, 0x64, 0x20,\n                                                              0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x43, 0x68,\n                                                              0x72, 0x6F, 0x6D, 0x20, 0x53, 0x65, 0x72, 0x69,\n                                                              0x66, 0x20, 0x4f, 0x54, 0x46, 0x0, 0x71, 0x2,\n                                                              0x0, 0x1, 0x0, 0xf, 0x0, 0x18, 0x0, 0x1d,\n                                                              0x0, 0x30, 0x0, 0x43, 0x0, 0x50, 0x0, 0x5a,\n                                                              0x0, 0x61, 0x0, 0x6d, 0x0, 0x84, 0x0, 0x87,\n                                                              0x0, 0xc2, 0x0, 0xe0, 0x0, 0xe3, 0x0, 0xf7,\n                                                              0x1, 0xa, 0x1, 0x17, 0x1, 0x1f, 0x1, 0x32,\n                                                              0x1, 0x39, 0x1, 0x4a, 0x1, 0x6f, 0x1, 0x76,\n                                                              0x1, 0x89, 0x1, 0xab, 0x1, 0xb8, 0x1, 0xed,\n                                                              0x1, 0xf4, 0x1, 0xfe, 0x2, 0xe, 0x2, 0x1e,\n                                                              0x2, 0x26, 0x2, 0x35, 0x2, 0x47, 0x2, 0x59,\n                                                              0x2, 0x5f, 0x2, 0x6c, 0x2, 0x75, 0x2, 0x7e,\n                                                              0x2, 0x8d, 0x2, 0x96, 0x2, 0xa4, 0x2, 0xb2,\n                                                              0x2, 0xbd, 0x2, 0xca, 0x2, 0xd3, 0x2, 0xdb,\n                                                              0x2, 0xfb, 0x3, 0x5, 0x3, 0xb, 0x3, 0x12,\n                                                              0x3, 0x2e, 0x3, 0x36, 0x3, 0x3e, 0x3, 0x44,\n                                                              0x3, 0x4b, 0x3, 0x52, 0x3, 0x6c, 0x3, 0x7a,\n                                                              0x3, 0x80, 0x3, 0x84, 0x3, 0x8b, 0x3, 0xa1,\n                                                              0x3, 0xa4, 0x3, 0xad, 0x3, 0xb9, 0x3, 0xbf,\n                                                              0x3, 0xd3, 0x3, 0xe7, 0x3, 0xee, 0x3, 0xf3,\n                                                              0x4, 0x5, 0x4, 0xd, 0x4, 0x12, 0x4, 0x23,\n                                                              0x4, 0x30, 0x4, 0x34, 0x4, 0x39, 0x4, 0x49,\n                                                              0x4, 0x59, 0x4, 0x68, 0x4, 0x71, 0x4, 0x78,\n                                                              0x4, 0x7e, 0x4, 0x83, 0x4, 0x88, 0x4, 0x96,\n                                                              0x4, 0xa3, 0x4, 0xaa, 0x4, 0xb7, 0x4, 0xbf,\n                                                              0x4, 0xc4, 0x4, 0xd0, 0x4, 0xd6, 0x4, 0xd9,\n                                                              0x4, 0xdf, 0x4, 0xea, 0x4, 0xf5, 0x4, 0xfd,\n                                                              0x5, 0x2, 0x5, 0xc, 0x5, 0x16, 0x5, 0x20,\n                                                              0x5, 0x2a, 0x5, 0x2e, 0x5, 0x37, 0x5, 0x40,\n                                                              0x5, 0x49, 0x5, 0x4d, 0x5, 0x53, 0x5, 0x57,\n                                                              0x5, 0x5d, 0x5, 0x62, 0x66, 0xa9, 0x6d, 0xb0,\n                                                              0xb0, 0xa9, 0xa9, 0x36, 0x1d, 0x6d, 0x6d, 0x66,\n                                                              0x1e, 0xb, 0xe2, 0x5, 0xa2, 0x98, 0x9b, 0x96,\n                                                              0x25, 0x1d, 0xb, 0x15, 0xbc, 0x21, 0xa, 0xb,\n                                                              0x5c, 0x79, 0x9c, 0xa2, 0x90, 0x8d, 0x91, 0x8e,\n                                                              0x90, 0x3f, 0xa, 0x5c, 0x69, 0x85, 0x5e, 0x88,\n                                                              0x2c, 0xa, 0xb, 0x15, 0xf7, 0x58, 0xae, 0x6,\n                                                              0x23, 0x1d, 0xf7, 0x78, 0xf7, 0x69, 0x15, 0xf7,\n                                                              0x28, 0xf7, 0x87, 0x74, 0x1d, 0xe, 0xa2, 0x1a,\n                                                              0xab, 0x6f, 0x9a, 0x76, 0x75, 0x76, 0x74, 0x70,\n                                                              0x71, 0x1e, 0xb, 0xf7, 0x27, 0x5, 0x98, 0x80,\n                                                              0x79, 0xa0, 0x30, 0x1d, 0xb, 0x7b, 0xa, 0xfb,\n                                                              0x3, 0x26, 0x1d, 0xb, 0x44, 0xa, 0xfb, 0x3,\n                                                              0x8e, 0x7a, 0x4a, 0x6f, 0xa, 0x27, 0xa, 0xb,\n                                                              0x15, 0xc9, 0x8b, 0x60, 0x6b, 0x1f, 0x5d, 0x2e,\n                                                              0xfb, 0xa5, 0x38, 0xa, 0xcd, 0xf7, 0x78, 0xb3,\n                                                              0xf7, 0x1f, 0x97, 0x84, 0x55, 0xa, 0xb, 0x27,\n                                                              0x1d, 0xe, 0x15, 0x43, 0xb2, 0x51, 0xd7, 0xf7,\n                                                              0x6, 0xd9, 0xf7, 0xf, 0xf3, 0xd6, 0x63, 0xc3,\n                                                              0x3d, 0xfb, 0x0, 0x3a, 0xfb, 0xe, 0x21, 0x1e,\n                                                              0xf7, 0x9, 0xe3, 0x15, 0xac, 0x95, 0xa0, 0xdc,\n                                                              0xb6, 0x1b, 0xa4, 0x92, 0x74, 0x76, 0x6b, 0x6f,\n                                                              0x32, 0x81, 0x69, 0x1f, 0x6c, 0x82, 0x79, 0x3f,\n                                                              0x61, 0x1b, 0x75, 0x81, 0x9e, 0x9e, 0xac, 0xa2,\n                                                              0xe2, 0x95, 0xad, 0x1f, 0xb, 0xf7, 0xb2, 0xf7,\n                                                              0x2f, 0x15, 0x8d, 0x8a, 0x5, 0x81, 0x6d, 0x7f,\n                                                              0x69, 0x60, 0x1a, 0x53, 0xbf, 0x8b, 0x9a, 0xdf,\n                                                              0xc3, 0xea, 0xad, 0x9e, 0x1e, 0x76, 0x98, 0x5,\n                                                              0x7f, 0x8d, 0xb, 0x2b, 0xa, 0xe, 0x83, 0x6e,\n                                                              0x86, 0x79, 0x7b, 0x1a, 0x57, 0xbb, 0x7d, 0x9e,\n                                                              0xc8, 0xc4, 0xd5, 0xbf, 0xac, 0x1e, 0x76, 0x9a,\n                                                              0x5, 0xb, 0xfb, 0x5a, 0xfb, 0x27, 0x6a, 0x95,\n                                                              0x2a, 0xee, 0xde, 0xbe, 0xde, 0xb7, 0xa5, 0x1f,\n                                                              0xfb, 0x26, 0x8c, 0x15, 0xb, 0x70, 0x1b, 0x70,\n                                                              0x79, 0x73, 0x76, 0x76, 0xa0, 0x7a, 0x98, 0x82,\n                                                              0x1f, 0xb, 0x40, 0x1d, 0x83, 0x96, 0x89, 0x43,\n                                                              0xa, 0xb, 0xab, 0xc8, 0xf7, 0x67, 0xb2, 0xf7,\n                                                              0x23, 0x1f, 0x47, 0x7b, 0x2d, 0x82, 0x63, 0x88,\n                                                              0x8, 0x70, 0x7, 0xa8, 0xb, 0x65, 0x1d, 0xf7,\n                                                              0x71, 0x25, 0xa, 0xb, 0x74, 0x3d, 0xfb, 0x8e,\n                                                              0x5f, 0x1a, 0x73, 0x96, 0x60, 0xc5, 0xd5, 0xb5,\n                                                              0xc5, 0xd9, 0xbe, 0x1e, 0xb, 0xf7, 0x85, 0xf7,\n                                                              0x5, 0x15, 0x70, 0xf7, 0x2f, 0x6b, 0xf7, 0x27,\n                                                              0x78, 0xba, 0x66, 0x81, 0x55, 0x82, 0x51, 0x86,\n                                                              0x8, 0x70, 0x7, 0xb2, 0x95, 0x8b, 0xfb, 0x2c,\n                                                              0xad, 0x1f, 0x93, 0x67, 0xb0, 0xfb, 0x48, 0x5a,\n                                                              0x1a, 0xb, 0xb0, 0xb0, 0x6d, 0xa9, 0x66, 0x66,\n                                                              0xb, 0xf8, 0xbe, 0x6, 0xc6, 0xf7, 0x56, 0x72,\n                                                              0x90, 0x5, 0xfb, 0x12, 0x46, 0xfb, 0x4, 0x62,\n                                                              0xfb, 0xc, 0x1b, 0xb, 0x1b, 0x63, 0x7e, 0x66,\n                                                              0x79, 0x70, 0xa1, 0x6a, 0xb0, 0xee, 0xe3, 0xeb,\n                                                              0xf7, 0x3d, 0xf1, 0x1f, 0x94, 0x9a, 0xf7, 0x15,\n                                                              0xf7, 0x64, 0xf7, 0x9, 0x1a, 0xac, 0x6d, 0xa8,\n                                                              0x6a, 0x6b, 0x73, 0x6c, 0x72, 0xb, 0x83, 0xba,\n                                                              0x2b, 0xf8, 0xe4, 0x18, 0x72, 0x6, 0xfc, 0x8,\n                                                              0xfc, 0xe4, 0xb, 0xf7, 0x3f, 0xf7, 0x2d, 0x15,\n                                                              0xe7, 0xe2, 0xf8, 0x28, 0xf7, 0x4c, 0xf3, 0x8c,\n                                                              0x20, 0x76, 0xfb, 0x8, 0x2d, 0xfc, 0x19, 0xfb,\n                                                              0x46, 0x50, 0x5e, 0xb0, 0x55, 0x1d, 0xd2, 0xfb,\n                                                              0x17, 0xf7, 0x3b, 0xf7, 0x8d, 0xf7, 0x45, 0xf7,\n                                                              0x9b, 0xf7, 0x56, 0xf7, 0x42, 0xfb, 0x19, 0xd1,\n                                                              0x5d, 0x1d, 0xfb, 0x78, 0xfb, 0x89, 0x1e, 0xb,\n                                                              0x5, 0xbe, 0x6, 0x35, 0x4e, 0xa, 0xb, 0x6c,\n                                                              0x1d, 0x53, 0x55, 0x73, 0x1b, 0x85, 0x32, 0xa,\n                                                              0xb, 0x1b, 0xe2, 0xa1, 0xdf, 0xae, 0x94, 0x1f,\n                                                              0x62, 0x6, 0x78, 0x82, 0x81, 0x74, 0x69, 0x1b,\n                                                              0xb, 0x1f, 0xdd, 0xf7, 0xb6, 0x9c, 0xcb, 0xa5,\n                                                              0x90, 0xbe, 0x8e, 0x19, 0xae, 0xfb, 0xcb, 0x7,\n                                                              0xb, 0x1b, 0x85, 0x88, 0x90, 0x94, 0x28, 0x1d,\n                                                              0xb, 0x3c, 0x41, 0x1f, 0xa6, 0x86, 0xb6, 0xf7,\n                                                              0x52, 0x5, 0xfc, 0xb0, 0x68, 0x6, 0xc9, 0xb,\n                                                              0x71, 0x9e, 0x61, 0xba, 0xb2, 0xa9, 0xa9, 0xaf,\n                                                              0xb0, 0x6c, 0xaa, 0x65, 0x5e, 0x76, 0x61, 0x73,\n                                                              0x1e, 0xb, 0x65, 0xa8, 0x6e, 0xb1, 0xb1, 0xa9,\n                                                              0xa8, 0xb1, 0xb1, 0x6d, 0xa9, 0x65, 0x65, 0x6e,\n                                                              0x6d, 0x65, 0x1e, 0xb, 0x15, 0x62, 0xa9, 0x45,\n                                                              0x1d, 0xb, 0xe9, 0xf7, 0xc8, 0x7d, 0x8a, 0x21,\n                                                              0x74, 0x32, 0x87, 0x6d, 0xa, 0xad, 0xb, 0x6a,\n                                                              0xb7, 0xb4, 0xac, 0xab, 0xb5, 0xb4, 0x6a, 0xb,\n                                                              0x15, 0x42, 0x1d, 0xf7, 0x68, 0x16, 0x42, 0x1d,\n                                                              0xe, 0x89, 0x7f, 0x1f, 0xfb, 0x14, 0xfc, 0x5e,\n                                                              0x7b, 0x52, 0x76, 0x82, 0x60, 0x85, 0x19, 0xb,\n                                                              0x1f, 0xd0, 0xf7, 0x9, 0x5, 0xf7, 0x6b, 0x6,\n                                                              0xb, 0xf7, 0x77, 0x70, 0xa, 0x8e, 0x88, 0x90,\n                                                              0x9d, 0xb6, 0xb4, 0x9b, 0x4a, 0xa, 0xb, 0x1f,\n                                                              0x51, 0xfb, 0x65, 0x5, 0x21, 0x6e, 0x64, 0xfb,\n                                                              0x1e, 0xfb, 0x23, 0x1b, 0xb, 0x65, 0xfb, 0x32,\n                                                              0xfb, 0x15, 0xfb, 0x3c, 0xfb, 0x2e, 0x1e, 0xb,\n                                                              0x15, 0xdd, 0x6, 0xf7, 0x36, 0xf7, 0x42, 0x5,\n                                                              0x53, 0x6, 0xfb, 0x1b, 0xb, 0x1, 0xf7, 0x6c,\n                                                              0xf7, 0x21, 0x15, 0x72, 0x88, 0xb, 0x88, 0xf7,\n                                                              0xb, 0xf7, 0x62, 0xf7, 0xb, 0xb, 0x2a, 0x7d,\n                                                              0x71, 0x92, 0xab, 0x1f, 0x7f, 0x57, 0x15, 0x7b,\n                                                              0xaa, 0x98, 0x85, 0xa4, 0x1b, 0xf7, 0x22, 0xf7,\n                                                              0x1a, 0xf7, 0x56, 0xf7, 0x2f, 0xe7, 0x58, 0xad,\n                                                              0x4f, 0x60, 0x54, 0x70, 0x3c, 0xb, 0xf7, 0x21,\n                                                              0xf7, 0x4a, 0x15, 0xf7, 0x55, 0xa9, 0xcb, 0xb,\n                                                              0x56, 0xa, 0xf8, 0x47, 0x77, 0xb, 0x1, 0x4e,\n                                                              0x1d, 0x3, 0xf7, 0x8, 0xb, 0x58, 0x8b, 0xab,\n                                                              0xf8, 0xee, 0xae, 0x1, 0x75, 0x16, 0xf8, 0xbd,\n                                                              0x6, 0xc6, 0xf7, 0x56, 0x73, 0x90, 0x5, 0xfb,\n                                                              0x11, 0x46, 0xfb, 0x4, 0x61, 0xfb, 0xc, 0x1b,\n                                                              0xb, 0x1b, 0x29, 0x78, 0xfb, 0x8, 0x89, 0x1f,\n                                                              0xe, 0xef, 0x1e, 0xfb, 0x24, 0xc4, 0x15, 0x2a,\n                                                              0xb, 0xb1, 0x90, 0x19, 0x61, 0xa, 0xb, 0x19,\n                                                              0xae, 0xfb, 0x64, 0x68, 0x7, 0xb, 0x7e, 0xd2,\n                                                              0x58, 0x76, 0xf8, 0x46, 0xb, 0x1, 0xf7, 0xd5,\n                                                              0xf7, 0x11, 0x3, 0xf7, 0x5, 0xc8, 0x15, 0xa4,\n                                                              0xbd, 0xf7, 0x42, 0xa2, 0xbb, 0x1e, 0xb1, 0x9d,\n                                                              0xb1, 0xb8, 0xb2, 0x1b, 0xa1, 0x9d, 0xb, 0x77,\n                                                              0x1, 0xf7, 0x77, 0xf9, 0x67, 0x5b, 0xa, 0xea,\n                                                              0xe3, 0x2c, 0x3b, 0x1d, 0xb, 0x58, 0x1d, 0xb0,\n                                                              0x90, 0x77, 0xb, 0x77, 0x52, 0x1d, 0xb, 0xfb,\n                                                              0x1, 0xfb, 0x6f, 0xfb, 0x5f, 0xb, 0x15, 0xf7,\n                                                              0x82, 0x6, 0xbe, 0xf7, 0x6, 0x5, 0x7b, 0x6,\n                                                              0x69, 0x75, 0x7b, 0x80, 0x57, 0x1b, 0x34, 0x8d,\n                                                              0x6, 0xf7, 0xf, 0xb, 0x26, 0x1d, 0xe, 0x4c,\n                                                              0x1d, 0x26, 0x30, 0xf0, 0x5, 0x59, 0x6, 0xe,\n                                                              0x15, 0xc5, 0x6, 0xf8, 0x47, 0xf9, 0x48, 0x5,\n                                                              0x8d, 0x51, 0x7, 0xb, 0xf7, 0x19, 0x1a, 0xdb,\n                                                              0x50, 0xb, 0xce, 0xaa, 0x97, 0xad, 0xa4, 0x1a,\n                                                              0xc3, 0x54, 0xa5, 0x61, 0x47, 0x62, 0x62, 0x64,\n                                                              0x71, 0x1e, 0x99, 0x7e, 0x5, 0xb, 0x1f, 0x3b,\n                                                              0xfb, 0xb3, 0xfb, 0x6b, 0xf8, 0x65, 0x5, 0xfb,\n                                                              0x57, 0x68, 0x6, 0xc0, 0x86, 0x96, 0x8f, 0x9e,\n                                                              0x5f, 0xb, 0xc7, 0x79, 0xad, 0xf9, 0xd, 0xad,\n                                                              0xb, 0xfc, 0x14, 0x97, 0x76, 0xb, 0x1f, 0xb1,\n                                                              0x70, 0x7e, 0x94, 0x79, 0x1b, 0x73, 0x7e, 0x79,\n                                                              0x70, 0x84, 0x90, 0x64, 0xdd, 0xf0, 0xe4, 0xb,\n                                                              0xfb, 0x6e, 0x7e, 0xcb, 0xf8, 0xe, 0xac, 0xb,\n                                                              0xf8, 0x1a, 0x62, 0xa, 0xb, 0x1e, 0xae, 0xfb,\n                                                              0xaf, 0x68, 0x7, 0xbb, 0x84, 0x92, 0x8a, 0x9d,\n                                                              0x54, 0xe3, 0xfb, 0x96, 0x18, 0xb, 0x19, 0xf7,\n                                                              0x78, 0xf7, 0x69, 0x15, 0xf7, 0x28, 0xf7, 0x87,\n                                                              0x74, 0x1d, 0xe, 0x77, 0x4d, 0x1d, 0xb, 0xf7,\n                                                              0x30, 0x35, 0xe1, 0xb, 0xef, 0xf7, 0xde, 0x5e,\n                                                              0x82, 0x66, 0x83, 0x2c, 0x7d, 0x19, 0x89, 0x76,\n                                                              0x5, 0xa8, 0xb3, 0xb, 0x15, 0xcb, 0xf7, 0x83,\n                                                              0x5, 0xa0, 0x8f, 0x91, 0xa2, 0xb2, 0x1b, 0xe0,\n                                                              0x8b, 0x23, 0x76, 0xb, 0xa7, 0x88, 0x5, 0xa3,\n                                                              0x94, 0x98, 0xb0, 0xb4, 0x1b, 0xf7, 0x25, 0x6,\n                                                              0xfb, 0xb8, 0xb, 0x15, 0xc1, 0x54, 0xc4, 0x51,\n                                                              0xbc, 0x56, 0x8, 0xb, 0xc0, 0x76, 0xf8, 0x13,\n                                                              0x77, 0x1, 0xb, 0x9b, 0xb5, 0x1b, 0xf7, 0x51,\n                                                              0xb, 0xb0, 0xfb, 0x87, 0x5, 0xb, 0xf7, 0xbc,\n                                                              0xae, 0x6, 0xb, 0x4a, 0xc1, 0x8b, 0x9b, 0xd9,\n                                                              0xba, 0xd8, 0xc1, 0xab, 0x1e, 0x75, 0x98, 0x5,\n                                                              0xb, 0x7d, 0x4e, 0x83, 0x41, 0x83, 0x6d, 0xa,\n                                                              0xad, 0x8c, 0xa8, 0x8b, 0x69, 0xb, 0x28, 0x30,\n                                                              0xee, 0x5, 0x59, 0x6, 0xe, 0xfb, 0x6e, 0xfb,\n                                                              0x61, 0xf7, 0x7, 0xf7, 0x5f, 0x77, 0xf8, 0x5,\n                                                              0x77, 0xb, 0x1a, 0xc3, 0xee, 0xbe, 0x9e, 0x95,\n                                                              0x1e, 0xb, 0xf7, 0x0, 0xa5, 0xa1, 0xb, 0x1a,\n                                                              0x86, 0x8b, 0x85, 0x89, 0x85, 0x1e, 0xfb, 0x19,\n                                                              0xfc, 0x65, 0xb, 0x45, 0x1d, 0xac, 0x62, 0x60,\n                                                              0xb, 0x3b, 0x1d, 0xe, 0xfb, 0xdd, 0xf8, 0xad,\n                                                              0x76, 0xb, 0x5, 0xb4, 0x96, 0xab, 0x88, 0x9a,\n                                                              0x1b, 0xf7, 0x35, 0x8c, 0xb, 0x1f, 0xab, 0x85,\n                                                              0xbe, 0xf7, 0x7e, 0x5, 0x6d, 0x6, 0x7b, 0xb,\n                                                              0x6d, 0xa, 0xac, 0xa9, 0x8d, 0x68, 0x1f, 0xe,\n                                                              0xf7, 0xb, 0x40, 0xd6, 0xb, 0x69, 0xa9, 0x79,\n                                                              0xa6, 0xb1, 0xa4, 0xa6, 0xb8, 0xb7, 0xb, 0x77,\n                                                              0x12, 0xf1, 0xf7, 0xd, 0xf7, 0x10, 0xf7, 0xd,\n                                                              0xb, 0xe3, 0x8b, 0xf7, 0x29, 0xfb, 0x22, 0x76,\n                                                              0xf1, 0xc8, 0xb, 0xfb, 0x61, 0xb0, 0xf7, 0x2f,\n                                                              0xae, 0xf8, 0x5, 0xd2, 0xb, 0x1b, 0x85, 0x87,\n                                                              0xb, 0x21, 0x97, 0x76, 0xa9, 0x76, 0xf8, 0x1a,\n                                                              0xd3, 0xb, 0x83, 0x93, 0x1b, 0x90, 0x8f, 0x8f,\n                                                              0x97, 0x1f, 0xb, 0xc7, 0x8b, 0xae, 0x6e, 0x76,\n                                                              0xf9, 0x1d, 0xae, 0xb, 0x83, 0x1d, 0x12, 0xb,\n                                                              0x76, 0xf9, 0x53, 0x77, 0x1, 0xb, 0x15, 0x75,\n                                                              0x1d, 0xb, 0x7e, 0xa8, 0xf8, 0x33, 0xa8, 0xb,\n                                                              0xa5, 0xaf, 0xa1, 0xa4, 0xb, 0x1, 0x0, 0x1,\n                                                              0x6, 0x0, 0x68, 0x0, 0x0, 0x9, 0x37, 0x0,\n                                                              0x7c, 0x0, 0x0, 0x42, 0x20, 0x0, 0x67, 0x0,\n                                                              0x0, 0x64, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x66,\n                                                              0x0, 0x0, 0x83, 0x0, 0x0, 0xaa, 0x0, 0x0,\n                                                              0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x97, 0x0,\n                                                              0x0, 0xa5, 0x0, 0x0, 0x80, 0x0, 0x0, 0xa1,\n                                                              0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4, 0x0, 0x0,\n                                                              0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x98, 0x0,\n                                                              0x0, 0x73, 0x0, 0x0, 0x72, 0x0, 0x0, 0x85,\n                                                              0x0, 0x0, 0x96, 0x0, 0x0, 0x8f, 0x0, 0x0,\n                                                              0x78, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x9b, 0x0,\n                                                              0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0, 0x0, 0xae,\n                                                              0x0, 0x0, 0xab, 0x1, 0x0, 0xb0, 0x0, 0x0,\n                                                              0xad, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x8a, 0x0,\n                                                              0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0, 0x0, 0xb2,\n                                                              0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6, 0x2, 0x0,\n                                                              0x9a, 0x0, 0x0, 0xba, 0x0, 0x0, 0xbe, 0x0,\n                                                              0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0, 0x0, 0xbd,\n                                                              0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d, 0x0, 0x0,\n                                                              0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0, 0xc5, 0x0,\n                                                              0x0, 0x9d, 0x0, 0x0, 0x95, 0x0, 0x0, 0xcb,\n                                                              0x0, 0x0, 0xc8, 0x1, 0x0, 0xcd, 0x0, 0x0,\n                                                              0xca, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x90, 0x0,\n                                                              0x0, 0xce, 0x0, 0x0, 0xd2, 0x0, 0x0, 0xcf,\n                                                              0x2, 0x0, 0xd6, 0x0, 0x0, 0xd3, 0x2, 0x0,\n                                                              0xa7, 0x0, 0x0, 0xd7, 0x0, 0x0, 0xdb, 0x0,\n                                                              0x0, 0xd8, 0x1, 0x0, 0xdc, 0x0, 0x0, 0xda,\n                                                              0x0, 0x0, 0x9f, 0x0, 0x0, 0x93, 0x0, 0x0,\n                                                              0xe1, 0x0, 0x0, 0xde, 0x2, 0x0, 0xe2, 0x0,\n                                                              0x0, 0xa2, 0x0, 0x0, 0xe3, 0x0, 0x0, 0x91,\n                                                              0x0, 0x0, 0x8c, 0x0, 0x0, 0x92, 0x0, 0x0,\n                                                              0x8e, 0x0, 0x0, 0x94, 0x0, 0x0, 0xc0, 0x0,\n                                                              0x0, 0xdd, 0x0, 0x0, 0xc6, 0x1, 0x0, 0xe4,\n                                                              0x0, 0x0, 0x65, 0x0, 0x0, 0x7e, 0x0, 0x0,\n                                                              0x88, 0x0, 0x0, 0x81, 0x1, 0x0, 0x84, 0x0,\n                                                              0x0, 0x87, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x86,\n                                                              0x0, 0x0, 0x6f, 0x0, 0x0, 0x89, 0x0, 0x0,\n                                                              0x41, 0x0, 0x0, 0x8, 0x0, 0x0, 0x75, 0x0,\n                                                              0x0, 0x69, 0x0, 0x0, 0x77, 0x0, 0x0, 0x76,\n                                                              0x0, 0x0, 0x70, 0x1, 0x0, 0x74, 0x0, 0x0,\n                                                              0x79, 0x1, 0x0, 0x6b, 0x1, 0x0, 0x63, 0x0,\n                                                              0x1, 0x87, 0x0, 0x0, 0x99, 0x0, 0x0, 0xa6,\n                                                              0x0, 0x0, 0x6d, 0x1, 0x0, 0xe6, 0x2, 0x0,\n                                                              0x1, 0x0, 0x4, 0x0, 0x7, 0x0, 0x5e, 0x0,\n                                                              0x9d, 0x1, 0x14, 0x1, 0xa9, 0x1, 0xe3, 0x2,\n                                                              0xb8, 0x2, 0xe4, 0x3, 0x17, 0x3, 0x49, 0x4,\n                                                              0x25, 0x4, 0x51, 0x4, 0x80, 0x4, 0x96, 0x4,\n                                                              0xa4, 0x4, 0xb9, 0x5, 0x3, 0x5, 0x44, 0x5,\n                                                              0x9a, 0x6, 0x2, 0x6, 0x47, 0x6, 0x98, 0x7,\n                                                              0x2, 0x7, 0x2e, 0x7, 0xae, 0x8, 0xe, 0x8,\n                                                              0x3a, 0x8, 0x8b, 0x8, 0xaf, 0x8, 0xd1, 0x8,\n                                                              0xf2, 0x9, 0x57, 0xa, 0x11, 0xa, 0x3b, 0xa,\n                                                              0xc1, 0xb, 0x17, 0xb, 0x57, 0xb, 0x76, 0xb,\n                                                              0xd9, 0xc, 0x5a, 0xc, 0xda, 0xd, 0x15, 0xd,\n                                                              0x74, 0xd, 0xed, 0xe, 0x14, 0xe, 0x94, 0xe,\n                                                              0xd1, 0xf, 0x14, 0xf, 0x6c, 0x10, 0x7, 0x10,\n                                                              0x7e, 0x10, 0xff, 0x11, 0x41, 0x11, 0x8c, 0x11,\n                                                              0xdb, 0x12, 0x59, 0x12, 0xd5, 0x13, 0x19, 0x13,\n                                                              0x1f, 0x13, 0x4d, 0x13, 0x64, 0x13, 0x95, 0x13,\n                                                              0xb6, 0x13, 0xc2, 0x13, 0xe4, 0x14, 0x1c, 0x14,\n                                                              0x6d, 0x14, 0xbc, 0x15, 0x38, 0x15, 0x70, 0x15,\n                                                              0xee, 0x16, 0x9b, 0x16, 0xff, 0x17, 0x1e, 0x17,\n                                                              0x72, 0x17, 0xd0, 0x18, 0x0, 0x18, 0xa0, 0x18,\n                                                              0xd3, 0x19, 0x10, 0x19, 0x45, 0x19, 0xb2, 0x19,\n                                                              0xfd, 0x1a, 0x64, 0x1a, 0xab, 0x1a, 0xd9, 0x1b,\n                                                              0x2d, 0x1b, 0xa5, 0x1c, 0x31, 0x1c, 0x53, 0x1c,\n                                                              0x97, 0x1c, 0xf5, 0x1d, 0x10, 0x1d, 0x6a, 0x1d,\n                                                              0xb5, 0x1e, 0x3, 0x1e, 0x79, 0x1f, 0x31, 0x1f,\n                                                              0xa7, 0x20, 0x30, 0x20, 0x5f, 0x21, 0x28, 0x21,\n                                                              0x42, 0x21, 0xdf, 0x22, 0x4d, 0x22, 0x81, 0x22,\n                                                              0xa0, 0x23, 0x55, 0x23, 0x69, 0x23, 0x9c, 0x23,\n                                                              0xdb, 0x23, 0xff, 0x24, 0x32, 0x24, 0x44, 0x24,\n                                                              0xc7, 0x25, 0x10, 0x25, 0x20, 0x25, 0x57, 0x25,\n                                                              0x90, 0x25, 0xca, 0x25, 0xf4, 0x26, 0x2e, 0x26,\n                                                              0x79, 0x26, 0xd3, 0x27, 0x34, 0x27, 0x51, 0x27,\n                                                              0x63, 0x27, 0x6f, 0x27, 0xcc, 0x27, 0xf5, 0x28,\n                                                              0x20, 0x28, 0xc6, 0x29, 0x5d, 0x29, 0x9b, 0x29,\n                                                              0xdf, 0x2a, 0x7, 0x2a, 0x36, 0x2a, 0x58, 0x2a,\n                                                              0x87, 0x2a, 0xab, 0x2a, 0xd1, 0x2b, 0x29, 0x2b,\n                                                              0x84, 0x2b, 0x8c, 0x2b, 0x94, 0x2b, 0xa5, 0x2b,\n                                                              0xd2, 0x2b, 0xf5, 0x2c, 0x25, 0x2c, 0xa4, 0x2c,\n                                                              0xcc, 0x2c, 0xf7, 0x2d, 0x24, 0x2d, 0x59, 0x2d,\n                                                              0x9f, 0x2e, 0x13, 0x2e, 0xb5, 0x2e, 0xde, 0x2e,\n                                                              0xf5, 0x2f, 0xb, 0x2f, 0x45, 0x2f, 0x67, 0x2f,\n                                                              0xd1, 0x30, 0x8a, 0x31, 0xe, 0x31, 0x1b, 0x31,\n                                                              0x24, 0x31, 0x3c, 0x31, 0x5f, 0x31, 0x6e, 0x31,\n                                                              0x82, 0x31, 0xa2, 0x31, 0xcb, 0x32, 0x31, 0x32,\n                                                              0x85, 0x32, 0x94, 0x32, 0xba, 0x32, 0xc7, 0x32,\n                                                              0xf4, 0x33, 0x15, 0x33, 0x47, 0x33, 0xbe, 0x33,\n                                                              0xdc, 0x33, 0xf0, 0x34, 0x6, 0x34, 0x22, 0x34,\n                                                              0x4d, 0x34, 0x7f, 0x34, 0xbb, 0x34, 0xc2, 0x35,\n                                                              0x4, 0x35, 0x50, 0x36, 0x3, 0x36, 0x9a, 0x37,\n                                                              0x2f, 0x37, 0x9c, 0x38, 0xb, 0x38, 0x19, 0x38,\n                                                              0x65, 0x38, 0xee, 0x38, 0xfe, 0x39, 0xa, 0x39,\n                                                              0x35, 0x39, 0x49, 0x39, 0x70, 0x39, 0xa3, 0x39,\n                                                              0xf1, 0x3a, 0x9, 0x3a, 0x1a, 0x3a, 0x2c, 0x3a,\n                                                              0x59, 0x3a, 0x7f, 0x3a, 0xa9, 0x3a, 0xe2, 0x3b,\n                                                              0x1b, 0x3b, 0x5b, 0x3b, 0xfb, 0x3c, 0xdb, 0x3c,\n                                                              0xfc, 0x3d, 0x34, 0x3d, 0x67, 0x3d, 0x7c, 0x3d,\n                                                              0x90, 0x3d, 0xaa, 0x3e, 0x30, 0x3e, 0xd6, 0x3e,\n                                                              0xe8, 0x3f, 0x9b, 0x40, 0x47, 0xfc, 0x30, 0xe,\n                                                              0xfc, 0x30, 0xe, 0xfb, 0xa5, 0x72, 0xf7, 0x24,\n                                                              0xfb, 0x18, 0xf7, 0x24, 0xf8, 0xb0, 0x77, 0xac,\n                                                              0x77, 0x12, 0xce, 0xf7, 0x28, 0x13, 0xa8, 0xf7,\n                                                              0x3b, 0xf7, 0x68, 0x15, 0xa8, 0x83, 0xd2, 0xf7,\n                                                              0x39, 0xd8, 0xf7, 0x2f, 0x97, 0xa9, 0x19, 0x93,\n                                                              0xa0, 0x91, 0xa0, 0x9d, 0x1a, 0x13, 0x98, 0xb4,\n                                                              0x71, 0xa8, 0x6b, 0x50, 0x6b, 0x38, 0x61, 0x85,\n                                                              0x1e, 0x7a, 0xfb, 0x7, 0x80, 0xfb, 0x15, 0x77,\n                                                              0x24, 0x8, 0x27, 0xfb, 0x2f, 0x15, 0x13, 0x68,\n                                                              0x64, 0xa8, 0x6c, 0xb7, 0xb8, 0xa9, 0xad, 0xaf,\n                                                              0xb1, 0x6a, 0xaf, 0x60, 0x6a, 0x64, 0x70, 0x5c,\n                                                              0x1e, 0xe, 0x20, 0xf8, 0x37, 0x76, 0xf7, 0xb3,\n                                                              0x77, 0x1, 0xf7, 0x1c, 0xf8, 0x22, 0x15, 0xb3,\n                                                              0x6, 0xde, 0xf7, 0x4e, 0x5, 0x91, 0x99, 0x90,\n                                                              0x9f, 0x9e, 0x1a, 0xa4, 0x7e, 0xa2, 0x66, 0x65,\n                                                              0x70, 0x68, 0x65, 0x88, 0x1e, 0xf7, 0x90, 0xfb,\n                                                              0x6a, 0x15, 0xb1, 0x6, 0xe0, 0xf7, 0x4e, 0x5,\n                                                              0x91, 0x98, 0x8e, 0x9d, 0x9c, 0x1a, 0xa6, 0x7b,\n                                                              0xa5, 0x6b, 0x65, 0x70, 0x68, 0x65, 0x88, 0x1e,\n                                                              0xe, 0xa0, 0x76, 0xf7, 0x66, 0xca, 0x4c, 0xd4,\n                                                              0xf7, 0x1a, 0xd4, 0x4c, 0xca, 0xf7, 0x66, 0x77,\n                                                              0x12, 0x13, 0xb4, 0x75, 0x16, 0xe0, 0xf7, 0x66,\n                                                              0x5, 0x2b, 0x6, 0x9f, 0xca, 0x5, 0xf1, 0x6,\n                                                              0xcb, 0xf7, 0x2e, 0x5, 0x25, 0x6, 0x9f, 0xca,\n                                                              0x5, 0xf7, 0x3, 0x6, 0xdc, 0xf7, 0x66, 0x5,\n                                                              0xd0, 0x6, 0x3b, 0xfb, 0x66, 0x5, 0xf7, 0x14,\n                                                              0x6, 0xdc, 0xf7, 0x66, 0x5, 0xd1, 0x6, 0x3b,\n                                                              0xfb, 0x66, 0x5, 0xdd, 0x6, 0x77, 0x4c, 0x5,\n                                                              0x30, 0x6, 0x13, 0xcc, 0x4b, 0xfb, 0x2e, 0x5,\n                                                              0xe6, 0x6, 0x77, 0x4c, 0x5, 0x2a, 0x6, 0x36,\n                                                              0xfb, 0x66, 0x5, 0x44, 0x6, 0xe0, 0xf7, 0x66,\n                                                              0x5, 0xfb, 0x14, 0x6, 0x36, 0xfb, 0x66, 0x5,\n                                                              0xf7, 0x3, 0xf7, 0xa5, 0x15, 0xf7, 0x14, 0x6,\n                                                              0xcb, 0xf7, 0x2e, 0x5, 0xfb, 0x14, 0x6, 0xe,\n                                                              0x3c, 0x76, 0xf0, 0xaa, 0xf8, 0xf1, 0xac, 0xca,\n                                                              0x77, 0x1, 0xda, 0xee, 0xf7, 0x25, 0xf7, 0x1,\n                                                              0x3, 0xf7, 0x13, 0x92, 0x15, 0x62, 0x96, 0x62,\n                                                              0x93, 0x4a, 0xc7, 0xb5, 0xf7, 0x22, 0x18, 0xa1,\n                                                              0x85, 0x8e, 0x2e, 0x98, 0x57, 0xd8, 0x68, 0x19,\n                                                              0xd5, 0xf7, 0x99, 0x5, 0x20, 0xd8, 0x72, 0xdd,\n                                                              0xc7, 0x1a, 0xe7, 0xcf, 0xc3, 0xf7, 0x19, 0x96,\n                                                              0x94, 0x8a, 0x8a, 0x98, 0x1e, 0x9d, 0xcc, 0x5,\n                                                              0xbd, 0x6, 0x77, 0x43, 0xb5, 0x86, 0xcc, 0x69,\n                                                              0xa8, 0x73, 0x19, 0x61, 0xfb, 0x19, 0x76, 0x90,\n                                                              0x8e, 0xb8, 0x8d, 0xe1, 0x33, 0xa3, 0x19, 0x50,\n                                                              0xfb, 0x79, 0x5, 0xdb, 0x46, 0xc7, 0x46, 0x32,\n                                                              0x1a, 0xfb, 0x1, 0x22, 0x50, 0xfb, 0x29, 0x1e,\n                                                              0x6f, 0x26, 0x5, 0x57, 0x6, 0xf7, 0x2a, 0xf8,\n                                                              0x9e, 0x15, 0xc2, 0xf7, 0x69, 0x5, 0x8e, 0x84,\n                                                              0x8d, 0x8a, 0x7c, 0x1b, 0x45, 0x68, 0x48, 0x5b,\n                                                              0x68, 0x9a, 0x71, 0xc2, 0x64, 0x1f, 0x4d, 0xfc,\n                                                              0x1a, 0x15, 0xe2, 0xbd, 0xc5, 0xda, 0xc6, 0x68,\n                                                              0x9c, 0x68, 0xa8, 0x1f, 0xe, 0xf7, 0x3f, 0x7d,\n                                                              0xa5, 0x85, 0x76, 0xf7, 0xe3, 0xa1, 0xf7, 0xc8,\n                                                              0xa5, 0x8c, 0x77, 0x12, 0xf7, 0x0, 0xdf, 0xf7,\n                                                              0x20, 0xdf, 0xc9, 0xdf, 0xf7, 0x20, 0xdf, 0x13,\n                                                              0xb7, 0x80, 0xf8, 0xe4, 0x7d, 0x3b, 0xa, 0xfc,\n                                                              0x9, 0xf7, 0xc8, 0x3b, 0xa, 0x13, 0x6f, 0x80,\n                                                              0xf8, 0xba, 0xf7, 0xdf, 0x15, 0x4f, 0x6, 0xfc,\n                                                              0xe9, 0xfd, 0x48, 0x5, 0xc7, 0x6, 0xe, 0xf7,\n                                                              0x8, 0x79, 0xd1, 0x45, 0xdc, 0x4e, 0x76, 0xca,\n                                                              0xaf, 0xc0, 0xaf, 0xf8, 0x74, 0xac, 0x12, 0xa5,\n                                                              0xf7, 0x19, 0xd6, 0xf7, 0xd, 0xf7, 0xe, 0xdb,\n                                                              0x75, 0xa1, 0x13, 0x3f, 0x80, 0xf8, 0x1a, 0xb7,\n                                                              0x15, 0x13, 0x4f, 0x80, 0x73, 0xa3, 0xb6, 0x65,\n                                                              0xd4, 0x1b, 0x13, 0x3f, 0x80, 0xe3, 0xb9, 0xc4,\n                                                              0xb4, 0xae, 0x1f, 0x71, 0xa0, 0x5, 0x13, 0x4f,\n                                                              0x40, 0x70, 0x7f, 0x75, 0x80, 0x72, 0x1b, 0x5c,\n                                                              0x52, 0xac, 0xb0, 0x73, 0x1f, 0xe3, 0xf7, 0xa,\n                                                              0x8a, 0x81, 0xa3, 0xa6, 0xb4, 0xba, 0x9b, 0x8e,\n                                                              0xb0, 0x93, 0x8, 0xae, 0xfb, 0x68, 0x68, 0x7,\n                                                              0xa6, 0x86, 0xa8, 0x89, 0x6a, 0x1a, 0x68, 0x61,\n                                                              0x61, 0x6b, 0x63, 0x1e, 0x6e, 0xb5, 0x5c, 0xf3,\n                                                              0x81, 0xdc, 0x8, 0xb8, 0x9e, 0xf7, 0x1d, 0xc0,\n                                                              0xf0, 0x1a, 0xc2, 0x5d, 0xc5, 0x2e, 0xfb, 0xb,\n                                                              0x4a, 0x2b, 0xfb, 0x2, 0x6a, 0x91, 0x6b, 0x90,\n                                                              0x70, 0x1e, 0xfb, 0x5, 0x4d, 0xfb, 0x13, 0x75,\n                                                              0xfb, 0x24, 0x1a, 0x13, 0x3f, 0x80, 0xfb, 0x30,\n                                                              0xf7, 0x23, 0x78, 0xb7, 0xb8, 0xd9, 0x92, 0xc3,\n                                                              0xd6, 0x1e, 0x6f, 0xaf, 0x15, 0x13, 0x8f, 0x80,\n                                                              0x80, 0x74, 0x6c, 0x7a, 0x60, 0x1b, 0x30, 0x67,\n                                                              0xdd, 0xc0, 0xe8, 0xc3, 0xac, 0xc6, 0xa9, 0x1f,\n                                                              0x13, 0x3f, 0x80, 0xab, 0xfb, 0x21, 0xb8, 0x43,\n                                                              0xab, 0x59, 0x8, 0x8f, 0xf7, 0xf6, 0x15, 0x84,\n                                                              0xb6, 0x87, 0xa5, 0xa3, 0x1a, 0xc8, 0x92, 0xc8,\n                                                              0xc3, 0xb4, 0x9d, 0x5b, 0x6b, 0x66, 0x78, 0x59,\n                                                              0x2f, 0x5b, 0x1e, 0xe, 0xfc, 0x14, 0xf8, 0x37,\n                                                              0x76, 0xf7, 0xb3, 0x77, 0x1, 0xf7, 0x21, 0xf7,\n                                                              0xb, 0x3, 0xf7, 0x3b, 0xf8, 0x22, 0x15, 0xe4,\n                                                              0xf7, 0x4e, 0x5, 0x92, 0x98, 0x90, 0x9c, 0x9e,\n                                                              0x1a, 0xa6, 0x7f, 0xa4, 0x64, 0x64, 0x71, 0x69,\n                                                              0x64, 0x88, 0x1e, 0x76, 0xfb, 0x6a, 0x5, 0xe,\n                                                              0x84, 0xa, 0xa7, 0xe9, 0x3, 0xf7, 0x3e, 0xfb,\n                                                              0x47, 0x15, 0xa2, 0x9a, 0x5, 0x70, 0xbb, 0x5f,\n                                                              0xf7, 0x26, 0xf7, 0x15, 0x1a, 0xf7, 0xd0, 0xf7,\n                                                              0x26, 0xf7, 0xe, 0xd7, 0xcf, 0x1e, 0x79, 0x9f,\n                                                              0x5, 0xfb, 0x9f, 0xfb, 0x4c, 0x6c, 0xfb, 0x6a,\n                                                              0xfb, 0x14, 0x1a, 0xfb, 0x51, 0xf0, 0x2f, 0xb4,\n                                                              0x52, 0x1e, 0xe, 0x84, 0xa, 0xf7, 0x45, 0xe9,\n                                                              0x3, 0x5f, 0xfb, 0x33, 0x15, 0xf7, 0x1f, 0xf7,\n                                                              0x1c, 0xdd, 0xf7, 0x2, 0xf7, 0x65, 0x1a, 0xdf,\n                                                              0x82, 0xf7, 0x57, 0x4c, 0xea, 0x1e, 0xa2, 0x9a,\n                                                              0x5, 0xdf, 0x22, 0xc6, 0xfb, 0x19, 0xfb, 0x2b,\n                                                              0x1a, 0xfb, 0x5e, 0xfb, 0xb, 0xfb, 0x30, 0xfb,\n                                                              0x47, 0xfb, 0x9, 0x1e, 0xe, 0xf7, 0xa2, 0x76,\n                                                              0xdf, 0xf7, 0x0, 0xc1, 0xf5, 0xdf, 0x77, 0x1,\n                                                              0xf7, 0x69, 0xee, 0xe9, 0xbd, 0x3, 0xf7, 0x87,\n                                                              0xf8, 0x54, 0x15, 0x6e, 0x78, 0x7c, 0x77, 0x7c,\n                                                              0x7a, 0x8, 0x76, 0x7b, 0x77, 0x65, 0x6b, 0x1b,\n                                                              0x72, 0x72, 0x9b, 0xaa, 0xbc, 0xaa, 0x92, 0xc7,\n                                                              0x8e, 0x1f, 0xab, 0x8e, 0xaa, 0x8e, 0x9a, 0x9e,\n                                                              0x8, 0x94, 0x7, 0x7b, 0x96, 0x63, 0x94, 0x72,\n                                                              0x8e, 0x8, 0x57, 0x93, 0x66, 0x87, 0xbd, 0x1a,\n                                                              0xa7, 0x97, 0xa2, 0xb6, 0xa7, 0x98, 0x6f, 0x71,\n                                                              0xa0, 0x1e, 0xa4, 0x6c, 0xa4, 0x70, 0x98, 0x8a,\n                                                              0x92, 0x90, 0x18, 0xb4, 0x81, 0xa0, 0x80, 0x9e,\n                                                              0x1e, 0x80, 0x9e, 0x82, 0x9a, 0xa3, 0x1a, 0xa3,\n                                                              0x97, 0xa8, 0xb0, 0xa7, 0xa0, 0x75, 0x6c, 0x74,\n                                                              0x82, 0x7d, 0x80, 0x78, 0x1e, 0x80, 0x78, 0x82,\n                                                              0x75, 0x60, 0x1a, 0x97, 0x86, 0xaa, 0xa0, 0x99,\n                                                              0x9f, 0x9b, 0xa2, 0x19, 0xa8, 0x9f, 0x96, 0xa0,\n                                                              0xac, 0x1b, 0xae, 0x9a, 0x6c, 0x7b, 0x5b, 0x5c,\n                                                              0x83, 0x5e, 0x88, 0x1f, 0x70, 0x8a, 0x6e, 0x85,\n                                                              0x76, 0x7b, 0x8, 0x81, 0x7, 0x9c, 0x7f, 0xa1,\n                                                              0x84, 0xaf, 0x88, 0x8, 0xb7, 0x88, 0xbd, 0x7d,\n                                                              0x63, 0x1a, 0x5f, 0x5e, 0x86, 0x86, 0x6c, 0x7f,\n                                                              0xa0, 0xb0, 0x70, 0x1e, 0x78, 0xa4, 0x7f, 0x9d,\n                                                              0x70, 0x98, 0x83, 0x85, 0x18, 0x68, 0x93, 0x76,\n                                                              0x93, 0x78, 0x1e, 0x97, 0x70, 0x95, 0x7e, 0x73,\n                                                              0x1a, 0x6f, 0x7b, 0x71, 0x6c, 0x72, 0x72, 0x99,\n                                                              0xb4, 0x8a, 0x1e, 0x8a, 0xa2, 0x99, 0x9a, 0x96,\n                                                              0xa2, 0x8, 0x94, 0x9e, 0x95, 0xa3, 0xaf, 0x1a,\n                                                              0xe, 0x2f, 0xa0, 0x76, 0xf7, 0x70, 0xcc, 0xf7,\n                                                              0x71, 0x77, 0x12, 0xf7, 0x83, 0xe5, 0x3b, 0xcb,\n                                                              0x13, 0xf0, 0xac, 0xf7, 0x70, 0x15, 0x13, 0xe8,\n                                                              0xf7, 0x6c, 0xfb, 0x70, 0xcb, 0xf7, 0x70, 0xf7,\n                                                              0x74, 0xcc, 0xfb, 0x74, 0xf7, 0x71, 0x4b, 0xfb,\n                                                              0x71, 0xfb, 0x6c, 0x6, 0xe, 0xfc, 0x30, 0xfb,\n                                                              0x35, 0x62, 0xa, 0x7f, 0x6d, 0x1d, 0x13, 0xd0,\n                                                              0x4f, 0x81, 0xa, 0xdf, 0x62, 0x1d, 0x9a, 0x70,\n                                                              0x1e, 0x13, 0xe0, 0x62, 0x6e, 0x6c, 0x61, 0x6d,\n                                                              0x9a, 0x7d, 0x9b, 0x7f, 0x1f, 0x13, 0xd0, 0x9e,\n                                                              0x7e, 0x9f, 0x81, 0x75, 0x1a, 0x53, 0x28, 0x57,\n                                                              0x78, 0x81, 0x1e, 0xe, 0xfb, 0xdd, 0xf7, 0x3a,\n                                                              0xf7, 0x8, 0x1, 0x8d, 0xf7, 0x3a, 0x15, 0xf7,\n                                                              0x88, 0x6, 0xa4, 0xf7, 0x8, 0x5, 0xfb, 0x87,\n                                                              0x6, 0xe, 0xfc, 0x30, 0x7e, 0xf7, 0x28, 0x1,\n                                                              0x82, 0xf7, 0x28, 0x3, 0x82, 0xc8, 0x3c, 0xa,\n                                                              0xfc, 0x14, 0x8e, 0x8d, 0x1d, 0x8d, 0x79, 0x15,\n                                                              0xf7, 0xe8, 0xf9, 0x53, 0x5, 0x45, 0x6, 0xfb,\n                                                              0xe4, 0xfd, 0x53, 0x5, 0xe, 0x7d, 0xa8, 0xf9,\n                                                              0x13, 0xa8, 0x1, 0xf8, 0xa, 0xf2, 0x3, 0x9c,\n                                                              0xf7, 0x63, 0x15, 0x30, 0xa4, 0xfb, 0x16, 0xf7,\n                                                              0x13, 0xf7, 0x38, 0xf7, 0x24, 0xf7, 0x82, 0xf7,\n                                                              0x7e, 0xf7, 0x15, 0x4b, 0xeb, 0x32, 0xfb, 0x47,\n                                                              0xfb, 0x14, 0xfb, 0xa2, 0xfb, 0x62, 0x1e, 0xf7,\n                                                              0x4c, 0xf7, 0x81, 0x15, 0xd5, 0xa2, 0xb6, 0xf7,\n                                                              0x1c, 0xc4, 0x1b, 0xb0, 0x98, 0x6b, 0x5a, 0x47,\n                                                              0x32, 0xfc, 0x7e, 0xfb, 0x8, 0xfb, 0xb, 0xf7,\n                                                              0x25, 0xf8, 0x2d, 0x9f, 0x91, 0x1f, 0xe, 0x8b,\n                                                              0xac, 0xf9, 0x1e, 0x77, 0x1, 0x90, 0x16, 0xf7,\n                                                              0xed, 0xac, 0x6, 0x53, 0x60, 0x8e, 0xa9, 0x8f,\n                                                              0x8c, 0x8f, 0x8c, 0x90, 0x1f, 0xf7, 0x3a, 0xf8,\n                                                              0xf0, 0x49, 0x7b, 0x52, 0x7d, 0xfb, 0x27, 0x75,\n                                                              0x19, 0x89, 0x74, 0x5, 0x8e, 0x9f, 0xa6, 0x8d,\n                                                              0x9f, 0x1b, 0x93, 0xae, 0x8a, 0x74, 0x88, 0x8b,\n                                                              0x87, 0x8a, 0x87, 0x1f, 0xfb, 0x18, 0xfc, 0x87,\n                                                              0x80, 0x61, 0x4c, 0x88, 0x5e, 0x8a, 0x19, 0xe,\n                                                              0x8b, 0xf7, 0x3, 0xdb, 0x77, 0xf8, 0x3a, 0xe5,\n                                                              0x1, 0xf7, 0xcc, 0xf7, 0x1a, 0x3, 0x70, 0x16,\n                                                              0xf8, 0x3, 0x6, 0xda, 0xf7, 0x53, 0x5, 0x72,\n                                                              0x6, 0x4d, 0x69, 0x73, 0x79, 0x3a, 0x1b, 0xfb,\n                                                              0x29, 0x6, 0xf7, 0x58, 0xf7, 0x3b, 0x5, 0xcf,\n                                                              0xc5, 0xd7, 0xd5, 0xda, 0x1a, 0xf7, 0x11, 0x51,\n                                                              0xd0, 0x22, 0xfb, 0x11, 0x49, 0x22, 0x50, 0x6f,\n                                                              0x1e, 0xa1, 0x7f, 0x5, 0xa0, 0x99, 0xb6, 0xcc,\n                                                              0xd7, 0x1b, 0xe8, 0x8b, 0x36, 0x78, 0x3e, 0x59,\n                                                              0x3f, 0x52, 0x45, 0x1f, 0x5a, 0x50, 0x8b, 0x8b,\n                                                              0xfb, 0x4b, 0xfb, 0x4b, 0x8, 0xe, 0x7e, 0xb3,\n                                                              0xeb, 0x77, 0xf8, 0x91, 0xd2, 0x12, 0xf7, 0xb1,\n                                                              0xf7, 0xf, 0x34, 0xf7, 0x15, 0x13, 0xf0, 0xf7,\n                                                              0x14, 0xf7, 0xef, 0x15, 0xef, 0xc4, 0x66, 0x27,\n                                                              0x2e, 0x58, 0x31, 0x51, 0x68, 0x76, 0xa4, 0xa4,\n                                                              0x77, 0x1f, 0xa2, 0x78, 0x7b, 0xa2, 0x74, 0x1b,\n                                                              0x7a, 0x63, 0x84, 0x56, 0x80, 0x92, 0x4a, 0xf7,\n                                                              0x14, 0xf7, 0x30, 0xf7, 0x18, 0xec, 0xf7, 0x12,\n                                                              0xf0, 0x6a, 0xc1, 0x5f, 0xab, 0x1f, 0x13, 0xe8,\n                                                              0xf1, 0xbe, 0x9c, 0xb7, 0xb5, 0x1a, 0xe7, 0x3a,\n                                                              0xc4, 0x4a, 0x23, 0x4c, 0x46, 0x4b, 0x63, 0x1e,\n                                                              0xa0, 0x7e, 0x5, 0xae, 0xa6, 0xa6, 0xb3, 0xcb,\n                                                              0x1b, 0xc9, 0xa2, 0x65, 0x63, 0xfb, 0x9, 0xfb,\n                                                              0x25, 0x63, 0x5f, 0x83, 0x1f, 0xe, 0xa0, 0x76,\n                                                              0xf7, 0x2a, 0xed, 0xf8, 0x47, 0x77, 0x1, 0xf7,\n                                                              0x50, 0xf7, 0x14, 0xf7, 0xd, 0xcd, 0x3, 0xf7,\n                                                              0x79, 0xf7, 0x2a, 0x15, 0x62, 0xfb, 0x2a, 0x5,\n                                                              0xf7, 0x14, 0x6, 0xb5, 0xf7, 0x2a, 0x5, 0xcf,\n                                                              0x6, 0xa6, 0xed, 0x5, 0x46, 0x6, 0xf7, 0xb,\n                                                              0xf8, 0x47, 0x5, 0x49, 0x6, 0xfc, 0x3c, 0xfc,\n                                                              0x40, 0x6f, 0x22, 0x5, 0xf7, 0xef, 0xf8, 0xb,\n                                                              0x15, 0x8d, 0x89, 0x3d, 0xfb, 0xa7, 0x5, 0xfb,\n                                                              0x5f, 0x6, 0xe, 0x7e, 0xb3, 0x63, 0xf7, 0x1c,\n                                                              0xf7, 0x8d, 0xf7, 0x4, 0xd7, 0xf7, 0x1, 0x12,\n                                                              0xf7, 0xc7, 0xf4, 0x13, 0xb8, 0xd4, 0xf8, 0x8,\n                                                              0x15, 0xf7, 0x2a, 0xdf, 0x38, 0x25, 0x40, 0x52,\n                                                              0x36, 0x3d, 0x6d, 0x7f, 0xa6, 0xa4, 0x7b, 0x1f,\n                                                              0x13, 0x78, 0xa2, 0x7d, 0x7a, 0xa0, 0x68, 0x1b,\n                                                              0x6f, 0x6c, 0x7b, 0x5f, 0x6d, 0xac, 0x5d, 0xeb,\n                                                              0xf7, 0x29, 0xf7, 0x25, 0xed, 0xf7, 0x3c, 0xe6,\n                                                              0x22, 0xf7, 0x20, 0xfb, 0x24, 0x1f, 0xad, 0xd7,\n                                                              0x5, 0xf7, 0x92, 0x6, 0xaf, 0xf7, 0x1, 0x5,\n                                                              0xfb, 0xaf, 0x6, 0xe, 0x7c, 0xab, 0xf8, 0x1,\n                                                              0xb2, 0xf7, 0x96, 0x77, 0x1, 0xa2, 0xf7, 0x4,\n                                                              0xf7, 0x34, 0xf7, 0x10, 0x3, 0xf7, 0x7b, 0xf8,\n                                                              0x2d, 0x15, 0xbb, 0xee, 0xdd, 0xe8, 0xf7, 0x28,\n                                                              0xc1, 0x85, 0xa3, 0x18, 0xfb, 0xdd, 0x5b, 0xfb,\n                                                              0x2b, 0xfb, 0x8c, 0xfb, 0x4a, 0x1a, 0x3f, 0x9f,\n                                                              0xfb, 0x20, 0xf7, 0x32, 0xf7, 0xf, 0xf7, 0xb,\n                                                              0xf7, 0x1, 0xf7, 0x30, 0xf7, 0x10, 0x4b, 0xba,\n                                                              0x4a, 0x6e, 0x6d, 0x88, 0x82, 0x73, 0x1e, 0x2b,\n                                                              0xfb, 0xce, 0x15, 0xc7, 0xa1, 0xd8, 0xa0, 0xc6,\n                                                              0x1e, 0xde, 0xab, 0x8d, 0x93, 0xb7, 0x1b, 0xca,\n                                                              0x8b, 0x58, 0x77, 0x3f, 0x59, 0xfb, 0x1c, 0x88,\n                                                              0x80, 0x1f, 0x5c, 0x79, 0x72, 0x73, 0x6c, 0x1b,\n                                                              0x53, 0x8a, 0xc0, 0xa4, 0x1f, 0xe, 0xa0, 0x76,\n                                                              0xf8, 0xc0, 0xf7, 0x5, 0x1, 0xde, 0xf8, 0x68,\n                                                              0x3, 0xf7, 0x24, 0x16, 0xf8, 0x11, 0xf9, 0x31,\n                                                              0x5, 0xfc, 0x11, 0x6, 0x34, 0xfb, 0x52, 0x5,\n                                                              0xa5, 0x6, 0xc8, 0xae, 0xa3, 0x9b, 0xf7, 0x1,\n                                                              0x1b, 0xf7, 0xf, 0x6, 0xfb, 0xd6, 0xfc, 0xc0,\n                                                              0x5, 0xe, 0x7e, 0xa9, 0xf9, 0xd, 0xac, 0x12,\n                                                              0x8e, 0xec, 0x94, 0xf7, 0x3, 0xe1, 0xf7, 0x5,\n                                                              0x67, 0xe8, 0x13, 0xf8, 0xf7, 0x4b, 0xf7, 0xe8,\n                                                              0x15, 0x59, 0x7a, 0xfb, 0x16, 0x5e, 0xfb, 0x14,\n                                                              0x1a, 0x6b, 0x9b, 0xfb, 0x17, 0xf7, 0x49, 0xf7,\n                                                              0x9, 0xf1, 0xdd, 0xf7, 0x11, 0xe5, 0x50, 0xca,\n                                                              0x70, 0xa8, 0x1e, 0x90, 0x7, 0x13, 0xf4, 0xd8,\n                                                              0xaa, 0xcd, 0xb6, 0xe2, 0x1a, 0xf7, 0x1, 0xfb,\n                                                              0xc, 0xab, 0x55, 0xfb, 0x2, 0x38, 0x39, 0x43,\n                                                              0x3e, 0xb4, 0x43, 0xac, 0x68, 0x1e, 0xa5, 0x73,\n                                                              0x15, 0x13, 0xf8, 0xd7, 0x31, 0xa0, 0x71, 0x4f,\n                                                              0x1a, 0x4c, 0x65, 0x4a, 0x47, 0x39, 0x79, 0xd7,\n                                                              0xb7, 0xea, 0xbe, 0xbd, 0xc5, 0xb2, 0x1e, 0xf0,\n                                                              0xdd, 0x15, 0x5b, 0xb8, 0x61, 0xb7, 0xc8, 0x1a,\n                                                              0xb5, 0xa2, 0xc2, 0xc6, 0x1e, 0x13, 0xf4, 0xba,\n                                                              0xad, 0x65, 0x45, 0x4b, 0x65, 0x65, 0x68, 0x66,\n                                                              0x1f, 0xe, 0x96, 0x76, 0xf7, 0x93, 0x77, 0xf8,\n                                                              0x3e, 0xab, 0x1, 0xf7, 0x45, 0xf7, 0xf8, 0x15,\n                                                              0xa0, 0x9e, 0xf7, 0x1c, 0xaf, 0xd1, 0x1e, 0xb2,\n                                                              0x9f, 0xa6, 0xa8, 0xad, 0x1b, 0xbe, 0x8a, 0x5c,\n                                                              0x6e, 0x88, 0x88, 0x2e, 0x63, 0x25, 0x1f, 0x37,\n                                                              0x6b, 0x7c, 0x86, 0x6c, 0x1b, 0x7c, 0x59, 0x8c,\n                                                              0xce, 0x1f, 0xfb, 0x4b, 0xfc, 0x2, 0x15, 0xf7,\n                                                              0xfc, 0xbe, 0xf7, 0xd, 0xf7, 0xa7, 0xf7, 0x2a,\n                                                              0x1a, 0xf7, 0x18, 0x57, 0xe0, 0xfb, 0x2, 0xfb,\n                                                              0x41, 0x34, 0xfb, 0x2f, 0xfb, 0x8, 0x28, 0xc7,\n                                                              0x47, 0xe6, 0xa6, 0x9b, 0x91, 0x93, 0x9d, 0x1e,\n                                                              0x55, 0xfb, 0x9, 0x21, 0x2c, 0xfb, 0x9, 0x6b,\n                                                              0x8, 0xe, 0xfb, 0xdd, 0x7e, 0xf7, 0x26, 0xf7,\n                                                              0x47, 0xf7, 0x27, 0x12, 0xa2, 0xf7, 0x28, 0x54,\n                                                              0xf7, 0x28, 0x13, 0xe0, 0xa2, 0xc8, 0x43, 0x1d,\n                                                              0xaa, 0x62, 0x60, 0x6c, 0x6b, 0x63, 0x1e, 0x13,\n                                                              0xd0, 0xe8, 0xf7, 0xd9, 0x43, 0x1d, 0xab, 0x62,\n                                                              0x60, 0x6c, 0x6a, 0x63, 0x1e, 0xe, 0xfb, 0xdd,\n                                                              0xfb, 0x36, 0x76, 0xf7, 0xd0, 0x77, 0xf7, 0x5b,\n                                                              0xf7, 0x27, 0x1, 0xa2, 0x6d, 0x1d, 0x4c, 0xf7,\n                                                              0x28, 0x3, 0x72, 0xfb, 0x33, 0x15, 0x9e, 0x96,\n                                                              0xee, 0xbc, 0xc4, 0x1a, 0xa2, 0x79, 0x93, 0x78,\n                                                              0x98, 0x1e, 0x7a, 0x97, 0x7b, 0x99, 0xaa, 0x1a,\n                                                              0xb6, 0xa8, 0xaa, 0xb4, 0xa7, 0xc5, 0x7a, 0x3c,\n                                                              0xfb, 0x18, 0xfb, 0x44, 0x37, 0x7c, 0x87, 0x1e,\n                                                              0xf7, 0x14, 0xf8, 0xcd, 0x15, 0xb3, 0xaa, 0xac,\n                                                              0xb6, 0xb4, 0xac, 0x6b, 0x62, 0x60, 0x6a, 0x6c,\n                                                              0x62, 0x5f, 0x6d, 0xac, 0xb4, 0x1e, 0xe, 0x2f,\n                                                              0x98, 0x76, 0xf8, 0x9e, 0x77, 0x1, 0xaa, 0xf8,\n                                                              0x90, 0x3, 0xf8, 0x7d, 0x83, 0x15, 0xcf, 0x7,\n                                                              0xfc, 0x6, 0xf7, 0x55, 0xf8, 0x38, 0xf7, 0x55,\n                                                              0x5, 0xcf, 0x7, 0xfc, 0x90, 0xfb, 0x7d, 0x5,\n                                                              0x53, 0x7, 0xe, 0x2f, 0xf1, 0xe5, 0xdd, 0xe4,\n                                                              0x67, 0xcf, 0x12, 0x13, 0xa0, 0xde, 0xf7, 0xdf,\n                                                              0x15, 0xf8, 0x5a, 0xcf, 0xfc, 0x5a, 0x6, 0x59,\n                                                              0xfb, 0xb8, 0x15, 0xf8, 0x5a, 0x6, 0x13, 0xc0,\n                                                              0xcc, 0xfc, 0x5a, 0x7, 0xe, 0x2f, 0x98, 0x76,\n                                                              0xf8, 0x9e, 0x77, 0x1, 0xf8, 0xaf, 0xf7, 0x75,\n                                                              0x15, 0xc3, 0x7, 0xfc, 0x5e, 0xf7, 0x7d, 0x5,\n                                                              0x47, 0x7, 0xf8, 0x6, 0xfb, 0x55, 0xfc, 0x38,\n                                                              0xfb, 0x55, 0x5, 0x47, 0x7, 0xe, 0x7e, 0xf7,\n                                                              0x28, 0xf7, 0xf5, 0xf7, 0x58, 0x6c, 0xaa, 0x12,\n                                                              0xda, 0xf7, 0x28, 0xfb, 0x0, 0xf7, 0xe, 0xf1,\n                                                              0xf7, 0x13, 0x13, 0xcc, 0xf7, 0x3b, 0xf7, 0x6b,\n                                                              0x15, 0xa8, 0x84, 0xa3, 0xc6, 0x9a, 0xaa, 0xb6,\n                                                              0xa7, 0x19, 0xf7, 0x19, 0xe2, 0xc6, 0xbc, 0xd9,\n                                                              0x1a, 0xba, 0x65, 0xec, 0xfb, 0x29, 0xfb, 0x1,\n                                                              0x54, 0x4d, 0x47, 0x67, 0xa5, 0x6d, 0xae, 0xab,\n                                                              0xa8, 0xa4, 0xad, 0x9f, 0x83, 0x98, 0x83, 0x95,\n                                                              0x1e, 0x84, 0x94, 0x85, 0x92, 0x94, 0x1a, 0x13,\n                                                              0xb4, 0xa0, 0xb6, 0x9c, 0xa7, 0xaa, 0xa8, 0x7b,\n                                                              0x49, 0x55, 0x71, 0x59, 0x3c, 0x2e, 0x1e, 0x4e,\n                                                              0x3f, 0x84, 0x59, 0x88, 0x6a, 0x8, 0x33, 0xfb,\n                                                              0x2e, 0x3c, 0xa, 0xf7, 0x3e, 0x79, 0xb9, 0xf7,\n                                                              0x6, 0xb0, 0x66, 0xbb, 0x5c, 0x77, 0xe7, 0x77,\n                                                              0xf7, 0xa4, 0xbb, 0xf7, 0x17, 0xb2, 0x12, 0xca,\n                                                              0xe6, 0xf7, 0xa, 0xd7, 0xf8, 0xc, 0xb9, 0x13,\n                                                              0xaf, 0xc0, 0xf7, 0xf0, 0xf7, 0xaa, 0x15, 0xf7,\n                                                              0xc, 0xe3, 0xd0, 0xbb, 0xa8, 0x9a, 0x75, 0x60,\n                                                              0xfb, 0x22, 0x40, 0x45, 0x5f, 0x6a, 0x6f, 0xa7,\n                                                              0xc7, 0x1e, 0xf7, 0x22, 0x4c, 0x15, 0x7e, 0xa2,\n                                                              0x4f, 0xcf, 0xf7, 0xd, 0xcf, 0xf7, 0x1e, 0xf3,\n                                                              0xf7, 0x40, 0xfb, 0x27, 0xf7, 0x15, 0xfb, 0x50,\n                                                              0xfb, 0x5c, 0xfb, 0x40, 0xfb, 0x28, 0xfb, 0x70,\n                                                              0xfb, 0x1d, 0xf7, 0x8, 0xfb, 0x5a, 0xf7, 0x9e,\n                                                              0xdb, 0xd1, 0xa7, 0xaa, 0xcc, 0x1e, 0x7e, 0xae,\n                                                              0x5, 0x70, 0x50, 0x57, 0x76, 0x30, 0x1b, 0xfb,\n                                                              0x3f, 0xfb, 0xc, 0xf7, 0x25, 0xf7, 0x24, 0xf7,\n                                                              0x77, 0xf7, 0x19, 0xf1, 0xf7, 0x28, 0xf7, 0x4b,\n                                                              0xf5, 0xfb, 0x26, 0xfb, 0x8, 0x1f, 0x13, 0xcf,\n                                                              0xc0, 0x34, 0x59, 0xfb, 0xa, 0x3e, 0x6c, 0x85,\n                                                              0xa4, 0x9f, 0x92, 0x8c, 0x91, 0x8c, 0x92, 0x1e,\n                                                              0xcc, 0xf7, 0x95, 0x5, 0x44, 0x6, 0x80, 0x65,\n                                                              0x5, 0xa4, 0x7d, 0x81, 0xa6, 0x5b, 0x1b, 0xfb,\n                                                              0x1d, 0x4b, 0xfb, 0x35, 0x3f, 0x1f, 0x13, 0x9f,\n                                                              0xc0, 0xfb, 0x3, 0xd0, 0x73, 0xa8, 0xc7, 0xba,\n                                                              0xc3, 0x9b, 0x96, 0x1e, 0xe, 0x51, 0x1d, 0x1,\n                                                              0x40, 0xf9, 0x28, 0x3, 0xf7, 0x15, 0x16, 0xae,\n                                                              0x7, 0x5f, 0x76, 0x9e, 0x9f, 0x90, 0x8d, 0x90,\n                                                              0x8e, 0x92, 0x3f, 0xa, 0x5b, 0x69, 0x83, 0x5e,\n                                                              0x2c, 0xa, 0x68, 0x7, 0xf8, 0xc, 0xf8, 0x7f,\n                                                              0x15, 0x74, 0x1d, 0xfb, 0x4d, 0x6, 0xe, 0x90,\n                                                              0x8b, 0xab, 0xf7, 0xc6, 0xa9, 0xf7, 0xa1, 0xae,\n                                                              0x12, 0xf8, 0x3e, 0xf7, 0x2d, 0x25, 0xea, 0x2c,\n                                                              0xf7, 0x27, 0x13, 0xf0, 0x73, 0x16, 0xf7, 0xaf,\n                                                              0x6, 0xf7, 0x27, 0xf7, 0x3a, 0xbe, 0xf7, 0x31,\n                                                              0xf1, 0x38, 0xa7, 0x58, 0x9b, 0x1f, 0x8d, 0x7,\n                                                              0x13, 0xe4, 0xcd, 0x9b, 0xf7, 0xc, 0xaf, 0xf7,\n                                                              0xd, 0x1a, 0xf7, 0x1f, 0xfb, 0x45, 0x8c, 0x50,\n                                                              0x1e, 0xfb, 0xa4, 0x68, 0x6, 0xb5, 0xaa, 0x86,\n                                                              0x63, 0x1f, 0xfb, 0x19, 0xfc, 0x76, 0x7a, 0x4d,\n                                                              0x6f, 0x86, 0x68, 0x86, 0x19, 0xf7, 0xb9, 0xf7,\n                                                              0xc3, 0x15, 0x13, 0xf0, 0xd3, 0xd9, 0x76, 0xfb,\n                                                              0x1, 0x5f, 0x72, 0xfb, 0x18, 0xfb, 0x1b, 0x65,\n                                                              0x74, 0x95, 0xa4, 0x93, 0x8c, 0x93, 0x8f, 0x96,\n                                                              0x1f, 0xd5, 0xf7, 0xa6, 0x15, 0xc8, 0xf7, 0x75,\n                                                              0x5, 0x9f, 0x90, 0x91, 0xa3, 0xb1, 0x1b, 0x13,\n                                                              0xe8, 0xd1, 0x9f, 0x55, 0x55, 0xfb, 0x38, 0xfb,\n                                                              0xc, 0x8e, 0x3b, 0x1f, 0xe, 0x90, 0x79, 0xc0,\n                                                              0xf8, 0xfb, 0xae, 0x1, 0xab, 0xf7, 0x2e, 0x3,\n                                                              0xf8, 0xb6, 0xf7, 0x2d, 0x15, 0x2f, 0x42, 0x4b,\n                                                              0x71, 0x3c, 0x1b, 0x7d, 0xfb, 0x16, 0x9f, 0xf7,\n                                                              0x47, 0xf7, 0x45, 0xf3, 0xf7, 0x83, 0xf7, 0x35,\n                                                              0xe3, 0xc5, 0x49, 0x32, 0x7f, 0x8a, 0x7e, 0x89,\n                                                              0x7e, 0x81, 0x1d, 0x81, 0x83, 0x7e, 0x75, 0x1b,\n                                                              0x82, 0x7f, 0x8f, 0x90, 0x7c, 0x1f, 0x94, 0x70,\n                                                              0x65, 0x96, 0x54, 0x1b, 0xfb, 0x87, 0xfb, 0x44,\n                                                              0xfb, 0x79, 0xfb, 0x72, 0xfb, 0x49, 0xf7, 0x22,\n                                                              0x44, 0xf7, 0x16, 0xf7, 0x16, 0xe6, 0xd3, 0xd8,\n                                                              0xbe, 0x1f, 0xe, 0xc7, 0x8b, 0xad, 0xf8, 0xf0,\n                                                              0xaa, 0x1, 0xf8, 0xae, 0xf7, 0x27, 0x3, 0xf7,\n                                                              0x52, 0xf7, 0x12, 0x15, 0xf7, 0x14, 0xf8, 0x6e,\n                                                              0x80, 0x1d, 0xfb, 0x2c, 0x2c, 0x25, 0x60, 0xfb,\n                                                              0x93, 0xfb, 0x97, 0x61, 0x7d, 0x99, 0xa3, 0x9a,\n                                                              0x8f, 0x9d, 0x77, 0xa, 0x8c, 0xf7, 0x13, 0xf7,\n                                                              0x73, 0x5d, 0xa, 0x77, 0x83, 0x72, 0xfb, 0xa,\n                                                              0xfc, 0x37, 0x1e, 0x75, 0x3d, 0x6b, 0x83, 0x6a,\n                                                              0x86, 0x8, 0xe, 0x51, 0xa, 0x1, 0x70, 0x16,\n                                                              0x37, 0x1d, 0x55, 0x7d, 0x95, 0x9c, 0x98, 0x93,\n                                                              0x9b, 0x90, 0x9e, 0x7e, 0xa, 0xf7, 0x4, 0xab,\n                                                              0x6f, 0x4c, 0x7e, 0x89, 0x7d, 0x89, 0x7b, 0x2a,\n                                                              0xa, 0xe, 0x90, 0xa0, 0x76, 0xf7, 0xe6, 0xab,\n                                                              0xf7, 0x9f, 0xab, 0x1, 0x7e, 0x16, 0xf7, 0xbb,\n                                                              0x6, 0x90, 0xae, 0x5, 0x5d, 0x71, 0x96, 0xa2,\n                                                              0x8e, 0x8b, 0x8f, 0x8c, 0x8f, 0x1f, 0xcb, 0xf7,\n                                                              0x96, 0x5, 0xf7, 0x2, 0xa6, 0x6c, 0x4e, 0x7e,\n                                                              0x89, 0x7d, 0x89, 0x7c, 0x4c, 0xa, 0x5, 0x37,\n                                                              0x5f, 0x7f, 0x75, 0xfb, 0x22, 0x1b, 0xc8, 0xf7,\n                                                              0x73, 0x5, 0xab, 0x94, 0x96, 0x97, 0xb2, 0x1b,\n                                                              0xf7, 0x49, 0x8b, 0x36, 0x47, 0x1f, 0xa6, 0x86,\n                                                              0xb6, 0xf7, 0x52, 0x5, 0xfc, 0xa9, 0x68, 0x6,\n                                                              0xbd, 0x85, 0xa4, 0x87, 0x7a, 0x8b, 0xa, 0x85,\n                                                              0x1e, 0xfb, 0x14, 0xfc, 0x94, 0x82, 0x67, 0x6c,\n                                                              0x89, 0x63, 0x84, 0x19, 0xe, 0xc7, 0x79, 0xb1,\n                                                              0xf7, 0xa6, 0xaf, 0xf7, 0xd3, 0xaf, 0x1, 0xa0,\n                                                              0xf7, 0x30, 0x3, 0xf8, 0x37, 0xf7, 0xba, 0x15,\n                                                              0xb9, 0x87, 0xaa, 0x88, 0x65, 0x1a, 0x84, 0x8a,\n                                                              0x81, 0x89, 0x81, 0x1e, 0x84, 0x68, 0x60, 0xfb,\n                                                              0x10, 0x87, 0x84, 0x8, 0x74, 0x7d, 0x60, 0x7e,\n                                                              0x5f, 0x1b, 0x6a, 0xfb, 0x14, 0xbd, 0xf7, 0x3f,\n                                                              0xf7, 0x67, 0xf4, 0xf7, 0x59, 0xf7, 0x34, 0xf7,\n                                                              0x3, 0xbb, 0x3b, 0x26, 0x1f, 0xa8, 0x87, 0xbe,\n                                                              0xf7, 0x71, 0x5, 0x6c, 0x6, 0x81, 0x86, 0x82,\n                                                              0x77, 0x6f, 0x1b, 0x7e, 0x80, 0x90, 0x90, 0x7c,\n                                                              0x1f, 0x94, 0x73, 0x68, 0x96, 0x47, 0x1b, 0xfb,\n                                                              0x99, 0xfb, 0x34, 0xfb, 0x88, 0xfb, 0x5c, 0xfb,\n                                                              0x45, 0xf7, 0x1c, 0x39, 0xf7, 0x39, 0xd7, 0xf7,\n                                                              0x7, 0xa4, 0xa4, 0xc1, 0x1f, 0x97, 0x94, 0xbb,\n                                                              0xf7, 0x49, 0x9d, 0xd0, 0x93, 0x8a, 0xc0, 0x8f,\n                                                              0x19, 0xaf, 0xfb, 0xb3, 0x7, 0xe, 0xf7, 0x8,\n                                                              0x8b, 0xae, 0xf7, 0xba, 0xb7, 0xf7, 0x99, 0xae,\n                                                              0x1, 0x73, 0x16, 0x75, 0x1d, 0x5e, 0x8e, 0x6e,\n                                                              0x95, 0xa5, 0x1a, 0x8f, 0x8c, 0x8f, 0x8c, 0x90,\n                                                              0x1e, 0xcd, 0xf7, 0x86, 0x5, 0xf7, 0x83, 0x6,\n                                                              0x4c, 0xfb, 0x86, 0x83, 0x6b, 0x79, 0x7a, 0x3f,\n                                                              0x88, 0x19, 0x68, 0xf7, 0xd1, 0xae, 0x7, 0x69,\n                                                              0x8c, 0x64, 0x97, 0xa7, 0x1a, 0x8e, 0x8b, 0x8f,\n                                                              0x8c, 0x8f, 0x1e, 0xf7, 0x19, 0xf8, 0x79, 0x9b,\n                                                              0xc9, 0xa4, 0x85, 0xb3, 0x91, 0x19, 0x61, 0xa,\n                                                              0xc0, 0x83, 0xa1, 0x7b, 0x74, 0x1a, 0x86, 0x8a,\n                                                              0x86, 0x8a, 0x86, 0x1e, 0x52, 0xfb, 0x5b, 0x5,\n                                                              0xfb, 0x83, 0x6, 0xc1, 0xf7, 0x5b, 0x9b, 0xc7,\n                                                              0xa8, 0x8b, 0xc3, 0x8d, 0x82, 0xa, 0xbe, 0x84,\n                                                              0xa3, 0x7b, 0x74, 0x1a, 0x86, 0x8a, 0x86, 0x8a,\n                                                              0x85, 0x1e, 0xfb, 0x18, 0xfc, 0x79, 0x80, 0x62,\n                                                              0x6a, 0x86, 0x66, 0x85, 0x19, 0xe, 0xfb, 0xa5,\n                                                              0xa0, 0x76, 0xf9, 0xe, 0xae, 0x1, 0x6b, 0x16,\n                                                              0x75, 0x1d, 0x60, 0x8d, 0x6e, 0x9b, 0xa4, 0x1a,\n                                                              0x90, 0x8b, 0x90, 0x8c, 0x90, 0x1e, 0xf7, 0x21,\n                                                              0xf8, 0x77, 0x9a, 0xbe, 0x9e, 0x8d, 0x56, 0x1d,\n                                                              0xc5, 0x86, 0xa0, 0x75, 0x88, 0x7a, 0x8a, 0x86,\n                                                              0x8a, 0x86, 0x8a, 0x87, 0xfb, 0x18, 0xfc, 0x77,\n                                                              0x18, 0x80, 0x61, 0x70, 0x81, 0x60, 0x85, 0x8,\n                                                              0xe, 0x45, 0xf7, 0x3f, 0xf8, 0xcc, 0x77, 0x12,\n                                                              0x5d, 0xf7, 0x13, 0xfb, 0x13, 0xf8, 0xce, 0x13,\n                                                              0xe0, 0xf7, 0x77, 0xf9, 0xe, 0x15, 0xbd, 0x84,\n                                                              0xa4, 0x7c, 0x73, 0x8b, 0xa, 0x84, 0x1e, 0x22,\n                                                              0xfc, 0x2d, 0x5, 0xfb, 0xb, 0x6b, 0x5d, 0x61,\n                                                              0x73, 0x1b, 0x81, 0x86, 0x92, 0x99, 0x98, 0x8f,\n                                                              0x8f, 0x92, 0x92, 0x1f, 0x92, 0x92, 0x90, 0x92,\n                                                              0x9e, 0x1a, 0xaf, 0x6e, 0xa5, 0x68, 0x68, 0x6f,\n                                                              0x6f, 0x60, 0x4e, 0xd1, 0x64, 0xdc, 0xf7, 0x18,\n                                                              0xbe, 0xe5, 0xf1, 0xa6, 0x1e, 0xf7, 0x0, 0xf8,\n                                                              0x2d, 0x5, 0x13, 0xd0, 0x9e, 0xc4, 0x9a, 0x88,\n                                                              0xba, 0x93, 0x8, 0xae, 0xfb, 0xbd, 0x7, 0xe,\n                                                              0x90, 0xa0, 0x76, 0xf9, 0x31, 0x77, 0x1, 0x76,\n                                                              0x16, 0xf7, 0xb5, 0xae, 0x6, 0x64, 0x70, 0x98,\n                                                              0xad, 0x90, 0x8c, 0x90, 0x8c, 0x91, 0x1f, 0xcb,\n                                                              0xf7, 0x79, 0x93, 0x89, 0x5, 0xf7, 0x1, 0xfb,\n                                                              0x7d, 0x97, 0x74, 0x88, 0x1a, 0x74, 0x84, 0x8a,\n                                                              0x51, 0x84, 0x1e, 0x68, 0xf7, 0xac, 0xae, 0x7,\n                                                              0x71, 0x8e, 0x74, 0x8d, 0x7d, 0xa9, 0xfb, 0x31,\n                                                              0xf7, 0xdc, 0x18, 0xf7, 0x6c, 0xf7, 0x50, 0xb8,\n                                                              0xb5, 0x98, 0x8c, 0xaf, 0x90, 0x19, 0xae, 0xfb,\n                                                              0x67, 0x68, 0x7, 0xb2, 0x87, 0x9c, 0x89, 0x75,\n                                                              0x1a, 0x72, 0xfb, 0x78, 0xfb, 0x44, 0x64, 0x54,\n                                                              0x1e, 0x86, 0x8c, 0xc7, 0xf7, 0x71, 0x9b, 0xc5,\n                                                              0xa7, 0x8b, 0xbd, 0x8f, 0x19, 0xae, 0xfb, 0xca,\n                                                              0x68, 0x7, 0xbd, 0x84, 0xa4, 0x7c, 0x74, 0x7c,\n                                                              0x1d, 0x79, 0x4b, 0x70, 0x88, 0x68, 0x86, 0x19,\n                                                              0xe, 0x53, 0x1d, 0x55, 0x7e, 0x96, 0x9d, 0x94,\n                                                              0x8f, 0x96, 0x8e, 0x98, 0x1f, 0xf7, 0x15, 0xf8,\n                                                              0x72, 0x9b, 0xc7, 0xa8, 0x8a, 0xc3, 0x8e, 0x82,\n                                                              0xa, 0xbf, 0x84, 0xa2, 0x7b, 0x75, 0x7c, 0x1d,\n                                                              0x7b, 0x52, 0x76, 0x82, 0x60, 0x85, 0x19, 0xe,\n                                                              0xf7, 0x77, 0x8b, 0xae, 0x71, 0x76, 0xf7, 0x60,\n                                                              0x77, 0xf8, 0x85, 0x77, 0x12, 0x13, 0xb0, 0x6e,\n                                                              0x16, 0xf7, 0x63, 0xae, 0x6, 0x50, 0x79, 0xa3,\n                                                              0xac, 0xa5, 0x93, 0xab, 0x93, 0xa7, 0x1f, 0xef,\n                                                              0xf8, 0x0, 0x5, 0x8d, 0x6, 0x13, 0x70, 0xcd,\n                                                              0xfc, 0xbe, 0x5, 0xa7, 0x6, 0xf8, 0x7, 0xf8,\n                                                              0xca, 0x8d, 0x89, 0xfb, 0xf, 0xfc, 0x47, 0x5,\n                                                              0x13, 0xb0, 0x7b, 0x50, 0x6f, 0x78, 0x53, 0x87,\n                                                              0x8, 0x68, 0xf7, 0xcc, 0xae, 0x7, 0x55, 0x7a,\n                                                              0x96, 0xa0, 0x98, 0x8f, 0x9c, 0x90, 0x9f, 0x1f,\n                                                              0xf7, 0xf, 0xf8, 0x51, 0x9b, 0xc9, 0xa4, 0x8f,\n                                                              0xb3, 0x91, 0x19, 0xae, 0xfb, 0x68, 0x7, 0xfb,\n                                                              0xc8, 0xfc, 0x71, 0x6f, 0xa, 0x55, 0xf8, 0x71,\n                                                              0x5, 0xfb, 0x71, 0x68, 0x6, 0xc0, 0x89, 0x9e,\n                                                              0x89, 0x6c, 0x1a, 0xfb, 0xc, 0xfc, 0x39, 0x63,\n                                                              0xfb, 0x1e, 0x7f, 0x92, 0x5a, 0x7f, 0x19, 0xe,\n                                                              0x8b, 0x1d, 0x12, 0x13, 0xa0, 0x70, 0x16, 0xf7,\n                                                              0x64, 0xae, 0x6, 0x51, 0x79, 0x9d, 0xb0, 0x9a,\n                                                              0x8e, 0x9b, 0x90, 0x9c, 0x1f, 0xf4, 0xf8, 0x20,\n                                                              0x5, 0x13, 0x60, 0x59, 0xa, 0x8d, 0x96, 0x94,\n                                                              0x8a, 0x93, 0x1b, 0xaf, 0x97, 0x72, 0x6b, 0x6f,\n                                                              0x85, 0x6a, 0x83, 0x71, 0x64, 0x1d, 0xfb, 0x12,\n                                                              0xfc, 0x57, 0x18, 0x13, 0xa0, 0x6d, 0x21, 0x80,\n                                                              0x9b, 0x55, 0x7e, 0x8, 0xe, 0xc7, 0x79, 0xad,\n                                                              0xf9, 0xf, 0xad, 0x1, 0x4d, 0xa, 0x3, 0xf7,\n                                                              0x3f, 0xf7, 0x2a, 0x15, 0xe7, 0xe0, 0xf8, 0x2d,\n                                                              0xf7, 0x4c, 0xf3, 0x8e, 0x21, 0x76, 0xfb, 0x8,\n                                                              0x2f, 0xfc, 0x1c, 0xfb, 0x46, 0x50, 0x5c, 0xad,\n                                                              0x55, 0x1d, 0xd4, 0xfb, 0x14, 0xf7, 0x3b, 0xf7,\n                                                              0x8d, 0xf7, 0x43, 0xf7, 0x9e, 0xf7, 0x56, 0xf7,\n                                                              0x42, 0xfb, 0x1b, 0xd0, 0xfb, 0x1, 0xfb, 0x6f,\n                                                              0xfb, 0x5d, 0xfb, 0x7d, 0xfb, 0x89, 0x1e, 0xe,\n                                                              0x58, 0xa0, 0x76, 0xf7, 0xd6, 0xab, 0xf7, 0xaf,\n                                                              0xab, 0x1, 0xf8, 0x67, 0xf7, 0x26, 0x3, 0xf7,\n                                                              0xa1, 0xf7, 0xf6, 0x6f, 0x1d, 0x23, 0x54, 0x55,\n                                                              0xfb, 0x23, 0x1f, 0xfb, 0xbc, 0xfb, 0xf6, 0x15,\n                                                              0xf7, 0xba, 0xae, 0x6, 0x5a, 0x78, 0xa3, 0xb2,\n                                                              0x97, 0x8e, 0x98, 0x8e, 0x99, 0x1f, 0xc1, 0xf7,\n                                                              0x4d, 0x5, 0xf7, 0x27, 0xf7, 0x63, 0xa4, 0xf7,\n                                                              0x39, 0xf7, 0x12, 0x20, 0xaa, 0x21, 0x1f, 0xfb,\n                                                              0xb3, 0x68, 0x6, 0xbe, 0x84, 0xa3, 0x88, 0x79,\n                                                              0x8b, 0xa, 0x86, 0x1e, 0xfb, 0xf, 0xfc, 0x5b,\n                                                              0x7a, 0x4d, 0x6a, 0x6a, 0x63, 0x84, 0x19, 0xe,\n                                                              0xc7, 0xfb, 0x64, 0xe8, 0x5d, 0xf7, 0x46, 0x69,\n                                                              0xad, 0xf9, 0xe, 0xad, 0x12, 0x4d, 0xa, 0x13,\n                                                              0x5c, 0xf7, 0x3f, 0xf7, 0x2a, 0x15, 0xe7, 0xe2,\n                                                              0xf8, 0x2d, 0xf7, 0x4c, 0xf3, 0x8c, 0x23, 0x76,\n                                                              0xfb, 0x8, 0x2d, 0xfc, 0x1d, 0xfb, 0x46, 0x50,\n                                                              0x5e, 0xac, 0xef, 0x1e, 0xfb, 0x23, 0xfb, 0xcf,\n                                                              0x15, 0x99, 0x73, 0x5, 0xa2, 0xc4, 0xad, 0x90,\n                                                              0xa0, 0x1b, 0xbe, 0xae, 0x7b, 0x7e, 0xb6, 0x1f,\n                                                              0x13, 0xbc, 0x81, 0xab, 0xaf, 0x83, 0xbc, 0x1b,\n                                                              0xf7, 0x20, 0xd2, 0xe3, 0xc8, 0xb7, 0x1f, 0x76,\n                                                              0x9e, 0x5, 0x58, 0x6b, 0x51, 0x73, 0x4e, 0x1b,\n                                                              0x6e, 0x6c, 0x8e, 0x94, 0x70, 0x1f, 0x57, 0x9b,\n                                                              0x5e, 0x93, 0x69, 0x8f, 0x8, 0x66, 0x90, 0x75,\n                                                              0x8c, 0x8f, 0x1a, 0x90, 0xaa, 0xa8, 0x9a, 0x99,\n                                                              0x1e, 0xf7, 0x86, 0xf7, 0x59, 0xf7, 0x91, 0xf7,\n                                                              0x64, 0xf7, 0x42, 0xfb, 0x19, 0xce, 0x5d, 0x1d,\n                                                              0xfb, 0x7d, 0xfb, 0x89, 0x38, 0xbc, 0x27, 0xf7,\n                                                              0x5, 0x6c, 0x1f, 0x95, 0x87, 0x8b, 0x8b, 0x8f,\n                                                              0x86, 0x88, 0x85, 0x8b, 0x8b, 0xfb, 0x40, 0xfb,\n                                                              0x23, 0x8, 0xe, 0x90, 0xa0, 0x76, 0xf9, 0x11,\n                                                              0xab, 0x1, 0xf8, 0x6c, 0xf7, 0x2b, 0x3, 0xf7,\n                                                              0xa5, 0xf7, 0xff, 0x15, 0xc7, 0xf7, 0x7a, 0x5,\n                                                              0xa2, 0x90, 0x92, 0xa0, 0xac, 0x1b, 0xcb, 0xa9,\n                                                              0x56, 0x4f, 0x25, 0x3b, 0x50, 0xfb, 0xb, 0x1f,\n                                                              0xfb, 0xc2, 0xfb, 0xff, 0x8e, 0x1d, 0x66, 0x71,\n                                                              0x8e, 0xb0, 0x94, 0x8d, 0x95, 0x8e, 0x98, 0x1f,\n                                                              0xc2, 0xf7, 0x74, 0x5, 0xa8, 0x6, 0xf6, 0xfb,\n                                                              0xdf, 0x5, 0xf7, 0x5e, 0xae, 0x6, 0x5b, 0x90,\n                                                              0x79, 0x8d, 0x75, 0xcc, 0x38, 0xf7, 0x80, 0x18,\n                                                              0xf7, 0x17, 0xa0, 0xc8, 0xdf, 0xd7, 0x1a, 0xf7,\n                                                              0x25, 0xfb, 0x44, 0x8b, 0x4f, 0x1e, 0xfb, 0xa8,\n                                                              0x68, 0x6, 0xbf, 0x84, 0xa2, 0x82, 0x77, 0x1a,\n                                                              0x87, 0x8a, 0x87, 0x8a, 0x84, 0x1e, 0xfb, 0x19,\n                                                              0xfc, 0x70, 0x7b, 0x52, 0x77, 0x81, 0x5f, 0x86,\n                                                              0x19, 0xe, 0x21, 0x79, 0xad, 0xf9, 0xe, 0xae,\n                                                              0x87, 0x85, 0x1d, 0x13, 0xd8, 0x8d, 0x79, 0x15,\n                                                              0xa9, 0x6, 0xa2, 0x96, 0x8f, 0x97, 0xa4, 0x1b,\n                                                              0x98, 0x9a, 0x84, 0x83, 0xa2, 0x1f, 0x82, 0xa6,\n                                                              0xaa, 0x80, 0xb4, 0x1b, 0xf7, 0x30, 0xe5, 0xf7,\n                                                              0x0, 0xf7, 0x18, 0xd3, 0x54, 0xc2, 0x51, 0xb8,\n                                                              0x1f, 0x4b, 0xbe, 0x47, 0xb6, 0xc2, 0x1a, 0x97,\n                                                              0x84, 0xea, 0xf1, 0xf7, 0x6, 0xa6, 0xfb, 0x2,\n                                                              0x53, 0x1e, 0xa6, 0x87, 0x5, 0x13, 0xb8, 0xb3,\n                                                              0xf7, 0x5d, 0x5, 0x6d, 0x6, 0x72, 0x7e, 0x70,\n                                                              0x8a, 0x87, 0x1b, 0x7c, 0x7a, 0x92, 0x92, 0x74,\n                                                              0x1f, 0x13, 0xd8, 0x93, 0x74, 0x70, 0x93, 0x6e,\n                                                              0x1b, 0xfb, 0x19, 0x38, 0x2b, 0x26, 0x3b, 0xc8,\n                                                              0x5e, 0xc8, 0x63, 0x1f, 0xc8, 0x63, 0xc9, 0x66,\n                                                              0x4b, 0x1a, 0x77, 0x7e, 0xfb, 0x26, 0xfb, 0x4,\n                                                              0x61, 0xfb, 0x5, 0x9b, 0xf7, 0x40, 0x1e, 0x6e,\n                                                              0x8d, 0x5, 0xe, 0x58, 0x58, 0xa, 0x1, 0xbd,\n                                                              0x16, 0xf7, 0xdf, 0x6, 0x8d, 0xae, 0x5, 0x51,\n                                                              0x76, 0x91, 0xa9, 0x94, 0x8e, 0x97, 0x8f, 0x9a,\n                                                              0x1f, 0xf7, 0x1e, 0xf8, 0xa3, 0x5, 0xc0, 0xe0,\n                                                              0x85, 0xfb, 0x29, 0x1f, 0xa6, 0x89, 0xaf, 0xf7,\n                                                              0x54, 0x5, 0xfc, 0xbb, 0x6, 0x65, 0xfb, 0x3f,\n                                                              0xa4, 0x84, 0x5, 0xf1, 0xbe, 0xd2, 0xb4, 0xea,\n                                                              0x1b, 0xfb, 0x26, 0xfc, 0xa3, 0x78, 0x46, 0x62,\n                                                              0x86, 0x5e, 0x8d, 0x19, 0xe, 0xc7, 0x79, 0xc3,\n                                                              0xf8, 0xe9, 0xad, 0x1, 0xce, 0xf7, 0x1e, 0x3,\n                                                              0xed, 0xf9, 0xe, 0x15, 0xc9, 0x83, 0x96, 0x6b,\n                                                              0x6b, 0x5d, 0x23, 0xfb, 0xa8, 0x38, 0xa, 0xe1,\n                                                              0xf7, 0xbb, 0x99, 0xbc, 0x9d, 0x9b, 0x55, 0xa,\n                                                              0x8c, 0x93, 0x93, 0x8b, 0x92, 0x1b, 0xba, 0x98,\n                                                              0x68, 0x72, 0x85, 0x8a, 0x85, 0x8a, 0x86, 0x1f,\n                                                              0x3b, 0xfb, 0xbb, 0x5, 0x21, 0x6f, 0x65, 0xfb,\n                                                              0xb, 0xfb, 0x23, 0x1b, 0x28, 0x73, 0xb7, 0xc5,\n                                                              0xb3, 0x9b, 0xbb, 0x97, 0xb7, 0x3e, 0x1d, 0xe,\n                                                              0x90, 0x87, 0x76, 0xf7, 0x53, 0x77, 0xb2, 0x77,\n                                                              0xf8, 0x5c, 0xae, 0x12, 0xd3, 0xf9, 0x1e, 0x13,\n                                                              0xd8, 0x13, 0xb8, 0xf7, 0x7b, 0x79, 0x15, 0xab,\n                                                              0x6, 0xf8, 0x1d, 0xf8, 0xf8, 0x91, 0x94, 0x9b,\n                                                              0x9f, 0xb0, 0x96, 0x19, 0xae, 0xfb, 0x54, 0x68,\n                                                              0x7, 0xba, 0x87, 0x9d, 0x8a, 0x6c, 0x1a, 0xfb,\n                                                              0x8b, 0xfc, 0x31, 0x6f, 0xa, 0x58, 0xf8, 0x18,\n                                                              0x5, 0x8a, 0x96, 0x8b, 0x94, 0x92, 0x1a, 0xa7,\n                                                              0xa7, 0x8d, 0xbb, 0x8f, 0x1e, 0x61, 0xa, 0xc7,\n                                                              0x89, 0x93, 0x82, 0x94, 0x51, 0x8, 0xe, 0xf7,\n                                                              0x77, 0x8e, 0x76, 0xf7, 0x8b, 0x77, 0xf8, 0x3d,\n                                                              0xae, 0x1, 0xf7, 0x70, 0x79, 0x15, 0xa8, 0x6,\n                                                              0xf7, 0x7b, 0xf8, 0x7a, 0x5, 0x8d, 0x6, 0xc6,\n                                                              0xfc, 0x7a, 0x5, 0xa8, 0x6, 0xf7, 0xa8, 0xf8,\n                                                              0xcf, 0xab, 0xcb, 0xaa, 0x98, 0xaa, 0x90, 0x19,\n                                                              0xad, 0xfb, 0x4f, 0x68, 0x7, 0xb8, 0x8e, 0x9d,\n                                                              0x81, 0x74, 0x1a, 0x7d, 0x86, 0x7a, 0x81, 0x77,\n                                                              0x1e, 0xfb, 0x2e, 0xfb, 0xd8, 0x6f, 0xa, 0x6a,\n                                                              0xf7, 0xb8, 0x5, 0x88, 0xa4, 0x89, 0xa0, 0x9e,\n                                                              0x1a, 0xaa, 0x99, 0x9b, 0xbb, 0x8c, 0x1e, 0xae,\n                                                              0xfb, 0xa1, 0x69, 0x7, 0xbe, 0x83, 0x9f, 0x92,\n                                                              0x2a, 0x1a, 0xfb, 0x28, 0xfb, 0xc8, 0x6f, 0xa,\n                                                              0x64, 0xf7, 0xe0, 0x5, 0x8a, 0x94, 0x8b, 0x93,\n                                                              0x92, 0x1a, 0xb0, 0xa8, 0x94, 0xab, 0x8e, 0x1e,\n                                                              0xae, 0xfb, 0xa9, 0x69, 0x7, 0xcb, 0x80, 0x8d,\n                                                              0x94, 0x96, 0x43, 0x8, 0xe, 0x90, 0x58, 0xa,\n                                                              0x1, 0x73, 0x16, 0xf7, 0x6a, 0xae, 0x6, 0x74,\n                                                              0x8d, 0x57, 0x90, 0xae, 0x1a, 0xf7, 0x42, 0xf7,\n                                                              0x4f, 0x5, 0x95, 0x63, 0xba, 0x20, 0x60, 0x1a,\n                                                              0x69, 0x6b, 0x89, 0x67, 0x88, 0x1e, 0x68, 0xf7,\n                                                              0xc8, 0xae, 0x7, 0x3f, 0x92, 0x7e, 0xa2, 0x70,\n                                                              0xe1, 0x41, 0xf7, 0x77, 0x18, 0xf7, 0x5b, 0xf7,\n                                                              0x57, 0xbf, 0xc1, 0xa3, 0x8e, 0xa2, 0x8f, 0x19,\n                                                              0xae, 0xfb, 0x5f, 0x68, 0x7, 0xac, 0x88, 0xa6,\n                                                              0x7b, 0x7b, 0x1a, 0x87, 0x8a, 0x87, 0x87, 0x87,\n                                                              0x1e, 0xfb, 0x38, 0xfb, 0x3a, 0x5, 0x7c, 0xbf,\n                                                              0x67, 0xda, 0x9e, 0x1a, 0xad, 0x9a, 0xa2, 0xc6,\n                                                              0x91, 0x1e, 0xae, 0xfb, 0xc5, 0x68, 0x7, 0xbf,\n                                                              0x86, 0xa3, 0x83, 0x9a, 0x59, 0xdf, 0xfb, 0x9a,\n                                                              0x18, 0x4f, 0x4c, 0xfb, 0x3, 0xfb, 0xc, 0x47,\n                                                              0x50, 0x75, 0x78, 0x84, 0x87, 0x6c, 0x82, 0x8,\n                                                              0xe, 0x58, 0x58, 0xa, 0x1, 0xd4, 0x16, 0xf7,\n                                                              0xd6, 0xae, 0x6, 0x5d, 0x8d, 0x6c, 0x8c, 0xb4,\n                                                              0x1a, 0xc7, 0xf7, 0x79, 0x6a, 0xa, 0xc4, 0x88,\n                                                              0xa3, 0x80, 0x78, 0x1a, 0x81, 0x87, 0x7f, 0x81,\n                                                              0x7e, 0x1e, 0xfb, 0x2f, 0xfb, 0x6a, 0x48, 0xf7,\n                                                              0x5c, 0x8d, 0x83, 0x81, 0xa5, 0x19, 0x87, 0x95,\n                                                              0x88, 0x96, 0x92, 0x1a, 0xa6, 0xa8, 0x94, 0xb9,\n                                                              0x6a, 0x1d, 0x4f, 0xfb, 0x62, 0x79, 0x4b, 0x72,\n                                                              0x88, 0x51, 0x86, 0x19, 0xe, 0x58, 0x58, 0xa,\n                                                              0x3e, 0xa, 0xe, 0xfb, 0xdd, 0xfb, 0x33, 0xb8,\n                                                              0xf9, 0x7b, 0xb8, 0x1, 0x66, 0xfb, 0x33, 0x15,\n                                                              0xf7, 0x6f, 0x6, 0x92, 0xb8, 0x5, 0x3b, 0x6,\n                                                              0x7f, 0x76, 0x8b, 0xa3, 0x1f, 0xf7, 0x32, 0xf9,\n                                                              0x24, 0x5, 0xc6, 0x99, 0x8a, 0x8f, 0xb0, 0x1b,\n                                                              0xd2, 0x6, 0x92, 0xb8, 0x5, 0xfb, 0x5c, 0x6,\n                                                              0xe, 0xfc, 0x14, 0xfb, 0x1c, 0x76, 0xf7, 0x34,\n                                                              0x8d, 0x1d, 0xf7, 0x1e, 0xfb, 0x31, 0x15, 0xc6,\n                                                              0x6, 0x32, 0xf9, 0xde, 0x5, 0x50, 0x6, 0xe,\n                                                              0xfb, 0xdd, 0xfb, 0x31, 0xb8, 0xf9, 0x79, 0xb8,\n                                                              0x1, 0x64, 0xfb, 0x4, 0x15, 0x84, 0x5e, 0x5,\n                                                              0xf7, 0x5b, 0x6, 0xf7, 0x5c, 0xf9, 0xd3, 0x5,\n                                                              0xfb, 0x70, 0x6, 0x84, 0x5e, 0x5, 0xd9, 0x6,\n                                                              0x96, 0xa3, 0x88, 0x75, 0x1f, 0xfb, 0x31, 0xfd,\n                                                              0x21, 0x5, 0x51, 0x7d, 0x89, 0x86, 0x66, 0x1b,\n                                                              0xe, 0x2f, 0xf7, 0xd9, 0x76, 0xf8, 0x1, 0x77,\n                                                              0x1, 0xce, 0xf7, 0xc4, 0x15, 0xe4, 0x6, 0xf7,\n                                                              0x15, 0xf7, 0xa1, 0xf7, 0x15, 0xfb, 0xa1, 0x5,\n                                                              0xe4, 0x6, 0xfb, 0x46, 0xf8, 0x1, 0x5, 0x3b,\n                                                              0x6, 0xe, 0xfb, 0x11, 0xbd, 0x1, 0x40, 0x4,\n                                                              0x59, 0xf8, 0x88, 0xbd, 0x7, 0xe, 0x7f, 0x1d,\n                                                              0xf7, 0x49, 0x77, 0x1, 0xf7, 0x90, 0xf8, 0x98,\n                                                              0x7b, 0xa, 0xfb, 0x3, 0xf7, 0x27, 0x5, 0x98,\n                                                              0x80, 0x7a, 0xa0, 0x70, 0x1b, 0x70, 0x78, 0x75,\n                                                              0x76, 0x76, 0xa0, 0x78, 0x98, 0x82, 0x1f, 0xe,\n                                                              0x58, 0x1d, 0xb5, 0x85, 0x77, 0x74, 0xa, 0x13,\n                                                              0x68, 0xf7, 0x8e, 0xf7, 0x7, 0x15, 0x2e, 0x1d,\n                                                              0x13, 0x98, 0x71, 0xa, 0x90, 0x94, 0x44, 0xa,\n                                                              0x5, 0xfb, 0x3, 0x6, 0x7a, 0x4d, 0x6f, 0xa,\n                                                              0x13, 0xa8, 0xa4, 0x87, 0x8a, 0xb6, 0x4f, 0x1b,\n                                                              0xfb, 0xe, 0xfb, 0x33, 0x2f, 0x1d, 0xcc, 0xd5,\n                                                              0xf7, 0x84, 0xdf, 0x94, 0xad, 0x39, 0xa, 0xe,\n                                                              0x7e, 0xac, 0xf8, 0xa, 0xcf, 0xf7, 0x81, 0x77,\n                                                              0x1, 0xf7, 0xd3, 0xf7, 0x11, 0x3, 0xf7, 0x5a,\n                                                              0xf8, 0xc, 0x15, 0x89, 0x8d, 0xe3, 0xf7, 0xd5,\n                                                              0x42, 0x77, 0x1d, 0x65, 0xfb, 0x2d, 0xfc, 0x83,\n                                                              0x6e, 0x1a, 0x77, 0xc1, 0x63, 0xe0, 0xf7, 0x3b,\n                                                              0xf7, 0x2c, 0xf7, 0x3e, 0xf7, 0x3d, 0xd9, 0x5b,\n                                                              0xc5, 0x4d, 0x4c, 0x64, 0x63, 0x5d, 0x69, 0x1e,\n                                                              0x32, 0xfb, 0xd9, 0x15, 0x8c, 0xc7, 0xf7, 0xea,\n                                                              0xf3, 0xb9, 0x8b, 0x58, 0x7a, 0x36, 0x4a, 0xfb,\n                                                              0x71, 0xfb, 0x5, 0x86, 0x70, 0x8b, 0xaa, 0x1e,\n                                                              0xe, 0xfb, 0x6e, 0x7e, 0xcb, 0xf7, 0x8f, 0xf7,\n                                                              0x34, 0x6a, 0xac, 0x12, 0x86, 0xf7, 0x14, 0x13,\n                                                              0xb0, 0xf7, 0xd2, 0xf7, 0x21, 0x15, 0x51, 0x63,\n                                                              0x66, 0x6b, 0x5e, 0x1b, 0x6e, 0x5f, 0x95, 0xdb,\n                                                              0xd2, 0xc7, 0xf7, 0x6d, 0xe2, 0x94, 0x99, 0x87,\n                                                              0x7e, 0x83, 0x85, 0x83, 0x85, 0x81, 0x1f, 0x86,\n                                                              0x82, 0x87, 0x81, 0x7e, 0x1a, 0x13, 0xd0, 0x84,\n                                                              0x1d, 0x67, 0xb7, 0x3c, 0xfb, 0x1e, 0xfb, 0x24,\n                                                              0xfb, 0x3c, 0xfb, 0x2d, 0xfb, 0x3, 0xde, 0x60,\n                                                              0xcd, 0xf5, 0xbe, 0xd3, 0xcb, 0xb8, 0x1e, 0xe,\n                                                              0x7e, 0xd3, 0x5a, 0x76, 0xf8, 0x43, 0xb5, 0xf7,\n                                                              0x81, 0x77, 0x12, 0x76, 0xf7, 0x10, 0x13, 0x78,\n                                                              0xf7, 0x8e, 0xf7, 0x7, 0x15, 0x84, 0x6c, 0x88,\n                                                              0x79, 0x7b, 0x1a, 0x4e, 0xc0, 0x8b, 0x92, 0xd1,\n                                                              0xc2, 0xe2, 0xb2, 0xa3, 0x1e, 0x75, 0x9b, 0x5,\n                                                              0x84, 0x90, 0x55, 0x4b, 0x76, 0x1b, 0x86, 0x88,\n                                                              0x8f, 0x94, 0x1f, 0xf7, 0x3c, 0xf9, 0x6, 0x68,\n                                                              0x83, 0x5d, 0x80, 0xfb, 0x14, 0x81, 0x6d, 0xa,\n                                                              0xb6, 0x9e, 0x85, 0x73, 0x7c, 0x72, 0x35, 0x75,\n                                                              0x38, 0x1f, 0x99, 0x7d, 0x83, 0x9e, 0x60, 0x1b,\n                                                              0xfb, 0x8, 0xfb, 0x37, 0xfb, 0x55, 0xfb, 0x2f,\n                                                              0x1f, 0x13, 0xb8, 0x5f, 0xa2, 0x38, 0xde, 0xe1,\n                                                              0xbb, 0xd9, 0xbc, 0xa8, 0x1e, 0xfb, 0x25, 0x16,\n                                                              0xd1, 0xcf, 0xf7, 0x80, 0xe2, 0xb0, 0x98, 0x5d,\n                                                              0x85, 0x6e, 0x47, 0xfb, 0xac, 0x2c, 0x63, 0x89,\n                                                              0xbd, 0x90, 0x1e, 0xe, 0xfb, 0x6e, 0x7e, 0xcb,\n                                                              0xf8, 0x21, 0xac, 0x1, 0x90, 0xf7, 0x16, 0xf7,\n                                                              0x3f, 0xe7, 0x3, 0x50, 0x1d, 0xf7, 0x7, 0xc2,\n                                                              0x1a, 0xd3, 0x47, 0x93, 0x68, 0xfb, 0x37, 0xfb,\n                                                              0x13, 0xfb, 0x55, 0xfb, 0x1c, 0xfb, 0x4, 0xdf,\n                                                              0x69, 0x35, 0xa, 0x8e, 0xda, 0x9e, 0x8d, 0x97,\n                                                              0x3d, 0xa, 0x65, 0x82, 0x57, 0x70, 0x3a, 0xfb,\n                                                              0x17, 0x68, 0x1f, 0xe, 0xfb, 0xdd, 0xfb, 0x61,\n                                                              0xaa, 0xf8, 0xd9, 0xb5, 0xf7, 0x70, 0xa8, 0x1,\n                                                              0xb2, 0xf8, 0x2b, 0x15, 0xd4, 0x6, 0x76, 0x3b,\n                                                              0x63, 0xfb, 0x57, 0x70, 0xfb, 0x9, 0x8, 0xfb,\n                                                              0x1c, 0x6e, 0x7c, 0x56, 0x5b, 0x1b, 0x80, 0x86,\n                                                              0x90, 0x92, 0x8e, 0x8f, 0x90, 0x8f, 0x92, 0x1f,\n                                                              0x8f, 0x92, 0x8f, 0x93, 0x96, 0x1a, 0xaf, 0x66,\n                                                              0x98, 0x7e, 0x74, 0x6f, 0x79, 0x6c, 0x4f, 0xb8,\n                                                              0x73, 0xbf, 0xf7, 0x43, 0xb3, 0xf7, 0x67, 0xf8,\n                                                              0x25, 0xe1, 0x1e, 0xe5, 0x6, 0x94, 0xb5, 0x5,\n                                                              0x2f, 0x6, 0xf7, 0x3, 0xa6, 0xaa, 0xf7, 0x1,\n                                                              0xbe, 0x1b, 0x93, 0x94, 0x88, 0x80, 0x88, 0x87,\n                                                              0x87, 0x87, 0x84, 0x1f, 0x87, 0x84, 0x87, 0x83,\n                                                              0x80, 0x1a, 0x6e, 0xa0, 0x76, 0xa6, 0xa3, 0xa7,\n                                                              0x99, 0xb2, 0x9f, 0x81, 0xc7, 0x33, 0xfb, 0x12,\n                                                              0x49, 0xfb, 0x5, 0xfb, 0x1c, 0x68, 0x1e, 0x42,\n                                                              0x6, 0xe, 0xfb, 0x5f, 0xad, 0xf7, 0x4c, 0x76,\n                                                              0xf7, 0x33, 0xaa, 0x74, 0x77, 0xf7, 0xb6, 0xaa,\n                                                              0x12, 0x57, 0xe2, 0xf7, 0x7b, 0xf7, 0x1, 0x40,\n                                                              0xf7, 0x9, 0x13, 0xde, 0xd9, 0x93, 0x15, 0x89,\n                                                              0x7, 0x4c, 0x7b, 0x48, 0x7a, 0x42, 0x1a, 0x3f,\n                                                              0xf3, 0x70, 0xdb, 0xf7, 0x3f, 0xd3, 0xda, 0xd0,\n                                                              0xda, 0x44, 0xa6, 0x3d, 0xa0, 0x1e, 0x30, 0xa6,\n                                                              0x7e, 0x97, 0x9b, 0x1a, 0x96, 0x99, 0xa2, 0x98,\n                                                              0x1e, 0x13, 0xed, 0x92, 0x92, 0x8a, 0x88, 0x92,\n                                                              0x1f, 0x88, 0x93, 0x93, 0x8a, 0x96, 0x1b, 0xf7,\n                                                              0x1, 0xf7, 0x3, 0xcc, 0xf7, 0x4, 0x9f, 0x89,\n                                                              0x93, 0x87, 0x9a, 0x1f, 0xce, 0xc3, 0xfb, 0x3,\n                                                              0x6, 0x9e, 0x73, 0x67, 0x99, 0x5b, 0x1b, 0xfb,\n                                                              0x28, 0x3f, 0x25, 0x3e, 0x54, 0xa8, 0x64, 0xbe,\n                                                              0x78, 0x1f, 0x4b, 0x68, 0x6b, 0x79, 0x5e, 0x1a,\n                                                              0x60, 0xb7, 0x7b, 0x9a, 0x86, 0x1e, 0x13, 0xee,\n                                                              0xae, 0x7d, 0x15, 0xa7, 0xf7, 0x11, 0x63, 0x56,\n                                                              0x4f, 0x32, 0x81, 0x5e, 0x40, 0x75, 0xab, 0xb0,\n                                                              0xbe, 0xd4, 0xb6, 0x90, 0x1f, 0xb1, 0xf7, 0x92,\n                                                              0x15, 0x13, 0xed, 0xac, 0xa7, 0xf7, 0x2a, 0xd6,\n                                                              0xaf, 0x95, 0x68, 0x70, 0x5b, 0x68, 0xfb, 0x1d,\n                                                              0x45, 0x5f, 0x8b, 0xb9, 0x9d, 0x1e, 0xe, 0x89,\n                                                              0x1d, 0xf7, 0x81, 0x77, 0x12, 0x13, 0x70, 0x7e,\n                                                              0x83, 0xa, 0xa4, 0xe3, 0xae, 0xf7, 0xa, 0xb4,\n                                                              0xc9, 0x8, 0xb6, 0xa7, 0xbe, 0xda, 0xb5, 0x1b,\n                                                              0x9e, 0x8f, 0x7c, 0x83, 0x7d, 0x70, 0x44, 0x73,\n                                                              0x41, 0x1f, 0x78, 0x4f, 0x79, 0x4e, 0x68, 0x1a,\n                                                              0x13, 0xb0, 0x6a, 0xa1, 0x6f, 0xb6, 0xdd, 0xb8,\n                                                              0xd3, 0xcb, 0xb4, 0x1e, 0x75, 0x9a, 0x5, 0x77,\n                                                              0x88, 0x53, 0x4d, 0x8f, 0xa, 0x90, 0x96, 0x90,\n                                                              0xa0, 0xc5, 0xa1, 0xcb, 0x1f, 0xa3, 0xd0, 0xa3,\n                                                              0xd6, 0x9f, 0x1a, 0xda, 0x53, 0x9b, 0x75, 0x59,\n                                                              0x50, 0x6f, 0xfb, 0x26, 0x29, 0x1e, 0x89, 0x8c,\n                                                              0xf5, 0xf8, 0x2e, 0x40, 0x7c, 0x53, 0x83, 0x3e,\n                                                              0x84, 0x82, 0x1d, 0x66, 0x1d, 0xf8, 0xc3, 0xf7,\n                                                              0x1a, 0x4d, 0x1d, 0x53, 0x55, 0x73, 0x88, 0x1d,\n                                                              0x8f, 0x95, 0x32, 0x1d, 0xa9, 0x8b, 0x6b, 0x1f,\n                                                              0x34, 0x1d, 0xfb, 0x2, 0xf8, 0x7f, 0x15, 0x41,\n                                                              0x1d, 0xe, 0xfc, 0x14, 0xfb, 0x4e, 0x76, 0xf9,\n                                                              0x89, 0xf7, 0x1a, 0x1, 0xaa, 0xf8, 0x2b, 0x15,\n                                                              0xbb, 0x99, 0x85, 0x72, 0x1f, 0x23, 0xfc, 0x39,\n                                                              0x5, 0x36, 0x75, 0x7c, 0x5d, 0x67, 0x1b, 0x81,\n                                                              0x7f, 0x92, 0x90, 0x8f, 0x8e, 0x90, 0x8f, 0x90,\n                                                              0x1f, 0x8f, 0x91, 0x8f, 0x91, 0x97, 0x1a, 0xb3,\n                                                              0x65, 0x94, 0x80, 0x73, 0x72, 0x76, 0x6b, 0x6f,\n                                                              0xa0, 0x5a, 0xe0, 0xe4, 0xd6, 0xc9, 0xf7, 0x3d,\n                                                              0xb7, 0x1e, 0xf7, 0x6, 0xf8, 0x4a, 0x45, 0x7c,\n                                                              0x7b, 0x89, 0xfb, 0xe, 0x80, 0x19, 0xf7, 0x5,\n                                                              0xf7, 0x4c, 0x15, 0x41, 0x1d, 0xe, 0x83, 0xd2,\n                                                              0x61, 0x76, 0xf8, 0x55, 0x77, 0xf7, 0xa2, 0x77,\n                                                              0x12, 0x13, 0x70, 0x74, 0x16, 0xf7, 0xe, 0x6,\n                                                              0xbd, 0xf7, 0x50, 0xb2, 0xa6, 0x5, 0x13, 0xb0,\n                                                              0xfb, 0xe, 0xa1, 0xa3, 0x26, 0xd9, 0x1b, 0xd0,\n                                                              0xb5, 0xdb, 0xb7, 0xa3, 0x1f, 0x75, 0x96, 0x5,\n                                                              0x76, 0x7f, 0x74, 0x60, 0x71, 0x1b, 0x69, 0x7d,\n                                                              0xd3, 0xf7, 0x32, 0x6c, 0x1f, 0xca, 0xc2, 0xd7,\n                                                              0xce, 0xa2, 0x85, 0xaf, 0x90, 0x19, 0xae, 0xfb,\n                                                              0x63, 0x68, 0x7, 0xa5, 0xa4, 0x89, 0x74, 0x68,\n                                                              0xfb, 0xf, 0x39, 0x65, 0x6d, 0x1f, 0x89, 0x8d,\n                                                              0xf7, 0xe, 0xf8, 0x5b, 0x4c, 0x7f, 0x38, 0x7f,\n                                                              0x4d, 0x85, 0x82, 0x1d, 0x66, 0x1d, 0xf9, 0x58,\n                                                              0x6c, 0x1d, 0x54, 0x55, 0x73, 0x1b, 0x84, 0x87,\n                                                              0x8f, 0x95, 0x9f, 0x9b, 0xc5, 0x91, 0xa1, 0x1f,\n                                                              0xf7, 0x25, 0xf8, 0x9f, 0x7f, 0xa, 0xac, 0x8d,\n                                                              0x6c, 0x1f, 0x5c, 0xfb, 0x22, 0xfc, 0x54, 0x4f,\n                                                              0x1a, 0x7d, 0x8b, 0x56, 0xcf, 0xdb, 0xb7, 0xd0,\n                                                              0xce, 0xb7, 0x1e, 0xe, 0xf7, 0x8, 0x97, 0x76,\n                                                              0xa9, 0x76, 0xf8, 0x19, 0xd4, 0x12, 0x13, 0x60,\n                                                              0x7d, 0x83, 0xa, 0xf8, 0x0, 0xe8, 0xf7, 0x3,\n                                                              0xa4, 0x92, 0x1b, 0xb8, 0x4d, 0xfb, 0x2e, 0xfb,\n                                                              0x7f, 0x41, 0x1f, 0xf7, 0xc, 0x6, 0xbd, 0xf7,\n                                                              0x38, 0x99, 0xb8, 0xb0, 0xcb, 0x8e, 0x91, 0xde,\n                                                              0xf7, 0x5, 0xad, 0x8c, 0x8, 0x94, 0x91, 0x83,\n                                                              0x78, 0x7d, 0x6b, 0x38, 0x72, 0x3c, 0x1f, 0x7a,\n                                                              0x56, 0x7d, 0x57, 0x6e, 0x1a, 0x13, 0xa0, 0x4a,\n                                                              0xc0, 0x8b, 0x9c, 0xdb, 0xb9, 0xd9, 0xc0, 0xaa,\n                                                              0x1e, 0x75, 0x98, 0x5, 0x73, 0x88, 0x57, 0x58,\n                                                              0x76, 0x1b, 0x86, 0x87, 0x90, 0x94, 0x9d, 0x9f,\n                                                              0xc3, 0xa0, 0xc7, 0x1f, 0xa2, 0xce, 0xa4, 0xd4,\n                                                              0xae, 0x1a, 0xb7, 0x73, 0xae, 0x54, 0x39, 0x50,\n                                                              0x37, 0x3a, 0x58, 0x1e, 0x8a, 0x8d, 0x5, 0x94,\n                                                              0xa2, 0x99, 0xad, 0xb2, 0x1a, 0xce, 0x4e, 0x8b,\n                                                              0x86, 0x32, 0x4a, 0x27, 0x32, 0x51, 0x1e, 0x88,\n                                                              0x8d, 0xc7, 0xf7, 0x4e, 0x46, 0x7b, 0x72, 0x89,\n                                                              0x21, 0x82, 0x6d, 0xa, 0x9a, 0xb2, 0x8e, 0x6e,\n                                                              0x1f, 0x13, 0x60, 0x6a, 0x5e, 0xfb, 0x1f, 0x52,\n                                                              0xfb, 0x65, 0x1e, 0xe, 0x89, 0x1d, 0x12, 0x13,\n                                                              0x60, 0x78, 0xa, 0xaf, 0x6d, 0x2e, 0x30, 0x6d,\n                                                              0x1f, 0x77, 0x4f, 0x78, 0x50, 0x6c, 0x1a, 0x13,\n                                                              0xa0, 0x76, 0x1d, 0x6a, 0x81, 0x62, 0x61, 0x76,\n                                                              0x1b, 0x84, 0x86, 0x90, 0x97, 0x99, 0x9f, 0xc4,\n                                                              0xa0, 0xc9, 0x1f, 0xa1, 0xcd, 0xa3, 0xd4, 0xad,\n                                                              0x4f, 0xa, 0x13, 0x60, 0x88, 0xa, 0xe, 0x7e,\n                                                              0xa8, 0xf8, 0x35, 0xa8, 0x52, 0x1d, 0xe1, 0x15,\n                                                              0xcb, 0xbf, 0xf7, 0xaf, 0xf7, 0x0, 0xa5, 0x9f,\n                                                              0x7d, 0x59, 0x40, 0x4f, 0xfb, 0xaa, 0x2b, 0x57,\n                                                              0x8d, 0xbd, 0x9f, 0x1e, 0xfb, 0xb, 0xbd, 0x15,\n                                                              0x2b, 0xd7, 0x56, 0xdd, 0xf7, 0x34, 0xf7, 0x12,\n                                                              0xf7, 0x40, 0xf7, 0x29, 0xf7, 0x1a, 0xfb, 0x9,\n                                                              0x9f, 0x65, 0xfb, 0x32, 0xfb, 0x17, 0xfb, 0x40,\n                                                              0xfb, 0x2e, 0x1e, 0xe, 0x87, 0x1d, 0x59, 0x1d,\n                                                              0x78, 0x6b, 0x43, 0x44, 0xfb, 0x8a, 0x4f, 0x1d,\n                                                              0x57, 0x1f, 0x88, 0x8e, 0xad, 0xf2, 0x44, 0x7d,\n                                                              0x64, 0x87, 0x38, 0x81, 0x6d, 0xa, 0xaf, 0x9d,\n                                                              0x89, 0x72, 0x75, 0x4a, 0xfb, 0x85, 0x4f, 0xfb,\n                                                              0x8f, 0x1f, 0x69, 0x83, 0x6d, 0x87, 0xa, 0x6d,\n                                                              0x8d, 0xab, 0xa1, 0xa8, 0xe3, 0x93, 0xac, 0x1f,\n                                                              0xe, 0xfb, 0x61, 0xb0, 0xf7, 0x2f, 0xd3, 0xf7,\n                                                              0xfc, 0xb6, 0x7e, 0x77, 0x12, 0x8c, 0xf7, 0x11,\n                                                              0x13, 0xd8, 0xf3, 0xfb, 0x3c, 0x15, 0x66, 0xf7,\n                                                              0x9f, 0xb0, 0x7, 0x68, 0x6d, 0x8b, 0xa9, 0xa0,\n                                                              0xf7, 0x13, 0xf8, 0x37, 0xb1, 0xf7, 0x27, 0x1f,\n                                                              0xfb, 0x1, 0x6, 0x7d, 0x54, 0x6f, 0xa, 0x13,\n                                                              0xe8, 0xab, 0x86, 0x84, 0xaf, 0x4b, 0x1b, 0xfb,\n                                                              0x13, 0xfb, 0x22, 0xfb, 0x60, 0xfb, 0x11, 0x6a,\n                                                              0x8b, 0xfb, 0x5, 0xf4, 0xd4, 0xb8, 0xc5, 0xb9,\n                                                              0xa7, 0x1f, 0x8d, 0x89, 0x4f, 0xfb, 0x77, 0x83,\n                                                              0x6d, 0x6d, 0x8e, 0x57, 0x88, 0x19, 0xa1, 0xf7,\n                                                              0xc1, 0x15, 0xd6, 0xdc, 0xf7, 0x67, 0xdd, 0xa7,\n                                                              0x93, 0x70, 0x74, 0x54, 0x4a, 0xfb, 0x93, 0x2e,\n                                                              0x62, 0x8b, 0xbc, 0xa4, 0x1e, 0xe, 0xfb, 0xa5,\n                                                              0xa0, 0x76, 0xf8, 0x62, 0x77, 0x1, 0x76, 0x83,\n                                                              0xa, 0xab, 0xe8, 0x95, 0xbb, 0xa5, 0xce, 0x8,\n                                                              0xc0, 0xa1, 0xbf, 0xef, 0xa7, 0x1b, 0x91, 0x91,\n                                                              0x83, 0x83, 0x92, 0x1f, 0x81, 0x94, 0x98, 0x7f,\n                                                              0x9e, 0x1b, 0xaa, 0xa7, 0xa6, 0xb9, 0xcd, 0x55,\n                                                              0x8b, 0x87, 0x49, 0x50, 0xfb, 0xc, 0x51, 0x68,\n                                                              0x1f, 0xc3, 0xf7, 0x46, 0x48, 0x7a, 0x6c, 0x89,\n                                                              0x25, 0x82, 0x6d, 0xa, 0xaf, 0x9d, 0x89, 0x72,\n                                                              0x6b, 0x5a, 0xfb, 0x3c, 0x56, 0xfb, 0x48, 0x1f,\n                                                              0xe, 0xfb, 0xa5, 0x93, 0x76, 0xf8, 0x51, 0xac,\n                                                              0x87, 0x77, 0x12, 0x8e, 0xa6, 0xf7, 0x2d, 0xeb,\n                                                              0xa4, 0xa8, 0x13, 0xdc, 0x85, 0xa, 0x96, 0x95,\n                                                              0x87, 0x86, 0x97, 0x1f, 0x86, 0x9a, 0x9c, 0x85,\n                                                              0xa3, 0x1b, 0xcb, 0xe4, 0xb0, 0xec, 0xba, 0x6f,\n                                                              0xb6, 0x6c, 0xb3, 0x1f, 0x66, 0xbb, 0x62, 0xb5,\n                                                              0xad, 0x1a, 0x90, 0x87, 0xbc, 0xc0, 0xc6, 0xa4,\n                                                              0x46, 0x59, 0x93, 0x1e, 0xa6, 0x89, 0x5, 0x13,\n                                                              0xbc, 0x79, 0xa, 0x7b, 0x82, 0x91, 0x90, 0x80,\n                                                              0x1f, 0x91, 0x80, 0x7e, 0x90, 0x72, 0x1b, 0x4a,\n                                                              0x3c, 0x67, 0x32, 0x62, 0xaa, 0x5f, 0xab, 0x60,\n                                                              0x1f, 0xae, 0x5c, 0xb1, 0x5c, 0x60, 0x1a, 0x72,\n                                                              0x78, 0x6d, 0x65, 0x82, 0x43, 0x7c, 0xa, 0xe,\n                                                              0x66, 0x1d, 0xf8, 0x34, 0xb5, 0xf7, 0x25, 0x77,\n                                                              0x1, 0xf7, 0x5f, 0xf7, 0x21, 0x15, 0x79, 0x89,\n                                                              0x55, 0x4e, 0x72, 0x1b, 0x84, 0x87, 0x8f, 0x95,\n                                                              0xad, 0xc1, 0xf7, 0x43, 0xac, 0xf7, 0xe, 0x1f,\n                                                              0xde, 0xb5, 0x43, 0x6, 0xb2, 0xf7, 0x25, 0x5,\n                                                              0x68, 0x6, 0x47, 0x21, 0x3f, 0x6c, 0x64, 0x7c,\n                                                              0x8, 0x68, 0xbe, 0x7, 0x5f, 0xfb, 0x32, 0x5b,\n                                                              0xfb, 0x2a, 0x62, 0x1a, 0x84, 0x8b, 0x4f, 0xd3,\n                                                              0xd9, 0xbc, 0xd9, 0xc5, 0xb0, 0x1e, 0xe, 0x64,\n                                                              0xa, 0xac, 0x77, 0x12, 0x13, 0xc0, 0x2c, 0x1d,\n                                                              0x56, 0x4d, 0x73, 0x1b, 0x84, 0x87, 0x91, 0x98,\n                                                              0x31, 0xa, 0x63, 0xa0, 0xc2, 0xaf, 0x96, 0x1f,\n                                                              0x13, 0xa0, 0x44, 0x1d, 0xa1, 0x88, 0x71, 0x6e,\n                                                              0x78, 0x50, 0x79, 0x4f, 0x1f, 0x78, 0x4d, 0x78,\n                                                              0x4b, 0x68, 0x47, 0xa, 0xe, 0xfb, 0x6e, 0x93,\n                                                              0x76, 0xf8, 0x6f, 0x77, 0x1, 0xda, 0xf7, 0xf,\n                                                              0xdd, 0xf7, 0x9, 0x3, 0xe0, 0x7e, 0x15, 0xa5,\n                                                              0x6, 0xf7, 0x3e, 0xf7, 0x32, 0xf7, 0xc, 0xf7,\n                                                              0x29, 0xef, 0x1a, 0xb6, 0x68, 0xa4, 0x6f, 0x73,\n                                                              0x6d, 0x73, 0x6a, 0x76, 0x95, 0x7d, 0x95, 0x7f,\n                                                              0x1e, 0x97, 0x7d, 0x97, 0x80, 0x79, 0x1a, 0x6f,\n                                                              0x75, 0x60, 0x23, 0xfb, 0x8, 0x1e, 0xf7, 0x4e,\n                                                              0x82, 0xcf, 0x75, 0xdb, 0x1e, 0x4f, 0x7c, 0x63,\n                                                              0x86, 0x54, 0x83, 0x8, 0x70, 0x7, 0xaa, 0xa5,\n                                                              0x87, 0x6a, 0x1f, 0x86, 0x8c, 0x85, 0x84, 0x1a,\n                                                              0xe, 0x90, 0x93, 0x76, 0xf7, 0x5f, 0x77, 0xf7,\n                                                              0xb8, 0x77, 0x1, 0xe0, 0xf7, 0xb, 0xf7, 0xe2,\n                                                              0xd7, 0x3, 0xea, 0x7e, 0x15, 0xa6, 0x6, 0xda,\n                                                              0xf7, 0xd, 0xdb, 0xf7, 0x22, 0x94, 0x9e, 0x8,\n                                                              0x8d, 0x6, 0x8f, 0x5d, 0x9c, 0xfb, 0x67, 0x8d,\n                                                              0x72, 0x8, 0xa6, 0x6, 0xb5, 0xb7, 0xf7, 0x7a,\n                                                              0xf7, 0x85, 0xf7, 0x11, 0x1a, 0xb9, 0x66, 0x9e,\n                                                              0x73, 0x6a, 0x74, 0x6b, 0x70, 0x77, 0x95, 0x7d,\n                                                              0x95, 0x7d, 0x1e, 0x95, 0x7d, 0x96, 0x7d, 0x79,\n                                                              0x1a, 0x62, 0x37, 0x2a, 0x68, 0x62, 0x1e, 0x6b,\n                                                              0xf7, 0xe0, 0x5, 0x70, 0x6, 0x52, 0x30, 0x5d,\n                                                              0x31, 0x58, 0x30, 0x8, 0x89, 0x6, 0xf7, 0x12,\n                                                              0x7e, 0xd3, 0x77, 0xd5, 0x1e, 0x5e, 0x82, 0x5d,\n                                                              0x81, 0x4b, 0x82, 0x8, 0x70, 0x7, 0xab, 0xa5,\n                                                              0x8b, 0x69, 0x1f, 0x85, 0x8c, 0x84, 0x83, 0x1a,\n                                                              0xe, 0x93, 0x76, 0xe9, 0x77, 0xb4, 0x77, 0xf8,\n                                                              0x10, 0x77, 0x1, 0xf7, 0x41, 0xf7, 0x22, 0x15,\n                                                              0xfb, 0xa, 0x9f, 0xab, 0x66, 0xba, 0x1b, 0xcd,\n                                                              0xc4, 0xdf, 0xb1, 0xa5, 0x1f, 0x76, 0x99, 0x5,\n                                                              0x68, 0x76, 0x75, 0x75, 0x78, 0x1b, 0x78, 0x7c,\n                                                              0x99, 0xb0, 0x83, 0x1f, 0x6b, 0xf7, 0x30, 0x5,\n                                                              0x9f, 0x99, 0xb6, 0xd6, 0xae, 0x1b, 0x97, 0x92,\n                                                              0x86, 0x86, 0x93, 0x1f, 0x86, 0x92, 0x93, 0x86,\n                                                              0x99, 0x1b, 0xac, 0xa3, 0xa5, 0xa5, 0xa3, 0x74,\n                                                              0xb1, 0x6a, 0x57, 0x69, 0x6a, 0x22, 0x41, 0x1f,\n                                                              0x7b, 0xd9, 0x82, 0xab, 0x77, 0xa7, 0xfb, 0x3b,\n                                                              0x73, 0x18, 0x70, 0x7, 0x8c, 0x95, 0x98, 0x8c,\n                                                              0x96, 0x1b, 0x9e, 0xa4, 0x8b, 0x48, 0x98, 0x1f,\n                                                              0xa9, 0xfb, 0x2e, 0x5, 0x34, 0x55, 0x7c, 0x73,\n                                                              0x75, 0x1b, 0x7f, 0x85, 0x91, 0x91, 0x81, 0x1f,\n                                                              0x8f, 0x83, 0x81, 0x90, 0x7b, 0x1b, 0x68, 0x77,\n                                                              0x6c, 0x73, 0x7b, 0x94, 0x5f, 0xc0, 0xc2, 0xcb,\n                                                              0xd4, 0xdd, 0xb1, 0x1f, 0xe, 0x79, 0x1d, 0x1,\n                                                              0xf7, 0xdc, 0xcb, 0x3, 0x45, 0xa, 0x95, 0x94,\n                                                              0x7c, 0x1e, 0x93, 0x7e, 0x7d, 0x93, 0x79, 0x38,\n                                                              0x1d, 0x6a, 0x99, 0x80, 0x99, 0x81, 0x1e, 0x98,\n                                                              0x82, 0x99, 0x83, 0x75, 0x7a, 0xa, 0xe, 0xfb,\n                                                              0xa5, 0x52, 0x76, 0xf8, 0x46, 0xe8, 0x1, 0x79,\n                                                              0x74, 0x15, 0xa7, 0xb1, 0x8b, 0x8b, 0x9a, 0x1b,\n                                                              0xa4, 0xa4, 0x79, 0x78, 0xa8, 0x1f, 0x75, 0xac,\n                                                              0xb2, 0x73, 0xc0, 0x76, 0xa, 0x7f, 0x8e, 0x83,\n                                                              0x8f, 0x85, 0x1f, 0x91, 0x82, 0x92, 0x86, 0x82,\n                                                              0x1a, 0x84, 0x83, 0x83, 0x7e, 0x6f, 0x81, 0xa6,\n                                                              0xac, 0x7a, 0x1e, 0x7a, 0xab, 0x72, 0xb1, 0x51,\n                                                              0xa2, 0x80, 0xa, 0xfb, 0x2b, 0x70, 0x1d, 0xfb,\n                                                              0xf9, 0x5, 0xe, 0x8a, 0xa, 0x12, 0xa7, 0xf3,\n                                                              0x60, 0xf1, 0x13, 0xe0, 0xf7, 0x69, 0xfb, 0x43,\n                                                              0x15, 0x47, 0x95, 0x7e, 0xad, 0xaf, 0x1a, 0x13,\n                                                              0xd0, 0xc5, 0xc6, 0xf7, 0x2f, 0xc0, 0x1a, 0xb7,\n                                                              0x77, 0x9b, 0x47, 0x9c, 0x1e, 0x8d, 0x7, 0xf1,\n                                                              0x9d, 0xa6, 0xa5, 0x9d, 0xd2, 0xb8, 0xf7, 0x47,\n                                                              0x18, 0x9d, 0xd1, 0xae, 0xb8, 0xe0, 0x9a, 0x8e,\n                                                              0x97, 0x18, 0xfb, 0x19, 0x37, 0x77, 0xfb, 0xe,\n                                                              0x6c, 0x1f, 0x5d, 0xfb, 0x47, 0x7a, 0x49, 0x6f,\n                                                              0x6c, 0x2f, 0x78, 0x19, 0xc4, 0x7d, 0xa6, 0x79,\n                                                              0x60, 0x1a, 0x13, 0xe0, 0x64, 0x4e, 0xfb, 0x41,\n                                                              0x52, 0x1a, 0x4b, 0xb2, 0x6f, 0xf7, 0x23, 0x1e,\n                                                              0xe, 0xfc, 0x4e, 0xfb, 0x3b, 0x76, 0xf7, 0x53,\n                                                              0x8d, 0x1d, 0xb0, 0xe3, 0x3, 0xf7, 0x5d, 0xf9,\n                                                              0x41, 0x15, 0xcf, 0x6, 0xfb, 0x79, 0xfd, 0xfd,\n                                                              0x5, 0x47, 0x6, 0xe, 0x8a, 0xa, 0x1, 0xf7,\n                                                              0x8, 0xf1, 0x6d, 0xf3, 0x3, 0xfb, 0x12, 0xfb,\n                                                              0x43, 0x15, 0xe0, 0x9b, 0xad, 0xb1, 0x9e, 0xd1,\n                                                              0xb8, 0xf7, 0x3f, 0x18, 0x9e, 0xd3, 0xa6, 0xb1,\n                                                              0xf0, 0x9e, 0x8, 0x8d, 0x7, 0x47, 0x9b, 0x77,\n                                                              0x9a, 0xb6, 0xc0, 0xc6, 0xf7, 0x2f, 0xc6, 0x1a,\n                                                              0xb0, 0x7e, 0xad, 0x47, 0x96, 0x1e, 0x8e, 0x97,\n                                                              0x5, 0xf7, 0x23, 0xb2, 0x6d, 0x4b, 0x1f, 0x52,\n                                                              0x4e, 0xfb, 0x3e, 0x63, 0x1a, 0x60, 0xa6, 0x7a,\n                                                              0xc4, 0x7c, 0x1e, 0x2e, 0x78, 0x71, 0x5e, 0x79,\n                                                              0x49, 0x5d, 0xfb, 0x3f, 0x18, 0xfb, 0xd, 0x6b,\n                                                              0x38, 0x7c, 0xfb, 0x19, 0x1b, 0xe, 0x2f, 0xf7,\n                                                              0x45, 0xdf, 0x48, 0x76, 0xa2, 0x76, 0xd1, 0xdf,\n                                                              0x8f, 0x77, 0x12, 0x13, 0x50, 0xef, 0xf7, 0x41,\n                                                              0x15, 0xae, 0x9b, 0xa3, 0xb0, 0xb7, 0x1b, 0xb4,\n                                                              0xac, 0x7c, 0x7b, 0xaa, 0x1f, 0x13, 0x88, 0x79,\n                                                              0xae, 0xad, 0x78, 0xb6, 0x1b, 0xc9, 0xac, 0xb7,\n                                                              0xb5, 0xa9, 0x1f, 0x67, 0xd1, 0x5, 0x68, 0x74,\n                                                              0x72, 0x66, 0x63, 0x1b, 0x6e, 0x68, 0x9b, 0x9b,\n                                                              0x67, 0x1f, 0x13, 0x30, 0x9d, 0x64, 0x63, 0x9d,\n                                                              0x69, 0x1b, 0x48, 0x67, 0x5f, 0x61, 0x75, 0x1f,\n                                                              0xe, 0xfb, 0xa5, 0xfb, 0x4c, 0x76, 0xf8, 0xbd,\n                                                              0xf7, 0x24, 0x1, 0x9e, 0xf7, 0x29, 0x95, 0xf7,\n                                                              0x24, 0x3, 0xf7, 0x55, 0xf7, 0xa7, 0x15, 0x4c,\n                                                              0xfb, 0x39, 0x3a, 0xfb, 0x2f, 0x7b, 0x6d, 0x8,\n                                                              0x82, 0x7a, 0x86, 0x7a, 0x7c, 0x1a, 0x5d, 0xac,\n                                                              0x68, 0xae, 0xc6, 0x9e, 0xc1, 0xb5, 0x8e, 0x1e,\n                                                              0x94, 0xf7, 0x7, 0xa4, 0xf7, 0x32, 0x9f, 0xf2,\n                                                              0x8, 0x5f, 0xf7, 0x2d, 0x15, 0x63, 0xab, 0x6b,\n                                                              0xb3, 0xb3, 0xab, 0xab, 0xb3, 0xb3, 0x6b, 0xab,\n                                                              0x63, 0x63, 0x6b, 0x6b, 0x63, 0x1e, 0xe, 0xfb,\n                                                              0xe, 0x76, 0xf7, 0x2b, 0x76, 0xf8, 0x4f, 0xac,\n                                                              0xf7, 0x5, 0x77, 0x1, 0x97, 0xf7, 0x13, 0x3,\n                                                              0xf7, 0x6a, 0xc4, 0x15, 0x63, 0x9c, 0x86, 0xbe,\n                                                              0xa5, 0x1a, 0xce, 0xca, 0xf7, 0x68, 0xde, 0xa0,\n                                                              0x8e, 0x82, 0x84, 0x1e, 0xfb, 0x29, 0xfc, 0x3f,\n                                                              0x15, 0x5d, 0xfb, 0x16, 0x5, 0xad, 0x6, 0xba,\n                                                              0xf7, 0x19, 0xdd, 0x98, 0xb6, 0xc8, 0xb5, 0xc6,\n                                                              0x19, 0x70, 0x9d, 0x6b, 0x5b, 0x64, 0x63, 0x5c,\n                                                              0x8a, 0x19, 0xe7, 0xf7, 0x9a, 0x5, 0x85, 0x92,\n                                                              0x97, 0x86, 0x9d, 0x1b, 0xaa, 0xab, 0xa5, 0xb5,\n                                                              0xab, 0x79, 0xa9, 0x68, 0x9c, 0x1f, 0xb8, 0xf7,\n                                                              0x12, 0x5, 0x68, 0x6, 0x62, 0xfb, 0x8, 0x5,\n                                                              0x8d, 0x81, 0x81, 0x8c, 0x7f, 0x1b, 0xfb, 0x1b,\n                                                              0xfb, 0x26, 0xfb, 0x2e, 0xfb, 0x32, 0xfb, 0xe,\n                                                              0xe9, 0x61, 0xc1, 0x1f, 0xe, 0x7f, 0xaa, 0x6c,\n                                                              0xf3, 0x23, 0xf7, 0x42, 0xfb, 0x2c, 0x76, 0xf7,\n                                                              0x17, 0x77, 0xc2, 0x77, 0xf7, 0x43, 0xc7, 0xf7,\n                                                              0xab, 0xad, 0x12, 0x6b, 0xa9, 0x13, 0x4f, 0x80,\n                                                              0xf7, 0x30, 0xbc, 0x15, 0x6e, 0xab, 0xb8, 0x6b,\n                                                              0xb8, 0x1b, 0xe7, 0xb9, 0xd0, 0xed, 0x9d, 0x1f,\n                                                              0x72, 0x6, 0x67, 0x7b, 0x7f, 0x70, 0x46, 0x1b,\n                                                              0x65, 0x4a, 0xa5, 0x91, 0x7c, 0x1f, 0xad, 0xc0,\n                                                              0xaa, 0xde, 0x95, 0xbd, 0x8, 0xf7, 0x7, 0x6,\n                                                              0x95, 0xc7, 0x5, 0xfb, 0x6, 0x6, 0xb2, 0xf7,\n                                                              0x5e, 0x5, 0xbc, 0x94, 0xa0, 0xa7, 0xaa, 0x1b,\n                                                              0xa7, 0x87, 0x73, 0x73, 0x86, 0x1f, 0x89, 0x82,\n                                                              0x8a, 0x82, 0x83, 0x1a, 0x67, 0xab, 0x7c, 0xa0,\n                                                              0xa7, 0xac, 0xa2, 0xb7, 0xcc, 0x4f, 0xa6, 0x58,\n                                                              0x67, 0xfb, 0x37, 0x7d, 0xfb, 0xbf, 0x59, 0x1e,\n                                                              0x22, 0x6, 0x81, 0x4f, 0x5, 0xf7, 0x1, 0x6,\n                                                              0x83, 0x56, 0x86, 0x4d, 0x85, 0x5c, 0x8, 0x13,\n                                                              0x23, 0x80, 0x93, 0x78, 0x7d, 0x91, 0x6b, 0x1b,\n                                                              0x5d, 0x5d, 0x6d, 0x50, 0x1f, 0x13, 0x1f, 0x80,\n                                                              0x5e, 0xaf, 0x64, 0xbe, 0xca, 0xa2, 0xaf, 0xa3,\n                                                              0x9a, 0x1e, 0x60, 0xb4, 0x15, 0x13, 0x8f, 0x80,\n                                                              0x6a, 0x85, 0x7b, 0x65, 0x66, 0x1b, 0x75, 0x69,\n                                                              0x99, 0xad, 0xb7, 0xaa, 0x94, 0x9f, 0xa9, 0xa0,\n                                                              0x79, 0x7f, 0x98, 0x1f, 0xe, 0xd2, 0x76, 0xdc,\n                                                              0xd5, 0xf7, 0x65, 0xd5, 0xd4, 0x77, 0x1, 0xd3,\n                                                              0xdb, 0xf7, 0x5d, 0xda, 0x3, 0xf7, 0x1c, 0xf7,\n                                                              0xcc, 0x15, 0xca, 0xbe, 0xbf, 0xcb, 0xcd, 0xba,\n                                                              0x55, 0x4c, 0x4a, 0x5b, 0x54, 0x48, 0x4a, 0x5b,\n                                                              0xc4, 0xcc, 0x1e, 0x39, 0xfb, 0x8e, 0x15, 0xe1,\n                                                              0xe3, 0x5, 0x78, 0xa7, 0xb3, 0x7c, 0xb6, 0x1b,\n                                                              0xb6, 0xb1, 0x9a, 0x9e, 0xa7, 0x1f, 0xe1, 0x33,\n                                                              0xbf, 0xbf, 0x34, 0xe3, 0x5, 0xa0, 0xa6, 0x96,\n                                                              0xb2, 0xb6, 0x1a, 0xb6, 0x7d, 0xb1, 0x78, 0xa7,\n                                                              0x1e, 0xe3, 0xe3, 0x57, 0xbd, 0x34, 0x35, 0x5,\n                                                              0x9e, 0x6e, 0x67, 0x95, 0x5f, 0x1b, 0x62, 0x62,\n                                                              0x81, 0x78, 0x6f, 0x1f, 0x35, 0xe1, 0x57, 0x59,\n                                                              0xe3, 0x33, 0x5, 0x78, 0x70, 0x7c, 0x64, 0x60,\n                                                              0x1a, 0x60, 0x98, 0x65, 0xa0, 0x6f, 0x1e, 0x33,\n                                                              0x33, 0x5, 0xe, 0x8b, 0xa4, 0xf7, 0x1f, 0xbd,\n                                                              0xd9, 0xbd, 0xf7, 0xc2, 0xa4, 0x1, 0xb9, 0x16,\n                                                              0xf7, 0xd6, 0xa4, 0x6, 0x59, 0x8d, 0x6c, 0x8c,\n                                                              0xb4, 0x1a, 0xa8, 0x98, 0xb6, 0x91, 0xa2, 0x1e,\n                                                              0xf7, 0x2c, 0x6, 0x99, 0xbd, 0x5, 0xfb, 0x2c,\n                                                              0x6, 0xa0, 0xd9, 0x5, 0xf7, 0x2a, 0x6, 0x98,\n                                                              0xbd, 0x5, 0xfb, 0x1b, 0x6, 0xf7, 0x30, 0xf7,\n                                                              0x7d, 0x90, 0x1d, 0xb8, 0x93, 0x19, 0xa4, 0xfb,\n                                                              0x5c, 0x72, 0x7, 0xc7, 0xa1, 0x7c, 0x79, 0x82,\n                                                              0x86, 0x80, 0x84, 0x80, 0x1f, 0xfb, 0x2b, 0xfb,\n                                                              0x80, 0x5, 0x74, 0xc1, 0x56, 0xf7, 0x54, 0x9d,\n                                                              0x1a, 0xa2, 0x97, 0x98, 0xca, 0x1e, 0xa4, 0xfb,\n                                                              0xac, 0x72, 0x7, 0xc0, 0x84, 0x8a, 0x92, 0xa1,\n                                                              0x64, 0xd8, 0xfb, 0x9b, 0x18, 0xfb, 0x11, 0x6,\n                                                              0x7d, 0x59, 0x5, 0xf7, 0x22, 0x6, 0x75, 0x3d,\n                                                              0x5, 0xfb, 0x21, 0x6, 0x7d, 0x59, 0x5, 0xf7,\n                                                              0x21, 0x6, 0x70, 0x2c, 0x7f, 0x62, 0x71, 0x8d,\n                                                              0x4c, 0x86, 0x19, 0xe, 0xfc, 0x4e, 0x3e, 0x76,\n                                                              0xf0, 0x76, 0xf7, 0x96, 0x77, 0xad, 0x77, 0xf8,\n                                                              0x57, 0x77, 0x12, 0xcd, 0xe3, 0x13, 0xdc, 0xf5,\n                                                              0xf7, 0xf5, 0x15, 0xcf, 0x6, 0xef, 0xf7, 0xe0,\n                                                              0x5, 0x43, 0x6, 0xfb, 0x78, 0xfd, 0xa3, 0x15,\n                                                              0xd4, 0x6, 0x13, 0xec, 0xeb, 0xf7, 0xe6, 0x5,\n                                                              0x47, 0x6, 0xe, 0xfb, 0xe, 0x76, 0xa2, 0x77,\n                                                              0xf7, 0x99, 0xa6, 0xf7, 0x90, 0xa4, 0xf7, 0x78,\n                                                              0xa1, 0x12, 0xaf, 0xf7, 0x6, 0x9d, 0xd1, 0xa9,\n                                                              0xd8, 0x9e, 0xd2, 0x13, 0x7f, 0x80, 0xf7, 0xb2,\n                                                              0xf7, 0xd, 0x15, 0x8d, 0x8f, 0x5, 0x88, 0x93,\n                                                              0x95, 0x8a, 0x97, 0x1b, 0xc6, 0xc5, 0xbc, 0xd6,\n                                                              0xca, 0x62, 0xc1, 0x78, 0xa3, 0x1f, 0x26, 0xf7,\n                                                              0xc, 0x67, 0xb5, 0xb4, 0x1a, 0xb0, 0xa3, 0xb0,\n                                                              0xc3, 0xaf, 0xa7, 0x7c, 0x7f, 0x82, 0x83, 0x87,\n                                                              0x83, 0x84, 0x1e, 0x80, 0x84, 0x82, 0x81, 0x77,\n                                                              0x1a, 0x70, 0xa3, 0x71, 0xaa, 0xa0, 0xb0, 0x99,\n                                                              0xbb, 0xb7, 0x62, 0xc0, 0x27, 0x37, 0x49, 0x55,\n                                                              0x3a, 0x4b, 0xb7, 0x56, 0x96, 0x80, 0x1e, 0x89,\n                                                              0x88, 0x5, 0x8f, 0x7e, 0x6d, 0x8d, 0x86, 0x1b,\n                                                              0xfb, 0x0, 0x6e, 0xfb, 0x2b, 0x28, 0xde, 0x1f,\n                                                              0xf7, 0x16, 0xfb, 0x34, 0x9e, 0x77, 0x63, 0x1a,\n                                                              0x4e, 0x4f, 0x7d, 0x70, 0x75, 0x5f, 0x95, 0x9d,\n                                                              0x96, 0x93, 0x8f, 0x94, 0x93, 0x1e, 0x94, 0x93,\n                                                              0x94, 0x94, 0xa2, 0x1a, 0xb4, 0x66, 0x95, 0x77,\n                                                              0x6f, 0x6e, 0x76, 0x64, 0x1e, 0x13, 0xbf, 0x80,\n                                                              0x52, 0xc4, 0x5b, 0xe3, 0xe2, 0xd8, 0xc4, 0xd8,\n                                                              0xc6, 0x64, 0xb9, 0x77, 0xa4, 0x1e, 0x3b, 0xec,\n                                                              0x15, 0x88, 0x8e, 0x4b, 0xcf, 0xbe, 0x1a, 0xb2,\n                                                              0xa5, 0xa0, 0xab, 0xc2, 0xf7, 0x4, 0xfb, 0x17,\n                                                              0x50, 0x60, 0x69, 0x78, 0x72, 0x6e, 0x7a, 0x97,\n                                                              0xc5, 0x56, 0x1e, 0xe, 0xfb, 0xdd, 0xf8, 0xa1,\n                                                              0xf7, 0x16, 0x1, 0xb8, 0xf7, 0x16, 0xdf, 0xf7,\n                                                              0x16, 0x3, 0xb8, 0xf8, 0xe2, 0x15, 0x4b, 0xa,\n                                                              0xf7, 0x68, 0x16, 0x4b, 0xa, 0xe, 0xe0, 0x79,\n                                                              0xb9, 0xf7, 0x4, 0xa2, 0xe2, 0x77, 0xf7, 0xb4,\n                                                              0x9f, 0xf0, 0xb9, 0x1, 0x9f, 0xc8, 0x58, 0xc8,\n                                                              0xe4, 0xe0, 0xf8, 0x1c, 0xc8, 0x3, 0xa9, 0xf7,\n                                                              0xe1, 0x15, 0xf7, 0x57, 0xf7, 0x2b, 0xf7, 0x31,\n                                                              0xf7, 0x55, 0xf7, 0x55, 0xf7, 0x2b, 0xfb, 0x31,\n                                                              0xfb, 0x58, 0xfb, 0x58, 0xfb, 0x2b, 0xfb, 0x2e,\n                                                              0xfb, 0x55, 0xfb, 0x55, 0xfb, 0x2b, 0xf7, 0x2f,\n                                                              0xf7, 0x58, 0x1e, 0xc8, 0x16, 0xfb, 0x38, 0xf7,\n                                                              0x12, 0xfb, 0x21, 0xf7, 0x31, 0xf7, 0x31, 0xf7,\n                                                              0x12, 0xf7, 0x20, 0xf7, 0x38, 0xf7, 0x38, 0xfb,\n                                                              0x12, 0xf7, 0x23, 0xfb, 0x31, 0xfb, 0x32, 0xfb,\n                                                              0x11, 0xfb, 0x23, 0xfb, 0x37, 0x1e, 0xf8, 0x59,\n                                                              0x38, 0x15, 0x7a, 0x43, 0x5, 0x70, 0x6e, 0x66,\n                                                              0x80, 0x48, 0x1b, 0xfb, 0xc, 0x2d, 0xc8, 0xf7,\n                                                              0x21, 0xe0, 0xc8, 0xf7, 0x3, 0xf7, 0x32, 0xc0,\n                                                              0xa5, 0x82, 0x82, 0xa6, 0x1f, 0x9a, 0x86, 0x92,\n                                                              0x84, 0x82, 0x1a, 0x44, 0x7a, 0x7, 0xb6, 0x83,\n                                                              0x70, 0xba, 0x3f, 0x1b, 0x2f, 0x61, 0x3e, 0x28,\n                                                              0x20, 0xa8, 0x43, 0xef, 0xcc, 0xba, 0xb2, 0xbb,\n                                                              0x9f, 0x1f, 0xe, 0xfc, 0x20, 0xf8, 0x24, 0xb8,\n                                                              0x72, 0x76, 0xf7, 0x97, 0xa6, 0x12, 0x9b, 0xd9,\n                                                              0x13, 0x70, 0xf7, 0x54, 0xf8, 0x6f, 0x15, 0x87,\n                                                              0x7b, 0x88, 0x81, 0x81, 0x1a, 0x6c, 0xaa, 0x82,\n                                                              0x97, 0xb3, 0xb0, 0xb8, 0xaa, 0xa0, 0x1e, 0x7e,\n                                                              0x94, 0x5, 0x7f, 0x85, 0x6f, 0x6e, 0x7f, 0x1b,\n                                                              0x88, 0x89, 0x8d, 0x91, 0xa1, 0x98, 0xb2, 0x94,\n                                                              0xa7, 0x1f, 0xb9, 0xf7, 0x20, 0x3f, 0x88, 0x81,\n                                                              0x6a, 0x6f, 0xa, 0x9a, 0x88, 0x84, 0xa5, 0x64,\n                                                              0x1b, 0x39, 0x2c, 0xfb, 0xb, 0x33, 0x1f, 0x13,\n                                                              0xb0, 0x77, 0x92, 0x51, 0xcc, 0xc1, 0xac, 0xbd,\n                                                              0xa6, 0x9a, 0x1e, 0x2b, 0x16, 0xb8, 0xc5, 0xf7,\n                                                              0x1c, 0xba, 0x94, 0x95, 0x7f, 0x7a, 0x63, 0x5e,\n                                                              0xfb, 0x24, 0x52, 0x88, 0x78, 0x8f, 0xa7, 0x1e,\n                                                              0xe, 0x72, 0x1d, 0x97, 0xf7, 0x6d, 0x71, 0x1d,\n                                                              0x81, 0x94, 0x96, 0x82, 0x93, 0x1b, 0x91, 0x8f,\n                                                              0x8e, 0x98, 0x1f, 0x41, 0x8d, 0xa, 0xe3, 0x5f,\n                                                              0xa, 0xf7, 0x4d, 0x82, 0x71, 0x1d, 0x80, 0x94,\n                                                              0x97, 0x8a, 0x1d, 0x41, 0x8d, 0xa, 0xe3, 0xdc,\n                                                              0xaf, 0x1a, 0x94, 0x88, 0x8e, 0x86, 0x79, 0x60,\n                                                              0x62, 0x7b, 0x6c, 0xa, 0xe, 0x53, 0xf7, 0x15,\n                                                              0x76, 0xf7, 0x5d, 0xce, 0x48, 0xe5, 0x1, 0xf8,\n                                                              0x65, 0xe5, 0x43, 0xd3, 0x3, 0xbe, 0xf7, 0xc9,\n                                                              0x15, 0xf8, 0x44, 0xfb, 0x5d, 0xd3, 0xf7, 0xa0,\n                                                              0xfc, 0x8c, 0x6, 0xe, 0xe0, 0x79, 0xb9, 0xf7,\n                                                              0xf, 0xf7, 0x4e, 0xf7, 0x3d, 0xa0, 0xf7, 0x4,\n                                                              0xb9, 0x1, 0xa9, 0xc8, 0xf7, 0x3a, 0xd2, 0xf7,\n                                                              0x1, 0xd4, 0xf7, 0x27, 0xc8, 0x3, 0xa9, 0xf7,\n                                                              0xe3, 0x15, 0xfb, 0x58, 0xf7, 0x2b, 0xfb, 0x31,\n                                                              0xf7, 0x55, 0xf7, 0x55, 0xf7, 0x2b, 0xf7, 0x2d,\n                                                              0xf7, 0x58, 0xf7, 0x58, 0xfb, 0x2b, 0xf7, 0x32,\n                                                              0xfb, 0x55, 0xfb, 0x55, 0xfb, 0x2b, 0xfb, 0x2f,\n                                                              0xfb, 0x57, 0x1e, 0xc8, 0x16, 0xf7, 0x38, 0xf7,\n                                                              0x11, 0xf7, 0x20, 0xf7, 0x32, 0xf7, 0x32, 0xf7,\n                                                              0x11, 0xfb, 0x24, 0xfb, 0x38, 0xfb, 0x38, 0xfb,\n                                                              0x11, 0xfb, 0x1f, 0xfb, 0x32, 0xfb, 0x31, 0xfb,\n                                                              0x12, 0xf7, 0x23, 0xf7, 0x38, 0x1e, 0xf7, 0xb,\n                                                              0xfb, 0x4c, 0x15, 0xf7, 0x3a, 0x9b, 0x6, 0x5a,\n                                                              0x90, 0x8c, 0x8c, 0xb5, 0x1a, 0xf1, 0xb7, 0x7,\n                                                              0x30, 0xc8, 0xc8, 0x40, 0x89, 0x1b, 0xd1, 0x6,\n                                                              0x77, 0xa5, 0x6e, 0xad, 0x37, 0xf7, 0x9, 0x8,\n                                                              0xbb, 0x9a, 0xac, 0xb3, 0xbd, 0x1a, 0xcc, 0x54,\n                                                              0xa8, 0x4d, 0x1e, 0xfb, 0x4b, 0x7b, 0x6, 0xbc,\n                                                              0x86, 0x89, 0x8a, 0x62, 0x1a, 0xfb, 0x8d, 0x7,\n                                                              0x61, 0x8d, 0x8a, 0x5a, 0x86, 0x1e, 0xf7, 0xa,\n                                                              0xf7, 0x3e, 0x15, 0xf7, 0x3d, 0xb3, 0x7, 0xb2,\n                                                              0xa9, 0x78, 0x51, 0x56, 0x77, 0x64, 0x5b, 0x1f,\n                                                              0xe, 0xfb, 0xdd, 0xf8, 0xbd, 0xd1, 0x1, 0xbe,\n                                                              0xf8, 0xbd, 0x15, 0xf7, 0xd8, 0x6, 0x9d, 0xd1,\n                                                              0x5, 0xfb, 0xd7, 0x6, 0xe, 0xfb, 0x9a, 0xf8,\n                                                              0x36, 0x76, 0xf7, 0xb2, 0x77, 0x1, 0xde, 0xf8,\n                                                              0xb2, 0x15, 0x3c, 0xcb, 0x49, 0xda, 0xda, 0xcb,\n                                                              0xc9, 0xda, 0xda, 0x4b, 0xcd, 0x3c, 0x3c, 0x4b,\n                                                              0x4d, 0x3c, 0x1e, 0xb1, 0x8a, 0x15, 0x51, 0xb9,\n                                                              0x5b, 0xc5, 0xc5, 0xba, 0xb7, 0xc5, 0xc5, 0x5c,\n                                                              0xbc, 0x51, 0x51, 0x5d, 0x5e, 0x51, 0x1e, 0xe,\n                                                              0x2f, 0x8b, 0xe4, 0xb2, 0x77, 0xf7, 0x36, 0xe4,\n                                                              0x3c, 0xc9, 0xf7, 0x38, 0x77, 0x12, 0xf7, 0x85,\n                                                              0xe3, 0x3e, 0xcc, 0x13, 0xea, 0xf7, 0x90, 0xf7,\n                                                              0x14, 0x15, 0xcc, 0x6, 0x13, 0xda, 0xf7, 0x2c,\n                                                              0xf7, 0x70, 0xc9, 0xfb, 0x70, 0xf7, 0x38, 0x4a,\n                                                              0xfb, 0x38, 0xfb, 0x6f, 0x4d, 0xf7, 0x6f, 0x7,\n                                                              0xfb, 0x6f, 0xfb, 0xac, 0x15, 0xf8, 0x8c, 0x6,\n                                                              0x13, 0xec, 0xcf, 0xfc, 0x8c, 0x7, 0xe, 0xfb,\n                                                              0xfe, 0xf7, 0xa6, 0xd0, 0xf7, 0xab, 0xc8, 0x1,\n                                                              0x8d, 0xf7, 0xa6, 0x5e, 0x1d, 0xef, 0x5, 0xb6,\n                                                              0xaa, 0xbc, 0xbd, 0x52, 0xa, 0x6d, 0x66, 0x61,\n                                                              0x1f, 0x6b, 0x68, 0x8b, 0x84, 0xfb, 0x8, 0xfb,\n                                                              0x2, 0x8, 0xe, 0xfb, 0xfe, 0xf7, 0xb2, 0x76,\n                                                              0xf8, 0x3, 0xbe, 0x12, 0xf7, 0x66, 0xdf, 0x4e,\n                                                              0xe3, 0x13, 0xe0, 0xf7, 0x2, 0xf8, 0x75, 0x15,\n                                                              0xcc, 0xae, 0x69, 0x4f, 0x69, 0x66, 0x4f, 0x69,\n                                                              0x81, 0x82, 0x8f, 0x97, 0x83, 0x67, 0x1d, 0xcf,\n                                                              0xe1, 0xbc, 0x74, 0xa3, 0x6e, 0x9e, 0x1f, 0x13,\n                                                              0xd0, 0x63, 0x1d, 0x69, 0xa, 0xe, 0x7f, 0x1d,\n                                                              0xf7, 0x49, 0x77, 0x1, 0xf7, 0x1f, 0xf8, 0x98,\n                                                              0x15, 0xbd, 0x6, 0xf7, 0x2b, 0x21, 0x1d, 0xe,\n                                                              0x35, 0xfb, 0x4e, 0x76, 0xf7, 0x63, 0xd1, 0x4d,\n                                                              0x76, 0xf7, 0x11, 0x77, 0xf7, 0xf9, 0x77, 0x12,\n                                                              0x4f, 0xf7, 0xb, 0x13, 0xdc, 0xf7, 0xaf, 0xf7,\n                                                              0x4, 0x15, 0x83, 0x6c, 0x89, 0x7c, 0x7a, 0x1a,\n                                                              0x6d, 0xa1, 0x6b, 0xb3, 0xda, 0xba, 0xd6, 0xc3,\n                                                              0xb5, 0x1e, 0x76, 0x9b, 0x5, 0x13, 0xbc, 0x71,\n                                                              0x80, 0x6b, 0x67, 0x79, 0x1b, 0x80, 0x85, 0x94,\n                                                              0xab, 0x93, 0x1f, 0xf3, 0xf7, 0xe4, 0x5, 0xfb,\n                                                              0x1b, 0x6, 0x58, 0xfb, 0x38, 0x5, 0xfb, 0xe,\n                                                              0x62, 0x42, 0x2e, 0x53, 0x1b, 0x6e, 0x95, 0xb7,\n                                                              0xa2, 0x91, 0x1f, 0xe8, 0xf7, 0xcc, 0x5, 0x13,\n                                                              0xdc, 0xfb, 0x1b, 0x6, 0xfb, 0x3, 0xfc, 0xb,\n                                                              0x5, 0x5f, 0xfb, 0x12, 0x81, 0x54, 0x64, 0x1a,\n                                                              0x60, 0xa0, 0x79, 0xa9, 0xb3, 0xa7, 0xae, 0xbd,\n                                                              0xb6, 0x87, 0xc0, 0x9c, 0xbd, 0x1e, 0x7a, 0xa2,\n                                                              0x94, 0x84, 0xae, 0x1b, 0xc0, 0xcd, 0xd2, 0xb4,\n                                                              0xa2, 0x1f, 0xe, 0xfb, 0x57, 0x76, 0xf9, 0xdc,\n                                                              0xb1, 0x12, 0xb2, 0xf7, 0x64, 0x42, 0xe4, 0xf7,\n                                                              0x2c, 0xe4, 0x13, 0xd8, 0xf7, 0x11, 0xfb, 0x6c,\n                                                              0x15, 0xbc, 0x6, 0xf7, 0x85, 0xf9, 0xdc, 0x5,\n                                                              0xe4, 0x6, 0xfb, 0x85, 0xfd, 0xdc, 0x5, 0xbc,\n                                                              0x6, 0xf7, 0x69, 0xf9, 0x7e, 0x5, 0xed, 0xa7,\n                                                              0x92, 0x9b, 0xe5, 0x1b, 0x90, 0x9d, 0x5, 0xfb,\n                                                              0xbd, 0x6, 0x13, 0xe8, 0xfb, 0x64, 0xfb, 0x3,\n                                                              0xfb, 0x30, 0xfb, 0x1c, 0xfb, 0x13, 0xf0, 0x6c,\n                                                              0xf6, 0x89, 0x1f, 0xe, 0xfc, 0x30, 0xf7, 0x95,\n                                                              0xf7, 0x28, 0x1, 0xbe, 0xf7, 0x28, 0x3, 0xbe,\n                                                              0xf7, 0xdf, 0x3c, 0xa, 0xfb, 0xdd, 0xfb, 0x6e,\n                                                              0xb4, 0x80, 0xd8, 0x49, 0xd8, 0xf4, 0x77, 0x12,\n                                                              0x13, 0x50, 0xb4, 0x90, 0x15, 0x49, 0x2a, 0x98,\n                                                              0x7f, 0x5, 0x13, 0xb0, 0x7d, 0xa, 0x72, 0x7c,\n                                                              0x6c, 0x6e, 0x7b, 0x86, 0xa, 0x9f, 0x79, 0xbf,\n                                                              0x1b, 0xc0, 0xe9, 0xa3, 0xca, 0xbf, 0x5e, 0x9e,\n                                                              0x67, 0x7d, 0x7e, 0x8b, 0x89, 0x83, 0x1f, 0xb8,\n                                                              0xce, 0x5, 0xe, 0xfb, 0xfe, 0xf7, 0xbb, 0x76,\n                                                              0xf7, 0x17, 0x76, 0xf7, 0xbf, 0x77, 0x1, 0xa9,\n                                                              0xf8, 0x14, 0x8c, 0xa, 0x62, 0x71, 0x91, 0xa0,\n                                                              0x93, 0x1f, 0x9d, 0xb9, 0xc7, 0xf7, 0x21, 0xa7,\n                                                              0xcd, 0x5e, 0x82, 0x66, 0x83, 0x2c, 0x7d, 0x89,\n                                                              0x76, 0x18, 0xa8, 0xb3, 0x93, 0x71, 0x7c, 0x45,\n                                                              0xfb, 0x1f, 0x7b, 0x6e, 0x1f, 0x70, 0x7d, 0x66,\n                                                              0x8b, 0x73, 0x1b, 0xe, 0xfb, 0xfe, 0xf8, 0x24,\n                                                              0x9f, 0xf7, 0x89, 0x9f, 0x1, 0xf7, 0x9e, 0xdc,\n                                                              0x3, 0xf7, 0x1d, 0xf8, 0x5f, 0x15, 0xb2, 0xae,\n                                                              0xf7, 0x3b, 0xd2, 0x95, 0x98, 0x85, 0x6d, 0x5e,\n                                                              0x64, 0xfb, 0x38, 0x4d, 0x6f, 0x8b, 0xa6, 0x97,\n                                                              0x1e, 0x3a, 0xa9, 0x15, 0x52, 0xbe, 0x6b, 0xc0,\n                                                              0xf3, 0xde, 0xf2, 0xe5, 0xdb, 0x3f, 0x97, 0x72,\n                                                              0x24, 0x34, 0x24, 0x2e, 0x1e, 0xe, 0x72, 0x1d,\n                                                              0xf7, 0xeb, 0x49, 0x1d, 0x95, 0x82, 0x80, 0x94,\n                                                              0x83, 0x88, 0x1d, 0x88, 0x7e, 0x1f, 0xfb, 0x4,\n                                                              0xfb, 0x40, 0x70, 0xa, 0x8f, 0x88, 0x90, 0x9d,\n                                                              0xb5, 0xb5, 0x9a, 0x4a, 0xa, 0x95, 0x82, 0x80,\n                                                              0x94, 0x83, 0x88, 0x1d, 0x88, 0x7e, 0x1f, 0xe,\n                                                              0x86, 0x1d, 0xf8, 0xa7, 0x77, 0xa2, 0x77, 0x12,\n                                                              0x13, 0x70, 0xf8, 0x11, 0xe3, 0x15, 0xf7, 0x33,\n                                                              0x6, 0x13, 0x90, 0x70, 0x33, 0x5, 0xe1, 0x6,\n                                                              0x13, 0x70, 0x48, 0xa, 0xfc, 0x39, 0xfb, 0x37,\n                                                              0x61, 0x1d, 0xfc, 0xc8, 0xfc, 0x2a, 0x8c, 0xa,\n                                                              0x5d, 0x7e, 0x92, 0xa2, 0x93, 0x8e, 0x95, 0x8e,\n                                                              0x97, 0x1f, 0x13, 0x88, 0x6e, 0x1d, 0x94, 0x70,\n                                                              0x6b, 0xa, 0xe3, 0x8b, 0xd0, 0x4d, 0x76, 0xf7,\n                                                              0x14, 0x77, 0xf7, 0x92, 0xc8, 0xf7, 0xa3, 0x77,\n                                                              0xa2, 0x77, 0x12, 0x13, 0x78, 0xf7, 0xd, 0x7d,\n                                                              0x61, 0x1d, 0x13, 0xb4, 0xfb, 0x24, 0xfd, 0x3c,\n                                                              0x5e, 0x1d, 0xee, 0x5, 0xb6, 0xaa, 0xbc, 0xbe,\n                                                              0x52, 0xa, 0x63, 0x66, 0x61, 0x1f, 0x6b, 0x68,\n                                                              0x8b, 0x8b, 0xfb, 0x8, 0xfb, 0x2, 0x8, 0xfc,\n                                                              0x39, 0xf7, 0x96, 0x8c, 0xa, 0x5f, 0x7c, 0x90,\n                                                              0xa0, 0x94, 0x8d, 0x96, 0x8f, 0x99, 0x1f, 0x6e,\n                                                              0x1d, 0x93, 0x71, 0x6b, 0xa, 0x86, 0x1d, 0xf7,\n                                                              0x8, 0x77, 0xf7, 0x80, 0xf7, 0x5b, 0x5b, 0xbb,\n                                                              0x8e, 0x77, 0x12, 0xf7, 0x5c, 0xdf, 0x4e, 0xe3,\n                                                              0x13, 0x79, 0x0, 0xf7, 0x21, 0x7d, 0x61, 0x1d,\n                                                              0xfc, 0x70, 0xfb, 0x5b, 0x15, 0xcc, 0xae, 0x69,\n                                                              0x4f, 0x5c, 0x6c, 0x61, 0x65, 0x7e, 0x80, 0x8f,\n                                                              0x92, 0x86, 0x67, 0x1d, 0xd1, 0xe1, 0xbc, 0x74,\n                                                              0xa1, 0x6e, 0x9e, 0x1f, 0x13, 0x92, 0x80, 0x63,\n                                                              0x1d, 0x13, 0x94, 0x80, 0x69, 0xa, 0x13, 0x79,\n                                                              0x0, 0xf7, 0xb0, 0xfc, 0x2b, 0x15, 0xf7, 0x33,\n                                                              0x6, 0x13, 0x99, 0x0, 0x70, 0x33, 0x5, 0xe1,\n                                                              0x6, 0x13, 0x79, 0x0, 0x48, 0xa, 0xe, 0xfb,\n                                                              0x61, 0xaa, 0x6c, 0xf7, 0x58, 0xf7, 0xf5, 0xf7,\n                                                              0x28, 0x12, 0xa9, 0xf7, 0x13, 0xf7, 0x8, 0xf7,\n                                                              0x28, 0x13, 0x78, 0xf7, 0xc4, 0xf7, 0xa3, 0x15,\n                                                              0x73, 0x50, 0x7c, 0x6c, 0x60, 0x6f, 0x8, 0xfb,\n                                                              0x19, 0x34, 0x50, 0x5a, 0x3d, 0x1a, 0x5c, 0xa8,\n                                                              0x2a, 0xf7, 0x29, 0xf7, 0x1, 0xcb, 0xc9, 0xcf,\n                                                              0xaf, 0x71, 0xa9, 0x68, 0x6b, 0x6e, 0x72, 0x69,\n                                                              0x78, 0x93, 0x7f, 0x92, 0x81, 0x1e, 0x92, 0x81,\n                                                              0x92, 0x83, 0x82, 0x1a, 0x13, 0xb8, 0x76, 0x6a,\n                                                              0x7a, 0x6f, 0x6c, 0x64, 0x9b, 0xcd, 0xc1, 0xa9,\n                                                              0xbd, 0xd6, 0xe8, 0x1e, 0xc8, 0xd7, 0x92, 0xbd,\n                                                              0x8e, 0xac, 0x8, 0x4f, 0xf7, 0x2e, 0x3c, 0xa,\n                                                              0x51, 0x1d, 0xf7, 0x85, 0x77, 0x1, 0xf8, 0x3c,\n                                                              0xf9, 0x67, 0x7b, 0xa, 0xfb, 0x2, 0xf7, 0x26,\n                                                              0x5, 0x98, 0x80, 0x78, 0xa1, 0x30, 0x1d, 0xfb,\n                                                              0xfa, 0xfd, 0xc0, 0x33, 0xa, 0x51, 0x1d, 0xf7,\n                                                              0x85, 0x77, 0x1, 0xf7, 0xcb, 0xf9, 0x67, 0x22,\n                                                              0x1d, 0xfc, 0x88, 0xfd, 0xea, 0x33, 0xa, 0x51,\n                                                              0x1d, 0xf7, 0x7e, 0x5a, 0x1d, 0xfc, 0x5a, 0xfe,\n                                                              0x15, 0x24, 0x1d, 0x56, 0xa, 0xf8, 0x4d, 0x77,\n                                                              0xd5, 0x83, 0x1d, 0x5e, 0xd6, 0x12, 0x13, 0xe4,\n                                                              0xf7, 0x93, 0xf9, 0x7c, 0x15, 0x13, 0xe8, 0x9e,\n                                                              0x93, 0x94, 0xa3, 0xac, 0x1b, 0xac, 0xa2, 0x84,\n                                                              0x80, 0xa0, 0x1f, 0x13, 0xf0, 0x7f, 0xa6, 0x9f,\n                                                              0x7d, 0xa6, 0x1b, 0xe1, 0xa3, 0xde, 0xaf, 0x93,\n                                                              0x1f, 0x62, 0x6, 0x78, 0x82, 0x82, 0x74, 0x68,\n                                                              0x1b, 0x7c, 0x73, 0x96, 0x96, 0x70, 0x1f, 0x96,\n                                                              0x70, 0x6f, 0x94, 0x70, 0x1b, 0x28, 0x79, 0xfb,\n                                                              0x7, 0x88, 0x1f, 0x35, 0xfd, 0x7c, 0x15, 0xae,\n                                                              0x7, 0x23, 0x1d, 0x68, 0x7, 0xf8, 0xc, 0xf8,\n                                                              0x7f, 0x15, 0x74, 0x1d, 0xfb, 0x4d, 0x6, 0xe,\n                                                              0x56, 0xa, 0xf8, 0x59, 0x77, 0xba, 0xf7, 0x1a,\n                                                              0xfb, 0xd, 0xf7, 0x1a, 0x12, 0xf7, 0x80, 0xf7,\n                                                              0x1a, 0xbd, 0xf7, 0x1a, 0x13, 0xee, 0xf7, 0x73,\n                                                              0xf9, 0xaf, 0x15, 0x13, 0xf6, 0x20, 0x1d, 0xf7,\n                                                              0x68, 0x2b, 0xa, 0xfc, 0x8a, 0xfd, 0xaf, 0x24,\n                                                              0x1d, 0x51, 0x1d, 0xb8, 0xbb, 0xf7, 0x1, 0xbc,\n                                                              0x1, 0xf7, 0xb0, 0xbb, 0xf7, 0x8, 0xbc, 0x3,\n                                                              0xf7, 0xb0, 0xf9, 0xc2, 0x15, 0x4f, 0xb9, 0x5d,\n                                                              0xc7, 0xc6, 0xbb, 0xba, 0xc6, 0xc6, 0x5b, 0xbb,\n                                                              0x50, 0x50, 0x5c, 0x5b, 0x5e, 0xa, 0xfc, 0x23,\n                                                              0xfd, 0xc2, 0x24, 0x1d, 0xf7, 0xae, 0x8b, 0xab,\n                                                              0xf7, 0x73, 0xb2, 0xb7, 0xab, 0xf7, 0x9f, 0xab,\n                                                              0x1, 0x4b, 0xab, 0x15, 0xac, 0x90, 0x8a, 0x8b,\n                                                              0xc3, 0xd3, 0xf8, 0x2, 0xf8, 0x5b, 0x18, 0x98,\n                                                              0x9b, 0x92, 0x99, 0x98, 0x1a, 0xa0, 0x6d, 0x93,\n                                                              0x58, 0x1e, 0xac, 0xf8, 0xe1, 0x7, 0x5e, 0xfb,\n                                                              0x52, 0x73, 0x90, 0x5, 0xf7, 0x14, 0x39, 0xa4,\n                                                              0x3c, 0x56, 0x87, 0x80, 0x76, 0x86, 0x1e, 0x4a,\n                                                              0xfb, 0x7f, 0xf0, 0x88, 0xc0, 0x98, 0xb3, 0xeb,\n                                                              0x19, 0xa5, 0x87, 0x42, 0xfb, 0xa5, 0x72, 0x90,\n                                                              0x98, 0xe9, 0x77, 0xb6, 0xfb, 0xf, 0x88, 0x19,\n                                                              0x4c, 0xfb, 0x85, 0x5, 0x89, 0x82, 0x8a, 0x83,\n                                                              0x85, 0x1a, 0x6f, 0x9d, 0x7d, 0xa7, 0xf7, 0x2b,\n                                                              0xcf, 0xba, 0xf7, 0xc, 0xd3, 0x1e, 0xa5, 0x88,\n                                                              0x50, 0xfb, 0x58, 0x5, 0xfc, 0xa3, 0xab, 0x6,\n                                                              0xba, 0x93, 0x9a, 0x90, 0x9b, 0xc5, 0xb9, 0xf7,\n                                                              0x2c, 0x18, 0xfb, 0x54, 0x6, 0xfb, 0x6, 0xfb,\n                                                              0x2a, 0x5, 0x82, 0x7e, 0x86, 0x80, 0x81, 0x1a,\n                                                              0x71, 0xa0, 0x7e, 0xb5, 0x1e, 0x6b, 0xfb, 0x57,\n                                                              0x7, 0xf8, 0x62, 0xf7, 0xba, 0x15, 0xe7, 0xf7,\n                                                              0xd7, 0x5, 0x7f, 0x6, 0xfb, 0x91, 0xfb, 0xd7,\n                                                              0x5, 0xe, 0x90, 0xfb, 0x6e, 0xb4, 0xf7, 0x6f,\n                                                              0x76, 0xae, 0xbf, 0xf8, 0xaf, 0xae, 0x1, 0xab,\n                                                              0xf7, 0x2e, 0xef, 0xb8, 0xf7, 0xa1, 0xab, 0x98,\n                                                              0xa9, 0x3, 0xf7, 0x7f, 0x2f, 0x15, 0x98, 0x7f,\n                                                              0x5, 0x8f, 0x94, 0x94, 0x8c, 0x93, 0x1b, 0xa8,\n                                                              0xa1, 0x72, 0x7f, 0x70, 0x74, 0x7d, 0x6c, 0x6e,\n                                                              0x7a, 0x91, 0x96, 0x74, 0x1f, 0x75, 0x6a, 0x5,\n                                                              0x83, 0x9b, 0xa3, 0x7a, 0xbe, 0x1b, 0xc0, 0xe7,\n                                                              0x9e, 0xca, 0xc3, 0x58, 0xa0, 0x65, 0x80, 0x82,\n                                                              0x8a, 0x89, 0x84, 0x1f, 0xaa, 0xb9, 0x5, 0xf7,\n                                                              0x9, 0xdb, 0xd6, 0xd3, 0xbb, 0x1f, 0x6d, 0xa1,\n                                                              0x5, 0x2e, 0x43, 0x49, 0x72, 0x3d, 0x1b, 0x7d,\n                                                              0xfb, 0x16, 0x8b, 0xf7, 0x47, 0xf7, 0x45, 0xf3,\n                                                              0xf7, 0x97, 0xf7, 0x35, 0xe3, 0xc5, 0x4d, 0x2a,\n                                                              0x7f, 0x8a, 0x80, 0x89, 0x80, 0x81, 0x1d, 0x80,\n                                                              0x85, 0x7e, 0x74, 0x1b, 0x7e, 0x77, 0x93, 0x93,\n                                                              0x6f, 0x1f, 0x92, 0x73, 0x6c, 0x91, 0x63, 0x1b,\n                                                              0xfb, 0x87, 0xfb, 0x44, 0xfb, 0x74, 0xfb, 0x71,\n                                                              0xfb, 0x40, 0xf7, 0x15, 0x36, 0xf7, 0x11, 0x1f,\n                                                              0xe, 0x51, 0xa, 0x73, 0xa, 0xf8, 0x3c, 0xf9,\n                                                              0x67, 0x27, 0x1d, 0xfb, 0xd2, 0xfd, 0xc0, 0x15,\n                                                              0x37, 0x1d, 0x57, 0x7b, 0x94, 0x9b, 0x98, 0x93,\n                                                              0x9c, 0x90, 0x9f, 0x7e, 0xa, 0xf7, 0x1, 0xae,\n                                                              0x71, 0x4f, 0x7d, 0x8a, 0x7b, 0x88, 0x79, 0x4c,\n                                                              0xa, 0x5, 0x3a, 0x60, 0x7c, 0x72, 0xfb, 0x27,\n                                                              0x1b, 0x65, 0xa, 0x93, 0x73, 0x1d, 0x8b, 0x40,\n                                                              0x1d, 0x85, 0x96, 0x87, 0x43, 0xa, 0xe, 0x51,\n                                                              0xa, 0x73, 0xa, 0xf7, 0xcb, 0xf9, 0x67, 0x15,\n                                                              0xbc, 0x6, 0xf7, 0x2b, 0xe1, 0x5, 0xa2, 0x98,\n                                                              0x9c, 0x97, 0x25, 0x1d, 0xfc, 0x60, 0xfd, 0xea,\n                                                              0x15, 0x37, 0x1d, 0x55, 0x7d, 0x95, 0x9c, 0x98,\n                                                              0x93, 0x9b, 0x90, 0x9e, 0x7e, 0xa, 0xf7, 0x3,\n                                                              0xac, 0x70, 0x4d, 0x7e, 0x89, 0x7c, 0x89, 0x7a,\n                                                              0x4c, 0xa, 0x60, 0x3a, 0x7c, 0x71, 0xfb, 0x27,\n                                                              0x8c, 0x19, 0x65, 0xa, 0x95, 0x73, 0x1d, 0x89,\n                                                              0x31, 0x1d, 0xe, 0x51, 0xa, 0xf7, 0x78, 0x5a,\n                                                              0x1d, 0xfc, 0x32, 0xfe, 0x15, 0x15, 0x37, 0x1d,\n                                                              0x56, 0x7c, 0x95, 0x9c, 0x98, 0x91, 0x9b, 0x90,\n                                                              0x9e, 0x1f, 0xca, 0xf7, 0x7b, 0x5, 0xf7, 0x6,\n                                                              0xa9, 0x6e, 0x49, 0x7f, 0x89, 0x7e, 0x89, 0x7d,\n                                                              0x2a, 0xa, 0xe, 0x51, 0xa, 0xc5, 0xf7, 0x1b,\n                                                              0x1, 0xf7, 0x86, 0xf7, 0x1b, 0xd8, 0xf7, 0x1b,\n                                                              0x3, 0x70, 0x16, 0x37, 0x1d, 0x56, 0x7c, 0x95,\n                                                              0x9b, 0x98, 0x93, 0x9b, 0x90, 0x9f, 0x7e, 0xa,\n                                                              0xf7, 0x3, 0xac, 0x70, 0x4d, 0x7e, 0x89, 0x7c,\n                                                              0x89, 0x7a, 0x2a, 0xa, 0xf7, 0xa1, 0xf9, 0x8b,\n                                                              0x46, 0x1d, 0x68, 0xa, 0x73, 0xa, 0x6b, 0x16,\n                                                              0x75, 0x1d, 0x4a, 0x7f, 0x9a, 0xa1, 0x97, 0x91,\n                                                              0x98, 0x8e, 0x95, 0x41, 0xa, 0xc6, 0x9b, 0x7e,\n                                                              0x7a, 0x7f, 0x86, 0x7c, 0x47, 0x1d, 0xf7, 0xe5,\n                                                              0xf9, 0x44, 0x2a, 0x1d, 0x68, 0xa, 0x73, 0xa,\n                                                              0xf7, 0x54, 0xf9, 0x67, 0x7b, 0xa, 0xf7, 0x1a,\n                                                              0xdc, 0x5, 0xa1, 0x98, 0x9e, 0x9c, 0x25, 0x1d,\n                                                              0xfb, 0xda, 0xfd, 0xea, 0x8e, 0x1d, 0x4e, 0x7b,\n                                                              0x98, 0x9f, 0x98, 0x91, 0x9a, 0x8e, 0x96, 0x41,\n                                                              0xa, 0xc6, 0x9b, 0x7f, 0x79, 0x7f, 0x86, 0x7c,\n                                                              0x47, 0x1d, 0xe, 0x68, 0xa, 0xf7, 0x78, 0x77,\n                                                              0x1, 0xf7, 0xb, 0xf9, 0x67, 0x15, 0xc4, 0x6,\n                                                              0xf4, 0xea, 0xe3, 0x2c, 0x3b, 0x1d, 0xfb, 0xb1,\n                                                              0xfe, 0x15, 0x8e, 0x1d, 0x4e, 0x7b, 0x98, 0x9f,\n                                                              0x98, 0x91, 0x9a, 0x8e, 0x96, 0x46, 0xa, 0x68,\n                                                              0xa, 0xc6, 0xf7, 0x1a, 0x1, 0xf2, 0xf7, 0x1b,\n                                                              0x3, 0xf2, 0xf9, 0xb0, 0x15, 0x41, 0x1d, 0xf7,\n                                                              0x63, 0x16, 0x41, 0x1d, 0xfb, 0xea, 0xfd, 0xb0,\n                                                              0x8e, 0x1d, 0x4a, 0x7f, 0x9a, 0xa1, 0x97, 0x91,\n                                                              0x98, 0x8e, 0x95, 0x46, 0xa, 0xc7, 0x8b, 0xad,\n                                                              0xf7, 0xbb, 0xb7, 0xf7, 0x9d, 0xaa, 0x1, 0xf8,\n                                                              0xbd, 0xf7, 0x27, 0x3, 0xf7, 0x98, 0xf7, 0xdd,\n                                                              0x15, 0xf7, 0xe, 0x6, 0x97, 0xb7, 0x5, 0xfb,\n                                                              0xe, 0x6, 0xc8, 0xf7, 0x77, 0x80, 0x1d, 0xfb,\n                                                              0x1d, 0x5b, 0x25, 0x60, 0xfb, 0xd1, 0xfb, 0x97,\n                                                              0x61, 0x7d, 0x9a, 0xa3, 0x9a, 0x8f, 0x9c, 0x77,\n                                                              0xa, 0x91, 0xf7, 0x13, 0xf7, 0x6e, 0x5d, 0xa,\n                                                              0x7e, 0x82, 0x75, 0x5a, 0xfb, 0x4a, 0x1e, 0x25,\n                                                              0x6, 0x7f, 0x5f, 0x5, 0xf1, 0x6, 0x86, 0x78,\n                                                              0x80, 0x5c, 0x67, 0xfb, 0xf, 0x6f, 0x2d, 0x6d,\n                                                              0x85, 0x6a, 0x86, 0x8, 0xe, 0x8b, 0x1d, 0xd5,\n                                                              0x8c, 0x1d, 0x13, 0xb0, 0x70, 0x16, 0xf7, 0x64,\n                                                              0xae, 0x6, 0x52, 0x77, 0x9e, 0xaf, 0xa7, 0x92,\n                                                              0xac, 0x93, 0xa6, 0x1f, 0xee, 0xf7, 0xf8, 0x5,\n                                                              0x13, 0x70, 0x59, 0xa, 0xc2, 0xa0, 0x78, 0x6a,\n                                                              0x6f, 0x85, 0x68, 0x83, 0x6f, 0x64, 0x1d, 0xfb,\n                                                              0xc, 0xfc, 0x2f, 0x18, 0x13, 0xa8, 0x63, 0xfb,\n                                                              0x1f, 0x80, 0x93, 0x59, 0x7f, 0x8, 0xf7, 0xb1,\n                                                              0xf9, 0x59, 0x50, 0xa, 0xa8, 0xa2, 0x7f, 0x80,\n                                                              0xa2, 0x1f, 0x13, 0xb0, 0x80, 0xa1, 0xa2, 0x81,\n                                                              0xaa, 0x3d, 0x1d, 0x7c, 0x73, 0x96, 0x96, 0x70,\n                                                              0x1f, 0x95, 0x71, 0x6e, 0x95, 0x70, 0x54, 0x1d,\n                                                              0x33, 0x1d, 0xf8, 0x3d, 0xf8, 0x96, 0x2a, 0x1d,\n                                                              0x33, 0x1d, 0xf7, 0xef, 0xf8, 0x96, 0x26, 0xa,\n                                                              0x65, 0x1d, 0xf7, 0x6a, 0x25, 0xa, 0xf7, 0x87,\n                                                              0xf8, 0x96, 0x5b, 0xa, 0xec, 0xe3, 0x2a, 0x7e,\n                                                              0x1d, 0x65, 0x1d, 0xc7, 0x8c, 0x1d, 0x4d, 0xa,\n                                                              0x13, 0xdc, 0x3a, 0x1d, 0xf7, 0x80, 0xf8, 0xaa,\n                                                              0x50, 0xa, 0xa4, 0xa2, 0x7f, 0x80, 0xa4, 0x1f,\n                                                              0x13, 0xec, 0x80, 0xa3, 0xa4, 0x81, 0xa8, 0x3d,\n                                                              0x1d, 0x7c, 0x72, 0x96, 0x96, 0x70, 0x1f, 0x95,\n                                                              0x71, 0x6f, 0x95, 0x70, 0x54, 0x1d, 0x65, 0x1d,\n                                                              0xb8, 0xf7, 0x1a, 0x12, 0xa6, 0xf7, 0x24, 0xf7,\n                                                              0xc, 0xf7, 0x1a, 0xd8, 0xf7, 0x1a, 0x32, 0xf7,\n                                                              0x24, 0x13, 0xfa, 0x3a, 0x1d, 0xf7, 0x9c, 0xf8,\n                                                              0xdd, 0x2e, 0xa, 0x13, 0xfc, 0xf7, 0x67, 0x2d,\n                                                              0x1d, 0x2f, 0xb0, 0x76, 0xf8, 0x6e, 0x77, 0x1,\n                                                              0xbb, 0xc7, 0x15, 0xb7, 0x5f, 0xf7, 0x54, 0xf7,\n                                                              0x54, 0xf7, 0x53, 0xfb, 0x54, 0xba, 0xba, 0xfb,\n                                                              0x55, 0xf7, 0x52, 0xf7, 0x55, 0xf7, 0x56, 0x59,\n                                                              0xb6, 0xfb, 0x50, 0xfb, 0x52, 0xfb, 0x52, 0xf7,\n                                                              0x52, 0x5d, 0x5c, 0xf7, 0x51, 0xfb, 0x51, 0x5,\n                                                              0xe, 0xc7, 0x23, 0x76, 0xf6, 0xad, 0xf9, 0xf,\n                                                              0xad, 0xda, 0x77, 0x1, 0x4d, 0xa, 0x3, 0xf7,\n                                                              0x4a, 0xd8, 0x15, 0x83, 0x9f, 0x88, 0xa2, 0xa9,\n                                                              0x1a, 0xeb, 0xe4, 0xf8, 0x29, 0xf7, 0x49, 0xa8,\n                                                              0xa0, 0x83, 0x7e, 0x9a, 0x1e, 0xfb, 0xbe, 0xfc,\n                                                              0xe4, 0x15, 0xf7, 0xd9, 0xf8, 0xbf, 0x5, 0x96,\n                                                              0x74, 0x8e, 0x6f, 0x79, 0x1a, 0xfb, 0x2, 0x2e,\n                                                              0xfc, 0x22, 0xfb, 0x47, 0x72, 0x74, 0x91, 0x9b,\n                                                              0x78, 0x1e, 0xfb, 0x23, 0xfb, 0x37, 0x15, 0xbb,\n                                                              0x6, 0xd1, 0xf7, 0xc, 0x5, 0x83, 0xa3, 0xa6,\n                                                              0x86, 0xaa, 0x1b, 0xf7, 0x8d, 0xf7, 0x45, 0xf7,\n                                                              0xa0, 0xf7, 0x56, 0xf7, 0x2, 0x56, 0xce, 0x47,\n                                                              0xae, 0x1f, 0xca, 0xf7, 0x0, 0x5, 0x5a, 0x6,\n                                                              0x56, 0x2f, 0x5, 0x94, 0x70, 0x67, 0x8f, 0x70,\n                                                              0x1b, 0xfb, 0x6f, 0xfb, 0x57, 0xfb, 0x7d, 0xfb,\n                                                              0x89, 0x46, 0xaf, 0x36, 0xdc, 0x61, 0x1f, 0xe,\n                                                              0x72, 0xa, 0x73, 0xa, 0xb0, 0xf7, 0x1e, 0x3,\n                                                              0xed, 0xf9, 0xe, 0x29, 0x1d, 0xc3, 0x9e, 0x7a,\n                                                              0x68, 0x6e, 0x84, 0x68, 0x84, 0x70, 0x4a, 0x1d,\n                                                              0x2c, 0x6f, 0xb4, 0xc1, 0xb5, 0x9a, 0xbd, 0x98,\n                                                              0xba, 0x3e, 0x1d, 0xf7, 0xf6, 0xc1, 0x2a, 0x1d,\n                                                              0x72, 0xa, 0x73, 0xa, 0xce, 0xf7, 0x1e, 0x3,\n                                                              0xf8, 0x32, 0xf9, 0x67, 0x22, 0x1d, 0xfc, 0x4a,\n                                                              0xfb, 0x70, 0x29, 0x1d, 0xc3, 0x9e, 0x79, 0x68,\n                                                              0x6f, 0x84, 0x68, 0x84, 0x70, 0x4a, 0x1d, 0x2f,\n                                                              0x6c, 0xb1, 0xbf, 0xb6, 0x99, 0xbf, 0x99, 0xbc,\n                                                              0x3e, 0x1d, 0xe, 0x72, 0xa, 0xf7, 0x78, 0x77,\n                                                              0x1, 0xce, 0xf7, 0x1e, 0x3, 0xf7, 0xa2, 0xf9,\n                                                              0x67, 0x42, 0xa, 0xfb, 0xe0, 0xfb, 0x9b, 0x29,\n                                                              0x1d, 0xc0, 0xa1, 0x7b, 0x6b, 0x6e, 0x85, 0x66,\n                                                              0x83, 0x6e, 0x4a, 0x1d, 0x30, 0x6b, 0xb1, 0xbe,\n                                                              0xb6, 0x99, 0xc0, 0x99, 0xbc, 0x3e, 0x1d, 0xe,\n                                                              0x72, 0xa, 0xc6, 0xf7, 0x1a, 0x1, 0xf3, 0xf7,\n                                                              0x1e, 0xca, 0xf7, 0x1a, 0xba, 0xf7, 0x1a, 0x3,\n                                                              0xed, 0xf9, 0xe, 0x29, 0x1d, 0xc4, 0x9d, 0x78,\n                                                              0x67, 0x6f, 0x84, 0x6a, 0x84, 0x70, 0x4a, 0x1d,\n                                                              0x2d, 0x6e, 0xb3, 0xc1, 0xb5, 0x9a, 0xbe, 0x98,\n                                                              0xba, 0x3e, 0x1d, 0xf7, 0x63, 0xf7, 0x12, 0x2e,\n                                                              0xa, 0xf7, 0x69, 0x2d, 0x1d, 0x58, 0x58, 0xa,\n                                                              0x73, 0xa, 0xd4, 0x16, 0xf7, 0xd6, 0xae, 0x6,\n                                                              0x58, 0x70, 0x98, 0xab, 0x99, 0x8d, 0x9b, 0x92,\n                                                              0x9c, 0x1f, 0xbf, 0xf7, 0x49, 0x6a, 0xa, 0xc2,\n                                                              0xa6, 0x7e, 0x79, 0x81, 0x87, 0x7e, 0x80, 0x7c,\n                                                              0x1f, 0xfb, 0x2f, 0xfb, 0x69, 0x5, 0x4b, 0xf7,\n                                                              0x5c, 0x81, 0x82, 0xa7, 0x1a, 0xa2, 0x94, 0xb3,\n                                                              0xc5, 0x6a, 0x1d, 0x55, 0xfb, 0x4e, 0x79, 0x4b,\n                                                              0x6c, 0x74, 0x51, 0x86, 0x19, 0xf7, 0xb1, 0xf9,\n                                                              0x44, 0x26, 0xa, 0x58, 0x8b, 0xae, 0xf7, 0x27,\n                                                              0xab, 0xf7, 0xb4, 0xab, 0x6b, 0xf7, 0x3b, 0x12,\n                                                              0xf8, 0x3f, 0xf7, 0x26, 0x13, 0xe8, 0xf7, 0x79,\n                                                              0xf7, 0x6f, 0x6f, 0x1d, 0x33, 0x62, 0x40, 0x26,\n                                                              0x7a, 0x78, 0x8c, 0x8f, 0x77, 0x1f, 0xfb, 0x94,\n                                                              0xfb, 0x6f, 0x15, 0xf7, 0xba, 0xae, 0x6, 0x4c,\n                                                              0x7f, 0x9e, 0xa2, 0x94, 0x8d, 0x94, 0x8d, 0x93,\n                                                              0x1f, 0xa2, 0xdf, 0x5, 0x87, 0xb0, 0x9a, 0x8a,\n                                                              0xb4, 0x1b, 0xf7, 0x1a, 0xf7, 0x13, 0xce, 0xf7,\n                                                              0x14, 0xf7, 0x12, 0x20, 0xaa, 0x21, 0x1f, 0x5b,\n                                                              0x6, 0xa9, 0xe5, 0xa3, 0x8f, 0xb3, 0x91, 0x8,\n                                                              0x13, 0xd8, 0x8c, 0xae, 0x5, 0xfb, 0xba, 0x68,\n                                                              0x6, 0xbf, 0x9f, 0x7f, 0x77, 0x7c, 0x88, 0x78,\n                                                              0x85, 0x75, 0x1f, 0xfb, 0xf, 0xfc, 0x4b, 0x7a,\n                                                              0x4d, 0x74, 0x88, 0x63, 0x84, 0x19, 0xe, 0xfb,\n                                                              0x5c, 0xf7, 0x16, 0xca, 0xad, 0xf9, 0x1c, 0xa9,\n                                                              0x12, 0xf7, 0xcf, 0xf7, 0xc, 0x42, 0xf7, 0x3,\n                                                              0x13, 0xf0, 0xf7, 0x22, 0x9a, 0x15, 0x82, 0x98,\n                                                              0x96, 0x7e, 0xb6, 0x1b, 0xf7, 0xb, 0xf6, 0xf7,\n                                                              0x1a, 0xf7, 0x12, 0xe9, 0x4c, 0xb1, 0x3d, 0x98,\n                                                              0x1f, 0x8d, 0x7, 0x13, 0xe8, 0xca, 0xa2, 0xf7,\n                                                              0x8, 0xbf, 0xf7, 0x2, 0x1a, 0xd4, 0x4f, 0xba,\n                                                              0x36, 0xfb, 0x2e, 0x43, 0xfb, 0x33, 0xfb, 0x23,\n                                                              0x71, 0x1e, 0x49, 0xfb, 0xff, 0x6d, 0xfb, 0x1c,\n                                                              0x66, 0x5c, 0x8, 0x80, 0x82, 0x71, 0x7a, 0x7c,\n                                                              0x1b, 0x84, 0x87, 0x8f, 0x94, 0x96, 0x93, 0x8c,\n                                                              0x90, 0x95, 0x1f, 0x8d, 0x90, 0x8d, 0x91, 0x96,\n                                                              0x1a, 0xb0, 0x6b, 0x92, 0x7e, 0x55, 0x8b, 0x5c,\n                                                              0x83, 0x67, 0xaa, 0x64, 0xcc, 0xf7, 0xa, 0xcf,\n                                                              0xf7, 0xd, 0xf7, 0x49, 0xb4, 0x1e, 0xe6, 0xf8,\n                                                              0x2b, 0x5, 0xf7, 0x3, 0xa4, 0xa8, 0xc2, 0xb9,\n                                                              0x1b, 0xba, 0x8c, 0x47, 0x75, 0x4d, 0x79, 0x21,\n                                                              0x2b, 0x1f, 0x84, 0x6a, 0x5, 0x13, 0xf0, 0xb6,\n                                                              0x85, 0xaa, 0x5f, 0x3a, 0x1a, 0x5b, 0x6d, 0xfb,\n                                                              0x46, 0x3f, 0x7a, 0x78, 0x93, 0x9a, 0x80, 0x1e,\n                                                              0xe, 0x58, 0x1d, 0xb5, 0x85, 0x77, 0xf7, 0x99,\n                                                              0x34, 0xa, 0x6f, 0x81, 0x62, 0x62, 0x76, 0x1b,\n                                                              0x84, 0x86, 0x8f, 0x95, 0x44, 0xa, 0x5, 0xfb,\n                                                              0x1, 0x6, 0x78, 0x4d, 0x6f, 0xa, 0x13, 0xac,\n                                                              0x27, 0xa, 0x30, 0xa, 0xf7, 0x74, 0xf8, 0x25,\n                                                              0x2a, 0x1d, 0x5b, 0x1d, 0xf7, 0x93, 0x34, 0xa,\n                                                              0x6e, 0x80, 0x5f, 0x63, 0x77, 0x3f, 0x1d, 0x13,\n                                                              0xac, 0x30, 0xa, 0xf7, 0xd, 0xf8, 0x25, 0x26,\n                                                              0xa, 0x5b, 0x1d, 0xf7, 0x8c, 0x34, 0xa, 0x71,\n                                                              0xa, 0x8f, 0x95, 0x28, 0x1d, 0x13, 0xac, 0x30,\n                                                              0xa, 0xa1, 0xf8, 0x25, 0x42, 0xa, 0xe, 0x5b,\n                                                              0x1d, 0xe9, 0x8c, 0x1d, 0x76, 0xf7, 0xf, 0x13,\n                                                              0x6a, 0x28, 0xa, 0x13, 0x9a, 0x6e, 0x80, 0x5e,\n                                                              0x63, 0x78, 0x3f, 0x1d, 0x13, 0xa6, 0x30, 0xa,\n                                                              0xa9, 0xf8, 0x3a, 0x50, 0xa, 0xa5, 0xa2, 0x82,\n                                                              0x81, 0xa1, 0x1f, 0x13, 0xaa, 0x7f, 0xa6, 0xa6,\n                                                              0x7e, 0xa5, 0x3d, 0x1d, 0x7b, 0x71, 0x98, 0x96,\n                                                              0x6e, 0x1f, 0x95, 0x72, 0x70, 0x93, 0x72, 0x54,\n                                                              0x1d, 0x5b, 0x1d, 0xda, 0xf7, 0x1a, 0x74, 0xa,\n                                                              0xa6, 0x8e, 0xa, 0x13, 0x6f, 0x28, 0xa, 0x13,\n                                                              0x9f, 0x6e, 0x80, 0x5f, 0x63, 0x77, 0x3f, 0x1d,\n                                                              0x13, 0xaf, 0x30, 0xa, 0xa6, 0xf8, 0x6d, 0x2e,\n                                                              0xa, 0x3a, 0xa, 0x58, 0x1d, 0xb0, 0x66, 0xb5,\n                                                              0xc1, 0xbc, 0x5a, 0xf7, 0x39, 0xfb, 0x8, 0xf7,\n                                                              0x8, 0xfb, 0x8, 0xf7, 0x38, 0x5b, 0xbb, 0x74,\n                                                              0xa, 0xf7, 0x3, 0xf7, 0x37, 0xfb, 0x8, 0xf7,\n                                                              0x8, 0xfb, 0x8, 0xf7, 0x3a, 0x59, 0xbd, 0x13,\n                                                              0x64, 0xe4, 0x28, 0xa, 0x13, 0x99, 0x64, 0x71,\n                                                              0xa, 0x8f, 0x95, 0x28, 0x1d, 0x30, 0xa, 0xf7,\n                                                              0x3, 0xf8, 0x8f, 0x15, 0xc6, 0xba, 0xbb, 0xc6,\n                                                              0x1e, 0x13, 0xaa, 0xc8, 0xc6, 0xbb, 0x5b, 0x50,\n                                                              0x50, 0x5b, 0x5c, 0x50, 0x1f, 0x13, 0xa4, 0xe4,\n                                                              0x50, 0x5c, 0xba, 0xc6, 0x1f, 0x13, 0xaa, 0xd4,\n                                                              0xba, 0x8c, 0x15, 0x6b, 0xa5, 0x71, 0xab, 0xab,\n                                                              0xa5, 0xa5, 0xab, 0xab, 0x71, 0xa5, 0x6b, 0x6b,\n                                                              0x71, 0x71, 0x6b, 0x1e, 0xe, 0xc7, 0x7e, 0xca,\n                                                              0x4c, 0xd2, 0x5a, 0x76, 0xf7, 0xa, 0x77, 0xf7,\n                                                              0x14, 0x77, 0xf7, 0x75, 0xb3, 0x6d, 0xa9, 0x8e,\n                                                              0x77, 0x12, 0x86, 0xf7, 0x12, 0xf8, 0x62, 0xe5,\n                                                              0x13, 0x9c, 0xc0, 0xf7, 0xac, 0xf7, 0x8, 0x15,\n                                                              0x8d, 0x6, 0x5b, 0x94, 0x9a, 0x3a, 0xf7, 0x10,\n                                                              0x1b, 0xf7, 0x17, 0xc4, 0xf7, 0x19, 0x8d, 0x8c,\n                                                              0x1f, 0x6f, 0x9c, 0x5, 0x7a, 0x82, 0x60, 0x43,\n                                                              0x44, 0x1b, 0x51, 0x82, 0xc5, 0xa4, 0x9b, 0x8d,\n                                                              0x9c, 0x8e, 0x9a, 0x1f, 0xb2, 0x94, 0x5, 0xf7,\n                                                              0x35, 0xb0, 0xce, 0xd4, 0xd2, 0x1a, 0xc8, 0x60,\n                                                              0xa6, 0x53, 0x68, 0x63, 0x83, 0x56, 0x61, 0x1e,\n                                                              0x89, 0x8d, 0x9d, 0xc6, 0x5, 0x13, 0x39, 0xc0,\n                                                              0x28, 0x8e, 0x76, 0x4d, 0x5, 0x88, 0x6, 0xa5,\n                                                              0x82, 0x7f, 0xaf, 0x4d, 0x1b, 0xfb, 0x10, 0xfb,\n                                                              0x28, 0xfb, 0x5e, 0xfb, 0x21, 0x26, 0xc9, 0x6d,\n                                                              0xbe, 0xea, 0xbe, 0xdf, 0xb7, 0xa5, 0x1f, 0xfb,\n                                                              0x33, 0x8d, 0x15, 0x13, 0x5c, 0xc0, 0xe9, 0xe0,\n                                                              0xf7, 0x63, 0xd7, 0xb0, 0x99, 0x71, 0x66, 0x5a,\n                                                              0x49, 0xfb, 0x8d, 0x2b, 0x67, 0x7d, 0xa8, 0xaa,\n                                                              0x1e, 0xf7, 0xb8, 0xeb, 0x15, 0x90, 0x9c, 0x5,\n                                                              0x13, 0x9a, 0xc0, 0xc1, 0x9b, 0xb5, 0xf7, 0x24,\n                                                              0xd5, 0x1b, 0xac, 0x8b, 0x6f, 0x7d, 0xfb, 0xd,\n                                                              0xfb, 0x22, 0x57, 0x6f, 0x1f, 0xe, 0xfb, 0x6e,\n                                                              0xfb, 0x6e, 0xb4, 0xd8, 0xf7, 0x2b, 0xfb, 0x2,\n                                                              0x77, 0xe3, 0x76, 0xf7, 0xce, 0xf7, 0x34, 0x6a,\n                                                              0xac, 0x12, 0x73, 0xf7, 0x14, 0x13, 0xba, 0xf7,\n                                                              0x3, 0x7f, 0x15, 0x54, 0x3b, 0x98, 0x7f, 0x5,\n                                                              0x13, 0xca, 0x7d, 0xa, 0x74, 0x7c, 0x6c, 0x6e,\n                                                              0x79, 0x86, 0xa, 0xa1, 0x79, 0xbf, 0x1b, 0xc0,\n                                                              0xe7, 0x9e, 0xca, 0x1f, 0x13, 0xba, 0xc7, 0x49,\n                                                              0x9c, 0x73, 0x82, 0x83, 0x8a, 0x89, 0x82, 0x1e,\n                                                              0xae, 0xbf, 0xe0, 0x96, 0xcb, 0xcb, 0xb4, 0xc5,\n                                                              0x19, 0x6f, 0x9d, 0x5, 0x13, 0xc6, 0x51, 0x63,\n                                                              0x53, 0x6b, 0x5e, 0x1b, 0x6e, 0x5f, 0xaa, 0xdb,\n                                                              0xd2, 0xda, 0xf7, 0x58, 0xe2, 0x94, 0x99, 0x87,\n                                                              0x7e, 0x86, 0x88, 0x85, 0x87, 0x84, 0x1f, 0x85,\n                                                              0x81, 0x83, 0x7e, 0x7a, 0x1a, 0x13, 0xba, 0x84,\n                                                              0x1d, 0x60, 0xb7, 0x3c, 0xfb, 0x1e, 0xfb, 0x30,\n                                                              0xfb, 0x2e, 0xfb, 0x2d, 0x23, 0xd3, 0x4c, 0xca,\n                                                              0x1e, 0xe, 0x2f, 0xa, 0xf7, 0x2a, 0xf7, 0xc2,\n                                                              0x15, 0xb6, 0x6, 0xfb, 0x1, 0x5f, 0x1d, 0x2f,\n                                                              0xa, 0xbe, 0xf7, 0xc2, 0x15, 0xb8, 0x5a, 0xa,\n                                                              0x68, 0x1d, 0xf7, 0x78, 0x22, 0xa, 0x5b, 0xf7,\n                                                              0xc2, 0x15, 0xc0, 0x6, 0xf7, 0x17, 0xe8, 0xe4,\n                                                              0x2e, 0x5, 0xbd, 0x6, 0x35, 0x4e, 0xa, 0xe,\n                                                              0x68, 0x1d, 0xc7, 0xf7, 0x19, 0x12, 0x90, 0xf7,\n                                                              0x16, 0x69, 0xf7, 0x19, 0xd3, 0xe7, 0x2f, 0xf7,\n                                                              0x1d, 0x13, 0xf4, 0x20, 0xa, 0x13, 0xea, 0x5c,\n                                                              0xf8, 0xa, 0x15, 0x67, 0xa, 0xf7, 0x65, 0x16,\n                                                              0x67, 0xa, 0xe, 0x66, 0x1d, 0xf9, 0x56, 0x3c,\n                                                              0x1d, 0x74, 0xf8, 0x19, 0x7b, 0xa, 0xfb, 0x4,\n                                                              0x5f, 0x1d, 0x66, 0x1d, 0xf9, 0x56, 0x6c, 0x1d,\n                                                              0x52, 0x55, 0x8f, 0xa, 0x90, 0x94, 0x24, 0xa,\n                                                              0xfb, 0x12, 0xf8, 0x19, 0x26, 0xa, 0x66, 0x1d,\n                                                              0xf9, 0x4f, 0x6c, 0x1d, 0x54, 0x55, 0x73, 0x1b,\n                                                              0x84, 0x32, 0xa, 0xfb, 0x84, 0xf8, 0x19, 0x15,\n                                                              0xc4, 0x6, 0xf7, 0x16, 0xe8, 0xe4, 0x2e, 0x5,\n                                                              0xbe, 0x6, 0x34, 0x4e, 0xa, 0xe, 0x66, 0x1d,\n                                                              0xf8, 0xa6, 0xf7, 0x1a, 0x1, 0x9c, 0xf7, 0x1a,\n                                                              0xd6, 0xf7, 0x1a, 0x3, 0xf7, 0x6c, 0xf7, 0x21,\n                                                              0x15, 0x71, 0x88, 0x51, 0x56, 0x74, 0x1b, 0x85,\n                                                              0x88, 0x90, 0x94, 0x24, 0xa, 0xfb, 0x71, 0xf8,\n                                                              0x61, 0x2e, 0xa, 0xf7, 0x65, 0x2d, 0x1d, 0x7e,\n                                                              0xa8, 0xf8, 0x35, 0x6e, 0xa, 0xf7, 0x2e, 0x90,\n                                                              0xa, 0xf7, 0x6b, 0x7b, 0x1d, 0x7d, 0x59, 0x40,\n                                                              0x51, 0xfb, 0xaa, 0x2b, 0x57, 0x8b, 0xf7, 0xa,\n                                                              0x9f, 0x1e, 0xf7, 0x77, 0xf7, 0x9e, 0x15, 0xa9,\n                                                              0x7a, 0x6f, 0x97, 0x73, 0x1b, 0xfb, 0x28, 0xfb,\n                                                              0x15, 0xfb, 0x2e, 0xfb, 0x2e, 0x2b, 0xd9, 0x44,\n                                                              0xdd, 0xf7, 0x2f, 0xf7, 0x15, 0xf7, 0x45, 0xf7,\n                                                              0x6c, 0xe0, 0x66, 0xdd, 0x52, 0xc8, 0x1f, 0xf6,\n                                                              0xc3, 0x69, 0xab, 0x20, 0x52, 0x64, 0xab, 0x5d,\n                                                              0xa1, 0x5c, 0x91, 0x19, 0x5f, 0x70, 0xb1, 0x85,\n                                                              0xb5, 0x73, 0xaf, 0x68, 0x19, 0xfb, 0xe, 0x4b,\n                                                              0xac, 0x6c, 0xf7, 0xb, 0xc9, 0x5, 0xae, 0x5f,\n                                                              0xa6, 0x56, 0x56, 0x1a, 0xe, 0x21, 0x97, 0x76,\n                                                              0xa9, 0x76, 0xf8, 0x62, 0x77, 0xf7, 0x1e, 0xd6,\n                                                              0x12, 0x13, 0x70, 0x78, 0xa, 0x98, 0x97, 0x81,\n                                                              0x7f, 0x1f, 0x75, 0x33, 0xfb, 0x6f, 0x44, 0x1a,\n                                                              0x13, 0xb0, 0x76, 0x1d, 0x68, 0x80, 0x60, 0x63,\n                                                              0x77, 0x88, 0x1d, 0x91, 0x96, 0x1f, 0xa8, 0xe2,\n                                                              0xf7, 0x68, 0xcc, 0x4f, 0xa, 0x13, 0x70, 0x88,\n                                                              0xa, 0xf7, 0x2b, 0xf8, 0xad, 0x50, 0xa, 0xa9,\n                                                              0xa1, 0x81, 0x81, 0xa1, 0x1f, 0x7f, 0xa4, 0xa3,\n                                                              0x7f, 0xa7, 0x3d, 0x1d, 0x7c, 0x74, 0x95, 0x96,\n                                                              0x70, 0x1f, 0x95, 0x71, 0x6d, 0x96, 0x70, 0x54,\n                                                              0x1d, 0x7e, 0xa8, 0xf8, 0x33, 0xa8, 0xf7, 0x81,\n                                                              0x37, 0xa, 0xf7, 0xdd, 0xf8, 0xe, 0x2a, 0x1d,\n                                                              0x7e, 0xa8, 0xf8, 0x33, 0x6e, 0xa, 0xe3, 0x90,\n                                                              0xa, 0xf7, 0xab, 0x7b, 0x1d, 0x7f, 0x59, 0x40,\n                                                              0x51, 0xfb, 0xaa, 0x36, 0xa, 0xf7, 0x40, 0xf7,\n                                                              0x29, 0xf7, 0x1a, 0xfb, 0xb, 0x9d, 0x4b, 0x1d,\n                                                              0xf7, 0x76, 0xf8, 0xe, 0x26, 0xa, 0x8f, 0x1d,\n                                                              0xf7, 0x7a, 0x37, 0xa, 0xf7, 0x13, 0xf8, 0xe,\n                                                              0x42, 0xa, 0xe, 0x8f, 0x1d, 0xd7, 0x8c, 0x1d,\n                                                              0x4e, 0x1d, 0x13, 0xdc, 0x23, 0xa, 0xf7, 0x1b,\n                                                              0xf8, 0x23, 0x50, 0xa, 0xa9, 0xa0, 0x81, 0x80,\n                                                              0xa0, 0x1f, 0x13, 0xec, 0x80, 0xa2, 0xa2, 0x7f,\n                                                              0xac, 0x3d, 0x1d, 0x7c, 0x74, 0x95, 0x96, 0x71,\n                                                              0x1f, 0x95, 0x70, 0x6d, 0x96, 0x70, 0x54, 0x1d,\n                                                              0x8f, 0x1d, 0xc8, 0xf7, 0x1a, 0x12, 0x88, 0xf7,\n                                                              0xb, 0x93, 0xf7, 0x1a, 0xcb, 0xf7, 0xb, 0xfb,\n                                                              0x1, 0xf7, 0x1a, 0x13, 0xfc, 0x23, 0xa, 0xf7,\n                                                              0x13, 0xf8, 0x56, 0x2e, 0xa, 0x13, 0xfa, 0x3a,\n                                                              0xa, 0x2f, 0x6e, 0xef, 0x27, 0xf7, 0x28, 0xe7,\n                                                              0xe1, 0x36, 0xd0, 0xf5, 0xf7, 0x28, 0x27, 0xef,\n                                                              0x12, 0xf7, 0x67, 0xf7, 0x28, 0xfb, 0xc, 0xef,\n                                                              0x13, 0x5a, 0xac, 0xf7, 0x68, 0x15, 0xf8, 0x8c,\n                                                              0xd0, 0xfc, 0x8c, 0x6, 0x13, 0xa5, 0xf7, 0x62,\n                                                              0xfb, 0x98, 0x15, 0x66, 0xa, 0xf8, 0x64, 0x4,\n                                                              0x66, 0xa, 0xe, 0x29, 0x76, 0xf5, 0xa8, 0xcd,\n                                                              0x77, 0xf8, 0x8, 0xa8, 0xec, 0x5c, 0x1d, 0xe1,\n                                                              0x90, 0xa, 0xf7, 0xb0, 0xf7, 0x0, 0x98, 0x96,\n                                                              0x86, 0x81, 0x94, 0x1e, 0xfb, 0x51, 0xfb, 0xe5,\n                                                              0x6f, 0xa, 0x61, 0x40, 0x15, 0x43, 0xfb, 0x12,\n                                                              0x5, 0xb3, 0x6, 0xcb, 0xf7, 0x6, 0x5, 0x86,\n                                                              0x9b, 0x9d, 0x88, 0x9c, 0x1b, 0xf7, 0x34, 0xf7,\n                                                              0x10, 0xf7, 0x40, 0xf7, 0x29, 0xda, 0x62, 0xb2,\n                                                              0x62, 0x9d, 0x1f, 0xcc, 0xf7, 0x8, 0x5, 0x66,\n                                                              0x6, 0x50, 0x23, 0x5, 0x90, 0x79, 0x71, 0x8d,\n                                                              0x81, 0x1b, 0xfb, 0x32, 0xfb, 0xb, 0xfb, 0x41,\n                                                              0xfb, 0x2e, 0x4d, 0xab, 0x5f, 0xb8, 0x74, 0x1f,\n                                                              0xc1, 0xa6, 0x15, 0xf7, 0x55, 0xf7, 0xeb, 0x5,\n                                                              0x8c, 0x8a, 0x8b, 0x87, 0x88, 0x1a, 0x40, 0x51,\n                                                              0xfb, 0xaa, 0x2b, 0x77, 0x7f, 0x92, 0x96, 0x83,\n                                                              0x1e, 0xe, 0x64, 0xa, 0xf7, 0xa0, 0x77, 0x1,\n                                                              0x2c, 0x1d, 0x54, 0x4e, 0x8f, 0xa, 0x91, 0x97,\n                                                              0x31, 0xa, 0x79, 0x86, 0x97, 0x9a, 0x9e, 0x94,\n                                                              0xa4, 0x2d, 0xa, 0xcf, 0xf7, 0xfd, 0x2a, 0x1d,\n                                                              0x64, 0xa, 0xf7, 0xa0, 0x77, 0x1, 0x29, 0xa,\n                                                              0x96, 0x9b, 0x9e, 0x94, 0xa4, 0x2d, 0xa, 0x68,\n                                                              0xf7, 0xfd, 0x26, 0xa, 0x64, 0xa, 0xf7, 0x99,\n                                                              0x77, 0x1, 0x29, 0xa, 0x95, 0x9a, 0x9e, 0x94,\n                                                              0xa6, 0x2d, 0xa, 0xfb, 0x1a, 0xf7, 0xfd, 0x42,\n                                                              0xa, 0xe, 0x64, 0xa, 0xe7, 0xf7, 0x1a, 0x1,\n                                                              0xf7, 0x2c, 0x8e, 0xa, 0x3, 0x29, 0xa, 0x96,\n                                                              0x9a, 0x9e, 0x94, 0xa5, 0x2d, 0xa, 0xfb, 0x1a,\n                                                              0xf8, 0x45, 0x2e, 0xa, 0x3a, 0xa, 0x79, 0x1d,\n                                                              0xf7, 0x93, 0x77, 0x1, 0x35, 0x1d, 0x55, 0x4b,\n                                                              0x4a, 0x70, 0x7b, 0x7e, 0x93, 0x93, 0x7e, 0x1e,\n                                                              0x94, 0x7c, 0x7c, 0x95, 0x77, 0x38, 0x1d, 0x6f,\n                                                              0x96, 0x7e, 0x97, 0x82, 0x1e, 0x9a, 0x7f, 0x9c,\n                                                              0x85, 0x72, 0x7a, 0xa, 0x5b, 0xf8, 0x27, 0x26,\n                                                              0xa, 0x87, 0x1d, 0xf7, 0x81, 0x77, 0x59, 0x1d,\n                                                              0x74, 0x6b, 0x43, 0x44, 0xfb, 0x86, 0x4f, 0x1d,\n                                                              0x5a, 0x1f, 0x88, 0x8e, 0xea, 0xf7, 0xe8, 0x44,\n                                                              0x77, 0x1d, 0x1a, 0x7e, 0xfb, 0xe, 0xfc, 0x5e,\n                                                              0x4c, 0xfb, 0x88, 0x1e, 0x4d, 0x7b, 0x75, 0x87,\n                                                              0xa, 0x77, 0xa9, 0xab, 0xa1, 0x9e, 0xc7, 0x93,\n                                                              0xac, 0x1f, 0xe, 0xfb, 0x6e, 0xfb, 0x61, 0xf7,\n                                                              0x7, 0xf7, 0x65, 0x77, 0xf7, 0xff, 0x77, 0xda,\n                                                              0xf7, 0x1a, 0x12, 0xeb, 0x8e, 0xa, 0xfb, 0x2,\n                                                              0xcb, 0x13, 0xfa, 0x45, 0xa, 0x94, 0x94, 0x7d,\n                                                              0x1e, 0x94, 0x7d, 0x7e, 0x93, 0x78, 0x38, 0x1d,\n                                                              0x6c, 0x98, 0x7e, 0x98, 0x82, 0x1e, 0x99, 0x81,\n                                                              0x9a, 0x84, 0x74, 0x7a, 0xa, 0xfb, 0x27, 0xf8,\n                                                              0x6f, 0x2e, 0xa, 0x13, 0xfc, 0x3a, 0xa, 0x66,\n                                                              0x1d, 0xf8, 0x6b, 0x3c, 0x1d, 0xe, 0x53, 0x1d,\n                                                              0x56, 0x7d, 0x96, 0x9c, 0x94, 0x8e, 0x97, 0x8f,\n                                                              0x98, 0x1f, 0xbd, 0xf7, 0x4d, 0xf7, 0x28, 0xde,\n                                                              0xa0, 0xd1, 0xfb, 0x2a, 0x3a, 0xc7, 0xf7, 0x67,\n                                                              0x9c, 0xc7, 0xa7, 0x94, 0xc3, 0x8e, 0x82, 0xa,\n                                                              0xba, 0x84, 0xa3, 0x79, 0x74, 0x1a, 0x83, 0x8b,\n                                                              0x83, 0x89, 0x83, 0x1e, 0x3e, 0xfb, 0xa8, 0x27,\n                                                              0x56, 0x75, 0x45, 0xf3, 0xc3, 0x69, 0xfb, 0xe,\n                                                              0x7b, 0x52, 0x76, 0x8c, 0x60, 0x85, 0x19, 0xe,\n                                                              0x66, 0x1d, 0xf9, 0x58, 0x77, 0x1, 0xf7, 0x66,\n                                                              0xf7, 0x21, 0x15, 0x71, 0x88, 0x52, 0x56, 0x8f,\n                                                              0xa, 0x90, 0x94, 0x9f, 0x9b, 0xc5, 0x91, 0xa1,\n                                                              0x1f, 0xc4, 0xf7, 0x61, 0xe1, 0xba, 0x9e, 0xcf,\n                                                              0x35, 0x5c, 0xd0, 0xf7, 0x8e, 0x7f, 0xa, 0x8d,\n                                                              0xac, 0x8b, 0x6c, 0x1a, 0x76, 0x6f, 0x28, 0x71,\n                                                              0x2f, 0x1e, 0x3d, 0x60, 0x78, 0x45, 0xd8, 0xb6,\n                                                              0x5, 0x65, 0xfb, 0x1d, 0x6d, 0xfb, 0x1, 0x70,\n                                                              0x1a, 0x7d, 0x85, 0x56, 0xcf, 0xdb, 0xbd, 0xd0,\n                                                              0xce, 0xb7, 0x1e, 0xe, 0xf7, 0xae, 0x83, 0xab,\n                                                              0x73, 0xab, 0xf7, 0xc4, 0xad, 0xf7, 0x9f, 0xab,\n                                                              0x73, 0xab, 0x12, 0xa2, 0xf7, 0x21, 0x13, 0xb4,\n                                                              0xf8, 0xe1, 0xf7, 0xe4, 0x15, 0xde, 0x8a, 0xba,\n                                                              0x80, 0x48, 0x1a, 0x83, 0x88, 0x6b, 0x8a, 0x7d,\n                                                              0x1e, 0xa6, 0x86, 0xd3, 0xf7, 0xa4, 0x70, 0x8e,\n                                                              0x72, 0x54, 0x71, 0x5a, 0xfb, 0x1e, 0x8c, 0x19,\n                                                              0xc8, 0xf7, 0x70, 0x5, 0xac, 0x94, 0x8f, 0x99,\n                                                              0xb0, 0x1b, 0xf7, 0x44, 0x81, 0x30, 0x4d, 0x1f,\n                                                              0xa4, 0x85, 0xb9, 0xf7, 0x53, 0x5, 0xfb, 0xe3,\n                                                              0x6, 0x78, 0x6d, 0x8d, 0x8d, 0x71, 0x1f, 0x13,\n                                                              0xac, 0x8d, 0x70, 0x73, 0x8d, 0x82, 0x1b, 0xfb,\n                                                              0x24, 0xfb, 0xc9, 0xfb, 0x6, 0xfb, 0xe0, 0xfb,\n                                                              0xc, 0xeb, 0xfb, 0xb, 0xf7, 0x3c, 0x1f, 0xf7,\n                                                              0x35, 0x92, 0x5, 0x13, 0x74, 0xd5, 0x8c, 0x5,\n                                                              0xf7, 0xbc, 0x6, 0xc7, 0xf7, 0x56, 0x70, 0x90,\n                                                              0x5, 0x46, 0x67, 0x40, 0x29, 0xfb, 0x14, 0x1b,\n                                                              0x4c, 0x70, 0x8e, 0xa9, 0x92, 0x8c, 0x94, 0x8d,\n                                                              0x95, 0x1f, 0xfb, 0x19, 0xab, 0x15, 0x13, 0xac,\n                                                              0x4e, 0x7a, 0x73, 0x65, 0x4b, 0x1b, 0xfb, 0x4,\n                                                              0x80, 0xf2, 0xab, 0xf7, 0xe, 0xdf, 0xf7, 0xff,\n                                                              0xf7, 0x50, 0x8c, 0x1f, 0x9e, 0xc4, 0x8b, 0x4b,\n                                                              0x74, 0x81, 0x67, 0x89, 0x83, 0x1f, 0xe, 0xc7,\n                                                              0x7e, 0xa8, 0x6e, 0xca, 0xf8, 0x13, 0xa8, 0x12,\n                                                              0x91, 0xf7, 0x9, 0x13, 0x70, 0xf8, 0x39, 0xf7,\n                                                              0x6e, 0x15, 0xf7, 0x6a, 0xd2, 0xaf, 0x8b, 0xa3,\n                                                              0x1b, 0x9e, 0x9a, 0x7c, 0x70, 0x89, 0x8b, 0xfb,\n                                                              0x17, 0xfb, 0x39, 0x64, 0x1f, 0x20, 0xfb, 0x42,\n                                                              0x15, 0x5c, 0xb3, 0xb8, 0x81, 0xa7, 0x1b, 0xe6,\n                                                              0xc5, 0xbd, 0xe2, 0xb6, 0x1f, 0x6f, 0x9a, 0x5,\n                                                              0x58, 0x6a, 0x70, 0x65, 0x4f, 0x1b, 0x60, 0x75,\n                                                              0xb8, 0xbc, 0x98, 0x8e, 0x99, 0x90, 0x98, 0x1f,\n                                                              0xf1, 0xa2, 0xf7, 0x32, 0xb3, 0xf7, 0xd, 0x1a,\n                                                              0xd5, 0x50, 0x9f, 0x54, 0x49, 0x60, 0x69, 0x6f,\n                                                              0x68, 0x1e, 0xa4, 0x7a, 0x70, 0xb0, 0x42, 0x1b,\n                                                              0xfb, 0x49, 0xfb, 0x4, 0xfb, 0x5c, 0x22, 0xfb,\n                                                              0x39, 0xf7, 0x19, 0x86, 0xa5, 0xaf, 0xd0, 0x96,\n                                                              0xb9, 0xb7, 0x1f, 0xfb, 0x53, 0xc7, 0x15, 0xea,\n                                                              0xca, 0xf7, 0x1e, 0x8a, 0x87, 0x1e, 0xb9, 0x9f,\n                                                              0xa6, 0xc1, 0xbb, 0x1b, 0xc3, 0x8c, 0x56, 0x76,\n                                                              0x1f, 0x13, 0xb0, 0x56, 0x51, 0xfb, 0xb6, 0x28,\n                                                              0x5d, 0x80, 0xb1, 0xbd, 0x1e, 0xe, 0x21, 0x79,\n                                                              0xad, 0xf9, 0xe, 0xae, 0x87, 0x77, 0xf7, 0x80,\n                                                              0x85, 0x1d, 0x13, 0xdc, 0x8d, 0x79, 0x15, 0xa9,\n                                                              0x6, 0xa2, 0x95, 0x90, 0x97, 0xa4, 0x1b, 0x9c,\n                                                              0xa3, 0x7e, 0x81, 0xad, 0x1f, 0x84, 0xa1, 0xa6,\n                                                              0x86, 0xa9, 0x1b, 0xf7, 0x2f, 0xe2, 0xdb, 0xf7,\n                                                              0x18, 0xd9, 0x4d, 0xc8, 0x4d, 0xc2, 0x1f, 0x4e,\n                                                              0xc2, 0x4f, 0xbb, 0xbf, 0x1a, 0x96, 0x83, 0xeb,\n                                                              0xf1, 0xf7, 0x6, 0xa1, 0xfb, 0x2, 0x53, 0x91,\n                                                              0x1e, 0xa6, 0x87, 0x5, 0x13, 0xbc, 0xb3, 0xf7,\n                                                              0x5d, 0x5, 0x6d, 0x6, 0x71, 0x7f, 0x6f, 0x8b,\n                                                              0x87, 0x1b, 0x7b, 0x76, 0x93, 0x93, 0x73, 0x1f,\n                                                              0x13, 0xdc, 0x92, 0x75, 0x72, 0x92, 0x70, 0x1b,\n                                                              0xfb, 0x1a, 0x3a, 0x2b, 0x26, 0x3e, 0xc2, 0x57,\n                                                              0xc5, 0x5b, 0x1f, 0xcb, 0x56, 0xcf, 0x5b, 0x47,\n                                                              0x1a, 0x77, 0x82, 0x21, 0xfb, 0x4, 0x61, 0xfb,\n                                                              0x8, 0x9b, 0xf7, 0x40, 0x8a, 0x1e, 0x6e, 0x8d,\n                                                              0x5, 0xf7, 0x94, 0xf8, 0x99, 0x15, 0xdd, 0x6,\n                                                              0xf7, 0x2a, 0xf7, 0x42, 0x5, 0x53, 0x6, 0xfb,\n                                                              0xf, 0x78, 0x1d, 0xfb, 0xa5, 0x93, 0x76, 0xf8,\n                                                              0x4e, 0xac, 0x8a, 0x77, 0xf7, 0x8d, 0x77, 0x12,\n                                                              0xf7, 0x40, 0xf6, 0x13, 0xd8, 0x85, 0xa, 0x98,\n                                                              0x96, 0x85, 0x85, 0x9a, 0x1f, 0x87, 0x97, 0x99,\n                                                              0x87, 0x9e, 0x1b, 0xcb, 0xe9, 0xb0, 0xec, 0xba,\n                                                              0x6e, 0xb7, 0x6c, 0xb3, 0x1f, 0x66, 0xba, 0x63,\n                                                              0xb5, 0xad, 0x1a, 0x90, 0x85, 0xbc, 0xc0, 0xc6,\n                                                              0xa6, 0x46, 0x59, 0x93, 0x1e, 0xa6, 0x89, 0x5,\n                                                              0x13, 0xb8, 0x79, 0xa, 0x7a, 0x82, 0x90, 0x91,\n                                                              0x7f, 0x1f, 0x13, 0xd8, 0x90, 0x80, 0x7d, 0x91,\n                                                              0x73, 0x1b, 0x4a, 0x3e, 0x67, 0x32, 0x4e, 0xaa,\n                                                              0x65, 0xbc, 0x4c, 0x1f, 0xa4, 0x6b, 0x9f, 0x5e,\n                                                              0x69, 0x1a, 0x70, 0x7d, 0x77, 0x66, 0x82, 0x48,\n                                                              0x7c, 0xa, 0xf7, 0x6a, 0xf8, 0xa5, 0x60, 0x1d,\n                                                              0x58, 0x8b, 0xa4, 0xf8, 0xff, 0xa4, 0xc5, 0xf7,\n                                                              0x1b, 0x1, 0xf7, 0x74, 0xf7, 0x1b, 0xd8, 0xf7,\n                                                              0x1b, 0x3, 0xd4, 0x16, 0xf7, 0xd6, 0xa4, 0x6,\n                                                              0x64, 0x67, 0x95, 0xac, 0x93, 0x8d, 0x95, 0x8f,\n                                                              0x96, 0x1f, 0xbf, 0xf7, 0x67, 0xf7, 0x52, 0xf7,\n                                                              0x9f, 0x90, 0x1d, 0xb6, 0x93, 0x19, 0xa4, 0xfb,\n                                                              0x64, 0x72, 0x7, 0xbc, 0x89, 0x9f, 0x7c, 0x74,\n                                                              0x1a, 0x79, 0x80, 0x74, 0x7a, 0x72, 0x1e, 0xfb,\n                                                              0x15, 0xfb, 0x4e, 0x5, 0x4b, 0xf7, 0x5c, 0x7e,\n                                                              0x96, 0xa7, 0x1a, 0xa2, 0x97, 0xa9, 0xc5, 0x1e,\n                                                              0xa4, 0xfb, 0xaf, 0x72, 0x7, 0xbb, 0x84, 0x92,\n                                                              0x94, 0x9d, 0x54, 0xe3, 0xfb, 0xaa, 0x18, 0x4f,\n                                                              0xfb, 0x6c, 0x79, 0x4b, 0x72, 0x88, 0x51, 0x86,\n                                                              0x19, 0xf7, 0x2b, 0xf9, 0x95, 0x46, 0x1d, 0x58,\n                                                              0x58, 0xa, 0xf7, 0x78, 0x77, 0x3e, 0xa, 0xf7,\n                                                              0xd1, 0xf9, 0x40, 0x60, 0xa, 0xfb, 0xa5, 0x52,\n                                                              0x76, 0xf8, 0x43, 0xeb, 0xf7, 0x85, 0x77, 0x1,\n                                                              0x72, 0x75, 0x15, 0xa7, 0xb1, 0x92, 0x8a, 0x9a,\n                                                              0x1b, 0xa5, 0xa4, 0x78, 0x78, 0xa8, 0x1f, 0x75,\n                                                              0xac, 0xb2, 0x74, 0xbf, 0x76, 0xa, 0x7e, 0x8f,\n                                                              0x82, 0x8f, 0x85, 0x1f, 0x90, 0x83, 0x92, 0x86,\n                                                              0x83, 0x1a, 0x84, 0x83, 0x83, 0x7e, 0x71, 0x81,\n                                                              0xa2, 0xa8, 0x7c, 0x1e, 0x7a, 0xad, 0x73, 0xb5,\n                                                              0x4c, 0xa4, 0x80, 0xa, 0xfb, 0x2e, 0x70, 0x1d,\n                                                              0xfb, 0xf6, 0x5, 0xf7, 0x73, 0xf8, 0x99, 0x60,\n                                                              0xa, 0xfb, 0x30, 0xf7, 0x27, 0xf8, 0x29, 0xb7,\n                                                              0xf7, 0xb, 0xf7, 0x28, 0x6d, 0xa9, 0x12, 0xf8,\n                                                              0x3c, 0xf7, 0x5, 0x13, 0xd8, 0xd9, 0xf8, 0x20,\n                                                              0x15, 0xf4, 0x6, 0x3f, 0xfc, 0x22, 0x8f, 0x3d,\n                                                              0x55, 0x69, 0x8, 0x85, 0x82, 0x77, 0x85, 0x7c,\n                                                              0x1b, 0x81, 0x83, 0x8f, 0x94, 0x91, 0x94, 0x93,\n                                                              0x93, 0x96, 0x1f, 0x91, 0x93, 0x90, 0x95, 0x96,\n                                                              0x1a, 0x9c, 0x7e, 0xac, 0x64, 0x5c, 0x80, 0x62,\n                                                              0x7d, 0x48, 0xc0, 0x72, 0xc3, 0xf7, 0x7, 0xef,\n                                                              0xe5, 0xf7, 0xc8, 0xc1, 0x1e, 0xa6, 0xf7, 0x2e,\n                                                              0x5, 0xf7, 0x8, 0x6, 0x94, 0xb7, 0x5, 0xfb,\n                                                              0xa, 0x6, 0xf7, 0x1f, 0xa2, 0x9b, 0xed, 0xcc,\n                                                              0x1b, 0x97, 0x97, 0x86, 0x81, 0x86, 0x86, 0x86,\n                                                              0x85, 0x86, 0x1f, 0x83, 0x83, 0x81, 0x81, 0x77,\n                                                              0x1a, 0x13, 0xe8, 0x66, 0xaa, 0x7e, 0x9d, 0xcb,\n                                                              0x8b, 0xc0, 0x95, 0xba, 0x5c, 0xb1, 0x4f, 0xfb,\n                                                              0x41, 0x64, 0xfb, 0x54, 0x40, 0x72, 0x1e, 0x20,\n                                                              0x6, 0xe, 0x7f, 0x1d, 0xf7, 0x42, 0x77, 0x1,\n                                                              0xb3, 0xf8, 0x98, 0x5b, 0xa, 0xe6, 0xe3, 0x30,\n                                                              0x7e, 0x1d, 0x7f, 0x1d, 0xf7, 0x42, 0x77, 0x1,\n                                                              0xf7, 0x3b, 0xf8, 0x98, 0x60, 0x1d, 0xfb, 0xdd,\n                                                              0xf8, 0x98, 0xd3, 0x43, 0xf7, 0x36, 0x1, 0xd3,\n                                                              0xf9, 0x3a, 0x15, 0xb6, 0x6, 0x57, 0x90, 0xaa,\n                                                              0x65, 0xd3, 0x1b, 0xe5, 0x9e, 0xc3, 0xad, 0x9b,\n                                                              0x1f, 0xb2, 0x6, 0x85, 0x80, 0xfb, 0x30, 0xfb,\n                                                              0x37, 0xfb, 0x1f, 0x89, 0xf7, 0xa, 0xb7, 0x1e,\n                                                              0xe, 0xfb, 0xdd, 0xf8, 0xa1, 0xf7, 0x16, 0x1,\n                                                              0xf7, 0x57, 0xf7, 0x16, 0x3, 0xf7, 0x37, 0xf8,\n                                                              0xe2, 0x15, 0x4b, 0xa, 0xe, 0xfb, 0xdd, 0xf8,\n                                                              0x9d, 0xbc, 0xf7, 0xb, 0xbb, 0x1, 0xf7, 0x6,\n                                                              0xbb, 0xf7, 0x15, 0xbc, 0x3, 0xf7, 0x13, 0xf9,\n                                                              0x3, 0x15, 0x4f, 0xbb, 0x5c, 0xc6, 0xc5, 0xbb,\n                                                              0xbb, 0xc6, 0xc5, 0x5b, 0xbb, 0x51, 0x50, 0x5b,\n                                                              0x5c, 0x5e, 0xa, 0xe, 0xfb, 0xdd, 0xfb, 0x41,\n                                                              0xd0, 0xf7, 0x28, 0x77, 0x1, 0x63, 0xdf, 0x3,\n                                                              0xa7, 0xb7, 0x15, 0x63, 0x5f, 0x6f, 0x5e, 0x5e,\n                                                              0x1a, 0x46, 0xd2, 0x7d, 0xb3, 0xad, 0xc9, 0xa6,\n                                                              0xbb, 0xa1, 0x1e, 0x71, 0x99, 0x5, 0x81, 0x79,\n                                                              0x7e, 0x81, 0x74, 0x1b, 0x63, 0x72, 0x9d, 0xba,\n                                                              0xa4, 0x98, 0xb2, 0x8f, 0x9e, 0x1f, 0xe, 0xfb,\n                                                              0xdd, 0xf8, 0xb2, 0xf6, 0x30, 0x76, 0xa6, 0x76,\n                                                              0xb0, 0xd6, 0x41, 0xcf, 0x12, 0x13, 0x30, 0x87,\n                                                              0xf8, 0xb3, 0x15, 0xaf, 0x6, 0x13, 0x48, 0x9c,\n                                                              0x92, 0x93, 0xa0, 0xa9, 0x1b, 0xa5, 0xa1, 0x82,\n                                                              0x81, 0x9f, 0x1f, 0x13, 0x80, 0x81, 0xa0, 0xa0,\n                                                              0x81, 0xa5, 0x1b, 0xd9, 0x9f, 0xd6, 0xab, 0x93,\n                                                              0x1f, 0x66, 0x6, 0x7a, 0x83, 0x82, 0x76, 0x6c,\n                                                              0x1b, 0x7e, 0x74, 0x95, 0x95, 0x72, 0x1f, 0x94,\n                                                              0x74, 0x72, 0x94, 0x73, 0x1b, 0x13, 0x30, 0x33,\n                                                              0x7a, 0x23, 0x89, 0x1f, 0xe, 0xfb, 0xdd, 0xf8,\n                                                              0x98, 0xf7, 0x49, 0x1, 0xd0, 0xf8, 0x98, 0x15,\n                                                              0xbb, 0x6, 0xf7, 0x2d, 0x21, 0x1d, 0xd0, 0xfb,\n                                                              0x17, 0x15, 0xba, 0x5a, 0xa, 0xf7, 0x46, 0xc7,\n                                                              0x4f, 0xe6, 0x1, 0x80, 0xf7, 0x46, 0x15, 0xf8,\n                                                              0x55, 0xc7, 0xfc, 0x55, 0x6, 0xe, 0xf7, 0xe6,\n                                                              0xf7, 0x46, 0xc8, 0x4e, 0xe6, 0x1, 0xf7, 0x46,\n                                                              0x4, 0xfa, 0x53, 0xc8, 0xfe, 0x53, 0x6, 0xe,\n                                                              0xfb, 0xdd, 0x69, 0x1d, 0xf7, 0x14, 0xe1, 0x35,\n                                                              0xf7, 0x30, 0x13, 0xe0, 0xf7, 0xe0, 0xf9, 0x29,\n                                                              0x15, 0x5c, 0xa, 0xc6, 0x7b, 0xa6, 0x1e, 0x13,\n                                                              0xd0, 0xb4, 0xa8, 0xab, 0xb5, 0xa9, 0x7c, 0x9a,\n                                                              0x7a, 0x97, 0x1f, 0x13, 0xe0, 0x79, 0x98, 0x77,\n                                                              0x94, 0xa1, 0x7a, 0x1d, 0xe, 0xfb, 0xdd, 0x69,\n                                                              0x1d, 0xf7, 0x26, 0x6d, 0x1d, 0x13, 0xd0, 0xf7,\n                                                              0x3, 0xf8, 0x5, 0x15, 0x49, 0xa, 0x13, 0xe0,\n                                                              0x62, 0x6e, 0x6b, 0x61, 0x6b, 0x9c, 0x7d, 0x9c,\n                                                              0x7f, 0x1f, 0x13, 0xd0, 0x9d, 0x7f, 0x9d, 0x81,\n                                                              0x89, 0xa, 0xe, 0xfb, 0xdd, 0xfb, 0x35, 0x62,\n                                                              0xa, 0xb6, 0x6d, 0x1d, 0x13, 0xd0, 0x86, 0xfb,\n                                                              0x32, 0x15, 0x98, 0x73, 0x5, 0x49, 0xa, 0x13,\n                                                              0xe0, 0x62, 0x6e, 0x6b, 0x61, 0x6f, 0x98, 0x7c,\n                                                              0x9a, 0x80, 0x1f, 0x13, 0xd0, 0x9e, 0x7c, 0xa2,\n                                                              0x83, 0x73, 0x54, 0xa, 0xe, 0x69, 0x1d, 0xc0,\n                                                              0xe1, 0x35, 0xf7, 0x30, 0xef, 0xe1, 0x35, 0xf7,\n                                                              0x30, 0x13, 0xd8, 0xf7, 0x95, 0xf9, 0x29, 0x15,\n                                                              0x63, 0xa, 0xab, 0x79, 0x9a, 0x7a, 0x97, 0x1e,\n                                                              0x13, 0xe4, 0x79, 0x97, 0x7a, 0x94, 0xa0, 0x7a,\n                                                              0x1d, 0xf7, 0x94, 0x16, 0x63, 0xa, 0xa8, 0x7c,\n                                                              0x9a, 0x7b, 0x97, 0x1e, 0x13, 0xe8, 0x78, 0x99,\n                                                              0x77, 0x93, 0xa2, 0x7a, 0x1d, 0xe, 0x69, 0x1d,\n                                                              0xf0, 0x6d, 0x1d, 0xef, 0x6d, 0x1d, 0x13, 0xe4,\n                                                              0xf7, 0xd6, 0xf8, 0x5, 0x15, 0x40, 0xa, 0x6d,\n                                                              0x61, 0x6c, 0x9c, 0x7b, 0x9c, 0x7f, 0x1f, 0x13,\n                                                              0xd4, 0x9d, 0x7e, 0x9d, 0x81, 0x89, 0xa, 0xfb,\n                                                              0x87, 0x73, 0x15, 0x40, 0xa, 0x6d, 0x61, 0x6d,\n                                                              0x9a, 0x7c, 0x9b, 0x7f, 0x1f, 0x13, 0xd8, 0x9e,\n                                                              0x7d, 0x9f, 0x81, 0x75, 0x54, 0xa, 0xe, 0xfb,\n                                                              0x35, 0x62, 0xa, 0x82, 0x6d, 0x1d, 0xef, 0x6d,\n                                                              0x1d, 0x13, 0xe4, 0xf7, 0x5b, 0xfb, 0x32, 0x15,\n                                                              0x98, 0x73, 0x5, 0x40, 0xa, 0x6c, 0x61, 0x6a,\n                                                              0x9d, 0x7c, 0x9d, 0x7f, 0x1f, 0x13, 0xd4, 0x9c,\n                                                              0x7f, 0x9c, 0x82, 0x89, 0xa, 0xfb, 0x94, 0x16,\n                                                              0x98, 0x73, 0x5, 0x40, 0xa, 0x6c, 0x61, 0x6c,\n                                                              0x9b, 0x7c, 0x9c, 0x7f, 0x1f, 0x13, 0xd8, 0x9d,\n                                                              0x7e, 0x9e, 0x82, 0x75, 0x54, 0xa, 0xe, 0xfb,\n                                                              0x10, 0x76, 0xf8, 0xb7, 0xf3, 0x4c, 0xa3, 0xf7,\n                                                              0x6e, 0x77, 0x12, 0x13, 0xb0, 0xf7, 0x30, 0xfb,\n                                                              0x25, 0x15, 0xa2, 0x6, 0xb1, 0xf7, 0x1e, 0xb0,\n                                                              0xf7, 0x4d, 0xd0, 0xe6, 0x8, 0x81, 0x99, 0x7b,\n                                                              0xce, 0xbe, 0x1a, 0x9b, 0x8d, 0x9a, 0x8f, 0x96,\n                                                              0x1e, 0xa9, 0x8d, 0xa1, 0x84, 0x9d, 0x82, 0x8,\n                                                              0x13, 0xd0, 0x7f, 0xa2, 0x9d, 0x7c, 0xa2, 0x1b,\n                                                              0x95, 0xba, 0x90, 0xba, 0x90, 0x8b, 0xba, 0x54,\n                                                              0x73, 0x7a, 0x7e, 0x80, 0x73, 0x1f, 0x13, 0xb0,\n                                                              0x83, 0x7a, 0x77, 0x84, 0x6e, 0x1b, 0x8f, 0x9d,\n                                                              0x91, 0xac, 0x9e, 0xa2, 0x8, 0xa6, 0xad, 0x9f,\n                                                              0xa5, 0xa9, 0x1a, 0x9d, 0x80, 0xaf, 0x5d, 0x69,\n                                                              0x76, 0x73, 0x68, 0x6c, 0x96, 0x6f, 0x91, 0x71,\n                                                              0x1e, 0x90, 0x72, 0x8a, 0x73, 0x80, 0x72, 0x6a,\n                                                              0x8a, 0x75, 0x94, 0x78, 0x94, 0x8, 0x13, 0xd0,\n                                                              0x96, 0x76, 0x79, 0x96, 0x70, 0x1b, 0x81, 0x62,\n                                                              0x89, 0x57, 0x72, 0x9e, 0x74, 0xaa, 0xab, 0x9c,\n                                                              0x97, 0x96, 0x9f, 0x1f, 0x13, 0xb0, 0x9c, 0x94,\n                                                              0x9f, 0x93, 0xaa, 0x8a, 0x88, 0x67, 0x6c, 0x38,\n                                                              0x56, 0x5f, 0x95, 0xfb, 0xa, 0x18, 0xe, 0xfb,\n                                                              0x57, 0x76, 0xf7, 0x57, 0xf4, 0xf7, 0xb9, 0xf4,\n                                                              0xf7, 0x57, 0x77, 0x1, 0xd9, 0xf7, 0x12, 0xaf,\n                                                              0x9f, 0xaf, 0xf7, 0x12, 0x14, 0xe, 0xf7, 0x4a,\n                                                              0xa1, 0x15, 0x73, 0x40, 0x3b, 0x59, 0x51, 0x1a,\n                                                              0x6c, 0xa1, 0x73, 0xaa, 0xb9, 0xa6, 0xb8, 0xb5,\n                                                              0x1e, 0xad, 0x80, 0xac, 0xad, 0x1a, 0x9c, 0x8f,\n                                                              0x9c, 0x8e, 0x9b, 0x1e, 0x8a, 0xc1, 0xb8, 0x61,\n                                                              0xc0, 0x1b, 0xa9, 0xa1, 0xa2, 0xa8, 0xaa, 0x71,\n                                                              0xa1, 0x6e, 0x1f, 0x8c, 0x6c, 0x50, 0x5e, 0x58,\n                                                              0x1b, 0x9c, 0xbe, 0xab, 0xa3, 0xbb, 0xa0, 0x8,\n                                                              0x70, 0x9e, 0x79, 0xa1, 0xae, 0x1a, 0xc2, 0xb7,\n                                                              0xa7, 0xb6, 0x9e, 0x1e, 0x74, 0xa0, 0x7b, 0x9c,\n                                                              0xad, 0x1a, 0x97, 0x8d, 0x96, 0x8e, 0x97, 0x1e,\n                                                              0xb4, 0xcd, 0x58, 0x92, 0xad, 0x1f, 0xac, 0xa0,\n                                                              0x9e, 0xad, 0xac, 0x70, 0x9e, 0x6b, 0x5d, 0x67,\n                                                              0x5f, 0x8c, 0x5a, 0x1f, 0xa3, 0xd6, 0xdb, 0xbd,\n                                                              0xc5, 0x1a, 0xaa, 0x75, 0xa3, 0x6c, 0x5d, 0x70,\n                                                              0x5e, 0x61, 0x1e, 0x69, 0x96, 0x6a, 0x69, 0x1a,\n                                                              0x7a, 0x87, 0x7a, 0x88, 0x7b, 0x1e, 0x8c, 0x55,\n                                                              0x5e, 0xb5, 0x56, 0x1b, 0x6d, 0x75, 0x74, 0x6e,\n                                                              0x6c, 0xa5, 0x75, 0xa8, 0x1f, 0x8a, 0xaa, 0xc6,\n                                                              0xb8, 0xbe, 0x1b, 0x7a, 0x58, 0x6b, 0x73, 0x5b,\n                                                              0x76, 0x8, 0xa6, 0x78, 0x9d, 0x75, 0x68, 0x1a,\n                                                              0x54, 0x5f, 0x6f, 0x60, 0x78, 0x1e, 0xa2, 0x76,\n                                                              0x9b, 0x7a, 0x69, 0x1a, 0x7f, 0x89, 0x80, 0x88,\n                                                              0x7f, 0x1e, 0x62, 0x49, 0xbe, 0x84, 0x69, 0x1f,\n                                                              0x6a, 0x76, 0x78, 0x69, 0x6a, 0xa6, 0x78, 0xab,\n                                                              0xb9, 0xaf, 0xb7, 0x8a, 0xbc, 0x1f, 0xe, 0xfb,\n                                                              0xcc, 0xf7, 0x58, 0x76, 0xf7, 0xc4, 0x77, 0xcd,\n                                                              0x77, 0x1, 0xac, 0xf7, 0xe6, 0x15, 0x3c, 0xcb,\n                                                              0x4c, 0xd9, 0xd9, 0xca, 0xc9, 0xd9, 0xd9, 0x4a,\n                                                              0xcc, 0x3d, 0x3c, 0x4e, 0x4c, 0x3d, 0x1e, 0xe,\n                                                              0xf7, 0xe6, 0x7e, 0xf7, 0x28, 0x1, 0xb3, 0xf7,\n                                                              0x2a, 0xf7, 0x49, 0xf7, 0x2a, 0xf7, 0x49, 0xf7,\n                                                              0x2a, 0x14, 0x70, 0xb3, 0xc8, 0x15, 0x62, 0xab,\n                                                              0x7d, 0x1d, 0x6a, 0x69, 0x63, 0x1e, 0xf7, 0xdf,\n                                                              0x16, 0x62, 0xab, 0x7d, 0x1d, 0x6a, 0x69, 0x63,\n                                                              0x1e, 0xf7, 0xdf, 0x16, 0x62, 0xa9, 0x6a, 0xb7,\n                                                              0xb4, 0xae, 0xab, 0xb5, 0xb4, 0x68, 0x53, 0xa,\n                                                              0xf7, 0xe6, 0x7d, 0xa5, 0x85, 0x76, 0xf7, 0xe1,\n                                                              0xa5, 0xf7, 0xc6, 0xa5, 0x8c, 0x77, 0x12, 0x13,\n                                                              0xb0, 0xf7, 0xe6, 0xf7, 0x8, 0x2b, 0x1d, 0xf7,\n                                                              0x74, 0x33, 0x2b, 0x1d, 0xfd, 0x69, 0xf7, 0x88,\n                                                              0x2b, 0x1d, 0x13, 0x68, 0xfb, 0x30, 0xfc, 0xbb,\n                                                              0x15, 0xc7, 0x6, 0xf8, 0xe9, 0xf9, 0x48, 0x5,\n                                                              0x4f, 0x6, 0xe, 0xfb, 0xdd, 0x72, 0x1d, 0xab,\n                                                              0xf7, 0x6d, 0x71, 0x1d, 0x80, 0x95, 0x96, 0x8a,\n                                                              0x1d, 0x42, 0x8d, 0xa, 0xe2, 0x5f, 0xa, 0xe,\n                                                              0xfb, 0xdd, 0x72, 0x1d, 0xf7, 0x30, 0x49, 0x1d,\n                                                              0x96, 0x82, 0x7f, 0x93, 0x83, 0x1b, 0x86, 0x87,\n                                                              0x87, 0x7f, 0x1f, 0xe, 0xfc, 0x83, 0x92, 0x76,\n                                                              0xf9, 0x4d, 0x77, 0x1, 0xfb, 0x1, 0x7d, 0x15,\n                                                              0xf8, 0x45, 0xf9, 0x4b, 0x5, 0x8d, 0x4f, 0x7,\n                                                              0xfc, 0x45, 0xfd, 0x4d, 0x5, 0xe, 0x90, 0x8b,\n                                                              0xba, 0xf7, 0x60, 0xb4, 0xef, 0xb4, 0xf7, 0x69,\n                                                              0xb0, 0x1, 0xf7, 0x4, 0xf7, 0x26, 0xf7, 0xa7,\n                                                              0xae, 0x3, 0xb3, 0xf7, 0x8f, 0x15, 0xfb, 0x41,\n                                                              0xf7, 0x1a, 0x3d, 0xf7, 0x4, 0xf7, 0xb, 0xf7,\n                                                              0x16, 0xbb, 0xde, 0xc5, 0x1e, 0x6d, 0xa1, 0x5,\n                                                              0x53, 0x63, 0xfb, 0x2, 0x59, 0x57, 0x1b, 0xfb,\n                                                              0xe, 0x55, 0xc3, 0xf7, 0x28, 0x8c, 0x1f, 0xf7,\n                                                              0xbd, 0x6, 0x97, 0xb4, 0x5, 0xfb, 0xc5, 0x6,\n                                                              0xa5, 0x96, 0xb9, 0x94, 0xa7, 0x1e, 0xf7, 0xc1,\n                                                              0x6, 0x99, 0xb4, 0x5, 0xfb, 0xc2, 0x6, 0xd5,\n                                                              0x97, 0xe3, 0xf7, 0x1f, 0xf1, 0x1b, 0xf7, 0x6,\n                                                              0x91, 0x51, 0x2e, 0x1f, 0xae, 0xf7, 0x22, 0x6,\n                                                              0x9e, 0x63, 0x79, 0xa6, 0x2c, 0x1b, 0x52, 0xfb,\n                                                              0x77, 0x55, 0xfb, 0x58, 0x49, 0x1f, 0xfb, 0x17,\n                                                              0x6, 0x7e, 0x62, 0x5, 0xf7, 0x14, 0x6, 0x83,\n                                                              0x6e, 0x83, 0x61, 0x89, 0x6e, 0x8, 0x2a, 0x6,\n                                                              0x7e, 0x62, 0x5, 0xe, 0xf7, 0xe6, 0xf7, 0x9d,\n                                                              0xa0, 0x89, 0x76, 0xf8, 0x14, 0xa1, 0x12, 0xf7,\n                                                              0x3c, 0xd9, 0xf7, 0x8d, 0xa6, 0xf7, 0xcc, 0xd9,\n                                                              0x13, 0xbc, 0xf7, 0xa, 0xf7, 0x9d, 0x15, 0xf7,\n                                                              0x46, 0xa0, 0x6, 0x58, 0x90, 0x8c, 0x8c, 0xb9,\n                                                              0x1a, 0xf7, 0xc9, 0xbc, 0x7, 0xb3, 0x9d, 0x6d,\n                                                              0x67, 0x93, 0x1f, 0xa0, 0xe3, 0xfb, 0xf2, 0x33,\n                                                              0xa0, 0x6, 0xaf, 0x93, 0x9d, 0xa9, 0xb3, 0x1b,\n                                                              0xbc, 0xfb, 0xc9, 0x6, 0x5d, 0x8c, 0x8a, 0x58,\n                                                              0x86, 0x1e, 0xf7, 0xd9, 0x76, 0x15, 0xf7, 0x17,\n                                                              0xa0, 0x6, 0x5e, 0x8f, 0x84, 0x8c, 0xba, 0x1a,\n                                                              0xf7, 0x77, 0x8d, 0x7, 0x13, 0x7c, 0xf7, 0x26,\n                                                              0xfb, 0xc2, 0x5, 0x96, 0x6, 0xf7, 0x2b, 0xf7,\n                                                              0xc4, 0x5, 0x8d, 0xfb, 0x79, 0x6, 0x13, 0xbc,\n                                                              0x5d, 0x8d, 0x8a, 0x57, 0x86, 0x1e, 0x76, 0xf7,\n                                                              0x46, 0xa0, 0x7, 0x58, 0x90, 0x8c, 0x8c, 0xb9,\n                                                              0x1a, 0xf7, 0x95, 0x7, 0xad, 0x96, 0x9f, 0xb8,\n                                                              0x1e, 0x9f, 0xfb, 0x1, 0x7, 0xfb, 0x31, 0xfb,\n                                                              0xc2, 0xfb, 0x2a, 0xf7, 0xc2, 0x5, 0xfb, 0x13,\n                                                              0x77, 0x6, 0xa8, 0xa7, 0x76, 0x6c, 0x98, 0x1f,\n                                                              0xfb, 0x97, 0x7, 0x5c, 0x84, 0x8a, 0x5e, 0x87,\n                                                              0x1e, 0xe, 0x53, 0xf7, 0x65, 0xc9, 0x4d, 0xe3,\n                                                              0x1, 0xbe, 0xf7, 0x65, 0x15, 0xf8, 0x8c, 0xc9,\n                                                              0xfc, 0x8c, 0x6, 0xe, 0x21, 0xfb, 0x61, 0xad,\n                                                              0xf7, 0x4b, 0x76, 0xf8, 0x34, 0xb5, 0xf1, 0xf7,\n                                                              0x2c, 0x6d, 0xa9, 0x12, 0x13, 0xe8, 0x9c, 0xf8,\n                                                              0x2b, 0x15, 0xd6, 0x6, 0x2f, 0xfc, 0x2f, 0x5,\n                                                              0xfb, 0x19, 0x6d, 0x7e, 0x69, 0x5d, 0x1b, 0x79,\n                                                              0x8b, 0x91, 0x8e, 0x93, 0x92, 0x8e, 0x90, 0x92,\n                                                              0x1f, 0x8f, 0x90, 0x8e, 0x91, 0x96, 0x1a, 0xa9,\n                                                              0x73, 0x9e, 0x6e, 0x80, 0x67, 0x84, 0x59, 0x60,\n                                                              0xb6, 0x6b, 0xc2, 0xed, 0xdf, 0xf7, 0x13, 0xd5,\n                                                              0x9c, 0x1e, 0xf1, 0xf8, 0x2f, 0x5, 0xf7, 0x2a,\n                                                              0x6, 0x46, 0xfb, 0xa1, 0x5, 0x85, 0x74, 0x86,\n                                                              0x6f, 0x71, 0x1a, 0x65, 0x9b, 0x6b, 0xbc, 0xcc,\n                                                              0xb5, 0xb3, 0xeb, 0xc8, 0x1e, 0x75, 0x98, 0x5,\n                                                              0x7f, 0x83, 0x5f, 0x48, 0x74, 0x1b, 0x80, 0x87,\n                                                              0x94, 0x99, 0xa8, 0x9b, 0xbc, 0x8e, 0x99, 0x1f,\n                                                              0xd4, 0xf7, 0xaf, 0x5, 0x8a, 0x76, 0xfb, 0x1,\n                                                              0x82, 0x72, 0x1b, 0xfb, 0xa, 0x6, 0xf7, 0x23,\n                                                              0xb1, 0xaa, 0xdc, 0xee, 0x1b, 0xa4, 0x8b, 0x7f,\n                                                              0x86, 0x84, 0x82, 0x85, 0x85, 0x80, 0x1f, 0x87,\n                                                              0x84, 0x88, 0x83, 0x7f, 0x1a, 0x13, 0xf0, 0x71,\n                                                              0xa0, 0x6f, 0xb0, 0xa8, 0xa7, 0x9f, 0xb0, 0xc8,\n                                                              0x48, 0xad, 0x47, 0xfb, 0x4a, 0x5c, 0xfb, 0x1d,\n                                                              0xfb, 0x9, 0x63, 0x1e, 0x3f, 0x6, 0xe, 0x21,\n                                                              0xfb, 0x61, 0xae, 0xf7, 0x4a, 0x76, 0xf8, 0x34,\n                                                              0xb5, 0xf7, 0x76, 0xa8, 0x1, 0x9f, 0xf8, 0x2b,\n                                                              0x15, 0xd5, 0x6, 0x2f, 0xfc, 0x26, 0x5, 0xfb,\n                                                              0x3, 0x72, 0x7c, 0x4b, 0x61, 0x1b, 0x7a, 0x85,\n                                                              0x91, 0x91, 0x91, 0x90, 0x90, 0x8f, 0x92, 0x1f,\n                                                              0x8f, 0x91, 0x8e, 0x91, 0x96, 0x1a, 0xa5, 0x79,\n                                                              0x9f, 0x6f, 0x85, 0x5c, 0x8b, 0x57, 0x41, 0xd7,\n                                                              0x83, 0x9d, 0xf3, 0xd1, 0xba, 0xf7, 0x37, 0xab,\n                                                              0x1e, 0xee, 0xf8, 0x26, 0x5, 0xf7, 0x27, 0x6,\n                                                              0x3c, 0xfb, 0xd5, 0x5, 0x89, 0x81, 0x89, 0x80,\n                                                              0x81, 0x1a, 0x68, 0x9c, 0x6e, 0xc1, 0xd7, 0xb5,\n                                                              0xcc, 0xd1, 0xb8, 0x1e, 0x77, 0x96, 0x5, 0x7a,\n                                                              0x80, 0x64, 0x51, 0x72, 0x1b, 0x7d, 0x87, 0x93,\n                                                              0x95, 0x91, 0x8d, 0x92, 0x8d, 0x91, 0x1f, 0xf7,\n                                                              0x2b, 0xf8, 0xee, 0x28, 0x7f, 0x5, 0x87, 0x50,\n                                                              0x9a, 0x6c, 0x1b, 0xfb, 0x45, 0x61, 0xfb, 0x1d,\n                                                              0xfb, 0xa, 0x66, 0x1f, 0x41, 0x6, 0xf7, 0x53,\n                                                              0x16, 0xe3, 0xa0, 0xab, 0xf7, 0x1e, 0xe9, 0x1b,\n                                                              0xa2, 0x96, 0x7e, 0x85, 0x87, 0x84, 0x84, 0x85,\n                                                              0x81, 0x1f, 0x87, 0x84, 0x87, 0x82, 0x81, 0x1a,\n                                                              0x73, 0x98, 0x80, 0x93, 0x85, 0x1e, 0x6d, 0xfb,\n                                                              0xb, 0x5, 0xe, 0x79, 0x9d, 0xf8, 0x54, 0x99,\n                                                              0xf7, 0x63, 0x9b, 0x98, 0x91, 0x6, 0xfb, 0x62,\n                                                              0x8d, 0xf7, 0x60, 0x8b, 0xf7, 0x9c, 0x94, 0x7,\n                                                              0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xb4,\n                                                              0xa, 0xf7, 0xc, 0xb, 0x8c, 0xc, 0xe, 0xf8,\n                                                              0x88, 0x14, 0xf9, 0x2a, 0x15, 0xb7, 0x13, 0x0,\n                                                              0x71, 0x2, 0x0, 0x1, 0x0, 0x29, 0x0, 0x2f,\n                                                              0x0, 0x3b, 0x0, 0x58, 0x0, 0x61, 0x0, 0x9b,\n                                                              0x0, 0x9e, 0x0, 0xab, 0x0, 0xb6, 0x0, 0xc3,\n                                                              0x0, 0xd6, 0x0, 0xda, 0x0, 0xea, 0x0, 0xfb,\n                                                              0x0, 0xff, 0x1, 0x6, 0x1, 0x10, 0x1, 0x28,\n                                                              0x1, 0x2e, 0x1, 0x58, 0x1, 0x62, 0x1, 0x76,\n                                                              0x1, 0x89, 0x1, 0x96, 0x1, 0xa8, 0x1, 0xb5,\n                                                              0x1, 0xb9, 0x1, 0xf3, 0x1, 0xfd, 0x2, 0xd,\n                                                              0x2, 0x41, 0x2, 0x4a, 0x2, 0x51, 0x2, 0x5d,\n                                                              0x2, 0x65, 0x2, 0x73, 0x2, 0x7d, 0x2, 0x86,\n                                                              0x2, 0x92, 0x2, 0x9e, 0x2, 0xc4, 0x2, 0xcd,\n                                                              0x2, 0xe0, 0x2, 0xf2, 0x2, 0xfb, 0x3, 0x3,\n                                                              0x3, 0x9, 0x3, 0x28, 0x3, 0x32, 0x3, 0x3c,\n                                                              0x3, 0x58, 0x3, 0x60, 0x3, 0x68, 0x3, 0x6d,\n                                                              0x3, 0x74, 0x3, 0x7b, 0x3, 0x81, 0x3, 0x9a,\n                                                              0x3, 0x9d, 0x3, 0xa3, 0x3, 0xb0, 0x3, 0xc6,\n                                                              0x3, 0xdc, 0x3, 0xea, 0x3, 0xee, 0x3, 0xf4,\n                                                              0x3, 0xfa, 0x4, 0x4, 0x4, 0xb, 0x4, 0x12,\n                                                              0x4, 0x24, 0x4, 0x32, 0x4, 0x37, 0x4, 0x48,\n                                                              0x4, 0x53, 0x4, 0x62, 0x4, 0x6c, 0x4, 0x70,\n                                                              0x4, 0x76, 0x4, 0x7a, 0x4, 0x83, 0x4, 0x8b,\n                                                              0x4, 0x92, 0x4, 0x97, 0x4, 0x9c, 0x4, 0xa1,\n                                                              0x4, 0xaf, 0x4, 0xbd, 0x4, 0xc8, 0x4, 0xd5,\n                                                              0x4, 0xdd, 0x4, 0xe1, 0x4, 0xed, 0x4, 0xf9,\n                                                              0x4, 0xff, 0x5, 0x9, 0x5, 0x14, 0x5, 0x1d,\n                                                              0x5, 0x24, 0x5, 0x29, 0x5, 0x33, 0x5, 0x3d,\n                                                              0x5, 0x47, 0x5, 0x51, 0x5, 0x5a, 0x5, 0x5e,\n                                                              0x5, 0x67, 0x5, 0x6d, 0x5, 0x73, 0x5, 0x79,\n                                                              0x5, 0x7f, 0x5, 0x83, 0x5, 0x87, 0x50, 0x1d,\n                                                              0xf4, 0xc2, 0x1a, 0xd3, 0x47, 0x9d, 0x68, 0xfb,\n                                                              0x37, 0xfb, 0x13, 0xfb, 0x4b, 0xfb, 0x1c, 0xfb,\n                                                              0x4, 0xdf, 0x5f, 0x35, 0xa, 0x98, 0xda, 0x9e,\n                                                              0x8d, 0x8d, 0x3d, 0xa, 0x72, 0x82, 0x57, 0x70,\n                                                              0x2d, 0xfb, 0x17, 0x68, 0x1f, 0xb, 0x6, 0xf7,\n                                                              0x2c, 0x21, 0x1d, 0xb, 0x77, 0x1, 0x90, 0xf7,\n                                                              0x16, 0xf7, 0x3f, 0xe7, 0x3, 0x20, 0xa, 0xb,\n                                                              0xf7, 0x8, 0xe3, 0x90, 0xa, 0xf7, 0xab, 0x7b,\n                                                              0x1d, 0x7b, 0x59, 0x40, 0x51, 0xfb, 0xa6, 0x36,\n                                                              0xa, 0xf7, 0x3c, 0xf7, 0x29, 0xf7, 0x1a, 0xfb,\n                                                              0xb, 0xa1, 0x4b, 0x1d, 0xb, 0x32, 0x1d, 0x8c,\n                                                              0xa9, 0x8a, 0x6b, 0x34, 0x1d, 0xb, 0x77, 0x1,\n                                                              0x4d, 0xa, 0x3, 0xf7, 0x3f, 0xf7, 0x2c, 0x15,\n                                                              0xe7, 0xe2, 0xf8, 0x29, 0xf7, 0x4c, 0xf3, 0x8c,\n                                                              0x21, 0x76, 0xfb, 0x8, 0x2d, 0xfc, 0x1a, 0xfb,\n                                                              0x46, 0x50, 0x5e, 0xaf, 0x55, 0x1d, 0xd2, 0xfb,\n                                                              0x16, 0xf7, 0x3b, 0xf7, 0x8d, 0xf7, 0x45, 0xf7,\n                                                              0x9c, 0xf7, 0x56, 0xf7, 0x42, 0xfb, 0x19, 0xd0,\n                                                              0x5d, 0x1d, 0xfb, 0x79, 0xfb, 0x89, 0x1e, 0xb,\n                                                              0x22, 0x1d, 0xe, 0xa4, 0x87, 0x80, 0xb6, 0x4f,\n                                                              0x1b, 0xfb, 0xe, 0xfb, 0x29, 0x2f, 0x1d, 0xb,\n                                                              0xf7, 0x8c, 0xf7, 0x6, 0x15, 0x8d, 0x8c, 0x5,\n                                                              0x2e, 0x1d, 0xb, 0x2c, 0x1d, 0x54, 0x4d, 0x8f,\n                                                              0xa, 0x91, 0x98, 0x31, 0xa, 0x79, 0x86, 0xb,\n                                                              0x4c, 0xa, 0x60, 0x3a, 0x7c, 0x71, 0xfb, 0x27,\n                                                              0x8c, 0x19, 0x65, 0xa, 0x93, 0x73, 0x1d, 0x8b,\n                                                              0x31, 0x1d, 0xb, 0x16, 0x20, 0x1d, 0xb, 0x57,\n                                                              0xa, 0x4e, 0x90, 0x7c, 0x8f, 0x39, 0x1d, 0x65,\n                                                              0x50, 0x7b, 0x97, 0x6e, 0x82, 0x19, 0xb, 0x91,\n                                                              0x9f, 0x1f, 0x44, 0x1d, 0x89, 0xa1, 0x8a, 0x71,\n                                                              0x51, 0x40, 0xfb, 0x4a, 0x46, 0x47, 0xa, 0xb,\n                                                              0x15, 0x20, 0x1d, 0xb, 0x68, 0x1d, 0xf7, 0x7f,\n                                                              0x22, 0xa, 0xb, 0xcc, 0xdb, 0xf7, 0x84, 0xdf,\n                                                              0x94, 0xa7, 0x39, 0xa, 0xb, 0xab, 0xde, 0xf7,\n                                                              0xa1, 0x9f, 0xd1, 0x1f, 0xfb, 0xa, 0x6, 0x6c,\n                                                              0x20, 0x74, 0x3c, 0x5e, 0x3a, 0x8, 0x73, 0x7e,\n                                                              0x4e, 0x2c, 0x63, 0x1b, 0xb, 0x87, 0x8f, 0x95,\n                                                              0x24, 0xa, 0xb, 0x15, 0xf7, 0x58, 0xae, 0x6,\n                                                              0x60, 0x75, 0x98, 0xa1, 0x92, 0x8c, 0x93, 0x8f,\n                                                              0x91, 0x48, 0x1d, 0x9a, 0x20, 0x8b, 0x95, 0x77,\n                                                              0x1a, 0x5a, 0x69, 0x84, 0x5e, 0x57, 0xa, 0x4d,\n                                                              0x91, 0x7d, 0x8e, 0x39, 0x1d, 0x67, 0x50, 0x78,\n                                                              0x95, 0x6f, 0x84, 0x6b, 0x1d, 0x77, 0x74, 0xa,\n                                                              0x13, 0x6c, 0x28, 0xa, 0x13, 0x9c, 0xb, 0xcd,\n                                                              0xf7, 0x0, 0xbf, 0xe2, 0xbe, 0xaa, 0x1e, 0x6e,\n                                                              0x9c, 0x5, 0x66, 0x72, 0x67, 0x55, 0x55, 0x1b,\n                                                              0x77, 0x5c, 0xb, 0x2b, 0x57, 0x8b, 0xbf, 0x9f,\n                                                              0x1e, 0xfb, 0xb, 0xbd, 0x15, 0x2b, 0xd9, 0x54,\n                                                              0xdd, 0xf7, 0x34, 0xf7, 0x10, 0xb, 0x77, 0x1,\n                                                              0x88, 0xf7, 0xb, 0xf7, 0x62, 0xf7, 0xb, 0x3,\n                                                              0x23, 0xa, 0xb, 0x35, 0x1a, 0xfb, 0xc, 0xf7,\n                                                              0x4, 0x57, 0xf6, 0xf7, 0x65, 0xb4, 0xf7, 0x22,\n                                                              0xf7, 0x1f, 0xb3, 0x1e, 0xb, 0x84, 0x61, 0x41,\n                                                              0x45, 0xfb, 0x83, 0x34, 0x7d, 0x6d, 0x96, 0xb9,\n                                                              0x1e, 0xb, 0xf7, 0x64, 0x2d, 0x1d, 0x15, 0xf7,\n                                                              0xa, 0xd7, 0xf7, 0x12, 0xf6, 0xd1, 0x5f, 0xc0,\n                                                              0x42, 0xfb, 0x8, 0x40, 0xfb, 0xc, 0x20, 0x44,\n                                                              0xb0, 0x51, 0xd8, 0x1f, 0x8e, 0xa5, 0x15, 0x72,\n                                                              0x83, 0x9c, 0xa1, 0xab, 0xa5, 0xe4, 0x95, 0xae,\n                                                              0x1f, 0xad, 0x95, 0x9b, 0xd6, 0xb8, 0x1b, 0xa0,\n                                                              0x97, 0x7b, 0x76, 0x65, 0x70, 0x36, 0x7f, 0x63,\n                                                              0x1f, 0x68, 0x81, 0x7f, 0x46, 0x5d, 0x1b, 0xb,\n                                                              0x15, 0x62, 0xa9, 0x7d, 0x1d, 0x6c, 0x69, 0x63,\n                                                              0x1e, 0xe, 0x8f, 0x9d, 0x1f, 0x92, 0xab, 0x15,\n                                                              0xd4, 0x9b, 0xbe, 0xf7, 0x22, 0xc9, 0x1b, 0xa8,\n                                                              0x8b, 0xb, 0x1, 0x80, 0x16, 0xf8, 0x8e, 0x6,\n                                                              0xc6, 0xf7, 0x56, 0x70, 0x90, 0x5, 0xfb, 0x18,\n                                                              0x4d, 0xfb, 0x1c, 0x6b, 0x24, 0x1b, 0x45, 0x6,\n                                                              0xf8, 0x46, 0xf8, 0xe7, 0x5, 0xb2, 0xfc, 0x68,\n                                                              0x7, 0x52, 0xfb, 0x46, 0xa7, 0x87, 0x5, 0xcd,\n                                                              0xba, 0xc8, 0xdc, 0xf7, 0x24, 0x1b, 0xd9, 0x6,\n                                                              0xfc, 0x46, 0xfc, 0xe7, 0x5, 0xb, 0x48, 0x1d,\n                                                              0x9b, 0x21, 0x8a, 0x94, 0x77, 0x1a, 0xb, 0x49,\n                                                              0xa, 0x13, 0xe8, 0x62, 0x6e, 0xb, 0x1f, 0xf7,\n                                                              0x14, 0xf8, 0x5b, 0x9c, 0xca, 0xa6, 0x8f, 0x56,\n                                                              0x1d, 0xb, 0x5b, 0xa, 0xe8, 0xe3, 0x2e, 0x3b,\n                                                              0x1d, 0xb, 0x6b, 0x1a, 0xfb, 0x19, 0xfc, 0x79,\n                                                              0x7a, 0x4d, 0x74, 0x88, 0x63, 0x84, 0x19, 0xb,\n                                                              0xaf, 0x9f, 0xcc, 0x99, 0xba, 0x1f, 0xd2, 0xf7,\n                                                              0x80, 0xb, 0x35, 0x1d, 0x53, 0x4b, 0x4c, 0x70,\n                                                              0x79, 0x7d, 0xb, 0x41, 0xa, 0xc7, 0x9a, 0x7e,\n                                                              0x79, 0x7f, 0x86, 0x7d, 0x47, 0x1d, 0xe, 0x1a,\n                                                              0x74, 0x8b, 0x54, 0xd8, 0xd7, 0xb5, 0xc5, 0xf5,\n                                                              0xd7, 0x1e, 0xb, 0xa7, 0xe3, 0x5, 0xb7, 0x6,\n                                                              0x9c, 0xc8, 0x5, 0x5e, 0x6, 0xd9, 0xf7, 0x99,\n                                                              0x5, 0x5d, 0x6, 0xfb, 0xaa, 0xfb, 0x93, 0x5,\n                                                              0xa7, 0x85, 0x15, 0xf7, 0x48, 0xf7, 0x3a, 0x8d,\n                                                              0x89, 0x5, 0x8c, 0x6, 0x58, 0xfb, 0x38, 0x5,\n                                                              0xb, 0x75, 0xa, 0xde, 0x62, 0x1d, 0x9b, 0x70,\n                                                              0x1e, 0xb, 0xa0, 0x1e, 0xbd, 0xaf, 0xdc, 0xc7,\n                                                              0xbd, 0xaf, 0x8, 0x94, 0x7, 0x55, 0xc2, 0x52,\n                                                              0xc5, 0x5a, 0xc0, 0x8, 0xb, 0x67, 0xa8, 0x6e,\n                                                              0xaf, 0xaf, 0xa8, 0xa8, 0xaf, 0xaf, 0x6e, 0xa8,\n                                                              0x67, 0x67, 0x6e, 0x6e, 0x67, 0x1e, 0xb, 0x1f,\n                                                              0xa7, 0x86, 0xd5, 0xf7, 0xa5, 0x6f, 0x8f, 0xb,\n                                                              0xa6, 0xf7, 0x24, 0xf8, 0xc, 0xf7, 0x24, 0xb,\n                                                              0xf7, 0x42, 0x5, 0x3a, 0x6, 0xb, 0x1a, 0xd8,\n                                                              0x57, 0x8d, 0x73, 0x34, 0x55, 0x38, 0x21, 0x43,\n                                                              0x1e, 0x88, 0x8d, 0xc7, 0xf7, 0x4e, 0x5, 0x79,\n                                                              0x3c, 0x28, 0x82, 0x75, 0x1b, 0x70, 0x7, 0xa6,\n                                                              0xa6, 0x8b, 0x71, 0x1f, 0xb, 0x15, 0xb3, 0x6,\n                                                              0x9e, 0x93, 0x94, 0xa3, 0xac, 0x1b, 0xb, 0x90,\n                                                              0x8b, 0xab, 0xf7, 0xc6, 0xab, 0xf7, 0x9f, 0xab,\n                                                              0xb, 0xc4, 0x1a, 0xba, 0x65, 0xc0, 0x47, 0x36,\n                                                              0x60, 0x4d, 0x67, 0x79, 0x1e, 0x9d, 0x80, 0x5,\n                                                              0x94, 0x94, 0xa5, 0xb2, 0xba, 0x1b, 0xc6, 0x8b,\n                                                              0x52, 0x7f, 0x67, 0x6a, 0xb, 0xac, 0x62, 0x60,\n                                                              0x6c, 0x69, 0x63, 0x1e, 0xe, 0x1a, 0x53, 0x28,\n                                                              0x58, 0x78, 0x81, 0x1e, 0xb, 0xbd, 0x96, 0x57,\n                                                              0x1d, 0xb, 0x90, 0x8b, 0xae, 0xf7, 0x41, 0xb3,\n                                                              0xb, 0x1e, 0x68, 0xf7, 0xc4, 0xae, 0x7, 0xb,\n                                                              0x8b, 0xae, 0xf8, 0xeb, 0xae, 0xb, 0xf7, 0x95,\n                                                              0xfc, 0xb9, 0x5, 0xa7, 0x6, 0xf7, 0x23, 0xf8,\n                                                              0x8e, 0xb2, 0xf7, 0x1e, 0x95, 0x83, 0xc0, 0x98,\n                                                              0x19, 0xae, 0xfb, 0x65, 0x68, 0x7, 0xb, 0x21,\n                                                              0xa, 0xe, 0x15, 0xc4, 0x6, 0xf7, 0x17, 0xb,\n                                                              0x7e, 0xa3, 0x5, 0x7c, 0x87, 0xfb, 0x44, 0x38,\n                                                              0xfb, 0x19, 0x1a, 0x3b, 0xb, 0xf7, 0x3b, 0x1a,\n                                                              0xf7, 0x48, 0xfb, 0x6, 0xed, 0xfb, 0x4f, 0x1e,\n                                                              0xfb, 0xb6, 0x68, 0x6, 0xc9, 0x82, 0x96, 0x89,\n                                                              0x6a, 0x1a, 0xb, 0x50, 0x1e, 0xbb, 0x16, 0xab,\n                                                              0xa5, 0xa5, 0xab, 0xab, 0xa5, 0x71, 0x6b, 0x6b,\n                                                              0x71, 0x71, 0x6b, 0x6b, 0x71, 0xa5, 0xab, 0x1e,\n                                                              0xb, 0xdc, 0xaf, 0x1a, 0x94, 0x87, 0x8e, 0x86,\n                                                              0x79, 0x61, 0x61, 0x7c, 0x6c, 0xa, 0xb, 0x4c,\n                                                              0x1d, 0x78, 0x1d, 0xae, 0xfb, 0xbe, 0x68, 0x7,\n                                                              0xb, 0x76, 0xf7, 0xd0, 0x77, 0x12, 0xb, 0x5c,\n                                                              0xa, 0xc3, 0x7b, 0xa6, 0xb4, 0xab, 0xab, 0xb5,\n                                                              0xb, 0x21, 0x82, 0xd3, 0xf8, 0x16, 0x77, 0xb,\n                                                              0xc8, 0xf7, 0x73, 0x5, 0xa7, 0x93, 0xb, 0x6f,\n                                                              0xa1, 0x75, 0xa7, 0xa7, 0xa1, 0xa1, 0xa7, 0xa7,\n                                                              0x75, 0xa1, 0x6f, 0x6f, 0x75, 0x75, 0x6f, 0x1e,\n                                                              0xb, 0x66, 0xa8, 0x6e, 0xb0, 0xb0, 0xa9, 0xa8,\n                                                              0x36, 0x1d, 0x6e, 0x6d, 0x66, 0x1e, 0xb, 0xfb,\n                                                              0xa5, 0x58, 0xa, 0xb, 0x9e, 0x9c, 0x9e, 0xa2,\n                                                              0xb4, 0x1b, 0xb3, 0x98, 0x6e, 0x74, 0x4c, 0x2f,\n                                                              0x7a, 0x6e, 0x86, 0x1f, 0xb, 0xf7, 0x52, 0xf7,\n                                                              0x95, 0x90, 0x1d, 0xb6, 0x93, 0x57, 0x1d, 0xb,\n                                                              0x7c, 0x59, 0xfb, 0x2c, 0x67, 0xfb, 0x6, 0x1f,\n                                                              0x65, 0x7b, 0x68, 0x8a, 0x73, 0x1b, 0xe, 0x76,\n                                                              0x1e, 0x59, 0x67, 0x3a, 0x4f, 0x59, 0x67, 0x8,\n                                                              0xb, 0x19, 0x70, 0x7, 0xb, 0xa8, 0xf7, 0x81,\n                                                              0x5c, 0x1d, 0xb, 0x5, 0x89, 0x6, 0xb, 0x15,\n                                                              0x50, 0x49, 0x34, 0x3a, 0x67, 0x1a, 0x82, 0xb,\n                                                              0x6f, 0x80, 0x60, 0x62, 0x77, 0x88, 0x1d, 0xb,\n                                                              0xc7, 0x79, 0xc3, 0xf8, 0xe8, 0xae, 0xb, 0xf7,\n                                                              0x7f, 0x77, 0x1, 0xb, 0x12, 0x76, 0xf7, 0xf,\n                                                              0xb, 0x9a, 0x8f, 0xf7, 0x44, 0xb, 0x1b, 0xd7,\n                                                              0xaa, 0xc3, 0xac, 0xb4, 0x67, 0x98, 0x79, 0x6f,\n                                                              0x76, 0x70, 0x74, 0xb, 0x91, 0xa0, 0x1f, 0xfb,\n                                                              0x80, 0xfb, 0x12, 0x15, 0xf7, 0xb2, 0x6, 0xf7,\n                                                              0xd2, 0xb, 0x85, 0x83, 0xa, 0xf7, 0xe8, 0xe3,\n                                                              0xf0, 0xbd, 0xa4, 0x1b, 0xb, 0xa2, 0xf7, 0x2d,\n                                                              0x5, 0x6e, 0x6, 0x7a, 0x81, 0x88, 0x87, 0x7c,\n                                                              0x1b, 0xb, 0x1a, 0x67, 0x62, 0x3c, 0x5f, 0x36,\n                                                              0x1e, 0xb, 0x15, 0xb8, 0x6, 0xb, 0x8b, 0xf7,\n                                                              0x19, 0x7c, 0x1e, 0x70, 0x8e, 0x75, 0xfb, 0x3a,\n                                                              0x5, 0xb, 0x8d, 0x93, 0x94, 0x8d, 0x99, 0x1b,\n                                                              0xb9, 0x8b, 0x6b, 0x87, 0x71, 0xb, 0x1f, 0xc8,\n                                                              0xf7, 0x7b, 0x5, 0xb, 0x3c, 0x7c, 0x59, 0x83,\n                                                              0x3b, 0x84, 0x6d, 0xa, 0xa9, 0xb, 0xf7, 0xad,\n                                                              0xf7, 0xe3, 0x18, 0x95, 0xfb, 0xcc, 0x7, 0x60,\n                                                              0xb, 0xfb, 0x32, 0x15, 0x98, 0x73, 0x5, 0x75,\n                                                              0xa, 0xb, 0x19, 0xae, 0xfb, 0xd1, 0x68, 0x7,\n                                                              0xb, 0x16, 0xf7, 0xd, 0x6, 0xb, 0xfb, 0xdd,\n                                                              0xfb, 0x32, 0x76, 0xf9, 0xf4, 0x77, 0x1, 0xb,\n                                                              0x93, 0x7e, 0x15, 0x9c, 0x90, 0x9f, 0x8e, 0x8f,\n                                                              0x1b, 0xb, 0x92, 0x95, 0x75, 0x1f, 0x75, 0x6a,\n                                                              0x5, 0x84, 0x9c, 0xb, 0x8b, 0x69, 0x1b, 0x66,\n                                                              0xf7, 0x8d, 0xb0, 0x7, 0x68, 0xb, 0x72, 0x58,\n                                                              0xfb, 0x39, 0x58, 0xfb, 0x53, 0x1e, 0xb, 0x76,\n                                                              0x54, 0xa, 0xb, 0xfb, 0xce, 0xfb, 0x3a, 0x76,\n                                                              0xf9, 0xfd, 0x77, 0xb, 0x1a, 0x87, 0x8a, 0x86,\n                                                              0x8a, 0xb, 0x15, 0xf7, 0x74, 0x9e, 0x6, 0xb,\n                                                              0xf7, 0x40, 0x5, 0xc6, 0xcd, 0xb, 0xf7, 0x1a,\n                                                              0xd5, 0xf7, 0x1a, 0xb, 0x74, 0x88, 0x1d, 0xb,\n                                                              0x15, 0xcb, 0xbd, 0xb\n                                                             };\n"
  },
  {
    "path": "core/src/fxge/fontdata/chromefontdata/FoxitSerifItalic.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nconst unsigned char g_FoxitSerifItalicFontData [21227] = {0x1,\n                                                          0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x15,\n                                                          0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72,\n                                                          0x69, 0x66, 0x4f, 0x54, 0x46, 0x2d, 0x49, 0x74,\n                                                          0x61, 0x6c, 0x69, 0x63, 0x0, 0x1, 0x1, 0x1,\n                                                          0x2a, 0xf8, 0x10, 0x0, 0xf8, 0x1c, 0x1, 0xf8,\n                                                          0x1d, 0x2, 0xf8, 0x1e, 0x3, 0xf8, 0x18, 0x4,\n                                                          0x1e, 0xe1, 0x5a, 0x4f, 0xc, 0x2, 0xfb, 0x3c,\n                                                          0xfb, 0x8e, 0xfa, 0x71, 0xf9, 0xf8, 0x5, 0xf7,\n                                                          0x3c, 0xf, 0xf8, 0x93, 0x11, 0xb0, 0x1c, 0x46,\n                                                          0xd6, 0x12, 0x0, 0x4, 0x1, 0x1, 0x5, 0x2f,\n                                                          0x45, 0x54, 0x45, 0x75, 0x72, 0x6f, 0x20, 0x20,\n                                                          0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                          0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                          0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                          0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                          0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                          0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20, 0x53, 0x65,\n                                                          0x72, 0x69, 0x66, 0x20, 0x4f, 0x54, 0x46, 0x20,\n                                                          0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x43, 0x68,\n                                                          0x72, 0x6F, 0x6D, 0x20, 0x53, 0x65, 0x72, 0x69,\n                                                          0x66, 0x20, 0x4f, 0x54, 0x46, 0x0, 0x0, 0x1,\n                                                          0x0, 0x1, 0x6, 0x0, 0x68, 0x0, 0x0, 0x9,\n                                                          0x37, 0x0, 0x7c, 0x0, 0x0, 0x42, 0x20, 0x0,\n                                                          0x67, 0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0,\n                                                          0x0, 0x66, 0x0, 0x0, 0x83, 0x0, 0x0, 0xaa,\n                                                          0x0, 0x0, 0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0,\n                                                          0x97, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x80, 0x0,\n                                                          0x0, 0xa1, 0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4,\n                                                          0x0, 0x0, 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0,\n                                                          0x98, 0x0, 0x0, 0x73, 0x0, 0x0, 0x72, 0x0,\n                                                          0x0, 0x85, 0x0, 0x0, 0x96, 0x0, 0x0, 0x8f,\n                                                          0x0, 0x0, 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0,\n                                                          0x9b, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0,\n                                                          0x0, 0xae, 0x0, 0x0, 0xab, 0x1, 0x0, 0xb0,\n                                                          0x0, 0x0, 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0,\n                                                          0x8a, 0x0, 0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0,\n                                                          0x0, 0xb2, 0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6,\n                                                          0x2, 0x0, 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0,\n                                                          0xbe, 0x0, 0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0,\n                                                          0x0, 0xbd, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d,\n                                                          0x0, 0x0, 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0,\n                                                          0xc5, 0x0, 0x0, 0x9d, 0x0, 0x0, 0x95, 0x0,\n                                                          0x0, 0xcb, 0x0, 0x0, 0xc8, 0x1, 0x0, 0xcd,\n                                                          0x0, 0x0, 0xca, 0x0, 0x0, 0xcc, 0x0, 0x0,\n                                                          0x90, 0x0, 0x0, 0xce, 0x0, 0x0, 0xd2, 0x0,\n                                                          0x0, 0xcf, 0x2, 0x0, 0xd6, 0x0, 0x0, 0xd3,\n                                                          0x2, 0x0, 0xa7, 0x0, 0x0, 0xd7, 0x0, 0x0,\n                                                          0xdb, 0x0, 0x0, 0xd8, 0x1, 0x0, 0xdc, 0x0,\n                                                          0x0, 0xda, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x93,\n                                                          0x0, 0x0, 0xe1, 0x0, 0x0, 0xde, 0x2, 0x0,\n                                                          0xe2, 0x0, 0x0, 0xa2, 0x0, 0x0, 0xe3, 0x0,\n                                                          0x0, 0x91, 0x0, 0x0, 0x8c, 0x0, 0x0, 0x92,\n                                                          0x0, 0x0, 0x8e, 0x0, 0x0, 0x94, 0x0, 0x0,\n                                                          0xc0, 0x0, 0x0, 0xdd, 0x0, 0x0, 0xc6, 0x1,\n                                                          0x0, 0xe4, 0x0, 0x0, 0x65, 0x0, 0x0, 0x7e,\n                                                          0x0, 0x0, 0x88, 0x0, 0x0, 0x81, 0x1, 0x0,\n                                                          0x84, 0x0, 0x0, 0x87, 0x0, 0x0, 0x7f, 0x0,\n                                                          0x0, 0x86, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89,\n                                                          0x0, 0x0, 0x41, 0x0, 0x0, 0x8, 0x0, 0x0,\n                                                          0x75, 0x0, 0x0, 0x69, 0x0, 0x0, 0x77, 0x0,\n                                                          0x0, 0x76, 0x0, 0x0, 0x70, 0x1, 0x0, 0x74,\n                                                          0x0, 0x0, 0x79, 0x1, 0x0, 0x6b, 0x1, 0x0,\n                                                          0x63, 0x0, 0x1, 0x87, 0x0, 0x0, 0x99, 0x0,\n                                                          0x0, 0xa6, 0x0, 0x0, 0x6d, 0x1, 0x0, 0xe6,\n                                                          0x2, 0x0, 0x1, 0x0, 0x3, 0x0, 0x5, 0x0,\n                                                          0x4a, 0x0, 0x82, 0x0, 0xf8, 0x1, 0x8c, 0x1,\n                                                          0xb7, 0x2, 0x73, 0x2, 0xa0, 0x2, 0xd9, 0x3,\n                                                          0x17, 0x3, 0xed, 0x4, 0x1a, 0x4, 0x49, 0x4,\n                                                          0x60, 0x4, 0x6d, 0x4, 0x88, 0x4, 0xcf, 0x5,\n                                                          0x1d, 0x5, 0x70, 0x5, 0xe3, 0x6, 0x2a, 0x6,\n                                                          0x7a, 0x6, 0xd3, 0x6, 0xff, 0x7, 0x7d, 0x7,\n                                                          0xe1, 0x7, 0xfe, 0x8, 0x46, 0x8, 0x71, 0x8,\n                                                          0x95, 0x8, 0xb5, 0x9, 0x2c, 0x9, 0xe6, 0xa,\n                                                          0x2e, 0xa, 0xb6, 0xa, 0xe4, 0xb, 0x2e, 0xb,\n                                                          0x8c, 0xb, 0xf5, 0xc, 0x6e, 0xc, 0xf7, 0xd,\n                                                          0x30, 0xd, 0x87, 0xe, 0xb, 0xe, 0x3a, 0xe,\n                                                          0xb5, 0xf, 0x1f, 0xf, 0x62, 0xf, 0xc8, 0x10,\n                                                          0x4c, 0x10, 0xc6, 0x11, 0x2, 0x11, 0x4d, 0x11,\n                                                          0xa6, 0x11, 0xf6, 0x12, 0x75, 0x12, 0xf6, 0x13,\n                                                          0x4f, 0x13, 0x59, 0x13, 0x85, 0x13, 0xa3, 0x13,\n                                                          0xd2, 0x13, 0xf9, 0x14, 0xa, 0x14, 0x26, 0x14,\n                                                          0x63, 0x14, 0xd3, 0x15, 0x11, 0x15, 0x9e, 0x15,\n                                                          0xea, 0x16, 0x6e, 0x17, 0x1a, 0x17, 0x8e, 0x17,\n                                                          0xc6, 0x18, 0x33, 0x18, 0xa9, 0x18, 0xe1, 0x19,\n                                                          0x85, 0x19, 0xab, 0x19, 0xea, 0x1a, 0x2a, 0x1a,\n                                                          0x95, 0x1a, 0xf1, 0x1b, 0x53, 0x1b, 0xb1, 0x1b,\n                                                          0xef, 0x1c, 0x56, 0x1c, 0xf1, 0x1d, 0x95, 0x1d,\n                                                          0xd7, 0x1e, 0x19, 0x1e, 0x75, 0x1e, 0x8b, 0x1e,\n                                                          0xe9, 0x1f, 0x36, 0x1f, 0x81, 0x1f, 0xf7, 0x20,\n                                                          0x99, 0x21, 0xc, 0x21, 0xa1, 0x21, 0xc0, 0x22,\n                                                          0x97, 0x22, 0xa5, 0x23, 0x4c, 0x23, 0xc3, 0x24,\n                                                          0x4, 0x24, 0x25, 0x25, 0x13, 0x25, 0x2a, 0x25,\n                                                          0x62, 0x25, 0x9a, 0x25, 0xb6, 0x25, 0xfd, 0x26,\n                                                          0x1c, 0x26, 0x98, 0x26, 0xd0, 0x26, 0xdf, 0x27,\n                                                          0x21, 0x27, 0x73, 0x27, 0xb1, 0x27, 0xc4, 0x28,\n                                                          0x1c, 0x28, 0x88, 0x28, 0xd1, 0x29, 0x31, 0x29,\n                                                          0x65, 0x29, 0x8c, 0x29, 0xc3, 0x29, 0xfd, 0x2a,\n                                                          0x29, 0x2a, 0x89, 0x2b, 0x2f, 0x2b, 0x91, 0x2b,\n                                                          0xd0, 0x2b, 0xf3, 0x2c, 0x12, 0x2c, 0x33, 0x2c,\n                                                          0x40, 0x2c, 0x5e, 0x2c, 0x74, 0x2c, 0x89, 0x2c,\n                                                          0xec, 0x2d, 0x85, 0x2d, 0x96, 0x2d, 0xa9, 0x2d,\n                                                          0xc2, 0x2d, 0xfd, 0x2e, 0x1f, 0x2e, 0x61, 0x2e,\n                                                          0xdd, 0x2f, 0x5, 0x2f, 0x1c, 0x2f, 0x2f, 0x2f,\n                                                          0x5c, 0x2f, 0xc8, 0x30, 0x43, 0x30, 0xfb, 0x31,\n                                                          0x9, 0x31, 0x1b, 0x31, 0x35, 0x31, 0x5d, 0x31,\n                                                          0x74, 0x31, 0xbd, 0x32, 0x62, 0x32, 0xd5, 0x32,\n                                                          0xf4, 0x33, 0x2c, 0x33, 0x50, 0x33, 0x73, 0x33,\n                                                          0x92, 0x33, 0xaf, 0x33, 0xbe, 0x33, 0xdb, 0x34,\n                                                          0x4f, 0x34, 0x8b, 0x34, 0xa6, 0x34, 0xc0, 0x34,\n                                                          0xda, 0x35, 0x13, 0x35, 0x33, 0x35, 0x64, 0x35,\n                                                          0xd5, 0x35, 0xf0, 0x35, 0xfe, 0x36, 0x24, 0x36,\n                                                          0x49, 0x36, 0x95, 0x36, 0xe0, 0x37, 0x3e, 0x37,\n                                                          0x54, 0x37, 0x93, 0x37, 0xdd, 0x38, 0x99, 0x39,\n                                                          0x38, 0x39, 0x7d, 0x39, 0xe5, 0x3a, 0x66, 0x3a,\n                                                          0x78, 0x3a, 0xc8, 0x3b, 0x4c, 0x3b, 0x67, 0x3b,\n                                                          0x83, 0x3b, 0xad, 0x3b, 0xbd, 0x3c, 0xf, 0x3c,\n                                                          0x41, 0x3c, 0x5e, 0x3c, 0x7e, 0x3c, 0x92, 0x3c,\n                                                          0xa8, 0x3c, 0xcd, 0x3c, 0xfd, 0x3d, 0x1e, 0x3d,\n                                                          0x60, 0x3d, 0x99, 0x3d, 0xd2, 0x3e, 0x75, 0x3f,\n                                                          0x4e, 0x3f, 0x7a, 0x3f, 0xb5, 0x3f, 0xed, 0x40,\n                                                          0xb, 0x40, 0x27, 0x40, 0x3c, 0x40, 0xba, 0x41,\n                                                          0x60, 0x41, 0x6d, 0x42, 0x36, 0x43, 0x7, 0x20,\n                                                          0xe, 0x20, 0xe, 0x73, 0x8e, 0xf4, 0xf8, 0xc3,\n                                                          0x77, 0x12, 0xb2, 0xf4, 0x17, 0xf7, 0xc, 0xf7,\n                                                          0x49, 0x15, 0x9c, 0x87, 0xc5, 0xf7, 0x32, 0xbe,\n                                                          0xf7, 0x8, 0xb7, 0xf7, 0x10, 0x19, 0x92, 0x9f,\n                                                          0x90, 0x9b, 0x9a, 0x1a, 0xa6, 0x6e, 0x99, 0x7c,\n                                                          0x1e, 0x13, 0xa0, 0x71, 0x77, 0x6d, 0x64, 0x82,\n                                                          0x1f, 0x6f, 0xfb, 0x10, 0x76, 0xfb, 0x18, 0x69,\n                                                          0xfb, 0x35, 0x8, 0x3a, 0xfb, 0x20, 0x15, 0x6e,\n                                                          0xa2, 0x85, 0xa, 0x74, 0x73, 0x6e, 0x1e, 0xe,\n                                                          0xca, 0xf8, 0x4e, 0x76, 0xf7, 0x89, 0x77, 0x1,\n                                                          0xf7, 0x24, 0xa0, 0xf7, 0x32, 0xa0, 0x3, 0xf7,\n                                                          0xd7, 0xf8, 0x39, 0x15, 0xa0, 0x6, 0xa8, 0xd0,\n                                                          0xc6, 0xf6, 0xac, 0x1a, 0x9c, 0x7f, 0x9e, 0x76,\n                                                          0x77, 0x71, 0xbc, 0xa, 0xfb, 0x47, 0x16, 0xa0,\n                                                          0x6, 0xa7, 0xcc, 0xc1, 0xee, 0xbb, 0x1a, 0x9a,\n                                                          0x81, 0x9d, 0x7a, 0x72, 0x76, 0xbc, 0xa, 0xe,\n                                                          0xa0, 0x76, 0xf7, 0x5f, 0xb2, 0x64, 0xc1, 0xf7,\n                                                          0x2d, 0xc1, 0x63, 0xb3, 0xf7, 0x68, 0x77, 0x12,\n                                                          0xe9, 0xf8, 0x64, 0x13, 0xb6, 0x9c, 0x16, 0xb3,\n                                                          0x6, 0xd6, 0xf7, 0x5f, 0x5, 0xf7, 0x42, 0x6,\n                                                          0x40, 0xfb, 0x5f, 0x5, 0xb2, 0x6, 0xd7, 0xf7,\n                                                          0x5f, 0x5, 0xf4, 0x6, 0x13, 0xce, 0x96, 0xb2,\n                                                          0x5, 0x26, 0x6, 0xce, 0xf7, 0x4a, 0x5, 0xf0,\n                                                          0x6, 0x96, 0xb3, 0x5, 0x2b, 0x6, 0xdb, 0xf7,\n                                                          0x68, 0x5, 0x62, 0x6, 0x3b, 0xfb, 0x68, 0x5,\n                                                          0xfb, 0x41, 0x6, 0xda, 0xf7, 0x68, 0x5, 0x66,\n                                                          0x6, 0x3b, 0xfb, 0x68, 0x5, 0x22, 0x6, 0x80,\n                                                          0x63, 0x5, 0xee, 0x6, 0x49, 0xfb, 0x4a, 0x5,\n                                                          0x2b, 0x6, 0x80, 0x64, 0x5, 0xe7, 0x6, 0xc1,\n                                                          0xb2, 0x15, 0xce, 0xf7, 0x4a, 0x5, 0xf7, 0x42,\n                                                          0x6, 0x47, 0xfb, 0x4a, 0x5, 0xe, 0x47, 0x76,\n                                                          0xf5, 0x76, 0xa4, 0x76, 0xf9, 0x15, 0xa6, 0xb9,\n                                                          0x77, 0x12, 0xa2, 0xd9, 0xf7, 0xab, 0xd6, 0x13,\n                                                          0xde, 0xf7, 0xae, 0xf8, 0x38, 0x15, 0x61, 0xa9,\n                                                          0x64, 0xab, 0xc1, 0x1a, 0xd5, 0xc5, 0xaa, 0xd8,\n                                                          0x1e, 0xfb, 0x7, 0xfc, 0xfc, 0x15, 0xcf, 0xf7,\n                                                          0xad, 0x5, 0xc2, 0x5d, 0xaf, 0x6d, 0x48, 0x1a,\n                                                          0xfb, 0x14, 0xfb, 0x14, 0x81, 0x6c, 0x1e, 0xfb,\n                                                          0x52, 0xb5, 0x15, 0x97, 0x80, 0xbf, 0x65, 0xe1,\n                                                          0x7b, 0x75, 0x30, 0x18, 0xae, 0x6, 0x13, 0xbe,\n                                                          0xa0, 0xe4, 0x5, 0x13, 0x5e, 0xf7, 0x56, 0xb9,\n                                                          0xf6, 0xe4, 0xdb, 0x5e, 0xb9, 0x2a, 0xd5, 0x1f,\n                                                          0xc3, 0xf7, 0x81, 0x5, 0xad, 0x7d, 0xbe, 0x76,\n                                                          0x29, 0x1a, 0x9a, 0x89, 0xa7, 0xf7, 0x6, 0x60,\n                                                          0xaa, 0x50, 0x9b, 0x78, 0x8f, 0x19, 0x9b, 0xcf,\n                                                          0x5, 0x69, 0x6, 0x7a, 0x4c, 0x5, 0x13, 0x44,\n                                                          0xfb, 0xe, 0x2b, 0x58, 0xfb, 0x0, 0x44, 0xcc,\n                                                          0x4d, 0xd1, 0x5c, 0x1f, 0x46, 0xfb, 0xbd, 0x2a,\n                                                          0xa1, 0x82, 0xcc, 0x82, 0xd5, 0x19, 0x7b, 0x88,\n                                                          0x5, 0xe, 0xf8, 0x70, 0xb0, 0xa, 0xd5, 0xd0,\n                                                          0xa, 0xf7, 0x1e, 0xd0, 0xa, 0x13, 0xb7, 0x80,\n                                                          0xf8, 0x97, 0xf7, 0x9, 0x30, 0xa, 0xfc, 0x8b,\n                                                          0xf8, 0x11, 0x30, 0xa, 0x13, 0x6f, 0x80, 0x54,\n                                                          0xfc, 0x33, 0x15, 0xba, 0x6, 0xf9, 0x48, 0xf9,\n                                                          0x48, 0x5, 0x5c, 0x6, 0xe, 0xf8, 0x39, 0x79,\n                                                          0xbc, 0x5b, 0xbc, 0xf8, 0x1, 0xaa, 0xf7, 0x62,\n                                                          0xab, 0x12, 0xd7, 0xe9, 0xf7, 0x2e, 0xdc, 0xf7,\n                                                          0x4, 0xd0, 0x13, 0x7e, 0xf8, 0x5d, 0xc8, 0x15,\n                                                          0x13, 0xbe, 0x6d, 0xa3, 0xb3, 0x5a, 0xd5, 0x1b,\n                                                          0xbe, 0xb6, 0xa5, 0xb5, 0xad, 0x1f, 0x80, 0x96,\n                                                          0x5, 0x7f, 0x7b, 0x76, 0x79, 0x69, 0x1b, 0x62,\n                                                          0x60, 0xa6, 0xce, 0x66, 0x1f, 0xc2, 0xd2, 0xa8,\n                                                          0xbe, 0x9a, 0x9f, 0x8, 0xb0, 0xa6, 0x9f, 0xa8,\n                                                          0xbc, 0x1b, 0x9c, 0xfb, 0x4d, 0x78, 0x7, 0xaa,\n                                                          0x95, 0x7b, 0x70, 0x61, 0x71, 0x6a, 0x5f, 0x56,\n                                                          0x1f, 0x60, 0xcd, 0x6b, 0xf7, 0xb, 0x7f, 0xbf,\n                                                          0x8, 0xc7, 0xa9, 0xf7, 0x4, 0xc3, 0xe6, 0x1a,\n                                                          0xbb, 0x61, 0xb7, 0x50, 0x30, 0x45, 0x3b, 0xfb,\n                                                          0x11, 0x7e, 0x8c, 0x82, 0x91, 0x4e, 0x1e, 0xfb,\n                                                          0x17, 0x52, 0xfb, 0x10, 0x55, 0xfb, 0x15, 0x1a,\n                                                          0xfb, 0x1a, 0xf7, 0x14, 0x75, 0xbd, 0xdb, 0xb3,\n                                                          0xa5, 0xc0, 0xde, 0x1e, 0x78, 0xa8, 0x15, 0x61,\n                                                          0x5d, 0x52, 0x7d, 0x68, 0x1b, 0x48, 0x4c, 0xba,\n                                                          0xe1, 0xf7, 0x9, 0xf7, 0x36, 0xc8, 0x8c, 0x1f,\n                                                          0x9f, 0x45, 0xb2, 0xfb, 0x13, 0xb9, 0x51, 0x8,\n                                                          0x6f, 0xf7, 0xe6, 0x15, 0x88, 0xa5, 0x89, 0x9c,\n                                                          0xaf, 0x1a, 0xc2, 0x94, 0xd3, 0xc4, 0x9b, 0xa9,\n                                                          0x8b, 0x53, 0x38, 0x5c, 0x6e, 0x4f, 0x65, 0x1e,\n                                                          0xe, 0xfb, 0x23, 0xf8, 0x4e, 0x76, 0xf7, 0x89,\n                                                          0x77, 0x1, 0xf7, 0x18, 0xa0, 0x3, 0xf7, 0x18,\n                                                          0xf8, 0x39, 0x15, 0xa0, 0x6, 0xb4, 0xe3, 0xba,\n                                                          0xe5, 0xa8, 0x1a, 0x9c, 0x80, 0xa0, 0x75, 0x77,\n                                                          0x71, 0x7e, 0x72, 0x84, 0x1e, 0x82, 0x6b, 0x82,\n                                                          0xfb, 0xc, 0x86, 0x54, 0x8, 0xe, 0x73, 0xfb,\n                                                          0x34, 0x76, 0xf9, 0xe6, 0x77, 0x1, 0xb5, 0xd2,\n                                                          0x3, 0xf7, 0x21, 0xfb, 0x49, 0x15, 0x9d, 0x91,\n                                                          0x5, 0x4c, 0xf7, 0x9, 0x9c, 0xf7, 0x53, 0xc4,\n                                                          0x1a, 0xf7, 0x21, 0xeb, 0xf7, 0x7c, 0xf5, 0xe6,\n                                                          0x1e, 0x7e, 0x9a, 0x5, 0xfb, 0x4a, 0xfb, 0x2f,\n                                                          0x3d, 0xfb, 0x30, 0xfb, 0x39, 0x1a, 0x4b, 0x90,\n                                                          0xfb, 0x2a, 0xe9, 0xfb, 0x34, 0x1e, 0xe, 0x73,\n                                                          0xfb, 0x36, 0x76, 0xf9, 0xe8, 0x77, 0x12, 0xf7,\n                                                          0x6d, 0xd3, 0x17, 0x9b, 0xfb, 0x39, 0x15, 0x98,\n                                                          0x7c, 0x5, 0x13, 0x60, 0xf7, 0x28, 0xf7, 0xb,\n                                                          0xf7, 0x4, 0xf7, 0x3a, 0xf7, 0x51, 0x1a, 0xf7,\n                                                          0x16, 0x70, 0xf7, 0x14, 0x43, 0xf7, 0x9, 0x1e,\n                                                          0x78, 0x86, 0xbd, 0x2b, 0x98, 0xfb, 0x1b, 0x7a,\n                                                          0xfb, 0x1f, 0x19, 0x75, 0xfb, 0x47, 0x43, 0xfb,\n                                                          0x4a, 0x20, 0x29, 0x8, 0xe, 0xf7, 0x37, 0xf7,\n                                                          0x9, 0x66, 0x76, 0xf8, 0x10, 0x76, 0xe0, 0x77,\n                                                          0xa6, 0x77, 0x12, 0xf7, 0xc1, 0x9d, 0x13, 0xac,\n                                                          0xf7, 0xc0, 0xf8, 0x52, 0x15, 0x8c, 0x73, 0x8c,\n                                                          0x71, 0x84, 0x73, 0x8, 0x82, 0x6c, 0x7e, 0x6f,\n                                                          0x7c, 0x1a, 0x13, 0x6c, 0x72, 0x9d, 0x79, 0x9d,\n                                                          0x9d, 0x9e, 0x9c, 0xa6, 0x8c, 0x1e, 0x8c, 0xa1,\n                                                          0x7e, 0x99, 0x82, 0xb0, 0x8, 0x87, 0x9d, 0x88,\n                                                          0xa2, 0xac, 0x1a, 0xa2, 0x7e, 0x9c, 0x7e, 0x99,\n                                                          0x7f, 0x8, 0x65, 0xb6, 0x92, 0x6c, 0xab, 0x1b,\n                                                          0x9d, 0x9e, 0x9a, 0xa3, 0xb1, 0x62, 0x87, 0x4c,\n                                                          0x9e, 0x1f, 0x79, 0x90, 0x76, 0x97, 0x76, 0x96,\n                                                          0xa3, 0x9d, 0xa3, 0x94, 0xa0, 0x91, 0x8, 0xc3,\n                                                          0x9c, 0xb2, 0x82, 0xbb, 0x1a, 0x9e, 0x7a, 0x9a,\n                                                          0x78, 0x6f, 0x7b, 0x6f, 0x6f, 0x70, 0x1e, 0x70,\n                                                          0x70, 0x66, 0x71, 0x89, 0x1b, 0xb0, 0x8e, 0xa9,\n                                                          0x90, 0x98, 0x1e, 0x95, 0xa7, 0x94, 0xa1, 0xa0,\n                                                          0x1a, 0x13, 0xb4, 0xa7, 0x7a, 0x99, 0x7a, 0x79,\n                                                          0x78, 0x7b, 0x70, 0x76, 0x95, 0x7a, 0x93, 0x6a,\n                                                          0x1e, 0x8f, 0x78, 0x8f, 0x73, 0x6a, 0x1a, 0x6f,\n                                                          0x9b, 0x78, 0x9a, 0x7c, 0x99, 0x8, 0xae, 0x66,\n                                                          0x83, 0xa4, 0x6b, 0x1b, 0x74, 0x80, 0x77, 0x7d,\n                                                          0x5e, 0xb3, 0x90, 0xc2, 0x7c, 0x1f, 0x9d, 0x86,\n                                                          0x9f, 0x84, 0xac, 0x78, 0x70, 0x79, 0x71, 0x81,\n                                                          0x74, 0x85, 0x8, 0x56, 0x7d, 0x66, 0x8f, 0x5f,\n                                                          0x1a, 0x81, 0x96, 0x74, 0xa3, 0xa8, 0x9c, 0xa7,\n                                                          0xa8, 0xa5, 0x1e, 0xa4, 0xa6, 0xa7, 0x97, 0x97,\n                                                          0x95, 0x8, 0xe, 0xf7, 0xd2, 0xa0, 0x76, 0xf7,\n                                                          0x86, 0xb4, 0xf7, 0x73, 0x77, 0x12, 0xf7, 0xc5,\n                                                          0xcd, 0x53, 0xb5, 0x13, 0xf0, 0xe1, 0xf7, 0x86,\n                                                          0x15, 0x13, 0xe8, 0xf7, 0x79, 0xfb, 0x86, 0xb5,\n                                                          0xf7, 0x86, 0xf7, 0x7d, 0xb4, 0xfb, 0x7d, 0xf7,\n                                                          0x73, 0x61, 0xfb, 0x73, 0xfb, 0x79, 0x6, 0xe,\n                                                          0x20, 0xfb, 0x0, 0x76, 0xf7, 0x7a, 0x77, 0x12,\n                                                          0xa2, 0xc0, 0xa, 0x13, 0xe0, 0x87, 0xfb, 0x4,\n                                                          0x15, 0x94, 0x7a, 0x5, 0xc8, 0xa, 0x83, 0x5e,\n                                                          0x7f, 0x61, 0x75, 0x97, 0x81, 0x97, 0x83, 0x1e,\n                                                          0x13, 0xd0, 0x97, 0x83, 0x97, 0x84, 0x7a, 0x1a,\n                                                          0x66, 0x54, 0x66, 0x77, 0x7e, 0x1e, 0xe, 0x73,\n                                                          0xf7, 0x54, 0xca, 0x1, 0xbc, 0xf7, 0x7d, 0x3,\n                                                          0xbc, 0xf7, 0x54, 0x15, 0xf7, 0x6e, 0x6, 0x9a,\n                                                          0xca, 0x5, 0xfb, 0x6d, 0x6, 0xe, 0x20, 0x80,\n                                                          0xf7, 0x3, 0x1, 0xa6, 0xf7, 0x3, 0x3, 0xa6,\n                                                          0xb7, 0x84, 0xa, 0x3c, 0x8e, 0x76, 0xf9, 0x40,\n                                                          0x77, 0x1, 0x77, 0xf8, 0xb, 0x3, 0x77, 0x79,\n                                                          0x15, 0xf8, 0x2a, 0xf9, 0x40, 0x5, 0x5f, 0x6,\n                                                          0xfc, 0x2b, 0xfd, 0x40, 0x5, 0xe, 0x84, 0xa7,\n                                                          0xf9, 0x7, 0xa7, 0x1, 0xab, 0xda, 0xf7, 0xc7,\n                                                          0xda, 0x3, 0xf7, 0x3, 0xf7, 0x30, 0x15, 0xec,\n                                                          0xd3, 0xf8, 0x1f, 0xf7, 0x29, 0xe1, 0x8b, 0x25,\n                                                          0x6d, 0xfb, 0x43, 0x35, 0xfb, 0xd4, 0xfb, 0x1a,\n                                                          0x6b, 0x54, 0x9e, 0xf7, 0x8, 0x1e, 0x3c, 0xbb,\n                                                          0x15, 0x23, 0xc4, 0x20, 0xf3, 0xf7, 0x3c, 0xf7,\n                                                          0x1c, 0xf7, 0x7c, 0xf7, 0x5a, 0xed, 0x70, 0xf7,\n                                                          0x2f, 0xfb, 0x19, 0xfb, 0x1f, 0xfb, 0x3a, 0xfb,\n                                                          0x5e, 0xfb, 0xa2, 0x1e, 0xe, 0xa0, 0x76, 0xf9,\n                                                          0x38, 0x77, 0x1, 0xbc, 0xf7, 0xf8, 0x3, 0xbc,\n                                                          0x16, 0xf7, 0xab, 0x9a, 0x6, 0x5e, 0x6c, 0x96,\n                                                          0xaf, 0x8f, 0x8b, 0x8f, 0x8c, 0x90, 0x1f, 0xf7,\n                                                          0x2a, 0xf8, 0xc9, 0x5, 0x8e, 0x95, 0x8e, 0x98,\n                                                          0x92, 0x1a, 0x8f, 0x8a, 0x8d, 0x88, 0x83, 0xfb,\n                                                          0x1f, 0x6d, 0x83, 0x5c, 0x1e, 0x7c, 0x7, 0x8c,\n                                                          0xa1, 0x9e, 0x8c, 0x99, 0x1b, 0xa7, 0x97, 0x80,\n                                                          0x76, 0x83, 0x87, 0x7d, 0x88, 0x80, 0x1f, 0xfb,\n                                                          0x1a, 0xfc, 0x76, 0x5, 0x5e, 0x7e, 0x52, 0x79,\n                                                          0x5d, 0x1b, 0xe, 0x8b, 0xd7, 0xf8, 0xa3, 0xd4,\n                                                          0x1, 0xf8, 0x2, 0xe1, 0x3, 0x97, 0x16, 0xf7,\n                                                          0xf7, 0x6, 0xbd, 0xf7, 0x18, 0x7a, 0x92, 0x5,\n                                                          0x67, 0x7a, 0x71, 0x70, 0x49, 0x1b, 0xfb, 0x48,\n                                                          0x90, 0x6, 0xf7, 0x54, 0xf7, 0x54, 0x5, 0xf7,\n                                                          0x10, 0xf7, 0x10, 0xa4, 0xb8, 0xce, 0x1a, 0xd6,\n                                                          0x53, 0xe7, 0x21, 0x72, 0xfb, 0x17, 0x87, 0xfb,\n                                                          0x30, 0x55, 0x1e, 0xa0, 0x84, 0x5, 0xa4, 0x99,\n                                                          0xb1, 0xd0, 0xe5, 0x1b, 0xd8, 0xb9, 0x4f, 0x4d,\n                                                          0x6a, 0x87, 0x51, 0xfb, 0x20, 0xfb, 0x29, 0x1f,\n                                                          0xfb, 0x66, 0xfb, 0x6d, 0x5, 0xe, 0x84, 0xb1,\n                                                          0x65, 0xf7, 0x0, 0xf7, 0x98, 0x9b, 0xf7, 0x95,\n                                                          0xb5, 0x12, 0xf7, 0xee, 0xdb, 0x5b, 0xe2, 0x13,\n                                                          0x98, 0xf7, 0x20, 0xf7, 0xfd, 0x15, 0xec, 0x92,\n                                                          0xe3, 0x66, 0xfb, 0x20, 0x1a, 0xfb, 0x12, 0x2d,\n                                                          0x69, 0x69, 0x6f, 0x76, 0x9c, 0x9c, 0x76, 0x1e,\n                                                          0x13, 0x74, 0x9d, 0x76, 0x76, 0x9d, 0x74, 0x1b,\n                                                          0x66, 0x81, 0x6f, 0x76, 0x5e, 0xc2, 0x7d, 0xc6,\n                                                          0x1f, 0x13, 0x34, 0xf7, 0x4d, 0xe6, 0xf7, 0x22,\n                                                          0xf7, 0x3, 0xf7, 0x2, 0x46, 0xa9, 0x71, 0x97,\n                                                          0x1f, 0x8e, 0x7, 0xf4, 0xb2, 0xbd, 0xae, 0xd7,\n                                                          0x1a, 0xde, 0x43, 0xb5, 0x41, 0x52, 0x40, 0x5f,\n                                                          0x4f, 0x72, 0x1e, 0x9b, 0x86, 0x5, 0x9f, 0x9a,\n                                                          0xae, 0xba, 0xca, 0x1b, 0xb1, 0xbc, 0x73, 0x48,\n                                                          0xfb, 0x0, 0xfb, 0x1f, 0x5f, 0x27, 0x7d, 0x1f,\n                                                          0xe, 0xa0, 0x76, 0xf7, 0x3c, 0xca, 0xf8, 0x51,\n                                                          0x77, 0x12, 0x8c, 0xf8, 0x72, 0x17, 0xcc, 0xf7,\n                                                          0x7b, 0x15, 0x8f, 0x7, 0xf7, 0xc4, 0xf7, 0xdc,\n                                                          0x5, 0x8f, 0x6, 0x13, 0xf0, 0x28, 0xfb, 0xe0,\n                                                          0x5, 0xfb, 0xa5, 0x4c, 0x15, 0xf7, 0x97, 0x6,\n                                                          0x5d, 0xfb, 0x3c, 0x5, 0xda, 0x6, 0xb6, 0xf7,\n                                                          0x3a, 0x5, 0xef, 0x6, 0x99, 0xcc, 0x5, 0x2c,\n                                                          0x6, 0x13, 0x30, 0xf7, 0x10, 0xf8, 0x51, 0x5,\n                                                          0x62, 0x6, 0xfc, 0x35, 0xfc, 0x4d, 0x5, 0xe,\n                                                          0x84, 0xb5, 0xf8, 0xc4, 0xd2, 0x1, 0xf7, 0xf2,\n                                                          0xd0, 0x3, 0xf7, 0x17, 0xf8, 0x3b, 0x15, 0xf7,\n                                                          0x8, 0x72, 0xf2, 0x7f, 0xfb, 0x2d, 0x1a, 0x34,\n                                                          0x42, 0xfb, 0x3, 0x29, 0x6f, 0x77, 0x9a, 0x99,\n                                                          0x78, 0x1e, 0x98, 0x79, 0x7a, 0x98, 0x75, 0x1b,\n                                                          0x78, 0x76, 0x7f, 0x6e, 0x6f, 0xa9, 0x6f, 0xd3,\n                                                          0xf7, 0x57, 0xf6, 0xf7, 0x2e, 0xf7, 0x14, 0xf7,\n                                                          0x1a, 0x31, 0xc9, 0xfb, 0x16, 0xa5, 0x1f, 0xb2,\n                                                          0xed, 0x5, 0xf7, 0x7a, 0x6, 0xa2, 0xd2, 0x5,\n                                                          0xfb, 0x94, 0x6, 0x23, 0xfb, 0x78, 0x5, 0xe,\n                                                          0x84, 0xa5, 0xf8, 0x11, 0xaf, 0xf7, 0x8e, 0x77,\n                                                          0x1, 0xac, 0xd7, 0xf7, 0x9b, 0xe4, 0x3, 0xf7,\n                                                          0x5b, 0xf8, 0x4a, 0x15, 0xbd, 0xa3, 0xf7, 0xe,\n                                                          0xf7, 0x4a, 0xf7, 0x44, 0x1b, 0x8a, 0x9b, 0x5,\n                                                          0xfb, 0xc5, 0xfb, 0x4d, 0xfb, 0xa2, 0xfb, 0x62,\n                                                          0xfb, 0x38, 0xee, 0x56, 0xdc, 0xf7, 0x3e, 0xdc,\n                                                          0xf7, 0x3d, 0xf0, 0xf7, 0x22, 0x26, 0xbf, 0x47,\n                                                          0x6c, 0x6d, 0x83, 0x7e, 0x6f, 0x1f, 0x2a, 0xfb,\n                                                          0xab, 0x15, 0x9b, 0x95, 0xf7, 0x8c, 0xf7, 0x1e,\n                                                          0xd7, 0xb5, 0x51, 0x39, 0x31, 0x55, 0xfb, 0x40,\n                                                          0xfb, 0x6, 0x29, 0x8b, 0xf7, 0x4, 0xa5, 0x1e,\n                                                          0xe, 0x98, 0x76, 0xf8, 0xed, 0xd4, 0x1, 0xd6,\n                                                          0xf8, 0x5c, 0x3, 0xda, 0x83, 0x15, 0xd1, 0x6,\n                                                          0xf8, 0x18, 0xf9, 0x2c, 0x85, 0x95, 0x5, 0xfc,\n                                                          0xb, 0x6, 0x3a, 0xfb, 0x1c, 0x99, 0x82, 0x5,\n                                                          0xb3, 0xad, 0xb0, 0xab, 0xd3, 0x1b, 0xf7, 0x68,\n                                                          0x6, 0x8d, 0x88, 0x5, 0xe, 0x84, 0xa1, 0xf9,\n                                                          0x12, 0xa2, 0x12, 0xa9, 0xcf, 0xb3, 0xd9, 0xf7,\n                                                          0x2d, 0xd6, 0x78, 0xcf, 0x13, 0xf8, 0xf7, 0x75,\n                                                          0xf7, 0xfc, 0x15, 0x73, 0x84, 0xfb, 0x3f, 0x58,\n                                                          0xfb, 0x25, 0x1a, 0x6d, 0xa0, 0xfb, 0x1a, 0xf7,\n                                                          0x47, 0xf7, 0x1a, 0xdb, 0xe1, 0xe1, 0xd9, 0x63,\n                                                          0xcb, 0x40, 0xd6, 0x1e, 0x13, 0xf4, 0xc2, 0x9d,\n                                                          0xf7, 0x1, 0xb1, 0xec, 0x1a, 0xf7, 0x2, 0xfb,\n                                                          0x0, 0xaa, 0x49, 0x2d, 0x34, 0x5a, 0x24, 0x57,\n                                                          0xa5, 0x5c, 0xc8, 0x4a, 0x1e, 0xa1, 0x7b, 0x15,\n                                                          0x13, 0xf8, 0xec, 0x27, 0xa4, 0x6e, 0x4a, 0x1a,\n                                                          0x2b, 0x3d, 0x64, 0x55, 0x35, 0x56, 0xc7, 0xda,\n                                                          0xf7, 0x13, 0xf7, 0xf, 0xc2, 0xa5, 0x93, 0x1e,\n                                                          0xcb, 0xc2, 0x15, 0x2c, 0xe1, 0x8b, 0xaa, 0xa5,\n                                                          0x1a, 0xce, 0xb1, 0xb7, 0xcb, 0x1e, 0x13, 0xf4,\n                                                          0xdc, 0xa5, 0x48, 0x5b, 0x38, 0x50, 0x6d, 0x54,\n                                                          0x71, 0x1f, 0xe, 0x8f, 0x76, 0xf7, 0x93, 0xb9,\n                                                          0xf8, 0x2, 0xa5, 0x1, 0xd0, 0xe3, 0xf7, 0x98,\n                                                          0xd6, 0x3, 0xa2, 0x8c, 0x15, 0x79, 0x7, 0xf7,\n                                                          0x2e, 0xf7, 0xcf, 0xf7, 0x42, 0xf7, 0xbd, 0xf7,\n                                                          0x28, 0x3b, 0xd5, 0x24, 0xfb, 0x9, 0xfb, 0xf,\n                                                          0xfb, 0x10, 0xfb, 0x1d, 0xfb, 0xb, 0xcd, 0x3e,\n                                                          0xe0, 0xb7, 0xb7, 0x9e, 0xa5, 0xb3, 0x1f, 0x8f,\n                                                          0x89, 0x5, 0x51, 0x80, 0xfb, 0x54, 0xfb, 0x5f,\n                                                          0xfb, 0x12, 0x1b, 0xf7, 0x1a, 0xf8, 0x2f, 0x15,\n                                                          0xe8, 0xbb, 0xf7, 0x25, 0xf7, 0x5, 0xee, 0x8b,\n                                                          0xfb, 0x0, 0x64, 0x70, 0x7b, 0xfb, 0x4, 0x72,\n                                                          0x64, 0x1e, 0x60, 0x6f, 0x53, 0x7a, 0x6c, 0x1b,\n                                                          0x27, 0x87, 0xf7, 0x7, 0xab, 0x1f, 0xe, 0x73,\n                                                          0x80, 0xf7, 0x2, 0xf7, 0x7c, 0xf7, 0x2, 0x12,\n                                                          0xbd, 0xf7, 0x2, 0x82, 0xf7, 0x2, 0x13, 0xe0,\n                                                          0xbd, 0xb7, 0x8a, 0xa, 0x13, 0xd0, 0xf0, 0xf7,\n                                                          0xea, 0x8a, 0xa, 0xe, 0x73, 0xf7, 0xdd, 0xf7,\n                                                          0x4, 0x12, 0xf7, 0x29, 0xf7, 0x4, 0xfb, 0x3,\n                                                          0xf7, 0x3, 0x13, 0xa0, 0xa6, 0xfb, 0x4, 0x15,\n                                                          0x94, 0x7a, 0x5, 0x13, 0xc0, 0xc8, 0xa, 0x76,\n                                                          0x6c, 0x7c, 0x61, 0x73, 0x99, 0x83, 0x98, 0x83,\n                                                          0x1e, 0x95, 0x84, 0x95, 0x84, 0x7c, 0x1a, 0x66,\n                                                          0x54, 0x66, 0x77, 0x7e, 0x1e, 0xf7, 0xe, 0xf8,\n                                                          0x85, 0x15, 0x6c, 0xa4, 0x72, 0xaa, 0xaa, 0xa4,\n                                                          0xa4, 0xaa, 0xaa, 0x72, 0xa4, 0x6c, 0x6c, 0x72,\n                                                          0x72, 0x6c, 0x1e, 0xe, 0xf7, 0xd2, 0x98, 0x76,\n                                                          0xb9, 0x76, 0xf8, 0x85, 0x77, 0x1, 0xf7, 0x33,\n                                                          0xf8, 0x59, 0x3, 0xdf, 0xf7, 0x88, 0x15, 0xf8,\n                                                          0x90, 0xfb, 0x90, 0x5, 0xb5, 0x7, 0xfc, 0x4e,\n                                                          0xf7, 0x6f, 0xf8, 0x4e, 0xf7, 0x6f, 0x5, 0xb5,\n                                                          0x7, 0xfc, 0x90, 0xfb, 0x90, 0x5, 0xe, 0xf7,\n                                                          0xd2, 0xf7, 0xc, 0xce, 0xf7, 0x18, 0xce, 0x63,\n                                                          0xb3, 0x12, 0x13, 0xa0, 0xe1, 0xf7, 0xee, 0x15,\n                                                          0xf8, 0x8c, 0xb3, 0xfc, 0x8c, 0x6, 0xfb, 0x9e,\n                                                          0x4, 0xf8, 0x8c, 0x6, 0x13, 0xc0, 0xb0, 0xfc,\n                                                          0x8c, 0x7, 0xe, 0xf7, 0xd2, 0x98, 0x76, 0xf8,\n                                                          0x9e, 0x77, 0x1, 0xdf, 0x83, 0x15, 0xb5, 0x7,\n                                                          0xf8, 0x4e, 0xf7, 0x6f, 0xfc, 0x4e, 0xf7, 0x6f,\n                                                          0x5, 0xb5, 0x7, 0xf8, 0x90, 0xfb, 0x90, 0x5,\n                                                          0x79, 0x7, 0xe, 0x7f, 0xf3, 0xf8, 0xba, 0xa1,\n                                                          0x12, 0xf7, 0x18, 0xf3, 0x57, 0xcb, 0xf7, 0x2a,\n                                                          0xd5, 0x13, 0xd8, 0xf7, 0x5b, 0xf7, 0x44, 0x15,\n                                                          0x9c, 0x89, 0x5, 0xd3, 0xdb, 0xd6, 0xb5, 0xac,\n                                                          0x1e, 0xbf, 0xb4, 0xdd, 0xc1, 0xe3, 0x1a, 0xd5,\n                                                          0x54, 0xc0, 0x2b, 0x44, 0x49, 0x64, 0x44, 0x6e,\n                                                          0xa1, 0x77, 0xa3, 0x95, 0xac, 0x94, 0xa9, 0x96,\n                                                          0x85, 0x92, 0x85, 0x92, 0x1e, 0x85, 0x92, 0x84,\n                                                          0x92, 0x97, 0x1a, 0xba, 0xcc, 0x8b, 0x90, 0xd4,\n                                                          0x92, 0x50, 0x72, 0x44, 0x62, 0x5e, 0x5b, 0x58,\n                                                          0x1e, 0x57, 0x55, 0x51, 0x34, 0x41, 0x1a, 0x13,\n                                                          0xe8, 0x48, 0xfb, 0x1c, 0x15, 0x13, 0xd8, 0x6e,\n                                                          0xa2, 0x74, 0xa8, 0x1e, 0x13, 0xe8, 0xa8, 0xa2,\n                                                          0xa2, 0xa8, 0x1f, 0x13, 0xd8, 0xa8, 0x74, 0xa2,\n                                                          0x6e, 0x1e, 0x13, 0xe8, 0x6e, 0x74, 0x74, 0x6e,\n                                                          0x1f, 0xe, 0xf8, 0xc7, 0x79, 0xb2, 0xed, 0xac,\n                                                          0x7d, 0xb6, 0xf7, 0xb3, 0xb7, 0xf7, 0xf, 0xaa,\n                                                          0x12, 0xf7, 0xa, 0xde, 0xf7, 0xc, 0xd2, 0xf8,\n                                                          0xa, 0xb3, 0x13, 0xbf, 0xf8, 0x1c, 0xf7, 0x9c,\n                                                          0x15, 0xf7, 0xc, 0xe3, 0xd3, 0xbb, 0x1e, 0x13,\n                                                          0xaf, 0xa8, 0x98, 0x75, 0x61, 0x1f, 0x2a, 0x8c,\n                                                          0x40, 0xfb, 0x6, 0x61, 0x1b, 0x68, 0x70, 0xa3,\n                                                          0xc6, 0x1f, 0xf7, 0x21, 0x53, 0x15, 0x7f, 0x8a,\n                                                          0xa2, 0x51, 0xcd, 0x1b, 0xf7, 0xa, 0xce, 0xf7,\n                                                          0x1b, 0xf0, 0xf7, 0x3b, 0xfb, 0x23, 0xf7, 0x11,\n                                                          0xfb, 0x4b, 0xfb, 0x58, 0xfb, 0x3a, 0xfb, 0x24,\n                                                          0xfb, 0x69, 0xfb, 0x19, 0xf7, 0x5, 0xfb, 0x56,\n                                                          0xf7, 0x97, 0xd8, 0xd9, 0xab, 0xa9, 0xca, 0x1f,\n                                                          0x7f, 0xa8, 0x5, 0x71, 0x52, 0x4d, 0x71, 0x33,\n                                                          0x1b, 0xfb, 0x41, 0xfb, 0x7, 0xf7, 0x1c, 0xf7,\n                                                          0x21, 0xf7, 0x71, 0xf7, 0x13, 0xf7, 0x8, 0xf7,\n                                                          0x2c, 0xf7, 0x4a, 0xf3, 0xfb, 0x29, 0xfb, 0x5,\n                                                          0x1f, 0x13, 0xdf, 0x35, 0x5b, 0xfb, 0x8, 0x39,\n                                                          0x5f, 0x90, 0xbb, 0x9a, 0x8f, 0x1e, 0xcc, 0xf7,\n                                                          0x9a, 0x5, 0x46, 0x6, 0x81, 0x5c, 0x5, 0xa2,\n                                                          0x7e, 0x80, 0xa7, 0x5c, 0x1b, 0xfb, 0x19, 0x4d,\n                                                          0xfb, 0x3c, 0x45, 0x1f, 0x13, 0x0, 0xfb, 0x5,\n                                                          0xcf, 0x81, 0xa6, 0x1e, 0xc5, 0x8a, 0xb8, 0xc0,\n                                                          0x97, 0x9c, 0x8, 0xe, 0x5a, 0xa, 0x1, 0x58,\n                                                          0xf7, 0x4f, 0xf7, 0x98, 0xf7, 0x3c, 0x3, 0x58,\n                                                          0x16, 0x9b, 0xa, 0x5d, 0x7e, 0x9e, 0xa5, 0xa8,\n                                                          0x91, 0x91, 0xd2, 0xf7, 0x16, 0x1f, 0xf7, 0x70,\n                                                          0x6, 0xa1, 0xfb, 0x12, 0x8b, 0x74, 0x8a, 0x1a,\n                                                          0x63, 0x71, 0x77, 0x57, 0x1e, 0x7b, 0xf7, 0x8a,\n                                                          0x9b, 0x7, 0x51, 0x87, 0xa6, 0xc8, 0x80, 0x1f,\n                                                          0x2a, 0xf8, 0xc8, 0x5, 0x71, 0x6, 0xfb, 0xd9,\n                                                          0xfc, 0xb7, 0x5, 0x59, 0x6e, 0x70, 0x54, 0x65,\n                                                          0x1b, 0x45, 0xa, 0xe, 0xf7, 0x92, 0x86, 0xa9,\n                                                          0x72, 0xa9, 0xf7, 0xc1, 0xab, 0xf7, 0x98, 0xa9,\n                                                          0x12, 0xf7, 0x51, 0xf0, 0xf7, 0x21, 0xf7, 0x0,\n                                                          0x57, 0xf0, 0x13, 0x7c, 0x83, 0x16, 0xf7, 0xae,\n                                                          0x6, 0xf7, 0x14, 0xf7, 0x1d, 0xc9, 0xf7, 0x1d,\n                                                          0xed, 0x45, 0xa9, 0x56, 0xa2, 0x1f, 0x8d, 0x7,\n                                                          0x13, 0xba, 0xe9, 0x9e, 0xd9, 0xb6, 0xe5, 0x1a,\n                                                          0xf7, 0x7, 0x2b, 0xad, 0x23, 0x1e, 0xfb, 0x96,\n                                                          0x7b, 0x6, 0xdf, 0x81, 0x51, 0x52, 0x7c, 0x1f,\n                                                          0xfb, 0x5, 0xfc, 0x47, 0x7f, 0x5d, 0x67, 0x73,\n                                                          0x67, 0x8a, 0x19, 0x13, 0x7c, 0xf7, 0x4a, 0xd0,\n                                                          0x15, 0x9e, 0xbc, 0xf7, 0x37, 0x9a, 0xcb, 0x1e,\n                                                          0xf7, 0x3a, 0xa6, 0x5e, 0x3d, 0x28, 0x52, 0x3c,\n                                                          0xfb, 0x21, 0x6e, 0x6d, 0x9c, 0xb1, 0x1f, 0xd5,\n                                                          0xf7, 0xaa, 0x15, 0xb5, 0xf7, 0x33, 0x5, 0xeb,\n                                                          0xa2, 0x83, 0x90, 0xd1, 0x1b, 0x13, 0xba, 0xd6,\n                                                          0xb0, 0x67, 0x47, 0xfb, 0x20, 0xfb, 0xd, 0x7b,\n                                                          0xfb, 0xa, 0x1f, 0xe, 0xf7, 0xca, 0x79, 0xb8,\n                                                          0xd4, 0xa, 0x13, 0xb0, 0xf9, 0x20, 0xf8, 0x65,\n                                                          0x15, 0xb8, 0xa, 0x7e, 0x74, 0x93, 0x92, 0x6d,\n                                                          0x1f, 0x13, 0xd0, 0x90, 0x75, 0x70, 0x8f, 0x6c,\n                                                          0xd5, 0xa, 0xfb, 0x5c, 0xf7, 0x26, 0x45, 0xf7,\n                                                          0x8, 0xf7, 0x26, 0xe4, 0xf4, 0xb7, 0xb0, 0x6f,\n                                                          0xa, 0xe, 0xf8, 0x1, 0x8b, 0xa9, 0xf8, 0xe5,\n                                                          0xa9, 0x12, 0xf8, 0xe1, 0xf7, 0x3, 0x17, 0xb1,\n                                                          0xa, 0x1f, 0x13, 0xe0, 0xf4, 0x4d, 0xf7, 0x35,\n                                                          0xfb, 0x7a, 0x1e, 0xfb, 0xaa, 0x7b, 0x6, 0xe3,\n                                                          0x7e, 0x45, 0x59, 0x7d, 0x1f, 0xfb, 0x7, 0xfc,\n                                                          0x35, 0x5, 0x4d, 0x7a, 0x70, 0x75, 0x63, 0x1b,\n                                                          0xf7, 0x5f, 0xf7, 0x30, 0x15, 0xf7, 0x4, 0xf8,\n                                                          0x30, 0x5, 0x99, 0x8f, 0x95, 0xa4, 0xc4, 0xb2,\n                                                          0xa, 0x59, 0x79, 0x9d, 0xa5, 0xa6, 0x97, 0xaf,\n                                                          0x95, 0xae, 0x1f, 0xe, 0xf7, 0x92, 0x8b, 0xac,\n                                                          0xf7, 0xb9, 0xac, 0x6c, 0xe9, 0xa, 0x12, 0x8a,\n                                                          0xf9, 0xf, 0x13, 0xd8, 0x8b, 0xa, 0x74, 0x62,\n                                                          0x92, 0xb4, 0x90, 0x8b, 0x96, 0x8d, 0x92, 0x1f,\n                                                          0x13, 0xb8, 0x8e, 0x96, 0x85, 0x79, 0xcb, 0xf7,\n                                                          0x7b, 0x8, 0xf7, 0x37, 0x8b, 0x7d, 0x63, 0x40,\n                                                          0xa, 0x85, 0x80, 0xfb, 0x35, 0x1b, 0xb7, 0xf7,\n                                                          0x37, 0x5, 0xce, 0x9d, 0x81, 0xa8, 0xe9, 0x1b,\n                                                          0xf7, 0x3e, 0x9a, 0x6f, 0x67, 0x7c, 0x8b, 0x79,\n                                                          0x89, 0x76, 0x63, 0xa, 0xc2, 0x9c, 0x70, 0x75,\n                                                          0x77, 0x87, 0x74, 0x84, 0x74, 0x1f, 0xfb, 0x7,\n                                                          0xfc, 0x3a, 0x5, 0x47, 0x79, 0x64, 0x7b, 0x70,\n                                                          0x1b, 0xe, 0x7d, 0xa, 0xf7, 0xdc, 0xe9, 0xa,\n                                                          0x1, 0xf7, 0x64, 0xee, 0x3, 0x93, 0x16, 0xf7,\n                                                          0x90, 0x9b, 0x6, 0x49, 0x8a, 0x80, 0xb6, 0x9a,\n                                                          0xc4, 0xc4, 0xf7, 0x69, 0x18, 0xe3, 0xd1, 0x95,\n                                                          0x4f, 0x76, 0x86, 0x74, 0x88, 0x7d, 0x1f, 0x9c,\n                                                          0x86, 0xd7, 0xf7, 0x7e, 0x79, 0x90, 0x5, 0x2c,\n                                                          0x5d, 0x7a, 0x8d, 0xfb, 0x2d, 0x1b, 0xb6, 0xf7,\n                                                          0x35, 0x5, 0xe4, 0xa3, 0x8b, 0x94, 0xdb, 0x1b,\n                                                          0xf7, 0x28, 0xaf, 0x7e, 0x4c, 0x7d, 0x89, 0x7d,\n                                                          0x8a, 0x7d, 0x1f, 0xa0, 0x89, 0xab, 0xf7, 0x2d,\n                                                          0x5, 0xfc, 0x86, 0x7b, 0x6, 0xc2, 0x9b, 0x75,\n                                                          0x6d, 0x78, 0x87, 0x74, 0x85, 0x76, 0x1f, 0xfb,\n                                                          0x1, 0xfc, 0x2a, 0x75, 0x3a, 0x87, 0x84, 0x4a,\n                                                          0x7f, 0x19, 0xe, 0xb6, 0xa, 0xb0, 0xf8, 0xf9,\n                                                          0xad, 0x1, 0xbf, 0xf7, 0x2, 0x3, 0xf8, 0x5c,\n                                                          0xf7, 0xc3, 0x15, 0xb9, 0xa0, 0x71, 0x69, 0x85,\n                                                          0x8b, 0x84, 0x8a, 0x84, 0x1f, 0x88, 0x7b, 0x76,\n                                                          0xfb, 0x17, 0x6e, 0x74, 0x8, 0x74, 0x6e, 0x72,\n                                                          0x80, 0x58, 0x1b, 0xfb, 0x3e, 0x6b, 0xf7, 0x10,\n                                                          0xd9, 0xf7, 0x38, 0xed, 0xf7, 0x8b, 0xf7, 0x5d,\n                                                          0xd2, 0xf7, 0x1, 0x6a, 0xfb, 0x17, 0x1f, 0x9d,\n                                                          0x88, 0xbc, 0xf7, 0x59, 0x7c, 0x8f, 0x5, 0x7d,\n                                                          0x81, 0x7d, 0x77, 0x64, 0x1b, 0x7c, 0x70, 0x96,\n                                                          0x95, 0x67, 0x1f, 0x92, 0x70, 0x6b, 0x91, 0x67,\n                                                          0x1b, 0xfb, 0x6a, 0xfb, 0x53, 0xfb, 0x59, 0xfb,\n                                                          0x79, 0x60, 0xa8, 0xfb, 0x6b, 0xf7, 0x9c, 0xd4,\n                                                          0xe9, 0xa1, 0xb3, 0xcb, 0x1f, 0xb8, 0xf7, 0x45,\n                                                          0x5, 0xcb, 0x9c, 0xaa, 0x9d, 0xc0, 0x1b, 0x9b,\n                                                          0xfb, 0x9e, 0x7, 0xe, 0xf8, 0x1, 0xa0, 0x76,\n                                                          0xf7, 0xb9, 0xb5, 0xf7, 0xd2, 0x77, 0x12, 0x83,\n                                                          0xf7, 0x8a, 0xfb, 0x8a, 0xf9, 0x9b, 0xfb, 0x8b,\n                                                          0xf7, 0x8b, 0x13, 0xf4, 0x83, 0x16, 0xf7, 0x8a,\n                                                          0x9b, 0x6, 0x68, 0x6d, 0x9a, 0xb1, 0x92, 0x8c,\n                                                          0x92, 0x8d, 0x94, 0x1f, 0x13, 0xe8, 0xc7, 0xf7,\n                                                          0x7e, 0x5, 0xf7, 0xb1, 0x6, 0x50, 0xfb, 0x76,\n                                                          0x5, 0x4b, 0x79, 0x55, 0x77, 0x68, 0x1b, 0xe6,\n                                                          0xa, 0x64, 0x6b, 0x9b, 0xb4, 0x92, 0x8c, 0x93,\n                                                          0x8d, 0x93, 0x1f, 0xf7, 0x3, 0xf8, 0x3c, 0x5,\n                                                          0xf7, 0x7, 0xa9, 0xaa, 0x8d, 0xae, 0x1b, 0x93,\n                                                          0xa, 0xbb, 0x9b, 0x73, 0x6c, 0x78, 0x87, 0x76,\n                                                          0x85, 0x77, 0x1f, 0x62, 0xfb, 0x2e, 0x5, 0xfb,\n                                                          0xb1, 0x6, 0xb5, 0xf7, 0x2e, 0x5, 0xf7, 0x5,\n                                                          0xaa, 0xbf, 0x8d, 0xa9, 0x1b, 0xc4, 0xa, 0xc1,\n                                                          0x9d, 0x74, 0x6c, 0x78, 0x86, 0x76, 0x85, 0x76,\n                                                          0x1f, 0xfb, 0x4, 0xfc, 0x3a, 0x5, 0x4d, 0x7a,\n                                                          0x67, 0x75, 0x69, 0x1b, 0xe, 0x73, 0xcb, 0xa,\n                                                          0x83, 0xf8, 0x1c, 0x3, 0x83, 0x16, 0xf7, 0x88,\n                                                          0x9b, 0x6, 0x59, 0x7d, 0xa4, 0xaa, 0x9e, 0x90,\n                                                          0xa0, 0x90, 0x9d, 0x1f, 0xf7, 0x1, 0xf8, 0x1c,\n                                                          0x5, 0xec, 0xa6, 0xa2, 0x9d, 0xb6, 0x1b, 0x93,\n                                                          0xa, 0xb9, 0x9d, 0x76, 0x72, 0x76, 0x88, 0x72,\n                                                          0x85, 0x74, 0x1f, 0x20, 0xfc, 0x1c, 0x5, 0x28,\n                                                          0x70, 0x78, 0x7c, 0x5c, 0x1b, 0xe, 0xe2, 0x79,\n                                                          0xaa, 0x6c, 0xf7, 0x22, 0xf8, 0xa5, 0x77, 0x12,\n                                                          0x85, 0xe8, 0x13, 0xb0, 0xf7, 0x81, 0xf9, 0x11,\n                                                          0x15, 0xc3, 0x9d, 0x76, 0x6d, 0x78, 0x86, 0x74,\n                                                          0x85, 0x75, 0x1f, 0xfb, 0x15, 0xfc, 0x5b, 0x5,\n                                                          0x77, 0x85, 0x82, 0x69, 0x69, 0x1b, 0x6a, 0x88,\n                                                          0xa1, 0xa2, 0x8c, 0x1f, 0x91, 0x8c, 0x92, 0x91,\n                                                          0x1a, 0x13, 0x70, 0xa4, 0x75, 0xa1, 0x71, 0x6e,\n                                                          0x7a, 0x74, 0x6c, 0x4e, 0xc7, 0x70, 0xc0, 0xf7,\n                                                          0x17, 0xb2, 0xf3, 0xf5, 0xa8, 0x1e, 0xea, 0xf7,\n                                                          0xde, 0x5, 0xd9, 0xa2, 0x99, 0xb0, 0xc0, 0x1b,\n                                                          0x9b, 0xfb, 0x92, 0x7, 0xe, 0xf7, 0xca, 0xa0,\n                                                          0x76, 0xf7, 0xe6, 0xb0, 0xf7, 0xaa, 0x77, 0x1,\n                                                          0x92, 0xf9, 0x5f, 0x3, 0x92, 0x16, 0xf7, 0x8c,\n                                                          0x9b, 0x6, 0x52, 0x7e, 0x9d, 0xaa, 0x9a, 0x91,\n                                                          0x9e, 0x91, 0xa0, 0x1f, 0xc7, 0xf7, 0x6f, 0x93,\n                                                          0x8a, 0xf7, 0x7, 0xfb, 0x5a, 0x5, 0x9a, 0x70,\n                                                          0x9f, 0x6c, 0x73, 0x1a, 0x73, 0x7b, 0x79, 0x53,\n                                                          0x1e, 0x7b, 0xf7, 0xa7, 0x9b, 0x7, 0x5d, 0x74,\n                                                          0x92, 0xbc, 0x6f, 0x1f, 0xfb, 0x42, 0xf7, 0xc3,\n                                                          0xf7, 0xc0, 0xf7, 0x76, 0x5, 0x90, 0x92, 0xb2,\n                                                          0xaa, 0xa8, 0x1b, 0x9b, 0xfb, 0x72, 0x7b, 0x7,\n                                                          0xbc, 0x97, 0x83, 0x7a, 0x72, 0x3f, 0x4b, 0x47,\n                                                          0x5b, 0x1f, 0xfb, 0x24, 0x26, 0x85, 0x8c, 0xb7,\n                                                          0xf7, 0x31, 0x5, 0xe0, 0xa3, 0xa5, 0x9f, 0xc5,\n                                                          0x1b, 0xc4, 0xa, 0xc3, 0xa0, 0x7b, 0x70, 0x7a,\n                                                          0x87, 0x76, 0x84, 0x73, 0x1f, 0xfb, 0x7, 0xfc,\n                                                          0x2f, 0x5, 0x38, 0x74, 0x81, 0x75, 0x52, 0x1b,\n                                                          0xe, 0x6e, 0xa, 0x58, 0x59, 0x8b, 0xb2, 0x8f,\n                                                          0x8b, 0x90, 0x8d, 0x91, 0x1f, 0xf7, 0xd, 0xf8,\n                                                          0x4f, 0x5, 0xcd, 0x9d, 0xa5, 0xb1, 0xcd, 0x1b,\n                                                          0xc4, 0xa, 0xc7, 0x9c, 0x79, 0x6e, 0x7b, 0x86,\n                                                          0x77, 0x85, 0x75, 0x1f, 0xfb, 0xf, 0xfc, 0x4e,\n                                                          0x5, 0x4d, 0x7a, 0x6a, 0x7f, 0x6c, 0x1b, 0xe,\n                                                          0xf8, 0x70, 0xcb, 0xa, 0x79, 0xfa, 0xf, 0xfd,\n                                                          0x61, 0xf7, 0x49, 0xf7, 0x20, 0xf7, 0xa5, 0x3,\n                                                          0x79, 0xe4, 0xa, 0x55, 0x7d, 0xa4, 0xab, 0xa1,\n                                                          0x93, 0xa6, 0x92, 0xa3, 0x1f, 0xf5, 0xf8, 0x1a,\n                                                          0x5, 0x8f, 0x6, 0xc7, 0xfc, 0xac, 0x5, 0x9c,\n                                                          0x6, 0xf8, 0x8, 0xf8, 0xbd, 0x5, 0x8e, 0x6,\n                                                          0xfb, 0xc, 0xfc, 0x45, 0x5, 0x57, 0x7d, 0x86,\n                                                          0x57, 0x32, 0x1b, 0xe6, 0xa, 0x4d, 0x7a, 0x9d,\n                                                          0xa6, 0x9c, 0x92, 0x9f, 0x91, 0xa1, 0x1f, 0xf7,\n                                                          0xf, 0xf8, 0x4f, 0x5, 0xca, 0x9c, 0xa8, 0x96,\n                                                          0xaf, 0x1b, 0x9b, 0xfb, 0x3b, 0x7, 0xfb, 0xe1,\n                                                          0xfc, 0x7d, 0x5, 0x88, 0x6, 0x54, 0xf8, 0x7d,\n                                                          0x5, 0xfb, 0x49, 0x7b, 0x6, 0xc2, 0x9e, 0x79,\n                                                          0x76, 0x82, 0x80, 0x6c, 0x80, 0x63, 0x1f, 0x21,\n                                                          0xfc, 0x8, 0x5, 0xfb, 0x8, 0x6a, 0x6b, 0x7d,\n                                                          0x6a, 0x1b, 0xe, 0xf7, 0xca, 0x91, 0x76, 0xaf,\n                                                          0x76, 0xf7, 0x32, 0x77, 0xf8, 0x97, 0x77, 0x12,\n                                                          0xf7, 0x5a, 0xaa, 0x13, 0x78, 0x77, 0xe4, 0xa,\n                                                          0x54, 0x7b, 0xa1, 0xaa, 0xa9, 0x9a, 0xb0, 0x93,\n                                                          0xaa, 0x1f, 0xee, 0xf7, 0xfe, 0x5, 0x8f, 0x6,\n                                                          0x13, 0xb8, 0xf7, 0x78, 0xfc, 0xb4, 0x5, 0x9d,\n                                                          0x6, 0xf7, 0x24, 0xf8, 0x8b, 0x5, 0xf7, 0xd,\n                                                          0xae, 0xa0, 0xa7, 0xbb, 0x1b, 0xeb, 0xa, 0x7b,\n                                                          0x7, 0xc3, 0x9a, 0x77, 0x6d, 0x79, 0x7c, 0x5e,\n                                                          0x81, 0x67, 0x1f, 0x33, 0xfb, 0xde, 0x5, 0x88,\n                                                          0x6, 0xfb, 0x62, 0xf8, 0x83, 0x5, 0xfb, 0x35,\n                                                          0x7b, 0x6, 0xb4, 0xa7, 0x78, 0x66, 0x9c, 0x1f,\n                                                          0xfb, 0xb, 0xfc, 0x35, 0x5, 0xfb, 0x16, 0x66,\n                                                          0x75, 0x79, 0x5f, 0x1b, 0xe, 0xbf, 0xa, 0x90,\n                                                          0xa, 0xc7, 0xf7, 0x73, 0x15, 0xfb, 0x52, 0xf7,\n                                                          0x1f, 0x58, 0xe0, 0xf7, 0x74, 0xf7, 0x53, 0xf7,\n                                                          0x86, 0xf7, 0x5d, 0xf7, 0x3c, 0x24, 0xd4, 0xfb,\n                                                          0xc, 0xfb, 0x47, 0xfb, 0x81, 0xfb, 0x72, 0xfb,\n                                                          0x71, 0x1e, 0xf4, 0x5d, 0x15, 0xf7, 0x16, 0xf7,\n                                                          0x1, 0xf7, 0xda, 0xf7, 0x5a, 0xea, 0xa6, 0x47,\n                                                          0x30, 0xfb, 0xe, 0x30, 0xfb, 0xe5, 0xfb, 0x5f,\n                                                          0xfb, 0x16, 0x86, 0xf7, 0x1f, 0xa2, 0x1e, 0xe,\n                                                          0x7d, 0xa, 0xf7, 0xc5, 0xaf, 0xf7, 0xae, 0xa9,\n                                                          0x1, 0xf8, 0x8a, 0xf2, 0x3, 0x8b, 0x4, 0xf7,\n                                                          0x89, 0x9b, 0x6, 0x59, 0x7d, 0x9d, 0xaa, 0x9d,\n                                                          0x91, 0xa1, 0x92, 0xa4, 0x1f, 0xbb, 0xf7, 0x4b,\n                                                          0x5, 0x86, 0xa1, 0x99, 0x88, 0xd1, 0x1b, 0xf7,\n                                                          0x5c, 0xc4, 0xf7, 0xe, 0xd5, 0xf7, 0x2b, 0xfb,\n                                                          0x3b, 0x8c, 0x5f, 0x1f, 0xfb, 0x8c, 0x7b, 0x6,\n                                                          0xc0, 0x9c, 0x79, 0x70, 0x76, 0x83, 0x6f, 0x83,\n                                                          0x6f, 0x1f, 0x22, 0xfc, 0x14, 0x5, 0x4b, 0x79,\n                                                          0x7e, 0x58, 0x4b, 0x1b, 0xf7, 0x8f, 0xf7, 0xdf,\n                                                          0xd8, 0xa, 0x9b, 0xa9, 0x1b, 0xf7, 0x2, 0xa9,\n                                                          0x61, 0x41, 0xfb, 0x1f, 0x28, 0x70, 0x3a, 0x70,\n                                                          0x72, 0x8e, 0x8e, 0x78, 0x1f, 0xe, 0xf8, 0x1,\n                                                          0xfb, 0x4a, 0xcf, 0x73, 0xf7, 0x2f, 0x6a, 0xac,\n                                                          0xf8, 0xfc, 0xac, 0x12, 0x86, 0xa, 0x13, 0x5c,\n                                                          0xc6, 0xfb, 0x2e, 0x15, 0x95, 0x7c, 0x5, 0xa4,\n                                                          0xb2, 0xac, 0x91, 0xaa, 0x1b, 0xad, 0xac, 0x7e,\n                                                          0x80, 0xb2, 0x1f, 0x13, 0xbc, 0x81, 0xae, 0xb3,\n                                                          0x81, 0xbc, 0x1b, 0xba, 0xf7, 0x28, 0xa5, 0xf6,\n                                                          0xd2, 0x1f, 0x7c, 0x96, 0x5, 0x62, 0x63, 0x4f,\n                                                          0x68, 0x26, 0x1b, 0x75, 0x72, 0x91, 0x92, 0x6f,\n                                                          0x1f, 0x13, 0x3c, 0x5a, 0x98, 0x53, 0x9c, 0x55,\n                                                          0x89, 0xc8, 0xc4, 0x18, 0xae, 0xa, 0xf7, 0x82,\n                                                          0x4f, 0xa, 0xfb, 0x66, 0xfb, 0x71, 0xfb, 0x35,\n                                                          0xeb, 0x44, 0xdb, 0x7c, 0x1f, 0x2a, 0x36, 0x82,\n                                                          0x85, 0x44, 0x58, 0x8, 0xf5, 0xf7, 0xeb, 0x15,\n                                                          0xf7, 0x16, 0xef, 0xf7, 0xce, 0xf7, 0x5a, 0xea,\n                                                          0xaf, 0x45, 0x30, 0xfb, 0xe, 0x2b, 0xfb, 0xe1,\n                                                          0xfb, 0x5f, 0xfb, 0x16, 0x8b, 0xf7, 0x29, 0xa2,\n                                                          0x1e, 0xe, 0x7d, 0xa, 0xf7, 0xe1, 0xa7, 0xf7,\n                                                          0x9a, 0xa9, 0x1, 0xf8, 0x77, 0xf4, 0x3, 0x7e,\n                                                          0x16, 0xf7, 0x88, 0x9b, 0x6, 0x5b, 0x78, 0x98,\n                                                          0xaa, 0x9a, 0x8f, 0xa0, 0x92, 0xa3, 0x1f, 0xc3,\n                                                          0xf7, 0x65, 0xcc, 0x86, 0xf7, 0xf, 0xfb, 0xd8,\n                                                          0x5, 0xf7, 0x28, 0x9b, 0x6, 0x57, 0x74, 0xbb,\n                                                          0xae, 0x7e, 0x1f, 0x33, 0xf7, 0x7e, 0x5, 0xc1,\n                                                          0xf7, 0x23, 0xc4, 0xf7, 0xb, 0xf7, 0x24, 0xfb,\n                                                          0x40, 0x8b, 0x67, 0x1f, 0xfb, 0x8c, 0x7b, 0x6,\n                                                          0xbe, 0x9f, 0x7b, 0x72, 0x79, 0x85, 0x74, 0x85,\n                                                          0x74, 0x1f, 0xfb, 0x7, 0xfc, 0x30, 0x5, 0x4c,\n                                                          0x79, 0x80, 0x62, 0x4f, 0x1b, 0xf7, 0x94, 0xf7,\n                                                          0xf2, 0x15, 0xcc, 0xf7, 0x79, 0x5, 0x9d, 0x92,\n                                                          0x8f, 0x95, 0xb8, 0x1b, 0xc4, 0xc9, 0x74, 0x35,\n                                                          0x40, 0x66, 0x3d, 0xfb, 0x24, 0x70, 0x83, 0x8c,\n                                                          0x8f, 0x73, 0x1f, 0xe, 0x79, 0xae, 0x76, 0xae,\n                                                          0x72, 0x76, 0xf9, 0x1c, 0xac, 0x8c, 0x77, 0x12,\n                                                          0x13, 0x30, 0xb9, 0xa, 0x9c, 0x84, 0x83, 0x9f,\n                                                          0x1f, 0x13, 0x90, 0x81, 0xa4, 0xa8, 0x80, 0xb1,\n                                                          0x6d, 0xa, 0x13, 0x48, 0xb3, 0xf7, 0x5b, 0x5,\n                                                          0x74, 0x6, 0x79, 0x7f, 0x78, 0x83, 0x74, 0x1b,\n                                                          0x73, 0x7b, 0x94, 0x92, 0x72, 0x1f, 0x13, 0x90,\n                                                          0x90, 0x7b, 0x77, 0x8f, 0x70, 0x64, 0xa, 0xe,\n                                                          0xf7, 0x5b, 0xa0, 0x76, 0xf8, 0xfe, 0xae, 0x1,\n                                                          0xcc, 0x16, 0xf7, 0xb6, 0x9b, 0x6, 0x49, 0x77,\n                                                          0x9e, 0xac, 0x9c, 0x91, 0xa0, 0x92, 0xa3, 0x1f,\n                                                          0xf7, 0x1a, 0xf8, 0x7c, 0x5, 0xf7, 0x12, 0xac,\n                                                          0x85, 0x3c, 0x7f, 0x8a, 0x7d, 0x89, 0x7c, 0x1f,\n                                                          0x9c, 0x89, 0xb7, 0xf7, 0x37, 0x5, 0xfc, 0xa8,\n                                                          0x6, 0x61, 0xfb, 0x2e, 0x9d, 0x87, 0x5, 0xf7,\n                                                          0xf, 0xc5, 0xbd, 0x8b, 0xf7, 0x16, 0x1b, 0xfb,\n                                                          0x17, 0xfc, 0x7c, 0x5, 0x49, 0x79, 0x60, 0x5b,\n                                                          0x51, 0x1b, 0xe, 0xaa, 0xa, 0x77, 0x1, 0xf1,\n                                                          0xe5, 0xf8, 0xa, 0xf7, 0x5b, 0x3, 0xf7, 0x13,\n                                                          0xf9, 0x11, 0x15, 0xbe, 0xa2, 0x7b, 0x67, 0x1f,\n                                                          0x59, 0x28, 0xfb, 0xaf, 0x7c, 0xa, 0xf7, 0x3d,\n                                                          0xc5, 0xf7, 0x0, 0xf7, 0x29, 0xb7, 0x1e, 0xee,\n                                                          0xf7, 0xe3, 0x5, 0x9d, 0x90, 0xa7, 0xb8, 0xba,\n                                                          0x1b, 0xeb, 0xa, 0x7b, 0x7, 0xae, 0xaa, 0x7a,\n                                                          0x5f, 0x79, 0x3d, 0xfb, 0xb2, 0x83, 0x6c, 0x1f,\n                                                          0x26, 0x6f, 0x56, 0xfb, 0x9, 0xfb, 0x1a, 0x1b,\n                                                          0x4b, 0x40, 0xab, 0xe4, 0xc1, 0xef, 0xf7, 0xea,\n                                                          0x9a, 0xb8, 0x1f, 0xaf, 0x97, 0xb0, 0x9b, 0xb7,\n                                                          0x1b, 0xd2, 0xa, 0xe, 0xf7, 0x92, 0x8e, 0x76,\n                                                          0xf9, 0x33, 0x77, 0x1, 0xd7, 0xf8, 0xf8, 0x3,\n                                                          0xf7, 0x84, 0x79, 0x15, 0x9e, 0x6, 0xf7, 0xca,\n                                                          0xf8, 0x94, 0x5, 0x95, 0x91, 0xca, 0xf7, 0x19,\n                                                          0xbd, 0x1b, 0x9b, 0xfb, 0x4e, 0x7b, 0x7, 0xb4,\n                                                          0x9c, 0x75, 0x79, 0x69, 0x6e, 0x5b, 0x7d, 0x73,\n                                                          0x1f, 0xfb, 0x62, 0xfb, 0xf8, 0x5, 0x86, 0x6,\n                                                          0x4e, 0xf7, 0xfb, 0x5, 0x87, 0xa1, 0x85, 0xa6,\n                                                          0xa3, 0x1a, 0xb1, 0x9c, 0xab, 0xcc, 0x1e, 0x9b,\n                                                          0xfb, 0x85, 0x7b, 0x7, 0xbc, 0x8e, 0x75, 0xfb,\n                                                          0xf, 0x9f, 0x1f, 0xe, 0xf8, 0x70, 0x8e, 0x76,\n                                                          0xf9, 0x33, 0x77, 0x1, 0xd2, 0xf9, 0xd7, 0x3,\n                                                          0xf7, 0x68, 0x79, 0x15, 0x9e, 0x6, 0xf7, 0x72,\n                                                          0xf8, 0x5a, 0x5, 0x90, 0x6, 0xbd, 0xfc, 0x5a,\n                                                          0x5, 0x9f, 0x6, 0xf7, 0xc0, 0xf8, 0xd1, 0x5,\n                                                          0xbf, 0xa6, 0xa9, 0xa9, 0xa0, 0x1b, 0x9b, 0xfb,\n                                                          0x4d, 0x7b, 0x7, 0xbe, 0x99, 0x73, 0x75, 0x79,\n                                                          0x84, 0x7a, 0x89, 0x87, 0x1f, 0xfb, 0x58, 0xfc,\n                                                          0x15, 0x5, 0x88, 0x6, 0x5c, 0xf8, 0x24, 0x5,\n                                                          0x8f, 0x8b, 0x90, 0x8f, 0x1a, 0xaa, 0xb2, 0xa5,\n                                                          0xae, 0x1e, 0x9b, 0xfb, 0x82, 0x7b, 0x7, 0xc7,\n                                                          0x97, 0x74, 0x5e, 0x90, 0x1f, 0x92, 0x50, 0xfb,\n                                                          0x3e, 0xfb, 0xeb, 0x5, 0x88, 0x6, 0x87, 0xa9,\n                                                          0x61, 0xf7, 0xfd, 0x5, 0x8a, 0x93, 0x8b, 0x92,\n                                                          0x91, 0x1a, 0xb4, 0xb8, 0x9c, 0xaa, 0x1e, 0x9b,\n                                                          0xfb, 0x80, 0x7b, 0x7, 0xc1, 0x98, 0x5f, 0x69,\n                                                          0x8f, 0x1f, 0xe, 0xf7, 0x92, 0xcb, 0xa, 0x6e,\n                                                          0xf9, 0x40, 0x3, 0x6e, 0x16, 0xf7, 0x6a, 0x9b,\n                                                          0x6, 0x61, 0x75, 0x9a, 0xa0, 0x98, 0x91, 0x9a,\n                                                          0x99, 0x9c, 0x1f, 0xf7, 0x2b, 0xf7, 0x40, 0xd3,\n                                                          0xfb, 0x47, 0x5, 0x8f, 0x81, 0x8d, 0x81, 0x82,\n                                                          0x1a, 0x73, 0x79, 0x76, 0x51, 0x1e, 0xe6, 0xa,\n                                                          0x60, 0x67, 0x95, 0xcb, 0x72, 0x1f, 0x25, 0xf7,\n                                                          0x96, 0xf7, 0x4d, 0xf7, 0x68, 0x5, 0xbe, 0xb8,\n                                                          0xc0, 0xa5, 0x96, 0x1b, 0x9b, 0xfb, 0x64, 0x7b,\n                                                          0x7, 0xb4, 0x9e, 0x7d, 0x78, 0x7e, 0x85, 0x7b,\n                                                          0x7e, 0x7c, 0x1f, 0xfb, 0x25, 0xfb, 0x3b, 0x50,\n                                                          0xf7, 0x27, 0x5, 0x82, 0xa0, 0x86, 0x9e, 0x9b,\n                                                          0x1a, 0xa4, 0xa1, 0x9b, 0xbb, 0x1e, 0x9b, 0xfb,\n                                                          0x9c, 0x7b, 0x7, 0xc2, 0xa2, 0x76, 0x3f, 0xa9,\n                                                          0x1f, 0xe5, 0xfb, 0x77, 0xfb, 0x32, 0xfb, 0x4c,\n                                                          0x7d, 0x7c, 0x7a, 0x7a, 0x19, 0x53, 0x53, 0x62,\n                                                          0x72, 0x7a, 0x1b, 0xe, 0xf7, 0x5b, 0xcb, 0xa,\n                                                          0xcf, 0xa, 0x58, 0x6d, 0x99, 0xb3, 0x94, 0x8c,\n                                                          0x95, 0x8e, 0x97, 0x1f, 0xc1, 0xf7, 0x61, 0xf7,\n                                                          0x6f, 0xf7, 0xa2, 0x5, 0xb3, 0xab, 0xa9, 0xa0,\n                                                          0x93, 0x1b, 0xe8, 0xa, 0xaa, 0xa7, 0x7d, 0x72,\n                                                          0x83, 0x89, 0x83, 0x87, 0x81, 0x1f, 0x7a, 0x64,\n                                                          0xfb, 0x2, 0xfb, 0x16, 0x5e, 0x53, 0x73, 0xe7,\n                                                          0x6a, 0xf5, 0x85, 0xa5, 0x8, 0x89, 0x92, 0x8b,\n                                                          0x90, 0x91, 0x1a, 0xaa, 0xaf, 0x9c, 0xad, 0xcd,\n                                                          0xa, 0xaf, 0xa3, 0x82, 0x52, 0x9b, 0x1f, 0xd8,\n                                                          0xfb, 0xa1, 0x52, 0xfb, 0x5e, 0x5, 0x49, 0x78,\n                                                          0x55, 0x79, 0x67, 0x1b, 0xe, 0xf7, 0x5b, 0x8b,\n                                                          0xaf, 0xf8, 0xd9, 0xaf, 0x50, 0xa, 0xe, 0xe1,\n                                                          0xa, 0xa0, 0xf8, 0x6, 0x3, 0xa0, 0xfb, 0x2d,\n                                                          0x15, 0xf7, 0x50, 0x6, 0x92, 0xa6, 0x5, 0x5d,\n                                                          0x6, 0x6b, 0x68, 0x92, 0xb5, 0x97, 0x1f, 0xf7,\n                                                          0x34, 0xf9, 0x3a, 0x5, 0xa6, 0x91, 0xa3, 0x93,\n                                                          0xa6, 0x1b, 0xbf, 0x6, 0x92, 0xa6, 0x5, 0xfb,\n                                                          0x41, 0x6, 0xe, 0x3c, 0xfb, 0x13, 0x76, 0xf7,\n                                                          0x20, 0x76, 0xf9, 0x4b, 0x77, 0x1, 0x54, 0xf8,\n                                                          0xb, 0x3, 0xf7, 0x6b, 0xfb, 0x28, 0x15, 0xad,\n                                                          0x6, 0xfb, 0x41, 0xf9, 0xc2, 0x5, 0x66, 0x6,\n                                                          0xe, 0xe1, 0xa, 0x97, 0xf8, 0x6, 0x3, 0x9e,\n                                                          0xfb, 0x12, 0x15, 0x84, 0x70, 0x5, 0xf7, 0x41,\n                                                          0x6, 0xf7, 0x59, 0xf9, 0xc4, 0x5, 0xfb, 0x51,\n                                                          0x6, 0x84, 0x70, 0x5, 0xba, 0x6, 0xaa, 0xad,\n                                                          0x86, 0x60, 0x81, 0x1f, 0xfb, 0x35, 0xfd, 0x3a,\n                                                          0x5, 0x79, 0x87, 0x7d, 0x79, 0x65, 0x1b, 0xe,\n                                                          0xcc, 0xf9, 0x2e, 0x77, 0xa2, 0x76, 0x12, 0xf7,\n                                                          0x49, 0xf7, 0x41, 0x13, 0x60, 0xf7, 0xc1, 0x4,\n                                                          0x13, 0xa0, 0xcf, 0x6, 0xf7, 0x23, 0xf7, 0xb2,\n                                                          0xf7, 0x23, 0xfb, 0xb2, 0x5, 0xcf, 0x6, 0xfb,\n                                                          0x49, 0xf8, 0x1, 0x5, 0x4f, 0x6, 0xe, 0xfb,\n                                                          0x11, 0xbd, 0x1, 0x94, 0x40, 0x15, 0x82, 0x59,\n                                                          0x5, 0xf8, 0x80, 0x6, 0x93, 0xbd, 0x5, 0xe,\n                                                          0x73, 0xf8, 0x95, 0x76, 0xf7, 0x40, 0x77, 0x1,\n                                                          0xf7, 0xac, 0xf8, 0x80, 0xb7, 0xa, 0xfb, 0x3,\n                                                          0xf7, 0x22, 0xc5, 0xa, 0x79, 0x92, 0x56, 0xa,\n                                                          0x9e, 0x7a, 0x80, 0xa, 0x80, 0xbc, 0xf8, 0x11,\n                                                          0xa1, 0x12, 0x9c, 0xdf, 0xf7, 0x58, 0xd4, 0x8b,\n                                                          0x99, 0x17, 0xf7, 0xd2, 0xf7, 0x1f, 0x61, 0xa,\n                                                          0x70, 0xb5, 0xb6, 0xad, 0xb0, 0xd5, 0xc7, 0x1e,\n                                                          0x13, 0xf8, 0x38, 0xa, 0x45, 0x8a, 0x7a, 0x4f,\n                                                          0x5, 0x89, 0x6, 0xa7, 0x6d, 0xaf, 0x5f, 0xa,\n                                                          0x36, 0xa, 0xa8, 0xa1, 0x6e, 0x5b, 0x29, 0x2f,\n                                                          0xfb, 0x62, 0x21, 0x70, 0x6a, 0x9d, 0xc0, 0x1e,\n                                                          0xe, 0x80, 0xa2, 0x7f, 0xa2, 0xf8, 0x5, 0xbc,\n                                                          0x91, 0xbc, 0xf7, 0x4f, 0x77, 0x12, 0xa2, 0xe1,\n                                                          0xf7, 0xab, 0xe0, 0x13, 0x7e, 0xf7, 0x1, 0xb8,\n                                                          0x15, 0xf4, 0xeb, 0xf7, 0x86, 0xf7, 0x2, 0xca,\n                                                          0x95, 0x55, 0x6c, 0x1e, 0x13, 0xbe, 0x37, 0x2c,\n                                                          0xfb, 0x67, 0xfb, 0x1d, 0x5c, 0x8b, 0xa5, 0x92,\n                                                          0x1e, 0x8c, 0xf8, 0xea, 0x15, 0xb8, 0x9c, 0x7e,\n                                                          0x76, 0x7b, 0x85, 0x75, 0x84, 0x73, 0x1f, 0xfb,\n                                                          0x1c, 0xfc, 0x89, 0x5, 0x87, 0x7, 0x75, 0xd8,\n                                                          0x6c, 0xc0, 0xf7, 0x2d, 0xf7, 0x3b, 0xf7, 0x41,\n                                                          0xf7, 0x32, 0xd4, 0x5a, 0xbb, 0x45, 0x31, 0x50,\n                                                          0x38, 0x57, 0x6a, 0x1e, 0x89, 0x8c, 0xad, 0xf7,\n                                                          0x5, 0xb5, 0xf7, 0x44, 0xa1, 0xdd, 0x19, 0x86,\n                                                          0x90, 0x57, 0x81, 0x58, 0x84, 0x59, 0x85, 0x19,\n                                                          0xe, 0xe2, 0x80, 0xaf, 0xf8, 0x1f, 0xa0, 0x1,\n                                                          0xa9, 0xe1, 0xf7, 0x72, 0xe2, 0x3, 0xf7, 0xf2,\n                                                          0xf5, 0x15, 0x63, 0x67, 0x5c, 0x62, 0x4f, 0x1b,\n                                                          0x4e, 0x6d, 0xb8, 0xd8, 0xeb, 0xd0, 0xdb, 0xa,\n                                                          0x84, 0x89, 0x85, 0x88, 0x84, 0x1f, 0x87, 0x80,\n                                                          0x85, 0x7f, 0x7b, 0xa3, 0xa, 0xfb, 0x1e, 0xfb,\n                                                          0x2d, 0xfb, 0x21, 0xfb, 0x19, 0xde, 0x72, 0xcc,\n                                                          0xf4, 0xc5, 0xd6, 0xab, 0xa4, 0x1e, 0xe, 0x7f,\n                                                          0xbb, 0x6f, 0x76, 0xf8, 0x8a, 0xa2, 0xd3, 0x77,\n                                                          0x12, 0x9a, 0xe2, 0x13, 0xb8, 0xf1, 0xf7, 0x3,\n                                                          0x15, 0xe6, 0xea, 0xf7, 0x69, 0xf7, 0x4, 0xba,\n                                                          0x8b, 0x62, 0x74, 0xfb, 0x10, 0x29, 0xfb, 0x53,\n                                                          0x2c, 0x4e, 0x8b, 0xc5, 0x9c, 0x1e, 0xf7, 0x59,\n                                                          0x8e, 0x15, 0x83, 0x68, 0x87, 0x74, 0x74, 0x1a,\n                                                          0x13, 0x78, 0x76, 0x93, 0x72, 0xb2, 0xac, 0xcc,\n                                                          0xba, 0xce, 0xb6, 0x1e, 0x7f, 0x95, 0x5, 0x5b,\n                                                          0x61, 0x77, 0x74, 0x77, 0x1b, 0x81, 0x83, 0x92,\n                                                          0x9a, 0x9b, 0xf7, 0xd, 0xf8, 0x3e, 0xb6, 0xf7,\n                                                          0x42, 0x1f, 0x86, 0x90, 0x58, 0x80, 0x58, 0x84,\n                                                          0x58, 0x86, 0x19, 0x7a, 0x7, 0xb3, 0x9a, 0x7c,\n                                                          0x72, 0x79, 0x85, 0x74, 0x84, 0x72, 0x1f, 0x65,\n                                                          0xfb, 0x29, 0x89, 0x89, 0x5, 0xa1, 0x87, 0x84,\n                                                          0xa9, 0x53, 0x1b, 0x13, 0x38, 0xfb, 0xb, 0xfb,\n                                                          0x3e, 0xfb, 0x48, 0xfb, 0x2b, 0x1f, 0x13, 0xb8,\n                                                          0x57, 0xa0, 0x48, 0xde, 0xbd, 0xc3, 0x9d, 0xf7,\n                                                          0x2, 0xd3, 0x1e, 0xe, 0xe2, 0x80, 0xb8, 0xf8,\n                                                          0x14, 0xa2, 0x12, 0xaa, 0xe2, 0xf7, 0x78, 0xcd,\n                                                          0x17, 0xf7, 0x17, 0xf7, 0x5a, 0x15, 0xa0, 0xc1,\n                                                          0x5, 0xe5, 0xae, 0xd1, 0xd7, 0xc1, 0x1b, 0xa4,\n                                                          0x95, 0x6e, 0x76, 0x83, 0x82, 0xfb, 0xc, 0xfb,\n                                                          0x62, 0x61, 0x1f, 0x84, 0x75, 0x15, 0xf7, 0x52,\n                                                          0xa0, 0xed, 0xe2, 0xda, 0x1a, 0xb7, 0x6c, 0xad,\n                                                          0x58, 0x1e, 0x13, 0xa0, 0xfb, 0x21, 0xfb, 0x32,\n                                                          0x5c, 0xa, 0x1f, 0x73, 0xa, 0x61, 0x57, 0xa2,\n                                                          0xcf, 0x9f, 0x8c, 0x95, 0x90, 0xa0, 0x1f, 0xe,\n                                                          0x3c, 0xfb, 0x63, 0xa0, 0xf8, 0xd0, 0xab, 0xf7,\n                                                          0x82, 0xa1, 0x12, 0xf7, 0xed, 0xda, 0x13, 0xe0,\n                                                          0xa9, 0xf8, 0x16, 0x15, 0xe5, 0x6, 0x38, 0xfc,\n                                                          0x2e, 0x5, 0x63, 0x83, 0x71, 0xfb, 0xe, 0x4b,\n                                                          0x1b, 0x7f, 0x84, 0x93, 0x93, 0x8f, 0x8c, 0x8e,\n                                                          0x8d, 0x8e, 0x1f, 0x8e, 0x8f, 0x8e, 0x8f, 0x95,\n                                                          0x1a, 0xa4, 0x71, 0x97, 0x7d, 0x68, 0x8a, 0x63,\n                                                          0x88, 0x1e, 0x13, 0xf0, 0x65, 0xb7, 0x76, 0xad,\n                                                          0xf7, 0x9, 0xc4, 0xf7, 0x35, 0xf7, 0xe, 0xa6,\n                                                          0x1e, 0xce, 0xf7, 0xca, 0x5, 0xf7, 0x1, 0x6,\n                                                          0x91, 0xab, 0x5, 0xfb, 0x0, 0x6, 0xbe, 0x94,\n                                                          0xae, 0xf7, 0x4f, 0xdd, 0x1b, 0x98, 0x95, 0x87,\n                                                          0x83, 0x86, 0x89, 0x88, 0x89, 0x88, 0x1f, 0x88,\n                                                          0x87, 0x88, 0x85, 0x7f, 0x1a, 0x80, 0x91, 0x70,\n                                                          0xab, 0xa2, 0x9d, 0x9f, 0x9f, 0x9f, 0x7b, 0xb8,\n                                                          0x43, 0xfb, 0x12, 0x54, 0xfb, 0x43, 0x36, 0x71,\n                                                          0x1e, 0x2f, 0x6, 0xe, 0xfb, 0x52, 0xa1, 0xf7,\n                                                          0xd3, 0xa0, 0xf7, 0x8b, 0xa1, 0x12, 0x93, 0xcc,\n                                                          0xa2, 0xd9, 0xf7, 0x2b, 0xc7, 0x6a, 0xda, 0x13,\n                                                          0xfc, 0xf7, 0x11, 0xb2, 0x15, 0x37, 0x54, 0x6a,\n                                                          0x75, 0x52, 0x1a, 0x54, 0xc0, 0x53, 0xf7, 0x1,\n                                                          0xf7, 0x1d, 0xd9, 0xc8, 0xe0, 0xc6, 0x64, 0xaa,\n                                                          0x5f, 0x9f, 0x1e, 0x4f, 0xa6, 0x45, 0x93, 0xa9,\n                                                          0x1a, 0x98, 0xa1, 0xa6, 0x99, 0x1e, 0x98, 0x99,\n                                                          0x87, 0x98, 0x1b, 0x13, 0xfa, 0xe3, 0xea, 0xdd,\n                                                          0xd5, 0x9f, 0x88, 0x9f, 0x85, 0x9e, 0x1f, 0xbd,\n                                                          0x6, 0x13, 0xa8, 0xb2, 0x4e, 0x7, 0x7c, 0x60,\n                                                          0xaf, 0x50, 0x1b, 0x39, 0xfb, 0x8, 0x51, 0xfb,\n                                                          0x4, 0x46, 0xb6, 0x73, 0xaf, 0x7b, 0x1f, 0x69,\n                                                          0x74, 0x60, 0x6e, 0x6c, 0x1a, 0x78, 0x9a, 0x7f,\n                                                          0x97, 0x82, 0x1e, 0xa1, 0x80, 0x15, 0x92, 0x8e,\n                                                          0xed, 0x63, 0x9d, 0x82, 0x8, 0x13, 0xfc, 0x9e,\n                                                          0x82, 0xaf, 0x7a, 0x5e, 0x1a, 0x59, 0x5a, 0x5e,\n                                                          0x31, 0x7c, 0x2a, 0x9a, 0xdd, 0x8a, 0x1e, 0xb1,\n                                                          0x99, 0xbf, 0xc7, 0xa4, 0x1e, 0xa6, 0xf7, 0x72,\n                                                          0x15, 0x13, 0xa0, 0xce, 0xb7, 0xf1, 0xd8, 0x1e,\n                                                          0x13, 0xfa, 0xb5, 0x9a, 0x6e, 0x64, 0x38, 0x59,\n                                                          0x2b, 0x49, 0x5e, 0x7a, 0xac, 0xb8, 0x1f, 0xe,\n                                                          0xbe, 0xa, 0xf7, 0x86, 0x77, 0x12, 0xf8, 0x6,\n                                                          0xd9, 0x13, 0x70, 0x9e, 0x16, 0xd6, 0x6, 0xac,\n                                                          0xf7, 0x12, 0x99, 0xc2, 0xb9, 0xcf, 0x8, 0xa7,\n                                                          0x9e, 0xe0, 0xf7, 0x5, 0xbd, 0x1b, 0x9b, 0x98,\n                                                          0x81, 0x7a, 0x1f, 0x7e, 0x39, 0xfb, 0xb3, 0x71,\n                                                          0x1a, 0x13, 0xb0, 0x70, 0x98, 0x78, 0xab, 0xcd,\n                                                          0xb6, 0xc9, 0xbf, 0xaf, 0x1e, 0x13, 0x10, 0x7e,\n                                                          0x97, 0x5, 0x5b, 0x65, 0x73, 0x6c, 0x77, 0x1b,\n                                                          0x83, 0x83, 0x92, 0x97, 0x1f, 0x13, 0x38, 0xa0,\n                                                          0xdc, 0xf7, 0x94, 0xae, 0x1a, 0xcc, 0x5d, 0x92,\n                                                          0x75, 0x31, 0x25, 0xfb, 0x2e, 0x59, 0x6c, 0x1e,\n                                                          0x89, 0x8d, 0xf7, 0xa, 0xf8, 0x4b, 0x86, 0x90,\n                                                          0x57, 0x7f, 0x56, 0x82, 0x57, 0x85, 0x19, 0x7b,\n                                                          0x7, 0xb7, 0x9c, 0x94, 0x4f, 0x81, 0x7a, 0x51,\n                                                          0x83, 0x6d, 0x1f, 0xe, 0xd7, 0xa, 0xf8, 0xc4,\n                                                          0xf4, 0x12, 0xbc, 0xd6, 0xb0, 0xf2, 0x17, 0xf7,\n                                                          0x72, 0xf7, 0x6, 0x4a, 0xa, 0xe7, 0xf7, 0xe4,\n                                                          0x1f, 0x88, 0x8d, 0x5, 0x84, 0x64, 0x32, 0x79,\n                                                          0x6b, 0x1b, 0x13, 0xf0, 0x7b, 0x7, 0xc2, 0x8f,\n                                                          0x7c, 0x76, 0x1f, 0x6f, 0x40, 0x4b, 0xa, 0x41,\n                                                          0xf8, 0x86, 0x15, 0x6e, 0xa0, 0x85, 0xa, 0x76,\n                                                          0x73, 0x6e, 0x1e, 0xe, 0x3c, 0xfb, 0x63, 0xa2,\n                                                          0x74, 0xf2, 0xf9, 0x24, 0xf1, 0x12, 0xfb, 0x10,\n                                                          0xdc, 0xf7, 0x6d, 0xf1, 0x13, 0xb8, 0xd4, 0xf8,\n                                                          0x24, 0x15, 0xc7, 0x8c, 0x99, 0x8c, 0x61, 0x1a,\n                                                          0x33, 0xfb, 0xff, 0x5, 0x3e, 0x78, 0x72, 0x23,\n                                                          0x58, 0x1b, 0x82, 0x80, 0x8c, 0x95, 0x91, 0x8e,\n                                                          0x8e, 0x8e, 0x8f, 0x1f, 0x8e, 0x8f, 0x8f, 0x90,\n                                                          0x96, 0x1a, 0x13, 0x78, 0xa0, 0x77, 0x9a, 0x77,\n                                                          0x66, 0x87, 0x68, 0x87, 0x5a, 0xb8, 0x7c, 0xac,\n                                                          0xe4, 0xc5, 0xd6, 0xf7, 0x34, 0xb4, 0x1e, 0xf3,\n                                                          0xf8, 0x2f, 0x88, 0x8d, 0x5, 0x84, 0x64, 0x2b,\n                                                          0x79, 0x68, 0x1b, 0xf0, 0xf7, 0x4f, 0x15, 0x6f,\n                                                          0xa2, 0x74, 0xa7, 0xa7, 0xa2, 0xa2, 0xa7, 0xa7,\n                                                          0x74, 0xa2, 0x6f, 0x6f, 0x74, 0x74, 0x6f, 0x1e,\n                                                          0xe, 0xe2, 0x95, 0x76, 0xab, 0x76, 0xf9, 0x24,\n                                                          0x77, 0xba, 0x77, 0x12, 0x99, 0xf8, 0x53, 0x13,\n                                                          0x70, 0x99, 0x16, 0xd6, 0x6, 0xbb, 0xf7, 0x48,\n                                                          0xb5, 0xab, 0x95, 0x6d, 0xb1, 0x33, 0x97, 0x74,\n                                                          0x19, 0x13, 0xb0, 0x50, 0xa9, 0x9d, 0x74, 0xaa,\n                                                          0x1b, 0xb7, 0xa8, 0xb0, 0xd3, 0xb1, 0x1f, 0x7c,\n                                                          0x96, 0x5, 0x59, 0x6e, 0x81, 0x79, 0x75, 0x1b,\n                                                          0x71, 0x78, 0xb9, 0xf7, 0x3f, 0x43, 0x1f, 0xf7,\n                                                          0xe, 0xf7, 0x1e, 0xb5, 0xab, 0xb8, 0x1b, 0x13,\n                                                          0x38, 0x9b, 0xfb, 0x4b, 0x7b, 0x7, 0xa6, 0xa7,\n                                                          0x8b, 0x78, 0x6c, 0xfb, 0x14, 0x2b, 0x54, 0x60,\n                                                          0x1f, 0x89, 0x8d, 0xf7, 0xb, 0xf8, 0x59, 0x86,\n                                                          0x90, 0x5, 0x7f, 0x57, 0x36, 0x7c, 0x78, 0x1b,\n                                                          0x13, 0x0, 0x7b, 0x7, 0xa5, 0xb2, 0x82, 0x71,\n                                                          0x7c, 0x73, 0x3a, 0x82, 0x67, 0x1f, 0xe, 0x3c,\n                                                          0x8f, 0x76, 0xf9, 0x35, 0x77, 0xba, 0x77, 0x12,\n                                                          0xb4, 0xd8, 0x17, 0xf7, 0x78, 0xd3, 0xa, 0x7c,\n                                                          0x8b, 0x99, 0x91, 0x96, 0x93, 0xa6, 0x8d, 0x94,\n                                                          0x1f, 0xf7, 0x2b, 0xf8, 0xd7, 0x86, 0x90, 0x5,\n                                                          0x7f, 0x57, 0x3d, 0x7c, 0x71, 0x1b, 0x13, 0x90,\n                                                          0x7b, 0x7, 0xa5, 0xb1, 0x82, 0x71, 0x1f, 0x76,\n                                                          0xfb, 0x21, 0xfc, 0x94, 0x76, 0xb5, 0xa, 0xf8,\n                                                          0x1, 0x97, 0x76, 0xa9, 0x76, 0xf8, 0x19, 0xbf,\n                                                          0x12, 0x13, 0x60, 0x97, 0x16, 0xd6, 0x6, 0xb0,\n                                                          0xf7, 0xe, 0x9f, 0xcd, 0xb3, 0xc7, 0x8, 0xb3,\n                                                          0xa6, 0xd7, 0xf0, 0xb8, 0x1b, 0x94, 0x98, 0x8b,\n                                                          0x70, 0x78, 0x46, 0xfb, 0x8a, 0x71, 0x2a, 0x1f,\n                                                          0xd6, 0x6, 0xa8, 0xf7, 0x5, 0x9c, 0xca, 0xbb,\n                                                          0xd7, 0x8, 0xbc, 0xaa, 0xd3, 0xe3, 0xb4, 0x1b,\n                                                          0x97, 0x94, 0x83, 0x7c, 0x1f, 0x77, 0x3d, 0xfb,\n                                                          0xab, 0x70, 0x1a, 0x13, 0xa0, 0x7d, 0x8b, 0x68,\n                                                          0xb5, 0xc3, 0xbd, 0xc3, 0xc5, 0xb4, 0x1e, 0x7c,\n                                                          0x97, 0x5, 0x5c, 0x65, 0x71, 0x6b, 0x78, 0x1b,\n                                                          0x7f, 0x88, 0x8e, 0x9c, 0x1f, 0x99, 0xdc, 0xf7,\n                                                          0xa0, 0xad, 0x1a, 0xb3, 0x74, 0xa6, 0x67, 0x49,\n                                                          0x3a, 0x33, 0xfb, 0x8, 0x45, 0x1e, 0x89, 0x8d,\n                                                          0x5, 0x99, 0xb3, 0xa2, 0xde, 0x99, 0x1a, 0xb5,\n                                                          0x76, 0xa2, 0x65, 0x37, 0x24, 0xfb, 0x2f, 0x5a,\n                                                          0x6d, 0x1e, 0x89, 0x8d, 0xc3, 0xf7, 0x5a, 0x88,\n                                                          0x8f, 0x56, 0x80, 0x56, 0x81, 0x55, 0x81, 0x19,\n                                                          0x13, 0x0, 0x7b, 0x7, 0xbc, 0x96, 0x75, 0x75,\n                                                          0x1f, 0x13, 0x60, 0x75, 0x3d, 0xfb, 0x9a, 0x7b,\n                                                          0x49, 0x1e, 0xe, 0xbe, 0xa, 0x12, 0xf7, 0xfd,\n                                                          0xdc, 0x13, 0x70, 0x89, 0xa, 0x13, 0x90, 0xc3,\n                                                          0xa, 0x13, 0xb0, 0x51, 0xa, 0x13, 0x0, 0x7b,\n                                                          0x7, 0xc1, 0x93, 0x76, 0x7c, 0x1f, 0x13, 0x70,\n                                                          0x76, 0x4a, 0xfb, 0x74, 0x6c, 0xfb, 0x5, 0x1e,\n                                                          0xe, 0x80, 0xa0, 0xf8, 0x2e, 0xa0, 0x92, 0xa,\n                                                          0xa6, 0xf7, 0x1b, 0x15, 0x38, 0xba, 0x4c, 0xf5,\n                                                          0xf7, 0x2d, 0xf7, 0x1b, 0xf7, 0x47, 0xf7, 0xf,\n                                                          0xcd, 0x6a, 0xdf, 0xfb, 0x8, 0xfb, 0x26, 0xfb,\n                                                          0x26, 0xfb, 0x33, 0xfb, 0x27, 0x1e, 0xdf, 0x6d,\n                                                          0x15, 0xf7, 0xa, 0xe4, 0xf7, 0x59, 0xf7, 0x4,\n                                                          0xbb, 0xa3, 0x5d, 0x57, 0x20, 0x3e, 0xfb, 0x61,\n                                                          0xfb, 0x6, 0x59, 0x6b, 0xb1, 0xc4, 0x1e, 0xe,\n                                                          0xfb, 0x48, 0x76, 0xf7, 0x67, 0x76, 0xf8, 0x2d,\n                                                          0xb6, 0x48, 0xa, 0x73, 0x1f, 0x89, 0x8d, 0xa6,\n                                                          0xe8, 0x5, 0x96, 0x8e, 0x88, 0x8d, 0x88, 0x1b,\n                                                          0xfb, 0x2f, 0x75, 0x5, 0x13, 0x80, 0x8d, 0x7b,\n                                                          0x5, 0xb9, 0x9e, 0x81, 0x79, 0x76, 0x29, 0xfb,\n                                                          0xfe, 0x70, 0xfb, 0x4, 0x1f, 0x6b, 0x83, 0x81,\n                                                          0xda, 0xa, 0x61, 0x75, 0x8b, 0xd1, 0x94, 0x1f,\n                                                          0x8e, 0x9f, 0x9b, 0xd3, 0x94, 0xad, 0x8, 0xe,\n                                                          0xfb, 0x50, 0x76, 0xf7, 0x5a, 0xc0, 0xf8, 0xd,\n                                                          0xa1, 0x1, 0xa4, 0xe1, 0xf7, 0xa1, 0x99, 0x3,\n                                                          0xf7, 0x2a, 0xfb, 0x55, 0x15, 0x7b, 0xf7, 0x85,\n                                                          0x9d, 0x7, 0x6e, 0x5c, 0x9a, 0xb5, 0x97, 0x1f,\n                                                          0xf7, 0x30, 0xf8, 0xc4, 0x5, 0x42, 0x6, 0x7d,\n                                                          0x5f, 0x5, 0x89, 0x6, 0xa5, 0x85, 0x7b, 0xac,\n                                                          0x53, 0x1b, 0xfb, 0x16, 0xfb, 0x35, 0xfb, 0x52,\n                                                          0xfb, 0x1d, 0x47, 0xa5, 0x52, 0xd8, 0xe4, 0xc5,\n                                                          0xdc, 0xd8, 0xc0, 0x1f, 0x8d, 0x89, 0x3b, 0xfb,\n                                                          0xa7, 0x5, 0x5e, 0x7d, 0x6c, 0x79, 0x54, 0x1b,\n                                                          0x64, 0xf7, 0xc9, 0x15, 0xf7, 0x8, 0xf7, 0x8,\n                                                          0xf7, 0x4f, 0xe8, 0xaa, 0xa8, 0x76, 0x5e, 0x29,\n                                                          0xfb, 0x0, 0xfb, 0x69, 0x22, 0x68, 0x76, 0xaa,\n                                                          0xb6, 0x1e, 0xe, 0xab, 0xa0, 0x76, 0xf8, 0x4d,\n                                                          0x77, 0x1, 0xb8, 0xf8, 0x3, 0x3, 0xb8, 0x16,\n                                                          0xd7, 0x6, 0xb4, 0xf7, 0x19, 0x99, 0xb8, 0xb1,\n                                                          0xd3, 0x8, 0x9a, 0x93, 0xc7, 0xf7, 0x3, 0xaa,\n                                                          0x1b, 0x97, 0x8d, 0x83, 0x82, 0x8f, 0x1f, 0x82,\n                                                          0x90, 0x92, 0x81, 0xa1, 0x1b, 0x96, 0xaf, 0x8b,\n                                                          0xbf, 0xad, 0x72, 0x9a, 0x74, 0x4c, 0x39, 0xfb,\n                                                          0x6, 0x46, 0x70, 0x1f, 0x83, 0x77, 0x89, 0x8d,\n                                                          0xbc, 0xf7, 0x5b, 0x88, 0x8d, 0x5, 0x84, 0x5b,\n                                                          0x2f, 0x77, 0x7c, 0x1b, 0x7a, 0x7, 0x8d, 0x96,\n                                                          0x96, 0x8e, 0x96, 0x1b, 0xa3, 0x94, 0x7a, 0x73,\n                                                          0x73, 0x83, 0x6d, 0x84, 0x72, 0x1f, 0xe, 0xab,\n                                                          0x80, 0xa0, 0x89, 0x76, 0xf8, 0x43, 0xa2, 0x8c,\n                                                          0x77, 0x12, 0xf7, 0x1, 0xd4, 0xb9, 0xd7, 0x13,\n                                                          0x6c, 0xc2, 0xa, 0x9a, 0x9a, 0x86, 0x86, 0x9a,\n                                                          0x1f, 0x13, 0xac, 0x86, 0x9a, 0x99, 0x87, 0x9a,\n                                                          0x1b, 0xc3, 0xe8, 0xa4, 0xf7, 0x1, 0xb3, 0x70,\n                                                          0xb5, 0x6e, 0xb2, 0x1f, 0x6b, 0xb6, 0x69, 0xb3,\n                                                          0xac, 0x1a, 0xbc, 0xab, 0x94, 0xa1, 0xcc, 0xa8,\n                                                          0x49, 0x5a, 0x1e, 0x9b, 0x6, 0x13, 0x9c, 0xbb,\n                                                          0xa, 0x7d, 0x82, 0x8e, 0x8f, 0x80, 0x1f, 0x13,\n                                                          0xac, 0x90, 0x7e, 0x7d, 0x90, 0x73, 0x1b, 0x21,\n                                                          0x7d, 0x3b, 0x6c, 0x65, 0xa8, 0x60, 0xa9, 0x61,\n                                                          0x1f, 0xa9, 0x61, 0xa9, 0x62, 0x6a, 0xb4, 0xa,\n                                                          0xe, 0xd7, 0xa, 0xf8, 0x20, 0xab, 0xf7, 0x15,\n                                                          0x77, 0x1, 0xb0, 0xf7, 0x97, 0x3, 0xf7, 0x6a,\n                                                          0xf7, 0x9, 0x15, 0x6b, 0x72, 0x68, 0x5c, 0x77,\n                                                          0x1b, 0x86, 0x80, 0x8e, 0x97, 0x97, 0xa6, 0xeb,\n                                                          0xc7, 0xf7, 0x74, 0x1f, 0xe1, 0x6, 0x90, 0xab,\n                                                          0x5, 0x39, 0x6, 0xa9, 0xf7, 0x6, 0x5, 0x93,\n                                                          0x8d, 0x89, 0x92, 0x84, 0x1b, 0x82, 0x87, 0x84,\n                                                          0x86, 0x87, 0x1f, 0x6f, 0x68, 0x58, 0x53, 0x6b,\n                                                          0x7a, 0x8, 0x6b, 0x7a, 0x75, 0x91, 0x6d, 0x1a,\n                                                          0xd6, 0x6, 0x45, 0xfb, 0x9c, 0x5, 0x87, 0x7b,\n                                                          0x78, 0x4e, 0x7c, 0x1a, 0x6d, 0xa7, 0x81, 0x9f,\n                                                          0xbf, 0xb2, 0xb7, 0xd8, 0xbe, 0x1e, 0xe, 0x82,\n                                                          0xbe, 0x6b, 0x76, 0xf8, 0x58, 0xa9, 0xa, 0xd9,\n                                                          0x13, 0xa0, 0xf7, 0xe0, 0xf7, 0x77, 0x15, 0x13,\n                                                          0xb8, 0x4d, 0xa, 0x72, 0xa, 0x80, 0x8a, 0x96,\n                                                          0x90, 0x9a, 0x99, 0xb7, 0x90, 0x9f, 0x42, 0xa,\n                                                          0x84, 0x7c, 0x8f, 0x9e, 0x97, 0xaa, 0xf7, 0xc,\n                                                          0xc8, 0xf7, 0x86, 0x1f, 0x88, 0x8d, 0x5, 0x7f,\n                                                          0x59, 0x37, 0x7c, 0x7b, 0x1b, 0x13, 0x50, 0x5d,\n                                                          0xa, 0x13, 0x60, 0xa6, 0xa, 0xe2, 0x8e, 0x76,\n                                                          0xf8, 0x5f, 0x77, 0x12, 0xf7, 0x1c, 0xd2, 0xf7,\n                                                          0x3c, 0xbe, 0x17, 0xf7, 0x63, 0xd1, 0x15, 0x8a,\n                                                          0xc9, 0x83, 0xf7, 0x32, 0x69, 0xf7, 0x17, 0x8,\n                                                          0x9e, 0x86, 0x8a, 0x8c, 0x81, 0x87, 0xfb, 0x1,\n                                                          0x72, 0x7d, 0x1b, 0x7e, 0x7, 0xbc, 0xa2, 0x9e,\n                                                          0xfb, 0x4, 0xa0, 0x1f, 0x9b, 0x34, 0x91, 0xfb,\n                                                          0x4a, 0x6e, 0x1a, 0x7a, 0x8b, 0x7e, 0x94, 0x1e,\n                                                          0x13, 0x50, 0x9a, 0x9d, 0x9f, 0xd2, 0xcd, 0x1f,\n                                                          0xac, 0xae, 0xf7, 0x29, 0xf7, 0x46, 0xe7, 0x1a,\n                                                          0xb0, 0x73, 0xa5, 0x6a, 0x77, 0x7b, 0x7d, 0x7c,\n                                                          0x73, 0x93, 0x80, 0x94, 0x83, 0x1e, 0x97, 0x80,\n                                                          0x98, 0x85, 0x75, 0x1a, 0x59, 0x3b, 0xfb, 0xb,\n                                                          0x52, 0x50, 0x1e, 0xe, 0xf7, 0xca, 0x8e, 0x76,\n                                                          0xf8, 0x5e, 0x77, 0xa0, 0x77, 0x12, 0xf7, 0xd,\n                                                          0xd2, 0xf7, 0x38, 0xca, 0xf7, 0x49, 0xbb, 0x13,\n                                                          0xbc, 0xf7, 0x52, 0xf7, 0x15, 0x15, 0x9d, 0x84,\n                                                          0xf7, 0x13, 0x79, 0xf0, 0x1e, 0xc1, 0x81, 0x85,\n                                                          0x97, 0x85, 0x82, 0x29, 0x73, 0x77, 0x1b, 0x7d,\n                                                          0x7, 0xc4, 0x9c, 0x8e, 0x30, 0x94, 0x1f, 0x90,\n                                                          0x54, 0x9c, 0x3f, 0xfb, 0x2f, 0x1a, 0x7d, 0x8c,\n                                                          0x8a, 0x6a, 0x98, 0x1b, 0x9a, 0x92, 0xa0, 0xf7,\n                                                          0x40, 0xec, 0x1f, 0xb8, 0xda, 0xa3, 0xb5, 0x9d,\n                                                          0xab, 0x8, 0x8d, 0x6, 0xa8, 0xfb, 0xd0, 0x5,\n                                                          0x7b, 0x8c, 0x8b, 0x7d, 0x96, 0x1b, 0x96, 0x98,\n                                                          0x9e, 0xbb, 0xb3, 0x1f, 0xb9, 0xc1, 0xf7, 0x2f,\n                                                          0xf7, 0x57, 0xe2, 0x1a, 0xa8, 0x7b, 0xa6, 0x66,\n                                                          0x6e, 0x82, 0x79, 0x7a, 0x7a, 0x96, 0x82, 0x96,\n                                                          0x81, 0x1e, 0x96, 0x81, 0x95, 0x81, 0x79, 0x1a,\n                                                          0x57, 0x3e, 0x2a, 0x33, 0xfb, 0x1, 0x1e, 0x6b,\n                                                          0xf7, 0xfb, 0x5, 0x13, 0xdc, 0x8d, 0x8a, 0x8b,\n                                                          0x90, 0x84, 0x1b, 0x85, 0x88, 0x87, 0x86, 0x88,\n                                                          0x1f, 0xfb, 0x53, 0xfb, 0xc2, 0x5, 0xe, 0xe2,\n                                                          0x80, 0xc2, 0xf8, 0x21, 0x77, 0x1, 0x70, 0xf8,\n                                                          0x6e, 0x3, 0xf7, 0x62, 0xf7, 0x44, 0x15, 0xa9,\n                                                          0xfb, 0xc, 0x5, 0x56, 0x98, 0x9a, 0x7d, 0xa8,\n                                                          0x1b, 0xa2, 0xa8, 0x8b, 0xf7, 0x6, 0xd2, 0x1f,\n                                                          0x7d, 0x93, 0x5, 0x6d, 0x70, 0x77, 0x66, 0x76,\n                                                          0x1b, 0x77, 0x84, 0xa4, 0x9b, 0x87, 0x1f, 0x85,\n                                                          0xa4, 0x69, 0xf7, 0x1c, 0x9d, 0x1a, 0x8b, 0xcf,\n                                                          0xf7, 0xd, 0xa8, 0x96, 0x92, 0x87, 0x87, 0x92,\n                                                          0x1e, 0x87, 0x93, 0x93, 0x86, 0x97, 0x1b, 0xa3,\n                                                          0x95, 0x9e, 0x9d, 0xa3, 0x75, 0x97, 0x78, 0x57,\n                                                          0x5c, 0x4e, 0x39, 0x57, 0x1f, 0x80, 0xc2, 0x5,\n                                                          0xe3, 0x79, 0x7c, 0x8b, 0x75, 0x1b, 0x6b, 0x49,\n                                                          0x73, 0x82, 0x70, 0x1f, 0x8f, 0x7c, 0x5, 0x93,\n                                                          0xab, 0x99, 0x8e, 0x94, 0x1b, 0xa6, 0x97, 0x73,\n                                                          0x6c, 0x94, 0x1f, 0x8c, 0x86, 0xa5, 0xfb, 0xf,\n                                                          0x82, 0x1a, 0xfb, 0x17, 0x31, 0x71, 0x69, 0x7a,\n                                                          0x1b, 0x82, 0x82, 0x90, 0x90, 0x81, 0x1f, 0x90,\n                                                          0x82, 0x81, 0x8f, 0x80, 0x1b, 0x75, 0x7f, 0x79,\n                                                          0x7b, 0x73, 0x9b, 0x78, 0xac, 0xaa, 0x97, 0x96,\n                                                          0x9e, 0x9c, 0x1f, 0xad, 0xb0, 0xb5, 0xc1, 0xbb,\n                                                          0xcd, 0x8, 0xe, 0xe2, 0xfb, 0x4d, 0x76, 0xf9,\n                                                          0x1b, 0x77, 0x12, 0xf8, 0x1d, 0xc7, 0xa, 0xcf,\n                                                          0x7e, 0x5d, 0xf7, 0x11, 0x7e, 0x7e, 0xfb, 0x12,\n                                                          0x73, 0x86, 0x1b, 0x13, 0xe0, 0x98, 0xa, 0x9f,\n                                                          0x4c, 0xe2, 0xa, 0xae, 0xfb, 0x2f, 0x7a, 0xa,\n                                                          0x83, 0x85, 0x90, 0x91, 0x83, 0x1f, 0x93, 0x81,\n                                                          0x7f, 0x94, 0x7a, 0x96, 0xa, 0x70, 0xa, 0x76,\n                                                          0x96, 0x83, 0x97, 0x83, 0x1f, 0x9a, 0x82, 0x9b,\n                                                          0x84, 0x74, 0xa7, 0xa, 0xe, 0xab, 0x4f, 0x76,\n                                                          0xf8, 0x55, 0xc7, 0x1, 0xba, 0xa, 0xb1, 0xb2,\n                                                          0x71, 0x74, 0xb2, 0x1f, 0x78, 0xac, 0xad, 0x79,\n                                                          0xad, 0xaf, 0xa, 0x81, 0x8e, 0x83, 0x8e, 0x85,\n                                                          0x1f, 0x8f, 0x83, 0x8f, 0x85, 0x85, 0x1a, 0x7e,\n                                                          0x7b, 0x88, 0x7f, 0x81, 0x74, 0x8b, 0xac, 0x75,\n                                                          0x1e, 0xce, 0x5f, 0x50, 0xac, 0x6b, 0x1b, 0xf7,\n                                                          0xb6, 0xf7, 0xec, 0x5, 0xca, 0xa, 0x8e, 0x94,\n                                                          0xc3, 0xdd, 0x1e, 0xf7, 0x1c, 0x6, 0xe, 0xdd,\n                                                          0xa, 0xbe, 0xd6, 0x82, 0xd6, 0x13, 0xe0, 0xf7,\n                                                          0x47, 0xfb, 0x3a, 0x15, 0x6b, 0x93, 0x76, 0x9b,\n                                                          0xb9, 0x1a, 0x13, 0xd0, 0xb3, 0xcd, 0xf7, 0x61,\n                                                          0xb4, 0x1a, 0xb3, 0x69, 0x9b, 0x78, 0x93, 0x1e,\n                                                          0x8c, 0x8d, 0xcf, 0x9c, 0xa2, 0xb2, 0x9e, 0xd3,\n                                                          0x19, 0xb8, 0xf7, 0x3c, 0x5, 0xe6, 0xa3, 0xc0,\n                                                          0xac, 0xab, 0x1b, 0x8e, 0x96, 0x5, 0x2f, 0x50,\n                                                          0x7c, 0xfb, 0xc, 0x69, 0x1f, 0x5a, 0xfb, 0x3e,\n                                                          0x79, 0x4b, 0x77, 0x5e, 0x45, 0x79, 0x19, 0xb6,\n                                                          0x7d, 0x94, 0x78, 0x6d, 0x1a, 0x13, 0xe0, 0x52,\n                                                          0x49, 0xfb, 0x49, 0x5a, 0x1a, 0x54, 0xaa, 0x70,\n                                                          0xe9, 0x1e, 0xe, 0x39, 0xfb, 0x27, 0x76, 0xf7,\n                                                          0x3f, 0xe0, 0xa, 0x9a, 0xfb, 0x3c, 0x15, 0xb6,\n                                                          0x6, 0xf7, 0x6c, 0xf9, 0xd6, 0x5, 0x62, 0x6,\n                                                          0xe, 0xdd, 0xa, 0xf7, 0xa6, 0xd6, 0x42, 0xd6,\n                                                          0x13, 0xd0, 0x87, 0xfb, 0x3a, 0x15, 0x88, 0x80,\n                                                          0x5, 0xe7, 0xc9, 0x9a, 0xf7, 0xc, 0xac, 0x1f,\n                                                          0xba, 0xf7, 0x3e, 0x9c, 0xcb, 0xa0, 0xb8, 0xd1,\n                                                          0x9d, 0x19, 0x60, 0x99, 0x82, 0x9e, 0xa9, 0x1a,\n                                                          0x13, 0xe0, 0xc4, 0xcd, 0xf7, 0x49, 0xbc, 0x1a,\n                                                          0xc2, 0x6c, 0xa6, 0x2d, 0x1e, 0x88, 0x80, 0x5,\n                                                          0xa1, 0xaa, 0x73, 0x5d, 0x1f, 0x13, 0xd0, 0x63,\n                                                          0x49, 0xfb, 0x61, 0x62, 0x1a, 0x63, 0xad, 0x7b,\n                                                          0x9e, 0x83, 0x1e, 0x8a, 0x89, 0x47, 0x7a, 0x74,\n                                                          0x64, 0x78, 0x43, 0x19, 0x5e, 0xfb, 0x3c, 0x5,\n                                                          0x31, 0x73, 0x56, 0x69, 0x6b, 0x1b, 0xe, 0xf7,\n                                                          0x4c, 0xf7, 0x4f, 0xcb, 0x5c, 0x76, 0xd3, 0xcb,\n                                                          0x8f, 0x77, 0x12, 0xb3, 0xf8, 0x62, 0x13, 0x68,\n                                                          0xd7, 0xf7, 0x4b, 0x15, 0xae, 0x9b, 0xa3, 0xb0,\n                                                          0xb7, 0x1b, 0xb9, 0xa9, 0x7d, 0x7b, 0xa7, 0x1f,\n                                                          0x13, 0x98, 0x79, 0xac, 0xa9, 0x77, 0xbd, 0x1b,\n                                                          0xc9, 0xac, 0xb7, 0xb5, 0xa9, 0x1f, 0x67, 0xbd,\n                                                          0x5, 0x68, 0x74, 0x72, 0x66, 0x63, 0x1b, 0x69,\n                                                          0x6c, 0x99, 0x9b, 0x6c, 0x1f, 0x13, 0x68, 0x9d,\n                                                          0x67, 0x66, 0x9f, 0x5f, 0x1b, 0x48, 0x67, 0x5f,\n                                                          0x61, 0x75, 0x1f, 0xe, 0xab, 0xfb, 0x4c, 0x76,\n                                                          0xf8, 0xd0, 0xf5, 0x1, 0xf7, 0x6c, 0xf5, 0x3,\n                                                          0xf7, 0x6c, 0xf8, 0x38, 0x15, 0x6e, 0xa3, 0x73,\n                                                          0xa8, 0xa8, 0xa3, 0xa3, 0xa8, 0xa8, 0x73, 0xa3,\n                                                          0x6e, 0x6e, 0x73, 0x73, 0x6e, 0x1e, 0x94, 0xfb,\n                                                          0x1a, 0x15, 0x51, 0xfb, 0x32, 0x58, 0xfb, 0xa,\n                                                          0x5f, 0xfb, 0x10, 0x8, 0x84, 0x78, 0x85, 0x7d,\n                                                          0x7c, 0x1a, 0x75, 0x9e, 0x76, 0x9d, 0xb5, 0x95,\n                                                          0x9c, 0xc0, 0x96, 0x1e, 0xa5, 0xf7, 0x10, 0xa2,\n                                                          0xf7, 0x18, 0xad, 0xf7, 0x35, 0x8, 0xe, 0x81,\n                                                          0xae, 0x80, 0x76, 0xf8, 0x3c, 0xa2, 0x12, 0xd8,\n                                                          0xe1, 0x13, 0xb0, 0xf7, 0x1d, 0xfb, 0x23, 0xb7,\n                                                          0xa, 0xba, 0xf7, 0x19, 0x5, 0xf7, 0x16, 0xb5,\n                                                          0xdb, 0xa5, 0xa5, 0x1f, 0x7b, 0x95, 0x5, 0x64,\n                                                          0x69, 0x57, 0x61, 0x57, 0x1b, 0x13, 0x70, 0x81,\n                                                          0x80, 0x8c, 0x8e, 0x81, 0x1f, 0xf7, 0x1d, 0xf8,\n                                                          0x1b, 0x5, 0x9c, 0x9d, 0x85, 0x7d, 0x82, 0x87,\n                                                          0x82, 0x87, 0x81, 0x1f, 0x88, 0x82, 0x87, 0x81,\n                                                          0x7f, 0x97, 0xa, 0xa9, 0x74, 0xbd, 0x3e, 0x1e,\n                                                          0xb5, 0xf7, 0xc, 0x5, 0x6d, 0x6, 0x61, 0xfb,\n                                                          0xc, 0x5, 0x13, 0x50, 0xfb, 0x12, 0xfb, 0x1f,\n                                                          0xfb, 0x32, 0xfb, 0x1b, 0x1f, 0x13, 0x70, 0xfb,\n                                                          0x6, 0xd3, 0x63, 0xaf, 0x1e, 0x9c, 0xbb, 0x15,\n                                                          0x71, 0x9e, 0x7e, 0xaf, 0xbe, 0x1a, 0xf2, 0xe2,\n                                                          0xf7, 0x3b, 0xdf, 0x1e, 0xe, 0x7b, 0xa1, 0x7f,\n                                                          0xd3, 0xa9, 0xa7, 0xf7, 0x61, 0xb5, 0xf7, 0xa2,\n                                                          0xa8, 0x12, 0x13, 0xb8, 0xf7, 0x34, 0xf7, 0x7,\n                                                          0x15, 0x96, 0x63, 0x8b, 0x8b, 0x76, 0x1b, 0x49,\n                                                          0x74, 0x5f, 0x79, 0x59, 0xa7, 0x77, 0xb2, 0xb7,\n                                                          0xa7, 0xaf, 0xa6, 0xa1, 0x1f, 0x4e, 0xd6, 0xb3,\n                                                          0x89, 0xaa, 0x1b, 0xf3, 0xad, 0xe5, 0x92, 0x8d,\n                                                          0x1f, 0x80, 0x94, 0x5, 0x13, 0x78, 0x70, 0x66,\n                                                          0x66, 0x84, 0x68, 0x1b, 0x56, 0x55, 0x9d, 0x9f,\n                                                          0x6a, 0x1f, 0xb8, 0xec, 0x91, 0xa4, 0xa4, 0xf2,\n                                                          0x8, 0xf7, 0x12, 0x6, 0x92, 0xb5, 0x5, 0xfb,\n                                                          0xf, 0x6, 0x9d, 0xed, 0x96, 0xc9, 0xa3, 0xc2,\n                                                          0x8, 0xa1, 0x95, 0x9b, 0xac, 0xb4, 0x1b, 0xa2,\n                                                          0x97, 0x7e, 0x6c, 0x8f, 0x1f, 0x6d, 0x8e, 0x93,\n                                                          0x7d, 0xa4, 0x1b, 0x9e, 0x9f, 0x93, 0xad, 0xb1,\n                                                          0x6b, 0xb0, 0x50, 0xfb, 0x3e, 0x56, 0xfb, 0x76,\n                                                          0x42, 0x82, 0x1f, 0xfb, 0x2, 0x6, 0x82, 0x61,\n                                                          0x5, 0xf7, 0x5, 0x6, 0x61, 0xfb, 0x94, 0x15,\n                                                          0x13, 0xb8, 0x6c, 0x83, 0x67, 0x71, 0x73, 0x1b,\n                                                          0x69, 0x7f, 0xa0, 0x9b, 0x90, 0x8e, 0xb3, 0xbd,\n                                                          0xa5, 0x99, 0x81, 0x7c, 0xa0, 0x1f, 0xe, 0xf7,\n                                                          0x18, 0xc4, 0xf7, 0xa4, 0xc4, 0x1, 0xc4, 0xc8,\n                                                          0xf7, 0x9c, 0xc8, 0x3, 0xf7, 0xa, 0xf7, 0xda,\n                                                          0x15, 0xd3, 0xc4, 0xca, 0xd7, 0xd6, 0xc3, 0x4c,\n                                                          0x43, 0x41, 0x53, 0x4c, 0x40, 0x3f, 0x52, 0xca,\n                                                          0xd5, 0x1e, 0x47, 0xfb, 0x8a, 0x15, 0xe2, 0xe3,\n                                                          0x5, 0x73, 0xa5, 0xb9, 0x7f, 0xb7, 0x1b, 0xb6,\n                                                          0xb5, 0x97, 0xa3, 0xa4, 0x1f, 0xe4, 0x33, 0xb6,\n                                                          0xb8, 0x34, 0xe2, 0x5, 0xa2, 0xa6, 0x97, 0xb6,\n                                                          0xb6, 0x1a, 0xb6, 0x80, 0xb6, 0x73, 0xa6, 0x1e,\n                                                          0xe2, 0xe4, 0x60, 0xb6, 0x32, 0x34, 0x5, 0xa3,\n                                                          0x71, 0x5f, 0x96, 0x60, 0x1b, 0x60, 0x5f, 0x7f,\n                                                          0x74, 0x71, 0x1f, 0x34, 0xe2, 0x5e, 0x60, 0xe3,\n                                                          0x32, 0x5, 0x73, 0x71, 0x7f, 0x5f, 0x5f, 0x1a,\n                                                          0x60, 0x97, 0x60, 0xa3, 0x71, 0x1e, 0x33, 0x34,\n                                                          0x5, 0xe, 0xa0, 0x76, 0xf7, 0x4a, 0xb3, 0xe5,\n                                                          0xb3, 0xf7, 0xc1, 0x77, 0x1, 0xbf, 0x16, 0xf7,\n                                                          0xb1, 0x9b, 0x6, 0x53, 0x6a, 0xa0, 0xb7, 0x91,\n                                                          0x8c, 0x91, 0x8d, 0x91, 0x1f, 0x92, 0xa7, 0x8f,\n                                                          0x96, 0x99, 0xb7, 0x8, 0xf7, 0x48, 0x6, 0x97,\n                                                          0xb3, 0x5, 0xfb, 0x48, 0x6, 0xa3, 0xdd, 0x91,\n                                                          0x93, 0x5, 0xf7, 0x3e, 0x6, 0x97, 0xb3, 0x5,\n                                                          0xfb, 0x2b, 0x6, 0xf7, 0x32, 0xf7, 0x74, 0x5,\n                                                          0xb3, 0xab, 0xaa, 0xa0, 0x95, 0x1b, 0xe8, 0xa,\n                                                          0xa8, 0xab, 0x7c, 0x74, 0x84, 0x89, 0x83, 0x87,\n                                                          0x83, 0x1f, 0x77, 0x64, 0x35, 0xfb, 0x1a, 0x5c,\n                                                          0x53, 0x72, 0xe7, 0x61, 0xf5, 0x86, 0xa5, 0x8,\n                                                          0x89, 0x95, 0x8a, 0x94, 0x93, 0x1a, 0xaa, 0x9f,\n                                                          0x93, 0xbf, 0xcd, 0xa, 0xa3, 0xb7, 0x8d, 0x47,\n                                                          0x9f, 0x1f, 0xd4, 0xfb, 0x6f, 0x5, 0xfb, 0x20,\n                                                          0x6, 0x7f, 0x63, 0x5, 0xf7, 0x37, 0x6, 0x8e,\n                                                          0x81, 0x74, 0x3b, 0x5, 0xfb, 0x38, 0x6, 0x7f,\n                                                          0x63, 0x5, 0xf7, 0x39, 0x6, 0x73, 0x39, 0x5,\n                                                          0x48, 0x77, 0x50, 0x7a, 0x6a, 0x1b, 0xe, 0x39,\n                                                          0x8e, 0xe0, 0xa, 0xf7, 0x36, 0xf8, 0x1c, 0x15,\n                                                          0xb3, 0x6, 0xdd, 0xf7, 0xa6, 0x5, 0x65, 0x6,\n                                                          0xfb, 0x5d, 0xfd, 0x40, 0x15, 0xb5, 0x6, 0xd5,\n                                                          0xf7, 0x93, 0x5, 0x5e, 0x6, 0xe, 0xfb, 0x29,\n                                                          0xa0, 0xf7, 0x78, 0xa0, 0xf7, 0x9f, 0xa0, 0xe8,\n                                                          0xf7, 0x38, 0x7c, 0xa0, 0x12, 0xc0, 0xf2, 0x49,\n                                                          0xc4, 0xb0, 0xc8, 0xb5, 0xc5, 0xab, 0xc5, 0x13,\n                                                          0xed, 0xc0, 0xf7, 0xae, 0xf3, 0x15, 0x8d, 0x8e,\n                                                          0x5, 0x86, 0x96, 0x90, 0x89, 0xa0, 0x1b, 0xcf,\n                                                          0xb9, 0xc2, 0xd1, 0xc5, 0x70, 0xb3, 0x7d, 0x9c,\n                                                          0x1f, 0xfb, 0xf, 0xf7, 0x2a, 0x5, 0x7c, 0x9e,\n                                                          0x80, 0xa3, 0xa7, 0x1a, 0xca, 0xba, 0xa0, 0xbb,\n                                                          0xac, 0xa3, 0x7c, 0x7b, 0x81, 0x80, 0x82, 0x82,\n                                                          0x7f, 0x1e, 0x83, 0x81, 0x85, 0x80, 0x7b, 0x1a,\n                                                          0x13, 0xf3, 0xc0, 0x79, 0x98, 0x71, 0xac, 0xb6,\n                                                          0x94, 0xb7, 0xa0, 0xc0, 0x5c, 0xb9, 0x38, 0x41,\n                                                          0x42, 0x61, 0x37, 0x5e, 0xa3, 0x60, 0xb6, 0x58,\n                                                          0x1e, 0x89, 0x88, 0x5, 0x95, 0x76, 0x70, 0x8c,\n                                                          0x86, 0x1b, 0x55, 0x57, 0x5a, 0x3d, 0x60, 0xa4,\n                                                          0x56, 0xb9, 0x56, 0x1f, 0xd7, 0x34, 0x5, 0xb6,\n                                                          0x5a, 0x92, 0x76, 0x6f, 0x1a, 0x5a, 0x66, 0x63,\n                                                          0x47, 0x67, 0x6b, 0x9e, 0x9c, 0x95, 0x95, 0x92,\n                                                          0x95, 0x94, 0x1e, 0x13, 0xed, 0xc0, 0x96, 0x95,\n                                                          0x96, 0x97, 0xa4, 0x1a, 0xad, 0x73, 0x95, 0x75,\n                                                          0x52, 0x8b, 0x51, 0x80, 0x5c, 0xba, 0x51, 0xe7,\n                                                          0xd5, 0xda, 0xbe, 0xdf, 0xbe, 0x76, 0xa5, 0x61,\n                                                          0xc1, 0x1e, 0x13, 0xeb, 0xc0, 0xfb, 0x1b, 0xf7,\n                                                          0x6e, 0x15, 0xb5, 0xae, 0xa3, 0xa9, 0xa9, 0xa6,\n                                                          0x80, 0x4a, 0xbe, 0x1e, 0xbf, 0x49, 0x90, 0x6e,\n                                                          0x71, 0x1a, 0x58, 0x5f, 0x78, 0x75, 0x52, 0x20,\n                                                          0xf7, 0x17, 0xd1, 0x1e, 0xe, 0x73, 0xf8, 0x90,\n                                                          0xed, 0x1, 0xf6, 0xc6, 0xa, 0x3, 0xf6, 0xf8,\n                                                          0xc1, 0x23, 0xa, 0xf8, 0x27, 0x79, 0xb5, 0xf7,\n                                                          0x4, 0x9f, 0xf7, 0xef, 0x9f, 0xf0, 0xb5, 0x1,\n                                                          0xb4, 0xc2, 0xea, 0xd8, 0xf7, 0x89, 0x9b, 0xf7,\n                                                          0x1b, 0xc2, 0x3, 0xb4, 0xf7, 0xd7, 0x15, 0xfb,\n                                                          0x51, 0xf7, 0x29, 0xfb, 0x2c, 0xf7, 0x54, 0xf7,\n                                                          0x52, 0xf7, 0x27, 0xf7, 0x2c, 0xf7, 0x51, 0xf7,\n                                                          0x51, 0xfb, 0x27, 0xf7, 0x2e, 0xfb, 0x52, 0xfb,\n                                                          0x54, 0xfb, 0x29, 0xfb, 0x2e, 0xfb, 0x51, 0x1e,\n                                                          0xc2, 0x16, 0xf7, 0x33, 0xf7, 0x11, 0xf7, 0x22,\n                                                          0xf7, 0x35, 0xf7, 0x32, 0xf7, 0x10, 0xfb, 0x21,\n                                                          0xfb, 0x34, 0xfb, 0x33, 0xfb, 0x11, 0xfb, 0x20,\n                                                          0xfb, 0x31, 0xfb, 0x34, 0xfb, 0x12, 0xf7, 0x20,\n                                                          0xf7, 0x33, 0x1e, 0xf8, 0x47, 0x42, 0x15, 0x5e,\n                                                          0x78, 0x66, 0x5a, 0x49, 0x1b, 0x26, 0x62, 0xd7,\n                                                          0xf3, 0x8c, 0x1f, 0xeb, 0x8c, 0xb5, 0xd2, 0xe8,\n                                                          0x1b, 0xd8, 0xa6, 0x5d, 0x61, 0x90, 0x1f, 0x9b,\n                                                          0xd0, 0x6, 0x93, 0x86, 0x93, 0x7b, 0x90, 0x1e,\n                                                          0x93, 0x71, 0x72, 0x95, 0x59, 0x1b, 0xfb, 0x2a,\n                                                          0x49, 0xfb, 0x1, 0x39, 0xfb, 0x20, 0xea, 0x53,\n                                                          0xf7, 0x6, 0xb9, 0xb2, 0x95, 0x92, 0x9e, 0x1f,\n                                                          0x9b, 0x8f, 0x94, 0x8e, 0x8c, 0x97, 0x9c, 0xd9,\n                                                          0x18, 0xe, 0x3a, 0xf8, 0x2a, 0xad, 0xf7, 0x80,\n                                                          0x77, 0x12, 0xb5, 0xd4, 0xf7, 0x26, 0xaf, 0x13,\n                                                          0xe0, 0xf7, 0x87, 0xf8, 0x7a, 0x15, 0x80, 0x70,\n                                                          0x88, 0x7e, 0x7d, 0x1a, 0x81, 0x90, 0x7b, 0xa6,\n                                                          0xa7, 0xa1, 0xa1, 0xb7, 0xb2, 0x1e, 0x13, 0x70,\n                                                          0x84, 0x95, 0x5, 0x6f, 0x71, 0x7e, 0x80, 0x84,\n                                                          0x1b, 0x86, 0x8e, 0x9a, 0x99, 0x8e, 0x1f, 0x13,\n                                                          0xe0, 0x90, 0xa9, 0xba, 0xf7, 0x3a, 0x8d, 0x92,\n                                                          0x56, 0x8a, 0x18, 0x7f, 0x64, 0x5, 0x89, 0x6,\n                                                          0x9b, 0x89, 0x7a, 0xa4, 0x65, 0x1b, 0x35, 0x27,\n                                                          0xfb, 0x3, 0x33, 0x79, 0x92, 0x56, 0xd1, 0xb8,\n                                                          0xac, 0x9d, 0xca, 0xb7, 0x1f, 0xfb, 0x12, 0x89,\n                                                          0x15, 0xbd, 0xcc, 0xf7, 0xf, 0xd2, 0x98, 0x90,\n                                                          0x81, 0x64, 0x87, 0x1e, 0x5a, 0x86, 0x57, 0xfb,\n                                                          0xc, 0x4a, 0x1b, 0x83, 0x77, 0x95, 0xae, 0x1f,\n                                                          0xe, 0xce, 0xa, 0xc0, 0xf7, 0x6c, 0x68, 0xa,\n                                                          0x93, 0x78, 0xbb, 0x75, 0xbd, 0x1f, 0x81, 0xa2,\n                                                          0x80, 0xa3, 0x81, 0x9e, 0xa1, 0xa2, 0x9e, 0x9f,\n                                                          0x9b, 0x9c, 0x8, 0xd6, 0xdc, 0x99, 0xa2, 0x99,\n                                                          0x69, 0xa, 0xf7, 0x36, 0x82, 0x68, 0xa, 0x93,\n                                                          0x76, 0xc2, 0x73, 0xc0, 0x1f, 0x82, 0x9f, 0x82,\n                                                          0x9e, 0x82, 0x9c, 0xa2, 0xa3, 0x9f, 0xa0, 0x9c,\n                                                          0x9d, 0x8, 0xd4, 0xd9, 0x98, 0xa2, 0x99, 0x69,\n                                                          0xa, 0xe, 0xf7, 0xd2, 0xf7, 0x15, 0x76, 0xf7,\n                                                          0x84, 0xb1, 0x12, 0xf8, 0x92, 0xcf, 0x6d, 0xb5,\n                                                          0x13, 0xe0, 0xe1, 0xf7, 0xf0, 0x15, 0x13, 0xd0,\n                                                          0xf8, 0x62, 0xfb, 0x84, 0xb5, 0xf7, 0xaa, 0xfc,\n                                                          0x8c, 0x6, 0xe, 0xf8, 0x27, 0x79, 0xb5, 0xf7,\n                                                          0xe, 0x9a, 0x7c, 0xf7, 0x35, 0xfb, 0x35, 0xf7,\n                                                          0x47, 0xfb, 0x3e, 0xf7, 0x3e, 0xf7, 0x3b, 0xf7,\n                                                          0x42, 0x51, 0xb5, 0x71, 0xb5, 0x12, 0xb4, 0xc2,\n                                                          0x5f, 0xc2, 0xf7, 0x36, 0xcb, 0xf3, 0xce, 0x4e,\n                                                          0xce, 0xf7, 0x2e, 0xc2, 0x13, 0x92, 0x74, 0xf7,\n                                                          0xe1, 0xf7, 0xd9, 0x15, 0x13, 0x94, 0x74, 0xf7,\n                                                          0x3b, 0xb4, 0x7, 0x13, 0x92, 0x6c, 0xb1, 0xaa,\n                                                          0x78, 0x52, 0x56, 0x78, 0x65, 0x5a, 0x1f, 0x13,\n                                                          0x92, 0xb4, 0xfb, 0xe2, 0x16, 0xfb, 0x51, 0xf7,\n                                                          0x29, 0xfb, 0x2e, 0xf7, 0x54, 0xf7, 0x52, 0xf7,\n                                                          0x27, 0xf7, 0x2f, 0xf7, 0x51, 0x1e, 0x13, 0x91,\n                                                          0x74, 0xf7, 0x51, 0xfb, 0x27, 0xf7, 0x2b, 0xfb,\n                                                          0x52, 0x1e, 0x13, 0x92, 0xb4, 0xfb, 0x54, 0xfb,\n                                                          0x29, 0xfb, 0x2c, 0xfb, 0x51, 0x1f, 0xc2, 0x16,\n                                                          0x13, 0x91, 0x74, 0xf7, 0x33, 0xf7, 0x11, 0xf7,\n                                                          0x20, 0xf7, 0x35, 0xf7, 0x32, 0xf7, 0x10, 0xfb,\n                                                          0x1e, 0xfb, 0x34, 0xfb, 0x33, 0xfb, 0x11, 0xfb,\n                                                          0x23, 0xfb, 0x31, 0x1e, 0x13, 0x92, 0xb4, 0xfb,\n                                                          0x34, 0xfb, 0x12, 0xf7, 0x22, 0xf7, 0x33, 0x1f,\n                                                          0xf7, 0x11, 0xfb, 0x47, 0x15, 0xf7, 0x34, 0x6,\n                                                          0x13, 0xc2, 0x74, 0x9a, 0x7, 0x59, 0x90, 0x8d,\n                                                          0x8b, 0xb6, 0x1a, 0x13, 0xa2, 0x74, 0xed, 0xba,\n                                                          0x7, 0x2e, 0xca, 0xa4, 0x47, 0xab, 0x1b, 0xca,\n                                                          0x6, 0x13, 0x8a, 0x74, 0x94, 0x7, 0x78, 0x99,\n                                                          0x6d, 0xad, 0x71, 0xaf, 0x52, 0xd9, 0x18, 0x13,\n                                                          0xc2, 0x6c, 0xb8, 0x9a, 0xad, 0xb1, 0xbe, 0x1a,\n                                                          0xc9, 0x54, 0xa7, 0x50, 0x1e, 0xfb, 0x43, 0x7c,\n                                                          0x6, 0xbc, 0x86, 0x8a, 0x8c, 0x5f, 0x1a, 0xfb,\n                                                          0x83, 0x7, 0x60, 0x8c, 0x8b, 0x5a, 0x86, 0x1e,\n                                                          0xe, 0x73, 0xf8, 0xa8, 0xbe, 0x1, 0xee, 0xf7,\n                                                          0xcc, 0x3, 0xee, 0xf8, 0xa8, 0x15, 0xf7, 0xbf,\n                                                          0x6, 0x98, 0xbe, 0x5, 0xfb, 0xbf, 0x6, 0xe,\n                                                          0xb6, 0xf8, 0x1a, 0xad, 0xf7, 0x6e, 0xad, 0x1,\n                                                          0xf0, 0xb2, 0xf7, 0x64, 0xb2, 0x3, 0xf7, 0x20,\n                                                          0xf8, 0xab, 0x15, 0xc5, 0xb9, 0xbc, 0xc5, 0xc5,\n                                                          0xb9, 0x5c, 0x51, 0x51, 0x5d, 0x54, 0x51, 0x51,\n                                                          0x5d, 0xc0, 0xc5, 0x1e, 0x64, 0x16, 0x3b, 0xca,\n                                                          0x4a, 0xdb, 0xdb, 0xca, 0xce, 0xdb, 0xdb, 0x4c,\n                                                          0xc6, 0x3b, 0x3b, 0x4c, 0x4e, 0x3b, 0x1e, 0xe,\n                                                          0xf7, 0xd2, 0x8b, 0xce, 0xf7, 0x69, 0xcf, 0x54,\n                                                          0xb8, 0xf7, 0x3c, 0x77, 0x12, 0xf7, 0xc5, 0xcf,\n                                                          0x53, 0xb6, 0x13, 0xd8, 0xe1, 0x16, 0xf8, 0x8c,\n                                                          0xb5, 0xfc, 0x8c, 0x6, 0x13, 0xb8, 0xf7, 0x8f,\n                                                          0x4, 0x13, 0xb4, 0xf7, 0x7b, 0xfb, 0x3f, 0xb6,\n                                                          0xf7, 0x3f, 0xf7, 0x7a, 0xb8, 0xfb, 0x7a, 0xf7,\n                                                          0x3c, 0x60, 0xfb, 0x3c, 0xfb, 0x7b, 0x6, 0xe,\n                                                          0x52, 0xf7, 0xa3, 0xc0, 0xf7, 0xc1, 0xbe, 0x1,\n                                                          0xac, 0xf7, 0xa3, 0xc1, 0xa, 0x77, 0x7e, 0x60,\n                                                          0x1b, 0x29, 0x95, 0xa, 0xc2, 0x46, 0x79, 0x36,\n                                                          0x89, 0x75, 0xa, 0xe, 0x52, 0xf7, 0xa0, 0xb2,\n                                                          0x64, 0xd8, 0xf7, 0x24, 0x94, 0x82, 0xf7, 0x4f,\n                                                          0x6b, 0xab, 0x12, 0xf7, 0x82, 0xca, 0x6e, 0xce,\n                                                          0x13, 0x54, 0xf7, 0x11, 0xf8, 0x7d, 0x15, 0xc3,\n                                                          0xc4, 0x79, 0x37, 0x47, 0x4e, 0x77, 0x75, 0x7c,\n                                                          0x84, 0x95, 0x95, 0x83, 0x1f, 0x98, 0x81, 0x80,\n                                                          0x98, 0x70, 0x1b, 0x13, 0xac, 0x6c, 0x88, 0xa5,\n                                                          0xa, 0x7b, 0x93, 0x1f, 0x87, 0x8d, 0x5, 0x13,\n                                                          0x6a, 0xc9, 0xa, 0x66, 0x5a, 0x72, 0x67, 0x7b,\n                                                          0x1e, 0x83, 0xa, 0x73, 0xf8, 0x97, 0x76, 0xf7,\n                                                          0x3e, 0x77, 0x1, 0xf7, 0x48, 0xad, 0xa, 0xf7,\n                                                          0x33, 0xeb, 0x9f, 0xa, 0x9d, 0x9c, 0x9a, 0x1a,\n                                                          0x9d, 0x7d, 0x9c, 0x76, 0x80, 0x76, 0x7d, 0x9d,\n                                                          0xa, 0xe, 0xfb, 0x50, 0x76, 0xf7, 0x5b, 0xc2,\n                                                          0xf8, 0x13, 0x77, 0x1, 0x6d, 0xf4, 0xf7, 0x99,\n                                                          0xde, 0x3, 0xd9, 0xc7, 0x15, 0x4f, 0x9d, 0xbf,\n                                                          0x81, 0xaa, 0x1b, 0xbe, 0xcc, 0xb9, 0xbe, 0xb2,\n                                                          0x1f, 0x8d, 0x6, 0x89, 0x81, 0x85, 0x77, 0x81,\n                                                          0x1a, 0x68, 0x9d, 0x75, 0xaf, 0xaf, 0xa9, 0x95,\n                                                          0xba, 0xb7, 0x1e, 0x8e, 0x94, 0x5, 0x76, 0x71,\n                                                          0x7b, 0x86, 0x7c, 0x1b, 0x67, 0x98, 0xb4, 0xa0,\n                                                          0x8f, 0x1f, 0xd9, 0xf7, 0xe4, 0x5, 0x33, 0x6,\n                                                          0x47, 0xfb, 0xc3, 0x5, 0x72, 0x7a, 0x53, 0x54,\n                                                          0x58, 0x1b, 0x4f, 0x77, 0xb8, 0xc1, 0x96, 0x1f,\n                                                          0xce, 0xf7, 0xb0, 0x5, 0x33, 0x6, 0x36, 0xfc,\n                                                          0xa, 0x84, 0x6b, 0x7f, 0x68, 0x7c, 0x6a, 0x19,\n                                                          0x7d, 0x6c, 0x73, 0x66, 0x5a, 0x1a, 0x72, 0x91,\n                                                          0x76, 0xa7, 0xcb, 0x92, 0xf7, 0x0, 0xaf, 0xb4,\n                                                          0x87, 0xb4, 0x8f, 0xb6, 0x1e, 0xe, 0xf7, 0x3a,\n                                                          0xfb, 0x57, 0x76, 0xf9, 0xe7, 0xa6, 0x1, 0xf7,\n                                                          0x17, 0xfb, 0x6c, 0x15, 0xaf, 0x6, 0xf7, 0x88,\n                                                          0xf9, 0xe7, 0x5, 0xe6, 0x6, 0xfb, 0x88, 0xfd,\n                                                          0xe7, 0x5, 0xae, 0x6, 0xf7, 0x88, 0xf9, 0xe7,\n                                                          0x5, 0xcc, 0x6, 0x93, 0xa6, 0x5, 0xfb, 0x7a,\n                                                          0x6, 0xfb, 0x8a, 0x5c, 0xfb, 0x44, 0x4c, 0xfb,\n                                                          0x4, 0xed, 0x7a, 0xe7, 0x1f, 0xe, 0x20, 0xf7,\n                                                          0x5b, 0xf7, 0x3, 0x1, 0xd1, 0xf7, 0x3, 0x3,\n                                                          0xd1, 0xf7, 0x92, 0x84, 0xa, 0x73, 0xfb, 0x6d,\n                                                          0xaf, 0xf7, 0x49, 0x77, 0x1, 0xf7, 0x0, 0xd5,\n                                                          0x3, 0xdc, 0x16, 0x4c, 0x21, 0x94, 0x83, 0x5,\n                                                          0x91, 0x96, 0x9b, 0x8e, 0x99, 0x1b, 0xa0, 0x9e,\n                                                          0x81, 0x74, 0x6f, 0x6b, 0x7c, 0x68, 0x78, 0x77,\n                                                          0x8f, 0x95, 0x7c, 0x1f, 0x7a, 0x6e, 0x5, 0x7e,\n                                                          0xa3, 0xaf, 0x83, 0xaf, 0x1b, 0xc6, 0xc4, 0xa2,\n                                                          0xcb, 0xb5, 0x67, 0xa4, 0x64, 0x80, 0x80, 0x8b,\n                                                          0x88, 0x81, 0x1f, 0xb7, 0xcd, 0x5, 0xe, 0x52,\n                                                          0xf7, 0xa3, 0x9b, 0xf7, 0x6, 0x76, 0xf7, 0xbc,\n                                                          0x77, 0x1, 0xb6, 0xf7, 0x7f, 0x3, 0xb6, 0xf7,\n                                                          0xa3, 0x15, 0xf7, 0x49, 0x9b, 0x6, 0x68, 0x7e,\n                                                          0x96, 0x9b, 0x9c, 0x96, 0xa4, 0x96, 0xae, 0x1f,\n                                                          0xdd, 0xf7, 0x9c, 0x5, 0x8e, 0x92, 0x8c, 0x90,\n                                                          0x8f, 0x1a, 0x8e, 0x89, 0x8d, 0x87, 0x83, 0x2e,\n                                                          0x78, 0x88, 0x6e, 0x1e, 0x78, 0x7, 0x8c, 0x9b,\n                                                          0x97, 0x8b, 0x93, 0x1b, 0x97, 0x91, 0x86, 0x82,\n                                                          0x83, 0x8a, 0x81, 0x88, 0x84, 0x1f, 0x4c, 0xfb,\n                                                          0x63, 0x73, 0x3b, 0x83, 0x84, 0x4f, 0x7b, 0x19,\n                                                          0xe, 0x5c, 0xf7, 0xb9, 0xa3, 0xe4, 0xa3, 0xf7,\n                                                          0x5d, 0xa1, 0x8c, 0xa1, 0x1, 0xce, 0xd4, 0xf7,\n                                                          0x29, 0xd4, 0x3, 0xce, 0xf8, 0x82, 0x15, 0xe3,\n                                                          0xe8, 0xe9, 0xef, 0xd8, 0xa4, 0x59, 0x63, 0x40,\n                                                          0x34, 0x22, 0x23, 0x43, 0x6b, 0xb0, 0xbe, 0x1e,\n                                                          0xd4, 0x81, 0x15, 0x6c, 0x97, 0x74, 0xa7, 0xcf,\n                                                          0xb4, 0xf7, 0xb, 0xbe, 0xa6, 0x84, 0xa6, 0x70,\n                                                          0x48, 0x5b, 0xfb, 0x4, 0x51, 0x1e, 0xe, 0xce,\n                                                          0xa, 0xc2, 0xf8, 0x1c, 0x3, 0xf7, 0xff, 0xf7,\n                                                          0x73, 0x15, 0x49, 0xa, 0xfb, 0x36, 0x16, 0x49,\n                                                          0xa, 0xe, 0xd9, 0xa, 0xf7, 0x10, 0x9b, 0xf8,\n                                                          0x19, 0x77, 0x12, 0xac, 0xf9, 0x53, 0x13, 0x68,\n                                                          0x67, 0xa, 0x13, 0xbc, 0x94, 0xa, 0x13, 0xa8,\n                                                          0xfb, 0xb2, 0xfb, 0x31, 0x8c, 0xa, 0xfc, 0xc9,\n                                                          0xfc, 0x29, 0x15, 0xf7, 0x49, 0x6, 0x13, 0x10,\n                                                          0x9b, 0x7, 0x13, 0x1c, 0x71, 0x74, 0x95, 0x9d,\n                                                          0x8d, 0x8b, 0x8d, 0xf4, 0xf7, 0xe4, 0x1f, 0x8d,\n                                                          0x92, 0x8d, 0x8f, 0x8f, 0x1a, 0x8e, 0x8a, 0x8e,\n                                                          0x86, 0xdc, 0xa, 0x8c, 0x9c, 0x97, 0x8b, 0x93,\n                                                          0x1b, 0xa7, 0x80, 0x72, 0x7d, 0x87, 0x1f, 0x32,\n                                                          0xfb, 0xa7, 0x85, 0x78, 0x71, 0x7f, 0x69, 0x87,\n                                                          0x19, 0xe, 0xf8, 0x1d, 0x8b, 0xc0, 0x61, 0x76,\n                                                          0xf8, 0x0, 0xbf, 0xf7, 0xa2, 0x77, 0x12, 0xad,\n                                                          0xf7, 0x83, 0xfb, 0x24, 0xbe, 0xf8, 0x8c, 0xcc,\n                                                          0x13, 0x76, 0xf7, 0x15, 0x81, 0x8c, 0xa, 0x13,\n                                                          0xba, 0xfb, 0x12, 0xfd, 0x38, 0xc1, 0xa, 0x81,\n                                                          0x7e, 0x60, 0x1b, 0xfb, 0x0, 0x95, 0xa, 0xc3,\n                                                          0x46, 0x79, 0x36, 0x88, 0x75, 0xa, 0xfc, 0x3c,\n                                                          0xf7, 0x91, 0x15, 0xf7, 0x48, 0x6, 0x13, 0x0,\n                                                          0x9b, 0x7, 0x13, 0x18, 0x72, 0x6e, 0x96, 0x9b,\n                                                          0x90, 0x1f, 0xc8, 0xf7, 0x5d, 0xba, 0xf7, 0x2d,\n                                                          0x88, 0x1a, 0x8e, 0x8d, 0x93, 0x84, 0xdc, 0xa,\n                                                          0xb0, 0x8c, 0x5, 0x99, 0x8f, 0x86, 0x82, 0x7e,\n                                                          0x89, 0x88, 0x2f, 0xfb, 0xb0, 0x1f, 0x85, 0x78,\n                                                          0x72, 0x7f, 0x69, 0x87, 0x8, 0xe, 0xd9, 0xa,\n                                                          0xf7, 0xea, 0xf7, 0x4f, 0x12, 0xf7, 0x6e, 0xca,\n                                                          0x6e, 0xce, 0x13, 0x78, 0x67, 0xa, 0x94, 0xa,\n                                                          0x13, 0xb8, 0xfb, 0xb1, 0xfb, 0x31, 0x8c, 0xa,\n                                                          0xfc, 0x82, 0xfb, 0x4f, 0x15, 0xc3, 0xc4, 0x7e,\n                                                          0x32, 0x47, 0x4e, 0x77, 0x75, 0x7a, 0x7f, 0x98,\n                                                          0x97, 0x7f, 0x1f, 0x96, 0x80, 0x80, 0x95, 0x7d,\n                                                          0x1b, 0x68, 0x8b, 0xa5, 0xa, 0x77, 0x95, 0x1f,\n                                                          0x13, 0x74, 0xc9, 0xa, 0x1e, 0x13, 0x4, 0x66,\n                                                          0x5a, 0x72, 0x67, 0x7b, 0x1f, 0x83, 0xa, 0xfb,\n                                                          0x88, 0xa1, 0x12, 0xa5, 0xd5, 0xf7, 0x2c, 0xcb,\n                                                          0x55, 0xf5, 0x13, 0xe0, 0xf7, 0xb0, 0xf7, 0xb1,\n                                                          0x15, 0x73, 0x26, 0x54, 0x5f, 0x60, 0x68, 0x8,\n                                                          0x26, 0x39, 0x6a, 0x6c, 0x45, 0x1a, 0x41, 0xc2,\n                                                          0x56, 0xeb, 0x1e, 0xd2, 0xcd, 0xb2, 0xd2, 0xa8,\n                                                          0x7c, 0xa7, 0x73, 0x81, 0x6d, 0x86, 0x6d, 0x80,\n                                                          0x8f, 0x81, 0x8f, 0x81, 0x1f, 0x8f, 0x81, 0x8e,\n                                                          0x81, 0x7f, 0x1a, 0x5c, 0x4a, 0x8b, 0x86, 0x42,\n                                                          0x84, 0xc6, 0xa4, 0xd6, 0xba, 0xba, 0xbc, 0xc1,\n                                                          0x1e, 0xba, 0xbf, 0xbb, 0xc6, 0x93, 0xea, 0x8,\n                                                          0x13, 0xd0, 0x64, 0xf7, 0x1b, 0x15, 0x6e, 0xa3,\n                                                          0x85, 0xa, 0x73, 0x73, 0x6e, 0x1e, 0xe, 0x88,\n                                                          0xa, 0x58, 0x16, 0x9b, 0xa, 0x5f, 0x7d, 0xa0,\n                                                          0xa3, 0x9d, 0x93, 0xa8, 0xcf, 0xf7, 0xa, 0x1f,\n                                                          0xf7, 0x70, 0x6, 0xa2, 0xfb, 0x18, 0x8b, 0x82,\n                                                          0x82, 0x1a, 0x66, 0x74, 0x74, 0x53, 0x27, 0xa,\n                                                          0xc7, 0xf8, 0x4e, 0xb7, 0xa, 0xfb, 0x3, 0xf7,\n                                                          0x27, 0xc5, 0xa, 0x79, 0x8d, 0x56, 0xa, 0x9e,\n                                                          0x7f, 0x80, 0xa, 0x88, 0xa, 0xf7, 0xd3, 0xf9,\n                                                          0x56, 0x7f, 0xa, 0xfc, 0xa3, 0xfd, 0xf1, 0xe7,\n                                                          0xa, 0x64, 0x78, 0x9f, 0xa3, 0x9e, 0x94, 0xa2,\n                                                          0x96, 0xa0, 0x81, 0xa, 0xa1, 0xfb, 0x11, 0x8c,\n                                                          0x83, 0x82, 0x1a, 0x61, 0x78, 0x71, 0x4f, 0x27,\n                                                          0xa, 0xe, 0x5a, 0xa, 0xf7, 0x75, 0x77, 0x1,\n                                                          0x58, 0xf8, 0xfb, 0x3, 0xf7, 0x7f, 0x46, 0xa,\n                                                          0xfc, 0x4f, 0xfd, 0xfd, 0xe7, 0xa, 0x63, 0x79,\n                                                          0x9f, 0xa4, 0x9e, 0x94, 0xa1, 0x96, 0xa0, 0x81,\n                                                          0xa, 0xa3, 0xfb, 0x16, 0x8a, 0x82, 0x83, 0x1a,\n                                                          0x67, 0x71, 0x70, 0x56, 0x35, 0xa, 0x82, 0x68,\n                                                          0x7c, 0x19, 0xf7, 0x76, 0xf7, 0x8b, 0x4c, 0xa,\n                                                          0xe, 0x5a, 0xa, 0xdf, 0xac, 0xa, 0x13, 0xf4,\n                                                          0xf7, 0x83, 0xf9, 0x6d, 0x65, 0xa, 0x73, 0x97,\n                                                          0x96, 0x71, 0x1f, 0x13, 0xe8, 0x95, 0x73, 0x72,\n                                                          0x95, 0x71, 0x6c, 0xa, 0xfb, 0xb6, 0xfd, 0x6d,\n                                                          0xe7, 0xa, 0x64, 0x78, 0x9d, 0xa4, 0x9e, 0x94,\n                                                          0xa3, 0x96, 0xa0, 0x81, 0xa, 0xa1, 0xfb, 0x12,\n                                                          0x8c, 0x81, 0x84, 0x1a, 0x61, 0x70, 0x72, 0x57,\n                                                          0x27, 0xa, 0xe, 0x5a, 0xa, 0xd3, 0xed, 0x1,\n                                                          0xf7, 0x8a, 0xc6, 0xa, 0x3, 0x58, 0x16, 0x9b,\n                                                          0xa, 0x65, 0x77, 0xa0, 0x9f, 0xa3, 0x94, 0x9f,\n                                                          0x96, 0xa1, 0x81, 0xa, 0xa1, 0xfb, 0xf, 0x8c,\n                                                          0x7f, 0x84, 0x1a, 0x60, 0x72, 0x72, 0x55, 0x27,\n                                                          0xa, 0xfb, 0xf, 0xf8, 0x8f, 0x23, 0xa, 0x5a,\n                                                          0xa, 0xae, 0xf7, 0x3a, 0xab, 0xa, 0xf7, 0x39,\n                                                          0x12, 0x58, 0xf7, 0x4f, 0xf7, 0x28, 0xad, 0x69,\n                                                          0xf7, 0x39, 0xab, 0xa, 0xf7, 0x3a, 0x13, 0xf2,\n                                                          0x80, 0xf7, 0xb0, 0xf9, 0xa3, 0x15, 0x54, 0xb8,\n                                                          0x5e, 0xc2, 0x1e, 0x13, 0xe7, 0x20, 0xc2, 0xb8,\n                                                          0xb8, 0xc2, 0xc2, 0x5e, 0xb8, 0x54, 0x1f, 0x13,\n                                                          0xf2, 0x80, 0x54, 0x5e, 0x5e, 0x54, 0x1f, 0xad,\n                                                          0x16, 0xb3, 0xa, 0x13, 0xeb, 0x40, 0xe5, 0xa,\n                                                          0xfc, 0x5, 0xfd, 0xa3, 0xe7, 0xa, 0x65, 0x77,\n                                                          0xa0, 0x9f, 0xa3, 0x94, 0x9f, 0x96, 0xa1, 0x81,\n                                                          0xa, 0xa1, 0xfb, 0xf, 0x8c, 0x7f, 0x84, 0x1a,\n                                                          0x60, 0x72, 0x72, 0x55, 0x27, 0xa, 0xe, 0xf8,\n                                                          0xa8, 0x8b, 0xac, 0xf7, 0x5d, 0xb0, 0xc4, 0xe9,\n                                                          0xa, 0x1, 0xf9, 0x88, 0x9d, 0x3, 0x70, 0x16,\n                                                          0x9b, 0xa, 0x6e, 0x6a, 0x9b, 0xa2, 0xb2, 0xe4,\n                                                          0xe8, 0xad, 0xba, 0x1f, 0xf7, 0x52, 0x6, 0x5d,\n                                                          0xfb, 0x34, 0x7f, 0x63, 0x7b, 0x7f, 0x54, 0x85,\n                                                          0x19, 0x7b, 0xf8, 0x86, 0x7, 0xcb, 0xf7, 0x38,\n                                                          0x79, 0x90, 0x5, 0xfb, 0x3, 0x42, 0x49, 0x72,\n                                                          0xfb, 0x21, 0x1b, 0x6d, 0x6, 0x65, 0x81, 0x9f,\n                                                          0x9f, 0x9d, 0xba, 0xf7, 0x36, 0xa0, 0xd6, 0x1f,\n                                                          0xb3, 0x6, 0xeb, 0xa1, 0x84, 0x5d, 0x7b, 0x88,\n                                                          0x7a, 0x88, 0x7b, 0x1f, 0x9c, 0x87, 0xd0, 0xf7,\n                                                          0x7c, 0x79, 0x8f, 0x5, 0x2e, 0x60, 0x7c, 0x87,\n                                                          0xfb, 0x2d, 0x1b, 0xc8, 0xf7, 0x72, 0x5, 0xb0,\n                                                          0x95, 0x94, 0x8b, 0xc7, 0x1b, 0xf7, 0x4e, 0x81,\n                                                          0x76, 0x2a, 0x1f, 0x9c, 0x89, 0xac, 0xf7, 0x2d,\n                                                          0x5, 0xfc, 0x99, 0x7c, 0x6, 0xbd, 0x87, 0x99,\n                                                          0x8a, 0x72, 0x1a, 0x7d, 0x7a, 0x78, 0x7c, 0x79,\n                                                          0x1e, 0xfc, 0x16, 0xfc, 0x77, 0x71, 0x6b, 0x7a,\n                                                          0x77, 0x73, 0x85, 0x19, 0xf7, 0xa8, 0xf7, 0x93,\n                                                          0x15, 0xf7, 0x97, 0xf7, 0xde, 0x5, 0x91, 0x6,\n                                                          0x2f, 0xfb, 0xde, 0x5, 0xe, 0xf7, 0xca, 0xfb,\n                                                          0x58, 0x76, 0xf7, 0x5d, 0xb6, 0xd4, 0xa, 0x13,\n                                                          0xe8, 0xf7, 0x90, 0x21, 0x15, 0x93, 0x83, 0x5,\n                                                          0x91, 0x97, 0x9b, 0x8e, 0x9a, 0x1b, 0xa1, 0x9e,\n                                                          0x81, 0x74, 0x6e, 0x67, 0x7d, 0x67, 0x7a, 0x79,\n                                                          0xde, 0xa, 0xa3, 0xb0, 0x83, 0xaf, 0x1b, 0xc5,\n                                                          0xc4, 0xa3, 0xca, 0xb5, 0x67, 0xa4, 0x64, 0x80,\n                                                          0x81, 0x8b, 0x88, 0x80, 0x1f, 0xac, 0xbd, 0x5,\n                                                          0xf7, 0x1d, 0xde, 0xf4, 0xb5, 0xaf, 0x6f, 0xa,\n                                                          0x9d, 0x88, 0x5, 0x13, 0xd8, 0xb8, 0xa, 0x7f,\n                                                          0x76, 0x92, 0x91, 0x70, 0x1f, 0x13, 0xe8, 0x91,\n                                                          0x73, 0x6e, 0x90, 0x6a, 0xd5, 0xa, 0xfb, 0x4f,\n                                                          0xf7, 0x14, 0x3a, 0xf7, 0x5, 0x1f, 0xe, 0x8d,\n                                                          0xa, 0xf7, 0x73, 0x77, 0x1, 0xf8, 0x24, 0x9f,\n                                                          0xf7, 0x36, 0xa0, 0x3, 0x8b, 0xa, 0x68, 0x6d,\n                                                          0x98, 0xb2, 0x90, 0x8c, 0x90, 0x8c, 0x91, 0x1f,\n                                                          0x8d, 0x97, 0x99, 0x3c, 0xa, 0x7f, 0x80, 0xfb,\n                                                          0x2f, 0x74, 0xa, 0xf7, 0x50, 0x86, 0x76, 0x2a,\n                                                          0x41, 0xa, 0xf8, 0x42, 0xf9, 0x44, 0xb7, 0xa,\n                                                          0xfb, 0x1, 0xf7, 0x22, 0xc5, 0xa, 0x77, 0x92,\n                                                          0x56, 0xa, 0xa0, 0x7a, 0x80, 0xa, 0x8d, 0xa,\n                                                          0xf7, 0x73, 0x77, 0x1, 0xf8, 0xda, 0xa0, 0x3,\n                                                          0xf7, 0xdd, 0xf9, 0x56, 0x9e, 0xa, 0xf7, 0x38,\n                                                          0xf0, 0x9f, 0xa, 0x98, 0x97, 0x47, 0xa, 0x7c,\n                                                          0x82, 0x9d, 0xa, 0xfc, 0x79, 0xfd, 0xf1, 0x34,\n                                                          0xa, 0xf7, 0x92, 0x8b, 0xac, 0xf7, 0xbb, 0xac,\n                                                          0xf7, 0x99, 0xac, 0x89, 0xbe, 0xd1, 0xa, 0xf8,\n                                                          0x24, 0x9f, 0xf7, 0x36, 0xa0, 0x3, 0xf7, 0x98,\n                                                          0x46, 0xa, 0xfc, 0x36, 0xfd, 0xfd, 0x34, 0xa,\n                                                          0x8d, 0xa, 0xce, 0xed, 0x1, 0xf7, 0x9e, 0xc6,\n                                                          0xa, 0x3, 0x8a, 0x16, 0x32, 0xa, 0x7f, 0x80,\n                                                          0xfb, 0x2f, 0x74, 0xa, 0xf7, 0x50, 0x86, 0x76,\n                                                          0x2a, 0x41, 0xa, 0xf7, 0x9f, 0xf9, 0x85, 0x23,\n                                                          0xa, 0x73, 0x99, 0xa, 0x83, 0x16, 0x2a, 0xa,\n                                                          0xf7, 0xbe, 0xf9, 0x44, 0x77, 0xa, 0x73, 0x99,\n                                                          0xa, 0xf7, 0x66, 0xf9, 0x56, 0x9e, 0xa, 0xf7,\n                                                          0x21, 0xee, 0x9f, 0xa, 0x9b, 0x99, 0x47, 0xa,\n                                                          0x79, 0x80, 0x9d, 0xa, 0xfb, 0xf2, 0xfd, 0xef,\n                                                          0x15, 0x2a, 0xa, 0xe, 0x73, 0x9a, 0xa, 0xbe,\n                                                          0xd1, 0xa, 0x83, 0xf8, 0x45, 0x3, 0xf7, 0x17,\n                                                          0x46, 0xa, 0xfb, 0xbc, 0xfd, 0xfd, 0x15, 0x2a,\n                                                          0xa, 0xe, 0x73, 0x87, 0xa, 0xe2, 0xed, 0x1,\n                                                          0xf7, 0x1d, 0xc6, 0xa, 0x3, 0x83, 0x16, 0x2a,\n                                                          0xa, 0xf7, 0x25, 0xf9, 0x85, 0x23, 0xa, 0xf8,\n                                                          0x1, 0x8b, 0xa9, 0xf7, 0xbc, 0xb5, 0xf7, 0x93,\n                                                          0xa9, 0x1, 0xf7, 0x58, 0xee, 0xf7, 0xba, 0xf7,\n                                                          0x3, 0x3, 0xb1, 0xa, 0xf4, 0x4d, 0xf7, 0x35,\n                                                          0xfb, 0x7a, 0x1f, 0xfb, 0xaa, 0x7b, 0x6, 0xc4,\n                                                          0x9d, 0x76, 0x6d, 0x7a, 0x87, 0x79, 0x86, 0x78,\n                                                          0x1f, 0x5d, 0xfb, 0x38, 0x5, 0x31, 0x6, 0x7f,\n                                                          0x61, 0x5, 0xe5, 0x6, 0x5d, 0xfb, 0x38, 0x5,\n                                                          0x26, 0x6f, 0x86, 0x5e, 0x48, 0x1b, 0xf7, 0x8a,\n                                                          0xf7, 0xca, 0x15, 0xf7, 0x2d, 0x6, 0x97, 0xb5,\n                                                          0x5, 0xfb, 0x2d, 0x6, 0xb8, 0xf7, 0x39, 0x5,\n                                                          0xc1, 0x9a, 0x8e, 0xaf, 0xcc, 0xb2, 0xa, 0x55,\n                                                          0x7a, 0x9b, 0xa5, 0xa2, 0x97, 0xaa, 0x95, 0xaf,\n                                                          0x1f, 0xe, 0xf7, 0xca, 0x91, 0x76, 0xaf, 0x76,\n                                                          0xf9, 0x1e, 0xf7, 0x2f, 0xfb, 0x2c, 0x77, 0xee,\n                                                          0xc7, 0x56, 0xf2, 0x85, 0x77, 0x12, 0x13, 0x62,\n                                                          0x77, 0xe4, 0xa, 0x56, 0x7c, 0xa0, 0xab, 0x9c,\n                                                          0x90, 0x9e, 0x91, 0xa1, 0x1f, 0xf7, 0x0, 0xf8,\n                                                          0x26, 0x5, 0x8f, 0x6, 0x13, 0xa2, 0xf7, 0x78,\n                                                          0xfc, 0xb4, 0x5, 0x9d, 0x6, 0xf7, 0x2c, 0xf8,\n                                                          0xad, 0xa2, 0xdb, 0x9c, 0xa2, 0xc3, 0x97, 0x19,\n                                                          0x13, 0x5a, 0xeb, 0xa, 0x7, 0x13, 0x62, 0x7b,\n                                                          0x7, 0xbd, 0x9b, 0x74, 0x6d, 0x78, 0x87, 0x76,\n                                                          0x85, 0x77, 0x1f, 0x29, 0xfc, 0x2, 0x5, 0x88,\n                                                          0x6, 0x13, 0x5a, 0xfb, 0x62, 0xf8, 0x83, 0x5,\n                                                          0xfb, 0x35, 0x6, 0x13, 0x62, 0x7b, 0x7, 0xbb,\n                                                          0xa0, 0x78, 0x66, 0x9c, 0x1f, 0xfb, 0x13, 0xfc,\n                                                          0x57, 0x76, 0x3f, 0x78, 0x6d, 0x54, 0x83, 0x19,\n                                                          0xf7, 0xbd, 0xf9, 0x5d, 0x60, 0xa, 0x9d, 0xa9,\n                                                          0x7f, 0x80, 0xa8, 0x1f, 0x13, 0x5a, 0x80, 0xa7,\n                                                          0xa6, 0x81, 0x71, 0xa, 0x77, 0x74, 0x96, 0x96,\n                                                          0x71, 0x1f, 0x13, 0x54, 0x95, 0x73, 0x71, 0x96,\n                                                          0x71, 0xd6, 0xa, 0xbf, 0xa, 0xf7, 0x66, 0xa8,\n                                                          0xa, 0xc7, 0xf7, 0x77, 0x24, 0xa, 0xf7, 0xd4,\n                                                          0xf8, 0x71, 0x77, 0xa, 0xbf, 0xa, 0xf7, 0x66,\n                                                          0xa8, 0xa, 0xf8, 0x33, 0xf9, 0x56, 0x5e, 0xa,\n                                                          0xfc, 0x95, 0xfd, 0xe, 0x24, 0xa, 0xe, 0xb6,\n                                                          0xa, 0xac, 0xf8, 0xf7, 0xb1, 0x6c, 0xac, 0x8b,\n                                                          0xb1, 0xf7, 0x3d, 0xa8, 0xa, 0xf7, 0xd5, 0x46,\n                                                          0xa, 0xfc, 0x36, 0xfd, 0x1a, 0x24, 0xa, 0xe,\n                                                          0xb6, 0xa, 0xac, 0xf8, 0xff, 0xac, 0xd0, 0xf2,\n                                                          0x88, 0x77, 0x12, 0x86, 0xa, 0x13, 0xec, 0xf7,\n                                                          0xcf, 0xf9, 0x6d, 0x60, 0xa, 0x9c, 0xa6, 0x81,\n                                                          0x81, 0xa6, 0x1f, 0x7f, 0xa9, 0xa9, 0x7f, 0x9e,\n                                                          0x1b, 0x13, 0xdc, 0x43, 0xa, 0x78, 0x74, 0x96,\n                                                          0x96, 0x72, 0x1f, 0x13, 0xec, 0x96, 0x73, 0x70,\n                                                          0x95, 0x70, 0x6c, 0xa, 0xfb, 0x93, 0xfc, 0x8a,\n                                                          0x24, 0xa, 0xe, 0xb6, 0xa, 0xac, 0xf8, 0xb8,\n                                                          0xac, 0xf7, 0x14, 0xed, 0x12, 0xc7, 0xf4, 0xf8,\n                                                          0x8, 0xed, 0x62, 0xf4, 0x13, 0xf4, 0xc7, 0xf7,\n                                                          0x77, 0x24, 0xa, 0xf7, 0x40, 0xf8, 0xb2, 0x58,\n                                                          0xa, 0x13, 0xf8, 0x25, 0xa, 0xf7, 0xd2, 0xa8,\n                                                          0x76, 0xb4, 0x76, 0xf8, 0x56, 0x77, 0xb2, 0x77,\n                                                          0x12, 0xf7, 0x1e, 0xf8, 0x26, 0x13, 0x98, 0xf7,\n                                                          0x8, 0xc4, 0x15, 0xa7, 0x70, 0xf7, 0x57, 0xf7,\n                                                          0x53, 0x5, 0x13, 0x58, 0xf7, 0x57, 0xfb, 0x55,\n                                                          0xa7, 0xa8, 0xfb, 0x57, 0xf7, 0x56, 0xf7, 0x5c,\n                                                          0xf7, 0x5a, 0x5, 0x13, 0xa8, 0x6e, 0xa8, 0xfb,\n                                                          0x5b, 0xfb, 0x5a, 0xfb, 0x58, 0xf7, 0x58, 0x70,\n                                                          0x6e, 0xf7, 0x56, 0xfb, 0x58, 0x5, 0xe, 0xf8,\n                                                          0x1, 0x37, 0x76, 0xe2, 0xac, 0xf8, 0xfe, 0xac,\n                                                          0xc3, 0xa8, 0xa, 0xf7, 0x52, 0xd5, 0x15, 0x72,\n                                                          0xba, 0x8b, 0xe5, 0x98, 0x1a, 0xf7, 0x12, 0xf7,\n                                                          0x16, 0xf7, 0xaf, 0xf7, 0x3c, 0xaf, 0xa7, 0x81,\n                                                          0x7b, 0x9e, 0x1e, 0xfb, 0xdf, 0xfc, 0xc7, 0x15,\n                                                          0xf7, 0xf7, 0xf8, 0xa6, 0x5, 0x9d, 0x6f, 0x91,\n                                                          0x39, 0x62, 0x1a, 0xfb, 0x1, 0xfb, 0xe, 0xfb,\n                                                          0xbf, 0xfb, 0x44, 0x65, 0x71, 0x97, 0x9c, 0x7a,\n                                                          0x1e, 0xfb, 0x26, 0xfb, 0x29, 0x15, 0xb7, 0x6,\n                                                          0xd5, 0xf7, 0x0, 0x5, 0x7e, 0xa9, 0xad, 0x83,\n                                                          0xa7, 0x1b, 0xae, 0xa, 0xf7, 0x84, 0xf7, 0x5d,\n                                                          0xed, 0x65, 0xcd, 0x53, 0xb2, 0x1f, 0xcb, 0xeb,\n                                                          0x5, 0x5f, 0x6, 0x57, 0x3d, 0x5, 0x9a, 0x6a,\n                                                          0x67, 0x92, 0x66, 0x1b, 0xfb, 0x47, 0xfb, 0x78,\n                                                          0xfb, 0x6e, 0xfb, 0x71, 0x21, 0xb5, 0x4b, 0xc0,\n                                                          0x68, 0x1f, 0xe, 0xaa, 0xa, 0x77, 0xf7, 0x83,\n                                                          0x77, 0xa3, 0x77, 0x12, 0xcc, 0xa, 0x13, 0xec,\n                                                          0xf7, 0x13, 0xf9, 0x11, 0x29, 0xa, 0xf8, 0x4,\n                                                          0xbe, 0xb7, 0xa, 0x20, 0xf7, 0x22, 0x5, 0x13,\n                                                          0xdc, 0xa2, 0x79, 0x75, 0x92, 0x56, 0xa, 0xa2,\n                                                          0x7a, 0x80, 0xa, 0xaa, 0xa, 0x77, 0xf7, 0x87,\n                                                          0x77, 0x1, 0xcc, 0xa, 0x3, 0xf8, 0x33, 0xf9,\n                                                          0x56, 0x5e, 0xa, 0xfc, 0x52, 0xfb, 0x74, 0x29,\n                                                          0xa, 0xe, 0xaa, 0xa, 0xbe, 0xd1, 0xa, 0xcc,\n                                                          0xa, 0x3, 0xf7, 0xc6, 0x46, 0xa, 0xfb, 0xe4,\n                                                          0xfb, 0x80, 0x29, 0xa, 0xe, 0xb6, 0xa, 0xb4,\n                                                          0xf8, 0xfa, 0xdf, 0xa, 0xf1, 0xe5, 0xf7, 0x48,\n                                                          0xc6, 0xa, 0x13, 0xce, 0xf7, 0x13, 0xf9, 0x11,\n                                                          0x3a, 0xa, 0x13, 0xbe, 0xeb, 0xa, 0x7, 0x13,\n                                                          0xce, 0x37, 0xa, 0x13, 0xbe, 0xd2, 0xa, 0x13,\n                                                          0xce, 0xf7, 0x89, 0xf7, 0x8, 0x15, 0x13, 0xbe,\n                                                          0x21, 0xa, 0xf7, 0x5b, 0x99, 0xa, 0xcf, 0xa,\n                                                          0x59, 0x69, 0x9c, 0xba, 0x92, 0x8c, 0x91, 0x8d,\n                                                          0x93, 0x1f, 0x91, 0xa7, 0x92, 0xa1, 0xb8, 0xf7,\n                                                          0x2f, 0xf7, 0x6f, 0xf7, 0xa2, 0x18, 0xab, 0xb3,\n                                                          0x96, 0x93, 0xa6, 0x98, 0x8, 0xe8, 0xa, 0xab,\n                                                          0xac, 0x86, 0x67, 0x62, 0xfb, 0x1f, 0xfb, 0x2c,\n                                                          0x5e, 0x53, 0x1f, 0x73, 0xe7, 0x6c, 0xf5, 0x85,\n                                                          0xa5, 0x8, 0x89, 0x95, 0x8b, 0x93, 0x92, 0x1a,\n                                                          0xa4, 0xaa, 0x98, 0xb0, 0x8e, 0xcd, 0xa, 0xa9,\n                                                          0xa7, 0x88, 0x4c, 0x9d, 0x1f, 0xd8, 0xfb, 0xa1,\n                                                          0x51, 0xfb, 0x5e, 0x5, 0x49, 0x78, 0x57, 0x79,\n                                                          0x66, 0x1b, 0xf7, 0xa6, 0xf9, 0x46, 0x9e, 0xa,\n                                                          0xf7, 0x3f, 0xf5, 0x9f, 0xa, 0x91, 0x92, 0x47,\n                                                          0xa, 0x83, 0x87, 0x9d, 0xa, 0xe, 0x7d, 0xa,\n                                                          0xf7, 0x3e, 0xb0, 0xf7, 0xad, 0xa9, 0x6d, 0xf7,\n                                                          0x39, 0x12, 0xf8, 0x66, 0xf2, 0x13, 0xe8, 0x8b,\n                                                          0x4, 0xf7, 0x89, 0x9b, 0x6, 0x55, 0x7e, 0x9d,\n                                                          0xa5, 0x96, 0x8e, 0x98, 0x8f, 0x99, 0x1f, 0xa0,\n                                                          0xdd, 0x5, 0x84, 0xae, 0xad, 0x88, 0xab, 0x1b,\n                                                          0xf7, 0x2d, 0xf7, 0x1, 0xdb, 0xf7, 0x8, 0xf7,\n                                                          0x2b, 0xfb, 0x3b, 0x8c, 0x5f, 0x1f, 0x53, 0x6,\n                                                          0x99, 0xc9, 0x94, 0xaf, 0xa6, 0x9b, 0xab, 0x90,\n                                                          0x19, 0x13, 0xd8, 0x9b, 0xfb, 0x82, 0x7b, 0x7,\n                                                          0xb5, 0x86, 0xa5, 0x7e, 0x66, 0x1a, 0x7d, 0x83,\n                                                          0x6d, 0x85, 0x74, 0x1e, 0xfb, 0x7, 0xfc, 0x33,\n                                                          0x79, 0x4b, 0x7b, 0x7f, 0x58, 0x83, 0x19, 0xf7,\n                                                          0x6b, 0xf7, 0x57, 0xd8, 0xa, 0x9c, 0xa9, 0x1b,\n                                                          0xf7, 0x2, 0xa9, 0x60, 0x41, 0xfb, 0x1f, 0x30,\n                                                          0x72, 0x38, 0x6f, 0x70, 0x8d, 0x8d, 0x75, 0x1f,\n                                                          0xe, 0xfb, 0x63, 0xa3, 0x73, 0xf3, 0xdb, 0xa1,\n                                                          0xf9, 0x25, 0xa2, 0x12, 0xf8, 0x3, 0xe2, 0x62,\n                                                          0xdb, 0x13, 0xb4, 0xa2, 0x87, 0x15, 0x2c, 0x76,\n                                                          0x75, 0x37, 0x4c, 0x1b, 0x7d, 0x87, 0x8f, 0x90,\n                                                          0x8e, 0x8e, 0x8f, 0x8e, 0x92, 0x1f, 0x8e, 0x91,\n                                                          0x8e, 0x93, 0x92, 0x1a, 0x13, 0x74, 0x94, 0x84,\n                                                          0xa6, 0x6c, 0x74, 0x79, 0x80, 0x6a, 0x65, 0xaf,\n                                                          0x75, 0xb5, 0xf7, 0xe, 0xbf, 0xf7, 0x44, 0xb6,\n                                                          0x96, 0x1e, 0xf7, 0x3, 0xf8, 0x3e, 0x5, 0xb5,\n                                                          0x96, 0xb9, 0xf7, 0x44, 0xe1, 0x1b, 0xb4, 0xa2,\n                                                          0x70, 0x5b, 0x4d, 0x7b, 0x3f, 0x4b, 0x6b, 0x1f,\n                                                          0x74, 0x80, 0x7a, 0x89, 0x7f, 0x8a, 0x8, 0x7c,\n                                                          0x8a, 0x85, 0x8d, 0x7c, 0x1a, 0x80, 0x95, 0x89,\n                                                          0x99, 0x8a, 0x1e, 0x13, 0xb8, 0xab, 0x88, 0xbe,\n                                                          0x89, 0xfb, 0x1, 0x1a, 0x40, 0x61, 0xfb, 0x49,\n                                                          0x3a, 0x7e, 0x86, 0x94, 0x8f, 0x91, 0x8f, 0x8f,\n                                                          0x8e, 0x92, 0x1e, 0x8e, 0x90, 0x8d, 0x91, 0x95,\n                                                          0x1a, 0xa0, 0x7f, 0x9e, 0x71, 0x73, 0x77, 0x7b,\n                                                          0x6d, 0x58, 0xba, 0x7b, 0xaa, 0xf7, 0x28, 0xd3,\n                                                          0xf7, 0x4b, 0xd6, 0xdc, 0x5e, 0xc6, 0x3c, 0x91,\n                                                          0x1e, 0x8e, 0x7, 0x13, 0xb4, 0xc9, 0xa1, 0xf0,\n                                                          0xb2, 0xf3, 0x1a, 0xc7, 0x64, 0xd1, 0x28, 0xfb,\n                                                          0x22, 0x48, 0xfb, 0x20, 0xfb, 0x74, 0x58, 0x1e,\n                                                          0xe, 0xa1, 0xa, 0x33, 0xa, 0x13, 0xb8, 0x28,\n                                                          0xa, 0xf7, 0x9b, 0xf8, 0x13, 0x78, 0xa, 0xa1,\n                                                          0xa, 0xf7, 0x9c, 0xf8, 0x82, 0x7f, 0xa, 0x24,\n                                                          0xfc, 0x92, 0x22, 0xa, 0x13, 0xb8, 0x28, 0xa,\n                                                          0xe, 0x76, 0xa, 0x8b, 0xbe, 0xf7, 0x3d, 0x77,\n                                                          0x12, 0x9c, 0xdf, 0x13, 0x7c, 0xf7, 0x43, 0x55,\n                                                          0xa, 0x7d, 0xfc, 0x9e, 0x22, 0xa, 0x13, 0xbc,\n                                                          0x28, 0xa, 0xe, 0x76, 0xa, 0xda, 0xac, 0xa,\n                                                          0x9c, 0xdf, 0x13, 0xb6, 0xf7, 0x4c, 0xf8, 0x99,\n                                                          0x65, 0xa, 0x74, 0x97, 0x96, 0x71, 0x1f, 0x13,\n                                                          0x6a, 0x95, 0x73, 0x71, 0x95, 0x71, 0x6c, 0xa,\n                                                          0xf7, 0x1a, 0xfc, 0xe, 0x22, 0xa, 0x13, 0xb6,\n                                                          0x28, 0xa, 0xe, 0x76, 0xa, 0xce, 0xed, 0x12,\n                                                          0x9c, 0xdf, 0xe5, 0xc6, 0xa, 0x13, 0x7e, 0x33,\n                                                          0xa, 0x13, 0xbe, 0x28, 0xa, 0xe5, 0xf8, 0x54,\n                                                          0x23, 0xa, 0x76, 0xa, 0xbe, 0xac, 0x8b, 0xf7,\n                                                          0x17, 0xfb, 0x17, 0xf7, 0x3a, 0x12, 0x9c, 0xdf,\n                                                          0xf7, 0x1f, 0xf7, 0x38, 0xab, 0xa, 0xf7, 0x3a,\n                                                          0x13, 0x76, 0x40, 0x33, 0xa, 0x13, 0xb7, 0x0,\n                                                          0x28, 0xa, 0xf7, 0x1f, 0xf8, 0x76, 0x15, 0x54,\n                                                          0xb7, 0x5f, 0xc2, 0x1e, 0x13, 0xb6, 0x40, 0xc2,\n                                                          0xb8, 0xb7, 0xc2, 0xc2, 0x5e, 0xb8, 0x54, 0x1f,\n                                                          0x13, 0xb7, 0x0, 0x54, 0x5f, 0x5e, 0x54, 0x1f,\n                                                          0xac, 0x8a, 0x15, 0xb3, 0xa, 0x13, 0xba, 0x80,\n                                                          0xe5, 0xa, 0xe, 0xf7, 0xca, 0x80, 0xbd, 0xf8,\n                                                          0xd, 0xa4, 0x77, 0x9f, 0x12, 0xa2, 0xe1, 0xf7,\n                                                          0x53, 0xe3, 0xf7, 0x4e, 0xcd, 0x13, 0xbc, 0xf7,\n                                                          0xba, 0xf7, 0x20, 0x15, 0x90, 0x6, 0x89, 0x83,\n                                                          0x8a, 0x85, 0x82, 0x1a, 0x49, 0xab, 0x4d, 0xd9,\n                                                          0xeb, 0xe5, 0xf1, 0x95, 0x91, 0x1e, 0x81, 0x97,\n                                                          0x5, 0x48, 0x48, 0x58, 0x81, 0x76, 0x1b, 0x42,\n                                                          0x8b, 0xd6, 0xa8, 0xa3, 0x8c, 0x8d, 0x90, 0xa1,\n                                                          0x1f, 0xf7, 0xa, 0xad, 0xf7, 0x20, 0xb2, 0xf1,\n                                                          0x1a, 0xc7, 0x50, 0x9d, 0x75, 0x64, 0x62, 0x76,\n                                                          0x64, 0x65, 0x1e, 0x89, 0x8d, 0x9f, 0xc3, 0x44,\n                                                          0x89, 0x78, 0x60, 0x5, 0xa3, 0x80, 0x81, 0xa2,\n                                                          0x5b, 0x1b, 0xfb, 0x12, 0xfb, 0x2b, 0xfb, 0x6a,\n                                                          0xfb, 0x18, 0x5c, 0x9a, 0x50, 0xd3, 0xd7, 0xc6,\n                                                          0xda, 0xd3, 0xbc, 0x1f, 0xfb, 0x4d, 0x67, 0x15,\n                                                          0xed, 0xee, 0xf7, 0x6f, 0xe9, 0x99, 0xad, 0x88,\n                                                          0x54, 0x27, 0x20, 0xfb, 0x74, 0x29, 0x1e, 0x13,\n                                                          0x58, 0x69, 0x89, 0xaa, 0xad, 0x1f, 0xf7, 0xab,\n                                                          0xf7, 0x1, 0x15, 0xf7, 0x1d, 0xb5, 0xc7, 0xcd,\n                                                          0xbb, 0x1b, 0x13, 0xc, 0x9b, 0x9f, 0x7c, 0x6b,\n                                                          0x56, 0x59, 0x40, 0xfb, 0x1c, 0x6f, 0x1f, 0xe,\n                                                          0xe2, 0xfb, 0x6d, 0xaf, 0xdc, 0xad, 0xc3, 0xae,\n                                                          0xf8, 0x1f, 0xa0, 0x1, 0xa5, 0xe1, 0xd7, 0xd5,\n                                                          0xd7, 0xe2, 0x3, 0xf0, 0x28, 0x15, 0x94, 0x83,\n                                                          0x5, 0x91, 0x95, 0x98, 0x8c, 0x97, 0x1b, 0xa1,\n                                                          0xa0, 0x7e, 0x72, 0x6e, 0x69, 0x7d, 0x67, 0x79,\n                                                          0x78, 0xde, 0xa, 0xa2, 0xaf, 0x83, 0xaf, 0x1b,\n                                                          0xc6, 0xc5, 0xa2, 0xcb, 0xb4, 0x69, 0xa5, 0x65,\n                                                          0x7f, 0x7f, 0x8b, 0x88, 0x80, 0x1f, 0xb1, 0xc3,\n                                                          0xeb, 0x91, 0xc0, 0xd1, 0xa3, 0xa9, 0x19, 0x7b,\n                                                          0x95, 0x5, 0x63, 0x67, 0x5c, 0x62, 0x4f, 0x1b,\n                                                          0x4e, 0x69, 0xb8, 0xd8, 0xeb, 0xd4, 0xdb, 0xa,\n                                                          0x81, 0x86, 0x82, 0x87, 0x80, 0x1f, 0x88, 0x83,\n                                                          0x88, 0x81, 0x80, 0xa3, 0xa, 0xfb, 0x22, 0xfb,\n                                                          0x2d, 0xfb, 0x21, 0xfb, 0xa, 0xd0, 0x6a, 0xc7,\n                                                          0x85, 0x1e, 0xe, 0xe2, 0x80, 0xb8, 0xf7, 0xfc,\n                                                          0xa2, 0x8c, 0xa2, 0xf7, 0x73, 0x77, 0x1, 0xaa,\n                                                          0xe0, 0x3, 0xf7, 0x17, 0xf7, 0x5a, 0x15, 0x9c,\n                                                          0xb7, 0x5, 0x2d, 0xa, 0xf7, 0x68, 0xf7, 0xd0,\n                                                          0x78, 0xa, 0xe2, 0x80, 0xb8, 0xf8, 0xd, 0xa2,\n                                                          0xf7, 0x7a, 0x77, 0x12, 0xaa, 0xe0, 0xf7, 0x7b,\n                                                          0xcc, 0x17, 0xf7, 0x80, 0xad, 0xa, 0xf7, 0x3a,\n                                                          0xee, 0x9f, 0xa, 0x96, 0x99, 0x47, 0xa, 0x7e,\n                                                          0x80, 0x9d, 0xa, 0xfb, 0x9a, 0xfc, 0x55, 0x15,\n                                                          0x9c, 0xb7, 0x5, 0x3d, 0xa, 0x13, 0xd0, 0xb7,\n                                                          0x70, 0xad, 0x58, 0x1e, 0x5b, 0xa, 0x1f, 0x54,\n                                                          0xa, 0xe, 0xe2, 0x80, 0xb8, 0xf7, 0xf3, 0xa2,\n                                                          0x95, 0xa2, 0x8b, 0xbe, 0xf3, 0xcc, 0x8b, 0x77,\n                                                          0x1, 0xaa, 0xe0, 0xf7, 0x7b, 0xcc, 0x3, 0xf7,\n                                                          0x27, 0x55, 0xa, 0xfb, 0x41, 0xfc, 0x63, 0x15,\n                                                          0x9c, 0xb7, 0x5, 0x2d, 0xa, 0xe, 0xe2, 0x80,\n                                                          0xb8, 0xf8, 0xd, 0xa2, 0x7b, 0xa2, 0xce, 0xed,\n                                                          0x12, 0xaa, 0xe0, 0xb0, 0xc6, 0xa, 0x13, 0xde,\n                                                          0xf7, 0x17, 0xf7, 0x5a, 0x15, 0x9c, 0xb7, 0x5,\n                                                          0x13, 0xbe, 0x2d, 0xa, 0xa8, 0xf8, 0x11, 0x23,\n                                                          0xa, 0xd7, 0xa, 0xf9, 0x37, 0xe3, 0xa, 0xf7,\n                                                          0x72, 0xf7, 0x6, 0x2c, 0xa, 0x9d, 0xf8, 0x19,\n                                                          0xb7, 0xa, 0xfb, 0x3, 0xf7, 0x23, 0xc5, 0xa,\n                                                          0x79, 0x91, 0x56, 0xa, 0x9e, 0x7b, 0x80, 0xa,\n                                                          0xd7, 0xa, 0xf9, 0x37, 0xe3, 0xa, 0xf7, 0x18,\n                                                          0xad, 0xa, 0xf7, 0x3a, 0xef, 0x9f, 0xa, 0x97,\n                                                          0x98, 0x47, 0xa, 0x7d, 0x81, 0x9d, 0xa, 0x48,\n                                                          0xfc, 0xaa, 0x2c, 0xa, 0xe, 0xd7, 0xa, 0xf9,\n                                                          0x34, 0xe3, 0xa, 0xad, 0x55, 0xa, 0xaa, 0xfc,\n                                                          0xb7, 0x2c, 0xa, 0xe, 0xd7, 0xa, 0xf8, 0x9b,\n                                                          0xed, 0x1, 0xbc, 0xf2, 0xf2, 0xed, 0x3, 0xf7,\n                                                          0x72, 0xf7, 0x6, 0x2c, 0xa, 0xfb, 0x49, 0xf8,\n                                                          0x5a, 0x58, 0xa, 0xf7, 0x5d, 0x16, 0x20, 0xa,\n                                                          0xe, 0x80, 0xa0, 0xf7, 0x46, 0xa0, 0xf8, 0x6e,\n                                                          0x77, 0x12, 0xa6, 0xdf, 0xf7, 0xa5, 0xde, 0x17,\n                                                          0xf7, 0x3, 0xf2, 0x15, 0xf7, 0xa, 0xe6, 0xf7,\n                                                          0x5b, 0xf7, 0x4, 0xbb, 0xa1, 0x5f, 0x57, 0x20,\n                                                          0x3c, 0xfb, 0x63, 0xfb, 0x6, 0x59, 0x6d, 0xaf,\n                                                          0xc4, 0x1e, 0xf7, 0xaf, 0xf7, 0xb5, 0x15, 0xa9,\n                                                          0x7d, 0x6a, 0x9e, 0x66, 0x1b, 0xfb, 0x1b, 0xfb,\n                                                          0x28, 0xfb, 0x35, 0xfb, 0x27, 0x38, 0xb8, 0x4e,\n                                                          0xf5, 0xf7, 0x2d, 0xf7, 0x1c, 0xf7, 0x43, 0xf7,\n                                                          0x5c, 0xec, 0x67, 0xce, 0x59, 0xc1, 0x1f, 0xf0,\n                                                          0xb8, 0x6b, 0xa7, 0x28, 0x60, 0x64, 0xac, 0x5b,\n                                                          0xa9, 0x63, 0x93, 0x19, 0x68, 0x7a, 0xaf, 0x7d,\n                                                          0xb3, 0x6b, 0xab, 0x6c, 0x19, 0xfb, 0xf, 0x55,\n                                                          0xac, 0x6e, 0xf7, 0x9, 0xbe, 0xaf, 0x5e, 0xa6,\n                                                          0x5a, 0x94, 0x45, 0x19, 0xe, 0xbe, 0xa, 0xda,\n                                                          0xac, 0xa, 0xf7, 0xfd, 0xdc, 0x13, 0x6a, 0x89,\n                                                          0xa, 0xc3, 0xa, 0x13, 0xaa, 0x51, 0xa, 0x7b,\n                                                          0x7, 0xc1, 0x92, 0x76, 0x7c, 0x1f, 0x13, 0x76,\n                                                          0x76, 0x4b, 0xfb, 0x74, 0x6c, 0xfb, 0x5, 0x1e,\n                                                          0xf7, 0x1b, 0xa2, 0xa, 0xa7, 0x1f, 0x80, 0xa8,\n                                                          0x57, 0xa, 0x77, 0x72, 0x98, 0x96, 0x70, 0x1f,\n                                                          0x13, 0x6a, 0x95, 0x74, 0x72, 0x94, 0x72, 0xd6,\n                                                          0xa, 0xa4, 0xa, 0xa6, 0xf7, 0x19, 0x26, 0xa,\n                                                          0xf7, 0x91, 0xf7, 0xfc, 0xb7, 0xa, 0xfb, 0x5,\n                                                          0xf7, 0x26, 0xc5, 0xa, 0x7b, 0x8e, 0x56, 0xa,\n                                                          0x9c, 0x7e, 0x80, 0xa, 0xa4, 0xa, 0xf7, 0x9c,\n                                                          0xad, 0xa, 0xf7, 0x33, 0xed, 0x9f, 0xa, 0x9d,\n                                                          0x9a, 0x47, 0xa, 0x77, 0x7f, 0x9d, 0xa, 0xfc,\n                                                          0x17, 0xfc, 0x95, 0x26, 0xa, 0xe, 0x80, 0xa0,\n                                                          0xf8, 0x18, 0xa0, 0x8c, 0xa0, 0x8b, 0xbe, 0xf3,\n                                                          0xcc, 0x8b, 0x77, 0x92, 0xa, 0xf7, 0x39, 0x55,\n                                                          0xa, 0xfb, 0xbb, 0xfc, 0xa4, 0x26, 0xa, 0xe,\n                                                          0x80, 0xa0, 0xf8, 0x21, 0xa0, 0xe7, 0xac, 0xa,\n                                                          0xa6, 0xdf, 0xf7, 0xa5, 0xdf, 0x13, 0xee, 0xf7,\n                                                          0x3d, 0xf8, 0x99, 0x60, 0xa, 0x9c, 0xa6, 0x81,\n                                                          0x80, 0xa7, 0x1f, 0x80, 0xa8, 0xa9, 0x7f, 0x9e,\n                                                          0x1b, 0x43, 0xa, 0x77, 0x74, 0x97, 0x96, 0x71,\n                                                          0x1f, 0x13, 0xd6, 0x95, 0x73, 0x71, 0x95, 0x71,\n                                                          0x6c, 0xa, 0xfb, 0x22, 0xfc, 0x14, 0x26, 0xa,\n                                                          0xe, 0x80, 0xa0, 0xf8, 0x25, 0xa0, 0xd7, 0xed,\n                                                          0x12, 0xa6, 0xdf, 0xdb, 0xed, 0xea, 0xdf, 0x3e,\n                                                          0xed, 0x13, 0xfc, 0xa6, 0xf7, 0x19, 0x26, 0xa,\n                                                          0xdb, 0xf8, 0x3d, 0x58, 0xa, 0x13, 0xfa, 0x25,\n                                                          0xa, 0xf7, 0xd2, 0x80, 0xf7, 0x3, 0xf7, 0xc,\n                                                          0xcd, 0x53, 0xb9, 0xf7, 0x16, 0xf7, 0x3, 0x12,\n                                                          0xf7, 0xaf, 0xf7, 0x3, 0x23, 0xe1, 0x13, 0xb8,\n                                                          0xe1, 0xf7, 0x7a, 0x15, 0xf8, 0x8c, 0xb9, 0xfc,\n                                                          0x8c, 0x6, 0xf7, 0x8b, 0xf7, 0x2f, 0x15, 0x13,\n                                                          0xd4, 0x8e, 0xa, 0x8d, 0xfc, 0x4e, 0x15, 0x8e,\n                                                          0xa, 0xe, 0x82, 0xa2, 0xf8, 0x28, 0xa1, 0x12,\n                                                          0xa7, 0xdf, 0xf7, 0xa5, 0xdf, 0x17, 0xf7, 0x20,\n                                                          0xa8, 0x15, 0x78, 0x9c, 0x82, 0x97, 0xd7, 0x1a,\n                                                          0xd9, 0xd8, 0xf7, 0x62, 0xf7, 0x1f, 0x1e, 0xfb,\n                                                          0x35, 0xfc, 0x28, 0x15, 0xf7, 0x52, 0xf8, 0x1c,\n                                                          0x5, 0xaa, 0x67, 0x88, 0x71, 0x58, 0x1a, 0x7c,\n                                                          0x64, 0xfb, 0x9c, 0xfb, 0x47, 0x1e, 0x60, 0x79,\n                                                          0x15, 0x4b, 0xfb, 0x17, 0x5, 0xae, 0x6, 0x13,\n                                                          0xf0, 0xc8, 0xf7, 0x12, 0x5, 0x13, 0x50, 0xf7,\n                                                          0x61, 0xf7, 0x0, 0xf7, 0x54, 0xf7, 0x0, 0xcf,\n                                                          0x6f, 0xc6, 0x44, 0x9c, 0x1f, 0xc5, 0xf7, 0xb,\n                                                          0x5, 0x69, 0x6, 0x54, 0xfb, 0x6, 0x5, 0x13,\n                                                          0x20, 0xfb, 0x3b, 0xfb, 0x24, 0xfb, 0x34, 0xfb,\n                                                          0x25, 0x1f, 0x13, 0x0, 0x53, 0xa1, 0x4c, 0xd5,\n                                                          0x77, 0x1e, 0xe, 0xa0, 0xa, 0xf7, 0xdd, 0xf7,\n                                                          0x77, 0x3b, 0xa, 0xae, 0xf7, 0x9d, 0xb7, 0xa,\n                                                          0xfb, 0x4, 0xf7, 0x25, 0xc5, 0xa, 0x7a, 0x8f,\n                                                          0x56, 0xa, 0x9d, 0x7d, 0x80, 0xa, 0xa0, 0xa,\n                                                          0xf7, 0x92, 0xf8, 0x82, 0x7e, 0xa, 0x3b, 0xfc,\n                                                          0x38, 0x3b, 0xa, 0xe, 0x82, 0xba, 0x6f, 0x76,\n                                                          0xf8, 0x4f, 0xc7, 0xf7, 0x3d, 0xa9, 0xa, 0xe5,\n                                                          0x13, 0xb0, 0xf7, 0x39, 0xf8, 0x80, 0x15, 0xb2,\n                                                          0x6, 0x13, 0xbc, 0x39, 0xa, 0x92, 0xfc, 0x46,\n                                                          0x53, 0xa, 0x13, 0xac, 0x2e, 0xa, 0x13, 0x70,\n                                                          0xa6, 0xa, 0x82, 0xba, 0x6f, 0x76, 0xf8, 0x9b,\n                                                          0xed, 0x12, 0xb5, 0xd8, 0xc9, 0xc6, 0xa, 0x13,\n                                                          0xac, 0xf7, 0xdd, 0xf7, 0x77, 0x53, 0xa, 0x13,\n                                                          0xbc, 0x2b, 0xa, 0x13, 0x7c, 0x5d, 0xa, 0x62,\n                                                          0xa, 0xfb, 0x28, 0xf7, 0xde, 0x23, 0xa, 0xe2,\n                                                          0xfb, 0x62, 0xb8, 0xf8, 0xee, 0x77, 0xf7, 0x87,\n                                                          0x77, 0x12, 0xf8, 0x16, 0xc7, 0xa, 0xdb, 0x7c,\n                                                          0x5f, 0xf7, 0x5, 0x7e, 0x1b, 0x79, 0x3d, 0x7b,\n                                                          0x83, 0x5b, 0x1f, 0x98, 0xa, 0x9e, 0x4f, 0xe2,\n                                                          0xa, 0xaf, 0xfb, 0x32, 0x7a, 0xa, 0x84, 0x84,\n                                                          0x8f, 0x91, 0x84, 0x1f, 0x93, 0x81, 0x7f, 0x95,\n                                                          0x79, 0x96, 0xa, 0x1f, 0x13, 0x70, 0x70, 0xa,\n                                                          0x73, 0x99, 0x82, 0x99, 0x83, 0x1f, 0x98, 0x83,\n                                                          0x98, 0x84, 0x77, 0xa7, 0xa, 0x6f, 0xf8, 0x3a,\n                                                          0x7e, 0xa, 0xe, 0xfb, 0x4c, 0x76, 0xf7, 0x6b,\n                                                          0x76, 0xf8, 0x2d, 0xb6, 0xf7, 0x86, 0x77, 0x48,\n                                                          0xa, 0x77, 0x1f, 0x89, 0x8d, 0x91, 0x9c, 0xdd,\n                                                          0xf7, 0xce, 0x8e, 0x97, 0x19, 0x13, 0x90, 0x86,\n                                                          0x90, 0x58, 0x81, 0x58, 0x84, 0x59, 0x85, 0x19,\n                                                          0x7a, 0x7, 0xba, 0x9a, 0x7d, 0x75, 0x7a, 0x84,\n                                                          0x76, 0x85, 0x75, 0x1f, 0x6a, 0xfb, 0x9, 0xfb,\n                                                          0xf, 0xfc, 0x64, 0x76, 0x35, 0x8, 0x6b, 0x83,\n                                                          0x82, 0xda, 0xa, 0x74, 0x66, 0x90, 0xb9, 0x9e,\n                                                          0xa4, 0xe5, 0x93, 0xaf, 0x1f, 0xe, 0xe2, 0xfb,\n                                                          0x4d, 0x76, 0xf9, 0x1b, 0x77, 0xe2, 0xed, 0x12,\n                                                          0xf7, 0x23, 0xc6, 0xa, 0x54, 0xb3, 0x13, 0xf4,\n                                                          0xf7, 0x9c, 0xd3, 0x15, 0x6a, 0xf7, 0x3f, 0x5,\n                                                          0xd6, 0x7d, 0x5e, 0xf7, 0xf, 0x7e, 0x1b, 0x79,\n                                                          0x8a, 0x3d, 0x7c, 0x5b, 0x83, 0x8, 0x13, 0xb8,\n                                                          0x98, 0xa, 0x9f, 0x43, 0xe2, 0xa, 0xae, 0xfb,\n                                                          0x26, 0x7a, 0xa, 0x82, 0x83, 0x93, 0x92, 0x81,\n                                                          0x1f, 0x92, 0x82, 0x80, 0x91, 0x7d, 0x96, 0xa,\n                                                          0x1f, 0x13, 0x74, 0x70, 0xa, 0x75, 0x97, 0x83,\n                                                          0x98, 0x83, 0x1f, 0x99, 0x82, 0x9a, 0x84, 0x75,\n                                                          0xa7, 0xa, 0xfb, 0xd, 0xf8, 0x79, 0x58, 0xa,\n                                                          0x13, 0xf8, 0x25, 0xa, 0xd7, 0xa, 0xf8, 0x58,\n                                                          0xe3, 0xa, 0xf7, 0x72, 0xf7, 0x6, 0x3f, 0xa,\n                                                          0x64, 0x84, 0x38, 0x7b, 0x65, 0x89, 0x19, 0x3e,\n                                                          0xa, 0xe, 0x6e, 0xa, 0x54, 0x5e, 0x8b, 0xb7,\n                                                          0xac, 0xac, 0xe4, 0xab, 0xf7, 0x11, 0x1f, 0xf7,\n                                                          0x22, 0xde, 0x99, 0xbc, 0xfb, 0x23, 0x36, 0xb9,\n                                                          0xf7, 0x31, 0xaa, 0xf5, 0x9b, 0x82, 0xc8, 0x94,\n                                                          0x19, 0xc4, 0xa, 0xc3, 0x9f, 0x78, 0x6e, 0x7b,\n                                                          0x87, 0x77, 0x85, 0x76, 0x1f, 0x4f, 0xfb, 0x6a,\n                                                          0x28, 0x50, 0x7e, 0x5b, 0xee, 0xc6, 0x5c, 0xfb,\n                                                          0x3e, 0x7a, 0x4d, 0x79, 0x7e, 0x5a, 0x82, 0x19,\n                                                          0xe, 0xd7, 0xa, 0xf9, 0x4a, 0x77, 0x1, 0xb0,\n                                                          0xd7, 0x3, 0xf7, 0x74, 0xd3, 0xa, 0x7e, 0x88,\n                                                          0x95, 0x97, 0x9c, 0x94, 0xa0, 0x8d, 0x92, 0x1f,\n                                                          0xd5, 0xf7, 0xaf, 0xec, 0xbd, 0x97, 0xb9, 0x2a,\n                                                          0x59, 0xcc, 0xf7, 0x8e, 0x86, 0x90, 0x57, 0x7f,\n                                                          0x57, 0x82, 0x57, 0x85, 0x19, 0x7b, 0x7, 0xa5,\n                                                          0xb2, 0x82, 0x71, 0x81, 0x6f, 0xfb, 0x0, 0x6e,\n                                                          0xfb, 0x1, 0x1f, 0x43, 0x67, 0x7f, 0x5d, 0xd3,\n                                                          0xaf, 0x5, 0x62, 0xfb, 0x28, 0x6b, 0xfb, 0xf,\n                                                          0x81, 0xb5, 0xa, 0xf8, 0xdf, 0x83, 0xab, 0x73,\n                                                          0xac, 0xf7, 0xbb, 0xe9, 0xa, 0x78, 0xab, 0x12,\n                                                          0xbc, 0xf7, 0x0, 0x13, 0xb4, 0xf9, 0x84, 0xf7,\n                                                          0x74, 0x15, 0x9f, 0x89, 0xcd, 0xf7, 0x7a, 0x79,\n                                                          0x8f, 0x5, 0x37, 0x64, 0x7b, 0x80, 0xfb, 0x39,\n                                                          0x1b, 0xcb, 0xf7, 0x77, 0x5, 0x9a, 0x8f, 0x91,\n                                                          0x9c, 0xa6, 0x1b, 0xeb, 0x6, 0xf7, 0xc, 0x8b,\n                                                          0x69, 0x38, 0x1f, 0x9b, 0x6, 0xaa, 0xf7, 0x2a,\n                                                          0x5, 0xfc, 0x5, 0x6, 0x7b, 0x71, 0x8f, 0x8e,\n                                                          0x6f, 0x1f, 0x13, 0xac, 0x8f, 0x6e, 0x6d, 0x8d,\n                                                          0x73, 0x1b, 0xfb, 0x5e, 0xfb, 0x53, 0xfb, 0x5e,\n                                                          0xfb, 0x88, 0xfb, 0x14, 0xf0, 0x27, 0xf7, 0xc,\n                                                          0xb2, 0xae, 0x8d, 0x8d, 0xad, 0x1f, 0x13, 0x74,\n                                                          0x8d, 0xae, 0xae, 0x8d, 0xb3, 0x1b, 0xf7, 0xee,\n                                                          0x6, 0xcc, 0xf7, 0x3a, 0x7b, 0x91, 0x5, 0x49,\n                                                          0x5b, 0x56, 0x42, 0xfb, 0x37, 0x1b, 0x46, 0x71,\n                                                          0x8d, 0xae, 0x99, 0x95, 0xad, 0x90, 0x9f, 0x1f,\n                                                          0xbf, 0xf7, 0x52, 0x5, 0xf7, 0x1f, 0xa7, 0x7a,\n                                                          0x5e, 0x1f, 0x87, 0x71, 0x8f, 0xa0, 0x85, 0x66,\n                                                          0x8, 0xfb, 0xba, 0x72, 0x15, 0x13, 0xac, 0xfb,\n                                                          0x3, 0x6d, 0x72, 0x4b, 0x21, 0x1b, 0xfb, 0x1f,\n                                                          0x8a, 0xf7, 0x20, 0xb6, 0xf7, 0x45, 0xf7, 0x7,\n                                                          0xf7, 0x8e, 0xf7, 0x42, 0xca, 0xb5, 0x6c, 0x58,\n                                                          0x7a, 0x7e, 0x62, 0x84, 0x70, 0x1f, 0xe, 0xf7,\n                                                          0xca, 0x7f, 0xa0, 0x76, 0xb5, 0x77, 0x76, 0xf8,\n                                                          0x41, 0xa2, 0x12, 0x9f, 0xde, 0x13, 0x58, 0xf7,\n                                                          0xc3, 0xc3, 0x15, 0x62, 0x9e, 0xb3, 0x70, 0xb8,\n                                                          0x1b, 0xe0, 0xd6, 0xcf, 0xb1, 0xb0, 0x1f, 0x80,\n                                                          0x96, 0x5, 0x5f, 0x52, 0x63, 0x6c, 0x59, 0x1b,\n                                                          0x79, 0x54, 0x99, 0xcf, 0xa0, 0x8d, 0xaf, 0x94,\n                                                          0x99, 0x1f, 0x93, 0x97, 0xf0, 0x8a, 0xe5, 0xcc,\n                                                          0x8, 0xb7, 0xab, 0x9e, 0xb6, 0xa6, 0x1a, 0x92,\n                                                          0x85, 0xd4, 0x49, 0x61, 0x5c, 0x86, 0x40, 0x3c,\n                                                          0x1e, 0x93, 0x89, 0x73, 0xd3, 0x32, 0x1b, 0xfb,\n                                                          0xe, 0xfb, 0x29, 0xfb, 0x37, 0xfb, 0x1e, 0x1f,\n                                                          0x13, 0x38, 0xfb, 0x3, 0xdf, 0x63, 0xc2, 0xd5,\n                                                          0xae, 0xac, 0xad, 0xae, 0x1e, 0xfb, 0x5c, 0xc1,\n                                                          0x15, 0xf7, 0x5, 0xe1, 0xf7, 0x57, 0xe6, 0xc3,\n                                                          0x92, 0x61, 0x6e, 0x1e, 0x13, 0x98, 0x66, 0x5a,\n                                                          0xfb, 0xc1, 0xfb, 0xe, 0x46, 0x8b, 0xd6, 0xa5,\n                                                          0x1e, 0xf7, 0xb2, 0xea, 0x15, 0xf7, 0x8, 0xa9,\n                                                          0xd7, 0xea, 0xc1, 0x1b, 0xa2, 0x93, 0x70, 0x74,\n                                                          0x7a, 0x83, 0x5c, 0x54, 0x60, 0x1f, 0x6a, 0x72,\n                                                          0x73, 0x84, 0x44, 0x75, 0x8, 0xe, 0x79, 0xae,\n                                                          0x80, 0x76, 0xf9, 0x1c, 0xac, 0x8c, 0x77, 0x12,\n                                                          0xbe, 0x9f, 0xc7, 0xe3, 0x13, 0x6c, 0xb9, 0xa,\n                                                          0x9a, 0x85, 0x83, 0x9e, 0x1f, 0x13, 0xac, 0x81,\n                                                          0xa4, 0xaa, 0x7f, 0xb2, 0x6d, 0xa, 0x13, 0x9c,\n                                                          0xb3, 0xf7, 0x5b, 0x5, 0x74, 0x6, 0x78, 0x80,\n                                                          0x7a, 0x85, 0x78, 0x1b, 0x78, 0x75, 0x91, 0x91,\n                                                          0x7a, 0x1f, 0x13, 0xac, 0x91, 0x79, 0x7d, 0x91,\n                                                          0x5e, 0x64, 0xa, 0x13, 0x6c, 0xf7, 0x98, 0xf8,\n                                                          0x84, 0x52, 0xa, 0xab, 0x93, 0x76, 0xf8, 0x43,\n                                                          0xa2, 0xf7, 0x70, 0x77, 0x12, 0xf7, 0x1, 0xd4,\n                                                          0x8b, 0xf7, 0x28, 0x25, 0xd7, 0x13, 0xf4, 0xc2,\n                                                          0xa, 0x99, 0x9a, 0x87, 0x86, 0x99, 0x1f, 0x86,\n                                                          0x9a, 0x9b, 0x86, 0x9a, 0x1b, 0xc3, 0xe8, 0xa4,\n                                                          0xf7, 0x1, 0xb5, 0x6d, 0xb6, 0x6d, 0xb3, 0x1f,\n                                                          0x6c, 0xb4, 0x6c, 0xb2, 0xab, 0x1a, 0xbc, 0xab,\n                                                          0x94, 0xa1, 0x1e, 0x13, 0xf8, 0xcc, 0xa8, 0x51,\n                                                          0x52, 0x1f, 0x9b, 0x6, 0xbb, 0xa, 0x7b, 0x80,\n                                                          0x90, 0x90, 0x7e, 0x1f, 0x8f, 0x80, 0x7e, 0x8e,\n                                                          0x76, 0x1b, 0x21, 0x7d, 0x3b, 0x6c, 0x63, 0xab,\n                                                          0x5d, 0xaa, 0x60, 0x1f, 0x13, 0xf4, 0xa8, 0x63,\n                                                          0xa6, 0x65, 0x6b, 0xb4, 0xa, 0xf7, 0x65, 0xf7,\n                                                          0xee, 0x52, 0xa, 0xf7, 0x5b, 0xa0, 0x76, 0xf9,\n                                                          0x11, 0xdf, 0xa, 0xf7, 0x8d, 0xc6, 0xa, 0x13,\n                                                          0xcc, 0xcf, 0xa, 0x51, 0x8f, 0x6c, 0x90, 0xb6,\n                                                          0x1a, 0x94, 0x8d, 0x96, 0x8f, 0x98, 0x1e, 0xc7,\n                                                          0xf7, 0x61, 0xf7, 0x6f, 0xf7, 0xa2, 0xab, 0xb3,\n                                                          0x96, 0x93, 0xa6, 0x98, 0x19, 0x13, 0xbc, 0x9b,\n                                                          0xfb, 0x51, 0x7, 0x13, 0xcc, 0x7b, 0x7, 0xb3,\n                                                          0x87, 0xa6, 0x86, 0x73, 0x1a, 0x84, 0x89, 0x83,\n                                                          0x87, 0x80, 0x1e, 0x7c, 0x64, 0xfb, 0xc, 0xfb,\n                                                          0x1c, 0x5e, 0x53, 0x73, 0xe7, 0x6e, 0xf0, 0x83,\n                                                          0xad, 0x8, 0x88, 0x96, 0x8b, 0x94, 0x93, 0x1a,\n                                                          0xa4, 0xa3, 0x95, 0xb8, 0x1e, 0x13, 0xbc, 0x9b,\n                                                          0xfb, 0x83, 0x7, 0x13, 0xcc, 0x7b, 0x7, 0xbf,\n                                                          0x83, 0x93, 0x8a, 0x9b, 0x52, 0xd8, 0xfb, 0xa1,\n                                                          0x18, 0x4b, 0xfb, 0x5e, 0x78, 0x49, 0x67, 0x7d,\n                                                          0x5c, 0x87, 0x19, 0xf7, 0x3f, 0xf9, 0x85, 0x15,\n                                                          0x13, 0xbc, 0x21, 0xa, 0xf7, 0x5b, 0x8b, 0xaf,\n                                                          0xf8, 0xd9, 0xaf, 0xf7, 0x70, 0x77, 0x50, 0xa,\n                                                          0xf7, 0xe3, 0xf9, 0x46, 0x52, 0xa, 0xab, 0x54,\n                                                          0x76, 0xf8, 0x50, 0xc7, 0xf7, 0x7d, 0x77, 0x12,\n                                                          0xf7, 0xd8, 0xd0, 0x17, 0xba, 0xa, 0xac, 0xac,\n                                                          0x79, 0x77, 0xac, 0x1f, 0x74, 0xb2, 0xb2, 0x72,\n                                                          0xb3, 0xaf, 0xa, 0x82, 0x8d, 0x85, 0x8e, 0x85,\n                                                          0x1f, 0x8f, 0x82, 0x90, 0x84, 0x84, 0x1a, 0x7e,\n                                                          0x7b, 0x88, 0x7f, 0x81, 0x78, 0x8b, 0xac, 0x71,\n                                                          0x1e, 0x57, 0xce, 0x7a, 0x9e, 0x49, 0x99, 0xf7,\n                                                          0xb6, 0xf7, 0xec, 0x18, 0xca, 0xa, 0xc3, 0xa1,\n                                                          0xaa, 0x8e, 0xb1, 0x1b, 0xf7, 0x1c, 0x6, 0x13,\n                                                          0xa0, 0x38, 0xf7, 0x10, 0x52, 0xa, 0xfb, 0x4a,\n                                                          0xa2, 0xf8, 0xa7, 0xa9, 0xf7, 0x8f, 0xa8, 0x1,\n                                                          0xa4, 0xdf, 0xf7, 0xd1, 0xdc, 0x3, 0xf7, 0xe,\n                                                          0xf8, 0x8, 0x15, 0xf7, 0x4, 0x6, 0x67, 0xfb,\n                                                          0xe1, 0x5, 0xfb, 0x8, 0x7e, 0x80, 0x39, 0x4f,\n                                                          0x1b, 0x85, 0x7e, 0x8f, 0x97, 0x91, 0x8f, 0x90,\n                                                          0x8e, 0x91, 0x1f, 0x8f, 0x91, 0x8e, 0x92, 0x93,\n                                                          0x1a, 0x9c, 0x7c, 0xa0, 0x73, 0x85, 0x64, 0x89,\n                                                          0x5a, 0x6d, 0xa4, 0x69, 0xc2, 0xf7, 0x18, 0xb0,\n                                                          0xf7, 0x72, 0xb2, 0x90, 0x1e, 0xb2, 0xf7, 0xb9,\n                                                          0x5, 0xf7, 0xe, 0x6, 0x92, 0xa9, 0x5, 0xfb,\n                                                          0x12, 0x6, 0xf7, 0x34, 0x9f, 0x99, 0xe6, 0xcc,\n                                                          0x1b, 0x97, 0x92, 0x84, 0x85, 0x85, 0x88, 0x85,\n                                                          0x87, 0x85, 0x1f, 0x88, 0x86, 0x88, 0x86, 0x84,\n                                                          0x1a, 0x72, 0xa2, 0x7d, 0x9c, 0xa5, 0x9a, 0xa0,\n                                                          0xa5, 0xbe, 0x59, 0x9d, 0x6d, 0xfb, 0x2, 0x50,\n                                                          0xfb, 0x20, 0xfb, 0x20, 0x77, 0x1e, 0xfb, 0x1,\n                                                          0x6, 0xe, 0x73, 0xf8, 0x95, 0x76, 0xd1, 0xa,\n                                                          0xe6, 0xf8, 0x80, 0x15, 0xb4, 0x6, 0xf7, 0x16,\n                                                          0xf3, 0xe0, 0x23, 0x5, 0xb1, 0x6, 0x33, 0xf7,\n                                                          0x3d, 0x5, 0x5a, 0x6, 0xe, 0x73, 0xf8, 0x95,\n                                                          0x76, 0xd1, 0xa, 0xf7, 0xd, 0xf7, 0xc5, 0x3,\n                                                          0xf7, 0x6d, 0xf8, 0x80, 0x7b, 0xa, 0x66, 0x6,\n                                                          0xfb, 0x1e, 0x22, 0x2f, 0xf4, 0x5, 0x65, 0x6,\n                                                          0xe, 0x73, 0xf8, 0x80, 0xc3, 0xf1, 0x77, 0x1,\n                                                          0xf7, 0x9, 0xa9, 0x3, 0xf7, 0x9, 0xf9, 0x1e,\n                                                          0x15, 0x61, 0x8c, 0xfb, 0x8, 0xf7, 0x19, 0xe1,\n                                                          0xce, 0xd2, 0xe2, 0x99, 0x1e, 0x6d, 0x6, 0x87,\n                                                          0x8a, 0x6b, 0x29, 0x28, 0x1b, 0x28, 0x81, 0xe1,\n                                                          0x9b, 0x1f, 0xe, 0x73, 0xf8, 0x90, 0xed, 0x1,\n                                                          0xf7, 0x63, 0xed, 0x3, 0xf7, 0x63, 0xf8, 0xc1,\n                                                          0x58, 0xa, 0xe, 0x73, 0xf8, 0x80, 0xad, 0x69,\n                                                          0xf7, 0x39, 0xab, 0xa, 0xf7, 0x39, 0x12, 0xf7,\n                                                          0x2f, 0xae, 0x68, 0xf7, 0x3b, 0xfb, 0x18, 0xf7,\n                                                          0x18, 0xfb, 0x18, 0xf7, 0x39, 0x6a, 0xac, 0x13,\n                                                          0xa4, 0x80, 0xf7, 0x2f, 0xf8, 0xe3, 0x15, 0x54,\n                                                          0xb7, 0x5f, 0xc2, 0x1e, 0x13, 0x99, 0x0, 0xc2,\n                                                          0xb9, 0xb7, 0xc2, 0xc2, 0x5d, 0xb8, 0x54, 0x1f,\n                                                          0x13, 0x44, 0x80, 0x54, 0x5f, 0x5e, 0x54, 0x1f,\n                                                          0xae, 0x16, 0xaf, 0xa8, 0xa9, 0xaf, 0xaf, 0xaa,\n                                                          0x6d, 0x67, 0x67, 0x6c, 0x6e, 0x67, 0x1e, 0x13,\n                                                          0xaa, 0x80, 0xe5, 0xa, 0xe, 0x73, 0xfb, 0x3d,\n                                                          0xb7, 0xf7, 0x39, 0x77, 0x1, 0x77, 0xc5, 0x3,\n                                                          0xc5, 0xb3, 0x15, 0x6e, 0x71, 0x5a, 0x44, 0x62,\n                                                          0x1a, 0x59, 0xa3, 0x76, 0xaa, 0xbb, 0xe8, 0xb2,\n                                                          0xb4, 0xa3, 0x1e, 0x75, 0x9c, 0x5, 0x6f, 0x76,\n                                                          0x43, 0x72, 0x74, 0x1b, 0x7d, 0x81, 0x94, 0x9f,\n                                                          0xb3, 0xa2, 0xc5, 0xa5, 0xb1, 0x1f, 0xe, 0x73,\n                                                          0xf8, 0x9c, 0xf2, 0x12, 0xef, 0xa2, 0xa, 0xa8,\n                                                          0x1f, 0x13, 0x80, 0x80, 0xa7, 0x57, 0xa, 0x78,\n                                                          0x75, 0x95, 0x96, 0x72, 0x1f, 0x96, 0x72, 0x70,\n                                                          0x96, 0x70, 0xd6, 0xa, 0x73, 0xf8, 0x82, 0xf7,\n                                                          0x3e, 0x1, 0xe8, 0xf8, 0x1d, 0x3, 0xe8, 0xad,\n                                                          0xa, 0xf7, 0x36, 0xee, 0x9f, 0xa, 0x9a, 0x99,\n                                                          0x47, 0xa, 0x7a, 0x80, 0x9d, 0xa, 0x9c, 0xfb,\n                                                          0x2d, 0x5e, 0xa, 0xe, 0xf7, 0x59, 0xad, 0x69,\n                                                          0xb9, 0x1, 0x85, 0xf7, 0x59, 0x15, 0xf8, 0x89,\n                                                          0x6, 0x95, 0xad, 0x5, 0xfc, 0x89, 0x6, 0xe,\n                                                          0xf8, 0xa8, 0xf7, 0x59, 0xb1, 0x65, 0xb9, 0x1,\n                                                          0x85, 0xf7, 0x59, 0x15, 0xfa, 0xd, 0x6, 0x96,\n                                                          0xb1, 0x5, 0xfe, 0xd, 0x6, 0xe, 0x73, 0x91,\n                                                          0xa, 0xf7, 0x3f, 0xcb, 0x4b, 0xf7, 0x5, 0x13,\n                                                          0xd0, 0xf7, 0xca, 0xf9, 0x1d, 0x15, 0x79, 0xa,\n                                                          0xb9, 0x93, 0xb5, 0xa0, 0x80, 0x96, 0x7f, 0x95,\n                                                          0x1e, 0x13, 0xe0, 0x7e, 0x96, 0x7e, 0x93, 0x9d,\n                                                          0xbd, 0xa, 0xe, 0x73, 0x91, 0xa, 0xf7, 0x44,\n                                                          0xf7, 0x6, 0x4b, 0xcb, 0x13, 0xe0, 0xf7, 0x34,\n                                                          0xf8, 0x48, 0x15, 0xea, 0xa, 0xc8, 0x9c, 0xa,\n                                                          0xaa, 0x69, 0x83, 0x5c, 0x84, 0x61, 0x76, 0x96,\n                                                          0x81, 0x97, 0x81, 0x1e, 0x13, 0xd0, 0x98, 0x80,\n                                                          0x99, 0x82, 0x79, 0x1a, 0x66, 0x54, 0x68, 0x77,\n                                                          0x7e, 0x1e, 0xe, 0x73, 0xfb, 0x15, 0xf7, 0x7a,\n                                                          0x12, 0xd2, 0xc0, 0xa, 0x13, 0xc0, 0xb7, 0xfb,\n                                                          0x4, 0x15, 0x6b, 0xa, 0x74, 0x98, 0x7f, 0x98,\n                                                          0x81, 0x1e, 0x13, 0xa0, 0x96, 0x82, 0x96, 0x82,\n                                                          0x7b, 0x82, 0xa, 0xe, 0xf7, 0x5b, 0x91, 0xa,\n                                                          0xf7, 0x3a, 0xcb, 0x4b, 0xf7, 0x4, 0xec, 0xcb,\n                                                          0x4b, 0xf7, 0x4, 0x13, 0xd4, 0xf7, 0xc5, 0xf9,\n                                                          0x1d, 0x15, 0x79, 0xa, 0xb8, 0x93, 0xb5, 0xa2,\n                                                          0x7e, 0x97, 0x7e, 0x95, 0x1e, 0x13, 0xe4, 0x80,\n                                                          0x94, 0x80, 0x94, 0x9b, 0xbd, 0xa, 0xf7, 0x65,\n                                                          0x16, 0x79, 0xa, 0xb8, 0x93, 0xb5, 0xa3, 0x7d,\n                                                          0x96, 0x7e, 0x96, 0x1e, 0x13, 0xd8, 0x80, 0x94,\n                                                          0x81, 0x93, 0x9b, 0xbd, 0xa, 0xe, 0xf7, 0x5b,\n                                                          0x91, 0xa, 0xf7, 0x46, 0xc0, 0xa, 0xec, 0xc0,\n                                                          0xa, 0x13, 0xe4, 0xf7, 0x34, 0xf8, 0x48, 0x15,\n                                                          0x59, 0xa, 0x75, 0x96, 0x80, 0x97, 0x81, 0x1e,\n                                                          0x13, 0xd8, 0x97, 0x81, 0x98, 0x82, 0x7a, 0x82,\n                                                          0xa, 0xf7, 0x6e, 0x7a, 0x15, 0x59, 0xa, 0x77,\n                                                          0x94, 0x80, 0x96, 0x82, 0x1e, 0x13, 0xd4, 0x98,\n                                                          0x80, 0x9a, 0x82, 0x78, 0x82, 0xa, 0xe, 0xf7,\n                                                          0x5b, 0xfb, 0x15, 0xf7, 0x7a, 0x12, 0xdf, 0xc0,\n                                                          0xa, 0xec, 0xc0, 0xa, 0x13, 0xd0, 0xc4, 0xfb,\n                                                          0x4, 0x15, 0x6b, 0xa, 0x75, 0x97, 0x7f, 0x97,\n                                                          0x81, 0x1e, 0x13, 0xb0, 0x97, 0x81, 0x97, 0x83,\n                                                          0x7a, 0x82, 0xa, 0xf7, 0x65, 0x16, 0x6b, 0xa,\n                                                          0x73, 0x99, 0x80, 0x98, 0x80, 0x1e, 0x13, 0xa8,\n                                                          0x96, 0x82, 0x95, 0x83, 0x7b, 0x82, 0xa, 0xe,\n                                                          0xf8, 0x3e, 0xa0, 0xf7, 0x6f, 0x77, 0x12, 0xf7,\n                                                          0xb2, 0xe4, 0x17, 0xf7, 0x31, 0xfb, 0x33, 0x15,\n                                                          0xa1, 0x6, 0xbb, 0xf7, 0x66, 0x97, 0xc1, 0xb2,\n                                                          0xf7, 0x1, 0xa9, 0xb7, 0x19, 0x81, 0x8e, 0x85,\n                                                          0xb5, 0xb7, 0x1a, 0xa7, 0x8e, 0xa9, 0x91, 0xa0,\n                                                          0x1e, 0xbc, 0xa7, 0x82, 0x82, 0xa0, 0x1f, 0x84,\n                                                          0x9c, 0x97, 0x85, 0x9a, 0x1b, 0xa8, 0x9b, 0xa0,\n                                                          0xa0, 0x1f, 0x13, 0xe0, 0x9f, 0x7c, 0x9f, 0x6c,\n                                                          0x72, 0x7e, 0x84, 0x83, 0x7a, 0x1e, 0x84, 0x7a,\n                                                          0x75, 0x83, 0x5f, 0x1b, 0x96, 0xc3, 0x9d, 0xa7,\n                                                          0x9a, 0x9f, 0x8, 0x9a, 0x9f, 0x97, 0x98, 0xa5,\n                                                          0x1a, 0xb0, 0x77, 0x9e, 0x76, 0x74, 0x72, 0x77,\n                                                          0x67, 0x7a, 0x8e, 0x7f, 0x8d, 0x7e, 0x1e, 0x8d,\n                                                          0x81, 0x8d, 0x7f, 0x7c, 0x1a, 0x78, 0x88, 0x6f,\n                                                          0x84, 0x66, 0x1e, 0x60, 0x75, 0x92, 0x93, 0x79,\n                                                          0x1f, 0x92, 0x7a, 0x7e, 0x93, 0x72, 0x1b, 0x6c,\n                                                          0x7c, 0x77, 0x77, 0x76, 0x9b, 0x76, 0xa8, 0x9c,\n                                                          0x99, 0x93, 0x93, 0x9e, 0x1f, 0x93, 0x9e, 0xa4,\n                                                          0x92, 0xb3, 0x1b, 0x7f, 0x45, 0x73, 0x55, 0x65,\n                                                          0x63, 0x99, 0xfb, 0x20, 0x76, 0x56, 0x61, 0xfb,\n                                                          0x78, 0x8, 0xe, 0xfb, 0x57, 0x76, 0xf7, 0x3e,\n                                                          0xd3, 0x74, 0x76, 0xb2, 0x76, 0xf8, 0x58, 0xd3,\n                                                          0xf7, 0x3e, 0x77, 0x12, 0xd8, 0xe0, 0xf7, 0x39,\n                                                          0xe0, 0x13, 0x9f, 0xf7, 0x30, 0x79, 0x15, 0x7b,\n                                                          0x5b, 0x4c, 0x4a, 0x5b, 0x1a, 0x79, 0x99, 0x78,\n                                                          0x9e, 0xaa, 0xa0, 0xa3, 0xdb, 0xab, 0x8e, 0xab,\n                                                          0x94, 0xa9, 0x1e, 0xc2, 0xb8, 0x6f, 0xaf, 0x1b,\n                                                          0xa0, 0x9e, 0x9a, 0xa0, 0x9f, 0x78, 0x9b, 0x78,\n                                                          0x1f, 0x66, 0x67, 0x71, 0x50, 0x1b, 0x9b, 0xb3,\n                                                          0x9e, 0xb5, 0xb0, 0xa4, 0x8, 0x84, 0x9d, 0x88,\n                                                          0x9d, 0x9e, 0x1a, 0xd0, 0xb3, 0xee, 0xc3, 0xb4,\n                                                          0x1e, 0x7f, 0x9e, 0x85, 0x9a, 0xa2, 0x1a, 0x9c,\n                                                          0x8f, 0x9c, 0x8f, 0x9b, 0x1e, 0xc9, 0xb1, 0x71,\n                                                          0xae, 0x1b, 0x9f, 0x9f, 0x9a, 0xa0, 0x9e, 0x77,\n                                                          0x9c, 0x79, 0x1f, 0x66, 0x5b, 0x6f, 0x5c, 0x1b,\n                                                          0x9b, 0xbb, 0xca, 0xcc, 0xbb, 0x1a, 0x9d, 0x7d,\n                                                          0x9e, 0x78, 0x6c, 0x76, 0x73, 0x3b, 0x1e, 0x13,\n                                                          0xcf, 0x6b, 0x88, 0x6b, 0x82, 0x6d, 0x1e, 0x54,\n                                                          0x5e, 0xa7, 0x67, 0x1b, 0x76, 0x78, 0x7c, 0x76,\n                                                          0x1f, 0x13, 0xaf, 0x77, 0x9e, 0x7b, 0x9e, 0x1e,\n                                                          0xb0, 0xaf, 0xa5, 0xc6, 0x1b, 0x7b, 0x63, 0x78,\n                                                          0x61, 0x66, 0x72, 0x8, 0x92, 0x79, 0x8e, 0x79,\n                                                          0x78, 0x1a, 0x46, 0x63, 0x28, 0x53, 0x62, 0x1e,\n                                                          0x13, 0xcf, 0x97, 0x78, 0x91, 0x7c, 0x74, 0x1a,\n                                                          0x7a, 0x87, 0x7a, 0x87, 0x7b, 0x1e, 0x4d, 0x65,\n                                                          0xa5, 0x68, 0x1b, 0x13, 0x9f, 0x77, 0x77, 0x7c,\n                                                          0x76, 0x78, 0x9f, 0x7a, 0x9d, 0x1f, 0xb0, 0xbb,\n                                                          0xa7, 0xba, 0x1b, 0xe, 0x84, 0xf7, 0x68, 0x76,\n                                                          0xad, 0x76, 0xf7, 0x87, 0x77, 0xad, 0x77, 0x12,\n                                                          0xbe, 0xf7, 0x8a, 0x13, 0x98, 0xc0, 0xf7, 0xdb,\n                                                          0x15, 0x13, 0x58, 0x47, 0xc1, 0x54, 0xcf, 0xce,\n                                                          0xc1, 0xc3, 0xce, 0x1e, 0x13, 0xa8, 0xce, 0x55,\n                                                          0xc0, 0x47, 0x47, 0x56, 0x56, 0x48, 0x1e, 0xe,\n                                                          0xf8, 0xa8, 0x80, 0xef, 0x12, 0xc4, 0xf7, 0x3,\n                                                          0x35, 0xef, 0xf7, 0x3b, 0xef, 0x2c, 0xf7, 0x3,\n                                                          0xf7, 0x2c, 0xef, 0x49, 0xf7, 0x3, 0x13, 0xaa,\n                                                          0xdd, 0xb2, 0x15, 0x8f, 0xa, 0x13, 0xd2, 0xf7,\n                                                          0x9f, 0x16, 0x8f, 0xa, 0x13, 0xcc, 0xf7, 0xa0,\n                                                          0x16, 0x6f, 0xa0, 0x75, 0xa7, 0xa7, 0xa2, 0xa1,\n                                                          0xa7, 0xa7, 0x74, 0xa1, 0x6f, 0x6f, 0x76, 0x75,\n                                                          0x6f, 0x1e, 0xe, 0xf9, 0x17, 0xb0, 0xa, 0xcb,\n                                                          0xd0, 0xa, 0x75, 0xd0, 0xa, 0xb1, 0xd0, 0xa,\n                                                          0x13, 0xb5, 0xe0, 0xf9, 0x42, 0xf7, 0x9, 0x30,\n                                                          0xa, 0xfc, 0x27, 0xbc, 0x30, 0xa, 0xfb, 0xeb,\n                                                          0xf8, 0x11, 0x6a, 0xa, 0x1e, 0x13, 0xb6, 0xe0,\n                                                          0x2f, 0xa, 0x13, 0x6e, 0xe0, 0x53, 0xfc, 0x33,\n                                                          0x15, 0xb5, 0x6, 0xf8, 0xad, 0xf9, 0x48, 0x5,\n                                                          0x61, 0x6, 0xe, 0x73, 0xb0, 0xf8, 0x2, 0x1,\n                                                          0xbe, 0xf7, 0x7a, 0x3, 0xbe, 0xf7, 0x6c, 0x68,\n                                                          0xa, 0x96, 0x63, 0xef, 0x6c, 0xc8, 0x1f, 0xf7,\n                                                          0x12, 0xf7, 0x16, 0x9e, 0xaa, 0x9c, 0x69, 0xa,\n                                                          0xe, 0x73, 0xce, 0xa, 0xc7, 0xf7, 0x72, 0x3,\n                                                          0xf7, 0x5a, 0xf7, 0x73, 0x15, 0xfb, 0x12, 0xfb,\n                                                          0x16, 0x77, 0x6c, 0x7a, 0x44, 0xa, 0x80, 0xb4,\n                                                          0x27, 0xaa, 0x4e, 0x1f, 0xe, 0xfb, 0x52, 0x96,\n                                                          0x76, 0xf9, 0x42, 0x77, 0x1, 0x82, 0x81, 0x15,\n                                                          0xb7, 0x6, 0xf7, 0x36, 0xf9, 0x42, 0x5, 0x5c,\n                                                          0x6, 0xe, 0x8b, 0xb8, 0xf7, 0x65, 0xb1, 0xe1,\n                                                          0xb1, 0xf7, 0x6b, 0xb0, 0x1, 0xf7, 0x4e, 0xf7,\n                                                          0x1, 0xf7, 0x8a, 0xa2, 0x3, 0xce, 0xf7, 0x92,\n                                                          0x15, 0xfb, 0x41, 0xf4, 0x3a, 0xf6, 0xf6, 0xf7,\n                                                          0x12, 0xba, 0xdf, 0xbf, 0x1e, 0x7a, 0x94, 0x5,\n                                                          0x53, 0x63, 0x26, 0x64, 0x57, 0x1b, 0xfb, 0x13,\n                                                          0x58, 0xbf, 0xf7, 0x31, 0x1f, 0xf7, 0xac, 0x6,\n                                                          0x97, 0xb1, 0x5, 0xfb, 0xb7, 0x6, 0xa5, 0x94,\n                                                          0xab, 0x94, 0xa7, 0x1e, 0xf7, 0xb5, 0x6, 0x99,\n                                                          0xb1, 0x5, 0xfb, 0xb5, 0x6, 0xd5, 0x97, 0xe2,\n                                                          0xf7, 0x21, 0xf1, 0x1b, 0xf7, 0x6, 0x91, 0x52,\n                                                          0x2e, 0x1f, 0xa2, 0xf7, 0x22, 0x6, 0x9e, 0x63,\n                                                          0x79, 0xa5, 0x2c, 0x1b, 0x52, 0xfb, 0x44, 0x53,\n                                                          0xfb, 0x58, 0x49, 0x1f, 0x28, 0x6, 0x7e, 0x65,\n                                                          0x5, 0xeb, 0x6, 0x83, 0x6e, 0x83, 0x6f, 0x89,\n                                                          0x6e, 0x8, 0x4a, 0x6, 0x7e, 0x65, 0x5, 0xe,\n                                                          0xf9, 0x3, 0xf7, 0x8d, 0x9f, 0x8a, 0x76, 0xf8,\n                                                          0x16, 0x9f, 0x12, 0xf7, 0x3b, 0xd2, 0xf7, 0x8e,\n                                                          0xa5, 0xf7, 0xd0, 0xd2, 0x13, 0xbc, 0xf7, 0x9,\n                                                          0xf7, 0x8d, 0x15, 0xf7, 0x3f, 0x9f, 0x6, 0x57,\n                                                          0x91, 0x8d, 0x95, 0xbb, 0x1a, 0xf7, 0xc0, 0xbd,\n                                                          0x7, 0xb4, 0x9c, 0x6c, 0x66, 0x94, 0x1f, 0x9f,\n                                                          0xe3, 0xfb, 0xed, 0x33, 0x9f, 0x6, 0xb0, 0x94,\n                                                          0x9c, 0xaa, 0xb5, 0x1b, 0xbc, 0xfb, 0xc0, 0x6,\n                                                          0x5b, 0x8d, 0x81, 0x57, 0x85, 0x1e, 0xf7, 0xd3,\n                                                          0x77, 0x15, 0xf7, 0x17, 0x9f, 0x6, 0x5e, 0x8f,\n                                                          0x83, 0xa6, 0xb7, 0x1a, 0xf7, 0x65, 0x8d, 0x7,\n                                                          0x13, 0x7c, 0xf7, 0x29, 0xfb, 0xc6, 0x5, 0x96,\n                                                          0x6, 0xf7, 0x2c, 0xf7, 0xc8, 0x5, 0x8d, 0xfb,\n                                                          0x72, 0x6, 0x13, 0xbc, 0x5b, 0x8e, 0x81, 0x57,\n                                                          0x85, 0x1e, 0x77, 0xf7, 0x3e, 0x9f, 0x7, 0x57,\n                                                          0x91, 0x8d, 0x95, 0xbb, 0x1a, 0xf7, 0x89, 0x7,\n                                                          0xae, 0x97, 0x9d, 0xb7, 0x8d, 0x1e, 0x9f, 0x24,\n                                                          0x7, 0xfb, 0x34, 0xfb, 0xc9, 0xfb, 0x2e, 0xf7,\n                                                          0xc9, 0x5, 0xfb, 0xd, 0x77, 0x6, 0xa8, 0xa7,\n                                                          0x77, 0x6d, 0x97, 0x1f, 0xfb, 0x83, 0x7, 0x5f,\n                                                          0x83, 0x70, 0x5f, 0x87, 0x1e, 0xe, 0xf7, 0xd2,\n                                                          0xe1, 0xf7, 0x70, 0x15, 0xf8, 0x96, 0xb5, 0xfc,\n                                                          0x96, 0x6, 0xe, 0xfb, 0x63, 0xa3, 0x73, 0xf7,\n                                                          0x4, 0xf3, 0x76, 0xf8, 0x2c, 0xab, 0xf7, 0x7b,\n                                                          0xa1, 0x12, 0x13, 0xb8, 0xb8, 0xf8, 0x20, 0x15,\n                                                          0xe2, 0x6, 0x81, 0x75, 0x53, 0xfb, 0xb3, 0x74,\n                                                          0xfb, 0x3, 0x8, 0x55, 0x80, 0x70, 0x22, 0x54,\n                                                          0x1b, 0x77, 0x87, 0x8e, 0x95, 0x90, 0x8e, 0x92,\n                                                          0x8e, 0x93, 0x1f, 0x13, 0x78, 0x8d, 0x91, 0x8c,\n                                                          0x91, 0x91, 0x1a, 0x98, 0x82, 0xa3, 0x70, 0x70,\n                                                          0x7e, 0x68, 0x7c, 0x7a, 0x98, 0x5e, 0xcc, 0xf7,\n                                                          0x9, 0xc3, 0xf7, 0x34, 0xf7, 0xf, 0xa7, 0x1e,\n                                                          0xd3, 0xf7, 0xd4, 0x5, 0xf7, 0x2f, 0x6, 0x97,\n                                                          0x8f, 0x87, 0x86, 0x88, 0x8b, 0x87, 0x8a, 0x88,\n                                                          0x1f, 0x6e, 0x20, 0x53, 0xfb, 0x52, 0x66, 0x1a,\n                                                          0x6c, 0x9d, 0x77, 0xaa, 0xb8, 0xb7, 0xb9, 0xc6,\n                                                          0xb5, 0x1e, 0x7b, 0x94, 0x5, 0x78, 0x7b, 0x61,\n                                                          0x59, 0x78, 0x1b, 0x86, 0x84, 0x8d, 0x94, 0x9a,\n                                                          0xe3, 0xf7, 0xce, 0x92, 0xa7, 0x1f, 0x90, 0x9e,\n                                                          0x8c, 0x91, 0x8a, 0x8e, 0x86, 0x8e, 0x18, 0x85,\n                                                          0x80, 0x89, 0x89, 0x7b, 0x1f, 0x89, 0x7b, 0x75,\n                                                          0x89, 0x6f, 0x1b, 0xfb, 0x2a, 0x6, 0xf7, 0x16,\n                                                          0xb0, 0xa7, 0xf0, 0xea, 0x1b, 0x9f, 0x9a, 0x86,\n                                                          0x80, 0x86, 0x88, 0x87, 0x88, 0x85, 0x1f, 0x88,\n                                                          0x85, 0x87, 0x83, 0x7d, 0x1a, 0x70, 0x9b, 0x7d,\n                                                          0xa0, 0x9f, 0xa5, 0x99, 0xb2, 0xba, 0x55, 0xa1,\n                                                          0x5d, 0xfb, 0x37, 0x58, 0xfb, 0x31, 0x2b, 0x6f,\n                                                          0x1e, 0x34, 0x6, 0xe, 0xfb, 0x60, 0xa4, 0xf7,\n                                                          0x53, 0x76, 0xf8, 0x29, 0xab, 0xf7, 0x7c, 0xa1,\n                                                          0x12, 0xfb, 0x21, 0xd3, 0x17, 0xf7, 0x6c, 0xf8,\n                                                          0x40, 0x15, 0xd2, 0x9d, 0xb0, 0xf7, 0x35, 0xf7,\n                                                          0x1, 0x1b, 0x13, 0xf8, 0xa9, 0x97, 0x7d, 0x82,\n                                                          0x1f, 0x86, 0x7f, 0x81, 0x7d, 0x1a, 0x85, 0x8d,\n                                                          0x86, 0x8e, 0x85, 0x1e, 0x8e, 0x85, 0x8e, 0x84,\n                                                          0x89, 0x85, 0x67, 0xfb, 0x24, 0x18, 0xfb, 0xea,\n                                                          0x6b, 0x15, 0xe4, 0x6, 0x87, 0x79, 0x5f, 0xfb,\n                                                          0x69, 0x64, 0xfb, 0x4e, 0x8, 0x4e, 0x7e, 0x70,\n                                                          0x2a, 0x57, 0x1b, 0x75, 0x88, 0x8f, 0x94, 0x90,\n                                                          0x8e, 0x92, 0x8d, 0x92, 0x1f, 0x8d, 0x91, 0x8d,\n                                                          0x91, 0x92, 0x1a, 0x9e, 0x7c, 0x9c, 0x77, 0x6b,\n                                                          0x82, 0x6c, 0x77, 0x7e, 0x94, 0x5b, 0xd1, 0xea,\n                                                          0xce, 0xf7, 0x3, 0xf7, 0x47, 0xb3, 0x1e, 0xd0,\n                                                          0xf7, 0xca, 0x5, 0xf7, 0x3a, 0x6, 0x7a, 0x35,\n                                                          0x4c, 0xfb, 0x67, 0x53, 0x1a, 0x6a, 0x9e, 0x78,\n                                                          0xa7, 0xad, 0xb0, 0x9c, 0xe3, 0xc9, 0x1e, 0x7b,\n                                                          0x94, 0x5, 0x70, 0x74, 0x67, 0x61, 0x79, 0x1b,\n                                                          0x86, 0x84, 0x8d, 0x95, 0x1f, 0x13, 0x30, 0xa1,\n                                                          0xf7, 0x1d, 0xf8, 0xc0, 0x94, 0xac, 0x1e, 0x8c,\n                                                          0x90, 0x8c, 0x90, 0x8f, 0x1a, 0x90, 0x89, 0x8f,\n                                                          0x88, 0x87, 0x85, 0x88, 0x89, 0x84, 0x1e, 0x88,\n                                                          0x84, 0x84, 0x88, 0x83, 0x1b, 0x83, 0x7d, 0x8e,\n                                                          0x8e, 0x7b, 0x1f, 0x8d, 0x7b, 0x7a, 0x8e, 0x7d,\n                                                          0x1b, 0xfb, 0x2e, 0x4a, 0xfb, 0x1e, 0xfb, 0x8,\n                                                          0x6b, 0x1f, 0x30, 0x6, 0xe, 0x79, 0x9d, 0xf8,\n                                                          0x3f, 0x98, 0xf7, 0x68, 0x9c, 0x91, 0x92, 0x6,\n                                                          0xfb, 0x64, 0x8f, 0xf8, 0x6c, 0x8d, 0x7, 0x1e,\n                                                          0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xaa, 0xa,\n                                                          0xd6, 0xb, 0xf8, 0x88, 0x14, 0xf7, 0xf9, 0x15,\n                                                          0xb0, 0x13, 0x0, 0xcd, 0x2, 0x0, 0x1, 0x0,\n                                                          0x13, 0x0, 0x17, 0x0, 0x31, 0x0, 0x34, 0x0,\n                                                          0x61, 0x0, 0x67, 0x0, 0x9c, 0x0, 0xa5, 0x0,\n                                                          0xb6, 0x0, 0xbf, 0x0, 0xf3, 0x1, 0xf, 0x1,\n                                                          0x1b, 0x1, 0x27, 0x1, 0x2c, 0x1, 0x4e, 0x1,\n                                                          0x53, 0x1, 0x59, 0x1, 0x6b, 0x1, 0x72, 0x1,\n                                                          0x88, 0x1, 0xa2, 0x1, 0xb8, 0x1, 0xdf, 0x1,\n                                                          0xf3, 0x2, 0x2, 0x2, 0x21, 0x2, 0x2a, 0x2,\n                                                          0x37, 0x2, 0x57, 0x2, 0x63, 0x2, 0x6e, 0x2,\n                                                          0x85, 0x2, 0x99, 0x2, 0xae, 0x2, 0xbd, 0x2,\n                                                          0xe3, 0x2, 0xea, 0x2, 0xef, 0x2, 0xf7, 0x3,\n                                                          0x37, 0x3, 0x53, 0x3, 0x62, 0x3, 0x71, 0x3,\n                                                          0x7e, 0x3, 0x8f, 0x3, 0xa0, 0x3, 0xae, 0x3,\n                                                          0xe7, 0x4, 0x1f, 0x4, 0x2c, 0x4, 0x32, 0x4,\n                                                          0x3f, 0x4, 0x44, 0x4, 0x4c, 0x4, 0x51, 0x4,\n                                                          0x55, 0x4, 0x61, 0x4, 0x6a, 0x4, 0x71, 0x4,\n                                                          0x7f, 0x4, 0x8d, 0x4, 0x9d, 0x4, 0xa7, 0x4,\n                                                          0xb1, 0x4, 0xbb, 0x4, 0xc8, 0x4, 0xd4, 0x4,\n                                                          0xf9, 0x5, 0x3, 0x5, 0xa, 0x5, 0x2d, 0x5,\n                                                          0x40, 0x5, 0x53, 0x5, 0x5e, 0x5, 0x64, 0x5,\n                                                          0x6c, 0x5, 0x8c, 0x5, 0xac, 0x5, 0xcc, 0x5,\n                                                          0xdd, 0x5, 0xe2, 0x5, 0xec, 0x5, 0xf6, 0x6,\n                                                          0x2, 0x6, 0x1e, 0x6, 0x26, 0x6, 0x36, 0x6,\n                                                          0x46, 0x6, 0x55, 0x6, 0x64, 0x6, 0x6d, 0x6,\n                                                          0x76, 0x6, 0x7b, 0x6, 0x8b, 0x6, 0x9b, 0x6,\n                                                          0x9f, 0x6, 0xa7, 0x6, 0xaf, 0x6, 0xc3, 0x6,\n                                                          0xd6, 0x6, 0xe2, 0x6, 0xe8, 0x6, 0xec, 0x6,\n                                                          0xf7, 0x7, 0xa, 0x7, 0x1d, 0x7, 0x22, 0x7,\n                                                          0x2d, 0x7, 0x36, 0x7, 0x48, 0x7, 0x5a, 0x7,\n                                                          0x5f, 0x7, 0x67, 0x7, 0x6f, 0x7, 0x75, 0x7,\n                                                          0x86, 0x7, 0x97, 0x7, 0xa1, 0x7, 0xab, 0x7,\n                                                          0xb5, 0x7, 0xbc, 0x7, 0xc1, 0x7, 0xc6, 0x7,\n                                                          0xcb, 0x7, 0xcf, 0x7, 0xd3, 0x7, 0xd7, 0x7,\n                                                          0xe3, 0x7, 0xee, 0x7, 0xf3, 0x7, 0xfc, 0x8,\n                                                          0x7, 0x8, 0x16, 0x8, 0x19, 0x8, 0x22, 0x8,\n                                                          0x26, 0x8, 0x2d, 0x8, 0x33, 0x8, 0x3a, 0x8,\n                                                          0x41, 0x8, 0x46, 0x8, 0x4b, 0x8, 0x59, 0x8,\n                                                          0x67, 0x8, 0x75, 0x8, 0x83, 0x8, 0x91, 0x8,\n                                                          0x9f, 0x8, 0xab, 0x8, 0xaf, 0x8, 0xb3, 0x8,\n                                                          0xc0, 0x8, 0xcd, 0x8, 0xda, 0x8, 0xe7, 0x8,\n                                                          0xf4, 0x8, 0xfc, 0x9, 0x4, 0x9, 0xb, 0x9,\n                                                          0x10, 0x9, 0x1c, 0x9, 0x28, 0x9, 0x34, 0x9,\n                                                          0x3a, 0x9, 0x3e, 0x9, 0x42, 0x9, 0x4d, 0x9,\n                                                          0x55, 0x9, 0x60, 0x9, 0x6b, 0x9, 0x6f, 0x9,\n                                                          0x76, 0x9, 0x7d, 0x9, 0x84, 0x9, 0x8b, 0x9,\n                                                          0x90, 0x9, 0x95, 0x9, 0x9a, 0x9, 0xa4, 0x9,\n                                                          0xae, 0x9, 0xb8, 0x9, 0xbb, 0x9, 0xbf, 0x9,\n                                                          0xc8, 0x9, 0xd1, 0x9, 0xda, 0x9, 0xe3, 0x9,\n                                                          0xec, 0x9, 0xf5, 0x9, 0xfe, 0xa, 0x7, 0xa,\n                                                          0x10, 0xa, 0x19, 0xa, 0x1f, 0xa, 0x25, 0xa,\n                                                          0x2b, 0xa, 0x31, 0xa, 0x37, 0xa, 0x3b, 0xa,\n                                                          0x41, 0xa, 0x46, 0xa, 0x4a, 0xa, 0x4e, 0xa,\n                                                          0x52, 0x70, 0xa1, 0x75, 0xa6, 0xa6, 0xa1, 0xa1,\n                                                          0xa6, 0xa6, 0x75, 0xa1, 0x70, 0x70, 0x75, 0x75,\n                                                          0x70, 0x1e, 0xb, 0x20, 0xa, 0x25, 0xa, 0x61,\n                                                          0xa, 0x71, 0xb5, 0xb6, 0xad, 0xaf, 0xd5, 0xc7,\n                                                          0x1e, 0x38, 0xa, 0x47, 0x87, 0x7b, 0x52, 0x5,\n                                                          0x89, 0x6, 0xa4, 0x6a, 0xb2, 0x5f, 0xa, 0x1e,\n                                                          0xb, 0x15, 0x21, 0xa, 0x15, 0xfb, 0x52, 0xf7,\n                                                          0x1a, 0x54, 0xe0, 0xae, 0xa, 0xf7, 0x84, 0x4f,\n                                                          0xa, 0xfb, 0x6e, 0xfb, 0x71, 0x1e, 0xf4, 0x16,\n                                                          0xd8, 0xeb, 0xf7, 0xdd, 0xf7, 0x5e, 0xef, 0xaa,\n                                                          0x48, 0xfb, 0x17, 0x2e, 0x2b, 0xfb, 0xdb, 0xfb,\n                                                          0x5f, 0xfb, 0x16, 0x8b, 0xf7, 0x1a, 0xd9, 0x1e,\n                                                          0xb, 0xf7, 0x5c, 0x16, 0x20, 0xa, 0xe, 0x15,\n                                                          0x38, 0xb8, 0x4e, 0xf5, 0xf7, 0x2d, 0xf7, 0x1d,\n                                                          0xf7, 0x49, 0xf7, 0xf, 0xcd, 0x6c, 0xdd, 0xfb,\n                                                          0x8, 0xfb, 0x26, 0xfb, 0x28, 0xfb, 0x35, 0xfb,\n                                                          0x27, 0x1e, 0xdf, 0x8a, 0x15, 0xc9, 0xe6, 0xf7,\n                                                          0x76, 0xf7, 0x4, 0xb8, 0xa4, 0x7d, 0xfb, 0x5,\n                                                          0x5a, 0x3c, 0xfb, 0x7e, 0xfb, 0x6, 0x59, 0x6d,\n                                                          0xaa, 0xe6, 0x1e, 0xb, 0x35, 0xa, 0x83, 0x68,\n                                                          0x7c, 0x19, 0x45, 0xa, 0xb, 0x36, 0xa, 0xaa,\n                                                          0xa2, 0x7c, 0x4d, 0x2e, 0x2c, 0xfb, 0x67, 0x21,\n                                                          0x70, 0x6a, 0x9d, 0xc0, 0x1e, 0xb, 0x3a, 0xa,\n                                                          0xeb, 0xa, 0x37, 0xa, 0xd2, 0xa, 0xb, 0xf7,\n                                                          0x88, 0x9b, 0x6, 0x58, 0x8f, 0x7c, 0xa1, 0xa6,\n                                                          0x1a, 0x9e, 0x92, 0xa1, 0x90, 0x9f, 0x1e, 0xf5,\n                                                          0xf8, 0x1b, 0xa3, 0xe1, 0x90, 0xa0, 0xce, 0x94,\n                                                          0x19, 0x93, 0xa, 0xbc, 0x85, 0x9c, 0x76, 0x6f,\n                                                          0x1a, 0x79, 0x87, 0x76, 0x85, 0x76, 0x1e, 0xfb,\n                                                          0x0, 0xfc, 0x1b, 0x73, 0x36, 0x87, 0x77, 0x4a,\n                                                          0x81, 0x19, 0xb, 0x72, 0xa, 0x70, 0xa8, 0xd8,\n                                                          0x9d, 0x90, 0x42, 0xa, 0x79, 0x87, 0x9a, 0x97,\n                                                          0x8d, 0x8c, 0x94, 0xe6, 0xf7, 0xfb, 0x1f, 0x56,\n                                                          0x81, 0x59, 0x82, 0x59, 0x85, 0x8, 0xb, 0x3f,\n                                                          0xa, 0x5, 0x84, 0x64, 0x2c, 0x79, 0x71, 0x1b,\n                                                          0x3e, 0xa, 0xb, 0x3d, 0xa, 0xb7, 0x70, 0xad,\n                                                          0x58, 0x5b, 0xa, 0x1e, 0x54, 0xa, 0xb, 0x2b,\n                                                          0xa, 0x5d, 0xa, 0xb, 0xe5, 0x4d, 0xb9, 0x58,\n                                                          0xfb, 0x1, 0x3a, 0xfb, 0x11, 0x27, 0x1e, 0xc9,\n                                                          0x5a, 0x15, 0xd1, 0xc0, 0xf7, 0x4c, 0xd6, 0xb5,\n                                                          0x94, 0x65, 0x6f, 0x4e, 0x56, 0xfb, 0x4f, 0x3e,\n                                                          0x6a, 0x7b, 0xa9, 0xa9, 0x1e, 0xb, 0x6a, 0xa,\n                                                          0x2f, 0xa, 0xb, 0x15, 0xb2, 0x6, 0x39, 0xa,\n                                                          0xb, 0x4e, 0xa, 0x69, 0x6c, 0x97, 0xb0, 0x91,\n                                                          0x8b, 0x91, 0x8d, 0x92, 0x1f, 0x8e, 0x97, 0x98,\n                                                          0x3c, 0xa, 0xb, 0xf7, 0xd2, 0xf7, 0x1f, 0x22,\n                                                          0xa, 0xb, 0x15, 0x32, 0xa, 0x7e, 0x80, 0xfb,\n                                                          0x2e, 0x74, 0xa, 0xf7, 0x2f, 0xa9, 0x7d, 0x4f,\n                                                          0x7e, 0x8a, 0x7d, 0x8a, 0x7a, 0x41, 0xa, 0xe,\n                                                          0x1e, 0x7b, 0xf7, 0x8a, 0x9b, 0x7, 0x51, 0x90,\n                                                          0x86, 0xa0, 0x7f, 0xd1, 0x2c, 0xf8, 0xc0, 0x18,\n                                                          0x71, 0x6, 0xfb, 0xce, 0xfc, 0xb3, 0x5a, 0x35,\n                                                          0x76, 0xb, 0x6e, 0x8e, 0x32, 0xef, 0xc7, 0xc0,\n                                                          0xa9, 0xf7, 0xe, 0xde, 0x1e, 0xfb, 0x6b, 0x6b,\n                                                          0x15, 0xe5, 0xe5, 0xf7, 0x70, 0xf7, 0x9, 0xb,\n                                                          0x7b, 0x7, 0xb1, 0xa9, 0x7a, 0x5f, 0x79, 0x2f,\n                                                          0xfb, 0xd6, 0x82, 0x6c, 0x1f, 0x5f, 0x7e, 0x58,\n                                                          0xfb, 0x1e, 0xfb, 0x1e, 0x1b, 0x4b, 0x40, 0xab,\n                                                          0xe4, 0xc1, 0xf4, 0xf7, 0xe8, 0x97, 0xb9, 0x1f,\n                                                          0xa9, 0x93, 0xa4, 0xa2, 0xc5, 0x1b, 0xb, 0x7f,\n                                                          0x95, 0x5, 0x5f, 0x5e, 0x77, 0x72, 0x7c, 0xec,\n                                                          0xa, 0x91, 0x92, 0xaa, 0xe7, 0xf7, 0xe9, 0x8e,\n                                                          0x97, 0x1f, 0xb, 0xf7, 0x1d, 0xf3, 0xdd, 0x23,\n                                                          0x5, 0xaf, 0x6, 0x33, 0xf7, 0x3d, 0x5, 0x5a,\n                                                          0x6, 0xb, 0x15, 0xc5, 0x86, 0x9c, 0x7f, 0x67,\n                                                          0x59, 0x27, 0xfb, 0xae, 0x7c, 0xa, 0xf7, 0x2d,\n                                                          0xd2, 0xe3, 0xf7, 0x19, 0xb2, 0x1e, 0xf5, 0xf8,\n                                                          0x7, 0x95, 0xae, 0x97, 0x9c, 0xc6, 0x96, 0x19,\n                                                          0xb, 0x53, 0xa, 0x2e, 0xa, 0x13, 0x78, 0x62,\n                                                          0xa, 0xb, 0xb4, 0xb9, 0xf7, 0x42, 0x8, 0xf7,\n                                                          0x37, 0x8b, 0x86, 0x5a, 0x40, 0xa, 0xb, 0xe5,\n                                                          0xae, 0xd9, 0xe1, 0xc1, 0x1b, 0x9e, 0x98, 0x84,\n                                                          0x64, 0x83, 0x81, 0xfb, 0x10, 0xfb, 0x62, 0x61,\n                                                          0x1f, 0x84, 0x75, 0x15, 0xa7, 0x8f, 0x5, 0xf7,\n                                                          0x36, 0xa2, 0xed, 0xdc, 0xda, 0x1a, 0xb, 0x7b,\n                                                          0x7, 0xc2, 0x90, 0x7c, 0x76, 0x1f, 0x6f, 0x3f,\n                                                          0x4b, 0xa, 0xb, 0x4a, 0xa, 0x8f, 0x99, 0x1f,\n                                                          0xe3, 0xf7, 0xd6, 0x88, 0x8d, 0xb, 0x7b, 0x88,\n                                                          0x7b, 0x87, 0x7c, 0x1f, 0x9f, 0x86, 0xcf, 0xf7,\n                                                          0x7c, 0x79, 0x8f, 0x81, 0x75, 0x82, 0x78, 0x82,\n                                                          0x7d, 0x19, 0x6c, 0x75, 0xb, 0x63, 0xa, 0xdb,\n                                                          0x8f, 0x5d, 0x50, 0x79, 0x1f, 0xfb, 0x9, 0xfc,\n                                                          0x40, 0x7a, 0x4d, 0x76, 0x7a, 0x5a, 0x82, 0x19,\n                                                          0xb, 0x1f, 0xda, 0xf7, 0xbf, 0x5, 0x41, 0x6,\n                                                          0x64, 0x20, 0x75, 0x4c, 0x5a, 0x41, 0x8, 0x57,\n                                                          0x69, 0x4c, 0x2d, 0x60, 0x1b, 0xb, 0xb8, 0xb3,\n                                                          0xb0, 0xce, 0x96, 0x1f, 0x6f, 0x6, 0x76, 0x84,\n                                                          0x83, 0x74, 0x65, 0x1b, 0xb, 0x1a, 0x86, 0x8d,\n                                                          0x88, 0x91, 0x94, 0xd0, 0xc9, 0xa7, 0xab, 0x1e,\n                                                          0xaa, 0xa6, 0xbf, 0xb1, 0xa8, 0xa2, 0x8, 0x94,\n                                                          0x7, 0x84, 0x97, 0x5f, 0xc1, 0x7b, 0x9d, 0x8,\n                                                          0x9c, 0x7c, 0x56, 0xd9, 0x7e, 0x1b, 0x83, 0x8b,\n                                                          0x85, 0x89, 0xb, 0xf7, 0x76, 0xf7, 0x8a, 0x4c,\n                                                          0xa, 0xb, 0xf9, 0x54, 0x31, 0xa, 0xb, 0x9a,\n                                                          0x1a, 0x9d, 0x7c, 0x9c, 0x76, 0x80, 0xb, 0x12,\n                                                          0xf8, 0xf, 0xe5, 0x17, 0xf7, 0x9, 0xb8, 0x15,\n                                                          0xb2, 0xb3, 0xf7, 0x1c, 0xa4, 0xcb, 0x1e, 0xcf,\n                                                          0xa5, 0xc5, 0xb9, 0xba, 0x1b, 0xcc, 0x8c, 0x51,\n                                                          0x70, 0xfb, 0xb, 0x31, 0xfb, 0x4e, 0xfb, 0xe,\n                                                          0x72, 0x72, 0x96, 0xa5, 0x1f, 0x7d, 0x64, 0x15,\n                                                          0x7f, 0xa2, 0x9f, 0x86, 0xa4, 0x1b, 0xf7, 0x1e,\n                                                          0xf7, 0x34, 0xf7, 0x3a, 0xf7, 0x2f, 0xd3, 0x6d,\n                                                          0xc6, 0x32, 0x39, 0x52, 0x42, 0x68, 0xb, 0x75,\n                                                          0x74, 0x78, 0x77, 0x7b, 0x7a, 0x8, 0x40, 0x3a,\n                                                          0x7d, 0x74, 0x7d, 0x44, 0xa, 0x84, 0x9d, 0x5a,\n                                                          0xa1, 0x5a, 0x1f, 0x95, 0x73, 0x97, 0x74, 0x95,\n                                                          0x77, 0x8, 0xb, 0x15, 0x51, 0x62, 0x6e, 0x77,\n                                                          0x7f, 0x1b, 0x82, 0x84, 0x93, 0x92, 0x97, 0x97,\n                                                          0xb3, 0xb, 0xfb, 0x82, 0x5c, 0x1a, 0x79, 0x8b,\n                                                          0x5f, 0xba, 0xc3, 0xb7, 0xc2, 0xc6, 0xb2, 0x1e,\n                                                          0xb, 0x15, 0xf7, 0x29, 0xf7, 0x97, 0x5, 0x8c,\n                                                          0x6, 0xb7, 0xfb, 0x97, 0x5, 0xb, 0x74, 0x39,\n                                                          0x77, 0x37, 0x79, 0x1a, 0x7c, 0x8d, 0x66, 0xb8,\n                                                          0xbd, 0xa5, 0xa5, 0xe6, 0xca, 0x1e, 0xb, 0xf8,\n                                                          0x8f, 0x6, 0xc9, 0xf7, 0x36, 0x7b, 0x93, 0x5,\n                                                          0x28, 0x44, 0x60, 0x65, 0xfb, 0x55, 0x1b, 0xb,\n                                                          0xf7, 0x5d, 0xf7, 0x3c, 0xfb, 0x4, 0xd6, 0xfb,\n                                                          0xc, 0xfb, 0x47, 0xfb, 0x78, 0xb, 0x1, 0x85,\n                                                          0xf8, 0xf8, 0x3, 0x85, 0x16, 0xf8, 0x8d, 0x6,\n                                                          0xc1, 0xf7, 0x3c, 0x78, 0x8e, 0x5, 0x24, 0x5a,\n                                                          0x5c, 0x6b, 0xfb, 0x38, 0x1b, 0xfb, 0x2b, 0x6,\n                                                          0xf8, 0x77, 0xf8, 0xef, 0x5, 0x99, 0xfc, 0x7a,\n                                                          0x7, 0x5d, 0xfb, 0x26, 0x9e, 0x86, 0x5, 0xd0,\n                                                          0xad, 0xab, 0xb9, 0xf7, 0x2d, 0x1b, 0xf7, 0x35,\n                                                          0x6, 0xfc, 0x73, 0xfc, 0xef, 0x5, 0xb, 0x6e,\n                                                          0x8d, 0x6d, 0xb9, 0xc1, 0xae, 0xb9, 0xce, 0xbd,\n                                                          0x1e, 0x7d, 0x98, 0x5, 0x5c, 0x66, 0x72, 0x6b,\n                                                          0x77, 0x1b, 0x89, 0x7d, 0x8d, 0x9a, 0x1f, 0xa9,\n                                                          0xdb, 0xf7, 0x8b, 0xb6, 0x1a, 0xb5, 0x74, 0xa3,\n                                                          0x5d, 0x38, 0x2f, 0xfb, 0x1f, 0x41, 0x5c, 0x1e,\n                                                          0x89, 0x8d, 0xcb, 0xf7, 0x65, 0x88, 0x8d, 0x55,\n                                                          0x80, 0x55, 0x81, 0x55, 0x81, 0x19, 0xb, 0x7b,\n                                                          0xa, 0x67, 0x6, 0xfb, 0x22, 0x22, 0x31, 0xf4,\n                                                          0x5, 0x66, 0x6, 0xe, 0x15, 0x8e, 0x6, 0x4d,\n                                                          0xa, 0xb, 0x73, 0xa, 0x57, 0x5f, 0xb4, 0xc8,\n                                                          0x98, 0x8e, 0x98, 0x90, 0x99, 0x1f, 0xb, 0xf8,\n                                                          0x80, 0x31, 0xa, 0xb, 0x84, 0x1b, 0x75, 0x7d,\n                                                          0x7c, 0x77, 0x7a, 0xb, 0xa7, 0x80, 0x71, 0xa,\n                                                          0xb, 0x15, 0x20, 0xa, 0xb, 0xea, 0xa, 0xc7,\n                                                          0x9c, 0xa, 0xab, 0x69, 0x83, 0x5e, 0x83, 0x61,\n                                                          0xb, 0x7d, 0xa, 0xf7, 0x76, 0xaf, 0xf8, 0x2a,\n                                                          0x77, 0xb, 0xfb, 0x21, 0xfb, 0x36, 0x5c, 0xa,\n                                                          0xb, 0xfb, 0x3c, 0xfb, 0x23, 0x4c, 0xab, 0x3d,\n                                                          0xf4, 0xef, 0xe6, 0xe7, 0x9b, 0x96, 0xb, 0x7d,\n                                                          0x7, 0xb4, 0x9b, 0x81, 0x6e, 0x1f, 0x70, 0x42,\n                                                          0xfb, 0x86, 0x5f, 0x1a, 0xb, 0x9e, 0xa, 0xf7,\n                                                          0x3b, 0xf0, 0x9f, 0xa, 0x95, 0x97, 0x47, 0xa,\n                                                          0x7f, 0x82, 0x9d, 0xa, 0xb, 0x60, 0xfb, 0x19,\n                                                          0xfb, 0x2d, 0xfb, 0x4f, 0xfb, 0x27, 0xb, 0x15,\n                                                          0xa8, 0x6, 0xa7, 0x92, 0x9c, 0x9e, 0xa7, 0x1b,\n                                                          0xb, 0x15, 0x7b, 0x4e, 0x86, 0x75, 0x74, 0x1a,\n                                                          0x7a, 0x8b, 0xb, 0x5f, 0x9e, 0x7c, 0xaf, 0xe5,\n                                                          0xd5, 0xf7, 0x11, 0xf7, 0x5, 0xcf, 0x1e, 0xb,\n                                                          0x1f, 0xa0, 0x89, 0xaa, 0xf7, 0x2d, 0x5, 0xfc,\n                                                          0x85, 0x7b, 0x6, 0xb, 0x1b, 0x2e, 0x3c, 0x48,\n                                                          0x2a, 0x4a, 0x90, 0x80, 0xf7, 0x1e, 0xfb, 0x27,\n                                                          0x1f, 0xac, 0x68, 0xb0, 0x6c, 0x4b, 0x1a, 0x59,\n                                                          0x68, 0x39, 0x2d, 0x31, 0x53, 0xda, 0xe4, 0x93,\n                                                          0x8c, 0x90, 0x8c, 0x93, 0x1e, 0x77, 0x8d, 0x5,\n                                                          0xb, 0x66, 0xa, 0xa8, 0x1f, 0x80, 0xa7, 0x57,\n                                                          0xa, 0x77, 0xb, 0x60, 0xa, 0x9d, 0xa8, 0x80,\n                                                          0x80, 0xb, 0xf8, 0x64, 0xf7, 0x27, 0x15, 0xf7,\n                                                          0x4c, 0xf7, 0x49, 0x8d, 0x89, 0x8c, 0x8c, 0x51,\n                                                          0xfb, 0x48, 0x5, 0xfb, 0x45, 0x61, 0x15, 0xf7,\n                                                          0x3c, 0x6, 0x6b, 0x22, 0x5, 0xca, 0x6, 0xa9,\n                                                          0xf3, 0x5, 0xc5, 0x6, 0xb, 0x15, 0x92, 0x7f,\n                                                          0xb7, 0x55, 0x9b, 0x79, 0x8, 0x7a, 0x9a, 0xc0,\n                                                          0x3d, 0x98, 0x1b, 0x93, 0x8b, 0x91, 0x8d, 0xb,\n                                                          0x1a, 0x90, 0x89, 0x8e, 0x85, 0x82, 0x46, 0x4d,\n                                                          0x6f, 0x6b, 0x1e, 0x6c, 0x70, 0x57, 0x65, 0x6e,\n                                                          0x74, 0x8, 0xb, 0x15, 0x45, 0xb9, 0x50, 0xd4,\n                                                          0xde, 0xf0, 0xed, 0xf7, 0xc, 0xb, 0x94, 0x7a,\n                                                          0x5, 0x59, 0xa, 0xb, 0x1b, 0x41, 0x7a, 0x47,\n                                                          0x65, 0x81, 0x1f, 0xb, 0x1b, 0xf7, 0x19, 0xd1,\n                                                          0xf3, 0xe9, 0xcd, 0x77, 0xb3, 0x2e, 0xe6, 0x1f,\n                                                          0x35, 0xe1, 0x7e, 0xa2, 0xba, 0x1a, 0xce, 0xbe,\n                                                          0xac, 0xc2, 0xf7, 0xd, 0x8f, 0x22, 0x52, 0x1e,\n                                                          0x9d, 0x88, 0x5, 0xb, 0xf7, 0x5b, 0x8b, 0xaf,\n                                                          0xf8, 0xfd, 0x77, 0x1, 0x83, 0xf8, 0xcb, 0x3,\n                                                          0x83, 0x16, 0xf8, 0x91, 0x6, 0xc5, 0xf7, 0x47,\n                                                          0x77, 0x91, 0x5, 0xfb, 0x26, 0x49, 0x3a, 0x88,\n                                                          0xfb, 0xd, 0x1b, 0xb, 0x1f, 0x7a, 0x99, 0x5,\n                                                          0x5c, 0x5b, 0x45, 0x44, 0xfb, 0x5, 0x1b, 0xfb,\n                                                          0xb, 0x54, 0xde, 0xf7, 0x17, 0xf7, 0x27, 0xf1,\n                                                          0xf7, 0x86, 0xf7, 0x5c, 0xf7, 0x23, 0x96, 0xfb,\n                                                          0x1a, 0x6f, 0x1f, 0xb, 0xf7, 0xb, 0xf7, 0xac,\n                                                          0xf8, 0x66, 0xf7, 0xb, 0xaf, 0x77, 0xa5, 0x66,\n                                                          0x71, 0x80, 0x76, 0x7d, 0xb, 0x9d, 0x1b, 0x43,\n                                                          0xa, 0xb, 0x7d, 0x94, 0x5, 0x5f, 0x68, 0x6f,\n                                                          0x68, 0x78, 0x1b, 0xb, 0x7f, 0x97, 0x5, 0x62,\n                                                          0x59, 0x61, 0x69, 0x55, 0x1b, 0xb, 0x1b, 0xbc,\n                                                          0xf7, 0x40, 0x5, 0xd5, 0xa0, 0x82, 0x98, 0xe0,\n                                                          0x1b, 0xb, 0x2d, 0x68, 0x1e, 0x98, 0x83, 0x5,\n                                                          0x96, 0x94, 0xa4, 0xb5, 0xc5, 0x1b, 0xba, 0xa8,\n                                                          0x67, 0x6d, 0x7c, 0x8a, 0x67, 0x2f, 0x32, 0x1f,\n                                                          0xfb, 0x19, 0xfb, 0x16, 0x5, 0xb, 0x80, 0xbc,\n                                                          0x70, 0x76, 0xf8, 0x41, 0xa1, 0xb, 0xb7, 0xa,\n                                                          0xfb, 0x2, 0xf7, 0x22, 0xc5, 0xa, 0x78, 0x92,\n                                                          0x56, 0xa, 0x9f, 0x7a, 0x80, 0xa, 0xb7, 0xa,\n                                                          0xfb, 0x2, 0xf7, 0x23, 0xc5, 0xa, 0x78, 0x91,\n                                                          0x56, 0xa, 0x9f, 0x7b, 0x80, 0xa, 0x82, 0x9c,\n                                                          0x5, 0x52, 0x6f, 0x42, 0x4f, 0x48, 0x1a, 0x60,\n                                                          0xa4, 0x6b, 0xad, 0x93, 0xb, 0x65, 0x1a, 0x70,\n                                                          0x61, 0x5a, 0x72, 0x6e, 0x1e, 0x63, 0x69, 0x7e,\n                                                          0x82, 0x7b, 0x1b, 0xb, 0x15, 0xb9, 0x6, 0xf7,\n                                                          0x37, 0xf7, 0x3d, 0x5, 0xb, 0x26, 0x1a, 0xfb,\n                                                          0x6, 0xf7, 0x3, 0x54, 0xf1, 0xb, 0xf7, 0x92,\n                                                          0xa0, 0x76, 0xb, 0x9e, 0xa, 0xf7, 0x38, 0xee,\n                                                          0x9f, 0xa, 0x98, 0x99, 0x47, 0xa, 0x7c, 0x80,\n                                                          0x9d, 0xa, 0xb, 0x9e, 0xa, 0xf7, 0x3a, 0xf0,\n                                                          0x9f, 0xa, 0x96, 0x97, 0x47, 0xa, 0x7e, 0x82,\n                                                          0x9d, 0xa, 0xb, 0x90, 0x87, 0x1f, 0xe, 0x1f,\n                                                          0xc3, 0xf2, 0x5, 0xf7, 0x70, 0x6, 0xb, 0x1a,\n                                                          0x66, 0x54, 0x69, 0x77, 0x7e, 0x1e, 0xb, 0x95,\n                                                          0x84, 0x5, 0x94, 0x95, 0xa2, 0xa6, 0xb4, 0x1b,\n                                                          0x9d, 0xaa, 0x7e, 0x63, 0x51, 0x31, 0x71, 0x52,\n                                                          0x82, 0x1f, 0xe, 0x15, 0x6c, 0xa3, 0x73, 0xaa,\n                                                          0xaa, 0xa4, 0xa3, 0xaa, 0xaa, 0x72, 0xa4, 0x6c,\n                                                          0x6c, 0x73, 0x72, 0x6c, 0x1e, 0xe, 0x74, 0xa8,\n                                                          0xa8, 0xa3, 0xa2, 0xa8, 0xa8, 0x73, 0xa3, 0x6e,\n                                                          0x6e, 0xb, 0xc7, 0xf4, 0xf8, 0x41, 0xf4, 0xb,\n                                                          0x9a, 0xa, 0x77, 0xb, 0x5a, 0xa, 0xf7, 0x78,\n                                                          0x77, 0x1, 0x58, 0xf8, 0xfb, 0x3, 0xb, 0x99,\n                                                          0x16, 0xd6, 0x6, 0xb4, 0xf7, 0x1c, 0x99, 0xb6,\n                                                          0xb8, 0xd0, 0x8, 0xc3, 0xb0, 0xc9, 0xe1, 0xbb,\n                                                          0x1b, 0xb, 0x15, 0x6d, 0xa4, 0x72, 0xa9, 0xa9,\n                                                          0xa4, 0xa4, 0xa9, 0xa9, 0x72, 0xa4, 0x6d, 0x6d,\n                                                          0x72, 0x72, 0x6d, 0x1e, 0xb, 0x8a, 0x16, 0x4e,\n                                                          0xa, 0xb, 0x15, 0xbe, 0x6, 0xf8, 0x5b, 0xf9,\n                                                          0x42, 0x5, 0x58, 0x6, 0xb, 0xf7, 0x92, 0x8b,\n                                                          0xac, 0xf7, 0xbb, 0xe9, 0xa, 0xb, 0xa3, 0x9e,\n                                                          0x9e, 0xa3, 0xa3, 0x78, 0x9e, 0x73, 0x73, 0x78,\n                                                          0x78, 0x73, 0x73, 0x9e, 0x78, 0xa3, 0x1f, 0xb,\n                                                          0x6f, 0xa1, 0x75, 0xa7, 0xa7, 0xa1, 0xa1, 0xa7,\n                                                          0xa7, 0x75, 0xa1, 0x6f, 0x6f, 0x75, 0x75, 0x6f,\n                                                          0x1e, 0xb, 0x1, 0x86, 0xa, 0x3, 0xb, 0xf8,\n                                                          0x5d, 0x76, 0xf7, 0x7a, 0x77, 0x12, 0xb, 0x1,\n                                                          0xa6, 0xdf, 0xf7, 0xa5, 0xdf, 0x3, 0xb, 0x9b,\n                                                          0xfb, 0x8b, 0x7b, 0x7, 0xb, 0x94, 0xb6, 0x5,\n                                                          0x54, 0x6, 0xda, 0xf7, 0x97, 0x5, 0x67, 0x6,\n                                                          0xfb, 0xa3, 0xfb, 0x97, 0x5, 0xb, 0x6, 0x89,\n                                                          0x90, 0xf7, 0x6, 0xf7, 0x2, 0x5, 0xdb, 0xd8,\n                                                          0x9e, 0xa3, 0xb3, 0x1a, 0xb4, 0x64, 0xb, 0x1b,\n                                                          0x76, 0x7a, 0x7a, 0x76, 0x61, 0xb6, 0x88, 0x93,\n                                                          0xb, 0x1a, 0x74, 0x9a, 0x7d, 0xa4, 0xa4, 0xa1,\n                                                          0xa7, 0xa7, 0xb, 0x7a, 0x7, 0x8e, 0x97, 0x92,\n                                                          0x8c, 0x9a, 0x1b, 0xc4, 0xb, 0x87, 0xa, 0xf7,\n                                                          0x87, 0x77, 0x1, 0xb, 0xa0, 0x76, 0xf9, 0x21,\n                                                          0xb, 0xf7, 0x4f, 0x9b, 0x6, 0xb, 0xce, 0x1a,\n                                                          0xb6, 0x72, 0xb, 0x85, 0x85, 0x1e, 0xb, 0x15,\n                                                          0xae, 0x6, 0xb, 0x5, 0x96, 0x92, 0xb, 0x82,\n                                                          0xba, 0x6f, 0x76, 0xf9, 0x37, 0xa9, 0xa, 0xe5,\n                                                          0x13, 0xb8, 0xb, 0x76, 0xa, 0xf7, 0x73, 0x77,\n                                                          0x12, 0x9c, 0xdf, 0x13, 0x78, 0xb, 0xf8, 0x99,\n                                                          0x66, 0xa, 0xb, 0x97, 0xa, 0xaa, 0x72, 0xbd,\n                                                          0x37, 0xfb, 0x28, 0xb, 0x80, 0xa0, 0xf8, 0x2e,\n                                                          0xa0, 0xf7, 0x73, 0x77, 0x92, 0xa, 0xb, 0x72,\n                                                          0x7e, 0x6c, 0xaf, 0x83, 0xb2, 0xf7, 0x10, 0xc6,\n                                                          0xe0, 0xce, 0xcd, 0x60, 0x9c, 0xb, 0x62, 0xa,\n                                                          0xe, 0x1a, 0x56, 0x3c, 0xfb, 0x1b, 0x60, 0x45,\n                                                          0x1e, 0xb, 0x77, 0x90, 0xa, 0xb, 0x77, 0x12,\n                                                          0xb5, 0xd8, 0xf7, 0x3e, 0xb, 0xb6, 0xa, 0xb4,\n                                                          0xf9, 0xa, 0xb, 0xfb, 0x17, 0xf7, 0x17, 0xfb,\n                                                          0x17, 0xb, 0xc7, 0x4f, 0xf2, 0x8c, 0x77, 0x12,\n                                                          0xb, 0xf8, 0x82, 0x9e, 0xa, 0xb, 0xf7, 0x74,\n                                                          0xf7, 0x58, 0xb, 0x1b, 0xbe, 0xb6, 0xb0, 0xb1,\n                                                          0xab, 0x72, 0x90, 0x82, 0x74, 0x7f, 0x7d, 0x7a,\n                                                          0xb, 0x7f, 0x9f, 0x89, 0x76, 0xf7, 0xe5, 0x9f,\n                                                          0xf7, 0xcc, 0x9f, 0x8e, 0x77, 0x12, 0xb, 0x83,\n                                                          0x16, 0xf7, 0x91, 0x6, 0xf7, 0xba, 0xf7, 0x35,\n                                                          0xf7, 0x4d, 0xf7, 0x5e, 0xb, 0x1b, 0xf7, 0x45,\n                                                          0xad, 0xfb, 0xf, 0x26, 0x4e, 0x6a, 0xfb, 0xc8,\n                                                          0xfb, 0xcf, 0xb, 0xaf, 0xa8, 0xa9, 0xaf, 0xaf,\n                                                          0xa9, 0x6d, 0x67, 0x67, 0x6d, 0x6e, 0x67, 0x1e,\n                                                          0xb, 0x1a, 0x6a, 0x7b, 0x5b, 0x53, 0x3a, 0x7b,\n                                                          0xe7, 0xb7, 0x84, 0x1e, 0x7b, 0x6, 0xb, 0x1a,\n                                                          0x6f, 0x8f, 0x69, 0xb7, 0xc9, 0xb2, 0xbb, 0xd8,\n                                                          0xbe, 0x1e, 0xe, 0xf8, 0x1, 0x79, 0xb, 0x15,\n                                                          0xaa, 0x6, 0xb, 0xb0, 0xf7, 0x5b, 0x5, 0x76,\n                                                          0x6, 0x81, 0x86, 0x7b, 0x7f, 0x6e, 0x1b, 0xb,\n                                                          0x9c, 0x7c, 0x15, 0x9d, 0x6, 0x98, 0x8f, 0x9c,\n                                                          0x9f, 0xa7, 0x1b, 0x9a, 0xb, 0x89, 0x87, 0x15,\n                                                          0x94, 0x82, 0x5, 0x96, 0x98, 0x9a, 0x92, 0x9c,\n                                                          0x1b, 0xb, 0x9f, 0xf7, 0x1f, 0x5, 0x7d, 0x6,\n                                                          0x83, 0x86, 0x7b, 0x81, 0x7a, 0x1b, 0xb, 0x7d,\n                                                          0x72, 0x84, 0x1e, 0x82, 0x6b, 0x82, 0xfb, 0xb,\n                                                          0x86, 0x54, 0x8, 0xb, 0x1a, 0xb0, 0xc2, 0xad,\n                                                          0x9f, 0x98, 0x1e, 0xb, 0x97, 0x76, 0xa9, 0x76,\n                                                          0xf8, 0x1a, 0xbe, 0xb, 0xb6, 0xa, 0xac, 0xf8,\n                                                          0xfe, 0xac, 0xb, 0xf7, 0x4, 0x4b, 0xcb, 0xb,\n                                                          0x15, 0xf7, 0x7b, 0x6, 0xac, 0xda, 0x80, 0x93,\n                                                          0x5, 0x76, 0x7f, 0xb, 0x9b, 0x7e, 0x15, 0x9b,\n                                                          0x6, 0x96, 0x91, 0x99, 0x95, 0x99, 0x1b, 0xb,\n                                                          0x9e, 0x91, 0x7d, 0x79, 0x1f, 0x63, 0x41, 0xfb,\n                                                          0x88, 0x73, 0x1a, 0xb, 0x9b, 0xfb, 0xa5, 0x7b,\n                                                          0x7, 0xb, 0x5, 0xa2, 0x79, 0xb, 0xed, 0xf1,\n                                                          0xed, 0xb, 0xb3, 0x17, 0xf7, 0x9c, 0xd3, 0x15,\n                                                          0x6a, 0xf7, 0x44, 0x5, 0xb, 0xea, 0xa, 0xca,\n                                                          0x9c, 0xa, 0xa8, 0x69, 0xb, 0xcf, 0xa2, 0xac,\n                                                          0xa0, 0xb9, 0x1a, 0xbc, 0x59, 0xa3, 0x5b, 0xb,\n                                                          0x96, 0xfb, 0xb0, 0x7, 0x6c, 0xfb, 0x7, 0x9b,\n                                                          0x87, 0x5, 0xb, 0x87, 0xa, 0x1, 0xb, 0xf1,\n                                                          0xe5, 0xf8, 0x4e, 0xf7, 0x17, 0xb, 0x1e, 0x9b,\n                                                          0xfb, 0x83, 0x7b, 0x7, 0xb, 0xc5, 0x76, 0xf8,\n                                                          0x2, 0x77, 0x1, 0xb, 0xd9, 0x16, 0xf7, 0xb5,\n                                                          0x9b, 0x6, 0xb, 0xc9, 0xf7, 0x47, 0xc9, 0xb,\n                                                          0xf7, 0x3d, 0x77, 0x1, 0xb, 0x9b, 0xfb, 0xa5,\n                                                          0x7, 0xb, 0xf7, 0xf, 0x15, 0x4c, 0x5a, 0x76,\n                                                          0x6f, 0x72, 0x1b, 0xb, 0xf8, 0xef, 0xaf, 0x89,\n                                                          0x77, 0x12, 0xcd, 0xf7, 0x4, 0xb, 0x1b, 0xfb,\n                                                          0x79, 0xfb, 0x45, 0xfb, 0x71, 0xfb, 0x55, 0xb,\n                                                          0x6c, 0xa, 0xe, 0x3c, 0x95, 0x76, 0xb, 0x15,\n                                                          0xd2, 0xf7, 0x8c, 0x5, 0x97, 0x8e, 0x92, 0xb,\n                                                          0xf8, 0x1d, 0x96, 0x76, 0xaa, 0x76, 0xf4, 0xb5,\n                                                          0xb, 0x66, 0x56, 0x1b, 0x7b, 0xf7, 0x61, 0x9a,\n                                                          0x7, 0xb, 0xf7, 0x45, 0xf7, 0x16, 0x9d, 0x9f,\n                                                          0x86, 0x7c, 0xb, 0x82, 0x30, 0x79, 0x87, 0x6d,\n                                                          0x1e, 0x78, 0x7, 0xb, 0xb6, 0xfb, 0x30, 0x76,\n                                                          0xf9, 0xf4, 0x77, 0x12, 0xb, 0x90, 0x94, 0x7d,\n                                                          0x1f, 0x7a, 0x6e, 0x5, 0x7e, 0xb, 0xf7, 0x49,\n                                                          0xfb, 0x39, 0x77, 0xe2, 0xed, 0x12, 0xb, 0x76,\n                                                          0xf9, 0x40, 0x77, 0x1, 0xf4, 0xcd, 0x3, 0xb,\n                                                          0xab, 0xfb, 0x2d, 0xa6, 0xf9, 0x8e, 0xa6, 0x1,\n                                                          0xb, 0x30, 0xa7, 0x1f, 0x9b, 0x55, 0xb, 0x77,\n                                                          0x1, 0xbc, 0xd6, 0x3, 0xb, 0x16, 0xf7, 0x5a,\n                                                          0x9b, 0x6, 0xb, 0x67, 0x6e, 0xa8, 0xaf, 0x1f,\n                                                          0xb, 0x7b, 0xf7, 0xa5, 0x9b, 0x7, 0xb, 0x15,\n                                                          0x9b, 0xa, 0xb, 0x9b, 0xfb, 0x51, 0x7b, 0x7,\n                                                          0xb, 0xac, 0xf7, 0x97, 0xac, 0xb, 0xc4, 0xa7,\n                                                          0xd4, 0xb, 0x9b, 0xfb, 0x5b, 0xb, 0x1b, 0x83,\n                                                          0x85, 0xb\n                                                         };\n"
  },
  {
    "path": "core/src/fxge/fontdata/chromefontdata/FoxitSerifMM.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nconst unsigned char g_FoxitSerifMMFontData [113417] = {\n    0x80, 0x01, 0xD6, 0x29, 0x00, 0x00, 0x25, 0x21, 0x50, 0x53, 0x2D, 0x41, 0x64, 0x6F, 0x62, 0x65,\n    0x46, 0x6F, 0x6E, 0x74, 0x2D, 0x31, 0x2E, 0x30, 0x3A, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x53,\n    0x65, 0x72, 0x69, 0x66, 0x4D, 0x4D, 0x20, 0x30, 0x30, 0x31, 0x2E, 0x30, 0x30, 0x30, 0x0D, 0x25,\n    0x25, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x61, 0x74, 0x65, 0x3A, 0x20, 0x54,\n    0x75, 0x65, 0x20, 0x4F, 0x63, 0x74, 0x20, 0x33, 0x31, 0x20, 0x30, 0x31, 0x3A, 0x33, 0x34, 0x3A,\n    0x32, 0x32, 0x20, 0x32, 0x30, 0x30, 0x36, 0x0D, 0x25, 0x25, 0x56, 0x4D, 0x75, 0x73, 0x61, 0x67,\n    0x65, 0x3A, 0x20, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x20, 0x31, 0x35, 0x30, 0x30, 0x30, 0x30,\n    0x0D, 0x31, 0x37, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D, 0x2F,\n    0x46, 0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x20, 0x31, 0x34, 0x20, 0x64, 0x69, 0x63, 0x74,\n    0x20, 0x64, 0x75, 0x70, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D, 0x2F, 0x76, 0x65, 0x72, 0x73,\n    0x69, 0x6F, 0x6E, 0x20, 0x28, 0x30, 0x30, 0x31, 0x2E, 0x30, 0x30, 0x30, 0x29, 0x20, 0x72, 0x65,\n    0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x4E, 0x6F, 0x74, 0x69,\n    0x63, 0x65, 0x20, 0x28, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n    0x20, 0x20, 0x20, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65,\n    0x66, 0x0D, 0x2F, 0x46, 0x75, 0x6C, 0x6C, 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x28, 0x43, 0x68, 0x72,\n    0x6f, 0x6d, 0x65, 0x20, 0x53, 0x65, 0x72, 0x69, 0x66, 0x20, 0x4D, 0x4D, 0x29, 0x20, 0x72, 0x65, 0x61,\n    0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x61, 0x6D, 0x69, 0x6C,\n    0x79, 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x28, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x20, 0x53, 0x65, 0x72,\n    0x69, 0x66, 0x20, 0x4D, 0x4D, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20,\n    0x64, 0x65, 0x66, 0x0D, 0x2F, 0x49, 0x74, 0x61, 0x6C, 0x69, 0x63, 0x41, 0x6E, 0x67, 0x6C, 0x65,\n    0x20, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x69, 0x73, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50,\n    0x69, 0x74, 0x63, 0x68, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F,\n    0x55, 0x6E, 0x64, 0x65, 0x72, 0x6C, 0x69, 0x6E, 0x65, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F,\n    0x6E, 0x20, 0x2D, 0x31, 0x30, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x55, 0x6E, 0x64, 0x65,\n    0x72, 0x6C, 0x69, 0x6E, 0x65, 0x54, 0x68, 0x69, 0x63, 0x6B, 0x6E, 0x65, 0x73, 0x73, 0x20, 0x35,\n    0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x41,\n    0x6C, 0x6C, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66,\n    0x0D, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x50, 0x6F, 0x73,\n    0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x20, 0x5B, 0x5B, 0x30, 0x20, 0x30, 0x20, 0x5D, 0x5B, 0x31,\n    0x20, 0x30, 0x20, 0x5D, 0x5B, 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5B, 0x31, 0x20, 0x31, 0x20, 0x5D,\n    0x5D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x44, 0x65, 0x73, 0x69,\n    0x67, 0x6E, 0x4D, 0x61, 0x70, 0x20, 0x5B, 0x5B, 0x5B, 0x31, 0x31, 0x30, 0x20, 0x30, 0x20, 0x5D,\n    0x5B, 0x37, 0x39, 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5D, 0x5B, 0x5B, 0x31, 0x30, 0x30, 0x20, 0x30,\n    0x20, 0x5D, 0x5B, 0x39, 0x30, 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5D, 0x5D, 0x20, 0x64, 0x65, 0x66,\n    0x0D, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x41, 0x78, 0x69, 0x73, 0x54, 0x79, 0x70, 0x65, 0x73,\n    0x20, 0x5B, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x2F, 0x57, 0x69, 0x64, 0x74, 0x68,\n    0x20, 0x5D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x65, 0x6E, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F,\n    0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x56,\n    0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x5B, 0x30, 0x2E, 0x32, 0x37, 0x30, 0x32, 0x20, 0x30, 0x2E,\n    0x31, 0x30, 0x34, 0x38, 0x20, 0x30, 0x2E, 0x34, 0x35, 0x30, 0x34, 0x20, 0x30, 0x2E, 0x31, 0x37,\n    0x34, 0x36, 0x20, 0x5D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x4E, 0x61,\n    0x6D, 0x65, 0x20, 0x2F, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x66, 0x4D, 0x4D,\n    0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x45, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x32,\n    0x35, 0x36, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x0D, 0x30, 0x20, 0x31, 0x20, 0x32, 0x35, 0x35,\n    0x20, 0x7B, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F,\n    0x2E, 0x6E, 0x6F, 0x74, 0x64, 0x65, 0x66, 0x20, 0x70, 0x75, 0x74, 0x20, 0x7D, 0x20, 0x66, 0x6F,\n    0x72, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x32, 0x20, 0x2F, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20,\n    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x33, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x6C,\n    0x61, 0x6D, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x34, 0x20, 0x2F, 0x71,\n    0x75, 0x6F, 0x74, 0x65, 0x64, 0x62, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x33, 0x35, 0x20, 0x2F, 0x6E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6E, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x36, 0x20, 0x2F, 0x64, 0x6F, 0x6C, 0x6C, 0x61,\n    0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x37, 0x20, 0x2F, 0x70, 0x65,\n    0x72, 0x63, 0x65, 0x6E, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x38,\n    0x20, 0x2F, 0x61, 0x6D, 0x70, 0x65, 0x72, 0x73, 0x61, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x33, 0x39, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x73, 0x69, 0x6E,\n    0x67, 0x6C, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x30, 0x20, 0x2F,\n    0x70, 0x61, 0x72, 0x65, 0x6E, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x34, 0x31, 0x20, 0x2F, 0x70, 0x61, 0x72, 0x65, 0x6E, 0x72, 0x69, 0x67, 0x68, 0x74,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x32, 0x20, 0x2F, 0x61, 0x73, 0x74,\n    0x65, 0x72, 0x69, 0x73, 0x6B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x33,\n    0x20, 0x2F, 0x70, 0x6C, 0x75, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34,\n    0x34, 0x20, 0x2F, 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,\n    0x20, 0x34, 0x35, 0x20, 0x2F, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x34, 0x36, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x69, 0x6F, 0x64, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x37, 0x20, 0x2F, 0x73, 0x6C, 0x61, 0x73, 0x68,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x38, 0x20, 0x2F, 0x7A, 0x65, 0x72,\n    0x6F, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x39, 0x20, 0x2F, 0x6F, 0x6E,\n    0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x30, 0x20, 0x2F, 0x74, 0x77,\n    0x6F, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x31, 0x20, 0x2F, 0x74, 0x68,\n    0x72, 0x65, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x32, 0x20, 0x2F,\n    0x66, 0x6F, 0x75, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x33, 0x20,\n    0x2F, 0x66, 0x69, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x34,\n    0x20, 0x2F, 0x73, 0x69, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x35,\n    0x20, 0x2F, 0x73, 0x65, 0x76, 0x65, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x35, 0x36, 0x20, 0x2F, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x35, 0x37, 0x20, 0x2F, 0x6E, 0x69, 0x6E, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x35, 0x38, 0x20, 0x2F, 0x63, 0x6F, 0x6C, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74,\n    0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x39, 0x20, 0x2F, 0x73, 0x65, 0x6D, 0x69, 0x63, 0x6F, 0x6C,\n    0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x30, 0x20, 0x2F, 0x6C,\n    0x65, 0x73, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x31, 0x20, 0x2F,\n    0x65, 0x71, 0x75, 0x61, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x32,\n    0x20, 0x2F, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x36, 0x33, 0x20, 0x2F, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x34, 0x20, 0x2F, 0x61, 0x74, 0x20, 0x70, 0x75,\n    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x35, 0x20, 0x2F, 0x41, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x36, 0x36, 0x20, 0x2F, 0x42, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x36, 0x37, 0x20, 0x2F, 0x43, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x36, 0x38, 0x20, 0x2F, 0x44, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x39,\n    0x20, 0x2F, 0x45, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x30, 0x20, 0x2F,\n    0x46, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x31, 0x20, 0x2F, 0x47, 0x20,\n    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x32, 0x20, 0x2F, 0x48, 0x20, 0x70, 0x75,\n    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x33, 0x20, 0x2F, 0x49, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x37, 0x34, 0x20, 0x2F, 0x4A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x37, 0x35, 0x20, 0x2F, 0x4B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x37, 0x36, 0x20, 0x2F, 0x4C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x37,\n    0x20, 0x2F, 0x4D, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x38, 0x20, 0x2F,\n    0x4E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x39, 0x20, 0x2F, 0x4F, 0x20,\n    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x30, 0x20, 0x2F, 0x50, 0x20, 0x70, 0x75,\n    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x31, 0x20, 0x2F, 0x51, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x38, 0x32, 0x20, 0x2F, 0x52, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x38, 0x33, 0x20, 0x2F, 0x53, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x38, 0x34, 0x20, 0x2F, 0x54, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x35,\n    0x20, 0x2F, 0x55, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x36, 0x20, 0x2F,\n    0x56, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x37, 0x20, 0x2F, 0x57, 0x20,\n    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x38, 0x20, 0x2F, 0x58, 0x20, 0x70, 0x75,\n    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x39, 0x20, 0x2F, 0x59, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x39, 0x30, 0x20, 0x2F, 0x5A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x39, 0x31, 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x6C, 0x65, 0x66,\n    0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x32, 0x20, 0x2F, 0x62, 0x61,\n    0x63, 0x6B, 0x73, 0x6C, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x39, 0x33, 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x34, 0x20, 0x2F, 0x61, 0x73, 0x63,\n    0x69, 0x69, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,\n    0x20, 0x39, 0x35, 0x20, 0x2F, 0x75, 0x6E, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6F, 0x72, 0x65, 0x20,\n    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x36, 0x20, 0x2F, 0x67, 0x72, 0x61, 0x76,\n    0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x37, 0x20, 0x2F, 0x61, 0x20,\n    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x38, 0x20, 0x2F, 0x62, 0x20, 0x70, 0x75,\n    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x39, 0x20, 0x2F, 0x63, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x30, 0x20, 0x2F, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x31, 0x30, 0x31, 0x20, 0x2F, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x31, 0x30, 0x32, 0x20, 0x2F, 0x66, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,\n    0x20, 0x31, 0x30, 0x33, 0x20, 0x2F, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x31, 0x30, 0x34, 0x20, 0x2F, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,\n    0x30, 0x35, 0x20, 0x2F, 0x69, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30,\n    0x36, 0x20, 0x2F, 0x6A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x37,\n    0x20, 0x2F, 0x6B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x38, 0x20,\n    0x2F, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x39, 0x20, 0x2F,\n    0x6D, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x30, 0x20, 0x2F, 0x6E,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x31, 0x20, 0x2F, 0x6F, 0x20,\n    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x32, 0x20, 0x2F, 0x70, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x33, 0x20, 0x2F, 0x71, 0x20, 0x70, 0x75,\n    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x34, 0x20, 0x2F, 0x72, 0x20, 0x70, 0x75, 0x74,\n    0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x35, 0x20, 0x2F, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x36, 0x20, 0x2F, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x31, 0x31, 0x37, 0x20, 0x2F, 0x75, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x31, 0x31, 0x38, 0x20, 0x2F, 0x76, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,\n    0x20, 0x31, 0x31, 0x39, 0x20, 0x2F, 0x77, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x31, 0x32, 0x30, 0x20, 0x2F, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,\n    0x32, 0x31, 0x20, 0x2F, 0x79, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32,\n    0x32, 0x20, 0x2F, 0x7A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x33,\n    0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x65, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x34, 0x20, 0x2F, 0x62, 0x61, 0x72, 0x20, 0x70, 0x75, 0x74,\n    0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x35, 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x65, 0x72,\n    0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x36,\n    0x20, 0x2F, 0x61, 0x73, 0x63, 0x69, 0x69, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74,\n    0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x38, 0x20, 0x2F, 0x45, 0x75, 0x72, 0x6F, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x30, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74,\n    0x65, 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x62, 0x61, 0x73, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x31, 0x33, 0x31, 0x20, 0x2F, 0x66, 0x6C, 0x6F, 0x72, 0x69, 0x6E, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x32, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74,\n    0x65, 0x64, 0x62, 0x6C, 0x62, 0x61, 0x73, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,\n    0x20, 0x31, 0x33, 0x33, 0x20, 0x2F, 0x65, 0x6C, 0x6C, 0x69, 0x70, 0x73, 0x69, 0x73, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x34, 0x20, 0x2F, 0x64, 0x61, 0x67, 0x67,\n    0x65, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x35, 0x20, 0x2F,\n    0x64, 0x61, 0x67, 0x67, 0x65, 0x72, 0x64, 0x62, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x31, 0x33, 0x36, 0x20, 0x2F, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65,\n    0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x37, 0x20, 0x2F, 0x70,\n    0x65, 0x72, 0x74, 0x68, 0x6F, 0x75, 0x73, 0x61, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x31, 0x33, 0x38, 0x20, 0x2F, 0x53, 0x63, 0x61, 0x72, 0x6F, 0x6E, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x39, 0x20, 0x2F, 0x67, 0x75, 0x69, 0x6C,\n    0x73, 0x69, 0x6E, 0x67, 0x6C, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x31, 0x34, 0x30, 0x20, 0x2F, 0x4F, 0x45, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x31, 0x34, 0x35, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x6C, 0x65, 0x66, 0x74,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x36, 0x20, 0x2F, 0x71, 0x75,\n    0x6F, 0x74, 0x65, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,\n    0x20, 0x31, 0x34, 0x37, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x64, 0x62, 0x6C, 0x6C, 0x65,\n    0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x38, 0x20, 0x2F,\n    0x71, 0x75, 0x6F, 0x74, 0x65, 0x64, 0x62, 0x6C, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75,\n    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x39, 0x20, 0x2F, 0x62, 0x75, 0x6C, 0x6C, 0x65,\n    0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x30, 0x20, 0x2F, 0x65,\n    0x6E, 0x64, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35,\n    0x31, 0x20, 0x2F, 0x65, 0x6D, 0x64, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x31, 0x35, 0x32, 0x20, 0x2F, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74,\n    0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x33, 0x20, 0x2F, 0x74, 0x72, 0x61, 0x64, 0x65, 0x6D,\n    0x61, 0x72, 0x6B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x34, 0x20,\n    0x2F, 0x73, 0x63, 0x61, 0x72, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x31, 0x35, 0x35, 0x20, 0x2F, 0x67, 0x75, 0x69, 0x6C, 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x72, 0x69,\n    0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x36, 0x20,\n    0x2F, 0x6F, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x39, 0x20,\n    0x2F, 0x59, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x31, 0x36, 0x31, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x6C, 0x61, 0x6D, 0x64, 0x6F,\n    0x77, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x32, 0x20, 0x2F,\n    0x63, 0x65, 0x6E, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x33,\n    0x20, 0x2F, 0x73, 0x74, 0x65, 0x72, 0x6C, 0x69, 0x6E, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x31, 0x36, 0x34, 0x20, 0x2F, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x63, 0x79,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x35, 0x20, 0x2F, 0x79, 0x65,\n    0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x36, 0x20, 0x2F, 0x62,\n    0x72, 0x6F, 0x6B, 0x65, 0x6E, 0x62, 0x61, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,\n    0x20, 0x31, 0x36, 0x37, 0x20, 0x2F, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70, 0x75,\n    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x38, 0x20, 0x2F, 0x64, 0x69, 0x65, 0x72, 0x65,\n    0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x39, 0x20,\n    0x2F, 0x63, 0x6F, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x31, 0x37, 0x30, 0x20, 0x2F, 0x6F, 0x72, 0x64, 0x66, 0x65, 0x6D, 0x69, 0x6E,\n    0x69, 0x6E, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x31, 0x20,\n    0x2F, 0x67, 0x75, 0x69, 0x6C, 0x6C, 0x65, 0x6D, 0x6F, 0x74, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x32, 0x20, 0x2F, 0x6C, 0x6F, 0x67, 0x69,\n    0x63, 0x61, 0x6C, 0x6E, 0x6F, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,\n    0x37, 0x34, 0x20, 0x2F, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x35, 0x20, 0x2F, 0x6D, 0x61, 0x63, 0x72,\n    0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x36, 0x20, 0x2F,\n    0x64, 0x65, 0x67, 0x72, 0x65, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,\n    0x37, 0x37, 0x20, 0x2F, 0x70, 0x6C, 0x75, 0x73, 0x6D, 0x69, 0x6E, 0x75, 0x73, 0x20, 0x70, 0x75,\n    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x38, 0x20, 0x2F, 0x74, 0x77, 0x6F, 0x73, 0x75,\n    0x70, 0x65, 0x72, 0x69, 0x6F, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,\n    0x37, 0x39, 0x20, 0x2F, 0x74, 0x68, 0x72, 0x65, 0x65, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69, 0x6F,\n    0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x30, 0x20, 0x2F, 0x61,\n    0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x31,\n    0x20, 0x2F, 0x6D, 0x75, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x32,\n    0x20, 0x2F, 0x70, 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x33, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x69, 0x6F, 0x64, 0x63,\n    0x65, 0x6E, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x31, 0x38, 0x34, 0x20, 0x2F, 0x63, 0x65, 0x64, 0x69, 0x6C, 0x6C, 0x61, 0x20, 0x70, 0x75, 0x74,\n    0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x35, 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x73, 0x75, 0x70,\n    0x65, 0x72, 0x69, 0x6F, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38,\n    0x36, 0x20, 0x2F, 0x6F, 0x72, 0x64, 0x6D, 0x61, 0x73, 0x63, 0x75, 0x6C, 0x69, 0x6E, 0x65, 0x20,\n    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x37, 0x20, 0x2F, 0x67, 0x75, 0x69,\n    0x6C, 0x6C, 0x65, 0x6D, 0x6F, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x38, 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x71, 0x75, 0x61, 0x72,\n    0x74, 0x65, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x39, 0x20,\n    0x2F, 0x6F, 0x6E, 0x65, 0x68, 0x61, 0x6C, 0x66, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,\n    0x20, 0x31, 0x39, 0x30, 0x20, 0x2F, 0x74, 0x68, 0x72, 0x65, 0x65, 0x71, 0x75, 0x61, 0x72, 0x74,\n    0x65, 0x72, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x31, 0x20,\n    0x2F, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6F, 0x6E, 0x64, 0x6F, 0x77, 0x6E, 0x20, 0x70, 0x75,\n    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x32, 0x20, 0x2F, 0x41, 0x67, 0x72, 0x61, 0x76,\n    0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x33, 0x20, 0x2F, 0x41,\n    0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39,\n    0x34, 0x20, 0x2F, 0x41, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x35, 0x20, 0x2F, 0x41, 0x74, 0x69, 0x6C,\n    0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x36, 0x20, 0x2F,\n    0x41, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x31, 0x39, 0x37, 0x20, 0x2F, 0x41, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x70, 0x75, 0x74,\n    0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x38, 0x20, 0x2F, 0x41, 0x45, 0x20, 0x70, 0x75, 0x74,\n    0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x39, 0x20, 0x2F, 0x43, 0x63, 0x65, 0x64, 0x69, 0x6C,\n    0x6C, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x30, 0x20, 0x2F,\n    0x45, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,\n    0x30, 0x31, 0x20, 0x2F, 0x45, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x32, 0x30, 0x32, 0x20, 0x2F, 0x45, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66,\n    0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x33, 0x20,\n    0x2F, 0x45, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x32, 0x30, 0x34, 0x20, 0x2F, 0x49, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x35, 0x20, 0x2F, 0x49, 0x61, 0x63, 0x75,\n    0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x36, 0x20, 0x2F,\n    0x49, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x37, 0x20, 0x2F, 0x49, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73,\n    0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x38, 0x20, 0x2F,\n    0x45, 0x74, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x39, 0x20,\n    0x2F, 0x4E, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x32, 0x31, 0x30, 0x20, 0x2F, 0x4F, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D,\n    0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x31, 0x20, 0x2F, 0x4F, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20,\n    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x32, 0x20, 0x2F, 0x4F, 0x63, 0x69,\n    0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,\n    0x20, 0x32, 0x31, 0x33, 0x20, 0x2F, 0x4F, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74,\n    0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x34, 0x20, 0x2F, 0x4F, 0x64, 0x69, 0x65, 0x72, 0x65,\n    0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x35, 0x20,\n    0x2F, 0x6D, 0x75, 0x6C, 0x74, 0x69, 0x70, 0x6C, 0x79, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x32, 0x31, 0x36, 0x20, 0x2F, 0x4F, 0x73, 0x6C, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75,\n    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x37, 0x20, 0x2F, 0x55, 0x67, 0x72, 0x61, 0x76,\n    0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x38, 0x20, 0x2F, 0x55,\n    0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31,\n    0x39, 0x20, 0x2F, 0x55, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x30, 0x20, 0x2F, 0x55, 0x64, 0x69, 0x65,\n    0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32,\n    0x31, 0x20, 0x2F, 0x59, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x32, 0x32, 0x32, 0x20, 0x2F, 0x54, 0x68, 0x6F, 0x72, 0x6E, 0x20, 0x70, 0x75, 0x74,\n    0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x33, 0x20, 0x2F, 0x67, 0x65, 0x72, 0x6D, 0x61, 0x6E,\n    0x64, 0x62, 0x6C, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x34,\n    0x20, 0x2F, 0x61, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,\n    0x20, 0x32, 0x32, 0x35, 0x20, 0x2F, 0x61, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74,\n    0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x36, 0x20, 0x2F, 0x61, 0x63, 0x69, 0x72, 0x63, 0x75,\n    0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32,\n    0x37, 0x20, 0x2F, 0x61, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x32, 0x32, 0x38, 0x20, 0x2F, 0x61, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x39, 0x20, 0x2F, 0x61, 0x72,\n    0x69, 0x6E, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x30, 0x20,\n    0x2F, 0x61, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x31, 0x20,\n    0x2F, 0x63, 0x63, 0x65, 0x64, 0x69, 0x6C, 0x6C, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x32, 0x33, 0x32, 0x20, 0x2F, 0x65, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75,\n    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x33, 0x20, 0x2F, 0x65, 0x61, 0x63, 0x75, 0x74,\n    0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x34, 0x20, 0x2F, 0x65,\n    0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x32, 0x33, 0x35, 0x20, 0x2F, 0x65, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69,\n    0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x36, 0x20, 0x2F, 0x69,\n    0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33,\n    0x37, 0x20, 0x2F, 0x69, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x32, 0x33, 0x38, 0x20, 0x2F, 0x69, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C,\n    0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x39, 0x20, 0x2F,\n    0x69, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x32, 0x34, 0x30, 0x20, 0x2F, 0x65, 0x74, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x32, 0x34, 0x31, 0x20, 0x2F, 0x6E, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x32, 0x20, 0x2F, 0x6F, 0x67, 0x72, 0x61,\n    0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x33, 0x20, 0x2F,\n    0x6F, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,\n    0x34, 0x34, 0x20, 0x2F, 0x6F, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20,\n    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x35, 0x20, 0x2F, 0x6F, 0x74, 0x69,\n    0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x36, 0x20,\n    0x2F, 0x6F, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x32, 0x34, 0x37, 0x20, 0x2F, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x38, 0x20, 0x2F, 0x6F, 0x73, 0x6C, 0x61,\n    0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x39, 0x20, 0x2F,\n    0x75, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,\n    0x35, 0x30, 0x20, 0x2F, 0x75, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x32, 0x35, 0x31, 0x20, 0x2F, 0x75, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66,\n    0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x32, 0x20,\n    0x2F, 0x75, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x32, 0x35, 0x33, 0x20, 0x2F, 0x79, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70,\n    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x34, 0x20, 0x2F, 0x74, 0x68, 0x6F, 0x72,\n    0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x35, 0x20, 0x2F, 0x79,\n    0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x72, 0x65, 0x61,\n    0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x50, 0x61, 0x69, 0x6E, 0x74,\n    0x54, 0x79, 0x70, 0x65, 0x20, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74,\n    0x54, 0x79, 0x70, 0x65, 0x20, 0x31, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x24, 0x42, 0x6C, 0x65,\n    0x6E, 0x64, 0x20, 0x7B, 0x20, 0x30, 0x2E, 0x31, 0x30, 0x34, 0x38, 0x20, 0x6D, 0x75, 0x6C, 0x20,\n    0x65, 0x78, 0x63, 0x68, 0x20, 0x30, 0x2E, 0x34, 0x35, 0x30, 0x34, 0x20, 0x6D, 0x75, 0x6C, 0x20,\n    0x61, 0x64, 0x64, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x30, 0x2E, 0x31, 0x37, 0x34, 0x36, 0x20,\n    0x6D, 0x75, 0x6C, 0x20, 0x61, 0x64, 0x64, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x62, 0x69,\n    0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x4D, 0x61, 0x74, 0x72,\n    0x69, 0x78, 0x20, 0x5B, 0x20, 0x30, 0x2E, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x20, 0x30,\n    0x20, 0x30, 0x20, 0x30, 0x2E, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x20, 0x30, 0x20, 0x30,\n    0x20, 0x5D, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D,\n    0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x42, 0x42, 0x6F, 0x78, 0x20, 0x7B, 0x2D, 0x31, 0x35, 0x37, 0x20,\n    0x2D, 0x32, 0x35, 0x37, 0x20, 0x31, 0x31, 0x39, 0x34, 0x20, 0x38, 0x37, 0x32, 0x7D, 0x20, 0x72,\n    0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x42, 0x6C, 0x65,\n    0x6E, 0x64, 0x20, 0x33, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x62, 0x65,\n    0x67, 0x69, 0x6E, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x42, 0x42, 0x6F, 0x78, 0x20, 0x7B, 0x7B,\n    0x20, 0x2D, 0x31, 0x33, 0x35, 0x20, 0x2D, 0x32, 0x33, 0x36, 0x20, 0x2D, 0x31, 0x33, 0x35, 0x20,\n    0x2D, 0x32, 0x30, 0x31, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x2D, 0x32,\n    0x35, 0x37, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x7D, 0x20, 0x7B,\n    0x20, 0x35, 0x38, 0x32, 0x20, 0x31, 0x32, 0x31, 0x37, 0x20, 0x31, 0x32, 0x37, 0x34, 0x20, 0x31,\n    0x39, 0x32, 0x32, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x38, 0x37, 0x32, 0x20, 0x38, 0x37, 0x32, 0x20,\n    0x38, 0x37, 0x32, 0x20, 0x38, 0x37, 0x32, 0x20, 0x7D, 0x7D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F,\n    0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x31, 0x34, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20,\n    0x64, 0x65, 0x66, 0x0D, 0x65, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x25, 0x20, 0x43, 0x6F,\n    0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x31, 0x39, 0x39, 0x30,\n    0x2D, 0x31, 0x39, 0x39, 0x34, 0x20, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x53, 0x79, 0x73, 0x74,\n    0x65, 0x6D, 0x73, 0x20, 0x49, 0x6E, 0x63, 0x6F, 0x72, 0x70, 0x6F, 0x72, 0x61, 0x74, 0x65, 0x64,\n    0x0D, 0x25, 0x20, 0x41, 0x6C, 0x6C, 0x20, 0x52, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x52, 0x65,\n    0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2E, 0x0D, 0x2F, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x64,\n    0x69, 0x63, 0x74, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20,\n    0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20,\n    0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, 0x74, 0x72, 0x75, 0x65,\n    0x20, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65,\n    0x64, 0x64, 0x69, 0x63, 0x74, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x75, 0x73,\n    0x65, 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20,\n    0x64, 0x75, 0x70, 0x0D, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64,\n    0x66, 0x6F, 0x6E, 0x74, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x20, 0x2F, 0x6D, 0x61,\n    0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x67, 0x65,\n    0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x2F, 0x6F, 0x70, 0x65, 0x72,\n    0x61, 0x74, 0x6F, 0x72, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F,\n    0x70, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x30, 0x20, 0x67, 0x65,\n    0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x2F, 0x69, 0x6E, 0x74, 0x65,\n    0x67, 0x65, 0x72, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6E, 0x65, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70,\n    0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x31, 0x31, 0x20, 0x6C, 0x74,\n    0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C,\n    0x73, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66,\n    0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E,\n    0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7B, 0x0D, 0x31, 0x31, 0x20, 0x70, 0x6F, 0x70,\n    0x0D, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65,\n    0x78, 0x63, 0x68, 0x20, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x56, 0x65, 0x63, 0x74, 0x6F,\n    0x72, 0x20, 0x67, 0x65, 0x74, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65, 0x71, 0x0D,\n    0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x61,\n    0x64, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x20, 0x31, 0x20, 0x73, 0x75,\n    0x62, 0x20, 0x61, 0x62, 0x73, 0x20, 0x2E, 0x30, 0x30, 0x31, 0x20, 0x67, 0x74, 0x20, 0x7D, 0x0D,\n    0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D,\n    0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F,\n    0x6E, 0x74, 0x20, 0x63, 0x76, 0x78, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x64, 0x69, 0x63, 0x74,\n    0x20, 0x2F, 0x72, 0x61, 0x6E, 0x67, 0x65, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x67, 0x65, 0x74,\n    0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20,\n    0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6D, 0x61, 0x78, 0x6C, 0x65, 0x6E, 0x67, 0x74,\n    0x68, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x0D, 0x66,\n    0x61, 0x6C, 0x73, 0x65, 0x20, 0x7B, 0x20, 0x2F, 0x46, 0x49, 0x44, 0x20, 0x2F, 0x55, 0x6E, 0x69,\n    0x71, 0x75, 0x65, 0x49, 0x44, 0x20, 0x2F, 0x58, 0x55, 0x49, 0x44, 0x20, 0x7D, 0x20, 0x7B, 0x20,\n    0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7D, 0x20,\n    0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70,\n    0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x65, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73,\n    0x65, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x2F, 0x58, 0x55, 0x49, 0x44,\n    0x20, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x7B, 0x0D,\n    0x67, 0x65, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x32,\n    0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x75,\n    0x62, 0x20, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x67, 0x74, 0x20, 0x7B, 0x0D, 0x65, 0x78, 0x63,\n    0x68, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x61, 0x72, 0x72,\n    0x61, 0x79, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x32, 0x20, 0x69,\n    0x6E, 0x64, 0x65, 0x78, 0x20, 0x7B, 0x20, 0x36, 0x35, 0x35, 0x33, 0x36, 0x20, 0x6D, 0x75, 0x6C,\n    0x20, 0x63, 0x76, 0x69, 0x20, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x70, 0x75, 0x74, 0x20,\n    0x70, 0x6F, 0x70, 0x20, 0x31, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61,\n    0x6C, 0x6C, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x2F, 0x58, 0x55, 0x49, 0x44, 0x20, 0x65, 0x78, 0x63,\n    0x68, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F,\n    0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70,\n    0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D,\n    0x7B, 0x20, 0x2F, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74,\n    0x49, 0x6E, 0x66, 0x6F, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x6F, 0x61,\n    0x64, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6D, 0x61, 0x78, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20,\n    0x64, 0x69, 0x63, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x0D, 0x66, 0x61, 0x6C,\n    0x73, 0x65, 0x20, 0x7B, 0x20, 0x2F, 0x55, 0x6E, 0x69, 0x71, 0x75, 0x65, 0x49, 0x44, 0x20, 0x2F,\n    0x58, 0x55, 0x49, 0x44, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,\n    0x20, 0x65, 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D,\n    0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x65,\n    0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72,\n    0x61, 0x6C, 0x6C, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20,\n    0x65, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C,\n    0x0D, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x56, 0x65, 0x63, 0x74,\n    0x6F, 0x72, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x2F, 0x24, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x5B, 0x0D, 0x65,\n    0x78, 0x63, 0x68, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20,\n    0x2D, 0x31, 0x20, 0x31, 0x20, 0x7B, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x64,\n    0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x33, 0x20, 0x2D, 0x31, 0x20, 0x72,\n    0x6F, 0x6C, 0x6C, 0x20, 0x73, 0x75, 0x62, 0x20, 0x67, 0x65, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,\n    0x30, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64,\n    0x65, 0x78, 0x20, 0x7B, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20,\n    0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x2F, 0x70,\n    0x6F, 0x70, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C,\n    0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x31, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x20,\n    0x70, 0x6F, 0x70, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20,\n    0x7B, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x34, 0x20, 0x31,\n    0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x33, 0x20, 0x31, 0x20, 0x72,\n    0x6F, 0x6C, 0x6C, 0x20, 0x2F, 0x6D, 0x75, 0x6C, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20,\n    0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D,\n    0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x7B, 0x20, 0x2F, 0x61, 0x64, 0x64, 0x20, 0x6C,\n    0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69,\n    0x66, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20,\n    0x65, 0x78, 0x63, 0x68, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20,\n    0x66, 0x6F, 0x72, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x7B, 0x20, 0x2F, 0x61, 0x64, 0x64, 0x20, 0x6C,\n    0x6F, 0x61, 0x64, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x5D, 0x20, 0x63, 0x76, 0x78, 0x20, 0x64,\n    0x65, 0x66, 0x0D, 0x7B, 0x20, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6C, 0x65, 0x6E, 0x67,\n    0x74, 0x68, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x6E,\n    0x65, 0x20, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64,\n    0x66, 0x6F, 0x6E, 0x74, 0x20, 0x63, 0x76, 0x78, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x64, 0x69,\n    0x63, 0x74, 0x20, 0x2F, 0x74, 0x79, 0x70, 0x65, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x67, 0x65,\n    0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x30, 0x20, 0x30, 0x20,\n    0x31, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68,\n    0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x20, 0x69,\n    0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78,\n    0x63, 0x68, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,\n    0x67, 0x65, 0x74, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x61, 0x64, 0x64, 0x0D, 0x7D, 0x20, 0x66, 0x6F,\n    0x72, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,\n    0x70, 0x6F, 0x70, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74, 0x79,\n    0x70, 0x65, 0x20, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x61, 0x72, 0x72, 0x61,\n    0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x70,\n    0x61, 0x63, 0x6B, 0x65, 0x64, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65,\n    0x71, 0x20, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64,\n    0x65, 0x78, 0x20, 0x2F, 0x46, 0x6F, 0x72, 0x63, 0x65, 0x42, 0x6F, 0x6C, 0x64, 0x20, 0x65, 0x71,\n    0x20, 0x7B, 0x0D, 0x35, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x30, 0x20, 0x30, 0x20, 0x31,\n    0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20,\n    0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x20, 0x69, 0x6E,\n    0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x7B, 0x20, 0x32,\n    0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20,\n    0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66,\n    0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,\n    0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x32, 0x20, 0x69,\n    0x6E, 0x64, 0x65, 0x78, 0x20, 0x2F, 0x46, 0x6F, 0x72, 0x63, 0x65, 0x42, 0x6F, 0x6C, 0x64, 0x54,\n    0x68, 0x72, 0x65, 0x73, 0x68, 0x6F, 0x6C, 0x64, 0x20, 0x67, 0x65, 0x74, 0x20, 0x67, 0x74, 0x20,\n    0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x7B, 0x20, 0x6C, 0x65, 0x6E,\n    0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67,\n    0x74, 0x68, 0x20, 0x6E, 0x65, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C, 0x73,\n    0x65, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x74, 0x72, 0x75, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,\n    0x7B, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x69, 0x6E, 0x74, 0x65,\n    0x67, 0x65, 0x72, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,\n    0x2F, 0x72, 0x65, 0x61, 0x6C, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63,\n    0x68, 0x20, 0x6F, 0x72, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C,\n    0x6C, 0x0D, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x0D, 0x32, 0x20, 0x63,\n    0x6F, 0x70, 0x79, 0x20, 0x38, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68,\n    0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x35, 0x20, 0x69, 0x6E,\n    0x64, 0x65, 0x78, 0x20, 0x35, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63,\n    0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65,\n    0x6E, 0x67, 0x74, 0x68, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64,\n    0x65, 0x78, 0x20, 0x78, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x7B, 0x20, 0x63, 0x76, 0x78, 0x20,\n    0x7D, 0x20, 0x69, 0x66, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20,\n    0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x31, 0x20, 0x65,\n    0x78, 0x63, 0x68, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65,\n    0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74,\n    0x79, 0x70, 0x65, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79,\n    0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x70, 0x61, 0x63, 0x6B,\n    0x65, 0x64, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x6F,\n    0x72, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,\n    0x20, 0x36, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7B, 0x0D,\n    0x39, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x39, 0x20, 0x69,\n    0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D,\n    0x20, 0x69, 0x66, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x33, 0x20, 0x31, 0x20,\n    0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x65,\n    0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70,\n    0x0D, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79,\n    0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x53, 0x74,\n    0x65, 0x6D, 0x53, 0x6E, 0x61, 0x70, 0x48, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,\n    0x2F, 0x53, 0x74, 0x65, 0x6D, 0x53, 0x6E, 0x61, 0x70, 0x56, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72,\n    0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20,\n    0x73, 0x75, 0x62, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x6C, 0x65, 0x20, 0x7B,\n    0x20, 0x65, 0x78, 0x69, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x64,\n    0x75, 0x70, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,\n    0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33,\n    0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20,\n    0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20,\n    0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20,\n    0x30, 0x20, 0x70, 0x75, 0x74, 0x20, 0x30, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x6C, 0x65, 0x20,\n    0x7B, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20,\n    0x64, 0x75, 0x70, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65,\n    0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,\n    0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74,\n    0x0D, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33, 0x20,\n    0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x65, 0x78, 0x63, 0x68,\n    0x20, 0x70, 0x75, 0x74, 0x0D, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x70, 0x75, 0x74, 0x20,\n    0x70, 0x6F, 0x70, 0x0D, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,\n    0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6C, 0x74, 0x20,\n    0x7B, 0x20, 0x31, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69,\n    0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x6C, 0x6F, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70,\n    0x0D, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x67, 0x65, 0x74, 0x20, 0x30, 0x20, 0x6C, 0x65, 0x20,\n    0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x30,\n    0x20, 0x67, 0x74, 0x20, 0x7B, 0x20, 0x65, 0x78, 0x69, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20,\n    0x31, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x64,\n    0x75, 0x70, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74,\n    0x68, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x73, 0x75, 0x62, 0x20, 0x67, 0x65, 0x74, 0x69, 0x6E,\n    0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66,\n    0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x70, 0x75, 0x74, 0x20, 0x7D, 0x0D,\n    0x7B, 0x20, 0x2F, 0x64, 0x69, 0x63, 0x74, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x7B,\n    0x20, 0x36, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C,\n    0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65,\n    0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65,\n    0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x63, 0x76, 0x78, 0x20,\n    0x65, 0x72, 0x72, 0x6F, 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x2F, 0x74, 0x79, 0x70, 0x65, 0x63,\n    0x68, 0x65, 0x63, 0x6B, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20,\n    0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20,\n    0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C,\n    0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70,\n    0x20, 0x7D, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x42,\n    0x6C, 0x65, 0x6E, 0x64, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65,\n    0x63, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x6E,\n    0x64, 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x2F, 0x24, 0x66,\n    0x62, 0x66, 0x20, 0x7B, 0x20, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F,\n    0x72, 0x79, 0x20, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x33,\n    0x20, 0x61, 0x64, 0x64, 0x20, 0x2D, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x6B, 0x6E, 0x6F,\n    0x77, 0x6E, 0x20, 0x7B, 0x0D, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B,\n    0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20,\n    0x7B, 0x0D, 0x5D, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E,\n    0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64,\n    0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x45, 0x6E, 0x63, 0x6F,\n    0x64, 0x69, 0x6E, 0x67, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x66, 0x6F, 0x6E, 0x74,\n    0x20, 0x2F, 0x45, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x67, 0x65, 0x74, 0x20, 0x70,\n    0x75, 0x74, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x66, 0x6F, 0x6E, 0x74, 0x0D, 0x7D, 0x20,\n    0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x66, 0x6F,\n    0x6E, 0x74, 0x20, 0x2F, 0x53, 0x63, 0x61, 0x6C, 0x65, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20,\n    0x67, 0x65, 0x74, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73, 0x65, 0x74,\n    0x66, 0x6F, 0x6E, 0x74, 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x20,\n    0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66,\n    0x65, 0x6C, 0x73, 0x65, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x2F, 0x4E, 0x6F, 0x72, 0x6D, 0x61,\n    0x6C, 0x69, 0x7A, 0x65, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72,\n    0x20, 0x7B, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x31, 0x31, 0x30, 0x20, 0x73, 0x75, 0x62, 0x20,\n    0x36, 0x38, 0x30, 0x20, 0x64, 0x69, 0x76, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x31, 0x30, 0x30,\n    0x20, 0x73, 0x75, 0x62, 0x20, 0x38, 0x30, 0x30, 0x20, 0x64, 0x69, 0x76, 0x0D, 0x7D, 0x20, 0x62,\n    0x69, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x43, 0x6F, 0x6E, 0x76, 0x65, 0x72, 0x74,\n    0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x31,\n    0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x31, 0x20, 0x32,\n    0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33,\n    0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20,\n    0x31, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6D, 0x75,\n    0x6C, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20, 0x32, 0x20, 0x69,\n    0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,\n    0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20,\n    0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6D, 0x75,\n    0x6C, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x70,\n    0x6F, 0x70, 0x20, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x24,\n    0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E,\n    0x74, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x73, 0x61,\n    0x76, 0x65, 0x20, 0x7B, 0x20, 0x72, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x65, 0x20, 0x7D, 0x20, 0x7B,\n    0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x7B,\n    0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x65, 0x66, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65,\n    0x6C, 0x73, 0x65, 0x0D, 0x2F, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x77,\n    0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20,\n    0x7D, 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C,\n    0x73, 0x65, 0x0D, 0x2F, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x77, 0x68, 0x65,\n    0x72, 0x65, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65,\n    0x6D, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x7B,\n    0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B,\n    0x20, 0x7B, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x73, 0x65,\n    0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20,\n    0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66,\n    0x65, 0x6C, 0x73, 0x65, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x64, 0x69, 0x63, 0x74, 0x0D,\n    0x7D, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x75, 0x73, 0x65, 0x72, 0x64, 0x69, 0x63, 0x74,\n    0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D,\n    0x7D, 0x20, 0x7B, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x20, 0x63, 0x75, 0x72, 0x72,\n    0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x73, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x7D,\n    0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73,\n    0x65, 0x20, 0x7B, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65,\n    0x64, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65,\n    0x20, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C,\n    0x73, 0x65, 0x20, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, 0x7D,\n    0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20,\n    0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73,\n    0x65, 0x0D, 0x2F, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E,\n    0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x2F, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20,\n    0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65,\n    0x63, 0x0D, 0x2F, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7B, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20,\n    0x65, 0x78, 0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70,\n    0x20, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65,\n    0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x54, 0x79, 0x70,\n    0x65, 0x20, 0x67, 0x65, 0x74, 0x20, 0x33, 0x20, 0x6E, 0x65, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x64,\n    0x75, 0x70, 0x20, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72,\n    0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77,\n    0x6E, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F,\n    0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68,\n    0x20, 0x67, 0x65, 0x74, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x67,\n    0x65, 0x74, 0x20, 0x33, 0x20, 0x6E, 0x65, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73,\n    0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65,\n    0x6C, 0x73, 0x65, 0x0D, 0x7B, 0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67,\n    0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70,\n    0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x74, 0x72, 0x69,\n    0x6E, 0x67, 0x20, 0x63, 0x76, 0x73, 0x20, 0x28, 0x5F, 0x29, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63,\n    0x68, 0x20, 0x7B, 0x0D, 0x63, 0x76, 0x6E, 0x20, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20,\n    0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78,\n    0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x53, 0x68,\n    0x61, 0x72, 0x65, 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72,\n    0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x6F, 0x72, 0x20,\n    0x7B, 0x0D, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C,\n    0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x37, 0x20, 0x61, 0x64, 0x64, 0x20, 0x73, 0x74, 0x72, 0x69,\n    0x6E, 0x67, 0x20, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x28, 0x25, 0x66, 0x6F, 0x6E, 0x74, 0x25,\n    0x29, 0x20, 0x70, 0x75, 0x74, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, 0x0D, 0x64, 0x75,\n    0x70, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x36, 0x20, 0x65, 0x78, 0x63, 0x68,\n    0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x74, 0x72, 0x69,\n    0x6E, 0x67, 0x20, 0x63, 0x76, 0x73, 0x20, 0x70, 0x75, 0x74, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x76,\n    0x61, 0x6C, 0x0D, 0x7B, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x7D, 0x20, 0x73, 0x74,\n    0x6F, 0x70, 0x70, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C, 0x73,\n    0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70,\n    0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20,\n    0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65,\n    0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7B, 0x0D, 0x24, 0x6D, 0x6D, 0x66,\n    0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x62,\n    0x65, 0x67, 0x69, 0x6E, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x5B, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,\n    0x7B, 0x20, 0x28, 0x5F, 0x29, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x7B,\n    0x20, 0x63, 0x76, 0x72, 0x20, 0x7D, 0x20, 0x73, 0x74, 0x6F, 0x70, 0x70, 0x65, 0x64, 0x20, 0x7B,\n    0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x65, 0x78, 0x63,\n    0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65,\n    0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x69, 0x74,\n    0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x6C, 0x6F, 0x6F, 0x70,\n    0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66, 0x6F,\n    0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x46, 0x6F, 0x6E,\n    0x74, 0x49, 0x6E, 0x66, 0x6F, 0x20, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x41, 0x78, 0x69, 0x73,\n    0x54, 0x79, 0x70, 0x65, 0x73, 0x20, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6B, 0x6E, 0x6F,\n    0x77, 0x6E, 0x20, 0x7B, 0x0D, 0x67, 0x65, 0x74, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20,\n    0x63, 0x6F, 0x75, 0x6E, 0x74, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x32, 0x20, 0x73, 0x75,\n    0x62, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x7D, 0x20,\n    0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C,\n    0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7B, 0x0D, 0x4E, 0x6F, 0x72, 0x6D, 0x61, 0x6C,\n    0x69, 0x7A, 0x65, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x0D,\n    0x43, 0x6F, 0x6E, 0x76, 0x65, 0x72, 0x74, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63,\n    0x74, 0x6F, 0x72, 0x0D, 0x5D, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63,\n    0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64,\n    0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x0D, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x65, 0x78,\n    0x63, 0x68, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x65, 0x78, 0x63,\n    0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x66, 0x6F, 0x6E, 0x74,\n    0x20, 0x7D, 0x20, 0x7B, 0x20, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B,\n    0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66,\n    0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x65, 0x6E, 0x64,\n    0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70,\n    0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66,\n    0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B,\n    0x20, 0x70, 0x6F, 0x70, 0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66,\n    0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65,\n    0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64,\n    0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x2F, 0x53,\n    0x68, 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F,\n    0x72, 0x79, 0x20, 0x64, 0x75, 0x70, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x20, 0x70,\n    0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x30, 0x20, 0x64, 0x69, 0x63,\n    0x74, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D,\n    0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x65, 0x6E, 0x64, 0x20, 0x65, 0x78, 0x65, 0x63,\n    0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E,\n    0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x6E, 0x64, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E,\n    0x74, 0x66, 0x69, 0x6C, 0x65, 0x20, 0x65, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x80, 0x02, 0x0B, 0x8F,\n    0x01, 0x00, 0xE8, 0xDC, 0x61, 0x72, 0x80, 0x71, 0xAB, 0xD4, 0xD5, 0xBC, 0xD2, 0x30, 0xC4, 0xE1,\n    0x86, 0xDC, 0xE0, 0x96, 0x54, 0x1C, 0x9C, 0x1F, 0x2E, 0x58, 0x69, 0x40, 0x4E, 0x33, 0xF9, 0xCE,\n    0xFF, 0x7D, 0x2F, 0xBF, 0xEF, 0x5F, 0x26, 0xC7, 0xE1, 0x84, 0x89, 0x54, 0xC7, 0x07, 0x55, 0x24,\n    0x4E, 0x73, 0x41, 0xB8, 0x26, 0x97, 0xE2, 0xE8, 0xEA, 0x9C, 0xE9, 0x13, 0x1D, 0x00, 0x55, 0x78,\n    0xAB, 0x3D, 0xE1, 0x9F, 0xA9, 0xF2, 0xFA, 0xFF, 0x3B, 0xEB, 0x53, 0x17, 0x4A, 0x8E, 0x2F, 0x33,\n    0xE9, 0xDB, 0xE0, 0x38, 0x63, 0x42, 0xF4, 0x0E, 0x5D, 0xF2, 0x5B, 0x7A, 0x88, 0x22, 0xEE, 0x2B,\n    0x6C, 0xDC, 0xAC, 0x58, 0xA9, 0x8F, 0x9B, 0x04, 0x71, 0x44, 0xE3, 0xF6, 0xE7, 0x4A, 0xB6, 0x0C,\n    0x00, 0xE4, 0x42, 0xE8, 0x30, 0xB1, 0x30, 0x30, 0x8A, 0x3F, 0x0E, 0xDF, 0x2C, 0xE6, 0x62, 0x35,\n    0xF9, 0x21, 0x6D, 0x42, 0x0F, 0x23, 0xAC, 0xED, 0xEC, 0x60, 0xA8, 0x8A, 0x73, 0x77, 0x14, 0x62,\n    0xE1, 0xB2, 0x04, 0x04, 0x29, 0x5D, 0x49, 0xBA, 0x8A, 0x8B, 0xCB, 0xF2, 0x04, 0x2A, 0x8D, 0xEB,\n    0x9A, 0x65, 0xBA, 0xF1, 0xC8, 0x24, 0x2F, 0x7E, 0x90, 0xD9, 0x49, 0x63, 0x23, 0x73, 0xF8, 0x43,\n    0x8F, 0xC1, 0xE7, 0x37, 0x37, 0x0B, 0x91, 0x15, 0x08, 0x9D, 0xA7, 0x90, 0xA8, 0x28, 0x50, 0xB6,\n    0x91, 0xE6, 0xE8, 0x3B, 0x37, 0x22, 0xC0, 0x07, 0x14, 0xDC, 0xBC, 0xEA, 0xA1, 0xDC, 0x3D, 0x22,\n    0x98, 0x3B, 0x35, 0x61, 0x6A, 0xD7, 0xF1, 0x03, 0x35, 0x0B, 0x4A, 0x40, 0xB2, 0xAA, 0xE5, 0x0E,\n    0xF0, 0x94, 0x6C, 0x77, 0xC5, 0x67, 0x73, 0x0D, 0x0D, 0xE6, 0x76, 0xA6, 0x95, 0x13, 0x0A, 0xBE,\n    0xC8, 0xC7, 0xB8, 0xC4, 0x6B, 0xFA, 0xBC, 0xDA, 0xDD, 0x88, 0x2C, 0x74, 0x58, 0x58, 0x9B, 0x2B,\n    0xEA, 0x87, 0xE1, 0x23, 0x2C, 0x60, 0x58, 0x0C, 0x62, 0x35, 0xB7, 0xD7, 0xE8, 0xC6, 0x6A, 0x2A,\n    0x72, 0x90, 0x1F, 0x3D, 0x0D, 0x76, 0x59, 0x30, 0x0E, 0x7E, 0x04, 0xFF, 0xDE, 0x4A, 0xA6, 0xD8,\n    0x88, 0x25, 0x75, 0x76, 0x30, 0xCF, 0x8C, 0x9E, 0x8E, 0xA4, 0x14, 0x10, 0x7F, 0x2F, 0xC4, 0xA8,\n    0x0F, 0xCA, 0xAF, 0xCB, 0x54, 0x39, 0x87, 0x1A, 0x81, 0x71, 0xFB, 0xA5, 0x08, 0x17, 0x4F, 0x53,\n    0xB8, 0xEC, 0xE2, 0xD3, 0xBF, 0xBD, 0xBA, 0x93, 0x75, 0xFF, 0x8F, 0xB9, 0x66, 0x12, 0x02, 0x21,\n    0x87, 0x6D, 0xB0, 0xDC, 0x2D, 0x37, 0x22, 0xB7, 0x88, 0xB4, 0xD3, 0x8F, 0x8B, 0x24, 0xEF, 0x76,\n    0xF3, 0xB4, 0x91, 0x58, 0x95, 0xFF, 0x41, 0xD8, 0xFA, 0xFA, 0xD8, 0xE8, 0x68, 0xA9, 0xA8, 0x5B,\n    0x59, 0x2C, 0xF0, 0x30, 0xA1, 0xD0, 0x44, 0x8A, 0x81, 0xF5, 0xE6, 0x92, 0x1E, 0xAE, 0xE8, 0x26,\n    0xA4, 0xD9, 0xB7, 0x05, 0x5A, 0x9C, 0xA1, 0xC7, 0x98, 0xAA, 0xFA, 0x25, 0x91, 0x11, 0x4D, 0x61,\n    0xCB, 0x50, 0x2E, 0xFC, 0xFC, 0x44, 0x63, 0x02, 0x08, 0xCB, 0xA9, 0x17, 0x10, 0x3B, 0xC3, 0xA1,\n    0x2A, 0x60, 0xB1, 0x79, 0x84, 0x95, 0x83, 0xD0, 0xB1, 0xF1, 0xDC, 0x9F, 0xBE, 0xB2, 0xBC, 0x90,\n    0xD1, 0xE4, 0xF2, 0x42, 0xD5, 0x08, 0x0B, 0xD4, 0xB1, 0x4C, 0x73, 0x8D, 0x0C, 0xD1, 0x69, 0xC8,\n    0x1E, 0xB6, 0x84, 0x5F, 0xD9, 0x2D, 0xAB, 0x2A, 0x6B, 0xBB, 0x48, 0x3F, 0xB6, 0xFB, 0x08, 0x2F,\n    0x57, 0x11, 0xAB, 0x42, 0x54, 0xC9, 0xD7, 0xB1, 0xF8, 0x28, 0xBA, 0xCD, 0x68, 0xF9, 0x0D, 0xE0,\n    0xD1, 0x26, 0xCE, 0xA0, 0x24, 0x56, 0x63, 0xB7, 0xA1, 0xC6, 0x85, 0xD8, 0x55, 0x18, 0x60, 0x25,\n    0x55, 0x0B, 0xC6, 0x9B, 0xC4, 0x28, 0x0C, 0x37, 0xE0, 0x9A, 0x74, 0x52, 0x0D, 0x76, 0x5F, 0x41,\n    0xDC, 0xEA, 0xD8, 0x35, 0x1A, 0xB7, 0x49, 0xC3, 0x5C, 0x6D, 0xD0, 0x83, 0x7A, 0x4F, 0xC1, 0xCB,\n    0x12, 0xAB, 0x27, 0x4B, 0xCF, 0x7F, 0xF8, 0x01, 0xC1, 0x8D, 0x13, 0x34, 0x62, 0xFF, 0xE0, 0x5C,\n    0x56, 0xCE, 0x4E, 0x3D, 0x34, 0x37, 0xAC, 0xFB, 0xB0, 0x3E, 0x05, 0xA6, 0x2B, 0xF6, 0x2C, 0xA2,\n    0x46, 0x65, 0x6A, 0xAF, 0x3E, 0xD6, 0x5A, 0x92, 0x22, 0xFF, 0x51, 0xF3, 0x19, 0x27, 0x39, 0xB3,\n    0x32, 0x7F, 0x94, 0x7A, 0x6B, 0x56, 0xF8, 0xB8, 0xA5, 0x70, 0xB1, 0x3F, 0x15, 0x15, 0xF6, 0x61,\n    0x4B, 0x88, 0xB0, 0x12, 0xE0, 0x4F, 0x6F, 0xE9, 0xCB, 0x2C, 0x72, 0x01, 0xB1, 0xDB, 0x85, 0x78,\n    0x3C, 0x0F, 0xD2, 0x3B, 0x54, 0x8E, 0x29, 0x21, 0x66, 0xBA, 0x80, 0xC6, 0x05, 0x5E, 0xD1, 0xD9,\n    0x93, 0xCD, 0x63, 0xA0, 0x95, 0xBB, 0x26, 0xA3, 0x36, 0x12, 0x2D, 0x1C, 0xE4, 0xEA, 0x98, 0xE6,\n    0xDC, 0x9F, 0xD6, 0x61, 0xF8, 0x71, 0x14, 0xFE, 0xF8, 0x10, 0xB9, 0x24, 0x36, 0xF9, 0xB3, 0x6C,\n    0x0F, 0xC3, 0x28, 0x46, 0x43, 0x19, 0xAF, 0xA7, 0xB1, 0xEC, 0x4A, 0x88, 0x7C, 0xE7, 0x85, 0x81,\n    0x23, 0x69, 0xF3, 0x21, 0x90, 0xEB, 0x3D, 0xB1, 0x73, 0x4A, 0xB2, 0xF2, 0x55, 0x30, 0xF8, 0x02,\n    0x79, 0x76, 0x1D, 0xFB, 0x0A, 0x40, 0x06, 0x61, 0xCC, 0xCB, 0x47, 0x94, 0x1A, 0x74, 0x70, 0x8F,\n    0x1B, 0x93, 0x16, 0x24, 0xAA, 0x32, 0xD4, 0xB0, 0xEE, 0xCA, 0xEE, 0x0D, 0x27, 0x71, 0x0D, 0xE8,\n    0xCC, 0xD7, 0x2A, 0x28, 0xA5, 0xC4, 0xD8, 0xDD, 0x0B, 0x16, 0x74, 0xF7, 0xE3, 0x61, 0x06, 0x37,\n    0x24, 0x1C, 0x00, 0x14, 0x0C, 0x32, 0x7F, 0x88, 0x75, 0xF9, 0x9B, 0xFA, 0x3B, 0xCA, 0xF6, 0x51,\n    0xD2, 0xAB, 0xD5, 0x3F, 0x21, 0xCD, 0x51, 0x3D, 0x3D, 0xB4, 0x81, 0xF9, 0x33, 0x79, 0xE9, 0x62,\n    0x9F, 0x93, 0x5F, 0xA8, 0x77, 0x26, 0x75, 0x01, 0x40, 0xD3, 0xE3, 0xBD, 0x68, 0x8D, 0x1B, 0xCC,\n    0xE7, 0x79, 0xB2, 0x3E, 0x61, 0xB6, 0x00, 0xF0, 0x0A, 0x58, 0xF2, 0xC1, 0x4C, 0x5A, 0xA4, 0x86,\n    0xD4, 0xCA, 0xCB, 0x15, 0xCC, 0xD1, 0x16, 0x74, 0x70, 0xF3, 0xCB, 0xBA, 0x0E, 0x8A, 0xDB, 0xEB,\n    0x4F, 0x3D, 0x0C, 0x3C, 0xFE, 0x40, 0x7D, 0x46, 0xC0, 0x0E, 0x0E, 0x18, 0x64, 0x69, 0xAB, 0xEF,\n    0x00, 0x68, 0x83, 0x95, 0xFF, 0x32, 0xF3, 0x13, 0x78, 0x8C, 0x1E, 0xF9, 0xA8, 0xE8, 0x2D, 0x5F,\n    0x04, 0xB8, 0x15, 0x22, 0x76, 0xDD, 0x46, 0xCF, 0x69, 0xA4, 0xCE, 0x5B, 0x20, 0x77, 0xA0, 0x22,\n    0x24, 0xE5, 0xDE, 0xB8, 0xF3, 0x44, 0x5B, 0xC9, 0xEF, 0x47, 0xFD, 0x3A, 0x02, 0xAF, 0x31, 0x6C,\n    0x02, 0x4A, 0x02, 0x3C, 0x65, 0x5A, 0x0B, 0x63, 0xB0, 0x11, 0xBB, 0x07, 0x3C, 0xFC, 0xFA, 0xAD,\n    0x93, 0x46, 0x11, 0x6D, 0x68, 0xFF, 0xB7, 0xC7, 0x58, 0x2F, 0x7C, 0x23, 0x62, 0xD7, 0xD9, 0xF9,\n    0x7A, 0x8A, 0xD3, 0x11, 0x58, 0xAC, 0x43, 0x0D, 0xA0, 0x77, 0x8D, 0x88, 0xD5, 0x34, 0xD1, 0xB9,\n    0x2E, 0x4A, 0x8C, 0xDC, 0xA0, 0x71, 0xB9, 0xB2, 0x18, 0xC5, 0x74, 0x1E, 0x48, 0x9E, 0x70, 0x0A,\n    0x7E, 0x9B, 0x71, 0xFA, 0xC7, 0x4D, 0x3C, 0x6E, 0x19, 0x88, 0xF0, 0xE2, 0xA5, 0x99, 0x3D, 0x85,\n    0xBB, 0xE1, 0xDA, 0x82, 0x7B, 0xA9, 0xBA, 0x59, 0x0E, 0x03, 0x26, 0x3B, 0x83, 0xC8, 0x81, 0x36,\n    0x70, 0xA4, 0x11, 0x97, 0x97, 0xB6, 0x47, 0x7D, 0x81, 0x02, 0x45, 0x1C, 0x76, 0x33, 0x98, 0x84,\n    0xFE, 0xFE, 0x65, 0xDE, 0x37, 0x31, 0xE7, 0xD9, 0x6F, 0xDC, 0xAC, 0xC1, 0x1C, 0x1F, 0xA4, 0x08,\n    0x98, 0x47, 0xD3, 0x53, 0xF9, 0x24, 0x6E, 0x26, 0x99, 0x7C, 0xF2, 0xCF, 0x2A, 0xC8, 0xCC, 0xAD,\n    0x17, 0x09, 0xE3, 0x1B, 0x66, 0xAC, 0x24, 0x6F, 0xE0, 0x88, 0x14, 0xC4, 0x8A, 0xF2, 0xFA, 0x93,\n    0xE9, 0x48, 0xB5, 0xA4, 0x52, 0xF9, 0xDE, 0x54, 0xF5, 0xF4, 0x20, 0x95, 0x45, 0xCE, 0x37, 0x2E,\n    0x9E, 0x0A, 0xC7, 0x89, 0xF2, 0x00, 0x64, 0x6D, 0xBC, 0xAF, 0x9F, 0x52, 0xBC, 0xA0, 0x17, 0xE3,\n    0x20, 0x42, 0xAB, 0xBF, 0xFB, 0x2A, 0x7F, 0x51, 0xAC, 0xCC, 0x40, 0xEF, 0x6D, 0xF2, 0xBC, 0x3D,\n    0xE2, 0xDC, 0x99, 0x0C, 0x2D, 0xBC, 0x47, 0x1D, 0x98, 0x02, 0x0B, 0xB2, 0xE2, 0xA2, 0x03, 0x47,\n    0x3C, 0x17, 0x69, 0xD6, 0x09, 0xA4, 0x8B, 0x9F, 0x63, 0x40, 0xD8, 0x5F, 0x67, 0xB3, 0x95, 0x28,\n    0x16, 0xAF, 0x67, 0x97, 0x3A, 0x67, 0x29, 0x67, 0x3C, 0xF1, 0x9D, 0x24, 0x34, 0xE3, 0x47, 0x14,\n    0xC6, 0x94, 0xA0, 0x1F, 0xB7, 0x64, 0x9D, 0x7E, 0x38, 0xB8, 0x70, 0xD2, 0x4A, 0x74, 0x54, 0xA4,\n    0x64, 0x34, 0x27, 0x3B, 0xB7, 0x98, 0x18, 0x07, 0x1F, 0x4E, 0x00, 0x86, 0x91, 0x6A, 0x71, 0x09,\n    0x72, 0x6B, 0x42, 0x4F, 0x11, 0x62, 0xDC, 0x0B, 0x15, 0x0C, 0x74, 0x0B, 0x6D, 0xFF, 0xC2, 0x28,\n    0x98, 0x97, 0x33, 0x65, 0xD6, 0xBB, 0x83, 0x4E, 0x4B, 0xE2, 0xCF, 0x7E, 0x98, 0x4B, 0xAD, 0x55,\n    0xF2, 0x1A, 0xEF, 0x15, 0x05, 0xA6, 0xB6, 0xF4, 0xDD, 0x97, 0xAA, 0x81, 0x6D, 0x84, 0x86, 0x17,\n    0xA0, 0xA5, 0x1D, 0xC3, 0x8C, 0xEA, 0x28, 0xCE, 0x69, 0xCC, 0x56, 0x15, 0xFA, 0xD3, 0xEC, 0x12,\n    0xCD, 0x8A, 0x98, 0xD5, 0x13, 0xE9, 0x72, 0xBF, 0x01, 0xCE, 0xBA, 0xF7, 0xCA, 0x85, 0x8C, 0x64,\n    0x55, 0x60, 0xBA, 0x61, 0xF0, 0xDE, 0x97, 0xD9, 0x15, 0xCF, 0xE2, 0x9C, 0xA3, 0x9A, 0x5F, 0x9F,\n    0xFE, 0xD3, 0xC7, 0x5A, 0xF4, 0x44, 0x69, 0x7F, 0x63, 0x41, 0x97, 0x33, 0xD7, 0x41, 0xDF, 0x9B,\n    0x3F, 0x03, 0x23, 0x4A, 0x84, 0x7B, 0x4E, 0xB9, 0x94, 0x3D, 0xBD, 0x32, 0x56, 0x1C, 0x47, 0x7A,\n    0xF0, 0xED, 0x9D, 0x99, 0x24, 0x09, 0xC6, 0x50, 0xC0, 0x98, 0xEA, 0xFE, 0x70, 0x8B, 0xDF, 0xB8,\n    0x5E, 0x7D, 0x64, 0x2C, 0xDC, 0xB5, 0x5F, 0xCA, 0xF6, 0x7B, 0x02, 0x88, 0xA2, 0x82, 0xD2, 0x14,\n    0x0E, 0xA4, 0x14, 0x3B, 0x4A, 0x95, 0x14, 0x5E, 0xD9, 0xFB, 0x47, 0x5F, 0x36, 0x9F, 0x85, 0xC2,\n    0x94, 0x15, 0xB9, 0xC0, 0x01, 0x08, 0x86, 0x75, 0x1E, 0x88, 0x2D, 0x5A, 0x39, 0xC1, 0xDE, 0xC1,\n    0x8B, 0x32, 0xC4, 0xE7, 0x19, 0xA6, 0xFE, 0xFC, 0x62, 0xE9, 0xCF, 0x3E, 0x11, 0xD1, 0x5E, 0x24,\n    0x66, 0x23, 0x5B, 0x8F, 0x42, 0x83, 0xD6, 0x3E, 0x2A, 0xE5, 0xF2, 0xE3, 0x6A, 0x69, 0x40, 0xBE,\n    0xD4, 0xFA, 0x83, 0xC6, 0xE8, 0x2B, 0x35, 0xFE, 0x1A, 0xD1, 0xF3, 0x37, 0x9A, 0x88, 0xA0, 0xC9,\n    0x55, 0x13, 0x4B, 0xC0, 0xEC, 0x45, 0xD7, 0x48, 0x16, 0x28, 0x99, 0xE4, 0x3B, 0x77, 0xF2, 0xB9,\n    0x27, 0x34, 0x4F, 0xAB, 0x18, 0x87, 0x63, 0xE5, 0xF5, 0x68, 0x57, 0x9D, 0x5C, 0xAD, 0x53, 0xD7,\n    0x25, 0xB3, 0x99, 0x5D, 0x70, 0xE0, 0xF6, 0x72, 0xBE, 0xD9, 0x5E, 0x82, 0xFB, 0xD0, 0x72, 0xF5,\n    0x6E, 0x86, 0xEF, 0x7C, 0xD8, 0x23, 0x1E, 0x85, 0x20, 0x7C, 0xEA, 0x2C, 0x8E, 0x09, 0x2A, 0x9B,\n    0x73, 0x62, 0xD3, 0x96, 0xAA, 0xE0, 0x45, 0x1E, 0x63, 0x57, 0xB7, 0x6A, 0xB7, 0xB8, 0xFE, 0x01,\n    0x85, 0x93, 0xEB, 0x7B, 0x25, 0x41, 0xE5, 0x7D, 0xE5, 0x20, 0x50, 0x15, 0x92, 0x06, 0xFE, 0xFA,\n    0x3F, 0x93, 0x16, 0xC5, 0x6F, 0x4A, 0xDF, 0xB3, 0xB9, 0x43, 0x17, 0x32, 0xAF, 0x81, 0x3B, 0x61,\n    0x19, 0xDE, 0xCD, 0xBB, 0x7E, 0x24, 0x74, 0xDD, 0xEB, 0xAE, 0xEA, 0x64, 0x34, 0x59, 0x30, 0x31,\n    0x84, 0x15, 0x77, 0x30, 0x0A, 0xB6, 0x5D, 0xD9, 0x3A, 0x47, 0xD2, 0x9D, 0xA9, 0x57, 0x6F, 0x1D,\n    0x3E, 0x47, 0x82, 0xAD, 0x80, 0x4C, 0x11, 0x64, 0x4A, 0xA5, 0x28, 0xAE, 0xD3, 0x52, 0x13, 0x23,\n    0xEF, 0x74, 0x9D, 0x05, 0xBD, 0xCA, 0x9D, 0xAF, 0x69, 0x55, 0xE8, 0x96, 0xDB, 0x35, 0x52, 0x75,\n    0x0D, 0x7A, 0x19, 0x3E, 0xE9, 0x11, 0xF1, 0x84, 0x5E, 0xB5, 0x1F, 0xD8, 0xF4, 0xA3, 0x25, 0x2A,\n    0x7F, 0xAF, 0x44, 0xD0, 0xAC, 0x7F, 0x9C, 0x87, 0xB1, 0x11, 0x48, 0x69, 0x9F, 0x3C, 0x60, 0xC4,\n    0x38, 0x40, 0xBF, 0x43, 0xA2, 0xE4, 0x37, 0xC3, 0x7E, 0xB1, 0x51, 0x82, 0x93, 0xFE, 0x7F, 0xD1,\n    0x30, 0xD8, 0xBF, 0xD8, 0x6D, 0x7A, 0xE8, 0x38, 0xFA, 0xE5, 0x4B, 0x42, 0x2C, 0x24, 0xF3, 0xA1,\n    0x7D, 0xE3, 0xE7, 0x9A, 0x6B, 0x53, 0x3C, 0xAC, 0x00, 0x6A, 0xB5, 0xF9, 0x10, 0xD5, 0x3D, 0x11,\n    0xE4, 0x1D, 0x51, 0xA2, 0x40, 0xC4, 0x48, 0xDC, 0x1C, 0x30, 0xA8, 0x1F, 0x89, 0xE2, 0x53, 0x25,\n    0xF2, 0xDA, 0xE3, 0xA4, 0xD6, 0xBB, 0x72, 0x5A, 0x0F, 0x3F, 0x98, 0xE4, 0x27, 0xF2, 0xC6, 0x82,\n    0x5B, 0x64, 0x8A, 0x3D, 0x29, 0x9A, 0xBF, 0x6A, 0x0D, 0x61, 0xA1, 0xCF, 0x4F, 0x00, 0xE0, 0xE2,\n    0x9A, 0x45, 0xF7, 0xDB, 0x38, 0x0D, 0x38, 0x7C, 0x98, 0x20, 0xB6, 0xA8, 0x00, 0xFE, 0xB5, 0xCD,\n    0xBB, 0xC2, 0x8A, 0xDF, 0xA3, 0x23, 0x87, 0x77, 0x7F, 0x33, 0x36, 0xB2, 0xC3, 0x90, 0xAA, 0x49,\n    0x92, 0x71, 0xEB, 0xFE, 0xCD, 0x32, 0xD1, 0xAB, 0x22, 0xB3, 0xC6, 0x4B, 0x12, 0x7E, 0x53, 0xAA,\n    0xCF, 0xC7, 0x01, 0xDA, 0x38, 0x2A, 0x0A, 0x54, 0xFC, 0x88, 0x41, 0x15, 0x04, 0x27, 0x02, 0x8C,\n    0x0F, 0x6D, 0xC2, 0xCF, 0xDA, 0xF8, 0x3C, 0xF7, 0x58, 0xE2, 0x70, 0x1A, 0x7E, 0xBE, 0x39, 0xEE,\n    0xC2, 0x7A, 0xD5, 0x52, 0x4B, 0x62, 0x84, 0xDE, 0x91, 0x46, 0xDC, 0x3A, 0x67, 0x4A, 0xE6, 0x4D,\n    0x82, 0xFA, 0x60, 0xE2, 0x34, 0x26, 0x1A, 0xD8, 0x0D, 0xA1, 0x57, 0x62, 0x04, 0x38, 0x52, 0x4D,\n    0xA6, 0x8B, 0xC2, 0x0E, 0xCE, 0x26, 0x28, 0x31, 0x53, 0xC6, 0x63, 0x5A, 0x75, 0x45, 0x65, 0xDA,\n    0x4B, 0x8D, 0x77, 0xB0, 0x06, 0x28, 0x36, 0x43, 0x1D, 0xA3, 0xC7, 0x33, 0x28, 0x8D, 0x70, 0xB5,\n    0x0D, 0x24, 0x25, 0x50, 0xA2, 0xEB, 0x50, 0x61, 0x98, 0x3D, 0x8C, 0xCD, 0xDC, 0x17, 0x3F, 0xE4,\n    0xDD, 0x46, 0x3A, 0xD0, 0xA6, 0x78, 0xD7, 0x85, 0x63, 0xC8, 0x3A, 0x54, 0xDB, 0xD5, 0xB9, 0x7C,\n    0x4B, 0xFD, 0x1E, 0xA2, 0xBD, 0x97, 0x22, 0x09, 0x06, 0x8F, 0xA5, 0x49, 0x06, 0x29, 0x71, 0x13,\n    0x69, 0xCE, 0xEC, 0x75, 0xE9, 0x93, 0x58, 0x80, 0x05, 0xFF, 0xBF, 0x1D, 0x48, 0xCE, 0x34, 0xDC,\n    0x03, 0x40, 0xB9, 0x6F, 0x40, 0x94, 0x2C, 0x30, 0xD0, 0x6F, 0x35, 0xC0, 0x46, 0xE5, 0xD1, 0xFF,\n    0x44, 0x83, 0x2C, 0x6D, 0x6C, 0xB2, 0x04, 0xD8, 0xB0, 0x1E, 0x2C, 0xF8, 0x71, 0xA4, 0xA1, 0x60,\n    0x23, 0x8F, 0x19, 0xF7, 0x58, 0x29, 0x42, 0x9F, 0x24, 0x18, 0x2B, 0xD3, 0xF0, 0x31, 0x45, 0xB1,\n    0xA3, 0x5E, 0xA1, 0xC9, 0x52, 0xEE, 0xE6, 0xF5, 0x0A, 0xBB, 0xEB, 0x6B, 0x09, 0xE9, 0xA7, 0x84,\n    0xB6, 0x1C, 0xE3, 0xA3, 0x0B, 0x7E, 0x8A, 0x0B, 0xD0, 0x4C, 0xE9, 0x50, 0x45, 0x34, 0x21, 0x1B,\n    0x55, 0x0E, 0x12, 0x1A, 0x74, 0xDE, 0x28, 0xEB, 0x20, 0x66, 0x13, 0xBB, 0xEA, 0xC7, 0xDA, 0xCF,\n    0xB4, 0x16, 0x57, 0x65, 0x0A, 0xAD, 0x98, 0xF7, 0x03, 0x1E, 0xF5, 0xD9, 0xFC, 0x3E, 0x59, 0xEC,\n    0x7A, 0x2B, 0x46, 0xC0, 0x13, 0x19, 0xD8, 0xFD, 0xF7, 0x0D, 0x61, 0xFC, 0x41, 0x2A, 0x5C, 0xC7,\n    0x84, 0x95, 0xEF, 0x31, 0x9F, 0x1F, 0x84, 0x53, 0x7E, 0xA8, 0x37, 0x04, 0x1D, 0x1D, 0x08, 0xD5,\n    0xE5, 0x4B, 0x0C, 0x06, 0xCC, 0x14, 0x19, 0xA9, 0x4D, 0x75, 0x06, 0x49, 0x48, 0xC9, 0xDB, 0x3F,\n    0x1B, 0xB1, 0x0D, 0x19, 0x71, 0xEB, 0x13, 0xE1, 0x26, 0xAF, 0xC0, 0xD9, 0x87, 0xC3, 0xD8, 0x68,\n    0x8A, 0x3C, 0x96, 0x6B, 0xDE, 0x94, 0x3D, 0x60, 0x0B, 0x24, 0x8F, 0x0C, 0xE1, 0xA3, 0xA7, 0x05,\n    0x40, 0xB7, 0x24, 0x35, 0x82, 0x45, 0xA0, 0xE0, 0x26, 0xD2, 0xFA, 0xAB, 0x59, 0x33, 0x4E, 0x95,\n    0xD2, 0xFA, 0x72, 0x82, 0x2C, 0x00, 0x2F, 0xE0, 0xE5, 0x49, 0x16, 0x30, 0x0C, 0x3A, 0xC1, 0xDC,\n    0x11, 0x70, 0x59, 0xF9, 0x98, 0x81, 0xBB, 0x9F, 0x60, 0xEB, 0xB0, 0xAD, 0x5B, 0x65, 0x7A, 0xC4,\n    0x3E, 0xE7, 0x6A, 0x3D, 0xD2, 0x7D, 0x02, 0xD3, 0xA8, 0x98, 0xE5, 0xF1, 0xF5, 0xE1, 0xCF, 0xFA,\n    0x71, 0x50, 0xAA, 0x8A, 0xB1, 0x43, 0xDC, 0x3A, 0x0E, 0xC2, 0x77, 0xF3, 0x95, 0x39, 0x82, 0x1D,\n    0x4D, 0x88, 0xFD, 0xA6, 0x55, 0x02, 0x5C, 0x80, 0x1E, 0x84, 0x91, 0x5C, 0x7D, 0x63, 0x36, 0x42,\n    0x68, 0xA8, 0x15, 0x72, 0x40, 0xC0, 0xF5, 0x52, 0xC8, 0x9B, 0xB8, 0xAD, 0x00, 0xCB, 0x4B, 0x0A,\n    0x87, 0x54, 0x96, 0x48, 0x47, 0x7D, 0x39, 0xCA, 0x1D, 0xF0, 0x83, 0x63, 0x9A, 0x7F, 0xE9, 0xB5,\n    0x5A, 0x11, 0x2F, 0x94, 0x30, 0x9F, 0x1D, 0xD6, 0xD5, 0x98, 0xCB, 0x80, 0x7B, 0x82, 0x2B, 0xC0,\n    0xA0, 0x73, 0xBD, 0x17, 0x33, 0xE4, 0x3B, 0xE0, 0xE5, 0x20, 0x59, 0xE6, 0x94, 0xF8, 0xD5, 0x41,\n    0x21, 0x2D, 0xAD, 0xF0, 0x10, 0x08, 0x79, 0x60, 0x2F, 0x7E, 0x26, 0x82, 0xE8, 0xA2, 0x41, 0x79,\n    0xE7, 0xF6, 0x06, 0xC0, 0xB2, 0x59, 0xF9, 0x5B, 0x1B, 0x20, 0x12, 0xA0, 0xF5, 0xD8, 0x0F, 0x1F,\n    0xA6, 0x96, 0x0A, 0x69, 0x3B, 0x2B, 0xD1, 0x95, 0x18, 0x7F, 0xA4, 0x1B, 0x4B, 0xE4, 0x82, 0xDA,\n    0x50, 0x41, 0xA6, 0x30, 0x0D, 0xC0, 0x68, 0xEC, 0xA9, 0x43, 0x2E, 0x17, 0x13, 0x0B, 0x21, 0x00,\n    0x42, 0xF5, 0xCE, 0x2F, 0x10, 0x81, 0x3D, 0x6F, 0xDB, 0xDE, 0x81, 0xD1, 0x10, 0xDE, 0x4E, 0x02,\n    0x98, 0x85, 0x29, 0x81, 0x59, 0xC4, 0x24, 0x82, 0x25, 0xF0, 0x3D, 0x93, 0xB3, 0x08, 0xC9, 0xC5,\n    0x3D, 0xA1, 0x97, 0xAE, 0x2D, 0xE3, 0x93, 0xAC, 0xBB, 0xB2, 0x06, 0xC6, 0x54, 0x58, 0x1C, 0x9A,\n    0x37, 0x6B, 0xDE, 0xEA, 0x63, 0xDE, 0x3F, 0x07, 0x76, 0xFF, 0x8E, 0x41, 0x4D, 0x2E, 0x04, 0x54,\n    0x7D, 0xDF, 0x7F, 0x26, 0x6A, 0xD2, 0x5D, 0xBB, 0x19, 0x5F, 0x2B, 0x09, 0xF4, 0x15, 0x7D, 0x5E,\n    0xB5, 0x48, 0xEE, 0xF1, 0x17, 0xC0, 0x32, 0xE6, 0x14, 0x2C, 0x2D, 0xF3, 0xDD, 0xDA, 0xFD, 0xC5,\n    0x2D, 0x05, 0xB3, 0x7D, 0x69, 0x42, 0xF4, 0x4F, 0xDC, 0xEE, 0x27, 0x6C, 0x10, 0x59, 0xCB, 0x63,\n    0xF6, 0xE9, 0xC2, 0x3B, 0x8A, 0xD0, 0xA8, 0x10, 0x70, 0xF1, 0x35, 0x2B, 0x3D, 0x8E, 0xAE, 0xBD,\n    0xD3, 0xB7, 0xE2, 0x9E, 0x3A, 0xD7, 0xBD, 0xF5, 0x38, 0x32, 0x90, 0x4F, 0xE2, 0x42, 0xB7, 0x73,\n    0xE0, 0xFE, 0x83, 0xEA, 0x25, 0x87, 0xFB, 0xB7, 0xE7, 0x31, 0x66, 0xEB, 0xAA, 0xCC, 0x40, 0x4F,\n    0x35, 0x18, 0x21, 0xFF, 0x31, 0x3C, 0x61, 0x8C, 0xEC, 0xB4, 0x20, 0xD0, 0xFE, 0x1C, 0x81, 0x53,\n    0xB0, 0x6F, 0x76, 0xF7, 0x0F, 0x7F, 0x51, 0x51, 0x40, 0xAE, 0x35, 0x84, 0x84, 0xA9, 0x35, 0x9C,\n    0xC0, 0x3C, 0x0D, 0x7E, 0x73, 0x5B, 0xA7, 0xE6, 0x28, 0x62, 0x6C, 0x53, 0x68, 0x2D, 0x72, 0xA1,\n    0x0F, 0x63, 0xCB, 0x79, 0x79, 0xE5, 0xA5, 0x24, 0xCF, 0x6A, 0x60, 0x6C, 0x0E, 0xF3, 0x52, 0x5B,\n    0xDF, 0xA4, 0x26, 0x7C, 0xC2, 0xF3, 0xD1, 0x20, 0x8A, 0x8C, 0x80, 0x04, 0x77, 0xCE, 0x0C, 0xE0,\n    0xA3, 0x8C, 0xE5, 0xC2, 0xDE, 0x60, 0xC1, 0x35, 0x18, 0xA8, 0x94, 0xCF, 0xEA, 0x81, 0xD8, 0xE9,\n    0x22, 0x93, 0xDB, 0x7A, 0xAA, 0x51, 0xAD, 0xE5, 0x44, 0x6B, 0x31, 0xFF, 0x04, 0xE1, 0xB6, 0xE3,\n    0x55, 0xFA, 0xEF, 0x17, 0xE7, 0x94, 0x37, 0xDF, 0x89, 0xD5, 0x29, 0x07, 0x96, 0xC7, 0x76, 0xE5,\n    0x21, 0xD7, 0xE2, 0xB3, 0xA4, 0x77, 0x6F, 0xE4, 0x1E, 0xAD, 0x03, 0x64, 0xF5, 0x38, 0x33, 0xC5,\n    0x74, 0x2E, 0xA1, 0xF1, 0xBB, 0xAF, 0x1B, 0x24, 0x8B, 0xEE, 0x46, 0x86, 0x25, 0xAD, 0x95, 0x5E,\n    0x28, 0x1F, 0xE9, 0x2C, 0xCD, 0xC9, 0x85, 0xFC, 0x5B, 0x74, 0x3F, 0xF3, 0xF9, 0x2B, 0x5C, 0x23,\n    0x5C, 0xD0, 0xBA, 0xBA, 0x7E, 0x8C, 0xA0, 0xA9, 0x56, 0xA0, 0x55, 0xA5, 0x36, 0x7D, 0xB8, 0x8B,\n    0xA6, 0x46, 0x62, 0x1C, 0x1E, 0x7E, 0x7C, 0xE3, 0xC3, 0xEA, 0x33, 0x8E, 0x28, 0x9A, 0xA8, 0xB6,\n    0x8E, 0xC3, 0xA4, 0x0F, 0x4A, 0x23, 0xFF, 0x6F, 0x3B, 0x2A, 0xBE, 0x65, 0x97, 0x10, 0x30, 0x12,\n    0xC0, 0xA6, 0x3A, 0x34, 0xE3, 0x6C, 0xA8, 0x11, 0xED, 0x78, 0x60, 0xE2, 0xAE, 0xC8, 0x2E, 0xE3,\n    0xEA, 0xB9, 0x3E, 0xAB, 0xBD, 0x15, 0x49, 0x9C, 0x75, 0xD7, 0x49, 0xE3, 0x5C, 0xE9, 0xA2, 0x8A,\n    0x0C, 0xBE, 0x74, 0x81, 0x1D, 0xE0, 0xCA, 0x12, 0x3E, 0x8A, 0x23, 0xF2, 0x7B, 0x5D, 0xF0, 0xF7,\n    0x0E, 0x1B, 0x73, 0xF6, 0x5E, 0x8C, 0xE0, 0x8E, 0x57, 0xD5, 0x01, 0x56, 0x5E, 0x3B, 0x7C, 0xC8,\n    0xF7, 0xE4, 0x61, 0x70, 0x5D, 0x4F, 0xC3, 0x01, 0x26, 0x2A, 0x71, 0x26, 0x50, 0x9B, 0x65, 0xA1,\n    0x49, 0xBE, 0x50, 0x4C, 0x44, 0x3C, 0x5B, 0x09, 0x3B, 0x39, 0x32, 0x34, 0x82, 0x3B, 0xBF, 0x74,\n    0x6B, 0x37, 0x59, 0xF4, 0x13, 0x21, 0x30, 0x86, 0x6D, 0x94, 0xDE, 0x2F, 0x5F, 0x69, 0x07, 0x32,\n    0xFF, 0x14, 0x88, 0x46, 0xA4, 0xB1, 0x9E, 0x69, 0x5A, 0xB7, 0x91, 0x41, 0x2A, 0x62, 0x3C, 0x81,\n    0xE1, 0x4A, 0x47, 0x9D, 0x61, 0xB2, 0x46, 0x2D, 0x04, 0x3F, 0xD9, 0x57, 0xF2, 0xAB, 0xC9, 0x4F,\n    0xB3, 0xCE, 0x11, 0x2A, 0x77, 0x76, 0x49, 0x1B, 0x7E, 0x1D, 0xB7, 0xB3, 0x1D, 0xB7, 0x84, 0x5A,\n    0xC5, 0xCC, 0x1F, 0x9C, 0x82, 0x6D, 0xE0, 0x62, 0x03, 0xEE, 0xA9, 0x9A, 0x05, 0x26, 0x0A, 0xEB,\n    0x0D, 0x55, 0x01, 0x59, 0x71, 0x10, 0xB9, 0x53, 0x20, 0x65, 0x7B, 0x42, 0x90, 0x37, 0x36, 0x5A,\n    0xC2, 0xBA, 0x91, 0x20, 0xE0, 0x89, 0xA9, 0x65, 0x2D, 0x67, 0x83, 0x5D, 0x5A, 0xB9, 0x6B, 0x27,\n    0x13, 0x51, 0xA8, 0x00, 0x9E, 0x98, 0xE9, 0x62, 0xD1, 0x55, 0x7D, 0x37, 0x1E, 0xB5, 0xA3, 0x17,\n    0x9B, 0x45, 0xD8, 0x60, 0x02, 0xAC, 0xFC, 0x2B, 0xA9, 0xAC, 0x66, 0x79, 0xF9, 0x0C, 0xBC, 0xD4,\n    0x50, 0x15, 0x8B, 0x48, 0xB1, 0x6A, 0xB4, 0xED, 0xB7, 0xFE, 0xE8, 0x9E, 0x3B, 0xE3, 0x1C, 0xA5,\n    0x21, 0x15, 0x06, 0x66, 0x2F, 0xBB, 0x05, 0x33, 0xE4, 0x5A, 0x17, 0x5D, 0xF7, 0xB9, 0x2F, 0x3A,\n    0x2B, 0x83, 0xFF, 0xAC, 0xB6, 0x65, 0x92, 0xEF, 0x6E, 0x1C, 0x8A, 0x6C, 0x72, 0x52, 0x32, 0xA6,\n    0x5A, 0x16, 0x75, 0xEE, 0xA9, 0x95, 0x84, 0x33, 0x34, 0x5E, 0x71, 0x66, 0x40, 0xB9, 0xFF, 0x8B,\n    0xD5, 0x50, 0x81, 0xAF, 0x27, 0xC8, 0x58, 0xEE, 0x0D, 0xE7, 0x6D, 0xEB, 0x24, 0xA2, 0x3F, 0xDA,\n    0x1A, 0xD4, 0xBE, 0x3B, 0x02, 0x7B, 0x1C, 0x5A, 0xAF, 0x1D, 0xE3, 0x4B, 0x9F, 0xBC, 0x78, 0x5B,\n    0x0B, 0x91, 0x73, 0x78, 0x64, 0xD9, 0x77, 0xC7, 0x6E, 0x4B, 0x94, 0x5F, 0xE9, 0x8D, 0x8F, 0x49,\n    0xDC, 0x48, 0xEE, 0x58, 0x86, 0x04, 0x63, 0xEB, 0x0D, 0x39, 0x31, 0x81, 0xB4, 0xA8, 0x16, 0xB3,\n    0x7F, 0x60, 0x7F, 0x94, 0xEE, 0x06, 0x53, 0x38, 0x10, 0x0F, 0x93, 0x7F, 0x12, 0x1F, 0x76, 0x28,\n    0xA7, 0x3E, 0x46, 0x10, 0x8C, 0x28, 0x53, 0xCF, 0x9F, 0x83, 0x7F, 0x0C, 0xD8, 0xD6, 0x52, 0xF3,\n    0xE8, 0xD2, 0x21, 0xA6, 0x4A, 0xEE, 0x8B, 0xF7, 0x5B, 0x19, 0x90, 0x6D, 0x35, 0x83, 0xAF, 0x3F,\n    0x49, 0x71, 0xB1, 0x3E, 0xD1, 0x98, 0x60, 0x77, 0x05, 0x36, 0xA5, 0xFF, 0x82, 0x37, 0x14, 0x49,\n    0x62, 0x98, 0xB3, 0x05, 0xF5, 0xAC, 0xE2, 0xCC, 0x47, 0x09, 0x94, 0x8A, 0x59, 0x00, 0x23, 0xF4,\n    0x6D, 0x08, 0xE2, 0xAD, 0x7A, 0xF0, 0xCC, 0x97, 0x68, 0xF7, 0x21, 0x5C, 0x43, 0xD4, 0x1F, 0x16,\n    0x1A, 0xC6, 0x65, 0xFE, 0x96, 0xB4, 0x7C, 0x2C, 0x79, 0x9E, 0xEC, 0xD4, 0x96, 0xAF, 0x0E, 0x35,\n    0x24, 0x06, 0x03, 0x8E, 0x9A, 0x4E, 0xA5, 0xA7, 0xCD, 0x35, 0x32, 0xD2, 0x30, 0x15, 0xAC, 0xED,\n    0xDF, 0xF1, 0x83, 0x39, 0x17, 0xBB, 0x9B, 0x90, 0xED, 0xFB, 0x64, 0xE9, 0x55, 0x09, 0x49, 0x86,\n    0x7A, 0x9A, 0x43, 0x13, 0xB1, 0xD2, 0xC7, 0xC7, 0xC6, 0xA1, 0x99, 0xC8, 0x51, 0x4A, 0x5F, 0x9D,\n    0x6F, 0xA6, 0xCD, 0x97, 0x30, 0xE9, 0x55, 0x0B, 0x6F, 0x0F, 0x4A, 0x43, 0x6E, 0x71, 0xE6, 0xCF,\n    0x3A, 0x7C, 0xC9, 0x78, 0x70, 0xFE, 0xBD, 0x0A, 0x00, 0xEC, 0xA6, 0x7F, 0x83, 0xFA, 0xBE, 0xD4,\n    0xDF, 0xB0, 0x86, 0x41, 0x12, 0x53, 0x1B, 0x4F, 0x7C, 0x1E, 0x60, 0x2A, 0xC1, 0x20, 0x7A, 0x00,\n    0xED, 0x6C, 0x66, 0x23, 0x1F, 0x79, 0xC3, 0x3E, 0x01, 0x74, 0xA7, 0x60, 0x7D, 0x1F, 0x29, 0x93,\n    0x03, 0xF0, 0x64, 0xF6, 0x6F, 0x56, 0x8E, 0x75, 0x57, 0x25, 0x70, 0xDC, 0xD2, 0xD2, 0x28, 0x37,\n    0xA8, 0x05, 0x9B, 0xB0, 0xAD, 0x1A, 0x2D, 0x86, 0xA9, 0x50, 0xB8, 0xE3, 0xF6, 0xA2, 0x3E, 0x17,\n    0x5B, 0x78, 0x65, 0xC0, 0x61, 0x95, 0x0E, 0x27, 0x39, 0x72, 0x6A, 0x9E, 0xCB, 0x8E, 0xAD, 0xEC,\n    0x0C, 0xFC, 0xDB, 0x9A, 0x9A, 0x12, 0x31, 0x16, 0x68, 0x4F, 0x83, 0x79, 0x11, 0x3D, 0x75, 0xED,\n    0x2D, 0xEA, 0x92, 0x8E, 0xDE, 0xAC, 0x07, 0x55, 0xF1, 0xE4, 0x30, 0x6C, 0xFC, 0x5C, 0x88, 0x1F,\n    0x77, 0x94, 0xC8, 0x87, 0x73, 0xB2, 0xB6, 0x9F, 0x2A, 0x05, 0x71, 0xDE, 0x8E, 0xF2, 0xEB, 0x3A,\n    0xDB, 0xBE, 0x46, 0xFA, 0x11, 0xA1, 0xCA, 0x1A, 0xB3, 0x65, 0xAC, 0x42, 0x85, 0xD5, 0x0B, 0x23,\n    0x57, 0xA5, 0x53, 0xE9, 0x58, 0x30, 0xE0, 0xF9, 0x23, 0xF0, 0x75, 0x2A, 0xF5, 0x2B, 0x9A, 0x25,\n    0x96, 0xD7, 0x1E, 0x71, 0x31, 0xC7, 0xA7, 0xB0, 0x6B, 0x3F, 0x26, 0xF8, 0x8D, 0xF9, 0x1E, 0x15,\n    0x83, 0xB8, 0xFF, 0xC6, 0xAA, 0xA6, 0x42, 0xAC, 0x90, 0x82, 0xA2, 0x50, 0x7F, 0x1F, 0xC3, 0x99,\n    0xDC, 0x27, 0xD7, 0xAA, 0x65, 0x13, 0x08, 0xA2, 0x66, 0x51, 0x7D, 0xC7, 0x7E, 0xAE, 0x1A, 0x33,\n    0x2B, 0x72, 0xF3, 0xF4, 0x25, 0xD9, 0xEE, 0xF1, 0x07, 0x0F, 0xC3, 0x87, 0xDF, 0x2B, 0x0C, 0xC8,\n    0x4D, 0x2E, 0xEB, 0xA3, 0x93, 0xB2, 0xBB, 0xAA, 0x61, 0xE1, 0x71, 0x0D, 0x53, 0xE2, 0xF5, 0x7E,\n    0xF7, 0x08, 0x06, 0xAD, 0x3E, 0xE7, 0xA6, 0xB9, 0x3B, 0xC9, 0x68, 0x5D, 0xB8, 0x7D, 0xC1, 0x31,\n    0x9B, 0x70, 0xC2, 0x2B, 0x57, 0x26, 0x54, 0x67, 0x3D, 0x14, 0x26, 0xCF, 0xB0, 0xEC, 0xD6, 0x00,\n    0xE3, 0x3F, 0x26, 0xCA, 0xEF, 0xB8, 0x1A, 0xFD, 0xE4, 0x06, 0xE9, 0x41, 0xF2, 0xAD, 0x2E, 0x16,\n    0x11, 0x0A, 0x98, 0x4B, 0x01, 0x67, 0x76, 0x99, 0xAE, 0x58, 0xF4, 0xAD, 0xC2, 0xC8, 0x56, 0x26,\n    0x50, 0xB2, 0x77, 0x4B, 0x32, 0x71, 0x16, 0x13, 0xC7, 0xAE, 0xE3, 0xDE, 0x1C, 0x6D, 0x54, 0x4C,\n    0x89, 0xA4, 0x81, 0x18, 0x53, 0xC3, 0x01, 0xCD, 0xCF, 0x85, 0xFB, 0x3A, 0x97, 0xD5, 0x25, 0x56,\n    0x39, 0x89, 0xEF, 0x52, 0xBB, 0x02, 0xC8, 0x23, 0xDD, 0x04, 0x36, 0x85, 0xA2, 0x33, 0xE4, 0x4F,\n    0x41, 0xC8, 0xE9, 0x8B, 0xCE, 0xD5, 0xB0, 0xDB, 0xF3, 0xB4, 0xC3, 0x7C, 0x70, 0x29, 0x0F, 0xB6,\n    0x3C, 0xB1, 0xD3, 0x0C, 0xD5, 0x06, 0x56, 0x2E, 0x57, 0xD1, 0x90, 0xAB, 0x5D, 0xE8, 0xE6, 0xD6,\n    0x94, 0x58, 0xE2, 0xA8, 0x92, 0x42, 0xF8, 0xD4, 0xD7, 0x2F, 0x1F, 0x16, 0x92, 0x0C, 0xD5, 0x8E,\n    0x69, 0x98, 0xA9, 0x48, 0xA1, 0x6E, 0x94, 0x8C, 0x66, 0x30, 0xA3, 0x52, 0x50, 0x7A, 0x29, 0x96,\n    0xB0, 0x2B, 0x16, 0x3E, 0x2C, 0x56, 0xA4, 0x9F, 0x85, 0x96, 0x56, 0x25, 0x98, 0x56, 0xAA, 0xFB,\n    0xEE, 0x4A, 0x31, 0xD9, 0xD7, 0xB3, 0x37, 0xE4, 0x1D, 0x49, 0x3D, 0xA7, 0xF7, 0x93, 0x31, 0x6D,\n    0x99, 0x24, 0xE5, 0x30, 0x8F, 0xB4, 0x89, 0x56, 0x1F, 0xB7, 0x09, 0x4F, 0x71, 0xDB, 0x4D, 0x02,\n    0x40, 0x7B, 0xEA, 0x75, 0x38, 0x2C, 0xCD, 0xE2, 0x9F, 0x60, 0xC8, 0x4A, 0x84, 0x2F, 0x9D, 0xFF,\n    0x75, 0xED, 0x32, 0xBA, 0xB7, 0xF4, 0xC8, 0x0E, 0xCF, 0xC5, 0x31, 0x8A, 0xA0, 0xF7, 0xC9, 0x07,\n    0x54, 0x44, 0x90, 0xC1, 0x1C, 0x46, 0x49, 0xEE, 0x33, 0x0E, 0xB4, 0x87, 0x4B, 0x9E, 0x3C, 0xF0,\n    0xAD, 0x0B, 0xA5, 0xA4, 0x28, 0x43, 0xE6, 0x34, 0xD3, 0xD0, 0xF4, 0x88, 0x1E, 0xDE, 0x6E, 0x50,\n    0x81, 0x0E, 0x24, 0xE5, 0x87, 0xA4, 0xAB, 0x67, 0xD1, 0x91, 0xD2, 0xB8, 0x57, 0xA6, 0x86, 0x4A,\n    0x47, 0x45, 0x39, 0x6B, 0x1E, 0x2B, 0xCF, 0xCD, 0xE2, 0x1B, 0xBF, 0x75, 0xC2, 0xD4, 0x5A, 0x68,\n    0x8F, 0xC6, 0xDC, 0x64, 0xBB, 0xBE, 0x71, 0x38, 0x9D, 0x4B, 0xBE, 0x4E, 0xF6, 0x2D, 0xAC, 0x5D,\n    0x23, 0x6B, 0xC3, 0x96, 0x51, 0x4D, 0x10, 0x70, 0x83, 0xCA, 0x69, 0x91, 0x52, 0x3E, 0x46, 0x03,\n    0x93, 0xC3, 0xE0, 0x10, 0xDF, 0x24, 0x7F, 0x9B, 0x86, 0xD6, 0x5B, 0x95, 0xD4, 0xCF, 0xED, 0x14,\n    0xCD, 0x53, 0x82, 0x97, 0x6C, 0x81, 0x9C, 0x3F, 0x6B, 0xFA, 0x9B, 0x44, 0x1B, 0x29, 0xCA, 0x66,\n    0xD9, 0x22, 0xB1, 0xDE, 0xFE, 0x3A, 0xE2, 0x0C, 0xD5, 0x62, 0xDB, 0x00, 0x12, 0x59, 0x74, 0xE6,\n    0x8C, 0x22, 0x7B, 0x11, 0x7F, 0x59, 0xB3, 0x0A, 0x2C, 0x76, 0x5F, 0x71, 0x31, 0xA2, 0xD8, 0x42,\n    0x28, 0xF3, 0x24, 0xC5, 0xF6, 0x85, 0x60, 0x32, 0xC1, 0x91, 0xD7, 0x95, 0x61, 0x70, 0x51, 0x9A,\n    0x4E, 0x62, 0x8A, 0xCF, 0xBD, 0x98, 0x00, 0xA0, 0x12, 0xB5, 0xB6, 0x90, 0xC7, 0x6E, 0xC3, 0x4A,\n    0x8E, 0x2F, 0x50, 0xAD, 0xC0, 0x26, 0x12, 0xF4, 0x68, 0x1D, 0x51, 0x72, 0x14, 0x06, 0xB7, 0x7A,\n    0xCA, 0x37, 0x8F, 0x39, 0x01, 0x76, 0xE5, 0xE4, 0xF1, 0xCA, 0xDA, 0x6A, 0x6B, 0x7C, 0x7D, 0xD9,\n    0xA9, 0x39, 0xBB, 0x50, 0x79, 0x02, 0xD6, 0xA1, 0x12, 0xE7, 0xE6, 0x9A, 0x1B, 0xF4, 0x89, 0x48,\n    0x29, 0x88, 0xA7, 0xC8, 0xE9, 0xEF, 0xB1, 0x28, 0x18, 0x22, 0x4B, 0x6A, 0x96, 0xAF, 0x06, 0x3B,\n    0xE0, 0x8E, 0x9B, 0x2C, 0xC1, 0x7B, 0xD9, 0x87, 0x72, 0xA5, 0xC8, 0xFE, 0x30, 0x9C, 0x24, 0x79,\n    0xAD, 0x04, 0xBB, 0x38, 0xA9, 0xB8, 0x29, 0x01, 0x41, 0xC3, 0x40, 0xD9, 0xE6, 0xE4, 0xD3, 0x97,\n    0xE2, 0x42, 0xBF, 0x79, 0x59, 0x7B, 0xAF, 0x31, 0x0C, 0xF3, 0xD1, 0x72, 0xA4, 0x9D, 0x36, 0xD9,\n    0xDB, 0x0C, 0x0F, 0xCC, 0x3A, 0x8C, 0xAF, 0x71, 0xB7, 0x46, 0x2F, 0x26, 0x7D, 0x1E, 0x25, 0xC9,\n    0x8E, 0xA3, 0x9B, 0xCF, 0x7F, 0xC4, 0x96, 0xB6, 0xC7, 0x05, 0x62, 0x08, 0x49, 0x3C, 0xFC, 0x24,\n    0xAA, 0x16, 0xEB, 0x3C, 0xE6, 0x04, 0x57, 0xD1, 0xA3, 0x81, 0x6E, 0xD4, 0x64, 0xF5, 0xC6, 0x24,\n    0x06, 0x9E, 0xA4, 0x76, 0x3E, 0x62, 0x31, 0x54, 0xC8, 0xC7, 0xAA, 0x31, 0xC6, 0xF0, 0x71, 0x1B,\n    0xE7, 0x08, 0xFF, 0x3A, 0x7A, 0xD3, 0x51, 0x5A, 0xE8, 0xA6, 0xD4, 0xAA, 0x6E, 0x20, 0x37, 0x28,\n    0x0D, 0x0A, 0xCC, 0x25, 0x6C, 0x1E, 0x76, 0x8C, 0xC5, 0xCA, 0xDA, 0x6C, 0x24, 0x17, 0xD4, 0xB0,\n    0x45, 0x3E, 0xD7, 0x25, 0xB8, 0x03, 0xED, 0xA2, 0xDA, 0x82, 0x08, 0x8F, 0x10, 0x3F, 0x13, 0x43,\n    0x07, 0x3F, 0x8C, 0xF9, 0xE5, 0xD5, 0xB0, 0x35, 0x01, 0x13, 0x61, 0x38, 0x97, 0xCA, 0xB4, 0xFE,\n    0x1B, 0x1F, 0x44, 0xEC, 0xFB, 0xAB, 0x07, 0xB6, 0x3F, 0x21, 0x80, 0x6A, 0x8D, 0xBA, 0x8A, 0x1D,\n    0xEA, 0xEF, 0xA0, 0xEB, 0xBC, 0x26, 0x37, 0x4F, 0xA6, 0x16, 0xF8, 0xA2, 0x90, 0x3E, 0xF7, 0x06,\n    0xD8, 0x4C, 0x21, 0x94, 0x2C, 0x5F, 0x49, 0x05, 0x12, 0xF8, 0xA8, 0xA5, 0x14, 0x40, 0xBE, 0x40,\n    0x01, 0xF5, 0x23, 0xE1, 0xEE, 0xF6, 0x5B, 0xC0, 0xE6, 0x76, 0xEF, 0x1D, 0x05, 0xA8, 0x77, 0xF2,\n    0x5D, 0x91, 0xBA, 0x62, 0xB8, 0xDD, 0xF0, 0xFC, 0x5B, 0xA9, 0xB2, 0x25, 0xDD, 0x0E, 0x08, 0xFA,\n    0xE8, 0x5C, 0xCA, 0x43, 0x0D, 0xD0, 0x65, 0x08, 0x23, 0xA7, 0x2A, 0x2C, 0xE6, 0x6F, 0xB6, 0x0A,\n    0xE7, 0xED, 0x86, 0x80, 0x50, 0x94, 0x58, 0x0D, 0x11, 0x57, 0xED, 0xB9, 0xD5, 0x7C, 0x33, 0xCD,\n    0x44, 0x9A, 0x17, 0xFB, 0x74, 0xF3, 0xB1, 0x2D, 0x9F, 0x38, 0x5E, 0x6A, 0x9A, 0xAE, 0x5F, 0x7B,\n    0xAD, 0x4F, 0x9C, 0x8E, 0x1E, 0x3A, 0x75, 0x4F, 0x30, 0xCF, 0xF7, 0x1C, 0x82, 0x34, 0xC6, 0x3E,\n    0xE7, 0x5B, 0x8B, 0x2C, 0xD8, 0xFE, 0xDB, 0x33, 0x27, 0xBB, 0x2E, 0x24, 0xB0, 0xDA, 0x74, 0xD3,\n    0x94, 0x85, 0x78, 0x36, 0x40, 0x2D, 0xEE, 0x40, 0x4A, 0xED, 0x00, 0x4C, 0xDB, 0xF9, 0x49, 0x2F,\n    0xEC, 0x03, 0x99, 0x63, 0xDD, 0x9E, 0xB7, 0xA3, 0x3B, 0xE1, 0xF2, 0x0E, 0x5D, 0x58, 0xD8, 0x33,\n    0xE9, 0xE4, 0x0A, 0xD2, 0x83, 0xA0, 0x3F, 0x80, 0x9A, 0x01, 0xC5, 0x8D, 0xF3, 0x14, 0xC8, 0x0F,\n    0xE4, 0xB8, 0xAD, 0xCD, 0x3E, 0x50, 0x43, 0x17, 0xC1, 0x58, 0x8D, 0x64, 0x03, 0xB1, 0xE5, 0x42,\n    0xC8, 0x34, 0x6A, 0xFB, 0x74, 0x18, 0xA0, 0xD9, 0x3D, 0x01, 0xD7, 0x2F, 0x51, 0x0F, 0xD8, 0x29,\n    0x74, 0xB1, 0xF8, 0x99, 0xCA, 0x74, 0xB2, 0xF1, 0xB6, 0x7B, 0x53, 0x10, 0xCE, 0x73, 0xF6, 0x32,\n    0x3F, 0x05, 0x6E, 0xC7, 0xAD, 0x27, 0x34, 0xD4, 0xB9, 0x1D, 0x34, 0x5D, 0xEC, 0x88, 0x46, 0x22,\n    0x90, 0x94, 0xAF, 0x1A, 0x51, 0x33, 0x10, 0xB7, 0xBF, 0xBE, 0x0A, 0xCD, 0x1E, 0xE8, 0x95, 0x78,\n    0x61, 0x17, 0x63, 0x8F, 0x3A, 0xE2, 0x30, 0x59, 0x3F, 0xBF, 0xD8, 0xA3, 0x85, 0xEF, 0x3D, 0x1D,\n    0xD2, 0x4F, 0x7B, 0xB3, 0xD7, 0x14, 0x91, 0x65, 0xC2, 0x3A, 0x66, 0xBC, 0xFF, 0xFD, 0xC2, 0x12,\n    0x4A, 0xAF, 0xC4, 0xCC, 0x78, 0x1F, 0xA1, 0xAB, 0x54, 0xB7, 0xDB, 0x3B, 0x07, 0x45, 0x09, 0x93,\n    0x45, 0x40, 0x2F, 0xA0, 0x68, 0x73, 0x54, 0x27, 0x96, 0xB4, 0x2E, 0x88, 0xC2, 0xF7, 0x98, 0x9E,\n    0xCA, 0xBF, 0xF4, 0xEC, 0x0A, 0xB6, 0x8F, 0x33, 0x08, 0x5C, 0x91, 0x1B, 0x9F, 0x55, 0xDF, 0xF9,\n    0x04, 0x5D, 0xF0, 0x3A, 0xE1, 0xFF, 0x93, 0x3A, 0xA7, 0xBB, 0x24, 0x75, 0xA3, 0x0D, 0x95, 0x7D,\n    0x66, 0x11, 0x4D, 0x0C, 0xCD, 0x8A, 0x98, 0xA3, 0xC4, 0x38, 0x88, 0x00, 0xD3, 0x7F, 0xA8, 0x7D,\n    0xE6, 0x14, 0xF0, 0xA5, 0xF2, 0x5E, 0xA0, 0xE2, 0xD4, 0x3E, 0xFA, 0x00, 0xD4, 0x5D, 0x01, 0x5D,\n    0x55, 0xF9, 0xA4, 0xC8, 0x49, 0x59, 0x16, 0xFA, 0xC5, 0x51, 0x15, 0xDC, 0xC3, 0x1E, 0xD5, 0xED,\n    0xE4, 0xBB, 0x14, 0xA0, 0xF3, 0x68, 0xD5, 0x60, 0xE0, 0x42, 0xB4, 0x30, 0x82, 0xD8, 0xD6, 0x3E,\n    0xEC, 0xE7, 0xAD, 0x3C, 0x69, 0x61, 0x28, 0x8E, 0x8C, 0x04, 0xF1, 0xA0, 0x1E, 0xBD, 0xDF, 0xBE,\n    0xFD, 0xAE, 0xD9, 0x65, 0x66, 0x33, 0x0F, 0xB0, 0x8D, 0xE9, 0x46, 0xFD, 0xD5, 0xF9, 0x20, 0x18,\n    0x7F, 0xF7, 0x20, 0x3F, 0xE2, 0x7A, 0x38, 0x14, 0xBB, 0x1A, 0xC3, 0xCA, 0xAB, 0x56, 0x5B, 0x17,\n    0x1B, 0x1A, 0xC3, 0x00, 0x97, 0x69, 0x9B, 0x5D, 0xBD, 0x4D, 0x22, 0x77, 0x36, 0x65, 0xD7, 0x04,\n    0x8F, 0x5B, 0x76, 0xB2, 0x6B, 0x23, 0x52, 0xA2, 0x02, 0xC4, 0x98, 0x16, 0xE3, 0xF7, 0x2B, 0xFC,\n    0x36, 0x94, 0x91, 0x0B, 0x0B, 0x82, 0x7F, 0xC6, 0x70, 0x8C, 0x80, 0x36, 0x48, 0x4F, 0x8C, 0x15,\n    0xB9, 0x06, 0x4C, 0x0B, 0x79, 0xA0, 0x37, 0x7D, 0x18, 0xBB, 0x83, 0x8C, 0xA6, 0xF0, 0x02, 0x7D,\n    0xAE, 0xD1, 0x8D, 0xF7, 0x11, 0x14, 0x69, 0x2D, 0xEE, 0x85, 0x47, 0x52, 0x44, 0x95, 0xD8, 0x8B,\n    0x91, 0x04, 0x1A, 0x0D, 0x0A, 0xE9, 0x61, 0x35, 0x14, 0xB7, 0x3D, 0x77, 0xD3, 0x7B, 0x97, 0xE2,\n    0x54, 0x37, 0xCD, 0x77, 0x49, 0x52, 0x2B, 0xF5, 0x0A, 0xA2, 0xCD, 0x9A, 0x51, 0x17, 0x7F, 0xD2,\n    0x9D, 0x65, 0x0F, 0x0F, 0x54, 0xEC, 0x00, 0x71, 0x89, 0x5B, 0xAC, 0x7C, 0x59, 0x55, 0xA3, 0xEA,\n    0x27, 0xF1, 0x47, 0x79, 0xF5, 0xDD, 0x0F, 0xD9, 0x14, 0xDB, 0x00, 0xE1, 0xA2, 0x4D, 0x92, 0xDA,\n    0x0B, 0xEF, 0x41, 0x29, 0x1E, 0xFB, 0x37, 0xAC, 0x08, 0x5D, 0xB7, 0x75, 0x7B, 0x63, 0xC9, 0x47,\n    0x0B, 0x13, 0x66, 0x39, 0xA1, 0x58, 0x82, 0xA3, 0x8D, 0x8B, 0xAF, 0xF9, 0x21, 0x84, 0xE1, 0xBD,\n    0x49, 0xD4, 0xF4, 0x43, 0x7F, 0x9A, 0xCF, 0x59, 0xF2, 0xA5, 0x2C, 0x4D, 0x85, 0xB5, 0xFD, 0x95,\n    0xE8, 0x45, 0xD2, 0xE8, 0x8A, 0xE4, 0xA9, 0x41, 0x6B, 0x99, 0xBE, 0x0D, 0xF1, 0xB2, 0x57, 0x61,\n    0x7B, 0x6D, 0x09, 0x53, 0x26, 0xCC, 0x28, 0x2C, 0x82, 0x08, 0xFB, 0xDC, 0xA9, 0x8A, 0xEC, 0x76,\n    0xE3, 0x4D, 0xDE, 0xAC, 0x3E, 0x54, 0xAC, 0xC7, 0x50, 0x92, 0x8A, 0x19, 0x3A, 0xF3, 0xFA, 0xF0,\n    0xC1, 0x7E, 0xEE, 0x69, 0x0E, 0xB5, 0x35, 0x9D, 0x93, 0x4B, 0xAE, 0xA9, 0x97, 0x09, 0x34, 0x9B,\n    0x8E, 0x3C, 0xB4, 0x2A, 0x1D, 0x59, 0xF9, 0x1C, 0x82, 0x25, 0x14, 0xCB, 0xC4, 0x89, 0xA5, 0xD5,\n    0x62, 0xD9, 0xC4, 0xD5, 0xFF, 0xF5, 0xFF, 0x9A, 0xA8, 0x05, 0x95, 0xE1, 0xAC, 0xAF, 0x61, 0x1B,\n    0x57, 0x77, 0xB0, 0x2C, 0x68, 0xE6, 0x3F, 0x1B, 0x63, 0xFF, 0xC3, 0x33, 0x04, 0x8A, 0x0B, 0x54,\n    0x7D, 0x36, 0xAE, 0xAE, 0x3F, 0xD3, 0xA6, 0x83, 0x65, 0xA4, 0xFE, 0x3C, 0x29, 0xDB, 0x81, 0x99,\n    0xF9, 0x7A, 0x9B, 0xBB, 0xA7, 0x86, 0x6B, 0xDF, 0x67, 0x08, 0x23, 0x88, 0x62, 0xE3, 0x08, 0x5C,\n    0x23, 0x73, 0x0C, 0x01, 0x96, 0xB0, 0x99, 0xC0, 0x8D, 0xD5, 0xDB, 0xCE, 0x4C, 0x1F, 0xE4, 0xFD,\n    0x19, 0x2E, 0xD7, 0x20, 0x81, 0x4E, 0x22, 0x4E, 0xAD, 0x02, 0x86, 0x1C, 0xEF, 0x2C, 0xEC, 0xCF,\n    0xD0, 0x7E, 0xFB, 0x02, 0xE1, 0xE1, 0xFD, 0xE5, 0xB9, 0xBC, 0xE5, 0x12, 0xA3, 0xCA, 0xE8, 0x88,\n    0x45, 0x03, 0x15, 0x0E, 0xA0, 0xC2, 0x1A, 0xB7, 0x13, 0xB3, 0x52, 0x3C, 0x87, 0x18, 0x95, 0x3F,\n    0x56, 0x9C, 0x31, 0x52, 0x2A, 0x5D, 0x57, 0xD3, 0xA1, 0x41, 0x2B, 0x82, 0x11, 0x23, 0xC2, 0x4D,\n    0xE8, 0xE5, 0xC3, 0xBA, 0x59, 0x6B, 0x32, 0xBE, 0x22, 0x37, 0xB8, 0xC9, 0x11, 0x88, 0x5C, 0x7E,\n    0x94, 0x5F, 0xDA, 0xB5, 0xC5, 0xAB, 0xA8, 0xD7, 0x98, 0x2E, 0x4A, 0xBC, 0x5B, 0xD0, 0x7D, 0x3E,\n    0xA3, 0x43, 0xE8, 0xAB, 0x9F, 0xA7, 0x44, 0x02, 0x07, 0xE9, 0x78, 0x50, 0xB4, 0x0A, 0xE9, 0x5D,\n    0xDB, 0x23, 0x1E, 0x1D, 0x0A, 0xCB, 0x95, 0xE2, 0xDB, 0xCC, 0x42, 0x40, 0x52, 0x6C, 0x5C, 0xF6,\n    0xBD, 0x80, 0x51, 0x4C, 0x56, 0x54, 0xB6, 0xC9, 0xB2, 0x9F, 0x70, 0x66, 0xE6, 0x48, 0xD5, 0xC3,\n    0x7D, 0x94, 0x73, 0xAA, 0x50, 0x10, 0x3D, 0x53, 0x04, 0x85, 0xC1, 0x4E, 0x77, 0x3A, 0x90, 0x3B,\n    0xBA, 0x9F, 0x37, 0x80, 0xDA, 0xF2, 0x0B, 0xB1, 0xBC, 0x30, 0x94, 0xC6, 0xB7, 0x39, 0x8D, 0xDD,\n    0x32, 0xA2, 0x71, 0x83, 0x74, 0xE8, 0x1F, 0xB6, 0x92, 0xD5, 0xBE, 0xE6, 0x4B, 0x9F, 0xC5, 0x40,\n    0x5A, 0x23, 0xDB, 0x3C, 0xB0, 0xAF, 0x14, 0x47, 0x9F, 0x66, 0x53, 0x0D, 0x3E, 0x43, 0x5D, 0xF3,\n    0xE6, 0x18, 0x03, 0x47, 0xE3, 0x1A, 0xF5, 0x96, 0x53, 0xCA, 0xFE, 0x1B, 0x07, 0x88, 0xBD, 0x6D,\n    0xE4, 0xF1, 0x86, 0x43, 0xEE, 0x09, 0x6E, 0x3A, 0x81, 0xB7, 0x6B, 0x56, 0x6B, 0x04, 0x25, 0x57,\n    0x79, 0x5E, 0xD3, 0xAB, 0xA1, 0xBB, 0x60, 0xB8, 0x4A, 0xDB, 0x09, 0xFA, 0x3F, 0x1A, 0x3F, 0x05,\n    0x1A, 0xDA, 0xFA, 0x5E, 0xB8, 0x55, 0xDB, 0xDC, 0xD7, 0x0A, 0x10, 0x89, 0xAF, 0x70, 0xA3, 0x70,\n    0xC6, 0xDA, 0xB6, 0x8C, 0x04, 0x27, 0xD8, 0xEF, 0x44, 0x55, 0x8F, 0x07, 0xAF, 0xD5, 0x22, 0xDA,\n    0x3D, 0x67, 0x9C, 0xC8, 0xE8, 0x2D, 0xE1, 0xF7, 0x2D, 0xFE, 0xFE, 0xA9, 0x27, 0x43, 0xAA, 0xB8,\n    0x81, 0x78, 0xBC, 0x7F, 0x77, 0xBC, 0xC8, 0x83, 0x0D, 0xF8, 0x8D, 0x81, 0xD8, 0xD4, 0x1E, 0xB9,\n    0x5C, 0x91, 0x19, 0x41, 0x13, 0xA5, 0x44, 0xC8, 0x60, 0x1F, 0x08, 0xDF, 0x5E, 0xFA, 0xB1, 0xEA,\n    0x46, 0x01, 0x1E, 0xE2, 0x6D, 0x63, 0xF8, 0x7E, 0xD6, 0xBB, 0x17, 0xC9, 0x80, 0x76, 0x40, 0x87,\n    0xCF, 0x1A, 0x69, 0x53, 0x40, 0xA4, 0x44, 0xA1, 0x56, 0xD1, 0x28, 0x5F, 0x60, 0x12, 0x7A, 0xBD,\n    0x02, 0xE3, 0xE1, 0xFF, 0xA4, 0xCB, 0xA0, 0x1E, 0xDC, 0x5C, 0x6C, 0xDB, 0xF7, 0x05, 0x55, 0xC0,\n    0xE5, 0xAB, 0x57, 0xF8, 0xB4, 0xFF, 0x20, 0xD9, 0x3D, 0xEB, 0x02, 0x1C, 0x67, 0x31, 0xC7, 0xB4,\n    0x2D, 0x5C, 0x4A, 0x9F, 0xF1, 0x18, 0x97, 0x27, 0x5B, 0x1A, 0x72, 0xDD, 0x6A, 0x8E, 0x29, 0xBB,\n    0x26, 0xE8, 0x3E, 0xCB, 0xF6, 0x48, 0x19, 0xC1, 0xD2, 0x18, 0x28, 0x92, 0xCA, 0x30, 0xE6, 0x59,\n    0xBB, 0x34, 0xE4, 0x4C, 0x3B, 0xD8, 0x7D, 0x06, 0xA0, 0xD8, 0x85, 0xD6, 0x06, 0x1F, 0xE9, 0x04,\n    0x27, 0x78, 0x8F, 0xCA, 0xFC, 0x56, 0x68, 0xE4, 0xA5, 0x25, 0xE0, 0x4C, 0xA0, 0xBC, 0x36, 0xED,\n    0xBF, 0xAD, 0xC3, 0xA0, 0x2E, 0x83, 0xB3, 0x79, 0x80, 0x4F, 0xC2, 0x80, 0x93, 0xC7, 0xC4, 0x8C,\n    0xFE, 0x64, 0xEC, 0xFE, 0x24, 0xF1, 0x5C, 0xC5, 0x51, 0x51, 0x13, 0xC0, 0x5E, 0x61, 0x61, 0x5D,\n    0x5C, 0xAB, 0x50, 0x72, 0x79, 0x91, 0xA3, 0xB6, 0x17, 0x8D, 0x2F, 0xB5, 0xA7, 0x3B, 0x19, 0x8A,\n    0x5E, 0x14, 0x13, 0xE4, 0xDC, 0x8E, 0x92, 0xE1, 0x51, 0xFF, 0x98, 0xC5, 0xAC, 0xA2, 0x5F, 0xC0,\n    0xA5, 0x46, 0x77, 0x64, 0x9F, 0xD8, 0x82, 0x0D, 0x54, 0x3A, 0xD7, 0x77, 0xC9, 0xBE, 0x0E, 0xF6,\n    0x05, 0xF0, 0x17, 0xF1, 0x1E, 0xBF, 0x00, 0x57, 0xAE, 0xAA, 0xE8, 0xB3, 0xEE, 0xF8, 0x2B, 0x4A,\n    0x02, 0x79, 0xC0, 0x3C, 0xF8, 0x7A, 0x56, 0xA8, 0x69, 0xFF, 0x64, 0x7C, 0x02, 0x76, 0x26, 0x93,\n    0x95, 0x02, 0xD9, 0x1E, 0xA6, 0x6A, 0x69, 0x3C, 0x00, 0x78, 0x8D, 0x71, 0x7C, 0x83, 0xD0, 0x38,\n    0xD7, 0x65, 0x94, 0xBD, 0xD3, 0x7B, 0xF0, 0xC3, 0x26, 0x96, 0x27, 0x23, 0xCA, 0xC0, 0x33, 0x74,\n    0xE1, 0x6D, 0x3E, 0x61, 0xF8, 0xF8, 0x49, 0x0B, 0x79, 0x90, 0x90, 0xCA, 0xD4, 0x5B, 0x7D, 0x9B,\n    0x75, 0xF9, 0x08, 0x36, 0x8B, 0x2E, 0xA5, 0x50, 0xB8, 0x7E, 0x3A, 0xED, 0x09, 0xED, 0x0C, 0x1C,\n    0xB8, 0xDD, 0x5E, 0x13, 0x0A, 0x0B, 0x5C, 0xFB, 0x75, 0x41, 0x98, 0x2B, 0xC9, 0xAB, 0xC9, 0x14,\n    0xDA, 0xFE, 0x34, 0x72, 0xB9, 0x7C, 0x86, 0x89, 0x0E, 0x2E, 0x58, 0xC3, 0xC1, 0xD5, 0x2B, 0x66,\n    0x26, 0xD2, 0xBF, 0xBF, 0x96, 0x33, 0x30, 0xCE, 0x5D, 0x87, 0x02, 0xE2, 0x20, 0x71, 0xEC, 0x24,\n    0xAD, 0x40, 0xFE, 0xEF, 0x52, 0xD1, 0x84, 0x72, 0xCD, 0xCD, 0x3C, 0xDB, 0xA7, 0x94, 0x0F, 0xAD,\n    0x4C, 0x67, 0x3F, 0x13, 0x16, 0x4B, 0x6B, 0x26, 0x92, 0x3F, 0xB2, 0xAE, 0xA4, 0x5F, 0xBB, 0x65,\n    0x0B, 0x13, 0xE2, 0xB9, 0x87, 0xA7, 0xB2, 0x14, 0xC0, 0x2A, 0x66, 0x5B, 0x99, 0x6C, 0xC6, 0x98,\n    0xC2, 0xB6, 0x1B, 0x05, 0x14, 0xD6, 0xC9, 0x5B, 0x33, 0xE1, 0x14, 0x35, 0x82, 0xF9, 0x50, 0xF6,\n    0xFD, 0xA0, 0x15, 0x6D, 0xB1, 0x59, 0x4A, 0x51, 0x9D, 0x81, 0xD4, 0x1C, 0xE2, 0x31, 0xDD, 0xD0,\n    0xFF, 0xC8, 0x9A, 0x7B, 0x9F, 0xED, 0xD4, 0x33, 0xDF, 0xBA, 0x58, 0x9E, 0x36, 0xC1, 0x69, 0xA2,\n    0xE2, 0x93, 0xC7, 0x21, 0x8D, 0x07, 0xFD, 0xA2, 0x37, 0xA9, 0xDC, 0x28, 0x7F, 0x16, 0xA1, 0x0E,\n    0x00, 0x5E, 0x0D, 0x01, 0xCB, 0x36, 0x97, 0xD5, 0xC1, 0xF2, 0x93, 0xC7, 0x8A, 0xAE, 0xA7, 0xE6,\n    0xBE, 0x0B, 0xA8, 0x3E, 0xA2, 0x26, 0xDF, 0x62, 0x13, 0xEF, 0xB8, 0x9A, 0xDA, 0xD4, 0x4D, 0xD0,\n    0x78, 0x02, 0x54, 0x78, 0xEE, 0x5A, 0x6F, 0xAB, 0xD2, 0x6D, 0x94, 0xBC, 0xE9, 0xD3, 0x71, 0x3B,\n    0x59, 0x73, 0xBE, 0x32, 0x7E, 0x7C, 0x69, 0x5C, 0xFC, 0xA3, 0x86, 0x86, 0x59, 0x83, 0x34, 0xD8,\n    0xC9, 0x66, 0x8C, 0xEB, 0x56, 0xE0, 0xD0, 0xC2, 0xD1, 0x08, 0x35, 0xAB, 0x6F, 0x04, 0xAA, 0xB4,\n    0x5C, 0x4D, 0x41, 0x71, 0x0A, 0xB8, 0x3E, 0x8C, 0xAF, 0x73, 0xF0, 0xF7, 0xD2, 0x28, 0x2A, 0x20,\n    0xD6, 0xC6, 0x21, 0x2E, 0xB8, 0xF3, 0xDE, 0x84, 0xFD, 0x1C, 0x10, 0x36, 0x3A, 0x3B, 0x27, 0x97,\n    0x93, 0xBB, 0x0F, 0xBE, 0x4E, 0xD4, 0x44, 0xA1, 0x3F, 0x53, 0x30, 0x68, 0x58, 0xA5, 0xF9, 0x27,\n    0xF5, 0xFF, 0x3F, 0xC1, 0x9D, 0x89, 0x57, 0xE8, 0xF9, 0x3E, 0x66, 0x82, 0x57, 0x7B, 0x00, 0xD6,\n    0x46, 0x6E, 0x42, 0x98, 0x6D, 0xCB, 0x99, 0x71, 0x74, 0xB9, 0x2A, 0x65, 0x54, 0xCE, 0xDD, 0x10,\n    0xD3, 0xBB, 0xA6, 0x4D, 0xCA, 0x3B, 0x4E, 0x4D, 0x5C, 0xF8, 0x80, 0x45, 0xED, 0x0D, 0xBB, 0x1F,\n    0xC8, 0xDD, 0x69, 0x33, 0x13, 0x6D, 0x47, 0x3F, 0x29, 0x51, 0x1C, 0xF9, 0xD9, 0x95, 0x64, 0x29,\n    0x5C, 0xEC, 0x7A, 0x8B, 0x14, 0x07, 0xA0, 0x43, 0x1E, 0x5B, 0x7A, 0x5E, 0xDA, 0x7B, 0xA7, 0xC9,\n    0x7B, 0xDC, 0x72, 0xF5, 0x90, 0xF2, 0x7D, 0xF9, 0x59, 0xE2, 0xE3, 0x74, 0xEE, 0x8B, 0xBC, 0x87,\n    0x15, 0x24, 0x6D, 0x5C, 0x39, 0xA6, 0xE2, 0x1E, 0xA9, 0x4D, 0xB7, 0x39, 0x39, 0x75, 0x50, 0xF9,\n    0x05, 0x88, 0xD2, 0xB5, 0x7C, 0xDB, 0x9A, 0x4D, 0x75, 0x52, 0xAB, 0x45, 0x2F, 0x0B, 0x77, 0x11,\n    0xEF, 0xE6, 0x22, 0x86, 0xA9, 0xB7, 0x14, 0x08, 0xA9, 0xB2, 0x52, 0x54, 0x2F, 0x01, 0x32, 0x89,\n    0x3C, 0xBE, 0xC2, 0xF6, 0x7D, 0x34, 0xBE, 0xD1, 0xDB, 0xE3, 0x74, 0x6F, 0x9B, 0x59, 0xF9, 0x86,\n    0x0F, 0xE1, 0xA8, 0x7F, 0x64, 0x2D, 0xE0, 0x73, 0x9A, 0xCF, 0xB3, 0xF7, 0x7C, 0x7D, 0xE7, 0xF4,\n    0xFB, 0x70, 0xF4, 0xFF, 0x82, 0x13, 0x31, 0x47, 0x66, 0xAC, 0x93, 0x3C, 0x5E, 0x59, 0x1B, 0xEE,\n    0xEE, 0x63, 0x39, 0xF6, 0xED, 0x97, 0xAC, 0x17, 0x63, 0x90, 0xF2, 0x99, 0xCB, 0xC1, 0x8C, 0x37,\n    0x42, 0xE1, 0x58, 0xF1, 0x91, 0xCA, 0x9E, 0x43, 0x01, 0x17, 0xA4, 0xD5, 0xDB, 0x48, 0x26, 0x2B,\n    0xB9, 0x91, 0xE0, 0x42, 0xC0, 0xB2, 0x9C, 0x55, 0xD6, 0x0B, 0xF2, 0xC4, 0x03, 0x3B, 0x8B, 0xD2,\n    0x42, 0xFB, 0xDD, 0xDD, 0xB8, 0x22, 0x01, 0x10, 0xC4, 0xE9, 0xA8, 0x88, 0xA4, 0x98, 0x5A, 0xBF,\n    0x20, 0xEB, 0x6B, 0x0D, 0x6C, 0xB5, 0x2C, 0x82, 0xA8, 0xC5, 0xE4, 0xC2, 0x38, 0x77, 0x5E, 0x43,\n    0x73, 0x75, 0x03, 0x6D, 0xDC, 0xD3, 0xE4, 0x01, 0xFD, 0x5A, 0x25, 0xD7, 0xF2, 0x7F, 0xC7, 0xF7,\n    0x53, 0x94, 0x32, 0x11, 0xA1, 0x70, 0x46, 0x61, 0x33, 0x39, 0x73, 0xFB, 0xB9, 0x93, 0xD1, 0x59,\n    0x92, 0xE8, 0xCB, 0x4A, 0x17, 0xB9, 0xB8, 0x75, 0xA8, 0xCC, 0x14, 0xD9, 0xD6, 0x4D, 0xF7, 0x71,\n    0xB6, 0x3D, 0xDC, 0x56, 0x1E, 0x5D, 0x53, 0x83, 0xEE, 0xEA, 0x5C, 0xCE, 0xA0, 0xDC, 0x73, 0x4D,\n    0xE5, 0x6D, 0x1D, 0x8C, 0x6B, 0xE1, 0xD9, 0x27, 0xAE, 0x70, 0x61, 0xEE, 0x8C, 0x3B, 0x83, 0x6A,\n    0x94, 0x70, 0x28, 0xB1, 0x83, 0x03, 0x6E, 0x0A, 0xE9, 0xA7, 0x15, 0x42, 0x6F, 0x11, 0x95, 0x1D,\n    0x05, 0x63, 0x20, 0xA8, 0xFA, 0x9A, 0x4F, 0x9B, 0xCD, 0xAF, 0xDA, 0xA2, 0x76, 0x12, 0x41, 0xB1,\n    0x38, 0xCC, 0x43, 0xFB, 0x88, 0xB7, 0xB4, 0xAB, 0xC0, 0x60, 0x13, 0xC3, 0x8D, 0x98, 0x67, 0x51,\n    0x35, 0xCE, 0x91, 0x8D, 0xF6, 0x06, 0xA1, 0xE5, 0xB3, 0x36, 0x1C, 0xE2, 0xEA, 0x58, 0x75, 0x7A,\n    0xD1, 0x5A, 0xF2, 0xE6, 0x97, 0x17, 0x82, 0x07, 0x8D, 0xBD, 0x73, 0xF0, 0x2B, 0x23, 0x37, 0xDA,\n    0xF7, 0xE0, 0xCE, 0xF0, 0xFB, 0x52, 0xA5, 0x4E, 0x62, 0xF7, 0xDF, 0xC6, 0x07, 0x56, 0xF0, 0x4B,\n    0x75, 0xD2, 0x05, 0xC2, 0xD8, 0xE2, 0x60, 0xDE, 0x02, 0x21, 0x65, 0x68, 0x38, 0x5E, 0xA4, 0x4A,\n    0x91, 0x51, 0x12, 0x71, 0xA4, 0x32, 0x52, 0xFD, 0x34, 0x5C, 0xC4, 0x0D, 0x38, 0x66, 0x22, 0xC5,\n    0xD5, 0x28, 0xD2, 0xB2, 0x4A, 0x76, 0x9A, 0x04, 0xAD, 0x90, 0x34, 0xCF, 0x44, 0x56, 0xF0, 0x10,\n    0x04, 0x16, 0x25, 0x3C, 0x05, 0x6F, 0x3D, 0xBD, 0xDC, 0x56, 0x15, 0xE8, 0x51, 0xC4, 0xB3, 0x7E,\n    0xB6, 0xBC, 0x00, 0x20, 0xEA, 0x21, 0x9D, 0x9B, 0x8F, 0xBB, 0x76, 0x70, 0x16, 0x45, 0x23, 0xDE,\n    0xC3, 0xA5, 0xB7, 0x18, 0x2E, 0x93, 0x5B, 0x65, 0x53, 0x35, 0xDC, 0xED, 0x55, 0x01, 0x89, 0xA6,\n    0x2A, 0x26, 0xDE, 0x31, 0x68, 0x6D, 0x65, 0xA3, 0x40, 0xB0, 0xC9, 0xC9, 0x83, 0xEF, 0xB5, 0x95,\n    0x98, 0xC5, 0xD6, 0x35, 0xE7, 0x25, 0x79, 0x5E, 0xFE, 0x5F, 0x5F, 0x32, 0x5F, 0xF8, 0x19, 0x41,\n    0xB8, 0x97, 0x73, 0xEE, 0xAC, 0x6A, 0x8F, 0x7C, 0x48, 0xEC, 0x02, 0x48, 0x17, 0x0C, 0x60, 0x87,\n    0x9A, 0x4E, 0xC5, 0xAE, 0x3C, 0xA5, 0xBE, 0x18, 0x34, 0xC6, 0xDF, 0x79, 0x1B, 0x3D, 0x4E, 0xEC,\n    0x98, 0xE5, 0x59, 0x1B, 0xAC, 0xBF, 0xC3, 0x4A, 0xF4, 0x84, 0x97, 0x21, 0xCA, 0xA2, 0xB3, 0xF3,\n    0xE4, 0x2B, 0x78, 0xB9, 0x51, 0x43, 0x2A, 0x1C, 0x47, 0xC1, 0x54, 0x3B, 0x0A, 0x75, 0x16, 0x58,\n    0x6E, 0x7B, 0x73, 0xBF, 0xAD, 0xEA, 0xD6, 0x86, 0xF9, 0x1B, 0x06, 0x5B, 0x1C, 0x34, 0xC0, 0xEE,\n    0x41, 0x05, 0xB1, 0x8D, 0xE6, 0x2B, 0x61, 0xB1, 0x24, 0x17, 0x89, 0xB1, 0x43, 0xCF, 0xAE, 0xC0,\n    0x21, 0x76, 0x23, 0xC7, 0xA5, 0xE7, 0xDE, 0x44, 0x9F, 0x12, 0x8B, 0x6C, 0xBC, 0x19, 0x82, 0xCA,\n    0x23, 0x39, 0x9E, 0xEC, 0x4E, 0xCE, 0x0F, 0x01, 0x51, 0x0D, 0xFE, 0x62, 0x9E, 0x80, 0xF4, 0x69,\n    0xB3, 0x7A, 0xBC, 0x63, 0x96, 0x60, 0xD3, 0xEA, 0xFB, 0xC4, 0xEE, 0x1B, 0x34, 0x86, 0xA0, 0x7C,\n    0x2C, 0xAE, 0x6D, 0x71, 0x30, 0x59, 0x22, 0x2C, 0x24, 0xE3, 0x7B, 0x46, 0x7D, 0x18, 0xE1, 0xBA,\n    0x5D, 0xC0, 0x15, 0x67, 0x0A, 0x04, 0x62, 0xC1, 0x8C, 0x5C, 0xC5, 0x2E, 0x19, 0xB3, 0x8A, 0x41,\n    0xBE, 0x2A, 0x76, 0x22, 0x8C, 0x76, 0xA2, 0x45, 0xDB, 0xB7, 0x7E, 0x1D, 0xB0, 0x76, 0x37, 0x59,\n    0xDC, 0x22, 0x47, 0x7D, 0xAB, 0x34, 0x4D, 0x5F, 0x41, 0xCE, 0x89, 0x5D, 0x84, 0xF1, 0xBE, 0x90,\n    0x25, 0xD3, 0xAC, 0xEE, 0x9F, 0x2A, 0x1E, 0x5C, 0xE2, 0x19, 0x76, 0x6F, 0xA2, 0x5C, 0x28, 0xAC,\n    0x99, 0xBD, 0x59, 0x86, 0x08, 0x36, 0x0C, 0xB8, 0x3E, 0xD1, 0x98, 0x5D, 0x62, 0x94, 0x8F, 0xB1,\n    0xA3, 0xE4, 0xFD, 0x56, 0x09, 0x95, 0xCB, 0xFD, 0x79, 0x7C, 0x6A, 0x78, 0x81, 0x19, 0x3C, 0x34,\n    0x8A, 0x3B, 0x47, 0x10, 0x48, 0xBC, 0x22, 0x3D, 0xEB, 0x6A, 0xE7, 0x2E, 0xB0, 0xE1, 0x42, 0x55,\n    0xE4, 0x2D, 0x98, 0xD1, 0x7B, 0x9C, 0xD2, 0x5E, 0x6F, 0x52, 0x33, 0x1E, 0xBB, 0x62, 0xBA, 0xB8,\n    0xFB, 0x2B, 0x52, 0xE1, 0x3D, 0xA0, 0xB4, 0xDD, 0x05, 0xAC, 0xA6, 0xDC, 0x3A, 0x07, 0x0F, 0xB0,\n    0x78, 0x5E, 0x93, 0xDE, 0xBD, 0x2A, 0x34, 0x92, 0xE0, 0xF0, 0xBC, 0x32, 0xB1, 0xEC, 0xAE, 0xD6,\n    0x10, 0x37, 0x48, 0x89, 0x50, 0x74, 0x24, 0xEF, 0xC2, 0x5A, 0xFA, 0xF1, 0xCA, 0x5D, 0x12, 0xF9,\n    0x00, 0xCE, 0x95, 0xA5, 0x9A, 0xC1, 0x38, 0x42, 0x27, 0xE6, 0xD3, 0xD6, 0xE1, 0x20, 0xDE, 0x6E,\n    0x96, 0x1D, 0x1A, 0x02, 0xC3, 0x0E, 0x10, 0x3E, 0x55, 0x27, 0x78, 0xFA, 0xA1, 0x2B, 0x25, 0x6D,\n    0x30, 0x97, 0xA5, 0xA6, 0xA0, 0x9D, 0xDE, 0x12, 0x2B, 0xDA, 0x82, 0xF9, 0xE9, 0xF5, 0x4F, 0xB9,\n    0x30, 0x44, 0x57, 0x92, 0xC7, 0x64, 0xFE, 0x77, 0xF7, 0x0A, 0x4C, 0xC0, 0x96, 0xDD, 0x79, 0xFD,\n    0xCC, 0xE7, 0xFE, 0x6A, 0x8F, 0x69, 0x34, 0x37, 0xB4, 0x41, 0xAA, 0x72, 0x74, 0xC6, 0xDA, 0xCD,\n    0x7E, 0x72, 0x14, 0x92, 0x2D, 0xA1, 0x77, 0xAD, 0x1C, 0xDF, 0x99, 0x79, 0x6C, 0xEE, 0xDA, 0x0F,\n    0x4C, 0x45, 0x93, 0x52, 0xC9, 0x83, 0x07, 0x57, 0x1A, 0xE2, 0xE0, 0xE6, 0x3F, 0x91, 0x7F, 0x72,\n    0x0E, 0x2F, 0xC9, 0x21, 0x09, 0xB6, 0x66, 0xEA, 0xB2, 0x8D, 0xFB, 0x3E, 0xD2, 0x7C, 0xA4, 0xB5,\n    0xE9, 0xFF, 0x35, 0xFB, 0x1A, 0x92, 0x81, 0xEA, 0x1D, 0x08, 0x01, 0x6F, 0x7E, 0x02, 0x55, 0x5E,\n    0x11, 0x51, 0xD1, 0x37, 0x35, 0xD7, 0x96, 0xAD, 0xAC, 0xE4, 0x73, 0x3B, 0x63, 0x1A, 0x57, 0xCB,\n    0xF8, 0xF7, 0x84, 0xC5, 0x10, 0x84, 0x1F, 0x30, 0x4E, 0x8E, 0xDA, 0xA0, 0xBE, 0xD1, 0x38, 0xC5,\n    0x7B, 0x08, 0x3C, 0x9D, 0xA3, 0x09, 0x9F, 0x64, 0xE4, 0x12, 0xBA, 0x54, 0x45, 0x2D, 0x32, 0x2A,\n    0x14, 0xCC, 0x75, 0xF5, 0xE0, 0xEB, 0x05, 0x87, 0x9B, 0xE4, 0x83, 0x52, 0x67, 0xC4, 0xB7, 0x9E,\n    0x97, 0x38, 0xC7, 0x35, 0x7F, 0xF6, 0x34, 0x08, 0x3F, 0x12, 0x65, 0x88, 0x57, 0x8E, 0x60, 0x76,\n    0xCB, 0x00, 0x4D, 0xF4, 0x88, 0x12, 0xF6, 0x3C, 0x2E, 0xA1, 0x8F, 0xD8, 0xA8, 0x29, 0x3B, 0xB0,\n    0xE9, 0x5C, 0x32, 0x36, 0x9C, 0xAF, 0x90, 0x9F, 0x72, 0xA2, 0x96, 0x65, 0x17, 0x61, 0x06, 0x63,\n    0x2B, 0x9E, 0x57, 0xA6, 0xA7, 0x1E, 0xB7, 0xD9, 0xEB, 0xC2, 0x2A, 0x64, 0xA3, 0x0B, 0x2A, 0x9A,\n    0x9B, 0x87, 0x13, 0x25, 0x2C, 0x7C, 0xED, 0x8F, 0x21, 0x04, 0x13, 0x4A, 0xF1, 0xB9, 0xD2, 0x0D,\n    0xAF, 0x95, 0x85, 0x77, 0x0C, 0x94, 0x77, 0xAF, 0x03, 0xA6, 0xA7, 0x3B, 0x06, 0xDF, 0x61, 0x08,\n    0x36, 0x01, 0x49, 0x6D, 0x7F, 0x34, 0x4F, 0x56, 0x17, 0x50, 0xB5, 0xB4, 0xE7, 0xE7, 0xAE, 0xF5,\n    0x61, 0xB5, 0xEB, 0xFD, 0x40, 0x15, 0x37, 0x9C, 0xF0, 0xA0, 0x47, 0x89, 0x45, 0x2B, 0x16, 0x49,\n    0x98, 0xD0, 0xF7, 0x7F, 0x7A, 0xBC, 0x60, 0xA1, 0xBD, 0x7A, 0xB1, 0x75, 0xBD, 0x55, 0xD6, 0x2D,\n    0x19, 0x5A, 0x51, 0x09, 0xA6, 0xA5, 0x19, 0x98, 0xC2, 0xA3, 0xA0, 0x40, 0x4F, 0x1A, 0x23, 0x04,\n    0x55, 0x46, 0xA7, 0x1E, 0xE8, 0x33, 0xE1, 0x90, 0x13, 0x74, 0x74, 0x15, 0xA1, 0xCE, 0x47, 0x9C,\n    0x62, 0x7D, 0x46, 0x3E, 0xE6, 0x2A, 0x51, 0xC4, 0x12, 0xB3, 0x6B, 0x4A, 0x1A, 0xBD, 0xE1, 0x10,\n    0x8D, 0x64, 0x8A, 0xA8, 0x1D, 0x5F, 0x2E, 0x2F, 0x2F, 0x34, 0xD3, 0xEF, 0x48, 0x1C, 0x5E, 0xAE,\n    0xA1, 0x53, 0xDB, 0xD5, 0x56, 0x8D, 0xD2, 0x10, 0xDB, 0x1B, 0x6A, 0x64, 0x86, 0x44, 0x27, 0xC5,\n    0xD0, 0xE0, 0xD0, 0x94, 0x6F, 0xDC, 0x5A, 0x0D, 0x60, 0x93, 0xFA, 0x54, 0x65, 0xE0, 0xA8, 0x14,\n    0xDB, 0xDF, 0x9F, 0x7B, 0xBB, 0xFA, 0xF7, 0xD5, 0x49, 0x7E, 0xB1, 0x38, 0x2F, 0x49, 0x02, 0xF6,\n    0x15, 0xB7, 0x6F, 0x25, 0xFA, 0xDB, 0xE4, 0x1A, 0xB9, 0xCF, 0x5F, 0xA1, 0x6C, 0x7D, 0x71, 0xED,\n    0xCC, 0xAB, 0x76, 0x4E, 0xE2, 0xC8, 0x44, 0x1A, 0xF9, 0xAA, 0x63, 0x51, 0xA0, 0x47, 0xE9, 0x62,\n    0xAD, 0x48, 0x25, 0x15, 0xBD, 0x6B, 0xA8, 0xF2, 0x69, 0x10, 0x0A, 0xA9, 0x56, 0xCA, 0xCA, 0xF4,\n    0xCD, 0x7D, 0x55, 0x09, 0xDB, 0x3C, 0x34, 0x9B, 0xED, 0x3A, 0x3A, 0xF9, 0xA4, 0xB2, 0xF4, 0xCE,\n    0xD5, 0x46, 0x77, 0x34, 0xA3, 0x96, 0xA8, 0x0E, 0xA1, 0xB5, 0xD3, 0x69, 0x68, 0xF5, 0xB3, 0x17,\n    0x99, 0x30, 0xBE, 0x03, 0xB0, 0x89, 0x1D, 0x75, 0xA4, 0xF7, 0x79, 0xF6, 0x7D, 0xA0, 0x24, 0xCD,\n    0xE0, 0x0A, 0x92, 0x4D, 0xE4, 0xF7, 0x28, 0xE7, 0x52, 0x0C, 0x28, 0x62, 0xBA, 0x24, 0xD6, 0xA4,\n    0x02, 0xFF, 0xD1, 0x6B, 0xDE, 0x0C, 0xB9, 0xA1, 0xBC, 0xBD, 0x2C, 0x7D, 0xF6, 0xFF, 0x2C, 0x8D,\n    0x83, 0x08, 0x62, 0xC5, 0x6B, 0x9F, 0x11, 0xA2, 0x7D, 0xB7, 0x90, 0x38, 0x08, 0xB9, 0xDC, 0x46,\n    0xA3, 0xD1, 0xD1, 0xE5, 0x36, 0xC3, 0xEE, 0x5F, 0x82, 0x63, 0x4E, 0x66, 0x30, 0x38, 0xC8, 0x40,\n    0x2E, 0xB8, 0x82, 0xAE, 0x95, 0xCF, 0x45, 0x1A, 0xF9, 0x2A, 0x85, 0x9C, 0x66, 0x96, 0x7D, 0x69,\n    0xC5, 0xE7, 0x13, 0xD6, 0x86, 0x39, 0x14, 0xE3, 0x1B, 0xBF, 0x78, 0x5B, 0xFB, 0x6A, 0x88, 0x1A,\n    0xCA, 0x21, 0x6C, 0xE3, 0x80, 0xCE, 0x61, 0x3F, 0x13, 0x7A, 0xFD, 0x16, 0x4F, 0x32, 0xE0, 0xB8,\n    0x76, 0x6D, 0x1D, 0x46, 0xB9, 0xF4, 0xA1, 0x05, 0x53, 0x5E, 0x96, 0x42, 0xF3, 0xF5, 0xA6, 0xAF,\n    0x87, 0x78, 0xCF, 0x3D, 0x84, 0xB1, 0xFC, 0x97, 0x1F, 0x86, 0x79, 0x1E, 0xCE, 0xEF, 0x21, 0x13,\n    0x5F, 0xD3, 0x23, 0xD3, 0x52, 0xE7, 0x31, 0x37, 0x40, 0x08, 0xB7, 0x6C, 0x50, 0xCA, 0x82, 0xB5,\n    0x47, 0x04, 0x98, 0x5F, 0x28, 0xAA, 0x39, 0x76, 0xFA, 0x18, 0xAD, 0x08, 0x57, 0x9F, 0xFE, 0x7B,\n    0x6F, 0x2B, 0x46, 0x83, 0x6C, 0xDE, 0x90, 0xCB, 0x41, 0x40, 0x22, 0x24, 0x4B, 0x82, 0x23, 0x72,\n    0xC0, 0x28, 0x79, 0xAC, 0xE8, 0xF5, 0x96, 0xC2, 0xC1, 0x76, 0x6C, 0x5B, 0xBA, 0xFB, 0x60, 0x12,\n    0xA1, 0xF1, 0x59, 0xE9, 0x70, 0x97, 0x5C, 0xD3, 0x6D, 0x3C, 0xC2, 0x18, 0xA4, 0x30, 0x37, 0xF0,\n    0xAC, 0x92, 0xB3, 0xC3, 0x1F, 0xAA, 0x73, 0x03, 0x0A, 0x9F, 0x01, 0x5F, 0x4C, 0x68, 0x3A, 0xA5,\n    0xB0, 0xB9, 0xBB, 0x87, 0xA4, 0x76, 0x9B, 0x36, 0xD0, 0x35, 0x68, 0x26, 0xEE, 0x76, 0x82, 0xDA,\n    0x81, 0x16, 0xFB, 0x82, 0xD2, 0x9D, 0xCD, 0x4F, 0x3A, 0xAD, 0xA3, 0xC2, 0xBD, 0x9E, 0x60, 0x39,\n    0x30, 0x1B, 0x9D, 0x4F, 0xAD, 0x0C, 0x88, 0x54, 0x57, 0x64, 0xFD, 0xBB, 0x63, 0x37, 0x7A, 0xB0,\n    0x7E, 0x4C, 0x69, 0x4C, 0x6D, 0x78, 0x84, 0x69, 0x59, 0xF2, 0xAF, 0xFD, 0x76, 0x67, 0x0D, 0x1A,\n    0x40, 0xB4, 0x4A, 0xE7, 0xDB, 0x9D, 0xD7, 0xD8, 0x66, 0xC7, 0x8D, 0xAD, 0x4C, 0xE2, 0x9D, 0x1A,\n    0x63, 0xA2, 0x56, 0xD9, 0x40, 0x6D, 0x7B, 0xE0, 0x0F, 0x78, 0xAA, 0x88, 0xA7, 0xA8, 0x62, 0xE3,\n    0x7E, 0xE9, 0x8C, 0x65, 0xB5, 0x56, 0x2A, 0x1E, 0x5C, 0xDF, 0xC4, 0x3C, 0xC3, 0x5D, 0x46, 0x00,\n    0xF1, 0x8A, 0x0B, 0x7C, 0x58, 0x94, 0xA4, 0x5B, 0xAA, 0x3A, 0x72, 0x0D, 0xE9, 0x59, 0x99, 0x87,\n    0x06, 0xE8, 0xC9, 0x4F, 0xC5, 0x54, 0x10, 0x00, 0xAE, 0x45, 0xCF, 0xE7, 0x81, 0xE5, 0xC4, 0x85,\n    0x70, 0xD6, 0xD9, 0x60, 0x9D, 0x19, 0x5F, 0xC9, 0xBE, 0x3D, 0xB7, 0x24, 0xB4, 0x7B, 0x08, 0xFB,\n    0xA4, 0x9E, 0x36, 0x26, 0xA0, 0xF2, 0x86, 0xE9, 0x67, 0x10, 0xF6, 0x8E, 0xE9, 0xEB, 0xA3, 0xB3,\n    0x75, 0x83, 0x38, 0xA7, 0x45, 0x81, 0xF0, 0xF3, 0x62, 0x18, 0x02, 0xF1, 0x95, 0x8C, 0xEA, 0x39,\n    0xD2, 0xB7, 0x11, 0xC0, 0x06, 0x11, 0x07, 0x42, 0x54, 0xE5, 0x2B, 0xC8, 0xD5, 0x8C, 0x08, 0x25,\n    0xE1, 0xD0, 0x8D, 0x7E, 0x61, 0x28, 0x79, 0x6A, 0x2B, 0x33, 0xD9, 0xE9, 0x6B, 0x04, 0x95, 0x1E,\n    0xE0, 0xA1, 0xA4, 0x32, 0x71, 0x0E, 0xCD, 0xCB, 0x80, 0xB8, 0x38, 0x79, 0xF0, 0x9E, 0x58, 0x5E,\n    0xF6, 0x35, 0xCC, 0xC5, 0xB9, 0xC7, 0x73, 0xCF, 0x13, 0xEA, 0x77, 0x18, 0xD4, 0x37, 0x46, 0x1B,\n    0x66, 0xED, 0x68, 0xEA, 0x1B, 0x38, 0xCF, 0xAD, 0x64, 0x28, 0x1C, 0x04, 0x81, 0x52, 0x03, 0x8F,\n    0xC7, 0x45, 0xAE, 0x52, 0xD4, 0x23, 0x27, 0xDB, 0x2C, 0x98, 0xE8, 0x74, 0xE6, 0xA7, 0x1E, 0x6E,\n    0x31, 0x10, 0xF5, 0xBB, 0x1A, 0xA0, 0x5F, 0x6C, 0xAE, 0x38, 0xD7, 0xC6, 0xA2, 0x77, 0x6A, 0x47,\n    0x92, 0xC5, 0xC3, 0xE3, 0x12, 0xCE, 0x9A, 0xCB, 0x1F, 0x75, 0xED, 0x1C, 0x16, 0x30, 0xB8, 0xCC,\n    0x4E, 0xB1, 0xA5, 0xCE, 0x85, 0xD3, 0x2E, 0xC1, 0x13, 0x3D, 0x32, 0xBE, 0xBB, 0x22, 0x77, 0x9B,\n    0x13, 0x10, 0x2C, 0x53, 0x96, 0x24, 0x02, 0xA1, 0x6B, 0xB1, 0xEF, 0xC8, 0xE9, 0xF0, 0x2A, 0x87,\n    0xEF, 0xE3, 0xBF, 0xD8, 0xB3, 0x16, 0xC2, 0x6C, 0xFE, 0xC2, 0xAC, 0x91, 0x28, 0x4F, 0x31, 0xA8,\n    0xAF, 0x51, 0x1C, 0xB7, 0x37, 0xA7, 0x6E, 0x77, 0x37, 0x78, 0x2B, 0x74, 0x78, 0xEF, 0x09, 0x9B,\n    0x55, 0x30, 0x4E, 0x23, 0xFE, 0xCE, 0x62, 0xCE, 0x92, 0x38, 0x49, 0x6F, 0x5D, 0xDD, 0xCD, 0x09,\n    0x9E, 0xEB, 0xC5, 0xCC, 0x9B, 0xC2, 0xE4, 0xBF, 0x12, 0x47, 0xFA, 0xA5, 0xB6, 0x89, 0x09, 0x25,\n    0xDA, 0x33, 0x3A, 0xFD, 0x77, 0xB2, 0x7A, 0xB3, 0x77, 0xC1, 0x88, 0x88, 0x8E, 0xC5, 0x81, 0xA6,\n    0x5E, 0x69, 0xE1, 0xA4, 0xB0, 0x4A, 0x99, 0x59, 0xA0, 0xC7, 0x11, 0x9E, 0xBC, 0x63, 0x62, 0x43,\n    0xC0, 0x2C, 0x33, 0x63, 0x6B, 0x51, 0xCE, 0xDC, 0x15, 0x8C, 0x59, 0x46, 0x6D, 0x91, 0x98, 0x1B,\n    0x59, 0xA5, 0x48, 0xF1, 0x04, 0x8E, 0x06, 0xA6, 0x5D, 0x30, 0xB6, 0xAF, 0xBF, 0x84, 0x78, 0x06,\n    0x8B, 0x79, 0x69, 0xB5, 0x19, 0x5A, 0x85, 0xD6, 0xF4, 0x6B, 0xD4, 0x0D, 0x80, 0xDB, 0xCF, 0xC6,\n    0xCA, 0xE1, 0x48, 0x3C, 0x97, 0x19, 0x5E, 0x4B, 0xE6, 0x5C, 0x6D, 0xAF, 0xA0, 0xBE, 0xF6, 0x50,\n    0x4C, 0xE2, 0x58, 0xDD, 0xE7, 0xCD, 0x28, 0x70, 0x54, 0x3B, 0x50, 0x97, 0x20, 0xB1, 0x19, 0xF2,\n    0x09, 0x0B, 0xBB, 0xCF, 0x35, 0xDA, 0x36, 0xAB, 0x12, 0xBA, 0xAF, 0xFF, 0xF4, 0x6C, 0x87, 0xA7,\n    0xB9, 0x7C, 0x02, 0xB7, 0xC7, 0x16, 0x7E, 0x3E, 0xF1, 0x33, 0x9E, 0x60, 0x9C, 0x3F, 0xCC, 0xAC,\n    0x01, 0x4C, 0x13, 0xF0, 0x43, 0xBF, 0x21, 0x60, 0xE9, 0xBA, 0x34, 0x2B, 0x08, 0xD2, 0xFE, 0x0F,\n    0x73, 0x52, 0xAE, 0xA2, 0x54, 0x51, 0x90, 0xD2, 0x9E, 0xE9, 0x62, 0xAC, 0x37, 0x39, 0x2A, 0xAD,\n    0x0A, 0x1C, 0xFE, 0x09, 0x30, 0xDD, 0x9C, 0x2F, 0x52, 0xFD, 0x8F, 0x41, 0xF9, 0xCE, 0xAE, 0xB8,\n    0x66, 0xB6, 0x44, 0x1A, 0x82, 0x53, 0x33, 0x48, 0xA6, 0x8D, 0xEF, 0xE8, 0x80, 0xC3, 0x0E, 0xD7,\n    0x80, 0xC6, 0x13, 0x1F, 0x4C, 0x99, 0x43, 0x56, 0x45, 0x35, 0x54, 0x33, 0x68, 0x1F, 0xEF, 0x7F,\n    0xB2, 0xB1, 0xF5, 0x7E, 0x7E, 0x08, 0xDE, 0xD2, 0x5B, 0x52, 0x89, 0x20, 0xDF, 0xD9, 0x5A, 0x64,\n    0x71, 0x37, 0x79, 0x98, 0x69, 0x10, 0xF6, 0xA2, 0x5F, 0xBE, 0x71, 0x35, 0xE0, 0x88, 0x74, 0x7A,\n    0xB5, 0x81, 0x2E, 0x4E, 0x71, 0x7F, 0x5A, 0x3A, 0x8A, 0xCE, 0xBE, 0xC5, 0x40, 0x8F, 0xC5, 0x2E,\n    0xA5, 0x9A, 0x4D, 0x74, 0xE4, 0x73, 0xC7, 0x96, 0x97, 0x84, 0x7E, 0x90, 0x44, 0x83, 0x24, 0xEE,\n    0x83, 0x42, 0xA3, 0xCC, 0x1C, 0x7A, 0x4D, 0x27, 0x0B, 0x80, 0xD0, 0xA4, 0xAC, 0x9B, 0x1E, 0xCB,\n    0xFC, 0x7F, 0x12, 0x31, 0x41, 0x3D, 0x06, 0x4A, 0xBC, 0xF6, 0x22, 0xF1, 0xC8, 0xF0, 0x9C, 0x1A,\n    0x8D, 0x96, 0x5A, 0xA7, 0xB4, 0x6B, 0x45, 0xBC, 0x4D, 0x32, 0xC1, 0x9C, 0xC6, 0xA0, 0xCE, 0xED,\n    0x7B, 0x97, 0x59, 0x7F, 0x42, 0x32, 0x22, 0xA3, 0x18, 0xFD, 0x65, 0xBC, 0x2C, 0xC3, 0xEA, 0xE8,\n    0xBD, 0xC1, 0xFF, 0xE1, 0x20, 0xAB, 0xC0, 0x6A, 0xDA, 0xF9, 0x3A, 0x85, 0x79, 0x7A, 0x10, 0xB9,\n    0xA0, 0x7A, 0xAA, 0xAD, 0xF1, 0x8D, 0x67, 0x8F, 0x59, 0xE0, 0x10, 0x4A, 0x62, 0xA7, 0xD1, 0x8D,\n    0xF9, 0x26, 0xBE, 0x00, 0x42, 0x81, 0xA0, 0x1F, 0xFF, 0xCE, 0xAE, 0xAF, 0x1C, 0x56, 0x92, 0x48,\n    0x65, 0xE7, 0x2A, 0xC6, 0xE2, 0x78, 0xDE, 0xA2, 0x87, 0x5C, 0x89, 0x3E, 0x38, 0xC4, 0x30, 0xB4,\n    0x07, 0x75, 0x7A, 0x01, 0x76, 0xCD, 0x95, 0xD2, 0xA1, 0x4C, 0x37, 0xB5, 0xA5, 0x2B, 0xE5, 0x09,\n    0x8B, 0x45, 0x5C, 0x77, 0x9F, 0xE8, 0xAB, 0xB9, 0xD6, 0xB0, 0x91, 0x57, 0xA6, 0x9E, 0x5D, 0x01,\n    0xB5, 0xE2, 0xE5, 0x11, 0xC5, 0x77, 0xC1, 0x11, 0x54, 0x97, 0x45, 0x4F, 0x8E, 0x75, 0xB4, 0xA3,\n    0xD7, 0xF4, 0x0F, 0xCC, 0x69, 0xAA, 0xB2, 0xAC, 0xB4, 0x92, 0xD4, 0x66, 0xB8, 0xA1, 0x91, 0xA2,\n    0x74, 0xEF, 0xBE, 0x1D, 0xDF, 0xBD, 0xF9, 0x26, 0x34, 0x1D, 0x71, 0x7C, 0x54, 0x14, 0x42, 0x40,\n    0x94, 0x4B, 0xA2, 0xF2, 0x1C, 0xD6, 0x86, 0x32, 0x22, 0x64, 0xE4, 0x13, 0x8D, 0x6A, 0xA2, 0x1C,\n    0xB0, 0x3F, 0x78, 0xA9, 0x56, 0x61, 0xFB, 0x56, 0xEE, 0x3D, 0x26, 0x2A, 0x1C, 0x7E, 0x4D, 0x22,\n    0xD4, 0xFA, 0xA6, 0xBA, 0x7E, 0x2D, 0x9B, 0x6C, 0xF7, 0x64, 0x20, 0xCA, 0xD6, 0x89, 0x49, 0x92,\n    0xFF, 0x2A, 0xBB, 0xA8, 0x8A, 0xE5, 0x90, 0xEA, 0x20, 0x07, 0xFF, 0xE7, 0xF5, 0xD6, 0x96, 0x77,\n    0xE2, 0xEB, 0xC4, 0xD2, 0x51, 0x19, 0x74, 0x83, 0xE2, 0xA3, 0xC2, 0x77, 0xF9, 0x2E, 0x73, 0x95,\n    0x86, 0x76, 0x82, 0x6F, 0xB6, 0x4A, 0x0B, 0x6A, 0x95, 0xCA, 0xDD, 0x7F, 0x66, 0x17, 0x09, 0xE1,\n    0xD9, 0xD1, 0xA0, 0xE7, 0x25, 0x64, 0xCB, 0xB6, 0x9A, 0x0F, 0x33, 0x0F, 0xFB, 0xB3, 0x52, 0x78,\n    0x00, 0x4E, 0xFB, 0xFF, 0xC9, 0x55, 0x2A, 0x66, 0x8B, 0xC7, 0x9B, 0x4B, 0x94, 0xFB, 0x5E, 0x77,\n    0x54, 0x08, 0x94, 0xC3, 0x7C, 0xFB, 0x63, 0xF0, 0x7C, 0x7C, 0xD5, 0xC4, 0xE2, 0xAE, 0x9F, 0x8E,\n    0x7F, 0xA2, 0x43, 0x10, 0x6E, 0x1C, 0x9C, 0xC7, 0x62, 0x1E, 0x58, 0x87, 0xFE, 0x80, 0x0F, 0x53,\n    0x40, 0x1E, 0xC9, 0xA5, 0xE1, 0xCD, 0xFC, 0x65, 0x75, 0x5B, 0xC8, 0x4B, 0x18, 0x0C, 0x71, 0x70,\n    0xF6, 0x0E, 0x70, 0xE6, 0x9C, 0xE0, 0xF3, 0xFE, 0x2A, 0xA2, 0x58, 0x23, 0x80, 0x85, 0xAD, 0xA0,\n    0x65, 0xA2, 0x62, 0xB6, 0xB5, 0x0A, 0x78, 0x3E, 0xF9, 0x46, 0x85, 0x22, 0xA5, 0xBD, 0x63, 0xB3,\n    0x56, 0x75, 0x99, 0xD6, 0x87, 0xFB, 0x6A, 0xB6, 0xB1, 0x02, 0x3B, 0xB1, 0x10, 0x32, 0x19, 0x71,\n    0x32, 0xD4, 0x12, 0xFB, 0x49, 0xBC, 0x51, 0x09, 0xC7, 0x2F, 0xFF, 0xB8, 0xA2, 0xE3, 0x1D, 0xCA,\n    0x74, 0xC1, 0x41, 0xC3, 0xEF, 0x3F, 0xDC, 0x4D, 0x40, 0xEA, 0xF7, 0xBB, 0x05, 0x91, 0x11, 0x78,\n    0x99, 0xB4, 0xA4, 0xD9, 0x39, 0x17, 0x87, 0xDF, 0x25, 0xDB, 0xE0, 0x73, 0xA6, 0xE9, 0x3D, 0x27,\n    0x44, 0xCD, 0x4F, 0xB1, 0x8E, 0x1A, 0x90, 0x94, 0x07, 0xC9, 0x3E, 0x93, 0x46, 0xDB, 0x05, 0x06,\n    0xF8, 0x64, 0x5D, 0x78, 0xBF, 0x7D, 0x73, 0x59, 0x69, 0x5C, 0x6C, 0x1A, 0xE1, 0x86, 0x9E, 0x69,\n    0x3C, 0x3B, 0x51, 0x09, 0xE6, 0x43, 0xD3, 0x2B, 0xA8, 0x47, 0x37, 0xAE, 0x9C, 0xBA, 0x6C, 0x3C,\n    0x2C, 0x46, 0x60, 0x24, 0x69, 0xE8, 0xCE, 0xF5, 0x40, 0xCA, 0x72, 0x7E, 0x2E, 0xAA, 0x6F, 0x60,\n    0x7E, 0x79, 0x53, 0xFC, 0x09, 0x30, 0x3E, 0x2D, 0x60, 0x21, 0xBA, 0x68, 0x54, 0x49, 0x91, 0x76,\n    0x53, 0x60, 0x23, 0xE5, 0xC8, 0x9B, 0xA4, 0x4C, 0x64, 0xD5, 0x02, 0x46, 0x95, 0xD9, 0x72, 0x3C,\n    0x30, 0xE8, 0xF1, 0x53, 0x53, 0xC7, 0x8E, 0x90, 0xF4, 0x34, 0xF3, 0x0C, 0x3F, 0x72, 0xCA, 0x1D,\n    0x75, 0x72, 0xBE, 0x46, 0x8A, 0xC0, 0xD3, 0x06, 0x93, 0x72, 0xB0, 0xBF, 0xD0, 0x77, 0x99, 0x06,\n    0x7B, 0xDF, 0x6F, 0x10, 0xFB, 0xC6, 0x1D, 0x55, 0x66, 0x2F, 0x81, 0x83, 0x72, 0x3F, 0x30, 0x60,\n    0xFA, 0x34, 0xE9, 0xCF, 0xB3, 0x0F, 0x95, 0xBD, 0xE4, 0x9F, 0xDF, 0x53, 0x6E, 0x00, 0xC9, 0x07,\n    0x7E, 0x9B, 0x79, 0xBD, 0xD2, 0xE2, 0x77, 0x80, 0xB4, 0xF3, 0x9A, 0x46, 0x20, 0x8C, 0x21, 0x0A,\n    0xEA, 0xFE, 0x07, 0x61, 0x58, 0xB8, 0x38, 0x47, 0xF5, 0x75, 0x5B, 0x33, 0x78, 0x9E, 0x66, 0xDF,\n    0x30, 0xAD, 0xD8, 0xED, 0x5D, 0x73, 0x75, 0x6D, 0x4E, 0x63, 0x8B, 0x35, 0x4F, 0xCA, 0x75, 0x58,\n    0xDB, 0xEA, 0x2A, 0xE2, 0xB1, 0xE1, 0x15, 0x6C, 0x69, 0x46, 0xC8, 0xD9, 0x67, 0x15, 0x4B, 0xCE,\n    0xB4, 0x04, 0x9B, 0x9D, 0xCA, 0xB7, 0x5E, 0x4B, 0xA3, 0x6C, 0xD1, 0xFF, 0x4A, 0x71, 0x71, 0x9C,\n    0x11, 0x87, 0x5E, 0x9E, 0x5D, 0xA9, 0x05, 0x1F, 0xD8, 0x96, 0xA9, 0x3F, 0xFA, 0xEB, 0x0A, 0x91,\n    0x44, 0xDD, 0xCF, 0x93, 0xD5, 0x0A, 0x80, 0x9C, 0xA8, 0xCB, 0x2A, 0x7F, 0x03, 0x45, 0x43, 0xA7,\n    0xC3, 0x59, 0xFF, 0xFC, 0xFF, 0x44, 0x24, 0xB1, 0x02, 0xBB, 0x42, 0xCF, 0x45, 0xC9, 0xF4, 0xAE,\n    0x23, 0x5D, 0xB2, 0x0B, 0xDE, 0xAD, 0x7E, 0xD6, 0x1C, 0x75, 0xFE, 0x90, 0xCF, 0x49, 0xB1, 0x51,\n    0x36, 0x3A, 0x48, 0xD2, 0xCE, 0xAA, 0x40, 0x2D, 0xE9, 0x70, 0x85, 0xCC, 0x66, 0xB5, 0x2A, 0x85,\n    0xA2, 0x1E, 0x18, 0x18, 0xA7, 0x6A, 0x89, 0x39, 0x1E, 0x56, 0x7E, 0xA7, 0xC7, 0x9F, 0x9B, 0xFA,\n    0x58, 0x4A, 0x08, 0x0E, 0x78, 0x81, 0x84, 0xB3, 0x66, 0xA4, 0x8B, 0x20, 0xF2, 0xB0, 0x48, 0xA4,\n    0xE4, 0xA1, 0xC2, 0x05, 0xB7, 0x19, 0xFE, 0x71, 0xEF, 0xCB, 0x30, 0x8C, 0xC2, 0x3B, 0xE4, 0x78,\n    0x1C, 0x92, 0x51, 0x96, 0xC1, 0x89, 0xA3, 0x71, 0x9A, 0x6D, 0xF5, 0x35, 0xA6, 0xEE, 0x71, 0xE2,\n    0x12, 0x55, 0x88, 0x61, 0x10, 0x50, 0x47, 0x53, 0x3D, 0xBA, 0x0F, 0x6A, 0xE9, 0x5C, 0x8B, 0x0F,\n    0x8B, 0xAC, 0xCD, 0x20, 0xAE, 0x5B, 0x9A, 0x80, 0xB4, 0x9C, 0x27, 0x5D, 0x47, 0xD6, 0x03, 0xFE,\n    0x68, 0x38, 0xBC, 0x34, 0x1B, 0xFD, 0x62, 0xCF, 0x9A, 0xC0, 0xC9, 0x7C, 0xAB, 0xF5, 0x85, 0x1D,\n    0x81, 0x41, 0x6D, 0xB3, 0x62, 0x72, 0x4A, 0x6F, 0xDD, 0xA8, 0xB4, 0xAE, 0xEA, 0xE0, 0xED, 0x57,\n    0x82, 0x0A, 0x7E, 0xD1, 0x3B, 0x7E, 0xA5, 0x43, 0x9E, 0x5F, 0x73, 0x92, 0xEF, 0xAA, 0xC5, 0xAB,\n    0xA9, 0x07, 0xD5, 0xB5, 0x32, 0x9E, 0xD3, 0x66, 0xA3, 0x98, 0xDC, 0xF5, 0x12, 0xB6, 0x89, 0xE0,\n    0x58, 0xE3, 0x26, 0x62, 0xDC, 0xA2, 0xB9, 0x58, 0x7C, 0x42, 0xA7, 0xFB, 0x9E, 0x12, 0xD9, 0x50,\n    0x55, 0xFD, 0x64, 0xC7, 0xFC, 0xA1, 0x12, 0x98, 0x43, 0xEE, 0x62, 0xBC, 0x75, 0x3B, 0x5D, 0xE1,\n    0xFF, 0xAF, 0x29, 0x4D, 0x81, 0x6A, 0xB2, 0x13, 0x2D, 0xE9, 0x9C, 0x65, 0x90, 0x1A, 0xBE, 0x06,\n    0x69, 0x9D, 0xC7, 0xF5, 0x98, 0xEB, 0xA4, 0x13, 0x67, 0xDD, 0xA4, 0x7E, 0x23, 0x56, 0x92, 0x31,\n    0x62, 0xA3, 0xDD, 0x7B, 0xB9, 0x1C, 0xD1, 0x0E, 0xEF, 0x1A, 0xB5, 0x94, 0xF4, 0x10, 0xD4, 0x21,\n    0x76, 0x14, 0xC1, 0x2D, 0x5C, 0x2F, 0x71, 0x86, 0x94, 0x84, 0x41, 0x6A, 0x1F, 0xA2, 0x75, 0xFF,\n    0x34, 0x0B, 0xCA, 0xD4, 0x11, 0x7F, 0xB7, 0xD0, 0xAB, 0x7E, 0xB9, 0x13, 0x26, 0x1B, 0x60, 0x48,\n    0x62, 0x2A, 0xF7, 0x18, 0x24, 0xDF, 0x51, 0x6B, 0x34, 0x61, 0x99, 0x27, 0x03, 0x95, 0x6C, 0xAA,\n    0x81, 0xFA, 0x94, 0xAB, 0x9E, 0x34, 0xA5, 0xC5, 0x8C, 0xA6, 0x6A, 0x43, 0x2D, 0x5F, 0x99, 0xE5,\n    0x00, 0xE5, 0x51, 0x71, 0x19, 0xA6, 0xF5, 0x36, 0x1E, 0x21, 0xF2, 0x26, 0xE4, 0x7A, 0x18, 0x76,\n    0x10, 0xE9, 0xE0, 0x9E, 0x54, 0x2D, 0xFA, 0x83, 0x9F, 0x41, 0x7C, 0x0E, 0xA7, 0xC9, 0xDD, 0x58,\n    0x73, 0x18, 0xCB, 0x26, 0x60, 0xE8, 0x90, 0xC1, 0x4D, 0x0B, 0x01, 0x01, 0xD8, 0x57, 0xED, 0x78,\n    0xF9, 0x28, 0x0D, 0xA7, 0x1F, 0x66, 0x99, 0x0A, 0x17, 0x8C, 0xA7, 0xC1, 0xD2, 0x51, 0x4C, 0x2E,\n    0x7C, 0x3F, 0xE0, 0x2F, 0x66, 0x6D, 0x68, 0x2B, 0xE0, 0x17, 0x2F, 0x21, 0xE5, 0x4A, 0xD9, 0x46,\n    0x39, 0xA4, 0xD5, 0x2E, 0xF7, 0x6F, 0xAD, 0xA9, 0x13, 0xAE, 0x97, 0xF3, 0xFC, 0xCE, 0xDA, 0x4C,\n    0x35, 0xF1, 0x19, 0xCC, 0x27, 0xA4, 0x5C, 0xF9, 0xDD, 0x19, 0x84, 0xF2, 0x35, 0xDD, 0x3D, 0x7A,\n    0xD0, 0x9F, 0xA5, 0x81, 0xFB, 0x66, 0x6E, 0x71, 0x83, 0x88, 0x47, 0xA5, 0xF7, 0xE8, 0x19, 0x5B,\n    0x93, 0xE0, 0x1A, 0xE4, 0xED, 0x56, 0xC5, 0xCC, 0x8D, 0xCB, 0x50, 0x41, 0x0B, 0xEA, 0x2D, 0x2F,\n    0xBA, 0x8A, 0xA3, 0x64, 0x46, 0x5F, 0x27, 0x22, 0x17, 0xD9, 0xCC, 0xD6, 0xAD, 0x32, 0xE6, 0x19,\n    0x35, 0xD2, 0x3C, 0x54, 0xB5, 0x14, 0xC8, 0x3C, 0x65, 0x9F, 0xA4, 0x2A, 0x44, 0xBA, 0xF3, 0xE5,\n    0xBA, 0x10, 0x3B, 0xD6, 0x67, 0xFB, 0x94, 0x99, 0x9A, 0xD7, 0x37, 0x96, 0xC6, 0x6B, 0xD7, 0xBA,\n    0x58, 0x82, 0xED, 0x49, 0xD8, 0x6A, 0x58, 0xDB, 0x04, 0x78, 0x62, 0x8D, 0x30, 0xCA, 0xA0, 0xB8,\n    0xDE, 0xCD, 0x06, 0x7D, 0xF3, 0xE8, 0xF8, 0x54, 0xD7, 0xD4, 0x8D, 0xFB, 0xD0, 0xB9, 0x08, 0xE3,\n    0xCE, 0x81, 0x7C, 0xCF, 0x71, 0x41, 0x03, 0x1B, 0x9A, 0xED, 0x5C, 0x71, 0xB5, 0x7B, 0x56, 0xDC,\n    0x0B, 0x1F, 0xF1, 0xAF, 0x55, 0xE2, 0x37, 0x44, 0x42, 0x69, 0x27, 0xDB, 0xCE, 0x5E, 0xC1, 0x8A,\n    0x20, 0x30, 0xBD, 0x7F, 0x71, 0x2C, 0x1A, 0x26, 0x7C, 0xF8, 0xEF, 0x72, 0x6B, 0x87, 0xB7, 0x13,\n    0x9B, 0x39, 0xBC, 0xBD, 0x67, 0xEC, 0x54, 0xA9, 0xB0, 0x5C, 0x11, 0xC3, 0x60, 0xA7, 0x2F, 0x6D,\n    0xBC, 0xEB, 0x99, 0x82, 0x47, 0xEE, 0xD4, 0xEE, 0x85, 0xA5, 0xF6, 0xEB, 0x59, 0xA1, 0xC0, 0x0E,\n    0xC1, 0x1C, 0x1B, 0x9F, 0xC7, 0xAD, 0xF1, 0x1C, 0x35, 0x77, 0x06, 0x42, 0xD7, 0xB2, 0x98, 0x0D,\n    0x86, 0xF1, 0x71, 0x93, 0xED, 0x29, 0x10, 0xC1, 0x64, 0xA1, 0x0D, 0x5F, 0x21, 0x8E, 0x9B, 0x7B,\n    0x16, 0xF8, 0xAA, 0x6E, 0x39, 0x38, 0x71, 0xB0, 0xDA, 0x6F, 0xF7, 0x74, 0xBD, 0xAB, 0xF2, 0x4C,\n    0xB2, 0x9E, 0x1E, 0x1D, 0xB0, 0x75, 0x97, 0xD3, 0x22, 0x03, 0x3D, 0xB9, 0x24, 0x16, 0x16, 0x88,\n    0x95, 0x17, 0x9D, 0x67, 0x19, 0xC1, 0x6F, 0x40, 0xC2, 0x61, 0x52, 0xC8, 0x27, 0x39, 0x75, 0xE5,\n    0x93, 0xD5, 0x71, 0x89, 0x3E, 0x79, 0x08, 0x49, 0x4B, 0x02, 0xD9, 0x8D, 0xD8, 0x5B, 0x19, 0x35,\n    0x34, 0x5F, 0x32, 0x68, 0x0A, 0xBA, 0xEA, 0x9C, 0xB3, 0x21, 0x25, 0x29, 0x3F, 0xA5, 0x11, 0xF8,\n    0x78, 0xA9, 0x6E, 0xED, 0x7E, 0x20, 0xC3, 0xA5, 0xC7, 0x56, 0xCE, 0x29, 0x4E, 0xC0, 0xA5, 0x04,\n    0x73, 0x2A, 0xE3, 0x22, 0xF8, 0x30, 0xE5, 0x1D, 0x0C, 0x76, 0x00, 0xF6, 0x8F, 0xEC, 0x70, 0x65,\n    0x18, 0x64, 0xCD, 0x20, 0x37, 0x35, 0x43, 0xA2, 0xF0, 0x67, 0x2D, 0xDE, 0x49, 0xE3, 0x7A, 0x66,\n    0x5A, 0x01, 0x87, 0x31, 0xD8, 0x77, 0x85, 0x39, 0x6D, 0xBC, 0x5A, 0xF3, 0x8B, 0x5C, 0x7C, 0x8F,\n    0xD8, 0x6A, 0x98, 0xE6, 0x8C, 0x80, 0x3A, 0x44, 0x9B, 0x44, 0xFC, 0xA1, 0x13, 0xF9, 0xA6, 0x26,\n    0x1D, 0xC2, 0xF8, 0x49, 0x98, 0x97, 0x49, 0xEF, 0x28, 0x55, 0x0A, 0x0B, 0x0B, 0x3E, 0x12, 0x20,\n    0x3E, 0x25, 0x57, 0xC0, 0xB4, 0xB1, 0xD8, 0x87, 0x33, 0xB7, 0xB4, 0xD8, 0x99, 0x86, 0x85, 0xB1,\n    0xCD, 0xB0, 0x36, 0xC1, 0xFD, 0x1D, 0x6E, 0x5E, 0x6C, 0x65, 0x28, 0x34, 0x13, 0x2C, 0x65, 0x91,\n    0x98, 0x46, 0xCF, 0x26, 0x66, 0x06, 0x35, 0x10, 0xE4, 0x82, 0x89, 0x2E, 0xE2, 0x62, 0x6C, 0xAA,\n    0x2B, 0x97, 0xAC, 0x23, 0x67, 0x50, 0xE1, 0x88, 0xE2, 0xC2, 0x02, 0xCC, 0x8C, 0x93, 0xAC, 0x46,\n    0xB1, 0x0D, 0x4B, 0x63, 0x53, 0xC6, 0x75, 0x17, 0xA7, 0x68, 0x98, 0xA5, 0x8D, 0x44, 0x48, 0x9D,\n    0x7C, 0xEB, 0x78, 0x05, 0x93, 0x30, 0x6E, 0x17, 0xDF, 0x1C, 0x35, 0xED, 0x6A, 0x7A, 0x52, 0x31,\n    0x27, 0x2F, 0x82, 0xDD, 0x8D, 0x46, 0x18, 0xCE, 0xFF, 0x13, 0xF6, 0x62, 0x3E, 0xB1, 0xBC, 0xE5,\n    0xF7, 0x8E, 0xA2, 0x04, 0x22, 0x3D, 0xFC, 0xA7, 0x0D, 0xCE, 0x94, 0x2C, 0x48, 0xA2, 0x78, 0x7F,\n    0x22, 0xBF, 0x08, 0x69, 0xDE, 0x89, 0x5F, 0x56, 0xE4, 0x88, 0xDB, 0xA1, 0x07, 0xD6, 0x6E, 0xCE,\n    0x50, 0xF0, 0xEE, 0x31, 0x52, 0x69, 0xD3, 0x85, 0x22, 0x96, 0x91, 0xA4, 0x71, 0xA5, 0xB8, 0x7C,\n    0x0A, 0x8D, 0x59, 0x1F, 0x48, 0x2A, 0xFA, 0xDC, 0x94, 0x6E, 0x31, 0x92, 0x80, 0x4A, 0x05, 0xE4,\n    0x00, 0x02, 0x19, 0x23, 0xDD, 0xA6, 0x10, 0x03, 0x6B, 0x3D, 0xC2, 0xAE, 0x3C, 0x84, 0x44, 0x84,\n    0x9B, 0xC9, 0x7F, 0x6D, 0xA1, 0xBE, 0xE8, 0xE9, 0x8E, 0x43, 0x17, 0x18, 0x85, 0x14, 0x6C, 0x3E,\n    0xB2, 0xB8, 0x83, 0xFF, 0xA8, 0xE0, 0xF3, 0x9C, 0xA4, 0x74, 0xA2, 0x7D, 0x82, 0x58, 0xAB, 0x0B,\n    0xD2, 0xC8, 0x07, 0x29, 0x8D, 0x66, 0xCD, 0x86, 0xFC, 0xF0, 0x71, 0x7A, 0x6A, 0xF4, 0xC4, 0xD7,\n    0xEA, 0x34, 0xB8, 0xF7, 0xCC, 0xF7, 0x8F, 0x27, 0xB1, 0xA7, 0x3D, 0x33, 0xFE, 0x2F, 0xA1, 0x80,\n    0x59, 0xE9, 0x0A, 0xF5, 0x3B, 0xEB, 0x84, 0x65, 0x36, 0xCC, 0x16, 0x49, 0xD8, 0xCE, 0x64, 0x22,\n    0x12, 0xDA, 0x04, 0x20, 0x16, 0x85, 0x82, 0xC3, 0x5D, 0x17, 0xE2, 0x01, 0xFB, 0xB9, 0x83, 0x52,\n    0x52, 0x50, 0x3B, 0x70, 0x07, 0x87, 0xD5, 0x2E, 0xC1, 0x09, 0x06, 0x3B, 0xCD, 0x5A, 0xF8, 0x93,\n    0xA0, 0xD6, 0x67, 0x72, 0xD3, 0x0A, 0x24, 0xB8, 0x4D, 0x98, 0xE9, 0xB4, 0x3F, 0xDA, 0xB5, 0xA4,\n    0x32, 0x7D, 0x8B, 0x27, 0xF3, 0xA0, 0x81, 0x73, 0x18, 0x2A, 0xE0, 0x5B, 0x09, 0x5F, 0x0D, 0xE6,\n    0xE9, 0x30, 0x7F, 0x00, 0x33, 0xE5, 0xE3, 0x2B, 0x05, 0x5D, 0x29, 0x9B, 0xA2, 0x90, 0xEE, 0x09,\n    0x04, 0x62, 0x07, 0x34, 0x8D, 0x95, 0x00, 0x17, 0x56, 0x88, 0x05, 0xD2, 0x8E, 0x3F, 0x49, 0x74,\n    0xD7, 0x59, 0x69, 0x93, 0xE2, 0x8C, 0xA1, 0xC9, 0x0D, 0xE7, 0x3B, 0x51, 0xB8, 0xE4, 0xA8, 0x77,\n    0x58, 0x7A, 0xC2, 0xC7, 0x56, 0x01, 0x0C, 0x0D, 0x5C, 0x1F, 0x00, 0x4D, 0x36, 0x74, 0x2A, 0xA1,\n    0xD8, 0x00, 0xC2, 0xAC, 0x61, 0xAC, 0xAC, 0xC8, 0xA4, 0x0F, 0xE5, 0x8C, 0xCF, 0x9C, 0x2F, 0x93,\n    0x1A, 0x4A, 0xD9, 0x96, 0x87, 0x31, 0x42, 0x5C, 0x59, 0x16, 0x89, 0xC4, 0xD5, 0x80, 0x0F, 0xD1,\n    0x2E, 0x43, 0x4E, 0x8A, 0xEE, 0x55, 0x49, 0x32, 0x14, 0x31, 0xD4, 0x5E, 0x58, 0x4E, 0xE9, 0x9A,\n    0xE3, 0xC2, 0x7C, 0x0E, 0x62, 0xFF, 0xD4, 0x93, 0xFA, 0xF3, 0x16, 0x7D, 0x35, 0xF8, 0x7A, 0x1D,\n    0x2E, 0x4C, 0x14, 0xEC, 0xE8, 0xFB, 0x2A, 0x77, 0x1D, 0x78, 0xCB, 0xE0, 0xC8, 0x50, 0xEB, 0x90,\n    0x87, 0xEE, 0xA4, 0xFC, 0xB4, 0x1B, 0x10, 0x11, 0x45, 0x95, 0x26, 0x4F, 0xCD, 0xDC, 0x3E, 0x16,\n    0x53, 0xBB, 0x84, 0x5C, 0x97, 0x5D, 0x72, 0xBB, 0x96, 0xD1, 0x72, 0x08, 0x0E, 0xAB, 0xA2, 0x40,\n    0x61, 0x84, 0x4F, 0x09, 0x1A, 0x53, 0xD8, 0x32, 0xEB, 0x48, 0xEC, 0x72, 0x6E, 0x5D, 0x59, 0x48,\n    0x69, 0x57, 0xD4, 0x0F, 0xA9, 0xA0, 0x19, 0x4F, 0x3C, 0xBB, 0x5C, 0x97, 0xF4, 0xF1, 0x48, 0x10,\n    0x4D, 0xC1, 0x74, 0xCB, 0x61, 0x4F, 0xDE, 0x8E, 0x04, 0x28, 0xF2, 0xFC, 0x43, 0xDD, 0x7D, 0x1A,\n    0x30, 0xA5, 0xED, 0xF8, 0x01, 0x70, 0x73, 0xAE, 0x5F, 0x40, 0xA6, 0x83, 0xF0, 0x59, 0xE2, 0xFB,\n    0xE3, 0x43, 0xA2, 0x54, 0x7A, 0x9E, 0xE2, 0xED, 0xF1, 0xD4, 0x82, 0x14, 0xB3, 0x89, 0x5A, 0xAE,\n    0xAB, 0x83, 0x37, 0x73, 0x14, 0xE0, 0x48, 0x37, 0x38, 0xA2, 0x2B, 0x6D, 0x26, 0x9A, 0xD7, 0x40,\n    0x6E, 0x29, 0xB4, 0x1A, 0xD4, 0x82, 0x07, 0x16, 0xC0, 0x0C, 0xAE, 0x4A, 0xA5, 0xB3, 0x08, 0xBD,\n    0x3C, 0x78, 0xC9, 0x67, 0x3E, 0x3D, 0x85, 0x38, 0xC4, 0x49, 0x03, 0x1C, 0xE6, 0x92, 0x77, 0x5D,\n    0xD3, 0xEC, 0x54, 0x7D, 0x18, 0x1F, 0x05, 0xF3, 0xBB, 0x7D, 0xD2, 0xBC, 0xB8, 0x4D, 0xD0, 0x6E,\n    0xD5, 0x0A, 0x52, 0x4F, 0x7A, 0x29, 0x4A, 0x2C, 0xDC, 0x61, 0x5D, 0x44, 0xEA, 0xD7, 0x89, 0x4D,\n    0x89, 0xB0, 0x0D, 0x44, 0xC9, 0x4E, 0xCF, 0xD9, 0xE2, 0xFA, 0xC8, 0xA3, 0xB8, 0x2A, 0x2D, 0x3D,\n    0x26, 0x63, 0x0D, 0xB5, 0x28, 0x2A, 0xA0, 0x2D, 0x2F, 0xC5, 0x7B, 0xE8, 0xC4, 0x59, 0x7C, 0xEA,\n    0xFC, 0x2E, 0x3F, 0xE1, 0x73, 0xF1, 0x38, 0xA6, 0xC0, 0x3E, 0x78, 0x69, 0xF6, 0x77, 0x64, 0x16,\n    0x52, 0x3A, 0x0D, 0x1F, 0x33, 0x3E, 0xE6, 0x68, 0x9B, 0x32, 0x5E, 0xD6, 0x04, 0xB1, 0x86, 0x0D,\n    0x61, 0x44, 0xB9, 0xF4, 0x2F, 0xFC, 0x53, 0x78, 0xFA, 0xB9, 0x2E, 0x37, 0x42, 0x41, 0xC1, 0x2E,\n    0x3D, 0xBF, 0xA9, 0x2C, 0x6D, 0x49, 0x44, 0x0D, 0x7D, 0x0C, 0xD1, 0x91, 0xFF, 0xE7, 0x02, 0x6C,\n    0x20, 0xB8, 0xE3, 0xF5, 0xD7, 0x3F, 0x6A, 0x5A, 0xFB, 0xA9, 0x24, 0x38, 0x06, 0x15, 0x22, 0xAE,\n    0xFA, 0x4C, 0xCD, 0x94, 0xDC, 0x1C, 0x3D, 0x74, 0x15, 0x88, 0x3E, 0xD3, 0x40, 0x8D, 0x5E, 0xA1,\n    0xD5, 0x4B, 0x25, 0x5F, 0xE6, 0x06, 0x91, 0x69, 0x1A, 0xB9, 0x70, 0x79, 0x0B, 0x67, 0xAD, 0xF9,\n    0xB8, 0x0E, 0xCC, 0x6F, 0x2A, 0x3A, 0x89, 0x14, 0x48, 0x07, 0x69, 0x43, 0x4E, 0xAA, 0x21, 0xB0,\n    0x55, 0xDC, 0xC1, 0x9F, 0x36, 0x39, 0x29, 0x36, 0x4B, 0x33, 0x84, 0x35, 0x1D, 0x13, 0xF5, 0x4F,\n    0x46, 0x65, 0x30, 0xD9, 0xFB, 0xC9, 0x43, 0xAB, 0x54, 0x27, 0x77, 0x4F, 0xC7, 0x70, 0x35, 0x75,\n    0xBF, 0xF5, 0x69, 0x65, 0x93, 0xB8, 0x27, 0x07, 0x12, 0x6F, 0x34, 0xE5, 0x6F, 0x31, 0x80, 0xD5,\n    0xCD, 0x0D, 0x26, 0x2E, 0xC7, 0xB3, 0xF4, 0x62, 0x79, 0x5C, 0x20, 0x97, 0xB5, 0x17, 0x46, 0x8A,\n    0xFE, 0xC4, 0x11, 0xBC, 0x7E, 0x6C, 0xFF, 0xF5, 0x5D, 0x08, 0x9F, 0xE8, 0x5A, 0x6D, 0x79, 0x22,\n    0x0F, 0xFD, 0x0A, 0xB6, 0x76, 0xC7, 0x28, 0x43, 0x61, 0x74, 0x69, 0x7B, 0x82, 0xCF, 0x3A, 0xB2,\n    0xC7, 0x56, 0x51, 0x6D, 0xE3, 0x6C, 0x5A, 0x7C, 0x38, 0x52, 0xAF, 0x56, 0x71, 0xBD, 0x1E, 0xB6,\n    0x4D, 0x77, 0x43, 0xD9, 0x76, 0x9B, 0xF7, 0xD2, 0x5E, 0xD5, 0xAF, 0x39, 0xAA, 0x14, 0x74, 0xAF,\n    0xB1, 0x15, 0x5C, 0xA9, 0x11, 0x3C, 0x62, 0xA9, 0xA7, 0x92, 0xB6, 0x4F, 0x95, 0xCD, 0x26, 0x1A,\n    0x75, 0x23, 0x4F, 0x55, 0x29, 0x7E, 0x5E, 0xDC, 0x04, 0x57, 0x70, 0xC4, 0x4D, 0xEB, 0x7F, 0x51,\n    0xB7, 0x99, 0x0D, 0x20, 0x92, 0xA4, 0xC8, 0x88, 0x7B, 0x6D, 0xB4, 0xC8, 0x1C, 0x19, 0x36, 0xC7,\n    0xD2, 0xFA, 0xC1, 0x9B, 0x92, 0x16, 0x79, 0xAD, 0x88, 0x9A, 0xCB, 0x31, 0xA4, 0x92, 0xA8, 0xBC,\n    0xF5, 0x46, 0xE3, 0x71, 0xC4, 0xE8, 0x63, 0xF5, 0x89, 0x68, 0x2A, 0x21, 0x41, 0x46, 0x81, 0x7A,\n    0x99, 0xAC, 0x04, 0xDD, 0x18, 0x91, 0x4E, 0x3D, 0x02, 0x06, 0x8B, 0x8A, 0x6F, 0x47, 0x3A, 0xA5,\n    0xD5, 0x75, 0xE0, 0x8E, 0x81, 0xB8, 0x36, 0x3D, 0xA0, 0x35, 0x20, 0x5F, 0x0B, 0x96, 0x8E, 0xD8,\n    0x1D, 0x56, 0x2F, 0x14, 0x81, 0xE1, 0x40, 0x30, 0x79, 0x84, 0x7D, 0x49, 0x83, 0x71, 0xBA, 0xDC,\n    0x14, 0x0B, 0x64, 0xFC, 0x52, 0xD8, 0xBE, 0x3F, 0x35, 0x74, 0x4C, 0x64, 0x15, 0x8D, 0x84, 0xF4,\n    0xB5, 0x9D, 0xF9, 0x14, 0x35, 0xC9, 0x71, 0x69, 0x1C, 0x1A, 0x5D, 0x99, 0xA4, 0x41, 0xFF, 0x3B,\n    0x98, 0x30, 0x64, 0xCE, 0xF3, 0xB3, 0xA9, 0xF7, 0xF0, 0xAA, 0xB2, 0x73, 0xF2, 0x29, 0x01, 0x95,\n    0x6C, 0xF8, 0x14, 0x21, 0x1B, 0x6E, 0x58, 0xD4, 0x9E, 0x7A, 0x62, 0x82, 0xB7, 0xD7, 0xB3, 0xEE,\n    0xEB, 0x3F, 0x3D, 0x3D, 0x52, 0x9F, 0xA9, 0x15, 0x5D, 0xB4, 0xB0, 0x6D, 0x17, 0xC8, 0x5C, 0x5F,\n    0xF7, 0x55, 0xB1, 0xA9, 0xA5, 0x25, 0xEF, 0x89, 0xE2, 0x7F, 0xBA, 0xAA, 0xDD, 0x40, 0x54, 0x6F,\n    0x6E, 0x86, 0x27, 0x24, 0x3B, 0x18, 0x49, 0xE6, 0xD3, 0x6B, 0xDD, 0x44, 0xC0, 0x94, 0xB0, 0x1D,\n    0x32, 0xDE, 0x5B, 0x3E, 0xEA, 0x72, 0xB4, 0x01, 0xA1, 0xE4, 0x58, 0x52, 0x26, 0xD7, 0x6F, 0xC7,\n    0x86, 0x7A, 0xB7, 0x41, 0xC2, 0xB0, 0x55, 0x55, 0x8F, 0x1F, 0xA2, 0x43, 0x60, 0x2E, 0x5A, 0x53,\n    0xBF, 0xA8, 0xAC, 0xD6, 0x63, 0xA8, 0x0E, 0x2A, 0xA0, 0x4F, 0x8A, 0xF3, 0xF9, 0xF6, 0x1C, 0xC1,\n    0x1A, 0x0A, 0x3D, 0x16, 0x2F, 0xF5, 0x8A, 0x6F, 0xEF, 0x41, 0x08, 0xAA, 0x5C, 0xFE, 0xFF, 0x4A,\n    0xFE, 0x9D, 0x36, 0x1B, 0xDE, 0x4C, 0x36, 0x9E, 0x57, 0x0F, 0x4C, 0xD7, 0xFC, 0x8B, 0x03, 0x7E,\n    0xFB, 0x59, 0x34, 0xBB, 0x1C, 0x8D, 0xCF, 0x59, 0x9D, 0x4C, 0xA4, 0x26, 0xD3, 0x68, 0x35, 0xCE,\n    0x80, 0xCD, 0xDB, 0x6D, 0xE0, 0x02, 0x5A, 0xAE, 0x64, 0xD9, 0x9E, 0x44, 0x74, 0x08, 0x71, 0x5E,\n    0x6D, 0x95, 0x0A, 0x60, 0x75, 0xAA, 0xA7, 0xB5, 0xD7, 0x75, 0x5E, 0xD3, 0x05, 0xA3, 0x50, 0xA1,\n    0x32, 0x13, 0x8C, 0x29, 0x81, 0x45, 0x7A, 0x38, 0x61, 0xB5, 0xD0, 0x4C, 0xB5, 0x95, 0xD7, 0x92,\n    0x58, 0x8C, 0xF8, 0x0B, 0x9D, 0x7C, 0x33, 0x35, 0xAE, 0x8E, 0x69, 0x48, 0x0F, 0x03, 0x75, 0x81,\n    0x78, 0xE8, 0x91, 0x0D, 0xEF, 0x84, 0x91, 0x53, 0xF1, 0xE6, 0xED, 0xC1, 0xD7, 0x1D, 0xD3, 0xE0,\n    0x73, 0x9E, 0x94, 0xD5, 0x68, 0xE9, 0xBD, 0x13, 0xA6, 0x22, 0x76, 0x19, 0x5F, 0x2D, 0xAC, 0xF9,\n    0xD6, 0x06, 0x88, 0x1E, 0x5B, 0xA5, 0x00, 0x67, 0x6F, 0x0D, 0xD2, 0xF3, 0x5D, 0x8D, 0x06, 0x90,\n    0xD1, 0xF7, 0xBE, 0x39, 0x19, 0xD5, 0x9E, 0x60, 0x6B, 0xD4, 0x51, 0xE6, 0x46, 0xB2, 0x96, 0xC4,\n    0x01, 0xC3, 0xD2, 0xA5, 0x3D, 0xCD, 0x4F, 0x9C, 0xBD, 0x3D, 0xC3, 0x0F, 0x1E, 0x94, 0xA8, 0xFD,\n    0x26, 0xA9, 0x9C, 0x4C, 0xA4, 0xF8, 0xBC, 0xD8, 0xB1, 0xC7, 0xFE, 0x5F, 0x8B, 0xF2, 0x60, 0x37,\n    0x6D, 0xF9, 0x62, 0xEF, 0xAE, 0xAD, 0x19, 0x69, 0xAF, 0x20, 0x26, 0x41, 0x60, 0xEC, 0x8D, 0x32,\n    0x6B, 0x3B, 0xA3, 0xA2, 0x67, 0xB0, 0x6D, 0xA3, 0x48, 0x8A, 0xAA, 0x03, 0xD3, 0xE4, 0xE7, 0x76,\n    0xA0, 0x8C, 0xBE, 0x53, 0xF3, 0x2E, 0x96, 0x1A, 0xEB, 0x1E, 0x38, 0x47, 0x29, 0x64, 0x8F, 0xDB,\n    0x15, 0xAA, 0xFF, 0xE6, 0xC0, 0x16, 0x22, 0xD8, 0x95, 0x36, 0x56, 0x28, 0x5B, 0x90, 0x0C, 0x8C,\n    0xF3, 0x03, 0x01, 0xA3, 0x53, 0x17, 0x62, 0x0C, 0xB6, 0xDC, 0x65, 0xE4, 0x70, 0x49, 0xD2, 0x76,\n    0x85, 0x47, 0x90, 0x8B, 0x84, 0xF4, 0x00, 0x13, 0x0A, 0xB6, 0x3F, 0xF4, 0x3E, 0x67, 0x1A, 0x11,\n    0xFF, 0xA5, 0x28, 0x0F, 0x1E, 0x0C, 0xD5, 0xE9, 0x99, 0x3E, 0x09, 0xB5, 0x0B, 0x87, 0x9B, 0xF1,\n    0xB2, 0x8D, 0xFD, 0x24, 0x95, 0x43, 0x52, 0x1D, 0x38, 0xA7, 0x1B, 0x98, 0x38, 0xEC, 0x68, 0x7C,\n    0x69, 0x45, 0x17, 0x21, 0x63, 0x85, 0x16, 0xF8, 0xCE, 0x10, 0xA4, 0xE1, 0xCE, 0xD8, 0x1A, 0x82,\n    0x6E, 0xC7, 0x06, 0xD4, 0xB0, 0x58, 0x09, 0x22, 0x95, 0x84, 0x0E, 0xD6, 0x2E, 0x06, 0x74, 0x07,\n    0x5D, 0x01, 0x8B, 0x88, 0x8D, 0x66, 0xF4, 0x0D, 0x36, 0x52, 0x41, 0xCD, 0xE6, 0x17, 0xBF, 0xF2,\n    0x37, 0x50, 0x68, 0x3A, 0x5C, 0x7D, 0x4F, 0xD5, 0xE0, 0xE7, 0xB3, 0x24, 0xD3, 0x2A, 0x07, 0x18,\n    0x9F, 0x53, 0x8D, 0x52, 0xD6, 0x98, 0x26, 0x30, 0xA5, 0x43, 0x04, 0x7C, 0xB1, 0xF3, 0x93, 0xE2,\n    0xE6, 0x21, 0x1B, 0x94, 0xDA, 0xEE, 0x29, 0xB1, 0xDB, 0x07, 0x3D, 0x9F, 0x9B, 0x14, 0x8F, 0x4E,\n    0x9D, 0xCB, 0xCE, 0xA9, 0x5C, 0x60, 0xB1, 0xC0, 0x4C, 0xB7, 0x89, 0xBA, 0xD2, 0x14, 0xEE, 0x94,\n    0xBC, 0xD4, 0x5D, 0x90, 0x3B, 0xC6, 0xC5, 0x7C, 0xCB, 0x13, 0xB9, 0xDE, 0xA0, 0x06, 0x37, 0x94,\n    0x73, 0xBC, 0xC8, 0xA0, 0xDB, 0xE3, 0x51, 0xD3, 0x36, 0xB5, 0x4E, 0x4F, 0xA0, 0xB0, 0x74, 0x38,\n    0x76, 0xBC, 0x8A, 0x98, 0x4B, 0xFA, 0x00, 0x4F, 0x89, 0xA5, 0x59, 0x92, 0xC4, 0xAD, 0x35, 0x67,\n    0x68, 0xE5, 0x7D, 0xDD, 0x5E, 0x1C, 0x50, 0x35, 0x4E, 0xE1, 0xEB, 0x9C, 0x1A, 0xD2, 0x4C, 0x98,\n    0x25, 0x2A, 0x43, 0x7E, 0x7C, 0x64, 0x45, 0x1B, 0x19, 0x97, 0xDE, 0xD0, 0xCB, 0x24, 0x5C, 0x40,\n    0x95, 0x46, 0x0A, 0xEC, 0x14, 0x59, 0x55, 0x10, 0x12, 0x23, 0x1C, 0xF9, 0x9E, 0xB5, 0xEF, 0xEA,\n    0x6E, 0xE4, 0x6B, 0xF7, 0xDD, 0x95, 0xD2, 0x8F, 0x96, 0xBA, 0xDA, 0x04, 0x87, 0x47, 0x5B, 0x2A,\n    0xB6, 0x71, 0x2C, 0xE3, 0xCA, 0xC6, 0x94, 0xC0, 0xA0, 0xB8, 0x17, 0x78, 0x0A, 0xFE, 0xB9, 0x1E,\n    0xB3, 0xCB, 0x21, 0x7E, 0x90, 0x01, 0xB2, 0xBD, 0xEE, 0x81, 0xD0, 0x05, 0xDE, 0xC2, 0xFB, 0x6E,\n    0x94, 0xDC, 0x22, 0xA0, 0x0F, 0x8A, 0xD5, 0xB5, 0x56, 0xA5, 0xB4, 0x39, 0xCD, 0x1E, 0xDB, 0x5A,\n    0xF2, 0x92, 0xA8, 0x7B, 0x1F, 0xDC, 0x44, 0xE7, 0xFF, 0xE3, 0x59, 0x69, 0x2D, 0x5E, 0x45, 0x53,\n    0x99, 0xB6, 0xC2, 0x15, 0x21, 0x65, 0x32, 0x43, 0xFC, 0xAD, 0x6D, 0x91, 0xC9, 0x09, 0x82, 0x6B,\n    0x2C, 0xA8, 0x0A, 0xE8, 0x4A, 0xD7, 0x19, 0x06, 0x53, 0x9A, 0x00, 0x0A, 0x9E, 0x25, 0xA6, 0x6E,\n    0xE0, 0x98, 0xC2, 0xC9, 0xD4, 0x98, 0x32, 0xE4, 0xEE, 0x37, 0x5D, 0x1F, 0x10, 0x22, 0xCD, 0x91,\n    0xBD, 0x7B, 0xDA, 0x27, 0xB5, 0x06, 0x5A, 0x9E, 0x27, 0x6C, 0xBA, 0x53, 0x20, 0x13, 0xA3, 0x2E,\n    0xAC, 0x05, 0x9A, 0x3C, 0xD1, 0xEB, 0xA2, 0xE8, 0x7F, 0x4E, 0xB0, 0xE6, 0x5A, 0x73, 0x6B, 0x5D,\n    0x37, 0x80, 0x66, 0xD3, 0x50, 0x21, 0xA6, 0x9E, 0x43, 0x15, 0x15, 0x77, 0xC7, 0x0B, 0x30, 0x16,\n    0xB6, 0x8D, 0x38, 0x93, 0x53, 0xF5, 0x68, 0xF4, 0x34, 0x07, 0xD1, 0xBD, 0x10, 0xDE, 0xDD, 0x4E,\n    0x87, 0x32, 0xB6, 0xB4, 0x37, 0xD1, 0xBB, 0x8A, 0xD2, 0x4B, 0xBF, 0x04, 0x73, 0x3A, 0x36, 0x5C,\n    0x87, 0xF7, 0x0B, 0x41, 0x11, 0xF6, 0x27, 0x2C, 0xB6, 0xC2, 0x8B, 0xBE, 0x6E, 0x5D, 0x17, 0xA6,\n    0xEC, 0x74, 0xDF, 0xE4, 0x88, 0xDD, 0x9E, 0xEF, 0xFD, 0x2B, 0x25, 0xD9, 0x3B, 0x42, 0xB1, 0x2F,\n    0x21, 0xE4, 0x29, 0xC8, 0x69, 0x48, 0xC8, 0xB8, 0xB3, 0x8C, 0x2B, 0x4F, 0x31, 0xB9, 0x0C, 0xB2,\n    0xE1, 0xE9, 0xE1, 0xF4, 0x7C, 0xE9, 0x78, 0x1F, 0xFF, 0xB7, 0x6D, 0xF9, 0x01, 0xF5, 0xDA, 0xCB,\n    0x37, 0x20, 0xAE, 0x29, 0xED, 0xC7, 0x93, 0x25, 0xB7, 0x10, 0x47, 0x1E, 0x07, 0x8A, 0x82, 0xDC,\n    0xB9, 0x93, 0x39, 0xA0, 0xD8, 0x24, 0x5F, 0xA2, 0x8C, 0xE5, 0xB0, 0xAC, 0x8C, 0x63, 0x09, 0x50,\n    0x49, 0x04, 0x27, 0xD5, 0x2B, 0xA5, 0xA1, 0x8C, 0x86, 0x8B, 0x3D, 0x19, 0xC6, 0x39, 0x88, 0xB8,\n    0xB4, 0x2B, 0x4C, 0x5D, 0x6B, 0x9C, 0x36, 0xA6, 0x7A, 0x1A, 0xA7, 0x71, 0xE8, 0x97, 0x78, 0x1C,\n    0x03, 0xDA, 0x0D, 0xA3, 0xE9, 0xF6, 0x5F, 0x63, 0x2E, 0x9B, 0x6C, 0x86, 0xB9, 0x7C, 0x3D, 0xD2,\n    0xC9, 0x90, 0xCA, 0x5F, 0x48, 0x5E, 0x1C, 0x11, 0x88, 0xCA, 0xBF, 0x79, 0xB5, 0xBF, 0x2D, 0xED,\n    0xFE, 0x4D, 0xC6, 0x2C, 0xFB, 0x8E, 0x0E, 0x42, 0x53, 0x8C, 0xB2, 0x07, 0x92, 0xFF, 0xEC, 0x6B,\n    0xAA, 0xC5, 0xAE, 0x25, 0x09, 0xEA, 0xBB, 0x82, 0x5E, 0x86, 0x63, 0xD2, 0xF5, 0x59, 0x8F, 0x26,\n    0xF5, 0x98, 0x17, 0xE4, 0x6A, 0x89, 0x28, 0x2B, 0xF5, 0x8A, 0x5E, 0x96, 0x1C, 0x8D, 0xBE, 0x30,\n    0x47, 0xE6, 0x75, 0x84, 0x79, 0xFE, 0xF1, 0x35, 0xDD, 0x70, 0x7E, 0xCA, 0xC9, 0x1F, 0xD8, 0x03,\n    0x26, 0xEA, 0x48, 0x39, 0x68, 0xFF, 0x34, 0x8B, 0x58, 0xC6, 0x7C, 0x68, 0x54, 0x1A, 0x03, 0x17,\n    0x55, 0x23, 0xF9, 0xA8, 0x66, 0x04, 0x6A, 0xB4, 0x3C, 0xA9, 0xDB, 0x46, 0x5C, 0x48, 0xEB, 0xB2,\n    0x0D, 0x74, 0x67, 0x30, 0xD6, 0x2D, 0xFF, 0x30, 0x6D, 0xB5, 0x66, 0x66, 0x7C, 0xE2, 0x8B, 0xB0,\n    0xB6, 0x08, 0xFE, 0x2F, 0x05, 0xC4, 0x26, 0x33, 0x1F, 0x40, 0xC3, 0x07, 0x04, 0xAE, 0xFC, 0xC1,\n    0x23, 0xE5, 0x31, 0xEA, 0x16, 0x63, 0xB5, 0x9C, 0xD8, 0x2D, 0xC1, 0xCE, 0x46, 0xBC, 0x4C, 0x88,\n    0x7C, 0xBC, 0x86, 0xC5, 0x89, 0x69, 0x93, 0x13, 0x97, 0x0C, 0x05, 0xF3, 0x7C, 0x9D, 0x23, 0xC2,\n    0x81, 0x2C, 0xB9, 0x98, 0x05, 0x3D, 0x1B, 0x67, 0xDA, 0x50, 0x04, 0xD4, 0x79, 0x8A, 0x97, 0x63,\n    0xE5, 0xAF, 0xA4, 0xFD, 0x3D, 0x4D, 0x17, 0x3D, 0x8B, 0x9C, 0xA8, 0xEF, 0xA1, 0x42, 0x62, 0xFE,\n    0xD0, 0xD3, 0x86, 0xBE, 0x8D, 0xCB, 0x54, 0x02, 0xCD, 0x4D, 0xBF, 0xA9, 0xC2, 0x74, 0xBC, 0x4C,\n    0x82, 0x5A, 0x0A, 0xF9, 0xC6, 0x6C, 0xD1, 0x59, 0x2B, 0x8F, 0xED, 0x51, 0xAF, 0xA6, 0x17, 0x4A,\n    0xBB, 0xBD, 0xE4, 0x1B, 0xA2, 0x40, 0xC9, 0xAB, 0x7F, 0xE0, 0x59, 0x19, 0x98, 0xCE, 0x84, 0x51,\n    0x35, 0x3F, 0x49, 0x0E, 0x9F, 0x13, 0xD3, 0x43, 0xAF, 0x98, 0xD7, 0x8A, 0x8E, 0x2E, 0x88, 0x02,\n    0x4C, 0x17, 0x08, 0x9F, 0xFD, 0x4C, 0xF7, 0x9F, 0x38, 0x74, 0x4E, 0x39, 0xCF, 0x93, 0xC3, 0x0A,\n    0xB2, 0x9B, 0xBF, 0xE4, 0xAE, 0xA5, 0x6D, 0x7F, 0x1A, 0x62, 0x16, 0x05, 0x9C, 0x10, 0xF4, 0x81,\n    0x6F, 0xA7, 0xDF, 0xE8, 0x95, 0xC8, 0x88, 0x8A, 0x11, 0xEB, 0x56, 0xC6, 0x27, 0xE0, 0x92, 0x45,\n    0x87, 0x6F, 0x63, 0x11, 0x1B, 0x5C, 0xD8, 0x4E, 0x13, 0xAA, 0xB5, 0x04, 0x15, 0xCD, 0xF6, 0x66,\n    0x1C, 0x7C, 0x62, 0x3A, 0x6F, 0x73, 0xCF, 0x8B, 0xAB, 0x3A, 0x42, 0x5E, 0x1F, 0x58, 0x3E, 0xF2,\n    0x4C, 0xAF, 0xCB, 0x7A, 0x0E, 0x0C, 0xAB, 0xED, 0x04, 0xF6, 0xC2, 0x91, 0xAC, 0x8D, 0x30, 0xF1,\n    0x2A, 0x43, 0x53, 0x02, 0x5C, 0xF5, 0x92, 0x21, 0x50, 0x56, 0x2E, 0x38, 0x7C, 0x6E, 0x48, 0xDE,\n    0x81, 0x0E, 0x41, 0x3B, 0xA0, 0x74, 0xFC, 0x63, 0xC3, 0x3D, 0x8E, 0xC9, 0x28, 0xA2, 0xA0, 0x57,\n    0x4A, 0xDC, 0xB5, 0xAA, 0x1E, 0x86, 0xA2, 0x6C, 0x55, 0xF7, 0xC9, 0x1F, 0x28, 0x6B, 0xB5, 0xD6,\n    0x98, 0x25, 0x32, 0xE0, 0xA5, 0x29, 0xC8, 0xA6, 0xFE, 0x95, 0xC0, 0xA5, 0xFE, 0x82, 0x32, 0xD5,\n    0xC0, 0xFE, 0x63, 0x37, 0xBD, 0x57, 0x42, 0x53, 0xF6, 0xF9, 0x6A, 0x2C, 0x88, 0x71, 0xDC, 0xB5,\n    0x28, 0xF0, 0x18, 0x7E, 0x45, 0xF0, 0xB2, 0x19, 0x15, 0x1C, 0x2D, 0x1A, 0xD2, 0xF4, 0xAD, 0xDB,\n    0xAF, 0x23, 0x07, 0xA1, 0x3F, 0xDE, 0x97, 0xA5, 0x1A, 0xD2, 0x7E, 0x61, 0x8D, 0x23, 0x49, 0xC6,\n    0x22, 0x0E, 0xE0, 0xD9, 0x40, 0xC5, 0xE2, 0xD7, 0x0C, 0xDC, 0xD1, 0x50, 0x45, 0xC3, 0x74, 0x64,\n    0xD4, 0xCC, 0x11, 0xEC, 0x1F, 0x5E, 0x7E, 0x67, 0x76, 0x73, 0x3E, 0x55, 0x43, 0x44, 0x31, 0x1B,\n    0xBD, 0xF3, 0xA9, 0x7C, 0x72, 0xCE, 0x83, 0x2E, 0x5D, 0x2B, 0xF6, 0x2C, 0xA5, 0xB2, 0xC6, 0xB1,\n    0x71, 0x1E, 0xEA, 0x33, 0xF1, 0x83, 0x2A, 0x21, 0x65, 0x13, 0xFE, 0xA0, 0x21, 0xB7, 0x44, 0x07,\n    0x04, 0xF1, 0x46, 0x1D, 0xEF, 0x71, 0x80, 0x27, 0x42, 0x5F, 0x90, 0x55, 0x54, 0x84, 0x60, 0x37,\n    0xCF, 0xFB, 0xFA, 0x36, 0x4D, 0x92, 0x63, 0x82, 0x3D, 0xE8, 0xC2, 0x09, 0xE7, 0xBE, 0xC3, 0x7D,\n    0x4C, 0x17, 0xF1, 0x5C, 0x0F, 0xB6, 0x57, 0x25, 0x5D, 0xC0, 0x0C, 0x63, 0xE1, 0xF2, 0x9F, 0x69,\n    0xD6, 0x35, 0x73, 0xDC, 0xB3, 0x1D, 0xDA, 0x72, 0x5E, 0xB7, 0x12, 0x3B, 0x43, 0xF7, 0xB4, 0xCC,\n    0x48, 0xAC, 0xE2, 0xB3, 0xFB, 0x15, 0x91, 0x03, 0xFB, 0xDF, 0x2A, 0x4D, 0x70, 0x88, 0x75, 0x02,\n    0x18, 0x53, 0xF9, 0x9F, 0xC1, 0x9C, 0x0C, 0x5B, 0x5A, 0x59, 0x1B, 0x5F, 0x4A, 0xE5, 0x39, 0x20,\n    0xAD, 0x28, 0xC7, 0x80, 0x77, 0x13, 0x8E, 0x61, 0xBD, 0xE8, 0x80, 0x37, 0x41, 0x6E, 0xE7, 0x75,\n    0xCA, 0x41, 0xC6, 0xA9, 0xCC, 0x1C, 0xAF, 0xFF, 0x97, 0xCC, 0xFE, 0xF2, 0xED, 0x85, 0xD8, 0xB1,\n    0x4F, 0xF3, 0x7A, 0xE7, 0xF9, 0x18, 0x41, 0xD7, 0x49, 0xA2, 0x1B, 0xBC, 0xE2, 0x89, 0x93, 0x54,\n    0x5A, 0xF1, 0x5E, 0xA3, 0x66, 0x51, 0x8C, 0x66, 0x7A, 0xF7, 0x44, 0xD7, 0xFD, 0x90, 0xF1, 0xEE,\n    0x3E, 0xF6, 0x0E, 0xA5, 0xE9, 0xDB, 0xD0, 0xDB, 0x58, 0xA7, 0x45, 0xA9, 0x34, 0xD8, 0x44, 0xA3,\n    0x65, 0x29, 0xCB, 0x61, 0x8E, 0xAD, 0x7F, 0x95, 0xBA, 0x71, 0xFB, 0xB6, 0x93, 0x5F, 0x6F, 0xFC,\n    0xC1, 0xAA, 0xE6, 0x9F, 0x73, 0x55, 0x69, 0xE7, 0x35, 0x12, 0xCA, 0x26, 0x56, 0x39, 0x79, 0xFB,\n    0xAB, 0x53, 0x00, 0xF0, 0x8F, 0x72, 0xBF, 0x2D, 0x30, 0x05, 0x67, 0x65, 0x4B, 0xD3, 0x6A, 0xF7,\n    0x8B, 0x79, 0x41, 0xFA, 0x89, 0x2A, 0xDB, 0x0C, 0xA1, 0x10, 0xFC, 0x3A, 0x12, 0x63, 0x55, 0xB0,\n    0x3A, 0xB5, 0x30, 0xDB, 0x08, 0x76, 0xAF, 0xF6, 0x1A, 0xD9, 0xAE, 0x51, 0x81, 0xE3, 0x84, 0x90,\n    0x70, 0x2C, 0x1B, 0xA7, 0x75, 0xA3, 0x44, 0xD2, 0x9B, 0x71, 0x7C, 0x39, 0x0E, 0x1E, 0x32, 0x7D,\n    0x6B, 0x40, 0x90, 0xEE, 0xEF, 0x85, 0xB3, 0x21, 0x86, 0x2B, 0xE7, 0x53, 0x70, 0x7B, 0xB4, 0xE2,\n    0x2D, 0xBE, 0x1F, 0x61, 0xEA, 0x7D, 0x31, 0x4E, 0x07, 0xB6, 0xD3, 0x20, 0x82, 0x2F, 0x7E, 0xEA,\n    0x63, 0x8E, 0x31, 0xD8, 0xCE, 0x3C, 0x50, 0x58, 0x58, 0x99, 0x3D, 0x77, 0x18, 0x6C, 0xF6, 0x64,\n    0xB2, 0xB8, 0xBF, 0x39, 0xE0, 0x2C, 0x47, 0xAF, 0xBC, 0xDF, 0xC9, 0xE3, 0x4A, 0x92, 0xB3, 0xAB,\n    0x28, 0x4C, 0x07, 0x32, 0x53, 0xDC, 0x33, 0x25, 0xC8, 0xD6, 0xAC, 0xE9, 0xFF, 0x17, 0xF1, 0x63,\n    0xD6, 0x03, 0x6A, 0x81, 0xEE, 0x3F, 0xDA, 0xAE, 0xD1, 0x5D, 0xAD, 0x92, 0x51, 0x99, 0xA8, 0x5C,\n    0xDA, 0x47, 0x3A, 0xDB, 0x94, 0x9D, 0x89, 0xA2, 0x24, 0x88, 0xB0, 0xBB, 0x22, 0x46, 0x8F, 0x03,\n    0xB0, 0x9C, 0xB9, 0xDE, 0xD6, 0xCA, 0xEA, 0xDE, 0x6B, 0x97, 0xA9, 0xB0, 0xB3, 0xDB, 0xA6, 0x5E,\n    0xAD, 0xEC, 0x12, 0x23, 0x04, 0x4D, 0x7B, 0xF2, 0x7C, 0x0A, 0xE2, 0xB3, 0xA0, 0x81, 0x58, 0x8F,\n    0xC0, 0xA6, 0xE9, 0xDF, 0x7F, 0xA7, 0x89, 0x6E, 0x2D, 0x68, 0x23, 0xF1, 0x29, 0xB7, 0xD7, 0xDC,\n    0x63, 0x4A, 0xCB, 0x83, 0x24, 0xC0, 0xE4, 0x54, 0x5C, 0x67, 0x12, 0xB3, 0xFB, 0x6A, 0x1E, 0x37,\n    0xE0, 0xBE, 0x85, 0xDA, 0x7C, 0xB4, 0x8B, 0xEC, 0xE8, 0xBB, 0x08, 0x84, 0xD9, 0x90, 0x4B, 0x56,\n    0xFA, 0x2F, 0xA2, 0x36, 0xC8, 0x97, 0xFC, 0x3E, 0xC0, 0x9C, 0x28, 0x5D, 0xFD, 0x54, 0xD8, 0x53,\n    0x7D, 0x41, 0x4F, 0x15, 0x09, 0xA6, 0x3F, 0xAF, 0x13, 0x31, 0xE6, 0xE8, 0x45, 0x8C, 0x64, 0xFC,\n    0xF6, 0x53, 0x1C, 0x2B, 0x25, 0xDF, 0x15, 0x93, 0x06, 0xE1, 0x32, 0x45, 0x9A, 0x29, 0x6B, 0xD5,\n    0x11, 0x27, 0xA7, 0x2E, 0x98, 0xA8, 0x30, 0xD7, 0x93, 0x37, 0xDE, 0xFE, 0xC2, 0xE7, 0xC0, 0xAE,\n    0x5E, 0x26, 0x04, 0xA4, 0x57, 0x7A, 0x3F, 0xD7, 0x0E, 0xB6, 0x27, 0xE1, 0xCF, 0xBA, 0x27, 0xC3,\n    0x84, 0xFE, 0xD5, 0x4A, 0x87, 0xF0, 0xB5, 0x1C, 0x44, 0x3E, 0x17, 0xC9, 0x99, 0x8F, 0x85, 0xE6,\n    0xDA, 0x41, 0x94, 0xAB, 0x71, 0xC9, 0x0B, 0x9E, 0xA8, 0xF0, 0x5A, 0x01, 0x14, 0x8E, 0x15, 0x05,\n    0xB7, 0xE0, 0x90, 0xDD, 0x33, 0x9E, 0x82, 0x3B, 0x14, 0x57, 0xBD, 0xD1, 0xC7, 0xC1, 0x6D, 0xDE,\n    0x3F, 0x4B, 0x4E, 0xD6, 0xF4, 0x49, 0xED, 0xAF, 0x6C, 0x6C, 0xE3, 0x51, 0x0E, 0xDF, 0x15, 0xAF,\n    0xCD, 0x7F, 0xBF, 0x64, 0xF4, 0x66, 0x0F, 0x25, 0x86, 0xDA, 0xEF, 0xDF, 0xBB, 0x75, 0x92, 0xAD,\n    0x70, 0x42, 0x1E, 0xC7, 0x23, 0x2C, 0xC1, 0x49, 0x4B, 0x9B, 0xAC, 0x7C, 0x3C, 0x7D, 0xFA, 0xA2,\n    0x80, 0xCC, 0x0E, 0xDC, 0xD2, 0xAD, 0xDA, 0xBD, 0xF2, 0xFB, 0xAD, 0xCA, 0x96, 0x68, 0x19, 0xAE,\n    0x7E, 0xDB, 0x43, 0xF3, 0xEF, 0x52, 0x3F, 0x95, 0x3E, 0x5C, 0x9A, 0x9E, 0x54, 0x8F, 0x47, 0x27,\n    0xEC, 0xC1, 0xBF, 0x31, 0x7A, 0xDB, 0x6B, 0xBE, 0x40, 0x98, 0x8A, 0x33, 0xD8, 0x42, 0x97, 0x0C,\n    0x51, 0x3B, 0xD7, 0xB1, 0x95, 0xF8, 0xEF, 0x3B, 0xC8, 0xD8, 0x4C, 0x94, 0x0D, 0xDE, 0xC4, 0x09,\n    0x77, 0x52, 0x6E, 0xF2, 0xEF, 0x50, 0x9A, 0x83, 0x48, 0x6D, 0x69, 0x91, 0x33, 0x1A, 0x56, 0x98,\n    0xC0, 0x12, 0x86, 0xA8, 0xE3, 0xDE, 0x2E, 0xE9, 0x43, 0xB3, 0x7A, 0x71, 0x40, 0xFA, 0x34, 0xF7,\n    0xA6, 0xC3, 0x2F, 0xBB, 0x16, 0x6B, 0x91, 0x01, 0x58, 0xB0, 0x8D, 0x7A, 0x54, 0x62, 0x59, 0x3E,\n    0xC3, 0x2F, 0x3D, 0x48, 0xFB, 0x6C, 0x85, 0xD3, 0xD7, 0xB0, 0xFD, 0x4E, 0xCA, 0x3A, 0xEE, 0x37,\n    0xFF, 0xA1, 0xA8, 0xB0, 0x8F, 0xF8, 0x3F, 0xC7, 0x88, 0x07, 0x30, 0x1C, 0x81, 0x56, 0x63, 0xC2,\n    0x97, 0x05, 0x8C, 0x7A, 0x01, 0xBF, 0x14, 0x50, 0xA7, 0x87, 0x9A, 0x86, 0x79, 0x59, 0x45, 0x0F,\n    0x78, 0xD4, 0x0D, 0x1E, 0x3B, 0xE0, 0xF1, 0x14, 0x11, 0x55, 0x04, 0xE8, 0x10, 0x34, 0xDC, 0xF8,\n    0x3C, 0x12, 0xC5, 0x93, 0x64, 0x47, 0x70, 0x84, 0x89, 0x5F, 0xAF, 0xC3, 0x6B, 0xB2, 0x89, 0xAE,\n    0xED, 0xF6, 0x6A, 0x55, 0xC5, 0x50, 0xC5, 0xDE, 0x02, 0x70, 0xF9, 0x03, 0x67, 0xA4, 0x82, 0xDE,\n    0x0D, 0x38, 0x18, 0xDF, 0x5D, 0x24, 0x8D, 0x00, 0x8A, 0xF5, 0xA3, 0x01, 0xC6, 0xE3, 0xA6, 0x17,\n    0x16, 0xB9, 0xA1, 0x8E, 0x9C, 0x08, 0x9B, 0x2A, 0x20, 0x22, 0x69, 0x50, 0x91, 0x10, 0x98, 0x2C,\n    0x19, 0x94, 0xE6, 0xE9, 0x2C, 0x0F, 0xDD, 0x0A, 0x5A, 0xF8, 0xAD, 0xE5, 0xBE, 0x65, 0x3C, 0xD3,\n    0x75, 0x1C, 0x75, 0x77, 0xC2, 0xF7, 0x23, 0x7E, 0x6E, 0x62, 0xAF, 0xD2, 0x5F, 0x00, 0xFC, 0xD0,\n    0xF9, 0xF1, 0xCF, 0x7E, 0x11, 0xE6, 0xF5, 0x7E, 0xC0, 0x46, 0xCA, 0xEF, 0x1C, 0x5F, 0x62, 0x2F,\n    0x6D, 0xF9, 0xF4, 0x88, 0x64, 0xD2, 0xE0, 0x1F, 0x04, 0x33, 0xB9, 0xBA, 0x99, 0xC9, 0x9E, 0xD9,\n    0x48, 0x11, 0x6B, 0x2C, 0x35, 0x79, 0x36, 0x40, 0xDF, 0xB8, 0x3C, 0x2F, 0xAA, 0x35, 0x91, 0x43,\n    0xD2, 0x23, 0x8F, 0x1E, 0x24, 0x4E, 0x29, 0xA8, 0x9F, 0x3F, 0xF9, 0xF4, 0x5E, 0xAC, 0xBF, 0x39,\n    0xE2, 0x7F, 0x12, 0x4C, 0x95, 0xBC, 0xCE, 0x61, 0xF3, 0xEF, 0xD0, 0x30, 0x60, 0x6B, 0xFD, 0xD6,\n    0xF8, 0x15, 0x25, 0x56, 0x57, 0xC2, 0xF5, 0x84, 0xE4, 0xDF, 0xE8, 0x28, 0xBF, 0x81, 0x98, 0x5D,\n    0xFA, 0x28, 0x66, 0xF5, 0xD5, 0x43, 0x71, 0x17, 0xBF, 0x19, 0xA2, 0x5F, 0xB6, 0xDB, 0x14, 0x93,\n    0xBC, 0x30, 0xC4, 0x3E, 0x11, 0x01, 0xC5, 0x04, 0x30, 0x90, 0xBE, 0xA5, 0x85, 0xC4, 0x1B, 0xAD,\n    0x68, 0xCA, 0xBB, 0x7B, 0x8B, 0x45, 0x29, 0xF4, 0xA3, 0xCE, 0x72, 0x36, 0x79, 0x1B, 0xE6, 0x4D,\n    0xD7, 0x52, 0xBA, 0xD7, 0x2E, 0x61, 0x97, 0xDB, 0x5B, 0xA5, 0x47, 0x1F, 0x6F, 0xE0, 0x29, 0x25,\n    0xBC, 0xA1, 0xCF, 0x17, 0xC5, 0x32, 0xAA, 0x2B, 0xB2, 0x52, 0x89, 0x32, 0xCB, 0xFB, 0x1A, 0xCE,\n    0x4A, 0x2B, 0x98, 0x7F, 0xB5, 0x9B, 0x72, 0x42, 0x08, 0xB4, 0x52, 0x83, 0xB5, 0x98, 0x9D, 0xA0,\n    0x04, 0x50, 0x3B, 0xFD, 0x4B, 0x18, 0xAF, 0x9D, 0xE0, 0x70, 0xE7, 0x0B, 0x84, 0x09, 0x93, 0x51,\n    0x35, 0xE1, 0xC0, 0xB2, 0xD3, 0xE1, 0x66, 0x17, 0xB1, 0xDC, 0xE4, 0x1D, 0xBF, 0xE6, 0x76, 0x53,\n    0x1B, 0x05, 0xB2, 0x47, 0x02, 0x0B, 0xAB, 0x70, 0x52, 0x1B, 0x1C, 0x5B, 0xAF, 0x84, 0x0F, 0x12,\n    0xCD, 0xB9, 0x3F, 0xB9, 0x15, 0xC6, 0x56, 0xBB, 0xD7, 0x80, 0xBB, 0x94, 0xFB, 0xFB, 0x7C, 0xB9,\n    0xCF, 0xBC, 0x0E, 0xCB, 0xA8, 0x7E, 0x4A, 0xF3, 0xBA, 0x73, 0xCD, 0x9E, 0x14, 0x0D, 0x12, 0x17,\n    0x91, 0xF6, 0xF4, 0x9D, 0x14, 0x13, 0x91, 0x8E, 0x6D, 0x62, 0xF3, 0x27, 0xA1, 0x01, 0x85, 0xD2,\n    0x7A, 0xF5, 0x60, 0x13, 0xEE, 0xDC, 0x75, 0xF9, 0xFF, 0x23, 0x2D, 0xFE, 0xE7, 0x69, 0x40, 0x8B,\n    0x0A, 0xA8, 0xFF, 0x86, 0x2A, 0x6D, 0x0D, 0xD3, 0x9D, 0x14, 0xA3, 0xDF, 0xB8, 0x1C, 0x44, 0xE9,\n    0x7E, 0x9D, 0x73, 0x6B, 0x0C, 0xF2, 0x0F, 0x45, 0xA5, 0xCF, 0x46, 0xDA, 0xDC, 0xF6, 0x24, 0xC6,\n    0x72, 0xD0, 0x91, 0x6E, 0x38, 0x76, 0x1F, 0xA7, 0xF9, 0x8F, 0x9A, 0xFC, 0x16, 0x1E, 0xF7, 0x6A,\n    0x82, 0x49, 0x1C, 0xC0, 0xDE, 0x8A, 0xDA, 0x62, 0x86, 0x06, 0x6C, 0xF6, 0x8E, 0xA3, 0xE1, 0x65,\n    0x32, 0x7B, 0x65, 0x00, 0x99, 0xEA, 0xAF, 0x86, 0x03, 0xDE, 0xCE, 0xF9, 0xE6, 0xAE, 0x16, 0x2D,\n    0x9D, 0x90, 0xB4, 0x63, 0x96, 0xA6, 0x7E, 0xEE, 0x06, 0xE7, 0x69, 0x84, 0x40, 0xDE, 0x94, 0x20,\n    0x7C, 0xCF, 0x37, 0x21, 0x6E, 0x3D, 0xB0, 0xED, 0x9C, 0x9E, 0xAE, 0x56, 0x5D, 0xD7, 0x54, 0x51,\n    0x80, 0xA7, 0xCB, 0xB8, 0xC2, 0x02, 0x45, 0xF3, 0x5B, 0x15, 0xA6, 0xEC, 0x5A, 0x10, 0xB2, 0xCC,\n    0xC6, 0x4D, 0xCD, 0xE5, 0xF5, 0xB5, 0x86, 0xC3, 0x73, 0x00, 0xDB, 0x5B, 0xE7, 0x0E, 0xF8, 0x51,\n    0x05, 0x4B, 0x93, 0xB3, 0xD0, 0x78, 0x12, 0x1E, 0x86, 0xCD, 0xBB, 0xE4, 0x80, 0xF7, 0x72, 0xF5,\n    0xC7, 0x95, 0xF5, 0x62, 0xFA, 0x27, 0x9B, 0x9A, 0x24, 0xDD, 0x7E, 0xE3, 0xCE, 0x7C, 0x96, 0x13,\n    0x29, 0xD2, 0xCD, 0xB5, 0x31, 0xD8, 0x8D, 0xE9, 0x8D, 0x12, 0xD5, 0x49, 0x76, 0xFD, 0xCC, 0xCC,\n    0x8B, 0x30, 0x6D, 0x7D, 0x33, 0xC1, 0x0B, 0x0B, 0xC8, 0xD3, 0xA2, 0x3A, 0x98, 0xAB, 0x20, 0x50,\n    0x25, 0x44, 0xC4, 0x34, 0xC0, 0x82, 0x64, 0x94, 0x44, 0x19, 0x33, 0xCB, 0x18, 0x5A, 0x7B, 0x33,\n    0x38, 0xED, 0xC6, 0x5F, 0xD4, 0x85, 0xD1, 0x1D, 0xDD, 0x1C, 0xD7, 0x43, 0xFF, 0x67, 0x28, 0xD2,\n    0xC1, 0x8E, 0x3D, 0x19, 0x21, 0xC1, 0x8D, 0x00, 0xCE, 0x0C, 0x2C, 0x83, 0x89, 0x11, 0x14, 0xC1,\n    0x59, 0x29, 0x63, 0x2D, 0xC6, 0x46, 0xD0, 0x52, 0xFB, 0x02, 0xEC, 0xF3, 0x9C, 0xF2, 0x64, 0xB4,\n    0x37, 0x99, 0x5C, 0xF6, 0x57, 0xC9, 0x4A, 0x51, 0x18, 0x08, 0x6E, 0x8B, 0x9D, 0xEB, 0xA5, 0x8F,\n    0xE4, 0x85, 0x29, 0x4C, 0x5F, 0xD8, 0x41, 0x2A, 0x62, 0xAB, 0x25, 0x42, 0xEE, 0x90, 0x64, 0x8E,\n    0x93, 0x64, 0x87, 0x49, 0x98, 0x7C, 0x0E, 0xDF, 0xAC, 0xC5, 0x79, 0x2D, 0xC8, 0x53, 0x45, 0x2B,\n    0xCF, 0x2F, 0x0B, 0xB6, 0x5B, 0x4C, 0x45, 0x38, 0x96, 0xE3, 0x70, 0x91, 0x8E, 0xAC, 0x51, 0x67,\n    0xA2, 0xDB, 0x83, 0x55, 0x4C, 0x9D, 0xEB, 0x49, 0xE4, 0x37, 0x68, 0x9B, 0x58, 0xDC, 0x4B, 0xEC,\n    0xB5, 0xC4, 0xDC, 0x13, 0xB1, 0x54, 0x92, 0xA5, 0x67, 0x75, 0x98, 0x43, 0x71, 0x27, 0xFF, 0xA5,\n    0x6E, 0xE3, 0x12, 0x8C, 0xF6, 0xCB, 0x18, 0x21, 0x7C, 0x0A, 0x4B, 0xB3, 0xA5, 0xF4, 0xEA, 0x09,\n    0x2C, 0x1C, 0x57, 0xBF, 0x8F, 0xA6, 0x94, 0xDD, 0x19, 0x35, 0x4F, 0x17, 0xA7, 0x55, 0x45, 0xBD,\n    0xC8, 0x32, 0x72, 0x9E, 0x05, 0xD6, 0xBA, 0x3C, 0x60, 0x2E, 0xE6, 0x83, 0x12, 0xC4, 0xE2, 0x80,\n    0x03, 0xDE, 0xBB, 0x88, 0xFB, 0x7F, 0xAD, 0x3B, 0x9C, 0xD8, 0xD0, 0x8E, 0x4C, 0x52, 0x4D, 0x7A,\n    0xB8, 0x89, 0xB0, 0xBC, 0x7F, 0x94, 0x81, 0xBB, 0x6C, 0xE7, 0x5E, 0x1C, 0xFA, 0x69, 0x81, 0xB6,\n    0x46, 0xC2, 0x3B, 0x70, 0xB8, 0x02, 0xA9, 0x9F, 0x17, 0x0F, 0xF2, 0x31, 0x17, 0x82, 0xFF, 0x17,\n    0x02, 0xB9, 0x14, 0xBB, 0xE7, 0x1B, 0x1B, 0x4B, 0x92, 0x14, 0xE4, 0xE7, 0x6D, 0x6D, 0x73, 0xB8,\n    0xCB, 0x5D, 0x92, 0x27, 0x7D, 0xDA, 0x00, 0x69, 0x70, 0x15, 0x3C, 0x0F, 0xF0, 0xDE, 0x5F, 0xCD,\n    0x1A, 0x17, 0x86, 0x2A, 0x58, 0xB5, 0x4B, 0x3E, 0xAB, 0x4D, 0x8D, 0x75, 0x4D, 0x40, 0x7F, 0x84,\n    0x1D, 0x19, 0x17, 0x1E, 0x41, 0x4C, 0xB9, 0xEF, 0x61, 0x46, 0x80, 0xAD, 0x5D, 0xDB, 0x01, 0x1E,\n    0x73, 0xED, 0x42, 0xDD, 0x35, 0x07, 0x8B, 0xD0, 0xEC, 0x2E, 0x77, 0x35, 0xB8, 0xFC, 0x2E, 0xE5,\n    0x8D, 0x30, 0x96, 0x0D, 0x88, 0x7F, 0x52, 0xE7, 0x6B, 0x11, 0xF0, 0xD2, 0x6A, 0x6F, 0x89, 0x66,\n    0x3F, 0x3A, 0x94, 0x98, 0x64, 0x0F, 0x0E, 0x77, 0xF2, 0x04, 0x96, 0xD9, 0xAA, 0x36, 0x0B, 0x39,\n    0xEE, 0x1F, 0x1D, 0x10, 0x23, 0xD0, 0xFA, 0x0B, 0xE1, 0x88, 0xED, 0x97, 0x73, 0xFF, 0xCC, 0xC8,\n    0xD6, 0x49, 0x4A, 0x24, 0xC1, 0x49, 0x78, 0x25, 0x7A, 0x26, 0xD4, 0x6A, 0x9E, 0x4C, 0x98, 0xFA,\n    0x90, 0xB4, 0xD4, 0x07, 0xA4, 0xD2, 0x5E, 0x8B, 0x6D, 0xB1, 0x03, 0xBD, 0xCE, 0x13, 0x3B, 0x3E,\n    0x78, 0x4F, 0xFE, 0xCB, 0xB6, 0x53, 0xB7, 0x27, 0xAA, 0xC4, 0x35, 0xCD, 0xD8, 0xD9, 0x96, 0x78,\n    0x9A, 0x1D, 0xE5, 0x97, 0xAC, 0xBE, 0x31, 0x8A, 0x77, 0x65, 0x67, 0x61, 0x3A, 0xF0, 0x0E, 0x04,\n    0x54, 0x1C, 0xE4, 0x5F, 0xED, 0x06, 0xBA, 0xFB, 0x34, 0x59, 0xB2, 0x91, 0x33, 0xED, 0xF4, 0x52,\n    0xFE, 0x42, 0xFB, 0xAE, 0xEF, 0x46, 0xE5, 0x01, 0x95, 0x6F, 0xB7, 0xE6, 0x8A, 0xEE, 0x45, 0xE5,\n    0xAF, 0x13, 0x8B, 0x76, 0x74, 0xC3, 0x31, 0x36, 0xD2, 0x84, 0x1C, 0xA9, 0x4D, 0xF1, 0x1E, 0xA7,\n    0x97, 0xF4, 0x4B, 0xD6, 0xA2, 0xF8, 0x90, 0x31, 0x2F, 0xCC, 0x70, 0x9F, 0x59, 0x98, 0x6F, 0x8F,\n    0x6F, 0x81, 0x44, 0x01, 0x70, 0x25, 0x6B, 0x6A, 0x86, 0xF9, 0x76, 0x87, 0x37, 0xDB, 0x23, 0x5A,\n    0xE1, 0x1B, 0x83, 0x8C, 0x87, 0x2C, 0x21, 0xC2, 0x8B, 0x76, 0x37, 0x1A, 0x5D, 0x96, 0xFB, 0x5B,\n    0x9E, 0xF7, 0xA3, 0xFD, 0x11, 0x8F, 0x87, 0x0A, 0xD5, 0xE2, 0x13, 0x33, 0xCC, 0x02, 0xB5, 0x9B,\n    0x31, 0x7F, 0x50, 0x4B, 0xED, 0x88, 0x74, 0xCF, 0x0A, 0x04, 0x2C, 0x92, 0xE2, 0xE7, 0x79, 0x00,\n    0x68, 0xFF, 0xC2, 0x5B, 0xA5, 0x76, 0x40, 0xD0, 0x63, 0x53, 0x39, 0x24, 0x48, 0xB2, 0x9F, 0x34,\n    0x76, 0xD1, 0x68, 0x75, 0x47, 0x0E, 0x51, 0x90, 0x01, 0x53, 0x05, 0x3E, 0x88, 0xE8, 0x1A, 0x10,\n    0x85, 0x52, 0x2D, 0x57, 0x12, 0x17, 0x83, 0x4D, 0x11, 0xBB, 0x63, 0x0E, 0x59, 0x61, 0xCA, 0xAC,\n    0x3F, 0xE0, 0x18, 0x04, 0x68, 0xDC, 0x7D, 0xC7, 0xD8, 0xF2, 0x5D, 0xB6, 0x7C, 0x86, 0x0C, 0x03,\n    0xD6, 0x7E, 0xA6, 0x2C, 0x01, 0x5F, 0x7E, 0xFF, 0x9B, 0x0C, 0x26, 0xA9, 0x9C, 0x5D, 0x9D, 0x00,\n    0xCD, 0x59, 0x4C, 0x3A, 0xD6, 0x82, 0x85, 0x8B, 0x65, 0x41, 0x85, 0x40, 0xE0, 0xE9, 0x0B, 0x93,\n    0xE5, 0x32, 0x24, 0xDB, 0x94, 0x74, 0x94, 0x07, 0x47, 0x1B, 0x01, 0x6E, 0x4B, 0x5D, 0x26, 0x31,\n    0x42, 0xBE, 0x38, 0x08, 0x2B, 0x19, 0xC1, 0x51, 0xCC, 0x51, 0xFC, 0x62, 0xFE, 0x09, 0x08, 0xD3,\n    0x58, 0x6C, 0x8A, 0x2D, 0x35, 0xDE, 0x82, 0xD6, 0x4F, 0xEB, 0x65, 0x9F, 0xA1, 0xC9, 0xC3, 0x7A,\n    0x70, 0x9F, 0xAA, 0xF3, 0x97, 0xF3, 0xE9, 0xFC, 0x3B, 0x84, 0x1D, 0xE5, 0x35, 0xA0, 0x05, 0xEE,\n    0xAB, 0x78, 0xDB, 0xF0, 0xAD, 0xEC, 0x1E, 0xE9, 0x86, 0x96, 0x46, 0x45, 0x44, 0xD5, 0x28, 0x7D,\n    0x83, 0xB0, 0x83, 0x69, 0xBC, 0x60, 0x5E, 0x14, 0x28, 0xCA, 0xA7, 0x3C, 0xEF, 0xDE, 0x74, 0x89,\n    0x6D, 0xBF, 0x1B, 0x8F, 0x59, 0x8E, 0x96, 0xD5, 0xCE, 0x19, 0x41, 0x92, 0x88, 0x2A, 0xE8, 0x1B,\n    0x1D, 0x9E, 0xC1, 0x34, 0x2C, 0x3E, 0x3F, 0xBC, 0x4F, 0x72, 0x61, 0x44, 0x21, 0xCA, 0x08, 0x26,\n    0x0D, 0x28, 0xDC, 0x3D, 0x6F, 0x33, 0x49, 0xE6, 0x8B, 0xE6, 0xDD, 0x09, 0x6B, 0x29, 0x8B, 0xAB,\n    0xF6, 0x2C, 0x23, 0x7E, 0x2B, 0x51, 0x63, 0x0F, 0x97, 0x25, 0xA1, 0x3C, 0x76, 0x39, 0x3B, 0xFB,\n    0x75, 0x62, 0xA4, 0xF5, 0xC6, 0x72, 0x5E, 0xBF, 0x38, 0xA1, 0x8D, 0xB3, 0x31, 0x0E, 0x02, 0x7A,\n    0x42, 0xDB, 0x92, 0xD0, 0x44, 0x85, 0x8F, 0x6E, 0x7B, 0xCA, 0xD4, 0xE1, 0x8B, 0xC9, 0x6A, 0xC2,\n    0x20, 0xF7, 0x67, 0x00, 0x39, 0xDA, 0xAA, 0xF9, 0x54, 0x77, 0xDB, 0x54, 0x76, 0x7B, 0x15, 0xBF,\n    0xE3, 0x8F, 0x7E, 0x75, 0x09, 0x50, 0x1D, 0x8A, 0x82, 0x91, 0xCA, 0x7E, 0xF3, 0x11, 0xB8, 0x1B,\n    0xA7, 0x11, 0x0F, 0x29, 0xA4, 0x32, 0xB7, 0xB4, 0x66, 0x5A, 0xCE, 0xC3, 0x70, 0xCA, 0x19, 0xF1,\n    0x75, 0x32, 0x18, 0xCD, 0x11, 0xCD, 0x29, 0x6F, 0x7D, 0x9D, 0x56, 0x17, 0x6F, 0xB2, 0x82, 0x75,\n    0x9B, 0xE5, 0x60, 0x5F, 0x98, 0xAF, 0x2A, 0x9A, 0xBA, 0x97, 0x90, 0xC5, 0x99, 0x73, 0xC0, 0xFD,\n    0x70, 0xA3, 0x14, 0xF7, 0xD8, 0xAF, 0xA4, 0x1C, 0xEC, 0x04, 0x27, 0xD5, 0xCB, 0x95, 0xAB, 0x1E,\n    0x1D, 0x01, 0x33, 0xDA, 0xC1, 0xF3, 0xF3, 0x14, 0x0E, 0xE9, 0x40, 0xCA, 0x8D, 0x16, 0xAF, 0x61,\n    0x4C, 0x5B, 0x98, 0x11, 0xFE, 0x39, 0x84, 0x08, 0x29, 0x0B, 0x3C, 0xD1, 0xC6, 0x80, 0xAB, 0x8B,\n    0x61, 0xD3, 0x36, 0x84, 0xAC, 0xBE, 0xD0, 0xC5, 0x5D, 0xD8, 0x7B, 0x9B, 0xF0, 0x72, 0xC0, 0x0C,\n    0xFD, 0x57, 0x57, 0x75, 0x31, 0x0D, 0x7D, 0x6E, 0xA4, 0xE8, 0xDC, 0x15, 0x73, 0x22, 0x00, 0x25,\n    0xCB, 0xCA, 0x54, 0x5A, 0xB3, 0x1D, 0x27, 0x52, 0xE5, 0xF8, 0xEA, 0xA5, 0xE7, 0x3E, 0x25, 0x8B,\n    0x58, 0x23, 0x93, 0xB6, 0x90, 0x62, 0x32, 0xD9, 0xAA, 0xEC, 0x37, 0xB6, 0xC3, 0xA0, 0x92, 0xE4,\n    0xFB, 0xFF, 0xB3, 0xF4, 0xBF, 0x90, 0x58, 0x51, 0x9F, 0xAC, 0xFD, 0xA7, 0x7B, 0xEA, 0x47, 0x67,\n    0x5B, 0x5D, 0x1A, 0x1D, 0xED, 0xC8, 0x80, 0x19, 0x86, 0x97, 0x7D, 0x8E, 0x70, 0x1E, 0x5B, 0xF1,\n    0x04, 0x21, 0xA0, 0x41, 0xBE, 0x6A, 0x6E, 0x0D, 0x31, 0x62, 0xB7, 0xE9, 0x9F, 0xCF, 0x09, 0xC2,\n    0xC0, 0xC0, 0xA8, 0xE2, 0x9A, 0x01, 0xDB, 0x0C, 0x8B, 0xC3, 0x04, 0xD3, 0xE6, 0xAE, 0x51, 0xCD,\n    0xA8, 0x75, 0x51, 0xC9, 0x85, 0x87, 0x38, 0x5B, 0x6F, 0xD6, 0x7C, 0x2C, 0x56, 0x7B, 0xE3, 0x90,\n    0x72, 0xC4, 0x17, 0x4D, 0x61, 0xE8, 0x82, 0x04, 0xB4, 0x54, 0x27, 0xA1, 0xEA, 0x75, 0xB7, 0x3A,\n    0xA7, 0x51, 0x43, 0xB4, 0x0C, 0xC8, 0xFB, 0x7D, 0xBD, 0x47, 0x43, 0xDC, 0xE1, 0x60, 0x09, 0x94,\n    0xF1, 0xDA, 0x45, 0x6F, 0x57, 0xFB, 0x66, 0xEF, 0xA4, 0x14, 0x6F, 0x7A, 0xAD, 0xAA, 0xE2, 0x85,\n    0x3D, 0xC5, 0xF5, 0x14, 0xEB, 0x7B, 0x68, 0xAE, 0x41, 0xDF, 0xB6, 0xDD, 0x83, 0x14, 0x83, 0xAF,\n    0x54, 0xF8, 0x34, 0xEA, 0x01, 0x61, 0x8D, 0x9B, 0xCC, 0xE9, 0xDB, 0x81, 0x68, 0xC2, 0x6F, 0xD2,\n    0xAB, 0xF9, 0xF2, 0xC0, 0xF1, 0x29, 0x7A, 0x47, 0x4F, 0x52, 0x51, 0xDB, 0xDA, 0x1C, 0xD3, 0x5C,\n    0xE8, 0x2A, 0x68, 0xFF, 0x99, 0xD1, 0x6D, 0xE8, 0xA1, 0x90, 0x17, 0x1A, 0x2C, 0x7D, 0xB3, 0x1D,\n    0x8E, 0xF6, 0x84, 0xE2, 0x3F, 0x1A, 0xD0, 0x3D, 0xE8, 0x51, 0x7B, 0xEA, 0x3E, 0xFF, 0x2B, 0x25,\n    0xB7, 0x27, 0x3D, 0xA0, 0x2E, 0x10, 0xD8, 0x1C, 0x99, 0xA4, 0xE0, 0x78, 0xA3, 0x30, 0x8E, 0x1E,\n    0xD2, 0xE4, 0xA1, 0x08, 0x0E, 0x9F, 0x60, 0x22, 0xDE, 0xB3, 0x8C, 0x0F, 0xAE, 0x97, 0x21, 0x35,\n    0xDC, 0x8E, 0x0D, 0x65, 0x99, 0xFA, 0xAC, 0x46, 0x79, 0x97, 0xEC, 0x58, 0x7E, 0x42, 0x45, 0x58,\n    0x33, 0xAF, 0x2D, 0xE4, 0x45, 0x9F, 0x54, 0x93, 0x34, 0xCB, 0xAD, 0x10, 0xD6, 0x61, 0x33, 0xB8,\n    0x5B, 0xCF, 0xB3, 0xF4, 0x68, 0x16, 0xA5, 0x98, 0x54, 0x75, 0x95, 0x8C, 0xCD, 0xCF, 0x74, 0x29,\n    0x7F, 0xB5, 0xF7, 0xC9, 0x56, 0x6E, 0x5B, 0xFF, 0xEA, 0xCB, 0x8A, 0x53, 0x1E, 0x78, 0xA3, 0x25,\n    0x68, 0x15, 0xE4, 0xD3, 0xC4, 0xDF, 0x93, 0x6E, 0xC8, 0xAA, 0x53, 0xFA, 0x3C, 0x60, 0xAC, 0x0D,\n    0xA2, 0x01, 0xF6, 0x36, 0x1E, 0x80, 0x61, 0xE1, 0x89, 0x29, 0xDC, 0x0B, 0xC4, 0x0D, 0xB7, 0x8A,\n    0xD2, 0xB2, 0x7C, 0xAD, 0x47, 0xB5, 0xE0, 0x1F, 0x48, 0x21, 0x55, 0xAA, 0x5F, 0x7D, 0x85, 0x48,\n    0xE8, 0xD6, 0x19, 0xBE, 0xE6, 0x9C, 0x61, 0x8F, 0x89, 0x35, 0x49, 0x6D, 0x2E, 0x8B, 0x46, 0x1B,\n    0xCB, 0xD8, 0x06, 0x83, 0x8B, 0x70, 0xED, 0x66, 0x17, 0xAD, 0x2C, 0xF6, 0xC8, 0xF3, 0x1E, 0xE2,\n    0xCA, 0xDA, 0x04, 0xAA, 0xD4, 0xA0, 0xA6, 0x8B, 0xCC, 0x19, 0xF1, 0x87, 0x93, 0x3A, 0x69, 0xEE,\n    0x82, 0x75, 0x71, 0x8B, 0x8E, 0xFD, 0x39, 0x4A, 0x9D, 0x95, 0x07, 0x80, 0x4E, 0xF6, 0x25, 0xFA,\n    0x9C, 0x68, 0xF1, 0xA6, 0x84, 0x28, 0x8C, 0x47, 0xFB, 0xCC, 0xE5, 0x7A, 0x2B, 0xAC, 0x3B, 0x58,\n    0xEE, 0x51, 0x31, 0x18, 0x6F, 0xFD, 0x5A, 0xE4, 0xFE, 0x80, 0x75, 0x92, 0x67, 0xF1, 0xF9, 0x78,\n    0x73, 0xF1, 0x52, 0x4E, 0x9F, 0xFE, 0xA7, 0x18, 0x99, 0x48, 0x74, 0xE3, 0x94, 0x70, 0x1A, 0x9F,\n    0xCD, 0x15, 0x31, 0xB3, 0x68, 0x4C, 0xFA, 0xED, 0x44, 0xC2, 0x8D, 0x71, 0xC0, 0xC2, 0x1B, 0x39,\n    0x97, 0xE2, 0xFF, 0xA5, 0x4E, 0x07, 0xF1, 0xA7, 0xFF, 0xBF, 0x85, 0x79, 0x00, 0x29, 0x62, 0xB7,\n    0x0F, 0xF9, 0x6A, 0xE5, 0xFE, 0x09, 0xE2, 0x2B, 0x76, 0x74, 0xF6, 0x40, 0xBE, 0x64, 0xE9, 0xD4,\n    0x27, 0x74, 0x6F, 0xEC, 0xDD, 0xBC, 0x53, 0xCD, 0x9F, 0x16, 0x6B, 0x92, 0xAE, 0x59, 0x9E, 0x74,\n    0x72, 0x18, 0xA5, 0x68, 0xE0, 0xA0, 0xAE, 0x06, 0xDB, 0xC4, 0xE5, 0x34, 0x37, 0x87, 0xAD, 0x80,\n    0x2B, 0x0F, 0x84, 0x37, 0x99, 0x96, 0x9D, 0xEF, 0x87, 0x3C, 0xED, 0x7A, 0xD9, 0xAA, 0xB8, 0xC8,\n    0x7A, 0xD4, 0xD0, 0x2A, 0xD7, 0xDA, 0xEC, 0x0B, 0x85, 0x8A, 0x93, 0x84, 0x38, 0x2D, 0x3F, 0x6B,\n    0xE1, 0x8A, 0x88, 0x5D, 0x4C, 0x26, 0x69, 0xF5, 0x43, 0x55, 0xB1, 0x32, 0xB2, 0x78, 0x67, 0x39,\n    0xC3, 0x64, 0x4A, 0x6A, 0x5B, 0xA3, 0x7A, 0xBC, 0x8A, 0x0A, 0x76, 0xDB, 0x69, 0x09, 0x66, 0x2C,\n    0x2F, 0xD9, 0x30, 0x0B, 0x4E, 0xB0, 0x71, 0x5E, 0xDE, 0x48, 0x58, 0x6A, 0x10, 0x6B, 0xB1, 0x6D,\n    0xF8, 0xB3, 0xF9, 0xD9, 0x24, 0x43, 0x0C, 0xB9, 0xAE, 0xB7, 0x9B, 0x76, 0x3A, 0xB3, 0xF1, 0x68,\n    0x0A, 0xD4, 0xE5, 0xEC, 0x30, 0x8D, 0x19, 0xD0, 0x19, 0x42, 0x42, 0xF4, 0xD2, 0xF0, 0x3D, 0x40,\n    0x4E, 0xF0, 0x52, 0x8C, 0x9D, 0x77, 0xE4, 0x5B, 0x04, 0x12, 0x4C, 0x08, 0xC3, 0xF6, 0x9A, 0x58,\n    0x20, 0x40, 0x4B, 0x06, 0x8B, 0x1C, 0xD6, 0x0E, 0x7D, 0x2C, 0x8A, 0x9F, 0xEC, 0x25, 0xF0, 0x66,\n    0x91, 0x34, 0xBE, 0xB9, 0x27, 0x02, 0xFE, 0x9C, 0x1C, 0x3D, 0x8A, 0xD9, 0x0C, 0x64, 0x98, 0xE1,\n    0x2C, 0x9F, 0x25, 0xE9, 0x0A, 0xB7, 0xA4, 0xE7, 0xE1, 0x59, 0x51, 0x2A, 0xC0, 0xBF, 0x63, 0x80,\n    0xEE, 0x71, 0x25, 0xD2, 0xCA, 0x3E, 0x23, 0xA2, 0x0A, 0x5D, 0x53, 0xD5, 0x38, 0xC6, 0x7E, 0xB2,\n    0xD6, 0xA1, 0xB0, 0x1F, 0xD0, 0xDA, 0xA7, 0x59, 0x33, 0xF4, 0x43, 0x0A, 0x9E, 0xCB, 0x95, 0x5C,\n    0x52, 0xD5, 0x34, 0x9E, 0x52, 0xAC, 0xC1, 0x36, 0x84, 0x1F, 0x62, 0x1D, 0x86, 0xD6, 0xBD, 0x56,\n    0x9F, 0xCC, 0xAF, 0x30, 0xC0, 0x39, 0x28, 0x22, 0xDB, 0xDA, 0xD5, 0x4C, 0x4F, 0x1B, 0x36, 0x1D,\n    0x1D, 0xAC, 0xF4, 0x98, 0xF5, 0x46, 0x94, 0x32, 0x80, 0x2B, 0xF8, 0x14, 0xF0, 0x68, 0x91, 0x1E,\n    0xF6, 0x72, 0x1C, 0x4A, 0xF9, 0xD6, 0xC2, 0xA6, 0x3A, 0x85, 0xE9, 0xE1, 0x76, 0xB5, 0xA0, 0xEA,\n    0x46, 0x6A, 0x2C, 0xF8, 0x8B, 0x8D, 0x0C, 0xD0, 0x1F, 0x4F, 0xD9, 0x38, 0x5B, 0xFE, 0x6E, 0x59,\n    0xA3, 0xB8, 0xA4, 0x68, 0xED, 0x03, 0x4A, 0x06, 0xD3, 0xC1, 0xCD, 0x02, 0x95, 0x24, 0x5C, 0x3D,\n    0x3B, 0xEC, 0x5A, 0x1C, 0x46, 0xD6, 0x1B, 0xA5, 0x42, 0xFD, 0x2E, 0xE7, 0xEA, 0x42, 0x98, 0x42,\n    0x53, 0xB5, 0xD9, 0xCE, 0x53, 0xC1, 0x8F, 0x83, 0x4D, 0xB2, 0xB6, 0x9F, 0x8F, 0xB1, 0x88, 0x4D,\n    0x45, 0x3D, 0x08, 0x01, 0x9A, 0x28, 0x7B, 0x10, 0x97, 0x6C, 0x76, 0x44, 0xE1, 0x07, 0x04, 0x51,\n    0x0E, 0x4A, 0xC7, 0x98, 0xED, 0x86, 0x17, 0x69, 0x90, 0x14, 0xA9, 0xD8, 0xB7, 0x07, 0x28, 0x4A,\n    0x77, 0x0B, 0xF9, 0x3F, 0x27, 0x4F, 0xCF, 0xA9, 0xDA, 0xCE, 0xC4, 0xDA, 0x30, 0x09, 0x56, 0x64,\n    0x55, 0xCE, 0xD6, 0xEA, 0xE4, 0x85, 0x92, 0x95, 0x3E, 0x12, 0x5B, 0xF4, 0x21, 0x91, 0xCB, 0xD9,\n    0xFB, 0xB7, 0x38, 0xBB, 0x1D, 0xFB, 0xAD, 0xE9, 0x55, 0x40, 0x9D, 0xF3, 0x30, 0xC5, 0xA4, 0x9E,\n    0x02, 0xA8, 0x9B, 0x6E, 0x30, 0x07, 0x32, 0x16, 0xD9, 0xEB, 0x85, 0x55, 0xC8, 0x38, 0xBC, 0x84,\n    0x9A, 0x9D, 0x61, 0x1C, 0x0D, 0xF5, 0x07, 0x06, 0xC8, 0x0B, 0x73, 0xC1, 0xB8, 0xD2, 0x84, 0xC2,\n    0xAF, 0xCA, 0xB2, 0x88, 0x0A, 0xE4, 0x79, 0x84, 0x5C, 0x8B, 0xF7, 0xB6, 0xC4, 0x47, 0x92, 0xC9,\n    0xC1, 0xBD, 0xF6, 0x84, 0x78, 0xC2, 0x74, 0xC3, 0xF8, 0x3C, 0x3F, 0xD6, 0x0E, 0x02, 0x5D, 0x22,\n    0x42, 0x7D, 0xD3, 0xB8, 0xE9, 0xBB, 0x91, 0x36, 0x32, 0x81, 0xDD, 0x89, 0xCD, 0x41, 0x00, 0x37,\n    0x4F, 0xA1, 0x48, 0x03, 0x2F, 0x3D, 0x54, 0x38, 0x17, 0x7C, 0x51, 0x40, 0x9A, 0x41, 0x57, 0x3C,\n    0xF4, 0x5E, 0x0D, 0xF6, 0xA4, 0xE4, 0xA2, 0x97, 0x30, 0x71, 0x40, 0xC3, 0x20, 0x88, 0xEE, 0x95,\n    0x7A, 0xB9, 0x03, 0x9D, 0x54, 0x10, 0xD1, 0x5B, 0xBC, 0x6D, 0x79, 0xFE, 0xF4, 0x44, 0x9C, 0xCB,\n    0x1E, 0xAF, 0x0C, 0x6B, 0xB7, 0x17, 0x60, 0x91, 0x46, 0x1F, 0x9A, 0xA9, 0xD8, 0x84, 0x0D, 0x49,\n    0x60, 0x4A, 0x48, 0xDD, 0x73, 0x1E, 0xDD, 0x17, 0xAD, 0xB8, 0x3C, 0x8A, 0xB3, 0xD3, 0x4C, 0x3C,\n    0x97, 0xE3, 0xD0, 0x0A, 0x8D, 0x83, 0x7E, 0x3F, 0xE2, 0x03, 0xD1, 0xD3, 0x93, 0xA3, 0xFF, 0x3B,\n    0x12, 0x65, 0x36, 0xF3, 0x27, 0xC1, 0x05, 0x27, 0xA2, 0x03, 0x71, 0x7C, 0xBD, 0xEC, 0xDB, 0xE4,\n    0x3B, 0x33, 0x5F, 0x93, 0xB5, 0x41, 0xAC, 0xF8, 0x6D, 0xD7, 0xCB, 0x06, 0x33, 0x9A, 0x25, 0x2E,\n    0xF6, 0x2F, 0xF4, 0x34, 0x6F, 0x5A, 0x05, 0xDD, 0x04, 0x95, 0x33, 0x67, 0x45, 0xD8, 0xD5, 0xD5,\n    0xEA, 0xC8, 0x2F, 0x9B, 0xC3, 0xBE, 0xED, 0xCA, 0xC0, 0xCF, 0xB6, 0xFC, 0x7C, 0x88, 0x37, 0x1A,\n    0x7D, 0xDA, 0x9B, 0x0E, 0xFC, 0x30, 0xD9, 0x17, 0xF3, 0x4C, 0x14, 0xF3, 0xDA, 0xF2, 0xCF, 0xCD,\n    0x8A, 0x46, 0x23, 0xDA, 0x76, 0xC5, 0xF9, 0x06, 0xB9, 0x79, 0xD3, 0x1A, 0xD2, 0xA8, 0x11, 0x03,\n    0x5D, 0x79, 0xA9, 0xA0, 0x93, 0x15, 0xC8, 0x27, 0xC2, 0xD9, 0x7F, 0x78, 0x3E, 0x84, 0xD4, 0x37,\n    0x38, 0x52, 0x97, 0xD8, 0x58, 0x67, 0x6A, 0x13, 0x00, 0x00, 0x20, 0xFB, 0xF2, 0xBD, 0x52, 0x71,\n    0xE6, 0x1C, 0x6C, 0x99, 0xF6, 0xDE, 0x72, 0x89, 0xCC, 0x92, 0x57, 0x13, 0x52, 0x04, 0x88, 0xE7,\n    0xA5, 0xBC, 0x36, 0x46, 0x3C, 0x03, 0x59, 0xFE, 0x86, 0x99, 0xBC, 0x40, 0x70, 0xE9, 0xF1, 0xAA,\n    0xCC, 0x4E, 0x16, 0xD2, 0x4B, 0x55, 0xC0, 0x42, 0x43, 0x3D, 0xF1, 0x1A, 0x38, 0xB9, 0x4F, 0x9E,\n    0x31, 0x4E, 0x86, 0x08, 0x57, 0x95, 0x2D, 0xFB, 0xD7, 0x12, 0xC4, 0x11, 0xC0, 0x5D, 0x00, 0xD0,\n    0xB5, 0x8D, 0xEA, 0x8F, 0x66, 0xD3, 0x00, 0x17, 0x80, 0x1A, 0x54, 0x0F, 0xDE, 0x75, 0x40, 0xD5,\n    0x1B, 0x64, 0x89, 0x96, 0xF9, 0x9A, 0x0D, 0x70, 0x26, 0x50, 0x31, 0x3A, 0x3C, 0x0F, 0x5E, 0xC8,\n    0xA3, 0xB8, 0x5D, 0x72, 0xDC, 0xBA, 0xB2, 0xEF, 0x58, 0x89, 0x52, 0x55, 0xF7, 0x9A, 0x17, 0xE7,\n    0x43, 0xC2, 0x0F, 0x3A, 0x16, 0x75, 0xEB, 0x48, 0x87, 0x2A, 0xF8, 0x0E, 0xBA, 0xBB, 0x0D, 0xA2,\n    0x6C, 0x37, 0x71, 0x50, 0xA4, 0xB8, 0x3F, 0x77, 0x2A, 0xDE, 0x12, 0x1B, 0x87, 0x39, 0x91, 0x40,\n    0xA9, 0x62, 0x93, 0x87, 0x59, 0x8F, 0x1F, 0x9E, 0x27, 0xD6, 0x5F, 0xA9, 0x45, 0x67, 0xBC, 0x8C,\n    0xE2, 0x84, 0x4C, 0x28, 0x0A, 0x7D, 0xBF, 0xC0, 0x08, 0x1C, 0x72, 0x87, 0x93, 0xC4, 0xA5, 0x88,\n    0xFF, 0xD9, 0x29, 0x62, 0xC9, 0x2F, 0x9D, 0x96, 0x44, 0x77, 0xC1, 0x9E, 0xF4, 0xDF, 0x37, 0x5D,\n    0x05, 0x2F, 0xD8, 0x4A, 0x46, 0x5D, 0xB2, 0x0C, 0xBE, 0x28, 0xA4, 0x15, 0x6B, 0xC0, 0xE4, 0x9A,\n    0xFB, 0xAE, 0xCB, 0x1F, 0x14, 0x3F, 0x63, 0x65, 0x24, 0xD2, 0x49, 0x49, 0x90, 0x31, 0xBF, 0x6F,\n    0x4F, 0x83, 0xE0, 0xDB, 0xF0, 0x0A, 0xA0, 0x7E, 0x45, 0x7F, 0x15, 0x86, 0x4A, 0x00, 0x06, 0x52,\n    0xCE, 0x94, 0x81, 0x55, 0x48, 0x99, 0xF8, 0x2C, 0xD5, 0x18, 0x98, 0xF5, 0xB7, 0x5C, 0x71, 0x11,\n    0x19, 0xAB, 0x7D, 0xAD, 0x35, 0x61, 0x2B, 0x00, 0x00, 0x80, 0xF0, 0x33, 0xF2, 0x4A, 0x77, 0x44,\n    0xF2, 0x79, 0xA5, 0xE1, 0x53, 0xEE, 0x84, 0x18, 0x8C, 0x1F, 0x43, 0xA5, 0xF6, 0xA7, 0x3E, 0x73,\n    0x89, 0x42, 0x9B, 0x45, 0xA6, 0x23, 0x09, 0x8B, 0x28, 0x02, 0xF4, 0x52, 0xBA, 0x2D, 0x9A, 0x3A,\n    0xBC, 0x50, 0x8A, 0x6D, 0xD4, 0x0D, 0x19, 0xAC, 0x7F, 0x04, 0x99, 0xFC, 0x5C, 0x15, 0xD7, 0x30,\n    0x9E, 0xDE, 0xCB, 0x61, 0x89, 0x54, 0x37, 0x6A, 0x9E, 0x21, 0x62, 0x5E, 0x28, 0x4E, 0xCE, 0x41,\n    0x7D, 0x50, 0xFC, 0x99, 0xB0, 0x43, 0x86, 0x4A, 0xAD, 0x2C, 0x1C, 0xFC, 0x36, 0xF4, 0x16, 0x8A,\n    0x23, 0x88, 0xB8, 0x32, 0xB0, 0x53, 0x3F, 0x50, 0xDB, 0x04, 0x20, 0x91, 0x9C, 0xA9, 0x71, 0x57,\n    0xAB, 0x89, 0xE7, 0xA0, 0xAF, 0x65, 0xE4, 0xDF, 0x19, 0x7D, 0x1C, 0x95, 0xEB, 0x76, 0x9A, 0x1E,\n    0x89, 0xEE, 0x44, 0x2D, 0xCA, 0xAF, 0x63, 0x32, 0x1B, 0xA6, 0x0C, 0x0A, 0xA0, 0x9D, 0x75, 0xFB,\n    0x98, 0x68, 0x44, 0xC7, 0x31, 0x4E, 0xA4, 0x39, 0xE4, 0x74, 0xD6, 0xBB, 0xE4, 0x21, 0x6F, 0xAD,\n    0x57, 0x54, 0x2C, 0x9F, 0x35, 0x01, 0xF1, 0x0A, 0xE1, 0x07, 0xF5, 0x61, 0x60, 0x0C, 0xF8, 0x9B,\n    0x85, 0xE9, 0xC4, 0xBB, 0xBD, 0xEC, 0x45, 0x5B, 0xDD, 0x0B, 0xED, 0x0F, 0x55, 0x54, 0x7B, 0x50,\n    0xDB, 0xC7, 0xAC, 0x05, 0x16, 0x5E, 0x55, 0x9C, 0x83, 0xB2, 0x6D, 0x95, 0x59, 0x3B, 0xCA, 0xB5,\n    0x1B, 0x81, 0x4D, 0xC6, 0xC3, 0x8B, 0x20, 0x95, 0x5C, 0xE6, 0x03, 0xBF, 0xF8, 0xA7, 0x16, 0x8B,\n    0x49, 0x63, 0xDD, 0x71, 0x15, 0x8B, 0x66, 0xA2, 0xAB, 0x47, 0x06, 0x74, 0xB5, 0xA8, 0xC4, 0x49,\n    0x31, 0x4F, 0xFF, 0x08, 0x08, 0xB2, 0x2F, 0x9E, 0x6D, 0x13, 0xDD, 0xCB, 0x53, 0xB0, 0x47, 0x61,\n    0x49, 0x47, 0x10, 0xFF, 0x87, 0xB0, 0x10, 0xD9, 0x21, 0xBD, 0x0F, 0x03, 0x98, 0x3B, 0x07, 0xC5,\n    0xC4, 0x65, 0x39, 0x76, 0xCC, 0x44, 0x60, 0xCC, 0x79, 0x7B, 0x56, 0x37, 0xFE, 0x31, 0xBB, 0xFB,\n    0x88, 0x82, 0xCD, 0xA4, 0xA0, 0xED, 0x2F, 0x0A, 0xF8, 0x74, 0x4A, 0x6F, 0xC3, 0xB9, 0x11, 0x76,\n    0x0A, 0xEA, 0x0F, 0x1C, 0xFC, 0x6A, 0x49, 0x6A, 0x39, 0x32, 0xF8, 0x5C, 0x40, 0x1A, 0xA5, 0xED,\n    0x72, 0x58, 0x6B, 0xD6, 0xA3, 0x53, 0x11, 0x82, 0xB8, 0x78, 0x85, 0x38, 0xD8, 0xFD, 0x18, 0x8B,\n    0xDF, 0x0E, 0x62, 0xAF, 0x6B, 0xE4, 0x5F, 0x43, 0x55, 0x53, 0xB7, 0xAA, 0x43, 0x33, 0x89, 0xA8,\n    0x67, 0x6E, 0xD8, 0x0A, 0xCC, 0x1F, 0x89, 0xDA, 0xA4, 0x16, 0xA2, 0xE0, 0xBA, 0xF5, 0x20, 0x10,\n    0x05, 0x42, 0x00, 0xAD, 0x39, 0x49, 0xE9, 0x3D, 0x0A, 0xDF, 0x7E, 0x65, 0x14, 0xAF, 0xA8, 0x5E,\n    0xD9, 0xC2, 0x16, 0x4F, 0x07, 0x18, 0xA0, 0xAD, 0x2C, 0xD8, 0x19, 0x6D, 0x11, 0x93, 0x63, 0xD7,\n    0x6D, 0x05, 0xA9, 0xDB, 0xBA, 0x02, 0xC8, 0x10, 0x6A, 0xA5, 0x4F, 0x35, 0xC4, 0x35, 0x74, 0xC5,\n    0xBF, 0x40, 0x71, 0x92, 0xDB, 0x26, 0xB6, 0xEB, 0xD8, 0x17, 0x34, 0x95, 0xEE, 0x3A, 0xF6, 0x30,\n    0x48, 0x6C, 0xAD, 0x88, 0x82, 0x22, 0x48, 0x9B, 0xA3, 0xDE, 0x5A, 0x47, 0xEB, 0x80, 0x4C, 0x70,\n    0xFF, 0x7B, 0x7C, 0xD9, 0xD7, 0x7E, 0x08, 0x74, 0x8F, 0xC5, 0x14, 0xBC, 0xC0, 0x4B, 0xF2, 0x3F,\n    0xFF, 0x52, 0xBC, 0x23, 0xFB, 0x30, 0xA9, 0x2E, 0x7A, 0x93, 0x16, 0x73, 0x99, 0xF4, 0xE5, 0xB7,\n    0x5F, 0x01, 0xDD, 0x96, 0x1A, 0xDB, 0x36, 0x74, 0xBE, 0xD4, 0xAB, 0xE2, 0x16, 0x24, 0xB2, 0x0E,\n    0x36, 0x46, 0x36, 0x8C, 0x92, 0xB7, 0x79, 0x5E, 0x83, 0x37, 0x6A, 0x1A, 0x15, 0xCE, 0x6D, 0x61,\n    0xEA, 0x9D, 0xE6, 0x65, 0x27, 0xD7, 0xB3, 0xF4, 0x6D, 0x55, 0xB8, 0xC0, 0x42, 0x4C, 0xE8, 0x36,\n    0x1A, 0x0A, 0x21, 0x68, 0xB3, 0x17, 0xB1, 0xEA, 0x8D, 0x5C, 0x50, 0xBE, 0xC4, 0x49, 0xC5, 0x7D,\n    0x19, 0x83, 0xF8, 0x02, 0x78, 0xAE, 0x3A, 0x5A, 0xB9, 0xA3, 0xA2, 0x0E, 0xCC, 0x10, 0x36, 0x49,\n    0x84, 0x44, 0xA3, 0xFE, 0x5B, 0x56, 0x5C, 0x13, 0x43, 0xDD, 0x90, 0x29, 0x67, 0x9B, 0x3E, 0xD3,\n    0x9B, 0x68, 0xA7, 0xAE, 0x52, 0x9C, 0x38, 0xF8, 0xF1, 0x10, 0xB7, 0x19, 0x75, 0x43, 0x27, 0x75,\n    0x7F, 0x32, 0x40, 0x40, 0xDB, 0xD2, 0x71, 0x35, 0x45, 0x6C, 0x5B, 0x47, 0x84, 0x57, 0x49, 0x75,\n    0xEB, 0x75, 0xDE, 0x93, 0xB2, 0xA7, 0x99, 0x65, 0xB1, 0x34, 0xA7, 0xB7, 0x67, 0x21, 0x95, 0x56,\n    0x28, 0xF4, 0x16, 0xF6, 0xA5, 0x86, 0x04, 0x65, 0x44, 0x48, 0xDE, 0x02, 0xE4, 0x08, 0x6F, 0x57,\n    0xA3, 0xE1, 0x45, 0x68, 0xC2, 0x9C, 0x96, 0xFD, 0xCB, 0x5B, 0x1D, 0xDF, 0xB5, 0x52, 0xAC, 0xB4,\n    0xE4, 0x2D, 0x33, 0x76, 0x3C, 0x55, 0x8A, 0xD7, 0xD9, 0x65, 0xBD, 0x44, 0x27, 0x4F, 0x7B, 0x48,\n    0x05, 0xD5, 0x3D, 0xB8, 0x87, 0x7E, 0x49, 0xE6, 0x99, 0x12, 0x27, 0xDA, 0x8E, 0xC9, 0x49, 0x4F,\n    0xFC, 0x61, 0xD4, 0x8C, 0x63, 0xD1, 0x25, 0x8B, 0x09, 0xA1, 0x21, 0x96, 0xDC, 0xFF, 0x7A, 0x5F,\n    0x99, 0xBE, 0xBC, 0x04, 0x0B, 0xD1, 0x0E, 0x44, 0xCE, 0x2C, 0xA1, 0x3C, 0x8F, 0x49, 0xD9, 0xA1,\n    0xD4, 0x4D, 0x8E, 0x2B, 0x3E, 0xB4, 0x2F, 0x59, 0xDB, 0x71, 0x8A, 0xA5, 0x85, 0xD8, 0x31, 0x6A,\n    0xD3, 0xEE, 0xBD, 0x32, 0x9D, 0xCA, 0x55, 0x19, 0x6A, 0x7F, 0x43, 0xE0, 0x5B, 0x91, 0x14, 0x4B,\n    0x0C, 0xD2, 0xA1, 0xDA, 0xE8, 0x73, 0xF1, 0x24, 0xB9, 0xEA, 0x69, 0x77, 0xE4, 0x2A, 0x7D, 0xC4,\n    0xD2, 0xB0, 0x7F, 0xAB, 0x28, 0xB1, 0xD0, 0x34, 0xF1, 0x89, 0x18, 0x57, 0xB0, 0x65, 0x50, 0x3D,\n    0x5E, 0x81, 0xE5, 0xEE, 0xBF, 0xD1, 0x58, 0x1E, 0xC6, 0xA1, 0xCF, 0xD7, 0x31, 0x4A, 0x5D, 0x78,\n    0xC6, 0xED, 0x7F, 0xCC, 0xC4, 0xBD, 0xFB, 0x6D, 0xF6, 0xEE, 0x26, 0xF7, 0xA6, 0xBE, 0x08, 0x6A,\n    0xAD, 0x03, 0x24, 0xE0, 0x79, 0x24, 0xD0, 0xC1, 0xE9, 0x9A, 0xAF, 0x94, 0x3F, 0x10, 0x2E, 0xC8,\n    0x93, 0x34, 0x08, 0x70, 0xFF, 0x2F, 0x32, 0x66, 0xAF, 0x19, 0xFD, 0xFE, 0xEC, 0x24, 0x44, 0x79,\n    0x30, 0x41, 0x21, 0x49, 0xC0, 0xEF, 0x30, 0x59, 0xC5, 0x5B, 0xBA, 0x04, 0xAB, 0x03, 0x2F, 0x50,\n    0x55, 0xF5, 0x48, 0x9F, 0x46, 0x98, 0xF3, 0xC1, 0xDC, 0xFE, 0x8F, 0xE9, 0x59, 0x9F, 0x49, 0xB6,\n    0x6D, 0x53, 0x9F, 0x05, 0x3E, 0xED, 0xCE, 0xAE, 0x4F, 0xE8, 0x38, 0xE6, 0x0F, 0x55, 0x96, 0xD2,\n    0x53, 0x72, 0x6C, 0x80, 0x78, 0xFB, 0x7C, 0xDD, 0xD0, 0x2E, 0x23, 0x1B, 0x65, 0x08, 0xF2, 0x76,\n    0x7C, 0x34, 0x6A, 0xDC, 0xA0, 0xFB, 0xEC, 0xDF, 0x45, 0x1C, 0x53, 0x6B, 0xFD, 0x2C, 0x96, 0x3D,\n    0xF4, 0x29, 0x4C, 0xF8, 0x92, 0x9E, 0xC4, 0x6B, 0x97, 0xCD, 0x16, 0x4D, 0xAB, 0xBC, 0x12, 0xED,\n    0x32, 0x8C, 0xAA, 0x94, 0xEC, 0x3E, 0xF2, 0xEC, 0x24, 0x35, 0xD0, 0x97, 0xC9, 0x1E, 0x4C, 0x57,\n    0xF3, 0xC5, 0x3D, 0xE9, 0x11, 0x6B, 0xB0, 0x66, 0xB4, 0x45, 0xE4, 0x4C, 0xE3, 0x5C, 0xFA, 0x24,\n    0x0F, 0x70, 0x09, 0xB5, 0xF5, 0x5B, 0x80, 0xBD, 0x0B, 0x14, 0xB4, 0xF5, 0x9B, 0x51, 0x10, 0x6D,\n    0xB8, 0x29, 0x6F, 0x74, 0x89, 0x89, 0x0E, 0x26, 0x08, 0xBF, 0x3E, 0xC2, 0xD5, 0x30, 0x1D, 0xAC,\n    0x33, 0x19, 0x10, 0x32, 0x5E, 0xCB, 0x9A, 0x50, 0x52, 0xB4, 0x8F, 0xC8, 0xA1, 0x44, 0xB8, 0x2E,\n    0x8B, 0x0D, 0x67, 0x1E, 0x8F, 0x31, 0x03, 0x99, 0x96, 0xB2, 0x76, 0xF2, 0xC7, 0xDF, 0xC3, 0x55,\n    0x52, 0xE3, 0x17, 0xF1, 0xDF, 0x75, 0x60, 0xB0, 0x48, 0xF8, 0xC1, 0xDC, 0xB2, 0xFC, 0x8A, 0x17,\n    0x6A, 0xED, 0x58, 0x33, 0x02, 0x24, 0x07, 0x86, 0xD4, 0xC0, 0xD9, 0x96, 0x3E, 0x05, 0x10, 0x78,\n    0x5D, 0x69, 0x56, 0x7F, 0x1D, 0x08, 0x20, 0x49, 0x6E, 0x4F, 0x2A, 0x0B, 0xE6, 0xFD, 0x1E, 0x32,\n    0x08, 0x07, 0x62, 0xA7, 0x9C, 0xD5, 0x34, 0xF0, 0x37, 0x13, 0x8E, 0x43, 0x10, 0x9D, 0xF9, 0x51,\n    0x38, 0xBB, 0x5F, 0x61, 0x0A, 0x18, 0xD4, 0xA4, 0xFB, 0x60, 0x93, 0xED, 0x0A, 0x6F, 0x99, 0x89,\n    0xD6, 0x63, 0x5C, 0x15, 0x6F, 0x93, 0xD8, 0xB1, 0xF2, 0x95, 0x11, 0xDE, 0x20, 0xA2, 0xEE, 0x1E,\n    0x84, 0xDA, 0x3F, 0xF1, 0xE6, 0x10, 0xA4, 0xA8, 0x2F, 0xF1, 0x6E, 0x2A, 0x07, 0x4D, 0x8D, 0xE6,\n    0x39, 0x96, 0x8A, 0xCC, 0x00, 0x33, 0x3F, 0x0C, 0x77, 0x5F, 0x2A, 0x85, 0x25, 0x29, 0x1E, 0xF6,\n    0x65, 0x0F, 0x2D, 0x5E, 0x05, 0xBF, 0x3C, 0x0E, 0x0A, 0x17, 0x98, 0xB8, 0xA4, 0x49, 0x28, 0xA9,\n    0x3B, 0xED, 0xCE, 0xF3, 0x7E, 0xB6, 0x38, 0x66, 0x0A, 0x31, 0x42, 0xC7, 0x2E, 0x40, 0x63, 0x16,\n    0xA7, 0x80, 0xE8, 0x19, 0x3A, 0x61, 0xC7, 0x84, 0xBE, 0x89, 0x59, 0xD0, 0x23, 0xD9, 0xAA, 0x84,\n    0x2A, 0x26, 0x53, 0x32, 0x0D, 0x6B, 0xBC, 0xBF, 0xAD, 0xE1, 0x03, 0x5F, 0x4A, 0xC7, 0x5F, 0x03,\n    0x88, 0x0B, 0x8F, 0x7A, 0x53, 0xF8, 0xCC, 0x92, 0xAD, 0x57, 0x04, 0xD8, 0xC9, 0x9F, 0x51, 0xB7,\n    0x9C, 0x6A, 0xAB, 0x45, 0x27, 0x0F, 0xC6, 0x21, 0xBE, 0x01, 0x43, 0x8F, 0x0C, 0x54, 0xDD, 0xAF,\n    0xF6, 0xFB, 0x32, 0xA3, 0x95, 0xCC, 0x09, 0xBC, 0x98, 0xAD, 0xEF, 0xA8, 0xC5, 0x3F, 0x47, 0xF7,\n    0x46, 0xBF, 0x2C, 0xF6, 0x05, 0xFB, 0xC8, 0xE8, 0x56, 0x2C, 0x50, 0x89, 0xDF, 0x14, 0x67, 0xE0,\n    0xD4, 0x41, 0x12, 0x82, 0xD1, 0x94, 0x75, 0x00, 0x3E, 0xF9, 0x4F, 0xCB, 0x20, 0x9A, 0x62, 0x16,\n    0xB4, 0x50, 0xB6, 0x63, 0x3A, 0x9C, 0x91, 0x3C, 0xBC, 0x0F, 0x6A, 0xB0, 0xE5, 0x2E, 0xD7, 0xEA,\n    0xE7, 0x85, 0xA3, 0xD9, 0xB0, 0xAB, 0x8C, 0x83, 0x69, 0x62, 0x43, 0x56, 0x1E, 0xDD, 0xA1, 0x55,\n    0x86, 0x7F, 0x1F, 0xCB, 0x1F, 0xA4, 0xF2, 0x57, 0xCE, 0xB0, 0xA2, 0x1D, 0xFA, 0x17, 0x43, 0x46,\n    0xF7, 0xFD, 0xA3, 0x72, 0xFC, 0x5C, 0xBC, 0x96, 0xA9, 0xB3, 0x39, 0xB9, 0x54, 0xD3, 0x75, 0x11,\n    0x78, 0xAD, 0x05, 0x61, 0x0A, 0xB6, 0x7E, 0x94, 0xCB, 0x36, 0x2F, 0x00, 0xEA, 0xCA, 0xEA, 0x5F,\n    0x09, 0xE8, 0xDF, 0x98, 0xA0, 0xFE, 0x8B, 0x9A, 0xCB, 0x5E, 0xFC, 0x4E, 0xD8, 0x30, 0x91, 0x97,\n    0x95, 0x92, 0x9E, 0x55, 0xAB, 0x45, 0x4A, 0x0F, 0xDD, 0xFF, 0x73, 0x4E, 0x0C, 0xC3, 0x62, 0x13,\n    0x3A, 0xC9, 0xB5, 0xEF, 0x85, 0xD1, 0x4D, 0xB3, 0x7B, 0xD5, 0xA5, 0x33, 0xAF, 0x9D, 0xBC, 0x47,\n    0xE3, 0x1E, 0xC8, 0x97, 0xF4, 0xAF, 0xE0, 0x96, 0x82, 0x8D, 0x3E, 0xD9, 0xBE, 0x1E, 0xDB, 0x04,\n    0xA6, 0x38, 0xE7, 0x6F, 0x8F, 0xC1, 0xC7, 0x67, 0x0F, 0x50, 0x42, 0xCE, 0x1F, 0x42, 0xCA, 0x2C,\n    0x52, 0xA0, 0xEC, 0xB2, 0x02, 0x56, 0x37, 0x3B, 0x95, 0x70, 0x0F, 0x03, 0x33, 0x61, 0xE7, 0xDD,\n    0x6A, 0x0A, 0x0A, 0x27, 0x8C, 0x0E, 0x18, 0xF0, 0x39, 0x83, 0x87, 0x12, 0x18, 0x2B, 0x53, 0xF4,\n    0x41, 0x01, 0x52, 0xCF, 0xC7, 0xBE, 0x4A, 0x1B, 0x3B, 0x77, 0xCD, 0xF2, 0xE1, 0x4D, 0xC5, 0x78,\n    0x4E, 0x93, 0x9B, 0xBD, 0xD6, 0xFA, 0xBF, 0x60, 0x48, 0x76, 0x19, 0x3F, 0x22, 0xAB, 0xA8, 0x84,\n    0xA0, 0xA7, 0x9E, 0x40, 0xE3, 0xA4, 0x86, 0xF1, 0x4F, 0x35, 0x7F, 0xE9, 0xAD, 0x6F, 0x43, 0x62,\n    0x4E, 0x9B, 0x91, 0xD7, 0x3B, 0x6C, 0x1A, 0x51, 0x67, 0xDB, 0x18, 0x51, 0x9C, 0x8E, 0xB0, 0xB2,\n    0xE2, 0x45, 0xB5, 0x48, 0x11, 0x03, 0x5C, 0xF3, 0x3A, 0xCD, 0x43, 0x14, 0x40, 0xFC, 0x72, 0x8E,\n    0x44, 0xF0, 0xE6, 0xF7, 0x69, 0xD3, 0xC2, 0xF9, 0x5A, 0xC7, 0x68, 0xB3, 0xA0, 0x74, 0x94, 0x12,\n    0xEA, 0x5F, 0xF4, 0x93, 0x2A, 0x9B, 0x71, 0xF5, 0x19, 0x87, 0x98, 0xC2, 0x04, 0xC0, 0x52, 0xC7,\n    0x2C, 0x26, 0xC1, 0x93, 0xDD, 0xB1, 0xB2, 0xA8, 0x68, 0xF7, 0xE3, 0xCE, 0x20, 0x8E, 0x02, 0xBF,\n    0x05, 0x08, 0xBD, 0x53, 0xD1, 0x31, 0x30, 0xD7, 0xF2, 0x7B, 0x15, 0xCB, 0x10, 0x47, 0x7B, 0x66,\n    0xEE, 0x63, 0x44, 0x21, 0xAD, 0xD7, 0xDC, 0xD9, 0x61, 0xCB, 0xC7, 0x71, 0x87, 0x06, 0xEB, 0xE0,\n    0x6B, 0x7D, 0x4E, 0x01, 0x05, 0x0A, 0xDC, 0x8F, 0xF0, 0x40, 0xA7, 0xDF, 0x18, 0xD6, 0x71, 0x2C,\n    0x2E, 0x81, 0x05, 0x95, 0x48, 0x26, 0x52, 0xBB, 0x9F, 0x7D, 0xD0, 0x51, 0x28, 0xA5, 0x7F, 0x9F,\n    0xC5, 0x38, 0x39, 0x3A, 0xDE, 0x1E, 0x53, 0x2F, 0x08, 0x19, 0xE0, 0x56, 0x83, 0x28, 0xB2, 0x5C,\n    0xB4, 0xEF, 0x35, 0x90, 0xE0, 0xE0, 0x54, 0xCC, 0xE6, 0xA7, 0xB4, 0x83, 0x5E, 0xC0, 0xC4, 0xBE,\n    0x46, 0x33, 0x14, 0xB1, 0x09, 0xBB, 0xD2, 0xB3, 0xDB, 0xE9, 0xAC, 0x62, 0xEF, 0x52, 0x42, 0x82,\n    0x5D, 0x99, 0x8E, 0xFD, 0x28, 0xA8, 0xB6, 0xAA, 0xC6, 0x68, 0x58, 0xDF, 0x87, 0x10, 0x32, 0xD9,\n    0xB1, 0xA7, 0x49, 0x76, 0x2D, 0x40, 0xDD, 0x6D, 0xB3, 0x67, 0x4C, 0x59, 0xC4, 0x5C, 0x66, 0x74,\n    0xBE, 0x13, 0xC5, 0x19, 0x92, 0x23, 0x3F, 0x81, 0x74, 0xB1, 0x9A, 0x65, 0x5D, 0xDD, 0x24, 0x7E,\n    0x6F, 0x3B, 0xF1, 0x45, 0x56, 0x9D, 0x66, 0xB2, 0x8B, 0xD6, 0x89, 0xE3, 0xF7, 0xD7, 0xDD, 0x44,\n    0x6F, 0x41, 0x52, 0x43, 0x66, 0xE0, 0xB1, 0x18, 0x37, 0xFE, 0xE4, 0x95, 0x26, 0x71, 0x29, 0x7D,\n    0xC5, 0x7A, 0x4A, 0x6B, 0xB0, 0xB1, 0x3B, 0xF2, 0xFA, 0x67, 0x1D, 0x57, 0xBE, 0x51, 0xF0, 0x76,\n    0x37, 0x45, 0x65, 0xF3, 0x30, 0x75, 0x0C, 0x26, 0xD5, 0x6E, 0x7A, 0xBD, 0xB5, 0x31, 0xE7, 0x30,\n    0x14, 0x50, 0x64, 0xB8, 0x3C, 0x89, 0x43, 0xF1, 0x32, 0x7C, 0x45, 0xE3, 0xD8, 0x52, 0xF2, 0x00,\n    0xD4, 0x8D, 0x76, 0xD4, 0xE6, 0x4C, 0x6D, 0x98, 0x7D, 0x56, 0x37, 0x15, 0x1B, 0x0F, 0x75, 0x66,\n    0x88, 0x29, 0xDF, 0xFB, 0xBF, 0x99, 0x51, 0x46, 0xDA, 0x20, 0xB4, 0xD1, 0xB8, 0x0D, 0xE1, 0xA8,\n    0x82, 0x2C, 0x69, 0x7C, 0x93, 0xE7, 0x51, 0x3E, 0x0F, 0x25, 0xDE, 0x25, 0x2F, 0x8D, 0x28, 0x4C,\n    0xAF, 0x35, 0x4F, 0x1C, 0x6B, 0x4B, 0x43, 0xC9, 0x82, 0xAA, 0x5C, 0x31, 0xF6, 0x4D, 0x9F, 0x3B,\n    0x17, 0x25, 0x21, 0x0D, 0xE4, 0x81, 0x49, 0xD3, 0x02, 0xED, 0xEE, 0x73, 0xCD, 0x54, 0xBD, 0xF1,\n    0x0E, 0x31, 0x5E, 0x49, 0x13, 0xFE, 0xAA, 0xFF, 0x5D, 0x77, 0x65, 0x3D, 0x9A, 0x62, 0xDE, 0x52,\n    0x4F, 0x4E, 0x5C, 0xA6, 0xA2, 0xEA, 0xA0, 0x85, 0x69, 0x6F, 0x64, 0x30, 0x71, 0xD7, 0xE0, 0x5F,\n    0xF0, 0xDF, 0xB7, 0xFC, 0x93, 0x08, 0xDA, 0x58, 0xAA, 0x53, 0x10, 0x3E, 0x2F, 0x47, 0x48, 0x11,\n    0xC7, 0x02, 0xB1, 0xB0, 0x25, 0x46, 0x83, 0x88, 0x5D, 0xF8, 0xBB, 0x43, 0x00, 0x91, 0x84, 0x8E,\n    0x80, 0xF1, 0xE8, 0xE8, 0x90, 0xE4, 0xC8, 0x4A, 0x11, 0xA0, 0x92, 0xAA, 0x7E, 0xA5, 0xCA, 0xA7,\n    0xB6, 0x22, 0x9A, 0xB1, 0x55, 0x8E, 0x6D, 0xE5, 0x47, 0xD6, 0x2E, 0x58, 0x42, 0xCB, 0xC4, 0x19,\n    0xB5, 0xFF, 0xAB, 0xB1, 0x8F, 0x2A, 0x81, 0x94, 0x19, 0x91, 0xDA, 0x3A, 0x3C, 0xBB, 0x74, 0x8E,\n    0x84, 0x07, 0xD3, 0x3B, 0x6A, 0x5E, 0xD0, 0x4D, 0xD1, 0xA0, 0xD6, 0x5B, 0x32, 0x7F, 0x92, 0xCC,\n    0x5E, 0xDF, 0xCE, 0x88, 0xCD, 0x2B, 0x6A, 0x4B, 0x3D, 0x68, 0x75, 0x7A, 0xB0, 0xF1, 0x36, 0x1B,\n    0xCA, 0x96, 0xFB, 0xE3, 0x77, 0x9B, 0x38, 0x83, 0x2E, 0xDD, 0x4C, 0x53, 0x35, 0x85, 0xC2, 0xE3,\n    0xCF, 0xA2, 0xF3, 0x85, 0x44, 0xA1, 0xB2, 0x9B, 0x0F, 0xE9, 0x2A, 0x82, 0xD5, 0xB3, 0xC3, 0xF1,\n    0x2B, 0xE8, 0x1B, 0x2C, 0xFF, 0x7D, 0x3C, 0xC9, 0x24, 0x24, 0x35, 0xC8, 0x43, 0x10, 0x2A, 0x92,\n    0x53, 0x29, 0x1D, 0x71, 0xB8, 0xFD, 0x7E, 0x18, 0x9B, 0xBA, 0x5F, 0x43, 0x9F, 0x8C, 0x35, 0xB6,\n    0x0D, 0x93, 0xC1, 0xA7, 0xB9, 0x2A, 0x05, 0xEB, 0x59, 0xB4, 0xA1, 0x94, 0x6C, 0x8B, 0xD3, 0x82,\n    0xD3, 0xFF, 0xA7, 0x36, 0x8C, 0x79, 0x8D, 0xB9, 0x11, 0x04, 0x78, 0x49, 0xA8, 0xBE, 0x76, 0x7C,\n    0xAE, 0x9C, 0xD8, 0x26, 0x4C, 0x12, 0x07, 0x45, 0xE3, 0x39, 0x7A, 0xED, 0xFD, 0x1E, 0xC1, 0xC2,\n    0xBB, 0x90, 0xB2, 0xA7, 0x7A, 0xDC, 0x65, 0x4E, 0x99, 0x73, 0x80, 0xF8, 0x9B, 0x6F, 0x93, 0x76,\n    0x18, 0x7D, 0x69, 0x75, 0xA9, 0xB0, 0x42, 0xD9, 0xEB, 0x21, 0xF5, 0x0B, 0x33, 0x47, 0xDD, 0xB4,\n    0xC1, 0x36, 0xDA, 0x6B, 0x82, 0xE1, 0x5B, 0x21, 0xA1, 0xB7, 0x8A, 0x29, 0x73, 0x64, 0x06, 0xC9,\n    0x0A, 0x67, 0x82, 0xCD, 0xD2, 0xC9, 0x5C, 0x62, 0x75, 0x03, 0x1A, 0xD7, 0x32, 0xFE, 0x84, 0x4E,\n    0xB6, 0xCF, 0x97, 0x0D, 0x6C, 0x12, 0x0A, 0x57, 0xC3, 0xF2, 0x87, 0x6C, 0x1D, 0x05, 0x39, 0x0C,\n    0xC9, 0xDB, 0xA8, 0xE5, 0x2E, 0x6A, 0xE0, 0xAB, 0xD1, 0x1C, 0xCC, 0x16, 0xFE, 0xB7, 0x49, 0x3C,\n    0xC0, 0xCB, 0x43, 0x63, 0x74, 0x89, 0xD8, 0xB6, 0xC0, 0x69, 0x80, 0xF4, 0x8E, 0x84, 0xE0, 0x10,\n    0x61, 0x3E, 0xF4, 0x04, 0xB5, 0x04, 0x37, 0xA4, 0x23, 0x33, 0xD8, 0x3C, 0x35, 0x26, 0xC9, 0xF6,\n    0x06, 0x85, 0x5B, 0xC2, 0x8F, 0x53, 0xBA, 0x46, 0xDE, 0x4C, 0x7A, 0xCD, 0x8F, 0xF9, 0x31, 0x8A,\n    0x21, 0xD9, 0xDF, 0x0C, 0x2A, 0xC4, 0xF0, 0x1F, 0xF1, 0x37, 0xD1, 0x1F, 0xA5, 0x21, 0x27, 0xE8,\n    0x2B, 0xA6, 0xB6, 0x89, 0x34, 0xF4, 0xF3, 0x7C, 0x24, 0x0E, 0xA6, 0xDB, 0xB3, 0x9D, 0x60, 0x29,\n    0x3A, 0xC7, 0xD6, 0xAE, 0xE7, 0x95, 0xBF, 0x30, 0x11, 0xA4, 0x77, 0xCC, 0x7C, 0xE7, 0x96, 0x7E,\n    0xAC, 0xFC, 0xFA, 0xFD, 0x41, 0xAA, 0x0C, 0x6C, 0x53, 0x56, 0xB6, 0x55, 0x7E, 0xC3, 0xB4, 0x82,\n    0x4B, 0xC0, 0x4A, 0xFE, 0xF7, 0x5F, 0xD1, 0xAB, 0xD8, 0x89, 0x00, 0x44, 0xAA, 0xB1, 0x62, 0xEF,\n    0xD6, 0x7F, 0x1B, 0x7B, 0x22, 0x48, 0xEA, 0x00, 0x53, 0x49, 0xA7, 0xCD, 0xA6, 0x7B, 0x61, 0xE3,\n    0xDD, 0xFC, 0xBF, 0xB7, 0xB0, 0xCB, 0xAE, 0xAC, 0xDE, 0x9B, 0x98, 0xC8, 0x86, 0x7C, 0xB2, 0xFB,\n    0xED, 0x75, 0xA4, 0x30, 0xBF, 0x8A, 0x52, 0x95, 0x7E, 0xCF, 0x4B, 0x28, 0xF2, 0xA2, 0x2F, 0xB9,\n    0xA2, 0x24, 0x93, 0xA3, 0x84, 0xCB, 0x2C, 0xC0, 0x7D, 0x2F, 0x6E, 0x35, 0x33, 0x1B, 0x0F, 0x6E,\n    0xFF, 0x32, 0x92, 0x09, 0x17, 0x31, 0xE4, 0xFC, 0x2C, 0x6A, 0x93, 0x1B, 0xFA, 0xA4, 0x87, 0x04,\n    0x9D, 0x1E, 0xCC, 0xC1, 0xD4, 0x40, 0x83, 0x21, 0xB3, 0x5F, 0x3F, 0x68, 0x9C, 0x37, 0x68, 0x47,\n    0x6A, 0x21, 0x98, 0xBC, 0x95, 0x50, 0xBE, 0xF7, 0xD4, 0x72, 0x20, 0x70, 0x12, 0x4F, 0xCB, 0x77,\n    0xBF, 0x68, 0x5A, 0xCE, 0xB5, 0x13, 0xC6, 0x25, 0x30, 0x75, 0xA4, 0xF6, 0xE9, 0xDC, 0xF5, 0xC2,\n    0xB0, 0x57, 0x55, 0xC3, 0x69, 0xE5, 0xF1, 0xB9, 0xAE, 0x55, 0x69, 0x56, 0x5A, 0xBC, 0xCE, 0x0F,\n    0x11, 0x32, 0x2A, 0xE9, 0x7E, 0x40, 0x40, 0xCC, 0xDD, 0x04, 0x62, 0x8B, 0x3B, 0x57, 0xE5, 0x45,\n    0xCB, 0xEE, 0xF0, 0x3D, 0x6A, 0xAC, 0xDD, 0x83, 0x7C, 0x2F, 0x66, 0x9A, 0x6C, 0x3B, 0xD1, 0x80,\n    0x85, 0xE6, 0xE7, 0xEA, 0xE0, 0x89, 0x19, 0x0E, 0x5A, 0xDE, 0x7E, 0x8F, 0x6C, 0x05, 0xB3, 0xA5,\n    0x89, 0x08, 0x45, 0x60, 0xA5, 0xE0, 0xB8, 0xD1, 0x7D, 0x45, 0xB6, 0x23, 0x19, 0x84, 0x6A, 0xC2,\n    0x33, 0xD2, 0xD8, 0x9A, 0x87, 0xD0, 0xF4, 0xED, 0x06, 0x11, 0x08, 0xF1, 0xF2, 0x92, 0xA5, 0x4D,\n    0xF6, 0xE7, 0xBF, 0x8E, 0x3D, 0x01, 0x60, 0x50, 0xC0, 0x4F, 0xBB, 0x37, 0xAA, 0x8E, 0xE4, 0x81,\n    0x9F, 0xBD, 0xDD, 0xA0, 0xA1, 0x00, 0xD8, 0x5C, 0x55, 0xB0, 0xCF, 0x39, 0xEF, 0xA0, 0xE1, 0x4F,\n    0xA7, 0x5D, 0x46, 0x85, 0x11, 0x98, 0x8F, 0x9E, 0xEB, 0x16, 0x0D, 0xF7, 0x0F, 0xEE, 0x9F, 0xBD,\n    0x22, 0x87, 0x0B, 0x10, 0x0B, 0x9E, 0x4D, 0xC1, 0x5F, 0x82, 0xFA, 0xED, 0xCC, 0xAC, 0xB4, 0x62,\n    0xCA, 0x57, 0x8B, 0xE7, 0x60, 0x5B, 0xCF, 0x9B, 0x78, 0xFB, 0x8D, 0x10, 0xCD, 0x33, 0x68, 0x19,\n    0x25, 0x00, 0xCB, 0xD1, 0x13, 0xB4, 0xA3, 0x21, 0x07, 0x5C, 0xED, 0xC5, 0xBB, 0xFA, 0x60, 0x8C,\n    0xB7, 0xD4, 0x41, 0x39, 0x2D, 0x9E, 0x69, 0x3E, 0xC8, 0x25, 0x34, 0xA4, 0x5B, 0x52, 0xB3, 0xBD,\n    0x33, 0xC9, 0x74, 0x7B, 0x7D, 0x46, 0x61, 0x9D, 0x9F, 0x28, 0xBC, 0xE6, 0x53, 0xD3, 0xEA, 0x5E,\n    0xEF, 0xE3, 0x2E, 0xE8, 0x76, 0x68, 0x75, 0x80, 0x98, 0x78, 0x9F, 0x20, 0xF8, 0x50, 0xB7, 0xA1,\n    0x88, 0x0C, 0x0B, 0xD6, 0xF4, 0x84, 0x7C, 0xA5, 0x7D, 0xEE, 0xBB, 0xD6, 0x47, 0x30, 0x89, 0x5C,\n    0xF6, 0xF3, 0x9F, 0x83, 0x56, 0xB5, 0x47, 0xCD, 0x9F, 0xD6, 0x50, 0x7A, 0xD2, 0xE5, 0x3C, 0x36,\n    0x36, 0xBE, 0xBB, 0xAD, 0xB5, 0xDE, 0x92, 0x9F, 0xAF, 0x06, 0x5E, 0x3E, 0x36, 0xB9, 0xC2, 0x53,\n    0xCA, 0x35, 0x21, 0x3E, 0x4F, 0x83, 0x4C, 0x6B, 0x5E, 0x80, 0x98, 0x05, 0x49, 0xE7, 0x17, 0xC6,\n    0x6E, 0x29, 0x41, 0xF1, 0x51, 0xB6, 0xDF, 0x97, 0x9C, 0x37, 0xEB, 0xD1, 0x28, 0x57, 0xDD, 0xD5,\n    0x64, 0x93, 0x31, 0x80, 0x67, 0x67, 0x4B, 0xF3, 0x08, 0x38, 0x6D, 0x8A, 0x0D, 0x50, 0x5D, 0x22,\n    0x03, 0xF2, 0x5F, 0x79, 0x98, 0x87, 0x2D, 0x2D, 0x32, 0x91, 0xD9, 0x7C, 0x07, 0x8B, 0xA5, 0x83,\n    0xC0, 0x89, 0xE1, 0x9D, 0x78, 0xF5, 0xB8, 0x88, 0x5F, 0xF6, 0x5C, 0x35, 0x13, 0x2B, 0x07, 0xEA,\n    0xAB, 0xED, 0x98, 0x1D, 0xC2, 0x51, 0x56, 0x41, 0x90, 0xA3, 0x0D, 0xB5, 0x96, 0xCB, 0x34, 0x1C,\n    0x6E, 0x43, 0x8F, 0xBF, 0xB5, 0x6F, 0x5D, 0x5E, 0x94, 0x99, 0xC1, 0xD9, 0x12, 0x0F, 0x1D, 0x1E,\n    0x16, 0x01, 0xA7, 0x71, 0xB1, 0xF5, 0x49, 0xE3, 0x77, 0x3D, 0x02, 0xCF, 0xE2, 0x7C, 0x96, 0x77,\n    0x8B, 0xA8, 0x01, 0xFD, 0xC0, 0xB5, 0x58, 0x6E, 0xA2, 0x57, 0xFF, 0x31, 0x20, 0x5D, 0x90, 0x59,\n    0x55, 0x42, 0xB5, 0x5E, 0x8F, 0x4C, 0x23, 0x55, 0x23, 0x21, 0x4A, 0x79, 0x30, 0x9C, 0xF8, 0xB8,\n    0xD4, 0x5F, 0x23, 0x66, 0xF4, 0x01, 0x96, 0x43, 0xF8, 0x2A, 0x20, 0xFD, 0x04, 0x7E, 0xE4, 0xC3,\n    0x4B, 0xC3, 0x57, 0x85, 0x61, 0x15, 0x44, 0x7D, 0x8B, 0xDC, 0x29, 0xA4, 0xDB, 0xE6, 0x2D, 0xCC,\n    0x3E, 0x12, 0x03, 0xEB, 0xC3, 0xB9, 0xDC, 0xE0, 0x13, 0x74, 0x41, 0x2B, 0xF6, 0xEF, 0x67, 0xDD,\n    0x1D, 0xEE, 0x8B, 0x07, 0x30, 0x68, 0xF8, 0x56, 0x64, 0x2B, 0x4E, 0xB1, 0x19, 0xE3, 0xE7, 0xBE,\n    0x72, 0xD9, 0x50, 0x69, 0x3C, 0x21, 0xDA, 0xEE, 0x63, 0x89, 0x5D, 0xB3, 0x79, 0xD8, 0xEF, 0x26,\n    0xE2, 0x1F, 0x66, 0x17, 0x4C, 0x70, 0xCF, 0xDF, 0xC0, 0x9F, 0xE9, 0x8F, 0xA2, 0x88, 0xDB, 0xD2,\n    0x7F, 0xDF, 0x32, 0xEA, 0xEF, 0x83, 0x4F, 0xC3, 0x6F, 0x7F, 0x0D, 0x4F, 0x63, 0x00, 0xBA, 0xDD,\n    0x60, 0x37, 0x21, 0x02, 0xAF, 0x99, 0xE6, 0xDC, 0x12, 0xF5, 0x4F, 0xCE, 0x9A, 0xC2, 0x19, 0xB9,\n    0xB2, 0x9E, 0x87, 0x83, 0xA8, 0x06, 0x56, 0x7D, 0xB7, 0x7F, 0x73, 0x38, 0xDC, 0xE9, 0xC7, 0x75,\n    0x63, 0xCA, 0x3C, 0x07, 0x06, 0x6A, 0x9E, 0x97, 0x14, 0x2E, 0xED, 0x40, 0x58, 0x3D, 0x9F, 0x52,\n    0x8F, 0x52, 0x40, 0x3A, 0x2A, 0xBB, 0x3B, 0xE1, 0x8B, 0xEA, 0xD4, 0xCD, 0xC0, 0xE9, 0x68, 0x15,\n    0x53, 0x93, 0x59, 0xC1, 0x3A, 0x50, 0xD6, 0x98, 0xF5, 0x4E, 0xBC, 0x87, 0x3E, 0x3A, 0x2E, 0xB0,\n    0x03, 0x88, 0x40, 0x5B, 0x6A, 0x9B, 0x6D, 0x3D, 0xCB, 0x6C, 0x1B, 0x0A, 0xAA, 0x7F, 0xBC, 0xE1,\n    0x56, 0xF0, 0x62, 0x09, 0xC4, 0x04, 0xFB, 0xE2, 0x61, 0xAA, 0xDE, 0x73, 0xF3, 0x37, 0xA9, 0x49,\n    0x98, 0x29, 0x05, 0x67, 0x7C, 0xB8, 0x78, 0xFE, 0xD6, 0xF8, 0xBF, 0x59, 0xD4, 0xF5, 0x20, 0x37,\n    0xCC, 0x4C, 0x5A, 0xC5, 0x26, 0x17, 0x34, 0x8D, 0xB0, 0x30, 0x79, 0x92, 0x64, 0xAD, 0xFB, 0x6D,\n    0x73, 0xD9, 0xD2, 0x5D, 0x4C, 0x52, 0x86, 0xB2, 0x4A, 0xE5, 0xDE, 0xF0, 0x58, 0x72, 0xE5, 0xB5,\n    0xC3, 0x83, 0xD4, 0xFC, 0x7E, 0x2F, 0x2D, 0xAD, 0x90, 0x36, 0xCC, 0xD6, 0x49, 0x93, 0xFE, 0xA0,\n    0x7A, 0xED, 0x8B, 0x85, 0x73, 0x65, 0x1A, 0xAD, 0xB2, 0xD5, 0xA1, 0x86, 0x8A, 0x43, 0x81, 0xD9,\n    0x4F, 0xA0, 0x09, 0x4B, 0xBF, 0x2C, 0xBB, 0x12, 0x5C, 0xFF, 0xB6, 0x56, 0x26, 0x83, 0x98, 0x7A,\n    0x31, 0x10, 0x72, 0x8F, 0x4F, 0x38, 0x75, 0xA4, 0x5D, 0xC3, 0x49, 0x88, 0x0B, 0x15, 0x86, 0x2D,\n    0x30, 0x2F, 0x8B, 0xAD, 0xC2, 0x5B, 0xBE, 0xC7, 0x79, 0x04, 0x6A, 0x36, 0x2F, 0xD8, 0x27, 0xE2,\n    0xD9, 0x58, 0x2A, 0x0A, 0xA2, 0x14, 0xCB, 0x59, 0x0F, 0xDC, 0x3C, 0x7D, 0x57, 0x0F, 0x47, 0x53,\n    0x1E, 0x3E, 0x99, 0x6E, 0xF6, 0x3B, 0xE8, 0xCF, 0xE3, 0x13, 0x57, 0x14, 0xF5, 0x7C, 0x2F, 0x8B,\n    0xD8, 0x83, 0x3B, 0x1A, 0x7D, 0x15, 0x0A, 0x8A, 0x67, 0x0F, 0x18, 0x21, 0x09, 0x8E, 0xE7, 0x4E,\n    0xC2, 0x66, 0xF9, 0x53, 0x82, 0x24, 0x58, 0xF8, 0x3E, 0x41, 0x34, 0x71, 0x8E, 0x99, 0x87, 0x27,\n    0xB9, 0x1F, 0x8A, 0xAD, 0x56, 0x56, 0x2D, 0x49, 0x00, 0xA4, 0xB2, 0x89, 0xFB, 0x8F, 0x50, 0x11,\n    0xEB, 0x17, 0x6A, 0x51, 0x39, 0xD0, 0x23, 0x1F, 0x76, 0xD6, 0xF8, 0x41, 0x5B, 0x09, 0xDF, 0xEA,\n    0x8B, 0x4E, 0x86, 0x56, 0x12, 0x56, 0x99, 0x8D, 0x1D, 0xC2, 0x15, 0x7C, 0x3C, 0x27, 0xAB, 0x6A,\n    0x48, 0x5A, 0x14, 0x25, 0x1E, 0x69, 0x91, 0x03, 0x26, 0xF3, 0x87, 0xA5, 0x66, 0x14, 0x9E, 0xEA,\n    0x78, 0xC7, 0xEC, 0x9B, 0x0A, 0x40, 0x56, 0x94, 0x78, 0x5A, 0x9D, 0x99, 0xAD, 0xD3, 0xFB, 0xC9,\n    0x5D, 0xCE, 0x05, 0xAC, 0x6E, 0x95, 0x57, 0x6C, 0x4E, 0x04, 0xB5, 0xE4, 0x3B, 0xEF, 0x82, 0x70,\n    0x1B, 0xC4, 0x38, 0x63, 0x0C, 0x66, 0x47, 0xB9, 0xDF, 0x4B, 0xF5, 0xB1, 0xAC, 0xB9, 0xB2, 0xB5,\n    0xF1, 0xF2, 0xE0, 0x67, 0x39, 0x62, 0x1C, 0x0A, 0x4F, 0x10, 0xFA, 0xDA, 0xEC, 0x5A, 0xBD, 0x55,\n    0x82, 0xB9, 0x5F, 0xB9, 0x1C, 0x7B, 0xC3, 0x88, 0x7F, 0xB6, 0x4A, 0x41, 0xA2, 0x02, 0xF2, 0x3E,\n    0xE0, 0x0F, 0x1C, 0xD6, 0xC9, 0xB5, 0x6F, 0xFB, 0xD7, 0x16, 0x49, 0xB2, 0x14, 0xC9, 0x2C, 0x2B,\n    0xC6, 0x45, 0x19, 0x84, 0x17, 0x87, 0xE1, 0xDC, 0x49, 0x48, 0x0B, 0x65, 0x47, 0x2B, 0xFE, 0x7C,\n    0x75, 0x30, 0xFA, 0xB9, 0x40, 0x1C, 0xC2, 0xA2, 0x10, 0x43, 0xDE, 0x5E, 0xF1, 0x4D, 0xCE, 0x56,\n    0xA9, 0x59, 0x5C, 0x7C, 0x37, 0x9A, 0x17, 0x8A, 0xEA, 0x2D, 0xFF, 0x32, 0xF7, 0xB7, 0x01, 0xEE,\n    0xB6, 0xC6, 0xA1, 0xD7, 0xBB, 0x79, 0x88, 0x2B, 0xC6, 0x52, 0x7E, 0xCD, 0x75, 0x19, 0x88, 0xAB,\n    0x51, 0x67, 0xFC, 0x5C, 0x11, 0x79, 0x49, 0x66, 0xE8, 0xE6, 0x48, 0x6B, 0x79, 0x0E, 0x35, 0x93,\n    0x1E, 0xD4, 0x1E, 0xD7, 0xC8, 0x7A, 0xCE, 0x24, 0xF5, 0x01, 0x69, 0x16, 0xC1, 0xFB, 0x8B, 0x36,\n    0x9E, 0x4F, 0x42, 0x0D, 0x7C, 0xB5, 0x8E, 0xDA, 0x2A, 0x07, 0x7D, 0xFF, 0xB3, 0x19, 0xB6, 0x33,\n    0xF4, 0x2B, 0x25, 0xED, 0x7E, 0x21, 0xA2, 0x9A, 0x26, 0x0E, 0x0A, 0xE0, 0x98, 0x1F, 0xAD, 0x79,\n    0xA6, 0x4C, 0xF6, 0x2D, 0xD1, 0xE2, 0x2C, 0x4B, 0xEA, 0xAB, 0x5E, 0xEB, 0x9E, 0xB0, 0xF4, 0xB5,\n    0xFC, 0xCC, 0x68, 0xFF, 0x35, 0x1D, 0xBF, 0xEE, 0x3B, 0x22, 0xC1, 0x95, 0x4C, 0x39, 0x55, 0xE8,\n    0xEA, 0x80, 0xD4, 0x9E, 0x9C, 0x8D, 0xFF, 0x22, 0x60, 0xC6, 0x56, 0x96, 0x86, 0x47, 0x3C, 0xA5,\n    0xB8, 0xD5, 0x35, 0x97, 0xF7, 0x35, 0xC7, 0x08, 0x47, 0xE1, 0xAD, 0xC5, 0x28, 0x54, 0xCE, 0xF3,\n    0xA9, 0x6A, 0x08, 0x38, 0xE9, 0x42, 0x6A, 0x2E, 0xC5, 0xC0, 0xA0, 0xA4, 0x62, 0x7D, 0xE0, 0x6F,\n    0x56, 0x25, 0xEE, 0x90, 0xD9, 0x17, 0x05, 0x1A, 0x0C, 0xAB, 0xD3, 0xD2, 0xBA, 0xDE, 0xAB, 0xBA,\n    0x8F, 0x85, 0x3E, 0xAF, 0x2E, 0xA1, 0x53, 0x02, 0x8A, 0x55, 0x91, 0x88, 0xB8, 0x92, 0x3E, 0x11,\n    0xEF, 0xB4, 0x2B, 0x81, 0xE3, 0xCD, 0x0D, 0xEB, 0xC2, 0x5E, 0x34, 0xCB, 0x27, 0x56, 0x79, 0x69,\n    0xD8, 0x3A, 0xC3, 0x91, 0x94, 0x47, 0xE9, 0xFC, 0x98, 0xA6, 0x74, 0x7E, 0xBE, 0x8D, 0x09, 0xB6,\n    0x5C, 0x46, 0xA4, 0xD1, 0x7B, 0xF8, 0x78, 0x33, 0x88, 0xEF, 0xD6, 0x56, 0x66, 0x8B, 0x27, 0xB3,\n    0x55, 0x27, 0xCB, 0xF5, 0xD1, 0x25, 0x15, 0x97, 0x70, 0x13, 0x09, 0x72, 0xEB, 0xE1, 0xD3, 0xF9,\n    0x89, 0x75, 0x27, 0xF5, 0xA3, 0xA3, 0x00, 0xD6, 0x11, 0x1B, 0x09, 0xF9, 0xB9, 0x0B, 0x8C, 0xBA,\n    0x40, 0xC0, 0x3F, 0x87, 0xCF, 0xC5, 0xAB, 0xB0, 0x50, 0x99, 0x72, 0x5E, 0xF6, 0x73, 0x48, 0xE8,\n    0x0B, 0x4C, 0xDE, 0x49, 0xC0, 0xD7, 0x73, 0x21, 0x21, 0x2C, 0x22, 0x4D, 0x9D, 0xF9, 0x48, 0xA0,\n    0x84, 0x1B, 0xCC, 0x34, 0x2F, 0x1C, 0x58, 0x7E, 0xC4, 0x75, 0xB5, 0x75, 0x28, 0xBC, 0xF8, 0x9C,\n    0x5D, 0xEA, 0x3C, 0x94, 0xF3, 0x5F, 0x0A, 0x90, 0x4C, 0x64, 0xE4, 0xC2, 0x70, 0x69, 0x79, 0xC4,\n    0x28, 0xDF, 0x94, 0x10, 0x43, 0x6F, 0xAD, 0x9A, 0xCC, 0xF3, 0x74, 0x28, 0xBA, 0xDB, 0x8F, 0xE5,\n    0x5D, 0x1F, 0x2D, 0xDB, 0x0A, 0x99, 0x36, 0xA4, 0x50, 0x93, 0x53, 0xAC, 0x37, 0x71, 0x59, 0x64,\n    0xFC, 0xD1, 0x89, 0x4F, 0x9E, 0x3A, 0xDC, 0x2C, 0xBB, 0x78, 0x1F, 0x19, 0x63, 0xD7, 0xB2, 0x55,\n    0xF8, 0x96, 0xFC, 0x19, 0xA6, 0x46, 0xC5, 0xFB, 0xCC, 0x69, 0x97, 0xD4, 0x08, 0x3F, 0xD3, 0xB7,\n    0x27, 0xD0, 0x52, 0x48, 0x0D, 0x42, 0xE3, 0x49, 0xFE, 0xDE, 0x4C, 0x04, 0x3F, 0x81, 0x48, 0x44,\n    0x88, 0x29, 0x38, 0x11, 0x2A, 0x1F, 0x2B, 0x33, 0x13, 0x0F, 0x0F, 0x44, 0xAC, 0xEB, 0xBA, 0xE1,\n    0x83, 0x15, 0x83, 0x52, 0x50, 0xD2, 0x80, 0x28, 0xED, 0x76, 0xE3, 0x59, 0xC8, 0xC1, 0x8C, 0x41,\n    0x22, 0xBC, 0xD9, 0x5F, 0x50, 0x40, 0xFF, 0x5F, 0x66, 0x69, 0x1B, 0xD5, 0x47, 0x76, 0x44, 0xC0,\n    0x85, 0xB5, 0x55, 0x70, 0x13, 0xAC, 0xEE, 0x11, 0x61, 0xAC, 0xFE, 0x1A, 0xA7, 0x43, 0xA9, 0x6D,\n    0xB7, 0x94, 0x50, 0x81, 0x8D, 0xBE, 0xCC, 0xCE, 0xED, 0x62, 0xC4, 0x1B, 0x97, 0xFD, 0x10, 0x14,\n    0xE6, 0x0E, 0x11, 0x16, 0x95, 0x6A, 0x5E, 0x0F, 0x87, 0x88, 0x72, 0xA7, 0x32, 0x9A, 0x05, 0xA2,\n    0xC0, 0xD3, 0x23, 0x0C, 0xC0, 0x34, 0x93, 0x80, 0x51, 0x40, 0x9A, 0x25, 0x4D, 0x5D, 0x70, 0x87,\n    0x4C, 0xCE, 0x45, 0xE2, 0x2D, 0x42, 0x5A, 0x36, 0x5A, 0x2A, 0x69, 0xF2, 0x81, 0xA0, 0x90, 0xFF,\n    0xEB, 0xB5, 0x5A, 0x6B, 0xB5, 0x9F, 0x15, 0x6A, 0x0A, 0x39, 0xF0, 0x3A, 0x3F, 0xA7, 0x8F, 0xF5,\n    0x1B, 0x81, 0xA9, 0x7F, 0xDF, 0x49, 0xEA, 0xC3, 0x6B, 0xC5, 0xC3, 0x23, 0xE5, 0x08, 0x8D, 0xFC,\n    0xDE, 0x55, 0xEA, 0x65, 0xBE, 0x6E, 0x19, 0xB5, 0xAC, 0xD1, 0xE3, 0xC8, 0x70, 0x41, 0x40, 0x29,\n    0xCC, 0xE1, 0xEA, 0x47, 0xC9, 0xB4, 0xB4, 0x86, 0x4C, 0xCC, 0x50, 0x54, 0x46, 0xC1, 0x5A, 0xC0,\n    0x23, 0xEE, 0xF0, 0x4E, 0x7C, 0xEA, 0x5C, 0x22, 0x3D, 0x6E, 0x0C, 0xA2, 0x34, 0x11, 0x69, 0x89,\n    0x5A, 0x95, 0xEB, 0x2A, 0x75, 0x13, 0x81, 0x8A, 0x14, 0xD0, 0x9F, 0x78, 0x90, 0x3F, 0xBC, 0xE6,\n    0x64, 0x82, 0x7B, 0xF3, 0x5E, 0x40, 0x11, 0x1B, 0xF9, 0x21, 0x6A, 0x8F, 0x8B, 0x63, 0xCB, 0xD7,\n    0x1E, 0x02, 0x05, 0xC6, 0x69, 0xAF, 0x0C, 0x3B, 0xAE, 0x7B, 0x53, 0x6F, 0x5B, 0x99, 0x1D, 0x46,\n    0x81, 0x99, 0xF2, 0xC6, 0xEE, 0xDB, 0x2E, 0x23, 0xC3, 0xBB, 0x44, 0xB2, 0xD3, 0xC5, 0x6D, 0x96,\n    0xBA, 0x7F, 0x70, 0x78, 0xC2, 0x31, 0xD8, 0xF5, 0x40, 0xD8, 0xB0, 0x2A, 0x48, 0x09, 0xB5, 0x91,\n    0x77, 0x35, 0x9B, 0x2E, 0x87, 0xEF, 0x9E, 0x37, 0xA3, 0x2B, 0x68, 0xC4, 0xA2, 0x01, 0x48, 0x51,\n    0x5C, 0xEF, 0xE7, 0x47, 0x97, 0x55, 0x85, 0x24, 0xCE, 0x8C, 0x20, 0xFF, 0x9D, 0x7E, 0x4D, 0x09,\n    0xC3, 0xDE, 0x50, 0xDA, 0x52, 0x41, 0xCE, 0x75, 0x57, 0x2C, 0xDC, 0x45, 0x21, 0x33, 0xFB, 0x8C,\n    0x72, 0xA4, 0x03, 0xF1, 0xEB, 0x86, 0x0D, 0x61, 0xA7, 0x95, 0xA4, 0xE7, 0xAD, 0x5A, 0x89, 0xCB,\n    0x99, 0x02, 0xA1, 0xE9, 0x16, 0x64, 0x84, 0x18, 0xF6, 0x0F, 0x0E, 0x25, 0x45, 0x22, 0x5C, 0x56,\n    0x59, 0x6D, 0x61, 0xAD, 0xC0, 0x05, 0x9A, 0x40, 0xD3, 0xCE, 0xE7, 0xA3, 0x92, 0x38, 0x3A, 0xEF,\n    0xA9, 0xE0, 0x08, 0x35, 0x6D, 0x5B, 0x38, 0x40, 0x15, 0x6D, 0xE0, 0x4A, 0x43, 0x4B, 0x63, 0xDA,\n    0x6A, 0x07, 0x7E, 0xB1, 0xCD, 0x12, 0xDC, 0x05, 0xA2, 0x23, 0x57, 0x28, 0x7A, 0x0D, 0xB4, 0x89,\n    0xBD, 0xA3, 0xDB, 0xF4, 0x70, 0x8B, 0x12, 0xFC, 0xD0, 0x75, 0x40, 0x7D, 0x92, 0x8C, 0x5C, 0xD7,\n    0xA7, 0xE4, 0x6D, 0x7B, 0x92, 0x89, 0x0C, 0xF4, 0xFA, 0xE5, 0x49, 0x15, 0x80, 0x68, 0x88, 0x25,\n    0xC5, 0x93, 0xAF, 0x78, 0x8E, 0x92, 0x31, 0xE8, 0xBA, 0x9B, 0xEC, 0x93, 0x2E, 0x06, 0xBC, 0x87,\n    0x30, 0x6E, 0x6F, 0x42, 0x31, 0xC6, 0xCD, 0xEA, 0xE2, 0x43, 0xDF, 0xA6, 0x2C, 0xFE, 0x05, 0x4E,\n    0x63, 0xD6, 0x63, 0xD8, 0x46, 0x56, 0xD8, 0xB2, 0x6E, 0x4F, 0xDC, 0xF5, 0x23, 0xDE, 0x49, 0xAD,\n    0xE8, 0x2D, 0x00, 0xEA, 0xAD, 0xE6, 0xE4, 0x4A, 0x48, 0x78, 0x20, 0xCC, 0xC0, 0x47, 0x22, 0xB4,\n    0xB3, 0xB8, 0xAF, 0x71, 0x1D, 0x89, 0x68, 0xD6, 0x18, 0x70, 0x34, 0xAD, 0xFF, 0x99, 0xB3, 0x41,\n    0xD4, 0x6B, 0x93, 0xB5, 0x47, 0x54, 0xB3, 0x7D, 0xF5, 0x5F, 0xA3, 0x6E, 0x54, 0x1A, 0x59, 0x11,\n    0x53, 0x83, 0xAC, 0x23, 0xC2, 0x1F, 0x39, 0x64, 0x11, 0x67, 0x11, 0xBF, 0x50, 0xDB, 0x5D, 0x1D,\n    0x74, 0x48, 0xDC, 0xF3, 0xBE, 0x55, 0xAA, 0x53, 0xDB, 0xC8, 0x5C, 0x79, 0xEA, 0xB3, 0x28, 0x7A,\n    0xB6, 0xDB, 0x71, 0x7F, 0xD7, 0xCF, 0x39, 0x77, 0xFD, 0xCE, 0x8B, 0x9F, 0x1A, 0x27, 0x14, 0x3C,\n    0x78, 0x58, 0x18, 0xE5, 0x93, 0xDD, 0x81, 0x24, 0xF8, 0xFE, 0x97, 0x3C, 0xA8, 0x8F, 0xFE, 0x6C,\n    0xA1, 0xDB, 0xE2, 0xCF, 0x59, 0x9B, 0x28, 0xC2, 0xAB, 0x59, 0x13, 0x98, 0xDD, 0x2F, 0x03, 0xD0,\n    0x05, 0x93, 0x72, 0x97, 0x07, 0xA0, 0xBC, 0xC3, 0x8B, 0x47, 0xDF, 0x55, 0x1C, 0x0E, 0x70, 0x6D,\n    0xEF, 0x48, 0x0E, 0x33, 0x0D, 0x5F, 0x05, 0xF5, 0x98, 0xAC, 0xE3, 0xEE, 0x8F, 0x9D, 0xBD, 0x84,\n    0xB7, 0x9C, 0x8C, 0x06, 0x60, 0x86, 0xB1, 0xDE, 0x80, 0xB3, 0xAC, 0xD7, 0xE8, 0x35, 0xDC, 0x51,\n    0x57, 0x8F, 0xE8, 0x7A, 0xC8, 0xC2, 0x46, 0x3A, 0x22, 0x4D, 0x15, 0x6B, 0x9E, 0x0A, 0xB3, 0xFF,\n    0x11, 0xD9, 0x2D, 0xE0, 0x5A, 0x32, 0xBB, 0x0D, 0x72, 0x0F, 0x8B, 0xB2, 0xD9, 0x86, 0x2D, 0x5F,\n    0x57, 0x92, 0xBF, 0xAF, 0x00, 0x5C, 0xE2, 0x54, 0x91, 0x51, 0x22, 0xA9, 0x3A, 0x48, 0x9F, 0x8E,\n    0xF0, 0xA8, 0x04, 0x1F, 0xD3, 0x58, 0x00, 0xB3, 0xDC, 0x7B, 0x99, 0x74, 0x18, 0x12, 0x44, 0x35,\n    0x65, 0x1A, 0x1E, 0x95, 0xCC, 0x73, 0x53, 0xBB, 0xFC, 0x90, 0x07, 0x68, 0x2B, 0x46, 0x69, 0xF2,\n    0x68, 0x6E, 0x62, 0x31, 0x5B, 0x11, 0x10, 0x9C, 0x18, 0x70, 0x29, 0x0D, 0x1A, 0x88, 0xD8, 0xA5,\n    0xC6, 0x2C, 0xAA, 0xB7, 0x80, 0xC6, 0x36, 0xB0, 0x4E, 0x3C, 0x68, 0x74, 0xB8, 0xFE, 0xF6, 0x82,\n    0x5D, 0x74, 0x71, 0xBE, 0xD1, 0x3C, 0xE0, 0x2D, 0x20, 0x3A, 0x36, 0xA9, 0x87, 0x76, 0xAA, 0x16,\n    0xB7, 0x6F, 0xB8, 0x66, 0x05, 0xEB, 0x63, 0x15, 0xB6, 0xDE, 0x01, 0x49, 0xF5, 0x01, 0x37, 0xF0,\n    0x98, 0x11, 0xC9, 0x43, 0x5D, 0xCB, 0x04, 0x48, 0x75, 0xD4, 0x73, 0x97, 0xE6, 0xD5, 0xEF, 0x97,\n    0x8C, 0xF7, 0x37, 0xC8, 0xDA, 0xAB, 0x53, 0x12, 0x44, 0xF5, 0x72, 0xE7, 0x58, 0xBD, 0x2A, 0x65,\n    0xE5, 0x79, 0x8D, 0xA5, 0x50, 0xBF, 0x3E, 0x3B, 0x36, 0x9D, 0x48, 0x73, 0xA0, 0x17, 0x4C, 0x8E,\n    0x82, 0x98, 0xD0, 0xFD, 0xB1, 0xDB, 0x16, 0xBE, 0x05, 0x70, 0xBE, 0xEF, 0x43, 0x8A, 0xE8, 0xB8,\n    0x79, 0x83, 0xBC, 0x3B, 0x23, 0x94, 0xAD, 0xA8, 0xD9, 0x98, 0x74, 0x4C, 0x91, 0x48, 0x22, 0x96,\n    0x7D, 0x0E, 0x78, 0xF9, 0x35, 0xC0, 0xAE, 0xFD, 0x0A, 0xB0, 0xF0, 0x6C, 0xA7, 0x51, 0x4D, 0x44,\n    0xD9, 0xBD, 0x84, 0x76, 0x48, 0x4A, 0x66, 0x41, 0x55, 0xA6, 0xBE, 0xA4, 0xA2, 0x3E, 0xDE, 0xA0,\n    0xE4, 0x6F, 0xB9, 0xB2, 0xED, 0x74, 0xE2, 0x36, 0x2F, 0x54, 0x64, 0x9C, 0x41, 0xE6, 0xE3, 0xC8,\n    0x35, 0x23, 0xD5, 0x61, 0x0E, 0x03, 0xCA, 0xFA, 0x17, 0xED, 0x05, 0x69, 0x9C, 0x7A, 0x58, 0x4D,\n    0x16, 0x34, 0x15, 0xA3, 0x5B, 0x0C, 0x87, 0x0F, 0x02, 0xD2, 0xB3, 0xAF, 0x00, 0xC2, 0x1D, 0x39,\n    0x87, 0x21, 0xF3, 0x9F, 0x96, 0xD2, 0xA1, 0x8C, 0xBE, 0xFB, 0xF4, 0xAB, 0x0B, 0x65, 0x3A, 0xF9,\n    0xB7, 0x00, 0x91, 0x53, 0xE6, 0xF8, 0x9E, 0xD3, 0x65, 0xFE, 0xEB, 0x00, 0x6D, 0x15, 0x00, 0x7A,\n    0x4D, 0xE8, 0xD2, 0xF9, 0xB7, 0xBC, 0x41, 0xBC, 0x90, 0x29, 0xEF, 0x72, 0xAE, 0x38, 0xE8, 0x25,\n    0x77, 0xEC, 0x55, 0xFF, 0x1D, 0x71, 0x79, 0x8E, 0x7F, 0x32, 0x87, 0x39, 0x46, 0x58, 0x06, 0x19,\n    0xBB, 0xC0, 0x77, 0x5A, 0x3E, 0xB5, 0xE2, 0x35, 0x7C, 0x24, 0xB5, 0xCC, 0x68, 0xA3, 0x2C, 0xC2,\n    0xF4, 0x48, 0x39, 0x21, 0x25, 0x46, 0xE1, 0x2B, 0x08, 0x8D, 0x5E, 0xDC, 0x85, 0x4E, 0x03, 0x59,\n    0x21, 0x42, 0x2C, 0x0F, 0x65, 0xC8, 0xF9, 0x27, 0x7C, 0x28, 0x0A, 0xAF, 0x2E, 0x88, 0x88, 0x0E,\n    0xB7, 0xB7, 0xB7, 0x01, 0xCA, 0xD8, 0x19, 0xC8, 0x43, 0xE5, 0xCD, 0xBB, 0xBE, 0xC2, 0x74, 0xDE,\n    0x1F, 0xBA, 0x0B, 0x4C, 0x40, 0x30, 0xEA, 0xC4, 0x76, 0xE7, 0x30, 0xE9, 0xDA, 0x19, 0x30, 0x33,\n    0x86, 0xD8, 0xC7, 0x47, 0xB3, 0xBB, 0x7A, 0x0D, 0x5F, 0xF1, 0x44, 0x8A, 0xE5, 0x2F, 0x86, 0xC9,\n    0xCF, 0x5A, 0xF5, 0x12, 0xA1, 0xC8, 0x7B, 0x5F, 0x83, 0x98, 0x96, 0x2D, 0x6A, 0x99, 0xE8, 0xE5,\n    0xD7, 0x4E, 0x6D, 0x0A, 0x51, 0xCA, 0x90, 0x8F, 0x17, 0x4A, 0x02, 0x94, 0xAF, 0xBC, 0xB9, 0x64,\n    0x2A, 0xFD, 0x29, 0x84, 0x40, 0x53, 0x71, 0xD6, 0x85, 0xEF, 0x26, 0xD4, 0x33, 0x6C, 0x18, 0x8C,\n    0x4F, 0x4A, 0xFB, 0xA9, 0xAC, 0x24, 0x63, 0xED, 0x61, 0x20, 0x9C, 0x3A, 0xF0, 0xCF, 0x60, 0xDB,\n    0xA2, 0xB8, 0xB7, 0x61, 0xB7, 0x0E, 0x68, 0xC3, 0xCB, 0x08, 0x69, 0xA2, 0x08, 0x7B, 0xB4, 0xCB,\n    0xBA, 0x4A, 0x89, 0x26, 0x38, 0xED, 0x8D, 0x7B, 0x56, 0x27, 0xE1, 0x00, 0xB9, 0x18, 0x7F, 0xDC,\n    0x42, 0x7C, 0x0D, 0xD6, 0x58, 0x93, 0xC9, 0x6F, 0x56, 0x22, 0x9A, 0x8C, 0x80, 0x19, 0xBA, 0x0F,\n    0xE0, 0x52, 0x22, 0x1D, 0x98, 0xA7, 0x98, 0x85, 0xCE, 0x21, 0xE2, 0x6E, 0x70, 0x9E, 0x4F, 0xE5,\n    0x04, 0x35, 0xEA, 0x66, 0x88, 0x22, 0x63, 0xB9, 0x17, 0x1A, 0xFA, 0x56, 0x35, 0x06, 0xB4, 0x27,\n    0x2C, 0x8F, 0xE3, 0x13, 0x47, 0xCC, 0xA8, 0xC6, 0x46, 0x54, 0x57, 0xD8, 0x70, 0xFF, 0x86, 0x4C,\n    0xB3, 0xF2, 0x0E, 0x29, 0x5E, 0xD8, 0x88, 0x4C, 0x5A, 0x16, 0x1A, 0x79, 0x41, 0x87, 0x70, 0x52,\n    0x1E, 0xBA, 0x02, 0xCC, 0xA3, 0xC9, 0xEF, 0x53, 0x12, 0x56, 0x6D, 0x55, 0xBF, 0x8B, 0xAF, 0xFD,\n    0x12, 0xE0, 0x2D, 0x27, 0x83, 0x9F, 0x8E, 0x2E, 0x1B, 0x7A, 0x22, 0x6D, 0xF9, 0x59, 0xF9, 0x63,\n    0x7F, 0xB0, 0xBF, 0x05, 0x97, 0x78, 0x2E, 0x67, 0xC3, 0xA8, 0x4B, 0x16, 0xCB, 0x72, 0x47, 0xFD,\n    0x0C, 0x0F, 0xAE, 0xC9, 0xB4, 0xB6, 0xE8, 0x99, 0xAA, 0xA3, 0x60, 0xF4, 0xD2, 0x07, 0xF5, 0x82,\n    0xDA, 0x7B, 0xE6, 0x6E, 0xCC, 0x85, 0xD3, 0x2E, 0xC1, 0x13, 0x3D, 0x32, 0xBE, 0xBB, 0x25, 0xA5,\n    0x2E, 0x00, 0xAA, 0x28, 0x63, 0x2B, 0x61, 0x3E, 0x7F, 0x34, 0xA0, 0x83, 0xCE, 0xEC, 0x44, 0x72,\n    0x29, 0x1F, 0x81, 0x62, 0x8A, 0xED, 0x9D, 0x5F, 0xFD, 0xFE, 0x14, 0x52, 0x9C, 0xFC, 0xB4, 0x04,\n    0x70, 0x0A, 0x27, 0x7E, 0x94, 0x69, 0x13, 0x80, 0x97, 0xCC, 0xD2, 0x69, 0xDD, 0xD1, 0x38, 0xFA,\n    0x51, 0x88, 0xC0, 0x9D, 0xB6, 0x14, 0xE3, 0x20, 0xEB, 0x69, 0x62, 0xF4, 0xB7, 0x07, 0xF2, 0x6F,\n    0xFE, 0xDA, 0xE3, 0xF9, 0x7A, 0x64, 0x70, 0xAD, 0x11, 0x10, 0x54, 0x6B, 0x9F, 0x8B, 0x48, 0x9C,\n    0x19, 0x27, 0x83, 0x20, 0x29, 0x3E, 0x7C, 0x57, 0x0E, 0x6E, 0x4F, 0x0B, 0xB7, 0xB2, 0x6D, 0x61,\n    0x52, 0xE0, 0xE5, 0x67, 0xDB, 0xF9, 0x96, 0xBA, 0xF2, 0xA6, 0x4D, 0x2A, 0x98, 0xDF, 0x2F, 0x03,\n    0xD1, 0x78, 0xB4, 0xF9, 0x08, 0x2A, 0x7C, 0xBA, 0xD6, 0x53, 0x57, 0x6A, 0x2C, 0x8D, 0xF4, 0xDC,\n    0xA9, 0x05, 0x00, 0xA6, 0x8C, 0xFB, 0xFF, 0x45, 0x13, 0xF4, 0xE8, 0xBD, 0xB5, 0xF4, 0x1D, 0xF7,\n    0x5F, 0x32, 0xC8, 0x30, 0x1F, 0xD5, 0x0A, 0xC7, 0xA4, 0x28, 0x06, 0xFF, 0x44, 0x18, 0x43, 0x1A,\n    0x8C, 0x63, 0x81, 0x2B, 0x16, 0x4C, 0xE4, 0xB0, 0xF4, 0x9A, 0x49, 0x09, 0x7B, 0x8B, 0x6F, 0x93,\n    0x2E, 0xEC, 0x8C, 0x4F, 0x71, 0x01, 0xFF, 0x54, 0x90, 0x1B, 0x6C, 0xF1, 0x9B, 0xB1, 0x06, 0xDA,\n    0xFC, 0xD4, 0xD6, 0xFB, 0x10, 0xDA, 0x46, 0x8C, 0x0E, 0xAF, 0xF8, 0x19, 0xC0, 0x35, 0xA5, 0xD2,\n    0x74, 0xFD, 0x25, 0xEF, 0xDD, 0x2E, 0x9C, 0x0B, 0xE1, 0x17, 0xD5, 0x0C, 0xFB, 0xC1, 0xA8, 0xE6,\n    0x4A, 0x44, 0x0A, 0xF2, 0x48, 0xA2, 0x07, 0x42, 0x3C, 0x36, 0xC5, 0xD7, 0x45, 0x9D, 0xDB, 0xA6,\n    0x4B, 0x30, 0xC1, 0x3A, 0xB0, 0x31, 0x88, 0x0E, 0xB1, 0x38, 0x4E, 0x34, 0xF9, 0x33, 0xE2, 0x8A,\n    0x0B, 0xF7, 0x7C, 0xF1, 0xE3, 0x07, 0x5A, 0xA0, 0x63, 0x12, 0x22, 0xFD, 0x44, 0x8A, 0xE7, 0x35,\n    0xF7, 0x24, 0xAD, 0x6F, 0xBA, 0xC1, 0xA3, 0x2F, 0x6C, 0x58, 0xF3, 0xD3, 0x13, 0x4D, 0x21, 0x0A,\n    0xA1, 0x1C, 0x54, 0xAA, 0x5E, 0x35, 0xEF, 0x00, 0x48, 0xE8, 0xDE, 0x56, 0xA4, 0xFF, 0xBB, 0xD9,\n    0xF9, 0xA7, 0x0D, 0x83, 0x08, 0x8B, 0x41, 0xDC, 0x63, 0xA4, 0x40, 0x62, 0x46, 0xAD, 0x57, 0x49,\n    0x43, 0x67, 0x6D, 0x43, 0x23, 0x19, 0x7E, 0x17, 0xF6, 0xEF, 0xDE, 0x07, 0xF2, 0x5D, 0x11, 0x78,\n    0x42, 0x8D, 0x11, 0xEF, 0x9F, 0x4A, 0xA6, 0xCE, 0x95, 0x92, 0x34, 0x20, 0x02, 0x95, 0xB9, 0xA8,\n    0x16, 0xF5, 0x5E, 0x2F, 0x7C, 0xF8, 0xE2, 0x07, 0xB8, 0xF4, 0x07, 0x30, 0x1C, 0x77, 0xD3, 0x46,\n    0x11, 0x07, 0x8D, 0x6D, 0x69, 0x87, 0xB4, 0x91, 0xCB, 0x72, 0x8E, 0x2D, 0xAD, 0x0E, 0xCD, 0x97,\n    0x8C, 0xA4, 0x0D, 0x05, 0x93, 0xAF, 0x42, 0xDE, 0x74, 0xF8, 0x97, 0x3B, 0x7F, 0xBF, 0x4D, 0x6A,\n    0x12, 0xE4, 0xE2, 0xF2, 0xAF, 0x6D, 0x1F, 0x31, 0xCA, 0x81, 0x33, 0x2F, 0x42, 0x42, 0xCE, 0x48,\n    0x31, 0xD9, 0x09, 0x2A, 0x70, 0xDF, 0x75, 0xE3, 0x9C, 0x42, 0xEF, 0x8A, 0xB1, 0x96, 0x6B, 0xA1,\n    0xBC, 0x2C, 0x84, 0x77, 0xE9, 0x3D, 0x13, 0x3C, 0x04, 0x9F, 0xC8, 0x70, 0xC3, 0x26, 0xF0, 0xE3,\n    0xC5, 0x04, 0xD3, 0xEA, 0x02, 0x10, 0x7E, 0xD2, 0xB5, 0x32, 0x87, 0x8D, 0x02, 0xA8, 0x1B, 0x19,\n    0x7D, 0x6A, 0x54, 0x45, 0x62, 0x06, 0xD3, 0x28, 0x32, 0xAC, 0x2A, 0x1E, 0xA1, 0xC3, 0x56, 0x96,\n    0xCB, 0xA4, 0x3A, 0x6F, 0xCB, 0x2B, 0xBC, 0xCF, 0x7F, 0x75, 0xE9, 0x05, 0x12, 0x24, 0xC0, 0xD4,\n    0x97, 0xAB, 0xCF, 0x4D, 0x38, 0x23, 0x87, 0xE6, 0x3D, 0x22, 0xE6, 0x3D, 0xE1, 0xE7, 0x45, 0xF6,\n    0x62, 0xF3, 0xAB, 0x9B, 0x0C, 0x11, 0x23, 0x57, 0x56, 0x57, 0xB7, 0xD8, 0x58, 0x37, 0x5A, 0x8C,\n    0x1F, 0x31, 0xA8, 0x29, 0x1A, 0x04, 0xE2, 0xA7, 0x4A, 0xC7, 0x27, 0xCC, 0x39, 0x0E, 0xEF, 0x7F,\n    0xD4, 0xE1, 0x46, 0xCD, 0xCC, 0x96, 0x22, 0xBC, 0x0E, 0xDD, 0xDF, 0xCA, 0xDB, 0x77, 0x65, 0x49,\n    0x7C, 0x2F, 0x2C, 0xC0, 0x94, 0x05, 0x71, 0xC2, 0x23, 0x5E, 0x74, 0xC3, 0x4E, 0x59, 0xA9, 0xE2,\n    0xD1, 0x0F, 0x2B, 0x68, 0x5E, 0x6C, 0x6B, 0x3C, 0xD4, 0x7C, 0x42, 0xE4, 0x26, 0x79, 0xAE, 0xFB,\n    0x14, 0x65, 0x56, 0x75, 0x6F, 0xA6, 0x70, 0xB9, 0x2E, 0x28, 0x94, 0xF1, 0xD2, 0xE3, 0xDA, 0x1C,\n    0x4B, 0xF2, 0x71, 0x8A, 0xED, 0xE6, 0x20, 0x1C, 0xF4, 0xEE, 0x63, 0xBB, 0x74, 0x73, 0x61, 0xD9,\n    0x55, 0x84, 0xED, 0xD9, 0x59, 0x1B, 0x47, 0x8B, 0xE5, 0xEF, 0xBF, 0xA5, 0x78, 0xB4, 0x99, 0x7E,\n    0xF3, 0x31, 0x59, 0x2A, 0xC8, 0x23, 0xB9, 0x0A, 0x81, 0xE2, 0x4C, 0x8A, 0x97, 0xBC, 0x74, 0x08,\n    0xE4, 0x35, 0x2D, 0xD1, 0x3C, 0xBA, 0xF2, 0x20, 0x51, 0x76, 0xF8, 0xFD, 0x20, 0x5D, 0xD2, 0x63,\n    0x7D, 0xA3, 0xEF, 0x7D, 0x56, 0x46, 0x44, 0x86, 0x29, 0x70, 0xC3, 0x5F, 0x1B, 0xC6, 0x3D, 0x42,\n    0xD3, 0x69, 0x78, 0x5C, 0xD3, 0xD4, 0x79, 0x3B, 0x0B, 0x81, 0x48, 0x00, 0xAA, 0xEA, 0x4C, 0x95,\n    0x56, 0x20, 0xE8, 0xB1, 0xB6, 0xE9, 0xA7, 0xD6, 0x0F, 0x4F, 0x5B, 0xB1, 0xC3, 0xCD, 0xF6, 0x43,\n    0x83, 0x6C, 0x4C, 0xA3, 0x17, 0x58, 0xAB, 0x06, 0x68, 0xBB, 0x14, 0x50, 0x07, 0xBC, 0x7B, 0x75,\n    0x9B, 0x5F, 0x96, 0xC6, 0x79, 0xFF, 0x3C, 0x6A, 0x05, 0x5B, 0xA4, 0x63, 0xA3, 0x93, 0x6F, 0x6F,\n    0x87, 0xE8, 0xAF, 0x44, 0x48, 0x02, 0x49, 0x4C, 0xED, 0x8C, 0x3A, 0x51, 0x50, 0x43, 0x6F, 0xE6,\n    0x2A, 0x5E, 0x47, 0x25, 0x05, 0xFB, 0x68, 0x17, 0x2D, 0x90, 0xEB, 0xE2, 0x76, 0xAB, 0x6B, 0x99,\n    0xB3, 0x84, 0x59, 0xD0, 0xFD, 0x6A, 0x60, 0x6E, 0x4F, 0x46, 0xA0, 0x37, 0xE7, 0x06, 0xB6, 0x15,\n    0xC9, 0x00, 0xEC, 0x00, 0x38, 0x0A, 0x8F, 0x81, 0xDB, 0xAB, 0xBA, 0xE7, 0xD3, 0x88, 0xF0, 0x1B,\n    0x5D, 0xE9, 0x41, 0xAC, 0xA0, 0xBC, 0x47, 0x93, 0x73, 0x04, 0x72, 0x88, 0x63, 0x91, 0xD8, 0x60,\n    0x82, 0xAA, 0x2D, 0x49, 0xA4, 0xFF, 0xFF, 0x0C, 0xCF, 0x16, 0x73, 0x74, 0xFE, 0x5F, 0x72, 0x90,\n    0x8C, 0x5E, 0x82, 0x2D, 0x6E, 0xDA, 0x8B, 0x30, 0xA6, 0x39, 0xFB, 0x2A, 0x92, 0xC5, 0x0D, 0x49,\n    0x3A, 0x59, 0x3E, 0x0D, 0xA7, 0xBB, 0x0B, 0x28, 0x46, 0x99, 0x6E, 0x7E, 0x6C, 0xD7, 0x6B, 0x89,\n    0x8D, 0x1A, 0x85, 0x1D, 0x7E, 0x1A, 0xE8, 0xC8, 0xEF, 0x8F, 0xDD, 0x00, 0xF8, 0x4F, 0xAE, 0x12,\n    0xF6, 0x88, 0x91, 0x36, 0xF9, 0xDB, 0x09, 0xDD, 0xF7, 0xD5, 0xB3, 0xC8, 0x90, 0x0C, 0xC4, 0xB0,\n    0x45, 0xD2, 0x96, 0xBF, 0x61, 0xE3, 0xD8, 0xD1, 0x4F, 0xDB, 0x1B, 0xF6, 0xA8, 0x0D, 0x40, 0xF0,\n    0xEF, 0x23, 0x26, 0x2F, 0x25, 0xAB, 0x0E, 0x15, 0xB6, 0x90, 0x1F, 0xA3, 0x6B, 0xEE, 0x93, 0xD4,\n    0x57, 0xA7, 0x78, 0x39, 0xB4, 0x79, 0x2B, 0x9E, 0xE7, 0xFA, 0x2E, 0x1D, 0xAA, 0x41, 0xEB, 0x87,\n    0x99, 0x4E, 0x78, 0x42, 0x47, 0x9D, 0x43, 0x80, 0x9F, 0x56, 0x13, 0x5E, 0x3D, 0x95, 0xF8, 0xB4,\n    0x76, 0x9F, 0x72, 0x83, 0x81, 0xB1, 0x74, 0xDE, 0x43, 0xBE, 0x91, 0x57, 0x71, 0x90, 0x3C, 0xA0,\n    0x1F, 0xA0, 0x87, 0x07, 0x47, 0xDF, 0x5C, 0xFD, 0x21, 0xD6, 0x64, 0x4C, 0x72, 0xFB, 0xCE, 0x21,\n    0xC5, 0x89, 0x23, 0x0B, 0xAE, 0x75, 0x72, 0x73, 0xA6, 0xA6, 0xB3, 0xCE, 0x9C, 0xB1, 0xAF, 0xAB,\n    0xDF, 0x06, 0x55, 0x5F, 0x0C, 0x1D, 0x6D, 0x13, 0xD1, 0xD2, 0xF0, 0x54, 0x00, 0xAE, 0xA6, 0x51,\n    0xF2, 0x8B, 0x50, 0xF5, 0x5D, 0x76, 0xC9, 0x4D, 0x55, 0x3C, 0x6F, 0xC7, 0xCB, 0xD1, 0x43, 0xEB,\n    0x52, 0xCE, 0x84, 0x00, 0x90, 0xEB, 0xBD, 0x54, 0xC9, 0x04, 0x3B, 0x4B, 0xA9, 0x5D, 0x53, 0x0D,\n    0xB6, 0x13, 0x55, 0xD4, 0x36, 0xEB, 0x71, 0x23, 0x00, 0x98, 0xB3, 0xB9, 0x73, 0x8B, 0x0B, 0xD3,\n    0xB9, 0x67, 0x50, 0x28, 0xBC, 0xCC, 0x16, 0xD5, 0xDE, 0x72, 0x5B, 0x75, 0x7B, 0x12, 0xF6, 0x3C,\n    0x94, 0xAE, 0x3E, 0xEF, 0x44, 0x3B, 0x9E, 0x8F, 0x80, 0x1C, 0x18, 0x5F, 0x9B, 0x43, 0x4F, 0xF5,\n    0xB1, 0xD7, 0x8A, 0x42, 0xA0, 0x51, 0x74, 0x86, 0x0F, 0x31, 0x18, 0x6C, 0x47, 0xF8, 0xB9, 0x97,\n    0x0F, 0x4B, 0x47, 0x18, 0xF6, 0x5C, 0x70, 0x49, 0xBF, 0xF5, 0x00, 0x08, 0xC6, 0xD7, 0x04, 0x79,\n    0xE2, 0xE5, 0x05, 0xAA, 0x00, 0x4A, 0xE0, 0xA8, 0x62, 0xDC, 0xD7, 0x17, 0x7C, 0x8D, 0x17, 0x14,\n    0x0A, 0x16, 0x3B, 0x0B, 0x70, 0x50, 0xF0, 0xB8, 0x1A, 0xE0, 0xB9, 0x8C, 0x04, 0xF0, 0xEB, 0xB1,\n    0xCB, 0x15, 0x3C, 0xF6, 0xCE, 0xED, 0x40, 0xA2, 0x40, 0x36, 0x3A, 0xF0, 0xA8, 0x21, 0xF9, 0x31,\n    0x49, 0x8A, 0xC8, 0x1D, 0x57, 0x63, 0xC3, 0x4E, 0x98, 0x3E, 0x2A, 0x0C, 0x41, 0xD9, 0x01, 0xF6,\n    0xB5, 0xB4, 0xCD, 0x5C, 0xCE, 0x1A, 0x04, 0x81, 0xC4, 0x66, 0x38, 0xAA, 0x06, 0xC9, 0xDA, 0x42,\n    0x8F, 0x26, 0x7D, 0xB3, 0x51, 0x43, 0x94, 0x1A, 0xC6, 0x8E, 0x2C, 0x78, 0xC4, 0x4E, 0x88, 0x40,\n    0xF3, 0x38, 0x47, 0x4E, 0x0F, 0xA4, 0x29, 0xBC, 0xC2, 0x02, 0x1F, 0x58, 0x44, 0xF4, 0x1B, 0x8D,\n    0x2B, 0x82, 0x15, 0x92, 0x80, 0xA2, 0x65, 0xBD, 0x50, 0x93, 0xC5, 0xF9, 0xEF, 0x18, 0x83, 0x45,\n    0x51, 0x4A, 0x5C, 0xCC, 0x9C, 0x69, 0xF6, 0x96, 0x9E, 0xC0, 0x14, 0x2A, 0x48, 0x72, 0xBD, 0xEE,\n    0x93, 0x4B, 0x50, 0xFF, 0xF4, 0x60, 0x62, 0x33, 0xE2, 0x0B, 0xD3, 0x63, 0xFE, 0xE6, 0xE5, 0xE9,\n    0xB0, 0x1A, 0x25, 0x7F, 0x5B, 0xDC, 0xF7, 0xA0, 0x9A, 0x5B, 0x61, 0x76, 0x61, 0x5D, 0x1F, 0xE3,\n    0x24, 0x02, 0x11, 0x28, 0x97, 0x0E, 0xCB, 0x95, 0x08, 0x1B, 0xD1, 0xA8, 0xD9, 0xE7, 0x91, 0xC6,\n    0x47, 0x38, 0x10, 0xEC, 0x33, 0xE0, 0x45, 0xF4, 0xE8, 0xAF, 0xBD, 0xCB, 0x5C, 0x32, 0x38, 0x3D,\n    0x49, 0xC6, 0x36, 0x62, 0xE3, 0x7D, 0x94, 0xC4, 0x05, 0xAF, 0x47, 0x0B, 0x01, 0x72, 0xF1, 0x76,\n    0x2B, 0x7C, 0xCC, 0x62, 0xB2, 0xF4, 0xD4, 0xE0, 0x10, 0x02, 0x1D, 0xFD, 0x3B, 0xE3, 0x0F, 0x46,\n    0x45, 0x18, 0x11, 0xF5, 0xBF, 0x15, 0xEB, 0xC7, 0xA4, 0x15, 0x96, 0x53, 0x02, 0xC1, 0xCD, 0xB0,\n    0xC0, 0xD4, 0xE7, 0xBC, 0x47, 0x7F, 0xE3, 0xAD, 0x1F, 0x4A, 0xFF, 0x36, 0xB2, 0x83, 0x5D, 0x1B,\n    0xF1, 0x2C, 0xE9, 0xE5, 0xDA, 0x17, 0x0F, 0x6C, 0x68, 0x55, 0x23, 0xEC, 0x28, 0x4C, 0x2B, 0xC3,\n    0xC3, 0xC2, 0x26, 0x9D, 0xF0, 0x61, 0x8C, 0xDC, 0xD6, 0xDB, 0xDB, 0x3E, 0xF0, 0x37, 0x67, 0xBC,\n    0x67, 0xFA, 0xCD, 0x17, 0xBC, 0xBA, 0xAC, 0x05, 0xA1, 0x50, 0x41, 0x0B, 0x18, 0x97, 0xE9, 0x7B,\n    0xE9, 0xE5, 0xA5, 0x70, 0x14, 0x24, 0x7B, 0x75, 0x74, 0xCD, 0x9C, 0x9B, 0xA6, 0xC3, 0x6B, 0x10,\n    0x7F, 0x9C, 0x6F, 0x8A, 0xE6, 0xDD, 0x30, 0xB0, 0x70, 0x7E, 0x46, 0xB5, 0xC5, 0xDE, 0x97, 0xE0,\n    0x65, 0x64, 0x64, 0x3E, 0xAD, 0xA3, 0xA8, 0x0A, 0x69, 0xC7, 0x37, 0x5E, 0xCE, 0x17, 0xFD, 0x2B,\n    0x0C, 0xAE, 0x04, 0xDE, 0xFB, 0x6A, 0x96, 0xD1, 0x6C, 0x32, 0x00, 0xC8, 0xBD, 0x4B, 0xB6, 0x9A,\n    0xC5, 0xF7, 0xDA, 0xBC, 0xED, 0xA7, 0x11, 0x0D, 0x91, 0x75, 0xC3, 0xFF, 0x7A, 0xC9, 0x06, 0x18,\n    0x1C, 0x31, 0x92, 0xC2, 0x49, 0x7B, 0xB4, 0xC6, 0xF8, 0xA3, 0x42, 0xC0, 0x37, 0xBE, 0xAD, 0x3C,\n    0x06, 0xF5, 0x73, 0x62, 0xBF, 0xDE, 0x08, 0x77, 0x29, 0x52, 0x2E, 0x28, 0x57, 0xBF, 0xF9, 0x98,\n    0xFA, 0xC3, 0x9F, 0xC4, 0xF4, 0xB2, 0xC2, 0x99, 0x4E, 0x45, 0x33, 0x50, 0xB4, 0x9A, 0x65, 0xC9,\n    0xFB, 0x40, 0xC2, 0x77, 0xAC, 0xC8, 0x87, 0x1C, 0x9F, 0x7F, 0xD9, 0x1C, 0xE7, 0xC1, 0x04, 0x44,\n    0xAB, 0xFA, 0x47, 0x5D, 0xE4, 0x89, 0x2D, 0xCF, 0x52, 0xC1, 0x24, 0x30, 0x3D, 0xAD, 0x1B, 0x25,\n    0x34, 0xAF, 0x76, 0xBA, 0xE0, 0x26, 0xF2, 0x63, 0xD0, 0x68, 0xFA, 0x18, 0x07, 0xA4, 0x39, 0xEE,\n    0xF2, 0xF0, 0xEC, 0xDD, 0xB4, 0x95, 0x4E, 0xBF, 0x46, 0x31, 0x39, 0xC7, 0x1D, 0xB6, 0xCB, 0x5F,\n    0xA2, 0xA2, 0x62, 0x83, 0x11, 0xA5, 0xE9, 0xED, 0x92, 0xC2, 0xD8, 0x5B, 0x64, 0xD9, 0x65, 0xFE,\n    0x18, 0xE8, 0xB1, 0xBD, 0xAD, 0xF2, 0xF9, 0xD0, 0x1D, 0xCB, 0x71, 0xDC, 0x49, 0x3F, 0x4F, 0xD9,\n    0x9E, 0x17, 0x7F, 0xF6, 0x46, 0xA0, 0xFF, 0x99, 0x17, 0xA2, 0xE6, 0xEB, 0xDE, 0xB7, 0xAF, 0x26,\n    0x4C, 0xFD, 0xDA, 0xE1, 0xFB, 0xEF, 0xAA, 0xC5, 0x2F, 0xF9, 0x31, 0x5C, 0xF6, 0x91, 0x70, 0xDA,\n    0x66, 0xED, 0xB3, 0x51, 0x72, 0x95, 0x29, 0x22, 0xA5, 0xE2, 0x82, 0x0C, 0x43, 0xFE, 0x92, 0xFF,\n    0x72, 0xA8, 0xD9, 0xF5, 0x6F, 0xCF, 0x63, 0xFC, 0x75, 0xD2, 0x33, 0x47, 0xAD, 0x01, 0x87, 0xC2,\n    0xE6, 0xDE, 0xBB, 0xB9, 0xCF, 0xE2, 0x17, 0x50, 0x3A, 0x68, 0x31, 0xD1, 0xB6, 0xC9, 0x3F, 0x43,\n    0x25, 0xBC, 0xB5, 0xF3, 0xC9, 0xF9, 0xF3, 0xB3, 0x11, 0x5E, 0xF6, 0xE0, 0xBF, 0xAF, 0x1B, 0x90,\n    0xA3, 0x61, 0xA3, 0x36, 0xFB, 0xBF, 0x0E, 0x62, 0xDF, 0xCC, 0x9B, 0x51, 0x59, 0xFE, 0xA4, 0xFA,\n    0xD1, 0x3A, 0x4B, 0xA5, 0x9A, 0xA8, 0x21, 0x01, 0x1D, 0x52, 0xAF, 0xBE, 0x74, 0x2D, 0x8B, 0x91,\n    0x91, 0x98, 0xC9, 0xD1, 0x9C, 0x5B, 0x38, 0x12, 0x00, 0x2B, 0x12, 0x6F, 0x92, 0x7A, 0xC7, 0x45,\n    0x16, 0xB8, 0xA7, 0xB3, 0x9F, 0x46, 0xF9, 0xAE, 0xBD, 0x13, 0xFB, 0xDD, 0xDB, 0x86, 0x8A, 0x94,\n    0xFB, 0x10, 0x3B, 0xA3, 0x4D, 0x4C, 0x4D, 0xDD, 0xC2, 0x38, 0x22, 0x58, 0xC4, 0x34, 0xCE, 0x58,\n    0x78, 0x89, 0x7B, 0x77, 0x28, 0x30, 0xD6, 0xC7, 0x44, 0x04, 0x52, 0x7A, 0x19, 0x1E, 0xF1, 0xFD,\n    0xD3, 0x77, 0x5F, 0x50, 0x0D, 0xAE, 0xAE, 0xEF, 0x59, 0x06, 0xF4, 0x3D, 0x18, 0x43, 0x38, 0x51,\n    0xD6, 0x3D, 0xC5, 0x23, 0x04, 0x1F, 0x5B, 0x25, 0x4C, 0x74, 0xB0, 0xC6, 0xEB, 0x76, 0xBA, 0xE8,\n    0xB1, 0xA7, 0x44, 0xE2, 0x5C, 0xD4, 0x18, 0x1D, 0x34, 0x8D, 0xA8, 0x05, 0x25, 0x03, 0xA2, 0xD7,\n    0xA3, 0x3F, 0x50, 0x07, 0x52, 0x09, 0x2D, 0x88, 0xFC, 0x2C, 0xF3, 0xAF, 0xB4, 0x89, 0x6A, 0xA0,\n    0x27, 0x5F, 0xD3, 0x2B, 0x63, 0x8D, 0xD9, 0x60, 0x1B, 0xD3, 0x35, 0x18, 0x61, 0x93, 0xF6, 0x82,\n    0xD8, 0xBC, 0x9F, 0x90, 0xB6, 0xB1, 0xCF, 0xFD, 0x3B, 0xD4, 0xA8, 0x07, 0x0D, 0x76, 0xF1, 0x44,\n    0x4F, 0x45, 0x10, 0x4C, 0xFB, 0x92, 0x1A, 0x56, 0x48, 0x87, 0x15, 0x7B, 0x55, 0x3D, 0x10, 0xCE,\n    0xD8, 0x07, 0x3A, 0x79, 0x72, 0x17, 0x5C, 0xF2, 0x9C, 0x84, 0xE1, 0x72, 0x36, 0x2A, 0xEB, 0xBB,\n    0xEE, 0x3E, 0xC8, 0x1F, 0x33, 0x2F, 0x53, 0xDF, 0x6B, 0xE8, 0x3E, 0x0A, 0x5C, 0x32, 0x36, 0x81,\n    0x77, 0x4A, 0xD6, 0xD0, 0xA8, 0x14, 0xBB, 0x32, 0xDC, 0x8B, 0x55, 0xB2, 0xEF, 0xD4, 0xE8, 0xCA,\n    0xFF, 0x50, 0xDC, 0xBD, 0x55, 0xB5, 0x5E, 0xBE, 0x1B, 0x74, 0x8A, 0x57, 0x5B, 0xBC, 0xCC, 0x2F,\n    0xF6, 0x72, 0x0C, 0xAF, 0x9F, 0x2A, 0x96, 0xBE, 0xDC, 0xBC, 0xFC, 0x3A, 0xA8, 0xDF, 0x3E, 0x2E,\n    0x78, 0xA7, 0xD8, 0xA0, 0x2A, 0x95, 0x70, 0x24, 0xBC, 0x6C, 0x1A, 0xFA, 0xAA, 0xE6, 0xE1, 0x38,\n    0xE4, 0x8A, 0xD8, 0x63, 0x03, 0x82, 0x3C, 0xFB, 0xA6, 0x9E, 0xB9, 0x69, 0xF6, 0x04, 0x60, 0x37,\n    0x0B, 0xBC, 0xEF, 0x85, 0x70, 0xD4, 0xCB, 0xBE, 0x3E, 0xD3, 0xF2, 0x81, 0x37, 0x45, 0x1A, 0x94,\n    0xB4, 0x02, 0xD9, 0xA2, 0xC8, 0x1D, 0x92, 0xE0, 0x5C, 0xA4, 0x5D, 0x43, 0xA5, 0xFA, 0x1D, 0xD3,\n    0x18, 0x14, 0x0B, 0x18, 0x86, 0x74, 0x8E, 0x16, 0xB3, 0x65, 0xD3, 0x24, 0x45, 0x71, 0xA9, 0x28,\n    0x46, 0x25, 0x68, 0x21, 0x94, 0x8D, 0xDB, 0xCA, 0x13, 0x3C, 0x0C, 0xB1, 0xBB, 0xF2, 0x6E, 0xC2,\n    0x2D, 0x67, 0xBA, 0x0D, 0xA9, 0x5B, 0x3A, 0xD7, 0x45, 0xDC, 0x68, 0x94, 0x41, 0x30, 0xC1, 0xAD,\n    0x0C, 0xEF, 0x7E, 0xB1, 0x66, 0x1E, 0xEE, 0x0E, 0x23, 0xC0, 0x6B, 0x08, 0xF0, 0x3E, 0xD0, 0xA8,\n    0xEF, 0x60, 0x34, 0xA7, 0xDB, 0x9A, 0x3C, 0xD5, 0xEE, 0x02, 0x4C, 0x3E, 0x1C, 0x94, 0x75, 0x8E,\n    0x95, 0xD2, 0x91, 0xCD, 0xF0, 0x20, 0x49, 0xBC, 0x6A, 0xBC, 0x26, 0x0C, 0x40, 0x55, 0x4F, 0xE4,\n    0x29, 0xC7, 0x2D, 0xB0, 0x55, 0x28, 0xB1, 0xB2, 0x99, 0x2A, 0x87, 0x4A, 0x19, 0x58, 0x7D, 0xEE,\n    0x24, 0xE7, 0xEE, 0xA6, 0x6A, 0xBE, 0xE1, 0x96, 0xBB, 0x80, 0xF0, 0x1B, 0x55, 0x71, 0x02, 0x9D,\n    0xCA, 0x8A, 0x51, 0xE4, 0x1D, 0x34, 0x6C, 0x1D, 0x22, 0x91, 0x3C, 0x19, 0xBC, 0x31, 0x59, 0xA0,\n    0xD4, 0x82, 0x96, 0xAE, 0xE9, 0x2B, 0x24, 0x8E, 0xF4, 0x97, 0x3B, 0xF0, 0x06, 0xC3, 0x60, 0x18,\n    0x0A, 0x46, 0xA3, 0x69, 0xA3, 0x9B, 0x35, 0xA8, 0x04, 0xBC, 0x5B, 0x60, 0xE5, 0xF5, 0x10, 0x22,\n    0x03, 0x59, 0x12, 0x09, 0x1B, 0x28, 0x6B, 0xC4, 0xF1, 0x82, 0xB1, 0x72, 0x43, 0x8B, 0x0A, 0x27,\n    0x84, 0x7A, 0x38, 0x72, 0x64, 0xFD, 0x74, 0x39, 0x02, 0xB6, 0x19, 0xE2, 0xDD, 0x28, 0x85, 0x61,\n    0xDE, 0x4F, 0x15, 0x0B, 0x90, 0xE3, 0x83, 0xB5, 0x82, 0xC6, 0xB9, 0xA6, 0xFD, 0x6B, 0x8A, 0xB1,\n    0x9E, 0xEB, 0xA9, 0xFC, 0xAA, 0x10, 0xC9, 0x4D, 0x06, 0xAB, 0x53, 0x06, 0x2F, 0xF5, 0x7A, 0x94,\n    0xFB, 0x45, 0x14, 0x52, 0x1D, 0xFD, 0xCD, 0x2C, 0xC7, 0x7B, 0x6D, 0x89, 0xCB, 0x50, 0xC4, 0x6D,\n    0x89, 0x9D, 0x66, 0x66, 0xFA, 0x17, 0xD7, 0x03, 0xB4, 0x62, 0xAA, 0x6F, 0xEC, 0xB9, 0x33, 0xF1,\n    0x2A, 0x7E, 0x53, 0x2C, 0x86, 0x41, 0xF2, 0x73, 0xE1, 0xC6, 0xFB, 0x6E, 0x0F, 0x5B, 0x31, 0x66,\n    0xB3, 0x6C, 0x89, 0xC7, 0x49, 0x26, 0xE6, 0x1B, 0x22, 0xB1, 0x01, 0xC8, 0x00, 0x1D, 0xFF, 0xAF,\n    0x3C, 0x5F, 0x48, 0xB3, 0x59, 0xCC, 0xAE, 0x96, 0x36, 0x30, 0xCB, 0xBF, 0x64, 0xEB, 0x7D, 0xC1,\n    0xF0, 0x36, 0xA8, 0x0D, 0xD1, 0x5D, 0xAB, 0x31, 0x89, 0x8E, 0x40, 0x1D, 0xED, 0x84, 0xC9, 0x08,\n    0x73, 0xB4, 0xFE, 0x20, 0xEF, 0x15, 0x25, 0xD1, 0xF8, 0xAA, 0x24, 0xF9, 0xCE, 0xEC, 0x2B, 0x38,\n    0x30, 0x98, 0x97, 0x7A, 0x43, 0xEE, 0xFC, 0xCE, 0x1C, 0x90, 0x87, 0x48, 0x7D, 0x7F, 0x97, 0xDF,\n    0x72, 0x18, 0x16, 0xD7, 0xD3, 0xD7, 0x65, 0xA1, 0xB5, 0xEC, 0xC2, 0xFC, 0x95, 0xC0, 0x34, 0x34,\n    0x51, 0x15, 0xE5, 0x72, 0xDC, 0x9A, 0x56, 0x67, 0x01, 0xF8, 0x9C, 0x96, 0x12, 0x9E, 0xF4, 0xBD,\n    0x5B, 0xBE, 0x17, 0xC2, 0xC2, 0x32, 0x6A, 0x0A, 0xD2, 0x4A, 0x0C, 0xF6, 0xAC, 0x33, 0x64, 0x48,\n    0xE7, 0x36, 0x20, 0x99, 0x4A, 0xCA, 0xF2, 0xFC, 0xC7, 0x88, 0x34, 0x68, 0x15, 0xFC, 0x28, 0x2E,\n    0xAC, 0xD2, 0x9E, 0xEE, 0x39, 0x7A, 0xC9, 0xB4, 0x88, 0x64, 0xEA, 0x1F, 0x21, 0xA2, 0x5C, 0x5F,\n    0x29, 0xD1, 0x5B, 0xE9, 0x7E, 0x76, 0x24, 0x7A, 0x05, 0x00, 0xCF, 0x49, 0x0D, 0x51, 0x28, 0x65,\n    0x07, 0x82, 0xC2, 0x9E, 0x13, 0xED, 0x4A, 0x86, 0xB6, 0xCA, 0x78, 0x15, 0xF0, 0x2C, 0x7A, 0xE5,\n    0x00, 0xF5, 0x74, 0xFF, 0x2E, 0x50, 0x85, 0xE0, 0x72, 0xCA, 0xB1, 0x41, 0xC2, 0x88, 0x7F, 0x37,\n    0x9F, 0x46, 0xB2, 0x1F, 0x20, 0x69, 0x7B, 0x1B, 0x44, 0xF6, 0x56, 0xD7, 0xDB, 0xDB, 0x58, 0x5D,\n    0xF0, 0xDB, 0x11, 0x2B, 0x6E, 0x31, 0xE0, 0x95, 0x8C, 0xAC, 0x64, 0x7A, 0xDE, 0x40, 0x6B, 0xA4,\n    0x78, 0x7A, 0xC1, 0xAB, 0x6A, 0x03, 0x4F, 0x88, 0x96, 0x0E, 0xF1, 0x14, 0x6B, 0x66, 0xB7, 0x9F,\n    0x51, 0x25, 0x4F, 0x9A, 0x25, 0x19, 0xBA, 0xE2, 0x31, 0xC5, 0x6D, 0xB0, 0x11, 0x28, 0x1D, 0xAF,\n    0x8B, 0xEB, 0x75, 0x69, 0x85, 0xB9, 0x27, 0x47, 0xB1, 0x84, 0x35, 0x19, 0xC6, 0xEB, 0xE9, 0x4E,\n    0x3F, 0x61, 0xFD, 0xA4, 0xEE, 0xD2, 0xC0, 0x31, 0xEC, 0x22, 0x56, 0xE5, 0xB7, 0x22, 0x76, 0x34,\n    0x2A, 0x75, 0xC1, 0x5D, 0x76, 0x7A, 0xFE, 0x4D, 0x48, 0x17, 0x53, 0xEA, 0xCD, 0x13, 0x09, 0xFF,\n    0x04, 0x9D, 0xB1, 0x11, 0x70, 0xAF, 0x9B, 0x15, 0x1B, 0xB6, 0x81, 0xD4, 0xF6, 0x38, 0x72, 0x65,\n    0xF5, 0xFB, 0x01, 0xF5, 0xB0, 0xD0, 0xBA, 0xCA, 0xF0, 0x8E, 0x94, 0x81, 0xB1, 0x39, 0xBD, 0x7F,\n    0x3A, 0x33, 0x89, 0x04, 0xE5, 0x96, 0x7E, 0xF6, 0xFC, 0x48, 0xE5, 0x96, 0xCF, 0x05, 0xAE, 0x8F,\n    0x3E, 0xDE, 0x30, 0x92, 0xB8, 0xE0, 0x20, 0x1B, 0x86, 0xC3, 0x12, 0xA8, 0xCA, 0xD8, 0xF3, 0xF5,\n    0xBF, 0x55, 0x0D, 0x8B, 0x20, 0xC8, 0x96, 0xB8, 0x8E, 0x47, 0xCB, 0xC8, 0xE2, 0x73, 0xF9, 0x1A,\n    0xFD, 0x07, 0x90, 0x71, 0xDB, 0xC4, 0xAF, 0xCE, 0xB4, 0xB6, 0x3A, 0x53, 0xCB, 0x1F, 0xCC, 0x67,\n    0xE9, 0x9E, 0xD2, 0x82, 0x1F, 0xE0, 0x46, 0x46, 0xF8, 0xE6, 0x22, 0x01, 0xE7, 0x54, 0x66, 0xB3,\n    0x66, 0x2E, 0xE3, 0x2B, 0x7E, 0x78, 0x6C, 0x68, 0x81, 0xDC, 0x9E, 0x6F, 0xCA, 0xD3, 0x25, 0x94,\n    0x30, 0x84, 0x4F, 0x32, 0xD5, 0x37, 0x21, 0x2C, 0xF6, 0xCE, 0x85, 0x83, 0x21, 0x6F, 0xC9, 0x09,\n    0xE5, 0x0A, 0xE4, 0x8C, 0x22, 0x66, 0xB9, 0x50, 0xFB, 0xE6, 0x97, 0xCF, 0x74, 0x8A, 0xC7, 0x67,\n    0xCB, 0x38, 0xDA, 0x85, 0x47, 0x8B, 0xF0, 0x64, 0xF3, 0xFF, 0xA4, 0x91, 0x05, 0x7C, 0xE8, 0xED,\n    0x6F, 0x9F, 0x93, 0x3E, 0x18, 0xA2, 0x4C, 0x68, 0x0C, 0x62, 0xEB, 0x6D, 0x3A, 0x45, 0x52, 0xBF,\n    0x05, 0xC1, 0xB8, 0xB5, 0x0C, 0xBB, 0xCB, 0xF7, 0xA5, 0x88, 0xB4, 0x94, 0x00, 0x77, 0x92, 0x9D,\n    0xA3, 0xFB, 0xC2, 0x04, 0x11, 0x4F, 0x8F, 0xA2, 0x22, 0xFB, 0xEC, 0x71, 0xCA, 0x5E, 0x3A, 0xC2,\n    0x42, 0x1C, 0x2B, 0x74, 0xCE, 0x9E, 0x46, 0xF7, 0xEF, 0x48, 0x24, 0xCF, 0xBA, 0xE1, 0x0A, 0x92,\n    0xC9, 0x59, 0xF5, 0x10, 0xD7, 0x25, 0x6E, 0xAB, 0x9B, 0xAB, 0xD4, 0xC6, 0x16, 0x98, 0x5B, 0x31,\n    0x87, 0x39, 0x21, 0xA9, 0x09, 0x7F, 0x47, 0x0B, 0xF4, 0xFB, 0xA9, 0xFE, 0x60, 0x07, 0x1A, 0x31,\n    0xEC, 0x48, 0x64, 0x0D, 0x73, 0x71, 0xDF, 0x78, 0xE6, 0xB1, 0x76, 0xD9, 0xE1, 0x4C, 0xCF, 0x80,\n    0xBD, 0x58, 0x96, 0xAF, 0x3D, 0x3D, 0x82, 0x7B, 0xC0, 0x16, 0xD7, 0xD7, 0x8C, 0xBC, 0x5F, 0x91,\n    0x30, 0xA3, 0x6C, 0x5D, 0x25, 0xCF, 0xAC, 0xA6, 0xEC, 0xCF, 0x42, 0x41, 0x05, 0xA4, 0x74, 0x2E,\n    0x82, 0xBA, 0x21, 0x42, 0x95, 0xDF, 0xF2, 0xD6, 0x29, 0x5B, 0x04, 0xBD, 0x47, 0x8E, 0x47, 0xBA,\n    0x3F, 0x99, 0x20, 0x4D, 0x74, 0x56, 0xD6, 0x43, 0x42, 0xC4, 0x36, 0x7D, 0x24, 0xE3, 0xC9, 0xD8,\n    0x66, 0xAB, 0x3D, 0x62, 0xE2, 0xA9, 0x51, 0x3C, 0x9F, 0x1A, 0xA7, 0x6C, 0x7F, 0x4D, 0xC9, 0xEB,\n    0x21, 0x66, 0xBB, 0x46, 0xA4, 0x97, 0x5E, 0x6D, 0xAD, 0xD4, 0x6F, 0xFB, 0xB1, 0xC6, 0x6F, 0x51,\n    0x2F, 0x0A, 0x9A, 0x97, 0x8E, 0xBB, 0x80, 0xD7, 0x16, 0x70, 0xC4, 0x98, 0xEE, 0xB9, 0x69, 0x48,\n    0x49, 0xA2, 0xBB, 0x93, 0x8B, 0xE6, 0x10, 0xCB, 0xC3, 0x8D, 0x57, 0x17, 0x0A, 0xFE, 0x1B, 0xB5,\n    0x40, 0x06, 0x7D, 0xE4, 0x89, 0x76, 0x13, 0x01, 0xB1, 0x2E, 0x01, 0xD7, 0x20, 0x1D, 0x5B, 0xE9,\n    0x5C, 0x11, 0x24, 0x78, 0xF5, 0x9F, 0x02, 0xF8, 0x8B, 0xA9, 0x0B, 0x22, 0x42, 0x66, 0x1A, 0xFE,\n    0x15, 0xF7, 0x51, 0x93, 0xB7, 0xDB, 0x00, 0x52, 0x0A, 0xF0, 0x4A, 0xA8, 0xE1, 0xDF, 0xCE, 0x88,\n    0xBF, 0x47, 0x47, 0x73, 0x48, 0x19, 0x89, 0x3B, 0xDD, 0xD2, 0x82, 0x14, 0xB4, 0x70, 0xF6, 0xF2,\n    0xC1, 0x4D, 0x8B, 0x47, 0x74, 0x12, 0xC1, 0x42, 0x69, 0xE1, 0xFD, 0x25, 0x6F, 0x62, 0xF6, 0x41,\n    0xF8, 0x60, 0x83, 0xB8, 0x91, 0x06, 0x09, 0x5D, 0x90, 0x2E, 0x52, 0xB3, 0xFC, 0x34, 0x86, 0xD7,\n    0xC8, 0x27, 0x94, 0xA4, 0xB9, 0x32, 0x7E, 0xA0, 0xA4, 0xB4, 0xE5, 0x2F, 0x14, 0x37, 0x7B, 0xFA,\n    0x9C, 0x15, 0xD0, 0xE2, 0x13, 0x4C, 0x62, 0x24, 0xE8, 0x0C, 0xDC, 0x52, 0x10, 0xC3, 0xCE, 0x6F,\n    0xE5, 0x21, 0x57, 0xF3, 0x17, 0xD0, 0x0F, 0x67, 0x9D, 0x58, 0xEA, 0x84, 0x13, 0x9E, 0xE3, 0xEA,\n    0xF6, 0xBC, 0x5C, 0x40, 0xCE, 0xCC, 0xAA, 0xE8, 0x5B, 0x41, 0x86, 0x68, 0xD7, 0xC3, 0x3B, 0x66,\n    0xFB, 0x6B, 0xC1, 0xAE, 0x72, 0x29, 0xE6, 0x6C, 0x2A, 0x71, 0xB4, 0xC5, 0x4F, 0x69, 0xBA, 0x40,\n    0x80, 0x58, 0x08, 0x4F, 0x8D, 0xE5, 0x69, 0x44, 0x1B, 0xC0, 0x3D, 0x97, 0xAB, 0x7D, 0x23, 0xF3,\n    0x79, 0x40, 0x1A, 0x9D, 0x04, 0x98, 0x31, 0x6A, 0x5E, 0x6C, 0x59, 0x17, 0xEA, 0x34, 0xEC, 0x29,\n    0xA2, 0x7D, 0xC9, 0x2B, 0x5B, 0x76, 0x9C, 0x15, 0x22, 0x67, 0x6C, 0x08, 0x33, 0x41, 0xC5, 0x46,\n    0xA7, 0xA6, 0x0E, 0xEB, 0xFB, 0x92, 0x17, 0x41, 0xAF, 0x3B, 0x22, 0x96, 0xDE, 0x35, 0xD6, 0xB6,\n    0x7C, 0xEF, 0x6B, 0xF6, 0x10, 0xFC, 0xE7, 0xBC, 0x38, 0xE2, 0xB7, 0xA6, 0x93, 0x1F, 0x12, 0x86,\n    0xF7, 0x1F, 0xBE, 0x41, 0x42, 0xCC, 0xDB, 0xF8, 0x52, 0xCB, 0xFD, 0xFF, 0x40, 0xC1, 0x38, 0x50,\n    0x6F, 0x72, 0x77, 0x2B, 0xB1, 0x27, 0xCD, 0x9A, 0x0F, 0x6B, 0x5D, 0x1E, 0xE7, 0x9A, 0xB9, 0xA4,\n    0xA2, 0xC3, 0x8C, 0x2D, 0x73, 0xC1, 0xF9, 0x6B, 0x5E, 0x08, 0xD8, 0x8B, 0x1E, 0x05, 0x0A, 0x04,\n    0xBD, 0x29, 0xE2, 0x57, 0x52, 0xF7, 0x21, 0xEE, 0x10, 0x36, 0x7E, 0x90, 0x09, 0x08, 0xA3, 0x44,\n    0xE1, 0xCA, 0xCF, 0x59, 0x53, 0xDB, 0x6E, 0x65, 0x28, 0xEE, 0xF3, 0x60, 0xCB, 0x47, 0x83, 0x18,\n    0xDC, 0x05, 0xAD, 0xCC, 0x04, 0x09, 0x91, 0x05, 0xAE, 0x96, 0x2F, 0x10, 0x0E, 0x50, 0x0C, 0xF0,\n    0x57, 0xA8, 0xEE, 0x81, 0x89, 0x4C, 0x9B, 0x72, 0x13, 0xA1, 0xB9, 0x5A, 0x9E, 0x31, 0xB2, 0xA9,\n    0x80, 0xA8, 0x51, 0xEA, 0x7E, 0x59, 0xA7, 0xB9, 0x7C, 0xBE, 0x82, 0x13, 0xC7, 0x30, 0xAE, 0xF9,\n    0xF5, 0x22, 0x15, 0xE1, 0xC6, 0xC2, 0x06, 0xD9, 0xC9, 0xD9, 0xF4, 0x4C, 0xBF, 0x0A, 0x02, 0xD3,\n    0x4C, 0x38, 0x28, 0x60, 0x52, 0xB9, 0xF7, 0x3C, 0xD9, 0x1C, 0x28, 0x98, 0x89, 0xAC, 0xBD, 0x81,\n    0x17, 0x5E, 0x59, 0xF5, 0x55, 0xC7, 0xED, 0x58, 0x1F, 0x29, 0xE7, 0x57, 0xC1, 0x27, 0x0A, 0x7E,\n    0x67, 0x00, 0x56, 0xD5, 0x93, 0x99, 0xA6, 0x8E, 0x7D, 0xB1, 0xA0, 0x17, 0x98, 0x88, 0xA8, 0x9D,\n    0x2D, 0x27, 0x6B, 0x0C, 0x59, 0x5C, 0x0B, 0x3C, 0x6A, 0x3B, 0xFD, 0x44, 0x37, 0x18, 0xAA, 0x49,\n    0xE7, 0xA1, 0xC1, 0x24, 0xCD, 0xB6, 0xA6, 0x2C, 0x4D, 0x38, 0x1D, 0x3A, 0x0B, 0xA6, 0x42, 0x84,\n    0x48, 0x63, 0xCB, 0x5A, 0x74, 0xBF, 0x62, 0x3B, 0x5E, 0x55, 0x94, 0xC7, 0x52, 0x7D, 0xD1, 0xA6,\n    0xFE, 0x3B, 0x1A, 0xE8, 0x80, 0x3D, 0x57, 0x9E, 0x03, 0xE4, 0xA7, 0xB0, 0x52, 0x84, 0x42, 0xC4,\n    0x95, 0x63, 0xC9, 0xD2, 0x6E, 0xA9, 0x51, 0xE8, 0x51, 0x9C, 0xFB, 0x67, 0xD1, 0xF6, 0x37, 0xC2,\n    0x56, 0x64, 0x95, 0x70, 0x07, 0x23, 0x0C, 0x79, 0x4C, 0x20, 0x52, 0x94, 0x68, 0x9B, 0xC3, 0x64,\n    0x7A, 0xBC, 0xF6, 0x54, 0x97, 0xF0, 0xEB, 0x0F, 0x71, 0x8E, 0x69, 0x85, 0xCC, 0x2F, 0x2B, 0x2F,\n    0xCF, 0x8D, 0xEA, 0x1A, 0x04, 0x37, 0x47, 0xDA, 0xFE, 0xCF, 0xD2, 0x5E, 0xA8, 0xE7, 0x03, 0x21,\n    0xBA, 0xFE, 0x88, 0x21, 0x33, 0x17, 0xE3, 0x78, 0xB0, 0xE4, 0x71, 0x47, 0x1A, 0x88, 0x9B, 0x4F,\n    0x5F, 0x38, 0xF8, 0x0F, 0x8F, 0x82, 0x04, 0x72, 0xDC, 0x1E, 0x7B, 0xB6, 0x90, 0x55, 0x19, 0xDE,\n    0xD7, 0x0E, 0xE6, 0xED, 0xEE, 0x9A, 0x47, 0x5A, 0x63, 0xC4, 0xE6, 0x2A, 0x09, 0xB0, 0xC4, 0x0A,\n    0xBA, 0x70, 0xF8, 0x18, 0x0F, 0xE1, 0x87, 0xAD, 0x41, 0xCE, 0xB9, 0x4B, 0x6E, 0xF1, 0x0B, 0x04,\n    0xAC, 0x6A, 0x4F, 0x09, 0x40, 0xDE, 0x60, 0xF2, 0x10, 0xC7, 0xD8, 0x11, 0xFB, 0x58, 0x4D, 0x8C,\n    0x6F, 0xD9, 0xF7, 0xA5, 0xC3, 0x13, 0x16, 0x39, 0x25, 0x5A, 0x01, 0xE5, 0x92, 0x06, 0x8A, 0x4A,\n    0x89, 0xB5, 0x43, 0x7A, 0x39, 0xC2, 0x12, 0xCD, 0x45, 0x8B, 0x8E, 0x59, 0x1C, 0x4F, 0x72, 0xA6,\n    0xEE, 0xA4, 0x88, 0x6F, 0x04, 0xE8, 0x68, 0xD1, 0xDC, 0x90, 0x41, 0x28, 0x8C, 0x2B, 0xC9, 0xF1,\n    0x92, 0x08, 0xAC, 0x7F, 0x7E, 0xEE, 0x7A, 0x3F, 0x54, 0xFB, 0x45, 0x7F, 0x73, 0xF6, 0xE5, 0xE2,\n    0xE4, 0x8C, 0x05, 0xA4, 0xAF, 0x63, 0x86, 0xB4, 0xA5, 0x6B, 0x33, 0x19, 0x00, 0x79, 0xB0, 0x73,\n    0x2C, 0x89, 0xFC, 0x81, 0xDF, 0x7E, 0x5C, 0x59, 0x02, 0xF2, 0xFA, 0x52, 0x9C, 0x1E, 0xD4, 0xE5,\n    0x56, 0x90, 0x56, 0x23, 0x3A, 0x7A, 0xFD, 0x6F, 0xB4, 0x98, 0x8D, 0x47, 0xD7, 0x4D, 0x84, 0xB9,\n    0x2A, 0x09, 0xF2, 0x6C, 0xAB, 0x1C, 0x70, 0xD1, 0x01, 0xD5, 0x63, 0xF0, 0xDF, 0x3F, 0xCD, 0x27,\n    0x94, 0x36, 0xB8, 0xE8, 0xB9, 0xAF, 0xB7, 0xDD, 0x41, 0xE1, 0x43, 0xC7, 0xE4, 0xF5, 0xA8, 0xB7,\n    0xF4, 0x59, 0x91, 0x84, 0x96, 0x0A, 0x6E, 0x13, 0xA8, 0x43, 0x1C, 0xC1, 0x4A, 0xB6, 0x52, 0x6E,\n    0x36, 0x21, 0x02, 0x18, 0x15, 0xB1, 0x65, 0xA5, 0xE1, 0x0F, 0xA5, 0x0C, 0xE1, 0xFF, 0xE2, 0x10,\n    0xCC, 0xBB, 0xBD, 0x33, 0x91, 0x73, 0x7D, 0xA0, 0x16, 0x23, 0x39, 0x9B, 0x36, 0xCF, 0x94, 0x2F,\n    0x7C, 0xA0, 0x63, 0xE8, 0x3C, 0xB8, 0xBE, 0xC5, 0x03, 0x3D, 0x1A, 0x3D, 0x97, 0x10, 0x7F, 0x79,\n    0x7F, 0xCA, 0x94, 0x77, 0x30, 0x1A, 0x5B, 0x3A, 0xF1, 0xAF, 0xF1, 0xF4, 0x4F, 0x69, 0xA8, 0x0C,\n    0x7B, 0x87, 0xED, 0x30, 0x99, 0xEE, 0xEE, 0xD5, 0xEF, 0x29, 0x1B, 0xB9, 0xC0, 0x4C, 0xF6, 0x46,\n    0x46, 0xD9, 0x12, 0x9E, 0x73, 0xF6, 0x5C, 0x8F, 0x12, 0x14, 0xF1, 0xFC, 0x4C, 0x49, 0xE6, 0xDF,\n    0xCD, 0x92, 0x82, 0xDC, 0xD6, 0xF1, 0x2D, 0x04, 0x27, 0x94, 0x55, 0xF5, 0x7E, 0xC5, 0x81, 0x4B,\n    0x84, 0xB8, 0x6F, 0x43, 0xD4, 0x4E, 0x58, 0x44, 0x66, 0x31, 0xC8, 0xB4, 0xD4, 0x64, 0x37, 0x72,\n    0xAA, 0x46, 0xD0, 0x7A, 0x49, 0x94, 0xEA, 0x1E, 0xF6, 0xED, 0x31, 0xE2, 0xCF, 0xD0, 0x12, 0x53,\n    0x5F, 0xC4, 0xA9, 0xF4, 0x79, 0xD5, 0xB2, 0x2E, 0xD2, 0x7C, 0xC9, 0x12, 0xDE, 0xFA, 0xED, 0x9E,\n    0x6B, 0xFB, 0x08, 0xBE, 0x61, 0x53, 0x96, 0x1A, 0xB8, 0x71, 0x2C, 0x5E, 0xE5, 0xF8, 0xAE, 0x68,\n    0xF5, 0x39, 0x11, 0x53, 0xDD, 0x30, 0x4F, 0x49, 0xCB, 0x5E, 0x9C, 0x20, 0x2B, 0x99, 0x77, 0x8F,\n    0xA8, 0x46, 0x5F, 0xD2, 0xBB, 0x31, 0x8E, 0x2C, 0x84, 0x60, 0x63, 0xEB, 0xE9, 0x0C, 0x20, 0x98,\n    0xAA, 0x58, 0xF5, 0x75, 0xA0, 0x2E, 0xB2, 0x65, 0x79, 0xA2, 0xB9, 0xAB, 0xD9, 0xE8, 0xA6, 0xF3,\n    0x1B, 0x34, 0x37, 0x75, 0xA4, 0xFF, 0x00, 0xF8, 0xA6, 0xF6, 0x26, 0xA4, 0xFF, 0x63, 0x14, 0xB9,\n    0xA5, 0xD0, 0x12, 0x45, 0x08, 0x8C, 0x6E, 0x78, 0x0C, 0xC5, 0x75, 0xB8, 0xEC, 0x77, 0x73, 0xEA,\n    0x87, 0x6F, 0xAD, 0x4D, 0x98, 0xCD, 0xC7, 0xA5, 0x20, 0xC3, 0x4E, 0x31, 0x79, 0x16, 0xB0, 0x2A,\n    0x9A, 0x84, 0x02, 0xAA, 0x00, 0x60, 0xBB, 0x58, 0x84, 0xC6, 0x95, 0xF3, 0xF4, 0x6C, 0xEB, 0xD8,\n    0xEC, 0x1A, 0xC3, 0x92, 0xD6, 0x09, 0x58, 0x56, 0xDB, 0x64, 0xF9, 0x00, 0x1A, 0x45, 0xF4, 0x2F,\n    0x65, 0x71, 0x8C, 0xD0, 0x9B, 0xFA, 0x0B, 0x7E, 0xDF, 0x29, 0xF1, 0x91, 0xD5, 0x33, 0xF2, 0x46,\n    0xC3, 0xBD, 0x30, 0xF8, 0x7E, 0x5A, 0xA7, 0x6A, 0x19, 0x88, 0xC3, 0xE3, 0x5B, 0x37, 0xA9, 0x4C,\n    0x4F, 0xB3, 0xBD, 0xB8, 0x65, 0x57, 0xCB, 0xBE, 0x79, 0x82, 0x88, 0xDA, 0xB5, 0xAA, 0x9A, 0xD3,\n    0x05, 0xFA, 0x7A, 0x7B, 0xC0, 0xB9, 0x33, 0xD0, 0xCE, 0x34, 0xEF, 0x43, 0x41, 0x36, 0x23, 0xD4,\n    0x9C, 0x1F, 0x35, 0x70, 0xC4, 0x18, 0x87, 0x51, 0x7B, 0x9C, 0x8E, 0x24, 0x7C, 0x73, 0x9F, 0x6D,\n    0xD6, 0x4B, 0xFA, 0x22, 0x1F, 0x99, 0x2E, 0x1F, 0xEE, 0x13, 0xB4, 0xA3, 0xE8, 0xCE, 0xF6, 0xF3,\n    0x00, 0x9B, 0xE3, 0xDD, 0x0F, 0x8A, 0xCB, 0xC5, 0x49, 0xB1, 0xCA, 0x3F, 0x83, 0x96, 0xB4, 0xA3,\n    0x37, 0x72, 0x43, 0xAD, 0x2A, 0x79, 0xAF, 0x7F, 0x56, 0x18, 0xB3, 0x95, 0xA2, 0x3B, 0x15, 0x8A,\n    0x82, 0xFC, 0xED, 0xD1, 0xA1, 0x81, 0x44, 0x23, 0x88, 0x39, 0x89, 0xD8, 0x11, 0x8F, 0xAC, 0x62,\n    0xCB, 0xC9, 0x9F, 0x88, 0x3C, 0xDD, 0xE8, 0x4B, 0xB4, 0xF4, 0x99, 0xC7, 0x9E, 0xD9, 0xB7, 0xBC,\n    0x5B, 0x81, 0xD9, 0x0C, 0x1C, 0xA2, 0x8B, 0x36, 0x3C, 0xE2, 0xA9, 0xD4, 0x81, 0x2D, 0x5D, 0x72,\n    0x5A, 0xBF, 0xB2, 0x62, 0x8E, 0x48, 0x74, 0x56, 0xB8, 0xB9, 0x48, 0x04, 0x53, 0xCA, 0x0F, 0x20,\n    0x4E, 0x28, 0xD4, 0x0B, 0xC8, 0xE0, 0x3F, 0x09, 0xC5, 0x8F, 0x19, 0x99, 0xB3, 0x5F, 0xC4, 0xC7,\n    0x5A, 0x65, 0xD6, 0x1F, 0x27, 0xB0, 0xD2, 0x28, 0x03, 0x7B, 0xAB, 0x62, 0x6C, 0xAA, 0x78, 0xA0,\n    0x15, 0x00, 0xE8, 0x0E, 0xA8, 0x28, 0xAF, 0x1B, 0xCD, 0x1E, 0x5B, 0x09, 0x0E, 0x47, 0x10, 0xA8,\n    0x67, 0x32, 0x1D, 0x05, 0x7D, 0xBB, 0x57, 0x81, 0x2B, 0xDB, 0x4B, 0x6A, 0x4F, 0xBF, 0x9E, 0x51,\n    0x45, 0xC3, 0xCC, 0x70, 0xC6, 0x9E, 0x70, 0x30, 0x82, 0x65, 0xCE, 0x23, 0xCD, 0x6A, 0x4F, 0x3B,\n    0xA5, 0x58, 0x69, 0xFE, 0x37, 0x27, 0xE6, 0x03, 0x0C, 0x99, 0x8D, 0x31, 0xF5, 0xC0, 0xC8, 0xAC,\n    0x73, 0xCC, 0x48, 0x86, 0xC6, 0x4B, 0xC4, 0xE8, 0x13, 0x0A, 0xEE, 0xC0, 0x18, 0xC8, 0xE3, 0x01,\n    0x9B, 0x2B, 0xB5, 0x64, 0x06, 0xA9, 0xB6, 0xFD, 0xC4, 0xC1, 0x5D, 0x42, 0x49, 0xEC, 0x83, 0x53,\n    0x61, 0xAF, 0x7A, 0x8D, 0x8C, 0x1F, 0x7C, 0xBE, 0xE5, 0xA1, 0x2B, 0x8E, 0x20, 0x31, 0x4F, 0x37,\n    0x6A, 0x88, 0xF8, 0xBF, 0x0C, 0xD9, 0xBA, 0x1B, 0xCB, 0xC7, 0x23, 0x81, 0x85, 0x47, 0x93, 0xD0,\n    0xC0, 0x03, 0xBE, 0x2E, 0x3D, 0x89, 0xE3, 0x75, 0xAB, 0x5B, 0x32, 0x65, 0x83, 0x40, 0xBF, 0x16,\n    0xA9, 0x25, 0xE5, 0x4A, 0xFD, 0x86, 0xD2, 0x5F, 0xA0, 0xCF, 0x1F, 0xFF, 0x63, 0xFF, 0x75, 0x2B,\n    0xAF, 0x1A, 0x0B, 0x3A, 0x03, 0xE3, 0x2D, 0x04, 0x57, 0xDF, 0x56, 0x6D, 0x83, 0x61, 0x81, 0xC5,\n    0xDB, 0x51, 0xDA, 0x70, 0x0B, 0x5D, 0x5B, 0x21, 0xB6, 0xF4, 0x20, 0x0E, 0x44, 0xFD, 0x7D, 0xA0,\n    0xD8, 0x5A, 0xF4, 0x16, 0xF1, 0x69, 0x11, 0x6B, 0x13, 0x8F, 0xB3, 0xEC, 0x1E, 0x0C, 0x7D, 0x63,\n    0xBF, 0x96, 0xDD, 0xA2, 0x80, 0x8F, 0xE7, 0x47, 0x57, 0x4B, 0xCA, 0xE5, 0xF1, 0xB2, 0x66, 0xB5,\n    0xDC, 0x27, 0x75, 0x72, 0x49, 0x0C, 0x1E, 0x69, 0x6D, 0x3E, 0x31, 0xC4, 0x36, 0xCA, 0x3C, 0xE9,\n    0x5B, 0xC5, 0xDA, 0x4E, 0x28, 0xBA, 0x12, 0x39, 0x40, 0x9E, 0x92, 0x3E, 0x77, 0x60, 0xC7, 0xDF,\n    0x0F, 0xE7, 0xDC, 0x3B, 0x97, 0x39, 0xAF, 0x24, 0x49, 0xBA, 0xB0, 0xA2, 0x44, 0x04, 0x20, 0x3C,\n    0xE6, 0x40, 0x87, 0x30, 0xC2, 0x27, 0x23, 0x69, 0x4F, 0xDE, 0x13, 0x94, 0x09, 0x15, 0xDB, 0x39,\n    0xDC, 0x04, 0x07, 0xE3, 0x1B, 0x0E, 0xAA, 0x80, 0x0D, 0xA7, 0x58, 0x87, 0xDC, 0x0C, 0xC0, 0xDE,\n    0x43, 0x81, 0x70, 0x55, 0x11, 0xC8, 0x69, 0x42, 0xA2, 0x72, 0x35, 0xC4, 0xB9, 0x51, 0x2A, 0xD9,\n    0x19, 0xEE, 0x68, 0xE1, 0x86, 0x02, 0x58, 0x24, 0x8D, 0xE0, 0xF8, 0x0D, 0x19, 0x21, 0x24, 0xF7,\n    0x23, 0x3D, 0x07, 0xA0, 0x52, 0xE3, 0xE4, 0x98, 0xA3, 0xFD, 0x25, 0x0C, 0x48, 0x26, 0xC2, 0x97,\n    0xEB, 0x73, 0xFB, 0x00, 0x95, 0xF9, 0x12, 0x45, 0xD9, 0xA8, 0x41, 0xFE, 0xF0, 0xD7, 0x18, 0x7E,\n    0x6E, 0x9A, 0xFA, 0x78, 0x15, 0xA6, 0x54, 0xB0, 0x3A, 0x8A, 0xFA, 0x8F, 0xD1, 0xE5, 0x22, 0xB9,\n    0x19, 0x40, 0xC1, 0x19, 0xBA, 0x6B, 0xD5, 0x04, 0x67, 0x4E, 0x1C, 0xDA, 0x81, 0x16, 0x22, 0xE8,\n    0xB4, 0x7C, 0x99, 0xB7, 0xDD, 0x6E, 0x19, 0x16, 0xAE, 0x11, 0x58, 0xE4, 0x03, 0xA1, 0xA2, 0x6C,\n    0xDF, 0xF3, 0x1A, 0x88, 0x4B, 0xAF, 0x3F, 0xA2, 0xB0, 0x54, 0xE7, 0x68, 0xE1, 0x3B, 0xB7, 0x2F,\n    0xFC, 0xB3, 0xE6, 0x80, 0x6F, 0x2B, 0x82, 0x7E, 0x15, 0x6E, 0x61, 0xD3, 0x5F, 0x25, 0xBB, 0xE2,\n    0xF4, 0x41, 0xD1, 0xEB, 0x47, 0x8E, 0x50, 0x0F, 0x8E, 0x04, 0x80, 0xB5, 0xA7, 0x9E, 0xBB, 0x55,\n    0x03, 0x69, 0x11, 0x98, 0xAD, 0x64, 0x4E, 0x65, 0x9C, 0xB2, 0x17, 0x2E, 0x0A, 0xD6, 0x4C, 0xD9,\n    0x55, 0xF1, 0x12, 0x08, 0xB4, 0xB4, 0x4C, 0xDE, 0xE1, 0x27, 0x15, 0x66, 0x28, 0x27, 0x8E, 0xDE,\n    0xCE, 0xF0, 0x86, 0x28, 0x2B, 0x11, 0x0B, 0x45, 0x27, 0x31, 0xE3, 0x3D, 0x01, 0x71, 0xBD, 0x20,\n    0x4F, 0xE4, 0x03, 0xBB, 0xFA, 0x1B, 0x63, 0x63, 0x62, 0x4F, 0x0C, 0x9D, 0x47, 0x27, 0x97, 0x0B,\n    0x0A, 0x53, 0x4E, 0x08, 0xDA, 0x55, 0xDD, 0x27, 0xEB, 0x7D, 0x3B, 0x04, 0x2E, 0x29, 0x8E, 0x40,\n    0x2F, 0x6B, 0xCC, 0x05, 0xA8, 0x2A, 0x9E, 0x33, 0xF5, 0xB3, 0x82, 0x07, 0x8D, 0x2B, 0x16, 0xA1,\n    0x8B, 0x6F, 0xB9, 0x06, 0x67, 0x8A, 0x4B, 0x9B, 0x7F, 0x92, 0x21, 0x66, 0x5F, 0x83, 0x57, 0x81,\n    0xD1, 0x71, 0x02, 0x7C, 0x9E, 0xA1, 0xFB, 0x69, 0xF7, 0x7F, 0x57, 0xA7, 0x49, 0xB3, 0x86, 0xA2,\n    0x21, 0x9C, 0x71, 0xB8, 0x39, 0x45, 0x12, 0x42, 0x41, 0xA4, 0xF3, 0x89, 0x80, 0xF5, 0x13, 0x2F,\n    0x79, 0xDB, 0xA0, 0x0E, 0xED, 0x9A, 0x6A, 0xA0, 0x4C, 0x09, 0xC9, 0x92, 0xAC, 0x10, 0x2F, 0x10,\n    0xDF, 0xE8, 0xCB, 0x1D, 0x0F, 0x0D, 0xE1, 0x2E, 0x62, 0x99, 0xAC, 0xCB, 0x52, 0xD2, 0x1B, 0xAF,\n    0xB6, 0xB0, 0x78, 0xE0, 0x31, 0xDC, 0x6D, 0xBE, 0x7A, 0xF9, 0x02, 0xE1, 0x48, 0xE5, 0x14, 0xD8,\n    0x90, 0x9C, 0xE6, 0xE3, 0xF6, 0x6D, 0x7B, 0xF3, 0xDB, 0x60, 0x00, 0x39, 0x38, 0xAB, 0xE7, 0x17,\n    0xE9, 0x15, 0xC6, 0x3A, 0x7D, 0x40, 0xDF, 0xD9, 0x02, 0xDC, 0x83, 0x50, 0x76, 0xB0, 0x12, 0x16,\n    0x11, 0x57, 0x1D, 0xC1, 0x22, 0xBC, 0x88, 0x46, 0xCB, 0x13, 0x5D, 0x8F, 0x8F, 0xED, 0xCD, 0xAE,\n    0x15, 0xC0, 0x2D, 0xB0, 0x2C, 0xDA, 0xD7, 0x38, 0x35, 0x29, 0x2D, 0xF5, 0x0E, 0xF0, 0xD5, 0x96,\n    0x74, 0x80, 0x96, 0xAB, 0x83, 0xAA, 0xA8, 0xA1, 0x55, 0xB4, 0x90, 0x35, 0x0F, 0x4F, 0x19, 0xF8,\n    0x52, 0x8A, 0x81, 0x4A, 0xDB, 0x5F, 0x34, 0x25, 0xF9, 0xBB, 0x48, 0x8B, 0x66, 0x18, 0x64, 0x32,\n    0xC2, 0xAE, 0x44, 0x8E, 0x7F, 0xB1, 0x7F, 0x3F, 0x09, 0x83, 0xB4, 0x21, 0xEF, 0xF6, 0x70, 0xF8,\n    0xEB, 0xE6, 0x6A, 0xFB, 0x0B, 0x46, 0x23, 0x05, 0xE8, 0x6D, 0x2B, 0x82, 0x87, 0x89, 0xA6, 0x6D,\n    0x53, 0x86, 0xD6, 0xAC, 0x0C, 0xD3, 0x6C, 0x3A, 0x77, 0x4F, 0x7F, 0xDD, 0x61, 0x47, 0x5C, 0x17,\n    0x02, 0x79, 0x49, 0x15, 0xCC, 0xE7, 0x33, 0xF8, 0x01, 0x51, 0x64, 0x43, 0xD7, 0x00, 0x29, 0x15,\n    0x69, 0xD2, 0xDA, 0xF6, 0x66, 0xE1, 0x65, 0xCA, 0x40, 0xB5, 0x8A, 0xE1, 0x0B, 0x1D, 0x54, 0x17,\n    0xF6, 0x95, 0xD1, 0xFB, 0x21, 0xD9, 0x4B, 0x34, 0xD8, 0x0D, 0x44, 0xB7, 0xEF, 0x5A, 0x94, 0xFC,\n    0xED, 0x74, 0x01, 0xED, 0x7B, 0x70, 0x52, 0x8D, 0xC9, 0xF2, 0x33, 0x61, 0x74, 0x83, 0xC5, 0x4D,\n    0x72, 0x53, 0xFA, 0x68, 0xCA, 0xA3, 0x85, 0xEF, 0x8A, 0x7E, 0xEF, 0xEC, 0xF8, 0xAA, 0x22, 0x2D,\n    0x53, 0xB2, 0xA5, 0xCE, 0x74, 0x3D, 0xF1, 0x87, 0xCE, 0xE7, 0xA0, 0xAE, 0xA6, 0x68, 0xB1, 0xA4,\n    0xE1, 0x3F, 0x60, 0xBC, 0x9A, 0x05, 0xFF, 0x1F, 0xA4, 0x12, 0x7F, 0xC5, 0xE7, 0x86, 0x18, 0x8A,\n    0x64, 0x94, 0xDB, 0xFC, 0xB2, 0x4C, 0xFB, 0x3E, 0x2A, 0xB0, 0xC5, 0x88, 0xFC, 0x00, 0x6A, 0x5E,\n    0x33, 0x81, 0xD4, 0x40, 0x12, 0x44, 0xB0, 0x24, 0xA9, 0xE6, 0xFB, 0x95, 0xEF, 0x56, 0xF2, 0x4B,\n    0xF0, 0x46, 0x8B, 0xBF, 0xE6, 0x8F, 0x77, 0x90, 0x0E, 0x3B, 0xDA, 0xCD, 0xDC, 0x6F, 0x78, 0x25,\n    0x37, 0x23, 0x55, 0x3A, 0xBA, 0x35, 0x74, 0x41, 0x31, 0xE0, 0x34, 0xFF, 0x89, 0x14, 0x92, 0xCD,\n    0x65, 0x6E, 0x22, 0x00, 0x6C, 0xFE, 0x1E, 0x73, 0x5C, 0x59, 0xC6, 0x88, 0x32, 0xFA, 0xC4, 0x9D,\n    0x8F, 0xF0, 0x54, 0x6F, 0x64, 0xBC, 0x13, 0x44, 0x94, 0x04, 0x92, 0xDE, 0x30, 0xCA, 0x9E, 0xE8,\n    0x20, 0x3A, 0x03, 0x43, 0xFD, 0xE1, 0x6B, 0x17, 0x09, 0xCC, 0xEC, 0x62, 0x3B, 0x10, 0x8E, 0x79,\n    0x64, 0x15, 0x6C, 0x01, 0x09, 0x0F, 0x0D, 0x8E, 0x79, 0xBC, 0xD4, 0xE3, 0x01, 0x2C, 0xAF, 0x0C,\n    0xF9, 0x5F, 0x53, 0xB8, 0xB0, 0x7E, 0x6D, 0xB9, 0x8D, 0x29, 0xC9, 0x3F, 0x1E, 0x82, 0xB8, 0xF0,\n    0xEB, 0xDD, 0x6A, 0xB4, 0xB4, 0xAE, 0x74, 0xC6, 0x0B, 0x45, 0x12, 0xEC, 0x9D, 0xDD, 0x79, 0x94,\n    0xC1, 0x2D, 0x4D, 0x3C, 0x25, 0x75, 0xA6, 0x2E, 0x7A, 0x52, 0xE1, 0x31, 0xA4, 0xDD, 0x4E, 0x1B,\n    0xBC, 0x54, 0x83, 0x50, 0x27, 0xA1, 0xF9, 0xB0, 0xFF, 0xA1, 0x58, 0x71, 0xAD, 0x72, 0x05, 0xAB,\n    0x90, 0xEC, 0x99, 0x63, 0x69, 0x7F, 0x81, 0xF3, 0xED, 0x31, 0x76, 0x52, 0x6C, 0x5D, 0x56, 0xFA,\n    0x74, 0x29, 0xFA, 0x40, 0xD7, 0x78, 0x75, 0x29, 0x66, 0x28, 0x46, 0xB2, 0x01, 0xF6, 0xAE, 0x63,\n    0x37, 0xA5, 0xF9, 0x9F, 0x0F, 0x08, 0x65, 0x27, 0x7D, 0x68, 0xB7, 0x28, 0xD6, 0x5F, 0x04, 0x5F,\n    0xA8, 0x3F, 0x0D, 0x0B, 0x4E, 0x4B, 0x60, 0x7D, 0xCA, 0xA4, 0x2A, 0x20, 0x5C, 0xD3, 0x0B, 0x58,\n    0xFF, 0x65, 0x6F, 0xCF, 0x5A, 0x75, 0x1A, 0xB7, 0x75, 0x62, 0x0E, 0xBF, 0xFA, 0xD0, 0xBF, 0xB9,\n    0x14, 0xE9, 0x56, 0xE7, 0x2C, 0x3D, 0x2C, 0x7C, 0x5D, 0x7E, 0xA8, 0x4B, 0x7F, 0x6B, 0x94, 0x84,\n    0x17, 0x8C, 0x90, 0x24, 0x06, 0xFD, 0xE0, 0xCE, 0xD7, 0x03, 0xAB, 0x29, 0x9A, 0xCE, 0x09, 0xAB,\n    0xF0, 0x83, 0x20, 0x19, 0xC4, 0x08, 0xB5, 0x74, 0x45, 0x5C, 0xDB, 0x99, 0xF5, 0x3D, 0x2A, 0x9F,\n    0x6A, 0xB6, 0x70, 0xBD, 0x6D, 0x9C, 0x8A, 0xF2, 0x18, 0x64, 0x13, 0x5D, 0x92, 0x09, 0x78, 0xD6,\n    0x04, 0x2A, 0xFB, 0x75, 0xF7, 0x0D, 0xDE, 0x95, 0x81, 0x52, 0xB3, 0x69, 0xF0, 0x0F, 0x84, 0xA2,\n    0xED, 0x02, 0xB5, 0x79, 0x98, 0x51, 0x66, 0x0B, 0xBD, 0x72, 0x6F, 0xAA, 0xFE, 0xAA, 0x1B, 0x03,\n    0x4B, 0x3D, 0x24, 0x52, 0xCA, 0x81, 0x78, 0xFE, 0x91, 0xAF, 0x33, 0x90, 0x1D, 0x42, 0x9B, 0x1F,\n    0xE0, 0x26, 0x39, 0x09, 0x2B, 0xBF, 0x41, 0xDD, 0xB4, 0x99, 0xF6, 0x39, 0x29, 0x5A, 0xF6, 0x20,\n    0x46, 0xB2, 0x4C, 0x89, 0xF6, 0x87, 0xF0, 0x91, 0x2E, 0x3C, 0xE0, 0x91, 0x1E, 0x4F, 0x4E, 0x3E,\n    0x49, 0xAB, 0x79, 0x55, 0xA5, 0x7D, 0xE7, 0xAA, 0x35, 0x31, 0x1B, 0xB1, 0x6F, 0x76, 0x30, 0xBC,\n    0xC6, 0x3E, 0x6C, 0x9B, 0xAB, 0x99, 0x82, 0xB5, 0xA2, 0x37, 0xBD, 0xAC, 0x37, 0x39, 0xAB, 0xA9,\n    0xCC, 0xD9, 0x65, 0xC6, 0x3D, 0x5E, 0x8B, 0x08, 0x0B, 0x0E, 0xAE, 0xA8, 0x44, 0xFC, 0x30, 0x26,\n    0x92, 0x3A, 0xAB, 0x9E, 0xB5, 0x16, 0x85, 0xD8, 0xDA, 0x4E, 0x54, 0x36, 0x69, 0x8E, 0x4D, 0xB6,\n    0x61, 0x83, 0xAF, 0x46, 0x5F, 0x17, 0x71, 0xF2, 0x7C, 0xD2, 0x53, 0xD0, 0xD7, 0xC3, 0x52, 0x6A,\n    0x8A, 0x18, 0x40, 0xB6, 0x00, 0xD7, 0x0F, 0x41, 0x0B, 0xC1, 0xC5, 0xC0, 0xA6, 0x98, 0x59, 0x7C,\n    0x45, 0x19, 0x11, 0xDA, 0x2C, 0xE3, 0xCE, 0x56, 0x9E, 0xBF, 0x85, 0xCE, 0xFA, 0xE5, 0x68, 0x66,\n    0x06, 0xE6, 0x57, 0x58, 0x76, 0xAD, 0xB6, 0xC7, 0xFE, 0x2E, 0x2F, 0xA1, 0x62, 0x7D, 0x8C, 0xB9,\n    0xC6, 0xBC, 0xF9, 0x0A, 0x84, 0x1A, 0xB7, 0xF6, 0x5C, 0x75, 0x00, 0x1F, 0xA0, 0x6B, 0xF9, 0x54,\n    0x51, 0xB6, 0xBD, 0xA4, 0xC3, 0xDF, 0x25, 0x07, 0x93, 0x33, 0x6B, 0x8C, 0x7E, 0x7C, 0xC8, 0x16,\n    0x78, 0x1A, 0xDA, 0xCA, 0x48, 0x4A, 0x7C, 0x61, 0xAD, 0xEE, 0x08, 0x51, 0xCB, 0xE4, 0x99, 0xB2,\n    0x2A, 0x02, 0x6F, 0x0D, 0x86, 0x1C, 0xC1, 0xD5, 0x0C, 0x55, 0x91, 0xDE, 0x77, 0xF2, 0xE2, 0x96,\n    0xEF, 0xD7, 0x39, 0x08, 0x42, 0x22, 0x6D, 0x2B, 0xA0, 0xE4, 0xA1, 0x38, 0x86, 0x4F, 0xE4, 0x1A,\n    0xF2, 0x30, 0xCB, 0xD9, 0x38, 0x1E, 0xF0, 0x27, 0xAA, 0x1A, 0xA3, 0xD6, 0x2B, 0xC8, 0xE8, 0x5E,\n    0x31, 0xBF, 0xEB, 0x3A, 0x68, 0xF2, 0x98, 0x94, 0xA0, 0x8A, 0x6E, 0x07, 0x2A, 0x81, 0xE7, 0x01,\n    0xD3, 0x7C, 0xD8, 0x58, 0x19, 0x96, 0x53, 0xA8, 0x3C, 0x71, 0x0E, 0x4C, 0xFB, 0x24, 0x7D, 0x63,\n    0x47, 0x61, 0x90, 0x94, 0x71, 0x18, 0x38, 0x35, 0x80, 0x03, 0x41, 0xD4, 0x3E, 0xA9, 0x27, 0xAE,\n    0xB7, 0x0B, 0x9A, 0xD1, 0xDB, 0xC5, 0x1F, 0x38, 0x88, 0x73, 0xD2, 0x3C, 0xB0, 0x72, 0x60, 0x5C,\n    0xFD, 0xF9, 0xD3, 0x3F, 0x90, 0x89, 0x2B, 0xE2, 0x6C, 0x08, 0x4E, 0xB6, 0x4E, 0xF1, 0x4F, 0x5D,\n    0x82, 0x3C, 0xC6, 0x08, 0x96, 0xA3, 0xEB, 0xFF, 0xEC, 0xF4, 0xC5, 0xB1, 0xC7, 0x1B, 0xF3, 0x5E,\n    0x67, 0x6F, 0x11, 0xA3, 0xAC, 0x18, 0xF8, 0xF3, 0x0F, 0x6A, 0x64, 0x02, 0x4F, 0xE2, 0xE4, 0x3A,\n    0x2A, 0x20, 0x28, 0x5B, 0x5E, 0xAC, 0x83, 0x8C, 0xA3, 0xF1, 0x67, 0x0D, 0xBA, 0x8E, 0xEC, 0x25,\n    0xDE, 0x7D, 0xEF, 0xCF, 0x2C, 0x06, 0x74, 0x9F, 0x9A, 0x38, 0x70, 0x8D, 0xD0, 0x3E, 0xEA, 0x90,\n    0x5E, 0xD1, 0xAE, 0xDB, 0x03, 0xC7, 0x8A, 0xEF, 0x55, 0x54, 0x34, 0xB2, 0x15, 0x6F, 0x17, 0x60,\n    0x31, 0xE4, 0x32, 0x27, 0xF3, 0x82, 0xAE, 0xFB, 0x9E, 0x6E, 0x25, 0x4A, 0x96, 0xFE, 0x23, 0x4E,\n    0xFB, 0x46, 0xFC, 0xB8, 0x02, 0xAB, 0xD4, 0xD3, 0x1F, 0x0B, 0x23, 0x72, 0x10, 0xAD, 0x6F, 0x13,\n    0x56, 0xB4, 0x95, 0x20, 0xD3, 0x5A, 0x48, 0xE0, 0xC4, 0xBB, 0x96, 0x4C, 0x52, 0xEA, 0x25, 0x9F,\n    0xAE, 0xFE, 0x49, 0x3A, 0xA2, 0x54, 0x98, 0x53, 0x06, 0xD3, 0x1A, 0xC2, 0x6C, 0x5A, 0x6D, 0xD7,\n    0x28, 0xDE, 0x54, 0xDC, 0xCC, 0x2D, 0x42, 0x48, 0x3D, 0x33, 0xA7, 0x9E, 0xEE, 0x9E, 0xAE, 0xAC,\n    0x4D, 0x8B, 0x0D, 0x98, 0x03, 0xF0, 0x4D, 0xF9, 0x40, 0x62, 0x12, 0x38, 0x34, 0xA4, 0x81, 0xA3,\n    0x51, 0xA2, 0xDB, 0x76, 0xDD, 0x33, 0xEA, 0x6B, 0xB1, 0x54, 0x6F, 0xCF, 0x42, 0x6C, 0xAB, 0x9D,\n    0x15, 0x93, 0x3A, 0x0C, 0xEA, 0xD0, 0x0B, 0xBB, 0x77, 0xB1, 0xA0, 0x23, 0xDA, 0x15, 0x10, 0xA9,\n    0x3E, 0xE6, 0x2F, 0x52, 0x41, 0x57, 0xA8, 0x86, 0xEB, 0x43, 0x96, 0x63, 0x8D, 0x98, 0xE2, 0xE3,\n    0x8F, 0x2B, 0xA3, 0xB4, 0xAD, 0x2D, 0xDE, 0x72, 0xF0, 0x08, 0xBB, 0x19, 0x42, 0xFB, 0xA4, 0x56,\n    0x13, 0xEF, 0xF5, 0xE0, 0x6D, 0x2F, 0x9D, 0x87, 0x81, 0x2C, 0xCB, 0xC9, 0x72, 0x21, 0x27, 0xB5,\n    0x23, 0xB2, 0x9F, 0xC4, 0x0F, 0x4E, 0xBA, 0x9C, 0xF4, 0x86, 0xBE, 0xC7, 0x9C, 0xF9, 0x53, 0xA7,\n    0xE1, 0x99, 0xB0, 0xF0, 0xF9, 0x35, 0x47, 0x00, 0xB9, 0xC4, 0xED, 0x11, 0x21, 0x5A, 0x48, 0xAE,\n    0x71, 0xC7, 0xD3, 0xFC, 0x78, 0xBB, 0x69, 0xEA, 0x9A, 0xEA, 0x60, 0x2A, 0x8D, 0xE8, 0x16, 0x33,\n    0x80, 0x2F, 0x38, 0xEF, 0x9E, 0x09, 0x18, 0x2D, 0xCF, 0x0F, 0xD5, 0x23, 0x8A, 0xF2, 0xE0, 0x2E,\n    0x68, 0x97, 0x4F, 0x24, 0xCE, 0xD9, 0xD8, 0xC4, 0xAE, 0xCC, 0x97, 0x56, 0x01, 0x0A, 0x2B, 0x3A,\n    0x42, 0x6D, 0xB4, 0x04, 0xA2, 0x4A, 0x78, 0x77, 0x9F, 0xC2, 0x1E, 0x25, 0x2C, 0x2F, 0x69, 0xC1,\n    0x3D, 0x4C, 0xB2, 0x8C, 0x9A, 0x02, 0xB8, 0x20, 0x4E, 0xBD, 0x7B, 0x65, 0xFC, 0x7A, 0xDE, 0x24,\n    0x30, 0x2A, 0xF2, 0x79, 0xD1, 0x5E, 0x45, 0x7D, 0x6D, 0x6B, 0x93, 0xDC, 0xF3, 0x2A, 0xF4, 0x40,\n    0x6B, 0xE0, 0x08, 0x09, 0xD0, 0x2E, 0x9A, 0xCA, 0x64, 0x42, 0x63, 0xF7, 0x7B, 0x8D, 0x16, 0x49,\n    0x8F, 0x02, 0xEB, 0x22, 0xCB, 0x8B, 0xB3, 0xE1, 0x3F, 0x10, 0x89, 0xAE, 0x02, 0x72, 0xA0, 0x1A,\n    0x5E, 0xE4, 0xDD, 0x82, 0x72, 0x50, 0x6A, 0x05, 0xAB, 0x2A, 0xFE, 0xCA, 0x27, 0x4F, 0xF7, 0xC6,\n    0xBE, 0xDE, 0xC4, 0x7D, 0x0F, 0xF4, 0x5C, 0x38, 0x50, 0xDC, 0x37, 0xF3, 0x13, 0xCA, 0x54, 0x56,\n    0x30, 0x2F, 0xFF, 0xB1, 0xBC, 0xD1, 0xED, 0x19, 0xA4, 0xFC, 0x84, 0xB0, 0x9E, 0xC3, 0x5A, 0xA7,\n    0x63, 0x43, 0x7C, 0x8A, 0x06, 0x4D, 0x04, 0x72, 0x16, 0x6B, 0x22, 0xA6, 0x74, 0x0E, 0x12, 0x47,\n    0x5E, 0xA1, 0x74, 0x72, 0xEE, 0x65, 0x95, 0x8E, 0x30, 0x6B, 0xBF, 0x92, 0xE6, 0x3E, 0xA0, 0xB8,\n    0x86, 0x55, 0x54, 0xC8, 0x0A, 0x20, 0xA9, 0xE9, 0xAE, 0x5B, 0x47, 0x2E, 0xCE, 0x0A, 0xD5, 0x4B,\n    0xAF, 0x22, 0xA0, 0x23, 0x3E, 0x4E, 0x77, 0xA7, 0x64, 0x01, 0x15, 0x47, 0x28, 0x6A, 0xD1, 0x90,\n    0xCD, 0x32, 0x74, 0x7A, 0x02, 0x80, 0xEA, 0x91, 0x2E, 0x6B, 0x22, 0x52, 0x68, 0xC2, 0x40, 0x19,\n    0xCE, 0xB7, 0x9A, 0xA2, 0xB3, 0x8A, 0xF5, 0xD8, 0xD8, 0x7B, 0x3E, 0x23, 0xA9, 0x33, 0x56, 0x06,\n    0x1C, 0x74, 0x73, 0x93, 0x3E, 0x97, 0x5C, 0x41, 0x4D, 0x3F, 0xFF, 0x97, 0xD8, 0x94, 0x29, 0xAF,\n    0x06, 0xD9, 0xC3, 0xF1, 0xD6, 0x8D, 0xA7, 0xEE, 0xAA, 0x26, 0xF7, 0x4F, 0x43, 0x5E, 0x60, 0x8D,\n    0x0B, 0xD5, 0xAA, 0xD9, 0x89, 0x79, 0x04, 0x7B, 0xC3, 0x90, 0x1A, 0xDF, 0xA7, 0xB1, 0xBA, 0xC5,\n    0xCA, 0xAB, 0x0C, 0xB8, 0xE8, 0xF0, 0x45, 0xDC, 0x85, 0xB5, 0x3B, 0xAC, 0xA7, 0xB2, 0x5C, 0x25,\n    0x52, 0x90, 0x0D, 0x4C, 0xEF, 0xFF, 0x06, 0x0F, 0xEE, 0x0F, 0x8A, 0xE9, 0x93, 0x60, 0x3D, 0x8D,\n    0x47, 0xC7, 0x55, 0xD9, 0x23, 0xAF, 0x77, 0xDB, 0x01, 0x69, 0xBA, 0x3D, 0x9B, 0x62, 0x74, 0x44,\n    0x8E, 0x65, 0x40, 0x66, 0x3E, 0xDF, 0x54, 0x45, 0x8F, 0xF5, 0xA8, 0x8F, 0xD6, 0x51, 0x42, 0xDE,\n    0x9D, 0x02, 0xDB, 0x90, 0xD3, 0x93, 0x8C, 0xE0, 0x0E, 0xFA, 0x11, 0xCF, 0xA9, 0xBD, 0x94, 0xDA,\n    0x0F, 0x94, 0x33, 0xF7, 0xA8, 0x80, 0x62, 0x61, 0xAC, 0xE6, 0x1E, 0xC6, 0x80, 0x55, 0x9D, 0x7C,\n    0x5B, 0xB8, 0xB3, 0x67, 0xBB, 0x69, 0xA6, 0x6D, 0xE1, 0x42, 0xD6, 0x81, 0x4E, 0x13, 0x68, 0xC0,\n    0x6B, 0x01, 0xE8, 0x0F, 0xFB, 0xD4, 0x07, 0x08, 0xC7, 0x33, 0xAB, 0x3A, 0x68, 0x23, 0x14, 0x86,\n    0xC7, 0x76, 0x13, 0xD5, 0x38, 0xF6, 0x4C, 0x91, 0x3E, 0x4F, 0x10, 0xC3, 0x7A, 0xD0, 0x9B, 0xF6,\n    0x58, 0x42, 0xD5, 0x12, 0x5A, 0xCE, 0x58, 0x1A, 0xB0, 0xBF, 0x27, 0x96, 0xFA, 0xE5, 0x8C, 0x43,\n    0xF7, 0xDE, 0xBD, 0x5F, 0xE3, 0x79, 0x69, 0xDC, 0x57, 0xA5, 0x12, 0x27, 0x77, 0x61, 0x5E, 0x97,\n    0xD4, 0x6F, 0xF6, 0x6E, 0x5B, 0x46, 0x98, 0x8F, 0x06, 0xC9, 0x58, 0xAB, 0x2D, 0x02, 0x8C, 0x93,\n    0x61, 0x7F, 0xDF, 0x14, 0xB1, 0xEC, 0xFD, 0x97, 0xFE, 0x80, 0xD5, 0xCA, 0x08, 0x57, 0x23, 0x9F,\n    0x49, 0x3A, 0xE3, 0x56, 0xD8, 0x5A, 0x3C, 0x52, 0x5A, 0x4B, 0xC0, 0x8C, 0xB3, 0x79, 0xD7, 0xC4,\n    0xFD, 0x48, 0xF3, 0xEA, 0x4C, 0x40, 0xF9, 0x36, 0x15, 0x47, 0x3B, 0x14, 0x48, 0x51, 0xF0, 0xC6,\n    0xBB, 0x30, 0xBB, 0x80, 0xA3, 0x5C, 0x6F, 0xBD, 0xA1, 0x4E, 0xEC, 0x71, 0x52, 0x44, 0x98, 0xB2,\n    0x82, 0x49, 0x2D, 0xEB, 0x61, 0x22, 0xEE, 0xFC, 0x60, 0xCB, 0x01, 0x53, 0xAA, 0xFD, 0x9A, 0xC8,\n    0x1B, 0xE9, 0xE4, 0x8C, 0x2C, 0x3C, 0xC8, 0x0A, 0x82, 0xCA, 0x3C, 0x92, 0xB5, 0x96, 0xDA, 0xF1,\n    0x41, 0x76, 0x8D, 0x19, 0xED, 0x3B, 0xEE, 0x44, 0xB0, 0xD2, 0xB3, 0xE9, 0xD5, 0x8E, 0xD5, 0x70,\n    0x67, 0x72, 0xD0, 0x33, 0x2B, 0xFC, 0x50, 0x83, 0x1A, 0x72, 0xAE, 0xFE, 0xF0, 0x87, 0x07, 0xD7,\n    0x19, 0x97, 0xDB, 0x95, 0xEF, 0xDD, 0xBB, 0xEC, 0x3F, 0xC8, 0x08, 0xBB, 0x87, 0x5C, 0xB2, 0x51,\n    0x3F, 0xEE, 0x27, 0xF4, 0xA8, 0x2C, 0x6C, 0x3B, 0x0C, 0xB9, 0x7C, 0xFB, 0x75, 0xA3, 0xAE, 0x1C,\n    0xFD, 0x1F, 0x99, 0xF2, 0x5F, 0x30, 0x16, 0x0B, 0x24, 0xB7, 0x02, 0xE5, 0xDD, 0x59, 0x8E, 0x98,\n    0x92, 0x1E, 0xDB, 0x6C, 0x6E, 0xCF, 0x51, 0x81, 0xE0, 0xF5, 0x32, 0xAD, 0x5F, 0xCC, 0xA1, 0x91,\n    0x5F, 0x2E, 0xAC, 0xA0, 0xB1, 0x9B, 0x2F, 0xAF, 0x7E, 0x8E, 0x30, 0x76, 0x82, 0xE3, 0x74, 0x01,\n    0x2C, 0x2C, 0xB3, 0xB3, 0xAD, 0xC3, 0x3B, 0x2C, 0x45, 0xB3, 0x40, 0x97, 0x4B, 0xEB, 0xFD, 0xC6,\n    0x55, 0xD9, 0x66, 0x0A, 0x4F, 0x3F, 0xB4, 0xE6, 0x01, 0x68, 0x9F, 0x20, 0xEC, 0x97, 0xBE, 0x6C,\n    0x09, 0xFF, 0x26, 0x09, 0x3D, 0x66, 0x0F, 0x19, 0x2C, 0xAF, 0xBD, 0xA2, 0xF4, 0xEA, 0xD1, 0xF6,\n    0x37, 0x64, 0x8A, 0x9E, 0x9A, 0x79, 0xFC, 0x20, 0xEC, 0x5B, 0x58, 0x74, 0x8A, 0xD7, 0x78, 0x8E,\n    0x1F, 0xBF, 0xEC, 0x78, 0xC0, 0x65, 0xE8, 0xD8, 0x4A, 0x72, 0xEB, 0x13, 0x4C, 0xD8, 0xE9, 0x7B,\n    0xEC, 0x48, 0x00, 0x33, 0x69, 0x92, 0xDC, 0xE9, 0xBE, 0xE5, 0xC7, 0xCE, 0x56, 0x2E, 0x9B, 0xD3,\n    0x4D, 0xFD, 0xE7, 0x68, 0xE1, 0xCE, 0x18, 0x8D, 0xD0, 0x92, 0x39, 0xE1, 0x69, 0x83, 0x55, 0x54,\n    0x62, 0xE8, 0x26, 0x8B, 0xAB, 0xA0, 0xAC, 0xB2, 0xFD, 0xB2, 0xBB, 0xB0, 0xD4, 0x1B, 0xC8, 0x2F,\n    0xA8, 0x9E, 0x9B, 0x24, 0x56, 0xB8, 0x6E, 0xEE, 0x2F, 0x36, 0x2E, 0xD4, 0x2B, 0x9A, 0x2C, 0x00,\n    0xE1, 0x18, 0x67, 0xD6, 0x13, 0x35, 0xF2, 0x8F, 0x77, 0x88, 0x36, 0x40, 0x1F, 0x7B, 0x18, 0x6C,\n    0x2B, 0xE6, 0x0E, 0x26, 0x30, 0x98, 0x71, 0x20, 0xE1, 0xA5, 0xF4, 0x94, 0x36, 0xEF, 0x73, 0x52,\n    0x59, 0xF2, 0x87, 0x67, 0xFD, 0xBA, 0x55, 0x40, 0xBE, 0x3B, 0x3B, 0x25, 0x89, 0x40, 0x73, 0xBA,\n    0x60, 0xAF, 0x50, 0xBE, 0xEA, 0xC3, 0x31, 0x34, 0x32, 0x71, 0xE4, 0xEC, 0x0E, 0x24, 0x9D, 0x46,\n    0x56, 0x33, 0xC7, 0x01, 0x94, 0xA5, 0x51, 0xD1, 0xC6, 0xDB, 0xCA, 0x26, 0x8D, 0x89, 0xAF, 0xA9,\n    0x89, 0x7F, 0x26, 0xFB, 0x67, 0x92, 0x73, 0x39, 0x1A, 0x1A, 0x1C, 0x4E, 0xEB, 0x72, 0x68, 0x92,\n    0x9F, 0x71, 0x35, 0x13, 0x38, 0x36, 0xF8, 0x0D, 0xBF, 0x95, 0x9F, 0x35, 0x00, 0x79, 0x47, 0x41,\n    0x62, 0x23, 0xBA, 0xF4, 0xCA, 0xC6, 0x12, 0x7C, 0x96, 0x9D, 0xB8, 0x40, 0x4F, 0x7E, 0x31, 0x01,\n    0x1E, 0xC7, 0xFD, 0x49, 0xB9, 0xC2, 0x2B, 0x35, 0x24, 0x2A, 0x13, 0x89, 0x62, 0x63, 0xBA, 0x6C,\n    0xA8, 0x93, 0x6D, 0x99, 0xED, 0x9C, 0xE9, 0xB0, 0xF1, 0x8C, 0x9D, 0xA9, 0xEF, 0xDE, 0xF0, 0x92,\n    0x1A, 0x3B, 0xA9, 0x94, 0x38, 0x87, 0xA2, 0x53, 0x65, 0x31, 0xAE, 0x0C, 0x96, 0x64, 0xAC, 0xC8,\n    0xF8, 0x03, 0x65, 0x59, 0x5A, 0xAF, 0xD7, 0x8B, 0x0B, 0x31, 0xD9, 0x3A, 0x2F, 0x1C, 0xE3, 0x49,\n    0xF3, 0xFA, 0x80, 0x9D, 0x34, 0x0D, 0xC0, 0xCE, 0xBB, 0x6E, 0x90, 0x6E, 0xA5, 0xA7, 0x0D, 0xB4,\n    0xB8, 0x04, 0x6A, 0xD6, 0x0C, 0x95, 0x79, 0x9E, 0x27, 0x43, 0xDD, 0xD1, 0x8E, 0x8F, 0xE0, 0x19,\n    0xB5, 0xBF, 0xD9, 0x25, 0xEE, 0xBB, 0x3E, 0x79, 0x0D, 0x9E, 0x0B, 0x03, 0x3D, 0x09, 0x9C, 0xF1,\n    0x02, 0x0A, 0x81, 0x7B, 0xCE, 0x95, 0x44, 0x99, 0x72, 0xC5, 0x18, 0x4B, 0xD4, 0x9E, 0x5E, 0x8B,\n    0x2D, 0x5F, 0x1E, 0x13, 0xF1, 0x95, 0xCA, 0x37, 0x75, 0x49, 0x7D, 0x3A, 0x1A, 0x22, 0x02, 0xAC,\n    0x3E, 0xFE, 0x62, 0xF9, 0x59, 0xB7, 0x11, 0x82, 0xB6, 0x55, 0x82, 0xC7, 0x13, 0xB7, 0x83, 0x8C,\n    0x1E, 0x90, 0xB4, 0x3D, 0x9B, 0x57, 0xE7, 0x1F, 0x4E, 0xB1, 0x70, 0xF4, 0x9E, 0x06, 0x3B, 0x97,\n    0xF4, 0xC1, 0xBA, 0x3D, 0xAD, 0x50, 0x01, 0x21, 0xBB, 0x0F, 0xE1, 0x60, 0x49, 0x25, 0x5A, 0x0F,\n    0xA3, 0x24, 0x33, 0x97, 0xA4, 0xA2, 0x8D, 0xFE, 0x9E, 0x17, 0x7D, 0x42, 0x3D, 0x40, 0xBB, 0xE5,\n    0xFB, 0xB2, 0xCA, 0x2C, 0x93, 0x38, 0x13, 0xEA, 0x5C, 0xEB, 0x53, 0xFD, 0xFE, 0xD1, 0x2C, 0xB8,\n    0xF6, 0xE2, 0x0C, 0xDF, 0xFA, 0x93, 0x2C, 0x25, 0x5C, 0x63, 0x07, 0x27, 0x11, 0x4E, 0x5E, 0xFA,\n    0xD0, 0x9D, 0x2E, 0xE3, 0x85, 0xA8, 0xC5, 0x8B, 0x7B, 0xFE, 0xA0, 0x9C, 0xFE, 0xFE, 0xE5, 0x69,\n    0xD8, 0x59, 0xAA, 0x52, 0x40, 0x71, 0x6B, 0x1D, 0x51, 0xDA, 0x13, 0x48, 0xEC, 0xCE, 0x1E, 0x2A,\n    0xE5, 0x70, 0x66, 0xB1, 0x1F, 0xA6, 0x65, 0x3E, 0x99, 0x8E, 0x4B, 0x4D, 0x7C, 0x75, 0xB1, 0x46,\n    0x51, 0x07, 0x6E, 0x31, 0x7E, 0xE7, 0x5D, 0xE7, 0x66, 0xA6, 0x6F, 0x65, 0x4E, 0xBD, 0xEF, 0x1E,\n    0xEC, 0x90, 0x36, 0xFA, 0xDB, 0x73, 0x5F, 0x54, 0x68, 0x9A, 0xFD, 0xD9, 0x3D, 0xF0, 0xDC, 0xD5,\n    0xA3, 0xBF, 0x45, 0xBD, 0x24, 0x7D, 0xB5, 0xC4, 0xC5, 0x63, 0x5F, 0xBC, 0x4C, 0x19, 0x1A, 0xA3,\n    0x84, 0x71, 0xBD, 0x63, 0x8B, 0x85, 0x71, 0x30, 0x2C, 0x00, 0x76, 0x90, 0xDB, 0x44, 0xFC, 0x86,\n    0x40, 0x10, 0x4C, 0x4F, 0x9E, 0xFB, 0xC9, 0xF3, 0x61, 0xED, 0x6A, 0x37, 0x7F, 0x76, 0x1E, 0x8D,\n    0xB2, 0x30, 0x2B, 0xC1, 0x9F, 0x00, 0xF0, 0x54, 0x60, 0x13, 0x74, 0x87, 0x83, 0x90, 0xCD, 0xF3,\n    0x78, 0xD7, 0x84, 0xA2, 0xCA, 0x47, 0x7F, 0x10, 0xD8, 0xC5, 0xEA, 0xA4, 0xA7, 0x53, 0x47, 0xEF,\n    0x43, 0x44, 0xA4, 0xEB, 0xD4, 0x73, 0xB9, 0x08, 0xB1, 0x06, 0xD5, 0xD1, 0xF5, 0x9D, 0x92, 0x2C,\n    0xA2, 0x6C, 0x69, 0x68, 0xF6, 0xD2, 0xEF, 0x35, 0x1F, 0x91, 0xC8, 0x8F, 0x78, 0xF5, 0x2D, 0xB4,\n    0x83, 0x2C, 0x97, 0x3F, 0xF3, 0x51, 0x42, 0xE7, 0x8C, 0xE0, 0xDC, 0x01, 0x34, 0x66, 0x05, 0x9A,\n    0x61, 0x6E, 0x90, 0x5F, 0x0C, 0xCD, 0xC9, 0x74, 0x8F, 0x5B, 0xA0, 0x40, 0xB6, 0xAF, 0x48, 0xAA,\n    0xD9, 0xFA, 0x06, 0x6D, 0xCE, 0x4E, 0x0E, 0x62, 0x8E, 0xF3, 0x23, 0xEB, 0xF5, 0xE5, 0x22, 0x50,\n    0x74, 0x06, 0x05, 0xA3, 0x00, 0xD7, 0x5C, 0x5E, 0x68, 0x1B, 0x0F, 0xB1, 0x38, 0xB0, 0x46, 0xE1,\n    0x7B, 0xB7, 0xA1, 0x0F, 0x7B, 0x9A, 0xC2, 0xA3, 0x78, 0x03, 0xD5, 0xA7, 0x93, 0xB1, 0x76, 0xE8,\n    0xB5, 0x32, 0x8E, 0x5A, 0x2E, 0xA3, 0xCC, 0xC7, 0x6B, 0xAD, 0x88, 0xB1, 0x7C, 0x68, 0xC8, 0x1A,\n    0x09, 0xAC, 0x19, 0xA1, 0x7F, 0x00, 0xB1, 0xC2, 0xAB, 0x1F, 0x81, 0x29, 0x7A, 0x5C, 0xF1, 0x55,\n    0xF9, 0x96, 0x52, 0x5E, 0x8C, 0x57, 0x65, 0xDA, 0x5B, 0xC6, 0x0E, 0xB1, 0xC6, 0x0F, 0x50, 0x9C,\n    0x61, 0x20, 0x7A, 0x62, 0x68, 0x53, 0x4E, 0xF9, 0x40, 0xA4, 0xD4, 0x66, 0xF8, 0xC7, 0x0B, 0xE6,\n    0x09, 0xA6, 0xBD, 0xBF, 0xA3, 0x57, 0x5E, 0xD6, 0xA1, 0x84, 0x49, 0x05, 0x54, 0x69, 0xC7, 0xA4,\n    0x67, 0x08, 0x37, 0x3A, 0xD3, 0xD3, 0x43, 0x8E, 0xD3, 0xD1, 0xBF, 0xBD, 0x6A, 0x8D, 0x3A, 0x14,\n    0x76, 0x6F, 0x04, 0xDE, 0x69, 0x0D, 0xD5, 0x07, 0xF4, 0xEA, 0x36, 0x28, 0x9E, 0x54, 0x47, 0x25,\n    0x7D, 0x02, 0x54, 0x53, 0xFC, 0x68, 0x72, 0x77, 0xE4, 0x9E, 0x6B, 0xF7, 0xAC, 0xD2, 0xBF, 0xA7,\n    0xC5, 0x3C, 0xF6, 0x99, 0xEB, 0xC7, 0xA3, 0x11, 0x33, 0xB6, 0xB6, 0x62, 0x4A, 0x3B, 0x93, 0xC2,\n    0xF6, 0xC7, 0xF1, 0x7B, 0x3F, 0x6D, 0x2D, 0x12, 0x4B, 0x46, 0xC3, 0xC2, 0xC7, 0x5F, 0xDE, 0xC0,\n    0xFD, 0x5E, 0xCD, 0x3B, 0xD1, 0x4C, 0x41, 0x77, 0x0A, 0x77, 0x3A, 0xA8, 0xB1, 0xEF, 0x02, 0x49,\n    0x54, 0xA2, 0x3B, 0xA7, 0x79, 0xEF, 0x2B, 0x56, 0x32, 0x7E, 0x81, 0x71, 0xA6, 0x99, 0x53, 0x8D,\n    0xBF, 0x07, 0x9A, 0x4B, 0x70, 0x7F, 0x1D, 0x84, 0x99, 0xCE, 0x0C, 0x4F, 0x7A, 0x99, 0xBA, 0x94,\n    0x52, 0xFE, 0x06, 0xDE, 0x2A, 0xF1, 0xDF, 0x75, 0x45, 0x38, 0x25, 0xD9, 0xC4, 0x6A, 0xF1, 0x5B,\n    0x2B, 0xA3, 0x50, 0x00, 0x68, 0xE7, 0x9C, 0xBC, 0x90, 0xDB, 0x38, 0xF7, 0xEC, 0xBD, 0xDB, 0x1B,\n    0x77, 0xFF, 0xF8, 0xB8, 0xDB, 0xE8, 0xE5, 0x7F, 0x71, 0xF1, 0x9B, 0x83, 0x98, 0xF3, 0xE2, 0x4E,\n    0xA6, 0xBD, 0xE7, 0xD7, 0xD2, 0xBF, 0xB1, 0x89, 0x54, 0x3D, 0x36, 0xF0, 0x4E, 0x85, 0x5F, 0x14,\n    0xE3, 0x58, 0x5B, 0x24, 0x86, 0x75, 0x8D, 0x98, 0x0C, 0xBA, 0x5D, 0x26, 0x62, 0xC4, 0xC2, 0x84,\n    0xA6, 0xF9, 0x9B, 0x42, 0x0F, 0xA1, 0x8D, 0x39, 0xF1, 0x67, 0xCE, 0xE7, 0xB8, 0x70, 0x24, 0xB8,\n    0xE6, 0x82, 0xE8, 0xC7, 0xF6, 0x7B, 0xFE, 0xD8, 0x38, 0xCF, 0x1D, 0x0D, 0xEA, 0x7D, 0xBB, 0x65,\n    0x61, 0x9B, 0xFA, 0xA2, 0xB8, 0xA7, 0x9B, 0xAD, 0x76, 0x0B, 0x93, 0x00, 0x5E, 0x43, 0x10, 0x4A,\n    0x5F, 0x22, 0xCA, 0x74, 0x8E, 0xEC, 0x2B, 0xB4, 0x68, 0x44, 0x2C, 0x95, 0x4A, 0xDA, 0xDA, 0xC5,\n    0xBE, 0x8B, 0xFF, 0x4C, 0xC2, 0x0A, 0x74, 0xE0, 0x6E, 0x45, 0xBD, 0xD5, 0x0A, 0x50, 0xB1, 0x33,\n    0x8D, 0x57, 0xE8, 0xF0, 0x78, 0x6D, 0x05, 0x2B, 0x9C, 0x56, 0xC7, 0xB7, 0xE4, 0x66, 0xB8, 0x72,\n    0x90, 0x92, 0xC0, 0x07, 0x7B, 0x18, 0xB1, 0x14, 0x6A, 0x64, 0xEE, 0xC1, 0x9F, 0x0D, 0xB4, 0x1D,\n    0xE7, 0xF1, 0x17, 0x49, 0xB1, 0x84, 0xD9, 0x26, 0xA5, 0x9A, 0xFA, 0xF1, 0xA3, 0x55, 0xC2, 0xAA,\n    0xF5, 0xBE, 0x49, 0xF6, 0x6C, 0x67, 0x93, 0x04, 0x0A, 0xE3, 0xC0, 0xA1, 0x72, 0x8B, 0xE7, 0x05,\n    0xEA, 0x70, 0xEF, 0x27, 0xF4, 0xC0, 0xE3, 0xBE, 0x57, 0xA3, 0x66, 0xAF, 0x83, 0x04, 0x0E, 0xAD,\n    0x08, 0x77, 0x1F, 0xA4, 0x1C, 0xA5, 0xF5, 0xED, 0x03, 0xB4, 0x0E, 0xDA, 0xEC, 0xFD, 0x9D, 0x8B,\n    0x81, 0x5C, 0xDF, 0xAE, 0x5D, 0xEC, 0x08, 0x94, 0x78, 0xA4, 0x0F, 0x1A, 0x75, 0x0B, 0x32, 0xE2,\n    0x9F, 0x0B, 0xDF, 0xD4, 0x5D, 0xFE, 0xF8, 0x43, 0x5E, 0xC5, 0xC0, 0x8C, 0xBC, 0xAB, 0xDE, 0x33,\n    0x38, 0xA0, 0x76, 0x86, 0x94, 0xF0, 0xF0, 0x40, 0xD4, 0x3F, 0x82, 0xED, 0x3F, 0x2C, 0x5A, 0x6F,\n    0xB3, 0xE9, 0x4C, 0x5D, 0xE5, 0xAB, 0xD5, 0xAB, 0x89, 0x9D, 0x0A, 0x37, 0x9F, 0xC0, 0x84, 0xF6,\n    0x81, 0xB7, 0x9B, 0x5C, 0x1A, 0xC4, 0x40, 0x06, 0x29, 0xC6, 0x62, 0xCE, 0x07, 0x1B, 0x13, 0xBA,\n    0x81, 0xDF, 0xEE, 0xF9, 0xD3, 0xE7, 0xC1, 0x9A, 0x7C, 0x43, 0x0E, 0x83, 0xB0, 0x4E, 0xCD, 0x8E,\n    0xB4, 0x34, 0xBF, 0xEF, 0x74, 0x4D, 0xE0, 0xF4, 0xB3, 0x25, 0x93, 0xAC, 0xCE, 0x20, 0x7B, 0x22,\n    0x6E, 0xAA, 0x75, 0x14, 0xCA, 0xA8, 0x09, 0x2A, 0xCE, 0xE0, 0x57, 0x5E, 0x3A, 0xCA, 0xF5, 0x11,\n    0x5D, 0xC6, 0x08, 0x6D, 0xB1, 0xD8, 0x4C, 0x90, 0x4A, 0x5A, 0x4B, 0x1F, 0x98, 0xD6, 0x87, 0xF2,\n    0xD5, 0x82, 0x86, 0x16, 0xA5, 0x01, 0xEA, 0xFC, 0x78, 0xF3, 0xF9, 0xE2, 0x3C, 0x74, 0xC4, 0xFC,\n    0x9B, 0x8D, 0x2C, 0x36, 0x87, 0xE6, 0x57, 0x8C, 0x5D, 0xEA, 0x8F, 0x96, 0x85, 0x9A, 0xEF, 0x18,\n    0x34, 0x36, 0xC0, 0x46, 0x7C, 0x77, 0xD6, 0xBF, 0x25, 0xA2, 0xE7, 0x95, 0xFA, 0x82, 0xDD, 0x11,\n    0x2B, 0xAC, 0x9D, 0xB8, 0x7B, 0x21, 0xB7, 0x51, 0xFC, 0x21, 0x24, 0xA5, 0x20, 0xD4, 0x89, 0xF0,\n    0xFF, 0x31, 0x1B, 0x3E, 0x29, 0x10, 0x00, 0xFA, 0xEA, 0x6E, 0xA7, 0xA0, 0x4E, 0x1E, 0x21, 0xDF,\n    0x7F, 0x84, 0x16, 0x77, 0x8B, 0xF1, 0xFE, 0xAB, 0x4E, 0xBD, 0xF4, 0xA1, 0x2B, 0xA3, 0x8B, 0x7A,\n    0x46, 0xF2, 0xD3, 0x92, 0x23, 0xBB, 0x23, 0x30, 0x10, 0x7A, 0x69, 0x38, 0x6C, 0xBA, 0xF3, 0xBD,\n    0xDF, 0xF6, 0xCE, 0xC7, 0x9A, 0xA7, 0x20, 0xB8, 0xE9, 0xE6, 0x14, 0xEE, 0xFD, 0x3E, 0x89, 0xF8,\n    0x93, 0x6F, 0x7B, 0xDE, 0xD9, 0xB4, 0x3A, 0xED, 0xA9, 0x4B, 0x05, 0x2E, 0x4F, 0xE4, 0x07, 0x0F,\n    0x45, 0x3F, 0x95, 0x62, 0x6C, 0x4B, 0x23, 0xA3, 0xBF, 0x74, 0x13, 0x16, 0xFD, 0x88, 0xDB, 0xF8,\n    0xC6, 0xB1, 0xA6, 0x72, 0x20, 0xCC, 0xE2, 0x67, 0x92, 0x30, 0xE0, 0x2C, 0xAF, 0xDA, 0xD9, 0x27,\n    0x92, 0x01, 0x97, 0xAB, 0xBE, 0xCB, 0x2C, 0x0D, 0x01, 0x67, 0x3F, 0xE3, 0x7A, 0x5B, 0xE0, 0x06,\n    0x08, 0xB3, 0x25, 0x4E, 0x78, 0x80, 0x76, 0x67, 0xFB, 0x4C, 0xD0, 0x5E, 0xFD, 0x5A, 0x64, 0xD7,\n    0x0C, 0x09, 0xC2, 0x21, 0x57, 0x06, 0x63, 0x5A, 0x59, 0x2E, 0xF1, 0x3F, 0x09, 0x0D, 0x60, 0xDF,\n    0xED, 0xDA, 0xA7, 0x75, 0x70, 0xB7, 0xD7, 0x0A, 0x66, 0x2D, 0xAC, 0xB8, 0x2F, 0xA3, 0x96, 0x19,\n    0xB0, 0x5B, 0x29, 0x9C, 0x6E, 0x50, 0xC0, 0x00, 0x14, 0xC5, 0x3B, 0xA3, 0x6C, 0x3A, 0x6A, 0xAB,\n    0x97, 0x96, 0x47, 0x72, 0xE7, 0x21, 0x74, 0x8F, 0xD9, 0xB4, 0xCE, 0xDC, 0x81, 0x6E, 0x48, 0x96,\n    0x59, 0xB7, 0xC9, 0xF3, 0x99, 0xD0, 0x8D, 0x10, 0x3B, 0x69, 0xD0, 0xF5, 0xA7, 0x31, 0x9D, 0xA8,\n    0x36, 0x63, 0xB6, 0xBC, 0x8A, 0xC9, 0x03, 0x3A, 0xCC, 0xDC, 0xFA, 0x9A, 0xAB, 0x47, 0xC4, 0x19,\n    0x83, 0xD6, 0xD3, 0x1F, 0x6E, 0x60, 0xD9, 0xCC, 0x98, 0xE5, 0x53, 0xC6, 0xC3, 0xE8, 0xA7, 0xF3,\n    0xB9, 0xF1, 0xAC, 0xA9, 0xB9, 0x05, 0x47, 0x46, 0x21, 0x3F, 0x0C, 0xCC, 0x60, 0x5C, 0xF8, 0x9E,\n    0xA8, 0x42, 0x5D, 0xD9, 0xC8, 0xF3, 0x9E, 0x75, 0xAD, 0x22, 0x68, 0x67, 0x37, 0xF2, 0x8F, 0xD1,\n    0x7C, 0x5D, 0x07, 0xD8, 0x69, 0x6C, 0x34, 0xF0, 0x7E, 0x71, 0x47, 0x29, 0xA1, 0x8D, 0x07, 0x3F,\n    0x60, 0x75, 0xC8, 0x16, 0xEF, 0x11, 0xE3, 0xFD, 0x48, 0x35, 0xED, 0xCA, 0x2C, 0x37, 0xCF, 0xEA,\n    0x37, 0x6D, 0xA0, 0xFF, 0x7A, 0x46, 0x15, 0x41, 0x6B, 0xE3, 0x40, 0x6F, 0x27, 0x02, 0xA4, 0x2B,\n    0x34, 0x0B, 0x07, 0xE3, 0x69, 0x4E, 0xF3, 0xF3, 0xAC, 0x4A, 0xA7, 0xE4, 0xBB, 0x4E, 0x8E, 0xAF,\n    0xC0, 0x76, 0x9B, 0xD3, 0xB1, 0x93, 0xF3, 0x87, 0x38, 0x7B, 0x0B, 0x84, 0xFA, 0xDA, 0x85, 0x32,\n    0x06, 0x7C, 0xFD, 0x2E, 0xF0, 0x90, 0x31, 0xAE, 0x3E, 0x9B, 0xBF, 0x0A, 0xDF, 0xA4, 0xA9, 0x3B,\n    0x43, 0x16, 0x31, 0x04, 0xD6, 0x2F, 0x9F, 0x7A, 0x79, 0xD5, 0x79, 0x5D, 0x1C, 0x4A, 0x6A, 0x19,\n    0x2A, 0xD0, 0x05, 0x69, 0xFE, 0xAC, 0x78, 0x41, 0xE7, 0xEA, 0xE7, 0xDD, 0x23, 0xA7, 0x7C, 0x59,\n    0x7F, 0x6B, 0xDA, 0x30, 0x77, 0x16, 0xE8, 0x02, 0x3D, 0xB4, 0x4D, 0xB3, 0xCC, 0x41, 0x56, 0x05,\n    0x1F, 0xD7, 0x07, 0x0B, 0x5B, 0x30, 0x6C, 0x45, 0x7E, 0x41, 0xE4, 0x79, 0x0B, 0x5A, 0x17, 0xF5,\n    0xD6, 0x30, 0x9E, 0xAC, 0x2F, 0x6F, 0x99, 0x18, 0x4E, 0x11, 0x39, 0xF4, 0x29, 0x55, 0x82, 0x08,\n    0xF8, 0x2D, 0xE6, 0x06, 0xE8, 0x2D, 0x62, 0xD5, 0x66, 0xB4, 0x5E, 0x62, 0x96, 0x16, 0xA6, 0xD8,\n    0x69, 0x04, 0x23, 0x35, 0xD0, 0x4F, 0xA0, 0x7F, 0xC5, 0xE4, 0x49, 0x6C, 0x64, 0x4A, 0xD8, 0xC3,\n    0x4D, 0x51, 0xBC, 0x49, 0x12, 0x76, 0x8A, 0xEC, 0xB2, 0x03, 0x93, 0xB8, 0x2D, 0x42, 0x91, 0x09,\n    0xAE, 0xC2, 0x50, 0xD2, 0x72, 0x3A, 0x11, 0x26, 0xF8, 0x43, 0x2A, 0xD5, 0x13, 0x4E, 0x4D, 0x1E,\n    0x28, 0xE5, 0xAF, 0xCC, 0xCE, 0x6D, 0x4A, 0x06, 0xB4, 0x2E, 0xF7, 0x40, 0x89, 0x33, 0x61, 0x11,\n    0x7A, 0x4C, 0x75, 0xC5, 0x7D, 0x2E, 0xDB, 0x1D, 0xE7, 0xA0, 0xD7, 0x96, 0xDD, 0x37, 0xF3, 0x48,\n    0x62, 0xBB, 0xAF, 0xB2, 0x2C, 0x56, 0x99, 0x20, 0x45, 0x1A, 0x20, 0x96, 0x6F, 0x5E, 0x74, 0x7B,\n    0x04, 0xDA, 0x67, 0x05, 0x0F, 0x4D, 0xFC, 0x7E, 0xE0, 0x65, 0x13, 0xDB, 0x06, 0x5E, 0x50, 0x93,\n    0xA4, 0xA2, 0x1D, 0x10, 0x7D, 0x61, 0x25, 0x3D, 0x19, 0xCD, 0xC9, 0x51, 0xE2, 0xF1, 0x6A, 0xBC,\n    0xCF, 0x7D, 0xB3, 0x0F, 0x77, 0x98, 0x7A, 0x09, 0x9C, 0x40, 0x03, 0x48, 0x17, 0xE2, 0x75, 0x10,\n    0x59, 0xAC, 0x9F, 0x4A, 0xEC, 0x63, 0x0F, 0xD9, 0x3A, 0x75, 0x0D, 0xCD, 0xD4, 0x4E, 0x7F, 0xA5,\n    0xE3, 0xFB, 0xA3, 0x5E, 0x0A, 0x6E, 0xD2, 0xD8, 0x05, 0x3D, 0x84, 0x20, 0x5E, 0xCE, 0xBE, 0xFC,\n    0x9A, 0x29, 0x85, 0x08, 0xD6, 0x07, 0x07, 0x4B, 0x01, 0x60, 0x07, 0xE7, 0xF5, 0x83, 0x9E, 0x35,\n    0x12, 0xEF, 0xDD, 0xA6, 0x97, 0x51, 0xD1, 0x39, 0x11, 0x22, 0x45, 0xB0, 0x5D, 0xCA, 0x29, 0x69,\n    0x12, 0xE3, 0x0C, 0xA7, 0x41, 0x57, 0x99, 0xF2, 0xD9, 0x05, 0xAD, 0x87, 0xDE, 0xC7, 0x2C, 0xB3,\n    0x2B, 0x63, 0x87, 0x9F, 0xC5, 0xEE, 0xAB, 0xF5, 0x2A, 0xF1, 0x9B, 0x54, 0xB6, 0x54, 0xC0, 0x41,\n    0x88, 0x6E, 0x54, 0x63, 0x85, 0xD3, 0xFB, 0xED, 0xAD, 0x45, 0xEE, 0x91, 0xD3, 0x65, 0x4E, 0x5D,\n    0xF7, 0xE1, 0xF9, 0x56, 0x29, 0x12, 0x9D, 0x3C, 0xFE, 0x91, 0x76, 0xBE, 0x49, 0xD5, 0x62, 0x61,\n    0x24, 0x4F, 0x5C, 0x6B, 0x9A, 0xFC, 0xD2, 0x31, 0x98, 0x24, 0xA5, 0x5A, 0x7A, 0x98, 0xF5, 0x0B,\n    0xFE, 0xD4, 0x44, 0xF1, 0xE2, 0x88, 0xE7, 0x00, 0xA7, 0x56, 0xD6, 0xC9, 0xC8, 0x0C, 0x66, 0x20,\n    0xCC, 0x92, 0x3B, 0x8A, 0x50, 0x65, 0x09, 0x61, 0x54, 0x06, 0xA3, 0x7D, 0x73, 0xFB, 0x9E, 0x45,\n    0xD8, 0x67, 0x0F, 0x79, 0xF6, 0xF9, 0xAB, 0x72, 0x61, 0xA0, 0x36, 0xE2, 0x95, 0x32, 0x58, 0xE6,\n    0x47, 0xA6, 0x53, 0x27, 0x68, 0x36, 0xB5, 0x4B, 0x59, 0x61, 0x08, 0xEA, 0xE9, 0xE8, 0x0A, 0x24,\n    0xFD, 0x96, 0x5A, 0x02, 0xDB, 0xC2, 0xB4, 0x88, 0xF2, 0x15, 0x3C, 0xDC, 0xEF, 0x51, 0x34, 0x43,\n    0xD2, 0xF4, 0x9D, 0x9E, 0xD4, 0x5C, 0x98, 0x5B, 0xB2, 0xB8, 0x70, 0x39, 0x26, 0x5E, 0x8D, 0xAD,\n    0x9B, 0x37, 0x18, 0xB9, 0x74, 0xAC, 0xC6, 0xD0, 0x07, 0x1D, 0x13, 0x20, 0x66, 0x36, 0x28, 0x52,\n    0x62, 0xD9, 0x36, 0x54, 0xAE, 0x14, 0xF4, 0x62, 0x50, 0xA5, 0x96, 0x9B, 0xBE, 0xB8, 0x33, 0xFB,\n    0xD3, 0xDC, 0xB3, 0x74, 0x90, 0x2B, 0x3B, 0xAC, 0x27, 0xD8, 0x83, 0x8E, 0xF9, 0x6D, 0x35, 0x42,\n    0xD5, 0x60, 0x46, 0x33, 0x93, 0xF8, 0xB4, 0x77, 0xB0, 0xBF, 0xCD, 0xAE, 0x33, 0x9C, 0x8A, 0x7A,\n    0x06, 0x33, 0x05, 0x0C, 0x27, 0x61, 0x30, 0x31, 0x13, 0xD3, 0x15, 0xB1, 0x7C, 0x23, 0x22, 0x99,\n    0xFF, 0x47, 0xB4, 0xA2, 0x1D, 0x39, 0x9A, 0xE1, 0x52, 0xCC, 0x1A, 0x53, 0xF3, 0xA4, 0xE7, 0x2A,\n    0x4A, 0x12, 0xE5, 0xA4, 0x8D, 0x0D, 0xC4, 0xA6, 0xFE, 0x4F, 0x45, 0x2D, 0x2C, 0xA2, 0x64, 0x39,\n    0x41, 0xA5, 0xC0, 0xB7, 0x84, 0xA5, 0x98, 0x67, 0x2A, 0xA9, 0x2D, 0x7B, 0xAF, 0x8E, 0xDC, 0xE3,\n    0x58, 0xAA, 0x17, 0x5B, 0xC3, 0x69, 0xE7, 0x88, 0x64, 0xB8, 0x72, 0x5A, 0xA5, 0xCD, 0x07, 0x27,\n    0x1B, 0xC3, 0x37, 0x99, 0x9B, 0x57, 0xE7, 0x1F, 0x32, 0xED, 0xB5, 0xD6, 0x39, 0x5C, 0x40, 0x03,\n    0x6A, 0x20, 0x51, 0xC3, 0x4E, 0x39, 0x9C, 0x5F, 0x75, 0x2B, 0xFF, 0xCA, 0xA1, 0x43, 0x83, 0xC3,\n    0xA8, 0x5F, 0x0E, 0xC5, 0xBD, 0x88, 0xE6, 0xA9, 0x89, 0x07, 0x60, 0xA1, 0x21, 0x76, 0xF7, 0xBE,\n    0x65, 0xBC, 0x31, 0x59, 0x88, 0x00, 0xE5, 0xA7, 0xE3, 0x7A, 0x61, 0xE6, 0x87, 0x5C, 0x4E, 0xD1,\n    0x29, 0xDE, 0xD6, 0x4B, 0xCF, 0x64, 0x93, 0x31, 0xE9, 0x72, 0x91, 0x9F, 0xB3, 0x1E, 0x6E, 0x98,\n    0x1D, 0xF5, 0x8F, 0xFA, 0xFD, 0x7C, 0xA1, 0x16, 0x39, 0x76, 0x15, 0x52, 0x99, 0x40, 0x5A, 0x2E,\n    0x40, 0x71, 0x06, 0x53, 0xA9, 0x85, 0x98, 0x67, 0x5D, 0x38, 0x45, 0x50, 0xAF, 0xA3, 0x27, 0x46,\n    0x12, 0xCF, 0x79, 0xC9, 0x20, 0x39, 0xE9, 0x37, 0xBE, 0xD1, 0xC3, 0x8A, 0xFA, 0x7E, 0x6D, 0x34,\n    0x79, 0x64, 0x9F, 0x57, 0x78, 0xF1, 0xD2, 0x61, 0x2E, 0xD4, 0x80, 0x3B, 0xF3, 0x13, 0x9E, 0x05,\n    0x18, 0x0A, 0x5C, 0x7B, 0x2E, 0xAA, 0xB8, 0xA6, 0xCB, 0x11, 0x85, 0x48, 0xBA, 0x78, 0x7B, 0x3A,\n    0x8E, 0x1A, 0x91, 0xB7, 0x97, 0x61, 0xB5, 0x8E, 0xEB, 0xD4, 0x46, 0xE1, 0x68, 0x2E, 0x66, 0xC6,\n    0x8F, 0xF3, 0xCA, 0x29, 0x5B, 0x7E, 0xAA, 0x22, 0x71, 0xCA, 0x8A, 0xBB, 0xD5, 0x0D, 0x14, 0xA5,\n    0x98, 0xD7, 0x63, 0x60, 0xC2, 0x9A, 0x30, 0xD6, 0x5A, 0xE8, 0xCC, 0xFA, 0xCC, 0x06, 0x08, 0x63,\n    0x1E, 0x16, 0x4C, 0x3D, 0xF5, 0x68, 0xDD, 0xDC, 0xE2, 0xFB, 0xDE, 0x3F, 0x90, 0xD6, 0x7B, 0xC5,\n    0x09, 0xF7, 0x34, 0x5A, 0x23, 0xA0, 0x45, 0x88, 0x5C, 0x86, 0xA6, 0x12, 0x70, 0x1D, 0xF4, 0x3D,\n    0xAE, 0xFC, 0x44, 0xA7, 0xB2, 0xBE, 0x3F, 0xEA, 0xC0, 0xA2, 0x28, 0x6C, 0x91, 0xA3, 0xB7, 0xE9,\n    0xF6, 0x8F, 0x60, 0x29, 0xDA, 0x89, 0xF5, 0x95, 0x85, 0x2C, 0x4D, 0x09, 0xDF, 0x54, 0xC8, 0x96,\n    0xB5, 0xD4, 0x18, 0xA8, 0xCC, 0xCD, 0x3F, 0xDF, 0x70, 0x2B, 0xD9, 0x28, 0xBC, 0x51, 0x44, 0x02,\n    0x11, 0xE9, 0x5D, 0xDB, 0xF0, 0x25, 0x68, 0xD3, 0x2F, 0x7E, 0x17, 0x0B, 0x76, 0x31, 0xF9, 0x8E,\n    0x46, 0x5B, 0x22, 0xB9, 0xB3, 0xBF, 0xDE, 0x24, 0x06, 0x28, 0x37, 0x2A, 0xB6, 0x3D, 0xBA, 0x4D,\n    0xD8, 0x8F, 0xE0, 0x5D, 0x39, 0x52, 0xA0, 0x2F, 0xE1, 0xDD, 0x8B, 0x91, 0x84, 0xC2, 0xDA, 0x38,\n    0x2D, 0x61, 0xE0, 0x31, 0x03, 0x8D, 0xE5, 0xCF, 0xDC, 0x74, 0x88, 0x7C, 0x0C, 0xF6, 0x89, 0x99,\n    0x73, 0xD1, 0x7C, 0x06, 0xC1, 0x4B, 0xDE, 0xC0, 0x66, 0x53, 0xB5, 0xA8, 0x2E, 0xF7, 0x03, 0xE6,\n    0x88, 0x8D, 0xC3, 0x46, 0x0C, 0xCA, 0xE3, 0x03, 0xA3, 0xEE, 0xA9, 0x4C, 0x3F, 0xAF, 0x81, 0x06,\n    0x2C, 0xAF, 0x0D, 0x43, 0x2C, 0xF4, 0x9B, 0x42, 0xC0, 0x7B, 0x8B, 0xE5, 0x89, 0xB7, 0x43, 0xA2,\n    0xBD, 0x4E, 0x98, 0x47, 0x74, 0x1B, 0x80, 0xC3, 0x91, 0x47, 0x11, 0xAA, 0xC0, 0x60, 0x8D, 0x11,\n    0xFA, 0x5D, 0xC7, 0x1C, 0x3A, 0x3D, 0xE3, 0xA4, 0x2A, 0xBE, 0x4A, 0xF1, 0x30, 0xD8, 0xCC, 0x66,\n    0x14, 0x8D, 0xE1, 0xEF, 0xB5, 0xCE, 0xE7, 0x65, 0xDB, 0xCC, 0xDF, 0xE9, 0x68, 0x61, 0x2C, 0x20,\n    0x49, 0x5B, 0xD5, 0x8D, 0x67, 0xAA, 0x32, 0xDF, 0x12, 0x37, 0x53, 0x3E, 0x84, 0x25, 0xAB, 0x3C,\n    0x00, 0xD7, 0x71, 0x87, 0x69, 0xEC, 0x73, 0x62, 0xED, 0x4D, 0x74, 0x1E, 0x1E, 0x28, 0x99, 0x4A,\n    0x92, 0x48, 0x88, 0x61, 0x2E, 0x5B, 0x67, 0x0F, 0xA6, 0x43, 0xA7, 0x7F, 0xE9, 0xC5, 0x87, 0xB5,\n    0x00, 0xE7, 0xE8, 0xF4, 0x9A, 0x51, 0x6A, 0xA6, 0xFE, 0xCD, 0x49, 0xED, 0x63, 0x3C, 0x2D, 0x41,\n    0x31, 0xD0, 0x6D, 0x3E, 0xCA, 0x31, 0x10, 0x0B, 0x8C, 0xB0, 0x84, 0xF9, 0x55, 0x23, 0x3E, 0x18,\n    0x48, 0x7B, 0x93, 0xBF, 0x34, 0x9F, 0x2D, 0x20, 0x24, 0x5A, 0x40, 0x4C, 0xDF, 0x97, 0xAB, 0xB9,\n    0xF1, 0x54, 0xCF, 0x35, 0x13, 0xE8, 0x60, 0x74, 0x21, 0x64, 0xB1, 0xFE, 0xE2, 0x85, 0xD4, 0x4D,\n    0x4A, 0xA0, 0x74, 0xDD, 0xC2, 0x03, 0xD7, 0x61, 0x4C, 0x77, 0x0F, 0x38, 0xFE, 0x43, 0xEB, 0xDE,\n    0xEE, 0x32, 0x4D, 0x79, 0x50, 0xE6, 0x02, 0x2B, 0x97, 0x4C, 0xAA, 0x46, 0x31, 0x3A, 0x8D, 0xBD,\n    0x7F, 0x54, 0x86, 0x0A, 0x51, 0x5D, 0x3D, 0x59, 0xBB, 0x7B, 0x07, 0x99, 0x0F, 0xF0, 0x63, 0xAD,\n    0x39, 0x0B, 0x99, 0xDC, 0x18, 0x2F, 0x01, 0x26, 0x1F, 0x29, 0xF1, 0x81, 0xD9, 0x46, 0x68, 0x13,\n    0xC8, 0xE8, 0xC6, 0xE7, 0x7C, 0x66, 0x72, 0xDF, 0x31, 0xEA, 0x13, 0xDF, 0x3E, 0x88, 0xF7, 0x35,\n    0xC0, 0x27, 0xF1, 0xC8, 0x04, 0x55, 0x8D, 0xC2, 0xB3, 0x87, 0x98, 0x51, 0x54, 0x46, 0x0C, 0x63,\n    0xBE, 0xD0, 0xBA, 0x4D, 0x6F, 0x1C, 0xDF, 0xD4, 0xB1, 0x76, 0xCA, 0xB2, 0x85, 0xFE, 0x65, 0xE6,\n    0xC0, 0x0D, 0x56, 0xBA, 0x2D, 0x99, 0xFC, 0x9B, 0x6D, 0xC2, 0xFE, 0x28, 0x53, 0xED, 0xE0, 0xF7,\n    0x20, 0x4D, 0xD7, 0x4D, 0xF6, 0x5D, 0xC6, 0x50, 0x8D, 0xC1, 0x19, 0xC7, 0x12, 0xF5, 0x53, 0xE0,\n    0xE8, 0x07, 0xA5, 0x4E, 0x18, 0xF7, 0x5F, 0xFE, 0x48, 0x00, 0x12, 0x5F, 0x23, 0x4B, 0x80, 0x0D,\n    0x43, 0x11, 0xCA, 0xAC, 0xFF, 0x1F, 0xB5, 0x3C, 0x43, 0x23, 0x7D, 0x86, 0xB3, 0x58, 0x40, 0xF4,\n    0x42, 0xC1, 0xFB, 0x28, 0xFD, 0x89, 0x6B, 0x9C, 0x41, 0xE5, 0x60, 0xCA, 0x14, 0x76, 0xAB, 0x35,\n    0x09, 0x74, 0xF0, 0x89, 0xBB, 0x47, 0x3C, 0xBC, 0xED, 0x90, 0x5C, 0x75, 0xFE, 0x24, 0xD9, 0x41,\n    0x93, 0xE1, 0x98, 0x8D, 0xA7, 0x71, 0xDF, 0x54, 0x4C, 0x62, 0x02, 0x7C, 0x20, 0x9E, 0xDB, 0x59,\n    0xBB, 0x90, 0x89, 0x2C, 0x4D, 0x8E, 0x21, 0x25, 0x5E, 0x6C, 0xD8, 0x2F, 0x4D, 0x03, 0x92, 0xDF,\n    0xE0, 0xD3, 0x57, 0xAA, 0x12, 0xA1, 0x84, 0x88, 0x65, 0x25, 0x4B, 0xD6, 0xA1, 0x5C, 0x9F, 0xC0,\n    0x6E, 0xCE, 0xD8, 0x49, 0xF6, 0x54, 0x22, 0x99, 0xDD, 0x69, 0x3D, 0x97, 0x57, 0x71, 0xB1, 0x8D,\n    0x94, 0xA2, 0x3A, 0x53, 0x6C, 0xEB, 0xB7, 0x90, 0xEC, 0x4F, 0x9C, 0x35, 0xCC, 0x7B, 0xE1, 0xFD,\n    0x54, 0xE2, 0xE8, 0xBD, 0x97, 0xDE, 0x5C, 0xE6, 0x2E, 0xEA, 0x1B, 0x72, 0xFF, 0x30, 0xD5, 0x6F,\n    0x94, 0x60, 0x42, 0x52, 0xA7, 0x71, 0xE2, 0xEA, 0xA9, 0xDC, 0xD0, 0xC4, 0x5A, 0x01, 0x70, 0xFA,\n    0x04, 0x85, 0x45, 0x30, 0xFF, 0x23, 0x0B, 0x38, 0xFB, 0xBA, 0x63, 0xAB, 0xA4, 0x50, 0x8F, 0x6A,\n    0x73, 0xAC, 0xFE, 0x33, 0x95, 0x23, 0x1C, 0xD8, 0x5F, 0xEF, 0x71, 0xCD, 0x73, 0xC2, 0x84, 0x9E,\n    0x7D, 0x81, 0x3B, 0xAE, 0x4D, 0xA8, 0xB7, 0xA8, 0xE8, 0xF5, 0x1A, 0xF0, 0x02, 0x8E, 0x1C, 0x5E,\n    0x3F, 0x06, 0xDD, 0x2B, 0xC8, 0x38, 0x07, 0x29, 0xAF, 0x80, 0xDB, 0x9E, 0xCD, 0x8A, 0x9F, 0x96,\n    0xB4, 0x3A, 0x94, 0x53, 0x2F, 0xDA, 0xD8, 0x54, 0x88, 0x73, 0x63, 0x46, 0x73, 0x95, 0xE2, 0xD8,\n    0xC5, 0x32, 0x06, 0xE7, 0x7C, 0xB4, 0xC7, 0x04, 0x6B, 0x66, 0xE0, 0x18, 0xCD, 0x57, 0x45, 0x5D,\n    0x62, 0x8A, 0x39, 0x4C, 0x5F, 0x6E, 0x2F, 0xFC, 0x73, 0xFA, 0x9E, 0xBB, 0x23, 0x9E, 0xCB, 0x56,\n    0x15, 0x6D, 0xF1, 0xDD, 0x98, 0x1E, 0x33, 0x8E, 0xCA, 0xB7, 0x63, 0x3B, 0x62, 0x69, 0x7B, 0x68,\n    0x71, 0xDB, 0x80, 0xA1, 0xD3, 0x9E, 0xBB, 0xC9, 0x0E, 0x90, 0x4F, 0xFA, 0x61, 0xFC, 0xA3, 0xE1,\n    0xFA, 0xC3, 0x1F, 0x69, 0xC8, 0x4D, 0xBF, 0xB0, 0x1F, 0x0C, 0xB2, 0x37, 0x28, 0xEC, 0xF1, 0xF7,\n    0x42, 0x80, 0xD4, 0x9B, 0x40, 0x7D, 0xDA, 0x8B, 0x07, 0x60, 0x18, 0x26, 0x5C, 0x42, 0x1B, 0x05,\n    0x81, 0x8B, 0xD0, 0xA1, 0x72, 0x3D, 0xCD, 0x44, 0x66, 0xD4, 0xFD, 0x10, 0xDF, 0x78, 0x4D, 0xF0,\n    0x61, 0x00, 0x05, 0xC1, 0xEC, 0xF0, 0xE8, 0x73, 0x58, 0xDE, 0xCF, 0x97, 0xAF, 0x57, 0xFC, 0x07,\n    0x0B, 0x06, 0x0F, 0xBB, 0xCD, 0x0F, 0x62, 0x0E, 0x38, 0x80, 0x93, 0x86, 0x95, 0x17, 0x52, 0x22,\n    0xAE, 0x1A, 0x3B, 0x55, 0x42, 0xCE, 0xF3, 0xF0, 0xFD, 0x34, 0x2F, 0x7E, 0x57, 0x71, 0xAF, 0x45,\n    0x59, 0x3E, 0x65, 0x4C, 0xA6, 0x04, 0x3A, 0x19, 0x94, 0x00, 0xD4, 0xEE, 0xBB, 0x3F, 0x09, 0x86,\n    0x57, 0x51, 0xD6, 0x71, 0x03, 0xA9, 0xDB, 0x56, 0xED, 0x94, 0x8D, 0x75, 0xBB, 0x5A, 0x8D, 0x35,\n    0xBA, 0xEC, 0xDF, 0x13, 0x7A, 0xAF, 0x1D, 0x19, 0xBE, 0x2E, 0x60, 0xB8, 0xED, 0x0A, 0xEA, 0x26,\n    0xA3, 0x48, 0xF4, 0x8A, 0x71, 0x05, 0x35, 0x5A, 0x54, 0x74, 0xAA, 0xA9, 0x15, 0x93, 0xEF, 0x0E,\n    0x81, 0x23, 0xE9, 0x4E, 0xD1, 0x4E, 0x88, 0xC2, 0x1D, 0xE6, 0x5C, 0xC4, 0x54, 0x2B, 0xAE, 0xB4,\n    0xF0, 0xF0, 0x4C, 0x86, 0xBA, 0xB1, 0xDD, 0x00, 0xEC, 0xF6, 0x7E, 0x6F, 0x3F, 0x45, 0xA7, 0xA7,\n    0x09, 0x58, 0x49, 0x22, 0xBC, 0xB4, 0x0C, 0x33, 0x21, 0xD6, 0x07, 0x44, 0x3C, 0xBA, 0xFE, 0xF8,\n    0xF8, 0x2B, 0xAE, 0x33, 0x5B, 0xE7, 0xF9, 0x67, 0x68, 0xE3, 0xED, 0x40, 0x28, 0xF5, 0xFD, 0x5C,\n    0xE5, 0x25, 0x20, 0x04, 0x29, 0x9B, 0xC1, 0xDD, 0x51, 0xEC, 0x57, 0x56, 0x16, 0xA7, 0x4C, 0x3D,\n    0x80, 0xAE, 0x62, 0xFE, 0xBB, 0x2D, 0x17, 0x51, 0x00, 0x01, 0x79, 0x53, 0xD7, 0x70, 0xFA, 0x89,\n    0xEB, 0xB5, 0x37, 0x92, 0x03, 0x9C, 0x88, 0xC0, 0xA6, 0x62, 0x14, 0xB2, 0x0D, 0x22, 0xC8, 0xDC,\n    0x43, 0x17, 0xF8, 0x72, 0xFE, 0x0B, 0x88, 0xD6, 0x96, 0x7A, 0xB5, 0xF3, 0xC4, 0x6F, 0xEF, 0xA5,\n    0x87, 0xB7, 0x8A, 0xAD, 0x46, 0xCD, 0xFF, 0xF2, 0x38, 0x14, 0xD8, 0xD4, 0xD4, 0xC5, 0x9A, 0x5D,\n    0x38, 0x3D, 0x44, 0x53, 0xF3, 0x43, 0x79, 0x3F, 0xCD, 0xC2, 0x93, 0xB5, 0x34, 0x4F, 0x5E, 0xFA,\n    0x4D, 0x64, 0x61, 0x39, 0x0A, 0xDC, 0x8D, 0xB5, 0xD3, 0x82, 0xFD, 0x53, 0xAD, 0x9B, 0xC6, 0x79,\n    0x24, 0x09, 0x91, 0x8F, 0x61, 0x25, 0x07, 0x21, 0x97, 0x73, 0x98, 0x98, 0xB5, 0x46, 0xD1, 0xFB,\n    0xCE, 0x91, 0xF4, 0xC6, 0x39, 0xC7, 0xBE, 0xBF, 0x65, 0x97, 0x59, 0x27, 0x08, 0xDA, 0x30, 0x7D,\n    0x05, 0x6D, 0x04, 0xD8, 0xA2, 0xDA, 0x52, 0xFA, 0xC2, 0x6B, 0x37, 0x21, 0xEC, 0x03, 0xEE, 0x4D,\n    0x89, 0xA7, 0x81, 0x54, 0x1A, 0xB0, 0x2B, 0x3E, 0xA7, 0xE0, 0x54, 0xF6, 0x5A, 0xD6, 0x4E, 0xA2,\n    0x23, 0x1D, 0x1E, 0xE2, 0x46, 0x89, 0x20, 0xB5, 0x63, 0x44, 0xF1, 0xF5, 0x50, 0x6E, 0x5E, 0xD1,\n    0x6A, 0x34, 0xA8, 0xA1, 0xE8, 0xC4, 0x17, 0xE8, 0x4F, 0xC8, 0x2E, 0x64, 0x37, 0xC6, 0xEC, 0xDC,\n    0x65, 0x88, 0x38, 0x4A, 0xBF, 0x61, 0xC0, 0x8D, 0xC6, 0xEE, 0xFA, 0x77, 0x66, 0xE5, 0xD1, 0x0C,\n    0x92, 0xC8, 0xD8, 0xE9, 0x9B, 0xD6, 0x96, 0xB9, 0x93, 0x86, 0xB7, 0x40, 0x02, 0x7F, 0xD5, 0x5D,\n    0x63, 0x53, 0x59, 0xCF, 0xBB, 0xD1, 0xE9, 0x3D, 0xF1, 0x2C, 0xC0, 0xAE, 0xAD, 0xFC, 0x66, 0xC2,\n    0x0E, 0x13, 0x76, 0x2B, 0xA6, 0xB0, 0xDB, 0x31, 0x89, 0x7D, 0xFE, 0x79, 0xAA, 0x49, 0xB1, 0x9A,\n    0xC1, 0xF0, 0x39, 0x05, 0x08, 0x1C, 0x1F, 0xFC, 0xA8, 0xDC, 0x19, 0x3F, 0xDA, 0x26, 0x09, 0x11,\n    0x7D, 0xAD, 0x8D, 0x55, 0xC3, 0x53, 0x61, 0x17, 0x74, 0x21, 0x7B, 0x0E, 0xFC, 0xBF, 0xB5, 0x5B,\n    0xDC, 0x2B, 0x8F, 0x05, 0x40, 0x31, 0x05, 0xB9, 0xF5, 0x9E, 0x25, 0x3D, 0x92, 0x4E, 0xDD, 0x8B,\n    0x41, 0x63, 0xC1, 0x7A, 0x48, 0xCA, 0x8A, 0xE2, 0xA4, 0xFA, 0xB0, 0x81, 0x2F, 0x2A, 0x57, 0x8D,\n    0x18, 0xE3, 0x34, 0xCD, 0x3F, 0x16, 0x7D, 0x69, 0x4E, 0x27, 0x84, 0x62, 0xDD, 0x0C, 0x37, 0x81,\n    0x79, 0xB0, 0x79, 0x38, 0x46, 0xEF, 0x8B, 0xA7, 0x2A, 0xC1, 0xCA, 0x67, 0xB6, 0xF7, 0x8B, 0xB9,\n    0x77, 0x93, 0x8F, 0x55, 0x76, 0x10, 0x1C, 0x27, 0x92, 0x94, 0xCA, 0x67, 0xD1, 0xD4, 0xB8, 0x96,\n    0xEF, 0xD1, 0xD2, 0x32, 0xF4, 0xD7, 0x86, 0x9C, 0xBE, 0xBA, 0x8E, 0x05, 0xDA, 0x4B, 0x3D, 0x4A,\n    0x7E, 0x09, 0xE8, 0x0C, 0xE7, 0x53, 0xCB, 0x16, 0xA1, 0x9E, 0x56, 0xCD, 0xD8, 0x6C, 0x14, 0x4C,\n    0x19, 0x01, 0xEE, 0x5E, 0x03, 0x34, 0xB0, 0x3E, 0x30, 0x6E, 0x97, 0x75, 0x7F, 0x2B, 0xF2, 0xBA,\n    0xB1, 0x84, 0x76, 0x79, 0xC7, 0x6E, 0x46, 0x79, 0xC1, 0x3B, 0x2F, 0x18, 0x18, 0xDF, 0xBC, 0xAE,\n    0xFC, 0x1D, 0xE2, 0xB6, 0x77, 0x72, 0x5D, 0x04, 0x1E, 0x46, 0x20, 0xFF, 0x78, 0x9A, 0x64, 0xF9,\n    0xE8, 0x36, 0x19, 0x19, 0xBC, 0xF6, 0x54, 0x84, 0xAA, 0x8F, 0xB9, 0x7E, 0x06, 0x40, 0xF6, 0x96,\n    0x0A, 0xD9, 0x01, 0x1B, 0x6C, 0xCC, 0x0D, 0x63, 0x9C, 0x0A, 0x13, 0xF0, 0xC6, 0x16, 0x4D, 0xC2,\n    0x9F, 0xAF, 0x6B, 0x07, 0x96, 0x94, 0x69, 0x5A, 0x90, 0x43, 0x51, 0xAE, 0xD3, 0x90, 0x10, 0x66,\n    0xEE, 0x94, 0xA1, 0x6C, 0x42, 0x9F, 0x67, 0x1C, 0x85, 0x86, 0xBC, 0x81, 0xF7, 0x88, 0x30, 0xB8,\n    0xCA, 0x47, 0xA2, 0x08, 0xC1, 0x99, 0x9A, 0x86, 0x79, 0x51, 0x12, 0xCD, 0xE1, 0x69, 0xAE, 0xD2,\n    0x2C, 0xF8, 0x81, 0x92, 0x68, 0x3B, 0xDB, 0xDA, 0xFA, 0x98, 0x29, 0x84, 0x1C, 0xF0, 0xFD, 0xA1,\n    0xDA, 0x90, 0x6D, 0xB3, 0x78, 0xD2, 0x04, 0x1D, 0xD1, 0x9B, 0xBF, 0x0C, 0x15, 0x36, 0x9D, 0xC6,\n    0xB4, 0x4D, 0xB5, 0x93, 0xD9, 0xDF, 0xBC, 0x3A, 0x16, 0x2A, 0x07, 0x3C, 0xB0, 0x43, 0x95, 0x6E,\n    0x1E, 0x65, 0x09, 0x8D, 0x0D, 0x34, 0x45, 0x0E, 0xD9, 0x3E, 0x52, 0x69, 0x91, 0xC1, 0x90, 0xCA,\n    0x8E, 0x33, 0x02, 0xD3, 0x54, 0xB5, 0x61, 0xE8, 0xC6, 0x53, 0x01, 0x49, 0x4D, 0x0B, 0xAC, 0x3A,\n    0x95, 0x1B, 0x70, 0x43, 0x62, 0x6B, 0xD8, 0x37, 0x6C, 0xE7, 0xAE, 0x94, 0xE5, 0xE0, 0x1D, 0xE8,\n    0x1B, 0xC1, 0x52, 0x2A, 0x6B, 0x50, 0x32, 0xDE, 0xF7, 0xF8, 0xCE, 0x49, 0x3E, 0xE5, 0x74, 0x29,\n    0x33, 0x75, 0xF0, 0x63, 0x8A, 0x40, 0xE3, 0x13, 0x8F, 0xEB, 0x08, 0x24, 0xB2, 0x5A, 0x7A, 0xA9,\n    0xD0, 0x1F, 0xCE, 0x8A, 0x84, 0xBA, 0x8C, 0x4F, 0x10, 0x78, 0xAE, 0x64, 0xC3, 0xC3, 0x9A, 0x88,\n    0x59, 0xD2, 0xCD, 0x6E, 0xC2, 0xBC, 0x71, 0xEF, 0xDF, 0xAA, 0xD4, 0x52, 0xF9, 0x1B, 0xCC, 0x17,\n    0x51, 0x46, 0x7E, 0xB6, 0x0F, 0x77, 0x25, 0x3F, 0x23, 0x3B, 0xD9, 0xA7, 0x82, 0x6A, 0xB4, 0x12,\n    0x30, 0x96, 0x27, 0x47, 0x9D, 0x70, 0xD6, 0xE9, 0x86, 0xFA, 0xBD, 0x9D, 0x96, 0xE3, 0x30, 0x0C,\n    0x1E, 0xBD, 0xD9, 0xEA, 0x1E, 0x50, 0x18, 0x7F, 0x7E, 0xBE, 0xAE, 0x8E, 0x11, 0xEA, 0xDE, 0x17,\n    0x97, 0x9D, 0x60, 0x2B, 0xA2, 0x44, 0x1B, 0xCE, 0xC5, 0x3E, 0x68, 0x88, 0x1B, 0xDE, 0x0E, 0xFB,\n    0xD2, 0xDA, 0x30, 0x1E, 0x75, 0x70, 0x84, 0x19, 0xBD, 0x50, 0x8C, 0x9B, 0x46, 0x7F, 0xF4, 0x27,\n    0x19, 0xBF, 0x5C, 0xFC, 0xE3, 0xCF, 0x18, 0x9D, 0xD1, 0x32, 0x39, 0x28, 0x1E, 0xCD, 0x47, 0xD4,\n    0x38, 0xB1, 0xF8, 0x06, 0x4B, 0xC7, 0x45, 0x0B, 0x09, 0xA4, 0xE2, 0xF1, 0xC4, 0xA9, 0x00, 0xEA,\n    0x44, 0xF5, 0x75, 0xCA, 0x9F, 0xD1, 0x3F, 0xCE, 0x4D, 0xD0, 0x42, 0x79, 0x95, 0x76, 0xD9, 0x7C,\n    0xEF, 0x0A, 0xC6, 0x31, 0x82, 0xCC, 0xEA, 0x59, 0x4B, 0x43, 0xD5, 0xB6, 0x1D, 0x05, 0x5E, 0x59,\n    0xA7, 0x21, 0x45, 0x0D, 0x65, 0x57, 0x38, 0x76, 0x22, 0x39, 0x8A, 0x5D, 0xC8, 0x94, 0xE0, 0x51,\n    0x19, 0x68, 0x1E, 0x58, 0x5F, 0xB0, 0xBA, 0xC3, 0x55, 0xB4, 0x86, 0x18, 0x24, 0xDE, 0x2C, 0x8E,\n    0xE2, 0xB6, 0x67, 0x04, 0xD0, 0x3B, 0x84, 0x22, 0x50, 0xDB, 0x04, 0x1E, 0xE0, 0x17, 0x5F, 0xF0,\n    0xC7, 0xFE, 0x02, 0x17, 0xD0, 0x0C, 0x9D, 0x49, 0x00, 0x54, 0x79, 0xA0, 0xD0, 0x9B, 0xBF, 0xC2,\n    0xCE, 0x5E, 0xCC, 0xDE, 0x65, 0xF4, 0x62, 0x72, 0x7D, 0x33, 0x08, 0xF9, 0x26, 0x22, 0x84, 0xEE,\n    0xC8, 0x35, 0xD7, 0x42, 0x31, 0x8F, 0x5C, 0x23, 0xAA, 0x37, 0xC1, 0x79, 0xB0, 0xAD, 0x1E, 0x3A,\n    0xE3, 0x1C, 0x16, 0x49, 0x4D, 0xEA, 0xB0, 0x0A, 0x06, 0xD3, 0x56, 0x33, 0xD6, 0xDE, 0x3E, 0xF3,\n    0x64, 0xE2, 0xB6, 0xF2, 0xAC, 0xA5, 0x41, 0xDD, 0x8E, 0xDA, 0x3E, 0x56, 0x91, 0x66, 0x1B, 0x80,\n    0xC3, 0x2D, 0xAB, 0x84, 0xC6, 0xBF, 0xDD, 0x10, 0x36, 0x21, 0x65, 0xE5, 0xBE, 0x2B, 0x54, 0xCC,\n    0x6F, 0xE0, 0x70, 0xE5, 0x7A, 0x73, 0xC7, 0xF9, 0x8F, 0xB2, 0xEC, 0x1E, 0xD6, 0x5E, 0x55, 0x74,\n    0xC5, 0x19, 0x9D, 0x40, 0x13, 0x7C, 0xD4, 0x85, 0x10, 0xD5, 0x1D, 0x8C, 0x8F, 0x27, 0x68, 0xBC,\n    0x76, 0x9E, 0x14, 0xFF, 0x5D, 0xEA, 0x8B, 0xCB, 0x16, 0xBE, 0x4F, 0xFB, 0x02, 0xAC, 0x97, 0x0F,\n    0x3E, 0xBD, 0xD0, 0x1A, 0xCB, 0x93, 0xD8, 0x98, 0xBD, 0x15, 0x26, 0x91, 0xB9, 0xD0, 0xC6, 0x8D,\n    0x6B, 0x91, 0x82, 0x4A, 0x10, 0x77, 0xFA, 0x04, 0x60, 0xCC, 0xEB, 0x76, 0x15, 0x5D, 0x96, 0xE6,\n    0x16, 0x19, 0x73, 0xD2, 0xB9, 0xDD, 0x25, 0xF7, 0xFB, 0xFD, 0x7A, 0xEC, 0x1D, 0xA4, 0x5D, 0x3E,\n    0xAE, 0xBA, 0xEB, 0x84, 0x1D, 0x73, 0xD4, 0xE4, 0xB5, 0xBC, 0x0D, 0x79, 0xC5, 0xF6, 0xA3, 0xE9,\n    0x02, 0x64, 0x96, 0x65, 0x7A, 0x23, 0xDE, 0xFD, 0xEE, 0x22, 0x24, 0xFD, 0x1A, 0x39, 0x37, 0xD0,\n    0x51, 0xEB, 0x35, 0x3D, 0x30, 0x90, 0xE4, 0x70, 0x6A, 0x58, 0xB7, 0x9A, 0xE6, 0xB0, 0xAE, 0x7C,\n    0x64, 0x61, 0x42, 0x74, 0x0C, 0xF3, 0x9D, 0xCC, 0x40, 0x92, 0x23, 0xC1, 0x25, 0x2E, 0x07, 0x0E,\n    0x76, 0x0C, 0x4C, 0x3C, 0xA4, 0x2A, 0xE7, 0x1A, 0x91, 0xDE, 0x15, 0xF0, 0xF4, 0x08, 0x95, 0x77,\n    0x58, 0x4B, 0xF2, 0x45, 0xBE, 0x7C, 0xE4, 0x51, 0x57, 0x24, 0x92, 0x8D, 0x5F, 0x50, 0xA6, 0x77,\n    0xFA, 0x9E, 0xB4, 0xA2, 0xF9, 0xBA, 0x31, 0x37, 0xD8, 0x2D, 0xAF, 0xCB, 0x47, 0x98, 0xB3, 0x68,\n    0xA0, 0xB7, 0xCA, 0x2F, 0x79, 0xBA, 0xB7, 0x8D, 0x53, 0xB3, 0xAB, 0xDC, 0x4E, 0x47, 0x2F, 0x35,\n    0x4B, 0xC7, 0xAA, 0x64, 0x49, 0x9B, 0xB2, 0x92, 0x85, 0x43, 0x10, 0xE6, 0x84, 0x8B, 0xF5, 0xAE,\n    0x77, 0x28, 0x30, 0x46, 0xF4, 0xFC, 0xEE, 0x46, 0x78, 0x71, 0xE1, 0xDA, 0xAA, 0x33, 0x23, 0x98,\n    0x5E, 0xF0, 0xA5, 0x41, 0x75, 0x4B, 0xC9, 0xBD, 0x4B, 0x91, 0x38, 0xEF, 0x5B, 0x5D, 0x29, 0x9F,\n    0xAE, 0x95, 0x5F, 0xDB, 0x60, 0xDD, 0xB9, 0xBE, 0x4D, 0x7D, 0xA0, 0xA4, 0xAC, 0x9F, 0x65, 0x6A,\n    0xFA, 0x81, 0x01, 0xCF, 0x8F, 0xE2, 0x2C, 0x27, 0x64, 0x3A, 0x4D, 0x23, 0xC7, 0x7B, 0x4F, 0xCF,\n    0xA1, 0xDC, 0x0E, 0x21, 0x82, 0x2B, 0xD8, 0x51, 0x8B, 0x35, 0x81, 0x87, 0x9F, 0xFD, 0x05, 0xC5,\n    0x17, 0xAF, 0x99, 0x3D, 0x2B, 0x28, 0x2D, 0x82, 0x3A, 0x13, 0x68, 0x31, 0x21, 0x66, 0x53, 0xDB,\n    0x07, 0x45, 0xBD, 0x24, 0x52, 0xAA, 0xC6, 0xD4, 0x70, 0x24, 0xB1, 0x67, 0x9A, 0x94, 0xEA, 0xF0,\n    0x6B, 0x67, 0x99, 0xDD, 0x4F, 0x11, 0x73, 0xD2, 0x04, 0xBE, 0xB5, 0x77, 0xFB, 0xA2, 0x31, 0xCC,\n    0xD4, 0x1E, 0x91, 0x02, 0xD2, 0x62, 0xF6, 0xB1, 0x32, 0x36, 0x12, 0xF8, 0x4D, 0x1D, 0x47, 0x10,\n    0xA8, 0x65, 0x34, 0x71, 0x48, 0x9E, 0x22, 0x2B, 0xA2, 0x4F, 0xF9, 0x2B, 0xEB, 0x0F, 0x31, 0x80,\n    0x7E, 0xCA, 0x4A, 0xCF, 0x37, 0x08, 0x21, 0x1D, 0xBA, 0xD9, 0x32, 0x14, 0x3E, 0xEF, 0x6C, 0xFE,\n    0xB7, 0xA3, 0x56, 0x07, 0x62, 0x50, 0xA5, 0x23, 0xB4, 0x45, 0x9C, 0x51, 0xDF, 0xEB, 0x93, 0x1D,\n    0x4E, 0xFF, 0x29, 0xB2, 0x50, 0xF0, 0x2A, 0xEF, 0xEE, 0x73, 0x9B, 0x51, 0x69, 0x34, 0xAE, 0xF7,\n    0x4A, 0x4C, 0x06, 0x9D, 0x20, 0xC7, 0x12, 0x3F, 0x31, 0xBB, 0xBC, 0xD3, 0x27, 0xA9, 0x89, 0xC7,\n    0x42, 0x1F, 0x2E, 0x60, 0xEC, 0x29, 0x0D, 0x11, 0x88, 0xFC, 0xB4, 0x31, 0x08, 0xDD, 0x69, 0x15,\n    0xF1, 0x64, 0x25, 0x52, 0x46, 0x07, 0xAE, 0x35, 0xAA, 0x46, 0x89, 0x3A, 0xEA, 0x7F, 0xDC, 0x69,\n    0x9F, 0xD6, 0xF1, 0x3C, 0xDC, 0x6D, 0x00, 0x09, 0x95, 0x9D, 0x72, 0x50, 0xE7, 0xD7, 0xAC, 0x7D,\n    0x3D, 0xFD, 0x1D, 0x06, 0x38, 0xAD, 0xD7, 0x7A, 0xEC, 0x06, 0x0F, 0x2F, 0x3F, 0x4F, 0xD2, 0xC2,\n    0xAA, 0x30, 0x92, 0x18, 0x93, 0xE0, 0x65, 0xD9, 0xD8, 0x01, 0x48, 0xFD, 0xC1, 0xA3, 0xE4, 0xBD,\n    0x21, 0x05, 0x45, 0xA0, 0xCD, 0xDC, 0x87, 0x29, 0x6E, 0xE1, 0x77, 0x98, 0x4D, 0x09, 0x79, 0xB2,\n    0x62, 0x51, 0x73, 0x7B, 0x61, 0x14, 0x1D, 0x41, 0xA0, 0x92, 0xB9, 0x6E, 0x32, 0xA7, 0xD1, 0x68,\n    0xFB, 0x6D, 0x4C, 0x88, 0x3D, 0x7A, 0x54, 0x85, 0x49, 0x7C, 0x24, 0xD9, 0xFF, 0xC7, 0x07, 0x9C,\n    0xEF, 0xF6, 0x16, 0x6A, 0xB6, 0x1B, 0xB4, 0x23, 0x71, 0x40, 0x3B, 0x0F, 0xE6, 0xC6, 0x35, 0x6E,\n    0x3B, 0xC7, 0x8F, 0xCE, 0x08, 0xFF, 0x6A, 0x94, 0xCB, 0xB9, 0xA5, 0x21, 0x30, 0xAC, 0xE1, 0xE6,\n    0xB1, 0xDB, 0x31, 0x84, 0xB3, 0x5A, 0x41, 0x9F, 0x10, 0x21, 0x68, 0xCF, 0xED, 0x6B, 0xB4, 0xCF,\n    0xAB, 0x6E, 0xA2, 0x05, 0xF1, 0xF1, 0xEC, 0xE8, 0x29, 0xF4, 0xD9, 0x95, 0x61, 0xC2, 0x2A, 0xCC,\n    0xFE, 0x9B, 0x8D, 0x5B, 0x94, 0x60, 0x96, 0x51, 0x02, 0x3D, 0xB4, 0x0F, 0xC6, 0x51, 0x05, 0x7F,\n    0xFB, 0x4E, 0x4D, 0x21, 0x38, 0xBF, 0xDD, 0x2E, 0x2A, 0xB0, 0x85, 0xC8, 0x16, 0xB9, 0x78, 0xAB,\n    0xE1, 0xA0, 0x54, 0x0E, 0x19, 0x86, 0xCD, 0x39, 0xBF, 0x73, 0x38, 0xFF, 0xD3, 0x2F, 0xF9, 0xEB,\n    0x21, 0xB7, 0x9F, 0x96, 0x8C, 0x15, 0x44, 0x06, 0xEE, 0x04, 0x04, 0xAD, 0x3C, 0xCA, 0x2D, 0xB6,\n    0xAF, 0x8F, 0x6B, 0x11, 0xE4, 0x12, 0x46, 0x2A, 0x4A, 0x9B, 0x2F, 0x8F, 0x66, 0xEB, 0x2B, 0xA1,\n    0xF7, 0x65, 0x92, 0x14, 0x78, 0xF9, 0xA4, 0x5A, 0x8A, 0x33, 0x92, 0x87, 0x75, 0x9F, 0x0A, 0x27,\n    0x53, 0xC8, 0xB1, 0xD5, 0xAB, 0xA2, 0x56, 0xB7, 0x8D, 0xA4, 0xA7, 0x2F, 0x95, 0xA8, 0xC5, 0xC6,\n    0xB0, 0xBE, 0xAF, 0x68, 0x99, 0x2D, 0x86, 0x01, 0x31, 0x6A, 0x7A, 0xE3, 0xDD, 0x87, 0x03, 0x31,\n    0x57, 0x33, 0x31, 0x49, 0x12, 0x90, 0xEB, 0x1A, 0x3C, 0x67, 0x2C, 0x60, 0xB8, 0xC4, 0x2C, 0x6A,\n    0xD2, 0x1C, 0xF5, 0x0E, 0x2E, 0x71, 0x1A, 0x14, 0x25, 0xE0, 0xAA, 0xE2, 0xD7, 0xB7, 0x9D, 0xCE,\n    0xDA, 0x12, 0x0C, 0x9D, 0x85, 0x37, 0x0E, 0xF3, 0x8B, 0x9D, 0xBF, 0xE7, 0xFB, 0xAC, 0x5D, 0x3D,\n    0x00, 0x72, 0x4C, 0xB9, 0xEE, 0x7B, 0xF7, 0xA6, 0xC9, 0xD4, 0xE6, 0x27, 0x24, 0x31, 0xD0, 0x56,\n    0x58, 0x4B, 0x00, 0x02, 0xA0, 0x2A, 0xDA, 0xBB, 0x23, 0x43, 0x87, 0x8F, 0xC0, 0xB4, 0x87, 0x6F,\n    0xD4, 0xF8, 0x0F, 0x38, 0x6E, 0x82, 0xFC, 0xE2, 0x1E, 0xD5, 0x96, 0x05, 0xD1, 0x1A, 0x95, 0x1B,\n    0xE6, 0xC1, 0xF0, 0xA1, 0x8A, 0x0F, 0xF0, 0xD4, 0x2D, 0x03, 0x5D, 0x2F, 0xCD, 0xF4, 0x0A, 0xFF,\n    0xBB, 0xD2, 0x79, 0x06, 0xAA, 0x65, 0xF1, 0x4D, 0x8E, 0x6E, 0x24, 0x08, 0x6D, 0xA5, 0x66, 0x84,\n    0x28, 0x25, 0xE2, 0xC1, 0xA8, 0xFB, 0x6F, 0x2E, 0x99, 0xC1, 0xA8, 0x99, 0x16, 0xF8, 0xCD, 0x5F,\n    0xF5, 0x41, 0xFB, 0xD1, 0xC7, 0xA6, 0xF4, 0x2F, 0x4A, 0xAE, 0x36, 0xF8, 0x9D, 0x23, 0x62, 0x5C,\n    0x3C, 0x62, 0xD4, 0xF5, 0x52, 0x46, 0xDE, 0x28, 0xB5, 0x7D, 0xFD, 0x25, 0xB4, 0x51, 0x70, 0xB3,\n    0x5D, 0x56, 0x92, 0x51, 0x8C, 0x4B, 0x69, 0xE8, 0x34, 0x66, 0x41, 0x4E, 0x22, 0x72, 0x82, 0x1A,\n    0xEB, 0xDE, 0x59, 0x5B, 0x3C, 0x0E, 0x66, 0x7F, 0xB6, 0xC8, 0x07, 0x2F, 0x82, 0x89, 0xDA, 0xC4,\n    0x8E, 0xC4, 0x70, 0xA1, 0xEA, 0xD3, 0xA9, 0x28, 0xFE, 0x9B, 0xCA, 0xE8, 0x89, 0xD1, 0xE0, 0xC6,\n    0x36, 0x91, 0x09, 0x98, 0x4F, 0x28, 0x9B, 0x10, 0x4B, 0x89, 0xDB, 0xC4, 0xCA, 0x60, 0x57, 0xA0,\n    0x0F, 0x04, 0x3F, 0x1B, 0x75, 0xAE, 0x5A, 0x9F, 0x0A, 0xFB, 0xCC, 0x6F, 0x46, 0xE8, 0xC1, 0xB0,\n    0x98, 0x1D, 0x6B, 0xC3, 0x3C, 0xEA, 0x83, 0x5E, 0xBF, 0x21, 0x5E, 0x28, 0x3C, 0x8E, 0xF4, 0x6B,\n    0xAA, 0x3F, 0x0E, 0xBC, 0xB5, 0xAD, 0x65, 0xEF, 0xA3, 0xB1, 0x73, 0x3C, 0x55, 0x52, 0xB6, 0xBC,\n    0x5E, 0xA4, 0xC6, 0x27, 0x88, 0xEB, 0x34, 0xB1, 0x61, 0x5F, 0x03, 0x20, 0x66, 0x95, 0x9B, 0xC6,\n    0x94, 0xC1, 0x65, 0xAA, 0x8E, 0x4E, 0x41, 0xB4, 0xB2, 0x45, 0x04, 0x42, 0xA0, 0xC3, 0xB1, 0xD2,\n    0x46, 0x0A, 0xFE, 0x4A, 0xDD, 0xC3, 0xC0, 0x01, 0x6A, 0x3F, 0xAF, 0xF5, 0xDE, 0x92, 0xC3, 0xF0,\n    0xEC, 0xDF, 0x69, 0xEC, 0x25, 0x1F, 0x43, 0x4E, 0x87, 0x80, 0xF9, 0xD7, 0x54, 0x92, 0x8E, 0x02,\n    0xCC, 0xF0, 0x46, 0x79, 0x9C, 0x2A, 0x5F, 0xCF, 0x24, 0x3F, 0x7F, 0xD3, 0x2F, 0xBE, 0x71, 0x51,\n    0xCD, 0xAC, 0x73, 0xD5, 0x60, 0x44, 0x7E, 0x96, 0xE6, 0x5F, 0xFD, 0x08, 0x46, 0x17, 0x10, 0x3A,\n    0x71, 0xF6, 0x8E, 0xAF, 0x6E, 0xFC, 0x4E, 0x05, 0xD1, 0x43, 0xC0, 0xF1, 0x77, 0xEE, 0x02, 0x94,\n    0x8D, 0x84, 0x32, 0xB5, 0x7E, 0x40, 0x3F, 0xF9, 0x74, 0xF1, 0x5B, 0xCC, 0xDA, 0xB5, 0x48, 0xEC,\n    0x5A, 0xEC, 0xC0, 0x1D, 0x50, 0x9D, 0x86, 0x6F, 0xBF, 0x42, 0xAE, 0xEE, 0x93, 0x46, 0xEF, 0xEC,\n    0x0F, 0xFE, 0x13, 0x37, 0x7D, 0xD3, 0xF4, 0xAF, 0x7F, 0x6F, 0x62, 0x61, 0xA3, 0x1A, 0xD1, 0xEF,\n    0x8D, 0xCF, 0x9E, 0xE3, 0x46, 0x8A, 0x9F, 0x35, 0x3A, 0xB4, 0xBC, 0xA7, 0x9F, 0x3F, 0x90, 0x16,\n    0x66, 0xBB, 0x6B, 0x5B, 0x47, 0xF9, 0xD5, 0x80, 0x53, 0x26, 0x69, 0x0F, 0x0E, 0x5D, 0xAD, 0x3E,\n    0x42, 0x75, 0xD1, 0x65, 0x62, 0xDD, 0xBB, 0xBB, 0x0F, 0x2B, 0x11, 0xCC, 0xEE, 0x1D, 0x47, 0x2E,\n    0xD7, 0x83, 0x71, 0xCE, 0x24, 0x1C, 0xA4, 0xC3, 0xA1, 0x0C, 0x9F, 0x99, 0x51, 0x59, 0x39, 0x8F,\n    0x24, 0xDA, 0x16, 0xA1, 0x1A, 0xE3, 0x69, 0x07, 0x27, 0x5B, 0xAA, 0xA7, 0x24, 0xA2, 0xEB, 0x2B,\n    0x49, 0x29, 0x21, 0xA0, 0xA3, 0xC9, 0x0D, 0xC7, 0xB5, 0x0D, 0xDF, 0xA3, 0xED, 0xD8, 0x37, 0x97,\n    0x47, 0x56, 0xAB, 0x6E, 0x8C, 0x64, 0xE3, 0xDC, 0x2F, 0x1C, 0x0F, 0x44, 0x71, 0x23, 0xF7, 0x59,\n    0x26, 0xAB, 0xDA, 0x8C, 0x7D, 0x5A, 0x80, 0x15, 0x2D, 0xA0, 0x92, 0x5C, 0x6A, 0x8F, 0x07, 0x88,\n    0x14, 0xED, 0xAE, 0x56, 0x35, 0xF4, 0x3E, 0xBF, 0x69, 0x84, 0xE0, 0xAE, 0x60, 0xB9, 0xF6, 0x8A,\n    0x2B, 0x53, 0x22, 0xCE, 0x1C, 0x95, 0x85, 0xBC, 0xEC, 0xE4, 0xE3, 0xE2, 0x96, 0xC0, 0xCF, 0xA5,\n    0x5D, 0x25, 0x0C, 0x85, 0x51, 0x2A, 0xC5, 0x38, 0x25, 0x97, 0xDC, 0x7C, 0x14, 0x39, 0x1F, 0xB4,\n    0x3C, 0xBF, 0x65, 0x0F, 0x41, 0xD1, 0xE5, 0x81, 0xCA, 0xF3, 0xB7, 0x1C, 0xC5, 0xC4, 0xC0, 0xB8,\n    0xBB, 0xCE, 0x39, 0x7C, 0x2E, 0x1F, 0x27, 0xAD, 0x16, 0x8A, 0x69, 0x69, 0x1D, 0x3B, 0x89, 0x4E,\n    0xC3, 0x28, 0x1C, 0x1B, 0x47, 0x98, 0xA3, 0xDB, 0xC9, 0x69, 0x6E, 0x11, 0xD6, 0xA0, 0x08, 0x74,\n    0x8B, 0x37, 0x4B, 0x66, 0x7A, 0x12, 0x70, 0x35, 0x84, 0x38, 0x27, 0x8F, 0xAC, 0xC9, 0xFF, 0xFC,\n    0xC2, 0x1A, 0x0F, 0x58, 0x8E, 0x7E, 0xF1, 0xCD, 0x73, 0x74, 0x09, 0x57, 0x24, 0xBC, 0xA3, 0x0B,\n    0xBD, 0x6D, 0x8E, 0x63, 0x09, 0x15, 0xBD, 0x7F, 0x09, 0xDA, 0xE1, 0x06, 0x34, 0x0B, 0x74, 0xB8,\n    0xB8, 0x9D, 0x8A, 0xFA, 0x4E, 0x1E, 0xF4, 0x6A, 0x8C, 0x4C, 0xD6, 0x34, 0x3F, 0x82, 0xD2, 0x84,\n    0xD5, 0xDA, 0x2D, 0xDB, 0xCD, 0x9F, 0x2A, 0x1D, 0xE8, 0x24, 0x43, 0xEC, 0x94, 0xCF, 0x51, 0xBF,\n    0x48, 0x50, 0xC5, 0x71, 0x73, 0x78, 0x35, 0xD9, 0x98, 0x1E, 0xCF, 0x96, 0x02, 0x74, 0x29, 0xE9,\n    0x30, 0x02, 0x5B, 0xEC, 0x66, 0xD8, 0xD0, 0xB6, 0x4D, 0x33, 0x3F, 0x2A, 0xF4, 0x2A, 0xC6, 0xAD,\n    0x82, 0x9A, 0x1D, 0x62, 0xE2, 0xDA, 0x05, 0xE7, 0x8C, 0x69, 0xCB, 0xB4, 0xB8, 0xD9, 0xEB, 0x7D,\n    0x49, 0xD6, 0x5E, 0xDD, 0xA5, 0x85, 0xB5, 0x3F, 0x08, 0xEB, 0x33, 0xA6, 0x2D, 0x68, 0x17, 0xF2,\n    0x20, 0x3D, 0xEC, 0xAC, 0x71, 0x8C, 0x51, 0x7A, 0x20, 0x05, 0x63, 0xF3, 0x7A, 0x98, 0x4A, 0x26,\n    0x2E, 0xEC, 0xD1, 0x9B, 0x50, 0x7D, 0xEB, 0x37, 0xD3, 0xD9, 0x21, 0x6B, 0x97, 0x06, 0x9F, 0x10,\n    0x0A, 0x8B, 0x56, 0x6D, 0x7B, 0x78, 0x9D, 0xF6, 0x89, 0x8B, 0xDF, 0x7B, 0x21, 0xF0, 0x55, 0x85,\n    0xF8, 0x23, 0xAB, 0xEA, 0x5A, 0xF8, 0x0C, 0xB8, 0xB9, 0x13, 0xDA, 0xCC, 0x0A, 0x35, 0x21, 0xAF,\n    0x78, 0x87, 0x33, 0x78, 0x89, 0x39, 0x1E, 0x15, 0xD7, 0x14, 0x49, 0xC9, 0x14, 0x60, 0x39, 0xAC,\n    0x4C, 0x76, 0x64, 0xD7, 0xCF, 0x8A, 0x4A, 0xDA, 0xF7, 0x20, 0xCD, 0x46, 0xB4, 0x3B, 0x20, 0x60,\n    0x43, 0x6B, 0x52, 0xD9, 0x20, 0x10, 0x8A, 0xF9, 0xF7, 0x34, 0xDA, 0x5E, 0xCF, 0xD1, 0xCC, 0x60,\n    0x31, 0xF8, 0xE5, 0x5C, 0xF5, 0xC8, 0xCB, 0x3C, 0xF6, 0x63, 0xD4, 0x26, 0xA1, 0x41, 0x71, 0xCD,\n    0x73, 0x97, 0xBF, 0x27, 0x2A, 0x2C, 0x0C, 0x75, 0x6D, 0x4A, 0xA0, 0x8A, 0x0D, 0x02, 0x53, 0xBA,\n    0x72, 0xA3, 0xE0, 0xE6, 0x1A, 0x85, 0xC5, 0xD7, 0xF1, 0x49, 0x4F, 0x24, 0x16, 0x35, 0x3F, 0x0C,\n    0x2B, 0xCE, 0x9C, 0x35, 0x0F, 0x23, 0xA3, 0x7C, 0xCE, 0xC8, 0xED, 0x34, 0x2C, 0xCC, 0x33, 0x0A,\n    0x73, 0xA3, 0x58, 0x53, 0x78, 0x55, 0xD1, 0xC2, 0x08, 0xCA, 0x03, 0xBE, 0x6E, 0x1D, 0x9C, 0xD2,\n    0x67, 0x71, 0x4D, 0x77, 0x9A, 0x63, 0xA1, 0x7C, 0x31, 0x11, 0x3D, 0xDE, 0xE0, 0xDC, 0x0D, 0x06,\n    0xDD, 0xAF, 0x16, 0x65, 0xF6, 0xF0, 0x27, 0x28, 0x9A, 0xBA, 0xED, 0xE2, 0xC2, 0x27, 0x2B, 0x74,\n    0x2D, 0xF8, 0x6E, 0xE1, 0x0C, 0xB2, 0xC7, 0xBF, 0xD3, 0x0A, 0x94, 0x0E, 0x3A, 0xE1, 0x04, 0x34,\n    0x97, 0xA7, 0x7E, 0x01, 0xA0, 0x31, 0x89, 0x86, 0x05, 0x28, 0x84, 0x0C, 0x3E, 0xB5, 0x22, 0x26,\n    0x6E, 0x52, 0xFD, 0x3B, 0x39, 0x5B, 0xB7, 0xEC, 0x49, 0x50, 0x21, 0xA6, 0x58, 0x20, 0x50, 0x11,\n    0x5D, 0x9E, 0xFF, 0xF5, 0x93, 0x74, 0x39, 0x24, 0xBD, 0xBA, 0x5A, 0xB5, 0x4E, 0x35, 0xEB, 0x13,\n    0x31, 0x04, 0x3D, 0xAD, 0xBE, 0xBB, 0x43, 0x24, 0xC1, 0x8F, 0x2A, 0x43, 0x6D, 0x85, 0x6C, 0x8E,\n    0x78, 0x6A, 0x7F, 0xE3, 0x5C, 0xE4, 0xC1, 0x4A, 0x68, 0x46, 0xC4, 0xA4, 0xEB, 0x8A, 0xB0, 0xFB,\n    0x02, 0xE9, 0x76, 0x49, 0x0C, 0x90, 0x3F, 0x4F, 0x79, 0x39, 0xA9, 0x93, 0x61, 0x66, 0x4F, 0x60,\n    0x8A, 0x5C, 0x91, 0xCC, 0x2D, 0x2D, 0x43, 0xCD, 0x38, 0xE7, 0x6B, 0xE1, 0xA5, 0xA9, 0x53, 0xC9,\n    0x0E, 0xBB, 0x36, 0x10, 0x2C, 0xDF, 0x2E, 0xB5, 0xD1, 0x81, 0xCC, 0x4F, 0xAF, 0x77, 0x21, 0xFC,\n    0xA8, 0xFB, 0x78, 0x3D, 0xF0, 0x16, 0x76, 0xCF, 0x97, 0x67, 0xE8, 0x2B, 0x29, 0x00, 0x93, 0xAF,\n    0x60, 0x66, 0x38, 0x0C, 0x4A, 0xED, 0xAA, 0xA7, 0x89, 0x3F, 0xE8, 0x40, 0x9D, 0x02, 0xA7, 0xB7,\n    0x95, 0x51, 0xBE, 0x57, 0x45, 0xC5, 0x7E, 0x1E, 0xAD, 0x09, 0x6C, 0xD9, 0x81, 0x56, 0xA2, 0x92,\n    0x72, 0x17, 0xD2, 0x86, 0x62, 0x7A, 0x62, 0x0A, 0xAE, 0xEC, 0x0D, 0x27, 0x35, 0x40, 0xFA, 0xAE,\n    0x78, 0xEA, 0x70, 0xD4, 0xF0, 0xDA, 0xCD, 0x87, 0xF5, 0x9D, 0x5F, 0x83, 0xCB, 0x3B, 0x07, 0x52,\n    0xD0, 0xA2, 0xB4, 0x22, 0x8E, 0xDF, 0xAA, 0xF6, 0xAB, 0x31, 0x91, 0x90, 0xBE, 0x21, 0xF9, 0x7D,\n    0x87, 0x23, 0x1C, 0x59, 0x00, 0x05, 0xF5, 0x4F, 0x9B, 0xBB, 0x6D, 0x50, 0x7E, 0x56, 0x6B, 0x3E,\n    0xAE, 0x9B, 0x6F, 0xAB, 0x88, 0xEC, 0xAE, 0x0F, 0x6C, 0x89, 0xAB, 0x26, 0x6B, 0x5A, 0xD9, 0x6D,\n    0xF1, 0x23, 0x9E, 0xB3, 0xEB, 0x97, 0x08, 0xF0, 0x0E, 0x5C, 0x80, 0x00, 0xCD, 0x7A, 0x4F, 0x64,\n    0xF9, 0x1A, 0x80, 0x0D, 0xFA, 0x3D, 0x42, 0x71, 0x39, 0x83, 0x15, 0x8A, 0xFF, 0x91, 0x9F, 0x80,\n    0x0F, 0x67, 0xAA, 0xBB, 0xB0, 0x67, 0x45, 0x30, 0xDD, 0x86, 0x8C, 0x1D, 0xF7, 0x7A, 0xB3, 0x28,\n    0xA1, 0xD6, 0x56, 0x63, 0xD2, 0x75, 0x10, 0xF0, 0x77, 0x53, 0x1A, 0x95, 0x9A, 0x49, 0xD7, 0x3E,\n    0xAA, 0x24, 0x92, 0x02, 0x92, 0xF5, 0x7D, 0x2F, 0x8F, 0x24, 0x36, 0x11, 0x59, 0xCF, 0x62, 0xA6,\n    0x69, 0xCD, 0xB5, 0x66, 0x75, 0x20, 0x16, 0x41, 0xC1, 0x4F, 0xE5, 0x81, 0xC4, 0xC2, 0x91, 0x69,\n    0xC0, 0xF1, 0xA3, 0x01, 0x6B, 0xA9, 0x0F, 0x55, 0x2D, 0x29, 0xD7, 0x1D, 0xDD, 0x7D, 0x9E, 0xCF,\n    0xF5, 0x05, 0xFA, 0x7C, 0x1F, 0x8B, 0xC9, 0xCA, 0x34, 0x66, 0xEF, 0x3C, 0x24, 0x9A, 0xAE, 0xCF,\n    0xCB, 0x12, 0xB1, 0xE5, 0x59, 0xD9, 0x30, 0x90, 0xB3, 0xA7, 0xE9, 0x38, 0x9A, 0x73, 0x1C, 0xDE,\n    0xBE, 0x62, 0x77, 0x5E, 0x75, 0xBF, 0x37, 0x39, 0x27, 0xBA, 0x91, 0xEB, 0xED, 0xAB, 0xB5, 0xCE,\n    0x8E, 0x6E, 0xBD, 0xD4, 0x64, 0x64, 0x47, 0x16, 0x14, 0x98, 0xC6, 0xF0, 0xB6, 0x4A, 0xE8, 0xB7,\n    0x67, 0x86, 0xC5, 0xCB, 0xCE, 0xB1, 0x7B, 0xC0, 0xDE, 0x87, 0xF7, 0x8E, 0xE7, 0x21, 0x3A, 0x86,\n    0xB5, 0x9C, 0x38, 0xBA, 0x60, 0x98, 0xFA, 0x93, 0xBA, 0x63, 0xE3, 0x0F, 0x74, 0xB1, 0x6B, 0x39,\n    0x68, 0xB6, 0x53, 0xB1, 0x8A, 0xBB, 0x76, 0x65, 0x74, 0x1D, 0x99, 0xBA, 0x01, 0x8A, 0xE3, 0x7C,\n    0xC0, 0x73, 0x2A, 0x98, 0x13, 0x0E, 0x22, 0xB4, 0xF6, 0xC4, 0xF9, 0x89, 0xAF, 0x9B, 0x52, 0x6F,\n    0x28, 0xEC, 0x8E, 0x13, 0xC4, 0xD4, 0x97, 0x74, 0x2E, 0xDB, 0x6F, 0xA8, 0x41, 0xE3, 0xDC, 0x6A,\n    0xE4, 0xB8, 0x18, 0x2C, 0x19, 0x59, 0xE1, 0x45, 0xC5, 0xED, 0x8F, 0xCA, 0x24, 0x2A, 0x3F, 0xAD,\n    0xDA, 0x98, 0xC1, 0x70, 0x7F, 0xF3, 0x87, 0xE1, 0xB8, 0xBC, 0xF5, 0xFB, 0x29, 0x7B, 0x12, 0x26,\n    0x22, 0x1A, 0x5B, 0x59, 0x21, 0x21, 0x79, 0x30, 0xA7, 0x69, 0x13, 0xD9, 0x9E, 0x62, 0x02, 0x77,\n    0x84, 0xB9, 0x87, 0xD3, 0xCB, 0x0E, 0xB0, 0x73, 0x58, 0x21, 0xFE, 0x18, 0x6A, 0x92, 0x94, 0x30,\n    0xEC, 0x06, 0x11, 0xB9, 0xC8, 0x99, 0x6B, 0xE9, 0xFE, 0x44, 0x9D, 0x04, 0xBA, 0xC9, 0x92, 0x7E,\n    0x46, 0x7B, 0x81, 0x4A, 0x70, 0x79, 0x56, 0x7F, 0x39, 0x96, 0x58, 0xC6, 0x35, 0x8A, 0x8F, 0x98,\n    0x47, 0xF8, 0xD9, 0x16, 0x81, 0xC1, 0x79, 0x43, 0x08, 0xF9, 0x4A, 0xC7, 0xBA, 0x31, 0xCA, 0xC3,\n    0x0D, 0xEA, 0x71, 0x40, 0x42, 0x2E, 0x29, 0xF2, 0xB1, 0x96, 0xFB, 0xC0, 0x98, 0x3B, 0x2F, 0xB2,\n    0x8D, 0x82, 0xBA, 0xB0, 0x8D, 0x3D, 0x78, 0x10, 0xF2, 0x33, 0x55, 0xD2, 0x02, 0x98, 0x3A, 0xF3,\n    0x43, 0x8F, 0x8D, 0x27, 0xD0, 0x1B, 0x50, 0x04, 0xB2, 0xA8, 0x42, 0x36, 0xE7, 0xD9, 0x2B, 0x4A,\n    0x33, 0x9E, 0xBF, 0x46, 0x12, 0x17, 0x82, 0x89, 0xEA, 0xAA, 0x35, 0x7F, 0x3C, 0x6B, 0xEC, 0xC2,\n    0x84, 0x33, 0xAB, 0x10, 0x25, 0x59, 0x0F, 0x2B, 0x90, 0x3F, 0xF4, 0x2A, 0x97, 0x6F, 0xD5, 0x6C,\n    0xE3, 0x08, 0x07, 0xA9, 0xFC, 0x84, 0x7B, 0x51, 0x2F, 0x23, 0x2A, 0x6E, 0xF1, 0x0F, 0xEF, 0x48,\n    0x9F, 0x66, 0x8F, 0x5C, 0x9A, 0x21, 0x84, 0xD7, 0xB1, 0x14, 0x82, 0xA2, 0xE4, 0xE6, 0x72, 0x56,\n    0x46, 0xCB, 0x26, 0x2F, 0xE2, 0x6D, 0x5B, 0x07, 0xA6, 0xF3, 0x94, 0x24, 0x24, 0x58, 0x45, 0xF4,\n    0xB4, 0x54, 0x90, 0xFF, 0x59, 0x17, 0x04, 0xC8, 0x9A, 0x4D, 0x82, 0xEF, 0x24, 0xBB, 0x2C, 0x11,\n    0x9F, 0x2D, 0xD4, 0xE5, 0x0A, 0x2A, 0xF0, 0x94, 0x64, 0x48, 0xFF, 0xB4, 0x7D, 0x01, 0x42, 0xBE,\n    0x8F, 0xB2, 0x2F, 0x2A, 0x0A, 0x17, 0xB0, 0xA2, 0x0B, 0x5E, 0x32, 0x05, 0x2A, 0x0A, 0xE5, 0xF6,\n    0x3D, 0xA8, 0x12, 0xBD, 0x5C, 0x4F, 0x59, 0x76, 0xAB, 0x9C, 0x89, 0x98, 0xFD, 0xCE, 0x0B, 0xA1,\n    0x62, 0x4D, 0x3A, 0x16, 0xA5, 0x80, 0x62, 0x8B, 0x52, 0xD4, 0x2A, 0x8E, 0xC0, 0x17, 0xE3, 0x42,\n    0xA6, 0x70, 0x40, 0x6B, 0xE8, 0xE7, 0xD7, 0xA7, 0x43, 0x12, 0xF6, 0xB3, 0x7A, 0xE2, 0xFE, 0x42,\n    0xB0, 0xAF, 0x33, 0x56, 0x10, 0xB1, 0x69, 0x3D, 0x7B, 0x7F, 0xDE, 0xC6, 0xE1, 0x0F, 0xCC, 0x5B,\n    0xF9, 0x53, 0x08, 0x80, 0x05, 0x33, 0xD8, 0x09, 0x7B, 0x87, 0x71, 0xE0, 0xF5, 0xCA, 0xB5, 0xFB,\n    0xB4, 0x3C, 0x4A, 0x6B, 0x10, 0xBA, 0xA6, 0xE6, 0x69, 0xD6, 0x8E, 0x8C, 0x5B, 0x33, 0x07, 0xE8,\n    0x22, 0xB9, 0xF8, 0x3C, 0xEF, 0xE0, 0xDA, 0x06, 0x54, 0xCB, 0x14, 0xDB, 0x2B, 0x50, 0x92, 0xB2,\n    0x5C, 0xB8, 0xCB, 0xB6, 0x40, 0xB1, 0x91, 0xD4, 0xD7, 0xF9, 0xC2, 0x08, 0x77, 0xC9, 0xB7, 0x00,\n    0x9B, 0x32, 0x20, 0xC4, 0x08, 0x39, 0xEE, 0xD6, 0x32, 0xB8, 0x63, 0x0F, 0x1A, 0x73, 0x33, 0x73,\n    0xE1, 0xFB, 0x0E, 0x94, 0x75, 0xCE, 0x37, 0xA4, 0xAF, 0xBC, 0x39, 0xAB, 0x25, 0x35, 0xA7, 0xDF,\n    0xC2, 0x9B, 0xF5, 0xD7, 0x52, 0x44, 0xDE, 0x21, 0x50, 0x5F, 0x3E, 0xA6, 0x37, 0x9E, 0x91, 0x56,\n    0x12, 0x82, 0xCB, 0xA0, 0xAE, 0x6F, 0xA8, 0x81, 0x0C, 0x3B, 0xC0, 0x4C, 0xEE, 0x47, 0x57, 0x79,\n    0xC1, 0x49, 0x4B, 0x7A, 0x92, 0xC7, 0x95, 0xA4, 0xD6, 0x3E, 0x25, 0xE5, 0xCF, 0x55, 0x65, 0x10,\n    0x52, 0x58, 0xEA, 0x4F, 0xFC, 0x34, 0xB1, 0x0E, 0x0E, 0x2E, 0x45, 0x4C, 0xD7, 0xB7, 0x92, 0xC4,\n    0x70, 0xE5, 0x33, 0xA1, 0x22, 0x49, 0x04, 0xF8, 0xAF, 0x5E, 0x6D, 0x4B, 0xDE, 0x76, 0xCD, 0x50,\n    0x40, 0xFB, 0xFD, 0x7B, 0xC3, 0xF2, 0xEA, 0x4B, 0xEA, 0xA7, 0x66, 0x44, 0x2B, 0x4D, 0x0C, 0xA3,\n    0xC4, 0xAA, 0x9C, 0x50, 0x36, 0x5A, 0x4D, 0xB7, 0x04, 0x81, 0x5C, 0xBD, 0x40, 0x62, 0x12, 0x6A,\n    0x4C, 0x13, 0x35, 0x4E, 0x47, 0x16, 0xD9, 0x43, 0xE5, 0x8A, 0x44, 0x6D, 0x49, 0x71, 0x30, 0xA9,\n    0x4C, 0xDE, 0x31, 0x1E, 0x2A, 0xE1, 0xDB, 0xBF, 0x1F, 0xB6, 0x7C, 0x36, 0xAA, 0x0F, 0x02, 0xBA,\n    0x85, 0x87, 0xFC, 0x47, 0x90, 0x34, 0xD5, 0x13, 0x9E, 0x09, 0x2B, 0xC3, 0xEC, 0x83, 0x80, 0x9D,\n    0xFE, 0x3D, 0x18, 0xBA, 0xFB, 0x51, 0x8D, 0x79, 0xF6, 0xFA, 0x38, 0x48, 0x60, 0x14, 0xCC, 0x60,\n    0x81, 0x57, 0xEE, 0xA5, 0x04, 0x1B, 0x4A, 0x0E, 0x43, 0x15, 0x00, 0x57, 0xE2, 0x0A, 0xBC, 0xF4,\n    0x14, 0x3B, 0x96, 0x95, 0xF3, 0xFC, 0x4E, 0x13, 0x6F, 0x0D, 0x63, 0x85, 0xD0, 0xB0, 0x3B, 0xCA,\n    0x0A, 0x80, 0x3D, 0x11, 0xD1, 0x7A, 0xCF, 0xB2, 0x0B, 0xE1, 0x67, 0xDD, 0x45, 0x9B, 0xEC, 0x30,\n    0xD5, 0xE3, 0x06, 0xB3, 0x94, 0xBB, 0xCB, 0x32, 0xBA, 0x17, 0xDF, 0x5F, 0x1F, 0x38, 0xAF, 0xC6,\n    0xA9, 0xB5, 0x7F, 0xF6, 0x85, 0xC2, 0x99, 0x33, 0x0A, 0x3F, 0x7D, 0xB2, 0x72, 0x7D, 0xF7, 0xF4,\n    0x1B, 0x11, 0xA1, 0x7D, 0xF7, 0x3D, 0x7F, 0x0F, 0xFA, 0xB1, 0xEE, 0x6C, 0xAD, 0xA9, 0xE7, 0x43,\n    0x5D, 0xFE, 0xC9, 0x32, 0xF6, 0xF1, 0x97, 0xE7, 0x87, 0x17, 0x85, 0xB9, 0xBC, 0xC1, 0xD5, 0x2F,\n    0xC4, 0x5A, 0xBE, 0x03, 0xC3, 0x49, 0xAB, 0x9D, 0x40, 0xFA, 0xE1, 0xBD, 0x1E, 0x44, 0xE8, 0x8A,\n    0x6E, 0x98, 0x99, 0x4C, 0xC6, 0x2B, 0xE0, 0x18, 0x26, 0x83, 0xCA, 0x08, 0x0B, 0xDD, 0x69, 0xD1,\n    0x33, 0xD5, 0x8F, 0xAD, 0xBD, 0x86, 0xFE, 0xC3, 0x0C, 0xC3, 0x99, 0x3D, 0x4B, 0xB0, 0x0C, 0x75,\n    0x17, 0x89, 0x6E, 0x70, 0x0C, 0x23, 0xA9, 0x99, 0xD9, 0x59, 0x07, 0x7D, 0x30, 0xFC, 0xC5, 0x98,\n    0xD0, 0xFF, 0x5D, 0x10, 0x99, 0xF4, 0xB7, 0xC5, 0x56, 0xE8, 0xA7, 0x0D, 0x02, 0xB4, 0x04, 0xFB,\n    0x9E, 0x9C, 0x8B, 0x0C, 0x03, 0x57, 0x48, 0x73, 0x51, 0x9A, 0x8E, 0xB6, 0xB9, 0x15, 0x57, 0xFD,\n    0x52, 0x1E, 0x27, 0x87, 0x68, 0xCF, 0x1C, 0x2B, 0x18, 0x2D, 0xDA, 0x00, 0x2F, 0x71, 0xB8, 0x66,\n    0x35, 0x3F, 0x50, 0xC0, 0xBC, 0xF6, 0xF1, 0x0E, 0xD0, 0xAC, 0x1C, 0xFC, 0xAD, 0x7C, 0xD9, 0x36,\n    0x3F, 0x20, 0xC1, 0x96, 0x83, 0xB1, 0x14, 0xAB, 0xC7, 0xD5, 0x0A, 0xF4, 0x41, 0x65, 0x7D, 0x4C,\n    0x8D, 0x03, 0xB0, 0x4C, 0x3E, 0x16, 0x6B, 0xB7, 0xF7, 0x16, 0x6B, 0x2A, 0x82, 0x27, 0x5A, 0x1A,\n    0x60, 0xFF, 0x21, 0x47, 0x0E, 0xF9, 0x66, 0x78, 0x3D, 0x27, 0xE7, 0x22, 0x93, 0x3C, 0x39, 0x9D,\n    0xA1, 0xC1, 0x89, 0x6D, 0x16, 0xCF, 0x12, 0x43, 0x24, 0x9A, 0x40, 0x7A, 0x5A, 0xBA, 0xA5, 0xD2,\n    0x1A, 0x9E, 0x71, 0x1F, 0x22, 0x33, 0x22, 0xA5, 0xEA, 0xA0, 0xF9, 0x88, 0x55, 0x05, 0x8D, 0xD9,\n    0x0A, 0x45, 0x21, 0x9F, 0xA2, 0xD7, 0x0B, 0xE1, 0xC1, 0x3E, 0xDF, 0x89, 0xDE, 0x24, 0xF9, 0x3F,\n    0x9B, 0x1E, 0xA6, 0xB9, 0x94, 0x67, 0x4D, 0xFB, 0x9E, 0x27, 0xA4, 0x6F, 0xF5, 0xCE, 0xEB, 0x97,\n    0xDA, 0xB4, 0x8A, 0xFB, 0xF2, 0xAD, 0xD2, 0x2C, 0x0A, 0x76, 0xF2, 0xA7, 0x13, 0x0B, 0x47, 0xE2,\n    0xF7, 0xDA, 0x56, 0xDF, 0x83, 0x86, 0x59, 0xE5, 0x22, 0x58, 0x2F, 0x9E, 0x9F, 0x51, 0xDF, 0xA5,\n    0x35, 0xB1, 0xC1, 0xC6, 0xCE, 0xAF, 0x2C, 0xF7, 0x5F, 0xE1, 0x39, 0x6A, 0x87, 0x67, 0xB6, 0x86,\n    0xC7, 0x24, 0x93, 0xEA, 0x78, 0x80, 0xDD, 0x66, 0x96, 0x40, 0x4E, 0xD7, 0x72, 0x14, 0x8F, 0x8E,\n    0x2B, 0x62, 0x72, 0x07, 0x2F, 0x14, 0x9B, 0x3D, 0x7A, 0xB4, 0x90, 0x10, 0xF2, 0xDC, 0x1A, 0x0F,\n    0x68, 0xAC, 0x00, 0x21, 0xA0, 0xF7, 0xE3, 0x31, 0x6F, 0xC8, 0x62, 0xDD, 0x16, 0x13, 0xDB, 0x5A,\n    0x28, 0x56, 0xE5, 0x2A, 0x1D, 0x74, 0x7E, 0x9E, 0x33, 0xC2, 0xE2, 0x96, 0x2C, 0x88, 0xF5, 0xA4,\n    0x46, 0x43, 0xE5, 0x90, 0x67, 0xE2, 0xC9, 0xF4, 0xB9, 0xC6, 0x44, 0xAB, 0xA2, 0x90, 0x22, 0xD2,\n    0x7D, 0xF7, 0x23, 0x5F, 0xF7, 0x98, 0x09, 0x2A, 0xB1, 0xF5, 0xDC, 0x63, 0x50, 0x68, 0xB5, 0x07,\n    0x22, 0x82, 0x59, 0x44, 0x34, 0x7B, 0x8C, 0x0A, 0x15, 0x16, 0x45, 0x9F, 0xAE, 0x25, 0x10, 0x94,\n    0xB7, 0xC5, 0x4A, 0xDC, 0x42, 0x1C, 0x8A, 0xBC, 0x79, 0xD3, 0xB3, 0xA7, 0x57, 0x70, 0x52, 0xAB,\n    0x0A, 0x17, 0x3B, 0x8B, 0xAE, 0x4B, 0x6D, 0x7C, 0x4D, 0x94, 0x30, 0x12, 0xAC, 0x9F, 0xF0, 0x2C,\n    0xB7, 0x84, 0x4F, 0xAF, 0x54, 0x9E, 0x2A, 0x0B, 0x76, 0x65, 0xEB, 0x4C, 0x09, 0x26, 0x51, 0xAC,\n    0x85, 0xC2, 0xD3, 0x27, 0xE8, 0x90, 0xB1, 0xBD, 0x70, 0x00, 0xBB, 0xBE, 0x32, 0x8A, 0x06, 0x90,\n    0xB6, 0x7A, 0x28, 0x8C, 0x18, 0xE0, 0xA7, 0x0A, 0x93, 0x4E, 0x3B, 0x91, 0x63, 0xB8, 0xF8, 0xCD,\n    0x8D, 0xFD, 0x9C, 0x80, 0x22, 0x11, 0x60, 0x16, 0x47, 0xAE, 0x63, 0xD2, 0xEA, 0x1E, 0xF6, 0x09,\n    0x1E, 0x8A, 0x9B, 0xB5, 0x77, 0xE4, 0x66, 0x2D, 0x04, 0x89, 0xD8, 0xB6, 0xAB, 0x68, 0x70, 0x67,\n    0x4D, 0x15, 0x70, 0x6F, 0x1C, 0xB0, 0xC0, 0x23, 0x27, 0xDB, 0xCA, 0x5A, 0x10, 0x34, 0x5A, 0x6C,\n    0x2F, 0x89, 0x27, 0x45, 0x8D, 0xF4, 0xCD, 0x38, 0x28, 0x9B, 0x5C, 0x66, 0xD4, 0x8F, 0x23, 0x08,\n    0xF9, 0x8F, 0x60, 0x58, 0x56, 0x92, 0xBB, 0xC2, 0x8F, 0x6E, 0xC8, 0x15, 0x92, 0x92, 0x33, 0xAD,\n    0xB4, 0x50, 0x7C, 0x31, 0x3D, 0x77, 0x9D, 0xCF, 0x01, 0x9E, 0x08, 0xA1, 0x63, 0xEE, 0x3B, 0xDD,\n    0x79, 0x67, 0x61, 0xF0, 0xB3, 0x90, 0x00, 0x5F, 0x70, 0x58, 0x85, 0x97, 0xED, 0x1F, 0x5C, 0x67,\n    0x96, 0x45, 0x31, 0xC5, 0xCF, 0xDC, 0x00, 0x48, 0x34, 0xDF, 0x0B, 0x5B, 0xFB, 0xC0, 0xB3, 0x3F,\n    0x72, 0xFF, 0x0D, 0x05, 0x4E, 0x4D, 0x42, 0x6F, 0x65, 0x75, 0x1B, 0xB5, 0xCA, 0xB5, 0xA6, 0x67,\n    0x18, 0x77, 0x51, 0x21, 0x4D, 0x0B, 0xC3, 0x6B, 0xB7, 0x70, 0x78, 0x81, 0xCC, 0xB1, 0xD8, 0xCD,\n    0xFA, 0xA4, 0x40, 0x80, 0xEF, 0x90, 0xE6, 0x64, 0x4C, 0x7E, 0xC7, 0x5F, 0x90, 0xF1, 0xA0, 0x66,\n    0x7C, 0x06, 0x4F, 0xF9, 0xD3, 0x96, 0x31, 0x96, 0x4B, 0x91, 0x8B, 0x94, 0x45, 0x59, 0xCB, 0xE1,\n    0x5F, 0x45, 0xBD, 0xDD, 0x29, 0xED, 0x2D, 0xFE, 0xDD, 0x58, 0xBC, 0xED, 0x4A, 0x8B, 0xEE, 0xF5,\n    0xEA, 0x9B, 0xDC, 0xCE, 0x55, 0xB6, 0x9A, 0x3E, 0xE0, 0xD0, 0xE0, 0x1E, 0xDE, 0xB4, 0x33, 0xF1,\n    0xA5, 0x1B, 0x07, 0x2B, 0x5F, 0xA2, 0x59, 0x28, 0xD7, 0xC3, 0x3B, 0x52, 0xBF, 0x4C, 0x2E, 0xD7,\n    0x88, 0x22, 0x77, 0xD9, 0x51, 0x27, 0x08, 0xA4, 0xC7, 0xF3, 0x5B, 0xF2, 0x7B, 0x6D, 0x34, 0x6E,\n    0x81, 0x53, 0xB2, 0xB8, 0x0F, 0xDE, 0x51, 0x75, 0x20, 0x36, 0x1E, 0x86, 0xB5, 0x1D, 0xCF, 0xCA,\n    0x5D, 0xEF, 0x00, 0x3E, 0x68, 0xD6, 0x8C, 0x09, 0xE6, 0x12, 0x2D, 0x97, 0x24, 0xFD, 0x6A, 0xB1,\n    0xD5, 0x13, 0x18, 0x1A, 0xBF, 0x8D, 0xE5, 0x38, 0x7E, 0x57, 0x47, 0x09, 0xEC, 0xA9, 0xDF, 0x97,\n    0xDA, 0x8C, 0x91, 0x2F, 0x29, 0x2D, 0xAC, 0x8B, 0xCA, 0xC7, 0x03, 0xD8, 0x68, 0xF9, 0x77, 0x2E,\n    0x9F, 0x5F, 0xCE, 0xD8, 0xA4, 0x39, 0x0E, 0x64, 0xB8, 0xD8, 0x21, 0x7D, 0xCE, 0x68, 0xA5, 0xD5,\n    0x38, 0x79, 0x9F, 0x90, 0x49, 0x33, 0x72, 0x05, 0x72, 0x4C, 0x76, 0x83, 0x35, 0xFC, 0x1A, 0xE2,\n    0xF4, 0x60, 0xC8, 0xA8, 0x54, 0xC3, 0xC1, 0x4D, 0x17, 0xFD, 0xAE, 0xA9, 0xA9, 0x20, 0xFE, 0xF9,\n    0x25, 0x4A, 0xE3, 0x22, 0xDC, 0x7D, 0xE0, 0xFC, 0x47, 0xF7, 0xA6, 0xF3, 0x3F, 0xCE, 0xC8, 0x2E,\n    0x8B, 0xCE, 0xFA, 0x46, 0x8D, 0x38, 0x4B, 0x3C, 0xB6, 0x23, 0xA9, 0x2E, 0x53, 0xD9, 0xC3, 0x60,\n    0x60, 0xFF, 0x10, 0xC7, 0x38, 0x54, 0x5C, 0xBD, 0x3E, 0xB1, 0x52, 0x2C, 0x30, 0xB3, 0x6D, 0x14,\n    0x5B, 0x4D, 0xAD, 0x68, 0x9E, 0xD6, 0x0A, 0x91, 0xFD, 0x40, 0x69, 0xE1, 0xB3, 0x76, 0x21, 0x9D,\n    0x5D, 0x97, 0x9F, 0x01, 0x11, 0x55, 0x9A, 0x82, 0x57, 0x1D, 0xD6, 0x55, 0xE7, 0x20, 0x5E, 0x12,\n    0x0A, 0xD9, 0xA8, 0x26, 0xB9, 0x1B, 0x0A, 0xE5, 0xB0, 0x25, 0x79, 0xB2, 0x94, 0x9F, 0x43, 0xA6,\n    0xBA, 0x29, 0x7E, 0x61, 0x4C, 0x48, 0xEA, 0xBE, 0xC1, 0x5D, 0xE8, 0xF0, 0xEB, 0x4B, 0xE1, 0xF5,\n    0x4B, 0x2D, 0xD3, 0xAA, 0x1C, 0x51, 0x00, 0x15, 0x16, 0x64, 0xFC, 0xC3, 0x2B, 0xF0, 0x91, 0xBC,\n    0xF9, 0xDB, 0xE9, 0x88, 0x70, 0xD3, 0x56, 0x47, 0xA3, 0x65, 0xA3, 0x34, 0x74, 0xD8, 0x97, 0x14,\n    0x7B, 0xA5, 0x1E, 0x12, 0xD7, 0xA6, 0x88, 0x00, 0x91, 0x49, 0xFE, 0xD8, 0xF1, 0x0F, 0x59, 0xE3,\n    0xED, 0x5D, 0x8E, 0x39, 0x0D, 0x10, 0xB5, 0x42, 0x31, 0x31, 0x6A, 0x7A, 0x56, 0xD0, 0x25, 0xB6,\n    0x47, 0x7D, 0xBB, 0xCE, 0x47, 0x0A, 0xA7, 0xFF, 0xB9, 0xCB, 0xED, 0x79, 0xFF, 0xFE, 0x16, 0x0C,\n    0x5F, 0xC4, 0xAF, 0x31, 0x2C, 0xAB, 0x23, 0xA9, 0xBB, 0x2E, 0x9B, 0x09, 0xFA, 0x52, 0xC6, 0x80,\n    0xF8, 0xB7, 0x3A, 0xFD, 0xD2, 0xAC, 0xBF, 0x87, 0x77, 0x3B, 0x71, 0x25, 0xCA, 0xDB, 0xC7, 0xE9,\n    0x90, 0xCC, 0x98, 0x42, 0x36, 0xCE, 0xF5, 0x9F, 0x3D, 0x52, 0xDD, 0xE8, 0xB3, 0xFB, 0x46, 0x94,\n    0xAE, 0x17, 0xC8, 0xA4, 0x84, 0xF7, 0xA7, 0xD3, 0xBD, 0x31, 0xCE, 0x90, 0xAF, 0xE7, 0x88, 0x59,\n    0x06, 0x68, 0x7F, 0x05, 0xEB, 0x93, 0xDC, 0x17, 0x41, 0x1C, 0xE0, 0x8B, 0x08, 0x98, 0xCE, 0x45,\n    0xF2, 0xE5, 0x8C, 0xF7, 0xBA, 0xBB, 0x2B, 0x0D, 0x2D, 0x78, 0xC7, 0x37, 0xB2, 0xDD, 0xE9, 0x86,\n    0x75, 0x96, 0xB7, 0xB6, 0x90, 0x14, 0x0E, 0xB8, 0x65, 0x74, 0xC9, 0x4A, 0xA7, 0x7B, 0x39, 0x88,\n    0x61, 0x02, 0x24, 0x55, 0x21, 0x14, 0x9B, 0x29, 0xC3, 0xB1, 0x37, 0xE3, 0x48, 0xCE, 0xAE, 0x42,\n    0x07, 0x2C, 0x08, 0xC8, 0x6E, 0xCE, 0x6F, 0xF6, 0x40, 0x40, 0xBD, 0xC2, 0xC9, 0x76, 0x7B, 0x11,\n    0xF7, 0x81, 0xD9, 0xE7, 0x6D, 0x4B, 0x1B, 0xDB, 0x9E, 0x13, 0x30, 0xDB, 0x55, 0xBB, 0x84, 0xE7,\n    0x0F, 0xBA, 0x13, 0x72, 0x04, 0xBE, 0x94, 0x13, 0xB4, 0xA8, 0xF4, 0x23, 0x89, 0x20, 0x1D, 0x5A,\n    0xC2, 0x23, 0xCF, 0x41, 0x38, 0xCD, 0xFF, 0x93, 0x76, 0x7D, 0xF6, 0x95, 0x5A, 0x3C, 0x27, 0x27,\n    0xEC, 0x79, 0xA8, 0xF7, 0x41, 0x5C, 0xA4, 0xD7, 0x37, 0x09, 0x6E, 0xBD, 0x1D, 0x2C, 0x59, 0xFE,\n    0xD7, 0x6B, 0x73, 0xC1, 0x1F, 0x97, 0x5F, 0x9F, 0x1E, 0xDE, 0x23, 0x9D, 0xFF, 0xE2, 0x83, 0x52,\n    0x9E, 0xB0, 0x80, 0x2D, 0x2E, 0xE4, 0x99, 0xB1, 0x02, 0x28, 0x69, 0xEB, 0x0B, 0x5E, 0xD0, 0xEA,\n    0xB4, 0x77, 0x96, 0xBD, 0x79, 0xE9, 0xCB, 0x1B, 0xBD, 0x4D, 0x39, 0x83, 0x4E, 0x2D, 0x62, 0x94,\n    0xB2, 0x29, 0xFC, 0x9E, 0xC3, 0x18, 0x60, 0x8C, 0xE0, 0x60, 0x40, 0x10, 0x97, 0x16, 0xAB, 0x3A,\n    0x85, 0x2D, 0xD5, 0x80, 0x0C, 0xDA, 0xB7, 0x41, 0xE4, 0x6A, 0x07, 0x75, 0xC5, 0x43, 0x49, 0x6B,\n    0xBB, 0xA6, 0x12, 0x84, 0xBF, 0xDD, 0x4D, 0x76, 0xC8, 0x0F, 0xEC, 0xC1, 0x1B, 0xFE, 0x24, 0x67,\n    0x37, 0x08, 0x42, 0xA5, 0x61, 0x60, 0xC9, 0x2B, 0x32, 0x25, 0x88, 0xB4, 0x99, 0x68, 0x40, 0xAD,\n    0x68, 0x49, 0xD5, 0x61, 0xF9, 0xBA, 0x5A, 0xDD, 0xB1, 0x47, 0xB1, 0xA9, 0x61, 0x38, 0x87, 0xC4,\n    0x86, 0x88, 0x0B, 0x7B, 0xA8, 0xCD, 0xB0, 0x35, 0x62, 0xA2, 0xDA, 0x7A, 0x3C, 0x85, 0x00, 0x66,\n    0x79, 0x74, 0xFF, 0x79, 0x6F, 0x6C, 0x4B, 0x21, 0x65, 0x7E, 0x2F, 0xFF, 0x8A, 0xD8, 0xE8, 0x69,\n    0x3D, 0x3D, 0xF5, 0xB8, 0xEF, 0x8B, 0x6D, 0xE8, 0x6F, 0x69, 0x2F, 0x8B, 0x49, 0xD8, 0x10, 0xF5,\n    0x42, 0xB9, 0xA6, 0x2A, 0xC8, 0xB2, 0xE7, 0x6A, 0x20, 0x84, 0x89, 0x07, 0xA0, 0xFF, 0xC8, 0x0D,\n    0x8D, 0xEE, 0xB6, 0xED, 0x7B, 0x03, 0x46, 0x36, 0xC7, 0x69, 0x8A, 0x18, 0x88, 0x5C, 0xBB, 0xA9,\n    0xC0, 0x40, 0x49, 0x16, 0xB4, 0x85, 0x50, 0x88, 0x3D, 0x50, 0x7C, 0x50, 0x3B, 0x12, 0x19, 0xEB,\n    0x9E, 0x1F, 0x44, 0x11, 0x8B, 0x1C, 0xF0, 0xCF, 0xE1, 0x76, 0xA4, 0xAB, 0x4F, 0x2E, 0x46, 0x43,\n    0xA4, 0xB2, 0x6E, 0x79, 0x4A, 0x89, 0x19, 0x70, 0xD8, 0xBE, 0xF5, 0x8D, 0xAA, 0x5B, 0x23, 0xB8,\n    0xBA, 0xFB, 0xE6, 0xA7, 0xF1, 0xE8, 0xA3, 0xF8, 0xE7, 0x2D, 0x7F, 0x3B, 0x7D, 0x89, 0x48, 0x99,\n    0xAC, 0x5A, 0xC0, 0x5B, 0xCD, 0xE3, 0xC1, 0x65, 0x52, 0xB0, 0xA5, 0xFC, 0x5C, 0xA2, 0xEB, 0xFB,\n    0x61, 0x04, 0xE2, 0xC9, 0xD6, 0x24, 0x27, 0x12, 0x2F, 0x3A, 0x9E, 0xE6, 0x97, 0x87, 0x19, 0x4F,\n    0xBB, 0x09, 0x80, 0x4A, 0xAD, 0x9B, 0x18, 0x8E, 0x43, 0x91, 0xAF, 0x2C, 0x54, 0xE8, 0xDB, 0xB8,\n    0x0C, 0x11, 0xC7, 0x29, 0xE7, 0x76, 0xCF, 0xAA, 0xCC, 0x83, 0x77, 0x4E, 0xE6, 0x4D, 0x78, 0xFD,\n    0x1C, 0x14, 0xCA, 0x1F, 0x0F, 0xA3, 0x70, 0xDB, 0x33, 0x44, 0xF2, 0x34, 0x3F, 0xDB, 0x5E, 0x1F,\n    0x9B, 0x25, 0x47, 0x44, 0x5F, 0x04, 0xCD, 0xBA, 0x79, 0x2A, 0x21, 0xD0, 0x8B, 0x71, 0xF8, 0x9F,\n    0x16, 0x6D, 0xEE, 0x1A, 0xE9, 0x6C, 0x52, 0xDB, 0x8D, 0x17, 0x28, 0xAD, 0xFD, 0xEF, 0x7B, 0xAC,\n    0x53, 0x6B, 0xED, 0x11, 0x04, 0x83, 0xFD, 0x96, 0x2E, 0xB2, 0x31, 0xC6, 0x0C, 0x13, 0x4C, 0x20,\n    0x58, 0x19, 0xDE, 0x2F, 0x8C, 0xF1, 0x63, 0x48, 0x8C, 0x3A, 0xE9, 0xF8, 0x81, 0x75, 0x0D, 0x10,\n    0x1E, 0x74, 0xA5, 0x7E, 0xF7, 0xC3, 0x11, 0xFB, 0x20, 0xF0, 0xF9, 0x72, 0x7B, 0x8B, 0xF4, 0x3C,\n    0xCC, 0x54, 0x5F, 0xA6, 0xEF, 0xA8, 0x03, 0xB3, 0x7E, 0x72, 0xEB, 0xA0, 0x93, 0x67, 0xAC, 0x38,\n    0x9F, 0xD6, 0xEF, 0x16, 0x1D, 0x33, 0x4B, 0xC5, 0x80, 0x60, 0x70, 0xF1, 0xF8, 0x10, 0x91, 0x2D,\n    0xA7, 0x04, 0xDD, 0x0A, 0xEB, 0xEC, 0x2F, 0xA3, 0xB9, 0x4B, 0x79, 0x96, 0x3C, 0xA4, 0xE8, 0x47,\n    0xA5, 0xDA, 0xE2, 0x65, 0x94, 0xEA, 0xAA, 0x32, 0x78, 0xBD, 0x6F, 0xA2, 0x78, 0x7D, 0x15, 0x7D,\n    0xC3, 0xE8, 0x28, 0x91, 0xE4, 0x3C, 0x91, 0x3C, 0xC1, 0x42, 0xEA, 0x0A, 0x51, 0x3E, 0x40, 0x4B,\n    0xAF, 0xB5, 0xBF, 0x56, 0x42, 0xDE, 0x98, 0xE5, 0xC5, 0xB7, 0xF5, 0x14, 0x22, 0xDB, 0xA6, 0xA4,\n    0x7E, 0x88, 0xEA, 0xD1, 0x2F, 0x57, 0xD0, 0x3D, 0x17, 0x41, 0x7D, 0xD8, 0x4C, 0x3D, 0x49, 0xC4,\n    0xF3, 0x0D, 0xC4, 0x80, 0xBE, 0x6C, 0x1A, 0x26, 0xEB, 0xBF, 0xF6, 0x95, 0xE7, 0x9A, 0x44, 0x41,\n    0x90, 0x1F, 0xD1, 0x70, 0x7B, 0x65, 0xA1, 0x0F, 0xA3, 0xAA, 0xB5, 0xF1, 0xC0, 0x3D, 0x31, 0x92,\n    0xA7, 0x2F, 0xB4, 0x72, 0xAB, 0x7A, 0x61, 0xB5, 0x37, 0xBF, 0xC2, 0xE5, 0x41, 0xBA, 0x75, 0x5D,\n    0xB3, 0x59, 0xFA, 0x96, 0x04, 0x59, 0x2B, 0x96, 0x10, 0x79, 0x66, 0x76, 0xF7, 0x71, 0xCB, 0x37,\n    0xF7, 0x60, 0x19, 0x59, 0x21, 0x5F, 0xEE, 0x8B, 0x2D, 0x91, 0x3D, 0xEB, 0x57, 0x65, 0xB4, 0x09,\n    0x09, 0x38, 0xEB, 0x70, 0x96, 0x43, 0x87, 0x80, 0x07, 0x9F, 0x0B, 0x09, 0x03, 0xF8, 0x5F, 0xF4,\n    0x5A, 0x53, 0x60, 0x86, 0x48, 0x8A, 0xB3, 0xB6, 0x34, 0xE0, 0xFC, 0xE5, 0x95, 0x12, 0xE7, 0x7C,\n    0xE9, 0x14, 0x56, 0x2D, 0x8D, 0x9C, 0xA8, 0x6F, 0x2F, 0x65, 0x29, 0xBC, 0xC2, 0xEB, 0xA8, 0xD2,\n    0xA9, 0xD3, 0x3E, 0x7E, 0xED, 0x28, 0x9C, 0xFD, 0x15, 0x5D, 0x64, 0x21, 0x30, 0xAB, 0xD3, 0x0C,\n    0x0D, 0x63, 0x5B, 0xC5, 0xBE, 0x03, 0xB1, 0x03, 0x7E, 0x7E, 0xE5, 0xCC, 0x0C, 0x1C, 0xB8, 0x74,\n    0x57, 0x58, 0x0E, 0xA1, 0xBE, 0xA7, 0x90, 0x3B, 0x9B, 0x98, 0xB2, 0xC0, 0xF3, 0x97, 0x41, 0xBD,\n    0x1F, 0xD7, 0x31, 0x42, 0xB6, 0xFF, 0x6D, 0x4B, 0xEC, 0x4D, 0x98, 0x15, 0x71, 0x46, 0x4C, 0x14,\n    0x7B, 0x59, 0xE2, 0x88, 0xE4, 0x4E, 0xF2, 0x74, 0x6F, 0x64, 0x4A, 0xEE, 0x46, 0x46, 0x4F, 0xC6,\n    0xF5, 0x3C, 0x12, 0xC8, 0xBE, 0x8C, 0x55, 0x19, 0xC5, 0xC0, 0x9F, 0x31, 0xC4, 0xDA, 0xCB, 0x3C,\n    0xF3, 0xC6, 0x42, 0xBC, 0x3B, 0x96, 0x62, 0xB9, 0x77, 0x54, 0x41, 0xE6, 0x74, 0x82, 0xBA, 0xCB,\n    0x32, 0x7A, 0x8D, 0x05, 0xBF, 0x3C, 0x4A, 0x97, 0x2A, 0xF7, 0xEC, 0xCF, 0xA0, 0x3E, 0x5A, 0xDC,\n    0x41, 0x23, 0xB0, 0xB8, 0x56, 0x55, 0xD8, 0xC2, 0xA7, 0x3F, 0x32, 0x37, 0xD3, 0x6F, 0x01, 0xA2,\n    0x0E, 0x26, 0xD7, 0xB5, 0xA0, 0xA5, 0x34, 0x22, 0x47, 0xFD, 0xD1, 0x52, 0xF3, 0xE1, 0xE0, 0xAB,\n    0xF9, 0xD0, 0x8E, 0x7C, 0x42, 0x1D, 0x11, 0xEA, 0xA4, 0xCE, 0x38, 0x68, 0xDE, 0xBC, 0xBA, 0x6A,\n    0x50, 0x91, 0x54, 0x86, 0x0E, 0x98, 0xAA, 0x2C, 0x57, 0x5C, 0x2A, 0x70, 0x57, 0x58, 0x6A, 0xD1,\n    0x9C, 0xB9, 0xEB, 0x5E, 0xD2, 0x35, 0xD9, 0xC5, 0x2A, 0x6B, 0x0C, 0x60, 0x39, 0xE4, 0x4C, 0xCD,\n    0xF0, 0xFB, 0xF7, 0x52, 0x86, 0x48, 0xCF, 0x27, 0xB4, 0x9A, 0xC7, 0x20, 0xB2, 0xDD, 0x5E, 0x7D,\n    0x4F, 0x2B, 0xC5, 0x96, 0xC5, 0xAE, 0x65, 0x26, 0xD9, 0x18, 0xC6, 0xBE, 0x59, 0xFF, 0x85, 0x51,\n    0x6D, 0xE6, 0x4E, 0xED, 0x25, 0x7D, 0x8D, 0x86, 0xDD, 0xB9, 0x06, 0x7A, 0x76, 0x66, 0x68, 0x42,\n    0x13, 0x6F, 0xC8, 0x7D, 0xF8, 0x9E, 0x9B, 0x51, 0xFD, 0xEE, 0x2F, 0xF5, 0x19, 0x5E, 0x14, 0x4E,\n    0xFB, 0x69, 0x68, 0xE6, 0x9D, 0xB7, 0xD5, 0x31, 0xBB, 0xB4, 0x96, 0x4F, 0x25, 0x86, 0x25, 0xDA,\n    0x98, 0xC7, 0x3A, 0xD6, 0x10, 0xD0, 0xD4, 0x52, 0x5C, 0x5E, 0x4E, 0xFD, 0xE5, 0x04, 0x6E, 0x37,\n    0xDE, 0x84, 0x55, 0x6A, 0xB4, 0xAA, 0xC3, 0x50, 0xCB, 0x36, 0x3D, 0x0F, 0x68, 0x26, 0x2D, 0xA0,\n    0xBB, 0xC3, 0x58, 0x85, 0x37, 0xC3, 0xD5, 0xC2, 0x13, 0x17, 0x15, 0x59, 0x77, 0x4D, 0xEE, 0x44,\n    0xC2, 0x1E, 0x37, 0x10, 0x44, 0xC3, 0xCD, 0xB5, 0x9C, 0xD7, 0xE2, 0x82, 0xA9, 0x77, 0x83, 0x83,\n    0xCC, 0xB8, 0xC1, 0xB0, 0xD5, 0x2D, 0xE2, 0xC2, 0x0D, 0x1A, 0x40, 0xCE, 0xBF, 0x57, 0x33, 0x19,\n    0xFF, 0xB7, 0x9C, 0xC2, 0xAF, 0x3B, 0x7A, 0x51, 0x16, 0x0B, 0x6C, 0xB1, 0x89, 0x49, 0x7D, 0x11,\n    0x78, 0x79, 0x99, 0xAF, 0x68, 0xB9, 0xB7, 0xA8, 0xC2, 0x8C, 0xD4, 0x54, 0x2A, 0xCB, 0xC1, 0xFA,\n    0xBA, 0x23, 0x18, 0x44, 0xFB, 0xF4, 0x0D, 0xA9, 0xBD, 0x93, 0x33, 0x55, 0x85, 0xC6, 0xD9, 0xE9,\n    0xCA, 0x48, 0x4C, 0xBF, 0xA8, 0xA2, 0x19, 0x9C, 0x38, 0xFD, 0x3E, 0xA6, 0x83, 0x9A, 0xFC, 0x94,\n    0xF7, 0xF7, 0xCC, 0xD5, 0x61, 0xED, 0x3C, 0x02, 0x8B, 0xF4, 0x4E, 0xAF, 0x8A, 0x34, 0xEA, 0x30,\n    0x4F, 0x65, 0x1A, 0x79, 0x8B, 0x64, 0xAB, 0x9D, 0x3C, 0x90, 0x6B, 0x1D, 0x17, 0x9A, 0x05, 0x9D,\n    0x11, 0xF6, 0xC1, 0x45, 0x86, 0x87, 0xC0, 0x79, 0xAB, 0x5D, 0x9B, 0x1F, 0xAA, 0x80, 0x7F, 0x7C,\n    0x4C, 0xAD, 0x26, 0x47, 0x9B, 0xB8, 0x59, 0x79, 0x18, 0x61, 0xC7, 0x29, 0x28, 0xCA, 0xB5, 0xC4,\n    0x5E, 0x18, 0xA4, 0x02, 0x91, 0x9C, 0xBB, 0x63, 0xBB, 0xBA, 0xCE, 0xBC, 0xC4, 0xB8, 0x65, 0xDA,\n    0xC4, 0x33, 0xB2, 0x44, 0xDC, 0x26, 0xB9, 0x91, 0x34, 0xA4, 0x69, 0x03, 0x4B, 0x55, 0x12, 0xAB,\n    0x5E, 0x20, 0x49, 0xFB, 0x3F, 0xA4, 0x68, 0x23, 0x0F, 0xDF, 0xB6, 0xA1, 0x56, 0x98, 0xDD, 0x8B,\n    0xE7, 0x33, 0xFD, 0x5C, 0x80, 0x69, 0x6E, 0x2E, 0x81, 0xD4, 0x4A, 0x8F, 0x1A, 0xD2, 0x88, 0x8C,\n    0x1A, 0xB7, 0x41, 0xB4, 0x93, 0x82, 0x4B, 0xC9, 0xED, 0xF0, 0xC7, 0x2F, 0x4B, 0xA4, 0xB3, 0xD5,\n    0x70, 0x47, 0x3A, 0x6F, 0xBD, 0x45, 0x85, 0x4D, 0x91, 0xDA, 0x28, 0x83, 0x6C, 0xDF, 0x24, 0xD5,\n    0xFC, 0x4A, 0xE2, 0xFD, 0xD5, 0xC2, 0x5F, 0xC3, 0x69, 0xF4, 0x2A, 0x19, 0xD2, 0x2B, 0x13, 0xC3,\n    0x57, 0x0D, 0x29, 0xD6, 0x6D, 0xB1, 0x1B, 0xA8, 0x38, 0x72, 0xBC, 0x09, 0x4E, 0x6B, 0x22, 0xF0,\n    0x89, 0x6C, 0x19, 0x7A, 0x61, 0x0C, 0xC8, 0xE5, 0xCD, 0x7A, 0xA8, 0x44, 0x15, 0xCF, 0x9A, 0x43,\n    0xA7, 0xF4, 0x75, 0x0B, 0xD1, 0x60, 0x57, 0xF6, 0xF9, 0xE5, 0x18, 0xE8, 0x80, 0xCE, 0x07, 0x17,\n    0x17, 0x25, 0x1E, 0xA1, 0x15, 0x8C, 0x77, 0x14, 0x4F, 0x4C, 0xA0, 0x22, 0x85, 0x13, 0x5F, 0x54,\n    0x28, 0x98, 0x23, 0x5A, 0x95, 0xC1, 0xFB, 0x1F, 0x69, 0x4D, 0xD3, 0x4C, 0x48, 0xAC, 0xD1, 0xF1,\n    0xC6, 0x24, 0xFE, 0x02, 0x15, 0xFE, 0x00, 0x22, 0x14, 0x4A, 0x67, 0x5E, 0xD3, 0xE4, 0x36, 0x6B,\n    0x04, 0xCA, 0x98, 0xDA, 0x97, 0x9E, 0x52, 0x9E, 0xE5, 0x94, 0xAA, 0x87, 0xEE, 0xCB, 0x08, 0xC8,\n    0xA7, 0x24, 0x46, 0xF2, 0x23, 0x62, 0xD1, 0x9C, 0xA7, 0x7F, 0xCC, 0x93, 0xC1, 0x58, 0xFF, 0xA8,\n    0x17, 0xAF, 0x56, 0x28, 0x1D, 0x9F, 0xFB, 0x28, 0x95, 0xBE, 0x48, 0x30, 0xBB, 0xD4, 0x0B, 0x3F,\n    0xF3, 0x53, 0x34, 0xFC, 0x50, 0x5F, 0x90, 0x89, 0x28, 0xFE, 0x4C, 0x7E, 0x08, 0xF9, 0x0C, 0x53,\n    0xD8, 0x16, 0xF7, 0x44, 0x88, 0x17, 0xFD, 0xFD, 0x21, 0x0D, 0x52, 0xBF, 0xD8, 0x74, 0xD8, 0xCF,\n    0x7E, 0xB8, 0x70, 0x8B, 0xA9, 0xBB, 0x5A, 0xC9, 0x75, 0xF2, 0xC0, 0xD3, 0xC5, 0xE0, 0x61, 0x7B,\n    0xEF, 0xA5, 0x51, 0x70, 0x37, 0xA1, 0xB8, 0x09, 0xAC, 0xF0, 0xF7, 0x43, 0xD5, 0xE8, 0xB5, 0x7C,\n    0xE5, 0xE7, 0x97, 0xC8, 0x20, 0x88, 0x53, 0xA3, 0x8F, 0x2F, 0x6B, 0xB4, 0xD2, 0xF9, 0x88, 0xDE,\n    0x15, 0xE3, 0x88, 0xA6, 0x94, 0xC3, 0x51, 0xCE, 0xFF, 0x2F, 0xF5, 0x59, 0xB8, 0xB4, 0x49, 0x6A,\n    0xAE, 0x6E, 0x8B, 0x63, 0x7B, 0x08, 0xB0, 0xD7, 0x00, 0x3A, 0xF6, 0xBF, 0x55, 0x63, 0xB1, 0x09,\n    0x24, 0x14, 0x39, 0x56, 0x62, 0x18, 0x33, 0x64, 0x64, 0xEF, 0xAA, 0xA8, 0xC9, 0x38, 0x2A, 0xA2,\n    0x70, 0x4A, 0x61, 0x66, 0x6F, 0xD7, 0x73, 0xF7, 0xF0, 0x8B, 0x34, 0xC4, 0x92, 0xD1, 0x63, 0xFC,\n    0x05, 0xC6, 0xD4, 0xE4, 0x9B, 0x8F, 0x4E, 0x2A, 0x58, 0x2A, 0xA7, 0x7C, 0x47, 0x34, 0x01, 0xF3,\n    0x5D, 0x0F, 0x99, 0xF3, 0x21, 0x86, 0xB7, 0x52, 0x8F, 0x06, 0x60, 0x1D, 0xC6, 0xBB, 0xC4, 0x5A,\n    0x8F, 0x9B, 0x5E, 0x43, 0x4A, 0xA4, 0x2C, 0x1A, 0xAD, 0xB8, 0x74, 0x79, 0x2C, 0x2D, 0x3A, 0x31,\n    0x21, 0x7F, 0x63, 0x91, 0x0C, 0xED, 0xFF, 0x33, 0xF4, 0x2D, 0x19, 0xB6, 0x83, 0xD3, 0x33, 0x7B,\n    0xE7, 0x9C, 0xF1, 0x8E, 0xAF, 0x57, 0x91, 0x81, 0x3A, 0x86, 0x1D, 0xA8, 0xC4, 0x58, 0x78, 0xA8,\n    0xE8, 0x34, 0xB9, 0xE6, 0x57, 0x89, 0x4E, 0xD3, 0x72, 0xD3, 0xD2, 0x09, 0x8C, 0xF1, 0x5B, 0xFB,\n    0x64, 0xDB, 0xA5, 0x32, 0x17, 0x99, 0x65, 0x08, 0x31, 0xAD, 0x89, 0x64, 0x60, 0x60, 0xB8, 0xFE,\n    0x77, 0xE5, 0x33, 0x80, 0xF8, 0x41, 0x75, 0xF0, 0xAE, 0x04, 0xB3, 0x49, 0x6C, 0x24, 0x33, 0xC8,\n    0x7A, 0x09, 0x43, 0x6D, 0x0F, 0x88, 0xE6, 0xCD, 0x35, 0xA8, 0xF2, 0xBD, 0xEA, 0x39, 0xA6, 0x46,\n    0xB5, 0x21, 0xD4, 0xC0, 0xF5, 0x91, 0xDD, 0x9C, 0x58, 0x68, 0x04, 0x99, 0x58, 0x1C, 0xC2, 0x03,\n    0xED, 0x1D, 0xCA, 0x93, 0xBA, 0x18, 0x1D, 0xDD, 0xB4, 0xBB, 0xE2, 0x1E, 0x38, 0x59, 0x04, 0x5E,\n    0x8E, 0xFF, 0x80, 0xEC, 0xBB, 0x57, 0xE4, 0xA8, 0x9F, 0x4D, 0xC3, 0xE5, 0x15, 0x71, 0x57, 0xDD,\n    0x02, 0xB2, 0x67, 0x50, 0xD2, 0xDB, 0x95, 0xFF, 0x03, 0x2C, 0xDE, 0xE3, 0x78, 0x4F, 0xFE, 0xA9,\n    0xAC, 0xE7, 0xE9, 0xC9, 0xA6, 0xB0, 0xCF, 0x98, 0x5E, 0xF7, 0xD7, 0x2C, 0x92, 0x78, 0x44, 0xB9,\n    0xA0, 0x1A, 0xA4, 0x17, 0xA3, 0x50, 0x5E, 0x7E, 0x1A, 0x9F, 0x18, 0x3C, 0x53, 0x8A, 0xFC, 0x9C,\n    0xF1, 0x58, 0x5D, 0xA3, 0xD5, 0x18, 0x6C, 0xC7, 0x55, 0x2F, 0x46, 0x5D, 0xFB, 0x33, 0x75, 0x50,\n    0x0A, 0x28, 0x37, 0x99, 0xBD, 0x06, 0xAD, 0x14, 0x84, 0xB5, 0x9D, 0xDF, 0x04, 0x3F, 0x33, 0x28,\n    0x1F, 0xD8, 0x57, 0xB7, 0x6A, 0x90, 0x18, 0xC7, 0xA6, 0x1B, 0x56, 0xD1, 0xBF, 0x22, 0x4E, 0x33,\n    0x6A, 0x7F, 0x94, 0xB8, 0xA6, 0x0C, 0xA0, 0xE0, 0x7C, 0xD1, 0xEE, 0xDA, 0xFF, 0xE0, 0x9B, 0x41,\n    0x75, 0xD7, 0xCA, 0x96, 0x01, 0xA9, 0xAA, 0xAD, 0x75, 0x54, 0xBA, 0x86, 0x14, 0xF1, 0x84, 0x66,\n    0xC3, 0xC8, 0x66, 0x71, 0x63, 0x0D, 0x4A, 0x2C, 0x85, 0x4E, 0xD7, 0x6F, 0x9A, 0x59, 0x51, 0x8A,\n    0xB6, 0xAF, 0xF5, 0x5F, 0x18, 0xA2, 0x49, 0xD0, 0x34, 0xD4, 0x51, 0xF9, 0x8D, 0xA3, 0x91, 0x59,\n    0x7C, 0x87, 0x9D, 0x31, 0x14, 0xE0, 0xF0, 0x08, 0x95, 0x2C, 0x61, 0xCC, 0x53, 0xE2, 0x15, 0x9D,\n    0xEE, 0xA1, 0xC2, 0xDE, 0x2B, 0x53, 0xB6, 0x21, 0x88, 0xE0, 0x5B, 0x77, 0x1F, 0x50, 0xEF, 0xFA,\n    0xAA, 0x48, 0xCF, 0x97, 0x40, 0x3B, 0xC1, 0x82, 0x34, 0x6D, 0xAB, 0xB4, 0xAD, 0x5A, 0xE3, 0x99,\n    0x78, 0xB6, 0xBD, 0x16, 0x34, 0x32, 0xC9, 0xA2, 0xC2, 0xA1, 0xAB, 0xB3, 0xFA, 0xA6, 0x62, 0x7D,\n    0xB5, 0xF7, 0x89, 0xAD, 0x9A, 0xA9, 0x7E, 0x1C, 0x7F, 0x9C, 0x64, 0x30, 0x47, 0x9B, 0x6E, 0x48,\n    0x62, 0x2C, 0xDE, 0x9A, 0xAF, 0x2A, 0xE2, 0xF1, 0x7B, 0xEA, 0xA2, 0xAA, 0x75, 0x3C, 0xB5, 0xB2,\n    0xC5, 0x2F, 0x0F, 0x50, 0x36, 0x15, 0x12, 0x71, 0x48, 0x2A, 0xD2, 0x73, 0x02, 0xB3, 0xA8, 0xBE,\n    0x24, 0x18, 0x79, 0xB0, 0xE0, 0x06, 0x07, 0x13, 0xE5, 0xF6, 0x32, 0x96, 0x9C, 0x88, 0x6B, 0xF0,\n    0xFB, 0xA9, 0x04, 0x52, 0x18, 0x41, 0x91, 0x5D, 0x4C, 0xDC, 0x96, 0x35, 0x45, 0x85, 0x1D, 0x1C,\n    0xDF, 0x28, 0xCA, 0x07, 0xC5, 0x27, 0x47, 0xF7, 0x30, 0x6D, 0xDF, 0x28, 0x12, 0xCA, 0x28, 0x31,\n    0x71, 0x77, 0xCC, 0x35, 0x0A, 0x2E, 0x81, 0xEE, 0xD2, 0x6F, 0x01, 0x95, 0x5A, 0x97, 0x44, 0xCA,\n    0x18, 0x69, 0xD9, 0xA0, 0xC8, 0x88, 0xF3, 0x2B, 0x7A, 0x7F, 0xFD, 0x5F, 0xA6, 0x42, 0x3D, 0x1A,\n    0x36, 0x78, 0x4D, 0x1B, 0x56, 0x8F, 0x3A, 0xCB, 0x65, 0x77, 0x9E, 0x78, 0x03, 0xDE, 0xA9, 0xE6,\n    0x0D, 0x06, 0xF6, 0x43, 0xC6, 0x94, 0xCB, 0x37, 0xEA, 0xC1, 0x97, 0x01, 0x69, 0x41, 0x6D, 0x55,\n    0x7C, 0xC8, 0x9C, 0xD1, 0x4A, 0x66, 0x9E, 0x90, 0x03, 0xCA, 0x29, 0x53, 0x68, 0x0F, 0x69, 0x6C,\n    0x7D, 0xEB, 0xAD, 0xD9, 0x1A, 0xA4, 0x46, 0xB4, 0x92, 0x9C, 0x42, 0x0E, 0x9F, 0x81, 0x29, 0xA2,\n    0xDF, 0xB0, 0x2C, 0x4C, 0x32, 0xA2, 0x57, 0x25, 0x01, 0xB1, 0x9C, 0x12, 0x53, 0xC7, 0xF0, 0x0A,\n    0x60, 0xA6, 0x51, 0xC9, 0x8F, 0xB4, 0x52, 0x20, 0x8A, 0x61, 0x17, 0x76, 0xA3, 0x85, 0xB9, 0x51,\n    0x02, 0x0A, 0x2D, 0x81, 0x07, 0x90, 0x56, 0x96, 0xA7, 0xF9, 0x5A, 0x36, 0x6E, 0x2A, 0xA8, 0x7E,\n    0xC1, 0xD8, 0x23, 0x0E, 0x81, 0xBA, 0x85, 0xDD, 0x60, 0x61, 0x28, 0xEF, 0x93, 0x4E, 0x12, 0x9B,\n    0x1A, 0x0B, 0xC7, 0xEB, 0x7C, 0xE0, 0xEF, 0x24, 0xA1, 0x0A, 0x7D, 0x98, 0xB8, 0x55, 0xF9, 0x88,\n    0x42, 0xA2, 0x69, 0xC5, 0x8C, 0x24, 0xE1, 0xA1, 0xA4, 0xDE, 0x34, 0x6E, 0x08, 0xFD, 0x1F, 0x25,\n    0x0C, 0x94, 0xEF, 0x08, 0x62, 0x63, 0x75, 0x08, 0x3E, 0x71, 0xAF, 0xA6, 0xFA, 0x5D, 0x8E, 0xA8,\n    0x37, 0x00, 0xB7, 0xDF, 0x4A, 0x4D, 0x6E, 0x92, 0x0A, 0x45, 0x02, 0xF8, 0xF0, 0x08, 0x77, 0x38,\n    0x0C, 0x2B, 0xAE, 0x15, 0xF8, 0x40, 0x6C, 0x40, 0xCC, 0x08, 0x76, 0xB4, 0xD5, 0x92, 0x59, 0x49,\n    0xA0, 0x98, 0xEC, 0x65, 0xCE, 0xCC, 0xAF, 0x8B, 0xC4, 0xA9, 0xE8, 0x2B, 0x23, 0x90, 0xC0, 0x19,\n    0x12, 0x15, 0x23, 0xCE, 0xD4, 0x80, 0x22, 0x82, 0x30, 0x6A, 0x50, 0xFA, 0x6D, 0x3A, 0xBD, 0x4B,\n    0xE1, 0x5B, 0x1A, 0x07, 0x88, 0x4E, 0xD0, 0x42, 0xA6, 0xFD, 0x5E, 0x3C, 0x7F, 0x53, 0x20, 0xDD,\n    0x9C, 0x46, 0xEA, 0xE8, 0x8D, 0x6F, 0x17, 0x57, 0x41, 0x59, 0xEA, 0x27, 0xC7, 0x70, 0xFB, 0x12,\n    0x2D, 0x6C, 0xF7, 0xEF, 0xA7, 0x6A, 0x5C, 0x15, 0x09, 0xE3, 0x63, 0xF1, 0x5B, 0xB8, 0xE4, 0x69,\n    0x92, 0x7C, 0x13, 0x90, 0xBB, 0xA3, 0xE8, 0xF0, 0xC9, 0xF3, 0xD5, 0x27, 0xB7, 0xC4, 0x2B, 0xEB,\n    0x66, 0x19, 0x36, 0x9B, 0x88, 0x88, 0xFD, 0xBA, 0x0F, 0x2E, 0x66, 0x98, 0x94, 0x3C, 0x6F, 0x09,\n    0x0B, 0x89, 0x35, 0x3A, 0x8A, 0x8A, 0x7B, 0xA5, 0x1F, 0x9B, 0x9D, 0x53, 0x67, 0xEE, 0xBC, 0x8C,\n    0x63, 0x83, 0x11, 0x31, 0x87, 0x24, 0x36, 0xBA, 0x7F, 0xC5, 0xA2, 0x06, 0x33, 0x10, 0x79, 0xEC,\n    0x01, 0x89, 0x48, 0x96, 0x2A, 0xC9, 0x25, 0x0F, 0xF3, 0x92, 0x1E, 0x52, 0x93, 0xCD, 0x65, 0x71,\n    0x2B, 0x98, 0xE7, 0xC8, 0x29, 0xA3, 0x21, 0x43, 0xF0, 0x37, 0x3C, 0x36, 0x8E, 0x7F, 0xDC, 0x95,\n    0xA1, 0x56, 0xA1, 0x20, 0xA1, 0xBC, 0x5C, 0x30, 0xDE, 0x52, 0x54, 0xC8, 0x73, 0xCE, 0xA6, 0x30,\n    0x44, 0x0F, 0x3F, 0xA0, 0x7B, 0x7E, 0x11, 0x66, 0x2E, 0xD6, 0xD8, 0x85, 0x5B, 0x56, 0xC1, 0xD3,\n    0xEE, 0xF1, 0x7E, 0xBA, 0x08, 0xF1, 0xA4, 0x49, 0xB3, 0x0C, 0x41, 0xA3, 0xFC, 0xAF, 0xA6, 0x9E,\n    0x90, 0x25, 0x44, 0xC2, 0x36, 0x64, 0x74, 0x38, 0xC9, 0xBC, 0xA5, 0xE8, 0x36, 0x2E, 0x84, 0xCD,\n    0xEA, 0x22, 0x8A, 0x09, 0x94, 0xB2, 0x38, 0x67, 0xC3, 0xBD, 0x7C, 0x79, 0x12, 0x3D, 0xE2, 0xA0,\n    0x0A, 0x1F, 0xCE, 0xE7, 0x1D, 0x7A, 0xB5, 0x2B, 0x4E, 0x62, 0x82, 0x37, 0xEC, 0xFB, 0x7B, 0x05,\n    0xAC, 0xE5, 0x10, 0x60, 0x8B, 0x09, 0x7D, 0xC8, 0x16, 0xE0, 0xFA, 0x78, 0x35, 0x13, 0xF6, 0x8D,\n    0xB0, 0x39, 0x5F, 0xC8, 0xF4, 0x08, 0xCF, 0x0D, 0xA9, 0xA1, 0xC6, 0xE0, 0xDC, 0x0A, 0x4D, 0x54,\n    0x6C, 0x47, 0x16, 0xFD, 0x61, 0x08, 0xD3, 0x90, 0xC3, 0x4A, 0xD2, 0xE0, 0x7E, 0xE9, 0xB1, 0x62,\n    0xBD, 0x15, 0x61, 0xB8, 0x6A, 0xF2, 0x76, 0x66, 0xBB, 0x5C, 0xB6, 0x87, 0x40, 0x8B, 0xFF, 0x90,\n    0x1F, 0xB7, 0x63, 0xF3, 0x73, 0xF4, 0xE9, 0xEB, 0x96, 0xA9, 0x73, 0xA5, 0xF5, 0x94, 0x5E, 0x16,\n    0x9B, 0xB1, 0x9F, 0x2F, 0x6B, 0x9D, 0x13, 0x6F, 0x01, 0xD6, 0xB6, 0x74, 0xA7, 0x86, 0x19, 0x82,\n    0x6F, 0x50, 0x1A, 0x44, 0x5D, 0x47, 0xC5, 0xC5, 0x66, 0xEF, 0x24, 0xE3, 0xA8, 0x16, 0xD3, 0xEB,\n    0x2B, 0x06, 0x54, 0xDB, 0x9B, 0x1F, 0xFE, 0x8D, 0x03, 0x1C, 0x63, 0x4C, 0xFA, 0x7E, 0xB8, 0x5A,\n    0xA3, 0x50, 0x2D, 0xE1, 0x04, 0xE1, 0x15, 0x31, 0xF7, 0xB3, 0x23, 0xD7, 0x0E, 0x78, 0x42, 0x4D,\n    0x28, 0x1F, 0xF2, 0x9D, 0xFC, 0x4A, 0xEC, 0xA1, 0xF2, 0x6E, 0x40, 0xA2, 0xD9, 0xEC, 0x67, 0xDB,\n    0x81, 0x7C, 0xEA, 0x72, 0x38, 0xAF, 0xA2, 0x06, 0xCC, 0xAB, 0x22, 0xFA, 0x5C, 0xF9, 0xB7, 0x9D,\n    0xE5, 0x35, 0x11, 0xE8, 0xB3, 0x01, 0xFB, 0xEF, 0xE8, 0xE4, 0x08, 0x36, 0xDB, 0xB3, 0x83, 0x8D,\n    0xD0, 0xA9, 0xFD, 0xFB, 0x8A, 0x28, 0x60, 0xD3, 0xDC, 0x72, 0x52, 0x40, 0x97, 0x53, 0xBB, 0xA2,\n    0xAF, 0x6F, 0x04, 0x2B, 0xBE, 0x8E, 0x16, 0x2D, 0x0E, 0x7C, 0x2A, 0xEB, 0xC1, 0xC8, 0x6E, 0x96,\n    0x29, 0x1F, 0x64, 0x26, 0xFF, 0x89, 0xF3, 0x2D, 0xF2, 0x26, 0xF0, 0x74, 0x0F, 0x4D, 0x7F, 0x2F,\n    0x61, 0x3C, 0xE9, 0x03, 0x43, 0x82, 0x24, 0x2F, 0x80, 0x42, 0x5D, 0xBE, 0xFA, 0x13, 0x06, 0x0F,\n    0xA8, 0x82, 0x44, 0x04, 0x97, 0xC4, 0x21, 0x21, 0x4C, 0x4D, 0xB4, 0x37, 0xB3, 0x5D, 0xD8, 0xF7,\n    0xDB, 0xC3, 0xC6, 0x21, 0x98, 0xF3, 0x11, 0x7A, 0x8D, 0xD9, 0xE3, 0xD9, 0x7F, 0xF6, 0xED, 0x44,\n    0xCC, 0xCB, 0x2A, 0x2D, 0x22, 0x3C, 0x23, 0x64, 0x25, 0xA0, 0xCC, 0xDE, 0x99, 0x01, 0xE8, 0xCB,\n    0xB4, 0xE6, 0x4D, 0xEB, 0x57, 0xEC, 0xDA, 0xB3, 0x9A, 0x7E, 0xF5, 0xCC, 0x9B, 0x9D, 0x3A, 0xC8,\n    0xD4, 0xA9, 0x39, 0x7D, 0x6A, 0x63, 0xC7, 0x48, 0xFF, 0x8E, 0x36, 0x81, 0x8C, 0x2B, 0x8F, 0x1E,\n    0x52, 0x42, 0xEE, 0x1C, 0xBB, 0xB9, 0xE9, 0xC5, 0xB9, 0x27, 0x47, 0xA7, 0x92, 0x39, 0x01, 0x3E,\n    0x35, 0xA9, 0x6C, 0x47, 0x55, 0x46, 0x07, 0x28, 0x82, 0x5C, 0x0A, 0xC7, 0x07, 0x6A, 0xE0, 0x57,\n    0x9F, 0x3C, 0x08, 0xDA, 0xA2, 0x5E, 0xE8, 0xA1, 0xBC, 0xB2, 0x4F, 0xD1, 0xB0, 0x2E, 0x71, 0xC2,\n    0xAC, 0xA4, 0xF1, 0x8B, 0xE1, 0xF8, 0x30, 0xD6, 0x48, 0xBC, 0x79, 0x74, 0xF6, 0xC3, 0x3F, 0x83,\n    0x75, 0xC4, 0xC5, 0x20, 0xED, 0x01, 0xB6, 0xA9, 0x3B, 0x22, 0xC0, 0x1F, 0xC2, 0x49, 0xF0, 0xA9,\n    0x5F, 0x53, 0x6D, 0x6D, 0xB8, 0xE1, 0x6D, 0x9E, 0xE8, 0xD5, 0x45, 0x34, 0x69, 0x87, 0xF8, 0x42,\n    0x78, 0x1A, 0xD0, 0x07, 0x6A, 0xC6, 0x9E, 0x56, 0xEB, 0xA6, 0xF6, 0x71, 0x88, 0x80, 0x3A, 0xDD,\n    0xDC, 0xC4, 0x8E, 0xA3, 0x74, 0x6D, 0x10, 0xBA, 0x26, 0x98, 0xE1, 0x68, 0x49, 0x6A, 0x86, 0x0F,\n    0x62, 0xA5, 0x75, 0x83, 0xD9, 0x5A, 0xD6, 0x34, 0x81, 0x65, 0x17, 0xA9, 0xD2, 0xF0, 0x35, 0x35,\n    0x27, 0x9D, 0x81, 0x72, 0xAE, 0xA4, 0xC0, 0xFE, 0x09, 0x95, 0xFA, 0x3D, 0x78, 0xEA, 0x3D, 0xA5,\n    0xA9, 0xB6, 0x4B, 0x91, 0xBA, 0x31, 0x44, 0xCD, 0xD6, 0x94, 0x7A, 0x38, 0x40, 0x75, 0xD6, 0x4C,\n    0x6F, 0x30, 0x8A, 0x8E, 0xF6, 0x75, 0x50, 0x70, 0x17, 0x28, 0xED, 0x0B, 0xDF, 0xEB, 0x8B, 0x94,\n    0x05, 0x9B, 0x85, 0x7A, 0xAA, 0xE7, 0x76, 0xE4, 0x5D, 0x9D, 0x2A, 0x02, 0x9A, 0x96, 0x70, 0xA4,\n    0xC5, 0x4D, 0x90, 0x18, 0x5D, 0x31, 0x2E, 0x49, 0xFF, 0xA9, 0xBE, 0x9D, 0x9E, 0x7F, 0x6E, 0x0A,\n    0x08, 0x04, 0x83, 0x43, 0xA1, 0x5B, 0x44, 0xA4, 0xAC, 0x66, 0xE1, 0x5A, 0xA3, 0x70, 0xED, 0x00,\n    0x84, 0x53, 0x0E, 0x52, 0x22, 0x29, 0x3D, 0x14, 0x9D, 0x9C, 0x1C, 0xBC, 0x0A, 0x19, 0xC0, 0x7B,\n    0xED, 0xBC, 0x4D, 0x15, 0x8B, 0xEC, 0x99, 0xF7, 0x68, 0x76, 0xCD, 0x3C, 0x11, 0x57, 0x28, 0x49,\n    0xF1, 0x0F, 0x7F, 0x74, 0x24, 0x40, 0x05, 0x98, 0xFF, 0xF4, 0xE7, 0xB7, 0x84, 0xDB, 0x55, 0x09,\n    0xD6, 0x0B, 0xE4, 0x5B, 0xF9, 0xFF, 0xB1, 0x2E, 0x25, 0x00, 0x3C, 0x9A, 0xEE, 0x1B, 0x24, 0x07,\n    0x3C, 0xE1, 0xA9, 0xB1, 0x90, 0x44, 0x73, 0x1E, 0xD1, 0xFA, 0x00, 0x35, 0xF5, 0x79, 0xAB, 0xDE,\n    0xB3, 0x5E, 0x62, 0x56, 0x0B, 0xCC, 0xA3, 0x49, 0x67, 0x44, 0x79, 0x85, 0x3A, 0x5D, 0x2B, 0x9D,\n    0xA3, 0x57, 0x44, 0x97, 0x2A, 0x50, 0x34, 0xA9, 0x2F, 0x20, 0xE7, 0x58, 0x49, 0xF9, 0x54, 0x8F,\n    0x9B, 0xE1, 0xCC, 0x44, 0xC2, 0x27, 0xBE, 0x60, 0xDD, 0x6E, 0x4D, 0xFB, 0xA8, 0xB7, 0x5E, 0xFA,\n    0xBF, 0xDE, 0xF2, 0xB2, 0xDE, 0xF9, 0x55, 0x40, 0xD3, 0xB7, 0x63, 0x56, 0x74, 0x2D, 0x12, 0x37,\n    0x2D, 0xD6, 0x7E, 0x84, 0x63, 0x3E, 0xAD, 0x44, 0x69, 0x58, 0x8D, 0xEE, 0x9A, 0xA2, 0xF7, 0xFD,\n    0x90, 0x05, 0xD3, 0x52, 0x2C, 0x53, 0xFF, 0xA0, 0xC3, 0x42, 0xE9, 0x6E, 0x61, 0x68, 0xE9, 0x88,\n    0x39, 0x35, 0xD7, 0xA0, 0x03, 0xDA, 0x49, 0x0E, 0x9C, 0x03, 0xE4, 0x87, 0x95, 0xA5, 0xD9, 0xD6,\n    0x29, 0xA2, 0xFB, 0x63, 0x9E, 0xDE, 0x7C, 0x9E, 0x1E, 0xAF, 0x86, 0xC8, 0xD0, 0x27, 0x5E, 0xE1,\n    0xD3, 0xC6, 0x3A, 0x60, 0xD8, 0x43, 0xD7, 0xDC, 0xFB, 0xC5, 0x72, 0xBF, 0xCF, 0xBD, 0x3A, 0x16,\n    0xEF, 0x79, 0xC6, 0x3E, 0xB4, 0x27, 0x4C, 0x60, 0x2B, 0x4C, 0xAF, 0x44, 0x26, 0x1E, 0xAB, 0xEC,\n    0xB2, 0xCE, 0xD6, 0xD1, 0x71, 0xFE, 0x8A, 0xE2, 0xA5, 0x6C, 0x53, 0x89, 0x84, 0x08, 0x8E, 0x79,\n    0x41, 0xE7, 0xBB, 0x36, 0x8F, 0xFA, 0x81, 0xED, 0x6D, 0x7B, 0x4F, 0x4B, 0x52, 0xC9, 0x03, 0x83,\n    0x65, 0xC4, 0xF3, 0x28, 0xC3, 0x44, 0x25, 0x85, 0x5D, 0x6D, 0x07, 0x38, 0xDE, 0xC3, 0x33, 0x6E,\n    0x09, 0x16, 0x64, 0x3F, 0x2F, 0x8A, 0x22, 0x53, 0xEE, 0xDB, 0x1B, 0xF1, 0x41, 0xD2, 0xE5, 0x26,\n    0xD2, 0xD5, 0x9F, 0x2B, 0x1E, 0x78, 0xFE, 0x81, 0x03, 0x68, 0x79, 0x7C, 0xEB, 0x3E, 0x71, 0xF0,\n    0x64, 0x28, 0xA0, 0x3E, 0x54, 0x44, 0x2B, 0x56, 0x21, 0x11, 0xD6, 0xD7, 0x35, 0xB3, 0xFD, 0xC1,\n    0xE5, 0xE6, 0x10, 0xB3, 0xCC, 0xD5, 0x24, 0x25, 0xE0, 0xF6, 0x1A, 0x0F, 0xF9, 0xD5, 0x34, 0x72,\n    0x26, 0xD1, 0x9F, 0xFA, 0xFA, 0x41, 0x1C, 0x22, 0x97, 0x99, 0x16, 0x41, 0xA8, 0xDC, 0x3B, 0x59,\n    0xC6, 0xB1, 0x9E, 0xB6, 0x10, 0xD1, 0xD3, 0x36, 0xC8, 0x12, 0x73, 0x4D, 0x7D, 0xD0, 0xFE, 0xF5,\n    0x82, 0x0A, 0x4A, 0x20, 0x5C, 0xE1, 0x7F, 0x19, 0xFD, 0x1B, 0x34, 0x14, 0xE1, 0x8A, 0xDB, 0x01,\n    0x9B, 0xF8, 0x68, 0x78, 0x2E, 0x9B, 0x6A, 0x3C, 0xF5, 0x86, 0x67, 0xF7, 0x6D, 0x92, 0xF3, 0xD6,\n    0x00, 0x77, 0x6B, 0x5F, 0x60, 0x16, 0xE6, 0x41, 0xAB, 0xF6, 0x51, 0xC5, 0x0D, 0xF0, 0x96, 0x13,\n    0xBB, 0x14, 0x82, 0x44, 0xD1, 0xCC, 0x86, 0xDE, 0xC1, 0x51, 0x88, 0xE3, 0x72, 0x02, 0x5B, 0x41,\n    0xA2, 0x43, 0x0E, 0xEC, 0x3B, 0xEE, 0xAB, 0xB7, 0xEE, 0xAC, 0xCA, 0x84, 0x71, 0x3F, 0x9F, 0xB7,\n    0x59, 0x4F, 0x7B, 0x2C, 0x76, 0x10, 0xF1, 0xF8, 0xDC, 0x88, 0x8D, 0x03, 0x76, 0x6D, 0x1D, 0x4B,\n    0x98, 0x08, 0x74, 0x1D, 0x2E, 0xD5, 0xFC, 0xF3, 0x68, 0x27, 0xB3, 0xA1, 0x89, 0x26, 0x5E, 0x8D,\n    0x5C, 0xE4, 0x86, 0x9B, 0x10, 0xF0, 0x86, 0xC3, 0xE0, 0x76, 0xFF, 0x8B, 0x8C, 0x39, 0x32, 0x4E,\n    0xF8, 0xF3, 0x86, 0xE6, 0x0C, 0x6A, 0x00, 0xEB, 0x7F, 0xBD, 0xDE, 0x7F, 0x0C, 0x80, 0xBA, 0x8B,\n    0xEA, 0x8D, 0x20, 0xCB, 0x86, 0x81, 0x1B, 0x44, 0x49, 0x65, 0xD1, 0xFA, 0x12, 0xD8, 0x1B, 0xD7,\n    0x6D, 0xA7, 0xF6, 0x53, 0x19, 0x8D, 0x9A, 0x04, 0x34, 0xB2, 0x15, 0xDD, 0xE7, 0x46, 0x75, 0xAA,\n    0x90, 0xEC, 0x41, 0x9C, 0x93, 0xBA, 0xFD, 0xFE, 0x08, 0xFD, 0x86, 0x73, 0x7C, 0x93, 0xB6, 0xD0,\n    0x3E, 0x16, 0x82, 0x05, 0x01, 0xC4, 0xBE, 0x9C, 0x24, 0x05, 0x94, 0x53, 0x25, 0xBD, 0x67, 0x48,\n    0x7C, 0x66, 0xDC, 0xB6, 0x9D, 0x28, 0x26, 0x22, 0xFA, 0x5D, 0xF6, 0x39, 0x31, 0x1D, 0xDA, 0xAA,\n    0x1A, 0x04, 0x40, 0x33, 0x67, 0xA5, 0x97, 0x48, 0xB1, 0x06, 0xFB, 0x9A, 0xEC, 0xF0, 0x04, 0x5F,\n    0x11, 0x26, 0x23, 0x93, 0x90, 0x48, 0x72, 0x92, 0xBD, 0xB8, 0xA6, 0xD1, 0xEE, 0x70, 0xFD, 0xB8,\n    0x53, 0x91, 0x62, 0xC1, 0x48, 0x0D, 0x70, 0xBB, 0xCD, 0xD4, 0xC3, 0xA1, 0x3D, 0x24, 0x42, 0x59,\n    0xD6, 0x3B, 0xA0, 0xD0, 0xAC, 0x89, 0x07, 0x45, 0x66, 0xC9, 0x1D, 0xBF, 0x66, 0xC4, 0xF9, 0x5D,\n    0x90, 0x3D, 0x84, 0x10, 0x62, 0x21, 0x37, 0x78, 0x8D, 0x27, 0xF2, 0x01, 0xA8, 0xD0, 0x2E, 0x81,\n    0xA0, 0xDB, 0x8D, 0x89, 0x78, 0x10, 0xBB, 0x49, 0x60, 0xA0, 0x50, 0x11, 0x6B, 0x04, 0xF3, 0x2E,\n    0x41, 0xBF, 0x00, 0xC4, 0xFA, 0xA8, 0x3B, 0x93, 0x9C, 0x90, 0x29, 0xD6, 0xBD, 0xC4, 0xE9, 0x26,\n    0xE2, 0xDB, 0xE8, 0x7E, 0xD6, 0xA7, 0xE7, 0x55, 0x61, 0x5E, 0x46, 0x82, 0x32, 0x8D, 0xD4, 0x96,\n    0xF5, 0x6B, 0xB3, 0x1D, 0x18, 0xA9, 0xAA, 0x8A, 0x22, 0x49, 0xF7, 0xB7, 0x36, 0xF7, 0xD0, 0x96,\n    0x2E, 0xC6, 0x73, 0x99, 0x93, 0x63, 0x12, 0x18, 0xF3, 0x82, 0x50, 0xE1, 0x96, 0x1B, 0x7E, 0xA9,\n    0x29, 0xFF, 0xFA, 0x75, 0x07, 0x82, 0x7D, 0x94, 0x4C, 0x2D, 0xCC, 0x06, 0xAD, 0x41, 0xF3, 0xB5,\n    0xF3, 0x6E, 0xAD, 0x8A, 0xDD, 0x7B, 0x7F, 0xE4, 0x7D, 0x58, 0xA8, 0x6D, 0x7C, 0xED, 0x9C, 0x1B,\n    0x63, 0x94, 0xD6, 0x81, 0x43, 0x1B, 0x8C, 0x1B, 0x7F, 0xB9, 0x1C, 0xB4, 0xD5, 0xB7, 0xBD, 0xED,\n    0xAA, 0x8D, 0xE4, 0x06, 0xE8, 0x88, 0xDB, 0xB5, 0xCB, 0xE9, 0xA5, 0x30, 0xA6, 0xD9, 0xA0, 0x99,\n    0x5F, 0x53, 0xC5, 0x9E, 0x4E, 0x29, 0xBB, 0xE5, 0xC5, 0xA4, 0xD9, 0x99, 0x86, 0xF1, 0x11, 0xE1,\n    0x4A, 0x5D, 0xCB, 0xD4, 0xF4, 0xBC, 0x66, 0x87, 0x33, 0x93, 0x76, 0xBC, 0x10, 0x4E, 0xC1, 0xB3,\n    0x0B, 0x00, 0xF5, 0x0C, 0x57, 0x9A, 0xC5, 0x30, 0x45, 0xCC, 0xDE, 0x08, 0xF0, 0x1C, 0x4C, 0x6D,\n    0xA9, 0xD8, 0x6C, 0x65, 0x7A, 0xC5, 0x0A, 0xE2, 0x0A, 0x47, 0xB4, 0x2F, 0x82, 0x0A, 0x8B, 0x12,\n    0xF5, 0xF5, 0xC4, 0x08, 0x17, 0x89, 0x4B, 0xEB, 0x11, 0x9E, 0x1F, 0x2E, 0x2A, 0x24, 0xDF, 0x15,\n    0xC0, 0x1B, 0x04, 0xCE, 0x07, 0x10, 0xB5, 0x26, 0x81, 0xC4, 0x4C, 0xA5, 0x14, 0x5B, 0x17, 0x57,\n    0x38, 0x61, 0xF9, 0x2A, 0x25, 0x0E, 0x51, 0x15, 0x5B, 0xEB, 0x85, 0xFE, 0xAA, 0x3E, 0xB6, 0x10,\n    0x6E, 0x20, 0xAF, 0xAC, 0xFA, 0xE7, 0x86, 0xFF, 0x96, 0xA9, 0xB3, 0xB7, 0x86, 0xAC, 0x2C, 0x53,\n    0xD9, 0x0A, 0x7A, 0x01, 0xE1, 0x58, 0xBD, 0x8C, 0x7C, 0xB0, 0x7F, 0xBB, 0x70, 0x9B, 0xE1, 0x9A,\n    0xB8, 0x0E, 0x5D, 0xC9, 0x5D, 0x90, 0xBE, 0x2F, 0x94, 0xCE, 0x2E, 0x28, 0xFB, 0x09, 0xF8, 0xC0,\n    0x11, 0x31, 0x2F, 0xE2, 0xFF, 0xE1, 0x63, 0xE8, 0x58, 0xB9, 0x4D, 0x27, 0x02, 0x7A, 0x05, 0xF0,\n    0x61, 0x70, 0x34, 0xAA, 0xB6, 0xCC, 0xA1, 0xB8, 0xC3, 0x53, 0xAE, 0x1B, 0x0D, 0xB6, 0x2B, 0x3D,\n    0x84, 0x5A, 0xC4, 0x12, 0xDF, 0x6C, 0x60, 0x73, 0x28, 0xE1, 0x07, 0xFF, 0x2C, 0x04, 0xE8, 0xF1,\n    0x86, 0xCE, 0x38, 0x1E, 0xDE, 0x06, 0x14, 0x59, 0x2A, 0x91, 0x24, 0x6C, 0x72, 0x7A, 0xB6, 0x2A,\n    0x1A, 0x74, 0xB6, 0x5F, 0x88, 0xE3, 0xC0, 0xC9, 0x28, 0xDE, 0xE5, 0x4B, 0x08, 0x7F, 0xD1, 0x75,\n    0x2D, 0xF6, 0x9E, 0x91, 0x8D, 0xF0, 0x79, 0x6A, 0x0C, 0xA2, 0x19, 0xD4, 0xDE, 0xE6, 0x45, 0xFC,\n    0x66, 0xA0, 0xB8, 0x24, 0x1D, 0x88, 0xDD, 0x31, 0x2C, 0x99, 0x02, 0x86, 0xC7, 0xF7, 0xA9, 0xFF,\n    0x19, 0x61, 0x2E, 0xFA, 0xCE, 0xD2, 0x46, 0xD5, 0x89, 0xD1, 0xBC, 0x3E, 0x03, 0x21, 0x13, 0x14,\n    0x65, 0x1C, 0x15, 0x54, 0xAB, 0x22, 0xA0, 0x52, 0xEA, 0xEC, 0xB5, 0x8D, 0x7B, 0xC7, 0xFC, 0x9A,\n    0x1C, 0x30, 0x1D, 0x50, 0x6A, 0xB6, 0xA4, 0x0F, 0x57, 0xE4, 0x6B, 0xBD, 0x69, 0x79, 0xF8, 0x75,\n    0x43, 0xBE, 0xDC, 0x5C, 0xAD, 0xC0, 0xB8, 0xEF, 0xF1, 0x57, 0xB7, 0xEE, 0xAB, 0xBA, 0x94, 0xBD,\n    0xEE, 0x62, 0x0C, 0x99, 0xC8, 0xC1, 0x7C, 0x07, 0xCE, 0xE0, 0x51, 0x34, 0x67, 0x8D, 0xFD, 0x89,\n    0x7E, 0xFD, 0x56, 0xBC, 0xD1, 0x3E, 0x4C, 0x30, 0x11, 0xA4, 0x2C, 0x4E, 0x98, 0xA3, 0xAC, 0xD4,\n    0x34, 0xE4, 0xD2, 0x30, 0xA5, 0xC6, 0xD5, 0xBE, 0xE9, 0x93, 0x20, 0x2E, 0xD0, 0xD3, 0x27, 0x6C,\n    0x18, 0xB3, 0xE4, 0x38, 0x09, 0x93, 0x49, 0xE7, 0xB3, 0x25, 0xDF, 0x5F, 0x80, 0x36, 0xC4, 0x74,\n    0x03, 0x3B, 0x12, 0x0C, 0x4E, 0xA3, 0x79, 0x42, 0x15, 0xC8, 0x7D, 0xE3, 0xCD, 0xED, 0x30, 0x3F,\n    0x23, 0x11, 0x15, 0x37, 0xB5, 0x03, 0x04, 0x1D, 0xD3, 0x9E, 0x6B, 0x68, 0x78, 0xE7, 0xBF, 0xB6,\n    0x3D, 0x89, 0x21, 0xF9, 0xAA, 0xC4, 0xD7, 0x54, 0x17, 0xD6, 0xF3, 0x3E, 0xDC, 0xE9, 0xB3, 0x87,\n    0xA0, 0x3B, 0x6A, 0x54, 0xB0, 0x6D, 0x9E, 0xB0, 0xC2, 0x48, 0xA7, 0xE9, 0x29, 0xEB, 0xDF, 0x88,\n    0xE6, 0x9F, 0x4B, 0x83, 0xAF, 0x29, 0x4F, 0x30, 0x62, 0x37, 0xC5, 0x23, 0xFB, 0x19, 0x08, 0x1D,\n    0xFF, 0xA3, 0x19, 0xB2, 0xEB, 0xBF, 0x68, 0x88, 0xBC, 0x1F, 0x9A, 0xE5, 0x2A, 0x24, 0x46, 0xC0,\n    0x87, 0x82, 0x7F, 0x49, 0x7F, 0x71, 0x50, 0x69, 0xD6, 0x57, 0x27, 0x58, 0x64, 0xFD, 0x06, 0xB8,\n    0x05, 0x5D, 0x74, 0xD0, 0x33, 0xFC, 0x5A, 0x34, 0x6F, 0x1E, 0xB3, 0x0E, 0xFE, 0x6B, 0x27, 0xCE,\n    0x3A, 0x51, 0x2D, 0xF5, 0x48, 0x4C, 0x27, 0x36, 0x26, 0x87, 0xE7, 0x3B, 0xB6, 0x64, 0x95, 0x5C,\n    0x73, 0x3D, 0xD4, 0x2C, 0x4C, 0x03, 0x02, 0x9F, 0x0E, 0xBD, 0xF0, 0xA3, 0x4C, 0xE6, 0xC9, 0xE1,\n    0xBE, 0x4C, 0x1A, 0xBD, 0xE8, 0x39, 0x75, 0xEC, 0xAA, 0x0A, 0x3D, 0xED, 0x77, 0x57, 0x44, 0x92,\n    0xF3, 0xE6, 0x86, 0xFA, 0x11, 0x75, 0x7C, 0xA2, 0x1A, 0xF3, 0x36, 0x95, 0xA5, 0xE4, 0xAB, 0x77,\n    0x8A, 0xA5, 0xCF, 0x72, 0xAB, 0x7B, 0xBC, 0xB7, 0x4F, 0x9A, 0xB3, 0xD6, 0xE6, 0xA7, 0x76, 0x8E,\n    0x44, 0xD3, 0x4B, 0x2D, 0xC7, 0xC9, 0xCA, 0x1C, 0xE4, 0x94, 0x86, 0x60, 0xF9, 0x9E, 0xEC, 0xA9,\n    0xD8, 0x47, 0xF1, 0xAB, 0xD7, 0x08, 0x89, 0x63, 0xA4, 0x1D, 0x6C, 0xC7, 0xCC, 0x62, 0xB5, 0xC6,\n    0x92, 0x1C, 0x12, 0x49, 0x3E, 0x35, 0x01, 0x44, 0x64, 0x3F, 0xEC, 0x73, 0x79, 0x88, 0xC2, 0x57,\n    0x34, 0x41, 0x49, 0x9D, 0xF6, 0xE9, 0x4D, 0xCC, 0xE1, 0x96, 0xCF, 0x21, 0xA6, 0xFA, 0x9E, 0x1C,\n    0xDC, 0x6A, 0x0A, 0x97, 0x46, 0x9A, 0x4B, 0x97, 0x7C, 0x24, 0x10, 0x85, 0x83, 0xE7, 0x17, 0x36,\n    0xB9, 0xE6, 0x5D, 0xA0, 0x56, 0xAD, 0xBE, 0xB5, 0x8B, 0x30, 0xD0, 0xC0, 0x67, 0x0E, 0x7D, 0x85,\n    0xD1, 0x8A, 0x3B, 0x9F, 0xF4, 0x63, 0x67, 0xC1, 0x37, 0xEC, 0xFF, 0x5F, 0x61, 0x4A, 0x98, 0xDC,\n    0xF4, 0x01, 0x59, 0x5F, 0xBC, 0xF0, 0x7D, 0x3A, 0xD3, 0x2F, 0x19, 0x4F, 0xB1, 0x85, 0x18, 0x3D,\n    0x4F, 0x99, 0xA0, 0x61, 0x3B, 0x7C, 0x56, 0x56, 0x00, 0x5C, 0x4E, 0xD9, 0x49, 0x66, 0xDF, 0xF5,\n    0x28, 0xA3, 0x83, 0x9E, 0xAA, 0xC7, 0x6D, 0xE1, 0xF6, 0xEB, 0x7D, 0x61, 0xFF, 0xFA, 0xDC, 0x26,\n    0x46, 0x69, 0x66, 0x77, 0x2B, 0x68, 0xA9, 0x63, 0xD0, 0x55, 0xA1, 0xFF, 0xFB, 0xC6, 0x87, 0xF1,\n    0x01, 0x83, 0x4D, 0x1D, 0xD6, 0x26, 0x51, 0x36, 0x7F, 0x85, 0x73, 0xF7, 0x77, 0xD5, 0x03, 0xCF,\n    0x76, 0x40, 0xA9, 0xDC, 0x7C, 0x03, 0xFE, 0x59, 0x8C, 0xF7, 0x93, 0x64, 0x7A, 0x0E, 0xA3, 0xB6,\n    0x6B, 0xAD, 0xBD, 0xD3, 0xB0, 0x43, 0xC6, 0xCA, 0x9D, 0x10, 0x04, 0x96, 0xB1, 0xCE, 0xEF, 0x1B,\n    0x8D, 0xE2, 0x67, 0x20, 0x4F, 0x96, 0x2E, 0x6C, 0x6D, 0x21, 0xEC, 0x74, 0x0F, 0x23, 0xAE, 0x60,\n    0x92, 0xB6, 0x19, 0x51, 0xFF, 0x96, 0xA9, 0xC5, 0xF1, 0x04, 0x50, 0x02, 0xCE, 0xB1, 0x5E, 0x83,\n    0x06, 0x5C, 0x41, 0xB5, 0x2E, 0xBE, 0xDE, 0xB7, 0x39, 0x4C, 0x22, 0xBB, 0x92, 0x4C, 0x74, 0x76,\n    0x9C, 0xDD, 0xE8, 0xF4, 0xDF, 0xFF, 0xD3, 0x8F, 0x4D, 0xE8, 0xAF, 0xEA, 0xA1, 0xEC, 0x02, 0x32,\n    0x37, 0xF0, 0xD5, 0xA4, 0x0A, 0x4C, 0x1C, 0x60, 0xE6, 0x95, 0x84, 0x9C, 0xF8, 0xC0, 0x16, 0x7B,\n    0x88, 0xE6, 0x97, 0x82, 0x0C, 0x6A, 0xEC, 0xE5, 0x8C, 0x9B, 0xFF, 0x96, 0x6D, 0xD5, 0x04, 0xE7,\n    0x59, 0xD0, 0xB0, 0xCE, 0x6F, 0x9D, 0xBB, 0x7E, 0x09, 0x82, 0xDD, 0xC0, 0xE5, 0x37, 0xB9, 0x07,\n    0xF0, 0x6E, 0xBA, 0x8C, 0x19, 0x77, 0xA4, 0x21, 0xCB, 0xE1, 0xFA, 0x14, 0xC2, 0x68, 0xBF, 0x86,\n    0xC0, 0xEE, 0xB3, 0xED, 0x17, 0x8D, 0x99, 0x70, 0x01, 0x61, 0xBF, 0x92, 0x18, 0xA9, 0x2C, 0xEE,\n    0x94, 0xB4, 0x88, 0x35, 0x21, 0x56, 0xD1, 0x02, 0xA8, 0xC4, 0x12, 0x34, 0x69, 0x7E, 0x1A, 0xFC,\n    0x64, 0x66, 0x32, 0x8E, 0xA4, 0x1C, 0xB9, 0xDD, 0x37, 0xF0, 0x52, 0xC6, 0x76, 0x5A, 0xEA, 0x4F,\n    0x49, 0xD3, 0x1C, 0x83, 0x90, 0x96, 0x35, 0x67, 0x65, 0x38, 0x86, 0xE2, 0x45, 0xA9, 0xC4, 0x07,\n    0x59, 0xAE, 0xCC, 0xD5, 0xDD, 0x88, 0xDE, 0xF2, 0x52, 0xD9, 0x88, 0x02, 0x10, 0x13, 0x62, 0x8C,\n    0x5A, 0x32, 0x76, 0x80, 0x31, 0xD0, 0xF2, 0x91, 0x22, 0x51, 0x26, 0x3C, 0xD6, 0xA4, 0x1A, 0x61,\n    0x5A, 0xB2, 0x7D, 0xE7, 0xCD, 0x71, 0x0B, 0x28, 0xB2, 0x3F, 0xA6, 0x38, 0xDC, 0xD9, 0x61, 0xD0,\n    0xE5, 0xC8, 0x0F, 0xF1, 0xC9, 0x04, 0x09, 0x4A, 0x9F, 0x91, 0x7C, 0xEA, 0x88, 0x74, 0xC0, 0x32,\n    0xB2, 0xCE, 0xBB, 0xA7, 0xE1, 0x95, 0x4E, 0xEF, 0xA0, 0x6F, 0xE0, 0x75, 0xC3, 0x9F, 0x44, 0x02,\n    0xF1, 0x06, 0x0B, 0xFD, 0xC8, 0x11, 0x0B, 0xCB, 0xCF, 0x19, 0xE1, 0x64, 0xDE, 0x8D, 0xEE, 0x97,\n    0x37, 0x48, 0x5F, 0xF6, 0xE7, 0xCE, 0x5C, 0x7A, 0xB7, 0xC6, 0xAB, 0x4F, 0x9A, 0x33, 0x2C, 0xBF,\n    0x7A, 0x2F, 0xEE, 0x28, 0x90, 0xD6, 0x6E, 0x8A, 0x6D, 0xE0, 0xDE, 0x0E, 0x2B, 0x2B, 0xE1, 0x36,\n    0xBA, 0xD6, 0xE7, 0x1A, 0x3C, 0x2F, 0x34, 0xF3, 0x39, 0xE2, 0x22, 0x33, 0x91, 0xEB, 0xFF, 0x1C,\n    0x00, 0x09, 0x82, 0xFE, 0xAB, 0x1E, 0x1F, 0x40, 0x5E, 0x05, 0xF5, 0x6B, 0xCD, 0x52, 0xAB, 0xEA,\n    0x52, 0x91, 0x23, 0x26, 0x91, 0x6F, 0xEF, 0xA3, 0x46, 0x70, 0xD9, 0x00, 0x79, 0xE6, 0x06, 0x2F,\n    0x31, 0x2A, 0x35, 0x5F, 0x29, 0xDA, 0x7A, 0xF6, 0xE2, 0x5B, 0xFA, 0x50, 0x5F, 0x27, 0xD9, 0x5E,\n    0x3D, 0x72, 0x2C, 0xE5, 0x6F, 0x6C, 0xFA, 0x73, 0x2D, 0x5C, 0x02, 0xFF, 0x64, 0xF7, 0xBB, 0xC0,\n    0x4D, 0x72, 0xCD, 0x3A, 0x68, 0xA8, 0xD0, 0xD4, 0xB4, 0x36, 0x25, 0x4D, 0xD2, 0xF2, 0x72, 0x2E,\n    0x29, 0x6A, 0x5C, 0xAE, 0x53, 0x36, 0x26, 0x24, 0x2D, 0x40, 0x7B, 0xE2, 0x95, 0xB1, 0x38, 0xCC,\n    0x98, 0xC3, 0xCA, 0xFD, 0xD2, 0x14, 0x20, 0x67, 0x69, 0xFE, 0xA8, 0x3F, 0xE7, 0xA4, 0xF5, 0x12,\n    0x72, 0x45, 0x35, 0x09, 0xFB, 0x41, 0x5E, 0xF7, 0x14, 0xC7, 0x6B, 0xF6, 0x14, 0x1B, 0x3D, 0xB6,\n    0x30, 0xE2, 0x9E, 0xDA, 0xCE, 0x71, 0xF1, 0x7E, 0xAB, 0xD6, 0xE3, 0xFE, 0x81, 0xFB, 0x0B, 0x46,\n    0xDB, 0x92, 0xBF, 0x0C, 0x78, 0x48, 0x26, 0xD7, 0x06, 0xD2, 0x25, 0x24, 0x07, 0x94, 0xBD, 0x4B,\n    0x1F, 0xC4, 0x97, 0x13, 0x45, 0xD3, 0x34, 0x7C, 0x6B, 0x6F, 0x2A, 0xD7, 0x4B, 0x2C, 0xF3, 0x4D,\n    0x30, 0x8E, 0x6F, 0x08, 0x59, 0x23, 0xAD, 0x3C, 0xE0, 0xF8, 0xF1, 0xC5, 0x6D, 0xF2, 0xB2, 0x8C,\n    0x1B, 0xB4, 0x0D, 0x06, 0xAE, 0xBC, 0x9A, 0x26, 0xE8, 0x1B, 0xB1, 0x69, 0x57, 0xE9, 0x61, 0x9A,\n    0xDF, 0xF2, 0xEA, 0x46, 0xC8, 0x1D, 0x49, 0xA1, 0x0F, 0x7A, 0x0D, 0xFC, 0xC7, 0x45, 0xC5, 0x8B,\n    0xBC, 0xF7, 0x0B, 0x7E, 0x27, 0x60, 0x42, 0xD5, 0x5C, 0x7F, 0x99, 0x77, 0x57, 0x3A, 0x9F, 0x7B,\n    0xC2, 0xE1, 0xDF, 0x96, 0xD4, 0x70, 0x25, 0x5A, 0xBB, 0xC0, 0xEC, 0xB4, 0xC6, 0x93, 0x21, 0x29,\n    0x96, 0xEC, 0x47, 0x41, 0x6C, 0xE3, 0x60, 0xFC, 0x40, 0x7F, 0x47, 0x1D, 0x8A, 0x19, 0x2C, 0xE9,\n    0x10, 0x1B, 0x3B, 0x1A, 0x35, 0x29, 0xE4, 0xA6, 0xBC, 0x6B, 0x35, 0x37, 0xF5, 0x39, 0xCD, 0x03,\n    0x4E, 0x9A, 0x88, 0xF8, 0x88, 0xE1, 0x20, 0x6A, 0xA2, 0x77, 0xD0, 0xF0, 0x82, 0x3E, 0x23, 0x95,\n    0x1C, 0x72, 0x06, 0xF6, 0x08, 0x0A, 0x79, 0x0C, 0x96, 0x0B, 0x6A, 0x19, 0x13, 0x66, 0x3F, 0xA3,\n    0xC4, 0xBB, 0x63, 0x21, 0x8E, 0x83, 0xF9, 0x61, 0x82, 0xC5, 0x0E, 0x47, 0x79, 0x9C, 0x09, 0x7C,\n    0xD2, 0xEE, 0x52, 0x06, 0xDA, 0xAF, 0x4A, 0x69, 0xAA, 0x8C, 0xA1, 0x74, 0x33, 0x7E, 0x58, 0x0A,\n    0x5C, 0xA9, 0x08, 0x8A, 0x9F, 0x89, 0x3D, 0x72, 0xC4, 0x6B, 0x26, 0xED, 0xCB, 0x46, 0xFA, 0x0A,\n    0x5C, 0x6E, 0x3C, 0x66, 0x36, 0xC7, 0x5B, 0xEF, 0xCE, 0x59, 0x9F, 0xF1, 0x41, 0xED, 0xA5, 0x70,\n    0x97, 0xF4, 0xD7, 0xB5, 0x56, 0xFC, 0xBC, 0x50, 0xB6, 0xB4, 0x61, 0xED, 0x8E, 0x5E, 0xF0, 0x50,\n    0xF0, 0x96, 0xF7, 0x81, 0xAD, 0xE2, 0x8C, 0xA7, 0xB8, 0xC7, 0x17, 0xD5, 0x0C, 0x80, 0xB7, 0x7B,\n    0xA4, 0xD9, 0x89, 0x04, 0xF2, 0x7B, 0xF8, 0x89, 0x8F, 0x58, 0x8B, 0x88, 0xEF, 0x6E, 0x9A, 0xCB,\n    0x67, 0xBA, 0x32, 0xA7, 0x68, 0x92, 0x0A, 0xD7, 0xC9, 0xB9, 0x8B, 0xE6, 0x44, 0x0C, 0x38, 0x39,\n    0x14, 0xBF, 0x0C, 0xE4, 0x68, 0x13, 0xB2, 0x2A, 0x0D, 0x2E, 0xA8, 0x53, 0x46, 0x3D, 0xF5, 0xC6,\n    0x67, 0x8B, 0x2C, 0x50, 0x94, 0xD5, 0x4A, 0xB3, 0xDA, 0xB0, 0x1F, 0xDD, 0x17, 0xED, 0xF9, 0xF5,\n    0xDB, 0x1F, 0x96, 0x33, 0xE9, 0x81, 0x28, 0x86, 0x04, 0xAA, 0x0E, 0xEF, 0x8B, 0x6D, 0xE0, 0xA2,\n    0x26, 0x34, 0xFF, 0x6D, 0xFE, 0x57, 0xB1, 0x0A, 0xE7, 0xE5, 0x7D, 0xD4, 0x13, 0xEF, 0xC8, 0xDC,\n    0xFE, 0xFA, 0x0A, 0xF7, 0x34, 0x75, 0x37, 0xDC, 0xA3, 0x96, 0xDA, 0x18, 0x75, 0xA3, 0x2D, 0x93,\n    0xD4, 0x2F, 0xD7, 0xDE, 0x4B, 0xA2, 0x9C, 0x6A, 0x15, 0x36, 0xC5, 0x1F, 0x69, 0x82, 0x0C, 0x65,\n    0x8C, 0x5E, 0x96, 0x07, 0xF7, 0x5D, 0x7B, 0x22, 0x7C, 0xAB, 0x0D, 0x91, 0xD7, 0xAC, 0xB4, 0x9F,\n    0x46, 0x82, 0x81, 0xF8, 0xCC, 0xA6, 0x88, 0x6D, 0xEA, 0x36, 0xB3, 0x0B, 0xA7, 0xC8, 0xB6, 0xBD,\n    0xC8, 0x74, 0x26, 0x09, 0x57, 0xE4, 0xBD, 0x39, 0x86, 0xD9, 0xED, 0x2A, 0xA9, 0x77, 0x6B, 0xD3,\n    0x77, 0xF9, 0x92, 0xEB, 0x1C, 0xF1, 0xB8, 0x97, 0xBD, 0x8E, 0xCB, 0xCB, 0xF7, 0x1A, 0xBC, 0x12,\n    0x98, 0x79, 0x56, 0xD4, 0x0D, 0x31, 0xDE, 0xBF, 0xB9, 0x12, 0x82, 0xA2, 0x69, 0x7A, 0x55, 0x23,\n    0x73, 0xF6, 0xF8, 0xA6, 0x12, 0xCC, 0x51, 0x65, 0xD4, 0x00, 0xDF, 0x46, 0xA0, 0x37, 0xB8, 0x1C,\n    0x39, 0xD8, 0x73, 0x66, 0xCB, 0x5F, 0xAE, 0x69, 0x3D, 0xFF, 0x9B, 0x13, 0x33, 0xCF, 0xE0, 0x15,\n    0xD6, 0x78, 0x6B, 0xF1, 0x0F, 0x77, 0xEF, 0x33, 0x64, 0x1C, 0xD8, 0x60, 0x2A, 0xC6, 0x62, 0xFB,\n    0xC9, 0x84, 0x10, 0xC2, 0x76, 0x24, 0x4C, 0x6F, 0xAF, 0x23, 0x68, 0x3C, 0x71, 0xB1, 0x80, 0x71,\n    0x0C, 0x86, 0xE0, 0x15, 0xBF, 0xC0, 0xAA, 0xB0, 0x18, 0x61, 0x48, 0x93, 0xFD, 0xAD, 0xC8, 0xC4,\n    0x23, 0x18, 0x87, 0x21, 0x10, 0x55, 0x7A, 0x35, 0xCC, 0x08, 0xBE, 0x2E, 0xE2, 0xA5, 0x99, 0xAB,\n    0x55, 0x90, 0x42, 0x19, 0x6E, 0x62, 0x79, 0x4A, 0xE5, 0xE3, 0x70, 0xED, 0x91, 0x3F, 0x85, 0x02,\n    0xB4, 0x0B, 0xF4, 0x84, 0x89, 0x6D, 0x95, 0xA4, 0x2A, 0x8A, 0x9E, 0x53, 0xCE, 0x5D, 0xCA, 0xE7,\n    0x58, 0xB2, 0xB0, 0x40, 0x15, 0x5B, 0xA8, 0x79, 0x02, 0xB5, 0x0F, 0xCA, 0x19, 0x8A, 0x3F, 0x2B,\n    0xA4, 0xE8, 0x66, 0x1D, 0x70, 0x95, 0xF7, 0xE7, 0x4B, 0x1B, 0x37, 0x18, 0xFB, 0x4F, 0xEF, 0x93,\n    0xDE, 0xCB, 0x2F, 0x5E, 0xD3, 0xA4, 0x56, 0x95, 0xA7, 0x0F, 0x89, 0xB8, 0xE2, 0xC5, 0x35, 0xE0,\n    0x88, 0xD4, 0x30, 0x05, 0x56, 0xCC, 0x9F, 0x6B, 0x58, 0xA3, 0x12, 0x98, 0x91, 0x99, 0xD8, 0x9B,\n    0x10, 0xFA, 0xF5, 0x58, 0xD6, 0xD1, 0x7A, 0xBF, 0x16, 0x6E, 0x45, 0x74, 0xF1, 0x7A, 0xC5, 0x08,\n    0x35, 0x5E, 0xB2, 0x89, 0x93, 0xFA, 0x30, 0xE0, 0x13, 0x94, 0xA1, 0x45, 0xDF, 0x24, 0x59, 0x3B,\n    0xE7, 0xBA, 0x15, 0x5E, 0x32, 0x49, 0x37, 0x25, 0xC2, 0x32, 0x07, 0x05, 0x5D, 0x35, 0x9C, 0x8E,\n    0x8A, 0x53, 0x56, 0xF7, 0x53, 0xCD, 0xE5, 0x9D, 0xEF, 0x1E, 0x49, 0xC3, 0x24, 0x67, 0x96, 0x1C,\n    0x94, 0xDF, 0x8F, 0x98, 0x1F, 0x8A, 0xF6, 0x8E, 0x8F, 0xED, 0xFD, 0xEE, 0x4E, 0xBC, 0x00, 0xE8,\n    0x95, 0x53, 0xEF, 0x11, 0xD6, 0x65, 0xD0, 0x52, 0xDC, 0x08, 0x7C, 0xB0, 0x32, 0x01, 0xBF, 0xB3,\n    0x1D, 0x0F, 0x62, 0x32, 0xA3, 0x7D, 0x18, 0x9E, 0x9E, 0x19, 0x9B, 0xF6, 0x68, 0xFF, 0x63, 0xB3,\n    0x97, 0x61, 0xD6, 0x31, 0xFF, 0x42, 0x7A, 0xE8, 0xCA, 0x87, 0xFA, 0xD7, 0xF0, 0x6C, 0x3C, 0x13,\n    0x6B, 0x3E, 0x31, 0x10, 0xA9, 0x55, 0x46, 0x64, 0xAA, 0xF6, 0xA0, 0x3A, 0x16, 0x28, 0xBE, 0x71,\n    0xDE, 0xE0, 0x44, 0x78, 0x5B, 0xE6, 0xF6, 0xAB, 0x2F, 0x9B, 0xE7, 0x61, 0x0A, 0xA4, 0x04, 0x2D,\n    0xFD, 0xFB, 0x2E, 0x5D, 0xD7, 0x36, 0xC8, 0x30, 0xA8, 0x93, 0xD8, 0x17, 0x4F, 0x8F, 0x4D, 0x8C,\n    0x98, 0x57, 0x8C, 0x6F, 0x46, 0x57, 0xA0, 0x4A, 0x1A, 0xDB, 0xE7, 0x3F, 0x96, 0xC7, 0x56, 0x41,\n    0x0D, 0x55, 0x5B, 0x3F, 0x67, 0xD2, 0xAB, 0xEC, 0x4A, 0x66, 0x67, 0x9A, 0xF2, 0x2D, 0x63, 0xC4,\n    0xB6, 0x50, 0x86, 0xB7, 0x70, 0xAA, 0x19, 0x05, 0x9A, 0xA5, 0x3E, 0x7B, 0x89, 0x64, 0xF9, 0x97,\n    0x0C, 0xDB, 0x3D, 0x99, 0x92, 0xF0, 0x9A, 0x5C, 0x63, 0x46, 0x6E, 0x57, 0x15, 0xF2, 0xC1, 0x24,\n    0x09, 0xB0, 0x94, 0xB6, 0x22, 0xA0, 0x23, 0x32, 0x53, 0x9B, 0x24, 0x4B, 0xC7, 0x83, 0x6D, 0xA9,\n    0xDB, 0x1E, 0x1A, 0xBD, 0x56, 0xB7, 0x13, 0xD8, 0x92, 0x2E, 0x0C, 0x17, 0xA5, 0xEF, 0x4B, 0x53,\n    0x36, 0xC9, 0xC4, 0xE8, 0xFA, 0x4D, 0xD8, 0xA1, 0x81, 0xE5, 0x9C, 0xE8, 0x65, 0x62, 0xEF, 0x65,\n    0xA6, 0xA9, 0x1C, 0xBA, 0x33, 0xE2, 0x3F, 0xE7, 0xB7, 0xD6, 0x1A, 0x07, 0xBE, 0x5D, 0xF6, 0x5C,\n    0x3E, 0xC4, 0x40, 0xF7, 0x3F, 0x8A, 0xE0, 0x77, 0xC0, 0x61, 0x73, 0x86, 0x26, 0x2D, 0x71, 0x54,\n    0x51, 0xE5, 0x57, 0x5E, 0xB7, 0x46, 0x57, 0x2A, 0xD3, 0x22, 0x90, 0x2E, 0x3E, 0x75, 0xF8, 0x87,\n    0xB1, 0xD2, 0x29, 0xC2, 0xDD, 0x93, 0x94, 0xD2, 0x5E, 0xAC, 0xCC, 0x90, 0xD2, 0xD8, 0x2E, 0xD3,\n    0x9B, 0xE5, 0x10, 0x5B, 0xE5, 0x7F, 0x8E, 0x34, 0x64, 0x97, 0xB9, 0xA0, 0x7E, 0xD9, 0x0E, 0x7F,\n    0xB4, 0x6B, 0x0C, 0xE7, 0x31, 0xA4, 0x35, 0x46, 0x82, 0x7B, 0xDB, 0x6F, 0x0C, 0x7D, 0xE7, 0x21,\n    0x37, 0x10, 0x54, 0x03, 0x0E, 0x83, 0x77, 0xCB, 0xD9, 0xBB, 0x23, 0x87, 0xF3, 0xA0, 0x68, 0x06,\n    0x67, 0xF0, 0x0A, 0x6B, 0xE5, 0x98, 0x05, 0x06, 0xB1, 0xDC, 0xB7, 0xE8, 0xDC, 0x7B, 0x2D, 0x9A,\n    0xF7, 0x1E, 0x53, 0xBE, 0xBB, 0x9D, 0x90, 0xD0, 0x80, 0xA3, 0x02, 0x53, 0xDD, 0x3B, 0x97, 0xF2,\n    0xC9, 0x1A, 0x5A, 0xAB, 0x9F, 0x53, 0xFB, 0xED, 0x1C, 0x44, 0xEA, 0x13, 0xE6, 0xFF, 0x03, 0xB1,\n    0xAB, 0x21, 0x94, 0x7A, 0x58, 0x5F, 0x2E, 0x0C, 0xFF, 0xC1, 0x6A, 0xA8, 0xD6, 0xE3, 0x11, 0xC6,\n    0x9C, 0x88, 0xE5, 0xEB, 0x90, 0x50, 0x6F, 0x34, 0x59, 0x63, 0xD6, 0xAC, 0xFB, 0x1C, 0x70, 0xEC,\n    0x7E, 0x50, 0xA6, 0xD3, 0x7E, 0xF5, 0x98, 0x4B, 0x26, 0xEE, 0x0B, 0xB4, 0x04, 0xF6, 0x72, 0x77,\n    0x4A, 0x72, 0x70, 0xE3, 0x8B, 0xE2, 0x55, 0xD2, 0x31, 0x39, 0xF8, 0xB6, 0x8D, 0x97, 0x57, 0x54,\n    0xAE, 0x02, 0xC8, 0x00, 0x65, 0x49, 0xF7, 0xF2, 0x88, 0xD1, 0x07, 0x46, 0x58, 0x7A, 0x52, 0x66,\n    0x32, 0xE4, 0xF4, 0x4B, 0xD8, 0xFA, 0xFB, 0x1D, 0xF5, 0xAF, 0x61, 0x60, 0x52, 0x4D, 0x87, 0xC3,\n    0xBB, 0x71, 0x60, 0x42, 0x1D, 0xA3, 0x8C, 0x59, 0xF3, 0x48, 0xB7, 0x9D, 0x7E, 0xE3, 0xC5, 0x91,\n    0x20, 0xDE, 0x82, 0xFD, 0xA3, 0xDE, 0xFF, 0x0B, 0x12, 0x6C, 0x9A, 0xD4, 0x37, 0x97, 0xA1, 0x10,\n    0x2C, 0x1A, 0x84, 0x1A, 0x65, 0xE0, 0xBB, 0xED, 0x31, 0xD9, 0x9E, 0x63, 0x48, 0x3F, 0x73, 0xCD,\n    0x9D, 0x9C, 0x1A, 0x89, 0x01, 0x89, 0x95, 0xA0, 0x01, 0xFF, 0x15, 0x2E, 0xFD, 0x5B, 0xB7, 0x56,\n    0x54, 0x9B, 0x1A, 0xD9, 0xD8, 0x6B, 0x4D, 0x2B, 0xEE, 0x65, 0x82, 0xF4, 0x18, 0xC0, 0x8F, 0x92,\n    0x0F, 0xA9, 0x85, 0x36, 0xE0, 0xFF, 0x5C, 0x67, 0xBC, 0x1C, 0x4C, 0x04, 0x00, 0x1A, 0xFF, 0x33,\n    0xF3, 0x3C, 0xB9, 0x01, 0x85, 0xF5, 0x9C, 0x42, 0x48, 0x98, 0xD1, 0x1C, 0x12, 0x12, 0x36, 0x69,\n    0x9F, 0x00, 0x9D, 0x91, 0x55, 0xF2, 0x3B, 0x3C, 0x65, 0x1F, 0x08, 0x56, 0x48, 0x57, 0x6B, 0xE3,\n    0x88, 0xED, 0x2A, 0x13, 0x48, 0xC4, 0x2C, 0xD5, 0x46, 0x54, 0x8A, 0xBC, 0x1C, 0x4B, 0xCF, 0x27,\n    0x88, 0xC9, 0x74, 0xCF, 0xD5, 0x82, 0x76, 0x57, 0x76, 0x83, 0x2C, 0xA6, 0x4E, 0xD6, 0xEB, 0xD0,\n    0xEB, 0x8C, 0x0D, 0x04, 0xD6, 0xAD, 0x88, 0xE3, 0x7C, 0x3C, 0x9C, 0xB1, 0xCA, 0x4E, 0xEF, 0x8A,\n    0x57, 0x3B, 0x6C, 0x68, 0x2C, 0xEE, 0xA9, 0xEA, 0x71, 0xBB, 0x84, 0x2A, 0xCF, 0x68, 0xBE, 0x7F,\n    0x16, 0x77, 0x4A, 0x6D, 0x2F, 0x9B, 0x23, 0xA7, 0x65, 0x1D, 0x3A, 0x43, 0xE1, 0xEA, 0xF8, 0x0B,\n    0x4E, 0xA7, 0x6A, 0x9C, 0x68, 0x65, 0x80, 0x34, 0xBF, 0x92, 0x35, 0x52, 0x47, 0xA3, 0xD1, 0x19,\n    0x54, 0xD4, 0x61, 0xB2, 0x59, 0xCB, 0x98, 0x01, 0x2A, 0x03, 0xA3, 0x26, 0x13, 0xF4, 0x8D, 0x2E,\n    0xA5, 0xF5, 0x89, 0xA1, 0x27, 0x5F, 0x08, 0x9E, 0xDF, 0x24, 0xB6, 0x1F, 0x88, 0x0F, 0xA9, 0xA7,\n    0x3F, 0x8B, 0x14, 0xD6, 0xAE, 0x50, 0x43, 0x73, 0x7F, 0xE5, 0x47, 0xFA, 0xF6, 0xA8, 0xC6, 0x85,\n    0x03, 0x20, 0x5C, 0x91, 0x13, 0xB4, 0xDF, 0xD0, 0xDE, 0xD5, 0xA3, 0x7A, 0x6F, 0x85, 0xE4, 0x92,\n    0x9B, 0xED, 0x3D, 0xE9, 0x03, 0x08, 0x45, 0x21, 0x12, 0x0E, 0x5A, 0xEB, 0x12, 0xDF, 0x07, 0x71,\n    0xD4, 0x96, 0x06, 0x0A, 0xCA, 0xA5, 0x2D, 0x7C, 0x6D, 0xC8, 0x23, 0xAD, 0xB9, 0x7C, 0xCB, 0x0A,\n    0xEA, 0x29, 0x77, 0x8C, 0x5E, 0x9D, 0xE2, 0x64, 0xFE, 0x41, 0x89, 0x3A, 0xEA, 0x26, 0x6F, 0x2C,\n    0x1C, 0x73, 0x72, 0x9A, 0xA7, 0x46, 0x69, 0xC6, 0x4D, 0x0B, 0x7F, 0x30, 0x33, 0x1C, 0x73, 0x8D,\n    0x46, 0xC0, 0xA2, 0xD6, 0x4C, 0x8E, 0x99, 0xB2, 0x0D, 0xC8, 0xD6, 0x41, 0x05, 0xAE, 0x29, 0xB2,\n    0xEE, 0x1C, 0x58, 0x2E, 0xBB, 0xE3, 0xC1, 0x79, 0x40, 0x3F, 0xA7, 0x15, 0xC9, 0xBB, 0xA7, 0xE4,\n    0xAF, 0x7E, 0xB3, 0x43, 0x5F, 0xF8, 0xD0, 0x78, 0x01, 0x68, 0x46, 0xFA, 0x82, 0x03, 0x77, 0x72,\n    0x21, 0x9A, 0x51, 0x1D, 0x5D, 0xB5, 0xC5, 0x29, 0x5D, 0x75, 0xC6, 0x3B, 0x6B, 0x68, 0x7B, 0x6F,\n    0xF3, 0xD2, 0x9D, 0xE4, 0x8E, 0x69, 0xA2, 0x63, 0x8B, 0xEE, 0xFF, 0xB5, 0x1A, 0xBF, 0xFE, 0xFD,\n    0x59, 0x18, 0x4D, 0xFC, 0x86, 0xEB, 0x9A, 0xBF, 0x52, 0xC7, 0x4B, 0x77, 0x15, 0x2A, 0xF7, 0x20,\n    0x37, 0xFE, 0x70, 0x43, 0xE7, 0x26, 0x91, 0xC9, 0xF8, 0x17, 0xA3, 0x96, 0xAD, 0x52, 0xFC, 0x42,\n    0xCB, 0x0D, 0x2D, 0x16, 0xC7, 0x23, 0xE2, 0x1A, 0x54, 0x8D, 0xF1, 0xAD, 0x1F, 0xAB, 0x7A, 0x10,\n    0x72, 0x2D, 0x3A, 0xD6, 0xF4, 0x93, 0x50, 0x5F, 0xF0, 0x90, 0xD0, 0x5D, 0xE6, 0xC7, 0x8C, 0x22,\n    0xA8, 0xAE, 0x9A, 0x87, 0x35, 0x4D, 0x1D, 0x66, 0x2C, 0x2C, 0x4C, 0x6F, 0x8F, 0x6B, 0x10, 0xE9,\n    0x66, 0xB2, 0xA6, 0xE9, 0x92, 0xCF, 0xC7, 0x6A, 0x87, 0xA3, 0x5F, 0x13, 0x1A, 0x36, 0x69, 0x6A,\n    0x94, 0xA4, 0xCA, 0xB8, 0xB2, 0xD1, 0xFC, 0x97, 0x62, 0x14, 0x50, 0x2B, 0xD6, 0xEA, 0x9B, 0xDC,\n    0xE2, 0xD6, 0xC9, 0x17, 0x7B, 0xD7, 0xAF, 0x0E, 0x62, 0x66, 0x5E, 0x67, 0x58, 0xE4, 0x09, 0x68,\n    0x63, 0x26, 0xF0, 0x23, 0x3A, 0x18, 0xAE, 0x4E, 0xAE, 0x03, 0x6D, 0xA0, 0xBA, 0xB4, 0xE5, 0x20,\n    0x0B, 0x8B, 0xB0, 0x0E, 0xC1, 0x09, 0x5F, 0xAA, 0xD7, 0x2B, 0xD2, 0x3E, 0xCD, 0xE6, 0xBE, 0xFE,\n    0x11, 0x11, 0x4B, 0x55, 0x01, 0xEF, 0x0C, 0xFF, 0xF4, 0x4A, 0xBC, 0x87, 0x0F, 0x76, 0x73, 0x5E,\n    0xCD, 0x4B, 0x3D, 0xA9, 0xAF, 0x3E, 0x96, 0x8D, 0x49, 0xDC, 0x16, 0x18, 0x76, 0x8C, 0x93, 0xB2,\n    0x6F, 0x72, 0x8F, 0xE0, 0xBD, 0xF5, 0xFA, 0x01, 0xEF, 0x2F, 0x47, 0xD9, 0x6C, 0xAE, 0xE2, 0x37,\n    0xA2, 0x45, 0x1F, 0xFB, 0xA2, 0xB4, 0xAF, 0x74, 0xFC, 0xE3, 0x6A, 0xC8, 0x4C, 0x9E, 0xAA, 0xFE,\n    0x86, 0x23, 0xE7, 0xFD, 0x51, 0x32, 0x25, 0xAE, 0x57, 0xAB, 0xE2, 0x44, 0xEE, 0x6A, 0x1B, 0x61,\n    0x0F, 0x0E, 0x8C, 0xA0, 0x87, 0x1B, 0x5F, 0x66, 0x2E, 0x97, 0x11, 0x29, 0xBD, 0x7D, 0xD9, 0x40,\n    0x92, 0x7B, 0xF8, 0x1D, 0xCB, 0x97, 0xE8, 0x7B, 0xE8, 0x5C, 0x07, 0x61, 0x19, 0xD6, 0xEE, 0x99,\n    0xD1, 0xBE, 0x36, 0x1F, 0x42, 0xF7, 0x33, 0x94, 0x01, 0xA4, 0xE0, 0x0C, 0x99, 0x1F, 0x21, 0x31,\n    0x5A, 0xF9, 0xA1, 0x98, 0xFD, 0x85, 0x44, 0xBB, 0x82, 0xB7, 0x9D, 0xE9, 0x4F, 0x4A, 0xD9, 0xBC,\n    0x8D, 0xDD, 0x2E, 0xF6, 0x75, 0x38, 0xC0, 0x12, 0x36, 0xA8, 0x1F, 0x57, 0x37, 0x9F, 0x64, 0xB3,\n    0xF3, 0xFA, 0x5B, 0xA9, 0x81, 0x8B, 0x5E, 0x25, 0x34, 0x38, 0x28, 0x74, 0x4E, 0x58, 0xA1, 0x6C,\n    0xC2, 0x57, 0x58, 0x40, 0x22, 0x3E, 0xE8, 0x48, 0xBA, 0x6F, 0x4F, 0xC9, 0xC5, 0x06, 0x4D, 0x12,\n    0xDC, 0x48, 0x68, 0xDB, 0xC2, 0x6A, 0x20, 0xA2, 0x99, 0x4E, 0x08, 0x05, 0xB2, 0x8E, 0xB1, 0x61,\n    0x2E, 0x25, 0x67, 0x27, 0x69, 0xB9, 0x04, 0xDB, 0x3A, 0x73, 0xEC, 0xA0, 0xB7, 0x73, 0x88, 0x7E,\n    0x25, 0x4B, 0x33, 0x3B, 0xAC, 0x7F, 0x11, 0x12, 0x3A, 0x49, 0xB5, 0x3A, 0x36, 0x39, 0xD3, 0xCA,\n    0x02, 0xA0, 0xE4, 0xD8, 0x12, 0x5C, 0x98, 0x29, 0x57, 0x69, 0x39, 0x8E, 0x35, 0x12, 0x07, 0x83,\n    0xFE, 0x77, 0xD8, 0x30, 0xB4, 0x34, 0xD2, 0xE6, 0xB1, 0x9A, 0xFF, 0xAC, 0xFC, 0x0D, 0x3B, 0x8A,\n    0x18, 0x1F, 0xF4, 0xE8, 0xBF, 0xE8, 0xE4, 0x26, 0xE5, 0x07, 0xB0, 0xB2, 0x2B, 0xCB, 0x14, 0xFA,\n    0x53, 0x39, 0x64, 0x43, 0xCB, 0x3D, 0xFC, 0x61, 0x90, 0x3A, 0xF6, 0xE8, 0x7B, 0x13, 0xCD, 0x6E,\n    0xA9, 0xA5, 0x66, 0xD0, 0x9E, 0xE2, 0x50, 0xC6, 0xCF, 0xFC, 0x03, 0xB1, 0xD5, 0x7D, 0x0A, 0x62,\n    0x7F, 0xE2, 0x3D, 0x9F, 0x0F, 0x9F, 0x29, 0x99, 0x65, 0x13, 0x69, 0xF2, 0x85, 0x58, 0x07, 0x1D,\n    0x00, 0x66, 0x9D, 0x4B, 0xA8, 0xC9, 0x07, 0x1A, 0x8F, 0x3E, 0xD7, 0x81, 0xA6, 0xDB, 0xE9, 0x32,\n    0xB3, 0xD4, 0x29, 0x6D, 0xB8, 0xBA, 0x41, 0x0F, 0x51, 0xCB, 0x50, 0x74, 0x48, 0x07, 0x97, 0x27,\n    0xC9, 0x23, 0x3C, 0xBD, 0x5B, 0x0F, 0x46, 0x04, 0x38, 0xB5, 0xC0, 0xB6, 0x20, 0x03, 0xFA, 0x56,\n    0x52, 0x9E, 0x27, 0xAC, 0xF1, 0xE7, 0x32, 0x25, 0x72, 0xFC, 0xAB, 0xE5, 0x1F, 0xF0, 0x55, 0x7D,\n    0xED, 0xB8, 0x28, 0x96, 0x47, 0xED, 0x86, 0x45, 0xC9, 0xBA, 0xD1, 0xF6, 0xFA, 0xFC, 0xC6, 0xF6,\n    0x67, 0x45, 0xC4, 0xA9, 0x25, 0xDE, 0xC7, 0x3F, 0x8A, 0xD8, 0x31, 0x3C, 0xB6, 0xE4, 0x0D, 0x7B,\n    0xBE, 0x89, 0x5A, 0x69, 0x80, 0xEB, 0x62, 0xDE, 0xAF, 0x02, 0x6E, 0xD1, 0x4B, 0x2C, 0x7B, 0xCD,\n    0x4D, 0xF1, 0xDF, 0x58, 0x82, 0xD0, 0xE6, 0x6F, 0xB7, 0x45, 0x8E, 0xDF, 0xE6, 0x30, 0x84, 0xC4,\n    0x5D, 0x26, 0xC0, 0x4C, 0x39, 0xC5, 0x2C, 0x99, 0x34, 0x13, 0xF5, 0x32, 0xA3, 0xEE, 0xCF, 0x54,\n    0x5C, 0x58, 0x2B, 0x5D, 0x54, 0xEF, 0xFA, 0x11, 0xC4, 0xBB, 0x1F, 0x34, 0x7C, 0xE6, 0x2F, 0xE4,\n    0xA9, 0xD3, 0x95, 0x8B, 0x58, 0xC7, 0xB5, 0xE2, 0x27, 0xCE, 0xF0, 0xF8, 0xD1, 0x9E, 0x0F, 0x88,\n    0x93, 0x3D, 0x90, 0x0D, 0x15, 0x9A, 0xC3, 0xEA, 0x91, 0xF5, 0xF6, 0xE4, 0x3E, 0x89, 0x01, 0x8A,\n    0x4E, 0x6F, 0xE3, 0x21, 0xB1, 0x93, 0x04, 0x36, 0x30, 0x22, 0x7B, 0x92, 0x7F, 0xCF, 0x06, 0x6B,\n    0xA5, 0x60, 0x8E, 0x15, 0x77, 0x8F, 0x7E, 0x9E, 0xB1, 0xE6, 0xFA, 0x30, 0x4D, 0xD1, 0xC7, 0x20,\n    0xEA, 0xAF, 0xD5, 0xB2, 0x58, 0xD3, 0xAA, 0x74, 0xBC, 0xDD, 0x10, 0x6F, 0x54, 0xFF, 0x15, 0xD4,\n    0xB0, 0x20, 0xD5, 0xDC, 0xF3, 0x89, 0x28, 0x04, 0x4C, 0x69, 0x7E, 0xE9, 0xBF, 0xE5, 0x83, 0x33,\n    0x81, 0x69, 0xE4, 0xB8, 0x46, 0xD8, 0x26, 0x24, 0x51, 0xEE, 0x5B, 0x1D, 0x8E, 0xA0, 0x2B, 0xA2,\n    0xD6, 0x6B, 0x4C, 0x7F, 0xA3, 0xDA, 0xDF, 0x64, 0x4B, 0x79, 0xF8, 0xEA, 0x0D, 0x53, 0x20, 0xB6,\n    0x67, 0xE4, 0x9F, 0xB5, 0xB6, 0x63, 0x1D, 0x6E, 0xDA, 0x91, 0x1C, 0x9C, 0xE1, 0x96, 0x0D, 0x67,\n    0xD4, 0xFE, 0xE9, 0x80, 0xEA, 0x43, 0xF3, 0x6C, 0x7F, 0x9D, 0x1E, 0xCB, 0x9A, 0xB0, 0x29, 0x60,\n    0x68, 0x8C, 0xB9, 0x1B, 0x23, 0x8E, 0x87, 0xBD, 0x27, 0x1A, 0x93, 0xCB, 0xD5, 0x3B, 0x8F, 0x9B,\n    0xF7, 0x5F, 0xF8, 0x5D, 0xA0, 0x90, 0xC8, 0xEC, 0xDB, 0x2E, 0xCC, 0xBB, 0xDA, 0x4A, 0x8E, 0x7E,\n    0xD9, 0x80, 0xC9, 0x7C, 0xEA, 0x17, 0x31, 0x51, 0x0E, 0xB0, 0x3E, 0xC2, 0x45, 0x40, 0x70, 0x7B,\n    0xA4, 0x1B, 0x26, 0x9C, 0xC4, 0x35, 0x38, 0x24, 0x21, 0x6A, 0x33, 0x57, 0x10, 0x7B, 0xE1, 0x00,\n    0x51, 0x24, 0x22, 0x46, 0xC1, 0x95, 0x0F, 0x9C, 0xC1, 0x38, 0x48, 0xD5, 0x19, 0x09, 0x75, 0xBA,\n    0x85, 0x8A, 0x7B, 0x55, 0xD5, 0x8C, 0xD3, 0x51, 0x4D, 0x9B, 0x49, 0xCD, 0xA4, 0xCB, 0x14, 0x11,\n    0xBF, 0x78, 0x52, 0xB1, 0x58, 0x28, 0x50, 0x9B, 0x81, 0x9C, 0xB4, 0x6D, 0xD1, 0xE4, 0x67, 0xED,\n    0x13, 0x47, 0xE9, 0xC4, 0xDE, 0xB2, 0xC2, 0x38, 0x06, 0x58, 0x40, 0x20, 0x85, 0x80, 0x81, 0xF2,\n    0x7A, 0xCF, 0xFC, 0x22, 0x31, 0x27, 0x31, 0x0A, 0x3C, 0xF5, 0xAE, 0xBE, 0x8D, 0xDD, 0x94, 0x80,\n    0x25, 0x73, 0xC5, 0xFD, 0xEB, 0xFA, 0x0C, 0xA8, 0x25, 0x2D, 0xD5, 0x48, 0xF3, 0x48, 0x59, 0x84,\n    0x4C, 0x71, 0x8D, 0x28, 0xA1, 0x7A, 0x19, 0xF7, 0x45, 0xAA, 0x83, 0x15, 0xEA, 0x40, 0x8F, 0x0F,\n    0x90, 0xEF, 0x1F, 0x4E, 0x81, 0xAB, 0xEB, 0x03, 0x4F, 0xD4, 0x59, 0xC5, 0xFB, 0x1E, 0xFA, 0x3E,\n    0x44, 0xB5, 0x48, 0xE2, 0x71, 0x88, 0x18, 0xF3, 0x73, 0x5F, 0xF3, 0x9B, 0x7B, 0xBF, 0x18, 0x17,\n    0xEB, 0x48, 0x5A, 0x5C, 0xCE, 0x54, 0xDA, 0x84, 0xE8, 0xDC, 0x9C, 0x03, 0xC1, 0xD6, 0x70, 0xBF,\n    0x5F, 0x3F, 0xC2, 0x3E, 0x05, 0x73, 0x82, 0x2C, 0xB0, 0x19, 0xCF, 0xDC, 0x7D, 0xD8, 0xF4, 0x27,\n    0x1B, 0xBE, 0x28, 0x9A, 0x0C, 0x22, 0x90, 0x94, 0x60, 0x5A, 0x30, 0x1A, 0xBA, 0xD3, 0x2D, 0xEE,\n    0xFF, 0x1A, 0x7A, 0x4C, 0xC9, 0x7C, 0xB4, 0x4C, 0xB1, 0x88, 0xB9, 0xF9, 0xFC, 0xE7, 0x62, 0x0F,\n    0x54, 0xBC, 0x7A, 0x4E, 0xA6, 0xC6, 0x73, 0xE2, 0x4D, 0x49, 0x59, 0x8B, 0x2A, 0x69, 0x0A, 0x62,\n    0x1D, 0xA4, 0x6B, 0x9C, 0x90, 0x80, 0x82, 0x02, 0x29, 0xBD, 0xF4, 0x04, 0x3A, 0x52, 0x27, 0x85,\n    0x16, 0x81, 0xB5, 0xB9, 0x4E, 0xB5, 0xA4, 0xD7, 0x3B, 0x22, 0x02, 0x71, 0x87, 0xF5, 0x42, 0x8D,\n    0x95, 0x13, 0xF2, 0xB5, 0xD2, 0xDE, 0xC6, 0xC4, 0xD8, 0xB9, 0x09, 0x3D, 0x89, 0x7E, 0xFD, 0x71,\n    0x96, 0x0B, 0x2C, 0xBF, 0xD2, 0xDC, 0x12, 0xE3, 0xE8, 0xD3, 0x4B, 0xE2, 0xA8, 0x99, 0x7A, 0x0E,\n    0xAA, 0xD8, 0x89, 0x34, 0x6B, 0x8B, 0xF9, 0x56, 0x12, 0x23, 0x5C, 0x80, 0xCC, 0x85, 0x13, 0x0D,\n    0x9F, 0x4D, 0xBA, 0xBB, 0x66, 0xE4, 0x44, 0x6D, 0x37, 0xF2, 0x26, 0x57, 0x4C, 0x21, 0xE1, 0x99,\n    0x96, 0xEE, 0x61, 0x80, 0xC3, 0x22, 0x51, 0x2A, 0xD8, 0x70, 0x4B, 0x10, 0x0B, 0x03, 0xF9, 0x13,\n    0x72, 0x5E, 0xD8, 0x85, 0x81, 0x33, 0x66, 0x97, 0x7D, 0xAC, 0x18, 0x08, 0xE8, 0x24, 0xC1, 0x6C,\n    0x5F, 0xD6, 0xA3, 0x99, 0xC6, 0x50, 0x54, 0x61, 0x90, 0xF0, 0x3B, 0xBF, 0xF3, 0x12, 0x74, 0x8C,\n    0x24, 0x38, 0xEB, 0xC5, 0x7A, 0xF1, 0x14, 0x33, 0x59, 0x8E, 0x57, 0x0F, 0x66, 0xF7, 0x9C, 0xC2,\n    0xE5, 0x2A, 0x39, 0x88, 0xE6, 0x5F, 0x5C, 0x80, 0xD9, 0xDB, 0x1D, 0x80, 0xF5, 0xCF, 0xA9, 0xFC,\n    0x2F, 0x81, 0x37, 0x11, 0x90, 0x8D, 0x91, 0xD7, 0x7A, 0x76, 0x18, 0x31, 0x80, 0x97, 0xA1, 0x24,\n    0xB2, 0x86, 0x7F, 0x01, 0x28, 0xB2, 0xA0, 0x78, 0x4F, 0x30, 0xCA, 0x37, 0xC4, 0xFC, 0xCA, 0xC2,\n    0xC4, 0xE1, 0xD0, 0x62, 0x9E, 0x11, 0x00, 0x12, 0x29, 0xD2, 0x1A, 0x5B, 0x7D, 0x50, 0x69, 0xBF,\n    0x32, 0xA3, 0xFF, 0x13, 0x26, 0x30, 0x6D, 0xB7, 0xB2, 0x26, 0xAC, 0xE4, 0x74, 0x94, 0x92, 0xA0,\n    0xFB, 0x8F, 0xF4, 0xB0, 0x9D, 0xAA, 0xA4, 0x00, 0x7F, 0x3B, 0xCC, 0xC9, 0xD4, 0x67, 0xCA, 0xAD,\n    0xB7, 0xB8, 0xB9, 0xD4, 0x01, 0x27, 0x6C, 0x8E, 0x8F, 0x16, 0x41, 0x13, 0xE5, 0xB5, 0x81, 0x3A,\n    0x29, 0x3C, 0x21, 0x16, 0x3E, 0x49, 0x8B, 0x15, 0x59, 0x21, 0x8B, 0x14, 0xAB, 0x53, 0x58, 0x8A,\n    0xC6, 0x02, 0x15, 0x41, 0x38, 0x9A, 0x25, 0x45, 0xBC, 0xF7, 0x84, 0x0B, 0xD7, 0x2F, 0x98, 0x4D,\n    0xBA, 0x56, 0x9F, 0x3C, 0x0D, 0x86, 0x1F, 0xDC, 0x40, 0x2D, 0x31, 0xA9, 0xB0, 0xBE, 0x84, 0x51,\n    0x58, 0xEC, 0x2F, 0xFB, 0x4E, 0x36, 0x09, 0xAE, 0x5A, 0x7E, 0xAA, 0x1D, 0xFC, 0xF5, 0x91, 0x9A,\n    0x28, 0xA2, 0x58, 0x3B, 0xB6, 0x9D, 0xB5, 0x12, 0xB7, 0x70, 0x7D, 0x64, 0x52, 0xB3, 0xC4, 0x07,\n    0xFA, 0x3A, 0xAA, 0x85, 0xA4, 0x1A, 0x4E, 0x47, 0xB0, 0xD0, 0x44, 0x75, 0x77, 0xA2, 0xFB, 0xB3,\n    0xE3, 0x27, 0x55, 0xD0, 0x1F, 0x3C, 0x9E, 0x2A, 0xB9, 0x41, 0x1D, 0x50, 0x98, 0x7E, 0xE9, 0xC9,\n    0xA7, 0x3C, 0x0B, 0xB1, 0x96, 0x74, 0xFC, 0xDB, 0xB6, 0x35, 0xAC, 0xD3, 0x89, 0xCA, 0x3B, 0x79,\n    0x32, 0x81, 0x70, 0x5C, 0xEE, 0x35, 0x79, 0x55, 0xDC, 0x77, 0x85, 0x01, 0x68, 0xE7, 0xA4, 0xB9,\n    0x9E, 0xDA, 0x55, 0xA1, 0xDF, 0x9A, 0xF5, 0xEA, 0xF0, 0xE1, 0x4F, 0x59, 0xB4, 0x13, 0xD7, 0xAC,\n    0x12, 0xF5, 0x06, 0xA2, 0x82, 0x01, 0xA1, 0xB5, 0x04, 0x9B, 0x00, 0x62, 0x11, 0xEF, 0xF9, 0x82,\n    0x8E, 0x00, 0x4D, 0x0C, 0x16, 0x4C, 0x0C, 0x80, 0xC7, 0x33, 0xCB, 0x0A, 0x43, 0xC3, 0x90, 0x47,\n    0x79, 0xCD, 0xEA, 0x96, 0xDC, 0xDE, 0x7C, 0xB9, 0x1D, 0x0C, 0xB1, 0xBC, 0x0F, 0x8B, 0x76, 0xE5,\n    0xBD, 0xD0, 0x59, 0x76, 0x08, 0x79, 0xE4, 0xF3, 0xE1, 0xB3, 0x12, 0xF1, 0x94, 0x14, 0x79, 0xBF,\n    0xAC, 0x22, 0x4E, 0x57, 0x7B, 0xCB, 0x5B, 0xBF, 0xE4, 0x9D, 0x16, 0x18, 0xA2, 0xB3, 0x2D, 0x04,\n    0x3A, 0x11, 0xC9, 0x18, 0x6D, 0xCC, 0x99, 0xB5, 0xB5, 0x36, 0xF5, 0x49, 0x4B, 0xEC, 0x60, 0x3E,\n    0x22, 0x9A, 0x73, 0x60, 0x91, 0x2F, 0x4F, 0x70, 0xB7, 0xA4, 0x48, 0x61, 0xCB, 0x0D, 0x17, 0x84,\n    0x61, 0xF1, 0xAD, 0x7F, 0xEE, 0xEC, 0x72, 0x18, 0x60, 0x6D, 0xAC, 0xEE, 0xDB, 0xC1, 0xC2, 0x81,\n    0xF1, 0x03, 0x74, 0xA2, 0x5A, 0xA9, 0xC8, 0x0E, 0x52, 0x85, 0xDD, 0x1D, 0x12, 0xBE, 0x1C, 0xC4,\n    0x58, 0x0F, 0x62, 0xEE, 0x17, 0xD4, 0xF5, 0x7F, 0xDB, 0xF4, 0x1B, 0xDF, 0x2D, 0x18, 0x6D, 0x0B,\n    0x47, 0xDB, 0xFF, 0xAF, 0x70, 0xE6, 0xA1, 0x52, 0x60, 0x9E, 0xFC, 0x83, 0xCC, 0x76, 0xB3, 0xAF,\n    0xED, 0x23, 0x21, 0xBB, 0x7D, 0xBE, 0x7E, 0x59, 0x7F, 0x3A, 0x22, 0x10, 0x8F, 0x43, 0x4E, 0x65,\n    0xC6, 0xBC, 0xEB, 0xE0, 0x63, 0x82, 0x78, 0xB8, 0xD5, 0xD0, 0xE7, 0xDA, 0x44, 0xF2, 0x1A, 0xBD,\n    0x75, 0x46, 0xF7, 0x2A, 0xFE, 0x5F, 0x2A, 0x95, 0xB3, 0x4F, 0x51, 0xC2, 0xD1, 0x24, 0xEA, 0x88,\n    0x06, 0x88, 0x8E, 0xCB, 0x33, 0xA8, 0x71, 0xC3, 0x89, 0x4E, 0xD4, 0x25, 0xBC, 0x87, 0x1C, 0x05,\n    0x87, 0x74, 0xF5, 0x99, 0x90, 0x58, 0xA1, 0x2E, 0x14, 0x13, 0x25, 0xD6, 0xCB, 0x5C, 0xE5, 0xA8,\n    0x46, 0xA6, 0x71, 0x68, 0x72, 0x66, 0x48, 0xD8, 0x92, 0x8F, 0x75, 0xAC, 0xB7, 0x14, 0x32, 0x42,\n    0xB9, 0x9D, 0x57, 0xF9, 0xD2, 0x8E, 0x85, 0x27, 0x92, 0xA8, 0xCC, 0x1A, 0x26, 0x33, 0x76, 0x06,\n    0x1A, 0xB6, 0x27, 0x56, 0x5D, 0x8E, 0xDC, 0x1F, 0xFC, 0xBA, 0x3F, 0x6A, 0x67, 0xFF, 0x9B, 0x14,\n    0xFF, 0x90, 0xE7, 0x8E, 0xED, 0x2D, 0x8B, 0x5E, 0x22, 0x84, 0xA2, 0x06, 0x8F, 0xFD, 0x25, 0x02,\n    0xFD, 0x3D, 0x92, 0x41, 0xE5, 0x49, 0x2D, 0x43, 0x6A, 0x9B, 0x1E, 0xA5, 0x46, 0xC9, 0xA9, 0xDC,\n    0x2D, 0x8E, 0x75, 0xE2, 0x1B, 0x8D, 0x8F, 0x23, 0x59, 0x2E, 0x21, 0x5D, 0x3C, 0x0A, 0x41, 0xC5,\n    0x27, 0xD2, 0x76, 0x9A, 0xCA, 0x7D, 0xAC, 0x65, 0x31, 0xC8, 0xAD, 0xB6, 0xBD, 0x19, 0x88, 0x08,\n    0x7A, 0x91, 0x74, 0xAD, 0x23, 0x14, 0x60, 0xC3, 0x93, 0xCE, 0xF2, 0x10, 0xCF, 0xE3, 0xF1, 0xF7,\n    0x3F, 0xD2, 0x1F, 0xD1, 0x91, 0x9B, 0x9C, 0xE9, 0xB9, 0xD7, 0xE5, 0xFA, 0x8F, 0xAD, 0xB1, 0x95,\n    0x03, 0x28, 0xB4, 0x20, 0x46, 0xA2, 0xBD, 0x23, 0x1A, 0x32, 0xB0, 0x23, 0x65, 0x54, 0x93, 0x87,\n    0x4F, 0xF1, 0x3A, 0xA7, 0x8A, 0xD5, 0x0F, 0x59, 0xC7, 0xD6, 0x7E, 0xBE, 0x6B, 0xFB, 0x66, 0x8A,\n    0x1E, 0x48, 0xD3, 0xCB, 0xC3, 0x78, 0xBC, 0x2A, 0x07, 0x57, 0x66, 0xD4, 0x83, 0x95, 0xE1, 0x67,\n    0xDA, 0xE8, 0x0D, 0x68, 0x86, 0xE8, 0xF7, 0xBF, 0x05, 0x4F, 0xB0, 0x41, 0x0C, 0xE6, 0x72, 0x9C,\n    0xB4, 0xBF, 0x93, 0x59, 0xE5, 0x97, 0xAC, 0x7B, 0xB0, 0x93, 0x0E, 0xEC, 0xE6, 0xC2, 0xC1, 0x0E,\n    0x06, 0x81, 0x69, 0xF6, 0x27, 0xE4, 0xCA, 0x2D, 0xE0, 0x76, 0x9E, 0x0A, 0x03, 0xE3, 0x60, 0xD1,\n    0xAB, 0x4C, 0x63, 0xCC, 0x03, 0x7E, 0xBC, 0x4A, 0x58, 0x74, 0x94, 0xEF, 0x96, 0xB7, 0x33, 0xE8,\n    0x80, 0x56, 0xBD, 0xEC, 0x3F, 0xD6, 0x75, 0x6F, 0xF6, 0xFE, 0x85, 0x0B, 0x0A, 0x30, 0x30, 0xBE,\n    0x0D, 0x7F, 0x5B, 0x15, 0xD2, 0x0B, 0x7D, 0xA3, 0x2B, 0xB7, 0xE7, 0xE9, 0x17, 0x4C, 0x94, 0xE1,\n    0x70, 0xED, 0xF7, 0x40, 0x94, 0x3B, 0x3A, 0xCA, 0xCE, 0xF5, 0xB2, 0xF3, 0x8A, 0x69, 0x61, 0x57,\n    0x5F, 0x64, 0xC5, 0xBC, 0x0F, 0x78, 0x15, 0x9C, 0xF8, 0x30, 0x3A, 0xA4, 0xC2, 0xD8, 0x35, 0xA8,\n    0x1B, 0xFA, 0x65, 0xAE, 0x78, 0x2A, 0x2B, 0x0E, 0x8C, 0xF7, 0x7E, 0x81, 0x43, 0x0E, 0x15, 0x05,\n    0xC6, 0x76, 0x7B, 0x29, 0xA6, 0x26, 0xDE, 0xA0, 0xF0, 0x38, 0x39, 0x8B, 0x33, 0x8D, 0x38, 0xD6,\n    0x84, 0x69, 0x55, 0xF6, 0x5A, 0x6E, 0xBE, 0x7E, 0x18, 0x41, 0x4A, 0x4D, 0xF5, 0x7A, 0x86, 0x8B,\n    0xCE, 0x48, 0xDD, 0xF5, 0x80, 0xEE, 0x57, 0x05, 0x99, 0x97, 0xA9, 0xCE, 0x26, 0x68, 0x20, 0xA4,\n    0x9C, 0x84, 0x00, 0x88, 0x0A, 0x7F, 0x7B, 0x74, 0x12, 0xE6, 0x60, 0xF7, 0xD9, 0xE7, 0xB4, 0x46,\n    0x59, 0x1A, 0x84, 0x1E, 0x08, 0x20, 0x2E, 0x74, 0x51, 0xAE, 0x95, 0xD7, 0x77, 0x5A, 0x6A, 0x9B,\n    0x0B, 0xFF, 0xB5, 0x5D, 0x65, 0xDC, 0x35, 0x6E, 0x00, 0xAF, 0x01, 0x73, 0x41, 0x82, 0x92, 0x29,\n    0x9B, 0x67, 0x38, 0x86, 0xE4, 0x1A, 0x2A, 0xDA, 0xBF, 0x23, 0xEC, 0x17, 0x97, 0x13, 0x1B, 0x32,\n    0x58, 0x31, 0x2F, 0x4E, 0x6D, 0x8E, 0x39, 0x99, 0x7B, 0x9D, 0xEB, 0xBE, 0x47, 0xC5, 0x22, 0x81,\n    0x64, 0xAE, 0x0B, 0x0D, 0xBC, 0x33, 0x6C, 0x0B, 0x30, 0xDE, 0xD0, 0xA4, 0x8D, 0xB2, 0x9E, 0xFB,\n    0x02, 0x6C, 0xDC, 0xD3, 0x3E, 0xCF, 0xD6, 0x49, 0x76, 0x22, 0xF2, 0x21, 0x76, 0x26, 0xDE, 0x32,\n    0x65, 0xAC, 0x1E, 0x68, 0x2F, 0xC5, 0xF3, 0x78, 0x07, 0x15, 0x08, 0xAF, 0x74, 0xD0, 0x81, 0x13,\n    0x45, 0xAB, 0x14, 0xD4, 0x59, 0x46, 0x24, 0x9F, 0x75, 0x12, 0x0E, 0xBB, 0xDC, 0x6E, 0x4D, 0x44,\n    0xD3, 0x28, 0x2D, 0x64, 0xA8, 0xD6, 0x71, 0xE2, 0xE0, 0x8B, 0xD2, 0xF4, 0xBD, 0xFC, 0x97, 0x30,\n    0x0C, 0xAC, 0x52, 0x3A, 0x06, 0xE6, 0x3A, 0x24, 0x09, 0xF5, 0xEE, 0xDB, 0x6C, 0x0A, 0x34, 0xCC,\n    0xF4, 0xEF, 0x97, 0x39, 0x4B, 0x0E, 0x51, 0xC4, 0x3F, 0x04, 0xC6, 0x79, 0xFC, 0xFC, 0x2C, 0x66,\n    0x7C, 0x74, 0x9C, 0xF6, 0x42, 0x98, 0x57, 0xE2, 0x78, 0x24, 0x72, 0x0A, 0xF2, 0x3B, 0x82, 0x22,\n    0xE6, 0x33, 0x80, 0xBC, 0x9A, 0xF5, 0x0D, 0x59, 0x5D, 0xEC, 0x04, 0xD1, 0x63, 0x37, 0x61, 0xB6,\n    0xBA, 0x30, 0x50, 0x1D, 0xC8, 0x3B, 0xF9, 0x41, 0xC1, 0x4A, 0x70, 0xEF, 0x01, 0x8C, 0xFD, 0x8C,\n    0xCF, 0xE3, 0xE1, 0x00, 0x94, 0xA0, 0xB7, 0xE8, 0xFA, 0xB9, 0x29, 0x36, 0xFD, 0x8B, 0x39, 0x86,\n    0x32, 0x48, 0xE6, 0xA1, 0x3B, 0x2C, 0xB7, 0xDB, 0xF3, 0x81, 0xAA, 0x06, 0x45, 0x7F, 0x2F, 0x2B,\n    0x82, 0xC7, 0xEB, 0x4A, 0x24, 0x35, 0x4F, 0x77, 0x9E, 0xCE, 0xF1, 0xDE, 0x01, 0xCB, 0x43, 0x5B,\n    0x39, 0x3F, 0x48, 0xDF, 0xEB, 0x6E, 0x16, 0xFA, 0x3B, 0x9D, 0x76, 0x7E, 0xEA, 0xB6, 0x1B, 0x49,\n    0x21, 0x35, 0x3C, 0xEC, 0x9B, 0x22, 0x65, 0x23, 0x8C, 0x1C, 0xA5, 0xF2, 0xD9, 0xA1, 0x9C, 0xE0,\n    0x5D, 0x9A, 0xFC, 0xE0, 0x6B, 0x78, 0x45, 0xEF, 0xBC, 0xCC, 0x8A, 0x7C, 0xE0, 0x70, 0xDB, 0xD6,\n    0xB1, 0x9A, 0xB3, 0x9D, 0x45, 0x3B, 0x9D, 0xE0, 0x23, 0x82, 0xF6, 0x9D, 0x6F, 0x0C, 0xF5, 0x7D,\n    0xB7, 0x41, 0x51, 0x4C, 0x02, 0xB7, 0x8D, 0xB5, 0x30, 0x9F, 0xF8, 0xD7, 0x50, 0x72, 0xF8, 0xAD,\n    0x2A, 0x54, 0x0F, 0xF9, 0x2D, 0x08, 0x1C, 0x32, 0x3C, 0xEE, 0xB3, 0x06, 0x73, 0x2B, 0x27, 0xEC,\n    0x81, 0xB6, 0x73, 0xC2, 0xAE, 0xF0, 0xE0, 0x16, 0x58, 0x55, 0x56, 0xC1, 0x0E, 0x89, 0xC2, 0xA7,\n    0xCA, 0xFD, 0x9A, 0x02, 0xC6, 0xB7, 0x68, 0xBD, 0x10, 0xFF, 0x82, 0x81, 0x58, 0x77, 0x9F, 0x55,\n    0x62, 0xC9, 0x80, 0xE9, 0x68, 0xE4, 0xBE, 0x8B, 0xDD, 0xAC, 0x28, 0xF8, 0xE5, 0xC6, 0xC4, 0x6C,\n    0x77, 0xA3, 0x4F, 0xB4, 0x3F, 0xDC, 0x64, 0x70, 0xF8, 0x32, 0x87, 0x19, 0x97, 0x2F, 0xEE, 0x04,\n    0xE1, 0x92, 0x4E, 0x73, 0x28, 0x6F, 0x1B, 0x62, 0xCD, 0xD6, 0xD9, 0x7C, 0x6C, 0x5D, 0x09, 0x1F,\n    0x9C, 0x0A, 0x72, 0x6D, 0xE7, 0x78, 0xA4, 0xA8, 0xEE, 0xF0, 0xA1, 0x3B, 0x03, 0x9E, 0xDF, 0x19,\n    0x46, 0xD7, 0x0B, 0x8F, 0x1B, 0xCC, 0x9C, 0xD6, 0x3A, 0xB6, 0x98, 0x42, 0x4C, 0x7C, 0xD4, 0x59,\n    0xC4, 0xBD, 0x86, 0x9E, 0x79, 0x01, 0x05, 0x7C, 0xA7, 0xC4, 0xD5, 0xC4, 0xA4, 0xD7, 0xB2, 0x8A,\n    0x15, 0x3C, 0x08, 0x12, 0xFF, 0x0E, 0xF1, 0x20, 0x9A, 0x5C, 0x57, 0x2A, 0xDE, 0xF2, 0x21, 0xA7,\n    0xFB, 0xF2, 0xA7, 0xE9, 0x37, 0xA8, 0x73, 0x45, 0xE8, 0xD4, 0xAC, 0x2F, 0x06, 0xC8, 0x6E, 0x04,\n    0xDE, 0xF7, 0xE2, 0xF6, 0xD1, 0xA3, 0xC0, 0x7B, 0xD9, 0x77, 0xEF, 0x53, 0x74, 0xEA, 0xBE, 0x23,\n    0xD2, 0x7E, 0xF0, 0xF0, 0x56, 0xAC, 0x95, 0x80, 0xF3, 0x53, 0xEE, 0x47, 0x1D, 0x76, 0x30, 0x21,\n    0xC8, 0xAD, 0x46, 0x73, 0x8B, 0x1F, 0x4A, 0xB1, 0x48, 0x4F, 0xE7, 0x3B, 0x92, 0xC0, 0xA7, 0x68,\n    0xF3, 0x53, 0xC7, 0xD4, 0x51, 0xA8, 0xF6, 0xC9, 0x85, 0xAD, 0xBF, 0xB9, 0x6A, 0x31, 0x0E, 0x0C,\n    0x7E, 0x64, 0x6F, 0x50, 0x99, 0x31, 0xE4, 0x13, 0xA6, 0xBF, 0xEA, 0xFF, 0x09, 0x1A, 0xA7, 0xD8,\n    0xD6, 0x42, 0xA7, 0x62, 0x4F, 0xAC, 0x87, 0x4B, 0xBA, 0xB7, 0xBE, 0x50, 0x5A, 0x09, 0x43, 0xD7,\n    0x4F, 0x9B, 0x27, 0x05, 0x78, 0xEB, 0xB2, 0x16, 0x6C, 0xCA, 0x18, 0x41, 0x58, 0xF2, 0x24, 0xF9,\n    0xED, 0xBB, 0xF6, 0x96, 0x2F, 0xF3, 0xCB, 0x4A, 0xE9, 0xF8, 0x25, 0x4A, 0x6E, 0x8E, 0x32, 0xB6,\n    0x51, 0x17, 0x29, 0x98, 0x9B, 0x41, 0xE7, 0x23, 0x80, 0xEA, 0x17, 0x84, 0xAB, 0xF1, 0x94, 0x81,\n    0xFE, 0xB4, 0x30, 0xA8, 0xF8, 0x59, 0x33, 0x28, 0xAE, 0xF5, 0x24, 0x20, 0x7E, 0x78, 0x54, 0x7C,\n    0xD5, 0xE9, 0xBA, 0xC1, 0x12, 0xA2, 0x71, 0xD6, 0x1D, 0x5E, 0xE2, 0x5B, 0xF3, 0x26, 0xAA, 0x0B,\n    0x96, 0x68, 0x46, 0x63, 0x1D, 0x71, 0x38, 0x8C, 0xB4, 0x29, 0x18, 0x92, 0x22, 0x6A, 0x0A, 0x67,\n    0x70, 0xC2, 0x14, 0xEC, 0x4F, 0x0F, 0x3B, 0x43, 0x27, 0x6F, 0xF5, 0x1B, 0xE0, 0x7B, 0xEB, 0x35,\n    0x3A, 0x6F, 0x7C, 0xA5, 0x9C, 0xBC, 0x17, 0x2D, 0xF5, 0xC0, 0x7D, 0x67, 0xE2, 0xF1, 0x0D, 0x00,\n    0x04, 0xD4, 0x68, 0x9F, 0xB8, 0x48, 0xFE, 0xB6, 0xA8, 0x6F, 0xFD, 0xCB, 0x34, 0x94, 0xFA, 0x2D,\n    0xFA, 0x46, 0x3E, 0x11, 0x2D, 0xF5, 0xBB, 0x2B, 0xD2, 0x92, 0x92, 0x0E, 0x37, 0xEB, 0x7E, 0x84,\n    0xF9, 0xFD, 0x3B, 0x22, 0xD3, 0xCD, 0xFC, 0x46, 0xEF, 0x21, 0x35, 0x91, 0x19, 0xCF, 0x1F, 0xE0,\n    0xFE, 0x5C, 0x1A, 0x49, 0x38, 0x95, 0xE0, 0x40, 0x1D, 0x4A, 0xB8, 0xB7, 0xBB, 0xB8, 0x52, 0x08,\n    0x37, 0x72, 0xE4, 0xF6, 0xE8, 0x42, 0x0A, 0xAB, 0x1E, 0xF0, 0x74, 0x7B, 0xFB, 0x9E, 0x94, 0x4C,\n    0x87, 0xF5, 0xEE, 0x0D, 0x9E, 0x07, 0x10, 0x79, 0x0C, 0x02, 0xA7, 0xE6, 0x4A, 0xBF, 0xAB, 0xAD,\n    0x71, 0x5F, 0x31, 0xE1, 0xD5, 0x39, 0x1E, 0x72, 0x53, 0x93, 0xA4, 0x38, 0xB4, 0x04, 0x79, 0xA3,\n    0x72, 0xCD, 0xBC, 0x29, 0x3E, 0x9F, 0x63, 0xF4, 0x87, 0xB5, 0xB8, 0x99, 0xFC, 0x4E, 0x9D, 0xD2,\n    0xD9, 0x6F, 0xD5, 0x16, 0x1D, 0x01, 0xF8, 0x43, 0x22, 0x6B, 0xF9, 0xF8, 0xF8, 0x7E, 0x03, 0xD1,\n    0xF0, 0xC9, 0x8B, 0x97, 0x78, 0x12, 0xF1, 0xE8, 0x23, 0x88, 0x53, 0xD3, 0x73, 0x8D, 0x8D, 0x5D,\n    0x64, 0x7F, 0xD8, 0x5E, 0x15, 0xA6, 0x4E, 0x31, 0xE5, 0x8F, 0x1E, 0x7C, 0x8F, 0xC7, 0x60, 0x86,\n    0x2B, 0x4F, 0x69, 0x0E, 0x2C, 0x39, 0x8B, 0xFC, 0xF4, 0x5C, 0xF4, 0x0A, 0x63, 0x4E, 0xE5, 0xCA,\n    0x46, 0x6B, 0x15, 0xF3, 0x9B, 0x7E, 0xBB, 0xD9, 0xA1, 0x87, 0x50, 0x36, 0x23, 0xEF, 0x37, 0x88,\n    0xE3, 0x89, 0xAB, 0x5F, 0x0A, 0x07, 0xB4, 0x5F, 0xF8, 0x45, 0xBB, 0xE8, 0x12, 0x10, 0xE8, 0x95,\n    0xB6, 0x13, 0xEF, 0x51, 0xA2, 0x24, 0x12, 0x7F, 0x6D, 0x05, 0x0E, 0x94, 0xF9, 0x92, 0xB8, 0x2E,\n    0x64, 0x40, 0xDC, 0xDA, 0xDC, 0xDE, 0x82, 0x81, 0x9C, 0xE0, 0x0A, 0x27, 0xC6, 0x06, 0xB5, 0x01,\n    0xBF, 0x36, 0x76, 0xF8, 0xB1, 0xE5, 0x3C, 0x42, 0xC3, 0x07, 0xE7, 0xBD, 0xFC, 0x7B, 0xFD, 0x70,\n    0x4C, 0x17, 0x8F, 0x21, 0x9B, 0xBA, 0x06, 0xFC, 0x34, 0x56, 0xDD, 0x23, 0x7E, 0x2C, 0x8D, 0xF8,\n    0x99, 0xD6, 0x69, 0xDA, 0x75, 0x42, 0x84, 0x43, 0xDB, 0x51, 0x12, 0xA0, 0x78, 0xEC, 0x95, 0x87,\n    0x86, 0x84, 0xC9, 0x21, 0xEF, 0x8C, 0x0D, 0xEA, 0xBC, 0xE7, 0x5A, 0x23, 0x01, 0xB1, 0xBD, 0x6A,\n    0x23, 0x49, 0x1C, 0x42, 0xED, 0x39, 0x5D, 0x26, 0xEF, 0x54, 0x36, 0x5E, 0xE8, 0xA8, 0xB0, 0xC9,\n    0xF2, 0x39, 0xD0, 0x49, 0x10, 0x89, 0x2A, 0xF3, 0x4F, 0x3B, 0x3F, 0xF3, 0x6F, 0x98, 0xC0, 0xA2,\n    0x37, 0xC5, 0x98, 0xCB, 0x7A, 0xE6, 0x78, 0x11, 0x15, 0x97, 0x77, 0x7D, 0x34, 0xE5, 0x67, 0x61,\n    0x8B, 0xC7, 0x2B, 0xA2, 0xE8, 0x67, 0x3F, 0xBA, 0xD6, 0xEC, 0xC1, 0x5B, 0xF7, 0x4E, 0x70, 0xC3,\n    0x1A, 0x98, 0x20, 0x05, 0xBA, 0x2D, 0x2B, 0x79, 0xB8, 0x10, 0xA3, 0x74, 0xC9, 0x50, 0xEC, 0x90,\n    0x3C, 0xA9, 0xF8, 0xF7, 0xF9, 0x9F, 0xF9, 0xE1, 0x8E, 0x92, 0x40, 0xEE, 0x62, 0xCE, 0x36, 0x70,\n    0x90, 0xAA, 0x3D, 0x17, 0xDF, 0x78, 0x8D, 0x49, 0xC1, 0x77, 0x9F, 0xF0, 0xBC, 0x8A, 0xF6, 0x06,\n    0x90, 0xF5, 0x13, 0x51, 0xA7, 0x1B, 0xB8, 0x7B, 0x15, 0xAE, 0xBA, 0x54, 0x90, 0xCA, 0x01, 0x0C,\n    0xB0, 0x82, 0xF1, 0xA6, 0x36, 0x0E, 0x1F, 0x40, 0x38, 0x19, 0xE5, 0x3D, 0x22, 0x12, 0x0A, 0xB7,\n    0x17, 0x5D, 0x47, 0x46, 0x85, 0xE9, 0x40, 0xC3, 0x90, 0x6D, 0xAE, 0xBE, 0x95, 0xCA, 0xA1, 0x00,\n    0x47, 0x6C, 0x6E, 0xCE, 0xBF, 0xAB, 0x0A, 0x9B, 0x73, 0x86, 0x4C, 0x64, 0x73, 0x7D, 0xF4, 0x01,\n    0xCF, 0x4F, 0x4F, 0xBD, 0xFB, 0xC5, 0x37, 0xC1, 0x95, 0xAC, 0xCE, 0x58, 0x0A, 0x58, 0x26, 0x67,\n    0xF2, 0x0B, 0x10, 0x13, 0xC5, 0x8D, 0x72, 0xAC, 0xCE, 0xC2, 0x7B, 0x74, 0xB6, 0x4A, 0xB6, 0x0A,\n    0x8B, 0xD9, 0x27, 0x3A, 0x3D, 0x15, 0x42, 0xA4, 0xF5, 0xC3, 0x04, 0x91, 0x64, 0x05, 0xF1, 0x44,\n    0x27, 0x9D, 0xBE, 0xB6, 0x24, 0xDA, 0x68, 0x7B, 0xDB, 0x5C, 0xF7, 0x02, 0x72, 0xF4, 0xBC, 0x88,\n    0xF6, 0x8A, 0xE1, 0x45, 0xE8, 0x9D, 0x06, 0x5F, 0x37, 0x61, 0xF5, 0xD4, 0xE8, 0x37, 0xAA, 0xE7,\n    0x79, 0xAA, 0x7C, 0x21, 0x93, 0x0C, 0x66, 0x95, 0x63, 0xE8, 0x25, 0xAD, 0xCB, 0xBD, 0x29, 0x96,\n    0x7A, 0x87, 0x76, 0x18, 0xC4, 0x97, 0x74, 0x24, 0xF4, 0x00, 0x00, 0x0E, 0x7E, 0xB1, 0xAD, 0x5D,\n    0xF1, 0x63, 0x3C, 0xF0, 0xA3, 0x21, 0x91, 0x04, 0x15, 0x5C, 0xCD, 0xEC, 0xA3, 0xDC, 0x39, 0x7A,\n    0x85, 0x12, 0xFC, 0x4C, 0x7B, 0xF6, 0x01, 0x9D, 0xBC, 0x64, 0x31, 0x27, 0xFB, 0x20, 0x69, 0xB2,\n    0x95, 0x8A, 0xB8, 0x53, 0x15, 0x0D, 0xE8, 0x12, 0x44, 0xA5, 0x96, 0x91, 0x19, 0xA1, 0xB5, 0x77,\n    0xA2, 0xD2, 0x91, 0x63, 0xB2, 0x3B, 0x8C, 0x29, 0x5A, 0x77, 0xCB, 0x9A, 0x82, 0x17, 0x7C, 0xEB,\n    0x9A, 0x8D, 0x1D, 0x38, 0xFD, 0x0D, 0x33, 0x62, 0xD3, 0xF1, 0x90, 0xA1, 0x41, 0x90, 0x85, 0x10,\n    0x28, 0x1C, 0x73, 0x77, 0xD6, 0x64, 0xAE, 0xDE, 0x21, 0x5D, 0xE6, 0xD0, 0xBE, 0x59, 0xA8, 0x04,\n    0xB1, 0xF1, 0x70, 0xA3, 0xDA, 0xD6, 0xB0, 0xBC, 0x7F, 0x3D, 0x60, 0x91, 0x38, 0xA3, 0xC9, 0xC1,\n    0xBE, 0xA0, 0xD6, 0x4A, 0x8E, 0x33, 0xF6, 0x1A, 0x99, 0x20, 0xBF, 0xFC, 0x38, 0x9F, 0xD6, 0x66,\n    0x6A, 0x61, 0xF7, 0xB0, 0x09, 0xC3, 0xB2, 0xD3, 0xC1, 0xA1, 0xB3, 0xB4, 0x6A, 0xE3, 0x94, 0xF5,\n    0x92, 0xD3, 0xC0, 0xB6, 0x12, 0x53, 0x7A, 0xAC, 0x1E, 0x69, 0x58, 0x3B, 0x1C, 0x0F, 0x69, 0x9E,\n    0x0E, 0xAA, 0xF4, 0xF2, 0x12, 0xAE, 0x66, 0x3B, 0x40, 0x4A, 0xC3, 0x19, 0x15, 0xDA, 0x08, 0x58,\n    0x73, 0x1A, 0x9D, 0x18, 0xAD, 0xA7, 0xA3, 0x66, 0xD1, 0x5D, 0x9A, 0x36, 0x4E, 0xF0, 0xA5, 0x69,\n    0x33, 0xD0, 0x8A, 0x11, 0x2E, 0xBA, 0x33, 0xCB, 0xBE, 0x4F, 0x63, 0x9D, 0x97, 0x50, 0x26, 0x96,\n    0x8F, 0x6F, 0x4D, 0x30, 0x80, 0x72, 0x28, 0x5E, 0xA8, 0x74, 0x8E, 0x42, 0x9D, 0x15, 0xDA, 0xAC,\n    0x36, 0x74, 0x91, 0xFA, 0x29, 0x8F, 0x54, 0xF5, 0x06, 0xCC, 0x80, 0x78, 0xED, 0x76, 0xDA, 0x3D,\n    0x86, 0x9D, 0x9D, 0x3D, 0xA4, 0xA4, 0x7E, 0x9A, 0x80, 0xCC, 0x90, 0x7C, 0x90, 0x14, 0x8D, 0x33,\n    0x30, 0x8B, 0xCB, 0x17, 0x36, 0xBB, 0xAF, 0xA7, 0xE6, 0x7C, 0xA3, 0xE1, 0x7D, 0xB0, 0xA1, 0x9A,\n    0xA6, 0x28, 0xFE, 0x13, 0xA3, 0xFF, 0xE5, 0xE9, 0xC9, 0xBD, 0x1E, 0xEF, 0x2C, 0xB6, 0xFE, 0x6F,\n    0x6E, 0xDD, 0x94, 0xAB, 0x1C, 0xCE, 0x6E, 0x2A, 0x30, 0x08, 0x82, 0xD3, 0xD1, 0xFB, 0xE3, 0xC8,\n    0x63, 0x25, 0xB2, 0xF6, 0x67, 0x1D, 0x72, 0x57, 0x8B, 0xEE, 0x9F, 0x56, 0x2F, 0x16, 0x3E, 0x9B,\n    0xEC, 0x27, 0xDE, 0x2E, 0x84, 0x97, 0x67, 0xA9, 0x69, 0x0D, 0xC5, 0x59, 0xC3, 0xC8, 0x74, 0xEE,\n    0x04, 0x89, 0xEF, 0xF6, 0x4B, 0xB9, 0xA2, 0xE5, 0x82, 0x78, 0x1F, 0x49, 0xDB, 0x02, 0xC6, 0x56,\n    0x4B, 0xD6, 0x25, 0xDB, 0xBD, 0xF9, 0x9C, 0xFD, 0x2E, 0xF3, 0x05, 0x5A, 0x73, 0x69, 0x2A, 0xE9,\n    0x62, 0xD2, 0x10, 0x82, 0x9D, 0xC8, 0x6C, 0xDC, 0xC6, 0xF2, 0x18, 0x17, 0xEB, 0x2F, 0x91, 0xDC,\n    0x30, 0x55, 0xDF, 0xD8, 0x7C, 0xA4, 0x79, 0xE0, 0xC5, 0x37, 0x9D, 0x23, 0xD5, 0xDF, 0xA4, 0xF2,\n    0x1B, 0x60, 0xB6, 0xC7, 0x6F, 0x20, 0x5C, 0xFC, 0xF2, 0x6D, 0x01, 0x75, 0xFB, 0x50, 0x01, 0x5D,\n    0x24, 0x48, 0x53, 0xBF, 0x27, 0x99, 0x73, 0x3A, 0x47, 0xD4, 0xDD, 0xBF, 0xE7, 0x41, 0xD3, 0x15,\n    0x09, 0x21, 0x29, 0xDA, 0xFE, 0x6A, 0x8E, 0x20, 0xB8, 0x86, 0xC1, 0x8D, 0x54, 0x74, 0xC7, 0xD6,\n    0x66, 0xA7, 0xE5, 0x67, 0xB9, 0xE8, 0x0A, 0x74, 0x3A, 0xF9, 0x4D, 0xAF, 0x54, 0x2D, 0xF0, 0x44,\n    0x79, 0x04, 0x01, 0x54, 0x49, 0xF9, 0x04, 0x2A, 0xEF, 0xDD, 0x50, 0x19, 0xF6, 0x56, 0x0A, 0x34,\n    0x58, 0x20, 0x90, 0x23, 0x94, 0x70, 0x43, 0xBC, 0xF3, 0x1E, 0xC0, 0x7D, 0xB5, 0xBD, 0xF0, 0xBF,\n    0xC9, 0x1F, 0x93, 0x17, 0x1D, 0x56, 0xDF, 0xA0, 0x42, 0x9C, 0xAA, 0x31, 0xD1, 0xE0, 0x74, 0x0D,\n    0x42, 0x02, 0x3B, 0x06, 0xF6, 0xC5, 0xA8, 0xBB, 0x17, 0x5C, 0xCD, 0x56, 0x71, 0x9E, 0xAA, 0x1E,\n    0xE8, 0x96, 0x4E, 0x0D, 0x55, 0x4E, 0xA0, 0x9E, 0xDC, 0x30, 0x3E, 0x58, 0xD3, 0x62, 0xB6, 0xAB,\n    0x3B, 0xCF, 0x4D, 0x2B, 0x4A, 0x17, 0x25, 0xFB, 0xCA, 0x5E, 0x0A, 0x3B, 0x82, 0x36, 0xCC, 0x6D,\n    0x5D, 0x64, 0x86, 0x5C, 0x73, 0x1E, 0x86, 0xDC, 0x32, 0x5F, 0xF5, 0x2A, 0x2D, 0x58, 0x89, 0xDA,\n    0x23, 0x1A, 0xAB, 0x0A, 0x6E, 0x5F, 0xD3, 0x84, 0x33, 0x33, 0xC7, 0xFD, 0x42, 0xE9, 0xD3, 0xBD,\n    0x56, 0xE3, 0x70, 0x8A, 0xBA, 0x95, 0xAF, 0xF6, 0x0A, 0xA6, 0x22, 0x50, 0x3B, 0xCB, 0x1A, 0xE8,\n    0x88, 0xDF, 0xD3, 0xE8, 0x94, 0x8C, 0xBF, 0xC7, 0x32, 0x4C, 0x31, 0x0F, 0x1E, 0x14, 0x95, 0x9C,\n    0x2E, 0x08, 0x5B, 0x8B, 0x63, 0x62, 0x51, 0x5B, 0xAB, 0x8B, 0x81, 0x6E, 0xA2, 0x9B, 0xE3, 0x56,\n    0x9B, 0x78, 0x44, 0x09, 0xCC, 0xD4, 0x69, 0xC4, 0xF0, 0x4F, 0x7D, 0xA9, 0x1B, 0xE1, 0xD7, 0xFB,\n    0xD4, 0x44, 0x3F, 0xFF, 0x3E, 0xDB, 0xEC, 0xB7, 0x52, 0x91, 0x0E, 0xE6, 0xF7, 0xEF, 0x2F, 0x32,\n    0x15, 0xC5, 0x25, 0xA6, 0x10, 0xDF, 0xD2, 0x2F, 0x5E, 0xD0, 0x50, 0x28, 0x47, 0xA2, 0x93, 0x37,\n    0x42, 0x33, 0xC2, 0x3E, 0x2E, 0x1C, 0x1A, 0x52, 0xE5, 0x2C, 0x71, 0x6C, 0xB5, 0x4A, 0x78, 0xD2,\n    0x60, 0xDE, 0x9D, 0x26, 0x8E, 0xAA, 0x3C, 0x31, 0xFA, 0x55, 0x78, 0x41, 0xD1, 0xBC, 0x9D, 0x19,\n    0x85, 0x8B, 0x4C, 0xF9, 0x10, 0x95, 0x0E, 0x43, 0x8A, 0x34, 0x66, 0x4A, 0x5A, 0x4D, 0xD9, 0x4A,\n    0xD6, 0x19, 0x23, 0xC9, 0x67, 0x6A, 0x81, 0x36, 0x87, 0xC2, 0x79, 0x89, 0xE7, 0x17, 0x90, 0x7E,\n    0x5B, 0x61, 0x49, 0xD8, 0x05, 0xA0, 0x4F, 0x08, 0x9A, 0x77, 0x53, 0x6D, 0x8C, 0xD5, 0x36, 0x4F,\n    0xE7, 0x4E, 0x56, 0xB4, 0xE1, 0xC0, 0x53, 0xD3, 0xB8, 0xBE, 0xB7, 0x90, 0xCA, 0xFE, 0xB9, 0x80,\n    0x0E, 0x13, 0xB2, 0x7C, 0x8F, 0x66, 0x40, 0xCC, 0x8B, 0xB0, 0x7C, 0x32, 0x89, 0xDE, 0x2C, 0x5D,\n    0x6A, 0xC5, 0xE9, 0x4B, 0x36, 0x38, 0xCD, 0x51, 0xE2, 0x97, 0x9F, 0x12, 0x45, 0x92, 0x68, 0x38,\n    0xED, 0x62, 0x6A, 0xB6, 0x9A, 0x36, 0x82, 0x72, 0x43, 0x58, 0x0F, 0xA9, 0xB0, 0x4F, 0x12, 0xC9,\n    0x32, 0x2C, 0xC0, 0xAF, 0xF6, 0xE5, 0x4D, 0x48, 0xBF, 0xDD, 0xEC, 0xDB, 0x28, 0xC9, 0xD3, 0x5B,\n    0xE3, 0xFC, 0x7E, 0xAD, 0x76, 0x28, 0xD4, 0x23, 0x71, 0x85, 0xA5, 0x22, 0xE9, 0x93, 0x5E, 0x43,\n    0xB5, 0x0F, 0xAE, 0xDF, 0x8B, 0x51, 0x41, 0x86, 0xC3, 0x55, 0xE4, 0x68, 0x43, 0x27, 0x7C, 0x0C,\n    0x8F, 0x7F, 0xA0, 0x5A, 0x7A, 0xD7, 0x88, 0xC3, 0x8E, 0xF8, 0xC0, 0xF3, 0xB3, 0xC9, 0x15, 0x34,\n    0x80, 0x16, 0x34, 0x13, 0x17, 0x6A, 0xD1, 0x59, 0x03, 0x94, 0x59, 0x7B, 0xA0, 0xE8, 0xE0, 0xA4,\n    0x16, 0xFC, 0x76, 0xF0, 0x7C, 0x5A, 0x00, 0x01, 0x50, 0xE8, 0x56, 0xEF, 0x18, 0xC8, 0xDA, 0xBC,\n    0xCD, 0xB8, 0x92, 0xB8, 0x22, 0xE3, 0xB5, 0x16, 0x05, 0x25, 0xE7, 0x65, 0x3D, 0x1C, 0x0F, 0x23,\n    0xC5, 0x24, 0x16, 0x9E, 0x75, 0xCC, 0xF0, 0xF9, 0x19, 0x47, 0x83, 0xA0, 0x42, 0xBC, 0x36, 0x99,\n    0x76, 0xE0, 0x27, 0xA9, 0xDB, 0x4A, 0x6E, 0x50, 0x22, 0x99, 0x4D, 0xDF, 0x43, 0x69, 0xA3, 0x95,\n    0x48, 0x97, 0xC7, 0xC5, 0x4F, 0x1B, 0x2A, 0x32, 0xBA, 0x9F, 0xB9, 0x2D, 0x1D, 0xE3, 0x6E, 0x46,\n    0x1F, 0xBD, 0x7A, 0x4F, 0x2A, 0x07, 0xB4, 0xA2, 0xC2, 0x31, 0xA9, 0x93, 0xE9, 0x98, 0x39, 0x93,\n    0x89, 0x51, 0x82, 0x10, 0x99, 0xD5, 0x65, 0x25, 0x27, 0x37, 0xB1, 0x7E, 0x98, 0x50, 0xEC, 0xA7,\n    0x29, 0xE0, 0xBE, 0xA4, 0x0C, 0xD5, 0x9B, 0x3D, 0xAD, 0x02, 0x4D, 0x81, 0x93, 0x0F, 0xA4, 0xD7,\n    0xF4, 0x48, 0xCC, 0x4E, 0xF6, 0x6F, 0xF3, 0x5C, 0xF6, 0x5A, 0x2E, 0x05, 0xFA, 0xFB, 0x04, 0x8D,\n    0x95, 0x29, 0x94, 0x03, 0x34, 0xF2, 0x33, 0xD9, 0x5B, 0x47, 0x96, 0x6C, 0x0C, 0xE6, 0x8E, 0xF2,\n    0xD1, 0xF2, 0x83, 0x6A, 0xF2, 0x95, 0x4C, 0xBF, 0x46, 0xB4, 0x42, 0x95, 0xDA, 0x59, 0xBE, 0x32,\n    0x2F, 0xFB, 0x7A, 0x33, 0xA0, 0x09, 0xB6, 0x34, 0x49, 0x4B, 0xA7, 0x9B, 0xF6, 0x56, 0xA9, 0xB7,\n    0x5A, 0x98, 0xCD, 0x74, 0xF9, 0xBB, 0xD9, 0x1A, 0x46, 0x87, 0x5D, 0xA4, 0x81, 0x25, 0xB9, 0x9E,\n    0x58, 0xF7, 0xBE, 0x19, 0x6E, 0x84, 0x50, 0x7D, 0x94, 0x3B, 0x57, 0x0A, 0x05, 0x81, 0x42, 0x2F,\n    0x42, 0x90, 0x9B, 0xF1, 0xA7, 0x66, 0xD0, 0xD4, 0xF6, 0xD0, 0xB7, 0xE0, 0xDF, 0x2D, 0x6D, 0x60,\n    0x11, 0xBE, 0xC8, 0xB3, 0x65, 0xEB, 0x71, 0x33, 0x74, 0xAD, 0xD0, 0x3B, 0x5D, 0x06, 0x79, 0x9B,\n    0xD8, 0x03, 0xB7, 0x28, 0xEC, 0x2D, 0x3F, 0x82, 0xE5, 0xD4, 0x73, 0x01, 0xE8, 0x51, 0xD5, 0x04,\n    0x46, 0x0D, 0xA9, 0x48, 0x83, 0x75, 0x88, 0x87, 0x4F, 0xA3, 0xC5, 0xCC, 0x0E, 0x39, 0x46, 0x9E,\n    0xE8, 0xC7, 0x7C, 0xC2, 0xA1, 0xEA, 0x89, 0x08, 0xE4, 0x37, 0xAC, 0xC6, 0x2B, 0x50, 0x7D, 0x78,\n    0x4F, 0x72, 0xC8, 0x96, 0xDC, 0x48, 0xB0, 0xEF, 0x69, 0x70, 0xDF, 0x85, 0x0A, 0xE8, 0xEF, 0x14,\n    0xF9, 0x8C, 0xFE, 0x9E, 0xB1, 0xA4, 0x9B, 0x58, 0xC1, 0x77, 0x5E, 0x88, 0x3D, 0xB1, 0x39, 0xC9,\n    0xE1, 0x8B, 0x4C, 0x16, 0xC2, 0x10, 0xD7, 0x4D, 0x11, 0x11, 0x3E, 0xD9, 0x60, 0xD1, 0xAB, 0x18,\n    0x9D, 0x85, 0x8E, 0xFF, 0xFA, 0xB6, 0x09, 0x2B, 0xD2, 0x9A, 0xFD, 0x6F, 0x5C, 0x05, 0x51, 0x04,\n    0x03, 0x25, 0x38, 0x12, 0xCD, 0xF1, 0x0B, 0x10, 0x28, 0x8A, 0x09, 0x2E, 0x2C, 0x38, 0x43, 0x19,\n    0x40, 0xF8, 0x45, 0xFF, 0x80, 0x5D, 0xD4, 0xDB, 0x52, 0x2C, 0x51, 0x77, 0xD7, 0xB1, 0xFF, 0xED,\n    0x06, 0x99, 0x56, 0x48, 0x53, 0x40, 0xF7, 0x80, 0xFB, 0x9C, 0x0E, 0x6F, 0x1D, 0x25, 0xAA, 0x4C,\n    0x8E, 0x91, 0xE7, 0xC5, 0x0A, 0xDB, 0x3F, 0xEA, 0x48, 0xB9, 0xB2, 0xFA, 0x39, 0x46, 0x9E, 0x3A,\n    0xC3, 0xDC, 0x15, 0xF9, 0xCF, 0x8C, 0xA7, 0x14, 0xFD, 0x16, 0x11, 0x69, 0xC7, 0xD9, 0x2B, 0x00,\n    0xBA, 0xE7, 0x47, 0xB5, 0xF3, 0x74, 0x14, 0x11, 0xC5, 0x29, 0x5F, 0xA0, 0xF2, 0x0B, 0xB5, 0x45,\n    0xEB, 0x88, 0x96, 0x1F, 0x26, 0xCC, 0x47, 0xD7, 0x5A, 0x96, 0x1A, 0xB5, 0xD7, 0x66, 0x98, 0xD0,\n    0x65, 0xDC, 0xE2, 0x15, 0xAF, 0xAC, 0x7E, 0x60, 0xBE, 0x9E, 0x2D, 0xB5, 0x9B, 0xD9, 0x19, 0x36,\n    0x53, 0x2F, 0xE4, 0x40, 0xD7, 0xDC, 0x82, 0x16, 0x8B, 0x99, 0x1B, 0xB3, 0x5C, 0xBB, 0x6A, 0x3F,\n    0x90, 0xE4, 0xF8, 0x57, 0xDE, 0x9E, 0x63, 0xFD, 0x78, 0x4F, 0x0A, 0x26, 0x73, 0x0E, 0xD9, 0x47,\n    0x8B, 0x52, 0xBF, 0x77, 0x75, 0x15, 0xD2, 0x70, 0xDC, 0x4B, 0x47, 0x1D, 0x6A, 0x7A, 0x5F, 0xFE,\n    0x64, 0x89, 0xAB, 0xA1, 0x95, 0x8F, 0x27, 0xD1, 0xAD, 0x5C, 0x6D, 0xAB, 0xAF, 0x53, 0xA5, 0x7E,\n    0xFC, 0x14, 0x02, 0xE0, 0xEA, 0x14, 0x60, 0x71, 0x20, 0xB5, 0x2B, 0x33, 0x47, 0xE8, 0x05, 0x82,\n    0x4B, 0x85, 0xE3, 0xFE, 0x9D, 0x21, 0x95, 0x7F, 0x18, 0x11, 0xB4, 0x0D, 0x7F, 0xB6, 0xAB, 0xF4,\n    0xF4, 0xE7, 0x43, 0x20, 0x50, 0x28, 0x72, 0x8B, 0x11, 0x83, 0xA5, 0xB6, 0x1E, 0x94, 0xF9, 0x25,\n    0x94, 0x2B, 0xBC, 0xD6, 0x55, 0x41, 0xE4, 0xF0, 0xD9, 0xF5, 0x4D, 0x30, 0x4A, 0xD4, 0x9D, 0x3B,\n    0x23, 0xE3, 0x95, 0x2E, 0xB6, 0x60, 0x0D, 0xAD, 0x28, 0xE5, 0xF9, 0x6E, 0x6A, 0x74, 0xB5, 0x6C,\n    0x88, 0x59, 0x87, 0x30, 0x4A, 0x54, 0xE0, 0x80, 0xAA, 0x1E, 0x76, 0x02, 0x16, 0x55, 0xC5, 0xF2,\n    0xC8, 0x38, 0xE3, 0x22, 0x12, 0x7A, 0x16, 0x51, 0xDB, 0x5B, 0x38, 0xF3, 0xE0, 0xC1, 0x45, 0x56,\n    0x6A, 0xD3, 0xD3, 0x25, 0x59, 0x9A, 0x7A, 0x1F, 0x8A, 0xF4, 0xAF, 0x98, 0x4E, 0xC8, 0x1D, 0x6A,\n    0x7E, 0x34, 0x4B, 0xD7, 0x85, 0x2F, 0xBB, 0x0F, 0x7B, 0xD4, 0x76, 0x44, 0x83, 0x8A, 0x76, 0x01,\n    0x39, 0xAE, 0x88, 0xA5, 0xB0, 0xFC, 0xBF, 0xEA, 0xD1, 0xFD, 0x44, 0x25, 0x72, 0xD9, 0xBC, 0x3F,\n    0xD9, 0xC1, 0x29, 0x44, 0x22, 0x0E, 0x6A, 0x49, 0xE1, 0x32, 0x23, 0xB3, 0x45, 0x80, 0x81, 0x9C,\n    0x38, 0x88, 0xE7, 0x27, 0x66, 0x09, 0x90, 0xF2, 0xBD, 0x3C, 0x4B, 0x10, 0x98, 0x52, 0x4D, 0x81,\n    0x26, 0x25, 0xD3, 0xE3, 0x66, 0x00, 0x27, 0x39, 0xBF, 0x6A, 0x40, 0x1D, 0x8F, 0x6F, 0x21, 0x16,\n    0x22, 0x73, 0x1E, 0x9E, 0x11, 0xFF, 0xB8, 0xC9, 0x9A, 0x56, 0x35, 0x14, 0x78, 0xBD, 0x1F, 0x7B,\n    0x89, 0x47, 0xB6, 0x6A, 0x51, 0xBC, 0x08, 0x9F, 0x3D, 0xCF, 0x1C, 0xC5, 0x2C, 0x82, 0x88, 0x72,\n    0xCC, 0x35, 0x9B, 0xD7, 0x31, 0xFE, 0xAE, 0x40, 0x2D, 0xBF, 0x21, 0xC3, 0xF1, 0xA8, 0x39, 0xC0,\n    0x59, 0xB4, 0x29, 0x7C, 0x5D, 0x5C, 0x0A, 0x7C, 0xD6, 0xA2, 0xB9, 0x5A, 0x69, 0x3A, 0xF2, 0xA5,\n    0xB5, 0x40, 0x5D, 0x84, 0x1E, 0x8A, 0x93, 0x2B, 0x75, 0x8C, 0xF0, 0x7F, 0x57, 0x12, 0xB6, 0xF9,\n    0xBB, 0xBE, 0x28, 0x20, 0x4B, 0xB1, 0xA8, 0x90, 0xE6, 0x6A, 0xE9, 0xB3, 0xB2, 0x14, 0xCE, 0xA0,\n    0xCD, 0x9B, 0xD2, 0x8D, 0xEB, 0x34, 0xB2, 0x71, 0x86, 0x96, 0xFB, 0x88, 0x5E, 0x9F, 0x0D, 0xE6,\n    0x99, 0x87, 0xAB, 0xAA, 0xF4, 0xEA, 0xD3, 0xFE, 0xCE, 0x6D, 0x2C, 0x93, 0x8A, 0x06, 0x16, 0x47,\n    0xBB, 0xFF, 0xE0, 0xC5, 0x31, 0xF1, 0x46, 0x31, 0xB4, 0x6D, 0xFE, 0x9A, 0x62, 0xC0, 0xD9, 0x17,\n    0xC2, 0x38, 0x18, 0x5C, 0xBA, 0x00, 0xCE, 0x10, 0x89, 0x96, 0x36, 0x82, 0x95, 0xD4, 0x76, 0x90,\n    0x7D, 0x5D, 0x79, 0x59, 0x20, 0x63, 0xA4, 0x5F, 0x10, 0x5C, 0x08, 0xF4, 0x53, 0x39, 0xC7, 0x16,\n    0xB7, 0xE7, 0x37, 0xC6, 0x67, 0x2D, 0x75, 0xA9, 0x86, 0x96, 0x3D, 0x55, 0x45, 0xFE, 0xFA, 0xC4,\n    0xFE, 0x66, 0xEA, 0x53, 0xD3, 0x3C, 0x40, 0xA1, 0x96, 0x31, 0x0F, 0x2C, 0x56, 0x82, 0xF5, 0xAD,\n    0x4B, 0x56, 0x1A, 0x04, 0x5E, 0xC0, 0x92, 0xED, 0x74, 0xF1, 0x9D, 0x11, 0x0F, 0x8F, 0x69, 0x90,\n    0x53, 0x78, 0x71, 0x0D, 0x8A, 0x6C, 0x8E, 0xB0, 0xA2, 0x33, 0x38, 0x7E, 0x18, 0xC5, 0x28, 0xEE,\n    0x4F, 0xE5, 0x57, 0xC5, 0x5E, 0x42, 0xDE, 0xA8, 0xB7, 0x77, 0xE5, 0x5D, 0xDD, 0xD9, 0xFE, 0xFF,\n    0x69, 0xF6, 0x0A, 0xBF, 0xE1, 0x22, 0xEC, 0x09, 0xF3, 0x05, 0x61, 0x31, 0x71, 0x31, 0x06, 0x36,\n    0x76, 0x34, 0xB4, 0x5B, 0x46, 0x4C, 0x7F, 0x26, 0x0F, 0x97, 0x75, 0x34, 0x75, 0x2B, 0x88, 0x1B,\n    0xEC, 0xF7, 0x65, 0xF7, 0x92, 0x30, 0x04, 0xBA, 0x56, 0xBE, 0x44, 0xF8, 0x0C, 0x3A, 0x27, 0xD9,\n    0xE1, 0x70, 0x10, 0x18, 0xE8, 0xE0, 0xB5, 0xC6, 0x1E, 0x0E, 0x11, 0x7C, 0xB8, 0x7C, 0x3E, 0xD1,\n    0xDD, 0xEB, 0xA4, 0x14, 0x2F, 0xC1, 0xAB, 0x77, 0x0E, 0x51, 0x23, 0xCC, 0x5E, 0x34, 0x19, 0xC9,\n    0xBD, 0x81, 0x96, 0x00, 0xD6, 0xE9, 0xAA, 0x82, 0xD3, 0xE6, 0x00, 0x09, 0x3E, 0xC0, 0xB6, 0x4F,\n    0xF1, 0x39, 0x00, 0xF0, 0xD6, 0xB1, 0x7A, 0xA2, 0xD3, 0xD6, 0x08, 0x65, 0xE5, 0x4A, 0x84, 0xDA,\n    0x85, 0x17, 0xAC, 0x17, 0x03, 0x35, 0x07, 0x8F, 0xF9, 0xB3, 0xCC, 0xC9, 0x3E, 0xF9, 0x4E, 0xA4,\n    0x30, 0xE3, 0xC9, 0x96, 0x8B, 0x6B, 0x53, 0x4E, 0x11, 0xAF, 0x53, 0xAC, 0x92, 0x8E, 0xCC, 0xFE,\n    0xCA, 0x12, 0x7F, 0x92, 0x0A, 0x62, 0x7A, 0x38, 0xCA, 0xAA, 0x89, 0x0C, 0x00, 0x91, 0xA1, 0x9F,\n    0x96, 0x13, 0x2B, 0x46, 0x0E, 0x59, 0xC0, 0xF3, 0x49, 0xDC, 0xF0, 0xFA, 0xBF, 0x4D, 0xE7, 0xF3,\n    0x0A, 0x82, 0x12, 0x05, 0xDE, 0xA5, 0xA9, 0x8B, 0x67, 0xD0, 0xF5, 0x0B, 0xEE, 0xA1, 0x73, 0x8F,\n    0xCC, 0x47, 0x67, 0x7E, 0x83, 0x79, 0x56, 0x19, 0x49, 0x5B, 0xE0, 0x30, 0x5F, 0xE6, 0xCB, 0x6E,\n    0xEC, 0x69, 0x31, 0xB8, 0x87, 0x6E, 0xC0, 0xEA, 0x76, 0x79, 0x3A, 0x1A, 0x05, 0x8B, 0xD3, 0xB1,\n    0x56, 0x57, 0x13, 0xDF, 0x3A, 0x6F, 0x38, 0xFF, 0x3A, 0xFB, 0x59, 0x35, 0x37, 0xFA, 0x93, 0xBB,\n    0xA3, 0x13, 0x69, 0xC1, 0xCA, 0x3B, 0x9C, 0x73, 0x51, 0x81, 0x38, 0x57, 0x12, 0x55, 0xA7, 0x7F,\n    0x27, 0x87, 0x8B, 0x4A, 0x0C, 0x7F, 0x2D, 0x6C, 0x6E, 0xED, 0x69, 0xDD, 0xC3, 0x29, 0xDA, 0x67,\n    0xDF, 0x2E, 0x9B, 0x3D, 0xB1, 0xA7, 0xFA, 0x1E, 0xF0, 0x09, 0xE2, 0x69, 0x4A, 0x97, 0xE0, 0x63,\n    0x92, 0x16, 0xF1, 0x7C, 0x70, 0x50, 0x72, 0xFE, 0x96, 0x94, 0xE4, 0xAB, 0x5A, 0xCA, 0xEB, 0x69,\n    0x3C, 0x12, 0xE5, 0x1A, 0xB8, 0x2C, 0x8C, 0x24, 0xA2, 0xF3, 0x2A, 0xFF, 0xA0, 0xEC, 0xE8, 0xDE,\n    0xAF, 0x4C, 0xA0, 0xEB, 0x4D, 0x13, 0x77, 0x19, 0x23, 0xE3, 0xE2, 0x72, 0xC3, 0xD4, 0x3A, 0x70,\n    0x1D, 0xA7, 0xE0, 0x92, 0x38, 0x98, 0x68, 0xBB, 0x82, 0x98, 0xC7, 0x30, 0x38, 0x50, 0x2A, 0xDF,\n    0xAF, 0x9C, 0x7F, 0xAB, 0x8A, 0xBB, 0x98, 0x6A, 0x48, 0x4A, 0xE4, 0x29, 0x3F, 0x5A, 0xBE, 0x7D,\n    0x3D, 0xC8, 0xCB, 0x13, 0x9E, 0x9D, 0x86, 0xC5, 0x96, 0x1C, 0xB4, 0xD6, 0xBF, 0x32, 0xE2, 0x4D,\n    0x1B, 0x86, 0x1A, 0xFA, 0xD0, 0xFB, 0x25, 0xA2, 0xBA, 0x6F, 0xEE, 0x36, 0xF6, 0x24, 0xEC, 0x7D,\n    0x8E, 0x96, 0xA4, 0x95, 0x4B, 0x3F, 0x5D, 0x1F, 0x11, 0x9B, 0xAD, 0x4B, 0xC5, 0x5C, 0x87, 0x58,\n    0xA4, 0x56, 0xEB, 0xEA, 0x99, 0xC3, 0x85, 0x11, 0x01, 0x7B, 0xFD, 0x39, 0x33, 0xB9, 0xD7, 0xDC,\n    0x26, 0x99, 0xCD, 0xB7, 0x7E, 0x7E, 0x60, 0xE7, 0x44, 0x29, 0x6C, 0x0C, 0xFB, 0x13, 0x71, 0x2B,\n    0x5C, 0x13, 0x88, 0xFD, 0xB9, 0xF4, 0x53, 0x20, 0xD6, 0xBB, 0xEF, 0xF0, 0xDB, 0x53, 0x4A, 0xD0,\n    0x1B, 0xF3, 0x6F, 0xDB, 0x8E, 0xF6, 0xB0, 0x46, 0x5C, 0x2A, 0xAD, 0xFB, 0x27, 0x52, 0xE5, 0xFD,\n    0x3D, 0x9B, 0x56, 0x9F, 0x47, 0xBA, 0xA9, 0xB7, 0xAA, 0x5C, 0xB2, 0xFD, 0x4F, 0xA8, 0xAD, 0xA9,\n    0xDB, 0xB2, 0x34, 0xE5, 0x86, 0xCB, 0x5F, 0xE7, 0x65, 0xEE, 0x92, 0x9D, 0x3E, 0x35, 0x42, 0x35,\n    0x48, 0x03, 0x52, 0x31, 0x71, 0xCE, 0x72, 0xEC, 0x1F, 0x88, 0xCE, 0xDC, 0xB2, 0x38, 0x32, 0xEA,\n    0x1B, 0x71, 0x22, 0xFC, 0x14, 0x53, 0xD8, 0x2E, 0x6B, 0xF3, 0xDB, 0xF9, 0x3F, 0x01, 0xDC, 0xEF,\n    0xFE, 0x74, 0xE4, 0xE1, 0x7B, 0x55, 0x21, 0xB5, 0x40, 0x78, 0x87, 0x76, 0xFC, 0xFA, 0x36, 0x25,\n    0x45, 0xB9, 0x47, 0x2A, 0x65, 0x56, 0x75, 0x8E, 0xDC, 0x6E, 0x27, 0x2D, 0x43, 0x82, 0xCC, 0x76,\n    0xA0, 0x48, 0x33, 0x88, 0x5B, 0x58, 0xF3, 0x83, 0x6D, 0x8C, 0x1E, 0xFC, 0xA3, 0x1A, 0xAC, 0x74,\n    0xB4, 0x38, 0x47, 0xCA, 0x20, 0x06, 0x14, 0xAB, 0x5A, 0xBD, 0x5E, 0x38, 0x5A, 0x1E, 0x88, 0xC7,\n    0xF9, 0x69, 0x7D, 0xBF, 0x91, 0x2C, 0x51, 0x18, 0x95, 0xF6, 0x19, 0x98, 0x79, 0xFC, 0x69, 0xFD,\n    0xF7, 0xA9, 0x21, 0xA1, 0xD4, 0xBF, 0xC5, 0x21, 0xF5, 0xBA, 0xD2, 0x9B, 0xF8, 0xA5, 0x40, 0x57,\n    0xD1, 0x10, 0x47, 0x0F, 0x93, 0x50, 0x0F, 0x5D, 0x97, 0x96, 0x14, 0x2B, 0x71, 0x63, 0x88, 0xEC,\n    0xA1, 0x92, 0xF0, 0x76, 0x86, 0x5C, 0xCC, 0x37, 0x86, 0x04, 0xD2, 0xB0, 0xDD, 0x53, 0x82, 0xD6,\n    0x28, 0xCC, 0x05, 0x60, 0xE1, 0x3F, 0x27, 0xD2, 0x1C, 0x80, 0x68, 0xAA, 0xA9, 0x16, 0xCD, 0xF5,\n    0x82, 0x55, 0x11, 0xDD, 0x05, 0x2D, 0x56, 0x9F, 0xC9, 0x92, 0xA2, 0xB8, 0xDF, 0xD9, 0x32, 0x28,\n    0xD4, 0xE9, 0xEA, 0x7E, 0x93, 0x5D, 0x33, 0x96, 0x77, 0x81, 0xCF, 0x63, 0xE2, 0xC5, 0xC4, 0x41,\n    0x89, 0x0A, 0x64, 0xCC, 0x68, 0xD3, 0x3A, 0x80, 0x1A, 0xAC, 0x36, 0xDC, 0x50, 0x95, 0x5B, 0x8A,\n    0xE7, 0x24, 0xAD, 0x65, 0xC9, 0x86, 0x2A, 0xC2, 0x0C, 0x48, 0xB0, 0xDD, 0x33, 0x53, 0x1F, 0x08,\n    0x35, 0x9B, 0x91, 0x52, 0xBB, 0xA8, 0x85, 0xE2, 0xA9, 0x0D, 0x22, 0x80, 0x1D, 0xCA, 0x57, 0xA5,\n    0x52, 0xE4, 0xDA, 0x10, 0x7C, 0x31, 0xDB, 0xAA, 0x27, 0x98, 0x85, 0xB7, 0xC7, 0x4E, 0xFC, 0x9D,\n    0x39, 0x8A, 0x10, 0x30, 0x78, 0x4B, 0xB3, 0x3C, 0xAF, 0xAB, 0xE7, 0xD9, 0xBB, 0xB4, 0x11, 0x3E,\n    0x59, 0x32, 0x2A, 0xD8, 0x89, 0xD8, 0xF5, 0xEB, 0x45, 0xFC, 0xEF, 0x8B, 0x78, 0xCF, 0x10, 0x1B,\n    0xCF, 0x4A, 0x2C, 0x24, 0x57, 0xED, 0x82, 0x2E, 0x4B, 0xC9, 0x1A, 0xC8, 0x1C, 0xD0, 0x5D, 0xE1,\n    0x87, 0x6E, 0xEA, 0xED, 0xD9, 0x0D, 0xC9, 0x1C, 0x59, 0x14, 0x85, 0xFB, 0x60, 0xFE, 0x62, 0x06,\n    0x4A, 0xB9, 0x0F, 0x0E, 0x83, 0xFE, 0x14, 0x1A, 0x7F, 0x6F, 0xFB, 0xC0, 0xBF, 0x76, 0x02, 0x3C,\n    0xAB, 0x58, 0x86, 0xB0, 0xDA, 0x69, 0xE7, 0xFD, 0x2B, 0x4C, 0x47, 0x66, 0xAB, 0xAB, 0xFF, 0x5D,\n    0xA0, 0xF2, 0x95, 0x47, 0xC8, 0x23, 0xB8, 0x58, 0xA2, 0x74, 0x9D, 0x65, 0x6D, 0x3F, 0xC9, 0xD9,\n    0xC0, 0xE9, 0x8A, 0x62, 0x0A, 0x6E, 0x1F, 0xE7, 0xD2, 0x86, 0x97, 0x26, 0xA4, 0x0A, 0x9C, 0x54,\n    0x44, 0xC8, 0x8C, 0x4E, 0x3B, 0xA9, 0xE6, 0x97, 0xBE, 0xBE, 0x16, 0x09, 0xE3, 0xC7, 0xCA, 0x68,\n    0x47, 0x24, 0x80, 0x22, 0x27, 0x0D, 0xC7, 0xE4, 0x11, 0x68, 0xD2, 0x1A, 0x79, 0x61, 0x89, 0x59,\n    0xD5, 0xA3, 0x99, 0xDF, 0x9C, 0x5B, 0x10, 0x58, 0x36, 0x6D, 0xDE, 0x9F, 0xB5, 0xC2, 0xF2, 0x9F,\n    0x68, 0x99, 0x95, 0xD1, 0x79, 0x08, 0x8F, 0xE4, 0xEC, 0x82, 0x7D, 0x70, 0xCF, 0xEA, 0x77, 0x00,\n    0x0A, 0x0A, 0xE6, 0x39, 0x45, 0x96, 0xB6, 0xA1, 0xC0, 0xA3, 0xAA, 0x64, 0xF8, 0x3B, 0xD2, 0xF7,\n    0x5C, 0xAD, 0xC0, 0x62, 0x93, 0xDA, 0xAE, 0x08, 0x5F, 0xB5, 0x10, 0x7F, 0x14, 0xB6, 0x91, 0xC3,\n    0xEC, 0xBB, 0x0F, 0x18, 0x4B, 0x88, 0xBE, 0xFF, 0xA2, 0xF1, 0x02, 0x48, 0x03, 0x6C, 0x6A, 0x5C,\n    0xAE, 0x7F, 0xBB, 0xA3, 0x02, 0x25, 0x6E, 0x13, 0x9B, 0x64, 0x8C, 0x6B, 0x3D, 0xC1, 0xC6, 0xC7,\n    0xB6, 0xA8, 0xF2, 0x85, 0x12, 0x87, 0xEA, 0xE0, 0x07, 0x3A, 0xEE, 0x2F, 0xC2, 0x68, 0xB8, 0x05,\n    0xB5, 0x55, 0x15, 0xDF, 0x21, 0x78, 0x9D, 0x21, 0x80, 0xE8, 0x91, 0xA4, 0x97, 0x1C, 0x08, 0xDB,\n    0x68, 0xA8, 0xEF, 0x25, 0x00, 0xEE, 0xAC, 0xD7, 0x87, 0x26, 0xD6, 0x27, 0xB8, 0xE5, 0x85, 0x79,\n    0x3F, 0xA4, 0xE9, 0xC8, 0x51, 0x44, 0xAF, 0xAE, 0x32, 0x08, 0x57, 0x1D, 0xC6, 0xB7, 0x4D, 0x43,\n    0xDC, 0x3D, 0x27, 0xD4, 0x34, 0x53, 0xEA, 0x1A, 0xFA, 0x57, 0x11, 0x04, 0xC1, 0x70, 0x7D, 0x88,\n    0x9B, 0x35, 0xAA, 0xBE, 0x23, 0xD4, 0x10, 0xFB, 0xEA, 0x9C, 0x4A, 0xBC, 0xA5, 0xC0, 0x4E, 0xE1,\n    0x2C, 0x30, 0x15, 0x1B, 0xA6, 0xFA, 0x7C, 0x27, 0x78, 0xA3, 0x2B, 0xF7, 0x90, 0x20, 0x4B, 0xB2,\n    0xBD, 0xEE, 0x11, 0xD1, 0x53, 0xEB, 0xBC, 0x33, 0xAD, 0x87, 0xD5, 0x15, 0x6B, 0x69, 0xFD, 0x20,\n    0x3E, 0x74, 0xF3, 0x9D, 0x24, 0x9A, 0xC7, 0x39, 0xEB, 0xD2, 0x81, 0x24, 0x7A, 0x75, 0x20, 0x20,\n    0xA3, 0x2B, 0xB6, 0x59, 0x62, 0x54, 0xE4, 0x6F, 0x03, 0x41, 0xCD, 0x3A, 0x13, 0x69, 0x5C, 0xDA,\n    0xD6, 0xE1, 0x64, 0x14, 0x4F, 0x05, 0x03, 0x04, 0x4F, 0x1A, 0x38, 0xF8, 0x40, 0x9E, 0xA1, 0x38,\n    0xDA, 0x20, 0xB5, 0x54, 0xC6, 0x0D, 0x1D, 0x58, 0xE4, 0x45, 0x10, 0xF5, 0x9C, 0xA6, 0xA4, 0x90,\n    0x64, 0x35, 0xE6, 0xF0, 0xFE, 0x58, 0x47, 0xC6, 0x84, 0xA6, 0x69, 0x62, 0xCC, 0xFA, 0x50, 0xFA,\n    0xAC, 0x24, 0x5E, 0x72, 0xCF, 0x4C, 0xAF, 0xCF, 0xF1, 0x12, 0xB8, 0x62, 0xA0, 0xF1, 0xB6, 0x36,\n    0xF7, 0x3E, 0xD5, 0x3F, 0x2B, 0xD5, 0xC3, 0x57, 0xE7, 0x84, 0x9E, 0xCE, 0x48, 0x21, 0x90, 0x09,\n    0x5D, 0x62, 0xBB, 0xDC, 0x5A, 0x93, 0x20, 0x6D, 0xF3, 0x8F, 0x9C, 0x51, 0x97, 0x74, 0xC7, 0x55,\n    0x08, 0xD9, 0x42, 0x11, 0x70, 0x55, 0x08, 0x96, 0x2D, 0xC2, 0x5C, 0x0B, 0x02, 0x6D, 0xFC, 0x3A,\n    0xCD, 0x21, 0xF2, 0x72, 0xD6, 0x78, 0x3B, 0xD5, 0x52, 0xC9, 0xE9, 0x94, 0x51, 0x2F, 0xBA, 0x27,\n    0x99, 0x6B, 0xF1, 0xF2, 0xFA, 0xBF, 0x15, 0x68, 0xD1, 0xC6, 0x8A, 0x86, 0x3A, 0x51, 0x45, 0xB2,\n    0xE9, 0x5D, 0xD1, 0x82, 0xC3, 0x32, 0x28, 0xD3, 0x8B, 0xFB, 0x90, 0x6D, 0x96, 0x9E, 0x65, 0x07,\n    0xE1, 0x05, 0x28, 0x52, 0xE6, 0x93, 0x93, 0x4B, 0xB1, 0x44, 0xE1, 0xD5, 0xB5, 0x65, 0x1D, 0x1D,\n    0x5C, 0xFA, 0xB0, 0xCA, 0xC3, 0x9D, 0xCD, 0xAC, 0x11, 0xFF, 0x81, 0x44, 0x91, 0xB0, 0x1C, 0xC8,\n    0x6F, 0x21, 0xC2, 0x61, 0x95, 0x61, 0x49, 0x19, 0x3F, 0x67, 0x9A, 0xC0, 0x7F, 0xEE, 0xCF, 0xE8,\n    0x5E, 0x75, 0x03, 0x56, 0x4D, 0x24, 0x61, 0xF9, 0xD8, 0x98, 0xA1, 0x2B, 0xD1, 0x8C, 0x40, 0x9B,\n    0xDC, 0xB6, 0x5C, 0xC0, 0xD6, 0x84, 0x67, 0x2E, 0x00, 0x2A, 0x89, 0xCE, 0x0A, 0x6D, 0x06, 0x23,\n    0x64, 0x10, 0xD5, 0xD2, 0x17, 0xC5, 0xF9, 0x98, 0xEE, 0xE6, 0xFC, 0x16, 0x6B, 0x0E, 0xAD, 0x40,\n    0x4D, 0x2D, 0x78, 0x9C, 0x75, 0x60, 0xDD, 0x55, 0x5B, 0x9F, 0xDF, 0xE0, 0x70, 0x2A, 0x72, 0xF3,\n    0x10, 0x31, 0x0F, 0xB9, 0xA6, 0xDC, 0x3E, 0x0C, 0x9D, 0x20, 0x91, 0xA6, 0x0F, 0x4E, 0x49, 0x0D,\n    0x3D, 0x2C, 0x2D, 0x33, 0x32, 0x31, 0x1E, 0xF6, 0x89, 0xD6, 0x66, 0xF0, 0x98, 0x1E, 0x11, 0x36,\n    0xE2, 0xF2, 0xDE, 0x09, 0x5F, 0x7B, 0x29, 0xA2, 0x51, 0x47, 0xA6, 0xAC, 0x2B, 0xE2, 0x5A, 0xAE,\n    0x7F, 0x38, 0xA5, 0xF6, 0xFE, 0x61, 0x42, 0x70, 0xB9, 0xCC, 0xCC, 0xD7, 0x23, 0x0F, 0xBF, 0xCC,\n    0x87, 0x48, 0x31, 0x38, 0x1B, 0x7A, 0x4B, 0x9E, 0xEB, 0x1F, 0x3D, 0x16, 0x55, 0xFA, 0xDB, 0xC2,\n    0xA0, 0xFF, 0xDC, 0x34, 0x4B, 0x0D, 0x3C, 0x33, 0x55, 0x87, 0x7E, 0x73, 0xCD, 0x66, 0x8A, 0x5D,\n    0x3F, 0xE4, 0xFE, 0xF1, 0x56, 0xFE, 0xB1, 0xB1, 0x09, 0x4E, 0x1D, 0xA5, 0xEE, 0xD5, 0x6D, 0x9F,\n    0xA3, 0xA9, 0xCB, 0x16, 0xE4, 0x62, 0x87, 0x1F, 0xB5, 0x88, 0xFB, 0x2B, 0x77, 0xA0, 0xB8, 0x9D,\n    0x51, 0x1F, 0x88, 0x60, 0x45, 0x69, 0x2A, 0x46, 0x1E, 0x7B, 0x7F, 0x63, 0x98, 0x59, 0x8A, 0x75,\n    0x6C, 0x4E, 0xFE, 0xFD, 0xC1, 0xCB, 0x68, 0x10, 0x71, 0x38, 0x8F, 0x1A, 0x50, 0xF5, 0x4A, 0xE3,\n    0x82, 0x28, 0x46, 0x4A, 0x72, 0x0A, 0x86, 0xF9, 0xE0, 0xF4, 0x7E, 0xCB, 0x3A, 0xB5, 0x6C, 0x6A,\n    0x6B, 0x14, 0x1B, 0x0E, 0xAD, 0x60, 0xCE, 0x39, 0x8F, 0x62, 0x3F, 0x2A, 0x33, 0xBC, 0xF3, 0x03,\n    0x90, 0x40, 0x3B, 0x5E, 0x30, 0x77, 0xE0, 0xA4, 0xAA, 0x5D, 0xC3, 0xCF, 0x43, 0x0F, 0xF7, 0x1C,\n    0x4E, 0x60, 0x87, 0x82, 0xB6, 0x5A, 0xF3, 0x35, 0x17, 0x48, 0xFB, 0x8F, 0x34, 0xCB, 0xED, 0x6F,\n    0xFC, 0xB8, 0x73, 0xBB, 0x09, 0xCE, 0x07, 0x89, 0x58, 0xEB, 0xC4, 0x82, 0x67, 0x45, 0xAD, 0xCA,\n    0xD9, 0x49, 0xE4, 0x00, 0xAA, 0x5A, 0xED, 0x61, 0xA6, 0x49, 0x1A, 0xB6, 0xC8, 0x09, 0xDE, 0xAA,\n    0x65, 0x1A, 0x0C, 0xF5, 0xDF, 0xA9, 0x2B, 0xB6, 0x91, 0xE9, 0xF0, 0x08, 0x2A, 0xBB, 0x4A, 0x04,\n    0x30, 0x0C, 0x71, 0x64, 0xE2, 0xCF, 0xF3, 0xD4, 0x1E, 0x99, 0x9A, 0x2B, 0x11, 0x5D, 0x29, 0x61,\n    0xC6, 0x2C, 0xC1, 0xA7, 0x05, 0xE8, 0x9B, 0xD0, 0xE4, 0xD2, 0x56, 0x96, 0x5E, 0xA9, 0x25, 0x96,\n    0x25, 0xBC, 0xBC, 0x12, 0xE5, 0x50, 0x47, 0x4C, 0x8D, 0xBF, 0xA6, 0xDA, 0x0A, 0x88, 0x70, 0x2F,\n    0x74, 0x2D, 0xE9, 0xCD, 0xD8, 0xF6, 0xD9, 0x76, 0x37, 0x9A, 0x1F, 0x1D, 0x3D, 0x10, 0xBA, 0xD0,\n    0x3C, 0x13, 0x56, 0x73, 0x79, 0x97, 0xB9, 0x55, 0x9D, 0x8B, 0xF3, 0xD5, 0x87, 0x0B, 0x1D, 0x97,\n    0x53, 0xD0, 0xF9, 0xA9, 0x76, 0x3B, 0xDE, 0x18, 0x3C, 0xE8, 0xF0, 0x81, 0x13, 0x16, 0x5A, 0x7D,\n    0x59, 0xF1, 0x9E, 0xE3, 0xC5, 0xBA, 0xFC, 0xB7, 0x7E, 0x5F, 0x05, 0xF4, 0x38, 0x6C, 0xA1, 0x09,\n    0xAA, 0x15, 0x4C, 0xC5, 0xF6, 0xE7, 0x25, 0x72, 0xC4, 0xAA, 0x82, 0xFE, 0xEB, 0x3F, 0xBC, 0x6B,\n    0x26, 0xB2, 0xAD, 0x85, 0x83, 0xFB, 0xFA, 0xD9, 0x2D, 0x78, 0x50, 0xBE, 0xF6, 0x70, 0xB4, 0x8A,\n    0xDB, 0x71, 0xA2, 0x60, 0x80, 0x7A, 0x91, 0xB2, 0x74, 0x54, 0x81, 0xB5, 0xF7, 0x48, 0x77, 0x96,\n    0x05, 0xD6, 0x34, 0xC1, 0x06, 0x0E, 0x35, 0x20, 0x39, 0x28, 0x2D, 0x57, 0xC1, 0x75, 0xA2, 0x26,\n    0x0B, 0xEB, 0x59, 0x12, 0x07, 0x46, 0x35, 0x1B, 0x7D, 0x2A, 0x5B, 0x0D, 0x19, 0x1A, 0xBD, 0x09,\n    0x5D, 0xEF, 0x7A, 0x79, 0x7F, 0xB1, 0xD6, 0x45, 0x00, 0xC3, 0x3E, 0xB2, 0xA9, 0x03, 0x19, 0x43,\n    0xC3, 0x53, 0x73, 0x24, 0xA2, 0xEC, 0x9B, 0x88, 0x09, 0xF4, 0x5C, 0xB5, 0xC0, 0x69, 0x00, 0xB6,\n    0xB4, 0x80, 0xDE, 0x9A, 0x7A, 0x85, 0x1D, 0xA7, 0x85, 0x81, 0x3D, 0x83, 0x41, 0x85, 0xA5, 0x32,\n    0x7B, 0x7D, 0x47, 0xEB, 0x35, 0x07, 0x3C, 0xED, 0xBC, 0x6B, 0xEF, 0xB0, 0x1A, 0x6F, 0x33, 0x0A,\n    0x2C, 0xBA, 0x54, 0xF8, 0xEE, 0xA9, 0xB4, 0x2A, 0x17, 0x8A, 0x1E, 0x6C, 0x58, 0xFB, 0x09, 0xF0,\n    0x76, 0x0F, 0x03, 0xD3, 0x34, 0xC1, 0xC2, 0xA1, 0xCD, 0x96, 0x21, 0xFC, 0x9C, 0x21, 0x3D, 0xB6,\n    0xA2, 0xD1, 0xA2, 0x0F, 0x24, 0xF6, 0x33, 0xB4, 0xB4, 0x36, 0xCA, 0x12, 0x25, 0x52, 0x85, 0x5B,\n    0x07, 0x82, 0xAF, 0xB8, 0x8B, 0xB1, 0x36, 0x67, 0x32, 0xAF, 0x51, 0x74, 0xDE, 0x15, 0x9B, 0xE7,\n    0xD9, 0x6D, 0x2C, 0xEA, 0xDE, 0x68, 0x99, 0x66, 0x31, 0x87, 0x7D, 0xEA, 0xA8, 0x4D, 0xF4, 0x06,\n    0xB5, 0x28, 0xD8, 0x93, 0xB8, 0x38, 0xB3, 0x2D, 0xA2, 0xA8, 0xCD, 0x03, 0x96, 0x61, 0xD1, 0x7B,\n    0x49, 0x11, 0xE8, 0xEE, 0x25, 0xCE, 0x44, 0xA7, 0x77, 0xED, 0x72, 0xA3, 0xF4, 0xA7, 0xCB, 0x2D,\n    0x9D, 0xC5, 0xBA, 0x89, 0xBD, 0x9A, 0xC0, 0x84, 0xDD, 0x14, 0x09, 0x1C, 0x11, 0x17, 0x4F, 0x99,\n    0x23, 0xDA, 0xD2, 0xD4, 0x68, 0x4E, 0x7B, 0xFC, 0x85, 0x24, 0xE7, 0x1A, 0x79, 0xA5, 0x91, 0x9E,\n    0xD8, 0xBB, 0x0E, 0xFA, 0xC4, 0x99, 0x31, 0xFB, 0x02, 0x4C, 0x15, 0xEC, 0x38, 0x6E, 0xBC, 0xF8,\n    0xA1, 0xCB, 0xAD, 0x8D, 0x12, 0x66, 0x91, 0x61, 0xAF, 0xA8, 0x01, 0x86, 0xF7, 0x8A, 0x54, 0x30,\n    0x40, 0xDE, 0x3F, 0x83, 0xA4, 0x9C, 0x43, 0x98, 0x50, 0x21, 0x12, 0xB3, 0x20, 0x53, 0xE5, 0x46,\n    0x82, 0x7E, 0xDF, 0x59, 0x1E, 0x19, 0x0C, 0x2B, 0xFF, 0x77, 0x92, 0x25, 0xF4, 0x31, 0xDA, 0x82,\n    0xDA, 0x3A, 0x73, 0xF8, 0x2E, 0x83, 0x30, 0xBF, 0x1E, 0x47, 0x46, 0x2C, 0x62, 0xBA, 0xA7, 0x95,\n    0x5D, 0xE2, 0xB8, 0x7A, 0xE2, 0x3F, 0xD9, 0x6C, 0xEF, 0xC8, 0x47, 0xA7, 0x19, 0x60, 0x56, 0xC0,\n    0x8F, 0xB4, 0x8E, 0x1F, 0x33, 0xAD, 0x2A, 0x08, 0xDA, 0x53, 0x52, 0x2D, 0x86, 0x14, 0x6A, 0xB5,\n    0x94, 0xD0, 0xFC, 0xEE, 0xE6, 0xDD, 0x76, 0xC6, 0x91, 0xCA, 0x3D, 0x00, 0xA4, 0x63, 0x3A, 0x38,\n    0xE4, 0x79, 0xDE, 0x44, 0x48, 0x41, 0x50, 0x9C, 0x1A, 0xCB, 0x15, 0x68, 0xD5, 0xE5, 0xE8, 0x00,\n    0x69, 0x3E, 0x2B, 0x82, 0x3B, 0x3D, 0x0A, 0x8F, 0x8B, 0xBE, 0x98, 0x08, 0xD9, 0x66, 0xC3, 0xF2,\n    0xC9, 0x6E, 0xDF, 0xD0, 0xDC, 0xB1, 0x24, 0x91, 0xA8, 0x70, 0xFA, 0xD2, 0xD7, 0x43, 0x25, 0xE1,\n    0x04, 0xDA, 0xED, 0x5D, 0xBF, 0xD0, 0x1A, 0x8B, 0xBD, 0x22, 0xA1, 0xEC, 0x90, 0x76, 0xBF, 0x07,\n    0xE2, 0xA5, 0xB4, 0x4D, 0xEA, 0x39, 0xDA, 0x95, 0x2F, 0xE0, 0x77, 0x23, 0x07, 0x48, 0x28, 0x57,\n    0x35, 0xD7, 0x30, 0xC0, 0xB2, 0xFC, 0x6E, 0x2B, 0x2F, 0xF3, 0x44, 0x9C, 0xD8, 0xBF, 0xD9, 0x44,\n    0x2D, 0x92, 0xDF, 0x51, 0x7A, 0x6E, 0xBB, 0x69, 0xC9, 0xA8, 0xC2, 0x27, 0x15, 0x8F, 0x88, 0xE3,\n    0xFD, 0x96, 0xD4, 0x1D, 0x1A, 0xF9, 0xB7, 0x2C, 0x54, 0xE5, 0xA6, 0x4B, 0xBC, 0xC3, 0x89, 0xFD,\n    0x09, 0xAB, 0xB9, 0xB2, 0xC2, 0xF1, 0xB6, 0x9E, 0xFA, 0x2E, 0xF1, 0x6A, 0x2A, 0x3F, 0x3A, 0xDC,\n    0x21, 0x66, 0x76, 0xB5, 0x7C, 0xEA, 0xE5, 0xE0, 0xD9, 0xA9, 0x14, 0x92, 0xD6, 0x0D, 0x04, 0xB4,\n    0x04, 0x8A, 0xF6, 0xF1, 0x85, 0x69, 0xF4, 0x1F, 0x8D, 0xBC, 0x6A, 0x9B, 0x7F, 0x0D, 0x7C, 0xC7,\n    0x4C, 0x26, 0x60, 0x4F, 0xB0, 0x08, 0x5D, 0x15, 0x72, 0x02, 0x2E, 0xD1, 0xF1, 0xD1, 0xED, 0x8F,\n    0x0A, 0x8B, 0x8A, 0xD1, 0x18, 0x18, 0x77, 0x40, 0x40, 0x35, 0x2B, 0xDB, 0x28, 0x9B, 0x0B, 0x32,\n    0xBF, 0x17, 0x54, 0x3B, 0xF5, 0xEF, 0xED, 0x6A, 0x6C, 0x4D, 0x8C, 0x27, 0xF5, 0x36, 0xD2, 0x97,\n    0x20, 0x3E, 0x72, 0x50, 0x91, 0x79, 0x93, 0x53, 0x53, 0xA3, 0x50, 0xD3, 0x09, 0xAF, 0x36, 0x90,\n    0x0A, 0xAA, 0xE6, 0x19, 0x05, 0x5D, 0x5D, 0x6D, 0x04, 0x9A, 0x08, 0x7A, 0xD9, 0x06, 0x9C, 0x03,\n    0xD9, 0x12, 0xFA, 0x36, 0x10, 0xEB, 0x9C, 0x4C, 0x74, 0xEC, 0x69, 0x36, 0xB3, 0x8A, 0x0C, 0x22,\n    0xA6, 0xB3, 0xF1, 0xAE, 0x70, 0x8B, 0xA8, 0x38, 0x08, 0x0F, 0x42, 0x40, 0x89, 0x6D, 0x09, 0xEC,\n    0x71, 0x44, 0x8F, 0xD1, 0xC7, 0xCB, 0x8F, 0x4C, 0xEC, 0xC8, 0x5B, 0x7D, 0xB1, 0x77, 0x36, 0x66,\n    0xA6, 0xDF, 0x29, 0x2B, 0x2F, 0x5E, 0x8D, 0x3D, 0xE6, 0x38, 0xC1, 0x32, 0x0B, 0x64, 0x90, 0xB1,\n    0xA7, 0x03, 0x4A, 0x41, 0x94, 0xE6, 0xFF, 0x37, 0x1E, 0x75, 0xD4, 0x1C, 0x71, 0x63, 0xB4, 0x64,\n    0x9B, 0x1B, 0x4C, 0x7B, 0xFB, 0x16, 0x95, 0x95, 0xDB, 0xB6, 0x08, 0x93, 0x9B, 0x7B, 0x86, 0xA0,\n    0x53, 0x24, 0x40, 0x7F, 0x2F, 0xF0, 0x86, 0xE4, 0x89, 0x02, 0x88, 0xBA, 0x25, 0xE9, 0xD9, 0x46,\n    0x08, 0x1C, 0xBD, 0x73, 0x81, 0xBB, 0x48, 0x55, 0x65, 0x46, 0x9D, 0x06, 0x75, 0x99, 0x75, 0x7A,\n    0x06, 0x3E, 0x4B, 0x25, 0x8D, 0x7B, 0x78, 0x81, 0xC6, 0x98, 0xAA, 0x20, 0x22, 0x8B, 0x74, 0x6B,\n    0x01, 0x1E, 0x7A, 0x36, 0x39, 0xC7, 0x53, 0x09, 0x53, 0x92, 0xF0, 0x1A, 0x49, 0x2E, 0x91, 0x26,\n    0x02, 0xEB, 0x14, 0xEE, 0x8D, 0x48, 0xC1, 0x79, 0x01, 0x1B, 0x03, 0x33, 0x7B, 0xD1, 0xAE, 0x99,\n    0xD9, 0xDE, 0x17, 0xAB, 0xBE, 0xA8, 0x38, 0xAD, 0x8B, 0x82, 0x60, 0x4E, 0xF3, 0xF0, 0xB2, 0xFB,\n    0x51, 0x14, 0x57, 0x9A, 0xE3, 0xDC, 0xB0, 0x5C, 0x66, 0xDD, 0xFE, 0x2A, 0x5A, 0x10, 0x23, 0x2F,\n    0xBA, 0x07, 0x3C, 0x48, 0x37, 0x6A, 0x29, 0xA5, 0x6C, 0xC5, 0x1E, 0xCF, 0x36, 0x1C, 0x0B, 0x4B,\n    0x1F, 0x39, 0x8C, 0xAF, 0x16, 0x50, 0xEB, 0x42, 0x30, 0x5F, 0x23, 0x74, 0x85, 0x94, 0xFA, 0x69,\n    0x53, 0x95, 0xF8, 0xAF, 0x78, 0xDD, 0x88, 0x82, 0xC6, 0xEA, 0xBB, 0xB1, 0xAF, 0x12, 0xE8, 0x97,\n    0x9A, 0xBB, 0x70, 0x8C, 0x5D, 0x0B, 0x89, 0xB1, 0x86, 0x2F, 0x7C, 0x8B, 0x59, 0x57, 0x2D, 0xC9,\n    0xC8, 0x8A, 0xDC, 0xA1, 0xCD, 0xE1, 0x5D, 0x15, 0x2E, 0x6C, 0x9C, 0xAA, 0x22, 0x0A, 0x93, 0x6B,\n    0x8B, 0x9A, 0xDF, 0xE7, 0xBE, 0xD9, 0x29, 0x02, 0x09, 0x8A, 0x7B, 0x14, 0xA4, 0x86, 0xF2, 0x50,\n    0xFC, 0x64, 0xAA, 0x69, 0xC8, 0x8B, 0xB7, 0xA9, 0x55, 0xFB, 0x1F, 0xD4, 0x35, 0x91, 0xCE, 0x81,\n    0xBC, 0xC6, 0x54, 0x2A, 0x86, 0x2F, 0x02, 0x90, 0xB7, 0x01, 0x15, 0x31, 0x69, 0x67, 0x18, 0xA0,\n    0x2B, 0x90, 0x3A, 0xA9, 0xA1, 0x38, 0xDD, 0xA7, 0x42, 0x92, 0xE8, 0x71, 0xCE, 0x32, 0x18, 0x73,\n    0xCB, 0x1D, 0xC3, 0xA2, 0xF8, 0x1C, 0x6B, 0x60, 0xED, 0xCA, 0x0F, 0xF6, 0xB5, 0x80, 0x7A, 0x7A,\n    0x33, 0x6D, 0xD1, 0x6D, 0xD1, 0x8C, 0xD1, 0x58, 0x3E, 0xA7, 0x7A, 0x95, 0x30, 0x65, 0xBD, 0x07,\n    0x15, 0xC1, 0xFC, 0xFF, 0x41, 0x93, 0x5F, 0x7C, 0x7F, 0x30, 0x66, 0x52, 0x44, 0x16, 0x39, 0x6D,\n    0x42, 0x9D, 0x0D, 0xF1, 0x72, 0x69, 0x11, 0x53, 0xC3, 0xA0, 0x9B, 0x89, 0xB6, 0xE4, 0x8C, 0x4B,\n    0x87, 0x80, 0x9A, 0xB4, 0x3E, 0x33, 0x8D, 0xAB, 0x81, 0x15, 0x05, 0x19, 0x87, 0xB1, 0xDA, 0x05,\n    0x4B, 0x60, 0xBA, 0x1D, 0xE7, 0x3B, 0x7E, 0x42, 0xAB, 0x5A, 0xD0, 0x21, 0x30, 0xB5, 0x78, 0xB5,\n    0xC0, 0x8F, 0x83, 0x39, 0x7A, 0x7A, 0xAF, 0x4F, 0x9B, 0xCC, 0xD9, 0xDA, 0x01, 0x9C, 0xFE, 0xAD,\n    0xAB, 0xE7, 0xF7, 0x2F, 0xC1, 0xE6, 0x32, 0xC4, 0x9F, 0xCD, 0x10, 0xF2, 0xA5, 0x0F, 0xDD, 0x54,\n    0x98, 0xEA, 0x57, 0x7C, 0x43, 0x39, 0xAA, 0x95, 0x83, 0x7E, 0x1B, 0x34, 0x3A, 0x29, 0xF7, 0x07,\n    0xC0, 0x8B, 0xAF, 0x48, 0x71, 0xED, 0xEA, 0x7F, 0x73, 0xD6, 0x0E, 0x6D, 0x96, 0xC3, 0x0F, 0x9F,\n    0xA9, 0x5C, 0x98, 0x00, 0x16, 0xC4, 0xC6, 0x72, 0xEF, 0x00, 0x27, 0x01, 0x31, 0x75, 0x18, 0x28,\n    0x75, 0xE5, 0xCB, 0x4D, 0x9E, 0x25, 0xCD, 0x72, 0xD8, 0xAA, 0x1B, 0x0B, 0x35, 0x6A, 0xDC, 0x0A,\n    0x11, 0x85, 0x01, 0x7B, 0x94, 0x29, 0xA8, 0x41, 0x29, 0xD4, 0xCE, 0xBE, 0x7B, 0x14, 0x45, 0x52,\n    0x56, 0xEB, 0x4E, 0x45, 0x14, 0x62, 0x87, 0xA4, 0x29, 0x24, 0xF6, 0xF8, 0x70, 0x77, 0x29, 0x6A,\n    0xB6, 0x56, 0x46, 0x20, 0x5A, 0x9C, 0x45, 0x3A, 0x54, 0x6B, 0xF8, 0x2B, 0x4A, 0xCA, 0x8E, 0xBB,\n    0x97, 0x15, 0xAC, 0x6B, 0x60, 0x34, 0x73, 0x6F, 0x26, 0xEA, 0x1F, 0x1F, 0x8C, 0x10, 0x40, 0x46,\n    0x10, 0x09, 0x16, 0x37, 0x26, 0x86, 0xB1, 0xCF, 0x29, 0x28, 0x9F, 0x14, 0x75, 0x6C, 0xEE, 0x7F,\n    0x92, 0xFB, 0x95, 0xD6, 0xFA, 0x8F, 0x13, 0x75, 0x37, 0xA5, 0xCC, 0x8A, 0x8E, 0xD0, 0x50, 0x9D,\n    0x80, 0x3B, 0xD8, 0x1E, 0x5A, 0xA4, 0x66, 0xA9, 0x5D, 0xC7, 0xB2, 0x25, 0x3D, 0xCB, 0x36, 0x82,\n    0x36, 0x9F, 0xCD, 0x11, 0x07, 0x6B, 0x94, 0xED, 0x1D, 0xB2, 0x5A, 0xD8, 0x39, 0xEE, 0xC9, 0x5F,\n    0x5A, 0xDC, 0x2D, 0xDE, 0x75, 0x9D, 0x3C, 0x6E, 0xA0, 0xD3, 0x61, 0x96, 0x08, 0x44, 0x37, 0x31,\n    0x62, 0xDB, 0xC1, 0xEC, 0x72, 0x7A, 0xDF, 0x29, 0xD7, 0x94, 0x10, 0x42, 0xA0, 0x77, 0xC4, 0x3E,\n    0xA2, 0x6D, 0x4D, 0x0D, 0x3F, 0xFA, 0x9A, 0x3B, 0x3D, 0x7D, 0x86, 0xD1, 0x91, 0x96, 0x3F, 0x6C,\n    0x9C, 0xEF, 0x83, 0xE7, 0x31, 0xC9, 0xEB, 0x7B, 0xDA, 0x82, 0x7A, 0xAA, 0xF9, 0xD7, 0xB2, 0x55,\n    0x39, 0xE8, 0xF4, 0xEC, 0x06, 0xE8, 0x1C, 0x22, 0x68, 0x18, 0x10, 0x8F, 0xF9, 0x13, 0x0C, 0x0E,\n    0xEC, 0x26, 0xDB, 0x0D, 0x03, 0xE1, 0x24, 0xC1, 0x97, 0xDB, 0x13, 0xA1, 0x2C, 0xFC, 0x61, 0x32,\n    0xC6, 0x1B, 0xFB, 0x4F, 0x7C, 0x18, 0xD4, 0x85, 0x1E, 0x14, 0xEE, 0x45, 0x1A, 0x0C, 0xA3, 0xD0,\n    0x2A, 0x8F, 0x44, 0x10, 0x7F, 0x32, 0xC3, 0x6E, 0xF9, 0x57, 0x6D, 0x59, 0x49, 0xAA, 0xD0, 0x5D,\n    0xBA, 0xB7, 0xA5, 0x28, 0xD3, 0xE9, 0x1E, 0x99, 0xB1, 0x46, 0x4B, 0xF5, 0x8D, 0x4A, 0xE1, 0x11,\n    0xAF, 0x9F, 0xBE, 0x3A, 0x21, 0xE1, 0x3F, 0x8F, 0x83, 0xF0, 0x2F, 0x30, 0xB6, 0x59, 0x4F, 0x03,\n    0x17, 0xDA, 0x32, 0x7F, 0x01, 0x0F, 0x58, 0xB1, 0xAC, 0x04, 0xA5, 0xC3, 0x4D, 0x5C, 0x13, 0xFD,\n    0x14, 0x58, 0x8D, 0xEE, 0x78, 0x82, 0xBD, 0xD4, 0xFE, 0xA3, 0x7F, 0xDC, 0x78, 0x44, 0x07, 0x3A,\n    0x4A, 0x64, 0x31, 0x1A, 0x7F, 0xBD, 0x5E, 0x7D, 0x20, 0x99, 0x3B, 0xE3, 0x2B, 0x99, 0x89, 0xDA,\n    0xEA, 0x73, 0x13, 0x5E, 0x53, 0x5C, 0x93, 0x93, 0xE9, 0x8B, 0xEA, 0x7E, 0xB5, 0xAA, 0xDD, 0xA0,\n    0x63, 0x0C, 0xB1, 0x2F, 0x2C, 0xD7, 0xAA, 0x13, 0x51, 0x5D, 0xA8, 0x5C, 0x97, 0x9A, 0x9B, 0xF2,\n    0x70, 0x0D, 0xA6, 0x1C, 0x6E, 0xD1, 0xA5, 0xBA, 0xB8, 0x62, 0x78, 0x00, 0xB1, 0xE5, 0x5D, 0xB5,\n    0x9F, 0xD0, 0x0C, 0x06, 0x51, 0x9E, 0x41, 0xF0, 0xE3, 0xBA, 0x46, 0x39, 0x83, 0x39, 0xAF, 0x7A,\n    0xDF, 0x5C, 0x0E, 0xDB, 0xE4, 0xEB, 0x4C, 0x0E, 0x99, 0xC3, 0xD7, 0x95, 0x31, 0xBF, 0xDB, 0x2D,\n    0xB1, 0x21, 0xA8, 0xDD, 0xB6, 0xB8, 0xAE, 0x08, 0x0A, 0x71, 0x23, 0xF9, 0xE1, 0x57, 0xAD, 0xB8,\n    0x19, 0xBA, 0x39, 0xB6, 0x65, 0xAC, 0xC3, 0x42, 0x6F, 0xB9, 0x4A, 0xD9, 0xB5, 0xB9, 0xA9, 0x1E,\n    0xE5, 0xA7, 0x3F, 0xE6, 0x40, 0x63, 0x02, 0x2F, 0xF2, 0x01, 0x0D, 0x07, 0xA1, 0x2F, 0xC3, 0x65,\n    0xC0, 0x58, 0x2D, 0x21, 0xBC, 0x4C, 0x6E, 0x51, 0xF4, 0xB0, 0xF4, 0x87, 0x79, 0xA5, 0x74, 0x08,\n    0xF7, 0xFB, 0xF6, 0xF9, 0x13, 0x49, 0x11, 0xBC, 0x36, 0x14, 0x87, 0x20, 0x06, 0x74, 0xBA, 0x1E,\n    0xCF, 0x92, 0xBC, 0xC3, 0x26, 0x6D, 0xD9, 0x05, 0xC6, 0x08, 0x91, 0x97, 0x8F, 0x0F, 0xC1, 0x9A,\n    0x3A, 0x91, 0x9C, 0x5F, 0xBE, 0x51, 0x9D, 0x01, 0xA4, 0xF3, 0xAA, 0x26, 0x5E, 0x25, 0xDE, 0xF2,\n    0x01, 0x6B, 0x84, 0x85, 0x46, 0xBF, 0x8C, 0xCB, 0xBC, 0x24, 0x39, 0x88, 0xB7, 0x2E, 0x5B, 0xD4,\n    0x36, 0x12, 0xD4, 0xFD, 0xAE, 0x81, 0xA3, 0x9E, 0xD6, 0xE8, 0xA2, 0x40, 0xBD, 0x22, 0xBA, 0x0D,\n    0x51, 0x8C, 0x67, 0xBC, 0x54, 0x13, 0x3C, 0x1D, 0x05, 0x20, 0xA8, 0x9D, 0x61, 0x0A, 0x74, 0x73,\n    0x99, 0x5E, 0xBD, 0xB3, 0x10, 0xD9, 0xC7, 0x7C, 0x58, 0x24, 0xF5, 0x9F, 0xFA, 0x13, 0x35, 0x83,\n    0x1A, 0x14, 0x13, 0x7B, 0x3B, 0xB6, 0xF5, 0x16, 0xB2, 0x75, 0xC2, 0x9E, 0x41, 0x83, 0xC5, 0x68,\n    0x8C, 0xDF, 0xFC, 0xC1, 0x2E, 0xAC, 0xFC, 0x08, 0x1C, 0xE5, 0x2D, 0x15, 0x0D, 0xB8, 0xE2, 0x3F,\n    0xD7, 0xA1, 0x46, 0x9E, 0xCB, 0x46, 0x4A, 0x4A, 0x71, 0x88, 0x4E, 0x61, 0x0F, 0x82, 0x34, 0xF0,\n    0xC5, 0xEA, 0xD0, 0x08, 0x9A, 0xCF, 0xAE, 0x93, 0xEB, 0x69, 0x06, 0x2D, 0x96, 0x1F, 0x96, 0x70,\n    0xDE, 0x1A, 0x87, 0xA0, 0x24, 0x7E, 0x1F, 0x8E, 0x9C, 0xDB, 0x77, 0xC1, 0x95, 0xDC, 0xDE, 0x9E,\n    0xE7, 0xEE, 0x85, 0xD9, 0xB4, 0xEC, 0xD5, 0x2A, 0xDF, 0xF7, 0xCD, 0xA6, 0x2B, 0x81, 0xFA, 0xE6,\n    0x10, 0xB1, 0x3B, 0x03, 0x23, 0xE0, 0xBD, 0xA1, 0xA4, 0x7F, 0x89, 0x69, 0x55, 0x78, 0x14, 0xB1,\n    0x86, 0x07, 0x6E, 0xB0, 0xB2, 0xB3, 0x96, 0xFD, 0xA0, 0x03, 0x00, 0xC1, 0xF5, 0x60, 0xAA, 0x62,\n    0xD4, 0xB2, 0xC7, 0xA3, 0x9E, 0x25, 0xF5, 0xF5, 0xB3, 0x85, 0x1D, 0xD2, 0x47, 0xDB, 0xF3, 0x1E,\n    0x70, 0x85, 0xAC, 0x30, 0x02, 0x87, 0xF4, 0xEB, 0xB8, 0x99, 0xFB, 0x65, 0xAA, 0x56, 0x3F, 0xDC,\n    0x5C, 0x52, 0x2C, 0x2A, 0xDE, 0x23, 0xEA, 0xE7, 0xD0, 0x20, 0x9C, 0xF3, 0x9A, 0xA9, 0x16, 0x4C,\n    0xCE, 0x29, 0x87, 0x08, 0x52, 0xA4, 0x5D, 0x3A, 0x4C, 0xC6, 0x2C, 0x13, 0x16, 0x94, 0x3E, 0x14,\n    0x5B, 0x50, 0x92, 0x34, 0xC2, 0x64, 0x7A, 0x95, 0x89, 0x5C, 0xCA, 0x82, 0xF8, 0x59, 0x7B, 0x27,\n    0xAA, 0x0F, 0x64, 0x45, 0xBB, 0xFA, 0x61, 0x30, 0x30, 0x57, 0x6E, 0x3A, 0x69, 0x1A, 0x8F, 0x3E,\n    0xB7, 0x63, 0xCB, 0x86, 0xF6, 0xE2, 0xC6, 0xDF, 0xFB, 0xE5, 0xB7, 0xEA, 0x3B, 0xF5, 0x28, 0x31,\n    0x6C, 0x44, 0x54, 0xD3, 0xEC, 0x37, 0x77, 0xB9, 0xF7, 0x08, 0xF1, 0x05, 0xDA, 0x16, 0xB8, 0x95,\n    0x69, 0x5E, 0x84, 0x49, 0x31, 0xC5, 0xEC, 0x06, 0x30, 0x82, 0x52, 0xC2, 0x46, 0xB2, 0xE3, 0x47,\n    0xE6, 0x60, 0x12, 0x1C, 0x96, 0xDC, 0xBB, 0x08, 0x60, 0x4A, 0xC3, 0x01, 0x4D, 0xBC, 0x1A, 0x4E,\n    0xF8, 0x3C, 0x06, 0x66, 0xF0, 0x78, 0xB9, 0x6D, 0x04, 0x66, 0x60, 0xDF, 0x7E, 0x5F, 0x2C, 0x07,\n    0x2A, 0x5A, 0x4F, 0x13, 0x59, 0x40, 0x26, 0x6F, 0xC6, 0x4A, 0x37, 0xE9, 0x5E, 0x58, 0x41, 0xEF,\n    0xCD, 0xCE, 0x89, 0xAD, 0xAB, 0x72, 0xEF, 0x16, 0x8B, 0x7D, 0x66, 0x1A, 0x98, 0xFC, 0x8B, 0xC2,\n    0xF7, 0xFD, 0xC3, 0xF9, 0x51, 0xCF, 0x26, 0x06, 0xC6, 0x28, 0x2C, 0x2E, 0x8D, 0x53, 0xBE, 0xD8,\n    0xA7, 0x26, 0xC3, 0xD6, 0xD8, 0x05, 0xCD, 0x19, 0xCC, 0xA3, 0x23, 0x14, 0x74, 0xC2, 0x97, 0x01,\n    0x1C, 0x0B, 0x96, 0x22, 0xE2, 0x94, 0x23, 0xD8, 0xC2, 0x1B, 0xF7, 0x03, 0xB5, 0x1E, 0x35, 0x2C,\n    0x9A, 0x9B, 0xCC, 0x7A, 0x1F, 0x04, 0x52, 0x26, 0x69, 0xD7, 0x6A, 0x21, 0xEA, 0xA8, 0x3A, 0x62,\n    0x51, 0xA2, 0x02, 0xB2, 0x37, 0x13, 0xC0, 0x57, 0xCC, 0x1D, 0xC4, 0xFF, 0xE6, 0x90, 0xC1, 0x86,\n    0x20, 0x5B, 0x03, 0xED, 0x6F, 0x32, 0x77, 0x9A, 0x86, 0xB1, 0x1C, 0x89, 0xFB, 0x9B, 0x2B, 0xF4,\n    0x86, 0xE9, 0xB9, 0xF0, 0x39, 0xF9, 0x85, 0x51, 0x0C, 0x62, 0x95, 0x01, 0x28, 0xD7, 0x6F, 0xB7,\n    0xBF, 0xC7, 0x2F, 0x2F, 0xF8, 0xAC, 0x31, 0xD1, 0xF8, 0x5D, 0x37, 0xDC, 0xBE, 0x98, 0x2D, 0x76,\n    0xC4, 0x9C, 0x20, 0xDA, 0xB6, 0xF3, 0xC3, 0xC0, 0x31, 0x14, 0xBF, 0x2B, 0x87, 0x00, 0x66, 0x4A,\n    0xE2, 0x50, 0x49, 0x84, 0x1E, 0x97, 0x85, 0xB8, 0xED, 0x33, 0x2B, 0xF8, 0x59, 0xC9, 0x03, 0x3F,\n    0x5A, 0x28, 0xA7, 0xB8, 0xFB, 0x9F, 0x2E, 0x44, 0xFA, 0x2E, 0x6D, 0xFF, 0x40, 0x9E, 0x21, 0xE4,\n    0x05, 0xB6, 0x31, 0x76, 0xAE, 0xDB, 0x76, 0x96, 0x88, 0x4D, 0x96, 0xCE, 0x1E, 0xD4, 0x22, 0x91,\n    0xE4, 0xA8, 0x91, 0x5B, 0xED, 0xA4, 0x03, 0x10, 0x06, 0x8C, 0x24, 0xE4, 0xC4, 0x80, 0x16, 0x4D,\n    0x50, 0xAF, 0xC1, 0x64, 0x4A, 0xA4, 0xB9, 0x79, 0xE3, 0x37, 0x38, 0x7D, 0x8A, 0x85, 0x90, 0xB7,\n    0x1C, 0x7D, 0x24, 0x26, 0x7F, 0x5F, 0x0C, 0x9D, 0xB3, 0x2D, 0x4D, 0xB0, 0xEE, 0xAC, 0x95, 0x8F,\n    0x2E, 0x5A, 0xA2, 0x78, 0x7D, 0x0D, 0xDA, 0x99, 0x47, 0x93, 0x13, 0xF9, 0x0C, 0xFF, 0x5E, 0x71,\n    0x99, 0x8D, 0xE3, 0x21, 0x03, 0x44, 0xF7, 0x4D, 0x61, 0xD0, 0x1D, 0x47, 0xCB, 0x3D, 0x57, 0x4D,\n    0x43, 0x3C, 0x01, 0xBB, 0x33, 0xC2, 0x04, 0x91, 0x66, 0xC9, 0xA1, 0xF2, 0x18, 0x47, 0x0D, 0x60,\n    0x61, 0x9F, 0xA7, 0x27, 0x99, 0xB5, 0x27, 0x88, 0x60, 0x2B, 0x8D, 0x3C, 0x8F, 0xD5, 0x53, 0xDD,\n    0x64, 0xC5, 0x14, 0xB3, 0x77, 0x5C, 0xDE, 0xA9, 0x91, 0x2E, 0x23, 0x83, 0x24, 0xE3, 0xE6, 0x38,\n    0xC5, 0xCB, 0x9B, 0x4E, 0xC4, 0xEE, 0x3D, 0x7D, 0x58, 0x6C, 0x60, 0x16, 0x97, 0xBC, 0xF6, 0x47,\n    0x77, 0x83, 0xCE, 0xF1, 0xA9, 0x8F, 0xDA, 0xFF, 0xB3, 0xE4, 0x52, 0x50, 0x67, 0xBA, 0x13, 0x2A,\n    0xAB, 0xB4, 0x32, 0xC0, 0x4C, 0xAE, 0xBC, 0x92, 0x3C, 0x65, 0x97, 0xA4, 0xD8, 0x10, 0xDF, 0x60,\n    0x95, 0xCA, 0x74, 0x17, 0x3F, 0x8A, 0xC5, 0x2A, 0x9F, 0xAF, 0xDB, 0xA4, 0x3C, 0x77, 0x01, 0xA6,\n    0x02, 0x66, 0x0C, 0x15, 0x0F, 0x00, 0x90, 0xBD, 0x9B, 0x77, 0x53, 0xFD, 0x93, 0x44, 0x6F, 0x86,\n    0x50, 0x54, 0x11, 0x40, 0xBE, 0x72, 0xD2, 0xE5, 0x4B, 0xA4, 0x13, 0x88, 0x0D, 0xAA, 0x87, 0xFB,\n    0xED, 0x6E, 0x66, 0x59, 0xFB, 0xB8, 0xA0, 0xFE, 0xD1, 0x08, 0x27, 0x07, 0xC4, 0x31, 0x31, 0x8C,\n    0x6F, 0xE2, 0x0B, 0x23, 0x95, 0x96, 0xF6, 0x3B, 0xD9, 0xD4, 0xB6, 0x5D, 0x84, 0xC2, 0xC4, 0x23,\n    0xE9, 0xF2, 0xB6, 0x96, 0x9E, 0xD0, 0x4A, 0xE2, 0x2D, 0xAB, 0xBB, 0xB0, 0xAA, 0xEC, 0xFE, 0x67,\n    0x3A, 0xF9, 0x1A, 0xA8, 0x30, 0xDA, 0x9A, 0x17, 0xD5, 0x46, 0xCC, 0xBA, 0xF7, 0xDA, 0x8E, 0x54,\n    0x49, 0x58, 0xBE, 0x9C, 0x3B, 0x7E, 0x4E, 0xE4, 0x06, 0x8E, 0x32, 0xB4, 0x7A, 0xEA, 0xF8, 0x40,\n    0x78, 0xD4, 0x62, 0xBD, 0xAC, 0xA7, 0x9F, 0x0B, 0x27, 0xC4, 0x90, 0xA1, 0xDF, 0x15, 0x64, 0xBA,\n    0xEC, 0xCB, 0x69, 0xF7, 0xBF, 0xE6, 0x0D, 0x89, 0x6E, 0x5D, 0x62, 0x5D, 0xEA, 0x04, 0x37, 0x1B,\n    0x40, 0x04, 0x37, 0x3B, 0xD0, 0xC6, 0xE0, 0xFC, 0x63, 0xA6, 0xA1, 0xC8, 0xAB, 0x45, 0xA4, 0xFD,\n    0x05, 0xFA, 0x57, 0x01, 0x5F, 0x34, 0x76, 0x0B, 0xCF, 0xB0, 0xD3, 0xFD, 0xED, 0x66, 0xAC, 0xFB,\n    0x63, 0x89, 0x53, 0x46, 0x61, 0xFF, 0x22, 0x64, 0xEB, 0x20, 0x60, 0x02, 0x0B, 0x78, 0xA4, 0xEC,\n    0xF9, 0x1D, 0x34, 0xAB, 0x98, 0x33, 0xB7, 0x76, 0x4D, 0xDA, 0x4C, 0x33, 0x57, 0xD6, 0x23, 0x84,\n    0x25, 0x76, 0x4A, 0x0B, 0xDD, 0xC5, 0xCD, 0x8B, 0xFF, 0xB8, 0x22, 0x37, 0x16, 0xAB, 0xCE, 0xDD,\n    0x92, 0xDB, 0xD1, 0x12, 0xB3, 0x52, 0xD0, 0xE5, 0x4E, 0xBE, 0x69, 0xA8, 0xDF, 0x2F, 0xAF, 0x22,\n    0x29, 0xD0, 0x28, 0xD3, 0x80, 0xA1, 0x39, 0x57, 0x88, 0x17, 0xBA, 0x63, 0x75, 0xD7, 0xB9, 0x05,\n    0xBC, 0x4E, 0x60, 0x02, 0xAC, 0x84, 0x96, 0xD9, 0x23, 0x1E, 0xE3, 0xDA, 0xD6, 0x74, 0xC2, 0xCD,\n    0xA4, 0x22, 0x65, 0x82, 0x50, 0x10, 0xFE, 0x76, 0xF5, 0xE7, 0x61, 0x0D, 0x86, 0xD9, 0x8D, 0x56,\n    0x10, 0x43, 0x9C, 0xFE, 0x05, 0x3A, 0x51, 0x93, 0x81, 0x74, 0xD2, 0x11, 0x10, 0x82, 0xFC, 0x4C,\n    0xA1, 0x83, 0x64, 0x21, 0x4B, 0xEB, 0xA9, 0x8E, 0x9A, 0xB8, 0xAB, 0x95, 0x15, 0x96, 0x9D, 0x49,\n    0x9D, 0xFE, 0xEC, 0xC8, 0xC3, 0x6B, 0xBB, 0x4C, 0x8E, 0x75, 0xBB, 0x8C, 0x42, 0x76, 0x18, 0x8E,\n    0x6F, 0xE0, 0xD6, 0x7C, 0x19, 0xDA, 0x08, 0xD7, 0xE1, 0x73, 0x6C, 0x18, 0x1B, 0x90, 0xCF, 0x6E,\n    0x18, 0xE4, 0x61, 0xC7, 0x1B, 0xE3, 0x93, 0x22, 0x80, 0xB0, 0xE6, 0x66, 0xA0, 0xF7, 0x06, 0xA9,\n    0x1E, 0xD8, 0x62, 0xC5, 0xE3, 0x52, 0x59, 0xF1, 0x71, 0x2A, 0x3C, 0xC0, 0xBC, 0x37, 0xF4, 0x51,\n    0x8C, 0x81, 0xB4, 0x65, 0x95, 0x4A, 0x9D, 0xB5, 0xDF, 0x59, 0x2A, 0x06, 0xA6, 0xB1, 0x05, 0xCE,\n    0xF3, 0x24, 0x7A, 0x59, 0x37, 0x76, 0x79, 0xAB, 0x84, 0x23, 0xF9, 0x5C, 0xFD, 0x48, 0xA3, 0xED,\n    0x75, 0xB8, 0x58, 0x2F, 0x8A, 0xE7, 0xAD, 0x71, 0x94, 0x62, 0x27, 0x1C, 0xAC, 0x5F, 0xE3, 0x92,\n    0x12, 0x6F, 0xAE, 0xAC, 0x12, 0xDA, 0xA9, 0x02, 0x45, 0xD7, 0x62, 0x53, 0xE0, 0xB8, 0xB9, 0xA8,\n    0x02, 0xD7, 0xED, 0xA9, 0x26, 0x8C, 0x8F, 0x82, 0x78, 0x93, 0x8D, 0x1E, 0x8F, 0x8D, 0xEC, 0x89,\n    0xBA, 0x37, 0x6A, 0x35, 0x21, 0x61, 0xD9, 0xE1, 0x52, 0x95, 0x46, 0xD5, 0x3A, 0xDF, 0x8B, 0xBD,\n    0x9F, 0x36, 0x71, 0x95, 0x09, 0x28, 0x88, 0xB1, 0xF0, 0x70, 0xC2, 0x01, 0xA1, 0x4E, 0x0A, 0xF8,\n    0xF2, 0x25, 0x1C, 0x60, 0x3C, 0xA3, 0xA0, 0xFB, 0x5C, 0x3E, 0xF4, 0x11, 0xCC, 0x54, 0xDA, 0xD7,\n    0x80, 0x80, 0xCC, 0xC2, 0xB0, 0x81, 0xDF, 0xC8, 0x1C, 0x96, 0x01, 0x95, 0x17, 0x4E, 0x01, 0x7E,\n    0x76, 0xF4, 0x1C, 0x61, 0x98, 0x58, 0x2A, 0xBD, 0x04, 0x7E, 0x14, 0x8A, 0x88, 0x77, 0xB6, 0xAD,\n    0x05, 0x54, 0xC7, 0xDA, 0xDD, 0x08, 0xBA, 0x5C, 0x9F, 0xC8, 0x3C, 0x87, 0x24, 0xB5, 0xA0, 0x53,\n    0xC7, 0xBD, 0x92, 0x77, 0x5F, 0xE8, 0x22, 0x34, 0x27, 0x98, 0x10, 0xD7, 0x4B, 0x76, 0x77, 0x26,\n    0x2D, 0xD0, 0x24, 0x03, 0x8E, 0x15, 0x57, 0xF2, 0xC6, 0xED, 0x39, 0xB7, 0xAD, 0xE9, 0xFA, 0x14,\n    0xED, 0xCF, 0x50, 0x9E, 0x8D, 0xAC, 0x87, 0x4B, 0x26, 0x28, 0xE4, 0x02, 0xBE, 0x24, 0x6A, 0x39,\n    0x17, 0xBE, 0x9B, 0x79, 0xB7, 0x7E, 0xDF, 0xA6, 0x6E, 0x7B, 0x52, 0xE6, 0x1C, 0xD2, 0xAD, 0xCE,\n    0x30, 0xB9, 0x91, 0xE7, 0x64, 0x8B, 0xBD, 0x1E, 0x8E, 0x40, 0xE3, 0x69, 0xA6, 0xD4, 0xB2, 0x18,\n    0x42, 0x53, 0x6C, 0xE6, 0x1C, 0x69, 0xF9, 0x26, 0x84, 0x4E, 0x6F, 0x16, 0xD5, 0x39, 0xB5, 0x4C,\n    0x86, 0xC9, 0x0D, 0x07, 0x6D, 0x25, 0x61, 0x9E, 0x7D, 0xDA, 0xB7, 0x13, 0x73, 0x7B, 0xC6, 0xF9,\n    0xF8, 0x25, 0x9D, 0x44, 0xA6, 0x70, 0xFE, 0x5F, 0xC0, 0xFA, 0x64, 0xEE, 0x85, 0x6D, 0xA5, 0x0C,\n    0x28, 0x68, 0x8C, 0x17, 0xCE, 0x3E, 0x38, 0x86, 0x83, 0x24, 0x97, 0xA3, 0xC2, 0x54, 0xF9, 0x3C,\n    0xE7, 0x3A, 0xE8, 0xBC, 0x6D, 0xB8, 0x17, 0x7D, 0xF0, 0x6C, 0xEF, 0xFB, 0xBB, 0xC9, 0xD7, 0x5B,\n    0xBF, 0xBB, 0x99, 0x83, 0x94, 0x29, 0xE9, 0x9F, 0xFC, 0x6D, 0xD7, 0xA8, 0x6C, 0x62, 0x42, 0x18,\n    0x95, 0x2D, 0x44, 0xFF, 0xB4, 0x48, 0x30, 0x88, 0x29, 0x25, 0x41, 0x83, 0x0F, 0xAE, 0x9D, 0xE3,\n    0xEC, 0xB2, 0x18, 0x0F, 0xBF, 0x4F, 0x11, 0x1F, 0xDA, 0xF2, 0xEC, 0x54, 0xE3, 0xCF, 0xE9, 0xAD,\n    0x4A, 0x7E, 0xF0, 0xDE, 0xD4, 0x65, 0x21, 0x6F, 0x3A, 0xA8, 0x2E, 0xD5, 0x02, 0x39, 0x11, 0x4C,\n    0xA5, 0x0A, 0xF1, 0xE4, 0x04, 0xFE, 0xC7, 0xFA, 0xE2, 0x2B, 0x74, 0xD3, 0xBD, 0xB2, 0x8D, 0xAB,\n    0x18, 0x6B, 0x22, 0x3B, 0x79, 0x67, 0x88, 0x0F, 0x05, 0xB2, 0xA5, 0x26, 0x9B, 0x5A, 0x4E, 0x96,\n    0xBE, 0xE4, 0x60, 0x9F, 0xD5, 0x8C, 0x0F, 0x81, 0x12, 0xEE, 0x5E, 0xAA, 0x63, 0x10, 0x0C, 0x87,\n    0x42, 0x73, 0xA7, 0x16, 0x97, 0x7D, 0x8A, 0x3E, 0x6C, 0xAC, 0xB8, 0xAF, 0x70, 0xC2, 0xCA, 0x95,\n    0xD5, 0x01, 0x9A, 0x3B, 0xB0, 0x36, 0xBF, 0xEE, 0xF9, 0x7D, 0x0B, 0xA1, 0x21, 0xA6, 0x6D, 0x85,\n    0x12, 0xB1, 0xCF, 0x14, 0xE8, 0xCC, 0xFC, 0xC3, 0xA2, 0x1A, 0x09, 0x28, 0x48, 0xEB, 0xA8, 0xB2,\n    0x8B, 0x4D, 0x17, 0xCD, 0x5C, 0x47, 0x70, 0xB9, 0x82, 0xB0, 0xFF, 0xEA, 0xE8, 0x3F, 0x64, 0xDB,\n    0x9A, 0x0E, 0xFC, 0xED, 0x1D, 0xD2, 0xDE, 0x03, 0x92, 0x91, 0x17, 0xF1, 0x6F, 0x38, 0x14, 0xEC,\n    0x79, 0x14, 0xCF, 0xA0, 0x2B, 0x63, 0x65, 0x84, 0x28, 0xD3, 0xB8, 0x77, 0x4C, 0x0B, 0x55, 0x4D,\n    0xF5, 0x89, 0xEF, 0xE7, 0x41, 0xC1, 0x5F, 0x18, 0xAE, 0x06, 0x7F, 0xA9, 0x37, 0x84, 0x34, 0x6F,\n    0x7C, 0xC3, 0x9B, 0x96, 0x68, 0x88, 0x91, 0x99, 0x35, 0x2B, 0xFF, 0x62, 0xD8, 0xC5, 0xE0, 0x4D,\n    0x40, 0x79, 0x1D, 0x18, 0x30, 0x58, 0x4B, 0xF9, 0x48, 0xA7, 0x27, 0x02, 0xF5, 0x67, 0xB3, 0x17,\n    0x4C, 0x22, 0x46, 0x2B, 0x39, 0x20, 0x79, 0x22, 0xE9, 0x25, 0x13, 0x1D, 0x28, 0x20, 0x3E, 0xDA,\n    0x49, 0x53, 0xA6, 0x3D, 0x7F, 0x70, 0x7B, 0xA6, 0x75, 0xA9, 0x45, 0xEB, 0x3B, 0x8F, 0xFE, 0x36,\n    0xAD, 0xBA, 0xBE, 0x5B, 0x5A, 0x5B, 0x9E, 0x2A, 0xEA, 0x28, 0xFE, 0xD5, 0x2D, 0x4A, 0x89, 0x7B,\n    0x6C, 0xBE, 0xF6, 0xEF, 0x19, 0xCD, 0xA1, 0x90, 0xD1, 0x44, 0x10, 0x58, 0x58, 0xD8, 0x39, 0x53,\n    0x13, 0xA9, 0xBF, 0x02, 0xBC, 0x7A, 0xD3, 0xBC, 0xD1, 0x61, 0xA4, 0xCC, 0x64, 0x0C, 0xF3, 0x51,\n    0x7C, 0x8B, 0x03, 0x67, 0xBC, 0xA4, 0x0C, 0x20, 0x5C, 0xD5, 0xF1, 0xCA, 0xF3, 0x7B, 0x93, 0x5D,\n    0x1D, 0x5B, 0x2C, 0xF2, 0x92, 0x3D, 0xF5, 0x0B, 0x90, 0x4C, 0x0C, 0xB6, 0x1C, 0x4D, 0x8D, 0x15,\n    0x9C, 0x9B, 0x46, 0xDC, 0xC0, 0x7D, 0x01, 0x92, 0x2B, 0x7D, 0xED, 0xCA, 0x27, 0xF3, 0xA2, 0x0F,\n    0x46, 0x62, 0x09, 0xEA, 0x4B, 0xB1, 0x70, 0x6C, 0x24, 0x96, 0x93, 0xFB, 0xA5, 0x95, 0xD6, 0xF6,\n    0xDD, 0x04, 0x39, 0x05, 0x58, 0x5C, 0xAC, 0xE2, 0x12, 0xAC, 0x9C, 0x7F, 0x69, 0xBB, 0x0D, 0xD1,\n    0xD8, 0xE7, 0x26, 0x6D, 0x32, 0xCF, 0xB7, 0x12, 0xC5, 0x21, 0x49, 0x64, 0xCC, 0x31, 0x72, 0x33,\n    0x8E, 0x2F, 0xC5, 0x9F, 0x4C, 0x92, 0x5E, 0xDB, 0x03, 0x8F, 0x1F, 0x2A, 0xBB, 0xA6, 0x9C, 0xA0,\n    0x1F, 0xC2, 0x89, 0xB1, 0xA6, 0x70, 0x32, 0x17, 0x74, 0x35, 0x14, 0xE2, 0xF8, 0x83, 0x9D, 0x1E,\n    0x04, 0xD7, 0x05, 0x34, 0x8E, 0xAE, 0xA8, 0x0A, 0x34, 0x74, 0xA7, 0x42, 0x1B, 0x1F, 0x90, 0x31,\n    0xA7, 0x9A, 0xFA, 0xC7, 0xD3, 0x6C, 0x45, 0xBA, 0x49, 0x3C, 0x4E, 0xBA, 0x85, 0xFC, 0x0B, 0x8A,\n    0x89, 0xEF, 0x6A, 0xD2, 0x88, 0xF1, 0xA9, 0xA4, 0x55, 0x54, 0xA0, 0x38, 0x4D, 0xEC, 0x1B, 0x9D,\n    0x70, 0x7F, 0x98, 0x9E, 0xE0, 0x7E, 0xC0, 0x4F, 0xD3, 0xA5, 0xC5, 0x78, 0x86, 0xDD, 0x92, 0xB5,\n    0x8A, 0xA5, 0xFB, 0x75, 0x64, 0x06, 0x66, 0xAF, 0x06, 0xF2, 0xEF, 0x7C, 0x82, 0x61, 0xE3, 0x81,\n    0x64, 0xBC, 0x53, 0x03, 0x8B, 0x62, 0x61, 0xE7, 0xFD, 0x75, 0x3A, 0x63, 0x9C, 0x03, 0x84, 0x00,\n    0xA0, 0x90, 0x27, 0xAA, 0xF3, 0xA7, 0xF8, 0xB4, 0xB5, 0xF5, 0xC7, 0x22, 0xDE, 0x35, 0x95, 0x3A,\n    0x35, 0xE6, 0x6D, 0x89, 0x58, 0x0D, 0xBC, 0xC2, 0xC6, 0x97, 0xB1, 0xD4, 0xA6, 0xF0, 0x65, 0x66,\n    0x7F, 0x19, 0xAF, 0x50, 0x88, 0xB9, 0x58, 0x8C, 0xC2, 0xED, 0x6E, 0x4A, 0xF8, 0xB3, 0xC7, 0x06,\n    0x1A, 0xCF, 0x92, 0xC4, 0x98, 0x43, 0x27, 0x0D, 0xA2, 0x01, 0x5B, 0x85, 0x98, 0x8C, 0x9C, 0x5E,\n    0x82, 0x19, 0xA8, 0x4E, 0xA8, 0x60, 0xB1, 0xEE, 0x14, 0x73, 0xC7, 0x70, 0xA9, 0x6E, 0x2A, 0x39,\n    0x4F, 0xF6, 0x4C, 0x77, 0x1F, 0xB3, 0x7A, 0x4B, 0xAB, 0xA8, 0x14, 0x8D, 0xF2, 0xC5, 0xBC, 0xE2,\n    0xF1, 0x7E, 0xB8, 0xC3, 0x6B, 0xA2, 0xF5, 0x61, 0x79, 0x93, 0x98, 0xBB, 0x13, 0x5F, 0x7F, 0x62,\n    0xAE, 0x74, 0xC6, 0xF8, 0x23, 0x4F, 0xA6, 0x41, 0x0D, 0x23, 0xF6, 0x3F, 0xF5, 0x23, 0xD9, 0xE4,\n    0xCC, 0x87, 0xA5, 0x3E, 0xF8, 0xCC, 0xBC, 0x4F, 0x8F, 0xC8, 0x5C, 0xC8, 0x7D, 0xC1, 0xC4, 0x23,\n    0x66, 0x62, 0xA5, 0x75, 0xC7, 0x44, 0x15, 0x84, 0xC3, 0xFC, 0x16, 0x81, 0x7F, 0xE5, 0x0C, 0xDA,\n    0xAC, 0xD8, 0x53, 0x71, 0x5D, 0xBE, 0x91, 0xB8, 0xFC, 0x3B, 0x8F, 0x88, 0x2D, 0x67, 0xA4, 0x1D,\n    0x9F, 0xFB, 0x12, 0xD7, 0x1D, 0xF0, 0x6C, 0x2F, 0x2D, 0xA3, 0x36, 0x97, 0x1A, 0xA5, 0x5D, 0xE7,\n    0x18, 0x21, 0x31, 0xFB, 0xAB, 0x1E, 0x75, 0x41, 0x70, 0x4C, 0xC4, 0xBB, 0x01, 0x7B, 0x72, 0x51,\n    0xAE, 0x0B, 0xB3, 0x59, 0x6D, 0xA4, 0x1F, 0xCB, 0x69, 0x7C, 0x72, 0x28, 0xF6, 0x85, 0xC2, 0xA1,\n    0x88, 0x4A, 0x82, 0xEA, 0xCF, 0xBA, 0x87, 0xB7, 0x13, 0x5B, 0xD0, 0xFC, 0x5E, 0x77, 0x4F, 0x3D,\n    0x92, 0x9E, 0x3F, 0xB0, 0xE0, 0xDC, 0x9B, 0xB8, 0x67, 0x13, 0xCE, 0x5D, 0x2F, 0xE8, 0x96, 0xF6,\n    0x18, 0x24, 0x52, 0x87, 0x6E, 0x46, 0x51, 0x80, 0x37, 0x56, 0xE2, 0xE2, 0x3D, 0x33, 0x82, 0x31,\n    0xEF, 0x0E, 0xA2, 0xB2, 0x56, 0xF9, 0x3F, 0xBA, 0x22, 0x26, 0x96, 0x3E, 0x3D, 0xE6, 0x35, 0x8E,\n    0x24, 0x19, 0x7D, 0x0E, 0x0B, 0x10, 0x4C, 0xFE, 0x74, 0x59, 0x32, 0x9C, 0x65, 0xA7, 0xB1, 0xEF,\n    0x08, 0xF8, 0x07, 0x1C, 0x11, 0x52, 0xC0, 0x8F, 0xE3, 0x93, 0x9E, 0x53, 0x23, 0x13, 0xA6, 0x3E,\n    0xB3, 0xB1, 0x20, 0x24, 0xB6, 0xE1, 0x22, 0xD1, 0xED, 0x36, 0xD3, 0x5C, 0x18, 0xC4, 0xE4, 0x09,\n    0x7F, 0x60, 0x45, 0x9D, 0xCE, 0xAE, 0xDF, 0xE2, 0xD4, 0xC6, 0xBA, 0x53, 0x6B, 0x97, 0xAD, 0x2B,\n    0x60, 0x54, 0x60, 0x22, 0x3C, 0x4C, 0x25, 0x2C, 0x87, 0xF9, 0x64, 0x51, 0x60, 0x2E, 0xE1, 0x90,\n    0xAE, 0xCC, 0x70, 0xC1, 0xCA, 0x62, 0x07, 0xEF, 0x63, 0x40, 0x80, 0x7B, 0xC2, 0x35, 0x56, 0xC6,\n    0xB8, 0x12, 0x0E, 0x34, 0xF4, 0x54, 0x28, 0x53, 0x52, 0xD4, 0x4F, 0x0F, 0x98, 0x78, 0x74, 0x9A,\n    0x4A, 0x1E, 0x77, 0x31, 0x4D, 0xAB, 0x7D, 0xDD, 0x07, 0x4E, 0x57, 0x24, 0xAE, 0x3F, 0xF1, 0x30,\n    0x19, 0xA8, 0x2E, 0x66, 0xB1, 0x4D, 0x30, 0x5B, 0x28, 0xB4, 0x9F, 0x48, 0xFF, 0x59, 0x19, 0xED,\n    0xA1, 0x47, 0x5F, 0xBF, 0xC0, 0x6C, 0x50, 0xCA, 0x7C, 0xF3, 0x01, 0x40, 0xAE, 0xD2, 0x06, 0x29,\n    0x68, 0xAF, 0xDA, 0xD5, 0x42, 0x5B, 0x75, 0xA3, 0xD0, 0xC1, 0x95, 0x6D, 0xB5, 0xB5, 0x1C, 0x63,\n    0x7D, 0x3F, 0x8F, 0x37, 0x84, 0x67, 0x69, 0xF9, 0xF4, 0x17, 0x03, 0xAB, 0xD8, 0x79, 0x0B, 0x8F,\n    0xB8, 0x78, 0x6C, 0x7B, 0xE6, 0x43, 0xA4, 0x87, 0x39, 0x3E, 0x57, 0xC6, 0x69, 0x13, 0x41, 0x8A,\n    0x14, 0x53, 0xBD, 0x1B, 0x44, 0x51, 0x96, 0x87, 0x4A, 0xEB, 0xD4, 0xCB, 0xE1, 0x65, 0x4A, 0x2F,\n    0xF6, 0xAC, 0x8A, 0x58, 0x94, 0x87, 0xC0, 0xB8, 0x19, 0x7F, 0x88, 0xC2, 0xDE, 0x9A, 0x8E, 0x57,\n    0xD7, 0xD5, 0xDB, 0x92, 0x8C, 0x16, 0xB7, 0x85, 0x93, 0xE1, 0x7E, 0x16, 0x80, 0x23, 0x2B, 0x5C,\n    0x83, 0x63, 0xB0, 0xDD, 0x82, 0xDB, 0x21, 0x17, 0x22, 0x51, 0x35, 0xE3, 0x22, 0x36, 0x2B, 0xDA,\n    0x5E, 0xE5, 0x48, 0xEA, 0xC5, 0x23, 0x05, 0x8E, 0xD1, 0xFF, 0xE6, 0x81, 0xC5, 0x0B, 0xE1, 0x06,\n    0x0E, 0xD0, 0x2C, 0xA6, 0x43, 0xF3, 0x89, 0x5A, 0x67, 0xBD, 0x33, 0xE6, 0xC8, 0x5E, 0xAC, 0x83,\n    0xB5, 0xDC, 0x0E, 0x98, 0xAB, 0x32, 0x5A, 0x25, 0xFD, 0xE4, 0x77, 0x48, 0x11, 0xE6, 0x81, 0x22,\n    0x26, 0x2C, 0x95, 0x3E, 0xDB, 0x5E, 0x74, 0x6C, 0x5E, 0x3B, 0x58, 0x09, 0x89, 0x3F, 0x4A, 0xB8,\n    0xAF, 0x53, 0xE2, 0x45, 0x3B, 0x63, 0xB5, 0xEE, 0x15, 0xDF, 0x0B, 0x3E, 0x29, 0xF1, 0xAF, 0x54,\n    0x69, 0xB2, 0x89, 0xF3, 0x42, 0x92, 0x14, 0xF0, 0xC0, 0xC5, 0x25, 0x7F, 0xDF, 0x42, 0xDE, 0xC1,\n    0x29, 0x60, 0x1A, 0x62, 0xFB, 0x0C, 0xF8, 0xC6, 0x57, 0x8B, 0x1E, 0x82, 0x06, 0x35, 0xA9, 0x06,\n    0x41, 0xAC, 0x76, 0x7E, 0x8C, 0x84, 0xE2, 0xF9, 0x18, 0x69, 0xC4, 0xD2, 0xB7, 0xB1, 0xBE, 0xDB,\n    0x83, 0x92, 0xA8, 0x7F, 0x32, 0xC7, 0xF4, 0x08, 0xE0, 0x26, 0xBE, 0x2D, 0x6B, 0x76, 0x9D, 0x68,\n    0xE3, 0x4B, 0xC9, 0x1A, 0x0A, 0xE4, 0x77, 0x19, 0xB8, 0xB2, 0xBE, 0x46, 0x2A, 0x3C, 0x76, 0xB7,\n    0x54, 0x6F, 0x41, 0x59, 0x21, 0x7A, 0xA6, 0x44, 0xCE, 0x74, 0xA9, 0xD4, 0x13, 0x47, 0xD1, 0x55,\n    0xA0, 0xF0, 0x85, 0x20, 0x80, 0xDF, 0x4E, 0x7D, 0xF4, 0xB2, 0xBE, 0x75, 0x9A, 0xA2, 0x10, 0xC2,\n    0xFD, 0xB1, 0xB9, 0x8E, 0x14, 0x80, 0xB6, 0x5B, 0x8A, 0x6A, 0x81, 0x37, 0x8C, 0x03, 0x51, 0x85,\n    0x25, 0xD7, 0x85, 0x6A, 0xC8, 0x0A, 0x1F, 0x24, 0xB6, 0x2C, 0xB0, 0x1A, 0x20, 0x23, 0xCB, 0xB5,\n    0xF8, 0x19, 0x88, 0x63, 0x67, 0xB7, 0xCD, 0x5B, 0x4F, 0x3C, 0xAA, 0xE6, 0x90, 0xCC, 0x6A, 0xDD,\n    0xE0, 0x51, 0x29, 0x22, 0xFF, 0x17, 0x53, 0x62, 0x40, 0xF4, 0xB6, 0x5F, 0x55, 0x65, 0x67, 0x79,\n    0x5B, 0x98, 0xA3, 0x58, 0x35, 0xB2, 0x21, 0xDB, 0x0C, 0x6C, 0x20, 0x07, 0x3A, 0x58, 0xE5, 0x96,\n    0x7F, 0xB9, 0x1F, 0x31, 0x7A, 0x8A, 0x64, 0xA8, 0x06, 0xAA, 0x56, 0x55, 0x2D, 0x0B, 0x8B, 0x71,\n    0x78, 0x8B, 0x9F, 0xC1, 0x12, 0x54, 0x00, 0x5E, 0x2E, 0x76, 0x98, 0x99, 0x77, 0xE3, 0x4D, 0x08,\n    0x47, 0xC2, 0xF1, 0xFB, 0xF9, 0xE1, 0x8D, 0x40, 0x71, 0x67, 0xF9, 0x15, 0x34, 0xED, 0x10, 0x63,\n    0x63, 0xA2, 0x2A, 0x59, 0x0B, 0x3E, 0xA2, 0xB6, 0xC2, 0x03, 0x19, 0x8B, 0x7C, 0x76, 0x17, 0xEF,\n    0x6B, 0xE3, 0x1F, 0xBF, 0x32, 0xDC, 0xF4, 0x2E, 0x69, 0x15, 0x54, 0x40, 0x78, 0x97, 0x13, 0x2D,\n    0xB5, 0x7D, 0x18, 0x91, 0x40, 0x84, 0x8F, 0x92, 0x44, 0x32, 0x42, 0x9F, 0xD1, 0x2D, 0xEA, 0x82,\n    0x48, 0x39, 0x49, 0x19, 0x07, 0xC6, 0x32, 0x9F, 0xD5, 0x87, 0x80, 0x92, 0x78, 0xDA, 0x9A, 0x93,\n    0x90, 0x71, 0xDD, 0xC4, 0x6D, 0xC3, 0x74, 0xA6, 0xC9, 0x88, 0x98, 0xFF, 0x8A, 0x81, 0x50, 0xAC,\n    0x73, 0x49, 0x0A, 0x75, 0x27, 0x02, 0xAF, 0x81, 0xB8, 0xAD, 0x83, 0xA9, 0x08, 0x29, 0xF0, 0x78,\n    0x4A, 0x32, 0xDB, 0x10, 0xA4, 0x5E, 0xFA, 0x3B, 0x49, 0xBD, 0xA5, 0xE1, 0xE6, 0x0B, 0xDB, 0x6F,\n    0x31, 0x18, 0xDC, 0xA7, 0x63, 0xD0, 0xBA, 0xC7, 0xA3, 0x0A, 0x88, 0x76, 0xA8, 0x6C, 0x4B, 0xBE,\n    0x3A, 0xD6, 0x81, 0x20, 0xEF, 0xD4, 0x36, 0x4C, 0x2E, 0xBD, 0x22, 0x56, 0x5E, 0xE9, 0xBB, 0x25,\n    0x75, 0x54, 0x33, 0xF6, 0x1B, 0x7F, 0xD8, 0x95, 0x49, 0x9B, 0xB1, 0x30, 0x3E, 0x6F, 0x17, 0x91,\n    0x42, 0x82, 0x42, 0x81, 0x16, 0x56, 0xCF, 0x2D, 0xC2, 0x34, 0x6C, 0x38, 0xA0, 0x42, 0x14, 0x7A,\n    0x13, 0x9D, 0x38, 0xC1, 0x6D, 0x3A, 0x3D, 0x0E, 0x24, 0x2C, 0x23, 0xE3, 0xBC, 0x36, 0x2A, 0x97,\n    0x05, 0x9E, 0x31, 0x9A, 0xF2, 0x88, 0x84, 0xA2, 0x28, 0xB8, 0xB3, 0x40, 0x3E, 0xE8, 0x5F, 0x44,\n    0x32, 0x7E, 0xD7, 0x64, 0xFE, 0x37, 0x51, 0x32, 0xD1, 0x59, 0x4E, 0xB8, 0x98, 0xC4, 0x87, 0x50,\n    0xB0, 0x0C, 0xAD, 0xE8, 0x98, 0x20, 0xA2, 0xAA, 0xFC, 0x94, 0xCF, 0x87, 0xFB, 0x60, 0xDB, 0xBF,\n    0x93, 0x7E, 0xBD, 0x5F, 0x13, 0x6C, 0xC9, 0x06, 0x34, 0xD5, 0x8A, 0xED, 0x5D, 0xAC, 0x77, 0xC9,\n    0x84, 0xD5, 0x05, 0x61, 0x71, 0x4E, 0x69, 0xE1, 0xC6, 0xFD, 0x12, 0x3F, 0x37, 0x3F, 0xEE, 0x1D,\n    0x93, 0x6E, 0xF3, 0x32, 0x18, 0x26, 0x87, 0x2A, 0x7C, 0x0F, 0x75, 0x1A, 0x06, 0x61, 0x76, 0x22,\n    0x18, 0x39, 0x24, 0x49, 0xA7, 0xF7, 0x81, 0x51, 0x1E, 0x8F, 0x86, 0x76, 0xE3, 0xF2, 0xF0, 0xCF,\n    0x8B, 0xB1, 0x5E, 0xFA, 0xA7, 0xF3, 0x0F, 0x63, 0x6B, 0x4D, 0x0B, 0x71, 0x3A, 0xAB, 0x60, 0x76,\n    0x01, 0xA5, 0x28, 0x4D, 0xB4, 0xBF, 0xDB, 0x8E, 0x2B, 0xE1, 0xD6, 0xE6, 0xC8, 0x8F, 0xE6, 0x79,\n    0xD6, 0x19, 0xD9, 0x3A, 0x6F, 0x0C, 0xDC, 0xC0, 0x31, 0x61, 0x70, 0x21, 0xE4, 0xFA, 0x43, 0x43,\n    0x03, 0xFC, 0x88, 0xA8, 0x77, 0xCA, 0xE6, 0x79, 0x59, 0x84, 0x5D, 0x2B, 0x0A, 0xB7, 0x13, 0x1B,\n    0x2C, 0xEC, 0xDD, 0x8A, 0x26, 0xE9, 0xB3, 0x69, 0x4F, 0x72, 0xCB, 0x82, 0x2E, 0x54, 0x00, 0xD1,\n    0x19, 0xA5, 0x0F, 0xB2, 0x5F, 0xCA, 0x3C, 0xB6, 0x5F, 0x8B, 0xC8, 0xD4, 0x21, 0xCF, 0x26, 0x83,\n    0x5A, 0xD2, 0xCA, 0xFF, 0x26, 0x46, 0x5E, 0xE8, 0x2C, 0x0F, 0xA7, 0xBA, 0x8E, 0xCD, 0xBB, 0xB0,\n    0x70, 0x78, 0xA2, 0xF4, 0x8F, 0x9D, 0x0F, 0x23, 0x29, 0xF4, 0xBC, 0xFC, 0x54, 0x22, 0x00, 0x7B,\n    0x88, 0x0F, 0x87, 0x08, 0xF2, 0x37, 0x3E, 0x07, 0x4E, 0xEF, 0xF3, 0x4F, 0x96, 0x7B, 0xB3, 0xA4,\n    0x1D, 0x45, 0x3D, 0x88, 0x5D, 0xC2, 0xA8, 0xFA, 0x71, 0xBE, 0xA6, 0x1F, 0x7E, 0x77, 0xD5, 0x48,\n    0x23, 0x73, 0x1C, 0x62, 0xF5, 0x98, 0x8E, 0xB7, 0x67, 0xB1, 0xC8, 0xFA, 0xD7, 0xCB, 0x08, 0x0A,\n    0x64, 0x57, 0x93, 0x7E, 0x8E, 0xF2, 0x20, 0xAA, 0xB5, 0x06, 0x8D, 0x12, 0xE2, 0xB8, 0x4D, 0xFC,\n    0xC8, 0x23, 0xAB, 0x61, 0x05, 0xE4, 0x46, 0x87, 0x15, 0x25, 0x23, 0x43, 0x15, 0x32, 0x63, 0x9E,\n    0x79, 0xFA, 0xBE, 0x10, 0x2B, 0xA3, 0x49, 0xA0, 0x80, 0xB0, 0x3F, 0x50, 0x68, 0xF5, 0xC0, 0x7C,\n    0x55, 0xA2, 0x58, 0x92, 0xD4, 0xF3, 0xA0, 0xEE, 0x83, 0x33, 0x71, 0xE6, 0xAB, 0x77, 0x44, 0x25,\n    0x5D, 0xBF, 0x57, 0x91, 0x25, 0x14, 0x0C, 0x5D, 0x07, 0xA0, 0x8F, 0x82, 0x9C, 0xA8, 0x33, 0x05,\n    0x25, 0x5F, 0x6B, 0x20, 0xB1, 0x92, 0xDC, 0x4E, 0xDA, 0x6D, 0xC4, 0x85, 0xE7, 0xDE, 0x00, 0xAD,\n    0x0E, 0x45, 0x9A, 0x3E, 0xBF, 0x1E, 0x7B, 0xF1, 0x94, 0x11, 0x77, 0xCE, 0xE2, 0xF0, 0x7B, 0x9A,\n    0x85, 0x46, 0x98, 0x27, 0x44, 0xCC, 0xC7, 0x3F, 0x2D, 0x6F, 0xE2, 0xD3, 0xDF, 0x6E, 0x6D, 0x74,\n    0xFD, 0xC0, 0xEF, 0x8C, 0xA3, 0x71, 0xEA, 0xA4, 0x56, 0x59, 0x57, 0x23, 0x78, 0x87, 0x16, 0x8C,\n    0x1E, 0x63, 0x9C, 0xE2, 0xA7, 0x28, 0x2A, 0x64, 0xC0, 0x97, 0x34, 0xB0, 0xD5, 0x78, 0x4C, 0xC3,\n    0xB2, 0x5D, 0x9B, 0x89, 0x3F, 0xD3, 0x7E, 0xD2, 0x8A, 0x78, 0x8C, 0x1A, 0x82, 0xB2, 0xA5, 0xFD,\n    0x37, 0xE6, 0x64, 0x32, 0xF0, 0xC9, 0xDE, 0xAF, 0xA6, 0xBD, 0xB9, 0xDD, 0xE1, 0xF6, 0x2D, 0xC1,\n    0x17, 0x15, 0xF1, 0x73, 0xA4, 0x4C, 0x65, 0x11, 0x92, 0xDC, 0x61, 0xFD, 0x0C, 0x60, 0x49, 0x43,\n    0x54, 0xAC, 0xC9, 0xD7, 0xD5, 0x85, 0x09, 0xD4, 0x57, 0x74, 0x18, 0xD6, 0x53, 0xEB, 0x26, 0xAE,\n    0x13, 0xCE, 0x0C, 0x6F, 0x7C, 0x11, 0x90, 0x02, 0xB9, 0x46, 0xB8, 0xEC, 0x25, 0x31, 0xE2, 0xBA,\n    0xD4, 0xE4, 0x19, 0x1F, 0xF8, 0xB9, 0x6D, 0xA6, 0x7A, 0xE8, 0x03, 0x9A, 0x94, 0x9F, 0x26, 0x3B,\n    0xE0, 0x1A, 0x32, 0xAD, 0x73, 0x3C, 0xB7, 0xE4, 0x32, 0x6F, 0x51, 0x3B, 0x3D, 0x83, 0x86, 0xD7,\n    0x62, 0x6D, 0xF8, 0xDF, 0x5C, 0xB2, 0x59, 0x92, 0xAE, 0x52, 0xA7, 0xFE, 0xA9, 0x9B, 0x0F, 0xD8,\n    0x5C, 0xCA, 0x50, 0xC3, 0xD7, 0x7C, 0x8E, 0x80, 0x1E, 0xCE, 0xC9, 0x8E, 0x6B, 0x7A, 0x4F, 0x1B,\n    0x3A, 0x1E, 0x91, 0x18, 0x4C, 0x01, 0x50, 0x47, 0x54, 0x65, 0xF2, 0x72, 0xA1, 0x83, 0xE2, 0x86,\n    0x9B, 0x93, 0x07, 0x75, 0xE4, 0x33, 0x47, 0xB5, 0xBD, 0x42, 0xB2, 0x30, 0x6B, 0x69, 0x1F, 0xE9,\n    0xB3, 0x58, 0x91, 0x95, 0x7B, 0xED, 0xC3, 0xF2, 0x46, 0x28, 0xB5, 0x18, 0x21, 0x27, 0x57, 0xF2,\n    0x39, 0xE6, 0x8A, 0x28, 0xA7, 0x7D, 0xFB, 0x01, 0xF2, 0x7B, 0x56, 0x5A, 0xC4, 0x85, 0x5A, 0x41,\n    0x96, 0xF7, 0xF7, 0xC5, 0x91, 0xA4, 0x89, 0x9A, 0x09, 0x91, 0xBB, 0xE9, 0x29, 0x92, 0x7F, 0xE6,\n    0x5B, 0x94, 0x8E, 0x93, 0x43, 0x90, 0x53, 0x0F, 0x10, 0xD7, 0x7E, 0x04, 0x28, 0xB7, 0xF7, 0x14,\n    0xB3, 0x42, 0x5E, 0xDF, 0xB5, 0xAA, 0xE4, 0xF7, 0xED, 0x98, 0x43, 0xC6, 0x8C, 0xFA, 0x7C, 0xB0,\n    0x71, 0xB1, 0xE9, 0x64, 0x65, 0xBB, 0x58, 0xCC, 0x73, 0x5F, 0x6A, 0x5A, 0x86, 0x2D, 0x2E, 0x89,\n    0xB4, 0x5A, 0xFE, 0x16, 0x5B, 0x64, 0x56, 0x27, 0x38, 0xC2, 0x1D, 0x1C, 0xF0, 0xC5, 0x0B, 0x80,\n    0x8D, 0x6F, 0x2E, 0x0C, 0x7B, 0x56, 0xEF, 0x23, 0xE5, 0xFC, 0xD2, 0x55, 0xF6, 0x9C, 0xF7, 0x5F,\n    0xB5, 0xEC, 0xB7, 0xEE, 0xC4, 0xEC, 0xFE, 0xD6, 0xAA, 0xEC, 0x24, 0xB8, 0xB7, 0x98, 0x8D, 0x0B,\n    0x12, 0x36, 0xAC, 0x5B, 0x3E, 0x87, 0x29, 0x21, 0x9C, 0xFD, 0x84, 0xFD, 0xF5, 0x10, 0xA4, 0xE8,\n    0x1C, 0x4F, 0x16, 0x45, 0xBF, 0xC9, 0x18, 0x9F, 0xDE, 0xF1, 0x96, 0x64, 0x58, 0x61, 0xF1, 0x41,\n    0x82, 0xE2, 0xDA, 0xA3, 0xE4, 0x86, 0x0F, 0xB7, 0xCA, 0x17, 0x17, 0x2A, 0x7D, 0xAC, 0x9F, 0xB3,\n    0x8E, 0x65, 0x63, 0x80, 0x64, 0x8E, 0x6F, 0xDB, 0xD4, 0x05, 0x65, 0xEE, 0x13, 0x1C, 0xE6, 0x51,\n    0x53, 0x01, 0xA1, 0xE2, 0xA1, 0x3E, 0x46, 0x82, 0xBB, 0x4A, 0x7E, 0xC1, 0x4A, 0x12, 0xBB, 0x56,\n    0xA2, 0x2F, 0x81, 0xC0, 0x0F, 0x47, 0x7F, 0xA1, 0xD9, 0x8F, 0x21, 0xC5, 0x48, 0x34, 0xF0, 0x7F,\n    0x07, 0xE8, 0xB4, 0x0C, 0x37, 0xEA, 0x4A, 0x76, 0x5E, 0x98, 0xA0, 0x87, 0x08, 0xC1, 0x51, 0x3D,\n    0xED, 0xC6, 0xA2, 0x75, 0x90, 0xB4, 0x23, 0xFC, 0x3E, 0x36, 0x4A, 0x9A, 0xEA, 0x25, 0x1F, 0x62,\n    0x41, 0x69, 0xCC, 0x8C, 0xB0, 0xB7, 0xAA, 0x6B, 0x67, 0xC9, 0x85, 0x7F, 0x92, 0xC0, 0x7A, 0x30,\n    0x18, 0x35, 0xCD, 0xFD, 0x85, 0xC4, 0x70, 0x23, 0x75, 0x45, 0x67, 0x79, 0xAB, 0xFE, 0x83, 0x4B,\n    0xC9, 0x09, 0x78, 0xF1, 0x7F, 0xFA, 0xCC, 0xF2, 0x0A, 0x03, 0x0E, 0x43, 0x9A, 0xD1, 0xBF, 0x53,\n    0xA8, 0x1E, 0x0F, 0x75, 0xC9, 0x14, 0x54, 0x07, 0x6D, 0xCD, 0xC7, 0xB3, 0x5D, 0x14, 0x87, 0x29,\n    0x0C, 0x43, 0xED, 0x91, 0xE3, 0x0A, 0xD0, 0x6F, 0xAE, 0x3B, 0xB5, 0xA8, 0x29, 0x3C, 0xA5, 0x5E,\n    0x0A, 0x51, 0xB4, 0x7F, 0x3D, 0x15, 0xCC, 0x1A, 0x35, 0xFB, 0xA4, 0x70, 0xDC, 0x4B, 0x98, 0xD4,\n    0xBF, 0x28, 0xE6, 0x29, 0x42, 0x60, 0x71, 0xA7, 0xAE, 0x02, 0xC0, 0xE4, 0xEE, 0x61, 0x48, 0x07,\n    0x84, 0x87, 0xAD, 0x5E, 0x70, 0xA8, 0x03, 0x30, 0x81, 0xE3, 0xE3, 0x53, 0x28, 0xFC, 0x06, 0xF8,\n    0x37, 0x19, 0x69, 0xA1, 0xD2, 0x7A, 0xDB, 0x91, 0xAD, 0xB2, 0x8E, 0x51, 0xE1, 0xC0, 0x0A, 0xEE,\n    0x70, 0x3B, 0xB7, 0x37, 0x96, 0x07, 0xBC, 0x66, 0x3B, 0x10, 0x6F, 0x18, 0xCC, 0xA8, 0x8F, 0xDD,\n    0x6C, 0x30, 0x18, 0xEF, 0x96, 0x09, 0xE5, 0x89, 0x47, 0x8E, 0xBA, 0x57, 0x8D, 0x8F, 0x63, 0x8A,\n    0xAB, 0x30, 0xA0, 0x45, 0x1C, 0x4C, 0x0D, 0xB0, 0x72, 0x09, 0x0A, 0xC8, 0x56, 0xD8, 0x45, 0x71,\n    0xD3, 0xB8, 0x03, 0xD3, 0xCD, 0x9E, 0x86, 0x53, 0xA5, 0xD5, 0x58, 0xA5, 0x03, 0xE3, 0xFC, 0x5E,\n    0x1C, 0x63, 0x65, 0xE9, 0x70, 0x53, 0xF4, 0x99, 0x71, 0x7A, 0x76, 0x2C, 0x2C, 0x38, 0xBE, 0x5A,\n    0x20, 0xFF, 0xC0, 0x25, 0x16, 0x46, 0xA8, 0x65, 0x9B, 0xE0, 0xB1, 0x10, 0x7D, 0xB2, 0x90, 0xBC,\n    0xE4, 0xB5, 0x22, 0xC7, 0xD6, 0x8A, 0xBB, 0x19, 0x9F, 0xCD, 0x11, 0x62, 0x82, 0xFC, 0x8D, 0x36,\n    0xE2, 0x08, 0xF0, 0xDD, 0x68, 0x60, 0x48, 0x09, 0x1F, 0xF0, 0xC5, 0x54, 0xE9, 0x47, 0x7D, 0x79,\n    0xE6, 0xC4, 0xC1, 0xF1, 0xFF, 0x2D, 0x5C, 0xA3, 0xFD, 0xF2, 0xB1, 0xA7, 0x89, 0xB7, 0xB9, 0x7C,\n    0x44, 0x28, 0xE5, 0x82, 0x36, 0x4D, 0x48, 0x34, 0x01, 0x5B, 0x43, 0x36, 0x2D, 0x05, 0x93, 0xEE,\n    0xF5, 0x92, 0x73, 0xDF, 0xA6, 0xBA, 0x3D, 0x5B, 0x96, 0x49, 0x73, 0xDF, 0x70, 0x9B, 0x7A, 0x70,\n    0x5C, 0x30, 0x14, 0xB8, 0xB7, 0x46, 0xE0, 0xD7, 0xFF, 0x5C, 0x8E, 0x27, 0x39, 0x0E, 0xEE, 0x99,\n    0x2F, 0x08, 0x1E, 0x95, 0xD4, 0x70, 0xB0, 0xC4, 0x28, 0x83, 0x78, 0x92, 0x93, 0x46, 0xB9, 0xF9,\n    0xFF, 0x8C, 0x16, 0xA9, 0x63, 0x71, 0xAF, 0xBD, 0x84, 0x1A, 0x25, 0xBE, 0xE8, 0xE3, 0xB2, 0x33,\n    0x51, 0xB9, 0xB6, 0x0E, 0x12, 0xB8, 0xA7, 0x6E, 0x28, 0xBC, 0xA3, 0x66, 0x24, 0x49, 0x4D, 0x45,\n    0xA4, 0x5C, 0xCD, 0x4D, 0x2E, 0x17, 0xFB, 0xC0, 0xB5, 0xA7, 0x55, 0x34, 0x08, 0xD7, 0xC7, 0x54,\n    0x0A, 0xFE, 0xE6, 0x98, 0x85, 0x6D, 0xAF, 0x42, 0x79, 0xED, 0x0A, 0xFA, 0xCF, 0xD3, 0xE2, 0x7C,\n    0xB8, 0x24, 0xA5, 0xE1, 0x01, 0xA5, 0x94, 0x55, 0x61, 0xA0, 0x49, 0x1B, 0x7C, 0x71, 0xA8, 0x96,\n    0x5A, 0x4C, 0xF5, 0xC5, 0x1E, 0x8D, 0xD9, 0x2E, 0xBE, 0xC4, 0x13, 0x27, 0xD0, 0xC0, 0x67, 0xA7,\n    0x77, 0x86, 0x61, 0xAE, 0x7E, 0x69, 0x53, 0xB4, 0x70, 0xC6, 0x1E, 0x62, 0x1A, 0x8B, 0xB3, 0x0A,\n    0xC5, 0xDF, 0xF4, 0xFA, 0xEB, 0xC5, 0x50, 0x7E, 0xDE, 0xD5, 0x15, 0xB1, 0x2E, 0x09, 0x75, 0xD7,\n    0x9E, 0xB1, 0x58, 0x76, 0x2F, 0xFE, 0x86, 0x0A, 0xC2, 0x10, 0x1D, 0x84, 0xDF, 0x94, 0x11, 0xD0,\n    0x86, 0x06, 0xFA, 0x9E, 0x00, 0xF0, 0x27, 0x51, 0x00, 0x43, 0xAF, 0xEA, 0x13, 0x4E, 0xC8, 0x48,\n    0x5A, 0x57, 0xDB, 0x5C, 0x20, 0xDC, 0xF3, 0x7D, 0x2B, 0x77, 0x35, 0x20, 0xBD, 0x17, 0x0C, 0x3A,\n    0x2C, 0x3B, 0x58, 0x7D, 0x9D, 0x40, 0xA0, 0xDF, 0xD5, 0xBA, 0x84, 0xA2, 0x9E, 0x4C, 0x87, 0xA5,\n    0xF9, 0xED, 0xEA, 0xEB, 0x98, 0x0D, 0x81, 0xD9, 0xCB, 0xE3, 0xD5, 0xA0, 0xF7, 0xFF, 0x2A, 0x28,\n    0xE9, 0x6F, 0x08, 0xE4, 0xBA, 0x76, 0x16, 0x0A, 0xF5, 0x3C, 0x01, 0x11, 0xB3, 0xBA, 0x4C, 0x7E,\n    0xC3, 0x1F, 0x0B, 0x91, 0x62, 0x82, 0xDD, 0x29, 0x7C, 0x60, 0x5F, 0x56, 0xE5, 0x48, 0x7D, 0xB8,\n    0x4A, 0xC7, 0x1F, 0x7D, 0xD5, 0xB7, 0x17, 0x9F, 0x91, 0xDD, 0xE3, 0xE0, 0x04, 0x14, 0xF3, 0x4C,\n    0xD2, 0xB3, 0xC3, 0xAC, 0x7F, 0x63, 0x67, 0xFA, 0x1B, 0x14, 0x0E, 0x2A, 0x8C, 0x82, 0xD8, 0x49,\n    0x8B, 0x24, 0x4B, 0xF3, 0x21, 0x86, 0x06, 0x91, 0xC9, 0x81, 0xF9, 0x84, 0xC6, 0x2B, 0x12, 0xCF,\n    0x95, 0x32, 0x7A, 0xFD, 0x9C, 0x1C, 0xFC, 0x3B, 0x3B, 0x06, 0xBA, 0x2C, 0x45, 0x88, 0xDA, 0x5B,\n    0x5D, 0x90, 0xDC, 0x07, 0xBD, 0xEC, 0xAF, 0xB2, 0x06, 0x98, 0x05, 0xAC, 0x1D, 0x41, 0xA1, 0xD5,\n    0x76, 0x9D, 0x7B, 0x59, 0x82, 0x9C, 0x46, 0x02, 0xF4, 0x03, 0xB4, 0xFB, 0x70, 0x48, 0x73, 0xB2,\n    0x4C, 0x8B, 0xA6, 0xDB, 0x11, 0xC5, 0x7E, 0xFE, 0x23, 0x4E, 0xC2, 0x2B, 0x0F, 0x95, 0x51, 0x2A,\n    0x3B, 0x46, 0x1C, 0xB7, 0xBF, 0x51, 0xF0, 0xA4, 0xF8, 0xAD, 0x16, 0x96, 0xAA, 0x6D, 0xBE, 0xFE,\n    0x45, 0x46, 0xEF, 0x8B, 0x96, 0xED, 0xE1, 0xE5, 0xB5, 0xEF, 0x22, 0x8C, 0xBA, 0x3A, 0xB0, 0x2F,\n    0x9A, 0x34, 0x16, 0x52, 0x56, 0x5A, 0x36, 0x8B, 0x50, 0x89, 0xBD, 0xC0, 0xFE, 0xAE, 0x2B, 0xBB,\n    0x53, 0xAE, 0x76, 0x8D, 0xB6, 0x91, 0x9D, 0x32, 0x18, 0xF5, 0xD7, 0x1A, 0xE5, 0x04, 0x05, 0xFD,\n    0xDC, 0x5B, 0x67, 0xBE, 0x34, 0x05, 0x03, 0x90, 0xD5, 0xBF, 0xAA, 0x35, 0x8D, 0xB7, 0x63, 0x76,\n    0xC9, 0x98, 0x2B, 0x99, 0xD6, 0x5A, 0xB4, 0x39, 0x4A, 0xAA, 0xDF, 0xEC, 0x82, 0x83, 0xC6, 0x80,\n    0xA1, 0x86, 0x74, 0xC8, 0x8E, 0x37, 0xAB, 0x7A, 0xC2, 0x35, 0x99, 0x62, 0xAD, 0x30, 0xD2, 0x4E,\n    0x30, 0xA4, 0x3F, 0xC6, 0x16, 0x9C, 0xBF, 0xD5, 0x5C, 0x08, 0xF8, 0xF4, 0x35, 0x20, 0x86, 0xF4,\n    0x0C, 0x12, 0x56, 0xD4, 0xDB, 0x73, 0xDB, 0x82, 0x30, 0x73, 0xD2, 0x60, 0xCF, 0xF7, 0xA8, 0xF6,\n    0xC8, 0x71, 0xB2, 0x6E, 0xC3, 0x65, 0x05, 0x07, 0x6C, 0x9C, 0x3F, 0xD7, 0xC9, 0x6E, 0x09, 0xFF,\n    0x9E, 0xF0, 0x68, 0xB6, 0xE0, 0xDB, 0x6A, 0x1F, 0xE9, 0xBC, 0x8C, 0xC1, 0xEB, 0xC5, 0x2A, 0x8B,\n    0x99, 0x23, 0xFC, 0x35, 0xAF, 0xC1, 0x4A, 0xD8, 0x62, 0x28, 0x95, 0x4C, 0xD5, 0x93, 0x21, 0xBC,\n    0x19, 0x52, 0xA0, 0x71, 0x3C, 0x2B, 0x3F, 0x88, 0x68, 0xA0, 0xE0, 0x16, 0x10, 0x85, 0xCA, 0xDB,\n    0x45, 0x96, 0xBD, 0x44, 0xB3, 0x24, 0xE2, 0xCB, 0xE6, 0xE7, 0xC9, 0xDD, 0x7A, 0x78, 0x9B, 0x7C,\n    0x1E, 0x28, 0x2B, 0xC2, 0x2B, 0x53, 0x12, 0xB2, 0xD7, 0xB8, 0x59, 0x41, 0x19, 0x3D, 0xF9, 0x6F,\n    0x34, 0xDB, 0x76, 0x43, 0x8C, 0x21, 0x2A, 0xC2, 0xAB, 0x4B, 0x0D, 0xC5, 0x0A, 0x92, 0x41, 0xD2,\n    0xD2, 0xEB, 0x40, 0x7C, 0x14, 0x5D, 0x73, 0x3D, 0x6C, 0x42, 0xAC, 0xF1, 0xC8, 0x37, 0xCD, 0xC3,\n    0xC0, 0xDD, 0xC0, 0x42, 0x35, 0x6A, 0x99, 0xF3, 0x7F, 0x63, 0xE1, 0x17, 0xB5, 0x8F, 0xC3, 0x2C,\n    0xF5, 0x67, 0x4A, 0x96, 0x25, 0xDD, 0xC9, 0x06, 0x3A, 0x86, 0x3C, 0x2B, 0x23, 0x04, 0xB0, 0x53,\n    0x3C, 0x82, 0xDD, 0x7E, 0xAE, 0x1A, 0xF4, 0x76, 0x65, 0x57, 0xF1, 0x7F, 0xBC, 0x5C, 0xFC, 0xB0,\n    0xBB, 0x04, 0x13, 0x9B, 0x81, 0x9C, 0x70, 0x87, 0xFE, 0x6C, 0xC2, 0x9B, 0x88, 0x83, 0x3C, 0x4D,\n    0x43, 0x0B, 0x64, 0xE3, 0x8C, 0x79, 0x25, 0x5D, 0xF7, 0x20, 0xCF, 0xAB, 0x65, 0xC3, 0x9F, 0x17,\n    0xDA, 0x5A, 0x6F, 0x02, 0x81, 0xEC, 0x8A, 0x20, 0x56, 0x09, 0x31, 0xE2, 0x0E, 0x80, 0x68, 0xE5,\n    0xA7, 0xFF, 0x70, 0x92, 0x68, 0x09, 0x70, 0x93, 0x98, 0xD1, 0x73, 0xD4, 0x47, 0xA2, 0xD3, 0x91,\n    0x00, 0xAB, 0xF0, 0x35, 0xD1, 0xBE, 0xB8, 0xC9, 0x9E, 0x82, 0x39, 0x17, 0x2E, 0xB7, 0x8B, 0x0C,\n    0x7B, 0xAF, 0x84, 0x5C, 0xB5, 0x0A, 0xCE, 0x31, 0x30, 0xE7, 0x38, 0x06, 0xAA, 0x10, 0x48, 0x2C,\n    0xA8, 0xE1, 0xBD, 0xBD, 0xEE, 0x3D, 0xDA, 0x11, 0xA0, 0x0C, 0x07, 0xFA, 0xD0, 0x5B, 0xA5, 0x91,\n    0xE5, 0x1D, 0x54, 0x6A, 0xBF, 0x53, 0x56, 0x55, 0x11, 0xC9, 0x5C, 0x89, 0xFE, 0x72, 0x5A, 0xA7,\n    0x15, 0x9C, 0xBB, 0x37, 0x4E, 0x18, 0x89, 0xED, 0xF2, 0x82, 0x83, 0xF1, 0x5B, 0x9D, 0x27, 0x3D,\n    0xCF, 0xF3, 0x0B, 0x0C, 0xCB, 0x53, 0xF3, 0x13, 0xA8, 0xA1, 0x5A, 0x0E, 0xB2, 0x21, 0x8B, 0x16,\n    0xD7, 0x5E, 0xAE, 0xD2, 0x7B, 0x3A, 0x2A, 0xCD, 0x23, 0x14, 0x0F, 0xE7, 0x0D, 0x81, 0x82, 0xF2,\n    0x41, 0x8B, 0x77, 0x53, 0x16, 0xAE, 0xC7, 0xDF, 0xF7, 0xD1, 0x91, 0x8B, 0x73, 0xA5, 0x0E, 0x9F,\n    0xC3, 0xBF, 0x2C, 0xC3, 0xE4, 0xB7, 0x60, 0x60, 0xF7, 0xCA, 0x95, 0x6D, 0xFA, 0x4F, 0x66, 0xC2,\n    0x98, 0xA0, 0x72, 0xC9, 0x0C, 0x9E, 0x6B, 0xFD, 0x5D, 0x14, 0x8B, 0x9E, 0x7F, 0xA1, 0x20, 0x48,\n    0x99, 0x09, 0xDC, 0xAA, 0xAB, 0xB4, 0x46, 0x10, 0xAB, 0x1B, 0x77, 0x98, 0x2F, 0x7D, 0xE0, 0xD4,\n    0x18, 0x64, 0x4A, 0x5C, 0xBA, 0x23, 0x3C, 0x7E, 0x2F, 0x96, 0x13, 0xC6, 0x4D, 0x38, 0xED, 0xCE,\n    0x4D, 0xB3, 0x02, 0x23, 0xAE, 0x9E, 0xD8, 0x8A, 0xC0, 0x17, 0x39, 0x91, 0x75, 0x33, 0x6A, 0xA9,\n    0x75, 0x12, 0xE3, 0x65, 0x19, 0x30, 0x98, 0x00, 0x4D, 0x82, 0xDB, 0xA3, 0xA2, 0xE7, 0x11, 0x51,\n    0x7A, 0xA1, 0xFE, 0xD2, 0x4E, 0xEA, 0xBB, 0xCD, 0xA1, 0x29, 0xB0, 0xB3, 0x63, 0x23, 0x54, 0x11,\n    0x0B, 0xF3, 0xBD, 0x82, 0xA4, 0x60, 0xC2, 0xFE, 0xE9, 0x5C, 0xD7, 0xB5, 0xDA, 0x7D, 0x6C, 0x3D,\n    0x57, 0xD1, 0xF9, 0x90, 0x03, 0x0B, 0xE8, 0xC1, 0x20, 0xEE, 0x46, 0x68, 0x18, 0x95, 0x66, 0x3C,\n    0x01, 0x2A, 0xE8, 0x84, 0xC1, 0x26, 0x3B, 0x15, 0xBB, 0x20, 0x5E, 0x3B, 0x57, 0x0E, 0x59, 0xEA,\n    0x1C, 0xD3, 0x6C, 0xC7, 0x35, 0xE7, 0x23, 0xFE, 0x40, 0x37, 0x84, 0x2D, 0x70, 0x0F, 0xE9, 0x2F,\n    0xB2, 0x22, 0xEA, 0xB9, 0xB6, 0x93, 0xDC, 0x67, 0xE1, 0xFB, 0x0E, 0x34, 0x91, 0x35, 0x76, 0x52,\n    0x03, 0x27, 0x79, 0x42, 0x55, 0x1D, 0x5B, 0x8D, 0xAA, 0x17, 0x5C, 0x64, 0x3D, 0x8D, 0xA1, 0x04,\n    0xBE, 0x3E, 0x6D, 0x92, 0x6E, 0xE6, 0x2C, 0x0B, 0x6E, 0x9B, 0x8A, 0x5D, 0x18, 0x05, 0xB8, 0xE4,\n    0x18, 0x6E, 0x9E, 0x90, 0x74, 0xD3, 0x1D, 0x33, 0x4D, 0x72, 0xF5, 0x99, 0xE3, 0x2B, 0x2A, 0x0C,\n    0x11, 0x5C, 0x94, 0xB7, 0x66, 0xCC, 0xAC, 0xF1, 0x0D, 0x8D, 0x20, 0xC5, 0x75, 0x20, 0x4C, 0x0A,\n    0xB8, 0xBA, 0xCD, 0x0F, 0xD9, 0xF1, 0x59, 0x6E, 0xC8, 0x63, 0x5C, 0x9E, 0xE5, 0xBB, 0x85, 0x93,\n    0xFE, 0x1F, 0xD9, 0x8C, 0x89, 0xB4, 0x7E, 0xD8, 0xB5, 0xC6, 0x62, 0x03, 0xD1, 0xAB, 0x5F, 0xD2,\n    0xB4, 0x47, 0xC0, 0xC5, 0xC9, 0x75, 0x14, 0x91, 0x37, 0xFE, 0x3B, 0x78, 0x1F, 0x56, 0x87, 0x13,\n    0xF4, 0xCC, 0x3A, 0xBD, 0x2C, 0xC1, 0x61, 0xF5, 0xAB, 0x3A, 0xE8, 0x9C, 0x97, 0xCA, 0xAA, 0xA3,\n    0x12, 0xC4, 0x70, 0x8F, 0x32, 0xDD, 0xEA, 0xE8, 0xF8, 0x8A, 0x03, 0x65, 0x89, 0x99, 0x53, 0x45,\n    0x28, 0xF3, 0xA8, 0xF3, 0x14, 0x80, 0xB4, 0xD6, 0x44, 0xD4, 0x02, 0xEE, 0x9C, 0x58, 0x46, 0xC1,\n    0x4F, 0xEE, 0xFA, 0xCD, 0x63, 0x4D, 0x87, 0xE6, 0x22, 0x9F, 0xF9, 0xDA, 0x77, 0xD0, 0x51, 0xAA,\n    0x1F, 0x2A, 0x2F, 0x48, 0x66, 0x55, 0xE0, 0x2A, 0x5F, 0xEC, 0x12, 0xA6, 0x14, 0xAD, 0x7D, 0xDD,\n    0xC2, 0x7B, 0x3E, 0xE9, 0x8F, 0x2C, 0xB8, 0x60, 0x7E, 0x03, 0x76, 0x28, 0x7C, 0x22, 0x18, 0x6B,\n    0x53, 0x39, 0x21, 0x6A, 0xB2, 0x05, 0x75, 0x58, 0xB7, 0xB1, 0x49, 0x1B, 0x11, 0x1D, 0xD6, 0xFA,\n    0xC8, 0x01, 0x77, 0x12, 0x16, 0x17, 0xB8, 0x71, 0xC2, 0x6F, 0x12, 0xE0, 0xFA, 0xBF, 0x7A, 0xB3,\n    0xE3, 0xDB, 0xB6, 0x19, 0x78, 0xAF, 0x25, 0x18, 0x4F, 0x7A, 0x21, 0x63, 0xF6, 0x68, 0x33, 0xCC,\n    0xD9, 0x12, 0x4A, 0x36, 0x73, 0x3D, 0x7C, 0xA4, 0x6E, 0x5E, 0xFD, 0x5E, 0x0D, 0x45, 0xDF, 0x68,\n    0x66, 0xC6, 0x3F, 0x42, 0xEF, 0xD5, 0x0A, 0x7D, 0x41, 0x3E, 0x1B, 0x4E, 0x3F, 0x93, 0x4F, 0xAA,\n    0x0B, 0xB4, 0x34, 0x67, 0xEC, 0xEF, 0x23, 0x6B, 0x87, 0x8A, 0xF9, 0x66, 0x48, 0x19, 0xF5, 0x92,\n    0x57, 0xA8, 0x60, 0x53, 0xC3, 0x37, 0xF3, 0x61, 0x82, 0x42, 0xC3, 0x09, 0x95, 0xBE, 0xE9, 0x1F,\n    0xBA, 0x1F, 0x01, 0xB6, 0x37, 0xC7, 0xD9, 0x65, 0xAF, 0x2D, 0xB4, 0x42, 0x22, 0xC0, 0x54, 0x1A,\n    0x3B, 0x13, 0x07, 0x30, 0x94, 0x15, 0x01, 0x17, 0x21, 0x36, 0x3A, 0x4F, 0xC3, 0x76, 0xC4, 0xA9,\n    0x64, 0x0D, 0xE0, 0x4F, 0x93, 0xCD, 0x5D, 0x7D, 0xD4, 0xB6, 0xDE, 0xAC, 0x9C, 0xB6, 0x79, 0x3B,\n    0xCE, 0x49, 0x35, 0x21, 0xE2, 0x20, 0xC2, 0x36, 0x9E, 0xCF, 0x51, 0x4D, 0x1D, 0x41, 0x32, 0x05,\n    0xB0, 0x45, 0x85, 0xEF, 0x68, 0x94, 0xE2, 0x56, 0x61, 0x7A, 0x08, 0xE7, 0x46, 0x3E, 0xBA, 0xEC,\n    0x9E, 0x82, 0x17, 0x1B, 0xE4, 0xE1, 0x32, 0xCD, 0x9C, 0xF8, 0xC1, 0xE5, 0x1C, 0x9E, 0x84, 0xBB,\n    0x20, 0x71, 0xF5, 0x6F, 0x0B, 0x55, 0x6F, 0x4C, 0x96, 0x28, 0x08, 0x6E, 0x5D, 0xF2, 0xFE, 0xF9,\n    0xE2, 0xBB, 0xEF, 0x58, 0xFC, 0x34, 0xEF, 0xD6, 0xF5, 0xB2, 0x77, 0x5F, 0x62, 0x4F, 0x8F, 0x32,\n    0xD7, 0xAD, 0x14, 0x07, 0xFC, 0xAB, 0x53, 0x06, 0xC9, 0x65, 0x8A, 0x0F, 0xDA, 0xDF, 0x4F, 0xA4,\n    0x88, 0x45, 0xFC, 0x17, 0x74, 0x1C, 0xE0, 0x9F, 0xBC, 0x91, 0xF3, 0x7A, 0x9D, 0xE8, 0x92, 0xD6,\n    0x3C, 0x8E, 0x71, 0x65, 0x34, 0x64, 0x4B, 0xAE, 0x41, 0x04, 0x37, 0x3E, 0xE3, 0x79, 0xA1, 0xD4,\n    0x4F, 0x89, 0xE8, 0x3C, 0x1C, 0x36, 0x41, 0x66, 0x14, 0xA4, 0xCF, 0xC5, 0x38, 0x59, 0xE6, 0x8C,\n    0x75, 0xE7, 0x6F, 0x3B, 0x20, 0x11, 0x41, 0x55, 0x28, 0x67, 0x12, 0xD5, 0x67, 0x81, 0xC5, 0x76,\n    0x02, 0xC3, 0xC7, 0x03, 0x1C, 0xC0, 0x2E, 0xDC, 0x7E, 0xD9, 0xAD, 0x24, 0xE0, 0x7A, 0x07, 0x8D,\n    0xC7, 0xE5, 0x2B, 0x27, 0x13, 0xAC, 0x76, 0x46, 0x93, 0x4B, 0x3B, 0x1C, 0xC7, 0xD2, 0x9E, 0xEF,\n    0x32, 0xEA, 0x3A, 0x43, 0xDC, 0x79, 0xD6, 0xE8, 0x52, 0x89, 0xAB, 0xEE, 0x9F, 0x22, 0xAA, 0x02,\n    0xD7, 0x08, 0xE2, 0x50, 0x94, 0x16, 0x09, 0x49, 0x5C, 0x70, 0x61, 0x97, 0xEA, 0x99, 0x42, 0xAC,\n    0xFB, 0x97, 0xFA, 0x35, 0xA1, 0x80, 0xFD, 0x06, 0x44, 0xA3, 0x6F, 0xFC, 0x39, 0x7A, 0xA2, 0x37,\n    0x87, 0x3B, 0x72, 0xC2, 0x7A, 0x2A, 0xBA, 0x54, 0x6B, 0xF9, 0xFA, 0x75, 0x46, 0xE6, 0x1B, 0x3C,\n    0xE7, 0x21, 0xA0, 0xDE, 0xC1, 0x26, 0xC7, 0x3F, 0x8C, 0xA1, 0x8A, 0xC5, 0xBD, 0x7D, 0xC6, 0x70,\n    0xF7, 0xB6, 0x6B, 0x84, 0xCB, 0x20, 0x4B, 0x34, 0x4D, 0x50, 0xA5, 0xD8, 0xF3, 0x50, 0xF2, 0xE7,\n    0xE0, 0xE0, 0x32, 0x07, 0x5F, 0xF6, 0x86, 0x06, 0x9D, 0x31, 0x7A, 0xB0, 0x63, 0xB7, 0xB3, 0x04,\n    0x5B, 0x31, 0xA6, 0x9B, 0x29, 0x27, 0x96, 0xB1, 0x5A, 0x41, 0x09, 0xE3, 0x13, 0x39, 0x8E, 0x0C,\n    0x94, 0xFF, 0xD2, 0x2D, 0x8F, 0x91, 0x73, 0x43, 0xC7, 0xFA, 0x65, 0x56, 0x70, 0x94, 0x0B, 0x5F,\n    0xA3, 0xD1, 0xCB, 0x4C, 0x95, 0x5F, 0x64, 0x8D, 0xD2, 0x7C, 0x68, 0xBA, 0x31, 0x0D, 0x1C, 0x55,\n    0xB6, 0x2F, 0x96, 0xB7, 0xB1, 0x79, 0xDE, 0x50, 0xB5, 0x8D, 0x4C, 0xC4, 0xD5, 0x3A, 0xE2, 0x13,\n    0x80, 0x37, 0x68, 0x51, 0xDA, 0x33, 0x70, 0x95, 0x49, 0x57, 0xB5, 0x3F, 0x3F, 0x2F, 0xDA, 0xC5,\n    0xE3, 0x63, 0x95, 0x63, 0x29, 0x96, 0x4A, 0xED, 0xB5, 0x2F, 0x7D, 0xC2, 0xCC, 0x4C, 0x87, 0xDE,\n    0x49, 0xE2, 0xCA, 0x46, 0x60, 0x38, 0x31, 0xB4, 0x65, 0x86, 0x3F, 0x91, 0x61, 0x8C, 0x11, 0x0F,\n    0xAF, 0x6F, 0xED, 0xED, 0x4B, 0x9F, 0x32, 0xAB, 0x7A, 0xBB, 0x83, 0xCD, 0xE9, 0x36, 0x58, 0x7E,\n    0x3D, 0xCD, 0xD1, 0x00, 0x41, 0x80, 0x41, 0x14, 0xD3, 0xF1, 0xEA, 0x24, 0xF2, 0xD7, 0x79, 0x71,\n    0x71, 0x0B, 0x24, 0x5E, 0x2B, 0xA8, 0x15, 0xCA, 0x20, 0x35, 0xF5, 0x8B, 0xED, 0xC6, 0xD7, 0x7B,\n    0xAB, 0xF5, 0x74, 0x7E, 0x55, 0xEE, 0xCC, 0x92, 0xF0, 0xBB, 0x0D, 0xE4, 0xF7, 0xD9, 0xD4, 0x74,\n    0x89, 0x87, 0xF2, 0xE2, 0xAA, 0x73, 0xDF, 0xCD, 0x5C, 0xE1, 0x0D, 0xF1, 0xDA, 0xA9, 0x62, 0x33,\n    0x20, 0x61, 0x5B, 0xC4, 0x17, 0x8A, 0xDA, 0xA3, 0xD1, 0xA7, 0xB1, 0x27, 0xA1, 0xD7, 0x41, 0x02,\n    0x06, 0x4A, 0x18, 0xC7, 0xDE, 0x2B, 0xD2, 0xF9, 0xD2, 0x16, 0x43, 0x4B, 0x02, 0x0E, 0xD6, 0x2F,\n    0x16, 0x28, 0xCA, 0x9C, 0x19, 0xAE, 0x27, 0x61, 0xC8, 0x09, 0xD6, 0xAE, 0x89, 0x90, 0x52, 0x04,\n    0xC2, 0x17, 0x7D, 0x3D, 0x41, 0x18, 0x20, 0x70, 0xB4, 0xBA, 0x83, 0x51, 0xE1, 0xF0, 0x23, 0x7E,\n    0x9B, 0x4B, 0x56, 0xC7, 0x9F, 0x3D, 0x0D, 0xE6, 0x92, 0xED, 0xC0, 0xAD, 0x46, 0xC3, 0x35, 0x94,\n    0xFB, 0xDB, 0x3C, 0xB3, 0x95, 0x9C, 0xFD, 0xA2, 0x9E, 0x23, 0x49, 0xA6, 0xDC, 0xA0, 0x63, 0xC3,\n    0x5D, 0x37, 0xF1, 0x9C, 0x57, 0xE7, 0x58, 0xD5, 0x28, 0xC4, 0x73, 0x2B, 0xE3, 0xBF, 0x14, 0xD3,\n    0x83, 0xEC, 0x49, 0x03, 0x42, 0xD1, 0x3F, 0xE6, 0x22, 0xEE, 0xC5, 0x23, 0x50, 0x64, 0x5F, 0xA6,\n    0x9F, 0x92, 0x5A, 0x69, 0xC5, 0x7D, 0x76, 0x81, 0xB9, 0x0F, 0x43, 0x24, 0x94, 0x20, 0xF1, 0x51,\n    0xF7, 0x30, 0xF7, 0x6A, 0x3A, 0x73, 0xEF, 0x5B, 0x39, 0xD8, 0x75, 0x0F, 0x78, 0xFB, 0x7A, 0xFD,\n    0xEB, 0x80, 0xE8, 0xF0, 0x98, 0x4C, 0xE2, 0xDE, 0xA9, 0x5F, 0x75, 0x36, 0x62, 0x3F, 0x7B, 0x66,\n    0xF1, 0xA8, 0xA7, 0x55, 0xD4, 0x6C, 0x03, 0xE8, 0xFF, 0xD6, 0xBB, 0x50, 0x0E, 0x38, 0xFB, 0xD5,\n    0xD9, 0xB2, 0x4B, 0xFD, 0xC5, 0x05, 0x08, 0x88, 0xBC, 0x90, 0x47, 0x15, 0xE1, 0x92, 0x04, 0x18,\n    0x06, 0x4B, 0x13, 0x12, 0x12, 0xCE, 0xF6, 0xA4, 0x9A, 0xBC, 0x1B, 0x60, 0x9E, 0x49, 0xBA, 0xC5,\n    0x56, 0x9D, 0x47, 0x21, 0x5F, 0xE5, 0x19, 0xFC, 0x71, 0xCB, 0x8D, 0x6F, 0x9E, 0x91, 0x18, 0x6F,\n    0x6E, 0xF8, 0x07, 0xE9, 0x6C, 0xB3, 0x6B, 0x94, 0x2C, 0xCF, 0xAC, 0x5F, 0x1C, 0x1A, 0xA1, 0xD7,\n    0x8F, 0x9A, 0x1B, 0x49, 0x28, 0x22, 0xEA, 0x52, 0xDE, 0x0D, 0xB5, 0xF9, 0x0E, 0x08, 0xA4, 0x78,\n    0x3B, 0x7F, 0x31, 0x1C, 0x75, 0x91, 0x0A, 0xC4, 0x35, 0x68, 0x0D, 0xDF, 0x00, 0xEB, 0x31, 0x0C,\n    0x84, 0x62, 0xEC, 0xAF, 0x82, 0xAD, 0x52, 0xA2, 0xE2, 0x1F, 0xFE, 0xAC, 0xBE, 0x4D, 0xFB, 0xCE,\n    0x0C, 0x82, 0xE5, 0x4A, 0x4D, 0xD8, 0x98, 0x57, 0xFD, 0xE6, 0x83, 0x21, 0x95, 0x25, 0xF3, 0xAD,\n    0x2E, 0xAD, 0x69, 0xB9, 0x4E, 0x1E, 0x4A, 0x29, 0xF0, 0x75, 0xB2, 0xE2, 0x05, 0x7A, 0x4E, 0xF2,\n    0x7D, 0x1A, 0xFB, 0x03, 0xB4, 0xEE, 0xA2, 0x69, 0x44, 0x42, 0x5C, 0x96, 0xFB, 0xE9, 0xC7, 0x42,\n    0x74, 0x7A, 0x2F, 0xDE, 0xCC, 0xA4, 0x5C, 0x29, 0xA9, 0x8C, 0xB6, 0x18, 0xBD, 0x0F, 0xB5, 0xB4,\n    0x79, 0x63, 0x87, 0xAA, 0x60, 0xCA, 0xE9, 0x7C, 0x6A, 0xA9, 0x94, 0x0F, 0x7A, 0x5B, 0xEB, 0x4D,\n    0x14, 0x27, 0xC5, 0x27, 0xDB, 0x98, 0x7A, 0xB4, 0x6A, 0x79, 0xCB, 0x27, 0xEB, 0x6E, 0x51, 0x9E,\n    0x6C, 0x55, 0xFC, 0x40, 0xAF, 0xBF, 0x2F, 0x66, 0xED, 0xE1, 0xB0, 0x46, 0x29, 0xCE, 0x04, 0x92,\n    0xF1, 0xF2, 0x9C, 0xA4, 0x9D, 0x0C, 0xFC, 0x85, 0x57, 0xC4, 0x1D, 0x85, 0x28, 0x8A, 0xFD, 0xA7,\n    0xF1, 0x3E, 0x24, 0x10, 0x90, 0xBE, 0x97, 0xCE, 0x15, 0x78, 0x7C, 0x46, 0x13, 0xB2, 0x5E, 0x42,\n    0x4D, 0x67, 0x5D, 0x1F, 0x71, 0x7A, 0xB0, 0xAD, 0xB8, 0xAA, 0x8E, 0xA2, 0x8E, 0x1E, 0x3F, 0xD1,\n    0x7C, 0xE4, 0x66, 0xCA, 0x06, 0xD7, 0xC8, 0xDC, 0x9B, 0xC5, 0x87, 0x11, 0x99, 0x8D, 0xEF, 0xE9,\n    0xDA, 0xB3, 0x2F, 0x20, 0x8D, 0x9F, 0xB0, 0x4B, 0xF8, 0xDE, 0x68, 0xC5, 0x88, 0xC2, 0x5D, 0x84,\n    0xB9, 0xB5, 0x90, 0x7A, 0x41, 0x0C, 0x31, 0x33, 0x55, 0x9D, 0xD6, 0xBE, 0x86, 0x15, 0xA9, 0xE3,\n    0xFD, 0xB0, 0xB9, 0x79, 0xF8, 0x5C, 0xF4, 0x4B, 0x49, 0x74, 0x27, 0x81, 0xC1, 0xEC, 0xB4, 0x2B,\n    0x91, 0x7E, 0xF3, 0xC2, 0x9D, 0x62, 0x35, 0x49, 0xF4, 0xE3, 0x8E, 0x4D, 0xEE, 0x44, 0xB7, 0xE2,\n    0x20, 0xB1, 0x38, 0xC5, 0x30, 0xFD, 0x01, 0x6C, 0xCC, 0x6E, 0x76, 0xF9, 0x6C, 0x27, 0xD1, 0x0F,\n    0x67, 0x04, 0xCF, 0xF1, 0x00, 0xB5, 0x6A, 0xD4, 0xCD, 0x58, 0x76, 0xAF, 0x1C, 0xFF, 0x74, 0xD7,\n    0xA7, 0x77, 0x45, 0xCD, 0x33, 0x4E, 0x45, 0xBD, 0xCC, 0x38, 0x5C, 0x6C, 0xF7, 0x7C, 0xF7, 0x2B,\n    0xCF, 0x45, 0x2C, 0xC4, 0x73, 0xB1, 0x2D, 0x2B, 0xE6, 0x06, 0x0F, 0x4B, 0xAB, 0x48, 0x1E, 0xF2,\n    0x58, 0x0C, 0x8B, 0x47, 0x4D, 0x81, 0x32, 0x23, 0x7F, 0x7D, 0x2F, 0xF4, 0x80, 0x43, 0x3E, 0x8A,\n    0xDC, 0x5D, 0x1F, 0x27, 0xE6, 0xA2, 0xDC, 0xC8, 0xB6, 0xF7, 0x63, 0x0E, 0x6D, 0xEB, 0xE8, 0x16,\n    0x52, 0x69, 0x97, 0xF2, 0x61, 0x7B, 0x2C, 0x8A, 0x15, 0xD8, 0xE1, 0xE9, 0x28, 0xFF, 0x54, 0x92,\n    0xF3, 0xCB, 0x72, 0x72, 0xB5, 0x23, 0x48, 0xE9, 0x52, 0xA3, 0xC7, 0x3B, 0x1D, 0x05, 0x90, 0x26,\n    0x10, 0xA4, 0x42, 0x9B, 0xA5, 0xAF, 0x7F, 0x99, 0x3B, 0x5A, 0x70, 0xA4, 0x6C, 0xF8, 0xB5, 0xC3,\n    0x42, 0x46, 0x47, 0xEA, 0x62, 0xA0, 0x8F, 0x34, 0x5F, 0x5F, 0x0A, 0x88, 0xB9, 0x19, 0x47, 0xFD,\n    0x94, 0x04, 0x05, 0x7C, 0x8B, 0x65, 0xC4, 0x1D, 0xD2, 0xFC, 0xDD, 0x0E, 0x3A, 0x92, 0x8B, 0xE0,\n    0xCE, 0xBD, 0xF9, 0x1B, 0xFB, 0x91, 0xD3, 0x90, 0x80, 0x08, 0x6B, 0x94, 0x20, 0xCC, 0xC8, 0xC9,\n    0xF9, 0x60, 0x28, 0x7D, 0x6F, 0xDA, 0x5E, 0x64, 0xE0, 0x1C, 0x5F, 0xE9, 0xB8, 0xC3, 0x33, 0x18,\n    0xA5, 0x60, 0xE4, 0xE1, 0x45, 0x1B, 0xEE, 0x20, 0xFF, 0x40, 0x52, 0xFB, 0x3F, 0xD2, 0x03, 0x0A,\n    0x71, 0xD2, 0xCE, 0xC5, 0x84, 0x98, 0x21, 0xE1, 0xF8, 0x13, 0xD6, 0x78, 0x21, 0x75, 0x3C, 0x22,\n    0x1A, 0xCC, 0x67, 0x12, 0x9B, 0x31, 0x06, 0xB7, 0x5E, 0xE6, 0x4B, 0xC2, 0x7E, 0x12, 0xCA, 0x6D,\n    0xD6, 0x95, 0x67, 0xDC, 0xF1, 0x7C, 0xC8, 0xAD, 0x95, 0x53, 0x25, 0x7B, 0x16, 0xD3, 0x0B, 0xE4,\n    0xF4, 0x17, 0x86, 0xC6, 0xA1, 0x2B, 0x28, 0xA9, 0x02, 0x1D, 0x48, 0x14, 0x42, 0x0A, 0x76, 0x95,\n    0x3D, 0xC4, 0x2D, 0x77, 0x5A, 0x67, 0x6F, 0xDB, 0x81, 0xA4, 0xA4, 0x74, 0x19, 0xA0, 0xFC, 0x2F,\n    0x9D, 0x26, 0x4D, 0x44, 0x44, 0xDD, 0xAE, 0xCB, 0x85, 0xBC, 0x21, 0xBB, 0xFC, 0xDF, 0xDB, 0x54,\n    0xAA, 0x21, 0x95, 0x0C, 0xFF, 0x2C, 0x17, 0x37, 0x5A, 0xFC, 0x4A, 0x39, 0x34, 0xED, 0xE4, 0x71,\n    0x84, 0x5C, 0x28, 0xEB, 0x0A, 0x25, 0x16, 0xA4, 0xA1, 0x8B, 0x63, 0xB0, 0xFB, 0x26, 0xF3, 0xD1,\n    0x37, 0x0E, 0x52, 0xF9, 0x77, 0x3D, 0xAA, 0x66, 0xC7, 0xB9, 0xED, 0x84, 0x88, 0xFE, 0xEF, 0x33,\n    0x5A, 0x61, 0x87, 0x03, 0x2A, 0x83, 0xDB, 0x4C, 0x73, 0xBE, 0xF9, 0x6A, 0x04, 0x3F, 0xEC, 0x6E,\n    0xCC, 0x5D, 0xA5, 0x8F, 0xA1, 0xCB, 0x53, 0x86, 0x80, 0xC4, 0x21, 0xBA, 0xC2, 0x2D, 0x65, 0xE7,\n    0xE2, 0x35, 0x97, 0x2C, 0xA6, 0xE2, 0x09, 0x76, 0x10, 0xA2, 0xC0, 0x30, 0xDF, 0x9A, 0xDC, 0x38,\n    0x06, 0x3D, 0x05, 0x26, 0x16, 0x4D, 0xA8, 0xA9, 0x1E, 0x07, 0x1D, 0x62, 0x6C, 0xA5, 0xCC, 0xEB,\n    0x05, 0x21, 0x64, 0xD4, 0x3E, 0x4B, 0xB3, 0x96, 0x14, 0x75, 0xFC, 0x5C, 0xCA, 0xDB, 0x1F, 0xDC,\n    0x41, 0x9D, 0x60, 0x05, 0xF8, 0x89, 0xC9, 0x7E, 0x3B, 0x74, 0x75, 0x49, 0x34, 0x3A, 0x74, 0x79,\n    0xDF, 0x16, 0x3D, 0x6F, 0xA1, 0xF3, 0x26, 0x29, 0x61, 0x5F, 0xBB, 0xEB, 0x62, 0x42, 0x3A, 0x7F,\n    0x2F, 0xC5, 0x19, 0xD6, 0x77, 0x9E, 0x1D, 0xF5, 0x15, 0x71, 0x6F, 0x74, 0x1E, 0xE5, 0xBA, 0x08,\n    0x21, 0x07, 0x64, 0x9F, 0x78, 0x5A, 0x11, 0x20, 0xFB, 0x43, 0x4F, 0x4A, 0xFD, 0x6A, 0x2F, 0xB7,\n    0x66, 0x7A, 0xA5, 0x27, 0xF7, 0x6F, 0x05, 0x85, 0xCC, 0xC2, 0xC5, 0xDE, 0x18, 0x43, 0xB9, 0x9F,\n    0x84, 0xBA, 0x09, 0x1A, 0x0E, 0x7E, 0xBE, 0xBA, 0xE4, 0xD6, 0x1E, 0x9E, 0x83, 0x7D, 0x1D, 0xED,\n    0xDE, 0x4D, 0x96, 0x91, 0x50, 0x2D, 0x54, 0x46, 0x98, 0xC5, 0xE2, 0xE6, 0xE7, 0x6F, 0xB4, 0x06,\n    0xF0, 0x56, 0x4C, 0x2B, 0xB1, 0xEC, 0xC4, 0x98, 0x87, 0x76, 0x00, 0xF8, 0x47, 0x70, 0x4F, 0x13,\n    0x2C, 0xDE, 0x79, 0x9B, 0xB5, 0x90, 0xFA, 0xC3, 0xAA, 0x0D, 0xB6, 0xCC, 0x37, 0xB2, 0x5D, 0xB7,\n    0x8B, 0x19, 0x96, 0x20, 0xFF, 0x0C, 0x21, 0x23, 0x41, 0xA8, 0x15, 0x3F, 0x03, 0x01, 0x57, 0xA2,\n    0x7F, 0xF1, 0xE6, 0x4B, 0x50, 0xC3, 0xD6, 0xF3, 0xEF, 0xE0, 0x7A, 0xEE, 0x76, 0xA0, 0x67, 0x22,\n    0x09, 0x45, 0x91, 0x07, 0x87, 0x1E, 0xC6, 0x2A, 0x13, 0x45, 0x10, 0x0E, 0x72, 0x9E, 0xFB, 0xA0,\n    0x9C, 0xA4, 0xA3, 0xE7, 0x17, 0xC5, 0x90, 0x30, 0x42, 0x87, 0x1B, 0x3A, 0xC0, 0xD9, 0xA7, 0x9A,\n    0xEE, 0xDE, 0x42, 0xFE, 0x96, 0xD3, 0x7A, 0x3E, 0xBE, 0xAF, 0xE9, 0xCD, 0xEF, 0xA6, 0xD9, 0xC6,\n    0x0E, 0x2C, 0xA9, 0xC1, 0x6B, 0x99, 0x11, 0xC2, 0x91, 0x45, 0x0B, 0xC4, 0xD0, 0xC3, 0xD7, 0xF9,\n    0x0B, 0x9A, 0x1E, 0x2E, 0xC7, 0x01, 0x22, 0x6A, 0x75, 0x50, 0x89, 0x79, 0x07, 0x21, 0x8C, 0xF9,\n    0xA6, 0x15, 0x95, 0xC0, 0xE3, 0xFC, 0x20, 0x65, 0x36, 0x2D, 0x5F, 0xAE, 0xFE, 0xCE, 0x97, 0x71,\n    0xF5, 0x3A, 0xBD, 0xCB, 0xA1, 0x9F, 0x46, 0xA6, 0x3A, 0xA7, 0x7A, 0x26, 0xA2, 0xDE, 0x36, 0x19,\n    0x15, 0xDE, 0x17, 0x7E, 0xD7, 0x5E, 0x4A, 0xEE, 0xE2, 0xC9, 0x53, 0x25, 0x77, 0xC3, 0x18, 0xBB,\n    0xB4, 0xAA, 0x43, 0xFD, 0x5C, 0x21, 0x8A, 0x37, 0xDB, 0x1C, 0x3D, 0x36, 0x2E, 0x6D, 0xEA, 0x61,\n    0x72, 0x9E, 0xF1, 0x6F, 0xD1, 0x14, 0xF6, 0x29, 0x4E, 0xFD, 0xFD, 0x3D, 0x4D, 0xB9, 0x25, 0x4B,\n    0x38, 0xA2, 0x00, 0xEB, 0x14, 0xBA, 0xEE, 0xB1, 0x03, 0x84, 0x98, 0xF4, 0xCF, 0x05, 0x9E, 0x1C,\n    0x7A, 0x8F, 0xAE, 0x85, 0x76, 0x57, 0xF4, 0x8E, 0x16, 0x06, 0x35, 0x77, 0xBB, 0x90, 0x41, 0x9E,\n    0xCB, 0x52, 0x97, 0xCA, 0xC1, 0x7F, 0xA9, 0x01, 0x8B, 0x7D, 0xC4, 0xB8, 0xD9, 0xDC, 0x01, 0x3D,\n    0x58, 0xF8, 0x10, 0xD1, 0xDF, 0x1A, 0x6A, 0x27, 0xE2, 0x65, 0x47, 0x1A, 0xC3, 0x8C, 0xDB, 0xE4,\n    0xC5, 0x5C, 0x72, 0x0D, 0xAB, 0x84, 0x71, 0x54, 0xE2, 0x0F, 0xBB, 0xDE, 0xE0, 0x1F, 0xB1, 0x70,\n    0x08, 0x09, 0x6B, 0x43, 0x72, 0x76, 0x71, 0x7C, 0xA5, 0x87, 0x65, 0x11, 0x7F, 0xA3, 0x17, 0x93,\n    0x1C, 0x88, 0x4C, 0x6D, 0x9E, 0x36, 0x17, 0x37, 0x7F, 0x18, 0xDE, 0x6B, 0xC9, 0xEF, 0x04, 0x95,\n    0xE6, 0x0A, 0x20, 0xEF, 0x30, 0x53, 0xED, 0x09, 0x1F, 0x08, 0xA3, 0x42, 0x1B, 0xA5, 0x5F, 0x21,\n    0x9D, 0xFF, 0xE1, 0x13, 0x23, 0xC9, 0x36, 0xB4, 0x43, 0x1F, 0x34, 0x2A, 0x18, 0xC5, 0x26, 0x42,\n    0xCB, 0xFB, 0xF3, 0x67, 0xA8, 0x5E, 0xF6, 0x14, 0x50, 0x68, 0xA6, 0xF9, 0x6D, 0x78, 0xB5, 0xF3,\n    0x8A, 0x14, 0xE3, 0xFE, 0xB5, 0x7C, 0x88, 0x11, 0x56, 0xDA, 0x9A, 0x62, 0x30, 0x46, 0x34, 0xFB,\n    0x9D, 0x99, 0xE0, 0xA6, 0xB2, 0x2F, 0xA6, 0xF3, 0x7F, 0x2D, 0xAC, 0x71, 0x29, 0x0A, 0x3D, 0x86,\n    0xB0, 0x75, 0x97, 0xA4, 0xC3, 0x28, 0x9D, 0x6D, 0x0F, 0xA1, 0x3A, 0xB1, 0xC7, 0xEB, 0xC5, 0x3D,\n    0x38, 0xE5, 0xED, 0xA6, 0xD9, 0xDF, 0x25, 0x38, 0x81, 0xBC, 0xBA, 0x73, 0x80, 0x09, 0xED, 0x98,\n    0x59, 0xB9, 0xD9, 0x71, 0xD1, 0xD8, 0x6B, 0xF7, 0x08, 0xF8, 0x8E, 0x0A, 0xD2, 0x57, 0x66, 0xEA,\n    0x02, 0x5F, 0x8B, 0xF3, 0xAD, 0x62, 0xCA, 0x25, 0x83, 0xD3, 0xA4, 0x0C, 0x3A, 0x68, 0x8E, 0xFC,\n    0x8A, 0xDE, 0xD8, 0x42, 0x47, 0x6C, 0x38, 0x57, 0xE6, 0xD2, 0x6B, 0x42, 0xDD, 0x68, 0x8E, 0xBA,\n    0xCD, 0xC7, 0xFB, 0x1C, 0x72, 0x6E, 0xE8, 0x2C, 0x16, 0xCF, 0xB1, 0xEB, 0x1F, 0x07, 0xF4, 0xEB,\n    0x56, 0x44, 0xD2, 0xA5, 0xC8, 0xCB, 0x97, 0xD5, 0x71, 0xA1, 0xAE, 0x11, 0x38, 0x2F, 0x2E, 0xB8,\n    0x06, 0x80, 0x73, 0xA2, 0x82, 0xC6, 0x0F, 0x24, 0x58, 0xD9, 0xDB, 0x5A, 0x1A, 0xAC, 0xCA, 0xCA,\n    0x6C, 0xB3, 0x74, 0x59, 0x4A, 0xBC, 0x42, 0x80, 0x8D, 0x2A, 0xF7, 0x5E, 0x12, 0x7F, 0x01, 0x01,\n    0x6B, 0xF4, 0x0B, 0xFE, 0x83, 0xD1, 0xC9, 0x9C, 0x11, 0xFE, 0x7C, 0x18, 0xBD, 0xF0, 0xB9, 0x93,\n    0xEA, 0x5E, 0x6F, 0x95, 0xA1, 0x06, 0x90, 0xA2, 0xEA, 0xAD, 0xA5, 0x87, 0x23, 0x78, 0x9A, 0x20,\n    0x50, 0xAF, 0x38, 0x17, 0x6D, 0x14, 0xBB, 0x68, 0x5C, 0xCB, 0x6E, 0xC7, 0xD3, 0x11, 0x81, 0x43,\n    0xD5, 0xE5, 0x87, 0xE4, 0x4E, 0xFB, 0xEE, 0x3E, 0x3A, 0x6D, 0xEC, 0x79, 0xE5, 0x90, 0x68, 0xCB,\n    0xF7, 0x01, 0xFF, 0x26, 0x3B, 0x82, 0xB1, 0x67, 0x04, 0xB7, 0x32, 0x52, 0xA0, 0xFF, 0x60, 0x97,\n    0x8D, 0xA9, 0x8C, 0xDC, 0xF3, 0x37, 0xE1, 0x87, 0x1F, 0x95, 0xAD, 0x16, 0x69, 0x4B, 0xF2, 0x26,\n    0xE4, 0x79, 0x1C, 0x3C, 0xA8, 0x87, 0x4D, 0x9D, 0x0D, 0xB2, 0x01, 0x29, 0x22, 0xB6, 0x20, 0x8B,\n    0x66, 0x8A, 0x1A, 0x09, 0xF4, 0xE1, 0xAF, 0x52, 0xBA, 0x63, 0xA9, 0x35, 0xD1, 0x1D, 0x4B, 0xDD,\n    0xBE, 0x30, 0x11, 0x4E, 0xFE, 0xCD, 0x57, 0x54, 0xFA, 0x39, 0xB4, 0x8C, 0x2B, 0x0D, 0x83, 0x36,\n    0x18, 0x81, 0xE5, 0xBA, 0x18, 0xDF, 0x41, 0x5F, 0x21, 0x25, 0xCE, 0x47, 0x11, 0x56, 0x20, 0x5D,\n    0x72, 0xFA, 0x54, 0x1E, 0xF5, 0x0A, 0x31, 0x92, 0x85, 0x95, 0x26, 0x11, 0x26, 0x24, 0x67, 0x84,\n    0x1A, 0xA2, 0x71, 0xFB, 0xAE, 0x7E, 0xAE, 0x27, 0xB5, 0x64, 0xF0, 0xF3, 0x40, 0x55, 0x7D, 0xDB,\n    0xF3, 0x28, 0x62, 0xDD, 0xF0, 0xFA, 0x41, 0xD7, 0xCA, 0x38, 0x73, 0x25, 0xD9, 0x13, 0x3E, 0xCB,\n    0xC2, 0x49, 0x79, 0x10, 0xE9, 0x43, 0xCD, 0xEA, 0x78, 0x6C, 0x61, 0x36, 0x87, 0xF3, 0x37, 0x80,\n    0x08, 0x3C, 0x5B, 0x41, 0x1A, 0x59, 0x3E, 0xA0, 0x2D, 0x07, 0x03, 0x9B, 0xEE, 0x47, 0xEC, 0xB4,\n    0xB8, 0xB5, 0x5C, 0x5F, 0x70, 0xAB, 0x04, 0x12, 0xF7, 0x5A, 0x89, 0xB7, 0x00, 0x6A, 0x2A, 0x37,\n    0x14, 0x56, 0xA8, 0x03, 0x45, 0x38, 0xBB, 0xC5, 0x70, 0xAB, 0x4B, 0xBE, 0x6D, 0xEA, 0xA6, 0x27,\n    0x1F, 0x19, 0x5A, 0x02, 0x12, 0xE0, 0x9E, 0x83, 0xD9, 0x78, 0x27, 0x34, 0x6B, 0x81, 0x2A, 0x82,\n    0x73, 0x80, 0x06, 0x7E, 0x9C, 0xE2, 0xFB, 0x6E, 0x12, 0xAE, 0xA6, 0x7E, 0x8D, 0xBF, 0xAC, 0x5A,\n    0x6C, 0x49, 0x81, 0xE7, 0x03, 0x8C, 0x3C, 0x05, 0x01, 0x61, 0x96, 0xD8, 0x05, 0x62, 0xFA, 0x36,\n    0xBC, 0x26, 0x8E, 0xB3, 0x2D, 0x49, 0x80, 0x6B, 0x4D, 0xF1, 0x63, 0x42, 0x56, 0x53, 0xA8, 0x8E,\n    0x63, 0xB2, 0xCF, 0x38, 0x31, 0xF0, 0x56, 0x6D, 0x58, 0x6A, 0xEB, 0x59, 0x07, 0x27, 0x08, 0x1D,\n    0x64, 0xE2, 0x5A, 0x69, 0xBE, 0x47, 0xE8, 0xCA, 0xEE, 0x66, 0x3D, 0x95, 0xE3, 0x00, 0x24, 0xAF,\n    0xEA, 0xF6, 0xE8, 0x30, 0xB2, 0x24, 0x85, 0x30, 0x28, 0xFB, 0x46, 0x7A, 0xDC, 0xC1, 0x11, 0xF6,\n    0xBE, 0xBB, 0x12, 0x92, 0x9E, 0x7A, 0x85, 0x24, 0x25, 0xF1, 0xFB, 0xDE, 0xD1, 0x1E, 0x46, 0xCE,\n    0x4D, 0xCC, 0xB4, 0x5D, 0xD2, 0x41, 0x7F, 0x47, 0x92, 0x1A, 0xAE, 0xB3, 0xB5, 0x26, 0x96, 0xB2,\n    0x38, 0x92, 0x33, 0x67, 0x52, 0x3D, 0xA9, 0x3C, 0xA0, 0x46, 0x43, 0xE8, 0xEE, 0x22, 0x82, 0xD7,\n    0xEC, 0xBC, 0x79, 0x9E, 0x0F, 0x47, 0x20, 0x32, 0x48, 0x7E, 0x79, 0x2C, 0x82, 0xD7, 0x57, 0x31,\n    0xD8, 0xE8, 0xEC, 0x4D, 0x44, 0x7E, 0x92, 0xB8, 0xA2, 0xE3, 0xC5, 0x09, 0x6C, 0x13, 0xFF, 0xF0,\n    0x35, 0x12, 0x63, 0x46, 0x46, 0x35, 0x3F, 0xC7, 0x7C, 0xB8, 0xEA, 0xA7, 0x96, 0x9D, 0x19, 0xAC,\n    0x72, 0x44, 0xA5, 0xBC, 0x41, 0xD0, 0x4D, 0xA2, 0xD7, 0x00, 0x19, 0xFF, 0xD7, 0x3F, 0x09, 0xEB,\n    0x58, 0xAC, 0x81, 0x9D, 0xBB, 0x80, 0x74, 0xFA, 0x2E, 0xBC, 0x6D, 0xE6, 0xEB, 0x91, 0x80, 0x5F,\n    0x67, 0x03, 0x14, 0x54, 0x65, 0x0A, 0x7D, 0x6C, 0xC1, 0xC9, 0xC0, 0xF4, 0xE0, 0x7B, 0x6A, 0x45,\n    0xCF, 0x13, 0x3E, 0x37, 0x07, 0x03, 0x42, 0xCA, 0xE0, 0xA2, 0xD1, 0x00, 0x00, 0x10, 0xDE, 0xE5,\n    0x81, 0x9A, 0xD0, 0x14, 0xF7, 0x98, 0xA5, 0xE1, 0xD3, 0x84, 0xAC, 0x70, 0xC6, 0x75, 0xB4, 0x27,\n    0xF5, 0xEB, 0x08, 0x4C, 0x64, 0xC1, 0x74, 0x45, 0xB1, 0x30, 0x48, 0xE4, 0xAA, 0x99, 0xBD, 0xC0,\n    0x27, 0xDE, 0x54, 0xA4, 0xC4, 0xFE, 0xDF, 0x69, 0xF2, 0x46, 0xF8, 0x7E, 0x79, 0x99, 0xFE, 0xD1,\n    0x4A, 0x77, 0x6C, 0xFA, 0x13, 0x2C, 0xD3, 0x9B, 0x45, 0x2F, 0x86, 0x0F, 0xB6, 0xAA, 0x76, 0x42,\n    0xE7, 0x11, 0x3D, 0xE9, 0x52, 0xC1, 0x3B, 0x17, 0x66, 0x60, 0x1C, 0x67, 0xA9, 0xF0, 0x83, 0xFF,\n    0x80, 0x59, 0x4F, 0xAA, 0xC7, 0xE7, 0x95, 0x81, 0xA0, 0xEE, 0x5D, 0x3D, 0x36, 0xA6, 0x0B, 0x81,\n    0xFD, 0xD0, 0xF3, 0xE7, 0x76, 0x7C, 0x11, 0xB4, 0x4F, 0x62, 0xD6, 0x3A, 0x1E, 0x5D, 0xED, 0x91,\n    0xB3, 0x55, 0x2D, 0x83, 0xD3, 0xF4, 0xC9, 0x52, 0x59, 0x6B, 0xD2, 0xCA, 0x22, 0xC4, 0x8D, 0x74,\n    0xEC, 0x15, 0x47, 0x03, 0x0B, 0xDD, 0x1E, 0x83, 0x6A, 0xD7, 0x3C, 0x6F, 0x57, 0x67, 0x6B, 0x77,\n    0x8D, 0x67, 0x98, 0x88, 0x5D, 0x3C, 0x4C, 0x52, 0x6B, 0xC5, 0x8F, 0x82, 0x10, 0x18, 0x13, 0x3F,\n    0xD4, 0x65, 0x18, 0xFC, 0xFA, 0xD7, 0x97, 0xFD, 0x89, 0xC4, 0x82, 0x4E, 0xB6, 0x40, 0xC0, 0x62,\n    0x60, 0xB9, 0x95, 0xAB, 0x86, 0xB8, 0xE1, 0x10, 0xBD, 0xB3, 0xEC, 0x58, 0xDF, 0x13, 0xF4, 0x4D,\n    0x0A, 0x1D, 0xB8, 0x78, 0x2C, 0x0D, 0x70, 0xC2, 0xF9, 0xB8, 0x78, 0x10, 0x0E, 0x4D, 0xC6, 0x7B,\n    0xED, 0x1D, 0xBF, 0x64, 0x4E, 0xBC, 0xEA, 0x0A, 0x61, 0x49, 0xCE, 0x20, 0xD1, 0x21, 0x31, 0xEC,\n    0x30, 0xF9, 0x34, 0x94, 0x46, 0xF0, 0xFF, 0x4E, 0xFE, 0xB8, 0x6D, 0x78, 0xA5, 0x2C, 0x95, 0xDD,\n    0x45, 0x1E, 0x73, 0xA1, 0xC1, 0x7B, 0x60, 0xBD, 0x62, 0x2F, 0x31, 0x59, 0x6D, 0x3D, 0x00, 0x09,\n    0x0D, 0x2A, 0xA4, 0x86, 0xF3, 0x5A, 0x12, 0xAA, 0x50, 0x72, 0x8F, 0xA6, 0x96, 0xFD, 0x27, 0xA5,\n    0x52, 0xE3, 0xD1, 0x87, 0x8C, 0x00, 0xAE, 0xF9, 0x98, 0x98, 0x05, 0xD6, 0x89, 0x54, 0x71, 0x7E,\n    0x8F, 0xA7, 0xFE, 0x40, 0xAB, 0xEE, 0x04, 0xE2, 0xB2, 0xB5, 0x89, 0xFD, 0x38, 0xF0, 0xF9, 0x63,\n    0xAD, 0xBA, 0x2F, 0xF2, 0xF2, 0xC4, 0x7B, 0xF4, 0xE4, 0x10, 0x25, 0x8C, 0xBD, 0x6A, 0xF3, 0x23,\n    0x4B, 0xAE, 0xB1, 0x9B, 0x83, 0xF4, 0x1D, 0x12, 0x54, 0x72, 0xB5, 0xD4, 0xA0, 0xED, 0x4F, 0xA0,\n    0xBB, 0xBD, 0xEF, 0x4E, 0xC7, 0xDC, 0x5F, 0x04, 0x8B, 0x4F, 0x28, 0x02, 0x6D, 0x57, 0xE5, 0xD1,\n    0x44, 0x86, 0x26, 0xBB, 0x8E, 0x20, 0xC2, 0xCD, 0xD2, 0x1E, 0x49, 0x0E, 0x71, 0x36, 0xD8, 0x38,\n    0x7F, 0x18, 0x08, 0x16, 0x98, 0x13, 0x84, 0x39, 0x1C, 0x17, 0xED, 0x52, 0xE8, 0x43, 0x48, 0x44,\n    0x00, 0x7C, 0x9C, 0xE8, 0x80, 0xF3, 0x71, 0xD0, 0x2D, 0xF8, 0x6D, 0xFF, 0x6E, 0x0B, 0xF5, 0x86,\n    0xE8, 0x68, 0x25, 0x90, 0xC2, 0x04, 0x0C, 0x30, 0x6B, 0x31, 0x3E, 0x71, 0x51, 0x98, 0xD6, 0xD8,\n    0x50, 0xB4, 0xAA, 0xDF, 0x02, 0x0C, 0x78, 0x8F, 0x5E, 0x29, 0x02, 0xC8, 0xB5, 0xAD, 0x43, 0x9E,\n    0x59, 0x7D, 0xF1, 0xBB, 0x1E, 0xCC, 0xA0, 0x78, 0x53, 0xB1, 0x1C, 0x77, 0xAC, 0x55, 0xE1, 0x8C,\n    0xE3, 0x65, 0x27, 0x06, 0x79, 0x61, 0x95, 0x9D, 0x93, 0x05, 0xBA, 0x35, 0xCF, 0xAA, 0x96, 0x4F,\n    0x9A, 0xD1, 0x4C, 0x71, 0x27, 0xC4, 0x06, 0x5A, 0xBD, 0x39, 0x26, 0x87, 0x5F, 0x3C, 0x61, 0x94,\n    0xB9, 0x55, 0x48, 0x03, 0x06, 0x47, 0x8F, 0x81, 0x88, 0x19, 0x63, 0xE9, 0x3D, 0x8E, 0x6C, 0x5F,\n    0x72, 0xDE, 0x48, 0x1B, 0xFF, 0x8C, 0xEC, 0x2B, 0xF1, 0x75, 0x64, 0x03, 0xE7, 0xA3, 0xB4, 0xCC,\n    0x19, 0x44, 0x42, 0x96, 0x5C, 0xC4, 0x17, 0x6C, 0x7A, 0x20, 0xFF, 0xE3, 0xD5, 0x2C, 0xB6, 0x5C,\n    0x27, 0x97, 0xB3, 0x5B, 0x7B, 0xBC, 0x65, 0x76, 0xB5, 0xFD, 0x05, 0xD2, 0xA3, 0xC5, 0x79, 0x77,\n    0xBF, 0x77, 0x00, 0x7D, 0xA0, 0x0E, 0x53, 0x15, 0x2B, 0xC1, 0xB7, 0x40, 0xEA, 0xBC, 0x37, 0xE0,\n    0x52, 0x28, 0xAE, 0x03, 0x4D, 0x3E, 0x95, 0x03, 0x61, 0x2B, 0x5C, 0x7D, 0x6E, 0x51, 0xCA, 0x49,\n    0x37, 0xA2, 0xCF, 0xEA, 0x4C, 0x4B, 0x4D, 0x43, 0xCD, 0xF7, 0xBC, 0xCE, 0xEE, 0x4D, 0xE2, 0x96,\n    0x6D, 0xD6, 0xE2, 0x82, 0x92, 0xFE, 0x4C, 0x3E, 0x97, 0xD5, 0xDA, 0x45, 0xA3, 0xB0, 0xE0, 0x8C,\n    0x7E, 0x45, 0xF7, 0xE5, 0x9E, 0xB5, 0xA0, 0x63, 0xE6, 0xC4, 0x0C, 0x02, 0x91, 0x17, 0x4A, 0xC2,\n    0xD3, 0xB1, 0xDB, 0x85, 0xD1, 0x90, 0x7F, 0x21, 0x4B, 0x8E, 0xEA, 0x13, 0x55, 0xEE, 0xD5, 0xA2,\n    0xA6, 0xB9, 0x09, 0x96, 0xA2, 0xF8, 0xCB, 0xCE, 0xC4, 0x3B, 0x1C, 0x05, 0xEB, 0x00, 0x13, 0xFC,\n    0xFC, 0x9F, 0xC0, 0xCD, 0x2C, 0xB0, 0xC5, 0x8F, 0x38, 0xD7, 0xAB, 0xE4, 0x86, 0xB4, 0xA3, 0x78,\n    0x1F, 0x36, 0x22, 0xD2, 0x81, 0x6A, 0xBD, 0xA0, 0x9F, 0x61, 0x92, 0xF8, 0x6A, 0x27, 0x75, 0x72,\n    0x06, 0x16, 0x66, 0x76, 0x90, 0x93, 0x29, 0xBD, 0xEB, 0x9D, 0xA5, 0x81, 0xEF, 0xEB, 0x69, 0x93,\n    0x8E, 0xE8, 0x17, 0x8F, 0x42, 0x0A, 0x4D, 0xA0, 0x2D, 0x20, 0xB3, 0x1F, 0x6A, 0xDB, 0x22, 0xE9,\n    0x24, 0x64, 0x52, 0x06, 0x65, 0xA5, 0xC5, 0x82, 0x59, 0x47, 0xF4, 0xE9, 0xB9, 0xA3, 0xB1, 0x02,\n    0xFC, 0x60, 0x8B, 0x42, 0xF5, 0x23, 0xD8, 0xD8, 0x35, 0x70, 0x38, 0xEB, 0x5D, 0x15, 0xEF, 0xD6,\n    0xD3, 0x75, 0x80, 0x6E, 0xBA, 0x2E, 0xD6, 0x11, 0x54, 0x6E, 0x24, 0xC1, 0xC7, 0x7A, 0xE1, 0xCB,\n    0xAE, 0x62, 0x27, 0x48, 0xB7, 0x9C, 0xA7, 0x9E, 0x15, 0xFD, 0xDE, 0xC0, 0xBE, 0xBB, 0xC2, 0x2E,\n    0x4A, 0x5C, 0xD4, 0x81, 0xC0, 0x93, 0x58, 0x00, 0x9C, 0xFB, 0x36, 0x27, 0xD7, 0x72, 0x46, 0x9D,\n    0xAC, 0xEF, 0xD8, 0x14, 0x1C, 0x58, 0xC0, 0x4E, 0xD4, 0x16, 0xE1, 0x58, 0x56, 0x25, 0xA9, 0x38,\n    0xCF, 0x06, 0xAA, 0xA3, 0x4F, 0x52, 0x70, 0x09, 0x41, 0x44, 0xD0, 0x98, 0x73, 0xED, 0x18, 0xB4,\n    0xDB, 0x07, 0xC9, 0xB7, 0xBB, 0x5A, 0xD6, 0x08, 0xE5, 0x89, 0x19, 0xD8, 0x1A, 0xB6, 0x84, 0x72,\n    0x1B, 0xEA, 0x14, 0x78, 0x96, 0xB4, 0x2D, 0x61, 0x20, 0x8D, 0x9A, 0xD2, 0x87, 0x23, 0x18, 0x7A,\n    0xA3, 0x70, 0x4D, 0xA6, 0xBB, 0xEE, 0x99, 0x78, 0xD8, 0x94, 0xF1, 0x35, 0x91, 0x45, 0xDB, 0x2A,\n    0x8A, 0xDD, 0x8F, 0xC5, 0x05, 0x17, 0xB6, 0x69, 0x4E, 0xD2, 0xF0, 0x16, 0x09, 0x14, 0x65, 0xE0,\n    0x76, 0x6B, 0x33, 0xE8, 0x4D, 0xDF, 0xAF, 0x5A, 0x0C, 0xF6, 0xB0, 0x29, 0xEF, 0xB9, 0x85, 0x96,\n    0x16, 0xED, 0x03, 0x45, 0xFA, 0x6F, 0x03, 0x64, 0x62, 0x6D, 0x32, 0x75, 0x82, 0x32, 0x14, 0x23,\n    0x5A, 0x85, 0xFF, 0xFE, 0x65, 0x52, 0xBC, 0xAD, 0x99, 0xC2, 0xDA, 0x8B, 0x86, 0xC0, 0x2E, 0x78,\n    0x38, 0xDF, 0x5E, 0x83, 0xDE, 0xE0, 0x72, 0xD5, 0x91, 0x6B, 0xDB, 0xDF, 0x7F, 0xA7, 0x8B, 0xA4,\n    0x5B, 0x10, 0x93, 0x4D, 0xA4, 0xB4, 0x22, 0xC1, 0xB3, 0xBE, 0x8B, 0x56, 0x82, 0xB9, 0x33, 0x85,\n    0x01, 0xFA, 0xF5, 0x95, 0x9D, 0x0C, 0xBC, 0xD4, 0xB0, 0x2F, 0x94, 0xD9, 0x2E, 0xDA, 0xB9, 0x49,\n    0xC5, 0x53, 0xA2, 0xE9, 0x4D, 0x81, 0xDE, 0xC0, 0xF8, 0x01, 0x60, 0xEA, 0xAA, 0x57, 0x66, 0xA5,\n    0x5D, 0x4B, 0x6D, 0xEC, 0x85, 0xBF, 0x10, 0x18, 0x43, 0xD1, 0xD7, 0xA2, 0xBA, 0x72, 0x09, 0x63,\n    0x71, 0xB2, 0xA2, 0x14, 0x52, 0x94, 0xFD, 0x40, 0xA6, 0x89, 0x1B, 0xD5, 0x16, 0x7D, 0xB1, 0x22,\n    0x00, 0xF7, 0x62, 0x12, 0x5E, 0xBB, 0xA1, 0x03, 0x6C, 0x3D, 0x32, 0x1C, 0xD8, 0x3A, 0xB5, 0x24,\n    0xF6, 0x64, 0x67, 0xCD, 0x47, 0xEB, 0x6A, 0xFB, 0x94, 0xCE, 0xA6, 0xF4, 0x9D, 0x2B, 0xBD, 0x50,\n    0x2A, 0x53, 0x63, 0xEF, 0x7B, 0x94, 0x68, 0x26, 0xE2, 0xD8, 0x13, 0x5A, 0xD2, 0xE3, 0x1D, 0x01,\n    0xE4, 0xB8, 0x3C, 0x42, 0x07, 0x3B, 0x14, 0x01, 0xEB, 0x18, 0xBF, 0x39, 0xD9, 0xC4, 0xD6, 0x41,\n    0xB2, 0xE7, 0xCD, 0x02, 0x86, 0x8B, 0xA7, 0x77, 0x5D, 0xC9, 0x5C, 0xC0, 0xBE, 0xDE, 0x3D, 0x67,\n    0xA3, 0xD7, 0xDA, 0xB5, 0x88, 0x39, 0xEA, 0x9D, 0x7A, 0xF7, 0x99, 0x3E, 0xDE, 0xF9, 0x36, 0x1E,\n    0xBB, 0xAB, 0x61, 0x8C, 0xB2, 0xB9, 0x61, 0x18, 0x7D, 0x4A, 0x32, 0x7E, 0xCC, 0x71, 0xBC, 0xC6,\n    0xAA, 0xDE, 0x08, 0xFF, 0xEE, 0x44, 0x4B, 0xD7, 0xC1, 0xDB, 0xCE, 0xFE, 0x89, 0x56, 0x03, 0xDA,\n    0x3A, 0xF5, 0xD3, 0x9D, 0x39, 0x63, 0x92, 0x33, 0x50, 0x13, 0x8B, 0x7B, 0x5A, 0xC0, 0x79, 0xED,\n    0x40, 0xAD, 0x1B, 0x53, 0x50, 0x74, 0x0A, 0xA0, 0xA7, 0x5D, 0x5B, 0x61, 0x85, 0x93, 0x8A, 0xB9,\n    0xA9, 0x2C, 0x0F, 0xA2, 0xBD, 0x7A, 0x33, 0xF3, 0xD6, 0xD6, 0x64, 0x60, 0xCF, 0x12, 0x88, 0x08,\n    0x13, 0x0B, 0xC2, 0x76, 0xEC, 0x4B, 0x75, 0x74, 0xCC, 0x60, 0xF8, 0x9E, 0xAD, 0x40, 0xFD, 0x5E,\n    0x58, 0x2D, 0x08, 0xB7, 0x6C, 0xB6, 0x27, 0x73, 0x4B, 0x31, 0x03, 0x1D, 0x7A, 0xC5, 0x59, 0x67,\n    0x1F, 0x5C, 0xDE, 0x08, 0x24, 0x0D, 0xB9, 0x33, 0x97, 0x51, 0xC6, 0xC3, 0x13, 0xE0, 0xFC, 0x45,\n    0xDA, 0x5F, 0xFC, 0xA9, 0x8E, 0x71, 0x54, 0x1C, 0x3A, 0x4D, 0xFB, 0x7B, 0x06, 0xFB, 0x65, 0xB1,\n    0x27, 0x0B, 0x8C, 0xAF, 0xF2, 0xA0, 0x12, 0xA6, 0xD7, 0xAC, 0x27, 0xC1, 0x55, 0xE7, 0x17, 0x81,\n    0xFD, 0xA2, 0xF8, 0xC3, 0x17, 0x55, 0x9B, 0x00, 0xFE, 0x91, 0xA9, 0xDC, 0xDE, 0xB0, 0xD7, 0x5D,\n    0x2A, 0xE8, 0x87, 0xF2, 0x1B, 0x28, 0x19, 0x20, 0x63, 0x9E, 0xD8, 0x7E, 0x85, 0xF3, 0x87, 0x0D,\n    0xAF, 0x35, 0xA5, 0x9F, 0x3B, 0xE7, 0x44, 0x8D, 0x63, 0xDE, 0xEB, 0x7E, 0xC7, 0xD2, 0x0F, 0x09,\n    0x30, 0xE3, 0xE2, 0x7B, 0xEA, 0x74, 0xAD, 0x46, 0x7D, 0xB4, 0xB8, 0x0C, 0xF1, 0xD3, 0xFA, 0x07,\n    0xF3, 0xDD, 0xC5, 0xB1, 0x00, 0xF2, 0xD6, 0xBD, 0x4B, 0xBD, 0xAC, 0xC8, 0xBB, 0xA7, 0xD4, 0x53,\n    0xDE, 0x73, 0x0D, 0xED, 0xFB, 0x84, 0x4C, 0x82, 0x47, 0x0D, 0x2D, 0x9D, 0x2B, 0x0C, 0x4A, 0x4D,\n    0x4B, 0xD4, 0x3A, 0x4D, 0x64, 0x27, 0xD8, 0x59, 0x27, 0xD3, 0x41, 0x73, 0xA5, 0xCB, 0xF5, 0x31,\n    0xA2, 0x88, 0x99, 0x79, 0xFB, 0x2B, 0x9A, 0xBA, 0x68, 0x88, 0x35, 0x12, 0x15, 0x11, 0xF6, 0xEA,\n    0x9A, 0x1B, 0x2A, 0xE1, 0x95, 0x5B, 0x15, 0xAB, 0x79, 0xE2, 0x5A, 0x4A, 0x6E, 0xE2, 0xF7, 0x63,\n    0x74, 0x52, 0xB5, 0x9B, 0xA9, 0x58, 0x5D, 0x78, 0xAB, 0x61, 0x40, 0xA5, 0x6F, 0x99, 0x80, 0x06,\n    0xCA, 0x73, 0x82, 0x78, 0x64, 0x8F, 0xE4, 0xA7, 0x2F, 0x9F, 0x6D, 0x50, 0x80, 0x11, 0xF4, 0xE9,\n    0xE3, 0x63, 0x2A, 0x96, 0x0C, 0xFC, 0x3C, 0xE0, 0xAA, 0xF7, 0x05, 0x55, 0x28, 0xB0, 0x76, 0x24,\n    0x87, 0xDA, 0x29, 0x28, 0x05, 0xA9, 0x61, 0x0B, 0x66, 0x3C, 0xA0, 0x51, 0x5E, 0xCE, 0xF5, 0x80,\n    0x0F, 0x1C, 0x90, 0xDD, 0x56, 0x52, 0x07, 0xDF, 0xB4, 0xE6, 0x92, 0x4A, 0x57, 0x97, 0x71, 0xAB,\n    0x58, 0xF3, 0x03, 0x43, 0x99, 0x49, 0x1A, 0xFC, 0x96, 0x29, 0x31, 0x15, 0x30, 0x6D, 0xCA, 0x92,\n    0x39, 0x68, 0xF6, 0xAE, 0xDE, 0x56, 0x74, 0x53, 0xC5, 0xCA, 0xBE, 0x09, 0x0C, 0x88, 0xEE, 0xEC,\n    0xE9, 0xE8, 0xD0, 0x6A, 0x55, 0x6A, 0xB2, 0xDF, 0x41, 0x79, 0xC8, 0x44, 0xD1, 0x2B, 0x6B, 0x5F,\n    0xB4, 0x27, 0x02, 0xFE, 0x9E, 0x70, 0x48, 0xE9, 0xE8, 0x9B, 0x44, 0x5D, 0x19, 0xB7, 0x24, 0x47,\n    0x42, 0x0D, 0x1D, 0xA9, 0x26, 0x07, 0x70, 0xC4, 0x36, 0x6A, 0x03, 0xA2, 0xBD, 0x60, 0x65, 0x9A,\n    0x92, 0x6F, 0x0A, 0x1B, 0xE6, 0x36, 0x7B, 0xA4, 0x55, 0x79, 0xBF, 0x7B, 0x27, 0xBE, 0x6D, 0x67,\n    0x01, 0x6D, 0xB7, 0x49, 0x7C, 0x3F, 0x99, 0x1B, 0x4E, 0xFB, 0x32, 0x3A, 0xE5, 0x76, 0x0B, 0x96,\n    0xC6, 0x55, 0xC5, 0x90, 0x5F, 0x80, 0x19, 0x77, 0xAD, 0xB1, 0x5F, 0x6C, 0x75, 0x41, 0x1E, 0x07,\n    0x58, 0x6F, 0x6D, 0xB5, 0xDA, 0x2E, 0x3E, 0x2B, 0x76, 0xAA, 0x4D, 0xF5, 0x3F, 0x9A, 0x56, 0x31,\n    0x53, 0x74, 0x1F, 0xA6, 0xC3, 0x97, 0xAE, 0x8A, 0x3E, 0x8B, 0x76, 0xE1, 0x2C, 0x77, 0x6C, 0x70,\n    0xEC, 0xBB, 0xD5, 0xA5, 0xA7, 0x30, 0x4B, 0xE8, 0xA6, 0x29, 0xAC, 0xE6, 0x6F, 0x8E, 0xC7, 0xFF,\n    0xBA, 0xD9, 0xCB, 0x62, 0xE8, 0x2E, 0xD7, 0xCF, 0xA3, 0x02, 0xD4, 0x55, 0x88, 0x2D, 0x12, 0x9D,\n    0x6A, 0x19, 0x50, 0xB4, 0x98, 0xFA, 0x29, 0xF5, 0x2E, 0xFF, 0xF2, 0xD4, 0xAD, 0x04, 0x85, 0xF4,\n    0xB6, 0x22, 0x56, 0x03, 0x50, 0x3F, 0x96, 0x5D, 0xDE, 0xCD, 0x0D, 0xB3, 0xC5, 0xFB, 0xDB, 0xAC,\n    0x7F, 0xBD, 0xC1, 0xB6, 0xD0, 0x20, 0xCF, 0x30, 0x5E, 0x62, 0xD6, 0xF9, 0x44, 0x19, 0xF3, 0x96,\n    0x0D, 0x72, 0xF8, 0xFB, 0x71, 0xB1, 0x9D, 0xA7, 0x77, 0x6E, 0xDD, 0xD2, 0x1B, 0xD9, 0x39, 0xAB,\n    0x10, 0x26, 0x18, 0xB8, 0x56, 0x92, 0x6E, 0x9B, 0xC2, 0x3D, 0x9B, 0x94, 0x88, 0x9E, 0x2B, 0x4D,\n    0x79, 0xF6, 0x8D, 0xC6, 0x23, 0x0B, 0x8D, 0xF4, 0xB3, 0x00, 0x8C, 0xD4, 0x4F, 0xE1, 0xA1, 0x2B,\n    0x9F, 0xE7, 0x3D, 0xE9, 0x04, 0x65, 0xD4, 0x21, 0x87, 0x44, 0xDB, 0x00, 0x30, 0x23, 0x7A, 0x94,\n    0xC1, 0xE7, 0x4B, 0xC4, 0xA0, 0xA6, 0x90, 0x20, 0x99, 0xE6, 0x98, 0x48, 0x67, 0xB6, 0x49, 0x90,\n    0x20, 0xB4, 0xA0, 0xA8, 0x90, 0x1E, 0x1B, 0x49, 0x50, 0x41, 0x7B, 0xC5, 0x02, 0xF3, 0xFF, 0xB1,\n    0x6D, 0x39, 0x79, 0x1C, 0x3C, 0x5E, 0xC7, 0x98, 0x1F, 0xD9, 0x52, 0x49, 0x75, 0x59, 0x01, 0x1A,\n    0xC1, 0x82, 0xBD, 0xDB, 0x1A, 0x86, 0xD8, 0x9F, 0x12, 0x93, 0xD2, 0x80, 0x13, 0xDE, 0x79, 0x3D,\n    0xB6, 0xEB, 0xC5, 0x47, 0x75, 0x24, 0xE3, 0x70, 0x8E, 0x20, 0xBE, 0x78, 0x26, 0x15, 0xBD, 0xD4,\n    0x5B, 0x9D, 0x6D, 0x7B, 0x02, 0x80, 0x73, 0x44, 0xA2, 0xC7, 0x22, 0x8D, 0xAD, 0x19, 0xD0, 0x38,\n    0x2B, 0xEA, 0x4F, 0xDE, 0x68, 0x84, 0x3C, 0x77, 0x6B, 0xA2, 0x6C, 0x9A, 0x56, 0x13, 0x75, 0x66,\n    0x8A, 0x91, 0x87, 0xDA, 0xC4, 0x24, 0xE6, 0xC5, 0x14, 0xE7, 0x91, 0x0B, 0x40, 0xBD, 0x7D, 0x8A,\n    0x3A, 0x0D, 0x39, 0xB5, 0x65, 0x1A, 0xF6, 0x0F, 0x79, 0x4D, 0xED, 0x07, 0x8F, 0xE4, 0x48, 0xA3,\n    0x7A, 0xE8, 0x9F, 0x09, 0x5B, 0x9E, 0x30, 0x46, 0xA8, 0x63, 0x89, 0x9E, 0xAF, 0xD1, 0x8F, 0xBE,\n    0x53, 0x20, 0x07, 0xDE, 0x54, 0x8B, 0x8B, 0x98, 0xED, 0x76, 0xD7, 0x3A, 0xE9, 0x40, 0xEC, 0x27,\n    0x64, 0xDC, 0x66, 0xD4, 0x32, 0x22, 0x43, 0x7E, 0xE0, 0x3E, 0xF8, 0x15, 0xAB, 0xDE, 0xAA, 0xC4,\n    0x13, 0x7F, 0x56, 0x4E, 0x57, 0xC8, 0x69, 0x27, 0xD4, 0xC6, 0x6B, 0x72, 0x71, 0xB8, 0xA4, 0x7A,\n    0x2F, 0x82, 0x7D, 0xEE, 0x0C, 0x21, 0xCE, 0xDF, 0xA5, 0x56, 0x01, 0xFC, 0xD2, 0xE7, 0x48, 0x35,\n    0xD6, 0x8C, 0x87, 0xEF, 0xD8, 0xE1, 0xDC, 0xFC, 0x60, 0x1D, 0xD7, 0x81, 0xE5, 0xE2, 0x83, 0x83,\n    0xF7, 0x14, 0xDA, 0xC8, 0x64, 0xA1, 0xDC, 0xBF, 0x6A, 0x0D, 0xB4, 0x5D, 0xCB, 0x1E, 0xDF, 0xA7,\n    0xE7, 0x37, 0xDE, 0xCD, 0x35, 0x27, 0xAF, 0x18, 0xD3, 0xB3, 0xC5, 0xF1, 0x69, 0x57, 0xCD, 0xE4,\n    0x64, 0x07, 0x50, 0x08, 0x80, 0x80, 0x6A, 0x2F, 0xD3, 0x1E, 0xA8, 0xC9, 0xA7, 0x6C, 0xFD, 0xA1,\n    0x91, 0xF3, 0x06, 0x12, 0x97, 0x56, 0x9E, 0x37, 0x6A, 0x3D, 0x30, 0x0E, 0x0D, 0x88, 0x1D, 0x47,\n    0xCC, 0x95, 0x53, 0xAA, 0xF4, 0xDC, 0x11, 0x9C, 0xD5, 0xBA, 0xDA, 0xA6, 0xAC, 0xE3, 0xC6, 0x14,\n    0x54, 0x75, 0xA9, 0x22, 0x31, 0x0E, 0x58, 0x6B, 0xF6, 0x3E, 0x42, 0x54, 0x81, 0xF1, 0x26, 0x60,\n    0x42, 0x7E, 0xD7, 0x15, 0x7C, 0x1A, 0xB3, 0x48, 0x74, 0x7E, 0x2A, 0xBC, 0x32, 0xEA, 0x37, 0x98,\n    0x56, 0x7C, 0x06, 0x44, 0xD3, 0xC6, 0x91, 0x8D, 0x8A, 0xA0, 0xF6, 0x8E, 0x84, 0x11, 0xC1, 0xEB,\n    0x9A, 0x39, 0x1A, 0xF2, 0xA7, 0x78, 0x17, 0x21, 0x3B, 0xBF, 0x32, 0x5B, 0x9C, 0x61, 0x6A, 0xDD,\n    0x96, 0x55, 0x62, 0x38, 0x57, 0x6F, 0xA8, 0x7A, 0xB3, 0x44, 0x85, 0x6C, 0x4B, 0x06, 0xD6, 0x8E,\n    0xAF, 0x6F, 0x30, 0x03, 0xBA, 0x88, 0xE4, 0x2A, 0x61, 0x58, 0x33, 0x34, 0xC9, 0xBF, 0x52, 0xC4,\n    0x11, 0x71, 0xD1, 0x65, 0xEC, 0x07, 0x40, 0x92, 0x4A, 0x39, 0x4A, 0xF1, 0x6A, 0x37, 0x25, 0x82,\n    0x91, 0x4A, 0x68, 0x98, 0xAA, 0x25, 0xDC, 0xD4, 0xCB, 0x51, 0x15, 0x46, 0xE4, 0xF0, 0x06, 0xA1,\n    0x5B, 0x7F, 0xCA, 0xC9, 0xC9, 0xD7, 0x91, 0xF3, 0x9F, 0x0E, 0xC0, 0x69, 0x37, 0x48, 0x81, 0x0C,\n    0xF4, 0x15, 0x51, 0x9E, 0xE3, 0x73, 0xAC, 0xDF, 0x57, 0x49, 0x2A, 0xF6, 0x98, 0x72, 0x5C, 0x43,\n    0x2A, 0x63, 0x40, 0x94, 0xF1, 0xB4, 0x0B, 0xBD, 0x79, 0x67, 0xB8, 0xAB, 0xAE, 0xD4, 0x9C, 0xFA,\n    0x2F, 0x64, 0x0D, 0x33, 0xB7, 0x7F, 0x9E, 0xC4, 0xB7, 0xE6, 0xCB, 0x5E, 0x61, 0x60, 0x29, 0x6D,\n    0xB7, 0xC9, 0xCA, 0x7D, 0xE2, 0x43, 0x1E, 0x95, 0x04, 0xE1, 0xA9, 0x6B, 0xBD, 0x5F, 0xB2, 0xBF,\n    0x07, 0x1C, 0xFF, 0x30, 0x74, 0x9A, 0xBC, 0xC4, 0xD5, 0x5C, 0x00, 0x32, 0x76, 0xA6, 0xDD, 0x25,\n    0x3D, 0x53, 0xD0, 0x38, 0x34, 0x53, 0x7B, 0xD6, 0xBF, 0x0E, 0x84, 0xA0, 0x96, 0xF9, 0x8A, 0x82,\n    0x8D, 0x94, 0x60, 0x57, 0xE2, 0x54, 0xBE, 0x44, 0x96, 0xF7, 0x86, 0xF5, 0x39, 0x0D, 0x05, 0xA7,\n    0xB6, 0x74, 0xA5, 0x41, 0xB3, 0x0A, 0xB0, 0x5D, 0x91, 0xCB, 0x85, 0x79, 0x83, 0x4B, 0xC6, 0x55,\n    0x57, 0x68, 0x8C, 0x91, 0x2F, 0x2A, 0xB8, 0x4A, 0x08, 0x82, 0x1F, 0xEC, 0x9A, 0x68, 0x11, 0x4C,\n    0x22, 0x2C, 0x90, 0x86, 0x7E, 0xA5, 0x71, 0x46, 0xB5, 0xE0, 0x2B, 0x3F, 0x21, 0x8E, 0xCD, 0x41,\n    0xA3, 0x96, 0xA5, 0x9E, 0x88, 0x9D, 0xC0, 0x06, 0x64, 0x4A, 0x4B, 0x3A, 0xD4, 0xA1, 0xE7, 0x16,\n    0xD4, 0x3E, 0x57, 0xD2, 0x0C, 0xDA, 0xE1, 0x34, 0xD8, 0xD6, 0x58, 0xF7, 0x86, 0xBD, 0xF6, 0xC4,\n    0xBC, 0xDA, 0x21, 0x74, 0xCA, 0x8A, 0xA6, 0xAA, 0x30, 0xEF, 0x25, 0x1F, 0x32, 0x7B, 0x49, 0xA6,\n    0xEF, 0x9B, 0x95, 0x51, 0x83, 0x34, 0xB8, 0xB8, 0x3E, 0xCE, 0xF6, 0x85, 0x21, 0x3F, 0xE2, 0x93,\n    0x5E, 0x52, 0xBF, 0x8D, 0xE7, 0xDD, 0xCE, 0xDF, 0x0B, 0x99, 0xB4, 0xB3, 0x89, 0x31, 0x70, 0xAE,\n    0x82, 0x4D, 0xF5, 0xD1, 0x31, 0xF7, 0x04, 0xB2, 0x8A, 0x6A, 0xD8, 0xAD, 0x36, 0x50, 0x7D, 0x5B,\n    0xD5, 0xD1, 0x26, 0x07, 0xB0, 0x40, 0xF0, 0x93, 0x4C, 0x17, 0xCD, 0x3F, 0xC3, 0x65, 0x95, 0x25,\n    0xF4, 0x58, 0x12, 0xEE, 0xAA, 0xE6, 0x86, 0xAB, 0x92, 0x90, 0x18, 0xCD, 0xBD, 0x9A, 0x98, 0xFB,\n    0x64, 0x17, 0x61, 0xF7, 0x04, 0x8B, 0x26, 0xD6, 0x13, 0xA2, 0x0C, 0x7C, 0xB7, 0x98, 0x35, 0xD0,\n    0x47, 0x2C, 0x44, 0xB0, 0xA6, 0x5E, 0x96, 0xAE, 0x60, 0x54, 0x15, 0x1C, 0x1F, 0xEF, 0x95, 0x2A,\n    0x7F, 0xF5, 0x11, 0x8B, 0xD2, 0xFA, 0x9D, 0x2B, 0x80, 0xD7, 0xA3, 0x0E, 0x25, 0xFD, 0x61, 0xA1,\n    0x59, 0xEF, 0xFA, 0xC6, 0x7D, 0x8C, 0xE2, 0x0E, 0xD5, 0x3B, 0x7F, 0x0A, 0x9B, 0x07, 0x66, 0x2A,\n    0x10, 0xF7, 0x58, 0x97, 0x78, 0xB5, 0x9E, 0x8C, 0x17, 0x10, 0x36, 0x8F, 0x7E, 0xB5, 0x62, 0xDD,\n    0xBA, 0x53, 0x62, 0x20, 0x86, 0x69, 0x0B, 0x44, 0xDF, 0x3A, 0xEA, 0x0B, 0xB6, 0xD8, 0xDD, 0x3E,\n    0x0F, 0x0D, 0xD0, 0x37, 0xDC, 0x2D, 0xD7, 0xEF, 0xB6, 0xD7, 0x4E, 0x2B, 0xFE, 0xA1, 0x4B, 0xDC,\n    0xC2, 0x69, 0xEA, 0x04, 0x79, 0x6E, 0xC2, 0xD4, 0xD6, 0xC7, 0x3D, 0x21, 0x7C, 0xBD, 0x12, 0x4C,\n    0x3A, 0x0F, 0xA6, 0xB9, 0xA8, 0x64, 0xF0, 0x13, 0x24, 0x9C, 0xD9, 0xC8, 0x97, 0xBB, 0xAD, 0x31,\n    0x3D, 0x74, 0x6C, 0x6D, 0x62, 0xE7, 0x4E, 0x54, 0xC9, 0xEA, 0x0C, 0x65, 0xA5, 0xF8, 0x4A, 0xC1,\n    0x7C, 0x26, 0x6B, 0x3F, 0x71, 0x06, 0xA8, 0xE6, 0xD5, 0x41, 0xCF, 0xD3, 0xFB, 0x6C, 0x88, 0xBC,\n    0x82, 0xE1, 0x4D, 0x5F, 0x3C, 0x48, 0x61, 0xB4, 0xA1, 0x17, 0x43, 0x18, 0x8E, 0xA3, 0xD2, 0xDE,\n    0xF5, 0x11, 0xE7, 0x6F, 0xBA, 0x9D, 0x00, 0x8E, 0x59, 0x6D, 0xC5, 0x1C, 0x59, 0x38, 0xD5, 0x3D,\n    0x1F, 0xB9, 0x20, 0xDA, 0x91, 0xF3, 0xA6, 0x79, 0x91, 0xD4, 0x6A, 0x96, 0xB6, 0xDE, 0xF6, 0xD9,\n    0xB7, 0x43, 0xD9, 0x14, 0x03, 0x61, 0x69, 0x6B, 0xF1, 0x96, 0x91, 0x5B, 0xA6, 0x47, 0xA5, 0x87,\n    0x07, 0x5C, 0xB7, 0x33, 0xE1, 0x35, 0xFA, 0x71, 0x0B, 0xF0, 0x15, 0x96, 0x1D, 0xA7, 0x01, 0x88,\n    0xEC, 0x94, 0xC5, 0xD1, 0x62, 0x53, 0x0F, 0xD9, 0x37, 0x88, 0x7B, 0x83, 0x9F, 0x59, 0x19, 0xB6,\n    0xC3, 0x6F, 0x98, 0xF7, 0x40, 0x34, 0x10, 0x84, 0xB3, 0x66, 0x72, 0x4E, 0x9B, 0x5B, 0xD5, 0xCE,\n    0x84, 0x47, 0x6C, 0xBB, 0x89, 0xC0, 0xD7, 0x07, 0x11, 0x20, 0xD8, 0x2E, 0x27, 0x52, 0x3C, 0x33,\n    0x9E, 0xC9, 0x9F, 0x9F, 0x4A, 0x5F, 0x73, 0xC9, 0xBE, 0xC9, 0x63, 0xD9, 0xF1, 0xDA, 0xE6, 0x3B,\n    0x09, 0xC0, 0xAA, 0x55, 0xD1, 0xA6, 0x31, 0xF6, 0xB4, 0x3D, 0xED, 0x79, 0x56, 0xE8, 0xB9, 0x04,\n    0xC6, 0x5D, 0x10, 0x81, 0x86, 0xB8, 0xD4, 0x32, 0xF8, 0x7B, 0xC4, 0x9C, 0x89, 0x68, 0x26, 0x8C,\n    0xA1, 0xC2, 0x40, 0x34, 0x4B, 0xAD, 0x06, 0xC9, 0x31, 0xD1, 0xDD, 0xE6, 0xB8, 0x77, 0x82, 0xA4,\n    0xFE, 0x8F, 0x74, 0x69, 0x8E, 0xFF, 0x33, 0xB8, 0xAE, 0x29, 0x99, 0x92, 0x37, 0x8B, 0x82, 0x73,\n    0x51, 0xE3, 0x0D, 0x5A, 0x88, 0xBE, 0x20, 0x12, 0x7E, 0x04, 0x1A, 0xDA, 0x76, 0x79, 0x34, 0x15,\n    0xA3, 0x52, 0x5D, 0x77, 0x90, 0x41, 0xFD, 0x32, 0xA5, 0x43, 0x27, 0x03, 0xEC, 0xD6, 0x05, 0x49,\n    0x6E, 0x0F, 0x21, 0xD2, 0xBD, 0x5E, 0x2C, 0x46, 0x8C, 0x07, 0xAB, 0x64, 0xA3, 0x00, 0x52, 0x6F,\n    0x65, 0x87, 0x91, 0x2A, 0x88, 0x3F, 0x93, 0x5C, 0xC6, 0x2F, 0xD2, 0xF6, 0x7E, 0x6D, 0x48, 0xC8,\n    0x7E, 0x29, 0x37, 0x3E, 0xA5, 0xA6, 0x04, 0x3B, 0x55, 0x65, 0xB5, 0x9B, 0x49, 0x72, 0x9C, 0xB7,\n    0xE6, 0xC4, 0x6D, 0x6A, 0xBD, 0x71, 0x60, 0x6B, 0xBD, 0x60, 0x2E, 0x43, 0xFE, 0x84, 0x88, 0xD8,\n    0x8C, 0x81, 0xD1, 0xB0, 0x8F, 0xAA, 0xA0, 0x91, 0x9B, 0x1E, 0xE2, 0xA7, 0x1D, 0x56, 0x89, 0x72,\n    0xE7, 0xD3, 0xE1, 0x58, 0x4E, 0x07, 0x30, 0x75, 0xDE, 0xCD, 0x00, 0xD2, 0xF6, 0xFB, 0x2D, 0x5D,\n    0xAA, 0x29, 0xF7, 0xEB, 0x84, 0x16, 0x28, 0x17, 0xEB, 0xC9, 0x6D, 0x18, 0xE9, 0x22, 0xF2, 0xED,\n    0x11, 0xBC, 0xDC, 0x33, 0x91, 0x01, 0xC9, 0x6F, 0x96, 0xD1, 0x89, 0xEB, 0xEF, 0x47, 0x55, 0x93,\n    0xF1, 0x94, 0x2D, 0xDE, 0x40, 0x2B, 0x9E, 0xDB, 0x02, 0x9E, 0xB8, 0xA9, 0x7E, 0x9D, 0xB6, 0xBF,\n    0x96, 0x87, 0x3F, 0x07, 0x8D, 0x43, 0x58, 0x70, 0x92, 0xB8, 0x41, 0x7A, 0x05, 0x3F, 0x1F, 0xA7,\n    0x0B, 0x5B, 0x29, 0xB1, 0x6C, 0x76, 0xB3, 0x44, 0x6C, 0x6F, 0x82, 0x74, 0x10, 0xAB, 0xF0, 0x29,\n    0x20, 0x6D, 0x00, 0x1E, 0x42, 0x89, 0x8B, 0x79, 0x4B, 0x6A, 0xF0, 0x9D, 0x5E, 0x1C, 0x05, 0x7B,\n    0x2B, 0x57, 0xB3, 0x45, 0xBF, 0x5A, 0x72, 0x46, 0x01, 0xFB, 0xF6, 0x03, 0x14, 0xBB, 0x1A, 0x1C,\n    0x62, 0xCA, 0x9B, 0x40, 0xB9, 0xAE, 0x48, 0x4A, 0xC9, 0x0E, 0x0A, 0x26, 0x85, 0x2C, 0x01, 0x92,\n    0x3F, 0xE1, 0x22, 0x3B, 0xBC, 0x25, 0xF6, 0x08, 0xB7, 0x7E, 0x94, 0x45, 0x18, 0x9B, 0x48, 0xEE,\n    0x5E, 0xD0, 0xC6, 0x74, 0x34, 0xAF, 0x6E, 0x66, 0xBC, 0x0C, 0xAA, 0x6D, 0xD6, 0x1A, 0xC1, 0x0F,\n    0xAC, 0xF6, 0x97, 0x20, 0xCF, 0xF3, 0x9A, 0x78, 0xCA, 0x1B, 0x9F, 0x25, 0x52, 0x3D, 0xA9, 0x35,\n    0x0D, 0xEA, 0x12, 0xCF, 0x0C, 0x32, 0x53, 0x5A, 0x55, 0x4B, 0x99, 0x05, 0x80, 0x56, 0xB6, 0xE2,\n    0x59, 0xC8, 0x37, 0x0F, 0x4C, 0x79, 0xEF, 0xE5, 0xE0, 0x41, 0x0A, 0x4C, 0x1E, 0x5F, 0x85, 0x90,\n    0xC7, 0x66, 0x28, 0xAB, 0xD7, 0xF1, 0x91, 0x60, 0xE7, 0x77, 0x28, 0x01, 0x7C, 0xA8, 0x2A, 0x23,\n    0x84, 0x76, 0x91, 0xAA, 0x65, 0xA4, 0xFF, 0xEC, 0xA2, 0x02, 0x36, 0x9A, 0x43, 0x18, 0xAA, 0x0F,\n    0x81, 0x26, 0x8F, 0x8B, 0x9C, 0x46, 0x2C, 0x53, 0x63, 0x01, 0x5C, 0x44, 0x4B, 0xBC, 0x28, 0xEA,\n    0x2F, 0x4E, 0x57, 0x72, 0x35, 0xA3, 0x85, 0x4F, 0x27, 0x22, 0xB5, 0x92, 0x5F, 0x5B, 0xD0, 0x78,\n    0x49, 0xAF, 0x42, 0x1F, 0x0B, 0x19, 0x9E, 0x17, 0xB0, 0xA6, 0xFB, 0x2F, 0xD7, 0x82, 0x60, 0x11,\n    0xB6, 0x63, 0x4C, 0x65, 0x44, 0xD1, 0xB4, 0x9A, 0xDA, 0x7A, 0xF8, 0x6E, 0xA5, 0xAE, 0x55, 0x32,\n    0x46, 0xDD, 0xE5, 0xB8, 0xC3, 0xC6, 0xDC, 0xC4, 0x49, 0x2C, 0x35, 0x2A, 0x2F, 0xFE, 0x85, 0xEE,\n    0xD0, 0xD7, 0x5E, 0xF1, 0xD9, 0xE9, 0x23, 0xCB, 0x96, 0xAE, 0x30, 0x22, 0x54, 0x80, 0x93, 0x9A,\n    0xD5, 0x7C, 0x0A, 0xF9, 0x47, 0x1F, 0x02, 0x80, 0x21, 0xFF, 0x53, 0x39, 0xC6, 0xB7, 0x73, 0xDE,\n    0x4B, 0x03, 0xC8, 0xB7, 0xBF, 0x34, 0x0F, 0xCB, 0x37, 0xD1, 0x5F, 0x53, 0x5F, 0x05, 0x62, 0x2D,\n    0x62, 0xC4, 0xB6, 0xED, 0x82, 0xC3, 0x19, 0x09, 0xFD, 0xC8, 0x93, 0xAB, 0x63, 0xB2, 0xA5, 0x6B,\n    0x97, 0x82, 0x37, 0x29, 0xBF, 0x97, 0x54, 0xFE, 0x9B, 0x32, 0xFD, 0x51, 0xE9, 0x14, 0xE1, 0x74,\n    0x07, 0x2B, 0xFA, 0x39, 0x1C, 0x6A, 0x5B, 0xA3, 0x5B, 0x7E, 0xB6, 0xD9, 0x66, 0x82, 0x0D, 0xF9,\n    0xD7, 0x9C, 0x64, 0xE8, 0x2A, 0x73, 0x98, 0x95, 0x31, 0xCF, 0xAE, 0xBE, 0x6D, 0x57, 0x69, 0x34,\n    0x4E, 0x58, 0x0A, 0xD1, 0x5A, 0x94, 0x8F, 0xFE, 0xF5, 0xD6, 0x4E, 0x73, 0xC0, 0x96, 0x4E, 0xFD,\n    0x21, 0x25, 0xC4, 0xB6, 0x11, 0xFA, 0xA7, 0x41, 0x7E, 0xB2, 0xFC, 0x42, 0x14, 0x16, 0x90, 0xC9,\n    0x74, 0x5D, 0x4A, 0x25, 0x73, 0xE1, 0x63, 0x7E, 0x81, 0xF9, 0x3F, 0x8E, 0x24, 0x4C, 0x61, 0x02,\n    0xD5, 0xF8, 0xB2, 0x2E, 0xF3, 0x80, 0x79, 0xBF, 0x13, 0xA0, 0x38, 0xC7, 0x0E, 0x4E, 0x2C, 0x22,\n    0x46, 0x0E, 0x29, 0xEE, 0x2A, 0x8C, 0xDD, 0x86, 0x33, 0xB7, 0xF0, 0xCC, 0x0F, 0x13, 0x7E, 0x03,\n    0x07, 0xB3, 0x3E, 0x97, 0xC5, 0x6F, 0xDC, 0xFF, 0x96, 0x23, 0xCB, 0x69, 0x8B, 0x86, 0x94, 0x6D,\n    0x86, 0xEF, 0x2F, 0x5C, 0x31, 0x7F, 0xF7, 0x22, 0x96, 0x61, 0x88, 0x75, 0x3C, 0x76, 0x97, 0x12,\n    0x1A, 0xEF, 0x70, 0x7D, 0x6A, 0x17, 0xF5, 0xB1, 0xB5, 0x68, 0x50, 0x91, 0xDD, 0x88, 0x0F, 0xCB,\n    0x33, 0x73, 0xB9, 0xBF, 0xC6, 0x65, 0xAE, 0x15, 0x6B, 0x20, 0xCF, 0x8A, 0xDF, 0xDF, 0x5D, 0xAD,\n    0xE8, 0x45, 0x69, 0x7D, 0x1C, 0x1B, 0xF2, 0xAC, 0xCD, 0x9D, 0x9F, 0xB8, 0x6D, 0x57, 0x16, 0x92,\n    0xCC, 0x1A, 0xF2, 0xC2, 0x62, 0xEE, 0xE2, 0x71, 0x2D, 0x58, 0xAB, 0xB7, 0x60, 0x4D, 0xDB, 0xEF,\n    0x88, 0xC2, 0x2B, 0x39, 0x8B, 0x4C, 0x0F, 0xEF, 0xEB, 0x86, 0x16, 0x34, 0x49, 0x9E, 0x1E, 0x24,\n    0xFC, 0xE9, 0x77, 0x2A, 0xD2, 0x75, 0x76, 0x96, 0x24, 0xD3, 0x33, 0x4D, 0x8B, 0xDD, 0x92, 0xBE,\n    0xBF, 0xE5, 0xB0, 0x12, 0x92, 0x0C, 0x89, 0xD8, 0x73, 0xE2, 0xA6, 0xD7, 0xF3, 0x15, 0x59, 0x76,\n    0x9F, 0x3B, 0x10, 0xC1, 0xA4, 0x9B, 0x64, 0xC8, 0x4B, 0xD4, 0xEE, 0x63, 0xA7, 0xF7, 0xE9, 0xB4,\n    0x43, 0x50, 0xC4, 0x7B, 0xE1, 0x7A, 0x53, 0x6D, 0xC8, 0x17, 0x82, 0x31, 0xE4, 0x53, 0xF3, 0x20,\n    0xF0, 0xE9, 0x78, 0xAF, 0x8F, 0x95, 0x96, 0xA8, 0xE9, 0x0E, 0xFE, 0x10, 0x51, 0x8E, 0xF1, 0x64,\n    0x89, 0x2B, 0x0B, 0xE1, 0xCE, 0xA1, 0xA9, 0xCA, 0xF0, 0xD4, 0xD3, 0xAA, 0x49, 0xE3, 0x68, 0x76,\n    0xDE, 0x20, 0x77, 0xCB, 0x92, 0x60, 0x36, 0x66, 0x82, 0x06, 0x6D, 0xDF, 0x11, 0xF7, 0xA3, 0x07,\n    0x43, 0x18, 0x48, 0x89, 0x40, 0x19, 0x72, 0xAD, 0xF5, 0x06, 0x0B, 0x61, 0x87, 0xD9, 0x48, 0x17,\n    0x8A, 0x0D, 0xC8, 0x6C, 0xD9, 0xC9, 0x9D, 0xEE, 0x08, 0x16, 0x1F, 0x0D, 0x88, 0xB5, 0xEF, 0x5B,\n    0x2F, 0x40, 0xAE, 0x71, 0x0F, 0x02, 0x96, 0xAF, 0x2C, 0xC8, 0x8E, 0x86, 0x64, 0x58, 0xF1, 0x7C,\n    0xE9, 0x86, 0xDB, 0xCF, 0x57, 0x5E, 0xF9, 0x57, 0x7E, 0x85, 0xAE, 0x8B, 0x6A, 0x1E, 0x9B, 0x2B,\n    0x0D, 0xE2, 0x07, 0xDE, 0x42, 0x76, 0x79, 0x72, 0x25, 0xBB, 0xD6, 0xDA, 0xD8, 0x8D, 0xE4, 0x34,\n    0xF6, 0xC6, 0xBB, 0x00, 0x62, 0x22, 0x4D, 0x0F, 0x90, 0xD1, 0x35, 0x20, 0x6B, 0x3C, 0x43, 0xB2,\n    0xBF, 0xED, 0xCA, 0x5D, 0xC2, 0x0F, 0x5A, 0x94, 0x87, 0xE3, 0x61, 0x94, 0x85, 0xE4, 0x24, 0x63,\n    0xEF, 0x8C, 0xD9, 0x7B, 0xEE, 0x24, 0x5C, 0x51, 0x4A, 0xF1, 0x6B, 0xEB, 0xD6, 0x5A, 0x0F, 0xCE,\n    0x3B, 0x29, 0xAE, 0x86, 0xAA, 0xFF, 0xEC, 0x66, 0x54, 0x45, 0xA4, 0x86, 0xD1, 0x3F, 0x2C, 0xEF,\n    0xF1, 0x71, 0x33, 0x4E, 0xB8, 0x16, 0x1A, 0xB2, 0x18, 0x6E, 0xCD, 0xBA, 0x59, 0xDB, 0x52, 0xE8,\n    0x49, 0x78, 0x75, 0x5C, 0x9F, 0x97, 0xB7, 0x00, 0x57, 0x11, 0xB1, 0x9D, 0x99, 0x0C, 0xA2, 0x54,\n    0xDD, 0x0A, 0x03, 0xF5, 0xAA, 0x0D, 0xBF, 0x47, 0x2D, 0xC0, 0x41, 0x3A, 0x29, 0x0A, 0xA5, 0x8C,\n    0x77, 0x38, 0xA5, 0x4F, 0xE9, 0x9C, 0x7E, 0x23, 0x7E, 0xEF, 0x8F, 0xB3, 0x45, 0x96, 0xA5, 0xDC,\n    0xAC, 0x1A, 0x44, 0xEE, 0xE4, 0x1C, 0x17, 0x01, 0x7E, 0x26, 0x9D, 0xA0, 0x90, 0xD8, 0x4F, 0x5A,\n    0x14, 0x99, 0x46, 0x51, 0x1F, 0x29, 0xFA, 0xE2, 0xB6, 0xEB, 0x71, 0x1A, 0xF4, 0xE2, 0x59, 0x32,\n    0x18, 0x66, 0x31, 0x73, 0x58, 0x23, 0xF3, 0xDC, 0xCB, 0x73, 0xBF, 0x04, 0xB5, 0xBD, 0xAD, 0x4D,\n    0x67, 0x96, 0x84, 0xFA, 0x60, 0x48, 0x97, 0x32, 0xED, 0x55, 0xB1, 0x90, 0xD3, 0x15, 0xFA, 0xD9,\n    0xE4, 0x9E, 0x65, 0x72, 0x8D, 0xC5, 0x16, 0x99, 0xC9, 0xE7, 0xF7, 0x29, 0xAD, 0xF7, 0xDB, 0x4C,\n    0x0A, 0xD0, 0x40, 0xBE, 0x26, 0xF4, 0xC3, 0x89, 0x70, 0xE1, 0x82, 0xF1, 0x95, 0xB3, 0xB8, 0x64,\n    0xE4, 0xBA, 0x2E, 0x4C, 0x4A, 0x93, 0x41, 0x21, 0xF1, 0xBD, 0x2C, 0x8E, 0x15, 0xFC, 0xC2, 0x33,\n    0x9E, 0x76, 0xAD, 0xCE, 0x93, 0xED, 0x4D, 0x04, 0x27, 0x71, 0xDB, 0x21, 0x0A, 0xDE, 0x48, 0xAD,\n    0x43, 0x6F, 0xF7, 0x97, 0x7B, 0xBC, 0xCD, 0x5A, 0xDE, 0x60, 0x07, 0x07, 0x2A, 0x83, 0xF4, 0x25,\n    0x6A, 0xD1, 0xBF, 0xB2, 0x3B, 0xF7, 0x4E, 0x46, 0xB0, 0x34, 0xC2, 0x93, 0x45, 0xB9, 0xE6, 0x32,\n    0x8E, 0x75, 0x67, 0x12, 0x06, 0x46, 0x7B, 0xB1, 0xD6, 0xEC, 0x91, 0x73, 0x87, 0x99, 0x3E, 0x9E,\n    0xBB, 0xAC, 0x0C, 0x94, 0xCC, 0xBD, 0x33, 0xCF, 0x27, 0x65, 0x70, 0x18, 0x49, 0x27, 0xD9, 0xAF,\n    0x17, 0x43, 0x16, 0x99, 0xD3, 0x0A, 0xB9, 0xE9, 0xD6, 0x4A, 0xDE, 0x9C, 0x9C, 0x3F, 0xE8, 0x25,\n    0xB8, 0xB9, 0xAE, 0xB6, 0x5B, 0xD5, 0x9E, 0x5E, 0x41, 0x41, 0xDE, 0xC8, 0x8E, 0xE3, 0xEC, 0x88,\n    0xE8, 0xD6, 0x09, 0x16, 0xAB, 0x5C, 0x93, 0xC5, 0xAC, 0xA8, 0x70, 0x14, 0x8B, 0x9D, 0x87, 0x27,\n    0xC9, 0x07, 0x83, 0x94, 0xD3, 0xBD, 0x38, 0xF8, 0x92, 0xB9, 0xB0, 0xFB, 0xC2, 0xCF, 0x69, 0x0A,\n    0x6E, 0x39, 0xB4, 0x11, 0xD7, 0x54, 0xCF, 0x2C, 0x87, 0x94, 0x7E, 0xD8, 0x6D, 0xED, 0x54, 0xDF,\n    0xBA, 0xF6, 0x57, 0x2E, 0xE6, 0x5B, 0x26, 0x3E, 0xD2, 0xA3, 0xE6, 0xB3, 0x9B, 0x75, 0xD5, 0xBD,\n    0x76, 0x9E, 0xE5, 0x82, 0xA8, 0x4A, 0x2B, 0xC5, 0x45, 0x80, 0xC5, 0x55, 0x0A, 0x72, 0x78, 0x58,\n    0x3E, 0x88, 0x9D, 0x7D, 0x7C, 0x23, 0xE8, 0xCD, 0x1C, 0xAF, 0x7C, 0x43, 0xB1, 0xE0, 0x19, 0x96,\n    0x5C, 0xBC, 0xF7, 0x2A, 0x60, 0xF2, 0x50, 0x54, 0xCC, 0xE7, 0xF4, 0xD7, 0x2D, 0xDF, 0x03, 0xBB,\n    0x77, 0xCE, 0x9C, 0xB3, 0x9F, 0xC0, 0xBC, 0xC3, 0xBB, 0x47, 0xC6, 0xAE, 0x1A, 0x0A, 0x57, 0x52,\n    0xA5, 0x75, 0xB5, 0x32, 0x62, 0x9A, 0x11, 0xD6, 0x45, 0x03, 0xFC, 0xAA, 0x43, 0x55, 0x4D, 0xDC,\n    0xE8, 0x0F, 0xBC, 0x46, 0x5B, 0x57, 0x37, 0x9F, 0xD4, 0x5E, 0xFC, 0xD4, 0x7A, 0x1B, 0x67, 0xB7,\n    0x2A, 0xBE, 0x6A, 0x58, 0xF6, 0x21, 0x20, 0x29, 0x90, 0xC9, 0xB1, 0x25, 0x05, 0xF2, 0x95, 0x5F,\n    0xA2, 0x3E, 0x39, 0xFC, 0xF0, 0x08, 0x61, 0xE5, 0xB2, 0x9A, 0xFB, 0xE0, 0x9D, 0x40, 0x5D, 0xE4,\n    0x2D, 0x62, 0x37, 0x8E, 0x02, 0x5A, 0xA1, 0xD5, 0x63, 0x9A, 0xE2, 0x77, 0x46, 0xC6, 0xD1, 0x10,\n    0xAA, 0x46, 0x1D, 0x22, 0x46, 0x2F, 0xE9, 0x95, 0xF4, 0xD5, 0x69, 0xE6, 0x70, 0xDC, 0x09, 0x4E,\n    0x0D, 0xA6, 0xD6, 0x16, 0x97, 0xD1, 0x4C, 0xD3, 0xD7, 0x0B, 0x4C, 0x97, 0x66, 0xC0, 0x3F, 0x91,\n    0xB0, 0x9E, 0x2F, 0x00, 0xF1, 0x10, 0x78, 0x50, 0x9F, 0xC6, 0x38, 0xC5, 0x46, 0xB0, 0x45, 0x53,\n    0x4F, 0x01, 0x7C, 0x46, 0xB2, 0x85, 0xBE, 0x89, 0xB3, 0x99, 0x33, 0xCB, 0x84, 0x07, 0x45, 0x40,\n    0x16, 0x0E, 0x2F, 0xE7, 0x5D, 0x0E, 0xFE, 0xF7, 0x68, 0xF3, 0x70, 0xED, 0x8C, 0x82, 0x2F, 0x48,\n    0x65, 0xD2, 0xCD, 0x3E, 0x65, 0xC3, 0xCD, 0x7A, 0x3D, 0xAD, 0xA0, 0xB4, 0x29, 0x57, 0x26, 0xF1,\n    0xFF, 0xA1, 0x92, 0x9F, 0x64, 0xAF, 0x1D, 0xB4, 0xF1, 0xDD, 0x4F, 0xC8, 0x1C, 0x1A, 0x8A, 0x26,\n    0x3D, 0xBC, 0xC8, 0x57, 0x92, 0xDB, 0xAA, 0x5D, 0x5B, 0x7F, 0x77, 0xC5, 0x47, 0x02, 0x34, 0x25,\n    0x60, 0xC5, 0x7B, 0x8C, 0x84, 0x30, 0x9D, 0xF2, 0x8A, 0x14, 0x6D, 0x55, 0x14, 0xA4, 0xA2, 0x56,\n    0xFC, 0x26, 0x9F, 0x1B, 0x66, 0xCC, 0x5F, 0x69, 0xF5, 0x9B, 0x43, 0xA0, 0xFC, 0x84, 0x00, 0x1F,\n    0x85, 0x6A, 0x9C, 0x23, 0x99, 0x6F, 0xF1, 0xFC, 0x8E, 0x07, 0xC4, 0x62, 0x73, 0xEA, 0xFD, 0x7F,\n    0x92, 0x28, 0xE1, 0xC1, 0x51, 0x5B, 0xDC, 0x2D, 0xB1, 0x88, 0xE5, 0x8C, 0x69, 0x18, 0xF3, 0xD7,\n    0xFF, 0x76, 0x35, 0x83, 0x0A, 0x54, 0x59, 0x22, 0x31, 0x83, 0x26, 0xB8, 0x5F, 0x26, 0xA7, 0x73,\n    0x50, 0xB1, 0xB7, 0x53, 0x82, 0x2C, 0x15, 0x65, 0xDF, 0xF9, 0x5E, 0x2A, 0x9A, 0x7E, 0x19, 0xEE,\n    0xBE, 0xDE, 0xA8, 0xB2, 0x82, 0x58, 0x06, 0xE1, 0xD1, 0xAB, 0xE6, 0x15, 0x7A, 0x31, 0x1B, 0x4B,\n    0xF6, 0xEE, 0x49, 0x25, 0xB3, 0x68, 0xFE, 0x25, 0x6C, 0x46, 0x9B, 0x88, 0xFA, 0x4C, 0xFC, 0x90,\n    0xA5, 0x6B, 0x40, 0x07, 0xDB, 0xA5, 0xE5, 0x97, 0x20, 0xD5, 0xE3, 0x0A, 0xC9, 0xB8, 0x55, 0xDD,\n    0x9B, 0xBA, 0x11, 0x06, 0x4C, 0x3D, 0x34, 0x09, 0xD1, 0xAA, 0x87, 0x5B, 0x95, 0xDD, 0xF9, 0x5D,\n    0x7E, 0x53, 0xE3, 0x31, 0x46, 0xAB, 0x33, 0x12, 0x0B, 0xB8, 0xEB, 0x4C, 0x2F, 0x95, 0x0D, 0x39,\n    0xD5, 0xB4, 0xED, 0x96, 0xCE, 0xC0, 0x5A, 0xA3, 0x16, 0xB8, 0x9A, 0x68, 0xDC, 0xE9, 0x3B, 0xC6,\n    0x36, 0x75, 0x8C, 0x8E, 0x25, 0x97, 0xF7, 0x81, 0xC2, 0xAC, 0x3F, 0x5E, 0x6B, 0x4C, 0x7E, 0x95,\n    0xAE, 0xD1, 0x50, 0x91, 0x15, 0x67, 0x8E, 0xC8, 0xF2, 0x81, 0x8A, 0x6B, 0xBF, 0x4B, 0xC6, 0xAF,\n    0xCD, 0x04, 0xCC, 0x16, 0xA2, 0x43, 0x7A, 0x78, 0x56, 0xC1, 0x7E, 0xC8, 0xBE, 0x91, 0x9D, 0x7B,\n    0x9C, 0xAC, 0x7E, 0x18, 0xFA, 0xEB, 0xAD, 0x1F, 0x28, 0xE0, 0x61, 0x81, 0xC3, 0xD3, 0x24, 0x78,\n    0x08, 0xE6, 0xD5, 0x91, 0x83, 0x36, 0xA4, 0x1A, 0xB8, 0xCF, 0x93, 0x4F, 0x26, 0x6C, 0xC1, 0x7F,\n    0x48, 0x93, 0xD2, 0xD6, 0xC2, 0x33, 0x5C, 0x9D, 0x3F, 0x84, 0x7C, 0xD7, 0x8B, 0xBC, 0x9A, 0xDC,\n    0x46, 0x84, 0xCC, 0x72, 0xF7, 0x7C, 0xEE, 0xA8, 0x37, 0x54, 0x77, 0xD8, 0x21, 0x44, 0xA3, 0x3A,\n    0xBD, 0xCF, 0x65, 0xF3, 0xDB, 0xD0, 0x6F, 0xCA, 0x19, 0xCD, 0xAC, 0xBD, 0x66, 0x92, 0x89, 0xDF,\n    0x2B, 0xFE, 0x8D, 0x28, 0xBA, 0x79, 0x5B, 0xBF, 0x66, 0x67, 0x05, 0xE9, 0xA6, 0xFD, 0x56, 0xD6,\n    0x63, 0x8A, 0x23, 0x01, 0x24, 0x5A, 0x6D, 0x43, 0xCD, 0x26, 0x13, 0x2E, 0x48, 0x46, 0x01, 0x20,\n    0x52, 0x5A, 0xD8, 0x34, 0x75, 0xF5, 0x4E, 0x63, 0x56, 0x17, 0x35, 0x10, 0x29, 0x4B, 0xDD, 0x0B,\n    0xA5, 0xAF, 0x95, 0x92, 0xEE, 0x11, 0x99, 0xD2, 0xEA, 0x30, 0x80, 0x16, 0xB3, 0xF8, 0x96, 0x24,\n    0xED, 0x98, 0x5F, 0x4F, 0x02, 0xBB, 0x69, 0xDD, 0x30, 0x1C, 0xBE, 0x3F, 0x1B, 0x33, 0x2A, 0xA7,\n    0x83, 0xD7, 0x0E, 0x3D, 0x49, 0x58, 0xEF, 0x61, 0x0D, 0x1C, 0x6B, 0x1B, 0x41, 0xB7, 0xB3, 0x64,\n    0xF9, 0xE1, 0x1F, 0xF2, 0x4B, 0xC8, 0xED, 0xC7, 0xEE, 0x3A, 0xCB, 0xCD, 0x18, 0x40, 0x28, 0x2F,\n    0x1C, 0x41, 0x02, 0x31, 0x7A, 0xC3, 0x71, 0x75, 0x21, 0x49, 0x65, 0x6D, 0x32, 0xAC, 0x06, 0x42,\n    0x11, 0x96, 0xB2, 0xEC, 0xD9, 0x5D, 0xD3, 0xB4, 0xB1, 0x21, 0xFF, 0x98, 0x9F, 0xD6, 0x77, 0x70,\n    0x6B, 0xA4, 0x6E, 0x45, 0x69, 0x8C, 0xDB, 0x77, 0x92, 0x80, 0xF3, 0x82, 0x95, 0x2E, 0x73, 0xA6,\n    0x7E, 0xAA, 0x6F, 0xE2, 0x78, 0x82, 0x9E, 0x78, 0x3C, 0xB7, 0x5A, 0x90, 0xA0, 0xE8, 0xB4, 0x5D,\n    0x7A, 0xA8, 0xCE, 0xAC, 0xBA, 0x00, 0xEA, 0x0F, 0xDF, 0x6B, 0x75, 0x4C, 0x0D, 0x1C, 0x30, 0x7F,\n    0x6E, 0xFA, 0x03, 0xDC, 0x6B, 0x48, 0xE0, 0x74, 0xD9, 0xB9, 0x67, 0x9D, 0x0B, 0x55, 0xD3, 0xFE,\n    0x68, 0x79, 0xF7, 0x10, 0x7F, 0x9E, 0xE1, 0xB9, 0x60, 0xE7, 0x54, 0x13, 0x67, 0x2C, 0x04, 0x48,\n    0xDF, 0xD9, 0x85, 0x2C, 0xFF, 0x1E, 0x01, 0x61, 0x0F, 0x74, 0x2C, 0x21, 0x69, 0x3F, 0xE6, 0x7A,\n    0xF3, 0xD7, 0xE6, 0xD3, 0xBF, 0x77, 0x83, 0xC8, 0xF5, 0x5D, 0xF4, 0x4D, 0xC6, 0x0B, 0xEC, 0x46,\n    0x39, 0xDA, 0xBD, 0x39, 0x51, 0xB9, 0xF2, 0xC3, 0x48, 0x41, 0xDA, 0x1E, 0x2F, 0xD8, 0xFB, 0x7F,\n    0x9E, 0x9C, 0x10, 0xF1, 0xB2, 0x2A, 0x14, 0xD1, 0x3C, 0x38, 0x0F, 0x21, 0x9D, 0xAF, 0x64, 0x95,\n    0x46, 0x6A, 0xD2, 0x28, 0x14, 0x16, 0xF0, 0x28, 0x43, 0xC9, 0x81, 0x1D, 0x1E, 0xB7, 0x0D, 0x84,\n    0x8B, 0x30, 0xFD, 0xE3, 0xBB, 0x46, 0x5E, 0xFD, 0xEA, 0x0A, 0x9E, 0x02, 0x3F, 0x5E, 0xE5, 0x00,\n    0x97, 0xFB, 0x0D, 0xEA, 0xF8, 0x66, 0x7F, 0xB3, 0x6D, 0x2E, 0xFD, 0xC8, 0x15, 0x97, 0xE0, 0xDB,\n    0x44, 0x59, 0xBC, 0x32, 0xB7, 0x70, 0x61, 0x88, 0xC9, 0x81, 0x21, 0xA4, 0x82, 0x8D, 0x27, 0x67,\n    0x33, 0x31, 0xE5, 0x6B, 0x94, 0x26, 0xB9, 0xC3, 0xB8, 0x45, 0x69, 0x5D, 0x0B, 0xD2, 0xB1, 0x3A,\n    0x03, 0x40, 0x8B, 0x06, 0x79, 0x76, 0x63, 0x24, 0x61, 0xB9, 0x26, 0x64, 0x14, 0xC3, 0x9C, 0x9A,\n    0xFA, 0xD9, 0xBF, 0x7B, 0x6A, 0xB3, 0x2B, 0x9C, 0x9A, 0x8D, 0x9A, 0x11, 0x9B, 0xF7, 0x9D, 0xD2,\n    0xF8, 0xE4, 0x74, 0x6D, 0x5E, 0x12, 0xD9, 0xC2, 0xE3, 0x7D, 0xDE, 0xDA, 0x57, 0xD6, 0xEF, 0x9A,\n    0xB1, 0x13, 0xF0, 0xC5, 0x99, 0x5B, 0x88, 0xE2, 0x9B, 0xDF, 0x3B, 0x62, 0x9F, 0x3C, 0x10, 0x38,\n    0x91, 0xFA, 0x97, 0x82, 0x44, 0x36, 0x65, 0x8C, 0xA2, 0x47, 0x9B, 0x10, 0x12, 0x96, 0xA1, 0x4E,\n    0x0E, 0x57, 0x42, 0x62, 0xF4, 0xE6, 0xAF, 0x23, 0xC0, 0xB4, 0xA0, 0x49, 0x5A, 0x33, 0xA9, 0x4D,\n    0xB1, 0xB0, 0x5B, 0x0C, 0x6A, 0x67, 0x47, 0xFB, 0x03, 0x7C, 0x1F, 0x15, 0xA1, 0x72, 0x99, 0xBE,\n    0x84, 0x58, 0x68, 0x36, 0x13, 0x34, 0x0C, 0x20, 0x11, 0xDB, 0x68, 0x30, 0x9F, 0xEA, 0x05, 0x99,\n    0xDC, 0x30, 0xF3, 0xA7, 0xA9, 0x3C, 0x7D, 0xA8, 0x3C, 0x0D, 0x43, 0xCB, 0xCC, 0xA5, 0x40, 0xCF,\n    0x0F, 0xF4, 0x34, 0x91, 0x79, 0x36, 0xB8, 0x4D, 0x25, 0x3E, 0xF7, 0x69, 0xC7, 0x31, 0x9D, 0x45,\n    0xEC, 0x3C, 0x3D, 0x99, 0x13, 0x54, 0x19, 0x3D, 0xDD, 0x2B, 0xE9, 0x6B, 0xE0, 0xCE, 0xB7, 0xBF,\n    0x8F, 0x47, 0x0F, 0x1A, 0x43, 0x14, 0x4C, 0xAB, 0xD4, 0xEE, 0xAC, 0x55, 0x0C, 0x4D, 0x7E, 0xA5,\n    0x40, 0xE9, 0xD0, 0x0A, 0xC0, 0xCD, 0xB8, 0xB4, 0x31, 0x63, 0xEB, 0x78, 0xE9, 0x32, 0x19, 0xE3,\n    0xFB, 0xA4, 0xCF, 0x48, 0x39, 0x92, 0xA5, 0xAA, 0xA0, 0x4E, 0xA1, 0xF3, 0x2E, 0x1A, 0x59, 0x62,\n    0xA4, 0xC0, 0x7B, 0xAC, 0xCA, 0xAD, 0x52, 0xA4, 0xB7, 0x6F, 0x4B, 0x67, 0x5E, 0x5E, 0x2A, 0xE0,\n    0xEC, 0x9B, 0xA7, 0xD6, 0x65, 0xD4, 0x60, 0xF3, 0x48, 0xDF, 0x45, 0xF3, 0xFD, 0xB5, 0x0F, 0xC9,\n    0xE6, 0x10, 0x78, 0x4D, 0xAD, 0x30, 0xD1, 0x07, 0xEA, 0x38, 0x6A, 0xE3, 0x3B, 0x10, 0x99, 0x1A,\n    0xA6, 0xDE, 0x2D, 0x9D, 0x1D, 0xCE, 0x5D, 0x26, 0x76, 0x25, 0x87, 0x43, 0xA1, 0xBD, 0xE9, 0xA9,\n    0xB8, 0xA0, 0x1E, 0x88, 0x1A, 0x6A, 0x99, 0x79, 0x01, 0x32, 0x3A, 0x4C, 0x3B, 0xC1, 0xB5, 0x18,\n    0x72, 0x32, 0x0F, 0x7B, 0x91, 0x38, 0x66, 0x8A, 0x16, 0x12, 0xAF, 0xBE, 0x5F, 0x73, 0xA3, 0x0A,\n    0x1D, 0x97, 0x35, 0x87, 0x53, 0x27, 0xB6, 0x5B, 0x43, 0x12, 0xB4, 0xEC, 0xF0, 0x2F, 0x16, 0x59,\n    0x6E, 0x11, 0x2C, 0x20, 0x11, 0xAB, 0x84, 0x2B, 0x7F, 0x9C, 0x82, 0x19, 0x5D, 0xD3, 0x9A, 0x18,\n    0xA2, 0xFF, 0x38, 0x7A, 0x07, 0xD3, 0xBE, 0x23, 0x5C, 0x33, 0x00, 0x99, 0xFE, 0xE0, 0xFC, 0xC0,\n    0x35, 0x05, 0x89, 0xFF, 0x58, 0x93, 0x20, 0x41, 0xDC, 0xD0, 0x27, 0x31, 0xA0, 0xD5, 0xAC, 0xBF,\n    0x78, 0x87, 0x23, 0x33, 0xBF, 0x52, 0xE2, 0xDB, 0x24, 0xB8, 0x83, 0xE1, 0x26, 0x42, 0x8C, 0x1D,\n    0xD4, 0xD4, 0xFC, 0xE3, 0x34, 0xF4, 0x5D, 0x98, 0x17, 0xA1, 0xC4, 0x2A, 0x48, 0x3C, 0x4E, 0x89,\n    0x7D, 0x03, 0x38, 0xE3, 0x13, 0x66, 0xD4, 0x76, 0xB2, 0x93, 0xD2, 0x9C, 0x75, 0x3F, 0xD3, 0x91,\n    0x34, 0xAF, 0x61, 0x55, 0x1D, 0xE8, 0x4C, 0x2F, 0x59, 0x2A, 0x64, 0x05, 0xB9, 0x1D, 0xC1, 0x0B,\n    0x1F, 0x4B, 0xFF, 0x83, 0xAB, 0xBE, 0xB7, 0xB5, 0xF2, 0x23, 0x78, 0xD1, 0xA3, 0x81, 0x8F, 0xF2,\n    0x7C, 0xC6, 0xE7, 0x9F, 0x29, 0xD2, 0x81, 0xFE, 0x50, 0x1C, 0xE7, 0xEF, 0xBF, 0x7F, 0x1C, 0x2A,\n    0x3F, 0x1A, 0x7C, 0x5E, 0xF7, 0xF5, 0x1B, 0x11, 0x8D, 0xB1, 0xF3, 0xC7, 0xE3, 0x38, 0x43, 0x56,\n    0x1A, 0x1E, 0x26, 0xE6, 0xD4, 0x15, 0x84, 0x03, 0x04, 0x49, 0xBD, 0xA0, 0xC0, 0x21, 0xC8, 0x8E,\n    0xC9, 0x96, 0x9B, 0xFA, 0xCA, 0x98, 0xAE, 0x2F, 0xE2, 0x9A, 0x9B, 0xEC, 0x29, 0x8F, 0xF2, 0x04,\n    0xEA, 0x94, 0xB9, 0x70, 0xED, 0xB1, 0x4E, 0x2B, 0x5C, 0x65, 0x00, 0x79, 0x41, 0x53, 0x4B, 0x9D,\n    0xFA, 0x90, 0x22, 0x52, 0x76, 0x51, 0xEC, 0xC2, 0x50, 0xCC, 0x6C, 0xA1, 0x5B, 0x4A, 0xAC, 0x58,\n    0x8F, 0x97, 0x0D, 0xFE, 0xE5, 0x3C, 0x24, 0x34, 0xDC, 0xF2, 0x7A, 0x81, 0xA7, 0x9D, 0x3D, 0x28,\n    0x87, 0xCF, 0xF3, 0xD2, 0x51, 0x0D, 0xF1, 0x5C, 0x01, 0xD5, 0x58, 0x72, 0x33, 0xD7, 0x48, 0x4A,\n    0x75, 0xF5, 0x1A, 0x10, 0xF1, 0x12, 0x76, 0x70, 0xD2, 0x0E, 0x3A, 0x9B, 0x09, 0x23, 0x66, 0xED,\n    0x15, 0xB7, 0xEB, 0x5D, 0xEF, 0x66, 0xEB, 0x8F, 0xAF, 0xD7, 0xDC, 0xF6, 0x5E, 0xA5, 0xED, 0xA8,\n    0x77, 0xE2, 0xC0, 0xF6, 0x19, 0xFE, 0x38, 0xEC, 0x2D, 0xCC, 0x82, 0xC6, 0x21, 0x22, 0x69, 0x67,\n    0xE4, 0x86, 0x26, 0x0E, 0xCC, 0x88, 0x55, 0x6A, 0x17, 0xC6, 0xD0, 0x5F, 0x1C, 0x68, 0x72, 0x08,\n    0x2D, 0x8B, 0xB7, 0xD7, 0xAF, 0x85, 0x0C, 0xC5, 0x9F, 0x4F, 0x6D, 0x0B, 0x34, 0xA2, 0x8D, 0x6D,\n    0x92, 0x31, 0x6C, 0x92, 0x91, 0xFE, 0x3F, 0xC0, 0xA5, 0x4A, 0x58, 0xA7, 0x23, 0x06, 0xA7, 0xE3,\n    0xAF, 0xC6, 0xF5, 0x4C, 0x9D, 0x2A, 0x74, 0x4D, 0xAA, 0xD3, 0xA5, 0xD9, 0xB9, 0x4D, 0xDE, 0x2F,\n    0xA4, 0x69, 0x24, 0x56, 0x5F, 0xCA, 0x0F, 0x43, 0x1E, 0x58, 0xD4, 0x70, 0xD9, 0x11, 0x53, 0xE7,\n    0xB6, 0x9E, 0x8F, 0x06, 0xCA, 0xBF, 0x20, 0x59, 0xE9, 0x51, 0xAE, 0xBA, 0x68, 0x30, 0xDE, 0x5E,\n    0x9C, 0x4D, 0x0A, 0xD1, 0xF7, 0xFB, 0x1E, 0xEF, 0xE3, 0x71, 0xFC, 0x9E, 0x12, 0x96, 0xEF, 0xB7,\n    0xC1, 0xD5, 0x44, 0x48, 0x5E, 0x44, 0x32, 0xED, 0x52, 0xFA, 0x18, 0xA1, 0xAE, 0x6F, 0xCD, 0xDB,\n    0x83, 0x38, 0x8E, 0xD0, 0xEC, 0x8E, 0x3A, 0xEF, 0x43, 0x03, 0xF2, 0x68, 0x14, 0xE2, 0xD3, 0x7D,\n    0xF8, 0x2E, 0x23, 0xBC, 0x54, 0x52, 0x60, 0xE4, 0x89, 0xED, 0x87, 0x78, 0x21, 0x07, 0xF8, 0x24,\n    0x12, 0x1E, 0x99, 0x21, 0x36, 0x3F, 0x6B, 0xB1, 0xE5, 0x62, 0x46, 0x82, 0xC9, 0x44, 0x67, 0x33,\n    0x3E, 0x38, 0x62, 0x02, 0xA0, 0x48, 0x1B, 0xD7, 0xBD, 0x21, 0xAB, 0x2E, 0x62, 0x9E, 0x35, 0x8E,\n    0x3E, 0xDA, 0x2D, 0xA4, 0xDC, 0x7E, 0x43, 0x57, 0x45, 0x13, 0xD4, 0x62, 0x45, 0xAB, 0x95, 0x57,\n    0x4C, 0x56, 0x4C, 0xAD, 0x5F, 0xBF, 0xA0, 0x24, 0x23, 0x53, 0x71, 0xE5, 0xA1, 0x5C, 0x6C, 0xD3,\n    0xFD, 0xE6, 0x43, 0xFD, 0x28, 0x86, 0xA6, 0x63, 0xA7, 0x73, 0x35, 0xF0, 0xFD, 0xFF, 0xC7, 0x7B,\n    0x16, 0x38, 0x73, 0x9C, 0xFC, 0x65, 0x50, 0x94, 0x2D, 0x57, 0xE5, 0xDD, 0x8C, 0x3B, 0x68, 0x81,\n    0xEA, 0x90, 0xA5, 0x3F, 0xC2, 0x2F, 0x9C, 0xD6, 0x9F, 0xBA, 0x01, 0xD7, 0x8E, 0xA1, 0x71, 0xE2,\n    0xA5, 0x2A, 0x6A, 0xA5, 0xFA, 0xE1, 0x6F, 0x44, 0x13, 0x56, 0x16, 0x3A, 0x1A, 0xBA, 0xBE, 0x5D,\n    0xA6, 0xFA, 0x73, 0xEB, 0x05, 0xE0, 0x88, 0x8A, 0xEB, 0x5A, 0x50, 0xF5, 0xFC, 0x86, 0xA2, 0x35,\n    0x41, 0x03, 0x72, 0x92, 0x4A, 0x8F, 0x73, 0xF0, 0x05, 0x2A, 0xA4, 0x8C, 0x5C, 0x46, 0xEB, 0xE9,\n    0xE3, 0x3C, 0x6F, 0xB2, 0x23, 0x6B, 0xA0, 0x77, 0xED, 0xA9, 0x95, 0x5C, 0x50, 0xA3, 0x01, 0xB0,\n    0x8D, 0xE9, 0x5B, 0x5C, 0x0B, 0x91, 0xF5, 0x32, 0x9D, 0x52, 0xA1, 0x45, 0x21, 0x45, 0x4A, 0xEA,\n    0x42, 0x8A, 0x7A, 0x91, 0xA0, 0x34, 0x95, 0x85, 0xEC, 0x84, 0x21, 0xEB, 0x9E, 0x6C, 0xC8, 0xE5,\n    0x5C, 0x5F, 0xAF, 0x0C, 0xC8, 0x17, 0xC8, 0x87, 0x3C, 0x10, 0xD2, 0x20, 0x03, 0x08, 0xD3, 0x3E,\n    0xC6, 0x70, 0x33, 0xFE, 0x9E, 0x11, 0x85, 0xDC, 0xB2, 0xD6, 0xEA, 0x83, 0xD2, 0xE2, 0x41, 0x1E,\n    0x70, 0x0E, 0xED, 0xE5, 0x64, 0xBC, 0x83, 0x6F, 0x1F, 0xEF, 0xC4, 0xFE, 0x20, 0x99, 0x87, 0xF6,\n    0x76, 0x76, 0x4B, 0xC2, 0xEF, 0x9C, 0xA9, 0xED, 0x33, 0xF8, 0x6A, 0x64, 0x83, 0x76, 0xAE, 0x5D,\n    0x48, 0xAA, 0x08, 0x64, 0x95, 0xB8, 0x8F, 0x33, 0xB3, 0x88, 0x07, 0x55, 0xDB, 0x6C, 0xA5, 0x1E,\n    0x3B, 0xCA, 0x76, 0xDC, 0x0D, 0x85, 0x02, 0xA2, 0xEC, 0xB5, 0x0F, 0xC4, 0x52, 0x11, 0x57, 0xF5,\n    0x2D, 0x8D, 0xFB, 0x3C, 0x49, 0xC7, 0x59, 0x68, 0x3A, 0x62, 0xC9, 0x28, 0xCD, 0x81, 0x98, 0x10,\n    0xB0, 0x71, 0x3B, 0x96, 0xB9, 0xC2, 0x16, 0x14, 0x88, 0xCC, 0x56, 0x1A, 0xD2, 0x78, 0xBC, 0x53,\n    0x4A, 0xA8, 0x27, 0xDE, 0x8A, 0x5B, 0xEF, 0x58, 0x97, 0x95, 0x02, 0xF3, 0x76, 0xC1, 0xA2, 0x01,\n    0xB8, 0xD2, 0xB8, 0xAC, 0xC5, 0xB3, 0x36, 0x33, 0x7C, 0x1A, 0xCA, 0x06, 0x4C, 0x09, 0xBC, 0x3C,\n    0x0B, 0x0A, 0xD8, 0xAC, 0x74, 0x25, 0xA4, 0x91, 0xDB, 0x13, 0xE5, 0x2B, 0x09, 0xC7, 0x3D, 0x99,\n    0xFB, 0x4F, 0xFF, 0xB4, 0x9C, 0x9E, 0x89, 0xF8, 0xD3, 0xAC, 0xCF, 0x37, 0xEA, 0x3F, 0xAC, 0x3E,\n    0x8F, 0x7E, 0xFD, 0x66, 0x97, 0xF1, 0x8A, 0x94, 0xE0, 0x36, 0x2A, 0x48, 0x1C, 0xA9, 0x5B, 0x1E,\n    0x4D, 0xCC, 0xB0, 0xF6, 0xA6, 0x26, 0x2E, 0x6D, 0x29, 0x6E, 0x89, 0x30, 0x6C, 0x2B, 0xA3, 0x04,\n    0xD4, 0x8F, 0x8C, 0xCB, 0xA7, 0xA2, 0x05, 0x94, 0x93, 0xE9, 0x9B, 0x03, 0x18, 0x91, 0x76, 0x25,\n    0x42, 0xF6, 0xC1, 0xE1, 0xE8, 0x6B, 0x56, 0xEF, 0x61, 0xED, 0xDB, 0xF7, 0xD6, 0xD3, 0x50, 0xB1,\n    0x59, 0xAE, 0x79, 0x22, 0xEB, 0xCC, 0x39, 0x3E, 0x10, 0xD7, 0x21, 0x04, 0x7D, 0xEF, 0x96, 0x73,\n    0xBC, 0x6C, 0xE5, 0x0D, 0x15, 0x8A, 0x94, 0x07, 0x14, 0x96, 0x86, 0x31, 0x68, 0xD6, 0xC0, 0xE7,\n    0xE5, 0xEE, 0x6C, 0x77, 0xBD, 0x9E, 0xD9, 0x27, 0xE7, 0x68, 0x1E, 0x57, 0x1A, 0x0D, 0x01, 0xDD,\n    0x3B, 0xAF, 0x85, 0x5A, 0xA3, 0x49, 0x4A, 0xCB, 0x1D, 0x2E, 0xC4, 0xFE, 0x39, 0x50, 0x36, 0x5C,\n    0xF8, 0xE4, 0xC4, 0x0D, 0x6A, 0x84, 0xCC, 0xC1, 0x5C, 0xF1, 0x72, 0x34, 0x1B, 0xAE, 0x8E, 0xFB,\n    0x45, 0x23, 0xBE, 0xC5, 0x4B, 0xAE, 0xC2, 0xC9, 0x74, 0xF5, 0x83, 0x84, 0x26, 0x7A, 0xFA, 0x8D,\n    0xFF, 0x34, 0x68, 0xDE, 0x39, 0xB3, 0xDB, 0x15, 0xDB, 0x13, 0xC2, 0x59, 0xDE, 0x5F, 0x78, 0xD2,\n    0x04, 0x1D, 0x3A, 0x45, 0x7B, 0xCD, 0xB5, 0xC4, 0x51, 0xCF, 0x8F, 0xAD, 0x2E, 0x61, 0x23, 0xEC,\n    0x66, 0x37, 0x2D, 0x4A, 0xB3, 0xD4, 0xCA, 0x8C, 0x37, 0x3F, 0xAE, 0x15, 0x3F, 0xBE, 0xE7, 0x5E,\n    0x2D, 0xAD, 0x95, 0x30, 0xFB, 0x35, 0x42, 0xC9, 0xFB, 0xF1, 0x5A, 0xD0, 0x20, 0x3A, 0x06, 0xF5,\n    0x1D, 0x2D, 0xDB, 0xAC, 0x4C, 0xEB, 0x02, 0xF0, 0x11, 0x4D, 0xC9, 0x24, 0x46, 0x5E, 0x1A, 0xAA,\n    0x24, 0xE8, 0x0B, 0xAC, 0x83, 0xAD, 0x12, 0x9D, 0xD1, 0x79, 0xBC, 0xE0, 0xF7, 0x56, 0x21, 0x90,\n    0x71, 0x7D, 0x6D, 0x36, 0x59, 0xC3, 0xF8, 0x4C, 0x60, 0xBF, 0x0B, 0xF4, 0x29, 0x60, 0x65, 0xF3,\n    0xC7, 0x48, 0xAC, 0x8F, 0x7C, 0x5D, 0x4B, 0xF8, 0x75, 0x5E, 0x94, 0x97, 0x1C, 0x02, 0x70, 0xED,\n    0xA3, 0xC4, 0x22, 0xB6, 0x10, 0xFA, 0x74, 0x00, 0x8C, 0x73, 0x6C, 0xC7, 0xB2, 0xFA, 0x6E, 0x0F,\n    0x42, 0x8B, 0xF5, 0xB7, 0xF0, 0xE9, 0x29, 0xE8, 0x48, 0xB3, 0x1C, 0xD2, 0xAB, 0xA1, 0xA5, 0x8B,\n    0x1C, 0x43, 0x44, 0xEF, 0xE9, 0x95, 0xC8, 0xA6, 0xE9, 0x48, 0x8C, 0x73, 0xFA, 0x6C, 0x9C, 0xC4,\n    0xAE, 0x2B, 0xB3, 0xC9, 0x11, 0x06, 0x20, 0xA9, 0x00, 0xFB, 0x50, 0x1D, 0x73, 0x68, 0xD5, 0xC0,\n    0x4D, 0x38, 0x4C, 0xAA, 0x93, 0xC0, 0x24, 0x25, 0xE0, 0x55, 0x0C, 0x6F, 0xE8, 0xA2, 0x66, 0x3C,\n    0xE0, 0x5E, 0x5C, 0x2F, 0xBC, 0x27, 0x66, 0x99, 0x0E, 0xF6, 0xFE, 0xCF, 0x14, 0x19, 0x0E, 0x9D,\n    0x75, 0xCF, 0xE9, 0x29, 0xC1, 0x77, 0x26, 0xF5, 0x78, 0xA5, 0x4E, 0x7D, 0x7F, 0x3F, 0x33, 0x11,\n    0x5F, 0x26, 0xCD, 0xCB, 0x5B, 0x47, 0xD4, 0x37, 0x4C, 0xBA, 0x38, 0x59, 0x23, 0x80, 0x84, 0xEF,\n    0x3C, 0xCC, 0xD6, 0xA9, 0x71, 0xA3, 0xFE, 0x5B, 0xD5, 0x3B, 0x21, 0x52, 0xC2, 0xD6, 0x1B, 0x71,\n    0x3B, 0x06, 0x55, 0x5C, 0x1B, 0x77, 0xAB, 0x80, 0x0B, 0x17, 0xCB, 0x14, 0x72, 0x87, 0xFB, 0x81,\n    0xD4, 0xFB, 0xB7, 0xD0, 0x84, 0x65, 0x9B, 0x6F, 0x2B, 0xD5, 0x7A, 0x12, 0xA8, 0x2A, 0xBE, 0xA5,\n    0xE7, 0xE2, 0x8F, 0x05, 0x1A, 0x54, 0x10, 0xAA, 0x72, 0x34, 0xF6, 0xE9, 0x08, 0x6B, 0xB4, 0xFC,\n    0x69, 0xAF, 0x26, 0x5F, 0xC5, 0x72, 0x61, 0x96, 0x3A, 0xD6, 0xE4, 0x5B, 0xBA, 0xCB, 0x0C, 0xD1,\n    0xAE, 0xF8, 0x19, 0xFA, 0xB6, 0xCF, 0x0C, 0xCC, 0xFC, 0xCD, 0x82, 0x15, 0xAC, 0x36, 0x04, 0x80,\n    0x75, 0x3D, 0x8D, 0xF9, 0x36, 0x57, 0x4F, 0x7C, 0x55, 0x60, 0xE0, 0x2F, 0xB4, 0x89, 0x9E, 0x77,\n    0xED, 0xCB, 0x19, 0x96, 0xB4, 0xC0, 0x5E, 0xBE, 0x4E, 0xEF, 0xB9, 0xA7, 0xCB, 0x92, 0x68, 0x74,\n    0xF0, 0x9A, 0x38, 0xE1, 0x15, 0x67, 0x64, 0xE0, 0x70, 0x08, 0x36, 0xED, 0xC4, 0x47, 0x11, 0xD6,\n    0x79, 0x5E, 0x12, 0x4A, 0x50, 0xD8, 0xFE, 0x7D, 0x09, 0x67, 0x11, 0x53, 0x2B, 0x2E, 0x6F, 0x5B,\n    0x91, 0xF5, 0x1A, 0xAA, 0x0C, 0x0C, 0x50, 0x45, 0x0B, 0x94, 0x01, 0x16, 0xB7, 0x83, 0x9A, 0xF6,\n    0xCC, 0x45, 0x79, 0x7C, 0xD0, 0x9C, 0xFD, 0x66, 0xB1, 0xBD, 0xCF, 0x70, 0xBC, 0x77, 0xF4, 0xA2,\n    0xEE, 0x6F, 0x13, 0x28, 0x48, 0x39, 0x81, 0xCB, 0x80, 0x52, 0xED, 0x49, 0xEE, 0x54, 0xFD, 0x59,\n    0x27, 0x51, 0x68, 0x8E, 0xFA, 0x46, 0x89, 0x9A, 0xCF, 0x48, 0x45, 0x9F, 0xA5, 0x6F, 0x16, 0x6C,\n    0x3C, 0x36, 0x41, 0xF7, 0x06, 0xAA, 0x3A, 0x7D, 0xFF, 0x4E, 0x37, 0xE6, 0x7D, 0x83, 0x9F, 0xDE,\n    0x6E, 0xBC, 0x7C, 0x95, 0xEF, 0x93, 0x82, 0x42, 0x43, 0xAA, 0xC2, 0x85, 0xBA, 0x7E, 0x9C, 0xB6,\n    0xD4, 0xE1, 0x11, 0xB2, 0x44, 0xDC, 0xFF, 0xC7, 0x5C, 0x92, 0xCE, 0xC0, 0xBC, 0xA7, 0xB2, 0x41,\n    0x75, 0x05, 0x4F, 0x00, 0xB9, 0x23, 0xF2, 0xCA, 0xE9, 0x65, 0x23, 0x24, 0x49, 0xA4, 0x15, 0x8E,\n    0x10, 0xB1, 0xC1, 0x2F, 0xCA, 0xB4, 0xAF, 0x86, 0xF7, 0x80, 0x3D, 0xF2, 0xC1, 0x5A, 0x42, 0x2F,\n    0xC7, 0x39, 0xFD, 0x06, 0x74, 0xEF, 0x15, 0xEB, 0xE0, 0x24, 0x8F, 0x7B, 0xEE, 0xE0, 0xE4, 0x1D,\n    0x5F, 0x2A, 0x88, 0xDC, 0x9E, 0xB5, 0xA9, 0x9F, 0xDE, 0x73, 0x2C, 0x7A, 0xF3, 0x9B, 0x32, 0xF3,\n    0xF4, 0x5F, 0x3C, 0x5E, 0xBE, 0xBA, 0xA0, 0xEA, 0xB6, 0x0B, 0x00, 0x10, 0xE5, 0xBA, 0x6C, 0x62,\n    0x26, 0x27, 0x62, 0x3B, 0x48, 0x5C, 0x60, 0xEE, 0xEB, 0xFA, 0xEE, 0xB1, 0x6C, 0x0A, 0x46, 0xF3,\n    0x1E, 0xED, 0xA3, 0x1B, 0xF3, 0x60, 0x02, 0xF3, 0x60, 0x6A, 0x1A, 0x8A, 0x33, 0x70, 0x13, 0x7C,\n    0x5F, 0xC6, 0xEF, 0x8A, 0x15, 0xCB, 0xC1, 0x44, 0xDD, 0xEF, 0x73, 0x9D, 0x01, 0x70, 0xAF, 0xAA,\n    0x60, 0x34, 0xB4, 0x2D, 0x4B, 0xA1, 0xBB, 0x5B, 0xF2, 0x54, 0x0F, 0x10, 0xDD, 0xA4, 0xBB, 0xA4,\n    0xE5, 0xC4, 0x3D, 0xAE, 0xEF, 0x70, 0xF9, 0xED, 0x9A, 0x60, 0x2E, 0x22, 0xAB, 0xF5, 0xA8, 0x8A,\n    0xEA, 0x62, 0x05, 0x2A, 0x32, 0x31, 0x29, 0xDE, 0x4C, 0x8E, 0x8C, 0x6C, 0x4B, 0x70, 0xB0, 0x9C,\n    0x0A, 0x95, 0x52, 0xC6, 0x90, 0x0D, 0x2A, 0xAA, 0xAC, 0x07, 0x54, 0xCE, 0xFE, 0xF6, 0x95, 0xBB,\n    0xCD, 0xF3, 0xE4, 0x69, 0xC7, 0x44, 0x75, 0x63, 0x72, 0x84, 0x0E, 0xD5, 0x13, 0xE4, 0xFA, 0x48,\n    0xC1, 0x42, 0xD5, 0x5F, 0x6B, 0x88, 0x3D, 0x8E, 0x09, 0x67, 0x42, 0x61, 0x69, 0x72, 0xEE, 0xE3,\n    0xDF, 0x37, 0x75, 0x30, 0xCE, 0x9D, 0xE3, 0x0C, 0xF9, 0x16, 0x0C, 0xD2, 0x6F, 0x3C, 0x69, 0x8D,\n    0x8F, 0x1D, 0x78, 0x1C, 0x8B, 0x3A, 0x6C, 0xDF, 0x28, 0x5E, 0x76, 0x79, 0x89, 0x75, 0x82, 0xB7,\n    0x46, 0x97, 0xB3, 0xF2, 0x60, 0x98, 0x96, 0x5E, 0x5C, 0x24, 0x35, 0xA7, 0x0B, 0xA7, 0xB6, 0x96,\n    0x80, 0xD3, 0x9C, 0x38, 0xE2, 0xF3, 0x9B, 0x76, 0x86, 0x68, 0xC9, 0xA4, 0x08, 0x46, 0x8D, 0x1D,\n    0x5C, 0xF7, 0x68, 0x62, 0xBC, 0x6B, 0x7B, 0x1C, 0xE5, 0x72, 0x94, 0x4A, 0xAF, 0x2C, 0x74, 0x4D,\n    0x9A, 0x05, 0x90, 0xA6, 0xD9, 0x2C, 0xDF, 0x20, 0x2A, 0xE9, 0x0D, 0x8B, 0xDD, 0xD9, 0x97, 0x1D,\n    0x30, 0x8B, 0xC0, 0x23, 0xCD, 0x1E, 0xF4, 0x3C, 0x06, 0xA2, 0xDC, 0xE9, 0x13, 0xDA, 0xC7, 0x82,\n    0xC0, 0x5F, 0x08, 0x12, 0x7C, 0xEE, 0x7A, 0x3D, 0x95, 0xE9, 0xCB, 0xA2, 0xBC, 0xA0, 0x55, 0x18,\n    0x49, 0x83, 0x86, 0x62, 0xCF, 0x8F, 0xA6, 0xF1, 0x14, 0xAA, 0x0A, 0x5A, 0xE1, 0x96, 0xF7, 0x13,\n    0x0C, 0xC1, 0x09, 0xFD, 0xBF, 0x84, 0xEE, 0x6D, 0x0A, 0x34, 0x73, 0x88, 0xD8, 0x54, 0x61, 0x9A,\n    0x1F, 0x2B, 0x34, 0x36, 0x44, 0x34, 0x41, 0x7F, 0x09, 0x8F, 0x08, 0x08, 0x40, 0xA1, 0x70, 0x24,\n    0x30, 0x23, 0x02, 0x2D, 0x76, 0x39, 0xC0, 0xCA, 0xF1, 0xAC, 0xA2, 0xFA, 0x09, 0x07, 0xE0, 0x5D,\n    0xE2, 0x44, 0x0C, 0x2C, 0xAB, 0x77, 0x4C, 0xE7, 0x7E, 0xFA, 0xAB, 0xF3, 0x43, 0xAF, 0x6F, 0x5D,\n    0xC1, 0xE3, 0x81, 0x28, 0x9A, 0x47, 0xD4, 0xE5, 0x4B, 0x04, 0x0A, 0x47, 0xFD, 0xF6, 0x31, 0x6D,\n    0x54, 0xAD, 0x3B, 0x19, 0xF7, 0x28, 0x1D, 0x42, 0x7C, 0x3A, 0x4C, 0xCC, 0xB3, 0x66, 0xE2, 0x9F,\n    0x8C, 0x18, 0x0F, 0x77, 0xC4, 0xA3, 0xF4, 0x22, 0x75, 0x83, 0x65, 0xFB, 0x4F, 0x02, 0x71, 0xE6,\n    0x4A, 0x2D, 0x2F, 0xE2, 0x46, 0xB4, 0x0C, 0x39, 0x29, 0xAB, 0xC7, 0x3E, 0x38, 0xC3, 0x0B, 0xA5,\n    0xE8, 0xB5, 0xE6, 0x0E, 0xEC, 0x77, 0x7C, 0xD0, 0xBF, 0x2F, 0xB1, 0x27, 0x4F, 0x56, 0x73, 0xCA,\n    0x70, 0xA5, 0x35, 0x71, 0x4A, 0x42, 0xA5, 0x37, 0x0A, 0xA7, 0xAD, 0x27, 0x18, 0x02, 0x8C, 0x4B,\n    0x3A, 0xB1, 0x6D, 0x17, 0xC1, 0x81, 0x76, 0x70, 0x8D, 0xAC, 0xAD, 0x4A, 0xDD, 0x3D, 0x27, 0x18,\n    0x66, 0x63, 0x3A, 0x0D, 0xFC, 0xA2, 0x9F, 0xC5, 0x2E, 0x29, 0xD9, 0xA5, 0x0C, 0x4C, 0xA3, 0x6F,\n    0xA9, 0x3F, 0xFF, 0xB5, 0x83, 0x6B, 0x00, 0x93, 0x57, 0x39, 0x26, 0x6D, 0x40, 0x81, 0x89, 0x4A,\n    0xAE, 0x55, 0x06, 0x58, 0x75, 0x6F, 0x49, 0xC2, 0xFF, 0xA0, 0x92, 0x7B, 0xB6, 0x60, 0x80, 0x72,\n    0x52, 0xE5, 0x8D, 0x33, 0xC0, 0xB6, 0x3F, 0xF2, 0x2A, 0x81, 0x11, 0x8F, 0xF5, 0xA2, 0x98, 0x84,\n    0x59, 0x7C, 0xA8, 0xD5, 0x9C, 0xDE, 0x69, 0x4C, 0x67, 0xD9, 0xFB, 0xBC, 0x68, 0x29, 0x92, 0x25,\n    0x7D, 0xFD, 0x01, 0x8D, 0x60, 0xBC, 0xAE, 0x34, 0x00, 0x77, 0x06, 0x99, 0xD2, 0x9B, 0xFD, 0x69,\n    0xD5, 0x56, 0x00, 0xB0, 0x76, 0x71, 0x38, 0xCE, 0xBE, 0xAE, 0xA2, 0xA4, 0x8C, 0xA4, 0xE6, 0x78,\n    0x9E, 0x96, 0x2F, 0x92, 0xF3, 0x13, 0x22, 0x50, 0xE9, 0x0F, 0xB2, 0x0F, 0x31, 0x4E, 0xC7, 0x2E,\n    0xF0, 0x70, 0x21, 0x33, 0x41, 0xCA, 0xFA, 0xF0, 0x4D, 0xF8, 0xCD, 0x1E, 0x41, 0x42, 0xED, 0xAA,\n    0xA0, 0x49, 0x30, 0x2D, 0xBA, 0x1E, 0x11, 0x09, 0x14, 0x0E, 0x39, 0x32, 0x32, 0x22, 0x48, 0x93,\n    0xCF, 0x1A, 0xF8, 0xC1, 0x91, 0x6A, 0x0B, 0xCC, 0x76, 0x98, 0xD1, 0x2B, 0x9A, 0x40, 0xBF, 0x12,\n    0xD6, 0xFF, 0x20, 0x7E, 0x54, 0xB8, 0x4E, 0x65, 0xEB, 0xB3, 0x46, 0xD1, 0x44, 0x6A, 0x80, 0x19,\n    0x72, 0xFD, 0x39, 0x11, 0xD7, 0x7A, 0x7C, 0x03, 0x7D, 0x76, 0xE0, 0xB2, 0x30, 0x02, 0xAA, 0xEC,\n    0x29, 0xA7, 0x90, 0x08, 0xC8, 0x16, 0x12, 0xA0, 0x30, 0x2C, 0xA1, 0x4E, 0xC1, 0x7C, 0x5F, 0xB7,\n    0x5A, 0x17, 0xF7, 0xA7, 0xFC, 0xFA, 0xCB, 0x5D, 0xC2, 0xDC, 0x2C, 0x86, 0xF7, 0xCD, 0x2A, 0x0A,\n    0xA7, 0x22, 0x47, 0x48, 0xC2, 0x75, 0x1E, 0x24, 0xC6, 0x26, 0x98, 0x84, 0x15, 0xAD, 0xB9, 0xBA,\n    0xC9, 0xAF, 0x7D, 0xA2, 0x5D, 0xDD, 0x8E, 0xE0, 0xEE, 0xEF, 0x74, 0xCE, 0x3F, 0xBC, 0xFC, 0xA0,\n    0x26, 0x09, 0x15, 0x30, 0xEC, 0x3B, 0xBB, 0x0A, 0xC4, 0x43, 0x9F, 0x27, 0x90, 0x1F, 0xCC, 0x2D,\n    0x8B, 0x7F, 0xDA, 0x51, 0xCB, 0xF7, 0x27, 0xAC, 0xE5, 0xD7, 0x7D, 0xAA, 0xB0, 0xD9, 0x7C, 0xBF,\n    0x17, 0xD0, 0x42, 0x57, 0xC0, 0xF9, 0xE3, 0xF0, 0x0E, 0x7B, 0x5F, 0xE4, 0x4B, 0xA0, 0xC1, 0xEE,\n    0xF1, 0xF2, 0xEB, 0x33, 0xDA, 0x25, 0xFB, 0x08, 0xAE, 0x6F, 0x4B, 0xFB, 0x5E, 0x98, 0x91, 0xD7,\n    0x91, 0x9A, 0x62, 0x76, 0xC6, 0x51, 0xAA, 0x64, 0x6A, 0xF2, 0xCD, 0xAD, 0x24, 0x42, 0x87, 0x05,\n    0xD3, 0x39, 0xE1, 0xC5, 0xA8, 0x30, 0x79, 0xD8, 0xC0, 0x03, 0x42, 0x84, 0x5A, 0x75, 0xB4, 0x8C,\n    0x0D, 0xE3, 0xB4, 0xCB, 0x00, 0xFD, 0x51, 0xDC, 0xE1, 0xA8, 0xDE, 0xE7, 0x33, 0x6D, 0x74, 0x62,\n    0x2A, 0xAE, 0x99, 0x79, 0x9E, 0xFC, 0x0E, 0x19, 0x35, 0xDD, 0xA1, 0x75, 0xE4, 0x2B, 0x0C, 0xC5,\n    0x37, 0xCB, 0x70, 0x3E, 0x00, 0x0B, 0x28, 0x37, 0x03, 0x23, 0x4D, 0xF0, 0x85, 0xFB, 0xF5, 0x3B,\n    0x8D, 0xC1, 0xB9, 0xB2, 0x7D, 0x15, 0x4C, 0xC0, 0x86, 0x78, 0x74, 0x01, 0xDB, 0xB0, 0xC3, 0x01,\n    0x25, 0x4D, 0x56, 0x70, 0x60, 0x66, 0xCC, 0xC0, 0x1A, 0xD7, 0x77, 0x90, 0x42, 0xDE, 0xE1, 0x09,\n    0xA9, 0x14, 0xB8, 0xB9, 0x78, 0xAF, 0x64, 0x1F, 0x50, 0x02, 0xF9, 0xAF, 0x2C, 0x43, 0x9A, 0xF3,\n    0xD9, 0x00, 0x56, 0x81, 0xC9, 0xC6, 0xC8, 0xAF, 0x1D, 0x49, 0x5A, 0xC5, 0xFB, 0x80, 0xF6, 0x3E,\n    0xD1, 0x03, 0x5B, 0x8B, 0xF4, 0xFA, 0x8B, 0x81, 0xB8, 0x87, 0xD3, 0xEE, 0x40, 0x17, 0xB0, 0x39,\n    0xE5, 0x20, 0xF4, 0x96, 0xEE, 0x8E, 0xA3, 0x71, 0xCE, 0x05, 0xD4, 0x3C, 0x71, 0x46, 0x91, 0xEA,\n    0x89, 0xC5, 0x9F, 0xD3, 0x07, 0x77, 0x1E, 0x1C, 0x4B, 0x28, 0xA1, 0xA4, 0x5F, 0xE3, 0xC3, 0x9A,\n    0xF5, 0x2A, 0xF8, 0xC3, 0x68, 0x4C, 0x76, 0x7B, 0x8B, 0x62, 0x49, 0x8C, 0x7C, 0x31, 0x9D, 0x41,\n    0x07, 0x29, 0xE9, 0xD9, 0xF1, 0x58, 0x6F, 0x20, 0x31, 0x06, 0x45, 0xEA, 0xAB, 0x5E, 0x94, 0x21,\n    0xEC, 0xB2, 0xC0, 0xA9, 0xD3, 0x23, 0x54, 0x09, 0x32, 0x95, 0xF7, 0x50, 0x41, 0x13, 0x7E, 0x9D,\n    0x7C, 0xEB, 0xB8, 0x49, 0x87, 0xD2, 0xF9, 0x55, 0xDC, 0xE5, 0x57, 0x5E, 0x45, 0x3C, 0xA0, 0xE7,\n    0xF2, 0x70, 0x2B, 0x7A, 0x08, 0x38, 0x1D, 0xCC, 0x34, 0x55, 0xF3, 0x79, 0x99, 0xD8, 0x3A, 0x6C,\n    0xEA, 0xFD, 0x18, 0xE6, 0xA8, 0x8C, 0x22, 0xE6, 0x24, 0x02, 0xC6, 0x71, 0xFE, 0x09, 0x01, 0x63,\n    0xD9, 0x13, 0xD6, 0x82, 0xE7, 0x86, 0x9C, 0x08, 0xDC, 0xC5, 0x2A, 0x83, 0x13, 0x3A, 0x03, 0x52,\n    0x25, 0x71, 0x8B, 0x9E, 0xB5, 0xCC, 0x08, 0x05, 0x98, 0xBC, 0xFF, 0xF0, 0xB8, 0x22, 0xF1, 0x87,\n    0x6B, 0xE7, 0x0A, 0xB0, 0xF1, 0x77, 0xAC, 0x70, 0xA5, 0x34, 0x22, 0x46, 0xD0, 0x53, 0xB5, 0xE8,\n    0x77, 0x04, 0x9D, 0x90, 0x8D, 0xE8, 0x57, 0x47, 0x5D, 0xE7, 0x91, 0x41, 0xA5, 0x2B, 0xD2, 0xF0,\n    0xBE, 0x7B, 0xFE, 0x03, 0xF4, 0x81, 0x73, 0x2F, 0xA4, 0x39, 0x21, 0x3D, 0x24, 0x35, 0xAE, 0xCE,\n    0xE3, 0x9C, 0x36, 0x5B, 0x45, 0xC4, 0xA0, 0xD4, 0x46, 0x02, 0x38, 0xF7, 0x9E, 0xC3, 0x11, 0x01,\n    0x31, 0xB8, 0xAC, 0xE8, 0xFC, 0xDB, 0xC5, 0xB4, 0xC4, 0xD5, 0x2A, 0xFB, 0x0D, 0xF7, 0x29, 0xB5,\n    0xCC, 0xE7, 0xD1, 0xF5, 0x1F, 0x53, 0xDF, 0xD7, 0x7D, 0x71, 0xED, 0x0C, 0xB4, 0xDA, 0xFE, 0xA5,\n    0x28, 0x5D, 0x5A, 0x4D, 0x54, 0x9D, 0x04, 0x40, 0x92, 0xBD, 0xC4, 0xD7, 0x38, 0x4B, 0xBC, 0xF5,\n    0x1F, 0x58, 0xAE, 0xD8, 0x0D, 0xA6, 0x92, 0xE8, 0xEF, 0x43, 0xEF, 0xDF, 0x0F, 0xCD, 0x22, 0xFA,\n    0x61, 0x24, 0x77, 0x6A, 0x60, 0x8D, 0x42, 0xFA, 0x8A, 0x0D, 0x6C, 0x47, 0xDB, 0xC2, 0x57, 0x9F,\n    0x12, 0x0E, 0x32, 0xD4, 0x12, 0xD7, 0x05, 0x1F, 0xDF, 0x7A, 0xEC, 0xE2, 0x79, 0xEB, 0xC4, 0x8B,\n    0xC4, 0x71, 0x47, 0xB8, 0xE2, 0xA6, 0xF7, 0x55, 0x7D, 0x6D, 0xC7, 0x93, 0xDB, 0x11, 0xED, 0x70,\n    0xDE, 0xCD, 0xD9, 0x87, 0x14, 0xDA, 0x69, 0x00, 0x63, 0xFF, 0x5E, 0x0F, 0x9A, 0x38, 0xE7, 0xA2,\n    0x2F, 0xA6, 0x38, 0x0E, 0xA8, 0x88, 0x38, 0xD4, 0xF5, 0xF3, 0x26, 0x27, 0x33, 0x2A, 0xF0, 0xA1,\n    0xC8, 0x01, 0x7E, 0xF3, 0xB1, 0xEB, 0x59, 0xCE, 0x3F, 0xE0, 0xC4, 0x86, 0x25, 0xDD, 0xCA, 0x55,\n    0x58, 0x4F, 0x4B, 0x4F, 0x5D, 0x8A, 0x01, 0xAB, 0x82, 0x3E, 0x48, 0x9F, 0x14, 0x4B, 0x9E, 0x05,\n    0x6C, 0x3E, 0xEE, 0xF6, 0x84, 0x59, 0x76, 0x56, 0x69, 0x10, 0x6B, 0x4B, 0x79, 0xB6, 0x90, 0x0F,\n    0x2E, 0x04, 0x45, 0x5C, 0x5A, 0x35, 0x7C, 0x4A, 0x8D, 0xEA, 0xC3, 0xA8, 0x35, 0xD2, 0xCD, 0x0B,\n    0xE1, 0x37, 0xF3, 0x83, 0xCB, 0x65, 0x8B, 0x65, 0x73, 0xEC, 0xA9, 0x80, 0x11, 0xA2, 0xA5, 0x97,\n    0x83, 0xC2, 0x0D, 0xF0, 0x23, 0x27, 0x6C, 0xA7, 0xFE, 0xD3, 0x01, 0x1A, 0x1A, 0x60, 0x1C, 0x82,\n    0x09, 0xE6, 0xB7, 0x7E, 0xE3, 0xE5, 0x9E, 0xF3, 0xEC, 0x7F, 0x76, 0x23, 0xCD, 0xF5, 0xCD, 0xA7,\n    0x21, 0xD5, 0xCF, 0x7C, 0x56, 0x56, 0x1E, 0xF2, 0x25, 0x36, 0x81, 0x81, 0xE8, 0x33, 0x39, 0xFC,\n    0x93, 0xE7, 0xC8, 0x4A, 0x39, 0xB5, 0x1C, 0x86, 0x13, 0xC9, 0xD2, 0xAA, 0xC6, 0x31, 0x46, 0xDE,\n    0xEF, 0x35, 0x26, 0x5A, 0x09, 0x42, 0x0F, 0x24, 0xA5, 0x6A, 0x82, 0x84, 0x17, 0x95, 0x35, 0x7C,\n    0xB7, 0x99, 0x60, 0x6E, 0x54, 0xE1, 0x43, 0xDC, 0xDD, 0x2A, 0x17, 0x06, 0xB9, 0xF2, 0x34, 0xAE,\n    0xDB, 0xE9, 0xF3, 0xAB, 0x6C, 0xAA, 0x1A, 0x5E, 0x65, 0xCF, 0x45, 0x3B, 0xB2, 0x6C, 0x47, 0xE5,\n    0x26, 0x7B, 0x43, 0xD0, 0x58, 0x0A, 0x74, 0xE3, 0xEC, 0xDD, 0x7C, 0xB8, 0x3B, 0xE6, 0xCC, 0x72,\n    0xD3, 0x35, 0x63, 0xB5, 0x26, 0x7A, 0xBE, 0x71, 0x21, 0x82, 0x75, 0x35, 0x20, 0x11, 0x7F, 0x1D,\n    0xFE, 0xD4, 0x19, 0xD0, 0xB7, 0xC1, 0xF3, 0xF4, 0xE6, 0x9A, 0xE0, 0x7D, 0x02, 0x60, 0xF0, 0xC8,\n    0x41, 0xC9, 0x36, 0x14, 0xDE, 0xF5, 0x03, 0x91, 0xE6, 0xFE, 0xAD, 0x1F, 0x50, 0xA7, 0x95, 0xFB,\n    0x09, 0x26, 0x21, 0x23, 0xA4, 0xF8, 0x84, 0xD2, 0xAB, 0x02, 0x88, 0x62, 0xDD, 0xB9, 0x7A, 0x57,\n    0xF0, 0x57, 0x92, 0x6E, 0xA5, 0xDD, 0x6D, 0xCF, 0xEF, 0x30, 0x0B, 0xC3, 0xD3, 0xE1, 0xDF, 0xB4,\n    0x39, 0x35, 0x73, 0x19, 0xED, 0xAE, 0x1A, 0x8A, 0x0D, 0xC8, 0x31, 0x94, 0x3C, 0xB5, 0xEF, 0x2C,\n    0x67, 0xBA, 0xFD, 0x34, 0x13, 0x95, 0x5B, 0x00, 0x0B, 0xDF, 0x23, 0xBC, 0x7D, 0xDE, 0x1C, 0x30,\n    0x72, 0x81, 0x9C, 0x34, 0xB7, 0x60, 0x0E, 0x4C, 0x96, 0x64, 0x5C, 0x93, 0x61, 0x53, 0x12, 0x20,\n    0xD3, 0xA2, 0xBB, 0x9F, 0x1F, 0x26, 0x7F, 0xD5, 0xD7, 0xDE, 0x4C, 0x20, 0x8F, 0x1D, 0x43, 0xAB,\n    0x2C, 0x7F, 0x50, 0xED, 0x9C, 0x7C, 0x2B, 0x44, 0x2C, 0x22, 0xBF, 0xD6, 0x56, 0xB2, 0x56, 0xE4,\n    0x74, 0x8A, 0x78, 0x5F, 0x21, 0xB9, 0xD2, 0xDB, 0x9D, 0x7D, 0x42, 0x54, 0x92, 0x8F, 0x55, 0x9E,\n    0x85, 0xE8, 0x28, 0x92, 0xF0, 0x27, 0x77, 0xCF, 0xFD, 0xE0, 0xB6, 0x2F, 0xBD, 0xC6, 0x4B, 0x8E,\n    0x3E, 0x90, 0xBB, 0x52, 0xED, 0xF6, 0xAA, 0x22, 0x6F, 0x50, 0xDF, 0xFC, 0x65, 0x7B, 0x0D, 0xE9,\n    0x27, 0x03, 0x7E, 0x4A, 0x38, 0xDD, 0x0E, 0x7A, 0x27, 0x66, 0x65, 0xDF, 0xD4, 0xDC, 0x62, 0x41,\n    0x4F, 0xBE, 0x74, 0xBB, 0xCE, 0x45, 0x98, 0xBC, 0x78, 0xC4, 0x58, 0xCB, 0x8B, 0xD7, 0x6E, 0xDE,\n    0x47, 0xE7, 0x62, 0xE5, 0xE4, 0x83, 0xC4, 0x88, 0x07, 0xE8, 0x59, 0xA8, 0x45, 0x66, 0xE7, 0x2E,\n    0xC0, 0xC6, 0x34, 0x56, 0x9B, 0x6E, 0xC8, 0x7A, 0x79, 0xE1, 0x67, 0x1A, 0x02, 0x00, 0xC9, 0x0D,\n    0x4F, 0xFE, 0x10, 0x39, 0x18, 0x01, 0xF4, 0xB9, 0x07, 0x10, 0x72, 0xC7, 0xCF, 0x39, 0xE4, 0xFE,\n    0x7C, 0x90, 0x2E, 0x29, 0x27, 0x7E, 0x6A, 0x64, 0x8E, 0xC6, 0x52, 0x49, 0x00, 0x15, 0x54, 0xFB,\n    0x17, 0x73, 0x19, 0x22, 0x24, 0x47, 0x9C, 0x90, 0xA3, 0xC2, 0x16, 0xAC, 0x33, 0x93, 0x1B, 0x3F,\n    0x3D, 0x7C, 0xC2, 0xB1, 0x73, 0xC4, 0xD4, 0xB5, 0xB3, 0xE0, 0x3D, 0x10, 0x8C, 0x1C, 0x93, 0xE0,\n    0xAC, 0x24, 0xB0, 0xBE, 0x45, 0xF3, 0xE6, 0x44, 0xD8, 0xEB, 0x82, 0x6D, 0x13, 0x73, 0x71, 0x2A,\n    0x56, 0xD6, 0x7C, 0x25, 0xFB, 0xD6, 0xC2, 0xE9, 0xB0, 0x8A, 0xE9, 0xEB, 0x1D, 0xA5, 0x6F, 0x19,\n    0xDD, 0x66, 0x6C, 0x24, 0xCF, 0x44, 0x06, 0x12, 0xF3, 0xC0, 0xAE, 0x21, 0x8B, 0xA1, 0xDF, 0x04,\n    0xC2, 0x1B, 0xF1, 0xA7, 0x3C, 0xF3, 0x68, 0xB9, 0xB2, 0xAF, 0x8C, 0x24, 0xBF, 0x75, 0x72, 0x60,\n    0x18, 0x06, 0x1C, 0x3F, 0x26, 0x4D, 0x3B, 0x1B, 0xFD, 0x76, 0xC6, 0x91, 0xB0, 0xB6, 0xD2, 0x5F,\n    0x67, 0xFA, 0x7D, 0xFF, 0xEC, 0xC7, 0x93, 0x7A, 0x15, 0x4F, 0xE1, 0x1C, 0x46, 0x71, 0x1E, 0x96,\n    0xBE, 0xAD, 0x2F, 0x31, 0x28, 0x71, 0xCB, 0x04, 0x21, 0xFA, 0x47, 0xB4, 0x4D, 0x8B, 0xEC, 0xD0,\n    0x78, 0xA1, 0x2B, 0x1B, 0x39, 0xDB, 0x41, 0x27, 0x14, 0x28, 0xE2, 0xA8, 0xFE, 0xAC, 0x68, 0x47,\n    0xFD, 0x7B, 0x4F, 0xE0, 0xA2, 0xC8, 0x7E, 0x83, 0x86, 0xBD, 0x73, 0x03, 0x18, 0x37, 0xDB, 0x46,\n    0x1F, 0x6B, 0x17, 0x19, 0x11, 0x0C, 0xA2, 0x14, 0x8B, 0x75, 0xB8, 0xB9, 0xEB, 0xC9, 0xD6, 0x0E,\n    0x8D, 0x78, 0x62, 0xEB, 0x51, 0x9F, 0xE7, 0xAE, 0x96, 0x83, 0x50, 0x75, 0x36, 0xF6, 0x7F, 0x30,\n    0x9B, 0x52, 0x57, 0x5B, 0x4D, 0xBC, 0x95, 0x70, 0xCA, 0x2C, 0x8E, 0x3F, 0x59, 0xE0, 0x1C, 0x21,\n    0x3F, 0x81, 0x07, 0x5B, 0x0D, 0xEB, 0x35, 0xA3, 0x04, 0x10, 0x48, 0xE8, 0x1D, 0x82, 0xEB, 0x3C,\n    0x5A, 0xCF, 0xA7, 0x96, 0x6C, 0x04, 0x80, 0x38, 0x94, 0x8A, 0x5A, 0x20, 0xDD, 0xE0, 0x84, 0x23,\n    0xEB, 0x88, 0x31, 0x1E, 0x75, 0xD5, 0x1B, 0x35, 0xE0, 0xE6, 0x79, 0xDF, 0x97, 0xCF, 0x5D, 0x9A,\n    0xDA, 0x22, 0x55, 0xD3, 0x37, 0xDC, 0x09, 0x4D, 0xE4, 0x06, 0x00, 0x4F, 0xA1, 0xD3, 0x8D, 0xFA,\n    0xDF, 0x99, 0x67, 0x10, 0x46, 0x61, 0x1D, 0x54, 0x73, 0x7D, 0x5F, 0xF6, 0x5C, 0x38, 0x67, 0xB4,\n    0x31, 0x59, 0xFF, 0xD2, 0x09, 0x28, 0x2F, 0x7C, 0x2A, 0x95, 0xA2, 0x10, 0x55, 0xED, 0xE3, 0xBA,\n    0x9D, 0x8F, 0x34, 0xB8, 0xC0, 0xC8, 0x25, 0x4D, 0xF2, 0x1C, 0x50, 0x2A, 0x60, 0xF7, 0x0D, 0x1D,\n    0x29, 0xD3, 0x26, 0xF9, 0x88, 0xDD, 0xA2, 0x62, 0x1E, 0x9E, 0x84, 0xC3, 0xB9, 0x5A, 0xAD, 0x5F,\n    0xA9, 0xAA, 0xC9, 0x00, 0xDA, 0xCD, 0x89, 0xB5, 0x33, 0xEB, 0x3B, 0x02, 0xBC, 0x86, 0xD5, 0x46,\n    0x95, 0x43, 0xC7, 0xD7, 0x5E, 0x19, 0x99, 0xD7, 0xB5, 0x5F, 0x9D, 0x60, 0x11, 0x84, 0xA0, 0xDB,\n    0x24, 0x13, 0xBD, 0x88, 0xAC, 0xBE, 0x04, 0x0E, 0x43, 0xF0, 0x6F, 0x2D, 0x28, 0xBF, 0x23, 0xA0,\n    0x27, 0xF4, 0xDF, 0xA5, 0xAD, 0x51, 0x77, 0xE3, 0x17, 0x8A, 0x4C, 0x74, 0x32, 0x70, 0x91, 0x39,\n    0xB2, 0xE6, 0xA8, 0x55, 0x87, 0xF5, 0xDD, 0x6D, 0xA6, 0x7B, 0x53, 0x1F, 0xFF, 0xFD, 0xB2, 0x97,\n    0x59, 0x8E, 0x5F, 0xB3, 0x54, 0xDB, 0xF7, 0x5C, 0x57, 0x4E, 0xDD, 0xF6, 0x36, 0x23, 0xBF, 0xBE,\n    0xB9, 0xD0, 0x2C, 0x9E, 0xDA, 0x4B, 0x33, 0x38, 0x5A, 0x25, 0xED, 0xFE, 0x00, 0x08, 0xE5, 0x64,\n    0xC3, 0x95, 0x00, 0xAA, 0x96, 0xD3, 0xA9, 0x39, 0xB8, 0xE4, 0x47, 0x72, 0x6C, 0xEB, 0x1A, 0x93,\n    0x37, 0x9E, 0xD6, 0x1E, 0x5C, 0x6D, 0xDB, 0x74, 0x42, 0x16, 0x95, 0x44, 0x7E, 0x3B, 0xAE, 0xBC,\n    0x02, 0x15, 0x93, 0xB9, 0x07, 0xBF, 0xFD, 0x4B, 0xD2, 0x94, 0xF2, 0x35, 0xFD, 0xA1, 0x44, 0x37,\n    0x74, 0xFB, 0x45, 0x46, 0x83, 0x39, 0x1D, 0xA8, 0xE9, 0xE8, 0x9C, 0x67, 0x55, 0xEC, 0x2C, 0x59,\n    0xF8, 0x3E, 0x6A, 0x54, 0x75, 0x23, 0x1F, 0x90, 0xCE, 0x6A, 0xAA, 0x5C, 0x80, 0x93, 0x6E, 0x6D,\n    0x2C, 0xC3, 0x5A, 0xF2, 0xA2, 0x93, 0x97, 0xAA, 0x7F, 0xAA, 0x76, 0x0B, 0x59, 0x6D, 0x39, 0x38,\n    0x32, 0x00, 0xA1, 0xF5, 0x39, 0x94, 0x60, 0x9D, 0xD3, 0xE6, 0xF8, 0xF8, 0x14, 0xC4, 0x6D, 0x47,\n    0x21, 0x66, 0x43, 0xE4, 0xCB, 0x07, 0x0D, 0xBD, 0xD9, 0x55, 0xDD, 0x03, 0x75, 0x90, 0x91, 0x38,\n    0x3F, 0x32, 0xE6, 0x73, 0x34, 0xC9, 0xC0, 0x87, 0x3A, 0xC5, 0x62, 0x25, 0x1D, 0x74, 0xB8, 0x0D,\n    0xA5, 0xED, 0xAF, 0x20, 0xC1, 0x0D, 0xA6, 0x2C, 0x78, 0xC2, 0x46, 0xEA, 0x05, 0xDE, 0x06, 0x47,\n    0x8D, 0xE2, 0x42, 0x1B, 0x4F, 0x44, 0xEE, 0x83, 0x1A, 0xD7, 0x66, 0x49, 0xBE, 0xD0, 0x8C, 0x58,\n    0x73, 0xF1, 0x9F, 0x97, 0x74, 0x11, 0xA6, 0x4A, 0x07, 0xDA, 0xA5, 0x75, 0x3D, 0x4A, 0x0F, 0x0D,\n    0x06, 0x56, 0xB2, 0x5F, 0x5A, 0x8E, 0x2A, 0x1C, 0x38, 0x72, 0xBF, 0xC4, 0xD1, 0x06, 0x55, 0xB2,\n    0x73, 0xC0, 0x9D, 0x5F, 0x2F, 0x9B, 0x07, 0x17, 0xA7, 0x44, 0xA0, 0x0A, 0x0E, 0xE4, 0x72, 0xB7,\n    0x70, 0x2E, 0x1E, 0x82, 0x76, 0x63, 0xB5, 0xC1, 0x8F, 0x03, 0x6C, 0xEE, 0x80, 0x3C, 0x86, 0xE1,\n    0x8E, 0x56, 0xD7, 0x14, 0x37, 0x77, 0x93, 0x9C, 0xB6, 0xE0, 0xFC, 0x49, 0x64, 0x56, 0x77, 0xAE,\n    0x4E, 0xB0, 0x28, 0xBA, 0x5B, 0x49, 0x5A, 0xB8, 0x83, 0xD8, 0x6B, 0xE5, 0x41, 0x7A, 0x65, 0x8C,\n    0xC1, 0x71, 0xDD, 0x97, 0x01, 0xA8, 0x9A, 0xAD, 0xC8, 0x43, 0xAB, 0xA6, 0xDC, 0x71, 0xD7, 0x9A,\n    0xCB, 0x99, 0x5F, 0xCA, 0x4D, 0x75, 0xC7, 0xE4, 0x20, 0x0A, 0x12, 0xE5, 0x45, 0x64, 0x19, 0x7E,\n    0x32, 0x50, 0x67, 0x22, 0x5C, 0x88, 0xA4, 0xAB, 0x30, 0x97, 0x42, 0xF7, 0xE6, 0x17, 0x35, 0xD5,\n    0xFE, 0xF3, 0x51, 0xD3, 0x6F, 0x2A, 0xB6, 0x01, 0x9B, 0x80, 0x4F, 0x86, 0x1F, 0xA7, 0x2B, 0xF5,\n    0x84, 0xD9, 0xBB, 0x0E, 0xE6, 0x2A, 0x05, 0x22, 0xBE, 0xFF, 0x21, 0xCD, 0xFD, 0xCD, 0x85, 0x62,\n    0xAC, 0xC3, 0xC1, 0x99, 0xDD, 0x8F, 0xDB, 0xCD, 0xDC, 0xD5, 0xA7, 0x08, 0x75, 0x9B, 0x3F, 0x44,\n    0xB9, 0x91, 0xE9, 0xF0, 0x56, 0x59, 0x33, 0x9F, 0xC3, 0xBD, 0x08, 0x04, 0x17, 0x93, 0x3C, 0x41,\n    0x66, 0x14, 0x20, 0x44, 0x01, 0x46, 0xEB, 0x05, 0x10, 0xBF, 0x6A, 0xAF, 0x4E, 0x44, 0x8C, 0xE1,\n    0xBB, 0xB9, 0x86, 0x64, 0x64, 0xB4, 0xDE, 0x7C, 0x17, 0x92, 0xD3, 0x9B, 0x98, 0x23, 0xAA, 0x8C,\n    0x15, 0xE8, 0xBC, 0xEC, 0xDA, 0x58, 0x3D, 0x8F, 0x53, 0x66, 0x66, 0xA1, 0x87, 0xD1, 0x75, 0x56,\n    0xFD, 0x9F, 0x6C, 0x72, 0x65, 0xDF, 0x2D, 0x48, 0x58, 0x44, 0xD4, 0x6D, 0xD4, 0x47, 0xFD, 0x4C,\n    0xF1, 0xBA, 0x76, 0x55, 0xD5, 0x35, 0x76, 0x97, 0x1D, 0x25, 0x8B, 0x20, 0xEA, 0x70, 0x6B, 0x7B,\n    0x8A, 0x44, 0xA0, 0xC6, 0x04, 0x14, 0xD1, 0x91, 0x50, 0x5E, 0x8E, 0xDC, 0xBC, 0xF9, 0xEA, 0xC2,\n    0xF7, 0x08, 0x0B, 0x20, 0x46, 0x8F, 0x44, 0x2F, 0xD8, 0xAF, 0x16, 0xD8, 0x9A, 0xEA, 0x7A, 0x93,\n    0x22, 0xAB, 0x3D, 0x6B, 0x82, 0x81, 0x3D, 0xE8, 0x3B, 0x33, 0xA4, 0x2E, 0x6D, 0x4B, 0x24, 0xFD,\n    0x00, 0x9C, 0xA6, 0x6F, 0x84, 0xC0, 0xE8, 0xDE, 0x66, 0x8C, 0xDF, 0x10, 0xE0, 0x13, 0xF1, 0x6C,\n    0xC6, 0x2E, 0x29, 0xD9, 0xB3, 0x77, 0xB4, 0x5E, 0xFB, 0xE9, 0x10, 0x89, 0xC5, 0x23, 0x36, 0x1C,\n    0x59, 0xD8, 0xE4, 0x78, 0x45, 0x00, 0xCB, 0xC8, 0x31, 0xE1, 0x5A, 0x78, 0x6E, 0x05, 0x56, 0x82,\n    0xF0, 0x66, 0x4A, 0x40, 0xA4, 0x49, 0xA8, 0x3A, 0xF0, 0x32, 0x55, 0xAD, 0x21, 0xE8, 0x56, 0xDB,\n    0x4C, 0xB5, 0xD4, 0x45, 0x89, 0x57, 0x53, 0xFC, 0x65, 0x23, 0xA7, 0xF0, 0x78, 0x61, 0xC6, 0x4A,\n    0x32, 0x1F, 0x95, 0xAE, 0x69, 0x46, 0x28, 0xBF, 0xB4, 0x88, 0xD7, 0x18, 0xF6, 0xD3, 0xBE, 0xD4,\n    0x00, 0x8C, 0x44, 0x17, 0xDC, 0xA1, 0x65, 0x06, 0xF4, 0xE4, 0x9D, 0x51, 0x40, 0x49, 0x30, 0xD1,\n    0x5A, 0x09, 0xE6, 0xBD, 0x2A, 0x16, 0x47, 0xDD, 0x14, 0x68, 0xF4, 0xED, 0xEB, 0xD5, 0xF2, 0xF5,\n    0xF3, 0x1C, 0xEC, 0xCF, 0x89, 0x10, 0x9C, 0xDF, 0x26, 0x4C, 0xD7, 0x50, 0xE6, 0x0F, 0x8B, 0x64,\n    0x86, 0x36, 0x05, 0x35, 0x6C, 0xED, 0x80, 0x9E, 0x68, 0x1E, 0x44, 0x1D, 0xF7, 0x4C, 0xD9, 0xC2,\n    0xEB, 0x81, 0x6A, 0xB3, 0xA0, 0xE4, 0xFC, 0x06, 0x84, 0x5B, 0xFE, 0x8A, 0x82, 0xE4, 0xD0, 0x20,\n    0x11, 0x78, 0x0F, 0xD5, 0xDC, 0x4B, 0x6F, 0xCA, 0xCE, 0x2B, 0xB4, 0x0A, 0x67, 0x1A, 0x19, 0x19,\n    0xA0, 0x06, 0x5C, 0x56, 0xC1, 0x45, 0xA7, 0x3E, 0xDC, 0xD2, 0x41, 0x59, 0x75, 0x59, 0x7E, 0xCB,\n    0xB7, 0x0B, 0x9C, 0x44, 0xA8, 0x81, 0x6C, 0xF7, 0x89, 0x49, 0x67, 0x11, 0xCF, 0xB8, 0x0D, 0x44,\n    0x87, 0x97, 0x97, 0xDC, 0x44, 0xF8, 0x37, 0x93, 0xE4, 0x14, 0xAC, 0xF7, 0xB1, 0x64, 0xA4, 0x2C,\n    0xDF, 0xC5, 0x04, 0xB1, 0x99, 0x9B, 0x6F, 0x85, 0x7F, 0x77, 0x11, 0xF6, 0x70, 0x6A, 0xF6, 0xE4,\n    0x54, 0xE7, 0xEC, 0xBC, 0x29, 0xE8, 0x11, 0x0A, 0x24, 0x8F, 0xB6, 0xC7, 0xE8, 0x76, 0x65, 0x54,\n    0x05, 0x54, 0x80, 0x46, 0x4D, 0xA9, 0x8A, 0xF8, 0x6E, 0x46, 0x01, 0x7B, 0xD6, 0x42, 0x74, 0x54,\n    0x43, 0xE9, 0xC7, 0xE5, 0x1E, 0xAB, 0x28, 0x66, 0xF7, 0x0A, 0xF0, 0x86, 0x71, 0x7B, 0x05, 0x50,\n    0xDF, 0xAB, 0x7D, 0x19, 0x04, 0x5D, 0x48, 0x31, 0xD2, 0xE1, 0x75, 0x3C, 0xFF, 0xDB, 0x4A, 0xC1,\n    0xAA, 0x63, 0xEE, 0x2C, 0xF9, 0x79, 0x11, 0x1E, 0x09, 0xCF, 0x86, 0x86, 0x0B, 0x4E, 0xD1, 0x94,\n    0x13, 0x3F, 0x29, 0xE5, 0x81, 0xA8, 0x12, 0x41, 0xF3, 0xF3, 0x83, 0x2B, 0x2F, 0xF4, 0x18, 0x10,\n    0x43, 0x16, 0x95, 0xD7, 0xF8, 0x3E, 0x32, 0x9E, 0x2E, 0x93, 0x08, 0xE3, 0x80, 0xD0, 0x52, 0xDD,\n    0x68, 0x71, 0x82, 0x2A, 0x16, 0x02, 0xBF, 0xE1, 0x45, 0x93, 0x2A, 0x98, 0x49, 0x87, 0x2A, 0x3C,\n    0xDF, 0xA0, 0xCD, 0x4C, 0x64, 0x8A, 0xAE, 0xBC, 0x39, 0x71, 0xF8, 0xBA, 0xE6, 0xAB, 0x21, 0x60,\n    0x34, 0x74, 0x54, 0x99, 0xCD, 0x9F, 0x94, 0xB6, 0xE7, 0x62, 0x3A, 0xB7, 0x4D, 0xCB, 0x27, 0xE4,\n    0xC8, 0x92, 0xF5, 0x45, 0x6E, 0x32, 0x91, 0x15, 0x8C, 0x4E, 0x10, 0x76, 0x1A, 0x93, 0x2C, 0x4E,\n    0xBD, 0xDA, 0x27, 0x3F, 0x99, 0xAA, 0xB7, 0x3D, 0xF0, 0xFB, 0x34, 0xB2, 0xD2, 0x7A, 0x23, 0xBA,\n    0xCF, 0xF4, 0xDE, 0xDB, 0xCC, 0x8C, 0xB1, 0x2D, 0x4A, 0xD6, 0xCA, 0xC0, 0xD8, 0x70, 0x58, 0xBC,\n    0x9E, 0x22, 0x92, 0xAB, 0xD8, 0xFB, 0xE7, 0xBC, 0xEB, 0x81, 0xB3, 0x77, 0x70, 0x31, 0x86, 0xE1,\n    0x79, 0xD8, 0x52, 0xD0, 0x6D, 0x39, 0x14, 0x78, 0x73, 0x52, 0x96, 0xE5, 0xBC, 0x2E, 0x42, 0x90,\n    0x43, 0x2D, 0x81, 0x31, 0x01, 0xE1, 0xA4, 0x59, 0x83, 0x6E, 0xB5, 0x02, 0x8F, 0x53, 0xD0, 0x04,\n    0x82, 0x0B, 0x60, 0xF0, 0xC6, 0x5F, 0xE4, 0x07, 0x6C, 0x8E, 0xF3, 0xC9, 0x15, 0x15, 0x38, 0xB6,\n    0x1A, 0x17, 0x0A, 0x52, 0xEF, 0xEF, 0xDC, 0x03, 0x4E, 0x62, 0x5E, 0xF6, 0x7E, 0xAD, 0xCA, 0x52,\n    0xA6, 0xBC, 0x21, 0xC9, 0x0A, 0x15, 0xAB, 0xA6, 0xDF, 0x6C, 0xB1, 0xF9, 0xC6, 0xF3, 0x53, 0x3B,\n    0xA9, 0x87, 0x06, 0x62, 0x18, 0xBA, 0x06, 0x23, 0xC8, 0xA8, 0x72, 0xC7, 0x89, 0x1E, 0x1D, 0xEC,\n    0x5E, 0x46, 0xB9, 0xBE, 0x38, 0x04, 0x0B, 0x29, 0x69, 0x60, 0x97, 0x2E, 0x6F, 0x6A, 0x7F, 0x7A,\n    0xDD, 0x9C, 0x4A, 0x60, 0x2D, 0x19, 0x16, 0x1A, 0xD6, 0x25, 0xAB, 0x17, 0x44, 0x5E, 0x51, 0x5B,\n    0xC3, 0x4D, 0x36, 0xC0, 0xEE, 0xA3, 0x8B, 0x10, 0x78, 0x4D, 0xC3, 0x00, 0xB5, 0x07, 0x19, 0xA4,\n    0xC0, 0x3C, 0x99, 0x4B, 0x70, 0x48, 0xBB, 0x53, 0xFB, 0x21, 0x4D, 0x9B, 0x2B, 0x4C, 0x75, 0x6D,\n    0x0B, 0x86, 0x49, 0x27, 0x76, 0x61, 0x1D, 0xBB, 0x8C, 0x9F, 0xCB, 0x3B, 0xF6, 0x2F, 0x63, 0x64,\n    0x65, 0x2C, 0x38, 0x9E, 0xE7, 0x12, 0x85, 0xA7, 0x29, 0x48, 0xE9, 0xC6, 0xDB, 0x2D, 0xA6, 0x54,\n    0x5A, 0xD5, 0xE0, 0xB6, 0x77, 0xA1, 0x78, 0x84, 0x52, 0xD7, 0xC1, 0x5B, 0x9D, 0x0D, 0x8A, 0x70,\n    0x3E, 0x72, 0x6A, 0x5D, 0x63, 0x0D, 0xEF, 0x97, 0x68, 0x78, 0x1F, 0x35, 0xDA, 0x98, 0x6E, 0x25,\n    0x05, 0xCC, 0xF3, 0xC0, 0x1E, 0x4F, 0xD2, 0x29, 0xE4, 0x26, 0xC2, 0x32, 0xE6, 0xA0, 0x65, 0xFE,\n    0x3E, 0xDB, 0x71, 0xAB, 0x85, 0x79, 0xAB, 0xC9, 0x8D, 0xD1, 0x8A, 0xF2, 0xA2, 0x62, 0xE7, 0x4F,\n    0xC5, 0xCD, 0x09, 0x94, 0xFD, 0xF0, 0x0E, 0xA2, 0x3D, 0x98, 0x8E, 0x65, 0x35, 0x5F, 0xC8, 0xD5,\n    0xCC, 0xE2, 0xED, 0x3B, 0x50, 0xB5, 0x52, 0x57, 0xB1, 0x04, 0xA1, 0x6E, 0x48, 0x58, 0xE5, 0x61,\n    0x75, 0x8D, 0xD2, 0x34, 0x21, 0x62, 0xC3, 0xD2, 0x0C, 0x51, 0xF1, 0x2B, 0xD4, 0xF7, 0xA7, 0x04,\n    0xE7, 0x22, 0x7B, 0xC0, 0xF0, 0x14, 0xFF, 0x3F, 0xAD, 0x46, 0xED, 0xF3, 0xC1, 0xC6, 0x4D, 0xE7,\n    0x95, 0x86, 0x60, 0xE3, 0x6E, 0x01, 0xE8, 0x96, 0xEF, 0x85, 0xF3, 0xC0, 0x8C, 0xF1, 0x7D, 0x70,\n    0x4E, 0x69, 0x5C, 0x06, 0xD0, 0xF9, 0x71, 0x0D, 0x9C, 0x6F, 0x5F, 0xC9, 0xFC, 0x27, 0x32, 0x13,\n    0x0A, 0xA2, 0x79, 0x31, 0x91, 0x19, 0xFE, 0x50, 0xA5, 0x49, 0xC5, 0x39, 0x9E, 0x7C, 0xD6, 0x89,\n    0xF9, 0x85, 0x1D, 0x08, 0x1A, 0xD1, 0xF1, 0xA5, 0x9C, 0x35, 0xE9, 0x24, 0x12, 0xDC, 0x15, 0x89,\n    0x30, 0xB9, 0x99, 0xEF, 0x54, 0x79, 0xCC, 0x68, 0x78, 0xFE, 0x77, 0xDE, 0x51, 0xAD, 0x89, 0x7A,\n    0x4C, 0x31, 0x29, 0x1D, 0x70, 0x45, 0x80, 0xC6, 0x7D, 0xA4, 0xFD, 0xE4, 0x86, 0xA0, 0xA2, 0x4A,\n    0x31, 0x17, 0xA9, 0xD0, 0x08, 0xCC, 0xF9, 0xEF, 0x3C, 0x71, 0x1A, 0xEE, 0xFA, 0x94, 0x83, 0x1D,\n    0x2B, 0xEF, 0x19, 0x00, 0xD0, 0x43, 0xB8, 0x10, 0x35, 0x63, 0x06, 0x9D, 0xA8, 0xFC, 0xF9, 0xC3,\n    0x07, 0x39, 0x48, 0x0E, 0x86, 0x95, 0x80, 0xD2, 0x9E, 0xB0, 0x9E, 0x89, 0x96, 0x2D, 0x58, 0x5D,\n    0xD6, 0x88, 0x77, 0xEB, 0x64, 0xC0, 0xA2, 0xB6, 0xCD, 0x96, 0x7D, 0xE2, 0xC8, 0x21, 0x93, 0x65,\n    0x51, 0xF1, 0x17, 0xAE, 0xB7, 0xF8, 0xBF, 0x90, 0x54, 0x40, 0xE0, 0x9C, 0xD0, 0xDE, 0xD7, 0xFC,\n    0x18, 0x55, 0x6B, 0x58, 0x0C, 0x17, 0xC7, 0xA3, 0x06, 0x93, 0x9B, 0x2F, 0x68, 0x7E, 0x7D, 0x0F,\n    0x0C, 0xC8, 0x6F, 0xC5, 0xDB, 0x37, 0xA1, 0x46, 0xE4, 0xDA, 0x1E, 0x66, 0x06, 0xF3, 0x24, 0xB0,\n    0x05, 0xA2, 0x16, 0x76, 0x2D, 0xA4, 0xA2, 0x27, 0x18, 0x56, 0x63, 0x92, 0xD8, 0xED, 0x9D, 0xA7,\n    0x3A, 0xC0, 0xA8, 0xFE, 0x24, 0x0F, 0x06, 0xC4, 0x05, 0x74, 0xA5, 0x31, 0xA0, 0x42, 0xFC, 0x59,\n    0xD0, 0xC3, 0x79, 0x6E, 0x1D, 0x6E, 0x35, 0xFC, 0xBB, 0x58, 0x20, 0x0D, 0x5B, 0xA6, 0xAF, 0xBD,\n    0x07, 0x81, 0xBC, 0xBE, 0x52, 0x37, 0x20, 0x4C, 0x0D, 0x6A, 0x28, 0xE6, 0x12, 0x3D, 0x0B, 0x84,\n    0xE1, 0xBE, 0x4F, 0x93, 0x56, 0x5A, 0xCB, 0x82, 0x23, 0x8C, 0xF1, 0xF9, 0xB1, 0xEB, 0xAC, 0x5C,\n    0x88, 0xB4, 0xC0, 0xF8, 0x6A, 0x78, 0x40, 0x13, 0x43, 0xA3, 0xB9, 0xE3, 0x65, 0xE8, 0xAA, 0x0A,\n    0xC3, 0xCB, 0x19, 0x9A, 0x7B, 0x76, 0xBA, 0x2A, 0xBF, 0x48, 0xAF, 0xFA, 0x9A, 0xFD, 0x69, 0x46,\n    0x27, 0x7F, 0x34, 0xF8, 0x9F, 0x89, 0x87, 0xB8, 0x5E, 0x34, 0xCE, 0x40, 0x9E, 0xE7, 0x0E, 0xC1,\n    0x29, 0x27, 0x5F, 0xD4, 0xEB, 0x5F, 0x3A, 0xD3, 0x20, 0xD7, 0xCC, 0x4B, 0x04, 0x22, 0xD5, 0x48,\n    0x3B, 0x87, 0x7E, 0x80, 0x31, 0xD0, 0xCF, 0xEB, 0x9E, 0xAB, 0xAE, 0xF0, 0x98, 0x5B, 0x50, 0xC3,\n    0xED, 0x5A, 0xF9, 0xF8, 0xC6, 0xA2, 0xF9, 0x6E, 0x32, 0x22, 0x46, 0x74, 0x01, 0x55, 0xE2, 0x40,\n    0xA2, 0x0D, 0x15, 0xEA, 0x4B, 0x67, 0x9A, 0x61, 0x5E, 0x10, 0x40, 0x43, 0xE8, 0xDF, 0x81, 0xB3,\n    0x4C, 0x0C, 0x27, 0x1F, 0x04, 0x74, 0x5F, 0x49, 0x3E, 0x81, 0x6F, 0x52, 0xC8, 0x4A, 0xD7, 0x0F,\n    0xD8, 0xCB, 0x6F, 0x0B, 0x76, 0xBE, 0xB2, 0x64, 0xE0, 0x02, 0x08, 0xC6, 0x9E, 0x17, 0xDC, 0x37,\n    0x76, 0xD4, 0x94, 0xE4, 0xAC, 0xA0, 0x7A, 0x06, 0x4A, 0x48, 0x30, 0x16, 0x54, 0x5B, 0xB8, 0x03,\n    0x4D, 0x83, 0x67, 0x56, 0x2F, 0x37, 0xFD, 0xC7, 0xC3, 0x60, 0xCC, 0xF9, 0x9D, 0x71, 0x9F, 0x0F,\n    0xE4, 0xDE, 0x4F, 0xE1, 0xE0, 0x4A, 0xF5, 0xEB, 0xB1, 0x19, 0x92, 0xDF, 0x20, 0x9D, 0x7E, 0x99,\n    0x0A, 0x06, 0xB6, 0x90, 0x25, 0x3A, 0x6E, 0x21, 0x10, 0x8F, 0x71, 0xAF, 0x7B, 0x26, 0xB3, 0x48,\n    0x85, 0x1E, 0x37, 0x14, 0x16, 0x6C, 0x71, 0x2A, 0xED, 0x0A, 0x73, 0xFB, 0x9B, 0x8B, 0x30, 0xC6,\n    0x6B, 0xE5, 0xCD, 0x29, 0x4B, 0xE3, 0x16, 0xC7, 0x8B, 0x97, 0x24, 0xE6, 0xD6, 0x5D, 0x4C, 0x66,\n    0xAE, 0xE6, 0x28, 0xC3, 0x79, 0x93, 0xE5, 0x38, 0xE9, 0x83, 0x9C, 0x3B, 0xAC, 0x90, 0x8F, 0x7C,\n    0x73, 0x4E, 0xA7, 0xC9, 0x56, 0x39, 0x75, 0x20, 0xE1, 0x94, 0x4A, 0x34, 0x99, 0xF1, 0x6D, 0x47,\n    0xD5, 0x51, 0x24, 0x0A, 0xD3, 0x3B, 0xB6, 0x4F, 0x87, 0xD2, 0x8C, 0x3E, 0xAE, 0xCD, 0xC0, 0xBA,\n    0xCA, 0x51, 0xAC, 0x56, 0xBD, 0xB5, 0xAA, 0xAC, 0xA4, 0xB0, 0xC5, 0x7E, 0xD8, 0x7B, 0x50, 0xC2,\n    0x8B, 0x0F, 0xCE, 0x14, 0xEB, 0xB6, 0x0C, 0x0A, 0x0F, 0x2D, 0xE0, 0xFF, 0x8D, 0x3C, 0xCE, 0x0E,\n    0x98, 0xF3, 0x97, 0x44, 0x28, 0xE8, 0x6C, 0x0B, 0x90, 0x7F, 0xAB, 0xD1, 0xB6, 0xA2, 0xDE, 0x7F,\n    0x49, 0x30, 0x52, 0x45, 0x90, 0x8F, 0xB2, 0x3E, 0x50, 0x3E, 0x24, 0x72, 0x11, 0xB8, 0xB6, 0x20,\n    0x69, 0xC1, 0x85, 0x54, 0xD4, 0x33, 0x46, 0xEC, 0x99, 0xDD, 0x21, 0xB9, 0x37, 0x2A, 0x81, 0xD0,\n    0xC2, 0xC8, 0x19, 0xEC, 0x95, 0x7B, 0x5E, 0xC5, 0xBC, 0x08, 0x53, 0x36, 0xD9, 0xE1, 0x51, 0x50,\n    0xD3, 0x7B, 0xB2, 0xDA, 0xF9, 0x33, 0x92, 0xBF, 0x17, 0x28, 0xF4, 0x1C, 0x5E, 0x35, 0x4C, 0x74,\n    0xD4, 0x82, 0xFA, 0xBA, 0xBE, 0x89, 0x81, 0x44, 0x10, 0xBE, 0x9D, 0x2E, 0xBA, 0x40, 0xF0, 0x83,\n    0xE3, 0x42, 0xF4, 0x5F, 0x4D, 0x2A, 0xFD, 0xC5, 0x5D, 0xF1, 0xCE, 0x83, 0x20, 0xD6, 0xEF, 0xBF,\n    0xB1, 0xBB, 0xC4, 0xC7, 0x53, 0x69, 0x10, 0x80, 0x65, 0x73, 0xBF, 0xCE, 0x0A, 0x41, 0x03, 0xEF,\n    0x4A, 0xB4, 0xA7, 0x23, 0x7D, 0x6C, 0xE8, 0x5F, 0x2F, 0x44, 0x96, 0xD9, 0xD3, 0x10, 0xA5, 0xF7,\n    0xAA, 0x5C, 0x18, 0xA0, 0x31, 0x00, 0xB9, 0xB2, 0xD9, 0x12, 0x1C, 0x4B, 0x22, 0x66, 0xCF, 0xED,\n    0xB8, 0xC3, 0xF7, 0xE6, 0x1A, 0xF5, 0xCE, 0xA4, 0xEB, 0xED, 0x69, 0xE8, 0x38, 0xA0, 0x9F, 0x47,\n    0x3E, 0x4C, 0x51, 0xDC, 0xFB, 0x4B, 0x34, 0xBC, 0xFA, 0xD4, 0x52, 0xFC, 0x11, 0x6F, 0xBA, 0x3E,\n    0x06, 0x82, 0x4B, 0x06, 0x8F, 0x8A, 0x66, 0x2C, 0xAE, 0x9B, 0x5F, 0x1D, 0x74, 0x46, 0xBF, 0x9B,\n    0xB3, 0x94, 0x7A, 0xE2, 0xEE, 0x68, 0xB4, 0x91, 0x37, 0x44, 0x8A, 0xF6, 0x2C, 0xC5, 0x99, 0x7E,\n    0x68, 0x3A, 0xED, 0x2E, 0x05, 0x0B, 0xBF, 0xCB, 0x99, 0x31, 0xBC, 0xBD, 0x96, 0x26, 0x2F, 0x11,\n    0xA3, 0xEC, 0x67, 0x3D, 0xBF, 0x08, 0x02, 0xAB, 0x12, 0x43, 0x39, 0x60, 0xCE, 0xCF, 0x35, 0xE8,\n    0x88, 0xC6, 0x57, 0xA4, 0x7A, 0x35, 0x80, 0x48, 0x3C, 0x6C, 0xC9, 0x9B, 0xDA, 0xE5, 0xB3, 0x48,\n    0x51, 0x92, 0x7B, 0x8B, 0x45, 0xFB, 0x5F, 0x88, 0xDB, 0x95, 0x73, 0xC2, 0x43, 0xD2, 0x92, 0xA3,\n    0x34, 0x0F, 0xCB, 0x83, 0x90, 0x78, 0xE6, 0x7A, 0x45, 0x9C, 0xEA, 0xD5, 0x03, 0xCC, 0xEB, 0xB3,\n    0x74, 0xE2, 0x0E, 0x9A, 0xB5, 0xFB, 0xF2, 0x48, 0x5C, 0x3E, 0xB1, 0x67, 0x0C, 0xB8, 0x6C, 0x36,\n    0x08, 0x84, 0xC6, 0x4C, 0x82, 0x98, 0xE4, 0xD8, 0x1D, 0x58, 0x15, 0xAC, 0xC4, 0x41, 0xF7, 0x9D,\n    0x08, 0x64, 0x4A, 0xE9, 0x74, 0x7E, 0x3B, 0x91, 0xC1, 0xE3, 0x9A, 0x0E, 0x81, 0x5C, 0xD1, 0x5C,\n    0x7A, 0x95, 0x02, 0xD4, 0x28, 0x30, 0xD4, 0xE0, 0xAE, 0xB8, 0xF1, 0x7B, 0xCF, 0xAC, 0x50, 0x90,\n    0xEF, 0x8F, 0x18, 0xD1, 0x9A, 0x19, 0x6F, 0x41, 0x65, 0xCB, 0x28, 0xBD, 0x9C, 0xB6, 0x27, 0x65,\n    0x8B, 0xB5, 0xB8, 0x08, 0xC7, 0x41, 0xBC, 0xF2, 0x63, 0x6D, 0x9C, 0xD7, 0x69, 0x03, 0xBF, 0xB0,\n    0x7B, 0x04, 0xCC, 0xFD, 0x74, 0xA0, 0xBD, 0x81, 0x08, 0x86, 0x4F, 0x42, 0x25, 0xD2, 0x4A, 0x66,\n    0x49, 0x3E, 0xD0, 0x7A, 0x3D, 0x54, 0xCB, 0x50, 0x94, 0xF3, 0x7F, 0x3A, 0xF2, 0x91, 0xE6, 0x5E,\n    0x11, 0xC6, 0xA4, 0x76, 0x97, 0xC3, 0x6C, 0x21, 0x0E, 0xB6, 0xBA, 0x10, 0x4A, 0xE3, 0xDC, 0xDC,\n    0x43, 0x3B, 0xF0, 0x0B, 0x47, 0x65, 0xB9, 0xD7, 0x0B, 0x32, 0xFD, 0xF5, 0x51, 0x03, 0xEA, 0x8C,\n    0x01, 0x65, 0xC4, 0x6B, 0x25, 0xF1, 0xC2, 0x3A, 0x09, 0x65, 0x1D, 0x58, 0xDE, 0xF4, 0x2B, 0xC7,\n    0x67, 0x30, 0x04, 0x08, 0x0A, 0x7A, 0x3A, 0x4B, 0xE4, 0xE7, 0xE8, 0xBE, 0xFF, 0x05, 0x42, 0xFC,\n    0xE0, 0x1F, 0xAE, 0xA8, 0x75, 0xBA, 0xE9, 0xDC, 0x8C, 0xBD, 0x30, 0xB8, 0x1D, 0x04, 0x57, 0xD3,\n    0x93, 0x1A, 0x43, 0x93, 0xFE, 0x5D, 0x6A, 0x28, 0xBE, 0xE0, 0x39, 0xB2, 0xCC, 0xF0, 0x7D, 0x06,\n    0x4C, 0x95, 0xFC, 0x62, 0xC7, 0x05, 0xEB, 0x16, 0x88, 0x2B, 0x0E, 0x96, 0xF1, 0xC7, 0x43, 0xC2,\n    0xB7, 0xE9, 0x2F, 0xEC, 0xA0, 0x5C, 0x9A, 0xD7, 0x26, 0x64, 0x69, 0xDB, 0x13, 0x25, 0xD8, 0x43,\n    0xE0, 0x5B, 0x0B, 0xA1, 0xE4, 0xB0, 0xF2, 0x4E, 0x6A, 0x9C, 0xF4, 0x7B, 0x9E, 0xE3, 0xB7, 0xD4,\n    0xC6, 0x10, 0xF2, 0x37, 0x45, 0x8A, 0x6B, 0x97, 0x28, 0x2E, 0x0E, 0xA0, 0x93, 0x13, 0xF7, 0x0B,\n    0x8A, 0xB9, 0x9F, 0xC0, 0xE4, 0x4A, 0xED, 0xE1, 0x79, 0x32, 0x31, 0x97, 0x2B, 0xB7, 0x09, 0xB5,\n    0xB9, 0xE3, 0x57, 0x56, 0x5F, 0x81, 0x28, 0x85, 0xAA, 0xF8, 0x69, 0x77, 0x40, 0x74, 0xD6, 0x4B,\n    0x7A, 0xAC, 0xD5, 0x2D, 0x74, 0xB4, 0x67, 0x89, 0xE1, 0xF1, 0xD9, 0x1F, 0xB8, 0xDC, 0xDF, 0x0D,\n    0x8D, 0xA6, 0xA7, 0x8D, 0xF1, 0x59, 0x30, 0xD6, 0x00, 0x26, 0xD1, 0x21, 0x2E, 0xE7, 0xB7, 0x91,\n    0x2E, 0xA9, 0xF6, 0xD0, 0x5A, 0xB6, 0x8A, 0x34, 0x59, 0x92, 0x9E, 0x37, 0x1E, 0xD9, 0x38, 0x2A,\n    0xAE, 0x12, 0xD4, 0x95, 0x8B, 0xE8, 0xA7, 0x5D, 0x8C, 0x92, 0xA1, 0x8A, 0x4D, 0x9E, 0x64, 0x20,\n    0xA2, 0x7E, 0xCC, 0x39, 0x50, 0xA4, 0x01, 0xEC, 0xA7, 0xF5, 0x6D, 0x88, 0x8E, 0xB6, 0xCE, 0xA4,\n    0x58, 0xAA, 0xFB, 0xCA, 0xC5, 0x67, 0x26, 0x07, 0xBB, 0xEC, 0xFB, 0x73, 0x5D, 0x48, 0x9B, 0x49,\n    0xFE, 0x99, 0x25, 0x6D, 0x82, 0x1F, 0x6E, 0x6E, 0x1E, 0x21, 0xBF, 0x94, 0x52, 0xB7, 0xAC, 0x8E,\n    0x74, 0x22, 0x10, 0x27, 0x14, 0x6F, 0xDC, 0x80, 0xBD, 0xB3, 0xD6, 0xAD, 0x1F, 0x17, 0x59, 0x6B,\n    0x42, 0x68, 0xBD, 0x37, 0xCF, 0xC6, 0x46, 0x11, 0x64, 0x9E, 0xEB, 0xF5, 0xCD, 0xA2, 0x5F, 0x3F,\n    0xC8, 0x0E, 0x1F, 0xCC, 0xFA, 0xE0, 0x59, 0xC4, 0x82, 0x8B, 0x8E, 0xC4, 0x8C, 0x96, 0x56, 0xF5,\n    0x16, 0x2A, 0x53, 0x0E, 0x36, 0xC9, 0x61, 0x34, 0x3F, 0x0F, 0x73, 0xC3, 0xD9, 0x0C, 0x3B, 0x74,\n    0xD5, 0x97, 0x3F, 0x2D, 0x1B, 0xCF, 0x1F, 0xD2, 0xFC, 0xFF, 0xBC, 0xFB, 0x9E, 0xE7, 0x5D, 0x30,\n    0x5D, 0x9C, 0x66, 0x06, 0x26, 0xD3, 0x0A, 0x4E, 0x4C, 0x45, 0xA8, 0xE6, 0x23, 0x0A, 0xE1, 0x3A,\n    0x31, 0x39, 0xC0, 0x01, 0x9D, 0x19, 0xD3, 0x2A, 0x28, 0xD7, 0x43, 0x40, 0x38, 0xC5, 0xA9, 0xCC,\n    0x80, 0x71, 0xAF, 0xDC, 0xEF, 0x4E, 0x85, 0xC0, 0xBE, 0x56, 0xC1, 0x54, 0xA6, 0xDE, 0x30, 0xE4,\n    0xF9, 0xD0, 0x1B, 0x40, 0x6A, 0x61, 0x2B, 0x5C, 0x2B, 0xF6, 0x16, 0x99, 0xD7, 0x62, 0xC2, 0x59,\n    0x81, 0x87, 0xFB, 0x93, 0x45, 0xEE, 0x38, 0xB8, 0xE7, 0xDD, 0x37, 0xC0, 0x76, 0xC9, 0x0D, 0x17,\n    0x06, 0x34, 0xD3, 0xB3, 0x6E, 0x88, 0x26, 0x99, 0x48, 0x0E, 0x67, 0x46, 0xE3, 0xE4, 0x22, 0x97,\n    0xFA, 0xD3, 0xC3, 0x66, 0xD1, 0x08, 0x17, 0x93, 0xDD, 0xC9, 0xC6, 0x41, 0xC7, 0x12, 0x4F, 0x83,\n    0xB8, 0xCC, 0x60, 0xA0, 0x24, 0xB7, 0x17, 0x16, 0x31, 0xC6, 0x42, 0xEB, 0xEC, 0x48, 0xE1, 0xEB,\n    0x75, 0x54, 0x75, 0xE8, 0x01, 0xF6, 0x42, 0x67, 0xF1, 0x46, 0xF7, 0xB7, 0x2A, 0x22, 0x88, 0x20,\n    0xAC, 0xCF, 0xA3, 0x27, 0x36, 0x38, 0xD0, 0x70, 0x99, 0xD5, 0x63, 0xA3, 0xF7, 0x05, 0x25, 0x52,\n    0x82, 0x04, 0x02, 0xED, 0xBD, 0x13, 0x9F, 0xCE, 0x89, 0xD0, 0x6E, 0xE2, 0x85, 0xBB, 0xEC, 0x7B,\n    0xFA, 0x6C, 0x88, 0x4B, 0x57, 0xD4, 0xC7, 0xCA, 0x5A, 0x01, 0x6A, 0x6C, 0xD9, 0x75, 0x1E, 0x89,\n    0x26, 0xFA, 0x4A, 0x0E, 0x1F, 0x2B, 0xA9, 0x97, 0xDB, 0x19, 0x4E, 0xD4, 0x55, 0x5C, 0x3D, 0xF2,\n    0xDB, 0xD7, 0x5B, 0x60, 0x9E, 0x12, 0x4A, 0x62, 0x45, 0xE7, 0xBB, 0x0E, 0xEF, 0x67, 0x99, 0x68,\n    0xAA, 0x0E, 0x2B, 0x49, 0x82, 0x8D, 0x7E, 0x4C, 0xA4, 0x78, 0x08, 0xC3, 0xAE, 0x79, 0xF4, 0x39,\n    0xC1, 0xEC, 0x00, 0xB4, 0x9D, 0x7C, 0x40, 0xFC, 0x6B, 0xBC, 0x16, 0xDB, 0xD8, 0xC4, 0x48, 0x5B,\n    0x63, 0x16, 0xF6, 0xCE, 0xAA, 0x99, 0xC8, 0xF2, 0x87, 0x2A, 0x05, 0xAD, 0x31, 0xB8, 0xA0, 0x1D,\n    0xA0, 0xA2, 0x03, 0x0C, 0x54, 0xD5, 0x7B, 0x0C, 0xBF, 0x35, 0x70, 0x57, 0xCD, 0xE3, 0xB0, 0x57,\n    0xE8, 0xBE, 0x7A, 0x95, 0xDF, 0xDF, 0xAB, 0x11, 0x55, 0x86, 0xA3, 0x27, 0x6E, 0x0B, 0x7B, 0xF0,\n    0xAD, 0x2E, 0xEE, 0xF8, 0xD6, 0x10, 0xC8, 0x4D, 0x68, 0xCE, 0xA7, 0x86, 0xFC, 0x45, 0xC1, 0x1E,\n    0x4E, 0x56, 0x61, 0x1E, 0xE8, 0x2C, 0xCA, 0x0D, 0x51, 0xD2, 0x2C, 0xC3, 0x7E, 0xCF, 0xB3, 0x96,\n    0x1B, 0xEA, 0xD6, 0x0B, 0x2D, 0x86, 0xDD, 0x8C, 0xAA, 0xAF, 0x1B, 0x4C, 0x4A, 0xA7, 0xA1, 0x53,\n    0x5F, 0x8D, 0xB6, 0x0A, 0x3F, 0x5C, 0xA8, 0x23, 0x33, 0xCB, 0x92, 0xEA, 0x1A, 0xEF, 0xBD, 0x2F,\n    0x89, 0xA1, 0x5C, 0x73, 0x3D, 0xDE, 0x51, 0x64, 0xC5, 0x52, 0xA7, 0x92, 0xBC, 0x1D, 0xCA, 0xBA,\n    0xC8, 0xFC, 0x2C, 0x1A, 0x69, 0x44, 0x71, 0xFE, 0xAB, 0x2A, 0x2E, 0xBB, 0x02, 0x92, 0xED, 0x90,\n    0x01, 0xBC, 0x44, 0x7F, 0x6F, 0x76, 0x1E, 0x30, 0xDC, 0x4D, 0x3D, 0xBC, 0x01, 0xD1, 0x1E, 0xE5,\n    0x71, 0x0E, 0xA6, 0x7D, 0xE1, 0xD5, 0xA6, 0x08, 0xA6, 0x66, 0x9F, 0x0F, 0xAC, 0x11, 0x96, 0x66,\n    0x13, 0x03, 0x9F, 0x4C, 0x0E, 0x8A, 0x2A, 0x4C, 0x39, 0xF0, 0xC6, 0x8E, 0x41, 0x9B, 0x23, 0xDD,\n    0xDB, 0x7B, 0x94, 0x71, 0x6C, 0x78, 0x1B, 0xA6, 0xC1, 0xA8, 0x9B, 0xA5, 0x86, 0x0E, 0x02, 0x97,\n    0x72, 0x2F, 0xE8, 0xE0, 0x01, 0x64, 0x39, 0x8C, 0x6C, 0x4F, 0x64, 0x24, 0x34, 0x81, 0x33, 0x6D,\n    0xC6, 0x56, 0x60, 0x23, 0x8C, 0xB1, 0xA3, 0x11, 0x94, 0x37, 0xEF, 0xE4, 0x3E, 0x4D, 0xAF, 0x61,\n    0x2C, 0xF8, 0x86, 0x03, 0xFB, 0x25, 0xA3, 0x0F, 0xFA, 0x04, 0x3F, 0x72, 0x10, 0xF1, 0xE6, 0x71,\n    0x13, 0x8A, 0xD7, 0xD3, 0x04, 0x92, 0x46, 0x4A, 0x31, 0xAB, 0x5A, 0x1D, 0x16, 0x68, 0x77, 0x26,\n    0x9C, 0x28, 0x86, 0x27, 0xD9, 0x60, 0xCA, 0x74, 0x41, 0x90, 0xB6, 0x0C, 0x91, 0xB1, 0x1E, 0x82,\n    0xD9, 0x81, 0x63, 0x00, 0x2A, 0xA0, 0x07, 0x74, 0x62, 0x3B, 0xBD, 0x5B, 0x9C, 0xA0, 0x6E, 0xE0,\n    0x55, 0x9B, 0x0A, 0x60, 0x84, 0x92, 0x7E, 0xB1, 0xF1, 0xFC, 0x36, 0x97, 0xF8, 0x92, 0xAF, 0x3B,\n    0xD1, 0x2A, 0xBF, 0x4E, 0xFD, 0x68, 0xC2, 0xF5, 0x89, 0xED, 0xE8, 0x4A, 0x44, 0xA0, 0x66, 0x50,\n    0xDF, 0x4F, 0x6B, 0x9D, 0x1C, 0x98, 0xA4, 0xF4, 0x22, 0x9F, 0x51, 0x17, 0x46, 0x4F, 0xFC, 0x07,\n    0xAD, 0xE6, 0x24, 0xF9, 0x5F, 0x9F, 0x56, 0x49, 0x6A, 0x15, 0x39, 0xCA, 0x68, 0x98, 0xAF, 0xF1,\n    0x3F, 0xFB, 0x60, 0x36, 0xDC, 0xB7, 0xD4, 0x27, 0x1F, 0x98, 0xDD, 0x6B, 0x21, 0x72, 0x1C, 0x4F,\n    0x4C, 0x93, 0xC4, 0x01, 0xA4, 0x9C, 0xB7, 0x02, 0xC3, 0xFE, 0xCA, 0xC0, 0x8D, 0xD5, 0xBA, 0x09,\n    0xB9, 0xAF, 0x1C, 0xB0, 0x08, 0x09, 0x36, 0x70, 0x91, 0x08, 0xF5, 0x1B, 0x14, 0xE9, 0x81, 0xB1,\n    0xD1, 0xA0, 0x94, 0x4C, 0x73, 0x46, 0xBB, 0x7C, 0xFA, 0xB9, 0xE7, 0x31, 0x94, 0xFD, 0xCE, 0x97,\n    0xDB, 0x52, 0x32, 0x11, 0x72, 0xD7, 0x1C, 0xDE, 0x97, 0xBE, 0x19, 0xD9, 0xCB, 0xCC, 0xEF, 0x0F,\n    0x2C, 0x90, 0xEA, 0xED, 0x1F, 0x07, 0x10, 0xD4, 0x4E, 0xDF, 0x3F, 0x92, 0x29, 0x57, 0x22, 0x7A,\n    0x18, 0xB0, 0xE1, 0xDE, 0x76, 0x61, 0xF3, 0xBA, 0x84, 0xD4, 0x7D, 0x9C, 0x92, 0x7B, 0x0B, 0xC2,\n    0x7F, 0x6A, 0xF5, 0x5E, 0x77, 0xD6, 0xBB, 0xF5, 0x23, 0x1D, 0xCE, 0x52, 0xFA, 0x21, 0x33, 0xD1,\n    0x33, 0x38, 0x65, 0x34, 0xCE, 0x8C, 0x25, 0x9D, 0xF4, 0x95, 0xF1, 0x71, 0x17, 0xE6, 0x08, 0x96,\n    0xEA, 0x54, 0xA1, 0xA1, 0xEB, 0xFD, 0x90, 0xAE, 0x63, 0x42, 0xC0, 0x8B, 0x57, 0xD4, 0x64, 0xDF,\n    0xB9, 0xF1, 0xB2, 0x8A, 0xAD, 0x42, 0x64, 0x99, 0xF4, 0x3E, 0x72, 0xDB, 0xE1, 0x18, 0xF2, 0x28,\n    0x0A, 0xDD, 0xB9, 0x8D, 0x66, 0xC2, 0xB1, 0x02, 0xDC, 0xAB, 0x31, 0x2E, 0x42, 0xC8, 0x7A, 0xC0,\n    0xD2, 0x82, 0x7B, 0x2E, 0xBA, 0x25, 0x07, 0x51, 0xB6, 0xC2, 0xDC, 0x75, 0x84, 0x5B, 0xB5, 0x43,\n    0x36, 0x37, 0x26, 0x8B, 0x89, 0x77, 0x50, 0xC3, 0x49, 0xC0, 0xA1, 0x41, 0xDC, 0xAA, 0x84, 0x32,\n    0x4E, 0x77, 0xE5, 0xC3, 0xF2, 0x2E, 0xD8, 0xA0, 0x29, 0x64, 0xAA, 0x4A, 0x43, 0x90, 0xBA, 0xB1,\n    0x84, 0xFB, 0x9D, 0x40, 0x82, 0x97, 0x01, 0xFE, 0x22, 0x40, 0x54, 0x06, 0x68, 0x9A, 0x9E, 0xB6,\n    0x29, 0x21, 0xFB, 0x9F, 0xD4, 0x3A, 0x23, 0xDC, 0xAC, 0xB6, 0x7F, 0x19, 0xC8, 0x01, 0x12, 0x40,\n    0xDB, 0xFB, 0xA1, 0x93, 0xAD, 0xD2, 0x03, 0xFA, 0xB3, 0xA1, 0x47, 0x49, 0x8E, 0x8E, 0xA2, 0xF8,\n    0xDA, 0xB8, 0xDA, 0xF8, 0x55, 0x2E, 0x8D, 0x91, 0x8E, 0x8C, 0x03, 0x1C, 0x6D, 0x9F, 0x09, 0x41,\n    0x4B, 0x0A, 0x20, 0xDF, 0x6C, 0x1E, 0x07, 0x33, 0x39, 0xDC, 0xFE, 0x4F, 0xD1, 0xC9, 0xFE, 0xC1,\n    0x44, 0x38, 0x95, 0x88, 0xE6, 0xAA, 0x20, 0x43, 0x3A, 0x23, 0xBB, 0x05, 0x47, 0x34, 0x26, 0x19,\n    0xD0, 0x9F, 0x7B, 0x3F, 0x6D, 0x10, 0x36, 0xBD, 0xC1, 0x96, 0x4B, 0xB2, 0x2B, 0x25, 0x36, 0xD3,\n    0x79, 0x74, 0x1D, 0xDD, 0x88, 0x8D, 0x05, 0x4A, 0xF1, 0xA6, 0xC6, 0x62, 0xE7, 0x28, 0x06, 0xD7,\n    0x34, 0x73, 0x2F, 0xB8, 0xDE, 0x3C, 0xB3, 0xAA, 0x69, 0xBD, 0xDA, 0x1A, 0x30, 0xE8, 0x59, 0x44,\n    0x81, 0xCB, 0xCF, 0xAA, 0xE0, 0xD0, 0x1B, 0x7C, 0xC6, 0x0E, 0xD7, 0x24, 0x12, 0xA9, 0x86, 0xB7,\n    0xC3, 0x73, 0xA4, 0x87, 0x35, 0xC5, 0x6D, 0x44, 0x41, 0x30, 0xC0, 0x53, 0xF3, 0x15, 0x12, 0x12,\n    0xEA, 0xA0, 0x50, 0x95, 0xA4, 0x8A, 0xC3, 0x4B, 0xB1, 0xC1, 0xA8, 0xB6, 0x20, 0x63, 0x00, 0x8B,\n    0x77, 0x29, 0x30, 0x51, 0x60, 0x87, 0x7C, 0x0E, 0x80, 0x3C, 0x7A, 0xB3, 0x56, 0x82, 0x99, 0xEC,\n    0xA2, 0x9D, 0x87, 0xE0, 0x8A, 0x7B, 0xF9, 0x88, 0x74, 0xEF, 0xE6, 0x95, 0xC4, 0x58, 0xFD, 0x85,\n    0xAF, 0xBD, 0x16, 0xFD, 0xAD, 0x5D, 0x5F, 0xFB, 0xE7, 0xCC, 0xD0, 0x50, 0x59, 0x80, 0x2B, 0x12,\n    0x2F, 0xB2, 0x2E, 0xC0, 0xEB, 0x6C, 0xF9, 0xE9, 0x95, 0xA7, 0x7E, 0xD5, 0xBD, 0x07, 0x68, 0xFB,\n    0x09, 0xF3, 0xF9, 0x6F, 0xF2, 0xE1, 0x40, 0x78, 0x9D, 0xD1, 0xA4, 0x85, 0xFF, 0x8F, 0x2E, 0x85,\n    0x87, 0xF2, 0xAA, 0x77, 0xD8, 0xFC, 0xF9, 0x96, 0x74, 0xB0, 0xB4, 0x1E, 0x3C, 0x2C, 0x17, 0x63,\n    0x3B, 0x03, 0xF0, 0xF0, 0xC9, 0x29, 0x57, 0x11, 0x81, 0xF8, 0x1B, 0x68, 0x03, 0x40, 0x53, 0x0C,\n    0x75, 0x4C, 0x93, 0x6D, 0xC4, 0x5D, 0x40, 0xD0, 0x91, 0xAC, 0xA1, 0x6E, 0x5F, 0xDD, 0x0F, 0x51,\n    0xB8, 0x77, 0x2D, 0x0E, 0x71, 0x45, 0x53, 0x2A, 0x10, 0x83, 0x4A, 0xFA, 0x1B, 0xE7, 0x51, 0x8E,\n    0xE0, 0xDF, 0x54, 0xBF, 0xBF, 0xA8, 0x6E, 0xC2, 0xA9, 0x15, 0x1D, 0x15, 0x15, 0x21, 0x9A, 0x9F,\n    0x72, 0x00, 0x0C, 0xB3, 0xD6, 0xF6, 0xF6, 0x25, 0x73, 0xE6, 0x27, 0xFD, 0x24, 0xF4, 0x06, 0x63,\n    0x21, 0x40, 0x0F, 0x38, 0x24, 0xDC, 0x78, 0x7A, 0x5A, 0x60, 0x50, 0xA6, 0xAD, 0x1D, 0x02, 0x27,\n    0x60, 0xC5, 0x2B, 0x11, 0x6B, 0xD3, 0x44, 0x52, 0x25, 0xAC, 0x90, 0x8C, 0x8E, 0xBD, 0x77, 0xC7,\n    0xB7, 0x14, 0x8D, 0xDB, 0xF4, 0xBD, 0xD0, 0xED, 0x4F, 0x76, 0xFE, 0x0C, 0x5E, 0x81, 0x63, 0x49,\n    0xDD, 0x27, 0x79, 0xD3, 0xEF, 0x12, 0x64, 0xD5, 0x84, 0x99, 0xA4, 0x16, 0x25, 0xC6, 0xE2, 0xAC,\n    0xD5, 0xC4, 0x8C, 0xBA, 0x42, 0x12, 0x21, 0x96, 0x53, 0xFF, 0xC2, 0xCB, 0x12, 0x98, 0xEB, 0xEC,\n    0x0E, 0x72, 0xE3, 0x4A, 0x15, 0x5F, 0x61, 0xAF, 0xA4, 0x60, 0x43, 0x3F, 0x79, 0x17, 0xC6, 0xCF,\n    0x9B, 0x48, 0x4C, 0x49, 0x74, 0xC6, 0x64, 0x92, 0x6C, 0x41, 0xD4, 0xBB, 0xB9, 0x9D, 0x17, 0xA1,\n    0x68, 0xF1, 0x6E, 0xD5, 0x5E, 0xD6, 0xD9, 0xF6, 0xDA, 0xD8, 0x36, 0xC1, 0x3E, 0xC2, 0xF2, 0x85,\n    0xBC, 0x9B, 0x05, 0xE0, 0xD5, 0x15, 0xCF, 0x00, 0xBC, 0xD1, 0x1F, 0xCE, 0x50, 0x47, 0x37, 0xFE,\n    0x57, 0x7A, 0xCB, 0x1C, 0x2E, 0x36, 0x79, 0xC4, 0xDC, 0x1C, 0x11, 0x84, 0xDF, 0xD0, 0xF2, 0x7A,\n    0x02, 0xDD, 0x37, 0x5E, 0xD0, 0x4A, 0x11, 0x0D, 0x59, 0x8F, 0xDD, 0xEB, 0xF6, 0x1D, 0xE6, 0x0D,\n    0x58, 0x18, 0x7D, 0xD4, 0x4D, 0x3D, 0x1B, 0xD5, 0x13, 0xB1, 0xD4, 0xBB, 0x50, 0x56, 0x29, 0xB1,\n    0x78, 0xCA, 0xC9, 0xC3, 0xA4, 0x10, 0x67, 0xFA, 0x48, 0x13, 0x12, 0xAB, 0xB5, 0xDA, 0x45, 0x72,\n    0x6A, 0x41, 0x11, 0x6B, 0xA9, 0xBF, 0x93, 0xFA, 0x47, 0x6D, 0x46, 0xE4, 0xAE, 0x58, 0xED, 0x5D,\n    0xF3, 0x38, 0x57, 0xED, 0x49, 0xB7, 0x6A, 0x15, 0xC9, 0xBA, 0x05, 0xF2, 0xA5, 0x9D, 0xC0, 0x0A,\n    0x31, 0x02, 0xC4, 0x70, 0x33, 0x4E, 0x5D, 0x29, 0x02, 0x5B, 0x99, 0xEF, 0x2A, 0x1B, 0xD6, 0x90,\n    0xA9, 0xF1, 0x9A, 0x52, 0x09, 0xD4, 0xFD, 0xF7, 0x5F, 0x50, 0xA1, 0x78, 0xD5, 0xA0, 0x69, 0xBE,\n    0xD7, 0x61, 0x5E, 0x97, 0x16, 0x33, 0xBD, 0x25, 0x2B, 0x9F, 0x25, 0x49, 0x6C, 0x9B, 0x5B, 0xB7,\n    0x8A, 0x9F, 0x54, 0x46, 0x2C, 0x3F, 0xC9, 0xFA, 0xB8, 0xD0, 0xA3, 0x35, 0xBB, 0xF1, 0x7D, 0x4A,\n    0x74, 0xEC, 0x6F, 0xD3, 0x14, 0xB3, 0x5E, 0x92, 0xFB, 0xF2, 0xE8, 0x41, 0x0A, 0xD2, 0x33, 0xF0,\n    0x73, 0x5B, 0x36, 0x9A, 0x70, 0x97, 0x6E, 0x60, 0x54, 0xFD, 0x27, 0x79, 0xC0, 0x4B, 0x1C, 0x86,\n    0x22, 0xAA, 0xA0, 0x14, 0x9D, 0xF6, 0x79, 0x3A, 0xC3, 0x5C, 0xC4, 0xAC, 0xB2, 0xBC, 0x4D, 0xCC,\n    0xDC, 0xE0, 0x48, 0xB7, 0x8E, 0xBD, 0x49, 0x08, 0x15, 0xB2, 0xA7, 0x05, 0xF9, 0x15, 0x18, 0x79,\n    0xF1, 0x5F, 0xEA, 0xB8, 0x53, 0x5B, 0xA2, 0xD8, 0x7E, 0xA7, 0x0A, 0x28, 0x1B, 0x0E, 0x21, 0x10,\n    0x02, 0xB9, 0xAA, 0x62, 0x1E, 0x17, 0x12, 0x31, 0x8A, 0x60, 0x70, 0x90, 0x66, 0xFF, 0x83, 0x3F,\n    0x39, 0x97, 0x75, 0xE3, 0x8D, 0x51, 0xA8, 0x0A, 0xA4, 0x9C, 0x1F, 0x73, 0x91, 0x8F, 0x8A, 0x9D,\n    0x17, 0x7C, 0x43, 0x33, 0x1C, 0xE8, 0x29, 0x73, 0xA2, 0x3D, 0x2C, 0x43, 0x07, 0x9B, 0x6D, 0xB2,\n    0x7F, 0x4E, 0x16, 0x6D, 0x94, 0x5D, 0x3F, 0xC4, 0x0E, 0xEF, 0xEB, 0x0F, 0x71, 0x04, 0x2F, 0x99,\n    0xCD, 0x50, 0x81, 0x23, 0x2A, 0x9C, 0xB0, 0x74, 0x63, 0x94, 0x8E, 0x41, 0x29, 0x93, 0x2B, 0x20,\n    0x8B, 0xC8, 0x75, 0x34, 0xEB, 0x11, 0x4C, 0x4F, 0xDA, 0x1A, 0x8B, 0xE5, 0x87, 0xA6, 0xB0, 0x57,\n    0xE2, 0x3F, 0x58, 0x68, 0xA3, 0xC0, 0x2E, 0x48, 0x92, 0x4B, 0x9A, 0xE1, 0xFD, 0xF3, 0x22, 0x66,\n    0x8B, 0xF6, 0xCA, 0x10, 0xBA, 0x83, 0x0C, 0x50, 0x68, 0x73, 0xD0, 0x21, 0x06, 0x2E, 0xAD, 0x68,\n    0x2F, 0x11, 0x1E, 0x31, 0x38, 0x8D, 0xCF, 0x3E, 0xD7, 0x68, 0x08, 0xE3, 0xD2, 0x47, 0x7B, 0x71,\n    0x68, 0xF6, 0x4F, 0x11, 0x36, 0x97, 0xD9, 0x2A, 0xCF, 0x87, 0x0A, 0xCB, 0x5E, 0xE7, 0x1C, 0x1B,\n    0x02, 0x7F, 0x58, 0x4F, 0x16, 0x3E, 0x5E, 0x28, 0x9E, 0xB4, 0x3B, 0x20, 0x5C, 0x9B, 0x6D, 0x25,\n    0x4B, 0x72, 0xE1, 0xA5, 0x38, 0xC1, 0x7F, 0x69, 0x0A, 0x60, 0x42, 0xAB, 0x24, 0x86, 0x09, 0xAA,\n    0x5D, 0x9E, 0x65, 0xF8, 0xC7, 0x6A, 0xCD, 0x31, 0x14, 0xBC, 0xC0, 0x45, 0x80, 0x68, 0x09, 0xA2,\n    0x77, 0xD6, 0x4B, 0x95, 0xD4, 0xF4, 0x58, 0xF0, 0xAB, 0x2F, 0x79, 0x77, 0x59, 0x74, 0x38, 0xD5,\n    0x69, 0xB8, 0x77, 0x32, 0x92, 0x2A, 0x49, 0x96, 0xBE, 0x40, 0x31, 0x4F, 0xC5, 0xCD, 0x9B, 0xA1,\n    0xD6, 0xB9, 0xCE, 0xF6, 0x4B, 0x01, 0x87, 0xE1, 0x0E, 0x55, 0x40, 0x13, 0xE5, 0x42, 0x01, 0xC8,\n    0x78, 0x90, 0x6F, 0xA9, 0x5B, 0x65, 0x79, 0xA0, 0x84, 0x85, 0x3B, 0x42, 0x73, 0x2D, 0x7C, 0xBA,\n    0x2B, 0x7F, 0x19, 0xEB, 0x8D, 0x9D, 0x82, 0xA6, 0xE5, 0x10, 0x0A, 0x5A, 0xAB, 0xA1, 0x1B, 0xD8,\n    0x87, 0xAB, 0xC5, 0x70, 0x78, 0xC1, 0xBC, 0xF6, 0x5C, 0xFC, 0x60, 0x69, 0x5A, 0xD7, 0xE1, 0x20,\n    0x50, 0xCB, 0xDD, 0x55, 0x1E, 0x80, 0x1F, 0x0A, 0x97, 0x65, 0x86, 0x02, 0xD4, 0x6C, 0x2E, 0x08,\n    0xB8, 0xB0, 0x26, 0x78, 0xB9, 0xB3, 0x6D, 0x57, 0x9E, 0x21, 0x37, 0x01, 0xDB, 0xEF, 0x49, 0x4D,\n    0x66, 0xE0, 0x7C, 0xCB, 0xCC, 0xD9, 0xAC, 0xEE, 0xF2, 0xCE, 0xA5, 0x8E, 0x15, 0x4F, 0x1C, 0x83,\n    0x3C, 0xC8, 0xD0, 0x88, 0x7E, 0x66, 0xCE, 0xA9, 0xBA, 0x32, 0x97, 0x15, 0x5F, 0x8B, 0xBC, 0x9E,\n    0x1C, 0x14, 0x55, 0x9A, 0xBC, 0x4E, 0x4A, 0x6B, 0xB0, 0xE0, 0xF0, 0xDB, 0x3A, 0x64, 0x14, 0x75,\n    0xAC, 0x14, 0x36, 0xE8, 0x6A, 0xB0, 0x3D, 0x7E, 0xD9, 0xB4, 0x2B, 0x1F, 0xE9, 0x50, 0xB1, 0x7C,\n    0x18, 0x05, 0xA6, 0xE2, 0x44, 0xF3, 0xCE, 0xE6, 0x4C, 0x21, 0x9E, 0x69, 0xAA, 0x22, 0x7E, 0xE2,\n    0x35, 0x76, 0x3A, 0xAE, 0x6E, 0x4E, 0x72, 0x25, 0xB5, 0x4D, 0xA4, 0xF7, 0x47, 0x82, 0x9C, 0xD5,\n    0xA0, 0x08, 0x53, 0x17, 0x74, 0xB5, 0xB4, 0xA2, 0x6F, 0x10, 0x40, 0x62, 0x47, 0xB9, 0xCE, 0x00,\n    0xC8, 0x68, 0x94, 0x9F, 0xD6, 0x7C, 0x0D, 0xD5, 0xB7, 0x8A, 0x13, 0xDE, 0x8C, 0x5B, 0x0B, 0x33,\n    0xB7, 0x15, 0xD5, 0x43, 0xAE, 0xC0, 0x87, 0x0A, 0x13, 0xF3, 0xB5, 0x1C, 0x00, 0xC7, 0xA4, 0x36,\n    0x05, 0xE4, 0xFF, 0xE2, 0x18, 0x6E, 0xF5, 0xF9, 0x0D, 0xDE, 0xDA, 0x4D, 0xC6, 0x1B, 0x0D, 0x89,\n    0xD7, 0xD5, 0x5E, 0x84, 0xDA, 0xC2, 0xAF, 0x42, 0x2D, 0x89, 0xD3, 0x69, 0x38, 0x25, 0xDB, 0xE0,\n    0xC3, 0x17, 0xCF, 0x3A, 0xB1, 0x8F, 0x60, 0x74, 0xC4, 0x3C, 0x20, 0x1B, 0xE3, 0x0C, 0x91, 0x93,\n    0xDC, 0xCB, 0x39, 0x45, 0x0E, 0xB3, 0x78, 0x52, 0xBF, 0x6A, 0x79, 0x10, 0x93, 0x67, 0x25, 0x87,\n    0xD7, 0xA6, 0x55, 0xEB, 0xC0, 0xE2, 0x04, 0x43, 0xF9, 0x25, 0x3B, 0x10, 0x95, 0xEF, 0xD5, 0x34,\n    0xB0, 0xA6, 0x67, 0x24, 0x26, 0x94, 0x71, 0x4C, 0xA5, 0x7F, 0x4E, 0xAC, 0xA7, 0x58, 0x89, 0xA1,\n    0x47, 0x47, 0x76, 0x17, 0xC0, 0x79, 0x21, 0xFE, 0x53, 0xB8, 0x55, 0xC3, 0x73, 0xF7, 0x07, 0x4C,\n    0x76, 0xEE, 0x45, 0x92, 0x72, 0x75, 0x07, 0xAE, 0x18, 0x44, 0xC0, 0x96, 0x20, 0x9F, 0xE6, 0x54,\n    0x04, 0xEE, 0x16, 0xBA, 0x4B, 0x29, 0xA9, 0x27, 0x35, 0xBE, 0x58, 0xA6, 0x32, 0x00, 0xEE, 0x7C,\n    0x8D, 0x3F, 0x4D, 0xB2, 0x1D, 0xB2, 0x0C, 0x6D, 0xC9, 0xFE, 0x26, 0x92, 0xCF, 0x50, 0xD8, 0x0F,\n    0x27, 0x00, 0xDA, 0x4A, 0xB6, 0xD5, 0xD7, 0x03, 0x8E, 0x09, 0xCA, 0x9D, 0xA8, 0xC0, 0x95, 0x6D,\n    0x7E, 0xC8, 0x36, 0x43, 0x9C, 0x41, 0x30, 0x92, 0xC6, 0x97, 0x0D, 0x6C, 0x87, 0x9F, 0xBC, 0x41,\n    0x72, 0x83, 0x6F, 0x7E, 0xCA, 0x29, 0x9B, 0x9B, 0x43, 0x7F, 0x1A, 0x1B, 0xE3, 0xEF, 0x48, 0x3B,\n    0x22, 0x3F, 0x18, 0xDA, 0x3B, 0xE6, 0xE0, 0x10, 0xCA, 0xD4, 0x0E, 0xAF, 0x56, 0xD4, 0x17, 0x20,\n    0xD8, 0x80, 0xB7, 0xCF, 0xB1, 0xE5, 0x3B, 0xE8, 0x9A, 0x5F, 0xD0, 0x16, 0x44, 0xEE, 0x3A, 0x8B,\n    0xB3, 0x23, 0x75, 0x1F, 0xBD, 0xDF, 0xE1, 0xF0, 0xFD, 0xB9, 0xEB, 0x21, 0x49, 0x16, 0x00, 0xEE,\n    0xFD, 0x87, 0x45, 0x97, 0x45, 0x68, 0xDA, 0x57, 0x01, 0x60, 0x33, 0x1A, 0x01, 0x43, 0xB2, 0x1C,\n    0xB7, 0xA6, 0xCD, 0x67, 0xFD, 0x38, 0x00, 0x44, 0x04, 0xFD, 0xA4, 0x35, 0x63, 0x58, 0x79, 0x47,\n    0x6A, 0x1B, 0x6F, 0x65, 0x7A, 0x49, 0x2E, 0xA4, 0xCE, 0xEE, 0x44, 0x78, 0xA7, 0xCB, 0x0C, 0xF1,\n    0x9E, 0x8B, 0x3E, 0xC8, 0x4E, 0xDA, 0x4F, 0x90, 0xF6, 0xA6, 0x38, 0x1C, 0x14, 0x64, 0x21, 0x16,\n    0x7C, 0x09, 0xAA, 0x52, 0x03, 0xC7, 0xBE, 0x62, 0x9E, 0xBD, 0xC6, 0x3F, 0x6A, 0x0A, 0x79, 0x24,\n    0xFD, 0x00, 0xDF, 0xCB, 0x9E, 0xC9, 0x8D, 0x56, 0xC6, 0x58, 0x81, 0x78, 0xCD, 0xA6, 0x36, 0x63,\n    0xE4, 0x78, 0x2F, 0xC8, 0xAF, 0x6E, 0xD5, 0xB4, 0xDD, 0x31, 0xE4, 0x84, 0x33, 0x4E, 0x6F, 0x4D,\n    0xE1, 0xD2, 0x87, 0x2A, 0xE3, 0xBA, 0x11, 0xBC, 0x0A, 0x4E, 0x28, 0xC9, 0x8B, 0x50, 0x6E, 0xCF,\n    0x55, 0x06, 0x63, 0x89, 0x6B, 0x45, 0x83, 0x36, 0x08, 0xA2, 0x67, 0x61, 0xBB, 0x72, 0x2F, 0xD1,\n    0xA4, 0x45, 0xD7, 0x1C, 0x1A, 0x76, 0x47, 0x43, 0xED, 0x72, 0xA7, 0x68, 0x2F, 0xEA, 0xCB, 0x04,\n    0xD0, 0x70, 0x00, 0xE9, 0xB5, 0xCA, 0xF0, 0x47, 0x5E, 0x5C, 0x28, 0x5E, 0x03, 0x88, 0xB4, 0xD6,\n    0x52, 0x6A, 0xFE, 0xFF, 0x88, 0x9C, 0x2B, 0x32, 0xD1, 0x3D, 0x9E, 0x4F, 0xD3, 0xD4, 0xA7, 0xE1,\n    0xB6, 0xB9, 0x89, 0xE7, 0xE2, 0xF7, 0xBC, 0x57, 0xD7, 0xC4, 0x20, 0xFB, 0x91, 0xC0, 0x87, 0x5E,\n    0xC4, 0x4F, 0xB7, 0x0B, 0xD4, 0x34, 0x30, 0xAC, 0x02, 0x1F, 0xC7, 0x7A, 0xBE, 0x64, 0x25, 0x34,\n    0x92, 0x12, 0x22, 0x66, 0xB5, 0x81, 0x7F, 0x6E, 0x89, 0xA6, 0x49, 0x07, 0xFA, 0xA6, 0x14, 0x80,\n    0x7A, 0x5D, 0x4D, 0x06, 0x9D, 0x57, 0x17, 0x82, 0x1B, 0x70, 0xBE, 0xFA, 0x50, 0x1A, 0x5E, 0x7B,\n    0x48, 0x11, 0xF8, 0x2F, 0xFD, 0xC0, 0xE4, 0x75, 0x57, 0xCD, 0x81, 0x57, 0xDA, 0x84, 0x1A, 0x92,\n    0x18, 0x40, 0x8A, 0xC3, 0x66, 0xCC, 0xE0, 0x93, 0x8A, 0x19, 0x30, 0x2F, 0xD5, 0x9A, 0xAD, 0x24,\n    0x8A, 0x39, 0x03, 0x45, 0xCF, 0x8E, 0xF9, 0x8C, 0x8D, 0xE1, 0x29, 0x2D, 0xDD, 0xB6, 0xA0, 0x33,\n    0xCD, 0x75, 0x99, 0x27, 0xBA, 0x20, 0x10, 0x6C, 0xEE, 0xC5, 0xFE, 0xDB, 0x86, 0x53, 0xD6, 0xCE,\n    0x48, 0x24, 0xEF, 0xB3, 0x27, 0x99, 0xFC, 0x51, 0x25, 0x52, 0x76, 0x6F, 0xCD, 0x75, 0x68, 0x7E,\n    0xD2, 0xC8, 0xB7, 0x82, 0x55, 0x5D, 0x2F, 0x30, 0xD0, 0xBF, 0x0C, 0xC6, 0xD6, 0xAB, 0xC8, 0x3A,\n    0x48, 0x76, 0x26, 0x24, 0x08, 0xBF, 0x44, 0xA2, 0x27, 0xC8, 0x3F, 0xE7, 0xD8, 0xBB, 0xD5, 0xED,\n    0x5D, 0xE4, 0xFE, 0x94, 0x9F, 0xE0, 0x13, 0xFC, 0x1B, 0xB8, 0x0D, 0xED, 0x68, 0x33, 0xE5, 0x38,\n    0xFC, 0x7C, 0x05, 0xB1, 0x74, 0xEA, 0x8E, 0xA2, 0x2F, 0x53, 0x5B, 0x9D, 0xD3, 0x53, 0x55, 0x18,\n    0x01, 0x4C, 0xFE, 0x84, 0x00, 0xF7, 0x66, 0x11, 0x4E, 0xEF, 0x45, 0xF1, 0xAE, 0xCF, 0x6B, 0x5C,\n    0x40, 0x76, 0x8B, 0xE3, 0xE0, 0x3F, 0x10, 0x14, 0x07, 0x22, 0x9C, 0xBD, 0xE0, 0xFF, 0x56, 0x2F,\n    0x62, 0xEA, 0x50, 0x50, 0xF6, 0x73, 0xA9, 0x2D, 0x3D, 0xED, 0x2B, 0x1A, 0x10, 0xB8, 0xAC, 0x07,\n    0x69, 0xB0, 0x7D, 0x42, 0x9A, 0x58, 0x18, 0xA9, 0x87, 0x04, 0x63, 0xE0, 0x64, 0x81, 0x9B, 0x17,\n    0xB1, 0x42, 0x36, 0x00, 0xA1, 0xA9, 0x1C, 0x9F, 0x03, 0xC2, 0x6E, 0xB8, 0x40, 0xC4, 0xB1, 0x40,\n    0xDB, 0x45, 0xD3, 0x47, 0xB6, 0x1A, 0x55, 0xB0, 0x91, 0x6B, 0xAE, 0xE4, 0x8C, 0x75, 0x9F, 0x6A,\n    0x1F, 0xFA, 0xD2, 0x4B, 0x7B, 0x34, 0xE3, 0xAC, 0x77, 0x66, 0x1E, 0x88, 0x2A, 0x89, 0x2E, 0x19,\n    0xF3, 0x21, 0xC5, 0xEA, 0x09, 0x99, 0xB2, 0x30, 0x9F, 0xA5, 0x6B, 0x75, 0xF0, 0xE8, 0xCB, 0x9F,\n    0xB0, 0x3E, 0x17, 0x59, 0x10, 0xDD, 0x0B, 0xA7, 0x97, 0xB4, 0x7E, 0x68, 0x26, 0x46, 0xE8, 0xA4,\n    0x88, 0x4B, 0x0C, 0xE8, 0x5F, 0x4A, 0x2F, 0x67, 0xFE, 0x70, 0x33, 0xA4, 0x55, 0x35, 0xC3, 0x85,\n    0x20, 0xBC, 0x12, 0x18, 0x85, 0x6B, 0x8D, 0x53, 0x70, 0x1F, 0xF3, 0x8E, 0x1A, 0x56, 0x6F, 0x2E,\n    0xAD, 0xC9, 0x67, 0x00, 0x28, 0x11, 0x72, 0x2D, 0xAF, 0x8D, 0x45, 0xC3, 0x86, 0xC7, 0xE9, 0xA8,\n    0xC0, 0xBB, 0x26, 0x97, 0xD5, 0xE4, 0xB7, 0xCF, 0x57, 0x01, 0x00, 0x1E, 0xBF, 0x11, 0xE2, 0xE4,\n    0x1E, 0x4D, 0xB6, 0x52, 0xC6, 0x69, 0xDE, 0xA0, 0x3A, 0xD6, 0x97, 0x38, 0x63, 0x39, 0x60, 0x17,\n    0xAC, 0xD6, 0xED, 0xFB, 0x10, 0xA9, 0xE0, 0x5E, 0x6D, 0x43, 0xC2, 0x24, 0xA8, 0xAC, 0xB8, 0xC5,\n    0xE1, 0xF5, 0xBD, 0x4B, 0x89, 0x47, 0x50, 0x9F, 0x02, 0xB4, 0x40, 0xB1, 0xFA, 0xCD, 0x48, 0x52,\n    0x68, 0xE5, 0x25, 0xE0, 0x74, 0xA2, 0x64, 0xC4, 0x7B, 0xE5, 0xF1, 0x61, 0x21, 0xA6, 0x39, 0x42,\n    0x26, 0xC1, 0x87, 0x1F, 0x6F, 0x3D, 0x68, 0x96, 0xC4, 0x74, 0xCD, 0x5E, 0xEE, 0x43, 0x6F, 0x99,\n    0x91, 0x1D, 0x30, 0x97, 0xBA, 0x7E, 0xA5, 0xA6, 0x08, 0x3B, 0x8D, 0x40, 0x61, 0xAF, 0x1B, 0xA2,\n    0x37, 0x63, 0x48, 0xD1, 0x70, 0xF6, 0xFC, 0x6A, 0xDF, 0x09, 0x82, 0x4E, 0x00, 0xD6, 0xAA, 0x31,\n    0x76, 0x98, 0x24, 0x78, 0xE3, 0x18, 0x91, 0xF6, 0x88, 0x3E, 0xA8, 0x54, 0xA1, 0x3F, 0xAD, 0xE1,\n    0x67, 0xCE, 0x3E, 0x9E, 0x82, 0x62, 0x99, 0x18, 0xF8, 0x40, 0x60, 0x22, 0x92, 0x55, 0xF6, 0xA1,\n    0x6D, 0x80, 0x69, 0xB9, 0x77, 0x40, 0xBA, 0xAC, 0x3C, 0x31, 0x32, 0xAA, 0xE8, 0x09, 0x26, 0x64,\n    0x2B, 0xE7, 0x6D, 0x19, 0x31, 0xF3, 0x88, 0xFF, 0x45, 0xF2, 0xA9, 0xD7, 0xBF, 0xDA, 0x50, 0x33,\n    0xD7, 0x83, 0x55, 0x08, 0xCA, 0xFE, 0xF6, 0x3B, 0x2A, 0x5A, 0xC4, 0xBD, 0x26, 0x35, 0xF5, 0x9D,\n    0xE8, 0xA8, 0xFE, 0x9C, 0x43, 0x0F, 0x2C, 0xFD, 0x33, 0x81, 0x08, 0x11, 0x4D, 0xE6, 0x5B, 0xB1,\n    0x96, 0xE7, 0x3A, 0x83, 0xCB, 0xEF, 0x18, 0xDE, 0xF8, 0x5B, 0x09, 0x4D, 0x61, 0x3D, 0xB5, 0xB7,\n    0xE4, 0xC9, 0x73, 0xFE, 0x5C, 0xD3, 0x57, 0x4F, 0x46, 0x6F, 0x42, 0x56, 0x85, 0xC1, 0x4A, 0x8A,\n    0xD8, 0x61, 0xA3, 0x15, 0x49, 0x66, 0xA6, 0x1C, 0xC0, 0x1F, 0xB7, 0xA9, 0x88, 0x06, 0xA4, 0x2F,\n    0xE4, 0x9A, 0xCC, 0x38, 0xE0, 0x90, 0x64, 0xB6, 0x0F, 0xE5, 0xAE, 0xB5, 0x87, 0x64, 0x1C, 0x42,\n    0x5C, 0x11, 0x01, 0xB5, 0xC2, 0x90, 0x3D, 0xAB, 0x26, 0x4B, 0x2A, 0x67, 0x9F, 0x5B, 0x5B, 0xE3,\n    0x21, 0xA0, 0xB9, 0x7D, 0x64, 0xD3, 0xF8, 0xB3, 0x77, 0x91, 0x2D, 0x34, 0x78, 0x8E, 0xB8, 0x1D,\n    0x30, 0x4B, 0xE1, 0x31, 0xFE, 0x3D, 0xE6, 0xAB, 0xDA, 0xA6, 0xB4, 0xDF, 0xB0, 0x67, 0x25, 0x57,\n    0x4A, 0x30, 0x8F, 0x86, 0x58, 0x13, 0xE6, 0xEA, 0xEE, 0x91, 0x86, 0xD2, 0x0D, 0xCD, 0x19, 0xDC,\n    0x26, 0x18, 0x86, 0x52, 0xD2, 0x77, 0x79, 0x31, 0xDA, 0xF9, 0x9A, 0xCA, 0x7B, 0xBE, 0xF6, 0x96,\n    0x61, 0xAE, 0x32, 0xC8, 0x68, 0x17, 0xFF, 0xB8, 0xF4, 0xF5, 0xE5, 0xA4, 0x20, 0xC9, 0x44, 0x8A,\n    0xD6, 0x8D, 0xB0, 0x0D, 0x3D, 0x2B, 0x47, 0x4B, 0xA5, 0x49, 0x37, 0x11, 0x18, 0x2C, 0x94, 0x37,\n    0xEB, 0x7D, 0xD6, 0x49, 0x59, 0xFD, 0x75, 0xC7, 0x6C, 0x11, 0x83, 0xBD, 0x92, 0xF4, 0xA0, 0xFD,\n    0x5D, 0x2D, 0x24, 0x42, 0x8D, 0x3E, 0x96, 0xDA, 0x4B, 0xCD, 0x85, 0xDA, 0xF4, 0x11, 0x27, 0x0F,\n    0x5B, 0xE1, 0xB4, 0x62, 0x51, 0xC6, 0x04, 0x22, 0xCD, 0x8D, 0x3D, 0x26, 0x59, 0xC9, 0xF3, 0xBF,\n    0xBD, 0x07, 0xEB, 0x3D, 0xDD, 0x41, 0x3A, 0xAE, 0x35, 0xB6, 0x9C, 0x76, 0xE6, 0xE9, 0x5E, 0x98,\n    0xF6, 0x9F, 0x9B, 0x6D, 0x9A, 0x0F, 0xF3, 0xA2, 0x5E, 0xD0, 0x37, 0x0F, 0xA7, 0xB9, 0xC1, 0xC2,\n    0xFF, 0x26, 0x59, 0x51, 0xC6, 0x27, 0x15, 0x25, 0xFD, 0x8E, 0xA0, 0xAA, 0x72, 0xD4, 0xA8, 0x13,\n    0x61, 0xE0, 0x4C, 0xD0, 0xD2, 0xCA, 0xA8, 0x85, 0x98, 0x95, 0x26, 0x68, 0x7A, 0x1D, 0xBC, 0x6D,\n    0x87, 0xF8, 0x8C, 0xEC, 0x31, 0xA7, 0x8E, 0x98, 0x1C, 0xEC, 0x51, 0xCA, 0xF7, 0x38, 0x5A, 0x03,\n    0xF1, 0x7B, 0x84, 0x9D, 0x96, 0x75, 0x30, 0x96, 0x92, 0xDD, 0x4F, 0xCD, 0xD8, 0x00, 0xA0, 0xAB,\n    0x7B, 0x52, 0x42, 0x2F, 0x0A, 0x9F, 0x28, 0x18, 0x12, 0xD7, 0x47, 0xF5, 0x83, 0xB4, 0x27, 0xA6,\n    0x5D, 0x8C, 0xB1, 0xD7, 0xC2, 0xB5, 0x3F, 0xCC, 0x31, 0xCA, 0x7C, 0xB5, 0xB5, 0x37, 0xAA, 0xCB,\n    0xA5, 0x8A, 0x2D, 0x21, 0x72, 0x24, 0xCE, 0xD6, 0x05, 0xDA, 0x32, 0x2A, 0xA9, 0x92, 0x57, 0x07,\n    0x24, 0x7C, 0x53, 0x92, 0xBA, 0x4A, 0x3D, 0xF8, 0xA9, 0xCB, 0xEC, 0x7A, 0x34, 0x4A, 0xFD, 0x2E,\n    0x3D, 0x22, 0xA1, 0x8B, 0xC4, 0x8B, 0x39, 0x8F, 0x11, 0x8E, 0x75, 0x85, 0xB3, 0x1C, 0xB3, 0x2E,\n    0x5B, 0xF6, 0xF7, 0x03, 0x88, 0x11, 0x14, 0x7A, 0x42, 0xDA, 0x25, 0x0C, 0xAD, 0x88, 0xE7, 0xC9,\n    0xE6, 0x90, 0x65, 0x13, 0x2B, 0x40, 0x20, 0xC3, 0x03, 0xCC, 0x38, 0x71, 0x5C, 0x32, 0x54, 0xFE,\n    0x42, 0x2A, 0xC8, 0x4D, 0xDB, 0x4F, 0x0F, 0x9D, 0x53, 0xEA, 0xBE, 0xA8, 0x84, 0x87, 0x63, 0x8F,\n    0xC7, 0xC5, 0xC7, 0xD9, 0x41, 0xDF, 0x53, 0x72, 0x50, 0x61, 0x9A, 0x81, 0x6B, 0x70, 0x6F, 0xE4,\n    0x98, 0xBB, 0x46, 0xEF, 0x24, 0xA6, 0xA0, 0xCB, 0x49, 0x05, 0x13, 0xA6, 0xC2, 0x1F, 0x2D, 0x1A,\n    0x2B, 0xBD, 0xA9, 0x97, 0xB4, 0xEC, 0x6C, 0x0C, 0x1C, 0xA1, 0x9E, 0xDB, 0x5E, 0x55, 0x95, 0xE0,\n    0xE1, 0xC5, 0x4E, 0x97, 0x89, 0x69, 0xDA, 0xB6, 0x5C, 0xAA, 0xF2, 0x96, 0x28, 0x7A, 0xCB, 0xA9,\n    0xCE, 0x46, 0x5E, 0x07, 0xFE, 0x73, 0x4F, 0x2C, 0x46, 0xAF, 0xFB, 0x2F, 0xC5, 0xD1, 0xB6, 0xB2,\n    0x85, 0x65, 0x1C, 0x7F, 0x72, 0xBC, 0xF9, 0x51, 0x1B, 0x02, 0xAE, 0x6A, 0x46, 0xB5, 0x39, 0x1A,\n    0x8D, 0x34, 0x84, 0x40, 0xE5, 0x1B, 0x91, 0x11, 0xE9, 0x42, 0x44, 0x56, 0x64, 0x01, 0xF5, 0xC0,\n    0x7D, 0x64, 0x37, 0x72, 0xA4, 0x7A, 0xE5, 0xD6, 0x19, 0xA6, 0xDB, 0x78, 0x23, 0x47, 0x68, 0xE5,\n    0x8D, 0x7D, 0x8C, 0xE5, 0x63, 0xF3, 0x3E, 0x07, 0xEE, 0x4E, 0x8D, 0xF1, 0x56, 0x37, 0xA4, 0x27,\n    0xDC, 0x67, 0x45, 0x84, 0x41, 0x89, 0xD2, 0x77, 0x67, 0x3C, 0x76, 0x27, 0x6B, 0x8B, 0xD2, 0x65,\n    0x6A, 0x65, 0x2B, 0xB1, 0xA6, 0x73, 0x3F, 0xD2, 0xC6, 0x78, 0x5D, 0xF9, 0xDA, 0xBD, 0x8B, 0x9F,\n    0xC0, 0x5B, 0xF2, 0xF4, 0xA6, 0x46, 0xF4, 0x5A, 0xCD, 0xDC, 0x40, 0x0E, 0x48, 0x28, 0xA2, 0x98,\n    0x87, 0xE7, 0x4F, 0x46, 0xD4, 0x6E, 0xFB, 0x6F, 0x11, 0xC5, 0x85, 0xCF, 0xDF, 0xA9, 0xBB, 0xE1,\n    0x61, 0x80, 0x41, 0xFC, 0x69, 0x8F, 0xD7, 0xDD, 0xD9, 0x8B, 0x63, 0xE2, 0x60, 0x1A, 0x0A, 0xFF,\n    0x56, 0x85, 0x6C, 0x4C, 0x0D, 0x19, 0x9E, 0xE1, 0xCB, 0xF3, 0xEB, 0x9C, 0xBF, 0x11, 0x4A, 0x0B,\n    0x23, 0xFD, 0x88, 0x93, 0x1A, 0x8B, 0xA2, 0x68, 0xD2, 0x07, 0x90, 0x11, 0xC6, 0x3D, 0xEF, 0x2C,\n    0x3C, 0x02, 0x41, 0x1F, 0x41, 0x93, 0x2B, 0x83, 0xAB, 0x2D, 0x35, 0xA4, 0x6E, 0xD7, 0x36, 0x51,\n    0x09, 0x7C, 0x23, 0x4F, 0xAD, 0xF8, 0x38, 0xF0, 0x1D, 0x98, 0x2E, 0xEA, 0x20, 0xAF, 0x10, 0x9B,\n    0x03, 0x96, 0xE0, 0x68, 0xCB, 0x01, 0xC2, 0xAF, 0x4B, 0x70, 0xB0, 0x6F, 0xB6, 0xBC, 0x71, 0xA8,\n    0x57, 0x32, 0x26, 0x98, 0x23, 0xAD, 0xC6, 0x07, 0xE8, 0xDF, 0xB6, 0xC8, 0x83, 0xF6, 0x17, 0xFD,\n    0x4C, 0xDA, 0xB7, 0x1D, 0xA4, 0x92, 0xCE, 0xAD, 0x4B, 0xB8, 0xD2, 0xBB, 0xC4, 0x2E, 0x9C, 0xE3,\n    0x40, 0x31, 0xF1, 0xF8, 0x1A, 0xC7, 0x55, 0x99, 0x08, 0xAE, 0xFF, 0xD1, 0x39, 0x74, 0x4F, 0x87,\n    0x6A, 0x26, 0xBC, 0x36, 0x5D, 0x2C, 0x25, 0x53, 0x0B, 0x18, 0x15, 0x7F, 0xA3, 0x2A, 0x45, 0xC4,\n    0x9A, 0xE2, 0xEF, 0xDC, 0xDC, 0xF1, 0x9D, 0xE9, 0x5E, 0xD9, 0xD5, 0x54, 0x89, 0x6D, 0x5A, 0xCE,\n    0x8D, 0x22, 0x16, 0xF1, 0xD7, 0x36, 0xB9, 0x9A, 0xB0, 0xF4, 0xCD, 0xEF, 0xE6, 0x0C, 0x3A, 0x5D,\n    0x09, 0x22, 0xF6, 0x45, 0xD7, 0x02, 0x55, 0x01, 0x02, 0x7A, 0x4F, 0xBB, 0x22, 0x6A, 0x87, 0x66,\n    0x62, 0xD0, 0x1D, 0x54, 0x72, 0xB2, 0xD8, 0x0A, 0x7E, 0x60, 0xC1, 0x1D, 0x68, 0xEA, 0xFB, 0x6A,\n    0xE3, 0x5F, 0x97, 0xC5, 0xFD, 0xEB, 0x08, 0x2C, 0x50, 0x96, 0xB8, 0xC1, 0x9D, 0x5E, 0x1E, 0x3E,\n    0x46, 0xA6, 0x49, 0x57, 0xC8, 0xBD, 0xB1, 0xD6, 0xD5, 0x21, 0x2A, 0x03, 0x84, 0x65, 0x24, 0x11,\n    0xB0, 0xF0, 0x0F, 0xF4, 0x04, 0x52, 0x43, 0xBA, 0xEA, 0x93, 0xBA, 0x9F, 0x34, 0x26, 0x1F, 0xD7,\n    0x1F, 0x7B, 0xC0, 0x30, 0x01, 0x69, 0x68, 0x9B, 0x21, 0x13, 0xA5, 0xD4, 0x87, 0x30, 0xDC, 0xEB,\n    0x35, 0x39, 0x76, 0x35, 0xB9, 0xE3, 0xDF, 0xCD, 0xB5, 0xE5, 0x89, 0xEA, 0x54, 0x1F, 0x3E, 0xDB,\n    0x90, 0xCF, 0x5C, 0x4A, 0x96, 0x97, 0x32, 0x3F, 0x6F, 0xB4, 0xE5, 0x28, 0xDF, 0xE4, 0xCA, 0xB1,\n    0x1B, 0x78, 0x65, 0x2C, 0x99, 0x3D, 0x77, 0x32, 0x5F, 0x6C, 0x6D, 0xD3, 0x53, 0x67, 0x15, 0x39,\n    0xFD, 0xE1, 0x2A, 0xB0, 0x48, 0x24, 0x4D, 0x36, 0x4D, 0x90, 0x9F, 0xF3, 0x1D, 0x4F, 0x9D, 0x3B,\n    0xBE, 0x64, 0xFE, 0xF0, 0xF2, 0xAE, 0x31, 0xB2, 0xBE, 0x35, 0x8E, 0x34, 0xD6, 0x56, 0xAB, 0xF2,\n    0x45, 0xC4, 0x37, 0x65, 0xA0, 0x08, 0x66, 0x5D, 0x9F, 0x0D, 0x96, 0x0B, 0x58, 0xC2, 0x18, 0x00,\n    0x43, 0xBA, 0xC4, 0xFE, 0xD3, 0x6C, 0x96, 0x78, 0xAE, 0x10, 0x2D, 0x86, 0x4D, 0x8F, 0x87, 0x44,\n    0xCF, 0x8E, 0x1D, 0x23, 0x00, 0x8D, 0x8A, 0x91, 0x28, 0xDE, 0x13, 0xF1, 0x2B, 0xBC, 0x75, 0x32,\n    0xB3, 0x50, 0xDB, 0xD3, 0x5A, 0xA5, 0x2A, 0x28, 0x82, 0x70, 0x4B, 0xF9, 0x77, 0x70, 0xC5, 0x5D,\n    0x4A, 0x52, 0x43, 0x4C, 0x1D, 0x6E, 0xB5, 0x6A, 0x41, 0x65, 0xFF, 0xF2, 0x67, 0xC2, 0x86, 0x85,\n    0x0C, 0x95, 0x25, 0xAB, 0x61, 0x3E, 0x79, 0x0A, 0x2F, 0x3F, 0xBB, 0x4A, 0xC7, 0x33, 0xEE, 0x2E,\n    0x04, 0xD6, 0x44, 0xCE, 0x40, 0xB9, 0xFA, 0xF4, 0x8A, 0x7B, 0xA2, 0xE0, 0x43, 0xFE, 0x80, 0x88,\n    0xA5, 0xB1, 0x47, 0x51, 0xFF, 0x48, 0xE4, 0x13, 0xA1, 0x6D, 0x6D, 0x1E, 0x4F, 0x14, 0x5C, 0x32,\n    0x05, 0x73, 0x4E, 0x1B, 0x9E, 0xB2, 0xEB, 0xF1, 0xC7, 0x42, 0x84, 0x3A, 0xAA, 0xE0, 0x6D, 0xEC,\n    0x3E, 0x79, 0x60, 0x00, 0x36, 0x01, 0x2F, 0xBC, 0xB7, 0x82, 0x03, 0x6D, 0x26, 0x6F, 0x28, 0x6E,\n    0x4C, 0xB7, 0xD7, 0x93, 0xCB, 0xF2, 0xFC, 0x58, 0x2B, 0x3F, 0x5A, 0x2F, 0x88, 0x36, 0xCB, 0x7A,\n    0xEF, 0xF2, 0xC6, 0x63, 0xC1, 0x60, 0x20, 0x71, 0x1F, 0xE4, 0xA6, 0x8A, 0x14, 0x16, 0x7D, 0x9F,\n    0xD3, 0x83, 0x8D, 0x0C, 0x8D, 0xC4, 0x8A, 0x5D, 0x1F, 0xE2, 0x05, 0x07, 0xC7, 0x1D, 0x2B, 0x4F,\n    0xAF, 0x20, 0x33, 0x60, 0x43, 0x6D, 0x60, 0x5F, 0xEC, 0x57, 0x2F, 0xF5, 0x8A, 0xC4, 0xC7, 0x8E,\n    0x2B, 0x6B, 0xE8, 0xF0, 0xA2, 0x4E, 0x66, 0xBA, 0x55, 0xEF, 0x67, 0x78, 0x20, 0x70, 0x1D, 0x57,\n    0x25, 0x1C, 0xC8, 0x0C, 0x7F, 0x1D, 0x88, 0x4D, 0x28, 0xCE, 0x90, 0xDE, 0xE5, 0xBE, 0x9B, 0xCC,\n    0x28, 0x38, 0x52, 0xA5, 0xB4, 0xE0, 0x86, 0x7F, 0x73, 0x22, 0x75, 0x9D, 0xCA, 0x1F, 0xCB, 0x31,\n    0x35, 0xC7, 0x55, 0xA7, 0xD2, 0xCD, 0x56, 0xC7, 0x22, 0xA6, 0xD3, 0x37, 0x02, 0x2E, 0xBE, 0x08,\n    0x00, 0x26, 0x9A, 0x99, 0x62, 0x46, 0x1B, 0x25, 0xED, 0x6A, 0xD5, 0x61, 0x20, 0xB9, 0xDD, 0xF7,\n    0xBE, 0xDD, 0x64, 0x5D, 0x61, 0xE5, 0x2F, 0x87, 0x81, 0x47, 0x7E, 0xC2, 0x7D, 0x45, 0xB7, 0x2A,\n    0x0C, 0xB0, 0x0C, 0x5F, 0x4C, 0x93, 0x02, 0xEE, 0x96, 0x55, 0xAF, 0x7C, 0x06, 0xA8, 0x74, 0x64,\n    0x61, 0x6A, 0xA1, 0x41, 0x69, 0x55, 0x63, 0x15, 0x5B, 0x50, 0xA9, 0x8A, 0xC5, 0x02, 0x3E, 0x5E,\n    0xFF, 0x4D, 0xD7, 0xE4, 0xE0, 0x88, 0xFE, 0xB5, 0x53, 0x72, 0xA0, 0x52, 0xCE, 0x3C, 0x25, 0x98,\n    0xFF, 0x05, 0xFC, 0xE4, 0x0C, 0x57, 0xE7, 0x4C, 0xD0, 0xEB, 0x1B, 0x4C, 0xEC, 0x89, 0xCE, 0x88,\n    0x15, 0x6A, 0x9B, 0x7B, 0xDD, 0x0C, 0x53, 0x72, 0x0D, 0x0C, 0xD2, 0xE0, 0x6E, 0x20, 0xF5, 0x30,\n    0xCE, 0xD2, 0xF6, 0x11, 0x0D, 0xCC, 0x85, 0x4C, 0x9A, 0xD3, 0xBF, 0xF2, 0x39, 0xFF, 0x26, 0x4F,\n    0x4D, 0xAE, 0x25, 0x4A, 0x72, 0xD9, 0x22, 0x8B, 0xE1, 0x07, 0xA9, 0xBD, 0x53, 0x45, 0x7C, 0xEB,\n    0xFE, 0x56, 0xAE, 0x01, 0x7F, 0x12, 0x4E, 0x18, 0xE7, 0x96, 0xB1, 0x0E, 0x9C, 0x89, 0xA8, 0xB4,\n    0x1C, 0xDA, 0x3E, 0xFE, 0x8C, 0x1C, 0xEF, 0xB4, 0x50, 0xE5, 0x46, 0x1B, 0x56, 0xCE, 0x01, 0x53,\n    0xB2, 0x6D, 0xB0, 0xD0, 0x8E, 0x08, 0x89, 0x2A, 0x5B, 0xC8, 0xFC, 0x9B, 0x6B, 0x4B, 0x6D, 0xDC,\n    0x2E, 0x2E, 0x74, 0xAB, 0xE1, 0xAE, 0xA6, 0x74, 0x8F, 0x31, 0x74, 0x5F, 0x34, 0x45, 0xE4, 0x88,\n    0xCE, 0x66, 0x24, 0xE9, 0x93, 0x68, 0x76, 0xD6, 0xB9, 0x10, 0xA9, 0xBA, 0x6A, 0x3A, 0xCD, 0xB8,\n    0x95, 0x44, 0x7D, 0x75, 0x13, 0x64, 0x7B, 0xD2, 0x29, 0xB9, 0x3A, 0x75, 0x98, 0x26, 0xFC, 0x2B,\n    0x46, 0x8A, 0xFD, 0x5C, 0x2B, 0xB5, 0x6C, 0x48, 0x20, 0x5F, 0xAA, 0x09, 0xAD, 0xBA, 0x7B, 0xE3,\n    0x13, 0x55, 0x3D, 0xBD, 0x43, 0xEA, 0xC7, 0xA7, 0x3E, 0xDD, 0xF3, 0xEB, 0xBB, 0x7D, 0xFE, 0x2A,\n    0x9B, 0xC4, 0xFB, 0x44, 0x1D, 0xD1, 0x72, 0x33, 0x88, 0x65, 0xFE, 0xE7, 0xD1, 0xD7, 0x55, 0xDC,\n    0x2F, 0x17, 0xC0, 0x8A, 0xE2, 0xDA, 0x5E, 0xA4, 0x68, 0x9C, 0xA2, 0x5C, 0xA0, 0xE7, 0x1F, 0x02,\n    0xFB, 0xC3, 0xEE, 0x63, 0xB7, 0xBD, 0x29, 0xEF, 0xCB, 0xA5, 0x47, 0x5A, 0x79, 0x4D, 0x5E, 0x9D,\n    0x44, 0x5A, 0xF9, 0xC6, 0xDE, 0x0A, 0x71, 0x58, 0xB6, 0xA0, 0x02, 0xE5, 0xAA, 0x62, 0x15, 0xF4,\n    0x39, 0x28, 0x9A, 0xF8, 0x59, 0xF1, 0x92, 0x17, 0x45, 0x27, 0x6A, 0x1D, 0x11, 0x3E, 0x08, 0xA2,\n    0xCD, 0x31, 0x0E, 0xEE, 0xD4, 0xFC, 0xF9, 0x3C, 0x1F, 0x87, 0x00, 0xE2, 0x5F, 0xB8, 0x35, 0xBB,\n    0xC5, 0x97, 0x32, 0xCE, 0x7F, 0x1D, 0xD6, 0x05, 0xEE, 0xD7, 0x0D, 0xB9, 0x3C, 0x6B, 0xAF, 0x23,\n    0x0B, 0x86, 0x3C, 0x40, 0x66, 0xCD, 0x65, 0x8A, 0xF8, 0xEB, 0x6B, 0xAB, 0x2F, 0x98, 0x6C, 0x40,\n    0x8E, 0x54, 0x90, 0xB5, 0x1C, 0x79, 0x7B, 0x83, 0x12, 0xA4, 0x0B, 0x20, 0xD5, 0x95, 0x30, 0x2C,\n    0x8A, 0x6E, 0x94, 0xD2, 0xAB, 0x78, 0xF5, 0x71, 0x38, 0x4F, 0xB2, 0x93, 0x50, 0xDB, 0x16, 0x94,\n    0xC4, 0xA9, 0x7D, 0x9D, 0x2F, 0x48, 0x98, 0xEB, 0x74, 0xE2, 0xD7, 0x97, 0x91, 0xBC, 0xF8, 0x90,\n    0xAF, 0x74, 0x71, 0x38, 0x94, 0xFE, 0xA6, 0xC7, 0x89, 0x63, 0x0D, 0x9B, 0xF1, 0x81, 0x28, 0x4A,\n    0x75, 0x85, 0x53, 0x83, 0x34, 0x99, 0xE6, 0xF4, 0xAA, 0xF4, 0xF0, 0x1D, 0x92, 0xBE, 0x12, 0x8E,\n    0x20, 0xBF, 0xCA, 0x41, 0x30, 0x08, 0x9B, 0x47, 0xD0, 0x23, 0x45, 0x67, 0x38, 0x2B, 0x0F, 0xD3,\n    0xBA, 0x59, 0xEB, 0x7C, 0x39, 0xCF, 0xA8, 0xB7, 0xA9, 0xEF, 0xF4, 0xC7, 0xD9, 0x1B, 0x5B, 0xC4,\n    0xC3, 0xA3, 0x92, 0xA2, 0xF9, 0x1F, 0xC1, 0x99, 0x57, 0xE6, 0xD8, 0x22, 0xF8, 0xA5, 0xC8, 0x4B,\n    0xCE, 0xAD, 0xBD, 0x19, 0x71, 0xC3, 0x1A, 0xEB, 0x25, 0xFD, 0xA7, 0x7F, 0xA8, 0x7A, 0xEC, 0x54,\n    0x0A, 0x97, 0x3E, 0x85, 0x29, 0xAF, 0x85, 0xDE, 0x14, 0x10, 0x3C, 0xBD, 0x66, 0xBE, 0x59, 0xE4,\n    0x71, 0xD8, 0x7E, 0xEA, 0xF6, 0x8A, 0x8F, 0xF1, 0x3A, 0x03, 0x41, 0x99, 0x27, 0x45, 0xB6, 0x05,\n    0x2F, 0x6B, 0x11, 0x61, 0xB4, 0x40, 0x40, 0x3A, 0xD2, 0xE9, 0x90, 0xDD, 0x0C, 0x19, 0x3B, 0x01,\n    0xF2, 0xA4, 0xF5, 0x3B, 0x9C, 0x18, 0x32, 0x26, 0xCB, 0xDB, 0x20, 0x5B, 0xE2, 0x43, 0x70, 0xCB,\n    0x37, 0xA6, 0xEC, 0x34, 0x85, 0x33, 0xD6, 0x8B, 0x1F, 0x5F, 0x10, 0xCC, 0x86, 0xAB, 0x04, 0x31,\n    0x5D, 0x07, 0xD6, 0x7C, 0x5F, 0x71, 0x08, 0xAC, 0x3F, 0x08, 0xC6, 0xCF, 0xAC, 0x50, 0xCF, 0xA2,\n    0xFC, 0xDB, 0x02, 0x01, 0xD5, 0x33, 0x9E, 0x57, 0xDC, 0x88, 0xBC, 0x51, 0x71, 0x95, 0x9A, 0x86,\n    0x99, 0xBB, 0xFC, 0x5A, 0x3C, 0xB8, 0xC0, 0xA5, 0x12, 0xA4, 0x26, 0x55, 0xE7, 0x8A, 0xD0, 0x6F,\n    0x2C, 0x52, 0x21, 0xA4, 0x0A, 0xBE, 0xC9, 0xA7, 0x87, 0x4B, 0xBD, 0x47, 0x44, 0xFA, 0x7A, 0xE5,\n    0xDF, 0x07, 0x54, 0xC8, 0xA3, 0xF3, 0x73, 0x28, 0xE5, 0x52, 0x36, 0x04, 0x42, 0xAB, 0x9C, 0x6E,\n    0x80, 0x5B, 0x44, 0xF0, 0xA7, 0xC6, 0x00, 0xC3, 0x69, 0x14, 0xE9, 0x01, 0xD2, 0xE4, 0x69, 0x7D,\n    0x32, 0xAC, 0x78, 0x70, 0x76, 0x81, 0x9A, 0x19, 0x7D, 0x80, 0x82, 0xB5, 0xCE, 0x11, 0xBD, 0xF1,\n    0x15, 0x36, 0x49, 0xB1, 0x84, 0xCB, 0x15, 0x46, 0x87, 0xF4, 0x83, 0x3D, 0x82, 0x9A, 0x84, 0xB7,\n    0x86, 0x47, 0x06, 0x72, 0xE9, 0xE5, 0xFE, 0x4C, 0x11, 0xAE, 0xD1, 0x0D, 0xA7, 0xBE, 0xFD, 0xE2,\n    0xF7, 0xAD, 0xC2, 0x47, 0xA5, 0x72, 0x4A, 0x96, 0x38, 0xCC, 0x6B, 0xE7, 0x94, 0xA3, 0x91, 0x6B,\n    0x3D, 0x20, 0x86, 0xA4, 0x70, 0x84, 0xDB, 0x35, 0x78, 0xC9, 0x50, 0x89, 0x57, 0xE6, 0xB1, 0xA7,\n    0x60, 0xD7, 0x89, 0x13, 0x8C, 0x04, 0xEC, 0x19, 0x40, 0x0C, 0xFB, 0x5D, 0x73, 0xAB, 0x2B, 0x58,\n    0xEF, 0xD2, 0x9C, 0x2C, 0x8F, 0x11, 0x5F, 0x86, 0x43, 0xD3, 0x68, 0xE3, 0x7C, 0xB6, 0x6B, 0xEF,\n    0x88, 0xC6, 0x64, 0x69, 0x32, 0x0C, 0x86, 0x30, 0xCC, 0x25, 0x0B, 0x5A, 0x74, 0x64, 0x5C, 0xCC,\n    0xAC, 0xEF, 0x61, 0xFD, 0x06, 0xEE, 0x95, 0xC6, 0xEB, 0xB8, 0xD1, 0x46, 0x7B, 0x50, 0xD1, 0x1D,\n    0x82, 0x4C, 0xE5, 0xA2, 0xB2, 0xAC, 0x24, 0x49, 0xE0, 0xFB, 0x14, 0x29, 0xC9, 0x39, 0x93, 0x9C,\n    0x35, 0x61, 0xD4, 0x29, 0xD3, 0x1A, 0x21, 0x6C, 0xD4, 0x89, 0x84, 0x47, 0xF6, 0xE2, 0x00, 0x3A,\n    0x40, 0xB2, 0xC1, 0x39, 0xFE, 0x79, 0x18, 0xC8, 0x5A, 0x41, 0x1C, 0xAD, 0x8A, 0xB6, 0x79, 0x3F,\n    0x32, 0xFD, 0x8F, 0x3E, 0x57, 0x22, 0x5F, 0xDE, 0xE0, 0x90, 0x9B, 0xB7, 0xF7, 0x80, 0xA2, 0x42,\n    0x33, 0x4E, 0x64, 0xD2, 0xB4, 0x25, 0x77, 0x62, 0xA2, 0x48, 0x80, 0x06, 0x17, 0xBB, 0xC8, 0x04,\n    0x35, 0x94, 0x1A, 0xD7, 0x64, 0xA4, 0xE6, 0xB6, 0xE6, 0x43, 0x30, 0x46, 0x78, 0xB6, 0x98, 0x1B,\n    0x0F, 0x90, 0xE6, 0xF7, 0x9A, 0x6A, 0xEC, 0x96, 0x7F, 0x46, 0xD8, 0x1E, 0x62, 0xA6, 0x56, 0x54,\n    0x63, 0x44, 0x62, 0x18, 0x75, 0x61, 0xB4, 0x11, 0x0F, 0x6D, 0x5E, 0xE3, 0x45, 0xD4, 0x80, 0xC1,\n    0xAF, 0x98, 0xF6, 0x48, 0x15, 0xDF, 0xD5, 0x3C, 0xD3, 0xE9, 0xD2, 0x17, 0x7E, 0x1A, 0x18, 0x3A,\n    0xA1, 0xFF, 0xF0, 0x46, 0x9C, 0x48, 0xBA, 0x72, 0xFF, 0x21, 0x66, 0x63, 0x8D, 0xB7, 0xA5, 0x17,\n    0x42, 0x4F, 0x2E, 0xCA, 0xEA, 0x8E, 0xD9, 0x6F, 0xBD, 0x4B, 0x80, 0x4C, 0x73, 0x4F, 0x85, 0x3D,\n    0x0B, 0x80, 0x32, 0x1A, 0xAD, 0x93, 0x83, 0x82, 0x0B, 0xA6, 0x5E, 0x76, 0x5B, 0x60, 0x51, 0x81,\n    0x53, 0x9D, 0x82, 0x5F, 0x65, 0xAD, 0x93, 0x80, 0x81, 0x2C, 0x8A, 0x0B, 0x7D, 0x58, 0x67, 0xE5,\n    0xAD, 0xB9, 0x94, 0xF7, 0x11, 0x58, 0xE9, 0x7D, 0xE0, 0xC6, 0x92, 0xC9, 0x7D, 0x4C, 0xDC, 0x4C,\n    0x88, 0x22, 0x31, 0x68, 0xC3, 0x37, 0xE3, 0x1E, 0xE5, 0xA4, 0x6B, 0x41, 0xEA, 0x9D, 0xE8, 0xFC,\n    0xF1, 0xF3, 0x78, 0xF4, 0x54, 0x40, 0x53, 0x9D, 0x7D, 0x4C, 0x70, 0x56, 0xBE, 0xB0, 0x74, 0x67,\n    0xAC, 0x7D, 0xE0, 0x4F, 0x67, 0x28, 0x71, 0xDD, 0xCE, 0x78, 0xDB, 0xB5, 0xFF, 0x54, 0x22, 0xBD,\n    0x89, 0x74, 0x38, 0x14, 0x1A, 0x10, 0x2C, 0xDF, 0x30, 0x24, 0xB0, 0xC1, 0x85, 0x09, 0x4D, 0xB5,\n    0xE2, 0x02, 0x5E, 0x85, 0x9E, 0x6E, 0x6A, 0xB7, 0xE0, 0x6C, 0xF3, 0x91, 0x42, 0xE7, 0x08, 0x07,\n    0x95, 0x00, 0xD9, 0x7F, 0x2C, 0xD0, 0xA1, 0x2A, 0xB1, 0x52, 0x18, 0x62, 0x57, 0x51, 0xA0, 0xF2,\n    0xC9, 0x8B, 0xAA, 0x01, 0x08, 0x74, 0xA6, 0x7C, 0x60, 0x3D, 0x3C, 0x4B, 0xED, 0x45, 0xFE, 0xCE,\n    0x00, 0x9E, 0x6E, 0x99, 0xDA, 0x0B, 0xC6, 0xB6, 0xC5, 0xCF, 0xAA, 0x03, 0xEE, 0x7F, 0x41, 0xAE,\n    0x83, 0xAB, 0x23, 0xAA, 0x67, 0x1E, 0x20, 0x42, 0x55, 0x54, 0x95, 0xAE, 0xAE, 0x82, 0x2A, 0x3F,\n    0xAA, 0x14, 0x66, 0xF4, 0xAB, 0x01, 0xAD, 0x5F, 0xA7, 0x76, 0xFA, 0x21, 0xF4, 0x82, 0x22, 0x67,\n    0x8F, 0xDC, 0xA2, 0x1A, 0xBC, 0x01, 0x75, 0x8D, 0x66, 0x8C, 0xD5, 0x46, 0x90, 0x4D, 0xD8, 0xC0,\n    0xBC, 0x0F, 0x61, 0xB2, 0xE9, 0xE2, 0xD0, 0x32, 0x27, 0x4B, 0x39, 0x43, 0x50, 0xD0, 0xF7, 0xF2,\n    0x32, 0x24, 0xE8, 0x32, 0x19, 0x31, 0x57, 0x04, 0x5B, 0xAB, 0x54, 0xC7, 0x44, 0x6B, 0x5F, 0x6C,\n    0x14, 0xB2, 0x83, 0xA2, 0xEC, 0x5F, 0x04, 0x8A, 0x78, 0x0D, 0xF8, 0x8F, 0x61, 0xFA, 0x32, 0xC9,\n    0xB4, 0x60, 0xCC, 0xCB, 0x35, 0x92, 0xB3, 0x23, 0x29, 0x28, 0x4D, 0x48, 0x6C, 0x00, 0x9F, 0xF9,\n    0x8D, 0x26, 0x44, 0xC9, 0x0B, 0xB2, 0x73, 0x94, 0xF3, 0x7A, 0x9C, 0x4E, 0x7E, 0xC3, 0xB7, 0x7E,\n    0x87, 0x98, 0x18, 0x83, 0x35, 0x93, 0xDD, 0x35, 0xF7, 0xD1, 0x3D, 0xF1, 0x40, 0x48, 0x89, 0xAC,\n    0xEE, 0x98, 0xE7, 0x5A, 0x77, 0xED, 0x3A, 0xED, 0x5A, 0xE7, 0x38, 0x74, 0xF7, 0xD6, 0xB6, 0x40,\n    0x76, 0xAE, 0xBD, 0x99, 0x93, 0x02, 0xB3, 0xFF, 0xDE, 0x14, 0x70, 0xC3, 0xBF, 0x77, 0x00, 0x4F,\n    0xC6, 0x7E, 0x7A, 0x1E, 0x39, 0xD3, 0x00, 0xDC, 0xC2, 0x35, 0x01, 0x25, 0x8C, 0x9C, 0x34, 0x79,\n    0xA0, 0x47, 0xD4, 0xD4, 0x3B, 0xFF, 0x89, 0x7D, 0x79, 0x8B, 0xBF, 0x9A, 0x64, 0x4E, 0xB7, 0xE5,\n    0x79, 0x31, 0xB8, 0x45, 0x03, 0xD0, 0xCC, 0xA6, 0xE5, 0x22, 0xBC, 0xF1, 0x40, 0x24, 0xBA, 0xF6,\n    0x2B, 0xE0, 0x21, 0xE3, 0xA5, 0x4D, 0xBE, 0xBB, 0x45, 0x12, 0x5A, 0x10, 0x1B, 0x28, 0xC2, 0xD6,\n    0x85, 0xBE, 0xBD, 0xD0, 0xDD, 0xA3, 0xA0, 0x7B, 0x2F, 0x98, 0xE2, 0x9D, 0x62, 0xB1, 0xB6, 0xE2,\n    0x1E, 0x1D, 0x7E, 0x69, 0x6F, 0x39, 0x92, 0xF2, 0x97, 0x3D, 0x02, 0xE1, 0x17, 0x25, 0x03, 0x63,\n    0x20, 0x39, 0xEF, 0xBD, 0x56, 0xFD, 0x66, 0xD5, 0x40, 0x31, 0x9A, 0xA7, 0x45, 0x00, 0xD0, 0x01,\n    0x60, 0x30, 0xA2, 0xD5, 0x6C, 0x5A, 0x56, 0x67, 0x11, 0x57, 0xC8, 0x09, 0x9D, 0x96, 0xB0, 0xD1,\n    0x88, 0x9F, 0xE7, 0xE3, 0xAC, 0xD0, 0x0C, 0x39, 0x13, 0xB8, 0xF5, 0xFA, 0xDB, 0xFE, 0x5C, 0x52,\n    0x4A, 0x8D, 0xA2, 0x8C, 0xA8, 0x7E, 0xAB, 0xEC, 0x22, 0x7F, 0x23, 0x04, 0x16, 0x0E, 0x8F, 0x99,\n    0xD7, 0x83, 0x13, 0xDF, 0x40, 0x3F, 0xB7, 0xF1, 0xA9, 0x2A, 0x04, 0x62, 0xD3, 0xC1, 0x2F, 0x4B,\n    0x5D, 0xE8, 0xB8, 0x0E, 0xD2, 0x46, 0xF3, 0x13, 0x92, 0x9A, 0x63, 0x03, 0x54, 0xEC, 0x9E, 0xD3,\n    0x30, 0x00, 0x03, 0x8A, 0x77, 0x8B, 0xCD, 0x8C, 0x3D, 0x6B, 0x9E, 0xBB, 0x72, 0x7B, 0xB8, 0x72,\n    0xB9, 0xCD, 0x98, 0x69, 0xFB, 0x20, 0xB8, 0xC5, 0x3F, 0xA0, 0x9C, 0xD1, 0x29, 0x89, 0xE0, 0x55,\n    0xDF, 0x87, 0x5D, 0x90, 0x28, 0x99, 0xE6, 0x39, 0x63, 0x6A, 0x19, 0xE8, 0x0D, 0x50, 0xB1, 0x2C,\n    0xF3, 0x31, 0xC1, 0x68, 0x23, 0xE3, 0x70, 0xFF, 0x7E, 0x1F, 0x4D, 0xF5, 0xC5, 0x90, 0xE9, 0x81,\n    0x17, 0x66, 0x17, 0x40, 0x44, 0xDF, 0x2F, 0x63, 0x50, 0x82, 0x72, 0x87, 0x23, 0x93, 0x6B, 0x7E,\n    0xAD, 0x53, 0x6F, 0xD7, 0x78, 0x31, 0x25, 0x9F, 0x9E, 0xC3, 0xC9, 0x42, 0x18, 0x40, 0xE9, 0x4C,\n    0xFC, 0xAA, 0xC7, 0xF5, 0x51, 0x93, 0x24, 0xE2, 0xFD, 0x69, 0x72, 0x68, 0xE1, 0x8D, 0x59, 0x42,\n    0x1A, 0x14, 0x48, 0x6A, 0xDD, 0x59, 0xC3, 0xA7, 0x34, 0x73, 0x37, 0xAE, 0x82, 0xB9, 0xEB, 0x46,\n    0xD2, 0xB6, 0x31, 0xB4, 0x3E, 0x82, 0x49, 0x4B, 0x0F, 0x13, 0xB5, 0x98, 0x47, 0x26, 0xD4, 0x45,\n    0x8C, 0xE2, 0x04, 0xD4, 0xC6, 0x8B, 0x7B, 0x7D, 0x0E, 0x7D, 0x3C, 0x63, 0x39, 0xD7, 0xDF, 0xB2,\n    0x68, 0x34, 0xD4, 0xB4, 0x70, 0x6A, 0x98, 0x15, 0xDF, 0x16, 0xEF, 0xAF, 0x1E, 0xC5, 0x1F, 0x5C,\n    0x3D, 0x85, 0x74, 0xC6, 0xCF, 0x44, 0x01, 0xD3, 0xC3, 0x61, 0x93, 0xBF, 0x23, 0x9F, 0x99, 0x44,\n    0x54, 0x2A, 0x32, 0xB9, 0x75, 0x21, 0x1B, 0x2C, 0xE1, 0xFB, 0xFF, 0xAF, 0x62, 0x6F, 0x86, 0x23,\n    0xFE, 0xCD, 0x68, 0x38, 0xB6, 0xAC, 0x49, 0xF6, 0x4A, 0x0C, 0xA1, 0xF5, 0x19, 0xD1, 0x5A, 0xA8,\n    0xF0, 0xB4, 0x9B, 0x4E, 0x0F, 0x6B, 0x65, 0x46, 0x44, 0x16, 0x2F, 0x7E, 0x6E, 0xDC, 0x5F, 0x5E,\n    0x6F, 0x31, 0x99, 0x43, 0xA0, 0x27, 0xBD, 0x2A, 0x58, 0x6E, 0xB2, 0x82, 0x29, 0x78, 0xED, 0xA6,\n    0x83, 0x4D, 0x1B, 0xCD, 0x9C, 0x0F, 0xE5, 0xE7, 0x1A, 0xE4, 0x63, 0xD6, 0x6A, 0xD5, 0x03, 0x39,\n    0xB8, 0x48, 0x77, 0x80, 0xF7, 0xF3, 0xFE, 0x64, 0x8B, 0x98, 0x72, 0xBE, 0x31, 0x28, 0xF0, 0x48,\n    0x2A, 0x65, 0x37, 0xDA, 0xD1, 0x9A, 0x18, 0x37, 0xBB, 0x23, 0x59, 0xB3, 0x24, 0x75, 0xF7, 0xF5,\n    0x79, 0x4E, 0xF0, 0xCA, 0x85, 0x13, 0x3C, 0x93, 0xD0, 0xC6, 0xD9, 0xEA, 0xAE, 0xDF, 0x7E, 0xAC,\n    0xE4, 0xAB, 0x88, 0x0E, 0x78, 0x80, 0x1D, 0x26, 0x2A, 0x5C, 0x95, 0x23, 0x6B, 0x70, 0x99, 0x6C,\n    0x15, 0xC4, 0x86, 0xC0, 0x29, 0x9D, 0x55, 0xE4, 0xC1, 0x84, 0x37, 0x6B, 0xA7, 0x26, 0x82, 0xCC,\n    0x9C, 0xDA, 0xEB, 0x54, 0x17, 0x67, 0xD3, 0x74, 0x4B, 0x4F, 0x7C, 0x63, 0x4D, 0xE7, 0xE4, 0x93,\n    0x34, 0xDB, 0xDE, 0x9D, 0x17, 0x28, 0x06, 0xEA, 0x09, 0x2A, 0x63, 0x8D, 0x1A, 0x32, 0xD8, 0xC9,\n    0x66, 0xE2, 0x77, 0xE6, 0x19, 0x59, 0x44, 0x13, 0x2A, 0x7E, 0x4E, 0xF4, 0x5A, 0xC7, 0xBB, 0x43,\n    0xDC, 0xC8, 0x6A, 0x56, 0x5D, 0x2F, 0x55, 0xFD, 0x7E, 0x5A, 0x37, 0x1F, 0x99, 0xE3, 0xF8, 0xEC,\n    0x50, 0x0B, 0xE3, 0x94, 0xC4, 0xF5, 0xCD, 0xC1, 0x03, 0x96, 0x76, 0xB3, 0x34, 0x01, 0xF9, 0x5C,\n    0xE6, 0xC9, 0x99, 0x40, 0xB7, 0xCD, 0x5C, 0xF8, 0xE6, 0xF7, 0x3F, 0x7B, 0x13, 0x19, 0x22, 0x02,\n    0xEF, 0x59, 0x45, 0x48, 0x61, 0x2B, 0xED, 0xCD, 0xB5, 0x90, 0x2C, 0xD0, 0x49, 0xB4, 0x39, 0x76,\n    0x51, 0xBE, 0x51, 0xD7, 0x3D, 0xD7, 0xDD, 0x55, 0x98, 0xC5, 0x0F, 0xBD, 0xF6, 0xE0, 0x96, 0xAA,\n    0xB8, 0x19, 0x97, 0x7F, 0x35, 0x2C, 0x50, 0x69, 0xE8, 0xEE, 0x6A, 0x2F, 0x00, 0x18, 0x65, 0x1B,\n    0xD6, 0xB8, 0x2A, 0xC3, 0x0A, 0x37, 0xEA, 0x7E, 0x95, 0x8B, 0x60, 0xA5, 0x2E, 0xC0, 0x55, 0x24,\n    0x3B, 0x3D, 0xB1, 0x40, 0x22, 0x8A, 0x56, 0xAB, 0x04, 0x6B, 0x31, 0x0E, 0xB6, 0xD7, 0x17, 0xF1,\n    0xEA, 0x9B, 0x91, 0x0E, 0xEE, 0xCE, 0x0A, 0xFE, 0x37, 0x46, 0xAC, 0x15, 0xF9, 0x60, 0xFF, 0x73,\n    0x54, 0xC9, 0xE1, 0x8C, 0x42, 0xFA, 0x39, 0x51, 0xD4, 0x77, 0xAC, 0x62, 0xF3, 0x15, 0x8D, 0xC5,\n    0xEC, 0x46, 0x75, 0x97, 0x50, 0xED, 0x10, 0xF5, 0xC7, 0x81, 0xEC, 0x1D, 0x7C, 0x40, 0x7B, 0x9F,\n    0x4F, 0x37, 0xA4, 0xED, 0x3C, 0x35, 0x68, 0xDB, 0xDB, 0x7F, 0xF2, 0xF3, 0xDC, 0x39, 0xA0, 0x40,\n    0xE8, 0x17, 0x9C, 0xD8, 0x26, 0x92, 0xF2, 0x57, 0x5E, 0xE7, 0x56, 0xDA, 0x4F, 0x3F, 0x4C, 0xF4,\n    0x90, 0x4A, 0x89, 0x33, 0x49, 0xBB, 0x99, 0xE9, 0xCA, 0x6F, 0x5F, 0x51, 0xAE, 0xFF, 0x83, 0x90,\n    0x83, 0x53, 0xFF, 0x00, 0x7F, 0x2F, 0x84, 0xD7, 0xD8, 0xE8, 0xB1, 0xAB, 0xF9, 0x56, 0x65, 0x93,\n    0xA7, 0xC2, 0xB4, 0xD7, 0x6B, 0xB4, 0xCF, 0x65, 0xC8, 0xCA, 0x20, 0x15, 0x91, 0x74, 0x30, 0x4D,\n    0x72, 0x5B, 0xBD, 0x70, 0xC5, 0x8B, 0xD3, 0xC7, 0xD4, 0x7B, 0xFB, 0xDF, 0x6B, 0x7B, 0x19, 0x6B,\n    0x8B, 0x83, 0x47, 0x83, 0xC6, 0x44, 0xBA, 0xA8, 0xEA, 0xB8, 0x38, 0x67, 0x6B, 0x58, 0xF3, 0x4E,\n    0xC8, 0xA8, 0xF4, 0xDD, 0x30, 0xDD, 0x59, 0x4D, 0x55, 0x27, 0x1E, 0x14, 0x3A, 0x71, 0xD5, 0xFD,\n    0x59, 0x0B, 0xC2, 0x17, 0x2F, 0x08, 0x53, 0x27, 0x07, 0xEE, 0xA0, 0xC6, 0xE9, 0xF8, 0x31, 0xDD,\n    0x97, 0xC4, 0xAD, 0xC1, 0x9A, 0x60, 0x5C, 0xE4, 0x27, 0x0A, 0x03, 0x35, 0x10, 0x9C, 0xE8, 0x70,\n    0xE3, 0xF3, 0xD8, 0xE6, 0x72, 0xA5, 0x31, 0xC6, 0xFE, 0x46, 0xA8, 0x46, 0x6E, 0x74, 0x90, 0xD6,\n    0x8F, 0x27, 0x3C, 0x39, 0x24, 0x5E, 0x31, 0x3C, 0xCC, 0x9A, 0xDD, 0xFE, 0xE9, 0xDA, 0x84, 0xE8,\n    0xA1, 0xCC, 0x4B, 0xE1, 0x1B, 0xAA, 0x7D, 0xF6, 0x7C, 0xA8, 0x4C, 0xD5, 0xFC, 0x3C, 0x4C, 0xFC,\n    0x62, 0x32, 0xAE, 0x5D, 0xBA, 0x65, 0xDC, 0xC3, 0x1D, 0x8C, 0x9D, 0x0E, 0x2A, 0x46, 0x64, 0x8D,\n    0xCD, 0x6E, 0xBC, 0x86, 0x16, 0x15, 0xA2, 0x26, 0xD1, 0x3E, 0x5F, 0x0A, 0x81, 0x86, 0x0F, 0xE8,\n    0xA1, 0x28, 0xA3, 0x5F, 0xFF, 0xE4, 0x68, 0x2C, 0xE6, 0x30, 0x16, 0xB8, 0x2E, 0xCD, 0x41, 0x52,\n    0xE3, 0x81, 0xFB, 0x1D, 0x1C, 0xA2, 0x17, 0xC3, 0xF1, 0x24, 0x02, 0x94, 0xB9, 0x59, 0xEC, 0x4A,\n    0x6D, 0xE3, 0x27, 0x18, 0x2C, 0xDA, 0x75, 0x17, 0x42, 0xAA, 0xF7, 0x61, 0x50, 0x29, 0x8C, 0x0A,\n    0xCA, 0x8E, 0xCA, 0x59, 0x82, 0x1F, 0x1D, 0x0B, 0x00, 0x36, 0xE4, 0x78, 0x25, 0x01, 0xF7, 0xFB,\n    0x0E, 0x65, 0x4E, 0x07, 0x5E, 0xD8, 0x23, 0xC6, 0x49, 0x76, 0x06, 0x0B, 0xA5, 0xC2, 0x30, 0x55,\n    0x82, 0xF6, 0x60, 0x69, 0xAE, 0x1B, 0x37, 0xC1, 0x02, 0xE8, 0x23, 0x9B, 0x15, 0x70, 0x7B, 0xF8,\n    0xF9, 0x5E, 0x50, 0x69, 0x2F, 0x28, 0x7E, 0xDB, 0x35, 0x2F, 0x6C, 0x87, 0xCC, 0xFD, 0x23, 0x1A,\n    0x3B, 0x32, 0x9C, 0xFC, 0xE2, 0x6A, 0x24, 0x2A, 0x0C, 0x5E, 0x4D, 0x19, 0x7E, 0xDA, 0xCA, 0x95,\n    0x61, 0xE1, 0xC6, 0x60, 0x4E, 0x62, 0xCB, 0x6A, 0x09, 0x83, 0x02, 0xEF, 0xC8, 0x7E, 0x36, 0x79,\n    0x14, 0x24, 0x35, 0x01, 0xCF, 0xCB, 0x95, 0xF5, 0x08, 0x5E, 0x0A, 0x46, 0xD2, 0x5B, 0x46, 0x43,\n    0x54, 0x3B, 0x4F, 0x96, 0xD5, 0x53, 0x81, 0x8D, 0x0E, 0xDE, 0x7A, 0x94, 0xB8, 0x09, 0x11, 0x47,\n    0x8F, 0x38, 0xFE, 0x47, 0x00, 0xFA, 0x76, 0x73, 0x96, 0xDA, 0x1C, 0x55, 0xE9, 0x9E, 0x73, 0x1E,\n    0x75, 0xCF, 0x7A, 0x4D, 0xB0, 0x44, 0x6E, 0x2A, 0x6D, 0x98, 0x2B, 0x39, 0xDC, 0xBA, 0x17, 0x50,\n    0x06, 0xEA, 0xA6, 0x62, 0x33, 0xD9, 0xD2, 0x66, 0x78, 0x05, 0xE5, 0x52, 0x2B, 0x9F, 0x34, 0xAE,\n    0xDF, 0xE9, 0x9D, 0x44, 0xBA, 0x93, 0xD8, 0x29, 0x02, 0xC6, 0xED, 0x5A, 0x59, 0x0A, 0xD0, 0xD9,\n    0x6D, 0xBE, 0x97, 0x25, 0x5E, 0xDA, 0x95, 0x44, 0xCE, 0x73, 0xFD, 0xE5, 0x98, 0xFD, 0x75, 0x38,\n    0x88, 0x1E, 0x42, 0x2A, 0x3F, 0x65, 0x96, 0x7C, 0xF1, 0x86, 0x51, 0xBE, 0x51, 0xB1, 0x1E, 0xD1,\n    0x76, 0x64, 0x08, 0x85, 0x49, 0xD7, 0xDD, 0xDD, 0xD4, 0xFA, 0xFE, 0xCA, 0x67, 0xDB, 0x36, 0x90,\n    0x07, 0xEB, 0x86, 0xF6, 0x07, 0x7A, 0x21, 0xDB, 0xEE, 0x57, 0x24, 0x55, 0x87, 0x2C, 0xD2, 0xA4,\n    0xEE, 0x45, 0x51, 0xE8, 0x05, 0xD1, 0x24, 0x08, 0xD0, 0x3B, 0x7D, 0xCA, 0x0E, 0x5D, 0x03, 0x57,\n    0x44, 0xF7, 0x76, 0x0A, 0xCD, 0x20, 0x9B, 0x93, 0xE0, 0x7D, 0x86, 0x3E, 0x48, 0x8D, 0xF0, 0x4C,\n    0x28, 0x32, 0x77, 0xD8, 0xA3, 0x48, 0xA0, 0x93, 0x36, 0x05, 0xA0, 0x19, 0xF2, 0x98, 0x6C, 0x17,\n    0x5E, 0x2C, 0x5E, 0xE4, 0xAD, 0x36, 0x96, 0x10, 0x1B, 0xE5, 0xB7, 0x6B, 0x84, 0x0C, 0xED, 0xE3,\n    0xDC, 0x4B, 0xA4, 0xE7, 0x0A, 0xDA, 0xD4, 0xE7, 0xD9, 0x1E, 0xEE, 0xF9, 0xD5, 0x06, 0xAF, 0x3F,\n    0x51, 0x1D, 0x98, 0x42, 0x77, 0x11, 0x02, 0x57, 0x10, 0x3C, 0x5C, 0x98, 0xDA, 0x7D, 0x64, 0x6B,\n    0xEC, 0x6B, 0x51, 0xFB, 0x77, 0x31, 0x79, 0xCE, 0x9C, 0x58, 0x03, 0xEA, 0x2A, 0xDF, 0x92, 0x5D,\n    0xED, 0x0F, 0x20, 0xCC, 0x0A, 0x70, 0x42, 0x94, 0x37, 0xFA, 0xDF, 0xA1, 0xAF, 0x70, 0x1B, 0x0E,\n    0x80, 0x5B, 0x3E, 0xA9, 0xBF, 0x0F, 0x2B, 0x5D, 0xD8, 0x2F, 0xEF, 0xF9, 0xF3, 0x53, 0xC5, 0xE7,\n    0x93, 0x87, 0x49, 0x54, 0xE4, 0x48, 0x74, 0xD2, 0xDC, 0x2A, 0x9A, 0xE2, 0x18, 0x61, 0xD7, 0xAC,\n    0x4C, 0x1A, 0x2E, 0x72, 0x83, 0x8D, 0xDA, 0xCE, 0x16, 0xD1, 0x3F, 0x90, 0x62, 0xCA, 0xA7, 0x06,\n    0x22, 0x66, 0xF3, 0x67, 0xB0, 0xA3, 0xD4, 0xDD, 0xB1, 0xA4, 0xF3, 0x22, 0xB3, 0x02, 0x4D, 0xD4,\n    0x2C, 0x84, 0xF5, 0x75, 0x87, 0x7D, 0x56, 0x04, 0xC1, 0xC1, 0x62, 0x12, 0x59, 0xCF, 0x04, 0xA4,\n    0x20, 0x1F, 0xF5, 0xC5, 0x8D, 0xB6, 0x88, 0x54, 0x61, 0xF3, 0x5A, 0x88, 0x3F, 0x6E, 0x5C, 0xE9,\n    0x8B, 0x81, 0x56, 0xE6, 0x10, 0xC7, 0xED, 0x5F, 0x03, 0x67, 0x3E, 0x2E, 0xBD, 0x6A, 0xC3, 0x4D,\n    0x33, 0xB7, 0xD4, 0x87, 0x46, 0x0B, 0x27, 0x86, 0xFC, 0x65, 0x6F, 0xDF, 0x5A, 0x3D, 0x77, 0x49,\n    0x5A, 0xFB, 0x3A, 0x81, 0xCE, 0xA1, 0xAC, 0x02, 0x18, 0x7E, 0x5B, 0x58, 0x75, 0xFB, 0x64, 0x7C,\n    0xAA, 0x50, 0xE6, 0xE6, 0xA2, 0x7E, 0xFC, 0xC7, 0x67, 0x25, 0x5D, 0xE5, 0x24, 0x28, 0x1F, 0x3B,\n    0xE6, 0x31, 0x6D, 0x43, 0x93, 0xD3, 0xC4, 0xB4, 0x6F, 0x89, 0x02, 0x9B, 0x54, 0xC7, 0x6B, 0x97,\n    0xD3, 0x85, 0x06, 0xE1, 0x4E, 0x15, 0xD2, 0xE8, 0xF3, 0x94, 0x37, 0x40, 0x30, 0x2C, 0xA0, 0x25,\n    0x77, 0xA8, 0xC0, 0x23, 0x3F, 0x5F, 0x55, 0x71, 0x21, 0xD3, 0x33, 0x0B, 0x7A, 0x2F, 0xDF, 0xB9,\n    0x39, 0x0D, 0xAE, 0x65, 0xCF, 0x53, 0x9C, 0x82, 0xA2, 0xE5, 0x40, 0xF9, 0xF6, 0xDF, 0xBA, 0x33,\n    0x96, 0xF3, 0x55, 0x25, 0x35, 0x9E, 0x5F, 0x9B, 0x25, 0x39, 0x94, 0x2F, 0x03, 0xA6, 0x28, 0xB0,\n    0x6A, 0xFF, 0xFA, 0x14, 0xD6, 0xE7, 0x02, 0x07, 0x8F, 0x1A, 0xC4, 0xF0, 0x51, 0x34, 0x3D, 0xD3,\n    0xDF, 0xCB, 0x57, 0xC3, 0xF5, 0x04, 0xE2, 0x4C, 0x58, 0x18, 0xA5, 0xE2, 0x39, 0xB4, 0xA3, 0xE2,\n    0xE6, 0x25, 0xC5, 0xAC, 0xFD, 0x75, 0xB2, 0x2B, 0x5B, 0x93, 0xC5, 0xFF, 0x56, 0xDB, 0xAA, 0x6E,\n    0xCC, 0x18, 0x98, 0x90, 0x8A, 0x2C, 0x85, 0x84, 0xE7, 0xCF, 0xB0, 0xC5, 0x18, 0x1F, 0x59, 0xC7,\n    0xA4, 0xCE, 0xAD, 0xB2, 0x04, 0x41, 0xBD, 0x56, 0xD3, 0x12, 0xD5, 0x0A, 0x19, 0x83, 0x6D, 0xED,\n    0x87, 0xB0, 0xAB, 0xAE, 0x8F, 0x79, 0xE5, 0x51, 0x30, 0xE9, 0x90, 0xBB, 0x91, 0x38, 0x2A, 0x17,\n    0xDE, 0x3F, 0x53, 0x54, 0x34, 0x1E, 0x3F, 0x20, 0xE1, 0xA5, 0x17, 0xD5, 0xCD, 0x64, 0x62, 0x1C,\n    0x60, 0xD2, 0xFC, 0xC1, 0x86, 0xA1, 0x55, 0x62, 0x29, 0x58, 0x33, 0xD6, 0x1D, 0x3F, 0xD2, 0x70,\n    0xD6, 0x79, 0x09, 0x35, 0x23, 0x6B, 0xEA, 0x8E, 0x80, 0xEB, 0x43, 0xAF, 0xBF, 0x86, 0xE8, 0xD6,\n    0xBB, 0x1F, 0x75, 0x7A, 0x43, 0xAC, 0xC7, 0x84, 0x85, 0xAD, 0xE1, 0x72, 0x4A, 0xF8, 0x97, 0xBE,\n    0xC6, 0x11, 0xCD, 0xAD, 0x99, 0xAE, 0xD4, 0x78, 0x4F, 0xFA, 0x76, 0x5F, 0x95, 0xEF, 0x0E, 0x0C,\n    0x86, 0x2F, 0x45, 0x6F, 0xB0, 0xED, 0x35, 0x87, 0x55, 0x79, 0x0B, 0x39, 0x0E, 0x13, 0x4A, 0x67,\n    0x9A, 0xC5, 0x27, 0xC7, 0x5C, 0x99, 0x84, 0x75, 0xE6, 0xD1, 0x66, 0x2F, 0x2F, 0x47, 0xA9, 0xE6,\n    0xDD, 0x9C, 0xCF, 0x10, 0x64, 0x33, 0xDE, 0xBB, 0x35, 0x54, 0x9F, 0xBB, 0x40, 0x1B, 0xF1, 0x53,\n    0x48, 0xA1, 0x68, 0x42, 0x39, 0x92, 0x52, 0xAE, 0xAC, 0xA5, 0x6E, 0xA4, 0x09, 0x96, 0x1A, 0xE8,\n    0x88, 0x59, 0x38, 0xF3, 0xCA, 0x72, 0x52, 0xCC, 0xB0, 0x4F, 0x2B, 0x86, 0xA9, 0xA9, 0x7D, 0xBF,\n    0x6F, 0x6A, 0x07, 0x89, 0x52, 0x99, 0xF8, 0x06, 0xE5, 0x28, 0xC5, 0x74, 0xEC, 0x81, 0xE1, 0xE8,\n    0x25, 0x66, 0xD7, 0x7F, 0xEA, 0x51, 0x56, 0xF7, 0xA8, 0x06, 0x44, 0xE9, 0xE0, 0x2F, 0x33, 0x19,\n    0x4A, 0xD1, 0xCD, 0x92, 0x19, 0x2A, 0x1F, 0x03, 0x07, 0xD1, 0x46, 0x05, 0x0D, 0x64, 0x23, 0xEC,\n    0x4D, 0x4E, 0x03, 0x2A, 0xED, 0xA5, 0xF4, 0x9F, 0xC3, 0x93, 0xAB, 0xA3, 0xE2, 0x8C, 0x3F, 0xC4,\n    0xA5, 0xE1, 0x47, 0x0D, 0x1A, 0x37, 0x52, 0x9D, 0x45, 0x96, 0xE2, 0x4D, 0x7F, 0xFD, 0x06, 0x28,\n    0xE3, 0xEE, 0xE4, 0x57, 0x5D, 0x7B, 0x72, 0xA7, 0x8A, 0xCE, 0x77, 0x26, 0xCF, 0x98, 0x06, 0x31,\n    0xB7, 0x28, 0x73, 0x1D, 0xA3, 0x4F, 0xB5, 0x01, 0xE5, 0x4C, 0x14, 0xAD, 0xDB, 0x3F, 0xE6, 0xD1,\n    0xDA, 0xF7, 0x58, 0xBC, 0x54, 0x76, 0x9E, 0x99, 0xD4, 0xFC, 0x7F, 0xE9, 0x6D, 0xF9, 0xAE, 0xC2,\n    0x7B, 0x45, 0x32, 0x7D, 0x29, 0x22, 0xB2, 0xF3, 0x7D, 0x08, 0x37, 0x49, 0x0C, 0xB7, 0xC4, 0x0E,\n    0xE7, 0x6C, 0x1E, 0xA7, 0xBE, 0x75, 0x4E, 0x4C, 0x1A, 0xBD, 0x2F, 0xC6, 0x70, 0xD7, 0x38, 0xAE,\n    0x61, 0x3C, 0x01, 0xEB, 0x07, 0x25, 0xEA, 0x45, 0x21, 0x06, 0x99, 0xBF, 0xD0, 0xAC, 0xD1, 0xDB,\n    0x69, 0xF4, 0x64, 0x9F, 0xEB, 0xB3, 0xCF, 0xD8, 0xB1, 0x90, 0xAA, 0xAF, 0x80, 0x50, 0xA0, 0x92,\n    0xBA, 0x7E, 0xA2, 0x7B, 0x2D, 0x13, 0x7E, 0x9F, 0x4F, 0xFD, 0x0F, 0x40, 0xEC, 0x2D, 0x0E, 0x85,\n    0xB7, 0xDA, 0x01, 0x64, 0x95, 0x95, 0x66, 0x91, 0x15, 0x3F, 0x09, 0x77, 0xAC, 0xBF, 0x0D, 0x6F,\n    0x7C, 0xC1, 0xB7, 0x5F, 0xBD, 0xDA, 0xE9, 0xF7, 0xCC, 0x83, 0x17, 0x3B, 0x14, 0x20, 0x81, 0xE5,\n    0x9A, 0xA5, 0x4A, 0x40, 0xD7, 0x4A, 0x7A, 0x94, 0xE1, 0x6F, 0x3B, 0x27, 0xEA, 0x13, 0x7E, 0x5E,\n    0xE7, 0x4D, 0x96, 0xF1, 0x47, 0x8F, 0xD4, 0x79, 0x3D, 0x98, 0xD7, 0xCD, 0x3C, 0x35, 0x3A, 0x3F,\n    0x54, 0x3A, 0x48, 0x73, 0x66, 0xC3, 0xFD, 0x11, 0x87, 0x76, 0x0C, 0xF0, 0xC5, 0x08, 0x97, 0xA6,\n    0xC5, 0x88, 0x3F, 0x4F, 0xC7, 0x32, 0x72, 0x5C, 0xD4, 0x17, 0x8D, 0x45, 0x91, 0x62, 0xB2, 0xC3,\n    0x4A, 0xA4, 0x58, 0x88, 0x5C, 0x9C, 0xB5, 0x72, 0xFE, 0xE9, 0xB7, 0x73, 0x55, 0x7B, 0xD5, 0x91,\n    0x66, 0x02, 0x4C, 0xF7, 0x11, 0x77, 0x9D, 0x68, 0x4E, 0x1A, 0xC5, 0x6B, 0xB9, 0x0A, 0xC3, 0x7F,\n    0xB0, 0x48, 0x87, 0xC4, 0xC9, 0x29, 0x73, 0x1A, 0x25, 0xDA, 0x46, 0x3E, 0x10, 0x02, 0x9A, 0xCE,\n    0x23, 0xD9, 0x77, 0xC6, 0x0D, 0xA3, 0xD5, 0xF8, 0x6B, 0xE2, 0x10, 0x90, 0x01, 0xE7, 0xF7, 0xAF,\n    0x35, 0x59, 0x8D, 0x1D, 0xA7, 0x3B, 0xD2, 0x5A, 0x33, 0x33, 0xAF, 0xB0, 0xAC, 0xD1, 0x2A, 0x43,\n    0x79, 0x13, 0x5C, 0x2A, 0x55, 0x37, 0x52, 0xA1, 0x69, 0x17, 0x7F, 0xE9, 0x7C, 0xD7, 0x6D, 0x43,\n    0x57, 0xC3, 0x1B, 0x2E, 0x5D, 0xA0, 0x5B, 0x3D, 0x75, 0x4E, 0xF4, 0xA1, 0x24, 0xDE, 0x50, 0x18,\n    0x90, 0xB9, 0x89, 0xF1, 0x47, 0x4C, 0x61, 0xDB, 0xD8, 0xF0, 0x66, 0xD6, 0x1F, 0xB3, 0x9F, 0x91,\n    0x4D, 0x91, 0xFD, 0x6E, 0xB9, 0x4B, 0x47, 0xC9, 0xF6, 0x48, 0x07, 0xFB, 0xC6, 0x64, 0x48, 0x33,\n    0x5F, 0x92, 0x19, 0x22, 0xB7, 0x69, 0xE2, 0x9D, 0x69, 0x02, 0xE7, 0x47, 0x97, 0xAC, 0x52, 0xAA,\n    0xB6, 0x50, 0xC7, 0x9B, 0x16, 0x29, 0x15, 0x1F, 0x12, 0x46, 0xE0, 0xC0, 0x3F, 0xA9, 0xB0, 0x30,\n    0x47, 0xE7, 0x6F, 0x73, 0x62, 0xB0, 0xD6, 0x50, 0x20, 0x40, 0x47, 0x4C, 0x5D, 0x5C, 0xA1, 0xBA,\n    0x05, 0x8E, 0x06, 0x22, 0xEA, 0xDF, 0x4C, 0x52, 0xFE, 0x21, 0x72, 0x6B, 0xD4, 0xB1, 0xEF, 0x38,\n    0x74, 0xF5, 0xB3, 0x4D, 0x38, 0x91, 0x5F, 0x21, 0x74, 0x4B, 0x18, 0x27, 0xBD, 0x70, 0x4A, 0x6A,\n    0xBD, 0x62, 0x2A, 0xEE, 0xCE, 0xAE, 0x6B, 0x23, 0xA2, 0x97, 0x7E, 0x06, 0x24, 0xAE, 0x09, 0xD6,\n    0xC3, 0xEE, 0x10, 0x6D, 0x8D, 0x04, 0xF2, 0xAE, 0x09, 0x10, 0xB0, 0x54, 0xD0, 0x1C, 0x84, 0x55,\n    0xCF, 0xED, 0xFD, 0xB8, 0xDE, 0xF5, 0xA4, 0x5B, 0xFA, 0x7D, 0x7C, 0xAC, 0xC0, 0x85, 0x48, 0xB2,\n    0x05, 0x45, 0x05, 0x36, 0xDD, 0x9A, 0xD9, 0x43, 0x75, 0x94, 0xAF, 0xD5, 0xDF, 0x70, 0xE4, 0x7D,\n    0x37, 0x49, 0x0E, 0xE6, 0xD1, 0xC2, 0x1A, 0xBD, 0xCD, 0xC6, 0xD8, 0xC5, 0xAA, 0xD8, 0x90, 0x6E,\n    0xD7, 0x5D, 0xA4, 0x6B, 0x19, 0xB1, 0x7A, 0x18, 0xF1, 0x29, 0x4D, 0x20, 0xF7, 0x7A, 0x7F, 0x7C,\n    0xE6, 0x8A, 0x54, 0x05, 0xB7, 0xA0, 0xD9, 0x32, 0xDB, 0x53, 0xF6, 0x48, 0x65, 0x89, 0x86, 0x5B,\n    0x85, 0x7F, 0x11, 0x61, 0x0A, 0x99, 0xBE, 0x01, 0x56, 0xA3, 0xA7, 0x3A, 0xE6, 0xAB, 0xDF, 0x6B,\n    0xB4, 0x11, 0x24, 0xFC, 0x36, 0x30, 0x8C, 0x85, 0x06, 0xFB, 0x0C, 0xB9, 0xB2, 0x50, 0x51, 0xF8,\n    0xDD, 0x3B, 0xB3, 0xC7, 0x4E, 0x7A, 0x4A, 0x8E, 0x42, 0x01, 0xCB, 0xA9, 0xE5, 0x21, 0xD5, 0xDF,\n    0x8E, 0x59, 0x53, 0x82, 0xA8, 0xA0, 0x25, 0x9F, 0xCE, 0x99, 0x17, 0x9F, 0xC6, 0xD7, 0xDB, 0x67,\n    0xA7, 0x72, 0xC8, 0x22, 0x43, 0x32, 0x8E, 0x75, 0xE7, 0x29, 0xAC, 0x7A, 0x0A, 0x95, 0xC3, 0x32,\n    0xA9, 0x56, 0xE6, 0xD7, 0xFE, 0x29, 0xC1, 0x5C, 0x02, 0xB6, 0xD7, 0x16, 0x06, 0xC7, 0x86, 0x33,\n    0x68, 0x41, 0x64, 0xAE, 0x1D, 0xD6, 0xEC, 0x9F, 0x4D, 0x2A, 0x79, 0x01, 0xDB, 0x48, 0x52, 0xB7,\n    0x62, 0x36, 0x2B, 0x47, 0x2C, 0x0C, 0x9F, 0x10, 0xB0, 0x16, 0x34, 0x13, 0xAA, 0xF8, 0x18, 0xC5,\n    0xAA, 0xAF, 0x57, 0x03, 0xC9, 0x48, 0xE4, 0x75, 0x94, 0xCB, 0xDA, 0xC2, 0xDF, 0xDE, 0x92, 0x23,\n    0x1E, 0x07, 0xF8, 0x04, 0xFC, 0x90, 0x34, 0xCE, 0xC3, 0x9C, 0x87, 0xBF, 0xA6, 0x45, 0x1B, 0xFC,\n    0x73, 0x2B, 0xF8, 0x4E, 0x96, 0x82, 0xDA, 0xE8, 0x98, 0x87, 0x0D, 0x37, 0xCD, 0xD1, 0x3E, 0x31,\n    0x15, 0x72, 0x87, 0x3B, 0x67, 0xAF, 0x5D, 0x0B, 0x88, 0xFF, 0x44, 0xC1, 0xAB, 0xD1, 0x1E, 0x5F,\n    0xE6, 0x8B, 0xAD, 0x0F, 0x95, 0xFC, 0x9F, 0x8F, 0x91, 0xED, 0x36, 0xE2, 0xD6, 0x2E, 0xC3, 0x2D,\n    0x9E, 0x80, 0x6A, 0x78, 0x4A, 0xCA, 0x04, 0xCD, 0x64, 0x73, 0x7A, 0x81, 0x2D, 0x45, 0x53, 0xC8,\n    0xED, 0x68, 0x74, 0x36, 0x85, 0x83, 0xD9, 0x6F, 0x8C, 0xAF, 0xEC, 0xE5, 0xC1, 0xF1, 0x65, 0x0C,\n    0x45, 0xB4, 0xE7, 0xD1, 0xF8, 0x3C, 0xAA, 0xF3, 0x1E, 0xC7, 0x99, 0x78, 0x13, 0xC9, 0x55, 0x2B,\n    0xA8, 0x5C, 0x24, 0xE2, 0xDF, 0x43, 0x46, 0x09, 0xAD, 0xAB, 0x1D, 0xED, 0xAA, 0xE0, 0xE6, 0x09,\n    0xE2, 0x52, 0xE0, 0x5E, 0x78, 0xF8, 0x26, 0x88, 0x66, 0xB9, 0x98, 0x68, 0x52, 0x7A, 0xB4, 0xDF,\n    0x34, 0xAA, 0xF6, 0x1A, 0x4C, 0x3D, 0x36, 0x8D, 0xB7, 0x05, 0x5B, 0x0B, 0x00, 0xF8, 0x3B, 0xDD,\n    0x95, 0xB7, 0x47, 0x3A, 0xB0, 0x5A, 0x0A, 0xA8, 0x85, 0x17, 0xCB, 0x4E, 0x92, 0x47, 0x72, 0x92,\n    0x73, 0x6A, 0xAB, 0xB5, 0x7D, 0x99, 0xBC, 0x8B, 0xAC, 0x1B, 0xE8, 0x1A, 0xE6, 0x32, 0x11, 0x79,\n    0x2C, 0x6B, 0x88, 0x56, 0x70, 0x41, 0xED, 0xC3, 0x7E, 0x0A, 0xA8, 0xDF, 0xCA, 0xA8, 0xD4, 0x3E,\n    0x1A, 0xE0, 0x9E, 0x6D, 0x7C, 0xBD, 0x32, 0xB1, 0x7F, 0x7D, 0x32, 0x18, 0x4D, 0x18, 0x5E, 0xF3,\n    0x19, 0x30, 0xCA, 0x8C, 0x66, 0xB5, 0x77, 0x57, 0x5B, 0x98, 0x8F, 0x6D, 0x6B, 0x2D, 0x8D, 0xC4,\n    0x0B, 0x76, 0xE0, 0x37, 0x42, 0x02, 0xC4, 0x61, 0xFE, 0x43, 0x5F, 0x41, 0xA7, 0x40, 0x64, 0x45,\n    0xD6, 0x09, 0x99, 0x3F, 0x95, 0x73, 0x0D, 0x9F, 0xC4, 0xBE, 0x22, 0x2A, 0xE5, 0x4C, 0xAD, 0x32,\n    0xC2, 0xF3, 0x49, 0xC4, 0xCF, 0x9C, 0xD1, 0x63, 0x3E, 0xBA, 0xD3, 0x9B, 0x24, 0x2F, 0x52, 0xF3,\n    0xBA, 0x21, 0x2E, 0xEC, 0xDF, 0x8D, 0xAD, 0x3F, 0xF3, 0xE1, 0x23, 0x8C, 0x0D, 0x76, 0xDD, 0xCB,\n    0x36, 0xB9, 0x7A, 0x13, 0x78, 0xB2, 0x6D, 0xDB, 0x16, 0xAD, 0x2A, 0x94, 0xAC, 0xF9, 0x86, 0x8B,\n    0x2D, 0x75, 0x33, 0x86, 0x43, 0x18, 0xCF, 0x65, 0x4F, 0x08, 0x22, 0x88, 0x6E, 0x38, 0xBF, 0xF7,\n    0x12, 0x3F, 0x8A, 0xC3, 0x49, 0xA0, 0xC6, 0x03, 0xAB, 0x1C, 0xD5, 0x3D, 0xA2, 0x43, 0xFF, 0x93,\n    0xD4, 0x80, 0xDA, 0xDC, 0x77, 0x6D, 0xF8, 0xE1, 0xD3, 0x88, 0xA4, 0xCF, 0x82, 0xE0, 0x08, 0xB2,\n    0x6E, 0x98, 0xBA, 0x6C, 0x0A, 0x84, 0xA0, 0x94, 0x51, 0xFE, 0x17, 0x96, 0xF1, 0xBC, 0xD0, 0xFB,\n    0x6B, 0x50, 0x13, 0xA6, 0x8E, 0x42, 0xFA, 0x01, 0x8C, 0xF4, 0x04, 0x02, 0xB1, 0xA8, 0x53, 0x5D,\n    0x9B, 0x15, 0x48, 0xC3, 0x81, 0xCB, 0xAF, 0x4B, 0x4E, 0x61, 0xB6, 0x86, 0x5C, 0xB1, 0x83, 0x44,\n    0x5C, 0xB9, 0x3F, 0x31, 0x84, 0xEF, 0x75, 0x20, 0x66, 0x4C, 0x77, 0x66, 0x73, 0x04, 0x45, 0xB8,\n    0xE7, 0xBD, 0x14, 0xF9, 0x93, 0xC7, 0x17, 0x60, 0xE5, 0x63, 0xAE, 0x6A, 0xD6, 0x99, 0xCD, 0x10,\n    0x4F, 0x6B, 0xC1, 0x44, 0x63, 0x37, 0x79, 0x9C, 0x9C, 0xAA, 0xBC, 0x64, 0x19, 0x61, 0xB5, 0xC1,\n    0x52, 0x09, 0x6E, 0x6B, 0x6B, 0x90, 0x8B, 0xA6, 0x23, 0xDC, 0xE4, 0xE1, 0xB4, 0x82, 0x47, 0x11,\n    0x86, 0x9B, 0x9F, 0xE0, 0x24, 0xC0, 0x19, 0xAE, 0x7D, 0x9A, 0x8C, 0x49, 0x6C, 0x42, 0x6D, 0x4E,\n    0x1F, 0xC7, 0x66, 0x20, 0x19, 0xCA, 0xA0, 0xF0, 0x44, 0x1A, 0x61, 0x1E, 0x67, 0x58, 0x4B, 0xA4,\n    0x15, 0x8F, 0x26, 0x2C, 0xAC, 0xE8, 0xBA, 0x1D, 0x33, 0x77, 0x22, 0x83, 0xBB, 0xE1, 0x18, 0xBD,\n    0x45, 0x1A, 0xB4, 0x9F, 0x4F, 0x1F, 0x80, 0xE8, 0x99, 0x14, 0xB2, 0x1C, 0x1E, 0x4E, 0xBB, 0x04,\n    0xD6, 0x57, 0x50, 0x6F, 0x79, 0x60, 0xAA, 0xC1, 0xFD, 0x5D, 0xC7, 0x72, 0xA7, 0xBC, 0xD0, 0x29,\n    0x29, 0x32, 0xD9, 0xDF, 0x9D, 0xF4, 0xC6, 0xF6, 0x54, 0x67, 0xF4, 0x16, 0x3C, 0xB7, 0xA9, 0x06,\n    0x9D, 0xDC, 0xD9, 0x69, 0x4C, 0xD7, 0xC2, 0x8B, 0xF7, 0x7E, 0xAD, 0x7E, 0xD8, 0xC7, 0x23, 0x90,\n    0x1F, 0xD6, 0xC4, 0xD3, 0xBB, 0xD4, 0x57, 0x35, 0xF6, 0xD3, 0x52, 0x32, 0x18, 0x20, 0xEC, 0x33,\n    0x97, 0x01, 0xB5, 0x91, 0x7C, 0xCF, 0xB4, 0x6B, 0x55, 0x0C, 0x5C, 0x73, 0xE9, 0x8D, 0x9E, 0xDD,\n    0xCF, 0xF8, 0xDF, 0xB8, 0x21, 0x13, 0x62, 0x2B, 0x66, 0x6E, 0x76, 0x03, 0x04, 0x75, 0xAA, 0x56,\n    0xDF, 0x91, 0x5F, 0x26, 0x9B, 0xF9, 0x72, 0x25, 0x81, 0x63, 0x5B, 0xFE, 0xE4, 0x2A, 0x8E, 0x14,\n    0x03, 0xFD, 0x8D, 0x23, 0x35, 0x82, 0x64, 0x70, 0x30, 0x91, 0x3F, 0xBB, 0x19, 0x2C, 0x04, 0x9E,\n    0x44, 0xDC, 0x79, 0x9A, 0x7B, 0x69, 0x52, 0x08, 0xC3, 0x9E, 0x2A, 0xB9, 0x02, 0xD4, 0x19, 0xF2,\n    0x3A, 0x4A, 0x4C, 0x47, 0x08, 0x38, 0x4B, 0x2E, 0x75, 0xF8, 0x86, 0x7C, 0x09, 0x72, 0xEC, 0xB2,\n    0xAC, 0x9C, 0xEC, 0x42, 0x5C, 0x61, 0x7F, 0xD8, 0x24, 0x05, 0x88, 0x55, 0x3D, 0xB7, 0x79, 0x90,\n    0x73, 0x7D, 0x0A, 0x10, 0xF5, 0xB3, 0x5C, 0xC8, 0x8D, 0x5E, 0x59, 0x51, 0xD2, 0xDB, 0x4E, 0x5D,\n    0x4B, 0x39, 0x16, 0x14, 0xF2, 0xA2, 0x75, 0x28, 0x66, 0x45, 0xBF, 0x73, 0x60, 0xD3, 0xFD, 0x53,\n    0xDA, 0x8D, 0x5C, 0x94, 0x2E, 0x91, 0x14, 0xE2, 0xAA, 0xEF, 0x93, 0x82, 0x68, 0x0A, 0x69, 0x1F,\n    0xE2, 0x10, 0x26, 0xEB, 0x69, 0xD6, 0x35, 0x9B, 0x62, 0x05, 0x97, 0x7D, 0x04, 0x6D, 0x6C, 0x22,\n    0x3E, 0x7C, 0xAB, 0x13, 0xC0, 0xEF, 0x4C, 0xE1, 0x96, 0x5B, 0xB7, 0xA3, 0x80, 0xC2, 0x89, 0x1A,\n    0x2F, 0x47, 0x0B, 0xD9, 0x76, 0x6C, 0xD3, 0x03, 0x08, 0xA3, 0x8E, 0x9B, 0xAE, 0xA1, 0x55, 0x73,\n    0x7B, 0x9F, 0xAE, 0x40, 0xB6, 0x0C, 0x0A, 0x8A, 0x83, 0x7A, 0x88, 0x6B, 0x3E, 0xD7, 0x98, 0x7F,\n    0x43, 0x40, 0x01, 0xE4, 0x3A, 0xFF, 0x26, 0xEC, 0x91, 0x68, 0x71, 0xD8, 0x84, 0x18, 0xC1, 0xD5,\n    0xAB, 0xA2, 0xBB, 0xCC, 0xEA, 0x43, 0x79, 0x73, 0x97, 0x4C, 0x9B, 0x03, 0xD0, 0x10, 0x7C, 0x09,\n    0x84, 0x32, 0x04, 0x0A, 0x35, 0xA6, 0x29, 0xAB, 0x6E, 0x26, 0x9A, 0xCF, 0x49, 0x8F, 0x15, 0xC2,\n    0xAC, 0x56, 0xD6, 0x82, 0xB9, 0x3C, 0xD2, 0xDD, 0x68, 0xB7, 0x43, 0xBC, 0xBC, 0xFD, 0xA4, 0xC5,\n    0xCE, 0x5C, 0xC0, 0xD3, 0x93, 0xD6, 0x40, 0xAF, 0xDA, 0x23, 0x55, 0x83, 0x3A, 0xE6, 0x6C, 0x64,\n    0xA0, 0x37, 0xC0, 0x47, 0xBA, 0xAA, 0x62, 0x79, 0x56, 0x85, 0x55, 0xC1, 0xEA, 0x80, 0xD5, 0x3C,\n    0xBB, 0x9F, 0x89, 0xEA, 0x45, 0xFC, 0x59, 0x6C, 0x26, 0xF0, 0x07, 0x72, 0x31, 0xCC, 0x5F, 0x8F,\n    0xA5, 0x61, 0x20, 0x16, 0x55, 0x4D, 0x87, 0x72, 0x13, 0xE6, 0xA9, 0xB3, 0xAF, 0xBD, 0x42, 0x08,\n    0x39, 0xD5, 0xCF, 0x81, 0xCA, 0x5E, 0xD0, 0xAB, 0x77, 0xB0, 0x05, 0x7E, 0x73, 0x87, 0xFE, 0xF4,\n    0xA7, 0x7F, 0x00, 0xBE, 0xF9, 0x67, 0x83, 0x64, 0x61, 0x19, 0x4F, 0x23, 0x21, 0xD9, 0x37, 0xB7,\n    0x54, 0xD3, 0x2F, 0x0C, 0x39, 0xD2, 0xA4, 0x78, 0xFD, 0x3C, 0x9F, 0x5C, 0xC5, 0x16, 0x55, 0x9B,\n    0xBB, 0x96, 0x72, 0x13, 0x1D, 0xCC, 0xAF, 0xB4, 0xC1, 0xEB, 0x7D, 0xF9, 0xA1, 0x37, 0x93, 0x13,\n    0xC3, 0xDB, 0x58, 0xF8, 0x7C, 0xFB, 0x2E, 0x91, 0x7B, 0x6D, 0x21, 0xE2, 0xCE, 0xB1, 0xAF, 0x8A,\n    0x55, 0x25, 0x5A, 0x08, 0x35, 0xAD, 0xF6, 0x1E, 0x54, 0x56, 0xB9, 0x52, 0xA8, 0x9F, 0x9F, 0x06,\n    0x9B, 0x30, 0x7B, 0x5F, 0x25, 0x13, 0x7C, 0xD4, 0xA7, 0x56, 0xE3, 0x48, 0x55, 0x40, 0xB8, 0x3E,\n    0x11, 0x7B, 0x81, 0x89, 0x2E, 0x40, 0x76, 0x1D, 0x4C, 0x30, 0xCF, 0xBE, 0xA6, 0x66, 0x25, 0x69,\n    0x9B, 0xE7, 0x85, 0x36, 0x71, 0x45, 0xD4, 0x54, 0x24, 0x3B, 0x2D, 0x16, 0x9B, 0xD6, 0xE6, 0x91,\n    0x13, 0x53, 0x6E, 0x56, 0x21, 0xB6, 0x3C, 0x12, 0x23, 0x20, 0xC9, 0xB7, 0xDD, 0xF1, 0x04, 0x1C,\n    0x49, 0x58, 0x44, 0x97, 0x4A, 0x21, 0x36, 0x0C, 0x7D, 0xDE, 0x3F, 0x2F, 0xE6, 0x8E, 0x05, 0x42,\n    0x28, 0x2A, 0xA5, 0x0F, 0xF1, 0x31, 0x7B, 0x9A, 0x1B, 0x36, 0x40, 0x48, 0xC3, 0xC4, 0x59, 0x8F,\n    0xFF, 0x82, 0x2F, 0xE2, 0x75, 0xEF, 0x54, 0x39, 0x31, 0xC8, 0x5F, 0xD2, 0xDA, 0x74, 0x50, 0x47,\n    0x45, 0x16, 0xC9, 0xF8, 0x2B, 0xAE, 0x07, 0x6B, 0x18, 0xF6, 0x22, 0x1F, 0xF4, 0x39, 0x6D, 0x13,\n    0x83, 0x0C, 0xCB, 0xF3, 0x12, 0x1B, 0xB4, 0x27, 0xB6, 0xB1, 0x67, 0x79, 0x29, 0xD7, 0xAF, 0x00,\n    0xF1, 0xE4, 0x14, 0xB4, 0xA1, 0x95, 0x54, 0x47, 0x19, 0x7B, 0xB0, 0xF6, 0x81, 0x42, 0x94, 0xE4,\n    0xD3, 0xA3, 0x9D, 0x74, 0xE5, 0x93, 0xEE, 0x02, 0x5A, 0x44, 0x9F, 0x25, 0xCB, 0xB2, 0x8E, 0xEE,\n    0xD8, 0xE7, 0x02, 0x5D, 0x83, 0x94, 0x68, 0xDD, 0xA4, 0x3E, 0x6A, 0x86, 0xE6, 0x2E, 0xFC, 0x1C,\n    0xC5, 0xAE, 0x91, 0x7D, 0x34, 0x12, 0xD5, 0x10, 0xD8, 0x4E, 0x34, 0x18, 0x6B, 0x72, 0x0D, 0x8F,\n    0x28, 0x17, 0xE2, 0x81, 0xD6, 0xE4, 0x70, 0xBB, 0x20, 0x0C, 0xE9, 0xA9, 0x65, 0xEC, 0xDC, 0x80,\n    0x41, 0x13, 0xB4, 0x53, 0x67, 0x1F, 0xF4, 0xB0, 0xA6, 0x4D, 0xB1, 0x43, 0x29, 0x00, 0xAD, 0x51,\n    0xE8, 0x4C, 0x6A, 0x62, 0x8B, 0xB9, 0xEE, 0x05, 0x53, 0xE5, 0xBE, 0xCC, 0xDD, 0x08, 0xA9, 0x89,\n    0x84, 0x04, 0xF3, 0xC4, 0xA9, 0x4E, 0x40, 0x18, 0xE4, 0xF8, 0xEC, 0xB0, 0xF4, 0x7B, 0x69, 0x6D,\n    0xD1, 0xB3, 0x5F, 0x53, 0x85, 0x14, 0xF5, 0xC9, 0xBE, 0x9D, 0x8E, 0x7B, 0x9A, 0x8C, 0x77, 0xA2,\n    0xD6, 0x97, 0xA3, 0x35, 0x48, 0x47, 0x93, 0x5C, 0x2D, 0xB7, 0xBA, 0x80, 0xC0, 0xB5, 0xD5, 0x24,\n    0x40, 0xA8, 0xB6, 0xA6, 0x4E, 0x4C, 0x4C, 0xE8, 0x60, 0xE4, 0xF7, 0xDC, 0x24, 0xD9, 0x0F, 0x3C,\n    0xC7, 0x86, 0xC9, 0xEB, 0xEA, 0xD9, 0xDC, 0x12, 0x50, 0x30, 0xB2, 0x7D, 0x28, 0x2E, 0x9D, 0x7C,\n    0xC3, 0x72, 0x6D, 0x22, 0x40, 0x81, 0x1A, 0x5B, 0xED, 0x16, 0xDD, 0x6D, 0x15, 0x83, 0xD1, 0xC6,\n    0x35, 0xBD, 0x11, 0x1F, 0x0F, 0x60, 0x89, 0x22, 0xCD, 0x63, 0x39, 0x42, 0x2B, 0x05, 0xE5, 0x40,\n    0x89, 0xC3, 0x64, 0xBC, 0xB2, 0x7B, 0x1E, 0xBF, 0x37, 0x68, 0x0A, 0x82, 0xD8, 0x71, 0x10, 0xE7,\n    0xD3, 0xEB, 0xF9, 0x24, 0xBD, 0x5F, 0x62, 0x7F, 0xAA, 0xF0, 0x5B, 0xE5, 0x75, 0xCB, 0x84, 0xA4,\n    0x66, 0x78, 0x80, 0xE4, 0xD5, 0x04, 0x02, 0xE4, 0xE6, 0x79, 0x67, 0xC2, 0x79, 0x92, 0x3C, 0x32,\n    0x8C, 0xB6, 0x1D, 0x21, 0xDB, 0xB8, 0x91, 0x88, 0x76, 0xBD, 0x20, 0x30, 0x8A, 0x87, 0x49, 0x7F,\n    0x54, 0x32, 0x95, 0x3D, 0x1F, 0x44, 0xDE, 0xA0, 0xE6, 0x4D, 0x00, 0xE9, 0x1F, 0x12, 0x49, 0x2A,\n    0x73, 0x58, 0x55, 0xB2, 0x22, 0x36, 0x46, 0x37, 0x6E, 0x89, 0xCF, 0x8E, 0x17, 0x91, 0x8C, 0xD3,\n    0xAE, 0x40, 0x75, 0x66, 0xAA, 0xAD, 0x37, 0x77, 0x00, 0x9B, 0x56, 0x98, 0x52, 0x1F, 0x41, 0x01,\n    0x60, 0x6A, 0x3D, 0xB1, 0x07, 0x5F, 0x57, 0x72, 0xE6, 0x69, 0x0B, 0x93, 0xE7, 0x1B, 0xB1, 0x54,\n    0x26, 0xB0, 0x52, 0xA1, 0xB1, 0x0A, 0x1A, 0x59, 0xBD, 0xA5, 0x70, 0x98, 0x21, 0xCD, 0x09, 0x35,\n    0x1A, 0x29, 0x03, 0x10, 0xAC, 0x40, 0x90, 0x47, 0xFB, 0xA3, 0x07, 0xB4, 0x43, 0xCC, 0x37, 0x14,\n    0xC9, 0xA8, 0xD4, 0x5A, 0xD0, 0x70, 0xF9, 0x85, 0xAC, 0xF3, 0xFA, 0xA5, 0x5A, 0x9A, 0xF1, 0xC3,\n    0x54, 0xDC, 0xE1, 0x00, 0x2D, 0xD6, 0xCF, 0x7A, 0x02, 0x87, 0x8B, 0x49, 0x6C, 0x19, 0xF4, 0x68,\n    0xDE, 0x5F, 0x11, 0x91, 0xF1, 0x7A, 0xF2, 0x34, 0xA5, 0xDF, 0x42, 0x01, 0x2E, 0x2F, 0x12, 0x91,\n    0xA9, 0x5E, 0x23, 0x6E, 0xFC, 0x1C, 0x96, 0xFA, 0xE8, 0xBB, 0x4A, 0x42, 0x7F, 0xB7, 0xEE, 0x12,\n    0x3C, 0x25, 0xDB, 0x7B, 0x95, 0xED, 0xF6, 0xAB, 0xBC, 0x59, 0xE4, 0xF3, 0x15, 0x71, 0xAB, 0xAB,\n    0x1B, 0x27, 0x6B, 0x48, 0x44, 0x52, 0xC3, 0xA3, 0xB0, 0xC1, 0x49, 0xCE, 0x74, 0xD9, 0x9D, 0xC8,\n    0xAC, 0x71, 0xB5, 0xB9, 0x1B, 0xA6, 0xD3, 0xF9, 0x84, 0x30, 0xAE, 0x9E, 0x69, 0x31, 0xB8, 0xB4,\n    0x64, 0xE8, 0xD9, 0x47, 0xBD, 0x63, 0xB5, 0x25, 0x30, 0x1A, 0xD7, 0xB2, 0xC0, 0xBD, 0x75, 0x30,\n    0x55, 0x02, 0x5B, 0xC6, 0xE6, 0x63, 0x69, 0x65, 0xAF, 0xE7, 0x7B, 0xAB, 0x5D, 0xA6, 0xA5, 0xC4,\n    0xAF, 0xDE, 0xAC, 0x67, 0x1E, 0x7F, 0x73, 0x55, 0x2C, 0x33, 0x25, 0x83, 0x24, 0x3F, 0xB0, 0x48,\n    0xFC, 0x08, 0xB9, 0x60, 0xBB, 0xFB, 0x3D, 0xFD, 0xA3, 0xF6, 0xF2, 0x1B, 0x89, 0x82, 0x87, 0xD1,\n    0x10, 0xE5, 0xBD, 0xEF, 0x16, 0xA7, 0x3F, 0x15, 0x32, 0x11, 0x50, 0xB9, 0x7D, 0x77, 0x15, 0x0F,\n    0xBA, 0xFE, 0x76, 0x0A, 0x4F, 0xF2, 0xA0, 0xFB, 0x2D, 0xF1, 0xCE, 0x5E, 0xE7, 0x50, 0x6A, 0xA0,\n    0xB2, 0xB4, 0xEE, 0x2B, 0xD5, 0x3B, 0x03, 0x07, 0xB0, 0x40, 0x4A, 0x26, 0xF4, 0x3E, 0x1F, 0xC4,\n    0x58, 0x80, 0x8A, 0x3B, 0x00, 0x52, 0x2B, 0x53, 0xBF, 0xD4, 0x8F, 0xEE, 0x6D, 0xA4, 0x0D, 0xF7,\n    0x82, 0xF8, 0x53, 0xDA, 0xF6, 0x53, 0xAF, 0xF8, 0xD2, 0xD8, 0xFB, 0x1F, 0x2D, 0x98, 0x87, 0xDA,\n    0x19, 0xAC, 0x48, 0x6B, 0xEA, 0xDE, 0x08, 0xA6, 0x13, 0x37, 0x1B, 0x2C, 0x15, 0x60, 0xB2, 0xDB,\n    0x28, 0x0E, 0x2E, 0xA3, 0x4A, 0xB1, 0xF2, 0x5C, 0x48, 0x69, 0x46, 0xFA, 0x08, 0x9F, 0xE9, 0x65,\n    0x2F, 0x3A, 0x29, 0xB0, 0x88, 0xB5, 0x13, 0x44, 0x41, 0x92, 0x30, 0x74, 0x9C, 0x9C, 0xD8, 0xC8,\n    0xB1, 0x59, 0x42, 0x67, 0xAC, 0xC8, 0x0D, 0xFF, 0x8E, 0x52, 0x4C, 0xED, 0x86, 0xFF, 0x4E, 0x45,\n    0xBE, 0xC4, 0xAF, 0x32, 0xE4, 0xBC, 0x41, 0xC5, 0xDC, 0x3F, 0x71, 0x8C, 0x2C, 0xAD, 0x78, 0x7E,\n    0x79, 0x47, 0xB2, 0x02, 0xA6, 0x11, 0xDE, 0x0F, 0x5D, 0xAD, 0xFE, 0x8D, 0x6B, 0x09, 0xEA, 0x28,\n    0x4B, 0xB1, 0x9F, 0xD3, 0x09, 0x4A, 0x77, 0x52, 0x58, 0xA2, 0x31, 0xC1, 0x48, 0xF1, 0x35, 0x48,\n    0x46, 0x93, 0xDB, 0x22, 0xFD, 0x06, 0x49, 0xEB, 0x22, 0xE8, 0xB3, 0x9C, 0xCF, 0x40, 0x8B, 0xC7,\n    0x35, 0x07, 0xBD, 0x2C, 0x21, 0xFB, 0x15, 0x53, 0x38, 0x0B, 0x61, 0x10, 0x75, 0x11, 0x17, 0x1F,\n    0xE1, 0x76, 0x10, 0x53, 0x66, 0x2E, 0x36, 0x65, 0xF6, 0x62, 0x19, 0xAC, 0x68, 0x63, 0x1D, 0x17,\n    0x6C, 0x49, 0x6C, 0xA8, 0x40, 0x49, 0xFC, 0xBA, 0x63, 0x25, 0x5E, 0x79, 0x07, 0x10, 0xC3, 0x3C,\n    0xC5, 0x81, 0x14, 0xBB, 0xCD, 0xC3, 0x63, 0x36, 0x9F, 0xB9, 0x68, 0x54, 0x8D, 0x31, 0x66, 0xC8,\n    0xF7, 0x4A, 0xA0, 0x68, 0x8A, 0xCC, 0xE2, 0xB8, 0x50, 0x88, 0x7B, 0xFF, 0x38, 0xE0, 0x8B, 0x90,\n    0x0C, 0x98, 0xF1, 0xC5, 0x5F, 0xFA, 0x2A, 0x37, 0x6A, 0x3C, 0x39, 0xC0, 0xF1, 0x29, 0x0F, 0xC1,\n    0xA6, 0xCE, 0xCC, 0x98, 0xD7, 0x9C, 0xAE, 0x71, 0xAB, 0xFE, 0xA1, 0xC6, 0x0E, 0xF7, 0xE7, 0x60,\n    0x9B, 0x63, 0x50, 0x00, 0x8B, 0x1A, 0xC4, 0xF2, 0xDB, 0xFF, 0xCB, 0xC8, 0xDC, 0x23, 0x49, 0xA9,\n    0xFB, 0xF3, 0x1A, 0x09, 0xA5, 0x27, 0xD5, 0x18, 0x4C, 0x84, 0x2E, 0x6E, 0x56, 0x39, 0x3F, 0xD3,\n    0x08, 0xDE, 0x76, 0x90, 0xC1, 0x43, 0x33, 0x32, 0xF8, 0x76, 0x59, 0x48, 0x14, 0xCD, 0x2E, 0x19,\n    0xDF, 0x8B, 0x72, 0xAF, 0xB2, 0x2F, 0xD9, 0x5C, 0x5C, 0x87, 0x8C, 0x3A, 0x66, 0x86, 0xBD, 0xEA,\n    0x82, 0xFC, 0x36, 0xFA, 0x05, 0xE8, 0xE0, 0x07, 0x53, 0xD8, 0x68, 0xD4, 0x86, 0x3A, 0xA4, 0x64,\n    0xD5, 0x13, 0x16, 0x3F, 0x9B, 0x1D, 0x60, 0x3A, 0x46, 0xAF, 0x99, 0x89, 0xBF, 0x1A, 0xD2, 0x45,\n    0xF8, 0xD7, 0x86, 0x6E, 0x0C, 0x3A, 0xCD, 0x69, 0x05, 0x1A, 0x07, 0x7D, 0x52, 0x96, 0xE1, 0xB6,\n    0x84, 0xE9, 0x63, 0x5B, 0x3D, 0xEE, 0xF6, 0xDC, 0x8A, 0xE2, 0xDC, 0xFA, 0xDD, 0xD6, 0x5F, 0xA3,\n    0x17, 0xD3, 0xE6, 0x3C, 0xC6, 0xEE, 0x7C, 0x84, 0x6F, 0x82, 0x9A, 0x01, 0xF7, 0xC4, 0x71, 0x69,\n    0x0B, 0x56, 0xEB, 0x48, 0xB3, 0x09, 0x23, 0x05, 0x26, 0x47, 0xD5, 0x8B, 0x2D, 0x8B, 0x91, 0x73,\n    0xF8, 0x14, 0xAC, 0xE6, 0xEE, 0xB3, 0x40, 0x6D, 0x43, 0x70, 0x18, 0x8A, 0xA4, 0xA9, 0x9A, 0x66,\n    0x77, 0x85, 0x7E, 0x0F, 0x48, 0x24, 0x0B, 0xF1, 0x15, 0xEF, 0xBB, 0x25, 0xB8, 0x44, 0x43, 0x8E,\n    0x91, 0x29, 0x74, 0x43, 0xEC, 0xF9, 0x31, 0x48, 0x97, 0xFC, 0xDF, 0x5A, 0xA9, 0x3B, 0x50, 0xAB,\n    0x9E, 0xE5, 0x93, 0xF3, 0x39, 0xD8, 0x4E, 0xAB, 0x7F, 0xAD, 0x2E, 0x83, 0x7F, 0x85, 0x46, 0x24,\n    0xE7, 0x76, 0xF4, 0x64, 0xFF, 0x6A, 0xDA, 0x79, 0x2F, 0x49, 0x16, 0xD8, 0xF1, 0x54, 0xD6, 0x37,\n    0xCB, 0x50, 0x13, 0xA0, 0xB2, 0x4E, 0xDC, 0x1E, 0xF0, 0x59, 0xB4, 0x4F, 0xB4, 0x9B, 0x6D, 0x17,\n    0xA1, 0x4C, 0x25, 0x24, 0x71, 0x3C, 0x06, 0x6D, 0xEE, 0x35, 0x8D, 0xA7, 0x6E, 0x1C, 0x59, 0x17,\n    0x7A, 0xA5, 0xB4, 0x14, 0x9F, 0x12, 0x8D, 0xE0, 0xC1, 0xEE, 0xAA, 0xE5, 0xF6, 0x9D, 0x2F, 0x81,\n    0x75, 0x9F, 0xCC, 0xE4, 0xE1, 0x87, 0x85, 0x65, 0x86, 0x08, 0xD4, 0xC2, 0xC5, 0xE1, 0x87, 0x4C,\n    0x76, 0x25, 0xFC, 0x9F, 0x70, 0x08, 0x5C, 0x69, 0xB2, 0xEF, 0xDD, 0x2E, 0x41, 0xAF, 0x8E, 0x8A,\n    0x51, 0x0F, 0x1E, 0x7D, 0xD2, 0x24, 0x8C, 0x70, 0x4D, 0xB9, 0x22, 0x8B, 0x39, 0x51, 0xEF, 0xCB,\n    0x19, 0x16, 0xDC, 0x38, 0xF2, 0x95, 0xE6, 0x39, 0xD0, 0x2A, 0x59, 0x2D, 0xD0, 0xFA, 0xC3, 0x7E,\n    0xC7, 0x43, 0xF1, 0x74, 0x11, 0x1D, 0x4D, 0xA2, 0x35, 0x35, 0xCA, 0x97, 0x05, 0x02, 0x2B, 0xA2,\n    0x82, 0x23, 0x36, 0xEF, 0xFC, 0xEC, 0xA9, 0x0A, 0x1B, 0xCA, 0x55, 0x77, 0x11, 0xAC, 0x3F, 0xCC,\n    0xA7, 0xF5, 0x12, 0x1D, 0x7C, 0x4C, 0xA3, 0xF9, 0x14, 0x85, 0x1D, 0x8E, 0x5E, 0xD3, 0x49, 0x52,\n    0x9D, 0x37, 0x6D, 0x8E, 0x35, 0x8C, 0xA9, 0xFE, 0x37, 0x23, 0x56, 0xB8, 0x05, 0x65, 0x54, 0x07,\n    0xF2, 0xC6, 0xED, 0x70, 0x10, 0xA1, 0x97, 0x77, 0xD4, 0xD7, 0x77, 0x50, 0x50, 0x16, 0x8C, 0x6E,\n    0x45, 0xED, 0x9D, 0xB4, 0xF3, 0xE5, 0x82, 0x37, 0x99, 0x67, 0x53, 0x68, 0xC6, 0x22, 0x33, 0xFD,\n    0x0C, 0xAD, 0x18, 0x24, 0x76, 0x06, 0x26, 0x5D, 0x9B, 0x14, 0xF6, 0xCC, 0xB8, 0x48, 0x7E, 0x85,\n    0x15, 0x35, 0xC7, 0x16, 0x1F, 0xE5, 0x3A, 0x41, 0x9B, 0xB6, 0xA8, 0x64, 0x48, 0x57, 0x32, 0x60,\n    0x91, 0xE5, 0xC1, 0x41, 0xEC, 0x4C, 0x97, 0xEF, 0xD4, 0xF8, 0x84, 0x41, 0x61, 0x47, 0x17, 0x08,\n    0x96, 0xC3, 0xBB, 0xF3, 0xB7, 0x2C, 0xF6, 0xB9, 0xA1, 0x89, 0x78, 0x79, 0x73, 0x89, 0x4C, 0x07,\n    0x34, 0x4E, 0x75, 0x88, 0xA8, 0x18, 0x54, 0x3C, 0xF3, 0x8F, 0xED, 0x04, 0xE7, 0x86, 0xD7, 0x8B,\n    0xED, 0x34, 0x6B, 0xCF, 0x29, 0x1F, 0x7A, 0x54, 0x7E, 0x8A, 0xE1, 0x81, 0x4C, 0xEE, 0xEA, 0x23,\n    0x7B, 0x3F, 0x16, 0x24, 0x71, 0x9D, 0x97, 0xF8, 0x5B, 0xD0, 0x73, 0x86, 0xFA, 0x21, 0x27, 0x3E,\n    0x73, 0x1F, 0x0C, 0x36, 0x87, 0x56, 0x2F, 0x21, 0x10, 0x38, 0xFD, 0x14, 0xB4, 0x1E, 0xAB, 0x3B,\n    0xC1, 0x54, 0xE2, 0xDB, 0xB5, 0x76, 0xF2, 0x61, 0x14, 0xBA, 0x19, 0x23, 0x7C, 0x53, 0x30, 0xC8,\n    0x0C, 0x62, 0x61, 0x93, 0x41, 0x83, 0x1C, 0xA7, 0x2D, 0x15, 0xD5, 0x67, 0x95, 0xEE, 0xBD, 0xDB,\n    0x27, 0x31, 0x16, 0x81, 0xC9, 0x3A, 0x78, 0xFC, 0xB2, 0x26, 0x10, 0x3F, 0xCA, 0x89, 0x11, 0xB0,\n    0x03, 0xE1, 0xB9, 0x7E, 0xDE, 0x0C, 0x34, 0xD1, 0xAA, 0x72, 0x34, 0x90, 0xD8, 0x62, 0x74, 0xAE,\n    0xA7, 0x63, 0x96, 0xCD, 0xBA, 0x58, 0x60, 0x6E, 0xD1, 0x6C, 0x6B, 0xAE, 0xB2, 0x15, 0x7E, 0x12,\n    0x1A, 0x29, 0x03, 0x2E, 0x28, 0x98, 0x59, 0x52, 0xE2, 0x94, 0xAC, 0x18, 0x00, 0x1B, 0x2D, 0xCC,\n    0xE0, 0xDC, 0x71, 0xA0, 0x97, 0xAF, 0xA1, 0xD3, 0x9D, 0xA6, 0xEE, 0x62, 0xB4, 0x51, 0xBE, 0xE9,\n    0xF0, 0x23, 0xBD, 0x5A, 0xED, 0x16, 0xEC, 0x01, 0x70, 0x8F, 0x39, 0xF2, 0xF9, 0xD8, 0x6D, 0x54,\n    0x6A, 0xD3, 0x70, 0x7B, 0xE4, 0x6E, 0x1D, 0x40, 0xF4, 0x4A, 0x04, 0xA6, 0x3A, 0x2B, 0x76, 0x62,\n    0x7F, 0x04, 0xC2, 0x0B, 0xB0, 0xAC, 0xB6, 0xE1, 0x85, 0x8A, 0xD5, 0x35, 0xCA, 0xDF, 0xDE, 0x8A,\n    0x57, 0x34, 0x51, 0xD0, 0x44, 0xC0, 0xBB, 0x51, 0x16, 0x44, 0x3F, 0xC7, 0xC4, 0x10, 0x3B, 0x06,\n    0xB2, 0xB7, 0xA1, 0xF4, 0x9C, 0x2F, 0xFA, 0xD3, 0x46, 0x51, 0xC3, 0x25, 0x9A, 0x94, 0xB8, 0x78,\n    0xE3, 0x3B, 0x63, 0x64, 0x61, 0xF6, 0x1D, 0x4C, 0x9C, 0xFF, 0x68, 0x18, 0xCC, 0x51, 0xD0, 0xC3,\n    0x0B, 0x67, 0x0D, 0xED, 0x78, 0xF4, 0xD7, 0x26, 0x41, 0x0C, 0xEE, 0xB7, 0x35, 0x72, 0xDA, 0x39,\n    0x3D, 0x20, 0x35, 0xF0, 0xC8, 0xF2, 0x6A, 0x29, 0xE3, 0x03, 0x90, 0x80, 0xE7, 0x76, 0xBA, 0x78,\n    0x5E, 0x5C, 0x9A, 0x35, 0x05, 0x9C, 0x2E, 0xB8, 0xA8, 0x86, 0x2F, 0xD3, 0xEA, 0x37, 0x7D, 0xED,\n    0x66, 0xA8, 0x4E, 0xEF, 0xA3, 0xBF, 0x3F, 0x85, 0x21, 0x94, 0x59, 0x23, 0x3A, 0xB5, 0x42, 0x6D,\n    0x95, 0x3D, 0x9A, 0xE2, 0x2A, 0x08, 0xC9, 0xD5, 0x6D, 0xC3, 0x6C, 0x09, 0x09, 0xAC, 0x48, 0x4A,\n    0x7A, 0x46, 0xB7, 0x34, 0x03, 0xF0, 0x8A, 0x33, 0x3E, 0xAE, 0x27, 0xFD, 0x2D, 0xF8, 0xAB, 0xE4,\n    0x82, 0x81, 0x93, 0x65, 0x4E, 0xC2, 0x0D, 0x6D, 0xD0, 0xEA, 0xDF, 0x8D, 0xA5, 0xD6, 0xA1, 0x45,\n    0x7F, 0x08, 0xE1, 0x93, 0x7E, 0x87, 0x50, 0x84, 0xDE, 0x7D, 0x03, 0x9F, 0x3C, 0xD9, 0x81, 0x31,\n    0x1B, 0x1E, 0xA1, 0x82, 0x17, 0x76, 0xE4, 0x3F, 0x45, 0xC9, 0x2E, 0x8E, 0x72, 0xE3, 0x43, 0xF1,\n    0x84, 0xF2, 0xFC, 0x0B, 0x8E, 0x6E, 0xB4, 0x5F, 0x10, 0xF2, 0x3E, 0xC0, 0x7D, 0x57, 0xC2, 0x3E,\n    0xE9, 0x15, 0x4F, 0xC8, 0x0B, 0x65, 0x53, 0xBB, 0xD9, 0x50, 0xA2, 0x5C, 0xCB, 0x11, 0x14, 0x77,\n    0xDF, 0x2A, 0x18, 0x43, 0x3E, 0xE0, 0x1D, 0x30, 0x6E, 0xF3, 0xFE, 0xB7, 0x3D, 0x7B, 0x22, 0x7A,\n    0x73, 0xF4, 0x62, 0xBA, 0x82, 0x51, 0x5D, 0x42, 0x0B, 0x27, 0x0E, 0x13, 0x27, 0xB4, 0xB5, 0xB4,\n    0x29, 0xDA, 0x94, 0xB3, 0x99, 0x9B, 0x3B, 0x37, 0x6E, 0xB2, 0x28, 0x26, 0x52, 0xCF, 0x5C, 0xCB,\n    0x74, 0x95, 0x30, 0x50, 0x48, 0xC9, 0xAD, 0xEE, 0x8B, 0xC6, 0x72, 0x55, 0xEC, 0x28, 0x14, 0x00,\n    0x78, 0xC4, 0x42, 0x61, 0xBF, 0x96, 0x81, 0x06, 0xFA, 0x45, 0x4F, 0xC0, 0x1F, 0xC0, 0x4F, 0xCA,\n    0xEE, 0xBC, 0xCC, 0xF5, 0xAA, 0xC4, 0x78, 0x0A, 0x16, 0xF5, 0xD2, 0x65, 0x6D, 0xCD, 0x74, 0x2D,\n    0x87, 0x93, 0xBC, 0x51, 0x02, 0x68, 0xE0, 0x72, 0xE0, 0x5F, 0x98, 0x1E, 0x7D, 0x2B, 0x9F, 0xCD,\n    0x1D, 0xC7, 0x20, 0x34, 0xF5, 0x95, 0x82, 0x7A, 0x04, 0x80, 0x35, 0x96, 0x88, 0xB8, 0x1C, 0x26,\n    0x16, 0x62, 0xD9, 0x32, 0x91, 0xD0, 0x0F, 0x87, 0x23, 0x4E, 0x44, 0x25, 0x7C, 0x2A, 0xD4, 0x8E,\n    0x43, 0x0B, 0xEC, 0xA4, 0xD0, 0x92, 0x46, 0xEE, 0xB1, 0xC3, 0xC4, 0x61, 0xE5, 0xA9, 0x90, 0x0D,\n    0x03, 0x00, 0xBD, 0xA5, 0xEB, 0x81, 0xB0, 0x2B, 0xAB, 0xEF, 0x5F, 0x70, 0x6A, 0x80, 0x2F, 0xA1,\n    0xDC, 0xB3, 0x47, 0x7F, 0xF4, 0x8A, 0x41, 0xB2, 0x94, 0xEA, 0x06, 0x91, 0x92, 0x1D, 0xEF, 0x4A,\n    0xF1, 0x81, 0xAE, 0x8E, 0xA6, 0xE8, 0x7B, 0xC1, 0x46, 0xDD, 0x33, 0xBE, 0x14, 0x1C, 0x24, 0x27,\n    0xD8, 0xE0, 0xE7, 0x69, 0x9E, 0xFC, 0x53, 0x7E, 0x40, 0x2C, 0x13, 0xA7, 0xD6, 0x5A, 0x82, 0xD6,\n    0xFF, 0x09, 0xA8, 0x6B, 0xB1, 0x60, 0x82, 0x0A, 0xDD, 0x90, 0x1C, 0xE4, 0x6A, 0xA3, 0x18, 0xFB,\n    0x66, 0xD4, 0x4F, 0x9B, 0x28, 0xB2, 0x5B, 0xE7, 0x73, 0xCA, 0x33, 0x2F, 0x75, 0x57, 0x9B, 0xEA,\n    0x36, 0x03, 0xC4, 0x06, 0x22, 0x4D, 0xDE, 0x30, 0x57, 0x4C, 0x7C, 0x90, 0xE5, 0xCF, 0x88, 0x39,\n    0xF5, 0x19, 0x18, 0x18, 0x2A, 0x1A, 0x16, 0x11, 0xD8, 0x49, 0xCF, 0x5A, 0x4A, 0x51, 0x1B, 0x78,\n    0x1D, 0xF1, 0x65, 0xB2, 0x7C, 0xC7, 0xD4, 0xF1, 0xB1, 0x3D, 0xA3, 0x5C, 0x0A, 0xB5, 0x3E, 0x72,\n    0x4B, 0xE3, 0x28, 0xEA, 0xC9, 0x73, 0x9F, 0x36, 0xC1, 0x50, 0x4F, 0x19, 0x33, 0x47, 0xAB, 0x46,\n    0x71, 0x60, 0x0E, 0xE8, 0x1D, 0xD2, 0xDB, 0xD3, 0xD8, 0xF3, 0xA9, 0xD7, 0xE5, 0x25, 0x2B, 0xA2,\n    0x75, 0x36, 0x77, 0x55, 0x00, 0x8E, 0x67, 0xF1, 0xF9, 0xDE, 0x38, 0x45, 0x24, 0x84, 0x01, 0x15,\n    0xA6, 0xD2, 0x30, 0x91, 0x71, 0xE3, 0xA6, 0xA7, 0xF4, 0x52, 0x77, 0x76, 0x74, 0xC8, 0x43, 0x76,\n    0x3E, 0xBF, 0x61, 0xB1, 0xBD, 0x1C, 0x68, 0x10, 0x8B, 0x69, 0xCD, 0x90, 0x1C, 0x2D, 0x76, 0xD4,\n    0x4B, 0x3F, 0xF4, 0x3F, 0xC0, 0x8F, 0xB2, 0x13, 0x2D, 0x07, 0xC0, 0x9A, 0x03, 0x74, 0x11, 0x0A,\n    0xAA, 0x74, 0x61, 0xB7, 0x5F, 0x64, 0xE8, 0x0D, 0xE7, 0x57, 0x4C, 0x46, 0x36, 0xAE, 0x54, 0x71,\n    0xFD, 0x02, 0xD1, 0x6E, 0x18, 0x06, 0xCA, 0x74, 0x7F, 0xA8, 0xF4, 0xDF, 0x1A, 0x37, 0xF2, 0xD6,\n    0x43, 0xD3, 0xF5, 0x70, 0x22, 0xFD, 0x78, 0x24, 0x65, 0xF1, 0x90, 0x79, 0xE2, 0x12, 0x31, 0xBD,\n    0xAA, 0xFF, 0xA1, 0x89, 0x05, 0xBE, 0xAE, 0xCA, 0x1A, 0x4B, 0x9A, 0x6D, 0x24, 0xF3, 0xDF, 0x4E,\n    0xB2, 0xB9, 0x71, 0x10, 0x96, 0xCD, 0xA5, 0xEB, 0x99, 0xDA, 0x5D, 0xB1, 0xF4, 0x50, 0x30, 0x8F,\n    0x51, 0x6F, 0xDF, 0xF5, 0x7F, 0xB5, 0x8B, 0xD9, 0x58, 0xD2, 0x0C, 0x72, 0x00, 0xB2, 0x32, 0x62,\n    0x18, 0x78, 0xBD, 0x8A, 0x2B, 0x07, 0xB4, 0x5E, 0x4E, 0xB5, 0x1B, 0xE4, 0x4D, 0xD4, 0x59, 0x29,\n    0x8E, 0xAA, 0x97, 0x71, 0x66, 0x7F, 0x9E, 0x3B, 0x57, 0xE0, 0x35, 0x03, 0x6B, 0xF7, 0x12, 0x3C,\n    0x5A, 0xAD, 0x1A, 0xF1, 0xC6, 0xC9, 0x5A, 0xF0, 0x1D, 0x25, 0x15, 0xE4, 0x3B, 0x45, 0x88, 0x70,\n    0x77, 0x7F, 0x33, 0xC0, 0xA7, 0x50, 0x6F, 0x22, 0x9B, 0xB6, 0xAF, 0x35, 0xF4, 0xC1, 0xEC, 0xEC,\n    0xF7, 0x7B, 0x59, 0x45, 0x2E, 0x8C, 0x45, 0x94, 0xCF, 0xF2, 0x64, 0xD4, 0x99, 0x78, 0xB6, 0xD3,\n    0x20, 0x42, 0x49, 0xF4, 0x8E, 0xC4, 0x4E, 0xC9, 0x63, 0x10, 0xE7, 0x57, 0xA8, 0x33, 0xBB, 0xE3,\n    0xF2, 0xDF, 0x38, 0x24, 0xF4, 0xC5, 0xEA, 0x86, 0xAF, 0xB7, 0xB1, 0x34, 0x46, 0x74, 0xAD, 0x96,\n    0x84, 0x5F, 0x44, 0x16, 0xE2, 0x54, 0xCA, 0x6A, 0x93, 0xE1, 0x59, 0xBD, 0x56, 0xCF, 0x8C, 0x3A,\n    0x3C, 0x1B, 0xAB, 0xBE, 0x6A, 0x0E, 0xCA, 0x56, 0x20, 0x1C, 0xDE, 0xDF, 0x0A, 0x5D, 0x7F, 0x55,\n    0xF9, 0x9E, 0x21, 0x9D, 0x98, 0x37, 0xFD, 0xFE, 0xE7, 0xD7, 0xDC, 0x87, 0xD1, 0xC5, 0x60, 0xF5,\n    0x91, 0xD9, 0x10, 0x95, 0x6C, 0x24, 0x5B, 0x0F, 0x59, 0x54, 0x4D, 0x04, 0xE8, 0xF8, 0x33, 0x94,\n    0x1D, 0x00, 0x72, 0xCE, 0x6B, 0xCD, 0x90, 0xC7, 0x6A, 0x9F, 0xF4, 0xE7, 0x5B, 0x67, 0x52, 0xBB,\n    0xB6, 0x58, 0x19, 0xBB, 0xD5, 0x09, 0x0B, 0x8C, 0x30, 0xBE, 0x21, 0xDA, 0xCB, 0xE7, 0x67, 0xDC,\n    0x24, 0x00, 0xDD, 0x1A, 0x43, 0x13, 0x71, 0x44, 0x11, 0xA1, 0xA5, 0x9D, 0x9E, 0xD1, 0x19, 0xE4,\n    0x9D, 0x59, 0x2D, 0xF9, 0x9F, 0x8D, 0x2D, 0x09, 0x01, 0x32, 0x35, 0xC7, 0x2E, 0x12, 0x15, 0x84,\n    0x88, 0x9F, 0xA7, 0xA2, 0x48, 0x72, 0xA6, 0xB2, 0xE0, 0x81, 0x8A, 0xB1, 0x07, 0x21, 0x5D, 0x9D,\n    0x74, 0x1D, 0x3D, 0x98, 0x24, 0x1E, 0x4C, 0x45, 0xBD, 0x45, 0x3F, 0x1E, 0x31, 0x5D, 0xBE, 0x8C,\n    0x4F, 0xDD, 0x1D, 0x0C, 0xA7, 0xFC, 0x5C, 0xA3, 0x20, 0x13, 0x71, 0x9F, 0xB8, 0x0E, 0x50, 0xFA,\n    0x27, 0x5A, 0xA0, 0x91, 0x28, 0xCA, 0xDF, 0x43, 0x39, 0x18, 0xA2, 0x9F, 0x60, 0xAB, 0xEC, 0x2B,\n    0x89, 0x03, 0x03, 0x58, 0xB0, 0xA0, 0x76, 0x46, 0xBB, 0x2A, 0x37, 0xEF, 0xD9, 0xD7, 0xDD, 0x93,\n    0x40, 0x0A, 0x13, 0x7E, 0xF6, 0x84, 0xB7, 0x34, 0x10, 0xB2, 0x31, 0x83, 0x09, 0x66, 0x78, 0xA1,\n    0x60, 0xD5, 0x30, 0xC4, 0x82, 0xD4, 0x2E, 0x6D, 0xFD, 0x8B, 0x01, 0x84, 0x91, 0x78, 0x4A, 0x4E,\n    0x2A, 0x85, 0x82, 0xC9, 0x92, 0x0D, 0x28, 0x32, 0x26, 0xE5, 0x25, 0x35, 0x09, 0x79, 0x04, 0xA5,\n    0xE4, 0xFA, 0x35, 0xE0, 0xB3, 0x87, 0x8B, 0x18, 0x02, 0xED, 0xEC, 0x7B, 0x34, 0x56, 0xAE, 0x6C,\n    0x00, 0x3C, 0x8F, 0xEF, 0xA6, 0x06, 0xFC, 0xBD, 0xD9, 0x35, 0x47, 0x79, 0x0F, 0xB4, 0x49, 0x7D,\n    0x9A, 0x1B, 0xB9, 0xEE, 0xB4, 0xFB, 0xDA, 0xAA, 0xCD, 0xEF, 0xA1, 0xD6, 0xD4, 0xCA, 0x7F, 0xE8,\n    0x1D, 0x91, 0x72, 0x83, 0xB6, 0x4B, 0x86, 0xE4, 0xEC, 0x27, 0xD9, 0xEF, 0xDC, 0x0D, 0xA0, 0x25,\n    0xE8, 0xD8, 0xEA, 0xC0, 0xD1, 0x5C, 0x58, 0x00, 0xFD, 0x31, 0x48, 0x69, 0xD7, 0x09, 0xFD, 0xD4,\n    0x1A, 0x8D, 0x5B, 0xE7, 0xA6, 0xE1, 0x9A, 0xF6, 0x1A, 0x03, 0xF9, 0x2D, 0x2E, 0x42, 0xC9, 0x93,\n    0xCA, 0x31, 0xAA, 0xF1, 0xBB, 0x52, 0xCF, 0x20, 0x01, 0x67, 0xE0, 0x7D, 0x80, 0x69, 0xBA, 0x81,\n    0xF5, 0x3A, 0x55, 0x40, 0x4E, 0x4F, 0x9B, 0xDD, 0x0F, 0xF9, 0x20, 0xB8, 0x4A, 0x16, 0x58, 0x21,\n    0x6D, 0x71, 0x42, 0x78, 0xC4, 0x25, 0x3D, 0x6F, 0x9C, 0xC5, 0xE1, 0x2B, 0x39, 0xE0, 0x52, 0x07,\n    0x4A, 0xFF, 0x62, 0x2C, 0xD2, 0xAB, 0xF3, 0x5B, 0x20, 0xB3, 0x85, 0x44, 0x24, 0x84, 0x8C, 0x3C,\n    0x38, 0x09, 0x9A, 0x3A, 0x4E, 0xAF, 0xBC, 0xAB, 0x6E, 0x0D, 0x60, 0x30, 0xBA, 0x04, 0xAA, 0x74,\n    0x93, 0x15, 0x14, 0xB8, 0xD4, 0x20, 0xD6, 0x2F, 0x2B, 0x23, 0x7F, 0x03, 0xC1, 0x3F, 0xF0, 0xE2,\n    0xBA, 0x77, 0x9C, 0xF3, 0x83, 0xE5, 0x61, 0x11, 0xA2, 0x77, 0x9D, 0xB8, 0x65, 0xB5, 0x87, 0xC2,\n    0xFD, 0xEA, 0x9E, 0x6E, 0xBA, 0x5D, 0x5E, 0x76, 0x46, 0x49, 0x4E, 0x5A, 0x5F, 0x4C, 0x96, 0xB1,\n    0x5F, 0x6A, 0xE5, 0xA2, 0xC2, 0xDB, 0xC6, 0x66, 0x92, 0xD7, 0xD4, 0x80, 0x6F, 0x63, 0x01, 0x1C,\n    0x0D, 0x13, 0xB5, 0xA9, 0x72, 0x8B, 0x6B, 0xA6, 0xF0, 0x98, 0xE4, 0xC6, 0xF8, 0x46, 0x23, 0x61,\n    0x1E, 0x4C, 0xFD, 0xFF, 0x3E, 0x4C, 0x78, 0xE8, 0x49, 0xCE, 0xA6, 0xD0, 0x5C, 0x2B, 0x85, 0x7D,\n    0xB4, 0xF5, 0x7D, 0x71, 0x1C, 0x89, 0x57, 0x42, 0x6A, 0x7A, 0x71, 0x44, 0x75, 0x01, 0x90, 0xC3,\n    0xBF, 0x95, 0x7B, 0x0A, 0x4E, 0x01, 0x0A, 0x52, 0xF4, 0xA0, 0x21, 0x94, 0x7C, 0xEB, 0xA9, 0xEB,\n    0xAD, 0x1B, 0xBE, 0x78, 0x98, 0x04, 0xC4, 0x26, 0x20, 0x73, 0x5F, 0xB5, 0x45, 0x6C, 0xE2, 0xC7,\n    0x04, 0xD2, 0xEB, 0x67, 0xE5, 0x8F, 0x2F, 0xA0, 0x66, 0x4C, 0xBD, 0x36, 0x2C, 0xFE, 0x8E, 0x40,\n    0x46, 0xB6, 0xAB, 0x2F, 0xCF, 0x1F, 0xA1, 0x3E, 0xBF, 0x96, 0x61, 0x74, 0x68, 0xD6, 0x82, 0x1D,\n    0x12, 0xD5, 0xFD, 0xB9, 0x45, 0xDA, 0x8D, 0x2B, 0x76, 0xDE, 0x9C, 0x65, 0xA0, 0x2D, 0x76, 0x2F,\n    0x49, 0x2E, 0xEC, 0x27, 0xD4, 0x40, 0x26, 0xA3, 0x06, 0x01, 0x2E, 0x60, 0x04, 0x94, 0x43, 0xA4,\n    0x79, 0x5D, 0xEA, 0xD8, 0xD1, 0x5B, 0x95, 0xF2, 0x2E, 0x13, 0x17, 0x9E, 0xED, 0x7A, 0x7E, 0x83,\n    0x86, 0xDF, 0xD1, 0xD4, 0xE9, 0x00, 0x55, 0x8D, 0xCA, 0x4F, 0x18, 0x74, 0x4E, 0x5E, 0x7C, 0xAC,\n    0xE9, 0x4A, 0x25, 0xA7, 0x3A, 0x84, 0x43, 0xF5, 0x77, 0x74, 0x1E, 0xDC, 0x32, 0xDB, 0x50, 0xCF,\n    0xF8, 0xAC, 0x01, 0x37, 0x33, 0x59, 0xBE, 0xF5, 0xC2, 0x98, 0xE7, 0x09, 0x29, 0xE3, 0x6E, 0xBC,\n    0x22, 0x1D, 0x20, 0x06, 0x89, 0x90, 0x95, 0xCC, 0xC7, 0x3F, 0x2B, 0x48, 0x5F, 0x23, 0x0B, 0xCB,\n    0xD5, 0xA2, 0x4E, 0x52, 0x5A, 0x1E, 0x1A, 0x4C, 0x51, 0x75, 0x67, 0x33, 0xD6, 0xF1, 0xBE, 0x9B,\n    0x8D, 0x31, 0x0F, 0xBA, 0x2A, 0x67, 0x58, 0xF5, 0x62, 0xC3, 0x80, 0x48, 0x89, 0x5C, 0x3F, 0x81,\n    0xFF, 0x27, 0x6E, 0x0B, 0x79, 0x6A, 0xD0, 0x33, 0xD6, 0x2D, 0x6A, 0xF1, 0x36, 0xCC, 0x96, 0x6C,\n    0xA6, 0x6D, 0xA0, 0x92, 0x04, 0x5B, 0x27, 0xC9, 0x05, 0x1D, 0xCA, 0xB2, 0x8D, 0x4F, 0x20, 0xB6,\n    0xEA, 0xE4, 0x57, 0xAE, 0xAF, 0x77, 0xF7, 0xA8, 0xA5, 0xCD, 0xFF, 0x5C, 0xB9, 0x7F, 0x29, 0x98,\n    0x2C, 0x5E, 0xDA, 0x69, 0x3E, 0x99, 0x21, 0x25, 0x49, 0x1F, 0xEA, 0xD4, 0x91, 0x63, 0x89, 0xB8,\n    0xEC, 0xCF, 0x8B, 0x1D, 0xF6, 0x33, 0x3C, 0x29, 0x26, 0xEF, 0xAC, 0x81, 0x12, 0xC5, 0x1B, 0x44,\n    0xAC, 0x18, 0x90, 0x20, 0xBB, 0x03, 0x5B, 0x3F, 0x3E, 0xD3, 0xD3, 0xC5, 0x47, 0xAF, 0x7F, 0x44,\n    0x9E, 0x32, 0xC5, 0x06, 0xE9, 0xB6, 0x7D, 0xB3, 0xA1, 0xF6, 0x77, 0x29, 0x7F, 0xA9, 0xA9, 0x10,\n    0x20, 0xCE, 0x2E, 0x18, 0xC8, 0xAA, 0x68, 0x65, 0x64, 0x11, 0x57, 0x4F, 0xE9, 0xA2, 0xE3, 0xD1,\n    0xEA, 0x03, 0x40, 0xAC, 0x68, 0x04, 0xC8, 0x36, 0x69, 0xE9, 0xB5, 0x6D, 0x77, 0x93, 0xFA, 0xD6,\n    0xB8, 0xA5, 0x71, 0x63, 0x70, 0xE8, 0xA0, 0x27, 0x39, 0xD7, 0x33, 0x52, 0x76, 0x59, 0xF1, 0xEF,\n    0xE2, 0x76, 0x83, 0xC5, 0x4D, 0xC5, 0xA3, 0xF2, 0x10, 0x4C, 0xB3, 0x35, 0x6E, 0x12, 0x5B, 0x26,\n    0x7C, 0x4A, 0x8B, 0xFB, 0x02, 0x2B, 0xBE, 0xF4, 0x0A, 0x91, 0xF5, 0x7C, 0x82, 0x08, 0x62, 0x70,\n    0xD8, 0xA4, 0x29, 0xE0, 0xF8, 0x97, 0x19, 0x1D, 0x06, 0xD3, 0x46, 0x90, 0xEB, 0xB5, 0x89, 0x5B,\n    0x6C, 0x50, 0xB5, 0xB6, 0x70, 0x58, 0xA0, 0x30, 0x05, 0xF5, 0x40, 0x51, 0x4E, 0x30, 0xDF, 0x64,\n    0x6F, 0x7A, 0x4E, 0x54, 0x64, 0xE3, 0x20, 0xD3, 0x93, 0xE3, 0x79, 0x28, 0x39, 0xB1, 0x18, 0xDF,\n    0xCC, 0xF1, 0x98, 0xD1, 0x2D, 0x86, 0x34, 0x84, 0xA1, 0x83, 0x4A, 0xE5, 0xA9, 0x61, 0x6B, 0x09,\n    0xA2, 0x3B, 0xCE, 0x5E, 0xF7, 0x6B, 0xFF, 0xC2, 0x20, 0xFC, 0xF3, 0xAC, 0x2E, 0x7C, 0x63, 0x55,\n    0x11, 0x24, 0xEE, 0xE3, 0x51, 0xE6, 0x18, 0xB0, 0xD6, 0x6E, 0x85, 0xF5, 0xE5, 0x00, 0x91, 0x21,\n    0xD4, 0x88, 0xF1, 0x50, 0x31, 0x39, 0x0A, 0x08, 0x23, 0xA9, 0x01, 0xB3, 0xEF, 0xE8, 0xAF, 0xDF,\n    0xAE, 0x2B, 0xAF, 0xF9, 0x0D, 0xE2, 0x4D, 0x00, 0xE3, 0x5B, 0x56, 0x80, 0x90, 0xB8, 0xD4, 0x76,\n    0xEA, 0x14, 0x68, 0x40, 0x53, 0x9A, 0x3B, 0x82, 0xFC, 0x63, 0x9F, 0x9A, 0x4C, 0xFF, 0xE3, 0x10,\n    0x49, 0xCB, 0xA8, 0x1D, 0x59, 0x98, 0x3F, 0x4C, 0xDD, 0x2C, 0xB2, 0x8D, 0x11, 0xB5, 0x23, 0xF4,\n    0x90, 0x87, 0xE3, 0x85, 0x24, 0xD4, 0x0A, 0xE9, 0x79, 0xBB, 0x1F, 0x56, 0xC3, 0x62, 0x35, 0xDF,\n    0xE0, 0xAA, 0x51, 0x02, 0x93, 0xAE, 0x11, 0x21, 0xCF, 0xE4, 0xF3, 0x84, 0x08, 0x64, 0x06, 0x8B,\n    0x8A, 0x32, 0xB0, 0xF0, 0xC5, 0xD3, 0x5E, 0x1E, 0xF1, 0x69, 0x48, 0x46, 0xEC, 0x61, 0xA2, 0x7F,\n    0x28, 0xB6, 0xF8, 0xC9, 0x78, 0x35, 0x9B, 0x4D, 0x8C, 0xFE, 0xB7, 0xC9, 0xBC, 0xE9, 0x6E, 0x17,\n    0xCB, 0xFB, 0x00, 0x91, 0xE8, 0x27, 0x77, 0x7C, 0x96, 0xD6, 0xAF, 0x8D, 0xE4, 0x18, 0x8F, 0xEB,\n    0x7B, 0x9F, 0x01, 0x9C, 0x2E, 0x77, 0xF5, 0x40, 0x7C, 0x6D, 0x85, 0xA5, 0x17, 0x8F, 0x40, 0xB7,\n    0x9D, 0xBB, 0x68, 0x96, 0x22, 0x17, 0x0A, 0x75, 0xA3, 0x1D, 0x07, 0xE4, 0x93, 0x8A, 0xBB, 0xAD,\n    0x7E, 0x2E, 0xAA, 0x21, 0xDA, 0x62, 0xBF, 0xE8, 0xBB, 0x28, 0xB2, 0xCE, 0xE3, 0x0F, 0xCB, 0x3C,\n    0x2C, 0x4A, 0x3D, 0xAA, 0xFC, 0x4B, 0xB5, 0x6A, 0x04, 0x05, 0xA4, 0x63, 0x98, 0xD8, 0xA2, 0x5E,\n    0x96, 0xD5, 0x52, 0x7B, 0xCB, 0xED, 0xA3, 0x72, 0x3E, 0x2A, 0x3F, 0xE2, 0x79, 0x3D, 0xFE, 0x8A,\n    0xA0, 0xD4, 0x32, 0x60, 0x10, 0xBE, 0xF2, 0xE5, 0xF9, 0x03, 0xE2, 0x66, 0x76, 0x7A, 0x48, 0xEF,\n    0x33, 0x63, 0xA0, 0x93, 0x99, 0x28, 0x97, 0x40, 0xB9, 0xAD, 0xEC, 0xB4, 0xD7, 0x98, 0x9D, 0x87,\n    0x6A, 0x6C, 0x9D, 0xD5, 0xF6, 0xAA, 0x64, 0xE4, 0xD6, 0x73, 0x92, 0xA9, 0xC2, 0xB4, 0x80, 0x0F,\n    0x58, 0x7B, 0x01, 0x17, 0xAD, 0x7C, 0x3E, 0x5C, 0xDE, 0x7D, 0x77, 0xF2, 0x35, 0x4E, 0x6F, 0x0D,\n    0xE1, 0x4E, 0xAD, 0x4E, 0x82, 0x36, 0x87, 0x89, 0x43, 0x13, 0x50, 0x08, 0x22, 0x3D, 0x14, 0x3D,\n    0x85, 0x50, 0xBC, 0x17, 0x18, 0x66, 0xE1, 0x85, 0xEF, 0xCA, 0xF1, 0x12, 0x9B, 0xA1, 0xC0, 0x95,\n    0x14, 0x2E, 0x2C, 0xB6, 0x1B, 0x25, 0x9F, 0x4C, 0xF2, 0x49, 0xAE, 0x8A, 0xD4, 0xE7, 0x1A, 0x05,\n    0xFB, 0x6F, 0x75, 0x42, 0xC6, 0x14, 0xD8, 0xE5, 0x03, 0x04, 0x80, 0xEB, 0x58, 0x8F, 0x92, 0xAF,\n    0xD1, 0x15, 0x00, 0x63, 0xB7, 0xFF, 0xF8, 0xD7, 0xE3, 0xC0, 0x37, 0xEF, 0x68, 0xF9, 0xC8, 0x5A,\n    0x03, 0x6D, 0x4A, 0x56, 0xAE, 0xDF, 0x8E, 0xBD, 0x52, 0x5F, 0x7D, 0x22, 0x4A, 0xFA, 0xFE, 0xA2,\n    0x3F, 0xCE, 0x45, 0xD8, 0x41, 0x94, 0x70, 0x21, 0x48, 0xF7, 0x95, 0xE5, 0xE4, 0x22, 0x52, 0x7E,\n    0x15, 0xAE, 0xC7, 0x34, 0xA8, 0xF9, 0x15, 0x4B, 0x15, 0x11, 0x19, 0x19, 0xDC, 0x4A, 0x3D, 0x3D,\n    0x33, 0x79, 0x0E, 0x8A, 0x34, 0x11, 0xEB, 0x4A, 0x8B, 0xAF, 0x0F, 0xE8, 0xBA, 0x3E, 0x94, 0xA6,\n    0x2C, 0xF8, 0xF8, 0xA9, 0xD1, 0xE7, 0x3A, 0x3D, 0x44, 0xC8, 0x08, 0x47, 0x5E, 0xD8, 0xF1, 0x6C,\n    0xCD, 0x8C, 0x60, 0xD7, 0xF6, 0xA5, 0x57, 0xF2, 0x0C, 0xD6, 0x9E, 0x0C, 0x90, 0xCB, 0xAE, 0xC0,\n    0xC1, 0x62, 0xD4, 0xC6, 0x6C, 0x7F, 0xED, 0x38, 0x23, 0x48, 0x0B, 0x53, 0x64, 0xBE, 0xD2, 0x6C,\n    0xE2, 0xAB, 0x71, 0x9E, 0x51, 0x87, 0xBF, 0x54, 0xC1, 0x36, 0xC0, 0x5B, 0x0E, 0xD0, 0x63, 0xE9,\n    0x1C, 0x0C, 0x07, 0x3B, 0xAE, 0xEE, 0xA5, 0x51, 0x1E, 0xE6, 0x8E, 0x01, 0x1E, 0x59, 0xEA, 0x6C,\n    0x25, 0x63, 0x33, 0x08, 0x08, 0x2C, 0x21, 0xF5, 0xEA, 0x01, 0x56, 0x44, 0x7D, 0xE0, 0x85, 0x1C,\n    0xD5, 0x4D, 0x8D, 0xC2, 0xB7, 0xEE, 0x54, 0x51, 0xCA, 0x8B, 0xA6, 0xCF, 0x47, 0x85, 0x02, 0x29,\n    0xDD, 0x60, 0x42, 0xE4, 0x17, 0x8E, 0x42, 0x5D, 0xFF, 0x10, 0x91, 0x25, 0x46, 0x93, 0x6B, 0xDA,\n    0xAD, 0xDA, 0x01, 0x0F, 0x31, 0x85, 0x53, 0x9E, 0x7A, 0x3C, 0x14, 0xF5, 0xF0, 0xA4, 0x12, 0x9B,\n    0xED, 0xC7, 0x83, 0x73, 0xA4, 0x6B, 0xC8, 0xAA, 0x7B, 0xD4, 0x64, 0xF7, 0xF5, 0xD3, 0x07, 0x2F,\n    0x41, 0x8B, 0x09, 0xBF, 0xC7, 0xBD, 0x00, 0x2A, 0xBC, 0xBA, 0xFC, 0x9A, 0xE2, 0x58, 0x64, 0xFD,\n    0xE1, 0x60, 0x4E, 0x3C, 0x60, 0xE3, 0x84, 0xCD, 0xD3, 0xAE, 0xB4, 0x0D, 0xF8, 0xA3, 0xAA, 0x74,\n    0xE1, 0x42, 0x18, 0x56, 0xA6, 0x72, 0x65, 0xD1, 0x14, 0xCC, 0xFE, 0x1F, 0xD0, 0x91, 0x84, 0xA1,\n    0x6A, 0x33, 0x76, 0x97, 0x5B, 0x72, 0x3F, 0xB3, 0xB8, 0xDF, 0xD9, 0x3E, 0x1D, 0x1E, 0xFD, 0x35,\n    0xDF, 0x4B, 0xD7, 0x50, 0xE7, 0x2D, 0x1B, 0xC8, 0xCA, 0xB3, 0x89, 0xE4, 0x56, 0xA9, 0x81, 0x4A,\n    0xED, 0x96, 0xE3, 0x0C, 0xE5, 0x9F, 0x60, 0xF5, 0xB4, 0x9A, 0xCD, 0xAD, 0xBA, 0x63, 0x8B, 0x54,\n    0x39, 0xD0, 0x0A, 0xE9, 0x98, 0x5E, 0xC1, 0xC9, 0x40, 0xB7, 0xA4, 0x10, 0x32, 0x7D, 0x9E, 0x00,\n    0x68, 0x69, 0xB8, 0x23, 0xDF, 0xBE, 0xC0, 0x45, 0x33, 0xF1, 0x8E, 0x27, 0xED, 0xA1, 0xD9, 0x38,\n    0x74, 0xF2, 0x8A, 0xBE, 0x85, 0x1E, 0xF0, 0x5B, 0x1A, 0x34, 0x93, 0x72, 0xDE, 0x37, 0xD7, 0x83,\n    0xEB, 0x7B, 0x28, 0x5E, 0x14, 0x2A, 0xBC, 0xC7, 0xE2, 0xB3, 0x06, 0x29, 0x76, 0x37, 0xD3, 0xC4,\n    0x47, 0x8A, 0xDB, 0xC7, 0x30, 0x02, 0x66, 0xC9, 0x53, 0x5E, 0xBA, 0xDB, 0x07, 0x60, 0x0D, 0x6B,\n    0x54, 0xCB, 0x0C, 0xC1, 0x27, 0x54, 0xDE, 0x12, 0xED, 0x7D, 0x8E, 0x76, 0xCD, 0x57, 0x52, 0x88,\n    0xF0, 0x16, 0x9C, 0x80, 0xE1, 0x00, 0x50, 0x95, 0x61, 0x8E, 0x55, 0xEE, 0xE1, 0xC9, 0x8F, 0xD4,\n    0x1C, 0x74, 0xDD, 0x85, 0xCB, 0xE5, 0x7C, 0x8B, 0x24, 0x4C, 0x4B, 0xDA, 0x16, 0x98, 0xA0, 0x70,\n    0x58, 0x13, 0x5D, 0x05, 0x0C, 0x3F, 0x61, 0xE3, 0x14, 0xE2, 0xEF, 0x92, 0xC8, 0x3A, 0xDA, 0xFF,\n    0x0E, 0x1A, 0xB3, 0x7D, 0x02, 0x43, 0xDD, 0xE5, 0xE3, 0x8C, 0xE9, 0xFC, 0xD1, 0x66, 0xA2, 0x8E,\n    0x4D, 0x81, 0xA4, 0x4C, 0xBF, 0x4D, 0x9B, 0x67, 0x53, 0x63, 0x11, 0x86, 0x78, 0x54, 0xF0, 0x9E,\n    0x70, 0x56, 0x1C, 0x5F, 0xBA, 0xC9, 0x1C, 0xAB, 0xC8, 0x39, 0x8B, 0xC9, 0xE4, 0xB1, 0x07, 0xEA,\n    0xB5, 0xD4, 0x75, 0xF2, 0x91, 0x83, 0x1C, 0x2F, 0x73, 0xEC, 0xFB, 0x56, 0x68, 0xA1, 0xC8, 0xAC,\n    0xCA, 0x20, 0x3F, 0x6A, 0xE9, 0xBF, 0xC1, 0x1D, 0x00, 0xBC, 0x23, 0x1F, 0x1E, 0xF8, 0xC3, 0x08,\n    0xBD, 0x66, 0xA5, 0xF6, 0x5D, 0x77, 0xD5, 0x5A, 0x6D, 0x04, 0xEB, 0x76, 0x9E, 0xDB, 0x0C, 0x8C,\n    0x28, 0x9F, 0xCC, 0x4E, 0x77, 0xFC, 0x00, 0x36, 0xEC, 0xCE, 0x4B, 0x72, 0x06, 0xD1, 0x73, 0x1A,\n    0xD8, 0x91, 0x45, 0x55, 0xB8, 0xA7, 0x8C, 0x40, 0xCA, 0xF7, 0xCF, 0x39, 0x6A, 0x74, 0x63, 0xD3,\n    0x71, 0x76, 0xA4, 0x59, 0xB8, 0x8C, 0xB5, 0x4E, 0xCA, 0x12, 0x35, 0xB5, 0x87, 0x9F, 0xA9, 0x94,\n    0x07, 0x67, 0x4D, 0xF0, 0xDF, 0x97, 0x0F, 0x53, 0x68, 0xCC, 0x67, 0x26, 0xF8, 0xF5, 0xBE, 0xAD,\n    0x1E, 0x95, 0xD0, 0x90, 0x88, 0x27, 0xA8, 0x3D, 0x4F, 0xA1, 0x58, 0xDE, 0x8F, 0xBC, 0x36, 0x2F,\n    0x36, 0x0B, 0x38, 0x9A, 0x51, 0x95, 0xA2, 0xE5, 0x8F, 0xC5, 0x1D, 0xE4, 0x2E, 0x27, 0x9D, 0xEA,\n    0x43, 0xD7, 0x07, 0x02, 0x0B, 0x26, 0x85, 0xD3, 0xEC, 0xA3, 0x67, 0xA9, 0xC3, 0x23, 0xFA, 0x46,\n    0x5F, 0x9C, 0x64, 0xD5, 0xCC, 0x7D, 0x75, 0xE3, 0x51, 0x32, 0x31, 0x1F, 0x51, 0x99, 0xF0, 0x57,\n    0x30, 0xC9, 0x22, 0xA0, 0x2B, 0xA3, 0xA7, 0x7A, 0x26, 0x21, 0x91, 0xD1, 0x75, 0xD4, 0xB7, 0x0B,\n    0xC5, 0x96, 0x71, 0x66, 0x2D, 0x5E, 0xDA, 0x71, 0x48, 0xEA, 0xAC, 0x97, 0x8B, 0x23, 0xD5, 0x49,\n    0xC2, 0x66, 0x1D, 0x62, 0xFC, 0x06, 0x17, 0xA1, 0xEC, 0x71, 0x17, 0xA0, 0x3B, 0xE3, 0xF0, 0xF7,\n    0x0D, 0xCB, 0x84, 0xB6, 0x7C, 0xC0, 0x42, 0x0E, 0xB8, 0xA3, 0x8C, 0x31, 0x4A, 0x9A, 0xAA, 0x97,\n    0xFC, 0x67, 0xB1, 0x75, 0xC6, 0x51, 0xFC, 0x28, 0x69, 0xD0, 0x43, 0x28, 0x54, 0xB9, 0xAE, 0xBE,\n    0x44, 0x7A, 0x18, 0x36, 0x39, 0x26, 0x46, 0x29, 0x33, 0x0E, 0x15, 0xAF, 0x03, 0x21, 0x07, 0x87,\n    0xDE, 0x30, 0xE3, 0xE5, 0xDA, 0x34, 0x81, 0xE5, 0xE2, 0xCD, 0x6B, 0xEE, 0xEF, 0x95, 0xD3, 0x2C,\n    0x7B, 0x31, 0x15, 0x56, 0xB4, 0x77, 0xDA, 0x40, 0xFD, 0x59, 0xB9, 0xDF, 0xEC, 0x39, 0x2B, 0x6C,\n    0x18, 0x7E, 0xCA, 0x99, 0x5E, 0x55, 0xF2, 0x61, 0x45, 0x74, 0x2C, 0x50, 0xB7, 0x42, 0x31, 0xD9,\n    0x58, 0xAE, 0x75, 0x17, 0x4D, 0xFA, 0xF1, 0x18, 0x26, 0x6B, 0x2C, 0xD9, 0xE8, 0x98, 0x75, 0xE7,\n    0x8A, 0xC9, 0x07, 0x63, 0x6D, 0x55, 0xFD, 0xEE, 0x2D, 0x24, 0x4D, 0x0F, 0x11, 0x7C, 0x0B, 0x48,\n    0x99, 0xC0, 0x06, 0x83, 0xC3, 0xF5, 0x90, 0xBD, 0x12, 0xE7, 0xC6, 0x86, 0x16, 0x8A, 0x63, 0xD7,\n    0xF8, 0x1E, 0x54, 0xCD, 0x06, 0x20, 0x4C, 0x5C, 0xC6, 0x15, 0x76, 0x56, 0xE0, 0xE1, 0xDD, 0xE4,\n    0xC1, 0x63, 0x75, 0x53, 0xBC, 0xE1, 0x8C, 0xBF, 0x26, 0x41, 0xF9, 0xA9, 0xCC, 0xEE, 0x69, 0xEA,\n    0x7D, 0x0E, 0x9F, 0xF2, 0x70, 0x0C, 0x4A, 0xD0, 0x2D, 0x17, 0x47, 0xB0, 0x66, 0xD4, 0xDF, 0x9A,\n    0xDC, 0xAD, 0x94, 0xE6, 0x66, 0x3F, 0x0D, 0x57, 0xB3, 0xAD, 0x90, 0xD0, 0xD7, 0x72, 0x3D, 0x1E,\n    0x9C, 0xAF, 0x1A, 0x46, 0x20, 0x8B, 0x48, 0xEA, 0x3A, 0x10, 0x42, 0x32, 0x3D, 0xB9, 0xEB, 0x61,\n    0x47, 0x29, 0x61, 0xED, 0xB6, 0x8C, 0x1D, 0x9E, 0xD4, 0x00, 0x34, 0xD9, 0xAB, 0x16, 0x16, 0x84,\n    0xAF, 0xC5, 0x79, 0x37, 0xE4, 0xC9, 0xBE, 0x91, 0x57, 0x4F, 0xFE, 0x87, 0xF7, 0x47, 0x62, 0x99,\n    0x4F, 0xFA, 0xAE, 0x51, 0x68, 0x1A, 0xE2, 0x90, 0xB5, 0x62, 0x21, 0xE4, 0x06, 0x14, 0x3D, 0xB5,\n    0xC2, 0x34, 0xB0, 0xF3, 0x6B, 0x0D, 0xF7, 0x0F, 0x3C, 0x54, 0xD6, 0x2B, 0xCF, 0xD8, 0xD1, 0x9B,\n    0x54, 0x8B, 0x93, 0xBB, 0x15, 0xF1, 0xC5, 0x9F, 0x24, 0x53, 0x02, 0x94, 0xDE, 0x66, 0x4F, 0x2F,\n    0x77, 0xF6, 0xE4, 0x4C, 0x58, 0x19, 0xBB, 0x08, 0x0A, 0x9B, 0xAC, 0x4C, 0xA5, 0xAC, 0x4A, 0x66,\n    0x72, 0x01, 0x45, 0x41, 0xDA, 0x86, 0xF9, 0x7C, 0x0A, 0x8E, 0xA6, 0xFD, 0x10, 0x18, 0x4F, 0x2F,\n    0xEA, 0x5A, 0xD9, 0x79, 0xD2, 0xD8, 0x3F, 0x02, 0x11, 0x5F, 0x43, 0x79, 0x3A, 0x40, 0x75, 0x6C,\n    0xFC, 0x3A, 0x24, 0xEB, 0xBF, 0xD2, 0xC0, 0xF3, 0xD0, 0xD1, 0x21, 0xA9, 0x84, 0xFB, 0x9D, 0xA3,\n    0xF1, 0x0F, 0x57, 0xAE, 0x99, 0xCB, 0x3B, 0xBC, 0x55, 0x88, 0xE6, 0xE1, 0x7D, 0xC6, 0xDB, 0xA9,\n    0x35, 0x59, 0x11, 0x26, 0x05, 0x0E, 0x8E, 0x5D, 0xBE, 0xF1, 0x32, 0x5A, 0xBF, 0xBE, 0xE8, 0x07,\n    0xB8, 0x80, 0x61, 0x70, 0xEA, 0x8C, 0x05, 0xC0, 0x4D, 0xBF, 0xE9, 0x63, 0xA1, 0x11, 0xFC, 0x0A,\n    0x4B, 0x6D, 0x03, 0x11, 0x86, 0x7A, 0x69, 0x49, 0x15, 0xDA, 0x23, 0x67, 0xC5, 0x51, 0x3A, 0x5A,\n    0xAD, 0xCA, 0xAC, 0xF7, 0xD7, 0x6C, 0x0E, 0x2D, 0xC5, 0x88, 0xD9, 0x95, 0x48, 0x58, 0x70, 0x37,\n    0xBE, 0x8E, 0xBC, 0xF6, 0x14, 0x4C, 0xA0, 0x13, 0x9C, 0x8D, 0x58, 0x9F, 0x02, 0xAB, 0x65, 0xCA,\n    0x66, 0x73, 0x84, 0x3B, 0xC6, 0xD5, 0x43, 0x9E, 0x1C, 0xCE, 0xA0, 0x00, 0x59, 0xEC, 0x4A, 0xC0,\n    0x9D, 0x31, 0x5A, 0xB2, 0x0A, 0x86, 0x23, 0x2A, 0xCD, 0xCF, 0x18, 0x96, 0xE2, 0xE5, 0xFF, 0x36,\n    0xBC, 0x66, 0x8A, 0xA7, 0x8A, 0xE0, 0xF4, 0x06, 0x39, 0x7C, 0xCF, 0x21, 0xEE, 0x17, 0x39, 0x87,\n    0x74, 0xA0, 0x73, 0x38, 0xA9, 0x90, 0x6C, 0xC2, 0x1B, 0xF0, 0x69, 0xD8, 0xBF, 0x6E, 0x44, 0x6F,\n    0x77, 0x75, 0x1E, 0x45, 0xB5, 0x65, 0xAD, 0xDF, 0x56, 0x66, 0xFD, 0xA0, 0x59, 0x85, 0xC5, 0x06,\n    0x0C, 0xBF, 0xD5, 0x17, 0xA1, 0x48, 0x99, 0x63, 0xEE, 0xF0, 0x7D, 0xAE, 0x3A, 0x7C, 0x6A, 0x7C,\n    0xB4, 0xDA, 0xDB, 0x1A, 0xED, 0x70, 0xF9, 0x4D, 0xD2, 0xA4, 0x09, 0xE4, 0xFA, 0x4B, 0x95, 0xDD,\n    0x95, 0x7B, 0x3D, 0xD1, 0x52, 0xDB, 0x59, 0x68, 0xFF, 0xE5, 0x13, 0x39, 0xE5, 0x01, 0x12, 0x7F,\n    0x9A, 0x0E, 0xFF, 0x35, 0x75, 0x6A, 0x56, 0xEA, 0x66, 0x91, 0xF7, 0x3E, 0x71, 0x86, 0x6C, 0xC3,\n    0x11, 0x1B, 0x04, 0x4C, 0x98, 0x13, 0xA1, 0x35, 0x23, 0x96, 0xC9, 0x8C, 0xFB, 0x43, 0x96, 0x4B,\n    0xC0, 0x1F, 0x30, 0x95, 0xAA, 0x8B, 0x27, 0x16, 0x6C, 0x91, 0x0D, 0x62, 0xAB, 0x87, 0x1A, 0xDA,\n    0x61, 0xB1, 0x2E, 0xBC, 0x19, 0xA8, 0xF0, 0x32, 0xD7, 0x06, 0x6F, 0x82, 0xFD, 0x5F, 0xF1, 0x08,\n    0x5E, 0x97, 0x83, 0xEF, 0xB0, 0x91, 0xC2, 0xE6, 0x37, 0x47, 0xFC, 0xD1, 0xE7, 0x6C, 0xC1, 0x1A,\n    0xAF, 0x91, 0xDF, 0x5C, 0x2D, 0x1B, 0xBC, 0x6A, 0x10, 0xAC, 0xAE, 0x2C, 0x34, 0xCD, 0xD2, 0x6B,\n    0x15, 0x07, 0xEA, 0xD0, 0x6C, 0x3E, 0x19, 0x14, 0xEF, 0x35, 0xA4, 0x2B, 0x17, 0xF8, 0x2F, 0x48,\n    0x0D, 0x5C, 0x70, 0xE2, 0xFF, 0x94, 0x2B, 0x59, 0x3C, 0xDE, 0x2F, 0x14, 0x84, 0x5F, 0x0F, 0xF3,\n    0xA0, 0xFC, 0x40, 0xBE, 0xFA, 0xAE, 0x97, 0xC7, 0xC6, 0xF3, 0xB5, 0xC2, 0x50, 0xBB, 0xA3, 0xB8,\n    0xC1, 0x7D, 0x6B, 0xE9, 0x87, 0x98, 0x8B, 0xBE, 0x19, 0xA5, 0xAC, 0xB1, 0x8D, 0x6C, 0x67, 0x94,\n    0x95, 0x7C, 0x60, 0xCC, 0x0B, 0x75, 0x24, 0xB9, 0x54, 0x7D, 0xD4, 0x4D, 0x9B, 0xF2, 0xA6, 0xFB,\n    0xC0, 0x78, 0x38, 0x90, 0x19, 0x5A, 0x62, 0x85, 0x3A, 0x34, 0xD8, 0xCD, 0xA1, 0xA5, 0xD9, 0xC0,\n    0xC5, 0xB3, 0x6E, 0x26, 0x13, 0xCF, 0x7C, 0xC1, 0x50, 0x6D, 0x80, 0xCE, 0xF9, 0xA7, 0xFE, 0x2F,\n    0x14, 0x53, 0x03, 0x0E, 0xFE, 0xB4, 0xA2, 0x75, 0x0A, 0xB4, 0xD9, 0xDB, 0xEA, 0xBC, 0xF1, 0xB0,\n    0x8E, 0xE5, 0x33, 0x49, 0x16, 0xCD, 0x3B, 0x7C, 0x3B, 0x31, 0x51, 0x8D, 0xF2, 0x12, 0xDB, 0x09,\n    0xA7, 0x06, 0x7E, 0x66, 0x09, 0x77, 0xA2, 0x3E, 0xB9, 0xA2, 0xA2, 0xEE, 0xFB, 0x9E, 0x84, 0xF1,\n    0x77, 0x28, 0xB1, 0x02, 0xF4, 0xE9, 0x74, 0x56, 0x3D, 0x6F, 0x83, 0x2F, 0xDE, 0x50, 0x4F, 0xAA,\n    0x2C, 0xC9, 0x8A, 0x71, 0x45, 0xE1, 0x79, 0x4D, 0x9B, 0xC0, 0xC0, 0x8B, 0x33, 0x7D, 0x3F, 0x07,\n    0x2B, 0x4C, 0x16, 0x4F, 0xD1, 0xFB, 0x28, 0xB8, 0x7B, 0xF2, 0x4F, 0xA8, 0x56, 0x84, 0xDF, 0x61,\n    0xEC, 0x1F, 0x4D, 0x95, 0xC5, 0xD7, 0x90, 0x4D, 0x38, 0x35, 0xE5, 0x96, 0xBA, 0x6D, 0x31, 0xAE,\n    0xE7, 0xAC, 0xE6, 0xDD, 0x05, 0x5E, 0xD4, 0xF5, 0x47, 0x5B, 0xEA, 0xA3, 0x36, 0x7C, 0x58, 0x04,\n    0x41, 0x3C, 0xEC, 0xC6, 0x70, 0x59, 0xEC, 0x4D, 0xE3, 0x80, 0x59, 0x6D, 0xA1, 0x3A, 0x31, 0xA1,\n    0x50, 0xB7, 0x10, 0xC0, 0xC4, 0x47, 0x87, 0xAB, 0xEA, 0x4B, 0xFD, 0xF6, 0x5C, 0xA8, 0x62, 0x40,\n    0x3E, 0x89, 0x1D, 0xE1, 0x9B, 0x04, 0x1F, 0x22, 0x2B, 0xAF, 0x0B, 0xFC, 0xD1, 0x64, 0x4B, 0xCE,\n    0xC4, 0xF9, 0x19, 0xF4, 0x21, 0x95, 0xBA, 0xC0, 0x77, 0x4B, 0xFC, 0x15, 0xC7, 0x6F, 0xF7, 0x70,\n    0x8E, 0xE2, 0xDF, 0xFE, 0x48, 0xA9, 0x17, 0xA2, 0xAB, 0xA5, 0xFC, 0x2A, 0x72, 0x08, 0xFF, 0xBC,\n    0x56, 0xFC, 0xAF, 0xFF, 0x47, 0xEC, 0xCE, 0x29, 0x17, 0xAE, 0x2D, 0xB3, 0xB3, 0x5F, 0x93, 0x9D,\n    0x57, 0x2A, 0xF4, 0xDE, 0xDD, 0xE4, 0xE6, 0x43, 0x73, 0xCA, 0x00, 0x16, 0xB8, 0xD7, 0x15, 0x67,\n    0xEB, 0x33, 0x6C, 0xCE, 0x0C, 0xFA, 0x8F, 0xF1, 0x08, 0x6E, 0xC0, 0x3F, 0xAF, 0x30, 0x9F, 0x2A,\n    0x98, 0x4C, 0x03, 0x1C, 0x88, 0x7D, 0xBF, 0x7A, 0xB1, 0xAE, 0x51, 0x69, 0x6D, 0xE9, 0x67, 0x8F,\n    0x73, 0x3A, 0xB9, 0x58, 0x9B, 0xB0, 0xE6, 0x14, 0xB2, 0x04, 0x57, 0x85, 0x6E, 0x09, 0x84, 0x53,\n    0x1F, 0x6D, 0xAA, 0xD1, 0x42, 0xCA, 0xFA, 0x8D, 0xB5, 0xAA, 0xD6, 0xDC, 0x9A, 0xC1, 0x90, 0x69,\n    0x5A, 0xB7, 0xB8, 0x75, 0xD4, 0xD8, 0x5E, 0x2B, 0x5E, 0xB5, 0x73, 0x4B, 0x42, 0x2D, 0x5C, 0x4C,\n    0x58, 0x9E, 0xF1, 0xE0, 0x18, 0x51, 0x5B, 0x68, 0xEA, 0x4E, 0x92, 0x98, 0x62, 0x6C, 0xF8, 0x68,\n    0xA8, 0x92, 0x48, 0x8E, 0x2B, 0x11, 0xC7, 0xC5, 0x8E, 0x3A, 0x3C, 0xFF, 0xB3, 0x93, 0x32, 0xA8,\n    0x55, 0x94, 0x0E, 0xA1, 0x78, 0x7E, 0x3D, 0xD2, 0xF0, 0xA2, 0x27, 0x1B, 0x8F, 0x14, 0x73, 0x0B,\n    0xE7, 0xC9, 0xBE, 0xE5, 0x49, 0xCF, 0x26, 0xE2, 0xC0, 0x5E, 0x51, 0xE5, 0xAC, 0x32, 0x45, 0x37,\n    0x6A, 0x4C, 0xF9, 0xCC, 0x6C, 0x0A, 0x0B, 0xEE, 0x1C, 0x5B, 0x7D, 0xE8, 0xDF, 0x83, 0x96, 0x0E,\n    0x7D, 0x6E, 0x87, 0x2D, 0x4A, 0xA8, 0x00, 0x7C, 0xE9, 0xE2, 0x1A, 0xE7, 0x9E, 0x9D, 0x09, 0x99,\n    0xA5, 0xB6, 0x46, 0x4D, 0xDE, 0xD7, 0xA9, 0x9B, 0x13, 0xA5, 0xC9, 0xB1, 0x6E, 0xDC, 0xF6, 0x42,\n    0x20, 0x08, 0x86, 0xFE, 0x8A, 0x3E, 0x42, 0x42, 0x33, 0x0B, 0x54, 0xD1, 0xB9, 0x97, 0x86, 0x03,\n    0xC9, 0xA7, 0x20, 0x0B, 0x09, 0x46, 0x0C, 0xCF, 0x6B, 0x7B, 0x74, 0x95, 0xFE, 0xC0, 0x24, 0x8D,\n    0x12, 0xBD, 0xC9, 0x60, 0x48, 0x2F, 0x02, 0x77, 0x5C, 0x5F, 0x86, 0xA9, 0x39, 0xB3, 0x7C, 0x77,\n    0x10, 0xCE, 0xE9, 0xB4, 0x61, 0x63, 0x63, 0x39, 0x86, 0x89, 0x97, 0x4A, 0xD3, 0x16, 0x51, 0x1F,\n    0x8E, 0xFC, 0xF0, 0x51, 0xF4, 0x5D, 0x62, 0x73, 0xF3, 0x47, 0x82, 0x04, 0xF0, 0xD8, 0xD8, 0xD5,\n    0x16, 0x63, 0x96, 0xBE, 0xF5, 0xB5, 0x4A, 0x70, 0xCB, 0x8B, 0x23, 0xF5, 0xB0, 0xEE, 0x0F, 0xFA,\n    0xC7, 0x9A, 0xA5, 0xB1, 0x6B, 0x39, 0x53, 0x90, 0xAF, 0xF8, 0x9F, 0xCC, 0x99, 0xE4, 0x65, 0x7A,\n    0x69, 0xBD, 0x2B, 0x1F, 0x27, 0x3F, 0x87, 0x69, 0x2D, 0x1E, 0x9F, 0xC2, 0x96, 0xE9, 0x64, 0xEC,\n    0xF8, 0x34, 0x30, 0xA1, 0xC3, 0xAF, 0x77, 0x55, 0x42, 0x30, 0xA7, 0x8E, 0x35, 0x12, 0xBF, 0x1C,\n    0xA3, 0x1F, 0x74, 0x43, 0x41, 0xD5, 0x35, 0xC9, 0x02, 0x6E, 0xB9, 0x3C, 0x12, 0x6D, 0x23, 0x3B,\n    0xD6, 0xCB, 0x2D, 0x01, 0xCA, 0x96, 0xCB, 0x36, 0xCD, 0x65, 0x81, 0x04, 0xDA, 0x83, 0xB2, 0x8E,\n    0x32, 0xB7, 0x85, 0xAE, 0x7F, 0xC2, 0x2F, 0x05, 0xFE, 0x0C, 0x29, 0x9D, 0x21, 0x8D, 0x9E, 0xED,\n    0x9A, 0x45, 0xCD, 0xD6, 0xC1, 0xC5, 0x22, 0xAF, 0x4B, 0xFD, 0xED, 0xEE, 0x34, 0xA4, 0xD7, 0x51,\n    0xFE, 0x05, 0x20, 0xE0, 0x25, 0xBF, 0x4D, 0xCE, 0xCE, 0x8B, 0xC6, 0xBA, 0xF2, 0x8C, 0x13, 0xF2,\n    0xA5, 0x50, 0xC9, 0xC7, 0x69, 0x64, 0xA7, 0x9F, 0x42, 0xD4, 0x82, 0xA8, 0x1A, 0x65, 0x36, 0xBD,\n    0xF8, 0x42, 0x98, 0x41, 0x76, 0x32, 0x34, 0x19, 0x1C, 0xC9, 0x3E, 0x08, 0x43, 0xB2, 0x1F, 0xE4,\n    0x3B, 0x17, 0x75, 0x8F, 0x6A, 0x66, 0xFA, 0xF0, 0x63, 0xC5, 0xA0, 0x96, 0x0B, 0x9C, 0xB8, 0xA1,\n    0x76, 0xDE, 0xEC, 0xB2, 0x8B, 0x28, 0xC0, 0xAC, 0x99, 0x7E, 0x4B, 0x36, 0x50, 0xD1, 0xBC, 0xE6,\n    0xBA, 0xEE, 0x8B, 0x4C, 0x5A, 0xD7, 0xD4, 0x59, 0x4B, 0xE2, 0x96, 0xC5, 0x29, 0xFC, 0xE2, 0x22,\n    0xE1, 0x90, 0x64, 0x4F, 0xBA, 0x52, 0x20, 0x11, 0x96, 0x5B, 0x1D, 0x92, 0xC9, 0x6F, 0x32, 0x8E,\n    0x2D, 0x21, 0xEC, 0xA0, 0xDE, 0x49, 0xBA, 0x44, 0xB7, 0x86, 0xCE, 0xA8, 0x5D, 0xB0, 0xB2, 0x80,\n    0x14, 0x64, 0x2E, 0xA0, 0x3D, 0xB2, 0x17, 0xE2, 0xD3, 0x83, 0x09, 0x30, 0x26, 0x32, 0x90, 0x8D,\n    0x41, 0x1F, 0x18, 0x47, 0xC0, 0xC2, 0x35, 0x47, 0xA1, 0xE5, 0x83, 0x68, 0x96, 0x4E, 0x84, 0x9C,\n    0x2F, 0x0E, 0x64, 0xBA, 0x07, 0x18, 0x50, 0xFE, 0x1B, 0xF2, 0xD7, 0xED, 0x05, 0x3A, 0x1A, 0xE8,\n    0xC9, 0x89, 0xCE, 0xC0, 0x45, 0x19, 0xB4, 0x3F, 0x98, 0x08, 0xAB, 0x2D, 0x32, 0xE8, 0x36, 0x58,\n    0x14, 0xBA, 0xF1, 0x28, 0x37, 0x4D, 0xA0, 0x51, 0x53, 0xA6, 0xAE, 0xDA, 0x5D, 0xF0, 0xEC, 0x51,\n    0xDA, 0x22, 0xDB, 0xEB, 0x6A, 0x79, 0xC6, 0x63, 0x3B, 0x03, 0x1A, 0xF7, 0x8F, 0x87, 0xBB, 0x7B,\n    0x85, 0x56, 0x5E, 0x99, 0xCD, 0xFA, 0x4A, 0x6C, 0x13, 0xCF, 0x55, 0x8E, 0x90, 0xE7, 0xB1, 0x6B,\n    0x73, 0xF3, 0x44, 0xAF, 0xDB, 0x05, 0xAB, 0x6B, 0xEF, 0x34, 0x56, 0xF8, 0xAC, 0x76, 0xC4, 0xD0,\n    0xF7, 0xE9, 0x12, 0xF6, 0xF1, 0x7B, 0xB9, 0x27, 0x4D, 0xF6, 0xBF, 0x3A, 0xC9, 0x25, 0xD1, 0x08,\n    0xF0, 0xE1, 0x0F, 0xF0, 0x0E, 0x1D, 0xBC, 0x31, 0x09, 0x2A, 0x58, 0x37, 0xC1, 0x25, 0x45, 0x7E,\n    0x9D, 0x15, 0xEA, 0x53, 0x8B, 0xE9, 0x27, 0x7C, 0xB1, 0xEC, 0x0A, 0xC0, 0x36, 0x64, 0xBB, 0xC3,\n    0x2F, 0xB7, 0xD3, 0x95, 0x24, 0x7D, 0xEA, 0x35, 0x42, 0xDF, 0x48, 0xF5, 0x23, 0x2E, 0xF1, 0x7F,\n    0xE8, 0x4A, 0x4E, 0x7B, 0x38, 0xB5, 0xD8, 0x13, 0xE4, 0x73, 0x31, 0x50, 0x9D, 0x21, 0xE1, 0xD9,\n    0xDC, 0xF5, 0x87, 0x6F, 0xC1, 0xBC, 0x9F, 0xF5, 0x1A, 0xEB, 0x61, 0x92, 0xD8, 0x10, 0x88, 0x2B,\n    0xC7, 0x48, 0x3E, 0xC6, 0x2E, 0x9B, 0xF4, 0x20, 0x4D, 0x10, 0x5C, 0x45, 0xA2, 0x82, 0x87, 0xBE,\n    0x96, 0x54, 0xEA, 0xE7, 0x53, 0xDC, 0x35, 0x36, 0xAD, 0x48, 0x98, 0xD8, 0xD2, 0x37, 0x0A, 0x82,\n    0xF7, 0x55, 0x8C, 0x28, 0x01, 0x68, 0x9C, 0x8E, 0xE0, 0x44, 0x2A, 0xD5, 0x09, 0x95, 0x8F, 0x2D,\n    0xD7, 0xE7, 0x26, 0xB9, 0xDC, 0x7D, 0x00, 0x0B, 0x5A, 0xDB, 0x30, 0xDC, 0x58, 0x3F, 0x53, 0x6D,\n    0x14, 0xBA, 0x5C, 0x4B, 0x3E, 0xB1, 0x7F, 0x3C, 0xF8, 0x2E, 0x49, 0xB3, 0x7F, 0x05, 0x44, 0xC6,\n    0x44, 0x5D, 0x83, 0xFC, 0xD7, 0x15, 0x3F, 0xA3, 0x55, 0x60, 0x15, 0x13, 0x38, 0xBD, 0x9C, 0x3B,\n    0xFE, 0xF3, 0x68, 0x06, 0xD8, 0xF1, 0x7C, 0x19, 0xB4, 0x01, 0xAB, 0x5C, 0x81, 0xBC, 0x69, 0xAD,\n    0xF5, 0xB2, 0xF6, 0x58, 0xFB, 0x03, 0xE3, 0x79, 0xE5, 0xC3, 0x63, 0xDB, 0x23, 0xA5, 0xD8, 0xE9,\n    0x32, 0xCE, 0xA0, 0x56, 0xD6, 0xFD, 0x53, 0xA0, 0xA5, 0xB4, 0x1D, 0xE9, 0x44, 0x19, 0x27, 0xEE,\n    0x3C, 0xE7, 0x5D, 0x11, 0x14, 0x7B, 0x56, 0xEA, 0x16, 0xB8, 0x2A, 0x4B, 0x7E, 0x7C, 0x6D, 0x7D,\n    0xD1, 0x8F, 0x72, 0xFB, 0x75, 0x8F, 0x12, 0x5C, 0x6D, 0x1C, 0xBF, 0x40, 0xD7, 0x8E, 0x30, 0x09,\n    0xAB, 0xAE, 0xB3, 0x7D, 0x34, 0x23, 0xCD, 0xA8, 0x69, 0xB7, 0xD7, 0x78, 0x75, 0x14, 0x82, 0xD5,\n    0x36, 0x12, 0x9B, 0x70, 0x3E, 0x94, 0xE7, 0xA5, 0x2E, 0xF4, 0x44, 0x48, 0x82, 0x47, 0xCF, 0xE9,\n    0xA1, 0x21, 0x28, 0x60, 0x4C, 0x60, 0x4A, 0xDB, 0xC6, 0x25, 0x0B, 0xF3, 0x5B, 0x5C, 0x34, 0x7B,\n    0x6B, 0x8F, 0x1D, 0x6C, 0xCD, 0xA5, 0x03, 0x62, 0x24, 0xB5, 0x4E, 0x8F, 0x1B, 0x80, 0x61, 0x19,\n    0x52, 0x95, 0xC8, 0x46, 0xEF, 0x57, 0xB6, 0x8F, 0x0C, 0xE3, 0xA1, 0xD6, 0x08, 0x16, 0xC8, 0x20,\n    0x3C, 0x13, 0x93, 0x42, 0xDE, 0xE4, 0xE2, 0x28, 0xAC, 0x62, 0xA4, 0xCC, 0x28, 0x83, 0xB0, 0xF9,\n    0xEB, 0xD8, 0x51, 0xA9, 0x13, 0x3C, 0x53, 0x73, 0x7A, 0x9D, 0xB5, 0xC4, 0xFA, 0xC8, 0x0D, 0xB8,\n    0x66, 0x15, 0x8E, 0x65, 0x79, 0x08, 0xC9, 0x6E, 0x65, 0xC5, 0x09, 0x9B, 0x20, 0x7D, 0xC0, 0xBE,\n    0xCC, 0xC3, 0x60, 0xA5, 0x10, 0xBD, 0xC9, 0x50, 0xCE, 0xE2, 0xAF, 0x16, 0xD7, 0xE0, 0xAC, 0x17,\n    0x78, 0x35, 0x2A, 0x0A, 0xAF, 0x4C, 0x2C, 0x78, 0x78, 0x3E, 0xF4, 0x7A, 0xB2, 0x63, 0xD4, 0xBD,\n    0x4B, 0xC2, 0x8C, 0x0C, 0x5C, 0x57, 0xBA, 0x90, 0x5C, 0x2D, 0xDB, 0x79, 0xCE, 0x4B, 0x83, 0xB6,\n    0x3C, 0xB0, 0x7B, 0xFA, 0x7B, 0x05, 0xAD, 0x0B, 0xA0, 0xF5, 0xBD, 0x24, 0x42, 0x69, 0x2D, 0xE4,\n    0x9B, 0x67, 0xB9, 0xBD, 0x6E, 0x18, 0x61, 0xE6, 0x30, 0x62, 0x01, 0xBB, 0x88, 0xB6, 0xC2, 0x6A,\n    0x09, 0x87, 0x2C, 0xB9, 0xC6, 0x11, 0x54, 0xC5, 0x19, 0xA3, 0xBC, 0x54, 0xDD, 0x2C, 0x13, 0xDD,\n    0xA1, 0xD2, 0x4D, 0x79, 0x2A, 0xE0, 0x89, 0xB0, 0x3B, 0xC1, 0xF4, 0xB8, 0xCC, 0x7A, 0xF8, 0x90,\n    0xC2, 0xEF, 0x2F, 0x1E, 0xEC, 0xBB, 0xDC, 0x8A, 0x82, 0x9E, 0x94, 0x04, 0x30, 0x1E, 0x33, 0x66,\n    0x8F, 0x22, 0x47, 0xE4, 0x80, 0x6A, 0x70, 0x87, 0x47, 0x95, 0x5D, 0x7F, 0x10, 0x66, 0x7D, 0x94,\n    0xDB, 0xB2, 0xD2, 0xA6, 0x10, 0xE0, 0xBE, 0x01, 0xB2, 0x5A, 0xB2, 0x66, 0x01, 0xA2, 0xA1, 0x4E,\n    0xB5, 0xD5, 0xBE, 0x52, 0x88, 0x11, 0xB0, 0x45, 0xB6, 0xA4, 0x0B, 0xEE, 0x50, 0x45, 0x0C, 0x9D,\n    0x3F, 0xA3, 0x4C, 0xEC, 0x63, 0x6D, 0x99, 0x6C, 0x30, 0x7F, 0xB1, 0x27, 0x38, 0xB7, 0xBC, 0x41,\n    0x49, 0x08, 0x7E, 0xBE, 0x84, 0x9C, 0x3C, 0x5C, 0xBA, 0x19, 0xA3, 0x00, 0xB1, 0x1F, 0xD4, 0x1B,\n    0x80, 0x9D, 0xA2, 0xFC, 0xCA, 0x70, 0xFF, 0x15, 0x02, 0x60, 0x69, 0x12, 0x64, 0x40, 0x1D, 0xF1,\n    0x65, 0x12, 0x52, 0x64, 0x3A, 0xAC, 0x44, 0xE2, 0x9D, 0xE3, 0x8C, 0x50, 0xD5, 0x59, 0x7E, 0x1A,\n    0xE0, 0x26, 0x72, 0xB5, 0x52, 0xB4, 0x79, 0xB9, 0x93, 0x41, 0xA2, 0xC9, 0x5D, 0x9E, 0x65, 0x70,\n    0x83, 0x2D, 0x3A, 0x93, 0xE4, 0xDE, 0xC3, 0x40, 0x35, 0xA2, 0x86, 0x3D, 0x9D, 0x0A, 0x9E, 0x11,\n    0xEA, 0x81, 0xDB, 0x3B, 0x99, 0xCB, 0x46, 0xD3, 0x6B, 0x49, 0xB6, 0xDA, 0xE8, 0xF1, 0xB5, 0xA4,\n    0x52, 0x15, 0x39, 0xAE, 0xBF, 0xA7, 0xDB, 0xEE, 0xDF, 0x41, 0x24, 0x98, 0xED, 0xF3, 0x0D, 0x12,\n    0xBE, 0x59, 0x4E, 0x09, 0xF8, 0x50, 0xDE, 0xE2, 0x36, 0x9A, 0x12, 0xC4, 0x12, 0xF2, 0xF1, 0xF8,\n    0x58, 0xC8, 0x86, 0x14, 0xE1, 0x39, 0x3B, 0x9A, 0xFB, 0x46, 0x7B, 0x98, 0x0D, 0x26, 0xBC, 0xA3,\n    0x54, 0xEA, 0x01, 0x72, 0x68, 0x73, 0x2F, 0xD5, 0x08, 0x3B, 0xF3, 0x7B, 0x7A, 0x9F, 0xDB, 0x29,\n    0x11, 0x3B, 0xF0, 0x07, 0x4C, 0x46, 0x10, 0xDF, 0xA0, 0x9D, 0x0A, 0xD8, 0x08, 0x1A, 0x7B, 0xD1,\n    0xE1, 0x9A, 0x83, 0x77, 0x1A, 0x2F, 0x1A, 0x16, 0x77, 0x22, 0x75, 0x98, 0xED, 0x70, 0x40, 0x54,\n    0x9A, 0x15, 0x56, 0x32, 0x93, 0xC9, 0xA2, 0xD1, 0x48, 0x54, 0x8F, 0xEF, 0x07, 0x43, 0x4D, 0x9E,\n    0xC7, 0x07, 0x32, 0x6C, 0x6E, 0xAC, 0x79, 0x8C, 0x6E, 0x1A, 0x48, 0x99, 0xBC, 0x6A, 0x0D, 0x19,\n    0x47, 0x5B, 0x1C, 0x3E, 0x18, 0xCA, 0x54, 0x6A, 0x7F, 0xA4, 0xAB, 0xD3, 0x2B, 0x86, 0xD1, 0x1B,\n    0x32, 0xCB, 0x8C, 0x12, 0x1C, 0x0D, 0x28, 0x52, 0xD1, 0x02, 0x47, 0x22, 0xD2, 0xD4, 0x79, 0xDD,\n    0xB9, 0x8C, 0x49, 0xD0, 0x26, 0x94, 0xAE, 0x0E, 0xC1, 0xA3, 0x27, 0x6F, 0x87, 0x5D, 0x30, 0xED,\n    0xFB, 0x30, 0x13, 0x23, 0x9C, 0xC3, 0x10, 0x5D, 0x8F, 0x8A, 0x9D, 0xD8, 0x91, 0xC2, 0xA5, 0x70,\n    0x8C, 0xC4, 0x56, 0xD0, 0x43, 0xE7, 0xAB, 0x40, 0xD4, 0x8F, 0xBE, 0x1B, 0xE4, 0xD5, 0xD2, 0xC5,\n    0x83, 0x8C, 0x27, 0xE9, 0x3B, 0x4F, 0xDB, 0xF4, 0x79, 0xCA, 0x91, 0x89, 0xF3, 0x78, 0xEB, 0x40,\n    0x25, 0x80, 0x73, 0xB6, 0x49, 0x8F, 0x76, 0x74, 0x70, 0xD4, 0x70, 0xDC, 0x77, 0x2F, 0xDD, 0xC2,\n    0x1B, 0x12, 0xB1, 0xA1, 0x3F, 0xC5, 0xAC, 0x70, 0x22, 0x1F, 0xB4, 0x8E, 0x36, 0xC2, 0x5E, 0x93,\n    0x51, 0x42, 0x93, 0xEB, 0x26, 0x13, 0xDC, 0x38, 0x03, 0x68, 0xF6, 0xE1, 0x77, 0x3C, 0x81, 0x07,\n    0xD4, 0x55, 0x70, 0x56, 0x25, 0x0A, 0x08, 0x36, 0x6F, 0x99, 0xFE, 0x12, 0xDC, 0xA1, 0x35, 0x19,\n    0x30, 0xAA, 0x84, 0xB5, 0xE6, 0xF6, 0x23, 0x81, 0xC4, 0x7D, 0x95, 0x35, 0x4C, 0xD5, 0xFA, 0x12,\n    0xB4, 0x09, 0x20, 0x00, 0x5C, 0x15, 0xB2, 0xDD, 0x8B, 0x77, 0x2F, 0x97, 0xDD, 0xFD, 0x4E, 0xEF,\n    0x20, 0x3F, 0x0F, 0x0C, 0xA6, 0xE3, 0x40, 0x12, 0xA3, 0xD1, 0x18, 0x0F, 0x88, 0x16, 0x97, 0x48,\n    0x6B, 0x76, 0x10, 0xE8, 0x4A, 0x91, 0xA4, 0x9C, 0x05, 0x88, 0xA8, 0xC7, 0x2B, 0x3A, 0xAB, 0x87,\n    0xE1, 0x51, 0x21, 0xE5, 0x7B, 0xD4, 0x78, 0xB7, 0x4C, 0x35, 0x7C, 0x0A, 0x27, 0x63, 0xA8, 0x15,\n    0xCF, 0xB8, 0xEE, 0x00, 0x5C, 0xD5, 0x9F, 0x40, 0x5B, 0x8A, 0xEC, 0xA3, 0xFA, 0x64, 0x73, 0xE2,\n    0x8E, 0x5E, 0x1F, 0x69, 0x0C, 0xD4, 0x0A, 0x95, 0x2E, 0x62, 0xD6, 0xB1, 0x7B, 0x51, 0x3E, 0x54,\n    0x7C, 0x51, 0x00, 0xF2, 0xF0, 0x49, 0xD2, 0xB2, 0x13, 0xF6, 0x1E, 0x37, 0xC4, 0xE8, 0x2A, 0xC2,\n    0x5D, 0x50, 0xCE, 0x31, 0xDD, 0x4F, 0x5E, 0x94, 0x8A, 0x33, 0xF3, 0x52, 0xDC, 0x9E, 0xBE, 0x1B,\n    0xE9, 0xA2, 0x97, 0xF4, 0x4A, 0xC0, 0xCA, 0x26, 0x24, 0x2B, 0x94, 0xA3, 0xBF, 0x41, 0xD5, 0x1E,\n    0x06, 0xFC, 0x74, 0x34, 0xCA, 0x2A, 0x61, 0x3C, 0xB2, 0x22, 0xD9, 0x24, 0xF9, 0x8C, 0x37, 0x3E,\n    0x48, 0x1D, 0xAA, 0xBE, 0x9F, 0x0F, 0x93, 0x14, 0x94, 0x3A, 0x44, 0x7F, 0x47, 0x7A, 0x1D, 0x07,\n    0x33, 0x4F, 0x86, 0x39, 0xF3, 0xD5, 0x23, 0xAF, 0x83, 0xF0, 0xCC, 0xFA, 0xDA, 0x86, 0x5F, 0x6B,\n    0x28, 0x77, 0xF2, 0x28, 0x78, 0xFF, 0x7B, 0xB9, 0xB9, 0x9B, 0xF7, 0x45, 0x46, 0x86, 0x12, 0xED,\n    0xB0, 0x93, 0x89, 0x7B, 0xFF, 0xE8, 0x93, 0xB7, 0xAD, 0x08, 0xBC, 0xB2, 0xE9, 0x53, 0xFB, 0x78,\n    0xD6, 0xAD, 0xB3, 0x0D, 0x9F, 0xEC, 0x97, 0x49, 0xA6, 0x43, 0xAB, 0xBE, 0x5E, 0xF9, 0x9D, 0xA0,\n    0xAE, 0x1D, 0x7C, 0x05, 0xB7, 0x2B, 0x60, 0x3A, 0x61, 0xE3, 0x69, 0xA8, 0xBA, 0x6F, 0xD5, 0x9E,\n    0x23, 0x8E, 0x0C, 0x99, 0x03, 0x24, 0xE9, 0xDC, 0x52, 0xC5, 0x74, 0xE9, 0x14, 0x1F, 0x71, 0x5C,\n    0x91, 0x61, 0x6D, 0x2F, 0xB2, 0xA8, 0xCE, 0x88, 0xBE, 0x8E, 0x73, 0x44, 0xF4, 0x53, 0x9B, 0x19,\n    0x0A, 0xEC, 0xBE, 0x54, 0xF6, 0x31, 0x00, 0x91, 0xE9, 0x39, 0x72, 0x0E, 0x07, 0x6A, 0xE9, 0x46,\n    0x5E, 0xF8, 0xF8, 0x3B, 0x30, 0x60, 0x8E, 0xD0, 0xBC, 0x05, 0x1E, 0xF5, 0xEE, 0x33, 0x6A, 0xFA,\n    0x54, 0xCD, 0x4E, 0x8B, 0xCF, 0xEC, 0xD9, 0x9F, 0x53, 0x3A, 0xEF, 0x21, 0xC3, 0x6F, 0x09, 0xF8,\n    0x67, 0xFD, 0x3E, 0x70, 0xE6, 0x6F, 0x63, 0x99, 0xE5, 0x4F, 0xD6, 0x70, 0xED, 0xFB, 0x3B, 0xD9,\n    0xFF, 0xAA, 0x30, 0x5C, 0xBE, 0xB2, 0x28, 0x78, 0xE4, 0xB5, 0x26, 0x82, 0x03, 0x86, 0xB9, 0xDB,\n    0x9D, 0xBD, 0x99, 0xD8, 0xF2, 0x70, 0x9C, 0x9D, 0x6C, 0x81, 0xFC, 0xF8, 0x2B, 0x5E, 0xD4, 0x85,\n    0x95, 0x62, 0xEB, 0xFA, 0xEB, 0x5A, 0x09, 0xC6, 0x14, 0x51, 0xE2, 0x43, 0x62, 0xE9, 0x69, 0x31,\n    0xB1, 0x7B, 0x8F, 0xA6, 0x4D, 0x76, 0xD5, 0x8C, 0xF1, 0xB2, 0xD5, 0x07, 0x17, 0x21, 0x64, 0x23,\n    0xCA, 0x68, 0xF8, 0x60, 0xFF, 0x15, 0x7D, 0xB8, 0xCE, 0xBA, 0xF3, 0x92, 0x77, 0x04, 0x2F, 0x38,\n    0x99, 0x1A, 0xF7, 0x91, 0xC9, 0x0C, 0x99, 0x0F, 0x3A, 0x58, 0x7D, 0x31, 0x01, 0xCB, 0x10, 0xBD,\n    0xC0, 0xAD, 0x4D, 0x37, 0x6C, 0x87, 0x3E, 0x9B, 0x4B, 0xE2, 0x68, 0x72, 0x8C, 0x40, 0xED, 0x6F,\n    0xD6, 0xC1, 0x8B, 0xA0, 0x82, 0xA7, 0x72, 0x73, 0x79, 0x8A, 0xC9, 0xFB, 0x57, 0xEE, 0xFA, 0x5D,\n    0x15, 0x53, 0x2F, 0x81, 0x66, 0x7E, 0xC1, 0x4E, 0xEF, 0x23, 0xC2, 0xB5, 0x76, 0x61, 0xC1, 0xAC,\n    0x55, 0x01, 0x72, 0xB6, 0x2E, 0xC9, 0x56, 0x30, 0x73, 0x77, 0xFE, 0x6F, 0x0F, 0x4F, 0xD4, 0xA3,\n    0xA0, 0x51, 0xC1, 0xEC, 0xE9, 0xF8, 0x16, 0x7A, 0x22, 0x9F, 0x55, 0xDA, 0xA9, 0xC0, 0x31, 0x84,\n    0xC0, 0x3F, 0x3A, 0x57, 0x9D, 0x41, 0x9B, 0x4A, 0x5E, 0x84, 0x19, 0xE5, 0x93, 0xC8, 0xAE, 0xFA,\n    0x91, 0xD8, 0xB8, 0x98, 0x67, 0xB2, 0x8C, 0x37, 0x4B, 0x4C, 0xAA, 0xF9, 0x7C, 0xCD, 0x67, 0x50,\n    0xB2, 0x83, 0x19, 0x88, 0x89, 0xE9, 0xD1, 0xD1, 0x29, 0xA8, 0x9C, 0x94, 0x24, 0x65, 0x1D, 0xF4,\n    0x67, 0x9A, 0xF3, 0x91, 0xB2, 0x3B, 0xAB, 0x94, 0xE9, 0x8C, 0x16, 0xD6, 0x58, 0x17, 0x18, 0x72,\n    0xB2, 0xBD, 0xCD, 0x1B, 0x4B, 0x8A, 0x32, 0x70, 0xDC, 0xFC, 0x97, 0x54, 0x73, 0x25, 0x74, 0x9B,\n    0xF3, 0x90, 0x0C, 0x04, 0xDD, 0x7C, 0x1A, 0xA8, 0xD7, 0x33, 0xCD, 0xE6, 0x88, 0xAF, 0x8E, 0x96,\n    0xD1, 0xE9, 0xFF, 0xCE, 0xEE, 0x3C, 0x1A, 0x42, 0xA5, 0xB2, 0x56, 0xB3, 0x99, 0xA3, 0x8E, 0xED,\n    0x2D, 0xE7, 0xAE, 0xB0, 0x2E, 0x3C, 0xC6, 0x7C, 0xAA, 0xA3, 0x3F, 0xC7, 0xD2, 0x79, 0x04, 0x98,\n    0x9A, 0xC0, 0xA4, 0x6A, 0xDC, 0x64, 0x49, 0x24, 0x4F, 0x8B, 0xFA, 0x86, 0x45, 0x17, 0xE8, 0x7E,\n    0xF5, 0xD3, 0x8A, 0x56, 0x76, 0xBF, 0x95, 0x50, 0xE2, 0x4A, 0xE1, 0x3F, 0xF2, 0x50, 0x5E, 0x8F,\n    0x99, 0x2C, 0xE7, 0xB9, 0x10, 0x6C, 0x99, 0x7C, 0x39, 0x6C, 0xA3, 0x39, 0xAB, 0x0B, 0xF0, 0x84,\n    0x82, 0x7C, 0xD6, 0x59, 0x21, 0x5B, 0x85, 0xFD, 0xFC, 0xF9, 0x15, 0xC2, 0x35, 0x02, 0x52, 0xD2,\n    0x16, 0x20, 0x3B, 0x6F, 0x27, 0xFB, 0x7F, 0x11, 0xBF, 0x05, 0xA1, 0xF1, 0x7C, 0xA1, 0x73, 0x34,\n    0xFD, 0x40, 0x3D, 0xF0, 0x36, 0xEE, 0xC8, 0x4B, 0xC7, 0x4F, 0x35, 0x04, 0x1C, 0x69, 0x49, 0x65,\n    0x0B, 0xCD, 0x4E, 0x3B, 0xED, 0x5C, 0xA6, 0x42, 0x11, 0xB8, 0xFC, 0x8F, 0xA9, 0x44, 0x04, 0x55,\n    0x19, 0x12, 0xA8, 0xAC, 0xE0, 0x4F, 0x13, 0xB5, 0xA0, 0xBA, 0xAD, 0xFA, 0x84, 0x5E, 0x11, 0x95,\n    0x4B, 0xC1, 0x19, 0x57, 0x45, 0x3E, 0x3C, 0x46, 0x92, 0x0C, 0xAD, 0x54, 0xD2, 0xDD, 0x47, 0x6F,\n    0xF0, 0x77, 0x0E, 0xAD, 0xD2, 0x5D, 0xEF, 0x39, 0xF3, 0x67, 0xD7, 0x8D, 0x31, 0x3C, 0xCD, 0x5B,\n    0xB0, 0x3A, 0x47, 0x4C, 0xD1, 0x16, 0xBB, 0xB2, 0xDA, 0x65, 0xF0, 0x9B, 0x82, 0x75, 0x3B, 0xF7,\n    0x46, 0xD3, 0x12, 0xBA, 0xFD, 0x04, 0x9D, 0x2E, 0x8A, 0x3E, 0x75, 0x88, 0x9A, 0xC7, 0xF3, 0x20,\n    0x6B, 0x9E, 0xD7, 0xD3, 0xD3, 0x39, 0x75, 0xF9, 0x76, 0x47, 0xB0, 0xEB, 0xD1, 0x3E, 0xEA, 0xD9,\n    0xF4, 0x7F, 0x0B, 0x6C, 0xF6, 0x8B, 0x04, 0xD3, 0x6F, 0x1F, 0x6D, 0x30, 0xA0, 0xA3, 0x09, 0x45,\n    0x57, 0x6E, 0xE2, 0x3A, 0x0E, 0xE7, 0x07, 0x98, 0x24, 0xED, 0xCB, 0x6D, 0x73, 0xB9, 0x4E, 0x09,\n    0xE7, 0xA9, 0xDD, 0xF7, 0x28, 0xBE, 0xA6, 0x94, 0x4E, 0x58, 0x92, 0x88, 0x74, 0x91, 0x85, 0x20,\n    0x3C, 0x78, 0xBB, 0xA4, 0x13, 0x65, 0xA6, 0x82, 0x2A, 0xCF, 0x1F, 0x2F, 0x43, 0x78, 0x43, 0x36,\n    0x32, 0x8B, 0x99, 0xE9, 0x7E, 0xC3, 0x73, 0x39, 0x3E, 0xC3, 0xFF, 0x42, 0x29, 0x76, 0xD7, 0x99,\n    0x3B, 0x7A, 0x0A, 0xCF, 0x7F, 0x40, 0xB7, 0x54, 0x92, 0x23, 0x18, 0x64, 0xD8, 0xD1, 0x12, 0xC4,\n    0x91, 0xBF, 0xA1, 0x90, 0x5E, 0x03, 0xB3, 0x1D, 0xC5, 0xF4, 0xD7, 0xC7, 0x9A, 0x6C, 0x87, 0x90,\n    0xB8, 0xD2, 0x0C, 0x66, 0x04, 0x20, 0x73, 0xA9, 0x6A, 0x73, 0xD4, 0xC5, 0x76, 0x5A, 0xBA, 0x4D,\n    0xD1, 0x56, 0xFA, 0x99, 0xF6, 0x32, 0x90, 0x5E, 0xFD, 0x19, 0xA4, 0xCD, 0x85, 0x1F, 0x13, 0x39,\n    0x0D, 0x2D, 0x6B, 0x01, 0xA4, 0x48, 0x59, 0x0F, 0x6E, 0x4B, 0xC2, 0xD4, 0xF4, 0x03, 0x71, 0x92,\n    0x91, 0x0E, 0xCD, 0x5B, 0x0A, 0x48, 0xB4, 0xA2, 0x1A, 0xA4, 0xF1, 0x93, 0x6F, 0x1B, 0x90, 0x33,\n    0xCF, 0x05, 0xF5, 0xB4, 0x0D, 0x7F, 0xE3, 0x88, 0xD7, 0x8F, 0xB6, 0x34, 0xBD, 0xEC, 0x0B, 0xA2,\n    0x45, 0xCA, 0x3B, 0xFD, 0xB2, 0x74, 0x10, 0xC0, 0x16, 0x03, 0x77, 0x1B, 0x0C, 0xBC, 0xFB, 0x36,\n    0x93, 0x8A, 0x95, 0x52, 0x14, 0x4A, 0x52, 0x42, 0x4E, 0x8C, 0x5E, 0x59, 0xEC, 0x68, 0xC7, 0xCE,\n    0x8F, 0xFB, 0x15, 0x10, 0xA1, 0xDB, 0xA2, 0x6A, 0x6D, 0x49, 0x65, 0x3C, 0x7C, 0x71, 0xE9, 0x91,\n    0xD5, 0x25, 0x08, 0x19, 0x66, 0xFD, 0x67, 0xF7, 0xC3, 0x4C, 0x1A, 0x4D, 0x6E, 0x31, 0xA0, 0x2A,\n    0x49, 0x57, 0x97, 0xB0, 0x8E, 0xB4, 0xB6, 0x0D, 0xCE, 0xA5, 0x26, 0x52, 0x6C, 0xA3, 0xB3, 0x0E,\n    0xC6, 0x1E, 0x28, 0xA6, 0x4B, 0xEF, 0x20, 0xD1, 0x58, 0x86, 0x64, 0xEF, 0x49, 0x40, 0x62, 0x43,\n    0x58, 0x2A, 0x65, 0x5D, 0x8C, 0x91, 0xFE, 0xDB, 0x85, 0x2D, 0x9D, 0x66, 0x0B, 0x5B, 0xDF, 0xCA,\n    0xFC, 0xA4, 0x35, 0x01, 0xA4, 0x0C, 0x3E, 0x82, 0xF6, 0xD0, 0xB6, 0xEB, 0x38, 0x6F, 0x6F, 0xD6,\n    0xB0, 0x6D, 0xD5, 0xC8, 0x37, 0x2D, 0xD4, 0x3F, 0x7F, 0xA9, 0xCD, 0x95, 0xD0, 0xE0, 0xBA, 0x56,\n    0xF2, 0xF5, 0x2F, 0x38, 0xDA, 0x23, 0x3C, 0x62, 0xC1, 0x96, 0xAC, 0xE4, 0xA5, 0xAB, 0xD3, 0xE4,\n    0x42, 0xD6, 0x06, 0x7D, 0x2F, 0x64, 0xBC, 0x8E, 0xD7, 0x49, 0xF1, 0xA8, 0x08, 0xC0, 0xD4, 0xED,\n    0x10, 0x53, 0x99, 0x3F, 0x7E, 0x66, 0xC8, 0x24, 0xDB, 0x12, 0x1E, 0x15, 0x30, 0x8E, 0x76, 0xD7,\n    0xCD, 0x65, 0xD4, 0x97, 0xCB, 0xC7, 0xDD, 0x89, 0x1E, 0x28, 0x7B, 0x08, 0xED, 0x16, 0xBD, 0x78,\n    0x21, 0x5A, 0xBD, 0x37, 0x98, 0xD8, 0xE3, 0x81, 0x6B, 0x5C, 0x96, 0x51, 0x45, 0x95, 0xED, 0x2A,\n    0x53, 0x4B, 0xDB, 0x96, 0x66, 0xB4, 0xBF, 0x54, 0x55, 0xBC, 0x82, 0xB0, 0x31, 0x75, 0xA0, 0xA7,\n    0x5F, 0x4D, 0xED, 0x89, 0xBB, 0x47, 0x87, 0x40, 0x68, 0xCA, 0x74, 0x3A, 0xD9, 0x3A, 0xC3, 0x10,\n    0xBA, 0x18, 0xAF, 0xC7, 0x67, 0x0A, 0x86, 0x31, 0x08, 0xE6, 0x8A, 0xD6, 0x0C, 0xD6, 0xDE, 0xB6,\n    0x4A, 0xD7, 0x99, 0xC6, 0x28, 0xBF, 0xD2, 0x82, 0xF6, 0x8C, 0xFA, 0xC9, 0x0F, 0x81, 0x1A, 0x9B,\n    0xD1, 0xE5, 0x7C, 0x3B, 0x31, 0x30, 0x14, 0x27, 0x23, 0x69, 0xD6, 0x3E, 0xB2, 0x94, 0x0A, 0xC4,\n    0xD0, 0x6F, 0x98, 0x4A, 0x42, 0xE5, 0x81, 0x51, 0x00, 0xD4, 0x46, 0x1F, 0x6A, 0x96, 0x3B, 0xB1,\n    0x03, 0x2F, 0x81, 0x2B, 0xD8, 0xC8, 0x79, 0xCF, 0x3E, 0x3F, 0x53, 0xDC, 0x88, 0x1A, 0xF8, 0xAF,\n    0x1C, 0xF5, 0x71, 0x0A, 0xCF, 0xE2, 0x06, 0x29, 0x76, 0xBD, 0xAA, 0x55, 0x9E, 0x87, 0x72, 0x47,\n    0x7C, 0x74, 0x36, 0x17, 0xC7, 0xDF, 0x90, 0xA4, 0x92, 0x2C, 0x72, 0x17, 0x4B, 0xAB, 0x41, 0x7B,\n    0xA2, 0xEC, 0x60, 0x0A, 0xB9, 0x25, 0xAF, 0xAC, 0x0F, 0x66, 0x60, 0x92, 0xC1, 0xA8, 0x5F, 0xD4,\n    0x67, 0x3F, 0x9D, 0xF4, 0x63, 0x3A, 0x28, 0x21, 0x2A, 0x8C, 0x4A, 0x4E, 0x89, 0x0B, 0x23, 0x46,\n    0x81, 0x8D, 0xC1, 0xE0, 0x0F, 0x87, 0x60, 0xFA, 0xA1, 0xC1, 0x71, 0x1F, 0x10, 0x37, 0xDA, 0xCC,\n    0x65, 0xF5, 0xA0, 0x33, 0x84, 0x84, 0x36, 0x0A, 0xED, 0x28, 0x3F, 0x5A, 0xBE, 0x76, 0x95, 0xB6,\n    0xA4, 0xBA, 0xE3, 0x92, 0xF8, 0x4B, 0x55, 0x78, 0x23, 0xBF, 0xAD, 0x7B, 0x39, 0x72, 0xAF, 0xE8,\n    0xAC, 0xEE, 0x27, 0x69, 0x0E, 0x8C, 0x57, 0x29, 0x08, 0xDA, 0xCB, 0x35, 0x07, 0x6D, 0xA4, 0x66,\n    0xC5, 0xF6, 0xF0, 0x73, 0x3A, 0xDC, 0xD3, 0x08, 0x79, 0x9A, 0x28, 0xCC, 0xD0, 0xCC, 0x45, 0x7C,\n    0xED, 0x82, 0x5A, 0x14, 0x29, 0xEF, 0x7E, 0x1E, 0x80, 0x42, 0x5E, 0x36, 0xD3, 0x21, 0x48, 0x8C,\n    0xE6, 0xBA, 0x91, 0x42, 0x54, 0xC6, 0xCF, 0x36, 0x4D, 0x68, 0xE5, 0xC3, 0x18, 0xEF, 0xCE, 0x92,\n    0x47, 0xE7, 0x2E, 0x8F, 0xB1, 0x67, 0x88, 0xC6, 0xB4, 0xB3, 0x98, 0xF8, 0x44, 0x51, 0x6D, 0x44,\n    0xC5, 0x11, 0xFB, 0x2E, 0xA5, 0x67, 0x48, 0xDE, 0xED, 0x7E, 0x9C, 0x6F, 0x53, 0x5D, 0xA0, 0xFF,\n    0x9F, 0x4D, 0x2E, 0x3F, 0xB6, 0x0D, 0x61, 0x41, 0x35, 0xB7, 0x0B, 0x28, 0x8F, 0x6A, 0x29, 0xD5,\n    0xFC, 0x25, 0x42, 0xBF, 0x04, 0x0E, 0xA7, 0xC0, 0xE9, 0xD4, 0xD0, 0x99, 0x26, 0x0C, 0x3B, 0xEE,\n    0xE0, 0x66, 0xFB, 0x66, 0x0E, 0xEC, 0x37, 0x13, 0xE2, 0xD8, 0x2F, 0x90, 0x6B, 0x0D, 0x4E, 0x9C,\n    0x14, 0xCB, 0xBA, 0xF0, 0xD6, 0x49, 0x55, 0xAB, 0xFE, 0x96, 0x74, 0x48, 0x07, 0xA2, 0x0B, 0x6F,\n    0x91, 0x0B, 0x7D, 0x75, 0x60, 0xB9, 0x11, 0x1B, 0x8F, 0x48, 0x6D, 0x66, 0xED, 0xDD, 0xCC, 0x83,\n    0x57, 0x1A, 0x2B, 0x81, 0x7F, 0xC5, 0x7B, 0x3B, 0x16, 0x92, 0x93, 0x6C, 0xC7, 0xB2, 0xC5, 0x48,\n    0xAE, 0xB2, 0x2E, 0x4C, 0x22, 0xE8, 0xF9, 0xD4, 0x91, 0x95, 0xA9, 0xA1, 0x97, 0x48, 0x80, 0x4D,\n    0x4D, 0x5E, 0xEF, 0x3E, 0x87, 0xD5, 0x3C, 0xF7, 0xDF, 0xFA, 0x36, 0x4A, 0xC4, 0x72, 0x0C, 0x2E,\n    0x0E, 0xA2, 0xC6, 0x61, 0xB1, 0x3D, 0xEC, 0x5A, 0x6C, 0x9D, 0x16, 0x81, 0x13, 0x61, 0x8E, 0x7E,\n    0x28, 0xA0, 0x3D, 0xEB, 0x8E, 0x97, 0x59, 0x0E, 0x24, 0xCF, 0x5B, 0x4D, 0x98, 0xDE, 0x01, 0xC9,\n    0x48, 0x97, 0x8F, 0x1C, 0xCC, 0xF9, 0x6B, 0xA8, 0xC0, 0x44, 0x73, 0xEB, 0x06, 0x17, 0xB2, 0x8D,\n    0xA5, 0xD4, 0x25, 0x87, 0x0E, 0xE2, 0x6E, 0x0D, 0x99, 0x7E, 0xCE, 0x06, 0x83, 0x99, 0x3A, 0x8C,\n    0xE6, 0xC7, 0x99, 0xAC, 0x3C, 0xF3, 0x0C, 0x50, 0x8F, 0xA7, 0xB2, 0x2B, 0x3C, 0xCA, 0x56, 0x06,\n    0x63, 0xA0, 0x9A, 0xB6, 0xF8, 0x84, 0x43, 0x03, 0x04, 0x07, 0x8A, 0xEC, 0x43, 0xA1, 0x3E, 0x5F,\n    0xE2, 0x2A, 0x50, 0x02, 0xBA, 0x62, 0xDA, 0x77, 0x7A, 0xC9, 0x06, 0x50, 0xF5, 0xEE, 0xE0, 0xD0,\n    0x85, 0xDA, 0x15, 0x54, 0x36, 0x83, 0x44, 0xC5, 0x14, 0xBD, 0x98, 0xB4, 0x37, 0x27, 0x56, 0x4B,\n    0xB2, 0x19, 0x59, 0xEB, 0xD5, 0x95, 0x27, 0xAD, 0x94, 0x2F, 0x36, 0x8D, 0x61, 0x26, 0x95, 0xEF,\n    0x4B, 0x05, 0x9E, 0x22, 0xDB, 0x76, 0x06, 0x67, 0xA0, 0x0D, 0x28, 0x90, 0x5D, 0x6D, 0xFF, 0xA6,\n    0x2F, 0x2F, 0x8F, 0x1F, 0x72, 0xEA, 0x88, 0x79, 0xE2, 0xC8, 0x8B, 0xA1, 0x19, 0xC3, 0x09, 0xA3,\n    0x21, 0x93, 0xB4, 0x74, 0xB1, 0xDF, 0x53, 0x78, 0x08, 0x25, 0x01, 0xC6, 0x83, 0x2D, 0x17, 0xD4,\n    0x6C, 0x44, 0x1C, 0xAE, 0xFD, 0x3D, 0xE8, 0xF0, 0xA7, 0x93, 0x59, 0x3B, 0x96, 0x01, 0x5F, 0xC1,\n    0xA4, 0x5F, 0x82, 0xA7, 0x1D, 0x9C, 0xB9, 0x60, 0x00, 0xF4, 0x02, 0x9A, 0xD0, 0xCF, 0xA7, 0x8F,\n    0x25, 0x9E, 0x21, 0xD7, 0x47, 0x9A, 0x18, 0x9E, 0x7F, 0x39, 0x1A, 0x7E, 0x5E, 0x52, 0x44, 0x11,\n    0x1A, 0xF0, 0xD6, 0x4D, 0x3E, 0x98, 0x2D, 0x88, 0x45, 0xDA, 0xC4, 0xBF, 0x51, 0x9F, 0x34, 0xC0,\n    0xEA, 0x0E, 0xD1, 0x32, 0xCD, 0xB9, 0x7E, 0x16, 0x01, 0xF2, 0xD4, 0x81, 0x9E, 0x40, 0xC9, 0xBA,\n    0xC0, 0x93, 0xFB, 0x88, 0x14, 0x8E, 0x79, 0x2F, 0x85, 0x54, 0x12, 0x29, 0x54, 0x8E, 0x4F, 0x72,\n    0x6C, 0x3F, 0x0D, 0xB6, 0xD4, 0x27, 0x91, 0xCE, 0xAC, 0xC7, 0x7B, 0x9A, 0x77, 0xEA, 0xCB, 0xBE,\n    0x0C, 0x53, 0xCB, 0x2E, 0x8E, 0x45, 0x3E, 0xC0, 0x95, 0x76, 0x35, 0x96, 0xF0, 0xAF, 0xA1, 0x91,\n    0x7E, 0x64, 0xE8, 0x82, 0xA2, 0x27, 0x3F, 0x90, 0xC6, 0xE3, 0x78, 0x75, 0xC6, 0x32, 0x3B, 0xDD,\n    0x91, 0xE4, 0x7C, 0xFD, 0x18, 0x16, 0xAC, 0xEF, 0x93, 0xEF, 0x76, 0xC4, 0x4C, 0xC8, 0x1F, 0x61,\n    0xEF, 0xD0, 0x40, 0x0D, 0xD9, 0x9B, 0x13, 0xB8, 0xAA, 0x6E, 0xFC, 0x9F, 0x1D, 0x5E, 0x7C, 0x7F,\n    0xB6, 0x2B, 0xCA, 0x06, 0xF6, 0xDA, 0x06, 0xE0, 0x94, 0x81, 0x8C, 0x49, 0x75, 0xD6, 0x8A, 0xA3,\n    0xC0, 0x7A, 0x59, 0xCE, 0xFC, 0x85, 0xB4, 0xCA, 0xE5, 0xA3, 0x58, 0x64, 0x31, 0xA8, 0x41, 0x2D,\n    0xF4, 0xCD, 0x56, 0x10, 0x2A, 0x18, 0x4C, 0x15, 0xBE, 0xD5, 0x1B, 0xAC, 0xC7, 0x68, 0xB4, 0x3C,\n    0x60, 0x4D, 0xD0, 0xC2, 0x7A, 0xE4, 0xE1, 0x59, 0x84, 0x95, 0x5D, 0x0C, 0x1D, 0x74, 0x4E, 0x5A,\n    0xCC, 0xBB, 0x85, 0xAA, 0xFC, 0x91, 0x81, 0x50, 0xFC, 0x05, 0xC7, 0x77, 0xC5, 0xE3, 0xCE, 0x70,\n    0xA1, 0x35, 0xBD, 0xAF, 0x9C, 0x17, 0xB3, 0x52, 0xD0, 0xE1, 0xC4, 0x6B, 0x12, 0x00, 0x4E, 0xA3,\n    0x2E, 0xC2, 0x45, 0xB3, 0x85, 0x1E, 0xBF, 0x4C, 0x1C, 0xC5, 0x49, 0x7A, 0xB4, 0x9D, 0xCB, 0xB9,\n    0x2D, 0x93, 0xAF, 0xB3, 0x98, 0x30, 0xA1, 0x17, 0x93, 0x31, 0xE8, 0x79, 0xBE, 0xFB, 0xE3, 0xF6,\n    0x8E, 0x8F, 0xBE, 0x11, 0x43, 0xCB, 0x06, 0x38, 0xDD, 0x33, 0x5A, 0x27, 0x77, 0xF7, 0x59, 0xF9,\n    0x12, 0x8E, 0x9E, 0xAA, 0xA6, 0x99, 0x54, 0x9C, 0x26, 0xD8, 0x55, 0x39, 0x8C, 0xD0, 0x62, 0xC7,\n    0x2B, 0xE7, 0xAD, 0x43, 0xDC, 0xFA, 0xA4, 0xB7, 0xB3, 0xB2, 0xEE, 0xDB, 0xC1, 0x1F, 0x37, 0x44,\n    0x89, 0x30, 0xBC, 0xE6, 0x6A, 0x17, 0xEC, 0x31, 0xBB, 0x52, 0x52, 0x36, 0x99, 0x49, 0x45, 0x59,\n    0x6A, 0x55, 0xD0, 0xC6, 0x5C, 0xAD, 0x1B, 0xE6, 0x2F, 0x1B, 0x71, 0x6A, 0x3D, 0x78, 0x3C, 0xFD,\n    0x63, 0x6F, 0x41, 0x6B, 0x4D, 0xA7, 0x83, 0x65, 0x01, 0xFF, 0x82, 0x0E, 0x0E, 0x04, 0xFC, 0x8B,\n    0x24, 0xD1, 0x65, 0x3B, 0xF0, 0x61, 0x78, 0x2A, 0x43, 0x4A, 0xD5, 0xDE, 0xE2, 0x7E, 0x41, 0x15,\n    0x76, 0x08, 0xB8, 0x9B, 0x24, 0x2D, 0x2A, 0xD9, 0x3C, 0xA7, 0x17, 0x47, 0xF7, 0x88, 0xA0, 0xCF,\n    0xDD, 0x5B, 0x08, 0xB6, 0x05, 0x25, 0x54, 0x80, 0x93, 0x83, 0x9E, 0x8D, 0xE1, 0x1F, 0xE6, 0x8E,\n    0x08, 0x4C, 0x06, 0x26, 0xE2, 0x0B, 0xE5, 0xEE, 0xDD, 0x4D, 0xAB, 0xD0, 0x43, 0x15, 0x95, 0x66,\n    0x8F, 0xB6, 0xF8, 0x54, 0xF2, 0xF5, 0x9F, 0x79, 0xB5, 0x08, 0x2E, 0x94, 0x8D, 0x1F, 0x00, 0x86,\n    0xEF, 0xF2, 0xB7, 0x1C, 0x9A, 0x01, 0xA9, 0x00, 0xE2, 0x61, 0x39, 0x47, 0x52, 0xF1, 0x25, 0xA6,\n    0xA2, 0xCC, 0x82, 0xB4, 0xE1, 0x93, 0xBE, 0xC4, 0xBF, 0x2E, 0xBA, 0x02, 0x5D, 0x65, 0x09, 0x50,\n    0x2F, 0x36, 0x58, 0x82, 0x49, 0x9C, 0xC3, 0x78, 0xD8, 0x1D, 0xD5, 0xBC, 0xE8, 0x18, 0xA7, 0xD8,\n    0x9C, 0xB0, 0x15, 0x7D, 0xF9, 0xE1, 0x58, 0xD3, 0x59, 0xEA, 0x13, 0xEC, 0x9F, 0xD7, 0xF3, 0x35,\n    0x90, 0xF7, 0x29, 0xC0, 0x21, 0x7C, 0x55, 0xD4, 0x11, 0x48, 0xF7, 0x6F, 0x6A, 0x00, 0xC5, 0x25,\n    0xE5, 0x00, 0x64, 0xC4, 0xB0, 0x31, 0xE5, 0xF2, 0x03, 0x92, 0x9A, 0x07, 0x47, 0x5E, 0xA0, 0x94,\n    0x65, 0xAF, 0x5A, 0xB6, 0xFC, 0x4B, 0x48, 0xB6, 0x4A, 0xCF, 0x4D, 0xCA, 0x8C, 0x16, 0x77, 0x6C,\n    0xF7, 0x99, 0xBD, 0xCC, 0x1E, 0x40, 0x55, 0xE2, 0xAA, 0xCB, 0xBF, 0xCC, 0x74, 0x92, 0xA2, 0x8A,\n    0x64, 0xC3, 0xE6, 0x17, 0x60, 0x10, 0x72, 0xD1, 0xA0, 0x62, 0xD3, 0x06, 0xCF, 0x12, 0xAD, 0xE6,\n    0xBE, 0xC4, 0x76, 0xD7, 0x34, 0x8E, 0xA7, 0xB4, 0x76, 0xD5, 0x9D, 0xC3, 0xA1, 0x4A, 0xCE, 0xA9,\n    0xC0, 0x4F, 0x70, 0x15, 0x91, 0xAD, 0x41, 0x23, 0x44, 0xB8, 0x65, 0x8C, 0x44, 0x49, 0x4F, 0xB8,\n    0xBE, 0x45, 0x49, 0xA5, 0xAF, 0x02, 0x66, 0x71, 0x58, 0xB6, 0x8D, 0x40, 0xAD, 0x4F, 0x89, 0xF4,\n    0x6F, 0x25, 0x14, 0xB0, 0x62, 0x9A, 0xA6, 0xE8, 0x72, 0x01, 0x66, 0x02, 0xC9, 0xF2, 0xCE, 0xCA,\n    0xBD, 0xA1, 0x3A, 0x12, 0xE4, 0xD4, 0x3A, 0x4B, 0x40, 0xC6, 0xB6, 0x29, 0x00, 0xC9, 0x92, 0x04,\n    0x3B, 0xBC, 0xA9, 0x2E, 0xAD, 0x63, 0x7C, 0xC5, 0x84, 0xAE, 0x3D, 0x91, 0x64, 0x28, 0xB1, 0xA2,\n    0xA7, 0x7E, 0x67, 0xD5, 0xBF, 0x8B, 0x00, 0x23, 0x37, 0x87, 0x57, 0x83, 0xA8, 0x2C, 0x13, 0x12,\n    0x5A, 0x86, 0x67, 0x79, 0x3A, 0xF7, 0xFA, 0x2B, 0xCB, 0xC2, 0xB6, 0x20, 0xF0, 0xD2, 0x3F, 0x39,\n    0x1B, 0x23, 0xA2, 0x11, 0x74, 0x9C, 0xA2, 0x8E, 0x91, 0x4E, 0x70, 0xB3, 0xE1, 0x85, 0x18, 0xC6,\n    0x16, 0x4B, 0x25, 0x93, 0xF1, 0x76, 0x74, 0x4C, 0xA8, 0x9C, 0x81, 0x73, 0xE4, 0x97, 0x54, 0x2A,\n    0x74, 0x45, 0xD7, 0x3A, 0x80, 0x36, 0x43, 0x68, 0x91, 0xAE, 0x99, 0x3B, 0xE6, 0x64, 0x28, 0xC1,\n    0xFD, 0xE6, 0xD3, 0xFA, 0xCE, 0xE2, 0x63, 0xA2, 0x27, 0xA0, 0x50, 0x83, 0x9E, 0x90, 0xE9, 0x47,\n    0x95, 0x27, 0x20, 0x6F, 0x82, 0x4A, 0x88, 0x46, 0xBB, 0xC6, 0xBA, 0x55, 0x72, 0xA8, 0xBD, 0x21,\n    0xD7, 0xE7, 0xFC, 0xC2, 0xCF, 0x30, 0x43, 0x09, 0x80, 0x15, 0xDC, 0x61, 0xFA, 0xE3, 0x46, 0x03,\n    0xD6, 0x28, 0x05, 0xC4, 0x24, 0xD3, 0xC6, 0x90, 0x36, 0x4B, 0x58, 0xE0, 0x32, 0x3A, 0x6B, 0xDD,\n    0x95, 0xEF, 0x4A, 0xDB, 0x72, 0x8A, 0x85, 0xFD, 0x1B, 0x72, 0x48, 0xAF, 0xE1, 0x75, 0x0B, 0xAF,\n    0x65, 0xAA, 0xDC, 0xD1, 0xBA, 0xB5, 0x6F, 0x15, 0x95, 0xE6, 0x2B, 0x9B, 0x78, 0xE3, 0xCF, 0xB8,\n    0xB6, 0x1D, 0xE6, 0xB9, 0xB9, 0xA5, 0x20, 0x53, 0xC4, 0x50, 0xDC, 0xD2, 0x4A, 0x4D, 0x80, 0x44,\n    0xF5, 0xFD, 0x68, 0xB0, 0x78, 0x75, 0x79, 0x08, 0x19, 0xCE, 0x4C, 0xA1, 0x85, 0x51, 0xFA, 0xCB,\n    0xB6, 0xE6, 0x4B, 0x81, 0x42, 0x5D, 0xEA, 0xF3, 0x97, 0xC6, 0x68, 0xD1, 0x56, 0x51, 0x52, 0x48,\n    0x3D, 0x61, 0xD2, 0x1C, 0x0D, 0x68, 0x4A, 0xC4, 0xDE, 0x06, 0x04, 0x34, 0x1C, 0xE4, 0xD1, 0x36,\n    0xED, 0x6D, 0xA7, 0x70, 0x38, 0x89, 0x64, 0x34, 0xC3, 0xBB, 0x93, 0xA2, 0x75, 0xE6, 0x39, 0xF7,\n    0x97, 0x1C, 0xBD, 0x8F, 0xD1, 0xAF, 0x4C, 0x98, 0xF4, 0x7D, 0xD7, 0x71, 0xEE, 0x50, 0x78, 0x72,\n    0x86, 0xB0, 0xD4, 0xB9, 0xD0, 0xCB, 0x5B, 0xB1, 0x50, 0x55, 0xFC, 0xC2, 0xB3, 0x0B, 0x2F, 0xAF,\n    0x54, 0x32, 0x7C, 0x77, 0x6E, 0xC8, 0x2A, 0x57, 0xBB, 0x99, 0x8E, 0xB3, 0x93, 0x37, 0x11, 0xFE,\n    0x23, 0x2C, 0x4B, 0x33, 0x48, 0x9D, 0x13, 0x05, 0xD9, 0x90, 0xF3, 0x4D, 0xBB, 0x3C, 0x3C, 0xBE,\n    0xF2, 0x29, 0x6A, 0xFB, 0xC9, 0x77, 0x21, 0x64, 0x3A, 0xA7, 0xA4, 0x8D, 0xC8, 0x62, 0x4D, 0xE7,\n    0x97, 0x96, 0x2D, 0x88, 0xF7, 0xF1, 0x0D, 0x99, 0x35, 0x09, 0x2B, 0x34, 0xAF, 0x19, 0xB4, 0xBC,\n    0x0C, 0xBA, 0x35, 0x13, 0x9F, 0x85, 0x27, 0x98, 0xD7, 0x5A, 0x98, 0x76, 0x41, 0x3D, 0xE3, 0xDC,\n    0xB1, 0x57, 0x2F, 0x84, 0xA7, 0xAC, 0x60, 0x28, 0x0A, 0x41, 0xCA, 0xA1, 0xB6, 0xB4, 0x68, 0xA9,\n    0x4F, 0xC8, 0xDA, 0x4A, 0x43, 0x89, 0x25, 0x36, 0xC9, 0xCF, 0x6E, 0x3F, 0x04, 0x73, 0xCB, 0xE7,\n    0x9E, 0x2A, 0xB6, 0x04, 0xFF, 0x9F, 0x4B, 0x42, 0x7D, 0x2D, 0x74, 0xAC, 0x3D, 0x6D, 0x78, 0xC7,\n    0xA5, 0x34, 0x9C, 0xD2, 0x8A, 0x09, 0x06, 0xF0, 0x80, 0xA9, 0x69, 0x60, 0xEC, 0x52, 0x70, 0x6B,\n    0x34, 0x0C, 0x7E, 0xAF, 0x17, 0xA7, 0x48, 0x5E, 0xAF, 0x85, 0xF7, 0x29, 0xE4, 0x33, 0x54, 0xA2,\n    0x44, 0x8B, 0xA0, 0x30, 0xF0, 0xAA, 0xE5, 0xAD, 0x87, 0x5E, 0xF6, 0xA8, 0x67, 0xBA, 0x4A, 0x4E,\n    0xA8, 0x85, 0xED, 0x50, 0x2C, 0x4D, 0xBA, 0xC2, 0x89, 0x2F, 0x39, 0x64, 0x62, 0x9F, 0x4B, 0x8E,\n    0x60, 0x5B, 0x2C, 0x5F, 0x4A, 0xFA, 0x65, 0xB3, 0xCD, 0x52, 0x93, 0x43, 0xC1, 0x71, 0x3E, 0xE7,\n    0xFB, 0x78, 0xAD, 0x32, 0xEC, 0xF0, 0xB8, 0x2C, 0x72, 0xEF, 0xD8, 0x37, 0xCA, 0x80, 0xFB, 0x4F,\n    0x2C, 0x18, 0xF4, 0x6D, 0x88, 0x5E, 0xCB, 0x07, 0xB7, 0xB3, 0x9C, 0x05, 0x58, 0x84, 0x71, 0xB1,\n    0xE1, 0x11, 0xD4, 0xC9, 0x63, 0xAE, 0x23, 0x82, 0xEB, 0xF9, 0x48, 0x97, 0xCA, 0x26, 0x30, 0xC2,\n    0xF1, 0x37, 0x8E, 0xE6, 0x53, 0x08, 0x16, 0x5E, 0x2A, 0x24, 0x95, 0xFB, 0x92, 0x68, 0xF5, 0xFC,\n    0x34, 0x70, 0x98, 0x6E, 0x2C, 0x54, 0x97, 0x81, 0x11, 0xFC, 0x95, 0xEF, 0xCA, 0xD3, 0xBF, 0xC3,\n    0xB5, 0xB5, 0xC0, 0xC7, 0xCE, 0xF3, 0x22, 0x8C, 0x9F, 0xD7, 0xC7, 0xA2, 0xFC, 0x95, 0xEE, 0x69,\n    0x94, 0x20, 0x16, 0x5B, 0x55, 0xA4, 0x48, 0x66, 0x2A, 0x70, 0x91, 0xD5, 0x61, 0x32, 0xBB, 0x34,\n    0x61, 0x13, 0x00, 0x59, 0xEA, 0xB7, 0xDE, 0xAE, 0xE0, 0xA2, 0xEF, 0x3B, 0xF0, 0x1C, 0xA9, 0xC2,\n    0xFC, 0x02, 0xE3, 0x69, 0x8E, 0xBA, 0xED, 0xAD, 0xBA, 0x37, 0x52, 0x71, 0x4E, 0x8A, 0xC3, 0xA1,\n    0x77, 0xA8, 0xDF, 0xA5, 0x3E, 0x95, 0xF7, 0xEE, 0xEF, 0xD7, 0xBE, 0x46, 0x4F, 0x65, 0x7A, 0xB5,\n    0x8C, 0xBB, 0xB7, 0x45, 0xB9, 0x36, 0xA2, 0xD1, 0x44, 0xBE, 0x10, 0x8F, 0x9F, 0x29, 0xDF, 0xFC,\n    0x4E, 0xC0, 0x69, 0x49, 0x8E, 0x05, 0x07, 0x7D, 0x9E, 0xA2, 0x0B, 0x6E, 0x92, 0x47, 0x18, 0x99,\n    0xF2, 0xF7, 0x62, 0x5C, 0x38, 0xD9, 0xE6, 0x92, 0x82, 0x37, 0x44, 0xB7, 0xAB, 0x8B, 0x7D, 0xB5,\n    0x4D, 0x3E, 0xA4, 0xF3, 0x8F, 0x6B, 0x0B, 0x8B, 0x60, 0xDD, 0x55, 0x2D, 0x9E, 0xB7, 0xF8, 0x79,\n    0x9B, 0xCA, 0x8F, 0x76, 0x78, 0x7B, 0x1B, 0xE7, 0xDB, 0x55, 0xBA, 0x71, 0x0B, 0x7F, 0x7D, 0xEC,\n    0xF4, 0x2A, 0x7D, 0x7E, 0xA6, 0xD5, 0xE6, 0x7C, 0x50, 0x6E, 0x11, 0x3A, 0x00, 0x33, 0xA5, 0xB7,\n    0xF1, 0x40, 0xF5, 0xDE, 0x62, 0xD5, 0xC9, 0x18, 0x76, 0x70, 0x7C, 0x09, 0x5A, 0x88, 0x2F, 0x0F,\n    0x5C, 0xC9, 0x80, 0xB1, 0xEA, 0x55, 0x05, 0x4F, 0x7E, 0x51, 0x25, 0xF8, 0x82, 0x76, 0xF6, 0x0B,\n    0x5E, 0xC5, 0x7E, 0xCE, 0xB8, 0x59, 0x2B, 0x2C, 0x8B, 0x0B, 0x43, 0xDC, 0xC7, 0x74, 0x96, 0x13,\n    0xBA, 0x34, 0xD7, 0x69, 0x11, 0x6C, 0x01, 0x4E, 0xC2, 0x8A, 0xD7, 0x38, 0x10, 0x20, 0xB8, 0xAB,\n    0x20, 0xA1, 0xA7, 0x10, 0x20, 0xD3, 0x61, 0x07, 0x01, 0x5C, 0x48, 0x89, 0x87, 0x93, 0xFE, 0x36,\n    0x05, 0x28, 0x52, 0x07, 0x35, 0xF0, 0x05, 0x75, 0x0D, 0x26, 0x95, 0x77, 0xEC, 0x41, 0x99, 0xBF,\n    0xEB, 0xC4, 0xD8, 0xD1, 0x0A, 0x08, 0x78, 0xC6, 0x6A, 0xEA, 0x52, 0x05, 0x1D, 0x45, 0x5D, 0x87,\n    0x80, 0x94, 0x42, 0xD9, 0x5A, 0x1F, 0xBA, 0xAE, 0x11, 0x86, 0xA1, 0xCC, 0xF9, 0xBA, 0x29, 0xE4,\n    0xF2, 0x07, 0x91, 0xF1, 0xDF, 0x17, 0x61, 0x56, 0xF5, 0xEC, 0x19, 0xCC, 0x1F, 0xB0, 0xF5, 0x22,\n    0x9F, 0xD1, 0x06, 0x93, 0x6B, 0xE5, 0x98, 0xF6, 0xBE, 0xE1, 0x3C, 0x0E, 0x62, 0xF5, 0x77, 0xF6,\n    0x27, 0x7E, 0xDB, 0xB2, 0x96, 0x13, 0xCE, 0x0E, 0x43, 0x41, 0x14, 0x52, 0x35, 0xAF, 0x63, 0x36,\n    0xAE, 0x97, 0x2E, 0xB0, 0x22, 0xCA, 0xC1, 0xEC, 0xC9, 0x98, 0x93, 0xBD, 0xCD, 0x8E, 0x90, 0x6B,\n    0x12, 0x30, 0x1D, 0xAA, 0x6C, 0xB4, 0xEF, 0x3B, 0x0D, 0x24, 0xBE, 0x28, 0xB0, 0xD1, 0xAD, 0x06,\n    0xDA, 0x82, 0x16, 0x0F, 0xB2, 0xD4, 0xDB, 0x2A, 0xAC, 0x7B, 0x94, 0x62, 0xF3, 0x3F, 0x29, 0xA6,\n    0xF3, 0x6F, 0xC5, 0xD6, 0xBB, 0x81, 0x53, 0xAB, 0x86, 0xE5, 0xA5, 0x63, 0x02, 0xDA, 0xF3, 0x88,\n    0x8E, 0xBF, 0xB5, 0x56, 0x1A, 0x79, 0x4D, 0x39, 0xCA, 0xDB, 0xC9, 0xD4, 0x78, 0xFD, 0x4C, 0xDB,\n    0x03, 0x10, 0x84, 0x83, 0xAD, 0x4A, 0x13, 0xCF, 0xB8, 0xD7, 0x58, 0x34, 0x51, 0xD8, 0x13, 0x25,\n    0x99, 0x46, 0x9E, 0xD6, 0xD7, 0xDB, 0xE6, 0x2F, 0x6F, 0xAC, 0x12, 0xF1, 0x08, 0xB1, 0x07, 0xB9,\n    0x73, 0x61, 0xDB, 0x68, 0xAE, 0x3A, 0xC3, 0xBC, 0x74, 0x02, 0xD3, 0x55, 0x8F, 0x69, 0x8A, 0x2E,\n    0x51, 0x84, 0xEA, 0x19, 0x6B, 0xA9, 0x52, 0xC7, 0x06, 0x47, 0x79, 0xFB, 0xD0, 0x98, 0xC6, 0x7D,\n    0xF2, 0xBA, 0xF6, 0xE4, 0xEC, 0x10, 0x69, 0xE0, 0xB8, 0x52, 0x2C, 0x7F, 0xB8, 0x9C, 0x4F, 0xB2,\n    0x5A, 0x48, 0x39, 0x05, 0x81, 0xA8, 0x5E, 0x91, 0xD6, 0xFA, 0x84, 0xC9, 0xE6, 0x12, 0xC6, 0x09,\n    0x44, 0x3A, 0x69, 0xE9, 0x9C, 0x20, 0x9C, 0x4B, 0x6E, 0x39, 0xC8, 0x0A, 0xC8, 0x65, 0x28, 0x96,\n    0xA6, 0x6F, 0x3B, 0x07, 0x5E, 0xB0, 0xF1, 0x91, 0x27, 0x99, 0x38, 0x23, 0xF9, 0x0B, 0xF1, 0xE1,\n    0xC6, 0x01, 0xFB, 0x64, 0xA1, 0x41, 0x4D, 0x49, 0xEA, 0xC6, 0x35, 0xF4, 0x6A, 0x73, 0xE9, 0x9E,\n    0x6A, 0x2F, 0xA0, 0x00, 0x06, 0xF7, 0xF6, 0x8C, 0xD7, 0x3D, 0x7A, 0xC5, 0xEF, 0xBD, 0x91, 0xFD,\n    0x76, 0x8D, 0x78, 0xAA, 0x2D, 0x14, 0x0F, 0x01, 0xC8, 0x70, 0x96, 0xF9, 0x8F, 0x83, 0x61, 0xC7,\n    0xE4, 0xB2, 0xA6, 0x52, 0xBB, 0xE5, 0x1B, 0x49, 0x16, 0xCC, 0xBE, 0xD7, 0xAF, 0x76, 0xA7, 0x38,\n    0x44, 0x4D, 0xF2, 0xAC, 0x23, 0xD2, 0x50, 0x2C, 0xE7, 0x4E, 0xDC, 0xBA, 0xFD, 0xCB, 0x0C, 0x8A,\n    0xEA, 0xE7, 0x7A, 0x00, 0xEE, 0x14, 0xAB, 0xC9, 0x52, 0xCE, 0xA4, 0x38, 0x40, 0xE0, 0x75, 0x5E,\n    0x33, 0xCA, 0xA5, 0x20, 0xB7, 0x5D, 0xF9, 0x09, 0x1A, 0xA8, 0xBD, 0xBE, 0x34, 0xBF, 0xD8, 0x12,\n    0xF9, 0xF0, 0xC2, 0x63, 0xEE, 0xFF, 0xA9, 0xBF, 0x5C, 0xD7, 0xD3, 0x3A, 0x40, 0xEC, 0xE6, 0x32,\n    0x86, 0xA7, 0xA7, 0x0B, 0xA8, 0x87, 0x7A, 0x3E, 0x5E, 0x53, 0x4B, 0x85, 0x53, 0xFA, 0x9F, 0xA2,\n    0xAB, 0xC7, 0x88, 0x16, 0x77, 0x4D, 0x35, 0x06, 0xFE, 0xDA, 0x4A, 0x47, 0x4F, 0x1C, 0x7C, 0xFF,\n    0x4C, 0xB2, 0x84, 0x2D, 0x4F, 0x51, 0x7F, 0x65, 0x4E, 0x1C, 0xA7, 0x92, 0xE6, 0xCD, 0x80, 0x0A,\n    0xA3, 0xE8, 0xB8, 0x7A, 0x42, 0xBC, 0x3A, 0x09, 0xEC, 0xE4, 0x7D, 0x2F, 0xBC, 0x27, 0x2A, 0xBD,\n    0x8C, 0x6E, 0xE4, 0x48, 0x54, 0x73, 0x6D, 0x1F, 0x15, 0xCD, 0x37, 0x39, 0x64, 0x12, 0xE3, 0xE4,\n    0x49, 0x35, 0xCA, 0x83, 0x84, 0xE3, 0xE2, 0x58, 0xEB, 0xEB, 0x8D, 0xC7, 0x3B, 0x9E, 0xB0, 0xD4,\n    0x74, 0xF9, 0xC9, 0x09, 0x58, 0x15, 0xC4, 0x43, 0x18, 0x1E, 0x1D, 0x6D, 0xE2, 0xB1, 0xE7, 0x2A,\n    0x50, 0xC6, 0x4F, 0x32, 0x39, 0xAE, 0xC8, 0x9E, 0x6C, 0xFF, 0xF7, 0xD2, 0xD9, 0xA6, 0x13, 0x85,\n    0x82, 0xA2, 0xF7, 0x0A, 0xF7, 0x2E, 0x52, 0x96, 0x41, 0xCE, 0x84, 0x1E, 0x54, 0x53, 0x4A, 0x63,\n    0x34, 0xA2, 0x56, 0x3A, 0xD1, 0xAF, 0x52, 0xDF, 0x33, 0x39, 0x37, 0xBD, 0x78, 0x52, 0x01, 0x95,\n    0x52, 0xA1, 0x39, 0xE0, 0xEB, 0x33, 0xC5, 0x05, 0x5B, 0x02, 0xB7, 0xFE, 0xA7, 0x89, 0x7F, 0xE2,\n    0x30, 0x27, 0xF4, 0xD4, 0xBF, 0x07, 0x44, 0xF8, 0x6A, 0x56, 0x82, 0xE1, 0x87, 0xE1, 0xFB, 0xBA,\n    0x06, 0xD1, 0x75, 0xBB, 0x32, 0x69, 0x61, 0x6B, 0x45, 0x68, 0x87, 0x2C, 0x4C, 0xF2, 0xBE, 0xAD,\n    0x27, 0xB7, 0x7B, 0x9E, 0xB2, 0x24, 0x15, 0x44, 0x89, 0x2D, 0x2A, 0xF2, 0x10, 0xE5, 0x0D, 0x60,\n    0x44, 0xC8, 0x25, 0x03, 0xAD, 0xC9, 0x64, 0xAA, 0xD6, 0x90, 0x05, 0x14, 0xD7, 0xFE, 0xBF, 0x3B,\n    0x0F, 0xD8, 0x76, 0xD9, 0x76, 0x24, 0xE8, 0xA5, 0xF1, 0x0C, 0xAA, 0x78, 0x4D, 0xF1, 0x43, 0x8A,\n    0x5E, 0x8B, 0x40, 0xC2, 0x15, 0xD9, 0x3E, 0x29, 0x75, 0x8F, 0x8D, 0x63, 0x32, 0x4B, 0xC4, 0xFD,\n    0x4F, 0x7C, 0x9C, 0x33, 0x6A, 0x21, 0x17, 0xE6, 0xF7, 0xA5, 0x03, 0x3D, 0x68, 0x3E, 0xC9, 0x2A,\n    0x46, 0xCB, 0xB1, 0x5F, 0x69, 0x67, 0xDC, 0x28, 0xD7, 0xA9, 0x0D, 0x08, 0xAA, 0x55, 0x9B, 0xB1,\n    0x52, 0x7B, 0x20, 0x28, 0xC2, 0x67, 0x77, 0xBA, 0xB1, 0xC4, 0x81, 0x70, 0x5E, 0xDD, 0x46, 0x89,\n    0x16, 0xC9, 0x16, 0x5E, 0x79, 0x16, 0xEC, 0x7C, 0x5C, 0x5B, 0x6B, 0x15, 0x74, 0x28, 0xE4, 0xB7,\n    0xFC, 0x59, 0xB7, 0x22, 0xB7, 0x5C, 0x8D, 0x7A, 0xB2, 0x4F, 0xE4, 0x29, 0x2D, 0xD1, 0x10, 0xBF,\n    0xCA, 0x92, 0x90, 0x85, 0x51, 0x76, 0x48, 0x1D, 0x4F, 0x7B, 0x40, 0xC1, 0xB2, 0xED, 0x91, 0x20,\n    0x96, 0xD3, 0xD4, 0x46, 0x10, 0xD0, 0xA6, 0xF4, 0x3F, 0x0B, 0x7D, 0x6D, 0x6C, 0x04, 0xC9, 0x94,\n    0x23, 0x97, 0x2F, 0xBD, 0x75, 0x06, 0x68, 0x85, 0xCB, 0x2D, 0xFD, 0xA9, 0xD1, 0xD5, 0xD2, 0x98,\n    0x60, 0x74, 0xC8, 0x1D, 0xAD, 0x8A, 0x21, 0xD3, 0x54, 0x8F, 0x20, 0xBE, 0x06, 0x3D, 0x34, 0xE4,\n    0x95, 0x78, 0x55, 0x8E, 0x70, 0xC5, 0xB5, 0x3B, 0x68, 0x58, 0x2F, 0xC2, 0x16, 0xEC, 0x7F, 0x85,\n    0xC0, 0x05, 0x28, 0xB7, 0xBF, 0x33, 0x3F, 0x0D, 0x83, 0xC7, 0x93, 0x36, 0x97, 0x24, 0x18, 0x0A,\n    0x43, 0x28, 0xFF, 0x90, 0xA1, 0x38, 0xF5, 0xCE, 0x27, 0xCA, 0xD7, 0x47, 0x46, 0xBD, 0x40, 0x7A,\n    0xF2, 0x49, 0x2D, 0x56, 0x1B, 0xAD, 0xDA, 0x00, 0x51, 0x74, 0x44, 0xA3, 0x09, 0x25, 0xE7, 0xB9,\n    0x13, 0xA8, 0x51, 0xED, 0xED, 0xDB, 0xB1, 0x54, 0xFB, 0x5F, 0x38, 0x30, 0x0D, 0x4B, 0x4B, 0x92,\n    0xB5, 0x2B, 0x45, 0x5E, 0x41, 0xFB, 0x27, 0xC4, 0x17, 0xDF, 0x82, 0x3D, 0x9C, 0xD3, 0xF9, 0x8A,\n    0x0E, 0x4A, 0x2F, 0xA1, 0x4D, 0xF4, 0x7C, 0x26, 0xFB, 0x8A, 0xA9, 0xBC, 0xB3, 0xE8, 0x3D, 0x11,\n    0x5A, 0x2B, 0x9D, 0x7D, 0xDA, 0xE7, 0x85, 0x19, 0x9F, 0x78, 0x70, 0x5A, 0x5C, 0xDE, 0x88, 0x40,\n    0x8C, 0x09, 0x5A, 0x0A, 0x2E, 0x0C, 0x6E, 0xF2, 0xFA, 0x9A, 0x00, 0xAC, 0x2A, 0x29, 0xB1, 0x30,\n    0xB1, 0x19, 0x0A, 0x1E, 0x01, 0x6C, 0x02, 0x2F, 0x6F, 0x1D, 0xDF, 0x77, 0x45, 0xF6, 0x81, 0x1F,\n    0xBC, 0x2D, 0x55, 0x2D, 0x31, 0xC9, 0x34, 0x9A, 0xE3, 0x04, 0xC7, 0xD1, 0x1D, 0xA2, 0xE1, 0x5D,\n    0xD4, 0xFF, 0x2F, 0xD5, 0x74, 0x1B, 0xAF, 0x49, 0xA3, 0x2A, 0xE2, 0x31, 0x8D, 0x7E, 0x3B, 0x21,\n    0x64, 0x54, 0x8D, 0x52, 0x64, 0x58, 0x96, 0xFF, 0x83, 0x4F, 0x43, 0xA8, 0x4A, 0xDD, 0xB0, 0xFE,\n    0xC7, 0x4F, 0x8C, 0xDD, 0xA3, 0x02, 0x30, 0xCA, 0xC2, 0xB2, 0x59, 0x17, 0x5D, 0xB3, 0xD7, 0x0A,\n    0x66, 0x4D, 0xF6, 0x7B, 0x38, 0xA2, 0x67, 0xDA, 0x37, 0x3C, 0x69, 0xF0, 0x89, 0xE5, 0x57, 0xBA,\n    0xAF, 0x7C, 0x0C, 0x64, 0x3A, 0x5B, 0x8D, 0xD5, 0x33, 0xE4, 0xBC, 0xFD, 0x45, 0x44, 0x04, 0x23,\n    0xDB, 0x03, 0x3D, 0xCD, 0xA1, 0xA8, 0x6A, 0xE6, 0x9E, 0xDB, 0x1D, 0xBF, 0x10, 0xBB, 0x32, 0xD8,\n    0x6A, 0x47, 0xDB, 0x83, 0x24, 0xE4, 0x1B, 0x4C, 0xC3, 0xDE, 0x5B, 0x3D, 0xD5, 0x1E, 0x69, 0x51,\n    0xA3, 0x94, 0xFF, 0x97, 0x54, 0x44, 0xDF, 0x20, 0x41, 0xD8, 0xE2, 0xFE, 0x72, 0xC7, 0x0B, 0x99,\n    0x0B, 0x1D, 0x49, 0x09, 0xA9, 0xBE, 0xE4, 0x66, 0xD1, 0x16, 0x49, 0x8A, 0xE9, 0xBD, 0x7D, 0xEF,\n    0xCF, 0xE2, 0x69, 0x2A, 0x51, 0x28, 0xCC, 0xD6, 0x80, 0xC7, 0xCE, 0x9C, 0x9E, 0x20, 0x1D, 0x42,\n    0x00, 0x5F, 0x3C, 0xCC, 0x0B, 0x10, 0x40, 0xE3, 0x7A, 0xB6, 0x2A, 0x34, 0xB6, 0x44, 0x50, 0x6F,\n    0x9B, 0x6E, 0xC5, 0xE5, 0xE1, 0x94, 0x0D, 0x0C, 0x9B, 0xF7, 0x35, 0x91, 0xFD, 0xCE, 0x65, 0x1A,\n    0x79, 0xE1, 0x20, 0x69, 0xAD, 0xB4, 0x92, 0xC2, 0x58, 0x85, 0xF9, 0x45, 0x1C, 0x98, 0x46, 0xC7,\n    0x23, 0xA4, 0xDD, 0x81, 0x7C, 0x93, 0x81, 0x55, 0x1D, 0x47, 0x7B, 0x23, 0x18, 0xB4, 0x7D, 0xFF,\n    0x03, 0xA5, 0xE0, 0x78, 0xE3, 0x57, 0xA3, 0x17, 0xB3, 0xB1, 0x01, 0x88, 0x03, 0xA9, 0x10, 0x0B,\n    0x35, 0xFE, 0x67, 0xFA, 0x67, 0x6F, 0xD3, 0xF5, 0x25, 0xCB, 0x75, 0xA0, 0x4F, 0x39, 0xD6, 0x5B,\n    0xD0, 0x65, 0xD7, 0xA8, 0x77, 0xBB, 0xD8, 0x60, 0xAF, 0x2B, 0x9D, 0x37, 0x19, 0xFA, 0x83, 0xF8,\n    0x52, 0x57, 0xDA, 0x2D, 0xEF, 0xBC, 0x17, 0xAA, 0xC6, 0x97, 0xF4, 0xC5, 0xEF, 0x16, 0x81, 0xA7,\n    0xBF, 0x27, 0x49, 0xEA, 0x7A, 0x23, 0x6F, 0x31, 0x6D, 0x62, 0x5B, 0xB6, 0xF3, 0x61, 0xE1, 0xFA,\n    0x87, 0x72, 0xE8, 0xE1, 0x0C, 0x89, 0x6B, 0x53, 0xF0, 0x7F, 0x09, 0x9D, 0x7E, 0x1D, 0x8C, 0x02,\n    0xFE, 0x29, 0xAA, 0xBD, 0x6C, 0xB1, 0x68, 0x67, 0xCC, 0xA6, 0xEA, 0xAE, 0xA9, 0x84, 0xDD, 0xC4,\n    0x44, 0xF7, 0x2E, 0x22, 0x8C, 0xA5, 0x07, 0xE7, 0xEE, 0xE5, 0xC6, 0xB5, 0xF3, 0x5A, 0x41, 0xD4,\n    0x02, 0x2A, 0xE6, 0x1E, 0x79, 0x5C, 0x4B, 0x1B, 0xED, 0x9F, 0x2A, 0xBA, 0xB6, 0x0E, 0x9B, 0xAB,\n    0x83, 0x2D, 0xF0, 0x84, 0x35, 0x83, 0xA2, 0xF4, 0x2C, 0xB6, 0x2F, 0x4C, 0xE9, 0x8B, 0xF6, 0xA4,\n    0x5C, 0x8A, 0xEC, 0x01, 0x9A, 0x2E, 0x80, 0xC0, 0x6C, 0x5B, 0xAC, 0x92, 0x07, 0xAB, 0x93, 0x2D,\n    0x5D, 0x77, 0x7A, 0xA3, 0xA1, 0xDB, 0x8F, 0x05, 0x51, 0xD9, 0x92, 0x98, 0x1E, 0xD1, 0x23, 0x01,\n    0xEC, 0x7E, 0xB7, 0xB8, 0x4F, 0xA7, 0xCD, 0xCC, 0x5F, 0x76, 0x64, 0xDD, 0x06, 0xA9, 0xC9, 0x98,\n    0xD2, 0x3C, 0xB8, 0x06, 0x4B, 0x79, 0x28, 0x9E, 0x14, 0x10, 0xFB, 0x39, 0xDC, 0xF9, 0xE1, 0xE5,\n    0x27, 0xFB, 0x89, 0x8C, 0x66, 0xB6, 0xFE, 0xC1, 0x13, 0x0F, 0x7C, 0xAA, 0x6A, 0x02, 0x45, 0xB1,\n    0x18, 0xD8, 0x3A, 0x2C, 0x94, 0x09, 0x8B, 0x66, 0xED, 0xE9, 0xD7, 0x5E, 0xA2, 0x48, 0x01, 0x8D,\n    0x8D, 0xC7, 0x05, 0x6A, 0xD3, 0x67, 0x07, 0xFC, 0x22, 0x28, 0xE8, 0x0F, 0xCD, 0xFF, 0x12, 0xD5,\n    0xED, 0x64, 0x3F, 0xE5, 0x89, 0x08, 0x41, 0x2C, 0x49, 0x4D, 0x07, 0x7D, 0xF8, 0x2C, 0x28, 0xB5,\n    0x2F, 0xCB, 0xF6, 0xC0, 0x68, 0xDB, 0x0E, 0xFF, 0x92, 0x06, 0xCC, 0x15, 0x17, 0xDD, 0xA7, 0xF4,\n    0xA9, 0x7C, 0x49, 0xFF, 0x91, 0x8B, 0xBE, 0xA5, 0xDC, 0x43, 0x5B, 0xD9, 0x17, 0x17, 0x4A, 0xBC,\n    0x27, 0xAC, 0x90, 0xC4, 0xC7, 0x68, 0x9F, 0x84, 0x29, 0x4E, 0x52, 0xF4, 0x6D, 0x29, 0x30, 0xA7,\n    0xB4, 0x87, 0x42, 0x4F, 0x93, 0x1D, 0x71, 0x7A, 0xC4, 0x97, 0x7C, 0xEB, 0xB1, 0x55, 0xDA, 0x95,\n    0xA5, 0x48, 0xC8, 0xA3, 0xFF, 0x2E, 0xE0, 0x2F, 0x5B, 0xE1, 0xA3, 0x2A, 0x93, 0x2A, 0x34, 0x30,\n    0x19, 0x63, 0x45, 0xB1, 0x7D, 0x68, 0x95, 0x23, 0xCD, 0xE1, 0x79, 0x1B, 0x4D, 0x10, 0x45, 0x0C,\n    0x9B, 0xF3, 0x7A, 0x13, 0x78, 0xC1, 0x06, 0x09, 0x7E, 0x24, 0xAE, 0xDE, 0xB7, 0xE0, 0x91, 0x12,\n    0x4C, 0x0C, 0xA3, 0x0F, 0xA9, 0xFE, 0xB5, 0x2E, 0x13, 0x16, 0x87, 0x9F, 0x89, 0xBD, 0x33, 0x72,\n    0xF9, 0x34, 0xBC, 0x50, 0xA3, 0x60, 0x49, 0xED, 0x65, 0x04, 0xD3, 0xB7, 0x94, 0x95, 0x8D, 0xFA,\n    0xE9, 0xE5, 0x8C, 0x6F, 0x72, 0xEB, 0xE6, 0x21, 0x77, 0x6E, 0xCE, 0x77, 0xEE, 0xFC, 0xDA, 0x4E,\n    0x93, 0xDA, 0x1E, 0xCD, 0xA3, 0xB0, 0xB1, 0x40, 0x37, 0xC8, 0x7B, 0x3E, 0xFF, 0x8D, 0x99, 0xAF,\n    0xB7, 0x79, 0x18, 0x6D, 0xF6, 0xB0, 0x7E, 0xA1, 0xFD, 0x0F, 0x55, 0x98, 0x65, 0xCD, 0x74, 0x64,\n    0x4C, 0x97, 0x63, 0x48, 0xC1, 0x0C, 0x24, 0xBE, 0xC9, 0x92, 0x8E, 0x8F, 0x15, 0x66, 0x0A, 0x02,\n    0x13, 0xC2, 0x5B, 0x9F, 0xB2, 0x03, 0xD1, 0xC3, 0x0A, 0xCE, 0x56, 0x6E, 0x26, 0xD1, 0x55, 0x4E,\n    0xFA, 0xE9, 0xCB, 0x48, 0xA5, 0x74, 0xCC, 0x59, 0x54, 0x92, 0x40, 0x15, 0x07, 0x5D, 0x92, 0xAD,\n    0xCF, 0x7C, 0x75, 0x2D, 0x0C, 0xEE, 0x5B, 0x75, 0x99, 0xB5, 0x66, 0x9B, 0xC6, 0x62, 0xAC, 0x84,\n    0xC8, 0x69, 0x53, 0xA3, 0xD3, 0xAC, 0x64, 0x1F, 0x3C, 0x6B, 0xD4, 0xB8, 0x57, 0x79, 0x20, 0xDB,\n    0x28, 0xD8, 0x0B, 0xB0, 0x40, 0x72, 0x76, 0x40, 0x51, 0xEC, 0xBC, 0x36, 0x4A, 0xC7, 0x01, 0x55,\n    0x1D, 0x76, 0xE8, 0xB3, 0xF6, 0x5B, 0x38, 0x9A, 0x01, 0xFE, 0x00, 0xE0, 0x5B, 0xF6, 0x3F, 0x5D,\n    0xC2, 0x55, 0x0E, 0x1A, 0xB6, 0xC1, 0x88, 0x43, 0xB9, 0xB8, 0xE5, 0xDA, 0xF9, 0x6D, 0xBC, 0x96,\n    0x3F, 0xC5, 0xB3, 0xC2, 0x14, 0xFF, 0xB8, 0x24, 0x70, 0x4D, 0x8F, 0xF2, 0x65, 0xD9, 0x52, 0xE2,\n    0x6F, 0x95, 0x47, 0x0F, 0xEF, 0xD3, 0xBD, 0xF0, 0x93, 0xF6, 0x77, 0x7C, 0x4B, 0xDD, 0x09, 0xA1,\n    0x9D, 0x14, 0xB7, 0x09, 0x75, 0x5A, 0xD5, 0xE7, 0xCD, 0xB4, 0x4E, 0xC9, 0xB2, 0xCC, 0xEB, 0xA7,\n    0x13, 0x8D, 0xF1, 0xBE, 0x7B, 0xF1, 0x3C, 0x03, 0xDC, 0xAE, 0x73, 0x50, 0xC1, 0x79, 0xDC, 0x1E,\n    0xC1, 0x3A, 0xD1, 0x23, 0x9D, 0xF1, 0xF3, 0x87, 0x18, 0x5B, 0x97, 0x09, 0x53, 0xF2, 0x61, 0x89,\n    0x2D, 0xD7, 0x20, 0x3F, 0x40, 0x85, 0x83, 0x1F, 0x69, 0xB0, 0xF7, 0x07, 0x48, 0x50, 0x2D, 0x2D,\n    0xEF, 0xA8, 0x1A, 0x9F, 0x0B, 0xC1, 0xA5, 0x3C, 0xAD, 0x43, 0x59, 0x8A, 0xAA, 0x64, 0x6C, 0x60,\n    0x50, 0x67, 0x3B, 0x52, 0x61, 0x3D, 0x8B, 0x7B, 0xA5, 0x2D, 0x04, 0x7E, 0xE5, 0xEB, 0xE7, 0x79,\n    0x69, 0xD1, 0x05, 0xAE, 0xA2, 0x20, 0x7A, 0xC7, 0x68, 0x8A, 0xCA, 0xBE, 0xBF, 0x27, 0x0C, 0xB3,\n    0x49, 0x05, 0x16, 0x83, 0x7F, 0x29, 0x87, 0x1E, 0x58, 0x94, 0x76, 0xEA, 0xEA, 0xC5, 0x43, 0x3B,\n    0xB3, 0x17, 0xB6, 0x41, 0x3C, 0x59, 0x03, 0x20, 0x83, 0x78, 0x57, 0xD8, 0x9A, 0x69, 0x2C, 0xEE,\n    0x27, 0xCC, 0xC1, 0xAA, 0x7F, 0x52, 0x3A, 0x81, 0x04, 0xC3, 0xCD, 0x64, 0xC0, 0xAF, 0xCF, 0xF8,\n    0xB2, 0x34, 0x8A, 0x94, 0xBD, 0xF7, 0x83, 0x0D, 0x16, 0xE7, 0xB0, 0x47, 0xA2, 0xFA, 0xD6, 0xA7,\n    0x3E, 0xDF, 0xE1, 0x3A, 0xBA, 0x87, 0xA7, 0xF3, 0x8C, 0x5B, 0xB2, 0x28, 0x88, 0x4A, 0x13, 0x69,\n    0x1C, 0xEF, 0x07, 0xAE, 0xC4, 0xCE, 0x95, 0x0D, 0x49, 0x1E, 0x11, 0x96, 0x79, 0x72, 0xEB, 0xA5,\n    0x3E, 0x86, 0x6B, 0x80, 0xF8, 0xE2, 0xAF, 0x28, 0x70, 0x22, 0xE0, 0x07, 0x98, 0xD9, 0xE5, 0x0A,\n    0x45, 0xD1, 0x9A, 0xD9, 0x86, 0x85, 0xEE, 0x92, 0xCC, 0x9B, 0x3A, 0xB6, 0xFE, 0x3F, 0x17, 0x59,\n    0x53, 0xE1, 0xDA, 0xF0, 0x7A, 0x3B, 0x28, 0xD6, 0x28, 0xFD, 0xA2, 0xE6, 0x49, 0xBA, 0x68, 0x99,\n    0x32, 0x89, 0x73, 0xB1, 0x87, 0xA8, 0x3E, 0x84, 0x70, 0xE9, 0xD4, 0x22, 0x24, 0x89, 0x20, 0x01,\n    0xAF, 0x1B, 0xD9, 0xB5, 0x51, 0xA6, 0xFB, 0x67, 0x26, 0x9A, 0x89, 0x47, 0x85, 0x52, 0xB6, 0x0B,\n    0xD4, 0x6B, 0xEE, 0xF4, 0xEF, 0x44, 0xD8, 0x27, 0x74, 0xBA, 0x1E, 0x3C, 0x45, 0x68, 0xFF, 0x93,\n    0xDE, 0x4F, 0x03, 0xA7, 0xC1, 0xB9, 0x11, 0xD3, 0x27, 0xEB, 0x78, 0x40, 0x68, 0xF5, 0x1D, 0x78,\n    0xE9, 0x24, 0x47, 0x3E, 0x80, 0x87, 0xF7, 0xE1, 0x87, 0xDA, 0xA0, 0xE3, 0x79, 0xA6, 0x61, 0x80,\n    0xFD, 0x1A, 0xEB, 0x03, 0x7F, 0xE9, 0x50, 0x00, 0xD3, 0x1E, 0xBC, 0x6D, 0x65, 0xA2, 0xD5, 0x09,\n    0x53, 0x3E, 0x60, 0x54, 0x6D, 0xD0, 0x2E, 0x01, 0x04, 0xA6, 0x13, 0xEE, 0xC0, 0x72, 0x8A, 0x66,\n    0x09, 0x91, 0x56, 0x84, 0x40, 0xFC, 0x8D, 0x35, 0x01, 0xE2, 0x13, 0x76, 0x4E, 0x63, 0xCE, 0xE8,\n    0xF0, 0xD9, 0x0F, 0x09, 0xBA, 0x19, 0x44, 0x4B, 0x44, 0x79, 0xAB, 0xF5, 0xE2, 0x48, 0x92, 0x3F,\n    0xD9, 0x16, 0x57, 0xCA, 0x94, 0x82, 0x9E, 0xFE, 0x02, 0x24, 0x93, 0xAE, 0xF2, 0xF3, 0x2B, 0xCE,\n    0x0A, 0x17, 0x91, 0x5D, 0x90, 0x97, 0x74, 0x13, 0x59, 0x8B, 0x16, 0xB4, 0x65, 0xD2, 0xFF, 0x5C,\n    0x91, 0x35, 0xB8, 0x6D, 0xA0, 0xEA, 0xCB, 0x07, 0xD2, 0x88, 0x6E, 0x8C, 0xF1, 0xC3, 0x9C, 0x6E,\n    0x25, 0xDC, 0xC4, 0x16, 0x73, 0x2B, 0xEA, 0x87, 0xAC, 0x60, 0x7B, 0x0D, 0x50, 0xFF, 0xE8, 0x24,\n    0xB2, 0x77, 0xEF, 0xFD, 0x5D, 0x93, 0x16, 0x62, 0xF5, 0x47, 0x17, 0x5B, 0x3E, 0x0B, 0x55, 0x93,\n    0xCD, 0x04, 0xCD, 0xB2, 0x51, 0xFC, 0x78, 0x0A, 0x4E, 0xAD, 0x07, 0x46, 0xC3, 0x66, 0xE5, 0xA6,\n    0xB7, 0xE4, 0xE2, 0x71, 0x99, 0xA8, 0x44, 0x5B, 0xD6, 0x3D, 0x63, 0x7A, 0x3A, 0x4F, 0x15, 0x6E,\n    0x3E, 0x07, 0x23, 0xDB, 0xBF, 0xD6, 0x78, 0x2B, 0x51, 0x73, 0xCF, 0x48, 0xB3, 0x2C, 0x6A, 0xB6,\n    0x8A, 0x3D, 0x5D, 0x25, 0xA7, 0x70, 0x8D, 0x5A, 0x44, 0x2D, 0x1B, 0x24, 0x4C, 0x27, 0xAA, 0x02,\n    0xE3, 0x57, 0x79, 0xA1, 0x74, 0x0F, 0x73, 0x5F, 0xD2, 0x09, 0x64, 0xE7, 0x26, 0xE6, 0xC3, 0xA4,\n    0x15, 0x90, 0x12, 0x68, 0x54, 0x4A, 0xAF, 0xA5, 0x01, 0x0C, 0x10, 0x1D, 0x22, 0xF3, 0x79, 0xAF,\n    0xED, 0xA4, 0x68, 0x58, 0x4B, 0x97, 0x6F, 0xE9, 0x2B, 0x59, 0x4B, 0x61, 0x91, 0x87, 0x0D, 0x33,\n    0x2C, 0x75, 0xAA, 0x19, 0x93, 0x81, 0xC1, 0xD0, 0x5D, 0xA6, 0xA4, 0xE4, 0x85, 0x1C, 0xBC, 0x32,\n    0xA7, 0xB5, 0x36, 0x3F, 0x26, 0x57, 0xAB, 0xAA, 0xEC, 0x9F, 0xC8, 0x74, 0x08, 0x83, 0x4B, 0x09,\n    0xE1, 0x22, 0x94, 0xD5, 0xD8, 0xB4, 0xAA, 0x90, 0xFD, 0x34, 0x14, 0x27, 0xCA, 0x6B, 0x9A, 0x5A,\n    0x30, 0x2D, 0x75, 0x6D, 0x01, 0x6D, 0x17, 0xCB, 0xEF, 0xA6, 0x3F, 0x36, 0xE2, 0xB2, 0x6B, 0x81,\n    0x3E, 0xAF, 0x8C, 0x92, 0x70, 0x43, 0xA1, 0x1D, 0x09, 0x61, 0x71, 0x6B, 0x0E, 0x53, 0x0F, 0x6B,\n    0x00, 0x32, 0xAC, 0x78, 0xCC, 0x2D, 0xC9, 0x42, 0x0C, 0x70, 0x3F, 0xDF, 0x52, 0x5C, 0xD4, 0x43,\n    0xC7, 0xAC, 0x1C, 0x17, 0xE2, 0xC0, 0x75, 0x8B, 0xF8, 0xC8, 0xD2, 0xE1, 0x69, 0xB1, 0x86, 0x07,\n    0x82, 0x37, 0xB9, 0x4A, 0x5F, 0xC6, 0x4F, 0x95, 0x86, 0x1B, 0x6D, 0x2B, 0xEB, 0x21, 0xD2, 0x84,\n    0xD6, 0x4B, 0xFA, 0xBF, 0x54, 0x41, 0x34, 0xA8, 0x5C, 0x86, 0x23, 0x3A, 0x3D, 0xB6, 0x0C, 0x97,\n    0x28, 0x8B, 0xBB, 0xE8, 0xF6, 0xC0, 0x68, 0xE5, 0x83, 0x21, 0x60, 0xF0, 0xE8, 0x8D, 0x80, 0xFA,\n    0x1F, 0xAC, 0x32, 0xC6, 0x1D, 0x17, 0xD2, 0x3E, 0x57, 0xEB, 0x81, 0x68, 0x28, 0x0B, 0x36, 0x6F,\n    0x3C, 0x08, 0xA3, 0xEB, 0xEE, 0xF0, 0x25, 0x24, 0xB2, 0x70, 0xC5, 0x62, 0xA9, 0xC8, 0x48, 0xDC,\n    0xA1, 0x02, 0x49, 0x0E, 0xE8, 0x19, 0xBE, 0xFC, 0x8C, 0x8E, 0xC4, 0xBE, 0x9D, 0x6A, 0xDB, 0x70,\n    0xDC, 0x78, 0xE1, 0xD4, 0xD1, 0xA4, 0xC8, 0x57, 0x3E, 0xC7, 0x40, 0xA6, 0xF0, 0xA9, 0x83, 0x12,\n    0x76, 0x52, 0x4D, 0xB0, 0xBB, 0xBA, 0xE4, 0x85, 0x93, 0xBF, 0x6D, 0x71, 0x2C, 0x18, 0x57, 0xDE,\n    0x57, 0x24, 0x8E, 0x33, 0xD7, 0xF9, 0x36, 0xE6, 0x3B, 0x63, 0x3B, 0x71, 0xB6, 0xF5, 0x9C, 0x4D,\n    0x2C, 0xC3, 0x55, 0x7B, 0xDB, 0xD9, 0x1F, 0x7D, 0xC7, 0x2B, 0x4E, 0x65, 0x3C, 0xD4, 0xFD, 0xEC,\n    0x01, 0xA6, 0xD8, 0xDB, 0x4F, 0x0A, 0x76, 0xF2, 0x3E, 0x3E, 0x16, 0xB5, 0xE9, 0xBB, 0xE7, 0x8B,\n    0xDF, 0x8D, 0x60, 0x80, 0x79, 0xB5, 0xC6, 0x79, 0x1E, 0x9A, 0xDB, 0x53, 0xB4, 0x80, 0x6C, 0x9C,\n    0xC9, 0x97, 0x7C, 0x0E, 0xAF, 0x41, 0xF9, 0x4C, 0x5E, 0xA4, 0xA4, 0x46, 0x85, 0xF2, 0x9A, 0xAE,\n    0xFE, 0xC5, 0xB0, 0xB7, 0x16, 0x07, 0x03, 0x89, 0x27, 0x3F, 0x53, 0x92, 0x3E, 0x85, 0xE3, 0x23,\n    0xE4, 0x72, 0x1F, 0xD7, 0x77, 0xCF, 0x3E, 0x57, 0xB3, 0x1F, 0xD8, 0x5D, 0x0C, 0xE2, 0xD1, 0xD6,\n    0xCF, 0x20, 0xB0, 0xE1, 0x80, 0x38, 0xF6, 0xEF, 0x91, 0xD3, 0xD7, 0x2E, 0xDE, 0xA3, 0xEA, 0x77,\n    0x44, 0xAF, 0xDC, 0x9A, 0x13, 0x19, 0x75, 0x28, 0x85, 0x61, 0xE5, 0x40, 0x8C, 0xE3, 0xF9, 0x5A,\n    0xEC, 0x2A, 0x5C, 0x29, 0x12, 0x7B, 0x13, 0xBC, 0x21, 0x4D, 0x79, 0xF8, 0xEF, 0xD4, 0xEB, 0xA2,\n    0x95, 0x43, 0xC5, 0xB5, 0x9E, 0x5B, 0x11, 0xAB, 0xE1, 0x9E, 0xB3, 0x76, 0xFF, 0x05, 0xD5, 0x42,\n    0x4F, 0x92, 0x47, 0x58, 0x7A, 0xE2, 0x4D, 0x58, 0x8F, 0x95, 0xC4, 0xDC, 0xC3, 0xD4, 0x4A, 0x78,\n    0x8A, 0xB7, 0x9B, 0x5D, 0x2D, 0x51, 0xFA, 0x4B, 0x10, 0x7B, 0x92, 0xF0, 0x66, 0xEC, 0x7C, 0x01,\n    0xCA, 0xEE, 0x5F, 0xB8, 0x45, 0x78, 0x54, 0x87, 0xB8, 0xDF, 0xDE, 0x80, 0xE8, 0xAD, 0x3A, 0xB7,\n    0xA6, 0xB2, 0x60, 0xC4, 0xA0, 0xE0, 0x42, 0x13, 0x38, 0xED, 0xFF, 0xB4, 0x77, 0xA8, 0xF4, 0xE7,\n    0xF7, 0xE8, 0x71, 0xAE, 0x93, 0x3D, 0xA0, 0xCE, 0xB5, 0x55, 0xC9, 0x5F, 0xE0, 0x65, 0x4F, 0x2C,\n    0xD6, 0x31, 0x7B, 0x61, 0x8E, 0x45, 0x00, 0x02, 0x97, 0x4F, 0x0F, 0xB9, 0x05, 0x03, 0xC4, 0xC2,\n    0xBE, 0x3C, 0x4C, 0x2C, 0xB5, 0x04, 0x22, 0x7F, 0x7E, 0x16, 0x3E, 0xC1, 0xC7, 0xBD, 0x6A, 0xEB,\n    0x10, 0xA6, 0x15, 0x78, 0x6C, 0x66, 0x55, 0x7D, 0xFA, 0xE0, 0x2B, 0xD0, 0x88, 0xAB, 0x80, 0x71,\n    0x6D, 0x2B, 0xD9, 0xC3, 0x39, 0x7A, 0x6F, 0x39, 0xCC, 0xC0, 0x17, 0x73, 0xC8, 0x58, 0x21, 0x63,\n    0xF5, 0x7F, 0x99, 0xF7, 0xC7, 0x46, 0xFC, 0x2B, 0xE3, 0x3B, 0x66, 0x73, 0x0E, 0x90, 0x4A, 0xC3,\n    0x48, 0xCE, 0xDB, 0x39, 0x46, 0xF9, 0xE9, 0x7B, 0x33, 0xCD, 0x9B, 0x8B, 0x3E, 0x21, 0x55, 0x35,\n    0xAE, 0x71, 0xFE, 0xA4, 0x2E, 0xC9, 0xC8, 0xA0, 0x1E, 0x97, 0x10, 0x6A, 0x29, 0x95, 0xFC, 0xCD,\n    0xE0, 0xEC, 0x37, 0x95, 0xFA, 0x61, 0xB5, 0x62, 0x5C, 0xC5, 0xEA, 0xDF, 0x8D, 0xA7, 0xC2, 0xF7,\n    0x4A, 0xC9, 0x34, 0x15, 0xA4, 0x8C, 0x63, 0xA5, 0x16, 0x25, 0x4F, 0xA9, 0x89, 0xD7, 0x2D, 0x77,\n    0x0D, 0x5E, 0xC1, 0x32, 0x2A, 0x86, 0x55, 0x80, 0x97, 0xD1, 0x8C, 0x98, 0x04, 0x5A, 0x89, 0xC9,\n    0xD1, 0x5F, 0x00, 0x5E, 0x29, 0x2C, 0xEB, 0x17, 0x96, 0x6A, 0xEB, 0x9A, 0xEA, 0x5F, 0x2D, 0x99,\n    0x3D, 0x47, 0xCD, 0xFA, 0xA7, 0x8B, 0xFA, 0xB8, 0x16, 0x1A, 0xE7, 0x07, 0x85, 0x47, 0xB6, 0x3F,\n    0xBD, 0x96, 0x4C, 0xD2, 0xE8, 0xBE, 0x78, 0xE0, 0xFE, 0xF8, 0xD7, 0x9F, 0x05, 0xC2, 0xDF, 0x2F,\n    0x1D, 0x8C, 0xDC, 0xDF, 0x4C, 0x36, 0x06, 0xF5, 0xD3, 0xAD, 0xFC, 0x82, 0xB3, 0x7D, 0x47, 0xE3,\n    0xE6, 0x26, 0xD7, 0xA8, 0xC1, 0xA8, 0xD7, 0x73, 0x55, 0x0D, 0x99, 0x81, 0xE8, 0x97, 0x84, 0x22,\n    0x5D, 0x93, 0x7B, 0x83, 0xE3, 0x27, 0xEA, 0x60, 0x03, 0x2E, 0xC9, 0x71, 0xBB, 0x31, 0xF1, 0x4A,\n    0x4D, 0xEA, 0x5B, 0xAD, 0x29, 0x37, 0xAA, 0x4F, 0x6D, 0xEC, 0xBB, 0x00, 0x6A, 0xD9, 0x98, 0xDB,\n    0x08, 0x72, 0x8A, 0x94, 0xC8, 0x9C, 0x03, 0xC5, 0x02, 0x54, 0x46, 0xB5, 0x1E, 0x25, 0xD1, 0x50,\n    0x3C, 0x3E, 0xE0, 0x55, 0x89, 0x28, 0xC0, 0xE3, 0x08, 0x1A, 0x26, 0x9C, 0x4D, 0x74, 0x57, 0x09,\n    0x34, 0xB3, 0x2D, 0x21, 0xA0, 0x4E, 0x9B, 0xB2, 0x93, 0xC0, 0x7A, 0x52, 0xAC, 0x0D, 0x2B, 0xAA,\n    0x5F, 0xCF, 0x9E, 0x94, 0x88, 0x0D, 0xCB, 0x30, 0x74, 0xC7, 0x6B, 0x78, 0x5E, 0xEE, 0x24, 0xC4,\n    0xA8, 0x0B, 0x84, 0x2D, 0xD7, 0xEC, 0x31, 0xA8, 0xE3, 0x62, 0xC8, 0x43, 0x6A, 0x12, 0x0E, 0x46,\n    0xEE, 0x86, 0x33, 0x4B, 0xF9, 0xA6, 0x52, 0x96, 0x6D, 0xA1, 0xD2, 0x1C, 0x50, 0xEC, 0xEE, 0x53,\n    0xE8, 0x7E, 0xD4, 0xE1, 0x41, 0x76, 0x6E, 0xF7, 0x66, 0x89, 0x46, 0xA6, 0xC9, 0x06, 0x32, 0xCC,\n    0x13, 0x23, 0x80, 0xE8, 0x3E, 0x93, 0x52, 0x05, 0x78, 0x1A, 0x02, 0xAA, 0x5C, 0x11, 0xD7, 0xF0,\n    0x39, 0x77, 0x06, 0x4F, 0xB3, 0x4B, 0x8E, 0x9D, 0x84, 0x00, 0x3A, 0xEE, 0x03, 0xFD, 0x48, 0xBA,\n    0xA7, 0x23, 0x59, 0xBE, 0x43, 0x7B, 0x2F, 0xA0, 0x23, 0x6F, 0x9A, 0xE9, 0xB0, 0xC2, 0x84, 0x1A,\n    0x9F, 0x5A, 0x39, 0x22, 0xB6, 0x78, 0x21, 0x86, 0xDD, 0xEC, 0x37, 0x24, 0x1C, 0xB1, 0xD8, 0x7C,\n    0x88, 0xAB, 0xC3, 0x9F, 0xA1, 0x3C, 0xBA, 0xF8, 0x1C, 0x43, 0x41, 0xB2, 0x12, 0x3C, 0x16, 0x38,\n    0xD6, 0x58, 0xFF, 0xBF, 0x73, 0xEA, 0xFE, 0x63, 0xE0, 0x36, 0xA4, 0xE7, 0x38, 0xA2, 0xA5, 0xB2,\n    0xEF, 0xE0, 0x7B, 0x32, 0xCC, 0x34, 0x0A, 0x32, 0x23, 0x14, 0xCE, 0xE9, 0xDC, 0xC7, 0xF1, 0x85,\n    0x79, 0x19, 0x4B, 0xC2, 0x39, 0xC8, 0x57, 0x2A, 0xDD, 0x19, 0x6D, 0x10, 0xC9, 0x3E, 0x39, 0x13,\n    0x5A, 0xC3, 0x33, 0xC5, 0xB1, 0x6D, 0xD8, 0x8B, 0x35, 0x14, 0x9C, 0x67, 0xE6, 0x58, 0xC9, 0x0C,\n    0xE6, 0xC7, 0x59, 0xCA, 0xA7, 0xB6, 0x10, 0x8B, 0x44, 0x2D, 0x8D, 0x12, 0xC3, 0xC3, 0xEE, 0x58,\n    0xB9, 0xFA, 0x60, 0xBD, 0xAB, 0x29, 0xD4, 0xB9, 0x86, 0xA1, 0x2D, 0x8F, 0x62, 0xE4, 0x19, 0x9A,\n    0x71, 0xC2, 0xF4, 0xA5, 0x93, 0x04, 0xBB, 0x8D, 0x64, 0xB5, 0x40, 0x8C, 0x8B, 0xA6, 0x52, 0xCE,\n    0xE3, 0x95, 0x53, 0xEA, 0x14, 0x21, 0x7C, 0x64, 0xCE, 0xCA, 0x69, 0xE9, 0x3F, 0xD9, 0xB7, 0xD4,\n    0xB3, 0xB3, 0xC2, 0x82, 0x64, 0xA2, 0x23, 0xC6, 0xE6, 0x8A, 0x5F, 0xFE, 0xFA, 0x06, 0xE6, 0x5F,\n    0xA2, 0x82, 0x3B, 0x4E, 0x89, 0xAA, 0xCF, 0xCB, 0x18, 0xA1, 0x69, 0x65, 0x93, 0xA8, 0x19, 0xC7,\n    0x78, 0x6F, 0x94, 0x9A, 0x2F, 0x1F, 0x5B, 0x47, 0x30, 0x06, 0xBE, 0x59, 0x5D, 0x84, 0xDB, 0xDF,\n    0xAC, 0xAF, 0x91, 0x8A, 0x39, 0x28, 0xB4, 0xA1, 0x68, 0x2D, 0x4F, 0x39, 0x64, 0xC3, 0x92, 0xB7,\n    0x31, 0x38, 0xAE, 0x87, 0xD1, 0xCD, 0xB8, 0x11, 0xD4, 0xF6, 0xEA, 0x06, 0xB6, 0xB2, 0x22, 0xE8,\n    0x46, 0x7C, 0xB3, 0xC4, 0x93, 0xD1, 0x19, 0x2D, 0xEE, 0x9B, 0xAC, 0x1E, 0x9C, 0xEE, 0x6C, 0x85,\n    0x6F, 0x35, 0xAC, 0x97, 0x3E, 0x97, 0xD0, 0x50, 0x38, 0x59, 0xF8, 0x5E, 0xB0, 0x3D, 0xAA, 0x9E,\n    0x8F, 0x78, 0x51, 0x04, 0xE0, 0x01, 0x8C, 0xF3, 0xE3, 0x9F, 0x59, 0x11, 0x7D, 0x5F, 0xC9, 0xDB,\n    0xA3, 0x99, 0xA6, 0xE2, 0x65, 0x90, 0x75, 0xDD, 0xEC, 0x59, 0x60, 0x19, 0x70, 0x66, 0x12, 0x0B,\n    0x27, 0x26, 0xC2, 0x3B, 0x5B, 0xDB, 0x6F, 0x11, 0x39, 0x08, 0xDC, 0xF4, 0x14, 0x51, 0x06, 0xFE,\n    0x9B, 0xDB, 0x22, 0x25, 0x1E, 0x25, 0x43, 0x8D, 0xD5, 0xD0, 0xFB, 0x68, 0xF3, 0x65, 0xEA, 0x97,\n    0x20, 0xDD, 0x60, 0x7B, 0xB4, 0xE0, 0x90, 0x24, 0x62, 0xF6, 0x84, 0xF0, 0x47, 0xD6, 0xB9, 0xE3,\n    0xB8, 0x16, 0x6A, 0xDB, 0xA7, 0xF7, 0xFD, 0xFC, 0x74, 0x1F, 0x8C, 0xFD, 0x88, 0x4A, 0xE9, 0xEE,\n    0xFE, 0xCC, 0xE5, 0xA0, 0x2C, 0x1D, 0xAE, 0xD0, 0xF3, 0x56, 0xBE, 0xD8, 0x45, 0xC4, 0x44, 0xEA,\n    0xD7, 0x71, 0x34, 0x7C, 0x2A, 0x0A, 0x3F, 0xD1, 0xA8, 0xCA, 0xF1, 0x7E, 0x9C, 0x39, 0x6B, 0x51,\n    0xBD, 0xDB, 0x56, 0x87, 0xAC, 0xDF, 0x31, 0xF9, 0xC0, 0x73, 0xDB, 0xBC, 0x0D, 0x1D, 0xD7, 0x8B,\n    0xBB, 0x50, 0x3B, 0xE7, 0xB5, 0xE9, 0x6A, 0x3B, 0x83, 0xF8, 0x27, 0xE8, 0x7C, 0xD1, 0x8D, 0x14,\n    0xDD, 0x5A, 0xDF, 0xD1, 0xBE, 0xBA, 0xFD, 0x3E, 0xF8, 0xA4, 0x8A, 0xED, 0xAD, 0x82, 0xFD, 0x28,\n    0x3F, 0x46, 0x1C, 0x56, 0x71, 0x71, 0x71, 0xFB, 0x1F, 0xEB, 0xE6, 0x72, 0x10, 0x40, 0xDB, 0xA3,\n    0x40, 0xEA, 0x06, 0x63, 0x74, 0xE7, 0xC3, 0xA9, 0xE4, 0x07, 0xFD, 0xA8, 0x5C, 0x83, 0x16, 0x69,\n    0xB4, 0x6A, 0xAE, 0x85, 0xFC, 0x32, 0xDF, 0x59, 0x71, 0xBB, 0x7A, 0xC1, 0xC2, 0x0E, 0xC0, 0x5A,\n    0xA1, 0x1F, 0x88, 0x6E, 0xF4, 0x79, 0xF2, 0x4F, 0xA5, 0x84, 0x8B, 0xA7, 0x39, 0xCC, 0x6D, 0x44,\n    0x33, 0xD8, 0x1A, 0x9B, 0xAD, 0x8F, 0x12, 0x49, 0x63, 0x93, 0xBB, 0x70, 0xA7, 0x9D, 0x4A, 0x69,\n    0xDC, 0x18, 0x09, 0xB8, 0xED, 0xB1, 0x50, 0x13, 0x59, 0xEA, 0xDC, 0x7B, 0xBF, 0x7F, 0x83, 0x4F,\n    0xC7, 0xFA, 0x3B, 0x44, 0xEF, 0xF9, 0x4C, 0xE9, 0x72, 0x70, 0xD7, 0x27, 0xEC, 0x80, 0x18, 0x2A,\n    0x45, 0x71, 0x87, 0x99, 0x9F, 0xE0, 0x74, 0x3E, 0xE0, 0xE1, 0xCD, 0xF6, 0x76, 0xD9, 0x82, 0x6D,\n    0xF5, 0x01, 0x9C, 0x33, 0x19, 0xB7, 0x0A, 0x1E, 0x07, 0xC7, 0x11, 0x4B, 0xC2, 0x64, 0x16, 0x14,\n    0x9F, 0xE6, 0xD2, 0x65, 0x64, 0x9E, 0xCA, 0x29, 0xB9, 0xC1, 0xA1, 0x64, 0x4A, 0x39, 0x36, 0xD7,\n    0xED, 0xC4, 0xCA, 0x4D, 0x93, 0xB7, 0xE7, 0x52, 0x6E, 0xC4, 0x2A, 0x89, 0x16, 0x14, 0xC2, 0x26,\n    0xF9, 0xD6, 0x69, 0xA6, 0x8B, 0x52, 0x04, 0xA3, 0xF9, 0xB5, 0x34, 0x97, 0x98, 0x0F, 0x77, 0x01,\n    0x02, 0xD7, 0x3D, 0x75, 0x08, 0xE7, 0x90, 0x1B, 0x0A, 0xA4, 0x1D, 0x27, 0xBB, 0xC3, 0xF5, 0x9A,\n    0x3A, 0x75, 0xC2, 0x85, 0x12, 0x98, 0x59, 0x90, 0x92, 0x99, 0x15, 0x73, 0xA2, 0x1D, 0x8A, 0xC0,\n    0x68, 0x39, 0x69, 0x93, 0x2C, 0xCF, 0xE1, 0x43, 0x99, 0xD6, 0x68, 0xEB, 0xBD, 0xB1, 0xF2, 0xA4,\n    0xB4, 0x84, 0x78, 0x62, 0xCA, 0xF7, 0xE3, 0xC8, 0x5B, 0x12, 0x92, 0xA4, 0x93, 0xAA, 0x04, 0x07,\n    0x45, 0x26, 0x09, 0x77, 0x6E, 0x30, 0x47, 0x26, 0x9D, 0x24, 0x8B, 0xED, 0xDC, 0xFB, 0xFF, 0x23,\n    0x3A, 0xFD, 0x6B, 0xCB, 0xA0, 0x88, 0x08, 0x76, 0x66, 0x0A, 0xF9, 0x7B, 0x4F, 0xE2, 0x23, 0x5C,\n    0x4E, 0xE9, 0x16, 0x29, 0xA0, 0x9E, 0xE2, 0x7B, 0xB7, 0xD6, 0xDB, 0xD9, 0xC5, 0xCF, 0x68, 0x4A,\n    0x9F, 0x08, 0x22, 0xA0, 0xEC, 0xF2, 0x3F, 0x95, 0xAE, 0x25, 0x95, 0xED, 0x10, 0x6F, 0x35, 0x1A,\n    0xCA, 0x58, 0xB2, 0xC6, 0x72, 0xA1, 0x03, 0x7E, 0x58, 0x70, 0x59, 0x24, 0x6A, 0x39, 0x00, 0x8B,\n    0x4A, 0x27, 0xBC, 0xB9, 0x00, 0x92, 0x6A, 0xA5, 0xC8, 0x1D, 0xBA, 0xFB, 0x24, 0x7F, 0x91, 0x3D,\n    0xF3, 0x4D, 0x7D, 0xB5, 0xF8, 0xB8, 0x76, 0x27, 0x0A, 0x50, 0x10, 0x98, 0xD3, 0xFE, 0xD8, 0xCD,\n    0x55, 0xDD, 0xC3, 0x70, 0x38, 0x23, 0x75, 0x44, 0xA1, 0x16, 0x01, 0xC4, 0xFB, 0x7A, 0x31, 0xBD,\n    0xC1, 0x1B, 0x51, 0x7F, 0xAB, 0xC0, 0xAE, 0x0C, 0x43, 0xA5, 0x07, 0x35, 0x88, 0xAF, 0x8D, 0x5F,\n    0xF6, 0xE0, 0xFA, 0x6C, 0x83, 0x05, 0xEC, 0xFC, 0x85, 0xDD, 0x66, 0x11, 0x64, 0x77, 0xE7, 0xCA,\n    0xF4, 0xE5, 0xC8, 0x11, 0xC2, 0xAE, 0x06, 0x94, 0x40, 0xF7, 0xA4, 0x00, 0x6F, 0xDD, 0x99, 0xBD,\n    0x3A, 0xA3, 0x69, 0x5B, 0xFF, 0x09, 0xC8, 0xC7, 0xF5, 0xFD, 0xA7, 0xE3, 0x6D, 0x0D, 0x81, 0xC4,\n    0x70, 0xA1, 0x86, 0x35, 0xEF, 0x76, 0x58, 0x4F, 0xD8, 0x91, 0xD2, 0x34, 0xF6, 0x48, 0x86, 0x20,\n    0x95, 0xA2, 0x39, 0xDD, 0x4A, 0x63, 0xC4, 0xFD, 0xAC, 0x12, 0x61, 0xCC, 0xF9, 0x08, 0x15, 0x17,\n    0x4D, 0x94, 0x9B, 0x03, 0xFF, 0x27, 0x06, 0xDC, 0x2A, 0x6B, 0xC6, 0x45, 0x8C, 0xBE, 0x6B, 0x2E,\n    0x21, 0x9A, 0xDE, 0xBE, 0x17, 0x3A, 0x91, 0xA8, 0xA4, 0x09, 0x94, 0x70, 0x22, 0x62, 0x06, 0xDD,\n    0x65, 0x5E, 0x81, 0x8C, 0xB0, 0x2D, 0xA7, 0xA6, 0x6B, 0xD9, 0x9C, 0x75, 0xA1, 0x4C, 0x55, 0x96,\n    0x67, 0x6C, 0xF7, 0xFB, 0x34, 0xA6, 0x4C, 0x53, 0x10, 0x5A, 0xDB, 0x54, 0x7E, 0xAC, 0x67, 0xEA,\n    0x12, 0xF0, 0x29, 0x2A, 0x49, 0x89, 0xFF, 0xC5, 0xF3, 0xD4, 0x1D, 0xBA, 0xFB, 0xEF, 0xCE, 0xA3,\n    0x58, 0x33, 0x7C, 0xFA, 0xC0, 0x30, 0x45, 0x70, 0x15, 0xB0, 0xDE, 0x85, 0xD7, 0x66, 0xCA, 0x00,\n    0x87, 0x93, 0x85, 0x6B, 0xD0, 0x2E, 0x94, 0x80, 0x30, 0x24, 0x69, 0xC5, 0xD9, 0xD8, 0x00, 0xA7,\n    0xBF, 0x4E, 0xF7, 0x5C, 0xDE, 0x10, 0xBE, 0x0A, 0xAE, 0xDA, 0x8D, 0xFD, 0xCB, 0xD0, 0xAF, 0x6F,\n    0xBB, 0xD2, 0xEB, 0xEB, 0x05, 0xA4, 0xF7, 0x3B, 0x0B, 0xC1, 0x0E, 0x50, 0xE4, 0x80, 0x65, 0xF6,\n    0xEE, 0x78, 0xDB, 0xFA, 0xCD, 0x96, 0xDA, 0xB7, 0x47, 0xDD, 0x95, 0x0D, 0xEC, 0x65, 0x4F, 0x2A,\n    0x51, 0x8A, 0xC6, 0xA9, 0x25, 0xCE, 0x3D, 0x2D, 0xC2, 0x06, 0xB9, 0x26, 0xE1, 0x68, 0xA4, 0x68,\n    0x23, 0xB9, 0x0B, 0x12, 0x7D, 0x79, 0xD3, 0x48, 0x0E, 0xA6, 0x2A, 0x2B, 0xA3, 0x23, 0x64, 0x10,\n    0xBA, 0xA3, 0x92, 0x83, 0xF0, 0x91, 0xB9, 0xF7, 0x12, 0x4A, 0x08, 0xFA, 0xE3, 0x10, 0xAE, 0x69,\n    0xDD, 0x93, 0x1C, 0xC6, 0xCC, 0x32, 0x78, 0x85, 0x15, 0x84, 0xBE, 0x0E, 0x9B, 0x21, 0xB0, 0xE7,\n    0x0B, 0xC0, 0x25, 0xCA, 0xE3, 0xA3, 0xC0, 0x6A, 0x96, 0xC4, 0x98, 0x51, 0x9B, 0xF6, 0x5B, 0x09,\n    0xAD, 0x67, 0x03, 0xA1, 0x4A, 0x51, 0x1B, 0xC0, 0x4B, 0x0B, 0x1C, 0x23, 0x0A, 0x2B, 0xBA, 0x9F,\n    0xAE, 0x74, 0xED, 0xFA, 0xA1, 0xC4, 0x30, 0xAB, 0x00, 0xED, 0x7A, 0x17, 0xCC, 0x15, 0xC5, 0xBF,\n    0xCC, 0x49, 0x41, 0x97, 0x3D, 0xBE, 0x2A, 0xE7, 0xED, 0x33, 0x02, 0x5B, 0x42, 0xF3, 0x18, 0x10,\n    0xD3, 0xD5, 0x27, 0x08, 0x4A, 0xFD, 0xFB, 0xA5, 0x19, 0x43, 0xE6, 0x38, 0x26, 0xAA, 0xC3, 0xE6,\n    0x7B, 0xF1, 0xD5, 0x02, 0x96, 0x27, 0x86, 0xAC, 0x38, 0x86, 0x4E, 0xD0, 0x8B, 0xD7, 0x2B, 0xCC,\n    0x97, 0x96, 0x24, 0x6D, 0x66, 0x7D, 0x2B, 0xC8, 0xF7, 0x49, 0xEA, 0x26, 0x74, 0xED, 0x29, 0x50,\n    0x03, 0x72, 0x2E, 0x3D, 0x52, 0x3D, 0x1C, 0x63, 0x38, 0x67, 0x47, 0x3B, 0x07, 0xF8, 0x5C, 0x54,\n    0x98, 0x0A, 0xEA, 0xB9, 0x0E, 0xB7, 0x7E, 0x78, 0xF6, 0xD5, 0x8E, 0xC1, 0x1C, 0x36, 0x2A, 0x17,\n    0x17, 0x0A, 0x3E, 0x90, 0xA4, 0x77, 0x27, 0x47, 0xBA, 0xC9, 0x03, 0x6A, 0x3C, 0x88, 0x17, 0xF5,\n    0xEC, 0x7A, 0x94, 0x3D, 0xD3, 0x06, 0x00, 0xEE, 0xB2, 0x31, 0x36, 0xB5, 0xCA, 0x53, 0x52, 0xC9,\n    0x4C, 0xA6, 0x54, 0x12, 0xC6, 0x58, 0xB7, 0x2F, 0xD1, 0xD1, 0xF5, 0x8A, 0x96, 0x3E, 0x44, 0x61,\n    0x4B, 0xA0, 0x9D, 0xF1, 0x54, 0x4A, 0xE7, 0x27, 0x8B, 0x02, 0x8B, 0x8E, 0xC3, 0xF2, 0xAF, 0x01,\n    0xDE, 0x38, 0xE9, 0x7A, 0x15, 0xAE, 0x0D, 0xA2, 0xF2, 0x43, 0x2C, 0x2D, 0x2E, 0xCD, 0xD9, 0x61,\n    0x72, 0xD2, 0x34, 0x7E, 0x07, 0x2C, 0x2A, 0x00, 0x2D, 0x56, 0x6A, 0x9C, 0xFF, 0x13, 0xBE, 0xF2,\n    0x60, 0xCD, 0xBA, 0xFA, 0xB5, 0xBA, 0x95, 0x7F, 0x3B, 0xE1, 0x6F, 0x86, 0x83, 0xAF, 0x52, 0xD3,\n    0x86, 0xBE, 0xDF, 0x71, 0xFD, 0x39, 0x1B, 0x49, 0x23, 0xE8, 0x82, 0x3D, 0x98, 0xE7, 0x6A, 0x7E,\n    0xE4, 0x76, 0xB0, 0x2C, 0xBD, 0xAE, 0x26, 0xC5, 0xB5, 0x6F, 0x9A, 0xA2, 0x7E, 0x95, 0x84, 0x2A,\n    0x74, 0x4A, 0xEC, 0x70, 0x4D, 0xC1, 0xA9, 0xEB, 0x30, 0xD9, 0xAE, 0x8D, 0x7A, 0xA3, 0xF7, 0x5F,\n    0x3F, 0xDE, 0xC2, 0xCD, 0x8B, 0xB0, 0xD6, 0xD0, 0xC5, 0x71, 0x7C, 0xC7, 0xF9, 0x97, 0x98, 0x51,\n    0x52, 0x7E, 0x0D, 0x50, 0xB4, 0xC9, 0x29, 0x79, 0x65, 0xC8, 0x43, 0x7B, 0x46, 0x9B, 0x57, 0xF8,\n    0x74, 0xF7, 0x8B, 0x58, 0xE8, 0xB3, 0x22, 0x43, 0xEB, 0x06, 0xCD, 0xED, 0x0C, 0xC9, 0x86, 0x2B,\n    0x5E, 0xF9, 0xBA, 0xF5, 0xA3, 0x01, 0x46, 0xE5, 0xE7, 0x99, 0x17, 0x83, 0xA2, 0x4F, 0x2C, 0xEA,\n    0x9B, 0x12, 0xDB, 0xC9, 0x0B, 0x51, 0x79, 0x65, 0x6F, 0x3A, 0xC6, 0x1D, 0x35, 0x3B, 0xCB, 0xC2,\n    0xA1, 0x27, 0xA0, 0xE0, 0xC8, 0xCB, 0xBF, 0xA0, 0x7E, 0x9D, 0x7B, 0x8A, 0x6F, 0x38, 0x1D, 0x6A,\n    0xDA, 0x14, 0xF6, 0x00, 0xA4, 0xEA, 0x18, 0x71, 0x48, 0x3D, 0x05, 0x03, 0x42, 0x42, 0xE7, 0x50,\n    0x3C, 0x3F, 0x21, 0x2F, 0x7C, 0x18, 0x65, 0x3F, 0xDE, 0xDC, 0x65, 0x9D, 0xB2, 0x8E, 0x92, 0xA1,\n    0xC7, 0x0B, 0xAD, 0x3C, 0x22, 0x3C, 0x07, 0x62, 0x1D, 0x3C, 0x8F, 0x57, 0xF0, 0x50, 0x21, 0x5C,\n    0xC2, 0x6A, 0xA9, 0x72, 0x3B, 0x9F, 0xB0, 0x51, 0xEF, 0x1F, 0x5C, 0x83, 0x27, 0x1F, 0xAA, 0x81,\n    0x50, 0xDC, 0xB2, 0x80, 0x94, 0xE2, 0x69, 0x66, 0x4B, 0x7E, 0xBD, 0xCA, 0x8B, 0x5F, 0xD0, 0xE8,\n    0x69, 0x63, 0x6D, 0xE4, 0xDA, 0xF7, 0x83, 0x45, 0xCB, 0xFC, 0x33, 0xDB, 0x43, 0x99, 0x7E, 0x41,\n    0x86, 0x3F, 0x95, 0xDC, 0xB2, 0x58, 0x8F, 0x8E, 0x7F, 0xAA, 0xC8, 0x37, 0x80, 0x08, 0x1C, 0xAE,\n    0x22, 0x03, 0xF1, 0x98, 0x73, 0x47, 0x75, 0x38, 0x5B, 0x1F, 0x99, 0x70, 0xE4, 0x48, 0x15, 0x48,\n    0xCE, 0x24, 0x15, 0xE4, 0x0B, 0xCA, 0x01, 0x8E, 0x8B, 0xE7, 0x9B, 0x4E, 0x5B, 0x56, 0x11, 0x14,\n    0x31, 0x78, 0x8F, 0xA9, 0x9A, 0xDA, 0x41, 0x52, 0x21, 0xBB, 0x34, 0x10, 0x74, 0x55, 0x87, 0x4B,\n    0x7A, 0x65, 0xBA, 0x53, 0xFB, 0x06, 0xB3, 0x82, 0x3F, 0xEC, 0x43, 0x84, 0xF4, 0xC9, 0xAF, 0x11,\n    0x7F, 0x25, 0x7A, 0x7A, 0x2F, 0x33, 0x93, 0x10, 0x9B, 0x7D, 0xA0, 0xAB, 0x35, 0x54, 0x61, 0x85,\n    0x3A, 0x08, 0x6B, 0x38, 0x45, 0x35, 0xCB, 0xAC, 0x71, 0x07, 0x43, 0x5C, 0x38, 0x79, 0x28, 0xFB,\n    0x9E, 0x30, 0xDC, 0x69, 0xBE, 0x28, 0x25, 0x52, 0x1A, 0xCF, 0x0C, 0x67, 0x9E, 0x20, 0xF9, 0x18,\n    0xE2, 0x48, 0x4B, 0xD3, 0x2D, 0x78, 0xF5, 0xFC, 0xB0, 0xCF, 0x03, 0xC8, 0x9B, 0x4D, 0x82, 0xF5,\n    0xEE, 0x4A, 0x87, 0x45, 0xEC, 0x49, 0x32, 0x59, 0x15, 0x32, 0xEC, 0x63, 0x0B, 0x44, 0x9F, 0x03,\n    0xAD, 0x0C, 0x4B, 0xC4, 0xCE, 0x74, 0xF0, 0xBA, 0x8D, 0xE6, 0x4A, 0xBC, 0x69, 0xB7, 0xF5, 0xAE,\n    0xCB, 0x54, 0x43, 0xE8, 0x5A, 0x61, 0xF9, 0x4D, 0x04, 0xAA, 0xCE, 0x99, 0xF4, 0x67, 0x60, 0x63,\n    0x70, 0x3A, 0x98, 0x3C, 0x42, 0x48, 0x38, 0x9B, 0x90, 0xB4, 0x2F, 0xD7, 0xE1, 0xCF, 0x15, 0x63,\n    0x1F, 0x9C, 0xDC, 0x3C, 0x1A, 0xE7, 0x43, 0x2A, 0x54, 0xE7, 0x95, 0x16, 0x12, 0xE9, 0x93, 0xAE,\n    0x89, 0x21, 0x0B, 0xAD, 0xFB, 0x05, 0x50, 0x5A, 0x70, 0x02, 0xD0, 0xCC, 0xDA, 0x66, 0x25, 0x68,\n    0x11, 0x1F, 0x42, 0x07, 0x10, 0x56, 0x47, 0xCC, 0xA2, 0x3A, 0xAA, 0x44, 0x5B, 0x10, 0xA0, 0x0F,\n    0x25, 0x44, 0x70, 0x3E, 0x72, 0x3A, 0x58, 0x7C, 0x82, 0x03, 0x3B, 0x8B, 0xFF, 0x5E, 0x6C, 0x06,\n    0x5A, 0xFC, 0x23, 0x1B, 0x78, 0xD1, 0xCE, 0xC6, 0xC0, 0x3A, 0xAA, 0x07, 0x0F, 0xC0, 0xAC, 0xB7,\n    0x88, 0x31, 0x31, 0x9A, 0x67, 0x3C, 0xDA, 0x7F, 0xE6, 0x48, 0xAB, 0xE8, 0x30, 0xC0, 0xB4, 0xBF,\n    0x0B, 0x14, 0x97, 0x81, 0x8F, 0x5E, 0x65, 0x5D, 0xC9, 0x80, 0xDC, 0x85, 0x76, 0x84, 0x90, 0x7B,\n    0xC0, 0x2E, 0x59, 0x03, 0xB2, 0x19, 0x2C, 0x5B, 0x98, 0xA7, 0xA9, 0xDC, 0xE9, 0x4A, 0x02, 0xE3,\n    0x80, 0x0D, 0x08, 0x57, 0x03, 0x1D, 0xBB, 0xB0, 0x88, 0x32, 0xCA, 0xF0, 0x4C, 0xD3, 0xF9, 0xBD,\n    0x25, 0x56, 0x86, 0xBC, 0x99, 0x92, 0xFC, 0xAE, 0x66, 0xF2, 0x9B, 0x43, 0xF9, 0xCF, 0xEE, 0xD4,\n    0xEF, 0xF9, 0xFE, 0xB6, 0x26, 0x5D, 0x47, 0x07, 0x94, 0x1F, 0xE9, 0xD9, 0xA0, 0x78, 0xF9, 0x57,\n    0x26, 0x6E, 0xF9, 0xEB, 0x02, 0x01, 0x9E, 0xB0, 0x75, 0x43, 0x0C, 0x6D, 0x82, 0x54, 0xFC, 0xE2,\n    0xFA, 0x1B, 0x3C, 0x31, 0x64, 0xD5, 0x66, 0x22, 0x45, 0x1F, 0x35, 0x74, 0x8A, 0x70, 0x9A, 0xD8,\n    0xEC, 0xE8, 0x44, 0x0C, 0x9D, 0x10, 0xFD, 0x5A, 0xB3, 0x53, 0x21, 0x6A, 0x64, 0xD5, 0x15, 0x6A,\n    0x96, 0x48, 0x1A, 0xA3, 0x4E, 0x97, 0xB8, 0xCF, 0xB2, 0xA3, 0x14, 0x23, 0x83, 0xC1, 0x1A, 0x07,\n    0x6B, 0x89, 0x64, 0x16, 0x02, 0x9B, 0x04, 0x17, 0xA4, 0xE3, 0xF3, 0xDB, 0x1C, 0x8F, 0x9E, 0x0D,\n    0x0A, 0x6D, 0xB4, 0xA2, 0xA7, 0x76, 0x49, 0xBB, 0xBA, 0x79, 0x2D, 0x6F, 0xCE, 0xD9, 0x5C, 0x24,\n    0xC7, 0xDD, 0xF1, 0x22, 0xCC, 0x7D, 0xDF, 0xED, 0x97, 0x93, 0x60, 0xDD, 0x0B, 0x99, 0xBD, 0x58,\n    0x0B, 0x06, 0x77, 0x91, 0x82, 0x1F, 0xE2, 0xFE, 0xCF, 0x14, 0xF8, 0x51, 0x12, 0x2B, 0xBE, 0xFF,\n    0x68, 0xE7, 0xD9, 0xA5, 0xA4, 0x2E, 0xD5, 0xAA, 0xE2, 0xFA, 0x80, 0x58, 0xAC, 0xD1, 0x6C, 0xDD,\n    0xB6, 0x40, 0xB6, 0xCE, 0x39, 0x6B, 0x95, 0x5C, 0xFF, 0x46, 0x7D, 0x2F, 0x03, 0xCA, 0xE1, 0x92,\n    0x5E, 0x2D, 0xD5, 0x58, 0x56, 0x82, 0xE1, 0x7D, 0x13, 0x21, 0xB0, 0x76, 0x1A, 0x92, 0xDE, 0x77,\n    0xB4, 0x05, 0xD0, 0xBC, 0xC9, 0xE3, 0xCE, 0xD2, 0xB9, 0x2B, 0x70, 0xBD, 0xF4, 0x79, 0x3C, 0xFA,\n    0xF3, 0x91, 0x51, 0xAA, 0xF4, 0xF0, 0x14, 0x0C, 0x4E, 0xD1, 0x66, 0x60, 0x90, 0x16, 0x5B, 0xEF,\n    0x34, 0xE8, 0xB1, 0x5A, 0x2B, 0x8E, 0x2C, 0x11, 0x39, 0x2D, 0x37, 0x43, 0x4F, 0xA3, 0x9C, 0x0B,\n    0x19, 0x19, 0x3D, 0x30, 0xCA, 0x51, 0x07, 0x67, 0x5A, 0xD2, 0xE0, 0x1D, 0x6C, 0xDD, 0xB2, 0xF8,\n    0x9E, 0x32, 0x07, 0x7A, 0x33, 0x26, 0x2F, 0x3A, 0x71, 0x25, 0xB0, 0x26, 0xDF, 0xAB, 0xEE, 0xCC,\n    0xAD, 0xA9, 0x46, 0x40, 0x65, 0xD6, 0x51, 0xD2, 0x12, 0x5D, 0x27, 0x4F, 0xBB, 0x95, 0x51, 0x87,\n    0x55, 0xB2, 0xF7, 0xEB, 0x89, 0x65, 0xDF, 0xCA, 0xDF, 0xA2, 0x55, 0xAD, 0xA0, 0x19, 0x6A, 0xE5,\n    0x88, 0x0A, 0xCE, 0x24, 0xA2, 0xA7, 0xEB, 0x0C, 0x29, 0xDC, 0x24, 0x09, 0x93, 0x99, 0x50, 0x2C,\n    0xB7, 0x0F, 0x21, 0xB7, 0x71, 0xF6, 0x8B, 0x3F, 0x69, 0x0C, 0x32, 0xA1, 0x18, 0x3A, 0x81, 0xEE,\n    0x42, 0x67, 0x82, 0x5E, 0xE1, 0x7B, 0x1C, 0x6F, 0x57, 0xA9, 0x60, 0x38, 0x53, 0x42, 0x04, 0x65,\n    0x21, 0x31, 0x8B, 0xB8, 0xEA, 0x9F, 0x0D, 0xA6, 0xAE, 0xD8, 0x4D, 0x9B, 0xCB, 0x36, 0x53, 0xC4,\n    0x60, 0x2F, 0x84, 0x0E, 0x64, 0xBF, 0xCE, 0x08, 0x89, 0xD0, 0x2B, 0xB9, 0xE3, 0x87, 0xEC, 0x10,\n    0xA8, 0x61, 0x70, 0xF7, 0xE5, 0x23, 0xAA, 0x2E, 0x7A, 0x70, 0x64, 0x5D, 0x04, 0xD6, 0xC6, 0xA2,\n    0xA9, 0x3B, 0x79, 0xD6, 0x9A, 0x9A, 0x15, 0x39, 0xDF, 0xF4, 0x4A, 0x2A, 0xE0, 0x2C, 0x67, 0xC7,\n    0x01, 0xF3, 0x02, 0x6B, 0xE4, 0xF4, 0xE0, 0x77, 0x17, 0xA2, 0xEC, 0x93, 0xD3, 0x61, 0x49, 0xB4,\n    0xAC, 0x52, 0x3A, 0x84, 0xFA, 0x3E, 0x2C, 0xD8, 0xAB, 0xD9, 0xE6, 0xDD, 0x59, 0x1C, 0x1E, 0x41,\n    0x97, 0xEF, 0x29, 0x13, 0xF2, 0x2D, 0x1D, 0x21, 0x5F, 0x6F, 0x16, 0xF2, 0x7C, 0x72, 0x69, 0xB6,\n    0x93, 0xC9, 0xE5, 0x7A, 0x1B, 0x4E, 0x10, 0x78, 0x6C, 0x79, 0x4B, 0x23, 0x73, 0x02, 0x9B, 0xF2,\n    0xE0, 0xC3, 0xDB, 0x58, 0xF3, 0x23, 0x37, 0xC9, 0x06, 0x20, 0xF1, 0x08, 0x34, 0x47, 0x91, 0xB0,\n    0x8E, 0xF3, 0xFF, 0xFE, 0x83, 0x4A, 0x97, 0xA4, 0x55, 0x22, 0x55, 0xF3, 0x9F, 0x41, 0x7F, 0xE1,\n    0xF5, 0xE3, 0x42, 0xAE, 0x54, 0xF0, 0x83, 0x68, 0x08, 0x09, 0x2C, 0x95, 0x6C, 0x23, 0x11, 0x7E,\n    0x9F, 0x7D, 0x53, 0x78, 0xA1, 0x6B, 0x02, 0x14, 0x8C, 0xDD, 0xF2, 0x34, 0x35, 0x7D, 0xF7, 0xCB,\n    0xEF, 0x68, 0x04, 0x07, 0x2C, 0xC2, 0x36, 0x1E, 0x15, 0x17, 0x15, 0x6B, 0x74, 0x56, 0xC4, 0x12,\n    0xB7, 0xBF, 0xC8, 0xDB, 0x66, 0xF2, 0x88, 0xFA, 0xEB, 0xD3, 0xA3, 0x99, 0xBE, 0xD3, 0x21, 0x35,\n    0x05, 0xED, 0x73, 0x9A, 0xA0, 0x14, 0x3C, 0x24, 0x0A, 0xDF, 0x97, 0x0F, 0x1B, 0xA2, 0x9A, 0xB0,\n    0x0F, 0x01, 0xAD, 0x1D, 0x87, 0xED, 0x21, 0x8F, 0x2F, 0xA8, 0x4D, 0xFD, 0x02, 0x5E, 0x4B, 0xEA,\n    0xAD, 0x44, 0x2D, 0x58, 0xB4, 0xC8, 0x8F, 0x40, 0x38, 0x9D, 0x93, 0x3D, 0x32, 0x28, 0x6C, 0x50,\n    0xE2, 0x10, 0xC1, 0x7C, 0xDD, 0x10, 0x08, 0x22, 0xB1, 0x1C, 0xB2, 0x2C, 0xA2, 0x33, 0xB5, 0x91,\n    0x55, 0x3C, 0xDA, 0xAA, 0xF2, 0xDA, 0xBF, 0x97, 0xA8, 0xB0, 0x81, 0x21, 0xD8, 0x5E, 0xBE, 0xCE,\n    0x21, 0x55, 0xD7, 0xBE, 0xC0, 0xAF, 0xDE, 0xF3, 0xB7, 0x5E, 0xDB, 0x98, 0x40, 0x71, 0x8D, 0xB0,\n    0xDD, 0xAB, 0x7D, 0xEB, 0x68, 0x9C, 0xAD, 0x24, 0xA6, 0xE1, 0xB0, 0x90, 0x79, 0xAC, 0xEB, 0xD4,\n    0x9D, 0x69, 0x09, 0xE8, 0xE1, 0x7E, 0xFD, 0xE5, 0xAD, 0x59, 0xD2, 0x3A, 0xBD, 0x83, 0x96, 0xC8,\n    0x04, 0xF4, 0x8E, 0x55, 0x56, 0xBC, 0x95, 0xC9, 0x0D, 0x9E, 0xC6, 0x6F, 0xA3, 0x4F, 0x68, 0xD2,\n    0x78, 0x16, 0x57, 0x5D, 0x09, 0xE0, 0x61, 0xC5, 0xAD, 0x3F, 0xD1, 0xE0, 0xFA, 0xE8, 0x1D, 0x77,\n    0x70, 0x42, 0xF7, 0x53, 0x47, 0xAA, 0xBB, 0x7D, 0xF3, 0xBA, 0xC9, 0x26, 0xB2, 0xC9, 0xC3, 0x0A,\n    0x17, 0x4C, 0x2A, 0x1B, 0xB6, 0x12, 0x32, 0x54, 0x9A, 0xB1, 0xEA, 0xC7, 0xB5, 0x28, 0x5F, 0x59,\n    0xD9, 0x19, 0x4E, 0xFF, 0x0D, 0xB1, 0x67, 0x40, 0xD3, 0x76, 0xA7, 0x0A, 0x94, 0xD9, 0x75, 0x71,\n    0xCE, 0x6E, 0xE5, 0xFB, 0xD8, 0x9F, 0xB6, 0x5F, 0x91, 0x74, 0x68, 0x9F, 0x7C, 0xA3, 0x99, 0x3A,\n    0xD9, 0x0C, 0x83, 0x64, 0xFB, 0x7E, 0xB2, 0x9B, 0x1A, 0x5F, 0xDA, 0x85, 0xB5, 0xB9, 0x4C, 0xB1,\n    0x72, 0xA2, 0x1B, 0x92, 0x20, 0x7A, 0x77, 0xD3, 0x41, 0x8E, 0x1B, 0xF1, 0xC3, 0x5A, 0x6B, 0xF0,\n    0x66, 0x16, 0x94, 0x1F, 0x57, 0x5A, 0xC1, 0x16, 0xB3, 0xF9, 0xE9, 0xFA, 0x0C, 0x28, 0xC5, 0x32,\n    0x6F, 0x04, 0xF1, 0xAF, 0x66, 0x9F, 0xF8, 0x72, 0xD6, 0x91, 0x5F, 0x4C, 0xE9, 0x9A, 0xA8, 0x38,\n    0x47, 0x6C, 0x8C, 0x00, 0xB4, 0x47, 0x20, 0x41, 0x68, 0x12, 0x54, 0x51, 0x1A, 0x56, 0x66, 0x56,\n    0x4B, 0xC3, 0x59, 0xC7, 0x9C, 0x49, 0x74, 0x06, 0xAB, 0x45, 0x1D, 0x7B, 0x01, 0xA0, 0xF5, 0x34,\n    0x9E, 0xE3, 0xAD, 0x5B, 0x3A, 0x12, 0x33, 0x3E, 0x03, 0xB7, 0xA6, 0x92, 0x62, 0x11, 0x75, 0x5D,\n    0xE4, 0xB9, 0x78, 0x43, 0xCC, 0x4D, 0xF7, 0x03, 0x0C, 0x5A, 0xED, 0x74, 0x55, 0x96, 0x91, 0x29,\n    0xFA, 0xBA, 0xC6, 0x38, 0xCB, 0x22, 0xF2, 0x90, 0x6B, 0x7B, 0x3D, 0xFF, 0xEF, 0x94, 0x29, 0x59,\n    0x33, 0x8B, 0x60, 0x66, 0xE7, 0x32, 0xFD, 0x6B, 0xE1, 0x19, 0x68, 0x2F, 0xD3, 0x71, 0xA0, 0x70,\n    0xE9, 0xAF, 0xE6, 0x25, 0x4E, 0xE8, 0x46, 0x08, 0x1C, 0xF1, 0xE3, 0x60, 0x75, 0x63, 0xF2, 0xAC,\n    0xAE, 0x25, 0x45, 0x6E, 0xB7, 0x43, 0x71, 0xFD, 0xF9, 0x0B, 0x34, 0x2F, 0xDA, 0xBD, 0x6B, 0x27,\n    0x68, 0x0D, 0x27, 0x8D, 0xDE, 0xC7, 0x7C, 0x8D, 0x24, 0xC4, 0xCB, 0x9B, 0xED, 0x80, 0x01, 0x14,\n    0x02, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x63, 0x6C, 0x65, 0x61, 0x72,\n    0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x0D, 0x80, 0x03,\n};\n"
  },
  {
    "path": "core/src/fxge/fontdata/chromefontdata/FoxitSymbol.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nconst unsigned char g_FoxitSymbolFontData [16729] = {0x1,\n                                                     0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0xf,\n                                                     0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x79, 0x6d,\n                                                     0x62, 0x6f, 0x6c, 0x4f, 0x54, 0x46, 0x0, 0x1,\n                                                     0x1, 0x1, 0x26, 0xf8, 0x10, 0x0, 0xf8, 0xad,\n                                                     0x1, 0xf8, 0xae, 0x2, 0xf8, 0xae, 0x3, 0xf8,\n                                                     0x18, 0x4, 0xfb, 0x48, 0xfb, 0xba, 0xfa, 0xd6,\n                                                     0xfa, 0x86, 0x5, 0x1c, 0x6, 0x3d, 0xf, 0x1c,\n                                                     0x6, 0x89, 0x11, 0xab, 0x1c, 0x3e, 0xa2, 0x12,\n                                                     0x0, 0x94, 0x2, 0x0, 0x1, 0x0, 0x6, 0x0,\n                                                     0xa, 0x0, 0xf, 0x0, 0x16, 0x0, 0x1a, 0x0,\n                                                     0x1d, 0x0, 0x22, 0x0, 0x26, 0x0, 0x2b, 0x0,\n                                                     0x31, 0x0, 0x33, 0x0, 0x35, 0x0, 0x37, 0x0,\n                                                     0x3e, 0x0, 0x40, 0x0, 0x43, 0x0, 0x48, 0x0,\n                                                     0x4b, 0x0, 0x52, 0x0, 0x55, 0x0, 0x58, 0x0,\n                                                     0x5b, 0x0, 0x60, 0x0, 0x64, 0x0, 0x69, 0x0,\n                                                     0x6e, 0x0, 0x75, 0x0, 0x79, 0x0, 0x7c, 0x0,\n                                                     0x81, 0x0, 0x85, 0x0, 0x8a, 0x0, 0x90, 0x0,\n                                                     0x92, 0x0, 0x94, 0x0, 0x9b, 0x0, 0x9d, 0x0,\n                                                     0xa0, 0x0, 0xa6, 0x0, 0xab, 0x0, 0xae, 0x0,\n                                                     0xb5, 0x0, 0xb8, 0x0, 0xbb, 0x0, 0xbe, 0x0,\n                                                     0xc3, 0x0, 0xc9, 0x0, 0xd1, 0x0, 0xd5, 0x0,\n                                                     0xdb, 0x0, 0xe1, 0x0, 0xe7, 0x0, 0xeb, 0x0,\n                                                     0xf3, 0x0, 0xfe, 0x1, 0x6, 0x1, 0xb, 0x1,\n                                                     0x10, 0x1, 0x19, 0x1, 0x20, 0x1, 0x2a, 0x1,\n                                                     0x33, 0x1, 0x3c, 0x1, 0x4a, 0x1, 0x56, 0x1,\n                                                     0x60, 0x1, 0x6d, 0x1, 0x79, 0x1, 0x85, 0x1,\n                                                     0x8e, 0x1, 0x99, 0x1, 0xa4, 0x1, 0xac, 0x1,\n                                                     0xb1, 0x1, 0xb9, 0x1, 0xc0, 0x1, 0xca, 0x1,\n                                                     0xd2, 0x1, 0xd9, 0x1, 0xe2, 0x1, 0xee, 0x1,\n                                                     0xf5, 0x2, 0x1, 0x2, 0x9, 0x2, 0xe, 0x2,\n                                                     0x18, 0x2, 0x21, 0x2, 0x2d, 0x2, 0x32, 0x2,\n                                                     0x3a, 0x2, 0x43, 0x2, 0x4a, 0x2, 0x53, 0x2,\n                                                     0x5e, 0x2, 0x66, 0x2, 0x71, 0x2, 0x7a, 0x2,\n                                                     0x86, 0x2, 0x92, 0x2, 0xa0, 0x2, 0xa9, 0x2,\n                                                     0xb5, 0x2, 0xc3, 0x2, 0xcd, 0x2, 0xdb, 0x2,\n                                                     0xe8, 0x2, 0xef, 0x2, 0xf9, 0x3, 0x3, 0x3,\n                                                     0xc, 0x3, 0x16, 0x3, 0x1d, 0x3, 0x22, 0x3,\n                                                     0x26, 0x3, 0x2b, 0x3, 0x32, 0x3, 0x40, 0x3,\n                                                     0x4d, 0x3, 0x5b, 0x3, 0x64, 0x3, 0x6f, 0x3,\n                                                     0x7b, 0x3, 0x87, 0x3, 0x94, 0x3, 0xa1, 0x3,\n                                                     0xac, 0x3, 0xb7, 0x3, 0xc2, 0x3, 0xcf, 0x3,\n                                                     0xdc, 0x3, 0xe9, 0x3, 0xf4, 0x4, 0x0, 0x4,\n                                                     0xb, 0x4, 0x12, 0x4, 0x1c, 0x4, 0x28, 0x4,\n                                                     0x34, 0x4, 0x40, 0x4, 0x4e, 0x4, 0x5c, 0x4,\n                                                     0x6a, 0x4, 0x76, 0x4, 0x83, 0x4, 0x8f, 0x4,\n                                                     0x94, 0x4, 0xbe, 0x4, 0xce, 0x41, 0x6c, 0x70,\n                                                     0x68, 0x61, 0x42, 0x65, 0x74, 0x61, 0x47, 0x61,\n                                                     0x6d, 0x6d, 0x61, 0x45, 0x70, 0x73, 0x69, 0x6c,\n                                                     0x6f, 0x6e, 0x5a, 0x65, 0x74, 0x61, 0x45, 0x74,\n                                                     0x61, 0x54, 0x68, 0x65, 0x74, 0x61, 0x49, 0x6f,\n                                                     0x74, 0x61, 0x4b, 0x61, 0x70, 0x70, 0x61, 0x4c,\n                                                     0x61, 0x6d, 0x62, 0x64, 0x61, 0x4d, 0x75, 0x4e,\n                                                     0x75, 0x58, 0x69, 0x4f, 0x6d, 0x69, 0x63, 0x72,\n                                                     0x6f, 0x6e, 0x50, 0x69, 0x52, 0x68, 0x6f, 0x53,\n                                                     0x69, 0x67, 0x6d, 0x61, 0x54, 0x61, 0x75, 0x55,\n                                                     0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x50, 0x68,\n                                                     0x69, 0x43, 0x68, 0x69, 0x50, 0x73, 0x69, 0x61,\n                                                     0x6c, 0x70, 0x68, 0x61, 0x62, 0x65, 0x74, 0x61,\n                                                     0x67, 0x61, 0x6d, 0x6d, 0x61, 0x64, 0x65, 0x6c,\n                                                     0x74, 0x61, 0x65, 0x70, 0x73, 0x69, 0x6c, 0x6f,\n                                                     0x6e, 0x7a, 0x65, 0x74, 0x61, 0x65, 0x74, 0x61,\n                                                     0x74, 0x68, 0x65, 0x74, 0x61, 0x69, 0x6f, 0x74,\n                                                     0x61, 0x6b, 0x61, 0x70, 0x70, 0x61, 0x6c, 0x61,\n                                                     0x6d, 0x62, 0x64, 0x61, 0x6e, 0x75, 0x78, 0x69,\n                                                     0x6f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x6e, 0x70,\n                                                     0x69, 0x72, 0x68, 0x6f, 0x73, 0x69, 0x67, 0x6d,\n                                                     0x61, 0x31, 0x73, 0x69, 0x67, 0x6d, 0x61, 0x74,\n                                                     0x61, 0x75, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f,\n                                                     0x6e, 0x70, 0x68, 0x69, 0x63, 0x68, 0x69, 0x70,\n                                                     0x73, 0x69, 0x6f, 0x6d, 0x65, 0x67, 0x61, 0x74,\n                                                     0x68, 0x65, 0x74, 0x61, 0x31, 0x55, 0x70, 0x73,\n                                                     0x69, 0x6c, 0x6f, 0x6e, 0x31, 0x70, 0x68, 0x69,\n                                                     0x31, 0x6f, 0x6d, 0x65, 0x67, 0x61, 0x31, 0x6d,\n                                                     0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x65, 0x63,\n                                                     0x6f, 0x6e, 0x64, 0x45, 0x75, 0x72, 0x6f, 0x49,\n                                                     0x66, 0x72, 0x61, 0x6b, 0x74, 0x75, 0x72, 0x77,\n                                                     0x65, 0x69, 0x65, 0x72, 0x73, 0x74, 0x72, 0x61,\n                                                     0x73, 0x73, 0x52, 0x66, 0x72, 0x61, 0x6b, 0x74,\n                                                     0x75, 0x72, 0x4f, 0x6d, 0x65, 0x67, 0x61, 0x61,\n                                                     0x6c, 0x65, 0x70, 0x68, 0x61, 0x72, 0x72, 0x6f,\n                                                     0x77, 0x6c, 0x65, 0x66, 0x74, 0x61, 0x72, 0x72,\n                                                     0x6f, 0x77, 0x75, 0x70, 0x61, 0x72, 0x72, 0x6f,\n                                                     0x77, 0x72, 0x69, 0x67, 0x68, 0x74, 0x61, 0x72,\n                                                     0x72, 0x6f, 0x77, 0x64, 0x6f, 0x77, 0x6e, 0x61,\n                                                     0x72, 0x72, 0x6f, 0x77, 0x62, 0x6f, 0x74, 0x68,\n                                                     0x63, 0x61, 0x72, 0x72, 0x69, 0x61, 0x67, 0x65,\n                                                     0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x61, 0x72,\n                                                     0x72, 0x6f, 0x77, 0x64, 0x62, 0x6c, 0x6c, 0x65,\n                                                     0x66, 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64,\n                                                     0x62, 0x6c, 0x75, 0x70, 0x61, 0x72, 0x72, 0x6f,\n                                                     0x77, 0x64, 0x62, 0x6c, 0x72, 0x69, 0x67, 0x68,\n                                                     0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64, 0x62,\n                                                     0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x61, 0x72, 0x72,\n                                                     0x6f, 0x77, 0x64, 0x62, 0x6c, 0x62, 0x6f, 0x74,\n                                                     0x68, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73,\n                                                     0x61, 0x6c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61,\n                                                     0x6c, 0x64, 0x69, 0x66, 0x66, 0x65, 0x78, 0x69,\n                                                     0x73, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c,\n                                                     0x65, 0x6d, 0x70, 0x74, 0x79, 0x73, 0x65, 0x74,\n                                                     0x44, 0x65, 0x6c, 0x74, 0x61, 0x67, 0x72, 0x61,\n                                                     0x64, 0x69, 0x65, 0x6e, 0x74, 0x65, 0x6c, 0x65,\n                                                     0x6d, 0x65, 0x6e, 0x74, 0x6e, 0x6f, 0x74, 0x65,\n                                                     0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x75,\n                                                     0x63, 0x68, 0x74, 0x68, 0x61, 0x74, 0x70, 0x72,\n                                                     0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x75, 0x6d,\n                                                     0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x73,\n                                                     0x74, 0x65, 0x72, 0x69, 0x73, 0x6b, 0x6d, 0x61,\n                                                     0x74, 0x68, 0x72, 0x61, 0x64, 0x69, 0x63, 0x61,\n                                                     0x6c, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x72, 0x74,\n                                                     0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x69, 0x6e, 0x66,\n                                                     0x69, 0x6e, 0x69, 0x74, 0x79, 0x61, 0x6e, 0x67,\n                                                     0x6c, 0x65, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61,\n                                                     0x6c, 0x61, 0x6e, 0x64, 0x6c, 0x6f, 0x67, 0x69,\n                                                     0x63, 0x61, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x74,\n                                                     0x65, 0x72, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f,\n                                                     0x6e, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x69, 0x6e,\n                                                     0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, 0x74, 0x68,\n                                                     0x65, 0x72, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x73,\n                                                     0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x63, 0x6f,\n                                                     0x6e, 0x67, 0x72, 0x75, 0x65, 0x6e, 0x74, 0x61,\n                                                     0x70, 0x70, 0x72, 0x6f, 0x78, 0x65, 0x71, 0x75,\n                                                     0x61, 0x6c, 0x6e, 0x6f, 0x74, 0x65, 0x71, 0x75,\n                                                     0x61, 0x6c, 0x65, 0x71, 0x75, 0x69, 0x76, 0x61,\n                                                     0x6c, 0x65, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x73,\n                                                     0x73, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x67, 0x72,\n                                                     0x65, 0x61, 0x74, 0x65, 0x72, 0x65, 0x71, 0x75,\n                                                     0x61, 0x6c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,\n                                                     0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x70, 0x72,\n                                                     0x6f, 0x70, 0x65, 0x72, 0x73, 0x75, 0x70, 0x65,\n                                                     0x72, 0x73, 0x65, 0x74, 0x6e, 0x6f, 0x74, 0x73,\n                                                     0x75, 0x62, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66,\n                                                     0x6c, 0x65, 0x78, 0x73, 0x75, 0x62, 0x73, 0x65,\n                                                     0x74, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x78, 0x73,\n                                                     0x75, 0x70, 0x65, 0x72, 0x73, 0x65, 0x74, 0x63,\n                                                     0x69, 0x72, 0x63, 0x6c, 0x65, 0x70, 0x6c, 0x75,\n                                                     0x73, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x6d,\n                                                     0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x70,\n                                                     0x65, 0x72, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x63,\n                                                     0x75, 0x6c, 0x61, 0x72, 0x64, 0x6f, 0x74, 0x6d,\n                                                     0x61, 0x74, 0x68, 0x69, 0x6e, 0x74, 0x65, 0x67,\n                                                     0x72, 0x61, 0x6c, 0x74, 0x70, 0x69, 0x6e, 0x74,\n                                                     0x65, 0x67, 0x72, 0x61, 0x6c, 0x62, 0x74, 0x61,\n                                                     0x6e, 0x67, 0x6c, 0x65, 0x6c, 0x65, 0x66, 0x74,\n                                                     0x61, 0x6e, 0x67, 0x6c, 0x65, 0x72, 0x69, 0x67,\n                                                     0x68, 0x74, 0x6c, 0x6f, 0x7a, 0x65, 0x6e, 0x67,\n                                                     0x65, 0x73, 0x70, 0x61, 0x64, 0x65, 0x63, 0x6c,\n                                                     0x75, 0x62, 0x68, 0x65, 0x61, 0x72, 0x74, 0x64,\n                                                     0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x63, 0x6f,\n                                                     0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73,\n                                                     0x65, 0x72, 0x69, 0x66, 0x72, 0x65, 0x67, 0x69,\n                                                     0x73, 0x74, 0x65, 0x72, 0x73, 0x65, 0x72, 0x69,\n                                                     0x66, 0x74, 0x72, 0x61, 0x64, 0x65, 0x6d, 0x61,\n                                                     0x72, 0x6b, 0x73, 0x65, 0x72, 0x69, 0x66, 0x72,\n                                                     0x61, 0x64, 0x69, 0x63, 0x61, 0x6c, 0x65, 0x78,\n                                                     0x61, 0x72, 0x72, 0x6f, 0x77, 0x76, 0x65, 0x72,\n                                                     0x74, 0x65, 0x78, 0x61, 0x72, 0x72, 0x6f, 0x77,\n                                                     0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x78, 0x72,\n                                                     0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x73,\n                                                     0x61, 0x6e, 0x73, 0x63, 0x6f, 0x70, 0x79, 0x72,\n                                                     0x69, 0x67, 0x68, 0x74, 0x73, 0x61, 0x6e, 0x73,\n                                                     0x74, 0x72, 0x61, 0x64, 0x65, 0x6d, 0x61, 0x72,\n                                                     0x6b, 0x73, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72,\n                                                     0x65, 0x6e, 0x6c, 0x65, 0x66, 0x74, 0x74, 0x70,\n                                                     0x70, 0x61, 0x72, 0x65, 0x6e, 0x6c, 0x65, 0x66,\n                                                     0x74, 0x65, 0x78, 0x70, 0x61, 0x72, 0x65, 0x6e,\n                                                     0x6c, 0x65, 0x66, 0x74, 0x62, 0x74, 0x62, 0x72,\n                                                     0x61, 0x63, 0x6b, 0x65, 0x74, 0x6c, 0x65, 0x66,\n                                                     0x74, 0x74, 0x70, 0x62, 0x72, 0x61, 0x63, 0x6b,\n                                                     0x65, 0x74, 0x6c, 0x65, 0x66, 0x74, 0x65, 0x78,\n                                                     0x62, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x6c,\n                                                     0x65, 0x66, 0x74, 0x62, 0x74, 0x62, 0x72, 0x61,\n                                                     0x63, 0x65, 0x6c, 0x65, 0x66, 0x74, 0x74, 0x70,\n                                                     0x62, 0x72, 0x61, 0x63, 0x65, 0x6c, 0x65, 0x66,\n                                                     0x74, 0x6d, 0x69, 0x64, 0x62, 0x72, 0x61, 0x63,\n                                                     0x65, 0x6c, 0x65, 0x66, 0x74, 0x62, 0x74, 0x62,\n                                                     0x72, 0x61, 0x63, 0x65, 0x65, 0x78, 0x69, 0x6e,\n                                                     0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, 0x65, 0x78,\n                                                     0x70, 0x61, 0x72, 0x65, 0x6e, 0x72, 0x69, 0x67,\n                                                     0x68, 0x74, 0x74, 0x70, 0x70, 0x61, 0x72, 0x65,\n                                                     0x6e, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, 0x78,\n                                                     0x70, 0x61, 0x72, 0x65, 0x6e, 0x72, 0x69, 0x67,\n                                                     0x68, 0x74, 0x62, 0x74, 0x62, 0x72, 0x61, 0x63,\n                                                     0x6b, 0x65, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74,\n                                                     0x74, 0x70, 0x62, 0x72, 0x61, 0x63, 0x6b, 0x65,\n                                                     0x74, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, 0x78,\n                                                     0x62, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x72,\n                                                     0x69, 0x67, 0x68, 0x74, 0x62, 0x74, 0x62, 0x72,\n                                                     0x61, 0x63, 0x65, 0x72, 0x69, 0x67, 0x68, 0x74,\n                                                     0x74, 0x70, 0x62, 0x72, 0x61, 0x63, 0x65, 0x72,\n                                                     0x69, 0x67, 0x68, 0x74, 0x6d, 0x69, 0x64, 0x62,\n                                                     0x72, 0x61, 0x63, 0x65, 0x72, 0x69, 0x67, 0x68,\n                                                     0x74, 0x62, 0x74, 0x61, 0x70, 0x70, 0x6c, 0x65,\n                                                     0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                     0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                     0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                     0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                     0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n                                                     0x20, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20,\n                                                     0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x4f,\n                                                     0x54, 0x46, 0x0, 0x0, 0x1, 0x0, 0x1, 0x1,\n                                                     0x0, 0x4, 0x0, 0x0, 0x6, 0x1, 0x0, 0x9,\n                                                     0x1, 0x0, 0xc, 0x1, 0x0, 0xf, 0x11, 0x0,\n                                                     0x3c, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x40, 0x0,\n                                                     0x0, 0x5c, 0x2, 0x0, 0x97, 0x0, 0x0, 0xa1,\n                                                     0x0, 0x0, 0x9c, 0x0, 0x0, 0x98, 0x0, 0x0,\n                                                     0xa8, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x65, 0x0,\n                                                     0x1, 0x87, 0x31, 0x0, 0x74, 0x0, 0x0, 0x79,\n                                                     0x0, 0x1, 0xb9, 0x1, 0x0, 0x63, 0x0, 0x1,\n                                                     0xbb, 0x1b, 0x0, 0xa6, 0x0, 0x1, 0xd7, 0x41,\n                                                     0x0, 0xbf, 0x2, 0x0, 0x1, 0x0, 0x4, 0x0,\n                                                     0x7, 0x0, 0x3b, 0x0, 0xad, 0x1, 0x68, 0x2,\n                                                     0x26, 0x2, 0x5c, 0x2, 0x8f, 0x2, 0xb0, 0x3,\n                                                     0x4, 0x3, 0x13, 0x3, 0x27, 0x3, 0x73, 0x3,\n                                                     0xa3, 0x3, 0xf5, 0x4, 0x65, 0x4, 0x99, 0x4,\n                                                     0xf2, 0x5, 0x53, 0x5, 0x7a, 0x5, 0xf1, 0x6,\n                                                     0x56, 0x6, 0x6d, 0x6, 0xd9, 0x6, 0xf0, 0x7,\n                                                     0x3, 0x7, 0x1c, 0x7, 0x79, 0x7, 0x9a, 0x7,\n                                                     0xbc, 0x7, 0xcc, 0x8, 0x17, 0x8, 0x2d, 0x8,\n                                                     0x79, 0x8, 0x91, 0x8, 0xc9, 0x8, 0xf8, 0x9,\n                                                     0x6e, 0x9, 0x9d, 0x9, 0xbd, 0xa, 0x3c, 0xa,\n                                                     0xa0, 0xb, 0xa, 0xb, 0x4c, 0xb, 0xa9, 0xb,\n                                                     0xe8, 0xc, 0x18, 0xc, 0xb5, 0xc, 0xc4, 0xd,\n                                                     0x1e, 0xd, 0x6f, 0xd, 0xca, 0xe, 0x11, 0xe,\n                                                     0x88, 0xe, 0xdd, 0xf, 0x1c, 0xf, 0x69, 0xf,\n                                                     0xa5, 0xf, 0xde, 0x10, 0x2e, 0x10, 0xab, 0x11,\n                                                     0x40, 0x11, 0xab, 0x12, 0x1a, 0x12, 0xa8, 0x13,\n                                                     0x2, 0x13, 0x87, 0x14, 0xa, 0x14, 0x90, 0x14,\n                                                     0xf6, 0x15, 0x4d, 0x15, 0x89, 0x16, 0x4, 0x16,\n                                                     0x61, 0x16, 0xac, 0x17, 0x62, 0x17, 0xa8, 0x18,\n                                                     0x10, 0x18, 0x71, 0x18, 0xe3, 0x19, 0x2e, 0x19,\n                                                     0x80, 0x19, 0xe3, 0x1a, 0x47, 0x1a, 0xa3, 0x1b,\n                                                     0x18, 0x1b, 0x93, 0x1c, 0x24, 0x1c, 0x85, 0x1c,\n                                                     0xf2, 0x1d, 0x87, 0x1d, 0xab, 0x1d, 0xd0, 0x1d,\n                                                     0xf2, 0x1e, 0x1f, 0x1e, 0x38, 0x1e, 0xc3, 0x1f,\n                                                     0x58, 0x20, 0xc, 0x20, 0xe9, 0x21, 0x72, 0x22,\n                                                     0x1a, 0x22, 0x4b, 0x22, 0x79, 0x22, 0xa5, 0x22,\n                                                     0xd4, 0x23, 0x31, 0x23, 0x53, 0x23, 0x96, 0x23,\n                                                     0xd5, 0x24, 0xf, 0x24, 0x4e, 0x24, 0xad, 0x24,\n                                                     0xde, 0x25, 0x46, 0x25, 0x6b, 0x25, 0xea, 0x26,\n                                                     0xe, 0x26, 0x33, 0x26, 0x74, 0x26, 0xe6, 0x27,\n                                                     0x31, 0x27, 0x80, 0x27, 0xd8, 0x27, 0xe3, 0x28,\n                                                     0xf3, 0x29, 0x16, 0x29, 0x88, 0x29, 0xf3, 0x2a,\n                                                     0xa, 0x2a, 0x26, 0x2a, 0x49, 0x2a, 0x7f, 0x2a,\n                                                     0xb5, 0x2b, 0xc, 0x2b, 0x54, 0x2b, 0xa0, 0x2b,\n                                                     0xfb, 0x2c, 0x46, 0x2c, 0x84, 0x2c, 0xa1, 0x2c,\n                                                     0xb3, 0x2c, 0xc8, 0x2c, 0xfa, 0x2d, 0x24, 0x2d,\n                                                     0x7a, 0x2d, 0xb6, 0x2d, 0xef, 0x2e, 0x31, 0x2e,\n                                                     0x7d, 0x2e, 0x98, 0x2e, 0xb7, 0x2e, 0xf1, 0x2f,\n                                                     0x2d, 0x2f, 0x45, 0x2f, 0x5f, 0x2f, 0x95, 0x2f,\n                                                     0xff, 0x30, 0x8e, 0x30, 0xda, 0x30, 0xf9, 0x31,\n                                                     0x55, 0x31, 0xeb, 0x32, 0x87, 0x32, 0x99, 0x32,\n                                                     0xab, 0x32, 0xc0, 0x33, 0x45, 0x33, 0x92, 0x33,\n                                                     0xdb, 0x34, 0x6, 0x34, 0x12, 0x34, 0x3a, 0x34,\n                                                     0x57, 0x34, 0x68, 0x34, 0x84, 0x34, 0xa7, 0x34,\n                                                     0xd5, 0x34, 0xf4, 0x34, 0xfb, 0x35, 0xe, 0x35,\n                                                     0x35, 0x35, 0x43, 0x35, 0x6b, 0x35, 0x8a, 0x35,\n                                                     0x9e, 0x35, 0xbb, 0x35, 0xd7, 0x36, 0x5, 0x36,\n                                                     0x21, 0x36, 0x97, 0xfc, 0x45, 0xe, 0xfc, 0x45,\n                                                     0xe, 0xfb, 0xf2, 0x7a, 0xf7, 0x4, 0xf8, 0xd5,\n                                                     0x77, 0x1, 0xf7, 0x14, 0xf7, 0x4, 0x3, 0xf7,\n                                                     0x42, 0xf7, 0x64, 0x15, 0x7f, 0x8c, 0x90, 0x85,\n                                                     0x8f, 0x1b, 0x8f, 0x8f, 0x91, 0x97, 0x8d, 0x1f,\n                                                     0xb0, 0xf7, 0xb8, 0x94, 0xc1, 0xb6, 0x1a, 0xcb,\n                                                     0x69, 0x96, 0x75, 0x75, 0x69, 0x81, 0x4a, 0x1e,\n                                                     0xfc, 0xc2, 0x4, 0x22, 0xa, 0xfb, 0x4b, 0x90,\n                                                     0x76, 0xf7, 0x64, 0xb9, 0xf7, 0x4a, 0xb9, 0xf7,\n                                                     0x63, 0x77, 0x1, 0x9f, 0xf8, 0x61, 0x3, 0xe9,\n                                                     0x7b, 0x15, 0xba, 0x6, 0xa8, 0xf7, 0x64, 0x5,\n                                                     0xf7, 0x10, 0x6, 0x6f, 0xfb, 0x64, 0x5, 0xba,\n                                                     0x6, 0xa7, 0xf7, 0x64, 0x5, 0xf3, 0x6, 0x91,\n                                                     0xb9, 0x5, 0x24, 0x6, 0xa3, 0xf7, 0x4a, 0x5,\n                                                     0xf2, 0x6, 0x91, 0xb9, 0x5, 0x25, 0x6, 0xa7,\n                                                     0xf7, 0x63, 0x5, 0x5c, 0x6, 0x6f, 0xfb, 0x63,\n                                                     0x5, 0xfb, 0x11, 0x6, 0xa8, 0xf7, 0x63, 0x5,\n                                                     0x5c, 0x6, 0x6e, 0xfb, 0x63, 0x5, 0x27, 0x6,\n                                                     0x85, 0x5d, 0x5, 0xef, 0x6, 0x72, 0xfb, 0x4a,\n                                                     0x5, 0x24, 0x6, 0x85, 0x5d, 0x5, 0xf2, 0x6,\n                                                     0xc0, 0xb9, 0x15, 0xa4, 0xf7, 0x4a, 0x5, 0xf7,\n                                                     0x10, 0x6, 0x73, 0xfb, 0x4a, 0x5, 0xe, 0xf7,\n                                                     0x2a, 0x5d, 0xb1, 0xf7, 0xa6, 0xbc, 0x7c, 0xb1,\n                                                     0xf7, 0x70, 0xa7, 0xd0, 0x77, 0x12, 0xca, 0xdc,\n                                                     0xf7, 0x70, 0xa8, 0xb7, 0xd6, 0xf7, 0x79, 0xaa,\n                                                     0x13, 0xdf, 0x80, 0xf7, 0x3f, 0x67, 0x15, 0xc2,\n                                                     0x6, 0xf8, 0x4d, 0xf9, 0x47, 0x5, 0x54, 0x6,\n                                                     0x66, 0x82, 0x33, 0x6b, 0x5c, 0x1b, 0x53, 0x8a,\n                                                     0x6c, 0xa4, 0x83, 0x8f, 0x8, 0xa0, 0x71, 0x79,\n                                                     0x9f, 0x63, 0x1b, 0xfb, 0x4, 0xfb, 0x6, 0xfb,\n                                                     0x23, 0xfb, 0x19, 0x40, 0xb9, 0x65, 0xc7, 0xf7,\n                                                     0x1a, 0xe4, 0xf7, 0x25, 0xef, 0x8c, 0x1f, 0xa0,\n                                                     0x8b, 0xa0, 0x88, 0x9f, 0x1e, 0x9c, 0x81, 0xaa,\n                                                     0x85, 0xac, 0x8c, 0xb0, 0x8c, 0xb3, 0x93, 0xa4,\n                                                     0x9b, 0x8, 0xfb, 0x69, 0x87, 0x15, 0x8d, 0x76,\n                                                     0x8d, 0x80, 0x6f, 0x1a, 0x3a, 0x45, 0xfb, 0xf,\n                                                     0x27, 0x66, 0x7e, 0xb3, 0xad, 0xe3, 0xda, 0xf7,\n                                                     0x14, 0xcd, 0x95, 0x1e, 0x9b, 0x7e, 0xac, 0x7d,\n                                                     0xa1, 0x82, 0x8, 0xd8, 0xfc, 0x7e, 0x15, 0x3b,\n                                                     0xbc, 0x5e, 0xd8, 0xf7, 0xc, 0xe4, 0xf7, 0x2a,\n                                                     0xf2, 0x1e, 0x13, 0xbf, 0x80, 0xc2, 0x76, 0xcd,\n                                                     0x35, 0xfb, 0x18, 0x2b, 0xfb, 0x20, 0xfb, 0x1,\n                                                     0x1e, 0xd6, 0x80, 0x15, 0xe8, 0xdf, 0xf7, 0x16,\n                                                     0xd3, 0x8a, 0x1e, 0xc6, 0x99, 0x5c, 0x60, 0x38,\n                                                     0x38, 0xfb, 0x11, 0x26, 0x6c, 0x7d, 0xb0, 0xb2,\n                                                     0x1f, 0xe, 0xea, 0x79, 0xc6, 0x50, 0xd6, 0xf7,\n                                                     0xed, 0x9d, 0xf7, 0x5d, 0xb3, 0x12, 0xb4, 0xe8,\n                                                     0xc9, 0xd7, 0x8b, 0xf7, 0x38, 0x8b, 0xbd, 0x13,\n                                                     0x7f, 0xf8, 0x3e, 0xdd, 0x15, 0x76, 0xa0, 0xd2,\n                                                     0x3c, 0xdb, 0x1b, 0x13, 0xbf, 0xdb, 0xb2, 0xb4,\n                                                     0xd8, 0xac, 0x1f, 0x7b, 0x99, 0x5, 0x66, 0x61,\n                                                     0x64, 0x77, 0x73, 0x1b, 0x4f, 0x56, 0xc2, 0xaa,\n                                                     0x6c, 0x1f, 0xcc, 0xd7, 0x9f, 0xb7, 0xb2, 0xc8,\n                                                     0x8, 0xaf, 0xa2, 0xa3, 0xb5, 0xbd, 0x1b, 0x9d,\n                                                     0xfb, 0x67, 0x79, 0x7, 0xae, 0xa2, 0x7d, 0x71,\n                                                     0x52, 0x48, 0xfb, 0xa, 0x75, 0x7b, 0x1f, 0x4d,\n                                                     0xd3, 0x60, 0xd6, 0x69, 0xc9, 0x8, 0xe2, 0xb1,\n                                                     0xd5, 0xab, 0xe8, 0x1a, 0xc9, 0x4d, 0xc3, 0x49,\n                                                     0x27, 0x4d, 0x54, 0x24, 0x1e, 0x13, 0x9f, 0x56,\n                                                     0x9e, 0x6f, 0x9c, 0x5b, 0x1e, 0xfb, 0x2, 0x44,\n                                                     0x3a, 0x5f, 0xfb, 0xd, 0x1a, 0xfb, 0x0, 0xe2,\n                                                     0x5b, 0xe4, 0xf7, 0x11, 0xc2, 0xd0, 0xaa, 0xa8,\n                                                     0x1e, 0xfb, 0xd, 0xf7, 0xdc, 0x15, 0x7c, 0xb0,\n                                                     0x79, 0xbc, 0xb8, 0x1a, 0xb6, 0xb1, 0xb0, 0xba,\n                                                     0xaf, 0xb6, 0x6a, 0x52, 0x51, 0x3c, 0x6a, 0x57,\n                                                     0x6d, 0x1e, 0xe8, 0xfb, 0xc4, 0x15, 0x13, 0xbf,\n                                                     0x82, 0x83, 0x4e, 0x53, 0x48, 0x1b, 0x44, 0x52,\n                                                     0xc9, 0xda, 0xe4, 0xd2, 0xb1, 0xb4, 0xaa, 0x1f,\n                                                     0xba, 0x3b, 0xa2, 0x5b, 0xde, 0x24, 0x8, 0xe,\n                                                     0x50, 0xa, 0xc0, 0xdd, 0x3, 0xf7, 0xb6, 0xfb,\n                                                     0x53, 0x15, 0x95, 0x9c, 0x5, 0xfb, 0xe, 0xe6,\n                                                     0x60, 0xf7, 0x35, 0xf7, 0x3a, 0x1a, 0xf7, 0x40,\n                                                     0xad, 0xf7, 0x2f, 0xf7, 0x17, 0xe0, 0x1e, 0x81,\n                                                     0x9c, 0x5, 0xfb, 0x0, 0x72, 0xfb, 0x15, 0xfb,\n                                                     0x2a, 0xfb, 0x95, 0x1a, 0xfb, 0x7a, 0xf7, 0x22,\n                                                     0xfb, 0x48, 0xea, 0x75, 0x1e, 0xe, 0x50, 0xa,\n                                                     0xf7, 0x58, 0xdd, 0x3, 0xb4, 0xfb, 0x53, 0x15,\n                                                     0xea, 0xa1, 0xf7, 0x22, 0xf7, 0x48, 0xf7, 0x7a,\n                                                     0x1a, 0xf7, 0x95, 0xfb, 0x15, 0xf7, 0x2a, 0xfb,\n                                                     0x0, 0xa4, 0x1e, 0x81, 0x7a, 0x5, 0xf7, 0x17,\n                                                     0x36, 0xad, 0xfb, 0x2f, 0xfb, 0x40, 0x1a, 0xfb,\n                                                     0x3a, 0x60, 0xfb, 0x35, 0xfb, 0xe, 0x30, 0x1e,\n                                                     0xe, 0xf7, 0xbe, 0x8b, 0x1, 0xf7, 0x8b, 0xc2,\n                                                     0x3, 0x95, 0xf7, 0x87, 0x15, 0xf7, 0x81, 0xfb,\n                                                     0x87, 0xc2, 0xf7, 0x87, 0xf7, 0x81, 0xc2, 0xfb,\n                                                     0x81, 0xf7, 0x7f, 0x54, 0xfb, 0x7f, 0xfb, 0x81,\n                                                     0x6, 0xe, 0xfc, 0x45, 0xfb, 0x17, 0x76, 0xf7,\n                                                     0x24, 0xf7, 0x4, 0x22, 0xf4, 0x12, 0xc3, 0xf7,\n                                                     0x1e, 0x13, 0xd0, 0xc3, 0xb8, 0x15, 0x6b, 0x9e,\n                                                     0x76, 0xaf, 0x1e, 0x13, 0xb0, 0x97, 0x99, 0x93,\n                                                     0x8a, 0x93, 0x1f, 0x8f, 0x8a, 0x8d, 0x89, 0x84,\n                                                     0x1a, 0x54, 0x51, 0x62, 0x73, 0x79, 0x1e, 0x86,\n                                                     0x87, 0x83, 0x86, 0x84, 0x1a, 0x84, 0x90, 0x87,\n                                                     0x92, 0x8f, 0x92, 0x8c, 0x90, 0x92, 0x1e, 0x9c,\n                                                     0x95, 0xac, 0xa4, 0x9f, 0xa4, 0x8, 0xaf, 0xb9,\n                                                     0x8d, 0xb4, 0xa7, 0x1a, 0xba, 0x65, 0xa7, 0x67,\n                                                     0x5f, 0x77, 0x6c, 0x6f, 0x1e, 0xe, 0xfc, 0x45,\n                                                     0x7a, 0xf7, 0x4, 0x1, 0xd0, 0xf7, 0x4, 0x3,\n                                                     0xd0, 0xb2, 0x15, 0x22, 0xa, 0xfc, 0x29, 0x8e,\n                                                     0x76, 0xf9, 0x2c, 0x77, 0x1, 0x79, 0x4, 0xb7,\n                                                     0x6, 0xf7, 0x66, 0xf9, 0x2c, 0x5, 0x5f, 0x6,\n                                                     0xe, 0xfb, 0x4b, 0x7a, 0xab, 0xf9, 0x14, 0xa9,\n                                                     0x1, 0xa2, 0xee, 0xf7, 0x93, 0xe9, 0x3, 0xf7,\n                                                     0xe, 0xf7, 0xe3, 0x15, 0xd4, 0x8b, 0xf7, 0x8b,\n                                                     0xf7, 0x14, 0xf7, 0x14, 0x8a, 0xfb, 0x8b, 0x42,\n                                                     0x38, 0x8c, 0xfb, 0x81, 0xfb, 0x14, 0xfb, 0x14,\n                                                     0x8b, 0xf7, 0x7f, 0xe0, 0x1e, 0x28, 0x16, 0xfb,\n                                                     0x11, 0xb6, 0xfb, 0x77, 0xf7, 0x4c, 0xf7, 0x4c,\n                                                     0xb0, 0xf7, 0x77, 0xf7, 0x11, 0xf7, 0xf, 0x66,\n                                                     0xf7, 0x77, 0xfb, 0x4c, 0xfb, 0x4c, 0x60, 0xfb,\n                                                     0x77, 0xfb, 0xf, 0x1e, 0xe, 0xfb, 0x4b, 0x3b,\n                                                     0xa, 0xf7, 0x69, 0xdf, 0x3, 0xf7, 0x9, 0x16,\n                                                     0xf7, 0xa5, 0x9d, 0x6, 0x7e, 0x3b, 0x96, 0xd2,\n                                                     0x1f, 0xf8, 0xd1, 0x79, 0x7, 0xfb, 0x36, 0x32,\n                                                     0x5, 0x79, 0x7, 0xc4, 0xa0, 0x5, 0xa7, 0x95,\n                                                     0x96, 0x7e, 0x77, 0x1a, 0xfc, 0x64, 0x7, 0x44,\n                                                     0x38, 0x80, 0x7e, 0x1e, 0xe, 0xfb, 0x4b, 0x8b,\n                                                     0xd7, 0xf8, 0x1c, 0x9d, 0xf7, 0xc, 0xdb, 0x1,\n                                                     0xf7, 0xe0, 0xe5, 0x3, 0xa4, 0x16, 0xf8, 0x1d,\n                                                     0x6, 0xc4, 0xf7, 0x1d, 0x7e, 0x90, 0x5, 0x4c,\n                                                     0x64, 0x6e, 0x88, 0x64, 0x1b, 0xfb, 0x77, 0x6,\n                                                     0xf7, 0x58, 0xf7, 0x5c, 0xed, 0xf7, 0x6, 0xf5,\n                                                     0x1a, 0xf7, 0xd, 0x41, 0xd0, 0x22, 0x33, 0x2d,\n                                                     0x5a, 0xfb, 0x2b, 0x6d, 0x1e, 0xa0, 0x86, 0x5,\n                                                     0xc1, 0xa1, 0xa9, 0xd2, 0xe6, 0x1b, 0xf7, 0x7,\n                                                     0xa1, 0x30, 0x5c, 0x37, 0x5d, 0x34, 0x46, 0x40,\n                                                     0x1f, 0xfb, 0x54, 0xfb, 0x66, 0x5, 0xe, 0xfb,\n                                                     0x4b, 0x7a, 0xb2, 0xf8, 0xef, 0xc7, 0x12, 0xf7,\n                                                     0xcf, 0xdd, 0x65, 0xd7, 0x13, 0xd0, 0xf7, 0x25,\n                                                     0xf7, 0xe8, 0x15, 0xf1, 0x8c, 0xf7, 0x4, 0x5c,\n                                                     0xfb, 0x1, 0x1a, 0x37, 0x62, 0x3c, 0x2e, 0x6e,\n                                                     0x74, 0x97, 0x9c, 0x76, 0x1e, 0x9c, 0x76, 0x77,\n                                                     0x98, 0x74, 0x1b, 0x68, 0x7d, 0x7e, 0x6e, 0x58,\n                                                     0xf7, 0x10, 0x86, 0x9e, 0xf7, 0x20, 0xf7, 0x5,\n                                                     0xe5, 0xf7, 0x27, 0xf7, 0x16, 0x36, 0xb5, 0x5d,\n                                                     0x9b, 0x1f, 0x13, 0xe0, 0xcd, 0xb8, 0xa6, 0xb6,\n                                                     0xc1, 0x1a, 0xb4, 0x70, 0xe9, 0xfb, 0x15, 0x48,\n                                                     0x2c, 0x6b, 0xfb, 0x17, 0x63, 0x1e, 0x9a, 0x87,\n                                                     0x5, 0xa7, 0x9a, 0xbb, 0xda, 0xe6, 0x1b, 0xd5,\n                                                     0xac, 0x56, 0x58, 0x2f, 0x40, 0x5b, 0x2c, 0x71,\n                                                     0x1f, 0x86, 0x8b, 0x86, 0x86, 0x1a, 0xe, 0xfb,\n                                                     0x4b, 0xa0, 0x76, 0xf7, 0x33, 0xd1, 0xf8, 0x5c,\n                                                     0x77, 0x1, 0x9b, 0xb8, 0xf7, 0x81, 0xdf, 0x3,\n                                                     0x9b, 0xf7, 0x33, 0x15, 0xf7, 0xae, 0xfb, 0x33,\n                                                     0xdf, 0xf7, 0x33, 0xe2, 0xd1, 0x34, 0xf8, 0x5c,\n                                                     0x59, 0x6, 0xfb, 0xd0, 0xfc, 0x5b, 0x5, 0xb8,\n                                                     0x8a, 0x15, 0xf7, 0x81, 0xf7, 0xe4, 0x5, 0xfb,\n                                                     0xe4, 0x7, 0xe, 0xfb, 0x4b, 0x7a, 0xb3, 0xf8,\n                                                     0x1c, 0xe0, 0xe9, 0xda, 0x1, 0xf7, 0xf7, 0xd2,\n                                                     0x3, 0xc7, 0xf8, 0x33, 0x15, 0xf7, 0x7, 0x86,\n                                                     0xf7, 0x48, 0x59, 0xfb, 0x34, 0x1a, 0xfb, 0xe,\n                                                     0x42, 0x54, 0x4a, 0x70, 0x78, 0x9d, 0x9d, 0x77,\n                                                     0x1e, 0x9d, 0x78, 0x77, 0x9d, 0x6d, 0x1b, 0x6c,\n                                                     0x75, 0x7a, 0x6b, 0x57, 0xe5, 0x80, 0xbd, 0xf7,\n                                                     0x32, 0xee, 0xf7, 0x1, 0xf7, 0x19, 0xf7, 0x2d,\n                                                     0x30, 0xf7, 0x4, 0xfb, 0x57, 0x95, 0x1f, 0xaf,\n                                                     0xe9, 0x5, 0xf7, 0x79, 0x6, 0xb1, 0xe1, 0x7c,\n                                                     0x90, 0x5, 0x81, 0x81, 0x6e, 0x89, 0x64, 0x1b,\n                                                     0xfb, 0x48, 0x6, 0xe, 0xfb, 0x4b, 0x7d, 0xa7,\n                                                     0xf8, 0x4, 0xb9, 0xf7, 0x95, 0x77, 0x1, 0xad,\n                                                     0xe8, 0xf7, 0x8f, 0xe5, 0x3, 0xf8, 0x51, 0xf9,\n                                                     0x41, 0x15, 0xfb, 0x85, 0x82, 0xfb, 0x3e, 0xfb,\n                                                     0x4a, 0xfb, 0x5f, 0x1a, 0xfb, 0x66, 0xf1, 0x2c,\n                                                     0xf7, 0xa, 0xf7, 0x46, 0xaf, 0xf7, 0x33, 0xd4,\n                                                     0xf7, 0x1a, 0x3d, 0xd7, 0x22, 0x54, 0x74, 0x7f,\n                                                     0x6c, 0x52, 0x1e, 0xa0, 0xf7, 0xc, 0xee, 0xf7,\n                                                     0x1b, 0xf7, 0x48, 0xa7, 0x8, 0xfb, 0xce, 0xfb,\n                                                     0xdc, 0x15, 0xad, 0xaf, 0xaf, 0x93, 0xb0, 0x1b,\n                                                     0xf2, 0xa9, 0x27, 0x24, 0xfb, 0x5, 0x5d, 0x57,\n                                                     0x4c, 0x40, 0x48, 0xd5, 0xf7, 0x3c, 0xad, 0x8c,\n                                                     0xa5, 0x93, 0xa3, 0x1f, 0xe, 0xfb, 0x4b, 0x92,\n                                                     0x76, 0xf8, 0xe9, 0xe5, 0x1, 0xf7, 0x43, 0x7b,\n                                                     0x15, 0xc7, 0x6, 0xf7, 0x69, 0xf9, 0x25, 0x5,\n                                                     0xab, 0xfb, 0xff, 0x7, 0x4e, 0xfb, 0x34, 0xa1,\n                                                     0x82, 0x5, 0xb3, 0xa3, 0xa6, 0xb2, 0xc3, 0x1b,\n                                                     0xf7, 0x6d, 0x6, 0xe, 0xfb, 0x4b, 0x79, 0xab,\n                                                     0xf9, 0xe, 0xb0, 0x12, 0xc1, 0xd9, 0x45, 0xd1,\n                                                     0xf7, 0x72, 0xcc, 0x55, 0xd6, 0x13, 0xe4, 0xf7,\n                                                     0x63, 0xf7, 0xcd, 0x15, 0xf7, 0x4, 0x38, 0xb9,\n                                                     0x6d, 0x41, 0x1a, 0x45, 0x5d, 0x61, 0x4c, 0x3a,\n                                                     0x60, 0xcc, 0xd8, 0xe6, 0xb3, 0xb2, 0xae, 0xa6,\n                                                     0x1e, 0x6f, 0xa6, 0x15, 0x34, 0x4a, 0x65, 0x61,\n                                                     0x34, 0x1a, 0x3d, 0xcf, 0x35, 0xf7, 0x10, 0xf7,\n                                                     0x3a, 0xa7, 0xf7, 0x8, 0xbf, 0xce, 0x7c, 0xc8,\n                                                     0xfb, 0x16, 0xe1, 0x1e, 0x13, 0xd8, 0xc1, 0xb1,\n                                                     0xd1, 0xbc, 0xe7, 0x1a, 0xd7, 0x4c, 0xcd, 0xfb,\n                                                     0x5, 0x35, 0x2c, 0x55, 0x26, 0x3a, 0xab, 0x69,\n                                                     0xe0, 0x40, 0x1e, 0xde, 0xbd, 0x15, 0x68, 0xa1,\n                                                     0x30, 0xc4, 0xd9, 0x1a, 0xbb, 0xab, 0xc0, 0xd6,\n                                                     0xd8, 0xad, 0x55, 0x54, 0x33, 0x56, 0x66, 0x64,\n                                                     0x73, 0x1e, 0xe, 0xfb, 0x4b, 0x8e, 0x76, 0xf7,\n                                                     0x8d, 0xb6, 0xf8, 0xe, 0xac, 0x1, 0xaa, 0xe6,\n                                                     0xf7, 0x84, 0xed, 0x3, 0xc2, 0x8d, 0x15, 0x90,\n                                                     0x77, 0x5, 0xf7, 0x8e, 0x98, 0xf7, 0x2a, 0xf7,\n                                                     0x48, 0xf7, 0x75, 0x1a, 0xf7, 0x3b, 0x2a, 0xf7,\n                                                     0xa, 0xfb, 0xf, 0xfb, 0x16, 0x3c, 0xfb, 0x5,\n                                                     0xfb, 0x19, 0x39, 0xb8, 0xfb, 0x12, 0xf7, 0x1a,\n                                                     0xbd, 0xc0, 0x9d, 0xb0, 0xb7, 0x1e, 0x87, 0x70,\n                                                     0x54, 0xfb, 0x6d, 0xfb, 0x87, 0x63, 0x8, 0xf7,\n                                                     0xc3, 0xf7, 0xd8, 0x15, 0x69, 0x6a, 0x61, 0x79,\n                                                     0x6a, 0x1b, 0x21, 0x75, 0xf7, 0x13, 0xd7, 0xdd,\n                                                     0xa2, 0xe8, 0xdf, 0xf7, 0x17, 0x8d, 0xfb, 0x4f,\n                                                     0x4a, 0x76, 0x89, 0x69, 0x89, 0x78, 0x1f, 0xe,\n                                                     0xfc, 0x29, 0x7a, 0xf7, 0x4, 0xf7, 0x91, 0xf7,\n                                                     0x4, 0x1, 0xdc, 0xf7, 0x4, 0x3, 0xdc, 0xb2,\n                                                     0x37, 0xa, 0xf8, 0x1, 0x4, 0x22, 0xa, 0xfc,\n                                                     0x29, 0xfb, 0x17, 0x76, 0xf7, 0x3b, 0x76, 0xa6,\n                                                     0x76, 0xf7, 0xf0, 0xf7, 0x4, 0x12, 0xde, 0xf7,\n                                                     0x1e, 0xfb, 0x15, 0xf7, 0x4, 0x13, 0xd8, 0xde,\n                                                     0xb5, 0x15, 0x72, 0x9b, 0x74, 0xb0, 0x90, 0x91,\n                                                     0x8c, 0x8d, 0x90, 0x1e, 0x13, 0xb8, 0x8d, 0x91,\n                                                     0x91, 0x8c, 0x8f, 0x1b, 0x91, 0x8f, 0x87, 0x80,\n                                                     0x6f, 0x7b, 0x71, 0x7b, 0x7a, 0x1f, 0x7c, 0x7c,\n                                                     0x7a, 0x7f, 0x7f, 0x83, 0x8, 0x7e, 0x82, 0x85,\n                                                     0x88, 0x80, 0x1a, 0x86, 0x8d, 0x88, 0x91, 0x8e,\n                                                     0x8f, 0x8b, 0x8c, 0x90, 0x1e, 0x95, 0x8d, 0xb7,\n                                                     0xab, 0xa5, 0xaa, 0x8, 0xa8, 0xae, 0x94, 0xb7,\n                                                     0xab, 0x1a, 0xb2, 0x6a, 0xaf, 0x5d, 0x6a, 0x71,\n                                                     0x75, 0x67, 0x1e, 0x13, 0xd4, 0x94, 0xf7, 0xfe,\n                                                     0x15, 0x22, 0xa, 0xa0, 0x76, 0xf8, 0x9e, 0x77,\n                                                     0x1, 0xa5, 0xf7, 0x7a, 0x15, 0xf8, 0x85, 0xfb,\n                                                     0x7a, 0x5, 0xc9, 0x7, 0xfc, 0x45, 0xf7, 0x5b,\n                                                     0x3e, 0xa, 0xf7, 0x21, 0xc2, 0xf7, 0x1f, 0xc2,\n                                                     0x1, 0x96, 0xf7, 0xe3, 0x15, 0x3a, 0xa, 0xfb,\n                                                     0x8d, 0x4, 0x3a, 0xa, 0xe, 0xa0, 0x76, 0xf8,\n                                                     0x9e, 0x77, 0x1, 0xf8, 0x9f, 0xf7, 0x7a, 0x15,\n                                                     0x51, 0xa, 0xf8, 0x44, 0xfb, 0x5b, 0xfc, 0x44,\n                                                     0xfb, 0x5b, 0x5, 0x4d, 0x7, 0xe, 0xfb, 0x83,\n                                                     0x7a, 0xf7, 0x4, 0xf8, 0xc3, 0xab, 0x1, 0xf7,\n                                                     0x42, 0xf7, 0x4, 0xa6, 0xeb, 0x3, 0xf7, 0x74,\n                                                     0xf7, 0x3b, 0x15, 0xa0, 0x6, 0x98, 0xe7, 0xb1,\n                                                     0xc3, 0xad, 0xb3, 0x8, 0x9f, 0xa3, 0xc6, 0xd6,\n                                                     0xd6, 0x1a, 0xbd, 0x77, 0xf6, 0xfb, 0x32, 0xfb,\n                                                     0x5, 0x5b, 0x32, 0x4a, 0x69, 0x9f, 0x68, 0xa8,\n                                                     0xa1, 0x9b, 0x97, 0xa5, 0x9e, 0x80, 0x99, 0x81,\n                                                     0x9a, 0x1e, 0x82, 0x98, 0x82, 0x99, 0x9e, 0x1a,\n                                                     0xb2, 0xb9, 0x9f, 0xbe, 0xc1, 0xb7, 0x56, 0x41,\n                                                     0x4b, 0x76, 0x56, 0x75, 0x51, 0x1e, 0x77, 0x53,\n                                                     0x77, 0x48, 0x85, 0x4d, 0x8, 0x59, 0xfb, 0x14,\n                                                     0x15, 0x22, 0xa, 0x4e, 0xa, 0xe1, 0xd8, 0x3,\n                                                     0xe1, 0xfb, 0x2f, 0x15, 0xf7, 0x69, 0xa4, 0x3c,\n                                                     0x6, 0x64, 0x79, 0xa3, 0xb0, 0x1f, 0xf9, 0x25,\n                                                     0x7, 0xb0, 0x9d, 0xa3, 0xb2, 0x1e, 0xda, 0xa4,\n                                                     0xfb, 0x69, 0x6, 0xe, 0x4e, 0xa, 0xf7, 0x3d,\n                                                     0xd8, 0x3, 0xac, 0xfb, 0x16, 0x15, 0x72, 0xf7,\n                                                     0x69, 0xf9, 0xd1, 0xfb, 0x69, 0x72, 0xda, 0x7,\n                                                     0xb2, 0x9d, 0x73, 0x66, 0x1f, 0xfd, 0x25, 0x7,\n                                                     0x66, 0x79, 0x73, 0x64, 0x1e, 0xe, 0xfb, 0x4b,\n                                                     0xfb, 0x90, 0xb9, 0x1, 0x89, 0xfb, 0x62, 0x15,\n                                                     0x5d, 0xf8, 0x8c, 0xb9, 0x7, 0xe, 0x4d, 0xa,\n                                                     0xf7, 0x4e, 0xd6, 0x3, 0xc5, 0xf7, 0x7c, 0x15,\n                                                     0xc4, 0x7f, 0xd2, 0x8b, 0x27, 0x1a, 0xfb, 0x53,\n                                                     0x7, 0x39, 0xac, 0x6d, 0xd8, 0x1e, 0xf0, 0xa4,\n                                                     0x5a, 0x6, 0x52, 0x6d, 0xaa, 0xc3, 0x1f, 0xf7,\n                                                     0x53, 0x7, 0xdb, 0x28, 0xb4, 0x5b, 0x8e, 0x1e,\n                                                     0xb8, 0x93, 0xf1, 0xaf, 0xdd, 0x1a, 0xf7, 0x53,\n                                                     0x7, 0xc5, 0xa9, 0xa8, 0xc4, 0x1e, 0xbc, 0xa4,\n                                                     0x26, 0x6, 0x3f, 0x69, 0x71, 0x35, 0x1f, 0xfb,\n                                                     0x53, 0x7, 0x27, 0x44, 0x8b, 0x52, 0x7f, 0x1e,\n                                                     0xe, 0xfc, 0x77, 0xfb, 0x30, 0x76, 0xf9, 0xe6,\n                                                     0x77, 0x1, 0xcc, 0xd1, 0x3, 0xcc, 0xfb, 0x45,\n                                                     0x15, 0xd1, 0xf9, 0xe6, 0x45, 0x6, 0xe, 0x4d,\n                                                     0xa, 0xf7, 0x6b, 0xd6, 0x3, 0xda, 0xfb, 0x32,\n                                                     0x15, 0x72, 0xf0, 0x7, 0xd8, 0xac, 0xa7, 0xdf,\n                                                     0x1f, 0xf7, 0x53, 0x7, 0xef, 0xd2, 0x8b, 0xc4,\n                                                     0x97, 0x1e, 0xa5, 0x7, 0x52, 0x97, 0x44, 0x8b,\n                                                     0xef, 0x1a, 0xf7, 0x53, 0x7, 0xdd, 0x6b, 0xa9,\n                                                     0x3d, 0x1e, 0x26, 0x72, 0xbc, 0x6, 0xbd, 0xb0,\n                                                     0x74, 0x4b, 0x1f, 0xfb, 0x53, 0x7, 0x39, 0xf3,\n                                                     0x65, 0xb6, 0x83, 0x1e, 0x5e, 0x89, 0x25, 0x63,\n                                                     0x3b, 0x1a, 0xfb, 0x53, 0x7, 0x4b, 0x66, 0x74,\n                                                     0x59, 0x1e, 0xe, 0xa9, 0xf7, 0x7d, 0xc2, 0x1,\n                                                     0xf8, 0xf1, 0xc2, 0x3, 0xae, 0xf7, 0xb4, 0x15,\n                                                     0xf9, 0x5, 0xfb, 0xb4, 0x54, 0xf7, 0x7d, 0xfc,\n                                                     0xce, 0x6, 0xe, 0xfb, 0xaf, 0xf8, 0x15, 0xb4,\n                                                     0xf7, 0x6e, 0xb4, 0x1, 0xbd, 0xb6, 0xf7, 0x6b,\n                                                     0xb5, 0x3, 0xbd, 0xf8, 0xab, 0x15, 0x38, 0xce,\n                                                     0x48, 0xde, 0xdd, 0xcf, 0xce, 0xde, 0xdd, 0x47,\n                                                     0xcf, 0x39, 0x38, 0x48, 0x49, 0x37, 0x1e, 0xb6,\n                                                     0x16, 0xc7, 0xb9, 0xbc, 0xc7, 0xc8, 0xbb, 0x5a,\n                                                     0x4f, 0x4e, 0x5b, 0x5b, 0x4f, 0x4e, 0x5d, 0xbb,\n                                                     0xc8, 0x1e, 0xe, 0x8b, 0xc2, 0xf7, 0xbe, 0xc2,\n                                                     0xf7, 0x81, 0x77, 0x1, 0xf7, 0x8b, 0xc2, 0x3,\n                                                     0x95, 0xf7, 0xf5, 0x15, 0xf7, 0x81, 0xfb, 0x82,\n                                                     0xc2, 0xf7, 0x82, 0xf7, 0x81, 0xc2, 0xfb, 0x81,\n                                                     0xf7, 0x81, 0x54, 0xfb, 0x81, 0xfb, 0x81, 0x6,\n                                                     0xfc, 0x2c, 0x4, 0xf8, 0xa5, 0xc2, 0xfc, 0xa5,\n                                                     0x6, 0xe, 0x20, 0xfb, 0x5e, 0x76, 0xf7, 0x61,\n                                                     0xbd, 0x59, 0xd2, 0xf8, 0x53, 0x77, 0x12, 0xc8,\n                                                     0xe1, 0xf7, 0x63, 0xe1, 0x13, 0xdc, 0xec, 0xaa,\n                                                     0x15, 0x6c, 0x9c, 0xbd, 0x79, 0xb4, 0x1b, 0xca,\n                                                     0xd3, 0xd2, 0xb1, 0x9a, 0x1f, 0x52, 0x8c, 0xb8,\n                                                     0x57, 0xcf, 0x1b, 0xd1, 0xa7, 0xc6, 0xc7, 0x1f,\n                                                     0x77, 0x6, 0x72, 0x81, 0x80, 0x5f, 0x67, 0x1b,\n                                                     0x69, 0x7b, 0xbd, 0xad, 0x1f, 0xf8, 0x14, 0x35,\n                                                     0xfb, 0xfe, 0x7, 0x13, 0xbc, 0x5d, 0x6f, 0x62,\n                                                     0x64, 0x5c, 0x1b, 0x4a, 0x71, 0xbf, 0xc9, 0x1f,\n                                                     0xf7, 0xe1, 0x35, 0xfc, 0x80, 0x7, 0x73, 0x88,\n                                                     0x78, 0x87, 0x7b, 0x1e, 0x83, 0x6b, 0x7e, 0x72,\n                                                     0x63, 0x1a, 0x66, 0x9e, 0x65, 0xa8, 0xa6, 0x9e,\n                                                     0xb2, 0xb0, 0xb0, 0x7e, 0xa1, 0x82, 0xaf, 0x1e,\n                                                     0x87, 0x9b, 0x88, 0x9f, 0x8a, 0xa3, 0x8, 0xe,\n                                                     0xa8, 0x76, 0xf8, 0x98, 0x77, 0x1, 0x9c, 0xb8,\n                                                     0x15, 0xaf, 0x66, 0xf7, 0x72, 0xf7, 0x72, 0xf7,\n                                                     0x72, 0xfb, 0x72, 0xaf, 0xb0, 0xfb, 0x70, 0xf7,\n                                                     0x71, 0xf7, 0x70, 0xf7, 0x71, 0x68, 0xb0, 0xfb,\n                                                     0x73, 0xfb, 0x72, 0xfb, 0x72, 0xf7, 0x72, 0x67,\n                                                     0x66, 0xf7, 0x70, 0xfb, 0x71, 0x5, 0xe, 0xd2,\n                                                     0xf7, 0x4, 0xc0, 0xc2, 0xc0, 0xf7, 0x4, 0x1,\n                                                     0xf7, 0x68, 0xf7, 0x4, 0x14, 0xe0, 0x95, 0xf7,\n                                                     0x80, 0x15, 0x3a, 0xa, 0xf7, 0x5e, 0xf7, 0x1,\n                                                     0x37, 0xa, 0xfb, 0xa5, 0x4, 0x22, 0xa, 0xfb,\n                                                     0x4b, 0xf8, 0xa, 0xac, 0xf7, 0x91, 0xa5, 0x1,\n                                                     0x8d, 0xdf, 0xf7, 0xdc, 0xdb, 0x3, 0xf0, 0xf8,\n                                                     0xa, 0x15, 0xf7, 0x9, 0x6, 0x6d, 0xfb, 0xab,\n                                                     0x85, 0x4f, 0x84, 0x53, 0x8, 0x6a, 0x87, 0x76,\n                                                     0xfb, 0x5, 0x53, 0x1b, 0x82, 0x80, 0x8d, 0x90,\n                                                     0x1f, 0x9a, 0x97, 0x8b, 0xb0, 0x1a, 0x9f, 0x78,\n                                                     0x9e, 0x78, 0x76, 0x72, 0x7d, 0x65, 0x5a, 0xb6,\n                                                     0x74, 0xb5, 0x1e, 0xe8, 0x8c, 0xb0, 0xe6, 0x9c,\n                                                     0xd7, 0xa7, 0xf7, 0x1c, 0x9c, 0xf7, 0x16, 0xa2,\n                                                     0xf7, 0x19, 0x8, 0xf7, 0xe, 0x6, 0x95, 0xac,\n                                                     0x5, 0xfb, 0x14, 0x6, 0xf7, 0x3d, 0xa0, 0x9c,\n                                                     0xdf, 0xbe, 0x1b, 0x9b, 0x94, 0x87, 0x83, 0x1f,\n                                                     0x84, 0x85, 0x7b, 0x81, 0x1a, 0x76, 0x9c, 0x73,\n                                                     0xa4, 0xa5, 0x97, 0x9e, 0xa8, 0xb3, 0x67, 0xa7,\n                                                     0x6b, 0xfb, 0x26, 0x65, 0xfb, 0x30, 0xfb, 0xf,\n                                                     0x7b, 0x1e, 0xfb, 0x4, 0x6, 0xe, 0xb2, 0xa0,\n                                                     0x76, 0xf7, 0x6e, 0xb5, 0xf8, 0x31, 0x77, 0x1,\n                                                     0x8f, 0xf7, 0x13, 0xf8, 0x4, 0xf7, 0x4d, 0x3,\n                                                     0x8f, 0x16, 0xf7, 0x54, 0x9d, 0x6, 0x7c, 0x59,\n                                                     0x90, 0xb5, 0x94, 0x8d, 0x95, 0x8f, 0x97, 0x1f,\n                                                     0xbb, 0xf7, 0xe, 0x5, 0xf7, 0x97, 0x6, 0xbc,\n                                                     0xfb, 0xe, 0x5, 0x8f, 0x7f, 0x8d, 0x81, 0x82,\n                                                     0x1a, 0x61, 0x59, 0x86, 0x7c, 0x1e, 0x79, 0xf7,\n                                                     0x8e, 0x9d, 0x7, 0x5d, 0x7d, 0xaf, 0xb1, 0x7a,\n                                                     0x1f, 0xfb, 0x8f, 0xf8, 0xd9, 0x5, 0x71, 0x6,\n                                                     0xfb, 0x8d, 0xfc, 0xd9, 0x5, 0x67, 0x7b, 0x79,\n                                                     0x65, 0x60, 0x1b, 0xf7, 0x5c, 0xf7, 0x86, 0x15,\n                                                     0xf7, 0x5, 0xf7, 0xa0, 0xf7, 0x5, 0xfb, 0xa0,\n                                                     0x5, 0xe, 0x7b, 0x8b, 0xb5, 0xf7, 0xb2, 0xb5,\n                                                     0xf7, 0x98, 0xb6, 0x12, 0xf7, 0xb, 0xf3, 0xf7,\n                                                     0x81, 0xf2, 0x36, 0xf7, 0x6, 0x13, 0xf4, 0xa8,\n                                                     0x16, 0xf7, 0xe7, 0x6, 0xf7, 0x10, 0xef, 0xd5,\n                                                     0xf7, 0x2, 0xd6, 0x5d, 0xd0, 0xfb, 0x2, 0xa3,\n                                                     0x1f, 0x8d, 0x7, 0x13, 0xf8, 0xe3, 0xa5, 0xb2,\n                                                     0xbb, 0xd3, 0x1a, 0xf7, 0x32, 0xfb, 0x32, 0x9a,\n                                                     0x28, 0x33, 0xa, 0xf7, 0xf4, 0x15, 0x13, 0x78,\n                                                     0xf7, 0x8f, 0x7, 0x99, 0xd2, 0x86, 0x97, 0xf7,\n                                                     0xc, 0xad, 0x42, 0x4e, 0xfb, 0xd, 0xfb, 0xa,\n                                                     0x86, 0x63, 0x1e, 0x3c, 0x61, 0x15, 0xde, 0x6,\n                                                     0x13, 0xf4, 0xf1, 0xd1, 0x68, 0xfb, 0x9, 0x3a,\n                                                     0x4f, 0x56, 0x4b, 0x1f, 0x33, 0x6, 0x61, 0x8a,\n                                                     0xab, 0xa3, 0x1f, 0xe, 0x3b, 0xa0, 0x76, 0xf9,\n                                                     0x8, 0xb8, 0x77, 0x9f, 0x12, 0xf7, 0x11, 0xf3,\n                                                     0xf7, 0xf7, 0xa4, 0x13, 0xd0, 0xa3, 0x16, 0xf7,\n                                                     0xbb, 0x9d, 0x6, 0x2a, 0xa, 0x13, 0x58, 0xf8,\n                                                     0xac, 0xf7, 0x54, 0x7, 0xea, 0xcc, 0x6a, 0x37,\n                                                     0x8e, 0x1f, 0xa4, 0x6, 0x7a, 0xf7, 0x36, 0x5,\n                                                     0xfc, 0xcc, 0x6, 0x13, 0xb0, 0x77, 0x7, 0x9f,\n                                                     0x8a, 0xdc, 0x86, 0x23, 0x1a, 0xfc, 0x57, 0x7,\n                                                     0x54, 0x5d, 0x78, 0x54, 0x1e, 0xe, 0x43, 0x8b,\n                                                     0xb9, 0xf7, 0xb3, 0xb5, 0xf7, 0x8e, 0xbb, 0x79,\n                                                     0x9d, 0x12, 0xf7, 0xe, 0xf3, 0xf7, 0x96, 0xa2,\n                                                     0xa8, 0xa6, 0x13, 0xee, 0xab, 0x16, 0xf8, 0xa9,\n                                                     0x6, 0xb9, 0xf7, 0x3e, 0x5, 0x6c, 0x6, 0x58,\n                                                     0x73, 0x72, 0x42, 0x21, 0x1b, 0xfb, 0x33, 0x6,\n                                                     0x76, 0x78, 0x99, 0xae, 0x1f, 0xf7, 0x82, 0xf7,\n                                                     0x30, 0x7, 0xdb, 0xa1, 0x69, 0x4f, 0x1f, 0xa2,\n                                                     0xf7, 0x7a, 0x74, 0x6, 0x4f, 0x75, 0x69, 0x3b,\n                                                     0x1e, 0xfb, 0x30, 0xf7, 0x8e, 0xf7, 0x6b, 0x6,\n                                                     0xe1, 0x87, 0x55, 0x5d, 0x98, 0x1f, 0xa6, 0xf7,\n                                                     0x28, 0xfc, 0xa7, 0x6, 0x13, 0xdc, 0x79, 0x7,\n                                                     0x25, 0xa, 0xe, 0x43, 0x8b, 0xb5, 0xf8, 0xe1,\n                                                     0xb5, 0x1, 0xb7, 0xf8, 0xe4, 0x3, 0xb7, 0x16,\n                                                     0xf8, 0xcb, 0x6, 0xa4, 0xf7, 0x49, 0x5, 0x6e,\n                                                     0x6, 0x5c, 0x7d, 0x78, 0x2f, 0xfb, 0x1f, 0x1b,\n                                                     0xfb, 0x87, 0x6, 0xf8, 0x31, 0xf8, 0xf0, 0x5,\n                                                     0xa6, 0xfc, 0x9e, 0x7, 0x7c, 0xfb, 0x43, 0x5,\n                                                     0xa4, 0x6, 0xd1, 0x9f, 0x9a, 0xca, 0xf7, 0x12,\n                                                     0x1b, 0xf7, 0x6f, 0x6, 0xfc, 0x41, 0xfc, 0xf8,\n                                                     0x5, 0xe, 0xb2, 0xa0, 0x76, 0xf7, 0xd7, 0xb5,\n                                                     0xf7, 0xc8, 0x77, 0x1, 0xf7, 0x15, 0xf3, 0xf7,\n                                                     0xc2, 0xf3, 0x3, 0xb2, 0x24, 0xa, 0xf7, 0x7b,\n                                                     0xf7, 0xc2, 0xfb, 0x7b, 0x27, 0xa, 0x79, 0xf7,\n                                                     0xb0, 0x9d, 0x7, 0x2a, 0xa, 0xf8, 0x7d, 0x7,\n                                                     0x3c, 0xa, 0xfb, 0x6c, 0xfb, 0xc2, 0xf7, 0x6c,\n                                                     0x26, 0xa, 0xc5, 0x7a, 0xb2, 0xf7, 0xae, 0xce,\n                                                     0xf7, 0xa5, 0xb2, 0x1, 0xb4, 0xf7, 0x6, 0xf8,\n                                                     0x50, 0xf7, 0x8, 0x3, 0xb4, 0xf7, 0xe6, 0x15,\n                                                     0xfb, 0x42, 0xf7, 0x14, 0xfb, 0x49, 0xf7, 0x63,\n                                                     0xf7, 0x63, 0xf7, 0x18, 0xf7, 0x49, 0xf7, 0x42,\n                                                     0xf7, 0x3e, 0xfb, 0x1b, 0xf7, 0x43, 0xfb, 0x60,\n                                                     0xfb, 0x60, 0xfb, 0x17, 0xfb, 0x43, 0xfb, 0x3e,\n                                                     0x1e, 0xf7, 0x6, 0x16, 0xf7, 0x22, 0xbc, 0xf7,\n                                                     0x38, 0xf7, 0x40, 0xf7, 0x41, 0xbd, 0xfb, 0x38,\n                                                     0xfb, 0x22, 0xfb, 0x1a, 0x50, 0xfb, 0x4a, 0xfb,\n                                                     0x38, 0xfb, 0x3d, 0x57, 0xf7, 0x4a, 0xf7, 0x1a,\n                                                     0x1e, 0xd9, 0x35, 0x15, 0x9a, 0x8a, 0x5, 0xad,\n                                                     0x96, 0x9e, 0x9e, 0xb0, 0x1b, 0xf7, 0x12, 0x6,\n                                                     0xb0, 0x9e, 0x78, 0x69, 0x96, 0x1f, 0x9a, 0x8c,\n                                                     0x5, 0x87, 0xac, 0x89, 0xa7, 0xa4, 0x1a, 0xa4,\n                                                     0x8d, 0xa7, 0x8f, 0xab, 0x1e, 0x7c, 0x8c, 0x5,\n                                                     0x6a, 0x80, 0x78, 0x77, 0x66, 0x1b, 0xfb, 0x12,\n                                                     0x6, 0x66, 0x78, 0x9f, 0xac, 0x80, 0x1f, 0x7c,\n                                                     0x8a, 0x5, 0x8f, 0x6b, 0x8d, 0x6f, 0x72, 0x1a,\n                                                     0x72, 0x89, 0x6f, 0x87, 0x6a, 0x1e, 0xe, 0xfb,\n                                                     0xf2, 0x3b, 0xa, 0xf7, 0xe, 0xf3, 0x3, 0xab,\n                                                     0x24, 0xa, 0xf8, 0x7d, 0x26, 0xa, 0xb2, 0x3b,\n                                                     0xa, 0xf7, 0x11, 0xf3, 0xf7, 0x9a, 0xf7, 0x42,\n                                                     0x3, 0xae, 0x24, 0xa, 0xf7, 0x61, 0x7, 0xac,\n                                                     0xa9, 0xf7, 0x66, 0xfb, 0x81, 0x5, 0x9a, 0x79,\n                                                     0x93, 0x7d, 0x80, 0x1a, 0x77, 0x72, 0x82, 0x57,\n                                                     0x1e, 0x79, 0xf7, 0xc4, 0x9d, 0x7, 0x6a, 0x91,\n                                                     0x73, 0x88, 0x43, 0xdc, 0xfb, 0x95, 0xf7, 0xb6,\n                                                     0x18, 0xd5, 0xd0, 0xbd, 0xbb, 0xcd, 0xd0, 0x8,\n                                                     0xc5, 0xc6, 0xae, 0x9e, 0xb8, 0x1b, 0x9d, 0xfb,\n                                                     0x98, 0x79, 0x7, 0xbd, 0xaf, 0x81, 0x74, 0x80,\n                                                     0x84, 0x7c, 0x79, 0x79, 0x1f, 0x3f, 0x3d, 0x3d,\n                                                     0x43, 0x38, 0x47, 0x8, 0xf7, 0x71, 0x26, 0xa,\n                                                     0x8e, 0x8b, 0x9d, 0xf9, 0x28, 0x77, 0x1, 0x91,\n                                                     0xf7, 0x28, 0xf7, 0xdd, 0xf7, 0x59, 0x3, 0x91,\n                                                     0x16, 0xf7, 0x6b, 0x9d, 0x6, 0x6d, 0x66, 0x91,\n                                                     0xb4, 0x97, 0x8e, 0x9a, 0x92, 0x9e, 0x1f, 0xf7,\n                                                     0x26, 0xf8, 0x15, 0xf7, 0x36, 0xfc, 0x17, 0x5,\n                                                     0x91, 0x7c, 0x90, 0x75, 0x81, 0x1a, 0x5f, 0x51,\n                                                     0x8b, 0x7a, 0x1e, 0x79, 0xf7, 0xa4, 0x9d, 0x7,\n                                                     0x80, 0x53, 0xa1, 0xd0, 0x6d, 0x1f, 0xfb, 0x87,\n                                                     0xf8, 0xcd, 0x5, 0x83, 0x6, 0xfb, 0x6c, 0xfc,\n                                                     0xcb, 0x5, 0x52, 0x74, 0x46, 0x67, 0x79, 0x1b,\n                                                     0xe, 0xf7, 0x62, 0x3b, 0xa, 0xf7, 0xd, 0xbc,\n                                                     0xf8, 0x9f, 0xf3, 0x3, 0xa7, 0x16, 0xf7, 0x7c,\n                                                     0x9d, 0x6, 0x58, 0x64, 0xa6, 0xba, 0x1f, 0xf8,\n                                                     0x57, 0x7, 0xf7, 0x98, 0xfc, 0xb3, 0x5, 0x9d,\n                                                     0x6, 0xf7, 0x89, 0xf8, 0xd0, 0x5, 0xfc, 0x74,\n                                                     0x27, 0xa, 0x79, 0xf7, 0xb0, 0x9d, 0x7, 0x54,\n                                                     0x68, 0x94, 0xcc, 0x1f, 0xf8, 0x76, 0x7, 0xd2,\n                                                     0xc8, 0x95, 0xa8, 0x1e, 0x9d, 0xfb, 0x5c, 0x7,\n                                                     0xfb, 0x74, 0xfc, 0x92, 0xfb, 0x7e, 0xf8, 0x92,\n                                                     0x5, 0xfb, 0x5d, 0x79, 0x6, 0xda, 0x85, 0x99,\n                                                     0x65, 0x49, 0x1a, 0xfc, 0x59, 0x7, 0x5c, 0x61,\n                                                     0x70, 0x58, 0x1e, 0xe, 0xb2, 0x98, 0x76, 0xf9,\n                                                     0x3d, 0x77, 0x1, 0xf7, 0xb, 0xbc, 0xf8, 0x31,\n                                                     0xbc, 0x3, 0xa8, 0x83, 0x15, 0xf7, 0x79, 0x9d,\n                                                     0x6, 0x58, 0x64, 0xa6, 0xba, 0x1f, 0xf8, 0x5b,\n                                                     0x7, 0xf8, 0x4c, 0xfc, 0xb7, 0x5, 0xa1, 0xf8,\n                                                     0xe1, 0x6, 0x31, 0xa, 0xfb, 0x79, 0x45, 0xa,\n                                                     0xfc, 0x20, 0x7, 0xfc, 0x13, 0xf8, 0x7c, 0x5,\n                                                     0xfb, 0x3d, 0x79, 0x6, 0xbe, 0x94, 0x79, 0x69,\n                                                     0xa9, 0x1f, 0xfc, 0x9b, 0x7, 0x5c, 0x64, 0x70,\n                                                     0x58, 0x1e, 0xe, 0x65, 0x8b, 0xe8, 0xf7, 0x69,\n                                                     0xea, 0xf7, 0x4a, 0xe5, 0x1, 0xaf, 0x9d, 0xe8,\n                                                     0x9d, 0xf7, 0xc9, 0x9d, 0xe4, 0x9d, 0x3, 0xc7,\n                                                     0xf8, 0x9e, 0x15, 0x9b, 0x6, 0x9d, 0x8e, 0x8d,\n                                                     0xb6, 0xcd, 0x1b, 0xf7, 0xec, 0x6, 0xcd, 0x8e,\n                                                     0x60, 0x79, 0x8e, 0x1f, 0x9b, 0xf7, 0x2b, 0xfc,\n                                                     0x9b, 0x6, 0xe2, 0xfc, 0x3b, 0x15, 0x9d, 0x6,\n                                                     0xbb, 0x8e, 0xa3, 0x93, 0xae, 0x1b, 0xf7, 0x4d,\n                                                     0x6, 0xae, 0xa3, 0x83, 0x5b, 0x8e, 0x1f, 0x9d,\n                                                     0xf7, 0x63, 0x79, 0x6, 0x5b, 0x88, 0x73, 0x83,\n                                                     0x68, 0x1b, 0xfb, 0x4d, 0x6, 0x68, 0x73, 0x93,\n                                                     0xbb, 0x88, 0x1f, 0x79, 0x6, 0xfb, 0x3, 0xfc,\n                                                     0x5d, 0x15, 0xf8, 0xc7, 0xf7, 0x56, 0x79, 0x6,\n                                                     0x47, 0x82, 0x7b, 0x6a, 0x43, 0x1b, 0xfb, 0xdd,\n                                                     0x6, 0x43, 0x77, 0xac, 0xcf, 0x82, 0x1f, 0x79,\n                                                     0x6, 0xe, 0xb2, 0x7a, 0xb2, 0xf9, 0x4, 0xb2,\n                                                     0x1, 0xb4, 0xf7, 0x8, 0xf8, 0x4f, 0xf7, 0x7,\n                                                     0x3, 0xb4, 0xf7, 0xe4, 0x15, 0xfb, 0x42, 0xf7,\n                                                     0x16, 0xfb, 0x47, 0xf7, 0x63, 0xf7, 0x63, 0xf7,\n                                                     0x16, 0xf7, 0x47, 0xf7, 0x42, 0xf7, 0x3e, 0xfb,\n                                                     0x19, 0xf7, 0x47, 0xfb, 0x60, 0xfb, 0x60, 0xfb,\n                                                     0x19, 0xfb, 0x47, 0xfb, 0x3e, 0x1e, 0xf7, 0x8,\n                                                     0x16, 0xf7, 0x1b, 0xc6, 0xf7, 0x43, 0xf7, 0x36,\n                                                     0xf7, 0x3b, 0xc2, 0xfb, 0x3f, 0xfb, 0x20, 0xfb,\n                                                     0x1b, 0x53, 0xfb, 0x46, 0xfb, 0x3a, 0xfb, 0x3c,\n                                                     0x56, 0xf7, 0x48, 0xf7, 0x1a, 0x1e, 0xe, 0xe0,\n                                                     0xa0, 0x76, 0xf9, 0xc, 0xb4, 0x79, 0x9d, 0x12,\n                                                     0xf7, 0x7, 0xf2, 0xf7, 0xe1, 0xf2, 0x13, 0xd8,\n                                                     0xa4, 0x24, 0xa, 0x8a, 0xf8, 0xb0, 0x5, 0xf7,\n                                                     0xe1, 0xfc, 0xb0, 0x6, 0x28, 0xa, 0x79, 0xf7,\n                                                     0xb0, 0x9d, 0x7, 0x2a, 0xa, 0x8a, 0xf8, 0x6f,\n                                                     0x5, 0x13, 0xb8, 0xd4, 0xcc, 0x9a, 0xa5, 0x1e,\n                                                     0x9d, 0xfd, 0x64, 0x79, 0x7, 0xa5, 0xcb, 0x7c,\n                                                     0x42, 0x1f, 0xfc, 0x6f, 0x39, 0xa, 0xfb, 0x13,\n                                                     0xa0, 0x76, 0xf7, 0xc0, 0xb4, 0xf7, 0xb8, 0xb3,\n                                                     0x79, 0x9d, 0x12, 0xf7, 0xa, 0xf3, 0xf7, 0x6a,\n                                                     0xf6, 0x13, 0xdc, 0xa7, 0x24, 0xa, 0xf7, 0x64,\n                                                     0x7, 0xf7, 0xbe, 0x8a, 0xa2, 0xd5, 0xf7, 0xf,\n                                                     0x1a, 0xf7, 0x5, 0x6a, 0xcb, 0xfb, 0x61, 0x33,\n                                                     0xa, 0xf7, 0xe3, 0x15, 0xf7, 0x94, 0x7, 0x13,\n                                                     0xec, 0x9e, 0x9d, 0x90, 0x9c, 0x1e, 0xf7, 0x9,\n                                                     0x8c, 0xc9, 0x77, 0xfb, 0xa, 0x1a, 0xfb, 0x12,\n                                                     0x6b, 0x6e, 0xfb, 0x2d, 0x7f, 0x81, 0x92, 0x90,\n                                                     0x84, 0x1e, 0xe, 0x30, 0x8b, 0xe9, 0xf8, 0xa9,\n                                                     0xb9, 0x1, 0x90, 0x16, 0xf8, 0xb7, 0x6, 0xb0,\n                                                     0xf7, 0x61, 0x5, 0x77, 0x6, 0x2a, 0x6d, 0x5c,\n                                                     0x7d, 0x4b, 0x1b, 0xfb, 0xaf, 0x6, 0xf7, 0x80,\n                                                     0xf7, 0xa7, 0xfb, 0x5d, 0xf7, 0x96, 0x5, 0xf7,\n                                                     0x66, 0x6, 0xee, 0xa6, 0x48, 0x65, 0x95, 0x1f,\n                                                     0x9e, 0x6, 0x81, 0xf7, 0x2b, 0x5, 0xfc, 0x9a,\n                                                     0x6, 0xf7, 0xa1, 0xfb, 0xee, 0x5, 0xe, 0x43,\n                                                     0xa0, 0x76, 0xf9, 0xe, 0xb2, 0x1, 0xae, 0xa3,\n                                                     0xf7, 0x65, 0xf3, 0xf7, 0x65, 0xa2, 0x3, 0xf7,\n                                                     0x46, 0x24, 0xa, 0xf8, 0xb2, 0x7, 0xf7, 0xc,\n                                                     0x8c, 0xe5, 0x6f, 0x8a, 0x20, 0xa5, 0x8d, 0x18,\n                                                     0x86, 0xf7, 0x3f, 0x5, 0xfc, 0xc8, 0x6, 0x86,\n                                                     0xfb, 0x3f, 0xa5, 0x89, 0x8c, 0xf6, 0xdb, 0xa7,\n                                                     0xf7, 0x14, 0x8a, 0x19, 0xfc, 0xb2, 0x39, 0xa,\n                                                     0x92, 0x3b, 0xa, 0xf7, 0xba, 0xf3, 0x3, 0xf7,\n                                                     0x60, 0x24, 0xa, 0xf7, 0x60, 0x7, 0xf7, 0x4d,\n                                                     0xf7, 0xbe, 0x5, 0xca, 0xb2, 0xb0, 0x89, 0xae,\n                                                     0x1b, 0x9d, 0xfb, 0x7c, 0x79, 0x7, 0xbf, 0x9b,\n                                                     0x7f, 0x7c, 0x81, 0x84, 0x7e, 0x84, 0x80, 0x1f,\n                                                     0xfb, 0x20, 0xfb, 0x7b, 0xfb, 0x30, 0xf7, 0x83,\n                                                     0x5, 0x85, 0x95, 0x88, 0x94, 0x92, 0x1a, 0x9d,\n                                                     0xa5, 0x94, 0xbf, 0x1e, 0x9d, 0xfb, 0xbd, 0x79,\n                                                     0x7, 0xc0, 0xac, 0x64, 0x7b, 0x97, 0x1f, 0xf7,\n                                                     0x60, 0xfb, 0xc0, 0x5, 0xfb, 0x64, 0x39, 0xa,\n                                                     0xdb, 0x8b, 0x9d, 0xe2, 0xae, 0xf8, 0x21, 0xaa,\n                                                     0xe2, 0x9d, 0x1, 0xa5, 0xf7, 0xd, 0xf7, 0x4f,\n                                                     0xf1, 0xf7, 0x4f, 0xf7, 0xa, 0x3, 0xf7, 0x7c,\n                                                     0x16, 0xf7, 0xc6, 0x9d, 0x6, 0x32, 0x7e, 0xb4,\n                                                     0xb9, 0x1f, 0xf7, 0x21, 0x8a, 0xf7, 0x38, 0xd5,\n                                                     0xf7, 0x2d, 0x1a, 0xf7, 0x23, 0xfb, 0x2b, 0xe9,\n                                                     0xfb, 0x2e, 0x1e, 0xb9, 0x97, 0xb4, 0xe4, 0x1e,\n                                                     0x9d, 0xfb, 0xc4, 0x79, 0x7, 0xe4, 0x97, 0x62,\n                                                     0x5d, 0x1f, 0xfb, 0x37, 0xfb, 0x25, 0x2f, 0xfb,\n                                                     0x25, 0xfb, 0x2f, 0xf7, 0x35, 0x43, 0xf7, 0x27,\n                                                     0x8c, 0x1f, 0x5d, 0x7e, 0x62, 0x32, 0x1e, 0xf7,\n                                                     0x60, 0xf7, 0xe, 0x15, 0xf8, 0x21, 0x7, 0xf7,\n                                                     0x4, 0xd6, 0x31, 0xfb, 0x8, 0x3d, 0x5a, 0xfb,\n                                                     0x5, 0xfb, 0x1e, 0x1f, 0x25, 0x16, 0xfb, 0x1c,\n                                                     0x58, 0xf7, 0x4, 0xda, 0xf7, 0x1, 0xce, 0xeb,\n                                                     0xf7, 0xc, 0x8c, 0x1f, 0xe, 0xb2, 0xa0, 0x76,\n                                                     0xf9, 0x35, 0x77, 0x12, 0x82, 0xf7, 0x38, 0xfb,\n                                                     0x38, 0xf9, 0x5d, 0xfb, 0x46, 0xf7, 0x35, 0x13,\n                                                     0xe8, 0x82, 0x16, 0xf7, 0x7a, 0x9d, 0x6, 0x59,\n                                                     0x7b, 0x9f, 0xa0, 0x95, 0x90, 0x96, 0x92, 0x94,\n                                                     0x1f, 0xf7, 0x39, 0xf7, 0x5f, 0xf7, 0x21, 0xfb,\n                                                     0x67, 0x5, 0x91, 0x81, 0x8e, 0x82, 0x83, 0x1a,\n                                                     0x76, 0x72, 0x7c, 0x56, 0x1e, 0x79, 0x7, 0x13,\n                                                     0xd0, 0xf7, 0xc0, 0x9d, 0x6, 0x62, 0x5f, 0xb9,\n                                                     0x9b, 0x7f, 0x1f, 0xfb, 0x67, 0xf7, 0xbb, 0xf7,\n                                                     0x42, 0xf7, 0x65, 0x5, 0x13, 0xf0, 0xae, 0xa9,\n                                                     0xc7, 0xaf, 0xa6, 0x1b, 0x9d, 0xfb, 0x7c, 0x79,\n                                                     0x7, 0xc0, 0x9d, 0x7e, 0x7a, 0x7d, 0x83, 0x7c,\n                                                     0x82, 0x7f, 0x1f, 0xfb, 0x20, 0xfb, 0x3f, 0xfb,\n                                                     0xf, 0xf7, 0x47, 0x5, 0x84, 0x96, 0x89, 0x95,\n                                                     0x94, 0x1a, 0x9f, 0xa4, 0x98, 0xc0, 0x1e, 0x9d,\n                                                     0xfb, 0xc0, 0x79, 0x7, 0xb8, 0xb7, 0x5b, 0x7b,\n                                                     0x97, 0x1f, 0xf7, 0x51, 0xfb, 0x96, 0xfb, 0x5d,\n                                                     0xfb, 0x88, 0x5, 0x66, 0x6c, 0x51, 0x69, 0x73,\n                                                     0x1b, 0xe, 0xf7, 0x4, 0xa0, 0x76, 0xf7, 0xb6,\n                                                     0xb3, 0xf7, 0xd9, 0x9d, 0x96, 0x77, 0x12, 0xd2,\n                                                     0xf7, 0x7, 0xf7, 0x34, 0xf3, 0xf7, 0x34, 0xf7,\n                                                     0x7, 0x14, 0xe, 0x13, 0xde, 0xf7, 0x94, 0x24,\n                                                     0xa, 0xf7, 0x5a, 0x7, 0xf7, 0x1b, 0xf7, 0x20,\n                                                     0xad, 0xf7, 0x20, 0xf7, 0x5, 0x82, 0xe4, 0xcc,\n                                                     0x1f, 0x9d, 0x7, 0xfb, 0x19, 0x65, 0x3a, 0xfb,\n                                                     0x1b, 0xfb, 0x12, 0x29, 0x80, 0x4d, 0x8a, 0x1f,\n                                                     0xf7, 0x8f, 0x7, 0x13, 0xee, 0x3c, 0xa, 0xfb,\n                                                     0x8f, 0x7, 0x4d, 0x8c, 0x29, 0x96, 0xf7, 0x12,\n                                                     0x1a, 0x13, 0xde, 0xf7, 0x1e, 0x6c, 0xd9, 0xfb,\n                                                     0x20, 0x1e, 0x79, 0x7, 0xd2, 0x7c, 0x33, 0xfb,\n                                                     0x6, 0xfb, 0x21, 0xf7, 0x1f, 0x6a, 0xf7, 0x1c,\n                                                     0x1f, 0xfb, 0x5a, 0x39, 0xa, 0x57, 0x79, 0xad,\n                                                     0x69, 0xd1, 0xf8, 0x26, 0xb9, 0x12, 0xb4, 0xf5,\n                                                     0x13, 0x70, 0xf8, 0x4e, 0xf6, 0x15, 0x49, 0xae,\n                                                     0xa5, 0x50, 0xb7, 0x1b, 0xd4, 0x8d, 0xf7, 0x4,\n                                                     0xb6, 0x1f, 0x79, 0x6, 0x7d, 0x8c, 0x76, 0x44,\n                                                     0x6b, 0x1b, 0x69, 0x6b, 0xcb, 0xc1, 0x7d, 0x1f,\n                                                     0xf7, 0x7, 0xf7, 0xde, 0x5, 0x33, 0x6, 0x4b,\n                                                     0xfb, 0x53, 0x5, 0xdc, 0x7c, 0x55, 0xf7, 0x2,\n                                                     0xfb, 0x2, 0x1b, 0xfb, 0x22, 0x42, 0xfb, 0x0,\n                                                     0xfb, 0x13, 0xfb, 0x35, 0xaf, 0xfb, 0xe, 0xf7,\n                                                     0x3b, 0xea, 0xe1, 0xeb, 0xa8, 0x9c, 0x1f, 0x68,\n                                                     0xf7, 0x8, 0x15, 0x13, 0xb0, 0x20, 0x70, 0x40,\n                                                     0x27, 0x4f, 0x1b, 0x2b, 0x89, 0xf7, 0x42, 0xd4,\n                                                     0xf4, 0x92, 0xe1, 0xf3, 0xd1, 0xcc, 0xfb, 0x28,\n                                                     0x38, 0x99, 0x1f, 0xe, 0xfb, 0x5e, 0x76, 0xf7,\n                                                     0x61, 0xbb, 0xf8, 0x5, 0xc2, 0xf7, 0x91, 0xad,\n                                                     0x12, 0xd8, 0xd9, 0xf7, 0x61, 0xf2, 0x56, 0xf4,\n                                                     0x13, 0xfa, 0xf7, 0x32, 0xb0, 0x15, 0xbd, 0x65,\n                                                     0xc9, 0x79, 0xc6, 0x8c, 0x8, 0xe8, 0x8c, 0xe8,\n                                                     0xda, 0xf7, 0x1e, 0x1a, 0xf2, 0x55, 0xe1, 0x2f,\n                                                     0xb6, 0x1e, 0x13, 0xfc, 0xc8, 0xa2, 0xac, 0xc7,\n                                                     0xc8, 0x1a, 0xf7, 0x7, 0x34, 0xbd, 0xfb, 0x0,\n                                                     0x3c, 0xfb, 0x4, 0x51, 0x28, 0x1e, 0xfd, 0x23,\n                                                     0x7, 0x58, 0x80, 0x59, 0x86, 0x58, 0x1e, 0xe2,\n                                                     0x6, 0x8e, 0xa4, 0x90, 0xa4, 0xa4, 0x1a, 0x8a,\n                                                     0xf7, 0x85, 0x15, 0xf8, 0x8c, 0x7, 0xc7, 0xbc,\n                                                     0xbd, 0xc0, 0xd6, 0xa6, 0x4f, 0x49, 0x8c, 0x1e,\n                                                     0x5c, 0x8c, 0x7b, 0x3b, 0x65, 0x7a, 0x77, 0x91,\n                                                     0x74, 0x1b, 0x77, 0x78, 0x81, 0x74, 0x73, 0x9e,\n                                                     0x81, 0xa0, 0x1f, 0xa3, 0x9e, 0x91, 0x9f, 0x1b,\n                                                     0x13, 0xfa, 0xc0, 0xb9, 0xfb, 0x3a, 0x4b, 0x40,\n                                                     0x6a, 0x4b, 0x31, 0x59, 0x54, 0xa6, 0xaf, 0x70,\n                                                     0x1f, 0xe, 0xfb, 0xa4, 0xfb, 0x60, 0x76, 0xf9,\n                                                     0x1b, 0xd8, 0x1, 0x90, 0x9b, 0xf7, 0x32, 0xf7,\n                                                     0xb, 0x3, 0xf7, 0x83, 0xc7, 0x15, 0x78, 0x5a,\n                                                     0x62, 0x2b, 0x45, 0x1a, 0x63, 0x9e, 0x6d, 0xa7,\n                                                     0xbd, 0xa1, 0xca, 0xc1, 0xcf, 0x7c, 0xd4, 0x88,\n                                                     0xa4, 0x1e, 0xf7, 0x60, 0xf8, 0x4d, 0x5, 0x23,\n                                                     0x6, 0xfb, 0x5, 0xfb, 0xf9, 0x5, 0x89, 0x6,\n                                                     0xe8, 0x79, 0x6c, 0xf7, 0x9c, 0xfb, 0x0, 0x1b,\n                                                     0x4c, 0x65, 0x54, 0x3d, 0x8a, 0x1f, 0x74, 0x8b,\n                                                     0x77, 0x8a, 0x7b, 0x1e, 0x9b, 0x6, 0xb3, 0x8e,\n                                                     0x9a, 0xd6, 0xc0, 0x1b, 0xef, 0xad, 0xfb, 0x9f,\n                                                     0x2c, 0x98, 0x1f, 0xe, 0xfb, 0x51, 0x78, 0xba,\n                                                     0xf9, 0x34, 0xb3, 0x12, 0xb3, 0xee, 0x61, 0xbc,\n                                                     0xf7, 0x82, 0xec, 0x13, 0xe8, 0xf7, 0x93, 0xf8,\n                                                     0x53, 0x15, 0xfb, 0x2b, 0x68, 0x4b, 0x34, 0xfb,\n                                                     0x17, 0x1a, 0x25, 0xe7, 0xfb, 0x3, 0xf7, 0x18,\n                                                     0xf7, 0xb, 0xed, 0xf7, 0x0, 0xf7, 0x8, 0xf7,\n                                                     0xf, 0x54, 0xcf, 0x43, 0xc4, 0x1e, 0x13, 0xd8,\n                                                     0x21, 0xde, 0x25, 0xb9, 0xcf, 0x1a, 0xa7, 0xb1,\n                                                     0xa1, 0xad, 0xb2, 0xa4, 0x7b, 0x77, 0x9d, 0x1e,\n                                                     0x6b, 0xa9, 0x9a, 0x60, 0xb5, 0x1b, 0xa8, 0xa3,\n                                                     0x9c, 0xaa, 0xcf, 0xfb, 0xa, 0xae, 0x3d, 0x4b,\n                                                     0x38, 0x78, 0x40, 0x33, 0xf7, 0x2, 0x58, 0xbb,\n                                                     0x4f, 0x1f, 0xaa, 0x6e, 0x15, 0x97, 0x88, 0xe6,\n                                                     0x24, 0x86, 0xfb, 0x2, 0x8, 0x32, 0x87, 0x5f,\n                                                     0x36, 0x41, 0x1b, 0x66, 0x6d, 0xa4, 0xad, 0x77,\n                                                     0x1f, 0x13, 0xe8, 0x76, 0xae, 0x7c, 0xb7, 0xb1,\n                                                     0x1a, 0xef, 0xb0, 0xe0, 0xf7, 0x2, 0xa8, 0x1e,\n                                                     0xe, 0xfb, 0x88, 0x78, 0xb9, 0xf7, 0x58, 0xba,\n                                                     0x64, 0xbc, 0xf7, 0x4e, 0xaf, 0x12, 0xa1, 0xf3,\n                                                     0x30, 0xe6, 0x13, 0xb8, 0xf7, 0x19, 0xf7, 0x90,\n                                                     0x15, 0x65, 0x86, 0x42, 0x66, 0x30, 0x1a, 0x28,\n                                                     0xf7, 0x4, 0x64, 0xe6, 0xf7, 0x4, 0xe5, 0xa7,\n                                                     0xed, 0x1e, 0x71, 0x92, 0x5, 0x49, 0x77, 0x63,\n                                                     0x76, 0x4f, 0x1b, 0x4d, 0x8a, 0x2e, 0xa6, 0xdb,\n                                                     0x1a, 0xc5, 0xb0, 0xb3, 0xce, 0x1e, 0x13, 0xd8,\n                                                     0xa6, 0x97, 0x83, 0xb0, 0x1b, 0x9d, 0x9b, 0x94,\n                                                     0xa2, 0x1f, 0x13, 0xb8, 0x9d, 0x79, 0x92, 0x79,\n                                                     0x1e, 0x13, 0xd4, 0x67, 0x7c, 0x81, 0x6f, 0x1b,\n                                                     0x5a, 0x5a, 0xb1, 0xcf, 0xb2, 0xb3, 0xbe, 0xc0,\n                                                     0x1f, 0xaf, 0x8c, 0xab, 0x76, 0x92, 0x6e, 0x8,\n                                                     0x5c, 0x96, 0xa8, 0x86, 0x9e, 0x1b, 0xa4, 0x9c,\n                                                     0xa2, 0xa5, 0xc5, 0x30, 0xa9, 0x53, 0x37, 0xfb,\n                                                     0x16, 0x67, 0x20, 0x1f, 0x8c, 0x55, 0xb7, 0x69,\n                                                     0xc0, 0x78, 0x8, 0xe, 0xfb, 0x51, 0xfb, 0x75,\n                                                     0xef, 0xf7, 0x17, 0xed, 0xf9, 0x20, 0x77, 0x12,\n                                                     0xc7, 0xbb, 0x85, 0xc6, 0xf7, 0x9c, 0xb5, 0x13,\n                                                     0xf4, 0xf7, 0x59, 0xf8, 0xdc, 0x15, 0x3c, 0x33,\n                                                     0x51, 0xfb, 0x35, 0x2d, 0x1a, 0xfb, 0x54, 0xf7,\n                                                     0x0, 0x60, 0xf7, 0x44, 0xb8, 0xaf, 0x77, 0x62,\n                                                     0x70, 0x76, 0x43, 0x51, 0x98, 0x1e, 0x8e, 0x7c,\n                                                     0x68, 0x98, 0x72, 0x1b, 0x63, 0x7d, 0x6f, 0x77,\n                                                     0x63, 0xc0, 0x7f, 0xaa, 0xf1, 0xcb, 0xd9, 0xf7,\n                                                     0xd, 0xf7, 0x12, 0xfb, 0x13, 0x8f, 0xfb, 0x2,\n                                                     0xfb, 0x2, 0x7f, 0xec, 0xb7, 0xf7, 0x20, 0xce,\n                                                     0xf7, 0x2, 0xcc, 0xe2, 0x1f, 0xbe, 0x86, 0xf7,\n                                                     0x23, 0xbc, 0xc5, 0x1a, 0xab, 0x77, 0x9a, 0x73,\n                                                     0x4f, 0x27, 0x25, 0x7c, 0x7f, 0x1e, 0x13, 0xec,\n                                                     0x72, 0x8e, 0x6b, 0xa2, 0xae, 0x1a, 0xb2, 0xb5,\n                                                     0x9e, 0x96, 0x90, 0x1e, 0x89, 0x9d, 0x5, 0x67,\n                                                     0x41, 0x58, 0x5d, 0x72, 0xa1, 0x66, 0xd4, 0x7e,\n                                                     0x1f, 0xe, 0x3b, 0xfb, 0x49, 0x76, 0xf7, 0x73,\n                                                     0x76, 0xf8, 0x4f, 0xd2, 0x62, 0x76, 0x12, 0x8b,\n                                                     0x9d, 0xf2, 0xe0, 0xf7, 0x61, 0xe4, 0x13, 0xee,\n                                                     0xf7, 0xd, 0x16, 0xe0, 0xf7, 0xeb, 0x6, 0xb7,\n                                                     0x9e, 0xac, 0xc3, 0xbe, 0x1b, 0xc6, 0xb3, 0x74,\n                                                     0x41, 0x8e, 0x1f, 0x99, 0xfc, 0x5c, 0x8d, 0x56,\n                                                     0x92, 0x7c, 0x8f, 0x73, 0x19, 0xe4, 0x6, 0x82,\n                                                     0x9e, 0x84, 0xb7, 0x97, 0x1a, 0x80, 0xf8, 0x85,\n                                                     0x5, 0xda, 0x89, 0x5b, 0xcc, 0x39, 0x1b, 0x40,\n                                                     0x4f, 0x6f, 0x33, 0x6d, 0x1f, 0xbf, 0x8e, 0x6c,\n                                                     0xc3, 0x53, 0x1b, 0x36, 0x69, 0x39, 0x4b, 0x1f,\n                                                     0x9d, 0x6, 0x13, 0xde, 0xa9, 0x8c, 0xa0, 0xc9,\n                                                     0xae, 0x1b, 0xb3, 0x91, 0x52, 0x58, 0x1f, 0xe,\n                                                     0xfb, 0x36, 0x7a, 0xb1, 0xf7, 0xbb, 0xbf, 0xf7,\n                                                     0xb4, 0xad, 0x1, 0xb6, 0xf1, 0xf7, 0x86, 0xed,\n                                                     0x3, 0xf7, 0x9f, 0x7a, 0x15, 0xf7, 0x3f, 0xba,\n                                                     0xf7, 0x71, 0xf7, 0x1d, 0xf7, 0x24, 0x4f, 0xf7,\n                                                     0x61, 0xfb, 0x34, 0xfb, 0x35, 0x4e, 0xfb, 0x70,\n                                                     0xfb, 0x11, 0xfb, 0x18, 0xc5, 0xfb, 0x7a, 0xf7,\n                                                     0x3a, 0x1f, 0xfb, 0xe, 0xf8, 0x15, 0x15, 0xf7,\n                                                     0x1d, 0xae, 0xf7, 0x2b, 0xe1, 0xf0, 0x9e, 0xfb,\n                                                     0x49, 0x20, 0x8c, 0x1e, 0xfb, 0x85, 0x57, 0x15,\n                                                     0xf7, 0x84, 0x6, 0x32, 0x71, 0xfb, 0x62, 0x2e,\n                                                     0x2c, 0x71, 0xf7, 0x65, 0xe1, 0x1e, 0xe, 0xfb,\n                                                     0xf6, 0x7a, 0xbd, 0xf8, 0x6a, 0x77, 0x1, 0xe3,\n                                                     0xe0, 0x3, 0xf7, 0xd5, 0xf0, 0x15, 0x78, 0x6,\n                                                     0x6e, 0x89, 0x7e, 0x64, 0x61, 0x1b, 0x5a, 0x88,\n                                                     0xce, 0xae, 0x1f, 0xf8, 0x4, 0x7, 0x57, 0x78,\n                                                     0x6c, 0x7b, 0x31, 0x79, 0x8, 0x77, 0x7, 0xab,\n                                                     0xc3, 0x8f, 0xfb, 0x17, 0x1f, 0xfb, 0x78, 0x7,\n                                                     0x5f, 0xa7, 0x5b, 0xcd, 0xf5, 0x93, 0xe8, 0xa4,\n                                                     0x90, 0x1e, 0xe, 0xa0, 0x76, 0xf8, 0x41, 0xd3,\n                                                     0x48, 0xa0, 0x12, 0xf7, 0xb, 0xd6, 0x13, 0xd0,\n                                                     0xf7, 0xb, 0x16, 0xd6, 0xf7, 0x96, 0x6, 0xf7,\n                                                     0x2f, 0xfb, 0x55, 0x5, 0x92, 0x82, 0x90, 0x81,\n                                                     0x83, 0x1a, 0x80, 0x81, 0x82, 0x6f, 0x1e, 0x79,\n                                                     0xf7, 0x7f, 0x9d, 0x7, 0x50, 0x71, 0xaf, 0xb0,\n                                                     0x6c, 0x1f, 0xfb, 0x3c, 0xf7, 0x6a, 0xbe, 0xbe,\n                                                     0xaa, 0xa6, 0xab, 0xa6, 0x19, 0x99, 0x9c, 0x96,\n                                                     0x90, 0x95, 0x1b, 0x97, 0x8a, 0x95, 0x81, 0x9e,\n                                                     0x7e, 0x93, 0x84, 0x9b, 0x87, 0x9b, 0x8c, 0x8,\n                                                     0xa4, 0x8c, 0xa5, 0x98, 0xb0, 0x1a, 0xaf, 0x62,\n                                                     0x9e, 0x6a, 0x6f, 0x6d, 0x80, 0x7b, 0x78, 0x1e,\n                                                     0x41, 0x4f, 0x48, 0x49, 0x43, 0x4b, 0x8, 0x13,\n                                                     0x50, 0xf7, 0x6d, 0x7, 0x13, 0xb0, 0x39, 0x69,\n                                                     0x65, 0x82, 0x62, 0x88, 0x8, 0x76, 0x7, 0xae,\n                                                     0x8a, 0xbe, 0x85, 0x35, 0x1a, 0xe, 0x7a, 0xe2,\n                                                     0xf8, 0xe5, 0xd7, 0x1, 0xc6, 0x9e, 0xf7, 0x67,\n                                                     0xb1, 0xf7, 0x5e, 0x9e, 0x3, 0xa3, 0x7a, 0x15,\n                                                     0xe7, 0x6, 0xf7, 0x3f, 0xf8, 0x12, 0x5, 0x8d,\n                                                     0x6, 0xfb, 0x24, 0xaa, 0x89, 0xfb, 0x82, 0xf7,\n                                                     0xf, 0x1b, 0xe1, 0xa0, 0xf6, 0xd4, 0x1f, 0x78,\n                                                     0x6, 0x70, 0x8a, 0x77, 0x41, 0x57, 0x1b, 0x62,\n                                                     0x6e, 0xba, 0xb6, 0x7f, 0x1f, 0x5f, 0xf7, 0x30,\n                                                     0x65, 0xf7, 0x51, 0x60, 0xf7, 0x3a, 0x8, 0xb5,\n                                                     0x80, 0x6b, 0xad, 0x5a, 0x1b, 0x45, 0x6d, 0xfb,\n                                                     0x12, 0x56, 0x8d, 0x1f, 0x9e, 0x6, 0xa3, 0x8a,\n                                                     0xa3, 0xda, 0xc1, 0x1b, 0xbf, 0xaa, 0x2f, 0x42,\n                                                     0x9c, 0x1f, 0xe, 0xfb, 0x36, 0x90, 0x76, 0xf8,\n                                                     0x9f, 0x77, 0x1, 0xf7, 0x7c, 0x7b, 0x15, 0xb0,\n                                                     0x6, 0xa1, 0xb7, 0xe2, 0xf7, 0x44, 0xc1, 0xf7,\n                                                     0x2, 0x8, 0xa5, 0xc0, 0x9c, 0xb5, 0xb5, 0x1a,\n                                                     0xa6, 0x82, 0xa8, 0x5d, 0x58, 0x89, 0x50, 0x5a,\n                                                     0x94, 0x1e, 0x8f, 0x75, 0x8e, 0x7a, 0x7c, 0x1a,\n                                                     0x6d, 0x83, 0x74, 0x78, 0x66, 0x1e, 0x3f, 0xfb,\n                                                     0x2c, 0xfb, 0x32, 0xf8, 0x28, 0x51, 0x72, 0x88,\n                                                     0x8c, 0x45, 0x84, 0x19, 0x78, 0x7, 0xb4, 0x86,\n                                                     0xa4, 0x87, 0x99, 0x67, 0x8, 0xe, 0xfb, 0x52,\n                                                     0xfb, 0x5f, 0x76, 0xf7, 0x70, 0xeb, 0xf7, 0xb8,\n                                                     0xe7, 0xf7, 0xb6, 0x77, 0x12, 0xa6, 0xbc, 0x7f,\n                                                     0xc0, 0x74, 0xb2, 0xf7, 0xb3, 0xbc, 0x13, 0xfb,\n                                                     0xf7, 0x2d, 0xf8, 0x2e, 0x15, 0x42, 0x50, 0x56,\n                                                     0x53, 0x31, 0x1a, 0xfb, 0x43, 0xf7, 0x37, 0x69,\n                                                     0xf7, 0x28, 0xa7, 0xc1, 0x89, 0x51, 0x53, 0x64,\n                                                     0x6d, 0x68, 0x97, 0x1e, 0x6a, 0x96, 0x72, 0x90,\n                                                     0x79, 0x89, 0x8, 0x6d, 0x89, 0x7c, 0x7b, 0x6e,\n                                                     0x1a, 0x60, 0xc0, 0x81, 0xa6, 0xf4, 0xc6, 0xdc,\n                                                     0xf7, 0xd, 0xd7, 0x43, 0xb1, 0x3d, 0xfb, 0x3d,\n                                                     0x41, 0xc8, 0xce, 0xe1, 0xe1, 0xd5, 0xb2, 0x9b,\n                                                     0x1e, 0x85, 0x8c, 0xb8, 0x85, 0xbb, 0x1b, 0xc6,\n                                                     0xc1, 0x97, 0xb9, 0xa6, 0x6b, 0x92, 0x72, 0x51,\n                                                     0x39, 0x6c, 0x7c, 0x71, 0x1f, 0x64, 0xa3, 0x7e,\n                                                     0xac, 0xab, 0x1a, 0xb5, 0xa8, 0xb3, 0xaa, 0x98,\n                                                     0x1e, 0xad, 0x85, 0xf7, 0x19, 0xb0, 0xc0, 0x1a,\n                                                     0xa1, 0x7e, 0x9b, 0x6f, 0x5a, 0x45, 0x4f, 0x73,\n                                                     0x6e, 0x1e, 0x13, 0xf5, 0x6e, 0x8d, 0x72, 0x9c,\n                                                     0xa7, 0x1a, 0xac, 0x9e, 0x96, 0x97, 0x90, 0x1e,\n                                                     0x89, 0x9d, 0x5, 0x58, 0x6c, 0x6c, 0x62, 0x64,\n                                                     0xb6, 0x6e, 0xa9, 0x83, 0x1f, 0x13, 0xfb, 0x6f,\n                                                     0x6b, 0x7c, 0x68, 0x68, 0x1a, 0x66, 0x9d, 0x66,\n                                                     0xb4, 0x6b, 0x1e, 0xe, 0x78, 0xb7, 0xf8, 0x4f,\n                                                     0xaa, 0x1, 0xae, 0xea, 0xf7, 0xad, 0xe5, 0x3,\n                                                     0xae, 0xf7, 0x80, 0x15, 0xfb, 0xe, 0xef, 0xfb,\n                                                     0x19, 0xf7, 0x21, 0xf7, 0x23, 0xdd, 0xf7, 0x17,\n                                                     0xf7, 0x2a, 0xf7, 0x24, 0x20, 0xe8, 0xfb, 0x1b,\n                                                     0xfb, 0x1d, 0x34, 0xfb, 0x1b, 0xfb, 0x14, 0x1e,\n                                                     0xea, 0xaa, 0x15, 0xde, 0xa1, 0xf7, 0xa, 0xf0,\n                                                     0xf7, 0xd, 0xb0, 0xfb, 0x34, 0x29, 0x33, 0x68,\n                                                     0x2a, 0x30, 0xfb, 0x2, 0x5e, 0xf7, 0x28, 0xe9,\n                                                     0x1e, 0xe, 0x78, 0xe9, 0xf7, 0xda, 0xe1, 0x1,\n                                                     0x95, 0xf7, 0xdc, 0x15, 0x9c, 0x6, 0xc4, 0xab,\n                                                     0x9c, 0x9b, 0xa7, 0x1b, 0xc4, 0x6, 0x6e, 0xfb,\n                                                     0x6c, 0x8b, 0x6d, 0x7c, 0x73, 0x8, 0x77, 0x6b,\n                                                     0x64, 0x72, 0x63, 0x1a, 0x7d, 0x95, 0x64, 0xb8,\n                                                     0xb2, 0x9a, 0xa7, 0xb4, 0x94, 0x1e, 0x97, 0xc1,\n                                                     0x9d, 0xf7, 0x2, 0x9b, 0xf7, 0x4f, 0x8, 0xf7,\n                                                     0x5, 0x6, 0x7a, 0xfb, 0x35, 0x5, 0x3a, 0x82,\n                                                     0x87, 0xfb, 0x46, 0xf7, 0x9, 0x1b, 0xd3, 0xaf,\n                                                     0xd8, 0xf2, 0x1f, 0x76, 0x6, 0x76, 0x78, 0x4a,\n                                                     0x5c, 0x66, 0x75, 0xbf, 0xb2, 0xb1, 0x8b, 0xdb,\n                                                     0x97, 0xf7, 0x9, 0x1e, 0xf7, 0x1a, 0xe1, 0xfc,\n                                                     0x11, 0x6, 0x33, 0x63, 0xfb, 0x0, 0x58, 0x80,\n                                                     0x1f, 0xe, 0xfb, 0x65, 0x76, 0xf9, 0x36, 0xc2,\n                                                     0x1, 0xc6, 0xe3, 0xf7, 0x91, 0xe5, 0x3, 0xf7,\n                                                     0x27, 0xb3, 0x15, 0xb0, 0x69, 0xab, 0x6f, 0xca,\n                                                     0x8c, 0x8, 0xf7, 0x2b, 0x8d, 0xc7, 0xef, 0xf7,\n                                                     0x4a, 0x1a, 0xf7, 0x4f, 0x45, 0xbc, 0xfb, 0x2d,\n                                                     0xfb, 0x1c, 0x40, 0x26, 0xfb, 0xa, 0x8c, 0x1e,\n                                                     0x8f, 0xfc, 0x3b, 0x5, 0x6d, 0x87, 0x69, 0x84,\n                                                     0x74, 0x1e, 0xe2, 0x6, 0x95, 0xb3, 0x8b, 0xae,\n                                                     0xb3, 0x1a, 0x88, 0xf7, 0x70, 0x15, 0x85, 0xf7,\n                                                     0x7b, 0x5, 0xc2, 0x8a, 0xab, 0xc0, 0xc2, 0x1b,\n                                                     0xf7, 0x18, 0xb7, 0x4f, 0xfb, 0x22, 0xfb, 0x7,\n                                                     0x6d, 0x30, 0xfb, 0xd, 0x64, 0x5d, 0xa2, 0xb9,\n                                                     0x77, 0x1f, 0xe, 0xfb, 0x88, 0xfb, 0x68, 0x76,\n                                                     0xf7, 0x75, 0xf4, 0xf7, 0xbe, 0xf4, 0x3b, 0xdb,\n                                                     0x12, 0xb3, 0xb5, 0xf7, 0xd0, 0xb1, 0x13, 0xdc,\n                                                     0xb3, 0xf7, 0x66, 0x15, 0xfb, 0x15, 0xd4, 0x32,\n                                                     0xf7, 0x1b, 0xf7, 0xa, 0xab, 0x74, 0x62, 0x68,\n                                                     0x78, 0x66, 0x65, 0x8a, 0x1e, 0x7d, 0x7c, 0x90,\n                                                     0x91, 0x7b, 0x1f, 0x91, 0x7b, 0x7a, 0x92, 0x7b,\n                                                     0x1b, 0x72, 0x71, 0x78, 0x68, 0x6c, 0xaa, 0x70,\n                                                     0xbe, 0xd3, 0xe1, 0xd2, 0xf7, 0x5, 0xf1, 0x50,\n                                                     0xb7, 0x34, 0x20, 0x26, 0x88, 0xf7, 0x1f, 0xf1,\n                                                     0xca, 0xdf, 0xdc, 0x8c, 0x1f, 0x9f, 0xa0, 0x84,\n                                                     0x84, 0xa0, 0x1f, 0x13, 0xec, 0x85, 0x9c, 0x9c,\n                                                     0x86, 0x9a, 0x1b, 0xb9, 0xa9, 0x9c, 0xa7, 0xbe,\n                                                     0x52, 0x94, 0x62, 0xfb, 0x38, 0xfb, 0x3, 0xfb,\n                                                     0x14, 0xfb, 0x36, 0x1f, 0xe, 0x3b, 0x76, 0xb7,\n                                                     0xf8, 0x1b, 0xe1, 0x1, 0xa9, 0xf0, 0xf7, 0xc2,\n                                                     0xe9, 0x3, 0xf8, 0xe0, 0xf8, 0x32, 0x15, 0xe1,\n                                                     0xfb, 0x97, 0x7, 0xfb, 0x14, 0xfb, 0x3f, 0x42,\n                                                     0xfb, 0x31, 0xfb, 0x17, 0xd9, 0xfb, 0x34, 0xf7,\n                                                     0x43, 0xf7, 0x4e, 0xc5, 0xf7, 0xc, 0xec, 0xee,\n                                                     0x46, 0xd1, 0x34, 0xba, 0x1f, 0x8d, 0x7, 0x56,\n                                                     0x16, 0xe0, 0x40, 0xa9, 0x48, 0xfb, 0x0, 0x1a,\n                                                     0x3e, 0x60, 0x4b, 0x3b, 0x2b, 0x38, 0xf7, 0xd,\n                                                     0xf7, 0xa, 0xf1, 0xe7, 0xbd, 0xea, 0x1e, 0xe,\n                                                     0xfb, 0x88, 0x78, 0xe8, 0xf7, 0xe1, 0xe8, 0x1,\n                                                     0xf7, 0x4a, 0xd5, 0x3, 0xa7, 0xf7, 0xc1, 0x15,\n                                                     0xaf, 0x98, 0xb0, 0xd1, 0xad, 0x1b, 0xe6, 0x6,\n                                                     0x85, 0x56, 0x7c, 0xfb, 0x11, 0x28, 0x1a, 0x23,\n                                                     0xb5, 0x5e, 0xc6, 0xe8, 0x9d, 0xf7, 0x7, 0xcd,\n                                                     0x87, 0x1e, 0x79, 0x6, 0x84, 0x62, 0x7d, 0x5b,\n                                                     0x5d, 0x8c, 0x58, 0x8c, 0x81, 0xca, 0x8f, 0xbd,\n                                                     0x9b, 0xf7, 0x70, 0x18, 0xf7, 0x2e, 0x8a, 0x5,\n                                                     0xe8, 0xfb, 0x7f, 0x7, 0x66, 0x60, 0x7b, 0x6f,\n                                                     0x72, 0x1f, 0x6b, 0x67, 0x7c, 0x62, 0x76, 0x3d,\n                                                     0x8, 0xe, 0x20, 0x79, 0xbb, 0xf8, 0x71, 0x77,\n                                                     0x1, 0xf7, 0x21, 0xe1, 0xf7, 0x79, 0xda, 0x3,\n                                                     0x92, 0xf7, 0xee, 0x15, 0xa1, 0x6, 0x97, 0xac,\n                                                     0x9e, 0xbd, 0xaf, 0x8c, 0x8, 0x98, 0x96, 0x7b,\n                                                     0x7f, 0x8d, 0x1f, 0x92, 0x66, 0x97, 0xfb, 0x2,\n                                                     0x40, 0x1a, 0x26, 0xc7, 0x2a, 0xf7, 0xc, 0xf7,\n                                                     0x21, 0xd4, 0xf7, 0x9, 0xf7, 0x26, 0xf7, 0x3,\n                                                     0x65, 0xe2, 0xfb, 0x2c, 0xcb, 0x1e, 0x85, 0x7a,\n                                                     0x5, 0x9d, 0x89, 0xee, 0x4f, 0xfb, 0x47, 0x1a,\n                                                     0x28, 0x73, 0xfb, 0xc, 0x2f, 0x4b, 0x5a, 0xcb,\n                                                     0xd9, 0xc7, 0x82, 0xf7, 0x14, 0x81, 0xd3, 0x1e,\n                                                     0xbc, 0x84, 0x6e, 0xa5, 0x65, 0x1b, 0x38, 0x69,\n                                                     0x2f, 0x46, 0x81, 0x1f, 0xe, 0xfb, 0x36, 0xfb,\n                                                     0x5f, 0x76, 0xfa, 0x13, 0x77, 0x1, 0xa6, 0xe6,\n                                                     0xf7, 0x8, 0xbb, 0x5e, 0xb8, 0xf7, 0xc, 0xe3,\n                                                     0x3, 0xf7, 0x85, 0x7e, 0x15, 0x8d, 0xfb, 0x5b,\n                                                     0xb2, 0x7f, 0x5, 0xf7, 0x67, 0x7, 0xb5, 0xf7,\n                                                     0x3a, 0xaa, 0xf7, 0x7c, 0xf7, 0x46, 0xfb, 0x2a,\n                                                     0xd3, 0x51, 0x1f, 0xf7, 0x2e, 0x7, 0x5a, 0x9c,\n                                                     0x8d, 0xfb, 0x3f, 0x5, 0x68, 0xfb, 0x41, 0x63,\n                                                     0xfb, 0x70, 0xfb, 0x52, 0xf7, 0x24, 0x4c, 0xd1,\n                                                     0x1f, 0xb4, 0xb0, 0x15, 0xf8, 0x4c, 0x7, 0x9b,\n                                                     0xf3, 0x55, 0xfb, 0x3c, 0xfb, 0x48, 0x28, 0x67,\n                                                     0x76, 0x89, 0x1f, 0x61, 0x16, 0x72, 0x2a, 0xb8,\n                                                     0xf7, 0x40, 0xf7, 0x3e, 0xe9, 0xc0, 0xa2, 0x1f,\n                                                     0xe, 0xfb, 0x7b, 0xe3, 0xf8, 0xca, 0xd7, 0x1,\n                                                     0x98, 0xfb, 0x7b, 0x15, 0xf1, 0x6, 0xf7, 0x2e,\n                                                     0xf7, 0xae, 0x5, 0x8d, 0x6, 0x3a, 0x9a, 0xa1,\n                                                     0xfb, 0x5d, 0xe9, 0x1b, 0xe7, 0xa5, 0xf7, 0x1f,\n                                                     0xbf, 0x8d, 0x1f, 0x78, 0x6, 0x6f, 0x8a, 0x6c,\n                                                     0x40, 0x4e, 0x1b, 0x3c, 0x71, 0xf7, 0x5c, 0xb5,\n                                                     0x82, 0x1f, 0xf7, 0x76, 0xf8, 0x24, 0x5, 0x25,\n                                                     0x6, 0xfb, 0x2f, 0xfb, 0xa1, 0x5, 0xf7, 0x20,\n                                                     0x73, 0x79, 0xf7, 0x15, 0x25, 0x1b, 0x34, 0x7b,\n                                                     0xfb, 0x1f, 0x5a, 0x85, 0x1f, 0x9d, 0x6, 0xa8,\n                                                     0x90, 0xa3, 0xde, 0xbe, 0x1b, 0xdb, 0xa8, 0xfb,\n                                                     0x43, 0x46, 0x9e, 0x1f, 0xe, 0x8e, 0xfb, 0x63,\n                                                     0x76, 0xf9, 0x6c, 0x77, 0x1, 0xf7, 0xd9, 0xca,\n                                                     0x3, 0xf7, 0xd9, 0x70, 0x15, 0xfb, 0x5d, 0xca,\n                                                     0xf7, 0x5d, 0x7, 0xc0, 0x96, 0xcd, 0xa3, 0xba,\n                                                     0xca, 0xaa, 0xb5, 0xa3, 0xbe, 0x97, 0xf7, 0x81,\n                                                     0x8e, 0xc2, 0xaa, 0x8f, 0xb9, 0x95, 0x8, 0x9d,\n                                                     0x7, 0x97, 0x75, 0x69, 0x8b, 0x7f, 0x1b, 0xfb,\n                                                     0x17, 0x8b, 0xfb, 0x8b, 0xfb, 0x11, 0x7d, 0x1f,\n                                                     0x83, 0x3f, 0x57, 0x6d, 0x63, 0x81, 0x8, 0xf8,\n                                                     0x6f, 0x4c, 0xfc, 0x6f, 0x7, 0x63, 0x95, 0x57,\n                                                     0xa9, 0x83, 0xd7, 0x8, 0xf7, 0x11, 0x7e, 0x95,\n                                                     0xf7, 0x8b, 0xfb, 0x22, 0x1b, 0x7f, 0x69, 0x8b,\n                                                     0x7f, 0x75, 0x1f, 0x79, 0x7, 0xb9, 0x81, 0xaa,\n                                                     0x87, 0x8e, 0x54, 0x97, 0xfb, 0x81, 0xa3, 0x58,\n                                                     0xaa, 0x61, 0xba, 0x4c, 0xcd, 0x73, 0xc0, 0x80,\n                                                     0x8, 0xe, 0x8e, 0x7a, 0xb9, 0xf8, 0x6b, 0x77,\n                                                     0x1, 0xb5, 0xf2, 0xf7, 0x39, 0xf5, 0xf7, 0x38,\n                                                     0xf3, 0x3, 0xf7, 0xff, 0xd3, 0x15, 0x5c, 0xa9,\n                                                     0xc3, 0x61, 0xc5, 0x1b, 0xf7, 0x5, 0xcb, 0xf7,\n                                                     0x9, 0xf6, 0xf7, 0x2a, 0x36, 0xf7, 0x23, 0xfb,\n                                                     0x3e, 0x1f, 0x7a, 0x7, 0xf7, 0x7, 0x74, 0xaf,\n                                                     0xfb, 0x8, 0x26, 0x1a, 0x46, 0x83, 0xfb, 0x25,\n                                                     0x39, 0x41, 0x6b, 0xe2, 0xa4, 0x8e, 0x1e, 0x97,\n                                                     0x98, 0x9c, 0xd4, 0xce, 0x1a, 0xc9, 0x7f, 0xc4,\n                                                     0x62, 0x62, 0x7f, 0x52, 0x4d, 0x48, 0x9c, 0x42,\n                                                     0x97, 0x7e, 0x1e, 0x73, 0x8d, 0x6e, 0x33, 0x41,\n                                                     0x1b, 0x3d, 0x7c, 0xf7, 0x18, 0xd0, 0xf3, 0xab,\n                                                     0xf7, 0x11, 0xf7, 0xc, 0xa3, 0x1f, 0x9c, 0x7,\n                                                     0xfb, 0x3a, 0x32, 0xfb, 0x15, 0xfb, 0x26, 0xfb,\n                                                     0x2, 0xc6, 0xfb, 0x18, 0xf7, 0x10, 0xc3, 0xc0,\n                                                     0xb7, 0xb8, 0xa8, 0x1f, 0xe, 0x57, 0x79, 0xa7,\n                                                     0xf8, 0x15, 0xd1, 0xf7, 0x43, 0xb4, 0x12, 0xf7,\n                                                     0x1d, 0xdd, 0x48, 0xe5, 0x92, 0xad, 0xf7, 0x50,\n                                                     0xd9, 0x13, 0xee, 0x9d, 0xf7, 0xd6, 0x15, 0x90,\n                                                     0x89, 0x90, 0x8a, 0x90, 0x89, 0x8, 0xb1, 0xa1,\n                                                     0xa4, 0xb3, 0xaf, 0x1b, 0xa4, 0x94, 0x78, 0x77,\n                                                     0x8d, 0x1f, 0x13, 0xf6, 0x8f, 0x4f, 0x78, 0x42,\n                                                     0x4e, 0x1a, 0xfb, 0x6, 0xc4, 0x49, 0xf2, 0xf7,\n                                                     0x37, 0xe4, 0xf7, 0x28, 0xf7, 0x51, 0x1e, 0xd5,\n                                                     0x5d, 0x5, 0xc0, 0x7, 0x41, 0xb0, 0x5, 0xf2,\n                                                     0x66, 0xf7, 0x6b, 0xfb, 0x3a, 0x48, 0x6d, 0x60,\n                                                     0x55, 0xfb, 0xa, 0xf0, 0x56, 0xf7, 0xd, 0x49,\n                                                     0x1e, 0x37, 0x8c, 0x7e, 0xfb, 0x91, 0xfb, 0x26,\n                                                     0x1b, 0x47, 0x71, 0xc4, 0xcc, 0x1f, 0x13, 0xee,\n                                                     0xdb, 0xa2, 0xda, 0xdb, 0x1a, 0xbf, 0x62, 0xb5,\n                                                     0x5c, 0x53, 0x4c, 0x42, 0x45, 0x7a, 0x1e, 0xf8,\n                                                     0x58, 0xcf, 0x15, 0x63, 0x9f, 0xfb, 0x27, 0xcd,\n                                                     0xf0, 0x1a, 0xad, 0x9f, 0xa8, 0xb3, 0xf7, 0xa,\n                                                     0x94, 0xfb, 0x73, 0x70, 0x1e, 0xe, 0x4c, 0xa0,\n                                                     0x76, 0xf8, 0x8b, 0xf7, 0x4a, 0x66, 0xb0, 0x12,\n                                                     0xf7, 0x84, 0xf3, 0x13, 0xb0, 0xf7, 0x2b, 0x24,\n                                                     0xa, 0x8a, 0xf7, 0x6a, 0x5, 0xda, 0x91, 0xb1,\n                                                     0xf7, 0x9b, 0xf7, 0x4, 0x1b, 0x9d, 0x9a, 0x81,\n                                                     0x7d, 0x1f, 0x75, 0x65, 0x72, 0x6d, 0x1a, 0x13,\n                                                     0xd0, 0x6b, 0xa5, 0x7f, 0xa6, 0xad, 0xa7, 0xb4,\n                                                     0xb4, 0xcc, 0x6d, 0xae, 0x56, 0xfb, 0x1d, 0x58,\n                                                     0xfb, 0x2a, 0x2a, 0x76, 0x1e, 0xf7, 0x31, 0x7d,\n                                                     0xfb, 0x1d, 0xe1, 0xfb, 0x27, 0x1b, 0x7e, 0x82,\n                                                     0x83, 0x84, 0x87, 0x8f, 0x87, 0x92, 0x89, 0x1f,\n                                                     0xf7, 0x59, 0x5e, 0xac, 0x2e, 0x8c, 0xfb, 0x6b,\n                                                     0x8c, 0xfb, 0x67, 0x18, 0x28, 0xa, 0xe, 0x3b,\n                                                     0xfb, 0x5f, 0x76, 0xf7, 0x68, 0xb1, 0xf8, 0x21,\n                                                     0xd7, 0x1, 0xaf, 0xf4, 0xf7, 0x1a, 0xcc, 0xf7,\n                                                     0x27, 0xef, 0x3, 0xf7, 0xa9, 0x7f, 0x15, 0xfb,\n                                                     0x68, 0xca, 0xf7, 0x68, 0x7, 0xf7, 0x1b, 0x8a,\n                                                     0xf7, 0x4, 0xee, 0xf7, 0x27, 0x1a, 0xf7, 0x27,\n                                                     0x49, 0xf7, 0xb, 0xfb, 0x10, 0x26, 0x73, 0x48,\n                                                     0x3e, 0x8d, 0x1e, 0x8e, 0xfb, 0xdd, 0x5, 0x28,\n                                                     0x66, 0xf7, 0x7, 0xf0, 0xd7, 0x9b, 0xf7, 0x15,\n                                                     0xe6, 0xad, 0x1f, 0x9d, 0x7, 0xfb, 0x10, 0x33,\n                                                     0xfb, 0x1d, 0xfb, 0x10, 0xfb, 0x36, 0xf7, 0x4,\n                                                     0x32, 0xf7, 0x15, 0x8c, 0x1f, 0xca, 0xb1, 0x15,\n                                                     0xf7, 0xde, 0x7, 0xa5, 0x8c, 0x8a, 0xb4, 0xb7,\n                                                     0x1b, 0xd8, 0xa5, 0x28, 0x32, 0xfb, 0x8, 0x53,\n                                                     0x2e, 0x30, 0x1f, 0xe, 0xa9, 0x79, 0xb4, 0xf8,\n                                                     0x6f, 0xe0, 0x1, 0xae, 0xf5, 0xf7, 0x37, 0xec,\n                                                     0xf7, 0x40, 0xed, 0x3, 0xf7, 0xf8, 0xd0, 0x15,\n                                                     0x61, 0x9b, 0xbc, 0x5e, 0xd6, 0x1b, 0xf7, 0xc,\n                                                     0xc2, 0xf7, 0x1d, 0xf7, 0x11, 0xec, 0x3e, 0xf7,\n                                                     0x17, 0x24, 0xa5, 0x1f, 0xf7, 0x48, 0x8c, 0x5,\n                                                     0xdf, 0xfc, 0x9d, 0x7, 0x6b, 0x47, 0x66, 0x25,\n                                                     0x65, 0x1f, 0x9d, 0x87, 0xc6, 0xb7, 0xab, 0x94,\n                                                     0xe4, 0x92, 0x19, 0x26, 0x4e, 0x41, 0x36, 0xfb,\n                                                     0x6, 0x1a, 0xfb, 0x14, 0xb7, 0xfb, 0x16, 0xf7,\n                                                     0x1b, 0xc5, 0xca, 0xbb, 0xb2, 0xa0, 0x1e, 0x72,\n                                                     0xd4, 0x15, 0x62, 0x8d, 0x5e, 0x3d, 0x52, 0x1b,\n                                                     0x36, 0x86, 0xf7, 0x2c, 0xd1, 0xf7, 0xa, 0xc2,\n                                                     0xf0, 0xed, 0xad, 0x1f, 0xf7, 0x10, 0x6, 0xf0,\n                                                     0x6d, 0xc1, 0xfb, 0x9, 0x23, 0x1a, 0x3d, 0x8b,\n                                                     0xfb, 0x22, 0x30, 0x4e, 0x5e, 0xcf, 0xba, 0x8d,\n                                                     0x1e, 0x98, 0xc5, 0x95, 0xd1, 0xad, 0x1a, 0xab,\n                                                     0x8d, 0xdc, 0x5a, 0x57, 0x8e, 0x3f, 0x67, 0x8a,\n                                                     0x1e, 0x8a, 0x60, 0x95, 0x41, 0x9d, 0x5d, 0x8,\n                                                     0xe, 0xfb, 0x73, 0xf7, 0x1a, 0x76, 0xf7, 0xfc,\n                                                     0x77, 0x1, 0xbd, 0xf7, 0xfc, 0x3, 0xf7, 0x7a,\n                                                     0xf7, 0x5, 0x15, 0xee, 0xdc, 0xdb, 0xef, 0xee,\n                                                     0x3a, 0xdc, 0x28, 0x27, 0x3b, 0x3a, 0x28, 0x27,\n                                                     0xdb, 0x3b, 0xef, 0x1f, 0xe, 0xf7, 0xd1, 0x7a,\n                                                     0xf7, 0x4, 0x1, 0xf7, 0x3, 0xf7, 0x4, 0xf7,\n                                                     0x71, 0xf7, 0x4, 0xf7, 0x71, 0xf7, 0x4, 0x14,\n                                                     0x70, 0xf7, 0x3, 0xb1, 0x15, 0x29, 0xa, 0xf7,\n                                                     0xe1, 0x16, 0x29, 0xa, 0xf7, 0xe1, 0x16, 0x29,\n                                                     0xa, 0xe, 0xfc, 0x48, 0xf8, 0x74, 0x76, 0xf7,\n                                                     0xa8, 0x77, 0x1, 0xa9, 0xf8, 0x7d, 0x15, 0x38,\n                                                     0xa, 0x59, 0xa, 0x1e, 0xf7, 0x31, 0xf7, 0x5a,\n                                                     0x40, 0xa, 0x6d, 0xa1, 0x6c, 0x7b, 0x7d, 0x85,\n                                                     0x81, 0x87, 0x1e, 0xe, 0xfb, 0xa4, 0xf8, 0x74,\n                                                     0x76, 0xf7, 0xaa, 0x77, 0x1, 0xb9, 0xf8, 0x5f,\n                                                     0x15, 0x59, 0xa, 0x1f, 0xf7, 0x32, 0x36, 0xa,\n                                                     0x23, 0xfb, 0x7c, 0x5, 0x38, 0xa, 0x1e, 0xf7,\n                                                     0x54, 0x16, 0x59, 0xa, 0x1f, 0xf7, 0x31, 0x36,\n                                                     0xa, 0x24, 0xfb, 0x7c, 0x5, 0x38, 0xa, 0x1e,\n                                                     0xe, 0xfc, 0x98, 0x94, 0x76, 0xf9, 0x45, 0x77,\n                                                     0x1, 0xfb, 0x10, 0x7f, 0x15, 0xf8, 0x64, 0xf9,\n                                                     0x45, 0x5, 0x53, 0x6, 0xfc, 0x64, 0xfd, 0x45,\n                                                     0x5, 0xe, 0xce, 0x7f, 0xca, 0xf7, 0x54, 0xca,\n                                                     0xca, 0xca, 0xf7, 0x52, 0xca, 0x1, 0xf7, 0x7,\n                                                     0xce, 0x3, 0x9f, 0xf7, 0x87, 0x15, 0xf7, 0x0,\n                                                     0x6, 0xfb, 0x26, 0xb0, 0xf7, 0x1b, 0xfb, 0x1,\n                                                     0xf7, 0x39, 0x1b, 0xea, 0xd6, 0xb0, 0xb3, 0xbd,\n                                                     0x1f, 0xe5, 0x7, 0x4b, 0x57, 0x39, 0x63, 0x35,\n                                                     0x1b, 0xfb, 0x11, 0x25, 0xdb, 0xf7, 0x4, 0x64,\n                                                     0x1f, 0xf7, 0xf8, 0x6, 0xa9, 0xca, 0x5, 0xfc,\n                                                     0x25, 0x6, 0x8a, 0x96, 0x8a, 0x94, 0x95, 0x1a,\n                                                     0x95, 0x8c, 0x95, 0x8c, 0x98, 0x1e, 0xf8, 0x42,\n                                                     0x6, 0xa9, 0xca, 0x5, 0xfc, 0x51, 0x6, 0xf7,\n                                                     0x0, 0xad, 0xf6, 0xdd, 0xf7, 0x11, 0x1b, 0xe5,\n                                                     0xdc, 0x61, 0x4f, 0xbc, 0x1f, 0xa8, 0xc8, 0x5,\n                                                     0xcb, 0x4b, 0x31, 0xb3, 0x2c, 0x1b, 0xfb, 0x35,\n                                                     0xfb, 0x1f, 0x22, 0xfb, 0x28, 0x66, 0x1f, 0x3d,\n                                                     0x6, 0x6d, 0x4c, 0x5, 0xeb, 0x6, 0x8a, 0x7e,\n                                                     0x8b, 0x82, 0x81, 0x1a, 0x82, 0x8b, 0x82, 0x8c,\n                                                     0x7e, 0x1e, 0x49, 0x6, 0xe, 0x8e, 0x56, 0xde,\n                                                     0xad, 0xcf, 0xf7, 0x70, 0xa2, 0xf7, 0xa9, 0xe3,\n                                                     0x1, 0xc4, 0xb2, 0xf7, 0xac, 0xd1, 0xc3, 0xd7,\n                                                     0x3, 0xa5, 0xb7, 0x15, 0x98, 0xa6, 0x9b, 0x92,\n                                                     0x9b, 0x1b, 0x99, 0xc2, 0x6f, 0x6e, 0xc3, 0x1f,\n                                                     0x6d, 0xc5, 0xc6, 0x6d, 0x99, 0x1b, 0xac, 0xf7,\n                                                     0x60, 0xf7, 0x3e, 0xcd, 0xb0, 0x5d, 0xd0, 0x65,\n                                                     0xcf, 0x1f, 0x71, 0xba, 0x75, 0xb9, 0xaf, 0x1a,\n                                                     0x9f, 0xda, 0xe7, 0xb3, 0xc3, 0x1e, 0xb1, 0x42,\n                                                     0x25, 0xbb, 0x32, 0x1b, 0xfb, 0x5, 0xfb, 0x17,\n                                                     0x44, 0xfb, 0x14, 0xfb, 0x6, 0xef, 0x3f, 0xf7,\n                                                     0x0, 0x8c, 0x1f, 0x8d, 0xa2, 0x5, 0x41, 0x8a,\n                                                     0x2a, 0xcd, 0xdc, 0x1a, 0xdf, 0xd0, 0xb8, 0xdd,\n                                                     0x8d, 0x1e, 0xcd, 0x8d, 0xf1, 0x64, 0xbe, 0x71,\n                                                     0x8, 0x39, 0x23, 0x83, 0x75, 0x74, 0x1a, 0x63,\n                                                     0xa2, 0x5c, 0xa5, 0x5d, 0x1e, 0xae, 0x4d, 0xb5,\n                                                     0x4d, 0x5c, 0x1a, 0x5f, 0x4b, 0x4d, 0x5b, 0x77,\n                                                     0x57, 0xa7, 0xa6, 0x57, 0x1e, 0xa5, 0x59, 0x5c,\n                                                     0xa0, 0x77, 0x1b, 0x72, 0x2d, 0x50, 0x7f, 0x77,\n                                                     0x1f, 0xe, 0xf7, 0xc4, 0xfb, 0x67, 0xac, 0xf7,\n                                                     0x39, 0xaf, 0xf8, 0x4b, 0xb5, 0xd0, 0x77, 0x1,\n                                                     0xf7, 0x33, 0xab, 0x9e, 0xdb, 0xb8, 0xd3, 0xac,\n                                                     0xb9, 0xf7, 0xb2, 0xed, 0x3, 0xf7, 0x8c, 0xf7,\n                                                     0x10, 0x15, 0x67, 0x4b, 0x56, 0x50, 0x40, 0x1a,\n                                                     0x45, 0xa8, 0x48, 0xe5, 0xee, 0xa9, 0xdb, 0xd8,\n                                                     0xee, 0x64, 0xbf, 0x6a, 0xde, 0x1e, 0xef, 0xd6,\n                                                     0xf7, 0x5c, 0xf7, 0x4a, 0xf0, 0x1b, 0xb0, 0xa3,\n                                                     0x6b, 0x46, 0xfb, 0x26, 0x26, 0xfb, 0x54, 0x2f,\n                                                     0x48, 0x71, 0xac, 0xae, 0xa2, 0x9e, 0x91, 0x97,\n                                                     0x1f, 0xa7, 0x8c, 0xa0, 0xa7, 0xa3, 0x1a, 0xa3,\n                                                     0x76, 0x9e, 0x73, 0x8a, 0x1e, 0x5b, 0x8a, 0x6a,\n                                                     0x5e, 0x58, 0x1a, 0x43, 0xbe, 0x50, 0xe4, 0xf7,\n                                                     0x41, 0xf7, 0x9, 0xf7, 0x87, 0xf7, 0x6, 0xd9,\n                                                     0x5a, 0xdd, 0x33, 0xfb, 0x3e, 0xfb, 0x1f, 0xfb,\n                                                     0x50, 0x21, 0x25, 0x1e, 0x75, 0xb5, 0x81, 0xa6,\n                                                     0xa5, 0x1a, 0xda, 0xf7, 0x16, 0xf7, 0x1, 0xc9,\n                                                     0xcb, 0x1e, 0x82, 0x9b, 0x5, 0x27, 0x48, 0xfb,\n                                                     0x37, 0xfb, 0x8, 0xfb, 0x11, 0x1a, 0x8a, 0x56,\n                                                     0xa4, 0x58, 0x99, 0x66, 0x8, 0x9a, 0x6d, 0x15,\n                                                     0xc1, 0xfb, 0x0, 0x9d, 0x5d, 0x65, 0x1a, 0x63,\n                                                     0x7f, 0x63, 0x5c, 0x5c, 0x65, 0xb7, 0xcb, 0xbc,\n                                                     0xaf, 0xc5, 0xaf, 0xc4, 0x1e, 0xe, 0xf7, 0x4,\n                                                     0x91, 0x76, 0xc2, 0xdf, 0xf8, 0xa4, 0xdd, 0x52,\n                                                     0xc4, 0x12, 0xa5, 0xac, 0xf7, 0x24, 0xc0, 0xe5,\n                                                     0xe3, 0x13, 0xee, 0xd1, 0xac, 0x15, 0x92, 0x86,\n                                                     0x90, 0x86, 0x92, 0x86, 0x8, 0x9a, 0x9e, 0x9b,\n                                                     0x92, 0x97, 0x1b, 0xaa, 0xa7, 0x64, 0x7b, 0xa4,\n                                                     0x1f, 0xf7, 0x2c, 0xc3, 0xc8, 0xf7, 0x42, 0xf7,\n                                                     0x19, 0x1a, 0x13, 0xae, 0xd0, 0x8b, 0xe5, 0x7c,\n                                                     0xe3, 0x1e, 0xb6, 0xce, 0x98, 0x99, 0xa0, 0x1b,\n                                                     0xa2, 0xf3, 0x2a, 0x84, 0x92, 0x1f, 0xfb, 0x55,\n                                                     0xfb, 0x24, 0x96, 0x77, 0x5, 0xd3, 0x9e, 0x39,\n                                                     0x21, 0xfb, 0xd, 0x9a, 0x4c, 0xd3, 0x70, 0x1f,\n                                                     0xf7, 0x2, 0xe3, 0x7c, 0xa2, 0x5, 0x86, 0x7f,\n                                                     0x6f, 0x79, 0x7c, 0x1b, 0x69, 0x86, 0xb4, 0xed,\n                                                     0xef, 0x82, 0xf7, 0x1, 0x46, 0xa3, 0x1f, 0xf7,\n                                                     0x4a, 0xf7, 0x1f, 0x5, 0x13, 0x1e, 0xf7, 0x26,\n                                                     0xfb, 0x38, 0x8a, 0x8f, 0x7b, 0x1b, 0x79, 0xfb,\n                                                     0xe, 0x2f, 0x78, 0x71, 0x1f, 0xce, 0x76, 0x41,\n                                                     0xb7, 0x44, 0x1b, 0xfb, 0x1d, 0x3d, 0x47, 0xfb,\n                                                     0x11, 0x2e, 0xdd, 0x5b, 0xd3, 0x63, 0x1f, 0x9a,\n                                                     0x82, 0x93, 0x81, 0x81, 0x1a, 0x78, 0x77, 0x7f,\n                                                     0x85, 0x82, 0x1e, 0xa2, 0x7b, 0x5, 0xb6, 0xb8,\n                                                     0x98, 0xa0, 0x9e, 0x1a, 0xa9, 0x60, 0xa9, 0x5e,\n                                                     0xa6, 0x1e, 0x57, 0xa8, 0x52, 0xa9, 0xcc, 0x1a,\n                                                     0x13, 0xde, 0xc8, 0xd5, 0xb8, 0xc4, 0xf7, 0x1c,\n                                                     0x9e, 0xfb, 0x29, 0xfb, 0x1f, 0xfb, 0x15, 0x64,\n                                                     0xfb, 0x25, 0x60, 0x50, 0x1e, 0xc6, 0x35, 0x9d,\n                                                     0x94, 0x7a, 0x1b, 0x75, 0x88, 0x40, 0x36, 0x80,\n                                                     0x88, 0x8, 0xe, 0xe0, 0x8b, 0xf0, 0xf8, 0xbf,\n                                                     0xab, 0x12, 0xad, 0x9a, 0x91, 0xf7, 0x8, 0xf8,\n                                                     0x40, 0xf7, 0x9, 0x90, 0x9a, 0x17, 0xad, 0x16,\n                                                     0x13, 0xdc, 0xf7, 0xb8, 0x6, 0x7b, 0xf7, 0x2c,\n                                                     0x5, 0xfb, 0x1, 0xa9, 0x6d, 0xf7, 0xf, 0xf4,\n                                                     0x1a, 0xf7, 0x16, 0xdb, 0xf7, 0x8, 0xf7, 0x1a,\n                                                     0xf7, 0x20, 0xd5, 0xfb, 0x8, 0xfb, 0x1a, 0x27,\n                                                     0x65, 0xfb, 0x14, 0x26, 0x71, 0x1e, 0x7b, 0xfb,\n                                                     0x2c, 0x5, 0x13, 0xfc, 0xf7, 0xb8, 0xf7, 0x36,\n                                                     0x6, 0x13, 0xdc, 0x7c, 0x6, 0x5a, 0x7f, 0x75,\n                                                     0x7f, 0x61, 0x1b, 0xfb, 0x28, 0x6, 0x8d, 0xa7,\n                                                     0x5, 0xf7, 0x1e, 0xa1, 0xda, 0xf7, 0x18, 0xf7,\n                                                     0x10, 0x1a, 0xf7, 0x52, 0xfb, 0x3f, 0xe6, 0xfb,\n                                                     0x34, 0xfb, 0x33, 0xfb, 0x3e, 0x2f, 0xfb, 0x4d,\n                                                     0x8a, 0x1e, 0x8a, 0xfb, 0x12, 0xd6, 0xfb, 0x1b,\n                                                     0xf7, 0x22, 0x76, 0x8d, 0x6f, 0x18, 0x13, 0xa0,\n                                                     0xfb, 0x28, 0x6, 0x61, 0x75, 0x97, 0xbc, 0x7f,\n                                                     0x1f, 0x7c, 0x6, 0xe, 0xf7, 0x20, 0x8e, 0x76,\n                                                     0xb2, 0x76, 0xf8, 0x69, 0xf7, 0x18, 0xc4, 0x77,\n                                                     0x12, 0xf7, 0x43, 0xe6, 0x13, 0x78, 0xf7, 0x43,\n                                                     0x16, 0xf7, 0x47, 0x6, 0x9b, 0xb6, 0x86, 0x9e,\n                                                     0x99, 0x1a, 0xac, 0x6e, 0xb0, 0x70, 0xb1, 0x1e,\n                                                     0x75, 0xab, 0x76, 0xac, 0xac, 0x1a, 0xaa, 0xa6,\n                                                     0xa1, 0xa0, 0xa1, 0x1e, 0x13, 0xb8, 0xf7, 0x7c,\n                                                     0xfb, 0xa1, 0xbb, 0x4f, 0x97, 0x5d, 0x8, 0x9e,\n                                                     0x93, 0xaf, 0xab, 0xcd, 0x1a, 0xc3, 0x6a, 0xb1,\n                                                     0x6b, 0xac, 0x1e, 0x6b, 0xab, 0x6c, 0xa6, 0xac,\n                                                     0x1a, 0xd9, 0xd0, 0xe0, 0xc1, 0x7e, 0x1e, 0x90,\n                                                     0xe0, 0x5, 0xad, 0x86, 0x74, 0xa4, 0x6a, 0x1b,\n                                                     0x7a, 0x7d, 0x8b, 0x8c, 0x7f, 0x1f, 0x55, 0x8e,\n                                                     0x87, 0x96, 0x90, 0xb5, 0x8, 0x5c, 0x84, 0x76,\n                                                     0x54, 0x5b, 0x1a, 0x47, 0xcb, 0x7d, 0xc2, 0x8e,\n                                                     0x1e, 0x62, 0x5d, 0x7f, 0x61, 0x77, 0x5d, 0xfb,\n                                                     0x6c, 0xf7, 0x92, 0x79, 0x99, 0x83, 0xbb, 0x8,\n                                                     0x70, 0x82, 0x65, 0x5a, 0x60, 0x1a, 0x64, 0xd0,\n                                                     0x40, 0xb4, 0x5d, 0x1e, 0x4b, 0x4a, 0x5d, 0x6f,\n                                                     0x3e, 0x1a, 0x74, 0xa0, 0x71, 0x9b, 0x6a, 0x1e,\n                                                     0x95, 0x76, 0x94, 0x73, 0x6f, 0x1a, 0x6e, 0x67,\n                                                     0x8c, 0x77, 0x1e, 0xe, 0x46, 0xa, 0xab, 0xfa,\n                                                     0x22, 0x3, 0xab, 0xf7, 0x8c, 0x15, 0xe9, 0x31,\n                                                     0xd1, 0x45, 0xe2, 0x24, 0xae, 0xae, 0x18, 0x5b,\n                                                     0xc7, 0x2d, 0xf1, 0x64, 0xb1, 0x8, 0xf9, 0xb9,\n                                                     0xc3, 0xfd, 0xb9, 0x6, 0xb2, 0xb1, 0xe9, 0xf1,\n                                                     0xbb, 0xc7, 0x68, 0xae, 0x18, 0x34, 0x24, 0x45,\n                                                     0x45, 0x2d, 0x31, 0x8, 0xe, 0x3b, 0xa0, 0x76,\n                                                     0xfa, 0x22, 0x49, 0xa, 0xf7, 0xac, 0x16, 0xc3,\n                                                     0xf9, 0xb9, 0x6, 0xb1, 0x64, 0xf1, 0x2d, 0xc7,\n                                                     0x5b, 0xae, 0xae, 0x18, 0x24, 0xe2, 0x45, 0xd1,\n                                                     0x31, 0xe9, 0x31, 0x2d, 0x45, 0x45, 0x24, 0x34,\n                                                     0xae, 0x68, 0x18, 0xc7, 0xbb, 0xf1, 0xe9, 0xb1,\n                                                     0xb2, 0x8, 0xe, 0x46, 0xa, 0xbc, 0xf7, 0x70,\n                                                     0x15, 0xf9, 0xb9, 0x6, 0x64, 0x65, 0x2d, 0x25,\n                                                     0x5b, 0x4f, 0xae, 0x68, 0x18, 0xe2, 0xf2, 0xd1,\n                                                     0xd1, 0xe9, 0xe5, 0x2d, 0xe5, 0x45, 0xd1, 0x34,\n                                                     0xf2, 0x68, 0x68, 0x18, 0xbb, 0x4f, 0xe9, 0x25,\n                                                     0xb2, 0x65, 0x8, 0xfd, 0xb9, 0x6, 0xe, 0x3b,\n                                                     0x8a, 0x76, 0xfa, 0x22, 0x49, 0xa, 0xb8, 0xf7,\n                                                     0x79, 0x15, 0xf2, 0x34, 0xd1, 0x45, 0xe5, 0x2d,\n                                                     0xe5, 0xe9, 0xd1, 0xd1, 0xf2, 0xe2, 0x68, 0xae,\n                                                     0x18, 0x4f, 0x5b, 0x25, 0x2d, 0x65, 0x64, 0x8,\n                                                     0xf9, 0xb9, 0x53, 0xfd, 0xb9, 0x7, 0x65, 0xb2,\n                                                     0x25, 0xe9, 0x4f, 0xbb, 0x8, 0xe, 0xf7, 0xfb,\n                                                     0x91, 0x76, 0xf7, 0x81, 0xbf, 0xf7, 0x81, 0x77,\n                                                     0x1, 0xa3, 0xfa, 0x7c, 0x3, 0xa3, 0xf7, 0x8c,\n                                                     0x15, 0xf7, 0x7, 0x25, 0xc2, 0x48, 0xda, 0x2d,\n                                                     0xb0, 0xab, 0x18, 0x47, 0xea, 0x6f, 0xa0, 0x36,\n                                                     0xe4, 0x8, 0xf9, 0xaa, 0x6, 0x36, 0x32, 0x70,\n                                                     0x75, 0x46, 0x2d, 0xb0, 0x6b, 0x18, 0xda, 0xe9,\n                                                     0xc2, 0xce, 0xf7, 0x7, 0xf1, 0xfb, 0x7, 0xf1,\n                                                     0x54, 0xce, 0x3c, 0xe9, 0x66, 0x6b, 0x18, 0xd0,\n                                                     0x2e, 0xa5, 0x73, 0xe1, 0x33, 0x8, 0xfd, 0xaa,\n                                                     0x6, 0xe0, 0xe4, 0xa7, 0xa0, 0xcf, 0xea, 0x66,\n                                                     0xab, 0x18, 0x3c, 0x2d, 0x54, 0x48, 0xfb, 0x7,\n                                                     0x25, 0x8, 0xe, 0x72, 0x90, 0x76, 0xe9, 0xc2,\n                                                     0xf8, 0x84, 0x77, 0x1, 0xf8, 0xb7, 0xc2, 0x3,\n                                                     0x9a, 0xf5, 0x15, 0xf7, 0x3a, 0xfb, 0xe, 0x5,\n                                                     0xe9, 0xf8, 0x39, 0xf8, 0xbb, 0x54, 0xfc, 0x84,\n                                                     0xfc, 0x2, 0xe9, 0x7, 0xe, 0xf7, 0xc4, 0xeb,\n                                                     0xc0, 0xf7, 0x5c, 0xc0, 0xd9, 0xac, 0x8b, 0x77,\n                                                     0x1, 0xa9, 0xfa, 0x21, 0x3, 0xa9, 0xf7, 0x8d,\n                                                     0x15, 0xf7, 0xa, 0xfb, 0x3, 0xb4, 0x61, 0xe5,\n                                                     0xfb, 0x3, 0xb4, 0xac, 0x18, 0x4d, 0xd9, 0x5,\n                                                     0xf9, 0x3d, 0xc0, 0xfd, 0x65, 0x6, 0x23, 0xef,\n                                                     0xf3, 0xef, 0x5, 0xf9, 0x65, 0xc0, 0xfd, 0x3d,\n                                                     0x6, 0xc9, 0xd9, 0x62, 0xac, 0x31, 0xfb, 0x3,\n                                                     0x62, 0x61, 0xfb, 0xa, 0xfb, 0x3, 0x19, 0xe,\n                                                     0x3b, 0xa2, 0x76, 0xfa, 0x21, 0x77, 0x1, 0xf7,\n                                                     0x3e, 0xc0, 0xf7, 0x34, 0xc0, 0x3, 0xf7, 0x3e,\n                                                     0x8d, 0x15, 0xc0, 0xf9, 0x7c, 0x6, 0xdb, 0xdc,\n                                                     0xdb, 0x3a, 0x5, 0xfd, 0x7c, 0xc0, 0xf9, 0x4c,\n                                                     0x7, 0xed, 0x3e, 0xac, 0xb4, 0xfb, 0x3, 0xe5,\n                                                     0x61, 0xb4, 0xfb, 0x3, 0xf7, 0xa, 0x19, 0xfb,\n                                                     0x3, 0xfb, 0xa, 0x61, 0x62, 0xfb, 0x3, 0x31,\n                                                     0xac, 0x62, 0x18, 0xed, 0xd8, 0x5, 0xe, 0xf7,\n                                                     0xc4, 0xee, 0xc0, 0xf7, 0x51, 0xc0, 0x1, 0xb8,\n                                                     0xee, 0x15, 0xf9, 0x3d, 0x6, 0x48, 0x35, 0xb9,\n                                                     0x6a, 0xe5, 0xf7, 0x3, 0xb4, 0xb5, 0xf7, 0xa,\n                                                     0xf7, 0x3, 0x19, 0xfb, 0xa, 0xf7, 0x3, 0x62,\n                                                     0xb5, 0x31, 0xf7, 0x3, 0x5d, 0x6a, 0x18, 0xce,\n                                                     0x3a, 0x5, 0xfd, 0x3d, 0x56, 0xf9, 0x68, 0x6,\n                                                     0xf0, 0x2a, 0x26, 0x2f, 0x5, 0xfd, 0x68, 0x6,\n                                                     0xe, 0x3b, 0x8d, 0x76, 0xfa, 0x21, 0x77, 0x1,\n                                                     0xf7, 0x43, 0xc0, 0xf7, 0x34, 0xc0, 0x3, 0xb7,\n                                                     0xf7, 0x7a, 0x15, 0xf7, 0x3, 0x31, 0xb5, 0x62,\n                                                     0xf7, 0x3, 0xfb, 0xa, 0xf7, 0x3, 0xf7, 0xa,\n                                                     0xb5, 0xb4, 0xf7, 0x3, 0xe5, 0x6a, 0xb4, 0x18,\n                                                     0x29, 0x3e, 0x5, 0xf9, 0x4c, 0x56, 0xfd, 0x7c,\n                                                     0x7, 0x3b, 0x3a, 0x3b, 0xdc, 0x5, 0xf9, 0x7c,\n                                                     0x56, 0xfd, 0x4c, 0x7, 0x29, 0xd8, 0x5, 0xe,\n                                                     0xf7, 0xfb, 0xf7, 0x1, 0xbd, 0xf7, 0x40, 0xbd,\n                                                     0x1, 0xa6, 0xfa, 0x78, 0x3, 0xa6, 0xf7, 0x89,\n                                                     0x15, 0xf7, 0x8, 0x21, 0xb2, 0x61, 0xed, 0xfb,\n                                                     0x9, 0xb3, 0xad, 0x18, 0x3f, 0xea, 0x5, 0xf8,\n                                                     0xc6, 0x6, 0x3f, 0x2c, 0xb3, 0x69, 0xed, 0xf7,\n                                                     0x9, 0xb2, 0xb5, 0xf7, 0x8, 0xf5, 0x19, 0xfb,\n                                                     0x8, 0xf5, 0x64, 0xb5, 0x29, 0xf7, 0x9, 0x63,\n                                                     0x69, 0x18, 0xd7, 0x2c, 0x5, 0xfc, 0xc6, 0x6,\n                                                     0xd7, 0xea, 0x63, 0xad, 0x29, 0xfb, 0x9, 0x64,\n                                                     0x61, 0xfb, 0x8, 0x21, 0x19, 0xf7, 0x41, 0x35,\n                                                     0x15, 0x34, 0xe1, 0xe2, 0xe1, 0x5, 0xf9, 0x1f,\n                                                     0x6, 0xe2, 0x35, 0x34, 0x35, 0x5, 0xe, 0xa9,\n                                                     0xa0, 0x76, 0xf8, 0x5d, 0xc2, 0xf7, 0x55, 0x77,\n                                                     0x1, 0xf7, 0xdd, 0x16, 0xc6, 0x6, 0xf7, 0xb9,\n                                                     0xf9, 0x55, 0x5, 0x52, 0x6, 0x39, 0xfb, 0x55,\n                                                     0x5, 0xfc, 0x5, 0x6, 0x36, 0xf7, 0x55, 0x5,\n                                                     0x52, 0x6, 0xf7, 0xde, 0xfd, 0xf, 0x15, 0xfb,\n                                                     0x38, 0xf8, 0x17, 0x5, 0xf7, 0xd6, 0x6, 0xe,\n                                                     0xfb, 0x51, 0x77, 0xa8, 0xf8, 0x0, 0xb2, 0xf7,\n                                                     0xb2, 0xbb, 0x1, 0xa5, 0xe1, 0xf7, 0x9f, 0xde,\n                                                     0x3, 0xf8, 0xf, 0xf7, 0xec, 0x15, 0xbf, 0x48,\n                                                     0x6e, 0x9b, 0x50, 0x1b, 0xfb, 0xa, 0x3b, 0x27,\n                                                     0xfb, 0xe, 0xfb, 0x10, 0xdf, 0x35, 0xf6, 0xf7,\n                                                     0x56, 0xbe, 0xf7, 0xb4, 0xf7, 0x11, 0xf7, 0x30,\n                                                     0x48, 0xf7, 0x59, 0xfb, 0x59, 0x57, 0x58, 0x7b,\n                                                     0x7e, 0x6d, 0x1f, 0xb2, 0x59, 0x5, 0xa0, 0xb4,\n                                                     0xa4, 0x95, 0xd2, 0x1b, 0xf1, 0xb6, 0xfb, 0x36,\n                                                     0xfb, 0x54, 0x84, 0x1f, 0x83, 0x68, 0x15, 0x2b,\n                                                     0x77, 0x7a, 0xfb, 0x60, 0xfb, 0x1b, 0x1b, 0x40,\n                                                     0x7f, 0xea, 0xb7, 0xd9, 0xb1, 0xf7, 0x27, 0xf7,\n                                                     0x0, 0xc8, 0xaa, 0x62, 0x74, 0xa0, 0x1f, 0xe,\n                                                     0x8b, 0xc2, 0xf7, 0xb3, 0xc2, 0xf7, 0x93, 0xc2,\n                                                     0x1, 0xf8, 0x3b, 0xc2, 0x3, 0xa4, 0x16, 0xf8,\n                                                     0x59, 0xf9, 0x57, 0xfc, 0x59, 0x54, 0xf8, 0x22,\n                                                     0xfb, 0x93, 0xfb, 0xf6, 0x54, 0xf7, 0xf6, 0xfb,\n                                                     0xb3, 0xfc, 0x22, 0x6, 0xe, 0xf7, 0x20, 0x73,\n                                                     0xc0, 0xf9, 0x14, 0xbd, 0x1, 0xb2, 0xc3, 0xf9,\n                                                     0xb, 0xc2, 0x3, 0xf7, 0x6c, 0xf7, 0x0, 0x15,\n                                                     0xf8, 0x42, 0xf8, 0x56, 0x5, 0xba, 0x55, 0xac,\n                                                     0x40, 0x3c, 0x1a, 0xfb, 0x40, 0xfb, 0x20, 0xfb,\n                                                     0x29, 0xfb, 0x40, 0x3c, 0x48, 0xad, 0xb8, 0x57,\n                                                     0x1e, 0x66, 0xb1, 0x15, 0x73, 0xa8, 0x4f, 0xc5,\n                                                     0xf7, 0xe, 0x1a, 0xf7, 0x2e, 0xf7, 0x24, 0xf7,\n                                                     0x34, 0xf7, 0x3f, 0xd7, 0xd0, 0x6d, 0x5d, 0xc2,\n                                                     0x1e, 0xfc, 0xcb, 0xfc, 0xdc, 0x15, 0xac, 0x6a,\n                                                     0xee, 0xe5, 0x5, 0x53, 0xca, 0xde, 0x69, 0xe8,\n                                                     0x1b, 0xf7, 0x5f, 0xf7, 0x38, 0xf7, 0x3f, 0xf7,\n                                                     0x5f, 0xe8, 0x65, 0xe4, 0x51, 0xcc, 0x1f, 0xe4,\n                                                     0xe3, 0x67, 0xad, 0x33, 0x34, 0x5, 0xc2, 0x4b,\n                                                     0x37, 0xab, 0x2f, 0x1b, 0xfb, 0x5f, 0xfb, 0x3c,\n                                                     0xfb, 0x3f, 0xfb, 0x55, 0xfb, 0x10, 0xbc, 0x3b,\n                                                     0xbd, 0x5b, 0x1f, 0xe, 0x44, 0x8b, 0xbc, 0xf9,\n                                                     0x13, 0x77, 0x1, 0x91, 0xf8, 0xee, 0x3, 0x91,\n                                                     0x16, 0xf8, 0xee, 0x6, 0xfb, 0xc3, 0xf9, 0x44,\n                                                     0x5, 0xfb, 0x88, 0xfd, 0x13, 0x15, 0xf7, 0x6e,\n                                                     0xf8, 0x68, 0xf7, 0x5b, 0xfc, 0x68, 0x5, 0xe,\n                                                     0xa9, 0x8d, 0x76, 0xf9, 0x42, 0xbe, 0x1, 0xaf,\n                                                     0xf9, 0x19, 0x3, 0xf7, 0xe5, 0x78, 0x15, 0xf7,\n                                                     0xec, 0xf9, 0x75, 0x5, 0xfd, 0x19, 0x6, 0xf7,\n                                                     0xe9, 0xfc, 0xc0, 0x15, 0xfb, 0x62, 0xf8, 0x8d,\n                                                     0x5, 0xf8, 0x47, 0x6, 0xe, 0xa9, 0x8b, 0xc1,\n                                                     0xf7, 0x2d, 0xc1, 0xf7, 0x2d, 0xc1, 0x1, 0xb8,\n                                                     0xf8, 0x60, 0x14, 0xe0, 0xef, 0xf7, 0x63, 0x15,\n                                                     0xf8, 0x29, 0xc1, 0xfc, 0x29, 0x6, 0xe2, 0x95,\n                                                     0xd7, 0xcd, 0xdd, 0x1b, 0xf7, 0x81, 0xc1, 0xfb,\n                                                     0x81, 0x6, 0xfb, 0x2a, 0x42, 0xfb, 0xd, 0xfb,\n                                                     0x5, 0xfb, 0x6, 0xd7, 0xfb, 0xc, 0xf7, 0x27,\n                                                     0x1f, 0xf7, 0x81, 0xc1, 0xfb, 0x81, 0x6, 0x39,\n                                                     0x3f, 0xcd, 0xe2, 0x81, 0x1f, 0xe, 0xa9, 0x66,\n                                                     0x76, 0xc5, 0xc1, 0xf7, 0x2d, 0xc1, 0xf7, 0x2d,\n                                                     0xc1, 0xe2, 0x77, 0x1, 0xb8, 0xc2, 0x3, 0xe9,\n                                                     0x6a, 0x15, 0xb7, 0x72, 0xb8, 0xd8, 0x5, 0x80,\n                                                     0x9a, 0xa9, 0x83, 0xa1, 0x1b, 0xf7, 0x93, 0xc1,\n                                                     0xfb, 0x89, 0x6, 0x7f, 0x73, 0x8d, 0x95, 0x7c,\n                                                     0x1f, 0xdb, 0xf7, 0x21, 0x5, 0xf7, 0x6c, 0xc1,\n                                                     0xfb, 0x4e, 0x6, 0xe2, 0xf7, 0x2d, 0x5, 0xee,\n                                                     0xc1, 0x47, 0x6, 0xae, 0xc9, 0x5d, 0xa4, 0x5a,\n                                                     0x34, 0x5, 0xfb, 0x8, 0x6, 0x29, 0xfb, 0xa,\n                                                     0x2e, 0xfb, 0x1b, 0x38, 0xa7, 0x57, 0xcc, 0x4f,\n                                                     0x1f, 0x65, 0xf7, 0x6c, 0x15, 0xd2, 0x91, 0xd6,\n                                                     0xdf, 0xd5, 0x1b, 0xe8, 0x6, 0x32, 0xfb, 0x2f,\n                                                     0x5, 0x2e, 0xfb, 0x3b, 0x15, 0x6e, 0xa6, 0x70,\n                                                     0xb3, 0x83, 0xb9, 0x8, 0xf7, 0x14, 0x6, 0xe,\n                                                     0xfb, 0x88, 0x7a, 0xba, 0xf7, 0x4b, 0xc2, 0xf7,\n                                                     0x4a, 0xbd, 0x1, 0xf7, 0xd4, 0xe9, 0x3, 0xbb,\n                                                     0x8e, 0x15, 0x85, 0x9d, 0xab, 0x7d, 0xbe, 0x1b,\n                                                     0xf7, 0x22, 0xf7, 0xf, 0xf7, 0x1, 0xf7, 0x3d,\n                                                     0xe3, 0x50, 0xf7, 0x2b, 0xfb, 0x43, 0x6c, 0x69,\n                                                     0x88, 0x82, 0x64, 0x1f, 0x60, 0x7, 0x8e, 0x98,\n                                                     0x99, 0x8d, 0x98, 0x1b, 0xf0, 0xf2, 0x45, 0xfb,\n                                                     0x4, 0x1f, 0xfb, 0x5c, 0x54, 0xf7, 0x5a, 0x6,\n                                                     0x24, 0x2f, 0x3b, 0x25, 0x72, 0x71, 0x8f, 0x94,\n                                                     0x72, 0x1e, 0xe, 0xf7, 0x20, 0x26, 0xa2, 0xf9,\n                                                     0xba, 0xa2, 0x1, 0xf7, 0xe, 0xf7, 0x5, 0xf7,\n                                                     0xfa, 0xf7, 0x5, 0x3, 0xa4, 0x3d, 0x15, 0x74,\n                                                     0xf7, 0xc7, 0xa2, 0x7, 0x50, 0x65, 0xa0, 0xd1,\n                                                     0x1f, 0xf9, 0x43, 0xf7, 0xfa, 0xfd, 0x43, 0x7,\n                                                     0x45, 0x65, 0x76, 0x51, 0x1e, 0x74, 0xf7, 0xc6,\n                                                     0xa2, 0x7, 0x50, 0x65, 0xa0, 0xd1, 0x1f, 0xf8,\n                                                     0xf2, 0x7, 0xe8, 0xd0, 0x9b, 0xa7, 0x1e, 0xa2,\n                                                     0xfd, 0x9e, 0x74, 0x7, 0xa7, 0xd0, 0x7b, 0x2e,\n                                                     0x1f, 0xfc, 0xf2, 0x7, 0x45, 0x66, 0x76, 0x4f,\n                                                     0x1e, 0xe, 0xa9, 0x27, 0xf2, 0xf9, 0x4d, 0xb8,\n                                                     0x1, 0xf8, 0xef, 0x9f, 0x3, 0x99, 0xfb, 0x0,\n                                                     0x15, 0x9f, 0xa6, 0x93, 0x9f, 0x1b, 0xf8, 0x78,\n                                                     0x8e, 0x5, 0xa4, 0xaf, 0x84, 0x87, 0xa5, 0x1f,\n                                                     0x98, 0xf1, 0x90, 0x9f, 0xa4, 0xf1, 0x8, 0x74,\n                                                     0x6, 0x32, 0x68, 0x6b, 0x73, 0x3d, 0x1b, 0xfb,\n                                                     0xfd, 0x6, 0xf7, 0xba, 0xf7, 0xe7, 0xfb, 0xa5,\n                                                     0xf7, 0xfa, 0x5, 0xf7, 0x91, 0x6, 0xf7, 0x14,\n                                                     0x9a, 0x5a, 0x4a, 0x9f, 0x1f, 0x9f, 0x6, 0x85,\n                                                     0xf7, 0x33, 0x5, 0xfc, 0x85, 0x6, 0x69, 0x65,\n                                                     0x90, 0x8d, 0x69, 0x1f, 0xf7, 0xf1, 0xfc, 0x5a,\n                                                     0x5, 0xe, 0xf7, 0x7d, 0xc2, 0x1, 0x96, 0xf7,\n                                                     0x7d, 0x15, 0x42, 0xa, 0xe, 0xfb, 0x4b, 0xf7,\n                                                     0x2f, 0x76, 0xf7, 0x4f, 0xb9, 0x9e, 0xdb, 0xe0,\n                                                     0x77, 0x1, 0xf7, 0x81, 0x9d, 0x3, 0xcc, 0xf7,\n                                                     0x94, 0x15, 0x75, 0x9e, 0x7f, 0x9f, 0xa2, 0x93,\n                                                     0xa0, 0xa1, 0x9f, 0x1e, 0x9e, 0xa0, 0x97, 0x96,\n                                                     0xab, 0x9f, 0x8, 0x8e, 0x90, 0x92, 0x8c, 0x8d,\n                                                     0x1b, 0x91, 0x8a, 0x7f, 0x87, 0x76, 0x86, 0x7a,\n                                                     0x86, 0x7c, 0x1f, 0x83, 0x73, 0x80, 0x77, 0x6d,\n                                                     0x1a, 0x74, 0x96, 0x76, 0xa6, 0xa5, 0x95, 0xa2,\n                                                     0xa0, 0x8c, 0x1e, 0xa9, 0x81, 0x9f, 0x83, 0xa4,\n                                                     0x1e, 0x86, 0x9a, 0x87, 0x9b, 0xa0, 0x1a, 0x8f,\n                                                     0x89, 0x96, 0x91, 0x8e, 0x8e, 0x8a, 0x87, 0x92,\n                                                     0x1e, 0xa6, 0x7a, 0x9e, 0x7a, 0x98, 0x7e, 0x8,\n                                                     0x73, 0xa3, 0x99, 0x75, 0xa6, 0x1b, 0x9b, 0x99,\n                                                     0x97, 0xa1, 0xaa, 0x68, 0x94, 0x6e, 0x93, 0x1f,\n                                                     0x6f, 0x93, 0x6b, 0x93, 0x74, 0x97, 0x8, 0x84,\n                                                     0x8f, 0x85, 0x8e, 0x90, 0x1a, 0x8e, 0x8f, 0x8f,\n                                                     0x94, 0x90, 0x1e, 0xcd, 0xaa, 0x8d, 0x82, 0xb3,\n                                                     0x95, 0x8, 0x97, 0x8e, 0xa6, 0x98, 0xa3, 0x1a,\n                                                     0xa4, 0x7a, 0x97, 0x78, 0x6e, 0x79, 0x6b, 0x6f,\n                                                     0x70, 0x1e, 0x7f, 0x7f, 0x7a, 0x7f, 0x7d, 0x83,\n                                                     0x8, 0x88, 0x85, 0x86, 0x88, 0x88, 0x1b, 0x87,\n                                                     0x8a, 0x90, 0x98, 0xa6, 0x92, 0x9e, 0x92, 0x9f,\n                                                     0x1f, 0x91, 0x9c, 0x91, 0x9d, 0xa4, 0x1a, 0x9d,\n                                                     0x83, 0xa1, 0x70, 0x70, 0x83, 0x76, 0x79, 0x73,\n                                                     0x91, 0x79, 0x91, 0x78, 0x1e, 0x92, 0x77, 0x92,\n                                                     0x77, 0x71, 0x1a, 0x7f, 0x8a, 0x85, 0x87, 0x88,\n                                                     0x87, 0x8d, 0x8f, 0x84, 0x1e, 0x75, 0x96, 0x7d,\n                                                     0x97, 0x80, 0x96, 0x8, 0xa3, 0x75, 0x80, 0xae,\n                                                     0x6a, 0x1b, 0x73, 0x7b, 0x7a, 0x75, 0x71, 0x9f,\n                                                     0x83, 0xb3, 0x84, 0x1f, 0xa8, 0x86, 0x8b, 0x8d,\n                                                     0xc5, 0x70, 0x8, 0x96, 0x86, 0x90, 0x87, 0x88,\n                                                     0x1a, 0x88, 0x87, 0x87, 0x82, 0x86, 0x1e, 0x70,\n                                                     0x7b, 0x71, 0x84, 0x72, 0x86, 0x8, 0x6b, 0x86,\n                                                     0x63, 0x7f, 0x6c, 0x1a, 0xe, 0x65, 0xfa, 0x4f,\n                                                     0x1, 0x95, 0xf8, 0x8d, 0x3, 0xf8, 0x1, 0x65,\n                                                     0x15, 0xf7, 0x2a, 0xfa, 0x4a, 0x68, 0x90, 0xfb,\n                                                     0x13, 0xfd, 0xb2, 0xfb, 0x59, 0xf8, 0x31, 0xfb,\n                                                     0x26, 0x43, 0x9b, 0x6a, 0xeb, 0xba, 0x5, 0xe,\n                                                     0xa9, 0xf7, 0xf, 0xbe, 0xf7, 0x46, 0xbf, 0x1,\n                                                     0xa6, 0xc0, 0x3, 0xf8, 0x1, 0xf7, 0x81, 0x15,\n                                                     0x60, 0xb6, 0xda, 0x44, 0xd0, 0x1b, 0xad, 0xa8,\n                                                     0x9b, 0x9f, 0x9f, 0x1f, 0x6b, 0xad, 0x5, 0x7f,\n                                                     0x7d, 0x7b, 0x84, 0x7a, 0x1b, 0x5d, 0x59, 0xb2,\n                                                     0xc4, 0x50, 0x1f, 0xbc, 0xbf, 0xba, 0xb0, 0xb8,\n                                                     0x1b, 0xa0, 0x9f, 0x85, 0x7b, 0x9f, 0x1f, 0xa8,\n                                                     0xb1, 0x5, 0x93, 0x7e, 0x72, 0xa3, 0x63, 0x1b,\n                                                     0x37, 0x68, 0x64, 0x4e, 0x3f, 0x1f, 0xc6, 0x44,\n                                                     0x51, 0xb4, 0x47, 0x1b, 0x33, 0x55, 0x3f, 0x51,\n                                                     0x3e, 0xc3, 0x45, 0xde, 0xd6, 0xc7, 0xbf, 0xc9,\n                                                     0xcb, 0x1f, 0x62, 0xab, 0x15, 0x73, 0x7d, 0x3b,\n                                                     0x45, 0x4f, 0x1b, 0x56, 0x66, 0xc2, 0xb2, 0xa5,\n                                                     0xa3, 0xc4, 0xcf, 0xbe, 0xe1, 0x4c, 0x77, 0x9a,\n                                                     0x1f, 0xe, 0xa9, 0xf7, 0x10, 0xbe, 0xf7, 0x48,\n                                                     0xbc, 0x1, 0xa5, 0xbe, 0xf8, 0xc2, 0xc0, 0x3,\n                                                     0xf7, 0xf9, 0xf7, 0x80, 0x15, 0x76, 0xa3, 0xcf,\n                                                     0x30, 0xdf, 0x1b, 0xf4, 0xbd, 0xd2, 0xd5, 0xd1,\n                                                     0x4a, 0xcc, 0x31, 0x36, 0x67, 0x5a, 0x56, 0x54,\n                                                     0x1f, 0xc5, 0x4d, 0x61, 0xb7, 0x34, 0x1b, 0x42,\n                                                     0x8a, 0x48, 0x4f, 0x41, 0x1a, 0x41, 0xba, 0x44,\n                                                     0xe8, 0xf2, 0xcb, 0xe6, 0xa0, 0xa3, 0x1e, 0x69,\n                                                     0xac, 0x15, 0x58, 0x5d, 0x5a, 0x60, 0x4d, 0x1b,\n                                                     0x5c, 0x61, 0xae, 0xc6, 0xb0, 0xa6, 0xbc, 0xc9,\n                                                     0xbf, 0xb3, 0x6b, 0x55, 0xcc, 0x1f, 0xce, 0x16,\n                                                     0xc2, 0xca, 0xa1, 0xa8, 0xc5, 0x1b, 0xd6, 0xa6,\n                                                     0x51, 0x71, 0x49, 0x56, 0x6d, 0x5a, 0x61, 0x61,\n                                                     0xb2, 0xc4, 0x50, 0x1f, 0xe, 0xe0, 0x8b, 0xc2,\n                                                     0xf8, 0xfe, 0x77, 0x1, 0xa5, 0x16, 0xf9, 0x5c,\n                                                     0xc2, 0xfc, 0xd6, 0x6, 0xf8, 0xd6, 0xf8, 0xd9,\n                                                     0x62, 0xb0, 0x5, 0xe, 0x3b, 0xa0, 0x76, 0xf8,\n                                                     0x5a, 0x77, 0x1, 0xa2, 0x16, 0xcc, 0x6, 0xf7,\n                                                     0x6b, 0xf7, 0xf2, 0xf7, 0x6b, 0xfb, 0xf2, 0x5,\n                                                     0xcc, 0x6, 0xfb, 0xac, 0xf8, 0x5a, 0x5, 0xe,\n                                                     0x3b, 0xa0, 0x76, 0xf8, 0x71, 0x77, 0x1, 0xa9,\n                                                     0xf8, 0xb8, 0x3, 0xa9, 0xf8, 0x54, 0x15, 0xf7,\n                                                     0xa6, 0xfc, 0x54, 0xf7, 0xa6, 0xf8, 0x54, 0x5f,\n                                                     0xa8, 0xfb, 0x7a, 0xfc, 0xb, 0xfb, 0x7a, 0xf8,\n                                                     0xb, 0x5, 0xe, 0xe0, 0xa0, 0x76, 0xf8, 0x61,\n                                                     0xbb, 0x55, 0xa, 0x16, 0xc2, 0xf7, 0x51, 0x6,\n                                                     0xf7, 0x23, 0xf7, 0x27, 0xf7, 0x15, 0xf7, 0x24,\n                                                     0xf7, 0x32, 0xf7, 0x19, 0xfb, 0x27, 0xfb, 0x11,\n                                                     0x1e, 0xfb, 0x51, 0xc2, 0xf7, 0x51, 0x7, 0xf7,\n                                                     0x41, 0xfb, 0x2f, 0xf7, 0x27, 0xfb, 0x53, 0xfb,\n                                                     0x53, 0xfb, 0x2f, 0xfb, 0x27, 0xfb, 0x41, 0x1e,\n                                                     0xe, 0xe0, 0x7a, 0xba, 0xf8, 0x62, 0x77, 0x55,\n                                                     0xa, 0xf7, 0xc1, 0x15, 0xfb, 0x41, 0xf7, 0x2f,\n                                                     0xfb, 0x25, 0x4b, 0xa, 0xf7, 0x2f, 0xf7, 0x25,\n                                                     0xf7, 0x41, 0x1e, 0xf7, 0x53, 0x54, 0xfb, 0x52,\n                                                     0x7, 0xfb, 0x11, 0xfb, 0x19, 0xfb, 0x27, 0xfb,\n                                                     0x32, 0xfb, 0x24, 0xfb, 0x27, 0xf7, 0x15, 0xf7,\n                                                     0x23, 0x1e, 0xf7, 0x52, 0x54, 0x7, 0xe, 0xfc,\n                                                     0x2d, 0x20, 0xf7, 0x4, 0xf9, 0xb8, 0xf6, 0x1,\n                                                     0xf7, 0xc, 0xd1, 0x3, 0x8d, 0x58, 0x15, 0x6a,\n                                                     0xaa, 0x74, 0xae, 0xf7, 0x27, 0x6e, 0xf8, 0x5d,\n                                                     0xf7, 0x1e, 0x8f, 0x1e, 0xf7, 0x1c, 0x76, 0xf7,\n                                                     0x31, 0x8d, 0xb0, 0x1e, 0x95, 0x8c, 0x8e, 0x92,\n                                                     0x94, 0x9b, 0x9a, 0x71, 0xac, 0x1b, 0xa4, 0x9d,\n                                                     0x9d, 0xa6, 0xb2, 0x72, 0xa2, 0x67, 0xfb, 0xb,\n                                                     0x94, 0xfb, 0x8a, 0xfb, 0x27, 0x1f, 0x8a, 0xfb,\n                                                     0xca, 0x90, 0x2e, 0x8d, 0x41, 0x8, 0x5c, 0x8d,\n                                                     0x8a, 0x73, 0x7c, 0x7c, 0x7a, 0xa9, 0x71, 0x1b,\n                                                     0x6f, 0x73, 0x7e, 0x60, 0x1f, 0xe, 0xf7, 0x48,\n                                                     0x8b, 0xf7, 0x15, 0xf7, 0x6f, 0xf7, 0x16, 0x1,\n                                                     0xf7, 0x37, 0xf7, 0x15, 0xd6, 0xf7, 0x16, 0xd6,\n                                                     0xf7, 0x15, 0x14, 0x38, 0xf7, 0x37, 0xcc, 0x15,\n                                                     0x52, 0xa, 0x6f, 0xa7, 0x67, 0x67, 0x6e, 0x6f,\n                                                     0x67, 0x1e, 0xf8, 0x2d, 0x16, 0x52, 0xa, 0x6d,\n                                                     0xa7, 0x67, 0x67, 0x70, 0x6f, 0x67, 0x1e, 0xfb,\n                                                     0x61, 0xf7, 0xf0, 0x15, 0x67, 0xa8, 0x6e, 0xaf,\n                                                     0xaf, 0xa8, 0xa8, 0xaf, 0xaf, 0x6e, 0xa8, 0x67,\n                                                     0x67, 0x6e, 0x6e, 0x67, 0x1e, 0xe, 0xf7, 0x5f,\n                                                     0xbf, 0x8b, 0xbf, 0x12, 0x9c, 0xf8, 0x94, 0x17,\n                                                     0x13, 0x60, 0xbc, 0xf7, 0x5f, 0x15, 0xa9, 0xa6,\n                                                     0xaa, 0xa1, 0xb8, 0x1b, 0xa9, 0xaa, 0x7f, 0x7c,\n                                                     0xba, 0x1f, 0x7f, 0xb1, 0xc0, 0x7e, 0xba, 0x1b,\n                                                     0xa2, 0xa1, 0x92, 0x94, 0x9f, 0x1f, 0xaa, 0x9a,\n                                                     0xa5, 0xa0, 0x94, 0x9d, 0x6a, 0xad, 0x18, 0x7c,\n                                                     0x7d, 0x6f, 0x66, 0x53, 0x1b, 0x63, 0x5f, 0x96,\n                                                     0x98, 0x65, 0x1f, 0x13, 0xe0, 0x99, 0x63, 0x66,\n                                                     0x99, 0x5c, 0x1b, 0x40, 0x6a, 0x61, 0x73, 0x70,\n                                                     0x1f, 0xe, 0x8b, 0xc2, 0xf7, 0x15, 0xc2, 0xf7,\n                                                     0x1b, 0xba, 0x90, 0xbb, 0x12, 0x96, 0xf7, 0x4c,\n                                                     0x15, 0x3a, 0xa, 0xfb, 0x83, 0x4, 0x3a, 0xa,\n                                                     0x13, 0x30, 0xba, 0xf7, 0xcf, 0x15, 0xab, 0xa8,\n                                                     0xa2, 0xa3, 0xbe, 0x1b, 0xa5, 0xad, 0x84, 0x7b,\n                                                     0xb9, 0x1f, 0x13, 0x20, 0x78, 0xc0, 0xb4, 0x81,\n                                                     0xaf, 0x1b, 0xa4, 0xa1, 0x90, 0x96, 0xa2, 0x1f,\n                                                     0xb7, 0xa0, 0x96, 0xa4, 0x93, 0x9a, 0x66, 0xa3,\n                                                     0x18, 0x7b, 0x7d, 0x73, 0x65, 0x4b, 0x1b, 0x72,\n                                                     0x63, 0x94, 0x97, 0x6c, 0x1f, 0x13, 0x10, 0x66,\n                                                     0x99, 0x60, 0x9c, 0x5e, 0x8c, 0x8, 0x34, 0x5e,\n                                                     0x5d, 0x6b, 0x77, 0x1f, 0xe, 0xf7, 0x1b, 0xbe,\n                                                     0xf4, 0xbe, 0x12, 0x99, 0xf8, 0x96, 0x17, 0xb9,\n                                                     0xf7, 0xb7, 0x57, 0xa, 0xb3, 0x7b, 0x7d, 0xbc,\n                                                     0x1f, 0x80, 0xb0, 0xb6, 0x32, 0xa, 0x97, 0x98,\n                                                     0x65, 0x1f, 0x98, 0x63, 0x62, 0x99, 0x5c, 0x1b,\n                                                     0x40, 0x68, 0x63, 0x72, 0x6d, 0x1f, 0xab, 0xfb,\n                                                     0x56, 0x57, 0xa, 0xb5, 0x7b, 0x7d, 0xbc, 0x1f,\n                                                     0x13, 0xa0, 0x80, 0xb0, 0xb4, 0x32, 0xa, 0x98,\n                                                     0x98, 0x64, 0x1f, 0x98, 0x63, 0x63, 0x98, 0x5c,\n                                                     0x1b, 0x40, 0x68, 0x62, 0x72, 0x6d, 0x1f, 0xe,\n                                                     0x87, 0x76, 0xf7, 0x35, 0xc2, 0xf7, 0x1f, 0xc2,\n                                                     0xf7, 0x38, 0x77, 0x1, 0xe9, 0x16, 0xbd, 0x72,\n                                                     0xe6, 0xf7, 0x35, 0x5, 0xf7, 0xc5, 0xc2, 0xfb,\n                                                     0xa7, 0x6, 0xd8, 0xf7, 0x1f, 0x5, 0xf7, 0x5a,\n                                                     0xc2, 0xfb, 0x3c, 0x6, 0xd7, 0xf7, 0x1c, 0x5a,\n                                                     0xa7, 0x30, 0xfb, 0x38, 0x5, 0xfb, 0xb9, 0x54,\n                                                     0xf7, 0x9a, 0x6, 0x3e, 0xfb, 0x1f, 0x5, 0xfb,\n                                                     0x4d, 0x54, 0xf7, 0x2f, 0x6, 0xe, 0xdd, 0xc2,\n                                                     0xed, 0xc2, 0xed, 0xc2, 0x1, 0x99, 0xf8, 0xa0,\n                                                     0x14, 0xe0, 0x99, 0xf8, 0x18, 0x15, 0x42, 0xa,\n                                                     0xfb, 0x64, 0x4, 0x42, 0xa, 0xfb, 0x64, 0x4,\n                                                     0x42, 0xa, 0xe, 0x3d, 0xa, 0xf7, 0xb8, 0x4,\n                                                     0xf8, 0x85, 0xfb, 0x76, 0x5, 0xc9, 0x7, 0xfc,\n                                                     0x45, 0xf7, 0x57, 0x3e, 0xa, 0x3d, 0xa, 0xcd,\n                                                     0x4, 0xf8, 0x85, 0xf7, 0x76, 0x5, 0x51, 0xa,\n                                                     0xf8, 0x45, 0xfb, 0x5b, 0xfc, 0x45, 0xfb, 0x57,\n                                                     0x5, 0xe, 0xa9, 0x8b, 0x47, 0xa, 0xb1, 0xc5,\n                                                     0x3, 0xf9, 0x46, 0x16, 0xc2, 0xfc, 0x29, 0x7,\n                                                     0x21, 0x8c, 0x39, 0xe3, 0xe2, 0x1a, 0xf0, 0xe1,\n                                                     0xde, 0xf3, 0x1e, 0xf8, 0x27, 0xc2, 0xfc, 0x28,\n                                                     0x6, 0xfb, 0x33, 0x34, 0xfb, 0x11, 0xfb, 0x6,\n                                                     0x8a, 0x1f, 0xfb, 0x19, 0x8a, 0xf7, 0x6, 0x29,\n                                                     0xf7, 0x16, 0x1b, 0xe, 0xa9, 0x8b, 0x47, 0xa,\n                                                     0xf8, 0xfb, 0xc5, 0x3, 0xf8, 0x40, 0x16, 0xf7,\n                                                     0x16, 0xf7, 0x7, 0xed, 0xf7, 0x19, 0xf7, 0x6,\n                                                     0x31, 0xf7, 0x11, 0xfb, 0x33, 0x1f, 0xfc, 0x28,\n                                                     0x54, 0xf8, 0x27, 0x6, 0xf3, 0xe3, 0x38, 0x26,\n                                                     0x34, 0x37, 0x33, 0x21, 0x58, 0xa, 0xa9, 0x5a,\n                                                     0x76, 0xd1, 0xc2, 0xf7, 0xfb, 0xc2, 0xd2, 0x77,\n                                                     0x1, 0xaf, 0xc5, 0x3, 0xf7, 0x8d, 0x45, 0x15,\n                                                     0xc7, 0x6, 0xaf, 0xd1, 0x5, 0xf7, 0xed, 0xc2,\n                                                     0xfb, 0xd0, 0x6, 0xf7, 0x44, 0xf7, 0xfb, 0x5,\n                                                     0xf7, 0x20, 0xc2, 0xfb, 0x4, 0x6, 0xb0, 0xd2,\n                                                     0x5, 0x4f, 0x6, 0x67, 0x44, 0x5, 0xfb, 0x8a,\n                                                     0x6, 0xfb, 0x4, 0xfb, 0x11, 0x36, 0xfb, 0x2b,\n                                                     0xfb, 0x31, 0xf7, 0x11, 0x3f, 0xf7, 0x10, 0x8a,\n                                                     0x1f, 0xa7, 0xc2, 0x15, 0xfb, 0x14, 0x8c, 0x30,\n                                                     0xdc, 0xee, 0x1a, 0xe2, 0xd9, 0xe7, 0xf5, 0x1e,\n                                                     0xf7, 0x68, 0x6, 0xe, 0xa9, 0xfb, 0x11, 0xc2,\n                                                     0xd1, 0x47, 0xa, 0xb0, 0xc3, 0x3, 0xb0, 0x45,\n                                                     0x15, 0x54, 0xf9, 0x21, 0xc2, 0x7, 0xd1, 0x4,\n                                                     0xc2, 0xfc, 0x29, 0x7, 0xfb, 0x10, 0x8c, 0x46,\n                                                     0xee, 0x8c, 0xdc, 0x8, 0xf7, 0x0, 0x8c, 0xea,\n                                                     0xd2, 0xed, 0x1b, 0xf8, 0x27, 0xc2, 0xfc, 0x28,\n                                                     0x6, 0xfb, 0x40, 0x3e, 0xfb, 0x16, 0xfb, 0x1,\n                                                     0xfb, 0x19, 0xf3, 0x29, 0xf7, 0x21, 0x1f, 0xe,\n                                                     0xa9, 0xfb, 0x11, 0xc2, 0xd1, 0x47, 0xa, 0xf8,\n                                                     0xfd, 0xc3, 0x3, 0x9f, 0xfb, 0x11, 0x15, 0xf9,\n                                                     0x21, 0xc2, 0xfd, 0x21, 0x6, 0xf8, 0x2c, 0xd1,\n                                                     0x15, 0xf7, 0x21, 0xf3, 0xed, 0xf7, 0x19, 0xf7,\n                                                     0x1, 0x3e, 0xf7, 0x16, 0xfb, 0x40, 0x1f, 0xfc,\n                                                     0x28, 0x54, 0xf8, 0x27, 0x6, 0xed, 0xeb, 0x44,\n                                                     0xfb, 0x0, 0x3a, 0x47, 0x28, 0xfb, 0x10, 0x58,\n                                                     0xa, 0xe0, 0x7c, 0xc0, 0xf7, 0x9d, 0xc1, 0xf7,\n                                                     0x9d, 0xc0, 0x1, 0xb6, 0xc4, 0xf7, 0x99, 0xc1,\n                                                     0xf7, 0x9d, 0xc0, 0x14, 0xe0, 0xf7, 0x24, 0xf7,\n                                                     0xc3, 0x15, 0xf7, 0x6d, 0xfb, 0x71, 0xc1, 0xf7,\n                                                     0x71, 0xf7, 0x6e, 0xc1, 0xfb, 0x6e, 0xf7, 0x6f,\n                                                     0x55, 0xfb, 0x6f, 0xfb, 0x6d, 0x6, 0x5f, 0x70,\n                                                     0x15, 0xf7, 0x35, 0xf7, 0x13, 0x30, 0xa, 0xfb,\n                                                     0x13, 0xf7, 0x17, 0xf7, 0x35, 0x1e, 0x52, 0x16,\n                                                     0x21, 0xa, 0xe, 0xe0, 0x7a, 0xc0, 0xf8, 0xdc,\n                                                     0xc0, 0x1, 0xb6, 0xc0, 0xf8, 0xdc, 0xc0, 0x3,\n                                                     0xf7, 0x54, 0xf7, 0x3f, 0x15, 0xb2, 0x64, 0xf7,\n                                                     0x31, 0xf7, 0x32, 0xf7, 0x32, 0xfb, 0x33, 0xb2,\n                                                     0xb1, 0xfb, 0x32, 0xf7, 0x33, 0xf7, 0x30, 0xf7,\n                                                     0x30, 0x64, 0xb1, 0xfb, 0x30, 0xfb, 0x30, 0xfb,\n                                                     0x31, 0xf7, 0x32, 0x64, 0x64, 0xf7, 0x31, 0xfb,\n                                                     0x31, 0x5, 0xfb, 0xc6, 0x16, 0x21, 0xa, 0xc0,\n                                                     0x16, 0xf7, 0x35, 0xf7, 0x17, 0x30, 0xa, 0xfb,\n                                                     0x17, 0xf7, 0x17, 0xf7, 0x35, 0x1e, 0xe, 0x72,\n                                                     0x8b, 0xc2, 0xf8, 0xff, 0x77, 0x1, 0xf7, 0xc6,\n                                                     0xc2, 0x3, 0x9a, 0x16, 0xf9, 0x11, 0xc2, 0xfb,\n                                                     0xb7, 0xf8, 0xff, 0x54, 0xfc, 0xff, 0xfb, 0xb7,\n                                                     0x6, 0xe, 0xfc, 0x45, 0xf7, 0x66, 0xef, 0x1,\n                                                     0xd0, 0xef, 0x3, 0xd0, 0xf7, 0x98, 0x15, 0x6f,\n                                                     0xa1, 0x75, 0xa7, 0xa6, 0xa2, 0xa1, 0xa7, 0xa6,\n                                                     0x74, 0xa2, 0x70, 0x6f, 0x75, 0x74, 0x70, 0x1e,\n                                                     0xe, 0x8e, 0x4d, 0x76, 0xf9, 0xe9, 0xf7, 0x2b,\n                                                     0x1, 0xf7, 0xe0, 0xd1, 0x3, 0xf7, 0xe0, 0x38,\n                                                     0x15, 0xd1, 0xf8, 0x13, 0x6, 0xf8, 0x88, 0xf7,\n                                                     0x33, 0xd0, 0xae, 0x93, 0x92, 0x89, 0x89, 0x8f,\n                                                     0x1e, 0x82, 0x86, 0x80, 0x79, 0x78, 0x1a, 0x73,\n                                                     0x9d, 0x6e, 0xb1, 0xb7, 0x9f, 0xb3, 0xb2, 0xaf,\n                                                     0x68, 0xaf, 0x5e, 0x4f, 0xfb, 0x87, 0x59, 0xfc,\n                                                     0xd3, 0x1e, 0xe, 0x8e, 0x3a, 0xf7, 0x29, 0xf9,\n                                                     0xe9, 0x77, 0x1, 0xf7, 0xee, 0xd0, 0x3, 0xf7,\n                                                     0x1e, 0x70, 0x15, 0x94, 0x90, 0x96, 0x9d, 0x9e,\n                                                     0x1a, 0xa3, 0x79, 0xa8, 0x65, 0x5f, 0x78, 0x64,\n                                                     0x64, 0x67, 0xad, 0x68, 0xb8, 0xc7, 0xf7, 0x81,\n                                                     0xbb, 0xf8, 0xd3, 0x1e, 0xf8, 0xf, 0x46, 0xfc,\n                                                     0x13, 0x7, 0xfc, 0x88, 0xfb, 0x2e, 0x46, 0x68,\n                                                     0x83, 0x84, 0x8d, 0x8d, 0x87, 0x1e, 0xe, 0x4c,\n                                                     0xa, 0xa4, 0xf7, 0xa6, 0x15, 0xf7, 0x7a, 0xfc,\n                                                     0x6c, 0xbe, 0xa4, 0xfb, 0x6e, 0xf8, 0x53, 0xf7,\n                                                     0x6e, 0xf8, 0x54, 0x58, 0xa3, 0x5, 0xe, 0x4c,\n                                                     0xa, 0xd3, 0xfb, 0x5a, 0x15, 0xf7, 0x7a, 0xf8,\n                                                     0x6c, 0xfb, 0x7a, 0xf8, 0x6c, 0x58, 0x73, 0xf7,\n                                                     0x6e, 0xfc, 0x54, 0xfb, 0x6e, 0xfc, 0x53, 0x5,\n                                                     0xe, 0xfb, 0x51, 0xa0, 0x76, 0xf9, 0x7d, 0x77,\n                                                     0x1, 0x9d, 0xc7, 0xf7, 0xde, 0xc7, 0x3, 0xf7,\n                                                     0x68, 0x16, 0xc7, 0x6, 0xf7, 0x58, 0xf8, 0xd,\n                                                     0xfb, 0x58, 0xf8, 0x4, 0x5, 0x4f, 0x6, 0xfb,\n                                                     0x56, 0xfc, 0x4, 0x5, 0xf7, 0x74, 0xfb, 0xd6,\n                                                     0x15, 0xfb, 0x38, 0xf7, 0xd6, 0xf7, 0x38, 0xf7,\n                                                     0xce, 0xf7, 0x3a, 0xfb, 0xce, 0x5, 0xe, 0xd1,\n                                                     0x7c, 0x76, 0xf8, 0xdc, 0x77, 0x1, 0xf7, 0xec,\n                                                     0xc1, 0x3, 0xf7, 0xbb, 0x67, 0x15, 0xf7, 0x2c,\n                                                     0x6, 0x84, 0x95, 0x62, 0xac, 0x8a, 0xce, 0x8,\n                                                     0xaf, 0x8a, 0x94, 0xa0, 0x9d, 0x1b, 0x91, 0x8f,\n                                                     0x86, 0x81, 0x90, 0x1f, 0x5d, 0xa2, 0xa2, 0x5e,\n                                                     0xcc, 0x1b, 0xbb, 0xaa, 0xc4, 0xbb, 0xc0, 0x74,\n                                                     0xb2, 0x61, 0xc2, 0x1f, 0x2d, 0xf7, 0x10, 0x6f,\n                                                     0xae, 0x44, 0xf7, 0x4, 0x44, 0xfb, 0x4, 0x6f,\n                                                     0x68, 0x2d, 0xfb, 0x10, 0x8, 0x61, 0x54, 0x74,\n                                                     0x64, 0x56, 0x1a, 0x5f, 0xa1, 0x4c, 0xcb, 0xc8,\n                                                     0xa6, 0xc6, 0xb1, 0x9c, 0x1e, 0x92, 0x8e, 0x8f,\n                                                     0x90, 0x94, 0x1b, 0x98, 0x97, 0x77, 0x65, 0x8a,\n                                                     0x1f, 0x8a, 0x48, 0x62, 0x6a, 0x84, 0x81, 0x8,\n                                                     0xe, 0xd1, 0x86, 0x76, 0xf7, 0x3c, 0xf7, 0x17,\n                                                     0x12, 0xf7, 0xe5, 0xd2, 0x4f, 0xbd, 0x13, 0xd0,\n                                                     0xf7, 0xbf, 0x71, 0x15, 0xf7, 0x28, 0x6, 0x70,\n                                                     0xac, 0x75, 0x9f, 0xcd, 0x1a, 0xaa, 0x8e, 0x9e,\n                                                     0x99, 0x95, 0x9a, 0x7e, 0x6f, 0xa2, 0x1e, 0x6b,\n                                                     0xa6, 0xab, 0x81, 0xb2, 0x1b, 0xc5, 0xb4, 0xc7,\n                                                     0xc9, 0xd1, 0x67, 0xc6, 0x47, 0x5f, 0x5e, 0x6d,\n                                                     0x83, 0x7c, 0x1f, 0x13, 0xe0, 0x70, 0x7d, 0x7a,\n                                                     0x92, 0x9a, 0x1a, 0x92, 0x8f, 0x92, 0x90, 0x90,\n                                                     0x1e, 0x9d, 0x9e, 0xcd, 0xb0, 0xd1, 0x1a, 0xd9,\n                                                     0x4b, 0xa8, 0x4b, 0x4a, 0x4b, 0x6c, 0x38, 0x48,\n                                                     0xd1, 0x67, 0x9a, 0x7b, 0x1e, 0x90, 0x85, 0x8e,\n                                                     0x85, 0x84, 0x1a, 0x7c, 0x79, 0x86, 0x72, 0x97,\n                                                     0x1e, 0x93, 0x7c, 0x64, 0xa9, 0x5f, 0x1b, 0x46,\n                                                     0x62, 0x53, 0x46, 0x47, 0xb5, 0x50, 0xcc, 0xaf,\n                                                     0xa8, 0x98, 0xa9, 0xa5, 0x1f, 0xa7, 0xa4, 0x9b,\n                                                     0x97, 0x94, 0x1b, 0x13, 0xd0, 0x99, 0x8b, 0x71,\n                                                     0x74, 0x49, 0x74, 0x76, 0x71, 0x6b, 0x1f, 0xe,\n                                                     0xd1, 0x7f, 0x76, 0xf8, 0xc9, 0x77, 0x1, 0xf8,\n                                                     0xa, 0x6a, 0x15, 0xd9, 0xf7, 0x7, 0x9a, 0xa7,\n                                                     0xe6, 0xf7, 0x9, 0x8, 0xb4, 0xc0, 0xab, 0xc0,\n                                                     0xc4, 0x1a, 0xf7, 0x8, 0x43, 0xa5, 0x61, 0x5d,\n                                                     0x5d, 0x76, 0x48, 0x72, 0x1e, 0x78, 0x83, 0x88,\n                                                     0x75, 0x7c, 0x1b, 0x7c, 0x88, 0xa1, 0x9e, 0x83,\n                                                     0x1f, 0xce, 0x72, 0x5d, 0xa0, 0x5d, 0x1b, 0x61,\n                                                     0x43, 0x71, 0xfb, 0x8, 0x52, 0xab, 0x56, 0xb4,\n                                                     0x56, 0x1f, 0xe6, 0xfb, 0x9, 0x9a, 0x6f, 0xd9,\n                                                     0xfb, 0x7, 0x8, 0xe, 0xd1, 0x7c, 0x76, 0xf8,\n                                                     0xde, 0x77, 0x1, 0xf7, 0x22, 0xf8, 0x5e, 0x3,\n                                                     0xf7, 0x22, 0xf7, 0x95, 0x15, 0xf7, 0x7c, 0xfb,\n                                                     0xb9, 0xf7, 0x76, 0xf7, 0xb9, 0xfb, 0x76, 0xf7,\n                                                     0xb9, 0x5, 0xe, 0xf6, 0x7c, 0xb3, 0xf3, 0xb1,\n                                                     0xf7, 0xdb, 0xa5, 0xf7, 0x7, 0xb3, 0x1, 0xbe,\n                                                     0xb3, 0xf7, 0xa, 0xcc, 0xf7, 0x92, 0x9f, 0xf7,\n                                                     0x2d, 0xb3, 0x3, 0xf8, 0xaf, 0xf7, 0x70, 0x15,\n                                                     0x62, 0x59, 0x6a, 0x7f, 0x5e, 0x1b, 0x40, 0x4d,\n                                                     0xc7, 0xf1, 0xd5, 0xb8, 0xe6, 0xdc, 0xc6, 0xc6,\n                                                     0x6c, 0x42, 0x95, 0x1f, 0x9f, 0x6, 0x87, 0xf7,\n                                                     0x14, 0x5, 0x78, 0x6, 0x88, 0x7d, 0x7c, 0x86,\n                                                     0x79, 0x8f, 0x8, 0x90, 0x76, 0x6b, 0x97, 0x64,\n                                                     0x1b, 0x24, 0x36, 0x31, 0x23, 0xfb, 0x9, 0xdb,\n                                                     0x3b, 0xf7, 0xb, 0xd7, 0xb7, 0xbd, 0xa2, 0xa1,\n                                                     0x1f, 0xfc, 0x87, 0xf7, 0x14, 0x23, 0xa, 0xf6,\n                                                     0x7a, 0xb3, 0xf7, 0x18, 0x9d, 0xf7, 0x31, 0xa2,\n                                                     0xf7, 0x32, 0xa3, 0xed, 0xb3, 0x1, 0xbd, 0xb3,\n                                                     0xf7, 0x51, 0xcb, 0xf7, 0x17, 0xcf, 0xf7, 0x32,\n                                                     0xb3, 0x3, 0xbd, 0xf7, 0xdc, 0x4f, 0xa, 0xf7,\n                                                     0x52, 0xf7, 0x2f, 0xf7, 0x2e, 0xf7, 0x53, 0x48,\n                                                     0xa, 0xfb, 0x2f, 0xfb, 0x2f, 0xfb, 0x52, 0x8c,\n                                                     0x2c, 0xa, 0x1e, 0xfb, 0x3d, 0x8a, 0xfb, 0x1c,\n                                                     0x43, 0xa, 0x1a, 0xf7, 0x20, 0xfb, 0x40, 0x15,\n                                                     0xf7, 0x34, 0x9d, 0x6, 0x75, 0x72, 0x9a, 0xa3,\n                                                     0x1f, 0xf7, 0xa, 0xa5, 0x7, 0xf7, 0x19, 0xfb,\n                                                     0x43, 0x5, 0xea, 0x9d, 0x6, 0x7e, 0x7f, 0x8b,\n                                                     0x99, 0x80, 0x1f, 0xfb, 0xc, 0xf7, 0x2c, 0x5,\n                                                     0xc5, 0x9c, 0xb6, 0xa2, 0xc9, 0x1a, 0xd8, 0x3b,\n                                                     0x9c, 0x4f, 0x1e, 0xfb, 0x3b, 0x79, 0x6, 0xb3,\n                                                     0x8f, 0x80, 0x6e, 0x1f, 0xfb, 0xa0, 0x7, 0x78,\n                                                     0x71, 0x7a, 0x74, 0x1e, 0xf7, 0x5, 0xf7, 0x48,\n                                                     0x15, 0xf7, 0x12, 0x7, 0x9c, 0x95, 0x9a, 0x95,\n                                                     0xcf, 0xb5, 0x79, 0x58, 0x8c, 0x1e, 0x39, 0x43,\n                                                     0x85, 0x50, 0x8a, 0x1e, 0xe, 0xf7, 0x63, 0xf7,\n                                                     0xce, 0x76, 0xf7, 0xf9, 0xa2, 0x79, 0x9d, 0x12,\n                                                     0x9d, 0x9d, 0xf7, 0x6, 0xc6, 0xf7, 0x6, 0x9d,\n                                                     0xdd, 0xa6, 0xf7, 0xbc, 0xc6, 0x13, 0xdf, 0xee,\n                                                     0xf7, 0xb9, 0x15, 0xf7, 0x34, 0x9d, 0x6, 0x6c,\n                                                     0x78, 0x9a, 0xa2, 0x1f, 0xf7, 0xc2, 0x7, 0xb0,\n                                                     0x8a, 0xc3, 0x89, 0xa2, 0x6e, 0x89, 0x5f, 0x19,\n                                                     0x9d, 0x8c, 0x88, 0xec, 0x5, 0xfb, 0xd1, 0x6,\n                                                     0x88, 0x2a, 0x9d, 0x8a, 0x89, 0xb7, 0xa2, 0xa8,\n                                                     0xc3, 0x8d, 0x19, 0xb0, 0x8c, 0x5, 0xfb, 0xc2,\n                                                     0x4a, 0xa, 0xf7, 0xa5, 0x79, 0x15, 0xf7, 0x15,\n                                                     0x9d, 0x6, 0x6c, 0x77, 0x9a, 0xa2, 0x1f, 0xf7,\n                                                     0x8f, 0x7, 0xf7, 0x24, 0xfb, 0xc7, 0x5, 0x9d,\n                                                     0x6, 0xf7, 0x1a, 0xf7, 0xd7, 0x5, 0xfb, 0x9f,\n                                                     0x4a, 0xa, 0x79, 0xf7, 0x34, 0x9d, 0x7, 0x6c,\n                                                     0x78, 0x9a, 0xa2, 0x1f, 0xf7, 0xad, 0x7, 0x13,\n                                                     0xbf, 0xa6, 0xa8, 0x89, 0xa0, 0x1e, 0x9d, 0xfb,\n                                                     0x5, 0x7, 0xfb, 0x12, 0xfb, 0xb4, 0xfb, 0x18,\n                                                     0xf7, 0xb4, 0x5, 0xfb, 0x6, 0x79, 0x6, 0xab,\n                                                     0xa0, 0x8e, 0x65, 0x1f, 0xfb, 0xa3, 0x4a, 0xa,\n                                                     0xe, 0xfb, 0x4b, 0xfa, 0x5, 0xaf, 0x1, 0xf8,\n                                                     0x74, 0xfa, 0x5, 0x15, 0xf8, 0xf6, 0xaf, 0xfc,\n                                                     0xf6, 0x6, 0xe, 0x3b, 0x28, 0x76, 0xfa, 0xfe,\n                                                     0x49, 0xa, 0xf7, 0xac, 0xfb, 0xc, 0x15, 0xc3,\n                                                     0xfa, 0xfe, 0x53, 0x6, 0xe, 0xf7, 0xd1, 0xf7,\n                                                     0x70, 0xc3, 0x1, 0x4f, 0xfa, 0xea, 0x3, 0x4f,\n                                                     0xf7, 0x70, 0x15, 0xfa, 0xea, 0xc3, 0xfe, 0xea,\n                                                     0x6, 0xe, 0xf6, 0x77, 0xb3, 0xf7, 0xb4, 0xb6,\n                                                     0xf7, 0x17, 0xb6, 0xf4, 0xb3, 0x1, 0xbd, 0xb3,\n                                                     0xf7, 0x44, 0xbc, 0xf7, 0x54, 0xb9, 0xf7, 0x27,\n                                                     0xb3, 0x3, 0xbd, 0xf7, 0xd9, 0x4f, 0xa, 0x1e,\n                                                     0xf7, 0x52, 0x8c, 0xf7, 0x2f, 0xf7, 0x2d, 0xf7,\n                                                     0x53, 0x1a, 0x48, 0xa, 0xfb, 0x2e, 0xfb, 0x2f,\n                                                     0xfb, 0x52, 0x2c, 0xa, 0xfb, 0x3d, 0xfb, 0x1c,\n                                                     0xf7, 0x1c, 0xf7, 0x3c, 0x1e, 0xf7, 0x44, 0xfb,\n                                                     0x50, 0x15, 0xbc, 0xf7, 0x40, 0xf7, 0x11, 0x6,\n                                                     0xd2, 0x82, 0x3c, 0x67, 0x8c, 0x1f, 0x8c, 0x6f,\n                                                     0x93, 0x89, 0x94, 0x79, 0x8, 0x9e, 0xa1, 0x8b,\n                                                     0x9e, 0x1b, 0x73, 0xa7, 0x87, 0xa3, 0xb0, 0x1a,\n                                                     0xbe, 0x7c, 0xa6, 0x6c, 0xa0, 0x1e, 0xb0, 0xa7,\n                                                     0x98, 0x9d, 0xbc, 0x1a, 0xe1, 0x4d, 0x96, 0x50,\n                                                     0x1e, 0xfb, 0x3e, 0x6, 0xbc, 0xfb, 0x42, 0x15,\n                                                     0xf7, 0x17, 0xf7, 0xe, 0x7, 0xa9, 0xb3, 0x83,\n                                                     0x4a, 0x5a, 0x66, 0x82, 0x6a, 0x1f, 0xe, 0xf6,\n                                                     0x7c, 0xb3, 0xef, 0xb9, 0xf7, 0xcc, 0xb6, 0xf7,\n                                                     0x1, 0xb3, 0x1, 0xbc, 0xb3, 0xf7, 0x1e, 0xbc,\n                                                     0xf7, 0x80, 0xb8, 0xf7, 0x22, 0xb3, 0x3, 0xf8,\n                                                     0x94, 0xf7, 0xa6, 0x15, 0x52, 0x59, 0x5d, 0x52,\n                                                     0x35, 0x60, 0xe5, 0xd6, 0xdd, 0xb7, 0xcc, 0xd8,\n                                                     0xce, 0xb3, 0x6f, 0x58, 0x8d, 0x1e, 0xbe, 0x6,\n                                                     0xe5, 0x89, 0x44, 0xab, 0x33, 0x1b, 0xfb, 0x0,\n                                                     0x4e, 0x33, 0x23, 0xfb, 0x4, 0xcd, 0x2a, 0xf7,\n                                                     0x4, 0xf7, 0x0, 0xb9, 0xe7, 0xc4, 0x1f, 0xfc,\n                                                     0x92, 0xc3, 0x23, 0xa, 0xf2, 0xf7, 0xce, 0x76,\n                                                     0xf7, 0xe5, 0xb6, 0x1, 0xf7, 0x16, 0xbc, 0xf7,\n                                                     0x50, 0xbc, 0xf7, 0x98, 0xbc, 0x3, 0xf7, 0x16,\n                                                     0xf7, 0xb9, 0x15, 0xbc, 0xf7, 0xe5, 0xf7, 0x11,\n                                                     0xb6, 0xfb, 0xbf, 0x60, 0xf7, 0x11, 0x6, 0xf7,\n                                                     0x81, 0xfb, 0xe5, 0x15, 0xbc, 0xf7, 0xc9, 0x6,\n                                                     0xf4, 0xfb, 0xc4, 0x5, 0xbd, 0x6, 0xf4, 0xf7,\n                                                     0xc4, 0x5, 0xfb, 0xc9, 0xbc, 0xf8, 0x10, 0x44,\n                                                     0x7, 0xfb, 0x0, 0xfb, 0xd2, 0xfb, 0x0, 0xf7,\n                                                     0xd2, 0x5, 0x44, 0x6, 0xe, 0xfb, 0xbf, 0xfb,\n                                                     0xb9, 0x1c, 0x4, 0xb9, 0x1, 0xa3, 0xdf, 0x3,\n                                                     0xa3, 0xfb, 0xb9, 0x15, 0xdf, 0xf8, 0x2e, 0x6,\n                                                     0xf7, 0xf3, 0xf5, 0xf7, 0xc9, 0xf7, 0x72, 0xf7,\n                                                     0x1f, 0x1e, 0x7e, 0x95, 0x5, 0xfb, 0x57, 0x2a,\n                                                     0xfb, 0x60, 0xfb, 0x62, 0xfc, 0x8e, 0x1a, 0xe,\n                                                     0xfb, 0xbf, 0xfa, 0x31, 0x8b, 0x1, 0xa3, 0xdf,\n                                                     0x3, 0xa3, 0x54, 0xa, 0x3f, 0xa, 0xa3, 0xdf,\n                                                     0x3, 0xf8, 0x41, 0xfb, 0xb9, 0x15, 0x92, 0x95,\n                                                     0x5, 0xfb, 0x72, 0xf7, 0x29, 0x21, 0xf7, 0xbf,\n                                                     0xf7, 0xf3, 0x1a, 0xf8, 0x2e, 0x37, 0xfc, 0x2e,\n                                                     0x7, 0xfc, 0x8e, 0xf7, 0x65, 0xfb, 0x58, 0xf7,\n                                                     0x57, 0x20, 0x1e, 0xe, 0xfb, 0xbf, 0xfa, 0x9,\n                                                     0xb4, 0x1, 0x8b, 0xd8, 0x3, 0x3b, 0x4, 0xd8,\n                                                     0xf9, 0xd2, 0x6, 0xf7, 0x11, 0x9b, 0x95, 0xf7,\n                                                     0x11, 0x1e, 0xf7, 0x17, 0xb4, 0xfb, 0xf1, 0x6,\n                                                     0xe, 0xfb, 0xbf, 0x3c, 0xfa, 0x80, 0x1, 0x8b,\n                                                     0xd8, 0x3, 0x3c, 0x4, 0xd8, 0xfa, 0x80, 0x3e,\n                                                     0x6, 0xe, 0xfb, 0xbf, 0x3b, 0xb4, 0x1, 0x8b,\n                                                     0xd8, 0x3, 0x3b, 0x4, 0xf7, 0xe8, 0xb4, 0xfb,\n                                                     0xe, 0x6, 0xfb, 0x11, 0x7b, 0x95, 0xf7, 0x11,\n                                                     0x1f, 0xf9, 0xd2, 0x3e, 0x7, 0xe, 0xfb, 0x51,\n                                                     0xfa, 0x13, 0xa9, 0x35, 0xa, 0xf7, 0xb0, 0x36,\n                                                     0x15, 0xf9, 0xc8, 0x7, 0xf7, 0x2, 0x91, 0xbd,\n                                                     0xdb, 0x1e, 0xd6, 0xa9, 0x40, 0x6, 0xfb, 0x2,\n                                                     0x58, 0x6e, 0xfb, 0x35, 0x1f, 0xfd, 0xc8, 0x7,\n                                                     0xe, 0x2d, 0xa, 0xf7, 0x7f, 0x6, 0xf7, 0x2d,\n                                                     0x4c, 0xde, 0xfb, 0x1c, 0xb2, 0x1e, 0xf7, 0x1c,\n                                                     0xb2, 0xca, 0xde, 0xf7, 0x2d, 0x1a, 0xf7, 0x7f,\n                                                     0x40, 0xfb, 0x7f, 0x7, 0x27, 0x67, 0xfb, 0x7,\n                                                     0xfb, 0x2d, 0x5e, 0x1e, 0x6d, 0x7, 0xf7, 0x2d,\n                                                     0x5e, 0xaf, 0xfb, 0x7, 0x27, 0x1a, 0xe, 0x53,\n                                                     0xa, 0xf7, 0x65, 0xfa, 0x3b, 0x15, 0xfd, 0xcc,\n                                                     0x7, 0xfb, 0x35, 0xb4, 0x72, 0xf7, 0x2, 0x1e,\n                                                     0xe0, 0xa9, 0x36, 0x6, 0x3b, 0x8f, 0xb9, 0xf7,\n                                                     0x2, 0x1f, 0xf9, 0xcc, 0x7, 0xe, 0x2d, 0xa,\n                                                     0xfa, 0x90, 0x40, 0x6, 0xe, 0x8e, 0x33, 0xfa,\n                                                     0xbb, 0x1, 0xf7, 0xc8, 0xd1, 0x3, 0xf7, 0xc8,\n                                                     0x33, 0x15, 0xd1, 0xfa, 0xbb, 0x45, 0x6, 0xe,\n                                                     0x3f, 0xa, 0xf8, 0x12, 0xdf, 0x3, 0xf8, 0x12,\n                                                     0xfb, 0xb9, 0x15, 0xdf, 0xf8, 0x38, 0x6, 0xf8,\n                                                     0x8e, 0xfb, 0x60, 0xf7, 0x58, 0xfb, 0x57, 0xec,\n                                                     0x1e, 0x7e, 0x81, 0x5, 0xf7, 0x72, 0xfb, 0x1f,\n                                                     0xf5, 0xfb, 0xbf, 0xfb, 0xf3, 0x1a, 0xe, 0xfb,\n                                                     0xbf, 0x36, 0xfa, 0x86, 0x1, 0xf8, 0x12, 0xdf,\n                                                     0x3, 0xf8, 0x12, 0x54, 0xa, 0x3f, 0xa, 0xf8,\n                                                     0x12, 0xdf, 0x3, 0xc1, 0xfb, 0xaf, 0x15, 0x98,\n                                                     0x81, 0x5, 0xf7, 0x57, 0xec, 0xf7, 0x60, 0xf7,\n                                                     0x5d, 0xf8, 0x8e, 0x1a, 0xf8, 0x33, 0x37, 0xfc,\n                                                     0x33, 0x7, 0xfb, 0xf3, 0x21, 0xfb, 0xc4, 0xfb,\n                                                     0x72, 0xfb, 0x1f, 0x1e, 0xe, 0xfb, 0xbf, 0xfa,\n                                                     0x9, 0xb4, 0x1, 0xf7, 0xb9, 0xd9, 0x3, 0xf7,\n                                                     0xb9, 0x3b, 0x15, 0xd9, 0xfa, 0x82, 0xfb, 0xf1,\n                                                     0x62, 0xf7, 0x1b, 0x6, 0xf7, 0x11, 0x96, 0x80,\n                                                     0xfb, 0x11, 0x1f, 0xe, 0xfb, 0xbf, 0x3c, 0xfa,\n                                                     0x80, 0x1, 0xf7, 0xba, 0xd8, 0x3, 0xf7, 0xba,\n                                                     0x3c, 0x15, 0xd8, 0xfa, 0x80, 0x3e, 0x6, 0xe,\n                                                     0xfb, 0xbf, 0x3b, 0xb4, 0x1, 0xf7, 0xba, 0xd8,\n                                                     0x3, 0xa1, 0x64, 0x15, 0x62, 0xf7, 0xf1, 0xfa,\n                                                     0x82, 0x3e, 0xfd, 0xcf, 0x7, 0xfb, 0x13, 0x79,\n                                                     0x80, 0xfb, 0x11, 0x1e, 0xe, 0xfb, 0x51, 0xfa,\n                                                     0x13, 0xa9, 0x2e, 0xa, 0xf9, 0xc8, 0x6, 0xf7,\n                                                     0x2c, 0x74, 0xb1, 0xfb, 0x19, 0x1e, 0x3b, 0x6d,\n                                                     0xdb, 0x6, 0xd1, 0x96, 0x5f, 0xfb, 0x8, 0x1f,\n                                                     0xe, 0x2d, 0xa, 0xf7, 0x80, 0x6, 0xef, 0xaf,\n                                                     0xf7, 0x6, 0xf7, 0x2d, 0xb8, 0x1e, 0xa9, 0x7,\n                                                     0xfb, 0x2d, 0xb8, 0x67, 0xf7, 0x6, 0xef, 0x1a,\n                                                     0xf7, 0x80, 0x40, 0xfb, 0x80, 0x7, 0xfb, 0x2d,\n                                                     0xca, 0x39, 0xf7, 0x1c, 0x64, 0x1e, 0xfb, 0x1c,\n                                                     0x64, 0x4c, 0x39, 0xfb, 0x2d, 0x1a, 0xe, 0x53,\n                                                     0xa, 0xbb, 0x5e, 0x15, 0x6d, 0xdb, 0x7, 0xf7,\n                                                     0x16, 0xa5, 0xb3, 0xf7, 0x2b, 0x1f, 0xf9, 0xc7,\n                                                     0x40, 0xfd, 0xc7, 0x7, 0xfb, 0x16, 0x80, 0x6c,\n                                                     0x45, 0x1e, 0xe, 0xf6, 0x9d, 0x76, 0xf8, 0xff,\n                                                     0xf7, 0x54, 0x1, 0xf9, 0x71, 0xf7, 0x69, 0x15,\n                                                     0x3f, 0xa0, 0x65, 0xd3, 0xd4, 0x1a, 0xce, 0xa9,\n                                                     0xcd, 0xca, 0xa9, 0x1e, 0xbf, 0x6e, 0x41, 0xa4,\n                                                     0x52, 0x1b, 0x6e, 0x76, 0x84, 0x83, 0x76, 0x1f,\n                                                     0x83, 0x76, 0x75, 0x83, 0x6e, 0x1b, 0x72, 0x75,\n                                                     0x93, 0x93, 0x76, 0x1f, 0x94, 0x74, 0x75, 0x94,\n                                                     0x70, 0x1b, 0xfb, 0x3, 0x25, 0x2b, 0xfb, 0x21,\n                                                     0xfb, 0x1a, 0xd2, 0xfb, 0x92, 0xf7, 0x37, 0xa5,\n                                                     0x9e, 0x96, 0x94, 0xa0, 0x1f, 0x92, 0x9b, 0x9b,\n                                                     0x91, 0xa0, 0x1b, 0xa1, 0x9b, 0x85, 0x85, 0x9a,\n                                                     0x1f, 0x82, 0xa1, 0x9d, 0x7f, 0xa7, 0x1b, 0xe1,\n                                                     0xb5, 0xe2, 0xf7, 0x15, 0xd6, 0x1f, 0xfb, 0xdb,\n                                                     0xf8, 0x27, 0x15, 0xe6, 0x88, 0xe5, 0xf0, 0x76,\n                                                     0xe9, 0x8, 0x3c, 0x35, 0x2b, 0x2b, 0x90, 0x1f,\n                                                     0xe, 0x78, 0x9e, 0xf8, 0x7b, 0x98, 0xf7, 0x41,\n                                                     0x9a, 0x6, 0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc,\n                                                     0x9, 0xe7, 0xa, 0xe0, 0xb, 0x9f, 0xd3, 0xc,\n                                                     0xc, 0xf8, 0xb9, 0x14, 0xf9, 0x3f, 0x15, 0xab,\n                                                     0x13, 0x0, 0x3a, 0x2, 0x0, 0x1, 0x0, 0x13,\n                                                     0x0, 0x2d, 0x0, 0x30, 0x0, 0x47, 0x0, 0x4f,\n                                                     0x0, 0x56, 0x0, 0x5d, 0x0, 0x61, 0x0, 0x67,\n                                                     0x0, 0x7c, 0x0, 0x82, 0x0, 0x8b, 0x0, 0xa6,\n                                                     0x0, 0xae, 0x0, 0xb4, 0x0, 0xba, 0x0, 0xc7,\n                                                     0x0, 0xce, 0x0, 0xe3, 0x0, 0xed, 0x0, 0xf6,\n                                                     0x0, 0xfc, 0x1, 0xa, 0x1, 0xe, 0x1, 0x19,\n                                                     0x1, 0x1c, 0x1, 0x23, 0x1, 0x2a, 0x1, 0x31,\n                                                     0x1, 0x40, 0x1, 0x4d, 0x1, 0x56, 0x1, 0x5f,\n                                                     0x1, 0x66, 0x1, 0x6d, 0x1, 0x72, 0x1, 0x77,\n                                                     0x1, 0x7c, 0x1, 0x88, 0x1, 0x8e, 0x1, 0x99,\n                                                     0x1, 0xa0, 0x1, 0xa7, 0x1, 0xac, 0x1, 0xb6,\n                                                     0x1, 0xc0, 0x1, 0xca, 0x1, 0xce, 0x1, 0xd8,\n                                                     0x1, 0xe2, 0x1, 0xec, 0x1, 0xf3, 0x1, 0xfb,\n                                                     0x2, 0x4, 0x2, 0x9, 0x2, 0x12, 0x2, 0x19,\n                                                     0x2, 0x1f, 0x6c, 0xa4, 0x72, 0xaa, 0xaa, 0xa4,\n                                                     0xa4, 0xaa, 0xaa, 0x72, 0xa4, 0x6c, 0x6c, 0x72,\n                                                     0x72, 0x6c, 0x1e, 0xb, 0x2b, 0xa, 0xf7, 0x53,\n                                                     0xf7, 0x2e, 0xf7, 0x2e, 0x4b, 0xa, 0xfb, 0x2e,\n                                                     0xf7, 0x2e, 0xfb, 0x53, 0xfb, 0x53, 0xfb, 0x2e,\n                                                     0xfb, 0x2e, 0xfb, 0x53, 0x1e, 0xb, 0x20, 0xa,\n                                                     0xe, 0x15, 0x21, 0xa, 0xb3, 0x16, 0xf7, 0x3c,\n                                                     0xf7, 0x1d, 0x43, 0xa, 0xf7, 0x3c, 0xf7, 0x1d,\n                                                     0x34, 0xa, 0x34, 0xa, 0x43, 0xa, 0x1e, 0xe,\n                                                     0x16, 0xf7, 0xb0, 0x9d, 0x6, 0x2a, 0xa, 0xb,\n                                                     0x2f, 0xa, 0xfc, 0x7d, 0x27, 0xa, 0xb, 0x7,\n                                                     0x3c, 0xa, 0xfc, 0x7d, 0x39, 0xa, 0x7, 0x28,\n                                                     0xa, 0xb, 0x54, 0x68, 0x78, 0x54, 0x1e, 0xb,\n                                                     0x6d, 0xa4, 0x72, 0xaa, 0x1e, 0xa9, 0x8c, 0xa5,\n                                                     0xa3, 0xaa, 0x1a, 0xa9, 0x71, 0xa5, 0x6d, 0x6c,\n                                                     0x72, 0x71, 0x6c, 0x1e, 0xb, 0x54, 0x68, 0x9e,\n                                                     0xc2, 0x1f, 0xb, 0xfb, 0x53, 0xf7, 0x2e, 0xfb,\n                                                     0x2e, 0xf7, 0x53, 0xb, 0x1e, 0xb3, 0x8a, 0x15,\n                                                     0xf7, 0x3d, 0xf7, 0x1c, 0x43, 0xa, 0xf7, 0x3d,\n                                                     0xf7, 0x1d, 0xfb, 0x1d, 0xfb, 0x3c, 0xfb, 0x3d,\n                                                     0xfb, 0x1d, 0xfb, 0x1c, 0xfb, 0x3c, 0xb, 0xfb,\n                                                     0x51, 0x36, 0xfa, 0x90, 0x2e, 0xa, 0xb, 0x44,\n                                                     0xa, 0x36, 0x15, 0xd6, 0xb, 0xc2, 0xae, 0x78,\n                                                     0x54, 0x1f, 0xb, 0xf7, 0x17, 0xf7, 0x35, 0xf7,\n                                                     0x35, 0xf7, 0x17, 0x56, 0xa, 0x41, 0xa, 0xb,\n                                                     0xc2, 0xae, 0x9e, 0xc2, 0x1e, 0x9d, 0xb, 0x82,\n                                                     0xb9, 0x1b, 0xc5, 0xc7, 0xb4, 0xa8, 0x9a, 0x1f,\n                                                     0x68, 0xac, 0x5, 0x7c, 0x7d, 0x72, 0x66, 0x53,\n                                                     0x1b, 0x62, 0x66, 0xb, 0x1e, 0xfb, 0xa9, 0x79,\n                                                     0x6, 0x25, 0xa, 0xf7, 0x56, 0xb, 0xfb, 0x1d,\n                                                     0xfb, 0x3c, 0xfb, 0x3c, 0xfb, 0x1d, 0xb, 0x1,\n                                                     0xf7, 0x65, 0xd6, 0x3, 0xb, 0xf7, 0x5c, 0x40,\n                                                     0xa, 0x6f, 0xa1, 0x6c, 0x7b, 0x7b, 0x85, 0x81,\n                                                     0x87, 0x1e, 0xb, 0x15, 0x20, 0xa, 0xb, 0x88,\n                                                     0x85, 0x8b, 0x89, 0x8a, 0x1a, 0x7c, 0x9a, 0x85,\n                                                     0x96, 0xb, 0x27, 0xa, 0xe, 0xf8, 0xa2, 0xc2,\n                                                     0xfc, 0xa2, 0x6, 0xb, 0xa0, 0x76, 0xf9, 0x35,\n                                                     0x77, 0x1, 0xb, 0x31, 0xa, 0xfb, 0xb0, 0x45,\n                                                     0xa, 0xb, 0x8b, 0xc2, 0xf8, 0xdc, 0x77, 0x1,\n                                                     0xa8, 0x16, 0xf8, 0x85, 0xc2, 0xfc, 0x85, 0x6,\n                                                     0xb, 0xf8, 0x45, 0xf7, 0x5b, 0x5, 0xc9, 0x7,\n                                                     0xfc, 0x85, 0xfb, 0x7a, 0x5, 0xe, 0xfb, 0xbf,\n                                                     0xfb, 0xb9, 0x1c, 0x4, 0xc3, 0x1, 0xb, 0x5,\n                                                     0x8f, 0x8f, 0x8d, 0x95, 0x91, 0x1a, 0xa8, 0xb,\n                                                     0xfb, 0x17, 0xfb, 0x35, 0xfb, 0x35, 0xb, 0xf8,\n                                                     0xa0, 0xc2, 0xfc, 0xa0, 0x6, 0xb, 0xf7, 0x1d,\n                                                     0xf7, 0x3c, 0xb, 0x35, 0xa, 0xf7, 0x65, 0xb,\n                                                     0x79, 0x7, 0x2f, 0xa, 0xb, 0xf7, 0xc4, 0x91,\n                                                     0x76, 0xf7, 0x7f, 0xc3, 0xf7, 0x7f, 0x77, 0x1,\n                                                     0xb, 0xc2, 0xf7, 0xfc, 0xc2, 0x1, 0xb, 0xf7,\n                                                     0x52, 0xfb, 0x2f, 0xf7, 0x2f, 0xfb, 0x52, 0xfb,\n                                                     0x53, 0xb, 0x77, 0x1, 0xf7, 0xac, 0xc3, 0x3,\n                                                     0xb, 0x7, 0x74, 0x77, 0x7c, 0x6c, 0x1e, 0xb,\n                                                     0xf7, 0x53, 0xf7, 0x53, 0xb, 0xfb, 0xf6, 0xfb,\n                                                     0x45, 0x76, 0xfa, 0x44, 0x77, 0x1, 0xb, 0xfb,\n                                                     0x5f, 0xfb, 0x4b, 0xa4, 0xf9, 0xba, 0xa4, 0x1,\n                                                     0xb, 0xfb, 0xf2, 0xfb, 0x2f, 0xa4, 0xf9, 0x9f,\n                                                     0xa4, 0x1, 0xb, 0x15, 0x2b, 0xa, 0xb, 0xfb,\n                                                     0xf2, 0xfb, 0x3e, 0x76, 0xf9, 0xf4, 0x77, 0x1,\n                                                     0xb, 0xc9, 0x7, 0xfc, 0x85, 0xf7, 0x7a, 0x5,\n                                                     0x4d, 0x7, 0xb, 0x67, 0xa8, 0x6e, 0xaf, 0xaf,\n                                                     0xa7, 0xa8, 0xaf, 0xaf, 0xb, 0xfb, 0x51, 0x40,\n                                                     0xa9, 0x35, 0xa, 0xb, 0x36, 0x15, 0xdf, 0xfa,\n                                                     0x86, 0x37, 0x6, 0xe, 0x1, 0xb3, 0xc2, 0xf8,\n                                                     0xda, 0xc2, 0x3, 0xb3, 0xb, 0x41, 0xa, 0xfb,\n                                                     0x17, 0xb, 0x15, 0xa9, 0xa6, 0xaa, 0x9f, 0xb8,\n                                                     0x1b, 0xaa, 0xb, 0x8a, 0x1f, 0xfc, 0x29, 0x54,\n                                                     0x6, 0xe, 0x90, 0x90, 0x8f, 0x8e, 0x8d, 0xb\n                                                    };\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/foxitnames.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_FREETYPE_DONT_RENAME_\n\n#ifdef _MSC_VER\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n\n// To avoid any possible linking confliction, we rename all FreeType exported names\n\n#define FT_Init_FreeType FPDFAPI_FT_Init_FreeType\n#define FT_Done_FreeType FPDFAPI_FT_Done_FreeType\n#define FT_New_Face\t\tFPDFAPI_FT_New_Face\n#define FT_Select_Charmap FPDFAPI_FT_Select_Charmap \n#define FT_Done_Face FPDFAPI_FT_Done_Face \n#define FT_Get_Charmap_Index FPDFAPI_FT_Get_Charmap_Index \n#define FT_New_Memory_Face FPDFAPI_FT_New_Memory_Face \n#define FT_MulDiv FPDFAPI_FT_MulDiv \n#define FT_Vector_Transform FPDFAPI_FT_Vector_Transform \n#define FT_Cos FPDFAPI_FT_Cos \n#define FT_Sin FPDFAPI_FT_Sin \n#define FT_Load_Glyph FPDFAPI_FT_Load_Glyph \n#define FT_DivFix FPDFAPI_FT_DivFix \n#define FT_Realloc FPDFAPI_FT_Realloc \n#define FT_Alloc FPDFAPI_FT_Alloc \n#define FT_Get_Char_Index FPDFAPI_FT_Get_Char_Index \n#define FT_GlyphLoader_CheckPoints FPDFAPI_FT_GlyphLoader_CheckPoints \n#define FT_GlyphLoader_Add FPDFAPI_FT_GlyphLoader_Add \n#define FT_GlyphLoader_CheckSubGlyphs FPDFAPI_FT_GlyphLoader_CheckSubGlyphs \n#define FT_Outline_Translate FPDFAPI_FT_Outline_Translate \n#define FT_Outline_Transform FPDFAPI_FT_Outline_Transform \n#define FT_Outline_Get_CBox FPDFAPI_FT_Outline_Get_CBox \n#define FT_GlyphLoader_Rewind FPDFAPI_FT_GlyphLoader_Rewind \n#define FT_GlyphLoader_CopyPoints FPDFAPI_FT_GlyphLoader_CopyPoints \n#define FT_GlyphLoader_New FPDFAPI_FT_GlyphLoader_New \n#define FT_GlyphLoader_CreateExtra FPDFAPI_FT_GlyphLoader_CreateExtra \n#define FT_Free FPDFAPI_FT_Free \n#define FT_Set_Charmap FPDFAPI_FT_Set_Charmap \n#define FT_GlyphLoader_Done FPDFAPI_FT_GlyphLoader_Done \n#define _debug_mem_dummy FPDFAPI__debug_mem_dummy \n#define _debug_mem_dummy FPDFAPI__debug_mem_dummy \n#define FT_QAlloc FPDFAPI_FT_QAlloc \n#define FT_QRealloc FPDFAPI_FT_QRealloc \n#define FT_List_Find FPDFAPI_FT_List_Find \n#define FT_List_Add FPDFAPI_FT_List_Add \n#define FT_List_Insert FPDFAPI_FT_List_Insert \n#define FT_List_Remove FPDFAPI_FT_List_Remove \n#define FT_List_Up FPDFAPI_FT_List_Up \n#define FT_List_Iterate FPDFAPI_FT_List_Iterate \n#define FT_List_Finalize FPDFAPI_FT_List_Finalize \n#define ft_highpow2 FPDFAPI_ft_highpow2 \n#define FT_Stream_OpenMemory FPDFAPI_FT_Stream_OpenMemory \n#define FT_Stream_Close FPDFAPI_FT_Stream_Close \n#define FT_Stream_Seek FPDFAPI_FT_Stream_Seek \n#define FT_Stream_Skip FPDFAPI_FT_Stream_Skip \n#define FT_Stream_Pos FPDFAPI_FT_Stream_Pos \n#define FT_Stream_ReadAt FPDFAPI_FT_Stream_ReadAt \n#define FT_Stream_Read FPDFAPI_FT_Stream_Read \n#define FT_Stream_TryRead FPDFAPI_FT_Stream_TryRead \n#define FT_Stream_EnterFrame FPDFAPI_FT_Stream_EnterFrame \n#define FT_Stream_ExtractFrame FPDFAPI_FT_Stream_ExtractFrame \n#define FT_Stream_ReleaseFrame FPDFAPI_FT_Stream_ReleaseFrame \n#define FT_Stream_ExitFrame FPDFAPI_FT_Stream_ExitFrame \n#define FT_Stream_GetChar FPDFAPI_FT_Stream_GetChar \n#define FT_Stream_GetShort FPDFAPI_FT_Stream_GetShort \n#define FT_Stream_GetShortLE FPDFAPI_FT_Stream_GetShortLE \n#define FT_Stream_GetOffset FPDFAPI_FT_Stream_GetOffset \n#define FT_Stream_GetLong FPDFAPI_FT_Stream_GetLong \n#define FT_Stream_GetLongLE FPDFAPI_FT_Stream_GetLongLE \n#define FT_Stream_ReadChar FPDFAPI_FT_Stream_ReadChar \n#define FT_Stream_ReadShort FPDFAPI_FT_Stream_ReadShort \n#define FT_Stream_ReadShortLE FPDFAPI_FT_Stream_ReadShortLE \n#define FT_Stream_ReadOffset FPDFAPI_FT_Stream_ReadOffset \n#define FT_Stream_ReadLong FPDFAPI_FT_Stream_ReadLong \n#define FT_Stream_ReadLongLE FPDFAPI_FT_Stream_ReadLongLE \n#define FT_Stream_ReadFields FPDFAPI_FT_Stream_ReadFields \n#define FT_RoundFix FPDFAPI_FT_RoundFix \n#define FT_CeilFix FPDFAPI_FT_CeilFix \n#define FT_FloorFix FPDFAPI_FT_FloorFix \n#define FT_Sqrt32 FPDFAPI_FT_Sqrt32 \n#define FT_SqrtFixed FPDFAPI_FT_SqrtFixed \n#define FT_Tan FPDFAPI_FT_Tan \n#define FT_Atan2 FPDFAPI_FT_Atan2 \n#define FT_Vector_Unit FPDFAPI_FT_Vector_Unit \n#define FT_Vector_Rotate FPDFAPI_FT_Vector_Rotate \n#define FT_Vector_Length FPDFAPI_FT_Vector_Length \n#define FT_Vector_Polarize FPDFAPI_FT_Vector_Polarize \n#define FT_Vector_From_Polar FPDFAPI_FT_Vector_From_Polar \n#define FT_Angle_Diff FPDFAPI_FT_Angle_Diff \n#define FT_Outline_Decompose FPDFAPI_FT_Outline_Decompose \n#define FT_Outline_Done_Internal FPDFAPI_FT_Outline_Done_Internal \n#define FT_Outline_New_Internal FPDFAPI_FT_Outline_New_Internal \n#define FT_Outline_New FPDFAPI_FT_Outline_New \n#define FT_Outline_Check FPDFAPI_FT_Outline_Check \n#define FT_Outline_Copy FPDFAPI_FT_Outline_Copy \n#define FT_Outline_Done FPDFAPI_FT_Outline_Done \n#define FT_Outline_Reverse FPDFAPI_FT_Outline_Reverse \n#define FT_Set_Renderer FPDFAPI_FT_Set_Renderer \n#define FT_Lookup_Renderer FPDFAPI_FT_Lookup_Renderer \n#define FT_Outline_Render FPDFAPI_FT_Outline_Render \n#define FT_Outline_Get_Bitmap FPDFAPI_FT_Outline_Get_Bitmap \n#define FT_Outline_Get_Orientation FPDFAPI_FT_Outline_Get_Orientation \n#define FT_Outline_Embolden FPDFAPI_FT_Outline_Embolden \n#define FT_GlyphLoader_Reset FPDFAPI_FT_GlyphLoader_Reset \n#define FT_GlyphLoader_Prepare FPDFAPI_FT_GlyphLoader_Prepare \n#define ft_service_list_lookup FPDFAPI_ft_service_list_lookup \n#define ft_validator_init FPDFAPI_ft_validator_init \n#define ft_validator_run FPDFAPI_ft_validator_run \n#define ft_validator_error FPDFAPI_ft_validator_error \n#define FT_Stream_New FPDFAPI_FT_Stream_New \n#define FT_Stream_Free FPDFAPI_FT_Stream_Free \n#define ft_glyphslot_free_bitmap FPDFAPI_ft_glyphslot_free_bitmap \n#define ft_glyphslot_set_bitmap FPDFAPI_ft_glyphslot_set_bitmap \n#define FT_GlyphSlot_Own_Bitmap FPDFAPI_FT_GlyphSlot_Own_Bitmap\n#define ft_glyphslot_alloc_bitmap FPDFAPI_ft_glyphslot_alloc_bitmap \n#define FT_New_GlyphSlot FPDFAPI_FT_New_GlyphSlot \n#define FT_Done_GlyphSlot FPDFAPI_FT_Done_GlyphSlot \n#define FT_Set_Transform FPDFAPI_FT_Set_Transform \n#define FT_Render_Glyph_Internal FPDFAPI_FT_Render_Glyph_Internal \n#define FT_Render_Glyph FPDFAPI_FT_Render_Glyph \n#define FT_Load_Char FPDFAPI_FT_Load_Char \n#define FT_New_Size FPDFAPI_FT_New_Size \n#define FT_Open_Face FPDFAPI_FT_Open_Face \n#define FT_Attach_Stream FPDFAPI_FT_Attach_Stream \n#define FT_Attach_File FPDFAPI_FT_Attach_File \n#define FT_Done_Size FPDFAPI_FT_Done_Size \n#define FT_Set_Char_Size FPDFAPI_FT_Set_Char_Size \n#define FT_Set_Pixel_Sizes FPDFAPI_FT_Set_Pixel_Sizes \n#define FT_Get_Kerning FPDFAPI_FT_Get_Kerning \n#define FT_CMap_Done FPDFAPI_FT_CMap_Done \n#define FT_CMap_New FPDFAPI_FT_CMap_New \n#define FT_Get_Next_Char FPDFAPI_FT_Get_Next_Char \n#define FT_Get_First_Char FPDFAPI_FT_Get_First_Char \n#define FT_Get_Name_Index FPDFAPI_FT_Get_Name_Index \n#define FT_Get_Glyph_Name FPDFAPI_FT_Get_Glyph_Name \n#define FT_Get_Postscript_Name FPDFAPI_FT_Get_Postscript_Name \n#define FT_Get_Sfnt_Table FPDFAPI_FT_Get_Sfnt_Table \n#define FT_Load_Sfnt_Table FPDFAPI_FT_Load_Sfnt_Table \n#define FT_Sfnt_Table_Info FPDFAPI_FT_Sfnt_Table_Info \n#define FT_Get_CMap_Language_ID FPDFAPI_FT_Get_CMap_Language_ID \n#define FT_Activate_Size FPDFAPI_FT_Activate_Size \n#define FT_Get_Renderer FPDFAPI_FT_Get_Renderer \n#define FT_Remove_Module FPDFAPI_FT_Remove_Module \n#define FT_Add_Module FPDFAPI_FT_Add_Module \n#define FT_Get_Module FPDFAPI_FT_Get_Module \n#define FT_Get_Module_Interface FPDFAPI_FT_Get_Module_Interface \n#define ft_module_get_service FPDFAPI_ft_module_get_service \n#define FT_New_Library FPDFAPI_FT_New_Library \n#define FT_Library_Version FPDFAPI_FT_Library_Version \n#define FT_Done_Library FPDFAPI_FT_Done_Library \n#define FT_Set_Debug_Hook FPDFAPI_FT_Set_Debug_Hook \n#define FT_Raccess_Get_HeaderInfo FPDFAPI_FT_Raccess_Get_HeaderInfo \n#define FT_Raccess_Get_DataOffsets FPDFAPI_FT_Raccess_Get_DataOffsets \n#define FT_Raccess_Guess FPDFAPI_FT_Raccess_Guess\n#define af_dummy_script_class FPDFAPI_af_dummy_script_class\n#define af_latin_script_class FPDFAPI_af_latin_script_class\n#define af_cjk_script_class FPDFAPI_af_cjk_script_class\n#define af_autofitter_service FPDFAPI_af_autofitter_service\n#define autofit_module_class FPDFAPI_autofit_module_class\n#define cff_cmap_encoding_class_rec FPDFAPI_cff_cmap_encoding_class_rec\n#define cff_cmap_unicode_class_rec FPDFAPI_cff_cmap_unicode_class_rec\n#define cff_driver_class FPDFAPI_cff_driver_class\n#define FT_Stream_Open FPDFAPI_FT_Stream_Open\n#define FT_New_Memory FPDFAPI_FT_New_Memory\n#define FT_Done_Memory FPDFAPI_FT_Done_Memory\n#define ft_mem_qalloc FPDFAPI_ft_mem_qalloc\n#define ft_mem_alloc FPDFAPI_ft_mem_alloc\n#define ft_mem_free FPDFAPI_ft_mem_free\n#define ft_mem_qrealloc FPDFAPI_ft_mem_qrealloc\n#define ft_mem_realloc FPDFAPI_ft_mem_realloc\n#define FT_Get_TrueType_Engine_Type FPDFAPI_FT_Get_TrueType_Engine_Type\n#define ft_stub_set_char_sizes FPDFAPI_ft_stub_set_char_sizes\n#define ft_stub_set_pixel_sizes FPDFAPI_ft_stub_set_pixel_sizes\n#define FT_Get_SubGlyph_Info FPDFAPI_FT_Get_SubGlyph_Info\n#define FT_Get_Sfnt_Name_Count FPDFAPI_FT_Get_Sfnt_Name_Count\n#define FT_Get_Sfnt_Name FPDFAPI_FT_Get_Sfnt_Name\n#define FT_Bitmap_New FPDFAPI_FT_Bitmap_New\n#define FT_Bitmap_Copy FPDFAPI_FT_Bitmap_Copy\n#define FT_Bitmap_Done FPDFAPI_FT_Bitmap_Done\n#define FT_Bitmap_Convert FPDFAPI_FT_Bitmap_Convert\n#define FT_Bitmap_Embolden FPDFAPI_FT_Bitmap_Embolden\n#define ft_bitmap_glyph_class FPDFAPI_ft_bitmap_glyph_class\n#define ft_outline_glyph_class FPDFAPI_ft_outline_glyph_class\n#define FT_Matrix_Multiply FPDFAPI_FT_Matrix_Multiply\n#define FT_Matrix_Invert FPDFAPI_FT_Matrix_Invert\n#define FT_Done_Glyph FPDFAPI_FT_Done_Glyph\n#define FT_Glyph_Copy FPDFAPI_FT_Glyph_Copy\n#define FT_Get_Glyph FPDFAPI_FT_Get_Glyph\n#define FT_Glyph_Transform FPDFAPI_FT_Glyph_Transform\n#define FT_Glyph_Get_CBox FPDFAPI_FT_Glyph_Get_CBox\n#define FT_Glyph_To_Bitmap FPDFAPI_FT_Glyph_To_Bitmap\n#define FT_Add_Default_Modules FPDFAPI_FT_Add_Default_Modules\n#define FT_Get_Multi_Master FPDFAPI_FT_Get_Multi_Master\n#define FT_Get_MM_Var FPDFAPI_FT_Get_MM_Var\n#define FT_Set_MM_Design_Coordinates FPDFAPI_FT_Set_MM_Design_Coordinates\n#define FT_Set_Var_Design_Coordinates FPDFAPI_FT_Set_Var_Design_Coordinates\n#define FT_Set_MM_Blend_Coordinates FPDFAPI_FT_Set_MM_Blend_Coordinates\n#define FT_Set_Var_Blend_Coordinates FPDFAPI_FT_Set_Var_Blend_Coordinates\n#define ps_table_funcs FPDFAPI_ps_table_funcs\n#define ps_parser_funcs FPDFAPI_ps_parser_funcs\n#define t1_builder_funcs FPDFAPI_t1_builder_funcs\n#define t1_decoder_funcs FPDFAPI_t1_decoder_funcs\n#define afm_parser_funcs FPDFAPI_afm_parser_funcs\n#define t1_cmap_classes FPDFAPI_t1_cmap_classes\n#define t1_cmap_standard_class_rec FPDFAPI_t1_cmap_standard_class_rec\n#define t1_cmap_expert_class_rec FPDFAPI_t1_cmap_expert_class_rec\n#define t1_cmap_custom_class_rec FPDFAPI_t1_cmap_custom_class_rec\n#define t1_cmap_unicode_class_rec FPDFAPI_t1_cmap_unicode_class_rec\n#define psaux_module_class FPDFAPI_psaux_module_class\n#define pshinter_module_class FPDFAPI_pshinter_module_class\n#define ps_hints_apply FPDFAPI_ps_hints_apply\n#define psnames_module_class FPDFAPI_psnames_module_class\n#define ft_raster1_renderer_class FPDFAPI_ft_raster1_renderer_class\n#define ft_standard_raster FPDFAPI_ft_standard_raster\n#define ft_raster5_renderer_class FPDFAPI_ft_raster5_renderer_class\n#define tt_cmap0_class_rec FPDFAPI_tt_cmap0_class_rec\n#define tt_cmap2_class_rec FPDFAPI_tt_cmap2_class_rec\n#define tt_cmap4_class_rec FPDFAPI_tt_cmap4_class_rec\n#define tt_cmap6_class_rec FPDFAPI_tt_cmap6_class_rec\n#define tt_cmap8_class_rec FPDFAPI_tt_cmap8_class_rec\n#define tt_cmap10_class_rec FPDFAPI_tt_cmap10_class_rec\n#define tt_cmap12_class_rec FPDFAPI_tt_cmap12_class_rec\n#define tt_cmap13_class_rec FPDFAPI_tt_cmap13_class_rec\n#define tt_cmap14_class_rec FPDFAPI_tt_cmap14_class_rec\n#define sfnt_module_class FPDFAPI_sfnt_module_class\n#define ft_grays_raster FPDFAPI_ft_grays_raster\n#define ft_smooth_renderer_class FPDFAPI_ft_smooth_renderer_class\n#define ft_smooth_lcd_renderer_class FPDFAPI_ft_smooth_lcd_renderer_class\n#define ft_smooth_lcdv_renderer_class FPDFAPI_ft_smooth_lcdv_renderer_class\n#define tt_default_graphics_state FPDFAPI_tt_default_graphics_state\n#define tt_driver_class FPDFAPI_tt_driver_class\n#define TT_RunIns FPDFAPI_TT_RunIns\n#define TT_New_Context FPDFAPI_TT_New_Context\n#define t1_driver_class FPDFAPI_t1_driver_class\n#define t1cid_driver_class FPDFAPI_t1cid_driver_class\n#define FT_Get_Track_Kerning FPDFAPI_FT_Get_Track_Kerning\n#define FT_Match_Size FPDFAPI_FT_Match_Size\n#define FT_MulDiv_No_Round FPDFAPI_FT_MulDiv_No_Round\n#define FT_Request_Metrics FPDFAPI_FT_Request_Metrics\n#define FT_Request_Size FPDFAPI_FT_Request_Size\n#define FT_Select_Metrics FPDFAPI_FT_Select_Metrics\n#define FT_Select_Size FPDFAPI_FT_Select_Size\n#define ft_synthesize_vertical_metrics FPDFAPI_ft_synthesize_vertical_metrics\n#define New_Profile FPDFAPI_New_Profile\n#define End_Profile FPDFAPI_End_Profile\n#define Insert_Y_Turn FPDFAPI_Insert_Y_Turn \n#define Split_Conic FPDFAPI_Split_Conic  \n#define Split_Cubic FPDFAPI_Split_Cubic\n#define Line_Up FPDFAPI_Line_Up \n#define Bezier_Up FPDFAPI_Bezier_Up \n#define Bezier_Down FPDFAPI_Bezier_Down \n#define Line_To FPDFAPI_Line_To\n#define Conic_To FPDFAPI_Conic_To \n#define Cubic_To FPDFAPI_Cubic_To\n#define Decompose_Curve FPDFAPI_Decompose_Curve\n#define Convert_Glyph FPDFAPI_Convert_Glyph \n#define Sort FPDFAPI_Sort \n#define Vertical_Sweep_Init FPDFAPI_Vertical_Sweep_Init \n#define Vertical_Sweep_Span FPDFAPI_Vertical_Sweep_Span \n#define Vertical_Sweep_Drop FPDFAPI_Vertical_Sweep_Drop \n#define Vertical_Sweep_Step FPDFAPI_Vertical_Sweep_Step \n#define Horizontal_Sweep_Init FPDFAPI_Horizontal_Sweep_Init \n#define Horizontal_Sweep_Span FPDFAPI_Horizontal_Sweep_Span \n#define Horizontal_Sweep_Drop FPDFAPI_Horizontal_Sweep_Drop \n#define Horizontal_Sweep_Step FPDFAPI_Horizontal_Sweep_Step \n#define Draw_Sweep FPDFAPI_Draw_Sweep \n#define Render_Single_Pass FPDFAPI_Render_Single_Pass \n#define Render_Glyph FPDFAPI_Render_Glyph  \n#define Finalize_Profile_Table FPDFAPI_Finalize_Profile_Table \n#define InsNew FPDFAPI_InsNew \n#define DelOld FPDFAPI_DelOld\n#define FT_MulFix FPDFAPI_FT_MulFix\n#define FT_Matrix_Multiply_Scaled FPDFAPI_FT_Matrix_Multiply_Scaled\n#define FT_Vector_Transform_Scaled FPDFAPI_FT_Vector_Transform_Scaled\n#define ft_corner_orientation FPDFAPI_ft_corner_orientation\n#define ft_corner_is_flat FPDFAPI_ft_corner_is_flat\n#define FT_Get_CMap_Format FPDFAPI_FT_Get_CMap_Format\n#define ft_mem_strcpyn FPDFAPI_ft_mem_strcpyn\n#define ft_mem_dup FPDFAPI_ft_mem_dup\n#define ft_mem_strdup FPDFAPI_ft_mem_strdup\n#define FT_Face_GetCharVariantIsDefault FPDFAPI_FT_Face_GetCharVariantIsDefault\n#define FT_Face_GetCharsOfVariant FPDFAPI_FT_Face_GetCharsOfVariant\n#define FT_Face_GetVariantsOfChar FPDFAPI_FT_Face_GetVariantsOfChar\n#define FT_Face_GetVariantSelectors FPDFAPI_FT_Face_GetVariantSelectors\n#define FT_Face_GetCharVariantIndex FPDFAPI_FT_Face_GetCharVariantIndex\n#define FT_Get_Advances FPDFAPI_FT_Get_Advances\n#define FT_Get_Advance FPDFAPI_FT_Get_Advance\n#define FT_Library_SetLcdFilter FPDFAPI_FT_Library_SetLcdFilter\n \n#endif // !_FX_FREETYPE_DONT_RENAME_\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftconfig.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftconfig.h                                                             */\n/*                                                                         */\n/*    ANSI-specific configuration file (specification only).               */\n/*                                                                         */\n/*  Copyright 1996-2004, 2006-2008, 2010-2011, 2013 by                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This header file contains a number of macro definitions that are used */\n  /* by the rest of the engine.  Most of the macros here are automatically */\n  /* determined at compile time, and you should not need to change it to   */\n  /* port FreeType, except to compile the library with a non-ANSI          */\n  /* compiler.                                                             */\n  /*                                                                       */\n  /* Note however that if some specific modifications are needed, we       */\n  /* advise you to place a modified copy in your build directory.          */\n  /*                                                                       */\n  /* The build directory is usually `freetype/builds/<system>', and        */\n  /* contains system-specific files that are always included first when    */\n  /* building the library.                                                 */\n  /*                                                                       */\n  /* This ANSI version should stay in `include/freetype/config'.           */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __FTCONFIG_H__\n#define __FTCONFIG_H__\n\n#include \"../../ft2build.h\"\n#include \"ftoption.h\"\n#include \"ftstdlib.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*               PLATFORM-SPECIFIC CONFIGURATION MACROS                  */\n  /*                                                                       */\n  /* These macros can be toggled to suit a specific system.  The current   */\n  /* ones are defaults used to compile FreeType in an ANSI C environment   */\n  /* (16bit compilers are also supported).  Copy this file to your own     */\n  /* `freetype/builds/<system>' directory, and edit it to port the engine. */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* There are systems (like the Texas Instruments 'C54x) where a `char' */\n  /* has 16 bits.  ANSI C says that sizeof(char) is always 1.  Since an  */\n  /* `int' has 16 bits also for this system, sizeof(int) gives 1 which   */\n  /* is probably unexpected.                                             */\n  /*                                                                     */\n  /* `CHAR_BIT' (defined in limits.h) gives the number of bits in a      */\n  /* `char' type.                                                        */\n\n#ifndef FT_CHAR_BIT\n#define FT_CHAR_BIT  CHAR_BIT\n#endif\n\n\n  /* The size of an `int' type.  */\n#if                                 FT_UINT_MAX == 0xFFFFUL\n#define FT_SIZEOF_INT  (16 / FT_CHAR_BIT)\n#elif                               FT_UINT_MAX == 0xFFFFFFFFUL\n#define FT_SIZEOF_INT  (32 / FT_CHAR_BIT)\n#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL\n#define FT_SIZEOF_INT  (64 / FT_CHAR_BIT)\n#else\n#error \"Unsupported size of `int' type!\"\n#endif\n\n  /* The size of a `long' type.  A five-byte `long' (as used e.g. on the */\n  /* DM642) is recognized but avoided.                                   */\n#if                                  FT_ULONG_MAX == 0xFFFFFFFFUL\n#define FT_SIZEOF_LONG  (32 / FT_CHAR_BIT)\n#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL\n#define FT_SIZEOF_LONG  (32 / FT_CHAR_BIT)\n#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL\n#define FT_SIZEOF_LONG  (64 / FT_CHAR_BIT)\n#else\n#error \"Unsupported size of `long' type!\"\n#endif\n\n\n  /* FT_UNUSED is a macro used to indicate that a given parameter is not  */\n  /* used -- this is only used to get rid of unpleasant compiler warnings */\n#ifndef FT_UNUSED\n#define FT_UNUSED( arg )  ( (arg) = (arg) )\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                     AUTOMATIC CONFIGURATION MACROS                    */\n  /*                                                                       */\n  /* These macros are computed from the ones defined above.  Don't touch   */\n  /* their definition, unless you know precisely what you are doing.  No   */\n  /* porter should need to mess with them.                                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Mac support                                                           */\n  /*                                                                       */\n  /*   This is the only necessary change, so it is defined here instead    */\n  /*   providing a new configuration file.                                 */\n  /*                                                                       */\n#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) )\n  /* no Carbon frameworks for 64bit 10.4.x */\n  /* AvailabilityMacros.h is available since Mac OS X 10.2,        */\n  /* so guess the system version by maximum errno before inclusion */\n#include <errno.h>\n#ifdef ECANCELED /* defined since 10.2 */\n#include \"AvailabilityMacros.h\"\n#endif\n#if defined( __LP64__ ) && \\\n    ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 )\n#undef FT_MACINTOSH\n#endif\n\n#elif defined( __SC__ ) || defined( __MRC__ )\n  /* Classic MacOS compilers */\n#include \"ConditionalMacros.h\"\n#if TARGET_OS_MAC\n#define FT_MACINTOSH 1\n#endif\n\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    basic_types                                                        */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Int16                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for a 16bit signed integer type.                         */\n  /*                                                                       */\n  typedef signed short  FT_Int16;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_UInt16                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for a 16bit unsigned integer type.                       */\n  /*                                                                       */\n  typedef unsigned short  FT_UInt16;\n\n  /* */\n\n\n  /* this #if 0 ... #endif clause is for documentation purposes */\n#if 0\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Int32                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for a 32bit signed integer type.  The size depends on    */\n  /*    the configuration.                                                 */\n  /*                                                                       */\n  typedef signed XXX  FT_Int32;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_UInt32                                                          */\n  /*                                                                       */\n  /*    A typedef for a 32bit unsigned integer type.  The size depends on  */\n  /*    the configuration.                                                 */\n  /*                                                                       */\n  typedef unsigned XXX  FT_UInt32;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Int64                                                           */\n  /*                                                                       */\n  /*    A typedef for a 64bit signed integer type.  The size depends on    */\n  /*    the configuration.  Only defined if there is real 64bit support;   */\n  /*    otherwise, it gets emulated with a structure (if necessary).       */\n  /*                                                                       */\n  typedef signed XXX  FT_Int64;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_UInt64                                                          */\n  /*                                                                       */\n  /*    A typedef for a 64bit unsigned integer type.  The size depends on  */\n  /*    the configuration.  Only defined if there is real 64bit support;   */\n  /*    otherwise, it gets emulated with a structure (if necessary).       */\n  /*                                                                       */\n  typedef unsigned XXX  FT_UInt64;\n\n  /* */\n\n#endif\n\n#if FT_SIZEOF_INT == (32 / FT_CHAR_BIT)\n\n  typedef signed int      FT_Int32;\n  typedef unsigned int    FT_UInt32;\n\n#elif FT_SIZEOF_LONG == (32 / FT_CHAR_BIT)\n\n  typedef signed long     FT_Int32;\n  typedef unsigned long   FT_UInt32;\n\n#else\n#error \"no 32bit type found -- please check your configuration files\"\n#endif\n\n\n  /* look up an integer type that is at least 32 bits */\n#if FT_SIZEOF_INT >= (32 / FT_CHAR_BIT)\n\n  typedef int            FT_Fast;\n  typedef unsigned int   FT_UFast;\n\n#elif FT_SIZEOF_LONG >= (32 / FT_CHAR_BIT)\n\n  typedef long           FT_Fast;\n  typedef unsigned long  FT_UFast;\n\n#endif\n\n\n  /* determine whether we have a 64-bit int type for platforms without */\n  /* Autoconf                                                          */\n#if FT_SIZEOF_LONG == (64 / FT_CHAR_BIT)\n\n  /* FT_LONG64 must be defined if a 64-bit type is available */\n#define FT_LONG64\n#define FT_INT64   long\n#define FT_UINT64  unsigned long\n\n#elif defined( _MSC_VER ) && _MSC_VER >= 900  /* Visual C++ (and Intel C++) */\n\n  /* this compiler provides the __int64 type */\n#define FT_LONG64\n#define FT_INT64   __int64\n#define FT_UINT64  unsigned __int64\n\n#elif defined( __BORLANDC__ )  /* Borland C++ */\n\n  /* XXXX: We should probably check the value of __BORLANDC__ in order */\n  /*       to test the compiler version.                               */\n\n  /* this compiler provides the __int64 type */\n#define FT_LONG64\n#define FT_INT64   __int64\n#define FT_UINT64  unsigned __int64\n\n#elif defined( __WATCOMC__ )   /* Watcom C++ */\n\n  /* Watcom doesn't provide 64-bit data types */\n\n#elif defined( __MWERKS__ )    /* Metrowerks CodeWarrior */\n\n#define FT_LONG64\n#define FT_INT64   long long int\n#define FT_UINT64  unsigned long long int\n\n#elif defined( __GNUC__ )\n\n  /* GCC provides the `long long' type */\n#define FT_LONG64\n#define FT_INT64   long long int\n#define FT_UINT64  unsigned long long int\n\n#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* A 64-bit data type will create compilation problems if you compile    */\n  /* in strict ANSI mode.  To avoid them, we disable its use if __STDC__   */\n  /* is defined.  You can however ignore this rule by defining the         */\n  /* FT_CONFIG_OPTION_FORCE_INT64 configuration macro.                     */\n  /*                                                                       */\n#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 )\n\n#ifdef __STDC__\n\n  /* undefine the 64-bit macros in strict ANSI compilation mode */\n#undef FT_LONG64\n#undef FT_INT64\n\n#endif /* __STDC__ */\n\n#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */\n\n#ifdef FT_LONG64\n  typedef FT_INT64   FT_Int64;\n  typedef FT_UINT64  FT_UInt64;\n#endif\n\n\n#define FT_BEGIN_STMNT  do {\n#define FT_END_STMNT    } while ( 0 )\n#define FT_DUMMY_STMNT  FT_BEGIN_STMNT FT_END_STMNT\n\n\n#ifndef  FT_CONFIG_OPTION_NO_ASSEMBLER\n  /* Provide assembler fragments for performance-critical functions. */\n  /* These must be defined `static __inline__' with GCC.             */\n\n  /**Johnson add !defined( __thumb__ )*/\n#if (defined( __CC_ARM ) || defined( __ARMCC__ ))&& !defined( __thumb__ )  /* RVCT */\n#define FT_MULFIX_ASSEMBLER  FT_MulFix_arm\n\n  /* documentation is in freetype.h */\n\n  static __inline FT_Int32\n  FT_MulFix_arm( FT_Int32  a,\n                 FT_Int32  b )\n  {\n    register FT_Int32  t, t2;\n\n\n    __asm\n    {\n      smull t2, t,  b,  a           /* (lo=t2,hi=t) = a*b */\n      mov   a,  t,  asr #31         /* a   = (hi >> 31) */\n      add   a,  a,  #0x8000         /* a  += 0x8000 */\n      adds  t2, t2, a               /* t2 += a */\n      adc   t,  t,  #0              /* t  += carry */\n      mov   a,  t2, lsr #16         /* a   = t2 >> 16 */\n      orr   a,  a,  t,  lsl #16     /* a  |= t << 16 */\n    }\n    return a;\n  }\n\n#endif /* __CC_ARM || __ARMCC__ */\n\n\n#ifdef __GNUC__\n\n#if defined( __arm__ ) && !defined( __thumb__ )    && \\\n    !( defined( __CC_ARM ) || defined( __ARMCC__ ) )\n#define FT_MULFIX_ASSEMBLER  FT_MulFix_arm\n\n  /* documentation is in freetype.h */\n\n  static __inline__ FT_Int32\n  FT_MulFix_arm( FT_Int32  a,\n                 FT_Int32  b )\n  {\n    register FT_Int32  t, t2;\n\n\n    __asm__ __volatile__ (\n      \"smull  %1, %2, %4, %3\\n\\t\"       /* (lo=%1,hi=%2) = a*b */\n      \"mov    %0, %2, asr #31\\n\\t\"      /* %0  = (hi >> 31) */\n      \"add    %0, %0, #0x8000\\n\\t\"      /* %0 += 0x8000 */\n      \"adds   %1, %1, %0\\n\\t\"           /* %1 += %0 */\n      \"adc    %2, %2, #0\\n\\t\"           /* %2 += carry */\n      \"mov    %0, %1, lsr #16\\n\\t\"      /* %0  = %1 >> 16 */\n      \"orr    %0, %0, %2, lsl #16\\n\\t\"  /* %0 |= %2 << 16 */\n      : \"=r\"(a), \"=&r\"(t2), \"=&r\"(t)\n      : \"r\"(a), \"r\"(b)\n      : \"cc\" );\n    return a;\n  }\n\n#endif /* __arm__ && !__thumb__ && !( __CC_ARM || __ARMCC__ ) */\n\n#if defined( __i386__ )\n#define FT_MULFIX_ASSEMBLER  FT_MulFix_i386\n\n  /* documentation is in freetype.h */\n\n  static __inline__ FT_Int32\n  FT_MulFix_i386( FT_Int32  a,\n                  FT_Int32  b )\n  {\n    register FT_Int32  result;\n\n\n    __asm__ __volatile__ (\n      \"imul  %%edx\\n\"\n      \"movl  %%edx, %%ecx\\n\"\n      \"sarl  $31, %%ecx\\n\"\n      \"addl  $0x8000, %%ecx\\n\"\n      \"addl  %%ecx, %%eax\\n\"\n      \"adcl  $0, %%edx\\n\"\n      \"shrl  $16, %%eax\\n\"\n      \"shll  $16, %%edx\\n\"\n      \"addl  %%edx, %%eax\\n\"\n      : \"=a\"(result), \"=d\"(b)\n      : \"a\"(a), \"d\"(b)\n      : \"%ecx\", \"cc\" );\n    return result;\n  }\n\n#endif /* i386 */\n\n#endif /* __GNUC__ */\n\n\n#ifdef _MSC_VER /* Visual C++ */\n\n#ifdef _M_IX86\n\n#define FT_MULFIX_ASSEMBLER  FT_MulFix_i386\n\n  /* documentation is in freetype.h */\n\n  static __inline FT_Int32\n  FT_MulFix_i386( FT_Int32  a,\n                  FT_Int32  b )\n  {\n    register FT_Int32  result;\n\n    __asm\n    {\n      mov eax, a\n      mov edx, b\n      imul edx\n      mov ecx, edx\n      sar ecx, 31\n      add ecx, 8000h\n      add eax, ecx\n      adc edx, 0\n      shr eax, 16\n      shl edx, 16\n      add eax, edx\n      mov result, eax\n    }\n    return result;\n  }\n\n#endif /* _M_IX86 */\n\n#endif /* _MSC_VER */\n\n#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */\n\n\n#ifdef FT_CONFIG_OPTION_INLINE_MULFIX\n#ifdef FT_MULFIX_ASSEMBLER\n#define FT_MULFIX_INLINED  FT_MULFIX_ASSEMBLER\n#endif\n#endif\n\n\n#ifdef FT_MAKE_OPTION_SINGLE_OBJECT\n\n#define FT_LOCAL( x )      static  x\n#define FT_LOCAL_DEF( x )  static  x\n\n#else\n\n#ifdef __cplusplus\n#define FT_LOCAL( x )      extern \"C\"  x\n#define FT_LOCAL_DEF( x )  extern \"C\"  x\n#else\n#define FT_LOCAL( x )      extern  x\n#define FT_LOCAL_DEF( x )  x\n#endif\n\n#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */\n\n\n#ifndef FT_BASE\n\n#ifdef __cplusplus\n#define FT_BASE( x )  extern \"C\"  x\n#else\n#define FT_BASE( x )  extern  x\n#endif\n\n#endif /* !FT_BASE */\n\n\n#ifndef FT_BASE_DEF\n\n#ifdef __cplusplus\n#define FT_BASE_DEF( x )  x\n#else\n#define FT_BASE_DEF( x )  x\n#endif\n\n#endif /* !FT_BASE_DEF */\n\n\n#ifndef FT_EXPORT\n\n#ifdef __cplusplus\n#define FT_EXPORT( x )  extern \"C\"  x\n#else\n#define FT_EXPORT( x )  extern  x\n#endif\n\n#endif /* !FT_EXPORT */\n\n\n#ifndef FT_EXPORT_DEF\n\n#ifdef __cplusplus\n#define FT_EXPORT_DEF( x )  extern \"C\"  x\n#else\n#define FT_EXPORT_DEF( x )  extern  x\n#endif\n\n#endif /* !FT_EXPORT_DEF */\n\n\n#ifndef FT_EXPORT_VAR\n\n#ifdef __cplusplus\n#define FT_EXPORT_VAR( x )  extern \"C\"  x\n#else\n#define FT_EXPORT_VAR( x )  extern  x\n#endif\n\n#endif /* !FT_EXPORT_VAR */\n\n  /* The following macros are needed to compile the library with a   */\n  /* C++ compiler and with 16bit compilers.                          */\n  /*                                                                 */\n\n  /* This is special.  Within C++, you must specify `extern \"C\"' for */\n  /* functions which are used via function pointers, and you also    */\n  /* must do that for structures which contain function pointers to  */\n  /* assure C linkage -- it's not possible to have (local) anonymous */\n  /* functions which are accessed by (global) function pointers.     */\n  /*                                                                 */\n  /*                                                                 */\n  /* FT_CALLBACK_DEF is used to _define_ a callback function.        */\n  /*                                                                 */\n  /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */\n  /* contains pointers to callback functions.                        */\n  /*                                                                 */\n  /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable   */\n  /* that contains pointers to callback functions.                   */\n  /*                                                                 */\n  /*                                                                 */\n  /* Some 16bit compilers have to redefine these macros to insert    */\n  /* the infamous `_cdecl' or `__fastcall' declarations.             */\n  /*                                                                 */\n#ifndef FT_CALLBACK_DEF\n#ifdef __cplusplus\n#define FT_CALLBACK_DEF( x )  extern \"C\"  x\n#else\n#define FT_CALLBACK_DEF( x )  static  x\n#endif\n#endif /* FT_CALLBACK_DEF */\n\n#ifndef FT_CALLBACK_TABLE\n#ifdef __cplusplus\n#define FT_CALLBACK_TABLE      extern \"C\"\n#define FT_CALLBACK_TABLE_DEF  extern \"C\"\n#else\n#define FT_CALLBACK_TABLE      extern\n#define FT_CALLBACK_TABLE_DEF  /* nothing */\n#endif\n#endif /* FT_CALLBACK_TABLE */\n\n\nFT_END_HEADER\n\n\n#endif /* __FTCONFIG_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftheader.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftheader.h                                                             */\n/*                                                                         */\n/*    Build macros of the FreeType 2 library.                              */\n/*                                                                         */\n/*  Copyright 1996-2008, 2010, 2012, 2013 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#ifndef __FT_HEADER_H__\n#define __FT_HEADER_H__\n\n\n  /*@***********************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_BEGIN_HEADER                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This macro is used in association with @FT_END_HEADER in header    */\n  /*    files to ensure that the declarations within are properly          */\n  /*    encapsulated in an `extern \"C\" { .. }' block when included from a  */\n  /*    C++ compiler.                                                      */\n  /*                                                                       */\n#ifdef __cplusplus\n#define FT_BEGIN_HEADER  extern \"C\" {\n#else\n#define FT_BEGIN_HEADER  /* nothing */\n#endif\n\n\n  /*@***********************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_END_HEADER                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This macro is used in association with @FT_BEGIN_HEADER in header  */\n  /*    files to ensure that the declarations within are properly          */\n  /*    encapsulated in an `extern \"C\" { .. }' block when included from a  */\n  /*    C++ compiler.                                                      */\n  /*                                                                       */\n#ifdef __cplusplus\n#define FT_END_HEADER  }\n#else\n#define FT_END_HEADER  /* nothing */\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Aliases for the FreeType 2 public and configuration files.            */\n  /*                                                                       */\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    header_file_macros                                                 */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Header File Macros                                                 */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Macro definitions used to #include specific header files.          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The following macros are defined to the name of specific           */\n  /*    FreeType~2 header files.  They can be used directly in #include    */\n  /*    statements as in:                                                  */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      #include \"../freetype.h\"                                           */\n  /*      #include \"../ftmm.h\"                                   */\n  /*      #include \"../ftglyph.h\"                                              */\n  /*    }                                                                  */\n  /*                                                                       */\n  /*    There are several reasons why we are now using macros to name      */\n  /*    public header files.  The first one is that such macros are not    */\n  /*    limited to the infamous 8.3~naming rule required by DOS (and       */\n  /*    `FT_MULTIPLE_MASTERS_H' is a lot more meaningful than `ftmm.h').   */\n  /*                                                                       */\n  /*    The second reason is that it allows for more flexibility in the    */\n  /*    way FreeType~2 is installed on a given system.                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* configuration files */\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CONFIG_CONFIG_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing\n   *   FreeType~2 configuration data.\n   *\n   */\n#ifndef FT_CONFIG_CONFIG_H\n#define FT_CONFIG_CONFIG_H  <freetype/config/ftconfig.h>\n#endif\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CONFIG_STANDARD_LIBRARY_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing\n   *   FreeType~2 interface to the standard C library functions.\n   *\n   */\n#ifndef FT_CONFIG_STANDARD_LIBRARY_H\n#define FT_CONFIG_STANDARD_LIBRARY_H  <freetype/config/ftstdlib.h>\n#endif\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CONFIG_OPTIONS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing\n   *   FreeType~2 project-specific configuration options.\n   *\n   */\n#ifndef FT_CONFIG_OPTIONS_H\n#define FT_CONFIG_OPTIONS_H  <freetype/config/ftoption.h>\n#endif\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CONFIG_MODULES_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   list of FreeType~2 modules that are statically linked to new library\n   *   instances in @FT_Init_FreeType.\n   *\n   */\n#ifndef FT_CONFIG_MODULES_H\n#define FT_CONFIG_MODULES_H  <freetype/config/ftmodule.h>\n#endif\n\n  /* */\n\n  /* public headers */\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_FREETYPE_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   base FreeType~2 API.\n   *\n   */\n#define FT_FREETYPE_H  <freetype/freetype.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_ERRORS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   list of FreeType~2 error codes (and messages).\n   *\n   *   It is included by @FT_FREETYPE_H.\n   *\n   */\n#define FT_ERRORS_H  <freetype/fterrors.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_MODULE_ERRORS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   list of FreeType~2 module error offsets (and messages).\n   *\n   */\n#define FT_MODULE_ERRORS_H  <freetype/ftmoderr.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_SYSTEM_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 interface to low-level operations (i.e., memory management\n   *   and stream i/o).\n   *\n   *   It is included by @FT_FREETYPE_H.\n   *\n   */\n#define FT_SYSTEM_H  <freetype/ftsystem.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_IMAGE_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing type\n   *   definitions related to glyph images (i.e., bitmaps, outlines,\n   *   scan-converter parameters).\n   *\n   *   It is included by @FT_FREETYPE_H.\n   *\n   */\n#define FT_IMAGE_H  <freetype/ftimage.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_TYPES_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   basic data types defined by FreeType~2.\n   *\n   *   It is included by @FT_FREETYPE_H.\n   *\n   */\n#define FT_TYPES_H  <freetype/fttypes.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_LIST_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   list management API of FreeType~2.\n   *\n   *   (Most applications will never need to include this file.)\n   *\n   */\n#define FT_LIST_H  <freetype/ftlist.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_OUTLINE_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   scalable outline management API of FreeType~2.\n   *\n   */\n#define FT_OUTLINE_H  <freetype/ftoutln.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_SIZES_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   API which manages multiple @FT_Size objects per face.\n   *\n   */\n#define FT_SIZES_H  <freetype/ftsizes.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_MODULE_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   module management API of FreeType~2.\n   *\n   */\n#define FT_MODULE_H  <freetype/ftmodapi.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_RENDER_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   renderer module management API of FreeType~2.\n   *\n   */\n#define FT_RENDER_H  <freetype/ftrender.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_AUTOHINTER_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing\n   *   structures and macros related to the auto-hinting module.\n   *\n   */\n#define FT_AUTOHINTER_H  <freetype/ftautoh.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CFF_DRIVER_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing\n   *   structures and macros related to the CFF driver module.\n   *\n   */\n#define FT_CFF_DRIVER_H  <freetype/ftcffdrv.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_TRUETYPE_DRIVER_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing\n   *   structures and macros related to the TrueType driver module.\n   *\n   */\n#define FT_TRUETYPE_DRIVER_H  <freetype/ftttdrv.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_TYPE1_TABLES_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   types and API specific to the Type~1 format.\n   *\n   */\n#define FT_TYPE1_TABLES_H  <freetype/t1tables.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_TRUETYPE_IDS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   enumeration values which identify name strings, languages, encodings,\n   *   etc.  This file really contains a _large_ set of constant macro\n   *   definitions, taken from the TrueType and OpenType specifications.\n   *\n   */\n#define FT_TRUETYPE_IDS_H  <freetype/ttnameid.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_TRUETYPE_TABLES_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   types and API specific to the TrueType (as well as OpenType) format.\n   *\n   */\n#define FT_TRUETYPE_TABLES_H  <freetype/tttables.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_TRUETYPE_TAGS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   definitions of TrueType four-byte `tags' which identify blocks in\n   *   SFNT-based font formats (i.e., TrueType and OpenType).\n   *\n   */\n#define FT_TRUETYPE_TAGS_H  <freetype/tttags.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_BDF_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   definitions of an API which accesses BDF-specific strings from a\n   *   face.\n   *\n   */\n#define FT_BDF_H  <freetype/ftbdf.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CID_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   definitions of an API which access CID font information from a\n   *   face.\n   *\n   */\n#define FT_CID_H  <freetype/ftcid.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_GZIP_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   definitions of an API which supports gzip-compressed files.\n   *\n   */\n#define FT_GZIP_H  <freetype/ftgzip.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_LZW_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   definitions of an API which supports LZW-compressed files.\n   *\n   */\n#define FT_LZW_H  <freetype/ftlzw.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_BZIP2_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   definitions of an API which supports bzip2-compressed files.\n   *\n   */\n#define FT_BZIP2_H  <freetype/ftbzip2.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_WINFONTS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   definitions of an API which supports Windows FNT files.\n   *\n   */\n#define FT_WINFONTS_H   <freetype/ftwinfnt.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_GLYPH_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   API of the optional glyph management component.\n   *\n   */\n#define FT_GLYPH_H  <freetype/ftglyph.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_BITMAP_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   API of the optional bitmap conversion component.\n   *\n   */\n#define FT_BITMAP_H  <freetype/ftbitmap.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_BBOX_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   API of the optional exact bounding box computation routines.\n   *\n   */\n#define FT_BBOX_H  <freetype/ftbbox.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CACHE_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   API of the optional FreeType~2 cache sub-system.\n   *\n   */\n#define FT_CACHE_H  <freetype/ftcache.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CACHE_IMAGE_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   `glyph image' API of the FreeType~2 cache sub-system.\n   *\n   *   It is used to define a cache for @FT_Glyph elements.  You can also\n   *   use the API defined in @FT_CACHE_SMALL_BITMAPS_H if you only need to\n   *   store small glyph bitmaps, as it will use less memory.\n   *\n   *   This macro is deprecated.  Simply include @FT_CACHE_H to have all\n   *   glyph image-related cache declarations.\n   *\n   */\n#define FT_CACHE_IMAGE_H  FT_CACHE_H\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CACHE_SMALL_BITMAPS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   `small bitmaps' API of the FreeType~2 cache sub-system.\n   *\n   *   It is used to define a cache for small glyph bitmaps in a relatively\n   *   memory-efficient way.  You can also use the API defined in\n   *   @FT_CACHE_IMAGE_H if you want to cache arbitrary glyph images,\n   *   including scalable outlines.\n   *\n   *   This macro is deprecated.  Simply include @FT_CACHE_H to have all\n   *   small bitmaps-related cache declarations.\n   *\n   */\n#define FT_CACHE_SMALL_BITMAPS_H  FT_CACHE_H\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CACHE_CHARMAP_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   `charmap' API of the FreeType~2 cache sub-system.\n   *\n   *   This macro is deprecated.  Simply include @FT_CACHE_H to have all\n   *   charmap-based cache declarations.\n   *\n   */\n#define FT_CACHE_CHARMAP_H  FT_CACHE_H\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_MAC_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   Macintosh-specific FreeType~2 API.  The latter is used to access\n   *   fonts embedded in resource forks.\n   *\n   *   This header file must be explicitly included by client applications\n   *   compiled on the Mac (note that the base API still works though).\n   *\n   */\n#define FT_MAC_H  <freetype/ftmac.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_MULTIPLE_MASTERS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   optional multiple-masters management API of FreeType~2.\n   *\n   */\n#define FT_MULTIPLE_MASTERS_H  <freetype/ftmm.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_SFNT_NAMES_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   optional FreeType~2 API which accesses embedded `name' strings in\n   *   SFNT-based font formats (i.e., TrueType and OpenType).\n   *\n   */\n#define FT_SFNT_NAMES_H  <freetype/ftsnames.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_OPENTYPE_VALIDATE_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   optional FreeType~2 API which validates OpenType tables (BASE, GDEF,\n   *   GPOS, GSUB, JSTF).\n   *\n   */\n#define FT_OPENTYPE_VALIDATE_H  <freetype/ftotval.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_GX_VALIDATE_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   optional FreeType~2 API which validates TrueTypeGX/AAT tables (feat,\n   *   mort, morx, bsln, just, kern, opbd, trak, prop).\n   *\n   */\n#define FT_GX_VALIDATE_H  <freetype/ftgxval.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_PFR_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which accesses PFR-specific data.\n   *\n   */\n#define FT_PFR_H  <freetype/ftpfr.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_STROKER_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which provides functions to stroke outline paths.\n   */\n#define FT_STROKER_H  <freetype/ftstroke.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_SYNTHESIS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which performs artificial obliquing and emboldening.\n   */\n#define FT_SYNTHESIS_H  <freetype/ftsynth.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_XFREE86_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which provides functions specific to the XFree86 and\n   *   X.Org X11 servers.\n   */\n#define FT_XFREE86_H  <freetype/ftxf86.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_TRIGONOMETRY_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which performs trigonometric computations (e.g.,\n   *   cosines and arc tangents).\n   */\n#define FT_TRIGONOMETRY_H  <freetype/fttrigon.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_LCD_FILTER_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which performs color filtering for subpixel rendering.\n   */\n#define FT_LCD_FILTER_H  <freetype/ftlcdfil.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_UNPATENTED_HINTING_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which performs color filtering for subpixel rendering.\n   */\n#define FT_UNPATENTED_HINTING_H  <freetype/ttunpat.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_INCREMENTAL_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which performs color filtering for subpixel rendering.\n   */\n#define FT_INCREMENTAL_H  <freetype/ftincrem.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_GASP_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which returns entries from the TrueType GASP table.\n   */\n#define FT_GASP_H  <freetype/ftgasp.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_ADVANCES_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which returns individual and ranged glyph advances.\n   */\n#define FT_ADVANCES_H  <freetype/ftadvanc.h>\n\n\n  /* */\n\n#define FT_ERROR_DEFINITIONS_H  <freetype/fterrdef.h>\n\n\n  /* The internals of the cache sub-system are no longer exposed.  We */\n  /* default to FT_CACHE_H at the moment just in case, but we know of */\n  /* no rogue client that uses them.                                  */\n  /*                                                                  */\n#define FT_CACHE_MANAGER_H           <freetype/ftcache.h>\n#define FT_CACHE_INTERNAL_MRU_H      <freetype/ftcache.h>\n#define FT_CACHE_INTERNAL_MANAGER_H  <freetype/ftcache.h>\n#define FT_CACHE_INTERNAL_CACHE_H    <freetype/ftcache.h>\n#define FT_CACHE_INTERNAL_GLYPH_H    <freetype/ftcache.h>\n#define FT_CACHE_INTERNAL_IMAGE_H    <freetype/ftcache.h>\n#define FT_CACHE_INTERNAL_SBITS_H    <freetype/ftcache.h>\n\n\n#define FT_INCREMENTAL_H          <freetype/ftincrem.h>\n\n#define FT_TRUETYPE_UNPATENTED_H  <freetype/ttunpat.h>\n\n\n  /*\n   * Include internal headers definitions from <freetype/internal/...>\n   * only when building the library.\n   */\n#ifdef FT2_BUILD_LIBRARY\n#define  FT_INTERNAL_INTERNAL_H  <freetype/internal/internal.h>\n#include \"../internal/internal.h\"\n#endif /* FT2_BUILD_LIBRARY */\n\n\n#endif /* __FT2_BUILD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftmodule.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftmodule.h                                                             */\n/*                                                                         */\n/*    FreeType modules public interface (specification).                   */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/*\n *  This file registers the FreeType modules compiled into the library.\n *\n *  If you use GNU make, this file IS NOT USED!  Instead, it is created in\n *  the objects directory (normally `<topdir>/objs/') based on information\n *  from `<topdir>/modules.cfg'.\n *\n *  Please read `docs/INSTALL.ANY' and `docs/CUSTOMIZE' how to compile\n *  FreeType without GNU make.\n *\n */\n\n//FT_USE_MODULE( FT_Module_Class, autofit_module_class )\nFT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class )\nFT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class )\nFT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class )\nFT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class )\n//FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class )\n//FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class )\n//FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class )\n//FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class )\nFT_USE_MODULE( FT_Module_Class, psaux_module_class )\nFT_USE_MODULE( FT_Module_Class, psnames_module_class )\nFT_USE_MODULE( FT_Module_Class, pshinter_module_class )\nFT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class )\nFT_USE_MODULE( FT_Module_Class, sfnt_module_class )\nFT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class )\nFT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class )\nFT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class )\n//FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class )\n\n/* EOF */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftoption.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftoption.h                                                             */\n/*                                                                         */\n/*    User-selectable configuration macros (specification only).           */\n/*                                                                         */\n/*  Copyright 1996-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTOPTION_H__\n#define __FTOPTION_H__\n\n\n#include \"../../ft2build.h\"\n\n\nFT_BEGIN_HEADER\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                 USER-SELECTABLE CONFIGURATION MACROS                  */\n  /*                                                                       */\n  /* This file contains the default configuration macro definitions for    */\n  /* a standard build of the FreeType library.  There are three ways to    */\n  /* use this file to build project-specific versions of the library:      */\n  /*                                                                       */\n  /*  - You can modify this file by hand, but this is not recommended in   */\n  /*    cases where you would like to build several versions of the        */\n  /*    library from a single source directory.                            */\n  /*                                                                       */\n  /*  - You can put a copy of this file in your build directory, more      */\n  /*    precisely in `$BUILD/freetype/config/ftoption.h', where `$BUILD'   */\n  /*    is the name of a directory that is included _before_ the FreeType  */\n  /*    include path during compilation.                                   */\n  /*                                                                       */\n  /*    The default FreeType Makefiles and Jamfiles use the build          */\n  /*    directory `builds/<system>' by default, but you can easily change  */\n  /*    that for your own projects.                                        */\n  /*                                                                       */\n  /*  - Copy the file <ft2build.h> to `$BUILD/ft2build.h' and modify it    */\n  /*    slightly to pre-define the macro FT_CONFIG_OPTIONS_H used to       */\n  /*    locate this file during the build.  For example,                   */\n  /*                                                                       */\n  /*      #define FT_CONFIG_OPTIONS_H  <myftoptions.h>                     */\n  /*      #include <freetype/config/ftheader.h>                            */\n  /*                                                                       */\n  /*    will use `$BUILD/myftoptions.h' instead of this file for macro     */\n  /*    definitions.                                                       */\n  /*                                                                       */\n  /*    Note also that you can similarly pre-define the macro              */\n  /*    FT_CONFIG_MODULES_H used to locate the file listing of the modules */\n  /*    that are statically linked to the library at compile time.  By     */\n  /*    default, this file is <freetype/config/ftmodule.h>.                */\n  /*                                                                       */\n  /*  We highly recommend using the third method whenever possible.        */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /**** G E N E R A L   F R E E T Y P E   2   C O N F I G U R A T I O N ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Uncomment the line below if you want to activate sub-pixel rendering  */\n  /* (a.k.a. LCD rendering, or ClearType) in this build of the library.    */\n  /*                                                                       */\n  /* Note that this feature is covered by several Microsoft patents        */\n  /* and should not be activated in any default build of the library.      */\n  /*                                                                       */\n  /* This macro has no impact on the FreeType API, only on its             */\n  /* _implementation_.  For example, using FT_RENDER_MODE_LCD when calling */\n  /* FT_Render_Glyph still generates a bitmap that is 3 times wider than   */\n  /* the original size in case this macro isn't defined; however, each     */\n  /* triplet of subpixels has R=G=B.                                       */\n  /*                                                                       */\n  /* This is done to allow FreeType clients to run unmodified, forcing     */\n  /* them to display normal gray-level anti-aliased glyphs.                */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_SUBPIXEL_RENDERING\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Many compilers provide a non-ANSI 64-bit data type that can be used   */\n  /* by FreeType to speed up some computations.  However, this will create */\n  /* some problems when compiling the library in strict ANSI mode.         */\n  /*                                                                       */\n  /* For this reason, the use of 64-bit integers is normally disabled when */\n  /* the __STDC__ macro is defined.  You can however disable this by       */\n  /* defining the macro FT_CONFIG_OPTION_FORCE_INT64 here.                 */\n  /*                                                                       */\n  /* For most compilers, this will only create compilation warnings when   */\n  /* building the library.                                                 */\n  /*                                                                       */\n  /* ObNote: The compiler-specific 64-bit integers are detected in the     */\n  /*         file `ftconfig.h' either statically or through the            */\n  /*         `configure' script on supported platforms.                    */\n  /*                                                                       */\n#undef FT_CONFIG_OPTION_FORCE_INT64\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* If this macro is defined, do not try to use an assembler version of   */\n  /* performance-critical functions (e.g. FT_MulFix).  You should only do  */\n  /* that to verify that the assembler function works properly, or to      */\n  /* execute benchmark tests of the various implementations.               */\n/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* If this macro is defined, try to use an inlined assembler version of  */\n  /* the `FT_MulFix' function, which is a `hotspot' when loading and       */\n  /* hinting glyphs, and which should be executed as fast as possible.     */\n  /*                                                                       */\n  /* Note that if your compiler or CPU is not supported, this will default */\n  /* to the standard and portable implementation found in `ftcalc.c'.      */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_INLINE_MULFIX\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* LZW-compressed file support.                                          */\n  /*                                                                       */\n  /*   FreeType now handles font files that have been compressed with the  */\n  /*   `compress' program.  This is mostly used to parse many of the PCF   */\n  /*   files that come with various X11 distributions.  The implementation */\n  /*   uses NetBSD's `zopen' to partially uncompress the file on the fly   */\n  /*   (see src/lzw/ftgzip.c).                                             */\n  /*                                                                       */\n  /*   Define this macro if you want to enable this `feature'.             */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_USE_LZW\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Gzip-compressed file support.                                         */\n  /*                                                                       */\n  /*   FreeType now handles font files that have been compressed with the  */\n  /*   `gzip' program.  This is mostly used to parse many of the PCF files */\n  /*   that come with XFree86.  The implementation uses `zlib' to          */\n  /*   partially uncompress the file on the fly (see src/gzip/ftgzip.c).   */\n  /*                                                                       */\n  /*   Define this macro if you want to enable this `feature'.  See also   */\n  /*   the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below.                       */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_USE_ZLIB\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ZLib library selection                                                */\n  /*                                                                       */\n  /*   This macro is only used when FT_CONFIG_OPTION_USE_ZLIB is defined.  */\n  /*   It allows FreeType's `ftgzip' component to link to the system's     */\n  /*   installation of the ZLib library.  This is useful on systems like   */\n  /*   Unix or VMS where it generally is already available.                */\n  /*                                                                       */\n  /*   If you let it undefined, the component will use its own copy        */\n  /*   of the zlib sources instead.  These have been modified to be        */\n  /*   included directly within the component and *not* export external    */\n  /*   function names.  This allows you to link any program with FreeType  */\n  /*   _and_ ZLib without linking conflicts.                               */\n  /*                                                                       */\n  /*   Do not #undef this macro here since the build system might define   */\n  /*   it for certain configurations only.                                 */\n  /*                                                                       */\n/* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Bzip2-compressed file support.                                        */\n  /*                                                                       */\n  /*   FreeType now handles font files that have been compressed with the  */\n  /*   `bzip2' program.  This is mostly used to parse many of the PCF      */\n  /*   files that come with XFree86.  The implementation uses `libbz2' to  */\n  /*   partially uncompress the file on the fly (see src/bzip2/ftbzip2.c). */\n  /*   Contrary to gzip, bzip2 currently is not included and need to use   */\n  /*   the system available bzip2 implementation.                          */\n  /*                                                                       */\n  /*   Define this macro if you want to enable this `feature'.             */\n  /*                                                                       */\n/* #define FT_CONFIG_OPTION_USE_BZIP2 */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define to disable the use of file stream functions and types, FILE,   */\n  /* fopen() etc.  Enables the use of smaller system libraries on embedded */\n  /* systems that have multiple system libraries, some with or without     */\n  /* file stream support, in the cases where file stream support is not    */\n  /* necessary such as memory loading of font files.                       */\n  /*                                                                       */\n/* #define FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  PNG bitmap support.                                                  */\n  /*                                                                       */\n  /*   FreeType now handles loading color bitmap glyphs in the PNG format. */\n  /*   This requires help from the external libpng library.  Uncompressed  */\n  /*   color bitmaps do not need any external libraries and will be        */\n  /*   supported regardless of this configuration.                         */\n  /*                                                                       */\n  /*   Define this macro if you want to enable this `feature'.             */\n  /*                                                                       */\n/* #define FT_CONFIG_OPTION_USE_PNG */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* DLL export compilation                                                */\n  /*                                                                       */\n  /*   When compiling FreeType as a DLL, some systems/compilers need a     */\n  /*   special keyword in front OR after the return type of function       */\n  /*   declarations.                                                       */\n  /*                                                                       */\n  /*   Two macros are used within the FreeType source code to define       */\n  /*   exported library functions: FT_EXPORT and FT_EXPORT_DEF.            */\n  /*                                                                       */\n  /*     FT_EXPORT( return_type )                                          */\n  /*                                                                       */\n  /*       is used in a function declaration, as in                        */\n  /*                                                                       */\n  /*         FT_EXPORT( FT_Error )                                         */\n  /*         FT_Init_FreeType( FT_Library*  alibrary );                    */\n  /*                                                                       */\n  /*                                                                       */\n  /*     FT_EXPORT_DEF( return_type )                                      */\n  /*                                                                       */\n  /*       is used in a function definition, as in                         */\n  /*                                                                       */\n  /*         FT_EXPORT_DEF( FT_Error )                                     */\n  /*         FT_Init_FreeType( FT_Library*  alibrary )                     */\n  /*         {                                                             */\n  /*           ... some code ...                                           */\n  /*           return FT_Err_Ok;                                           */\n  /*         }                                                             */\n  /*                                                                       */\n  /*   You can provide your own implementation of FT_EXPORT and            */\n  /*   FT_EXPORT_DEF here if you want.  If you leave them undefined, they  */\n  /*   will be later automatically defined as `extern return_type' to      */\n  /*   allow normal compilation.                                           */\n  /*                                                                       */\n  /*   Do not #undef these macros here since the build system might define */\n  /*   them for certain configurations only.                               */\n  /*                                                                       */\n/* #define FT_EXPORT(x)      extern x */\n/* #define FT_EXPORT_DEF(x)  x */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Glyph Postscript Names handling                                       */\n  /*                                                                       */\n  /*   By default, FreeType 2 is compiled with the `psnames' module.  This */\n  /*   module is in charge of converting a glyph name string into a        */\n  /*   Unicode value, or return a Macintosh standard glyph name for the    */\n  /*   use with the TrueType `post' table.                                 */\n  /*                                                                       */\n  /*   Undefine this macro if you do not want `psnames' compiled in your   */\n  /*   build of FreeType.  This has the following effects:                 */\n  /*                                                                       */\n  /*   - The TrueType driver will provide its own set of glyph names,      */\n  /*     if you build it to support postscript names in the TrueType       */\n  /*     `post' table.                                                     */\n  /*                                                                       */\n  /*   - The Type 1 driver will not be able to synthesize a Unicode        */\n  /*     charmap out of the glyphs found in the fonts.                     */\n  /*                                                                       */\n  /*   You would normally undefine this configuration macro when building  */\n  /*   a version of FreeType that doesn't contain a Type 1 or CFF driver.  */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Postscript Names to Unicode Values support                            */\n  /*                                                                       */\n  /*   By default, FreeType 2 is built with the `PSNames' module compiled  */\n  /*   in.  Among other things, the module is used to convert a glyph name */\n  /*   into a Unicode value.  This is especially useful in order to        */\n  /*   synthesize on the fly a Unicode charmap from the CFF/Type 1 driver  */\n  /*   through a big table named the `Adobe Glyph List' (AGL).             */\n  /*                                                                       */\n  /*   Undefine this macro if you do not want the Adobe Glyph List         */\n  /*   compiled in your `PSNames' module.  The Type 1 driver will not be   */\n  /*   able to synthesize a Unicode charmap out of the glyphs found in the */\n  /*   fonts.                                                              */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Support for Mac fonts                                                 */\n  /*                                                                       */\n  /*   Define this macro if you want support for outline fonts in Mac      */\n  /*   format (mac dfont, mac resource, macbinary containing a mac         */\n  /*   resource) on non-Mac platforms.                                     */\n  /*                                                                       */\n  /*   Note that the `FOND' resource isn't checked.                        */\n  /*                                                                       */\n//#define FT_CONFIG_OPTION_MAC_FONTS\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Guessing methods to access embedded resource forks                    */\n  /*                                                                       */\n  /*   Enable extra Mac fonts support on non-Mac platforms (e.g.           */\n  /*   GNU/Linux).                                                         */\n  /*                                                                       */\n  /*   Resource forks which include fonts data are stored sometimes in     */\n  /*   locations which users or developers don't expected.  In some cases, */\n  /*   resource forks start with some offset from the head of a file.  In  */\n  /*   other cases, the actual resource fork is stored in file different   */\n  /*   from what the user specifies.  If this option is activated,         */\n  /*   FreeType tries to guess whether such offsets or different file      */\n  /*   names must be used.                                                 */\n  /*                                                                       */\n  /*   Note that normal, direct access of resource forks is controlled via */\n  /*   the FT_CONFIG_OPTION_MAC_FONTS option.                              */\n  /*                                                                       */\n#ifdef FT_CONFIG_OPTION_MAC_FONTS\n#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Allow the use of FT_Incremental_Interface to load typefaces that      */\n  /* contain no glyph data, but supply it via a callback function.         */\n  /* This is required by clients supporting document formats which         */\n  /* supply font data incrementally as the document is parsed, such        */\n  /* as the Ghostscript interpreter for the PostScript language.           */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_INCREMENTAL\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The size in bytes of the render pool used by the scan-line converter  */\n  /* to do all of its work.                                                */\n  /*                                                                       */\n  /* This must be greater than 4KByte if you use FreeType to rasterize     */\n  /* glyphs; otherwise, you may set it to zero to avoid unnecessary        */\n  /* allocation of the render pool.                                        */\n  /*                                                                       */\n#define FT_RENDER_POOL_SIZE  16384L\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* FT_MAX_MODULES                                                        */\n  /*                                                                       */\n  /*   The maximum number of modules that can be registered in a single    */\n  /*   FreeType library object.  32 is the default.                        */\n  /*                                                                       */\n#define FT_MAX_MODULES  32\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Debug level                                                           */\n  /*                                                                       */\n  /*   FreeType can be compiled in debug or trace mode.  In debug mode,    */\n  /*   errors are reported through the `ftdebug' component.  In trace      */\n  /*   mode, additional messages are sent to the standard output during    */\n  /*   execution.                                                          */\n  /*                                                                       */\n  /*   Define FT_DEBUG_LEVEL_ERROR to build the library in debug mode.     */\n  /*   Define FT_DEBUG_LEVEL_TRACE to build it in trace mode.              */\n  /*                                                                       */\n  /*   Don't define any of these macros to compile in `release' mode!      */\n  /*                                                                       */\n  /*   Do not #undef these macros here since the build system might define */\n  /*   them for certain configurations only.                               */\n  /*                                                                       */\n/* #define FT_DEBUG_LEVEL_ERROR */\n/* #define FT_DEBUG_LEVEL_TRACE */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Autofitter debugging                                                  */\n  /*                                                                       */\n  /*   If FT_DEBUG_AUTOFIT is defined, FreeType provides some means to     */\n  /*   control the autofitter behaviour for debugging purposes with global */\n  /*   boolean variables (consequently, you should *never* enable this     */\n  /*   while compiling in `release' mode):                                 */\n  /*                                                                       */\n  /*     _af_debug_disable_horz_hints                                      */\n  /*     _af_debug_disable_vert_hints                                      */\n  /*     _af_debug_disable_blue_hints                                      */\n  /*                                                                       */\n  /*   Additionally, the following functions provide dumps of various      */\n  /*   internal autofit structures to stdout (using `printf'):             */\n  /*                                                                       */\n  /*     af_glyph_hints_dump_points                                        */\n  /*     af_glyph_hints_dump_segments                                      */\n  /*     af_glyph_hints_dump_edges                                         */\n  /*                                                                       */\n  /*   As an argument, they use another global variable:                   */\n  /*                                                                       */\n  /*     _af_debug_hints                                                   */\n  /*                                                                       */\n  /*   Please have a look at the `ftgrid' demo program to see how those    */\n  /*   variables and macros should be used.                                */\n  /*                                                                       */\n  /*   Do not #undef these macros here since the build system might define */\n  /*   them for certain configurations only.                               */\n  /*                                                                       */\n/* #define FT_DEBUG_AUTOFIT */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Memory Debugging                                                      */\n  /*                                                                       */\n  /*   FreeType now comes with an integrated memory debugger that is       */\n  /*   capable of detecting simple errors like memory leaks or double      */\n  /*   deletes.  To compile it within your build of the library, you       */\n  /*   should define FT_DEBUG_MEMORY here.                                 */\n  /*                                                                       */\n  /*   Note that the memory debugger is only activated at runtime when     */\n  /*   when the _environment_ variable `FT2_DEBUG_MEMORY' is defined also! */\n  /*                                                                       */\n  /*   Do not #undef this macro here since the build system might define   */\n  /*   it for certain configurations only.                                 */\n  /*                                                                       */\n/* #define FT_DEBUG_MEMORY */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Module errors                                                         */\n  /*                                                                       */\n  /*   If this macro is set (which is _not_ the default), the higher byte  */\n  /*   of an error code gives the module in which the error has occurred,  */\n  /*   while the lower byte is the real error code.                        */\n  /*                                                                       */\n  /*   Setting this macro makes sense for debugging purposes only, since   */\n  /*   it would break source compatibility of certain programs that use    */\n  /*   FreeType 2.                                                         */\n  /*                                                                       */\n  /*   More details can be found in the files ftmoderr.h and fterrors.h.   */\n  /*                                                                       */\n#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Position Independent Code                                             */\n  /*                                                                       */\n  /*   If this macro is set (which is _not_ the default), FreeType2 will   */\n  /*   avoid creating constants that require address fixups.  Instead the  */\n  /*   constants will be moved into a struct and additional intialization  */\n  /*   code will be used.                                                  */\n  /*                                                                       */\n  /*   Setting this macro is needed for systems that prohibit address      */\n  /*   fixups, such as BREW.                                               */\n  /*                                                                       */\n/* #define FT_CONFIG_OPTION_PIC */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****        S F N T   D R I V E R    C O N F I G U R A T I O N       ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_EMBEDDED_BITMAPS if you want to support       */\n  /* embedded bitmaps in all formats using the SFNT module (namely         */\n  /* TrueType & OpenType).                                                 */\n  /*                                                                       */\n#undef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_POSTSCRIPT_NAMES if you want to be able to    */\n  /* load and enumerate the glyph Postscript names in a TrueType or        */\n  /* OpenType file.                                                        */\n  /*                                                                       */\n  /* Note that when you do not compile the `PSNames' module by undefining  */\n  /* the above FT_CONFIG_OPTION_POSTSCRIPT_NAMES, the `sfnt' module will   */\n  /* contain additional code used to read the PS Names table from a font.  */\n  /*                                                                       */\n  /* (By default, the module uses `PSNames' to extract glyph names.)       */\n  /*                                                                       */\n#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_SFNT_NAMES if your applications need to       */\n  /* access the internal name table in a SFNT-based format like TrueType   */\n  /* or OpenType.  The name table contains various strings used to         */\n  /* describe the font, like family name, copyright, version, etc.  It     */\n  /* does not contain any glyph name though.                               */\n  /*                                                                       */\n  /* Accessing SFNT names is done through the functions declared in        */\n  /* `freetype/ftsnames.h'.                                                */\n  /*                                                                       */\n#define TT_CONFIG_OPTION_SFNT_NAMES\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* TrueType CMap support                                                 */\n  /*                                                                       */\n  /*   Here you can fine-tune which TrueType CMap table format shall be    */\n  /*   supported.                                                          */\n#define TT_CONFIG_CMAP_FORMAT_0\n#define TT_CONFIG_CMAP_FORMAT_2\n#define TT_CONFIG_CMAP_FORMAT_4\n#define TT_CONFIG_CMAP_FORMAT_6\n#define TT_CONFIG_CMAP_FORMAT_8\n#define TT_CONFIG_CMAP_FORMAT_10\n#define TT_CONFIG_CMAP_FORMAT_12\n#define TT_CONFIG_CMAP_FORMAT_13\n#define TT_CONFIG_CMAP_FORMAT_14\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****    T R U E T Y P E   D R I V E R    C O N F I G U R A T I O N   ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile   */\n  /* a bytecode interpreter in the TrueType driver.                        */\n  /*                                                                       */\n  /* By undefining this, you will only compile the code necessary to load  */\n  /* TrueType glyphs without hinting.                                      */\n  /*                                                                       */\n  /*   Do not #undef this macro here, since the build system might         */\n  /*   define it for certain configurations only.                          */\n  /*                                                                       */\n#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_SUBPIXEL_HINTING if you want to compile       */\n  /* EXPERIMENTAL subpixel hinting support into the TrueType driver.  This */\n  /* replaces the native TrueType hinting mechanism when anything but      */\n  /* FT_RENDER_MODE_MONO is requested.                                     */\n  /*                                                                       */\n  /* Enabling this causes the TrueType driver to ignore instructions under */\n  /* certain conditions.  This is done in accordance with the guide here,  */\n  /* with some minor differences:                                          */\n  /*                                                                       */\n  /*  http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx */\n  /*                                                                       */\n  /* By undefining this, you only compile the code necessary to hint       */\n  /* TrueType glyphs with native TT hinting.                               */\n  /*                                                                       */\n  /*   This option requires TT_CONFIG_OPTION_BYTECODE_INTERPRETER to be    */\n  /*   defined.                                                            */\n  /*                                                                       */\n/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version  */\n  /* of the TrueType bytecode interpreter is used that doesn't implement   */\n  /* any of the patented opcodes and algorithms.  The patents related to   */\n  /* TrueType hinting have expired worldwide since May 2010; this option   */\n  /* is now deprecated.                                                    */\n  /*                                                                       */\n  /* Note that the TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored*  */\n  /* if you define TT_CONFIG_OPTION_BYTECODE_INTERPRETER; in other words,  */\n  /* either define TT_CONFIG_OPTION_BYTECODE_INTERPRETER or                */\n  /* TT_CONFIG_OPTION_UNPATENTED_HINTING but not both at the same time.    */\n  /*                                                                       */\n  /* This macro is only useful for a small number of font files (mostly    */\n  /* for Asian scripts) that require bytecode interpretation to properly   */\n  /* load glyphs.  For all other fonts, this produces unpleasant results,  */\n  /* thus the unpatented interpreter is never used to load glyphs from     */\n  /* TrueType fonts unless one of the following two options is used.       */\n  /*                                                                       */\n  /*   - The unpatented interpreter is explicitly activated by the user    */\n  /*     through the FT_PARAM_TAG_UNPATENTED_HINTING parameter tag         */\n  /*     when opening the FT_Face.                                         */\n  /*                                                                       */\n  /*   - FreeType detects that the FT_Face corresponds to one of the       */\n  /*     `trick' fonts (e.g., `Mingliu') it knows about.  The font engine  */\n  /*     contains a hard-coded list of font names and other matching       */\n  /*     parameters (see function `tt_face_init' in file                   */\n  /*     `src/truetype/ttobjs.c').                                         */\n  /*                                                                       */\n  /* Here a sample code snippet for using FT_PARAM_TAG_UNPATENTED_HINTING. */\n  /*                                                                       */\n  /*   {                                                                   */\n  /*     FT_Parameter  parameter;                                          */\n  /*     FT_Open_Args  open_args;                                          */\n  /*                                                                       */\n  /*                                                                       */\n  /*     parameter.tag = FT_PARAM_TAG_UNPATENTED_HINTING;                  */\n  /*                                                                       */\n  /*     open_args.flags      = FT_OPEN_PATHNAME | FT_OPEN_PARAMS;         */\n  /*     open_args.pathname   = my_font_pathname;                          */\n  /*     open_args.num_params = 1;                                         */\n  /*     open_args.params     = &parameter;                                */\n  /*                                                                       */\n  /*     error = FT_Open_Face( library, &open_args, index, &face );        */\n  /*     ...                                                               */\n  /*   }                                                                   */\n  /*                                                                       */\n/* #define TT_CONFIG_OPTION_UNPATENTED_HINTING */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_INTERPRETER_SWITCH to compile the TrueType    */\n  /* bytecode interpreter with a huge switch statement, rather than a call */\n  /* table.  This results in smaller and faster code for a number of       */\n  /* architectures.                                                        */\n  /*                                                                       */\n  /* Note however that on some compiler/processor combinations, undefining */\n  /* this macro will generate faster, though larger, code.                 */\n  /*                                                                       */\n#define TT_CONFIG_OPTION_INTERPRETER_SWITCH\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED to compile the        */\n  /* TrueType glyph loader to use Apple's definition of how to handle      */\n  /* component offsets in composite glyphs.                                */\n  /*                                                                       */\n  /* Apple and MS disagree on the default behavior of component offsets    */\n  /* in composites.  Apple says that they should be scaled by the scaling  */\n  /* factors in the transformation matrix (roughly, it's more complex)     */\n  /* while MS says they should not.  OpenType defines two bits in the      */\n  /* composite flags array which can be used to disambiguate, but old      */\n  /* fonts will not have them.                                             */\n  /*                                                                       */\n  /*   http://www.microsoft.com/typography/otspec/glyf.htm                 */\n  /*   http://fonts.apple.com/TTRefMan/RM06/Chap6glyf.html                 */\n  /*                                                                       */\n#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_GX_VAR_SUPPORT if you want to include         */\n  /* support for Apple's distortable font technology (fvar, gvar, cvar,    */\n  /* and avar tables).  This has many similarities to Type 1 Multiple      */\n  /* Masters support.                                                      */\n  /*                                                                       */\n#undef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_BDF if you want to include support for        */\n  /* an embedded `BDF ' table within SFNT-based bitmap formats.            */\n  /*                                                                       */\n#undef TT_CONFIG_OPTION_BDF\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****      T Y P E 1   D R I V E R    C O N F I G U R A T I O N       ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* T1_MAX_DICT_DEPTH is the maximum depth of nest dictionaries and       */\n  /* arrays in the Type 1 stream (see t1load.c).  A minimum of 4 is        */\n  /* required.                                                             */\n  /*                                                                       */\n#define T1_MAX_DICT_DEPTH  5\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine   */\n  /* calls during glyph loading.                                           */\n  /*                                                                       */\n#define T1_MAX_SUBRS_CALLS  16\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity.  A     */\n  /* minimum of 16 is required.                                            */\n  /*                                                                       */\n  /* The Chinese font MingTiEG-Medium (CNS 11643 character set) needs 256. */\n  /*                                                                       */\n#define T1_MAX_CHARSTRINGS_OPERANDS  512\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define this configuration macro if you want to prevent the            */\n  /* compilation of `t1afm', which is in charge of reading Type 1 AFM      */\n  /* files into an existing face.  Note that if set, the T1 driver will be */\n  /* unable to produce kerning distances.                                  */\n  /*                                                                       */\n#undef T1_CONFIG_OPTION_NO_AFM\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define this configuration macro if you want to prevent the            */\n  /* compilation of the Multiple Masters font support in the Type 1        */\n  /* driver.                                                               */\n  /*                                                                       */\n#undef T1_CONFIG_OPTION_NO_MM_SUPPORT\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****         C F F   D R I V E R    C O N F I G U R A T I O N        ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* CFF_CONFIG_OPTION_OLD_ENGINE controls whether the pre-Adobe CFF       */\n  /* engine gets compiled into FreeType.  If defined, it is possible to    */\n  /* switch between the two engines using the `hinting-engine' property of */\n  /* the cff driver module.                                                */\n  /*                                                                       */\n/* #define CFF_CONFIG_OPTION_OLD_ENGINE */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****    A U T O F I T   M O D U L E    C O N F I G U R A T I O N     ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Compile autofit module with CJK (Chinese, Japanese, Korean) script    */\n  /* support.                                                              */\n  /*                                                                       */\n#define AF_CONFIG_OPTION_CJK\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Compile autofit module with Indic script support.                     */\n  /*                                                                       */\n#define AF_CONFIG_OPTION_INDIC\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Compile autofit module with warp hinting.  The idea of the warping    */\n  /* code is to slightly scale and shift a glyph within a single dimension */\n  /* so that as much of its segments are aligned (more or less) on the     */\n  /* grid.  To find out the optimal scaling and shifting value, various    */\n  /* parameter combinations are tried and scored.                          */\n  /*                                                                       */\n  /* This experimental option is only active if the render mode is         */\n  /* FT_RENDER_MODE_LIGHT.                                                 */\n  /*                                                                       */\n/* #define AF_CONFIG_OPTION_USE_WARPER */\n\n  /* */\n\n\n  /*\n   *  This macro is obsolete.  Support has been removed in FreeType\n   *  version 2.5.\n   */\n/* #define FT_CONFIG_OPTION_OLD_INTERNALS */\n\n\n  /*\n   * This macro is defined if either unpatented or native TrueType\n   * hinting is requested by the definitions above.\n   */\n#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER\n#define  TT_USE_BYTECODE_INTERPRETER\n#undef   TT_CONFIG_OPTION_UNPATENTED_HINTING\n#elif defined TT_CONFIG_OPTION_UNPATENTED_HINTING\n#define  TT_USE_BYTECODE_INTERPRETER\n#endif\n\nFT_END_HEADER\n\n\n#endif /* __FTOPTION_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftstdlib.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftstdlib.h                                                             */\n/*                                                                         */\n/*    ANSI-specific library and header configuration file (specification   */\n/*    only).                                                               */\n/*                                                                         */\n/*  Copyright 2002-2007, 2009, 2011-2012 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to group all #includes to the ANSI C library that   */\n  /* FreeType normally requires.  It also defines macros to rename the     */\n  /* standard functions within the FreeType source code.                   */\n  /*                                                                       */\n  /* Load a file which defines __FTSTDLIB_H__ before this one to override  */\n  /* it.                                                                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTSTDLIB_H__\n#define __FTSTDLIB_H__\n\n\n#include <stddef.h>\n\n#define ft_ptrdiff_t  ptrdiff_t\n\n\n  /**********************************************************************/\n  /*                                                                    */\n  /*                           integer limits                           */\n  /*                                                                    */\n  /* UINT_MAX and ULONG_MAX are used to automatically compute the size  */\n  /* of `int' and `long' in bytes at compile-time.  So far, this works  */\n  /* for all platforms the library has been tested on.                  */\n  /*                                                                    */\n  /* Note that on the extremely rare platforms that do not provide      */\n  /* integer types that are _exactly_ 16 and 32 bits wide (e.g. some    */\n  /* old Crays where `int' is 36 bits), we do not make any guarantee    */\n  /* about the correct behaviour of FT2 with all fonts.                 */\n  /*                                                                    */\n  /* In these case, `ftconfig.h' will refuse to compile anyway with a   */\n  /* message like `couldn't find 32-bit type' or something similar.     */\n  /*                                                                    */\n  /**********************************************************************/\n\n\n#include <limits.h>\n\n#define FT_CHAR_BIT    CHAR_BIT\n#define FT_USHORT_MAX  USHRT_MAX\n#define FT_INT_MAX     INT_MAX\n#define FT_INT_MIN     INT_MIN\n#define FT_UINT_MAX    UINT_MAX\n#define FT_ULONG_MAX   ULONG_MAX\n\n\n  /**********************************************************************/\n  /*                                                                    */\n  /*                 character and string processing                    */\n  /*                                                                    */\n  /**********************************************************************/\n\n#include \"../../../../../../../include/fxcrt/fx_system.h\"\n#include <string.h>\n\n#define ft_memchr   FXSYS_memchr\n#define ft_memcmp   FXSYS_memcmp32\n#define ft_memcpy   FXSYS_memcpy32\n#define ft_memmove  FXSYS_memmove32\n#define ft_memset   FXSYS_memset8\n//#define ft_strcat   FXSYS_strcat\n#define ft_strcmp   FXSYS_strcmp\n#define ft_strcpy   FXSYS_strcpy\n#define ft_strlen   FXSYS_strlen\n#define ft_strncmp  FXSYS_strncmp\n#define ft_strncpy  FXSYS_strncpy\n#define ft_strrchr  FXSYS_strrchr\n#define ft_strstr   FXSYS_strstr\n\n\n  /**********************************************************************/\n  /*                                                                    */\n  /*                           file handling                            */\n  /*                                                                    */\n  /**********************************************************************/\n\n\n#include <stdio.h>\n\n#define FT_FILE     FXSYS_FILE\n#define ft_fclose   FXSYS_fclose\n#define ft_fopen    FXSYS_fopen\n#define ft_fread    FXSYS_fread\n#define ft_fseek    FXSYS_fseek\n#define ft_ftell    FXSYS_ftell\n#define ft_sprintf  FXSYS_sprintf\n\n\n  /**********************************************************************/\n  /*                                                                    */\n  /*                             sorting                                */\n  /*                                                                    */\n  /**********************************************************************/\n\n\n//#include <stdlib.h>\n\n#define ft_qsort  FXSYS_qsort\n\n\n  /**********************************************************************/\n  /*                                                                    */\n  /*                        memory allocation                           */\n  /*                                                                    */\n  /**********************************************************************/\n\n\n#define ft_scalloc   calloc\n#define ft_sfree     free\n#define ft_smalloc   malloc\n#define ft_srealloc  realloc\n\n\n  /**********************************************************************/\n  /*                                                                    */\n  /*                          miscellaneous                             */\n  /*                                                                    */\n  /**********************************************************************/\n\n\n#define ft_atol   FXSYS_atoi\n#define ft_labs   labs\n\n\n  /**********************************************************************/\n  /*                                                                    */\n  /*                         execution control                          */\n  /*                                                                    */\n  /**********************************************************************/\n\n\n//#include <setjmp.h>\n\n#define ft_jmp_buf     jmp_buf  /* note: this cannot be a typedef since */\n                                /*       jmp_buf is defined as a macro  */\n                                /*       on certain platforms           */\n\n#define ft_longjmp     longjmp\n#define ft_setjmp( b ) setjmp( *(ft_jmp_buf*) &(b) ) /* same thing here */\n\n\n  /* the following is only used for debugging purposes, i.e., if */\n  /* FT_DEBUG_LEVEL_ERROR or FT_DEBUG_LEVEL_TRACE are defined    */\n\n#include <stdarg.h>\n\n\n#endif /* __FTSTDLIB_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/freetype.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  freetype.h                                                             */\n/*                                                                         */\n/*    FreeType high-level API and common types (specification only).       */\n/*                                                                         */\n/*  Copyright 1996-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FREETYPE_H__\n#define __FREETYPE_H__\n\n\n#ifndef FT_FREETYPE_H\n#error \"`ft2build.h' hasn't been included yet!\"\n#error \"Please always use macros to include FreeType header files.\"\n#error \"Example:\"\n#error \"  #include <ft2build.h>\"\n#error \"  #include FT_FREETYPE_H\"\n#endif\n\n\n#include \"../ft2build.h\"\n#include \"config/ftconfig.h\"\n#include \"fttypes.h\"\n#include \"fterrors.h\"\n\n\nFT_BEGIN_HEADER\n\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    user_allocation                                                    */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    User allocation                                                    */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    How client applications should allocate FreeType data structures.  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    FreeType assumes that structures allocated by the user and passed  */\n  /*    as arguments are zeroed out except for the actual data.  In other  */\n  /*    words, it is recommended to use `calloc' (or variants of it)       */\n  /*    instead of `malloc' for allocation.                                */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*                                                                       */\n  /*                        B A S I C   T Y P E S                          */\n  /*                                                                       */\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    base_interface                                                     */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Base Interface                                                     */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    The FreeType~2 base font interface.                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section describes the public high-level API of FreeType~2.    */\n  /*                                                                       */\n  /* <Order>                                                               */\n  /*    FT_Library                                                         */\n  /*    FT_Face                                                            */\n  /*    FT_Size                                                            */\n  /*    FT_GlyphSlot                                                       */\n  /*    FT_CharMap                                                         */\n  /*    FT_Encoding                                                        */\n  /*                                                                       */\n  /*    FT_FaceRec                                                         */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_SCALABLE                                              */\n  /*    FT_FACE_FLAG_FIXED_SIZES                                           */\n  /*    FT_FACE_FLAG_FIXED_WIDTH                                           */\n  /*    FT_FACE_FLAG_HORIZONTAL                                            */\n  /*    FT_FACE_FLAG_VERTICAL                                              */\n  /*    FT_FACE_FLAG_SFNT                                                  */\n  /*    FT_FACE_FLAG_KERNING                                               */\n  /*    FT_FACE_FLAG_MULTIPLE_MASTERS                                      */\n  /*    FT_FACE_FLAG_GLYPH_NAMES                                           */\n  /*    FT_FACE_FLAG_EXTERNAL_STREAM                                       */\n  /*    FT_FACE_FLAG_FAST_GLYPHS                                           */\n  /*    FT_FACE_FLAG_HINTER                                                */\n  /*                                                                       */\n  /*    FT_STYLE_FLAG_BOLD                                                 */\n  /*    FT_STYLE_FLAG_ITALIC                                               */\n  /*                                                                       */\n  /*    FT_SizeRec                                                         */\n  /*    FT_Size_Metrics                                                    */\n  /*                                                                       */\n  /*    FT_GlyphSlotRec                                                    */\n  /*    FT_Glyph_Metrics                                                   */\n  /*    FT_SubGlyph                                                        */\n  /*                                                                       */\n  /*    FT_Bitmap_Size                                                     */\n  /*                                                                       */\n  /*    FT_Init_FreeType                                                   */\n  /*    FT_Done_FreeType                                                   */\n  /*                                                                       */\n  /*    FT_New_Face                                                        */\n  /*    FT_Done_Face                                                       */\n  /*    FT_New_Memory_Face                                                 */\n  /*    FT_Open_Face                                                       */\n  /*    FT_Open_Args                                                       */\n  /*    FT_Parameter                                                       */\n  /*    FT_Attach_File                                                     */\n  /*    FT_Attach_Stream                                                   */\n  /*                                                                       */\n  /*    FT_Set_Char_Size                                                   */\n  /*    FT_Set_Pixel_Sizes                                                 */\n  /*    FT_Request_Size                                                    */\n  /*    FT_Select_Size                                                     */\n  /*    FT_Size_Request_Type                                               */\n  /*    FT_Size_Request                                                    */\n  /*    FT_Set_Transform                                                   */\n  /*    FT_Load_Glyph                                                      */\n  /*    FT_Get_Char_Index                                                  */\n  /*    FT_Get_Name_Index                                                  */\n  /*    FT_Load_Char                                                       */\n  /*                                                                       */\n  /*    FT_OPEN_MEMORY                                                     */\n  /*    FT_OPEN_STREAM                                                     */\n  /*    FT_OPEN_PATHNAME                                                   */\n  /*    FT_OPEN_DRIVER                                                     */\n  /*    FT_OPEN_PARAMS                                                     */\n  /*                                                                       */\n  /*    FT_LOAD_DEFAULT                                                    */\n  /*    FT_LOAD_RENDER                                                     */\n  /*    FT_LOAD_MONOCHROME                                                 */\n  /*    FT_LOAD_LINEAR_DESIGN                                              */\n  /*    FT_LOAD_NO_SCALE                                                   */\n  /*    FT_LOAD_NO_HINTING                                                 */\n  /*    FT_LOAD_NO_BITMAP                                                  */\n  /*    FT_LOAD_CROP_BITMAP                                                */\n  /*                                                                       */\n  /*    FT_LOAD_VERTICAL_LAYOUT                                            */\n  /*    FT_LOAD_IGNORE_TRANSFORM                                           */\n  /*    FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH                                */\n  /*    FT_LOAD_FORCE_AUTOHINT                                             */\n  /*    FT_LOAD_NO_RECURSE                                                 */\n  /*    FT_LOAD_PEDANTIC                                                   */\n  /*                                                                       */\n  /*    FT_LOAD_TARGET_NORMAL                                              */\n  /*    FT_LOAD_TARGET_LIGHT                                               */\n  /*    FT_LOAD_TARGET_MONO                                                */\n  /*    FT_LOAD_TARGET_LCD                                                 */\n  /*    FT_LOAD_TARGET_LCD_V                                               */\n  /*                                                                       */\n  /*    FT_Render_Glyph                                                    */\n  /*    FT_Render_Mode                                                     */\n  /*    FT_Get_Kerning                                                     */\n  /*    FT_Kerning_Mode                                                    */\n  /*    FT_Get_Track_Kerning                                               */\n  /*    FT_Get_Glyph_Name                                                  */\n  /*    FT_Get_Postscript_Name                                             */\n  /*                                                                       */\n  /*    FT_CharMapRec                                                      */\n  /*    FT_Select_Charmap                                                  */\n  /*    FT_Set_Charmap                                                     */\n  /*    FT_Get_Charmap_Index                                               */\n  /*                                                                       */\n  /*    FT_FSTYPE_INSTALLABLE_EMBEDDING                                    */\n  /*    FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING                             */\n  /*    FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING                              */\n  /*    FT_FSTYPE_EDITABLE_EMBEDDING                                       */\n  /*    FT_FSTYPE_NO_SUBSETTING                                            */\n  /*    FT_FSTYPE_BITMAP_EMBEDDING_ONLY                                    */\n  /*                                                                       */\n  /*    FT_Get_FSType_Flags                                                */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Glyph_Metrics                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model the metrics of a single glyph.  The      */\n  /*    values are expressed in 26.6 fractional pixel format; if the flag  */\n  /*    @FT_LOAD_NO_SCALE has been used while loading the glyph, values    */\n  /*    are expressed in font units instead.                               */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    width ::                                                           */\n  /*      The glyph's width.                                               */\n  /*                                                                       */\n  /*    height ::                                                          */\n  /*      The glyph's height.                                              */\n  /*                                                                       */\n  /*    horiBearingX ::                                                    */\n  /*      Left side bearing for horizontal layout.                         */\n  /*                                                                       */\n  /*    horiBearingY ::                                                    */\n  /*      Top side bearing for horizontal layout.                          */\n  /*                                                                       */\n  /*    horiAdvance ::                                                     */\n  /*      Advance width for horizontal layout.                             */\n  /*                                                                       */\n  /*    vertBearingX ::                                                    */\n  /*      Left side bearing for vertical layout.                           */\n  /*                                                                       */\n  /*    vertBearingY ::                                                    */\n  /*      Top side bearing for vertical layout.  Larger positive values    */\n  /*      mean further below the vertical glyph origin.                    */\n  /*                                                                       */\n  /*    vertAdvance ::                                                     */\n  /*      Advance height for vertical layout.  Positive values mean the    */\n  /*      glyph has a positive advance downward.                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If not disabled with @FT_LOAD_NO_HINTING, the values represent     */\n  /*    dimensions of the hinted glyph (in case hinting is applicable).    */\n  /*                                                                       */\n  /*    Stroking a glyph with an outside border does not increase          */\n  /*    `horiAdvance' or `vertAdvance'; you have to manually adjust these  */\n  /*    values to account for the added width and height.                  */\n  /*                                                                       */\n  typedef struct  FT_Glyph_Metrics_\n  {\n    FT_Pos  width;\n    FT_Pos  height;\n\n    FT_Pos  horiBearingX;\n    FT_Pos  horiBearingY;\n    FT_Pos  horiAdvance;\n\n    FT_Pos  vertBearingX;\n    FT_Pos  vertBearingY;\n    FT_Pos  vertAdvance;\n\n  } FT_Glyph_Metrics;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Bitmap_Size                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This structure models the metrics of a bitmap strike (i.e., a set  */\n  /*    of glyphs for a given point size and resolution) in a bitmap font. */\n  /*    It is used for the `available_sizes' field of @FT_Face.            */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    height :: The vertical distance, in pixels, between two            */\n  /*              consecutive baselines.  It is always positive.           */\n  /*                                                                       */\n  /*    width  :: The average width, in pixels, of all glyphs in the       */\n  /*              strike.                                                  */\n  /*                                                                       */\n  /*    size   :: The nominal size of the strike in 26.6 fractional        */\n  /*              points.  This field is not very useful.                  */\n  /*                                                                       */\n  /*    x_ppem :: The horizontal ppem (nominal width) in 26.6 fractional   */\n  /*              pixels.                                                  */\n  /*                                                                       */\n  /*    y_ppem :: The vertical ppem (nominal height) in 26.6 fractional    */\n  /*              pixels.                                                  */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Windows FNT:                                                       */\n  /*      The nominal size given in a FNT font is not reliable.  Thus when */\n  /*      the driver finds it incorrect, it sets `size' to some calculated */\n  /*      values and sets `x_ppem' and `y_ppem' to the pixel width and     */\n  /*      height given in the font, respectively.                          */\n  /*                                                                       */\n  /*    TrueType embedded bitmaps:                                         */\n  /*      `size', `width', and `height' values are not contained in the    */\n  /*      bitmap strike itself.  They are computed from the global font    */\n  /*      parameters.                                                      */\n  /*                                                                       */\n  typedef struct  FT_Bitmap_Size_\n  {\n    FT_Short  height;\n    FT_Short  width;\n\n    FT_Pos    size;\n\n    FT_Pos    x_ppem;\n    FT_Pos    y_ppem;\n\n  } FT_Bitmap_Size;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*                                                                       */\n  /*                     O B J E C T   C L A S S E S                       */\n  /*                                                                       */\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Library                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a FreeType library instance.  Each `library' is        */\n  /*    completely independent from the others; it is the `root' of a set  */\n  /*    of objects like fonts, faces, sizes, etc.                          */\n  /*                                                                       */\n  /*    It also embeds a memory manager (see @FT_Memory), as well as a     */\n  /*    scan-line converter object (see @FT_Raster).                       */\n  /*                                                                       */\n  /*    In multi-threaded applications, make sure that the same FT_Library */\n  /*    object or any of its children doesn't get accessed in parallel.    */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Library objects are normally created by @FT_Init_FreeType, and     */\n  /*    destroyed with @FT_Done_FreeType.  If you need reference-counting  */\n  /*    (cf. @FT_Reference_Library), use @FT_New_Library and               */\n  /*    @FT_Done_Library.                                                  */\n  /*                                                                       */\n  typedef struct FT_LibraryRec_  *FT_Library;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Module                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a given FreeType module object.  Each module can be a  */\n  /*    font driver, a renderer, or anything else that provides services   */\n  /*    to the formers.                                                    */\n  /*                                                                       */\n  typedef struct FT_ModuleRec_*  FT_Module;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Driver                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a given FreeType font driver object.  Each font driver */\n  /*    is a special module capable of creating faces from font files.     */\n  /*                                                                       */\n  typedef struct FT_DriverRec_*  FT_Driver;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Renderer                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a given FreeType renderer.  A renderer is a special    */\n  /*    module in charge of converting a glyph image to a bitmap, when     */\n  /*    necessary.  Each renderer supports a given glyph image format, and */\n  /*    one or more target surface depths.                                 */\n  /*                                                                       */\n  typedef struct FT_RendererRec_*  FT_Renderer;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Face                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a given typographic face object.  A face object models */\n  /*    a given typeface, in a given style.                                */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Each face object also owns a single @FT_GlyphSlot object, as well  */\n  /*    as one or more @FT_Size objects.                                   */\n  /*                                                                       */\n  /*    Use @FT_New_Face or @FT_Open_Face to create a new face object from */\n  /*    a given filepathname or a custom input stream.                     */\n  /*                                                                       */\n  /*    Use @FT_Done_Face to destroy it (along with its slot and sizes).   */\n  /*                                                                       */\n  /* <Also>                                                                */\n  /*    See @FT_FaceRec for the publicly accessible fields of a given face */\n  /*    object.                                                            */\n  /*                                                                       */\n  typedef struct FT_FaceRec_*  FT_Face;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Size                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to an object used to model a face scaled to a given       */\n  /*    character size.                                                    */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Each @FT_Face has an _active_ @FT_Size object that is used by      */\n  /*    functions like @FT_Load_Glyph to determine the scaling             */\n  /*    transformation which is used to load and hint glyphs and metrics.  */\n  /*                                                                       */\n  /*    You can use @FT_Set_Char_Size, @FT_Set_Pixel_Sizes,                */\n  /*    @FT_Request_Size or even @FT_Select_Size to change the content     */\n  /*    (i.e., the scaling values) of the active @FT_Size.                 */\n  /*                                                                       */\n  /*    You can use @FT_New_Size to create additional size objects for a   */\n  /*    given @FT_Face, but they won't be used by other functions until    */\n  /*    you activate it through @FT_Activate_Size.  Only one size can be   */\n  /*    activated at any given time per face.                              */\n  /*                                                                       */\n  /* <Also>                                                                */\n  /*    See @FT_SizeRec for the publicly accessible fields of a given size */\n  /*    object.                                                            */\n  /*                                                                       */\n  typedef struct FT_SizeRec_*  FT_Size;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_GlyphSlot                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a given `glyph slot'.  A slot is a container where it  */\n  /*    is possible to load any of the glyphs contained in its parent      */\n  /*    face.                                                              */\n  /*                                                                       */\n  /*    In other words, each time you call @FT_Load_Glyph or               */\n  /*    @FT_Load_Char, the slot's content is erased by the new glyph data, */\n  /*    i.e., the glyph's metrics, its image (bitmap or outline), and      */\n  /*    other control information.                                         */\n  /*                                                                       */\n  /* <Also>                                                                */\n  /*    See @FT_GlyphSlotRec for the publicly accessible glyph fields.     */\n  /*                                                                       */\n  typedef struct FT_GlyphSlotRec_*  FT_GlyphSlot;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_CharMap                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a given character map.  A charmap is used to translate */\n  /*    character codes in a given encoding into glyph indexes for its     */\n  /*    parent's face.  Some font formats may provide several charmaps per */\n  /*    font.                                                              */\n  /*                                                                       */\n  /*    Each face object owns zero or more charmaps, but only one of them  */\n  /*    can be `active' and used by @FT_Get_Char_Index or @FT_Load_Char.   */\n  /*                                                                       */\n  /*    The list of available charmaps in a face is available through the  */\n  /*    `face->num_charmaps' and `face->charmaps' fields of @FT_FaceRec.   */\n  /*                                                                       */\n  /*    The currently active charmap is available as `face->charmap'.      */\n  /*    You should call @FT_Set_Charmap to change it.                      */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    When a new face is created (either through @FT_New_Face or         */\n  /*    @FT_Open_Face), the library looks for a Unicode charmap within     */\n  /*    the list and automatically activates it.                           */\n  /*                                                                       */\n  /* <Also>                                                                */\n  /*    See @FT_CharMapRec for the publicly accessible fields of a given   */\n  /*    character map.                                                     */\n  /*                                                                       */\n  typedef struct FT_CharMapRec_*  FT_CharMap;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_ENC_TAG                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This macro converts four-letter tags into an unsigned long.  It is */\n  /*    used to define `encoding' identifiers (see @FT_Encoding).          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Since many 16-bit compilers don't like 32-bit enumerations, you    */\n  /*    should redefine this macro in case of problems to something like   */\n  /*    this:                                                              */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      #define FT_ENC_TAG( value, a, b, c, d )  value                   */\n  /*    }                                                                  */\n  /*                                                                       */\n  /*    to get a simple enumeration without assigning special numbers.     */\n  /*                                                                       */\n\n#ifndef FT_ENC_TAG\n#define FT_ENC_TAG( value, a, b, c, d )         \\\n          value = ( ( (FT_UInt32)(a) << 24 ) |  \\\n                    ( (FT_UInt32)(b) << 16 ) |  \\\n                    ( (FT_UInt32)(c) <<  8 ) |  \\\n                      (FT_UInt32)(d)         )\n\n#endif /* FT_ENC_TAG */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Encoding                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration used to specify character sets supported by         */\n  /*    charmaps.  Used in the @FT_Select_Charmap API function.            */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Despite the name, this enumeration lists specific character        */\n  /*    repertories (i.e., charsets), and not text encoding methods (e.g., */\n  /*    UTF-8, UTF-16, etc.).                                              */\n  /*                                                                       */\n  /*    Other encodings might be defined in the future.                    */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_ENCODING_NONE ::                                                */\n  /*      The encoding value~0 is reserved.                                */\n  /*                                                                       */\n  /*    FT_ENCODING_UNICODE ::                                             */\n  /*      Corresponds to the Unicode character set.  This value covers     */\n  /*      all versions of the Unicode repertoire, including ASCII and      */\n  /*      Latin-1.  Most fonts include a Unicode charmap, but not all      */\n  /*      of them.                                                         */\n  /*                                                                       */\n  /*      For example, if you want to access Unicode value U+1F028 (and    */\n  /*      the font contains it), use value 0x1F028 as the input value for  */\n  /*      @FT_Get_Char_Index.                                              */\n  /*                                                                       */\n  /*    FT_ENCODING_MS_SYMBOL ::                                           */\n  /*      Corresponds to the Microsoft Symbol encoding, used to encode     */\n  /*      mathematical symbols in the 32..255 character code range.  For   */\n  /*      more information, see `http://www.ceviz.net/symbol.htm'.         */\n  /*                                                                       */\n  /*    FT_ENCODING_SJIS ::                                                */\n  /*      Corresponds to Japanese SJIS encoding.  More info at             */\n  /*      at `http://langsupport.japanreference.com/encoding.shtml'.       */\n  /*      See note on multi-byte encodings below.                          */\n  /*                                                                       */\n  /*    FT_ENCODING_GB2312 ::                                              */\n  /*      Corresponds to an encoding system for Simplified Chinese as used */\n  /*      used in mainland China.                                          */\n  /*                                                                       */\n  /*    FT_ENCODING_BIG5 ::                                                */\n  /*      Corresponds to an encoding system for Traditional Chinese as     */\n  /*      used in Taiwan and Hong Kong.                                    */\n  /*                                                                       */\n  /*    FT_ENCODING_WANSUNG ::                                             */\n  /*      Corresponds to the Korean encoding system known as Wansung.      */\n  /*      For more information see                                         */\n  /*      `http://www.microsoft.com/typography/unicode/949.txt'.           */\n  /*                                                                       */\n  /*    FT_ENCODING_JOHAB ::                                               */\n  /*      The Korean standard character set (KS~C 5601-1992), which        */\n  /*      corresponds to MS Windows code page 1361.  This character set    */\n  /*      includes all possible Hangeul character combinations.            */\n  /*                                                                       */\n  /*    FT_ENCODING_ADOBE_LATIN_1 ::                                       */\n  /*      Corresponds to a Latin-1 encoding as defined in a Type~1         */\n  /*      PostScript font.  It is limited to 256 character codes.          */\n  /*                                                                       */\n  /*    FT_ENCODING_ADOBE_STANDARD ::                                      */\n  /*      Corresponds to the Adobe Standard encoding, as found in Type~1,  */\n  /*      CFF, and OpenType/CFF fonts.  It is limited to 256 character     */\n  /*      codes.                                                           */\n  /*                                                                       */\n  /*    FT_ENCODING_ADOBE_EXPERT ::                                        */\n  /*      Corresponds to the Adobe Expert encoding, as found in Type~1,    */\n  /*      CFF, and OpenType/CFF fonts.  It is limited to 256 character     */\n  /*      codes.                                                           */\n  /*                                                                       */\n  /*    FT_ENCODING_ADOBE_CUSTOM ::                                        */\n  /*      Corresponds to a custom encoding, as found in Type~1, CFF, and   */\n  /*      OpenType/CFF fonts.  It is limited to 256 character codes.       */\n  /*                                                                       */\n  /*    FT_ENCODING_APPLE_ROMAN ::                                         */\n  /*      Corresponds to the 8-bit Apple roman encoding.  Many TrueType    */\n  /*      and OpenType fonts contain a charmap for this encoding, since    */\n  /*      older versions of Mac OS are able to use it.                     */\n  /*                                                                       */\n  /*    FT_ENCODING_OLD_LATIN_2 ::                                         */\n  /*      This value is deprecated and was never used nor reported by      */\n  /*      FreeType.  Don't use or test for it.                             */\n  /*                                                                       */\n  /*    FT_ENCODING_MS_SJIS ::                                             */\n  /*      Same as FT_ENCODING_SJIS.  Deprecated.                           */\n  /*                                                                       */\n  /*    FT_ENCODING_MS_GB2312 ::                                           */\n  /*      Same as FT_ENCODING_GB2312.  Deprecated.                         */\n  /*                                                                       */\n  /*    FT_ENCODING_MS_BIG5 ::                                             */\n  /*      Same as FT_ENCODING_BIG5.  Deprecated.                           */\n  /*                                                                       */\n  /*    FT_ENCODING_MS_WANSUNG ::                                          */\n  /*      Same as FT_ENCODING_WANSUNG.  Deprecated.                        */\n  /*                                                                       */\n  /*    FT_ENCODING_MS_JOHAB ::                                            */\n  /*      Same as FT_ENCODING_JOHAB.  Deprecated.                          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    By default, FreeType automatically synthesizes a Unicode charmap   */\n  /*    for PostScript fonts, using their glyph names dictionaries.        */\n  /*    However, it also reports the encodings defined explicitly in the   */\n  /*    font file, for the cases when they are needed, with the Adobe      */\n  /*    values as well.                                                    */\n  /*                                                                       */\n  /*    FT_ENCODING_NONE is set by the BDF and PCF drivers if the charmap  */\n  /*    is neither Unicode nor ISO-8859-1 (otherwise it is set to          */\n  /*    FT_ENCODING_UNICODE).  Use @FT_Get_BDF_Charset_ID to find out      */\n  /*    which encoding is really present.  If, for example, the            */\n  /*    `cs_registry' field is `KOI8' and the `cs_encoding' field is `R',  */\n  /*    the font is encoded in KOI8-R.                                     */\n  /*                                                                       */\n  /*    FT_ENCODING_NONE is always set (with a single exception) by the    */\n  /*    winfonts driver.  Use @FT_Get_WinFNT_Header and examine the        */\n  /*    `charset' field of the @FT_WinFNT_HeaderRec structure to find out  */\n  /*    which encoding is really present.  For example,                    */\n  /*    @FT_WinFNT_ID_CP1251 (204) means Windows code page 1251 (for       */\n  /*    Russian).                                                          */\n  /*                                                                       */\n  /*    FT_ENCODING_NONE is set if `platform_id' is @TT_PLATFORM_MACINTOSH */\n  /*    and `encoding_id' is not @TT_MAC_ID_ROMAN (otherwise it is set to  */\n  /*    FT_ENCODING_APPLE_ROMAN).                                          */\n  /*                                                                       */\n  /*    If `platform_id' is @TT_PLATFORM_MACINTOSH, use the function       */\n  /*    @FT_Get_CMap_Language_ID  to query the Mac language ID which may   */\n  /*    be needed to be able to distinguish Apple encoding variants.  See  */\n  /*                                                                       */\n  /*      http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/README.TXT  */\n  /*                                                                       */\n  /*    to get an idea how to do that.  Basically, if the language ID      */\n  /*    is~0, don't use it, otherwise subtract 1 from the language ID.     */\n  /*    Then examine `encoding_id'.  If, for example, `encoding_id' is     */\n  /*    @TT_MAC_ID_ROMAN and the language ID (minus~1) is                  */\n  /*    `TT_MAC_LANGID_GREEK', it is the Greek encoding, not Roman.        */\n  /*    @TT_MAC_ID_ARABIC with `TT_MAC_LANGID_FARSI' means the Farsi       */\n  /*    variant the Arabic encoding.                                       */\n  /*                                                                       */\n  typedef enum  FT_Encoding_\n  {\n    FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ),\n\n    FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ),\n    FT_ENC_TAG( FT_ENCODING_UNICODE,   'u', 'n', 'i', 'c' ),\n\n    FT_ENC_TAG( FT_ENCODING_SJIS,    's', 'j', 'i', 's' ),\n    FT_ENC_TAG( FT_ENCODING_GB2312,  'g', 'b', ' ', ' ' ),\n    FT_ENC_TAG( FT_ENCODING_BIG5,    'b', 'i', 'g', '5' ),\n    FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ),\n    FT_ENC_TAG( FT_ENCODING_JOHAB,   'j', 'o', 'h', 'a' ),\n\n    /* for backwards compatibility */\n    FT_ENCODING_MS_SJIS    = FT_ENCODING_SJIS,\n    FT_ENCODING_MS_GB2312  = FT_ENCODING_GB2312,\n    FT_ENCODING_MS_BIG5    = FT_ENCODING_BIG5,\n    FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG,\n    FT_ENCODING_MS_JOHAB   = FT_ENCODING_JOHAB,\n\n    FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ),\n    FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT,   'A', 'D', 'B', 'E' ),\n    FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM,   'A', 'D', 'B', 'C' ),\n    FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1,  'l', 'a', 't', '1' ),\n\n    FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ),\n\n    FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' )\n\n  } FT_Encoding;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    ft_encoding_xxx                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    These constants are deprecated; use the corresponding @FT_Encoding */\n  /*    values instead.                                                    */\n  /*                                                                       */\n#define ft_encoding_none            FT_ENCODING_NONE\n#define ft_encoding_unicode         FT_ENCODING_UNICODE\n#define ft_encoding_symbol          FT_ENCODING_MS_SYMBOL\n#define ft_encoding_latin_1         FT_ENCODING_ADOBE_LATIN_1\n#define ft_encoding_latin_2         FT_ENCODING_OLD_LATIN_2\n#define ft_encoding_sjis            FT_ENCODING_SJIS\n#define ft_encoding_gb2312          FT_ENCODING_GB2312\n#define ft_encoding_big5            FT_ENCODING_BIG5\n#define ft_encoding_wansung         FT_ENCODING_WANSUNG\n#define ft_encoding_johab           FT_ENCODING_JOHAB\n\n#define ft_encoding_adobe_standard  FT_ENCODING_ADOBE_STANDARD\n#define ft_encoding_adobe_expert    FT_ENCODING_ADOBE_EXPERT\n#define ft_encoding_adobe_custom    FT_ENCODING_ADOBE_CUSTOM\n#define ft_encoding_apple_roman     FT_ENCODING_APPLE_ROMAN\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_CharMapRec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The base charmap structure.                                        */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    face        :: A handle to the parent face object.                 */\n  /*                                                                       */\n  /*    encoding    :: An @FT_Encoding tag identifying the charmap.  Use   */\n  /*                   this with @FT_Select_Charmap.                       */\n  /*                                                                       */\n  /*    platform_id :: An ID number describing the platform for the        */\n  /*                   following encoding ID.  This comes directly from    */\n  /*                   the TrueType specification and should be emulated   */\n  /*                   for other formats.                                  */\n  /*                                                                       */\n  /*    encoding_id :: A platform specific encoding number.  This also     */\n  /*                   comes from the TrueType specification and should be */\n  /*                   emulated similarly.                                 */\n  /*                                                                       */\n  typedef struct  FT_CharMapRec_\n  {\n    FT_Face      face;\n    FT_Encoding  encoding;\n    FT_UShort    platform_id;\n    FT_UShort    encoding_id;\n\n  } FT_CharMapRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*                                                                       */\n  /*                 B A S E   O B J E C T   C L A S S E S                 */\n  /*                                                                       */\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Face_Internal                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An opaque handle to an `FT_Face_InternalRec' structure, used to    */\n  /*    model private data of a given @FT_Face object.                     */\n  /*                                                                       */\n  /*    This structure might change between releases of FreeType~2 and is  */\n  /*    not generally available to client applications.                    */\n  /*                                                                       */\n  typedef struct FT_Face_InternalRec_*  FT_Face_Internal;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_FaceRec                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    FreeType root face class structure.  A face object models a        */\n  /*    typeface in a font file.                                           */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    num_faces           :: The number of faces in the font file.  Some */\n  /*                           font formats can have multiple faces in     */\n  /*                           a font file.                                */\n  /*                                                                       */\n  /*    face_index          :: The index of the face in the font file.  It */\n  /*                           is set to~0 if there is only one face in    */\n  /*                           the font file.                              */\n  /*                                                                       */\n  /*    face_flags          :: A set of bit flags that give important      */\n  /*                           information about the face; see             */\n  /*                           @FT_FACE_FLAG_XXX for the details.          */\n  /*                                                                       */\n  /*    style_flags         :: A set of bit flags indicating the style of  */\n  /*                           the face; see @FT_STYLE_FLAG_XXX for the    */\n  /*                           details.                                    */\n  /*                                                                       */\n  /*    num_glyphs          :: The number of glyphs in the face.  If the   */\n  /*                           face is scalable and has sbits (see         */\n  /*                           `num_fixed_sizes'), it is set to the number */\n  /*                           of outline glyphs.                          */\n  /*                                                                       */\n  /*                           For CID-keyed fonts, this value gives the   */\n  /*                           highest CID used in the font.               */\n  /*                                                                       */\n  /*    family_name         :: The face's family name.  This is an ASCII   */\n  /*                           string, usually in English, which describes */\n  /*                           the typeface's family (like `Times New      */\n  /*                           Roman', `Bodoni', `Garamond', etc).  This   */\n  /*                           is a least common denominator used to list  */\n  /*                           fonts.  Some formats (TrueType & OpenType)  */\n  /*                           provide localized and Unicode versions of   */\n  /*                           this string.  Applications should use the   */\n  /*                           format specific interface to access them.   */\n  /*                           Can be NULL (e.g., in fonts embedded in a   */\n  /*                           PDF file).                                  */\n  /*                                                                       */\n  /*    style_name          :: The face's style name.  This is an ASCII    */\n  /*                           string, usually in English, which describes */\n  /*                           the typeface's style (like `Italic',        */\n  /*                           `Bold', `Condensed', etc).  Not all font    */\n  /*                           formats provide a style name, so this field */\n  /*                           is optional, and can be set to NULL.  As    */\n  /*                           for `family_name', some formats provide     */\n  /*                           localized and Unicode versions of this      */\n  /*                           string.  Applications should use the format */\n  /*                           specific interface to access them.          */\n  /*                                                                       */\n  /*    num_fixed_sizes     :: The number of bitmap strikes in the face.   */\n  /*                           Even if the face is scalable, there might   */\n  /*                           still be bitmap strikes, which are called   */\n  /*                           `sbits' in that case.                       */\n  /*                                                                       */\n  /*    available_sizes     :: An array of @FT_Bitmap_Size for all bitmap  */\n  /*                           strikes in the face.  It is set to NULL if  */\n  /*                           there is no bitmap strike.                  */\n  /*                                                                       */\n  /*    num_charmaps        :: The number of charmaps in the face.         */\n  /*                                                                       */\n  /*    charmaps            :: An array of the charmaps of the face.       */\n  /*                                                                       */\n  /*    generic             :: A field reserved for client uses.  See the  */\n  /*                           @FT_Generic type description.               */\n  /*                                                                       */\n  /*    bbox                :: The font bounding box.  Coordinates are     */\n  /*                           expressed in font units (see                */\n  /*                           `units_per_EM').  The box is large enough   */\n  /*                           to contain any glyph from the font.  Thus,  */\n  /*                           `bbox.yMax' can be seen as the `maximum     */\n  /*                           ascender', and `bbox.yMin' as the `minimum  */\n  /*                           descender'.  Only relevant for scalable     */\n  /*                           formats.                                    */\n  /*                                                                       */\n  /*                           Note that the bounding box might be off by  */\n  /*                           (at least) one pixel for hinted fonts.  See */\n  /*                           @FT_Size_Metrics for further discussion.    */\n  /*                                                                       */\n  /*    units_per_EM        :: The number of font units per EM square for  */\n  /*                           this face.  This is typically 2048 for      */\n  /*                           TrueType fonts, and 1000 for Type~1 fonts.  */\n  /*                           Only relevant for scalable formats.         */\n  /*                                                                       */\n  /*    ascender            :: The typographic ascender of the face,       */\n  /*                           expressed in font units.  For font formats  */\n  /*                           not having this information, it is set to   */\n  /*                           `bbox.yMax'.  Only relevant for scalable    */\n  /*                           formats.                                    */\n  /*                                                                       */\n  /*    descender           :: The typographic descender of the face,      */\n  /*                           expressed in font units.  For font formats  */\n  /*                           not having this information, it is set to   */\n  /*                           `bbox.yMin'.  Note that this field is       */\n  /*                           usually negative.  Only relevant for        */\n  /*                           scalable formats.                           */\n  /*                                                                       */\n  /*    height              :: This value is the vertical distance         */\n  /*                           between two consecutive baselines,          */\n  /*                           expressed in font units.  It is always      */\n  /*                           positive.  Only relevant for scalable       */\n  /*                           formats.                                    */\n  /*                                                                       */\n  /*                           If you want the global glyph height, use    */\n  /*                           `ascender - descender'.                     */\n  /*                                                                       */\n  /*    max_advance_width   :: The maximum advance width, in font units,   */\n  /*                           for all glyphs in this face.  This can be   */\n  /*                           used to make word wrapping computations     */\n  /*                           faster.  Only relevant for scalable         */\n  /*                           formats.                                    */\n  /*                                                                       */\n  /*    max_advance_height  :: The maximum advance height, in font units,  */\n  /*                           for all glyphs in this face.  This is only  */\n  /*                           relevant for vertical layouts, and is set   */\n  /*                           to `height' for fonts that do not provide   */\n  /*                           vertical metrics.  Only relevant for        */\n  /*                           scalable formats.                           */\n  /*                                                                       */\n  /*    underline_position  :: The position, in font units, of the         */\n  /*                           underline line for this face.  It is the    */\n  /*                           center of the underlining stem.  Only       */\n  /*                           relevant for scalable formats.              */\n  /*                                                                       */\n  /*    underline_thickness :: The thickness, in font units, of the        */\n  /*                           underline for this face.  Only relevant for */\n  /*                           scalable formats.                           */\n  /*                                                                       */\n  /*    glyph               :: The face's associated glyph slot(s).        */\n  /*                                                                       */\n  /*    size                :: The current active size for this face.      */\n  /*                                                                       */\n  /*    charmap             :: The current active charmap for this face.   */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Fields may be changed after a call to @FT_Attach_File or           */\n  /*    @FT_Attach_Stream.                                                 */\n  /*                                                                       */\n  typedef struct  FT_FaceRec_\n  {\n    FT_Long           num_faces;\n    FT_Long           face_index;\n\n    FT_Long           face_flags;\n    FT_Long           style_flags;\n\n    FT_Long           num_glyphs;\n\n    FT_String*        family_name;\n    FT_String*        style_name;\n\n    FT_Int            num_fixed_sizes;\n    FT_Bitmap_Size*   available_sizes;\n\n    FT_Int            num_charmaps;\n    FT_CharMap*       charmaps;\n\n#ifdef\t_FX_MANAGED_CODE_\n#define generic\t\tgeneric_data\n#endif\n\n    FT_Generic        generic;\n\n    /*# The following member variables (down to `underline_thickness') */\n    /*# are only relevant to scalable outlines; cf. @FT_Bitmap_Size    */\n    /*# for bitmap fonts.                                              */\n    FT_BBox           bbox;\n\n    FT_UShort         units_per_EM;\n    FT_Short          ascender;\n    FT_Short          descender;\n    FT_Short          height;\n\n    FT_Short          max_advance_width;\n    FT_Short          max_advance_height;\n\n    FT_Short          underline_position;\n    FT_Short          underline_thickness;\n\n    FT_GlyphSlot      glyph;\n    FT_Size           size;\n    FT_CharMap        charmap;\n\n    /*@private begin */\n\n    FT_Driver         driver;\n    FT_Memory         memory;\n    FT_Stream         stream;\n\n    FT_ListRec        sizes_list;\n\n    FT_Generic        autohint;   /* face-specific auto-hinter data */\n    void*             extensions; /* unused                         */\n\n    FT_Face_Internal  internal;\n\n    /*@private end */\n\n  } FT_FaceRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_FACE_FLAG_XXX                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A list of bit flags used in the `face_flags' field of the          */\n  /*    @FT_FaceRec structure.  They inform client applications of         */\n  /*    properties of the corresponding face.                              */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_FACE_FLAG_SCALABLE ::                                           */\n  /*      Indicates that the face contains outline glyphs.  This doesn't   */\n  /*      prevent bitmap strikes, i.e., a face can have both this and      */\n  /*      and @FT_FACE_FLAG_FIXED_SIZES set.                               */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_FIXED_SIZES ::                                        */\n  /*      Indicates that the face contains bitmap strikes.  See also the   */\n  /*      `num_fixed_sizes' and `available_sizes' fields of @FT_FaceRec.   */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_FIXED_WIDTH ::                                        */\n  /*      Indicates that the face contains fixed-width characters (like    */\n  /*      Courier, Lucido, MonoType, etc.).                                */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_SFNT ::                                               */\n  /*      Indicates that the face uses the `sfnt' storage scheme.  For     */\n  /*      now, this means TrueType and OpenType.                           */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_HORIZONTAL ::                                         */\n  /*      Indicates that the face contains horizontal glyph metrics.  This */\n  /*      should be set for all common formats.                            */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_VERTICAL ::                                           */\n  /*      Indicates that the face contains vertical glyph metrics.  This   */\n  /*      is only available in some formats, not all of them.              */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_KERNING ::                                            */\n  /*      Indicates that the face contains kerning information.  If set,   */\n  /*      the kerning distance can be retrieved through the function       */\n  /*      @FT_Get_Kerning.  Otherwise the function always return the       */\n  /*      vector (0,0).  Note that FreeType doesn't handle kerning data    */\n  /*      from the `GPOS' table (as present in some OpenType fonts).       */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_FAST_GLYPHS ::                                        */\n  /*      THIS FLAG IS DEPRECATED.  DO NOT USE OR TEST IT.                 */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_MULTIPLE_MASTERS ::                                   */\n  /*      Indicates that the font contains multiple masters and is capable */\n  /*      of interpolating between them.  See the multiple-masters         */\n  /*      specific API for details.                                        */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_GLYPH_NAMES ::                                        */\n  /*      Indicates that the font contains glyph names that can be         */\n  /*      retrieved through @FT_Get_Glyph_Name.  Note that some TrueType   */\n  /*      fonts contain broken glyph name tables.  Use the function        */\n  /*      @FT_Has_PS_Glyph_Names when needed.                              */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_EXTERNAL_STREAM ::                                    */\n  /*      Used internally by FreeType to indicate that a face's stream was */\n  /*      provided by the client application and should not be destroyed   */\n  /*      when @FT_Done_Face is called.  Don't read or test this flag.     */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_HINTER ::                                             */\n  /*      Set if the font driver has a hinting machine of its own.  For    */\n  /*      example, with TrueType fonts, it makes sense to use data from    */\n  /*      the SFNT `gasp' table only if the native TrueType hinting engine */\n  /*      (with the bytecode interpreter) is available and active.         */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_CID_KEYED ::                                          */\n  /*      Set if the font is CID-keyed.  In that case, the font is not     */\n  /*      accessed by glyph indices but by CID values.  For subsetted      */\n  /*      CID-keyed fonts this has the consequence that not all index      */\n  /*      values are a valid argument to FT_Load_Glyph.  Only the CID      */\n  /*      values for which corresponding glyphs in the subsetted font      */\n  /*      exist make FT_Load_Glyph return successfully; in all other cases */\n  /*      you get an `FT_Err_Invalid_Argument' error.                      */\n  /*                                                                       */\n  /*      Note that CID-keyed fonts which are in an SFNT wrapper don't     */\n  /*      have this flag set since the glyphs are accessed in the normal   */\n  /*      way (using contiguous indices); the `CID-ness' isn't visible to  */\n  /*      the application.                                                 */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_TRICKY ::                                             */\n  /*      Set if the font is `tricky', this is, it always needs the        */\n  /*      font format's native hinting engine to get a reasonable result.  */\n  /*      A typical example is the Chinese font `mingli.ttf' which uses    */\n  /*      TrueType bytecode instructions to move and scale all of its      */\n  /*      subglyphs.                                                       */\n  /*                                                                       */\n  /*      It is not possible to autohint such fonts using                  */\n  /*      @FT_LOAD_FORCE_AUTOHINT; it will also ignore                     */\n  /*      @FT_LOAD_NO_HINTING.  You have to set both @FT_LOAD_NO_HINTING   */\n  /*      and @FT_LOAD_NO_AUTOHINT to really disable hinting; however, you */\n  /*      probably never want this except for demonstration purposes.      */\n  /*                                                                       */\n  /*      Currently, there are about a dozen TrueType fonts in the list of */\n  /*      tricky fonts; they are hard-coded in file `ttobjs.c'.            */\n  /*                                                                       */\n#define FT_FACE_FLAG_SCALABLE          ( 1L <<  0 )\n#define FT_FACE_FLAG_FIXED_SIZES       ( 1L <<  1 )\n#define FT_FACE_FLAG_FIXED_WIDTH       ( 1L <<  2 )\n#define FT_FACE_FLAG_SFNT              ( 1L <<  3 )\n#define FT_FACE_FLAG_HORIZONTAL        ( 1L <<  4 )\n#define FT_FACE_FLAG_VERTICAL          ( 1L <<  5 )\n#define FT_FACE_FLAG_KERNING           ( 1L <<  6 )\n#define FT_FACE_FLAG_FAST_GLYPHS       ( 1L <<  7 )\n#define FT_FACE_FLAG_MULTIPLE_MASTERS  ( 1L <<  8 )\n#define FT_FACE_FLAG_GLYPH_NAMES       ( 1L <<  9 )\n#define FT_FACE_FLAG_EXTERNAL_STREAM   ( 1L << 10 )\n#define FT_FACE_FLAG_HINTER            ( 1L << 11 )\n#define FT_FACE_FLAG_CID_KEYED         ( 1L << 12 )\n#define FT_FACE_FLAG_TRICKY            ( 1L << 13 )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_HAS_HORIZONTAL( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains\n   *   horizontal metrics (this is true for all font formats though).\n   *\n   * @also:\n   *   @FT_HAS_VERTICAL can be used to check for vertical metrics.\n   *\n   */\n#define FT_HAS_HORIZONTAL( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_HORIZONTAL )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_HAS_VERTICAL( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains real\n   *   vertical metrics (and not only synthesized ones).\n   *\n   */\n#define FT_HAS_VERTICAL( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_VERTICAL )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_HAS_KERNING( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains kerning\n   *   data that can be accessed with @FT_Get_Kerning.\n   *\n   */\n#define FT_HAS_KERNING( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_KERNING )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_IS_SCALABLE( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains a scalable\n   *   font face (true for TrueType, Type~1, Type~42, CID, OpenType/CFF,\n   *   and PFR font formats.\n   *\n   */\n#define FT_IS_SCALABLE( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_SCALABLE )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_IS_SFNT( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains a font\n   *   whose format is based on the SFNT storage scheme.  This usually\n   *   means: TrueType fonts, OpenType fonts, as well as SFNT-based embedded\n   *   bitmap fonts.\n   *\n   *   If this macro is true, all functions defined in @FT_SFNT_NAMES_H and\n   *   @FT_TRUETYPE_TABLES_H are available.\n   *\n   */\n#define FT_IS_SFNT( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_SFNT )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_IS_FIXED_WIDTH( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains a font face\n   *   that contains fixed-width (or `monospace', `fixed-pitch', etc.)\n   *   glyphs.\n   *\n   */\n#define FT_IS_FIXED_WIDTH( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_FIXED_WIDTH )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_HAS_FIXED_SIZES( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains some\n   *   embedded bitmaps.  See the `available_sizes' field of the\n   *   @FT_FaceRec structure.\n   *\n   */\n#define FT_HAS_FIXED_SIZES( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_FIXED_SIZES )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_HAS_FAST_GLYPHS( face )\n   *\n   * @description:\n   *   Deprecated.\n   *\n   */\n#define FT_HAS_FAST_GLYPHS( face )  0\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_HAS_GLYPH_NAMES( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains some glyph\n   *   names that can be accessed through @FT_Get_Glyph_Name.\n   *\n   */\n#define FT_HAS_GLYPH_NAMES( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_HAS_MULTIPLE_MASTERS( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains some\n   *   multiple masters.  The functions provided by @FT_MULTIPLE_MASTERS_H\n   *   are then available to choose the exact design you want.\n   *\n   */\n#define FT_HAS_MULTIPLE_MASTERS( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_IS_CID_KEYED( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains a CID-keyed\n   *   font.  See the discussion of @FT_FACE_FLAG_CID_KEYED for more\n   *   details.\n   *\n   *   If this macro is true, all functions defined in @FT_CID_H are\n   *   available.\n   *\n   */\n#define FT_IS_CID_KEYED( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_CID_KEYED )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_IS_TRICKY( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face represents a `tricky' font.\n   *   See the discussion of @FT_FACE_FLAG_TRICKY for more details.\n   *\n   */\n#define FT_IS_TRICKY( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_TRICKY )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Const>                                                               */\n  /*    FT_STYLE_FLAG_XXX                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A list of bit-flags used to indicate the style of a given face.    */\n  /*    These are used in the `style_flags' field of @FT_FaceRec.          */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_STYLE_FLAG_ITALIC ::                                            */\n  /*      Indicates that a given face style is italic or oblique.          */\n  /*                                                                       */\n  /*    FT_STYLE_FLAG_BOLD ::                                              */\n  /*      Indicates that a given face is bold.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The style information as provided by FreeType is very basic.  More */\n  /*    details are beyond the scope and should be done on a higher level  */\n  /*    (for example, by analyzing various fields of the `OS/2' table in   */\n  /*    SFNT based fonts).                                                 */\n  /*                                                                       */\n#define FT_STYLE_FLAG_ITALIC  ( 1 << 0 )\n#define FT_STYLE_FLAG_BOLD    ( 1 << 1 )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Size_Internal                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An opaque handle to an `FT_Size_InternalRec' structure, used to    */\n  /*    model private data of a given @FT_Size object.                     */\n  /*                                                                       */\n  typedef struct FT_Size_InternalRec_*  FT_Size_Internal;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Size_Metrics                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The size metrics structure gives the metrics of a size object.     */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    x_ppem       :: The width of the scaled EM square in pixels, hence */\n  /*                    the term `ppem' (pixels per EM).  It is also       */\n  /*                    referred to as `nominal width'.                    */\n  /*                                                                       */\n  /*    y_ppem       :: The height of the scaled EM square in pixels,      */\n  /*                    hence the term `ppem' (pixels per EM).  It is also */\n  /*                    referred to as `nominal height'.                   */\n  /*                                                                       */\n  /*    x_scale      :: A 16.16 fractional scaling value used to convert   */\n  /*                    horizontal metrics from font units to 26.6         */\n  /*                    fractional pixels.  Only relevant for scalable     */\n  /*                    font formats.                                      */\n  /*                                                                       */\n  /*    y_scale      :: A 16.16 fractional scaling value used to convert   */\n  /*                    vertical metrics from font units to 26.6           */\n  /*                    fractional pixels.  Only relevant for scalable     */\n  /*                    font formats.                                      */\n  /*                                                                       */\n  /*    ascender     :: The ascender in 26.6 fractional pixels.  See       */\n  /*                    @FT_FaceRec for the details.                       */\n  /*                                                                       */\n  /*    descender    :: The descender in 26.6 fractional pixels.  See      */\n  /*                    @FT_FaceRec for the details.                       */\n  /*                                                                       */\n  /*    height       :: The height in 26.6 fractional pixels.  See         */\n  /*                    @FT_FaceRec for the details.                       */\n  /*                                                                       */\n  /*    max_advance  :: The maximum advance width in 26.6 fractional       */\n  /*                    pixels.  See @FT_FaceRec for the details.          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The scaling values, if relevant, are determined first during a     */\n  /*    size changing operation.  The remaining fields are then set by the */\n  /*    driver.  For scalable formats, they are usually set to scaled      */\n  /*    values of the corresponding fields in @FT_FaceRec.                 */\n  /*                                                                       */\n  /*    Note that due to glyph hinting, these values might not be exact    */\n  /*    for certain fonts.  Thus they must be treated as unreliable        */\n  /*    with an error margin of at least one pixel!                        */\n  /*                                                                       */\n  /*    Indeed, the only way to get the exact metrics is to render _all_   */\n  /*    glyphs.  As this would be a definite performance hit, it is up to  */\n  /*    client applications to perform such computations.                  */\n  /*                                                                       */\n  /*    The FT_Size_Metrics structure is valid for bitmap fonts also.      */\n  /*                                                                       */\n  typedef struct  FT_Size_Metrics_\n  {\n    FT_UShort  x_ppem;      /* horizontal pixels per EM               */\n    FT_UShort  y_ppem;      /* vertical pixels per EM                 */\n\n    FT_Fixed   x_scale;     /* scaling values used to convert font    */\n    FT_Fixed   y_scale;     /* units to 26.6 fractional pixels        */\n\n    FT_Pos     ascender;    /* ascender in 26.6 frac. pixels          */\n    FT_Pos     descender;   /* descender in 26.6 frac. pixels         */\n    FT_Pos     height;      /* text height in 26.6 frac. pixels       */\n    FT_Pos     max_advance; /* max horizontal advance, in 26.6 pixels */\n\n  } FT_Size_Metrics;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_SizeRec                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    FreeType root size class structure.  A size object models a face   */\n  /*    object at a given size.                                            */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    face    :: Handle to the parent face object.                       */\n  /*                                                                       */\n  /*    generic :: A typeless pointer, which is unused by the FreeType     */\n  /*               library or any of its drivers.  It can be used by       */\n  /*               client applications to link their own data to each size */\n  /*               object.                                                 */\n  /*                                                                       */\n  /*    metrics :: Metrics for this size object.  This field is read-only. */\n  /*                                                                       */\n  typedef struct  FT_SizeRec_\n  {\n    FT_Face           face;      /* parent face object              */\n    FT_Generic        generic;   /* generic pointer for client uses */\n    FT_Size_Metrics   metrics;   /* size metrics                    */\n    FT_Size_Internal  internal;\n\n  } FT_SizeRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_SubGlyph                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The subglyph structure is an internal object used to describe      */\n  /*    subglyphs (for example, in the case of composites).                */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The subglyph implementation is not part of the high-level API,     */\n  /*    hence the forward structure declaration.                           */\n  /*                                                                       */\n  /*    You can however retrieve subglyph information with                 */\n  /*    @FT_Get_SubGlyph_Info.                                             */\n  /*                                                                       */\n  typedef struct FT_SubGlyphRec_*  FT_SubGlyph;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Slot_Internal                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An opaque handle to an `FT_Slot_InternalRec' structure, used to    */\n  /*    model private data of a given @FT_GlyphSlot object.                */\n  /*                                                                       */\n  typedef struct FT_Slot_InternalRec_*  FT_Slot_Internal;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_GlyphSlotRec                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    FreeType root glyph slot class structure.  A glyph slot is a       */\n  /*    container where individual glyphs can be loaded, be they in        */\n  /*    outline or bitmap format.                                          */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    library           :: A handle to the FreeType library instance     */\n  /*                         this slot belongs to.                         */\n  /*                                                                       */\n  /*    face              :: A handle to the parent face object.           */\n  /*                                                                       */\n  /*    next              :: In some cases (like some font tools), several */\n  /*                         glyph slots per face object can be a good     */\n  /*                         thing.  As this is rare, the glyph slots are  */\n  /*                         listed through a direct, single-linked list   */\n  /*                         using its `next' field.                       */\n  /*                                                                       */\n  /*    generic           :: A typeless pointer which is unused by the     */\n  /*                         FreeType library or any of its drivers.  It   */\n  /*                         can be used by client applications to link    */\n  /*                         their own data to each glyph slot object.     */\n  /*                                                                       */\n  /*    metrics           :: The metrics of the last loaded glyph in the   */\n  /*                         slot.  The returned values depend on the last */\n  /*                         load flags (see the @FT_Load_Glyph API        */\n  /*                         function) and can be expressed either in 26.6 */\n  /*                         fractional pixels or font units.              */\n  /*                                                                       */\n  /*                         Note that even when the glyph image is        */\n  /*                         transformed, the metrics are not.             */\n  /*                                                                       */\n  /*    linearHoriAdvance :: The advance width of the unhinted glyph.      */\n  /*                         Its value is expressed in 16.16 fractional    */\n  /*                         pixels, unless @FT_LOAD_LINEAR_DESIGN is set  */\n  /*                         when loading the glyph.  This field can be    */\n  /*                         important to perform correct WYSIWYG layout.  */\n  /*                         Only relevant for outline glyphs.             */\n  /*                                                                       */\n  /*    linearVertAdvance :: The advance height of the unhinted glyph.     */\n  /*                         Its value is expressed in 16.16 fractional    */\n  /*                         pixels, unless @FT_LOAD_LINEAR_DESIGN is set  */\n  /*                         when loading the glyph.  This field can be    */\n  /*                         important to perform correct WYSIWYG layout.  */\n  /*                         Only relevant for outline glyphs.             */\n  /*                                                                       */\n  /*    advance           :: This shorthand is, depending on               */\n  /*                         @FT_LOAD_IGNORE_TRANSFORM, the transformed    */\n  /*                         advance width for the glyph (in 26.6          */\n  /*                         fractional pixel format).  As specified with  */\n  /*                         @FT_LOAD_VERTICAL_LAYOUT, it uses either the  */\n  /*                         `horiAdvance' or the `vertAdvance' value of   */\n  /*                         `metrics' field.                              */\n  /*                                                                       */\n  /*    format            :: This field indicates the format of the image  */\n  /*                         contained in the glyph slot.  Typically       */\n  /*                         @FT_GLYPH_FORMAT_BITMAP,                      */\n  /*                         @FT_GLYPH_FORMAT_OUTLINE, or                  */\n  /*                         @FT_GLYPH_FORMAT_COMPOSITE, but others are    */\n  /*                         possible.                                     */\n  /*                                                                       */\n  /*    bitmap            :: This field is used as a bitmap descriptor     */\n  /*                         when the slot format is                       */\n  /*                         @FT_GLYPH_FORMAT_BITMAP.  Note that the       */\n  /*                         address and content of the bitmap buffer can  */\n  /*                         change between calls of @FT_Load_Glyph and a  */\n  /*                         few other functions.                          */\n  /*                                                                       */\n  /*    bitmap_left       :: This is the bitmap's left bearing expressed   */\n  /*                         in integer pixels.  Of course, this is only   */\n  /*                         valid if the format is                        */\n  /*                         @FT_GLYPH_FORMAT_BITMAP.                      */\n  /*                                                                       */\n  /*    bitmap_top        :: This is the bitmap's top bearing expressed in */\n  /*                         integer pixels.  Remember that this is the    */\n  /*                         distance from the baseline to the top-most    */\n  /*                         glyph scanline, upwards y~coordinates being   */\n  /*                         *positive*.                                   */\n  /*                                                                       */\n  /*    outline           :: The outline descriptor for the current glyph  */\n  /*                         image if its format is                        */\n  /*                         @FT_GLYPH_FORMAT_OUTLINE.  Once a glyph is    */\n  /*                         loaded, `outline' can be transformed,         */\n  /*                         distorted, embolded, etc.  However, it must   */\n  /*                         not be freed.                                 */\n  /*                                                                       */\n  /*    num_subglyphs     :: The number of subglyphs in a composite glyph. */\n  /*                         This field is only valid for the composite    */\n  /*                         glyph format that should normally only be     */\n  /*                         loaded with the @FT_LOAD_NO_RECURSE flag.     */\n  /*                         For now this is internal to FreeType.         */\n  /*                                                                       */\n  /*    subglyphs         :: An array of subglyph descriptors for          */\n  /*                         composite glyphs.  There are `num_subglyphs'  */\n  /*                         elements in there.  Currently internal to     */\n  /*                         FreeType.                                     */\n  /*                                                                       */\n  /*    control_data      :: Certain font drivers can also return the      */\n  /*                         control data for a given glyph image (e.g.    */\n  /*                         TrueType bytecode, Type~1 charstrings, etc.). */\n  /*                         This field is a pointer to such data.         */\n  /*                                                                       */\n  /*    control_len       :: This is the length in bytes of the control    */\n  /*                         data.                                         */\n  /*                                                                       */\n  /*    other             :: Really wicked formats can use this pointer to */\n  /*                         present their own glyph image to client       */\n  /*                         applications.  Note that the application      */\n  /*                         needs to know about the image format.         */\n  /*                                                                       */\n  /*    lsb_delta         :: The difference between hinted and unhinted    */\n  /*                         left side bearing while autohinting is        */\n  /*                         active.  Zero otherwise.                      */\n  /*                                                                       */\n  /*    rsb_delta         :: The difference between hinted and unhinted    */\n  /*                         right side bearing while autohinting is       */\n  /*                         active.  Zero otherwise.                      */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If @FT_Load_Glyph is called with default flags (see                */\n  /*    @FT_LOAD_DEFAULT) the glyph image is loaded in the glyph slot in   */\n  /*    its native format (e.g., an outline glyph for TrueType and Type~1  */\n  /*    formats).                                                          */\n  /*                                                                       */\n  /*    This image can later be converted into a bitmap by calling         */\n  /*    @FT_Render_Glyph.  This function finds the current renderer for    */\n  /*    the native image's format, then invokes it.                        */\n  /*                                                                       */\n  /*    The renderer is in charge of transforming the native image through */\n  /*    the slot's face transformation fields, then converting it into a   */\n  /*    bitmap that is returned in `slot->bitmap'.                         */\n  /*                                                                       */\n  /*    Note that `slot->bitmap_left' and `slot->bitmap_top' are also used */\n  /*    to specify the position of the bitmap relative to the current pen  */\n  /*    position (e.g., coordinates (0,0) on the baseline).  Of course,    */\n  /*    `slot->format' is also changed to @FT_GLYPH_FORMAT_BITMAP.         */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Here a small pseudo code fragment which shows how to use           */\n  /*    `lsb_delta' and `rsb_delta':                                       */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      FT_Pos  origin_x       = 0;                                      */\n  /*      FT_Pos  prev_rsb_delta = 0;                                      */\n  /*                                                                       */\n  /*                                                                       */\n  /*      for all glyphs do                                                */\n  /*        <compute kern between current and previous glyph and add it to */\n  /*         `origin_x'>                                                   */\n  /*                                                                       */\n  /*        <load glyph with `FT_Load_Glyph'>                              */\n  /*                                                                       */\n  /*        if ( prev_rsb_delta - face->glyph->lsb_delta >= 32 )           */\n  /*          origin_x -= 64;                                              */\n  /*        else if ( prev_rsb_delta - face->glyph->lsb_delta < -32 )      */\n  /*          origin_x += 64;                                              */\n  /*                                                                       */\n  /*        prev_rsb_delta = face->glyph->rsb_delta;                       */\n  /*                                                                       */\n  /*        <save glyph image, or render glyph, or ...>                    */\n  /*                                                                       */\n  /*        origin_x += face->glyph->advance.x;                            */\n  /*      endfor                                                           */\n  /*    }                                                                  */\n  /*                                                                       */\n  typedef struct  FT_GlyphSlotRec_\n  {\n    FT_Library        library;\n    FT_Face           face;\n    FT_GlyphSlot      next;\n    FT_UInt           reserved;       /* retained for binary compatibility */\n    FT_Generic        generic;\n\n    FT_Glyph_Metrics  metrics;\n    FT_Fixed          linearHoriAdvance;\n    FT_Fixed          linearVertAdvance;\n    FT_Vector         advance;\n\n    FT_Glyph_Format   format;\n\n    FT_Bitmap         bitmap;\n    FT_Int            bitmap_left;\n    FT_Int            bitmap_top;\n\n    FT_Outline        outline;\n\n    FT_UInt           num_subglyphs;\n    FT_SubGlyph       subglyphs;\n\n    void*             control_data;\n    long              control_len;\n\n    FT_Pos            lsb_delta;\n    FT_Pos            rsb_delta;\n\n    void*             other;\n\n    FT_Slot_Internal  internal;\n\n  } FT_GlyphSlotRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*                                                                       */\n  /*                         F U N C T I O N S                             */\n  /*                                                                       */\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Init_FreeType                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initialize a new FreeType library object.  The set of modules      */\n  /*    that are registered by this function is determined at build time.  */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    alibrary :: A handle to a new library object.                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    In case you want to provide your own memory allocating routines,   */\n  /*    use @FT_New_Library instead, followed by a call to                 */\n  /*    @FT_Add_Default_Modules (or a series of calls to @FT_Add_Module).  */\n  /*                                                                       */\n  /*    For multi-threading applications each thread should have its own   */\n  /*    FT_Library object.                                                 */\n  /*                                                                       */\n  /*    If you need reference-counting (cf. @FT_Reference_Library), use    */\n  /*    @FT_New_Library and @FT_Done_Library.                              */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Init_FreeType( FT_Library  *alibrary );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Done_FreeType                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Destroy a given FreeType library object and all of its children,   */\n  /*    including resources, drivers, faces, sizes, etc.                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle to the target library object.                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Done_FreeType( FT_Library  library );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_OPEN_XXX                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A list of bit-field constants used within the `flags' field of the */\n  /*    @FT_Open_Args structure.                                           */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_OPEN_MEMORY   :: This is a memory-based stream.                 */\n  /*                                                                       */\n  /*    FT_OPEN_STREAM   :: Copy the stream from the `stream' field.       */\n  /*                                                                       */\n  /*    FT_OPEN_PATHNAME :: Create a new input stream from a C~path        */\n  /*                        name.                                          */\n  /*                                                                       */\n  /*    FT_OPEN_DRIVER   :: Use the `driver' field.                        */\n  /*                                                                       */\n  /*    FT_OPEN_PARAMS   :: Use the `num_params' and `params' fields.      */\n  /*                                                                       */\n  /*    ft_open_memory   :: Deprecated; use @FT_OPEN_MEMORY instead.       */\n  /*                                                                       */\n  /*    ft_open_stream   :: Deprecated; use @FT_OPEN_STREAM instead.       */\n  /*                                                                       */\n  /*    ft_open_pathname :: Deprecated; use @FT_OPEN_PATHNAME instead.     */\n  /*                                                                       */\n  /*    ft_open_driver   :: Deprecated; use @FT_OPEN_DRIVER instead.       */\n  /*                                                                       */\n  /*    ft_open_params   :: Deprecated; use @FT_OPEN_PARAMS instead.       */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The `FT_OPEN_MEMORY', `FT_OPEN_STREAM', and `FT_OPEN_PATHNAME'     */\n  /*    flags are mutually exclusive.                                      */\n  /*                                                                       */\n#define FT_OPEN_MEMORY    0x1\n#define FT_OPEN_STREAM    0x2\n#define FT_OPEN_PATHNAME  0x4\n#define FT_OPEN_DRIVER    0x8\n#define FT_OPEN_PARAMS    0x10\n\n#define ft_open_memory    FT_OPEN_MEMORY     /* deprecated */\n#define ft_open_stream    FT_OPEN_STREAM     /* deprecated */\n#define ft_open_pathname  FT_OPEN_PATHNAME   /* deprecated */\n#define ft_open_driver    FT_OPEN_DRIVER     /* deprecated */\n#define ft_open_params    FT_OPEN_PARAMS     /* deprecated */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Parameter                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple structure used to pass more or less generic parameters to */\n  /*    @FT_Open_Face.                                                     */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    tag  :: A four-byte identification tag.                            */\n  /*                                                                       */\n  /*    data :: A pointer to the parameter data.                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The ID and function of parameters are driver-specific.  See the    */\n  /*    various FT_PARAM_TAG_XXX flags for more information.               */\n  /*                                                                       */\n  typedef struct  FT_Parameter_\n  {\n    FT_ULong    tag;\n    FT_Pointer  data;\n\n  } FT_Parameter;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Open_Args                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to indicate how to open a new font file or        */\n  /*    stream.  A pointer to such a structure can be used as a parameter  */\n  /*    for the functions @FT_Open_Face and @FT_Attach_Stream.             */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    flags       :: A set of bit flags indicating how to use the        */\n  /*                   structure.                                          */\n  /*                                                                       */\n  /*    memory_base :: The first byte of the file in memory.               */\n  /*                                                                       */\n  /*    memory_size :: The size in bytes of the file in memory.            */\n  /*                                                                       */\n  /*    pathname    :: A pointer to an 8-bit file pathname.                */\n  /*                                                                       */\n  /*    stream      :: A handle to a source stream object.                 */\n  /*                                                                       */\n  /*    driver      :: This field is exclusively used by @FT_Open_Face;    */\n  /*                   it simply specifies the font driver to use to open  */\n  /*                   the face.  If set to~0, FreeType tries to load the  */\n  /*                   face with each one of the drivers in its list.      */\n  /*                                                                       */\n  /*    num_params  :: The number of extra parameters.                     */\n  /*                                                                       */\n  /*    params      :: Extra parameters passed to the font driver when     */\n  /*                   opening a new face.                                 */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The stream type is determined by the contents of `flags' which     */\n  /*    are tested in the following order by @FT_Open_Face:                */\n  /*                                                                       */\n  /*    If the `FT_OPEN_MEMORY' bit is set, assume that this is a          */\n  /*    memory file of `memory_size' bytes, located at `memory_address'.   */\n  /*    The data are are not copied, and the client is responsible for     */\n  /*    releasing and destroying them _after_ the corresponding call to    */\n  /*    @FT_Done_Face.                                                     */\n  /*                                                                       */\n  /*    Otherwise, if the `FT_OPEN_STREAM' bit is set, assume that a       */\n  /*    custom input stream `stream' is used.                              */\n  /*                                                                       */\n  /*    Otherwise, if the `FT_OPEN_PATHNAME' bit is set, assume that this  */\n  /*    is a normal file and use `pathname' to open it.                    */\n  /*                                                                       */\n  /*    If the `FT_OPEN_DRIVER' bit is set, @FT_Open_Face only tries to    */\n  /*    open the file with the driver whose handler is in `driver'.        */\n  /*                                                                       */\n  /*    If the `FT_OPEN_PARAMS' bit is set, the parameters given by        */\n  /*    `num_params' and `params' is used.  They are ignored otherwise.    */\n  /*                                                                       */\n  /*    Ideally, both the `pathname' and `params' fields should be tagged  */\n  /*    as `const'; this is missing for API backwards compatibility.  In   */\n  /*    other words, applications should treat them as read-only.          */\n  /*                                                                       */\n  typedef struct  FT_Open_Args_\n  {\n    FT_UInt         flags;\n    const FT_Byte*  memory_base;\n    FT_Long         memory_size;\n    FT_String*      pathname;\n    FT_Stream       stream;\n    FT_Module       driver;\n    FT_Int          num_params;\n    FT_Parameter*   params;\n\n  } FT_Open_Args;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Face                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function calls @FT_Open_Face to open a font by its pathname.  */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library    :: A handle to the library resource.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    pathname   :: A path to the font file.                             */\n  /*                                                                       */\n  /*    face_index :: The index of the face within the font.  The first    */\n  /*                  face has index~0.                                    */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aface      :: A handle to a new face object.  If `face_index' is   */\n  /*                  greater than or equal to zero, it must be non-NULL.  */\n  /*                  See @FT_Open_Face for more details.                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Use @FT_Done_Face to destroy the created @FT_Face object (along    */\n  /*    with its slot and sizes).                                          */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_New_Face( FT_Library   library,\n               const char*  filepathname,\n               FT_Long      face_index,\n               FT_Face     *aface );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Memory_Face                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function calls @FT_Open_Face to open a font which has been    */\n  /*    loaded into memory.                                                */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library    :: A handle to the library resource.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    file_base  :: A pointer to the beginning of the font data.         */\n  /*                                                                       */\n  /*    file_size  :: The size of the memory chunk used by the font data.  */\n  /*                                                                       */\n  /*    face_index :: The index of the face within the font.  The first    */\n  /*                  face has index~0.                                    */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aface      :: A handle to a new face object.  If `face_index' is   */\n  /*                  greater than or equal to zero, it must be non-NULL.  */\n  /*                  See @FT_Open_Face for more details.                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You must not deallocate the memory before calling @FT_Done_Face.   */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_New_Memory_Face( FT_Library      library,\n                      const FT_Byte*  file_base,\n                      FT_Long         file_size,\n                      FT_Long         face_index,\n                      FT_Face        *aface );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Open_Face                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a face object from a given resource described by            */\n  /*    @FT_Open_Args.                                                     */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library    :: A handle to the library resource.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    args       :: A pointer to an `FT_Open_Args' structure which must  */\n  /*                  be filled by the caller.                             */\n  /*                                                                       */\n  /*    face_index :: The index of the face within the font.  The first    */\n  /*                  face has index~0.                                    */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aface      :: A handle to a new face object.  If `face_index' is   */\n  /*                  greater than or equal to zero, it must be non-NULL.  */\n  /*                  See note below.                                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Unlike FreeType 1.x, this function automatically creates a glyph   */\n  /*    slot for the face object which can be accessed directly through    */\n  /*    `face->glyph'.                                                     */\n  /*                                                                       */\n  /*    FT_Open_Face can be used to quickly check whether the font         */\n  /*    format of a given font resource is supported by FreeType.  If the  */\n  /*    `face_index' field is negative, the function's return value is~0   */\n  /*    if the font format is recognized, or non-zero otherwise;           */\n  /*    the function returns a more or less empty face handle in `*aface'  */\n  /*    (if `aface' isn't NULL).  The only useful field in this special    */\n  /*    case is `face->num_faces' which gives the number of faces within   */\n  /*    the font file.  After examination, the returned @FT_Face structure */\n  /*    should be deallocated with a call to @FT_Done_Face.                */\n  /*                                                                       */\n  /*    Each new face object created with this function also owns a        */\n  /*    default @FT_Size object, accessible as `face->size'.               */\n  /*                                                                       */\n  /*    One @FT_Library instance can have multiple face objects, this is,  */\n  /*    @FT_Open_Face and its siblings can be called multiple times using  */\n  /*    the same `library' argument.                                       */\n  /*                                                                       */\n  /*    See the discussion of reference counters in the description of     */\n  /*    @FT_Reference_Face.                                                */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Open_Face( FT_Library           library,\n                const FT_Open_Args*  args,\n                FT_Long              face_index,\n                FT_Face             *aface );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Attach_File                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function calls @FT_Attach_Stream to attach a file.            */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face         :: The target face object.                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    filepathname :: The pathname.                                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Attach_File( FT_Face      face,\n                  const char*  filepathname );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Attach_Stream                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    `Attach' data to a face object.  Normally, this is used to read    */\n  /*    additional information for the face object.  For example, you can  */\n  /*    attach an AFM file that comes with a Type~1 font to get the        */\n  /*    kerning values and other metrics.                                  */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face       :: The target face object.                              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    parameters :: A pointer to @FT_Open_Args which must be filled by   */\n  /*                  the caller.                                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The meaning of the `attach' (i.e., what really happens when the    */\n  /*    new file is read) is not fixed by FreeType itself.  It really      */\n  /*    depends on the font format (and thus the font driver).             */\n  /*                                                                       */\n  /*    Client applications are expected to know what they are doing       */\n  /*    when invoking this function.  Most drivers simply do not implement */\n  /*    file attachments.                                                  */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Attach_Stream( FT_Face        face,\n                    FT_Open_Args*  parameters );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Reference_Face                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A counter gets initialized to~1 at the time an @FT_Face structure  */\n  /*    is created.  This function increments the counter.  @FT_Done_Face  */\n  /*    then only destroys a face if the counter is~1, otherwise it simply */\n  /*    decrements the counter.                                            */\n  /*                                                                       */\n  /*    This function helps in managing life-cycles of structures which    */\n  /*    reference @FT_Face objects.                                        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to a target face object.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.4.2                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Reference_Face( FT_Face  face );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Done_Face                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Discard a given face object, as well as all of its child slots and */\n  /*    sizes.                                                             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to a target face object.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    See the discussion of reference counters in the description of     */\n  /*    @FT_Reference_Face.                                                */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Done_Face( FT_Face  face );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Select_Size                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Select a bitmap strike.                                            */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face         :: A handle to a target face object.                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    strike_index :: The index of the bitmap strike in the              */\n  /*                    `available_sizes' field of @FT_FaceRec structure.  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Select_Size( FT_Face  face,\n                  FT_Int   strike_index );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Size_Request_Type                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration type that lists the supported size request types.   */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_SIZE_REQUEST_TYPE_NOMINAL ::                                    */\n  /*      The nominal size.  The `units_per_EM' field of @FT_FaceRec is    */\n  /*      used to determine both scaling values.                           */\n  /*                                                                       */\n  /*    FT_SIZE_REQUEST_TYPE_REAL_DIM ::                                   */\n  /*      The real dimension.  The sum of the the `ascender' and (minus    */\n  /*      of) the `descender' fields of @FT_FaceRec are used to determine  */\n  /*      both scaling values.                                             */\n  /*                                                                       */\n  /*    FT_SIZE_REQUEST_TYPE_BBOX ::                                       */\n  /*      The font bounding box.  The width and height of the `bbox' field */\n  /*      of @FT_FaceRec are used to determine the horizontal and vertical */\n  /*      scaling value, respectively.                                     */\n  /*                                                                       */\n  /*    FT_SIZE_REQUEST_TYPE_CELL ::                                       */\n  /*      The `max_advance_width' field of @FT_FaceRec is used to          */\n  /*      determine the horizontal scaling value; the vertical scaling     */\n  /*      value is determined the same way as                              */\n  /*      @FT_SIZE_REQUEST_TYPE_REAL_DIM does.  Finally, both scaling      */\n  /*      values are set to the smaller one.  This type is useful if you   */\n  /*      want to specify the font size for, say, a window of a given      */\n  /*      dimension and 80x24 cells.                                       */\n  /*                                                                       */\n  /*    FT_SIZE_REQUEST_TYPE_SCALES ::                                     */\n  /*      Specify the scaling values directly.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The above descriptions only apply to scalable formats.  For bitmap */\n  /*    formats, the behaviour is up to the driver.                        */\n  /*                                                                       */\n  /*    See the note section of @FT_Size_Metrics if you wonder how size    */\n  /*    requesting relates to scaling values.                              */\n  /*                                                                       */\n  typedef enum  FT_Size_Request_Type_\n  {\n    FT_SIZE_REQUEST_TYPE_NOMINAL,\n    FT_SIZE_REQUEST_TYPE_REAL_DIM,\n    FT_SIZE_REQUEST_TYPE_BBOX,\n    FT_SIZE_REQUEST_TYPE_CELL,\n    FT_SIZE_REQUEST_TYPE_SCALES,\n\n    FT_SIZE_REQUEST_TYPE_MAX\n\n  } FT_Size_Request_Type;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Size_RequestRec                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a size request.                          */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    type           :: See @FT_Size_Request_Type.                       */\n  /*                                                                       */\n  /*    width          :: The desired width.                               */\n  /*                                                                       */\n  /*    height         :: The desired height.                              */\n  /*                                                                       */\n  /*    horiResolution :: The horizontal resolution.  If set to zero,      */\n  /*                      `width' is treated as a 26.6 fractional pixel    */\n  /*                      value.                                           */\n  /*                                                                       */\n  /*    vertResolution :: The vertical resolution.  If set to zero,        */\n  /*                      `height' is treated as a 26.6 fractional pixel   */\n  /*                      value.                                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If `width' is zero, then the horizontal scaling value is set equal */\n  /*    to the vertical scaling value, and vice versa.                     */\n  /*                                                                       */\n  typedef struct  FT_Size_RequestRec_\n  {\n    FT_Size_Request_Type  type;\n    FT_Long               width;\n    FT_Long               height;\n    FT_UInt               horiResolution;\n    FT_UInt               vertResolution;\n\n  } FT_Size_RequestRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Size_Request                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a size request structure.                              */\n  /*                                                                       */\n  typedef struct FT_Size_RequestRec_  *FT_Size_Request;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Request_Size                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Resize the scale of the active @FT_Size object in a face.          */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face :: A handle to a target face object.                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    req  :: A pointer to a @FT_Size_RequestRec.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Although drivers may select the bitmap strike matching the         */\n  /*    request, you should not rely on this if you intend to select a     */\n  /*    particular bitmap strike.  Use @FT_Select_Size instead in that     */\n  /*    case.                                                              */\n  /*                                                                       */\n  /*    The relation between the requested size and the resulting glyph    */\n  /*    size is dependent entirely on how the size is defined in the       */\n  /*    source face.  The font designer chooses the final size of each     */\n  /*    glyph relative to this size.  For more information refer to        */\n  /*    `http://www.freetype.org/freetype2/docs/glyphs/glyphs-2.html'      */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Request_Size( FT_Face          face,\n                   FT_Size_Request  req );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_Char_Size                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function calls @FT_Request_Size to request the nominal size   */\n  /*    (in points).                                                       */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face            :: A handle to a target face object.               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    char_width      :: The nominal width, in 26.6 fractional points.   */\n  /*                                                                       */\n  /*    char_height     :: The nominal height, in 26.6 fractional points.  */\n  /*                                                                       */\n  /*    horz_resolution :: The horizontal resolution in dpi.               */\n  /*                                                                       */\n  /*    vert_resolution :: The vertical resolution in dpi.                 */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If either the character width or height is zero, it is set equal   */\n  /*    to the other value.                                                */\n  /*                                                                       */\n  /*    If either the horizontal or vertical resolution is zero, it is set */\n  /*    equal to the other value.                                          */\n  /*                                                                       */\n  /*    A character width or height smaller than 1pt is set to 1pt; if     */\n  /*    both resolution values are zero, they are set to 72dpi.            */\n  /*                                                                       */\n  /*    Don't use this function if you are using the FreeType cache API.   */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Set_Char_Size( FT_Face     face,\n                    FT_F26Dot6  char_width,\n                    FT_F26Dot6  char_height,\n                    FT_UInt     horz_resolution,\n                    FT_UInt     vert_resolution );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_Pixel_Sizes                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function calls @FT_Request_Size to request the nominal size   */\n  /*    (in pixels).                                                       */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face         :: A handle to the target face object.                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    pixel_width  :: The nominal width, in pixels.                      */\n  /*                                                                       */\n  /*    pixel_height :: The nominal height, in pixels.                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You should not rely on the resulting glyphs matching, or being     */\n  /*    constrained, to this pixel size.  Refer to @FT_Request_Size to     */\n  /*    understand how requested sizes relate to actual sizes.             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Set_Pixel_Sizes( FT_Face  face,\n                      FT_UInt  pixel_width,\n                      FT_UInt  pixel_height );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Load_Glyph                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to load a single glyph into the glyph slot of a    */\n  /*    face object.                                                       */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face        :: A handle to the target face object where the glyph  */\n  /*                   is loaded.                                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    glyph_index :: The index of the glyph in the font file.  For       */\n  /*                   CID-keyed fonts (either in PS or in CFF format)     */\n  /*                   this argument specifies the CID value.              */\n  /*                                                                       */\n  /*    load_flags  :: A flag indicating what to load for this glyph.  The */\n  /*                   @FT_LOAD_XXX constants can be used to control the   */\n  /*                   glyph loading process (e.g., whether the outline    */\n  /*                   should be scaled, whether to load bitmaps or not,   */\n  /*                   whether to hint the outline, etc).                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The loaded glyph may be transformed.  See @FT_Set_Transform for    */\n  /*    the details.                                                       */\n  /*                                                                       */\n  /*    For subsetted CID-keyed fonts, `FT_Err_Invalid_Argument' is        */\n  /*    returned for invalid CID values (this is, for CID values which     */\n  /*    don't have a corresponding glyph in the font).  See the discussion */\n  /*    of the @FT_FACE_FLAG_CID_KEYED flag for more details.              */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Load_Glyph( FT_Face   face,\n                 FT_UInt   glyph_index,\n                 FT_Int32  load_flags );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Load_Char                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to load a single glyph into the glyph slot of a    */\n  /*    face object, according to its character code.                      */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face        :: A handle to a target face object where the glyph    */\n  /*                   is loaded.                                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    char_code   :: The glyph's character code, according to the        */\n  /*                   current charmap used in the face.                   */\n  /*                                                                       */\n  /*    load_flags  :: A flag indicating what to load for this glyph.  The */\n  /*                   @FT_LOAD_XXX constants can be used to control the   */\n  /*                   glyph loading process (e.g., whether the outline    */\n  /*                   should be scaled, whether to load bitmaps or not,   */\n  /*                   whether to hint the outline, etc).                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function simply calls @FT_Get_Char_Index and @FT_Load_Glyph.  */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Load_Char( FT_Face   face,\n                FT_ULong  char_code,\n                FT_Int32  load_flags );\n\n\n  /*************************************************************************\n   *\n   * @enum:\n   *   FT_LOAD_XXX\n   *\n   * @description:\n   *   A list of bit-field constants used with @FT_Load_Glyph to indicate\n   *   what kind of operations to perform during glyph loading.\n   *\n   * @values:\n   *   FT_LOAD_DEFAULT ::\n   *     Corresponding to~0, this value is used as the default glyph load\n   *     operation.  In this case, the following happens:\n   *\n   *     1. FreeType looks for a bitmap for the glyph corresponding to the\n   *        face's current size.  If one is found, the function returns.\n   *        The bitmap data can be accessed from the glyph slot (see note\n   *        below).\n   *\n   *     2. If no embedded bitmap is searched or found, FreeType looks for a\n   *        scalable outline.  If one is found, it is loaded from the font\n   *        file, scaled to device pixels, then `hinted' to the pixel grid\n   *        in order to optimize it.  The outline data can be accessed from\n   *        the glyph slot (see note below).\n   *\n   *     Note that by default, the glyph loader doesn't render outlines into\n   *     bitmaps.  The following flags are used to modify this default\n   *     behaviour to more specific and useful cases.\n   *\n   *   FT_LOAD_NO_SCALE ::\n   *     Don't scale the loaded outline glyph but keep it in font units.\n   *\n   *     This flag implies @FT_LOAD_NO_HINTING and @FT_LOAD_NO_BITMAP, and\n   *     unsets @FT_LOAD_RENDER.\n   *\n   *     If the font is `tricky' (see @FT_FACE_FLAG_TRICKY for more), using\n   *     FT_LOAD_NO_SCALE usually yields meaningless outlines because the\n   *     subglyphs must be scaled and positioned with hinting instructions.\n   *     This can be solved by loading the font without FT_LOAD_NO_SCALE and\n   *     setting the character size to `font->units_per_EM'.\n   *\n   *   FT_LOAD_NO_HINTING ::\n   *     Disable hinting.  This generally generates `blurrier' bitmap glyphs\n   *     when the glyph are rendered in any of the anti-aliased modes.  See\n   *     also the note below.\n   *\n   *     This flag is implied by @FT_LOAD_NO_SCALE.\n   *\n   *   FT_LOAD_RENDER ::\n   *     Call @FT_Render_Glyph after the glyph is loaded.  By default, the\n   *     glyph is rendered in @FT_RENDER_MODE_NORMAL mode.  This can be\n   *     overridden by @FT_LOAD_TARGET_XXX or @FT_LOAD_MONOCHROME.\n   *\n   *     This flag is unset by @FT_LOAD_NO_SCALE.\n   *\n   *   FT_LOAD_NO_BITMAP ::\n   *     Ignore bitmap strikes when loading.  Bitmap-only fonts ignore this\n   *     flag.\n   *\n   *     @FT_LOAD_NO_SCALE always sets this flag.\n   *\n   *   FT_LOAD_VERTICAL_LAYOUT ::\n   *     Load the glyph for vertical text layout.  In particular, the\n   *     `advance' value in the @FT_GlyphSlotRec structure is set to the\n   *     `vertAdvance' value of the `metrics' field.\n   *\n   *     In case @FT_HAS_VERTICAL doesn't return true, you shouldn't use\n   *     this flag currently.  Reason is that in this case vertical metrics\n   *     get synthesized, and those values are not always consistent across\n   *     various font formats.\n   *\n   *   FT_LOAD_FORCE_AUTOHINT ::\n   *     Indicates that the auto-hinter is preferred over the font's native\n   *     hinter.  See also the note below.\n   *\n   *   FT_LOAD_CROP_BITMAP ::\n   *     Indicates that the font driver should crop the loaded bitmap glyph\n   *     (i.e., remove all space around its black bits).  Not all drivers\n   *     implement this.\n   *\n   *   FT_LOAD_PEDANTIC ::\n   *     Indicates that the font driver should perform pedantic verifications\n   *     during glyph loading.  This is mostly used to detect broken glyphs\n   *     in fonts.  By default, FreeType tries to handle broken fonts also.\n   *\n   *     In particular, errors from the TrueType bytecode engine are not\n   *     passed to the application if this flag is not set; this might\n   *     result in partially hinted or distorted glyphs in case a glyph's\n   *     bytecode is buggy.\n   *\n   *   FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ::\n   *     Ignored.  Deprecated.\n   *\n   *   FT_LOAD_NO_RECURSE ::\n   *     This flag is only used internally.  It merely indicates that the\n   *     font driver should not load composite glyphs recursively.  Instead,\n   *     it should set the `num_subglyph' and `subglyphs' values of the\n   *     glyph slot accordingly, and set `glyph->format' to\n   *     @FT_GLYPH_FORMAT_COMPOSITE.\n   *\n   *     The description of sub-glyphs is not available to client\n   *     applications for now.\n   *\n   *     This flag implies @FT_LOAD_NO_SCALE and @FT_LOAD_IGNORE_TRANSFORM.\n   *\n   *   FT_LOAD_IGNORE_TRANSFORM ::\n   *     Indicates that the transform matrix set by @FT_Set_Transform should\n   *     be ignored.\n   *\n   *   FT_LOAD_MONOCHROME ::\n   *     This flag is used with @FT_LOAD_RENDER to indicate that you want to\n   *     render an outline glyph to a 1-bit monochrome bitmap glyph, with\n   *     8~pixels packed into each byte of the bitmap data.\n   *\n   *     Note that this has no effect on the hinting algorithm used.  You\n   *     should rather use @FT_LOAD_TARGET_MONO so that the\n   *     monochrome-optimized hinting algorithm is used.\n   *\n   *   FT_LOAD_LINEAR_DESIGN ::\n   *     Indicates that the `linearHoriAdvance' and `linearVertAdvance'\n   *     fields of @FT_GlyphSlotRec should be kept in font units.  See\n   *     @FT_GlyphSlotRec for details.\n   *\n   *   FT_LOAD_NO_AUTOHINT ::\n   *     Disable auto-hinter.  See also the note below.\n   *\n   *   FT_LOAD_COLOR ::\n   *     This flag is used to request loading of color embedded-bitmap\n   *     images.  The resulting color bitmaps, if available, will have the\n   *     @FT_PIXEL_MODE_BGRA format.  When the flag is not used and color\n   *     bitmaps are found, they will be converted to 256-level gray\n   *     bitmaps transparently.  Those bitmaps will be in the\n   *     @FT_PIXEL_MODE_GRAY format.\n   *\n   * @note:\n   *   By default, hinting is enabled and the font's native hinter (see\n   *   @FT_FACE_FLAG_HINTER) is preferred over the auto-hinter.  You can\n   *   disable hinting by setting @FT_LOAD_NO_HINTING or change the\n   *   precedence by setting @FT_LOAD_FORCE_AUTOHINT.  You can also set\n   *   @FT_LOAD_NO_AUTOHINT in case you don't want the auto-hinter to be\n   *   used at all.\n   *\n   *   See the description of @FT_FACE_FLAG_TRICKY for a special exception\n   *   (affecting only a handful of Asian fonts).\n   *\n   *   Besides deciding which hinter to use, you can also decide which\n   *   hinting algorithm to use.  See @FT_LOAD_TARGET_XXX for details.\n   *\n   *   Note that the auto-hinter needs a valid Unicode cmap (either a native\n   *   one or synthesized by FreeType) for producing correct results.  If a\n   *   font provides an incorrect mapping (for example, assigning the\n   *   character code U+005A, LATIN CAPITAL LETTER Z, to a glyph depicting a\n   *   mathematical integral sign), the auto-hinter might produce useless\n   *   results.\n   *\n   */\n#define FT_LOAD_DEFAULT                      0x0\n#define FT_LOAD_NO_SCALE                     ( 1L << 0 )\n#define FT_LOAD_NO_HINTING                   ( 1L << 1 )\n#define FT_LOAD_RENDER                       ( 1L << 2 )\n#define FT_LOAD_NO_BITMAP                    ( 1L << 3 )\n#define FT_LOAD_VERTICAL_LAYOUT              ( 1L << 4 )\n#define FT_LOAD_FORCE_AUTOHINT               ( 1L << 5 )\n#define FT_LOAD_CROP_BITMAP                  ( 1L << 6 )\n#define FT_LOAD_PEDANTIC                     ( 1L << 7 )\n#define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH  ( 1L << 9 )\n#define FT_LOAD_NO_RECURSE                   ( 1L << 10 )\n#define FT_LOAD_IGNORE_TRANSFORM             ( 1L << 11 )\n#define FT_LOAD_MONOCHROME                   ( 1L << 12 )\n#define FT_LOAD_LINEAR_DESIGN                ( 1L << 13 )\n#define FT_LOAD_NO_AUTOHINT                  ( 1L << 15 )\n  /* Bits 16..19 are used by `FT_LOAD_TARGET_' */\n#define FT_LOAD_COLOR                        ( 1L << 20 )\n\n  /* */\n\n  /* used internally only by certain font drivers! */\n#define FT_LOAD_ADVANCE_ONLY                 ( 1L << 8 )\n#define FT_LOAD_SBITS_ONLY                   ( 1L << 14 )\n\n\n  /**************************************************************************\n   *\n   * @enum:\n   *   FT_LOAD_TARGET_XXX\n   *\n   * @description:\n   *   A list of values that are used to select a specific hinting algorithm\n   *   to use by the hinter.  You should OR one of these values to your\n   *   `load_flags' when calling @FT_Load_Glyph.\n   *\n   *   Note that font's native hinters may ignore the hinting algorithm you\n   *   have specified (e.g., the TrueType bytecode interpreter).  You can set\n   *   @FT_LOAD_FORCE_AUTOHINT to ensure that the auto-hinter is used.\n   *\n   *   Also note that @FT_LOAD_TARGET_LIGHT is an exception, in that it\n   *   always implies @FT_LOAD_FORCE_AUTOHINT.\n   *\n   * @values:\n   *   FT_LOAD_TARGET_NORMAL ::\n   *     This corresponds to the default hinting algorithm, optimized for\n   *     standard gray-level rendering.  For monochrome output, use\n   *     @FT_LOAD_TARGET_MONO instead.\n   *\n   *   FT_LOAD_TARGET_LIGHT ::\n   *     A lighter hinting algorithm for non-monochrome modes.  Many\n   *     generated glyphs are more fuzzy but better resemble its original\n   *     shape.  A bit like rendering on Mac OS~X.\n   *\n   *     As a special exception, this target implies @FT_LOAD_FORCE_AUTOHINT.\n   *\n   *   FT_LOAD_TARGET_MONO ::\n   *     Strong hinting algorithm that should only be used for monochrome\n   *     output.  The result is probably unpleasant if the glyph is rendered\n   *     in non-monochrome modes.\n   *\n   *   FT_LOAD_TARGET_LCD ::\n   *     A variant of @FT_LOAD_TARGET_NORMAL optimized for horizontally\n   *     decimated LCD displays.\n   *\n   *   FT_LOAD_TARGET_LCD_V ::\n   *     A variant of @FT_LOAD_TARGET_NORMAL optimized for vertically\n   *     decimated LCD displays.\n   *\n   * @note:\n   *   You should use only _one_ of the FT_LOAD_TARGET_XXX values in your\n   *   `load_flags'.  They can't be ORed.\n   *\n   *   If @FT_LOAD_RENDER is also set, the glyph is rendered in the\n   *   corresponding mode (i.e., the mode which matches the used algorithm\n   *   best).  An exeption is FT_LOAD_TARGET_MONO since it implies\n   *   @FT_LOAD_MONOCHROME.\n   *\n   *   You can use a hinting algorithm that doesn't correspond to the same\n   *   rendering mode.  As an example, it is possible to use the `light'\n   *   hinting algorithm and have the results rendered in horizontal LCD\n   *   pixel mode, with code like\n   *\n   *     {\n   *       FT_Load_Glyph( face, glyph_index,\n   *                      load_flags | FT_LOAD_TARGET_LIGHT );\n   *\n   *       FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD );\n   *     }\n   *\n   */\n#define FT_LOAD_TARGET_( x )   ( (FT_Int32)( (x) & 15 ) << 16 )\n\n#define FT_LOAD_TARGET_NORMAL  FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL )\n#define FT_LOAD_TARGET_LIGHT   FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT  )\n#define FT_LOAD_TARGET_MONO    FT_LOAD_TARGET_( FT_RENDER_MODE_MONO   )\n#define FT_LOAD_TARGET_LCD     FT_LOAD_TARGET_( FT_RENDER_MODE_LCD    )\n#define FT_LOAD_TARGET_LCD_V   FT_LOAD_TARGET_( FT_RENDER_MODE_LCD_V  )\n\n\n  /**************************************************************************\n   *\n   * @macro:\n   *   FT_LOAD_TARGET_MODE\n   *\n   * @description:\n   *   Return the @FT_Render_Mode corresponding to a given\n   *   @FT_LOAD_TARGET_XXX value.\n   *\n   */\n#define FT_LOAD_TARGET_MODE( x )  ( (FT_Render_Mode)( ( (x) >> 16 ) & 15 ) )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_Transform                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to set the transformation that is applied to glyph */\n  /*    images when they are loaded into a glyph slot through              */\n  /*    @FT_Load_Glyph.                                                    */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face   :: A handle to the source face object.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    matrix :: A pointer to the transformation's 2x2 matrix.  Use~0 for */\n  /*              the identity matrix.                                     */\n  /*    delta  :: A pointer to the translation vector.  Use~0 for the null */\n  /*              vector.                                                  */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The transformation is only applied to scalable image formats after */\n  /*    the glyph has been loaded.  It means that hinting is unaltered by  */\n  /*    the transformation and is performed on the character size given in */\n  /*    the last call to @FT_Set_Char_Size or @FT_Set_Pixel_Sizes.         */\n  /*                                                                       */\n  /*    Note that this also transforms the `face.glyph.advance' field, but */\n  /*    *not* the values in `face.glyph.metrics'.                          */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Set_Transform( FT_Face     face,\n                    FT_Matrix*  matrix,\n                    FT_Vector*  delta );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Render_Mode                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration type that lists the render modes supported by       */\n  /*    FreeType~2.  Each mode corresponds to a specific type of scanline  */\n  /*    conversion performed on the outline.                               */\n  /*                                                                       */\n  /*    For bitmap fonts and embedded bitmaps the `bitmap->pixel_mode'     */\n  /*    field in the @FT_GlyphSlotRec structure gives the format of the    */\n  /*    returned bitmap.                                                   */\n  /*                                                                       */\n  /*    All modes except @FT_RENDER_MODE_MONO use 256 levels of opacity.   */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_RENDER_MODE_NORMAL ::                                           */\n  /*      This is the default render mode; it corresponds to 8-bit         */\n  /*      anti-aliased bitmaps.                                            */\n  /*                                                                       */\n  /*    FT_RENDER_MODE_LIGHT ::                                            */\n  /*      This is equivalent to @FT_RENDER_MODE_NORMAL.  It is only        */\n  /*      defined as a separate value because render modes are also used   */\n  /*      indirectly to define hinting algorithm selectors.  See           */\n  /*      @FT_LOAD_TARGET_XXX for details.                                 */\n  /*                                                                       */\n  /*    FT_RENDER_MODE_MONO ::                                             */\n  /*      This mode corresponds to 1-bit bitmaps (with 2~levels of         */\n  /*      opacity).                                                        */\n  /*                                                                       */\n  /*    FT_RENDER_MODE_LCD ::                                              */\n  /*      This mode corresponds to horizontal RGB and BGR sub-pixel        */\n  /*      displays like LCD screens.  It produces 8-bit bitmaps that are   */\n  /*      3~times the width of the original glyph outline in pixels, and   */\n  /*      which use the @FT_PIXEL_MODE_LCD mode.                           */\n  /*                                                                       */\n  /*    FT_RENDER_MODE_LCD_V ::                                            */\n  /*      This mode corresponds to vertical RGB and BGR sub-pixel displays */\n  /*      (like PDA screens, rotated LCD displays, etc.).  It produces     */\n  /*      8-bit bitmaps that are 3~times the height of the original        */\n  /*      glyph outline in pixels and use the @FT_PIXEL_MODE_LCD_V mode.   */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The LCD-optimized glyph bitmaps produced by FT_Render_Glyph can be */\n  /*    filtered to reduce color-fringes by using @FT_Library_SetLcdFilter */\n  /*    (not active in the default builds).  It is up to the caller to     */\n  /*    either call @FT_Library_SetLcdFilter (if available) or do the      */\n  /*    filtering itself.                                                  */\n  /*                                                                       */\n  /*    The selected render mode only affects vector glyphs of a font.     */\n  /*    Embedded bitmaps often have a different pixel mode like            */\n  /*    @FT_PIXEL_MODE_MONO.  You can use @FT_Bitmap_Convert to transform  */\n  /*    them into 8-bit pixmaps.                                           */\n  /*                                                                       */\n  typedef enum  FT_Render_Mode_\n  {\n    FT_RENDER_MODE_NORMAL = 0,\n    FT_RENDER_MODE_LIGHT,\n    FT_RENDER_MODE_MONO,\n    FT_RENDER_MODE_LCD,\n    FT_RENDER_MODE_LCD_V,\n\n    FT_RENDER_MODE_MAX\n\n  } FT_Render_Mode;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    ft_render_mode_xxx                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    These constants are deprecated.  Use the corresponding             */\n  /*    @FT_Render_Mode values instead.                                    */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    ft_render_mode_normal :: see @FT_RENDER_MODE_NORMAL                */\n  /*    ft_render_mode_mono   :: see @FT_RENDER_MODE_MONO                  */\n  /*                                                                       */\n#define ft_render_mode_normal  FT_RENDER_MODE_NORMAL\n#define ft_render_mode_mono    FT_RENDER_MODE_MONO\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Render_Glyph                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Convert a given glyph image to a bitmap.  It does so by inspecting */\n  /*    the glyph image format, finding the relevant renderer, and         */\n  /*    invoking it.                                                       */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    slot        :: A handle to the glyph slot containing the image to  */\n  /*                   convert.                                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    render_mode :: This is the render mode used to render the glyph    */\n  /*                   image into a bitmap.  See @FT_Render_Mode for a     */\n  /*                   list of possible values.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Render_Glyph( FT_GlyphSlot    slot,\n                   FT_Render_Mode  render_mode );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Kerning_Mode                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration used to specify which kerning values to return in   */\n  /*    @FT_Get_Kerning.                                                   */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_KERNING_DEFAULT  :: Return scaled and grid-fitted kerning       */\n  /*                           distances (value is~0).                     */\n  /*                                                                       */\n  /*    FT_KERNING_UNFITTED :: Return scaled but un-grid-fitted kerning    */\n  /*                           distances.                                  */\n  /*                                                                       */\n  /*    FT_KERNING_UNSCALED :: Return the kerning vector in original font  */\n  /*                           units.                                      */\n  /*                                                                       */\n  typedef enum  FT_Kerning_Mode_\n  {\n    FT_KERNING_DEFAULT  = 0,\n    FT_KERNING_UNFITTED,\n    FT_KERNING_UNSCALED\n\n  } FT_Kerning_Mode;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Const>                                                               */\n  /*    ft_kerning_default                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This constant is deprecated.  Please use @FT_KERNING_DEFAULT       */\n  /*    instead.                                                           */\n  /*                                                                       */\n#define ft_kerning_default   FT_KERNING_DEFAULT\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Const>                                                               */\n  /*    ft_kerning_unfitted                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This constant is deprecated.  Please use @FT_KERNING_UNFITTED      */\n  /*    instead.                                                           */\n  /*                                                                       */\n#define ft_kerning_unfitted  FT_KERNING_UNFITTED\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Const>                                                               */\n  /*    ft_kerning_unscaled                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This constant is deprecated.  Please use @FT_KERNING_UNSCALED      */\n  /*    instead.                                                           */\n  /*                                                                       */\n#define ft_kerning_unscaled  FT_KERNING_UNSCALED\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Kerning                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the kerning vector between two glyphs of a same face.       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face        :: A handle to a source face object.                   */\n  /*                                                                       */\n  /*    left_glyph  :: The index of the left glyph in the kern pair.       */\n  /*                                                                       */\n  /*    right_glyph :: The index of the right glyph in the kern pair.      */\n  /*                                                                       */\n  /*    kern_mode   :: See @FT_Kerning_Mode for more information.          */\n  /*                   Determines the scale and dimension of the returned  */\n  /*                   kerning vector.                                     */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    akerning    :: The kerning vector.  This is either in font units   */\n  /*                   or in pixels (26.6 format) for scalable formats,    */\n  /*                   and in pixels for fixed-sizes formats.              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Only horizontal layouts (left-to-right & right-to-left) are        */\n  /*    supported by this method.  Other layouts, or more sophisticated    */\n  /*    kernings, are out of the scope of this API function -- they can be */\n  /*    implemented through format-specific interfaces.                    */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_Kerning( FT_Face     face,\n                  FT_UInt     left_glyph,\n                  FT_UInt     right_glyph,\n                  FT_UInt     kern_mode,\n                  FT_Vector  *akerning );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Track_Kerning                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the track kerning for a given face object at a given size.  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face       :: A handle to a source face object.                    */\n  /*                                                                       */\n  /*    point_size :: The point size in 16.16 fractional points.           */\n  /*                                                                       */\n  /*    degree     :: The degree of tightness.  Increasingly negative      */\n  /*                  values represent tighter track kerning, while        */\n  /*                  increasingly positive values represent looser track  */\n  /*                  kerning.  Value zero means no track kerning.         */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    akerning   :: The kerning in 16.16 fractional points, to be        */\n  /*                  uniformly applied between all glyphs.                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Currently, only the Type~1 font driver supports track kerning,     */\n  /*    using data from AFM files (if attached with @FT_Attach_File or     */\n  /*    @FT_Attach_Stream).                                                */\n  /*                                                                       */\n  /*    Only very few AFM files come with track kerning data; please refer */\n  /*    to the Adobe's AFM specification for more details.                 */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_Track_Kerning( FT_Face    face,\n                        FT_Fixed   point_size,\n                        FT_Int     degree,\n                        FT_Fixed*  akerning );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Glyph_Name                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the ASCII name of a given glyph in a face.  This only     */\n  /*    works for those faces where @FT_HAS_GLYPH_NAMES(face) returns~1.   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face        :: A handle to a source face object.                   */\n  /*                                                                       */\n  /*    glyph_index :: The glyph index.                                    */\n  /*                                                                       */\n  /*    buffer_max  :: The maximum number of bytes available in the        */\n  /*                   buffer.                                             */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    buffer      :: A pointer to a target buffer where the name is      */\n  /*                   copied to.                                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    An error is returned if the face doesn't provide glyph names or if */\n  /*    the glyph index is invalid.  In all cases of failure, the first    */\n  /*    byte of `buffer' is set to~0 to indicate an empty name.            */\n  /*                                                                       */\n  /*    The glyph name is truncated to fit within the buffer if it is too  */\n  /*    long.  The returned string is always zero-terminated.              */\n  /*                                                                       */\n  /*    Be aware that FreeType reorders glyph indices internally so that   */\n  /*    glyph index~0 always corresponds to the `missing glyph' (called    */\n  /*    `.notdef').                                                        */\n  /*                                                                       */\n  /*    This function is not compiled within the library if the config     */\n  /*    macro `FT_CONFIG_OPTION_NO_GLYPH_NAMES' is defined in              */\n  /*    `include/freetype/config/ftoptions.h'.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_Glyph_Name( FT_Face     face,\n                     FT_UInt     glyph_index,\n                     FT_Pointer  buffer,\n                     FT_UInt     buffer_max );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Postscript_Name                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the ASCII PostScript name of a given face, if available.  */\n  /*    This only works with PostScript and TrueType fonts.                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to the source face object.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A pointer to the face's PostScript name.  NULL if unavailable.     */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The returned pointer is owned by the face and is destroyed with    */\n  /*    it.                                                                */\n  /*                                                                       */\n  FT_EXPORT( const char* )\n  FT_Get_Postscript_Name( FT_Face  face );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Select_Charmap                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Select a given charmap by its encoding tag (as listed in           */\n  /*    `freetype.h').                                                     */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face     :: A handle to the source face object.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    encoding :: A handle to the selected encoding.                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function returns an error if no charmap in the face           */\n  /*    corresponds to the encoding queried here.                          */\n  /*                                                                       */\n  /*    Because many fonts contain more than a single cmap for Unicode     */\n  /*    encoding, this function has some special code to select the one    */\n  /*    which covers Unicode best (`best' in the sense that a UCS-4 cmap   */\n  /*    is preferred to a UCS-2 cmap).  It is thus preferable to           */\n  /*    @FT_Set_Charmap in this case.                                      */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Select_Charmap( FT_Face      face,\n                     FT_Encoding  encoding );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_Charmap                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Select a given charmap for character code to glyph index mapping.  */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face    :: A handle to the source face object.                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    charmap :: A handle to the selected charmap.                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function returns an error if the charmap is not part of       */\n  /*    the face (i.e., if it is not listed in the `face->charmaps'        */\n  /*    table).                                                            */\n  /*                                                                       */\n  /*    It also fails if a type~14 charmap is selected.                    */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Set_Charmap( FT_Face     face,\n                  FT_CharMap  charmap );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Get_Charmap_Index\n   *\n   * @description:\n   *   Retrieve index of a given charmap.\n   *\n   * @input:\n   *   charmap ::\n   *     A handle to a charmap.\n   *\n   * @return:\n   *   The index into the array of character maps within the face to which\n   *   `charmap' belongs.  If an error occurs, -1 is returned.\n   *\n   */\n  FT_EXPORT( FT_Int )\n  FT_Get_Charmap_Index( FT_CharMap  charmap );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Char_Index                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the glyph index of a given character code.  This function   */\n  /*    uses a charmap object to do the mapping.                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face     :: A handle to the source face object.                    */\n  /*                                                                       */\n  /*    charcode :: The character code.                                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The glyph index.  0~means `undefined character code'.              */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If you use FreeType to manipulate the contents of font files       */\n  /*    directly, be aware that the glyph index returned by this function  */\n  /*    doesn't always correspond to the internal indices used within the  */\n  /*    file.  This is done to ensure that value~0 always corresponds to   */\n  /*    the `missing glyph'.  If the first glyph is not named `.notdef',   */\n  /*    then for Type~1 and Type~42 fonts, `.notdef' will be moved into    */\n  /*    the glyph ID~0 position, and whatever was there will be moved to   */\n  /*    the position `.notdef' had.  For Type~1 fonts, if there is no      */\n  /*    `.notdef' glyph at all, then one will be created at index~0 and    */\n  /*    whatever was there will be moved to the last index -- Type~42      */\n  /*    fonts are considered invalid under this condition.                 */\n  /*                                                                       */\n  FT_EXPORT( FT_UInt )\n  FT_Get_Char_Index( FT_Face   face,\n                     FT_ULong  charcode );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_First_Char                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function is used to return the first character code in the    */\n  /*    current charmap of a given face.  It also returns the              */\n  /*    corresponding glyph index.                                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face    :: A handle to the source face object.                     */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    agindex :: Glyph index of first character code.  0~if charmap is   */\n  /*               empty.                                                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The charmap's first character code.                                */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You should use this function with @FT_Get_Next_Char to be able to  */\n  /*    parse all character codes available in a given charmap.  The code  */\n  /*    should look like this:                                             */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      FT_ULong  charcode;                                              */\n  /*      FT_UInt   gindex;                                                */\n  /*                                                                       */\n  /*                                                                       */\n  /*      charcode = FT_Get_First_Char( face, &gindex );                   */\n  /*      while ( gindex != 0 )                                            */\n  /*      {                                                                */\n  /*        ... do something with (charcode,gindex) pair ...               */\n  /*                                                                       */\n  /*        charcode = FT_Get_Next_Char( face, charcode, &gindex );        */\n  /*      }                                                                */\n  /*    }                                                                  */\n  /*                                                                       */\n  /*    Note that `*agindex' is set to~0 if the charmap is empty.  The     */\n  /*    result itself can be~0 in two cases: if the charmap is empty or    */\n  /*    if the value~0 is the first valid character code.                  */\n  /*                                                                       */\n  FT_EXPORT( FT_ULong )\n  FT_Get_First_Char( FT_Face   face,\n                     FT_UInt  *agindex );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Next_Char                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function is used to return the next character code in the     */\n  /*    current charmap of a given face following the value `char_code',   */\n  /*    as well as the corresponding glyph index.                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face      :: A handle to the source face object.                   */\n  /*    char_code :: The starting character code.                          */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    agindex   :: Glyph index of next character code.  0~if charmap     */\n  /*                 is empty.                                             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The charmap's next character code.                                 */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You should use this function with @FT_Get_First_Char to walk       */\n  /*    over all character codes available in a given charmap.  See the    */\n  /*    note for this function for a simple code example.                  */\n  /*                                                                       */\n  /*    Note that `*agindex' is set to~0 when there are no more codes in   */\n  /*    the charmap.                                                       */\n  /*                                                                       */\n  FT_EXPORT( FT_ULong )\n  FT_Get_Next_Char( FT_Face    face,\n                    FT_ULong   char_code,\n                    FT_UInt   *agindex );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Name_Index                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the glyph index of a given glyph name.  This function uses  */\n  /*    driver specific objects to do the translation.                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face       :: A handle to the source face object.                  */\n  /*                                                                       */\n  /*    glyph_name :: The glyph name.                                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The glyph index.  0~means `undefined character code'.              */\n  /*                                                                       */\n  FT_EXPORT( FT_UInt )\n  FT_Get_Name_Index( FT_Face     face,\n                     FT_String*  glyph_name );\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_SUBGLYPH_FLAG_XXX\n   *\n   * @description:\n   *   A list of constants used to describe subglyphs.  Please refer to the\n   *   TrueType specification for the meaning of the various flags.\n   *\n   * @values:\n   *   FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS ::\n   *   FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES ::\n   *   FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID ::\n   *   FT_SUBGLYPH_FLAG_SCALE ::\n   *   FT_SUBGLYPH_FLAG_XY_SCALE ::\n   *   FT_SUBGLYPH_FLAG_2X2 ::\n   *   FT_SUBGLYPH_FLAG_USE_MY_METRICS ::\n   *\n   */\n#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS          1\n#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES      2\n#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID        4\n#define FT_SUBGLYPH_FLAG_SCALE                   8\n#define FT_SUBGLYPH_FLAG_XY_SCALE             0x40\n#define FT_SUBGLYPH_FLAG_2X2                  0x80\n#define FT_SUBGLYPH_FLAG_USE_MY_METRICS      0x200\n\n\n  /*************************************************************************\n   *\n   * @func:\n   *   FT_Get_SubGlyph_Info\n   *\n   * @description:\n   *   Retrieve a description of a given subglyph.  Only use it if\n   *   `glyph->format' is @FT_GLYPH_FORMAT_COMPOSITE; an error is\n   *   returned otherwise.\n   *\n   * @input:\n   *   glyph ::\n   *     The source glyph slot.\n   *\n   *   sub_index ::\n   *     The index of the subglyph.  Must be less than\n   *     `glyph->num_subglyphs'.\n   *\n   * @output:\n   *   p_index ::\n   *     The glyph index of the subglyph.\n   *\n   *   p_flags ::\n   *     The subglyph flags, see @FT_SUBGLYPH_FLAG_XXX.\n   *\n   *   p_arg1 ::\n   *     The subglyph's first argument (if any).\n   *\n   *   p_arg2 ::\n   *     The subglyph's second argument (if any).\n   *\n   *   p_transform ::\n   *     The subglyph transformation (if any).\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   The values of `*p_arg1', `*p_arg2', and `*p_transform' must be\n   *   interpreted depending on the flags returned in `*p_flags'.  See the\n   *   TrueType specification for details.\n   *\n   */\n  FT_EXPORT( FT_Error )\n  FT_Get_SubGlyph_Info( FT_GlyphSlot  glyph,\n                        FT_UInt       sub_index,\n                        FT_Int       *p_index,\n                        FT_UInt      *p_flags,\n                        FT_Int       *p_arg1,\n                        FT_Int       *p_arg2,\n                        FT_Matrix    *p_transform );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_FSTYPE_XXX                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A list of bit flags used in the `fsType' field of the OS/2 table   */\n  /*    in a TrueType or OpenType font and the `FSType' entry in a         */\n  /*    PostScript font.  These bit flags are returned by                  */\n  /*    @FT_Get_FSType_Flags; they inform client applications of embedding */\n  /*    and subsetting restrictions associated with a font.                */\n  /*                                                                       */\n  /*    See http://www.adobe.com/devnet/acrobat/pdfs/FontPolicies.pdf for  */\n  /*    more details.                                                      */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_FSTYPE_INSTALLABLE_EMBEDDING ::                                 */\n  /*      Fonts with no fsType bit set may be embedded and permanently     */\n  /*      installed on the remote system by an application.                */\n  /*                                                                       */\n  /*    FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING ::                          */\n  /*      Fonts that have only this bit set must not be modified, embedded */\n  /*      or exchanged in any manner without first obtaining permission of */\n  /*      the font software copyright owner.                               */\n  /*                                                                       */\n  /*    FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING ::                           */\n  /*      If this bit is set, the font may be embedded and temporarily     */\n  /*      loaded on the remote system.  Documents containing Preview &     */\n  /*      Print fonts must be opened `read-only'; no edits can be applied  */\n  /*      to the document.                                                 */\n  /*                                                                       */\n  /*    FT_FSTYPE_EDITABLE_EMBEDDING ::                                    */\n  /*      If this bit is set, the font may be embedded but must only be    */\n  /*      installed temporarily on other systems.  In contrast to Preview  */\n  /*      & Print fonts, documents containing editable fonts may be opened */\n  /*      for reading, editing is permitted, and changes may be saved.     */\n  /*                                                                       */\n  /*    FT_FSTYPE_NO_SUBSETTING ::                                         */\n  /*      If this bit is set, the font may not be subsetted prior to       */\n  /*      embedding.                                                       */\n  /*                                                                       */\n  /*    FT_FSTYPE_BITMAP_EMBEDDING_ONLY ::                                 */\n  /*      If this bit is set, only bitmaps contained in the font may be    */\n  /*      embedded; no outline data may be embedded.  If there are no      */\n  /*      bitmaps available in the font, then the font is unembeddable.    */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    While the fsType flags can indicate that a font may be embedded, a */\n  /*    license with the font vendor may be separately required to use the */\n  /*    font in this way.                                                  */\n  /*                                                                       */\n#define FT_FSTYPE_INSTALLABLE_EMBEDDING         0x0000\n#define FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING  0x0002\n#define FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING   0x0004\n#define FT_FSTYPE_EDITABLE_EMBEDDING            0x0008\n#define FT_FSTYPE_NO_SUBSETTING                 0x0100\n#define FT_FSTYPE_BITMAP_EMBEDDING_ONLY         0x0200\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_FSType_Flags                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the fsType flags for a font.                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to the source face object.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The fsType flags, @FT_FSTYPE_XXX.                                  */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Use this function rather than directly reading the `fs_type' field */\n  /*    in the @PS_FontInfoRec structure which is only guaranteed to       */\n  /*    return the correct results for Type~1 fonts.                       */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.3.8                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_UShort )\n  FT_Get_FSType_Flags( FT_Face  face );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    glyph_variants                                                     */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Glyph Variants                                                     */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    The FreeType~2 interface to Unicode Ideographic Variation          */\n  /*    Sequences (IVS), using the SFNT cmap format~14.                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Many CJK characters have variant forms.  They are a sort of grey   */\n  /*    area somewhere between being totally irrelevant and semantically   */\n  /*    distinct; for this reason, the Unicode consortium decided to       */\n  /*    introduce Ideographic Variation Sequences (IVS), consisting of a   */\n  /*    Unicode base character and one of 240 variant selectors            */\n  /*    (U+E0100-U+E01EF), instead of further extending the already huge   */\n  /*    code range for CJK characters.                                     */\n  /*                                                                       */\n  /*    An IVS is registered and unique; for further details please refer  */\n  /*    to Unicode Technical Standard #37, the Ideographic Variation       */\n  /*    Database:                                                          */\n  /*                                                                       */\n  /*      http://www.unicode.org/reports/tr37/                             */\n  /*                                                                       */\n  /*    To date (November 2012), the character with the most variants is   */\n  /*    U+9089, having 31 such IVS.                                        */\n  /*                                                                       */\n  /*    Adobe and MS decided to support IVS with a new cmap subtable       */\n  /*    (format~14).  It is an odd subtable because it is not a mapping of */\n  /*    input code points to glyphs, but contains lists of all variants    */\n  /*    supported by the font.                                             */\n  /*                                                                       */\n  /*    A variant may be either `default' or `non-default'.  A default     */\n  /*    variant is the one you will get for that code point if you look it */\n  /*    up in the standard Unicode cmap.  A non-default variant is a       */\n  /*    different glyph.                                                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Face_GetCharVariantIndex                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the glyph index of a given character code as modified by    */\n  /*    the variation selector.                                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face ::                                                            */\n  /*      A handle to the source face object.                              */\n  /*                                                                       */\n  /*    charcode ::                                                        */\n  /*      The character code point in Unicode.                             */\n  /*                                                                       */\n  /*    variantSelector ::                                                 */\n  /*      The Unicode code point of the variation selector.                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The glyph index.  0~means either `undefined character code', or    */\n  /*    `undefined selector code', or `no variation selector cmap          */\n  /*    subtable', or `current CharMap is not Unicode'.                    */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If you use FreeType to manipulate the contents of font files       */\n  /*    directly, be aware that the glyph index returned by this function  */\n  /*    doesn't always correspond to the internal indices used within      */\n  /*    the file.  This is done to ensure that value~0 always corresponds  */\n  /*    to the `missing glyph'.                                            */\n  /*                                                                       */\n  /*    This function is only meaningful if                                */\n  /*      a) the font has a variation selector cmap sub table,             */\n  /*    and                                                                */\n  /*      b) the current charmap has a Unicode encoding.                   */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.3.6                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_UInt )\n  FT_Face_GetCharVariantIndex( FT_Face   face,\n                               FT_ULong  charcode,\n                               FT_ULong  variantSelector );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Face_GetCharVariantIsDefault                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Check whether this variant of this Unicode character is the one to */\n  /*    be found in the `cmap'.                                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face ::                                                            */\n  /*      A handle to the source face object.                              */\n  /*                                                                       */\n  /*    charcode ::                                                        */\n  /*      The character codepoint in Unicode.                              */\n  /*                                                                       */\n  /*    variantSelector ::                                                 */\n  /*      The Unicode codepoint of the variation selector.                 */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    1~if found in the standard (Unicode) cmap, 0~if found in the       */\n  /*    variation selector cmap, or -1 if it is not a variant.             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function is only meaningful if the font has a variation       */\n  /*    selector cmap subtable.                                            */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.3.6                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_Int )\n  FT_Face_GetCharVariantIsDefault( FT_Face   face,\n                                   FT_ULong  charcode,\n                                   FT_ULong  variantSelector );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Face_GetVariantSelectors                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return a zero-terminated list of Unicode variant selectors found   */\n  /*    in the font.                                                       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face ::                                                            */\n  /*      A handle to the source face object.                              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A pointer to an array of selector code points, or NULL if there is */\n  /*    no valid variant selector cmap subtable.                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The last item in the array is~0; the array is owned by the         */\n  /*    @FT_Face object but can be overwritten or released on the next     */\n  /*    call to a FreeType function.                                       */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.3.6                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_UInt32* )\n  FT_Face_GetVariantSelectors( FT_Face  face );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Face_GetVariantsOfChar                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return a zero-terminated list of Unicode variant selectors found   */\n  /*    for the specified character code.                                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face ::                                                            */\n  /*      A handle to the source face object.                              */\n  /*                                                                       */\n  /*    charcode ::                                                        */\n  /*      The character codepoint in Unicode.                              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A pointer to an array of variant selector code points which are    */\n  /*    active for the given character, or NULL if the corresponding list  */\n  /*    is empty.                                                          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The last item in the array is~0; the array is owned by the         */\n  /*    @FT_Face object but can be overwritten or released on the next     */\n  /*    call to a FreeType function.                                       */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.3.6                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_UInt32* )\n  FT_Face_GetVariantsOfChar( FT_Face   face,\n                             FT_ULong  charcode );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Face_GetCharsOfVariant                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return a zero-terminated list of Unicode character codes found for */\n  /*    the specified variant selector.                                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face ::                                                            */\n  /*      A handle to the source face object.                              */\n  /*                                                                       */\n  /*    variantSelector ::                                                 */\n  /*      The variant selector code point in Unicode.                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A list of all the code points which are specified by this selector */\n  /*    (both default and non-default codes are returned) or NULL if there */\n  /*    is no valid cmap or the variant selector is invalid.               */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The last item in the array is~0; the array is owned by the         */\n  /*    @FT_Face object but can be overwritten or released on the next     */\n  /*    call to a FreeType function.                                       */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.3.6                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_UInt32* )\n  FT_Face_GetCharsOfVariant( FT_Face   face,\n                             FT_ULong  variantSelector );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    computations                                                       */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Computations                                                       */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Crunching fixed numbers and vectors.                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains various functions used to perform            */\n  /*    computations on 16.16 fixed-float numbers or 2d vectors.           */\n  /*                                                                       */\n  /* <Order>                                                               */\n  /*    FT_MulDiv                                                          */\n  /*    FT_MulFix                                                          */\n  /*    FT_DivFix                                                          */\n  /*    FT_RoundFix                                                        */\n  /*    FT_CeilFix                                                         */\n  /*    FT_FloorFix                                                        */\n  /*    FT_Vector_Transform                                                */\n  /*    FT_Matrix_Multiply                                                 */\n  /*    FT_Matrix_Invert                                                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_MulDiv                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A very simple function used to perform the computation `(a*b)/c'   */\n  /*    with maximum accuracy (it uses a 64-bit intermediate integer       */\n  /*    whenever necessary).                                               */\n  /*                                                                       */\n  /*    This function isn't necessarily as fast as some processor specific */\n  /*    operations, but is at least completely portable.                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    a :: The first multiplier.                                         */\n  /*    b :: The second multiplier.                                        */\n  /*    c :: The divisor.                                                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result of `(a*b)/c'.  This function never traps when trying to */\n  /*    divide by zero; it simply returns `MaxInt' or `MinInt' depending   */\n  /*    on the signs of `a' and `b'.                                       */\n  /*                                                                       */\n  FT_EXPORT( FT_Long )\n  FT_MulDiv( FT_Long  a,\n             FT_Long  b,\n             FT_Long  c );\n\n\n  /* */\n\n  /* The following #if 0 ... #endif is for the documentation formatter, */\n  /* hiding the internal `FT_MULFIX_INLINED' macro.                     */\n\n#if 0\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_MulFix                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A very simple function used to perform the computation             */\n  /*    `(a*b)/0x10000' with maximum accuracy.  Most of the time this is   */\n  /*    used to multiply a given value by a 16.16 fixed-point factor.      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    a :: The first multiplier.                                         */\n  /*    b :: The second multiplier.  Use a 16.16 factor here whenever      */\n  /*         possible (see note below).                                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result of `(a*b)/0x10000'.                                     */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function has been optimized for the case where the absolute   */\n  /*    value of `a' is less than 2048, and `b' is a 16.16 scaling factor. */\n  /*    As this happens mainly when scaling from notional units to         */\n  /*    fractional pixels in FreeType, it resulted in noticeable speed     */\n  /*    improvements between versions 2.x and 1.x.                         */\n  /*                                                                       */\n  /*    As a conclusion, always try to place a 16.16 factor as the         */\n  /*    _second_ argument of this function; this can make a great          */\n  /*    difference.                                                        */\n  /*                                                                       */\n  FT_EXPORT( FT_Long )\n  FT_MulFix( FT_Long  a,\n             FT_Long  b );\n\n  /* */\n#endif\n\n#ifdef FT_MULFIX_INLINED\n#define FPDFAPI_FT_MulFix( a, b )  FT_MULFIX_INLINED( a, b )\n#else\n  FT_EXPORT( FT_Long )\n  FT_MulFix( FT_Long  a,\n             FT_Long  b );\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_DivFix                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A very simple function used to perform the computation             */\n  /*    `(a*0x10000)/b' with maximum accuracy.  Most of the time, this is  */\n  /*    used to divide a given value by a 16.16 fixed-point factor.        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    a :: The first multiplier.                                         */\n  /*    b :: The second multiplier.  Use a 16.16 factor here whenever      */\n  /*         possible (see note below).                                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result of `(a*0x10000)/b'.                                     */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The optimization for FT_DivFix() is simple: If (a~<<~16) fits in   */\n  /*    32~bits, then the division is computed directly.  Otherwise, we    */\n  /*    use a specialized version of @FT_MulDiv.                           */\n  /*                                                                       */\n  FT_EXPORT( FT_Long )\n  FT_DivFix( FT_Long  a,\n             FT_Long  b );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_RoundFix                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A very simple function used to round a 16.16 fixed number.         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    a :: The number to be rounded.                                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result of `(a + 0x8000) & -0x10000'.                           */\n  /*                                                                       */\n  FT_EXPORT( FT_Fixed )\n  FT_RoundFix( FT_Fixed  a );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_CeilFix                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A very simple function used to compute the ceiling function of a   */\n  /*    16.16 fixed number.                                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    a :: The number for which the ceiling function is to be computed.  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result of `(a + 0x10000 - 1) & -0x10000'.                      */\n  /*                                                                       */\n  FT_EXPORT( FT_Fixed )\n  FT_CeilFix( FT_Fixed  a );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_FloorFix                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A very simple function used to compute the floor function of a     */\n  /*    16.16 fixed number.                                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    a :: The number for which the floor function is to be computed.    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result of `a & -0x10000'.                                      */\n  /*                                                                       */\n  FT_EXPORT( FT_Fixed )\n  FT_FloorFix( FT_Fixed  a );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Vector_Transform                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Transform a single vector through a 2x2 matrix.                    */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    vector :: The target vector to transform.                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    matrix :: A pointer to the source 2x2 matrix.                      */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The result is undefined if either `vector' or `matrix' is invalid. */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Vector_Transform( FT_Vector*        vec,\n                       const FT_Matrix*  matrix );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    version                                                            */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    FreeType Version                                                   */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Functions and macros related to FreeType versions.                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Note that those functions and macros are of limited use because    */\n  /*    even a new release of FreeType with only documentation changes     */\n  /*    increases the version number.                                      */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************\n   *\n   * @enum:\n   *   FREETYPE_XXX\n   *\n   * @description:\n   *   These three macros identify the FreeType source code version.\n   *   Use @FT_Library_Version to access them at runtime.\n   *\n   * @values:\n   *   FREETYPE_MAJOR :: The major version number.\n   *   FREETYPE_MINOR :: The minor version number.\n   *   FREETYPE_PATCH :: The patch level.\n   *\n   * @note:\n   *   The version number of FreeType if built as a dynamic link library\n   *   with the `libtool' package is _not_ controlled by these three\n   *   macros.\n   *\n   */\n#define FREETYPE_MAJOR  2\n#define FREETYPE_MINOR  5\n#define FREETYPE_PATCH  0\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Library_Version                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the version of the FreeType library being used.  This is    */\n  /*    useful when dynamically linking to the library, since one cannot   */\n  /*    use the macros @FREETYPE_MAJOR, @FREETYPE_MINOR, and               */\n  /*    @FREETYPE_PATCH.                                                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A source library handle.                                */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    amajor  :: The major version number.                               */\n  /*                                                                       */\n  /*    aminor  :: The minor version number.                               */\n  /*                                                                       */\n  /*    apatch  :: The patch version number.                               */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The reason why this function takes a `library' argument is because */\n  /*    certain programs implement library initialization in a custom way  */\n  /*    that doesn't use @FT_Init_FreeType.                                */\n  /*                                                                       */\n  /*    In such cases, the library version might not be available before   */\n  /*    the library object has been created.                               */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Library_Version( FT_Library   library,\n                      FT_Int      *amajor,\n                      FT_Int      *aminor,\n                      FT_Int      *apatch );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Face_CheckTrueTypePatents                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Parse all bytecode instructions of a TrueType font file to check   */\n  /*    whether any of the patented opcodes are used.  This is only useful */\n  /*    if you want to be able to use the unpatented hinter with           */\n  /*    fonts that do *not* use these opcodes.                             */\n  /*                                                                       */\n  /*    Note that this function parses *all* glyph instructions in the     */\n  /*    font file, which may be slow.                                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A face handle.                                             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    1~if this is a TrueType font that uses one of the patented         */\n  /*    opcodes, 0~otherwise.                                              */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Since May 2010, TrueType hinting is no longer patented.            */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.3.5                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_Bool )\n  FT_Face_CheckTrueTypePatents( FT_Face  face );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Face_SetUnpatentedHinting                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Enable or disable the unpatented hinter for a given face.          */\n  /*    Only enable it if you have determined that the face doesn't        */\n  /*    use any patented opcodes (see @FT_Face_CheckTrueTypePatents).      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face  :: A face handle.                                            */\n  /*                                                                       */\n  /*    value :: New boolean setting.                                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The old setting value.  This will always be false if this is not   */\n  /*    an SFNT font, or if the unpatented hinter is not compiled in this  */\n  /*    instance of the library.                                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Since May 2010, TrueType hinting is no longer patented.            */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.3.5                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_Bool )\n  FT_Face_SetUnpatentedHinting( FT_Face  face,\n                                FT_Bool  value );\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FREETYPE_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftadvanc.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftadvanc.h                                                             */\n/*                                                                         */\n/*    Quick computation of advance widths (specification only).            */\n/*                                                                         */\n/*  Copyright 2008, 2013 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTADVANC_H__\n#define __FTADVANC_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /**************************************************************************\n   *\n   * @section:\n   *   quick_advance\n   *\n   * @title:\n   *   Quick retrieval of advance values\n   *\n   * @abstract:\n   *   Retrieve horizontal and vertical advance values without processing\n   *   glyph outlines, if possible.\n   *\n   * @description:\n   *   This section contains functions to quickly extract advance values\n   *   without handling glyph outlines, if possible.\n   */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Const>                                                               */\n  /*    FT_ADVANCE_FLAG_FAST_ONLY                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A bit-flag to be OR-ed with the `flags' parameter of the           */\n  /*    @FT_Get_Advance and @FT_Get_Advances functions.                    */\n  /*                                                                       */\n  /*    If set, it indicates that you want these functions to fail if the  */\n  /*    corresponding hinting mode or font driver doesn't allow for very   */\n  /*    quick advance computation.                                         */\n  /*                                                                       */\n  /*    Typically, glyphs which are either unscaled, unhinted, bitmapped,  */\n  /*    or light-hinted can have their advance width computed very         */\n  /*    quickly.                                                           */\n  /*                                                                       */\n  /*    Normal and bytecode hinted modes, which require loading, scaling,  */\n  /*    and hinting of the glyph outline, are extremely slow by            */\n  /*    comparison.                                                        */\n  /*                                                                       */\n#define FT_ADVANCE_FLAG_FAST_ONLY  0x20000000UL\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Advance                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the advance value of a given glyph outline in an          */\n  /*    @FT_Face.                                                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face       :: The source @FT_Face handle.                          */\n  /*                                                                       */\n  /*    gindex     :: The glyph index.                                     */\n  /*                                                                       */\n  /*    load_flags :: A set of bit flags similar to those used when        */\n  /*                  calling @FT_Load_Glyph, used to determine what kind  */\n  /*                  of advances you need.                                */\n  /* <Output>                                                              */\n  /*    padvance :: The advance value.  If scaling is performed (based on  */\n  /*                the value of `load_flags'), the advance value is in    */\n  /*                16.16 format.  Otherwise, it is in font units.         */\n  /*                                                                       */\n  /*                If @FT_LOAD_VERTICAL_LAYOUT is set, this is the        */\n  /*                vertical advance corresponding to a vertical layout.   */\n  /*                Otherwise, it is the horizontal advance in a           */\n  /*                horizontal layout.                                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and   */\n  /*    if the corresponding font backend doesn't have a quick way to      */\n  /*    retrieve the advances.                                             */\n  /*                                                                       */\n  /*    A scaled advance is returned in 16.16 format but isn't transformed */\n  /*    by the affine transformation specified by @FT_Set_Transform.       */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_Advance( FT_Face    face,\n                  FT_UInt    gindex,\n                  FT_Int32   load_flags,\n                  FT_Fixed  *padvance );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Advances                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the advance values of several glyph outlines in an        */\n  /*    @FT_Face.                                                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face        :: The source @FT_Face handle.                         */\n  /*                                                                       */\n  /*    start       :: The first glyph index.                              */\n  /*                                                                       */\n  /*    count       :: The number of advance values you want to retrieve.  */\n  /*                                                                       */\n  /*    load_flags  :: A set of bit flags similar to those used when       */\n  /*                   calling @FT_Load_Glyph.                             */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    padvance :: The advance values.  This array, to be provided by the */\n  /*                caller, must contain at least `count' elements.        */\n  /*                                                                       */\n  /*                If scaling is performed (based on the value of         */\n  /*                `load_flags'), the advance values are in 16.16 format. */\n  /*                Otherwise, they are in font units.                     */\n  /*                                                                       */\n  /*                If @FT_LOAD_VERTICAL_LAYOUT is set, these are the      */\n  /*                vertical advances corresponding to a vertical layout.  */\n  /*                Otherwise, they are the horizontal advances in a       */\n  /*                horizontal layout.                                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and   */\n  /*    if the corresponding font backend doesn't have a quick way to      */\n  /*    retrieve the advances.                                             */\n  /*                                                                       */\n  /*    Scaled advances are returned in 16.16 format but aren't            */\n  /*    transformed by the affine transformation specified by              */\n  /*    @FT_Set_Transform.                                                 */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_Advances( FT_Face    face,\n                   FT_UInt    start,\n                   FT_UInt    count,\n                   FT_Int32   load_flags,\n                   FT_Fixed  *padvances );\n\n/* */\n\n\nFT_END_HEADER\n\n#endif /* __FTADVANC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftautoh.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftautoh.h                                                              */\n/*                                                                         */\n/*    FreeType API for controlling the auto-hinter (specification only).   */\n/*                                                                         */\n/*  Copyright 2012, 2013 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTAUTOH_H__\n#define __FTAUTOH_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /**************************************************************************\n   *\n   * @section:\n   *   auto_hinter\n   *\n   * @title:\n   *   The auto-hinter\n   *\n   * @abstract:\n   *   Controlling the auto-hinting module.\n   *\n   * @description:\n   *   While FreeType's auto-hinter doesn't expose API functions by itself,\n   *   it is possible to control its behaviour with @FT_Property_Set and\n   *   @FT_Property_Get.  The following lists the available properties\n   *   together with the necessary macros and structures.\n   *\n   *   Note that the auto-hinter's module name is `autofitter' for\n   *   historical reasons.\n   *\n   */\n\n\n  /**************************************************************************\n   *\n   * @property:\n   *   glyph-to-script-map\n   *\n   * @description:\n   *   *Experimental* *only*\n   *\n   *   The auto-hinter provides various script modules to hint glyphs.\n   *   Examples of supported scripts are Latin or CJK.  Before a glyph is\n   *   auto-hinted, the Unicode character map of the font gets examined, and\n   *   the script is then determined based on Unicode character ranges, see\n   *   below.\n   *\n   *   OpenType fonts, however, often provide much more glyphs than\n   *   character codes (small caps, superscripts, ligatures, swashes, etc.),\n   *   to be controlled by so-called `features'.  Handling OpenType features\n   *   can be quite complicated and thus needs a separate library on top of\n   *   FreeType.\n   *\n   *   The mapping between glyph indices and scripts (in the auto-hinter\n   *   sense, see the @FT_AUTOHINTER_SCRIPT_XXX values) is stored as an\n   *   array with `num_glyphs' elements, as found in the font's @FT_Face\n   *   structure.  The `glyph-to-script-map' property returns a pointer to\n   *   this array which can be modified as needed.  Note that the\n   *   modification should happen before the first glyph gets processed by\n   *   the auto-hinter so that the global analysis of the font shapes\n   *   actually uses the modified mapping.\n   *\n   *   The following example code demonstrates how to access it (omitting\n   *   the error handling).\n   *\n   *   {\n   *     FT_Library                library;\n   *     FT_Face                   face;\n   *     FT_Prop_GlyphToScriptMap  prop;\n   *\n   *\n   *     FT_Init_FreeType( &library );\n   *     FT_New_Face( library, \"foo.ttf\", 0, &face );\n   *\n   *     prop.face = face;\n   *\n   *     FT_Property_Get( library, \"autofitter\",\n   *                               \"glyph-to-script-map\", &prop );\n   *\n   *     // adjust `prop.map' as needed right here\n   *\n   *     FT_Load_Glyph( face, ..., FT_LOAD_FORCE_AUTOHINT );\n   *   }\n   *\n   */\n\n\n  /**************************************************************************\n   *\n   * @enum:\n   *   FT_AUTOHINTER_SCRIPT_XXX\n   *\n   * @description:\n   *   *Experimental* *only*\n   *\n   *   A list of constants used for the @glyph-to-script-map property to\n   *   specify the script submodule the auto-hinter should use for hinting a\n   *   particular glyph.\n   *\n   * @values:\n   *   FT_AUTOHINTER_SCRIPT_NONE ::\n   *     Don't auto-hint this glyph.\n   *\n   *   FT_AUTOHINTER_SCRIPT_LATIN ::\n   *     Apply the latin auto-hinter.  For the auto-hinter, `latin' is a\n   *     very broad term, including Cyrillic and Greek also since characters\n   *     from those scripts share the same design constraints.\n   *\n   *     By default, characters from the following Unicode ranges are\n   *     assigned to this submodule.\n   *\n   *     {\n   *       U+0020 - U+007F  // Basic Latin (no control characters)\n   *       U+00A0 - U+00FF  // Latin-1 Supplement (no control characters)\n   *       U+0100 - U+017F  // Latin Extended-A\n   *       U+0180 - U+024F  // Latin Extended-B\n   *       U+0250 - U+02AF  // IPA Extensions\n   *       U+02B0 - U+02FF  // Spacing Modifier Letters\n   *       U+0300 - U+036F  // Combining Diacritical Marks\n   *       U+0370 - U+03FF  // Greek and Coptic\n   *       U+0400 - U+04FF  // Cyrillic\n   *       U+0500 - U+052F  // Cyrillic Supplement\n   *       U+1D00 - U+1D7F  // Phonetic Extensions\n   *       U+1D80 - U+1DBF  // Phonetic Extensions Supplement\n   *       U+1DC0 - U+1DFF  // Combining Diacritical Marks Supplement\n   *       U+1E00 - U+1EFF  // Latin Extended Additional\n   *       U+1F00 - U+1FFF  // Greek Extended\n   *       U+2000 - U+206F  // General Punctuation\n   *       U+2070 - U+209F  // Superscripts and Subscripts\n   *       U+20A0 - U+20CF  // Currency Symbols\n   *       U+2150 - U+218F  // Number Forms\n   *       U+2460 - U+24FF  // Enclosed Alphanumerics\n   *       U+2C60 - U+2C7F  // Latin Extended-C\n   *       U+2DE0 - U+2DFF  // Cyrillic Extended-A\n   *       U+2E00 - U+2E7F  // Supplemental Punctuation\n   *       U+A640 - U+A69F  // Cyrillic Extended-B\n   *       U+A720 - U+A7FF  // Latin Extended-D\n   *       U+FB00 - U+FB06  // Alphab. Present. Forms (Latin Ligatures)\n   *      U+1D400 - U+1D7FF // Mathematical Alphanumeric Symbols\n   *      U+1F100 - U+1F1FF // Enclosed Alphanumeric Supplement\n   *     }\n   *\n   *   FT_AUTOHINTER_SCRIPT_CJK ::\n   *     Apply the CJK auto-hinter, covering Chinese, Japanese, Korean, old\n   *     Vietnamese, and some other scripts.\n   *\n   *     By default, characters from the following Unicode ranges are\n   *     assigned to this submodule.\n   *\n   *     {\n   *       U+1100 - U+11FF  // Hangul Jamo\n   *       U+2E80 - U+2EFF  // CJK Radicals Supplement\n   *       U+2F00 - U+2FDF  // Kangxi Radicals\n   *       U+2FF0 - U+2FFF  // Ideographic Description Characters\n   *       U+3000 - U+303F  // CJK Symbols and Punctuation\n   *       U+3040 - U+309F  // Hiragana\n   *       U+30A0 - U+30FF  // Katakana\n   *       U+3100 - U+312F  // Bopomofo\n   *       U+3130 - U+318F  // Hangul Compatibility Jamo\n   *       U+3190 - U+319F  // Kanbun\n   *       U+31A0 - U+31BF  // Bopomofo Extended\n   *       U+31C0 - U+31EF  // CJK Strokes\n   *       U+31F0 - U+31FF  // Katakana Phonetic Extensions\n   *       U+3200 - U+32FF  // Enclosed CJK Letters and Months\n   *       U+3300 - U+33FF  // CJK Compatibility\n   *       U+3400 - U+4DBF  // CJK Unified Ideographs Extension A\n   *       U+4DC0 - U+4DFF  // Yijing Hexagram Symbols\n   *       U+4E00 - U+9FFF  // CJK Unified Ideographs\n   *       U+A960 - U+A97F  // Hangul Jamo Extended-A\n   *       U+AC00 - U+D7AF  // Hangul Syllables\n   *       U+D7B0 - U+D7FF  // Hangul Jamo Extended-B\n   *       U+F900 - U+FAFF  // CJK Compatibility Ideographs\n   *       U+FE10 - U+FE1F  // Vertical forms\n   *       U+FE30 - U+FE4F  // CJK Compatibility Forms\n   *       U+FF00 - U+FFEF  // Halfwidth and Fullwidth Forms\n   *      U+1B000 - U+1B0FF // Kana Supplement\n   *      U+1D300 - U+1D35F // Tai Xuan Hing Symbols\n   *      U+1F200 - U+1F2FF // Enclosed Ideographic Supplement\n   *      U+20000 - U+2A6DF // CJK Unified Ideographs Extension B\n   *      U+2A700 - U+2B73F // CJK Unified Ideographs Extension C\n   *      U+2B740 - U+2B81F // CJK Unified Ideographs Extension D\n   *      U+2F800 - U+2FA1F // CJK Compatibility Ideographs Supplement\n   *     }\n   *\n   *   FT_AUTOHINTER_SCRIPT_INDIC ::\n   *     Apply the indic auto-hinter, covering all major scripts from the\n   *     Indian sub-continent and some other related scripts like Thai, Lao,\n   *     or Tibetan.\n   *\n   *     By default, characters from the following Unicode ranges are\n   *     assigned to this submodule.\n   *\n   *     {\n   *       U+0900 - U+0DFF  // Indic Range\n   *       U+0F00 - U+0FFF  // Tibetan\n   *       U+1900 - U+194F  // Limbu\n   *       U+1B80 - U+1BBF  // Sundanese\n   *       U+1C80 - U+1CDF  // Meetei Mayak\n   *       U+A800 - U+A82F  // Syloti Nagri\n   *      U+11800 - U+118DF // Sharada\n   *     }\n   *\n   *     Note that currently Indic support is rudimentary only, missing blue\n   *     zone support.\n   *\n   */\n#define FT_AUTOHINTER_SCRIPT_NONE   0\n#define FT_AUTOHINTER_SCRIPT_LATIN  1\n#define FT_AUTOHINTER_SCRIPT_CJK    2\n#define FT_AUTOHINTER_SCRIPT_INDIC  3\n\n\n  /**************************************************************************\n   *\n   * @struct:\n   *   FT_Prop_GlyphToScriptMap\n   *\n   * @description:\n   *   *Experimental* *only*\n   *\n   *   The data exchange structure for the @glyph-to-script-map property.\n   *\n   */\n   typedef struct  FT_Prop_GlyphToScriptMap_\n   {\n     FT_Face   face;\n     FT_Byte*  map;\n\n   } FT_Prop_GlyphToScriptMap;\n\n\n  /**************************************************************************\n   *\n   * @property:\n   *   fallback-script\n   *\n   * @description:\n   *   *Experimental* *only*\n   *\n   *   If no auto-hinter script module can be assigned to a glyph, a\n   *   fallback script gets assigned to it (see also the\n   *   @glyph-to-script-map property).  By default, this is\n   *   @FT_AUTOHINTER_SCRIPT_CJK.  Using the `fallback-script' property,\n   *   this fallback value can be changed.\n   *\n   *   {\n   *     FT_Library  library;\n   *     FT_UInt     fallback_script = FT_AUTOHINTER_SCRIPT_NONE;\n   *\n   *\n   *     FT_Init_FreeType( &library );\n   *\n   *     FT_Property_Set( library, \"autofitter\",\n   *                               \"fallback-script\", &fallback_script );\n   *   }\n   *\n   * @note:\n   *   This property can be used with @FT_Property_Get also.\n   *\n   *   It's important to use the right timing for changing this value: The\n   *   creation of the glyph-to-script map which eventually uses the\n   *   fallback script value gets triggered either by setting or reading a\n   *   face-specific property like @glyph-to-script-map, or by auto-hinting\n   *   any glyph from that face.  In particular, if you have already created\n   *   an @FT_Face structure but not loaded any glyph (using the\n   *   auto-hinter), a change of the fallback glyph will affect this face.\n   *\n   */\n\n\n  /**************************************************************************\n   *\n   * @property:\n   *   increase-x-height\n   *\n   * @description:\n   *   For ppem values in the range 6~<= ppem <= `increase-x-height', round\n   *   up the font's x~height much more often than normally.  If the value\n   *   is set to~0, which is the default, this feature is switched off.  Use\n   *   this property to improve the legibility of small font sizes if\n   *   necessary.\n   *\n   *   {\n   *     FT_Library               library;\n   *     FT_Face                  face;\n   *     FT_Prop_IncreaseXHeight  prop;\n   *\n   *\n   *     FT_Init_FreeType( &library );\n   *     FT_New_Face( library, \"foo.ttf\", 0, &face );\n   *     FT_Set_Char_Size( face, 10 * 64, 0, 72, 0 );\n   *\n   *     prop.face  = face;\n   *     prop.limit = 14;\n   *\n   *     FT_Property_Set( library, \"autofitter\",\n   *                               \"increase-x-height\", &prop );\n   *   }\n   *\n   * @note:\n   *   This property can be used with @FT_Property_Get also.\n   *\n   *   Set this value right after calling @FT_Set_Char_Size, but before\n   *   loading any glyph (using the auto-hinter).\n   *\n   */\n\n\n  /**************************************************************************\n   *\n   * @struct:\n   *   FT_Prop_IncreaseXHeight\n   *\n   * @description:\n   *   The data exchange structure for the @increase-x-height property.\n   *\n   */\n   typedef struct  FT_Prop_IncreaseXHeight_\n   {\n     FT_Face  face;\n     FT_UInt  limit;\n\n   } FT_Prop_IncreaseXHeight;\n\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FTAUTOH_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbbox.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftbbox.h                                                               */\n/*                                                                         */\n/*    FreeType exact bbox computation (specification).                     */\n/*                                                                         */\n/*  Copyright 1996-2001, 2003, 2007, 2011 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This component has a _single_ role: to compute exact outline bounding */\n  /* boxes.                                                                */\n  /*                                                                       */\n  /* It is separated from the rest of the engine for various technical     */\n  /* reasons.  It may well be integrated in `ftoutln' later.               */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTBBOX_H__\n#define __FTBBOX_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    outline_processing                                                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Get_BBox                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Compute the exact bounding box of an outline.  This is slower      */\n  /*    than computing the control box.  However, it uses an advanced      */\n  /*    algorithm which returns _very_ quickly when the two boxes          */\n  /*    coincide.  Otherwise, the outline Bézier arcs are traversed to     */\n  /*    extract their extrema.                                             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    outline :: A pointer to the source outline.                        */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    abbox   :: The outline's exact bounding box.                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If the font is tricky and the glyph has been loaded with           */\n  /*    @FT_LOAD_NO_SCALE, the resulting BBox is meaningless.  To get      */\n  /*    reasonable values for the BBox it is necessary to load the glyph   */\n  /*    at a large ppem value (so that the hinting instructions can        */\n  /*    properly shift and scale the subglyphs), then extracting the BBox  */\n  /*    which can be eventually converted back to font units.              */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_Get_BBox( FT_Outline*  outline,\n                       FT_BBox     *abbox );\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTBBOX_H__ */\n\n\n/* END */\n\n\n/* Local Variables: */\n/* coding: utf-8    */\n/* End:             */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbdf.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftbdf.h                                                                */\n/*                                                                         */\n/*    FreeType API for accessing BDF-specific strings (specification).     */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2004, 2006, 2009 by                              */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTBDF_H__\n#define __FTBDF_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    bdf_fonts                                                          */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    BDF and PCF Files                                                  */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    BDF and PCF specific API.                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of functions specific to BDF */\n  /*    and PCF fonts.                                                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /**********************************************************************\n   *\n   * @enum:\n   *    FT_PropertyType\n   *\n   * @description:\n   *    A list of BDF property types.\n   *\n   * @values:\n   *    BDF_PROPERTY_TYPE_NONE ::\n   *      Value~0 is used to indicate a missing property.\n   *\n   *    BDF_PROPERTY_TYPE_ATOM ::\n   *      Property is a string atom.\n   *\n   *    BDF_PROPERTY_TYPE_INTEGER ::\n   *      Property is a 32-bit signed integer.\n   *\n   *    BDF_PROPERTY_TYPE_CARDINAL ::\n   *      Property is a 32-bit unsigned integer.\n   */\n  typedef enum  BDF_PropertyType_\n  {\n    BDF_PROPERTY_TYPE_NONE     = 0,\n    BDF_PROPERTY_TYPE_ATOM     = 1,\n    BDF_PROPERTY_TYPE_INTEGER  = 2,\n    BDF_PROPERTY_TYPE_CARDINAL = 3\n\n  } BDF_PropertyType;\n\n\n  /**********************************************************************\n   *\n   * @type:\n   *    BDF_Property\n   *\n   * @description:\n   *    A handle to a @BDF_PropertyRec structure to model a given\n   *    BDF/PCF property.\n   */\n  typedef struct BDF_PropertyRec_*  BDF_Property;\n\n\n /**********************************************************************\n  *\n  * @struct:\n  *    BDF_PropertyRec\n  *\n  * @description:\n  *    This structure models a given BDF/PCF property.\n  *\n  * @fields:\n  *    type ::\n  *      The property type.\n  *\n  *    u.atom ::\n  *      The atom string, if type is @BDF_PROPERTY_TYPE_ATOM.\n  *\n  *    u.integer ::\n  *      A signed integer, if type is @BDF_PROPERTY_TYPE_INTEGER.\n  *\n  *    u.cardinal ::\n  *      An unsigned integer, if type is @BDF_PROPERTY_TYPE_CARDINAL.\n  */\n  typedef struct  BDF_PropertyRec_\n  {\n    BDF_PropertyType  type;\n    union {\n      const char*     atom;\n      FT_Int32        integer;\n      FT_UInt32       cardinal;\n\n    } u;\n\n  } BDF_PropertyRec;\n\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_Get_BDF_Charset_ID\n  *\n  * @description:\n  *    Retrieve a BDF font character set identity, according to\n  *    the BDF specification.\n  *\n  * @input:\n  *    face ::\n  *       A handle to the input face.\n  *\n  * @output:\n  *    acharset_encoding ::\n  *       Charset encoding, as a C~string, owned by the face.\n  *\n  *    acharset_registry ::\n  *       Charset registry, as a C~string, owned by the face.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   This function only works with BDF faces, returning an error otherwise.\n  */\n  FT_EXPORT( FT_Error )\n  FT_Get_BDF_Charset_ID( FT_Face       face,\n                         const char*  *acharset_encoding,\n                         const char*  *acharset_registry );\n\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_Get_BDF_Property\n  *\n  * @description:\n  *    Retrieve a BDF property from a BDF or PCF font file.\n  *\n  * @input:\n  *    face :: A handle to the input face.\n  *\n  *    name :: The property name.\n  *\n  * @output:\n  *    aproperty :: The property.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   This function works with BDF _and_ PCF fonts.  It returns an error\n  *   otherwise.  It also returns an error if the property is not in the\n  *   font.\n  *\n  *   A `property' is a either key-value pair within the STARTPROPERTIES\n  *   ... ENDPROPERTIES block of a BDF font or a key-value pair from the\n  *   `info->props' array within a `FontRec' structure of a PCF font.\n  *\n  *   Integer properties are always stored as `signed' within PCF fonts;\n  *   consequently, @BDF_PROPERTY_TYPE_CARDINAL is a possible return value\n  *   for BDF fonts only.\n  *\n  *   In case of error, `aproperty->type' is always set to\n  *   @BDF_PROPERTY_TYPE_NONE.\n  */\n  FT_EXPORT( FT_Error )\n  FT_Get_BDF_Property( FT_Face           face,\n                       const char*       prop_name,\n                       BDF_PropertyRec  *aproperty );\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FTBDF_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbitmap.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftbitmap.h                                                             */\n/*                                                                         */\n/*    FreeType utility functions for bitmaps (specification).              */\n/*                                                                         */\n/*  Copyright 2004-2006, 2008, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTBITMAP_H__\n#define __FTBITMAP_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    bitmap_handling                                                    */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Bitmap Handling                                                    */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Handling FT_Bitmap objects.                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains functions for converting FT_Bitmap objects.  */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Bitmap_New                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initialize a pointer to an @FT_Bitmap structure.                   */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    abitmap :: A pointer to the bitmap structure.                      */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Bitmap_New( FT_Bitmap  *abitmap );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Bitmap_Copy                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Copy a bitmap into another one.                                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle to a library object.                           */\n  /*                                                                       */\n  /*    source  :: A handle to the source bitmap.                          */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    target  :: A handle to the target bitmap.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Bitmap_Copy( FT_Library        library,\n                  const FT_Bitmap  *source,\n                  FT_Bitmap        *target);\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Bitmap_Embolden                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Embolden a bitmap.  The new bitmap will be about `xStrength'       */\n  /*    pixels wider and `yStrength' pixels higher.  The left and bottom   */\n  /*    borders are kept unchanged.                                        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library   :: A handle to a library object.                         */\n  /*                                                                       */\n  /*    xStrength :: How strong the glyph is emboldened horizontally.      */\n  /*                 Expressed in 26.6 pixel format.                       */\n  /*                                                                       */\n  /*    yStrength :: How strong the glyph is emboldened vertically.        */\n  /*                 Expressed in 26.6 pixel format.                       */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    bitmap    :: A handle to the target bitmap.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The current implementation restricts `xStrength' to be less than   */\n  /*    or equal to~8 if bitmap is of pixel_mode @FT_PIXEL_MODE_MONO.      */\n  /*                                                                       */\n  /*    If you want to embolden the bitmap owned by a @FT_GlyphSlotRec,    */\n  /*    you should call @FT_GlyphSlot_Own_Bitmap on the slot first.        */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Bitmap_Embolden( FT_Library  library,\n                      FT_Bitmap*  bitmap,\n                      FT_Pos      xStrength,\n                      FT_Pos      yStrength );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Bitmap_Convert                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Convert a bitmap object with depth 1bpp, 2bpp, 4bpp, 8bpp or 32bpp */\n  /*    to a bitmap object with depth 8bpp, making the number of used      */\n  /*    bytes line (a.k.a. the `pitch') a multiple of `alignment'.         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library   :: A handle to a library object.                         */\n  /*                                                                       */\n  /*    source    :: The source bitmap.                                    */\n  /*                                                                       */\n  /*    alignment :: The pitch of the bitmap is a multiple of this         */\n  /*                 parameter.  Common values are 1, 2, or 4.             */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    target    :: The target bitmap.                                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    It is possible to call @FT_Bitmap_Convert multiple times without   */\n  /*    calling @FT_Bitmap_Done (the memory is simply reallocated).        */\n  /*                                                                       */\n  /*    Use @FT_Bitmap_Done to finally remove the bitmap object.           */\n  /*                                                                       */\n  /*    The `library' argument is taken to have access to FreeType's       */\n  /*    memory handling functions.                                         */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Bitmap_Convert( FT_Library        library,\n                     const FT_Bitmap  *source,\n                     FT_Bitmap        *target,\n                     FT_Int            alignment );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_GlyphSlot_Own_Bitmap                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Make sure that a glyph slot owns `slot->bitmap'.                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    slot :: The glyph slot.                                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function is to be used in combination with                    */\n  /*    @FT_Bitmap_Embolden.                                               */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot  slot );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Bitmap_Done                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Destroy a bitmap object created with @FT_Bitmap_New.               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle to a library object.                           */\n  /*                                                                       */\n  /*    bitmap  :: The bitmap object to be freed.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The `library' argument is taken to have access to FreeType's       */\n  /*    memory handling functions.                                         */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Bitmap_Done( FT_Library  library,\n                  FT_Bitmap  *bitmap );\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTBITMAP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbzip2.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftbzip2.h                                                              */\n/*                                                                         */\n/*    Bzip2-compressed stream support.                                     */\n/*                                                                         */\n/*  Copyright 2010 by                                                      */\n/*  Joel Klinghed.                                                         */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTBZIP2_H__\n#define __FTBZIP2_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    bzip2                                                              */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    BZIP2 Streams                                                      */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Using bzip2-compressed font files.                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of Bzip2-specific functions. */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n /************************************************************************\n  *\n  * @function:\n  *   FT_Stream_OpenBzip2\n  *\n  * @description:\n  *   Open a new stream to parse bzip2-compressed font files.  This is\n  *   mainly used to support the compressed `*.pcf.bz2' fonts that come\n  *   with XFree86.\n  *\n  * @input:\n  *   stream ::\n  *     The target embedding stream.\n  *\n  *   source ::\n  *     The source stream.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   The source stream must be opened _before_ calling this function.\n  *\n  *   Calling the internal function `FT_Stream_Close' on the new stream will\n  *   *not* call `FT_Stream_Close' on the source stream.  None of the stream\n  *   objects will be released to the heap.\n  *\n  *   The stream implementation is very basic and resets the decompression\n  *   process each time seeking backwards is needed within the stream.\n  *\n  *   In certain builds of the library, bzip2 compression recognition is\n  *   automatically handled when calling @FT_New_Face or @FT_Open_Face.\n  *   This means that if no font driver is capable of handling the raw\n  *   compressed file, the library will try to open a bzip2 compressed stream\n  *   from it and re-open the face with it.\n  *\n  *   This function may return `FT_Err_Unimplemented_Feature' if your build\n  *   of FreeType was not compiled with bzip2 support.\n  */\n  FT_EXPORT( FT_Error )\n  FT_Stream_OpenBzip2( FT_Stream  stream,\n                       FT_Stream  source );\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTBZIP2_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcache.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcache.h                                                              */\n/*                                                                         */\n/*    FreeType Cache subsystem (specification).                            */\n/*                                                                         */\n/*  Copyright 1996-2008, 2010, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTCACHE_H__\n#define __FTCACHE_H__\n\n\n#include \"../ft2build.h\"\n#include \"ftglyph.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************\n   *\n   * <Section>\n   *    cache_subsystem\n   *\n   * <Title>\n   *    Cache Sub-System\n   *\n   * <Abstract>\n   *    How to cache face, size, and glyph data with FreeType~2.\n   *\n   * <Description>\n   *   This section describes the FreeType~2 cache sub-system, which is used\n   *   to limit the number of concurrently opened @FT_Face and @FT_Size\n   *   objects, as well as caching information like character maps and glyph\n   *   images while limiting their maximum memory usage.\n   *\n   *   Note that all types and functions begin with the `FTC_' prefix.\n   *\n   *   The cache is highly portable and thus doesn't know anything about the\n   *   fonts installed on your system, or how to access them.  This implies\n   *   the following scheme:\n   *\n   *   First, available or installed font faces are uniquely identified by\n   *   @FTC_FaceID values, provided to the cache by the client.  Note that\n   *   the cache only stores and compares these values, and doesn't try to\n   *   interpret them in any way.\n   *\n   *   Second, the cache calls, only when needed, a client-provided function\n   *   to convert an @FTC_FaceID into a new @FT_Face object.  The latter is\n   *   then completely managed by the cache, including its termination\n   *   through @FT_Done_Face.  To monitor termination of face objects, the\n   *   finalizer callback in the `generic' field of the @FT_Face object can\n   *   be used, which might also be used to store the @FTC_FaceID of the\n   *   face.\n   *\n   *   Clients are free to map face IDs to anything else.  The most simple\n   *   usage is to associate them to a (pathname,face_index) pair that is\n   *   used to call @FT_New_Face.  However, more complex schemes are also\n   *   possible.\n   *\n   *   Note that for the cache to work correctly, the face ID values must be\n   *   *persistent*, which means that the contents they point to should not\n   *   change at runtime, or that their value should not become invalid.\n   *\n   *   If this is unavoidable (e.g., when a font is uninstalled at runtime),\n   *   you should call @FTC_Manager_RemoveFaceID as soon as possible, to let\n   *   the cache get rid of any references to the old @FTC_FaceID it may\n   *   keep internally.  Failure to do so will lead to incorrect behaviour\n   *   or even crashes.\n   *\n   *   To use the cache, start with calling @FTC_Manager_New to create a new\n   *   @FTC_Manager object, which models a single cache instance.  You can\n   *   then look up @FT_Face and @FT_Size objects with\n   *   @FTC_Manager_LookupFace and @FTC_Manager_LookupSize, respectively.\n   *\n   *   If you want to use the charmap caching, call @FTC_CMapCache_New, then\n   *   later use @FTC_CMapCache_Lookup to perform the equivalent of\n   *   @FT_Get_Char_Index, only much faster.\n   *\n   *   If you want to use the @FT_Glyph caching, call @FTC_ImageCache, then\n   *   later use @FTC_ImageCache_Lookup to retrieve the corresponding\n   *   @FT_Glyph objects from the cache.\n   *\n   *   If you need lots of small bitmaps, it is much more memory efficient\n   *   to call @FTC_SBitCache_New followed by @FTC_SBitCache_Lookup.  This\n   *   returns @FTC_SBitRec structures, which are used to store small\n   *   bitmaps directly.  (A small bitmap is one whose metrics and\n   *   dimensions all fit into 8-bit integers).\n   *\n   *   We hope to also provide a kerning cache in the near future.\n   *\n   *\n   * <Order>\n   *   FTC_Manager\n   *   FTC_FaceID\n   *   FTC_Face_Requester\n   *\n   *   FTC_Manager_New\n   *   FTC_Manager_Reset\n   *   FTC_Manager_Done\n   *   FTC_Manager_LookupFace\n   *   FTC_Manager_LookupSize\n   *   FTC_Manager_RemoveFaceID\n   *\n   *   FTC_Node\n   *   FTC_Node_Unref\n   *\n   *   FTC_ImageCache\n   *   FTC_ImageCache_New\n   *   FTC_ImageCache_Lookup\n   *\n   *   FTC_SBit\n   *   FTC_SBitCache\n   *   FTC_SBitCache_New\n   *   FTC_SBitCache_Lookup\n   *\n   *   FTC_CMapCache\n   *   FTC_CMapCache_New\n   *   FTC_CMapCache_Lookup\n   *\n   *************************************************************************/\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    BASIC TYPE DEFINITIONS                     *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************\n   *\n   * @type: FTC_FaceID\n   *\n   * @description:\n   *   An opaque pointer type that is used to identity face objects.  The\n   *   contents of such objects is application-dependent.\n   *\n   *   These pointers are typically used to point to a user-defined\n   *   structure containing a font file path, and face index.\n   *\n   * @note:\n   *   Never use NULL as a valid @FTC_FaceID.\n   *\n   *   Face IDs are passed by the client to the cache manager, which calls,\n   *   when needed, the @FTC_Face_Requester to translate them into new\n   *   @FT_Face objects.\n   *\n   *   If the content of a given face ID changes at runtime, or if the value\n   *   becomes invalid (e.g., when uninstalling a font), you should\n   *   immediately call @FTC_Manager_RemoveFaceID before any other cache\n   *   function.\n   *\n   *   Failure to do so will result in incorrect behaviour or even\n   *   memory leaks and crashes.\n   */\n  typedef FT_Pointer  FTC_FaceID;\n\n\n  /************************************************************************\n   *\n   * @functype:\n   *   FTC_Face_Requester\n   *\n   * @description:\n   *   A callback function provided by client applications.  It is used by\n   *   the cache manager to translate a given @FTC_FaceID into a new valid\n   *   @FT_Face object, on demand.\n   *\n   * <Input>\n   *   face_id ::\n   *     The face ID to resolve.\n   *\n   *   library ::\n   *     A handle to a FreeType library object.\n   *\n   *   req_data ::\n   *     Application-provided request data (see note below).\n   *\n   * <Output>\n   *   aface ::\n   *     A new @FT_Face handle.\n   *\n   * <Return>\n   *   FreeType error code.  0~means success.\n   *\n   * <Note>\n   *   The third parameter `req_data' is the same as the one passed by the\n   *   client when @FTC_Manager_New is called.\n   *\n   *   The face requester should not perform funny things on the returned\n   *   face object, like creating a new @FT_Size for it, or setting a\n   *   transformation through @FT_Set_Transform!\n   */\n  typedef FT_Error\n  (*FTC_Face_Requester)( FTC_FaceID  face_id,\n                         FT_Library  library,\n                         FT_Pointer  request_data,\n                         FT_Face*    aface );\n\n /* */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      CACHE MANAGER OBJECT                     *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FTC_Manager                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This object corresponds to one instance of the cache-subsystem.    */\n  /*    It is used to cache one or more @FT_Face objects, along with       */\n  /*    corresponding @FT_Size objects.                                    */\n  /*                                                                       */\n  /*    The manager intentionally limits the total number of opened        */\n  /*    @FT_Face and @FT_Size objects to control memory usage.  See the    */\n  /*    `max_faces' and `max_sizes' parameters of @FTC_Manager_New.        */\n  /*                                                                       */\n  /*    The manager is also used to cache `nodes' of various types while   */\n  /*    limiting their total memory usage.                                 */\n  /*                                                                       */\n  /*    All limitations are enforced by keeping lists of managed objects   */\n  /*    in most-recently-used order, and flushing old nodes to make room   */\n  /*    for new ones.                                                      */\n  /*                                                                       */\n  typedef struct FTC_ManagerRec_*  FTC_Manager;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FTC_Node                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An opaque handle to a cache node object.  Each cache node is       */\n  /*    reference-counted.  A node with a count of~0 might be flushed      */\n  /*    out of a full cache whenever a lookup request is performed.        */\n  /*                                                                       */\n  /*    If you look up nodes, you have the ability to `acquire' them,      */\n  /*    i.e., to increment their reference count.  This will prevent the   */\n  /*    node from being flushed out of the cache until you explicitly      */\n  /*    `release' it (see @FTC_Node_Unref).                                */\n  /*                                                                       */\n  /*    See also @FTC_SBitCache_Lookup and @FTC_ImageCache_Lookup.         */\n  /*                                                                       */\n  typedef struct FTC_NodeRec_*  FTC_Node;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_Manager_New                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a new cache manager.                                        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library   :: The parent FreeType library handle to use.            */\n  /*                                                                       */\n  /*    max_faces :: Maximum number of opened @FT_Face objects managed by  */\n  /*                 this cache instance.  Use~0 for defaults.             */\n  /*                                                                       */\n  /*    max_sizes :: Maximum number of opened @FT_Size objects managed by  */\n  /*                 this cache instance.  Use~0 for defaults.             */\n  /*                                                                       */\n  /*    max_bytes :: Maximum number of bytes to use for cached data nodes. */\n  /*                 Use~0 for defaults.  Note that this value does not    */\n  /*                 account for managed @FT_Face and @FT_Size objects.    */\n  /*                                                                       */\n  /*    requester :: An application-provided callback used to translate    */\n  /*                 face IDs into real @FT_Face objects.                  */\n  /*                                                                       */\n  /*    req_data  :: A generic pointer that is passed to the requester     */\n  /*                 each time it is called (see @FTC_Face_Requester).     */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    amanager  :: A handle to a new manager object.  0~in case of       */\n  /*                 failure.                                              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_Manager_New( FT_Library          library,\n                   FT_UInt             max_faces,\n                   FT_UInt             max_sizes,\n                   FT_ULong            max_bytes,\n                   FTC_Face_Requester  requester,\n                   FT_Pointer          req_data,\n                   FTC_Manager        *amanager );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_Manager_Reset                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Empty a given cache manager.  This simply gets rid of all the      */\n  /*    currently cached @FT_Face and @FT_Size objects within the manager. */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    manager :: A handle to the manager.                                */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FTC_Manager_Reset( FTC_Manager  manager );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_Manager_Done                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Destroy a given manager after emptying it.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    manager :: A handle to the target cache manager object.            */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FTC_Manager_Done( FTC_Manager  manager );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_Manager_LookupFace                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the @FT_Face object that corresponds to a given face ID   */\n  /*    through a cache manager.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    manager :: A handle to the cache manager.                          */\n  /*                                                                       */\n  /*    face_id :: The ID of the face object.                              */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aface   :: A handle to the face object.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The returned @FT_Face object is always owned by the manager.  You  */\n  /*    should never try to discard it yourself.                           */\n  /*                                                                       */\n  /*    The @FT_Face object doesn't necessarily have a current size object */\n  /*    (i.e., face->size can be~0).  If you need a specific `font size',  */\n  /*    use @FTC_Manager_LookupSize instead.                               */\n  /*                                                                       */\n  /*    Never change the face's transformation matrix (i.e., never call    */\n  /*    the @FT_Set_Transform function) on a returned face!  If you need   */\n  /*    to transform glyphs, do it yourself after glyph loading.           */\n  /*                                                                       */\n  /*    When you perform a lookup, out-of-memory errors are detected       */\n  /*    _within_ the lookup and force incremental flushes of the cache     */\n  /*    until enough memory is released for the lookup to succeed.         */\n  /*                                                                       */\n  /*    If a lookup fails with `FT_Err_Out_Of_Memory' the cache has        */\n  /*    already been completely flushed, and still no memory was available */\n  /*    for the operation.                                                 */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_Manager_LookupFace( FTC_Manager  manager,\n                          FTC_FaceID   face_id,\n                          FT_Face     *aface );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FTC_ScalerRec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to describe a given character size in either      */\n  /*    pixels or points to the cache manager.  See                        */\n  /*    @FTC_Manager_LookupSize.                                           */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    face_id :: The source face ID.                                     */\n  /*                                                                       */\n  /*    width   :: The character width.                                    */\n  /*                                                                       */\n  /*    height  :: The character height.                                   */\n  /*                                                                       */\n  /*    pixel   :: A Boolean.  If 1, the `width' and `height' fields are   */\n  /*               interpreted as integer pixel character sizes.           */\n  /*               Otherwise, they are expressed as 1/64th of points.      */\n  /*                                                                       */\n  /*    x_res   :: Only used when `pixel' is value~0 to indicate the       */\n  /*               horizontal resolution in dpi.                           */\n  /*                                                                       */\n  /*    y_res   :: Only used when `pixel' is value~0 to indicate the       */\n  /*               vertical resolution in dpi.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This type is mainly used to retrieve @FT_Size objects through the  */\n  /*    cache manager.                                                     */\n  /*                                                                       */\n  typedef struct  FTC_ScalerRec_\n  {\n    FTC_FaceID  face_id;\n    FT_UInt     width;\n    FT_UInt     height;\n    FT_Int      pixel;\n    FT_UInt     x_res;\n    FT_UInt     y_res;\n\n  } FTC_ScalerRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FTC_Scaler                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to an @FTC_ScalerRec structure.                           */\n  /*                                                                       */\n  typedef struct FTC_ScalerRec_*  FTC_Scaler;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_Manager_LookupSize                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the @FT_Size object that corresponds to a given           */\n  /*    @FTC_ScalerRec pointer through a cache manager.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    manager :: A handle to the cache manager.                          */\n  /*                                                                       */\n  /*    scaler  :: A scaler handle.                                        */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    asize   :: A handle to the size object.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The returned @FT_Size object is always owned by the manager.  You  */\n  /*    should never try to discard it by yourself.                        */\n  /*                                                                       */\n  /*    You can access the parent @FT_Face object simply as `size->face'   */\n  /*    if you need it.  Note that this object is also owned by the        */\n  /*    manager.                                                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    When you perform a lookup, out-of-memory errors are detected       */\n  /*    _within_ the lookup and force incremental flushes of the cache     */\n  /*    until enough memory is released for the lookup to succeed.         */\n  /*                                                                       */\n  /*    If a lookup fails with `FT_Err_Out_Of_Memory' the cache has        */\n  /*    already been completely flushed, and still no memory is available  */\n  /*    for the operation.                                                 */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_Manager_LookupSize( FTC_Manager  manager,\n                          FTC_Scaler   scaler,\n                          FT_Size     *asize );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_Node_Unref                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Decrement a cache node's internal reference count.  When the count */\n  /*    reaches 0, it is not destroyed but becomes eligible for subsequent */\n  /*    cache flushes.                                                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    node    :: The cache node handle.                                  */\n  /*                                                                       */\n  /*    manager :: The cache manager handle.                               */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FTC_Node_Unref( FTC_Node     node,\n                  FTC_Manager  manager );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FTC_Manager_RemoveFaceID\n   *\n   * @description:\n   *   A special function used to indicate to the cache manager that\n   *   a given @FTC_FaceID is no longer valid, either because its\n   *   content changed, or because it was deallocated or uninstalled.\n   *\n   * @input:\n   *   manager ::\n   *     The cache manager handle.\n   *\n   *   face_id ::\n   *     The @FTC_FaceID to be removed.\n   *\n   * @note:\n   *   This function flushes all nodes from the cache corresponding to this\n   *   `face_id', with the exception of nodes with a non-null reference\n   *   count.\n   *\n   *   Such nodes are however modified internally so as to never appear\n   *   in later lookups with the same `face_id' value, and to be immediately\n   *   destroyed when released by all their users.\n   *\n   */\n  FT_EXPORT( void )\n  FTC_Manager_RemoveFaceID( FTC_Manager  manager,\n                            FTC_FaceID   face_id );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    cache_subsystem                                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n  /*************************************************************************\n   *\n   * @type:\n   *   FTC_CMapCache\n   *\n   * @description:\n   *   An opaque handle used to model a charmap cache.  This cache is to\n   *   hold character codes -> glyph indices mappings.\n   *\n   */\n  typedef struct FTC_CMapCacheRec_*  FTC_CMapCache;\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FTC_CMapCache_New\n   *\n   * @description:\n   *   Create a new charmap cache.\n   *\n   * @input:\n   *   manager ::\n   *     A handle to the cache manager.\n   *\n   * @output:\n   *   acache ::\n   *     A new cache handle.  NULL in case of error.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   Like all other caches, this one will be destroyed with the cache\n   *   manager.\n   *\n   */\n  FT_EXPORT( FT_Error )\n  FTC_CMapCache_New( FTC_Manager     manager,\n                     FTC_CMapCache  *acache );\n\n\n  /************************************************************************\n   *\n   * @function:\n   *   FTC_CMapCache_Lookup\n   *\n   * @description:\n   *   Translate a character code into a glyph index, using the charmap\n   *   cache.\n   *\n   * @input:\n   *   cache ::\n   *     A charmap cache handle.\n   *\n   *   face_id ::\n   *     The source face ID.\n   *\n   *   cmap_index ::\n   *     The index of the charmap in the source face.  Any negative value\n   *     means to use the cache @FT_Face's default charmap.\n   *\n   *   char_code ::\n   *     The character code (in the corresponding charmap).\n   *\n   * @return:\n   *    Glyph index.  0~means `no glyph'.\n   *\n   */\n  FT_EXPORT( FT_UInt )\n  FTC_CMapCache_Lookup( FTC_CMapCache  cache,\n                        FTC_FaceID     face_id,\n                        FT_Int         cmap_index,\n                        FT_UInt32      char_code );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    cache_subsystem                                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                       IMAGE CACHE OBJECT                      *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************\n   *\n   * @struct:\n   *   FTC_ImageTypeRec\n   *\n   * @description:\n   *   A structure used to model the type of images in a glyph cache.\n   *\n   * @fields:\n   *   face_id ::\n   *     The face ID.\n   *\n   *   width ::\n   *     The width in pixels.\n   *\n   *   height ::\n   *     The height in pixels.\n   *\n   *   flags ::\n   *     The load flags, as in @FT_Load_Glyph.\n   *\n   */\n  typedef struct  FTC_ImageTypeRec_\n  {\n    FTC_FaceID  face_id;\n    FT_Int      width;\n    FT_Int      height;\n    FT_Int32    flags;\n\n  } FTC_ImageTypeRec;\n\n\n  /*************************************************************************\n   *\n   * @type:\n   *   FTC_ImageType\n   *\n   * @description:\n   *   A handle to an @FTC_ImageTypeRec structure.\n   *\n   */\n  typedef struct FTC_ImageTypeRec_*  FTC_ImageType;\n\n\n  /* */\n\n\n#define FTC_IMAGE_TYPE_COMPARE( d1, d2 )      \\\n          ( (d1)->face_id == (d2)->face_id && \\\n            (d1)->width   == (d2)->width   && \\\n            (d1)->flags   == (d2)->flags   )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FTC_ImageCache                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a glyph image cache object.  They are designed to      */\n  /*    hold many distinct glyph images while not exceeding a certain      */\n  /*    memory threshold.                                                  */\n  /*                                                                       */\n  typedef struct FTC_ImageCacheRec_*  FTC_ImageCache;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_ImageCache_New                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a new glyph image cache.                                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    manager :: The parent manager for the image cache.                 */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    acache  :: A handle to the new glyph image cache object.           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_ImageCache_New( FTC_Manager      manager,\n                      FTC_ImageCache  *acache );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_ImageCache_Lookup                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve a given glyph image from a glyph image cache.             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    cache  :: A handle to the source glyph image cache.                */\n  /*                                                                       */\n  /*    type   :: A pointer to a glyph image type descriptor.              */\n  /*                                                                       */\n  /*    gindex :: The glyph index to retrieve.                             */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aglyph :: The corresponding @FT_Glyph object.  0~in case of        */\n  /*              failure.                                                 */\n  /*                                                                       */\n  /*    anode  :: Used to return the address of of the corresponding cache */\n  /*              node after incrementing its reference count (see note    */\n  /*              below).                                                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The returned glyph is owned and managed by the glyph image cache.  */\n  /*    Never try to transform or discard it manually!  You can however    */\n  /*    create a copy with @FT_Glyph_Copy and modify the new one.          */\n  /*                                                                       */\n  /*    If `anode' is _not_ NULL, it receives the address of the cache     */\n  /*    node containing the glyph image, after increasing its reference    */\n  /*    count.  This ensures that the node (as well as the @FT_Glyph) will */\n  /*    always be kept in the cache until you call @FTC_Node_Unref to      */\n  /*    `release' it.                                                      */\n  /*                                                                       */\n  /*    If `anode' is NULL, the cache node is left unchanged, which means  */\n  /*    that the @FT_Glyph could be flushed out of the cache on the next   */\n  /*    call to one of the caching sub-system APIs.  Don't assume that it  */\n  /*    is persistent!                                                     */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_ImageCache_Lookup( FTC_ImageCache  cache,\n                         FTC_ImageType   type,\n                         FT_UInt         gindex,\n                         FT_Glyph       *aglyph,\n                         FTC_Node       *anode );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_ImageCache_LookupScaler                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A variant of @FTC_ImageCache_Lookup that uses an @FTC_ScalerRec    */\n  /*    to specify the face ID and its size.                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    cache      :: A handle to the source glyph image cache.            */\n  /*                                                                       */\n  /*    scaler     :: A pointer to a scaler descriptor.                    */\n  /*                                                                       */\n  /*    load_flags :: The corresponding load flags.                        */\n  /*                                                                       */\n  /*    gindex     :: The glyph index to retrieve.                         */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aglyph     :: The corresponding @FT_Glyph object.  0~in case of    */\n  /*                  failure.                                             */\n  /*                                                                       */\n  /*    anode      :: Used to return the address of of the corresponding   */\n  /*                  cache node after incrementing its reference count    */\n  /*                  (see note below).                                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The returned glyph is owned and managed by the glyph image cache.  */\n  /*    Never try to transform or discard it manually!  You can however    */\n  /*    create a copy with @FT_Glyph_Copy and modify the new one.          */\n  /*                                                                       */\n  /*    If `anode' is _not_ NULL, it receives the address of the cache     */\n  /*    node containing the glyph image, after increasing its reference    */\n  /*    count.  This ensures that the node (as well as the @FT_Glyph) will */\n  /*    always be kept in the cache until you call @FTC_Node_Unref to      */\n  /*    `release' it.                                                      */\n  /*                                                                       */\n  /*    If `anode' is NULL, the cache node is left unchanged, which means  */\n  /*    that the @FT_Glyph could be flushed out of the cache on the next   */\n  /*    call to one of the caching sub-system APIs.  Don't assume that it  */\n  /*    is persistent!                                                     */\n  /*                                                                       */\n  /*    Calls to @FT_Set_Char_Size and friends have no effect on cached    */\n  /*    glyphs; you should always use the FreeType cache API instead.      */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_ImageCache_LookupScaler( FTC_ImageCache  cache,\n                               FTC_Scaler      scaler,\n                               FT_ULong        load_flags,\n                               FT_UInt         gindex,\n                               FT_Glyph       *aglyph,\n                               FTC_Node       *anode );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FTC_SBit                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a small bitmap descriptor.  See the @FTC_SBitRec       */\n  /*    structure for details.                                             */\n  /*                                                                       */\n  typedef struct FTC_SBitRec_*  FTC_SBit;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FTC_SBitRec                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A very compact structure used to describe a small glyph bitmap.    */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    width     :: The bitmap width in pixels.                           */\n  /*                                                                       */\n  /*    height    :: The bitmap height in pixels.                          */\n  /*                                                                       */\n  /*    left      :: The horizontal distance from the pen position to the  */\n  /*                 left bitmap border (a.k.a. `left side bearing', or    */\n  /*                 `lsb').                                               */\n  /*                                                                       */\n  /*    top       :: The vertical distance from the pen position (on the   */\n  /*                 baseline) to the upper bitmap border (a.k.a. `top     */\n  /*                 side bearing').  The distance is positive for upwards */\n  /*                 y~coordinates.                                        */\n  /*                                                                       */\n  /*    format    :: The format of the glyph bitmap (monochrome or gray).  */\n  /*                                                                       */\n  /*    max_grays :: Maximum gray level value (in the range 1 to~255).     */\n  /*                                                                       */\n  /*    pitch     :: The number of bytes per bitmap line.  May be positive */\n  /*                 or negative.                                          */\n  /*                                                                       */\n  /*    xadvance  :: The horizontal advance width in pixels.               */\n  /*                                                                       */\n  /*    yadvance  :: The vertical advance height in pixels.                */\n  /*                                                                       */\n  /*    buffer    :: A pointer to the bitmap pixels.                       */\n  /*                                                                       */\n  typedef struct  FTC_SBitRec_\n  {\n    FT_Byte   width;\n    FT_Byte   height;\n    FT_Char   left;\n    FT_Char   top;\n\n    FT_Byte   format;\n    FT_Byte   max_grays;\n    FT_Short  pitch;\n    FT_Char   xadvance;\n    FT_Char   yadvance;\n\n    FT_Byte*  buffer;\n\n  } FTC_SBitRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FTC_SBitCache                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a small bitmap cache.  These are special cache objects */\n  /*    used to store small glyph bitmaps (and anti-aliased pixmaps) in a  */\n  /*    much more efficient way than the traditional glyph image cache     */\n  /*    implemented by @FTC_ImageCache.                                    */\n  /*                                                                       */\n  typedef struct FTC_SBitCacheRec_*  FTC_SBitCache;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_SBitCache_New                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a new cache to store small glyph bitmaps.                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    manager :: A handle to the source cache manager.                   */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    acache  :: A handle to the new sbit cache.  NULL in case of error. */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_SBitCache_New( FTC_Manager     manager,\n                     FTC_SBitCache  *acache );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_SBitCache_Lookup                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Look up a given small glyph bitmap in a given sbit cache and       */\n  /*    `lock' it to prevent its flushing from the cache until needed.     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    cache  :: A handle to the source sbit cache.                       */\n  /*                                                                       */\n  /*    type   :: A pointer to the glyph image type descriptor.            */\n  /*                                                                       */\n  /*    gindex :: The glyph index.                                         */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    sbit   :: A handle to a small bitmap descriptor.                   */\n  /*                                                                       */\n  /*    anode  :: Used to return the address of of the corresponding cache */\n  /*              node after incrementing its reference count (see note    */\n  /*              below).                                                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The small bitmap descriptor and its bit buffer are owned by the    */\n  /*    cache and should never be freed by the application.  They might    */\n  /*    as well disappear from memory on the next cache lookup, so don't   */\n  /*    treat them as persistent data.                                     */\n  /*                                                                       */\n  /*    The descriptor's `buffer' field is set to~0 to indicate a missing  */\n  /*    glyph bitmap.                                                      */\n  /*                                                                       */\n  /*    If `anode' is _not_ NULL, it receives the address of the cache     */\n  /*    node containing the bitmap, after increasing its reference count.  */\n  /*    This ensures that the node (as well as the image) will always be   */\n  /*    kept in the cache until you call @FTC_Node_Unref to `release' it.  */\n  /*                                                                       */\n  /*    If `anode' is NULL, the cache node is left unchanged, which means  */\n  /*    that the bitmap could be flushed out of the cache on the next      */\n  /*    call to one of the caching sub-system APIs.  Don't assume that it  */\n  /*    is persistent!                                                     */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_SBitCache_Lookup( FTC_SBitCache    cache,\n                        FTC_ImageType    type,\n                        FT_UInt          gindex,\n                        FTC_SBit        *sbit,\n                        FTC_Node        *anode );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_SBitCache_LookupScaler                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A variant of @FTC_SBitCache_Lookup that uses an @FTC_ScalerRec     */\n  /*    to specify the face ID and its size.                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    cache      :: A handle to the source sbit cache.                   */\n  /*                                                                       */\n  /*    scaler     :: A pointer to the scaler descriptor.                  */\n  /*                                                                       */\n  /*    load_flags :: The corresponding load flags.                        */\n  /*                                                                       */\n  /*    gindex     :: The glyph index.                                     */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    sbit       :: A handle to a small bitmap descriptor.               */\n  /*                                                                       */\n  /*    anode      :: Used to return the address of of the corresponding   */\n  /*                  cache node after incrementing its reference count    */\n  /*                  (see note below).                                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The small bitmap descriptor and its bit buffer are owned by the    */\n  /*    cache and should never be freed by the application.  They might    */\n  /*    as well disappear from memory on the next cache lookup, so don't   */\n  /*    treat them as persistent data.                                     */\n  /*                                                                       */\n  /*    The descriptor's `buffer' field is set to~0 to indicate a missing  */\n  /*    glyph bitmap.                                                      */\n  /*                                                                       */\n  /*    If `anode' is _not_ NULL, it receives the address of the cache     */\n  /*    node containing the bitmap, after increasing its reference count.  */\n  /*    This ensures that the node (as well as the image) will always be   */\n  /*    kept in the cache until you call @FTC_Node_Unref to `release' it.  */\n  /*                                                                       */\n  /*    If `anode' is NULL, the cache node is left unchanged, which means  */\n  /*    that the bitmap could be flushed out of the cache on the next      */\n  /*    call to one of the caching sub-system APIs.  Don't assume that it  */\n  /*    is persistent!                                                     */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_SBitCache_LookupScaler( FTC_SBitCache  cache,\n                              FTC_Scaler     scaler,\n                              FT_ULong       load_flags,\n                              FT_UInt        gindex,\n                              FTC_SBit      *sbit,\n                              FTC_Node      *anode );\n\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FTCACHE_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcffdrv.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcffdrv.h                                                             */\n/*                                                                         */\n/*    FreeType API for controlling the CFF driver (specification only).    */\n/*                                                                         */\n/*  Copyright 2013 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTCFFDRV_H__\n#define __FTCFFDRV_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /**************************************************************************\n   *\n   * @section:\n   *   cff_driver\n   *\n   * @title:\n   *   The CFF driver\n   *\n   * @abstract:\n   *   Controlling the CFF driver module.\n   *\n   * @description:\n   *   While FreeType's CFF driver doesn't expose API functions by itself,\n   *   it is possible to control its behaviour with @FT_Property_Set and\n   *   @FT_Property_Get.  The following lists the available properties\n   *   together with the necessary macros and structures.\n   *\n   *   The CFF driver's module name is `cff'.\n   *\n   */\n\n\n  /**************************************************************************\n   *\n   * @property:\n   *   hinting-engine\n   *\n   * @description:\n   *   Thanks to Adobe, which contributed a new hinting (and parsing)\n   *   engine, an application can select between `freetype' and `adobe' if\n   *   compiled with CFF_CONFIG_OPTION_OLD_ENGINE.  If this configuration\n   *   macro isn't defined, `hinting-engine' does nothing.\n   *\n   *   The default engine is `freetype' if CFF_CONFIG_OPTION_OLD_ENGINE is\n   *   defined, and `adobe' otherwise.\n   *\n   *   The following example code demonstrates how to select Adobe's hinting\n   *   engine (omitting the error handling).\n   *\n   *   {\n   *     FT_Library  library;\n   *     FT_Face     face;\n   *     FT_UInt     hinting_engine = FT_CFF_HINTING_ADOBE;\n   *\n   *\n   *     FT_Init_FreeType( &library );\n   *\n   *     FT_Property_Set( library, \"cff\",\n   *                               \"hinting-engine\", &hinting_engine );\n   *   }\n   *\n   * @note:\n   *   This property can be used with @FT_Property_Get also.\n   *\n   */\n\n\n  /**************************************************************************\n   *\n   * @enum:\n   *   FT_CFF_HINTING_XXX\n   *\n   * @description:\n   *   A list of constants used for the @hinting-engine property to select\n   *   the hinting engine for CFF fonts.\n   *\n   * @values:\n   *   FT_CFF_HINTING_FREETYPE ::\n   *     Use the old FreeType hinting engine.\n   *\n   *   FT_CFF_HINTING_ADOBE ::\n   *     Use the hinting engine contributed by Adobe.\n   *\n   */\n#define FT_CFF_HINTING_FREETYPE  0\n#define FT_CFF_HINTING_ADOBE     1\n\n\n  /**************************************************************************\n   *\n   * @property:\n   *   no-stem-darkening\n   *\n   * @description:\n   *   By default, the Adobe CFF engine darkens stems at smaller sizes,\n   *   regardless of hinting, to enhance contrast.  Setting this property,\n   *   stem darkening gets switched off.\n   *\n   *   Note that stem darkening is never applied if @FT_LOAD_NO_SCALE is set.\n   *\n   *   {\n   *     FT_Library  library;\n   *     FT_Face     face;\n   *     FT_Bool     no_stem_darkening = TRUE;\n   *\n   *\n   *     FT_Init_FreeType( &library );\n   *\n   *     FT_Property_Set( library, \"cff\",\n   *                               \"no-stem-darkening\", &no_stem_darkening );\n   *   }\n   *\n   * @note:\n   *   This property can be used with @FT_Property_Get also.\n   *\n   */\n\n\n /* */\n\nFT_END_HEADER\n\n\n#endif /* __FTCFFDRV_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcid.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcid.h                                                                */\n/*                                                                         */\n/*    FreeType API for accessing CID font information (specification).     */\n/*                                                                         */\n/*  Copyright 2007, 2009 by Dereg Clegg, Michael Toftdal.                  */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTCID_H__\n#define __FTCID_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    cid_fonts                                                          */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    CID Fonts                                                          */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    CID-keyed font specific API.                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of CID-keyed font specific   */\n  /*    functions.                                                         */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /**********************************************************************\n   *\n   * @function:\n   *    FT_Get_CID_Registry_Ordering_Supplement\n   *\n   * @description:\n   *    Retrieve the Registry/Ordering/Supplement triple (also known as the\n   *    \"R/O/S\") from a CID-keyed font.\n   *\n   * @input:\n   *    face ::\n   *       A handle to the input face.\n   *\n   * @output:\n   *    registry ::\n   *       The registry, as a C~string, owned by the face.\n   *\n   *    ordering ::\n   *       The ordering, as a C~string, owned by the face.\n   *\n   *    supplement ::\n   *       The supplement.\n   *\n   * @return:\n   *    FreeType error code.  0~means success.\n   *\n   * @note:\n   *    This function only works with CID faces, returning an error\n   *    otherwise.\n   *\n   * @since:\n   *    2.3.6\n   */\n  FT_EXPORT( FT_Error )\n  FT_Get_CID_Registry_Ordering_Supplement( FT_Face       face,\n                                           const char*  *registry,\n                                           const char*  *ordering,\n                                           FT_Int       *supplement);\n\n\n  /**********************************************************************\n   *\n   * @function:\n   *    FT_Get_CID_Is_Internally_CID_Keyed\n   *\n   * @description:\n   *    Retrieve the type of the input face, CID keyed or not.  In\n   *    constrast to the @FT_IS_CID_KEYED macro this function returns\n   *    successfully also for CID-keyed fonts in an SNFT wrapper.\n   *\n   * @input:\n   *    face ::\n   *       A handle to the input face.\n   *\n   * @output:\n   *    is_cid ::\n   *       The type of the face as an @FT_Bool.\n   *\n   * @return:\n   *    FreeType error code.  0~means success.\n   *\n   * @note:\n   *    This function only works with CID faces and OpenType fonts,\n   *    returning an error otherwise.\n   *\n   * @since:\n   *    2.3.9\n   */\n  FT_EXPORT( FT_Error )\n  FT_Get_CID_Is_Internally_CID_Keyed( FT_Face   face,\n                                      FT_Bool  *is_cid );\n\n\n  /**********************************************************************\n   *\n   * @function:\n   *    FT_Get_CID_From_Glyph_Index\n   *\n   * @description:\n   *    Retrieve the CID of the input glyph index.\n   *\n   * @input:\n   *    face ::\n   *       A handle to the input face.\n   *\n   *    glyph_index ::\n   *       The input glyph index.\n   *\n   * @output:\n   *    cid ::\n   *       The CID as an @FT_UInt.\n   *\n   * @return:\n   *    FreeType error code.  0~means success.\n   *\n   * @note:\n   *    This function only works with CID faces and OpenType fonts,\n   *    returning an error otherwise.\n   *\n   * @since:\n   *    2.3.9\n   */\n  FT_EXPORT( FT_Error )\n  FT_Get_CID_From_Glyph_Index( FT_Face   face,\n                               FT_UInt   glyph_index,\n                               FT_UInt  *cid );\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FTCID_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fterrdef.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  fterrdef.h                                                             */\n/*                                                                         */\n/*    FreeType error codes (specification).                                */\n/*                                                                         */\n/*  Copyright 2002, 2004, 2006, 2007, 2010-2013 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*******************************************************************/\n  /*******************************************************************/\n  /*****                                                         *****/\n  /*****                LIST OF ERROR CODES/MESSAGES             *****/\n  /*****                                                         *****/\n  /*******************************************************************/\n  /*******************************************************************/\n\n\n  /* You need to define both FT_ERRORDEF_ and FT_NOERRORDEF_ before */\n  /* including this file.                                           */\n\n\n  /* generic errors */\n\n  FT_NOERRORDEF_( Ok,                                        0x00, \\\n                  \"no error\" )\n\n  FT_ERRORDEF_( Cannot_Open_Resource,                        0x01, \\\n                \"cannot open resource\" )\n  FT_ERRORDEF_( Unknown_File_Format,                         0x02, \\\n                \"unknown file format\" )\n  FT_ERRORDEF_( Invalid_File_Format,                         0x03, \\\n                \"broken file\" )\n  FT_ERRORDEF_( Invalid_Version,                             0x04, \\\n                \"invalid FreeType version\" )\n  FT_ERRORDEF_( Lower_Module_Version,                        0x05, \\\n                \"module version is too low\" )\n  FT_ERRORDEF_( Invalid_Argument,                            0x06, \\\n                \"invalid argument\" )\n  FT_ERRORDEF_( Unimplemented_Feature,                       0x07, \\\n                \"unimplemented feature\" )\n  FT_ERRORDEF_( Invalid_Table,                               0x08, \\\n                \"broken table\" )\n  FT_ERRORDEF_( Invalid_Offset,                              0x09, \\\n                \"broken offset within table\" )\n  FT_ERRORDEF_( Array_Too_Large,                             0x0A, \\\n                \"array allocation size too large\" )\n  FT_ERRORDEF_( Missing_Module,                              0x0B, \\\n                \"missing module\" )\n  FT_ERRORDEF_( Missing_Property,                            0x0C, \\\n                \"missing property\" )\n\n  /* glyph/character errors */\n\n  FT_ERRORDEF_( Invalid_Glyph_Index,                         0x10, \\\n                \"invalid glyph index\" )\n  FT_ERRORDEF_( Invalid_Character_Code,                      0x11, \\\n                \"invalid character code\" )\n  FT_ERRORDEF_( Invalid_Glyph_Format,                        0x12, \\\n                \"unsupported glyph image format\" )\n  FT_ERRORDEF_( Cannot_Render_Glyph,                         0x13, \\\n                \"cannot render this glyph format\" )\n  FT_ERRORDEF_( Invalid_Outline,                             0x14, \\\n                \"invalid outline\" )\n  FT_ERRORDEF_( Invalid_Composite,                           0x15, \\\n                \"invalid composite glyph\" )\n  FT_ERRORDEF_( Too_Many_Hints,                              0x16, \\\n                \"too many hints\" )\n  FT_ERRORDEF_( Invalid_Pixel_Size,                          0x17, \\\n                \"invalid pixel size\" )\n\n  /* handle errors */\n\n  FT_ERRORDEF_( Invalid_Handle,                              0x20, \\\n                \"invalid object handle\" )\n  FT_ERRORDEF_( Invalid_Library_Handle,                      0x21, \\\n                \"invalid library handle\" )\n  FT_ERRORDEF_( Invalid_Driver_Handle,                       0x22, \\\n                \"invalid module handle\" )\n  FT_ERRORDEF_( Invalid_Face_Handle,                         0x23, \\\n                \"invalid face handle\" )\n  FT_ERRORDEF_( Invalid_Size_Handle,                         0x24, \\\n                \"invalid size handle\" )\n  FT_ERRORDEF_( Invalid_Slot_Handle,                         0x25, \\\n                \"invalid glyph slot handle\" )\n  FT_ERRORDEF_( Invalid_CharMap_Handle,                      0x26, \\\n                \"invalid charmap handle\" )\n  FT_ERRORDEF_( Invalid_Cache_Handle,                        0x27, \\\n                \"invalid cache manager handle\" )\n  FT_ERRORDEF_( Invalid_Stream_Handle,                       0x28, \\\n                \"invalid stream handle\" )\n\n  /* driver errors */\n\n  FT_ERRORDEF_( Too_Many_Drivers,                            0x30, \\\n                \"too many modules\" )\n  FT_ERRORDEF_( Too_Many_Extensions,                         0x31, \\\n                \"too many extensions\" )\n\n  /* memory errors */\n\n  FT_ERRORDEF_( Out_Of_Memory,                               0x40, \\\n                \"out of memory\" )\n  FT_ERRORDEF_( Unlisted_Object,                             0x41, \\\n                \"unlisted object\" )\n\n  /* stream errors */\n\n  FT_ERRORDEF_( Cannot_Open_Stream,                          0x51, \\\n                \"cannot open stream\" )\n  FT_ERRORDEF_( Invalid_Stream_Seek,                         0x52, \\\n                \"invalid stream seek\" )\n  FT_ERRORDEF_( Invalid_Stream_Skip,                         0x53, \\\n                \"invalid stream skip\" )\n  FT_ERRORDEF_( Invalid_Stream_Read,                         0x54, \\\n                \"invalid stream read\" )\n  FT_ERRORDEF_( Invalid_Stream_Operation,                    0x55, \\\n                \"invalid stream operation\" )\n  FT_ERRORDEF_( Invalid_Frame_Operation,                     0x56, \\\n                \"invalid frame operation\" )\n  FT_ERRORDEF_( Nested_Frame_Access,                         0x57, \\\n                \"nested frame access\" )\n  FT_ERRORDEF_( Invalid_Frame_Read,                          0x58, \\\n                \"invalid frame read\" )\n\n  /* raster errors */\n\n  FT_ERRORDEF_( Raster_Uninitialized,                        0x60, \\\n                \"raster uninitialized\" )\n  FT_ERRORDEF_( Raster_Corrupted,                            0x61, \\\n                \"raster corrupted\" )\n  FT_ERRORDEF_( Raster_Overflow,                             0x62, \\\n                \"raster overflow\" )\n  FT_ERRORDEF_( Raster_Negative_Height,                      0x63, \\\n                \"negative height while rastering\" )\n\n  /* cache errors */\n\n  FT_ERRORDEF_( Too_Many_Caches,                             0x70, \\\n                \"too many registered caches\" )\n\n  /* TrueType and SFNT errors */\n\n  FT_ERRORDEF_( Invalid_Opcode,                              0x80, \\\n                \"invalid opcode\" )\n  FT_ERRORDEF_( Too_Few_Arguments,                           0x81, \\\n                \"too few arguments\" )\n  FT_ERRORDEF_( Stack_Overflow,                              0x82, \\\n                \"stack overflow\" )\n  FT_ERRORDEF_( Code_Overflow,                               0x83, \\\n                \"code overflow\" )\n  FT_ERRORDEF_( Bad_Argument,                                0x84, \\\n                \"bad argument\" )\n  FT_ERRORDEF_( Divide_By_Zero,                              0x85, \\\n                \"division by zero\" )\n  FT_ERRORDEF_( Invalid_Reference,                           0x86, \\\n                \"invalid reference\" )\n  FT_ERRORDEF_( Debug_OpCode,                                0x87, \\\n                \"found debug opcode\" )\n  FT_ERRORDEF_( ENDF_In_Exec_Stream,                         0x88, \\\n                \"found ENDF opcode in execution stream\" )\n  FT_ERRORDEF_( Nested_DEFS,                                 0x89, \\\n                \"nested DEFS\" )\n  FT_ERRORDEF_( Invalid_CodeRange,                           0x8A, \\\n                \"invalid code range\" )\n  FT_ERRORDEF_( Execution_Too_Long,                          0x8B, \\\n                \"execution context too long\" )\n  FT_ERRORDEF_( Too_Many_Function_Defs,                      0x8C, \\\n                \"too many function definitions\" )\n  FT_ERRORDEF_( Too_Many_Instruction_Defs,                   0x8D, \\\n                \"too many instruction definitions\" )\n  FT_ERRORDEF_( Table_Missing,                               0x8E, \\\n                \"SFNT font table missing\" )\n  FT_ERRORDEF_( Horiz_Header_Missing,                        0x8F, \\\n                \"horizontal header (hhea) table missing\" )\n  FT_ERRORDEF_( Locations_Missing,                           0x90, \\\n                \"locations (loca) table missing\" )\n  FT_ERRORDEF_( Name_Table_Missing,                          0x91, \\\n                \"name table missing\" )\n  FT_ERRORDEF_( CMap_Table_Missing,                          0x92, \\\n                \"character map (cmap) table missing\" )\n  FT_ERRORDEF_( Hmtx_Table_Missing,                          0x93, \\\n                \"horizontal metrics (hmtx) table missing\" )\n  FT_ERRORDEF_( Post_Table_Missing,                          0x94, \\\n                \"PostScript (post) table missing\" )\n  FT_ERRORDEF_( Invalid_Horiz_Metrics,                       0x95, \\\n                \"invalid horizontal metrics\" )\n  FT_ERRORDEF_( Invalid_CharMap_Format,                      0x96, \\\n                \"invalid character map (cmap) format\" )\n  FT_ERRORDEF_( Invalid_PPem,                                0x97, \\\n                \"invalid ppem value\" )\n  FT_ERRORDEF_( Invalid_Vert_Metrics,                        0x98, \\\n                \"invalid vertical metrics\" )\n  FT_ERRORDEF_( Could_Not_Find_Context,                      0x99, \\\n                \"could not find context\" )\n  FT_ERRORDEF_( Invalid_Post_Table_Format,                   0x9A, \\\n                \"invalid PostScript (post) table format\" )\n  FT_ERRORDEF_( Invalid_Post_Table,                          0x9B, \\\n                \"invalid PostScript (post) table\" )\n\n  /* CFF, CID, and Type 1 errors */\n\n  FT_ERRORDEF_( Syntax_Error,                                0xA0, \\\n                \"opcode syntax error\" )\n  FT_ERRORDEF_( Stack_Underflow,                             0xA1, \\\n                \"argument stack underflow\" )\n  FT_ERRORDEF_( Ignore,                                      0xA2, \\\n                \"ignore\" )\n  FT_ERRORDEF_( No_Unicode_Glyph_Name,                       0xA3, \\\n                \"no Unicode glyph name found\" )\n  FT_ERRORDEF_( Glyph_Too_Big,                               0xA4, \\\n                \"glyph to big for hinting\" )\n\n  /* BDF errors */\n\n  FT_ERRORDEF_( Missing_Startfont_Field,                     0xB0, \\\n                \"`STARTFONT' field missing\" )\n  FT_ERRORDEF_( Missing_Font_Field,                          0xB1, \\\n                \"`FONT' field missing\" )\n  FT_ERRORDEF_( Missing_Size_Field,                          0xB2, \\\n                \"`SIZE' field missing\" )\n  FT_ERRORDEF_( Missing_Fontboundingbox_Field,               0xB3, \\\n                \"`FONTBOUNDINGBOX' field missing\" )\n  FT_ERRORDEF_( Missing_Chars_Field,                         0xB4, \\\n                \"`CHARS' field missing\" )\n  FT_ERRORDEF_( Missing_Startchar_Field,                     0xB5, \\\n                \"`STARTCHAR' field missing\" )\n  FT_ERRORDEF_( Missing_Encoding_Field,                      0xB6, \\\n                \"`ENCODING' field missing\" )\n  FT_ERRORDEF_( Missing_Bbx_Field,                           0xB7, \\\n                \"`BBX' field missing\" )\n  FT_ERRORDEF_( Bbx_Too_Big,                                 0xB8, \\\n                \"`BBX' too big\" )\n  FT_ERRORDEF_( Corrupted_Font_Header,                       0xB9, \\\n                \"Font header corrupted or missing fields\" )\n  FT_ERRORDEF_( Corrupted_Font_Glyphs,                       0xBA, \\\n                \"Font glyphs corrupted or missing fields\" )\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fterrors.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  fterrors.h                                                             */\n/*                                                                         */\n/*    FreeType error code handling (specification).                        */\n/*                                                                         */\n/*  Copyright 1996-2002, 2004, 2007, 2013 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This special header file is used to define the handling of FT2        */\n  /* enumeration constants.  It can also be used to generate error message */\n  /* strings with a small macro trick explained below.                     */\n  /*                                                                       */\n  /* I - Error Formats                                                     */\n  /* -----------------                                                     */\n  /*                                                                       */\n  /*   The configuration macro FT_CONFIG_OPTION_USE_MODULE_ERRORS can be   */\n  /*   defined in ftoption.h in order to make the higher byte indicate     */\n  /*   the module where the error has happened (this is not compatible     */\n  /*   with standard builds of FreeType 2).  See the file `ftmoderr.h' for */\n  /*   more details.                                                       */\n  /*                                                                       */\n  /*                                                                       */\n  /* II - Error Message strings                                            */\n  /* --------------------------                                            */\n  /*                                                                       */\n  /*   The error definitions below are made through special macros that    */\n  /*   allow client applications to build a table of error message strings */\n  /*   if they need it.  The strings are not included in a normal build of */\n  /*   FreeType 2 to save space (most client applications do not use       */\n  /*   them).                                                              */\n  /*                                                                       */\n  /*   To do so, you have to define the following macros before including  */\n  /*   this file:                                                          */\n  /*                                                                       */\n  /*   FT_ERROR_START_LIST ::                                              */\n  /*     This macro is called before anything else to define the start of  */\n  /*     the error list.  It is followed by several FT_ERROR_DEF calls     */\n  /*     (see below).                                                      */\n  /*                                                                       */\n  /*   FT_ERROR_DEF( e, v, s ) ::                                          */\n  /*     This macro is called to define one single error.                  */\n  /*     `e' is the error code identifier (e.g. FT_Err_Invalid_Argument).  */\n  /*     `v' is the error numerical value.                                 */\n  /*     `s' is the corresponding error string.                            */\n  /*                                                                       */\n  /*   FT_ERROR_END_LIST ::                                                */\n  /*     This macro ends the list.                                         */\n  /*                                                                       */\n  /*   Additionally, you have to undefine __FTERRORS_H__ before #including */\n  /*   this file.                                                          */\n  /*                                                                       */\n  /*   Here is a simple example:                                           */\n  /*                                                                       */\n  /*     {                                                                 */\n  /*       #undef __FTERRORS_H__                                           */\n  /*       #define FT_ERRORDEF( e, v, s )  { e, s },                       */\n  /*       #define FT_ERROR_START_LIST     {                               */\n  /*       #define FT_ERROR_END_LIST       { 0, 0 } };                     */\n  /*                                                                       */\n  /*       const struct                                                    */\n  /*       {                                                               */\n  /*         int          err_code;                                        */\n  /*         const char*  err_msg;                                         */\n  /*       } ft_errors[] =                                                 */\n  /*                                                                       */\n  /*       #include \"fterrors.h\"                                            */\n  /*     }                                                                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTERRORS_H__\n#define __FTERRORS_H__\n\n\n  /* include module base error codes */\n#include \"ftmoderr.h\"\n\n\n  /*******************************************************************/\n  /*******************************************************************/\n  /*****                                                         *****/\n  /*****                       SETUP MACROS                      *****/\n  /*****                                                         *****/\n  /*******************************************************************/\n  /*******************************************************************/\n\n\n#undef  FT_NEED_EXTERN_C\n\n\n  /* FT_ERR_PREFIX is used as a prefix for error identifiers. */\n  /* By default, we use `FT_Err_'.                            */\n  /*                                                          */\n#ifndef FT_ERR_PREFIX\n#define FT_ERR_PREFIX  FT_Err_\n#endif\n\n\n  /* FT_ERR_BASE is used as the base for module-specific errors. */\n  /*                                                             */\n#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS\n\n#ifndef FT_ERR_BASE\n#define FT_ERR_BASE  FT_Mod_Err_Base\n#endif\n\n#else\n\n#undef FT_ERR_BASE\n#define FT_ERR_BASE  0\n\n#endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */\n\n\n  /* If FT_ERRORDEF is not defined, we need to define a simple */\n  /* enumeration type.                                         */\n  /*                                                           */\n#ifndef FT_ERRORDEF\n\n#define FT_ERRORDEF( e, v, s )  e = v,\n#define FT_ERROR_START_LIST     enum {\n#define FT_ERROR_END_LIST       FT_ERR_CAT( FT_ERR_PREFIX, Max ) };\n\n#ifdef __cplusplus\n#define FT_NEED_EXTERN_C\n  extern \"C\" {\n#endif\n\n#endif /* !FT_ERRORDEF */\n\n\n  /* this macro is used to define an error */\n#define FT_ERRORDEF_( e, v, s )                                             \\\n          FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s )\n\n  /* this is only used for <module>_Err_Ok, which must be 0! */\n#define FT_NOERRORDEF_( e, v, s )                             \\\n          FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s )\n\n\n#ifdef FT_ERROR_START_LIST\n  FT_ERROR_START_LIST\n#endif\n\n\n  /* now include the error codes */\n#include \"fterrdef.h\"\n\n\n#ifdef FT_ERROR_END_LIST\n  FT_ERROR_END_LIST\n#endif\n\n\n  /*******************************************************************/\n  /*******************************************************************/\n  /*****                                                         *****/\n  /*****                      SIMPLE CLEANUP                     *****/\n  /*****                                                         *****/\n  /*******************************************************************/\n  /*******************************************************************/\n\n#ifdef FT_NEED_EXTERN_C\n  }\n#endif\n\n#undef FT_ERROR_START_LIST\n#undef FT_ERROR_END_LIST\n\n#undef FT_ERRORDEF\n#undef FT_ERRORDEF_\n#undef FT_NOERRORDEF_\n\n#undef FT_NEED_EXTERN_C\n#undef FT_ERR_BASE\n\n  /* FT_ERR_PREFIX is needed internally */\n#ifndef FT2_BUILD_LIBRARY\n#undef FT_ERR_PREFIX\n#endif\n\n#endif /* __FTERRORS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgasp.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftgasp.h                                                               */\n/*                                                                         */\n/*    Access of TrueType's `gasp' table (specification).                   */\n/*                                                                         */\n/*  Copyright 2007, 2008, 2011 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef _FT_GASP_H_\n#define _FT_GASP_H_\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\n  /***************************************************************************\n   *\n   * @section:\n   *   gasp_table\n   *\n   * @title:\n   *   Gasp Table\n   *\n   * @abstract:\n   *   Retrieving TrueType `gasp' table entries.\n   *\n   * @description:\n   *   The function @FT_Get_Gasp can be used to query a TrueType or OpenType\n   *   font for specific entries in its `gasp' table, if any.  This is\n   *   mainly useful when implementing native TrueType hinting with the\n   *   bytecode interpreter to duplicate the Windows text rendering results.\n   */\n\n  /*************************************************************************\n   *\n   * @enum:\n   *   FT_GASP_XXX\n   *\n   * @description:\n   *   A list of values and/or bit-flags returned by the @FT_Get_Gasp\n   *   function.\n   *\n   * @values:\n   *   FT_GASP_NO_TABLE ::\n   *     This special value means that there is no GASP table in this face.\n   *     It is up to the client to decide what to do.\n   *\n   *   FT_GASP_DO_GRIDFIT ::\n   *     Grid-fitting and hinting should be performed at the specified ppem.\n   *     This *really* means TrueType bytecode interpretation.  If this bit\n   *     is not set, no hinting gets applied.\n   *\n   *   FT_GASP_DO_GRAY ::\n   *     Anti-aliased rendering should be performed at the specified ppem.\n   *     If not set, do monochrome rendering.\n   *\n   *   FT_GASP_SYMMETRIC_SMOOTHING ::\n   *     If set, smoothing along multiple axes must be used with ClearType.\n   *\n   *   FT_GASP_SYMMETRIC_GRIDFIT ::\n   *     Grid-fitting must be used with ClearType's symmetric smoothing.\n   *\n   * @note:\n   *   The bit-flags `FT_GASP_DO_GRIDFIT' and `FT_GASP_DO_GRAY' are to be\n   *   used for standard font rasterization only.  Independently of that,\n   *   `FT_GASP_SYMMETRIC_SMOOTHING' and `FT_GASP_SYMMETRIC_GRIDFIT' are to\n   *   be used if ClearType is enabled (and `FT_GASP_DO_GRIDFIT' and\n   *   `FT_GASP_DO_GRAY' are consequently ignored).\n   *\n   *   `ClearType' is Microsoft's implementation of LCD rendering, partly\n   *   protected by patents.\n   *\n   * @since:\n   *   2.3.0\n   */\n#define FT_GASP_NO_TABLE               -1\n#define FT_GASP_DO_GRIDFIT           0x01\n#define FT_GASP_DO_GRAY              0x02\n#define FT_GASP_SYMMETRIC_SMOOTHING  0x08\n#define FT_GASP_SYMMETRIC_GRIDFIT    0x10\n\n\n  /*************************************************************************\n   *\n   * @func:\n   *   FT_Get_Gasp\n   *\n   * @description:\n   *   Read the `gasp' table from a TrueType or OpenType font file and\n   *   return the entry corresponding to a given character pixel size.\n   *\n   * @input:\n   *   face :: The source face handle.\n   *   ppem :: The vertical character pixel size.\n   *\n   * @return:\n   *   Bit flags (see @FT_GASP_XXX), or @FT_GASP_NO_TABLE if there is no\n   *   `gasp' table in the face.\n   *\n   * @since:\n   *   2.3.0\n   */\n  FT_EXPORT( FT_Int )\n  FT_Get_Gasp( FT_Face  face,\n               FT_UInt  ppem );\n\n/* */\n\n#endif /* _FT_GASP_H_ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftglyph.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftglyph.h                                                              */\n/*                                                                         */\n/*    FreeType convenience functions to handle glyphs (specification).     */\n/*                                                                         */\n/*  Copyright 1996-2003, 2006, 2008, 2009, 2011 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file contains the definition of several convenience functions    */\n  /* that can be used by client applications to easily retrieve glyph      */\n  /* bitmaps and outlines from a given face.                               */\n  /*                                                                       */\n  /* These functions should be optional if you are writing a font server   */\n  /* or text layout engine on top of FreeType.  However, they are pretty   */\n  /* handy for many other simple uses of the library.                      */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTGLYPH_H__\n#define __FTGLYPH_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    glyph_management                                                   */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Glyph Management                                                   */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Generic interface to manage individual glyph data.                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains definitions used to manage glyph data        */\n  /*    through generic FT_Glyph objects.  Each of them can contain a      */\n  /*    bitmap, a vector outline, or even images in other formats.         */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* forward declaration to a private type */\n  typedef struct FT_Glyph_Class_  FT_Glyph_Class;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Glyph                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Handle to an object used to model generic glyph images.  It is a   */\n  /*    pointer to the @FT_GlyphRec structure and can contain a glyph      */\n  /*    bitmap or pointer.                                                 */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Glyph objects are not owned by the library.  You must thus release */\n  /*    them manually (through @FT_Done_Glyph) _before_ calling            */\n  /*    @FT_Done_FreeType.                                                 */\n  /*                                                                       */\n  typedef struct FT_GlyphRec_*  FT_Glyph;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_GlyphRec                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The root glyph structure contains a given glyph image plus its     */\n  /*    advance width in 16.16 fixed-point format.                         */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    library :: A handle to the FreeType library object.                */\n  /*                                                                       */\n  /*    clazz   :: A pointer to the glyph's class.  Private.               */\n  /*                                                                       */\n  /*    format  :: The format of the glyph's image.                        */\n  /*                                                                       */\n  /*    advance :: A 16.16 vector that gives the glyph's advance width.    */\n  /*                                                                       */\n  typedef struct  FT_GlyphRec_\n  {\n    FT_Library             library;\n    const FT_Glyph_Class*  clazz;\n    FT_Glyph_Format        format;\n    FT_Vector              advance;\n\n  } FT_GlyphRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_BitmapGlyph                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to an object used to model a bitmap glyph image.  This is */\n  /*    a sub-class of @FT_Glyph, and a pointer to @FT_BitmapGlyphRec.     */\n  /*                                                                       */\n  typedef struct FT_BitmapGlyphRec_*  FT_BitmapGlyph;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_BitmapGlyphRec                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used for bitmap glyph images.  This really is a        */\n  /*    `sub-class' of @FT_GlyphRec.                                       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    root   :: The root @FT_Glyph fields.                               */\n  /*                                                                       */\n  /*    left   :: The left-side bearing, i.e., the horizontal distance     */\n  /*              from the current pen position to the left border of the  */\n  /*              glyph bitmap.                                            */\n  /*                                                                       */\n  /*    top    :: The top-side bearing, i.e., the vertical distance from   */\n  /*              the current pen position to the top border of the glyph  */\n  /*              bitmap.  This distance is positive for upwards~y!        */\n  /*                                                                       */\n  /*    bitmap :: A descriptor for the bitmap.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You can typecast an @FT_Glyph to @FT_BitmapGlyph if you have       */\n  /*    `glyph->format == FT_GLYPH_FORMAT_BITMAP'.  This lets you access   */\n  /*    the bitmap's contents easily.                                      */\n  /*                                                                       */\n  /*    The corresponding pixel buffer is always owned by @FT_BitmapGlyph  */\n  /*    and is thus created and destroyed with it.                         */\n  /*                                                                       */\n  typedef struct  FT_BitmapGlyphRec_\n  {\n    FT_GlyphRec  root;\n    FT_Int       left;\n    FT_Int       top;\n    FT_Bitmap    bitmap;\n\n  } FT_BitmapGlyphRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_OutlineGlyph                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to an object used to model an outline glyph image.  This  */\n  /*    is a sub-class of @FT_Glyph, and a pointer to @FT_OutlineGlyphRec. */\n  /*                                                                       */\n  typedef struct FT_OutlineGlyphRec_*  FT_OutlineGlyph;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_OutlineGlyphRec                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used for outline (vectorial) glyph images.  This       */\n  /*    really is a `sub-class' of @FT_GlyphRec.                           */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    root    :: The root @FT_Glyph fields.                              */\n  /*                                                                       */\n  /*    outline :: A descriptor for the outline.                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You can typecast an @FT_Glyph to @FT_OutlineGlyph if you have      */\n  /*    `glyph->format == FT_GLYPH_FORMAT_OUTLINE'.  This lets you access  */\n  /*    the outline's content easily.                                      */\n  /*                                                                       */\n  /*    As the outline is extracted from a glyph slot, its coordinates are */\n  /*    expressed normally in 26.6 pixels, unless the flag                 */\n  /*    @FT_LOAD_NO_SCALE was used in @FT_Load_Glyph() or @FT_Load_Char(). */\n  /*                                                                       */\n  /*    The outline's tables are always owned by the object and are        */\n  /*    destroyed with it.                                                 */\n  /*                                                                       */\n  typedef struct  FT_OutlineGlyphRec_\n  {\n    FT_GlyphRec  root;\n    FT_Outline   outline;\n\n  } FT_OutlineGlyphRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Glyph                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to extract a glyph image from a slot.  Note that   */\n  /*    the created @FT_Glyph object must be released with @FT_Done_Glyph. */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    slot   :: A handle to the source glyph slot.                       */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aglyph :: A handle to the glyph object.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_Glyph( FT_GlyphSlot  slot,\n                FT_Glyph     *aglyph );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Glyph_Copy                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to copy a glyph image.  Note that the created      */\n  /*    @FT_Glyph object must be released with @FT_Done_Glyph.             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    source :: A handle to the source glyph object.                     */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    target :: A handle to the target glyph object.  0~in case of       */\n  /*              error.                                                   */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Glyph_Copy( FT_Glyph   source,\n                 FT_Glyph  *target );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Glyph_Transform                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Transform a glyph image if its format is scalable.                 */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    glyph  :: A handle to the target glyph object.                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    matrix :: A pointer to a 2x2 matrix to apply.                      */\n  /*                                                                       */\n  /*    delta  :: A pointer to a 2d vector to apply.  Coordinates are      */\n  /*              expressed in 1/64th of a pixel.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code (if not 0, the glyph format is not scalable).  */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The 2x2 transformation matrix is also applied to the glyph's       */\n  /*    advance vector.                                                    */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Glyph_Transform( FT_Glyph    glyph,\n                      FT_Matrix*  matrix,\n                      FT_Vector*  delta );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Glyph_BBox_Mode                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The mode how the values of @FT_Glyph_Get_CBox are returned.        */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_GLYPH_BBOX_UNSCALED ::                                          */\n  /*      Return unscaled font units.                                      */\n  /*                                                                       */\n  /*    FT_GLYPH_BBOX_SUBPIXELS ::                                         */\n  /*      Return unfitted 26.6 coordinates.                                */\n  /*                                                                       */\n  /*    FT_GLYPH_BBOX_GRIDFIT ::                                           */\n  /*      Return grid-fitted 26.6 coordinates.                             */\n  /*                                                                       */\n  /*    FT_GLYPH_BBOX_TRUNCATE ::                                          */\n  /*      Return coordinates in integer pixels.                            */\n  /*                                                                       */\n  /*    FT_GLYPH_BBOX_PIXELS ::                                            */\n  /*      Return grid-fitted pixel coordinates.                            */\n  /*                                                                       */\n  typedef enum  FT_Glyph_BBox_Mode_\n  {\n    FT_GLYPH_BBOX_UNSCALED  = 0,\n    FT_GLYPH_BBOX_SUBPIXELS = 0,\n    FT_GLYPH_BBOX_GRIDFIT   = 1,\n    FT_GLYPH_BBOX_TRUNCATE  = 2,\n    FT_GLYPH_BBOX_PIXELS    = 3\n\n  } FT_Glyph_BBox_Mode;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    ft_glyph_bbox_xxx                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    These constants are deprecated.  Use the corresponding             */\n  /*    @FT_Glyph_BBox_Mode values instead.                                */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*   ft_glyph_bbox_unscaled  :: See @FT_GLYPH_BBOX_UNSCALED.             */\n  /*   ft_glyph_bbox_subpixels :: See @FT_GLYPH_BBOX_SUBPIXELS.            */\n  /*   ft_glyph_bbox_gridfit   :: See @FT_GLYPH_BBOX_GRIDFIT.              */\n  /*   ft_glyph_bbox_truncate  :: See @FT_GLYPH_BBOX_TRUNCATE.             */\n  /*   ft_glyph_bbox_pixels    :: See @FT_GLYPH_BBOX_PIXELS.               */\n  /*                                                                       */\n#define ft_glyph_bbox_unscaled   FT_GLYPH_BBOX_UNSCALED\n#define ft_glyph_bbox_subpixels  FT_GLYPH_BBOX_SUBPIXELS\n#define ft_glyph_bbox_gridfit    FT_GLYPH_BBOX_GRIDFIT\n#define ft_glyph_bbox_truncate   FT_GLYPH_BBOX_TRUNCATE\n#define ft_glyph_bbox_pixels     FT_GLYPH_BBOX_PIXELS\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Glyph_Get_CBox                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return a glyph's `control box'.  The control box encloses all the  */\n  /*    outline's points, including Bézier control points.  Though it      */\n  /*    coincides with the exact bounding box for most glyphs, it can be   */\n  /*    slightly larger in some situations (like when rotating an outline  */\n  /*    which contains Bézier outside arcs).                               */\n  /*                                                                       */\n  /*    Computing the control box is very fast, while getting the bounding */\n  /*    box can take much more time as it needs to walk over all segments  */\n  /*    and arcs in the outline.  To get the latter, you can use the       */\n  /*    `ftbbox' component which is dedicated to this single task.         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    glyph :: A handle to the source glyph object.                      */\n  /*                                                                       */\n  /*    mode  :: The mode which indicates how to interpret the returned    */\n  /*             bounding box values.                                      */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    acbox :: The glyph coordinate bounding box.  Coordinates are       */\n  /*             expressed in 1/64th of pixels if it is grid-fitted.       */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Coordinates are relative to the glyph origin, using the y~upwards  */\n  /*    convention.                                                        */\n  /*                                                                       */\n  /*    If the glyph has been loaded with @FT_LOAD_NO_SCALE, `bbox_mode'   */\n  /*    must be set to @FT_GLYPH_BBOX_UNSCALED to get unscaled font        */\n  /*    units in 26.6 pixel format.  The value @FT_GLYPH_BBOX_SUBPIXELS    */\n  /*    is another name for this constant.                                 */\n  /*                                                                       */\n  /*    If the font is tricky and the glyph has been loaded with           */\n  /*    @FT_LOAD_NO_SCALE, the resulting CBox is meaningless.  To get      */\n  /*    reasonable values for the CBox it is necessary to load the glyph   */\n  /*    at a large ppem value (so that the hinting instructions can        */\n  /*    properly shift and scale the subglyphs), then extracting the CBox  */\n  /*    which can be eventually converted back to font units.              */\n  /*                                                                       */\n  /*    Note that the maximum coordinates are exclusive, which means that  */\n  /*    one can compute the width and height of the glyph image (be it in  */\n  /*    integer or 26.6 pixels) as:                                        */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      width  = bbox.xMax - bbox.xMin;                                  */\n  /*      height = bbox.yMax - bbox.yMin;                                  */\n  /*    }                                                                  */\n  /*                                                                       */\n  /*    Note also that for 26.6 coordinates, if `bbox_mode' is set to      */\n  /*    @FT_GLYPH_BBOX_GRIDFIT, the coordinates will also be grid-fitted,  */\n  /*    which corresponds to:                                              */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      bbox.xMin = FLOOR(bbox.xMin);                                    */\n  /*      bbox.yMin = FLOOR(bbox.yMin);                                    */\n  /*      bbox.xMax = CEILING(bbox.xMax);                                  */\n  /*      bbox.yMax = CEILING(bbox.yMax);                                  */\n  /*    }                                                                  */\n  /*                                                                       */\n  /*    To get the bbox in pixel coordinates, set `bbox_mode' to           */\n  /*    @FT_GLYPH_BBOX_TRUNCATE.                                           */\n  /*                                                                       */\n  /*    To get the bbox in grid-fitted pixel coordinates, set `bbox_mode'  */\n  /*    to @FT_GLYPH_BBOX_PIXELS.                                          */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Glyph_Get_CBox( FT_Glyph  glyph,\n                     FT_UInt   bbox_mode,\n                     FT_BBox  *acbox );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Glyph_To_Bitmap                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Convert a given glyph object to a bitmap glyph object.             */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    the_glyph   :: A pointer to a handle to the target glyph.          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    render_mode :: An enumeration that describes how the data is       */\n  /*                   rendered.                                           */\n  /*                                                                       */\n  /*    origin      :: A pointer to a vector used to translate the glyph   */\n  /*                   image before rendering.  Can be~0 (if no            */\n  /*                   translation).  The origin is expressed in           */\n  /*                   26.6 pixels.                                        */\n  /*                                                                       */\n  /*    destroy     :: A boolean that indicates that the original glyph    */\n  /*                   image should be destroyed by this function.  It is  */\n  /*                   never destroyed in case of error.                   */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function does nothing if the glyph format isn't scalable.     */\n  /*                                                                       */\n  /*    The glyph image is translated with the `origin' vector before      */\n  /*    rendering.                                                         */\n  /*                                                                       */\n  /*    The first parameter is a pointer to an @FT_Glyph handle, that will */\n  /*    be _replaced_ by this function (with newly allocated data).        */\n  /*    Typically, you would use (omitting error handling):                */\n  /*                                                                       */\n  /*                                                                       */\n  /*      {                                                                */\n  /*        FT_Glyph        glyph;                                         */\n  /*        FT_BitmapGlyph  glyph_bitmap;                                  */\n  /*                                                                       */\n  /*                                                                       */\n  /*        // load glyph                                                  */\n  /*        error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAUT );     */\n  /*                                                                       */\n  /*        // extract glyph image                                         */\n  /*        error = FT_Get_Glyph( face->glyph, &glyph );                   */\n  /*                                                                       */\n  /*        // convert to a bitmap (default render mode + destroying old)  */\n  /*        if ( glyph->format != FT_GLYPH_FORMAT_BITMAP )                 */\n  /*        {                                                              */\n  /*          error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL,   */\n  /*                                      0, 1 );                          */\n  /*          if ( error ) // `glyph' unchanged                            */\n  /*            ...                                                        */\n  /*        }                                                              */\n  /*                                                                       */\n  /*        // access bitmap content by typecasting                        */\n  /*        glyph_bitmap = (FT_BitmapGlyph)glyph;                          */\n  /*                                                                       */\n  /*        // do funny stuff with it, like blitting/drawing               */\n  /*        ...                                                            */\n  /*                                                                       */\n  /*        // discard glyph image (bitmap or not)                         */\n  /*        FT_Done_Glyph( glyph );                                        */\n  /*      }                                                                */\n  /*                                                                       */\n  /*                                                                       */\n  /*    Here another example, again without error handling:                */\n  /*                                                                       */\n  /*                                                                       */\n  /*      {                                                                */\n  /*        FT_Glyph  glyphs[MAX_GLYPHS]                                   */\n  /*                                                                       */\n  /*                                                                       */\n  /*        ...                                                            */\n  /*                                                                       */\n  /*        for ( idx = 0; i < MAX_GLYPHS; i++ )                           */\n  /*          error = FT_Load_Glyph( face, idx, FT_LOAD_DEFAULT ) ||       */\n  /*                  FT_Get_Glyph ( face->glyph, &glyph[idx] );           */\n  /*                                                                       */\n  /*        ...                                                            */\n  /*                                                                       */\n  /*        for ( idx = 0; i < MAX_GLYPHS; i++ )                           */\n  /*        {                                                              */\n  /*          FT_Glyph  bitmap = glyphs[idx];                              */\n  /*                                                                       */\n  /*                                                                       */\n  /*          ...                                                          */\n  /*                                                                       */\n  /*          // after this call, `bitmap' no longer points into           */\n  /*          // the `glyphs' array (and the old value isn't destroyed)    */\n  /*          FT_Glyph_To_Bitmap( &bitmap, FT_RENDER_MODE_MONO, 0, 0 );    */\n  /*                                                                       */\n  /*          ...                                                          */\n  /*                                                                       */\n  /*          FT_Done_Glyph( bitmap );                                     */\n  /*        }                                                              */\n  /*                                                                       */\n  /*        ...                                                            */\n  /*                                                                       */\n  /*        for ( idx = 0; i < MAX_GLYPHS; i++ )                           */\n  /*          FT_Done_Glyph( glyphs[idx] );                                */\n  /*      }                                                                */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Glyph_To_Bitmap( FT_Glyph*       the_glyph,\n                      FT_Render_Mode  render_mode,\n                      FT_Vector*      origin,\n                      FT_Bool         destroy );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Done_Glyph                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Destroy a given glyph.                                             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    glyph :: A handle to the target glyph object.                      */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Done_Glyph( FT_Glyph  glyph );\n\n  /* */\n\n\n  /* other helpful functions */\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    computations                                                       */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Matrix_Multiply                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Perform the matrix operation `b = a*b'.                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    a :: A pointer to matrix `a'.                                      */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    b :: A pointer to matrix `b'.                                      */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The result is undefined if either `a' or `b' is zero.              */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Matrix_Multiply( const FT_Matrix*  a,\n                      FT_Matrix*        b );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Matrix_Invert                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Invert a 2x2 matrix.  Return an error if it can't be inverted.     */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    matrix :: A pointer to the target matrix.  Remains untouched in    */\n  /*              case of error.                                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Matrix_Invert( FT_Matrix*  matrix );\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTGLYPH_H__ */\n\n\n/* END */\n\n\n/* Local Variables: */\n/* coding: utf-8    */\n/* End:             */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgxval.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftgxval.h                                                              */\n/*                                                                         */\n/*    FreeType API for validating TrueTypeGX/AAT tables (specification).   */\n/*                                                                         */\n/*  Copyright 2004, 2005, 2006 by                                          */\n/*  Masatake YAMATO, Redhat K.K,                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTGXVAL_H__\n#define __FTGXVAL_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    gx_validation                                                      */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    TrueTypeGX/AAT Validation                                          */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    An API to validate TrueTypeGX/AAT tables.                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of functions to validate     */\n  /*    some TrueTypeGX tables (feat, mort, morx, bsln, just, kern, opbd,  */\n  /*    trak, prop, lcar).                                                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                                                                       */\n  /* Warning: Use FT_VALIDATE_XXX to validate a table.                     */\n  /*          Following definitions are for gxvalid developers.            */\n  /*                                                                       */\n  /*                                                                       */\n  /*************************************************************************/\n\n#define FT_VALIDATE_feat_INDEX     0\n#define FT_VALIDATE_mort_INDEX     1\n#define FT_VALIDATE_morx_INDEX     2\n#define FT_VALIDATE_bsln_INDEX     3\n#define FT_VALIDATE_just_INDEX     4\n#define FT_VALIDATE_kern_INDEX     5\n#define FT_VALIDATE_opbd_INDEX     6\n#define FT_VALIDATE_trak_INDEX     7\n#define FT_VALIDATE_prop_INDEX     8\n#define FT_VALIDATE_lcar_INDEX     9\n#define FT_VALIDATE_GX_LAST_INDEX  FT_VALIDATE_lcar_INDEX\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_VALIDATE_GX_LENGTH\n   *\n   * @description:\n   *   The number of tables checked in this module.  Use it as a parameter\n   *   for the `table-length' argument of function @FT_TrueTypeGX_Validate.\n   */\n#define FT_VALIDATE_GX_LENGTH     (FT_VALIDATE_GX_LAST_INDEX + 1)\n\n  /* */\n\n  /* Up to 0x1000 is used by otvalid.\n     Ox2xxx is reserved for feature OT extension. */\n#define FT_VALIDATE_GX_START 0x4000\n#define FT_VALIDATE_GX_BITFIELD( tag )                  \\\n  ( FT_VALIDATE_GX_START << FT_VALIDATE_##tag##_INDEX )\n\n\n /**********************************************************************\n  *\n  * @enum:\n  *    FT_VALIDATE_GXXXX\n  *\n  * @description:\n  *    A list of bit-field constants used with @FT_TrueTypeGX_Validate to\n  *    indicate which TrueTypeGX/AAT Type tables should be validated.\n  *\n  * @values:\n  *    FT_VALIDATE_feat ::\n  *      Validate `feat' table.\n  *\n  *    FT_VALIDATE_mort ::\n  *      Validate `mort' table.\n  *\n  *    FT_VALIDATE_morx ::\n  *      Validate `morx' table.\n  *\n  *    FT_VALIDATE_bsln ::\n  *      Validate `bsln' table.\n  *\n  *    FT_VALIDATE_just ::\n  *      Validate `just' table.\n  *\n  *    FT_VALIDATE_kern ::\n  *      Validate `kern' table.\n  *\n  *    FT_VALIDATE_opbd ::\n  *      Validate `opbd' table.\n  *\n  *    FT_VALIDATE_trak ::\n  *      Validate `trak' table.\n  *\n  *    FT_VALIDATE_prop ::\n  *      Validate `prop' table.\n  *\n  *    FT_VALIDATE_lcar ::\n  *      Validate `lcar' table.\n  *\n  *    FT_VALIDATE_GX ::\n  *      Validate all TrueTypeGX tables (feat, mort, morx, bsln, just, kern,\n  *      opbd, trak, prop and lcar).\n  *\n  */\n\n#define FT_VALIDATE_feat  FT_VALIDATE_GX_BITFIELD( feat )\n#define FT_VALIDATE_mort  FT_VALIDATE_GX_BITFIELD( mort )\n#define FT_VALIDATE_morx  FT_VALIDATE_GX_BITFIELD( morx )\n#define FT_VALIDATE_bsln  FT_VALIDATE_GX_BITFIELD( bsln )\n#define FT_VALIDATE_just  FT_VALIDATE_GX_BITFIELD( just )\n#define FT_VALIDATE_kern  FT_VALIDATE_GX_BITFIELD( kern )\n#define FT_VALIDATE_opbd  FT_VALIDATE_GX_BITFIELD( opbd )\n#define FT_VALIDATE_trak  FT_VALIDATE_GX_BITFIELD( trak )\n#define FT_VALIDATE_prop  FT_VALIDATE_GX_BITFIELD( prop )\n#define FT_VALIDATE_lcar  FT_VALIDATE_GX_BITFIELD( lcar )\n\n#define FT_VALIDATE_GX  ( FT_VALIDATE_feat | \\\n                          FT_VALIDATE_mort | \\\n                          FT_VALIDATE_morx | \\\n                          FT_VALIDATE_bsln | \\\n                          FT_VALIDATE_just | \\\n                          FT_VALIDATE_kern | \\\n                          FT_VALIDATE_opbd | \\\n                          FT_VALIDATE_trak | \\\n                          FT_VALIDATE_prop | \\\n                          FT_VALIDATE_lcar )\n\n\n  /* */\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_TrueTypeGX_Validate\n  *\n  * @description:\n  *    Validate various TrueTypeGX tables to assure that all offsets and\n  *    indices are valid.  The idea is that a higher-level library which\n  *    actually does the text layout can access those tables without\n  *    error checking (which can be quite time consuming).\n  *\n  * @input:\n  *    face ::\n  *       A handle to the input face.\n  *\n  *    validation_flags ::\n  *       A bit field which specifies the tables to be validated.  See\n  *       @FT_VALIDATE_GXXXX for possible values.\n  *\n  *    table_length ::\n  *       The size of the `tables' array.  Normally, @FT_VALIDATE_GX_LENGTH\n  *       should be passed.\n  *\n  * @output:\n  *    tables ::\n  *       The array where all validated sfnt tables are stored.\n  *       The array itself must be allocated by a client.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   This function only works with TrueTypeGX fonts, returning an error\n  *   otherwise.\n  *\n  *   After use, the application should deallocate the buffers pointed to by\n  *   each `tables' element, by calling @FT_TrueTypeGX_Free.  A NULL value\n  *   indicates that the table either doesn't exist in the font, the\n  *   application hasn't asked for validation, or the validator doesn't have\n  *   the ability to validate the sfnt table.\n  */\n  FT_EXPORT( FT_Error )\n  FT_TrueTypeGX_Validate( FT_Face   face,\n                          FT_UInt   validation_flags,\n                          FT_Bytes  tables[FT_VALIDATE_GX_LENGTH],\n                          FT_UInt   table_length );\n\n\n  /* */\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_TrueTypeGX_Free\n  *\n  * @description:\n  *    Free the buffer allocated by TrueTypeGX validator.\n  *\n  * @input:\n  *    face ::\n  *       A handle to the input face.\n  *\n  *    table ::\n  *       The pointer to the buffer allocated by\n  *       @FT_TrueTypeGX_Validate.\n  *\n  * @note:\n  *   This function must be used to free the buffer allocated by\n  *   @FT_TrueTypeGX_Validate only.\n  */\n  FT_EXPORT( void )\n  FT_TrueTypeGX_Free( FT_Face   face,\n                      FT_Bytes  table );\n\n\n  /* */\n\n /**********************************************************************\n  *\n  * @enum:\n  *    FT_VALIDATE_CKERNXXX\n  *\n  * @description:\n  *    A list of bit-field constants used with @FT_ClassicKern_Validate\n  *    to indicate the classic kern dialect or dialects.  If the selected\n  *    type doesn't fit, @FT_ClassicKern_Validate regards the table as\n  *    invalid.\n  *\n  * @values:\n  *    FT_VALIDATE_MS ::\n  *      Handle the `kern' table as a classic Microsoft kern table.\n  *\n  *    FT_VALIDATE_APPLE ::\n  *      Handle the `kern' table as a classic Apple kern table.\n  *\n  *    FT_VALIDATE_CKERN ::\n  *      Handle the `kern' as either classic Apple or Microsoft kern table.\n  */\n#define FT_VALIDATE_MS     ( FT_VALIDATE_GX_START << 0 )\n#define FT_VALIDATE_APPLE  ( FT_VALIDATE_GX_START << 1 )\n\n#define FT_VALIDATE_CKERN  ( FT_VALIDATE_MS | FT_VALIDATE_APPLE )\n\n\n  /* */\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_ClassicKern_Validate\n  *\n  * @description:\n  *    Validate classic (16-bit format) kern table to assure that the offsets\n  *    and indices are valid.  The idea is that a higher-level library which\n  *    actually does the text layout can access those tables without error\n  *    checking (which can be quite time consuming).\n  *\n  *    The `kern' table validator in @FT_TrueTypeGX_Validate deals with both\n  *    the new 32-bit format and the classic 16-bit format, while\n  *    FT_ClassicKern_Validate only supports the classic 16-bit format.\n  *\n  * @input:\n  *    face ::\n  *       A handle to the input face.\n  *\n  *    validation_flags ::\n  *       A bit field which specifies the dialect to be validated.  See\n  *       @FT_VALIDATE_CKERNXXX for possible values.\n  *\n  * @output:\n  *    ckern_table ::\n  *       A pointer to the kern table.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   After use, the application should deallocate the buffers pointed to by\n  *   `ckern_table', by calling @FT_ClassicKern_Free.  A NULL value\n  *   indicates that the table doesn't exist in the font.\n  */\n  FT_EXPORT( FT_Error )\n  FT_ClassicKern_Validate( FT_Face    face,\n                           FT_UInt    validation_flags,\n                           FT_Bytes  *ckern_table );\n\n\n  /* */\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_ClassicKern_Free\n  *\n  * @description:\n  *    Free the buffer allocated by classic Kern validator.\n  *\n  * @input:\n  *    face ::\n  *       A handle to the input face.\n  *\n  *    table ::\n  *       The pointer to the buffer that is allocated by\n  *       @FT_ClassicKern_Validate.\n  *\n  * @note:\n  *   This function must be used to free the buffer allocated by\n  *   @FT_ClassicKern_Validate only.\n  */\n  FT_EXPORT( void )\n  FT_ClassicKern_Free( FT_Face   face,\n                       FT_Bytes  table );\n\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTGXVAL_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgzip.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftgzip.h                                                               */\n/*                                                                         */\n/*    Gzip-compressed stream support.                                      */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2004, 2006 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTGZIP_H__\n#define __FTGZIP_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    gzip                                                               */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    GZIP Streams                                                       */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Using gzip-compressed font files.                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of Gzip-specific functions.  */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n /************************************************************************\n  *\n  * @function:\n  *   FT_Stream_OpenGzip\n  *\n  * @description:\n  *   Open a new stream to parse gzip-compressed font files.  This is\n  *   mainly used to support the compressed `*.pcf.gz' fonts that come\n  *   with XFree86.\n  *\n  * @input:\n  *   stream ::\n  *     The target embedding stream.\n  *\n  *   source ::\n  *     The source stream.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   The source stream must be opened _before_ calling this function.\n  *\n  *   Calling the internal function `FT_Stream_Close' on the new stream will\n  *   *not* call `FT_Stream_Close' on the source stream.  None of the stream\n  *   objects will be released to the heap.\n  *\n  *   The stream implementation is very basic and resets the decompression\n  *   process each time seeking backwards is needed within the stream.\n  *\n  *   In certain builds of the library, gzip compression recognition is\n  *   automatically handled when calling @FT_New_Face or @FT_Open_Face.\n  *   This means that if no font driver is capable of handling the raw\n  *   compressed file, the library will try to open a gzipped stream from\n  *   it and re-open the face with it.\n  *\n  *   This function may return `FT_Err_Unimplemented_Feature' if your build\n  *   of FreeType was not compiled with zlib support.\n  */\n  FT_EXPORT( FT_Error )\n  FT_Stream_OpenGzip( FT_Stream  stream,\n                      FT_Stream  source );\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTGZIP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftimage.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftimage.h                                                              */\n/*                                                                         */\n/*    FreeType glyph image formats and default raster interface            */\n/*    (specification).                                                     */\n/*                                                                         */\n/*  Copyright 1996-2010, 2013 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Note: A `raster' is simply a scan-line converter, used to render      */\n  /*       FT_Outlines into FT_Bitmaps.                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTIMAGE_H__\n#define __FTIMAGE_H__\n\n\n  /* _STANDALONE_ is from ftgrays.c */\n#ifndef _STANDALONE_\n#include \"../ft2build.h\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    basic_types                                                        */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Pos                                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The type FT_Pos is used to store vectorial coordinates.  Depending */\n  /*    on the context, these can represent distances in integer font      */\n  /*    units, or 16.16, or 26.6 fixed-point pixel coordinates.            */\n  /*                                                                       */\n  typedef signed long  FT_Pos;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Vector                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple structure used to store a 2D vector; coordinates are of   */\n  /*    the FT_Pos type.                                                   */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    x :: The horizontal coordinate.                                    */\n  /*    y :: The vertical coordinate.                                      */\n  /*                                                                       */\n  typedef struct  FT_Vector_\n  {\n    FT_Pos  x;\n    FT_Pos  y;\n\n  } FT_Vector;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_BBox                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to hold an outline's bounding box, i.e., the      */\n  /*    coordinates of its extrema in the horizontal and vertical          */\n  /*    directions.                                                        */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    xMin :: The horizontal minimum (left-most).                        */\n  /*                                                                       */\n  /*    yMin :: The vertical minimum (bottom-most).                        */\n  /*                                                                       */\n  /*    xMax :: The horizontal maximum (right-most).                       */\n  /*                                                                       */\n  /*    yMax :: The vertical maximum (top-most).                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The bounding box is specified with the coordinates of the lower    */\n  /*    left and the upper right corner.  In PostScript, those values are  */\n  /*    often called (llx,lly) and (urx,ury), respectively.                */\n  /*                                                                       */\n  /*    If `yMin' is negative, this value gives the glyph's descender.     */\n  /*    Otherwise, the glyph doesn't descend below the baseline.           */\n  /*    Similarly, if `ymax' is positive, this value gives the glyph's     */\n  /*    ascender.                                                          */\n  /*                                                                       */\n  /*    `xMin' gives the horizontal distance from the glyph's origin to    */\n  /*    the left edge of the glyph's bounding box.  If `xMin' is negative, */\n  /*    the glyph extends to the left of the origin.                       */\n  /*                                                                       */\n  typedef struct  FT_BBox_\n  {\n    FT_Pos  xMin, yMin;\n    FT_Pos  xMax, yMax;\n\n  } FT_BBox;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Pixel_Mode                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration type used to describe the format of pixels in a     */\n  /*    given bitmap.  Note that additional formats may be added in the    */\n  /*    future.                                                            */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_PIXEL_MODE_NONE ::                                              */\n  /*      Value~0 is reserved.                                             */\n  /*                                                                       */\n  /*    FT_PIXEL_MODE_MONO ::                                              */\n  /*      A monochrome bitmap, using 1~bit per pixel.  Note that pixels    */\n  /*      are stored in most-significant order (MSB), which means that     */\n  /*      the left-most pixel in a byte has value 128.                     */\n  /*                                                                       */\n  /*    FT_PIXEL_MODE_GRAY ::                                              */\n  /*      An 8-bit bitmap, generally used to represent anti-aliased glyph  */\n  /*      images.  Each pixel is stored in one byte.  Note that the number */\n  /*      of `gray' levels is stored in the `num_grays' field of the       */\n  /*      @FT_Bitmap structure (it generally is 256).                      */\n  /*                                                                       */\n  /*    FT_PIXEL_MODE_GRAY2 ::                                             */\n  /*      A 2-bit per pixel bitmap, used to represent embedded             */\n  /*      anti-aliased bitmaps in font files according to the OpenType     */\n  /*      specification.  We haven't found a single font using this        */\n  /*      format, however.                                                 */\n  /*                                                                       */\n  /*    FT_PIXEL_MODE_GRAY4 ::                                             */\n  /*      A 4-bit per pixel bitmap, representing embedded anti-aliased     */\n  /*      bitmaps in font files according to the OpenType specification.   */\n  /*      We haven't found a single font using this format, however.       */\n  /*                                                                       */\n  /*    FT_PIXEL_MODE_LCD ::                                               */\n  /*      An 8-bit bitmap, representing RGB or BGR decimated glyph images  */\n  /*      used for display on LCD displays; the bitmap is three times      */\n  /*      wider than the original glyph image.  See also                   */\n  /*      @FT_RENDER_MODE_LCD.                                             */\n  /*                                                                       */\n  /*    FT_PIXEL_MODE_LCD_V ::                                             */\n  /*      An 8-bit bitmap, representing RGB or BGR decimated glyph images  */\n  /*      used for display on rotated LCD displays; the bitmap is three    */\n  /*      times taller than the original glyph image.  See also            */\n  /*      @FT_RENDER_MODE_LCD_V.                                           */\n  /*                                                                       */\n  /*    FT_PIXEL_MODE_BGRA ::                                              */\n  /*      An image with four 8-bit channels per pixel, representing a      */\n  /*      color image (such as emoticons) with alpha channel.  For each    */\n  /*      pixel, the format is BGRA, which means, the blue channel comes   */\n  /*      first in memory.  The color channels are pre-multiplied and in   */\n  /*      the sRGB colorspace.  For example, full red at half-translucent  */\n  /*      opacity will be represented as `00,00,80,80', not `00,00,FF,80'. */\n  /*      See also @FT_LOAD_COLOR.                                         */\n  /*                                                                       */\n  typedef enum  FT_Pixel_Mode_\n  {\n    FT_PIXEL_MODE_NONE = 0,\n    FT_PIXEL_MODE_MONO,\n    FT_PIXEL_MODE_GRAY,\n    FT_PIXEL_MODE_GRAY2,\n    FT_PIXEL_MODE_GRAY4,\n    FT_PIXEL_MODE_LCD,\n    FT_PIXEL_MODE_LCD_V,\n    FT_PIXEL_MODE_BGRA,\n\n    FT_PIXEL_MODE_MAX      /* do not remove */\n\n  } FT_Pixel_Mode;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    ft_pixel_mode_xxx                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A list of deprecated constants.  Use the corresponding             */\n  /*    @FT_Pixel_Mode values instead.                                     */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    ft_pixel_mode_none  :: See @FT_PIXEL_MODE_NONE.                    */\n  /*    ft_pixel_mode_mono  :: See @FT_PIXEL_MODE_MONO.                    */\n  /*    ft_pixel_mode_grays :: See @FT_PIXEL_MODE_GRAY.                    */\n  /*    ft_pixel_mode_pal2  :: See @FT_PIXEL_MODE_GRAY2.                   */\n  /*    ft_pixel_mode_pal4  :: See @FT_PIXEL_MODE_GRAY4.                   */\n  /*                                                                       */\n#define ft_pixel_mode_none   FT_PIXEL_MODE_NONE\n#define ft_pixel_mode_mono   FT_PIXEL_MODE_MONO\n#define ft_pixel_mode_grays  FT_PIXEL_MODE_GRAY\n#define ft_pixel_mode_pal2   FT_PIXEL_MODE_GRAY2\n#define ft_pixel_mode_pal4   FT_PIXEL_MODE_GRAY4\n\n /* */\n\n#if 0\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Palette_Mode                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    THIS TYPE IS DEPRECATED.  DO NOT USE IT!                           */\n  /*                                                                       */\n  /*    An enumeration type to describe the format of a bitmap palette,    */\n  /*    used with ft_pixel_mode_pal4 and ft_pixel_mode_pal8.               */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    ft_palette_mode_rgb  :: The palette is an array of 3-byte RGB      */\n  /*                            records.                                   */\n  /*                                                                       */\n  /*    ft_palette_mode_rgba :: The palette is an array of 4-byte RGBA     */\n  /*                            records.                                   */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    As ft_pixel_mode_pal2, pal4 and pal8 are currently unused by       */\n  /*    FreeType, these types are not handled by the library itself.       */\n  /*                                                                       */\n  typedef enum  FT_Palette_Mode_\n  {\n    ft_palette_mode_rgb = 0,\n    ft_palette_mode_rgba,\n\n    ft_palette_mode_max   /* do not remove */\n\n  } FT_Palette_Mode;\n\n  /* */\n\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Bitmap                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to describe a bitmap or pixmap to the raster.     */\n  /*    Note that we now manage pixmaps of various depths through the      */\n  /*    `pixel_mode' field.                                                */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    rows         :: The number of bitmap rows.                         */\n  /*                                                                       */\n  /*    width        :: The number of pixels in bitmap row.                */\n  /*                                                                       */\n  /*    pitch        :: The pitch's absolute value is the number of bytes  */\n  /*                    taken by one bitmap row, including padding.        */\n  /*                    However, the pitch is positive when the bitmap has */\n  /*                    a `down' flow, and negative when it has an `up'    */\n  /*                    flow.  In all cases, the pitch is an offset to add */\n  /*                    to a bitmap pointer in order to go down one row.   */\n  /*                                                                       */\n  /*                    Note that `padding' means the alignment of a       */\n  /*                    bitmap to a byte border, and FreeType functions    */\n  /*                    normally align to the smallest possible integer    */\n  /*                    value.                                             */\n  /*                                                                       */\n  /*                    For the B/W rasterizer, `pitch' is always an even  */\n  /*                    number.                                            */\n  /*                                                                       */\n  /*                    To change the pitch of a bitmap (say, to make it a */\n  /*                    multiple of 4), use @FT_Bitmap_Convert.            */\n  /*                    Alternatively, you might use callback functions to */\n  /*                    directly render to the application's surface; see  */\n  /*                    the file `example2.cpp' in the tutorial for a      */\n  /*                    demonstration.                                     */\n  /*                                                                       */\n  /*    buffer       :: A typeless pointer to the bitmap buffer.  This     */\n  /*                    value should be aligned on 32-bit boundaries in    */\n  /*                    most cases.                                        */\n  /*                                                                       */\n  /*    num_grays    :: This field is only used with                       */\n  /*                    @FT_PIXEL_MODE_GRAY; it gives the number of gray   */\n  /*                    levels used in the bitmap.                         */\n  /*                                                                       */\n  /*    pixel_mode   :: The pixel mode, i.e., how pixel bits are stored.   */\n  /*                    See @FT_Pixel_Mode for possible values.            */\n  /*                                                                       */\n  /*    palette_mode :: This field is intended for paletted pixel modes;   */\n  /*                    it indicates how the palette is stored.  Not       */\n  /*                    used currently.                                    */\n  /*                                                                       */\n  /*    palette      :: A typeless pointer to the bitmap palette; this     */\n  /*                    field is intended for paletted pixel modes.  Not   */\n  /*                    used currently.                                    */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*   For now, the only pixel modes supported by FreeType are mono and    */\n  /*   grays.  However, drivers might be added in the future to support    */\n  /*   more `colorful' options.                                            */\n  /*                                                                       */\n  typedef struct  FT_Bitmap_\n  {\n    int             rows;\n    int             width;\n    int             pitch;\n    unsigned char*  buffer;\n    short           num_grays;\n    char            pixel_mode;\n    char            palette_mode;\n    void*           palette;\n\n  } FT_Bitmap;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    outline_processing                                                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Outline                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This structure is used to describe an outline to the scan-line     */\n  /*    converter.                                                         */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    n_contours :: The number of contours in the outline.               */\n  /*                                                                       */\n  /*    n_points   :: The number of points in the outline.                 */\n  /*                                                                       */\n  /*    points     :: A pointer to an array of `n_points' @FT_Vector       */\n  /*                  elements, giving the outline's point coordinates.    */\n  /*                                                                       */\n  /*    tags       :: A pointer to an array of `n_points' chars, giving    */\n  /*                  each outline point's type.                           */\n  /*                                                                       */\n  /*                  If bit~0 is unset, the point is `off' the curve,     */\n  /*                  i.e., a Bézier control point, while it is `on' if    */\n  /*                  set.                                                 */\n  /*                                                                       */\n  /*                  Bit~1 is meaningful for `off' points only.  If set,  */\n  /*                  it indicates a third-order Bézier arc control point; */\n  /*                  and a second-order control point if unset.           */\n  /*                                                                       */\n  /*                  If bit~2 is set, bits 5-7 contain the drop-out mode  */\n  /*                  (as defined in the OpenType specification; the value */\n  /*                  is the same as the argument to the SCANMODE          */\n  /*                  instruction).                                        */\n  /*                                                                       */\n  /*                  Bits 3 and~4 are reserved for internal purposes.     */\n  /*                                                                       */\n  /*    contours   :: An array of `n_contours' shorts, giving the end      */\n  /*                  point of each contour within the outline.  For       */\n  /*                  example, the first contour is defined by the points  */\n  /*                  `0' to `contours[0]', the second one is defined by   */\n  /*                  the points `contours[0]+1' to `contours[1]', etc.    */\n  /*                                                                       */\n  /*    flags      :: A set of bit flags used to characterize the outline  */\n  /*                  and give hints to the scan-converter and hinter on   */\n  /*                  how to convert/grid-fit it.  See @FT_OUTLINE_FLAGS.  */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The B/W rasterizer only checks bit~2 in the `tags' array for the   */\n  /*    first point of each contour.  The drop-out mode as given with      */\n  /*    @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and       */\n  /*    @FT_OUTLINE_INCLUDE_STUBS in `flags' is then overridden.           */\n  /*                                                                       */\n  typedef struct  FT_Outline_\n  {\n    short       n_contours;      /* number of contours in glyph        */\n    short       n_points;        /* number of points in the glyph      */\n\n    FT_Vector*  points;          /* the outline's points               */\n    char*       tags;            /* the points flags                   */\n    short*      contours;        /* the contour end points             */\n\n    int         flags;           /* outline masks                      */\n\n  } FT_Outline;\n\n  /* Following limits must be consistent with */\n  /* FT_Outline.{n_contours,n_points}         */\n#define FT_OUTLINE_CONTOURS_MAX  SHRT_MAX\n#define FT_OUTLINE_POINTS_MAX    SHRT_MAX\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_OUTLINE_FLAGS                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A list of bit-field constants use for the flags in an outline's    */\n  /*    `flags' field.                                                     */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_OUTLINE_NONE ::                                                 */\n  /*      Value~0 is reserved.                                             */\n  /*                                                                       */\n  /*    FT_OUTLINE_OWNER ::                                                */\n  /*      If set, this flag indicates that the outline's field arrays      */\n  /*      (i.e., `points', `flags', and `contours') are `owned' by the     */\n  /*      outline object, and should thus be freed when it is destroyed.   */\n  /*                                                                       */\n  /*    FT_OUTLINE_EVEN_ODD_FILL ::                                        */\n  /*      By default, outlines are filled using the non-zero winding rule. */\n  /*      If set to 1, the outline will be filled using the even-odd fill  */\n  /*      rule (only works with the smooth rasterizer).                    */\n  /*                                                                       */\n  /*    FT_OUTLINE_REVERSE_FILL ::                                         */\n  /*      By default, outside contours of an outline are oriented in       */\n  /*      clock-wise direction, as defined in the TrueType specification.  */\n  /*      This flag is set if the outline uses the opposite direction      */\n  /*      (typically for Type~1 fonts).  This flag is ignored by the scan  */\n  /*      converter.                                                       */\n  /*                                                                       */\n  /*    FT_OUTLINE_IGNORE_DROPOUTS ::                                      */\n  /*      By default, the scan converter will try to detect drop-outs in   */\n  /*      an outline and correct the glyph bitmap to ensure consistent     */\n  /*      shape continuity.  If set, this flag hints the scan-line         */\n  /*      converter to ignore such cases.  See below for more information. */\n  /*                                                                       */\n  /*    FT_OUTLINE_SMART_DROPOUTS ::                                       */\n  /*      Select smart dropout control.  If unset, use simple dropout      */\n  /*      control.  Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set.  See    */\n  /*      below for more information.                                      */\n  /*                                                                       */\n  /*    FT_OUTLINE_INCLUDE_STUBS ::                                        */\n  /*      If set, turn pixels on for `stubs', otherwise exclude them.      */\n  /*      Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set.  See below for    */\n  /*      more information.                                                */\n  /*                                                                       */\n  /*    FT_OUTLINE_HIGH_PRECISION ::                                       */\n  /*      This flag indicates that the scan-line converter should try to   */\n  /*      convert this outline to bitmaps with the highest possible        */\n  /*      quality.  It is typically set for small character sizes.  Note   */\n  /*      that this is only a hint that might be completely ignored by a   */\n  /*      given scan-converter.                                            */\n  /*                                                                       */\n  /*    FT_OUTLINE_SINGLE_PASS ::                                          */\n  /*      This flag is set to force a given scan-converter to only use a   */\n  /*      single pass over the outline to render a bitmap glyph image.     */\n  /*      Normally, it is set for very large character sizes.  It is only  */\n  /*      a hint that might be completely ignored by a given               */\n  /*      scan-converter.                                                  */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The flags @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, */\n  /*    and @FT_OUTLINE_INCLUDE_STUBS are ignored by the smooth            */\n  /*    rasterizer.                                                        */\n  /*                                                                       */\n  /*    There exists a second mechanism to pass the drop-out mode to the   */\n  /*    B/W rasterizer; see the `tags' field in @FT_Outline.               */\n  /*                                                                       */\n  /*    Please refer to the description of the `SCANTYPE' instruction in   */\n  /*    the OpenType specification (in file `ttinst1.doc') how simple      */\n  /*    drop-outs, smart drop-outs, and stubs are defined.                 */\n  /*                                                                       */\n#define FT_OUTLINE_NONE             0x0\n#define FT_OUTLINE_OWNER            0x1\n#define FT_OUTLINE_EVEN_ODD_FILL    0x2\n#define FT_OUTLINE_REVERSE_FILL     0x4\n#define FT_OUTLINE_IGNORE_DROPOUTS  0x8\n#define FT_OUTLINE_SMART_DROPOUTS   0x10\n#define FT_OUTLINE_INCLUDE_STUBS    0x20\n\n#define FT_OUTLINE_HIGH_PRECISION   0x100\n#define FT_OUTLINE_SINGLE_PASS      0x200\n\n\n /*************************************************************************\n  *\n  * @enum:\n  *   ft_outline_flags\n  *\n  * @description:\n  *   These constants are deprecated.  Please use the corresponding\n  *   @FT_OUTLINE_FLAGS values.\n  *\n  * @values:\n  *   ft_outline_none            :: See @FT_OUTLINE_NONE.\n  *   ft_outline_owner           :: See @FT_OUTLINE_OWNER.\n  *   ft_outline_even_odd_fill   :: See @FT_OUTLINE_EVEN_ODD_FILL.\n  *   ft_outline_reverse_fill    :: See @FT_OUTLINE_REVERSE_FILL.\n  *   ft_outline_ignore_dropouts :: See @FT_OUTLINE_IGNORE_DROPOUTS.\n  *   ft_outline_high_precision  :: See @FT_OUTLINE_HIGH_PRECISION.\n  *   ft_outline_single_pass     :: See @FT_OUTLINE_SINGLE_PASS.\n  */\n#define ft_outline_none             FT_OUTLINE_NONE\n#define ft_outline_owner            FT_OUTLINE_OWNER\n#define ft_outline_even_odd_fill    FT_OUTLINE_EVEN_ODD_FILL\n#define ft_outline_reverse_fill     FT_OUTLINE_REVERSE_FILL\n#define ft_outline_ignore_dropouts  FT_OUTLINE_IGNORE_DROPOUTS\n#define ft_outline_high_precision   FT_OUTLINE_HIGH_PRECISION\n#define ft_outline_single_pass      FT_OUTLINE_SINGLE_PASS\n\n  /* */\n\n#define FT_CURVE_TAG( flag )  ( flag & 3 )\n\n#define FT_CURVE_TAG_ON            1\n#define FT_CURVE_TAG_CONIC         0\n#define FT_CURVE_TAG_CUBIC         2\n\n#define FT_CURVE_TAG_HAS_SCANMODE  4\n\n#define FT_CURVE_TAG_TOUCH_X       8  /* reserved for the TrueType hinter */\n#define FT_CURVE_TAG_TOUCH_Y      16  /* reserved for the TrueType hinter */\n\n#define FT_CURVE_TAG_TOUCH_BOTH    ( FT_CURVE_TAG_TOUCH_X | \\\n                                     FT_CURVE_TAG_TOUCH_Y )\n\n#define FT_Curve_Tag_On       FT_CURVE_TAG_ON\n#define FT_Curve_Tag_Conic    FT_CURVE_TAG_CONIC\n#define FT_Curve_Tag_Cubic    FT_CURVE_TAG_CUBIC\n#define FT_Curve_Tag_Touch_X  FT_CURVE_TAG_TOUCH_X\n#define FT_Curve_Tag_Touch_Y  FT_CURVE_TAG_TOUCH_Y\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Outline_MoveToFunc                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function pointer type used to describe the signature of a `move  */\n  /*    to' function during outline walking/decomposition.                 */\n  /*                                                                       */\n  /*    A `move to' is emitted to start a new contour in an outline.       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    to   :: A pointer to the target point of the `move to'.            */\n  /*                                                                       */\n  /*    user :: A typeless pointer which is passed from the caller of the  */\n  /*            decomposition function.                                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Error code.  0~means success.                                      */\n  /*                                                                       */\n  typedef int\n  (*FT_Outline_MoveToFunc)( const FT_Vector*  to,\n                            void*             user );\n\n#define FT_Outline_MoveTo_Func  FT_Outline_MoveToFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Outline_LineToFunc                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function pointer type used to describe the signature of a `line  */\n  /*    to' function during outline walking/decomposition.                 */\n  /*                                                                       */\n  /*    A `line to' is emitted to indicate a segment in the outline.       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    to   :: A pointer to the target point of the `line to'.            */\n  /*                                                                       */\n  /*    user :: A typeless pointer which is passed from the caller of the  */\n  /*            decomposition function.                                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Error code.  0~means success.                                      */\n  /*                                                                       */\n  typedef int\n  (*FT_Outline_LineToFunc)( const FT_Vector*  to,\n                            void*             user );\n\n#define FT_Outline_LineTo_Func  FT_Outline_LineToFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Outline_ConicToFunc                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function pointer type used to describe the signature of a `conic */\n  /*    to' function during outline walking or decomposition.              */\n  /*                                                                       */\n  /*    A `conic to' is emitted to indicate a second-order Bézier arc in   */\n  /*    the outline.                                                       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    control :: An intermediate control point between the last position */\n  /*               and the new target in `to'.                             */\n  /*                                                                       */\n  /*    to      :: A pointer to the target end point of the conic arc.     */\n  /*                                                                       */\n  /*    user    :: A typeless pointer which is passed from the caller of   */\n  /*               the decomposition function.                             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Error code.  0~means success.                                      */\n  /*                                                                       */\n  typedef int\n  (*FT_Outline_ConicToFunc)( const FT_Vector*  control,\n                             const FT_Vector*  to,\n                             void*             user );\n\n#define FT_Outline_ConicTo_Func  FT_Outline_ConicToFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Outline_CubicToFunc                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function pointer type used to describe the signature of a `cubic */\n  /*    to' function during outline walking or decomposition.              */\n  /*                                                                       */\n  /*    A `cubic to' is emitted to indicate a third-order Bézier arc.      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    control1 :: A pointer to the first Bézier control point.           */\n  /*                                                                       */\n  /*    control2 :: A pointer to the second Bézier control point.          */\n  /*                                                                       */\n  /*    to       :: A pointer to the target end point.                     */\n  /*                                                                       */\n  /*    user     :: A typeless pointer which is passed from the caller of  */\n  /*                the decomposition function.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Error code.  0~means success.                                      */\n  /*                                                                       */\n  typedef int\n  (*FT_Outline_CubicToFunc)( const FT_Vector*  control1,\n                             const FT_Vector*  control2,\n                             const FT_Vector*  to,\n                             void*             user );\n\n#define FT_Outline_CubicTo_Func  FT_Outline_CubicToFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Outline_Funcs                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure to hold various function pointers used during outline  */\n  /*    decomposition in order to emit segments, conic, and cubic Béziers. */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    move_to  :: The `move to' emitter.                                 */\n  /*                                                                       */\n  /*    line_to  :: The segment emitter.                                   */\n  /*                                                                       */\n  /*    conic_to :: The second-order Bézier arc emitter.                   */\n  /*                                                                       */\n  /*    cubic_to :: The third-order Bézier arc emitter.                    */\n  /*                                                                       */\n  /*    shift    :: The shift that is applied to coordinates before they   */\n  /*                are sent to the emitter.                               */\n  /*                                                                       */\n  /*    delta    :: The delta that is applied to coordinates before they   */\n  /*                are sent to the emitter, but after the shift.          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The point coordinates sent to the emitters are the transformed     */\n  /*    version of the original coordinates (this is important for high    */\n  /*    accuracy during scan-conversion).  The transformation is simple:   */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      x' = (x << shift) - delta                                        */\n  /*      y' = (x << shift) - delta                                        */\n  /*    }                                                                  */\n  /*                                                                       */\n  /*    Set the values of `shift' and `delta' to~0 to get the original     */\n  /*    point coordinates.                                                 */\n  /*                                                                       */\n  typedef struct  FT_Outline_Funcs_\n  {\n    FT_Outline_MoveToFunc   move_to;\n    FT_Outline_LineToFunc   line_to;\n    FT_Outline_ConicToFunc  conic_to;\n    FT_Outline_CubicToFunc  cubic_to;\n\n    int                     shift;\n    FT_Pos                  delta;\n\n  } FT_Outline_Funcs;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    basic_types                                                        */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_IMAGE_TAG                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This macro converts four-letter tags to an unsigned long type.     */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Since many 16-bit compilers don't like 32-bit enumerations, you    */\n  /*    should redefine this macro in case of problems to something like   */\n  /*    this:                                                              */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 )  value         */\n  /*    }                                                                  */\n  /*                                                                       */\n  /*    to get a simple enumeration without assigning special numbers.     */\n  /*                                                                       */\n#ifndef FT_IMAGE_TAG\n#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 )  \\\n          value = ( ( (unsigned long)_x1 << 24 ) | \\\n                    ( (unsigned long)_x2 << 16 ) | \\\n                    ( (unsigned long)_x3 << 8  ) | \\\n                      (unsigned long)_x4         )\n#endif /* FT_IMAGE_TAG */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Glyph_Format                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration type used to describe the format of a given glyph   */\n  /*    image.  Note that this version of FreeType only supports two image */\n  /*    formats, even though future font drivers will be able to register  */\n  /*    their own format.                                                  */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_GLYPH_FORMAT_NONE ::                                            */\n  /*      The value~0 is reserved.                                         */\n  /*                                                                       */\n  /*    FT_GLYPH_FORMAT_COMPOSITE ::                                       */\n  /*      The glyph image is a composite of several other images.  This    */\n  /*      format is _only_ used with @FT_LOAD_NO_RECURSE, and is used to   */\n  /*      report compound glyphs (like accented characters).               */\n  /*                                                                       */\n  /*    FT_GLYPH_FORMAT_BITMAP ::                                          */\n  /*      The glyph image is a bitmap, and can be described as an          */\n  /*      @FT_Bitmap.  You generally need to access the `bitmap' field of  */\n  /*      the @FT_GlyphSlotRec structure to read it.                       */\n  /*                                                                       */\n  /*    FT_GLYPH_FORMAT_OUTLINE ::                                         */\n  /*      The glyph image is a vectorial outline made of line segments     */\n  /*      and Bézier arcs; it can be described as an @FT_Outline; you      */\n  /*      generally want to access the `outline' field of the              */\n  /*      @FT_GlyphSlotRec structure to read it.                           */\n  /*                                                                       */\n  /*    FT_GLYPH_FORMAT_PLOTTER ::                                         */\n  /*      The glyph image is a vectorial path with no inside and outside   */\n  /*      contours.  Some Type~1 fonts, like those in the Hershey family,  */\n  /*      contain glyphs in this format.  These are described as           */\n  /*      @FT_Outline, but FreeType isn't currently capable of rendering   */\n  /*      them correctly.                                                  */\n  /*                                                                       */\n  typedef enum  FT_Glyph_Format_\n  {\n    FT_IMAGE_TAG( FT_GLYPH_FORMAT_NONE, 0, 0, 0, 0 ),\n\n    FT_IMAGE_TAG( FT_GLYPH_FORMAT_COMPOSITE, 'c', 'o', 'm', 'p' ),\n    FT_IMAGE_TAG( FT_GLYPH_FORMAT_BITMAP,    'b', 'i', 't', 's' ),\n    FT_IMAGE_TAG( FT_GLYPH_FORMAT_OUTLINE,   'o', 'u', 't', 'l' ),\n    FT_IMAGE_TAG( FT_GLYPH_FORMAT_PLOTTER,   'p', 'l', 'o', 't' )\n\n  } FT_Glyph_Format;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    ft_glyph_format_xxx                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A list of deprecated constants.  Use the corresponding             */\n  /*    @FT_Glyph_Format values instead.                                   */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    ft_glyph_format_none      :: See @FT_GLYPH_FORMAT_NONE.            */\n  /*    ft_glyph_format_composite :: See @FT_GLYPH_FORMAT_COMPOSITE.       */\n  /*    ft_glyph_format_bitmap    :: See @FT_GLYPH_FORMAT_BITMAP.          */\n  /*    ft_glyph_format_outline   :: See @FT_GLYPH_FORMAT_OUTLINE.         */\n  /*    ft_glyph_format_plotter   :: See @FT_GLYPH_FORMAT_PLOTTER.         */\n  /*                                                                       */\n#define ft_glyph_format_none       FT_GLYPH_FORMAT_NONE\n#define ft_glyph_format_composite  FT_GLYPH_FORMAT_COMPOSITE\n#define ft_glyph_format_bitmap     FT_GLYPH_FORMAT_BITMAP\n#define ft_glyph_format_outline    FT_GLYPH_FORMAT_OUTLINE\n#define ft_glyph_format_plotter    FT_GLYPH_FORMAT_PLOTTER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****            R A S T E R   D E F I N I T I O N S                *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* A raster is a scan converter, in charge of rendering an outline into  */\n  /* a a bitmap.  This section contains the public API for rasters.        */\n  /*                                                                       */\n  /* Note that in FreeType 2, all rasters are now encapsulated within      */\n  /* specific modules called `renderers'.  See `freetype/ftrender.h' for   */\n  /* more details on renderers.                                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    raster                                                             */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Scanline Converter                                                 */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    How vectorial outlines are converted into bitmaps and pixmaps.     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains technical definitions.                       */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Raster                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle (pointer) to a raster object.  Each object can be used    */\n  /*    independently to convert an outline into a bitmap or pixmap.       */\n  /*                                                                       */\n  typedef struct FT_RasterRec_*  FT_Raster;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Span                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a single span of gray (or black) pixels  */\n  /*    when rendering a monochrome or anti-aliased bitmap.                */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    x        :: The span's horizontal start position.                  */\n  /*                                                                       */\n  /*    len      :: The span's length in pixels.                           */\n  /*                                                                       */\n  /*    coverage :: The span color/coverage, ranging from 0 (background)   */\n  /*                to 255 (foreground).  Only used for anti-aliased       */\n  /*                rendering.                                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This structure is used by the span drawing callback type named     */\n  /*    @FT_SpanFunc which takes the y~coordinate of the span as a         */\n  /*    a parameter.                                                       */\n  /*                                                                       */\n  /*    The coverage value is always between 0 and 255.  If you want less  */\n  /*    gray values, the callback function has to reduce them.             */\n  /*                                                                       */\n  typedef struct  FT_Span_\n  {\n    short           x;\n    unsigned short  len;\n    unsigned char   coverage;\n\n  } FT_Span;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_SpanFunc                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used as a call-back by the anti-aliased renderer in     */\n  /*    order to let client applications draw themselves the gray pixel    */\n  /*    spans on each scan line.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    y     :: The scanline's y~coordinate.                              */\n  /*                                                                       */\n  /*    count :: The number of spans to draw on this scanline.             */\n  /*                                                                       */\n  /*    spans :: A table of `count' spans to draw on the scanline.         */\n  /*                                                                       */\n  /*    user  :: User-supplied data that is passed to the callback.        */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This callback allows client applications to directly render the    */\n  /*    gray spans of the anti-aliased bitmap to any kind of surfaces.     */\n  /*                                                                       */\n  /*    This can be used to write anti-aliased outlines directly to a      */\n  /*    given background bitmap, and even perform translucency.            */\n  /*                                                                       */\n  /*    Note that the `count' field cannot be greater than a fixed value   */\n  /*    defined by the `FT_MAX_GRAY_SPANS' configuration macro in          */\n  /*    `ftoption.h'.  By default, this value is set to~32, which means    */\n  /*    that if there are more than 32~spans on a given scanline, the      */\n  /*    callback is called several times with the same `y' parameter in    */\n  /*    order to draw all callbacks.                                       */\n  /*                                                                       */\n  /*    Otherwise, the callback is only called once per scan-line, and     */\n  /*    only for those scanlines that do have `gray' pixels on them.       */\n  /*                                                                       */\n  typedef void\n  (*FT_SpanFunc)( int             y,\n                  int             count,\n                  const FT_Span*  spans,\n                  void*           user );\n\n#define FT_Raster_Span_Func  FT_SpanFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Raster_BitTest_Func                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    THIS TYPE IS DEPRECATED.  DO NOT USE IT.                           */\n  /*                                                                       */\n  /*    A function used as a call-back by the monochrome scan-converter    */\n  /*    to test whether a given target pixel is already set to the drawing */\n  /*    `color'.  These tests are crucial to implement drop-out control    */\n  /*    per-se the TrueType spec.                                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    y     :: The pixel's y~coordinate.                                 */\n  /*                                                                       */\n  /*    x     :: The pixel's x~coordinate.                                 */\n  /*                                                                       */\n  /*    user  :: User-supplied data that is passed to the callback.        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*   1~if the pixel is `set', 0~otherwise.                               */\n  /*                                                                       */\n  typedef int\n  (*FT_Raster_BitTest_Func)( int    y,\n                             int    x,\n                             void*  user );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Raster_BitSet_Func                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    THIS TYPE IS DEPRECATED.  DO NOT USE IT.                           */\n  /*                                                                       */\n  /*    A function used as a call-back by the monochrome scan-converter    */\n  /*    to set an individual target pixel.  This is crucial to implement   */\n  /*    drop-out control according to the TrueType specification.          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    y     :: The pixel's y~coordinate.                                 */\n  /*                                                                       */\n  /*    x     :: The pixel's x~coordinate.                                 */\n  /*                                                                       */\n  /*    user  :: User-supplied data that is passed to the callback.        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    1~if the pixel is `set', 0~otherwise.                              */\n  /*                                                                       */\n  typedef void\n  (*FT_Raster_BitSet_Func)( int    y,\n                            int    x,\n                            void*  user );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_RASTER_FLAG_XXX                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A list of bit flag constants as used in the `flags' field of a     */\n  /*    @FT_Raster_Params structure.                                       */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_RASTER_FLAG_DEFAULT :: This value is 0.                         */\n  /*                                                                       */\n  /*    FT_RASTER_FLAG_AA      :: This flag is set to indicate that an     */\n  /*                              anti-aliased glyph image should be       */\n  /*                              generated.  Otherwise, it will be        */\n  /*                              monochrome (1-bit).                      */\n  /*                                                                       */\n  /*    FT_RASTER_FLAG_DIRECT  :: This flag is set to indicate direct      */\n  /*                              rendering.  In this mode, client         */\n  /*                              applications must provide their own span */\n  /*                              callback.  This lets them directly       */\n  /*                              draw or compose over an existing bitmap. */\n  /*                              If this bit is not set, the target       */\n  /*                              pixmap's buffer _must_ be zeroed before  */\n  /*                              rendering.                               */\n  /*                                                                       */\n  /*                              Note that for now, direct rendering is   */\n  /*                              only possible with anti-aliased glyphs.  */\n  /*                                                                       */\n  /*    FT_RASTER_FLAG_CLIP    :: This flag is only used in direct         */\n  /*                              rendering mode.  If set, the output will */\n  /*                              be clipped to a box specified in the     */\n  /*                              `clip_box' field of the                  */\n  /*                              @FT_Raster_Params structure.             */\n  /*                                                                       */\n  /*                              Note that by default, the glyph bitmap   */\n  /*                              is clipped to the target pixmap, except  */\n  /*                              in direct rendering mode where all spans */\n  /*                              are generated if no clipping box is set. */\n  /*                                                                       */\n#define FT_RASTER_FLAG_DEFAULT  0x0\n#define FT_RASTER_FLAG_AA       0x1\n#define FT_RASTER_FLAG_DIRECT   0x2\n#define FT_RASTER_FLAG_CLIP     0x4\n\n  /* deprecated */\n#define ft_raster_flag_default  FT_RASTER_FLAG_DEFAULT\n#define ft_raster_flag_aa       FT_RASTER_FLAG_AA\n#define ft_raster_flag_direct   FT_RASTER_FLAG_DIRECT\n#define ft_raster_flag_clip     FT_RASTER_FLAG_CLIP\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Raster_Params                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure to hold the arguments used by a raster's render        */\n  /*    function.                                                          */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    target      :: The target bitmap.                                  */\n  /*                                                                       */\n  /*    source      :: A pointer to the source glyph image (e.g., an       */\n  /*                   @FT_Outline).                                       */\n  /*                                                                       */\n  /*    flags       :: The rendering flags.                                */\n  /*                                                                       */\n  /*    gray_spans  :: The gray span drawing callback.                     */\n  /*                                                                       */\n  /*    black_spans :: The black span drawing callback.  UNIMPLEMENTED!    */\n  /*                                                                       */\n  /*    bit_test    :: The bit test callback.  UNIMPLEMENTED!              */\n  /*                                                                       */\n  /*    bit_set     :: The bit set callback.  UNIMPLEMENTED!               */\n  /*                                                                       */\n  /*    user        :: User-supplied data that is passed to each drawing   */\n  /*                   callback.                                           */\n  /*                                                                       */\n  /*    clip_box    :: An optional clipping box.  It is only used in       */\n  /*                   direct rendering mode.  Note that coordinates here  */\n  /*                   should be expressed in _integer_ pixels (and not in */\n  /*                   26.6 fixed-point units).                            */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    An anti-aliased glyph bitmap is drawn if the @FT_RASTER_FLAG_AA    */\n  /*    bit flag is set in the `flags' field, otherwise a monochrome       */\n  /*    bitmap is generated.                                               */\n  /*                                                                       */\n  /*    If the @FT_RASTER_FLAG_DIRECT bit flag is set in `flags', the      */\n  /*    raster will call the `gray_spans' callback to draw gray pixel      */\n  /*    spans, in the case of an aa glyph bitmap, it will call             */\n  /*    `black_spans', and `bit_test' and `bit_set' in the case of a       */\n  /*    monochrome bitmap.  This allows direct composition over a          */\n  /*    pre-existing bitmap through user-provided callbacks to perform the */\n  /*    span drawing/composition.                                          */\n  /*                                                                       */\n  /*    Note that the `bit_test' and `bit_set' callbacks are required when */\n  /*    rendering a monochrome bitmap, as they are crucial to implement    */\n  /*    correct drop-out control as defined in the TrueType specification. */\n  /*                                                                       */\n  typedef struct  FT_Raster_Params_\n  {\n    const FT_Bitmap*        target;\n    const void*             source;\n    int                     flags;\n    FT_SpanFunc             gray_spans;\n    FT_SpanFunc             black_spans;  /* doesn't work! */\n    FT_Raster_BitTest_Func  bit_test;     /* doesn't work! */\n    FT_Raster_BitSet_Func   bit_set;      /* doesn't work! */\n    void*                   user;\n    FT_BBox                 clip_box;\n\n  } FT_Raster_Params;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Raster_NewFunc                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to create a new raster object.                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory :: A handle to the memory allocator.                        */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    raster :: A handle to the new raster object.                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Error code.  0~means success.                                      */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The `memory' parameter is a typeless pointer in order to avoid     */\n  /*    un-wanted dependencies on the rest of the FreeType code.  In       */\n  /*    practice, it is an @FT_Memory object, i.e., a handle to the        */\n  /*    standard FreeType memory allocator.  However, this field can be    */\n  /*    completely ignored by a given raster implementation.               */\n  /*                                                                       */\n  typedef int\n  (*FT_Raster_NewFunc)( void*       memory,\n                        FT_Raster*  raster );\n\n#define FT_Raster_New_Func  FT_Raster_NewFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Raster_DoneFunc                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to destroy a given raster object.                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    raster :: A handle to the raster object.                           */\n  /*                                                                       */\n  typedef void\n  (*FT_Raster_DoneFunc)( FT_Raster  raster );\n\n#define FT_Raster_Done_Func  FT_Raster_DoneFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Raster_ResetFunc                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    FreeType provides an area of memory called the `render pool',      */\n  /*    available to all registered rasters.  This pool can be freely used */\n  /*    during a given scan-conversion but is shared by all rasters.  Its  */\n  /*    content is thus transient.                                         */\n  /*                                                                       */\n  /*    This function is called each time the render pool changes, or just */\n  /*    after a new raster object is created.                              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    raster    :: A handle to the new raster object.                    */\n  /*                                                                       */\n  /*    pool_base :: The address in memory of the render pool.             */\n  /*                                                                       */\n  /*    pool_size :: The size in bytes of the render pool.                 */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Rasters can ignore the render pool and rely on dynamic memory      */\n  /*    allocation if they want to (a handle to the memory allocator is    */\n  /*    passed to the raster constructor).  However, this is not           */\n  /*    recommended for efficiency purposes.                               */\n  /*                                                                       */\n  typedef void\n  (*FT_Raster_ResetFunc)( FT_Raster       raster,\n                          unsigned char*  pool_base,\n                          unsigned long   pool_size );\n\n#define FT_Raster_Reset_Func  FT_Raster_ResetFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Raster_SetModeFunc                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function is a generic facility to change modes or attributes  */\n  /*    in a given raster.  This can be used for debugging purposes, or    */\n  /*    simply to allow implementation-specific `features' in a given      */\n  /*    raster module.                                                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    raster :: A handle to the new raster object.                       */\n  /*                                                                       */\n  /*    mode   :: A 4-byte tag used to name the mode or property.          */\n  /*                                                                       */\n  /*    args   :: A pointer to the new mode/property to use.               */\n  /*                                                                       */\n  typedef int\n  (*FT_Raster_SetModeFunc)( FT_Raster      raster,\n                            unsigned long  mode,\n                            void*          args );\n\n#define FT_Raster_Set_Mode_Func  FT_Raster_SetModeFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Raster_RenderFunc                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Invoke a given raster to scan-convert a given glyph image into a   */\n  /*    target bitmap.                                                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    raster :: A handle to the raster object.                           */\n  /*                                                                       */\n  /*    params :: A pointer to an @FT_Raster_Params structure used to      */\n  /*              store the rendering parameters.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Error code.  0~means success.                                      */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The exact format of the source image depends on the raster's glyph */\n  /*    format defined in its @FT_Raster_Funcs structure.  It can be an    */\n  /*    @FT_Outline or anything else in order to support a large array of  */\n  /*    glyph formats.                                                     */\n  /*                                                                       */\n  /*    Note also that the render function can fail and return a           */\n  /*    `FT_Err_Unimplemented_Feature' error code if the raster used does  */\n  /*    not support direct composition.                                    */\n  /*                                                                       */\n  /*    XXX: For now, the standard raster doesn't support direct           */\n  /*         composition but this should change for the final release (see */\n  /*         the files `demos/src/ftgrays.c' and `demos/src/ftgrays2.c'    */\n  /*         for examples of distinct implementations which support direct */\n  /*         composition).                                                 */\n  /*                                                                       */\n  typedef int\n  (*FT_Raster_RenderFunc)( FT_Raster                raster,\n                           const FT_Raster_Params*  params );\n\n#define FT_Raster_Render_Func  FT_Raster_RenderFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Raster_Funcs                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*   A structure used to describe a given raster class to the library.   */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    glyph_format  :: The supported glyph format for this raster.       */\n  /*                                                                       */\n  /*    raster_new    :: The raster constructor.                           */\n  /*                                                                       */\n  /*    raster_reset  :: Used to reset the render pool within the raster.  */\n  /*                                                                       */\n  /*    raster_render :: A function to render a glyph into a given bitmap. */\n  /*                                                                       */\n  /*    raster_done   :: The raster destructor.                            */\n  /*                                                                       */\n  typedef struct  FT_Raster_Funcs_\n  {\n    FT_Glyph_Format        glyph_format;\n    FT_Raster_NewFunc      raster_new;\n    FT_Raster_ResetFunc    raster_reset;\n    FT_Raster_SetModeFunc  raster_set_mode;\n    FT_Raster_RenderFunc   raster_render;\n    FT_Raster_DoneFunc     raster_done;\n\n  } FT_Raster_Funcs;\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTIMAGE_H__ */\n\n\n/* END */\n\n\n/* Local Variables: */\n/* coding: utf-8    */\n/* End:             */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftincrem.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftincrem.h                                                             */\n/*                                                                         */\n/*    FreeType incremental loading (specification).                        */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2006, 2007, 2008, 2010 by                        */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTINCREM_H__\n#define __FTINCREM_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n  /***************************************************************************\n   *\n   * @section:\n   *    incremental\n   *\n   * @title:\n   *    Incremental Loading\n   *\n   * @abstract:\n   *    Custom Glyph Loading.\n   *\n   * @description:\n   *   This section contains various functions used to perform so-called\n   *   `incremental' glyph loading.  This is a mode where all glyphs loaded\n   *   from a given @FT_Face are provided by the client application,\n   *\n   *   Apart from that, all other tables are loaded normally from the font\n   *   file.  This mode is useful when FreeType is used within another\n   *   engine, e.g., a PostScript Imaging Processor.\n   *\n   *   To enable this mode, you must use @FT_Open_Face, passing an\n   *   @FT_Parameter with the @FT_PARAM_TAG_INCREMENTAL tag and an\n   *   @FT_Incremental_Interface value.  See the comments for\n   *   @FT_Incremental_InterfaceRec for an example.\n   *\n   */\n\n\n  /***************************************************************************\n   *\n   * @type:\n   *   FT_Incremental\n   *\n   * @description:\n   *   An opaque type describing a user-provided object used to implement\n   *   `incremental' glyph loading within FreeType.  This is used to support\n   *   embedded fonts in certain environments (e.g., PostScript interpreters),\n   *   where the glyph data isn't in the font file, or must be overridden by\n   *   different values.\n   *\n   * @note:\n   *   It is up to client applications to create and implement @FT_Incremental\n   *   objects, as long as they provide implementations for the methods\n   *   @FT_Incremental_GetGlyphDataFunc, @FT_Incremental_FreeGlyphDataFunc\n   *   and @FT_Incremental_GetGlyphMetricsFunc.\n   *\n   *   See the description of @FT_Incremental_InterfaceRec to understand how\n   *   to use incremental objects with FreeType.\n   *\n   */\n  typedef struct FT_IncrementalRec_*  FT_Incremental;\n\n\n  /***************************************************************************\n   *\n   * @struct:\n   *   FT_Incremental_MetricsRec\n   *\n   * @description:\n   *   A small structure used to contain the basic glyph metrics returned\n   *   by the @FT_Incremental_GetGlyphMetricsFunc method.\n   *\n   * @fields:\n   *   bearing_x ::\n   *     Left bearing, in font units.\n   *\n   *   bearing_y ::\n   *     Top bearing, in font units.\n   *\n   *   advance ::\n   *     Horizontal component of glyph advance, in font units.\n   *\n   *   advance_v ::\n   *     Vertical component of glyph advance, in font units.\n   *\n   * @note:\n   *   These correspond to horizontal or vertical metrics depending on the\n   *   value of the `vertical' argument to the function\n   *   @FT_Incremental_GetGlyphMetricsFunc.\n   *\n   */\n  typedef struct  FT_Incremental_MetricsRec_\n  {\n    FT_Long  bearing_x;\n    FT_Long  bearing_y;\n    FT_Long  advance;\n    FT_Long  advance_v;     /* since 2.3.12 */\n\n  } FT_Incremental_MetricsRec;\n\n\n  /***************************************************************************\n   *\n   * @struct:\n   *   FT_Incremental_Metrics\n   *\n   * @description:\n   *   A handle to an @FT_Incremental_MetricsRec structure.\n   *\n   */\n   typedef struct FT_Incremental_MetricsRec_*  FT_Incremental_Metrics;\n\n\n  /***************************************************************************\n   *\n   * @type:\n   *   FT_Incremental_GetGlyphDataFunc\n   *\n   * @description:\n   *   A function called by FreeType to access a given glyph's data bytes\n   *   during @FT_Load_Glyph or @FT_Load_Char if incremental loading is\n   *   enabled.\n   *\n   *   Note that the format of the glyph's data bytes depends on the font\n   *   file format.  For TrueType, it must correspond to the raw bytes within\n   *   the `glyf' table.  For PostScript formats, it must correspond to the\n   *   *unencrypted* charstring bytes, without any `lenIV' header.  It is\n   *   undefined for any other format.\n   *\n   * @input:\n   *   incremental ::\n   *     Handle to an opaque @FT_Incremental handle provided by the client\n   *     application.\n   *\n   *   glyph_index ::\n   *     Index of relevant glyph.\n   *\n   * @output:\n   *   adata ::\n   *     A structure describing the returned glyph data bytes (which will be\n   *     accessed as a read-only byte block).\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   If this function returns successfully the method\n   *   @FT_Incremental_FreeGlyphDataFunc will be called later to release\n   *   the data bytes.\n   *\n   *   Nested calls to @FT_Incremental_GetGlyphDataFunc can happen for\n   *   compound glyphs.\n   *\n   */\n  typedef FT_Error\n  (*FT_Incremental_GetGlyphDataFunc)( FT_Incremental  incremental,\n                                      FT_UInt         glyph_index,\n                                      FT_Data*        adata );\n\n\n  /***************************************************************************\n   *\n   * @type:\n   *   FT_Incremental_FreeGlyphDataFunc\n   *\n   * @description:\n   *   A function used to release the glyph data bytes returned by a\n   *   successful call to @FT_Incremental_GetGlyphDataFunc.\n   *\n   * @input:\n   *   incremental ::\n   *     A handle to an opaque @FT_Incremental handle provided by the client\n   *     application.\n   *\n   *   data ::\n   *     A structure describing the glyph data bytes (which will be accessed\n   *     as a read-only byte block).\n   *\n   */\n  typedef void\n  (*FT_Incremental_FreeGlyphDataFunc)( FT_Incremental  incremental,\n                                       FT_Data*        data );\n\n\n  /***************************************************************************\n   *\n   * @type:\n   *   FT_Incremental_GetGlyphMetricsFunc\n   *\n   * @description:\n   *   A function used to retrieve the basic metrics of a given glyph index\n   *   before accessing its data.  This is necessary because, in certain\n   *   formats like TrueType, the metrics are stored in a different place from\n   *   the glyph images proper.\n   *\n   * @input:\n   *   incremental ::\n   *     A handle to an opaque @FT_Incremental handle provided by the client\n   *     application.\n   *\n   *   glyph_index ::\n   *     Index of relevant glyph.\n   *\n   *   vertical ::\n   *     If true, return vertical metrics.\n   *\n   *   ametrics ::\n   *     This parameter is used for both input and output.\n   *     The original glyph metrics, if any, in font units.  If metrics are\n   *     not available all the values must be set to zero.\n   *\n   * @output:\n   *   ametrics ::\n   *     The replacement glyph metrics in font units.\n   *\n   */\n  typedef FT_Error\n  (*FT_Incremental_GetGlyphMetricsFunc)\n                      ( FT_Incremental              incremental,\n                        FT_UInt                     glyph_index,\n                        FT_Bool                     vertical,\n                        FT_Incremental_MetricsRec  *ametrics );\n\n\n  /**************************************************************************\n   *\n   * @struct:\n   *   FT_Incremental_FuncsRec\n   *\n   * @description:\n   *   A table of functions for accessing fonts that load data\n   *   incrementally.  Used in @FT_Incremental_InterfaceRec.\n   *\n   * @fields:\n   *   get_glyph_data ::\n   *     The function to get glyph data.  Must not be null.\n   *\n   *   free_glyph_data ::\n   *     The function to release glyph data.  Must not be null.\n   *\n   *   get_glyph_metrics ::\n   *     The function to get glyph metrics.  May be null if the font does\n   *     not provide overriding glyph metrics.\n   *\n   */\n  typedef struct  FT_Incremental_FuncsRec_\n  {\n    FT_Incremental_GetGlyphDataFunc     get_glyph_data;\n    FT_Incremental_FreeGlyphDataFunc    free_glyph_data;\n    FT_Incremental_GetGlyphMetricsFunc  get_glyph_metrics;\n\n  } FT_Incremental_FuncsRec;\n\n\n  /***************************************************************************\n   *\n   * @struct:\n   *   FT_Incremental_InterfaceRec\n   *\n   * @description:\n   *   A structure to be used with @FT_Open_Face to indicate that the user\n   *   wants to support incremental glyph loading.  You should use it with\n   *   @FT_PARAM_TAG_INCREMENTAL as in the following example:\n   *\n   *     {\n   *       FT_Incremental_InterfaceRec  inc_int;\n   *       FT_Parameter                 parameter;\n   *       FT_Open_Args                 open_args;\n   *\n   *\n   *       // set up incremental descriptor\n   *       inc_int.funcs  = my_funcs;\n   *       inc_int.object = my_object;\n   *\n   *       // set up optional parameter\n   *       parameter.tag  = FT_PARAM_TAG_INCREMENTAL;\n   *       parameter.data = &inc_int;\n   *\n   *       // set up FT_Open_Args structure\n   *       open_args.flags      = FT_OPEN_PATHNAME | FT_OPEN_PARAMS;\n   *       open_args.pathname   = my_font_pathname;\n   *       open_args.num_params = 1;\n   *       open_args.params     = &parameter; // we use one optional argument\n   *\n   *       // open the font\n   *       error = FT_Open_Face( library, &open_args, index, &face );\n   *       ...\n   *     }\n   *\n   */\n  typedef struct  FT_Incremental_InterfaceRec_\n  {\n    const FT_Incremental_FuncsRec*  funcs;\n    FT_Incremental                  object;\n\n  } FT_Incremental_InterfaceRec;\n\n\n  /***************************************************************************\n   *\n   * @type:\n   *   FT_Incremental_Interface\n   *\n   * @description:\n   *   A pointer to an @FT_Incremental_InterfaceRec structure.\n   *\n   */\n  typedef FT_Incremental_InterfaceRec*   FT_Incremental_Interface;\n\n\n  /***************************************************************************\n   *\n   * @constant:\n   *   FT_PARAM_TAG_INCREMENTAL\n   *\n   * @description:\n   *   A constant used as the tag of @FT_Parameter structures to indicate\n   *   an incremental loading object to be used by FreeType.\n   *\n   */\n#define FT_PARAM_TAG_INCREMENTAL  FT_MAKE_TAG( 'i', 'n', 'c', 'r' )\n\n  /* */\n\nFT_END_HEADER\n\n#endif /* __FTINCREM_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlcdfil.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftlcdfil.h                                                             */\n/*                                                                         */\n/*    FreeType API for color filtering of subpixel bitmap glyphs           */\n/*    (specification).                                                     */\n/*                                                                         */\n/*  Copyright 2006, 2007, 2008, 2010 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FT_LCD_FILTER_H__\n#define __FT_LCD_FILTER_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n  /***************************************************************************\n   *\n   * @section:\n   *   lcd_filtering\n   *\n   * @title:\n   *   LCD Filtering\n   *\n   * @abstract:\n   *   Reduce color fringes of LCD-optimized bitmaps.\n   *\n   * @description:\n   *   The @FT_Library_SetLcdFilter API can be used to specify a low-pass\n   *   filter which is then applied to LCD-optimized bitmaps generated\n   *   through @FT_Render_Glyph.  This is useful to reduce color fringes\n   *   which would occur with unfiltered rendering.\n   *\n   *   Note that no filter is active by default, and that this function is\n   *   *not* implemented in default builds of the library.  You need to\n   *   #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING in your `ftoption.h' file\n   *   in order to activate it.\n   *\n   *   FreeType generates alpha coverage maps, which are linear by nature.\n   *   For instance, the value 0x80 in bitmap representation means that\n   *   (within numerical precision) 0x80/0xff fraction of that pixel is\n   *   covered by the glyph's outline.  The blending function for placing\n   *   text over a background is\n   *\n   *   {\n   *     dst = alpha * src + (1 - alpha) * dst    ,\n   *   }\n   *\n   *   which is known as OVER.  However, when calculating the output of the\n   *   OVER operator, the source colors should first be transformed to a\n   *   linear color space, then alpha blended in that space, and transformed\n   *   back to the output color space.\n   *\n   *   When linear light blending is used, the default FIR5 filtering\n   *   weights (as given by FT_LCD_FILTER_DEFAULT) are no longer optimal, as\n   *   they have been designed for black on white rendering while lacking\n   *   gamma correction.  To preserve color neutrality, weights for a FIR5\n   *   filter should be chosen according to two free parameters `a' and `c',\n   *   and the FIR weights should be\n   *\n   *   {\n   *     [a - c, a + c, 2 * a, a + c, a - c]    .\n   *   }\n   *\n   *   This formula generates equal weights for all the color primaries\n   *   across the filter kernel, which makes it colorless.  One suggested\n   *   set of weights is\n   *\n   *   {\n   *     [0x10, 0x50, 0x60, 0x50, 0x10]    ,\n   *   }\n   *\n   *   where `a' has value 0x30 and `b' value 0x20.  The weights in filter\n   *   may have a sum larger than 0x100, which increases coloration slightly\n   *   but also improves contrast.\n   */\n\n\n  /****************************************************************************\n   *\n   * @enum:\n   *   FT_LcdFilter\n   *\n   * @description:\n   *   A list of values to identify various types of LCD filters.\n   *\n   * @values:\n   *   FT_LCD_FILTER_NONE ::\n   *     Do not perform filtering.  When used with subpixel rendering, this\n   *     results in sometimes severe color fringes.\n   *\n   *   FT_LCD_FILTER_DEFAULT ::\n   *     The default filter reduces color fringes considerably, at the cost\n   *     of a slight blurriness in the output.\n   *\n   *   FT_LCD_FILTER_LIGHT ::\n   *     The light filter is a variant that produces less blurriness at the\n   *     cost of slightly more color fringes than the default one.  It might\n   *     be better, depending on taste, your monitor, or your personal vision.\n   *\n   *   FT_LCD_FILTER_LEGACY ::\n   *     This filter corresponds to the original libXft color filter.  It\n   *     provides high contrast output but can exhibit really bad color\n   *     fringes if glyphs are not extremely well hinted to the pixel grid.\n   *     In other words, it only works well if the TrueType bytecode\n   *     interpreter is enabled *and* high-quality hinted fonts are used.\n   *\n   *     This filter is only provided for comparison purposes, and might be\n   *     disabled or stay unsupported in the future.\n   *\n   * @since:\n   *   2.3.0\n   */\n  typedef enum  FT_LcdFilter_\n  {\n    FT_LCD_FILTER_NONE    = 0,\n    FT_LCD_FILTER_DEFAULT = 1,\n    FT_LCD_FILTER_LIGHT   = 2,\n    FT_LCD_FILTER_LEGACY  = 16,\n\n    FT_LCD_FILTER_MAX   /* do not remove */\n\n  } FT_LcdFilter;\n\n\n  /**************************************************************************\n   *\n   * @func:\n   *   FT_Library_SetLcdFilter\n   *\n   * @description:\n   *   This function is used to apply color filtering to LCD decimated\n   *   bitmaps, like the ones used when calling @FT_Render_Glyph with\n   *   @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V.\n   *\n   * @input:\n   *   library ::\n   *     A handle to the target library instance.\n   *\n   *   filter ::\n   *     The filter type.\n   *\n   *     You can use @FT_LCD_FILTER_NONE here to disable this feature, or\n   *     @FT_LCD_FILTER_DEFAULT to use a default filter that should work\n   *     well on most LCD screens.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   This feature is always disabled by default.  Clients must make an\n   *   explicit call to this function with a `filter' value other than\n   *   @FT_LCD_FILTER_NONE in order to enable it.\n   *\n   *   Due to *PATENTS* covering subpixel rendering, this function doesn't\n   *   do anything except returning `FT_Err_Unimplemented_Feature' if the\n   *   configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not\n   *   defined in your build of the library, which should correspond to all\n   *   default builds of FreeType.\n   *\n   *   The filter affects glyph bitmaps rendered through @FT_Render_Glyph,\n   *   @FT_Outline_Get_Bitmap, @FT_Load_Glyph, and @FT_Load_Char.\n   *\n   *   It does _not_ affect the output of @FT_Outline_Render and\n   *   @FT_Outline_Get_Bitmap.\n   *\n   *   If this feature is activated, the dimensions of LCD glyph bitmaps are\n   *   either larger or taller than the dimensions of the corresponding\n   *   outline with regards to the pixel grid.  For example, for\n   *   @FT_RENDER_MODE_LCD, the filter adds up to 3~pixels to the left, and\n   *   up to 3~pixels to the right.\n   *\n   *   The bitmap offset values are adjusted correctly, so clients shouldn't\n   *   need to modify their layout and glyph positioning code when enabling\n   *   the filter.\n   *\n   * @since:\n   *   2.3.0\n   */\n  FT_EXPORT( FT_Error )\n  FT_Library_SetLcdFilter( FT_Library    library,\n                           FT_LcdFilter  filter );\n\n\n  /**************************************************************************\n   *\n   * @func:\n   *   FT_Library_SetLcdFilterWeights\n   *\n   * @description:\n   *   Use this function to override the filter weights selected by\n   *   @FT_Library_SetLcdFilter.  By default, FreeType uses the quintuple\n   *   (0x00, 0x55, 0x56, 0x55, 0x00) for FT_LCD_FILTER_LIGHT, and (0x10,\n   *   0x40, 0x70, 0x40, 0x10) for FT_LCD_FILTER_DEFAULT and\n   *   FT_LCD_FILTER_LEGACY.\n   *\n   * @input:\n   *   library ::\n   *     A handle to the target library instance.\n   *\n   *   weights ::\n   *     A pointer to an array; the function copies the first five bytes and\n   *     uses them to specify the filter weights.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   Due to *PATENTS* covering subpixel rendering, this function doesn't\n   *   do anything except returning `FT_Err_Unimplemented_Feature' if the\n   *   configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not\n   *   defined in your build of the library, which should correspond to all\n   *   default builds of FreeType.\n   *\n   *   This function must be called after @FT_Library_SetLcdFilter to have\n   *   any effect.\n   *\n   * @since:\n   *   2.4.0\n   */\n  FT_EXPORT( FT_Error )\n  FT_Library_SetLcdFilterWeights( FT_Library      library,\n                                  unsigned char  *weights );\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FT_LCD_FILTER_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlist.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftlist.h                                                               */\n/*                                                                         */\n/*    Generic list support for FreeType (specification).                   */\n/*                                                                         */\n/*  Copyright 1996-2001, 2003, 2007, 2010 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  This file implements functions relative to list processing.  Its     */\n  /*  data structures are defined in `freetype.h'.                         */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTLIST_H__\n#define __FTLIST_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    list_processing                                                    */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    List Processing                                                    */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Simple management of lists.                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains various definitions related to list          */\n  /*    processing using doubly-linked nodes.                              */\n  /*                                                                       */\n  /* <Order>                                                               */\n  /*    FT_List                                                            */\n  /*    FT_ListNode                                                        */\n  /*    FT_ListRec                                                         */\n  /*    FT_ListNodeRec                                                     */\n  /*                                                                       */\n  /*    FT_List_Add                                                        */\n  /*    FT_List_Insert                                                     */\n  /*    FT_List_Find                                                       */\n  /*    FT_List_Remove                                                     */\n  /*    FT_List_Up                                                         */\n  /*    FT_List_Iterate                                                    */\n  /*    FT_List_Iterator                                                   */\n  /*    FT_List_Finalize                                                   */\n  /*    FT_List_Destructor                                                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_List_Find                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Find the list node for a given listed object.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    list :: A pointer to the parent list.                              */\n  /*    data :: The address of the listed object.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    List node.  NULL if it wasn't found.                               */\n  /*                                                                       */\n  FT_EXPORT( FT_ListNode )\n  FT_List_Find( FT_List  list,\n                void*    data );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_List_Add                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Append an element to the end of a list.                            */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    list :: A pointer to the parent list.                              */\n  /*    node :: The node to append.                                        */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_List_Add( FT_List      list,\n               FT_ListNode  node );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_List_Insert                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Insert an element at the head of a list.                           */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    list :: A pointer to parent list.                                  */\n  /*    node :: The node to insert.                                        */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_List_Insert( FT_List      list,\n                  FT_ListNode  node );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_List_Remove                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Remove a node from a list.  This function doesn't check whether    */\n  /*    the node is in the list!                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    node :: The node to remove.                                        */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    list :: A pointer to the parent list.                              */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_List_Remove( FT_List      list,\n                  FT_ListNode  node );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_List_Up                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Move a node to the head/top of a list.  Used to maintain LRU       */\n  /*    lists.                                                             */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    list :: A pointer to the parent list.                              */\n  /*    node :: The node to move.                                          */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_List_Up( FT_List      list,\n              FT_ListNode  node );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_List_Iterator                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An FT_List iterator function which is called during a list parse   */\n  /*    by @FT_List_Iterate.                                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    node :: The current iteration list node.                           */\n  /*                                                                       */\n  /*    user :: A typeless pointer passed to @FT_List_Iterate.             */\n  /*            Can be used to point to the iteration's state.             */\n  /*                                                                       */\n  typedef FT_Error\n  (*FT_List_Iterator)( FT_ListNode  node,\n                       void*        user );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_List_Iterate                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Parse a list and calls a given iterator function on each element.  */\n  /*    Note that parsing is stopped as soon as one of the iterator calls  */\n  /*    returns a non-zero value.                                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    list     :: A handle to the list.                                  */\n  /*    iterator :: An iterator function, called on each node of the list. */\n  /*    user     :: A user-supplied field which is passed as the second    */\n  /*                argument to the iterator.                              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result (a FreeType error code) of the last iterator call.      */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_List_Iterate( FT_List           list,\n                   FT_List_Iterator  iterator,\n                   void*             user );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_List_Destructor                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An @FT_List iterator function which is called during a list        */\n  /*    finalization by @FT_List_Finalize to destroy all elements in a     */\n  /*    given list.                                                        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    system :: The current system object.                               */\n  /*                                                                       */\n  /*    data   :: The current object to destroy.                           */\n  /*                                                                       */\n  /*    user   :: A typeless pointer passed to @FT_List_Iterate.  It can   */\n  /*              be used to point to the iteration's state.               */\n  /*                                                                       */\n  typedef void\n  (*FT_List_Destructor)( FT_Memory  memory,\n                         void*      data,\n                         void*      user );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_List_Finalize                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Destroy all elements in the list as well as the list itself.       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    list    :: A handle to the list.                                   */\n  /*                                                                       */\n  /*    destroy :: A list destructor that will be applied to each element  */\n  /*               of the list.                                            */\n  /*                                                                       */\n  /*    memory  :: The current memory object which handles deallocation.   */\n  /*                                                                       */\n  /*    user    :: A user-supplied field which is passed as the last       */\n  /*               argument to the destructor.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function expects that all nodes added by @FT_List_Add or      */\n  /*    @FT_List_Insert have been dynamically allocated.                   */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_List_Finalize( FT_List             list,\n                    FT_List_Destructor  destroy,\n                    FT_Memory           memory,\n                    void*               user );\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTLIST_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlzw.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftlzw.h                                                                */\n/*                                                                         */\n/*    LZW-compressed stream support.                                       */\n/*                                                                         */\n/*  Copyright 2004, 2006 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTLZW_H__\n#define __FTLZW_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    lzw                                                                */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    LZW Streams                                                        */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Using LZW-compressed font files.                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of LZW-specific functions.   */\n  /*                                                                       */\n  /*************************************************************************/\n\n /************************************************************************\n  *\n  * @function:\n  *   FT_Stream_OpenLZW\n  *\n  * @description:\n  *   Open a new stream to parse LZW-compressed font files.  This is\n  *   mainly used to support the compressed `*.pcf.Z' fonts that come\n  *   with XFree86.\n  *\n  * @input:\n  *   stream :: The target embedding stream.\n  *\n  *   source :: The source stream.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   The source stream must be opened _before_ calling this function.\n  *\n  *   Calling the internal function `FT_Stream_Close' on the new stream will\n  *   *not* call `FT_Stream_Close' on the source stream.  None of the stream\n  *   objects will be released to the heap.\n  *\n  *   The stream implementation is very basic and resets the decompression\n  *   process each time seeking backwards is needed within the stream\n  *\n  *   In certain builds of the library, LZW compression recognition is\n  *   automatically handled when calling @FT_New_Face or @FT_Open_Face.\n  *   This means that if no font driver is capable of handling the raw\n  *   compressed file, the library will try to open a LZW stream from it\n  *   and re-open the face with it.\n  *\n  *   This function may return `FT_Err_Unimplemented_Feature' if your build\n  *   of FreeType was not compiled with LZW support.\n  */\n  FT_EXPORT( FT_Error )\n  FT_Stream_OpenLZW( FT_Stream  stream,\n                     FT_Stream  source );\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTLZW_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmac.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftmac.h                                                                */\n/*                                                                         */\n/*    Additional Mac-specific API.                                         */\n/*                                                                         */\n/*  Copyright 1996-2001, 2004, 2006, 2007 by                               */\n/*  Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg.     */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n/***************************************************************************/\n/*                                                                         */\n/* NOTE: Include this file after <freetype/freetype.h> and after any       */\n/*       Mac-specific headers (because this header uses Mac types such as  */\n/*       Handle, FSSpec, FSRef, etc.)                                      */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTMAC_H__\n#define __FTMAC_H__\n\n\n#include \"../ft2build.h\"\n\n\nFT_BEGIN_HEADER\n\n\n/* gcc-3.4.1 and later can warn about functions tagged as deprecated */\n#ifndef FT_DEPRECATED_ATTRIBUTE\n#if defined(__GNUC__)                                               && \\\n    ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)))\n#define FT_DEPRECATED_ATTRIBUTE  __attribute__((deprecated))\n#else\n#define FT_DEPRECATED_ATTRIBUTE\n#endif\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    mac_specific                                                       */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Mac Specific Interface                                             */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Only available on the Macintosh.                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The following definitions are only available if FreeType is        */\n  /*    compiled on a Macintosh.                                           */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Face_From_FOND                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a new face object from a FOND resource.                     */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library    :: A handle to the library resource.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    fond       :: A FOND resource.                                     */\n  /*                                                                       */\n  /*    face_index :: Only supported for the -1 `sanity check' special     */\n  /*                  case.                                                */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aface      :: A handle to a new face object.                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Notes>                                                               */\n  /*    This function can be used to create @FT_Face objects from fonts    */\n  /*    that are installed in the system as follows.                       */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      fond = GetResource( 'FOND', fontName );                          */\n  /*      error = FT_New_Face_From_FOND( library, fond, 0, &face );        */\n  /*    }                                                                  */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_New_Face_From_FOND( FT_Library  library,\n                         Handle      fond,\n                         FT_Long     face_index,\n                         FT_Face    *aface )\n                       FT_DEPRECATED_ATTRIBUTE;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_GetFile_From_Mac_Name                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return an FSSpec for the disk file containing the named font.      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    fontName   :: Mac OS name of the font (e.g., Times New Roman       */\n  /*                  Bold).                                               */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    pathSpec   :: FSSpec to the file.  For passing to                  */\n  /*                  @FT_New_Face_From_FSSpec.                            */\n  /*                                                                       */\n  /*    face_index :: Index of the face.  For passing to                   */\n  /*                  @FT_New_Face_From_FSSpec.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_GetFile_From_Mac_Name( const char*  fontName,\n                            FSSpec*      pathSpec,\n                            FT_Long*     face_index )\n                          FT_DEPRECATED_ATTRIBUTE;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_GetFile_From_Mac_ATS_Name                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return an FSSpec for the disk file containing the named font.      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    fontName   :: Mac OS name of the font in ATS framework.            */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    pathSpec   :: FSSpec to the file. For passing to                   */\n  /*                  @FT_New_Face_From_FSSpec.                            */\n  /*                                                                       */\n  /*    face_index :: Index of the face. For passing to                    */\n  /*                  @FT_New_Face_From_FSSpec.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_GetFile_From_Mac_ATS_Name( const char*  fontName,\n                                FSSpec*      pathSpec,\n                                FT_Long*     face_index )\n                              FT_DEPRECATED_ATTRIBUTE;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_GetFilePath_From_Mac_ATS_Name                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return a pathname of the disk file and face index for given font   */\n  /*    name which is handled by ATS framework.                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    fontName    :: Mac OS name of the font in ATS framework.           */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    path        :: Buffer to store pathname of the file.  For passing  */\n  /*                   to @FT_New_Face.  The client must allocate this     */\n  /*                   buffer before calling this function.                */\n  /*                                                                       */\n  /*    maxPathSize :: Lengths of the buffer `path' that client allocated. */\n  /*                                                                       */\n  /*    face_index  :: Index of the face.  For passing to @FT_New_Face.    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_GetFilePath_From_Mac_ATS_Name( const char*  fontName,\n                                    UInt8*       path,\n                                    UInt32       maxPathSize,\n                                    FT_Long*     face_index )\n                                  FT_DEPRECATED_ATTRIBUTE;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Face_From_FSSpec                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a new face object from a given resource and typeface index  */\n  /*    using an FSSpec to the font file.                                  */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library    :: A handle to the library resource.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    spec       :: FSSpec to the font file.                             */\n  /*                                                                       */\n  /*    face_index :: The index of the face within the resource.  The      */\n  /*                  first face has index~0.                              */\n  /* <Output>                                                              */\n  /*    aface      :: A handle to a new face object.                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    @FT_New_Face_From_FSSpec is identical to @FT_New_Face except       */\n  /*    it accepts an FSSpec instead of a path.                            */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_New_Face_From_FSSpec( FT_Library     library,\n                           const FSSpec  *spec,\n                           FT_Long        face_index,\n                           FT_Face       *aface )\n                         FT_DEPRECATED_ATTRIBUTE;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Face_From_FSRef                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a new face object from a given resource and typeface index  */\n  /*    using an FSRef to the font file.                                   */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library    :: A handle to the library resource.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    spec       :: FSRef to the font file.                              */\n  /*                                                                       */\n  /*    face_index :: The index of the face within the resource.  The      */\n  /*                  first face has index~0.                              */\n  /* <Output>                                                              */\n  /*    aface      :: A handle to a new face object.                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    @FT_New_Face_From_FSRef is identical to @FT_New_Face except        */\n  /*    it accepts an FSRef instead of a path.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_New_Face_From_FSRef( FT_Library    library,\n                          const FSRef  *ref,\n                          FT_Long       face_index,\n                          FT_Face      *aface )\n                        FT_DEPRECATED_ATTRIBUTE;\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __FTMAC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmm.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftmm.h                                                                 */\n/*                                                                         */\n/*    FreeType Multiple Master font interface (specification).             */\n/*                                                                         */\n/*  Copyright 1996-2001, 2003, 2004, 2006, 2009 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTMM_H__\n#define __FTMM_H__\n\n\n#include \"../ft2build.h\"\n#include \"t1tables.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    multiple_masters                                                   */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Multiple Masters                                                   */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    How to manage Multiple Masters fonts.                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The following types and functions are used to manage Multiple      */\n  /*    Master fonts, i.e., the selection of specific design instances by  */\n  /*    setting design axis coordinates.                                   */\n  /*                                                                       */\n  /*    George Williams has extended this interface to make it work with   */\n  /*    both Type~1 Multiple Masters fonts and GX distortable (var)        */\n  /*    fonts.  Some of these routines only work with MM fonts, others     */\n  /*    will work with both types.  They are similar enough that a         */\n  /*    consistent interface makes sense.                                  */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_MM_Axis                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple structure used to model a given axis in design space for  */\n  /*    Multiple Masters fonts.                                            */\n  /*                                                                       */\n  /*    This structure can't be used for GX var fonts.                     */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    name    :: The axis's name.                                        */\n  /*                                                                       */\n  /*    minimum :: The axis's minimum design coordinate.                   */\n  /*                                                                       */\n  /*    maximum :: The axis's maximum design coordinate.                   */\n  /*                                                                       */\n  typedef struct  FT_MM_Axis_\n  {\n    FT_String*  name;\n    FT_Long     minimum;\n    FT_Long     maximum;\n\n  } FT_MM_Axis;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Multi_Master                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model the axes and space of a Multiple Masters */\n  /*    font.                                                              */\n  /*                                                                       */\n  /*    This structure can't be used for GX var fonts.                     */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    num_axis    :: Number of axes.  Cannot exceed~4.                   */\n  /*                                                                       */\n  /*    num_designs :: Number of designs; should be normally 2^num_axis    */\n  /*                   even though the Type~1 specification strangely      */\n  /*                   allows for intermediate designs to be present. This */\n  /*                   number cannot exceed~16.                            */\n  /*                                                                       */\n  /*    axis        :: A table of axis descriptors.                        */\n  /*                                                                       */\n  typedef struct  FT_Multi_Master_\n  {\n    FT_UInt     num_axis;\n    FT_UInt     num_designs;\n    FT_MM_Axis  axis[T1_MAX_MM_AXIS];\n\n  } FT_Multi_Master;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Var_Axis                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple structure used to model a given axis in design space for  */\n  /*    Multiple Masters and GX var fonts.                                 */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    name    :: The axis's name.                                        */\n  /*               Not always meaningful for GX.                           */\n  /*                                                                       */\n  /*    minimum :: The axis's minimum design coordinate.                   */\n  /*                                                                       */\n  /*    def     :: The axis's default design coordinate.                   */\n  /*               FreeType computes meaningful default values for MM; it  */\n  /*               is then an integer value, not in 16.16 format.          */\n  /*                                                                       */\n  /*    maximum :: The axis's maximum design coordinate.                   */\n  /*                                                                       */\n  /*    tag     :: The axis's tag (the GX equivalent to `name').           */\n  /*               FreeType provides default values for MM if possible.    */\n  /*                                                                       */\n  /*    strid   :: The entry in `name' table (another GX version of        */\n  /*               `name').                                                */\n  /*               Not meaningful for MM.                                  */\n  /*                                                                       */\n  typedef struct  FT_Var_Axis_\n  {\n    FT_String*  name;\n\n    FT_Fixed    minimum;\n    FT_Fixed    def;\n    FT_Fixed    maximum;\n\n    FT_ULong    tag;\n    FT_UInt     strid;\n\n  } FT_Var_Axis;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Var_Named_Style                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple structure used to model a named style in a GX var font.   */\n  /*                                                                       */\n  /*    This structure can't be used for MM fonts.                         */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    coords :: The design coordinates for this style.                   */\n  /*              This is an array with one entry for each axis.           */\n  /*                                                                       */\n  /*    strid  :: The entry in `name' table identifying this style.        */\n  /*                                                                       */\n  typedef struct  FT_Var_Named_Style_\n  {\n    FT_Fixed*  coords;\n    FT_UInt    strid;\n\n  } FT_Var_Named_Style;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_MM_Var                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model the axes and space of a Multiple Masters */\n  /*    or GX var distortable font.                                        */\n  /*                                                                       */\n  /*    Some fields are specific to one format and not to the other.       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    num_axis        :: The number of axes.  The maximum value is~4 for */\n  /*                       MM; no limit in GX.                             */\n  /*                                                                       */\n  /*    num_designs     :: The number of designs; should be normally       */\n  /*                       2^num_axis for MM fonts.  Not meaningful for GX */\n  /*                       (where every glyph could have a different       */\n  /*                       number of designs).                             */\n  /*                                                                       */\n  /*    num_namedstyles :: The number of named styles; only meaningful for */\n  /*                       GX which allows certain design coordinates to   */\n  /*                       have a string ID (in the `name' table)          */\n  /*                       associated with them.  The font can tell the    */\n  /*                       user that, for example, Weight=1.5 is `Bold'.   */\n  /*                                                                       */\n  /*    axis            :: A table of axis descriptors.                    */\n  /*                       GX fonts contain slightly more data than MM.    */\n  /*                                                                       */\n  /*    namedstyles     :: A table of named styles.                        */\n  /*                       Only meaningful with GX.                        */\n  /*                                                                       */\n  typedef struct  FT_MM_Var_\n  {\n    FT_UInt              num_axis;\n    FT_UInt              num_designs;\n    FT_UInt              num_namedstyles;\n    FT_Var_Axis*         axis;\n    FT_Var_Named_Style*  namedstyle;\n\n  } FT_MM_Var;\n\n\n  /* */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Multi_Master                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the Multiple Master descriptor of a given font.           */\n  /*                                                                       */\n  /*    This function can't be used with GX fonts.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face    :: A handle to the source face.                            */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    amaster :: The Multiple Masters descriptor.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_Multi_Master( FT_Face           face,\n                       FT_Multi_Master  *amaster );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_MM_Var                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the Multiple Master/GX var descriptor of a given font.    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face    :: A handle to the source face.                            */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    amaster :: The Multiple Masters/GX var descriptor.                 */\n  /*               Allocates a data structure, which the user must free    */\n  /*               (a single call to FT_FREE will do it).                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_MM_Var( FT_Face      face,\n                 FT_MM_Var*  *amaster );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_MM_Design_Coordinates                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    For Multiple Masters fonts, choose an interpolated font design     */\n  /*    through design coordinates.                                        */\n  /*                                                                       */\n  /*    This function can't be used with GX fonts.                         */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face       :: A handle to the source face.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    num_coords :: The number of design coordinates (must be equal to   */\n  /*                  the number of axes in the font).                     */\n  /*                                                                       */\n  /*    coords     :: An array of design coordinates.                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Set_MM_Design_Coordinates( FT_Face   face,\n                                FT_UInt   num_coords,\n                                FT_Long*  coords );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_Var_Design_Coordinates                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    For Multiple Master or GX Var fonts, choose an interpolated font   */\n  /*    design through design coordinates.                                 */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face       :: A handle to the source face.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    num_coords :: The number of design coordinates (must be equal to   */\n  /*                  the number of axes in the font).                     */\n  /*                                                                       */\n  /*    coords     :: An array of design coordinates.                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Set_Var_Design_Coordinates( FT_Face    face,\n                                 FT_UInt    num_coords,\n                                 FT_Fixed*  coords );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_MM_Blend_Coordinates                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    For Multiple Masters and GX var fonts, choose an interpolated font */\n  /*    design through normalized blend coordinates.                       */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face       :: A handle to the source face.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    num_coords :: The number of design coordinates (must be equal to   */\n  /*                  the number of axes in the font).                     */\n  /*                                                                       */\n  /*    coords     :: The design coordinates array (each element must be   */\n  /*                  between 0 and 1.0).                                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Set_MM_Blend_Coordinates( FT_Face    face,\n                               FT_UInt    num_coords,\n                               FT_Fixed*  coords );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_Var_Blend_Coordinates                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This is another name of @FT_Set_MM_Blend_Coordinates.              */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Set_Var_Blend_Coordinates( FT_Face    face,\n                                FT_UInt    num_coords,\n                                FT_Fixed*  coords );\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTMM_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmodapi.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftmodapi.h                                                             */\n/*                                                                         */\n/*    FreeType modules public interface (specification).                   */\n/*                                                                         */\n/*  Copyright 1996-2003, 2006, 2008-2010, 2012, 2013 by                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTMODAPI_H__\n#define __FTMODAPI_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    module_management                                                  */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Module Management                                                  */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    How to add, upgrade, remove, and control modules from FreeType.    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The definitions below are used to manage modules within FreeType.  */\n  /*    Modules can be added, upgraded, and removed at runtime.            */\n  /*    Additionally, some module properties can be controlled also.       */\n  /*                                                                       */\n  /*    Here is a list of possible values of the `module_name' field in    */\n  /*    the @FT_Module_Class structure.                                    */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      autofitter                                                       */\n  /*      bdf                                                              */\n  /*      cff                                                              */\n  /*      gxvalid                                                          */\n  /*      otvalid                                                          */\n  /*      pcf                                                              */\n  /*      pfr                                                              */\n  /*      psaux                                                            */\n  /*      pshinter                                                         */\n  /*      psnames                                                          */\n  /*      raster1, raster5                                                 */\n  /*      sfnt                                                             */\n  /*      smooth, smooth-lcd, smooth-lcdv                                  */\n  /*      truetype                                                         */\n  /*      type1                                                            */\n  /*      type42                                                           */\n  /*      t1cid                                                            */\n  /*      winfonts                                                         */\n  /*    }                                                                  */\n  /*                                                                       */\n  /*    Note that the FreeType Cache sub-system is not a FreeType module.  */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* module bit flags */\n#define FT_MODULE_FONT_DRIVER         1  /* this module is a font driver  */\n#define FT_MODULE_RENDERER            2  /* this module is a renderer     */\n#define FT_MODULE_HINTER              4  /* this module is a glyph hinter */\n#define FT_MODULE_STYLER              8  /* this module is a styler       */\n\n#define FT_MODULE_DRIVER_SCALABLE     0x100   /* the driver supports      */\n                                              /* scalable fonts           */\n#define FT_MODULE_DRIVER_NO_OUTLINES  0x200   /* the driver does not      */\n                                              /* support vector outlines  */\n#define FT_MODULE_DRIVER_HAS_HINTER   0x400   /* the driver provides its  */\n                                              /* own hinter               */\n\n\n  /* deprecated values */\n#define ft_module_font_driver         FT_MODULE_FONT_DRIVER\n#define ft_module_renderer            FT_MODULE_RENDERER\n#define ft_module_hinter              FT_MODULE_HINTER\n#define ft_module_styler              FT_MODULE_STYLER\n\n#define ft_module_driver_scalable     FT_MODULE_DRIVER_SCALABLE\n#define ft_module_driver_no_outlines  FT_MODULE_DRIVER_NO_OUTLINES\n#define ft_module_driver_has_hinter   FT_MODULE_DRIVER_HAS_HINTER\n\n\n  typedef FT_Pointer  FT_Module_Interface;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Module_Constructor                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to initialize (not create) a new module object.    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    module :: The module to initialize.                                */\n  /*                                                                       */\n  typedef FT_Error\n  (*FT_Module_Constructor)( FT_Module  module );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Module_Destructor                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to finalize (not destroy) a given module object.   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    module :: The module to finalize.                                  */\n  /*                                                                       */\n  typedef void\n  (*FT_Module_Destructor)( FT_Module  module );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Module_Requester                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to query a given module for a specific interface.  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    module :: The module to be searched.                               */\n  /*                                                                       */\n  /*    name ::   The name of the interface in the module.                 */\n  /*                                                                       */\n  typedef FT_Module_Interface\n  (*FT_Module_Requester)( FT_Module    module,\n                          const char*  name );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Module_Class                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The module class descriptor.                                       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    module_flags    :: Bit flags describing the module.                */\n  /*                                                                       */\n  /*    module_size     :: The size of one module object/instance in       */\n  /*                       bytes.                                          */\n  /*                                                                       */\n  /*    module_name     :: The name of the module.                         */\n  /*                                                                       */\n  /*    module_version  :: The version, as a 16.16 fixed number            */\n  /*                       (major.minor).                                  */\n  /*                                                                       */\n  /*    module_requires :: The version of FreeType this module requires,   */\n  /*                       as a 16.16 fixed number (major.minor).  Starts  */\n  /*                       at version 2.0, i.e., 0x20000.                  */\n  /*                                                                       */\n  /*    module_init     :: The initializing function.                      */\n  /*                                                                       */\n  /*    module_done     :: The finalizing function.                        */\n  /*                                                                       */\n  /*    get_interface   :: The interface requesting function.              */\n  /*                                                                       */\n  typedef struct  FT_Module_Class_\n  {\n    FT_ULong               module_flags;\n    FT_Long                module_size;\n    const FT_String*       module_name;\n    FT_Fixed               module_version;\n    FT_Fixed               module_requires;\n\n    const void*            module_interface;\n\n    FT_Module_Constructor  module_init;\n    FT_Module_Destructor   module_done;\n    FT_Module_Requester    get_interface;\n\n  } FT_Module_Class;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Add_Module                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Add a new module to a given library instance.                      */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library :: A handle to the library object.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    clazz   :: A pointer to class descriptor for the module.           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    An error will be returned if a module already exists by that name, */\n  /*    or if the module requires a version of FreeType that is too great. */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Add_Module( FT_Library              library,\n                 const FT_Module_Class*  clazz );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Module                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Find a module by its name.                                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library     :: A handle to the library object.                     */\n  /*                                                                       */\n  /*    module_name :: The module's name (as an ASCII string).             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A module handle.  0~if none was found.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    FreeType's internal modules aren't documented very well, and you   */\n  /*    should look up the source code for details.                        */\n  /*                                                                       */\n  FT_EXPORT( FT_Module )\n  FT_Get_Module( FT_Library   library,\n                 const char*  module_name );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Remove_Module                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Remove a given module from a library instance.                     */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library :: A handle to a library object.                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    module  :: A handle to a module object.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The module object is destroyed by the function in case of success. */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Remove_Module( FT_Library  library,\n                    FT_Module   module );\n\n\n  /**********************************************************************\n   *\n   * @function:\n   *    FT_Property_Set\n   *\n   * @description:\n   *    Set a property for a given module.\n   *\n   * @input:\n   *    library ::\n   *       A handle to the library the module is part of.\n   *\n   *    module_name ::\n   *       The module name.\n   *\n   *    property_name ::\n   *       The property name.  Properties are described in the `Synopsis'\n   *       subsection of the module's documentation.\n   *\n   *       Note that only a few modules have properties.\n   *\n   *    value ::\n   *       A generic pointer to a variable or structure which gives the new\n   *       value of the property.  The exact definition of `value' is\n   *       dependent on the property; see the `Synopsis' subsection of the\n   *       module's documentation.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *    If `module_name' isn't a valid module name, or `property_name'\n   *    doesn't specify a valid property, or if `value' doesn't represent a\n   *    valid value for the given property, an error is returned.\n   *\n   *    The following example sets property `bar' (a simple integer) in\n   *    module `foo' to value~1.\n   *\n   *    {\n   *      FT_UInt  bar;\n   *\n   *\n   *      bar = 1;\n   *      FT_Property_Set( library, \"foo\", \"bar\", &bar );\n   *    }\n   *\n   *    Note that the FreeType Cache sub-system doesn't recognize module\n   *    property changes.  To avoid glyph lookup confusion within the cache\n   *    you should call @FTC_Manager_Reset to completely flush the cache if\n   *    a module property gets changed after @FTC_Manager_New has been\n   *    called.\n   *\n   *    It is not possible to set properties of the FreeType Cache\n   *    sub-system itself with FT_Property_Set; use @FTC_Property_Set\n   *    instead.\n   *\n   *  @since:\n   *    2.4.11\n   *\n   */\n  FT_EXPORT( FT_Error )\n  FT_Property_Set( FT_Library        library,\n                   const FT_String*  module_name,\n                   const FT_String*  property_name,\n                   const void*       value );\n\n\n  /**********************************************************************\n   *\n   * @function:\n   *    FT_Property_Get\n   *\n   * @description:\n   *    Get a module's property value.\n   *\n   * @input:\n   *    library ::\n   *       A handle to the library the module is part of.\n   *\n   *    module_name ::\n   *       The module name.\n   *\n   *    property_name ::\n   *       The property name.  Properties are described in the `Synopsis'\n   *       subsection of the module's documentation.\n   *\n   * @inout:\n   *    value ::\n   *       A generic pointer to a variable or structure which gives the\n   *       value of the property.  The exact definition of `value' is\n   *       dependent on the property; see the `Synopsis' subsection of the\n   *       module's documentation.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *    If `module_name' isn't a valid module name, or `property_name'\n   *    doesn't specify a valid property, or if `value' doesn't represent a\n   *    valid value for the given property, an error is returned.\n   *\n   *    The following example gets property `baz' (a range) in module `foo'.\n   *\n   *    {\n   *      typedef  range_\n   *      {\n   *        FT_Int32  min;\n   *        FT_Int32  max;\n   *\n   *      } range;\n   *\n   *      range  baz;\n   *\n   *\n   *      FT_Property_Get( library, \"foo\", \"baz\", &baz );\n   *    }\n   *\n   *    It is not possible to retrieve properties of the FreeType Cache\n   *    sub-system with FT_Property_Get; use @FTC_Property_Get instead.\n   *\n   *  @since:\n   *    2.4.11\n   *\n   */\n  FT_EXPORT( FT_Error )\n  FT_Property_Get( FT_Library        library,\n                   const FT_String*  module_name,\n                   const FT_String*  property_name,\n                   void*             value );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Reference_Library                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A counter gets initialized to~1 at the time an @FT_Library         */\n  /*    structure is created.  This function increments the counter.       */\n  /*    @FT_Done_Library then only destroys a library if the counter is~1, */\n  /*    otherwise it simply decrements the counter.                        */\n  /*                                                                       */\n  /*    This function helps in managing life-cycles of structures which    */\n  /*    reference @FT_Library objects.                                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle to a target library object.                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.4.2                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Reference_Library( FT_Library  library );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Library                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function is used to create a new FreeType library instance    */\n  /*    from a given memory object.  It is thus possible to use libraries  */\n  /*    with distinct memory allocators within the same program.           */\n  /*                                                                       */\n  /*    Normally, you would call this function (followed by a call to      */\n  /*    @FT_Add_Default_Modules or a series of calls to @FT_Add_Module)    */\n  /*    instead of @FT_Init_FreeType to initialize the FreeType library.   */\n  /*                                                                       */\n  /*    Don't use @FT_Done_FreeType but @FT_Done_Library to destroy a      */\n  /*    library instance.                                                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory   :: A handle to the original memory object.                */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    alibrary :: A pointer to handle of a new library object.           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    See the discussion of reference counters in the description of     */\n  /*    @FT_Reference_Library.                                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_New_Library( FT_Memory    memory,\n                  FT_Library  *alibrary );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Done_Library                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Discard a given library object.  This closes all drivers and       */\n  /*    discards all resource objects.                                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle to the target library.                         */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    See the discussion of reference counters in the description of     */\n  /*    @FT_Reference_Library.                                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Done_Library( FT_Library  library );\n\n/* */\n\n  typedef void\n  (*FT_DebugHook_Func)( void*  arg );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_Debug_Hook                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Set a debug hook function for debugging the interpreter of a font  */\n  /*    format.                                                            */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library    :: A handle to the library object.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    hook_index :: The index of the debug hook.  You should use the     */\n  /*                  values defined in `ftobjs.h', e.g.,                  */\n  /*                  `FT_DEBUG_HOOK_TRUETYPE'.                            */\n  /*                                                                       */\n  /*    debug_hook :: The function used to debug the interpreter.          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Currently, four debug hook slots are available, but only two (for  */\n  /*    the TrueType and the Type~1 interpreter) are defined.              */\n  /*                                                                       */\n  /*    Since the internal headers of FreeType are no longer installed,    */\n  /*    the symbol `FT_DEBUG_HOOK_TRUETYPE' isn't available publicly.      */\n  /*    This is a bug and will be fixed in a forthcoming release.          */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Set_Debug_Hook( FT_Library         library,\n                     FT_UInt            hook_index,\n                     FT_DebugHook_Func  debug_hook );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Add_Default_Modules                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Add the set of default drivers to a given library object.          */\n  /*    This is only useful when you create a library object with          */\n  /*    @FT_New_Library (usually to plug a custom memory manager).         */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library :: A handle to a new library object.                       */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Add_Default_Modules( FT_Library  library );\n\n\n\n  /**************************************************************************\n   *\n   * @section:\n   *   truetype_engine\n   *\n   * @title:\n   *   The TrueType Engine\n   *\n   * @abstract:\n   *   TrueType bytecode support.\n   *\n   * @description:\n   *   This section contains a function used to query the level of TrueType\n   *   bytecode support compiled in this version of the library.\n   *\n   */\n\n\n  /**************************************************************************\n   *\n   *  @enum:\n   *     FT_TrueTypeEngineType\n   *\n   *  @description:\n   *     A list of values describing which kind of TrueType bytecode\n   *     engine is implemented in a given FT_Library instance.  It is used\n   *     by the @FT_Get_TrueType_Engine_Type function.\n   *\n   *  @values:\n   *     FT_TRUETYPE_ENGINE_TYPE_NONE ::\n   *       The library doesn't implement any kind of bytecode interpreter.\n   *\n   *     FT_TRUETYPE_ENGINE_TYPE_UNPATENTED ::\n   *       The library implements a bytecode interpreter that doesn't\n   *       support the patented operations of the TrueType virtual machine.\n   *\n   *       Its main use is to load certain Asian fonts which position and\n   *       scale glyph components with bytecode instructions.  It produces\n   *       bad output for most other fonts.\n   *\n   *     FT_TRUETYPE_ENGINE_TYPE_PATENTED ::\n   *       The library implements a bytecode interpreter that covers\n   *       the full instruction set of the TrueType virtual machine (this\n   *       was governed by patents until May 2010, hence the name).\n   *\n   *  @since:\n   *     2.2\n   *\n   */\n  typedef enum  FT_TrueTypeEngineType_\n  {\n    FT_TRUETYPE_ENGINE_TYPE_NONE = 0,\n    FT_TRUETYPE_ENGINE_TYPE_UNPATENTED,\n    FT_TRUETYPE_ENGINE_TYPE_PATENTED\n\n  } FT_TrueTypeEngineType;\n\n\n  /**************************************************************************\n   *\n   *  @func:\n   *     FT_Get_TrueType_Engine_Type\n   *\n   *  @description:\n   *     Return an @FT_TrueTypeEngineType value to indicate which level of\n   *     the TrueType virtual machine a given library instance supports.\n   *\n   *  @input:\n   *     library ::\n   *       A library instance.\n   *\n   *  @return:\n   *     A value indicating which level is supported.\n   *\n   *  @since:\n   *     2.2\n   *\n   */\n  FT_EXPORT( FT_TrueTypeEngineType )\n  FT_Get_TrueType_Engine_Type( FT_Library  library );\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTMODAPI_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmoderr.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftmoderr.h                                                             */\n/*                                                                         */\n/*    FreeType module error offsets (specification).                       */\n/*                                                                         */\n/*  Copyright 2001-2005, 2010, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the FreeType module error codes.          */\n  /*                                                                       */\n  /* If the macro FT_CONFIG_OPTION_USE_MODULE_ERRORS in `ftoption.h' is    */\n  /* set, the lower byte of an error value identifies the error code as    */\n  /* usual.  In addition, the higher byte identifies the module.  For      */\n  /* example, the error `FT_Err_Invalid_File_Format' has value 0x0003, the */\n  /* error `TT_Err_Invalid_File_Format' has value 0x1303, the error        */\n  /* `T1_Err_Invalid_File_Format' has value 0x1403, etc.                   */\n  /*                                                                       */\n  /* Note that `FT_Err_Ok', `TT_Err_Ok', etc. are always equal to zero,    */\n  /* including the high byte.                                              */\n  /*                                                                       */\n  /* If FT_CONFIG_OPTION_USE_MODULE_ERRORS isn't set, the higher byte of   */\n  /* an error value is set to zero.                                        */\n  /*                                                                       */\n  /* To hide the various `XXX_Err_' prefixes in the source code, FreeType  */\n  /* provides some macros in `fttypes.h'.                                  */\n  /*                                                                       */\n  /*   FT_ERR( err )                                                       */\n  /*     Add current error module prefix (as defined with the              */\n  /*     `FT_ERR_PREFIX' macro) to `err'.  For example, in the BDF module  */\n  /*     the line                                                          */\n  /*                                                                       */\n  /*       error = FT_ERR( Invalid_Outline );                              */\n  /*                                                                       */\n  /*     expands to                                                        */\n  /*                                                                       */\n  /*       error = BDF_Err_Invalid_Outline;                                */\n  /*                                                                       */\n  /*     For simplicity, you can always use `FT_Err_Ok' directly instead   */\n  /*     of `FT_ERR( Ok )'.                                                */\n  /*                                                                       */\n  /*   FT_ERR_EQ( errcode, err )                                           */\n  /*   FT_ERR_NEQ( errcode, err )                                          */\n  /*     Compare error code `errcode' with the error `err' for equality    */\n  /*     and inequality, respectively.  Example:                           */\n  /*                                                                       */\n  /*       if ( FT_ERR_EQ( error, Invalid_Outline ) )                      */\n  /*         ...                                                           */\n  /*                                                                       */\n  /*     Using this macro you don't have to think about error prefixes.    */\n  /*     Of course, if module errors are not active, the above example is  */\n  /*     the same as                                                       */\n  /*                                                                       */\n  /*       if ( error == FT_Err_Invalid_Outline )                          */\n  /*         ...                                                           */\n  /*                                                                       */\n  /*   FT_ERROR_BASE( errcode )                                            */\n  /*   FT_ERROR_MODULE( errcode )                                          */\n  /*     Get base error and module error code, respectively.               */\n  /*                                                                       */\n  /*                                                                       */\n  /* It can also be used to create a module error message table easily     */\n  /* with something like                                                   */\n  /*                                                                       */\n  /*   {                                                                   */\n  /*     #undef __FTMODERR_H__                                             */\n  /*     #define FT_MODERRDEF( e, v, s )  { FT_Mod_Err_ ## e, s },         */\n  /*     #define FT_MODERR_START_LIST     {                                */\n  /*     #define FT_MODERR_END_LIST       { 0, 0 } };                      */\n  /*                                                                       */\n  /*     const struct                                                      */\n  /*     {                                                                 */\n  /*       int          mod_err_offset;                                    */\n  /*       const char*  mod_err_msg                                        */\n  /*     } ft_mod_errors[] =                                               */\n  /*                                                                       */\n  /*     #include \"ftmoderr.h\"                                       */\n  /*   }                                                                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTMODERR_H__\n#define __FTMODERR_H__\n\n\n  /*******************************************************************/\n  /*******************************************************************/\n  /*****                                                         *****/\n  /*****                       SETUP MACROS                      *****/\n  /*****                                                         *****/\n  /*******************************************************************/\n  /*******************************************************************/\n\n\n#undef  FT_NEED_EXTERN_C\n\n#ifndef FT_MODERRDEF\n\n#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS\n#define FT_MODERRDEF( e, v, s )  FT_Mod_Err_ ## e = v,\n#else\n#define FT_MODERRDEF( e, v, s )  FT_Mod_Err_ ## e = 0,\n#endif\n\n#define FT_MODERR_START_LIST  enum {\n#define FT_MODERR_END_LIST    FT_Mod_Err_Max };\n\n#ifdef __cplusplus\n#define FT_NEED_EXTERN_C\n  extern \"C\" {\n#endif\n\n#endif /* !FT_MODERRDEF */\n\n\n  /*******************************************************************/\n  /*******************************************************************/\n  /*****                                                         *****/\n  /*****               LIST MODULE ERROR BASES                   *****/\n  /*****                                                         *****/\n  /*******************************************************************/\n  /*******************************************************************/\n\n\n#ifdef FT_MODERR_START_LIST\n  FT_MODERR_START_LIST\n#endif\n\n\n  FT_MODERRDEF( Base,      0x000, \"base module\" )\n  FT_MODERRDEF( Autofit,   0x100, \"autofitter module\" )\n  FT_MODERRDEF( BDF,       0x200, \"BDF module\" )\n  FT_MODERRDEF( Bzip2,     0x300, \"Bzip2 module\" )\n  FT_MODERRDEF( Cache,     0x400, \"cache module\" )\n  FT_MODERRDEF( CFF,       0x500, \"CFF module\" )\n  FT_MODERRDEF( CID,       0x600, \"CID module\" )\n  FT_MODERRDEF( Gzip,      0x700, \"Gzip module\" )\n  FT_MODERRDEF( LZW,       0x800, \"LZW module\" )\n  FT_MODERRDEF( OTvalid,   0x900, \"OpenType validation module\" )\n  FT_MODERRDEF( PCF,       0xA00, \"PCF module\" )\n  FT_MODERRDEF( PFR,       0xB00, \"PFR module\" )\n  FT_MODERRDEF( PSaux,     0xC00, \"PS auxiliary module\" )\n  FT_MODERRDEF( PShinter,  0xD00, \"PS hinter module\" )\n  FT_MODERRDEF( PSnames,   0xE00, \"PS names module\" )\n  FT_MODERRDEF( Raster,    0xF00, \"raster module\" )\n  FT_MODERRDEF( SFNT,     0x1000, \"SFNT module\" )\n  FT_MODERRDEF( Smooth,   0x1100, \"smooth raster module\" )\n  FT_MODERRDEF( TrueType, 0x1200, \"TrueType module\" )\n  FT_MODERRDEF( Type1,    0x1300, \"Type 1 module\" )\n  FT_MODERRDEF( Type42,   0x1400, \"Type 42 module\" )\n  FT_MODERRDEF( Winfonts, 0x1500, \"Windows FON/FNT module\" )\n  FT_MODERRDEF( GXvalid,  0x1600, \"GX validation module\" )\n\n\n#ifdef FT_MODERR_END_LIST\n  FT_MODERR_END_LIST\n#endif\n\n\n  /*******************************************************************/\n  /*******************************************************************/\n  /*****                                                         *****/\n  /*****                      CLEANUP                            *****/\n  /*****                                                         *****/\n  /*******************************************************************/\n  /*******************************************************************/\n\n\n#ifdef FT_NEED_EXTERN_C\n  }\n#endif\n\n#undef FT_MODERR_START_LIST\n#undef FT_MODERR_END_LIST\n#undef FT_MODERRDEF\n#undef FT_NEED_EXTERN_C\n\n\n#endif /* __FTMODERR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftotval.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftotval.h                                                              */\n/*                                                                         */\n/*    FreeType API for validating OpenType tables (specification).         */\n/*                                                                         */\n/*  Copyright 2004, 2005, 2006, 2007 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n/***************************************************************************/\n/*                                                                         */\n/*                                                                         */\n/* Warning: This module might be moved to a different library in the       */\n/*          future to avoid a tight dependency between FreeType and the    */\n/*          OpenType specification.                                        */\n/*                                                                         */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTOTVAL_H__\n#define __FTOTVAL_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    ot_validation                                                      */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    OpenType Validation                                                */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    An API to validate OpenType tables.                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of functions to validate     */\n  /*    some OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH).         */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n /**********************************************************************\n  *\n  * @enum:\n  *    FT_VALIDATE_OTXXX\n  *\n  * @description:\n  *    A list of bit-field constants used with @FT_OpenType_Validate to\n  *    indicate which OpenType tables should be validated.\n  *\n  * @values:\n  *    FT_VALIDATE_BASE ::\n  *      Validate BASE table.\n  *\n  *    FT_VALIDATE_GDEF ::\n  *      Validate GDEF table.\n  *\n  *    FT_VALIDATE_GPOS ::\n  *      Validate GPOS table.\n  *\n  *    FT_VALIDATE_GSUB ::\n  *      Validate GSUB table.\n  *\n  *    FT_VALIDATE_JSTF ::\n  *      Validate JSTF table.\n  *\n  *    FT_VALIDATE_MATH ::\n  *      Validate MATH table.\n  *\n  *    FT_VALIDATE_OT ::\n  *      Validate all OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH).\n  *\n  */\n#define FT_VALIDATE_BASE  0x0100\n#define FT_VALIDATE_GDEF  0x0200\n#define FT_VALIDATE_GPOS  0x0400\n#define FT_VALIDATE_GSUB  0x0800\n#define FT_VALIDATE_JSTF  0x1000\n#define FT_VALIDATE_MATH  0x2000\n\n#define FT_VALIDATE_OT  FT_VALIDATE_BASE | \\\n                        FT_VALIDATE_GDEF | \\\n                        FT_VALIDATE_GPOS | \\\n                        FT_VALIDATE_GSUB | \\\n                        FT_VALIDATE_JSTF | \\\n                        FT_VALIDATE_MATH\n\n  /* */\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_OpenType_Validate\n  *\n  * @description:\n  *    Validate various OpenType tables to assure that all offsets and\n  *    indices are valid.  The idea is that a higher-level library which\n  *    actually does the text layout can access those tables without\n  *    error checking (which can be quite time consuming).\n  *\n  * @input:\n  *    face ::\n  *       A handle to the input face.\n  *\n  *    validation_flags ::\n  *       A bit field which specifies the tables to be validated.  See\n  *       @FT_VALIDATE_OTXXX for possible values.\n  *\n  * @output:\n  *    BASE_table ::\n  *       A pointer to the BASE table.\n  *\n  *    GDEF_table ::\n  *       A pointer to the GDEF table.\n  *\n  *    GPOS_table ::\n  *       A pointer to the GPOS table.\n  *\n  *    GSUB_table ::\n  *       A pointer to the GSUB table.\n  *\n  *    JSTF_table ::\n  *       A pointer to the JSTF table.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   This function only works with OpenType fonts, returning an error\n  *   otherwise.\n  *\n  *   After use, the application should deallocate the five tables with\n  *   @FT_OpenType_Free.  A NULL value indicates that the table either\n  *   doesn't exist in the font, or the application hasn't asked for\n  *   validation.\n  */\n  FT_EXPORT( FT_Error )\n  FT_OpenType_Validate( FT_Face    face,\n                        FT_UInt    validation_flags,\n                        FT_Bytes  *BASE_table,\n                        FT_Bytes  *GDEF_table,\n                        FT_Bytes  *GPOS_table,\n                        FT_Bytes  *GSUB_table,\n                        FT_Bytes  *JSTF_table );\n\n  /* */\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_OpenType_Free\n  *\n  * @description:\n  *    Free the buffer allocated by OpenType validator.\n  *\n  * @input:\n  *    face ::\n  *       A handle to the input face.\n  *\n  *    table ::\n  *       The pointer to the buffer that is allocated by\n  *       @FT_OpenType_Validate.\n  *\n  * @note:\n  *   This function must be used to free the buffer allocated by\n  *   @FT_OpenType_Validate only.\n  */\n  FT_EXPORT( void )\n  FT_OpenType_Free( FT_Face   face,\n                    FT_Bytes  table );\n\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTOTVAL_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftoutln.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftoutln.h                                                              */\n/*                                                                         */\n/*    Support for the FT_Outline type used to store glyph shapes of        */\n/*    most scalable font formats (specification).                          */\n/*                                                                         */\n/*  Copyright 1996-2003, 2005-2012 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTOUTLN_H__\n#define __FTOUTLN_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    outline_processing                                                 */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Outline Processing                                                 */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Functions to create, transform, and render vectorial glyph images. */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains routines used to create and destroy scalable */\n  /*    glyph images known as `outlines'.  These can also be measured,     */\n  /*    transformed, and converted into bitmaps and pixmaps.               */\n  /*                                                                       */\n  /* <Order>                                                               */\n  /*    FT_Outline                                                         */\n  /*    FT_OUTLINE_FLAGS                                                   */\n  /*    FT_Outline_New                                                     */\n  /*    FT_Outline_Done                                                    */\n  /*    FT_Outline_Copy                                                    */\n  /*    FT_Outline_Translate                                               */\n  /*    FT_Outline_Transform                                               */\n  /*    FT_Outline_Embolden                                                */\n  /*    FT_Outline_EmboldenXY                                              */\n  /*    FT_Outline_Reverse                                                 */\n  /*    FT_Outline_Check                                                   */\n  /*                                                                       */\n  /*    FT_Outline_Get_CBox                                                */\n  /*    FT_Outline_Get_BBox                                                */\n  /*                                                                       */\n  /*    FT_Outline_Get_Bitmap                                              */\n  /*    FT_Outline_Render                                                  */\n  /*                                                                       */\n  /*    FT_Outline_Decompose                                               */\n  /*    FT_Outline_Funcs                                                   */\n  /*    FT_Outline_MoveTo_Func                                             */\n  /*    FT_Outline_LineTo_Func                                             */\n  /*    FT_Outline_ConicTo_Func                                            */\n  /*    FT_Outline_CubicTo_Func                                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Decompose                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Walk over an outline's structure to decompose it into individual   */\n  /*    segments and Bézier arcs.  This function also emits `move to'      */\n  /*    operations to indicate the start of new contours in the outline.   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    outline        :: A pointer to the source target.                  */\n  /*                                                                       */\n  /*    func_interface :: A table of `emitters', i.e., function pointers   */\n  /*                      called during decomposition to indicate path     */\n  /*                      operations.                                      */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    user           :: A typeless pointer which is passed to each       */\n  /*                      emitter during the decomposition.  It can be     */\n  /*                      used to store the state during the               */\n  /*                      decomposition.                                   */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_Decompose( FT_Outline*              outline,\n                        const FT_Outline_Funcs*  func_interface,\n                        void*                    user );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_New                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a new outline of a given size.                              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library     :: A handle to the library object from where the       */\n  /*                   outline is allocated.  Note however that the new    */\n  /*                   outline will *not* necessarily be *freed*, when     */\n  /*                   destroying the library, by @FT_Done_FreeType.       */\n  /*                                                                       */\n  /*    numPoints   :: The maximum number of points within the outline.    */\n  /*                   Must be smaller than or equal to 0xFFFF (65535).    */\n  /*                                                                       */\n  /*    numContours :: The maximum number of contours within the outline.  */\n  /*                   This value must be in the range 0 to `numPoints'.   */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    anoutline   :: A handle to the new outline.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The reason why this function takes a `library' parameter is simply */\n  /*    to use the library's memory allocator.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_New( FT_Library   library,\n                  FT_UInt      numPoints,\n                  FT_Int       numContours,\n                  FT_Outline  *anoutline );\n\n\n  FT_EXPORT( FT_Error )\n  FT_Outline_New_Internal( FT_Memory    memory,\n                           FT_UInt      numPoints,\n                           FT_Int       numContours,\n                           FT_Outline  *anoutline );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Done                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Destroy an outline created with @FT_Outline_New.                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle of the library object used to allocate the     */\n  /*               outline.                                                */\n  /*                                                                       */\n  /*    outline :: A pointer to the outline object to be discarded.        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If the outline's `owner' field is not set, only the outline        */\n  /*    descriptor will be released.                                       */\n  /*                                                                       */\n  /*    The reason why this function takes an `library' parameter is       */\n  /*    simply to use ft_mem_free().                                       */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_Done( FT_Library   library,\n                   FT_Outline*  outline );\n\n\n  FT_EXPORT( FT_Error )\n  FT_Outline_Done_Internal( FT_Memory    memory,\n                            FT_Outline*  outline );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Check                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Check the contents of an outline descriptor.                       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    outline :: A handle to a source outline.                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_Check( FT_Outline*  outline );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Get_CBox                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return an outline's `control box'.  The control box encloses all   */\n  /*    the outline's points, including Bézier control points.  Though it  */\n  /*    coincides with the exact bounding box for most glyphs, it can be   */\n  /*    slightly larger in some situations (like when rotating an outline  */\n  /*    which contains Bézier outside arcs).                               */\n  /*                                                                       */\n  /*    Computing the control box is very fast, while getting the bounding */\n  /*    box can take much more time as it needs to walk over all segments  */\n  /*    and arcs in the outline.  To get the latter, you can use the       */\n  /*    `ftbbox' component which is dedicated to this single task.         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    outline :: A pointer to the source outline descriptor.             */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    acbox   :: The outline's control box.                              */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    See @FT_Glyph_Get_CBox for a discussion of tricky fonts.           */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Outline_Get_CBox( const FT_Outline*  outline,\n                       FT_BBox           *acbox );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Translate                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Apply a simple translation to the points of an outline.            */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    outline :: A pointer to the target outline descriptor.             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    xOffset :: The horizontal offset.                                  */\n  /*                                                                       */\n  /*    yOffset :: The vertical offset.                                    */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Outline_Translate( const FT_Outline*  outline,\n                        FT_Pos             xOffset,\n                        FT_Pos             yOffset );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Copy                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Copy an outline into another one.  Both objects must have the      */\n  /*    same sizes (number of points & number of contours) when this       */\n  /*    function is called.                                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    source :: A handle to the source outline.                          */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    target :: A handle to the target outline.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_Copy( const FT_Outline*  source,\n                   FT_Outline        *target );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Transform                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Apply a simple 2x2 matrix to all of an outline's points.  Useful   */\n  /*    for applying rotations, slanting, flipping, etc.                   */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    outline :: A pointer to the target outline descriptor.             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    matrix  :: A pointer to the transformation matrix.                 */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You can use @FT_Outline_Translate if you need to translate the     */\n  /*    outline's points.                                                  */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Outline_Transform( const FT_Outline*  outline,\n                        const FT_Matrix*   matrix );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Embolden                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Embolden an outline.  The new outline will be at most 4~times      */\n  /*    `strength' pixels wider and higher.  You may think of the left and */\n  /*    bottom borders as unchanged.                                       */\n  /*                                                                       */\n  /*    Negative `strength' values to reduce the outline thickness are     */\n  /*    possible also.                                                     */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    outline  :: A handle to the target outline.                        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    strength :: How strong the glyph is emboldened.  Expressed in      */\n  /*                26.6 pixel format.                                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The used algorithm to increase or decrease the thickness of the    */\n  /*    glyph doesn't change the number of points; this means that certain */\n  /*    situations like acute angles or intersections are sometimes        */\n  /*    handled incorrectly.                                               */\n  /*                                                                       */\n  /*    If you need `better' metrics values you should call                */\n  /*    @FT_Outline_Get_CBox or @FT_Outline_Get_BBox.                      */\n  /*                                                                       */\n  /*    Example call:                                                      */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      FT_Load_Glyph( face, index, FT_LOAD_DEFAULT );                   */\n  /*      if ( face->slot->format == FT_GLYPH_FORMAT_OUTLINE )             */\n  /*        FT_Outline_Embolden( &face->slot->outline, strength );         */\n  /*    }                                                                  */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_Embolden( FT_Outline*  outline,\n                       FT_Pos       strength );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_EmboldenXY                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Embolden an outline.  The new outline will be `xstrength' pixels   */\n  /*    wider and `ystrength' pixels higher.  Otherwise, it is similar to  */\n  /*    @FT_Outline_Embolden, which uses the same strength in both         */\n  /*    directions.                                                        */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_EmboldenXY( FT_Outline*  outline,\n                         FT_Pos       xstrength,\n                         FT_Pos       ystrength );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Reverse                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Reverse the drawing direction of an outline.  This is used to      */\n  /*    ensure consistent fill conventions for mirrored glyphs.            */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    outline :: A pointer to the target outline descriptor.             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function toggles the bit flag @FT_OUTLINE_REVERSE_FILL in     */\n  /*    the outline's `flags' field.                                       */\n  /*                                                                       */\n  /*    It shouldn't be used by a normal client application, unless it     */\n  /*    knows what it is doing.                                            */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Outline_Reverse( FT_Outline*  outline );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Get_Bitmap                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Render an outline within a bitmap.  The outline's image is simply  */\n  /*    OR-ed to the target bitmap.                                        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle to a FreeType library object.                  */\n  /*                                                                       */\n  /*    outline :: A pointer to the source outline descriptor.             */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    abitmap :: A pointer to the target bitmap descriptor.              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function does NOT CREATE the bitmap, it only renders an       */\n  /*    outline image within the one you pass to it!  Consequently, the    */\n  /*    various fields in `abitmap' should be set accordingly.             */\n  /*                                                                       */\n  /*    It will use the raster corresponding to the default glyph format.  */\n  /*                                                                       */\n  /*    The value of the `num_grays' field in `abitmap' is ignored.  If    */\n  /*    you select the gray-level rasterizer, and you want less than 256   */\n  /*    gray levels, you have to use @FT_Outline_Render directly.          */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_Get_Bitmap( FT_Library        library,\n                         FT_Outline*       outline,\n                         const FT_Bitmap  *abitmap );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Render                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Render an outline within a bitmap using the current scan-convert.  */\n  /*    This function uses an @FT_Raster_Params structure as an argument,  */\n  /*    allowing advanced features like direct composition, translucency,  */\n  /*    etc.                                                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle to a FreeType library object.                  */\n  /*                                                                       */\n  /*    outline :: A pointer to the source outline descriptor.             */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    params  :: A pointer to an @FT_Raster_Params structure used to     */\n  /*               describe the rendering operation.                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You should know what you are doing and how @FT_Raster_Params works */\n  /*    to use this function.                                              */\n  /*                                                                       */\n  /*    The field `params.source' will be set to `outline' before the scan */\n  /*    converter is called, which means that the value you give to it is  */\n  /*    actually ignored.                                                  */\n  /*                                                                       */\n  /*    The gray-level rasterizer always uses 256 gray levels.  If you     */\n  /*    want less gray levels, you have to provide your own span callback. */\n  /*    See the @FT_RASTER_FLAG_DIRECT value of the `flags' field in the   */\n  /*    @FT_Raster_Params structure for more details.                      */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_Render( FT_Library         library,\n                     FT_Outline*        outline,\n                     FT_Raster_Params*  params );\n\n\n /**************************************************************************\n  *\n  * @enum:\n  *   FT_Orientation\n  *\n  * @description:\n  *   A list of values used to describe an outline's contour orientation.\n  *\n  *   The TrueType and PostScript specifications use different conventions\n  *   to determine whether outline contours should be filled or unfilled.\n  *\n  * @values:\n  *   FT_ORIENTATION_TRUETYPE ::\n  *     According to the TrueType specification, clockwise contours must\n  *     be filled, and counter-clockwise ones must be unfilled.\n  *\n  *   FT_ORIENTATION_POSTSCRIPT ::\n  *     According to the PostScript specification, counter-clockwise contours\n  *     must be filled, and clockwise ones must be unfilled.\n  *\n  *   FT_ORIENTATION_FILL_RIGHT ::\n  *     This is identical to @FT_ORIENTATION_TRUETYPE, but is used to\n  *     remember that in TrueType, everything that is to the right of\n  *     the drawing direction of a contour must be filled.\n  *\n  *   FT_ORIENTATION_FILL_LEFT ::\n  *     This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to\n  *     remember that in PostScript, everything that is to the left of\n  *     the drawing direction of a contour must be filled.\n  *\n  *   FT_ORIENTATION_NONE ::\n  *     The orientation cannot be determined.  That is, different parts of\n  *     the glyph have different orientation.\n  *\n  */\n  typedef enum  FT_Orientation_\n  {\n    FT_ORIENTATION_TRUETYPE   = 0,\n    FT_ORIENTATION_POSTSCRIPT = 1,\n    FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE,\n    FT_ORIENTATION_FILL_LEFT  = FT_ORIENTATION_POSTSCRIPT,\n    FT_ORIENTATION_NONE\n\n  } FT_Orientation;\n\n\n /**************************************************************************\n  *\n  * @function:\n  *   FT_Outline_Get_Orientation\n  *\n  * @description:\n  *   This function analyzes a glyph outline and tries to compute its\n  *   fill orientation (see @FT_Orientation).  This is done by computing\n  *   the direction of each global horizontal and/or vertical extrema\n  *   within the outline.\n  *\n  *   Note that this will return @FT_ORIENTATION_TRUETYPE for empty\n  *   outlines.\n  *\n  * @input:\n  *   outline ::\n  *     A handle to the source outline.\n  *\n  * @return:\n  *   The orientation.\n  *\n  */\n  FT_EXPORT( FT_Orientation )\n  FT_Outline_Get_Orientation( FT_Outline*  outline );\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTOUTLN_H__ */\n\n\n/* END */\n\n\n/* Local Variables: */\n/* coding: utf-8    */\n/* End:             */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftpfr.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftpfr.h                                                                */\n/*                                                                         */\n/*    FreeType API for accessing PFR-specific data (specification only).   */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2004, 2006, 2008, 2009 by                        */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTPFR_H__\n#define __FTPFR_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    pfr_fonts                                                          */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    PFR Fonts                                                          */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    PFR/TrueDoc specific API.                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of PFR-specific functions.   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_Get_PFR_Metrics\n  *\n  * @description:\n  *    Return the outline and metrics resolutions of a given PFR face.\n  *\n  * @input:\n  *    face :: Handle to the input face.  It can be a non-PFR face.\n  *\n  * @output:\n  *    aoutline_resolution ::\n  *      Outline resolution.  This is equivalent to `face->units_per_EM'\n  *      for non-PFR fonts.  Optional (parameter can be NULL).\n  *\n  *    ametrics_resolution ::\n  *      Metrics resolution.  This is equivalent to `outline_resolution'\n  *      for non-PFR fonts.  Optional (parameter can be NULL).\n  *\n  *    ametrics_x_scale ::\n  *      A 16.16 fixed-point number used to scale distance expressed\n  *      in metrics units to device sub-pixels.  This is equivalent to\n  *      `face->size->x_scale', but for metrics only.  Optional (parameter\n  *      can be NULL).\n  *\n  *    ametrics_y_scale ::\n  *      Same as `ametrics_x_scale' but for the vertical direction.\n  *      optional (parameter can be NULL).\n  *\n  * @return:\n  *    FreeType error code.  0~means success.\n  *\n  * @note:\n  *   If the input face is not a PFR, this function will return an error.\n  *   However, in all cases, it will return valid values.\n  */\n  FT_EXPORT( FT_Error )\n  FT_Get_PFR_Metrics( FT_Face    face,\n                      FT_UInt   *aoutline_resolution,\n                      FT_UInt   *ametrics_resolution,\n                      FT_Fixed  *ametrics_x_scale,\n                      FT_Fixed  *ametrics_y_scale );\n\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_Get_PFR_Kerning\n  *\n  * @description:\n  *    Return the kerning pair corresponding to two glyphs in a PFR face.\n  *    The distance is expressed in metrics units, unlike the result of\n  *    @FT_Get_Kerning.\n  *\n  * @input:\n  *    face  :: A handle to the input face.\n  *\n  *    left  :: Index of the left glyph.\n  *\n  *    right :: Index of the right glyph.\n  *\n  * @output:\n  *    avector :: A kerning vector.\n  *\n  * @return:\n  *    FreeType error code.  0~means success.\n  *\n  * @note:\n  *    This function always return distances in original PFR metrics\n  *    units.  This is unlike @FT_Get_Kerning with the @FT_KERNING_UNSCALED\n  *    mode, which always returns distances converted to outline units.\n  *\n  *    You can use the value of the `x_scale' and `y_scale' parameters\n  *    returned by @FT_Get_PFR_Metrics to scale these to device sub-pixels.\n  */\n  FT_EXPORT( FT_Error )\n  FT_Get_PFR_Kerning( FT_Face     face,\n                      FT_UInt     left,\n                      FT_UInt     right,\n                      FT_Vector  *avector );\n\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_Get_PFR_Advance\n  *\n  * @description:\n  *    Return a given glyph advance, expressed in original metrics units,\n  *    from a PFR font.\n  *\n  * @input:\n  *    face   :: A handle to the input face.\n  *\n  *    gindex :: The glyph index.\n  *\n  * @output:\n  *    aadvance :: The glyph advance in metrics units.\n  *\n  * @return:\n  *    FreeType error code.  0~means success.\n  *\n  * @note:\n  *    You can use the `x_scale' or `y_scale' results of @FT_Get_PFR_Metrics\n  *    to convert the advance to device sub-pixels (i.e., 1/64th of pixels).\n  */\n  FT_EXPORT( FT_Error )\n  FT_Get_PFR_Advance( FT_Face   face,\n                      FT_UInt   gindex,\n                      FT_Pos   *aadvance );\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTPFR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftrender.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftrender.h                                                             */\n/*                                                                         */\n/*    FreeType renderer modules public interface (specification).          */\n/*                                                                         */\n/*  Copyright 1996-2001, 2005, 2006, 2010 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTRENDER_H__\n#define __FTRENDER_H__\n\n\n#include \"../ft2build.h\"\n#include \"ftmodapi.h\"\n#include \"ftglyph.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    module_management                                                  */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* create a new glyph object */\n  typedef FT_Error\n  (*FT_Glyph_InitFunc)( FT_Glyph      glyph,\n                        FT_GlyphSlot  slot );\n\n  /* destroys a given glyph object */\n  typedef void\n  (*FT_Glyph_DoneFunc)( FT_Glyph  glyph );\n\n  typedef void\n  (*FT_Glyph_TransformFunc)( FT_Glyph          glyph,\n                             const FT_Matrix*  matrix,\n                             const FT_Vector*  delta );\n\n  typedef void\n  (*FT_Glyph_GetBBoxFunc)( FT_Glyph  glyph,\n                           FT_BBox*  abbox );\n\n  typedef FT_Error\n  (*FT_Glyph_CopyFunc)( FT_Glyph   source,\n                        FT_Glyph   target );\n\n  typedef FT_Error\n  (*FT_Glyph_PrepareFunc)( FT_Glyph      glyph,\n                           FT_GlyphSlot  slot );\n\n/* deprecated */\n#define FT_Glyph_Init_Func       FT_Glyph_InitFunc\n#define FT_Glyph_Done_Func       FT_Glyph_DoneFunc\n#define FT_Glyph_Transform_Func  FT_Glyph_TransformFunc\n#define FT_Glyph_BBox_Func       FT_Glyph_GetBBoxFunc\n#define FT_Glyph_Copy_Func       FT_Glyph_CopyFunc\n#define FT_Glyph_Prepare_Func    FT_Glyph_PrepareFunc\n\n\n  struct  FT_Glyph_Class_\n  {\n    FT_Long                 glyph_size;\n    FT_Glyph_Format         glyph_format;\n    FT_Glyph_InitFunc       glyph_init;\n    FT_Glyph_DoneFunc       glyph_done;\n    FT_Glyph_CopyFunc       glyph_copy;\n    FT_Glyph_TransformFunc  glyph_transform;\n    FT_Glyph_GetBBoxFunc    glyph_bbox;\n    FT_Glyph_PrepareFunc    glyph_prepare;\n  };\n\n\n  typedef FT_Error\n  (*FT_Renderer_RenderFunc)( FT_Renderer       renderer,\n                             FT_GlyphSlot      slot,\n                             FT_UInt           mode,\n                             const FT_Vector*  origin );\n\n  typedef FT_Error\n  (*FT_Renderer_TransformFunc)( FT_Renderer       renderer,\n                                FT_GlyphSlot      slot,\n                                const FT_Matrix*  matrix,\n                                const FT_Vector*  delta );\n\n\n  typedef void\n  (*FT_Renderer_GetCBoxFunc)( FT_Renderer   renderer,\n                              FT_GlyphSlot  slot,\n                              FT_BBox*      cbox );\n\n\n  typedef FT_Error\n  (*FT_Renderer_SetModeFunc)( FT_Renderer  renderer,\n                              FT_ULong     mode_tag,\n                              FT_Pointer   mode_ptr );\n\n/* deprecated identifiers */\n#define FTRenderer_render  FT_Renderer_RenderFunc\n#define FTRenderer_transform  FT_Renderer_TransformFunc\n#define FTRenderer_getCBox  FT_Renderer_GetCBoxFunc\n#define FTRenderer_setMode  FT_Renderer_SetModeFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Renderer_Class                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The renderer module class descriptor.                              */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    root            :: The root @FT_Module_Class fields.               */\n  /*                                                                       */\n  /*    glyph_format    :: The glyph image format this renderer handles.   */\n  /*                                                                       */\n  /*    render_glyph    :: A method used to render the image that is in a  */\n  /*                       given glyph slot into a bitmap.                 */\n  /*                                                                       */\n  /*    transform_glyph :: A method used to transform the image that is in */\n  /*                       a given glyph slot.                             */\n  /*                                                                       */\n  /*    get_glyph_cbox  :: A method used to access the glyph's cbox.       */\n  /*                                                                       */\n  /*    set_mode        :: A method used to pass additional parameters.    */\n  /*                                                                       */\n  /*    raster_class    :: For @FT_GLYPH_FORMAT_OUTLINE renderers only.    */\n  /*                       This is a pointer to its raster's class.        */\n  /*                                                                       */\n  typedef struct  FT_Renderer_Class_\n  {\n    FT_Module_Class            root;\n\n    FT_Glyph_Format            glyph_format;\n\n    FT_Renderer_RenderFunc     render_glyph;\n    FT_Renderer_TransformFunc  transform_glyph;\n    FT_Renderer_GetCBoxFunc    get_glyph_cbox;\n    FT_Renderer_SetModeFunc    set_mode;\n\n    FT_Raster_Funcs*           raster_class;\n\n  } FT_Renderer_Class;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Renderer                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the current renderer for a given glyph format.            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle to the library object.                         */\n  /*                                                                       */\n  /*    format  :: The glyph format.                                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A renderer handle.  0~if none found.                               */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    An error will be returned if a module already exists by that name, */\n  /*    or if the module requires a version of FreeType that is too great. */\n  /*                                                                       */\n  /*    To add a new renderer, simply use @FT_Add_Module.  To retrieve a   */\n  /*    renderer by its name, use @FT_Get_Module.                          */\n  /*                                                                       */\n  FT_EXPORT( FT_Renderer )\n  FT_Get_Renderer( FT_Library       library,\n                   FT_Glyph_Format  format );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_Renderer                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Set the current renderer to use, and set additional mode.          */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library    :: A handle to the library object.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    renderer   :: A handle to the renderer object.                     */\n  /*                                                                       */\n  /*    num_params :: The number of additional parameters.                 */\n  /*                                                                       */\n  /*    parameters :: Additional parameters.                               */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    In case of success, the renderer will be used to convert glyph     */\n  /*    images in the renderer's known format into bitmaps.                */\n  /*                                                                       */\n  /*    This doesn't change the current renderer for other formats.        */\n  /*                                                                       */\n  /*    Currently, only the B/W renderer, if compiled with                 */\n  /*    FT_RASTER_OPTION_ANTI_ALIASING (providing a 5-levels               */\n  /*    anti-aliasing mode; this option must be set directly in            */\n  /*    `ftraster.c' and is undefined by default) accepts a single tag     */\n  /*    `pal5' to set its gray palette as a character string with          */\n  /*    5~elements.  Consequently, the third and fourth argument are zero  */\n  /*    normally.                                                          */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Set_Renderer( FT_Library     library,\n                   FT_Renderer    renderer,\n                   FT_UInt        num_params,\n                   FT_Parameter*  parameters );\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTRENDER_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsizes.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftsizes.h                                                              */\n/*                                                                         */\n/*    FreeType size objects management (specification).                    */\n/*                                                                         */\n/*  Copyright 1996-2001, 2003, 2004, 2006, 2009 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Typical application would normally not need to use these functions.   */\n  /* However, they have been placed in a public API for the rare cases     */\n  /* where they are needed.                                                */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTSIZES_H__\n#define __FTSIZES_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    sizes_management                                                   */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Size Management                                                    */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Managing multiple sizes per face.                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    When creating a new face object (e.g., with @FT_New_Face), an      */\n  /*    @FT_Size object is automatically created and used to store all     */\n  /*    pixel-size dependent information, available in the `face->size'    */\n  /*    field.                                                             */\n  /*                                                                       */\n  /*    It is however possible to create more sizes for a given face,      */\n  /*    mostly in order to manage several character pixel sizes of the     */\n  /*    same font family and style.  See @FT_New_Size and @FT_Done_Size.   */\n  /*                                                                       */\n  /*    Note that @FT_Set_Pixel_Sizes and @FT_Set_Char_Size only           */\n  /*    modify the contents of the current `active' size; you thus need    */\n  /*    to use @FT_Activate_Size to change it.                             */\n  /*                                                                       */\n  /*    99% of applications won't need the functions provided here,        */\n  /*    especially if they use the caching sub-system, so be cautious      */\n  /*    when using these.                                                  */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Size                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a new size object from a given face object.                 */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to a parent face object.                          */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    asize :: A handle to a new size object.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You need to call @FT_Activate_Size in order to select the new size */\n  /*    for upcoming calls to @FT_Set_Pixel_Sizes, @FT_Set_Char_Size,      */\n  /*    @FT_Load_Glyph, @FT_Load_Char, etc.                                */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_New_Size( FT_Face   face,\n               FT_Size*  size );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Done_Size                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Discard a given size object.  Note that @FT_Done_Face              */\n  /*    automatically discards all size objects allocated with             */\n  /*    @FT_New_Size.                                                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    size :: A handle to a target size object.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Done_Size( FT_Size  size );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Activate_Size                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Even though it is possible to create several size objects for a    */\n  /*    given face (see @FT_New_Size for details), functions like          */\n  /*    @FT_Load_Glyph or @FT_Load_Char only use the one which has been    */\n  /*    activated last to determine the `current character pixel size'.    */\n  /*                                                                       */\n  /*    This function can be used to `activate' a previously created size  */\n  /*    object.                                                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    size :: A handle to a target size object.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If `face' is the size's parent face object, this function changes  */\n  /*    the value of `face->size' to the input size handle.                */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Activate_Size( FT_Size  size );\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTSIZES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsnames.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftsnames.h                                                             */\n/*                                                                         */\n/*    Simple interface to access SFNT name tables (which are used          */\n/*    to hold font names, copyright info, notices, etc.) (specification).  */\n/*                                                                         */\n/*    This is _not_ used to retrieve glyph names!                          */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2006, 2009, 2010 by                   */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FT_SFNT_NAMES_H__\n#define __FT_SFNT_NAMES_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    sfnt_names                                                         */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    SFNT Names                                                         */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Access the names embedded in TrueType and OpenType files.          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The TrueType and OpenType specifications allow the inclusion of    */\n  /*    a special `names table' in font files.  This table contains        */\n  /*    textual (and internationalized) information regarding the font,    */\n  /*    like family name, copyright, version, etc.                         */\n  /*                                                                       */\n  /*    The definitions below are used to access them if available.        */\n  /*                                                                       */\n  /*    Note that this has nothing to do with glyph names!                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_SfntName                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model an SFNT `name' table entry.              */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    platform_id :: The platform ID for `string'.                       */\n  /*                                                                       */\n  /*    encoding_id :: The encoding ID for `string'.                       */\n  /*                                                                       */\n  /*    language_id :: The language ID for `string'.                       */\n  /*                                                                       */\n  /*    name_id     :: An identifier for `string'.                         */\n  /*                                                                       */\n  /*    string      :: The `name' string.  Note that its format differs    */\n  /*                   depending on the (platform,encoding) pair.  It can  */\n  /*                   be a Pascal String, a UTF-16 one, etc.              */\n  /*                                                                       */\n  /*                   Generally speaking, the string is not               */\n  /*                   zero-terminated.  Please refer to the TrueType      */\n  /*                   specification for details.                          */\n  /*                                                                       */\n  /*    string_len  :: The length of `string' in bytes.                    */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Possible values for `platform_id', `encoding_id', `language_id',   */\n  /*    and `name_id' are given in the file `ttnameid.h'.  For details     */\n  /*    please refer to the TrueType or OpenType specification.            */\n  /*                                                                       */\n  /*    See also @TT_PLATFORM_XXX, @TT_APPLE_ID_XXX, @TT_MAC_ID_XXX,       */\n  /*    @TT_ISO_ID_XXX, and @TT_MS_ID_XXX.                                 */\n  /*                                                                       */\n  typedef struct  FT_SfntName_\n  {\n    FT_UShort  platform_id;\n    FT_UShort  encoding_id;\n    FT_UShort  language_id;\n    FT_UShort  name_id;\n\n    FT_Byte*   string;      /* this string is *not* null-terminated! */\n    FT_UInt    string_len;  /* in bytes */\n\n  } FT_SfntName;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Sfnt_Name_Count                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the number of name strings in the SFNT `name' table.      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to the source face.                               */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The number of strings in the `name' table.                         */\n  /*                                                                       */\n  FT_EXPORT( FT_UInt )\n  FT_Get_Sfnt_Name_Count( FT_Face  face );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Sfnt_Name                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve a string of the SFNT `name' table for a given index.      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face  :: A handle to the source face.                              */\n  /*                                                                       */\n  /*    idx   :: The index of the `name' string.                           */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aname :: The indexed @FT_SfntName structure.                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The `string' array returned in the `aname' structure is not        */\n  /*    null-terminated.  The application should deallocate it if it is no */\n  /*    longer in use.                                                     */\n  /*                                                                       */\n  /*    Use @FT_Get_Sfnt_Name_Count to get the total number of available   */\n  /*    `name' table entries, then do a loop until you get the right       */\n  /*    platform, encoding, and name ID.                                   */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_Sfnt_Name( FT_Face       face,\n                    FT_UInt       idx,\n                    FT_SfntName  *aname );\n\n\n  /***************************************************************************\n   *\n   * @constant:\n   *   FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY\n   *\n   * @description:\n   *   A constant used as the tag of @FT_Parameter structures to make\n   *   FT_Open_Face() ignore preferred family subfamily names in `name'\n   *   table since OpenType version 1.4.  For backwards compatibility with\n   *   legacy systems which has 4-face-per-family restriction.\n   *\n   */\n#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY  FT_MAKE_TAG( 'i', 'g', 'p', 'f' )\n\n\n  /***************************************************************************\n   *\n   * @constant:\n   *   FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY\n   *\n   * @description:\n   *   A constant used as the tag of @FT_Parameter structures to make\n   *   FT_Open_Face() ignore preferred subfamily names in `name' table since\n   *   OpenType version 1.4.  For backwards compatibility with legacy\n   *   systems which has 4-face-per-family restriction.\n   *\n   */\n#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY  FT_MAKE_TAG( 'i', 'g', 'p', 's' )\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FT_SFNT_NAMES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftstroke.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftstroke.h                                                             */\n/*                                                                         */\n/*    FreeType path stroker (specification).                               */\n/*                                                                         */\n/*  Copyright 2002-2006, 2008, 2009, 2011-2012 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FT_STROKE_H__\n#define __FT_STROKE_H__\n\n#include \"../ft2build.h\"\n#include \"ftoutln.h\"\n#include \"ftglyph.h\"\n\n\nFT_BEGIN_HEADER\n\n\n /************************************************************************\n  *\n  * @section:\n  *    glyph_stroker\n  *\n  * @title:\n  *    Glyph Stroker\n  *\n  * @abstract:\n  *    Generating bordered and stroked glyphs.\n  *\n  * @description:\n  *    This component generates stroked outlines of a given vectorial\n  *    glyph.  It also allows you to retrieve the `outside' and/or the\n  *    `inside' borders of the stroke.\n  *\n  *    This can be useful to generate `bordered' glyph, i.e., glyphs\n  *    displayed with a coloured (and anti-aliased) border around their\n  *    shape.\n  */\n\n\n /**************************************************************\n  *\n  * @type:\n  *   FT_Stroker\n  *\n  * @description:\n  *   Opaque handler to a path stroker object.\n  */\n  typedef struct FT_StrokerRec_*  FT_Stroker;\n\n\n  /**************************************************************\n   *\n   * @enum:\n   *   FT_Stroker_LineJoin\n   *\n   * @description:\n   *   These values determine how two joining lines are rendered\n   *   in a stroker.\n   *\n   * @values:\n   *   FT_STROKER_LINEJOIN_ROUND ::\n   *     Used to render rounded line joins.  Circular arcs are used\n   *     to join two lines smoothly.\n   *\n   *   FT_STROKER_LINEJOIN_BEVEL ::\n   *     Used to render beveled line joins.  The outer corner of\n   *     the joined lines is filled by enclosing the triangular\n   *     region of the corner with a straight line between the\n   *     outer corners of each stroke.\n   *\n   *   FT_STROKER_LINEJOIN_MITER_FIXED ::\n   *     Used to render mitered line joins, with fixed bevels if the\n   *     miter limit is exceeded.  The outer edges of the strokes\n   *     for the two segments are extended until they meet at an\n   *     angle.  If the segments meet at too sharp an angle (such\n   *     that the miter would extend from the intersection of the\n   *     segments a distance greater than the product of the miter\n   *     limit value and the border radius), then a bevel join (see\n   *     above) is used instead.  This prevents long spikes being\n   *     created.  FT_STROKER_LINEJOIN_MITER_FIXED generates a miter\n   *     line join as used in PostScript and PDF.\n   *\n   *   FT_STROKER_LINEJOIN_MITER_VARIABLE ::\n   *   FT_STROKER_LINEJOIN_MITER ::\n   *     Used to render mitered line joins, with variable bevels if\n   *     the miter limit is exceeded.  The intersection of the\n   *     strokes is clipped at a line perpendicular to the bisector\n   *     of the angle between the strokes, at the distance from the\n   *     intersection of the segments equal to the product of the\n   *     miter limit value and the border radius.  This prevents\n   *     long spikes being created.\n   *     FT_STROKER_LINEJOIN_MITER_VARIABLE generates a mitered line\n   *     join as used in XPS.  FT_STROKER_LINEJOIN_MITER is an alias\n   *     for FT_STROKER_LINEJOIN_MITER_VARIABLE, retained for\n   *     backwards compatibility.\n   */\n  typedef enum  FT_Stroker_LineJoin_\n  {\n    FT_STROKER_LINEJOIN_ROUND          = 0,\n    FT_STROKER_LINEJOIN_BEVEL          = 1,\n    FT_STROKER_LINEJOIN_MITER_VARIABLE = 2,\n    FT_STROKER_LINEJOIN_MITER          = FT_STROKER_LINEJOIN_MITER_VARIABLE,\n    FT_STROKER_LINEJOIN_MITER_FIXED    = 3\n\n  } FT_Stroker_LineJoin;\n\n\n  /**************************************************************\n   *\n   * @enum:\n   *   FT_Stroker_LineCap\n   *\n   * @description:\n   *   These values determine how the end of opened sub-paths are\n   *   rendered in a stroke.\n   *\n   * @values:\n   *   FT_STROKER_LINECAP_BUTT ::\n   *     The end of lines is rendered as a full stop on the last\n   *     point itself.\n   *\n   *   FT_STROKER_LINECAP_ROUND ::\n   *     The end of lines is rendered as a half-circle around the\n   *     last point.\n   *\n   *   FT_STROKER_LINECAP_SQUARE ::\n   *     The end of lines is rendered as a square around the\n   *     last point.\n   */\n  typedef enum  FT_Stroker_LineCap_\n  {\n    FT_STROKER_LINECAP_BUTT = 0,\n    FT_STROKER_LINECAP_ROUND,\n    FT_STROKER_LINECAP_SQUARE\n\n  } FT_Stroker_LineCap;\n\n\n  /**************************************************************\n   *\n   * @enum:\n   *   FT_StrokerBorder\n   *\n   * @description:\n   *   These values are used to select a given stroke border\n   *   in @FT_Stroker_GetBorderCounts and @FT_Stroker_ExportBorder.\n   *\n   * @values:\n   *   FT_STROKER_BORDER_LEFT ::\n   *     Select the left border, relative to the drawing direction.\n   *\n   *   FT_STROKER_BORDER_RIGHT ::\n   *     Select the right border, relative to the drawing direction.\n   *\n   * @note:\n   *   Applications are generally interested in the `inside' and `outside'\n   *   borders.  However, there is no direct mapping between these and the\n   *   `left' and `right' ones, since this really depends on the glyph's\n   *   drawing orientation, which varies between font formats.\n   *\n   *   You can however use @FT_Outline_GetInsideBorder and\n   *   @FT_Outline_GetOutsideBorder to get these.\n   */\n  typedef enum  FT_StrokerBorder_\n  {\n    FT_STROKER_BORDER_LEFT = 0,\n    FT_STROKER_BORDER_RIGHT\n\n  } FT_StrokerBorder;\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Outline_GetInsideBorder\n   *\n   * @description:\n   *   Retrieve the @FT_StrokerBorder value corresponding to the\n   *   `inside' borders of a given outline.\n   *\n   * @input:\n   *   outline ::\n   *     The source outline handle.\n   *\n   * @return:\n   *   The border index.  @FT_STROKER_BORDER_RIGHT for empty or invalid\n   *   outlines.\n   */\n  FT_EXPORT( FT_StrokerBorder )\n  FT_Outline_GetInsideBorder( FT_Outline*  outline );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Outline_GetOutsideBorder\n   *\n   * @description:\n   *   Retrieve the @FT_StrokerBorder value corresponding to the\n   *   `outside' borders of a given outline.\n   *\n   * @input:\n   *   outline ::\n   *     The source outline handle.\n   *\n   * @return:\n   *   The border index.  @FT_STROKER_BORDER_LEFT for empty or invalid\n   *   outlines.\n   */\n  FT_EXPORT( FT_StrokerBorder )\n  FT_Outline_GetOutsideBorder( FT_Outline*  outline );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_New\n   *\n   * @description:\n   *   Create a new stroker object.\n   *\n   * @input:\n   *   library ::\n   *     FreeType library handle.\n   *\n   * @output:\n   *   astroker ::\n   *     A new stroker object handle.  NULL in case of error.\n   *\n   * @return:\n   *    FreeType error code.  0~means success.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_New( FT_Library   library,\n                  FT_Stroker  *astroker );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_Set\n   *\n   * @description:\n   *   Reset a stroker object's attributes.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   radius ::\n   *     The border radius.\n   *\n   *   line_cap ::\n   *     The line cap style.\n   *\n   *   line_join ::\n   *     The line join style.\n   *\n   *   miter_limit ::\n   *     The miter limit for the FT_STROKER_LINEJOIN_MITER_FIXED and\n   *     FT_STROKER_LINEJOIN_MITER_VARIABLE line join styles,\n   *     expressed as 16.16 fixed-point value.\n   *\n   * @note:\n   *   The radius is expressed in the same units as the outline\n   *   coordinates.\n   */\n  FT_EXPORT( void )\n  FT_Stroker_Set( FT_Stroker           stroker,\n                  FT_Fixed             radius,\n                  FT_Stroker_LineCap   line_cap,\n                  FT_Stroker_LineJoin  line_join,\n                  FT_Fixed             miter_limit );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_Rewind\n   *\n   * @description:\n   *   Reset a stroker object without changing its attributes.\n   *   You should call this function before beginning a new\n   *   series of calls to @FT_Stroker_BeginSubPath or\n   *   @FT_Stroker_EndSubPath.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   */\n  FT_EXPORT( void )\n  FT_Stroker_Rewind( FT_Stroker  stroker );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_ParseOutline\n   *\n   * @description:\n   *   A convenience function used to parse a whole outline with\n   *   the stroker.  The resulting outline(s) can be retrieved\n   *   later by functions like @FT_Stroker_GetCounts and @FT_Stroker_Export.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   outline ::\n   *     The source outline.\n   *\n   *   opened ::\n   *     A boolean.  If~1, the outline is treated as an open path instead\n   *     of a closed one.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   If `opened' is~0 (the default), the outline is treated as a closed\n   *   path, and the stroker generates two distinct `border' outlines.\n   *\n   *   If `opened' is~1, the outline is processed as an open path, and the\n   *   stroker generates a single `stroke' outline.\n   *\n   *   This function calls @FT_Stroker_Rewind automatically.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_ParseOutline( FT_Stroker   stroker,\n                           FT_Outline*  outline,\n                           FT_Bool      opened );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_BeginSubPath\n   *\n   * @description:\n   *   Start a new sub-path in the stroker.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   to ::\n   *     A pointer to the start vector.\n   *\n   *   open ::\n   *     A boolean.  If~1, the sub-path is treated as an open one.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   This function is useful when you need to stroke a path that is\n   *   not stored as an @FT_Outline object.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_BeginSubPath( FT_Stroker  stroker,\n                           FT_Vector*  to,\n                           FT_Bool     open );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_EndSubPath\n   *\n   * @description:\n   *   Close the current sub-path in the stroker.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   You should call this function after @FT_Stroker_BeginSubPath.\n   *   If the subpath was not `opened', this function `draws' a\n   *   single line segment to the start position when needed.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_EndSubPath( FT_Stroker  stroker );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_LineTo\n   *\n   * @description:\n   *   `Draw' a single line segment in the stroker's current sub-path,\n   *   from the last position.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   to ::\n   *     A pointer to the destination point.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   You should call this function between @FT_Stroker_BeginSubPath and\n   *   @FT_Stroker_EndSubPath.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_LineTo( FT_Stroker  stroker,\n                     FT_Vector*  to );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_ConicTo\n   *\n   * @description:\n   *   `Draw' a single quadratic Bézier in the stroker's current sub-path,\n   *   from the last position.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   control ::\n   *     A pointer to a Bézier control point.\n   *\n   *   to ::\n   *     A pointer to the destination point.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   You should call this function between @FT_Stroker_BeginSubPath and\n   *   @FT_Stroker_EndSubPath.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_ConicTo( FT_Stroker  stroker,\n                      FT_Vector*  control,\n                      FT_Vector*  to );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_CubicTo\n   *\n   * @description:\n   *   `Draw' a single cubic Bézier in the stroker's current sub-path,\n   *   from the last position.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   control1 ::\n   *     A pointer to the first Bézier control point.\n   *\n   *   control2 ::\n   *     A pointer to second Bézier control point.\n   *\n   *   to ::\n   *     A pointer to the destination point.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   You should call this function between @FT_Stroker_BeginSubPath and\n   *   @FT_Stroker_EndSubPath.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_CubicTo( FT_Stroker  stroker,\n                      FT_Vector*  control1,\n                      FT_Vector*  control2,\n                      FT_Vector*  to );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_GetBorderCounts\n   *\n   * @description:\n   *   Call this function once you have finished parsing your paths\n   *   with the stroker.  It returns the number of points and\n   *   contours necessary to export one of the `border' or `stroke'\n   *   outlines generated by the stroker.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   border ::\n   *     The border index.\n   *\n   * @output:\n   *   anum_points ::\n   *     The number of points.\n   *\n   *   anum_contours ::\n   *     The number of contours.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   When an outline, or a sub-path, is `closed', the stroker generates\n   *   two independent `border' outlines, named `left' and `right'.\n   *\n   *   When the outline, or a sub-path, is `opened', the stroker merges\n   *   the `border' outlines with caps.  The `left' border receives all\n   *   points, while the `right' border becomes empty.\n   *\n   *   Use the function @FT_Stroker_GetCounts instead if you want to\n   *   retrieve the counts associated to both borders.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_GetBorderCounts( FT_Stroker        stroker,\n                              FT_StrokerBorder  border,\n                              FT_UInt          *anum_points,\n                              FT_UInt          *anum_contours );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_ExportBorder\n   *\n   * @description:\n   *   Call this function after @FT_Stroker_GetBorderCounts to\n   *   export the corresponding border to your own @FT_Outline\n   *   structure.\n   *\n   *   Note that this function appends the border points and\n   *   contours to your outline, but does not try to resize its\n   *   arrays.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   border ::\n   *     The border index.\n   *\n   *   outline ::\n   *     The target outline handle.\n   *\n   * @note:\n   *   Always call this function after @FT_Stroker_GetBorderCounts to\n   *   get sure that there is enough room in your @FT_Outline object to\n   *   receive all new data.\n   *\n   *   When an outline, or a sub-path, is `closed', the stroker generates\n   *   two independent `border' outlines, named `left' and `right'\n   *\n   *   When the outline, or a sub-path, is `opened', the stroker merges\n   *   the `border' outlines with caps. The `left' border receives all\n   *   points, while the `right' border becomes empty.\n   *\n   *   Use the function @FT_Stroker_Export instead if you want to\n   *   retrieve all borders at once.\n   */\n  FT_EXPORT( void )\n  FT_Stroker_ExportBorder( FT_Stroker        stroker,\n                           FT_StrokerBorder  border,\n                           FT_Outline*       outline );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_GetCounts\n   *\n   * @description:\n   *   Call this function once you have finished parsing your paths\n   *   with the stroker.  It returns the number of points and\n   *   contours necessary to export all points/borders from the stroked\n   *   outline/path.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   * @output:\n   *   anum_points ::\n   *     The number of points.\n   *\n   *   anum_contours ::\n   *     The number of contours.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_GetCounts( FT_Stroker  stroker,\n                        FT_UInt    *anum_points,\n                        FT_UInt    *anum_contours );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_Export\n   *\n   * @description:\n   *   Call this function after @FT_Stroker_GetBorderCounts to\n   *   export all borders to your own @FT_Outline structure.\n   *\n   *   Note that this function appends the border points and\n   *   contours to your outline, but does not try to resize its\n   *   arrays.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   outline ::\n   *     The target outline handle.\n   */\n  FT_EXPORT( void )\n  FT_Stroker_Export( FT_Stroker   stroker,\n                     FT_Outline*  outline );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_Done\n   *\n   * @description:\n   *   Destroy a stroker object.\n   *\n   * @input:\n   *   stroker ::\n   *     A stroker handle.  Can be NULL.\n   */\n  FT_EXPORT( void )\n  FT_Stroker_Done( FT_Stroker  stroker );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Glyph_Stroke\n   *\n   * @description:\n   *   Stroke a given outline glyph object with a given stroker.\n   *\n   * @inout:\n   *   pglyph ::\n   *     Source glyph handle on input, new glyph handle on output.\n   *\n   * @input:\n   *   stroker ::\n   *     A stroker handle.\n   *\n   *   destroy ::\n   *     A Boolean.  If~1, the source glyph object is destroyed\n   *     on success.\n   *\n   * @return:\n   *    FreeType error code.  0~means success.\n   *\n   * @note:\n   *   The source glyph is untouched in case of error.\n   *\n   *   Adding stroke may yield a significantly wider and taller glyph\n   *   depending on how large of a radius was used to stroke the glyph.  You\n   *   may need to manually adjust horizontal and vertical advance amounts\n   *   to account for this added size.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Glyph_Stroke( FT_Glyph    *pglyph,\n                   FT_Stroker   stroker,\n                   FT_Bool      destroy );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Glyph_StrokeBorder\n   *\n   * @description:\n   *   Stroke a given outline glyph object with a given stroker, but\n   *   only return either its inside or outside border.\n   *\n   * @inout:\n   *   pglyph ::\n   *     Source glyph handle on input, new glyph handle on output.\n   *\n   * @input:\n   *   stroker ::\n   *     A stroker handle.\n   *\n   *   inside ::\n   *     A Boolean.  If~1, return the inside border, otherwise\n   *     the outside border.\n   *\n   *   destroy ::\n   *     A Boolean.  If~1, the source glyph object is destroyed\n   *     on success.\n   *\n   * @return:\n   *    FreeType error code.  0~means success.\n   *\n   * @note:\n   *   The source glyph is untouched in case of error.\n   *\n   *   Adding stroke may yield a significantly wider and taller glyph\n   *   depending on how large of a radius was used to stroke the glyph.  You\n   *   may need to manually adjust horizontal and vertical advance amounts\n   *   to account for this added size.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Glyph_StrokeBorder( FT_Glyph    *pglyph,\n                         FT_Stroker   stroker,\n                         FT_Bool      inside,\n                         FT_Bool      destroy );\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FT_STROKE_H__ */\n\n\n/* END */\n\n\n/* Local Variables: */\n/* coding: utf-8    */\n/* End:             */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsynth.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftsynth.h                                                              */\n/*                                                                         */\n/*    FreeType synthesizing code for emboldening and slanting              */\n/*    (specification).                                                     */\n/*                                                                         */\n/*  Copyright 2000-2001, 2003, 2006, 2008, 2012 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*********                                                       *********/\n  /*********        WARNING, THIS IS ALPHA CODE!  THIS API         *********/\n  /*********    IS DUE TO CHANGE UNTIL STRICTLY NOTIFIED BY THE    *********/\n  /*********            FREETYPE DEVELOPMENT TEAM                  *********/\n  /*********                                                       *********/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* Main reason for not lifting the functions in this module to a  */\n  /* `standard' API is that the used parameters for emboldening and */\n  /* slanting are not configurable.  Consider the functions as a    */\n  /* code resource which should be copied into the application and  */\n  /* adapted to the particular needs.                               */\n\n\n#ifndef __FTSYNTH_H__\n#define __FTSYNTH_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n  /* Embolden a glyph by a `reasonable' value (which is highly a matter of */\n  /* taste).  This function is actually a convenience function, providing  */\n  /* a wrapper for @FT_Outline_Embolden and @FT_Bitmap_Embolden.           */\n  /*                                                                       */\n  /* For emboldened outlines the height, width, and advance metrics are    */\n  /* increased by the strength of the emboldening.  You can also call      */\n  /* @FT_Outline_Get_CBox to get precise values.                           */\n  FT_EXPORT( void )\n  FT_GlyphSlot_Embolden( FT_GlyphSlot  slot );\n\n  /* Slant an outline glyph to the right by about 12 degrees. */\n  FT_EXPORT( void )\n  FT_GlyphSlot_Oblique( FT_GlyphSlot  slot );\n\n  /* */\n\nFT_END_HEADER\n\n#endif /* __FTSYNTH_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsystem.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftsystem.h                                                             */\n/*                                                                         */\n/*    FreeType low-level system interface definition (specification).      */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2005, 2010 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTSYSTEM_H__\n#define __FTSYSTEM_H__\n\n\n#include \"../ft2build.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*   system_interface                                                    */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*   System Interface                                                    */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*   How FreeType manages memory and i/o.                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*   This section contains various definitions related to memory         */\n  /*   management and i/o access.  You need to understand this             */\n  /*   information if you want to use a custom memory manager or you own   */\n  /*   i/o streams.                                                        */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                  M E M O R Y   M A N A G E M E N T                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************\n   *\n   * @type:\n   *   FT_Memory\n   *\n   * @description:\n   *   A handle to a given memory manager object, defined with an\n   *   @FT_MemoryRec structure.\n   *\n   */\n  typedef struct FT_MemoryRec_*  FT_Memory;\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   FT_Alloc_Func\n   *\n   * @description:\n   *   A function used to allocate `size' bytes from `memory'.\n   *\n   * @input:\n   *   memory ::\n   *     A handle to the source memory manager.\n   *\n   *   size ::\n   *     The size in bytes to allocate.\n   *\n   * @return:\n   *   Address of new memory block.  0~in case of failure.\n   *\n   */\n  typedef void*\n  (*FT_Alloc_Func)( FT_Memory  memory,\n                    long       size );\n\n  /* Sunliang.Liu 20100915 sync 221's revison. */\n  typedef void*\n\t  (*FT_AllocDebug_Func)( FT_Memory  memory,\n\t  long       size, const char* filename,  int line);\n\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   FT_Free_Func\n   *\n   * @description:\n   *   A function used to release a given block of memory.\n   *\n   * @input:\n   *   memory ::\n   *     A handle to the source memory manager.\n   *\n   *   block ::\n   *     The address of the target memory block.\n   *\n   */\n  typedef void\n  (*FT_Free_Func)( FT_Memory  memory,\n                   void*      block );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   FT_Realloc_Func\n   *\n   * @description:\n   *   A function used to re-allocate a given block of memory.\n   *\n   * @input:\n   *   memory ::\n   *     A handle to the source memory manager.\n   *\n   *   cur_size ::\n   *     The block's current size in bytes.\n   *\n   *   new_size ::\n   *     The block's requested new size.\n   *\n   *   block ::\n   *     The block's current address.\n   *\n   * @return:\n   *   New block address.  0~in case of memory shortage.\n   *\n   * @note:\n   *   In case of error, the old block must still be available.\n   *\n   */\n  typedef void*\n  (*FT_Realloc_Func)( FT_Memory  memory,\n                      long       cur_size,\n                      long       new_size,\n                      void*      block );\n\n\n  /*************************************************************************\n   *\n   * @struct:\n   *   FT_MemoryRec\n   *\n   * @description:\n   *   A structure used to describe a given memory manager to FreeType~2.\n   *\n   * @fields:\n   *   user ::\n   *     A generic typeless pointer for user data.\n   *\n   *   alloc ::\n   *     A pointer type to an allocation function.\n   *\n   *   free ::\n   *     A pointer type to an memory freeing function.\n   *\n   *   realloc ::\n   *     A pointer type to a reallocation function.\n   *\n   */\n  struct  FT_MemoryRec_\n  {\n    void*            user;\n    FT_Alloc_Func    alloc;\n\tFT_AllocDebug_Func allocdebug;\t/* Sunliang.Liu 20100915 sync 221's revison. */\n    FT_Free_Func     free;\n    FT_Realloc_Func  realloc;\n  };\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                       I / O   M A N A G E M E N T                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************\n   *\n   * @type:\n   *   FT_Stream\n   *\n   * @description:\n   *   A handle to an input stream.\n   *\n   */\n  typedef struct FT_StreamRec_*  FT_Stream;\n\n\n  /*************************************************************************\n   *\n   * @struct:\n   *   FT_StreamDesc\n   *\n   * @description:\n   *   A union type used to store either a long or a pointer.  This is used\n   *   to store a file descriptor or a `FILE*' in an input stream.\n   *\n   */\n  typedef union  FT_StreamDesc_\n  {\n    long   value;\n    void*  pointer;\n\n  } FT_StreamDesc;\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   FT_Stream_IoFunc\n   *\n   * @description:\n   *   A function used to seek and read data from a given input stream.\n   *\n   * @input:\n   *   stream ::\n   *     A handle to the source stream.\n   *\n   *   offset ::\n   *     The offset of read in stream (always from start).\n   *\n   *   buffer ::\n   *     The address of the read buffer.\n   *\n   *   count ::\n   *     The number of bytes to read from the stream.\n   *\n   * @return:\n   *   The number of bytes effectively read by the stream.\n   *\n   * @note:\n   *   This function might be called to perform a seek or skip operation\n   *   with a `count' of~0.  A non-zero return value then indicates an\n   *   error.\n   *\n   */\n  typedef unsigned long\n  (*FT_Stream_IoFunc)( FT_Stream       stream,\n                       unsigned long   offset,\n                       unsigned char*  buffer,\n                       unsigned long   count );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   FT_Stream_CloseFunc\n   *\n   * @description:\n   *   A function used to close a given input stream.\n   *\n   * @input:\n   *  stream ::\n   *     A handle to the target stream.\n   *\n   */\n  typedef void\n  (*FT_Stream_CloseFunc)( FT_Stream  stream );\n\n\n  /*************************************************************************\n   *\n   * @struct:\n   *   FT_StreamRec\n   *\n   * @description:\n   *   A structure used to describe an input stream.\n   *\n   * @input:\n   *   base ::\n   *     For memory-based streams, this is the address of the first stream\n   *     byte in memory.  This field should always be set to NULL for\n   *     disk-based streams.\n   *\n   *   size ::\n   *     The stream size in bytes.\n   *\n   *   pos ::\n   *     The current position within the stream.\n   *\n   *   descriptor ::\n   *     This field is a union that can hold an integer or a pointer.  It is\n   *     used by stream implementations to store file descriptors or `FILE*'\n   *     pointers.\n   *\n   *   pathname ::\n   *     This field is completely ignored by FreeType.  However, it is often\n   *     useful during debugging to use it to store the stream's filename\n   *     (where available).\n   *\n   *   read ::\n   *     The stream's input function.\n   *\n   *   close ::\n   *     The stream's close function.\n   *\n   *   memory ::\n   *     The memory manager to use to preload frames.  This is set\n   *     internally by FreeType and shouldn't be touched by stream\n   *     implementations.\n   *\n   *   cursor ::\n   *     This field is set and used internally by FreeType when parsing\n   *     frames.\n   *\n   *   limit ::\n   *     This field is set and used internally by FreeType when parsing\n   *     frames.\n   *\n   */\n  typedef struct  FT_StreamRec_\n  {\n    unsigned char*       base;\n    unsigned long        size;\n    unsigned long        pos;\n\n    FT_StreamDesc        descriptor;\n    FT_StreamDesc        pathname;\n    FT_Stream_IoFunc     read;\n    FT_Stream_CloseFunc  close;\n\n    FT_Memory            memory;\n    unsigned char*       cursor;\n    unsigned char*       limit;\n\n  } FT_StreamRec;\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTSYSTEM_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fttrigon.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  fttrigon.h                                                             */\n/*                                                                         */\n/*    FreeType trigonometric functions (specification).                    */\n/*                                                                         */\n/*  Copyright 2001, 2003, 2005, 2007, 2013 by                              */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTTRIGON_H__\n#define __FTTRIGON_H__\n\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*   computations                                                        */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************\n   *\n   * @type:\n   *   FT_Angle\n   *\n   * @description:\n   *   This type is used to model angle values in FreeType.  Note that the\n   *   angle is a 16.16 fixed-point value expressed in degrees.\n   *\n   */\n  typedef FT_Fixed  FT_Angle;\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_ANGLE_PI\n   *\n   * @description:\n   *   The angle pi expressed in @FT_Angle units.\n   *\n   */\n#define FT_ANGLE_PI  ( 180L << 16 )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_ANGLE_2PI\n   *\n   * @description:\n   *   The angle 2*pi expressed in @FT_Angle units.\n   *\n   */\n#define FT_ANGLE_2PI  ( FT_ANGLE_PI * 2 )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_ANGLE_PI2\n   *\n   * @description:\n   *   The angle pi/2 expressed in @FT_Angle units.\n   *\n   */\n#define FT_ANGLE_PI2  ( FT_ANGLE_PI / 2 )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_ANGLE_PI4\n   *\n   * @description:\n   *   The angle pi/4 expressed in @FT_Angle units.\n   *\n   */\n#define FT_ANGLE_PI4  ( FT_ANGLE_PI / 4 )\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Sin\n   *\n   * @description:\n   *   Return the sinus of a given angle in fixed-point format.\n   *\n   * @input:\n   *   angle ::\n   *     The input angle.\n   *\n   * @return:\n   *   The sinus value.\n   *\n   * @note:\n   *   If you need both the sinus and cosinus for a given angle, use the\n   *   function @FT_Vector_Unit.\n   *\n   */\n  FT_EXPORT( FT_Fixed )\n  FT_Sin( FT_Angle  angle );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Cos\n   *\n   * @description:\n   *   Return the cosinus of a given angle in fixed-point format.\n   *\n   * @input:\n   *   angle ::\n   *     The input angle.\n   *\n   * @return:\n   *   The cosinus value.\n   *\n   * @note:\n   *   If you need both the sinus and cosinus for a given angle, use the\n   *   function @FT_Vector_Unit.\n   *\n   */\n  FT_EXPORT( FT_Fixed )\n  FT_Cos( FT_Angle  angle );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Tan\n   *\n   * @description:\n   *   Return the tangent of a given angle in fixed-point format.\n   *\n   * @input:\n   *   angle ::\n   *     The input angle.\n   *\n   * @return:\n   *   The tangent value.\n   *\n   */\n  FT_EXPORT( FT_Fixed )\n  FT_Tan( FT_Angle  angle );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Atan2\n   *\n   * @description:\n   *   Return the arc-tangent corresponding to a given vector (x,y) in\n   *   the 2d plane.\n   *\n   * @input:\n   *   x ::\n   *     The horizontal vector coordinate.\n   *\n   *   y ::\n   *     The vertical vector coordinate.\n   *\n   * @return:\n   *   The arc-tangent value (i.e. angle).\n   *\n   */\n  FT_EXPORT( FT_Angle )\n  FT_Atan2( FT_Fixed  x,\n            FT_Fixed  y );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Angle_Diff\n   *\n   * @description:\n   *   Return the difference between two angles.  The result is always\n   *   constrained to the ]-PI..PI] interval.\n   *\n   * @input:\n   *   angle1 ::\n   *     First angle.\n   *\n   *   angle2 ::\n   *     Second angle.\n   *\n   * @return:\n   *   Constrained value of `value2-value1'.\n   *\n   */\n  FT_EXPORT( FT_Angle )\n  FT_Angle_Diff( FT_Angle  angle1,\n                 FT_Angle  angle2 );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Vector_Unit\n   *\n   * @description:\n   *   Return the unit vector corresponding to a given angle.  After the\n   *   call, the value of `vec.x' will be `sin(angle)', and the value of\n   *   `vec.y' will be `cos(angle)'.\n   *\n   *   This function is useful to retrieve both the sinus and cosinus of a\n   *   given angle quickly.\n   *\n   * @output:\n   *   vec ::\n   *     The address of target vector.\n   *\n   * @input:\n   *   angle ::\n   *     The address of angle.\n   *\n   */\n  FT_EXPORT( void )\n  FT_Vector_Unit( FT_Vector*  vec,\n                  FT_Angle    angle );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Vector_Rotate\n   *\n   * @description:\n   *   Rotate a vector by a given angle.\n   *\n   * @inout:\n   *   vec ::\n   *     The address of target vector.\n   *\n   * @input:\n   *   angle ::\n   *     The address of angle.\n   *\n   */\n  FT_EXPORT( void )\n  FT_Vector_Rotate( FT_Vector*  vec,\n                    FT_Angle    angle );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Vector_Length\n   *\n   * @description:\n   *   Return the length of a given vector.\n   *\n   * @input:\n   *   vec ::\n   *     The address of target vector.\n   *\n   * @return:\n   *   The vector length, expressed in the same units that the original\n   *   vector coordinates.\n   *\n   */\n  FT_EXPORT( FT_Fixed )\n  FT_Vector_Length( FT_Vector*  vec );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Vector_Polarize\n   *\n   * @description:\n   *   Compute both the length and angle of a given vector.\n   *\n   * @input:\n   *   vec ::\n   *     The address of source vector.\n   *\n   * @output:\n   *   length ::\n   *     The vector length.\n   *\n   *   angle ::\n   *     The vector angle.\n   *\n   */\n  FT_EXPORT( void )\n  FT_Vector_Polarize( FT_Vector*  vec,\n                      FT_Fixed   *length,\n                      FT_Angle   *angle );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Vector_From_Polar\n   *\n   * @description:\n   *   Compute vector coordinates from a length and angle.\n   *\n   * @output:\n   *   vec ::\n   *     The address of source vector.\n   *\n   * @input:\n   *   length ::\n   *     The vector length.\n   *\n   *   angle ::\n   *     The vector angle.\n   *\n   */\n  FT_EXPORT( void )\n  FT_Vector_From_Polar( FT_Vector*  vec,\n                        FT_Fixed    length,\n                        FT_Angle    angle );\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTTRIGON_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftttdrv.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftttdrv.h                                                              */\n/*                                                                         */\n/*    FreeType API for controlling the TrueType driver                     */\n/*    (specification only).                                                */\n/*                                                                         */\n/*  Copyright 2013 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTTTDRV_H__\n#define __FTTTDRV_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /**************************************************************************\n   *\n   * @section:\n   *   tt_driver\n   *\n   * @title:\n   *   The TrueType driver\n   *\n   * @abstract:\n   *   Controlling the TrueType driver module.\n   *\n   * @description:\n   *   While FreeType's TrueType driver doesn't expose API functions by\n   *   itself, it is possible to control its behaviour with @FT_Property_Set\n   *   and @FT_Property_Get.  The following lists the available properties\n   *   together with the necessary macros and structures.\n   *\n   *   The TrueType driver's module name is `truetype'.\n   *\n   */\n\n\n  /**************************************************************************\n   *\n   * @property:\n   *   interpreter-version\n   *\n   * @description:\n   *   Currently, two versions are available which represent the bytecode\n   *   interpreter with and without subpixel hinting support,\n   *   respectively.  The default is subpixel support if\n   *   TT_CONFIG_OPTION_SUBPIXEL_HINTING is defined, and no subpixel\n   *   support otherwise (since it isn't available then).\n   *\n   *   If subpixel hinting is on, many TrueType bytecode instructions\n   *   behave differently compared to B/W or grayscale rendering.  The\n   *   main idea is to render at a much increased horizontal resolution,\n   *   then sampling down the created output to subpixel precision.\n   *   However, many older fonts are not suited to this and must be\n   *   specially taken care of by applying (hardcoded) font-specific\n   *   tweaks.\n   *\n   *   Details on subpixel hinting and some of the necessary tweaks can be\n   *   found in Greg Hitchcock's whitepaper at\n   *   `http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx'.\n   *\n   *   The following example code demonstrates how to activate subpixel\n   *   hinting (omitting the error handling).\n   *\n   *   {\n   *     FT_Library  library;\n   *     FT_Face     face;\n   *     FT_UInt     interpreter_version = TT_INTERPRETER_VERSION_38;\n   *\n   *\n   *     FT_Init_FreeType( &library );\n   *\n   *     FT_Property_Set( library, \"truetype\",\n   *                               \"interpreter-version\",\n   *                               &interpreter_version );\n   *   }\n   *\n   * @note:\n   *   This property can be used with @FT_Property_Get also.\n   *\n   */\n\n\n  /**************************************************************************\n   *\n   * @enum:\n   *   TT_INTERPRETER_VERSION_XXX\n   *\n   * @description:\n   *   A list of constants used for the @interpreter-version property to\n   *   select the hinting engine for Truetype fonts.\n   *\n   *   The numeric value in the constant names represents the version\n   *   number as returned by the `GETINFO' bytecode instruction.\n   *\n   * @values:\n   *   TT_INTERPRETER_VERSION_35 ::\n   *     Version~35 corresponds to MS rasterizer v.1.7 as used e.g. in\n   *     Windows~98; only grayscale and B/W rasterizing is supported.\n   *\n   *   TT_INTERPRETER_VERSION_38 ::\n   *     Version~38 corresponds to MS rasterizer v.1.9; it is roughly\n   *     equivalent to the hinting provided by DirectWrite ClearType (as\n   *     can be found, for example, in the Internet Explorer~9 running on\n   *     Windows~7).\n   *\n   * @note:\n   *   This property controls the behaviour of the bytecode interpreter\n   *   and thus how outlines get hinted.  It does *not* control how glyph\n   *   get rasterized!  In particular, it does not control subpixel color\n   *   filtering.\n   *\n   *   If FreeType has not been compiled with configuration option\n   *   FT_CONFIG_OPTION_SUBPIXEL_HINTING, selecting version~38 causes an\n   *   `FT_Err_Unimplemented_Feature' error.\n   *\n   */\n#define TT_INTERPRETER_VERSION_35  35\n#define TT_INTERPRETER_VERSION_38  38\n\n\n /* */\n\nFT_END_HEADER\n\n\n#endif /* __FTTTDRV_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fttypes.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  fttypes.h                                                              */\n/*                                                                         */\n/*    FreeType simple types definitions (specification only).              */\n/*                                                                         */\n/*  Copyright 1996-2002, 2004, 2006-2009, 2012, 2013 by                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTTYPES_H__\n#define __FTTYPES_H__\n\n\n#include \"../ft2build.h\"\n#include \"config/ftconfig.h\"\n#include \"ftsystem.h\"\n#include \"ftimage.h\"\n\n#include <stddef.h>\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    basic_types                                                        */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Basic Data Types                                                   */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    The basic data types defined by the library.                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the basic data types defined by FreeType~2,  */\n  /*    ranging from simple scalar types to bitmap descriptors.  More      */\n  /*    font-specific structures are defined in a different section.       */\n  /*                                                                       */\n  /* <Order>                                                               */\n  /*    FT_Byte                                                            */\n  /*    FT_Bytes                                                           */\n  /*    FT_Char                                                            */\n  /*    FT_Int                                                             */\n  /*    FT_UInt                                                            */\n  /*    FT_Int16                                                           */\n  /*    FT_UInt16                                                          */\n  /*    FT_Int32                                                           */\n  /*    FT_UInt32                                                          */\n  /*    FT_Short                                                           */\n  /*    FT_UShort                                                          */\n  /*    FT_Long                                                            */\n  /*    FT_ULong                                                           */\n  /*    FT_Bool                                                            */\n  /*    FT_Offset                                                          */\n  /*    FT_PtrDist                                                         */\n  /*    FT_String                                                          */\n  /*    FT_Tag                                                             */\n  /*    FT_Error                                                           */\n  /*    FT_Fixed                                                           */\n  /*    FT_Pointer                                                         */\n  /*    FT_Pos                                                             */\n  /*    FT_Vector                                                          */\n  /*    FT_BBox                                                            */\n  /*    FT_Matrix                                                          */\n  /*    FT_FWord                                                           */\n  /*    FT_UFWord                                                          */\n  /*    FT_F2Dot14                                                         */\n  /*    FT_UnitVector                                                      */\n  /*    FT_F26Dot6                                                         */\n  /*                                                                       */\n  /*                                                                       */\n  /*    FT_Generic                                                         */\n  /*    FT_Generic_Finalizer                                               */\n  /*                                                                       */\n  /*    FT_Bitmap                                                          */\n  /*    FT_Pixel_Mode                                                      */\n  /*    FT_Palette_Mode                                                    */\n  /*    FT_Glyph_Format                                                    */\n  /*    FT_IMAGE_TAG                                                       */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Bool                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef of unsigned char, used for simple booleans.  As usual,   */\n  /*    values 1 and~0 represent true and false, respectively.             */\n  /*                                                                       */\n  typedef unsigned char  FT_Bool;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_FWord                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A signed 16-bit integer used to store a distance in original font  */\n  /*    units.                                                             */\n  /*                                                                       */\n  typedef signed short  FT_FWord;   /* distance in FUnits */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_UFWord                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An unsigned 16-bit integer used to store a distance in original    */\n  /*    font units.                                                        */\n  /*                                                                       */\n  typedef unsigned short  FT_UFWord;  /* unsigned distance */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Char                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple typedef for the _signed_ char type.                       */\n  /*                                                                       */\n  typedef signed char  FT_Char;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Byte                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple typedef for the _unsigned_ char type.                     */\n  /*                                                                       */\n  typedef unsigned char  FT_Byte;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Bytes                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for constant memory areas.                               */\n  /*                                                                       */\n  typedef const FT_Byte*  FT_Bytes;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Tag                                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for 32-bit tags (as used in the SFNT format).            */\n  /*                                                                       */\n  typedef FT_UInt32  FT_Tag;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_String                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple typedef for the char type, usually used for strings.      */\n  /*                                                                       */\n  typedef char  FT_String;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Short                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for signed short.                                        */\n  /*                                                                       */\n  typedef signed short  FT_Short;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_UShort                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for unsigned short.                                      */\n  /*                                                                       */\n  typedef unsigned short  FT_UShort;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Int                                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for the int type.                                        */\n  /*                                                                       */\n  typedef signed int  FT_Int;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_UInt                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for the unsigned int type.                               */\n  /*                                                                       */\n  typedef unsigned int  FT_UInt;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Long                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for signed long.                                         */\n  /*                                                                       */\n  typedef signed long  FT_Long;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_ULong                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for unsigned long.                                       */\n  /*                                                                       */\n  typedef unsigned long  FT_ULong;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_F2Dot14                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A signed 2.14 fixed-point type used for unit vectors.              */\n  /*                                                                       */\n  typedef signed short  FT_F2Dot14;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_F26Dot6                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A signed 26.6 fixed-point type used for vectorial pixel            */\n  /*    coordinates.                                                       */\n  /*                                                                       */\n  typedef signed long  FT_F26Dot6;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Fixed                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This type is used to store 16.16 fixed-point values, like scaling  */\n  /*    values or matrix coefficients.                                     */\n  /*                                                                       */\n  typedef signed long  FT_Fixed;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Error                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The FreeType error code type.  A value of~0 is always interpreted  */\n  /*    as a successful operation.                                         */\n  /*                                                                       */\n  typedef int  FT_Error;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Pointer                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple typedef for a typeless pointer.                           */\n  /*                                                                       */\n  typedef void*  FT_Pointer;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Offset                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This is equivalent to the ANSI~C `size_t' type, i.e., the largest  */\n  /*    _unsigned_ integer type used to express a file size or position,   */\n  /*    or a memory block size.                                            */\n  /*                                                                       */\n  typedef size_t  FT_Offset;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_PtrDist                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This is equivalent to the ANSI~C `ptrdiff_t' type, i.e., the       */\n  /*    largest _signed_ integer type used to express the distance         */\n  /*    between two pointers.                                              */\n  /*                                                                       */\n  typedef ft_ptrdiff_t  FT_PtrDist;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_UnitVector                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple structure used to store a 2D vector unit vector.  Uses    */\n  /*    FT_F2Dot14 types.                                                  */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    x :: Horizontal coordinate.                                        */\n  /*                                                                       */\n  /*    y :: Vertical coordinate.                                          */\n  /*                                                                       */\n  typedef struct  FT_UnitVector_\n  {\n    FT_F2Dot14  x;\n    FT_F2Dot14  y;\n\n  } FT_UnitVector;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Matrix                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple structure used to store a 2x2 matrix.  Coefficients are   */\n  /*    in 16.16 fixed-point format.  The computation performed is:        */\n  /*                                                                       */\n  /*       {                                                               */\n  /*          x' = x*xx + y*xy                                             */\n  /*          y' = x*yx + y*yy                                             */\n  /*       }                                                               */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    xx :: Matrix coefficient.                                          */\n  /*                                                                       */\n  /*    xy :: Matrix coefficient.                                          */\n  /*                                                                       */\n  /*    yx :: Matrix coefficient.                                          */\n  /*                                                                       */\n  /*    yy :: Matrix coefficient.                                          */\n  /*                                                                       */\n  typedef struct  FT_Matrix_\n  {\n    FT_Fixed  xx, xy;\n    FT_Fixed  yx, yy;\n\n  } FT_Matrix;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Data                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Read-only binary data represented as a pointer and a length.       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    pointer :: The data.                                               */\n  /*                                                                       */\n  /*    length  :: The length of the data in bytes.                        */\n  /*                                                                       */\n  typedef struct  FT_Data_\n  {\n    const FT_Byte*  pointer;\n    FT_Int          length;\n\n  } FT_Data;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Generic_Finalizer                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Describe a function used to destroy the `client' data of any       */\n  /*    FreeType object.  See the description of the @FT_Generic type for  */\n  /*    details of usage.                                                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    The address of the FreeType object which is under finalization.    */\n  /*    Its client data is accessed through its `generic' field.           */\n  /*                                                                       */\n  typedef void  (*FT_Generic_Finalizer)(void*  object);\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Generic                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Client applications often need to associate their own data to a    */\n  /*    variety of FreeType core objects.  For example, a text layout API  */\n  /*    might want to associate a glyph cache to a given size object.      */\n  /*                                                                       */\n  /*    Some FreeType object contains a `generic' field, of type           */\n  /*    FT_Generic, which usage is left to client applications and font    */\n  /*    servers.                                                           */\n  /*                                                                       */\n  /*    It can be used to store a pointer to client-specific data, as well */\n  /*    as the address of a `finalizer' function, which will be called by  */\n  /*    FreeType when the object is destroyed (for example, the previous   */\n  /*    client example would put the address of the glyph cache destructor */\n  /*    in the `finalizer' field).                                         */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    data      :: A typeless pointer to any client-specified data. This */\n  /*                 field is completely ignored by the FreeType library.  */\n  /*                                                                       */\n  /*    finalizer :: A pointer to a `generic finalizer' function, which    */\n  /*                 will be called when the object is destroyed.  If this */\n  /*                 field is set to NULL, no code will be called.         */\n  /*                                                                       */\n  typedef struct  FT_Generic_\n  {\n    void*                 data;\n    FT_Generic_Finalizer  finalizer;\n\n  } FT_Generic;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_MAKE_TAG                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This macro converts four-letter tags which are used to label       */\n  /*    TrueType tables into an unsigned long to be used within FreeType.  */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The produced values *must* be 32-bit integers.  Don't redefine     */\n  /*    this macro.                                                        */\n  /*                                                                       */\n#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \\\n          (FT_Tag)                        \\\n          ( ( (FT_ULong)_x1 << 24 ) |     \\\n            ( (FT_ULong)_x2 << 16 ) |     \\\n            ( (FT_ULong)_x3 <<  8 ) |     \\\n              (FT_ULong)_x4         )\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*                                                                       */\n  /*                    L I S T   M A N A G E M E N T                      */\n  /*                                                                       */\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    list_processing                                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_ListNode                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*     Many elements and objects in FreeType are listed through an       */\n  /*     @FT_List record (see @FT_ListRec).  As its name suggests, an      */\n  /*     FT_ListNode is a handle to a single list element.                 */\n  /*                                                                       */\n  typedef struct FT_ListNodeRec_*  FT_ListNode;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_List                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a list record (see @FT_ListRec).                       */\n  /*                                                                       */\n  typedef struct FT_ListRec_*  FT_List;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_ListNodeRec                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to hold a single list element.                    */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    prev :: The previous element in the list.  NULL if first.          */\n  /*                                                                       */\n  /*    next :: The next element in the list.  NULL if last.               */\n  /*                                                                       */\n  /*    data :: A typeless pointer to the listed object.                   */\n  /*                                                                       */\n  typedef struct  FT_ListNodeRec_\n  {\n    FT_ListNode  prev;\n    FT_ListNode  next;\n    void*        data;\n\n  } FT_ListNodeRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_ListRec                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to hold a simple doubly-linked list.  These are   */\n  /*    used in many parts of FreeType.                                    */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    head :: The head (first element) of doubly-linked list.            */\n  /*                                                                       */\n  /*    tail :: The tail (last element) of doubly-linked list.             */\n  /*                                                                       */\n  typedef struct  FT_ListRec_\n  {\n    FT_ListNode  head;\n    FT_ListNode  tail;\n\n  } FT_ListRec;\n\n\n  /* */\n\n#define FT_IS_EMPTY( list )  ( (list).head == 0 )\n#define FT_BOOL( x )  ( (FT_Bool)( x ) )\n\n  /* concatenate C tokens */\n#define FT_ERR_XCAT( x, y )  x ## y\n#define FT_ERR_CAT( x, y )   FT_ERR_XCAT( x, y )\n\n  /* see `ftmoderr.h' for descriptions of the following macros */\n\n#define FT_ERR( e )  FT_ERR_CAT( FT_ERR_PREFIX, e )\n\n#define FT_ERROR_BASE( x )    ( (x) & 0xFF )\n#define FT_ERROR_MODULE( x )  ( (x) & 0xFF00U )\n\n#define FT_ERR_EQ( x, e )                                        \\\n          ( FT_ERROR_BASE( x ) == FT_ERROR_BASE( FT_ERR( e ) ) )\n#define FT_ERR_NEQ( x, e )                                       \\\n          ( FT_ERROR_BASE( x ) != FT_ERROR_BASE( FT_ERR( e ) ) )\n\n\nFT_END_HEADER\n\n#endif /* __FTTYPES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftwinfnt.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftwinfnt.h                                                             */\n/*                                                                         */\n/*    FreeType API for accessing Windows fnt-specific data.                */\n/*                                                                         */\n/*  Copyright 2003, 2004, 2008 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTWINFNT_H__\n#define __FTWINFNT_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    winfnt_fonts                                                       */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Window FNT Files                                                   */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Windows FNT specific API.                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of Windows FNT specific      */\n  /*    functions.                                                         */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************\n   *\n   * @enum:\n   *   FT_WinFNT_ID_XXX\n   *\n   * @description:\n   *   A list of valid values for the `charset' byte in\n   *   @FT_WinFNT_HeaderRec.  Exact mapping tables for the various cpXXXX\n   *   encodings (except for cp1361) can be found at ftp://ftp.unicode.org\n   *   in the MAPPINGS/VENDORS/MICSFT/WINDOWS subdirectory.  cp1361 is\n   *   roughly a superset of MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT.\n   *\n   * @values:\n   *   FT_WinFNT_ID_DEFAULT ::\n   *     This is used for font enumeration and font creation as a\n   *     `don't care' value.  Valid font files don't contain this value.\n   *     When querying for information about the character set of the font\n   *     that is currently selected into a specified device context, this\n   *     return value (of the related Windows API) simply denotes failure.\n   *\n   *   FT_WinFNT_ID_SYMBOL ::\n   *     There is no known mapping table available.\n   *\n   *   FT_WinFNT_ID_MAC ::\n   *     Mac Roman encoding.\n   *\n   *   FT_WinFNT_ID_OEM ::\n   *     From Michael Pöttgen <michael@poettgen.de>:\n   *\n   *       The `Windows Font Mapping' article says that FT_WinFNT_ID_OEM\n   *       is used for the charset of vector fonts, like `modern.fon',\n   *       `roman.fon', and `script.fon' on Windows.\n   *\n   *       The `CreateFont' documentation says: The FT_WinFNT_ID_OEM value\n   *       specifies a character set that is operating-system dependent.\n   *\n   *       The `IFIMETRICS' documentation from the `Windows Driver\n   *       Development Kit' says: This font supports an OEM-specific\n   *       character set.  The OEM character set is system dependent.\n   *\n   *       In general OEM, as opposed to ANSI (i.e., cp1252), denotes the\n   *       second default codepage that most international versions of\n   *       Windows have.  It is one of the OEM codepages from\n   *\n   *         http://www.microsoft.com/globaldev/reference/cphome.mspx,\n   *\n   *       and is used for the `DOS boxes', to support legacy applications.\n   *       A German Windows version for example usually uses ANSI codepage\n   *       1252 and OEM codepage 850.\n   *\n   *   FT_WinFNT_ID_CP874 ::\n   *     A superset of Thai TIS 620 and ISO 8859-11.\n   *\n   *   FT_WinFNT_ID_CP932 ::\n   *     A superset of Japanese Shift-JIS (with minor deviations).\n   *\n   *   FT_WinFNT_ID_CP936 ::\n   *     A superset of simplified Chinese GB 2312-1980 (with different\n   *     ordering and minor deviations).\n   *\n   *   FT_WinFNT_ID_CP949 ::\n   *     A superset of Korean Hangul KS~C 5601-1987 (with different\n   *     ordering and minor deviations).\n   *\n   *   FT_WinFNT_ID_CP950 ::\n   *     A superset of traditional Chinese Big~5 ETen (with different\n   *     ordering and minor deviations).\n   *\n   *   FT_WinFNT_ID_CP1250 ::\n   *     A superset of East European ISO 8859-2 (with slightly different\n   *     ordering).\n   *\n   *   FT_WinFNT_ID_CP1251 ::\n   *     A superset of Russian ISO 8859-5 (with different ordering).\n   *\n   *   FT_WinFNT_ID_CP1252 ::\n   *     ANSI encoding.  A superset of ISO 8859-1.\n   *\n   *   FT_WinFNT_ID_CP1253 ::\n   *     A superset of Greek ISO 8859-7 (with minor modifications).\n   *\n   *   FT_WinFNT_ID_CP1254 ::\n   *     A superset of Turkish ISO 8859-9.\n   *\n   *   FT_WinFNT_ID_CP1255 ::\n   *     A superset of Hebrew ISO 8859-8 (with some modifications).\n   *\n   *   FT_WinFNT_ID_CP1256 ::\n   *     A superset of Arabic ISO 8859-6 (with different ordering).\n   *\n   *   FT_WinFNT_ID_CP1257 ::\n   *     A superset of Baltic ISO 8859-13 (with some deviations).\n   *\n   *   FT_WinFNT_ID_CP1258 ::\n   *     For Vietnamese.  This encoding doesn't cover all necessary\n   *     characters.\n   *\n   *   FT_WinFNT_ID_CP1361 ::\n   *     Korean (Johab).\n   */\n\n#define FT_WinFNT_ID_CP1252    0\n#define FT_WinFNT_ID_DEFAULT   1\n#define FT_WinFNT_ID_SYMBOL    2\n#define FT_WinFNT_ID_MAC      77\n#define FT_WinFNT_ID_CP932   128\n#define FT_WinFNT_ID_CP949   129\n#define FT_WinFNT_ID_CP1361  130\n#define FT_WinFNT_ID_CP936   134\n#define FT_WinFNT_ID_CP950   136\n#define FT_WinFNT_ID_CP1253  161\n#define FT_WinFNT_ID_CP1254  162\n#define FT_WinFNT_ID_CP1258  163\n#define FT_WinFNT_ID_CP1255  177\n#define FT_WinFNT_ID_CP1256  178\n#define FT_WinFNT_ID_CP1257  186\n#define FT_WinFNT_ID_CP1251  204\n#define FT_WinFNT_ID_CP874   222\n#define FT_WinFNT_ID_CP1250  238\n#define FT_WinFNT_ID_OEM     255\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_WinFNT_HeaderRec                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Windows FNT Header info.                                           */\n  /*                                                                       */\n  typedef struct  FT_WinFNT_HeaderRec_\n  {\n    FT_UShort  version;\n    FT_ULong   file_size;\n    FT_Byte    copyright[60];\n    FT_UShort  file_type;\n    FT_UShort  nominal_point_size;\n    FT_UShort  vertical_resolution;\n    FT_UShort  horizontal_resolution;\n    FT_UShort  ascent;\n    FT_UShort  internal_leading;\n    FT_UShort  external_leading;\n    FT_Byte    italic;\n    FT_Byte    underline;\n    FT_Byte    strike_out;\n    FT_UShort  weight;\n    FT_Byte    charset;\n    FT_UShort  pixel_width;\n    FT_UShort  pixel_height;\n    FT_Byte    pitch_and_family;\n    FT_UShort  avg_width;\n    FT_UShort  max_width;\n    FT_Byte    first_char;\n    FT_Byte    last_char;\n    FT_Byte    default_char;\n    FT_Byte    break_char;\n    FT_UShort  bytes_per_row;\n    FT_ULong   device_offset;\n    FT_ULong   face_name_offset;\n    FT_ULong   bits_pointer;\n    FT_ULong   bits_offset;\n    FT_Byte    reserved;\n    FT_ULong   flags;\n    FT_UShort  A_space;\n    FT_UShort  B_space;\n    FT_UShort  C_space;\n    FT_UShort  color_table_offset;\n    FT_ULong   reserved1[4];\n\n  } FT_WinFNT_HeaderRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_WinFNT_Header                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to an @FT_WinFNT_HeaderRec structure.                     */\n  /*                                                                       */\n  typedef struct FT_WinFNT_HeaderRec_*  FT_WinFNT_Header;\n\n\n  /**********************************************************************\n   *\n   * @function:\n   *    FT_Get_WinFNT_Header\n   *\n   * @description:\n   *    Retrieve a Windows FNT font info header.\n   *\n   * @input:\n   *    face    :: A handle to the input face.\n   *\n   * @output:\n   *    aheader :: The WinFNT header.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   This function only works with Windows FNT faces, returning an error\n   *   otherwise.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Get_WinFNT_Header( FT_Face               face,\n                        FT_WinFNT_HeaderRec  *aheader );\n\n\n  /* */\n\nFT_END_HEADER\n\n#endif /* __FTWINFNT_H__ */\n\n\n/* END */\n\n\n/* Local Variables: */\n/* coding: utf-8    */\n/* End:             */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftxf86.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftxf86.h                                                               */\n/*                                                                         */\n/*    Support functions for X11.                                           */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2004, 2006, 2007 by                              */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTXF86_H__\n#define __FTXF86_H__\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*   font_formats                                                        */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*   Font Formats                                                        */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*   Getting the font format.                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*   The single function in this section can be used to get the font     */\n  /*   format.  Note that this information is not needed normally;         */\n  /*   however, there are special cases (like in PDF devices) where it is  */\n  /*   important to differentiate, in spite of FreeType's uniform API.     */\n  /*                                                                       */\n  /*   This function is in the X11/xf86 namespace for historical reasons   */\n  /*   and in no way depends on that windowing system.                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*   FT_Get_X11_Font_Format                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*   Return a string describing the format of a given face, using values */\n  /*   which can be used as an X11 FONT_PROPERTY.  Possible values are     */\n  /*   `TrueType', `Type~1', `BDF', `PCF', `Type~42', `CID~Type~1', `CFF', */\n  /*   `PFR', and `Windows~FNT'.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*   face ::                                                             */\n  /*     Input face handle.                                                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*   Font format string.  NULL in case of error.                         */\n  /*                                                                       */\n  FT_EXPORT( const char* )\n  FT_Get_X11_Font_Format( FT_Face  face );\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FTXF86_H__ */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/autohint.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  autohint.h                                                             */\n/*                                                                         */\n/*    High-level `autohint' module-specific interface (specification).     */\n/*                                                                         */\n/*  Copyright 1996-2002, 2007, 2009, 2012 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The auto-hinter is used to load and automatically hint glyphs if a    */\n  /* format-specific hinter isn't available.                               */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __AUTOHINT_H__\n#define __AUTOHINT_H__\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* A small technical note regarding automatic hinting in order to        */\n  /* clarify this module interface.                                        */\n  /*                                                                       */\n  /* An automatic hinter might compute two kinds of data for a given face: */\n  /*                                                                       */\n  /* - global hints: Usually some metrics that describe global properties  */\n  /*                 of the face.  It is computed by scanning more or less */\n  /*                 aggressively the glyphs in the face, and thus can be  */\n  /*                 very slow to compute (even if the size of global      */\n  /*                 hints is really small).                               */\n  /*                                                                       */\n  /* - glyph hints:  These describe some important features of the glyph   */\n  /*                 outline, as well as how to align them.  They are      */\n  /*                 generally much faster to compute than global hints.   */\n  /*                                                                       */\n  /* The current FreeType auto-hinter does a pretty good job while         */\n  /* performing fast computations for both global and glyph hints.         */\n  /* However, we might be interested in introducing more complex and       */\n  /* powerful algorithms in the future, like the one described in the John */\n  /* D. Hobby paper, which unfortunately requires a lot more horsepower.   */\n  /*                                                                       */\n  /* Because a sufficiently sophisticated font management system would     */\n  /* typically implement an LRU cache of opened face objects to reduce     */\n  /* memory usage, it is a good idea to be able to avoid recomputing       */\n  /* global hints every time the same face is re-opened.                   */\n  /*                                                                       */\n  /* We thus provide the ability to cache global hints outside of the face */\n  /* object, in order to speed up font re-opening time.  Of course, this   */\n  /* feature is purely optional, so most client programs won't even notice */\n  /* it.                                                                   */\n  /*                                                                       */\n  /* I initially thought that it would be a good idea to cache the glyph   */\n  /* hints too.  However, my general idea now is that if you really need   */\n  /* to cache these too, you are simply in need of a new font format,      */\n  /* where all this information could be stored within the font file and   */\n  /* decoded on the fly.                                                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#include \"../../ft2build.h\"\n#include \"../freetype.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  typedef struct FT_AutoHinterRec_  *FT_AutoHinter;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_AutoHinter_GlobalGetFunc                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the global hints computed for a given face object.  The   */\n  /*    resulting data is dissociated from the face and will survive a     */\n  /*    call to FT_Done_Face().  It must be discarded through the API      */\n  /*    FT_AutoHinter_GlobalDoneFunc().                                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    hinter       :: A handle to the source auto-hinter.                */\n  /*                                                                       */\n  /*    face         :: A handle to the source face object.                */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    global_hints :: A typeless pointer to the global hints.            */\n  /*                                                                       */\n  /*    global_len   :: The size in bytes of the global hints.             */\n  /*                                                                       */\n  typedef void\n  (*FT_AutoHinter_GlobalGetFunc)( FT_AutoHinter  hinter,\n                                  FT_Face        face,\n                                  void**         global_hints,\n                                  long*          global_len );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_AutoHinter_GlobalDoneFunc                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Discard the global hints retrieved through                         */\n  /*    FT_AutoHinter_GlobalGetFunc().  This is the only way these hints   */\n  /*    are freed from memory.                                             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    hinter :: A handle to the auto-hinter module.                      */\n  /*                                                                       */\n  /*    global :: A pointer to retrieved global hints to discard.          */\n  /*                                                                       */\n  typedef void\n  (*FT_AutoHinter_GlobalDoneFunc)( FT_AutoHinter  hinter,\n                                   void*          global );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_AutoHinter_GlobalResetFunc                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function is used to recompute the global metrics in a given   */\n  /*    font.  This is useful when global font data changes (e.g. Multiple */\n  /*    Masters fonts where blend coordinates change).                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    hinter :: A handle to the source auto-hinter.                      */\n  /*                                                                       */\n  /*    face   :: A handle to the face.                                    */\n  /*                                                                       */\n  typedef void\n  (*FT_AutoHinter_GlobalResetFunc)( FT_AutoHinter  hinter,\n                                    FT_Face        face );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_AutoHinter_GlyphLoadFunc                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function is used to load, scale, and automatically hint a     */\n  /*    glyph from a given face.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face        :: A handle to the face.                               */\n  /*                                                                       */\n  /*    glyph_index :: The glyph index.                                    */\n  /*                                                                       */\n  /*    load_flags  :: The load flags.                                     */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function is capable of loading composite glyphs by hinting    */\n  /*    each sub-glyph independently (which improves quality).             */\n  /*                                                                       */\n  /*    It will call the font driver with @FT_Load_Glyph, with             */\n  /*    @FT_LOAD_NO_SCALE set.                                             */\n  /*                                                                       */\n  typedef FT_Error\n  (*FT_AutoHinter_GlyphLoadFunc)( FT_AutoHinter  hinter,\n                                  FT_GlyphSlot   slot,\n                                  FT_Size        size,\n                                  FT_UInt        glyph_index,\n                                  FT_Int32       load_flags );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_AutoHinter_InterfaceRec                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The auto-hinter module's interface.                                */\n  /*                                                                       */\n  typedef struct  FT_AutoHinter_InterfaceRec_\n  {\n    FT_AutoHinter_GlobalResetFunc  reset_face;\n    FT_AutoHinter_GlobalGetFunc    get_global_hints;\n    FT_AutoHinter_GlobalDoneFunc   done_global_hints;\n    FT_AutoHinter_GlyphLoadFunc    load_glyph;\n\n  } FT_AutoHinter_InterfaceRec, *FT_AutoHinter_Interface;\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_AUTOHINTER_INTERFACE(       \\\n          class_,                             \\\n          reset_face_,                        \\\n          get_global_hints_,                  \\\n          done_global_hints_,                 \\\n          load_glyph_ )                       \\\n  FT_CALLBACK_TABLE_DEF                       \\\n  const FT_AutoHinter_InterfaceRec  class_ =  \\\n  {                                           \\\n    reset_face_,                              \\\n    get_global_hints_,                        \\\n    done_global_hints_,                       \\\n    load_glyph_                               \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_AUTOHINTER_INTERFACE(                            \\\n          class_,                                                  \\\n          reset_face_,                                             \\\n          get_global_hints_,                                       \\\n          done_global_hints_,                                      \\\n          load_glyph_ )                                            \\\n  void                                                             \\\n  FT_Init_Class_ ## class_( FT_Library                   library,  \\\n                            FT_AutoHinter_InterfaceRec*  clazz )   \\\n  {                                                                \\\n    FT_UNUSED( library );                                          \\\n                                                                   \\\n    clazz->reset_face        = reset_face_;                        \\\n    clazz->get_global_hints  = get_global_hints_;                  \\\n    clazz->done_global_hints = done_global_hints_;                 \\\n    clazz->load_glyph        = load_glyph_;                        \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\nFT_END_HEADER\n\n#endif /* __AUTOHINT_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftcalc.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcalc.h                                                               */\n/*                                                                         */\n/*    Arithmetic computations (specification).                             */\n/*                                                                         */\n/*  Copyright 1996-2006, 2008, 2009, 2012-2013 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTCALC_H__\n#define __FTCALC_H__\n\n\n#include \"../../ft2build.h\"\n#include \"../freetype.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_FixedSqrt                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Computes the square root of a 16.16 fixed-point value.             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    x :: The value to compute the root for.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result of `sqrt(x)'.                                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function is not very fast.                                    */\n  /*                                                                       */\n  FT_BASE( FT_Int32 )\n  FT_SqrtFixed( FT_Int32  x );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* FT_MulDiv() and FT_MulFix() are declared in freetype.h.               */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_MulDiv_No_Round                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A very simple function used to perform the computation `(a*b)/c'   */\n  /*    (without rounding) with maximum accuracy (it uses a 64-bit         */\n  /*    intermediate integer whenever necessary).                          */\n  /*                                                                       */\n  /*    This function isn't necessarily as fast as some processor specific */\n  /*    operations, but is at least completely portable.                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    a :: The first multiplier.                                         */\n  /*    b :: The second multiplier.                                        */\n  /*    c :: The divisor.                                                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result of `(a*b)/c'.  This function never traps when trying to */\n  /*    divide by zero; it simply returns `MaxInt' or `MinInt' depending   */\n  /*    on the signs of `a' and `b'.                                       */\n  /*                                                                       */\n  FT_BASE( FT_Long )\n  FT_MulDiv_No_Round( FT_Long  a,\n                      FT_Long  b,\n                      FT_Long  c );\n\n\n  /*\n   *  A variant of FT_Matrix_Multiply which scales its result afterwards.\n   *  The idea is that both `a' and `b' are scaled by factors of 10 so that\n   *  the values are as precise as possible to get a correct result during\n   *  the 64bit multiplication.  Let `sa' and `sb' be the scaling factors of\n   *  `a' and `b', respectively, then the scaling factor of the result is\n   *  `sa*sb'.\n   */\n  FT_BASE( void )\n  FT_Matrix_Multiply_Scaled( const FT_Matrix*  a,\n                             FT_Matrix        *b,\n                             FT_Long           scaling );\n\n\n  /*\n   *  A variant of FT_Vector_Transform.  See comments for\n   *  FT_Matrix_Multiply_Scaled.\n   */\n  FT_BASE( void )\n  FT_Vector_Transform_Scaled( FT_Vector*        vector,\n                              const FT_Matrix*  matrix,\n                              FT_Long           scaling );\n\n\n  /*\n   *  Return -1, 0, or +1, depending on the orientation of a given corner.\n   *  We use the Cartesian coordinate system, with positive vertical values\n   *  going upwards.  The function returns +1 if the corner turns to the\n   *  left, -1 to the right, and 0 for undecidable cases.\n   */\n  FT_BASE( FT_Int )\n  ft_corner_orientation( FT_Pos  in_x,\n                         FT_Pos  in_y,\n                         FT_Pos  out_x,\n                         FT_Pos  out_y );\n\n  /*\n   *  Return TRUE if a corner is flat or nearly flat.  This is equivalent to\n   *  saying that the angle difference between the `in' and `out' vectors is\n   *  very small.\n   */\n  FT_BASE( FT_Int )\n  ft_corner_is_flat( FT_Pos  in_x,\n                     FT_Pos  in_y,\n                     FT_Pos  out_x,\n                     FT_Pos  out_y );\n\n\n  /*\n   *  Return the most significant bit index.\n   */\n  FT_BASE( FT_Int )\n  FT_MSB( FT_UInt32  z );\n\n\n  /*\n   *  Return sqrt(x*x+y*y), which is the same as `FT_Vector_Length' but uses\n   *  two fixed-point arguments instead.\n   */\n  FT_BASE( FT_Fixed )\n  FT_Hypot( FT_Fixed  x,\n            FT_Fixed  y );\n\n\n#define INT_TO_F26DOT6( x )    ( (FT_Long)(x) << 6  )\n#define INT_TO_F2DOT14( x )    ( (FT_Long)(x) << 14 )\n#define INT_TO_FIXED( x )      ( (FT_Long)(x) << 16 )\n#define F2DOT14_TO_FIXED( x )  ( (FT_Long)(x) << 2  )\n#define FLOAT_TO_FIXED( x )    ( (FT_Long)( x * 65536.0 ) )\n#define FIXED_TO_INT( x )      ( FT_RoundFix( x ) >> 16 )\n\n#define ROUND_F26DOT6( x )     ( x >= 0 ? (    ( (x) + 32 ) & -64 )     \\\n                                        : ( -( ( 32 - (x) ) & -64 ) ) )\n\n\nFT_END_HEADER\n\n#endif /* __FTCALC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftdebug.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftdebug.h                                                              */\n/*                                                                         */\n/*    Debugging and logging component (specification).                     */\n/*                                                                         */\n/*  Copyright 1996-2002, 2004, 2006-2009, 2013 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/*                                                                         */\n/*  IMPORTANT: A description of FreeType's debugging support can be        */\n/*             found in `docs/DEBUG.TXT'.  Read it if you need to use or   */\n/*             understand this code.                                       */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTDEBUG_H__\n#define __FTDEBUG_H__\n\n\n#include \"../../ft2build.h\"\n#include \"../config/ftconfig.h\"\n#include \"../freetype.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /* force the definition of FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE */\n  /* is already defined; this simplifies the following #ifdefs            */\n  /*                                                                      */\n#ifdef FT_DEBUG_LEVEL_TRACE\n#undef  FT_DEBUG_LEVEL_ERROR\n#define FT_DEBUG_LEVEL_ERROR\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define the trace enums as well as the trace levels array when they    */\n  /* are needed.                                                           */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n#define FT_TRACE_DEF( x )  trace_ ## x ,\n\n  /* defining the enumeration */\n  typedef enum  FT_Trace_\n  {\n#include \"fttrace.h\"\n    trace_count\n\n  } FT_Trace;\n\n\n  /* defining the array of trace levels, provided by `src/base/ftdebug.c' */\n  extern int  ft_trace_levels[trace_count];\n\n#undef FT_TRACE_DEF\n\n#endif /* FT_DEBUG_LEVEL_TRACE */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define the FT_TRACE macro                                             */\n  /*                                                                       */\n  /* IMPORTANT!                                                            */\n  /*                                                                       */\n  /* Each component must define the macro FT_COMPONENT to a valid FT_Trace */\n  /* value before using any TRACE macro.                                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n#define FT_TRACE( level, varformat )                      \\\n          do                                              \\\n          {                                               \\\n            if ( ft_trace_levels[FT_COMPONENT] >= level ) \\\n              FT_Message varformat;                       \\\n          } while ( 0 )\n\n#else /* !FT_DEBUG_LEVEL_TRACE */\n\n#define FT_TRACE( level, varformat )  do { } while ( 0 )      /* nothing */\n\n#endif /* !FT_DEBUG_LEVEL_TRACE */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Trace_Get_Count                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the number of available trace components.                   */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The number of trace components.  0 if FreeType 2 is not built with */\n  /*    FT_DEBUG_LEVEL_TRACE definition.                                   */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function may be useful if you want to access elements of      */\n  /*    the internal `ft_trace_levels' array by an index.                  */\n  /*                                                                       */\n  FT_BASE( FT_Int )\n  FT_Trace_Get_Count( void );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Trace_Get_Name                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the name of a trace component.                              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    The index of the trace component.                                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The name of the trace component.  This is a statically allocated   */\n  /*    C string, so do not free it after use.  NULL if FreeType 2 is not  */\n  /*    built with FT_DEBUG_LEVEL_TRACE definition.                        */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Use @FT_Trace_Get_Count to get the number of available trace       */\n  /*    components.                                                        */\n  /*                                                                       */\n  /*    This function may be useful if you want to control FreeType 2's    */\n  /*    debug level in your application.                                   */\n  /*                                                                       */\n  FT_BASE( const char * )\n  FT_Trace_Get_Name( FT_Int  idx );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* You need two opening and closing parentheses!                         */\n  /*                                                                       */\n  /* Example: FT_TRACE0(( \"Value is %i\", foo ))                            */\n  /*                                                                       */\n  /* Output of the FT_TRACEX macros is sent to stderr.                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n#define FT_TRACE0( varformat )  FT_TRACE( 0, varformat )\n#define FT_TRACE1( varformat )  FT_TRACE( 1, varformat )\n#define FT_TRACE2( varformat )  FT_TRACE( 2, varformat )\n#define FT_TRACE3( varformat )  FT_TRACE( 3, varformat )\n#define FT_TRACE4( varformat )  FT_TRACE( 4, varformat )\n#define FT_TRACE5( varformat )  FT_TRACE( 5, varformat )\n#define FT_TRACE6( varformat )  FT_TRACE( 6, varformat )\n#define FT_TRACE7( varformat )  FT_TRACE( 7, varformat )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define the FT_ERROR macro.                                            */\n  /*                                                                       */\n  /* Output of this macro is sent to stderr.                               */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifdef FT_DEBUG_LEVEL_ERROR\n\n#define FT_ERROR( varformat )  FT_Message  varformat\n\n#else  /* !FT_DEBUG_LEVEL_ERROR */\n\n#define FT_ERROR( varformat )  do { } while ( 0 )      /* nothing */\n\n#endif /* !FT_DEBUG_LEVEL_ERROR */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define the FT_ASSERT and FT_THROW macros.  The call to `FT_Throw'     */\n  /* makes it possible to easily set a breakpoint at this function.        */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifdef FT_DEBUG_LEVEL_ERROR\n\n#define FT_ASSERT( condition )                                      \\\n          do                                                        \\\n          {                                                         \\\n            if ( !( condition ) )                                   \\\n              FT_Panic( \"assertion failed on line %d of file %s\\n\", \\\n                        __LINE__, __FILE__ );                       \\\n          } while ( 0 )\n\n#define FT_THROW( e )                                   \\\n          ( FT_Throw( FT_ERR_CAT( FT_ERR_PREFIX, e ),   \\\n                      __LINE__,                         \\\n                      __FILE__ )                      | \\\n            FT_ERR_CAT( FT_ERR_PREFIX, e )            )\n\n#else /* !FT_DEBUG_LEVEL_ERROR */\n\n#define FT_ASSERT( condition )  do { } while ( 0 )\n\n#define FT_THROW( e )  FT_ERR_CAT( FT_ERR_PREFIX, e )\n\n#endif /* !FT_DEBUG_LEVEL_ERROR */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define `FT_Message' and `FT_Panic' when needed.                       */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifdef FT_DEBUG_LEVEL_ERROR\n\n#include \"stdio.h\"  /* for vfprintf() */\n\n  /* print a message */\n  FT_BASE( void )\n  FT_Message( const char*  fmt,\n              ... );\n\n  /* print a message and exit */\n  FT_BASE( void )\n  FT_Panic( const char*  fmt,\n            ... );\n\n  /* report file name and line number of an error */\n  FT_BASE( int )\n  FT_Throw( FT_Error     error,\n            int          line,\n            const char*  file );\n\n#endif /* FT_DEBUG_LEVEL_ERROR */\n\n\n  FT_BASE( void )\n  ft_debug_init( void );\n\nFT_END_HEADER\n\n#endif /* __FTDEBUG_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftdriver.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftdriver.h                                                             */\n/*                                                                         */\n/*    FreeType font driver interface (specification).                      */\n/*                                                                         */\n/*  Copyright 1996-2003, 2006, 2008, 2011-2013 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTDRIVER_H__\n#define __FTDRIVER_H__\n\n\n#include \"../../ft2build.h\"\n#include \"../ftmodapi.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  typedef FT_Error\n  (*FT_Face_InitFunc)( FT_Stream      stream,\n                       FT_Face        face,\n                       FT_Int         typeface_index,\n                       FT_Int         num_params,\n                       FT_Parameter*  parameters );\n\n  typedef void\n  (*FT_Face_DoneFunc)( FT_Face  face );\n\n\n  typedef FT_Error\n  (*FT_Size_InitFunc)( FT_Size  size );\n\n  typedef void\n  (*FT_Size_DoneFunc)( FT_Size  size );\n\n\n  typedef FT_Error\n  (*FT_Slot_InitFunc)( FT_GlyphSlot  slot );\n\n  typedef void\n  (*FT_Slot_DoneFunc)( FT_GlyphSlot  slot );\n\n\n  typedef FT_Error\n  (*FT_Size_RequestFunc)( FT_Size          size,\n                          FT_Size_Request  req );\n\n  typedef FT_Error\n  (*FT_Size_SelectFunc)( FT_Size   size,\n                         FT_ULong  size_index );\n\n  typedef FT_Error\n  (*FT_Slot_LoadFunc)( FT_GlyphSlot  slot,\n                       FT_Size       size,\n                       FT_UInt       glyph_index,\n                       FT_Int32      load_flags );\n\n\n  typedef FT_UInt\n  (*FT_CharMap_CharIndexFunc)( FT_CharMap  charmap,\n                               FT_Long     charcode );\n\n  typedef FT_Long\n  (*FT_CharMap_CharNextFunc)( FT_CharMap  charmap,\n                              FT_Long     charcode );\n\n\n  typedef FT_Error\n  (*FT_Face_GetKerningFunc)( FT_Face     face,\n                             FT_UInt     left_glyph,\n                             FT_UInt     right_glyph,\n                             FT_Vector*  kerning );\n\n\n  typedef FT_Error\n  (*FT_Face_AttachFunc)( FT_Face    face,\n                         FT_Stream  stream );\n\n\n  typedef FT_Error\n  (*FT_Face_GetAdvancesFunc)( FT_Face    face,\n                              FT_UInt    first,\n                              FT_UInt    count,\n                              FT_Int32   flags,\n                              FT_Fixed*  advances );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Driver_ClassRec                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The font driver class.  This structure mostly contains pointers to */\n  /*    driver methods.                                                    */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    root             :: The parent module.                             */\n  /*                                                                       */\n  /*    face_object_size :: The size of a face object in bytes.            */\n  /*                                                                       */\n  /*    size_object_size :: The size of a size object in bytes.            */\n  /*                                                                       */\n  /*    slot_object_size :: The size of a glyph object in bytes.           */\n  /*                                                                       */\n  /*    init_face        :: The format-specific face constructor.          */\n  /*                                                                       */\n  /*    done_face        :: The format-specific face destructor.           */\n  /*                                                                       */\n  /*    init_size        :: The format-specific size constructor.          */\n  /*                                                                       */\n  /*    done_size        :: The format-specific size destructor.           */\n  /*                                                                       */\n  /*    init_slot        :: The format-specific slot constructor.          */\n  /*                                                                       */\n  /*    done_slot        :: The format-specific slot destructor.           */\n  /*                                                                       */\n  /*                                                                       */\n  /*    load_glyph       :: A function handle to load a glyph to a slot.   */\n  /*                        This field is mandatory!                       */\n  /*                                                                       */\n  /*    get_kerning      :: A function handle to return the unscaled       */\n  /*                        kerning for a given pair of glyphs.  Can be    */\n  /*                        set to 0 if the format doesn't support         */\n  /*                        kerning.                                       */\n  /*                                                                       */\n  /*    attach_file      :: This function handle is used to read           */\n  /*                        additional data for a face from another        */\n  /*                        file/stream.  For example, this can be used to */\n  /*                        add data from AFM or PFM files on a Type 1     */\n  /*                        face, or a CIDMap on a CID-keyed face.         */\n  /*                                                                       */\n  /*    get_advances     :: A function handle used to return advance       */\n  /*                        widths of `count' glyphs (in font units),      */\n  /*                        starting at `first'.  The `vertical' flag must */\n  /*                        be set to get vertical advance heights.  The   */\n  /*                        `advances' buffer is caller-allocated.         */\n  /*                        The idea of this function is to be able to     */\n  /*                        perform device-independent text layout without */\n  /*                        loading a single glyph image.                  */\n  /*                                                                       */\n  /*    request_size     :: A handle to a function used to request the new */\n  /*                        character size.  Can be set to 0 if the        */\n  /*                        scaling done in the base layer suffices.       */\n  /*                                                                       */\n  /*    select_size      :: A handle to a function used to select a new    */\n  /*                        fixed size.  It is used only if                */\n  /*                        @FT_FACE_FLAG_FIXED_SIZES is set.  Can be set  */\n  /*                        to 0 if the scaling done in the base layer     */\n  /*                        suffices.                                      */\n  /* <Note>                                                                */\n  /*    Most function pointers, with the exception of `load_glyph', can be */\n  /*    set to 0 to indicate a default behaviour.                          */\n  /*                                                                       */\n  typedef struct  FT_Driver_ClassRec_\n  {\n    FT_Module_Class          root;\n\n    FT_Long                  face_object_size;\n    FT_Long                  size_object_size;\n    FT_Long                  slot_object_size;\n\n    FT_Face_InitFunc         init_face;\n    FT_Face_DoneFunc         done_face;\n\n    FT_Size_InitFunc         init_size;\n    FT_Size_DoneFunc         done_size;\n\n    FT_Slot_InitFunc         init_slot;\n    FT_Slot_DoneFunc         done_slot;\n\n    FT_Slot_LoadFunc         load_glyph;\n\n    FT_Face_GetKerningFunc   get_kerning;\n    FT_Face_AttachFunc       attach_file;\n    FT_Face_GetAdvancesFunc  get_advances;\n\n    /* since version 2.2 */\n    FT_Size_RequestFunc      request_size;\n    FT_Size_SelectFunc       select_size;\n\n  } FT_Driver_ClassRec, *FT_Driver_Class;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DECLARE_DRIVER                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to create a forward declaration of an FT_Driver_ClassRec      */\n  /*    struct instance.                                                   */\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DEFINE_DRIVER                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to initialize an instance of FT_Driver_ClassRec struct.       */\n  /*                                                                       */\n  /*    When FT_CONFIG_OPTION_PIC is defined a `create' function has to be */\n  /*    called with a pointer where the allocated structure is returned.   */\n  /*    And when it is no longer needed a `destroy' function needs to be   */\n  /*    called to release that allocation.                                 */\n  /*                                                                       */\n  /*    `fcinit.c' (ft_create_default_module_classes) already contains a   */\n  /*    mechanism to call these functions for the default modules          */\n  /*    described in `ftmodule.h'.                                         */\n  /*                                                                       */\n  /*    Notice that the created `create' and `destroy' functions call      */\n  /*    `pic_init' and `pic_free' to allow you to manually allocate and    */\n  /*    initialize any additional global data, like a module specific      */\n  /*    interface, and put them in the global pic container defined in     */\n  /*    `ftpic.h'.  If you don't need them just implement the functions as */\n  /*    empty to resolve the link error.  Also the `pic_init' and          */\n  /*    `pic_free' functions should be declared in `pic.h', to be referred */\n  /*    by driver definition calling `FT_DEFINE_DRIVER' in following.      */\n  /*                                                                       */\n  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */\n  /*    allocated in the global scope (or the scope where the macro is     */\n  /*    used).                                                             */\n  /*                                                                       */\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DECLARE_DRIVER( class_ )  \\\n  FT_CALLBACK_TABLE                  \\\n  const FT_Driver_ClassRec  class_;\n\n#define FT_DEFINE_DRIVER(                    \\\n          class_,                            \\\n          flags_,                            \\\n          size_,                             \\\n          name_,                             \\\n          version_,                          \\\n          requires_,                         \\\n          interface_,                        \\\n          init_,                             \\\n          done_,                             \\\n          get_interface_,                    \\\n          face_object_size_,                 \\\n          size_object_size_,                 \\\n          slot_object_size_,                 \\\n          init_face_,                        \\\n          done_face_,                        \\\n          init_size_,                        \\\n          done_size_,                        \\\n          init_slot_,                        \\\n          done_slot_,                        \\\n          load_glyph_,                       \\\n          get_kerning_,                      \\\n          attach_file_,                      \\\n          get_advances_,                     \\\n          request_size_,                     \\\n          select_size_ )                     \\\n  FT_CALLBACK_TABLE_DEF                      \\\n  const FT_Driver_ClassRec  class_ =         \\\n  {                                          \\\n    FT_DEFINE_ROOT_MODULE( flags_,           \\\n                           size_,            \\\n                           name_,            \\\n                           version_,         \\\n                           requires_,        \\\n                           interface_,       \\\n                           init_,            \\\n                           done_,            \\\n                           get_interface_ )  \\\n                                             \\\n    face_object_size_,                       \\\n    size_object_size_,                       \\\n    slot_object_size_,                       \\\n                                             \\\n    init_face_,                              \\\n    done_face_,                              \\\n                                             \\\n    init_size_,                              \\\n    done_size_,                              \\\n                                             \\\n    init_slot_,                              \\\n    done_slot_,                              \\\n                                             \\\n    load_glyph_,                             \\\n                                             \\\n    get_kerning_,                            \\\n    attach_file_,                            \\\n    get_advances_,                           \\\n                                             \\\n    request_size_,                           \\\n    select_size_                             \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DECLARE_DRIVER( class_ )  FT_DECLARE_MODULE( class_ )\n\n#define FT_DEFINE_DRIVER(                                        \\\n          class_,                                                \\\n          flags_,                                                \\\n          size_,                                                 \\\n          name_,                                                 \\\n          version_,                                              \\\n          requires_,                                             \\\n          interface_,                                            \\\n          init_,                                                 \\\n          done_,                                                 \\\n          get_interface_,                                        \\\n          face_object_size_,                                     \\\n          size_object_size_,                                     \\\n          slot_object_size_,                                     \\\n          init_face_,                                            \\\n          done_face_,                                            \\\n          init_size_,                                            \\\n          done_size_,                                            \\\n          init_slot_,                                            \\\n          done_slot_,                                            \\\n          load_glyph_,                                           \\\n          get_kerning_,                                          \\\n          attach_file_,                                          \\\n          get_advances_,                                         \\\n          request_size_,                                         \\\n          select_size_ )                                         \\\n  void                                                           \\\n  FT_Destroy_Class_ ## class_( FT_Library        library,        \\\n                               FT_Module_Class*  clazz )         \\\n  {                                                              \\\n    FT_Memory        memory = library->memory;                   \\\n    FT_Driver_Class  dclazz = (FT_Driver_Class)clazz;            \\\n                                                                 \\\n                                                                 \\\n    class_ ## _pic_free( library );                              \\\n    if ( dclazz )                                                \\\n      FT_FREE( dclazz );                                         \\\n  }                                                              \\\n                                                                 \\\n                                                                 \\\n  FT_Error                                                       \\\n  FT_Create_Class_ ## class_( FT_Library         library,        \\\n                              FT_Module_Class**  output_class )  \\\n  {                                                              \\\n    FT_Driver_Class  clazz  = NULL;                              \\\n    FT_Error         error;                                      \\\n    FT_Memory        memory = library->memory;                   \\\n                                                                 \\\n                                                                 \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) )                  \\\n      return error;                                              \\\n                                                                 \\\n    error = class_ ## _pic_init( library );                      \\\n    if ( error )                                                 \\\n    {                                                            \\\n      FT_FREE( clazz );                                          \\\n      return error;                                              \\\n    }                                                            \\\n                                                                 \\\n    FT_DEFINE_ROOT_MODULE( flags_,                               \\\n                           size_,                                \\\n                           name_,                                \\\n                           version_,                             \\\n                           requires_,                            \\\n                           interface_,                           \\\n                           init_,                                \\\n                           done_,                                \\\n                           get_interface_ )                      \\\n                                                                 \\\n    clazz->face_object_size = face_object_size_;                 \\\n    clazz->size_object_size = size_object_size_;                 \\\n    clazz->slot_object_size = slot_object_size_;                 \\\n                                                                 \\\n    clazz->init_face        = init_face_;                        \\\n    clazz->done_face        = done_face_;                        \\\n                                                                 \\\n    clazz->init_size        = init_size_;                        \\\n    clazz->done_size        = done_size_;                        \\\n                                                                 \\\n    clazz->init_slot        = init_slot_;                        \\\n    clazz->done_slot        = done_slot_;                        \\\n                                                                 \\\n    clazz->load_glyph       = load_glyph_;                       \\\n                                                                 \\\n    clazz->get_kerning      = get_kerning_;                      \\\n    clazz->attach_file      = attach_file_;                      \\\n    clazz->get_advances     = get_advances_;                     \\\n                                                                 \\\n    clazz->request_size     = request_size_;                     \\\n    clazz->select_size      = select_size_;                      \\\n                                                                 \\\n    *output_class = (FT_Module_Class*)clazz;                     \\\n                                                                 \\\n    return FT_Err_Ok;                                            \\\n  }\n\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\nFT_END_HEADER\n\n#endif /* __FTDRIVER_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftgloadr.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftgloadr.h                                                             */\n/*                                                                         */\n/*    The FreeType glyph loader (specification).                           */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2005, 2006 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg                       */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTGLOADR_H__\n#define __FTGLOADR_H__\n\n\n#include \"../../ft2build.h\"\n#include \"../freetype.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_GlyphLoader                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The glyph loader is an internal object used to load several glyphs */\n  /*    together (for example, in the case of composites).                 */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The glyph loader implementation is not part of the high-level API, */\n  /*    hence the forward structure declaration.                           */\n  /*                                                                       */\n  typedef struct FT_GlyphLoaderRec_*  FT_GlyphLoader ;\n\n\n#if 0  /* moved to freetype.h in version 2.2 */\n#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS          1\n#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES      2\n#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID        4\n#define FT_SUBGLYPH_FLAG_SCALE                   8\n#define FT_SUBGLYPH_FLAG_XY_SCALE             0x40\n#define FT_SUBGLYPH_FLAG_2X2                  0x80\n#define FT_SUBGLYPH_FLAG_USE_MY_METRICS      0x200\n#endif\n\n\n  typedef struct  FT_SubGlyphRec_\n  {\n    FT_Int     index;\n    FT_UShort  flags;\n    FT_Int     arg1;\n    FT_Int     arg2;\n    FT_Matrix  transform;\n\n  } FT_SubGlyphRec;\n\n\n  typedef struct  FT_GlyphLoadRec_\n  {\n    FT_Outline   outline;       /* outline                   */\n    FT_Vector*   extra_points;  /* extra points table        */\n    FT_Vector*   extra_points2; /* second extra points table */\n    FT_UInt      num_subglyphs; /* number of subglyphs       */\n    FT_SubGlyph  subglyphs;     /* subglyphs                 */\n\n  } FT_GlyphLoadRec, *FT_GlyphLoad;\n\n\n  typedef struct  FT_GlyphLoaderRec_\n  {\n    FT_Memory        memory;\n    FT_UInt          max_points;\n    FT_UInt          max_contours;\n    FT_UInt          max_subglyphs;\n    FT_Bool          use_extra;\n\n    FT_GlyphLoadRec  base;\n    FT_GlyphLoadRec  current;\n\n    void*            other;            /* for possible future extension? */\n\n  } FT_GlyphLoaderRec;\n\n\n  /* create new empty glyph loader */\n  FT_BASE( FT_Error )\n  FT_GlyphLoader_New( FT_Memory        memory,\n                      FT_GlyphLoader  *aloader );\n\n  /* add an extra points table to a glyph loader */\n  FT_BASE( FT_Error )\n  FT_GlyphLoader_CreateExtra( FT_GlyphLoader  loader );\n\n  /* destroy a glyph loader */\n  FT_BASE( void )\n  FT_GlyphLoader_Done( FT_GlyphLoader  loader );\n\n  /* reset a glyph loader (frees everything int it) */\n  FT_BASE( void )\n  FT_GlyphLoader_Reset( FT_GlyphLoader  loader );\n\n  /* rewind a glyph loader */\n  FT_BASE( void )\n  FT_GlyphLoader_Rewind( FT_GlyphLoader  loader );\n\n  /* check that there is enough space to add `n_points' and `n_contours' */\n  /* to the glyph loader                                                 */\n  FT_BASE( FT_Error )\n  FT_GlyphLoader_CheckPoints( FT_GlyphLoader  loader,\n                              FT_UInt         n_points,\n                              FT_UInt         n_contours );\n\n\n#define FT_GLYPHLOADER_CHECK_P( _loader, _count )                         \\\n   ( (_count) == 0 || ((_loader)->base.outline.n_points    +              \\\n                       (_loader)->current.outline.n_points +              \\\n                       (unsigned long)(_count)) <= (_loader)->max_points )\n\n#define FT_GLYPHLOADER_CHECK_C( _loader, _count )                          \\\n  ( (_count) == 0 || ((_loader)->base.outline.n_contours    +              \\\n                      (_loader)->current.outline.n_contours +              \\\n                      (unsigned long)(_count)) <= (_loader)->max_contours )\n\n#define FT_GLYPHLOADER_CHECK_POINTS( _loader, _points,_contours )      \\\n  ( ( FT_GLYPHLOADER_CHECK_P( _loader, _points )   &&                  \\\n      FT_GLYPHLOADER_CHECK_C( _loader, _contours ) )                   \\\n    ? 0                                                                \\\n    : FT_GlyphLoader_CheckPoints( (_loader), (_points), (_contours) ) )\n\n\n  /* check that there is enough space to add `n_subs' sub-glyphs to */\n  /* a glyph loader                                                 */\n  FT_BASE( FT_Error )\n  FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader  loader,\n                                 FT_UInt         n_subs );\n\n  /* prepare a glyph loader, i.e. empty the current glyph */\n  FT_BASE( void )\n  FT_GlyphLoader_Prepare( FT_GlyphLoader  loader );\n\n  /* add the current glyph to the base glyph */\n  FT_BASE( void )\n  FT_GlyphLoader_Add( FT_GlyphLoader  loader );\n\n  /* copy points from one glyph loader to another */\n  FT_BASE( FT_Error )\n  FT_GlyphLoader_CopyPoints( FT_GlyphLoader  target,\n                             FT_GlyphLoader  source );\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTGLOADR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftmemory.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftmemory.h                                                             */\n/*                                                                         */\n/*    The FreeType memory management macros (specification).               */\n/*                                                                         */\n/*  Copyright 1996-2002, 2004-2007, 2010, 2013 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg                       */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTMEMORY_H__\n#define __FTMEMORY_H__\n\n\n#include \"../../ft2build.h\"\n#include \"../config/ftconfig.h\"\n#include \"../fttypes.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_SET_ERROR                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This macro is used to set an implicit `error' variable to a given  */\n  /*    expression's value (usually a function call), and convert it to a  */\n  /*    boolean which is set whenever the value is != 0.                   */\n  /*                                                                       */\n#undef  FT_SET_ERROR\n#define FT_SET_ERROR( expression ) \\\n          ( ( error = (expression) ) != 0 )\n\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                           M E M O R Y                           ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*\n   *  C++ refuses to handle statements like p = (void*)anything, with `p' a\n   *  typed pointer.  Since we don't have a `typeof' operator in standard\n   *  C++, we have to use a template to emulate it.\n   */\n\n#ifdef __cplusplus\n\n  extern \"C++\"\n  template <typename T> inline T*\n  cplusplus_typeof(        T*,\n                    void  *v )\n  {\n    return static_cast <T*> ( v );\n  }\n\n#define FT_ASSIGNP( p, val )  (p) = cplusplus_typeof( (p), (val) )\n\n#else\n\n#define FT_ASSIGNP( p, val )  (p) = (val)\n\n#endif\n\n\n\n#ifdef FT_DEBUG_MEMORY\n\n  FT_BASE( const char* )  _ft_debug_file;\n  FT_BASE( long )         _ft_debug_lineno;\n\n#define FT_DEBUG_INNER( exp )  ( _ft_debug_file   = __FILE__, \\\n                                 _ft_debug_lineno = __LINE__, \\\n                                 (exp) )\n\n#define FT_ASSIGNP_INNER( p, exp )  ( _ft_debug_file   = __FILE__, \\\n                                      _ft_debug_lineno = __LINE__, \\\n                                      FT_ASSIGNP( p, exp ) )\n\n#else /* !FT_DEBUG_MEMORY */\n\n#define FT_DEBUG_INNER( exp )       (exp)\n#define FT_ASSIGNP_INNER( p, exp )  FT_ASSIGNP( p, exp )\n\n#endif /* !FT_DEBUG_MEMORY */\n\n\n  /*\n   *  The allocation functions return a pointer, and the error code\n   *  is written to through the `p_error' parameter.  See below for\n   *  for documentation.\n   */\n\n  FT_BASE( FT_Pointer )\n  ft_mem_alloc( FT_Memory  memory,\n                FT_Long    size,\n                FT_Error  *p_error );\n\n  FT_BASE( FT_Pointer )\n  ft_mem_qalloc( FT_Memory  memory,\n                 FT_Long    size,\n                 FT_Error  *p_error );\n\n  FT_BASE( FT_Pointer )\n  ft_mem_realloc( FT_Memory  memory,\n                  FT_Long    item_size,\n                  FT_Long    cur_count,\n                  FT_Long    new_count,\n                  void*      block,\n                  FT_Error  *p_error );\n\n  FT_BASE( FT_Pointer )\n  ft_mem_qrealloc( FT_Memory  memory,\n                   FT_Long    item_size,\n                   FT_Long    cur_count,\n                   FT_Long    new_count,\n                   void*      block,\n                   FT_Error  *p_error );\n#ifdef _DEBUG\n//#define _XYQ_MEM_DEBUG\n#endif\n  \n#ifdef _XYQ_MEM_DEBUG\t\t/* XYQ */\n  FT_BASE( FT_Pointer )\n\t  ft_mem_allocdebug( FT_Memory  memory,\n\t  FT_Long    size, const char* filename, int line,\n\t  FT_Error  *p_error );\n  \n  FT_BASE( FT_Pointer )\n\t  ft_mem_qallocdebug( FT_Memory  memory,\n\t  FT_Long    size, const char* filename, int line,\n\t  FT_Error  *p_error );\n  \n  FT_BASE( FT_Pointer )\n\t  ft_mem_reallocdebug( FT_Memory  memory,\n\t  FT_Long    item_size,\n\t  FT_Long    cur_count,\n\t  FT_Long    new_count,\n\t  void*      block, const char* filename, int line,\n\t  FT_Error  *p_error );\n  \n  FT_BASE( FT_Pointer )\n\t  ft_mem_qreallocdebug( FT_Memory  memory,\n\t  FT_Long    item_size,\n\t  FT_Long    cur_count,\n\t  FT_Long    new_count,\n\t  void*      block, const char* filename, int line,\n\t  FT_Error  *p_error );\n#endif\n\n\n  FT_BASE( void )\n  ft_mem_free( FT_Memory    memory,\n               const void*  P );\n\n\n#define FT_MEM_FREE( ptr )                \\\n          FT_BEGIN_STMNT                  \\\n            ft_mem_free( memory, (ptr) ); \\\n            (ptr) = NULL;                 \\\n          FT_END_STMNT\n#ifndef _XYQ_MEM_DEBUG\n#define FT_MEM_ALLOC( ptr, size )                                         \\\n\t\t  FT_ASSIGNP_INNER( ptr, ft_mem_alloc( memory, (size), &error ) )\n\n\n#define FT_MEM_REALLOC( ptr, cursz, newsz )                        \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory,           \\\n                                                 1,                \\\n                                                 (FT_Long)(cursz), \\\n                                                 (FT_Long)(newsz), \\\n                                                 (ptr),            \\\n                                                 &error ) )\n\n#define FT_MEM_QALLOC( ptr, size )                               \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qalloc( memory,          \\\n                                                (FT_Long)(size), \\\n                                                &error ) )\n\n#define FT_MEM_QREALLOC( ptr, cursz, newsz )                        \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory,           \\\n                                                  1,                \\\n                                                  (FT_Long)(cursz), \\\n                                                  (FT_Long)(newsz), \\\n                                                  (ptr),            \\\n                                                  &error ) )\n\n#define FT_MEM_ALLOC_MULT( ptr, count, item_size )                     \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory,               \\\n                                                 (FT_Long)(item_size), \\\n                                                 0,                    \\\n                                                 (FT_Long)(count),     \\\n                                                 NULL,                 \\\n                                                 &error ) )\n\n#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz )           \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory,            \\\n                                                 (FT_Long)(itmsz),  \\\n                                                 (FT_Long)(oldcnt), \\\n                                                 (FT_Long)(newcnt), \\\n                                                 (ptr),             \\\n                                                 &error ) )\n\n#define FT_MEM_QALLOC_MULT( ptr, count, item_size )                     \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory,               \\\n                                                  (FT_Long)(item_size), \\\n                                                  0,                    \\\n                                                  (FT_Long)(count),     \\\n                                                  NULL,                 \\\n                                                  &error ) )\n\n#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz)            \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory,            \\\n                                                  (FT_Long)(itmsz),  \\\n                                                  (FT_Long)(oldcnt), \\\n                                                  (FT_Long)(newcnt), \\\n                                                  (ptr),             \\\n                                                  &error ) )\n#define FT_MEM_NEW_ARRAY( ptr, count )                                      \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \\\n                                                 0, (count),                \\\n                                                 NULL, &error ) )\n\n#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz )                             \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \\\n                                                 (cursz), (newsz),          \\\n                                                 (ptr), &error ) )\n\n#define FT_MEM_QNEW_ARRAY( ptr, count )                                      \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \\\n                                                  0, (count),                \\\n                                                  NULL, &error ) )\n\n#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz )                             \\\n\tFT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \\\n\t(cursz), (newsz),          \\\n  (ptr), &error ) )\n  \n#else\n#define FT_MEM_ALLOC( ptr, size )                                         \\\n  FT_ASSIGNP_INNER( ptr, ft_mem_allocdebug( memory, (size), __FILE__, __LINE__, &error ) )\n  \n#define FT_MEM_REALLOC( ptr, cursz, newsz )                        \\\n\tFT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, 1,        \\\n                                                  (cursz), (newsz),          \\\n                                                 (ptr), __FILE__, __LINE__, &error ) )\n\n#define FT_MEM_QALLOC( ptr, size )                                         \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qallocdebug( memory, (size), __FILE__, __LINE__, &error ) )\n\n#define FT_MEM_QREALLOC( ptr, cursz, newsz )                         \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, 1,        \\\n                                                  (cursz), (newsz), \\\n                                                  (ptr), __FILE__, __LINE__, &error ) )\n\n#define FT_MEM_ALLOC_MULT( ptr, count, item_size )                    \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, (item_size), \\\n                                                 0, (count),          \\\n                                                 NULL, __FILE__, __LINE__, &error ) )\n\n#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz )            \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, (itmsz),    \\\n                                                 (oldcnt), (newcnt), \\\n                                                 (ptr), __FILE__, __LINE__, &error ) )\n\n#define FT_MEM_QALLOC_MULT( ptr, count, item_size )                    \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, (item_size), \\\n                                                  0, (count),          \\\n                                                  NULL, __FILE__, __LINE__, &error ) )\n\n#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz)             \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, (itmsz),    \\\n                                                  (oldcnt), (newcnt), \\\n                                                  (ptr), __FILE__, __LINE__, &error ) )\n  /*************************************************************************/\n  /*                                                                       */\n  /* The following functions macros expect that their pointer argument is  */\n  /* _typed_ in order to automatically compute array element sizes.        */\n  /*                                                                       */\n\n#define FT_MEM_NEW_ARRAY( ptr, count )                                      \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, sizeof ( *(ptr) ), \\\n                                                 0, (count),                \\\n                                                 NULL, __FILE__, __LINE__, &error ) )\n\n#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz )                             \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, sizeof ( *(ptr) ), \\\n                                                 (cursz), (newsz),          \\\n                                                 (ptr), __FILE__, __LINE__, &error ) )\n\n#define FT_MEM_QNEW_ARRAY( ptr, count )                                      \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, sizeof ( *(ptr) ), \\\n                                                  0, (count),                \\\n                                                  NULL, __FILE__, __LINE__, &error ) )\n\n#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz )                             \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, sizeof ( *(ptr) ), \\\n                                                  (cursz), (newsz),          \\\n                                                  (ptr), __FILE__, __LINE__, &error ) )\n\n#endif\n\n#define FT_MEM_NEW( ptr )                        \\\n          FT_MEM_ALLOC( ptr, sizeof ( *(ptr) ) )\n\n#define FT_MEM_QNEW( ptr )                        \\\n          FT_MEM_QALLOC( ptr, sizeof ( *(ptr) ) )\n\n#define FT_MEM_SET_ERROR( cond )  ( (cond), error != 0 )\n\n\n#define FT_MEM_SET( dest, byte, count )     ft_memset( dest, byte, count )\n\n#define FT_MEM_COPY( dest, source, count )  ft_memcpy( dest, source, count )\n\n#define FT_MEM_MOVE( dest, source, count )  ft_memmove( dest, source, count )\n\n\n#define FT_MEM_ZERO( dest, count )  FT_MEM_SET( dest, 0, count )\n\n#define FT_ZERO( p )                FT_MEM_ZERO( p, sizeof ( *(p) ) )\n\n\n#define FT_ARRAY_ZERO( dest, count )                        \\\n          FT_MEM_ZERO( dest, (count) * sizeof ( *(dest) ) )\n\n#define FT_ARRAY_COPY( dest, source, count )                        \\\n          FT_MEM_COPY( dest, source, (count) * sizeof ( *(dest) ) )\n\n#define FT_ARRAY_MOVE( dest, source, count )                        \\\n          FT_MEM_MOVE( dest, source, (count) * sizeof ( *(dest) ) )\n\n\n  /*\n   *  Return the maximum number of addressable elements in an array.\n   *  We limit ourselves to INT_MAX, rather than UINT_MAX, to avoid\n   *  any problems.\n   */\n#define FT_ARRAY_MAX( ptr )           ( FT_INT_MAX / sizeof ( *(ptr) ) )\n\n#define FT_ARRAY_CHECK( ptr, count )  ( (count) <= FT_ARRAY_MAX( ptr ) )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The following functions macros expect that their pointer argument is  */\n  /* _typed_ in order to automatically compute array element sizes.        */\n  /*                                                                       */\n\n#define FT_ALLOC( ptr, size )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_ALLOC( ptr, size ) )\n\n#define FT_REALLOC( ptr, cursz, newsz )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_REALLOC( ptr, cursz, newsz ) )\n\n#define FT_ALLOC_MULT( ptr, count, item_size )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_ALLOC_MULT( ptr, count, item_size ) )\n\n#define FT_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz )              \\\n          FT_MEM_SET_ERROR( FT_MEM_REALLOC_MULT( ptr, oldcnt,      \\\n                                                 newcnt, itmsz ) )\n\n#define FT_QALLOC( ptr, size )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_QALLOC( ptr, size ) )\n\n#define FT_QREALLOC( ptr, cursz, newsz )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_QREALLOC( ptr, cursz, newsz ) )\n\n#define FT_QALLOC_MULT( ptr, count, item_size )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_QALLOC_MULT( ptr, count, item_size ) )\n\n#define FT_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz )              \\\n          FT_MEM_SET_ERROR( FT_MEM_QREALLOC_MULT( ptr, oldcnt,      \\\n                                                  newcnt, itmsz ) )\n\n#define FT_FREE( ptr )  FT_MEM_FREE( ptr )\n\n#define FT_NEW( ptr )  FT_MEM_SET_ERROR( FT_MEM_NEW( ptr ) )\n\n#define FT_NEW_ARRAY( ptr, count )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) )\n\n#define FT_RENEW_ARRAY( ptr, curcnt, newcnt )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) )\n\n#define FT_QNEW( ptr )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_QNEW( ptr ) )\n\n#define FT_QNEW_ARRAY( ptr, count )                          \\\n          FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) )\n\n#define FT_QRENEW_ARRAY( ptr, curcnt, newcnt )                          \\\n          FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) )\n\n\n  FT_BASE( FT_Pointer )\n  ft_mem_strdup( FT_Memory    memory,\n                 const char*  str,\n                 FT_Error    *p_error );\n\n  FT_BASE( FT_Pointer )\n  ft_mem_dup( FT_Memory    memory,\n              const void*  address,\n              FT_ULong     size,\n              FT_Error    *p_error );\n\n\n#define FT_MEM_STRDUP( dst, str )                                            \\\n          (dst) = (char*)ft_mem_strdup( memory, (const char*)(str), &error )\n\n#define FT_STRDUP( dst, str )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_STRDUP( dst, str ) )\n\n#define FT_MEM_DUP( dst, address, size )                                    \\\n          (dst) = ft_mem_dup( memory, (address), (FT_ULong)(size), &error )\n\n#define FT_DUP( dst, address, size )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_DUP( dst, address, size ) )\n\n\n  /* Return >= 1 if a truncation occurs.            */\n  /* Return 0 if the source string fits the buffer. */\n  /* This is *not* the same as strlcpy().           */\n  FT_BASE( FT_Int )\n  ft_mem_strcpyn( char*        dst,\n                  const char*  src,\n                  FT_ULong     size );\n\n#define FT_STRCPYN( dst, src, size )                                         \\\n          ft_mem_strcpyn( (char*)dst, (const char*)(src), (FT_ULong)(size) )\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTMEMORY_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftobjs.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftobjs.h                                                               */\n/*                                                                         */\n/*    The FreeType private base classes (specification).                   */\n/*                                                                         */\n/*  Copyright 1996-2006, 2008, 2010, 2012-2013 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  This file contains the definition of all internal FreeType classes.  */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTOBJS_H__\n#define __FTOBJS_H__\n\n#include \"../../ft2build.h\"\n#include \"../ftrender.h\"\n#include \"../ftsizes.h\"\n#include \"../ftlcdfil.h\"\n#include \"ftmemory.h\"\n#include \"ftgloadr.h\"\n#include \"ftdriver.h\"\n#include \"autohint.h\"\n#include \"ftserv.h\"\n#include \"ftpic.h\"\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n#include \"../ftincrem.h\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Some generic definitions.                                             */\n  /*                                                                       */\n#ifndef TRUE\n#define TRUE  1\n#endif\n\n#ifndef FALSE\n#define FALSE  0\n#endif\n\n#ifndef NULL\n#define NULL  (void*)0\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The min and max functions missing in C.  As usual, be careful not to  */\n  /* write things like FT_MIN( a++, b++ ) to avoid side effects.           */\n  /*                                                                       */\n#define FT_MIN( a, b )  ( (a) < (b) ? (a) : (b) )\n#define FT_MAX( a, b )  ( (a) > (b) ? (a) : (b) )\n\n#define FT_ABS( a )     ( (a) < 0 ? -(a) : (a) )\n\n\n#define FT_PAD_FLOOR( x, n )  ( (x) & ~((n)-1) )\n#define FT_PAD_ROUND( x, n )  FT_PAD_FLOOR( (x) + ((n)/2), n )\n#define FT_PAD_CEIL( x, n )   FT_PAD_FLOOR( (x) + ((n)-1), n )\n\n#define FT_PIX_FLOOR( x )     ( (x) & ~63 )\n#define FT_PIX_ROUND( x )     FT_PIX_FLOOR( (x) + 32 )\n#define FT_PIX_CEIL( x )      FT_PIX_FLOOR( (x) + 63 )\n\n\n  /*\n   *  Return the highest power of 2 that is <= value; this correspond to\n   *  the highest bit in a given 32-bit value.\n   */\n  FT_BASE( FT_UInt32 )\n  ft_highpow2( FT_UInt32  value );\n\n\n  /*\n   *  character classification functions -- since these are used to parse\n   *  font files, we must not use those in <ctypes.h> which are\n   *  locale-dependent\n   */\n#define  ft_isdigit( x )   ( ( (unsigned)(x) - '0' ) < 10U )\n\n#define  ft_isxdigit( x )  ( ( (unsigned)(x) - '0' ) < 10U || \\\n                             ( (unsigned)(x) - 'a' ) < 6U  || \\\n                             ( (unsigned)(x) - 'A' ) < 6U  )\n\n  /* the next two macros assume ASCII representation */\n#define  ft_isupper( x )  ( ( (unsigned)(x) - 'A' ) < 26U )\n#define  ft_islower( x )  ( ( (unsigned)(x) - 'a' ) < 26U )\n\n#define  ft_isalpha( x )  ( ft_isupper( x ) || ft_islower( x ) )\n#define  ft_isalnum( x )  ( ft_isdigit( x ) || ft_isalpha( x ) )\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                       C H A R M A P S                           ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* handle to internal charmap object */\n  typedef struct FT_CMapRec_*              FT_CMap;\n\n  /* handle to charmap class structure */\n  typedef const struct FT_CMap_ClassRec_*  FT_CMap_Class;\n\n  /* internal charmap object structure */\n  typedef struct  FT_CMapRec_\n  {\n    FT_CharMapRec  charmap;\n    FT_CMap_Class  clazz;\n\n  } FT_CMapRec;\n\n  /* typecase any pointer to a charmap handle */\n#define FT_CMAP( x )              ((FT_CMap)( x ))\n\n  /* obvious macros */\n#define FT_CMAP_PLATFORM_ID( x )  FT_CMAP( x )->charmap.platform_id\n#define FT_CMAP_ENCODING_ID( x )  FT_CMAP( x )->charmap.encoding_id\n#define FT_CMAP_ENCODING( x )     FT_CMAP( x )->charmap.encoding\n#define FT_CMAP_FACE( x )         FT_CMAP( x )->charmap.face\n\n\n  /* class method definitions */\n  typedef FT_Error\n  (*FT_CMap_InitFunc)( FT_CMap     cmap,\n                       FT_Pointer  init_data );\n\n  typedef void\n  (*FT_CMap_DoneFunc)( FT_CMap  cmap );\n\n  typedef FT_UInt\n  (*FT_CMap_CharIndexFunc)( FT_CMap    cmap,\n                            FT_UInt32  char_code );\n\n  typedef FT_UInt\n  (*FT_CMap_CharNextFunc)( FT_CMap     cmap,\n                           FT_UInt32  *achar_code );\n\n  typedef FT_UInt\n  (*FT_CMap_CharVarIndexFunc)( FT_CMap    cmap,\n                               FT_CMap    unicode_cmap,\n                               FT_UInt32  char_code,\n                               FT_UInt32  variant_selector );\n\n  typedef FT_Bool\n  (*FT_CMap_CharVarIsDefaultFunc)( FT_CMap    cmap,\n                                   FT_UInt32  char_code,\n                                   FT_UInt32  variant_selector );\n\n  typedef FT_UInt32 *\n  (*FT_CMap_VariantListFunc)( FT_CMap    cmap,\n                              FT_Memory  mem );\n\n  typedef FT_UInt32 *\n  (*FT_CMap_CharVariantListFunc)( FT_CMap    cmap,\n                                  FT_Memory  mem,\n                                  FT_UInt32  char_code );\n\n  typedef FT_UInt32 *\n  (*FT_CMap_VariantCharListFunc)( FT_CMap    cmap,\n                                  FT_Memory  mem,\n                                  FT_UInt32  variant_selector );\n\n\n  typedef struct  FT_CMap_ClassRec_\n  {\n    FT_ULong               size;\n    FT_CMap_InitFunc       init;\n    FT_CMap_DoneFunc       done;\n    FT_CMap_CharIndexFunc  char_index;\n    FT_CMap_CharNextFunc   char_next;\n\n    /* Subsequent entries are special ones for format 14 -- the variant */\n    /* selector subtable which behaves like no other                    */\n\n    FT_CMap_CharVarIndexFunc      char_var_index;\n    FT_CMap_CharVarIsDefaultFunc  char_var_default;\n    FT_CMap_VariantListFunc       variant_list;\n    FT_CMap_CharVariantListFunc   charvariant_list;\n    FT_CMap_VariantCharListFunc   variantchar_list;\n\n  } FT_CMap_ClassRec;\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DECLARE_CMAP_CLASS( class_ )              \\\n  FT_CALLBACK_TABLE const  FT_CMap_ClassRec class_;\n\n#define FT_DEFINE_CMAP_CLASS(       \\\n          class_,                   \\\n          size_,                    \\\n          init_,                    \\\n          done_,                    \\\n          char_index_,              \\\n          char_next_,               \\\n          char_var_index_,          \\\n          char_var_default_,        \\\n          variant_list_,            \\\n          charvariant_list_,        \\\n          variantchar_list_ )       \\\n  FT_CALLBACK_TABLE_DEF             \\\n  const FT_CMap_ClassRec  class_ =  \\\n  {                                 \\\n    size_,                          \\\n    init_,                          \\\n    done_,                          \\\n    char_index_,                    \\\n    char_next_,                     \\\n    char_var_index_,                \\\n    char_var_default_,              \\\n    variant_list_,                  \\\n    charvariant_list_,              \\\n    variantchar_list_               \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DECLARE_CMAP_CLASS( class_ )                  \\\n  void                                                   \\\n  FT_Init_Class_ ## class_( FT_Library         library,  \\\n                            FT_CMap_ClassRec*  clazz );\n\n#define FT_DEFINE_CMAP_CLASS(                            \\\n          class_,                                        \\\n          size_,                                         \\\n          init_,                                         \\\n          done_,                                         \\\n          char_index_,                                   \\\n          char_next_,                                    \\\n          char_var_index_,                               \\\n          char_var_default_,                             \\\n          variant_list_,                                 \\\n          charvariant_list_,                             \\\n          variantchar_list_ )                            \\\n  void                                                   \\\n  FT_Init_Class_ ## class_( FT_Library         library,  \\\n                            FT_CMap_ClassRec*  clazz )   \\\n  {                                                      \\\n    FT_UNUSED( library );                                \\\n                                                         \\\n    clazz->size             = size_;                     \\\n    clazz->init             = init_;                     \\\n    clazz->done             = done_;                     \\\n    clazz->char_index       = char_index_;               \\\n    clazz->char_next        = char_next_;                \\\n    clazz->char_var_index   = char_var_index_;           \\\n    clazz->char_var_default = char_var_default_;         \\\n    clazz->variant_list     = variant_list_;             \\\n    clazz->charvariant_list = charvariant_list_;         \\\n    clazz->variantchar_list = variantchar_list_;         \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n  /* create a new charmap and add it to charmap->face */\n  FT_BASE( FT_Error )\n  FT_CMap_New( FT_CMap_Class  clazz,\n               FT_Pointer     init_data,\n               FT_CharMap     charmap,\n               FT_CMap       *acmap );\n\n  /* destroy a charmap and remove it from face's list */\n  FT_BASE( void )\n  FT_CMap_Done( FT_CMap  cmap );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Face_InternalRec                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This structure contains the internal fields of each FT_Face        */\n  /*    object.  These fields may change between different releases of     */\n  /*    FreeType.                                                          */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    max_points ::                                                      */\n  /*      The maximum number of points used to store the vectorial outline */\n  /*      of any glyph in this face.  If this value cannot be known in     */\n  /*      advance, or if the face isn't scalable, this should be set to 0. */\n  /*      Only relevant for scalable formats.                              */\n  /*                                                                       */\n  /*    max_contours ::                                                    */\n  /*      The maximum number of contours used to store the vectorial       */\n  /*      outline of any glyph in this face.  If this value cannot be      */\n  /*      known in advance, or if the face isn't scalable, this should be  */\n  /*      set to 0.  Only relevant for scalable formats.                   */\n  /*                                                                       */\n  /*    transform_matrix ::                                                */\n  /*      A 2x2 matrix of 16.16 coefficients used to transform glyph       */\n  /*      outlines after they are loaded from the font.  Only used by the  */\n  /*      convenience functions.                                           */\n  /*                                                                       */\n  /*    transform_delta ::                                                 */\n  /*      A translation vector used to transform glyph outlines after they */\n  /*      are loaded from the font.  Only used by the convenience          */\n  /*      functions.                                                       */\n  /*                                                                       */\n  /*    transform_flags ::                                                 */\n  /*      Some flags used to classify the transform.  Only used by the     */\n  /*      convenience functions.                                           */\n  /*                                                                       */\n  /*    services ::                                                        */\n  /*      A cache for frequently used services.  It should be only         */\n  /*      accessed with the macro `FT_FACE_LOOKUP_SERVICE'.                */\n  /*                                                                       */\n  /*    incremental_interface ::                                           */\n  /*      If non-null, the interface through which glyph data and metrics  */\n  /*      are loaded incrementally for faces that do not provide all of    */\n  /*      this data when first opened.  This field exists only if          */\n  /*      @FT_CONFIG_OPTION_INCREMENTAL is defined.                        */\n  /*                                                                       */\n  /*    ignore_unpatented_hinter ::                                        */\n  /*      This boolean flag instructs the glyph loader to ignore the       */\n  /*      native font hinter, if one is found.  This is exclusively used   */\n  /*      in the case when the unpatented hinter is compiled within the    */\n  /*      library.                                                         */\n  /*                                                                       */\n  /*    refcount ::                                                        */\n  /*      A counter initialized to~1 at the time an @FT_Face structure is  */\n  /*      created.  @FT_Reference_Face increments this counter, and        */\n  /*      @FT_Done_Face only destroys a face if the counter is~1,          */\n  /*      otherwise it simply decrements it.                               */\n  /*                                                                       */\n  typedef struct  FT_Face_InternalRec_\n  {\n    FT_Matrix           transform_matrix;\n    FT_Vector           transform_delta;\n    FT_Int              transform_flags;\n\n    FT_ServiceCacheRec  services;\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    FT_Incremental_InterfaceRec*  incremental_interface;\n#endif\n\n    FT_Bool             ignore_unpatented_hinter;\n    FT_Int              refcount;\n\n  } FT_Face_InternalRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Slot_InternalRec                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This structure contains the internal fields of each FT_GlyphSlot   */\n  /*    object.  These fields may change between different releases of     */\n  /*    FreeType.                                                          */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    loader            :: The glyph loader object used to load outlines */\n  /*                         into the glyph slot.                          */\n  /*                                                                       */\n  /*    flags             :: Possible values are zero or                   */\n  /*                         FT_GLYPH_OWN_BITMAP.  The latter indicates    */\n  /*                         that the FT_GlyphSlot structure owns the      */\n  /*                         bitmap buffer.                                */\n  /*                                                                       */\n  /*    glyph_transformed :: Boolean.  Set to TRUE when the loaded glyph   */\n  /*                         must be transformed through a specific        */\n  /*                         font transformation.  This is _not_ the same  */\n  /*                         as the face transform set through             */\n  /*                         FT_Set_Transform().                           */\n  /*                                                                       */\n  /*    glyph_matrix      :: The 2x2 matrix corresponding to the glyph     */\n  /*                         transformation, if necessary.                 */\n  /*                                                                       */\n  /*    glyph_delta       :: The 2d translation vector corresponding to    */\n  /*                         the glyph transformation, if necessary.       */\n  /*                                                                       */\n  /*    glyph_hints       :: Format-specific glyph hints management.       */\n  /*                                                                       */\n\n#define FT_GLYPH_OWN_BITMAP  0x1\n\n  typedef struct  FT_Slot_InternalRec_\n  {\n    FT_GlyphLoader  loader;\n    FT_UInt         flags;\n    FT_Bool         glyph_transformed;\n    FT_Matrix       glyph_matrix;\n    FT_Vector       glyph_delta;\n    void*           glyph_hints;\n\n  } FT_GlyphSlot_InternalRec;\n\n\n#if 0\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Size_InternalRec                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This structure contains the internal fields of each FT_Size        */\n  /*    object.  Currently, it's empty.                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n  typedef struct  FT_Size_InternalRec_\n  {\n    /* empty */\n\n  } FT_Size_InternalRec;\n\n#endif\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                         M O D U L E S                           ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_ModuleRec                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A module object instance.                                          */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    clazz   :: A pointer to the module's class.                        */\n  /*                                                                       */\n  /*    library :: A handle to the parent library object.                  */\n  /*                                                                       */\n  /*    memory  :: A handle to the memory manager.                         */\n  /*                                                                       */\n  typedef struct  FT_ModuleRec_\n  {\n    FT_Module_Class*  clazz;\n    FT_Library        library;\n    FT_Memory         memory;\n\n  } FT_ModuleRec;\n\n\n  /* typecast an object to an FT_Module */\n#define FT_MODULE( x )          ((FT_Module)( x ))\n#define FT_MODULE_CLASS( x )    FT_MODULE( x )->clazz\n#define FT_MODULE_LIBRARY( x )  FT_MODULE( x )->library\n#define FT_MODULE_MEMORY( x )   FT_MODULE( x )->memory\n\n\n#define FT_MODULE_IS_DRIVER( x )  ( FT_MODULE_CLASS( x )->module_flags & \\\n                                    FT_MODULE_FONT_DRIVER )\n\n#define FT_MODULE_IS_RENDERER( x )  ( FT_MODULE_CLASS( x )->module_flags & \\\n                                      FT_MODULE_RENDERER )\n\n#define FT_MODULE_IS_HINTER( x )  ( FT_MODULE_CLASS( x )->module_flags & \\\n                                    FT_MODULE_HINTER )\n\n#define FT_MODULE_IS_STYLER( x )  ( FT_MODULE_CLASS( x )->module_flags & \\\n                                    FT_MODULE_STYLER )\n\n#define FT_DRIVER_IS_SCALABLE( x )  ( FT_MODULE_CLASS( x )->module_flags & \\\n                                      FT_MODULE_DRIVER_SCALABLE )\n\n#define FT_DRIVER_USES_OUTLINES( x )  !( FT_MODULE_CLASS( x )->module_flags & \\\n                                         FT_MODULE_DRIVER_NO_OUTLINES )\n\n#define FT_DRIVER_HAS_HINTER( x )  ( FT_MODULE_CLASS( x )->module_flags & \\\n                                     FT_MODULE_DRIVER_HAS_HINTER )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Module_Interface                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Finds a module and returns its specific interface as a typeless    */\n  /*    pointer.                                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library     :: A handle to the library object.                     */\n  /*                                                                       */\n  /*    module_name :: The module's name (as an ASCII string).             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A module-specific interface if available, 0 otherwise.             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You should better be familiar with FreeType internals to know      */\n  /*    which module to look for, and what its interface is :-)            */\n  /*                                                                       */\n  FT_BASE( const void* )\n  FT_Get_Module_Interface( FT_Library   library,\n                           const char*  mod_name );\n\n  FT_BASE( FT_Pointer )\n  ft_module_get_service( FT_Module    module,\n                         const char*  service_id );\n\n  /* */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****   F A C E,   S I Z E   &   G L Y P H   S L O T   O B J E C T S  ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* a few macros used to perform easy typecasts with minimal brain damage */\n\n#define FT_FACE( x )          ((FT_Face)(x))\n#define FT_SIZE( x )          ((FT_Size)(x))\n#define FT_SLOT( x )          ((FT_GlyphSlot)(x))\n\n#define FT_FACE_DRIVER( x )   FT_FACE( x )->driver\n#define FT_FACE_LIBRARY( x )  FT_FACE_DRIVER( x )->root.library\n#define FT_FACE_MEMORY( x )   FT_FACE( x )->memory\n#define FT_FACE_STREAM( x )   FT_FACE( x )->stream\n\n#define FT_SIZE_FACE( x )     FT_SIZE( x )->face\n#define FT_SLOT_FACE( x )     FT_SLOT( x )->face\n\n#define FT_FACE_SLOT( x )     FT_FACE( x )->glyph\n#define FT_FACE_SIZE( x )     FT_FACE( x )->size\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_GlyphSlot                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    It is sometimes useful to have more than one glyph slot for a      */\n  /*    given face object.  This function is used to create additional     */\n  /*    slots.  All of them are automatically discarded when the face is   */\n  /*    destroyed.                                                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face  :: A handle to a parent face object.                         */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aslot :: A handle to a new glyph slot object.                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_BASE( FT_Error )\n  FT_New_GlyphSlot( FT_Face        face,\n                    FT_GlyphSlot  *aslot );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Done_GlyphSlot                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Destroys a given glyph slot.  Remember however that all slots are  */\n  /*    automatically destroyed with its parent.  Using this function is   */\n  /*    not always mandatory.                                              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    slot :: A handle to a target glyph slot.                           */\n  /*                                                                       */\n  FT_BASE( void )\n  FT_Done_GlyphSlot( FT_GlyphSlot  slot );\n\n /* */\n\n#define FT_REQUEST_WIDTH( req )                                            \\\n          ( (req)->horiResolution                                          \\\n              ? (FT_Pos)( (req)->width * (req)->horiResolution + 36 ) / 72 \\\n              : (req)->width )\n\n#define FT_REQUEST_HEIGHT( req )                                            \\\n          ( (req)->vertResolution                                           \\\n              ? (FT_Pos)( (req)->height * (req)->vertResolution + 36 ) / 72 \\\n              : (req)->height )\n\n\n  /* Set the metrics according to a bitmap strike. */\n  FT_BASE( void )\n  FT_Select_Metrics( FT_Face   face,\n                     FT_ULong  strike_index );\n\n\n  /* Set the metrics according to a size request. */\n  FT_BASE( void )\n  FT_Request_Metrics( FT_Face          face,\n                      FT_Size_Request  req );\n\n\n  /* Match a size request against `available_sizes'. */\n  FT_BASE( FT_Error )\n  FT_Match_Size( FT_Face          face,\n                 FT_Size_Request  req,\n                 FT_Bool          ignore_width,\n                 FT_ULong*        size_index );\n\n\n  /* Use the horizontal metrics to synthesize the vertical metrics. */\n  /* If `advance' is zero, it is also synthesized.                  */\n  FT_BASE( void )\n  ft_synthesize_vertical_metrics( FT_Glyph_Metrics*  metrics,\n                                  FT_Pos             advance );\n\n\n  /* Free the bitmap of a given glyphslot when needed (i.e., only when it */\n  /* was allocated with ft_glyphslot_alloc_bitmap).                       */\n  FT_BASE( void )\n  ft_glyphslot_free_bitmap( FT_GlyphSlot  slot );\n\n\n  /* Allocate a new bitmap buffer in a glyph slot. */\n  FT_BASE( FT_Error )\n  ft_glyphslot_alloc_bitmap( FT_GlyphSlot  slot,\n                             FT_ULong      size );\n\n\n  /* Set the bitmap buffer in a glyph slot to a given pointer.  The buffer */\n  /* will not be freed by a later call to ft_glyphslot_free_bitmap.        */\n  FT_BASE( void )\n  ft_glyphslot_set_bitmap( FT_GlyphSlot  slot,\n                           FT_Byte*      buffer );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                        R E N D E R E R S                        ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n#define FT_RENDERER( x )      ((FT_Renderer)( x ))\n#define FT_GLYPH( x )         ((FT_Glyph)( x ))\n#define FT_BITMAP_GLYPH( x )  ((FT_BitmapGlyph)( x ))\n#define FT_OUTLINE_GLYPH( x ) ((FT_OutlineGlyph)( x ))\n\n\n  typedef struct  FT_RendererRec_\n  {\n    FT_ModuleRec            root;\n    FT_Renderer_Class*      clazz;\n    FT_Glyph_Format         glyph_format;\n    FT_Glyph_Class          glyph_class;\n\n    FT_Raster               raster;\n    FT_Raster_Render_Func   raster_render;\n    FT_Renderer_RenderFunc  render;\n\n  } FT_RendererRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                    F O N T   D R I V E R S                      ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* typecast a module into a driver easily */\n#define FT_DRIVER( x )        ((FT_Driver)(x))\n\n  /* typecast a module as a driver, and get its driver class */\n#define FT_DRIVER_CLASS( x )  FT_DRIVER( x )->clazz\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_DriverRec                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The root font driver class.  A font driver is responsible for      */\n  /*    managing and loading font files of a given format.                 */\n  /*                                                                       */\n  /*  <Fields>                                                             */\n  /*     root         :: Contains the fields of the root module class.     */\n  /*                                                                       */\n  /*     clazz        :: A pointer to the font driver's class.  Note that  */\n  /*                     this is NOT root.clazz.  `class' wasn't used      */\n  /*                     as it is a reserved word in C++.                  */\n  /*                                                                       */\n  /*     faces_list   :: The list of faces currently opened by this        */\n  /*                     driver.                                           */\n  /*                                                                       */\n  /*     glyph_loader :: The glyph loader for all faces managed by this    */\n  /*                     driver.  This object isn't defined for unscalable */\n  /*                     formats.                                          */\n  /*                                                                       */\n  typedef struct  FT_DriverRec_\n  {\n    FT_ModuleRec     root;\n    FT_Driver_Class  clazz;\n    FT_ListRec       faces_list;\n    FT_GlyphLoader   glyph_loader;\n\n  } FT_DriverRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                       L I B R A R I E S                         ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* This hook is used by the TrueType debugger.  It must be set to an */\n  /* alternate truetype bytecode interpreter function.                 */\n#define FT_DEBUG_HOOK_TRUETYPE            0\n\n\n  /* Set this debug hook to a non-null pointer to force unpatented hinting */\n  /* for all faces when both TT_USE_BYTECODE_INTERPRETER and               */\n  /* TT_CONFIG_OPTION_UNPATENTED_HINTING are defined.  This is only used   */\n  /* during debugging.                                                     */\n#define FT_DEBUG_HOOK_UNPATENTED_HINTING  1\n\n\n  typedef void  (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap*      bitmap,\n                                            FT_Render_Mode  render_mode,\n                                            FT_Library      library );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_LibraryRec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The FreeType library class.  This is the root of all FreeType      */\n  /*    data.  Use FT_New_Library() to create a library object, and        */\n  /*    FT_Done_Library() to discard it and all child objects.             */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    memory           :: The library's memory object.  Manages memory   */\n  /*                        allocation.                                    */\n  /*                                                                       */\n  /*    version_major    :: The major version number of the library.       */\n  /*                                                                       */\n  /*    version_minor    :: The minor version number of the library.       */\n  /*                                                                       */\n  /*    version_patch    :: The current patch level of the library.        */\n  /*                                                                       */\n  /*    num_modules      :: The number of modules currently registered     */\n  /*                        within this library.  This is set to 0 for new */\n  /*                        libraries.  New modules are added through the  */\n  /*                        FT_Add_Module() API function.                  */\n  /*                                                                       */\n  /*    modules          :: A table used to store handles to the currently */\n  /*                        registered modules. Note that each font driver */\n  /*                        contains a list of its opened faces.           */\n  /*                                                                       */\n  /*    renderers        :: The list of renderers currently registered     */\n  /*                        within the library.                            */\n  /*                                                                       */\n  /*    cur_renderer     :: The current outline renderer.  This is a       */\n  /*                        shortcut used to avoid parsing the list on     */\n  /*                        each call to FT_Outline_Render().  It is a     */\n  /*                        handle to the current renderer for the         */\n  /*                        FT_GLYPH_FORMAT_OUTLINE format.                */\n  /*                                                                       */\n  /*    auto_hinter      :: XXX                                            */\n  /*                                                                       */\n  /*    raster_pool      :: The raster object's render pool.  This can     */\n  /*                        ideally be changed dynamically at run-time.    */\n  /*                                                                       */\n  /*    raster_pool_size :: The size of the render pool in bytes.          */\n  /*                                                                       */\n  /*    debug_hooks      :: XXX                                            */\n  /*                                                                       */\n  /*    lcd_filter       :: If subpixel rendering is activated, the        */\n  /*                        selected LCD filter mode.                      */\n  /*                                                                       */\n  /*    lcd_extra        :: If subpixel rendering is activated, the number */\n  /*                        of extra pixels needed for the LCD filter.     */\n  /*                                                                       */\n  /*    lcd_weights      :: If subpixel rendering is activated, the LCD    */\n  /*                        filter weights, if any.                        */\n  /*                                                                       */\n  /*    lcd_filter_func  :: If subpixel rendering is activated, the LCD    */\n  /*                        filtering callback function.                   */\n  /*                                                                       */\n  /*    pic_container    :: Contains global structs and tables, instead    */\n  /*                        of defining them globallly.                    */\n  /*                                                                       */\n  /*    refcount         :: A counter initialized to~1 at the time an      */\n  /*                        @FT_Library structure is created.              */\n  /*                        @FT_Reference_Library increments this counter, */\n  /*                        and @FT_Done_Library only destroys a library   */\n  /*                        if the counter is~1, otherwise it simply       */\n  /*                        decrements it.                                 */\n  /*                                                                       */\n  typedef struct  FT_LibraryRec_\n  {\n    FT_Memory          memory;           /* library's memory manager */\n\n    FT_Int             version_major;\n    FT_Int             version_minor;\n    FT_Int             version_patch;\n\n    FT_UInt            num_modules;\n    FT_Module          modules[FT_MAX_MODULES];  /* module objects  */\n\n    FT_ListRec         renderers;        /* list of renderers        */\n    FT_Renderer        cur_renderer;     /* current outline renderer */\n    FT_Module          auto_hinter;\n\n    FT_Byte*           raster_pool;      /* scan-line conversion */\n                                         /* render pool          */\n    FT_ULong           raster_pool_size; /* size of render pool in bytes */\n\n    FT_DebugHook_Func  debug_hooks[4];\n\n#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING\n    FT_LcdFilter             lcd_filter;\n    FT_Int                   lcd_extra;        /* number of extra pixels */\n    FT_Byte                  lcd_weights[7];   /* filter weights, if any */\n    FT_Bitmap_LcdFilterFunc  lcd_filter_func;  /* filtering callback     */\n#endif\n\n#ifdef FT_CONFIG_OPTION_PIC\n    FT_PIC_Container   pic_container;\n#endif\n\n    FT_Int             refcount;\n\n  } FT_LibraryRec;\n\n\n  FT_BASE( FT_Renderer )\n  FT_Lookup_Renderer( FT_Library       library,\n                      FT_Glyph_Format  format,\n                      FT_ListNode*     node );\n\n  FT_BASE( FT_Error )\n  FT_Render_Glyph_Internal( FT_Library      library,\n                            FT_GlyphSlot    slot,\n                            FT_Render_Mode  render_mode );\n\n  typedef const char*\n  (*FT_Face_GetPostscriptNameFunc)( FT_Face  face );\n\n  typedef FT_Error\n  (*FT_Face_GetGlyphNameFunc)( FT_Face     face,\n                               FT_UInt     glyph_index,\n                               FT_Pointer  buffer,\n                               FT_UInt     buffer_max );\n\n  typedef FT_UInt\n  (*FT_Face_GetGlyphNameIndexFunc)( FT_Face     face,\n                                    FT_String*  glyph_name );\n\n\n#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Memory                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Creates a new memory object.                                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A pointer to the new memory object.  0 in case of error.           */\n  /*                                                                       */\n  FT_BASE( FT_Memory )\n  FT_New_Memory( void );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Done_Memory                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Discards memory manager.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory :: A handle to the memory manager.                          */\n  /*                                                                       */\n  FT_BASE( void )\n  FT_Done_Memory( FT_Memory  memory );\n\n#endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */\n\n\n  /* Define default raster's interface.  The default raster is located in  */\n  /* `src/base/ftraster.c'.                                                */\n  /*                                                                       */\n  /* Client applications can register new rasters through the              */\n  /* FT_Set_Raster() API.                                                  */\n\n#ifndef FT_NO_DEFAULT_RASTER\n  FT_EXPORT_VAR( FT_Raster_Funcs )  ft_default_raster;\n#endif\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                      P I C   S U P P O R T                      ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* PIC support macros for ftimage.h */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DEFINE_OUTLINE_FUNCS                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to initialize an instance of FT_Outline_Funcs struct.         */\n  /*    When FT_CONFIG_OPTION_PIC is defined an init funtion will need to  */\n  /*    be called with a pre-allocated structure to be filled.             */\n  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */\n  /*    allocated in the global scope (or the scope where the macro        */\n  /*    is used).                                                          */\n  /*                                                                       */\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_OUTLINE_FUNCS(           \\\n          class_,                          \\\n          move_to_,                        \\\n          line_to_,                        \\\n          conic_to_,                       \\\n          cubic_to_,                       \\\n          shift_,                          \\\n          delta_ )                         \\\n  static const  FT_Outline_Funcs class_ =  \\\n  {                                        \\\n    move_to_,                              \\\n    line_to_,                              \\\n    conic_to_,                             \\\n    cubic_to_,                             \\\n    shift_,                                \\\n    delta_                                 \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_OUTLINE_FUNCS(                     \\\n          class_,                                    \\\n          move_to_,                                  \\\n          line_to_,                                  \\\n          conic_to_,                                 \\\n          cubic_to_,                                 \\\n          shift_,                                    \\\n          delta_ )                                   \\\n  static FT_Error                                    \\\n  Init_Class_ ## class_( FT_Outline_Funcs*  clazz )  \\\n  {                                                  \\\n    clazz->move_to  = move_to_;                      \\\n    clazz->line_to  = line_to_;                      \\\n    clazz->conic_to = conic_to_;                     \\\n    clazz->cubic_to = cubic_to_;                     \\\n    clazz->shift    = shift_;                        \\\n    clazz->delta    = delta_;                        \\\n                                                     \\\n    return FT_Err_Ok;                                \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DEFINE_RASTER_FUNCS                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to initialize an instance of FT_Raster_Funcs struct.          */\n  /*    When FT_CONFIG_OPTION_PIC is defined an init funtion will need to  */\n  /*    be called with a pre-allocated structure to be filled.             */\n  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */\n  /*    allocated in the global scope (or the scope where the macro        */\n  /*    is used).                                                          */\n  /*                                                                       */\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_RASTER_FUNCS(    \\\n          class_,                  \\\n          glyph_format_,           \\\n          raster_new_,             \\\n          raster_reset_,           \\\n          raster_set_mode_,        \\\n          raster_render_,          \\\n          raster_done_ )           \\\n  const FT_Raster_Funcs  class_ =  \\\n  {                                \\\n    glyph_format_,                 \\\n    raster_new_,                   \\\n    raster_reset_,                 \\\n    raster_set_mode_,              \\\n    raster_render_,                \\\n    raster_done_                   \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_RASTER_FUNCS(                        \\\n          class_,                                      \\\n          glyph_format_,                               \\\n          raster_new_,                                 \\\n          raster_reset_,                               \\\n          raster_set_mode_,                            \\\n          raster_render_,                              \\\n          raster_done_ )                               \\\n  void                                                 \\\n  FT_Init_Class_ ## class_( FT_Raster_Funcs*  clazz )  \\\n  {                                                    \\\n    clazz->glyph_format    = glyph_format_;            \\\n    clazz->raster_new      = raster_new_;              \\\n    clazz->raster_reset    = raster_reset_;            \\\n    clazz->raster_set_mode = raster_set_mode_;         \\\n    clazz->raster_render   = raster_render_;           \\\n    clazz->raster_done     = raster_done_;             \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n  /* PIC support macros for ftrender.h */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DEFINE_GLYPH                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to initialize an instance of FT_Glyph_Class struct.           */\n  /*    When FT_CONFIG_OPTION_PIC is defined an init funtion will need to  */\n  /*    be called with a pre-allocated stcture to be filled.               */\n  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */\n  /*    allocated in the global scope (or the scope where the macro        */\n  /*    is used).                                                          */\n  /*                                                                       */\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_GLYPH(          \\\n          class_,                 \\\n          size_,                  \\\n          format_,                \\\n          init_,                  \\\n          done_,                  \\\n          copy_,                  \\\n          transform_,             \\\n          bbox_,                  \\\n          prepare_ )              \\\n  FT_CALLBACK_TABLE_DEF           \\\n  const FT_Glyph_Class  class_ =  \\\n  {                               \\\n    size_,                        \\\n    format_,                      \\\n    init_,                        \\\n    done_,                        \\\n    copy_,                        \\\n    transform_,                   \\\n    bbox_,                        \\\n    prepare_                      \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_GLYPH(                              \\\n          class_,                                     \\\n          size_,                                      \\\n          format_,                                    \\\n          init_,                                      \\\n          done_,                                      \\\n          copy_,                                      \\\n          transform_,                                 \\\n          bbox_,                                      \\\n          prepare_ )                                  \\\n  void                                                \\\n  FT_Init_Class_ ## class_( FT_Glyph_Class*  clazz )  \\\n  {                                                   \\\n    clazz->glyph_size      = size_;                   \\\n    clazz->glyph_format    = format_;                 \\\n    clazz->glyph_init      = init_;                   \\\n    clazz->glyph_done      = done_;                   \\\n    clazz->glyph_copy      = copy_;                   \\\n    clazz->glyph_transform = transform_;              \\\n    clazz->glyph_bbox      = bbox_;                   \\\n    clazz->glyph_prepare   = prepare_;                \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DECLARE_RENDERER                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to create a forward declaration of a                          */\n  /*    FT_Renderer_Class struct instance.                                 */\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DEFINE_RENDERER                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to initialize an instance of FT_Renderer_Class struct.        */\n  /*                                                                       */\n  /*    When FT_CONFIG_OPTION_PIC is defined a `create' funtion will need  */\n  /*    to be called with a pointer where the allocated structure is       */\n  /*    returned.  And when it is no longer needed a `destroy' function    */\n  /*    needs to be called to release that allocation.                     */\n  /*    `fcinit.c' (ft_create_default_module_classes) already contains     */\n  /*    a mechanism to call these functions for the default modules        */\n  /*    described in `ftmodule.h'.                                         */\n  /*                                                                       */\n  /*    Notice that the created `create' and `destroy' functions call      */\n  /*    `pic_init' and `pic_free' to allow you to manually allocate and    */\n  /*    initialize any additional global data, like a module specific      */\n  /*    interface, and put them in the global pic container defined in     */\n  /*    `ftpic.h'.  If you don't need them just implement the functions as */\n  /*    empty to resolve the link error.  Also the `pic_init' and          */\n  /*    `pic_free' functions should be declared in `pic.h', to be referred */\n  /*    by the renderer definition calling `FT_DEFINE_RENDERER' in the     */\n  /*    following.                                                         */\n  /*                                                                       */\n  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */\n  /*    allocated in the global scope (or the scope where the macro        */\n  /*    is used).                                                          */\n  /*                                                                       */\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DECLARE_RENDERER( class_ )               \\\n  FT_EXPORT_VAR( const FT_Renderer_Class ) class_;\n\n#define FT_DEFINE_RENDERER(                  \\\n          class_,                            \\\n          flags_,                            \\\n          size_,                             \\\n          name_,                             \\\n          version_,                          \\\n          requires_,                         \\\n          interface_,                        \\\n          init_,                             \\\n          done_,                             \\\n          get_interface_,                    \\\n          glyph_format_,                     \\\n          render_glyph_,                     \\\n          transform_glyph_,                  \\\n          get_glyph_cbox_,                   \\\n          set_mode_,                         \\\n          raster_class_ )                    \\\n  FT_CALLBACK_TABLE_DEF                      \\\n  const FT_Renderer_Class  class_ =          \\\n  {                                          \\\n    FT_DEFINE_ROOT_MODULE( flags_,           \\\n                           size_,            \\\n                           name_,            \\\n                           version_,         \\\n                           requires_,        \\\n                           interface_,       \\\n                           init_,            \\\n                           done_,            \\\n                           get_interface_ )  \\\n    glyph_format_,                           \\\n                                             \\\n    render_glyph_,                           \\\n    transform_glyph_,                        \\\n    get_glyph_cbox_,                         \\\n    set_mode_,                               \\\n                                             \\\n    raster_class_                            \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DECLARE_RENDERER( class_ )  FT_DECLARE_MODULE( class_ )\n\n#define FT_DEFINE_RENDERER(                                      \\\n          class_,                                                \\\n          flags_,                                                \\\n          size_,                                                 \\\n          name_,                                                 \\\n          version_,                                              \\\n          requires_,                                             \\\n          interface_,                                            \\\n          init_,                                                 \\\n          done_,                                                 \\\n          get_interface_,                                        \\\n          glyph_format_,                                         \\\n          render_glyph_,                                         \\\n          transform_glyph_,                                      \\\n          get_glyph_cbox_,                                       \\\n          set_mode_,                                             \\\n          raster_class_ )                                        \\\n  void                                                           \\\n  FT_Destroy_Class_ ## class_( FT_Library        library,        \\\n                               FT_Module_Class*  clazz )         \\\n  {                                                              \\\n    FT_Renderer_Class*  rclazz = (FT_Renderer_Class*)clazz;      \\\n    FT_Memory           memory = library->memory;                \\\n                                                                 \\\n                                                                 \\\n    class_ ## _pic_free( library );                              \\\n    if ( rclazz )                                                \\\n      FT_FREE( rclazz );                                         \\\n  }                                                              \\\n                                                                 \\\n                                                                 \\\n  FT_Error                                                       \\\n  FT_Create_Class_ ## class_( FT_Library         library,        \\\n                              FT_Module_Class**  output_class )  \\\n  {                                                              \\\n    FT_Renderer_Class*  clazz = NULL;                            \\\n    FT_Error            error;                                   \\\n    FT_Memory           memory = library->memory;                \\\n                                                                 \\\n                                                                 \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) )                  \\\n      return error;                                              \\\n                                                                 \\\n    error = class_ ## _pic_init( library );                      \\\n    if ( error )                                                 \\\n    {                                                            \\\n      FT_FREE( clazz );                                          \\\n      return error;                                              \\\n    }                                                            \\\n                                                                 \\\n    FT_DEFINE_ROOT_MODULE( flags_,                               \\\n                           size_,                                \\\n                           name_,                                \\\n                           version_,                             \\\n                           requires_,                            \\\n                           interface_,                           \\\n                           init_,                                \\\n                           done_,                                \\\n                           get_interface_ )                      \\\n                                                                 \\\n    clazz->glyph_format    = glyph_format_;                      \\\n                                                                 \\\n    clazz->render_glyph    = render_glyph_;                      \\\n    clazz->transform_glyph = transform_glyph_;                   \\\n    clazz->get_glyph_cbox  = get_glyph_cbox_;                    \\\n    clazz->set_mode        = set_mode_;                          \\\n                                                                 \\\n    clazz->raster_class    = raster_class_;                      \\\n                                                                 \\\n    *output_class = (FT_Module_Class*)clazz;                     \\\n                                                                 \\\n    return FT_Err_Ok;                                            \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n  /* PIC support macros for ftmodapi.h **/\n\n\n#ifdef FT_CONFIG_OPTION_PIC\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Module_Creator                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to create (allocate) a new module class object.    */\n  /*    The object's members are initialized, but the module itself is     */\n  /*    not.                                                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory       :: A handle to the memory manager.                    */\n  /*    output_class :: Initialized with the newly allocated class.        */\n  /*                                                                       */\n  typedef FT_Error\n  (*FT_Module_Creator)( FT_Memory          memory,\n                        FT_Module_Class**  output_class );\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Module_Destroyer                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to destroy (deallocate) a module class object.     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory :: A handle to the memory manager.                          */\n  /*    clazz  :: Module class to destroy.                                 */\n  /*                                                                       */\n  typedef void\n  (*FT_Module_Destroyer)( FT_Memory         memory,\n                          FT_Module_Class*  clazz );\n\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DECLARE_MODULE                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to create a forward declaration of a                          */\n  /*    FT_Module_Class struct instance.                                   */\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DEFINE_MODULE                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to initialize an instance of an FT_Module_Class struct.       */\n  /*                                                                       */\n  /*    When FT_CONFIG_OPTION_PIC is defined a `create' funtion needs to   */\n  /*    be called with a pointer where the allocated structure is          */\n  /*    returned.  And when it is no longer needed a `destroy' function    */\n  /*    needs to be called to release that allocation.                     */\n  /*    `fcinit.c' (ft_create_default_module_classes) already contains     */\n  /*    a mechanism to call these functions for the default modules        */\n  /*    described in `ftmodule.h'.                                         */\n  /*                                                                       */\n  /*    Notice that the created `create' and `destroy' functions call      */\n  /*    `pic_init' and `pic_free' to allow you to manually allocate and    */\n  /*    initialize any additional global data, like a module specific      */\n  /*    interface, and put them in the global pic container defined in     */\n  /*    `ftpic.h'.  If you don't need them just implement the functions as */\n  /*    empty to resolve the link error.  Also the `pic_init' and          */\n  /*    `pic_free' functions should be declared in `pic.h', to be referred */\n  /*    by the module definition calling `FT_DEFINE_MODULE' in the         */\n  /*    following.                                                         */\n  /*                                                                       */\n  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */\n  /*    allocated in the global scope (or the scope where the macro        */\n  /*    is used).                                                          */\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DEFINE_ROOT_MODULE                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to initialize an instance of an FT_Module_Class struct inside */\n  /*    another struct that contains it or in a function that initializes  */\n  /*    that containing struct.                                            */\n  /*                                                                       */\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DECLARE_MODULE( class_ )  \\\n  FT_CALLBACK_TABLE                  \\\n  const FT_Module_Class  class_;\n\n#define FT_DEFINE_ROOT_MODULE(  \\\n          flags_,               \\\n          size_,                \\\n          name_,                \\\n          version_,             \\\n          requires_,            \\\n          interface_,           \\\n          init_,                \\\n          done_,                \\\n          get_interface_ )      \\\n  {                             \\\n    flags_,                     \\\n    size_,                      \\\n                                \\\n    name_,                      \\\n    version_,                   \\\n    requires_,                  \\\n                                \\\n    interface_,                 \\\n                                \\\n    init_,                      \\\n    done_,                      \\\n    get_interface_,             \\\n  },\n\n#define FT_DEFINE_MODULE(         \\\n          class_,                 \\\n          flags_,                 \\\n          size_,                  \\\n          name_,                  \\\n          version_,               \\\n          requires_,              \\\n          interface_,             \\\n          init_,                  \\\n          done_,                  \\\n          get_interface_ )        \\\n  FT_CALLBACK_TABLE_DEF           \\\n  const FT_Module_Class class_ =  \\\n  {                               \\\n    flags_,                       \\\n    size_,                        \\\n                                  \\\n    name_,                        \\\n    version_,                     \\\n    requires_,                    \\\n                                  \\\n    interface_,                   \\\n                                  \\\n    init_,                        \\\n    done_,                        \\\n    get_interface_,               \\\n  };\n\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DECLARE_MODULE( class_ )                               \\\n  FT_Error                                                        \\\n  FT_Create_Class_ ## class_( FT_Library         library,         \\\n                              FT_Module_Class**  output_class );  \\\n  void                                                            \\\n  FT_Destroy_Class_ ## class_( FT_Library        library,         \\\n                               FT_Module_Class*  clazz );\n\n#define FT_DEFINE_ROOT_MODULE(                      \\\n          flags_,                                   \\\n          size_,                                    \\\n          name_,                                    \\\n          version_,                                 \\\n          requires_,                                \\\n          interface_,                               \\\n          init_,                                    \\\n          done_,                                    \\\n          get_interface_ )                          \\\n    clazz->root.module_flags     = flags_;          \\\n    clazz->root.module_size      = size_;           \\\n    clazz->root.module_name      = name_;           \\\n    clazz->root.module_version   = version_;        \\\n    clazz->root.module_requires  = requires_;       \\\n                                                    \\\n    clazz->root.module_interface = interface_;      \\\n                                                    \\\n    clazz->root.module_init      = init_;           \\\n    clazz->root.module_done      = done_;           \\\n    clazz->root.get_interface    = get_interface_;\n\n#define FT_DEFINE_MODULE(                                        \\\n          class_,                                                \\\n          flags_,                                                \\\n          size_,                                                 \\\n          name_,                                                 \\\n          version_,                                              \\\n          requires_,                                             \\\n          interface_,                                            \\\n          init_,                                                 \\\n          done_,                                                 \\\n          get_interface_ )                                       \\\n  void                                                           \\\n  FT_Destroy_Class_ ## class_( FT_Library        library,        \\\n                               FT_Module_Class*  clazz )         \\\n  {                                                              \\\n    FT_Memory memory = library->memory;                          \\\n                                                                 \\\n                                                                 \\\n    class_ ## _pic_free( library );                              \\\n    if ( clazz )                                                 \\\n      FT_FREE( clazz );                                          \\\n  }                                                              \\\n                                                                 \\\n                                                                 \\\n  FT_Error                                                       \\\n  FT_Create_Class_ ## class_( FT_Library         library,        \\\n                              FT_Module_Class**  output_class )  \\\n  {                                                              \\\n    FT_Memory         memory = library->memory;                  \\\n    FT_Module_Class*  clazz  = NULL;                             \\\n    FT_Error          error;                                     \\\n                                                                 \\\n                                                                 \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) )                  \\\n      return error;                                              \\\n    error = class_ ## _pic_init( library );                      \\\n    if ( error )                                                 \\\n    {                                                            \\\n      FT_FREE( clazz );                                          \\\n      return error;                                              \\\n    }                                                            \\\n                                                                 \\\n    clazz->module_flags     = flags_;                            \\\n    clazz->module_size      = size_;                             \\\n    clazz->module_name      = name_;                             \\\n    clazz->module_version   = version_;                          \\\n    clazz->module_requires  = requires_;                         \\\n                                                                 \\\n    clazz->module_interface = interface_;                        \\\n                                                                 \\\n    clazz->module_init      = init_;                             \\\n    clazz->module_done      = done_;                             \\\n    clazz->get_interface    = get_interface_;                    \\\n                                                                 \\\n    *output_class = clazz;                                       \\\n                                                                 \\\n    return FT_Err_Ok;                                            \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\nFT_END_HEADER\n\n#endif /* __FTOBJS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftpic.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftpic.h                                                                */\n/*                                                                         */\n/*    The FreeType position independent code services (declaration).       */\n/*                                                                         */\n/*  Copyright 2009, 2012 by                                                */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  Modules that ordinarily have const global data that need address     */\n  /*  can instead define pointers here.                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTPIC_H__\n#define __FTPIC_H__\n\n\nFT_BEGIN_HEADER\n\n#ifdef FT_CONFIG_OPTION_PIC\n\n  typedef struct  FT_PIC_Container_\n  {\n    /* pic containers for base */\n    void*  base;\n\n    /* pic containers for modules */\n    void*  autofit;\n    void*  cff;\n    void*  pshinter;\n    void*  psnames;\n    void*  raster;\n    void*  sfnt;\n    void*  smooth;\n    void*  truetype;\n\n  } FT_PIC_Container;\n\n\n  /* Initialize the various function tables, structs, etc. */\n  /* stored in the container.                              */\n  FT_BASE( FT_Error )\n  ft_pic_container_init( FT_Library  library );\n\n\n  /* Destroy the contents of the container. */\n  FT_BASE( void )\n  ft_pic_container_destroy( FT_Library  library );\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FTPIC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftrfork.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftrfork.h                                                              */\n/*                                                                         */\n/*    Embedded resource forks accessor (specification).                    */\n/*                                                                         */\n/*  Copyright 2004, 2006, 2007, 2012 by                                    */\n/*  Masatake YAMATO and Redhat K.K.                                        */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/* Development of the code in this file is support of                      */\n/* Information-technology Promotion Agency, Japan.                         */\n/***************************************************************************/\n\n\n#ifndef __FTRFORK_H__\n#define __FTRFORK_H__\n\n\n#include \"../../ft2build.h\"\n#include \"ftobjs.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /* Number of guessing rules supported in `FT_Raccess_Guess'.            */\n  /* Don't forget to increment the number if you add a new guessing rule. */\n#define FT_RACCESS_N_RULES  9\n\n\n  /* A structure to describe a reference in a resource by its resource ID */\n  /* and internal offset.  The `POST' resource expects to be concatenated */\n  /* by the order of resource IDs instead of its appearance in the file.  */\n\n  typedef struct  FT_RFork_Ref_\n  {\n    FT_UShort  res_id;\n    FT_ULong   offset;\n\n  } FT_RFork_Ref;\n\n#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK\n  typedef FT_Error\n  (*ft_raccess_guess_func)( FT_Library  library,\n                            FT_Stream   stream,\n                            char       *base_file_name,\n                            char      **result_file_name,\n                            FT_Long    *result_offset );\n\n  typedef enum  FT_RFork_Rule_ {\n    FT_RFork_Rule_invalid = -2,\n    FT_RFork_Rule_uknown, /* -1 */\n    FT_RFork_Rule_apple_double,\n    FT_RFork_Rule_apple_single,\n    FT_RFork_Rule_darwin_ufs_export,\n    FT_RFork_Rule_darwin_newvfs,\n    FT_RFork_Rule_darwin_hfsplus,\n    FT_RFork_Rule_vfat,\n    FT_RFork_Rule_linux_cap,\n    FT_RFork_Rule_linux_double,\n    FT_RFork_Rule_linux_netatalk\n  } FT_RFork_Rule;\n\n  /* For fast translation between rule index and rule type,\n   * the macros FT_RFORK_xxx should be kept consistent with\n   * the raccess_guess_funcs table\n   */\n  typedef struct ft_raccess_guess_rec_ {\n    ft_raccess_guess_func  func;\n    FT_RFork_Rule          type;\n  } ft_raccess_guess_rec;\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n  /* this array is a storage in non-PIC mode, so ; is needed in END */\n#define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type )  \\\n          const type name[] = {\n#define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix )  \\\n          { raccess_guess_ ## func_suffix,                           \\\n            FT_RFork_Rule_ ## type_suffix },\n#define CONST_FT_RFORK_RULE_ARRAY_END  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n  /* this array is a function in PIC mode, so no ; is needed in END */\n#define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type )  \\\n          void                                         \\\n          FT_Init_ ## name( type*  storage )           \\\n          {                                            \\\n            type*  local = storage;                    \\\n                                                       \\\n                                                       \\\n            int  i = 0;\n#define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix )  \\\n          local[i].func = raccess_guess_ ## func_suffix;             \\\n          local[i].type = FT_RFork_Rule_ ## type_suffix;             \\\n          i++;\n#define CONST_FT_RFORK_RULE_ARRAY_END  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n#endif /* FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Raccess_Guess                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Guess a file name and offset where the actual resource fork is     */\n  /*    stored.  The macro FT_RACCESS_N_RULES holds the number of          */\n  /*    guessing rules;  the guessed result for the Nth rule is            */\n  /*    represented as a triplet: a new file name (new_names[N]), a file   */\n  /*    offset (offsets[N]), and an error code (errors[N]).                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library ::                                                         */\n  /*      A FreeType library instance.                                     */\n  /*                                                                       */\n  /*    stream ::                                                          */\n  /*      A file stream containing the resource fork.                      */\n  /*                                                                       */\n  /*    base_name ::                                                       */\n  /*      The (base) file name of the resource fork used for some          */\n  /*      guessing rules.                                                  */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    new_names ::                                                       */\n  /*      An array of guessed file names in which the resource forks may   */\n  /*      exist.  If `new_names[N]' is NULL, the guessed file name is      */\n  /*      equal to `base_name'.                                            */\n  /*                                                                       */\n  /*    offsets ::                                                         */\n  /*      An array of guessed file offsets.  `offsets[N]' holds the file   */\n  /*      offset of the possible start of the resource fork in file        */\n  /*      `new_names[N]'.                                                  */\n  /*                                                                       */\n  /*    errors ::                                                          */\n  /*      An array of FreeType error codes.  `errors[N]' is the error      */\n  /*      code of Nth guessing rule function.  If `errors[N]' is not       */\n  /*      FT_Err_Ok, `new_names[N]' and `offsets[N]' are meaningless.      */\n  /*                                                                       */\n  FT_BASE( void )\n  FT_Raccess_Guess( FT_Library  library,\n                    FT_Stream   stream,\n                    char*       base_name,\n                    char**      new_names,\n                    FT_Long*    offsets,\n                    FT_Error*   errors );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Raccess_Get_HeaderInfo                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Get the information from the header of resource fork.  The         */\n  /*    information includes the file offset where the resource map        */\n  /*    starts, and the file offset where the resource data starts.        */\n  /*    `FT_Raccess_Get_DataOffsets' requires these two data.              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library ::                                                         */\n  /*      A FreeType library instance.                                     */\n  /*                                                                       */\n  /*    stream ::                                                          */\n  /*      A file stream containing the resource fork.                      */\n  /*                                                                       */\n  /*    rfork_offset ::                                                    */\n  /*      The file offset where the resource fork starts.                  */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    map_offset ::                                                      */\n  /*      The file offset where the resource map starts.                   */\n  /*                                                                       */\n  /*    rdata_pos ::                                                       */\n  /*      The file offset where the resource data starts.                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  FT_Err_Ok means success.                     */\n  /*                                                                       */\n  FT_BASE( FT_Error )\n  FT_Raccess_Get_HeaderInfo( FT_Library  library,\n                             FT_Stream   stream,\n                             FT_Long     rfork_offset,\n                             FT_Long    *map_offset,\n                             FT_Long    *rdata_pos );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Raccess_Get_DataOffsets                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Get the data offsets for a tag in a resource fork.  Offsets are    */\n  /*    stored in an array because, in some cases, resources in a resource */\n  /*    fork have the same tag.                                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library ::                                                         */\n  /*      A FreeType library instance.                                     */\n  /*                                                                       */\n  /*    stream ::                                                          */\n  /*      A file stream containing the resource fork.                      */\n  /*                                                                       */\n  /*    map_offset ::                                                      */\n  /*      The file offset where the resource map starts.                   */\n  /*                                                                       */\n  /*    rdata_pos ::                                                       */\n  /*      The file offset where the resource data starts.                  */\n  /*                                                                       */\n  /*    tag ::                                                             */\n  /*      The resource tag.                                                */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    offsets ::                                                         */\n  /*      The stream offsets for the resource data specified by `tag'.     */\n  /*      This array is allocated by the function, so you have to call     */\n  /*      @ft_mem_free after use.                                          */\n  /*                                                                       */\n  /*    count ::                                                           */\n  /*      The length of offsets array.                                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  FT_Err_Ok means success.                     */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Normally you should use `FT_Raccess_Get_HeaderInfo' to get the     */\n  /*    value for `map_offset' and `rdata_pos'.                            */\n  /*                                                                       */\n  FT_BASE( FT_Error )\n  FT_Raccess_Get_DataOffsets( FT_Library  library,\n                              FT_Stream   stream,\n                              FT_Long     map_offset,\n                              FT_Long     rdata_pos,\n                              FT_Long     tag,\n                              FT_Long   **offsets,\n                              FT_Long    *count );\n\n\nFT_END_HEADER\n\n#endif /* __FTRFORK_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftserv.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftserv.h                                                               */\n/*                                                                         */\n/*    The FreeType services (specification only).                          */\n/*                                                                         */\n/*  Copyright 2003-2007, 2009, 2012, 2013 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  Each module can export one or more `services'.  Each service is      */\n  /*  identified by a constant string and modeled by a pointer; the latter */\n  /*  generally corresponds to a structure containing function pointers.   */\n  /*                                                                       */\n  /*  Note that a service's data cannot be a mere function pointer because */\n  /*  in C it is possible that function pointers might be implemented      */\n  /*  differently than data pointers (e.g. 48 bits instead of 32).         */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTSERV_H__\n#define __FTSERV_H__\n\n\nFT_BEGIN_HEADER\n\n  /*\n   * @macro:\n   *   FT_FACE_FIND_SERVICE\n   *\n   * @description:\n   *   This macro is used to look up a service from a face's driver module.\n   *\n   * @input:\n   *   face ::\n   *     The source face handle.\n   *\n   *   id ::\n   *     A string describing the service as defined in the service's\n   *     header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to\n   *     `multi-masters').  It is automatically prefixed with\n   *     `FT_SERVICE_ID_'.\n   *\n   * @output:\n   *   ptr ::\n   *     A variable that receives the service pointer.  Will be NULL\n   *     if not found.\n   */\n#ifdef __cplusplus\n\n#define FT_FACE_FIND_SERVICE( face, ptr, id )                               \\\n  FT_BEGIN_STMNT                                                            \\\n    FT_Module    module = FT_MODULE( FT_FACE( face )->driver );             \\\n    FT_Pointer   _tmp_  = NULL;                                             \\\n    FT_Pointer*  _pptr_ = (FT_Pointer*)&(ptr);                              \\\n                                                                            \\\n                                                                            \\\n    if ( module->clazz->get_interface )                                     \\\n      _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \\\n    *_pptr_ = _tmp_;                                                        \\\n  FT_END_STMNT\n\n#else /* !C++ */\n\n#define FT_FACE_FIND_SERVICE( face, ptr, id )                               \\\n  FT_BEGIN_STMNT                                                            \\\n    FT_Module   module = FT_MODULE( FT_FACE( face )->driver );              \\\n    FT_Pointer  _tmp_  = NULL;                                              \\\n                                                                            \\\n    if ( module->clazz->get_interface )                                     \\\n      _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \\\n    ptr = _tmp_;                                                            \\\n  FT_END_STMNT\n\n#endif /* !C++ */\n\n\n  /*\n   * @macro:\n   *   FT_FACE_FIND_GLOBAL_SERVICE\n   *\n   * @description:\n   *   This macro is used to look up a service from all modules.\n   *\n   * @input:\n   *   face ::\n   *     The source face handle.\n   *\n   *   id ::\n   *     A string describing the service as defined in the service's\n   *     header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to\n   *     `multi-masters').  It is automatically prefixed with\n   *     `FT_SERVICE_ID_'.\n   *\n   * @output:\n   *   ptr ::\n   *     A variable that receives the service pointer.  Will be NULL\n   *     if not found.\n   */\n#ifdef __cplusplus\n\n#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id )               \\\n  FT_BEGIN_STMNT                                                   \\\n    FT_Module    module = FT_MODULE( FT_FACE( face )->driver );    \\\n    FT_Pointer   _tmp_;                                            \\\n    FT_Pointer*  _pptr_ = (FT_Pointer*)&(ptr);                     \\\n                                                                   \\\n                                                                   \\\n    _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \\\n    *_pptr_ = _tmp_;                                               \\\n  FT_END_STMNT\n\n#else /* !C++ */\n\n#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id )               \\\n  FT_BEGIN_STMNT                                                   \\\n    FT_Module   module = FT_MODULE( FT_FACE( face )->driver );     \\\n    FT_Pointer  _tmp_;                                             \\\n                                                                   \\\n                                                                   \\\n    _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \\\n    ptr   = _tmp_;                                                 \\\n  FT_END_STMNT\n\n#endif /* !C++ */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****         S E R V I C E   D E S C R I P T O R S                 *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*\n   *  The following structure is used to _describe_ a given service\n   *  to the library.  This is useful to build simple static service lists.\n   */\n  typedef struct  FT_ServiceDescRec_\n  {\n    const char*  serv_id;     /* service name         */\n    const void*  serv_data;   /* service pointer/data */\n\n  } FT_ServiceDescRec;\n\n  typedef const FT_ServiceDescRec*  FT_ServiceDesc;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DEFINE_SERVICEDESCREC1                                          */\n  /*    FT_DEFINE_SERVICEDESCREC2                                          */\n  /*    FT_DEFINE_SERVICEDESCREC3                                          */\n  /*    FT_DEFINE_SERVICEDESCREC4                                          */\n  /*    FT_DEFINE_SERVICEDESCREC5                                          */\n  /*    FT_DEFINE_SERVICEDESCREC6                                          */\n  /*    FT_DEFINE_SERVICEDESCREC7                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to initialize an array of FT_ServiceDescRec structures.       */\n  /*                                                                       */\n  /*    When FT_CONFIG_OPTION_PIC is defined a `create' function needs to  */\n  /*    be called with a pointer to return an allocated array.  As soon as */\n  /*    it is no longer needed, a `destroy' function needs to be called to */\n  /*    release that allocation.                                           */\n  /*                                                                       */\n  /*    These functions should be manually called from the `pic_init' and  */\n  /*    `pic_free' functions of your module (see FT_DEFINE_MODULE).        */\n  /*                                                                       */\n  /*    When FT_CONFIG_OPTION_PIC is not defined the array will be         */\n  /*    allocated in the global scope (or the scope where the macro is     */\n  /*    used).                                                             */\n  /*                                                                       */\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICEDESCREC1( class_,                                  \\\n                                   serv_id_1, serv_data_1 )                 \\\n  static const FT_ServiceDescRec  class_[] =                                \\\n  {                                                                         \\\n    { serv_id_1, serv_data_1 },                                             \\\n    { NULL, NULL }                                                          \\\n  };\n\n#define FT_DEFINE_SERVICEDESCREC2( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2 )                 \\\n  static const FT_ServiceDescRec  class_[] =                                \\\n  {                                                                         \\\n    { serv_id_1, serv_data_1 },                                             \\\n    { serv_id_2, serv_data_2 },                                             \\\n    { NULL, NULL }                                                          \\\n  };\n\n#define FT_DEFINE_SERVICEDESCREC3( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3 )                 \\\n  static const FT_ServiceDescRec  class_[] =                                \\\n  {                                                                         \\\n    { serv_id_1, serv_data_1 },                                             \\\n    { serv_id_2, serv_data_2 },                                             \\\n    { serv_id_3, serv_data_3 },                                             \\\n    { NULL, NULL }                                                          \\\n  };\n\n#define FT_DEFINE_SERVICEDESCREC4( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3,                  \\\n                                   serv_id_4, serv_data_4 )                 \\\n  static const FT_ServiceDescRec  class_[] =                                \\\n  {                                                                         \\\n    { serv_id_1, serv_data_1 },                                             \\\n    { serv_id_2, serv_data_2 },                                             \\\n    { serv_id_3, serv_data_3 },                                             \\\n    { serv_id_4, serv_data_4 },                                             \\\n    { NULL, NULL }                                                          \\\n  };\n\n#define FT_DEFINE_SERVICEDESCREC5( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3,                  \\\n                                   serv_id_4, serv_data_4,                  \\\n                                   serv_id_5, serv_data_5 )                 \\\n  static const FT_ServiceDescRec  class_[] =                                \\\n  {                                                                         \\\n    { serv_id_1, serv_data_1 },                                             \\\n    { serv_id_2, serv_data_2 },                                             \\\n    { serv_id_3, serv_data_3 },                                             \\\n    { serv_id_4, serv_data_4 },                                             \\\n    { serv_id_5, serv_data_5 },                                             \\\n    { NULL, NULL }                                                          \\\n  };\n\n#define FT_DEFINE_SERVICEDESCREC6( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3,                  \\\n                                   serv_id_4, serv_data_4,                  \\\n                                   serv_id_5, serv_data_5,                  \\\n                                   serv_id_6, serv_data_6 )                 \\\n  static const FT_ServiceDescRec  class_[] =                                \\\n  {                                                                         \\\n    { serv_id_1, serv_data_1 },                                             \\\n    { serv_id_2, serv_data_2 },                                             \\\n    { serv_id_3, serv_data_3 },                                             \\\n    { serv_id_4, serv_data_4 },                                             \\\n    { serv_id_5, serv_data_5 },                                             \\\n    { serv_id_6, serv_data_6 },                                             \\\n    { NULL, NULL }                                                          \\\n  };\n\n#define FT_DEFINE_SERVICEDESCREC7( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3,                  \\\n                                   serv_id_4, serv_data_4,                  \\\n                                   serv_id_5, serv_data_5,                  \\\n                                   serv_id_6, serv_data_6,                  \\\n                                   serv_id_7, serv_data_7 )                 \\\n  static const FT_ServiceDescRec  class_[] =                                \\\n  {                                                                         \\\n    { serv_id_1, serv_data_1 },                                             \\\n    { serv_id_2, serv_data_2 },                                             \\\n    { serv_id_3, serv_data_3 },                                             \\\n    { serv_id_4, serv_data_4 },                                             \\\n    { serv_id_5, serv_data_5 },                                             \\\n    { serv_id_6, serv_data_6 },                                             \\\n    { serv_id_7, serv_data_7 },                                             \\\n    { NULL, NULL }                                                          \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICEDESCREC1( class_,                                  \\\n                                   serv_id_1, serv_data_1 )                 \\\n  void                                                                      \\\n  FT_Destroy_Class_ ## class_( FT_Library          library,                 \\\n                               FT_ServiceDescRec*  clazz )                  \\\n  {                                                                         \\\n    FT_Memory  memory = library->memory;                                    \\\n                                                                            \\\n                                                                            \\\n    if ( clazz )                                                            \\\n      FT_FREE( clazz );                                                     \\\n  }                                                                         \\\n                                                                            \\\n  FT_Error                                                                  \\\n  FT_Create_Class_ ## class_( FT_Library           library,                 \\\n                              FT_ServiceDescRec**  output_class )           \\\n  {                                                                         \\\n    FT_ServiceDescRec*  clazz  = NULL;                                      \\\n    FT_Error            error;                                              \\\n    FT_Memory           memory = library->memory;                           \\\n                                                                            \\\n                                                                            \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 2 ) )                         \\\n      return error;                                                         \\\n                                                                            \\\n    clazz[0].serv_id   = serv_id_1;                                         \\\n    clazz[0].serv_data = serv_data_1;                                       \\\n    clazz[1].serv_id   = NULL;                                              \\\n    clazz[1].serv_data = NULL;                                              \\\n                                                                            \\\n    *output_class = clazz;                                                  \\\n                                                                            \\\n    return FT_Err_Ok;                                                       \\\n  }\n\n#define FT_DEFINE_SERVICEDESCREC2( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2 )                 \\\n  void                                                                      \\\n  FT_Destroy_Class_ ## class_( FT_Library          library,                 \\\n                               FT_ServiceDescRec*  clazz )                  \\\n  {                                                                         \\\n    FT_Memory  memory = library->memory;                                    \\\n                                                                            \\\n                                                                            \\\n    if ( clazz )                                                            \\\n      FT_FREE( clazz );                                                     \\\n  }                                                                         \\\n                                                                            \\\n  FT_Error                                                                  \\\n  FT_Create_Class_ ## class_( FT_Library           library,                 \\\n                              FT_ServiceDescRec**  output_class )           \\\n  {                                                                         \\\n    FT_ServiceDescRec*  clazz  = NULL;                                      \\\n    FT_Error            error;                                              \\\n    FT_Memory           memory = library->memory;                           \\\n                                                                            \\\n                                                                            \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 3 ) )                         \\\n      return error;                                                         \\\n                                                                            \\\n    clazz[0].serv_id   = serv_id_1;                                         \\\n    clazz[0].serv_data = serv_data_1;                                       \\\n    clazz[1].serv_id   = serv_id_2;                                         \\\n    clazz[1].serv_data = serv_data_2;                                       \\\n    clazz[2].serv_id   = NULL;                                              \\\n    clazz[2].serv_data = NULL;                                              \\\n                                                                            \\\n    *output_class = clazz;                                                  \\\n                                                                            \\\n    return FT_Err_Ok;                                                       \\\n  }\n\n#define FT_DEFINE_SERVICEDESCREC3( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3 )                 \\\n  void                                                                      \\\n  FT_Destroy_Class_ ## class_( FT_Library          library,                 \\\n                               FT_ServiceDescRec*  clazz )                  \\\n  {                                                                         \\\n    FT_Memory  memory = library->memory;                                    \\\n                                                                            \\\n                                                                            \\\n    if ( clazz )                                                            \\\n      FT_FREE( clazz );                                                     \\\n  }                                                                         \\\n                                                                            \\\n  FT_Error                                                                  \\\n  FT_Create_Class_ ## class_( FT_Library           library,                 \\\n                              FT_ServiceDescRec**  output_class )           \\\n  {                                                                         \\\n    FT_ServiceDescRec*  clazz  = NULL;                                      \\\n    FT_Error            error;                                              \\\n    FT_Memory           memory = library->memory;                           \\\n                                                                            \\\n                                                                            \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 4 ) )                         \\\n      return error;                                                         \\\n                                                                            \\\n    clazz[0].serv_id   = serv_id_1;                                         \\\n    clazz[0].serv_data = serv_data_1;                                       \\\n    clazz[1].serv_id   = serv_id_2;                                         \\\n    clazz[1].serv_data = serv_data_2;                                       \\\n    clazz[2].serv_id   = serv_id_3;                                         \\\n    clazz[2].serv_data = serv_data_3;                                       \\\n    clazz[3].serv_id   = NULL;                                              \\\n    clazz[3].serv_data = NULL;                                              \\\n                                                                            \\\n    *output_class = clazz;                                                  \\\n                                                                            \\\n    return FT_Err_Ok;                                                       \\\n  }\n\n#define FT_DEFINE_SERVICEDESCREC4( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3,                  \\\n                                   serv_id_4, serv_data_4 )                 \\\n  void                                                                      \\\n  FT_Destroy_Class_ ## class_( FT_Library          library,                 \\\n                               FT_ServiceDescRec*  clazz )                  \\\n  {                                                                         \\\n    FT_Memory  memory = library->memory;                                    \\\n                                                                            \\\n                                                                            \\\n    if ( clazz )                                                            \\\n      FT_FREE( clazz );                                                     \\\n  }                                                                         \\\n                                                                            \\\n  FT_Error                                                                  \\\n  FT_Create_Class_ ## class_( FT_Library           library,                 \\\n                              FT_ServiceDescRec**  output_class )           \\\n  {                                                                         \\\n    FT_ServiceDescRec*  clazz  = NULL;                                      \\\n    FT_Error            error;                                              \\\n    FT_Memory           memory = library->memory;                           \\\n                                                                            \\\n                                                                            \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 5 ) )                         \\\n      return error;                                                         \\\n                                                                            \\\n    clazz[0].serv_id   = serv_id_1;                                         \\\n    clazz[0].serv_data = serv_data_1;                                       \\\n    clazz[1].serv_id   = serv_id_2;                                         \\\n    clazz[1].serv_data = serv_data_2;                                       \\\n    clazz[2].serv_id   = serv_id_3;                                         \\\n    clazz[2].serv_data = serv_data_3;                                       \\\n    clazz[3].serv_id   = serv_id_4;                                         \\\n    clazz[3].serv_data = serv_data_4;                                       \\\n    clazz[4].serv_id   = NULL;                                              \\\n    clazz[4].serv_data = NULL;                                              \\\n                                                                            \\\n    *output_class = clazz;                                                  \\\n                                                                            \\\n    return FT_Err_Ok;                                                       \\\n  }\n\n#define FT_DEFINE_SERVICEDESCREC5( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3,                  \\\n                                   serv_id_4, serv_data_4,                  \\\n                                   serv_id_5, serv_data_5 )                 \\\n  void                                                                      \\\n  FT_Destroy_Class_ ## class_( FT_Library          library,                 \\\n                               FT_ServiceDescRec*  clazz )                  \\\n  {                                                                         \\\n    FT_Memory  memory = library->memory;                                    \\\n                                                                            \\\n                                                                            \\\n    if ( clazz )                                                            \\\n      FT_FREE( clazz );                                                     \\\n  }                                                                         \\\n                                                                            \\\n  FT_Error                                                                  \\\n  FT_Create_Class_ ## class_( FT_Library           library,                 \\\n                              FT_ServiceDescRec**  output_class )           \\\n  {                                                                         \\\n    FT_ServiceDescRec*  clazz  = NULL;                                      \\\n    FT_Error            error;                                              \\\n    FT_Memory           memory = library->memory;                           \\\n                                                                            \\\n                                                                            \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 6 ) )                         \\\n      return error;                                                         \\\n                                                                            \\\n    clazz[0].serv_id   = serv_id_1;                                         \\\n    clazz[0].serv_data = serv_data_1;                                       \\\n    clazz[1].serv_id   = serv_id_2;                                         \\\n    clazz[1].serv_data = serv_data_2;                                       \\\n    clazz[2].serv_id   = serv_id_3;                                         \\\n    clazz[2].serv_data = serv_data_3;                                       \\\n    clazz[3].serv_id   = serv_id_4;                                         \\\n    clazz[3].serv_data = serv_data_4;                                       \\\n    clazz[4].serv_id   = serv_id_5;                                         \\\n    clazz[4].serv_data = serv_data_5;                                       \\\n    clazz[5].serv_id   = NULL;                                              \\\n    clazz[5].serv_data = NULL;                                              \\\n                                                                            \\\n    *output_class = clazz;                                                  \\\n                                                                            \\\n    return FT_Err_Ok;                                                       \\\n  }\n\n#define FT_DEFINE_SERVICEDESCREC6( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3,                  \\\n                                   serv_id_4, serv_data_4,                  \\\n                                   serv_id_5, serv_data_5,                  \\\n                                   serv_id_6, serv_data_6 )                 \\\n  void                                                                      \\\n  FT_Destroy_Class_ ## class_( FT_Library          library,                 \\\n                               FT_ServiceDescRec*  clazz )                  \\\n  {                                                                         \\\n    FT_Memory  memory = library->memory;                                    \\\n                                                                            \\\n                                                                            \\\n    if ( clazz )                                                            \\\n      FT_FREE( clazz );                                                     \\\n  }                                                                         \\\n                                                                            \\\n  FT_Error                                                                  \\\n  FT_Create_Class_ ## class_( FT_Library           library,                 \\\n                              FT_ServiceDescRec**  output_class)            \\\n  {                                                                         \\\n    FT_ServiceDescRec*  clazz  = NULL;                                      \\\n    FT_Error            error;                                              \\\n    FT_Memory           memory = library->memory;                           \\\n                                                                            \\\n                                                                            \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 7 ) )                         \\\n      return error;                                                         \\\n                                                                            \\\n    clazz[0].serv_id   = serv_id_1;                                         \\\n    clazz[0].serv_data = serv_data_1;                                       \\\n    clazz[1].serv_id   = serv_id_2;                                         \\\n    clazz[1].serv_data = serv_data_2;                                       \\\n    clazz[2].serv_id   = serv_id_3;                                         \\\n    clazz[2].serv_data = serv_data_3;                                       \\\n    clazz[3].serv_id   = serv_id_4;                                         \\\n    clazz[3].serv_data = serv_data_4;                                       \\\n    clazz[4].serv_id   = serv_id_5;                                         \\\n    clazz[4].serv_data = serv_data_5;                                       \\\n    clazz[5].serv_id   = serv_id_6;                                         \\\n    clazz[5].serv_data = serv_data_6;                                       \\\n    clazz[6].serv_id   = NULL;                                              \\\n    clazz[6].serv_data = NULL;                                              \\\n                                                                            \\\n    *output_class = clazz;                                                  \\\n                                                                            \\\n    return FT_Err_Ok;                                                       \\\n  }\n\n#define FT_DEFINE_SERVICEDESCREC7( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3,                  \\\n                                   serv_id_4, serv_data_4,                  \\\n                                   serv_id_5, serv_data_5,                  \\\n                                   serv_id_6, serv_data_6,                  \\\n                                   serv_id_7, serv_data_7 )                 \\\n  void                                                                      \\\n  FT_Destroy_Class_ ## class_( FT_Library          library,                 \\\n                               FT_ServiceDescRec*  clazz )                  \\\n  {                                                                         \\\n    FT_Memory  memory = library->memory;                                    \\\n                                                                            \\\n                                                                            \\\n    if ( clazz )                                                            \\\n      FT_FREE( clazz );                                                     \\\n  }                                                                         \\\n                                                                            \\\n  FT_Error                                                                  \\\n  FT_Create_Class_ ## class_( FT_Library           library,                 \\\n                              FT_ServiceDescRec**  output_class)            \\\n  {                                                                         \\\n    FT_ServiceDescRec*  clazz  = NULL;                                      \\\n    FT_Error            error;                                              \\\n    FT_Memory           memory = library->memory;                           \\\n                                                                            \\\n                                                                            \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 8 ) )                         \\\n      return error;                                                         \\\n                                                                            \\\n    clazz[0].serv_id   = serv_id_1;                                         \\\n    clazz[0].serv_data = serv_data_1;                                       \\\n    clazz[1].serv_id   = serv_id_2;                                         \\\n    clazz[1].serv_data = serv_data_2;                                       \\\n    clazz[2].serv_id   = serv_id_3;                                         \\\n    clazz[2].serv_data = serv_data_3;                                       \\\n    clazz[3].serv_id   = serv_id_4;                                         \\\n    clazz[3].serv_data = serv_data_4;                                       \\\n    clazz[4].serv_id   = serv_id_5;                                         \\\n    clazz[4].serv_data = serv_data_5;                                       \\\n    clazz[5].serv_id   = serv_id_6;                                         \\\n    clazz[5].serv_data = serv_data_6;                                       \\\n    clazz[6].serv_id   = serv_id_7;                                         \\\n    clazz[6].serv_data = serv_data_7;                                       \\\n    clazz[7].serv_id   = NULL;                                              \\\n    clazz[7].serv_data = NULL;                                              \\\n                                                                            \\\n    *output_class = clazz;                                                  \\\n                                                                            \\\n    return FT_Err_Ok;                                                       \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n  /*\n   *  Parse a list of FT_ServiceDescRec descriptors and look for\n   *  a specific service by ID.  Note that the last element in the\n   *  array must be { NULL, NULL }, and that the function should\n   *  return NULL if the service isn't available.\n   *\n   *  This function can be used by modules to implement their\n   *  `get_service' method.\n   */\n  FT_BASE( FT_Pointer )\n  ft_service_list_lookup( FT_ServiceDesc  service_descriptors,\n                          const char*     service_id );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****             S E R V I C E S   C A C H E                       *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*\n   *  This structure is used to store a cache for several frequently used\n   *  services.  It is the type of `face->internal->services'.  You\n   *  should only use FT_FACE_LOOKUP_SERVICE to access it.\n   *\n   *  All fields should have the type FT_Pointer to relax compilation\n   *  dependencies.  We assume the developer isn't completely stupid.\n   *\n   *  Each field must be named `service_XXXX' where `XXX' corresponds to\n   *  the correct FT_SERVICE_ID_XXXX macro.  See the definition of\n   *  FT_FACE_LOOKUP_SERVICE below how this is implemented.\n   *\n   */\n  typedef struct  FT_ServiceCacheRec_\n  {\n    FT_Pointer  service_POSTSCRIPT_FONT_NAME;\n    FT_Pointer  service_MULTI_MASTERS;\n    FT_Pointer  service_GLYPH_DICT;\n    FT_Pointer  service_PFR_METRICS;\n    FT_Pointer  service_WINFNT;\n\n  } FT_ServiceCacheRec, *FT_ServiceCache;\n\n\n  /*\n   *  A magic number used within the services cache.\n   */\n\n  /* ensure that value `1' has the same width as a pointer */\n#define FT_SERVICE_UNAVAILABLE  ((FT_Pointer)~(FT_PtrDist)1)\n\n\n  /*\n   * @macro:\n   *   FT_FACE_LOOKUP_SERVICE\n   *\n   * @description:\n   *   This macro is used to lookup a service from a face's driver module\n   *   using its cache.\n   *\n   * @input:\n   *   face::\n   *     The source face handle containing the cache.\n   *\n   *   field ::\n   *     The field name in the cache.\n   *\n   *   id ::\n   *     The service ID.\n   *\n   * @output:\n   *   ptr ::\n   *     A variable receiving the service data.  NULL if not available.\n   */\n#ifdef __cplusplus\n\n#define FT_FACE_LOOKUP_SERVICE( face, ptr, id )                \\\n  FT_BEGIN_STMNT                                               \\\n    FT_Pointer   svc;                                          \\\n    FT_Pointer*  Pptr = (FT_Pointer*)&(ptr);                   \\\n                                                               \\\n                                                               \\\n    svc = FT_FACE( face )->internal->services. service_ ## id; \\\n    if ( svc == FT_SERVICE_UNAVAILABLE )                       \\\n      svc = NULL;                                              \\\n    else if ( svc == NULL )                                    \\\n    {                                                          \\\n      FT_FACE_FIND_SERVICE( face, svc, id );                   \\\n                                                               \\\n      FT_FACE( face )->internal->services. service_ ## id =    \\\n        (FT_Pointer)( svc != NULL ? svc                        \\\n                                  : FT_SERVICE_UNAVAILABLE );  \\\n    }                                                          \\\n    *Pptr = svc;                                               \\\n  FT_END_STMNT\n\n#else /* !C++ */\n\n#define FT_FACE_LOOKUP_SERVICE( face, ptr, id )                \\\n  FT_BEGIN_STMNT                                               \\\n    FT_Pointer  svc;                                           \\\n                                                               \\\n                                                               \\\n    svc = FT_FACE( face )->internal->services. service_ ## id; \\\n    if ( svc == FT_SERVICE_UNAVAILABLE )                       \\\n      svc = NULL;                                              \\\n    else if ( svc == NULL )                                    \\\n    {                                                          \\\n      FT_FACE_FIND_SERVICE( face, svc, id );                   \\\n                                                               \\\n      FT_FACE( face )->internal->services. service_ ## id =    \\\n        (FT_Pointer)( svc != NULL ? svc                        \\\n                                  : FT_SERVICE_UNAVAILABLE );  \\\n    }                                                          \\\n    ptr = svc;                                                 \\\n  FT_END_STMNT\n\n#endif /* !C++ */\n\n  /*\n   *  A macro used to define new service structure types.\n   */\n\n#define FT_DEFINE_SERVICE( name )            \\\n  typedef struct FT_Service_ ## name ## Rec_ \\\n    FT_Service_ ## name ## Rec ;             \\\n  typedef struct FT_Service_ ## name ## Rec_ \\\n    const * FT_Service_ ## name ;            \\\n  struct FT_Service_ ## name ## Rec_\n\n  /* */\n\n  /*\n   *  The header files containing the services.\n   */\n\n#define FT_SERVICE_BDF_H                <freetype/internal/services/svbdf.h>\n#define FT_SERVICE_CID_H                <freetype/internal/services/svcid.h>\n#define FT_SERVICE_GLYPH_DICT_H         <freetype/internal/services/svgldict.h>\n#define FT_SERVICE_GX_VALIDATE_H        <freetype/internal/services/svgxval.h>\n#define FT_SERVICE_KERNING_H            <freetype/internal/services/svkern.h>\n#define FT_SERVICE_MULTIPLE_MASTERS_H   <freetype/internal/services/svmm.h>\n#define FT_SERVICE_OPENTYPE_VALIDATE_H  <freetype/internal/services/svotval.h>\n#define FT_SERVICE_PFR_H                <freetype/internal/services/svpfr.h>\n#define FT_SERVICE_POSTSCRIPT_CMAPS_H   <freetype/internal/services/svpscmap.h>\n#define FT_SERVICE_POSTSCRIPT_INFO_H    <freetype/internal/services/svpsinfo.h>\n#define FT_SERVICE_POSTSCRIPT_NAME_H    <freetype/internal/services/svpostnm.h>\n#define FT_SERVICE_PROPERTIES_H         <freetype/internal/services/svprop.h>\n#define FT_SERVICE_SFNT_H               <freetype/internal/services/svsfnt.h>\n#define FT_SERVICE_TRUETYPE_ENGINE_H    <freetype/internal/services/svtteng.h>\n#define FT_SERVICE_TT_CMAP_H            <freetype/internal/services/svttcmap.h>\n#define FT_SERVICE_WINFNT_H             <freetype/internal/services/svwinfnt.h>\n#define FT_SERVICE_XFREE86_NAME_H       <freetype/internal/services/svxf86nm.h>\n#define FT_SERVICE_TRUETYPE_GLYF_H      <freetype/internal/services/svttglyf.h>\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FTSERV_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftstream.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftstream.h                                                             */\n/*                                                                         */\n/*    Stream handling (specification).                                     */\n/*                                                                         */\n/*  Copyright 1996-2002, 2004-2006, 2011, 2013 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTSTREAM_H__\n#define __FTSTREAM_H__\n\n\n#include \"../../ft2build.h\"\n#include \"../ftsystem.h\"\n#include \"ftobjs.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /* format of an 8-bit frame_op value:           */\n  /*                                              */\n  /* bit  76543210                                */\n  /*      xxxxxxes                                */\n  /*                                              */\n  /* s is set to 1 if the value is signed.        */\n  /* e is set to 1 if the value is little-endian. */\n  /* xxx is a command.                            */\n\n#define FT_FRAME_OP_SHIFT         2\n#define FT_FRAME_OP_SIGNED        1\n#define FT_FRAME_OP_LITTLE        2\n#define FT_FRAME_OP_COMMAND( x )  ( x >> FT_FRAME_OP_SHIFT )\n\n#define FT_MAKE_FRAME_OP( command, little, sign ) \\\n          ( ( command << FT_FRAME_OP_SHIFT ) | ( little << 1 ) | sign )\n\n#define FT_FRAME_OP_END    0\n#define FT_FRAME_OP_START  1  /* start a new frame     */\n#define FT_FRAME_OP_BYTE   2  /* read 1-byte value     */\n#define FT_FRAME_OP_SHORT  3  /* read 2-byte value     */\n#define FT_FRAME_OP_LONG   4  /* read 4-byte value     */\n#define FT_FRAME_OP_OFF3   5  /* read 3-byte value     */\n#define FT_FRAME_OP_BYTES  6  /* read a bytes sequence */\n\n\n  typedef enum  FT_Frame_Op_\n  {\n    ft_frame_end       = 0,\n    ft_frame_start     = FT_MAKE_FRAME_OP( FT_FRAME_OP_START, 0, 0 ),\n\n    ft_frame_byte      = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE,  0, 0 ),\n    ft_frame_schar     = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE,  0, 1 ),\n\n    ft_frame_ushort_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 0 ),\n    ft_frame_short_be  = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 1 ),\n    ft_frame_ushort_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 0 ),\n    ft_frame_short_le  = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 1 ),\n\n    ft_frame_ulong_be  = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 0 ),\n    ft_frame_long_be   = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 1 ),\n    ft_frame_ulong_le  = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 0 ),\n    ft_frame_long_le   = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 1 ),\n\n    ft_frame_uoff3_be  = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 0 ),\n    ft_frame_off3_be   = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 1 ),\n    ft_frame_uoff3_le  = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 0 ),\n    ft_frame_off3_le   = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 1 ),\n\n    ft_frame_bytes     = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 0 ),\n    ft_frame_skip      = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 1 )\n\n  } FT_Frame_Op;\n\n\n  typedef struct  FT_Frame_Field_\n  {\n    FT_Byte    value;\n    FT_Byte    size;\n    FT_UShort  offset;\n\n  } FT_Frame_Field;\n\n\n  /* Construct an FT_Frame_Field out of a structure type and a field name. */\n  /* The structure type must be set in the FT_STRUCTURE macro before       */\n  /* calling the FT_FRAME_START() macro.                                   */\n  /*                                                                       */\n#define FT_FIELD_SIZE( f ) \\\n          (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f )\n\n#define FT_FIELD_SIZE_DELTA( f ) \\\n          (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f[0] )\n\n#define FT_FIELD_OFFSET( f ) \\\n          (FT_UShort)( offsetof( FT_STRUCTURE, f ) )\n\n#define FT_FRAME_FIELD( frame_op, field ) \\\n          {                               \\\n            frame_op,                     \\\n            FT_FIELD_SIZE( field ),       \\\n            FT_FIELD_OFFSET( field )      \\\n          }\n\n#define FT_MAKE_EMPTY_FIELD( frame_op )  { frame_op, 0, 0 }\n\n#define FT_FRAME_START( size )   { ft_frame_start, 0, size }\n#define FT_FRAME_END             { ft_frame_end, 0, 0 }\n\n#define FT_FRAME_LONG( f )       FT_FRAME_FIELD( ft_frame_long_be, f )\n#define FT_FRAME_ULONG( f )      FT_FRAME_FIELD( ft_frame_ulong_be, f )\n#define FT_FRAME_SHORT( f )      FT_FRAME_FIELD( ft_frame_short_be, f )\n#define FT_FRAME_USHORT( f )     FT_FRAME_FIELD( ft_frame_ushort_be, f )\n#define FT_FRAME_OFF3( f )       FT_FRAME_FIELD( ft_frame_off3_be, f )\n#define FT_FRAME_UOFF3( f )      FT_FRAME_FIELD( ft_frame_uoff3_be, f )\n#define FT_FRAME_BYTE( f )       FT_FRAME_FIELD( ft_frame_byte, f )\n#define FT_FRAME_CHAR( f )       FT_FRAME_FIELD( ft_frame_schar, f )\n\n#define FT_FRAME_LONG_LE( f )    FT_FRAME_FIELD( ft_frame_long_le, f )\n#define FT_FRAME_ULONG_LE( f )   FT_FRAME_FIELD( ft_frame_ulong_le, f )\n#define FT_FRAME_SHORT_LE( f )   FT_FRAME_FIELD( ft_frame_short_le, f )\n#define FT_FRAME_USHORT_LE( f )  FT_FRAME_FIELD( ft_frame_ushort_le, f )\n#define FT_FRAME_OFF3_LE( f )    FT_FRAME_FIELD( ft_frame_off3_le, f )\n#define FT_FRAME_UOFF3_LE( f )   FT_FRAME_FIELD( ft_frame_uoff3_le, f )\n\n#define FT_FRAME_SKIP_LONG       { ft_frame_long_be, 0, 0 }\n#define FT_FRAME_SKIP_SHORT      { ft_frame_short_be, 0, 0 }\n#define FT_FRAME_SKIP_BYTE       { ft_frame_byte, 0, 0 }\n\n#define FT_FRAME_BYTES( field, count ) \\\n          {                            \\\n            ft_frame_bytes,            \\\n            count,                     \\\n            FT_FIELD_OFFSET( field )   \\\n          }\n\n#define FT_FRAME_SKIP_BYTES( count )  { ft_frame_skip, count, 0 }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Integer extraction macros -- the `buffer' parameter must ALWAYS be of */\n  /* type `char*' or equivalent (1-byte elements).                         */\n  /*                                                                       */\n\n#define FT_BYTE_( p, i )  ( ((const FT_Byte*)(p))[(i)] )\n\n#define FT_INT16( x )   ( (FT_Int16)(x)  )\n#define FT_UINT16( x )  ( (FT_UInt16)(x) )\n#define FT_INT32( x )   ( (FT_Int32)(x)  )\n#define FT_UINT32( x )  ( (FT_UInt32)(x) )\n\n\n#define FT_BYTE_U16( p, i, s )  ( FT_UINT16( FT_BYTE_( p, i ) ) << (s) )\n#define FT_BYTE_U32( p, i, s )  ( FT_UINT32( FT_BYTE_( p, i ) ) << (s) )\n\n\n#define FT_PEEK_SHORT( p )  FT_INT16( FT_BYTE_U16( p, 0, 8) | \\\n                                      FT_BYTE_U16( p, 1, 0) )\n\n#define FT_PEEK_USHORT( p )  FT_UINT16( FT_BYTE_U16( p, 0, 8 ) | \\\n                                        FT_BYTE_U16( p, 1, 0 ) )\n\n#define FT_PEEK_LONG( p )  FT_INT32( FT_BYTE_U32( p, 0, 24 ) | \\\n                                     FT_BYTE_U32( p, 1, 16 ) | \\\n                                     FT_BYTE_U32( p, 2,  8 ) | \\\n                                     FT_BYTE_U32( p, 3,  0 ) )\n\n#define FT_PEEK_ULONG( p )  FT_UINT32( FT_BYTE_U32( p, 0, 24 ) | \\\n                                       FT_BYTE_U32( p, 1, 16 ) | \\\n                                       FT_BYTE_U32( p, 2,  8 ) | \\\n                                       FT_BYTE_U32( p, 3,  0 ) )\n\n#define FT_PEEK_OFF3( p )  FT_INT32( FT_BYTE_U32( p, 0, 16 ) | \\\n                                     FT_BYTE_U32( p, 1,  8 ) | \\\n                                     FT_BYTE_U32( p, 2,  0 ) )\n\n#define FT_PEEK_UOFF3( p )  FT_UINT32( FT_BYTE_U32( p, 0, 16 ) | \\\n                                       FT_BYTE_U32( p, 1,  8 ) | \\\n                                       FT_BYTE_U32( p, 2,  0 ) )\n\n#define FT_PEEK_SHORT_LE( p )  FT_INT16( FT_BYTE_U16( p, 1, 8 ) | \\\n                                         FT_BYTE_U16( p, 0, 0 ) )\n\n#define FT_PEEK_USHORT_LE( p )  FT_UINT16( FT_BYTE_U16( p, 1, 8 ) |  \\\n                                           FT_BYTE_U16( p, 0, 0 ) )\n\n#define FT_PEEK_LONG_LE( p )  FT_INT32( FT_BYTE_U32( p, 3, 24 ) | \\\n                                        FT_BYTE_U32( p, 2, 16 ) | \\\n                                        FT_BYTE_U32( p, 1,  8 ) | \\\n                                        FT_BYTE_U32( p, 0,  0 ) )\n\n#define FT_PEEK_ULONG_LE( p )  FT_UINT32( FT_BYTE_U32( p, 3, 24 ) | \\\n                                          FT_BYTE_U32( p, 2, 16 ) | \\\n                                          FT_BYTE_U32( p, 1,  8 ) | \\\n                                          FT_BYTE_U32( p, 0,  0 ) )\n\n#define FT_PEEK_OFF3_LE( p )  FT_INT32( FT_BYTE_U32( p, 2, 16 ) | \\\n                                        FT_BYTE_U32( p, 1,  8 ) | \\\n                                        FT_BYTE_U32( p, 0,  0 ) )\n\n#define FT_PEEK_UOFF3_LE( p )  FT_UINT32( FT_BYTE_U32( p, 2, 16 ) | \\\n                                          FT_BYTE_U32( p, 1,  8 ) | \\\n                                          FT_BYTE_U32( p, 0,  0 ) )\n\n\n#define FT_NEXT_CHAR( buffer )       \\\n          ( (signed char)*buffer++ )\n\n#define FT_NEXT_BYTE( buffer )         \\\n          ( (unsigned char)*buffer++ )\n\n#define FT_NEXT_SHORT( buffer )                                   \\\n          ( (short)( buffer += 2, FT_PEEK_SHORT( buffer - 2 ) ) )\n\n#define FT_NEXT_USHORT( buffer )                                            \\\n          ( (unsigned short)( buffer += 2, FT_PEEK_USHORT( buffer - 2 ) ) )\n\n#define FT_NEXT_OFF3( buffer )                                  \\\n          ( (long)( buffer += 3, FT_PEEK_OFF3( buffer - 3 ) ) )\n\n#define FT_NEXT_UOFF3( buffer )                                           \\\n          ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3( buffer - 3 ) ) )\n\n#define FT_NEXT_LONG( buffer )                                  \\\n          ( (long)( buffer += 4, FT_PEEK_LONG( buffer - 4 ) ) )\n\n#define FT_NEXT_ULONG( buffer )                                           \\\n          ( (unsigned long)( buffer += 4, FT_PEEK_ULONG( buffer - 4 ) ) )\n\n\n#define FT_NEXT_SHORT_LE( buffer )                                   \\\n          ( (short)( buffer += 2, FT_PEEK_SHORT_LE( buffer - 2 ) ) )\n\n#define FT_NEXT_USHORT_LE( buffer )                                            \\\n          ( (unsigned short)( buffer += 2, FT_PEEK_USHORT_LE( buffer - 2 ) ) )\n\n#define FT_NEXT_OFF3_LE( buffer )                                  \\\n          ( (long)( buffer += 3, FT_PEEK_OFF3_LE( buffer - 3 ) ) )\n\n#define FT_NEXT_UOFF3_LE( buffer )                                           \\\n          ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3_LE( buffer - 3 ) ) )\n\n#define FT_NEXT_LONG_LE( buffer )                                  \\\n          ( (long)( buffer += 4, FT_PEEK_LONG_LE( buffer - 4 ) ) )\n\n#define FT_NEXT_ULONG_LE( buffer )                                           \\\n          ( (unsigned long)( buffer += 4, FT_PEEK_ULONG_LE( buffer - 4 ) ) )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Each GET_xxxx() macro uses an implicit `stream' variable.             */\n  /*                                                                       */\n#if 0\n#define FT_GET_MACRO( type )    FT_NEXT_ ## type ( stream->cursor )\n\n#define FT_GET_CHAR()       FT_GET_MACRO( CHAR )\n#define FT_GET_BYTE()       FT_GET_MACRO( BYTE )\n#define FT_GET_SHORT()      FT_GET_MACRO( SHORT )\n#define FT_GET_USHORT()     FT_GET_MACRO( USHORT )\n#define FT_GET_OFF3()       FT_GET_MACRO( OFF3 )\n#define FT_GET_UOFF3()      FT_GET_MACRO( UOFF3 )\n#define FT_GET_LONG()       FT_GET_MACRO( LONG )\n#define FT_GET_ULONG()      FT_GET_MACRO( ULONG )\n#define FT_GET_TAG4()       FT_GET_MACRO( ULONG )\n\n#define FT_GET_SHORT_LE()   FT_GET_MACRO( SHORT_LE )\n#define FT_GET_USHORT_LE()  FT_GET_MACRO( USHORT_LE )\n#define FT_GET_LONG_LE()    FT_GET_MACRO( LONG_LE )\n#define FT_GET_ULONG_LE()   FT_GET_MACRO( ULONG_LE )\n\n#else\n#define FT_GET_MACRO( func, type )        ( (type)func( stream ) )\n\n#define FT_GET_CHAR()       FT_GET_MACRO( FT_Stream_GetChar, FT_Char )\n#define FT_GET_BYTE()       FT_GET_MACRO( FT_Stream_GetChar, FT_Byte )\n#define FT_GET_SHORT()      FT_GET_MACRO( FT_Stream_GetUShort, FT_Short )\n#define FT_GET_USHORT()     FT_GET_MACRO( FT_Stream_GetUShort, FT_UShort )\n#define FT_GET_OFF3()       FT_GET_MACRO( FT_Stream_GetUOffset, FT_Long )\n#define FT_GET_UOFF3()      FT_GET_MACRO( FT_Stream_GetUOffset, FT_ULong )\n#define FT_GET_LONG()       FT_GET_MACRO( FT_Stream_GetULong, FT_Long )\n#define FT_GET_ULONG()      FT_GET_MACRO( FT_Stream_GetULong, FT_ULong )\n#define FT_GET_TAG4()       FT_GET_MACRO( FT_Stream_GetULong, FT_ULong )\n\n#define FT_GET_SHORT_LE()   FT_GET_MACRO( FT_Stream_GetUShortLE, FT_Short )\n#define FT_GET_USHORT_LE()  FT_GET_MACRO( FT_Stream_GetUShortLE, FT_UShort )\n#define FT_GET_LONG_LE()    FT_GET_MACRO( FT_Stream_GetULongLE, FT_Long )\n#define FT_GET_ULONG_LE()   FT_GET_MACRO( FT_Stream_GetULongLE, FT_ULong )\n#endif\n\n#define FT_READ_MACRO( func, type, var )        \\\n          ( var = (type)func( stream, &error ), \\\n            error != FT_Err_Ok )\n\n#define FT_READ_BYTE( var )       FT_READ_MACRO( FT_Stream_ReadChar, FT_Byte, var )\n#define FT_READ_CHAR( var )       FT_READ_MACRO( FT_Stream_ReadChar, FT_Char, var )\n#define FT_READ_SHORT( var )      FT_READ_MACRO( FT_Stream_ReadUShort, FT_Short, var )\n#define FT_READ_USHORT( var )     FT_READ_MACRO( FT_Stream_ReadUShort, FT_UShort, var )\n#define FT_READ_OFF3( var )       FT_READ_MACRO( FT_Stream_ReadUOffset, FT_Long, var )\n#define FT_READ_UOFF3( var )      FT_READ_MACRO( FT_Stream_ReadUOffset, FT_ULong, var )\n#define FT_READ_LONG( var )       FT_READ_MACRO( FT_Stream_ReadULong, FT_Long, var )\n#define FT_READ_ULONG( var )      FT_READ_MACRO( FT_Stream_ReadULong, FT_ULong, var )\n\n#define FT_READ_SHORT_LE( var )   FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_Short, var )\n#define FT_READ_USHORT_LE( var )  FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_UShort, var )\n#define FT_READ_LONG_LE( var )    FT_READ_MACRO( FT_Stream_ReadULongLE, FT_Long, var )\n#define FT_READ_ULONG_LE( var )   FT_READ_MACRO( FT_Stream_ReadULongLE, FT_ULong, var )\n\n\n#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM\n\n  /* initialize a stream for reading a regular system stream */\n  FT_BASE( FT_Error )\n  FT_Stream_Open( FT_Stream    stream,\n                  const char*  filepathname );\n\n#endif /* FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */\n\n\n  /* create a new (input) stream from an FT_Open_Args structure */\n  FT_BASE( FT_Error )\n  FT_Stream_New( FT_Library           library,\n                 const FT_Open_Args*  args,\n                 FT_Stream           *astream );\n\n  /* free a stream */\n  FT_BASE( void )\n  FT_Stream_Free( FT_Stream  stream,\n                  FT_Int     external );\n\n  /* initialize a stream for reading in-memory data */\n  FT_BASE( void )\n  FT_Stream_OpenMemory( FT_Stream       stream,\n                        const FT_Byte*  base,\n                        FT_ULong        size );\n\n  /* close a stream (does not destroy the stream structure) */\n  FT_BASE( void )\n  FT_Stream_Close( FT_Stream  stream );\n\n\n  /* seek within a stream. position is relative to start of stream */\n  FT_BASE( FT_Error )\n  FT_Stream_Seek( FT_Stream  stream,\n                  FT_ULong   pos );\n\n  /* skip bytes in a stream */\n  FT_BASE( FT_Error )\n  FT_Stream_Skip( FT_Stream  stream,\n                  FT_Long    distance );\n\n  /* return current stream position */\n  FT_BASE( FT_Long )\n  FT_Stream_Pos( FT_Stream  stream );\n\n  /* read bytes from a stream into a user-allocated buffer, returns an */\n  /* error if not all bytes could be read.                             */\n  FT_BASE( FT_Error )\n  FT_Stream_Read( FT_Stream  stream,\n                  FT_Byte*   buffer,\n                  FT_ULong   count );\n\n  /* read bytes from a stream at a given position */\n  FT_BASE( FT_Error )\n  FT_Stream_ReadAt( FT_Stream  stream,\n                    FT_ULong   pos,\n                    FT_Byte*   buffer,\n                    FT_ULong   count );\n\n  /* try to read bytes at the end of a stream; return number of bytes */\n  /* really available                                                 */\n  FT_BASE( FT_ULong )\n  FT_Stream_TryRead( FT_Stream  stream,\n                     FT_Byte*   buffer,\n                     FT_ULong   count );\n\n  /* Enter a frame of `count' consecutive bytes in a stream.  Returns an */\n  /* error if the frame could not be read/accessed.  The caller can use  */\n  /* the FT_Stream_Get_XXX functions to retrieve frame data without      */\n  /* error checks.                                                       */\n  /*                                                                     */\n  /* You must _always_ call FT_Stream_ExitFrame() once you have entered  */\n  /* a stream frame!                                                     */\n  /*                                                                     */\n  FT_BASE( FT_Error )\n  FT_Stream_EnterFrame( FT_Stream  stream,\n                        FT_ULong   count );\n\n  /* exit a stream frame */\n  FT_BASE( void )\n  FT_Stream_ExitFrame( FT_Stream  stream );\n\n  /* Extract a stream frame.  If the stream is disk-based, a heap block */\n  /* is allocated and the frame bytes are read into it.  If the stream  */\n  /* is memory-based, this function simply set a pointer to the data.   */\n  /*                                                                    */\n  /* Useful to optimize access to memory-based streams transparently.   */\n  /*                                                                    */\n  /* All extracted frames must be `freed' with a call to the function   */\n  /* FT_Stream_ReleaseFrame().                                          */\n  /*                                                                    */\n  FT_BASE( FT_Error )\n  FT_Stream_ExtractFrame( FT_Stream  stream,\n                          FT_ULong   count,\n                          FT_Byte**  pbytes );\n\n  /* release an extract frame (see FT_Stream_ExtractFrame) */\n  FT_BASE( void )\n  FT_Stream_ReleaseFrame( FT_Stream  stream,\n                          FT_Byte**  pbytes );\n\n  /* read a byte from an entered frame */\n  FT_BASE( FT_Char )\n  FT_Stream_GetChar( FT_Stream  stream );\n\n  /* read a 16-bit big-endian unsigned integer from an entered frame */\n  FT_BASE( FT_UShort )\n  FT_Stream_GetUShort( FT_Stream  stream );\n\n  /* read a 24-bit big-endian unsigned integer from an entered frame */\n  FT_BASE( FT_ULong )\n  FT_Stream_GetUOffset( FT_Stream  stream );\n\n  /* read a 32-bit big-endian unsigned integer from an entered frame */\n  FT_BASE( FT_ULong )\n  FT_Stream_GetULong( FT_Stream  stream );\n\n  /* read a 16-bit little-endian unsigned integer from an entered frame */\n  FT_BASE( FT_UShort )\n  FT_Stream_GetUShortLE( FT_Stream  stream );\n\n  /* read a 32-bit little-endian unsigned integer from an entered frame */\n  FT_BASE( FT_ULong )\n  FT_Stream_GetULongLE( FT_Stream  stream );\n\n\n  /* read a byte from a stream */\n  FT_BASE( FT_Char )\n  FT_Stream_ReadChar( FT_Stream  stream,\n                      FT_Error*  error );\n\n  /* read a 16-bit big-endian unsigned integer from a stream */\n  FT_BASE( FT_UShort )\n  FT_Stream_ReadUShort( FT_Stream  stream,\n                        FT_Error*  error );\n\n  /* read a 24-bit big-endian unsigned integer from a stream */\n  FT_BASE( FT_ULong )\n  FT_Stream_ReadUOffset( FT_Stream  stream,\n                         FT_Error*  error );\n\n  /* read a 32-bit big-endian integer from a stream */\n  FT_BASE( FT_ULong )\n  FT_Stream_ReadULong( FT_Stream  stream,\n                       FT_Error*  error );\n\n  /* read a 16-bit little-endian unsigned integer from a stream */\n  FT_BASE( FT_UShort )\n  FT_Stream_ReadUShortLE( FT_Stream  stream,\n                          FT_Error*  error );\n\n  /* read a 32-bit little-endian unsigned integer from a stream */\n  FT_BASE( FT_ULong )\n  FT_Stream_ReadULongLE( FT_Stream  stream,\n                         FT_Error*  error );\n\n  /* Read a structure from a stream.  The structure must be described */\n  /* by an array of FT_Frame_Field records.                           */\n  FT_BASE( FT_Error )\n  FT_Stream_ReadFields( FT_Stream              stream,\n                        const FT_Frame_Field*  fields,\n                        void*                  structure );\n\n\n#define FT_STREAM_POS()           \\\n          FT_Stream_Pos( stream )\n\n#define FT_STREAM_SEEK( position )                               \\\n          FT_SET_ERROR( FT_Stream_Seek( stream,                  \\\n                                        (FT_ULong)(position) ) )\n\n#define FT_STREAM_SKIP( distance )                              \\\n          FT_SET_ERROR( FT_Stream_Skip( stream,                 \\\n                                        (FT_Long)(distance) ) )\n\n#define FT_STREAM_READ( buffer, count )                       \\\n          FT_SET_ERROR( FT_Stream_Read( stream,               \\\n                                        (FT_Byte*)(buffer),   \\\n                                        (FT_ULong)(count) ) )\n\n#define FT_STREAM_READ_AT( position, buffer, count )            \\\n          FT_SET_ERROR( FT_Stream_ReadAt( stream,               \\\n                                          (FT_ULong)(position), \\\n                                          (FT_Byte*)buffer,     \\\n                                          (FT_ULong)(count) ) )\n\n#define FT_STREAM_READ_FIELDS( fields, object )                          \\\n          FT_SET_ERROR( FT_Stream_ReadFields( stream, fields, object ) )\n\n\n#define FT_FRAME_ENTER( size )                                           \\\n          FT_SET_ERROR(                                                  \\\n            FT_DEBUG_INNER( FT_Stream_EnterFrame( stream,                \\\n                                                  (FT_ULong)(size) ) ) )\n\n#define FT_FRAME_EXIT()                                   \\\n          FT_DEBUG_INNER( FT_Stream_ExitFrame( stream ) )\n\n#define FT_FRAME_EXTRACT( size, bytes )                                       \\\n          FT_SET_ERROR(                                                       \\\n            FT_DEBUG_INNER( FT_Stream_ExtractFrame( stream,                   \\\n                                                    (FT_ULong)(size),         \\\n                                                    (FT_Byte**)&(bytes) ) ) )\n\n#define FT_FRAME_RELEASE( bytes )                                         \\\n          FT_DEBUG_INNER( FT_Stream_ReleaseFrame( stream,                 \\\n                                                  (FT_Byte**)&(bytes) ) )\n\n\nFT_END_HEADER\n\n#endif /* __FTSTREAM_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/fttrace.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  fttrace.h                                                              */\n/*                                                                         */\n/*    Tracing handling (specification only).                               */\n/*                                                                         */\n/*  Copyright 2002, 2004-2007, 2009, 2011-2013 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /* definitions of trace levels for FreeType 2 */\n\n  /* the first level must always be `trace_any' */\nFT_TRACE_DEF( any )\n\n  /* base components */\nFT_TRACE_DEF( calc )      /* calculations            (ftcalc.c)   */\nFT_TRACE_DEF( memory )    /* memory manager          (ftobjs.c)   */\nFT_TRACE_DEF( stream )    /* stream manager          (ftstream.c) */\nFT_TRACE_DEF( io )        /* i/o interface           (ftsystem.c) */\nFT_TRACE_DEF( list )      /* list management         (ftlist.c)   */\nFT_TRACE_DEF( init )      /* initialization          (ftinit.c)   */\nFT_TRACE_DEF( objs )      /* base objects            (ftobjs.c)   */\nFT_TRACE_DEF( outline )   /* outline management      (ftoutln.c)  */\nFT_TRACE_DEF( glyph )     /* glyph management        (ftglyph.c)  */\nFT_TRACE_DEF( gloader )   /* glyph loader            (ftgloadr.c) */\n\nFT_TRACE_DEF( raster )    /* monochrome rasterizer   (ftraster.c) */\nFT_TRACE_DEF( smooth )    /* anti-aliasing raster    (ftgrays.c)  */\nFT_TRACE_DEF( mm )        /* MM interface            (ftmm.c)     */\nFT_TRACE_DEF( raccess )   /* resource fork accessor  (ftrfork.c)  */\nFT_TRACE_DEF( synth )     /* bold/slant synthesizer  (ftsynth.c)  */\nFT_TRACE_DEF( bitmap )    /* bitmap checksum         (ftobjs.c)   */\n\n  /* Cache sub-system */\nFT_TRACE_DEF( cache )     /* cache sub-system        (ftcache.c, etc.) */\n\n  /* SFNT driver components */\nFT_TRACE_DEF( sfdriver )  /* SFNT font driver        (sfdriver.c) */\nFT_TRACE_DEF( sfobjs )    /* SFNT object handler     (sfobjs.c)   */\nFT_TRACE_DEF( ttcmap )    /* charmap handler         (ttcmap.c)   */\nFT_TRACE_DEF( ttkern )    /* kerning handler         (ttkern.c)   */\nFT_TRACE_DEF( ttload )    /* basic TrueType tables   (ttload.c)   */\nFT_TRACE_DEF( ttmtx )     /* metrics-related tables  (ttmtx.c)    */\nFT_TRACE_DEF( ttpost )    /* PS table processing     (ttpost.c)   */\nFT_TRACE_DEF( ttsbit )    /* TrueType sbit handling  (ttsbit.c)   */\nFT_TRACE_DEF( ttbdf )     /* TrueType embedded BDF   (ttbdf.c)    */\n\n  /* TrueType driver components */\nFT_TRACE_DEF( ttdriver )  /* TT font driver          (ttdriver.c) */\nFT_TRACE_DEF( ttgload )   /* TT glyph loader         (ttgload.c)  */\nFT_TRACE_DEF( ttinterp )  /* bytecode interpreter    (ttinterp.c) */\nFT_TRACE_DEF( ttobjs )    /* TT objects manager      (ttobjs.c)   */\nFT_TRACE_DEF( ttpload )   /* TT data/program loader  (ttpload.c)  */\nFT_TRACE_DEF( ttgxvar )   /* TrueType GX var handler (ttgxvar.c)  */\n\n  /* Type 1 driver components */\nFT_TRACE_DEF( t1afm )\nFT_TRACE_DEF( t1driver )\nFT_TRACE_DEF( t1gload )\nFT_TRACE_DEF( t1hint )\nFT_TRACE_DEF( t1load )\nFT_TRACE_DEF( t1objs )\nFT_TRACE_DEF( t1parse )\n\n  /* PostScript helper module `psaux' */\nFT_TRACE_DEF( t1decode )\nFT_TRACE_DEF( psobjs )\nFT_TRACE_DEF( psconv )\n\n  /* PostScript hinting module `pshinter' */\nFT_TRACE_DEF( pshrec )\nFT_TRACE_DEF( pshalgo1 )\nFT_TRACE_DEF( pshalgo2 )\n\n  /* Type 2 driver components */\nFT_TRACE_DEF( cffdriver )\nFT_TRACE_DEF( cffgload )\nFT_TRACE_DEF( cffload )\nFT_TRACE_DEF( cffobjs )\nFT_TRACE_DEF( cffparse )\n\nFT_TRACE_DEF( cf2blues )\nFT_TRACE_DEF( cf2hints )\nFT_TRACE_DEF( cf2interp )\n\n  /* Type 42 driver component */\nFT_TRACE_DEF( t42 )\n\n  /* CID driver components */\nFT_TRACE_DEF( cidafm )\nFT_TRACE_DEF( ciddriver )\nFT_TRACE_DEF( cidgload )\nFT_TRACE_DEF( cidload )\nFT_TRACE_DEF( cidobjs )\nFT_TRACE_DEF( cidparse )\n\n  /* Windows font component */\nFT_TRACE_DEF( winfnt )\n\n  /* PCF font components */\nFT_TRACE_DEF( pcfdriver )\nFT_TRACE_DEF( pcfread )\n\n  /* BDF font components */\nFT_TRACE_DEF( bdfdriver )\nFT_TRACE_DEF( bdflib )\n\n  /* PFR font component */\nFT_TRACE_DEF( pfr )\n\n  /* OpenType validation components */\nFT_TRACE_DEF( otvmodule )\nFT_TRACE_DEF( otvcommon )\nFT_TRACE_DEF( otvbase )\nFT_TRACE_DEF( otvgdef )\nFT_TRACE_DEF( otvgpos )\nFT_TRACE_DEF( otvgsub )\nFT_TRACE_DEF( otvjstf )\nFT_TRACE_DEF( otvmath )\n\n  /* TrueTypeGX/AAT validation components */\nFT_TRACE_DEF( gxvmodule )\nFT_TRACE_DEF( gxvcommon )\nFT_TRACE_DEF( gxvfeat )\nFT_TRACE_DEF( gxvmort )\nFT_TRACE_DEF( gxvmorx )\nFT_TRACE_DEF( gxvbsln )\nFT_TRACE_DEF( gxvjust )\nFT_TRACE_DEF( gxvkern )\nFT_TRACE_DEF( gxvopbd )\nFT_TRACE_DEF( gxvtrak )\nFT_TRACE_DEF( gxvprop )\nFT_TRACE_DEF( gxvlcar )\n\n  /* autofit components */\nFT_TRACE_DEF( afmodule )\nFT_TRACE_DEF( afhints )\nFT_TRACE_DEF( afcjk )\nFT_TRACE_DEF( aflatin )\nFT_TRACE_DEF( aflatin2 )\nFT_TRACE_DEF( afwarp )\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftvalid.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftvalid.h                                                              */\n/*                                                                         */\n/*    FreeType validation support (specification).                         */\n/*                                                                         */\n/*  Copyright 2004, 2013 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTVALID_H__\n#define __FTVALID_H__\n\n#include \"../../ft2build.h\"\n#include \"../config/ftstdlib.h\"   /* for ft_setjmp and ft_longjmp */\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                    V A L I D A T I O N                          ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* handle to a validation object */\n  typedef struct FT_ValidatorRec_ volatile*  FT_Validator;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* There are three distinct validation levels defined here:              */\n  /*                                                                       */\n  /* FT_VALIDATE_DEFAULT ::                                                */\n  /*   A table that passes this validation level can be used reliably by   */\n  /*   FreeType.  It generally means that all offsets have been checked to */\n  /*   prevent out-of-bound reads, that array counts are correct, etc.     */\n  /*                                                                       */\n  /* FT_VALIDATE_TIGHT ::                                                  */\n  /*   A table that passes this validation level can be used reliably and  */\n  /*   doesn't contain invalid data.  For example, a charmap table that    */\n  /*   returns invalid glyph indices will not pass, even though it can     */\n  /*   be used with FreeType in default mode (the library will simply      */\n  /*   return an error later when trying to load the glyph).               */\n  /*                                                                       */\n  /*   It also checks that fields which must be a multiple of 2, 4, or 8,  */\n  /*   don't have incorrect values, etc.                                   */\n  /*                                                                       */\n  /* FT_VALIDATE_PARANOID ::                                               */\n  /*   Only for font debugging.  Checks that a table follows the           */\n  /*   specification by 100%.  Very few fonts will be able to pass this    */\n  /*   level anyway but it can be useful for certain tools like font       */\n  /*   editors/converters.                                                 */\n  /*                                                                       */\n  typedef enum  FT_ValidationLevel_\n  {\n    FT_VALIDATE_DEFAULT = 0,\n    FT_VALIDATE_TIGHT,\n    FT_VALIDATE_PARANOID\n\n  } FT_ValidationLevel;\n\n\n#if defined( _MSC_VER )      /* Visual C++ (and Intel C++) */\n  /* We disable the warning `structure was padded due to   */\n  /* __declspec(align())' in order to compile cleanly with */\n  /* the maximum level of warnings.                        */\n#pragma warning( push )\n#pragma warning( disable : 4324 )\n#endif /* _MSC_VER */\n\n  /* validator structure */\n  typedef struct  FT_ValidatorRec_\n  {\n    const FT_Byte*      base;        /* address of table in memory       */\n    const FT_Byte*      limit;       /* `base' + sizeof(table) in memory */\n    FT_ValidationLevel  level;       /* validation level                 */\n    FT_Error            error;       /* error returned. 0 means success  */\n\n    ft_jmp_buf          jump_buffer; /* used for exception handling      */\n\n  } FT_ValidatorRec;\n\n#if defined( _MSC_VER )\n#pragma warning( pop )\n#endif\n\n#define FT_VALIDATOR( x )  ( (FT_Validator)( x ) )\n\n\n  FT_BASE( void )\n  ft_validator_init( FT_Validator        valid,\n                     const FT_Byte*      base,\n                     const FT_Byte*      limit,\n                     FT_ValidationLevel  level );\n\n  /* Do not use this. It's broken and will cause your validator to crash */\n  /* if you run it on an invalid font.                                   */\n  FT_BASE( FT_Int )\n  ft_validator_run( FT_Validator  valid );\n\n  /* Sets the error field in a validator, then calls `longjmp' to return */\n  /* to high-level caller.  Using `setjmp/longjmp' avoids many stupid    */\n  /* error checks within the validation routines.                        */\n  /*                                                                     */\n  FT_BASE( void )\n  ft_validator_error( FT_Validator  valid,\n                      FT_Error      error );\n\n\n  /* Calls ft_validate_error.  Assumes that the `valid' local variable */\n  /* holds a pointer to the current validator object.                  */\n  /*                                                                   */\n  /* Use preprocessor prescan to pass FT_ERR_PREFIX.                   */\n  /*                                                                   */\n#define FT_INVALID( _prefix, _error )  FT_INVALID_( _prefix, _error )\n#define FT_INVALID_( _prefix, _error ) \\\n          ft_validator_error( valid, _prefix ## _error )\n\n  /* called when a broken table is detected */\n#define FT_INVALID_TOO_SHORT \\\n          FT_INVALID( FT_ERR_PREFIX, Invalid_Table )\n\n  /* called when an invalid offset is detected */\n#define FT_INVALID_OFFSET \\\n          FT_INVALID( FT_ERR_PREFIX, Invalid_Offset )\n\n  /* called when an invalid format/value is detected */\n#define FT_INVALID_FORMAT \\\n          FT_INVALID( FT_ERR_PREFIX, Invalid_Table )\n\n  /* called when an invalid glyph index is detected */\n#define FT_INVALID_GLYPH_ID \\\n          FT_INVALID( FT_ERR_PREFIX, Invalid_Glyph_Index )\n\n  /* called when an invalid field value is detected */\n#define FT_INVALID_DATA \\\n          FT_INVALID( FT_ERR_PREFIX, Invalid_Table )\n\n\nFT_END_HEADER\n\n#endif /* __FTVALID_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/internal.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  internal.h                                                             */\n/*                                                                         */\n/*    Internal header files (specification only).                          */\n/*                                                                         */\n/*  Copyright 1996-2004, 2013 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is automatically included by `ft2build.h'.                  */\n  /* Do not include it manually!                                           */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#define FT_INTERNAL_OBJECTS_H             <freetype/internal/ftobjs.h>\n#define FT_INTERNAL_PIC_H                 <freetype/internal/ftpic.h>\n#define FT_INTERNAL_STREAM_H              <freetype/internal/ftstream.h>\n#define FT_INTERNAL_MEMORY_H              <freetype/internal/ftmemory.h>\n#define FT_INTERNAL_DEBUG_H               <freetype/internal/ftdebug.h>\n#define FT_INTERNAL_CALC_H                <freetype/internal/ftcalc.h>\n#define FT_INTERNAL_DRIVER_H              <freetype/internal/ftdriver.h>\n#define FT_INTERNAL_TRACE_H               <freetype/internal/fttrace.h>\n#define FT_INTERNAL_GLYPH_LOADER_H        <freetype/internal/ftgloadr.h>\n#define FT_INTERNAL_SFNT_H                <freetype/internal/sfnt.h>\n#define FT_INTERNAL_SERVICE_H             <freetype/internal/ftserv.h>\n#define FT_INTERNAL_RFORK_H               <freetype/internal/ftrfork.h>\n#define FT_INTERNAL_VALIDATE_H            <freetype/internal/ftvalid.h>\n\n#define FT_INTERNAL_TRUETYPE_TYPES_H      <freetype/internal/tttypes.h>\n#define FT_INTERNAL_TYPE1_TYPES_H         <freetype/internal/t1types.h>\n\n#define FT_INTERNAL_POSTSCRIPT_AUX_H      <freetype/internal/psaux.h>\n#define FT_INTERNAL_POSTSCRIPT_HINTS_H    <freetype/internal/pshints.h>\n#define FT_INTERNAL_POSTSCRIPT_GLOBALS_H  <freetype/internal/psglobal.h>\n\n#define FT_INTERNAL_AUTOHINT_H            <freetype/internal/autohint.h>\n\n\n#if defined( _MSC_VER )      /* Visual C++ (and Intel C++) */\n\n  /* We disable the warning `conditional expression is constant' here */\n  /* in order to compile cleanly with the maximum level of warnings.  */\n  /* In particular, the warning complains about stuff like `while(0)' */\n  /* which is very useful in macro definitions.  There is no benefit  */\n  /* in having it enabled.                                            */\n#pragma warning( disable : 4127 )\n\n#endif /* _MSC_VER */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/psaux.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  psaux.h                                                                */\n/*                                                                         */\n/*    Auxiliary functions and data structures related to PostScript fonts  */\n/*    (specification).                                                     */\n/*                                                                         */\n/*  Copyright 1996-2004, 2006, 2008, 2009, 2012 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PSAUX_H__\n#define __PSAUX_H__\n\n\n#include \"../../ft2build.h\"\n#include \"ftobjs.h\"\n#include \"t1types.h\"\n#include \"services/svpscmap.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                             T1_TABLE                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  typedef struct PS_TableRec_*              PS_Table;\n  typedef const struct PS_Table_FuncsRec_*  PS_Table_Funcs;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    PS_Table_FuncsRec                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A set of function pointers to manage PS_Table objects.             */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    table_init    :: Used to initialize a table.                       */\n  /*                                                                       */\n  /*    table_done    :: Finalizes resp. destroy a given table.            */\n  /*                                                                       */\n  /*    table_add     :: Adds a new object to a table.                     */\n  /*                                                                       */\n  /*    table_release :: Releases table data, then finalizes it.           */\n  /*                                                                       */\n  typedef struct  PS_Table_FuncsRec_\n  {\n    FT_Error\n    (*init)( PS_Table   table,\n             FT_Int     count,\n             FT_Memory  memory );\n\n    void\n    (*done)( PS_Table  table );\n\n    FT_Error\n    (*add)( PS_Table    table,\n            FT_Int      idx,\n            void*       object,\n            FT_PtrDist  length );\n\n    void\n    (*release)( PS_Table  table );\n\n  } PS_Table_FuncsRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    PS_TableRec                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A PS_Table is a simple object used to store an array of objects in */\n  /*    a single memory block.                                             */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    block     :: The address in memory of the growheap's block.  This  */\n  /*                 can change between two object adds, due to            */\n  /*                 reallocation.                                         */\n  /*                                                                       */\n  /*    cursor    :: The current top of the grow heap within its block.    */\n  /*                                                                       */\n  /*    capacity  :: The current size of the heap block.  Increments by    */\n  /*                 1kByte chunks.                                        */\n  /*                                                                       */\n  /*    init      :: Set to 0xDEADBEEF if `elements' and `lengths' have    */\n  /*                 been allocated.                                       */\n  /*                                                                       */\n  /*    max_elems :: The maximum number of elements in table.              */\n  /*                                                                       */\n  /*    num_elems :: The current number of elements in table.              */\n  /*                                                                       */\n  /*    elements  :: A table of element addresses within the block.        */\n  /*                                                                       */\n  /*    lengths   :: A table of element sizes within the block.            */\n  /*                                                                       */\n  /*    memory    :: The object used for memory operations                 */\n  /*                 (alloc/realloc).                                      */\n  /*                                                                       */\n  /*    funcs     :: A table of method pointers for this object.           */\n  /*                                                                       */\n  typedef struct  PS_TableRec_\n  {\n    FT_Byte*           block;          /* current memory block           */\n    FT_Offset          cursor;         /* current cursor in memory block */\n    FT_Offset          capacity;       /* current size of memory block   */\n    FT_Long            init;\n\n    FT_Int             max_elems;\n    FT_Int             num_elems;\n    FT_Byte**          elements;       /* addresses of table elements */\n    FT_PtrDist*        lengths;        /* lengths of table elements   */\n\n    FT_Memory          memory;\n    PS_Table_FuncsRec  funcs;\n\n  } PS_TableRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                       T1 FIELDS & TOKENS                      *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct PS_ParserRec_*  PS_Parser;\n\n  typedef struct T1_TokenRec_*   T1_Token;\n\n  typedef struct T1_FieldRec_*   T1_Field;\n\n\n  /* simple enumeration type used to identify token types */\n  typedef enum  T1_TokenType_\n  {\n    T1_TOKEN_TYPE_NONE = 0,\n    T1_TOKEN_TYPE_ANY,\n    T1_TOKEN_TYPE_STRING,\n    T1_TOKEN_TYPE_ARRAY,\n    T1_TOKEN_TYPE_KEY, /* aka `name' */\n\n    /* do not remove */\n    T1_TOKEN_TYPE_MAX\n\n  } T1_TokenType;\n\n\n  /* a simple structure used to identify tokens */\n  typedef struct  T1_TokenRec_\n  {\n    FT_Byte*      start;   /* first character of token in input stream */\n    FT_Byte*      limit;   /* first character after the token          */\n    T1_TokenType  type;    /* type of token                            */\n\n  } T1_TokenRec;\n\n\n  /* enumeration type used to identify object fields */\n  typedef enum  T1_FieldType_\n  {\n    T1_FIELD_TYPE_NONE = 0,\n    T1_FIELD_TYPE_BOOL,\n    T1_FIELD_TYPE_INTEGER,\n    T1_FIELD_TYPE_FIXED,\n    T1_FIELD_TYPE_FIXED_1000,\n    T1_FIELD_TYPE_STRING,\n    T1_FIELD_TYPE_KEY,\n    T1_FIELD_TYPE_BBOX,\n    T1_FIELD_TYPE_MM_BBOX,\n    T1_FIELD_TYPE_INTEGER_ARRAY,\n    T1_FIELD_TYPE_FIXED_ARRAY,\n    T1_FIELD_TYPE_CALLBACK,\n\n    /* do not remove */\n    T1_FIELD_TYPE_MAX\n\n  } T1_FieldType;\n\n\n  typedef enum  T1_FieldLocation_\n  {\n    T1_FIELD_LOCATION_CID_INFO,\n    T1_FIELD_LOCATION_FONT_DICT,\n    T1_FIELD_LOCATION_FONT_EXTRA,\n    T1_FIELD_LOCATION_FONT_INFO,\n    T1_FIELD_LOCATION_PRIVATE,\n    T1_FIELD_LOCATION_BBOX,\n    T1_FIELD_LOCATION_LOADER,\n    T1_FIELD_LOCATION_FACE,\n    T1_FIELD_LOCATION_BLEND,\n\n    /* do not remove */\n    T1_FIELD_LOCATION_MAX\n\n  } T1_FieldLocation;\n\n\n  typedef void\n  (*T1_Field_ParseFunc)( FT_Face     face,\n                         FT_Pointer  parser );\n\n\n  /* structure type used to model object fields */\n  typedef struct  T1_FieldRec_\n  {\n    const char*         ident;        /* field identifier               */\n    T1_FieldLocation    location;\n    T1_FieldType        type;         /* type of field                  */\n    T1_Field_ParseFunc  reader;\n    FT_UInt             offset;       /* offset of field in object      */\n    FT_Byte             size;         /* size of field in bytes         */\n    FT_UInt             array_max;    /* maximum number of elements for */\n                                      /* array                          */\n    FT_UInt             count_offset; /* offset of element count for    */\n                                      /* arrays; must not be zero if in */\n                                      /* use -- in other words, a       */\n                                      /* `num_FOO' element must not     */\n                                      /* start the used structure if we */\n                                      /* parse a `FOO' array            */\n    FT_UInt             dict;         /* where we expect it             */\n  } T1_FieldRec;\n\n#define T1_FIELD_DICT_FONTDICT ( 1 << 0 ) /* also FontInfo and FDArray */\n#define T1_FIELD_DICT_PRIVATE  ( 1 << 1 )\n\n\n\n#define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \\\n          {                                                 \\\n            _ident, T1CODE, _type,                          \\\n            0,                                              \\\n            FT_FIELD_OFFSET( _fname ),                      \\\n            FT_FIELD_SIZE( _fname ),                        \\\n            0, 0,                                           \\\n            _dict                                           \\\n          },\n\n#define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \\\n          {                                             \\\n            _ident, T1CODE, T1_FIELD_TYPE_CALLBACK,     \\\n            (T1_Field_ParseFunc)_reader,                \\\n            0, 0,                                       \\\n            0, 0,                                       \\\n            _dict                                       \\\n          },\n\n#define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \\\n          {                                                      \\\n            _ident, T1CODE, _type,                               \\\n            0,                                                   \\\n            FT_FIELD_OFFSET( _fname ),                           \\\n            FT_FIELD_SIZE_DELTA( _fname ),                       \\\n            _max,                                                \\\n            FT_FIELD_OFFSET( num_ ## _fname ),                   \\\n            _dict                                                \\\n          },\n\n#define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \\\n          {                                                       \\\n            _ident, T1CODE, _type,                                \\\n            0,                                                    \\\n            FT_FIELD_OFFSET( _fname ),                            \\\n            FT_FIELD_SIZE_DELTA( _fname ),                        \\\n            _max, 0,                                              \\\n            _dict                                                 \\\n          },\n\n\n#define T1_FIELD_BOOL( _ident, _fname, _dict )                             \\\n          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname, _dict )\n\n#define T1_FIELD_NUM( _ident, _fname, _dict )                                 \\\n          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname, _dict )\n\n#define T1_FIELD_FIXED( _ident, _fname, _dict )                             \\\n          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname, _dict )\n\n#define T1_FIELD_FIXED_1000( _ident, _fname, _dict )                     \\\n          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \\\n                               _dict )\n\n#define T1_FIELD_STRING( _ident, _fname, _dict )                             \\\n          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict )\n\n#define T1_FIELD_KEY( _ident, _fname, _dict )                             \\\n          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict )\n\n#define T1_FIELD_BBOX( _ident, _fname, _dict )                             \\\n          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname, _dict )\n\n\n#define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict )         \\\n          T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \\\n                              _fname, _fmax, _dict )\n\n#define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict )     \\\n          T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \\\n                              _fname, _fmax, _dict )\n\n#define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict )         \\\n          T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \\\n                               _fname, _fmax, _dict )\n\n#define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict )     \\\n          T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \\\n                               _fname, _fmax, _dict )\n\n#define T1_FIELD_CALLBACK( _ident, _name, _dict )       \\\n          T1_NEW_CALLBACK_FIELD( _ident, _name, _dict )\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                            T1 PARSER                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef const struct PS_Parser_FuncsRec_*  PS_Parser_Funcs;\n\n  typedef struct  PS_Parser_FuncsRec_\n  {\n    void\n    (*init)( PS_Parser  parser,\n             FT_Byte*   base,\n             FT_Byte*   limit,\n             FT_Memory  memory );\n\n    void\n    (*done)( PS_Parser  parser );\n\n    void\n    (*skip_spaces)( PS_Parser  parser );\n    void\n    (*skip_PS_token)( PS_Parser  parser );\n\n    FT_Long\n    (*to_int)( PS_Parser  parser );\n    FT_Fixed\n    (*to_fixed)( PS_Parser  parser,\n                 FT_Int     power_ten );\n\n    FT_Error\n    (*to_bytes)( PS_Parser  parser,\n                 FT_Byte*   bytes,\n                 FT_Offset  max_bytes,\n                 FT_Long*   pnum_bytes,\n                 FT_Bool    delimiters );\n\n    FT_Int\n    (*to_coord_array)( PS_Parser  parser,\n                       FT_Int     max_coords,\n                       FT_Short*  coords );\n    FT_Int\n    (*to_fixed_array)( PS_Parser  parser,\n                       FT_Int     max_values,\n                       FT_Fixed*  values,\n                       FT_Int     power_ten );\n\n    void\n    (*to_token)( PS_Parser  parser,\n                 T1_Token   token );\n    void\n    (*to_token_array)( PS_Parser  parser,\n                       T1_Token   tokens,\n                       FT_UInt    max_tokens,\n                       FT_Int*    pnum_tokens );\n\n    FT_Error\n    (*load_field)( PS_Parser       parser,\n                   const T1_Field  field,\n                   void**          objects,\n                   FT_UInt         max_objects,\n                   FT_ULong*       pflags );\n\n    FT_Error\n    (*load_field_table)( PS_Parser       parser,\n                         const T1_Field  field,\n                         void**          objects,\n                         FT_UInt         max_objects,\n                         FT_ULong*       pflags );\n\n  } PS_Parser_FuncsRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    PS_ParserRec                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A PS_Parser is an object used to parse a Type 1 font very quickly. */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    cursor :: The current position in the text.                        */\n  /*                                                                       */\n  /*    base   :: Start of the processed text.                             */\n  /*                                                                       */\n  /*    limit  :: End of the processed text.                               */\n  /*                                                                       */\n  /*    error  :: The last error returned.                                 */\n  /*                                                                       */\n  /*    memory :: The object used for memory operations (alloc/realloc).   */\n  /*                                                                       */\n  /*    funcs  :: A table of functions for the parser.                     */\n  /*                                                                       */\n  typedef struct  PS_ParserRec_\n  {\n    FT_Byte*   cursor;\n    FT_Byte*   base;\n    FT_Byte*   limit;\n    FT_Error   error;\n    FT_Memory  memory;\n\n    PS_Parser_FuncsRec  funcs;\n\n  } PS_ParserRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                         T1 BUILDER                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  typedef struct T1_BuilderRec_*  T1_Builder;\n\n\n  typedef FT_Error\n  (*T1_Builder_Check_Points_Func)( T1_Builder  builder,\n                                   FT_Int      count );\n\n  typedef void\n  (*T1_Builder_Add_Point_Func)( T1_Builder  builder,\n                                FT_Pos      x,\n                                FT_Pos      y,\n                                FT_Byte     flag );\n\n  typedef FT_Error\n  (*T1_Builder_Add_Point1_Func)( T1_Builder  builder,\n                                 FT_Pos      x,\n                                 FT_Pos      y );\n\n  typedef FT_Error\n  (*T1_Builder_Add_Contour_Func)( T1_Builder  builder );\n\n  typedef FT_Error\n  (*T1_Builder_Start_Point_Func)( T1_Builder  builder,\n                                  FT_Pos      x,\n                                  FT_Pos      y );\n\n  typedef void\n  (*T1_Builder_Close_Contour_Func)( T1_Builder  builder );\n\n\n  typedef const struct T1_Builder_FuncsRec_*  T1_Builder_Funcs;\n\n  typedef struct  T1_Builder_FuncsRec_\n  {\n    void\n    (*init)( T1_Builder    builder,\n             FT_Face       face,\n             FT_Size       size,\n             FT_GlyphSlot  slot,\n             FT_Bool       hinting );\n\n    void\n    (*done)( T1_Builder   builder );\n\n    T1_Builder_Check_Points_Func   check_points;\n    T1_Builder_Add_Point_Func      add_point;\n    T1_Builder_Add_Point1_Func     add_point1;\n    T1_Builder_Add_Contour_Func    add_contour;\n    T1_Builder_Start_Point_Func    start_point;\n    T1_Builder_Close_Contour_Func  close_contour;\n\n  } T1_Builder_FuncsRec;\n\n\n  /* an enumeration type to handle charstring parsing states */\n  typedef enum  T1_ParseState_\n  {\n    T1_Parse_Start,\n    T1_Parse_Have_Width,\n    T1_Parse_Have_Moveto,\n    T1_Parse_Have_Path\n\n  } T1_ParseState;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Structure>                                                           */\n  /*    T1_BuilderRec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*     A structure used during glyph loading to store its outline.       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    memory       :: The current memory object.                         */\n  /*                                                                       */\n  /*    face         :: The current face object.                           */\n  /*                                                                       */\n  /*    glyph        :: The current glyph slot.                            */\n  /*                                                                       */\n  /*    loader       :: XXX                                                */\n  /*                                                                       */\n  /*    base         :: The base glyph outline.                            */\n  /*                                                                       */\n  /*    current      :: The current glyph outline.                         */\n  /*                                                                       */\n  /*    max_points   :: maximum points in builder outline                  */\n  /*                                                                       */\n  /*    max_contours :: Maximum number of contours in builder outline.     */\n  /*                                                                       */\n  /*    pos_x        :: The horizontal translation (if composite glyph).   */\n  /*                                                                       */\n  /*    pos_y        :: The vertical translation (if composite glyph).     */\n  /*                                                                       */\n  /*    left_bearing :: The left side bearing point.                       */\n  /*                                                                       */\n  /*    advance      :: The horizontal advance vector.                     */\n  /*                                                                       */\n  /*    bbox         :: Unused.                                            */\n  /*                                                                       */\n  /*    parse_state  :: An enumeration which controls the charstring       */\n  /*                    parsing state.                                     */\n  /*                                                                       */\n  /*    load_points  :: If this flag is not set, no points are loaded.     */\n  /*                                                                       */\n  /*    no_recurse   :: Set but not used.                                  */\n  /*                                                                       */\n  /*    metrics_only :: A boolean indicating that we only want to compute  */\n  /*                    the metrics of a given glyph, not load all of its  */\n  /*                    points.                                            */\n  /*                                                                       */\n  /*    funcs        :: An array of function pointers for the builder.     */\n  /*                                                                       */\n  typedef struct  T1_BuilderRec_\n  {\n    FT_Memory       memory;\n    FT_Face         face;\n    FT_GlyphSlot    glyph;\n    FT_GlyphLoader  loader;\n    FT_Outline*     base;\n    FT_Outline*     current;\n\n    FT_Pos          pos_x;\n    FT_Pos          pos_y;\n\n    FT_Vector       left_bearing;\n    FT_Vector       advance;\n\n    FT_BBox         bbox;          /* bounding box */\n    T1_ParseState   parse_state;\n    FT_Bool         load_points;\n    FT_Bool         no_recurse;\n\n    FT_Bool         metrics_only;\n\n    void*           hints_funcs;    /* hinter-specific */\n    void*           hints_globals;  /* hinter-specific */\n\n    T1_Builder_FuncsRec  funcs;\n\n  } T1_BuilderRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                         T1 DECODER                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#if 0\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine   */\n  /* calls during glyph loading.                                           */\n  /*                                                                       */\n#define T1_MAX_SUBRS_CALLS  8\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity.  A     */\n  /* minimum of 16 is required.                                            */\n  /*                                                                       */\n#define T1_MAX_CHARSTRINGS_OPERANDS  32\n\n#endif /* 0 */\n\n\n  typedef struct  T1_Decoder_ZoneRec_\n  {\n    FT_Byte*  cursor;\n    FT_Byte*  base;\n    FT_Byte*  limit;\n\n  } T1_Decoder_ZoneRec, *T1_Decoder_Zone;\n\n\n  typedef struct T1_DecoderRec_*              T1_Decoder;\n  typedef const struct T1_Decoder_FuncsRec_*  T1_Decoder_Funcs;\n\n\n  typedef FT_Error\n  (*T1_Decoder_Callback)( T1_Decoder  decoder,\n                          FT_UInt     glyph_index );\n\n\n  typedef struct  T1_Decoder_FuncsRec_\n  {\n    FT_Error\n    (*init)( T1_Decoder           decoder,\n             FT_Face              face,\n             FT_Size              size,\n             FT_GlyphSlot         slot,\n             FT_Byte**            glyph_names,\n             PS_Blend             blend,\n             FT_Bool              hinting,\n             FT_Render_Mode       hint_mode,\n             T1_Decoder_Callback  callback );\n\n    void\n    (*done)( T1_Decoder  decoder );\n\n    FT_Error\n    (*parse_charstrings)( T1_Decoder  decoder,\n                          FT_Byte*    base,\n                          FT_UInt     len );\n\n  } T1_Decoder_FuncsRec;\n\n\n  typedef struct  T1_DecoderRec_\n  {\n    T1_BuilderRec        builder;\n\n    FT_Long              stack[T1_MAX_CHARSTRINGS_OPERANDS];\n    FT_Long*             top;\n\n    T1_Decoder_ZoneRec   zones[T1_MAX_SUBRS_CALLS + 1];\n    T1_Decoder_Zone      zone;\n\n    FT_Service_PsCMaps   psnames;      /* for seac */\n    FT_UInt              num_glyphs;\n    FT_Byte**            glyph_names;\n\n    FT_Int               lenIV;        /* internal for sub routine calls */\n    FT_UInt              num_subrs;\n    FT_Byte**            subrs;\n    FT_PtrDist*          subrs_len;    /* array of subrs length (optional) */\n\n    FT_Matrix            font_matrix;\n    FT_Vector            font_offset;\n\n    FT_Int               flex_state;\n    FT_Int               num_flex_vectors;\n    FT_Vector            flex_vectors[7];\n\n    PS_Blend             blend;       /* for multiple master support */\n\n    FT_Render_Mode       hint_mode;\n\n    T1_Decoder_Callback  parse_callback;\n    T1_Decoder_FuncsRec  funcs;\n\n    FT_Long*             buildchar;\n    FT_UInt              len_buildchar;\n\n    FT_Bool              seac;\n\n  } T1_DecoderRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                            AFM PARSER                         *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct AFM_ParserRec_*  AFM_Parser;\n\n  typedef struct  AFM_Parser_FuncsRec_\n  {\n    FT_Error\n    (*init)( AFM_Parser  parser,\n             FT_Memory   memory,\n             FT_Byte*    base,\n             FT_Byte*    limit );\n\n    void\n    (*done)( AFM_Parser  parser );\n\n    FT_Error\n    (*parse)( AFM_Parser  parser );\n\n  } AFM_Parser_FuncsRec;\n\n\n  typedef struct AFM_StreamRec_*  AFM_Stream;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    AFM_ParserRec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An AFM_Parser is a parser for the AFM files.                       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    memory    :: The object used for memory operations (alloc and      */\n  /*                 realloc).                                             */\n  /*                                                                       */\n  /*    stream    :: This is an opaque object.                             */\n  /*                                                                       */\n  /*    FontInfo  :: The result will be stored here.                       */\n  /*                                                                       */\n  /*    get_index :: A user provided function to get a glyph index by its  */\n  /*                 name.                                                 */\n  /*                                                                       */\n  typedef struct  AFM_ParserRec_\n  {\n    FT_Memory     memory;\n    AFM_Stream    stream;\n\n    AFM_FontInfo  FontInfo;\n\n    FT_Int\n    (*get_index)( const char*  name,\n                  FT_Offset    len,\n                  void*        user_data );\n\n    void*         user_data;\n\n  } AFM_ParserRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                     TYPE1 CHARMAPS                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef const struct T1_CMap_ClassesRec_*  T1_CMap_Classes;\n\n  typedef struct T1_CMap_ClassesRec_\n  {\n    FT_CMap_Class  standard;\n    FT_CMap_Class  expert;\n    FT_CMap_Class  custom;\n    FT_CMap_Class  unicode;\n\n  } T1_CMap_ClassesRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                        PSAux Module Interface                 *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct  PSAux_ServiceRec_\n  {\n    /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */\n    const PS_Table_FuncsRec*    ps_table_funcs;\n    const PS_Parser_FuncsRec*   ps_parser_funcs;\n    const T1_Builder_FuncsRec*  t1_builder_funcs;\n    const T1_Decoder_FuncsRec*  t1_decoder_funcs;\n\n    void\n    (*t1_decrypt)( FT_Byte*   buffer,\n                   FT_Offset  length,\n                   FT_UShort  seed );\n\n    T1_CMap_Classes  t1_cmap_classes;\n\n    /* fields after this comment line were added after version 2.1.10 */\n    const AFM_Parser_FuncsRec*  afm_parser_funcs;\n\n  } PSAux_ServiceRec, *PSAux_Service;\n\n  /* backwards-compatible type definition */\n  typedef PSAux_ServiceRec   PSAux_Interface;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                 Some convenience functions                    *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#define IS_PS_NEWLINE( ch ) \\\n  ( (ch) == '\\r' ||         \\\n    (ch) == '\\n' )\n\n#define IS_PS_SPACE( ch )  \\\n  ( (ch) == ' '         || \\\n    IS_PS_NEWLINE( ch ) || \\\n    (ch) == '\\t'        || \\\n    (ch) == '\\f'        || \\\n    (ch) == '\\0' )\n\n#define IS_PS_SPECIAL( ch )       \\\n  ( (ch) == '/'                || \\\n    (ch) == '(' || (ch) == ')' || \\\n    (ch) == '<' || (ch) == '>' || \\\n    (ch) == '[' || (ch) == ']' || \\\n    (ch) == '{' || (ch) == '}' || \\\n    (ch) == '%'                )\n\n#define IS_PS_DELIM( ch )  \\\n  ( IS_PS_SPACE( ch )   || \\\n    IS_PS_SPECIAL( ch ) )\n\n#define IS_PS_DIGIT( ch )        \\\n  ( (ch) >= '0' && (ch) <= '9' )\n\n#define IS_PS_XDIGIT( ch )            \\\n  ( IS_PS_DIGIT( ch )              || \\\n    ( (ch) >= 'A' && (ch) <= 'F' ) || \\\n    ( (ch) >= 'a' && (ch) <= 'f' ) )\n\n#define IS_PS_BASE85( ch )       \\\n  ( (ch) >= '!' && (ch) <= 'u' )\n\n#define IS_PS_TOKEN( cur, limit, token )                                \\\n  ( (char)(cur)[0] == (token)[0]                                     && \\\n    ( (cur) + sizeof ( (token) ) == (limit) ||                          \\\n      ( (cur) + sizeof( (token) ) < (limit)          &&                 \\\n        IS_PS_DELIM( (cur)[sizeof ( (token) ) - 1] ) ) )             && \\\n    ft_strncmp( (char*)(cur), (token), sizeof ( (token) ) - 1 ) == 0 )\n\n\nFT_END_HEADER\n\n#endif /* __PSAUX_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/pshints.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pshints.h                                                              */\n/*                                                                         */\n/*    Interface to Postscript-specific (Type 1 and Type 2) hints           */\n/*    recorders (specification only).  These are used to support native    */\n/*    T1/T2 hints in the `type1', `cid', and `cff' font drivers.           */\n/*                                                                         */\n/*  Copyright 2001-2003, 2005-2007, 2009, 2012 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PSHINTS_H__\n#define __PSHINTS_H__\n\n\n#include \"../../ft2build.h\"\n#include \"../freetype.h\"\n#include \"../t1tables.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****               INTERNAL REPRESENTATION OF GLOBALS              *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct PSH_GlobalsRec_*  PSH_Globals;\n\n  typedef FT_Error\n  (*PSH_Globals_NewFunc)( FT_Memory     memory,\n                          T1_Private*   private_dict,\n                          PSH_Globals*  aglobals );\n\n  typedef FT_Error\n  (*PSH_Globals_SetScaleFunc)( PSH_Globals  globals,\n                               FT_Fixed     x_scale,\n                               FT_Fixed     y_scale,\n                               FT_Fixed     x_delta,\n                               FT_Fixed     y_delta );\n\n  typedef void\n  (*PSH_Globals_DestroyFunc)( PSH_Globals  globals );\n\n\n  typedef struct  PSH_Globals_FuncsRec_\n  {\n    PSH_Globals_NewFunc       create;\n    PSH_Globals_SetScaleFunc  set_scale;\n    PSH_Globals_DestroyFunc   destroy;\n\n  } PSH_Globals_FuncsRec, *PSH_Globals_Funcs;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                  PUBLIC TYPE 1 HINTS RECORDER                 *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************\n   *\n   * @type:\n   *   T1_Hints\n   *\n   * @description:\n   *   This is a handle to an opaque structure used to record glyph hints\n   *   from a Type 1 character glyph character string.\n   *\n   *   The methods used to operate on this object are defined by the\n   *   @T1_Hints_FuncsRec structure.  Recording glyph hints is normally\n   *   achieved through the following scheme:\n   *\n   *   - Open a new hint recording session by calling the `open' method.\n   *     This rewinds the recorder and prepare it for new input.\n   *\n   *   - For each hint found in the glyph charstring, call the corresponding\n   *     method (`stem', `stem3', or `reset').  Note that these functions do\n   *     not return an error code.\n   *\n   *   - Close the recording session by calling the `close' method.  It\n   *     returns an error code if the hints were invalid or something\n   *     strange happened (e.g., memory shortage).\n   *\n   *   The hints accumulated in the object can later be used by the\n   *   PostScript hinter.\n   *\n   */\n  typedef struct T1_HintsRec_*  T1_Hints;\n\n\n  /*************************************************************************\n   *\n   * @type:\n   *   T1_Hints_Funcs\n   *\n   * @description:\n   *   A pointer to the @T1_Hints_FuncsRec structure that defines the API of\n   *   a given @T1_Hints object.\n   *\n   */\n  typedef const struct T1_Hints_FuncsRec_*  T1_Hints_Funcs;\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T1_Hints_OpenFunc\n   *\n   * @description:\n   *   A method of the @T1_Hints class used to prepare it for a new Type 1\n   *   hints recording session.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 1 hints recorder.\n   *\n   * @note:\n   *   You should always call the @T1_Hints_CloseFunc method in order to\n   *   close an opened recording session.\n   *\n   */\n  typedef void\n  (*T1_Hints_OpenFunc)( T1_Hints  hints );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T1_Hints_SetStemFunc\n   *\n   * @description:\n   *   A method of the @T1_Hints class used to record a new horizontal or\n   *   vertical stem.  This corresponds to the Type 1 `hstem' and `vstem'\n   *   operators.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 1 hints recorder.\n   *\n   *   dimension ::\n   *     0 for horizontal stems (hstem), 1 for vertical ones (vstem).\n   *\n   *   coords ::\n   *     Array of 2 coordinates in 16.16 format, used as (position,length)\n   *     stem descriptor.\n   *\n   * @note:\n   *   Use vertical coordinates (y) for horizontal stems (dim=0).  Use\n   *   horizontal coordinates (x) for vertical stems (dim=1).\n   *\n   *   `coords[0]' is the absolute stem position (lowest coordinate);\n   *   `coords[1]' is the length.\n   *\n   *   The length can be negative, in which case it must be either -20 or\n   *   -21.  It is interpreted as a `ghost' stem, according to the Type 1\n   *   specification.\n   *\n   *   If the length is -21 (corresponding to a bottom ghost stem), then\n   *   the real stem position is `coords[0]+coords[1]'.\n   *\n   */\n  typedef void\n  (*T1_Hints_SetStemFunc)( T1_Hints   hints,\n                           FT_UInt    dimension,\n                           FT_Fixed*  coords );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T1_Hints_SetStem3Func\n   *\n   * @description:\n   *   A method of the @T1_Hints class used to record three\n   *   counter-controlled horizontal or vertical stems at once.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 1 hints recorder.\n   *\n   *   dimension ::\n   *     0 for horizontal stems, 1 for vertical ones.\n   *\n   *   coords ::\n   *     An array of 6 values in 16.16 format, holding 3 (position,length)\n   *     pairs for the counter-controlled stems.\n   *\n   * @note:\n   *   Use vertical coordinates (y) for horizontal stems (dim=0).  Use\n   *   horizontal coordinates (x) for vertical stems (dim=1).\n   *\n   *   The lengths cannot be negative (ghost stems are never\n   *   counter-controlled).\n   *\n   */\n  typedef void\n  (*T1_Hints_SetStem3Func)( T1_Hints   hints,\n                            FT_UInt    dimension,\n                            FT_Fixed*  coords );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T1_Hints_ResetFunc\n   *\n   * @description:\n   *   A method of the @T1_Hints class used to reset the stems hints in a\n   *   recording session.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 1 hints recorder.\n   *\n   *   end_point ::\n   *     The index of the last point in the input glyph in which the\n   *     previously defined hints apply.\n   *\n   */\n  typedef void\n  (*T1_Hints_ResetFunc)( T1_Hints  hints,\n                         FT_UInt   end_point );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T1_Hints_CloseFunc\n   *\n   * @description:\n   *   A method of the @T1_Hints class used to close a hint recording\n   *   session.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 1 hints recorder.\n   *\n   *   end_point ::\n   *     The index of the last point in the input glyph.\n   *\n   * @return:\n   *   FreeType error code.  0 means success.\n   *\n   * @note:\n   *   The error code is set to indicate that an error occurred during the\n   *   recording session.\n   *\n   */\n  typedef FT_Error\n  (*T1_Hints_CloseFunc)( T1_Hints  hints,\n                         FT_UInt   end_point );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T1_Hints_ApplyFunc\n   *\n   * @description:\n   *   A method of the @T1_Hints class used to apply hints to the\n   *   corresponding glyph outline.  Must be called once all hints have been\n   *   recorded.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 1 hints recorder.\n   *\n   *   outline ::\n   *     A pointer to the target outline descriptor.\n   *\n   *   globals ::\n   *     The hinter globals for this font.\n   *\n   *   hint_mode ::\n   *     Hinting information.\n   *\n   * @return:\n   *   FreeType error code.  0 means success.\n   *\n   * @note:\n   *   On input, all points within the outline are in font coordinates. On\n   *   output, they are in 1/64th of pixels.\n   *\n   *   The scaling transformation is taken from the `globals' object which\n   *   must correspond to the same font as the glyph.\n   *\n   */\n  typedef FT_Error\n  (*T1_Hints_ApplyFunc)( T1_Hints        hints,\n                         FT_Outline*     outline,\n                         PSH_Globals     globals,\n                         FT_Render_Mode  hint_mode );\n\n\n  /*************************************************************************\n   *\n   * @struct:\n   *   T1_Hints_FuncsRec\n   *\n   * @description:\n   *   The structure used to provide the API to @T1_Hints objects.\n   *\n   * @fields:\n   *   hints ::\n   *     A handle to the T1 Hints recorder.\n   *\n   *   open ::\n   *     The function to open a recording session.\n   *\n   *   close ::\n   *     The function to close a recording session.\n   *\n   *   stem ::\n   *     The function to set a simple stem.\n   *\n   *   stem3 ::\n   *     The function to set counter-controlled stems.\n   *\n   *   reset ::\n   *     The function to reset stem hints.\n   *\n   *   apply ::\n   *     The function to apply the hints to the corresponding glyph outline.\n   *\n   */\n  typedef struct  T1_Hints_FuncsRec_\n  {\n    T1_Hints               hints;\n    T1_Hints_OpenFunc      open;\n    T1_Hints_CloseFunc     close;\n    T1_Hints_SetStemFunc   stem;\n    T1_Hints_SetStem3Func  stem3;\n    T1_Hints_ResetFunc     reset;\n    T1_Hints_ApplyFunc     apply;\n\n  } T1_Hints_FuncsRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                  PUBLIC TYPE 2 HINTS RECORDER                 *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************\n   *\n   * @type:\n   *   T2_Hints\n   *\n   * @description:\n   *   This is a handle to an opaque structure used to record glyph hints\n   *   from a Type 2 character glyph character string.\n   *\n   *   The methods used to operate on this object are defined by the\n   *   @T2_Hints_FuncsRec structure.  Recording glyph hints is normally\n   *   achieved through the following scheme:\n   *\n   *   - Open a new hint recording session by calling the `open' method.\n   *     This rewinds the recorder and prepare it for new input.\n   *\n   *   - For each hint found in the glyph charstring, call the corresponding\n   *     method (`stems', `hintmask', `counters').  Note that these\n   *     functions do not return an error code.\n   *\n   *   - Close the recording session by calling the `close' method.  It\n   *     returns an error code if the hints were invalid or something\n   *     strange happened (e.g., memory shortage).\n   *\n   *   The hints accumulated in the object can later be used by the\n   *   Postscript hinter.\n   *\n   */\n  typedef struct T2_HintsRec_*  T2_Hints;\n\n\n  /*************************************************************************\n   *\n   * @type:\n   *   T2_Hints_Funcs\n   *\n   * @description:\n   *   A pointer to the @T2_Hints_FuncsRec structure that defines the API of\n   *   a given @T2_Hints object.\n   *\n   */\n  typedef const struct T2_Hints_FuncsRec_*  T2_Hints_Funcs;\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T2_Hints_OpenFunc\n   *\n   * @description:\n   *   A method of the @T2_Hints class used to prepare it for a new Type 2\n   *   hints recording session.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 2 hints recorder.\n   *\n   * @note:\n   *   You should always call the @T2_Hints_CloseFunc method in order to\n   *   close an opened recording session.\n   *\n   */\n  typedef void\n  (*T2_Hints_OpenFunc)( T2_Hints  hints );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T2_Hints_StemsFunc\n   *\n   * @description:\n   *   A method of the @T2_Hints class used to set the table of stems in\n   *   either the vertical or horizontal dimension.  Equivalent to the\n   *   `hstem', `vstem', `hstemhm', and `vstemhm' Type 2 operators.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 2 hints recorder.\n   *\n   *   dimension ::\n   *     0 for horizontal stems (hstem), 1 for vertical ones (vstem).\n   *\n   *   count ::\n   *     The number of stems.\n   *\n   *   coords ::\n   *     An array of `count' (position,length) pairs in 16.16 format.\n   *\n   * @note:\n   *   Use vertical coordinates (y) for horizontal stems (dim=0).  Use\n   *   horizontal coordinates (x) for vertical stems (dim=1).\n   *\n   *   There are `2*count' elements in the `coords' array.  Each even\n   *   element is an absolute position in font units, each odd element is a\n   *   length in font units.\n   *\n   *   A length can be negative, in which case it must be either -20 or\n   *   -21.  It is interpreted as a `ghost' stem, according to the Type 1\n   *   specification.\n   *\n   */\n  typedef void\n  (*T2_Hints_StemsFunc)( T2_Hints   hints,\n                         FT_UInt    dimension,\n                         FT_UInt    count,\n                         FT_Fixed*  coordinates );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T2_Hints_MaskFunc\n   *\n   * @description:\n   *   A method of the @T2_Hints class used to set a given hintmask (this\n   *   corresponds to the `hintmask' Type 2 operator).\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 2 hints recorder.\n   *\n   *   end_point ::\n   *     The glyph index of the last point to which the previously defined\n   *     or activated hints apply.\n   *\n   *   bit_count ::\n   *     The number of bits in the hint mask.\n   *\n   *   bytes ::\n   *     An array of bytes modelling the hint mask.\n   *\n   * @note:\n   *   If the hintmask starts the charstring (before any glyph point\n   *   definition), the value of `end_point' should be 0.\n   *\n   *   `bit_count' is the number of meaningful bits in the `bytes' array; it\n   *   must be equal to the total number of hints defined so far (i.e.,\n   *   horizontal+verticals).\n   *\n   *   The `bytes' array can come directly from the Type 2 charstring and\n   *   respects the same format.\n   *\n   */\n  typedef void\n  (*T2_Hints_MaskFunc)( T2_Hints        hints,\n                        FT_UInt         end_point,\n                        FT_UInt         bit_count,\n                        const FT_Byte*  bytes );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T2_Hints_CounterFunc\n   *\n   * @description:\n   *   A method of the @T2_Hints class used to set a given counter mask\n   *   (this corresponds to the `hintmask' Type 2 operator).\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 2 hints recorder.\n   *\n   *   end_point ::\n   *     A glyph index of the last point to which the previously defined or\n   *     active hints apply.\n   *\n   *   bit_count ::\n   *     The number of bits in the hint mask.\n   *\n   *   bytes ::\n   *     An array of bytes modelling the hint mask.\n   *\n   * @note:\n   *   If the hintmask starts the charstring (before any glyph point\n   *   definition), the value of `end_point' should be 0.\n   *\n   *   `bit_count' is the number of meaningful bits in the `bytes' array; it\n   *   must be equal to the total number of hints defined so far (i.e.,\n   *   horizontal+verticals).\n   *\n   *    The `bytes' array can come directly from the Type 2 charstring and\n   *    respects the same format.\n   *\n   */\n  typedef void\n  (*T2_Hints_CounterFunc)( T2_Hints        hints,\n                           FT_UInt         bit_count,\n                           const FT_Byte*  bytes );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T2_Hints_CloseFunc\n   *\n   * @description:\n   *   A method of the @T2_Hints class used to close a hint recording\n   *   session.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 2 hints recorder.\n   *\n   *   end_point ::\n   *     The index of the last point in the input glyph.\n   *\n   * @return:\n   *   FreeType error code.  0 means success.\n   *\n   * @note:\n   *   The error code is set to indicate that an error occurred during the\n   *   recording session.\n   *\n   */\n  typedef FT_Error\n  (*T2_Hints_CloseFunc)( T2_Hints  hints,\n                         FT_UInt   end_point );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T2_Hints_ApplyFunc\n   *\n   * @description:\n   *   A method of the @T2_Hints class used to apply hints to the\n   *   corresponding glyph outline.  Must be called after the `close'\n   *   method.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 2 hints recorder.\n   *\n   *   outline ::\n   *     A pointer to the target outline descriptor.\n   *\n   *   globals ::\n   *     The hinter globals for this font.\n   *\n   *   hint_mode ::\n   *     Hinting information.\n   *\n   * @return:\n   *   FreeType error code.  0 means success.\n   *\n   * @note:\n   *   On input, all points within the outline are in font coordinates. On\n   *   output, they are in 1/64th of pixels.\n   *\n   *   The scaling transformation is taken from the `globals' object which\n   *   must correspond to the same font than the glyph.\n   *\n   */\n  typedef FT_Error\n  (*T2_Hints_ApplyFunc)( T2_Hints        hints,\n                         FT_Outline*     outline,\n                         PSH_Globals     globals,\n                         FT_Render_Mode  hint_mode );\n\n\n  /*************************************************************************\n   *\n   * @struct:\n   *   T2_Hints_FuncsRec\n   *\n   * @description:\n   *   The structure used to provide the API to @T2_Hints objects.\n   *\n   * @fields:\n   *   hints ::\n   *     A handle to the T2 hints recorder object.\n   *\n   *   open ::\n   *     The function to open a recording session.\n   *\n   *   close ::\n   *     The function to close a recording session.\n   *\n   *   stems ::\n   *     The function to set the dimension's stems table.\n   *\n   *   hintmask ::\n   *     The function to set hint masks.\n   *\n   *   counter ::\n   *     The function to set counter masks.\n   *\n   *   apply ::\n   *     The function to apply the hints on the corresponding glyph outline.\n   *\n   */\n  typedef struct  T2_Hints_FuncsRec_\n  {\n    T2_Hints              hints;\n    T2_Hints_OpenFunc     open;\n    T2_Hints_CloseFunc    close;\n    T2_Hints_StemsFunc    stems;\n    T2_Hints_MaskFunc     hintmask;\n    T2_Hints_CounterFunc  counter;\n    T2_Hints_ApplyFunc    apply;\n\n  } T2_Hints_FuncsRec;\n\n\n  /* */\n\n\n  typedef struct  PSHinter_Interface_\n  {\n    PSH_Globals_Funcs  (*get_globals_funcs)( FT_Module  module );\n    T1_Hints_Funcs     (*get_t1_funcs)     ( FT_Module  module );\n    T2_Hints_Funcs     (*get_t2_funcs)     ( FT_Module  module );\n\n  } PSHinter_Interface;\n\n  typedef PSHinter_Interface*  PSHinter_Service;\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_PSHINTER_INTERFACE(        \\\n          class_,                            \\\n          get_globals_funcs_,                \\\n          get_t1_funcs_,                     \\\n          get_t2_funcs_ )                    \\\n  static const PSHinter_Interface  class_ =  \\\n  {                                          \\\n    get_globals_funcs_,                      \\\n    get_t1_funcs_,                           \\\n    get_t2_funcs_                            \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_PSHINTER_INTERFACE(                      \\\n          class_,                                          \\\n          get_globals_funcs_,                              \\\n          get_t1_funcs_,                                   \\\n          get_t2_funcs_ )                                  \\\n  void                                                     \\\n  FT_Init_Class_ ## class_( FT_Library           library,  \\\n                            PSHinter_Interface*  clazz )   \\\n  {                                                        \\\n    FT_UNUSED( library );                                  \\\n                                                           \\\n    clazz->get_globals_funcs = get_globals_funcs_;         \\\n    clazz->get_t1_funcs      = get_t1_funcs_;              \\\n    clazz->get_t2_funcs      = get_t2_funcs_;              \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\nFT_END_HEADER\n\n#endif /* __PSHINTS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svbdf.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svbdf.h                                                                */\n/*                                                                         */\n/*    The FreeType BDF services (specification).                           */\n/*                                                                         */\n/*  Copyright 2003, 2009, 2012 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVBDF_H__\n#define __SVBDF_H__\n\n#include \"../../ftbdf.h\"\n#include \"../ftserv.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_BDF  \"bdf\"\n\n  typedef FT_Error\n  (*FT_BDF_GetCharsetIdFunc)( FT_Face       face,\n                              const char*  *acharset_encoding,\n                              const char*  *acharset_registry );\n\n  typedef FT_Error\n  (*FT_BDF_GetPropertyFunc)( FT_Face           face,\n                             const char*       prop_name,\n                             BDF_PropertyRec  *aproperty );\n\n\n  FT_DEFINE_SERVICE( BDF )\n  {\n    FT_BDF_GetCharsetIdFunc  get_charset_id;\n    FT_BDF_GetPropertyFunc   get_property;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_BDFRec( class_,                                \\\n                                  get_charset_id_,                       \\\n                                  get_property_ )                        \\\n  static const FT_Service_BDFRec  class_ =                               \\\n  {                                                                      \\\n    get_charset_id_, get_property_                                       \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_BDFRec( class_,                                \\\n                                  get_charset_id_,                       \\\n                                  get_property_ )                        \\\n  void                                                                   \\\n  FT_Init_Class_ ## class_( FT_Service_BDFRec*  clazz )                  \\\n  {                                                                      \\\n    clazz->get_charset_id = get_charset_id_;                             \\\n    clazz->get_property   = get_property_;                               \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVBDF_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svcid.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svcid.h                                                                */\n/*                                                                         */\n/*    The FreeType CID font services (specification).                      */\n/*                                                                         */\n/*  Copyright 2007, 2009, 2012 by Derek Clegg, Michael Toftdal.            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVCID_H__\n#define __SVCID_H__\n\n#include \"../ftserv.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_CID  \"CID\"\n\n  typedef FT_Error\n  (*FT_CID_GetRegistryOrderingSupplementFunc)( FT_Face       face,\n                                               const char*  *registry,\n                                               const char*  *ordering,\n                                               FT_Int       *supplement );\n  typedef FT_Error\n  (*FT_CID_GetIsInternallyCIDKeyedFunc)( FT_Face   face,\n                                         FT_Bool  *is_cid );\n  typedef FT_Error\n  (*FT_CID_GetCIDFromGlyphIndexFunc)( FT_Face   face,\n                                      FT_UInt   glyph_index,\n                                      FT_UInt  *cid );\n\n  FT_DEFINE_SERVICE( CID )\n  {\n    FT_CID_GetRegistryOrderingSupplementFunc  get_ros;\n    FT_CID_GetIsInternallyCIDKeyedFunc        get_is_cid;\n    FT_CID_GetCIDFromGlyphIndexFunc           get_cid_from_glyph_index;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_CIDREC( class_,                                   \\\n                                  get_ros_,                                 \\\n                                  get_is_cid_,                              \\\n                                  get_cid_from_glyph_index_ )               \\\n  static const FT_Service_CIDRec class_ =                                   \\\n  {                                                                         \\\n    get_ros_, get_is_cid_, get_cid_from_glyph_index_                        \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_CIDREC( class_,                                   \\\n                                  get_ros_,                                 \\\n                                  get_is_cid_,                              \\\n                                  get_cid_from_glyph_index_ )               \\\n  void                                                                      \\\n  FT_Init_Class_ ## class_( FT_Library          library,                    \\\n                            FT_Service_CIDRec*  clazz )                     \\\n  {                                                                         \\\n    FT_UNUSED( library );                                                   \\\n                                                                            \\\n    clazz->get_ros                  = get_ros_;                             \\\n    clazz->get_is_cid               = get_is_cid_;                          \\\n    clazz->get_cid_from_glyph_index = get_cid_from_glyph_index_;            \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVCID_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svgldict.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svgldict.h                                                             */\n/*                                                                         */\n/*    The FreeType glyph dictionary services (specification).              */\n/*                                                                         */\n/*  Copyright 2003, 2009, 2012 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVGLDICT_H__\n#define __SVGLDICT_H__\n\n#include \"../ftserv.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*\n   *  A service used to retrieve glyph names, as well as to find the\n   *  index of a given glyph name in a font.\n   *\n   */\n\n#define FT_SERVICE_ID_GLYPH_DICT  \"glyph-dict\"\n\n\n  typedef FT_Error\n  (*FT_GlyphDict_GetNameFunc)( FT_Face     face,\n                               FT_UInt     glyph_index,\n                               FT_Pointer  buffer,\n                               FT_UInt     buffer_max );\n\n  typedef FT_UInt\n  (*FT_GlyphDict_NameIndexFunc)( FT_Face     face,\n                                 FT_String*  glyph_name );\n\n\n  FT_DEFINE_SERVICE( GlyphDict )\n  {\n    FT_GlyphDict_GetNameFunc    get_name;\n    FT_GlyphDict_NameIndexFunc  name_index;  /* optional */\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_GLYPHDICTREC( class_,                        \\\n                                        get_name_,                     \\\n                                        name_index_)                   \\\n  static const FT_Service_GlyphDictRec  class_ =                       \\\n  {                                                                    \\\n    get_name_, name_index_                                             \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_GLYPHDICTREC( class_,                        \\\n                                        get_name_,                     \\\n                                        name_index_)                   \\\n  void                                                                 \\\n  FT_Init_Class_ ## class_( FT_Library                library,         \\\n                            FT_Service_GlyphDictRec*  clazz )          \\\n  {                                                                    \\\n    FT_UNUSED( library );                                              \\\n                                                                       \\\n    clazz->get_name   = get_name_;                                     \\\n    clazz->name_index = name_index_;                                   \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVGLDICT_H__ */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svgxval.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svgxval.h                                                              */\n/*                                                                         */\n/*    FreeType API for validating TrueTypeGX/AAT tables (specification).   */\n/*                                                                         */\n/*  Copyright 2004, 2005 by                                                */\n/*  Masatake YAMATO, Red Hat K.K.,                                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVGXVAL_H__\n#define __SVGXVAL_H__\n\n#include \"../../ftgxval.h\"\n#include \"../ftvalid.h\"\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_GX_VALIDATE           \"truetypegx-validate\"\n#define FT_SERVICE_ID_CLASSICKERN_VALIDATE  \"classickern-validate\"\n\n  typedef FT_Error\n  (*gxv_validate_func)( FT_Face   face,\n                        FT_UInt   gx_flags,\n                        FT_Bytes  tables[FT_VALIDATE_GX_LENGTH],\n                        FT_UInt   table_length );\n\n\n  typedef FT_Error\n  (*ckern_validate_func)( FT_Face   face,\n                          FT_UInt   ckern_flags,\n                          FT_Bytes  *ckern_table );\n\n\n  FT_DEFINE_SERVICE( GXvalidate )\n  {\n    gxv_validate_func  validate;\n  };\n\n  FT_DEFINE_SERVICE( CKERNvalidate )\n  {\n    ckern_validate_func  validate;\n  };\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVGXVAL_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svkern.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svkern.h                                                               */\n/*                                                                         */\n/*    The FreeType Kerning service (specification).                        */\n/*                                                                         */\n/*  Copyright 2006 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVKERN_H__\n#define __SVKERN_H__\n\n#include \"../ftserv.h\"\n#include \"../../tttables.h\"\n\n\nFT_BEGIN_HEADER\n\n#define FT_SERVICE_ID_KERNING  \"kerning\"\n\n\n  typedef FT_Error\n  (*FT_Kerning_TrackGetFunc)( FT_Face    face,\n                              FT_Fixed   point_size,\n                              FT_Int     degree,\n                              FT_Fixed*  akerning );\n\n  FT_DEFINE_SERVICE( Kerning )\n  {\n    FT_Kerning_TrackGetFunc  get_track;\n  };\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVKERN_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svmm.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svmm.h                                                                 */\n/*                                                                         */\n/*    The FreeType Multiple Masters and GX var services (specification).   */\n/*                                                                         */\n/*  Copyright 2003, 2004, 2009, 2012 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVMM_H__\n#define __SVMM_H__\n\n#include \"../ftserv.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*\n   *  A service used to manage multiple-masters data in a given face.\n   *\n   *  See the related APIs in `ftmm.h' (FT_MULTIPLE_MASTERS_H).\n   *\n   */\n\n#define FT_SERVICE_ID_MULTI_MASTERS  \"multi-masters\"\n\n\n  typedef FT_Error\n  (*FT_Get_MM_Func)( FT_Face           face,\n                     FT_Multi_Master*  master );\n\n  typedef FT_Error\n  (*FT_Get_MM_Var_Func)( FT_Face      face,\n                         FT_MM_Var*  *master );\n\n  typedef FT_Error\n  (*FT_Set_MM_Design_Func)( FT_Face   face,\n                            FT_UInt   num_coords,\n                            FT_Long*  coords );\n\n  typedef FT_Error\n  (*FT_Set_Var_Design_Func)( FT_Face    face,\n                             FT_UInt    num_coords,\n                             FT_Fixed*  coords );\n\n  typedef FT_Error\n  (*FT_Set_MM_Blend_Func)( FT_Face   face,\n                           FT_UInt   num_coords,\n                           FT_Long*  coords );\n\n\n  FT_DEFINE_SERVICE( MultiMasters )\n  {\n    FT_Get_MM_Func          get_mm;\n    FT_Set_MM_Design_Func   set_mm_design;\n    FT_Set_MM_Blend_Func    set_mm_blend;\n    FT_Get_MM_Var_Func      get_mm_var;\n    FT_Set_Var_Design_Func  set_var_design;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_,                          \\\n                                           get_mm_,                         \\\n                                           set_mm_design_,                  \\\n                                           set_mm_blend_,                   \\\n                                           get_mm_var_,                     \\\n                                           set_var_design_ )                \\\n  static const FT_Service_MultiMastersRec  class_ =                         \\\n  {                                                                         \\\n    get_mm_, set_mm_design_, set_mm_blend_, get_mm_var_, set_var_design_    \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_,                          \\\n                                           get_mm_,                         \\\n                                           set_mm_design_,                  \\\n                                           set_mm_blend_,                   \\\n                                           get_mm_var_,                     \\\n                                           set_var_design_ )                \\\n  void                                                                      \\\n  FT_Init_Class_ ## class_( FT_Service_MultiMastersRec*  clazz )            \\\n  {                                                                         \\\n    clazz->get_mm         = get_mm_;                                        \\\n    clazz->set_mm_design  = set_mm_design_;                                 \\\n    clazz->set_mm_blend   = set_mm_blend_;                                  \\\n    clazz->get_mm_var     = get_mm_var_;                                    \\\n    clazz->set_var_design = set_var_design_;                                \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __SVMM_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svotval.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svotval.h                                                              */\n/*                                                                         */\n/*    The FreeType OpenType validation service (specification).            */\n/*                                                                         */\n/*  Copyright 2004, 2006 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVOTVAL_H__\n#define __SVOTVAL_H__\n\n#include \"../../ftotval.h\"\n#include \"../ftvalid.h\"\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_OPENTYPE_VALIDATE  \"opentype-validate\"\n\n\n  typedef FT_Error\n  (*otv_validate_func)( FT_Face volatile  face,\n                        FT_UInt           ot_flags,\n                        FT_Bytes         *base,\n                        FT_Bytes         *gdef,\n                        FT_Bytes         *gpos,\n                        FT_Bytes         *gsub,\n                        FT_Bytes         *jstf );\n\n\n  FT_DEFINE_SERVICE( OTvalidate )\n  {\n    otv_validate_func  validate;\n  };\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVOTVAL_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpfr.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svpfr.h                                                                */\n/*                                                                         */\n/*    Internal PFR service functions (specification).                      */\n/*                                                                         */\n/*  Copyright 2003, 2006 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVPFR_H__\n#define __SVPFR_H__\n\n#include \"../../ftpfr.h\"\n#include \"../ftserv.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_PFR_METRICS  \"pfr-metrics\"\n\n\n  typedef FT_Error\n  (*FT_PFR_GetMetricsFunc)( FT_Face    face,\n                            FT_UInt   *aoutline,\n                            FT_UInt   *ametrics,\n                            FT_Fixed  *ax_scale,\n                            FT_Fixed  *ay_scale );\n\n  typedef FT_Error\n  (*FT_PFR_GetKerningFunc)( FT_Face     face,\n                            FT_UInt     left,\n                            FT_UInt     right,\n                            FT_Vector  *avector );\n\n  typedef FT_Error\n  (*FT_PFR_GetAdvanceFunc)( FT_Face   face,\n                            FT_UInt   gindex,\n                            FT_Pos   *aadvance );\n\n\n  FT_DEFINE_SERVICE( PfrMetrics )\n  {\n    FT_PFR_GetMetricsFunc  get_metrics;\n    FT_PFR_GetKerningFunc  get_kerning;\n    FT_PFR_GetAdvanceFunc  get_advance;\n\n  };\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __SVPFR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpostnm.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svpostnm.h                                                             */\n/*                                                                         */\n/*    The FreeType PostScript name services (specification).               */\n/*                                                                         */\n/*  Copyright 2003, 2007, 2009, 2012 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVPOSTNM_H__\n#define __SVPOSTNM_H__\n\n#include \"../ftserv.h\"\n\n\nFT_BEGIN_HEADER\n\n  /*\n   *  A trivial service used to retrieve the PostScript name of a given\n   *  font when available.  The `get_name' field should never be NULL.\n   *\n   *  The corresponding function can return NULL to indicate that the\n   *  PostScript name is not available.\n   *\n   *  The name is owned by the face and will be destroyed with it.\n   */\n\n#define FT_SERVICE_ID_POSTSCRIPT_FONT_NAME  \"postscript-font-name\"\n\n\n  typedef const char*\n  (*FT_PsName_GetFunc)( FT_Face  face );\n\n\n  FT_DEFINE_SERVICE( PsFontName )\n  {\n    FT_PsName_GetFunc  get_ps_font_name;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \\\n  static const FT_Service_PsFontNameRec  class_ =                    \\\n  {                                                                  \\\n    get_ps_font_name_                                                \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \\\n  void                                                               \\\n  FT_Init_Class_ ## class_( FT_Library                 library,      \\\n                            FT_Service_PsFontNameRec*  clazz )       \\\n  {                                                                  \\\n    FT_UNUSED( library );                                            \\\n                                                                     \\\n    clazz->get_ps_font_name = get_ps_font_name_;                     \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVPOSTNM_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svprop.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svprop.h                                                               */\n/*                                                                         */\n/*    The FreeType property service (specification).                       */\n/*                                                                         */\n/*  Copyright 2012 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVPROP_H__\n#define __SVPROP_H__\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_PROPERTIES  \"properties\"\n\n\n  typedef FT_Error\n  (*FT_Properties_SetFunc)( FT_Module    module,\n                            const char*  property_name,\n                            const void*  value );\n\n  typedef FT_Error\n  (*FT_Properties_GetFunc)( FT_Module    module,\n                            const char*  property_name,\n                            void*        value );\n\n\n  FT_DEFINE_SERVICE( Properties )\n  {\n    FT_Properties_SetFunc  set_property;\n    FT_Properties_GetFunc  get_property;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_PROPERTIESREC( class_,          \\\n                                         set_property_,   \\\n                                         get_property_ )  \\\n  static const FT_Service_PropertiesRec  class_ =         \\\n  {                                                       \\\n    set_property_,                                        \\\n    get_property_                                         \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_PROPERTIESREC( class_,                \\\n                                         set_property_,         \\\n                                         get_property_ )        \\\n  void                                                          \\\n  FT_Init_Class_ ## class_( FT_Service_PropertiesRec*  clazz )  \\\n  {                                                             \\\n    clazz->set_property = set_property_;                        \\\n    clazz->get_property = get_property_;                        \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVPROP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpscmap.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svpscmap.h                                                             */\n/*                                                                         */\n/*    The FreeType PostScript charmap service (specification).             */\n/*                                                                         */\n/*  Copyright 2003, 2006, 2009, 2012 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVPSCMAP_H__\n#define __SVPSCMAP_H__\n\n#include \"../ftobjs.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_POSTSCRIPT_CMAPS  \"postscript-cmaps\"\n\n\n  /*\n   *  Adobe glyph name to unicode value.\n   */\n  typedef FT_UInt32\n  (*PS_Unicode_ValueFunc)( const char*  glyph_name );\n\n  /*\n   *  Macintosh name id to glyph name.  NULL if invalid index.\n   */\n  typedef const char*\n  (*PS_Macintosh_NameFunc)( FT_UInt  name_index );\n\n  /*\n   *  Adobe standard string ID to glyph name.  NULL if invalid index.\n   */\n  typedef const char*\n  (*PS_Adobe_Std_StringsFunc)( FT_UInt  string_index );\n\n\n  /*\n   *  Simple unicode -> glyph index charmap built from font glyph names\n   *  table.\n   */\n  typedef struct  PS_UniMap_\n  {\n    FT_UInt32  unicode;      /* bit 31 set: is glyph variant */\n    FT_UInt    glyph_index;\n\n  } PS_UniMap;\n\n\n  typedef struct PS_UnicodesRec_*  PS_Unicodes;\n\n  typedef struct  PS_UnicodesRec_\n  {\n    FT_CMapRec  cmap;\n    FT_UInt     num_maps;\n    PS_UniMap*  maps;\n\n  } PS_UnicodesRec;\n\n\n  /*\n   *  A function which returns a glyph name for a given index.  Returns\n   *  NULL if invalid index.\n   */\n  typedef const char*\n  (*PS_GetGlyphNameFunc)( FT_Pointer  data,\n                          FT_UInt     string_index );\n\n  /*\n   *  A function used to release the glyph name returned by\n   *  PS_GetGlyphNameFunc, when needed\n   */\n  typedef void\n  (*PS_FreeGlyphNameFunc)( FT_Pointer  data,\n                           const char*  name );\n\n  typedef FT_Error\n  (*PS_Unicodes_InitFunc)( FT_Memory             memory,\n                           PS_Unicodes           unicodes,\n                           FT_UInt               num_glyphs,\n                           PS_GetGlyphNameFunc   get_glyph_name,\n                           PS_FreeGlyphNameFunc  free_glyph_name,\n                           FT_Pointer            glyph_data );\n\n  typedef FT_UInt\n  (*PS_Unicodes_CharIndexFunc)( PS_Unicodes  unicodes,\n                                FT_UInt32    unicode );\n\n  typedef FT_UInt32\n  (*PS_Unicodes_CharNextFunc)( PS_Unicodes  unicodes,\n                               FT_UInt32   *unicode );\n\n\n  FT_DEFINE_SERVICE( PsCMaps )\n  {\n    PS_Unicode_ValueFunc       unicode_value;\n\n    PS_Unicodes_InitFunc       unicodes_init;\n    PS_Unicodes_CharIndexFunc  unicodes_char_index;\n    PS_Unicodes_CharNextFunc   unicodes_char_next;\n\n    PS_Macintosh_NameFunc      macintosh_name;\n    PS_Adobe_Std_StringsFunc   adobe_std_strings;\n    const unsigned short*      adobe_std_encoding;\n    const unsigned short*      adobe_expert_encoding;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_PSCMAPSREC( class_,                               \\\n                                      unicode_value_,                       \\\n                                      unicodes_init_,                       \\\n                                      unicodes_char_index_,                 \\\n                                      unicodes_char_next_,                  \\\n                                      macintosh_name_,                      \\\n                                      adobe_std_strings_,                   \\\n                                      adobe_std_encoding_,                  \\\n                                      adobe_expert_encoding_ )              \\\n  static const FT_Service_PsCMapsRec  class_ =                              \\\n  {                                                                         \\\n    unicode_value_, unicodes_init_,                                         \\\n    unicodes_char_index_, unicodes_char_next_, macintosh_name_,             \\\n    adobe_std_strings_, adobe_std_encoding_, adobe_expert_encoding_         \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_PSCMAPSREC( class_,                               \\\n                                      unicode_value_,                       \\\n                                      unicodes_init_,                       \\\n                                      unicodes_char_index_,                 \\\n                                      unicodes_char_next_,                  \\\n                                      macintosh_name_,                      \\\n                                      adobe_std_strings_,                   \\\n                                      adobe_std_encoding_,                  \\\n                                      adobe_expert_encoding_ )              \\\n  void                                                                      \\\n  FT_Init_Class_ ## class_( FT_Library              library,                \\\n                            FT_Service_PsCMapsRec*  clazz )                 \\\n  {                                                                         \\\n    FT_UNUSED( library );                                                   \\\n                                                                            \\\n    clazz->unicode_value         = unicode_value_;                          \\\n    clazz->unicodes_init         = unicodes_init_;                          \\\n    clazz->unicodes_char_index   = unicodes_char_index_;                    \\\n    clazz->unicodes_char_next    = unicodes_char_next_;                     \\\n    clazz->macintosh_name        = macintosh_name_;                         \\\n    clazz->adobe_std_strings     = adobe_std_strings_;                      \\\n    clazz->adobe_std_encoding    = adobe_std_encoding_;                     \\\n    clazz->adobe_expert_encoding = adobe_expert_encoding_;                  \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVPSCMAP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpsinfo.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svpsinfo.h                                                             */\n/*                                                                         */\n/*    The FreeType PostScript info service (specification).                */\n/*                                                                         */\n/*  Copyright 2003, 2004, 2009, 2011, 2012 by                              */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVPSINFO_H__\n#define __SVPSINFO_H__\n\n#include \"../ftserv.h\"\n#include \"../t1types.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_POSTSCRIPT_INFO  \"postscript-info\"\n\n\n  typedef FT_Error\n  (*PS_GetFontInfoFunc)( FT_Face          face,\n                         PS_FontInfoRec*  afont_info );\n\n  typedef FT_Error\n  (*PS_GetFontExtraFunc)( FT_Face           face,\n                          PS_FontExtraRec*  afont_extra );\n\n  typedef FT_Int\n  (*PS_HasGlyphNamesFunc)( FT_Face  face );\n\n  typedef FT_Error\n  (*PS_GetFontPrivateFunc)( FT_Face         face,\n                            PS_PrivateRec*  afont_private );\n\n  typedef FT_Long\n  (*PS_GetFontValueFunc)( FT_Face       face,\n                          PS_Dict_Keys  key,\n                          FT_UInt       idx,\n                          void         *value,\n                          FT_Long       value_len );\n\n\n  FT_DEFINE_SERVICE( PsInfo )\n  {\n    PS_GetFontInfoFunc     ps_get_font_info;\n    PS_GetFontExtraFunc    ps_get_font_extra;\n    PS_HasGlyphNamesFunc   ps_has_glyph_names;\n    PS_GetFontPrivateFunc  ps_get_font_private;\n    PS_GetFontValueFunc    ps_get_font_value;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_PSINFOREC( class_,                     \\\n                                     get_font_info_,             \\\n                                     ps_get_font_extra_,         \\\n                                     has_glyph_names_,           \\\n                                     get_font_private_,          \\\n                                     get_font_value_ )           \\\n  static const FT_Service_PsInfoRec  class_ =                    \\\n  {                                                              \\\n    get_font_info_, ps_get_font_extra_, has_glyph_names_,        \\\n    get_font_private_, get_font_value_                           \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_PSINFOREC( class_,                     \\\n                                     get_font_info_,             \\\n                                     ps_get_font_extra_,         \\\n                                     has_glyph_names_,           \\\n                                     get_font_private_,          \\\n                                     get_font_value_ )           \\\n  void                                                           \\\n  FT_Init_Class_ ## class_( FT_Library             library,      \\\n                            FT_Service_PsInfoRec*  clazz )       \\\n  {                                                              \\\n    FT_UNUSED( library );                                        \\\n                                                                 \\\n    clazz->ps_get_font_info    = get_font_info_;                 \\\n    clazz->ps_get_font_extra   = ps_get_font_extra_;             \\\n    clazz->ps_has_glyph_names  = has_glyph_names_;               \\\n    clazz->ps_get_font_private = get_font_private_;              \\\n    clazz->ps_get_font_value   = get_font_value_;                \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVPSINFO_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svsfnt.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svsfnt.h                                                               */\n/*                                                                         */\n/*    The FreeType SFNT table loading service (specification).             */\n/*                                                                         */\n/*  Copyright 2003, 2004, 2009, 2012 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVSFNT_H__\n#define __SVSFNT_H__\n\n#include \"../ftserv.h\"\n#include \"../../tttables.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*\n   *  SFNT table loading service.\n   */\n\n#define FT_SERVICE_ID_SFNT_TABLE  \"sfnt-table\"\n\n\n  /*\n   * Used to implement FT_Load_Sfnt_Table().\n   */\n  typedef FT_Error\n  (*FT_SFNT_TableLoadFunc)( FT_Face    face,\n                            FT_ULong   tag,\n                            FT_Long    offset,\n                            FT_Byte*   buffer,\n                            FT_ULong*  length );\n\n  /*\n   * Used to implement FT_Get_Sfnt_Table().\n   */\n  typedef void*\n  (*FT_SFNT_TableGetFunc)( FT_Face      face,\n                           FT_Sfnt_Tag  tag );\n\n\n  /*\n   * Used to implement FT_Sfnt_Table_Info().\n   */\n  typedef FT_Error\n  (*FT_SFNT_TableInfoFunc)( FT_Face    face,\n                            FT_UInt    idx,\n                            FT_ULong  *tag,\n                            FT_ULong  *offset,\n                            FT_ULong  *length );\n\n\n  FT_DEFINE_SERVICE( SFNT_Table )\n  {\n    FT_SFNT_TableLoadFunc  load_table;\n    FT_SFNT_TableGetFunc   get_table;\n    FT_SFNT_TableInfoFunc  table_info;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ )  \\\n  static const FT_Service_SFNT_TableRec  class_ =                      \\\n  {                                                                    \\\n    load_, get_, info_                                                 \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ ) \\\n  void                                                                \\\n  FT_Init_Class_ ## class_( FT_Service_SFNT_TableRec*  clazz )        \\\n  {                                                                   \\\n    clazz->load_table = load_;                                        \\\n    clazz->get_table  = get_;                                         \\\n    clazz->table_info = info_;                                        \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVSFNT_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svttcmap.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svttcmap.h                                                             */\n/*                                                                         */\n/*    The FreeType TrueType/sfnt cmap extra information service.           */\n/*                                                                         */\n/*  Copyright 2003 by                                                      */\n/*  Masatake YAMATO, Redhat K.K.                                           */\n/*                                                                         */\n/*  Copyright 2003, 2008, 2009, 2012 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/* Development of this service is support of\n   Information-technology Promotion Agency, Japan. */\n\n#ifndef __SVTTCMAP_H__\n#define __SVTTCMAP_H__\n\n#include \"../ftserv.h\"\n#include \"../../tttables.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_TT_CMAP  \"tt-cmaps\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_CMapInfo                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to store TrueType/sfnt specific cmap information  */\n  /*    which is not covered by the generic @FT_CharMap structure.  This   */\n  /*    structure can be accessed with the @FT_Get_TT_CMap_Info function.  */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    language ::                                                        */\n  /*      The language ID used in Mac fonts.  Definitions of values are in */\n  /*      freetype/ttnameid.h.                                             */\n  /*                                                                       */\n  /*    format ::                                                          */\n  /*      The cmap format.  OpenType 1.5 defines the formats 0 (byte       */\n  /*      encoding table), 2~(high-byte mapping through table), 4~(segment */\n  /*      mapping to delta values), 6~(trimmed table mapping), 8~(mixed    */\n  /*      16-bit and 32-bit coverage), 10~(trimmed array), 12~(segmented   */\n  /*      coverage), and 14 (Unicode Variation Sequences).                 */\n  /*                                                                       */\n  typedef struct  TT_CMapInfo_\n  {\n    FT_ULong  language;\n    FT_Long   format;\n\n  } TT_CMapInfo;\n\n\n  typedef FT_Error\n  (*TT_CMap_Info_GetFunc)( FT_CharMap    charmap,\n                           TT_CMapInfo  *cmap_info );\n\n\n  FT_DEFINE_SERVICE( TTCMaps )\n  {\n    TT_CMap_Info_GetFunc  get_cmap_info;\n  };\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ )  \\\n  static const FT_Service_TTCMapsRec  class_ =                  \\\n  {                                                             \\\n    get_cmap_info_                                              \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ )  \\\n  void                                                          \\\n  FT_Init_Class_ ## class_( FT_Library              library,    \\\n                            FT_Service_TTCMapsRec*  clazz )     \\\n  {                                                             \\\n    FT_UNUSED( library );                                       \\\n                                                                \\\n    clazz->get_cmap_info = get_cmap_info_;                      \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __SVTTCMAP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svtteng.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svtteng.h                                                              */\n/*                                                                         */\n/*    The FreeType TrueType engine query service (specification).          */\n/*                                                                         */\n/*  Copyright 2006 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVTTENG_H__\n#define __SVTTENG_H__\n\n#include \"../ftserv.h\"\n#include \"../../ftmodapi.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*\n   *  SFNT table loading service.\n   */\n\n#define FT_SERVICE_ID_TRUETYPE_ENGINE  \"truetype-engine\"\n\n  /*\n   * Used to implement FT_Get_TrueType_Engine_Type\n   */\n\n  FT_DEFINE_SERVICE( TrueTypeEngine )\n  {\n    FT_TrueTypeEngineType  engine_type;\n  };\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVTTENG_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svttglyf.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svttglyf.h                                                             */\n/*                                                                         */\n/*    The FreeType TrueType glyph service.                                 */\n/*                                                                         */\n/*  Copyright 2007, 2009, 2012 by David Turner.                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#ifndef __SVTTGLYF_H__\n#define __SVTTGLYF_H__\n\n#include \"../ftserv.h\"\n#include \"../../tttables.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_TT_GLYF  \"tt-glyf\"\n\n\n  typedef FT_ULong\n  (*TT_Glyf_GetLocationFunc)( FT_Face    face,\n                              FT_UInt    gindex,\n                              FT_ULong  *psize );\n\n  FT_DEFINE_SERVICE( TTGlyf )\n  {\n    TT_Glyf_GetLocationFunc  get_location;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ )  \\\n  static const FT_Service_TTGlyfRec  class_ =                 \\\n  {                                                           \\\n    get_location_                                             \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ )  \\\n  void                                                        \\\n  FT_Init_Class_ ## class_( FT_Service_TTGlyfRec*  clazz )    \\\n  {                                                           \\\n    clazz->get_location = get_location_;                      \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __SVTTGLYF_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svwinfnt.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svwinfnt.h                                                             */\n/*                                                                         */\n/*    The FreeType Windows FNT/FONT service (specification).               */\n/*                                                                         */\n/*  Copyright 2003 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVWINFNT_H__\n#define __SVWINFNT_H__\n\n#include \"../ftserv.h\"\n#include \"../../ftwinfnt.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_WINFNT  \"winfonts\"\n\n  typedef FT_Error\n  (*FT_WinFnt_GetHeaderFunc)( FT_Face               face,\n                              FT_WinFNT_HeaderRec  *aheader );\n\n\n  FT_DEFINE_SERVICE( WinFnt )\n  {\n    FT_WinFnt_GetHeaderFunc  get_header;\n  };\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVWINFNT_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svxf86nm.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svxf86nm.h                                                             */\n/*                                                                         */\n/*    The FreeType XFree86 services (specification only).                  */\n/*                                                                         */\n/*  Copyright 2003 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVXF86NM_H__\n#define __SVXF86NM_H__\n\n#include \"../ftserv.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*\n   *  A trivial service used to return the name of a face's font driver,\n   *  according to the XFree86 nomenclature.  Note that the service data\n   *  is a simple constant string pointer.\n   */\n\n#define FT_SERVICE_ID_XF86_NAME  \"xf86-driver-name\"\n\n#define FT_XF86_FORMAT_TRUETYPE  \"TrueType\"\n#define FT_XF86_FORMAT_TYPE_1    \"Type 1\"\n#define FT_XF86_FORMAT_BDF       \"BDF\"\n#define FT_XF86_FORMAT_PCF       \"PCF\"\n#define FT_XF86_FORMAT_TYPE_42   \"Type 42\"\n#define FT_XF86_FORMAT_CID       \"CID Type 1\"\n#define FT_XF86_FORMAT_CFF       \"CFF\"\n#define FT_XF86_FORMAT_PFR       \"PFR\"\n#define FT_XF86_FORMAT_WINFNT    \"Windows FNT\"\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVXF86NM_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/sfnt.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  sfnt.h                                                                 */\n/*                                                                         */\n/*    High-level `sfnt' driver interface (specification).                  */\n/*                                                                         */\n/*  Copyright 1996-2006, 2009, 2012-2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SFNT_H__\n#define __SFNT_H__\n\n\n#include \"../../ft2build.h\"\n#include \"ftdriver.h\"\n#include \"tttypes.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Init_Face_Func                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    First part of the SFNT face object initialization.  This finds     */\n  /*    the face in a SFNT file or collection, and load its format tag in  */\n  /*    face->format_tag.                                                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream     :: The input stream.                                    */\n  /*                                                                       */\n  /*    face       :: A handle to the target face object.                  */\n  /*                                                                       */\n  /*    face_index :: The index of the TrueType font, if we are opening a  */\n  /*                  collection.                                          */\n  /*                                                                       */\n  /*    num_params :: The number of additional parameters.                 */\n  /*                                                                       */\n  /*    params     :: Optional additional parameters.                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The stream cursor must be at the font file's origin.               */\n  /*                                                                       */\n  /*    This function recognizes fonts embedded in a `TrueType             */\n  /*    collection'.                                                       */\n  /*                                                                       */\n  /*    Once the format tag has been validated by the font driver, it      */\n  /*    should then call the TT_Load_Face_Func() callback to read the rest */\n  /*    of the SFNT tables in the object.                                  */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Init_Face_Func)( FT_Stream      stream,\n                        TT_Face        face,\n                        FT_Int         face_index,\n                        FT_Int         num_params,\n                        FT_Parameter*  params );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Load_Face_Func                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Second part of the SFNT face object initialization.  This loads    */\n  /*    the common SFNT tables (head, OS/2, maxp, metrics, etc.) in the    */\n  /*    face object.                                                       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream     :: The input stream.                                    */\n  /*                                                                       */\n  /*    face       :: A handle to the target face object.                  */\n  /*                                                                       */\n  /*    face_index :: The index of the TrueType font, if we are opening a  */\n  /*                  collection.                                          */\n  /*                                                                       */\n  /*    num_params :: The number of additional parameters.                 */\n  /*                                                                       */\n  /*    params     :: Optional additional parameters.                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function must be called after TT_Init_Face_Func().            */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Load_Face_Func)( FT_Stream      stream,\n                        TT_Face        face,\n                        FT_Int         face_index,\n                        FT_Int         num_params,\n                        FT_Parameter*  params );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Done_Face_Func                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A callback used to delete the common SFNT data from a face.        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to the target face object.                        */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function does NOT destroy the face object.                    */\n  /*                                                                       */\n  typedef void\n  (*TT_Done_Face_Func)( TT_Face  face );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Load_Any_Func                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load any font table into client memory.                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: The face object to look for.                             */\n  /*                                                                       */\n  /*    tag    :: The tag of table to load.  Use the value 0 if you want   */\n  /*              to access the whole font file, else set this parameter   */\n  /*              to a valid TrueType table tag that you can forge with    */\n  /*              the MAKE_TT_TAG macro.                                   */\n  /*                                                                       */\n  /*    offset :: The starting offset in the table (or the file if         */\n  /*              tag == 0).                                               */\n  /*                                                                       */\n  /*    length :: The address of the decision variable:                    */\n  /*                                                                       */\n  /*                If length == NULL:                                     */\n  /*                  Loads the whole table.  Returns an error if          */\n  /*                  `offset' == 0!                                       */\n  /*                                                                       */\n  /*                If *length == 0:                                       */\n  /*                  Exits immediately; returning the length of the given */\n  /*                  table or of the font file, depending on the value of */\n  /*                  `tag'.                                               */\n  /*                                                                       */\n  /*                If *length != 0:                                       */\n  /*                  Loads the next `length' bytes of table or font,      */\n  /*                  starting at offset `offset' (in table or font too).  */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    buffer :: The address of target buffer.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    TrueType error code.  0 means success.                             */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Load_Any_Func)( TT_Face    face,\n                       FT_ULong   tag,\n                       FT_Long    offset,\n                       FT_Byte   *buffer,\n                       FT_ULong*  length );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Find_SBit_Image_Func                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Check whether an embedded bitmap (an `sbit') exists for a given    */\n  /*    glyph, at a given strike.                                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face          :: The target face object.                           */\n  /*                                                                       */\n  /*    glyph_index   :: The glyph index.                                  */\n  /*                                                                       */\n  /*    strike_index  :: The current strike index.                         */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    arange        :: The SBit range containing the glyph index.        */\n  /*                                                                       */\n  /*    astrike       :: The SBit strike containing the glyph index.       */\n  /*                                                                       */\n  /*    aglyph_offset :: The offset of the glyph data in `EBDT' table.     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.  Returns                    */\n  /*    SFNT_Err_Invalid_Argument if no sbit exists for the requested      */\n  /*    glyph.                                                             */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Find_SBit_Image_Func)( TT_Face          face,\n                              FT_UInt          glyph_index,\n                              FT_ULong         strike_index,\n                              TT_SBit_Range   *arange,\n                              TT_SBit_Strike  *astrike,\n                              FT_ULong        *aglyph_offset );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Load_SBit_Metrics_Func                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Get the big metrics for a given embedded bitmap.                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream      :: The input stream.                                   */\n  /*                                                                       */\n  /*    range       :: The SBit range containing the glyph.                */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    big_metrics :: A big SBit metrics structure for the glyph.         */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The stream cursor must be positioned at the glyph's offset within  */\n  /*    the `EBDT' table before the call.                                  */\n  /*                                                                       */\n  /*    If the image format uses variable metrics, the stream cursor is    */\n  /*    positioned just after the metrics header in the `EBDT' table on    */\n  /*    function exit.                                                     */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Load_SBit_Metrics_Func)( FT_Stream        stream,\n                                TT_SBit_Range    range,\n                                TT_SBit_Metrics  metrics );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Load_SBit_Image_Func                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load a given glyph sbit image from the font resource.  This also   */\n  /*    returns its metrics.                                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face ::                                                            */\n  /*      The target face object.                                          */\n  /*                                                                       */\n  /*    strike_index ::                                                    */\n  /*      The strike index.                                                */\n  /*                                                                       */\n  /*    glyph_index ::                                                     */\n  /*      The current glyph index.                                         */\n  /*                                                                       */\n  /*    load_flags ::                                                      */\n  /*      The current load flags.                                          */\n  /*                                                                       */\n  /*    stream ::                                                          */\n  /*      The input stream.                                                */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    amap ::                                                            */\n  /*      The target pixmap.                                               */\n  /*                                                                       */\n  /*    ametrics ::                                                        */\n  /*      A big sbit metrics structure for the glyph image.                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.  Returns an error if no     */\n  /*    glyph sbit exists for the index.                                   */\n  /*                                                                       */\n  /*  <Note>                                                               */\n  /*    The `map.buffer' field is always freed before the glyph is loaded. */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Load_SBit_Image_Func)( TT_Face              face,\n                              FT_ULong             strike_index,\n                              FT_UInt              glyph_index,\n                              FT_UInt              load_flags,\n                              FT_Stream            stream,\n                              FT_Bitmap           *amap,\n                              TT_SBit_MetricsRec  *ametrics );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Set_SBit_Strike_Func                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Select an sbit strike for a given size request.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face          :: The target face object.                           */\n  /*                                                                       */\n  /*    req           :: The size request.                                 */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    astrike_index :: The index of the sbit strike.                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.  Returns an error if no     */\n  /*    sbit strike exists for the selected ppem values.                   */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Set_SBit_Strike_Func)( TT_Face          face,\n                              FT_Size_Request  req,\n                              FT_ULong*        astrike_index );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Load_Strike_Metrics_Func                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load the metrics of a given strike.                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face          :: The target face object.                           */\n  /*                                                                       */\n  /*    strike_index  :: The strike index.                                 */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    metrics       :: the metrics of the strike.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.  Returns an error if no     */\n  /*    such sbit strike exists.                                           */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Load_Strike_Metrics_Func)( TT_Face           face,\n                                  FT_ULong          strike_index,\n                                  FT_Size_Metrics*  metrics );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Get_PS_Name_Func                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Get the PostScript glyph name of a glyph.                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    idx  :: The glyph index.                                           */\n  /*                                                                       */\n  /*    PSname :: The address of a string pointer.  Will be NULL in case   */\n  /*              of error, otherwise it is a pointer to the glyph name.   */\n  /*                                                                       */\n  /*              You must not modify the returned string!                 */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Get_PS_Name_Func)( TT_Face      face,\n                          FT_UInt      idx,\n                          FT_String**  PSname );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Load_Metrics_Func                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load a metrics table, which is a table with a horizontal and a     */\n  /*    vertical version.                                                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face     :: A handle to the target face object.                    */\n  /*                                                                       */\n  /*    stream   :: The input stream.                                      */\n  /*                                                                       */\n  /*    vertical :: A boolean flag.  If set, load the vertical one.        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Load_Metrics_Func)( TT_Face    face,\n                           FT_Stream  stream,\n                           FT_Bool    vertical );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Get_Metrics_Func                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load the horizontal or vertical header in a face object.           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face     :: A handle to the target face object.                    */\n  /*                                                                       */\n  /*    stream   :: The input stream.                                      */\n  /*                                                                       */\n  /*    vertical :: A boolean flag.  If set, load vertical metrics.        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Get_Metrics_Func)( TT_Face     face,\n                          FT_Bool     vertical,\n                          FT_UInt     gindex,\n                          FT_Short*   abearing,\n                          FT_UShort*  aadvance );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Load_Table_Func                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load a given TrueType table.                                       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /*    stream :: The input stream.                                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The function uses `face->goto_table' to seek the stream to the     */\n  /*    start of the table, except while loading the font directory.       */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Load_Table_Func)( TT_Face    face,\n                         FT_Stream  stream );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Free_Table_Func                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Free a given TrueType table.                                       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to the target face object.                        */\n  /*                                                                       */\n  typedef void\n  (*TT_Free_Table_Func)( TT_Face  face );\n\n\n  /*\n   * @functype:\n   *    TT_Face_GetKerningFunc\n   *\n   * @description:\n   *    Return the horizontal kerning value between two glyphs.\n   *\n   * @input:\n   *    face        :: A handle to the source face object.\n   *    left_glyph  :: The left glyph index.\n   *    right_glyph :: The right glyph index.\n   *\n   * @return:\n   *    The kerning value in font units.\n   */\n  typedef FT_Int\n  (*TT_Face_GetKerningFunc)( TT_Face  face,\n                             FT_UInt  left_glyph,\n                             FT_UInt  right_glyph );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    SFNT_Interface                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This structure holds pointers to the functions used to load and    */\n  /*    free the basic tables that are required in a `sfnt' font file.     */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    Check the various xxx_Func() descriptions for details.             */\n  /*                                                                       */\n  typedef struct  SFNT_Interface_\n  {\n    TT_Loader_GotoTableFunc      goto_table;\n\n    TT_Init_Face_Func            init_face;\n    TT_Load_Face_Func            load_face;\n    TT_Done_Face_Func            done_face;\n    FT_Module_Requester          get_interface;\n\n    TT_Load_Any_Func             load_any;\n\n    /* these functions are called by `load_face' but they can also  */\n    /* be called from external modules, if there is a need to do so */\n    TT_Load_Table_Func           load_head;\n    TT_Load_Metrics_Func         load_hhea;\n    TT_Load_Table_Func           load_cmap;\n    TT_Load_Table_Func           load_maxp;\n    TT_Load_Table_Func           load_os2;\n    TT_Load_Table_Func           load_post;\n\n    TT_Load_Table_Func           load_name;\n    TT_Free_Table_Func           free_name;\n\n    /* this field was called `load_kerning' up to version 2.1.10 */\n    TT_Load_Table_Func           load_kern;\n\n    TT_Load_Table_Func           load_gasp;\n    TT_Load_Table_Func           load_pclt;\n\n    /* see `ttload.h'; this field was called `load_bitmap_header' up to */\n    /* version 2.1.10                                                   */\n    TT_Load_Table_Func           load_bhed;\n\n    TT_Load_SBit_Image_Func      load_sbit_image;\n\n    /* see `ttpost.h' */\n    TT_Get_PS_Name_Func          get_psname;\n    TT_Free_Table_Func           free_psnames;\n\n    /* starting here, the structure differs from version 2.1.7 */\n\n    /* this field was introduced in version 2.1.8, named `get_psname' */\n    TT_Face_GetKerningFunc       get_kerning;\n\n    /* new elements introduced after version 2.1.10 */\n\n    /* load the font directory, i.e., the offset table and */\n    /* the table directory                                 */\n    TT_Load_Table_Func           load_font_dir;\n    TT_Load_Metrics_Func         load_hmtx;\n\n    TT_Load_Table_Func           load_eblc;\n    TT_Free_Table_Func           free_eblc;\n\n    TT_Set_SBit_Strike_Func      set_sbit_strike;\n    TT_Load_Strike_Metrics_Func  load_strike_metrics;\n\n    TT_Get_Metrics_Func          get_metrics;\n\n  } SFNT_Interface;\n\n\n  /* transitional */\n  typedef SFNT_Interface*   SFNT_Service;\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SFNT_INTERFACE(        \\\n          class_,                        \\\n          goto_table_,                   \\\n          init_face_,                    \\\n          load_face_,                    \\\n          done_face_,                    \\\n          get_interface_,                \\\n          load_any_,                     \\\n          load_head_,                    \\\n          load_hhea_,                    \\\n          load_cmap_,                    \\\n          load_maxp_,                    \\\n          load_os2_,                     \\\n          load_post_,                    \\\n          load_name_,                    \\\n          free_name_,                    \\\n          load_kern_,                    \\\n          load_gasp_,                    \\\n          load_pclt_,                    \\\n          load_bhed_,                    \\\n          load_sbit_image_,              \\\n          get_psname_,                   \\\n          free_psnames_,                 \\\n          get_kerning_,                  \\\n          load_font_dir_,                \\\n          load_hmtx_,                    \\\n          load_eblc_,                    \\\n          free_eblc_,                    \\\n          set_sbit_strike_,              \\\n          load_strike_metrics_,          \\\n          get_metrics_ )                 \\\n  static const SFNT_Interface  class_ =  \\\n  {                                      \\\n    goto_table_,                         \\\n    init_face_,                          \\\n    load_face_,                          \\\n    done_face_,                          \\\n    get_interface_,                      \\\n    load_any_,                           \\\n    load_head_,                          \\\n    load_hhea_,                          \\\n    load_cmap_,                          \\\n    load_maxp_,                          \\\n    load_os2_,                           \\\n    load_post_,                          \\\n    load_name_,                          \\\n    free_name_,                          \\\n    load_kern_,                          \\\n    load_gasp_,                          \\\n    load_pclt_,                          \\\n    load_bhed_,                          \\\n    load_sbit_image_,                    \\\n    get_psname_,                         \\\n    free_psnames_,                       \\\n    get_kerning_,                        \\\n    load_font_dir_,                      \\\n    load_hmtx_,                          \\\n    load_eblc_,                          \\\n    free_eblc_,                          \\\n    set_sbit_strike_,                    \\\n    load_strike_metrics_,                \\\n    get_metrics_,                        \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_INTERNAL( a, a_ )  \\\n          clazz->a = a_;\n\n#define FT_DEFINE_SFNT_INTERFACE(                       \\\n          class_,                                       \\\n          goto_table_,                                  \\\n          init_face_,                                   \\\n          load_face_,                                   \\\n          done_face_,                                   \\\n          get_interface_,                               \\\n          load_any_,                                    \\\n          load_head_,                                   \\\n          load_hhea_,                                   \\\n          load_cmap_,                                   \\\n          load_maxp_,                                   \\\n          load_os2_,                                    \\\n          load_post_,                                   \\\n          load_name_,                                   \\\n          free_name_,                                   \\\n          load_kern_,                                   \\\n          load_gasp_,                                   \\\n          load_pclt_,                                   \\\n          load_bhed_,                                   \\\n          load_sbit_image_,                             \\\n          get_psname_,                                  \\\n          free_psnames_,                                \\\n          get_kerning_,                                 \\\n          load_font_dir_,                               \\\n          load_hmtx_,                                   \\\n          load_eblc_,                                   \\\n          free_eblc_,                                   \\\n          set_sbit_strike_,                             \\\n          load_strike_metrics_,                         \\\n          get_metrics_ )                                \\\n  void                                                  \\\n  FT_Init_Class_ ## class_( FT_Library       library,   \\\n                            SFNT_Interface*  clazz )    \\\n  {                                                     \\\n    FT_UNUSED( library );                               \\\n                                                        \\\n    clazz->goto_table          = goto_table_;           \\\n    clazz->init_face           = init_face_;            \\\n    clazz->load_face           = load_face_;            \\\n    clazz->done_face           = done_face_;            \\\n    clazz->get_interface       = get_interface_;        \\\n    clazz->load_any            = load_any_;             \\\n    clazz->load_head           = load_head_;            \\\n    clazz->load_hhea           = load_hhea_;            \\\n    clazz->load_cmap           = load_cmap_;            \\\n    clazz->load_maxp           = load_maxp_;            \\\n    clazz->load_os2            = load_os2_;             \\\n    clazz->load_post           = load_post_;            \\\n    clazz->load_name           = load_name_;            \\\n    clazz->free_name           = free_name_;            \\\n    clazz->load_kern           = load_kern_;            \\\n    clazz->load_gasp           = load_gasp_;            \\\n    clazz->load_pclt           = load_pclt_;            \\\n    clazz->load_bhed           = load_bhed_;            \\\n    clazz->load_sbit_image     = load_sbit_image_;      \\\n    clazz->get_psname          = get_psname_;           \\\n    clazz->free_psnames        = free_psnames_;         \\\n    clazz->get_kerning         = get_kerning_;          \\\n    clazz->load_font_dir       = load_font_dir_;        \\\n    clazz->load_hmtx           = load_hmtx_;            \\\n    clazz->load_eblc           = load_eblc_;            \\\n    clazz->free_eblc           = free_eblc_;            \\\n    clazz->set_sbit_strike     = set_sbit_strike_;      \\\n    clazz->load_strike_metrics = load_strike_metrics_;  \\\n    clazz->get_metrics         = get_metrics_;          \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\nFT_END_HEADER\n\n#endif /* __SFNT_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/t1types.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1types.h                                                              */\n/*                                                                         */\n/*    Basic Type1/Type2 type definitions and interface (specification      */\n/*    only).                                                               */\n/*                                                                         */\n/*  Copyright 1996-2004, 2006, 2008, 2009, 2011, 2013 by                   */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __T1TYPES_H__\n#define __T1TYPES_H__\n\n\n#include \"../../ft2build.h\"\n#include \"../t1tables.h\"\n#include \"pshints.h\"\n#include \"ftserv.h\"\n#include \"services/svpscmap.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***              REQUIRED TYPE1/TYPE2 TABLES DEFINITIONS              ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    T1_EncodingRec                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure modeling a custom encoding.                            */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    num_chars  :: The number of character codes in the encoding.       */\n  /*                  Usually 256.                                         */\n  /*                                                                       */\n  /*    code_first :: The lowest valid character code in the encoding.     */\n  /*                                                                       */\n  /*    code_last  :: The highest valid character code in the encoding     */\n  /*                  + 1. When equal to code_first there are no valid     */\n  /*                  character codes.                                     */\n  /*                                                                       */\n  /*    char_index :: An array of corresponding glyph indices.             */\n  /*                                                                       */\n  /*    char_name  :: An array of corresponding glyph names.               */\n  /*                                                                       */\n  typedef struct  T1_EncodingRecRec_\n  {\n    FT_Int       num_chars;\n    FT_Int       code_first;\n    FT_Int       code_last;\n\n    FT_UShort*   char_index;\n    FT_String**  char_name;\n\n  } T1_EncodingRec, *T1_Encoding;\n\n\n  /* used to hold extra data of PS_FontInfoRec that\n   * cannot be stored in the publicly defined structure.\n   *\n   * Note these can't be blended with multiple-masters.\n   */\n  typedef struct  PS_FontExtraRec_\n  {\n    FT_UShort  fs_type;\n\n  } PS_FontExtraRec;\n\n\n  typedef struct  T1_FontRec_\n  {\n    PS_FontInfoRec   font_info;         /* font info dictionary   */\n    PS_FontExtraRec  font_extra;        /* font info extra fields */\n    PS_PrivateRec    private_dict;      /* private dictionary     */\n    FT_String*       font_name;         /* top-level dictionary   */\n\n    T1_EncodingType  encoding_type;\n    T1_EncodingRec   encoding;\n\n    FT_Byte*         subrs_block;\n    FT_Byte*         charstrings_block;\n    FT_Byte*         glyph_names_block;\n\n    FT_Int           num_subrs;\n    FT_Byte**        subrs;\n    FT_PtrDist*      subrs_len;\n\n    FT_Int           num_glyphs;\n    FT_String**      glyph_names;       /* array of glyph names       */\n    FT_Byte**        charstrings;       /* array of glyph charstrings */\n    FT_PtrDist*      charstrings_len;\n\n    FT_Byte          paint_type;\n    FT_Byte          font_type;\n    FT_Matrix        font_matrix;\n    FT_Vector        font_offset;\n    FT_BBox          font_bbox;\n    FT_Long          font_id;\n\n    FT_Fixed         stroke_width;\n\n  } T1_FontRec, *T1_Font;\n\n\n  typedef struct  CID_SubrsRec_\n  {\n    FT_UInt    num_subrs;\n    FT_Byte**  code;\n\n  } CID_SubrsRec, *CID_Subrs;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***                AFM FONT INFORMATION STRUCTURES                    ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct  AFM_TrackKernRec_\n  {\n    FT_Int    degree;\n    FT_Fixed  min_ptsize;\n    FT_Fixed  min_kern;\n    FT_Fixed  max_ptsize;\n    FT_Fixed  max_kern;\n\n  } AFM_TrackKernRec, *AFM_TrackKern;\n\n  typedef struct  AFM_KernPairRec_\n  {\n    FT_Int  index1;\n    FT_Int  index2;\n    FT_Int  x;\n    FT_Int  y;\n\n  } AFM_KernPairRec, *AFM_KernPair;\n\n  typedef struct  AFM_FontInfoRec_\n  {\n    FT_Bool        IsCIDFont;\n    FT_BBox        FontBBox;\n    FT_Fixed       Ascender;\n    FT_Fixed       Descender;\n    AFM_TrackKern  TrackKerns;   /* free if non-NULL */\n    FT_Int         NumTrackKern;\n    AFM_KernPair   KernPairs;    /* free if non-NULL */\n    FT_Int         NumKernPair;\n\n  } AFM_FontInfoRec, *AFM_FontInfo;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***                ORIGINAL T1_FACE CLASS DEFINITION                  ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  typedef struct T1_FaceRec_*   T1_Face;\n  typedef struct CID_FaceRec_*  CID_Face;\n\n\n  typedef struct  T1_FaceRec_\n  {\n    FT_FaceRec      root;\n    T1_FontRec      type1;\n    const void*     psnames;\n    const void*     psaux;\n    const void*     afm_data;\n    FT_CharMapRec   charmaprecs[2];\n    FT_CharMap      charmaps[2];\n\n    /* support for Multiple Masters fonts */\n    PS_Blend        blend;\n\n    /* undocumented, optional: indices of subroutines that express      */\n    /* the NormalizeDesignVector and the ConvertDesignVector procedure, */\n    /* respectively, as Type 2 charstrings; -1 if keywords not present  */\n    FT_Int           ndv_idx;\n    FT_Int           cdv_idx;\n\n    /* undocumented, optional: has the same meaning as len_buildchar */\n    /* for Type 2 fonts; manipulated by othersubrs 19, 24, and 25    */\n    FT_UInt          len_buildchar;\n    FT_Long*         buildchar;\n\n    /* since version 2.1 - interface to PostScript hinter */\n    const void*     pshinter;\n\n  } T1_FaceRec;\n\n\n  typedef struct  CID_FaceRec_\n  {\n    FT_FaceRec       root;\n    void*            psnames;\n    void*            psaux;\n    CID_FaceInfoRec  cid;\n    PS_FontExtraRec  font_extra;\n#if 0\n    void*            afm_data;\n#endif\n    CID_Subrs        subrs;\n\n    /* since version 2.1 - interface to PostScript hinter */\n    void*            pshinter;\n\n    /* since version 2.1.8, but was originally positioned after `afm_data' */\n    FT_Byte*         binary_data; /* used if hex data has been converted */\n    FT_Stream        cid_stream;\n\n  } CID_FaceRec;\n\n\nFT_END_HEADER\n\n#endif /* __T1TYPES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/tttypes.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  tttypes.h                                                              */\n/*                                                                         */\n/*    Basic SFNT/TrueType type definitions and interface (specification    */\n/*    only).                                                               */\n/*                                                                         */\n/*  Copyright 1996-2002, 2004-2008, 2012-2013 by                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTTYPES_H__\n#define __TTTYPES_H__\n\n\n#include \"../../ft2build.h\"\n#include \"../tttables.h\"\n#include \"ftobjs.h\"\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n#include \"../ftmm.h\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***             REQUIRED TRUETYPE/OPENTYPE TABLES DEFINITIONS         ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TTC_HeaderRec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    TrueType collection header.  This table contains the offsets of    */\n  /*    the font headers of each distinct TrueType face in the file.       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    tag     :: Must be `ttc ' to indicate a TrueType collection.       */\n  /*                                                                       */\n  /*    version :: The version number.                                     */\n  /*                                                                       */\n  /*    count   :: The number of faces in the collection.  The             */\n  /*               specification says this should be an unsigned long, but */\n  /*               we use a signed long since we need the value -1 for     */\n  /*               specific purposes.                                      */\n  /*                                                                       */\n  /*    offsets :: The offsets of the font headers, one per face.          */\n  /*                                                                       */\n  typedef struct  TTC_HeaderRec_\n  {\n    FT_ULong   tag;\n    FT_Fixed   version;\n    FT_Long    count;\n    FT_ULong*  offsets;\n\n  } TTC_HeaderRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    SFNT_HeaderRec                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    SFNT file format header.                                           */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    format_tag     :: The font format tag.                             */\n  /*                                                                       */\n  /*    num_tables     :: The number of tables in file.                    */\n  /*                                                                       */\n  /*    search_range   :: Must be `16 * (max power of 2 <= num_tables)'.   */\n  /*                                                                       */\n  /*    entry_selector :: Must be log2 of `search_range / 16'.             */\n  /*                                                                       */\n  /*    range_shift    :: Must be `num_tables * 16 - search_range'.        */\n  /*                                                                       */\n  typedef struct  SFNT_HeaderRec_\n  {\n    FT_ULong   format_tag;\n    FT_UShort  num_tables;\n    FT_UShort  search_range;\n    FT_UShort  entry_selector;\n    FT_UShort  range_shift;\n\n    FT_ULong   offset;  /* not in file */\n\n  } SFNT_HeaderRec, *SFNT_Header;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_TableRec                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This structure describes a given table of a TrueType font.         */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    Tag      :: A four-bytes tag describing the table.                 */\n  /*                                                                       */\n  /*    CheckSum :: The table checksum.  This value can be ignored.        */\n  /*                                                                       */\n  /*    Offset   :: The offset of the table from the start of the TrueType */\n  /*                font in its resource.                                  */\n  /*                                                                       */\n  /*    Length   :: The table length (in bytes).                           */\n  /*                                                                       */\n  typedef struct  TT_TableRec_\n  {\n    FT_ULong  Tag;        /*        table type */\n    FT_ULong  CheckSum;   /*    table checksum */\n    FT_ULong  Offset;     /* table file offset */\n    FT_ULong  Length;     /*      table length */\n\n  } TT_TableRec, *TT_Table;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_LongMetricsRec                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure modeling the long metrics of the `hmtx' and `vmtx'     */\n  /*    TrueType tables.  The values are expressed in font units.          */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    advance :: The advance width or height for the glyph.              */\n  /*                                                                       */\n  /*    bearing :: The left-side or top-side bearing for the glyph.        */\n  /*                                                                       */\n  typedef struct  TT_LongMetricsRec_\n  {\n    FT_UShort  advance;\n    FT_Short   bearing;\n\n  } TT_LongMetricsRec, *TT_LongMetrics;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    TT_ShortMetrics                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple type to model the short metrics of the `hmtx' and `vmtx'  */\n  /*    tables.                                                            */\n  /*                                                                       */\n  typedef FT_Short  TT_ShortMetrics;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_NameEntryRec                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure modeling TrueType name records.  Name records are used */\n  /*    to store important strings like family name, style name,           */\n  /*    copyright, etc. in _localized_ versions (i.e., language, encoding, */\n  /*    etc).                                                              */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    platformID   :: The ID of the name's encoding platform.            */\n  /*                                                                       */\n  /*    encodingID   :: The platform-specific ID for the name's encoding.  */\n  /*                                                                       */\n  /*    languageID   :: The platform-specific ID for the name's language.  */\n  /*                                                                       */\n  /*    nameID       :: The ID specifying what kind of name this is.       */\n  /*                                                                       */\n  /*    stringLength :: The length of the string in bytes.                 */\n  /*                                                                       */\n  /*    stringOffset :: The offset to the string in the `name' table.      */\n  /*                                                                       */\n  /*    string       :: A pointer to the string's bytes.  Note that these  */\n  /*                    are usually UTF-16 encoded characters.             */\n  /*                                                                       */\n  typedef struct  TT_NameEntryRec_\n  {\n    FT_UShort  platformID;\n    FT_UShort  encodingID;\n    FT_UShort  languageID;\n    FT_UShort  nameID;\n    FT_UShort  stringLength;\n    FT_ULong   stringOffset;\n\n    /* this last field is not defined in the spec */\n    /* but used by the FreeType engine            */\n\n    FT_Byte*   string;\n\n  } TT_NameEntryRec, *TT_NameEntry;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_NameTableRec                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure modeling the TrueType name table.                      */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    format         :: The format of the name table.                    */\n  /*                                                                       */\n  /*    numNameRecords :: The number of names in table.                    */\n  /*                                                                       */\n  /*    storageOffset  :: The offset of the name table in the `name'       */\n  /*                      TrueType table.                                  */\n  /*                                                                       */\n  /*    names          :: An array of name records.                        */\n  /*                                                                       */\n  /*    stream         :: the file's input stream.                         */\n  /*                                                                       */\n  typedef struct  TT_NameTableRec_\n  {\n    FT_UShort         format;\n    FT_UInt           numNameRecords;\n    FT_UInt           storageOffset;\n    TT_NameEntryRec*  names;\n    FT_Stream         stream;\n\n  } TT_NameTableRec, *TT_NameTable;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***             OPTIONAL TRUETYPE/OPENTYPE TABLES DEFINITIONS         ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_GaspRangeRec                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A tiny structure used to model a gasp range according to the       */\n  /*    TrueType specification.                                            */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    maxPPEM  :: The maximum ppem value to which `gaspFlag' applies.    */\n  /*                                                                       */\n  /*    gaspFlag :: A flag describing the grid-fitting and anti-aliasing   */\n  /*                modes to be used.                                      */\n  /*                                                                       */\n  typedef struct  TT_GaspRangeRec_\n  {\n    FT_UShort  maxPPEM;\n    FT_UShort  gaspFlag;\n\n  } TT_GaspRangeRec, *TT_GaspRange;\n\n\n#define TT_GASP_GRIDFIT  0x01\n#define TT_GASP_DOGRAY   0x02\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_GaspRec                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure modeling the TrueType `gasp' table used to specify     */\n  /*    grid-fitting and anti-aliasing behaviour.                          */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    version    :: The version number.                                  */\n  /*                                                                       */\n  /*    numRanges  :: The number of gasp ranges in table.                  */\n  /*                                                                       */\n  /*    gaspRanges :: An array of gasp ranges.                             */\n  /*                                                                       */\n  typedef struct  TT_Gasp_\n  {\n    FT_UShort     version;\n    FT_UShort     numRanges;\n    TT_GaspRange  gaspRanges;\n\n  } TT_GaspRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***                    EMBEDDED BITMAPS SUPPORT                       ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_SBit_MetricsRec                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to hold the big metrics of a given glyph bitmap   */\n  /*    in a TrueType or OpenType font.  These are usually found in the    */\n  /*    `EBDT' (Microsoft) or `bloc' (Apple) table.                        */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    height       :: The glyph height in pixels.                        */\n  /*                                                                       */\n  /*    width        :: The glyph width in pixels.                         */\n  /*                                                                       */\n  /*    horiBearingX :: The horizontal left bearing.                       */\n  /*                                                                       */\n  /*    horiBearingY :: The horizontal top bearing.                        */\n  /*                                                                       */\n  /*    horiAdvance  :: The horizontal advance.                            */\n  /*                                                                       */\n  /*    vertBearingX :: The vertical left bearing.                         */\n  /*                                                                       */\n  /*    vertBearingY :: The vertical top bearing.                          */\n  /*                                                                       */\n  /*    vertAdvance  :: The vertical advance.                              */\n  /*                                                                       */\n  typedef struct  TT_SBit_MetricsRec_\n  {\n    FT_Byte  height;\n    FT_Byte  width;\n\n    FT_Char  horiBearingX;\n    FT_Char  horiBearingY;\n    FT_Byte  horiAdvance;\n\n    FT_Char  vertBearingX;\n    FT_Char  vertBearingY;\n    FT_Byte  vertAdvance;\n\n  } TT_SBit_MetricsRec, *TT_SBit_Metrics;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_SBit_SmallMetricsRec                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to hold the small metrics of a given glyph bitmap */\n  /*    in a TrueType or OpenType font.  These are usually found in the    */\n  /*    `EBDT' (Microsoft) or the `bdat' (Apple) table.                    */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    height   :: The glyph height in pixels.                            */\n  /*                                                                       */\n  /*    width    :: The glyph width in pixels.                             */\n  /*                                                                       */\n  /*    bearingX :: The left-side bearing.                                 */\n  /*                                                                       */\n  /*    bearingY :: The top-side bearing.                                  */\n  /*                                                                       */\n  /*    advance  :: The advance width or height.                           */\n  /*                                                                       */\n  typedef struct  TT_SBit_Small_Metrics_\n  {\n    FT_Byte  height;\n    FT_Byte  width;\n\n    FT_Char  bearingX;\n    FT_Char  bearingY;\n    FT_Byte  advance;\n\n  } TT_SBit_SmallMetricsRec, *TT_SBit_SmallMetrics;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_SBit_LineMetricsRec                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to describe the text line metrics of a given      */\n  /*    bitmap strike, for either a horizontal or vertical layout.         */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    ascender                :: The ascender in pixels.                 */\n  /*                                                                       */\n  /*    descender               :: The descender in pixels.                */\n  /*                                                                       */\n  /*    max_width               :: The maximum glyph width in pixels.      */\n  /*                                                                       */\n  /*    caret_slope_enumerator  :: Rise of the caret slope, typically set  */\n  /*                               to 1 for non-italic fonts.              */\n  /*                                                                       */\n  /*    caret_slope_denominator :: Rise of the caret slope, typically set  */\n  /*                               to 0 for non-italic fonts.              */\n  /*                                                                       */\n  /*    caret_offset            :: Offset in pixels to move the caret for  */\n  /*                               proper positioning.                     */\n  /*                                                                       */\n  /*    min_origin_SB           :: Minimum of horiBearingX (resp.          */\n  /*                               vertBearingY).                          */\n  /*    min_advance_SB          :: Minimum of                              */\n  /*                                                                       */\n  /*                                 horizontal advance -                  */\n  /*                                   ( horiBearingX + width )            */\n  /*                                                                       */\n  /*                               resp.                                   */\n  /*                                                                       */\n  /*                                 vertical advance -                    */\n  /*                                   ( vertBearingY + height )           */\n  /*                                                                       */\n  /*    max_before_BL           :: Maximum of horiBearingY (resp.          */\n  /*                               vertBearingY).                          */\n  /*                                                                       */\n  /*    min_after_BL            :: Minimum of                              */\n  /*                                                                       */\n  /*                                 horiBearingY - height                 */\n  /*                                                                       */\n  /*                               resp.                                   */\n  /*                                                                       */\n  /*                                 vertBearingX - width                  */\n  /*                                                                       */\n  /*    pads                    :: Unused (to make the size of the record  */\n  /*                               a multiple of 32 bits.                  */\n  /*                                                                       */\n  typedef struct  TT_SBit_LineMetricsRec_\n  {\n    FT_Char  ascender;\n    FT_Char  descender;\n    FT_Byte  max_width;\n    FT_Char  caret_slope_numerator;\n    FT_Char  caret_slope_denominator;\n    FT_Char  caret_offset;\n    FT_Char  min_origin_SB;\n    FT_Char  min_advance_SB;\n    FT_Char  max_before_BL;\n    FT_Char  min_after_BL;\n    FT_Char  pads[2];\n\n  } TT_SBit_LineMetricsRec, *TT_SBit_LineMetrics;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_SBit_RangeRec                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A TrueType/OpenType subIndexTable as defined in the `EBLC'         */\n  /*    (Microsoft) or `bloc' (Apple) tables.                              */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    first_glyph   :: The first glyph index in the range.               */\n  /*                                                                       */\n  /*    last_glyph    :: The last glyph index in the range.                */\n  /*                                                                       */\n  /*    index_format  :: The format of index table.  Valid values are 1    */\n  /*                     to 5.                                             */\n  /*                                                                       */\n  /*    image_format  :: The format of `EBDT' image data.                  */\n  /*                                                                       */\n  /*    image_offset  :: The offset to image data in `EBDT'.               */\n  /*                                                                       */\n  /*    image_size    :: For index formats 2 and 5.  This is the size in   */\n  /*                     bytes of each glyph bitmap.                       */\n  /*                                                                       */\n  /*    big_metrics   :: For index formats 2 and 5.  This is the big       */\n  /*                     metrics for each glyph bitmap.                    */\n  /*                                                                       */\n  /*    num_glyphs    :: For index formats 4 and 5.  This is the number of */\n  /*                     glyphs in the code array.                         */\n  /*                                                                       */\n  /*    glyph_offsets :: For index formats 1 and 3.                        */\n  /*                                                                       */\n  /*    glyph_codes   :: For index formats 4 and 5.                        */\n  /*                                                                       */\n  /*    table_offset  :: The offset of the index table in the `EBLC'       */\n  /*                     table.  Only used during strike loading.          */\n  /*                                                                       */\n  typedef struct  TT_SBit_RangeRec_\n  {\n    FT_UShort           first_glyph;\n    FT_UShort           last_glyph;\n\n    FT_UShort           index_format;\n    FT_UShort           image_format;\n    FT_ULong            image_offset;\n\n    FT_ULong            image_size;\n    TT_SBit_MetricsRec  metrics;\n    FT_ULong            num_glyphs;\n\n    FT_ULong*           glyph_offsets;\n    FT_UShort*          glyph_codes;\n\n    FT_ULong            table_offset;\n\n  } TT_SBit_RangeRec, *TT_SBit_Range;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_SBit_StrikeRec                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used describe a given bitmap strike in the `EBLC'      */\n  /*    (Microsoft) or `bloc' (Apple) tables.                              */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*   num_index_ranges :: The number of index ranges.                     */\n  /*                                                                       */\n  /*   index_ranges     :: An array of glyph index ranges.                 */\n  /*                                                                       */\n  /*   color_ref        :: Unused.  `color_ref' is put in for future       */\n  /*                       enhancements, but these fields are already      */\n  /*                       in use by other platforms (e.g. Newton).        */\n  /*                       For details, please see                         */\n  /*                                                                       */\n  /*                         http://fonts.apple.com/                       */\n  /*                                TTRefMan/RM06/Chap6bloc.html           */\n  /*                                                                       */\n  /*   hori             :: The line metrics for horizontal layouts.        */\n  /*                                                                       */\n  /*   vert             :: The line metrics for vertical layouts.          */\n  /*                                                                       */\n  /*   start_glyph      :: The lowest glyph index for this strike.         */\n  /*                                                                       */\n  /*   end_glyph        :: The highest glyph index for this strike.        */\n  /*                                                                       */\n  /*   x_ppem           :: The number of horizontal pixels per EM.         */\n  /*                                                                       */\n  /*   y_ppem           :: The number of vertical pixels per EM.           */\n  /*                                                                       */\n  /*   bit_depth        :: The bit depth.  Valid values are 1, 2, 4,       */\n  /*                       and 8.                                          */\n  /*                                                                       */\n  /*   flags            :: Is this a vertical or horizontal strike?  For   */\n  /*                       details, please see                             */\n  /*                                                                       */\n  /*                         http://fonts.apple.com/                       */\n  /*                                TTRefMan/RM06/Chap6bloc.html           */\n  /*                                                                       */\n  typedef struct  TT_SBit_StrikeRec_\n  {\n    FT_Int                  num_ranges;\n    TT_SBit_Range           sbit_ranges;\n    FT_ULong                ranges_offset;\n\n    FT_ULong                color_ref;\n\n    TT_SBit_LineMetricsRec  hori;\n    TT_SBit_LineMetricsRec  vert;\n\n    FT_UShort               start_glyph;\n    FT_UShort               end_glyph;\n\n    FT_Byte                 x_ppem;\n    FT_Byte                 y_ppem;\n\n    FT_Byte                 bit_depth;\n    FT_Char                 flags;\n\n  } TT_SBit_StrikeRec, *TT_SBit_Strike;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_SBit_ComponentRec                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple structure to describe a compound sbit element.            */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    glyph_code :: The element's glyph index.                           */\n  /*                                                                       */\n  /*    x_offset   :: The element's left bearing.                          */\n  /*                                                                       */\n  /*    y_offset   :: The element's top bearing.                           */\n  /*                                                                       */\n  typedef struct  TT_SBit_ComponentRec_\n  {\n    FT_UShort  glyph_code;\n    FT_Char    x_offset;\n    FT_Char    y_offset;\n\n  } TT_SBit_ComponentRec, *TT_SBit_Component;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_SBit_ScaleRec                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used describe a given bitmap scaling table, as defined */\n  /*    in the `EBSC' table.                                               */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    hori              :: The horizontal line metrics.                  */\n  /*                                                                       */\n  /*    vert              :: The vertical line metrics.                    */\n  /*                                                                       */\n  /*    x_ppem            :: The number of horizontal pixels per EM.       */\n  /*                                                                       */\n  /*    y_ppem            :: The number of vertical pixels per EM.         */\n  /*                                                                       */\n  /*    x_ppem_substitute :: Substitution x_ppem value.                    */\n  /*                                                                       */\n  /*    y_ppem_substitute :: Substitution y_ppem value.                    */\n  /*                                                                       */\n  typedef struct  TT_SBit_ScaleRec_\n  {\n    TT_SBit_LineMetricsRec  hori;\n    TT_SBit_LineMetricsRec  vert;\n\n    FT_Byte                 x_ppem;\n    FT_Byte                 y_ppem;\n\n    FT_Byte                 x_ppem_substitute;\n    FT_Byte                 y_ppem_substitute;\n\n  } TT_SBit_ScaleRec, *TT_SBit_Scale;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***                  POSTSCRIPT GLYPH NAMES SUPPORT                   ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_Post_20Rec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Postscript names sub-table, format 2.0.  Stores the PS name of     */\n  /*    each glyph in the font face.                                       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    num_glyphs    :: The number of named glyphs in the table.          */\n  /*                                                                       */\n  /*    num_names     :: The number of PS names stored in the table.       */\n  /*                                                                       */\n  /*    glyph_indices :: The indices of the glyphs in the names arrays.    */\n  /*                                                                       */\n  /*    glyph_names   :: The PS names not in Mac Encoding.                 */\n  /*                                                                       */\n  typedef struct  TT_Post_20Rec_\n  {\n    FT_UShort   num_glyphs;\n    FT_UShort   num_names;\n    FT_UShort*  glyph_indices;\n    FT_Char**   glyph_names;\n\n  } TT_Post_20Rec, *TT_Post_20;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_Post_25Rec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Postscript names sub-table, format 2.5.  Stores the PS name of     */\n  /*    each glyph in the font face.                                       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    num_glyphs :: The number of glyphs in the table.                   */\n  /*                                                                       */\n  /*    offsets    :: An array of signed offsets in a normal Mac           */\n  /*                  Postscript name encoding.                            */\n  /*                                                                       */\n  typedef struct  TT_Post_25_\n  {\n    FT_UShort  num_glyphs;\n    FT_Char*   offsets;\n\n  } TT_Post_25Rec, *TT_Post_25;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_Post_NamesRec                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Postscript names table, either format 2.0 or 2.5.                  */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    loaded    :: A flag to indicate whether the PS names are loaded.   */\n  /*                                                                       */\n  /*    format_20 :: The sub-table used for format 2.0.                    */\n  /*                                                                       */\n  /*    format_25 :: The sub-table used for format 2.5.                    */\n  /*                                                                       */\n  typedef struct  TT_Post_NamesRec_\n  {\n    FT_Bool  loaded;\n\n    union\n    {\n      TT_Post_20Rec  format_20;\n      TT_Post_25Rec  format_25;\n\n    } names;\n\n  } TT_Post_NamesRec, *TT_Post_Names;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***                    GX VARIATION TABLE SUPPORT                     ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n  typedef struct GX_BlendRec_  *GX_Blend;\n#endif\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***              EMBEDDED BDF PROPERTIES TABLE SUPPORT                ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*\n   * These types are used to support a `BDF ' table that isn't part of the\n   * official TrueType specification.  It is mainly used in SFNT-based\n   * bitmap fonts that were generated from a set of BDF fonts.\n   *\n   * The format of the table is as follows.\n   *\n   *   USHORT   version      `BDF ' table version number, should be 0x0001.\n   *   USHORT   strikeCount  Number of strikes (bitmap sizes) in this table.\n   *   ULONG    stringTable  Offset (from start of BDF table) to string\n   *                         table.\n   *\n   * This is followed by an array of `strikeCount' descriptors, having the\n   * following format.\n   *\n   *   USHORT   ppem         Vertical pixels per EM for this strike.\n   *   USHORT   numItems     Number of items for this strike (properties and\n   *                         atoms).  Maximum is 255.\n   *\n   * This array in turn is followed by `strikeCount' value sets.  Each\n   * `value set' is an array of `numItems' items with the following format.\n   *\n   *   ULONG    item_name    Offset in string table to item name.\n   *   USHORT   item_type    The item type.  Possible values are\n   *                            0 => string (e.g., COMMENT)\n   *                            1 => atom   (e.g., FONT or even SIZE)\n   *                            2 => int32\n   *                            3 => uint32\n   *                         0x10 => A flag to indicate a properties.  This\n   *                                 is ORed with the above values.\n   *   ULONG    item_value   For strings  => Offset into string table without\n   *                                         the corresponding double quotes.\n   *                         For atoms    => Offset into string table.\n   *                         For integers => Direct value.\n   *\n   * All strings in the string table consist of bytes and are\n   * zero-terminated.\n   *\n   */\n\n#ifdef TT_CONFIG_OPTION_BDF\n\n  typedef struct  TT_BDFRec_\n  {\n    FT_Byte*   table;\n    FT_Byte*   table_end;\n    FT_Byte*   strings;\n    FT_ULong   strings_size;\n    FT_UInt    num_strikes;\n    FT_Bool    loaded;\n\n  } TT_BDFRec, *TT_BDF;\n\n#endif /* TT_CONFIG_OPTION_BDF */\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***                  ORIGINAL TT_FACE CLASS DEFINITION                ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This structure/class is defined here because it is common to the      */\n  /* following formats: TTF, OpenType-TT, and OpenType-CFF.                */\n  /*                                                                       */\n  /* Note, however, that the classes TT_Size and TT_GlyphSlot are not      */\n  /* shared between font drivers, and are thus defined in `ttobjs.h'.      */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    TT_Face                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a TrueType face/font object.  A TT_Face encapsulates   */\n  /*    the resolution and scaling independent parts of a TrueType font    */\n  /*    resource.                                                          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The TT_Face structure is also used as a `parent class' for the     */\n  /*    OpenType-CFF class (T2_Face).                                      */\n  /*                                                                       */\n  typedef struct TT_FaceRec_*  TT_Face;\n\n\n  /* a function type used for the truetype bytecode interpreter hooks */\n  typedef FT_Error\n  (*TT_Interpreter)( void*  exec_context );\n\n  /* forward declaration */\n  typedef struct TT_LoaderRec_*  TT_Loader;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Loader_GotoTableFunc                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Seeks a stream to the start of a given TrueType table.             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /*    tag    :: A 4-byte tag used to name the table.                     */\n  /*                                                                       */\n  /*    stream :: The input stream.                                        */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    length :: The length of the table in bytes.  Set to 0 if not       */\n  /*              needed.                                                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The stream cursor must be at the font file's origin.               */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Loader_GotoTableFunc)( TT_Face    face,\n                              FT_ULong   tag,\n                              FT_Stream  stream,\n                              FT_ULong*  length );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Loader_StartGlyphFunc                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Seeks a stream to the start of a given glyph element, and opens a  */\n  /*    frame for it.                                                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    loader      :: The current TrueType glyph loader object.           */\n  /*                                                                       */\n  /*    glyph index :: The index of the glyph to access.                   */\n  /*                                                                       */\n  /*    offset      :: The offset of the glyph according to the            */\n  /*                   `locations' table.                                  */\n  /*                                                                       */\n  /*    byte_count  :: The size of the frame in bytes.                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function is normally equivalent to FT_STREAM_SEEK(offset)     */\n  /*    followed by FT_FRAME_ENTER(byte_count) with the loader's stream,   */\n  /*    but alternative formats (e.g. compressed ones) might use something */\n  /*    different.                                                         */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Loader_StartGlyphFunc)( TT_Loader  loader,\n                               FT_UInt    glyph_index,\n                               FT_ULong   offset,\n                               FT_UInt    byte_count );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Loader_ReadGlyphFunc                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Reads one glyph element (its header, a simple glyph, or a          */\n  /*    composite) from the loader's current stream frame.                 */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    loader :: The current TrueType glyph loader object.                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Loader_ReadGlyphFunc)( TT_Loader  loader );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Loader_EndGlyphFunc                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Closes the current loader stream frame for the glyph.              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    loader :: The current TrueType glyph loader object.                */\n  /*                                                                       */\n  typedef void\n  (*TT_Loader_EndGlyphFunc)( TT_Loader  loader );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                         TrueType Face Type                            */\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_Face                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The TrueType face class.  These objects model the resolution and   */\n  /*    point-size independent data found in a TrueType font file.         */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    root                 :: The base FT_Face structure, managed by the */\n  /*                            base layer.                                */\n  /*                                                                       */\n  /*    ttc_header           :: The TrueType collection header, used when  */\n  /*                            the file is a `ttc' rather than a `ttf'.   */\n  /*                            For ordinary font files, the field         */\n  /*                            `ttc_header.count' is set to 0.            */\n  /*                                                                       */\n  /*    format_tag           :: The font format tag.                       */\n  /*                                                                       */\n  /*    num_tables           :: The number of TrueType tables in this font */\n  /*                            file.                                      */\n  /*                                                                       */\n  /*    dir_tables           :: The directory of TrueType tables for this  */\n  /*                            font file.                                 */\n  /*                                                                       */\n  /*    header               :: The font's font header (`head' table).     */\n  /*                            Read on font opening.                      */\n  /*                                                                       */\n  /*    horizontal           :: The font's horizontal header (`hhea'       */\n  /*                            table).  This field also contains the      */\n  /*                            associated horizontal metrics table        */\n  /*                            (`hmtx').                                  */\n  /*                                                                       */\n  /*    max_profile          :: The font's maximum profile table.  Read on */\n  /*                            font opening.  Note that some maximum      */\n  /*                            values cannot be taken directly from this  */\n  /*                            table.  We thus define additional fields   */\n  /*                            below to hold the computed maxima.         */\n  /*                                                                       */\n  /*    vertical_info        :: A boolean which is set when the font file  */\n  /*                            contains vertical metrics.  If not, the    */\n  /*                            value of the `vertical' field is           */\n  /*                            undefined.                                 */\n  /*                                                                       */\n  /*    vertical             :: The font's vertical header (`vhea' table). */\n  /*                            This field also contains the associated    */\n  /*                            vertical metrics table (`vmtx'), if found. */\n  /*                            IMPORTANT: The contents of this field is   */\n  /*                            undefined if the `verticalInfo' field is   */\n  /*                            unset.                                     */\n  /*                                                                       */\n  /*    num_names            :: The number of name records within this     */\n  /*                            TrueType font.                             */\n  /*                                                                       */\n  /*    name_table           :: The table of name records (`name').        */\n  /*                                                                       */\n  /*    os2                  :: The font's OS/2 table (`OS/2').            */\n  /*                                                                       */\n  /*    postscript           :: The font's PostScript table (`post'        */\n  /*                            table).  The PostScript glyph names are    */\n  /*                            not loaded by the driver on face opening.  */\n  /*                            See the `ttpost' module for more details.  */\n  /*                                                                       */\n  /*    cmap_table           :: Address of the face's `cmap' SFNT table    */\n  /*                            in memory (it's an extracted frame).       */\n  /*                                                                       */\n  /*    cmap_size            :: The size in bytes of the `cmap_table'      */\n  /*                            described above.                           */\n  /*                                                                       */\n  /*    goto_table           :: A function called by each TrueType table   */\n  /*                            loader to position a stream's cursor to    */\n  /*                            the start of a given table according to    */\n  /*                            its tag.  It defaults to TT_Goto_Face but  */\n  /*                            can be different for strange formats (e.g. */\n  /*                            Type 42).                                  */\n  /*                                                                       */\n  /*    access_glyph_frame   :: A function used to access the frame of a   */\n  /*                            given glyph within the face's font file.   */\n  /*                                                                       */\n  /*    forget_glyph_frame   :: A function used to forget the frame of a   */\n  /*                            given glyph when all data has been loaded. */\n  /*                                                                       */\n  /*    read_glyph_header    :: A function used to read a glyph header.    */\n  /*                            It must be called between an `access' and  */\n  /*                            `forget'.                                  */\n  /*                                                                       */\n  /*    read_simple_glyph    :: A function used to read a simple glyph.    */\n  /*                            It must be called after the header was     */\n  /*                            read, and before the `forget'.             */\n  /*                                                                       */\n  /*    read_composite_glyph :: A function used to read a composite glyph. */\n  /*                            It must be called after the header was     */\n  /*                            read, and before the `forget'.             */\n  /*                                                                       */\n  /*    sfnt                 :: A pointer to the SFNT service.             */\n  /*                                                                       */\n  /*    psnames              :: A pointer to the PostScript names service. */\n  /*                                                                       */\n  /*    hdmx                 :: The face's horizontal device metrics       */\n  /*                            (`hdmx' table).  This table is optional in */\n  /*                            TrueType/OpenType fonts.                   */\n  /*                                                                       */\n  /*    gasp                 :: The grid-fitting and scaling properties    */\n  /*                            table (`gasp').  This table is optional in */\n  /*                            TrueType/OpenType fonts.                   */\n  /*                                                                       */\n  /*    pclt                 :: The `pclt' SFNT table.                     */\n  /*                                                                       */\n  /*    num_sbit_strikes     :: The number of sbit strikes, i.e., bitmap   */\n  /*                            sizes, embedded in this font.              */\n  /*                                                                       */\n  /*    sbit_strikes         :: An array of sbit strikes embedded in this  */\n  /*                            font.  This table is optional in a         */\n  /*                            TrueType/OpenType font.                    */\n  /*                                                                       */\n  /*    num_sbit_scales      :: The number of sbit scales for this font.   */\n  /*                                                                       */\n  /*    sbit_scales          :: Array of sbit scales embedded in this      */\n  /*                            font.  This table is optional in a         */\n  /*                            TrueType/OpenType font.                    */\n  /*                                                                       */\n  /*    postscript_names     :: A table used to store the Postscript names */\n  /*                            of  the glyphs for this font.  See the     */\n  /*                            file  `ttconfig.h' for comments on the     */\n  /*                            TT_CONFIG_OPTION_POSTSCRIPT_NAMES option.  */\n  /*                                                                       */\n  /*    num_locations        :: The number of glyph locations in this      */\n  /*                            TrueType file.  This should be             */\n  /*                            identical to the number of glyphs.         */\n  /*                            Ignored for Type 2 fonts.                  */\n  /*                                                                       */\n  /*    glyph_locations      :: An array of longs.  These are offsets to   */\n  /*                            glyph data within the `glyf' table.        */\n  /*                            Ignored for Type 2 font faces.             */\n  /*                                                                       */\n  /*    glyf_len             :: The length of the `glyf' table.  Needed    */\n  /*                            for malformed `loca' tables.               */\n  /*                                                                       */\n  /*    font_program_size    :: Size in bytecodes of the face's font       */\n  /*                            program.  0 if none defined.  Ignored for  */\n  /*                            Type 2 fonts.                              */\n  /*                                                                       */\n  /*    font_program         :: The face's font program (bytecode stream)  */\n  /*                            executed at load time, also used during    */\n  /*                            glyph rendering.  Comes from the `fpgm'    */\n  /*                            table.  Ignored for Type 2 font fonts.     */\n  /*                                                                       */\n  /*    cvt_program_size     :: The size in bytecodes of the face's cvt    */\n  /*                            program.  Ignored for Type 2 fonts.        */\n  /*                                                                       */\n  /*    cvt_program          :: The face's cvt program (bytecode stream)   */\n  /*                            executed each time an instance/size is     */\n  /*                            changed/reset.  Comes from the `prep'      */\n  /*                            table.  Ignored for Type 2 fonts.          */\n  /*                                                                       */\n  /*    cvt_size             :: Size of the control value table (in        */\n  /*                            entries).   Ignored for Type 2 fonts.      */\n  /*                                                                       */\n  /*    cvt                  :: The face's original control value table.   */\n  /*                            Coordinates are expressed in unscaled font */\n  /*                            units.  Comes from the `cvt ' table.       */\n  /*                            Ignored for Type 2 fonts.                  */\n  /*                                                                       */\n  /*    num_kern_pairs       :: The number of kerning pairs present in the */\n  /*                            font file.  The engine only loads the      */\n  /*                            first horizontal format 0 kern table it    */\n  /*                            finds in the font file.  Ignored for       */\n  /*                            Type 2 fonts.                              */\n  /*                                                                       */\n  /*    kern_table_index     :: The index of the kerning table in the font */\n  /*                            kerning directory.  Ignored for Type 2     */\n  /*                            fonts.                                     */\n  /*                                                                       */\n  /*    interpreter          :: A pointer to the TrueType bytecode         */\n  /*                            interpreters field is also used to hook    */\n  /*                            the debugger in `ttdebug'.                 */\n  /*                                                                       */\n  /*    unpatented_hinting   :: If true, use only unpatented methods in    */\n  /*                            the bytecode interpreter.                  */\n  /*                                                                       */\n  /*    doblend              :: A boolean which is set if the font should  */\n  /*                            be blended (this is for GX var).           */\n  /*                                                                       */\n  /*    blend                :: Contains the data needed to control GX     */\n  /*                            variation tables (rather like Multiple     */\n  /*                            Master data).                              */\n  /*                                                                       */\n  /*    extra                :: Reserved for third-party font drivers.     */\n  /*                                                                       */\n  /*    postscript_name      :: The PS name of the font.  Used by the      */\n  /*                            postscript name service.                   */\n  /*                                                                       */\n  typedef struct  TT_FaceRec_\n  {\n    FT_FaceRec            root;\n\n    TTC_HeaderRec         ttc_header;\n\n    FT_ULong              format_tag;\n    FT_UShort             num_tables;\n    TT_Table              dir_tables;\n\n    TT_Header             header;       /* TrueType header table          */\n    TT_HoriHeader         horizontal;   /* TrueType horizontal header     */\n\n    TT_MaxProfile         max_profile;\n\n    FT_Bool               vertical_info;\n    TT_VertHeader         vertical;     /* TT Vertical header, if present */\n\n    FT_UShort             num_names;    /* number of name records  */\n    TT_NameTableRec       name_table;   /* name table              */\n\n    TT_OS2                os2;          /* TrueType OS/2 table            */\n    TT_Postscript         postscript;   /* TrueType Postscript table      */\n\n    FT_Byte*              cmap_table;   /* extracted `cmap' table */\n    FT_ULong              cmap_size;\n\n    TT_Loader_GotoTableFunc   goto_table;\n\n    TT_Loader_StartGlyphFunc  access_glyph_frame;\n    TT_Loader_EndGlyphFunc    forget_glyph_frame;\n    TT_Loader_ReadGlyphFunc   read_glyph_header;\n    TT_Loader_ReadGlyphFunc   read_simple_glyph;\n    TT_Loader_ReadGlyphFunc   read_composite_glyph;\n\n    /* a typeless pointer to the SFNT_Interface table used to load */\n    /* the basic TrueType tables in the face object                */\n    void*                 sfnt;\n\n    /* a typeless pointer to the FT_Service_PsCMapsRec table used to */\n    /* handle glyph names <-> unicode & Mac values                   */\n    void*                 psnames;\n\n\n    /***********************************************************************/\n    /*                                                                     */\n    /* Optional TrueType/OpenType tables                                   */\n    /*                                                                     */\n    /***********************************************************************/\n\n    /* grid-fitting and scaling table */\n    TT_GaspRec            gasp;                 /* the `gasp' table */\n\n    /* PCL 5 table */\n    TT_PCLT               pclt;\n\n    /* embedded bitmaps support */\n    FT_ULong              num_sbit_scales;\n    TT_SBit_Scale         sbit_scales;\n\n    /* postscript names table */\n    TT_Post_NamesRec      postscript_names;\n\n\n    /***********************************************************************/\n    /*                                                                     */\n    /* TrueType-specific fields (ignored by the OTF-Type2 driver)          */\n    /*                                                                     */\n    /***********************************************************************/\n\n    /* the font program, if any */\n    FT_ULong              font_program_size;\n    FT_Byte*              font_program;\n\n    /* the cvt program, if any */\n    FT_ULong              cvt_program_size;\n    FT_Byte*              cvt_program;\n\n    /* the original, unscaled, control value table */\n    FT_ULong              cvt_size;\n    FT_Short*             cvt;\n\n    /* A pointer to the bytecode interpreter to use.  This is also */\n    /* used to hook the debugger for the `ttdebug' utility.        */\n    TT_Interpreter        interpreter;\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    /* Use unpatented hinting only. */\n    FT_Bool               unpatented_hinting;\n#endif\n\n    /***********************************************************************/\n    /*                                                                     */\n    /* Other tables or fields. This is used by derivative formats like     */\n    /* OpenType.                                                           */\n    /*                                                                     */\n    /***********************************************************************/\n\n    FT_Generic            extra;\n\n    const char*           postscript_name;\n\n    FT_ULong              glyf_len;\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n    FT_Bool               doblend;\n    GX_Blend              blend;\n#endif\n\n    /* since version 2.2 */\n\n    FT_Byte*              horz_metrics;\n    FT_ULong              horz_metrics_size;\n\n    FT_Byte*              vert_metrics;\n    FT_ULong              vert_metrics_size;\n\n    FT_ULong              num_locations; /* in broken TTF, gid > 0xFFFF */\n    FT_Byte*              glyph_locations;\n\n    FT_Byte*              hdmx_table;\n    FT_ULong              hdmx_table_size;\n    FT_UInt               hdmx_record_count;\n    FT_ULong              hdmx_record_size;\n    FT_Byte*              hdmx_record_sizes;\n\n    FT_Byte*              sbit_table;\n    FT_ULong              sbit_table_size;\n    FT_UInt               sbit_num_strikes;\n\n    FT_Byte*              kern_table;\n    FT_ULong              kern_table_size;\n    FT_UInt               num_kern_tables;\n    FT_UInt32             kern_avail_bits;\n    FT_UInt32             kern_order_bits;\n\n#ifdef TT_CONFIG_OPTION_BDF\n    TT_BDFRec             bdf;\n#endif /* TT_CONFIG_OPTION_BDF */\n\n    /* since 2.3.0 */\n    FT_ULong              horz_metrics_offset;\n    FT_ULong              vert_metrics_offset;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    /* since 2.4.12 */\n    FT_ULong              sph_found_func_flags; /* special functions found */\n                                                /* for this face           */\n    FT_Bool               sph_compatibility_mode;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n  } TT_FaceRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  <Struct>                                                             */\n  /*     TT_GlyphZoneRec                                                   */\n  /*                                                                       */\n  /*  <Description>                                                        */\n  /*     A glyph zone is used to load, scale and hint glyph outline        */\n  /*     coordinates.                                                      */\n  /*                                                                       */\n  /*  <Fields>                                                             */\n  /*     memory       :: A handle to the memory manager.                   */\n  /*                                                                       */\n  /*     max_points   :: The maximum size in points of the zone.           */\n  /*                                                                       */\n  /*     max_contours :: Max size in links contours of the zone.           */\n  /*                                                                       */\n  /*     n_points     :: The current number of points in the zone.         */\n  /*                                                                       */\n  /*     n_contours   :: The current number of contours in the zone.       */\n  /*                                                                       */\n  /*     org          :: The original glyph coordinates (font              */\n  /*                     units/scaled).                                    */\n  /*                                                                       */\n  /*     cur          :: The current glyph coordinates (scaled/hinted).    */\n  /*                                                                       */\n  /*     tags         :: The point control tags.                           */\n  /*                                                                       */\n  /*     contours     :: The contours end points.                          */\n  /*                                                                       */\n  /*     first_point  :: Offset of the current subglyph's first point.     */\n  /*                                                                       */\n  typedef struct  TT_GlyphZoneRec_\n  {\n    FT_Memory   memory;\n    FT_UShort   max_points;\n    FT_UShort   max_contours;\n    FT_UShort   n_points;    /* number of points in zone    */\n    FT_Short    n_contours;  /* number of contours          */\n\n    FT_Vector*  org;         /* original point coordinates  */\n    FT_Vector*  cur;         /* current point coordinates   */\n    FT_Vector*  orus;        /* original (unscaled) point coordinates */\n\n    FT_Byte*    tags;        /* current touch flags         */\n    FT_UShort*  contours;    /* contour end points          */\n\n    FT_UShort   first_point; /* offset of first (#0) point  */\n\n  } TT_GlyphZoneRec, *TT_GlyphZone;\n\n\n  /* handle to execution context */\n  typedef struct TT_ExecContextRec_*  TT_ExecContext;\n\n  /* glyph loader structure */\n  typedef struct  TT_LoaderRec_\n  {\n    FT_Face          face;\n    FT_Size          size;\n    FT_GlyphSlot     glyph;\n    FT_GlyphLoader   gloader;\n\n    FT_ULong         load_flags;\n    FT_UInt          glyph_index;\n\n    FT_Stream        stream;\n    FT_Int           byte_len;\n\n    FT_Short         n_contours;\n    FT_BBox          bbox;\n    FT_Int           left_bearing;\n    FT_Int           advance;\n    FT_Int           linear;\n    FT_Bool          linear_def;\n    FT_Bool          preserve_pps;\n    FT_Vector        pp1;\n    FT_Vector        pp2;\n\n    FT_ULong         glyf_offset;\n\n    /* the zone where we load our glyphs */\n    TT_GlyphZoneRec  base;\n    TT_GlyphZoneRec  zone;\n\n    TT_ExecContext   exec;\n    FT_Byte*         instructions;\n    FT_ULong         ins_pos;\n\n    /* for possible extensibility in other formats */\n    void*            other;\n\n    /* since version 2.1.8 */\n    FT_Int           top_bearing;\n    FT_Int           vadvance;\n    FT_Vector        pp3;\n    FT_Vector        pp4;\n\n    /* since version 2.2.1 */\n    FT_Byte*         cursor;\n    FT_Byte*         limit;\n\n  } TT_LoaderRec;\n\n\nFT_END_HEADER\n\n#endif /* __TTTYPES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/t1tables.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1tables.h                                                             */\n/*                                                                         */\n/*    Basic Type 1/Type 2 tables definitions and interface (specification  */\n/*    only).                                                               */\n/*                                                                         */\n/*  Copyright 1996-2004, 2006, 2008, 2009, 2011 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __T1TABLES_H__\n#define __T1TABLES_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    type1_tables                                                       */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Type 1 Tables                                                      */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Type~1 (PostScript) specific font tables.                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the definition of Type 1-specific tables,    */\n  /*    including structures related to other PostScript font formats.     */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* Note that we separate font data in PS_FontInfoRec and PS_PrivateRec */\n  /* structures in order to support Multiple Master fonts.               */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    PS_FontInfoRec                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a Type~1 or Type~2 FontInfo dictionary.  */\n  /*    Note that for Multiple Master fonts, each instance has its own     */\n  /*    FontInfo dictionary.                                               */\n  /*                                                                       */\n  typedef struct  PS_FontInfoRec_\n  {\n    FT_String*  version;\n    FT_String*  notice;\n    FT_String*  full_name;\n    FT_String*  family_name;\n    FT_String*  weight;\n    FT_Long     italic_angle;\n    FT_Bool     is_fixed_pitch;\n    FT_Short    underline_position;\n    FT_UShort   underline_thickness;\n\n  } PS_FontInfoRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    PS_FontInfo                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a @PS_FontInfoRec structure.                           */\n  /*                                                                       */\n  typedef struct PS_FontInfoRec_*  PS_FontInfo;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    T1_FontInfo                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This type is equivalent to @PS_FontInfoRec.  It is deprecated but  */\n  /*    kept to maintain source compatibility between various versions of  */\n  /*    FreeType.                                                          */\n  /*                                                                       */\n  typedef PS_FontInfoRec  T1_FontInfo;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    PS_PrivateRec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a Type~1 or Type~2 private dictionary.   */\n  /*    Note that for Multiple Master fonts, each instance has its own     */\n  /*    Private dictionary.                                                */\n  /*                                                                       */\n  typedef struct  PS_PrivateRec_\n  {\n    FT_Int     unique_id;\n    FT_Int     lenIV;\n\n    FT_Byte    num_blue_values;\n    FT_Byte    num_other_blues;\n    FT_Byte    num_family_blues;\n    FT_Byte    num_family_other_blues;\n\n    FT_Short   blue_values[14];\n    FT_Short   other_blues[10];\n\n    FT_Short   family_blues      [14];\n    FT_Short   family_other_blues[10];\n\n    FT_Fixed   blue_scale;\n    FT_Int     blue_shift;\n    FT_Int     blue_fuzz;\n\n    FT_UShort  standard_width[1];\n    FT_UShort  standard_height[1];\n\n    FT_Byte    num_snap_widths;\n    FT_Byte    num_snap_heights;\n    FT_Bool    force_bold;\n    FT_Bool    round_stem_up;\n\n    FT_Short   snap_widths [13];  /* including std width  */\n    FT_Short   snap_heights[13];  /* including std height */\n\n    FT_Fixed   expansion_factor;\n\n    FT_Long    language_group;\n    FT_Long    password;\n\n    FT_Short   min_feature[2];\n\n  } PS_PrivateRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    PS_Private                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a @PS_PrivateRec structure.                            */\n  /*                                                                       */\n  typedef struct PS_PrivateRec_*  PS_Private;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    T1_Private                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*   This type is equivalent to @PS_PrivateRec.  It is deprecated but    */\n  /*   kept to maintain source compatibility between various versions of   */\n  /*   FreeType.                                                           */\n  /*                                                                       */\n  typedef PS_PrivateRec  T1_Private;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    T1_Blend_Flags                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A set of flags used to indicate which fields are present in a      */\n  /*    given blend dictionary (font info or private).  Used to support    */\n  /*    Multiple Masters fonts.                                            */\n  /*                                                                       */\n  typedef enum  T1_Blend_Flags_\n  {\n    /*# required fields in a FontInfo blend dictionary */\n    T1_BLEND_UNDERLINE_POSITION = 0,\n    T1_BLEND_UNDERLINE_THICKNESS,\n    T1_BLEND_ITALIC_ANGLE,\n\n    /*# required fields in a Private blend dictionary */\n    T1_BLEND_BLUE_VALUES,\n    T1_BLEND_OTHER_BLUES,\n    T1_BLEND_STANDARD_WIDTH,\n    T1_BLEND_STANDARD_HEIGHT,\n    T1_BLEND_STEM_SNAP_WIDTHS,\n    T1_BLEND_STEM_SNAP_HEIGHTS,\n    T1_BLEND_BLUE_SCALE,\n    T1_BLEND_BLUE_SHIFT,\n    T1_BLEND_FAMILY_BLUES,\n    T1_BLEND_FAMILY_OTHER_BLUES,\n    T1_BLEND_FORCE_BOLD,\n\n    /*# never remove */\n    T1_BLEND_MAX\n\n  } T1_Blend_Flags;\n\n  /* */\n\n\n  /*# backwards compatible definitions */\n#define t1_blend_underline_position   T1_BLEND_UNDERLINE_POSITION\n#define t1_blend_underline_thickness  T1_BLEND_UNDERLINE_THICKNESS\n#define t1_blend_italic_angle         T1_BLEND_ITALIC_ANGLE\n#define t1_blend_blue_values          T1_BLEND_BLUE_VALUES\n#define t1_blend_other_blues          T1_BLEND_OTHER_BLUES\n#define t1_blend_standard_widths      T1_BLEND_STANDARD_WIDTH\n#define t1_blend_standard_height      T1_BLEND_STANDARD_HEIGHT\n#define t1_blend_stem_snap_widths     T1_BLEND_STEM_SNAP_WIDTHS\n#define t1_blend_stem_snap_heights    T1_BLEND_STEM_SNAP_HEIGHTS\n#define t1_blend_blue_scale           T1_BLEND_BLUE_SCALE\n#define t1_blend_blue_shift           T1_BLEND_BLUE_SHIFT\n#define t1_blend_family_blues         T1_BLEND_FAMILY_BLUES\n#define t1_blend_family_other_blues   T1_BLEND_FAMILY_OTHER_BLUES\n#define t1_blend_force_bold           T1_BLEND_FORCE_BOLD\n#define t1_blend_max                  T1_BLEND_MAX\n\n\n  /* maximum number of Multiple Masters designs, as defined in the spec */\n#define T1_MAX_MM_DESIGNS     16\n\n  /* maximum number of Multiple Masters axes, as defined in the spec */\n#define T1_MAX_MM_AXIS        4\n\n  /* maximum number of elements in a design map */\n#define T1_MAX_MM_MAP_POINTS  20\n\n\n  /* this structure is used to store the BlendDesignMap entry for an axis */\n  typedef struct  PS_DesignMap_\n  {\n    FT_Byte    num_points;\n    FT_Long*   design_points;\n    FT_Fixed*  blend_points;\n\n  } PS_DesignMapRec, *PS_DesignMap;\n\n  /* backwards-compatible definition */\n  typedef PS_DesignMapRec  T1_DesignMap;\n\n\n  typedef struct  PS_BlendRec_\n  {\n    FT_UInt          num_designs;\n    FT_UInt          num_axis;\n\n    FT_String*       axis_names[T1_MAX_MM_AXIS];\n    FT_Fixed*        design_pos[T1_MAX_MM_DESIGNS];\n    PS_DesignMapRec  design_map[T1_MAX_MM_AXIS];\n\n    FT_Fixed*        weight_vector;\n    FT_Fixed*        default_weight_vector;\n\n    PS_FontInfo      font_infos[T1_MAX_MM_DESIGNS + 1];\n    PS_Private       privates  [T1_MAX_MM_DESIGNS + 1];\n\n    FT_ULong         blend_bitflags;\n\n    FT_BBox*         bboxes    [T1_MAX_MM_DESIGNS + 1];\n\n    /* since 2.3.0 */\n\n    /* undocumented, optional: the default design instance;   */\n    /* corresponds to default_weight_vector --                */\n    /* num_default_design_vector == 0 means it is not present */\n    /* in the font and associated metrics files               */\n    FT_UInt          default_design_vector[T1_MAX_MM_DESIGNS];\n    FT_UInt          num_default_design_vector;\n\n  } PS_BlendRec, *PS_Blend;\n\n\n  /* backwards-compatible definition */\n  typedef PS_BlendRec  T1_Blend;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    CID_FaceDictRec                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to represent data in a CID top-level dictionary.  */\n  /*                                                                       */\n  typedef struct  CID_FaceDictRec_\n  {\n    PS_PrivateRec  private_dict;\n\n    FT_UInt        len_buildchar;\n    FT_Fixed       forcebold_threshold;\n    FT_Pos         stroke_width;\n    FT_Fixed       expansion_factor;\n\n    FT_Byte        paint_type;\n    FT_Byte        font_type;\n    FT_Matrix      font_matrix;\n    FT_Vector      font_offset;\n\n    FT_UInt        num_subrs;\n    FT_ULong       subrmap_offset;\n    FT_Int         sd_bytes;\n\n  } CID_FaceDictRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    CID_FaceDict                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a @CID_FaceDictRec structure.                          */\n  /*                                                                       */\n  typedef struct CID_FaceDictRec_*  CID_FaceDict;\n\n  /* */\n\n\n  /* backwards-compatible definition */\n  typedef CID_FaceDictRec  CID_FontDict;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    CID_FaceInfoRec                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to represent CID Face information.                */\n  /*                                                                       */\n  typedef struct  CID_FaceInfoRec_\n  {\n    FT_String*      cid_font_name;\n    FT_Fixed        cid_version;\n    FT_Int          cid_font_type;\n\n    FT_String*      registry;\n    FT_String*      ordering;\n    FT_Int          supplement;\n\n    PS_FontInfoRec  font_info;\n    FT_BBox         font_bbox;\n    FT_ULong        uid_base;\n\n    FT_Int          num_xuid;\n    FT_ULong        xuid[16];\n\n    FT_ULong        cidmap_offset;\n    FT_Int          fd_bytes;\n    FT_Int          gd_bytes;\n    FT_ULong        cid_count;\n\n    FT_Int          num_dicts;\n    CID_FaceDict    font_dicts;\n\n    FT_ULong        data_offset;\n\n  } CID_FaceInfoRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    CID_FaceInfo                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a @CID_FaceInfoRec structure.                          */\n  /*                                                                       */\n  typedef struct CID_FaceInfoRec_*  CID_FaceInfo;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    CID_Info                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*   This type is equivalent to @CID_FaceInfoRec.  It is deprecated but  */\n  /*   kept to maintain source compatibility between various versions of   */\n  /*   FreeType.                                                           */\n  /*                                                                       */\n  typedef CID_FaceInfoRec  CID_Info;\n\n\n  /************************************************************************\n   *\n   * @function:\n   *    FT_Has_PS_Glyph_Names\n   *\n   * @description:\n   *    Return true if a given face provides reliable PostScript glyph\n   *    names.  This is similar to using the @FT_HAS_GLYPH_NAMES macro,\n   *    except that certain fonts (mostly TrueType) contain incorrect\n   *    glyph name tables.\n   *\n   *    When this function returns true, the caller is sure that the glyph\n   *    names returned by @FT_Get_Glyph_Name are reliable.\n   *\n   * @input:\n   *    face ::\n   *       face handle\n   *\n   * @return:\n   *    Boolean.  True if glyph names are reliable.\n   *\n   */\n  FT_EXPORT( FT_Int )\n  FT_Has_PS_Glyph_Names( FT_Face  face );\n\n\n  /************************************************************************\n   *\n   * @function:\n   *    FT_Get_PS_Font_Info\n   *\n   * @description:\n   *    Retrieve the @PS_FontInfoRec structure corresponding to a given\n   *    PostScript font.\n   *\n   * @input:\n   *    face ::\n   *       PostScript face handle.\n   *\n   * @output:\n   *    afont_info ::\n   *       Output font info structure pointer.\n   *\n   * @return:\n   *    FreeType error code.  0~means success.\n   *\n   * @note:\n   *    The string pointers within the font info structure are owned by\n   *    the face and don't need to be freed by the caller.\n   *\n   *    If the font's format is not PostScript-based, this function will\n   *    return the `FT_Err_Invalid_Argument' error code.\n   *\n   */\n  FT_EXPORT( FT_Error )\n  FT_Get_PS_Font_Info( FT_Face      face,\n                       PS_FontInfo  afont_info );\n\n\n  /************************************************************************\n   *\n   * @function:\n   *    FT_Get_PS_Font_Private\n   *\n   * @description:\n   *    Retrieve the @PS_PrivateRec structure corresponding to a given\n   *    PostScript font.\n   *\n   * @input:\n   *    face ::\n   *       PostScript face handle.\n   *\n   * @output:\n   *    afont_private ::\n   *       Output private dictionary structure pointer.\n   *\n   * @return:\n   *    FreeType error code.  0~means success.\n   *\n   * @note:\n   *    The string pointers within the @PS_PrivateRec structure are owned by\n   *    the face and don't need to be freed by the caller.\n   *\n   *    If the font's format is not PostScript-based, this function returns\n   *    the `FT_Err_Invalid_Argument' error code.\n   *\n   */\n  FT_EXPORT( FT_Error )\n  FT_Get_PS_Font_Private( FT_Face     face,\n                          PS_Private  afont_private );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    T1_EncodingType                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration describing the `Encoding' entry in a Type 1         */\n  /*    dictionary.                                                        */\n  /*                                                                       */\n  typedef enum  T1_EncodingType_\n  {\n    T1_ENCODING_TYPE_NONE = 0,\n    T1_ENCODING_TYPE_ARRAY,\n    T1_ENCODING_TYPE_STANDARD,\n    T1_ENCODING_TYPE_ISOLATIN1,\n    T1_ENCODING_TYPE_EXPERT\n\n  } T1_EncodingType;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    PS_Dict_Keys                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration used in calls to @FT_Get_PS_Font_Value to identify  */\n  /*    the Type~1 dictionary entry to retrieve.                           */\n  /*                                                                       */\n  typedef enum  PS_Dict_Keys_\n  {\n    /* conventionally in the font dictionary */\n    PS_DICT_FONT_TYPE,              /* FT_Byte         */\n    PS_DICT_FONT_MATRIX,            /* FT_Fixed        */\n    PS_DICT_FONT_BBOX,              /* FT_Fixed        */\n    PS_DICT_PAINT_TYPE,             /* FT_Byte         */\n    PS_DICT_FONT_NAME,              /* FT_String*      */\n    PS_DICT_UNIQUE_ID,              /* FT_Int          */\n    PS_DICT_NUM_CHAR_STRINGS,       /* FT_Int          */\n    PS_DICT_CHAR_STRING_KEY,        /* FT_String*      */\n    PS_DICT_CHAR_STRING,            /* FT_String*      */\n    PS_DICT_ENCODING_TYPE,          /* T1_EncodingType */\n    PS_DICT_ENCODING_ENTRY,         /* FT_String*      */\n\n    /* conventionally in the font Private dictionary */\n    PS_DICT_NUM_SUBRS,              /* FT_Int     */\n    PS_DICT_SUBR,                   /* FT_String* */\n    PS_DICT_STD_HW,                 /* FT_UShort  */\n    PS_DICT_STD_VW,                 /* FT_UShort  */\n    PS_DICT_NUM_BLUE_VALUES,        /* FT_Byte    */\n    PS_DICT_BLUE_VALUE,             /* FT_Short   */\n    PS_DICT_BLUE_FUZZ,              /* FT_Int     */\n    PS_DICT_NUM_OTHER_BLUES,        /* FT_Byte    */\n    PS_DICT_OTHER_BLUE,             /* FT_Short   */\n    PS_DICT_NUM_FAMILY_BLUES,       /* FT_Byte    */\n    PS_DICT_FAMILY_BLUE,            /* FT_Short   */\n    PS_DICT_NUM_FAMILY_OTHER_BLUES, /* FT_Byte    */\n    PS_DICT_FAMILY_OTHER_BLUE,      /* FT_Short   */\n    PS_DICT_BLUE_SCALE,             /* FT_Fixed   */\n    PS_DICT_BLUE_SHIFT,             /* FT_Int     */\n    PS_DICT_NUM_STEM_SNAP_H,        /* FT_Byte    */\n    PS_DICT_STEM_SNAP_H,            /* FT_Short   */\n    PS_DICT_NUM_STEM_SNAP_V,        /* FT_Byte    */\n    PS_DICT_STEM_SNAP_V,            /* FT_Short   */\n    PS_DICT_FORCE_BOLD,             /* FT_Bool    */\n    PS_DICT_RND_STEM_UP,            /* FT_Bool    */\n    PS_DICT_MIN_FEATURE,            /* FT_Short   */\n    PS_DICT_LEN_IV,                 /* FT_Int     */\n    PS_DICT_PASSWORD,               /* FT_Long    */\n    PS_DICT_LANGUAGE_GROUP,         /* FT_Long    */\n\n    /* conventionally in the font FontInfo dictionary */\n    PS_DICT_VERSION,                /* FT_String* */\n    PS_DICT_NOTICE,                 /* FT_String* */\n    PS_DICT_FULL_NAME,              /* FT_String* */\n    PS_DICT_FAMILY_NAME,            /* FT_String* */\n    PS_DICT_WEIGHT,                 /* FT_String* */\n    PS_DICT_IS_FIXED_PITCH,         /* FT_Bool    */\n    PS_DICT_UNDERLINE_POSITION,     /* FT_Short   */\n    PS_DICT_UNDERLINE_THICKNESS,    /* FT_UShort  */\n    PS_DICT_FS_TYPE,                /* FT_UShort  */\n    PS_DICT_ITALIC_ANGLE,           /* FT_Long    */\n\n    PS_DICT_MAX = PS_DICT_ITALIC_ANGLE\n\n  } PS_Dict_Keys;\n\n\n  /************************************************************************\n   *\n   * @function:\n   *    FT_Get_PS_Font_Value\n   *\n   * @description:\n   *    Retrieve the value for the supplied key from a PostScript font.\n   *\n   * @input:\n   *    face ::\n   *       PostScript face handle.\n   *\n   *    key ::\n   *       An enumeration value representing the dictionary key to retrieve.\n   *\n   *    idx ::\n   *       For array values, this specifies the index to be returned.\n   *\n   *    value ::\n   *       A pointer to memory into which to write the value.\n   *\n   *    valen_len ::\n   *       The size, in bytes, of the memory supplied for the value.\n   *\n   * @output:\n   *    value ::\n   *       The value matching the above key, if it exists.\n   *\n   * @return:\n   *    The amount of memory (in bytes) required to hold the requested\n   *    value (if it exists, -1 otherwise).\n   *\n   * @note:\n   *    The values returned are not pointers into the internal structures of\n   *    the face, but are `fresh' copies, so that the memory containing them\n   *    belongs to the calling application.  This also enforces the\n   *    `read-only' nature of these values, i.e., this function cannot be\n   *    used to manipulate the face.\n   *\n   *    `value' is a void pointer because the values returned can be of\n   *    various types.\n   *\n   *    If either `value' is NULL or `value_len' is too small, just the\n   *    required memory size for the requested entry is returned.\n   *\n   *    The `idx' parameter is used, not only to retrieve elements of, for\n   *    example, the FontMatrix or FontBBox, but also to retrieve name keys\n   *    from the CharStrings dictionary, and the charstrings themselves.  It\n   *    is ignored for atomic values.\n   *\n   *    PS_DICT_BLUE_SCALE returns a value that is scaled up by 1000.  To\n   *    get the value as in the font stream, you need to divide by\n   *    65536000.0 (to remove the FT_Fixed scale, and the x1000 scale).\n   *\n   *    IMPORTANT: Only key/value pairs read by the FreeType interpreter can\n   *    be retrieved.  So, for example, PostScript procedures such as NP,\n   *    ND, and RD are not available.  Arbitrary keys are, obviously, not be\n   *    available either.\n   *\n   *    If the font's format is not PostScript-based, this function returns\n   *    the `FT_Err_Invalid_Argument' error code.\n   *\n   */\n  FT_EXPORT( FT_Long )\n  FT_Get_PS_Font_Value( FT_Face       face,\n                        PS_Dict_Keys  key,\n                        FT_UInt       idx,\n                        void         *value,\n                        FT_Long       value_len );\n\n  /* */\n\nFT_END_HEADER\n\n#endif /* __T1TABLES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ttnameid.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttnameid.h                                                             */\n/*                                                                         */\n/*    TrueType name ID definitions (specification only).                   */\n/*                                                                         */\n/*  Copyright 1996-2004, 2006-2008, 2012 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTNAMEID_H__\n#define __TTNAMEID_H__\n\n\n#include \"../ft2build.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    truetype_tables                                                    */\n  /*                                                                       */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Possible values for the `platform' identifier code in the name        */\n  /* records of the TTF `name' table.                                      */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /***********************************************************************\n   *\n   * @enum:\n   *   TT_PLATFORM_XXX\n   *\n   * @description:\n   *   A list of valid values for the `platform_id' identifier code in\n   *   @FT_CharMapRec and @FT_SfntName structures.\n   *\n   * @values:\n   *   TT_PLATFORM_APPLE_UNICODE ::\n   *     Used by Apple to indicate a Unicode character map and/or name entry.\n   *     See @TT_APPLE_ID_XXX for corresponding `encoding_id' values.  Note\n   *     that name entries in this format are coded as big-endian UCS-2\n   *     character codes _only_.\n   *\n   *   TT_PLATFORM_MACINTOSH ::\n   *     Used by Apple to indicate a MacOS-specific charmap and/or name entry.\n   *     See @TT_MAC_ID_XXX for corresponding `encoding_id' values.  Note that\n   *     most TrueType fonts contain an Apple roman charmap to be usable on\n   *     MacOS systems (even if they contain a Microsoft charmap as well).\n   *\n   *   TT_PLATFORM_ISO ::\n   *     This value was used to specify ISO/IEC 10646 charmaps.  It is however\n   *     now deprecated.  See @TT_ISO_ID_XXX for a list of corresponding\n   *     `encoding_id' values.\n   *\n   *   TT_PLATFORM_MICROSOFT ::\n   *     Used by Microsoft to indicate Windows-specific charmaps.  See\n   *     @TT_MS_ID_XXX for a list of corresponding `encoding_id' values.\n   *     Note that most fonts contain a Unicode charmap using\n   *     (TT_PLATFORM_MICROSOFT, @TT_MS_ID_UNICODE_CS).\n   *\n   *   TT_PLATFORM_CUSTOM ::\n   *     Used to indicate application-specific charmaps.\n   *\n   *   TT_PLATFORM_ADOBE ::\n   *     This value isn't part of any font format specification, but is used\n   *     by FreeType to report Adobe-specific charmaps in an @FT_CharMapRec\n   *     structure.  See @TT_ADOBE_ID_XXX.\n   */\n\n#define TT_PLATFORM_APPLE_UNICODE  0\n#define TT_PLATFORM_MACINTOSH      1\n#define TT_PLATFORM_ISO            2 /* deprecated */\n#define TT_PLATFORM_MICROSOFT      3\n#define TT_PLATFORM_CUSTOM         4\n#define TT_PLATFORM_ADOBE          7 /* artificial */\n\n\n  /***********************************************************************\n   *\n   * @enum:\n   *   TT_APPLE_ID_XXX\n   *\n   * @description:\n   *   A list of valid values for the `encoding_id' for\n   *   @TT_PLATFORM_APPLE_UNICODE charmaps and name entries.\n   *\n   * @values:\n   *   TT_APPLE_ID_DEFAULT ::\n   *     Unicode version 1.0.\n   *\n   *   TT_APPLE_ID_UNICODE_1_1 ::\n   *     Unicode 1.1; specifies Hangul characters starting at U+34xx.\n   *\n   *   TT_APPLE_ID_ISO_10646 ::\n   *     Deprecated (identical to preceding).\n   *\n   *   TT_APPLE_ID_UNICODE_2_0 ::\n   *     Unicode 2.0 and beyond (UTF-16 BMP only).\n   *\n   *   TT_APPLE_ID_UNICODE_32 ::\n   *     Unicode 3.1 and beyond, using UTF-32.\n   *\n   *   TT_APPLE_ID_VARIANT_SELECTOR ::\n   *     From Adobe, not Apple.  Not a normal cmap.  Specifies variations\n   *     on a real cmap.\n   */\n\n#define TT_APPLE_ID_DEFAULT           0 /* Unicode 1.0 */\n#define TT_APPLE_ID_UNICODE_1_1       1 /* specify Hangul at U+34xx */\n#define TT_APPLE_ID_ISO_10646         2 /* deprecated */\n#define TT_APPLE_ID_UNICODE_2_0       3 /* or later */\n#define TT_APPLE_ID_UNICODE_32        4 /* 2.0 or later, full repertoire */\n#define TT_APPLE_ID_VARIANT_SELECTOR  5 /* variation selector data */\n\n\n  /***********************************************************************\n   *\n   * @enum:\n   *   TT_MAC_ID_XXX\n   *\n   * @description:\n   *   A list of valid values for the `encoding_id' for\n   *   @TT_PLATFORM_MACINTOSH charmaps and name entries.\n   *\n   * @values:\n   *   TT_MAC_ID_ROMAN ::\n   *   TT_MAC_ID_JAPANESE ::\n   *   TT_MAC_ID_TRADITIONAL_CHINESE ::\n   *   TT_MAC_ID_KOREAN ::\n   *   TT_MAC_ID_ARABIC ::\n   *   TT_MAC_ID_HEBREW ::\n   *   TT_MAC_ID_GREEK ::\n   *   TT_MAC_ID_RUSSIAN ::\n   *   TT_MAC_ID_RSYMBOL ::\n   *   TT_MAC_ID_DEVANAGARI ::\n   *   TT_MAC_ID_GURMUKHI ::\n   *   TT_MAC_ID_GUJARATI ::\n   *   TT_MAC_ID_ORIYA ::\n   *   TT_MAC_ID_BENGALI ::\n   *   TT_MAC_ID_TAMIL ::\n   *   TT_MAC_ID_TELUGU ::\n   *   TT_MAC_ID_KANNADA ::\n   *   TT_MAC_ID_MALAYALAM ::\n   *   TT_MAC_ID_SINHALESE ::\n   *   TT_MAC_ID_BURMESE ::\n   *   TT_MAC_ID_KHMER ::\n   *   TT_MAC_ID_THAI ::\n   *   TT_MAC_ID_LAOTIAN ::\n   *   TT_MAC_ID_GEORGIAN ::\n   *   TT_MAC_ID_ARMENIAN ::\n   *   TT_MAC_ID_MALDIVIAN ::\n   *   TT_MAC_ID_SIMPLIFIED_CHINESE ::\n   *   TT_MAC_ID_TIBETAN ::\n   *   TT_MAC_ID_MONGOLIAN ::\n   *   TT_MAC_ID_GEEZ ::\n   *   TT_MAC_ID_SLAVIC ::\n   *   TT_MAC_ID_VIETNAMESE ::\n   *   TT_MAC_ID_SINDHI ::\n   *   TT_MAC_ID_UNINTERP ::\n   */\n\n#define TT_MAC_ID_ROMAN                 0\n#define TT_MAC_ID_JAPANESE              1\n#define TT_MAC_ID_TRADITIONAL_CHINESE   2\n#define TT_MAC_ID_KOREAN                3\n#define TT_MAC_ID_ARABIC                4\n#define TT_MAC_ID_HEBREW                5\n#define TT_MAC_ID_GREEK                 6\n#define TT_MAC_ID_RUSSIAN               7\n#define TT_MAC_ID_RSYMBOL               8\n#define TT_MAC_ID_DEVANAGARI            9\n#define TT_MAC_ID_GURMUKHI             10\n#define TT_MAC_ID_GUJARATI             11\n#define TT_MAC_ID_ORIYA                12\n#define TT_MAC_ID_BENGALI              13\n#define TT_MAC_ID_TAMIL                14\n#define TT_MAC_ID_TELUGU               15\n#define TT_MAC_ID_KANNADA              16\n#define TT_MAC_ID_MALAYALAM            17\n#define TT_MAC_ID_SINHALESE            18\n#define TT_MAC_ID_BURMESE              19\n#define TT_MAC_ID_KHMER                20\n#define TT_MAC_ID_THAI                 21\n#define TT_MAC_ID_LAOTIAN              22\n#define TT_MAC_ID_GEORGIAN             23\n#define TT_MAC_ID_ARMENIAN             24\n#define TT_MAC_ID_MALDIVIAN            25\n#define TT_MAC_ID_SIMPLIFIED_CHINESE   25\n#define TT_MAC_ID_TIBETAN              26\n#define TT_MAC_ID_MONGOLIAN            27\n#define TT_MAC_ID_GEEZ                 28\n#define TT_MAC_ID_SLAVIC               29\n#define TT_MAC_ID_VIETNAMESE           30\n#define TT_MAC_ID_SINDHI               31\n#define TT_MAC_ID_UNINTERP             32\n\n\n  /***********************************************************************\n   *\n   * @enum:\n   *   TT_ISO_ID_XXX\n   *\n   * @description:\n   *   A list of valid values for the `encoding_id' for\n   *   @TT_PLATFORM_ISO charmaps and name entries.\n   *\n   *   Their use is now deprecated.\n   *\n   * @values:\n   *   TT_ISO_ID_7BIT_ASCII ::\n   *     ASCII.\n   *   TT_ISO_ID_10646 ::\n   *     ISO/10646.\n   *   TT_ISO_ID_8859_1 ::\n   *     Also known as Latin-1.\n   */\n\n#define TT_ISO_ID_7BIT_ASCII  0\n#define TT_ISO_ID_10646       1\n#define TT_ISO_ID_8859_1      2\n\n\n  /***********************************************************************\n   *\n   * @enum:\n   *   TT_MS_ID_XXX\n   *\n   * @description:\n   *   A list of valid values for the `encoding_id' for\n   *   @TT_PLATFORM_MICROSOFT charmaps and name entries.\n   *\n   * @values:\n   *   TT_MS_ID_SYMBOL_CS ::\n   *     Corresponds to Microsoft symbol encoding. See\n   *     @FT_ENCODING_MS_SYMBOL.\n   *\n   *   TT_MS_ID_UNICODE_CS ::\n   *     Corresponds to a Microsoft WGL4 charmap, matching Unicode.  See\n   *     @FT_ENCODING_UNICODE.\n   *\n   *   TT_MS_ID_SJIS ::\n   *     Corresponds to SJIS Japanese encoding.  See @FT_ENCODING_SJIS.\n   *\n   *   TT_MS_ID_GB2312 ::\n   *     Corresponds to Simplified Chinese as used in Mainland China.  See\n   *     @FT_ENCODING_GB2312.\n   *\n   *   TT_MS_ID_BIG_5 ::\n   *     Corresponds to Traditional Chinese as used in Taiwan and Hong Kong.\n   *     See @FT_ENCODING_BIG5.\n   *\n   *   TT_MS_ID_WANSUNG ::\n   *     Corresponds to Korean Wansung encoding.  See @FT_ENCODING_WANSUNG.\n   *\n   *   TT_MS_ID_JOHAB ::\n   *     Corresponds to Johab encoding.  See @FT_ENCODING_JOHAB.\n   *\n   *   TT_MS_ID_UCS_4 ::\n   *     Corresponds to UCS-4 or UTF-32 charmaps.  This has been added to\n   *     the OpenType specification version 1.4 (mid-2001.)\n   */\n\n#define TT_MS_ID_SYMBOL_CS    0\n#define TT_MS_ID_UNICODE_CS   1\n#define TT_MS_ID_SJIS         2\n#define TT_MS_ID_GB2312       3\n#define TT_MS_ID_BIG_5        4\n#define TT_MS_ID_WANSUNG      5\n#define TT_MS_ID_JOHAB        6\n#define TT_MS_ID_UCS_4       10\n\n\n  /***********************************************************************\n   *\n   * @enum:\n   *   TT_ADOBE_ID_XXX\n   *\n   * @description:\n   *   A list of valid values for the `encoding_id' for\n   *   @TT_PLATFORM_ADOBE charmaps.  This is a FreeType-specific extension!\n   *\n   * @values:\n   *   TT_ADOBE_ID_STANDARD ::\n   *     Adobe standard encoding.\n   *   TT_ADOBE_ID_EXPERT ::\n   *     Adobe expert encoding.\n   *   TT_ADOBE_ID_CUSTOM ::\n   *     Adobe custom encoding.\n   *   TT_ADOBE_ID_LATIN_1 ::\n   *     Adobe Latin~1 encoding.\n   */\n\n#define TT_ADOBE_ID_STANDARD  0\n#define TT_ADOBE_ID_EXPERT    1\n#define TT_ADOBE_ID_CUSTOM    2\n#define TT_ADOBE_ID_LATIN_1   3\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Possible values of the language identifier field in the name records  */\n  /* of the TTF `name' table if the `platform' identifier code is          */\n  /* TT_PLATFORM_MACINTOSH.  These values are also used as return values   */\n  /* for function @FT_Get_CMap_Language_ID.                                */\n  /*                                                                       */\n  /* The canonical source for the Apple assigned Language ID's is at       */\n  /*                                                                       */\n  /*   https://developer.apple.com/fonts/TTRefMan/RM06/Chap6name.html      */\n  /*                                                                       */\n#define TT_MAC_LANGID_ENGLISH                       0\n#define TT_MAC_LANGID_FRENCH                        1\n#define TT_MAC_LANGID_GERMAN                        2\n#define TT_MAC_LANGID_ITALIAN                       3\n#define TT_MAC_LANGID_DUTCH                         4\n#define TT_MAC_LANGID_SWEDISH                       5\n#define TT_MAC_LANGID_SPANISH                       6\n#define TT_MAC_LANGID_DANISH                        7\n#define TT_MAC_LANGID_PORTUGUESE                    8\n#define TT_MAC_LANGID_NORWEGIAN                     9\n#define TT_MAC_LANGID_HEBREW                       10\n#define TT_MAC_LANGID_JAPANESE                     11\n#define TT_MAC_LANGID_ARABIC                       12\n#define TT_MAC_LANGID_FINNISH                      13\n#define TT_MAC_LANGID_GREEK                        14\n#define TT_MAC_LANGID_ICELANDIC                    15\n#define TT_MAC_LANGID_MALTESE                      16\n#define TT_MAC_LANGID_TURKISH                      17\n#define TT_MAC_LANGID_CROATIAN                     18\n#define TT_MAC_LANGID_CHINESE_TRADITIONAL          19\n#define TT_MAC_LANGID_URDU                         20\n#define TT_MAC_LANGID_HINDI                        21\n#define TT_MAC_LANGID_THAI                         22\n#define TT_MAC_LANGID_KOREAN                       23\n#define TT_MAC_LANGID_LITHUANIAN                   24\n#define TT_MAC_LANGID_POLISH                       25\n#define TT_MAC_LANGID_HUNGARIAN                    26\n#define TT_MAC_LANGID_ESTONIAN                     27\n#define TT_MAC_LANGID_LETTISH                      28\n#define TT_MAC_LANGID_SAAMISK                      29\n#define TT_MAC_LANGID_FAEROESE                     30\n#define TT_MAC_LANGID_FARSI                        31\n#define TT_MAC_LANGID_RUSSIAN                      32\n#define TT_MAC_LANGID_CHINESE_SIMPLIFIED           33\n#define TT_MAC_LANGID_FLEMISH                      34\n#define TT_MAC_LANGID_IRISH                        35\n#define TT_MAC_LANGID_ALBANIAN                     36\n#define TT_MAC_LANGID_ROMANIAN                     37\n#define TT_MAC_LANGID_CZECH                        38\n#define TT_MAC_LANGID_SLOVAK                       39\n#define TT_MAC_LANGID_SLOVENIAN                    40\n#define TT_MAC_LANGID_YIDDISH                      41\n#define TT_MAC_LANGID_SERBIAN                      42\n#define TT_MAC_LANGID_MACEDONIAN                   43\n#define TT_MAC_LANGID_BULGARIAN                    44\n#define TT_MAC_LANGID_UKRAINIAN                    45\n#define TT_MAC_LANGID_BYELORUSSIAN                 46\n#define TT_MAC_LANGID_UZBEK                        47\n#define TT_MAC_LANGID_KAZAKH                       48\n#define TT_MAC_LANGID_AZERBAIJANI                  49\n#define TT_MAC_LANGID_AZERBAIJANI_CYRILLIC_SCRIPT  49\n#define TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT    50\n#define TT_MAC_LANGID_ARMENIAN                     51\n#define TT_MAC_LANGID_GEORGIAN                     52\n#define TT_MAC_LANGID_MOLDAVIAN                    53\n#define TT_MAC_LANGID_KIRGHIZ                      54\n#define TT_MAC_LANGID_TAJIKI                       55\n#define TT_MAC_LANGID_TURKMEN                      56\n#define TT_MAC_LANGID_MONGOLIAN                    57\n#define TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT   57\n#define TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT    58\n#define TT_MAC_LANGID_PASHTO                       59\n#define TT_MAC_LANGID_KURDISH                      60\n#define TT_MAC_LANGID_KASHMIRI                     61\n#define TT_MAC_LANGID_SINDHI                       62\n#define TT_MAC_LANGID_TIBETAN                      63\n#define TT_MAC_LANGID_NEPALI                       64\n#define TT_MAC_LANGID_SANSKRIT                     65\n#define TT_MAC_LANGID_MARATHI                      66\n#define TT_MAC_LANGID_BENGALI                      67\n#define TT_MAC_LANGID_ASSAMESE                     68\n#define TT_MAC_LANGID_GUJARATI                     69\n#define TT_MAC_LANGID_PUNJABI                      70\n#define TT_MAC_LANGID_ORIYA                        71\n#define TT_MAC_LANGID_MALAYALAM                    72\n#define TT_MAC_LANGID_KANNADA                      73\n#define TT_MAC_LANGID_TAMIL                        74\n#define TT_MAC_LANGID_TELUGU                       75\n#define TT_MAC_LANGID_SINHALESE                    76\n#define TT_MAC_LANGID_BURMESE                      77\n#define TT_MAC_LANGID_KHMER                        78\n#define TT_MAC_LANGID_LAO                          79\n#define TT_MAC_LANGID_VIETNAMESE                   80\n#define TT_MAC_LANGID_INDONESIAN                   81\n#define TT_MAC_LANGID_TAGALOG                      82\n#define TT_MAC_LANGID_MALAY_ROMAN_SCRIPT           83\n#define TT_MAC_LANGID_MALAY_ARABIC_SCRIPT          84\n#define TT_MAC_LANGID_AMHARIC                      85\n#define TT_MAC_LANGID_TIGRINYA                     86\n#define TT_MAC_LANGID_GALLA                        87\n#define TT_MAC_LANGID_SOMALI                       88\n#define TT_MAC_LANGID_SWAHILI                      89\n#define TT_MAC_LANGID_RUANDA                       90\n#define TT_MAC_LANGID_RUNDI                        91\n#define TT_MAC_LANGID_CHEWA                        92\n#define TT_MAC_LANGID_MALAGASY                     93\n#define TT_MAC_LANGID_ESPERANTO                    94\n#define TT_MAC_LANGID_WELSH                       128\n#define TT_MAC_LANGID_BASQUE                      129\n#define TT_MAC_LANGID_CATALAN                     130\n#define TT_MAC_LANGID_LATIN                       131\n#define TT_MAC_LANGID_QUECHUA                     132\n#define TT_MAC_LANGID_GUARANI                     133\n#define TT_MAC_LANGID_AYMARA                      134\n#define TT_MAC_LANGID_TATAR                       135\n#define TT_MAC_LANGID_UIGHUR                      136\n#define TT_MAC_LANGID_DZONGKHA                    137\n#define TT_MAC_LANGID_JAVANESE                    138\n#define TT_MAC_LANGID_SUNDANESE                   139\n\n\n#if 0  /* these seem to be errors that have been dropped */\n\n#define TT_MAC_LANGID_SCOTTISH_GAELIC             140\n#define TT_MAC_LANGID_IRISH_GAELIC                141\n\n#endif\n\n\n  /* The following codes are new as of 2000-03-10 */\n#define TT_MAC_LANGID_GALICIAN                    140\n#define TT_MAC_LANGID_AFRIKAANS                   141\n#define TT_MAC_LANGID_BRETON                      142\n#define TT_MAC_LANGID_INUKTITUT                   143\n#define TT_MAC_LANGID_SCOTTISH_GAELIC             144\n#define TT_MAC_LANGID_MANX_GAELIC                 145\n#define TT_MAC_LANGID_IRISH_GAELIC                146\n#define TT_MAC_LANGID_TONGAN                      147\n#define TT_MAC_LANGID_GREEK_POLYTONIC             148\n#define TT_MAC_LANGID_GREELANDIC                  149\n#define TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT    150\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Possible values of the language identifier field in the name records  */\n  /* of the TTF `name' table if the `platform' identifier code is          */\n  /* TT_PLATFORM_MICROSOFT.                                                */\n  /*                                                                       */\n  /* The canonical source for the MS assigned LCIDs is                     */\n  /*                                                                       */\n  /*   http://www.microsoft.com/globaldev/reference/lcid-all.mspx          */\n  /*                                                                       */\n\n#define TT_MS_LANGID_ARABIC_GENERAL                    0x0001\n#define TT_MS_LANGID_ARABIC_SAUDI_ARABIA               0x0401\n#define TT_MS_LANGID_ARABIC_IRAQ                       0x0801\n#define TT_MS_LANGID_ARABIC_EGYPT                      0x0c01\n#define TT_MS_LANGID_ARABIC_LIBYA                      0x1001\n#define TT_MS_LANGID_ARABIC_ALGERIA                    0x1401\n#define TT_MS_LANGID_ARABIC_MOROCCO                    0x1801\n#define TT_MS_LANGID_ARABIC_TUNISIA                    0x1c01\n#define TT_MS_LANGID_ARABIC_OMAN                       0x2001\n#define TT_MS_LANGID_ARABIC_YEMEN                      0x2401\n#define TT_MS_LANGID_ARABIC_SYRIA                      0x2801\n#define TT_MS_LANGID_ARABIC_JORDAN                     0x2c01\n#define TT_MS_LANGID_ARABIC_LEBANON                    0x3001\n#define TT_MS_LANGID_ARABIC_KUWAIT                     0x3401\n#define TT_MS_LANGID_ARABIC_UAE                        0x3801\n#define TT_MS_LANGID_ARABIC_BAHRAIN                    0x3c01\n#define TT_MS_LANGID_ARABIC_QATAR                      0x4001\n#define TT_MS_LANGID_BULGARIAN_BULGARIA                0x0402\n#define TT_MS_LANGID_CATALAN_SPAIN                     0x0403\n#define TT_MS_LANGID_CHINESE_GENERAL                   0x0004\n#define TT_MS_LANGID_CHINESE_TAIWAN                    0x0404\n#define TT_MS_LANGID_CHINESE_PRC                       0x0804\n#define TT_MS_LANGID_CHINESE_HONG_KONG                 0x0c04\n#define TT_MS_LANGID_CHINESE_SINGAPORE                 0x1004\n\n#if 1  /* this looks like the correct value */\n#define TT_MS_LANGID_CHINESE_MACAU                     0x1404\n#else  /* but beware, Microsoft may change its mind...\n          the most recent Word reference has the following: */\n#define TT_MS_LANGID_CHINESE_MACAU  TT_MS_LANGID_CHINESE_HONG_KONG\n#endif\n\n#if 0  /* used only with .NET `cultures'; commented out */\n#define TT_MS_LANGID_CHINESE_TRADITIONAL               0x7C04\n#endif\n\n#define TT_MS_LANGID_CZECH_CZECH_REPUBLIC              0x0405\n#define TT_MS_LANGID_DANISH_DENMARK                    0x0406\n#define TT_MS_LANGID_GERMAN_GERMANY                    0x0407\n#define TT_MS_LANGID_GERMAN_SWITZERLAND                0x0807\n#define TT_MS_LANGID_GERMAN_AUSTRIA                    0x0c07\n#define TT_MS_LANGID_GERMAN_LUXEMBOURG                 0x1007\n#define TT_MS_LANGID_GERMAN_LIECHTENSTEI               0x1407\n#define TT_MS_LANGID_GREEK_GREECE                      0x0408\n\n  /* don't ask what this one means... It is commented out currently. */\n#if 0\n#define TT_MS_LANGID_GREEK_GREECE2                     0x2008\n#endif\n\n#define TT_MS_LANGID_ENGLISH_GENERAL                   0x0009\n#define TT_MS_LANGID_ENGLISH_UNITED_STATES             0x0409\n#define TT_MS_LANGID_ENGLISH_UNITED_KINGDOM            0x0809\n#define TT_MS_LANGID_ENGLISH_AUSTRALIA                 0x0c09\n#define TT_MS_LANGID_ENGLISH_CANADA                    0x1009\n#define TT_MS_LANGID_ENGLISH_NEW_ZEALAND               0x1409\n#define TT_MS_LANGID_ENGLISH_IRELAND                   0x1809\n#define TT_MS_LANGID_ENGLISH_SOUTH_AFRICA              0x1c09\n#define TT_MS_LANGID_ENGLISH_JAMAICA                   0x2009\n#define TT_MS_LANGID_ENGLISH_CARIBBEAN                 0x2409\n#define TT_MS_LANGID_ENGLISH_BELIZE                    0x2809\n#define TT_MS_LANGID_ENGLISH_TRINIDAD                  0x2c09\n#define TT_MS_LANGID_ENGLISH_ZIMBABWE                  0x3009\n#define TT_MS_LANGID_ENGLISH_PHILIPPINES               0x3409\n#define TT_MS_LANGID_ENGLISH_INDONESIA                 0x3809\n#define TT_MS_LANGID_ENGLISH_HONG_KONG                 0x3c09\n#define TT_MS_LANGID_ENGLISH_INDIA                     0x4009\n#define TT_MS_LANGID_ENGLISH_MALAYSIA                  0x4409\n#define TT_MS_LANGID_ENGLISH_SINGAPORE                 0x4809\n#define TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT    0x040a\n#define TT_MS_LANGID_SPANISH_MEXICO                    0x080a\n#define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT  0x0c0a\n#define TT_MS_LANGID_SPANISH_GUATEMALA                 0x100a\n#define TT_MS_LANGID_SPANISH_COSTA_RICA                0x140a\n#define TT_MS_LANGID_SPANISH_PANAMA                    0x180a\n#define TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC        0x1c0a\n#define TT_MS_LANGID_SPANISH_VENEZUELA                 0x200a\n#define TT_MS_LANGID_SPANISH_COLOMBIA                  0x240a\n#define TT_MS_LANGID_SPANISH_PERU                      0x280a\n#define TT_MS_LANGID_SPANISH_ARGENTINA                 0x2c0a\n#define TT_MS_LANGID_SPANISH_ECUADOR                   0x300a\n#define TT_MS_LANGID_SPANISH_CHILE                     0x340a\n#define TT_MS_LANGID_SPANISH_URUGUAY                   0x380a\n#define TT_MS_LANGID_SPANISH_PARAGUAY                  0x3c0a\n#define TT_MS_LANGID_SPANISH_BOLIVIA                   0x400a\n#define TT_MS_LANGID_SPANISH_EL_SALVADOR               0x440a\n#define TT_MS_LANGID_SPANISH_HONDURAS                  0x480a\n#define TT_MS_LANGID_SPANISH_NICARAGUA                 0x4c0a\n#define TT_MS_LANGID_SPANISH_PUERTO_RICO               0x500a\n#define TT_MS_LANGID_SPANISH_UNITED_STATES             0x540a\n  /* The following ID blatantly violate MS specs by using a */\n  /* sublanguage > 0x1F.                                    */\n#define TT_MS_LANGID_SPANISH_LATIN_AMERICA             0xE40aU\n#define TT_MS_LANGID_FINNISH_FINLAND                   0x040b\n#define TT_MS_LANGID_FRENCH_FRANCE                     0x040c\n#define TT_MS_LANGID_FRENCH_BELGIUM                    0x080c\n#define TT_MS_LANGID_FRENCH_CANADA                     0x0c0c\n#define TT_MS_LANGID_FRENCH_SWITZERLAND                0x100c\n#define TT_MS_LANGID_FRENCH_LUXEMBOURG                 0x140c\n#define TT_MS_LANGID_FRENCH_MONACO                     0x180c\n#define TT_MS_LANGID_FRENCH_WEST_INDIES                0x1c0c\n#define TT_MS_LANGID_FRENCH_REUNION                    0x200c\n#define TT_MS_LANGID_FRENCH_CONGO                      0x240c\n  /* which was formerly: */\n#define TT_MS_LANGID_FRENCH_ZAIRE  TT_MS_LANGID_FRENCH_CONGO\n#define TT_MS_LANGID_FRENCH_SENEGAL                    0x280c\n#define TT_MS_LANGID_FRENCH_CAMEROON                   0x2c0c\n#define TT_MS_LANGID_FRENCH_COTE_D_IVOIRE              0x300c\n#define TT_MS_LANGID_FRENCH_MALI                       0x340c\n#define TT_MS_LANGID_FRENCH_MOROCCO                    0x380c\n#define TT_MS_LANGID_FRENCH_HAITI                      0x3c0c\n  /* and another violation of the spec (see 0xE40aU) */\n#define TT_MS_LANGID_FRENCH_NORTH_AFRICA               0xE40cU\n#define TT_MS_LANGID_HEBREW_ISRAEL                     0x040d\n#define TT_MS_LANGID_HUNGARIAN_HUNGARY                 0x040e\n#define TT_MS_LANGID_ICELANDIC_ICELAND                 0x040f\n#define TT_MS_LANGID_ITALIAN_ITALY                     0x0410\n#define TT_MS_LANGID_ITALIAN_SWITZERLAND               0x0810\n#define TT_MS_LANGID_JAPANESE_JAPAN                    0x0411\n#define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA     0x0412\n#define TT_MS_LANGID_KOREAN_JOHAB_KOREA                0x0812\n#define TT_MS_LANGID_DUTCH_NETHERLANDS                 0x0413\n#define TT_MS_LANGID_DUTCH_BELGIUM                     0x0813\n#define TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL           0x0414\n#define TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK          0x0814\n#define TT_MS_LANGID_POLISH_POLAND                     0x0415\n#define TT_MS_LANGID_PORTUGUESE_BRAZIL                 0x0416\n#define TT_MS_LANGID_PORTUGUESE_PORTUGAL               0x0816\n#define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND        0x0417\n#define TT_MS_LANGID_ROMANIAN_ROMANIA                  0x0418\n#define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA                0x0818\n#define TT_MS_LANGID_RUSSIAN_RUSSIA                    0x0419\n#define TT_MS_LANGID_RUSSIAN_MOLDAVIA                  0x0819\n#define TT_MS_LANGID_CROATIAN_CROATIA                  0x041a\n#define TT_MS_LANGID_SERBIAN_SERBIA_LATIN              0x081a\n#define TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC           0x0c1a\n\n#if 0  /* this used to be this value, but it looks like we were wrong */\n#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA        0x101a\n#else  /* current sources say */\n#define TT_MS_LANGID_CROATIAN_BOSNIA_HERZEGOVINA       0x101a\n#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA        0x141a\n       /* and XPsp2 Platform SDK added (2004-07-26) */\n       /* Names are shortened to be significant within 40 chars. */\n#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_LATIN         0x181a\n#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC      0x181a\n#endif\n\n#define TT_MS_LANGID_SLOVAK_SLOVAKIA                   0x041b\n#define TT_MS_LANGID_ALBANIAN_ALBANIA                  0x041c\n#define TT_MS_LANGID_SWEDISH_SWEDEN                    0x041d\n#define TT_MS_LANGID_SWEDISH_FINLAND                   0x081d\n#define TT_MS_LANGID_THAI_THAILAND                     0x041e\n#define TT_MS_LANGID_TURKISH_TURKEY                    0x041f\n#define TT_MS_LANGID_URDU_PAKISTAN                     0x0420\n#define TT_MS_LANGID_URDU_INDIA                        0x0820\n#define TT_MS_LANGID_INDONESIAN_INDONESIA              0x0421\n#define TT_MS_LANGID_UKRAINIAN_UKRAINE                 0x0422\n#define TT_MS_LANGID_BELARUSIAN_BELARUS                0x0423\n#define TT_MS_LANGID_SLOVENE_SLOVENIA                  0x0424\n#define TT_MS_LANGID_ESTONIAN_ESTONIA                  0x0425\n#define TT_MS_LANGID_LATVIAN_LATVIA                    0x0426\n#define TT_MS_LANGID_LITHUANIAN_LITHUANIA              0x0427\n#define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA      0x0827\n#define TT_MS_LANGID_TAJIK_TAJIKISTAN                  0x0428\n#define TT_MS_LANGID_FARSI_IRAN                        0x0429\n#define TT_MS_LANGID_VIETNAMESE_VIET_NAM               0x042a\n#define TT_MS_LANGID_ARMENIAN_ARMENIA                  0x042b\n#define TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN            0x042c\n#define TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC         0x082c\n#define TT_MS_LANGID_BASQUE_SPAIN                      0x042d\n#define TT_MS_LANGID_SORBIAN_GERMANY                   0x042e\n#define TT_MS_LANGID_MACEDONIAN_MACEDONIA              0x042f\n#define TT_MS_LANGID_SUTU_SOUTH_AFRICA                 0x0430\n#define TT_MS_LANGID_TSONGA_SOUTH_AFRICA               0x0431\n#define TT_MS_LANGID_TSWANA_SOUTH_AFRICA               0x0432\n#define TT_MS_LANGID_VENDA_SOUTH_AFRICA                0x0433\n#define TT_MS_LANGID_XHOSA_SOUTH_AFRICA                0x0434\n#define TT_MS_LANGID_ZULU_SOUTH_AFRICA                 0x0435\n#define TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA            0x0436\n#define TT_MS_LANGID_GEORGIAN_GEORGIA                  0x0437\n#define TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS           0x0438\n#define TT_MS_LANGID_HINDI_INDIA                       0x0439\n#define TT_MS_LANGID_MALTESE_MALTA                     0x043a\n  /* Added by XPsp2 Platform SDK (2004-07-26) */\n#define TT_MS_LANGID_SAMI_NORTHERN_NORWAY              0x043b\n#define TT_MS_LANGID_SAMI_NORTHERN_SWEDEN              0x083b\n#define TT_MS_LANGID_SAMI_NORTHERN_FINLAND             0x0C3b\n#define TT_MS_LANGID_SAMI_LULE_NORWAY                  0x103b\n#define TT_MS_LANGID_SAMI_LULE_SWEDEN                  0x143b\n#define TT_MS_LANGID_SAMI_SOUTHERN_NORWAY              0x183b\n#define TT_MS_LANGID_SAMI_SOUTHERN_SWEDEN              0x1C3b\n#define TT_MS_LANGID_SAMI_SKOLT_FINLAND                0x203b\n#define TT_MS_LANGID_SAMI_INARI_FINLAND                0x243b\n  /* ... and we also keep our old identifier... */\n#define TT_MS_LANGID_SAAMI_LAPONIA                     0x043b\n\n#if 0 /* this seems to be a previous inversion */\n#define TT_MS_LANGID_IRISH_GAELIC_IRELAND              0x043c\n#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM    0x083c\n#else\n#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM    0x083c\n#define TT_MS_LANGID_IRISH_GAELIC_IRELAND              0x043c\n#endif\n\n#define TT_MS_LANGID_YIDDISH_GERMANY                   0x043d\n#define TT_MS_LANGID_MALAY_MALAYSIA                    0x043e\n#define TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM           0x083e\n#define TT_MS_LANGID_KAZAK_KAZAKSTAN                   0x043f\n#define TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN /* Cyrillic*/ 0x0440\n  /* alias declared in Windows 2000 */\n#define TT_MS_LANGID_KIRGHIZ_KIRGHIZ_REPUBLIC \\\n          TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN\n\n#define TT_MS_LANGID_SWAHILI_KENYA                     0x0441\n#define TT_MS_LANGID_TURKMEN_TURKMENISTAN              0x0442\n#define TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN            0x0443\n#define TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC         0x0843\n#define TT_MS_LANGID_TATAR_TATARSTAN                   0x0444\n#define TT_MS_LANGID_BENGALI_INDIA                     0x0445\n#define TT_MS_LANGID_BENGALI_BANGLADESH                0x0845\n#define TT_MS_LANGID_PUNJABI_INDIA                     0x0446\n#define TT_MS_LANGID_PUNJABI_ARABIC_PAKISTAN           0x0846\n#define TT_MS_LANGID_GUJARATI_INDIA                    0x0447\n#define TT_MS_LANGID_ORIYA_INDIA                       0x0448\n#define TT_MS_LANGID_TAMIL_INDIA                       0x0449\n#define TT_MS_LANGID_TELUGU_INDIA                      0x044a\n#define TT_MS_LANGID_KANNADA_INDIA                     0x044b\n#define TT_MS_LANGID_MALAYALAM_INDIA                   0x044c\n#define TT_MS_LANGID_ASSAMESE_INDIA                    0x044d\n#define TT_MS_LANGID_MARATHI_INDIA                     0x044e\n#define TT_MS_LANGID_SANSKRIT_INDIA                    0x044f\n#define TT_MS_LANGID_MONGOLIAN_MONGOLIA /* Cyrillic */ 0x0450\n#define TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN      0x0850\n#define TT_MS_LANGID_TIBETAN_CHINA                     0x0451\n  /* Don't use the next constant!  It has            */\n  /*   (1) the wrong spelling (Dzonghka)             */\n  /*   (2) Microsoft doesn't officially define it -- */\n  /*       at least it is not in the List of Local   */\n  /*       ID Values.                                */\n  /*   (3) Dzongkha is not the same language as      */\n  /*       Tibetan, so merging it is wrong anyway.   */\n  /*                                                 */\n  /* TT_MS_LANGID_TIBETAN_BHUTAN is correct, BTW.    */\n#define TT_MS_LANGID_DZONGHKA_BHUTAN                   0x0851\n\n#if 0\n  /* the following used to be defined */\n#define TT_MS_LANGID_TIBETAN_BHUTAN                    0x0451\n  /* ... but it was changed; */\n#else\n  /* So we will continue to #define it, but with the correct value */\n#define TT_MS_LANGID_TIBETAN_BHUTAN   TT_MS_LANGID_DZONGHKA_BHUTAN\n#endif\n\n#define TT_MS_LANGID_WELSH_WALES                       0x0452\n#define TT_MS_LANGID_KHMER_CAMBODIA                    0x0453\n#define TT_MS_LANGID_LAO_LAOS                          0x0454\n#define TT_MS_LANGID_BURMESE_MYANMAR                   0x0455\n#define TT_MS_LANGID_GALICIAN_SPAIN                    0x0456\n#define TT_MS_LANGID_KONKANI_INDIA                     0x0457\n#define TT_MS_LANGID_MANIPURI_INDIA  /* Bengali */     0x0458\n#define TT_MS_LANGID_SINDHI_INDIA /* Arabic */         0x0459\n#define TT_MS_LANGID_SINDHI_PAKISTAN                   0x0859\n  /* Missing a LCID for Sindhi in Devanagari script */\n#define TT_MS_LANGID_SYRIAC_SYRIA                      0x045a\n#define TT_MS_LANGID_SINHALESE_SRI_LANKA               0x045b\n#define TT_MS_LANGID_CHEROKEE_UNITED_STATES            0x045c\n#define TT_MS_LANGID_INUKTITUT_CANADA                  0x045d\n#define TT_MS_LANGID_AMHARIC_ETHIOPIA                  0x045e\n#define TT_MS_LANGID_TAMAZIGHT_MOROCCO /* Arabic */    0x045f\n#define TT_MS_LANGID_TAMAZIGHT_MOROCCO_LATIN           0x085f\n  /* Missing a LCID for Tifinagh script */\n#define TT_MS_LANGID_KASHMIRI_PAKISTAN /* Arabic */    0x0460\n  /* Spelled this way by XPsp2 Platform SDK (2004-07-26) */\n  /* script is yet unclear... might be Arabic, Nagari or Sharada */\n#define TT_MS_LANGID_KASHMIRI_SASIA                    0x0860\n  /* ... and aliased (by MS) for compatibility reasons. */\n#define TT_MS_LANGID_KASHMIRI_INDIA TT_MS_LANGID_KASHMIRI_SASIA\n#define TT_MS_LANGID_NEPALI_NEPAL                      0x0461\n#define TT_MS_LANGID_NEPALI_INDIA                      0x0861\n#define TT_MS_LANGID_FRISIAN_NETHERLANDS               0x0462\n#define TT_MS_LANGID_PASHTO_AFGHANISTAN                0x0463\n#define TT_MS_LANGID_FILIPINO_PHILIPPINES              0x0464\n#define TT_MS_LANGID_DHIVEHI_MALDIVES                  0x0465\n  /* alias declared in Windows 2000 */\n#define TT_MS_LANGID_DIVEHI_MALDIVES  TT_MS_LANGID_DHIVEHI_MALDIVES\n#define TT_MS_LANGID_EDO_NIGERIA                       0x0466\n#define TT_MS_LANGID_FULFULDE_NIGERIA                  0x0467\n#define TT_MS_LANGID_HAUSA_NIGERIA                     0x0468\n#define TT_MS_LANGID_IBIBIO_NIGERIA                    0x0469\n#define TT_MS_LANGID_YORUBA_NIGERIA                    0x046a\n#define TT_MS_LANGID_QUECHUA_BOLIVIA                   0x046b\n#define TT_MS_LANGID_QUECHUA_ECUADOR                   0x086b\n#define TT_MS_LANGID_QUECHUA_PERU                      0x0c6b\n#define TT_MS_LANGID_SEPEDI_SOUTH_AFRICA               0x046c\n  /* Also spelled by XPsp2 Platform SDK (2004-07-26) */\n#define TT_MS_LANGID_SOTHO_SOUTHERN_SOUTH_AFRICA \\\n          TT_MS_LANGID_SEPEDI_SOUTH_AFRICA\n  /* language codes 0x046d, 0x046e and 0x046f are (still) unknown. */\n#define TT_MS_LANGID_IGBO_NIGERIA                      0x0470\n#define TT_MS_LANGID_KANURI_NIGERIA                    0x0471\n#define TT_MS_LANGID_OROMO_ETHIOPIA                    0x0472\n#define TT_MS_LANGID_TIGRIGNA_ETHIOPIA                 0x0473\n#define TT_MS_LANGID_TIGRIGNA_ERYTHREA                 0x0873\n  /* also spelled in the `Passport SDK' list as: */\n#define TT_MS_LANGID_TIGRIGNA_ERYTREA  TT_MS_LANGID_TIGRIGNA_ERYTHREA\n#define TT_MS_LANGID_GUARANI_PARAGUAY                  0x0474\n#define TT_MS_LANGID_HAWAIIAN_UNITED_STATES            0x0475\n#define TT_MS_LANGID_LATIN                             0x0476\n#define TT_MS_LANGID_SOMALI_SOMALIA                    0x0477\n  /* Note: Yi does not have a (proper) ISO 639-2 code, since it is mostly */\n  /*       not written (but OTOH the peculiar writing system is worth     */\n  /*       studying).                                                     */\n#define TT_MS_LANGID_YI_CHINA                          0x0478\n#define TT_MS_LANGID_PAPIAMENTU_NETHERLANDS_ANTILLES   0x0479\n  /* language codes from 0x047a to 0x047f are (still) unknown. */\n#define TT_MS_LANGID_UIGHUR_CHINA                      0x0480\n#define TT_MS_LANGID_MAORI_NEW_ZEALAND                 0x0481\n\n#if 0  /* not deemed useful for fonts */\n#define TT_MS_LANGID_HUMAN_INTERFACE_DEVICE            0x04ff\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Possible values of the `name' identifier field in the name records of */\n  /* the TTF `name' table.  These values are platform independent.         */\n  /*                                                                       */\n#define TT_NAME_ID_COPYRIGHT            0\n#define TT_NAME_ID_FONT_FAMILY          1\n#define TT_NAME_ID_FONT_SUBFAMILY       2\n#define TT_NAME_ID_UNIQUE_ID            3\n#define TT_NAME_ID_FULL_NAME            4\n#define TT_NAME_ID_VERSION_STRING       5\n#define TT_NAME_ID_PS_NAME              6\n#define TT_NAME_ID_TRADEMARK            7\n\n  /* the following values are from the OpenType spec */\n#define TT_NAME_ID_MANUFACTURER         8\n#define TT_NAME_ID_DESIGNER             9\n#define TT_NAME_ID_DESCRIPTION          10\n#define TT_NAME_ID_VENDOR_URL           11\n#define TT_NAME_ID_DESIGNER_URL         12\n#define TT_NAME_ID_LICENSE              13\n#define TT_NAME_ID_LICENSE_URL          14\n  /* number 15 is reserved */\n#define TT_NAME_ID_PREFERRED_FAMILY     16\n#define TT_NAME_ID_PREFERRED_SUBFAMILY  17\n#define TT_NAME_ID_MAC_FULL_NAME        18\n\n  /* The following code is new as of 2000-01-21 */\n#define TT_NAME_ID_SAMPLE_TEXT          19\n\n  /* This is new in OpenType 1.3 */\n#define TT_NAME_ID_CID_FINDFONT_NAME    20\n\n  /* This is new in OpenType 1.5 */\n#define TT_NAME_ID_WWS_FAMILY           21\n#define TT_NAME_ID_WWS_SUBFAMILY        22\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Bit mask values for the Unicode Ranges from the TTF `OS2 ' table.     */\n  /*                                                                       */\n  /* Updated 08-Nov-2008.                                                  */\n  /*                                                                       */\n\n  /* Bit  0   Basic Latin */\n#define TT_UCR_BASIC_LATIN                     (1L <<  0) /* U+0020-U+007E */\n  /* Bit  1   C1 Controls and Latin-1 Supplement */\n#define TT_UCR_LATIN1_SUPPLEMENT               (1L <<  1) /* U+0080-U+00FF */\n  /* Bit  2   Latin Extended-A */\n#define TT_UCR_LATIN_EXTENDED_A                (1L <<  2) /* U+0100-U+017F */\n  /* Bit  3   Latin Extended-B */\n#define TT_UCR_LATIN_EXTENDED_B                (1L <<  3) /* U+0180-U+024F */\n  /* Bit  4   IPA Extensions                 */\n  /*          Phonetic Extensions            */\n  /*          Phonetic Extensions Supplement */\n#define TT_UCR_IPA_EXTENSIONS                  (1L <<  4) /* U+0250-U+02AF */\n                                                          /* U+1D00-U+1D7F */\n                                                          /* U+1D80-U+1DBF */\n  /* Bit  5   Spacing Modifier Letters */\n  /*          Modifier Tone Letters    */\n#define TT_UCR_SPACING_MODIFIER                (1L <<  5) /* U+02B0-U+02FF */\n                                                          /* U+A700-U+A71F */\n  /* Bit  6   Combining Diacritical Marks            */\n  /*          Combining Diacritical Marks Supplement */\n#define TT_UCR_COMBINING_DIACRITICS            (1L <<  6) /* U+0300-U+036F */\n                                                          /* U+1DC0-U+1DFF */\n  /* Bit  7   Greek and Coptic */\n#define TT_UCR_GREEK                           (1L <<  7) /* U+0370-U+03FF */\n  /* Bit  8   Coptic */\n#define TT_UCR_COPTIC                          (1L <<  8) /* U+2C80-U+2CFF */\n  /* Bit  9   Cyrillic            */\n  /*          Cyrillic Supplement */\n  /*          Cyrillic Extended-A */\n  /*          Cyrillic Extended-B */\n#define TT_UCR_CYRILLIC                        (1L <<  9) /* U+0400-U+04FF */\n                                                          /* U+0500-U+052F */\n                                                          /* U+2DE0-U+2DFF */\n                                                          /* U+A640-U+A69F */\n  /* Bit 10   Armenian */\n#define TT_UCR_ARMENIAN                        (1L << 10) /* U+0530-U+058F */\n  /* Bit 11   Hebrew */\n#define TT_UCR_HEBREW                          (1L << 11) /* U+0590-U+05FF */\n  /* Bit 12   Vai */\n#define TT_UCR_VAI                             (1L << 12) /* U+A500-U+A63F */\n  /* Bit 13   Arabic            */\n  /*          Arabic Supplement */\n#define TT_UCR_ARABIC                          (1L << 13) /* U+0600-U+06FF */\n                                                          /* U+0750-U+077F */\n  /* Bit 14   NKo */\n#define TT_UCR_NKO                             (1L << 14) /* U+07C0-U+07FF */\n  /* Bit 15   Devanagari */\n#define TT_UCR_DEVANAGARI                      (1L << 15) /* U+0900-U+097F */\n  /* Bit 16   Bengali */\n#define TT_UCR_BENGALI                         (1L << 16) /* U+0980-U+09FF */\n  /* Bit 17   Gurmukhi */\n#define TT_UCR_GURMUKHI                        (1L << 17) /* U+0A00-U+0A7F */\n  /* Bit 18   Gujarati */\n#define TT_UCR_GUJARATI                        (1L << 18) /* U+0A80-U+0AFF */\n  /* Bit 19   Oriya */\n#define TT_UCR_ORIYA                           (1L << 19) /* U+0B00-U+0B7F */\n  /* Bit 20   Tamil */\n#define TT_UCR_TAMIL                           (1L << 20) /* U+0B80-U+0BFF */\n  /* Bit 21   Telugu */\n#define TT_UCR_TELUGU                          (1L << 21) /* U+0C00-U+0C7F */\n  /* Bit 22   Kannada */\n#define TT_UCR_KANNADA                         (1L << 22) /* U+0C80-U+0CFF */\n  /* Bit 23   Malayalam */\n#define TT_UCR_MALAYALAM                       (1L << 23) /* U+0D00-U+0D7F */\n  /* Bit 24   Thai */\n#define TT_UCR_THAI                            (1L << 24) /* U+0E00-U+0E7F */\n  /* Bit 25   Lao */\n#define TT_UCR_LAO                             (1L << 25) /* U+0E80-U+0EFF */\n  /* Bit 26   Georgian            */\n  /*          Georgian Supplement */\n#define TT_UCR_GEORGIAN                        (1L << 26) /* U+10A0-U+10FF */\n                                                          /* U+2D00-U+2D2F */\n  /* Bit 27   Balinese */\n#define TT_UCR_BALINESE                        (1L << 27) /* U+1B00-U+1B7F */\n  /* Bit 28   Hangul Jamo */\n#define TT_UCR_HANGUL_JAMO                     (1L << 28) /* U+1100-U+11FF */\n  /* Bit 29   Latin Extended Additional */\n  /*          Latin Extended-C          */\n  /*          Latin Extended-D          */\n#define TT_UCR_LATIN_EXTENDED_ADDITIONAL       (1L << 29) /* U+1E00-U+1EFF */\n                                                          /* U+2C60-U+2C7F */\n                                                          /* U+A720-U+A7FF */\n  /* Bit 30   Greek Extended */\n#define TT_UCR_GREEK_EXTENDED                  (1L << 30) /* U+1F00-U+1FFF */\n  /* Bit 31   General Punctuation      */\n  /*          Supplemental Punctuation */\n#define TT_UCR_GENERAL_PUNCTUATION             (1L << 31) /* U+2000-U+206F */\n                                                          /* U+2E00-U+2E7F */\n  /* Bit 32   Superscripts And Subscripts */\n#define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS         (1L <<  0) /* U+2070-U+209F */\n  /* Bit 33   Currency Symbols */\n#define TT_UCR_CURRENCY_SYMBOLS                (1L <<  1) /* U+20A0-U+20CF */\n  /* Bit 34   Combining Diacritical Marks For Symbols */\n#define TT_UCR_COMBINING_DIACRITICS_SYMB       (1L <<  2) /* U+20D0-U+20FF */\n  /* Bit 35   Letterlike Symbols */\n#define TT_UCR_LETTERLIKE_SYMBOLS              (1L <<  3) /* U+2100-U+214F */\n  /* Bit 36   Number Forms */\n#define TT_UCR_NUMBER_FORMS                    (1L <<  4) /* U+2150-U+218F */\n  /* Bit 37   Arrows                           */\n  /*          Supplemental Arrows-A            */\n  /*          Supplemental Arrows-B            */\n  /*          Miscellaneous Symbols and Arrows */\n#define TT_UCR_ARROWS                          (1L <<  5) /* U+2190-U+21FF */\n                                                          /* U+27F0-U+27FF */\n                                                          /* U+2900-U+297F */\n                                                          /* U+2B00-U+2BFF */\n  /* Bit 38   Mathematical Operators               */\n  /*          Supplemental Mathematical Operators  */\n  /*          Miscellaneous Mathematical Symbols-A */\n  /*          Miscellaneous Mathematical Symbols-B */\n#define TT_UCR_MATHEMATICAL_OPERATORS          (1L <<  6) /* U+2200-U+22FF */\n                                                          /* U+2A00-U+2AFF */\n                                                          /* U+27C0-U+27EF */\n                                                          /* U+2980-U+29FF */\n  /* Bit 39 Miscellaneous Technical */\n#define TT_UCR_MISCELLANEOUS_TECHNICAL         (1L <<  7) /* U+2300-U+23FF */\n  /* Bit 40   Control Pictures */\n#define TT_UCR_CONTROL_PICTURES                (1L <<  8) /* U+2400-U+243F */\n  /* Bit 41   Optical Character Recognition */\n#define TT_UCR_OCR                             (1L <<  9) /* U+2440-U+245F */\n  /* Bit 42   Enclosed Alphanumerics */\n#define TT_UCR_ENCLOSED_ALPHANUMERICS          (1L << 10) /* U+2460-U+24FF */\n  /* Bit 43   Box Drawing */\n#define TT_UCR_BOX_DRAWING                     (1L << 11) /* U+2500-U+257F */\n  /* Bit 44   Block Elements */\n#define TT_UCR_BLOCK_ELEMENTS                  (1L << 12) /* U+2580-U+259F */\n  /* Bit 45   Geometric Shapes */\n#define TT_UCR_GEOMETRIC_SHAPES                (1L << 13) /* U+25A0-U+25FF */\n  /* Bit 46   Miscellaneous Symbols */\n#define TT_UCR_MISCELLANEOUS_SYMBOLS           (1L << 14) /* U+2600-U+26FF */\n  /* Bit 47   Dingbats */\n#define TT_UCR_DINGBATS                        (1L << 15) /* U+2700-U+27BF */\n  /* Bit 48   CJK Symbols and Punctuation */\n#define TT_UCR_CJK_SYMBOLS                     (1L << 16) /* U+3000-U+303F */\n  /* Bit 49   Hiragana */\n#define TT_UCR_HIRAGANA                        (1L << 17) /* U+3040-U+309F */\n  /* Bit 50   Katakana                     */\n  /*          Katakana Phonetic Extensions */\n#define TT_UCR_KATAKANA                        (1L << 18) /* U+30A0-U+30FF */\n                                                          /* U+31F0-U+31FF */\n  /* Bit 51   Bopomofo          */\n  /*          Bopomofo Extended */\n#define TT_UCR_BOPOMOFO                        (1L << 19) /* U+3100-U+312F */\n                                                          /* U+31A0-U+31BF */\n  /* Bit 52   Hangul Compatibility Jamo */\n#define TT_UCR_HANGUL_COMPATIBILITY_JAMO       (1L << 20) /* U+3130-U+318F */\n  /* Bit 53   Phags-Pa */\n#define TT_UCR_CJK_MISC                        (1L << 21) /* U+A840-U+A87F */\n#define TT_UCR_KANBUN  TT_UCR_CJK_MISC /* deprecated */\n#define TT_UCR_PHAGSPA\n  /* Bit 54   Enclosed CJK Letters and Months */\n#define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS     (1L << 22) /* U+3200-U+32FF */\n  /* Bit 55   CJK Compatibility */\n#define TT_UCR_CJK_COMPATIBILITY               (1L << 23) /* U+3300-U+33FF */\n  /* Bit 56   Hangul Syllables */\n#define TT_UCR_HANGUL                          (1L << 24) /* U+AC00-U+D7A3 */\n  /* Bit 57   High Surrogates              */\n  /*          High Private Use Surrogates  */\n  /*          Low Surrogates               */\n  /*                                       */\n  /* According to OpenType specs v.1.3+,   */\n  /* setting bit 57 implies that there is  */\n  /* at least one codepoint beyond the     */\n  /* Basic Multilingual Plane that is      */\n  /* supported by this font.  So it really */\n  /* means >= U+10000                      */\n#define TT_UCR_SURROGATES                      (1L << 25) /* U+D800-U+DB7F */\n                                                          /* U+DB80-U+DBFF */\n                                                          /* U+DC00-U+DFFF */\n#define TT_UCR_NON_PLANE_0  TT_UCR_SURROGATES\n  /* Bit 58  Phoenician */\n#define TT_UCR_PHOENICIAN                      (1L << 26) /*U+10900-U+1091F*/\n  /* Bit 59   CJK Unified Ideographs             */\n  /*          CJK Radicals Supplement            */\n  /*          Kangxi Radicals                    */\n  /*          Ideographic Description Characters */\n  /*          CJK Unified Ideographs Extension A */\n  /*          CJK Unified Ideographs Extension B */\n  /*          Kanbun                             */\n#define TT_UCR_CJK_UNIFIED_IDEOGRAPHS          (1L << 27) /* U+4E00-U+9FFF */\n                                                          /* U+2E80-U+2EFF */\n                                                          /* U+2F00-U+2FDF */\n                                                          /* U+2FF0-U+2FFF */\n                                                          /* U+3400-U+4DB5 */\n                                                          /*U+20000-U+2A6DF*/\n                                                          /* U+3190-U+319F */\n  /* Bit 60   Private Use */\n#define TT_UCR_PRIVATE_USE                     (1L << 28) /* U+E000-U+F8FF */\n  /* Bit 61   CJK Strokes                             */\n  /*          CJK Compatibility Ideographs            */\n  /*          CJK Compatibility Ideographs Supplement */\n#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS    (1L << 29) /* U+31C0-U+31EF */\n                                                          /* U+F900-U+FAFF */\n                                                          /*U+2F800-U+2FA1F*/\n  /* Bit 62   Alphabetic Presentation Forms */\n#define TT_UCR_ALPHABETIC_PRESENTATION_FORMS   (1L << 30) /* U+FB00-U+FB4F */\n  /* Bit 63   Arabic Presentation Forms-A */\n#define TT_UCR_ARABIC_PRESENTATIONS_A          (1L << 31) /* U+FB50-U+FDFF */\n  /* Bit 64   Combining Half Marks */\n#define TT_UCR_COMBINING_HALF_MARKS            (1L <<  0) /* U+FE20-U+FE2F */\n  /* Bit 65   Vertical forms          */\n  /*          CJK Compatibility Forms */\n#define TT_UCR_CJK_COMPATIBILITY_FORMS         (1L <<  1) /* U+FE10-U+FE1F */\n                                                          /* U+FE30-U+FE4F */\n  /* Bit 66   Small Form Variants */\n#define TT_UCR_SMALL_FORM_VARIANTS             (1L <<  2) /* U+FE50-U+FE6F */\n  /* Bit 67   Arabic Presentation Forms-B */\n#define TT_UCR_ARABIC_PRESENTATIONS_B          (1L <<  3) /* U+FE70-U+FEFE */\n  /* Bit 68   Halfwidth and Fullwidth Forms */\n#define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS       (1L <<  4) /* U+FF00-U+FFEF */\n  /* Bit 69   Specials */\n#define TT_UCR_SPECIALS                        (1L <<  5) /* U+FFF0-U+FFFD */\n  /* Bit 70   Tibetan */\n#define TT_UCR_TIBETAN                         (1L <<  6) /* U+0F00-U+0FFF */\n  /* Bit 71   Syriac */\n#define TT_UCR_SYRIAC                          (1L <<  7) /* U+0700-U+074F */\n  /* Bit 72   Thaana */\n#define TT_UCR_THAANA                          (1L <<  8) /* U+0780-U+07BF */\n  /* Bit 73   Sinhala */\n#define TT_UCR_SINHALA                         (1L <<  9) /* U+0D80-U+0DFF */\n  /* Bit 74   Myanmar */\n#define TT_UCR_MYANMAR                         (1L << 10) /* U+1000-U+109F */\n  /* Bit 75   Ethiopic            */\n  /*          Ethiopic Supplement */\n  /*          Ethiopic Extended   */\n#define TT_UCR_ETHIOPIC                        (1L << 11) /* U+1200-U+137F */\n                                                          /* U+1380-U+139F */\n                                                          /* U+2D80-U+2DDF */\n  /* Bit 76   Cherokee */\n#define TT_UCR_CHEROKEE                        (1L << 12) /* U+13A0-U+13FF */\n  /* Bit 77   Unified Canadian Aboriginal Syllabics */\n#define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS   (1L << 13) /* U+1400-U+167F */\n  /* Bit 78   Ogham */\n#define TT_UCR_OGHAM                           (1L << 14) /* U+1680-U+169F */\n  /* Bit 79   Runic */\n#define TT_UCR_RUNIC                           (1L << 15) /* U+16A0-U+16FF */\n  /* Bit 80   Khmer         */\n  /*          Khmer Symbols */\n#define TT_UCR_KHMER                           (1L << 16) /* U+1780-U+17FF */\n                                                          /* U+19E0-U+19FF */\n  /* Bit 81   Mongolian */\n#define TT_UCR_MONGOLIAN                       (1L << 17) /* U+1800-U+18AF */\n  /* Bit 82   Braille Patterns */\n#define TT_UCR_BRAILLE                         (1L << 18) /* U+2800-U+28FF */\n  /* Bit 83   Yi Syllables */\n  /*          Yi Radicals  */\n#define TT_UCR_YI                              (1L << 19) /* U+A000-U+A48F */\n                                                          /* U+A490-U+A4CF */\n  /* Bit 84   Tagalog  */\n  /*          Hanunoo  */\n  /*          Buhid    */\n  /*          Tagbanwa */\n#define TT_UCR_PHILIPPINE                      (1L << 20) /* U+1700-U+171F */\n                                                          /* U+1720-U+173F */\n                                                          /* U+1740-U+175F */\n                                                          /* U+1760-U+177F */\n  /* Bit 85   Old Italic */\n#define TT_UCR_OLD_ITALIC                      (1L << 21) /*U+10300-U+1032F*/\n  /* Bit 86   Gothic */\n#define TT_UCR_GOTHIC                          (1L << 22) /*U+10330-U+1034F*/\n  /* Bit 87   Deseret */\n#define TT_UCR_DESERET                         (1L << 23) /*U+10400-U+1044F*/\n  /* Bit 88   Byzantine Musical Symbols      */\n  /*          Musical Symbols                */\n  /*          Ancient Greek Musical Notation */\n#define TT_UCR_MUSICAL_SYMBOLS                 (1L << 24) /*U+1D000-U+1D0FF*/\n                                                          /*U+1D100-U+1D1FF*/\n                                                          /*U+1D200-U+1D24F*/\n  /* Bit 89   Mathematical Alphanumeric Symbols */\n#define TT_UCR_MATH_ALPHANUMERIC_SYMBOLS       (1L << 25) /*U+1D400-U+1D7FF*/\n  /* Bit 90   Private Use (plane 15) */\n  /*          Private Use (plane 16) */\n#define TT_UCR_PRIVATE_USE_SUPPLEMENTARY       (1L << 26) /*U+F0000-U+FFFFD*/\n                                                        /*U+100000-U+10FFFD*/\n  /* Bit 91   Variation Selectors            */\n  /*          Variation Selectors Supplement */\n#define TT_UCR_VARIATION_SELECTORS             (1L << 27) /* U+FE00-U+FE0F */\n                                                          /*U+E0100-U+E01EF*/\n  /* Bit 92   Tags */\n#define TT_UCR_TAGS                            (1L << 28) /*U+E0000-U+E007F*/\n  /* Bit 93   Limbu */\n#define TT_UCR_LIMBU                           (1L << 29) /* U+1900-U+194F */\n  /* Bit 94   Tai Le */\n#define TT_UCR_TAI_LE                          (1L << 30) /* U+1950-U+197F */\n  /* Bit 95   New Tai Lue */\n#define TT_UCR_NEW_TAI_LUE                     (1L << 31) /* U+1980-U+19DF */\n  /* Bit 96   Buginese */\n#define TT_UCR_BUGINESE                        (1L <<  0) /* U+1A00-U+1A1F */\n  /* Bit 97   Glagolitic */\n#define TT_UCR_GLAGOLITIC                      (1L <<  1) /* U+2C00-U+2C5F */\n  /* Bit 98   Tifinagh */\n#define TT_UCR_TIFINAGH                        (1L <<  2) /* U+2D30-U+2D7F */\n  /* Bit 99   Yijing Hexagram Symbols */\n#define TT_UCR_YIJING                          (1L <<  3) /* U+4DC0-U+4DFF */\n  /* Bit 100  Syloti Nagri */\n#define TT_UCR_SYLOTI_NAGRI                    (1L <<  4) /* U+A800-U+A82F */\n  /* Bit 101  Linear B Syllabary */\n  /*          Linear B Ideograms */\n  /*          Aegean Numbers     */\n#define TT_UCR_LINEAR_B                        (1L <<  5) /*U+10000-U+1007F*/\n                                                          /*U+10080-U+100FF*/\n                                                          /*U+10100-U+1013F*/\n  /* Bit 102  Ancient Greek Numbers */\n#define TT_UCR_ANCIENT_GREEK_NUMBERS           (1L <<  6) /*U+10140-U+1018F*/\n  /* Bit 103  Ugaritic */\n#define TT_UCR_UGARITIC                        (1L <<  7) /*U+10380-U+1039F*/\n  /* Bit 104  Old Persian */\n#define TT_UCR_OLD_PERSIAN                     (1L <<  8) /*U+103A0-U+103DF*/\n  /* Bit 105  Shavian */\n#define TT_UCR_SHAVIAN                         (1L <<  9) /*U+10450-U+1047F*/\n  /* Bit 106  Osmanya */\n#define TT_UCR_OSMANYA                         (1L << 10) /*U+10480-U+104AF*/\n  /* Bit 107  Cypriot Syllabary */\n#define TT_UCR_CYPRIOT_SYLLABARY               (1L << 11) /*U+10800-U+1083F*/\n  /* Bit 108  Kharoshthi */\n#define TT_UCR_KHAROSHTHI                      (1L << 12) /*U+10A00-U+10A5F*/\n  /* Bit 109  Tai Xuan Jing Symbols */\n#define TT_UCR_TAI_XUAN_JING                   (1L << 13) /*U+1D300-U+1D35F*/\n  /* Bit 110  Cuneiform                         */\n  /*          Cuneiform Numbers and Punctuation */\n#define TT_UCR_CUNEIFORM                       (1L << 14) /*U+12000-U+123FF*/\n                                                          /*U+12400-U+1247F*/\n  /* Bit 111  Counting Rod Numerals */\n#define TT_UCR_COUNTING_ROD_NUMERALS           (1L << 15) /*U+1D360-U+1D37F*/\n  /* Bit 112  Sundanese */\n#define TT_UCR_SUNDANESE                       (1L << 16) /* U+1B80-U+1BBF */\n  /* Bit 113  Lepcha */\n#define TT_UCR_LEPCHA                          (1L << 17) /* U+1C00-U+1C4F */\n  /* Bit 114  Ol Chiki */\n#define TT_UCR_OL_CHIKI                        (1L << 18) /* U+1C50-U+1C7F */\n  /* Bit 115  Saurashtra */\n#define TT_UCR_SAURASHTRA                      (1L << 19) /* U+A880-U+A8DF */\n  /* Bit 116  Kayah Li */\n#define TT_UCR_KAYAH_LI                        (1L << 20) /* U+A900-U+A92F */\n  /* Bit 117  Rejang */\n#define TT_UCR_REJANG                          (1L << 21) /* U+A930-U+A95F */\n  /* Bit 118  Cham */\n#define TT_UCR_CHAM                            (1L << 22) /* U+AA00-U+AA5F */\n  /* Bit 119  Ancient Symbols */\n#define TT_UCR_ANCIENT_SYMBOLS                 (1L << 23) /*U+10190-U+101CF*/\n  /* Bit 120  Phaistos Disc */\n#define TT_UCR_PHAISTOS_DISC                   (1L << 24) /*U+101D0-U+101FF*/\n  /* Bit 121  Carian */\n  /*          Lycian */\n  /*          Lydian */\n#define TT_UCR_OLD_ANATOLIAN                   (1L << 25) /*U+102A0-U+102DF*/\n                                                          /*U+10280-U+1029F*/\n                                                          /*U+10920-U+1093F*/\n  /* Bit 122  Domino Tiles  */\n  /*          Mahjong Tiles */\n#define TT_UCR_GAME_TILES                      (1L << 26) /*U+1F030-U+1F09F*/\n                                                          /*U+1F000-U+1F02F*/\n  /* Bit 123-127 Reserved for process-internal usage */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Some compilers have a very limited length of identifiers.             */\n  /*                                                                       */\n#if defined( __TURBOC__ ) && __TURBOC__ < 0x0410 || defined( __PACIFIC__ )\n#define HAVE_LIMIT_ON_IDENTS\n#endif\n\n\n#ifndef HAVE_LIMIT_ON_IDENTS\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Here some alias #defines in order to be clearer.                      */\n  /*                                                                       */\n  /* These are not always #defined to stay within the 31~character limit   */\n  /* which some compilers have.                                            */\n  /*                                                                       */\n  /* Credits go to Dave Hoo <dhoo@flash.net> for pointing out that modern  */\n  /* Borland compilers (read: from BC++ 3.1 on) can increase this limit.   */\n  /* If you get a warning with such a compiler, use the -i40 switch.       */\n  /*                                                                       */\n#define TT_UCR_ARABIC_PRESENTATION_FORMS_A      \\\n         TT_UCR_ARABIC_PRESENTATIONS_A\n#define TT_UCR_ARABIC_PRESENTATION_FORMS_B      \\\n         TT_UCR_ARABIC_PRESENTATIONS_B\n\n#define TT_UCR_COMBINING_DIACRITICAL_MARKS      \\\n         TT_UCR_COMBINING_DIACRITICS\n#define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \\\n         TT_UCR_COMBINING_DIACRITICS_SYMB\n\n\n#endif /* !HAVE_LIMIT_ON_IDENTS */\n\n\nFT_END_HEADER\n\n#endif /* __TTNAMEID_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/tttables.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  tttables.h                                                             */\n/*                                                                         */\n/*    Basic SFNT/TrueType tables definitions and interface                 */\n/*    (specification only).                                                */\n/*                                                                         */\n/*  Copyright 1996-2005, 2008-2012 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTTABLES_H__\n#define __TTTABLES_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    truetype_tables                                                    */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    TrueType Tables                                                    */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    TrueType specific table types and functions.                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the definition of TrueType-specific tables   */\n  /*    as well as some routines used to access and process them.          */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_Header                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a TrueType font header table.  All       */\n  /*    fields follow the TrueType specification.                          */\n  /*                                                                       */\n  typedef struct  TT_Header_\n  {\n    FT_Fixed   Table_Version;\n    FT_Fixed   Font_Revision;\n\n    FT_Long    CheckSum_Adjust;\n    FT_Long    Magic_Number;\n\n    FT_UShort  Flags;\n    FT_UShort  Units_Per_EM;\n\n    FT_Long    Created [2];\n    FT_Long    Modified[2];\n\n    FT_Short   xMin;\n    FT_Short   yMin;\n    FT_Short   xMax;\n    FT_Short   yMax;\n\n    FT_UShort  Mac_Style;\n    FT_UShort  Lowest_Rec_PPEM;\n\n    FT_Short   Font_Direction;\n    FT_Short   Index_To_Loc_Format;\n    FT_Short   Glyph_Data_Format;\n\n  } TT_Header;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_HoriHeader                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a TrueType horizontal header, the `hhea' */\n  /*    table, as well as the corresponding horizontal metrics table,      */\n  /*    i.e., the `hmtx' table.                                            */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    Version                :: The table version.                       */\n  /*                                                                       */\n  /*    Ascender               :: The font's ascender, i.e., the distance  */\n  /*                              from the baseline to the top-most of all */\n  /*                              glyph points found in the font.          */\n  /*                                                                       */\n  /*                              This value is invalid in many fonts, as  */\n  /*                              it is usually set by the font designer,  */\n  /*                              and often reflects only a portion of the */\n  /*                              glyphs found in the font (maybe ASCII).  */\n  /*                                                                       */\n  /*                              You should use the `sTypoAscender' field */\n  /*                              of the OS/2 table instead if you want    */\n  /*                              the correct one.                         */\n  /*                                                                       */\n  /*    Descender              :: The font's descender, i.e., the distance */\n  /*                              from the baseline to the bottom-most of  */\n  /*                              all glyph points found in the font.  It  */\n  /*                              is negative.                             */\n  /*                                                                       */\n  /*                              This value is invalid in many fonts, as  */\n  /*                              it is usually set by the font designer,  */\n  /*                              and often reflects only a portion of the */\n  /*                              glyphs found in the font (maybe ASCII).  */\n  /*                                                                       */\n  /*                              You should use the `sTypoDescender'      */\n  /*                              field of the OS/2 table instead if you   */\n  /*                              want the correct one.                    */\n  /*                                                                       */\n  /*    Line_Gap               :: The font's line gap, i.e., the distance  */\n  /*                              to add to the ascender and descender to  */\n  /*                              get the BTB, i.e., the                   */\n  /*                              baseline-to-baseline distance for the    */\n  /*                              font.                                    */\n  /*                                                                       */\n  /*    advance_Width_Max      :: This field is the maximum of all advance */\n  /*                              widths found in the font.  It can be     */\n  /*                              used to compute the maximum width of an  */\n  /*                              arbitrary string of text.                */\n  /*                                                                       */\n  /*    min_Left_Side_Bearing  :: The minimum left side bearing of all     */\n  /*                              glyphs within the font.                  */\n  /*                                                                       */\n  /*    min_Right_Side_Bearing :: The minimum right side bearing of all    */\n  /*                              glyphs within the font.                  */\n  /*                                                                       */\n  /*    xMax_Extent            :: The maximum horizontal extent (i.e., the */\n  /*                              `width' of a glyph's bounding box) for   */\n  /*                              all glyphs in the font.                  */\n  /*                                                                       */\n  /*    caret_Slope_Rise       :: The rise coefficient of the cursor's     */\n  /*                              slope of the cursor (slope=rise/run).    */\n  /*                                                                       */\n  /*    caret_Slope_Run        :: The run coefficient of the cursor's      */\n  /*                              slope.                                   */\n  /*                                                                       */\n  /*    Reserved               :: 8~reserved bytes.                        */\n  /*                                                                       */\n  /*    metric_Data_Format     :: Always~0.                                */\n  /*                                                                       */\n  /*    number_Of_HMetrics     :: Number of HMetrics entries in the `hmtx' */\n  /*                              table -- this value can be smaller than  */\n  /*                              the total number of glyphs in the font.  */\n  /*                                                                       */\n  /*    long_metrics           :: A pointer into the `hmtx' table.         */\n  /*                                                                       */\n  /*    short_metrics          :: A pointer into the `hmtx' table.         */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should   */\n  /*               be identical except for the names of their fields which */\n  /*               are different.                                          */\n  /*                                                                       */\n  /*               This ensures that a single function in the `ttload'     */\n  /*               module is able to read both the horizontal and vertical */\n  /*               headers.                                                */\n  /*                                                                       */\n  typedef struct  TT_HoriHeader_\n  {\n    FT_Fixed   Version;\n    FT_Short   Ascender;\n    FT_Short   Descender;\n    FT_Short   Line_Gap;\n\n    FT_UShort  advance_Width_Max;      /* advance width maximum */\n\n    FT_Short   min_Left_Side_Bearing;  /* minimum left-sb       */\n    FT_Short   min_Right_Side_Bearing; /* minimum right-sb      */\n    FT_Short   xMax_Extent;            /* xmax extents          */\n    FT_Short   caret_Slope_Rise;\n    FT_Short   caret_Slope_Run;\n    FT_Short   caret_Offset;\n\n    FT_Short   Reserved[4];\n\n    FT_Short   metric_Data_Format;\n    FT_UShort  number_Of_HMetrics;\n\n    /* The following fields are not defined by the TrueType specification */\n    /* but they are used to connect the metrics header to the relevant    */\n    /* `HMTX' table.                                                      */\n\n    void*      long_metrics;\n    void*      short_metrics;\n\n  } TT_HoriHeader;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_VertHeader                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a TrueType vertical header, the `vhea'   */\n  /*    table, as well as the corresponding vertical metrics table, i.e.,  */\n  /*    the `vmtx' table.                                                  */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    Version                 :: The table version.                      */\n  /*                                                                       */\n  /*    Ascender                :: The font's ascender, i.e., the distance */\n  /*                               from the baseline to the top-most of    */\n  /*                               all glyph points found in the font.     */\n  /*                                                                       */\n  /*                               This value is invalid in many fonts, as */\n  /*                               it is usually set by the font designer, */\n  /*                               and often reflects only a portion of    */\n  /*                               the glyphs found in the font (maybe     */\n  /*                               ASCII).                                 */\n  /*                                                                       */\n  /*                               You should use the `sTypoAscender'      */\n  /*                               field of the OS/2 table instead if you  */\n  /*                               want the correct one.                   */\n  /*                                                                       */\n  /*    Descender               :: The font's descender, i.e., the         */\n  /*                               distance from the baseline to the       */\n  /*                               bottom-most of all glyph points found   */\n  /*                               in the font.  It is negative.           */\n  /*                                                                       */\n  /*                               This value is invalid in many fonts, as */\n  /*                               it is usually set by the font designer, */\n  /*                               and often reflects only a portion of    */\n  /*                               the glyphs found in the font (maybe     */\n  /*                               ASCII).                                 */\n  /*                                                                       */\n  /*                               You should use the `sTypoDescender'     */\n  /*                               field of the OS/2 table instead if you  */\n  /*                               want the correct one.                   */\n  /*                                                                       */\n  /*    Line_Gap                :: The font's line gap, i.e., the distance */\n  /*                               to add to the ascender and descender to */\n  /*                               get the BTB, i.e., the                  */\n  /*                               baseline-to-baseline distance for the   */\n  /*                               font.                                   */\n  /*                                                                       */\n  /*    advance_Height_Max      :: This field is the maximum of all        */\n  /*                               advance heights found in the font.  It  */\n  /*                               can be used to compute the maximum      */\n  /*                               height of an arbitrary string of text.  */\n  /*                                                                       */\n  /*    min_Top_Side_Bearing    :: The minimum top side bearing of all     */\n  /*                               glyphs within the font.                 */\n  /*                                                                       */\n  /*    min_Bottom_Side_Bearing :: The minimum bottom side bearing of all  */\n  /*                               glyphs within the font.                 */\n  /*                                                                       */\n  /*    yMax_Extent             :: The maximum vertical extent (i.e., the  */\n  /*                               `height' of a glyph's bounding box) for */\n  /*                               all glyphs in the font.                 */\n  /*                                                                       */\n  /*    caret_Slope_Rise        :: The rise coefficient of the cursor's    */\n  /*                               slope of the cursor (slope=rise/run).   */\n  /*                                                                       */\n  /*    caret_Slope_Run         :: The run coefficient of the cursor's     */\n  /*                               slope.                                  */\n  /*                                                                       */\n  /*    caret_Offset            :: The cursor's offset for slanted fonts.  */\n  /*                               This value is `reserved' in vmtx        */\n  /*                               version 1.0.                            */\n  /*                                                                       */\n  /*    Reserved                :: 8~reserved bytes.                       */\n  /*                                                                       */\n  /*    metric_Data_Format      :: Always~0.                               */\n  /*                                                                       */\n  /*    number_Of_HMetrics      :: Number of VMetrics entries in the       */\n  /*                               `vmtx' table -- this value can be       */\n  /*                               smaller than the total number of glyphs */\n  /*                               in the font.                            */\n  /*                                                                       */\n  /*    long_metrics           :: A pointer into the `vmtx' table.         */\n  /*                                                                       */\n  /*    short_metrics          :: A pointer into the `vmtx' table.         */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should   */\n  /*               be identical except for the names of their fields which */\n  /*               are different.                                          */\n  /*                                                                       */\n  /*               This ensures that a single function in the `ttload'     */\n  /*               module is able to read both the horizontal and vertical */\n  /*               headers.                                                */\n  /*                                                                       */\n  typedef struct  TT_VertHeader_\n  {\n    FT_Fixed   Version;\n    FT_Short   Ascender;\n    FT_Short   Descender;\n    FT_Short   Line_Gap;\n\n    FT_UShort  advance_Height_Max;      /* advance height maximum */\n\n    FT_Short   min_Top_Side_Bearing;    /* minimum left-sb or top-sb       */\n    FT_Short   min_Bottom_Side_Bearing; /* minimum right-sb or bottom-sb   */\n    FT_Short   yMax_Extent;             /* xmax or ymax extents            */\n    FT_Short   caret_Slope_Rise;\n    FT_Short   caret_Slope_Run;\n    FT_Short   caret_Offset;\n\n    FT_Short   Reserved[4];\n\n    FT_Short   metric_Data_Format;\n    FT_UShort  number_Of_VMetrics;\n\n    /* The following fields are not defined by the TrueType specification */\n    /* but they're used to connect the metrics header to the relevant     */\n    /* `HMTX' or `VMTX' table.                                            */\n\n    void*      long_metrics;\n    void*      short_metrics;\n\n  } TT_VertHeader;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_OS2                                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a TrueType OS/2 table. This is the long  */\n  /*    table version.  All fields comply to the TrueType specification.   */\n  /*                                                                       */\n  /*    Note that we now support old Mac fonts which do not include an     */\n  /*    OS/2 table.  In this case, the `version' field is always set to    */\n  /*    0xFFFF.                                                            */\n  /*                                                                       */\n  typedef struct  TT_OS2_\n  {\n    FT_UShort  version;                /* 0x0001 - more or 0xFFFF */\n    FT_Short   xAvgCharWidth;\n    FT_UShort  usWeightClass;\n    FT_UShort  usWidthClass;\n    FT_Short   fsType;\n    FT_Short   ySubscriptXSize;\n    FT_Short   ySubscriptYSize;\n    FT_Short   ySubscriptXOffset;\n    FT_Short   ySubscriptYOffset;\n    FT_Short   ySuperscriptXSize;\n    FT_Short   ySuperscriptYSize;\n    FT_Short   ySuperscriptXOffset;\n    FT_Short   ySuperscriptYOffset;\n    FT_Short   yStrikeoutSize;\n    FT_Short   yStrikeoutPosition;\n    FT_Short   sFamilyClass;\n\n    FT_Byte    panose[10];\n\n    FT_ULong   ulUnicodeRange1;        /* Bits 0-31   */\n    FT_ULong   ulUnicodeRange2;        /* Bits 32-63  */\n    FT_ULong   ulUnicodeRange3;        /* Bits 64-95  */\n    FT_ULong   ulUnicodeRange4;        /* Bits 96-127 */\n\n    FT_Char    achVendID[4];\n\n    FT_UShort  fsSelection;\n    FT_UShort  usFirstCharIndex;\n    FT_UShort  usLastCharIndex;\n    FT_Short   sTypoAscender;\n    FT_Short   sTypoDescender;\n    FT_Short   sTypoLineGap;\n    FT_UShort  usWinAscent;\n    FT_UShort  usWinDescent;\n\n    /* only version 1 tables: */\n\n    FT_ULong   ulCodePageRange1;       /* Bits 0-31   */\n    FT_ULong   ulCodePageRange2;       /* Bits 32-63  */\n\n    /* only version 2 tables: */\n\n    FT_Short   sxHeight;\n    FT_Short   sCapHeight;\n    FT_UShort  usDefaultChar;\n    FT_UShort  usBreakChar;\n    FT_UShort  usMaxContext;\n\n  } TT_OS2;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_Postscript                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a TrueType PostScript table.  All fields */\n  /*    comply to the TrueType specification.  This structure does not     */\n  /*    reference the PostScript glyph names, which can be nevertheless    */\n  /*    accessed with the `ttpost' module.                                 */\n  /*                                                                       */\n  typedef struct  TT_Postscript_\n  {\n    FT_Fixed  FormatType;\n    FT_Fixed  italicAngle;\n    FT_Short  underlinePosition;\n    FT_Short  underlineThickness;\n    FT_ULong  isFixedPitch;\n    FT_ULong  minMemType42;\n    FT_ULong  maxMemType42;\n    FT_ULong  minMemType1;\n    FT_ULong  maxMemType1;\n\n    /* Glyph names follow in the file, but we don't   */\n    /* load them by default.  See the ttpost.c file.  */\n\n  } TT_Postscript;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_PCLT                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a TrueType PCLT table.  All fields       */\n  /*    comply to the TrueType specification.                              */\n  /*                                                                       */\n  typedef struct  TT_PCLT_\n  {\n    FT_Fixed   Version;\n    FT_ULong   FontNumber;\n    FT_UShort  Pitch;\n    FT_UShort  xHeight;\n    FT_UShort  Style;\n    FT_UShort  TypeFamily;\n    FT_UShort  CapHeight;\n    FT_UShort  SymbolSet;\n    FT_Char    TypeFace[16];\n    FT_Char    CharacterComplement[8];\n    FT_Char    FileName[6];\n    FT_Char    StrokeWeight;\n    FT_Char    WidthType;\n    FT_Byte    SerifStyle;\n    FT_Byte    Reserved;\n\n  } TT_PCLT;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_MaxProfile                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The maximum profile is a table containing many max values which    */\n  /*    can be used to pre-allocate arrays.  This ensures that no memory   */\n  /*    allocation occurs during a glyph load.                             */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    version               :: The version number.                       */\n  /*                                                                       */\n  /*    numGlyphs             :: The number of glyphs in this TrueType     */\n  /*                             font.                                     */\n  /*                                                                       */\n  /*    maxPoints             :: The maximum number of points in a         */\n  /*                             non-composite TrueType glyph.  See also   */\n  /*                             the structure element                     */\n  /*                             `maxCompositePoints'.                     */\n  /*                                                                       */\n  /*    maxContours           :: The maximum number of contours in a       */\n  /*                             non-composite TrueType glyph.  See also   */\n  /*                             the structure element                     */\n  /*                             `maxCompositeContours'.                   */\n  /*                                                                       */\n  /*    maxCompositePoints    :: The maximum number of points in a         */\n  /*                             composite TrueType glyph.  See also the   */\n  /*                             structure element `maxPoints'.            */\n  /*                                                                       */\n  /*    maxCompositeContours  :: The maximum number of contours in a       */\n  /*                             composite TrueType glyph.  See also the   */\n  /*                             structure element `maxContours'.          */\n  /*                                                                       */\n  /*    maxZones              :: The maximum number of zones used for      */\n  /*                             glyph hinting.                            */\n  /*                                                                       */\n  /*    maxTwilightPoints     :: The maximum number of points in the       */\n  /*                             twilight zone used for glyph hinting.     */\n  /*                                                                       */\n  /*    maxStorage            :: The maximum number of elements in the     */\n  /*                             storage area used for glyph hinting.      */\n  /*                                                                       */\n  /*    maxFunctionDefs       :: The maximum number of function            */\n  /*                             definitions in the TrueType bytecode for  */\n  /*                             this font.                                */\n  /*                                                                       */\n  /*    maxInstructionDefs    :: The maximum number of instruction         */\n  /*                             definitions in the TrueType bytecode for  */\n  /*                             this font.                                */\n  /*                                                                       */\n  /*    maxStackElements      :: The maximum number of stack elements used */\n  /*                             during bytecode interpretation.           */\n  /*                                                                       */\n  /*    maxSizeOfInstructions :: The maximum number of TrueType opcodes    */\n  /*                             used for glyph hinting.                   */\n  /*                                                                       */\n  /*    maxComponentElements  :: The maximum number of simple (i.e., non-  */\n  /*                             composite) glyphs in a composite glyph.   */\n  /*                                                                       */\n  /*    maxComponentDepth     :: The maximum nesting depth of composite    */\n  /*                             glyphs.                                   */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This structure is only used during font loading.                   */\n  /*                                                                       */\n  typedef struct  TT_MaxProfile_\n  {\n    FT_Fixed   version;\n    FT_UShort  numGlyphs;\n    FT_UShort  maxPoints;\n    FT_UShort  maxContours;\n    FT_UShort  maxCompositePoints;\n    FT_UShort  maxCompositeContours;\n    FT_UShort  maxZones;\n    FT_UShort  maxTwilightPoints;\n    FT_UShort  maxStorage;\n    FT_UShort  maxFunctionDefs;\n    FT_UShort  maxInstructionDefs;\n    FT_UShort  maxStackElements;\n    FT_UShort  maxSizeOfInstructions;\n    FT_UShort  maxComponentElements;\n    FT_UShort  maxComponentDepth;\n\n  } TT_MaxProfile;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Sfnt_Tag                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration used to specify the index of an SFNT table.         */\n  /*    Used in the @FT_Get_Sfnt_Table API function.                       */\n  /*                                                                       */\n  typedef enum  FT_Sfnt_Tag_\n  {\n    ft_sfnt_head = 0,    /* TT_Header     */\n    ft_sfnt_maxp = 1,    /* TT_MaxProfile */\n    ft_sfnt_os2  = 2,    /* TT_OS2        */\n    ft_sfnt_hhea = 3,    /* TT_HoriHeader */\n    ft_sfnt_vhea = 4,    /* TT_VertHeader */\n    ft_sfnt_post = 5,    /* TT_Postscript */\n    ft_sfnt_pclt = 6,    /* TT_PCLT       */\n\n    sfnt_max   /* internal end mark */\n\n  } FT_Sfnt_Tag;\n\n  /* */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Sfnt_Table                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return a pointer to a given SFNT table within a face.              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to the source.                                    */\n  /*                                                                       */\n  /*    tag  :: The index of the SFNT table.                               */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A type-less pointer to the table.  This will be~0 in case of       */\n  /*    error, or if the corresponding table was not found *OR* loaded     */\n  /*    from the file.                                                     */\n  /*                                                                       */\n  /*    Use a typecast according to `tag' to access the structure          */\n  /*    elements.                                                          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The table is owned by the face object and disappears with it.      */\n  /*                                                                       */\n  /*    This function is only useful to access SFNT tables that are loaded */\n  /*    by the sfnt, truetype, and opentype drivers.  See @FT_Sfnt_Tag for */\n  /*    a list.                                                            */\n  /*                                                                       */\n  /*    Here an example how to access the `vhea' table:                    */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      TT_VertHeader*  vert_header;                                     */\n  /*                                                                       */\n  /*                                                                       */\n  /*      vert_header =                                                    */\n  /*        (TT_VertHeader*)FT_Get_Sfnt_Table( face, ft_sfnt_vhea );       */\n  /*    }                                                                  */\n  /*                                                                       */\n  FT_EXPORT( void* )\n  FT_Get_Sfnt_Table( FT_Face      face,\n                     FT_Sfnt_Tag  tag );\n\n\n /**************************************************************************\n  *\n  * @function:\n  *   FT_Load_Sfnt_Table\n  *\n  * @description:\n  *   Load any font table into client memory.\n  *\n  * @input:\n  *   face ::\n  *     A handle to the source face.\n  *\n  *   tag ::\n  *     The four-byte tag of the table to load.  Use the value~0 if you want\n  *     to access the whole font file.  Otherwise, you can use one of the\n  *     definitions found in the @FT_TRUETYPE_TAGS_H file, or forge a new\n  *     one with @FT_MAKE_TAG.\n  *\n  *   offset ::\n  *     The starting offset in the table (or file if tag == 0).\n  *\n  * @output:\n  *   buffer ::\n  *     The target buffer address.  The client must ensure that the memory\n  *     array is big enough to hold the data.\n  *\n  * @inout:\n  *   length ::\n  *     If the `length' parameter is NULL, then try to load the whole table.\n  *     Return an error code if it fails.\n  *\n  *     Else, if `*length' is~0, exit immediately while returning the\n  *     table's (or file) full size in it.\n  *\n  *     Else the number of bytes to read from the table or file, from the\n  *     starting offset.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   If you need to determine the table's length you should first call this\n  *   function with `*length' set to~0, as in the following example:\n  *\n  *     {\n  *       FT_ULong  length = 0;\n  *\n  *\n  *       error = FT_Load_Sfnt_Table( face, tag, 0, NULL, &length );\n  *       if ( error ) { ... table does not exist ... }\n  *\n  *       buffer = malloc( length );\n  *       if ( buffer == NULL ) { ... not enough memory ... }\n  *\n  *       error = FT_Load_Sfnt_Table( face, tag, 0, buffer, &length );\n  *       if ( error ) { ... could not load table ... }\n  *     }\n  */\n  FT_EXPORT( FT_Error )\n  FT_Load_Sfnt_Table( FT_Face    face,\n                      FT_ULong   tag,\n                      FT_Long    offset,\n                      FT_Byte*   buffer,\n                      FT_ULong*  length );\n\n\n /**************************************************************************\n  *\n  * @function:\n  *   FT_Sfnt_Table_Info\n  *\n  * @description:\n  *   Return information on an SFNT table.\n  *\n  * @input:\n  *   face ::\n  *     A handle to the source face.\n  *\n  *   table_index ::\n  *     The index of an SFNT table.  The function returns\n  *     FT_Err_Table_Missing for an invalid value.\n  *\n  * @inout:\n  *   tag ::\n  *     The name tag of the SFNT table.  If the value is NULL, `table_index'\n  *     is ignored, and `length' returns the number of SFNT tables in the\n  *     font.\n  *\n  * @output:\n  *   length ::\n  *     The length of the SFNT table (or the number of SFNT tables, depending\n  *     on `tag').\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   While parsing fonts, FreeType handles SFNT tables with length zero as\n  *   missing.\n  *\n  */\n  FT_EXPORT( FT_Error )\n  FT_Sfnt_Table_Info( FT_Face    face,\n                      FT_UInt    table_index,\n                      FT_ULong  *tag,\n                      FT_ULong  *length );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_CMap_Language_ID                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return TrueType/sfnt specific cmap language ID.  Definitions of    */\n  /*    language ID values are in `freetype/ttnameid.h'.                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    charmap ::                                                         */\n  /*      The target charmap.                                              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The language ID of `charmap'.  If `charmap' doesn't belong to a    */\n  /*    TrueType/sfnt face, just return~0 as the default value.            */\n  /*                                                                       */\n  /*    For a format~14 cmap (to access Unicode IVS), the return value is  */\n  /*    0xFFFFFFFF.                                                        */\n  /*                                                                       */\n  FT_EXPORT( FT_ULong )\n  FT_Get_CMap_Language_ID( FT_CharMap  charmap );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_CMap_Format                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return TrueType/sfnt specific cmap format.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    charmap ::                                                         */\n  /*      The target charmap.                                              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The format of `charmap'.  If `charmap' doesn't belong to a         */\n  /*    TrueType/sfnt face, return -1.                                     */\n  /*                                                                       */\n  FT_EXPORT( FT_Long )\n  FT_Get_CMap_Format( FT_CharMap  charmap );\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __TTTABLES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/tttags.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  tttags.h                                                               */\n/*                                                                         */\n/*    Tags for TrueType and OpenType tables (specification only).          */\n/*                                                                         */\n/*  Copyright 1996-2001, 2004, 2005, 2007, 2008, 2013 by                   */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTAGS_H__\n#define __TTAGS_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n#define TTAG_avar  FT_MAKE_TAG( 'a', 'v', 'a', 'r' )\n#define TTAG_BASE  FT_MAKE_TAG( 'B', 'A', 'S', 'E' )\n#define TTAG_bdat  FT_MAKE_TAG( 'b', 'd', 'a', 't' )\n#define TTAG_BDF   FT_MAKE_TAG( 'B', 'D', 'F', ' ' )\n#define TTAG_bhed  FT_MAKE_TAG( 'b', 'h', 'e', 'd' )\n#define TTAG_bloc  FT_MAKE_TAG( 'b', 'l', 'o', 'c' )\n#define TTAG_bsln  FT_MAKE_TAG( 'b', 's', 'l', 'n' )\n#define TTAG_CBDT  FT_MAKE_TAG( 'C', 'B', 'D', 'T' )\n#define TTAG_CBLC  FT_MAKE_TAG( 'C', 'B', 'L', 'C' )\n#define TTAG_CFF   FT_MAKE_TAG( 'C', 'F', 'F', ' ' )\n#define TTAG_CID   FT_MAKE_TAG( 'C', 'I', 'D', ' ' )\n#define TTAG_cmap  FT_MAKE_TAG( 'c', 'm', 'a', 'p' )\n#define TTAG_cvar  FT_MAKE_TAG( 'c', 'v', 'a', 'r' )\n#define TTAG_cvt   FT_MAKE_TAG( 'c', 'v', 't', ' ' )\n#define TTAG_DSIG  FT_MAKE_TAG( 'D', 'S', 'I', 'G' )\n#define TTAG_EBDT  FT_MAKE_TAG( 'E', 'B', 'D', 'T' )\n#define TTAG_EBLC  FT_MAKE_TAG( 'E', 'B', 'L', 'C' )\n#define TTAG_EBSC  FT_MAKE_TAG( 'E', 'B', 'S', 'C' )\n#define TTAG_feat  FT_MAKE_TAG( 'f', 'e', 'a', 't' )\n#define TTAG_FOND  FT_MAKE_TAG( 'F', 'O', 'N', 'D' )\n#define TTAG_fpgm  FT_MAKE_TAG( 'f', 'p', 'g', 'm' )\n#define TTAG_fvar  FT_MAKE_TAG( 'f', 'v', 'a', 'r' )\n#define TTAG_gasp  FT_MAKE_TAG( 'g', 'a', 's', 'p' )\n#define TTAG_GDEF  FT_MAKE_TAG( 'G', 'D', 'E', 'F' )\n#define TTAG_glyf  FT_MAKE_TAG( 'g', 'l', 'y', 'f' )\n#define TTAG_GPOS  FT_MAKE_TAG( 'G', 'P', 'O', 'S' )\n#define TTAG_GSUB  FT_MAKE_TAG( 'G', 'S', 'U', 'B' )\n#define TTAG_gvar  FT_MAKE_TAG( 'g', 'v', 'a', 'r' )\n#define TTAG_hdmx  FT_MAKE_TAG( 'h', 'd', 'm', 'x' )\n#define TTAG_head  FT_MAKE_TAG( 'h', 'e', 'a', 'd' )\n#define TTAG_hhea  FT_MAKE_TAG( 'h', 'h', 'e', 'a' )\n#define TTAG_hmtx  FT_MAKE_TAG( 'h', 'm', 't', 'x' )\n#define TTAG_JSTF  FT_MAKE_TAG( 'J', 'S', 'T', 'F' )\n#define TTAG_just  FT_MAKE_TAG( 'j', 'u', 's', 't' )\n#define TTAG_kern  FT_MAKE_TAG( 'k', 'e', 'r', 'n' )\n#define TTAG_lcar  FT_MAKE_TAG( 'l', 'c', 'a', 'r' )\n#define TTAG_loca  FT_MAKE_TAG( 'l', 'o', 'c', 'a' )\n#define TTAG_LTSH  FT_MAKE_TAG( 'L', 'T', 'S', 'H' )\n#define TTAG_LWFN  FT_MAKE_TAG( 'L', 'W', 'F', 'N' )\n#define TTAG_MATH  FT_MAKE_TAG( 'M', 'A', 'T', 'H' )\n#define TTAG_maxp  FT_MAKE_TAG( 'm', 'a', 'x', 'p' )\n#define TTAG_META  FT_MAKE_TAG( 'M', 'E', 'T', 'A' )\n#define TTAG_MMFX  FT_MAKE_TAG( 'M', 'M', 'F', 'X' )\n#define TTAG_MMSD  FT_MAKE_TAG( 'M', 'M', 'S', 'D' )\n#define TTAG_mort  FT_MAKE_TAG( 'm', 'o', 'r', 't' )\n#define TTAG_morx  FT_MAKE_TAG( 'm', 'o', 'r', 'x' )\n#define TTAG_name  FT_MAKE_TAG( 'n', 'a', 'm', 'e' )\n#define TTAG_opbd  FT_MAKE_TAG( 'o', 'p', 'b', 'd' )\n#define TTAG_OS2   FT_MAKE_TAG( 'O', 'S', '/', '2' )\n#define TTAG_OTTO  FT_MAKE_TAG( 'O', 'T', 'T', 'O' )\n#define TTAG_PCLT  FT_MAKE_TAG( 'P', 'C', 'L', 'T' )\n#define TTAG_POST  FT_MAKE_TAG( 'P', 'O', 'S', 'T' )\n#define TTAG_post  FT_MAKE_TAG( 'p', 'o', 's', 't' )\n#define TTAG_prep  FT_MAKE_TAG( 'p', 'r', 'e', 'p' )\n#define TTAG_prop  FT_MAKE_TAG( 'p', 'r', 'o', 'p' )\n#define TTAG_sfnt  FT_MAKE_TAG( 's', 'f', 'n', 't' )\n#define TTAG_SING  FT_MAKE_TAG( 'S', 'I', 'N', 'G' )\n#define TTAG_trak  FT_MAKE_TAG( 't', 'r', 'a', 'k' )\n#define TTAG_true  FT_MAKE_TAG( 't', 'r', 'u', 'e' )\n#define TTAG_ttc   FT_MAKE_TAG( 't', 't', 'c', ' ' )\n#define TTAG_ttcf  FT_MAKE_TAG( 't', 't', 'c', 'f' )\n#define TTAG_TYP1  FT_MAKE_TAG( 'T', 'Y', 'P', '1' )\n#define TTAG_typ1  FT_MAKE_TAG( 't', 'y', 'p', '1' )\n#define TTAG_VDMX  FT_MAKE_TAG( 'V', 'D', 'M', 'X' )\n#define TTAG_vhea  FT_MAKE_TAG( 'v', 'h', 'e', 'a' )\n#define TTAG_vmtx  FT_MAKE_TAG( 'v', 'm', 't', 'x' )\n\n\nFT_END_HEADER\n\n#endif /* __TTAGS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ttunpat.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttunpat.h                                                              */\n/*                                                                         */\n/*    Definitions for the unpatented TrueType hinting system               */\n/*                                                                         */\n/*  Copyright 2003, 2006 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  Written by Graham Asher <graham.asher@btinternet.com>                  */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTUNPAT_H__\n#define __TTUNPAT_H__\n\n\n#include \"../ft2build.h\"\n#include \"freetype.h\"\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n /***************************************************************************\n  *\n  * @constant:\n  *   FT_PARAM_TAG_UNPATENTED_HINTING\n  *\n  * @description:\n  *   A constant used as the tag of an @FT_Parameter structure to indicate\n  *   that unpatented methods only should be used by the TrueType bytecode\n  *   interpreter for a typeface opened by @FT_Open_Face.\n  *\n  */\n#define FT_PARAM_TAG_UNPATENTED_HINTING  FT_MAKE_TAG( 'u', 'n', 'p', 'a' )\n\n /* */\n\nFT_END_HEADER\n\n\n#endif /* __TTUNPAT_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/include/ft2build.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ft2build.h                                                             */\n/*                                                                         */\n/*    FreeType 2 build and setup macros.                                   */\n/*    (Generic version)                                                    */\n/*                                                                         */\n/*  Copyright 1996-2001, 2006 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file corresponds to the default `ft2build.h' file for            */\n  /* FreeType 2.  It uses the `freetype' include root.                     */\n  /*                                                                       */\n  /* Note that specific platforms might use a different configuration.     */\n  /* See builds/unix/ft2unix.h for an example.                             */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FT2_BUILD_GENERIC_H__\n#define __FT2_BUILD_GENERIC_H__\n\n#include \"foxitnames.h\"\n#include \"freetype/config/ftheader.h\"\n\n#endif /* __FT2_BUILD_GENERIC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/Jamfile",
    "content": "# FreeType 2 src/base Jamfile\n#\n# Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) base ;\n\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = ftadvanc ftcalc   ftdbgmem ftgloadr\n               ftobjs   ftoutln  ftrfork  ftsnames\n               ftstream fttrigon ftutil\n               basepic  ftpic\n               ;\n  }\n  else\n  {\n    _sources = ftbase ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# Add the optional/replaceable files.\n#\n{\n  local  _sources = bbox   bdf    bitmap debug  gasp\n                    glyph  gxval  init   lcdfil mm\n                    otval  pfr    stroke synth  system\n                    type1  winfnt xf86   patent\n                    ;\n\n  Library  $(FT2_LIB) : ft$(_sources).c ;\n}\n\n# Add Macintosh-specific file to the library when necessary.\n#\nif $(MAC)\n{\n  Library  $(FT2_LIB) : ftmac.c ;\n}\nelse if $(OS) = MACOSX\n{\n  if $(FT2_MULTI)\n  {\n    Library  $(FT2_LIB) : ftmac.c ;\n  }\n}\n\n# end of src/base Jamfile\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/basepic.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  basepic.c                                                              */\n/*                                                                         */\n/*    The FreeType position independent code services for base.            */\n/*                                                                         */\n/*  Copyright 2009, 2012 by                                                */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/freetype.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"basepic.h\"\n\n\n#ifdef FT_CONFIG_OPTION_PIC\n\n  /* forward declaration of PIC init functions from ftglyph.c */\n  void\n  FT_Init_Class_ft_outline_glyph_class( FT_Glyph_Class*  clazz );\n\n  void\n  FT_Init_Class_ft_bitmap_glyph_class( FT_Glyph_Class*  clazz );\n\n#ifdef FT_CONFIG_OPTION_MAC_FONTS\n  /* forward declaration of PIC init function from ftrfork.c */\n  /* (not modularized)                                       */\n  void\n  FT_Init_Table_raccess_guess_table( ft_raccess_guess_rec*  record );\n#endif\n\n  /* forward declaration of PIC init functions from ftinit.c */\n  FT_Error\n  ft_create_default_module_classes( FT_Library  library );\n\n  void\n  ft_destroy_default_module_classes( FT_Library  library );\n\n\n  void\n  ft_base_pic_free( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Memory          memory        = library->memory;\n\n\n    if ( pic_container->base )\n    {\n      /* destroy default module classes            */\n      /* (in case FT_Add_Default_Modules was used) */\n      ft_destroy_default_module_classes( library );\n\n      FT_FREE( pic_container->base );\n      pic_container->base = NULL;\n    }\n  }\n\n\n  FT_Error\n  ft_base_pic_init( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Error           error         = FT_Err_Ok;\n    BasePIC*           container     = NULL;\n    FT_Memory          memory        = library->memory;\n\n\n    /* allocate pointer, clear and set global container pointer */\n    if ( FT_ALLOC( container, sizeof ( *container ) ) )\n      return error;\n    FT_MEM_SET( container, 0, sizeof ( *container ) );\n    pic_container->base = container;\n\n    /* initialize default modules list and pointers */\n    error = ft_create_default_module_classes( library );\n    if ( error )\n      goto Exit;\n\n    /* initialize pointer table -                       */\n    /* this is how the module usually expects this data */\n    FT_Init_Class_ft_outline_glyph_class(\n      &container->ft_outline_glyph_class );\n    FT_Init_Class_ft_bitmap_glyph_class(\n      &container->ft_bitmap_glyph_class );\n#ifdef FT_CONFIG_OPTION_MAC_FONTS\n    FT_Init_Table_raccess_guess_table(\n      (ft_raccess_guess_rec*)&container->ft_raccess_guess_table );\n#endif\n\n  Exit:\n    if ( error )\n      ft_base_pic_free( library );\n    return error;\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/basepic.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  basepic.h                                                              */\n/*                                                                         */\n/*    The FreeType position independent code services for base.            */\n/*                                                                         */\n/*  Copyright 2009 by                                                      */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __BASEPIC_H__\n#define __BASEPIC_H__\n\n\nFT_BEGIN_HEADER\n\n#include \"../../include/freetype/internal/ftpic.h\"\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_OUTLINE_GLYPH_CLASS_GET  &ft_outline_glyph_class\n#define FT_BITMAP_GLYPH_CLASS_GET   &ft_bitmap_glyph_class\n#define FT_DEFAULT_MODULES_GET      ft_default_modules\n\n#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK\n#define FT_RACCESS_GUESS_TABLE_GET  ft_raccess_guess_table\n#endif\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#include \"../../include/freetype/ftglyph.h\"\n\n#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK\n#include \"../../include/freetype/internal/ftrfork.h\"\n#endif\n\n\n  typedef struct  BasePIC_\n  {\n    FT_Module_Class**  default_module_classes;\n    FT_Glyph_Class     ft_outline_glyph_class;\n    FT_Glyph_Class     ft_bitmap_glyph_class;\n\n#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK\n    ft_raccess_guess_rec  ft_raccess_guess_table[FT_RACCESS_N_RULES];\n#endif\n\n  } BasePIC;\n\n\n#define GET_PIC( lib )  ( (BasePIC*)( (lib)->pic_container.base ) )\n\n#define FT_OUTLINE_GLYPH_CLASS_GET                      \\\n          ( &GET_PIC( library )->ft_outline_glyph_class )\n#define FT_BITMAP_GLYPH_CLASS_GET                        \\\n          ( &GET_PIC( library )->ft_bitmap_glyph_class )\n#define FT_DEFAULT_MODULES_GET                           \\\n          ( GET_PIC( library )->default_module_classes )\n\n#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK\n#define FT_RACCESS_GUESS_TABLE_GET                       \\\n          ( GET_PIC( library )->ft_raccess_guess_table )\n#endif\n\n\n  /* see basepic.c for the implementation */\n  void\n  ft_base_pic_free( FT_Library  library );\n\n  FT_Error\n  ft_base_pic_init( FT_Library  library );\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\nFT_END_HEADER\n\n#endif /* __BASEPIC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftadvanc.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftadvanc.c                                                             */\n/*                                                                         */\n/*    Quick computation of advance widths (body).                          */\n/*                                                                         */\n/*  Copyright 2008, 2009, 2011, 2013 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n\n#include \"../../include/freetype/ftadvanc.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n\n\n  static FT_Error\n  _ft_face_scale_advances( FT_Face    face,\n                           FT_Fixed*  advances,\n                           FT_UInt    count,\n                           FT_Int32   flags )\n  {\n    FT_Fixed  scale;\n    FT_UInt   nn;\n\n\n    if ( flags & FT_LOAD_NO_SCALE )\n      return FT_Err_Ok;\n\n    if ( face->size == NULL )\n      return FT_THROW( Invalid_Size_Handle );\n\n    if ( flags & FT_LOAD_VERTICAL_LAYOUT )\n      scale = face->size->metrics.y_scale;\n    else\n      scale = face->size->metrics.x_scale;\n\n    /* this must be the same scaling as to get linear{Hori,Vert}Advance */\n    /* (see `FT_Load_Glyph' implementation in src/base/ftobjs.c)        */\n\n    for ( nn = 0; nn < count; nn++ )\n      advances[nn] = FT_MulDiv( advances[nn], scale, 64 );\n\n    return FT_Err_Ok;\n  }\n\n\n   /* at the moment, we can perform fast advance retrieval only in */\n   /* the following cases:                                         */\n   /*                                                              */\n   /*  - unscaled load                                             */\n   /*  - unhinted load                                             */\n   /*  - light-hinted load                                         */\n\n#define LOAD_ADVANCE_FAST_CHECK( flags )                            \\\n          ( flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING )    || \\\n            FT_LOAD_TARGET_MODE( flags ) == FT_RENDER_MODE_LIGHT )\n\n\n  /* documentation is in ftadvanc.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_Advance( FT_Face    face,\n                  FT_UInt    gindex,\n                  FT_Int32   flags,\n                  FT_Fixed  *padvance )\n  {\n    FT_Face_GetAdvancesFunc  func;\n\n\n    if ( !face )\n      return FT_THROW( Invalid_Face_Handle );\n\n    if ( gindex >= (FT_UInt)face->num_glyphs )\n      return FT_THROW( Invalid_Glyph_Index );\n\n    func = face->driver->clazz->get_advances;\n    if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) )\n    {\n      FT_Error  error;\n\n\n      error = func( face, gindex, 1, flags, padvance );\n      if ( !error )\n        return _ft_face_scale_advances( face, padvance, 1, flags );\n\n      if ( FT_ERR_NEQ( error, Unimplemented_Feature ) )\n        return error;\n    }\n\n    return FT_Get_Advances( face, gindex, 1, flags, padvance );\n  }\n\n\n  /* documentation is in ftadvanc.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_Advances( FT_Face    face,\n                   FT_UInt    start,\n                   FT_UInt    count,\n                   FT_Int32   flags,\n                   FT_Fixed  *padvances )\n  {\n    FT_Face_GetAdvancesFunc  func;\n    FT_UInt                  num, end, nn;\n    FT_Error                 error = FT_Err_Ok;\n\n\n    if ( !face )\n      return FT_THROW( Invalid_Face_Handle );\n\n    num = (FT_UInt)face->num_glyphs;\n    end = start + count;\n    if ( start >= num || end < start || end > num )\n      return FT_THROW( Invalid_Glyph_Index );\n\n    if ( count == 0 )\n      return FT_Err_Ok;\n\n    func = face->driver->clazz->get_advances;\n    if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) )\n    {\n      error = func( face, start, count, flags, padvances );\n      if ( !error )\n        return _ft_face_scale_advances( face, padvances, count, flags );\n\n      if ( FT_ERR_NEQ( error, Unimplemented_Feature ) )\n        return error;\n    }\n\n    error = FT_Err_Ok;\n\n    if ( flags & FT_ADVANCE_FLAG_FAST_ONLY )\n      return FT_THROW( Unimplemented_Feature );\n\n    flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY;\n    for ( nn = 0; nn < count; nn++ )\n    {\n      error = FT_Load_Glyph( face, start + nn, flags );\n      if ( error )\n        break;\n\n      /* scale from 26.6 to 16.16 */\n      padvances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT )\n                      ? face->glyph->advance.y << 10\n                      : face->glyph->advance.x << 10;\n    }\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftapi.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftapi.c                                                                */\n/*                                                                         */\n/*    The FreeType compatibility functions (body).                         */\n/*                                                                         */\n/*  Copyright 2002 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/ftlist.h\"\n#include \"../../include/freetype/ftoutln.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/tttables.h\"\n#include \"../../include/freetype/ftoutln.h\"\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                 C O M P A T I B I L I T Y                       ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* backwards compatibility API */\n\n  FT_BASE_DEF( void )\n  FT_New_Memory_Stream( FT_Library  library,\n                        FT_Byte*    base,\n                        FT_ULong    size,\n                        FT_Stream   stream )\n  {\n    FT_UNUSED( library );\n\n    FT_Stream_OpenMemory( stream, base, size );\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Seek_Stream( FT_Stream  stream,\n                  FT_ULong   pos )\n  {\n    return FT_Stream_Seek( stream, pos );\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Skip_Stream( FT_Stream  stream,\n                  FT_Long    distance )\n  {\n    return FT_Stream_Skip( stream, distance );\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Read_Stream( FT_Stream  stream,\n                  FT_Byte*   buffer,\n                  FT_ULong   count )\n  {\n    return FT_Stream_Read( stream, buffer, count );\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Read_Stream_At( FT_Stream  stream,\n                     FT_ULong   pos,\n                     FT_Byte*   buffer,\n                     FT_ULong   count )\n  {\n    return FT_Stream_ReadAt( stream, pos, buffer, count );\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Extract_Frame( FT_Stream  stream,\n                    FT_ULong   count,\n                    FT_Byte**  pbytes )\n  {\n    return FT_Stream_ExtractFrame( stream, count, pbytes );\n  }\n\n\n  FT_BASE_DEF( void )\n  FT_Release_Frame( FT_Stream  stream,\n                    FT_Byte**  pbytes )\n  {\n    FT_Stream_ReleaseFrame( stream, pbytes );\n  }\n\n  FT_BASE_DEF( FT_Error )\n  FT_Access_Frame( FT_Stream  stream,\n                   FT_ULong   count )\n  {\n    return FT_Stream_EnterFrame( stream, count );\n  }\n\n\n  FT_BASE_DEF( void )\n  FT_Forget_Frame( FT_Stream  stream )\n  {\n    FT_Stream_ExitFrame( stream );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbase.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftbase.h                                                               */\n/*                                                                         */\n/*    The FreeType private functions used in base module (specification).  */\n/*                                                                         */\n/*  Copyright 2008, 2010 by                                                */\n/*  David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya.      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTBASE_H__\n#define __FTBASE_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /* Assume the stream is sfnt-wrapped PS Type1 or sfnt-wrapped CID-keyed */\n  /* font, and try to load a face specified by the face_index.            */\n  FT_LOCAL( FT_Error )\n  open_face_PS_from_sfnt_stream( FT_Library     library,\n                                 FT_Stream      stream,\n                                 FT_Long        face_index,\n                                 FT_Int         num_params,\n                                 FT_Parameter  *params,\n                                 FT_Face       *aface );\n\n\n  /* Create a new FT_Face given a buffer and a driver name. */\n  /* From ftmac.c.                                          */\n  FT_LOCAL( FT_Error )\n  open_face_from_buffer( FT_Library   library,\n                         FT_Byte*     base,\n                         FT_ULong     size,\n                         FT_Long      face_index,\n                         const char*  driver_name,\n                         FT_Face     *aface );\n\n\n#if  defined( FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK ) && \\\n    !defined( FT_MACINTOSH )\n  /* Mac OS X/Darwin kernel often changes recommended method to access */\n  /* the resource fork and older methods makes the kernel issue the    */\n  /* warning of deprecated method.  To calm it down, the methods based */\n  /* on Darwin VFS should be grouped and skip the rest methods after   */\n  /* the case the resource is opened but found to lack a font in it.   */\n  FT_LOCAL( FT_Bool )\n  ft_raccess_rule_by_darwin_vfs( FT_Library library, FT_UInt  rule_index );\n#endif\n\n\nFT_END_HEADER\n\n#endif /* __FTBASE_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbbox.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftbbox.c                                                               */\n/*                                                                         */\n/*    FreeType bbox computation (body).                                    */\n/*                                                                         */\n/*  Copyright 1996-2002, 2004, 2006, 2010, 2013 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used        */\n/*  modified and distributed under the terms of the FreeType project       */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This component has a _single_ role: to compute exact outline bounding */\n  /* boxes.                                                                */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n\n#include \"../../include/freetype/ftbbox.h\"\n#include \"../../include/freetype/ftimage.h\"\n#include \"../../include/freetype/ftoutln.h\"\n#include \"../../include/freetype/internal/ftcalc.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n\n\n  typedef struct  TBBox_Rec_\n  {\n    FT_Vector  last;\n    FT_BBox    bbox;\n\n  } TBBox_Rec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    BBox_Move_To                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function is used as a `move_to' and `line_to' emitter during  */\n  /*    FT_Outline_Decompose().  It simply records the destination point   */\n  /*    in `user->last'; no further computations are necessary since we    */\n  /*    use the cbox as the starting bbox which must be refined.           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    to   :: A pointer to the destination vector.                       */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    user :: A pointer to the current walk context.                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Always 0.  Needed for the interface only.                          */\n  /*                                                                       */\n  static int\n  BBox_Move_To( FT_Vector*  to,\n                TBBox_Rec*  user )\n  {\n    user->last = *to;\n\n    return 0;\n  }\n\n\n#define CHECK_X( p, bbox )  \\\n          ( p->x < bbox.xMin || p->x > bbox.xMax )\n\n#define CHECK_Y( p, bbox )  \\\n          ( p->y < bbox.yMin || p->y > bbox.yMax )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    BBox_Conic_Check                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Finds the extrema of a 1-dimensional conic Bezier curve and update */\n  /*    a bounding range.  This version uses direct computation, as it     */\n  /*    doesn't need square roots.                                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    y1  :: The start coordinate.                                       */\n  /*                                                                       */\n  /*    y2  :: The coordinate of the control point.                        */\n  /*                                                                       */\n  /*    y3  :: The end coordinate.                                         */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    min :: The address of the current minimum.                         */\n  /*                                                                       */\n  /*    max :: The address of the current maximum.                         */\n  /*                                                                       */\n  static void\n  BBox_Conic_Check( FT_Pos   y1,\n                    FT_Pos   y2,\n                    FT_Pos   y3,\n                    FT_Pos*  min,\n                    FT_Pos*  max )\n  {\n    if ( y1 <= y3 && y2 == y1 )     /* flat arc */\n      goto Suite;\n\n    if ( y1 < y3 )\n    {\n      if ( y2 >= y1 && y2 <= y3 )   /* ascending arc */\n        goto Suite;\n    }\n    else\n    {\n      if ( y2 >= y3 && y2 <= y1 )   /* descending arc */\n      {\n        y2 = y1;\n        y1 = y3;\n        y3 = y2;\n        goto Suite;\n      }\n    }\n\n    y1 = y3 = y1 - FT_MulDiv( y2 - y1, y2 - y1, y1 - 2*y2 + y3 );\n\n  Suite:\n    if ( y1 < *min ) *min = y1;\n    if ( y3 > *max ) *max = y3;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    BBox_Conic_To                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function is used as a `conic_to' emitter during               */\n  /*    FT_Outline_Decompose().  It checks a conic Bezier curve with the   */\n  /*    current bounding box, and computes its extrema if necessary to     */\n  /*    update it.                                                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    control :: A pointer to a control point.                           */\n  /*                                                                       */\n  /*    to      :: A pointer to the destination vector.                    */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    user    :: The address of the current walk context.                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Always 0.  Needed for the interface only.                          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    In the case of a non-monotonous arc, we compute directly the       */\n  /*    extremum coordinates, as it is sufficiently fast.                  */\n  /*                                                                       */\n  static int\n  BBox_Conic_To( FT_Vector*  control,\n                 FT_Vector*  to,\n                 TBBox_Rec*  user )\n  {\n    /* we don't need to check `to' since it is always an `on' point, thus */\n    /* within the bbox                                                    */\n\n    if ( CHECK_X( control, user->bbox ) )\n      BBox_Conic_Check( user->last.x,\n                        control->x,\n                        to->x,\n                        &user->bbox.xMin,\n                        &user->bbox.xMax );\n\n    if ( CHECK_Y( control, user->bbox ) )\n      BBox_Conic_Check( user->last.y,\n                        control->y,\n                        to->y,\n                        &user->bbox.yMin,\n                        &user->bbox.yMax );\n\n    user->last = *to;\n\n    return 0;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    BBox_Cubic_Check                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Finds the extrema of a 1-dimensional cubic Bezier curve and        */\n  /*    updates a bounding range.  This version uses splitting because we  */\n  /*    don't want to use square roots and extra accuracy.                 */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    p1  :: The start coordinate.                                       */\n  /*                                                                       */\n  /*    p2  :: The coordinate of the first control point.                  */\n  /*                                                                       */\n  /*    p3  :: The coordinate of the second control point.                 */\n  /*                                                                       */\n  /*    p4  :: The end coordinate.                                         */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    min :: The address of the current minimum.                         */\n  /*                                                                       */\n  /*    max :: The address of the current maximum.                         */\n  /*                                                                       */\n\n#if 0\n\n  static void\n  BBox_Cubic_Check( FT_Pos   p1,\n                    FT_Pos   p2,\n                    FT_Pos   p3,\n                    FT_Pos   p4,\n                    FT_Pos*  min,\n                    FT_Pos*  max )\n  {\n    FT_Pos  q1, q2, q3, q4;\n\n\n    q1 = p1;\n    q2 = p2;\n    q3 = p3;\n    q4 = p4;\n\n    /* for a conic segment to possibly reach new maximum     */\n    /* one of its off-points must be above the current value */\n    while ( q2 > *max || q3 > *max )\n    {\n      /* determine which half contains the maximum and split */\n      if ( q1 + q2 > q3 + q4 ) /* first half */\n      {\n        q4 = q4 + q3;\n        q3 = q3 + q2;\n        q2 = q2 + q1;\n        q4 = q4 + q3;\n        q3 = q3 + q2;\n        q4 = ( q4 + q3 ) / 8;\n        q3 = q3 / 4;\n        q2 = q2 / 2;\n      }\n      else                     /* second half */\n      {\n        q1 = q1 + q2;\n        q2 = q2 + q3;\n        q3 = q3 + q4;\n        q1 = q1 + q2;\n        q2 = q2 + q3;\n        q1 = ( q1 + q2 ) / 8;\n        q2 = q2 / 4;\n        q3 = q3 / 2;\n      }\n\n      /* check if either end reached the maximum */\n      if ( q1 == q2 && q1 >= q3 )\n      {\n        *max = q1;\n        break;\n      }\n      if ( q3 == q4 && q2 <= q4 )\n      {\n        *max = q4;\n        break;\n      }\n    }\n\n    q1 = p1;\n    q2 = p2;\n    q3 = p3;\n    q4 = p4;\n\n    /* for a conic segment to possibly reach new minimum     */\n    /* one of its off-points must be below the current value */\n    while ( q2 < *min || q3 < *min )\n    {\n      /* determine which half contains the minimum and split */\n      if ( q1 + q2 < q3 + q4 ) /* first half */\n      {\n        q4 = q4 + q3;\n        q3 = q3 + q2;\n        q2 = q2 + q1;\n        q4 = q4 + q3;\n        q3 = q3 + q2;\n        q4 = ( q4 + q3 ) / 8;\n        q3 = q3 / 4;\n        q2 = q2 / 2;\n      }\n      else                     /* second half */\n      {\n        q1 = q1 + q2;\n        q2 = q2 + q3;\n        q3 = q3 + q4;\n        q1 = q1 + q2;\n        q2 = q2 + q3;\n        q1 = ( q1 + q2 ) / 8;\n        q2 = q2 / 4;\n        q3 = q3 / 2;\n      }\n\n      /* check if either end reached the minimum */\n      if ( q1 == q2 && q1 <= q3 )\n      {\n        *min = q1;\n        break;\n      }\n      if ( q3 == q4 && q2 >= q4 )\n      {\n        *min = q4;\n        break;\n      }\n    }\n  }\n\n#else\n\n  static void\n  test_cubic_extrema( FT_Pos    y1,\n                      FT_Pos    y2,\n                      FT_Pos    y3,\n                      FT_Pos    y4,\n                      FT_Fixed  u,\n                      FT_Pos*   min,\n                      FT_Pos*   max )\n  {\n /* FT_Pos    a = y4 - 3*y3 + 3*y2 - y1; */\n    FT_Pos    b = y3 - 2*y2 + y1;\n    FT_Pos    c = y2 - y1;\n    FT_Pos    d = y1;\n    FT_Pos    y;\n    FT_Fixed  uu;\n\n    FT_UNUSED ( y4 );\n\n\n    /* The polynomial is                      */\n    /*                                        */\n    /*    P(x) = a*x^3 + 3b*x^2 + 3c*x + d  , */\n    /*                                        */\n    /*   dP/dx = 3a*x^2 + 6b*x + 3c         . */\n    /*                                        */\n    /* However, we also have                  */\n    /*                                        */\n    /*   dP/dx(u) = 0                       , */\n    /*                                        */\n    /* which implies by subtraction that      */\n    /*                                        */\n    /*   P(u) = b*u^2 + 2c*u + d            . */\n\n    if ( u > 0 && u < 0x10000L )\n    {\n      uu = FT_MulFix( u, u );\n      y  = d + FT_MulFix( c, 2*u ) + FT_MulFix( b, uu );\n\n      if ( y < *min ) *min = y;\n      if ( y > *max ) *max = y;\n    }\n  }\n\n\n  static void\n  BBox_Cubic_Check( FT_Pos   y1,\n                    FT_Pos   y2,\n                    FT_Pos   y3,\n                    FT_Pos   y4,\n                    FT_Pos*  min,\n                    FT_Pos*  max )\n  {\n    /* always compare first and last points */\n    if      ( y1 < *min )  *min = y1;\n    else if ( y1 > *max )  *max = y1;\n\n    if      ( y4 < *min )  *min = y4;\n    else if ( y4 > *max )  *max = y4;\n\n    /* now, try to see if there are split points here */\n    if ( y1 <= y4 )\n    {\n      /* flat or ascending arc test */\n      if ( y1 <= y2 && y2 <= y4 && y1 <= y3 && y3 <= y4 )\n        return;\n    }\n    else /* y1 > y4 */\n    {\n      /* descending arc test */\n      if ( y1 >= y2 && y2 >= y4 && y1 >= y3 && y3 >= y4 )\n        return;\n    }\n\n    /* There are some split points.  Find them.                        */\n    /* We already made sure that a, b, and c below cannot be all zero. */\n    {\n      FT_Pos    a = y4 - 3*y3 + 3*y2 - y1;\n      FT_Pos    b = y3 - 2*y2 + y1;\n      FT_Pos    c = y2 - y1;\n      FT_Pos    d;\n      FT_Fixed  t;\n      FT_Int    shift;\n\n\n      /* We need to solve `ax^2+2bx+c' here, without floating points!      */\n      /* The trick is to normalize to a different representation in order  */\n      /* to use our 16.16 fixed-point routines.                            */\n      /*                                                                   */\n      /* We compute FT_MulFix(b,b) and FT_MulFix(a,c) after normalization. */\n      /* These values must fit into a single 16.16 value.                  */\n      /*                                                                   */\n      /* We normalize a, b, and c to `8.16' fixed-point values to ensure   */\n      /* that their product is held in a `16.16' value including the sign. */\n      /* Necessarily, we need to shift `a', `b', and `c' so that the most  */\n      /* significant bit of their absolute values is at position 22.       */\n      /*                                                                   */\n      /* This also means that we are using 23 bits of precision to compute */\n      /* the zeros, independently of the range of the original polynomial  */\n      /* coefficients.                                                     */\n      /*                                                                   */\n      /* This algorithm should ensure reasonably accurate values for the   */\n      /* zeros.  Note that they are only expressed with 16 bits when       */\n      /* computing the extrema (the zeros need to be in 0..1 exclusive     */\n      /* to be considered part of the arc).                                */\n\n      shift = FT_MSB( FT_ABS( a ) | FT_ABS( b ) | FT_ABS( c ) );\n\n      if ( shift > 22 )\n      {\n        shift -= 22;\n\n        /* this loses some bits of precision, but we use 23 of them */\n        /* for the computation anyway                               */\n        a >>= shift;\n        b >>= shift;\n        c >>= shift;\n      }\n      else\n      {\n        shift = 22 - shift;\n\n        a <<= shift;\n        b <<= shift;\n        c <<= shift;\n      }\n\n      /* handle a == 0 */\n      if ( a == 0 )\n      {\n        if ( b != 0 )\n        {\n          t = - FT_DivFix( c, b ) / 2;\n          test_cubic_extrema( y1, y2, y3, y4, t, min, max );\n        }\n      }\n      else\n      {\n        /* solve the equation now */\n        d = FT_MulFix( b, b ) - FT_MulFix( a, c );\n        if ( d < 0 )\n          return;\n\n        if ( d == 0 )\n        {\n          /* there is a single split point at -b/a */\n          t = - FT_DivFix( b, a );\n          test_cubic_extrema( y1, y2, y3, y4, t, min, max );\n        }\n        else\n        {\n          /* there are two solutions; we need to filter them */\n          d = FT_SqrtFixed( (FT_Int32)d );\n          t = - FT_DivFix( b - d, a );\n          test_cubic_extrema( y1, y2, y3, y4, t, min, max );\n\n          t = - FT_DivFix( b + d, a );\n          test_cubic_extrema( y1, y2, y3, y4, t, min, max );\n        }\n      }\n    }\n  }\n\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    BBox_Cubic_To                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function is used as a `cubic_to' emitter during               */\n  /*    FT_Outline_Decompose().  It checks a cubic Bezier curve with the   */\n  /*    current bounding box, and computes its extrema if necessary to     */\n  /*    update it.                                                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    control1 :: A pointer to the first control point.                  */\n  /*                                                                       */\n  /*    control2 :: A pointer to the second control point.                 */\n  /*                                                                       */\n  /*    to       :: A pointer to the destination vector.                   */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    user     :: The address of the current walk context.               */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Always 0.  Needed for the interface only.                          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    In the case of a non-monotonous arc, we don't compute directly     */\n  /*    extremum coordinates, we subdivide instead.                        */\n  /*                                                                       */\n  static int\n  BBox_Cubic_To( FT_Vector*  control1,\n                 FT_Vector*  control2,\n                 FT_Vector*  to,\n                 TBBox_Rec*  user )\n  {\n    /* we don't need to check `to' since it is always an `on' point, thus */\n    /* within the bbox                                                    */\n\n    if ( CHECK_X( control1, user->bbox ) ||\n         CHECK_X( control2, user->bbox ) )\n      BBox_Cubic_Check( user->last.x,\n                        control1->x,\n                        control2->x,\n                        to->x,\n                        &user->bbox.xMin,\n                        &user->bbox.xMax );\n\n    if ( CHECK_Y( control1, user->bbox ) ||\n         CHECK_Y( control2, user->bbox ) )\n      BBox_Cubic_Check( user->last.y,\n                        control1->y,\n                        control2->y,\n                        to->y,\n                        &user->bbox.yMin,\n                        &user->bbox.yMax );\n\n    user->last = *to;\n\n    return 0;\n  }\n\nFT_DEFINE_OUTLINE_FUNCS(bbox_interface,\n    (FT_Outline_MoveTo_Func) BBox_Move_To,\n    (FT_Outline_LineTo_Func) BBox_Move_To,\n    (FT_Outline_ConicTo_Func)BBox_Conic_To,\n    (FT_Outline_CubicTo_Func)BBox_Cubic_To,\n    0, 0\n  )\n\n  /* documentation is in ftbbox.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Outline_Get_BBox( FT_Outline*  outline,\n                       FT_BBox     *abbox )\n  {\n    FT_BBox     cbox;\n    FT_BBox     bbox;\n    FT_Vector*  vec;\n    FT_UShort   n;\n\n\n    if ( !abbox )\n      return FT_THROW( Invalid_Argument );\n\n    if ( !outline )\n      return FT_THROW( Invalid_Outline );\n\n    /* if outline is empty, return (0,0,0,0) */\n    if ( outline->n_points == 0 || outline->n_contours <= 0 )\n    {\n      abbox->xMin = abbox->xMax = 0;\n      abbox->yMin = abbox->yMax = 0;\n      return 0;\n    }\n\n    /* We compute the control box as well as the bounding box of  */\n    /* all `on' points in the outline.  Then, if the two boxes    */\n    /* coincide, we exit immediately.                             */\n\n    vec = outline->points;\n    bbox.xMin = bbox.xMax = cbox.xMin = cbox.xMax = vec->x;\n    bbox.yMin = bbox.yMax = cbox.yMin = cbox.yMax = vec->y;\n    vec++;\n\n    for ( n = 1; n < outline->n_points; n++ )\n    {\n      FT_Pos  x = vec->x;\n      FT_Pos  y = vec->y;\n\n\n      /* update control box */\n      if ( x < cbox.xMin ) cbox.xMin = x;\n      if ( x > cbox.xMax ) cbox.xMax = x;\n\n      if ( y < cbox.yMin ) cbox.yMin = y;\n      if ( y > cbox.yMax ) cbox.yMax = y;\n\n      if ( FT_CURVE_TAG( outline->tags[n] ) == FT_CURVE_TAG_ON )\n      {\n        /* update bbox for `on' points only */\n        if ( x < bbox.xMin ) bbox.xMin = x;\n        if ( x > bbox.xMax ) bbox.xMax = x;\n\n        if ( y < bbox.yMin ) bbox.yMin = y;\n        if ( y > bbox.yMax ) bbox.yMax = y;\n      }\n\n      vec++;\n    }\n\n    /* test two boxes for equality */\n    if ( cbox.xMin < bbox.xMin || cbox.xMax > bbox.xMax ||\n         cbox.yMin < bbox.yMin || cbox.yMax > bbox.yMax )\n    {\n      /* the two boxes are different, now walk over the outline to */\n      /* get the Bezier arc extrema.                               */\n\n      FT_Error   error;\n      TBBox_Rec  user;\n\n#ifdef FT_CONFIG_OPTION_PIC\n      FT_Outline_Funcs bbox_interface;\n      Init_Class_bbox_interface(&bbox_interface);\n#endif\n\n      user.bbox = bbox;\n\n      error = FT_Outline_Decompose( outline, &bbox_interface, &user );\n      if ( error )\n        return error;\n\n      *abbox = user.bbox;\n    }\n    else\n      *abbox = bbox;\n\n    return FT_Err_Ok;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbdf.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftbdf.c                                                                */\n/*                                                                         */\n/*    FreeType API for accessing BDF-specific strings (body).              */\n/*                                                                         */\n/*  Copyright 2002-2004, 2013 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/internal/services/svbdf.h\"\n\n\n  /* documentation is in ftbdf.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_BDF_Charset_ID( FT_Face       face,\n                         const char*  *acharset_encoding,\n                         const char*  *acharset_registry )\n  {\n    FT_Error     error;\n    const char*  encoding = NULL;\n    const char*  registry = NULL;\n\n\n    error = FT_ERR( Invalid_Argument );\n\n    if ( face )\n    {\n      FT_Service_BDF  service;\n\n\n      FT_FACE_FIND_SERVICE( face, service, BDF );\n\n      if ( service && service->get_charset_id )\n        error = service->get_charset_id( face, &encoding, &registry );\n    }\n\n    if ( acharset_encoding )\n      *acharset_encoding = encoding;\n\n    if ( acharset_registry )\n      *acharset_registry = registry;\n\n    return error;\n  }\n\n\n  /* documentation is in ftbdf.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_BDF_Property( FT_Face           face,\n                       const char*       prop_name,\n                       BDF_PropertyRec  *aproperty )\n  {\n    FT_Error  error;\n\n\n    error = FT_ERR( Invalid_Argument );\n\n    aproperty->type = BDF_PROPERTY_TYPE_NONE;\n\n    if ( face )\n    {\n      FT_Service_BDF  service;\n\n\n      FT_FACE_FIND_SERVICE( face, service, BDF );\n\n      if ( service && service->get_property )\n        error = service->get_property( face, prop_name, aproperty );\n    }\n\n    return  error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftcalc.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcalc.c                                                               */\n/*                                                                         */\n/*    Arithmetic computations (body).                                      */\n/*                                                                         */\n/*  Copyright 1996-2006, 2008, 2012-2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Support for 1-complement arithmetic has been totally dropped in this  */\n  /* release.  You can still write your own code if you need it.           */\n  /*                                                                       */\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Implementing basic computation routines.                              */\n  /*                                                                       */\n  /* FT_MulDiv(), FT_MulFix(), FT_DivFix(), FT_RoundFix(), FT_CeilFix(),   */\n  /* and FT_FloorFix() are declared in freetype.h.                         */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/ftglyph.h\"\n#include \"../../include/freetype/fttrigon.h\"\n#include \"../../include/freetype/internal/ftcalc.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n\n\n/* we need to emulate a 64-bit data type if a real one isn't available */\n\n#ifndef FT_LONG64\n\n  typedef struct  FT_Int64_\n  {\n    FT_UInt32  lo;\n    FT_UInt32  hi;\n\n  } FT_Int64;\n\n#endif /* !FT_LONG64 */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_calc\n\n\n  /* The following three functions are available regardless of whether */\n  /* FT_LONG64 is defined.                                             */\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Fixed )\n  FT_RoundFix( FT_Fixed  a )\n  {\n    return ( a >= 0 ) ?   ( a + 0x8000L ) & ~0xFFFFL\n                      : -((-a + 0x8000L ) & ~0xFFFFL );\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Fixed )\n  FT_CeilFix( FT_Fixed  a )\n  {\n    return ( a >= 0 ) ?   ( a + 0xFFFFL ) & ~0xFFFFL\n                      : -((-a + 0xFFFFL ) & ~0xFFFFL );\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Fixed )\n  FT_FloorFix( FT_Fixed  a )\n  {\n    return ( a >= 0 ) ?   a & ~0xFFFFL\n                      : -((-a) & ~0xFFFFL );\n  }\n\n\n  FT_BASE_DEF ( FT_Int )\n  FT_MSB( FT_UInt32 z )\n  {\n    FT_Int shift = 0;\n\n    /* determine msb bit index in `shift' */\n    if ( z >= ( 1L << 16 ) )\n    {\n      z     >>= 16;\n      shift  += 16;\n    }\n    if ( z >= ( 1L << 8 ) )\n    {\n      z     >>= 8;\n      shift  += 8;\n    }\n    if ( z >= ( 1L << 4 ) )\n    {\n      z     >>= 4;\n      shift  += 4;\n    }\n    if ( z >= ( 1L << 2 ) )\n    {\n      z     >>= 2;\n      shift  += 2;\n    }\n    if ( z >= ( 1L << 1 ) )\n    {\n      z     >>= 1;\n      shift  += 1;\n    }\n\n    return shift;\n  }\n\n\n  /* documentation is in ftcalc.h */\n\n  FT_BASE_DEF( FT_Fixed )\n  FT_Hypot( FT_Fixed  x,\n            FT_Fixed  y )\n  {\n    FT_Vector  v;\n\n\n    v.x = x;\n    v.y = y;\n\n    return FT_Vector_Length( &v );\n  }\n\n\n#ifdef FT_LONG64\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Long )\n  FT_MulDiv( FT_Long  a,\n             FT_Long  b,\n             FT_Long  c )\n  {\n    FT_Int   s;\n    FT_Long  d;\n\n\n    s = 1;\n    if ( a < 0 ) { a = -a; s = -1; }\n    if ( b < 0 ) { b = -b; s = -s; }\n    if ( c < 0 ) { c = -c; s = -s; }\n\n    d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c\n                         : 0x7FFFFFFFL );\n\n    return ( s > 0 ) ? d : -d;\n  }\n\n\n  /* documentation is in ftcalc.h */\n\n  FT_BASE_DEF( FT_Long )\n  FT_MulDiv_No_Round( FT_Long  a,\n                      FT_Long  b,\n                      FT_Long  c )\n  {\n    FT_Int   s;\n    FT_Long  d;\n\n\n    s = 1;\n    if ( a < 0 ) { a = -a; s = -1; }\n    if ( b < 0 ) { b = -b; s = -s; }\n    if ( c < 0 ) { c = -c; s = -s; }\n\n    d = (FT_Long)( c > 0 ? (FT_Int64)a * b / c\n                         : 0x7FFFFFFFL );\n\n    return ( s > 0 ) ? d : -d;\n  }\n\n\n  /* documentation is in freetype.h */\n   /* if defined FT_MULFIX_INLINED, use the inline FT_MULFIX_ASSEMBLER function. */\n#ifndef FT_MULFIX_INLINED\n  FT_EXPORT_DEF( FT_Long )\n  FT_MulFix( FT_Long  a,\n             FT_Long  b )\n  {\n#ifdef FT_MULFIX_ASSEMBLER\n\n    return FT_MULFIX_ASSEMBLER( a, b );\n\n#else\n\n    FT_Int   s = 1;\n    FT_Long  c;\n\n\n    if ( a < 0 )\n    {\n      a = -a;\n      s = -1;\n    }\n\n    if ( b < 0 )\n    {\n      b = -b;\n      s = -s;\n    }\n\n    c = (FT_Long)( ( (FT_Int64)a * b + 0x8000L ) >> 16 );\n\n    return ( s > 0 ) ? c : -c;\n\n#endif /* FT_MULFIX_ASSEMBLER */\n  }\n  #endif/* FT_MULFIX_INLINED */\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Long )\n  FT_DivFix( FT_Long  a,\n             FT_Long  b )\n  {\n    FT_Int32   s;\n    FT_UInt32  q;\n\n\n    s = 1;\n    if ( a < 0 )\n    {\n      a = -a;\n      s = -1;\n    }\n    if ( b < 0 )\n    {\n      b = -b;\n      s = -s;\n    }\n\n    if ( b == 0 )\n      /* check for division by 0 */\n      q = 0x7FFFFFFFL;\n    else\n      /* compute result directly */\n      q = (FT_UInt32)( ( ( (FT_UInt64)a << 16 ) + ( b >> 1 ) ) / b );\n\n    return ( s < 0 ? -(FT_Long)q : (FT_Long)q );\n  }\n\n\n#else /* !FT_LONG64 */\n\n\n  static void\n  ft_multo64( FT_UInt32  x,\n              FT_UInt32  y,\n              FT_Int64  *z )\n  {\n    FT_UInt32  lo1, hi1, lo2, hi2, lo, hi, i1, i2;\n\n\n    lo1 = x & 0x0000FFFFU;  hi1 = x >> 16;\n    lo2 = y & 0x0000FFFFU;  hi2 = y >> 16;\n\n    lo = lo1 * lo2;\n    i1 = lo1 * hi2;\n    i2 = lo2 * hi1;\n    hi = hi1 * hi2;\n\n    /* Check carry overflow of i1 + i2 */\n    i1 += i2;\n    hi += (FT_UInt32)( i1 < i2 ) << 16;\n\n    hi += i1 >> 16;\n    i1  = i1 << 16;\n\n    /* Check carry overflow of i1 + lo */\n    lo += i1;\n    hi += ( lo < i1 );\n\n    z->lo = lo;\n    z->hi = hi;\n  }\n\n\n  static FT_UInt32\n  ft_div64by32( FT_UInt32  hi,\n                FT_UInt32  lo,\n                FT_UInt32  y )\n  {\n    FT_UInt32  r, q;\n    FT_Int     i;\n\n\n    q = 0;\n    r = hi;\n\n    if ( r >= y )\n      return (FT_UInt32)0x7FFFFFFFL;\n\n    i = 32;\n    do\n    {\n      r <<= 1;\n      q <<= 1;\n      r  |= lo >> 31;\n\n      if ( r >= y )\n      {\n        r -= y;\n        q |= 1;\n      }\n      lo <<= 1;\n    } while ( --i );\n\n    return q;\n  }\n\n\n  static void\n  FT_Add64( FT_Int64*  x,\n            FT_Int64*  y,\n            FT_Int64  *z )\n  {\n    register FT_UInt32  lo, hi;\n\n\n    lo = x->lo + y->lo;\n    hi = x->hi + y->hi + ( lo < x->lo );\n\n    z->lo = lo;\n    z->hi = hi;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  /* The FT_MulDiv function has been optimized thanks to ideas from      */\n  /* Graham Asher.  The trick is to optimize computation when everything */\n  /* fits within 32-bits (a rather common case).                         */\n  /*                                                                     */\n  /*  we compute 'a*b+c/2', then divide it by 'c'. (positive values)     */\n  /*                                                                     */\n  /*  46340 is FLOOR(SQRT(2^31-1)).                                      */\n  /*                                                                     */\n  /*  if ( a <= 46340 && b <= 46340 ) then ( a*b <= 0x7FFEA810 )         */\n  /*                                                                     */\n  /*  0x7FFFFFFF - 0x7FFEA810 = 0x157F0                                  */\n  /*                                                                     */\n  /*  if ( c < 0x157F0*2 ) then ( a*b+c/2 <= 0x7FFFFFFF )                */\n  /*                                                                     */\n  /*  and 2*0x157F0 = 176096                                             */\n  /*                                                                     */\n\n  FT_EXPORT_DEF( FT_Long )\n  FT_MulDiv( FT_Long  a,\n             FT_Long  b,\n             FT_Long  c )\n  {\n    long  s;\n\n\n    /* XXX: this function does not allow 64-bit arguments */\n    if ( a == 0 || b == c )\n      return a;\n\n    s  = a; a = FT_ABS( a );\n    s ^= b; b = FT_ABS( b );\n    s ^= c; c = FT_ABS( c );\n\n    if ( a <= 46340L && b <= 46340L && c <= 176095L && c > 0 )\n      a = ( a * b + ( c >> 1 ) ) / c;\n\n    else if ( (FT_Int32)c > 0 )\n    {\n      FT_Int64  temp, temp2;\n\n\n      ft_multo64( (FT_Int32)a, (FT_Int32)b, &temp );\n\n      temp2.hi = 0;\n      temp2.lo = (FT_UInt32)(c >> 1);\n      FT_Add64( &temp, &temp2, &temp );\n      a = ft_div64by32( temp.hi, temp.lo, (FT_Int32)c );\n    }\n    else\n      a = 0x7FFFFFFFL;\n\n    return ( s < 0 ? -a : a );\n  }\n\n\n  FT_BASE_DEF( FT_Long )\n  FT_MulDiv_No_Round( FT_Long  a,\n                      FT_Long  b,\n                      FT_Long  c )\n  {\n    long  s;\n\n\n    if ( a == 0 || b == c )\n      return a;\n\n    s  = a; a = FT_ABS( a );\n    s ^= b; b = FT_ABS( b );\n    s ^= c; c = FT_ABS( c );\n\n    if ( a <= 46340L && b <= 46340L && c > 0 )\n      a = a * b / c;\n\n    else if ( (FT_Int32)c > 0 )\n    {\n      FT_Int64  temp;\n\n\n      ft_multo64( (FT_Int32)a, (FT_Int32)b, &temp );\n      a = ft_div64by32( temp.hi, temp.lo, (FT_Int32)c );\n    }\n    else\n      a = 0x7FFFFFFFL;\n\n    return ( s < 0 ? -a : a );\n  }\n\n\n  /* documentation is in freetype.h */\n  #ifndef FT_MULFIX_INLINED\n  FT_EXPORT_DEF( FT_Long )\n  FT_MulFix( FT_Long  a,\n             FT_Long  b )\n  {\n#ifdef FT_MULFIX_ASSEMBLER\n\n    return FT_MULFIX_ASSEMBLER( a, b );\n\n#elif 0\n\n    /*\n     *  This code is nonportable.  See comment below.\n     *\n     *  However, on a platform where right-shift of a signed quantity fills\n     *  the leftmost bits by copying the sign bit, it might be faster.\n     */\n\n    FT_Long   sa, sb;\n    FT_ULong  ua, ub;\n\n\n    if ( a == 0 || b == 0x10000L )\n      return a;\n\n    /*\n     *  This is a clever way of converting a signed number `a' into its\n     *  absolute value (stored back into `a') and its sign.  The sign is\n     *  stored in `sa'; 0 means `a' was positive or zero, and -1 means `a'\n     *  was negative.  (Similarly for `b' and `sb').\n     *\n     *  Unfortunately, it doesn't work (at least not portably).\n     *\n     *  It makes the assumption that right-shift on a negative signed value\n     *  fills the leftmost bits by copying the sign bit.  This is wrong.\n     *  According to K&R 2nd ed, section `A7.8 Shift Operators' on page 206,\n     *  the result of right-shift of a negative signed value is\n     *  implementation-defined.  At least one implementation fills the\n     *  leftmost bits with 0s (i.e., it is exactly the same as an unsigned\n     *  right shift).  This means that when `a' is negative, `sa' ends up\n     *  with the value 1 rather than -1.  After that, everything else goes\n     *  wrong.\n     */\n    sa = ( a >> ( sizeof ( a ) * 8 - 1 ) );\n    a  = ( a ^ sa ) - sa;\n    sb = ( b >> ( sizeof ( b ) * 8 - 1 ) );\n    b  = ( b ^ sb ) - sb;\n\n    ua = (FT_ULong)a;\n    ub = (FT_ULong)b;\n\n    if ( ua <= 2048 && ub <= 1048576L )\n      ua = ( ua * ub + 0x8000U ) >> 16;\n    else\n    {\n      FT_ULong  al = ua & 0xFFFFU;\n\n\n      ua = ( ua >> 16 ) * ub +  al * ( ub >> 16 ) +\n           ( ( al * ( ub & 0xFFFFU ) + 0x8000U ) >> 16 );\n    }\n\n    sa ^= sb,\n    ua  = (FT_ULong)(( ua ^ sa ) - sa);\n\n    return (FT_Long)ua;\n\n#else /* 0 */\n\n    FT_Long   s;\n    FT_ULong  ua, ub;\n\n\n    if ( a == 0 || b == 0x10000L )\n      return a;\n\n    s  = a; a = FT_ABS( a );\n    s ^= b; b = FT_ABS( b );\n\n    ua = (FT_ULong)a;\n    ub = (FT_ULong)b;\n\n    if ( ua <= 2048 && ub <= 1048576L )\n      ua = ( ua * ub + 0x8000UL ) >> 16;\n    else\n    {\n      FT_ULong  al = ua & 0xFFFFUL;\n\n\n      ua = ( ua >> 16 ) * ub +  al * ( ub >> 16 ) +\n           ( ( al * ( ub & 0xFFFFUL ) + 0x8000UL ) >> 16 );\n    }\n\n    return ( s < 0 ? -(FT_Long)ua : (FT_Long)ua );\n\n#endif /* 0 */\n\n  }\n#endif\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Long )\n  FT_DivFix( FT_Long  a,\n             FT_Long  b )\n  {\n    FT_Int32   s;\n    FT_UInt32  q;\n\n\n    /* XXX: this function does not allow 64-bit arguments */\n    s  = (FT_Int32)a; a = FT_ABS( a );\n    s ^= (FT_Int32)b; b = FT_ABS( b );\n\n    if ( (FT_UInt32)b == 0 )\n    {\n      /* check for division by 0 */\n      q = (FT_UInt32)0x7FFFFFFFL;\n    }\n    else if ( ( a >> 16 ) == 0 )\n    {\n      /* compute result directly */\n      q = (FT_UInt32)( ( (FT_ULong)a << 16 ) + ( b >> 1 ) ) / (FT_UInt32)b;\n    }\n    else\n    {\n      /* we need more bits; we have to do it by hand */\n      FT_Int64  temp, temp2;\n\n\n      temp.hi  = (FT_Int32)( a >> 16 );\n      temp.lo  = (FT_UInt32)a << 16;\n      temp2.hi = 0;\n      temp2.lo = (FT_UInt32)( b >> 1 );\n      FT_Add64( &temp, &temp2, &temp );\n      q = ft_div64by32( temp.hi, temp.lo, (FT_Int32)b );\n    }\n\n    return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );\n  }\n\n\n#if 0\n\n  /* documentation is in ftcalc.h */\n\n  FT_EXPORT_DEF( void )\n  FT_MulTo64( FT_Int32   x,\n              FT_Int32   y,\n              FT_Int64  *z )\n  {\n    FT_Int32  s;\n\n\n    s  = x; x = FT_ABS( x );\n    s ^= y; y = FT_ABS( y );\n\n    ft_multo64( x, y, z );\n\n    if ( s < 0 )\n    {\n      z->lo = (FT_UInt32)-(FT_Int32)z->lo;\n      z->hi = ~z->hi + !( z->lo );\n    }\n  }\n\n\n  /* apparently, the second version of this code is not compiled correctly */\n  /* on Mac machines with the MPW C compiler..  tsk, tsk, tsk...           */\n\n#if 1\n\n  FT_EXPORT_DEF( FT_Int32 )\n  FT_Div64by32( FT_Int64*  x,\n                FT_Int32   y )\n  {\n    FT_Int32   s;\n    FT_UInt32  q, r, i, lo;\n\n\n    s  = x->hi;\n    if ( s < 0 )\n    {\n      x->lo = (FT_UInt32)-(FT_Int32)x->lo;\n      x->hi = ~x->hi + !x->lo;\n    }\n    s ^= y;  y = FT_ABS( y );\n\n    /* Shortcut */\n    if ( x->hi == 0 )\n    {\n      if ( y > 0 )\n        q = x->lo / y;\n      else\n        q = 0x7FFFFFFFL;\n\n      return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );\n    }\n\n    r  = x->hi;\n    lo = x->lo;\n\n    if ( r >= (FT_UInt32)y ) /* we know y is to be treated as unsigned here */\n      return ( s < 0 ? 0x80000001UL : 0x7FFFFFFFUL );\n                             /* Return Max/Min Int32 if division overflow. */\n                             /* This includes division by zero!            */\n    q = 0;\n    for ( i = 0; i < 32; i++ )\n    {\n      r <<= 1;\n      q <<= 1;\n      r  |= lo >> 31;\n\n      if ( r >= (FT_UInt32)y )\n      {\n        r -= y;\n        q |= 1;\n      }\n      lo <<= 1;\n    }\n\n    return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );\n  }\n\n#else /* 0 */\n\n  FT_EXPORT_DEF( FT_Int32 )\n  FT_Div64by32( FT_Int64*  x,\n                FT_Int32   y )\n  {\n    FT_Int32   s;\n    FT_UInt32  q;\n\n\n    s  = x->hi;\n    if ( s < 0 )\n    {\n      x->lo = (FT_UInt32)-(FT_Int32)x->lo;\n      x->hi = ~x->hi + !x->lo;\n    }\n    s ^= y;  y = FT_ABS( y );\n\n    /* Shortcut */\n    if ( x->hi == 0 )\n    {\n      if ( y > 0 )\n        q = ( x->lo + ( y >> 1 ) ) / y;\n      else\n        q = 0x7FFFFFFFL;\n\n      return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );\n    }\n\n    q = ft_div64by32( x->hi, x->lo, y );\n\n    return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );\n  }\n\n#endif /* 0 */\n\n#endif /* 0 */\n\n\n#endif /* FT_LONG64 */\n\n\n  /* documentation is in ftglyph.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Matrix_Multiply( const FT_Matrix*  a,\n                      FT_Matrix        *b )\n  {\n    FT_Fixed  xx, xy, yx, yy;\n\n\n    if ( !a || !b )\n      return;\n\n    xx = FT_MulFix( a->xx, b->xx ) + FT_MulFix( a->xy, b->yx );\n    xy = FT_MulFix( a->xx, b->xy ) + FT_MulFix( a->xy, b->yy );\n    yx = FT_MulFix( a->yx, b->xx ) + FT_MulFix( a->yy, b->yx );\n    yy = FT_MulFix( a->yx, b->xy ) + FT_MulFix( a->yy, b->yy );\n\n    b->xx = xx;  b->xy = xy;\n    b->yx = yx;  b->yy = yy;\n  }\n\n\n  /* documentation is in ftglyph.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Matrix_Invert( FT_Matrix*  matrix )\n  {\n    FT_Pos  delta, xx, yy;\n\n\n    if ( !matrix )\n      return FT_THROW( Invalid_Argument );\n\n    /* compute discriminant */\n    delta = FT_MulFix( matrix->xx, matrix->yy ) -\n            FT_MulFix( matrix->xy, matrix->yx );\n\n    if ( !delta )\n      return FT_THROW( Invalid_Argument );  /* matrix can't be inverted */\n\n    matrix->xy = - FT_DivFix( matrix->xy, delta );\n    matrix->yx = - FT_DivFix( matrix->yx, delta );\n\n    xx = matrix->xx;\n    yy = matrix->yy;\n\n    matrix->xx = FT_DivFix( yy, delta );\n    matrix->yy = FT_DivFix( xx, delta );\n\n    return FT_Err_Ok;\n  }\n\n\n  /* documentation is in ftcalc.h */\n\n  FT_BASE_DEF( void )\n  FT_Matrix_Multiply_Scaled( const FT_Matrix*  a,\n                             FT_Matrix        *b,\n                             FT_Long           scaling )\n  {\n    FT_Fixed  xx, xy, yx, yy;\n\n    FT_Long   val = 0x10000L * scaling;\n\n\n    if ( !a || !b )\n      return;\n\n    xx = FT_MulDiv( a->xx, b->xx, val ) + FT_MulDiv( a->xy, b->yx, val );\n    xy = FT_MulDiv( a->xx, b->xy, val ) + FT_MulDiv( a->xy, b->yy, val );\n    yx = FT_MulDiv( a->yx, b->xx, val ) + FT_MulDiv( a->yy, b->yx, val );\n    yy = FT_MulDiv( a->yx, b->xy, val ) + FT_MulDiv( a->yy, b->yy, val );\n\n    b->xx = xx;  b->xy = xy;\n    b->yx = yx;  b->yy = yy;\n  }\n\n\n  /* documentation is in ftcalc.h */\n\n  FT_BASE_DEF( void )\n  FT_Vector_Transform_Scaled( FT_Vector*        vector,\n                              const FT_Matrix*  matrix,\n                              FT_Long           scaling )\n  {\n    FT_Pos   xz, yz;\n\n    FT_Long  val = 0x10000L * scaling;\n\n\n    if ( !vector || !matrix )\n      return;\n\n    xz = FT_MulDiv( vector->x, matrix->xx, val ) +\n         FT_MulDiv( vector->y, matrix->xy, val );\n\n    yz = FT_MulDiv( vector->x, matrix->yx, val ) +\n         FT_MulDiv( vector->y, matrix->yy, val );\n\n    vector->x = xz;\n    vector->y = yz;\n  }\n\n\n  /* documentation is in ftcalc.h */\n\n  FT_BASE_DEF( FT_Int32 )\n  FT_SqrtFixed( FT_Int32  x )\n  {\n    FT_UInt32  root, rem_hi, rem_lo, test_div;\n    FT_Int     count;\n\n\n    root = 0;\n\n    if ( x > 0 )\n    {\n      rem_hi = 0;\n      rem_lo = x;\n      count  = 24;\n      do\n      {\n        rem_hi   = ( rem_hi << 2 ) | ( rem_lo >> 30 );\n        rem_lo <<= 2;\n        root   <<= 1;\n        test_div = ( root << 1 ) + 1;\n\n        if ( rem_hi >= test_div )\n        {\n          rem_hi -= test_div;\n          root   += 1;\n        }\n      } while ( --count );\n    }\n\n    return (FT_Int32)root;\n  }\n\n\n  /* documentation is in ftcalc.h */\n\n  FT_BASE_DEF( FT_Int )\n  ft_corner_orientation( FT_Pos  in_x,\n                         FT_Pos  in_y,\n                         FT_Pos  out_x,\n                         FT_Pos  out_y )\n  {\n    FT_Long  result; /* avoid overflow on 16-bit system */\n\n\n    /* deal with the trivial cases quickly */\n    if ( in_y == 0 )\n    {\n      if ( in_x >= 0 )\n        result = out_y;\n      else\n        result = -out_y;\n    }\n    else if ( in_x == 0 )\n    {\n      if ( in_y >= 0 )\n        result = -out_x;\n      else\n        result = out_x;\n    }\n    else if ( out_y == 0 )\n    {\n      if ( out_x >= 0 )\n        result = in_y;\n      else\n        result = -in_y;\n    }\n    else if ( out_x == 0 )\n    {\n      if ( out_y >= 0 )\n        result = -in_x;\n      else\n        result =  in_x;\n    }\n    else /* general case */\n    {\n#ifdef FT_LONG64\n\n      FT_Int64  delta = (FT_Int64)in_x * out_y - (FT_Int64)in_y * out_x;\n\n\n      if ( delta == 0 )\n        result = 0;\n      else\n        result = 1 - 2 * ( delta < 0 );\n\n#else\n\n      FT_Int64  z1, z2;\n\n\n      /* XXX: this function does not allow 64-bit arguments */\n      ft_multo64( (FT_Int32)in_x, (FT_Int32)out_y, &z1 );\n      ft_multo64( (FT_Int32)in_y, (FT_Int32)out_x, &z2 );\n\n      if ( z1.hi > z2.hi )\n        result = +1;\n      else if ( z1.hi < z2.hi )\n        result = -1;\n      else if ( z1.lo > z2.lo )\n        result = +1;\n      else if ( z1.lo < z2.lo )\n        result = -1;\n      else\n        result = 0;\n\n#endif\n    }\n\n    /* XXX: only the sign of return value, +1/0/-1 must be used */\n    return (FT_Int)result;\n  }\n\n\n  /* documentation is in ftcalc.h */\n\n  FT_BASE_DEF( FT_Int )\n  ft_corner_is_flat( FT_Pos  in_x,\n                     FT_Pos  in_y,\n                     FT_Pos  out_x,\n                     FT_Pos  out_y )\n  {\n    FT_Pos  ax = in_x;\n    FT_Pos  ay = in_y;\n\n    FT_Pos  d_in, d_out, d_corner;\n\n\n    if ( ax < 0 )\n      ax = -ax;\n    if ( ay < 0 )\n      ay = -ay;\n    d_in = ax + ay;\n\n    ax = out_x;\n    if ( ax < 0 )\n      ax = -ax;\n    ay = out_y;\n    if ( ay < 0 )\n      ay = -ay;\n    d_out = ax + ay;\n\n    ax = out_x + in_x;\n    if ( ax < 0 )\n      ax = -ax;\n    ay = out_y + in_y;\n    if ( ay < 0 )\n      ay = -ay;\n    d_corner = ax + ay;\n\n    return ( d_in + d_out - d_corner ) < ( d_corner >> 4 );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftcid.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcid.c                                                                */\n/*                                                                         */\n/*    FreeType API for accessing CID font information.                     */\n/*                                                                         */\n/*  Copyright 2007, 2009, 2013 by Derek Clegg, Michael Toftdal.            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/ftcid.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/internal/services/svcid.h\"\n\n\n  /* documentation is in ftcid.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_CID_Registry_Ordering_Supplement( FT_Face       face,\n                                           const char*  *registry,\n                                           const char*  *ordering,\n                                           FT_Int       *supplement)\n  {\n    FT_Error     error;\n    const char*  r = NULL;\n    const char*  o = NULL;\n    FT_Int       s = 0;\n\n\n    error = FT_ERR( Invalid_Argument );\n\n    if ( face )\n    {\n      FT_Service_CID  service;\n\n\n      FT_FACE_FIND_SERVICE( face, service, CID );\n\n      if ( service && service->get_ros )\n        error = service->get_ros( face, &r, &o, &s );\n    }\n\n    if ( registry )\n      *registry = r;\n\n    if ( ordering )\n      *ordering = o;\n\n    if ( supplement )\n      *supplement = s;\n\n    return error;\n  }\n\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_CID_Is_Internally_CID_Keyed( FT_Face   face,\n                                      FT_Bool  *is_cid )\n  {\n    FT_Error  error = FT_ERR( Invalid_Argument );\n    FT_Bool   ic = 0;\n\n\n    if ( face )\n    {\n      FT_Service_CID  service;\n\n\n      FT_FACE_FIND_SERVICE( face, service, CID );\n\n      if ( service && service->get_is_cid )\n        error = service->get_is_cid( face, &ic);\n    }\n\n    if ( is_cid )\n      *is_cid = ic;\n\n    return error;\n  }\n\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_CID_From_Glyph_Index( FT_Face   face,\n                               FT_UInt   glyph_index,\n                               FT_UInt  *cid )\n  {\n    FT_Error  error = FT_ERR( Invalid_Argument );\n    FT_UInt   c = 0;\n\n\n    if ( face )\n    {\n      FT_Service_CID  service;\n\n\n      FT_FACE_FIND_SERVICE( face, service, CID );\n\n      if ( service && service->get_cid_from_glyph_index )\n        error = service->get_cid_from_glyph_index( face, glyph_index, &c);\n    }\n\n    if ( cid )\n      *cid = c;\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftdbgmem.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftdbgmem.c                                                             */\n/*                                                                         */\n/*    Memory debugger (body).                                              */\n/*                                                                         */\n/*  Copyright 2001-2006, 2009, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/config/ftconfig.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftmemory.h\"\n#include \"../../include/freetype/ftsystem.h\"\n#include \"../../include/freetype/fterrors.h\"\n#include \"../../include/freetype/fttypes.h\"\n\n\n#ifdef FT_DEBUG_MEMORY\n\n#define  KEEPALIVE /* `Keep alive' means that freed blocks aren't released\n                    * to the heap.  This is useful to detect double-frees\n                    * or weird heap corruption, but it uses large amounts of\n                    * memory, however.\n                    */\n\n#include \"../../include/freetype/config/ftstdlib.h\"\n\n  FT_BASE_DEF( const char* )  _ft_debug_file   = 0;\n  FT_BASE_DEF( long )         _ft_debug_lineno = 0;\n\n  extern void\n  FT_DumpMemory( FT_Memory  memory );\n\n\n  typedef struct FT_MemSourceRec_*  FT_MemSource;\n  typedef struct FT_MemNodeRec_*    FT_MemNode;\n  typedef struct FT_MemTableRec_*   FT_MemTable;\n\n\n#define FT_MEM_VAL( addr )  ((FT_PtrDist)(FT_Pointer)( addr ))\n\n  /*\n   *  This structure holds statistics for a single allocation/release\n   *  site.  This is useful to know where memory operations happen the\n   *  most.\n   */\n  typedef struct  FT_MemSourceRec_\n  {\n    const char*   file_name;\n    long          line_no;\n\n    FT_Long       cur_blocks;   /* current number of allocated blocks */\n    FT_Long       max_blocks;   /* max. number of allocated blocks    */\n    FT_Long       all_blocks;   /* total number of blocks allocated   */\n\n    FT_Long       cur_size;     /* current cumulative allocated size */\n    FT_Long       max_size;     /* maximum cumulative allocated size */\n    FT_Long       all_size;     /* total cumulative allocated size   */\n\n    FT_Long       cur_max;      /* current maximum allocated size */\n\n    FT_UInt32     hash;\n    FT_MemSource  link;\n\n  } FT_MemSourceRec;\n\n\n  /*\n   *  We don't need a resizable array for the memory sources, because\n   *  their number is pretty limited within FreeType.\n   */\n#define FT_MEM_SOURCE_BUCKETS  128\n\n  /*\n   *  This structure holds information related to a single allocated\n   *  memory block.  If KEEPALIVE is defined, blocks that are freed by\n   *  FreeType are never released to the system.  Instead, their `size'\n   *  field is set to -size.  This is mainly useful to detect double frees,\n   *  at the price of large memory footprint during execution.\n   */\n  typedef struct  FT_MemNodeRec_\n  {\n    FT_Byte*      address;\n    FT_Long       size;     /* < 0 if the block was freed */\n\n    FT_MemSource  source;\n\n#ifdef KEEPALIVE\n    const char*   free_file_name;\n    FT_Long       free_line_no;\n#endif\n\n    FT_MemNode    link;\n\n  } FT_MemNodeRec;\n\n\n  /*\n   *  The global structure, containing compound statistics and all hash\n   *  tables.\n   */\n  typedef struct  FT_MemTableRec_\n  {\n    FT_ULong         size;\n    FT_ULong         nodes;\n    FT_MemNode*      buckets;\n\n    FT_ULong         alloc_total;\n    FT_ULong         alloc_current;\n    FT_ULong         alloc_max;\n    FT_ULong         alloc_count;\n\n    FT_Bool          bound_total;\n    FT_ULong         alloc_total_max;\n\n    FT_Bool          bound_count;\n    FT_ULong         alloc_count_max;\n\n    FT_MemSource     sources[FT_MEM_SOURCE_BUCKETS];\n\n    FT_Bool          keep_alive;\n\n    FT_Memory        memory;\n    FT_Pointer       memory_user;\n    FT_Alloc_Func    alloc;\n    FT_Free_Func     free;\n    FT_Realloc_Func  realloc;\n\n  } FT_MemTableRec;\n\n\n#define FT_MEM_SIZE_MIN  7\n#define FT_MEM_SIZE_MAX  13845163\n\n#define FT_FILENAME( x )  ((x) ? (x) : \"unknown file\")\n\n\n  /*\n   *  Prime numbers are ugly to handle.  It would be better to implement\n   *  L-Hashing, which is 10% faster and doesn't require divisions.\n   */\n  static const FT_UInt  ft_mem_primes[] =\n  {\n    7,\n    11,\n    19,\n    37,\n    73,\n    109,\n    163,\n    251,\n    367,\n    557,\n    823,\n    1237,\n    1861,\n    2777,\n    4177,\n    6247,\n    9371,\n    14057,\n    21089,\n    31627,\n    47431,\n    71143,\n    106721,\n    160073,\n    240101,\n    360163,\n    540217,\n    810343,\n    1215497,\n    1823231,\n    2734867,\n    4102283,\n    6153409,\n    9230113,\n    13845163,\n  };\n\n\n  static FT_ULong\n  ft_mem_closest_prime( FT_ULong  num )\n  {\n    FT_UInt  i;\n\n\n    for ( i = 0;\n          i < sizeof ( ft_mem_primes ) / sizeof ( ft_mem_primes[0] ); i++ )\n      if ( ft_mem_primes[i] > num )\n        return ft_mem_primes[i];\n\n    return FT_MEM_SIZE_MAX;\n  }\n\n\n  extern void\n  ft_mem_debug_panic( const char*  fmt,\n                      ... )\n  {\n    va_list  ap;\n\n\n    printf( \"FreeType.Debug: \" );\n\n    va_start( ap, fmt );\n    vprintf( fmt, ap );\n    va_end( ap );\n\n    printf( \"\\n\" );\n    exit( EXIT_FAILURE );\n  }\n\n\n  static FT_Pointer\n  ft_mem_table_alloc( FT_MemTable  table,\n                      FT_Long      size )\n  {\n    FT_Memory   memory = table->memory;\n    FT_Pointer  block;\n\n\n    memory->user = table->memory_user;\n    block = table->alloc( memory, size );\n    memory->user = table;\n\n    return block;\n  }\n\n\n  static void\n  ft_mem_table_free( FT_MemTable  table,\n                     FT_Pointer   block )\n  {\n    FT_Memory  memory = table->memory;\n\n\n    memory->user = table->memory_user;\n    table->free( memory, block );\n    memory->user = table;\n  }\n\n\n  static void\n  ft_mem_table_resize( FT_MemTable  table )\n  {\n    FT_ULong  new_size;\n\n\n    new_size = ft_mem_closest_prime( table->nodes );\n    if ( new_size != table->size )\n    {\n      FT_MemNode*  new_buckets;\n      FT_ULong     i;\n\n\n      new_buckets = (FT_MemNode *)\n                      ft_mem_table_alloc( table,\n                                          new_size * sizeof ( FT_MemNode ) );\n      if ( new_buckets == NULL )\n        return;\n\n      FT_ARRAY_ZERO( new_buckets, new_size );\n\n      for ( i = 0; i < table->size; i++ )\n      {\n        FT_MemNode  node, next, *pnode;\n        FT_PtrDist  hash;\n\n\n        node = table->buckets[i];\n        while ( node )\n        {\n          next  = node->link;\n          hash  = FT_MEM_VAL( node->address ) % new_size;\n          pnode = new_buckets + hash;\n\n          node->link = pnode[0];\n          pnode[0]   = node;\n\n          node = next;\n        }\n      }\n\n      if ( table->buckets )\n        ft_mem_table_free( table, table->buckets );\n\n      table->buckets = new_buckets;\n      table->size    = new_size;\n    }\n  }\n\n\n  static FT_MemTable\n  ft_mem_table_new( FT_Memory  memory )\n  {\n    FT_MemTable  table;\n\n\n    table = (FT_MemTable)memory->alloc( memory, sizeof ( *table ) );\n    if ( table == NULL )\n      goto Exit;\n\n    FT_ZERO( table );\n\n    table->size  = FT_MEM_SIZE_MIN;\n    table->nodes = 0;\n\n    table->memory = memory;\n\n    table->memory_user = memory->user;\n\n    table->alloc   = memory->alloc;\n    table->realloc = memory->realloc;\n    table->free    = memory->free;\n\n    table->buckets = (FT_MemNode *)\n                       memory->alloc( memory,\n                                      table->size * sizeof ( FT_MemNode ) );\n    if ( table->buckets )\n      FT_ARRAY_ZERO( table->buckets, table->size );\n    else\n    {\n      memory->free( memory, table );\n      table = NULL;\n    }\n\n  Exit:\n    return table;\n  }\n\n\n  static void\n  ft_mem_table_destroy( FT_MemTable  table )\n  {\n    FT_ULong  i;\n    FT_Long   leak_count = 0;\n    FT_ULong  leaks      = 0;\n\n\n    FT_DumpMemory( table->memory );\n\n    /* remove all blocks from the table, revealing leaked ones */\n    for ( i = 0; i < table->size; i++ )\n    {\n      FT_MemNode  *pnode = table->buckets + i, next, node = *pnode;\n\n\n      while ( node )\n      {\n        next       = node->link;\n        node->link = 0;\n\n        if ( node->size > 0 )\n        {\n          printf(\n            \"leaked memory block at address %p, size %8ld in (%s:%ld)\\n\",\n            node->address, node->size,\n            FT_FILENAME( node->source->file_name ),\n            node->source->line_no );\n\n          leak_count++;\n          leaks += node->size;\n\n          ft_mem_table_free( table, node->address );\n        }\n\n        node->address = NULL;\n        node->size    = 0;\n\n        ft_mem_table_free( table, node );\n        node = next;\n      }\n      table->buckets[i] = 0;\n    }\n\n    ft_mem_table_free( table, table->buckets );\n    table->buckets = NULL;\n\n    table->size  = 0;\n    table->nodes = 0;\n\n    /* remove all sources */\n    for ( i = 0; i < FT_MEM_SOURCE_BUCKETS; i++ )\n    {\n      FT_MemSource  source, next;\n\n\n      for ( source = table->sources[i]; source != NULL; source = next )\n      {\n        next = source->link;\n        ft_mem_table_free( table, source );\n      }\n\n      table->sources[i] = NULL;\n    }\n\n    printf( \"FreeType: total memory allocations = %ld\\n\",\n            table->alloc_total );\n    printf( \"FreeType: maximum memory footprint = %ld\\n\",\n            table->alloc_max );\n\n    ft_mem_table_free( table, table );\n\n    if ( leak_count > 0 )\n      ft_mem_debug_panic(\n        \"FreeType: %ld bytes of memory leaked in %ld blocks\\n\",\n        leaks, leak_count );\n\n    printf( \"FreeType: no memory leaks detected\\n\" );\n  }\n\n\n  static FT_MemNode*\n  ft_mem_table_get_nodep( FT_MemTable  table,\n                          FT_Byte*     address )\n  {\n    FT_PtrDist   hash;\n    FT_MemNode  *pnode, node;\n\n\n    hash  = FT_MEM_VAL( address );\n    pnode = table->buckets + ( hash % table->size );\n\n    for (;;)\n    {\n      node = pnode[0];\n      if ( !node )\n        break;\n\n      if ( node->address == address )\n        break;\n\n      pnode = &node->link;\n    }\n    return pnode;\n  }\n\n\n  static FT_MemSource\n  ft_mem_table_get_source( FT_MemTable  table )\n  {\n    FT_UInt32     hash;\n    FT_MemSource  node, *pnode;\n\n\n    /* cast to FT_PtrDist first since void* can be larger */\n    /* than FT_UInt32 and GCC 4.1.1 emits a warning       */\n    hash  = (FT_UInt32)(FT_PtrDist)(void*)_ft_debug_file +\n              (FT_UInt32)( 5 * _ft_debug_lineno );\n    pnode = &table->sources[hash % FT_MEM_SOURCE_BUCKETS];\n\n    for ( ;; )\n    {\n      node = *pnode;\n      if ( node == NULL )\n        break;\n\n      if ( node->file_name == _ft_debug_file &&\n           node->line_no   == _ft_debug_lineno   )\n        goto Exit;\n\n      pnode = &node->link;\n    }\n\n    node = (FT_MemSource)ft_mem_table_alloc( table, sizeof ( *node ) );\n    if ( node == NULL )\n      ft_mem_debug_panic(\n        \"not enough memory to perform memory debugging\\n\" );\n\n    node->file_name = _ft_debug_file;\n    node->line_no   = _ft_debug_lineno;\n\n    node->cur_blocks = 0;\n    node->max_blocks = 0;\n    node->all_blocks = 0;\n\n    node->cur_size   = 0;\n    node->max_size   = 0;\n    node->all_size   = 0;\n\n    node->cur_max    = 0;\n\n    node->link = NULL;\n    node->hash = hash;\n    *pnode     = node;\n\n  Exit:\n    return node;\n  }\n\n\n  static void\n  ft_mem_table_set( FT_MemTable  table,\n                    FT_Byte*     address,\n                    FT_ULong     size,\n                    FT_Long      delta )\n  {\n    FT_MemNode  *pnode, node;\n\n\n    if ( table )\n    {\n      FT_MemSource  source;\n\n\n      pnode = ft_mem_table_get_nodep( table, address );\n      node  = *pnode;\n      if ( node )\n      {\n        if ( node->size < 0 )\n        {\n          /* This block was already freed.  Our memory is now completely */\n          /* corrupted!                                                  */\n          /* This can only happen in keep-alive mode.                    */\n          ft_mem_debug_panic(\n            \"memory heap corrupted (allocating freed block)\" );\n        }\n        else\n        {\n          /* This block was already allocated.  This means that our memory */\n          /* is also corrupted!                                            */\n          ft_mem_debug_panic(\n            \"memory heap corrupted (re-allocating allocated block at\"\n            \" %p, of size %ld)\\n\"\n            \"org=%s:%d new=%s:%d\\n\",\n            node->address, node->size,\n            FT_FILENAME( node->source->file_name ), node->source->line_no,\n            FT_FILENAME( _ft_debug_file ), _ft_debug_lineno );\n        }\n      }\n\n      /* we need to create a new node in this table */\n      node = (FT_MemNode)ft_mem_table_alloc( table, sizeof ( *node ) );\n      if ( node == NULL )\n        ft_mem_debug_panic( \"not enough memory to run memory tests\" );\n\n      node->address = address;\n      node->size    = size;\n      node->source  = source = ft_mem_table_get_source( table );\n\n      if ( delta == 0 )\n      {\n        /* this is an allocation */\n        source->all_blocks++;\n        source->cur_blocks++;\n        if ( source->cur_blocks > source->max_blocks )\n          source->max_blocks = source->cur_blocks;\n      }\n\n      if ( size > (FT_ULong)source->cur_max )\n        source->cur_max = size;\n\n      if ( delta != 0 )\n      {\n        /* we are growing or shrinking a reallocated block */\n        source->cur_size     += delta;\n        table->alloc_current += delta;\n      }\n      else\n      {\n        /* we are allocating a new block */\n        source->cur_size     += size;\n        table->alloc_current += size;\n      }\n\n      source->all_size += size;\n\n      if ( source->cur_size > source->max_size )\n        source->max_size = source->cur_size;\n\n      node->free_file_name = NULL;\n      node->free_line_no   = 0;\n\n      node->link = pnode[0];\n\n      pnode[0] = node;\n      table->nodes++;\n\n      table->alloc_total += size;\n\n      if ( table->alloc_current > table->alloc_max )\n        table->alloc_max = table->alloc_current;\n\n      if ( table->nodes * 3 < table->size  ||\n           table->size  * 3 < table->nodes )\n        ft_mem_table_resize( table );\n    }\n  }\n\n\n  static void\n  ft_mem_table_remove( FT_MemTable  table,\n                       FT_Byte*     address,\n                       FT_Long      delta )\n  {\n    if ( table )\n    {\n      FT_MemNode  *pnode, node;\n\n\n      pnode = ft_mem_table_get_nodep( table, address );\n      node  = *pnode;\n      if ( node )\n      {\n        FT_MemSource  source;\n\n\n        if ( node->size < 0 )\n          ft_mem_debug_panic(\n            \"freeing memory block at %p more than once at (%s:%ld)\\n\"\n            \"block allocated at (%s:%ld) and released at (%s:%ld)\",\n            address,\n            FT_FILENAME( _ft_debug_file ), _ft_debug_lineno,\n            FT_FILENAME( node->source->file_name ), node->source->line_no,\n            FT_FILENAME( node->free_file_name ), node->free_line_no );\n\n        /* scramble the node's content for additional safety */\n        FT_MEM_SET( address, 0xF3, node->size );\n\n        if ( delta == 0 )\n        {\n          source = node->source;\n\n          source->cur_blocks--;\n          source->cur_size -= node->size;\n\n          table->alloc_current -= node->size;\n        }\n\n        if ( table->keep_alive )\n        {\n          /* we simply invert the node's size to indicate that the node */\n          /* was freed.                                                 */\n          node->size           = -node->size;\n          node->free_file_name = _ft_debug_file;\n          node->free_line_no   = _ft_debug_lineno;\n        }\n        else\n        {\n          table->nodes--;\n\n          *pnode = node->link;\n\n          node->size   = 0;\n          node->source = NULL;\n\n          ft_mem_table_free( table, node );\n\n          if ( table->nodes * 3 < table->size  ||\n               table->size  * 3 < table->nodes )\n            ft_mem_table_resize( table );\n        }\n      }\n      else\n        ft_mem_debug_panic(\n          \"trying to free unknown block at %p in (%s:%ld)\\n\",\n          address,\n          FT_FILENAME( _ft_debug_file ), _ft_debug_lineno );\n    }\n  }\n\n\n  extern FT_Pointer\n  ft_mem_debug_alloc( FT_Memory  memory,\n                      FT_Long    size )\n  {\n    FT_MemTable  table = (FT_MemTable)memory->user;\n    FT_Byte*     block;\n\n\n    if ( size <= 0 )\n      ft_mem_debug_panic( \"negative block size allocation (%ld)\", size );\n\n    /* return NULL if the maximum number of allocations was reached */\n    if ( table->bound_count                           &&\n         table->alloc_count >= table->alloc_count_max )\n      return NULL;\n\n    /* return NULL if this allocation would overflow the maximum heap size */\n    if ( table->bound_total                                             &&\n         table->alloc_total_max - table->alloc_current > (FT_ULong)size )\n      return NULL;\n\n    block = (FT_Byte *)ft_mem_table_alloc( table, size );\n    if ( block )\n    {\n      ft_mem_table_set( table, block, (FT_ULong)size, 0 );\n\n      table->alloc_count++;\n    }\n\n    _ft_debug_file   = \"<unknown>\";\n    _ft_debug_lineno = 0;\n\n    return (FT_Pointer)block;\n  }\n\n\n  extern void\n  ft_mem_debug_free( FT_Memory   memory,\n                     FT_Pointer  block )\n  {\n    FT_MemTable  table = (FT_MemTable)memory->user;\n\n\n    if ( block == NULL )\n      ft_mem_debug_panic( \"trying to free NULL in (%s:%ld)\",\n                          FT_FILENAME( _ft_debug_file ),\n                          _ft_debug_lineno );\n\n    ft_mem_table_remove( table, (FT_Byte*)block, 0 );\n\n    if ( !table->keep_alive )\n      ft_mem_table_free( table, block );\n\n    table->alloc_count--;\n\n    _ft_debug_file   = \"<unknown>\";\n    _ft_debug_lineno = 0;\n  }\n\n\n  extern FT_Pointer\n  ft_mem_debug_realloc( FT_Memory   memory,\n                        FT_Long     cur_size,\n                        FT_Long     new_size,\n                        FT_Pointer  block )\n  {\n    FT_MemTable  table = (FT_MemTable)memory->user;\n    FT_MemNode   node, *pnode;\n    FT_Pointer   new_block;\n    FT_Long      delta;\n\n    const char*  file_name = FT_FILENAME( _ft_debug_file );\n    FT_Long      line_no   = _ft_debug_lineno;\n\n\n    /* unlikely, but possible */\n    if ( new_size == cur_size )\n      return block;\n\n    /* the following is valid according to ANSI C */\n#if 0\n    if ( block == NULL || cur_size == 0 )\n      ft_mem_debug_panic( \"trying to reallocate NULL in (%s:%ld)\",\n                          file_name, line_no );\n#endif\n\n    /* while the following is allowed in ANSI C also, we abort since */\n    /* such case should be handled by FreeType.                      */\n    if ( new_size <= 0 )\n      ft_mem_debug_panic(\n        \"trying to reallocate %p to size 0 (current is %ld) in (%s:%ld)\",\n        block, cur_size, file_name, line_no );\n\n    /* check `cur_size' value */\n    pnode = ft_mem_table_get_nodep( table, (FT_Byte*)block );\n    node  = *pnode;\n    if ( !node )\n      ft_mem_debug_panic(\n        \"trying to reallocate unknown block at %p in (%s:%ld)\",\n        block, file_name, line_no );\n\n    if ( node->size <= 0 )\n      ft_mem_debug_panic(\n        \"trying to reallocate freed block at %p in (%s:%ld)\",\n        block, file_name, line_no );\n\n    if ( node->size != cur_size )\n      ft_mem_debug_panic( \"invalid ft_realloc request for %p. cur_size is \"\n                          \"%ld instead of %ld in (%s:%ld)\",\n                          block, cur_size, node->size, file_name, line_no );\n\n    /* return NULL if the maximum number of allocations was reached */\n    if ( table->bound_count                           &&\n         table->alloc_count >= table->alloc_count_max )\n      return NULL;\n\n    delta = (FT_Long)( new_size - cur_size );\n\n    /* return NULL if this allocation would overflow the maximum heap size */\n    if ( delta > 0                                                       &&\n         table->bound_total                                              &&\n         table->alloc_current + (FT_ULong)delta > table->alloc_total_max )\n      return NULL;\n\n    new_block = (FT_Byte *)ft_mem_table_alloc( table, new_size );\n    if ( new_block == NULL )\n      return NULL;\n\n    ft_mem_table_set( table, (FT_Byte*)new_block, new_size, delta );\n\n    ft_memcpy( new_block, block, cur_size < new_size ? cur_size : new_size );\n\n    ft_mem_table_remove( table, (FT_Byte*)block, delta );\n\n    _ft_debug_file   = \"<unknown>\";\n    _ft_debug_lineno = 0;\n\n    if ( !table->keep_alive )\n      ft_mem_table_free( table, block );\n\n    return new_block;\n  }\n\n\n  extern FT_Int\n  ft_mem_debug_init( FT_Memory  memory )\n  {\n    FT_MemTable  table;\n    FT_Int       result = 0;\n\n\n    if (1)/* XYQ: always enable ( getenv( \"FT2_DEBUG_MEMORY\" ) ) */\n    {\n      table = ft_mem_table_new( memory );\n      if ( table )\n      {\n        const char*  p;\n\n\n        memory->user    = table;\n        memory->alloc   = ft_mem_debug_alloc;\n        memory->realloc = ft_mem_debug_realloc;\n        memory->free    = ft_mem_debug_free;\n\n        p = getenv( \"FT2_ALLOC_TOTAL_MAX\" );\n        if ( p != NULL )\n        {\n          FT_Long   total_max = ft_atol( p );\n\n\n          if ( total_max > 0 )\n          {\n            table->bound_total     = 1;\n            table->alloc_total_max = (FT_ULong)total_max;\n          }\n        }\n\n        p = getenv( \"FT2_ALLOC_COUNT_MAX\" );\n        if ( p != NULL )\n        {\n          FT_Long  total_count = ft_atol( p );\n\n\n          if ( total_count > 0 )\n          {\n            table->bound_count     = 1;\n            table->alloc_count_max = (FT_ULong)total_count;\n          }\n        }\n\n        p = getenv( \"FT2_KEEP_ALIVE\" );\n        if ( p != NULL )\n        {\n          FT_Long  keep_alive = ft_atol( p );\n\n\n          if ( keep_alive > 0 )\n            table->keep_alive = 1;\n        }\n\n        result = 1;\n      }\n    }\n    return result;\n  }\n\n\n  extern void\n  ft_mem_debug_done( FT_Memory  memory )\n  {\n    FT_MemTable  table = (FT_MemTable)memory->user;\n\n\n    if ( table )\n    {\n      memory->free    = table->free;\n      memory->realloc = table->realloc;\n      memory->alloc   = table->alloc;\n\n      ft_mem_table_destroy( table );\n      memory->user = NULL;\n    }\n  }\n\n\n\n  static int\n  ft_mem_source_compare( const void*  p1,\n                         const void*  p2 )\n  {\n    FT_MemSource  s1 = *(FT_MemSource*)p1;\n    FT_MemSource  s2 = *(FT_MemSource*)p2;\n\n\n    if ( s2->max_size > s1->max_size )\n      return 1;\n    else if ( s2->max_size < s1->max_size )\n      return -1;\n    else\n      return 0;\n  }\n\n\n  extern void\n  FT_DumpMemory( FT_Memory  memory )\n  {\n    FT_MemTable  table = (FT_MemTable)memory->user;\n\n\n    if ( table )\n    {\n      FT_MemSource*  bucket = table->sources;\n      FT_MemSource*  limit  = bucket + FT_MEM_SOURCE_BUCKETS;\n      FT_MemSource*  sources;\n      FT_UInt        nn, count;\n      const char*    fmt;\n\n\n      count = 0;\n      for ( ; bucket < limit; bucket++ )\n      {\n        FT_MemSource  source = *bucket;\n\n\n        for ( ; source; source = source->link )\n          count++;\n      }\n\n      sources = (FT_MemSource*)ft_mem_table_alloc(\n                                 table, sizeof ( *sources ) * count );\n\n      count = 0;\n      for ( bucket = table->sources; bucket < limit; bucket++ )\n      {\n        FT_MemSource  source = *bucket;\n\n\n        for ( ; source; source = source->link )\n          sources[count++] = source;\n      }\n\n      ft_qsort( sources, count, sizeof ( *sources ), ft_mem_source_compare );\n\n      printf( \"FreeType Memory Dump: \"\n              \"current=%ld max=%ld total=%ld count=%ld\\n\",\n              table->alloc_current, table->alloc_max,\n              table->alloc_total, table->alloc_count );\n      printf( \" block  block    sizes    sizes    sizes   source\\n\" );\n      printf( \" count   high      sum  highsum      max   location\\n\" );\n      printf( \"-------------------------------------------------\\n\" );\n\n      fmt = \"%6ld %6ld %8ld %8ld %8ld %s:%d\\n\";\n\n      for ( nn = 0; nn < count; nn++ )\n      {\n        FT_MemSource  source = sources[nn];\n\n\n        printf( fmt,\n                source->cur_blocks, source->max_blocks,\n                source->cur_size, source->max_size, source->cur_max,\n                FT_FILENAME( source->file_name ),\n                source->line_no );\n      }\n      printf( \"------------------------------------------------\\n\" );\n\n      ft_mem_table_free( table, sources );\n    }\n  }\n\n#else  /* !FT_DEBUG_MEMORY */\n\n  /* ANSI C doesn't like empty source files */\n  typedef int  _debug_mem_dummy;\n\n#endif /* !FT_DEBUG_MEMORY */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftdebug.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftdebug.c                                                              */\n/*                                                                         */\n/*    Debugging and logging component (body).                              */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2004, 2008, 2013 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This component contains various macros and functions used to ease the */\n  /* debugging of the FreeType engine.  Its main purpose is in assertion   */\n  /* checking, tracing, and error detection.                               */\n  /*                                                                       */\n  /* There are now three debugging modes:                                  */\n  /*                                                                       */\n  /* - trace mode                                                          */\n  /*                                                                       */\n  /*   Error and trace messages are sent to the log file (which can be the */\n  /*   standard error output).                                             */\n  /*                                                                       */\n  /* - error mode                                                          */\n  /*                                                                       */\n  /*   Only error messages are generated.                                  */\n  /*                                                                       */\n  /* - release mode:                                                       */\n  /*                                                                       */\n  /*   No error message is sent or generated.  The code is free from any   */\n  /*   debugging parts.                                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/freetype.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n\n\n#ifdef FT_DEBUG_LEVEL_ERROR\n\n  /* documentation is in ftdebug.h */\n\n  FT_BASE_DEF( void )\n  FT_Message( const char*  fmt,\n              ... )\n  {\n    va_list  ap;\n\n\n    va_start( ap, fmt );\n    vfprintf( stderr, fmt, ap );\n    va_end( ap );\n  }\n\n\n  /* documentation is in ftdebug.h */\n\n  FT_BASE_DEF( void )\n  FT_Panic( const char*  fmt,\n            ... )\n  {\n    va_list  ap;\n\n\n    va_start( ap, fmt );\n    vfprintf( stderr, fmt, ap );\n    va_end( ap );\n\n    exit( EXIT_FAILURE );\n  }\n\n\n  /* documentation is in ftdebug.h */\n\n  FT_BASE_DEF( int )\n  FT_Throw( FT_Error     error,\n            int          line,\n            const char*  file )\n  {\n    FT_UNUSED( error );\n    FT_UNUSED( line );\n    FT_UNUSED( file );\n\n    return 0;\n  }\n\n#endif /* FT_DEBUG_LEVEL_ERROR */\n\n\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n  /* array of trace levels, initialized to 0 */\n  int  ft_trace_levels[trace_count];\n\n\n  /* define array of trace toggle names */\n#define FT_TRACE_DEF( x )  #x ,\n\n  static const char*  ft_trace_toggles[trace_count + 1] =\n  {\n#include \"../../include/freetype/internal/fttrace.h\"\n    NULL\n  };\n\n#undef FT_TRACE_DEF\n\n\n  /* documentation is in ftdebug.h */\n\n  FT_BASE_DEF( FT_Int )\n  FT_Trace_Get_Count( void )\n  {\n    return trace_count;\n  }\n\n\n  /* documentation is in ftdebug.h */\n\n  FT_BASE_DEF( const char * )\n  FT_Trace_Get_Name( FT_Int  idx )\n  {\n    int  max = FT_Trace_Get_Count();\n\n\n    if ( idx < max )\n      return ft_trace_toggles[idx];\n    else\n      return NULL;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Initialize the tracing sub-system.  This is done by retrieving the    */\n  /* value of the `FT2_DEBUG' environment variable.  It must be a list of  */\n  /* toggles, separated by spaces, `;', or `,'.  Example:                  */\n  /*                                                                       */\n  /*    export FT2_DEBUG=\"any:3 memory:7 stream:5\"                         */\n  /*                                                                       */\n  /* This requests that all levels be set to 3, except the trace level for */\n  /* the memory and stream components which are set to 7 and 5,            */\n  /* respectively.                                                         */\n  /*                                                                       */\n  /* See the file <include/freetype/internal/fttrace.h> for details of the */\n  /* available toggle names.                                               */\n  /*                                                                       */\n  /* The level must be between 0 and 7; 0 means quiet (except for serious  */\n  /* runtime errors), and 7 means _very_ verbose.                          */\n  /*                                                                       */\n  FT_BASE_DEF( void )\n  ft_debug_init( void )\n  {\n    const char*  ft2_debug = getenv( \"FT2_DEBUG\" );\n\n\n    if ( ft2_debug )\n    {\n      const char*  p = ft2_debug;\n      const char*  q;\n\n\n      for ( ; *p; p++ )\n      {\n        /* skip leading whitespace and separators */\n        if ( *p == ' ' || *p == '\\t' || *p == ',' || *p == ';' || *p == '=' )\n          continue;\n\n        /* read toggle name, followed by ':' */\n        q = p;\n        while ( *p && *p != ':' )\n          p++;\n\n        if ( !*p )\n          break;\n\n        if ( *p == ':' && p > q )\n        {\n          FT_Int  n, i, len = (FT_Int)( p - q );\n          FT_Int  level = -1, found = -1;\n\n\n          for ( n = 0; n < trace_count; n++ )\n          {\n            const char*  toggle = ft_trace_toggles[n];\n\n\n            for ( i = 0; i < len; i++ )\n            {\n              if ( toggle[i] != q[i] )\n                break;\n            }\n\n            if ( i == len && toggle[i] == 0 )\n            {\n              found = n;\n              break;\n            }\n          }\n\n          /* read level */\n          p++;\n          if ( *p )\n          {\n            level = *p - '0';\n            if ( level < 0 || level > 7 )\n              level = -1;\n          }\n\n          if ( found >= 0 && level >= 0 )\n          {\n            if ( found == trace_any )\n            {\n              /* special case for `any' */\n              for ( n = 0; n < trace_count; n++ )\n                ft_trace_levels[n] = level;\n            }\n            else\n              ft_trace_levels[found] = level;\n          }\n        }\n      }\n    }\n  }\n\n\n#else  /* !FT_DEBUG_LEVEL_TRACE */\n\n\n  FT_BASE_DEF( void )\n  ft_debug_init( void )\n  {\n    /* nothing */\n  }\n\n\n  FT_BASE_DEF( FT_Int )\n  FT_Trace_Get_Count( void )\n  {\n    return 0;\n  }\n\n\n  FT_BASE_DEF( const char * )\n  FT_Trace_Get_Name( FT_Int  idx )\n  {\n    FT_UNUSED( idx );\n\n    return NULL;\n  }\n\n\n#endif /* !FT_DEBUG_LEVEL_TRACE */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftfstype.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftfstype.c                                                             */\n/*                                                                         */\n/*    FreeType utility file to access FSType data (body).                  */\n/*                                                                         */\n/*  Copyright 2008, 2009 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/t1tables.h\"\n#include \"../../include/freetype/tttables.h\"\n#include \"../../include/freetype/internal/ftserv.h\"\n#include \"../../include/freetype/internal/services/svpsinfo.h\"\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_UShort )\n  FT_Get_FSType_Flags( FT_Face  face )\n  {\n    TT_OS2*  os2;\n\n\n    /* first, try to get the fs_type directly from the font */\n    if ( face )\n    {\n      FT_Service_PsInfo  service = NULL;\n\n\n      FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );\n\n      if ( service && service->ps_get_font_extra )\n      {\n        PS_FontExtraRec  extra;\n\n\n        if ( !service->ps_get_font_extra( face, &extra ) &&\n             extra.fs_type != 0                          )\n          return extra.fs_type;\n      }\n    }\n\n    /* look at FSType before fsType for Type42 */\n\n    if ( ( os2 = (TT_OS2*)FT_Get_Sfnt_Table( face, ft_sfnt_os2 ) ) != NULL &&\n         os2->version != 0xFFFFU                                           )\n      return os2->fsType;\n\n    return 0;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgasp.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftgasp.c                                                               */\n/*                                                                         */\n/*    Access of TrueType's `gasp' table (body).                            */\n/*                                                                         */\n/*  Copyright 2007 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/ftgasp.h\"\n#include \"../../include/freetype/internal/tttypes.h\"\n\n\n  FT_EXPORT_DEF( FT_Int )\n  FT_Get_Gasp( FT_Face  face,\n               FT_UInt  ppem )\n  {\n    FT_Int  result = FT_GASP_NO_TABLE;\n\n\n    if ( face && FT_IS_SFNT( face ) )\n    {\n      TT_Face  ttface = (TT_Face)face;\n\n\n      if ( ttface->gasp.numRanges > 0 )\n      {\n        TT_GaspRange  range     = ttface->gasp.gaspRanges;\n        TT_GaspRange  range_end = range + ttface->gasp.numRanges;\n\n\n        while ( ppem > range->maxPPEM )\n        {\n          range++;\n          if ( range >= range_end )\n            goto Exit;\n        }\n\n        result = range->gaspFlag;\n\n        /* ensure that we don't have spurious bits */\n        if ( ttface->gasp.version == 0 )\n          result &= 3;\n      }\n    }\n  Exit:\n    return result;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgloadr.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftgloadr.c                                                             */\n/*                                                                         */\n/*    The FreeType glyph loader (body).                                    */\n/*                                                                         */\n/*  Copyright 2002-2006, 2010, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg                       */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftgloadr.h\"\n#include \"../../include/freetype/internal/ftmemory.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_gloader\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                                                               *****/\n  /*****                    G L Y P H   L O A D E R                    *****/\n  /*****                                                               *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The glyph loader is a simple object which is used to load a set of    */\n  /* glyphs easily.  It is critical for the correct loading of composites. */\n  /*                                                                       */\n  /* Ideally, one can see it as a stack of abstract `glyph' objects.       */\n  /*                                                                       */\n  /*   loader.base     Is really the bottom of the stack.  It describes a  */\n  /*                   single glyph image made of the juxtaposition of     */\n  /*                   several glyphs (those `in the stack').              */\n  /*                                                                       */\n  /*   loader.current  Describes the top of the stack, on which a new      */\n  /*                   glyph can be loaded.                                */\n  /*                                                                       */\n  /*   Rewind          Clears the stack.                                   */\n  /*   Prepare         Set up `loader.current' for addition of a new glyph */\n  /*                   image.                                              */\n  /*   Add             Add the `current' glyph image to the `base' one,    */\n  /*                   and prepare for another one.                        */\n  /*                                                                       */\n  /* The glyph loader is now a base object.  Each driver used to           */\n  /* re-implement it in one way or the other, which wasted code and        */\n  /* energy.                                                               */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* create a new glyph loader */\n  FT_BASE_DEF( FT_Error )\n  FT_GlyphLoader_New( FT_Memory        memory,\n                      FT_GlyphLoader  *aloader )\n  {\n    FT_GlyphLoader  loader = NULL;\n    FT_Error        error;\n\n\n    if ( !FT_NEW( loader ) )\n    {\n      loader->memory = memory;\n      *aloader       = loader;\n    }\n    return error;\n  }\n\n\n  /* rewind the glyph loader - reset counters to 0 */\n  FT_BASE_DEF( void )\n  FT_GlyphLoader_Rewind( FT_GlyphLoader  loader )\n  {\n    FT_GlyphLoad  base    = &loader->base;\n    FT_GlyphLoad  current = &loader->current;\n\n\n    base->outline.n_points   = 0;\n    base->outline.n_contours = 0;\n    base->num_subglyphs      = 0;\n\n    *current = *base;\n  }\n\n\n  /* reset the glyph loader, frees all allocated tables */\n  /* and starts from zero                               */\n  FT_BASE_DEF( void )\n  FT_GlyphLoader_Reset( FT_GlyphLoader  loader )\n  {\n    FT_Memory memory = loader->memory;\n\n\n    FT_FREE( loader->base.outline.points );\n    FT_FREE( loader->base.outline.tags );\n    FT_FREE( loader->base.outline.contours );\n    FT_FREE( loader->base.extra_points );\n    FT_FREE( loader->base.subglyphs );\n\n    loader->base.extra_points2 = NULL;\n\n    loader->max_points    = 0;\n    loader->max_contours  = 0;\n    loader->max_subglyphs = 0;\n\n    FT_GlyphLoader_Rewind( loader );\n  }\n\n\n  /* delete a glyph loader */\n  FT_BASE_DEF( void )\n  FT_GlyphLoader_Done( FT_GlyphLoader  loader )\n  {\n    if ( loader )\n    {\n      FT_Memory memory = loader->memory;\n\n\n      FT_GlyphLoader_Reset( loader );\n      FT_FREE( loader );\n    }\n  }\n\n\n  /* re-adjust the `current' outline fields */\n  static void\n  FT_GlyphLoader_Adjust_Points( FT_GlyphLoader  loader )\n  {\n    FT_Outline*  base    = &loader->base.outline;\n    FT_Outline*  current = &loader->current.outline;\n\n\n    current->points   = base->points   + base->n_points;\n    current->tags     = base->tags     + base->n_points;\n    current->contours = base->contours + base->n_contours;\n\n    /* handle extra points table - if any */\n    if ( loader->use_extra )\n    {\n      loader->current.extra_points  = loader->base.extra_points +\n                                      base->n_points;\n\n      loader->current.extra_points2 = loader->base.extra_points2 +\n                                      base->n_points;\n    }\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_GlyphLoader_CreateExtra( FT_GlyphLoader  loader )\n  {\n    FT_Error   error;\n    FT_Memory  memory = loader->memory;\n\n\n    if ( !FT_NEW_ARRAY( loader->base.extra_points, 2 * loader->max_points ) )\n    {\n      loader->use_extra          = 1;\n      loader->base.extra_points2 = loader->base.extra_points +\n                                   loader->max_points;\n\n      FT_GlyphLoader_Adjust_Points( loader );\n    }\n    return error;\n  }\n\n\n  /* re-adjust the `current' subglyphs field */\n  static void\n  FT_GlyphLoader_Adjust_Subglyphs( FT_GlyphLoader  loader )\n  {\n    FT_GlyphLoad  base    = &loader->base;\n    FT_GlyphLoad  current = &loader->current;\n\n\n    current->subglyphs = base->subglyphs + base->num_subglyphs;\n  }\n\n\n  /* Ensure that we can add `n_points' and `n_contours' to our glyph.      */\n  /* This function reallocates its outline tables if necessary.  Note that */\n  /* it DOESN'T change the number of points within the loader!             */\n  /*                                                                       */\n  FT_BASE_DEF( FT_Error )\n  FT_GlyphLoader_CheckPoints( FT_GlyphLoader  loader,\n                              FT_UInt         n_points,\n                              FT_UInt         n_contours )\n  {\n    FT_Memory    memory  = loader->memory;\n    FT_Error     error   = FT_Err_Ok;\n    FT_Outline*  base    = &loader->base.outline;\n    FT_Outline*  current = &loader->current.outline;\n    FT_Bool      adjust  = 0;\n\n    FT_UInt      new_max, old_max;\n\n\n    /* check points & tags */\n    new_max = base->n_points + current->n_points + n_points;\n    old_max = loader->max_points;\n\n    if ( new_max > old_max )\n    {\n      new_max = FT_PAD_CEIL( new_max, 8 );\n\n      if ( new_max > FT_OUTLINE_POINTS_MAX )\n        return FT_THROW( Array_Too_Large );\n\n      if ( FT_RENEW_ARRAY( base->points, old_max, new_max ) ||\n           FT_RENEW_ARRAY( base->tags,   old_max, new_max ) )\n        goto Exit;\n\n      if ( loader->use_extra )\n      {\n        if ( FT_RENEW_ARRAY( loader->base.extra_points,\n                             old_max * 2, new_max * 2 ) )\n          goto Exit;\n\n        FT_ARRAY_MOVE( loader->base.extra_points + new_max,\n                       loader->base.extra_points + old_max,\n                       old_max );\n\n        loader->base.extra_points2 = loader->base.extra_points + new_max;\n      }\n\n      adjust = 1;\n      loader->max_points = new_max;\n    }\n\n    /* check contours */\n    old_max = loader->max_contours;\n    new_max = base->n_contours + current->n_contours +\n              n_contours;\n    if ( new_max > old_max )\n    {\n      new_max = FT_PAD_CEIL( new_max, 4 );\n\n      if ( new_max > FT_OUTLINE_CONTOURS_MAX )\n        return FT_THROW( Array_Too_Large );\n\n      if ( FT_RENEW_ARRAY( base->contours, old_max, new_max ) )\n        goto Exit;\n\n      adjust = 1;\n      loader->max_contours = new_max;\n    }\n\n    if ( adjust )\n      FT_GlyphLoader_Adjust_Points( loader );\n\n  Exit:\n    if ( error )\n      FT_GlyphLoader_Reset( loader );\n\n    return error;\n  }\n\n\n  /* Ensure that we can add `n_subglyphs' to our glyph. this function */\n  /* reallocates its subglyphs table if necessary.  Note that it DOES */\n  /* NOT change the number of subglyphs within the loader!            */\n  /*                                                                  */\n  FT_BASE_DEF( FT_Error )\n  FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader  loader,\n                                 FT_UInt         n_subs )\n  {\n    FT_Memory     memory = loader->memory;\n    FT_Error      error  = FT_Err_Ok;\n    FT_UInt       new_max, old_max;\n\n    FT_GlyphLoad  base    = &loader->base;\n    FT_GlyphLoad  current = &loader->current;\n\n\n    new_max = base->num_subglyphs + current->num_subglyphs + n_subs;\n    old_max = loader->max_subglyphs;\n    if ( new_max > old_max )\n    {\n      new_max = FT_PAD_CEIL( new_max, 2 );\n      if ( FT_RENEW_ARRAY( base->subglyphs, old_max, new_max ) )\n        goto Exit;\n\n      loader->max_subglyphs = new_max;\n\n      FT_GlyphLoader_Adjust_Subglyphs( loader );\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /* prepare loader for the addition of a new glyph on top of the base one */\n  FT_BASE_DEF( void )\n  FT_GlyphLoader_Prepare( FT_GlyphLoader  loader )\n  {\n    FT_GlyphLoad  current = &loader->current;\n\n\n    current->outline.n_points   = 0;\n    current->outline.n_contours = 0;\n    current->num_subglyphs      = 0;\n\n    FT_GlyphLoader_Adjust_Points   ( loader );\n    FT_GlyphLoader_Adjust_Subglyphs( loader );\n  }\n\n\n  /* add current glyph to the base image -- and prepare for another */\n  FT_BASE_DEF( void )\n  FT_GlyphLoader_Add( FT_GlyphLoader  loader )\n  {\n    FT_GlyphLoad  base;\n    FT_GlyphLoad  current;\n\n    FT_UInt       n_curr_contours;\n    FT_UInt       n_base_points;\n    FT_UInt       n;\n\n\n    if ( !loader )\n      return;\n\n    base    = &loader->base;\n    current = &loader->current;\n\n    n_curr_contours = current->outline.n_contours;\n    n_base_points   = base->outline.n_points;\n\n    base->outline.n_points =\n      (short)( base->outline.n_points + current->outline.n_points );\n    base->outline.n_contours =\n      (short)( base->outline.n_contours + current->outline.n_contours );\n\n    base->num_subglyphs += current->num_subglyphs;\n\n    /* adjust contours count in newest outline */\n    for ( n = 0; n < n_curr_contours; n++ )\n      current->outline.contours[n] =\n        (short)( current->outline.contours[n] + n_base_points );\n\n    /* prepare for another new glyph image */\n    FT_GlyphLoader_Prepare( loader );\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_GlyphLoader_CopyPoints( FT_GlyphLoader  target,\n                             FT_GlyphLoader  source )\n  {\n    FT_Error  error;\n    FT_UInt   num_points   = source->base.outline.n_points;\n    FT_UInt   num_contours = source->base.outline.n_contours;\n\n\n    error = FT_GlyphLoader_CheckPoints( target, num_points, num_contours );\n    if ( !error )\n    {\n      FT_Outline*  out = &target->base.outline;\n      FT_Outline*  in  = &source->base.outline;\n\n\n      FT_ARRAY_COPY( out->points, in->points,\n                     num_points );\n      FT_ARRAY_COPY( out->tags, in->tags,\n                     num_points );\n      FT_ARRAY_COPY( out->contours, in->contours,\n                     num_contours );\n\n      /* do we need to copy the extra points? */\n      if ( target->use_extra && source->use_extra )\n      {\n        FT_ARRAY_COPY( target->base.extra_points, source->base.extra_points,\n                       num_points );\n        FT_ARRAY_COPY( target->base.extra_points2, source->base.extra_points2,\n                       num_points );\n      }\n\n      out->n_points   = (short)num_points;\n      out->n_contours = (short)num_contours;\n\n      FT_GlyphLoader_Adjust_Points( target );\n    }\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgxval.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftgxval.c                                                              */\n/*                                                                         */\n/*    FreeType API for validating TrueTyepGX/AAT tables (body).            */\n/*                                                                         */\n/*  Copyright 2004-2006, 2010, 2013 by                                     */\n/*  Masatake YAMATO, Redhat K.K,                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/internal/services/svgxval.h\"\n\n\n  /* documentation is in ftgxval.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_TrueTypeGX_Validate( FT_Face   face,\n                          FT_UInt   validation_flags,\n                          FT_Bytes  tables[FT_VALIDATE_GX_LENGTH],\n                          FT_UInt   table_length )\n  {\n    FT_Service_GXvalidate  service;\n    FT_Error               error;\n\n\n    if ( !face )\n    {\n      error = FT_THROW( Invalid_Face_Handle );\n      goto Exit;\n    }\n\n    if ( tables == NULL )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    FT_FACE_FIND_GLOBAL_SERVICE( face, service, GX_VALIDATE );\n\n    if ( service )\n      error = service->validate( face,\n                                 validation_flags,\n                                 tables,\n                                 table_length );\n    else\n      error = FT_THROW( Unimplemented_Feature );\n\n  Exit:\n    return error;\n  }\n\n\n  FT_EXPORT_DEF( void )\n  FT_TrueTypeGX_Free( FT_Face   face,\n                      FT_Bytes  table )\n  {\n    FT_Memory  memory;\n\n\n    if ( !face )\n      return;\n\n    memory = FT_FACE_MEMORY( face );\n\n    FT_FREE( table );\n  }\n\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_ClassicKern_Validate( FT_Face    face,\n                           FT_UInt    validation_flags,\n                           FT_Bytes  *ckern_table )\n  {\n    FT_Service_CKERNvalidate  service;\n    FT_Error                  error;\n\n\n    if ( !face )\n    {\n      error = FT_THROW( Invalid_Face_Handle );\n      goto Exit;\n    }\n\n    if ( ckern_table == NULL )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    FT_FACE_FIND_GLOBAL_SERVICE( face, service, CLASSICKERN_VALIDATE );\n\n    if ( service )\n      error = service->validate( face,\n                                 validation_flags,\n                                 ckern_table );\n    else\n      error = FT_THROW( Unimplemented_Feature );\n\n  Exit:\n    return error;\n  }\n\n\n  FT_EXPORT_DEF( void )\n  FT_ClassicKern_Free( FT_Face   face,\n                       FT_Bytes  table )\n  {\n    FT_Memory  memory;\n\n\n    if ( !face )\n      return;\n\n    memory = FT_FACE_MEMORY( face );\n\n\n    FT_FREE( table );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftmac.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftmac.c                                                                */\n/*                                                                         */\n/*    Mac FOND support.  Written by just@letterror.com.                    */\n/*  Heavily modified by mpsuzuki, George Williams, and Sean McBride.       */\n/*                                                                         */\n/*  This file is for Mac OS X only; see builds/mac/ftoldmac.c for          */\n/*  classic platforms built by MPW.                                        */\n/*                                                                         */\n/*  Copyright 1996-2009, 2013 by                                           */\n/*  Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg.     */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*\n    Notes\n\n    Mac suitcase files can (and often do!) contain multiple fonts.  To\n    support this I use the face_index argument of FT_(Open|New)_Face()\n    functions, and pretend the suitcase file is a collection.\n\n    Warning: fbit and NFNT bitmap resources are not supported yet.  In old\n    sfnt fonts, bitmap glyph data for each size is stored in each `NFNT'\n    resources instead of the `bdat' table in the sfnt resource.  Therefore,\n    face->num_fixed_sizes is set to 0, because bitmap data in `NFNT'\n    resource is unavailable at present.\n\n    The Mac FOND support works roughly like this:\n\n    - Check whether the offered stream points to a Mac suitcase file.  This\n      is done by checking the file type: it has to be 'FFIL' or 'tfil'.  The\n      stream that gets passed to our init_face() routine is a stdio stream,\n      which isn't usable for us, since the FOND resources live in the\n      resource fork.  So we just grab the stream->pathname field.\n\n    - Read the FOND resource into memory, then check whether there is a\n      TrueType font and/or(!) a Type 1 font available.\n\n    - If there is a Type 1 font available (as a separate `LWFN' file), read\n      its data into memory, massage it slightly so it becomes PFB data, wrap\n      it into a memory stream, load the Type 1 driver and delegate the rest\n      of the work to it by calling FT_Open_Face().  (XXX TODO: after this\n      has been done, the kerning data from the FOND resource should be\n      appended to the face: On the Mac there are usually no AFM files\n      available.  However, this is tricky since we need to map Mac char\n      codes to ps glyph names to glyph ID's...)\n\n    - If there is a TrueType font (an `sfnt' resource), read it into memory,\n      wrap it into a memory stream, load the TrueType driver and delegate\n      the rest of the work to it, by calling FT_Open_Face().\n\n    - Some suitcase fonts (notably Onyx) might point the `LWFN' file to\n      itself, even though it doesn't contains `POST' resources.  To handle\n      this special case without opening the file an extra time, we just\n      ignore errors from the `LWFN' and fallback to the `sfnt' if both are\n      available.\n  */\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/freetype.h\"\n#include \"../../include/freetype/tttags.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"ftbase.h\"\n\n  /* This is for Mac OS X.  Without redefinition, OS_INLINE */\n  /* expands to `static inline' which doesn't survive the   */\n  /* -ansi compilation flag of GCC.                         */\n#if !HAVE_ANSI_OS_INLINE\n#undef  OS_INLINE\n#define OS_INLINE  static __inline__\n#endif\n\n  /* `configure' checks the availability of `ResourceIndex' strictly */\n  /* and sets HAVE_TYPE_RESOURCE_INDEX 1 or 0 always.  If it is      */\n  /* not set (e.g., a build without `configure'), the availability   */\n  /* is guessed from the SDK version.                                */\n#ifndef HAVE_TYPE_RESOURCE_INDEX\n#if !defined( MAC_OS_X_VERSION_10_5 ) || \\\n    ( MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 )\n#define HAVE_TYPE_RESOURCE_INDEX 0\n#else\n#define HAVE_TYPE_RESOURCE_INDEX 1\n#endif\n#endif /* !HAVE_TYPE_RESOURCE_INDEX */\n\n#if ( HAVE_TYPE_RESOURCE_INDEX == 0 )\n  typedef short  ResourceIndex;\n#endif\n\n#include <CoreServices/CoreServices.h>\n#include <ApplicationServices/ApplicationServices.h>\n#include <sys/syslimits.h> /* PATH_MAX */\n\n  /* Don't want warnings about our own use of deprecated functions. */\n#define FT_DEPRECATED_ATTRIBUTE\n\n#include \"../../include/freetype/ftmac.h\"\n\n#ifndef kATSOptionFlagsUnRestrictedScope /* since Mac OS X 10.1 */\n#define kATSOptionFlagsUnRestrictedScope kATSOptionFlagsDefault\n#endif\n\n\n  /* Set PREFER_LWFN to 1 if LWFN (Type 1) is preferred over\n     TrueType in case *both* are available (this is not common,\n     but it *is* possible). */\n#ifndef PREFER_LWFN\n#define PREFER_LWFN  1\n#endif\n\n\n#ifdef FT_MACINTOSH\n\n  /* This function is deprecated because FSSpec is deprecated in Mac OS X  */\n  FT_EXPORT_DEF( FT_Error )\n  FT_GetFile_From_Mac_Name( const char*  fontName,\n                            FSSpec*      pathSpec,\n                            FT_Long*     face_index )\n  {\n    FT_UNUSED( fontName );\n    FT_UNUSED( pathSpec );\n    FT_UNUSED( face_index );\n\n    return FT_THROW( Unimplemented_Feature );\n  }\n\n\n  /* Private function.                                         */\n  /* The FSSpec type has been discouraged for a long time,     */\n  /* unfortunately an FSRef replacement API for                */\n  /* ATSFontGetFileSpecification() is only available in        */\n  /* Mac OS X 10.5 and later.                                  */\n  static OSStatus\n  FT_ATSFontGetFileReference( ATSFontRef  ats_font_id,\n                              FSRef*      ats_font_ref )\n  {\n#if defined( MAC_OS_X_VERSION_10_5 ) && \\\n    ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 )\n\n    OSStatus  err;\n\n    err = ATSFontGetFileReference( ats_font_id, ats_font_ref );\n\n    return err;\n#elif __LP64__ /* No 64bit Carbon API on legacy platforms */\n    FT_UNUSED( ats_font_id );\n    FT_UNUSED( ats_font_ref );\n\n\n    return fnfErr;\n#else /* 32bit Carbon API on legacy platforms */\n    OSStatus  err;\n    FSSpec    spec;\n\n\n    err = ATSFontGetFileSpecification( ats_font_id, &spec );\n    if ( noErr == err )\n      err = FSpMakeFSRef( &spec, ats_font_ref );\n\n    return err;\n#endif\n  }\n\n\n  static FT_Error\n  FT_GetFileRef_From_Mac_ATS_Name( const char*  fontName,\n                                   FSRef*       ats_font_ref,\n                                   FT_Long*     face_index )\n  {\n    CFStringRef  cf_fontName;\n    ATSFontRef   ats_font_id;\n\n\n    *face_index = 0;\n\n    cf_fontName = CFStringCreateWithCString( NULL, fontName,\n                                             kCFStringEncodingMacRoman );\n    ats_font_id = ATSFontFindFromName( cf_fontName,\n                                       kATSOptionFlagsUnRestrictedScope );\n    CFRelease( cf_fontName );\n\n    if ( ats_font_id == 0 || ats_font_id == 0xFFFFFFFFUL )\n      return FT_THROW( Unknown_File_Format );\n\n    if ( noErr != FT_ATSFontGetFileReference( ats_font_id, ats_font_ref ) )\n      return FT_THROW( Unknown_File_Format );\n\n    /* face_index calculation by searching preceding fontIDs */\n    /* with same FSRef                                       */\n    {\n      ATSFontRef  id2 = ats_font_id - 1;\n      FSRef       ref2;\n\n\n      while ( id2 > 0 )\n      {\n        if ( noErr != FT_ATSFontGetFileReference( id2, &ref2 ) )\n          break;\n        if ( noErr != FSCompareFSRefs( ats_font_ref, &ref2 ) )\n          break;\n\n        id2 --;\n      }\n      *face_index = ats_font_id - ( id2 + 1 );\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_GetFilePath_From_Mac_ATS_Name( const char*  fontName,\n                                    UInt8*       path,\n                                    UInt32       maxPathSize,\n                                    FT_Long*     face_index )\n  {\n    FSRef     ref;\n    FT_Error  err;\n\n\n    err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index );\n    if ( err )\n      return err;\n\n    if ( noErr != FSRefMakePath( &ref, path, maxPathSize ) )\n      return FT_THROW( Unknown_File_Format );\n\n    return FT_Err_Ok;\n  }\n\n\n  /* This function is deprecated because FSSpec is deprecated in Mac OS X  */\n  FT_EXPORT_DEF( FT_Error )\n  FT_GetFile_From_Mac_ATS_Name( const char*  fontName,\n                                FSSpec*      pathSpec,\n                                FT_Long*     face_index )\n  {\n#if ( __LP64__ ) || ( defined( MAC_OS_X_VERSION_10_5 ) && \\\n      ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) )\n    FT_UNUSED( fontName );\n    FT_UNUSED( pathSpec );\n    FT_UNUSED( face_index );\n\n    return FT_THROW( Unimplemented_Feature );\n#else\n    FSRef     ref;\n    FT_Error  err;\n\n\n    err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index );\n    if ( err )\n      return err;\n\n    if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, NULL, NULL,\n                                    pathSpec, NULL ) )\n      return FT_THROW( Unknown_File_Format );\n\n    return FT_Err_Ok;\n#endif\n  }\n\n\n  static OSErr\n  FT_FSPathMakeRes( const UInt8*    pathname,\n                    ResFileRefNum*  res )\n  {\n    OSErr  err;\n    FSRef  ref;\n\n\n    if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) )\n      return FT_THROW( Cannot_Open_Resource );\n\n    /* at present, no support for dfont format */\n    err = FSOpenResourceFile( &ref, 0, NULL, fsRdPerm, res );\n    if ( noErr == err )\n      return err;\n\n    /* fallback to original resource-fork font */\n    *res = FSOpenResFile( &ref, fsRdPerm );\n    err  = ResError();\n\n    return err;\n  }\n\n\n  /* Return the file type for given pathname */\n  static OSType\n  get_file_type_from_path( const UInt8*  pathname )\n  {\n    FSRef          ref;\n    FSCatalogInfo  info;\n\n\n    if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) )\n      return ( OSType ) 0;\n\n    if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoFinderInfo, &info,\n                                    NULL, NULL, NULL ) )\n      return ( OSType ) 0;\n\n    return ((FInfo *)(info.finderInfo))->fdType;\n  }\n\n\n  /* Given a PostScript font name, create the Macintosh LWFN file name. */\n  static void\n  create_lwfn_name( char*   ps_name,\n                    Str255  lwfn_file_name )\n  {\n    int       max = 5, count = 0;\n    FT_Byte*  p = lwfn_file_name;\n    FT_Byte*  q = (FT_Byte*)ps_name;\n\n\n    lwfn_file_name[0] = 0;\n\n    while ( *q )\n    {\n      if ( ft_isupper( *q ) )\n      {\n        if ( count )\n          max = 3;\n        count = 0;\n      }\n      if ( count < max && ( ft_isalnum( *q ) || *q == '_' ) )\n      {\n        *++p = *q;\n        lwfn_file_name[0]++;\n        count++;\n      }\n      q++;\n    }\n  }\n\n\n  static short\n  count_faces_sfnt( char*  fond_data )\n  {\n    /* The count is 1 greater than the value in the FOND.  */\n    /* Isn't that cute? :-)                                */\n\n    return EndianS16_BtoN( *( (short*)( fond_data +\n                                        sizeof ( FamRec ) ) ) ) + 1;\n  }\n\n\n  static short\n  count_faces_scalable( char*  fond_data )\n  {\n    AsscEntry*  assoc;\n    short       i, face, face_all;\n\n\n    face_all = EndianS16_BtoN( *( (short *)( fond_data +\n                                             sizeof ( FamRec ) ) ) ) + 1;\n    assoc    = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 );\n    face     = 0;\n\n    for ( i = 0; i < face_all; i++ )\n    {\n      if ( 0 == EndianS16_BtoN( assoc[i].fontSize ) )\n        face++;\n    }\n    return face;\n  }\n\n\n  /* Look inside the FOND data, answer whether there should be an SFNT\n     resource, and answer the name of a possible LWFN Type 1 file.\n\n     Thanks to Paul Miller (paulm@profoundeffects.com) for the fix\n     to load a face OTHER than the first one in the FOND!\n  */\n\n\n  static void\n  parse_fond( char*   fond_data,\n              short*  have_sfnt,\n              ResID*  sfnt_id,\n              Str255  lwfn_file_name,\n              short   face_index )\n  {\n    AsscEntry*  assoc;\n    AsscEntry*  base_assoc;\n    FamRec*     fond;\n\n\n    *sfnt_id          = 0;\n    *have_sfnt        = 0;\n    lwfn_file_name[0] = 0;\n\n    fond       = (FamRec*)fond_data;\n    assoc      = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 );\n    base_assoc = assoc;\n\n    /* the maximum faces in a FOND is 48, size of StyleTable.indexes[] */\n    if ( 47 < face_index )\n      return;\n\n    /* Let's do a little range checking before we get too excited here */\n    if ( face_index < count_faces_sfnt( fond_data ) )\n    {\n      assoc += face_index;        /* add on the face_index! */\n\n      /* if the face at this index is not scalable,\n         fall back to the first one (old behavior) */\n      if ( EndianS16_BtoN( assoc->fontSize ) == 0 )\n      {\n        *have_sfnt = 1;\n        *sfnt_id   = EndianS16_BtoN( assoc->fontID );\n      }\n      else if ( base_assoc->fontSize == 0 )\n      {\n        *have_sfnt = 1;\n        *sfnt_id   = EndianS16_BtoN( base_assoc->fontID );\n      }\n    }\n\n    if ( EndianS32_BtoN( fond->ffStylOff ) )\n    {\n      unsigned char*  p = (unsigned char*)fond_data;\n      StyleTable*     style;\n      unsigned short  string_count;\n      char            ps_name[256];\n      unsigned char*  names[64];\n      int             i;\n\n\n      p += EndianS32_BtoN( fond->ffStylOff );\n      style = (StyleTable*)p;\n      p += sizeof ( StyleTable );\n      string_count = EndianS16_BtoN( *(short*)(p) );\n      p += sizeof ( short );\n\n      for ( i = 0; i < string_count && i < 64; i++ )\n      {\n        names[i] = p;\n        p       += names[i][0];\n        p++;\n      }\n\n      {\n        size_t  ps_name_len = (size_t)names[0][0];\n\n\n        if ( ps_name_len != 0 )\n        {\n          ft_memcpy(ps_name, names[0] + 1, ps_name_len);\n          ps_name[ps_name_len] = 0;\n        }\n        if ( style->indexes[face_index] > 1 &&\n             style->indexes[face_index] <= FT_MIN( string_count, 64 ) )\n        {\n          unsigned char*  suffixes = names[style->indexes[face_index] - 1];\n\n\n          for ( i = 1; i <= suffixes[0]; i++ )\n          {\n            unsigned char*  s;\n            size_t          j = suffixes[i] - 1;\n\n\n            if ( j < string_count && ( s = names[j] ) != NULL )\n            {\n              size_t  s_len = (size_t)s[0];\n\n\n              if ( s_len != 0 && ps_name_len + s_len < sizeof ( ps_name ) )\n              {\n                ft_memcpy( ps_name + ps_name_len, s + 1, s_len );\n                ps_name_len += s_len;\n                ps_name[ps_name_len] = 0;\n              }\n            }\n          }\n        }\n      }\n\n      create_lwfn_name( ps_name, lwfn_file_name );\n    }\n  }\n\n\n  static  FT_Error\n  lookup_lwfn_by_fond( const UInt8*      path_fond,\n                       ConstStr255Param  base_lwfn,\n                       UInt8*            path_lwfn,\n                       size_t            path_size )\n  {\n    FSRef   ref, par_ref;\n    size_t  dirname_len;\n\n\n    /* Pathname for FSRef can be in various formats: HFS, HFS+, and POSIX. */\n    /* We should not extract parent directory by string manipulation.      */\n\n    if ( noErr != FSPathMakeRef( path_fond, &ref, FALSE ) )\n      return FT_THROW( Invalid_Argument );\n\n    if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone,\n                                    NULL, NULL, NULL, &par_ref ) )\n      return FT_THROW( Invalid_Argument );\n\n    if ( noErr != FSRefMakePath( &par_ref, path_lwfn, path_size ) )\n      return FT_THROW( Invalid_Argument );\n\n    if ( ft_strlen( (char *)path_lwfn ) + 1 + base_lwfn[0] > path_size )\n      return FT_THROW( Invalid_Argument );\n\n    /* now we have absolute dirname in path_lwfn */\n    ft_strcat( (char *)path_lwfn, \"/\" );\n    dirname_len = ft_strlen( (char *)path_lwfn );\n    ft_strcat( (char *)path_lwfn, (char *)base_lwfn + 1 );\n    path_lwfn[dirname_len + base_lwfn[0]] = '\\0';\n\n    if ( noErr != FSPathMakeRef( path_lwfn, &ref, FALSE ) )\n      return FT_THROW( Cannot_Open_Resource );\n\n    if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone,\n                                    NULL, NULL, NULL, NULL ) )\n      return FT_THROW( Cannot_Open_Resource );\n\n    return FT_Err_Ok;\n  }\n\n\n  static short\n  count_faces( Handle        fond,\n               const UInt8*  pathname )\n  {\n    ResID     sfnt_id;\n    short     have_sfnt, have_lwfn;\n    Str255    lwfn_file_name;\n    UInt8     buff[PATH_MAX];\n    FT_Error  err;\n    short     num_faces;\n\n\n    have_sfnt = have_lwfn = 0;\n\n    parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, 0 );\n\n    if ( lwfn_file_name[0] )\n    {\n      err = lookup_lwfn_by_fond( pathname, lwfn_file_name,\n                                 buff, sizeof ( buff )  );\n      if ( !err )\n        have_lwfn = 1;\n    }\n\n    if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) )\n      num_faces = 1;\n    else\n      num_faces = count_faces_scalable( *fond );\n\n    return num_faces;\n  }\n\n\n  /* Read Type 1 data from the POST resources inside the LWFN file,\n     return a PFB buffer.  This is somewhat convoluted because the FT2\n     PFB parser wants the ASCII header as one chunk, and the LWFN\n     chunks are often not organized that way, so we glue chunks\n     of the same type together. */\n  static FT_Error\n  read_lwfn( FT_Memory      memory,\n             ResFileRefNum  res,\n             FT_Byte**      pfb_data,\n             FT_ULong*      size )\n  {\n    FT_Error       error = FT_Err_Ok;\n    ResID          res_id;\n    unsigned char  *buffer, *p, *size_p = NULL;\n    FT_ULong       total_size = 0;\n    FT_ULong       old_total_size = 0;\n    FT_ULong       post_size, pfb_chunk_size;\n    Handle         post_data;\n    char           code, last_code;\n\n\n    UseResFile( res );\n\n    /* First pass: load all POST resources, and determine the size of */\n    /* the output buffer.                                             */\n    res_id    = 501;\n    last_code = -1;\n\n    for (;;)\n    {\n      post_data = Get1Resource( TTAG_POST, res_id++ );\n      if ( post_data == NULL )\n        break;  /* we are done */\n\n      code = (*post_data)[0];\n\n      if ( code != last_code )\n      {\n        if ( code == 5 )\n          total_size += 2; /* just the end code */\n        else\n          total_size += 6; /* code + 4 bytes chunk length */\n      }\n\n      total_size += GetHandleSize( post_data ) - 2;\n      last_code = code;\n\n      /* detect integer overflows */\n      if ( total_size < old_total_size )\n      {\n        error = FT_THROW( Array_Too_Large );\n        goto Error;\n      }\n\n      old_total_size = total_size;\n    }\n\n    if ( FT_ALLOC( buffer, (FT_Long)total_size ) )\n      goto Error;\n\n    /* Second pass: append all POST data to the buffer, add PFB fields. */\n    /* Glue all consecutive chunks of the same type together.           */\n    p              = buffer;\n    res_id         = 501;\n    last_code      = -1;\n    pfb_chunk_size = 0;\n\n    for (;;)\n    {\n      post_data = Get1Resource( TTAG_POST, res_id++ );\n      if ( post_data == NULL )\n        break;  /* we are done */\n\n      post_size = (FT_ULong)GetHandleSize( post_data ) - 2;\n      code = (*post_data)[0];\n\n      if ( code != last_code )\n      {\n        if ( last_code != -1 )\n        {\n          /* we are done adding a chunk, fill in the size field */\n          if ( size_p != NULL )\n          {\n            *size_p++ = (FT_Byte)(   pfb_chunk_size         & 0xFF );\n            *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 8  ) & 0xFF );\n            *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 16 ) & 0xFF );\n            *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 24 ) & 0xFF );\n          }\n          pfb_chunk_size = 0;\n        }\n\n        *p++ = 0x80;\n        if ( code == 5 )\n          *p++ = 0x03;  /* the end */\n        else if ( code == 2 )\n          *p++ = 0x02;  /* binary segment */\n        else\n          *p++ = 0x01;  /* ASCII segment */\n\n        if ( code != 5 )\n        {\n          size_p = p;   /* save for later */\n          p += 4;       /* make space for size field */\n        }\n      }\n\n      ft_memcpy( p, *post_data + 2, post_size );\n      pfb_chunk_size += post_size;\n      p += post_size;\n      last_code = code;\n    }\n\n    *pfb_data = buffer;\n    *size = total_size;\n\n  Error:\n    CloseResFile( res );\n    return error;\n  }\n\n\n  /* Create a new FT_Face from a file path to an LWFN file. */\n  static FT_Error\n  FT_New_Face_From_LWFN( FT_Library    library,\n                         const UInt8*  pathname,\n                         FT_Long       face_index,\n                         FT_Face*      aface )\n  {\n    FT_Byte*       pfb_data;\n    FT_ULong       pfb_size;\n    FT_Error       error;\n    ResFileRefNum  res;\n\n\n    if ( noErr != FT_FSPathMakeRes( pathname, &res ) )\n      return FT_THROW( Cannot_Open_Resource );\n\n    pfb_data = NULL;\n    pfb_size = 0;\n    error = read_lwfn( library->memory, res, &pfb_data, &pfb_size );\n    CloseResFile( res ); /* PFB is already loaded, useless anymore */\n    if ( error )\n      return error;\n\n    return open_face_from_buffer( library,\n                                  pfb_data,\n                                  pfb_size,\n                                  face_index,\n                                  \"type1\",\n                                  aface );\n  }\n\n\n  /* Create a new FT_Face from an SFNT resource, specified by res ID. */\n  static FT_Error\n  FT_New_Face_From_SFNT( FT_Library  library,\n                         ResID       sfnt_id,\n                         FT_Long     face_index,\n                         FT_Face*    aface )\n  {\n    Handle     sfnt = NULL;\n    FT_Byte*   sfnt_data;\n    size_t     sfnt_size;\n    FT_Error   error  = FT_Err_Ok;\n    FT_Memory  memory = library->memory;\n    int        is_cff, is_sfnt_ps;\n\n\n    sfnt = GetResource( TTAG_sfnt, sfnt_id );\n    if ( sfnt == NULL )\n      return FT_THROW( Invalid_Handle );\n\n    sfnt_size = (FT_ULong)GetHandleSize( sfnt );\n    if ( FT_ALLOC( sfnt_data, (FT_Long)sfnt_size ) )\n    {\n      ReleaseResource( sfnt );\n      return error;\n    }\n\n    ft_memcpy( sfnt_data, *sfnt, sfnt_size );\n    ReleaseResource( sfnt );\n\n    is_cff     = sfnt_size > 4 && !ft_memcmp( sfnt_data, \"OTTO\", 4 );\n    is_sfnt_ps = sfnt_size > 4 && !ft_memcmp( sfnt_data, \"typ1\", 4 );\n\n    if ( is_sfnt_ps )\n    {\n      FT_Stream  stream;\n\n\n      if ( FT_NEW( stream ) )\n        goto Try_OpenType;\n\n      FT_Stream_OpenMemory( stream, sfnt_data, sfnt_size );\n      if ( !open_face_PS_from_sfnt_stream( library,\n                                           stream,\n                                           face_index,\n                                           0, NULL,\n                                           aface ) )\n      {\n        FT_Stream_Close( stream );\n        FT_FREE( stream );\n        FT_FREE( sfnt_data );\n        goto Exit;\n      }\n\n      FT_FREE( stream );\n    }\n  Try_OpenType:\n    error = open_face_from_buffer( library,\n                                   sfnt_data,\n                                   sfnt_size,\n                                   face_index,\n                                   is_cff ? \"cff\" : \"truetype\",\n                                   aface );\n  Exit:\n    return error;\n  }\n\n\n  /* Create a new FT_Face from a file path to a suitcase file. */\n  static FT_Error\n  FT_New_Face_From_Suitcase( FT_Library    library,\n                             const UInt8*  pathname,\n                             FT_Long       face_index,\n                             FT_Face*      aface )\n  {\n    FT_Error       error = FT_ERR( Cannot_Open_Resource );\n    ResFileRefNum  res_ref;\n    ResourceIndex  res_index;\n    Handle         fond;\n    short          num_faces_in_res;\n\n\n    if ( noErr != FT_FSPathMakeRes( pathname, &res_ref ) )\n      return FT_THROW( Cannot_Open_Resource );\n\n    UseResFile( res_ref );\n    if ( ResError() )\n      return FT_THROW( Cannot_Open_Resource );\n\n    num_faces_in_res = 0;\n    for ( res_index = 1; ; ++res_index )\n    {\n      short  num_faces_in_fond;\n\n\n      fond = Get1IndResource( TTAG_FOND, res_index );\n      if ( ResError() )\n        break;\n\n      num_faces_in_fond  = count_faces( fond, pathname );\n      num_faces_in_res  += num_faces_in_fond;\n\n      if ( 0 <= face_index && face_index < num_faces_in_fond && error )\n        error = FT_New_Face_From_FOND( library, fond, face_index, aface );\n\n      face_index -= num_faces_in_fond;\n    }\n\n    CloseResFile( res_ref );\n    if ( !error && aface && *aface )\n      (*aface)->num_faces = num_faces_in_res;\n    return error;\n  }\n\n\n  /* documentation is in ftmac.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_New_Face_From_FOND( FT_Library  library,\n                         Handle      fond,\n                         FT_Long     face_index,\n                         FT_Face*    aface )\n  {\n    short     have_sfnt, have_lwfn = 0;\n    ResID     sfnt_id, fond_id;\n    OSType    fond_type;\n    Str255    fond_name;\n    Str255    lwfn_file_name;\n    UInt8     path_lwfn[PATH_MAX];\n    OSErr     err;\n    FT_Error  error = FT_Err_Ok;\n\n\n    GetResInfo( fond, &fond_id, &fond_type, fond_name );\n    if ( ResError() != noErr || fond_type != TTAG_FOND )\n      return FT_THROW( Invalid_File_Format );\n\n    parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, face_index );\n\n    if ( lwfn_file_name[0] )\n    {\n      ResFileRefNum  res;\n\n\n      res = HomeResFile( fond );\n      if ( noErr != ResError() )\n        goto found_no_lwfn_file;\n\n      {\n        UInt8  path_fond[PATH_MAX];\n        FSRef  ref;\n\n\n        err = FSGetForkCBInfo( res, kFSInvalidVolumeRefNum,\n                               NULL, NULL, NULL, &ref, NULL );\n        if ( noErr != err )\n          goto found_no_lwfn_file;\n\n        err = FSRefMakePath( &ref, path_fond, sizeof ( path_fond ) );\n        if ( noErr != err )\n          goto found_no_lwfn_file;\n\n        error = lookup_lwfn_by_fond( path_fond, lwfn_file_name,\n                                     path_lwfn, sizeof ( path_lwfn ) );\n        if ( !error )\n          have_lwfn = 1;\n      }\n    }\n\n    if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) )\n      error = FT_New_Face_From_LWFN( library,\n                                     path_lwfn,\n                                     face_index,\n                                     aface );\n    else\n      error = FT_THROW( Unknown_File_Format );\n\n  found_no_lwfn_file:\n    if ( have_sfnt && error )\n      error = FT_New_Face_From_SFNT( library,\n                                     sfnt_id,\n                                     face_index,\n                                     aface );\n\n    return error;\n  }\n\n\n  /* Common function to load a new FT_Face from a resource file. */\n  static FT_Error\n  FT_New_Face_From_Resource( FT_Library    library,\n                             const UInt8*  pathname,\n                             FT_Long       face_index,\n                             FT_Face*      aface )\n  {\n    OSType    file_type;\n    FT_Error  error;\n\n\n    /* LWFN is a (very) specific file format, check for it explicitly */\n    file_type = get_file_type_from_path( pathname );\n    if ( file_type == TTAG_LWFN )\n      return FT_New_Face_From_LWFN( library, pathname, face_index, aface );\n\n    /* Otherwise the file type doesn't matter (there are more than  */\n    /* `FFIL' and `tfil').  Just try opening it as a font suitcase; */\n    /* if it works, fine.                                           */\n\n    error = FT_New_Face_From_Suitcase( library, pathname, face_index, aface );\n    if ( error == 0 )\n      return error;\n\n    /* let it fall through to normal loader (.ttf, .otf, etc.); */\n    /* we signal this by returning no error and no FT_Face      */\n    *aface = NULL;\n    return 0;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Face                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This is the Mac-specific implementation of FT_New_Face.  In        */\n  /*    addition to the standard FT_New_Face() functionality, it also      */\n  /*    accepts pathnames to Mac suitcase files.  For further              */\n  /*    documentation see the original FT_New_Face() in freetype.h.        */\n  /*                                                                       */\n  FT_EXPORT_DEF( FT_Error )\n  FT_New_Face( FT_Library   library,\n               const char*  pathname,\n               FT_Long      face_index,\n               FT_Face*     aface )\n  {\n    FT_Open_Args  args;\n    FT_Error      error;\n\n\n    /* test for valid `library' and `aface' delayed to FT_Open_Face() */\n    if ( !pathname )\n      return FT_THROW( Invalid_Argument );\n\n    error  = FT_Err_Ok;\n    *aface = NULL;\n\n    /* try resourcefork based font: LWFN, FFIL */\n    error = FT_New_Face_From_Resource( library, (UInt8 *)pathname,\n                                       face_index, aface );\n    if ( error != 0 || *aface != NULL )\n      return error;\n\n    /* let it fall through to normal loader (.ttf, .otf, etc.) */\n    args.flags    = FT_OPEN_PATHNAME;\n    args.pathname = (char*)pathname;\n    return FT_Open_Face( library, &args, face_index, aface );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Face_From_FSRef                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    FT_New_Face_From_FSRef is identical to FT_New_Face except it       */\n  /*    accepts an FSRef instead of a path.                                */\n  /*                                                                       */\n  /* This function is deprecated because Carbon data types (FSRef)         */\n  /* are not cross-platform, and thus not suitable for the freetype API.   */\n  FT_EXPORT_DEF( FT_Error )\n  FT_New_Face_From_FSRef( FT_Library    library,\n                          const FSRef*  ref,\n                          FT_Long       face_index,\n                          FT_Face*      aface )\n  {\n    FT_Error      error;\n    FT_Open_Args  args;\n    OSErr   err;\n    UInt8   pathname[PATH_MAX];\n\n\n    if ( !ref )\n      return FT_THROW( Invalid_Argument );\n\n    err = FSRefMakePath( ref, pathname, sizeof ( pathname ) );\n    if ( err )\n      error = FT_THROW( Cannot_Open_Resource );\n\n    error = FT_New_Face_From_Resource( library, pathname, face_index, aface );\n    if ( error != 0 || *aface != NULL )\n      return error;\n\n    /* fallback to datafork font */\n    args.flags    = FT_OPEN_PATHNAME;\n    args.pathname = (char*)pathname;\n    return FT_Open_Face( library, &args, face_index, aface );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Face_From_FSSpec                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    FT_New_Face_From_FSSpec is identical to FT_New_Face except it      */\n  /*    accepts an FSSpec instead of a path.                               */\n  /*                                                                       */\n  /* This function is deprecated because FSSpec is deprecated in Mac OS X  */\n  FT_EXPORT_DEF( FT_Error )\n  FT_New_Face_From_FSSpec( FT_Library     library,\n                           const FSSpec*  spec,\n                           FT_Long        face_index,\n                           FT_Face*       aface )\n  {\n#if ( __LP64__ ) || ( defined( MAC_OS_X_VERSION_10_5 ) && \\\n      ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) )\n    FT_UNUSED( library );\n    FT_UNUSED( spec );\n    FT_UNUSED( face_index );\n    FT_UNUSED( aface );\n\n    return FT_THROW( Unimplemented_Feature );\n#else\n    FSRef  ref;\n\n\n    if ( !spec || FSpMakeFSRef( spec, &ref ) != noErr )\n      return FT_THROW( Invalid_Argument );\n    else\n      return FT_New_Face_From_FSRef( library, &ref, face_index, aface );\n#endif\n  }\n\n#endif /* FT_MACINTOSH */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftobjs.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftobjs.c                                                               */\n/*                                                                         */\n/*    The FreeType private base classes (body).                            */\n/*                                                                         */\n/*  Copyright 1996-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/ftlist.h\"\n#include \"../../include/freetype/ftoutln.h\"\n#include \"../../include/freetype/internal/ftvalid.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftrfork.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/internal/sfnt.h\"    /* for SFNT_Load_Table_Func */\n#include \"../../include/freetype/tttables.h\"\n#include \"../../include/freetype/tttags.h\"\n#include \"../../include/freetype/ttnameid.h\"\n\n#include \"../../include/freetype/internal/services/svprop.h\"\n#include \"../../include/freetype/internal/services/svsfnt.h\"\n#include \"../../include/freetype/internal/services/svpostnm.h\"\n#include \"../../include/freetype/internal/services/svgldict.h\"\n#include \"../../include/freetype/internal/services/svttcmap.h\"\n#include \"../../include/freetype/internal/services/svkern.h\"\n#include \"../../include/freetype/internal/services/svtteng.h\"\n\n#ifdef FT_CONFIG_OPTION_MAC_FONTS\n#include \"ftbase.h\"\n#endif\n\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n#include \"../../include/freetype/ftbitmap.h\"\n\n#if defined( _MSC_VER )      /* Visual C++ (and Intel C++)   */\n  /* We disable the warning `conversion from XXX to YYY,     */\n  /* possible loss of data' in order to compile cleanly with */\n  /* the maximum level of warnings: `md5.c' is non-FreeType  */\n  /* code, and it gets used during development builds only.  */\n#pragma warning( push )\n#pragma warning( disable : 4244 )\n#endif /* _MSC_VER */\n\n  /* it's easiest to include `md5.c' directly */\n#define free  md5_free /* suppress a shadow warning */\n#include \"md5.c\"\n#undef free\n\n#if defined( _MSC_VER )\n#pragma warning( pop )\n#endif\n\n#endif /* FT_DEBUG_LEVEL_TRACE */\n\n\n#define GRID_FIT_METRICS\n\n\n  FT_BASE_DEF( FT_Pointer )\n  ft_service_list_lookup( FT_ServiceDesc  service_descriptors,\n                          const char*     service_id )\n  {\n    FT_Pointer      result = NULL;\n    FT_ServiceDesc  desc   = service_descriptors;\n\n\n    if ( desc && service_id )\n    {\n      for ( ; desc->serv_id != NULL; desc++ )\n      {\n        if ( ft_strcmp( desc->serv_id, service_id ) == 0 )\n        {\n          result = (FT_Pointer)desc->serv_data;\n          break;\n        }\n      }\n    }\n\n    return result;\n  }\n\n\n  FT_BASE_DEF( void )\n  ft_validator_init( FT_Validator        valid,\n                     const FT_Byte*      base,\n                     const FT_Byte*      limit,\n                     FT_ValidationLevel  level )\n  {\n    valid->base  = base;\n    valid->limit = limit;\n    valid->level = level;\n    valid->error = FT_Err_Ok;\n  }\n\n\n  FT_BASE_DEF( FT_Int )\n  ft_validator_run( FT_Validator  valid )\n  {\n    /* This function doesn't work!  None should call it. */\n    FT_UNUSED( valid );\n\n    return -1;\n  }\n\n\n  FT_BASE_DEF( void )\n  ft_validator_error( FT_Validator  valid,\n                      FT_Error      error )\n  {\n    /* since the cast below also disables the compiler's */\n    /* type check, we introduce a dummy variable, which  */\n    /* will be optimized away                            */\n    volatile ft_jmp_buf* jump_buffer = &valid->jump_buffer;\n\n\n    valid->error = error;\n\n    /* throw away volatileness; use `jump_buffer' or the  */\n    /* compiler may warn about an unused local variable   */\n    ft_longjmp( *(ft_jmp_buf*) jump_buffer, 1 );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                           S T R E A M                           ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* create a new input stream from an FT_Open_Args structure */\n  /*                                                          */\n  FT_BASE_DEF( FT_Error )\n  FT_Stream_New( FT_Library           library,\n                 const FT_Open_Args*  args,\n                 FT_Stream           *astream )\n  {\n    FT_Error   error;\n    FT_Memory  memory;\n    FT_Stream  stream = NULL;\n\n\n    *astream = 0;\n\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    if ( !args )\n      return FT_THROW( Invalid_Argument );\n\n    memory = library->memory;\n\n    if ( FT_NEW( stream ) )\n      goto Exit;\n\n    stream->memory = memory;\n\n    if ( args->flags & FT_OPEN_MEMORY )\n    {\n      /* create a memory-based stream */\n      FT_Stream_OpenMemory( stream,\n                            (const FT_Byte*)args->memory_base,\n                            args->memory_size );\n    }\n\n#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT\n\n    else if ( args->flags & FT_OPEN_PATHNAME )\n    {\n      /* create a normal system stream */\n      error = FT_Stream_Open( stream, args->pathname );\n      stream->pathname.pointer = args->pathname;\n    }\n    else if ( ( args->flags & FT_OPEN_STREAM ) && args->stream )\n    {\n      /* use an existing, user-provided stream */\n\n      /* in this case, we do not need to allocate a new stream object */\n      /* since the caller is responsible for closing it himself       */\n      FT_FREE( stream );\n      stream = args->stream;\n    }\n\n#endif\n\n    else\n      error = FT_THROW( Invalid_Argument );\n\n    if ( error )\n      FT_FREE( stream );\n    else\n      stream->memory = memory;  /* just to be certain */\n\n    *astream = stream;\n\n  Exit:\n    return error;\n  }\n\n\n  FT_BASE_DEF( void )\n  FT_Stream_Free( FT_Stream  stream,\n                  FT_Int     external )\n  {\n    if ( stream )\n    {\n      FT_Memory  memory = stream->memory;\n\n\n      FT_Stream_Close( stream );\n\n      if ( !external )\n        FT_FREE( stream );\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_objs\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****               FACE, SIZE & GLYPH SLOT OBJECTS                   ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  static FT_Error\n  ft_glyphslot_init( FT_GlyphSlot  slot )\n  {\n    FT_Driver         driver   = slot->face->driver;\n    FT_Driver_Class   clazz    = driver->clazz;\n    FT_Memory         memory   = driver->root.memory;\n    FT_Error          error    = FT_Err_Ok;\n    FT_Slot_Internal  internal = NULL;\n\n\n    slot->library = driver->root.library;\n\n    if ( FT_NEW( internal ) )\n      goto Exit;\n\n    slot->internal = internal;\n\n    if ( FT_DRIVER_USES_OUTLINES( driver ) )\n      error = FT_GlyphLoader_New( memory, &internal->loader );\n\n    if ( !error && clazz->init_slot )\n      error = clazz->init_slot( slot );\n\n  Exit:\n    return error;\n  }\n\n\n  FT_BASE_DEF( void )\n  ft_glyphslot_free_bitmap( FT_GlyphSlot  slot )\n  {\n    if ( slot->internal && ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) )\n    {\n      FT_Memory  memory = FT_FACE_MEMORY( slot->face );\n\n\n      FT_FREE( slot->bitmap.buffer );\n      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;\n    }\n    else\n    {\n      /* assume that the bitmap buffer was stolen or not */\n      /* allocated from the heap                         */\n      slot->bitmap.buffer = NULL;\n    }\n  }\n\n\n  FT_BASE_DEF( void )\n  ft_glyphslot_set_bitmap( FT_GlyphSlot  slot,\n                           FT_Byte*      buffer )\n  {\n    ft_glyphslot_free_bitmap( slot );\n\n    slot->bitmap.buffer = buffer;\n\n    FT_ASSERT( (slot->internal->flags & FT_GLYPH_OWN_BITMAP) == 0 );\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  ft_glyphslot_alloc_bitmap( FT_GlyphSlot  slot,\n                             FT_ULong      size )\n  {\n    FT_Memory  memory = FT_FACE_MEMORY( slot->face );\n    FT_Error   error;\n\n\n    if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )\n      FT_FREE( slot->bitmap.buffer );\n    else\n      slot->internal->flags |= FT_GLYPH_OWN_BITMAP;\n\n    (void)FT_ALLOC( slot->bitmap.buffer, size );\n    return error;\n  }\n\n\n  static void\n  ft_glyphslot_clear( FT_GlyphSlot  slot )\n  {\n    /* free bitmap if needed */\n    ft_glyphslot_free_bitmap( slot );\n\n    /* clear all public fields in the glyph slot */\n    FT_ZERO( &slot->metrics );\n    FT_ZERO( &slot->outline );\n\n    slot->bitmap.width      = 0;\n    slot->bitmap.rows       = 0;\n    slot->bitmap.pitch      = 0;\n    slot->bitmap.pixel_mode = 0;\n    /* `slot->bitmap.buffer' has been handled by ft_glyphslot_free_bitmap */\n\n    slot->bitmap_left   = 0;\n    slot->bitmap_top    = 0;\n    slot->num_subglyphs = 0;\n    slot->subglyphs     = 0;\n    slot->control_data  = 0;\n    slot->control_len   = 0;\n    slot->other         = 0;\n    slot->format        = FT_GLYPH_FORMAT_NONE;\n\n    slot->linearHoriAdvance = 0;\n    slot->linearVertAdvance = 0;\n    slot->lsb_delta         = 0;\n    slot->rsb_delta         = 0;\n  }\n\n\n  static void\n  ft_glyphslot_done( FT_GlyphSlot  slot )\n  {\n    FT_Driver        driver = slot->face->driver;\n    FT_Driver_Class  clazz  = driver->clazz;\n    FT_Memory        memory = driver->root.memory;\n\n\n    if ( clazz->done_slot )\n      clazz->done_slot( slot );\n\n    /* free bitmap buffer if needed */\n    ft_glyphslot_free_bitmap( slot );\n\n    /* slot->internal might be NULL in out-of-memory situations */\n    if ( slot->internal )\n    {\n      /* free glyph loader */\n      if ( FT_DRIVER_USES_OUTLINES( driver ) )\n      {\n        FT_GlyphLoader_Done( slot->internal->loader );\n        slot->internal->loader = 0;\n      }\n\n      FT_FREE( slot->internal );\n    }\n  }\n\n\n  /* documentation is in ftobjs.h */\n\n  FT_BASE_DEF( FT_Error )\n  FT_New_GlyphSlot( FT_Face        face,\n                    FT_GlyphSlot  *aslot )\n  {\n    FT_Error         error;\n    FT_Driver        driver;\n    FT_Driver_Class  clazz;\n    FT_Memory        memory;\n    FT_GlyphSlot     slot = NULL;\n\n\n    if ( !face || !face->driver )\n      return FT_THROW( Invalid_Argument );\n\n    driver = face->driver;\n    clazz  = driver->clazz;\n    memory = driver->root.memory;\n\n    FT_TRACE4(( \"FT_New_GlyphSlot: Creating new slot object\\n\" ));\n    if ( !FT_ALLOC( slot, clazz->slot_object_size ) )\n    {\n      slot->face = face;\n\n      error = ft_glyphslot_init( slot );\n      if ( error )\n      {\n        ft_glyphslot_done( slot );\n        FT_FREE( slot );\n        goto Exit;\n      }\n\n      slot->next  = face->glyph;\n      face->glyph = slot;\n\n      if ( aslot )\n        *aslot = slot;\n    }\n    else if ( aslot )\n      *aslot = 0;\n\n\n  Exit:\n    FT_TRACE4(( \"FT_New_GlyphSlot: Return %d\\n\", error ));\n    return error;\n  }\n\n\n  /* documentation is in ftobjs.h */\n\n  FT_BASE_DEF( void )\n  FT_Done_GlyphSlot( FT_GlyphSlot  slot )\n  {\n    if ( slot )\n    {\n      FT_Driver     driver = slot->face->driver;\n      FT_Memory     memory = driver->root.memory;\n      FT_GlyphSlot  prev;\n      FT_GlyphSlot  cur;\n\n\n      /* Remove slot from its parent face's list */\n      prev = NULL;\n      cur  = slot->face->glyph;\n\n      while ( cur )\n      {\n        if ( cur == slot )\n        {\n          if ( !prev )\n            slot->face->glyph = cur->next;\n          else\n            prev->next = cur->next;\n\n          /* finalize client-specific data */\n          if ( slot->generic.finalizer )\n            slot->generic.finalizer( slot );\n\n          ft_glyphslot_done( slot );\n          FT_FREE( slot );\n          break;\n        }\n        prev = cur;\n        cur  = cur->next;\n      }\n    }\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Set_Transform( FT_Face     face,\n                    FT_Matrix*  matrix,\n                    FT_Vector*  delta )\n  {\n    FT_Face_Internal  internal;\n\n\n    if ( !face )\n      return;\n\n    internal = face->internal;\n\n    internal->transform_flags = 0;\n\n    if ( !matrix )\n    {\n      internal->transform_matrix.xx = 0x10000L;\n      internal->transform_matrix.xy = 0;\n      internal->transform_matrix.yx = 0;\n      internal->transform_matrix.yy = 0x10000L;\n      matrix = &internal->transform_matrix;\n    }\n    else\n      internal->transform_matrix = *matrix;\n\n    /* set transform_flags bit flag 0 if `matrix' isn't the identity */\n    if ( ( matrix->xy | matrix->yx ) ||\n         matrix->xx != 0x10000L      ||\n         matrix->yy != 0x10000L      )\n      internal->transform_flags |= 1;\n\n    if ( !delta )\n    {\n      internal->transform_delta.x = 0;\n      internal->transform_delta.y = 0;\n      delta = &internal->transform_delta;\n    }\n    else\n      internal->transform_delta = *delta;\n\n    /* set transform_flags bit flag 1 if `delta' isn't the null vector */\n    if ( delta->x | delta->y )\n      internal->transform_flags |= 2;\n  }\n\n\n  static FT_Renderer\n  ft_lookup_glyph_renderer( FT_GlyphSlot  slot );\n\n\n#ifdef GRID_FIT_METRICS\n  static void\n  ft_glyphslot_grid_fit_metrics( FT_GlyphSlot  slot,\n                                 FT_Bool       vertical )\n  {\n    FT_Glyph_Metrics*  metrics = &slot->metrics;\n    FT_Pos             right, bottom;\n\n\n    if ( vertical )\n    {\n      metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX );\n      metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY );\n\n      right  = FT_PIX_CEIL( metrics->vertBearingX + metrics->width );\n      bottom = FT_PIX_CEIL( metrics->vertBearingY + metrics->height );\n\n      metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX );\n      metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY );\n\n      metrics->width  = right - metrics->vertBearingX;\n      metrics->height = bottom - metrics->vertBearingY;\n    }\n    else\n    {\n      metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX );\n      metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY );\n\n      right  = FT_PIX_CEIL ( metrics->horiBearingX + metrics->width );\n      bottom = FT_PIX_FLOOR( metrics->horiBearingY - metrics->height );\n\n      metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX );\n      metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY );\n\n      metrics->width  = right - metrics->horiBearingX;\n      metrics->height = metrics->horiBearingY - bottom;\n    }\n\n    metrics->horiAdvance = FT_PIX_ROUND( metrics->horiAdvance );\n    metrics->vertAdvance = FT_PIX_ROUND( metrics->vertAdvance );\n  }\n#endif /* GRID_FIT_METRICS */\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Load_Glyph( FT_Face   face,\n                 FT_UInt   glyph_index,\n                 FT_Int32  load_flags )\n  {\n    FT_Error      error;\n    FT_Driver     driver;\n    FT_GlyphSlot  slot;\n    FT_Library    library;\n    FT_Bool       autohint = FALSE;\n    FT_Module     hinter;\n    TT_Face       ttface = (TT_Face)face;\n\n\n    if ( !face || !face->size || !face->glyph )\n      return FT_THROW( Invalid_Face_Handle );\n\n    /* The validity test for `glyph_index' is performed by the */\n    /* font drivers.                                           */\n\n    slot = face->glyph;\n    ft_glyphslot_clear( slot );\n\n    driver  = face->driver;\n    library = driver->root.library;\n    hinter  = library->auto_hinter;\n\n    /* resolve load flags dependencies */\n\n    if ( load_flags & FT_LOAD_NO_RECURSE )\n      load_flags |= FT_LOAD_NO_SCALE         |\n                    FT_LOAD_IGNORE_TRANSFORM;\n\n    if ( load_flags & FT_LOAD_NO_SCALE )\n    {\n      load_flags |= FT_LOAD_NO_HINTING |\n                    FT_LOAD_NO_BITMAP;\n\n      load_flags &= ~FT_LOAD_RENDER;\n    }\n\n    /*\n     * Determine whether we need to auto-hint or not.\n     * The general rules are:\n     *\n     * - Do only auto-hinting if we have a hinter module, a scalable font\n     *   format dealing with outlines, and no transforms except simple\n     *   slants and/or rotations by integer multiples of 90 degrees.\n     *\n     * - Then, auto-hint if FT_LOAD_FORCE_AUTOHINT is set or if we don't\n     *   have a native font hinter.\n     *\n     * - Otherwise, auto-hint for LIGHT hinting mode or if there isn't\n     *   any hinting bytecode in the TrueType/OpenType font.\n     *\n     * - Exception: The font is `tricky' and requires the native hinter to\n     *   load properly.\n     */\n\n    if ( hinter                                           &&\n         !( load_flags & FT_LOAD_NO_HINTING )             &&\n         !( load_flags & FT_LOAD_NO_AUTOHINT )            &&\n         FT_DRIVER_IS_SCALABLE( driver )                  &&\n         FT_DRIVER_USES_OUTLINES( driver )                &&\n         !FT_IS_TRICKY( face )                            &&\n         ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM )    ||\n           ( face->internal->transform_matrix.yx == 0 &&\n             face->internal->transform_matrix.xx != 0 ) ||\n           ( face->internal->transform_matrix.xx == 0 &&\n             face->internal->transform_matrix.yx != 0 ) ) )\n    {\n      if ( ( load_flags & FT_LOAD_FORCE_AUTOHINT ) ||\n           !FT_DRIVER_HAS_HINTER( driver )         )\n        autohint = TRUE;\n      else\n      {\n        FT_Render_Mode  mode = FT_LOAD_TARGET_MODE( load_flags );\n\n\n        /* the check for `num_locations' assures that we actually    */\n        /* test for instructions in a TTF and not in a CFF-based OTF */\n        if ( mode == FT_RENDER_MODE_LIGHT                       ||\n             face->internal->ignore_unpatented_hinter           ||\n             ( FT_IS_SFNT( face )                             &&\n               ttface->num_locations                          &&\n               ttface->max_profile.maxSizeOfInstructions == 0 ) )\n          autohint = TRUE;\n      }\n    }\n\n    if ( autohint )\n    {\n      FT_AutoHinter_Interface  hinting;\n\n\n      /* try to load embedded bitmaps first if available            */\n      /*                                                            */\n      /* XXX: This is really a temporary hack that should disappear */\n      /*      promptly with FreeType 2.1!                           */\n      /*                                                            */\n      if ( FT_HAS_FIXED_SIZES( face )             &&\n          ( load_flags & FT_LOAD_NO_BITMAP ) == 0 )\n      {\n        error = driver->clazz->load_glyph( slot, face->size,\n                                           glyph_index,\n                                           load_flags | FT_LOAD_SBITS_ONLY );\n\n        if ( !error && slot->format == FT_GLYPH_FORMAT_BITMAP )\n          goto Load_Ok;\n      }\n\n      {\n        FT_Face_Internal  internal        = face->internal;\n        FT_Int            transform_flags = internal->transform_flags;\n\n\n        /* since the auto-hinter calls FT_Load_Glyph by itself, */\n        /* make sure that glyphs aren't transformed             */\n        internal->transform_flags = 0;\n\n        /* load auto-hinted outline */\n        hinting = (FT_AutoHinter_Interface)hinter->clazz->module_interface;\n\n        error   = hinting->load_glyph( (FT_AutoHinter)hinter,\n                                       slot, face->size,\n                                       glyph_index, load_flags );\n\n        internal->transform_flags = transform_flags;\n      }\n    }\n    else\n    {\n      error = driver->clazz->load_glyph( slot,\n                                         face->size,\n                                         glyph_index,\n                                         load_flags );\n      if ( error )\n        goto Exit;\n\n      if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )\n      {\n        /* check that the loaded outline is correct */\n        error = FT_Outline_Check( &slot->outline );\n        if ( error )\n          goto Exit;\n\n#ifdef GRID_FIT_METRICS\n        if ( !( load_flags & FT_LOAD_NO_HINTING ) )\n          ft_glyphslot_grid_fit_metrics( slot,\n              FT_BOOL( load_flags & FT_LOAD_VERTICAL_LAYOUT ) );\n#endif\n      }\n    }\n\n  Load_Ok:\n    /* compute the advance */\n    if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )\n    {\n      slot->advance.x = 0;\n      slot->advance.y = slot->metrics.vertAdvance;\n    }\n    else\n    {\n      slot->advance.x = slot->metrics.horiAdvance;\n      slot->advance.y = 0;\n    }\n\n    /* compute the linear advance in 16.16 pixels */\n    if ( ( load_flags & FT_LOAD_LINEAR_DESIGN ) == 0 &&\n         ( FT_IS_SCALABLE( face ) )                  )\n    {\n      FT_Size_Metrics*  metrics = &face->size->metrics;\n\n\n      /* it's tricky! */\n      slot->linearHoriAdvance = FT_MulDiv( slot->linearHoriAdvance,\n                                           metrics->x_scale, 64 );\n\n      slot->linearVertAdvance = FT_MulDiv( slot->linearVertAdvance,\n                                           metrics->y_scale, 64 );\n    }\n\n    if ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM ) == 0 )\n    {\n      FT_Face_Internal  internal = face->internal;\n\n\n      /* now, transform the glyph image if needed */\n      if ( internal->transform_flags )\n      {\n        /* get renderer */\n        FT_Renderer  renderer = ft_lookup_glyph_renderer( slot );\n\n\n        if ( renderer )\n          error = renderer->clazz->transform_glyph(\n                                     renderer, slot,\n                                     &internal->transform_matrix,\n                                     &internal->transform_delta );\n        else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )\n        {\n          /* apply `standard' transformation if no renderer is available */\n          if ( internal->transform_flags & 1 )\n            FT_Outline_Transform( &slot->outline,\n                                  &internal->transform_matrix );\n\n          if ( internal->transform_flags & 2 )\n            FT_Outline_Translate( &slot->outline,\n                                  internal->transform_delta.x,\n                                  internal->transform_delta.y );\n        }\n\n        /* transform advance */\n        FT_Vector_Transform( &slot->advance, &internal->transform_matrix );\n      }\n    }\n\n    FT_TRACE5(( \"  x advance: %d\\n\" , slot->advance.x ));\n    FT_TRACE5(( \"  y advance: %d\\n\" , slot->advance.y ));\n\n    FT_TRACE5(( \"  linear x advance: %d\\n\" , slot->linearHoriAdvance ));\n    FT_TRACE5(( \"  linear y advance: %d\\n\" , slot->linearVertAdvance ));\n\n    /* do we need to render the image now? */\n    if ( !error                                    &&\n         slot->format != FT_GLYPH_FORMAT_BITMAP    &&\n         slot->format != FT_GLYPH_FORMAT_COMPOSITE &&\n         load_flags & FT_LOAD_RENDER )\n    {\n      FT_Render_Mode  mode = FT_LOAD_TARGET_MODE( load_flags );\n\n\n      if ( mode == FT_RENDER_MODE_NORMAL      &&\n           (load_flags & FT_LOAD_MONOCHROME ) )\n        mode = FT_RENDER_MODE_MONO;\n\n      error = FT_Render_Glyph( slot, mode );\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Load_Char( FT_Face   face,\n                FT_ULong  char_code,\n                FT_Int32  load_flags )\n  {\n    FT_UInt  glyph_index;\n\n\n    if ( !face )\n      return FT_THROW( Invalid_Face_Handle );\n\n    glyph_index = (FT_UInt)char_code;\n    if ( face->charmap )\n      glyph_index = FT_Get_Char_Index( face, char_code );\n\n    return FT_Load_Glyph( face, glyph_index, load_flags );\n  }\n\n\n  /* destructor for sizes list */\n  static void\n  destroy_size( FT_Memory  memory,\n                FT_Size    size,\n                FT_Driver  driver )\n  {\n    /* finalize client-specific data */\n    if ( size->generic.finalizer )\n      size->generic.finalizer( size );\n\n    /* finalize format-specific stuff */\n    if ( driver->clazz->done_size )\n      driver->clazz->done_size( size );\n\n    FT_FREE( size->internal );\n    FT_FREE( size );\n  }\n\n\n  static void\n  ft_cmap_done_internal( FT_CMap  cmap );\n\n\n  static void\n  destroy_charmaps( FT_Face    face,\n                    FT_Memory  memory )\n  {\n    FT_Int  n;\n\n\n    if ( !face )\n      return;\n\n    for ( n = 0; n < face->num_charmaps; n++ )\n    {\n      FT_CMap  cmap = FT_CMAP( face->charmaps[n] );\n\n\n      ft_cmap_done_internal( cmap );\n\n      face->charmaps[n] = NULL;\n    }\n\n    FT_FREE( face->charmaps );\n    face->num_charmaps = 0;\n  }\n\n\n  /* destructor for faces list */\n  static void\n  destroy_face( FT_Memory  memory,\n                FT_Face    face,\n                FT_Driver  driver )\n  {\n    FT_Driver_Class  clazz = driver->clazz;\n\n\n    /* discard auto-hinting data */\n    if ( face->autohint.finalizer )\n      face->autohint.finalizer( face->autohint.data );\n\n    /* Discard glyph slots for this face.                           */\n    /* Beware!  FT_Done_GlyphSlot() changes the field `face->glyph' */\n    while ( face->glyph )\n      FT_Done_GlyphSlot( face->glyph );\n\n    /* discard all sizes for this face */\n    FT_List_Finalize( &face->sizes_list,\n                      (FT_List_Destructor)destroy_size,\n                      memory,\n                      driver );\n    face->size = 0;\n\n    /* now discard client data */\n    if ( face->generic.finalizer )\n      face->generic.finalizer( face );\n\n    /* discard charmaps */\n    destroy_charmaps( face, memory );\n\n    /* finalize format-specific stuff */\n    if ( clazz->done_face )\n      clazz->done_face( face );\n\n    /* close the stream for this face if needed */\n    FT_Stream_Free(\n      face->stream,\n      ( face->face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) != 0 );\n\n    face->stream = 0;\n\n    /* get rid of it */\n    if ( face->internal )\n    {\n      FT_FREE( face->internal );\n    }\n    FT_FREE( face );\n  }\n\n\n  static void\n  Destroy_Driver( FT_Driver  driver )\n  {\n    FT_List_Finalize( &driver->faces_list,\n                      (FT_List_Destructor)destroy_face,\n                      driver->root.memory,\n                      driver );\n\n    /* check whether we need to drop the driver's glyph loader */\n    if ( FT_DRIVER_USES_OUTLINES( driver ) )\n      FT_GlyphLoader_Done( driver->glyph_loader );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    find_unicode_charmap                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function finds a Unicode charmap, if there is one.            */\n  /*    And if there is more than one, it tries to favour the more         */\n  /*    extensive one, i.e., one that supports UCS-4 against those which   */\n  /*    are limited to the BMP (said UCS-2 encoding.)                      */\n  /*                                                                       */\n  /*    This function is called from open_face() (just below), and also    */\n  /*    from FT_Select_Charmap( ..., FT_ENCODING_UNICODE ).                */\n  /*                                                                       */\n  static FT_Error\n  find_unicode_charmap( FT_Face  face )\n  {\n    FT_CharMap*  first;\n    FT_CharMap*  cur;\n\n\n    /* caller should have already checked that `face' is valid */\n    FT_ASSERT( face );\n\n    first = face->charmaps;\n\n    if ( !first )\n      return FT_THROW( Invalid_CharMap_Handle );\n\n    /*\n     *  The original TrueType specification(s) only specified charmap\n     *  formats that are capable of mapping 8 or 16 bit character codes to\n     *  glyph indices.\n     *\n     *  However, recent updates to the Apple and OpenType specifications\n     *  introduced new formats that are capable of mapping 32-bit character\n     *  codes as well.  And these are already used on some fonts, mainly to\n     *  map non-BMP Asian ideographs as defined in Unicode.\n     *\n     *  For compatibility purposes, these fonts generally come with\n     *  *several* Unicode charmaps:\n     *\n     *   - One of them in the \"old\" 16-bit format, that cannot access\n     *     all glyphs in the font.\n     *\n     *   - Another one in the \"new\" 32-bit format, that can access all\n     *     the glyphs.\n     *\n     *  This function has been written to always favor a 32-bit charmap\n     *  when found.  Otherwise, a 16-bit one is returned when found.\n     */\n\n    /* Since the `interesting' table, with IDs (3,10), is normally the */\n    /* last one, we loop backwards.  This loses with type1 fonts with  */\n    /* non-BMP characters (<.0001%), this wins with .ttf with non-BMP  */\n    /* chars (.01% ?), and this is the same about 99.99% of the time!  */\n\n    cur = first + face->num_charmaps;  /* points after the last one */\n\n    for ( ; --cur >= first; )\n    {\n      if ( cur[0]->encoding == FT_ENCODING_UNICODE )\n      {\n        /* XXX If some new encodings to represent UCS-4 are added, */\n        /*     they should be added here.                          */\n        if ( ( cur[0]->platform_id == TT_PLATFORM_MICROSOFT &&\n               cur[0]->encoding_id == TT_MS_ID_UCS_4        )     ||\n             ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE &&\n               cur[0]->encoding_id == TT_APPLE_ID_UNICODE_32    ) )\n        {\n#ifdef FT_MAX_CHARMAP_CACHEABLE\n          if ( cur - first > FT_MAX_CHARMAP_CACHEABLE )\n          {\n            FT_ERROR(( \"find_unicode_charmap: UCS-4 cmap is found \"\n                       \"at too late position (%d)\\n\", cur - first ));\n            continue;\n          }\n#endif\n          face->charmap = cur[0];\n          return FT_Err_Ok;\n        }\n      }\n    }\n\n    /* We do not have any UCS-4 charmap.                */\n    /* Do the loop again and search for UCS-2 charmaps. */\n    cur = first + face->num_charmaps;\n\n    for ( ; --cur >= first; )\n    {\n      if ( cur[0]->encoding == FT_ENCODING_UNICODE )\n      {\n#ifdef FT_MAX_CHARMAP_CACHEABLE\n        if ( cur - first > FT_MAX_CHARMAP_CACHEABLE )\n        {\n          FT_ERROR(( \"find_unicode_charmap: UCS-2 cmap is found \"\n                     \"at too late position (%d)\\n\", cur - first ));\n          continue;\n        }\n#endif\n        face->charmap = cur[0];\n        return FT_Err_Ok;\n      }\n    }\n\n    return FT_THROW( Invalid_CharMap_Handle );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    find_variant_selector_charmap                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function finds the variant selector charmap, if there is one. */\n  /*    There can only be one (platform=0, specific=5, format=14).         */\n  /*                                                                       */\n  static FT_CharMap\n  find_variant_selector_charmap( FT_Face  face )\n  {\n    FT_CharMap*  first;\n    FT_CharMap*  end;\n    FT_CharMap*  cur;\n\n\n    /* caller should have already checked that `face' is valid */\n    FT_ASSERT( face );\n\n    first = face->charmaps;\n\n    if ( !first )\n      return NULL;\n\n    end = first + face->num_charmaps;  /* points after the last one */\n\n    for ( cur = first; cur < end; ++cur )\n    {\n      if ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE    &&\n           cur[0]->encoding_id == TT_APPLE_ID_VARIANT_SELECTOR &&\n           FT_Get_CMap_Format( cur[0] ) == 14                  )\n      {\n#ifdef FT_MAX_CHARMAP_CACHEABLE\n        if ( cur - first > FT_MAX_CHARMAP_CACHEABLE )\n        {\n          FT_ERROR(( \"find_unicode_charmap: UVS cmap is found \"\n                     \"at too late position (%d)\\n\", cur - first ));\n          continue;\n        }\n#endif\n        return cur[0];\n      }\n    }\n\n    return NULL;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    open_face                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function does some work for FT_Open_Face().                   */\n  /*                                                                       */\n  static FT_Error\n  open_face( FT_Driver      driver,\n             FT_Stream      stream,\n             FT_Long        face_index,\n             FT_Int         num_params,\n             FT_Parameter*  params,\n             FT_Face       *aface )\n  {\n    FT_Memory         memory;\n    FT_Driver_Class   clazz;\n    FT_Face           face = 0;\n    FT_Error          error, error2;\n    FT_Face_Internal  internal = NULL;\n\n\n    clazz  = driver->clazz;\n    memory = driver->root.memory;\n\n    /* allocate the face object and perform basic initialization */\n    if ( FT_ALLOC( face, clazz->face_object_size ) )\n      goto Fail;\n\n    face->driver = driver;\n    face->memory = memory;\n    face->stream = stream;\n\n    if ( FT_NEW( internal ) )\n      goto Fail;\n\n    face->internal = internal;\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    {\n      int  i;\n\n\n      face->internal->incremental_interface = 0;\n      for ( i = 0; i < num_params && !face->internal->incremental_interface;\n            i++ )\n        if ( params[i].tag == FT_PARAM_TAG_INCREMENTAL )\n          face->internal->incremental_interface =\n            (FT_Incremental_Interface)params[i].data;\n    }\n#endif\n\n    if ( clazz->init_face )\n      error = clazz->init_face( stream,\n                                face,\n                                (FT_Int)face_index,\n                                num_params,\n                                params );\n    if ( error )\n      goto Fail;\n\n    /* select Unicode charmap by default */\n    error2 = find_unicode_charmap( face );\n\n    /* if no Unicode charmap can be found, FT_Err_Invalid_CharMap_Handle */\n    /* is returned.                                                      */\n\n    /* no error should happen, but we want to play safe */\n    if ( error2 && FT_ERR_NEQ( error2, Invalid_CharMap_Handle ) )\n    {\n      error = error2;\n      goto Fail;\n    }\n\n    *aface = face;\n\n  Fail:\n    if ( error )\n    {\n      destroy_charmaps( face, memory );\n      if ( clazz->done_face )\n        clazz->done_face( face );\n      FT_FREE( internal );\n      FT_FREE( face );\n      *aface = 0;\n    }\n\n    return error;\n  }\n\n\n  /* there's a Mac-specific extended implementation of FT_New_Face() */\n  /* in src/base/ftmac.c                                             */\n\n//#ifndef FT_MACINTOSH\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_New_Face( FT_Library   library,\n               const char*  pathname,\n               FT_Long      face_index,\n               FT_Face     *aface )\n  {\n    FT_Open_Args  args;\n\n\n    /* test for valid `library' and `aface' delayed to FT_Open_Face() */\n    if ( !pathname )\n      return FT_THROW( Invalid_Argument );\n\n    args.flags    = FT_OPEN_PATHNAME;\n    args.pathname = (char*)pathname;\n    args.stream   = NULL;\n\n    return FT_Open_Face( library, &args, face_index, aface );\n  }\n\n//#endif\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_New_Memory_Face( FT_Library      library,\n                      const FT_Byte*  file_base,\n                      FT_Long         file_size,\n                      FT_Long         face_index,\n                      FT_Face        *aface )\n  {\n    FT_Open_Args  args;\n\n\n    /* test for valid `library' and `face' delayed to FT_Open_Face() */\n    if ( !file_base )\n      return FT_THROW( Invalid_Argument );\n\n    args.flags       = FT_OPEN_MEMORY;\n    args.memory_base = file_base;\n    args.memory_size = file_size;\n    args.stream      = NULL;\n\n    return FT_Open_Face( library, &args, face_index, aface );\n  }\n\n\n#ifdef FT_CONFIG_OPTION_MAC_FONTS\n\n  /* The behavior here is very similar to that in base/ftmac.c, but it     */\n  /* is designed to work on non-mac systems, so no mac specific calls.     */\n  /*                                                                       */\n  /* We look at the file and determine if it is a mac dfont file or a mac  */\n  /* resource file, or a macbinary file containing a mac resource file.    */\n  /*                                                                       */\n  /* Unlike ftmac I'm not going to look at a `FOND'.  I don't really see   */\n  /* the point, especially since there may be multiple `FOND' resources.   */\n  /* Instead I'll just look for `sfnt' and `POST' resources, ordered as    */\n  /* they occur in the file.                                               */\n  /*                                                                       */\n  /* Note that multiple `POST' resources do not mean multiple postscript   */\n  /* fonts; they all get jammed together to make what is essentially a     */\n  /* pfb file.                                                             */\n  /*                                                                       */\n  /* We aren't interested in `NFNT' or `FONT' bitmap resources.            */\n  /*                                                                       */\n  /* As soon as we get an `sfnt' load it into memory and pass it off to    */\n  /* FT_Open_Face.                                                         */\n  /*                                                                       */\n  /* If we have a (set of) `POST' resources, massage them into a (memory)  */\n  /* pfb file and pass that to FT_Open_Face.  (As with ftmac.c I'm not     */\n  /* going to try to save the kerning info.  After all that lives in the   */\n  /* `FOND' which isn't in the file containing the `POST' resources so     */\n  /* we don't really have access to it.                                    */\n\n\n  /* Finalizer for a memory stream; gets called by FT_Done_Face(). */\n  /* It frees the memory it uses.                                  */\n  /* From ftmac.c.                                                 */\n  static void\n  memory_stream_close( FT_Stream  stream )\n  {\n    FT_Memory  memory = stream->memory;\n\n\n    FT_FREE( stream->base );\n\n    stream->size  = 0;\n    stream->base  = 0;\n    stream->close = 0;\n  }\n\n\n  /* Create a new memory stream from a buffer and a size. */\n  /* From ftmac.c.                                        */\n  static FT_Error\n  new_memory_stream( FT_Library           library,\n                     FT_Byte*             base,\n                     FT_ULong             size,\n                     FT_Stream_CloseFunc  close,\n                     FT_Stream           *astream )\n  {\n    FT_Error   error;\n    FT_Memory  memory;\n    FT_Stream  stream = NULL;\n\n\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    if ( !base )\n      return FT_THROW( Invalid_Argument );\n\n    *astream = 0;\n    memory = library->memory;\n    if ( FT_NEW( stream ) )\n      goto Exit;\n\n    FT_Stream_OpenMemory( stream, base, size );\n\n    stream->close = close;\n\n    *astream = stream;\n\n  Exit:\n    return error;\n  }\n\n\n  /* Create a new FT_Face given a buffer and a driver name. */\n  /* from ftmac.c */\n  FT_LOCAL_DEF( FT_Error )\n  open_face_from_buffer( FT_Library   library,\n                         FT_Byte*     base,\n                         FT_ULong     size,\n                         FT_Long      face_index,\n                         const char*  driver_name,\n                         FT_Face     *aface )\n  {\n    FT_Open_Args  args;\n    FT_Error      error;\n    FT_Stream     stream = NULL;\n    FT_Memory     memory = library->memory;\n\n\n    error = new_memory_stream( library,\n                               base,\n                               size,\n                               memory_stream_close,\n                               &stream );\n    if ( error )\n    {\n      FT_FREE( base );\n      return error;\n    }\n\n    args.flags = FT_OPEN_STREAM;\n    args.stream = stream;\n    if ( driver_name )\n    {\n      args.flags = args.flags | FT_OPEN_DRIVER;\n      args.driver = FT_Get_Module( library, driver_name );\n    }\n\n#ifdef FT_MACINTOSH\n    /* At this point, face_index has served its purpose;      */\n    /* whoever calls this function has already used it to     */\n    /* locate the correct font data.  We should not propagate */\n    /* this index to FT_Open_Face() (unless it is negative).  */\n\n    if ( face_index > 0 )\n      face_index = 0;\n#endif\n\n    error = FT_Open_Face( library, &args, face_index, aface );\n\n    if ( error == FT_Err_Ok )\n      (*aface)->face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM;\n    else\n#ifdef FT_MACINTOSH\n      FT_Stream_Free( stream, 0 );\n#else\n    {\n      FT_Stream_Close( stream );\n      FT_FREE( stream );\n    }\n#endif\n\n    return error;\n  }\n\n\n  /* Look up `TYP1' or `CID ' table from sfnt table directory.       */\n  /* `offset' and `length' must exclude the binary header in tables. */\n\n  /* Type 1 and CID-keyed font drivers should recognize sfnt-wrapped */\n  /* format too.  Here, since we can't expect that the TrueType font */\n  /* driver is loaded unconditially, we must parse the font by       */\n  /* ourselves.  We are only interested in the name of the table and */\n  /* the offset.                                                     */\n\n  static FT_Error\n  ft_lookup_PS_in_sfnt_stream( FT_Stream  stream,\n                               FT_Long    face_index,\n                               FT_ULong*  offset,\n                               FT_ULong*  length,\n                               FT_Bool*   is_sfnt_cid )\n  {\n    FT_Error   error;\n    FT_UShort  numTables;\n    FT_Long    pstable_index;\n    FT_ULong   tag;\n    int        i;\n\n\n    *offset = 0;\n    *length = 0;\n    *is_sfnt_cid = FALSE;\n\n    /* TODO: support for sfnt-wrapped PS/CID in TTC format */\n\n    /* version check for 'typ1' (should be ignored?) */\n    if ( FT_READ_ULONG( tag ) )\n      return error;\n    if ( tag != TTAG_typ1 )\n      return FT_THROW( Unknown_File_Format );\n\n    if ( FT_READ_USHORT( numTables ) )\n      return error;\n    if ( FT_STREAM_SKIP( 2 * 3 ) ) /* skip binary search header */\n      return error;\n\n    pstable_index = -1;\n    *is_sfnt_cid  = FALSE;\n\n    for ( i = 0; i < numTables; i++ )\n    {\n      if ( FT_READ_ULONG( tag )     || FT_STREAM_SKIP( 4 )      ||\n           FT_READ_ULONG( *offset ) || FT_READ_ULONG( *length ) )\n        return error;\n\n      if ( tag == TTAG_CID )\n      {\n        pstable_index++;\n        *offset += 22;\n        *length -= 22;\n        *is_sfnt_cid = TRUE;\n        if ( face_index < 0 )\n          return FT_Err_Ok;\n      }\n      else if ( tag == TTAG_TYP1 )\n      {\n        pstable_index++;\n        *offset += 24;\n        *length -= 24;\n        *is_sfnt_cid = FALSE;\n        if ( face_index < 0 )\n          return FT_Err_Ok;\n      }\n      if ( face_index >= 0 && pstable_index == face_index )\n        return FT_Err_Ok;\n    }\n    return FT_THROW( Table_Missing );\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  open_face_PS_from_sfnt_stream( FT_Library     library,\n                                 FT_Stream      stream,\n                                 FT_Long        face_index,\n                                 FT_Int         num_params,\n                                 FT_Parameter  *params,\n                                 FT_Face       *aface )\n  {\n    FT_Error   error;\n    FT_Memory  memory = library->memory;\n    FT_ULong   offset, length;\n    FT_Long    pos;\n    FT_Bool    is_sfnt_cid;\n    FT_Byte*   sfnt_ps = NULL;\n\n    FT_UNUSED( num_params );\n    FT_UNUSED( params );\n\n\n    pos = FT_Stream_Pos( stream );\n\n    error = ft_lookup_PS_in_sfnt_stream( stream,\n                                         face_index,\n                                         &offset,\n                                         &length,\n                                         &is_sfnt_cid );\n    if ( error )\n      goto Exit;\n\n    if ( FT_Stream_Seek( stream, pos + offset ) )\n      goto Exit;\n\n    if ( FT_ALLOC( sfnt_ps, (FT_Long)length ) )\n      goto Exit;\n\n    error = FT_Stream_Read( stream, (FT_Byte *)sfnt_ps, length );\n    if ( error )\n      goto Exit;\n\n    error = open_face_from_buffer( library,\n                                   sfnt_ps,\n                                   length,\n                                   FT_MIN( face_index, 0 ),\n                                   is_sfnt_cid ? \"cid\" : \"type1\",\n                                   aface );\n  Exit:\n    {\n      FT_Error  error1;\n\n\n      if ( FT_ERR_EQ( error, Unknown_File_Format ) )\n      {\n        error1 = FT_Stream_Seek( stream, pos );\n        if ( error1 )\n          return error1;\n      }\n\n      return error;\n    }\n  }\n\n\n#ifndef FT_MACINTOSH\n\n  /* The resource header says we've got resource_cnt `POST' (type1) */\n  /* resources in this file.  They all need to be coalesced into    */\n  /* one lump which gets passed on to the type1 driver.             */\n  /* Here can be only one PostScript font in a file so face_index   */\n  /* must be 0 (or -1).                                             */\n  /*                                                                */\n  static FT_Error\n  Mac_Read_POST_Resource( FT_Library  library,\n                          FT_Stream   stream,\n                          FT_Long    *offsets,\n                          FT_Long     resource_cnt,\n                          FT_Long     face_index,\n                          FT_Face    *aface )\n  {\n    FT_Error   error  = FT_ERR( Cannot_Open_Resource );\n    FT_Memory  memory = library->memory;\n    FT_Byte*   pfb_data = NULL;\n    int        i, type, flags;\n    FT_Long    len;\n    FT_Long    pfb_len, pfb_pos, pfb_lenpos;\n    FT_Long    rlen, temp;\n\n\n    if ( face_index == -1 )\n      face_index = 0;\n    if ( face_index != 0 )\n      return error;\n\n    /* Find the length of all the POST resources, concatenated.  Assume */\n    /* worst case (each resource in its own section).                   */\n    pfb_len = 0;\n    for ( i = 0; i < resource_cnt; ++i )\n    {\n      error = FT_Stream_Seek( stream, offsets[i] );\n      if ( error )\n        goto Exit;\n      if ( FT_READ_LONG( temp ) )\n        goto Exit;\n      pfb_len += temp + 6;\n    }\n\n    if ( FT_ALLOC( pfb_data, (FT_Long)pfb_len + 2 ) )\n      goto Exit;\n\n    pfb_data[0] = 0x80;\n    pfb_data[1] = 1;            /* Ascii section */\n    pfb_data[2] = 0;            /* 4-byte length, fill in later */\n    pfb_data[3] = 0;\n    pfb_data[4] = 0;\n    pfb_data[5] = 0;\n    pfb_pos     = 6;\n    pfb_lenpos  = 2;\n\n    len = 0;\n    type = 1;\n    for ( i = 0; i < resource_cnt; ++i )\n    {\n      error = FT_Stream_Seek( stream, offsets[i] );\n      if ( error )\n        goto Exit2;\n      if ( FT_READ_LONG( rlen ) )\n        goto Exit;\n      if ( FT_READ_USHORT( flags ) )\n        goto Exit;\n      FT_TRACE3(( \"POST fragment[%d]: offsets=0x%08x, rlen=0x%08x, flags=0x%04x\\n\",\n                   i, offsets[i], rlen, flags ));\n\n      /* postpone the check of rlen longer than buffer until FT_Stream_Read() */\n      if ( ( flags >> 8 ) == 0 )        /* Comment, should not be loaded */\n        continue;\n\n      /* the flags are part of the resource, so rlen >= 2.  */\n      /* but some fonts declare rlen = 0 for empty fragment */\n      if ( rlen > 2 )\n        rlen -= 2;\n      else\n        rlen = 0;\n\n      if ( ( flags >> 8 ) == type )\n        len += rlen;\n      else\n      {\n        if ( pfb_lenpos + 3 > pfb_len + 2 )\n          goto Exit2;\n        pfb_data[pfb_lenpos    ] = (FT_Byte)( len );\n        pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 );\n        pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 );\n        pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 );\n\n        if ( ( flags >> 8 ) == 5 )      /* End of font mark */\n          break;\n\n        if ( pfb_pos + 6 > pfb_len + 2 )\n          goto Exit2;\n        pfb_data[pfb_pos++] = 0x80;\n\n        type = flags >> 8;\n        len = rlen;\n\n        pfb_data[pfb_pos++] = (FT_Byte)type;\n        pfb_lenpos          = pfb_pos;\n        pfb_data[pfb_pos++] = 0;        /* 4-byte length, fill in later */\n        pfb_data[pfb_pos++] = 0;\n        pfb_data[pfb_pos++] = 0;\n        pfb_data[pfb_pos++] = 0;\n      }\n\n      error = FT_ERR( Cannot_Open_Resource );\n      if ( pfb_pos > pfb_len || pfb_pos + rlen > pfb_len )\n        goto Exit2;\n\n      error = FT_Stream_Read( stream, (FT_Byte *)pfb_data + pfb_pos, rlen );\n      if ( error )\n        goto Exit2;\n      pfb_pos += rlen;\n    }\n\n    if ( pfb_pos + 2 > pfb_len + 2 )\n      goto Exit2;\n    pfb_data[pfb_pos++] = 0x80;\n    pfb_data[pfb_pos++] = 3;\n\n    if ( pfb_lenpos + 3 > pfb_len + 2 )\n      goto Exit2;\n    pfb_data[pfb_lenpos    ] = (FT_Byte)( len );\n    pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 );\n    pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 );\n    pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 );\n\n    return open_face_from_buffer( library,\n                                  pfb_data,\n                                  pfb_pos,\n                                  face_index,\n                                  \"type1\",\n                                  aface );\n\n  Exit2:\n    FT_FREE( pfb_data );\n\n  Exit:\n    return error;\n  }\n\n\n  /* The resource header says we've got resource_cnt `sfnt'      */\n  /* (TrueType/OpenType) resources in this file.  Look through   */\n  /* them for the one indicated by face_index, load it into mem, */\n  /* pass it on the the truetype driver and return it.           */\n  /*                                                             */\n  static FT_Error\n  Mac_Read_sfnt_Resource( FT_Library  library,\n                          FT_Stream   stream,\n                          FT_Long    *offsets,\n                          FT_Long     resource_cnt,\n                          FT_Long     face_index,\n                          FT_Face    *aface )\n  {\n    FT_Memory  memory = library->memory;\n    FT_Byte*   sfnt_data = NULL;\n    FT_Error   error;\n    FT_Long    flag_offset;\n    FT_Long    rlen;\n    int        is_cff;\n    FT_Long    face_index_in_resource = 0;\n\n\n    if ( face_index == -1 )\n      face_index = 0;\n    if ( face_index >= resource_cnt )\n      return FT_THROW( Cannot_Open_Resource );\n\n    flag_offset = offsets[face_index];\n    error = FT_Stream_Seek( stream, flag_offset );\n    if ( error )\n      goto Exit;\n\n    if ( FT_READ_LONG( rlen ) )\n      goto Exit;\n    if ( rlen == -1 )\n      return FT_THROW( Cannot_Open_Resource );\n\n    error = open_face_PS_from_sfnt_stream( library,\n                                           stream,\n                                           face_index,\n                                           0, NULL,\n                                           aface );\n    if ( !error )\n      goto Exit;\n\n    /* rewind sfnt stream before open_face_PS_from_sfnt_stream() */\n    if ( FT_Stream_Seek( stream, flag_offset + 4 ) )\n      goto Exit;\n\n    if ( FT_ALLOC( sfnt_data, (FT_Long)rlen ) )\n      return error;\n    error = FT_Stream_Read( stream, (FT_Byte *)sfnt_data, rlen );\n    if ( error )\n      goto Exit;\n\n    is_cff = rlen > 4 && !ft_memcmp( sfnt_data, \"OTTO\", 4 );\n    error = open_face_from_buffer( library,\n                                   sfnt_data,\n                                   rlen,\n                                   face_index_in_resource,\n                                   is_cff ? \"cff\" : \"truetype\",\n                                   aface );\n\n  Exit:\n    return error;\n  }\n\n\n  /* Check for a valid resource fork header, or a valid dfont    */\n  /* header.  In a resource fork the first 16 bytes are repeated */\n  /* at the location specified by bytes 4-7.  In a dfont bytes   */\n  /* 4-7 point to 16 bytes of zeroes instead.                    */\n  /*                                                             */\n  static FT_Error\n  IsMacResource( FT_Library  library,\n                 FT_Stream   stream,\n                 FT_Long     resource_offset,\n                 FT_Long     face_index,\n                 FT_Face    *aface )\n  {\n    FT_Memory  memory = library->memory;\n    FT_Error   error;\n    FT_Long    map_offset, rdara_pos;\n    FT_Long    *data_offsets;\n    FT_Long    count;\n\n\n    error = FT_Raccess_Get_HeaderInfo( library, stream, resource_offset,\n                                       &map_offset, &rdara_pos );\n    if ( error )\n      return error;\n\n    error = FT_Raccess_Get_DataOffsets( library, stream,\n                                        map_offset, rdara_pos,\n                                        TTAG_POST,\n                                        &data_offsets, &count );\n    if ( !error )\n    {\n      error = Mac_Read_POST_Resource( library, stream, data_offsets, count,\n                                      face_index, aface );\n      FT_FREE( data_offsets );\n      /* POST exists in an LWFN providing a single face */\n      if ( !error )\n        (*aface)->num_faces = 1;\n      return error;\n    }\n\n    error = FT_Raccess_Get_DataOffsets( library, stream,\n                                        map_offset, rdara_pos,\n                                        TTAG_sfnt,\n                                        &data_offsets, &count );\n    if ( !error )\n    {\n      FT_Long  face_index_internal = face_index % count;\n\n\n      error = Mac_Read_sfnt_Resource( library, stream, data_offsets, count,\n                                      face_index_internal, aface );\n      FT_FREE( data_offsets );\n      if ( !error )\n        (*aface)->num_faces = count;\n    }\n\n    return error;\n  }\n\n\n  /* Check for a valid macbinary header, and if we find one   */\n  /* check that the (flattened) resource fork in it is valid. */\n  /*                                                          */\n  static FT_Error\n  IsMacBinary( FT_Library  library,\n               FT_Stream   stream,\n               FT_Long     face_index,\n               FT_Face    *aface )\n  {\n    unsigned char  header[128];\n    FT_Error       error;\n    FT_Long        dlen, offset;\n\n\n    if ( NULL == stream )\n      return FT_THROW( Invalid_Stream_Operation );\n\n    error = FT_Stream_Seek( stream, 0 );\n    if ( error )\n      goto Exit;\n\n    error = FT_Stream_Read( stream, (FT_Byte*)header, 128 );\n    if ( error )\n      goto Exit;\n\n    if (            header[ 0] !=  0 ||\n                    header[74] !=  0 ||\n                    header[82] !=  0 ||\n                    header[ 1] ==  0 ||\n                    header[ 1] >  33 ||\n                    header[63] !=  0 ||\n         header[2 + header[1]] !=  0 )\n      return FT_THROW( Unknown_File_Format );\n\n    dlen = ( header[0x53] << 24 ) |\n           ( header[0x54] << 16 ) |\n           ( header[0x55] <<  8 ) |\n             header[0x56];\n#if 0\n    rlen = ( header[0x57] << 24 ) |\n           ( header[0x58] << 16 ) |\n           ( header[0x59] <<  8 ) |\n             header[0x5a];\n#endif /* 0 */\n    offset = 128 + ( ( dlen + 127 ) & ~127 );\n\n    return IsMacResource( library, stream, offset, face_index, aface );\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  load_face_in_embedded_rfork( FT_Library           library,\n                               FT_Stream            stream,\n                               FT_Long              face_index,\n                               FT_Face             *aface,\n                               const FT_Open_Args  *args )\n  {\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_raccess\n\n    FT_Memory  memory = library->memory;\n    FT_Error   error  = FT_ERR( Unknown_File_Format );\n    int        i;\n\n    char *     file_names[FT_RACCESS_N_RULES];\n    FT_Long    offsets[FT_RACCESS_N_RULES];\n    FT_Error   errors[FT_RACCESS_N_RULES];\n    FT_Bool    is_darwin_vfs, vfs_rfork_has_no_font = FALSE; /* not tested */\n\n    FT_Open_Args  args2;\n    FT_Stream     stream2 = 0;\n\n\n    FT_Raccess_Guess( library, stream,\n                      args->pathname, file_names, offsets, errors );\n\n    for ( i = 0; i < FT_RACCESS_N_RULES; i++ )\n    {\n      is_darwin_vfs = ft_raccess_rule_by_darwin_vfs( library, i );\n      if ( is_darwin_vfs && vfs_rfork_has_no_font )\n      {\n        FT_TRACE3(( \"Skip rule %d: darwin vfs resource fork\"\n                    \" is already checked and\"\n                    \" no font is found\\n\", i ));\n        continue;\n      }\n\n      if ( errors[i] )\n      {\n        FT_TRACE3(( \"Error[%d] has occurred in rule %d\\n\", errors[i], i ));\n        continue;\n      }\n\n      args2.flags    = FT_OPEN_PATHNAME;\n      args2.pathname = file_names[i] ? file_names[i] : args->pathname;\n\n      FT_TRACE3(( \"Try rule %d: %s (offset=%d) ...\",\n                  i, args2.pathname, offsets[i] ));\n\n      error = FT_Stream_New( library, &args2, &stream2 );\n      if ( is_darwin_vfs && FT_ERR_EQ( error, Cannot_Open_Stream ) )\n        vfs_rfork_has_no_font = TRUE;\n\n      if ( error )\n      {\n        FT_TRACE3(( \"failed\\n\" ));\n        continue;\n      }\n\n      error = IsMacResource( library, stream2, offsets[i],\n                             face_index, aface );\n      FT_Stream_Free( stream2, 0 );\n\n      FT_TRACE3(( \"%s\\n\", error ? \"failed\": \"successful\" ));\n\n      if ( !error )\n          break;\n      else if ( is_darwin_vfs )\n          vfs_rfork_has_no_font = TRUE;\n    }\n\n    for (i = 0; i < FT_RACCESS_N_RULES; i++)\n    {\n      if ( file_names[i] )\n        FT_FREE( file_names[i] );\n    }\n\n    /* Caller (load_mac_face) requires FT_Err_Unknown_File_Format. */\n    if ( error )\n      error = FT_ERR( Unknown_File_Format );\n\n    return error;\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_objs\n\n  }\n\n\n  /* Check for some macintosh formats without Carbon framework.    */\n  /* Is this a macbinary file?  If so look at the resource fork.   */\n  /* Is this a mac dfont file?                                     */\n  /* Is this an old style resource fork? (in data)                 */\n  /* Else call load_face_in_embedded_rfork to try extra rules      */\n  /* (defined in `ftrfork.c').                                     */\n  /*                                                               */\n  static FT_Error\n  load_mac_face( FT_Library           library,\n                 FT_Stream            stream,\n                 FT_Long              face_index,\n                 FT_Face             *aface,\n                 const FT_Open_Args  *args )\n  {\n    FT_Error error;\n    FT_UNUSED( args );\n\n\n    error = IsMacBinary( library, stream, face_index, aface );\n    if ( FT_ERR_EQ( error, Unknown_File_Format ) )\n    {\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_raccess\n\n      FT_TRACE3(( \"Try as dfont: %s ...\", args->pathname ));\n\n      error = IsMacResource( library, stream, 0, face_index, aface );\n\n      FT_TRACE3(( \"%s\\n\", error ? \"failed\" : \"successful\" ));\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_objs\n\n    }\n\n    if ( ( FT_ERR_EQ( error, Unknown_File_Format )      ||\n           FT_ERR_EQ( error, Invalid_Stream_Operation ) ) &&\n         ( args->flags & FT_OPEN_PATHNAME )               )\n      error = load_face_in_embedded_rfork( library, stream,\n                                           face_index, aface, args );\n    return error;\n  }\n#endif\n\n#endif  /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Open_Face( FT_Library           library,\n                const FT_Open_Args*  args,\n                FT_Long              face_index,\n                FT_Face             *aface )\n  {\n    FT_Error     error;\n    FT_Driver    driver = NULL;\n    FT_Memory    memory = NULL;\n    FT_Stream    stream = NULL;\n    FT_Face      face   = NULL;\n    FT_ListNode  node   = NULL;\n    FT_Bool      external_stream;\n    FT_Module*   cur;\n    FT_Module*   limit;\n\n\n    /* test for valid `library' delayed to */\n    /* FT_Stream_New()                     */\n\n    if ( ( !aface && face_index >= 0 ) || !args )\n      return FT_THROW( Invalid_Argument );\n\n    external_stream = FT_BOOL( ( args->flags & FT_OPEN_STREAM ) &&\n                               args->stream                     );\n\n    /* create input stream */\n    error = FT_Stream_New( library, args, &stream );\n    if ( error )\n      goto Fail3;\n\n    memory = library->memory;\n\n    /* If the font driver is specified in the `args' structure, use */\n    /* it.  Otherwise, we scan the list of registered drivers.      */\n    if ( ( args->flags & FT_OPEN_DRIVER ) && args->driver )\n    {\n      driver = FT_DRIVER( args->driver );\n\n      /* not all modules are drivers, so check... */\n      if ( FT_MODULE_IS_DRIVER( driver ) )\n      {\n        FT_Int         num_params = 0;\n        FT_Parameter*  params     = 0;\n\n\n        if ( args->flags & FT_OPEN_PARAMS )\n        {\n          num_params = args->num_params;\n          params     = args->params;\n        }\n\n        error = open_face( driver, stream, face_index,\n                           num_params, params, &face );\n        if ( !error )\n          goto Success;\n      }\n      else\n        error = FT_THROW( Invalid_Handle );\n\n      FT_Stream_Free( stream, external_stream );\n      goto Fail;\n    }\n    else\n    {\n      error = FT_ERR( Missing_Module );\n\n      /* check each font driver for an appropriate format */\n      cur   = library->modules;\n      limit = cur + library->num_modules;\n\n      for ( ; cur < limit; cur++ )\n      {\n        /* not all modules are font drivers, so check... */\n        if ( FT_MODULE_IS_DRIVER( cur[0] ) )\n        {\n          FT_Int         num_params = 0;\n          FT_Parameter*  params     = 0;\n\n\n          driver = FT_DRIVER( cur[0] );\n\n          if ( args->flags & FT_OPEN_PARAMS )\n          {\n            num_params = args->num_params;\n            params     = args->params;\n          }\n\n          error = open_face( driver, stream, face_index,\n                             num_params, params, &face );\n          if ( !error )\n            goto Success;\n\n#ifdef FT_CONFIG_OPTION_MAC_FONTS\n          if ( ft_strcmp( cur[0]->clazz->module_name, \"truetype\" ) == 0 &&\n               FT_ERR_EQ( error, Table_Missing )                        )\n          {\n            /* TrueType but essential tables are missing */\n            if ( FT_Stream_Seek( stream, 0 ) )\n              break;\n\n            error = open_face_PS_from_sfnt_stream( library,\n                                                   stream,\n                                                   face_index,\n                                                   num_params,\n                                                   params,\n                                                   aface );\n            if ( !error )\n            {\n              FT_Stream_Free( stream, external_stream );\n              return error;\n            }\n          }\n#endif\n\n          if ( FT_ERR_NEQ( error, Unknown_File_Format ) )\n            goto Fail3;\n        }\n      }\n\n    Fail3:\n      /* If we are on the mac, and we get an                          */\n      /* FT_Err_Invalid_Stream_Operation it may be because we have an */\n      /* empty data fork, so we need to check the resource fork.      */\n      if ( FT_ERR_NEQ( error, Cannot_Open_Stream )       &&\n           FT_ERR_NEQ( error, Unknown_File_Format )      &&\n           FT_ERR_NEQ( error, Invalid_Stream_Operation ) )\n        goto Fail2;\n\n#if !defined( FT_MACINTOSH ) && defined( FT_CONFIG_OPTION_MAC_FONTS )\n      error = load_mac_face( library, stream, face_index, aface, args );\n      if ( !error )\n      {\n        /* We don't want to go to Success here.  We've already done that. */\n        /* On the other hand, if we succeeded we still need to close this */\n        /* stream (we opened a different stream which extracted the       */\n        /* interesting information out of this stream here.  That stream  */\n        /* will still be open and the face will point to it).             */\n        FT_Stream_Free( stream, external_stream );\n        return error;\n      }\n\n      if ( FT_ERR_NEQ( error, Unknown_File_Format ) )\n        goto Fail2;\n#endif  /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */\n\n      /* no driver is able to handle this format */\n      error = FT_THROW( Unknown_File_Format );\n\n  Fail2:\n      FT_Stream_Free( stream, external_stream );\n      goto Fail;\n    }\n\n  Success:\n    FT_TRACE4(( \"FT_Open_Face: New face object, adding to list\\n\" ));\n\n    /* set the FT_FACE_FLAG_EXTERNAL_STREAM bit for FT_Done_Face */\n    if ( external_stream )\n      face->face_flags |= FT_FACE_FLAG_EXTERNAL_STREAM;\n\n    /* add the face object to its driver's list */\n    if ( FT_NEW( node ) )\n      goto Fail;\n\n    node->data = face;\n    /* don't assume driver is the same as face->driver, so use */\n    /* face->driver instead.                                   */\n    FT_List_Add( &face->driver->faces_list, node );\n\n    /* now allocate a glyph slot object for the face */\n    FT_TRACE4(( \"FT_Open_Face: Creating glyph slot\\n\" ));\n\n    if ( face_index >= 0 )\n    {\n      error = FT_New_GlyphSlot( face, NULL );\n      if ( error )\n        goto Fail;\n\n      /* finally, allocate a size object for the face */\n      {\n        FT_Size  size;\n\n\n        FT_TRACE4(( \"FT_Open_Face: Creating size object\\n\" ));\n\n        error = FT_New_Size( face, &size );\n        if ( error )\n          goto Fail;\n\n        face->size = size;\n      }\n    }\n\n    /* some checks */\n\n    if ( FT_IS_SCALABLE( face ) )\n    {\n      if ( face->height < 0 )\n        face->height = (FT_Short)-face->height;\n\n      if ( !FT_HAS_VERTICAL( face ) )\n        face->max_advance_height = (FT_Short)face->height;\n    }\n\n    if ( FT_HAS_FIXED_SIZES( face ) )\n    {\n      FT_Int  i;\n\n\n      for ( i = 0; i < face->num_fixed_sizes; i++ )\n      {\n        FT_Bitmap_Size*  bsize = face->available_sizes + i;\n\n\n        if ( bsize->height < 0 )\n          bsize->height = (FT_Short)-bsize->height;\n        if ( bsize->x_ppem < 0 )\n          bsize->x_ppem = (FT_Short)-bsize->x_ppem;\n        if ( bsize->y_ppem < 0 )\n          bsize->y_ppem = -bsize->y_ppem;\n      }\n    }\n\n    /* initialize internal face data */\n    {\n      FT_Face_Internal  internal = face->internal;\n\n\n      internal->transform_matrix.xx = 0x10000L;\n      internal->transform_matrix.xy = 0;\n      internal->transform_matrix.yx = 0;\n      internal->transform_matrix.yy = 0x10000L;\n\n      internal->transform_delta.x = 0;\n      internal->transform_delta.y = 0;\n\n      internal->refcount = 1;\n    }\n\n    if ( aface )\n      *aface = face;\n    else\n      FT_Done_Face( face );\n\n    goto Exit;\n\n  Fail:\n    if ( node )\n      FT_Done_Face( face );    /* face must be in the driver's list */\n    else if ( face )\n      destroy_face( memory, face, driver );\n\n  Exit:\n    FT_TRACE4(( \"FT_Open_Face: Return %d\\n\", error ));\n\n    return error;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Attach_File( FT_Face      face,\n                  const char*  filepathname )\n  {\n    FT_Open_Args  open;\n\n\n    /* test for valid `face' delayed to FT_Attach_Stream() */\n\n    if ( !filepathname )\n      return FT_THROW( Invalid_Argument );\n\n    open.stream   = NULL;\n    open.flags    = FT_OPEN_PATHNAME;\n    open.pathname = (char*)filepathname;\n\n    return FT_Attach_Stream( face, &open );\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Attach_Stream( FT_Face        face,\n                    FT_Open_Args*  parameters )\n  {\n    FT_Stream  stream;\n    FT_Error   error;\n    FT_Driver  driver;\n\n    FT_Driver_Class  clazz;\n\n\n    /* test for valid `parameters' delayed to FT_Stream_New() */\n\n    if ( !face )\n      return FT_THROW( Invalid_Face_Handle );\n\n    driver = face->driver;\n    if ( !driver )\n      return FT_THROW( Invalid_Driver_Handle );\n\n    error = FT_Stream_New( driver->root.library, parameters, &stream );\n    if ( error )\n      goto Exit;\n\n    /* we implement FT_Attach_Stream in each driver through the */\n    /* `attach_file' interface                                  */\n\n    error = FT_ERR( Unimplemented_Feature );\n    clazz = driver->clazz;\n    if ( clazz->attach_file )\n      error = clazz->attach_file( face, stream );\n\n    /* close the attached stream */\n    FT_Stream_Free( stream,\n                    (FT_Bool)( parameters->stream &&\n                               ( parameters->flags & FT_OPEN_STREAM ) ) );\n\n  Exit:\n    return error;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Reference_Face( FT_Face  face )\n  {\n    face->internal->refcount++;\n\n    return FT_Err_Ok;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Done_Face( FT_Face  face )\n  {\n    FT_Error     error;\n    FT_Driver    driver;\n    FT_Memory    memory;\n    FT_ListNode  node;\n\n\n    error = FT_ERR( Invalid_Face_Handle );\n    if ( face && face->driver )\n    {\n      face->internal->refcount--;\n      if ( face->internal->refcount > 0 )\n        error = FT_Err_Ok;\n      else\n      {\n        driver = face->driver;\n        memory = driver->root.memory;\n\n        /* find face in driver's list */\n        node = FT_List_Find( &driver->faces_list, face );\n        if ( node )\n        {\n          /* remove face object from the driver's list */\n          FT_List_Remove( &driver->faces_list, node );\n          FT_FREE( node );\n\n          /* now destroy the object proper */\n          destroy_face( memory, face, driver );\n          error = FT_Err_Ok;\n        }\n      }\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in ftobjs.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_New_Size( FT_Face   face,\n               FT_Size  *asize )\n  {\n    FT_Error         error;\n    FT_Memory        memory;\n    FT_Driver        driver;\n    FT_Driver_Class  clazz;\n\n    FT_Size          size = 0;\n    FT_ListNode      node = 0;\n\n\n    if ( !face )\n      return FT_THROW( Invalid_Face_Handle );\n\n    if ( !asize )\n      return FT_THROW( Invalid_Size_Handle );\n\n    if ( !face->driver )\n      return FT_THROW( Invalid_Driver_Handle );\n\n    *asize = 0;\n\n    driver = face->driver;\n    clazz  = driver->clazz;\n    memory = face->memory;\n\n    /* Allocate new size object and perform basic initialisation */\n    if ( FT_ALLOC( size, clazz->size_object_size ) || FT_NEW( node ) )\n      goto Exit;\n\n    size->face = face;\n\n    /* for now, do not use any internal fields in size objects */\n    size->internal = 0;\n\n    if ( clazz->init_size )\n      error = clazz->init_size( size );\n\n    /* in case of success, add to the face's list */\n    if ( !error )\n    {\n      *asize     = size;\n      node->data = size;\n      FT_List_Add( &face->sizes_list, node );\n    }\n\n  Exit:\n    if ( error )\n    {\n      FT_FREE( node );\n      FT_FREE( size );\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in ftobjs.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Done_Size( FT_Size  size )\n  {\n    FT_Error     error;\n    FT_Driver    driver;\n    FT_Memory    memory;\n    FT_Face      face;\n    FT_ListNode  node;\n\n\n    if ( !size )\n      return FT_THROW( Invalid_Size_Handle );\n\n    face = size->face;\n    if ( !face )\n      return FT_THROW( Invalid_Face_Handle );\n\n    driver = face->driver;\n    if ( !driver )\n      return FT_THROW( Invalid_Driver_Handle );\n\n    memory = driver->root.memory;\n\n    error = FT_Err_Ok;\n    node  = FT_List_Find( &face->sizes_list, size );\n    if ( node )\n    {\n      FT_List_Remove( &face->sizes_list, node );\n      FT_FREE( node );\n\n      if ( face->size == size )\n      {\n        face->size = 0;\n        if ( face->sizes_list.head )\n          face->size = (FT_Size)(face->sizes_list.head->data);\n      }\n\n      destroy_size( memory, size, driver );\n    }\n    else\n      error = FT_THROW( Invalid_Size_Handle );\n\n    return error;\n  }\n\n\n  /* documentation is in ftobjs.h */\n\n  FT_BASE_DEF( FT_Error )\n  FT_Match_Size( FT_Face          face,\n                 FT_Size_Request  req,\n                 FT_Bool          ignore_width,\n                 FT_ULong*        size_index )\n  {\n    FT_Int   i;\n    FT_Long  w, h;\n\n\n    if ( !FT_HAS_FIXED_SIZES( face ) )\n      return FT_THROW( Invalid_Face_Handle );\n\n    /* FT_Bitmap_Size doesn't provide enough info... */\n    if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL )\n      return FT_THROW( Unimplemented_Feature );\n\n    w = FT_REQUEST_WIDTH ( req );\n    h = FT_REQUEST_HEIGHT( req );\n\n    if ( req->width && !req->height )\n      h = w;\n    else if ( !req->width && req->height )\n      w = h;\n\n    w = FT_PIX_ROUND( w );\n    h = FT_PIX_ROUND( h );\n\n    for ( i = 0; i < face->num_fixed_sizes; i++ )\n    {\n      FT_Bitmap_Size*  bsize = face->available_sizes + i;\n\n\n      if ( h != FT_PIX_ROUND( bsize->y_ppem ) )\n        continue;\n\n      if ( w == FT_PIX_ROUND( bsize->x_ppem ) || ignore_width )\n      {\n        FT_TRACE3(( \"FT_Match_Size: bitmap strike %d matches\\n\", i ));\n\n        if ( size_index )\n          *size_index = (FT_ULong)i;\n\n        return FT_Err_Ok;\n      }\n    }\n\n    return FT_THROW( Invalid_Pixel_Size );\n  }\n\n\n  /* documentation is in ftobjs.h */\n\n  FT_BASE_DEF( void )\n  ft_synthesize_vertical_metrics( FT_Glyph_Metrics*  metrics,\n                                  FT_Pos             advance )\n  {\n    FT_Pos  height = metrics->height;\n\n\n    /* compensate for glyph with bbox above/below the baseline */\n    if ( metrics->horiBearingY < 0 )\n    {\n      if ( height < metrics->horiBearingY )\n        height = metrics->horiBearingY;\n    }\n    else if ( metrics->horiBearingY > 0 )\n      height -= metrics->horiBearingY;\n\n    /* the factor 1.2 is a heuristical value */\n    if ( !advance )\n      advance = height * 12 / 10;\n\n    metrics->vertBearingX = metrics->horiBearingX - metrics->horiAdvance / 2;\n    metrics->vertBearingY = ( advance - height ) / 2;\n    metrics->vertAdvance  = advance;\n  }\n\n\n  static void\n  ft_recompute_scaled_metrics( FT_Face           face,\n                               FT_Size_Metrics*  metrics )\n  {\n    /* Compute root ascender, descender, test height, and max_advance */\n\n#ifdef GRID_FIT_METRICS\n    metrics->ascender    = FT_PIX_CEIL( FT_MulFix( face->ascender,\n                                                   metrics->y_scale ) );\n\n    metrics->descender   = FT_PIX_FLOOR( FT_MulFix( face->descender,\n                                                    metrics->y_scale ) );\n\n    metrics->height      = FT_PIX_ROUND( FT_MulFix( face->height,\n                                                    metrics->y_scale ) );\n\n    metrics->max_advance = FT_PIX_ROUND( FT_MulFix( face->max_advance_width,\n                                                    metrics->x_scale ) );\n#else /* !GRID_FIT_METRICS */\n    metrics->ascender    = FT_MulFix( face->ascender,\n                                      metrics->y_scale );\n\n    metrics->descender   = FT_MulFix( face->descender,\n                                      metrics->y_scale );\n\n    metrics->height      = FT_MulFix( face->height,\n                                      metrics->y_scale );\n\n    metrics->max_advance = FT_MulFix( face->max_advance_width,\n                                      metrics->x_scale );\n#endif /* !GRID_FIT_METRICS */\n  }\n\n\n  FT_BASE_DEF( void )\n  FT_Select_Metrics( FT_Face   face,\n                     FT_ULong  strike_index )\n  {\n    FT_Size_Metrics*  metrics;\n    FT_Bitmap_Size*   bsize;\n\n\n    metrics = &face->size->metrics;\n    bsize   = face->available_sizes + strike_index;\n\n    metrics->x_ppem = (FT_UShort)( ( bsize->x_ppem + 32 ) >> 6 );\n    metrics->y_ppem = (FT_UShort)( ( bsize->y_ppem + 32 ) >> 6 );\n\n    if ( FT_IS_SCALABLE( face ) )\n    {\n      metrics->x_scale = FT_DivFix( bsize->x_ppem,\n                                    face->units_per_EM );\n      metrics->y_scale = FT_DivFix( bsize->y_ppem,\n                                    face->units_per_EM );\n\n      ft_recompute_scaled_metrics( face, metrics );\n    }\n    else\n    {\n      metrics->x_scale     = 1L << 16;\n      metrics->y_scale     = 1L << 16;\n      metrics->ascender    = bsize->y_ppem;\n      metrics->descender   = 0;\n      metrics->height      = bsize->height << 6;\n      metrics->max_advance = bsize->x_ppem;\n    }\n\n    FT_TRACE5(( \"FT_Select_Metrics:\\n\" ));\n    FT_TRACE5(( \"  x scale: %d (%f)\\n\",\n                metrics->x_scale, metrics->x_scale / 65536.0 ));\n    FT_TRACE5(( \"  y scale: %d (%f)\\n\",\n                metrics->y_scale, metrics->y_scale / 65536.0 ));\n    FT_TRACE5(( \"  ascender: %f\\n\",    metrics->ascender / 64.0 ));\n    FT_TRACE5(( \"  descender: %f\\n\",   metrics->descender / 64.0 ));\n    FT_TRACE5(( \"  height: %f\\n\",      metrics->height / 64.0 ));\n    FT_TRACE5(( \"  max advance: %f\\n\", metrics->max_advance / 64.0 ));\n    FT_TRACE5(( \"  x ppem: %d\\n\",      metrics->x_ppem ));\n    FT_TRACE5(( \"  y ppem: %d\\n\",      metrics->y_ppem ));\n  }\n\n\n  FT_BASE_DEF( void )\n  FT_Request_Metrics( FT_Face          face,\n                      FT_Size_Request  req )\n  {\n    FT_Size_Metrics*  metrics;\n\n\n    metrics = &face->size->metrics;\n\n    if ( FT_IS_SCALABLE( face ) )\n    {\n      FT_Long  w = 0, h = 0, scaled_w = 0, scaled_h = 0;\n\n\n      switch ( req->type )\n      {\n      case FT_SIZE_REQUEST_TYPE_NOMINAL:\n        w = h = face->units_per_EM;\n        break;\n\n      case FT_SIZE_REQUEST_TYPE_REAL_DIM:\n        w = h = face->ascender - face->descender;\n        break;\n\n      case FT_SIZE_REQUEST_TYPE_BBOX:\n        w = face->bbox.xMax - face->bbox.xMin;\n        h = face->bbox.yMax - face->bbox.yMin;\n        break;\n\n      case FT_SIZE_REQUEST_TYPE_CELL:\n        w = face->max_advance_width;\n        h = face->ascender - face->descender;\n        break;\n\n      case FT_SIZE_REQUEST_TYPE_SCALES:\n        metrics->x_scale = (FT_Fixed)req->width;\n        metrics->y_scale = (FT_Fixed)req->height;\n        if ( !metrics->x_scale )\n          metrics->x_scale = metrics->y_scale;\n        else if ( !metrics->y_scale )\n          metrics->y_scale = metrics->x_scale;\n        goto Calculate_Ppem;\n\n      case FT_SIZE_REQUEST_TYPE_MAX:\n        break;\n      }\n\n      /* to be on the safe side */\n      if ( w < 0 )\n        w = -w;\n\n      if ( h < 0 )\n        h = -h;\n\n      scaled_w = FT_REQUEST_WIDTH ( req );\n      scaled_h = FT_REQUEST_HEIGHT( req );\n\n      /* determine scales */\n      if ( req->width )\n      {\n        metrics->x_scale = FT_DivFix( scaled_w, w );\n\n        if ( req->height )\n        {\n          metrics->y_scale = FT_DivFix( scaled_h, h );\n\n          if ( req->type == FT_SIZE_REQUEST_TYPE_CELL )\n          {\n            if ( metrics->y_scale > metrics->x_scale )\n              metrics->y_scale = metrics->x_scale;\n            else\n              metrics->x_scale = metrics->y_scale;\n          }\n        }\n        else\n        {\n          metrics->y_scale = metrics->x_scale;\n          scaled_h = FT_MulDiv( scaled_w, h, w );\n        }\n      }\n      else\n      {\n        metrics->x_scale = metrics->y_scale = FT_DivFix( scaled_h, h );\n        scaled_w = FT_MulDiv( scaled_h, w, h );\n      }\n\n  Calculate_Ppem:\n      /* calculate the ppems */\n      if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL )\n      {\n        scaled_w = FT_MulFix( face->units_per_EM, metrics->x_scale );\n        scaled_h = FT_MulFix( face->units_per_EM, metrics->y_scale );\n      }\n\n      metrics->x_ppem = (FT_UShort)( ( scaled_w + 32 ) >> 6 );\n      metrics->y_ppem = (FT_UShort)( ( scaled_h + 32 ) >> 6 );\n\n      ft_recompute_scaled_metrics( face, metrics );\n    }\n    else\n    {\n      FT_ZERO( metrics );\n      metrics->x_scale = 1L << 16;\n      metrics->y_scale = 1L << 16;\n    }\n\n    FT_TRACE5(( \"FT_Request_Metrics:\\n\" ));\n    FT_TRACE5(( \"  x scale: %d (%f)\\n\",\n                metrics->x_scale, metrics->x_scale / 65536.0 ));\n    FT_TRACE5(( \"  y scale: %d (%f)\\n\",\n                metrics->y_scale, metrics->y_scale / 65536.0 ));\n    FT_TRACE5(( \"  ascender: %f\\n\",    metrics->ascender / 64.0 ));\n    FT_TRACE5(( \"  descender: %f\\n\",   metrics->descender / 64.0 ));\n    FT_TRACE5(( \"  height: %f\\n\",      metrics->height / 64.0 ));\n    FT_TRACE5(( \"  max advance: %f\\n\", metrics->max_advance / 64.0 ));\n    FT_TRACE5(( \"  x ppem: %d\\n\",      metrics->x_ppem ));\n    FT_TRACE5(( \"  y ppem: %d\\n\",      metrics->y_ppem ));\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Select_Size( FT_Face  face,\n                  FT_Int   strike_index )\n  {\n    FT_Driver_Class  clazz;\n\n\n    if ( !face || !FT_HAS_FIXED_SIZES( face ) )\n      return FT_THROW( Invalid_Face_Handle );\n\n    if ( strike_index < 0 || strike_index >= face->num_fixed_sizes )\n      return FT_THROW( Invalid_Argument );\n\n    clazz = face->driver->clazz;\n\n    if ( clazz->select_size )\n    {\n      FT_Error  error;\n\n\n      error = clazz->select_size( face->size, (FT_ULong)strike_index );\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n      {\n        FT_Size_Metrics*  metrics = &face->size->metrics;\n\n\n        FT_TRACE5(( \"FT_Select_Size (font driver's `select_size'):\\n\" ));\n        FT_TRACE5(( \"  x scale: %d (%f)\\n\",\n                    metrics->x_scale, metrics->x_scale / 65536.0 ));\n        FT_TRACE5(( \"  y scale: %d (%f)\\n\",\n                    metrics->y_scale, metrics->y_scale / 65536.0 ));\n        FT_TRACE5(( \"  ascender: %f\\n\",    metrics->ascender / 64.0 ));\n        FT_TRACE5(( \"  descender: %f\\n\",   metrics->descender / 64.0 ));\n        FT_TRACE5(( \"  height: %f\\n\",      metrics->height / 64.0 ));\n        FT_TRACE5(( \"  max advance: %f\\n\", metrics->max_advance / 64.0 ));\n        FT_TRACE5(( \"  x ppem: %d\\n\",      metrics->x_ppem ));\n        FT_TRACE5(( \"  y ppem: %d\\n\",      metrics->y_ppem ));\n      }\n#endif\n\n      return error;\n    }\n\n    FT_Select_Metrics( face, (FT_ULong)strike_index );\n\n    return FT_Err_Ok;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Request_Size( FT_Face          face,\n                   FT_Size_Request  req )\n  {\n    FT_Driver_Class  clazz;\n    FT_ULong         strike_index;\n\n\n    if ( !face )\n      return FT_THROW( Invalid_Face_Handle );\n\n    if ( !req || req->width < 0 || req->height < 0 ||\n         req->type >= FT_SIZE_REQUEST_TYPE_MAX )\n      return FT_THROW( Invalid_Argument );\n\n    clazz = face->driver->clazz;\n\n    if ( clazz->request_size )\n    {\n      FT_Error  error;\n\n\n      error = clazz->request_size( face->size, req );\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n      {\n        FT_Size_Metrics*  metrics = &face->size->metrics;\n\n\n        FT_TRACE5(( \"FT_Request_Size (font driver's `request_size'):\\n\" ));\n        FT_TRACE5(( \"  x scale: %d (%f)\\n\",\n                    metrics->x_scale, metrics->x_scale / 65536.0 ));\n        FT_TRACE5(( \"  y scale: %d (%f)\\n\",\n                    metrics->y_scale, metrics->y_scale / 65536.0 ));\n        FT_TRACE5(( \"  ascender: %f\\n\",    metrics->ascender / 64.0 ));\n        FT_TRACE5(( \"  descender: %f\\n\",   metrics->descender / 64.0 ));\n        FT_TRACE5(( \"  height: %f\\n\",      metrics->height / 64.0 ));\n        FT_TRACE5(( \"  max advance: %f\\n\", metrics->max_advance / 64.0 ));\n        FT_TRACE5(( \"  x ppem: %d\\n\",      metrics->x_ppem ));\n        FT_TRACE5(( \"  y ppem: %d\\n\",      metrics->y_ppem ));\n      }\n#endif\n\n      return error;\n    }\n\n    /*\n     * The reason that a driver doesn't have `request_size' defined is\n     * either that the scaling here suffices or that the supported formats\n     * are bitmap-only and size matching is not implemented.\n     *\n     * In the latter case, a simple size matching is done.\n     */\n    if ( !FT_IS_SCALABLE( face ) && FT_HAS_FIXED_SIZES( face ) )\n    {\n      FT_Error  error;\n\n\n      error = FT_Match_Size( face, req, 0, &strike_index );\n      if ( error )\n        return error;\n\n      return FT_Select_Size( face, (FT_Int)strike_index );\n    }\n\n    FT_Request_Metrics( face, req );\n\n    return FT_Err_Ok;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Set_Char_Size( FT_Face     face,\n                    FT_F26Dot6  char_width,\n                    FT_F26Dot6  char_height,\n                    FT_UInt     horz_resolution,\n                    FT_UInt     vert_resolution )\n  {\n    FT_Size_RequestRec  req;\n\n\n    if ( !char_width )\n      char_width = char_height;\n    else if ( !char_height )\n      char_height = char_width;\n\n    if ( !horz_resolution )\n      horz_resolution = vert_resolution;\n    else if ( !vert_resolution )\n      vert_resolution = horz_resolution;\n\n    if ( char_width  < 1 * 64 )\n      char_width  = 1 * 64;\n    if ( char_height < 1 * 64 )\n      char_height = 1 * 64;\n\n    if ( !horz_resolution )\n      horz_resolution = vert_resolution = 72;\n\n    req.type           = FT_SIZE_REQUEST_TYPE_NOMINAL;\n    req.width          = char_width;\n    req.height         = char_height;\n    req.horiResolution = horz_resolution;\n    req.vertResolution = vert_resolution;\n\n    return FT_Request_Size( face, &req );\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Set_Pixel_Sizes( FT_Face  face,\n                      FT_UInt  pixel_width,\n                      FT_UInt  pixel_height )\n  {\n    FT_Size_RequestRec  req;\n\n\n    if ( pixel_width == 0 )\n      pixel_width = pixel_height;\n    else if ( pixel_height == 0 )\n      pixel_height = pixel_width;\n\n    if ( pixel_width  < 1 )\n      pixel_width  = 1;\n    if ( pixel_height < 1 )\n      pixel_height = 1;\n\n    /* use `>=' to avoid potential compiler warning on 16bit platforms */\n    if ( pixel_width  >= 0xFFFFU )\n      pixel_width  = 0xFFFFU;\n    if ( pixel_height >= 0xFFFFU )\n      pixel_height = 0xFFFFU;\n\n    req.type           = FT_SIZE_REQUEST_TYPE_NOMINAL;\n    req.width          = pixel_width << 6;\n    req.height         = pixel_height << 6;\n    req.horiResolution = 0;\n    req.vertResolution = 0;\n\n    return FT_Request_Size( face, &req );\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_Kerning( FT_Face     face,\n                  FT_UInt     left_glyph,\n                  FT_UInt     right_glyph,\n                  FT_UInt     kern_mode,\n                  FT_Vector  *akerning )\n  {\n    FT_Error   error = FT_Err_Ok;\n    FT_Driver  driver;\n\n\n    if ( !face )\n      return FT_THROW( Invalid_Face_Handle );\n\n    if ( !akerning )\n      return FT_THROW( Invalid_Argument );\n\n    driver = face->driver;\n\n    akerning->x = 0;\n    akerning->y = 0;\n\n    if ( driver->clazz->get_kerning )\n    {\n      error = driver->clazz->get_kerning( face,\n                                          left_glyph,\n                                          right_glyph,\n                                          akerning );\n      if ( !error )\n      {\n        if ( kern_mode != FT_KERNING_UNSCALED )\n        {\n          akerning->x = FT_MulFix( akerning->x, face->size->metrics.x_scale );\n          akerning->y = FT_MulFix( akerning->y, face->size->metrics.y_scale );\n\n          if ( kern_mode != FT_KERNING_UNFITTED )\n          {\n            /* we scale down kerning values for small ppem values */\n            /* to avoid that rounding makes them too big.         */\n            /* `25' has been determined heuristically.            */\n            if ( face->size->metrics.x_ppem < 25 )\n              akerning->x = FT_MulDiv( akerning->x,\n                                       face->size->metrics.x_ppem, 25 );\n            if ( face->size->metrics.y_ppem < 25 )\n              akerning->y = FT_MulDiv( akerning->y,\n                                       face->size->metrics.y_ppem, 25 );\n\n            akerning->x = FT_PIX_ROUND( akerning->x );\n            akerning->y = FT_PIX_ROUND( akerning->y );\n          }\n        }\n      }\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_Track_Kerning( FT_Face    face,\n                        FT_Fixed   point_size,\n                        FT_Int     degree,\n                        FT_Fixed*  akerning )\n  {\n    FT_Service_Kerning  service;\n    FT_Error            error = FT_Err_Ok;\n\n\n    if ( !face )\n      return FT_THROW( Invalid_Face_Handle );\n\n    if ( !akerning )\n      return FT_THROW( Invalid_Argument );\n\n    FT_FACE_FIND_SERVICE( face, service, KERNING );\n    if ( !service )\n      return FT_THROW( Unimplemented_Feature );\n\n    error = service->get_track( face,\n                                point_size,\n                                degree,\n                                akerning );\n\n    return error;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Select_Charmap( FT_Face      face,\n                     FT_Encoding  encoding )\n  {\n    FT_CharMap*  cur;\n    FT_CharMap*  limit;\n\n\n    if ( !face )\n      return FT_THROW( Invalid_Face_Handle );\n\n    if ( encoding == FT_ENCODING_NONE )\n      return FT_THROW( Invalid_Argument );\n\n    /* FT_ENCODING_UNICODE is special.  We try to find the `best' Unicode */\n    /* charmap available, i.e., one with UCS-4 characters, if possible.   */\n    /*                                                                    */\n    /* This is done by find_unicode_charmap() above, to share code.       */\n    if ( encoding == FT_ENCODING_UNICODE )\n      return find_unicode_charmap( face );\n\n    cur = face->charmaps;\n    if ( !cur )\n      return FT_THROW( Invalid_CharMap_Handle );\n\n    limit = cur + face->num_charmaps;\n\n    for ( ; cur < limit; cur++ )\n    {\n      if ( cur[0]->encoding == encoding )\n      {\n#ifdef FT_MAX_CHARMAP_CACHEABLE\n        if ( cur - face->charmaps > FT_MAX_CHARMAP_CACHEABLE )\n        {\n          FT_ERROR(( \"FT_Select_Charmap: requested charmap is found (%d), \"\n                     \"but in too late position to cache\\n\",\n                     cur - face->charmaps ));\n          continue;\n        }\n#endif\n        face->charmap = cur[0];\n        return 0;\n      }\n    }\n\n    return FT_THROW( Invalid_Argument );\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Set_Charmap( FT_Face     face,\n                  FT_CharMap  charmap )\n  {\n    FT_CharMap*  cur;\n    FT_CharMap*  limit;\n\n\n    if ( !face )\n      return FT_THROW( Invalid_Face_Handle );\n\n    cur = face->charmaps;\n    if ( !cur )\n      return FT_THROW( Invalid_CharMap_Handle );\n    if ( FT_Get_CMap_Format( charmap ) == 14 )\n      return FT_THROW( Invalid_Argument );\n\n    limit = cur + face->num_charmaps;\n\n    for ( ; cur < limit; cur++ )\n    {\n      if ( cur[0] == charmap )\n      {\n#ifdef FT_MAX_CHARMAP_CACHEABLE\n        if ( cur - face->charmaps > FT_MAX_CHARMAP_CACHEABLE )\n        {\n          FT_ERROR(( \"FT_Set_Charmap: requested charmap is found (%d), \"\n                     \"but in too late position to cache\\n\",\n                     cur - face->charmaps ));\n          continue;\n        }\n#endif\n        face->charmap = cur[0];\n        return 0;\n      }\n    }\n    return FT_THROW( Invalid_Argument );\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Int )\n  FT_Get_Charmap_Index( FT_CharMap  charmap )\n  {\n    FT_Int  i;\n\n\n    if ( !charmap || !charmap->face )\n      return -1;\n\n    for ( i = 0; i < charmap->face->num_charmaps; i++ )\n      if ( charmap->face->charmaps[i] == charmap )\n        break;\n\n    FT_ASSERT( i < charmap->face->num_charmaps );\n\n#ifdef FT_MAX_CHARMAP_CACHEABLE\n    if ( i > FT_MAX_CHARMAP_CACHEABLE )\n    {\n      FT_ERROR(( \"FT_Get_Charmap_Index: requested charmap is found (%d), \"\n                 \"but in too late position to cache\\n\",\n                 i ));\n      return -i;\n    }\n#endif\n    return i;\n  }\n\n\n  static void\n  ft_cmap_done_internal( FT_CMap  cmap )\n  {\n    FT_CMap_Class  clazz  = cmap->clazz;\n    FT_Face        face   = cmap->charmap.face;\n    FT_Memory      memory = FT_FACE_MEMORY( face );\n\n\n    if ( clazz->done )\n      clazz->done( cmap );\n\n    FT_FREE( cmap );\n  }\n\n\n  FT_BASE_DEF( void )\n  FT_CMap_Done( FT_CMap  cmap )\n  {\n    if ( cmap )\n    {\n      FT_Face    face   = cmap->charmap.face;\n      FT_Memory  memory = FT_FACE_MEMORY( face );\n      FT_Error   error;\n      FT_Int     i, j;\n\n\n      for ( i = 0; i < face->num_charmaps; i++ )\n      {\n        if ( (FT_CMap)face->charmaps[i] == cmap )\n        {\n          FT_CharMap  last_charmap = face->charmaps[face->num_charmaps - 1];\n\n\n          if ( FT_RENEW_ARRAY( face->charmaps,\n                               face->num_charmaps,\n                               face->num_charmaps - 1 ) )\n            return;\n\n          /* remove it from our list of charmaps */\n          for ( j = i + 1; j < face->num_charmaps; j++ )\n          {\n            if ( j == face->num_charmaps - 1 )\n              face->charmaps[j - 1] = last_charmap;\n            else\n              face->charmaps[j - 1] = face->charmaps[j];\n          }\n\n          face->num_charmaps--;\n\n          if ( (FT_CMap)face->charmap == cmap )\n            face->charmap = NULL;\n\n          ft_cmap_done_internal( cmap );\n\n          break;\n        }\n      }\n    }\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_CMap_New( FT_CMap_Class  clazz,\n               FT_Pointer     init_data,\n               FT_CharMap     charmap,\n               FT_CMap       *acmap )\n  {\n    FT_Error   error = FT_Err_Ok;\n    FT_Face    face;\n    FT_Memory  memory;\n    FT_CMap    cmap = NULL;\n\n\n    if ( clazz == NULL || charmap == NULL || charmap->face == NULL )\n      return FT_THROW( Invalid_Argument );\n\n    face   = charmap->face;\n    memory = FT_FACE_MEMORY( face );\n\n    if ( !FT_ALLOC( cmap, clazz->size ) )\n    {\n      cmap->charmap = *charmap;\n      cmap->clazz   = clazz;\n\n      if ( clazz->init )\n      {\n        error = clazz->init( cmap, init_data );\n        if ( error )\n          goto Fail;\n      }\n\n      /* add it to our list of charmaps */\n      if ( FT_RENEW_ARRAY( face->charmaps,\n                           face->num_charmaps,\n                           face->num_charmaps + 1 ) )\n        goto Fail;\n\n      face->charmaps[face->num_charmaps++] = (FT_CharMap)cmap;\n    }\n\n  Exit:\n    if ( acmap )\n      *acmap = cmap;\n\n    return error;\n\n  Fail:\n    ft_cmap_done_internal( cmap );\n    cmap = NULL;\n    goto Exit;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_UInt )\n  FT_Get_Char_Index( FT_Face   face,\n                     FT_ULong  charcode )\n  {\n    FT_UInt  result = 0;\n\n\n    if ( face && face->charmap )\n    {\n      FT_CMap  cmap = FT_CMAP( face->charmap );\n\n\n      if ( charcode > 0xFFFFFFFFUL )\n      {\n        FT_TRACE1(( \"FT_Get_Char_Index: too large charcode\" ));\n        FT_TRACE1(( \" 0x%x is truncated\\n\", charcode ));\n      }\n      result = cmap->clazz->char_index( cmap, (FT_UInt32)charcode );\n    }\n    return result;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_ULong )\n  FT_Get_First_Char( FT_Face   face,\n                     FT_UInt  *agindex )\n  {\n    FT_ULong  result = 0;\n    FT_UInt   gindex = 0;\n\n\n    if ( face && face->charmap && face->num_glyphs )\n    {\n      gindex = FT_Get_Char_Index( face, 0 );\n      if ( gindex == 0 || gindex >= (FT_UInt)face->num_glyphs )\n        result = FT_Get_Next_Char( face, 0, &gindex );\n    }\n\n    if ( agindex )\n      *agindex = gindex;\n\n    return result;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_ULong )\n  FT_Get_Next_Char( FT_Face   face,\n                    FT_ULong  charcode,\n                    FT_UInt  *agindex )\n  {\n    FT_ULong  result = 0;\n    FT_UInt   gindex = 0;\n\n\n    if ( face && face->charmap && face->num_glyphs )\n    {\n      FT_UInt32  code = (FT_UInt32)charcode;\n      FT_CMap    cmap = FT_CMAP( face->charmap );\n\n\n      do {\n        gindex = cmap->clazz->char_next( cmap, &code );\n      } while ( gindex >= (FT_UInt)face->num_glyphs );\n\n      result = ( gindex == 0 ) ? 0 : code;\n    }\n\n    if ( agindex )\n      *agindex = gindex;\n\n    return result;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_UInt )\n  FT_Face_GetCharVariantIndex( FT_Face   face,\n                               FT_ULong  charcode,\n                               FT_ULong  variantSelector )\n  {\n    FT_UInt  result = 0;\n\n\n    if ( face && face->charmap &&\n        face->charmap->encoding == FT_ENCODING_UNICODE )\n    {\n      FT_CharMap  charmap = find_variant_selector_charmap( face );\n      FT_CMap     ucmap = FT_CMAP( face->charmap );\n\n\n      if ( charmap != NULL )\n      {\n        FT_CMap  vcmap = FT_CMAP( charmap );\n\n\n        if ( charcode > 0xFFFFFFFFUL )\n        {\n          FT_TRACE1(( \"FT_Get_Char_Index: too large charcode\" ));\n          FT_TRACE1(( \" 0x%x is truncated\\n\", charcode ));\n        }\n        if ( variantSelector > 0xFFFFFFFFUL )\n        {\n          FT_TRACE1(( \"FT_Get_Char_Index: too large variantSelector\" ));\n          FT_TRACE1(( \" 0x%x is truncated\\n\", variantSelector ));\n        }\n\n        result = vcmap->clazz->char_var_index( vcmap, ucmap,\n                                               (FT_UInt32)charcode,\n                                               (FT_UInt32)variantSelector );\n      }\n    }\n\n    return result;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Int )\n  FT_Face_GetCharVariantIsDefault( FT_Face   face,\n                                   FT_ULong  charcode,\n                                   FT_ULong  variantSelector )\n  {\n    FT_Int  result = -1;\n\n\n    if ( face )\n    {\n      FT_CharMap  charmap = find_variant_selector_charmap( face );\n\n\n      if ( charmap != NULL )\n      {\n        FT_CMap  vcmap = FT_CMAP( charmap );\n\n\n        if ( charcode > 0xFFFFFFFFUL )\n        {\n          FT_TRACE1(( \"FT_Get_Char_Index: too large charcode\" ));\n          FT_TRACE1(( \" 0x%x is truncated\\n\", charcode ));\n        }\n        if ( variantSelector > 0xFFFFFFFFUL )\n        {\n          FT_TRACE1(( \"FT_Get_Char_Index: too large variantSelector\" ));\n          FT_TRACE1(( \" 0x%x is truncated\\n\", variantSelector ));\n        }\n\n        result = vcmap->clazz->char_var_default( vcmap,\n                                                 (FT_UInt32)charcode,\n                                                 (FT_UInt32)variantSelector );\n      }\n    }\n\n    return result;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_UInt32* )\n  FT_Face_GetVariantSelectors( FT_Face  face )\n  {\n    FT_UInt32  *result = NULL;\n\n\n    if ( face )\n    {\n      FT_CharMap  charmap = find_variant_selector_charmap( face );\n\n\n      if ( charmap != NULL )\n      {\n        FT_CMap    vcmap  = FT_CMAP( charmap );\n        FT_Memory  memory = FT_FACE_MEMORY( face );\n\n\n        result = vcmap->clazz->variant_list( vcmap, memory );\n      }\n    }\n\n    return result;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_UInt32* )\n  FT_Face_GetVariantsOfChar( FT_Face   face,\n                             FT_ULong  charcode )\n  {\n    FT_UInt32  *result = NULL;\n\n\n    if ( face )\n    {\n      FT_CharMap  charmap = find_variant_selector_charmap( face );\n\n\n      if ( charmap != NULL )\n      {\n        FT_CMap    vcmap  = FT_CMAP( charmap );\n        FT_Memory  memory = FT_FACE_MEMORY( face );\n\n\n        if ( charcode > 0xFFFFFFFFUL )\n        {\n          FT_TRACE1(( \"FT_Get_Char_Index: too large charcode\" ));\n          FT_TRACE1(( \" 0x%x is truncated\\n\", charcode ));\n        }\n\n        result = vcmap->clazz->charvariant_list( vcmap, memory,\n                                                 (FT_UInt32)charcode );\n      }\n    }\n    return result;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_UInt32* )\n  FT_Face_GetCharsOfVariant( FT_Face   face,\n                             FT_ULong  variantSelector )\n  {\n    FT_UInt32  *result = NULL;\n\n\n    if ( face )\n    {\n      FT_CharMap  charmap = find_variant_selector_charmap( face );\n\n\n      if ( charmap != NULL )\n      {\n        FT_CMap    vcmap  = FT_CMAP( charmap );\n        FT_Memory  memory = FT_FACE_MEMORY( face );\n\n\n        if ( variantSelector > 0xFFFFFFFFUL )\n        {\n          FT_TRACE1(( \"FT_Get_Char_Index: too large variantSelector\" ));\n          FT_TRACE1(( \" 0x%x is truncated\\n\", variantSelector ));\n        }\n\n        result = vcmap->clazz->variantchar_list( vcmap, memory,\n                                                 (FT_UInt32)variantSelector );\n      }\n    }\n\n    return result;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_UInt )\n  FT_Get_Name_Index( FT_Face     face,\n                     FT_String*  glyph_name )\n  {\n    FT_UInt  result = 0;\n\n\n    if ( face && FT_HAS_GLYPH_NAMES( face ) )\n    {\n      FT_Service_GlyphDict  service;\n\n\n      FT_FACE_LOOKUP_SERVICE( face,\n                              service,\n                              GLYPH_DICT );\n\n      if ( service && service->name_index )\n        result = service->name_index( face, glyph_name );\n    }\n\n    return result;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_Glyph_Name( FT_Face     face,\n                     FT_UInt     glyph_index,\n                     FT_Pointer  buffer,\n                     FT_UInt     buffer_max )\n  {\n    FT_Error  error = FT_ERR( Invalid_Argument );\n\n\n    /* clean up buffer */\n    if ( buffer && buffer_max > 0 )\n      ((FT_Byte*)buffer)[0] = 0;\n\n    if ( face                                     &&\n         (FT_Long)glyph_index <= face->num_glyphs &&\n         FT_HAS_GLYPH_NAMES( face )               )\n    {\n      FT_Service_GlyphDict  service;\n\n\n      FT_FACE_LOOKUP_SERVICE( face,\n                              service,\n                              GLYPH_DICT );\n\n      if ( service && service->get_name )\n        error = service->get_name( face, glyph_index, buffer, buffer_max );\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( const char* )\n  FT_Get_Postscript_Name( FT_Face  face )\n  {\n    const char*  result = NULL;\n\n\n    if ( !face )\n      goto Exit;\n\n    if ( !result )\n    {\n      FT_Service_PsFontName  service;\n\n\n      FT_FACE_LOOKUP_SERVICE( face,\n                              service,\n                              POSTSCRIPT_FONT_NAME );\n\n      if ( service && service->get_ps_font_name )\n        result = service->get_ps_font_name( face );\n    }\n\n  Exit:\n    return result;\n  }\n\n\n  /* documentation is in tttables.h */\n\n  FT_EXPORT_DEF( void* )\n  FT_Get_Sfnt_Table( FT_Face      face,\n                     FT_Sfnt_Tag  tag )\n  {\n    void*                  table = 0;\n    FT_Service_SFNT_Table  service;\n\n\n    if ( face && FT_IS_SFNT( face ) )\n    {\n      FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );\n      if ( service != NULL )\n        table = service->get_table( face, tag );\n    }\n\n    return table;\n  }\n\n\n  /* documentation is in tttables.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Load_Sfnt_Table( FT_Face    face,\n                      FT_ULong   tag,\n                      FT_Long    offset,\n                      FT_Byte*   buffer,\n                      FT_ULong*  length )\n  {\n    FT_Service_SFNT_Table  service;\n\n\n    if ( !face || !FT_IS_SFNT( face ) )\n      return FT_THROW( Invalid_Face_Handle );\n\n    FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );\n    if ( service == NULL )\n      return FT_THROW( Unimplemented_Feature );\n\n    return service->load_table( face, tag, offset, buffer, length );\n  }\n\n\n  /* documentation is in tttables.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Sfnt_Table_Info( FT_Face    face,\n                      FT_UInt    table_index,\n                      FT_ULong  *tag,\n                      FT_ULong  *length )\n  {\n    FT_Service_SFNT_Table  service;\n    FT_ULong               offset;\n\n\n    if ( !face || !FT_IS_SFNT( face ) )\n      return FT_THROW( Invalid_Face_Handle );\n\n    FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );\n    if ( service == NULL )\n      return FT_THROW( Unimplemented_Feature );\n\n    return service->table_info( face, table_index, tag, &offset, length );\n  }\n\n\n  /* documentation is in tttables.h */\n\n  FT_EXPORT_DEF( FT_ULong )\n  FT_Get_CMap_Language_ID( FT_CharMap  charmap )\n  {\n    FT_Service_TTCMaps  service;\n    FT_Face             face;\n    TT_CMapInfo         cmap_info;\n\n\n    if ( !charmap || !charmap->face )\n      return 0;\n\n    face = charmap->face;\n    FT_FACE_FIND_SERVICE( face, service, TT_CMAP );\n    if ( service == NULL )\n      return 0;\n    if ( service->get_cmap_info( charmap, &cmap_info ))\n      return 0;\n\n    return cmap_info.language;\n  }\n\n\n  /* documentation is in tttables.h */\n\n  FT_EXPORT_DEF( FT_Long )\n  FT_Get_CMap_Format( FT_CharMap  charmap )\n  {\n    FT_Service_TTCMaps  service;\n    FT_Face             face;\n    TT_CMapInfo         cmap_info;\n\n\n    if ( !charmap || !charmap->face )\n      return -1;\n\n    face = charmap->face;\n    FT_FACE_FIND_SERVICE( face, service, TT_CMAP );\n    if ( service == NULL )\n      return -1;\n    if ( service->get_cmap_info( charmap, &cmap_info ))\n      return -1;\n\n    return cmap_info.format;\n  }\n\n\n  /* documentation is in ftsizes.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Activate_Size( FT_Size  size )\n  {\n    FT_Face  face;\n\n\n    if ( size == NULL )\n      return FT_THROW( Invalid_Argument );\n\n    face = size->face;\n    if ( face == NULL || face->driver == NULL )\n      return FT_THROW( Invalid_Argument );\n\n    /* we don't need anything more complex than that; all size objects */\n    /* are already listed by the face                                  */\n    face->size = size;\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                        R E N D E R E R S                        ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* lookup a renderer by glyph format in the library's list */\n  FT_BASE_DEF( FT_Renderer )\n  FT_Lookup_Renderer( FT_Library       library,\n                      FT_Glyph_Format  format,\n                      FT_ListNode*     node )\n  {\n    FT_ListNode  cur;\n    FT_Renderer  result = 0;\n\n\n    if ( !library )\n      goto Exit;\n\n    cur = library->renderers.head;\n\n    if ( node )\n    {\n      if ( *node )\n        cur = (*node)->next;\n      *node = 0;\n    }\n\n    while ( cur )\n    {\n      FT_Renderer  renderer = FT_RENDERER( cur->data );\n\n\n      if ( renderer->glyph_format == format )\n      {\n        if ( node )\n          *node = cur;\n\n        result = renderer;\n        break;\n      }\n      cur = cur->next;\n    }\n\n  Exit:\n    return result;\n  }\n\n\n  static FT_Renderer\n  ft_lookup_glyph_renderer( FT_GlyphSlot  slot )\n  {\n    FT_Face      face    = slot->face;\n    FT_Library   library = FT_FACE_LIBRARY( face );\n    FT_Renderer  result  = library->cur_renderer;\n\n\n    if ( !result || result->glyph_format != slot->format )\n      result = FT_Lookup_Renderer( library, slot->format, 0 );\n\n    return result;\n  }\n\n\n  static void\n  ft_set_current_renderer( FT_Library  library )\n  {\n    FT_Renderer  renderer;\n\n\n    renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE, 0 );\n    library->cur_renderer = renderer;\n  }\n\n\n  static FT_Error\n  ft_add_renderer( FT_Module  module )\n  {\n    FT_Library   library = module->library;\n    FT_Memory    memory  = library->memory;\n    FT_Error     error;\n    FT_ListNode  node    = NULL;\n\n\n    if ( FT_NEW( node ) )\n      goto Exit;\n\n    {\n      FT_Renderer         render = FT_RENDERER( module );\n      FT_Renderer_Class*  clazz  = (FT_Renderer_Class*)module->clazz;\n\n\n      render->clazz        = clazz;\n      render->glyph_format = clazz->glyph_format;\n\n      /* allocate raster object if needed */\n      if ( clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE &&\n           clazz->raster_class->raster_new                )\n      {\n        error = clazz->raster_class->raster_new( memory, &render->raster );\n        if ( error )\n          goto Fail;\n\n        render->raster_render = clazz->raster_class->raster_render;\n        render->render        = clazz->render_glyph;\n      }\n\n      /* add to list */\n      node->data = module;\n      FT_List_Add( &library->renderers, node );\n\n      ft_set_current_renderer( library );\n    }\n\n  Fail:\n    if ( error )\n      FT_FREE( node );\n\n  Exit:\n    return error;\n  }\n\n\n  static void\n  ft_remove_renderer( FT_Module  module )\n  {\n    FT_Library   library = module->library;\n    FT_Memory    memory  = library->memory;\n    FT_ListNode  node;\n\n\n    node = FT_List_Find( &library->renderers, module );\n    if ( node )\n    {\n      FT_Renderer  render = FT_RENDERER( module );\n\n\n      /* release raster object, if any */\n      if ( render->clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE &&\n           render->raster                                         )\n        render->clazz->raster_class->raster_done( render->raster );\n\n      /* remove from list */\n      FT_List_Remove( &library->renderers, node );\n      FT_FREE( node );\n\n      ft_set_current_renderer( library );\n    }\n  }\n\n\n  /* documentation is in ftrender.h */\n\n  FT_EXPORT_DEF( FT_Renderer )\n  FT_Get_Renderer( FT_Library       library,\n                   FT_Glyph_Format  format )\n  {\n    /* test for valid `library' delayed to FT_Lookup_Renderer() */\n\n    return FT_Lookup_Renderer( library, format, 0 );\n  }\n\n\n  /* documentation is in ftrender.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Set_Renderer( FT_Library     library,\n                   FT_Renderer    renderer,\n                   FT_UInt        num_params,\n                   FT_Parameter*  parameters )\n  {\n    FT_ListNode  node;\n    FT_Error     error = FT_Err_Ok;\n\n\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    if ( !renderer )\n      return FT_THROW( Invalid_Argument );\n\n    node = FT_List_Find( &library->renderers, renderer );\n    if ( !node )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    FT_List_Up( &library->renderers, node );\n\n    if ( renderer->glyph_format == FT_GLYPH_FORMAT_OUTLINE )\n      library->cur_renderer = renderer;\n\n    if ( num_params > 0 )\n    {\n      FT_Renderer_SetModeFunc  set_mode = renderer->clazz->set_mode;\n\n\n      for ( ; num_params > 0; num_params-- )\n      {\n        error = set_mode( renderer, parameters->tag, parameters->data );\n        if ( error )\n          break;\n        parameters++;\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Render_Glyph_Internal( FT_Library      library,\n                            FT_GlyphSlot    slot,\n                            FT_Render_Mode  render_mode )\n  {\n    FT_Error     error = FT_Err_Ok;\n    FT_Renderer  renderer;\n\n\n    /* if it is already a bitmap, no need to do anything */\n    switch ( slot->format )\n    {\n    case FT_GLYPH_FORMAT_BITMAP:   /* already a bitmap, don't do anything */\n      break;\n\n    default:\n      {\n        FT_ListNode  node   = 0;\n        FT_Bool      update = 0;\n\n\n        /* small shortcut for the very common case */\n        if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )\n        {\n          renderer = library->cur_renderer;\n          node     = library->renderers.head;\n        }\n        else\n          renderer = FT_Lookup_Renderer( library, slot->format, &node );\n\n        error = FT_ERR( Unimplemented_Feature );\n        while ( renderer )\n        {\n          error = renderer->render( renderer, slot, render_mode, NULL );\n          if ( !error                                   ||\n               FT_ERR_NEQ( error, Cannot_Render_Glyph ) )\n            break;\n\n          /* FT_Err_Cannot_Render_Glyph is returned if the render mode   */\n          /* is unsupported by the current renderer for this glyph image */\n          /* format.                                                     */\n\n          /* now, look for another renderer that supports the same */\n          /* format.                                               */\n          renderer = FT_Lookup_Renderer( library, slot->format, &node );\n          update   = 1;\n        }\n\n        /* if we changed the current renderer for the glyph image format */\n        /* we need to select it as the next current one                  */\n        if ( !error && update && renderer )\n          FT_Set_Renderer( library, renderer, 0, 0 );\n      }\n    }\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_bitmap\n\n    /* we convert to a single bitmap format for computing the checksum */\n    {\n      FT_Bitmap  bitmap;\n      FT_Error   err;\n\n\n      FT_Bitmap_New( &bitmap );\n\n      err = FT_Bitmap_Convert( library, &slot->bitmap, &bitmap, 1 );\n      if ( !err )\n      {\n        MD5_CTX        ctx;\n        unsigned char  md5[16];\n        int            i;\n\n\n        MD5_Init( &ctx);\n        MD5_Update( &ctx, bitmap.buffer, bitmap.rows * bitmap.pitch );\n        MD5_Final( md5, &ctx );\n\n        FT_TRACE3(( \"MD5 checksum for %dx%d bitmap:\\n\"\n                    \"  \",\n                    bitmap.rows, bitmap.pitch ));\n        for ( i = 0; i < 16; i++ )\n          FT_TRACE3(( \"%02X\", md5[i] ));\n        FT_TRACE3(( \"\\n\" ));\n      }\n\n      FT_Bitmap_Done( library, &bitmap );\n    }\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_objs\n\n#endif /* FT_DEBUG_LEVEL_TRACE */\n\n    return error;\n  }\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Render_Glyph( FT_GlyphSlot    slot,\n                   FT_Render_Mode  render_mode )\n  {\n    FT_Library  library;\n\n    if ( !slot || !slot->face )\n      return FT_THROW( Invalid_Argument );\n\n    library = FT_FACE_LIBRARY( slot->face );\n\n    return FT_Render_Glyph_Internal( library, slot, render_mode );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                         M O D U L E S                           ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Destroy_Module                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Destroys a given module object.  For drivers, this also destroys   */\n  /*    all child faces.                                                   */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    module :: A handle to the target driver object.                    */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The driver _must_ be LOCKED!                                       */\n  /*                                                                       */\n  static void\n  Destroy_Module( FT_Module  module )\n  {\n    FT_Memory         memory  = module->memory;\n    FT_Module_Class*  clazz   = module->clazz;\n    FT_Library        library = module->library;\n\n\n    if ( library && library->auto_hinter == module )\n      library->auto_hinter = 0;\n\n    /* if the module is a renderer */\n    if ( FT_MODULE_IS_RENDERER( module ) )\n      ft_remove_renderer( module );\n\n    /* if the module is a font driver, add some steps */\n    if ( FT_MODULE_IS_DRIVER( module ) )\n      Destroy_Driver( FT_DRIVER( module ) );\n\n    /* finalize the module object */\n    if ( clazz->module_done )\n      clazz->module_done( module );\n\n    /* discard it */\n    FT_FREE( module );\n  }\n\n\n  /* documentation is in ftmodapi.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Add_Module( FT_Library              library,\n                 const FT_Module_Class*  clazz )\n  {\n    FT_Error   error;\n    FT_Memory  memory;\n    FT_Module  module;\n    FT_UInt    nn;\n\n\n#define FREETYPE_VER_FIXED  ( ( (FT_Long)FREETYPE_MAJOR << 16 ) | \\\n                                FREETYPE_MINOR                  )\n\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    if ( !clazz )\n      return FT_THROW( Invalid_Argument );\n\n    /* check freetype version */\n    if ( clazz->module_requires > FREETYPE_VER_FIXED )\n      return FT_THROW( Invalid_Version );\n\n    /* look for a module with the same name in the library's table */\n    for ( nn = 0; nn < library->num_modules; nn++ )\n    {\n      module = library->modules[nn];\n      if ( ft_strcmp( module->clazz->module_name, clazz->module_name ) == 0 )\n      {\n        /* this installed module has the same name, compare their versions */\n        if ( clazz->module_version <= module->clazz->module_version )\n          return FT_THROW( Lower_Module_Version );\n\n        /* remove the module from our list, then exit the loop to replace */\n        /* it by our new version..                                        */\n        FT_Remove_Module( library, module );\n        break;\n      }\n    }\n\n    memory = library->memory;\n    error  = FT_Err_Ok;\n\n    if ( library->num_modules >= FT_MAX_MODULES )\n    {\n      error = FT_THROW( Too_Many_Drivers );\n      goto Exit;\n    }\n\n    /* allocate module object */\n    if ( FT_ALLOC( module, clazz->module_size ) )\n      goto Exit;\n\n    /* base initialization */\n    module->library = library;\n    module->memory  = memory;\n    module->clazz   = (FT_Module_Class*)clazz;\n\n    /* check whether the module is a renderer - this must be performed */\n    /* before the normal module initialization                         */\n    if ( FT_MODULE_IS_RENDERER( module ) )\n    {\n      /* add to the renderers list */\n      error = ft_add_renderer( module );\n      if ( error )\n        goto Fail;\n    }\n\n    /* is the module a auto-hinter? */\n    if ( FT_MODULE_IS_HINTER( module ) )\n      library->auto_hinter = module;\n\n    /* if the module is a font driver */\n    if ( FT_MODULE_IS_DRIVER( module ) )\n    {\n      /* allocate glyph loader if needed */\n      FT_Driver  driver = FT_DRIVER( module );\n\n\n      driver->clazz = (FT_Driver_Class)module->clazz;\n      if ( FT_DRIVER_USES_OUTLINES( driver ) )\n      {\n        error = FT_GlyphLoader_New( memory, &driver->glyph_loader );\n        if ( error )\n          goto Fail;\n      }\n    }\n\n    if ( clazz->module_init )\n    {\n      error = clazz->module_init( module );\n      if ( error )\n        goto Fail;\n    }\n\n    /* add module to the library's table */\n    library->modules[library->num_modules++] = module;\n\n  Exit:\n    return error;\n\n  Fail:\n    if ( FT_MODULE_IS_DRIVER( module ) )\n    {\n      FT_Driver  driver = FT_DRIVER( module );\n\n\n      if ( FT_DRIVER_USES_OUTLINES( driver ) )\n        FT_GlyphLoader_Done( driver->glyph_loader );\n    }\n\n    if ( FT_MODULE_IS_RENDERER( module ) )\n    {\n      FT_Renderer  renderer = FT_RENDERER( module );\n\n\n      if ( renderer->clazz                                          &&\n           renderer->clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE &&\n           renderer->raster                                         )\n        renderer->clazz->raster_class->raster_done( renderer->raster );\n    }\n\n    FT_FREE( module );\n    goto Exit;\n  }\n\n\n  /* documentation is in ftmodapi.h */\n\n  FT_EXPORT_DEF( FT_Module )\n  FT_Get_Module( FT_Library   library,\n                 const char*  module_name )\n  {\n    FT_Module   result = 0;\n    FT_Module*  cur;\n    FT_Module*  limit;\n\n\n    if ( !library || !module_name )\n      return result;\n\n    cur   = library->modules;\n    limit = cur + library->num_modules;\n\n    for ( ; cur < limit; cur++ )\n      if ( ft_strcmp( cur[0]->clazz->module_name, module_name ) == 0 )\n      {\n        result = cur[0];\n        break;\n      }\n\n    return result;\n  }\n\n\n  /* documentation is in ftobjs.h */\n\n  FT_BASE_DEF( const void* )\n  FT_Get_Module_Interface( FT_Library   library,\n                           const char*  mod_name )\n  {\n    FT_Module  module;\n\n\n    /* test for valid `library' delayed to FT_Get_Module() */\n\n    module = FT_Get_Module( library, mod_name );\n\n    return module ? module->clazz->module_interface : 0;\n  }\n\n\n  FT_BASE_DEF( FT_Pointer )\n  ft_module_get_service( FT_Module    module,\n                         const char*  service_id )\n  {\n    FT_Pointer  result = NULL;\n\n\n    if ( module )\n    {\n      FT_ASSERT( module->clazz && module->clazz->get_interface );\n\n      /* first, look for the service in the module */\n      if ( module->clazz->get_interface )\n        result = module->clazz->get_interface( module, service_id );\n\n      if ( result == NULL )\n      {\n        /* we didn't find it, look in all other modules then */\n        FT_Library  library = module->library;\n        FT_Module*  cur     = library->modules;\n        FT_Module*  limit   = cur + library->num_modules;\n\n\n        for ( ; cur < limit; cur++ )\n        {\n          if ( cur[0] != module )\n          {\n            FT_ASSERT( cur[0]->clazz );\n\n            if ( cur[0]->clazz->get_interface )\n            {\n              result = cur[0]->clazz->get_interface( cur[0], service_id );\n              if ( result != NULL )\n                break;\n            }\n          }\n        }\n      }\n    }\n\n    return result;\n  }\n\n\n  /* documentation is in ftmodapi.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Remove_Module( FT_Library  library,\n                    FT_Module   module )\n  {\n    /* try to find the module from the table, then remove it from there */\n\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    if ( module )\n    {\n      FT_Module*  cur   = library->modules;\n      FT_Module*  limit = cur + library->num_modules;\n\n\n      for ( ; cur < limit; cur++ )\n      {\n        if ( cur[0] == module )\n        {\n          /* remove it from the table */\n          library->num_modules--;\n          limit--;\n          while ( cur < limit )\n          {\n            cur[0] = cur[1];\n            cur++;\n          }\n          limit[0] = 0;\n\n          /* destroy the module */\n          Destroy_Module( module );\n\n          return FT_Err_Ok;\n        }\n      }\n    }\n    return FT_THROW( Invalid_Driver_Handle );\n  }\n\n\n  FT_Error\n  ft_property_do( FT_Library        library,\n                  const FT_String*  module_name,\n                  const FT_String*  property_name,\n                  void*             value,\n                  FT_Bool           set )\n  {\n    FT_Module*           cur;\n    FT_Module*           limit;\n    FT_Module_Interface  interface1;\n    FT_Service_Properties  service;\n\n#ifdef FT_DEBUG_LEVEL_ERROR\n    const FT_String*  set_name  = \"FT_Property_Set\";\n    const FT_String*  get_name  = \"FT_Property_Get\";\n    const FT_String*  func_name = set ? set_name : get_name;\n#endif\n\n    FT_Bool  missing_func;\n\n\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    if ( !module_name || !property_name || !value )\n      return FT_THROW( Invalid_Argument );\n\n    cur   = library->modules;\n    limit = cur + library->num_modules;\n\n    /* search module */\n    for ( ; cur < limit; cur++ )\n      if ( !ft_strcmp( cur[0]->clazz->module_name, module_name ) )\n        break;\n\n    if ( cur == limit )\n    {\n      FT_ERROR(( \"%s: can't find module `%s'\\n\",\n                 func_name, module_name ));\n      return FT_THROW( Missing_Module );\n    }\n\n    /* check whether we have a service interface */\n    if ( !cur[0]->clazz->get_interface )\n    {\n      FT_ERROR(( \"%s: module `%s' doesn't support properties\\n\",\n                 func_name, module_name ));\n      return FT_THROW( Unimplemented_Feature );\n    }\n\n    /* search property service */\n    interface1 = cur[0]->clazz->get_interface( cur[0],\n                                              FT_SERVICE_ID_PROPERTIES );\n    if ( !interface1 )\n    {\n      FT_ERROR(( \"%s: module `%s' doesn't support properties\\n\",\n                 func_name, module_name ));\n      return FT_THROW( Unimplemented_Feature );\n    }\n\n    service = (FT_Service_Properties)interface1;\n\n    if ( set )\n      missing_func = (FT_Bool)( !service->set_property );\n    else\n      missing_func = (FT_Bool)( !service->get_property );\n\n    if ( missing_func )\n    {\n      FT_ERROR(( \"%s: property service of module `%s' is broken\\n\",\n                 func_name, module_name ));\n      return FT_THROW( Unimplemented_Feature );\n    }\n\n    return set ? service->set_property( cur[0], property_name, value )\n               : service->get_property( cur[0], property_name, value );\n  }\n\n\n  /* documentation is in ftmodapi.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Property_Set( FT_Library        library,\n                   const FT_String*  module_name,\n                   const FT_String*  property_name,\n                   const void*       value )\n  {\n    return ft_property_do( library,\n                           module_name,\n                           property_name,\n                           (void*)value,\n                           TRUE );\n  }\n\n\n  /* documentation is in ftmodapi.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Property_Get( FT_Library        library,\n                   const FT_String*  module_name,\n                   const FT_String*  property_name,\n                   void*             value )\n  {\n    return ft_property_do( library,\n                           module_name,\n                           property_name,\n                           value,\n                           FALSE );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                         L I B R A R Y                           ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* documentation is in ftmodapi.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Reference_Library( FT_Library  library )\n  {\n    library->refcount++;\n\n    return FT_Err_Ok;\n  }\n\n\n  /* documentation is in ftmodapi.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_New_Library( FT_Memory    memory,\n                  FT_Library  *alibrary )\n  {\n    FT_Library  library = NULL;\n    FT_Error    error;\n\n\n    if ( !memory )\n      return FT_THROW( Invalid_Argument );\n\n#ifdef FT_DEBUG_LEVEL_ERROR\n    /* init debugging support */\n    ft_debug_init();\n#endif\n\n    /* first of all, allocate the library object */\n    if ( FT_NEW( library ) )\n      return error;\n\n    library->memory = memory;\n\n#ifdef FT_CONFIG_OPTION_PIC\n    /* initialize position independent code containers */\n    error = ft_pic_container_init( library );\n    if ( error )\n      goto Fail;\n#endif\n\n    /* allocate the render pool */\n    library->raster_pool_size = FT_RENDER_POOL_SIZE;\n#if FT_RENDER_POOL_SIZE > 0\n    if ( FT_ALLOC( library->raster_pool, FT_RENDER_POOL_SIZE ) )\n      goto Fail;\n#endif\n\n    library->version_major = FREETYPE_MAJOR;\n    library->version_minor = FREETYPE_MINOR;\n    library->version_patch = FREETYPE_PATCH;\n\n    library->refcount = 1;\n\n    /* That's ok now */\n    *alibrary = library;\n\n    return FT_Err_Ok;\n\n  Fail:\n#ifdef FT_CONFIG_OPTION_PIC\n    ft_pic_container_destroy( library );\n#endif\n    FT_FREE( library );\n    return error;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Library_Version( FT_Library   library,\n                      FT_Int      *amajor,\n                      FT_Int      *aminor,\n                      FT_Int      *apatch )\n  {\n    FT_Int  major = 0;\n    FT_Int  minor = 0;\n    FT_Int  patch = 0;\n\n\n    if ( library )\n    {\n      major = library->version_major;\n      minor = library->version_minor;\n      patch = library->version_patch;\n    }\n\n    if ( amajor )\n      *amajor = major;\n\n    if ( aminor )\n      *aminor = minor;\n\n    if ( apatch )\n      *apatch = patch;\n  }\n\n\n  /* documentation is in ftmodapi.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Done_Library( FT_Library  library )\n  {\n    FT_Memory  memory;\n\n\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    library->refcount--;\n    if ( library->refcount > 0 )\n      goto Exit;\n\n    memory = library->memory;\n\n    /*\n     * Close all faces in the library.  If we don't do this, we can have\n     * some subtle memory leaks.\n     *\n     * Example:\n     *\n     *  - the cff font driver uses the pshinter module in cff_size_done\n     *  - if the pshinter module is destroyed before the cff font driver,\n     *    opened FT_Face objects managed by the driver are not properly\n     *    destroyed, resulting in a memory leak\n     *\n     * Some faces are dependent on other faces, like Type42 faces that\n     * depend on TrueType faces synthesized internally.\n     *\n     * The order of drivers should be specified in driver_name[].\n     */\n    {\n      FT_UInt      m, n;\n      const char*  driver_name[] = { \"type42\", NULL };\n\n\n      for ( m = 0;\n            m < sizeof ( driver_name ) / sizeof ( driver_name[0] );\n            m++ )\n      {\n        for ( n = 0; n < library->num_modules; n++ )\n        {\n          FT_Module    module      = library->modules[n];\n          const char*  module_name = module->clazz->module_name;\n          FT_List      faces;\n\n\n          if ( driver_name[m]                                &&\n               ft_strcmp( module_name, driver_name[m] ) != 0 )\n            continue;\n\n          if ( ( module->clazz->module_flags & FT_MODULE_FONT_DRIVER ) == 0 )\n            continue;\n\n          FT_TRACE7(( \"FT_Done_Library: close faces for %s\\n\", module_name ));\n\n          faces = &FT_DRIVER( module )->faces_list;\n          while ( faces->head )\n          {\n            FT_Done_Face( FT_FACE( faces->head->data ) );\n            if ( faces->head )\n              FT_TRACE0(( \"FT_Done_Library: failed to free some faces\\n\" ));\n          }\n        }\n      }\n    }\n\n    /* Close all other modules in the library */\n#if 1\n    /* XXX Modules are removed in the reversed order so that  */\n    /* type42 module is removed before truetype module.  This */\n    /* avoids double free in some occasions.  It is a hack.   */\n    while ( library->num_modules > 0 )\n      FT_Remove_Module( library,\n                        library->modules[library->num_modules - 1] );\n#else\n    {\n      FT_UInt  n;\n\n\n      for ( n = 0; n < library->num_modules; n++ )\n      {\n        FT_Module  module = library->modules[n];\n\n\n        if ( module )\n        {\n          Destroy_Module( module );\n          library->modules[n] = 0;\n        }\n      }\n    }\n#endif\n\n    /* Destroy raster objects */\n    FT_FREE( library->raster_pool );\n    library->raster_pool_size = 0;\n\n#ifdef FT_CONFIG_OPTION_PIC\n    /* Destroy pic container contents */\n    ft_pic_container_destroy( library );\n#endif\n\n    FT_FREE( library );\n\n  Exit:\n    return FT_Err_Ok;\n  }\n\n\n  /* documentation is in ftmodapi.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Set_Debug_Hook( FT_Library         library,\n                     FT_UInt            hook_index,\n                     FT_DebugHook_Func  debug_hook )\n  {\n    if ( library && debug_hook &&\n         hook_index <\n           ( sizeof ( library->debug_hooks ) / sizeof ( void* ) ) )\n      library->debug_hooks[hook_index] = debug_hook;\n  }\n\n\n  /* documentation is in ftmodapi.h */\n\n  FT_EXPORT_DEF( FT_TrueTypeEngineType )\n  FT_Get_TrueType_Engine_Type( FT_Library  library )\n  {\n    FT_TrueTypeEngineType  result = FT_TRUETYPE_ENGINE_TYPE_NONE;\n\n\n    if ( library )\n    {\n      FT_Module  module = FT_Get_Module( library, \"truetype\" );\n\n\n      if ( module )\n      {\n        FT_Service_TrueTypeEngine  service;\n\n\n        service = (FT_Service_TrueTypeEngine)\n                    ft_module_get_service( module,\n                                           FT_SERVICE_ID_TRUETYPE_ENGINE );\n        if ( service )\n          result = service->engine_type;\n      }\n    }\n\n    return result;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_SubGlyph_Info( FT_GlyphSlot  glyph,\n                        FT_UInt       sub_index,\n                        FT_Int       *p_index,\n                        FT_UInt      *p_flags,\n                        FT_Int       *p_arg1,\n                        FT_Int       *p_arg2,\n                        FT_Matrix    *p_transform )\n  {\n    FT_Error  error = FT_ERR( Invalid_Argument );\n\n\n    if ( glyph                                      &&\n         glyph->subglyphs                           &&\n         glyph->format == FT_GLYPH_FORMAT_COMPOSITE &&\n         sub_index < glyph->num_subglyphs           )\n    {\n      FT_SubGlyph  subg = glyph->subglyphs + sub_index;\n\n\n      *p_index     = subg->index;\n      *p_flags     = subg->flags;\n      *p_arg1      = subg->arg1;\n      *p_arg2      = subg->arg2;\n      *p_transform = subg->transform;\n    }\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftotval.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftotval.c                                                              */\n/*                                                                         */\n/*    FreeType API for validating OpenType tables (body).                  */\n/*                                                                         */\n/*  Copyright 2004, 2006, 2008, 2010, 2013 by                              */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/internal/services/svotval.h\"\n#include \"../../include/freetype/ftotval.h\"\n\n\n  /* documentation is in ftotval.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_OpenType_Validate( FT_Face    face,\n                        FT_UInt    validation_flags,\n                        FT_Bytes  *BASE_table,\n                        FT_Bytes  *GDEF_table,\n                        FT_Bytes  *GPOS_table,\n                        FT_Bytes  *GSUB_table,\n                        FT_Bytes  *JSTF_table )\n  {\n    FT_Service_OTvalidate  service;\n    FT_Error               error;\n\n\n    if ( !face )\n    {\n      error = FT_THROW( Invalid_Face_Handle );\n      goto Exit;\n    }\n\n    if ( !( BASE_table &&\n            GDEF_table &&\n            GPOS_table &&\n            GSUB_table &&\n            JSTF_table ) )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    FT_FACE_FIND_GLOBAL_SERVICE( face, service, OPENTYPE_VALIDATE );\n\n    if ( service )\n      error = service->validate( face,\n                                 validation_flags,\n                                 BASE_table,\n                                 GDEF_table,\n                                 GPOS_table,\n                                 GSUB_table,\n                                 JSTF_table );\n    else\n      error = FT_THROW( Unimplemented_Feature );\n\n  Exit:\n    return error;\n  }\n\n\n  FT_EXPORT_DEF( void )\n  FT_OpenType_Free( FT_Face   face,\n                    FT_Bytes  table )\n  {\n    FT_Memory  memory;\n\n\n    if ( !face )\n      return;\n\n    memory = FT_FACE_MEMORY( face );\n\n    FT_FREE( table );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftoutln.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftoutln.c                                                              */\n/*                                                                         */\n/*    FreeType outline management (body).                                  */\n/*                                                                         */\n/*  Copyright 1996-2008, 2010, 2012-2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* All functions are declared in freetype.h.                             */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/ftoutln.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/internal/ftcalc.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/fttrigon.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_outline\n\n\n  static\n  const FT_Outline  null_outline = { 0, 0, 0, 0, 0, 0 };\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Outline_Decompose( FT_Outline*              outline,\n                        const FT_Outline_Funcs*  func_interface,\n                        void*                    user )\n  {\n#undef SCALED\n#define SCALED( x )  ( ( (x) << shift ) - delta )\n\n    FT_Vector   v_last;\n    FT_Vector   v_control;\n    FT_Vector   v_start;\n\n    FT_Vector*  point;\n    FT_Vector*  limit;\n    char*       tags;\n\n    FT_Error    error;\n\n    FT_Int   n;         /* index of contour in outline     */\n    FT_UInt  first;     /* index of first point in contour */\n    FT_Int   tag;       /* current point's state           */\n\n    FT_Int   shift;\n    FT_Pos   delta;\n\n\n    if ( !outline || !func_interface )\n      return FT_THROW( Invalid_Argument );\n\n    shift = func_interface->shift;\n    delta = func_interface->delta;\n    first = 0;\n\n    for ( n = 0; n < outline->n_contours; n++ )\n    {\n      FT_Int  last;  /* index of last point in contour */\n\n\n      FT_TRACE5(( \"FT_Outline_Decompose: Outline %d\\n\", n ));\n\n      last = outline->contours[n];\n      if ( last < 0 )\n        goto Invalid_Outline;\n      limit = outline->points + last;\n\n      v_start   = outline->points[first];\n      v_start.x = SCALED( v_start.x );\n      v_start.y = SCALED( v_start.y );\n\n      v_last   = outline->points[last];\n      v_last.x = SCALED( v_last.x );\n      v_last.y = SCALED( v_last.y );\n\n      v_control = v_start;\n\n      point = outline->points + first;\n      tags  = outline->tags   + first;\n      tag   = FT_CURVE_TAG( tags[0] );\n\n      /* A contour cannot start with a cubic control point! */\n      if ( tag == FT_CURVE_TAG_CUBIC )\n        goto Invalid_Outline;\n\n      /* check first point to determine origin */\n      if ( tag == FT_CURVE_TAG_CONIC )\n      {\n        /* first point is conic control.  Yes, this happens. */\n        if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON )\n        {\n          /* start at last point if it is on the curve */\n          v_start = v_last;\n          limit--;\n        }\n        else\n        {\n          /* if both first and last points are conic,         */\n          /* start at their middle and record its position    */\n          /* for closure                                      */\n          v_start.x = ( v_start.x + v_last.x ) / 2;\n          v_start.y = ( v_start.y + v_last.y ) / 2;\n\n          v_last = v_start;\n        }\n        point--;\n        tags--;\n      }\n\n      FT_TRACE5(( \"  move to (%.2f, %.2f)\\n\",\n                  v_start.x / 64.0, v_start.y / 64.0 ));\n      error = func_interface->move_to( &v_start, user );\n      if ( error )\n        goto Exit;\n\n      while ( point < limit )\n      {\n        point++;\n        tags++;\n\n        tag = FT_CURVE_TAG( tags[0] );\n        switch ( tag )\n        {\n        case FT_CURVE_TAG_ON:  /* emit a single line_to */\n          {\n            FT_Vector  vec;\n\n\n            vec.x = SCALED( point->x );\n            vec.y = SCALED( point->y );\n\n            FT_TRACE5(( \"  line to (%.2f, %.2f)\\n\",\n                        vec.x / 64.0, vec.y / 64.0 ));\n            error = func_interface->line_to( &vec, user );\n            if ( error )\n              goto Exit;\n            continue;\n          }\n\n        case FT_CURVE_TAG_CONIC:  /* consume conic arcs */\n          v_control.x = SCALED( point->x );\n          v_control.y = SCALED( point->y );\n\n        Do_Conic:\n          if ( point < limit )\n          {\n            FT_Vector  vec;\n            FT_Vector  v_middle;\n\n\n            point++;\n            tags++;\n            tag = FT_CURVE_TAG( tags[0] );\n\n            vec.x = SCALED( point->x );\n            vec.y = SCALED( point->y );\n\n            if ( tag == FT_CURVE_TAG_ON )\n            {\n              FT_TRACE5(( \"  conic to (%.2f, %.2f)\"\n                          \" with control (%.2f, %.2f)\\n\",\n                          vec.x / 64.0, vec.y / 64.0,\n                          v_control.x / 64.0, v_control.y / 64.0 ));\n              error = func_interface->conic_to( &v_control, &vec, user );\n              if ( error )\n                goto Exit;\n              continue;\n            }\n\n            if ( tag != FT_CURVE_TAG_CONIC )\n              goto Invalid_Outline;\n\n            v_middle.x = ( v_control.x + vec.x ) / 2;\n            v_middle.y = ( v_control.y + vec.y ) / 2;\n\n            FT_TRACE5(( \"  conic to (%.2f, %.2f)\"\n                        \" with control (%.2f, %.2f)\\n\",\n                        v_middle.x / 64.0, v_middle.y / 64.0,\n                        v_control.x / 64.0, v_control.y / 64.0 ));\n            error = func_interface->conic_to( &v_control, &v_middle, user );\n            if ( error )\n              goto Exit;\n\n            v_control = vec;\n            goto Do_Conic;\n          }\n\n          FT_TRACE5(( \"  conic to (%.2f, %.2f)\"\n                      \" with control (%.2f, %.2f)\\n\",\n                      v_start.x / 64.0, v_start.y / 64.0,\n                      v_control.x / 64.0, v_control.y / 64.0 ));\n          error = func_interface->conic_to( &v_control, &v_start, user );\n          goto Close;\n\n        default:  /* FT_CURVE_TAG_CUBIC */\n          {\n            FT_Vector  vec1, vec2;\n\n\n            if ( point + 1 > limit                             ||\n                 FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )\n              goto Invalid_Outline;\n\n            point += 2;\n            tags  += 2;\n\n            vec1.x = SCALED( point[-2].x );\n            vec1.y = SCALED( point[-2].y );\n\n            vec2.x = SCALED( point[-1].x );\n            vec2.y = SCALED( point[-1].y );\n\n            if ( point <= limit )\n            {\n              FT_Vector  vec;\n\n\n              vec.x = SCALED( point->x );\n              vec.y = SCALED( point->y );\n\n              FT_TRACE5(( \"  cubic to (%.2f, %.2f)\"\n                          \" with controls (%.2f, %.2f) and (%.2f, %.2f)\\n\",\n                          vec.x / 64.0, vec.y / 64.0,\n                          vec1.x / 64.0, vec1.y / 64.0,\n                          vec2.x / 64.0, vec2.y / 64.0 ));\n              error = func_interface->cubic_to( &vec1, &vec2, &vec, user );\n              if ( error )\n                goto Exit;\n              continue;\n            }\n\n            FT_TRACE5(( \"  cubic to (%.2f, %.2f)\"\n                        \" with controls (%.2f, %.2f) and (%.2f, %.2f)\\n\",\n                        v_start.x / 64.0, v_start.y / 64.0,\n                        vec1.x / 64.0, vec1.y / 64.0,\n                        vec2.x / 64.0, vec2.y / 64.0 ));\n            error = func_interface->cubic_to( &vec1, &vec2, &v_start, user );\n            goto Close;\n          }\n        }\n      }\n\n      /* close the contour with a line segment */\n      FT_TRACE5(( \"  line to (%.2f, %.2f)\\n\",\n                  v_start.x / 64.0, v_start.y / 64.0 ));\n      error = func_interface->line_to( &v_start, user );\n\n    Close:\n      if ( error )\n        goto Exit;\n\n      first = last + 1;\n    }\n\n    FT_TRACE5(( \"FT_Outline_Decompose: Done\\n\", n ));\n    return FT_Err_Ok;\n\n  Exit:\n    FT_TRACE5(( \"FT_Outline_Decompose: Error %d\\n\", error ));\n    return error;\n\n  Invalid_Outline:\n    return FT_THROW( Invalid_Outline );\n  }\n\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Outline_New_Internal( FT_Memory    memory,\n                           FT_UInt      numPoints,\n                           FT_Int       numContours,\n                           FT_Outline  *anoutline )\n  {\n    FT_Error  error;\n\n\n    if ( !anoutline || !memory )\n      return FT_THROW( Invalid_Argument );\n\n    *anoutline = null_outline;\n\n    if ( numContours < 0                  ||\n         (FT_UInt)numContours > numPoints )\n      return FT_THROW( Invalid_Argument );\n\n    if ( numPoints > FT_OUTLINE_POINTS_MAX )\n      return FT_THROW( Array_Too_Large );\n\n    if ( FT_NEW_ARRAY( anoutline->points,   numPoints   ) ||\n         FT_NEW_ARRAY( anoutline->tags,     numPoints   ) ||\n         FT_NEW_ARRAY( anoutline->contours, numContours ) )\n      goto Fail;\n\n    anoutline->n_points    = (FT_UShort)numPoints;\n    anoutline->n_contours  = (FT_Short)numContours;\n    anoutline->flags      |= FT_OUTLINE_OWNER;\n\n    return FT_Err_Ok;\n\n  Fail:\n    anoutline->flags |= FT_OUTLINE_OWNER;\n    FT_Outline_Done_Internal( memory, anoutline );\n\n    return error;\n  }\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Outline_New( FT_Library   library,\n                  FT_UInt      numPoints,\n                  FT_Int       numContours,\n                  FT_Outline  *anoutline )\n  {\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    return FT_Outline_New_Internal( library->memory, numPoints,\n                                    numContours, anoutline );\n  }\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Outline_Check( FT_Outline*  outline )\n  {\n    if ( outline )\n    {\n      FT_Int  n_points   = outline->n_points;\n      FT_Int  n_contours = outline->n_contours;\n      FT_Int  end0, end;\n      FT_Int  n;\n\n\n      /* empty glyph? */\n      if ( n_points == 0 && n_contours == 0 )\n        return 0;\n\n      /* check point and contour counts */\n      if ( n_points <= 0 || n_contours <= 0 )\n        goto Bad;\n\n      end0 = end = -1;\n      for ( n = 0; n < n_contours; n++ )\n      {\n        end = outline->contours[n];\n\n        /* note that we don't accept empty contours */\n        if ( end <= end0 || end >= n_points )\n          goto Bad;\n\n        end0 = end;\n      }\n\n      if ( end != n_points - 1 )\n        goto Bad;\n\n      /* XXX: check the tags array */\n      return 0;\n    }\n\n  Bad:\n    return FT_THROW( Invalid_Argument );\n  }\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Outline_Copy( const FT_Outline*  source,\n                   FT_Outline        *target )\n  {\n    FT_Int  is_owner;\n\n\n    if ( !source            || !target            ||\n         source->n_points   != target->n_points   ||\n         source->n_contours != target->n_contours )\n      return FT_THROW( Invalid_Argument );\n\n    if ( source == target )\n      return FT_Err_Ok;\n\n    FT_ARRAY_COPY( target->points, source->points, source->n_points );\n\n    FT_ARRAY_COPY( target->tags, source->tags, source->n_points );\n\n    FT_ARRAY_COPY( target->contours, source->contours, source->n_contours );\n\n    /* copy all flags, except the `FT_OUTLINE_OWNER' one */\n    is_owner      = target->flags & FT_OUTLINE_OWNER;\n    target->flags = source->flags;\n\n    target->flags &= ~FT_OUTLINE_OWNER;\n    target->flags |= is_owner;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Outline_Done_Internal( FT_Memory    memory,\n                            FT_Outline*  outline )\n  {\n    if ( memory && outline )\n    {\n      if ( outline->flags & FT_OUTLINE_OWNER )\n      {\n        FT_FREE( outline->points   );\n        FT_FREE( outline->tags     );\n        FT_FREE( outline->contours );\n      }\n      *outline = null_outline;\n\n      return FT_Err_Ok;\n    }\n    else\n      return FT_THROW( Invalid_Argument );\n  }\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Outline_Done( FT_Library   library,\n                   FT_Outline*  outline )\n  {\n    /* check for valid `outline' in FT_Outline_Done_Internal() */\n\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    return FT_Outline_Done_Internal( library->memory, outline );\n  }\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Outline_Get_CBox( const FT_Outline*  outline,\n                       FT_BBox           *acbox )\n  {\n    FT_Pos  xMin, yMin, xMax, yMax;\n\n\n    if ( outline && acbox )\n    {\n      if ( outline->n_points == 0 )\n      {\n        xMin = 0;\n        yMin = 0;\n        xMax = 0;\n        yMax = 0;\n      }\n      else\n      {\n        FT_Vector*  vec   = outline->points;\n        FT_Vector*  limit = vec + outline->n_points;\n\n\n        xMin = xMax = vec->x;\n        yMin = yMax = vec->y;\n        vec++;\n\n        for ( ; vec < limit; vec++ )\n        {\n          FT_Pos  x, y;\n\n\n          x = vec->x;\n          if ( x < xMin ) xMin = x;\n          if ( x > xMax ) xMax = x;\n\n          y = vec->y;\n          if ( y < yMin ) yMin = y;\n          if ( y > yMax ) yMax = y;\n        }\n      }\n      acbox->xMin = xMin;\n      acbox->xMax = xMax;\n      acbox->yMin = yMin;\n      acbox->yMax = yMax;\n    }\n  }\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Outline_Translate( const FT_Outline*  outline,\n                        FT_Pos             xOffset,\n                        FT_Pos             yOffset )\n  {\n    FT_UShort   n;\n    FT_Vector*  vec;\n\n\n    if ( !outline )\n      return;\n\n    vec = outline->points;\n\n    for ( n = 0; n < outline->n_points; n++ )\n    {\n      vec->x += xOffset;\n      vec->y += yOffset;\n      vec++;\n    }\n  }\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Outline_Reverse( FT_Outline*  outline )\n  {\n    FT_UShort  n;\n    FT_Int     first, last;\n\n\n    if ( !outline )\n      return;\n\n    first = 0;\n\n    for ( n = 0; n < outline->n_contours; n++ )\n    {\n      last  = outline->contours[n];\n\n      /* reverse point table */\n      {\n        FT_Vector*  p = outline->points + first;\n        FT_Vector*  q = outline->points + last;\n        FT_Vector   swap;\n\n\n        while ( p < q )\n        {\n          swap = *p;\n          *p   = *q;\n          *q   = swap;\n          p++;\n          q--;\n        }\n      }\n\n      /* reverse tags table */\n      {\n        char*  p = outline->tags + first;\n        char*  q = outline->tags + last;\n        char   swap;\n\n\n        while ( p < q )\n        {\n          swap = *p;\n          *p   = *q;\n          *q   = swap;\n          p++;\n          q--;\n        }\n      }\n\n      first = last + 1;\n    }\n\n    outline->flags ^= FT_OUTLINE_REVERSE_FILL;\n  }\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Outline_Render( FT_Library         library,\n                     FT_Outline*        outline,\n                     FT_Raster_Params*  params )\n  {\n    FT_Error     error;\n    FT_Bool      update = FALSE;\n    FT_Renderer  renderer;\n    FT_ListNode  node;\n\n\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    if ( !outline || !params )\n      return FT_THROW( Invalid_Argument );\n\n    renderer = library->cur_renderer;\n    node     = library->renderers.head;\n\n    params->source = (void*)outline;\n\n    error = FT_ERR( Cannot_Render_Glyph );\n    while ( renderer )\n    {\n      error = renderer->raster_render( renderer->raster, params );\n      if ( !error || FT_ERR_NEQ( error, Cannot_Render_Glyph ) )\n        break;\n\n      /* FT_Err_Cannot_Render_Glyph is returned if the render mode   */\n      /* is unsupported by the current renderer for this glyph image */\n      /* format                                                      */\n\n      /* now, look for another renderer that supports the same */\n      /* format                                                */\n      renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE,\n                                     &node );\n      update   = TRUE;\n    }\n\n    /* if we changed the current renderer for the glyph image format */\n    /* we need to select it as the next current one                  */\n    if ( !error && update && renderer )\n      FT_Set_Renderer( library, renderer, 0, 0 );\n\n    return error;\n  }\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Outline_Get_Bitmap( FT_Library        library,\n                         FT_Outline*       outline,\n                         const FT_Bitmap  *abitmap )\n  {\n    FT_Raster_Params  params;\n\n\n    if ( !abitmap )\n      return FT_THROW( Invalid_Argument );\n\n    /* other checks are delayed to FT_Outline_Render() */\n\n    params.target = abitmap;\n    params.flags  = 0;\n\n    if ( abitmap->pixel_mode == FT_PIXEL_MODE_GRAY  ||\n         abitmap->pixel_mode == FT_PIXEL_MODE_LCD   ||\n         abitmap->pixel_mode == FT_PIXEL_MODE_LCD_V )\n      params.flags |= FT_RASTER_FLAG_AA;\n\n    return FT_Outline_Render( library, outline, &params );\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Vector_Transform( FT_Vector*        vector,\n                       const FT_Matrix*  matrix )\n  {\n    FT_Pos  xz, yz;\n\n\n    if ( !vector || !matrix )\n      return;\n\n    xz = FT_MulFix( vector->x, matrix->xx ) +\n         FT_MulFix( vector->y, matrix->xy );\n\n    yz = FT_MulFix( vector->x, matrix->yx ) +\n         FT_MulFix( vector->y, matrix->yy );\n\n    vector->x = xz;\n    vector->y = yz;\n  }\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Outline_Transform( const FT_Outline*  outline,\n                        const FT_Matrix*   matrix )\n  {\n    FT_Vector*  vec;\n    FT_Vector*  limit;\n\n\n    if ( !outline || !matrix )\n      return;\n\n    vec   = outline->points;\n    limit = vec + outline->n_points;\n\n    for ( ; vec < limit; vec++ )\n      FT_Vector_Transform( vec, matrix );\n  }\n\n\n#if 0\n\n#define FT_OUTLINE_GET_CONTOUR( outline, c, first, last )  \\\n  do {                                                     \\\n    (first) = ( c > 0 ) ? (outline)->points +              \\\n                            (outline)->contours[c - 1] + 1 \\\n                        : (outline)->points;               \\\n    (last) = (outline)->points + (outline)->contours[c];   \\\n  } while ( 0 )\n\n\n  /* Is a point in some contour?                     */\n  /*                                                 */\n  /* We treat every point of the contour as if it    */\n  /* it were ON.  That is, we allow false positives, */\n  /* but disallow false negatives.  (XXX really?)    */\n  static FT_Bool\n  ft_contour_has( FT_Outline*  outline,\n                  FT_Short     c,\n                  FT_Vector*   point )\n  {\n    FT_Vector*  first;\n    FT_Vector*  last;\n    FT_Vector*  a;\n    FT_Vector*  b;\n    FT_UInt     n = 0;\n\n\n    FT_OUTLINE_GET_CONTOUR( outline, c, first, last );\n\n    for ( a = first; a <= last; a++ )\n    {\n      FT_Pos  x;\n      FT_Int  intersect;\n\n\n      b = ( a == last ) ? first : a + 1;\n\n      intersect = ( a->y - point->y ) ^ ( b->y - point->y );\n\n      /* a and b are on the same side */\n      if ( intersect >= 0 )\n      {\n        if ( intersect == 0 && a->y == point->y )\n        {\n          if ( ( a->x <= point->x && b->x >= point->x ) ||\n               ( a->x >= point->x && b->x <= point->x ) )\n            return 1;\n        }\n\n        continue;\n      }\n\n      x = a->x + ( b->x - a->x ) * (point->y - a->y ) / ( b->y - a->y );\n\n      if ( x < point->x )\n        n++;\n      else if ( x == point->x )\n        return 1;\n    }\n\n    return n & 1;\n  }\n\n\n  static FT_Bool\n  ft_contour_enclosed( FT_Outline*  outline,\n                       FT_UShort    c )\n  {\n    FT_Vector*  first;\n    FT_Vector*  last;\n    FT_Short    i;\n\n\n    FT_OUTLINE_GET_CONTOUR( outline, c, first, last );\n\n    for ( i = 0; i < outline->n_contours; i++ )\n    {\n      if ( i != c && ft_contour_has( outline, i, first ) )\n      {\n        FT_Vector*  pt;\n\n\n        for ( pt = first + 1; pt <= last; pt++ )\n          if ( !ft_contour_has( outline, i, pt ) )\n            return 0;\n\n        return 1;\n      }\n    }\n\n    return 0;\n  }\n\n\n  /* This version differs from the public one in that each */\n  /* part (contour not enclosed in another contour) of the */\n  /* outline is checked for orientation.  This is          */\n  /* necessary for some buggy CJK fonts.                   */\n  static FT_Orientation\n  ft_outline_get_orientation( FT_Outline*  outline )\n  {\n    FT_Short        i;\n    FT_Vector*      first;\n    FT_Vector*      last;\n    FT_Orientation  orient = FT_ORIENTATION_NONE;\n\n\n    first = outline->points;\n    for ( i = 0; i < outline->n_contours; i++, first = last + 1 )\n    {\n      FT_Vector*  point;\n      FT_Vector*  xmin_point;\n      FT_Pos      xmin;\n\n\n      last = outline->points + outline->contours[i];\n\n      /* skip degenerate contours */\n      if ( last < first + 2 )\n        continue;\n\n      if ( ft_contour_enclosed( outline, i ) )\n        continue;\n\n      xmin       = first->x;\n      xmin_point = first;\n\n      for ( point = first + 1; point <= last; point++ )\n      {\n        if ( point->x < xmin )\n        {\n          xmin       = point->x;\n          xmin_point = point;\n        }\n      }\n\n      /* check the orientation of the contour */\n      {\n        FT_Vector*      prev;\n        FT_Vector*      next;\n        FT_Orientation  o;\n\n\n        prev = ( xmin_point == first ) ? last : xmin_point - 1;\n        next = ( xmin_point == last ) ? first : xmin_point + 1;\n\n        if ( FT_Atan2( prev->x - xmin_point->x, prev->y - xmin_point->y ) >\n             FT_Atan2( next->x - xmin_point->x, next->y - xmin_point->y ) )\n          o = FT_ORIENTATION_POSTSCRIPT;\n        else\n          o = FT_ORIENTATION_TRUETYPE;\n\n        if ( orient == FT_ORIENTATION_NONE )\n          orient = o;\n        else if ( orient != o )\n          return FT_ORIENTATION_NONE;\n      }\n    }\n\n    return orient;\n  }\n\n#endif /* 0 */\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Outline_Embolden( FT_Outline*  outline,\n                       FT_Pos       strength )\n  {\n    return FT_Outline_EmboldenXY( outline, strength, strength );\n  }\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Outline_EmboldenXY( FT_Outline*  outline,\n                         FT_Pos       xstrength,\n                         FT_Pos       ystrength )\n  {\n    FT_Vector*  points;\n    FT_Vector   v_prev, v_first, v_next, v_cur;\n    FT_Int      c, n, first;\n    FT_Int      orientation;\n\n\n    if ( !outline )\n      return FT_THROW( Invalid_Argument );\n\n    xstrength /= 2;\n    ystrength /= 2;\n    if ( xstrength == 0 && ystrength == 0 )\n      return FT_Err_Ok;\n\n    orientation = FT_Outline_Get_Orientation( outline );\n    if ( orientation == FT_ORIENTATION_NONE )\n    {\n      if ( outline->n_contours )\n        return FT_THROW( Invalid_Argument );\n      else\n        return FT_Err_Ok;\n    }\n\n    points = outline->points;\n\n    first = 0;\n    for ( c = 0; c < outline->n_contours; c++ )\n    {\n      FT_Vector  in, out, shift;\n      FT_Fixed   l_in, l_out, l, q, d;\n      int        last = outline->contours[c];\n\n\n      v_first = points[first];\n      v_prev  = points[last];\n      v_cur   = v_first;\n\n      /* compute incoming normalized vector */\n      in.x = v_cur.x - v_prev.x;\n      in.y = v_cur.y - v_prev.y;\n      l_in = FT_Vector_Length( &in );\n      if ( l_in )\n      {\n        in.x = FT_DivFix( in.x, l_in );\n        in.y = FT_DivFix( in.y, l_in );\n      }\n\n      for ( n = first; n <= last; n++ )\n      {\n        if ( n < last )\n          v_next = points[n + 1];\n        else\n          v_next = v_first;\n\n        /* compute outgoing normalized vector */\n        out.x = v_next.x - v_cur.x;\n        out.y = v_next.y - v_cur.y;\n        l_out = FT_Vector_Length( &out );\n        if ( l_out )\n        {\n          out.x = FT_DivFix( out.x, l_out );\n          out.y = FT_DivFix( out.y, l_out );\n        }\n\n        d = FT_MulFix( in.x, out.x ) + FT_MulFix( in.y, out.y );\n\n        /* shift only if turn is less than ~160 degrees */\n        if ( d > -0xF000L )\n        {\n          d = d + 0x10000L;\n\n          /* shift components are aligned along lateral bisector */\n          /* and directed according to the outline orientation.  */\n          shift.x = in.y + out.y;\n          shift.y = in.x + out.x;\n\n          if ( orientation == FT_ORIENTATION_TRUETYPE )\n            shift.x = -shift.x;\n          else\n            shift.y = -shift.y;\n\n          /* restrict shift magnitude to better handle collapsing segments */\n          q = FT_MulFix( out.x, in.y ) - FT_MulFix( out.y, in.x );\n          if ( orientation == FT_ORIENTATION_TRUETYPE )\n            q = -q;\n\n          l = FT_MIN( l_in, l_out );\n\n          /* non-strict inequalities avoid divide-by-zero when q == l == 0 */\n          if ( FT_MulFix( xstrength, q ) <= FT_MulFix( d, l ) )\n            shift.x = FT_MulDiv( shift.x, xstrength, d );\n          else\n            shift.x = FT_MulDiv( shift.x, l, q );\n\n\n          if ( FT_MulFix( ystrength, q ) <= FT_MulFix( d, l ) )\n            shift.y = FT_MulDiv( shift.y, ystrength, d );\n          else\n            shift.y = FT_MulDiv( shift.y, l, q );\n        }\n        else\n          shift.x = shift.y = 0;\n\n        outline->points[n].x = v_cur.x + xstrength + shift.x;\n        outline->points[n].y = v_cur.y + ystrength + shift.y;\n\n        in    = out;\n        l_in  = l_out;\n        v_cur = v_next;\n      }\n\n      first = last + 1;\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( FT_Orientation )\n  FT_Outline_Get_Orientation( FT_Outline*  outline )\n  {\n    FT_BBox     cbox;\n    FT_Int      xshift, yshift;\n    FT_Vector*  points;\n    FT_Vector   v_prev, v_cur;\n    FT_Int      c, n, first;\n    FT_Pos      area = 0;\n\n\n    if ( !outline || outline->n_points <= 0 )\n      return FT_ORIENTATION_TRUETYPE;\n\n    /* We use the nonzero winding rule to find the orientation.       */\n    /* Since glyph outlines behave much more `regular' than arbitrary */\n    /* cubic or quadratic curves, this test deals with the polygon    */\n    /* only which is spanned up by the control points.                */\n\n    FT_Outline_Get_CBox( outline, &cbox );\n\n    xshift = FT_MSB( FT_ABS( cbox.xMax ) | FT_ABS( cbox.xMin ) ) - 14;\n    xshift = FT_MAX( xshift, 0 );\n\n    yshift = FT_MSB( cbox.yMax - cbox.yMin ) - 14;\n    yshift = FT_MAX( yshift, 0 );\n\n    points = outline->points;\n\n    first = 0;\n    for ( c = 0; c < outline->n_contours; c++ )\n    {\n      FT_Int  last = outline->contours[c];\n\n\n      v_prev = points[last];\n\n      for ( n = first; n <= last; n++ )\n      {\n        v_cur = points[n];\n        area += ( ( v_cur.y - v_prev.y ) >> yshift ) *\n                ( ( v_cur.x + v_prev.x ) >> xshift );\n        v_prev = v_cur;\n      }\n\n      first = last + 1;\n    }\n\n    if ( area > 0 )\n      return FT_ORIENTATION_POSTSCRIPT;\n    else if ( area < 0 )\n      return FT_ORIENTATION_TRUETYPE;\n    else\n      return FT_ORIENTATION_NONE;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpatent.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftpatent.c                                                             */\n/*                                                                         */\n/*    FreeType API for checking patented TrueType bytecode instructions    */\n/*    (body).                                                              */\n/*                                                                         */\n/*  Copyright 2007, 2008, 2010 by David Turner.                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/freetype.h\"\n#include \"../../include/freetype/tttags.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/internal/services/svsfnt.h\"\n#include \"../../include/freetype/internal/services/svttglyf.h\"\n\n\n  static FT_Bool\n  _tt_check_patents_in_range( FT_Stream  stream,\n                              FT_ULong   size )\n  {\n    FT_Bool   result = FALSE;\n    FT_Error  error;\n    FT_Bytes  p, end;\n\n\n    if ( FT_FRAME_ENTER( size ) )\n      return 0;\n\n    p   = stream->cursor;\n    end = p + size;\n\n    while ( p < end )\n    {\n      switch (p[0])\n      {\n      case 0x06:  /* SPvTL // */\n      case 0x07:  /* SPvTL +  */\n      case 0x08:  /* SFvTL // */\n      case 0x09:  /* SFvTL +  */\n      case 0x0A:  /* SPvFS    */\n      case 0x0B:  /* SFvFS    */\n        result = TRUE;\n        goto Exit;\n\n      case 0x40:\n        if ( p + 1 >= end )\n          goto Exit;\n\n        p += p[1] + 2;\n        break;\n\n      case 0x41:\n        if ( p + 1 >= end )\n          goto Exit;\n\n        p += p[1] * 2 + 2;\n        break;\n\n      case 0x71:  /* DELTAP2 */\n      case 0x72:  /* DELTAP3 */\n      case 0x73:  /* DELTAC0 */\n      case 0x74:  /* DELTAC1 */\n      case 0x75:  /* DELTAC2 */\n        result = TRUE;\n        goto Exit;\n\n      case 0xB0:\n      case 0xB1:\n      case 0xB2:\n      case 0xB3:\n      case 0xB4:\n      case 0xB5:\n      case 0xB6:\n      case 0xB7:\n        p += ( p[0] - 0xB0 ) + 2;\n        break;\n\n      case 0xB8:\n      case 0xB9:\n      case 0xBA:\n      case 0xBB:\n      case 0xBC:\n      case 0xBD:\n      case 0xBE:\n      case 0xBF:\n        p += ( p[0] - 0xB8 ) * 2 + 3;\n        break;\n\n      default:\n        p += 1;\n        break;\n      }\n    }\n\n  Exit:\n    FT_UNUSED( error );\n    FT_FRAME_EXIT();\n    return result;\n  }\n\n\n  static FT_Bool\n  _tt_check_patents_in_table( FT_Face   face,\n                              FT_ULong  tag )\n  {\n    FT_Stream              stream = face->stream;\n    FT_Error               error  = FT_Err_Ok;\n    FT_Service_SFNT_Table  service;\n    FT_Bool                result = FALSE;\n\n\n    FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );\n\n    if ( service )\n    {\n      FT_UInt   i = 0;\n      FT_ULong  tag_i = 0, offset_i = 0, length_i = 0;\n\n\n      for ( i = 0; !error && tag_i != tag ; i++ )\n        error = service->table_info( face, i,\n                                     &tag_i, &offset_i, &length_i );\n\n      if ( error                      ||\n           FT_STREAM_SEEK( offset_i ) )\n        goto Exit;\n\n      result = _tt_check_patents_in_range( stream, length_i );\n    }\n\n  Exit:\n    return result;\n  }\n\n\n  static FT_Bool\n  _tt_face_check_patents( FT_Face  face )\n  {\n    FT_Stream  stream = face->stream;\n    FT_UInt    gindex;\n    FT_Error   error;\n    FT_Bool    result;\n\n    FT_Service_TTGlyf  service;\n\n\n    result = _tt_check_patents_in_table( face, TTAG_fpgm );\n    if ( result )\n      goto Exit;\n\n    result = _tt_check_patents_in_table( face, TTAG_prep );\n    if ( result )\n      goto Exit;\n\n    FT_FACE_FIND_SERVICE( face, service, TT_GLYF );\n    if ( service == NULL )\n      goto Exit;\n\n    for ( gindex = 0; gindex < (FT_UInt)face->num_glyphs; gindex++ )\n    {\n      FT_ULong  offset, num_ins, size;\n      FT_Int    num_contours;\n\n\n      offset = service->get_location( face, gindex, &size );\n      if ( size == 0 )\n        continue;\n\n      if ( FT_STREAM_SEEK( offset )      ||\n           FT_READ_SHORT( num_contours ) )\n        continue;\n\n      if ( num_contours >= 0 )  /* simple glyph */\n      {\n        if ( FT_STREAM_SKIP( 8 + num_contours * 2 ) )\n          continue;\n      }\n      else  /* compound glyph */\n      {\n        FT_Bool  has_instr = 0;\n\n\n        if ( FT_STREAM_SKIP( 8 ) )\n          continue;\n\n        /* now read each component */\n        for (;;)\n        {\n          FT_UInt  flags, toskip;\n\n\n          if( FT_READ_USHORT( flags ) )\n            break;\n\n          toskip = 2 + 1 + 1;\n\n          if ( ( flags & ( 1 << 0 ) ) != 0 )       /* ARGS_ARE_WORDS */\n            toskip += 2;\n\n          if ( ( flags & ( 1 << 3 ) ) != 0 )       /* WE_HAVE_A_SCALE */\n            toskip += 2;\n          else if ( ( flags & ( 1 << 6 ) ) != 0 )  /* WE_HAVE_X_Y_SCALE */\n            toskip += 4;\n          else if ( ( flags & ( 1 << 7 ) ) != 0 )  /* WE_HAVE_A_2x2 */\n            toskip += 8;\n\n          if ( ( flags & ( 1 << 8 ) ) != 0 )       /* WE_HAVE_INSTRUCTIONS */\n            has_instr = 1;\n\n          if ( FT_STREAM_SKIP( toskip ) )\n            goto NextGlyph;\n\n          if ( ( flags & ( 1 << 5 ) ) == 0 )       /* MORE_COMPONENTS */\n            break;\n        }\n\n        if ( !has_instr )\n          goto NextGlyph;\n      }\n\n      if ( FT_READ_USHORT( num_ins ) )\n        continue;\n\n      result = _tt_check_patents_in_range( stream, num_ins );\n      if ( result )\n        goto Exit;\n\n    NextGlyph:\n      ;\n    }\n\n  Exit:\n    return result;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Bool )\n  FT_Face_CheckTrueTypePatents( FT_Face  face )\n  {\n    FT_Bool  result = FALSE;\n\n\n    if ( face && FT_IS_SFNT( face ) )\n      result = _tt_face_check_patents( face );\n\n    return result;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Bool )\n  FT_Face_SetUnpatentedHinting( FT_Face  face,\n                                FT_Bool  value )\n  {\n    FT_Bool  result = FALSE;\n\n\n#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING ) && \\\n    !defined( TT_CONFIG_OPTION_BYTECODE_INTERPRETER )\n    if ( face && FT_IS_SFNT( face ) )\n    {\n      result = !face->internal->ignore_unpatented_hinter;\n      face->internal->ignore_unpatented_hinter = !value;\n    }\n#else\n    FT_UNUSED( face );\n    FT_UNUSED( value );\n#endif\n\n    return result;\n  }\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpfr.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftpfr.c                                                                */\n/*                                                                         */\n/*    FreeType API for accessing PFR-specific data (body).                 */\n/*                                                                         */\n/*  Copyright 2002-2004, 2008, 2010, 2013 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/internal/services/svpfr.h\"\n\n\n  /* check the format */\n  static FT_Service_PfrMetrics\n  ft_pfr_check( FT_Face  face )\n  {\n    FT_Service_PfrMetrics  service = NULL;\n\n\n    if ( face )\n      FT_FACE_LOOKUP_SERVICE( face, service, PFR_METRICS );\n\n    return service;\n  }\n\n\n  /* documentation is in ftpfr.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_PFR_Metrics( FT_Face    face,\n                      FT_UInt   *aoutline_resolution,\n                      FT_UInt   *ametrics_resolution,\n                      FT_Fixed  *ametrics_x_scale,\n                      FT_Fixed  *ametrics_y_scale )\n  {\n    FT_Error               error = FT_Err_Ok;\n    FT_Service_PfrMetrics  service;\n\n\n    if ( !face )\n      return FT_THROW( Invalid_Argument );\n\n    service = ft_pfr_check( face );\n    if ( service )\n    {\n      error = service->get_metrics( face,\n                                    aoutline_resolution,\n                                    ametrics_resolution,\n                                    ametrics_x_scale,\n                                    ametrics_y_scale );\n    }\n    else\n    {\n      FT_Fixed  x_scale, y_scale;\n\n\n      /* this is not a PFR font */\n      if ( aoutline_resolution )\n        *aoutline_resolution = face->units_per_EM;\n\n      if ( ametrics_resolution )\n        *ametrics_resolution = face->units_per_EM;\n\n      x_scale = y_scale = 0x10000L;\n      if ( face->size )\n      {\n        x_scale = face->size->metrics.x_scale;\n        y_scale = face->size->metrics.y_scale;\n      }\n\n      if ( ametrics_x_scale )\n        *ametrics_x_scale = x_scale;\n\n      if ( ametrics_y_scale )\n        *ametrics_y_scale = y_scale;\n\n      error = FT_THROW( Unknown_File_Format );\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in ftpfr.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_PFR_Kerning( FT_Face     face,\n                      FT_UInt     left,\n                      FT_UInt     right,\n                      FT_Vector  *avector )\n  {\n    FT_Error               error;\n    FT_Service_PfrMetrics  service;\n\n\n    if ( !face )\n      return FT_THROW( Invalid_Argument );\n\n    service = ft_pfr_check( face );\n    if ( service )\n      error = service->get_kerning( face, left, right, avector );\n    else\n      error = FT_Get_Kerning( face, left, right,\n                              FT_KERNING_UNSCALED, avector );\n\n    return error;\n  }\n\n\n  /* documentation is in ftpfr.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_PFR_Advance( FT_Face   face,\n                      FT_UInt   gindex,\n                      FT_Pos   *aadvance )\n  {\n    FT_Error               error;\n    FT_Service_PfrMetrics  service;\n\n\n    service = ft_pfr_check( face );\n    if ( service )\n    {\n      error = service->get_advance( face, gindex, aadvance );\n    }\n    else\n      /* XXX: TODO: PROVIDE ADVANCE-LOADING METHOD TO ALL FONT DRIVERS */\n      error = FT_THROW( Invalid_Argument );\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpic.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftpic.c                                                                */\n/*                                                                         */\n/*    The FreeType position independent code services (body).              */\n/*                                                                         */\n/*  Copyright 2009 by                                                      */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/freetype.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"basepic.h\"\n\n#ifdef FT_CONFIG_OPTION_PIC\n\n  /* documentation is in ftpic.h */\n\n  FT_BASE_DEF( FT_Error )\n  ft_pic_container_init( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Error           error         = FT_Err_Ok;\n\n\n    FT_MEM_SET( pic_container, 0, sizeof ( *pic_container ) );\n\n    error = ft_base_pic_init( library );\n    if ( error )\n      return error;\n\n    return FT_Err_Ok;\n  }\n\n\n  /* Destroy the contents of the container. */\n  FT_BASE_DEF( void )\n  ft_pic_container_destroy( FT_Library  library )\n  {\n    ft_base_pic_free( library );\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftrfork.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftrfork.c                                                              */\n/*                                                                         */\n/*    Embedded resource forks accessor (body).                             */\n/*                                                                         */\n/*  Copyright 2004-2010, 2013 by                                           */\n/*  Masatake YAMATO and Redhat K.K.                                        */\n/*                                                                         */\n/*  FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are     */\n/*  derived from ftobjs.c.                                                 */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/* Development of the code in this file is support of                      */\n/* Information-technology Promotion Agency, Japan.                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/internal/ftrfork.h\"\n#include \"basepic.h\"\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_raccess\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****               Resource fork directory access                    ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_BASE_DEF( FT_Error )\n  FT_Raccess_Get_HeaderInfo( FT_Library  library,\n                             FT_Stream   stream,\n                             FT_Long     rfork_offset,\n                             FT_Long    *map_offset,\n                             FT_Long    *rdata_pos )\n  {\n    FT_Error       error;\n    unsigned char  head[16], head2[16];\n    FT_Long        map_pos, rdata_len;\n    int            allzeros, allmatch, i;\n    FT_Long        type_list;\n\n    FT_UNUSED( library );\n\n\n    error = FT_Stream_Seek( stream, rfork_offset );\n    if ( error )\n      return error;\n\n    error = FT_Stream_Read( stream, (FT_Byte *)head, 16 );\n    if ( error )\n      return error;\n\n    *rdata_pos = rfork_offset + ( ( head[0] << 24 ) |\n                                  ( head[1] << 16 ) |\n                                  ( head[2] <<  8 ) |\n                                    head[3]         );\n    map_pos    = rfork_offset + ( ( head[4] << 24 ) |\n                                  ( head[5] << 16 ) |\n                                  ( head[6] <<  8 ) |\n                                    head[7]         );\n    rdata_len = ( head[ 8] << 24 ) |\n                ( head[ 9] << 16 ) |\n                ( head[10] <<  8 ) |\n                  head[11];\n\n    /* map_len = head[12] .. head[15] */\n\n    if ( *rdata_pos + rdata_len != map_pos || map_pos == rfork_offset )\n      return FT_THROW( Unknown_File_Format );\n\n    error = FT_Stream_Seek( stream, map_pos );\n    if ( error )\n      return error;\n\n    head2[15] = (FT_Byte)( head[15] + 1 );       /* make it be different */\n\n    error = FT_Stream_Read( stream, (FT_Byte*)head2, 16 );\n    if ( error )\n      return error;\n\n    allzeros = 1;\n    allmatch = 1;\n    for ( i = 0; i < 16; ++i )\n    {\n      if ( head2[i] != 0 )\n        allzeros = 0;\n      if ( head2[i] != head[i] )\n        allmatch = 0;\n    }\n    if ( !allzeros && !allmatch )\n      return FT_THROW( Unknown_File_Format );\n\n    /* If we have reached this point then it is probably a mac resource */\n    /* file.  Now, does it contain any interesting resources?           */\n    /* Skip handle to next resource map, the file resource number, and  */\n    /* attributes.                                                      */\n    (void)FT_STREAM_SKIP( 4        /* skip handle to next resource map */\n                          + 2      /* skip file resource number */\n                          + 2 );   /* skip attributes */\n\n    if ( FT_READ_USHORT( type_list ) )\n      return error;\n    if ( type_list == -1 )\n      return FT_THROW( Unknown_File_Format );\n\n    error = FT_Stream_Seek( stream, map_pos + type_list );\n    if ( error )\n      return error;\n\n    *map_offset = map_pos + type_list;\n    return FT_Err_Ok;\n  }\n\n\n  static int\n  ft_raccess_sort_ref_by_id( FT_RFork_Ref*  a,\n                             FT_RFork_Ref*  b )\n  {\n    if ( a->res_id < b->res_id )\n      return -1;\n    else if ( a->res_id > b->res_id )\n      return 1;\n    else\n      return 0;\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Raccess_Get_DataOffsets( FT_Library  library,\n                              FT_Stream   stream,\n                              FT_Long     map_offset,\n                              FT_Long     rdata_pos,\n                              FT_Long     tag,\n                              FT_Long   **offsets,\n                              FT_Long    *count )\n  {\n    FT_Error      error;\n    int           i, j, cnt, subcnt;\n    FT_Long       tag_internal, rpos;\n    FT_Memory     memory = library->memory;\n    FT_Long       temp;\n    FT_Long       *offsets_internal = NULL;\n    FT_RFork_Ref  *ref = NULL;\n\n\n    error = FT_Stream_Seek( stream, map_offset );\n    if ( error )\n      return error;\n\n    if ( FT_READ_USHORT( cnt ) )\n      return error;\n    cnt++;\n\n    for ( i = 0; i < cnt; ++i )\n    {\n      if ( FT_READ_LONG( tag_internal ) ||\n           FT_READ_USHORT( subcnt )     ||\n           FT_READ_USHORT( rpos )       )\n        return error;\n\n      FT_TRACE2(( \"Resource tags: %c%c%c%c\\n\",\n                  (char)( 0xff & ( tag_internal >> 24 ) ),\n                  (char)( 0xff & ( tag_internal >> 16 ) ),\n                  (char)( 0xff & ( tag_internal >>  8 ) ),\n                  (char)( 0xff & ( tag_internal >>  0 ) ) ));\n\n      if ( tag_internal == tag )\n      {\n        *count = subcnt + 1;\n        rpos  += map_offset;\n\n        error = FT_Stream_Seek( stream, rpos );\n        if ( error )\n          return error;\n\n        if ( FT_NEW_ARRAY( ref, *count ) )\n          return error;\n\n        for ( j = 0; j < *count; ++j )\n        {\n          if ( FT_READ_USHORT( ref[j].res_id ) )\n            goto Exit;\n          if ( FT_STREAM_SKIP( 2 ) ) /* resource name */\n            goto Exit;\n          if ( FT_READ_LONG( temp ) )\n            goto Exit;\n          if ( FT_STREAM_SKIP( 4 ) ) /* mbz */\n            goto Exit;\n\n          ref[j].offset = temp & 0xFFFFFFL;\n        }\n\n        ft_qsort( ref, *count, sizeof ( FT_RFork_Ref ),\n                  ( int(*)(const void*, const void*) )\n                  ft_raccess_sort_ref_by_id );\n\n        if ( FT_NEW_ARRAY( offsets_internal, *count ) )\n          goto Exit;\n\n        /* XXX: duplicated reference ID,\n         *      gap between reference IDs are acceptable?\n         *      further investigation on Apple implementation is needed.\n         */\n        for ( j = 0; j < *count; ++j )\n          offsets_internal[j] = rdata_pos + ref[j].offset;\n\n        *offsets = offsets_internal;\n        error    = FT_Err_Ok;\n\n      Exit:\n        FT_FREE( ref );\n        return error;\n      }\n    }\n\n    return FT_THROW( Cannot_Open_Resource );\n  }\n\n\n#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                     Guessing functions                          ****/\n  /****                                                                 ****/\n  /****            When you add a new guessing function,                ****/\n  /****           update FT_RACCESS_N_RULES in ftrfork.h.               ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static FT_Error\n  raccess_guess_apple_double( FT_Library  library,\n                              FT_Stream   stream,\n                              char       *base_file_name,\n                              char      **result_file_name,\n                              FT_Long    *result_offset );\n\n  static FT_Error\n  raccess_guess_apple_single( FT_Library  library,\n                              FT_Stream   stream,\n                              char       *base_file_name,\n                              char      **result_file_name,\n                              FT_Long    *result_offset );\n\n  static FT_Error\n  raccess_guess_darwin_ufs_export( FT_Library  library,\n                                   FT_Stream   stream,\n                                   char       *base_file_name,\n                                   char      **result_file_name,\n                                   FT_Long    *result_offset );\n\n  static FT_Error\n  raccess_guess_darwin_newvfs( FT_Library  library,\n                               FT_Stream   stream,\n                               char       *base_file_name,\n                               char      **result_file_name,\n                               FT_Long    *result_offset );\n\n  static FT_Error\n  raccess_guess_darwin_hfsplus( FT_Library  library,\n                                FT_Stream   stream,\n                                char       *base_file_name,\n                                char      **result_file_name,\n                                FT_Long    *result_offset );\n\n  static FT_Error\n  raccess_guess_vfat( FT_Library  library,\n                      FT_Stream   stream,\n                      char       *base_file_name,\n                      char      **result_file_name,\n                      FT_Long    *result_offset );\n\n  static FT_Error\n  raccess_guess_linux_cap( FT_Library  library,\n                           FT_Stream   stream,\n                           char       *base_file_name,\n                           char      **result_file_name,\n                           FT_Long    *result_offset );\n\n  static FT_Error\n  raccess_guess_linux_double( FT_Library  library,\n                              FT_Stream   stream,\n                              char       *base_file_name,\n                              char      **result_file_name,\n                              FT_Long    *result_offset );\n\n  static FT_Error\n  raccess_guess_linux_netatalk( FT_Library  library,\n                                FT_Stream   stream,\n                                char       *base_file_name,\n                                char      **result_file_name,\n                                FT_Long    *result_offset );\n\n\n  CONST_FT_RFORK_RULE_ARRAY_BEGIN(ft_raccess_guess_table,\n                                  ft_raccess_guess_rec)\n  CONST_FT_RFORK_RULE_ARRAY_ENTRY(apple_double,      apple_double)\n  CONST_FT_RFORK_RULE_ARRAY_ENTRY(apple_single,      apple_single)\n  CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_ufs_export, darwin_ufs_export)\n  CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_newvfs,     darwin_newvfs)\n  CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_hfsplus,    darwin_hfsplus)\n  CONST_FT_RFORK_RULE_ARRAY_ENTRY(vfat,              vfat)\n  CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_cap,         linux_cap)\n  CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_double,      linux_double)\n  CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_netatalk,    linux_netatalk)\n  CONST_FT_RFORK_RULE_ARRAY_END\n\n\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                       Helper functions                          ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n\n  static FT_Error\n  raccess_guess_apple_generic( FT_Library  library,\n                               FT_Stream   stream,\n                               char       *base_file_name,\n                               FT_Int32    magic,\n                               FT_Long    *result_offset );\n\n  static FT_Error\n  raccess_guess_linux_double_from_file_name( FT_Library  library,\n                                             char *      file_name,\n                                             FT_Long    *result_offset );\n\n  static char *\n  raccess_make_file_name( FT_Memory    memory,\n                          const char  *original_name,\n                          const char  *insertion );\n\n  FT_BASE_DEF( void )\n  FT_Raccess_Guess( FT_Library  library,\n                    FT_Stream   stream,\n                    char*       base_name,\n                    char      **new_names,\n                    FT_Long    *offsets,\n                    FT_Error   *errors )\n  {\n    FT_Int  i;\n\n\n    for ( i = 0; i < FT_RACCESS_N_RULES; i++ )\n    {\n      new_names[i] = NULL;\n      if ( NULL != stream )\n        errors[i] = FT_Stream_Seek( stream, 0 );\n      else\n        errors[i] = FT_Err_Ok;\n\n      if ( errors[i] )\n        continue ;\n\n      errors[i] = (FT_RACCESS_GUESS_TABLE_GET[i].func)( library,\n                                                 stream, base_name,\n                                                 &(new_names[i]),\n                                                 &(offsets[i]) );\n    }\n\n    return;\n  }\n\n\n#ifndef FT_MACINTOSH\n  static FT_RFork_Rule\n  raccess_get_rule_type_from_rule_index( FT_Library  library,\n                                         FT_UInt     rule_index )\n  {\n    FT_UNUSED( library );\n\n    if ( rule_index >= FT_RACCESS_N_RULES )\n      return FT_RFork_Rule_invalid;\n\n    return FT_RACCESS_GUESS_TABLE_GET[rule_index].type;\n  }\n\n\n  /*\n   * For this function, refer ftbase.h.\n   */\n  FT_LOCAL_DEF( FT_Bool )\n  ft_raccess_rule_by_darwin_vfs( FT_Library  library,\n                                 FT_UInt     rule_index )\n  {\n    switch( raccess_get_rule_type_from_rule_index( library, rule_index ) )\n    {\n      case FT_RFork_Rule_darwin_newvfs:\n      case FT_RFork_Rule_darwin_hfsplus:\n        return TRUE;\n\n      default:\n        return FALSE;\n    }\n  }\n#endif\n\n\n  static FT_Error\n  raccess_guess_apple_double( FT_Library  library,\n                              FT_Stream   stream,\n                              char       *base_file_name,\n                              char      **result_file_name,\n                              FT_Long    *result_offset )\n  {\n    FT_Int32  magic = ( 0x00 << 24 ) |\n                      ( 0x05 << 16 ) |\n                      ( 0x16 <<  8 ) |\n                        0x07;\n\n\n    *result_file_name = NULL;\n    if ( NULL == stream )\n      return FT_THROW( Cannot_Open_Stream );\n\n    return raccess_guess_apple_generic( library, stream, base_file_name,\n                                        magic, result_offset );\n  }\n\n\n  static FT_Error\n  raccess_guess_apple_single( FT_Library  library,\n                              FT_Stream   stream,\n                              char       *base_file_name,\n                              char      **result_file_name,\n                              FT_Long    *result_offset )\n  {\n    FT_Int32  magic = ( 0x00 << 24 ) |\n                      ( 0x05 << 16 ) |\n                      ( 0x16 <<  8 ) |\n                        0x00;\n\n\n    *result_file_name = NULL;\n    if ( NULL == stream )\n      return FT_THROW( Cannot_Open_Stream );\n\n    return raccess_guess_apple_generic( library, stream, base_file_name,\n                                        magic, result_offset );\n  }\n\n\n  static FT_Error\n  raccess_guess_darwin_ufs_export( FT_Library  library,\n                                   FT_Stream   stream,\n                                   char       *base_file_name,\n                                   char      **result_file_name,\n                                   FT_Long    *result_offset )\n  {\n    char*      newpath;\n    FT_Error   error;\n    FT_Memory  memory;\n\n    FT_UNUSED( stream );\n\n\n    memory  = library->memory;\n    newpath = raccess_make_file_name( memory, base_file_name, \"._\" );\n    if ( !newpath )\n      return FT_THROW( Out_Of_Memory );\n\n    error = raccess_guess_linux_double_from_file_name( library, newpath,\n                                                       result_offset );\n    if ( !error )\n      *result_file_name = newpath;\n    else\n      FT_FREE( newpath );\n\n    return error;\n  }\n\n\n  static FT_Error\n  raccess_guess_darwin_hfsplus( FT_Library  library,\n                                FT_Stream   stream,\n                                char       *base_file_name,\n                                char      **result_file_name,\n                                FT_Long    *result_offset )\n  {\n    /*\n      Only meaningful on systems with hfs+ drivers (or Macs).\n     */\n    FT_Error   error;\n    char*      newpath = NULL;\n    FT_Memory  memory;\n    FT_Long    base_file_len = (FT_Long)ft_strlen( base_file_name );\n\n    FT_UNUSED( stream );\n\n\n    memory = library->memory;\n\n    if ( base_file_len + 6 > FT_INT_MAX )\n      return FT_THROW( Array_Too_Large );\n\n    if ( FT_ALLOC( newpath, base_file_len + 6 ) )\n      return error;\n\n    FT_MEM_COPY( newpath, base_file_name, base_file_len );\n    FT_MEM_COPY( newpath + base_file_len, \"/rsrc\", 6 );\n\n    *result_file_name = newpath;\n    *result_offset    = 0;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_Error\n  raccess_guess_darwin_newvfs( FT_Library  library,\n                               FT_Stream   stream,\n                               char       *base_file_name,\n                               char      **result_file_name,\n                               FT_Long    *result_offset )\n  {\n    /*\n      Only meaningful on systems with Mac OS X (> 10.1).\n     */\n    FT_Error   error;\n    char*      newpath = NULL;\n    FT_Memory  memory;\n    FT_Long    base_file_len = (FT_Long)ft_strlen( base_file_name );\n\n    FT_UNUSED( stream );\n\n\n    memory = library->memory;\n\n    if ( base_file_len + 18 > FT_INT_MAX )\n      return FT_THROW( Array_Too_Large );\n\n    if ( FT_ALLOC( newpath, base_file_len + 18 ) )\n      return error;\n\n    FT_MEM_COPY( newpath, base_file_name, base_file_len );\n    FT_MEM_COPY( newpath + base_file_len, \"/..namedfork/rsrc\", 18 );\n\n    *result_file_name = newpath;\n    *result_offset    = 0;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_Error\n  raccess_guess_vfat( FT_Library  library,\n                      FT_Stream   stream,\n                      char       *base_file_name,\n                      char      **result_file_name,\n                      FT_Long    *result_offset )\n  {\n    char*      newpath;\n    FT_Memory  memory;\n\n    FT_UNUSED( stream );\n\n\n    memory = library->memory;\n\n    newpath = raccess_make_file_name( memory, base_file_name,\n                                      \"resource.frk/\" );\n    if ( !newpath )\n      return FT_THROW( Out_Of_Memory );\n\n    *result_file_name = newpath;\n    *result_offset    = 0;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_Error\n  raccess_guess_linux_cap( FT_Library  library,\n                           FT_Stream   stream,\n                           char       *base_file_name,\n                           char      **result_file_name,\n                           FT_Long    *result_offset )\n  {\n    char*      newpath;\n    FT_Memory  memory;\n\n    FT_UNUSED( stream );\n\n\n    memory = library->memory;\n\n    newpath = raccess_make_file_name( memory, base_file_name, \".resource/\" );\n    if ( !newpath )\n      return FT_THROW( Out_Of_Memory );\n\n    *result_file_name = newpath;\n    *result_offset    = 0;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_Error\n  raccess_guess_linux_double( FT_Library  library,\n                              FT_Stream   stream,\n                              char       *base_file_name,\n                              char      **result_file_name,\n                              FT_Long    *result_offset )\n  {\n    char*      newpath;\n    FT_Error   error;\n    FT_Memory  memory;\n\n    FT_UNUSED( stream );\n\n\n    memory = library->memory;\n\n    newpath = raccess_make_file_name( memory, base_file_name, \"%\" );\n    if ( !newpath )\n      return FT_THROW( Out_Of_Memory );\n\n    error = raccess_guess_linux_double_from_file_name( library, newpath,\n                                                       result_offset );\n    if ( !error )\n      *result_file_name = newpath;\n    else\n      FT_FREE( newpath );\n\n    return error;\n  }\n\n\n  static FT_Error\n  raccess_guess_linux_netatalk( FT_Library  library,\n                                FT_Stream   stream,\n                                char       *base_file_name,\n                                char      **result_file_name,\n                                FT_Long    *result_offset )\n  {\n    char*      newpath;\n    FT_Error   error;\n    FT_Memory  memory;\n\n    FT_UNUSED( stream );\n\n\n    memory = library->memory;\n\n    newpath = raccess_make_file_name( memory, base_file_name,\n                                      \".AppleDouble/\" );\n    if ( !newpath )\n      return FT_THROW( Out_Of_Memory );\n\n    error = raccess_guess_linux_double_from_file_name( library, newpath,\n                                                       result_offset );\n    if ( !error )\n      *result_file_name = newpath;\n    else\n      FT_FREE( newpath );\n\n    return error;\n  }\n\n\n  static FT_Error\n  raccess_guess_apple_generic( FT_Library  library,\n                               FT_Stream   stream,\n                               char       *base_file_name,\n                               FT_Int32    magic,\n                               FT_Long    *result_offset )\n  {\n    FT_Int32   magic_from_stream;\n    FT_Error   error;\n    FT_Int32   version_number = 0;\n    FT_UShort  n_of_entries;\n\n    int        i;\n    FT_UInt32  entry_id, entry_offset, entry_length = 0;\n\n    const FT_UInt32  resource_fork_entry_id = 0x2;\n\n    FT_UNUSED( library );\n    FT_UNUSED( base_file_name );\n    FT_UNUSED( version_number );\n    FT_UNUSED( entry_length   );\n\n\n    if ( FT_READ_LONG( magic_from_stream ) )\n      return error;\n    if ( magic_from_stream != magic )\n      return FT_THROW( Unknown_File_Format );\n\n    if ( FT_READ_LONG( version_number ) )\n      return error;\n\n    /* filler */\n    error = FT_Stream_Skip( stream, 16 );\n    if ( error )\n      return error;\n\n    if ( FT_READ_USHORT( n_of_entries ) )\n      return error;\n    if ( n_of_entries == 0 )\n      return FT_THROW( Unknown_File_Format );\n\n    for ( i = 0; i < n_of_entries; i++ )\n    {\n      if ( FT_READ_LONG( entry_id ) )\n        return error;\n      if ( entry_id == resource_fork_entry_id )\n      {\n        if ( FT_READ_LONG( entry_offset ) ||\n             FT_READ_LONG( entry_length ) )\n          continue;\n        *result_offset = entry_offset;\n\n        return FT_Err_Ok;\n      }\n      else\n      {\n        error = FT_Stream_Skip( stream, 4 + 4 );    /* offset + length */\n        if ( error )\n          return error;\n      }\n    }\n\n    return FT_THROW( Unknown_File_Format );\n  }\n\n\n  static FT_Error\n  raccess_guess_linux_double_from_file_name( FT_Library  library,\n                                             char       *file_name,\n                                             FT_Long    *result_offset )\n  {\n    FT_Open_Args  args2;\n    FT_Stream     stream2;\n    char *        nouse = NULL;\n    FT_Error      error;\n\n\n    args2.flags    = FT_OPEN_PATHNAME;\n    args2.pathname = file_name;\n    error = FT_Stream_New( library, &args2, &stream2 );\n    if ( error )\n      return error;\n\n    error = raccess_guess_apple_double( library, stream2, file_name,\n                                        &nouse, result_offset );\n\n    FT_Stream_Free( stream2, 0 );\n\n    return error;\n  }\n\n\n  static char*\n  raccess_make_file_name( FT_Memory    memory,\n                          const char  *original_name,\n                          const char  *insertion )\n  {\n    char*        new_name = NULL;\n    const char*  tmp;\n    const char*  slash;\n    size_t       new_length;\n    FT_Error     error = FT_Err_Ok;\n\n    FT_UNUSED( error );\n\n\n    new_length = ft_strlen( original_name ) + ft_strlen( insertion );\n    if ( FT_ALLOC( new_name, new_length + 1 ) )\n      return NULL;\n\n    tmp = ft_strrchr( original_name, '/' );\n    if ( tmp )\n    {\n      ft_strncpy( new_name, original_name, tmp - original_name + 1 );\n      new_name[tmp - original_name + 1] = '\\0';\n      slash = tmp + 1;\n    }\n    else\n    {\n      slash       = original_name;\n      new_name[0] = '\\0';\n    }\n\n    ft_strcat( new_name, insertion );\n    ft_strcat( new_name, slash );\n\n    return new_name;\n  }\n\n\n#else   /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */\n\n\n  /*************************************************************************/\n  /*                  Dummy function; just sets errors                     */\n  /*************************************************************************/\n\n  FT_BASE_DEF( void )\n  FT_Raccess_Guess( FT_Library  library,\n                    FT_Stream   stream,\n                    char       *base_name,\n                    char      **new_names,\n                    FT_Long    *offsets,\n                    FT_Error   *errors )\n  {\n    FT_Int  i;\n\n    FT_UNUSED( library );\n    FT_UNUSED( stream );\n    FT_UNUSED( base_name );\n\n\n    for ( i = 0; i < FT_RACCESS_N_RULES; i++ )\n    {\n      new_names[i] = NULL;\n      offsets[i]   = 0;\n      errors[i]    = FT_ERR( Unimplemented_Feature );\n    }\n  }\n\n\n#endif  /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftsnames.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftsnames.c                                                             */\n/*                                                                         */\n/*    Simple interface to access SFNT name tables (which are used          */\n/*    to hold font names, copyright info, notices, etc.) (body).           */\n/*                                                                         */\n/*    This is _not_ used to retrieve glyph names!                          */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2009 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/ftsnames.h\"\n#include \"../../include/freetype/internal/tttypes.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n\n\n#ifdef TT_CONFIG_OPTION_SFNT_NAMES\n\n\n  /* documentation is in ftsnames.h */\n\n  FT_EXPORT_DEF( FT_UInt )\n  FT_Get_Sfnt_Name_Count( FT_Face  face )\n  {\n    return ( face && FT_IS_SFNT( face ) ) ? ((TT_Face)face)->num_names : 0;\n  }\n\n\n  /* documentation is in ftsnames.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_Sfnt_Name( FT_Face       face,\n                    FT_UInt       idx,\n                    FT_SfntName  *aname )\n  {\n    FT_Error  error = FT_ERR( Invalid_Argument );\n\n\n    if ( aname && face && FT_IS_SFNT( face ) )\n    {\n      TT_Face  ttface = (TT_Face)face;\n\n\n      if ( idx < (FT_UInt)ttface->num_names )\n      {\n        TT_NameEntryRec*  entry = ttface->name_table.names + idx;\n\n\n        /* load name on demand */\n        if ( entry->stringLength > 0 && entry->string == NULL )\n        {\n          FT_Memory  memory = face->memory;\n          FT_Stream  stream = face->stream;\n\n\n          if ( FT_NEW_ARRAY  ( entry->string, entry->stringLength ) ||\n               FT_STREAM_SEEK( entry->stringOffset )                ||\n               FT_STREAM_READ( entry->string, entry->stringLength ) )\n          {\n            FT_FREE( entry->string );\n            entry->stringLength = 0;\n          }\n        }\n\n        aname->platform_id = entry->platformID;\n        aname->encoding_id = entry->encodingID;\n        aname->language_id = entry->languageID;\n        aname->name_id     = entry->nameID;\n        aname->string      = (FT_Byte*)entry->string;\n        aname->string_len  = entry->stringLength;\n\n        error = FT_Err_Ok;\n      }\n    }\n\n    return error;\n  }\n\n\n#endif /* TT_CONFIG_OPTION_SFNT_NAMES */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftstream.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftstream.c                                                             */\n/*                                                                         */\n/*    I/O stream support (body).                                           */\n/*                                                                         */\n/*  Copyright 2000-2002, 2004-2006, 2008-2011, 2013 by                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_stream\n\n\n  FT_BASE_DEF( void )\n  FT_Stream_OpenMemory( FT_Stream       stream,\n                        const FT_Byte*  base,\n                        FT_ULong        size )\n  {\n    stream->base   = (FT_Byte*) base;\n    stream->size   = size;\n    stream->pos    = 0;\n    stream->cursor = 0;\n    stream->read   = 0;\n    stream->close  = 0;\n  }\n\n\n  FT_BASE_DEF( void )\n  FT_Stream_Close( FT_Stream  stream )\n  {\n    if ( stream && stream->close )\n      stream->close( stream );\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Stream_Seek( FT_Stream  stream,\n                  FT_ULong   pos )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    if ( stream->read )\n    {\n      if ( stream->read( stream, pos, 0, 0 ) )\n      {\n        FT_ERROR(( \"FT_Stream_Seek:\"\n                   \" invalid i/o; pos = 0x%lx, size = 0x%lx\\n\",\n                   pos, stream->size ));\n\n        error = FT_THROW( Invalid_Stream_Operation );\n      }\n    }\n    /* note that seeking to the first position after the file is valid */\n    else if ( pos > stream->size )\n    {\n      FT_ERROR(( \"FT_Stream_Seek:\"\n                 \" invalid i/o; pos = 0x%lx, size = 0x%lx\\n\",\n                 pos, stream->size ));\n\n      error = FT_THROW( Invalid_Stream_Operation );\n    }\n\n    if ( !error )\n      stream->pos = pos;\n\n    return error;\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Stream_Skip( FT_Stream  stream,\n                  FT_Long    distance )\n  {\n    if ( distance < 0 )\n      return FT_THROW( Invalid_Stream_Operation );\n\n    return FT_Stream_Seek( stream, (FT_ULong)( stream->pos + distance ) );\n  }\n\n\n  FT_BASE_DEF( FT_Long )\n  FT_Stream_Pos( FT_Stream  stream )\n  {\n    return stream->pos;\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Stream_Read( FT_Stream  stream,\n                  FT_Byte*   buffer,\n                  FT_ULong   count )\n  {\n    return FT_Stream_ReadAt( stream, stream->pos, buffer, count );\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Stream_ReadAt( FT_Stream  stream,\n                    FT_ULong   pos,\n                    FT_Byte*   buffer,\n                    FT_ULong   count )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_ULong  read_bytes;\n\n\n    if ( pos >= stream->size )\n    {\n      FT_ERROR(( \"FT_Stream_ReadAt:\"\n                 \" invalid i/o; pos = 0x%lx, size = 0x%lx\\n\",\n                 pos, stream->size ));\n\n      return FT_THROW( Invalid_Stream_Operation );\n    }\n\n    if ( stream->read )\n      read_bytes = stream->read( stream, pos, buffer, count );\n    else\n    {\n      read_bytes = stream->size - pos;\n      if ( read_bytes > count )\n        read_bytes = count;\n\n      FT_MEM_COPY( buffer, stream->base + pos, read_bytes );\n    }\n\n    stream->pos = pos + read_bytes;\n\n    if ( read_bytes < count )\n    {\n      FT_ERROR(( \"FT_Stream_ReadAt:\"\n                 \" invalid read; expected %lu bytes, got %lu\\n\",\n                 count, read_bytes ));\n\n      error = FT_THROW( Invalid_Stream_Operation );\n    }\n\n    return error;\n  }\n\n\n  FT_BASE_DEF( FT_ULong )\n  FT_Stream_TryRead( FT_Stream  stream,\n                     FT_Byte*   buffer,\n                     FT_ULong   count )\n  {\n    FT_ULong  read_bytes = 0;\n\n\n    if ( stream->pos >= stream->size )\n      goto Exit;\n\n    if ( stream->read )\n      read_bytes = stream->read( stream, stream->pos, buffer, count );\n    else\n    {\n      read_bytes = stream->size - stream->pos;\n      if ( read_bytes > count )\n        read_bytes = count;\n\n      FT_MEM_COPY( buffer, stream->base + stream->pos, read_bytes );\n    }\n\n    stream->pos += read_bytes;\n\n  Exit:\n    return read_bytes;\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Stream_ExtractFrame( FT_Stream  stream,\n                          FT_ULong   count,\n                          FT_Byte**  pbytes )\n  {\n    FT_Error  error;\n\n\n    error = FT_Stream_EnterFrame( stream, count );\n    if ( !error )\n    {\n      *pbytes = (FT_Byte*)stream->cursor;\n\n      /* equivalent to FT_Stream_ExitFrame(), with no memory block release */\n      stream->cursor = 0;\n      stream->limit  = 0;\n    }\n\n    return error;\n  }\n\n\n  FT_BASE_DEF( void )\n  FT_Stream_ReleaseFrame( FT_Stream  stream,\n                          FT_Byte**  pbytes )\n  {\n    if ( stream && stream->read )\n    {\n      FT_Memory  memory = stream->memory;\n\n#ifdef FT_DEBUG_MEMORY\n      ft_mem_free( memory, *pbytes );\n      *pbytes = NULL;\n#else\n      FT_FREE( *pbytes );\n#endif\n    }\n    *pbytes = 0;\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Stream_EnterFrame( FT_Stream  stream,\n                        FT_ULong   count )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_ULong  read_bytes;\n\n\n    /* check for nested frame access */\n    FT_ASSERT( stream && stream->cursor == 0 );\n\n    if ( stream->read )\n    {\n      /* allocate the frame in memory */\n      FT_Memory  memory = stream->memory;\n\n\n      /* simple sanity check */\n      if ( count > stream->size )\n      {\n        FT_ERROR(( \"FT_Stream_EnterFrame:\"\n                   \" frame size (%lu) larger than stream size (%lu)\\n\",\n                   count, stream->size ));\n\n        error = FT_THROW( Invalid_Stream_Operation );\n        goto Exit;\n      }\n\n#ifdef FT_DEBUG_MEMORY\n      /* assume _ft_debug_file and _ft_debug_lineno are already set */\n      stream->base = (unsigned char*)ft_mem_qalloc( memory, count, &error );\n      if ( error )\n        goto Exit;\n#else\n      if ( FT_QALLOC( stream->base, count ) )\n        goto Exit;\n#endif\n      /* read it */\n      read_bytes = stream->read( stream, stream->pos,\n                                 stream->base, count );\n      if ( read_bytes < count )\n      {\n        FT_ERROR(( \"FT_Stream_EnterFrame:\"\n                   \" invalid read; expected %lu bytes, got %lu\\n\",\n                   count, read_bytes ));\n\n        FT_FREE( stream->base );\n        error = FT_THROW( Invalid_Stream_Operation );\n      }\n      stream->cursor = stream->base;\n      stream->limit  = stream->cursor + count;\n      stream->pos   += read_bytes;\n    }\n    else\n    {\n      /* check current and new position */\n      if ( stream->pos >= stream->size        ||\n           stream->size - stream->pos < count )\n      {\n        FT_ERROR(( \"FT_Stream_EnterFrame:\"\n                   \" invalid i/o; pos = 0x%lx, count = %lu, size = 0x%lx\\n\",\n                   stream->pos, count, stream->size ));\n\n        error = FT_THROW( Invalid_Stream_Operation );\n        goto Exit;\n      }\n\n      /* set cursor */\n      stream->cursor = stream->base + stream->pos;\n      stream->limit  = stream->cursor + count;\n      stream->pos   += count;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  FT_BASE_DEF( void )\n  FT_Stream_ExitFrame( FT_Stream  stream )\n  {\n    /* IMPORTANT: The assertion stream->cursor != 0 was removed, given    */\n    /*            that it is possible to access a frame of length 0 in    */\n    /*            some weird fonts (usually, when accessing an array of   */\n    /*            0 records, like in some strange kern tables).           */\n    /*                                                                    */\n    /*  In this case, the loader code handles the 0-length table          */\n    /*  gracefully; however, stream.cursor is really set to 0 by the      */\n    /*  FT_Stream_EnterFrame() call, and this is not an error.            */\n    /*                                                                    */\n    FT_ASSERT( stream );\n\n    if ( stream->read )\n    {\n      FT_Memory  memory = stream->memory;\n\n#ifdef FT_DEBUG_MEMORY\n      ft_mem_free( memory, stream->base );\n      stream->base = NULL;\n#else\n      FT_FREE( stream->base );\n#endif\n    }\n    stream->cursor = 0;\n    stream->limit  = 0;\n  }\n\n\n  FT_BASE_DEF( FT_Char )\n  FT_Stream_GetChar( FT_Stream  stream )\n  {\n    FT_Char  result;\n\n\n    FT_ASSERT( stream && stream->cursor );\n\n    result = 0;\n    if ( stream->cursor < stream->limit )\n      result = *stream->cursor++;\n\n    return result;\n  }\n\n\n  FT_BASE_DEF( FT_UShort )\n  FT_Stream_GetUShort( FT_Stream  stream )\n  {\n    FT_Byte*  p;\n    FT_Short  result;\n\n\n    FT_ASSERT( stream && stream->cursor );\n\n    result         = 0;\n    p              = stream->cursor;\n    if ( p + 1 < stream->limit )\n      result       = FT_NEXT_USHORT( p );\n    stream->cursor = p;\n\n    return result;\n  }\n\n\n  FT_BASE_DEF( FT_UShort )\n  FT_Stream_GetUShortLE( FT_Stream  stream )\n  {\n    FT_Byte*  p;\n    FT_Short  result;\n\n\n    FT_ASSERT( stream && stream->cursor );\n\n    result         = 0;\n    p              = stream->cursor;\n    if ( p + 1 < stream->limit )\n      result       = FT_NEXT_USHORT_LE( p );\n    stream->cursor = p;\n\n    return result;\n  }\n\n\n  FT_BASE_DEF( FT_ULong )\n  FT_Stream_GetUOffset( FT_Stream  stream )\n  {\n    FT_Byte*  p;\n    FT_Long   result;\n\n\n    FT_ASSERT( stream && stream->cursor );\n\n    result         = 0;\n    p              = stream->cursor;\n    if ( p + 2 < stream->limit )\n      result       = FT_NEXT_UOFF3( p );\n    stream->cursor = p;\n    return result;\n  }\n\n\n  FT_BASE_DEF( FT_ULong )\n  FT_Stream_GetULong( FT_Stream  stream )\n  {\n    FT_Byte*  p;\n    FT_Long   result;\n\n\n    FT_ASSERT( stream && stream->cursor );\n\n    result         = 0;\n    p              = stream->cursor;\n    if ( p + 3 < stream->limit )\n      result       = FT_NEXT_ULONG( p );\n    stream->cursor = p;\n    return result;\n  }\n\n\n  FT_BASE_DEF( FT_ULong )\n  FT_Stream_GetULongLE( FT_Stream  stream )\n  {\n    FT_Byte*  p;\n    FT_Long   result;\n\n\n    FT_ASSERT( stream && stream->cursor );\n\n    result         = 0;\n    p              = stream->cursor;\n    if ( p + 3 < stream->limit )\n      result       = FT_NEXT_ULONG_LE( p );\n    stream->cursor = p;\n    return result;\n  }\n\n\n  FT_BASE_DEF( FT_Char )\n  FT_Stream_ReadChar( FT_Stream  stream,\n                      FT_Error*  error )\n  {\n    FT_Byte  result = 0;\n\n\n    FT_ASSERT( stream );\n\n    *error = FT_Err_Ok;\n\n    if ( stream->read )\n    {\n      if ( stream->read( stream, stream->pos, &result, 1L ) != 1L )\n        goto Fail;\n    }\n    else\n    {\n      if ( stream->pos < stream->size )\n        result = stream->base[stream->pos];\n      else\n        goto Fail;\n    }\n    stream->pos++;\n\n    return result;\n\n  Fail:\n    *error = FT_THROW( Invalid_Stream_Operation );\n    FT_ERROR(( \"FT_Stream_ReadChar:\"\n               \" invalid i/o; pos = 0x%lx, size = 0x%lx\\n\",\n               stream->pos, stream->size ));\n\n    return 0;\n  }\n\n\n  FT_BASE_DEF( FT_UShort )\n  FT_Stream_ReadUShort( FT_Stream  stream,\n                       FT_Error*  error )\n  {\n    FT_Byte   reads[2];\n    FT_Byte*  p = 0;\n    FT_Short  result = 0;\n\n\n    FT_ASSERT( stream );\n\n    *error = FT_Err_Ok;\n\n    if ( stream->pos + 1 < stream->size )\n    {\n      if ( stream->read )\n      {\n        if ( stream->read( stream, stream->pos, reads, 2L ) != 2L )\n          goto Fail;\n\n        p = reads;\n      }\n      else\n      {\n        p = stream->base + stream->pos;\n      }\n\n      if ( p )\n        result = FT_NEXT_USHORT( p );\n    }\n    else\n      goto Fail;\n\n    stream->pos += 2;\n\n    return result;\n\n  Fail:\n    *error = FT_THROW( Invalid_Stream_Operation );\n    FT_ERROR(( \"FT_Stream_ReadUShort:\"\n               \" invalid i/o; pos = 0x%lx, size = 0x%lx\\n\",\n               stream->pos, stream->size ));\n\n    return 0;\n  }\n\n\n  FT_BASE_DEF( FT_UShort )\n  FT_Stream_ReadUShortLE( FT_Stream  stream,\n                         FT_Error*  error )\n  {\n    FT_Byte   reads[2];\n    FT_Byte*  p = 0;\n    FT_Short  result = 0;\n\n\n    FT_ASSERT( stream );\n\n    *error = FT_Err_Ok;\n\n    if ( stream->pos + 1 < stream->size )\n    {\n      if ( stream->read )\n      {\n        if ( stream->read( stream, stream->pos, reads, 2L ) != 2L )\n          goto Fail;\n\n        p = reads;\n      }\n      else\n      {\n        p = stream->base + stream->pos;\n      }\n\n      if ( p )\n        result = FT_NEXT_USHORT_LE( p );\n    }\n    else\n      goto Fail;\n\n    stream->pos += 2;\n\n    return result;\n\n  Fail:\n    *error = FT_THROW( Invalid_Stream_Operation );\n    FT_ERROR(( \"FT_Stream_ReadUShortLE:\"\n               \" invalid i/o; pos = 0x%lx, size = 0x%lx\\n\",\n               stream->pos, stream->size ));\n\n    return 0;\n  }\n\n\n  FT_BASE_DEF( FT_ULong )\n  FT_Stream_ReadUOffset( FT_Stream  stream,\n                        FT_Error*  error )\n  {\n    FT_Byte   reads[3];\n    FT_Byte*  p = 0;\n    FT_Long   result = 0;\n\n\n    FT_ASSERT( stream );\n\n    *error = FT_Err_Ok;\n\n    if ( stream->pos + 2 < stream->size )\n    {\n      if ( stream->read )\n      {\n        if (stream->read( stream, stream->pos, reads, 3L ) != 3L )\n          goto Fail;\n\n        p = reads;\n      }\n      else\n      {\n        p = stream->base + stream->pos;\n      }\n\n      if ( p )\n        result = FT_NEXT_UOFF3( p );\n    }\n    else\n      goto Fail;\n\n    stream->pos += 3;\n\n    return result;\n\n  Fail:\n    *error = FT_THROW( Invalid_Stream_Operation );\n    FT_ERROR(( \"FT_Stream_ReadUOffset:\"\n               \" invalid i/o; pos = 0x%lx, size = 0x%lx\\n\",\n               stream->pos, stream->size ));\n\n    return 0;\n  }\n\n\n  FT_BASE_DEF( FT_ULong )\n  FT_Stream_ReadULong( FT_Stream  stream,\n                      FT_Error*  error )\n  {\n    FT_Byte   reads[4];\n    FT_Byte*  p = 0;\n    FT_Long   result = 0;\n\n\n    FT_ASSERT( stream );\n\n    *error = FT_Err_Ok;\n\n    if ( stream->pos + 3 < stream->size )\n    {\n      if ( stream->read )\n      {\n        if ( stream->read( stream, stream->pos, reads, 4L ) != 4L )\n          goto Fail;\n\n        p = reads;\n      }\n      else\n      {\n        p = stream->base + stream->pos;\n      }\n\n      if ( p )\n        result = FT_NEXT_ULONG( p );\n    }\n    else\n      goto Fail;\n\n    stream->pos += 4;\n\n    return result;\n\n  Fail:\n    *error = FT_THROW( Invalid_Stream_Operation );\n    FT_ERROR(( \"FT_Stream_ReadULong:\"\n               \" invalid i/o; pos = 0x%lx, size = 0x%lx\\n\",\n               stream->pos, stream->size ));\n\n    return 0;\n  }\n\n\n  FT_BASE_DEF( FT_ULong )\n  FT_Stream_ReadULongLE( FT_Stream  stream,\n                        FT_Error*  error )\n  {\n    FT_Byte   reads[4];\n    FT_Byte*  p = 0;\n    FT_Long   result = 0;\n\n\n    FT_ASSERT( stream );\n\n    *error = FT_Err_Ok;\n\n    if ( stream->pos + 3 < stream->size )\n    {\n      if ( stream->read )\n      {\n        if ( stream->read( stream, stream->pos, reads, 4L ) != 4L )\n          goto Fail;\n\n        p = reads;\n      }\n      else\n      {\n        p = stream->base + stream->pos;\n      }\n\n      if ( p )\n        result = FT_NEXT_ULONG_LE( p );\n    }\n    else\n      goto Fail;\n\n    stream->pos += 4;\n\n    return result;\n\n  Fail:\n    *error = FT_THROW( Invalid_Stream_Operation );\n    FT_ERROR(( \"FT_Stream_ReadULongLE:\"\n               \" invalid i/o; pos = 0x%lx, size = 0x%lx\\n\",\n               stream->pos, stream->size ));\n\n    return 0;\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Stream_ReadFields( FT_Stream              stream,\n                        const FT_Frame_Field*  fields,\n                        void*                  structure )\n  {\n    FT_Error  error;\n    FT_Bool   frame_accessed = 0;\n    FT_Byte*  cursor;\n\n\n    if ( !fields || !stream )\n      return FT_THROW( Invalid_Argument );\n\n    cursor = stream->cursor;\n\n    error = FT_Err_Ok;\n    do\n    {\n      FT_ULong  value;\n      FT_Int    sign_shift;\n      FT_Byte*  p;\n\n\n      switch ( fields->value )\n      {\n      case ft_frame_start:  /* access a new frame */\n        error = FT_Stream_EnterFrame( stream, fields->offset );\n        if ( error )\n          goto Exit;\n\n        frame_accessed = 1;\n        cursor         = stream->cursor;\n        fields++;\n        continue;  /* loop! */\n\n      case ft_frame_bytes:  /* read a byte sequence */\n      case ft_frame_skip:   /* skip some bytes      */\n        {\n          FT_UInt  len = fields->size;\n\n\n          if ( cursor + len > stream->limit )\n          {\n            error = FT_THROW( Invalid_Stream_Operation );\n            goto Exit;\n          }\n\n          if ( fields->value == ft_frame_bytes )\n          {\n            p = (FT_Byte*)structure + fields->offset;\n            FT_MEM_COPY( p, cursor, len );\n          }\n          cursor += len;\n          fields++;\n          continue;\n        }\n\n      case ft_frame_byte:\n      case ft_frame_schar:  /* read a single byte */\n        value = FT_NEXT_BYTE( cursor );\n        sign_shift = 24;\n        break;\n\n      case ft_frame_short_be:\n      case ft_frame_ushort_be:  /* read a 2-byte big-endian short */\n        value = FT_NEXT_USHORT( cursor) ;\n        sign_shift = 16;\n        break;\n\n      case ft_frame_short_le:\n      case ft_frame_ushort_le:  /* read a 2-byte little-endian short */\n        value = FT_NEXT_USHORT_LE( cursor );\n        sign_shift = 16;\n        break;\n\n      case ft_frame_long_be:\n      case ft_frame_ulong_be:  /* read a 4-byte big-endian long */\n        value = FT_NEXT_ULONG( cursor );\n        sign_shift = 0;\n        break;\n\n      case ft_frame_long_le:\n      case ft_frame_ulong_le:  /* read a 4-byte little-endian long */\n        value = FT_NEXT_ULONG_LE( cursor );\n        sign_shift = 0;\n        break;\n\n      case ft_frame_off3_be:\n      case ft_frame_uoff3_be:  /* read a 3-byte big-endian long */\n        value = FT_NEXT_UOFF3( cursor );\n        sign_shift = 8;\n        break;\n\n      case ft_frame_off3_le:\n      case ft_frame_uoff3_le:  /* read a 3-byte little-endian long */\n        value = FT_NEXT_UOFF3_LE( cursor );\n        sign_shift = 8;\n        break;\n\n      default:\n        /* otherwise, exit the loop */\n        stream->cursor = cursor;\n        goto Exit;\n      }\n\n      /* now, compute the signed value is necessary */\n      if ( fields->value & FT_FRAME_OP_SIGNED )\n        value = (FT_ULong)( (FT_Int32)( value << sign_shift ) >> sign_shift );\n\n      /* finally, store the value in the object */\n\n      p = (FT_Byte*)structure + fields->offset;\n      switch ( fields->size )\n      {\n      case ( 8 / FT_CHAR_BIT ):\n        *(FT_Byte*)p = (FT_Byte)value;\n        break;\n\n      case ( 16 / FT_CHAR_BIT ):\n        *(FT_UShort*)p = (FT_UShort)value;\n        break;\n\n      case ( 32 / FT_CHAR_BIT ):\n        *(FT_UInt32*)p = (FT_UInt32)value;\n        break;\n\n      default:  /* for 64-bit systems */\n        *(FT_ULong*)p = (FT_ULong)value;\n      }\n\n      /* go to next field */\n      fields++;\n    }\n    while ( 1 );\n\n  Exit:\n    /* close the frame if it was opened by this read */\n    if ( frame_accessed )\n      FT_Stream_ExitFrame( stream );\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftstroke.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftstroke.c                                                             */\n/*                                                                         */\n/*    FreeType path stroker (body).                                        */\n/*                                                                         */\n/*  Copyright 2002-2006, 2008-2011, 2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/ftstroke.h\"\n#include \"../../include/freetype/fttrigon.h\"\n#include \"../../include/freetype/ftoutln.h\"\n#include \"../../include/freetype/internal/ftmemory.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( FT_StrokerBorder )\n  FT_Outline_GetInsideBorder( FT_Outline*  outline )\n  {\n    FT_Orientation  o = FT_Outline_Get_Orientation( outline );\n\n\n    return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_RIGHT\n                                        : FT_STROKER_BORDER_LEFT;\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( FT_StrokerBorder )\n  FT_Outline_GetOutsideBorder( FT_Outline*  outline )\n  {\n    FT_Orientation  o = FT_Outline_Get_Orientation( outline );\n\n\n    return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_LEFT\n                                        : FT_STROKER_BORDER_RIGHT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      BEZIER COMPUTATIONS                      *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#define FT_SMALL_CONIC_THRESHOLD  ( FT_ANGLE_PI / 6 )\n#define FT_SMALL_CUBIC_THRESHOLD  ( FT_ANGLE_PI / 8 )\n\n#define FT_EPSILON  2\n\n#define FT_IS_SMALL( x )  ( (x) > -FT_EPSILON && (x) < FT_EPSILON )\n\n\n  static FT_Pos\n  ft_pos_abs( FT_Pos  x )\n  {\n    return x >= 0 ? x : -x;\n  }\n\n\n  static void\n  ft_conic_split( FT_Vector*  base )\n  {\n    FT_Pos  a, b;\n\n\n    base[4].x = base[2].x;\n    b = base[1].x;\n    a = base[3].x = ( base[2].x + b ) / 2;\n    b = base[1].x = ( base[0].x + b ) / 2;\n    base[2].x = ( a + b ) / 2;\n\n    base[4].y = base[2].y;\n    b = base[1].y;\n    a = base[3].y = ( base[2].y + b ) / 2;\n    b = base[1].y = ( base[0].y + b ) / 2;\n    base[2].y = ( a + b ) / 2;\n  }\n\n\n  static FT_Bool\n  ft_conic_is_small_enough( FT_Vector*  base,\n                            FT_Angle   *angle_in,\n                            FT_Angle   *angle_out )\n  {\n    FT_Vector  d1, d2;\n    FT_Angle   theta;\n    FT_Int     close1, close2;\n\n\n    d1.x = base[1].x - base[2].x;\n    d1.y = base[1].y - base[2].y;\n    d2.x = base[0].x - base[1].x;\n    d2.y = base[0].y - base[1].y;\n\n    close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y );\n    close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y );\n\n    if ( close1 )\n    {\n      if ( close2 )\n      {\n        /* basically a point;                      */\n        /* do nothing to retain original direction */\n      }\n      else\n      {\n        *angle_in  =\n        *angle_out = FT_Atan2( d2.x, d2.y );\n      }\n    }\n    else /* !close1 */\n    {\n      if ( close2 )\n      {\n        *angle_in  =\n        *angle_out = FT_Atan2( d1.x, d1.y );\n      }\n      else\n      {\n        *angle_in  = FT_Atan2( d1.x, d1.y );\n        *angle_out = FT_Atan2( d2.x, d2.y );\n      }\n    }\n\n    theta = ft_pos_abs( FT_Angle_Diff( *angle_in, *angle_out ) );\n\n    return FT_BOOL( theta < FT_SMALL_CONIC_THRESHOLD );\n  }\n\n\n  static void\n  ft_cubic_split( FT_Vector*  base )\n  {\n    FT_Pos  a, b, c, d;\n\n\n    base[6].x = base[3].x;\n    c = base[1].x;\n    d = base[2].x;\n    base[1].x = a = ( base[0].x + c ) / 2;\n    base[5].x = b = ( base[3].x + d ) / 2;\n    c = ( c + d ) / 2;\n    base[2].x = a = ( a + c ) / 2;\n    base[4].x = b = ( b + c ) / 2;\n    base[3].x = ( a + b ) / 2;\n\n    base[6].y = base[3].y;\n    c = base[1].y;\n    d = base[2].y;\n    base[1].y = a = ( base[0].y + c ) / 2;\n    base[5].y = b = ( base[3].y + d ) / 2;\n    c = ( c + d ) / 2;\n    base[2].y = a = ( a + c ) / 2;\n    base[4].y = b = ( b + c ) / 2;\n    base[3].y = ( a + b ) / 2;\n  }\n\n\n  /* Return the average of `angle1' and `angle2'.            */\n  /* This gives correct result even if `angle1' and `angle2' */\n  /* have opposite signs.                                    */\n  static FT_Angle\n  ft_angle_mean( FT_Angle  angle1,\n                 FT_Angle  angle2 )\n  {\n    return angle1 + FT_Angle_Diff( angle1, angle2 ) / 2;\n  }\n\n\n  static FT_Bool\n  ft_cubic_is_small_enough( FT_Vector*  base,\n                            FT_Angle   *angle_in,\n                            FT_Angle   *angle_mid,\n                            FT_Angle   *angle_out )\n  {\n    FT_Vector  d1, d2, d3;\n    FT_Angle   theta1, theta2;\n    FT_Int     close1, close2, close3;\n\n\n    d1.x = base[2].x - base[3].x;\n    d1.y = base[2].y - base[3].y;\n    d2.x = base[1].x - base[2].x;\n    d2.y = base[1].y - base[2].y;\n    d3.x = base[0].x - base[1].x;\n    d3.y = base[0].y - base[1].y;\n\n    close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y );\n    close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y );\n    close3 = FT_IS_SMALL( d3.x ) && FT_IS_SMALL( d3.y );\n\n    if ( close1 )\n    {\n      if ( close2 )\n      {\n        if ( close3 )\n        {\n          /* basically a point;                      */\n          /* do nothing to retain original direction */\n        }\n        else /* !close3 */\n        {\n          *angle_in  =\n          *angle_mid =\n          *angle_out = FT_Atan2( d3.x, d3.y );\n        }\n      }\n      else /* !close2 */\n      {\n        if ( close3 )\n        {\n          *angle_in  =\n          *angle_mid =\n          *angle_out = FT_Atan2( d2.x, d2.y );\n        }\n        else /* !close3 */\n        {\n          *angle_in  =\n          *angle_mid = FT_Atan2( d2.x, d2.y );\n          *angle_out = FT_Atan2( d3.x, d3.y );\n        }\n      }\n    }\n    else /* !close1 */\n    {\n      if ( close2 )\n      {\n        if ( close3 )\n        {\n          *angle_in  =\n          *angle_mid =\n          *angle_out = FT_Atan2( d1.x, d1.y );\n        }\n        else /* !close3 */\n        {\n          *angle_in  = FT_Atan2( d1.x, d1.y );\n          *angle_out = FT_Atan2( d3.x, d3.y );\n          *angle_mid = ft_angle_mean( *angle_in, *angle_out );\n        }\n      }\n      else /* !close2 */\n      {\n        if ( close3 )\n        {\n          *angle_in  = FT_Atan2( d1.x, d1.y );\n          *angle_mid =\n          *angle_out = FT_Atan2( d2.x, d2.y );\n        }\n        else /* !close3 */\n        {\n          *angle_in  = FT_Atan2( d1.x, d1.y );\n          *angle_mid = FT_Atan2( d2.x, d2.y );\n          *angle_out = FT_Atan2( d3.x, d3.y );\n        }\n      }\n    }\n\n    theta1 = ft_pos_abs( FT_Angle_Diff( *angle_in,  *angle_mid ) );\n    theta2 = ft_pos_abs( FT_Angle_Diff( *angle_mid, *angle_out ) );\n\n    return FT_BOOL( theta1 < FT_SMALL_CUBIC_THRESHOLD &&\n                    theta2 < FT_SMALL_CUBIC_THRESHOLD );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                       STROKE BORDERS                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef enum  FT_StrokeTags_\n  {\n    FT_STROKE_TAG_ON    = 1,   /* on-curve point  */\n    FT_STROKE_TAG_CUBIC = 2,   /* cubic off-point */\n    FT_STROKE_TAG_BEGIN = 4,   /* sub-path start  */\n    FT_STROKE_TAG_END   = 8    /* sub-path end    */\n\n  } FT_StrokeTags;\n\n#define  FT_STROKE_TAG_BEGIN_END  ( FT_STROKE_TAG_BEGIN | FT_STROKE_TAG_END )\n\n  typedef struct  FT_StrokeBorderRec_\n  {\n    FT_UInt     num_points;\n    FT_UInt     max_points;\n    FT_Vector*  points;\n    FT_Byte*    tags;\n    FT_Bool     movable;  /* TRUE for ends of lineto borders */\n    FT_Int      start;    /* index of current sub-path start point */\n    FT_Memory   memory;\n    FT_Bool     valid;\n\n  } FT_StrokeBorderRec, *FT_StrokeBorder;\n\n\n  static FT_Error\n  ft_stroke_border_grow( FT_StrokeBorder  border,\n                         FT_UInt          new_points )\n  {\n    FT_UInt   old_max = border->max_points;\n    FT_UInt   new_max = border->num_points + new_points;\n    FT_Error  error   = FT_Err_Ok;\n\n\n    if ( new_max > old_max )\n    {\n      FT_UInt    cur_max = old_max;\n      FT_Memory  memory  = border->memory;\n\n\n      while ( cur_max < new_max )\n        cur_max += ( cur_max >> 1 ) + 16;\n\n      if ( FT_RENEW_ARRAY( border->points, old_max, cur_max ) ||\n           FT_RENEW_ARRAY( border->tags,   old_max, cur_max ) )\n        goto Exit;\n\n      border->max_points = cur_max;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  static void\n  ft_stroke_border_close( FT_StrokeBorder  border,\n                          FT_Bool          reverse )\n  {\n    FT_UInt  start = border->start;\n    FT_UInt  count = border->num_points;\n\n\n    FT_ASSERT( border->start >= 0 );\n\n    /* don't record empty paths! */\n    if ( count <= start + 1U )\n      border->num_points = start;\n    else\n    {\n      /* copy the last point to the start of this sub-path, since */\n      /* it contains the `adjusted' starting coordinates          */\n      border->num_points    = --count;\n      border->points[start] = border->points[count];\n\n      if ( reverse )\n      {\n        /* reverse the points */\n        {\n          FT_Vector*  vec1 = border->points + start + 1;\n          FT_Vector*  vec2 = border->points + count - 1;\n\n\n          for ( ; vec1 < vec2; vec1++, vec2-- )\n          {\n            FT_Vector  tmp;\n\n\n            tmp   = *vec1;\n            *vec1 = *vec2;\n            *vec2 = tmp;\n          }\n        }\n\n        /* then the tags */\n        {\n          FT_Byte*  tag1 = border->tags + start + 1;\n          FT_Byte*  tag2 = border->tags + count - 1;\n\n\n          for ( ; tag1 < tag2; tag1++, tag2-- )\n          {\n            FT_Byte  tmp;\n\n\n            tmp   = *tag1;\n            *tag1 = *tag2;\n            *tag2 = tmp;\n          }\n        }\n      }\n\n      border->tags[start    ] |= FT_STROKE_TAG_BEGIN;\n      border->tags[count - 1] |= FT_STROKE_TAG_END;\n    }\n\n    border->start   = -1;\n    border->movable = FALSE;\n  }\n\n\n  static FT_Error\n  ft_stroke_border_lineto( FT_StrokeBorder  border,\n                           FT_Vector*       to,\n                           FT_Bool          movable )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    FT_ASSERT( border->start >= 0 );\n\n    if ( border->movable )\n    {\n      /* move last point */\n      border->points[border->num_points - 1] = *to;\n    }\n    else\n    {\n      /* don't add zero-length lineto */\n      if ( border->num_points > 0                                          &&\n           FT_IS_SMALL( border->points[border->num_points - 1].x - to->x ) &&\n           FT_IS_SMALL( border->points[border->num_points - 1].y - to->y ) )\n        return error;\n\n      /* add one point */\n      error = ft_stroke_border_grow( border, 1 );\n      if ( !error )\n      {\n        FT_Vector*  vec = border->points + border->num_points;\n        FT_Byte*    tag = border->tags   + border->num_points;\n\n\n        vec[0] = *to;\n        tag[0] = FT_STROKE_TAG_ON;\n\n        border->num_points += 1;\n      }\n    }\n    border->movable = movable;\n    return error;\n  }\n\n\n  static FT_Error\n  ft_stroke_border_conicto( FT_StrokeBorder  border,\n                            FT_Vector*       control,\n                            FT_Vector*       to )\n  {\n    FT_Error  error;\n\n\n    FT_ASSERT( border->start >= 0 );\n\n    error = ft_stroke_border_grow( border, 2 );\n    if ( !error )\n    {\n      FT_Vector*  vec = border->points + border->num_points;\n      FT_Byte*    tag = border->tags   + border->num_points;\n\n\n      vec[0] = *control;\n      vec[1] = *to;\n\n      tag[0] = 0;\n      tag[1] = FT_STROKE_TAG_ON;\n\n      border->num_points += 2;\n    }\n\n    border->movable = FALSE;\n\n    return error;\n  }\n\n\n  static FT_Error\n  ft_stroke_border_cubicto( FT_StrokeBorder  border,\n                            FT_Vector*       control1,\n                            FT_Vector*       control2,\n                            FT_Vector*       to )\n  {\n    FT_Error  error;\n\n\n    FT_ASSERT( border->start >= 0 );\n\n    error = ft_stroke_border_grow( border, 3 );\n    if ( !error )\n    {\n      FT_Vector*  vec = border->points + border->num_points;\n      FT_Byte*    tag = border->tags   + border->num_points;\n\n\n      vec[0] = *control1;\n      vec[1] = *control2;\n      vec[2] = *to;\n\n      tag[0] = FT_STROKE_TAG_CUBIC;\n      tag[1] = FT_STROKE_TAG_CUBIC;\n      tag[2] = FT_STROKE_TAG_ON;\n\n      border->num_points += 3;\n    }\n\n    border->movable = FALSE;\n\n    return error;\n  }\n\n\n#define FT_ARC_CUBIC_ANGLE  ( FT_ANGLE_PI / 2 )\n\n\n  static FT_Error\n  ft_stroke_border_arcto( FT_StrokeBorder  border,\n                          FT_Vector*       center,\n                          FT_Fixed         radius,\n                          FT_Angle         angle_start,\n                          FT_Angle         angle_diff )\n  {\n    FT_Angle   total, angle, step, rotate, next, theta;\n    FT_Vector  a, b, a2, b2;\n    FT_Fixed   length;\n    FT_Error   error = FT_Err_Ok;\n\n\n    /* compute start point */\n    FT_Vector_From_Polar( &a, radius, angle_start );\n    a.x += center->x;\n    a.y += center->y;\n\n    total  = angle_diff;\n    angle  = angle_start;\n    rotate = ( angle_diff >= 0 ) ? FT_ANGLE_PI2 : -FT_ANGLE_PI2;\n\n    while ( total != 0 )\n    {\n      step = total;\n      if ( step > FT_ARC_CUBIC_ANGLE )\n        step = FT_ARC_CUBIC_ANGLE;\n\n      else if ( step < -FT_ARC_CUBIC_ANGLE )\n        step = -FT_ARC_CUBIC_ANGLE;\n\n      next  = angle + step;\n      theta = step;\n      if ( theta < 0 )\n        theta = -theta;\n\n      theta >>= 1;\n\n      /* compute end point */\n      FT_Vector_From_Polar( &b, radius, next );\n      b.x += center->x;\n      b.y += center->y;\n\n      /* compute first and second control points */\n      length = FT_MulDiv( radius, FT_Sin( theta ) * 4,\n                          ( 0x10000L + FT_Cos( theta ) ) * 3 );\n\n      FT_Vector_From_Polar( &a2, length, angle + rotate );\n      a2.x += a.x;\n      a2.y += a.y;\n\n      FT_Vector_From_Polar( &b2, length, next - rotate );\n      b2.x += b.x;\n      b2.y += b.y;\n\n      /* add cubic arc */\n      error = ft_stroke_border_cubicto( border, &a2, &b2, &b );\n      if ( error )\n        break;\n\n      /* process the rest of the arc ?? */\n      a      = b;\n      total -= step;\n      angle  = next;\n    }\n\n    return error;\n  }\n\n\n  static FT_Error\n  ft_stroke_border_moveto( FT_StrokeBorder  border,\n                           FT_Vector*       to )\n  {\n    /* close current open path if any ? */\n    if ( border->start >= 0 )\n      ft_stroke_border_close( border, FALSE );\n\n    border->start = border->num_points;\n    border->movable = FALSE;\n\n    return ft_stroke_border_lineto( border, to, FALSE );\n  }\n\n\n  static void\n  ft_stroke_border_init( FT_StrokeBorder  border,\n                         FT_Memory        memory )\n  {\n    border->memory = memory;\n    border->points = NULL;\n    border->tags   = NULL;\n\n    border->num_points = 0;\n    border->max_points = 0;\n    border->start      = -1;\n    border->valid      = FALSE;\n  }\n\n\n  static void\n  ft_stroke_border_reset( FT_StrokeBorder  border )\n  {\n    border->num_points = 0;\n    border->start      = -1;\n    border->valid      = FALSE;\n  }\n\n\n  static void\n  ft_stroke_border_done( FT_StrokeBorder  border )\n  {\n    FT_Memory  memory = border->memory;\n\n\n    FT_FREE( border->points );\n    FT_FREE( border->tags );\n\n    border->num_points = 0;\n    border->max_points = 0;\n    border->start      = -1;\n    border->valid      = FALSE;\n  }\n\n\n  static FT_Error\n  ft_stroke_border_get_counts( FT_StrokeBorder  border,\n                               FT_UInt         *anum_points,\n                               FT_UInt         *anum_contours )\n  {\n    FT_Error  error        = FT_Err_Ok;\n    FT_UInt   num_points   = 0;\n    FT_UInt   num_contours = 0;\n\n    FT_UInt     count      = border->num_points;\n    FT_Vector*  point      = border->points;\n    FT_Byte*    tags       = border->tags;\n    FT_Int      in_contour = 0;\n\n\n    for ( ; count > 0; count--, num_points++, point++, tags++ )\n    {\n      if ( tags[0] & FT_STROKE_TAG_BEGIN )\n      {\n        if ( in_contour != 0 )\n          goto Fail;\n\n        in_contour = 1;\n      }\n      else if ( in_contour == 0 )\n        goto Fail;\n\n      if ( tags[0] & FT_STROKE_TAG_END )\n      {\n        in_contour = 0;\n        num_contours++;\n      }\n    }\n\n    if ( in_contour != 0 )\n      goto Fail;\n\n    border->valid = TRUE;\n\n  Exit:\n    *anum_points   = num_points;\n    *anum_contours = num_contours;\n    return error;\n\n  Fail:\n    num_points   = 0;\n    num_contours = 0;\n    goto Exit;\n  }\n\n\n  static void\n  ft_stroke_border_export( FT_StrokeBorder  border,\n                           FT_Outline*      outline )\n  {\n    /* copy point locations */\n    FT_ARRAY_COPY( outline->points + outline->n_points,\n                   border->points,\n                   border->num_points );\n\n    /* copy tags */\n    {\n      FT_UInt   count = border->num_points;\n      FT_Byte*  read  = border->tags;\n      FT_Byte*  write = (FT_Byte*)outline->tags + outline->n_points;\n\n\n      for ( ; count > 0; count--, read++, write++ )\n      {\n        if ( *read & FT_STROKE_TAG_ON )\n          *write = FT_CURVE_TAG_ON;\n        else if ( *read & FT_STROKE_TAG_CUBIC )\n          *write = FT_CURVE_TAG_CUBIC;\n        else\n          *write = FT_CURVE_TAG_CONIC;\n      }\n    }\n\n    /* copy contours */\n    {\n      FT_UInt    count = border->num_points;\n      FT_Byte*   tags  = border->tags;\n      FT_Short*  write = outline->contours + outline->n_contours;\n      FT_Short   idx   = (FT_Short)outline->n_points;\n\n\n      for ( ; count > 0; count--, tags++, idx++ )\n      {\n        if ( *tags & FT_STROKE_TAG_END )\n        {\n          *write++ = idx;\n          outline->n_contours++;\n        }\n      }\n    }\n\n    outline->n_points = (short)( outline->n_points + border->num_points );\n\n    FT_ASSERT( FT_Outline_Check( outline ) == 0 );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                           STROKER                             *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#define FT_SIDE_TO_ROTATE( s )   ( FT_ANGLE_PI2 - (s) * FT_ANGLE_PI )\n\n  typedef struct  FT_StrokerRec_\n  {\n    FT_Angle             angle_in;             /* direction into curr join */\n    FT_Angle             angle_out;            /* direction out of join  */\n    FT_Vector            center;               /* current position */\n    FT_Fixed             line_length;          /* length of last lineto */\n    FT_Bool              first_point;          /* is this the start? */\n    FT_Bool              subpath_open;         /* is the subpath open? */\n    FT_Angle             subpath_angle;        /* subpath start direction */\n    FT_Vector            subpath_start;        /* subpath start position */\n    FT_Fixed             subpath_line_length;  /* subpath start lineto len */\n    FT_Bool              handle_wide_strokes;  /* use wide strokes logic? */\n\n    FT_Stroker_LineCap   line_cap;\n    FT_Stroker_LineJoin  line_join;\n    FT_Stroker_LineJoin  line_join_saved;\n    FT_Fixed             miter_limit;\n    FT_Fixed             radius;\n\n    FT_StrokeBorderRec   borders[2];\n    FT_Library           library;\n\n  } FT_StrokerRec;\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Stroker_New( FT_Library   library,\n                  FT_Stroker  *astroker )\n  {\n    FT_Error    error;           /* assigned in FT_NEW */\n    FT_Memory   memory;\n    FT_Stroker  stroker = NULL;\n\n\n    if ( !library )\n      return FT_THROW( Invalid_Argument );\n\n    memory = library->memory;\n\n    if ( !FT_NEW( stroker ) )\n    {\n      stroker->library = library;\n\n      ft_stroke_border_init( &stroker->borders[0], memory );\n      ft_stroke_border_init( &stroker->borders[1], memory );\n    }\n\n    *astroker = stroker;\n\n    return error;\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Stroker_Set( FT_Stroker           stroker,\n                  FT_Fixed             radius,\n                  FT_Stroker_LineCap   line_cap,\n                  FT_Stroker_LineJoin  line_join,\n                  FT_Fixed             miter_limit )\n  {\n    stroker->radius      = radius;\n    stroker->line_cap    = line_cap;\n    stroker->line_join   = line_join;\n    stroker->miter_limit = miter_limit;\n\n    /* ensure miter limit has sensible value */\n    if ( stroker->miter_limit < 0x10000 )\n      stroker->miter_limit = 0x10000;\n\n    /* save line join style:                                           */\n    /* line join style can be temporarily changed when stroking curves */\n    stroker->line_join_saved = line_join;\n\n    FT_Stroker_Rewind( stroker );\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Stroker_Rewind( FT_Stroker  stroker )\n  {\n    if ( stroker )\n    {\n      ft_stroke_border_reset( &stroker->borders[0] );\n      ft_stroke_border_reset( &stroker->borders[1] );\n    }\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Stroker_Done( FT_Stroker  stroker )\n  {\n    if ( stroker )\n    {\n      FT_Memory  memory = stroker->library->memory;\n\n\n      ft_stroke_border_done( &stroker->borders[0] );\n      ft_stroke_border_done( &stroker->borders[1] );\n\n      stroker->library = NULL;\n      FT_FREE( stroker );\n    }\n  }\n\n\n  /* create a circular arc at a corner or cap */\n  static FT_Error\n  ft_stroker_arcto( FT_Stroker  stroker,\n                    FT_Int      side )\n  {\n    FT_Angle         total, rotate;\n    FT_Fixed         radius = stroker->radius;\n    FT_Error         error  = FT_Err_Ok;\n    FT_StrokeBorder  border = stroker->borders + side;\n\n\n    rotate = FT_SIDE_TO_ROTATE( side );\n\n    total = FT_Angle_Diff( stroker->angle_in, stroker->angle_out );\n    if ( total == FT_ANGLE_PI )\n      total = -rotate * 2;\n\n    error = ft_stroke_border_arcto( border,\n                                    &stroker->center,\n                                    radius,\n                                    stroker->angle_in + rotate,\n                                    total );\n    border->movable = FALSE;\n    return error;\n  }\n\n\n  /* add a cap at the end of an opened path */\n  static FT_Error\n  ft_stroker_cap( FT_Stroker  stroker,\n                  FT_Angle    angle,\n                  FT_Int      side )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    if ( stroker->line_cap == FT_STROKER_LINECAP_ROUND )\n    {\n      /* add a round cap */\n      stroker->angle_in  = angle;\n      stroker->angle_out = angle + FT_ANGLE_PI;\n\n      error = ft_stroker_arcto( stroker, side );\n    }\n    else if ( stroker->line_cap == FT_STROKER_LINECAP_SQUARE )\n    {\n      /* add a square cap */\n      FT_Vector        delta, delta2;\n      FT_Angle         rotate = FT_SIDE_TO_ROTATE( side );\n      FT_Fixed         radius = stroker->radius;\n      FT_StrokeBorder  border = stroker->borders + side;\n\n\n      FT_Vector_From_Polar( &delta2, radius, angle + rotate );\n      FT_Vector_From_Polar( &delta,  radius, angle );\n\n      delta.x += stroker->center.x + delta2.x;\n      delta.y += stroker->center.y + delta2.y;\n\n      error = ft_stroke_border_lineto( border, &delta, FALSE );\n      if ( error )\n        goto Exit;\n\n      FT_Vector_From_Polar( &delta2, radius, angle - rotate );\n      FT_Vector_From_Polar( &delta,  radius, angle );\n\n      delta.x += delta2.x + stroker->center.x;\n      delta.y += delta2.y + stroker->center.y;\n\n      error = ft_stroke_border_lineto( border, &delta, FALSE );\n    }\n    else if ( stroker->line_cap == FT_STROKER_LINECAP_BUTT )\n    {\n      /* add a butt ending */\n      FT_Vector        delta;\n      FT_Angle         rotate = FT_SIDE_TO_ROTATE( side );\n      FT_Fixed         radius = stroker->radius;\n      FT_StrokeBorder  border = stroker->borders + side;\n\n\n      FT_Vector_From_Polar( &delta, radius, angle + rotate );\n\n      delta.x += stroker->center.x;\n      delta.y += stroker->center.y;\n\n      error = ft_stroke_border_lineto( border, &delta, FALSE );\n      if ( error )\n        goto Exit;\n\n      FT_Vector_From_Polar( &delta, radius, angle - rotate );\n\n      delta.x += stroker->center.x;\n      delta.y += stroker->center.y;\n\n      error = ft_stroke_border_lineto( border, &delta, FALSE );\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /* process an inside corner, i.e. compute intersection */\n  static FT_Error\n  ft_stroker_inside( FT_Stroker  stroker,\n                     FT_Int      side,\n                     FT_Fixed    line_length )\n  {\n    FT_StrokeBorder  border = stroker->borders + side;\n    FT_Angle         phi, theta, rotate;\n    FT_Fixed         length, thcos;\n    FT_Vector        delta;\n    FT_Error         error = FT_Err_Ok;\n    FT_Bool          intersect;          /* use intersection of lines? */\n\n\n    rotate = FT_SIDE_TO_ROTATE( side );\n\n    theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ) / 2;\n\n    /* Only intersect borders if between two lineto's and both */\n    /* lines are long enough (line_length is zero for curves). */\n    if ( !border->movable || line_length == 0 )\n      intersect = FALSE;\n    else\n    {\n      /* compute minimum required length of lines */\n      FT_Fixed  min_length = ft_pos_abs( FT_MulFix( stroker->radius,\n                                                    FT_Tan( theta ) ) );\n\n\n      intersect = FT_BOOL( stroker->line_length >= min_length &&\n                           line_length          >= min_length );\n    }\n\n    if ( !intersect )\n    {\n      FT_Vector_From_Polar( &delta, stroker->radius,\n                            stroker->angle_out + rotate );\n      delta.x += stroker->center.x;\n      delta.y += stroker->center.y;\n\n      border->movable = FALSE;\n    }\n    else\n    {\n      /* compute median angle */\n      phi = stroker->angle_in + theta;\n\n      thcos = FT_Cos( theta );\n\n      length = FT_DivFix( stroker->radius, thcos );\n\n      FT_Vector_From_Polar( &delta, length, phi + rotate );\n      delta.x += stroker->center.x;\n      delta.y += stroker->center.y;\n    }\n\n    error = ft_stroke_border_lineto( border, &delta, FALSE );\n\n    return error;\n  }\n\n\n  /* process an outside corner, i.e. compute bevel/miter/round */\n  static FT_Error\n  ft_stroker_outside( FT_Stroker  stroker,\n                      FT_Int      side,\n                      FT_Fixed    line_length )\n  {\n    FT_StrokeBorder  border = stroker->borders + side;\n    FT_Error         error;\n    FT_Angle         rotate;\n\n\n    if ( stroker->line_join == FT_STROKER_LINEJOIN_ROUND )\n      error = ft_stroker_arcto( stroker, side );\n    else\n    {\n      /* this is a mitered (pointed) or beveled (truncated) corner */\n      FT_Fixed  sigma = 0, radius = stroker->radius;\n      FT_Angle  theta = 0, phi = 0;\n      FT_Fixed  thcos = 0;\n      FT_Bool   bevel, fixed_bevel;\n\n\n      rotate = FT_SIDE_TO_ROTATE( side );\n\n      bevel =\n        FT_BOOL( stroker->line_join == FT_STROKER_LINEJOIN_BEVEL );\n\n      fixed_bevel =\n        FT_BOOL( stroker->line_join != FT_STROKER_LINEJOIN_MITER_VARIABLE );\n\n      if ( !bevel )\n      {\n        theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out );\n\n        if ( theta == FT_ANGLE_PI )\n        {\n          theta = rotate;\n          phi   = stroker->angle_in;\n        }\n        else\n        {\n          theta /= 2;\n          phi    = stroker->angle_in + theta + rotate;\n        }\n\n        thcos = FT_Cos( theta );\n        sigma = FT_MulFix( stroker->miter_limit, thcos );\n\n        /* is miter limit exceeded? */\n        if ( sigma < 0x10000L )\n        {\n          /* don't create variable bevels for very small deviations; */\n          /* FT_Sin(x) = 0 for x <= 57                               */\n          if ( fixed_bevel || ft_pos_abs( theta ) > 57 )\n            bevel = TRUE;\n        }\n      }\n\n      if ( bevel )  /* this is a bevel (broken angle) */\n      {\n        if ( fixed_bevel )\n        {\n          /* the outer corners are simply joined together */\n          FT_Vector  delta;\n\n\n          /* add bevel */\n          FT_Vector_From_Polar( &delta,\n                                radius,\n                                stroker->angle_out + rotate );\n          delta.x += stroker->center.x;\n          delta.y += stroker->center.y;\n\n          border->movable = FALSE;\n          error = ft_stroke_border_lineto( border, &delta, FALSE );\n        }\n        else /* variable bevel */\n        {\n          /* the miter is truncated */\n          FT_Vector  middle, delta;\n          FT_Fixed   length;\n\n\n          /* compute middle point */\n          FT_Vector_From_Polar( &middle,\n                                FT_MulFix( radius, stroker->miter_limit ),\n                                phi );\n          middle.x += stroker->center.x;\n          middle.y += stroker->center.y;\n\n          /* compute first angle point */\n          length = FT_MulDiv( radius, 0x10000L - sigma,\n                              ft_pos_abs( FT_Sin( theta ) ) );\n\n          FT_Vector_From_Polar( &delta, length, phi + rotate );\n          delta.x += middle.x;\n          delta.y += middle.y;\n\n          error = ft_stroke_border_lineto( border, &delta, FALSE );\n          if ( error )\n            goto Exit;\n\n          /* compute second angle point */\n          FT_Vector_From_Polar( &delta, length, phi - rotate );\n          delta.x += middle.x;\n          delta.y += middle.y;\n\n          error = ft_stroke_border_lineto( border, &delta, FALSE );\n          if ( error )\n            goto Exit;\n\n          /* finally, add an end point; only needed if not lineto */\n          /* (line_length is zero for curves)                     */\n          if ( line_length == 0 )\n          {\n            FT_Vector_From_Polar( &delta,\n                                  radius,\n                                  stroker->angle_out + rotate );\n\n            delta.x += stroker->center.x;\n            delta.y += stroker->center.y;\n\n            error = ft_stroke_border_lineto( border, &delta, FALSE );\n          }\n        }\n      }\n      else /* this is a miter (intersection) */\n      {\n        FT_Fixed   length;\n        FT_Vector  delta;\n\n\n        length = FT_DivFix( stroker->radius, thcos );\n\n        FT_Vector_From_Polar( &delta, length, phi );\n        delta.x += stroker->center.x;\n        delta.y += stroker->center.y;\n\n        error = ft_stroke_border_lineto( border, &delta, FALSE );\n        if ( error )\n          goto Exit;\n\n        /* now add an end point; only needed if not lineto */\n        /* (line_length is zero for curves)                */\n        if ( line_length == 0 )\n        {\n          FT_Vector_From_Polar( &delta,\n                                stroker->radius,\n                                stroker->angle_out + rotate );\n          delta.x += stroker->center.x;\n          delta.y += stroker->center.y;\n\n          error = ft_stroke_border_lineto( border, &delta, FALSE );\n        }\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  ft_stroker_process_corner( FT_Stroker  stroker,\n                             FT_Fixed    line_length )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_Angle  turn;\n    FT_Int    inside_side;\n\n\n    turn = FT_Angle_Diff( stroker->angle_in, stroker->angle_out );\n\n    /* no specific corner processing is required if the turn is 0 */\n    if ( turn == 0 )\n      goto Exit;\n\n    /* when we turn to the right, the inside side is 0 */\n    inside_side = 0;\n\n    /* otherwise, the inside side is 1 */\n    if ( turn < 0 )\n      inside_side = 1;\n\n    /* process the inside side */\n    error = ft_stroker_inside( stroker, inside_side, line_length );\n    if ( error )\n      goto Exit;\n\n    /* process the outside side */\n    error = ft_stroker_outside( stroker, 1 - inside_side, line_length );\n\n  Exit:\n    return error;\n  }\n\n\n  /* add two points to the left and right borders corresponding to the */\n  /* start of the subpath                                              */\n  static FT_Error\n  ft_stroker_subpath_start( FT_Stroker  stroker,\n                            FT_Angle    start_angle,\n                            FT_Fixed    line_length )\n  {\n    FT_Vector        delta;\n    FT_Vector        point;\n    FT_Error         error;\n    FT_StrokeBorder  border;\n\n\n    FT_Vector_From_Polar( &delta, stroker->radius,\n                          start_angle + FT_ANGLE_PI2 );\n\n    point.x = stroker->center.x + delta.x;\n    point.y = stroker->center.y + delta.y;\n\n    border = stroker->borders;\n    error = ft_stroke_border_moveto( border, &point );\n    if ( error )\n      goto Exit;\n\n    point.x = stroker->center.x - delta.x;\n    point.y = stroker->center.y - delta.y;\n\n    border++;\n    error = ft_stroke_border_moveto( border, &point );\n\n    /* save angle, position, and line length for last join */\n    /* (line_length is zero for curves)                    */\n    stroker->subpath_angle       = start_angle;\n    stroker->first_point         = FALSE;\n    stroker->subpath_line_length = line_length;\n\n  Exit:\n    return error;\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Stroker_LineTo( FT_Stroker  stroker,\n                     FT_Vector*  to )\n  {\n    FT_Error         error = FT_Err_Ok;\n    FT_StrokeBorder  border;\n    FT_Vector        delta;\n    FT_Angle         angle;\n    FT_Int           side;\n    FT_Fixed         line_length;\n\n\n    delta.x = to->x - stroker->center.x;\n    delta.y = to->y - stroker->center.y;\n\n    /* a zero-length lineto is a no-op; avoid creating a spurious corner */\n    if ( delta.x == 0 && delta.y == 0 )\n       goto Exit;\n\n    /* compute length of line */\n    line_length = FT_Vector_Length( &delta );\n\n    angle = FT_Atan2( delta.x, delta.y );\n    FT_Vector_From_Polar( &delta, stroker->radius, angle + FT_ANGLE_PI2 );\n\n    /* process corner if necessary */\n    if ( stroker->first_point )\n    {\n      /* This is the first segment of a subpath.  We need to     */\n      /* add a point to each border at their respective starting */\n      /* point locations.                                        */\n      error = ft_stroker_subpath_start( stroker, angle, line_length );\n      if ( error )\n        goto Exit;\n    }\n    else\n    {\n      /* process the current corner */\n      stroker->angle_out = angle;\n      error = ft_stroker_process_corner( stroker, line_length );\n      if ( error )\n        goto Exit;\n    }\n\n    /* now add a line segment to both the `inside' and `outside' paths */\n    for ( border = stroker->borders, side = 1; side >= 0; side--, border++ )\n    {\n      FT_Vector  point;\n\n\n      point.x = to->x + delta.x;\n      point.y = to->y + delta.y;\n\n      /* the ends of lineto borders are movable */\n      error = ft_stroke_border_lineto( border, &point, TRUE );\n      if ( error )\n        goto Exit;\n\n      delta.x = -delta.x;\n      delta.y = -delta.y;\n    }\n\n    stroker->angle_in    = angle;\n    stroker->center      = *to;\n    stroker->line_length = line_length;\n\n  Exit:\n    return error;\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Stroker_ConicTo( FT_Stroker  stroker,\n                      FT_Vector*  control,\n                      FT_Vector*  to )\n  {\n    FT_Error    error = FT_Err_Ok;\n    FT_Vector   bez_stack[34];\n    FT_Vector*  arc;\n    FT_Vector*  limit = bez_stack + 30;\n    FT_Bool     first_arc = TRUE;\n\n\n    /* if all control points are coincident, this is a no-op; */\n    /* avoid creating a spurious corner                       */\n    if ( FT_IS_SMALL( stroker->center.x - control->x ) &&\n         FT_IS_SMALL( stroker->center.y - control->y ) &&\n         FT_IS_SMALL( control->x        - to->x      ) &&\n         FT_IS_SMALL( control->y        - to->y      ) )\n    {\n       stroker->center = *to;\n       goto Exit;\n    }\n\n    arc    = bez_stack;\n    arc[0] = *to;\n    arc[1] = *control;\n    arc[2] = stroker->center;\n\n    while ( arc >= bez_stack )\n    {\n      FT_Angle  angle_in, angle_out;\n\n\n      /* initialize with current direction */\n      angle_in = angle_out = stroker->angle_in;\n\n      if ( arc < limit                                             &&\n           !ft_conic_is_small_enough( arc, &angle_in, &angle_out ) )\n      {\n        if ( stroker->first_point )\n          stroker->angle_in = angle_in;\n\n        ft_conic_split( arc );\n        arc += 2;\n        continue;\n      }\n\n      if ( first_arc )\n      {\n        first_arc = FALSE;\n\n        /* process corner if necessary */\n        if ( stroker->first_point )\n          error = ft_stroker_subpath_start( stroker, angle_in, 0 );\n        else\n        {\n          stroker->angle_out = angle_in;\n          error = ft_stroker_process_corner( stroker, 0 );\n        }\n      }\n      else if ( ft_pos_abs( FT_Angle_Diff( stroker->angle_in, angle_in ) ) >\n                  FT_SMALL_CONIC_THRESHOLD / 4                             )\n      {\n        /* if the deviation from one arc to the next is too great, */\n        /* add a round corner                                      */\n        stroker->center    = arc[2];\n        stroker->angle_out = angle_in;\n        stroker->line_join = FT_STROKER_LINEJOIN_ROUND;\n\n        error = ft_stroker_process_corner( stroker, 0 );\n\n        /* reinstate line join style */\n        stroker->line_join = stroker->line_join_saved;\n      }\n\n      if ( error )\n        goto Exit;\n\n      /* the arc's angle is small enough; we can add it directly to each */\n      /* border                                                          */\n      {\n        FT_Vector        ctrl, end;\n        FT_Angle         theta, phi, rotate, alpha0 = 0;\n        FT_Fixed         length;\n        FT_StrokeBorder  border;\n        FT_Int           side;\n\n\n        theta  = FT_Angle_Diff( angle_in, angle_out ) / 2;\n        phi    = angle_in + theta;\n        length = FT_DivFix( stroker->radius, FT_Cos( theta ) );\n\n        /* compute direction of original arc */\n        if ( stroker->handle_wide_strokes )\n          alpha0 = FT_Atan2( arc[0].x - arc[2].x, arc[0].y - arc[2].y );\n\n        for ( border = stroker->borders, side = 0;\n              side <= 1;\n              side++, border++ )\n        {\n          rotate = FT_SIDE_TO_ROTATE( side );\n\n          /* compute control point */\n          FT_Vector_From_Polar( &ctrl, length, phi + rotate );\n          ctrl.x += arc[1].x;\n          ctrl.y += arc[1].y;\n\n          /* compute end point */\n          FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate );\n          end.x += arc[0].x;\n          end.y += arc[0].y;\n\n          if ( stroker->handle_wide_strokes )\n          {\n            FT_Vector  start;\n            FT_Angle   alpha1;\n\n\n            /* determine whether the border radius is greater than the */\n            /* radius of curvature of the original arc                 */\n            start = border->points[border->num_points - 1];\n\n            alpha1 = FT_Atan2( end.x - start.x, end.y - start.y );\n\n            /* is the direction of the border arc opposite to */\n            /* that of the original arc? */\n            if ( ft_pos_abs( FT_Angle_Diff( alpha0, alpha1 ) ) >\n                   FT_ANGLE_PI / 2                             )\n            {\n              FT_Angle   beta, gamma;\n              FT_Vector  bvec, delta;\n              FT_Fixed   blen, sinA, sinB, alen;\n\n\n              /* use the sine rule to find the intersection point */\n              beta  = FT_Atan2( arc[2].x - start.x, arc[2].y - start.y );\n              gamma = FT_Atan2( arc[0].x - end.x,   arc[0].y - end.y );\n\n              bvec.x = end.x - start.x;\n              bvec.y = end.y - start.y;\n\n              blen = FT_Vector_Length( &bvec );\n\n              sinA = ft_pos_abs( FT_Sin( alpha1 - gamma ) );\n              sinB = ft_pos_abs( FT_Sin( beta - gamma ) );\n\n              alen = FT_MulDiv( blen, sinA, sinB );\n\n              FT_Vector_From_Polar( &delta, alen, beta );\n              delta.x += start.x;\n              delta.y += start.y;\n\n              /* circumnavigate the negative sector backwards */\n              border->movable = FALSE;\n              error = ft_stroke_border_lineto( border, &delta, FALSE );\n              if ( error )\n                goto Exit;\n              error = ft_stroke_border_lineto( border, &end, FALSE );\n              if ( error )\n                goto Exit;\n              error = ft_stroke_border_conicto( border, &ctrl, &start );\n              if ( error )\n                goto Exit;\n              /* and then move to the endpoint */\n              error = ft_stroke_border_lineto( border, &end, FALSE );\n              if ( error )\n                goto Exit;\n\n              continue;\n            }\n\n            /* else fall through */\n          }\n\n          /* simply add an arc */\n          error = ft_stroke_border_conicto( border, &ctrl, &end );\n          if ( error )\n            goto Exit;\n        }\n      }\n\n      arc -= 2;\n\n      stroker->angle_in = angle_out;\n    }\n\n    stroker->center = *to;\n\n  Exit:\n    return error;\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Stroker_CubicTo( FT_Stroker  stroker,\n                      FT_Vector*  control1,\n                      FT_Vector*  control2,\n                      FT_Vector*  to )\n  {\n    FT_Error    error = FT_Err_Ok;\n    FT_Vector   bez_stack[37];\n    FT_Vector*  arc;\n    FT_Vector*  limit = bez_stack + 32;\n    FT_Bool     first_arc = TRUE;\n\n\n    /* if all control points are coincident, this is a no-op; */\n    /* avoid creating a spurious corner */\n    if ( FT_IS_SMALL( stroker->center.x - control1->x ) &&\n         FT_IS_SMALL( stroker->center.y - control1->y ) &&\n         FT_IS_SMALL( control1->x       - control2->x ) &&\n         FT_IS_SMALL( control1->y       - control2->y ) &&\n         FT_IS_SMALL( control2->x       - to->x       ) &&\n         FT_IS_SMALL( control2->y       - to->y       ) )\n    {\n       stroker->center = *to;\n       goto Exit;\n    }\n\n    arc    = bez_stack;\n    arc[0] = *to;\n    arc[1] = *control2;\n    arc[2] = *control1;\n    arc[3] = stroker->center;\n\n    while ( arc >= bez_stack )\n    {\n      FT_Angle  angle_in, angle_mid, angle_out;\n\n\n      /* initialize with current direction */\n      angle_in = angle_out = angle_mid = stroker->angle_in;\n\n      if ( arc < limit                                         &&\n           !ft_cubic_is_small_enough( arc, &angle_in,\n                                      &angle_mid, &angle_out ) )\n      {\n        if ( stroker->first_point )\n          stroker->angle_in = angle_in;\n\n        ft_cubic_split( arc );\n        arc += 3;\n        continue;\n      }\n\n      if ( first_arc )\n      {\n        first_arc = FALSE;\n\n        /* process corner if necessary */\n        if ( stroker->first_point )\n          error = ft_stroker_subpath_start( stroker, angle_in, 0 );\n        else\n        {\n          stroker->angle_out = angle_in;\n          error = ft_stroker_process_corner( stroker, 0 );\n        }\n      }\n      else if ( ft_pos_abs( FT_Angle_Diff( stroker->angle_in, angle_in ) ) >\n                  FT_SMALL_CUBIC_THRESHOLD / 4                             )\n      {\n        /* if the deviation from one arc to the next is too great, */\n        /* add a round corner                                      */\n        stroker->center    = arc[3];\n        stroker->angle_out = angle_in;\n        stroker->line_join = FT_STROKER_LINEJOIN_ROUND;\n\n        error = ft_stroker_process_corner( stroker, 0 );\n\n        /* reinstate line join style */\n        stroker->line_join = stroker->line_join_saved;\n      }\n\n      if ( error )\n        goto Exit;\n\n      /* the arc's angle is small enough; we can add it directly to each */\n      /* border                                                          */\n      {\n        FT_Vector        ctrl1, ctrl2, end;\n        FT_Angle         theta1, phi1, theta2, phi2, rotate, alpha0 = 0;\n        FT_Fixed         length1, length2;\n        FT_StrokeBorder  border;\n        FT_Int           side;\n\n\n        theta1  = FT_Angle_Diff( angle_in,  angle_mid ) / 2;\n        theta2  = FT_Angle_Diff( angle_mid, angle_out ) / 2;\n        phi1    = ft_angle_mean( angle_in,  angle_mid );\n        phi2    = ft_angle_mean( angle_mid, angle_out );\n        length1 = FT_DivFix( stroker->radius, FT_Cos( theta1 ) );\n        length2 = FT_DivFix( stroker->radius, FT_Cos( theta2 ) );\n\n        /* compute direction of original arc */\n        if ( stroker->handle_wide_strokes )\n          alpha0 = FT_Atan2( arc[0].x - arc[3].x, arc[0].y - arc[3].y );\n\n        for ( border = stroker->borders, side = 0;\n              side <= 1;\n              side++, border++ )\n        {\n          rotate = FT_SIDE_TO_ROTATE( side );\n\n          /* compute control points */\n          FT_Vector_From_Polar( &ctrl1, length1, phi1 + rotate );\n          ctrl1.x += arc[2].x;\n          ctrl1.y += arc[2].y;\n\n          FT_Vector_From_Polar( &ctrl2, length2, phi2 + rotate );\n          ctrl2.x += arc[1].x;\n          ctrl2.y += arc[1].y;\n\n          /* compute end point */\n          FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate );\n          end.x += arc[0].x;\n          end.y += arc[0].y;\n\n          if ( stroker->handle_wide_strokes )\n          {\n            FT_Vector  start;\n            FT_Angle   alpha1;\n\n\n            /* determine whether the border radius is greater than the */\n            /* radius of curvature of the original arc                 */\n            start = border->points[border->num_points - 1];\n\n            alpha1 = FT_Atan2( end.x - start.x, end.y - start.y );\n\n            /* is the direction of the border arc opposite to */\n            /* that of the original arc? */\n            if ( ft_pos_abs( FT_Angle_Diff( alpha0, alpha1 ) ) >\n                   FT_ANGLE_PI / 2                             )\n            {\n              FT_Angle   beta, gamma;\n              FT_Vector  bvec, delta;\n              FT_Fixed   blen, sinA, sinB, alen;\n\n\n              /* use the sine rule to find the intersection point */\n              beta  = FT_Atan2( arc[3].x - start.x, arc[3].y - start.y );\n              gamma = FT_Atan2( arc[0].x - end.x,   arc[0].y - end.y );\n\n              bvec.x = end.x - start.x;\n              bvec.y = end.y - start.y;\n\n              blen = FT_Vector_Length( &bvec );\n\n              sinA = ft_pos_abs( FT_Sin( alpha1 - gamma ) );\n              sinB = ft_pos_abs( FT_Sin( beta - gamma ) );\n\n              alen = FT_MulDiv( blen, sinA, sinB );\n\n              FT_Vector_From_Polar( &delta, alen, beta );\n              delta.x += start.x;\n              delta.y += start.y;\n\n              /* circumnavigate the negative sector backwards */\n              border->movable = FALSE;\n              error = ft_stroke_border_lineto( border, &delta, FALSE );\n              if ( error )\n                goto Exit;\n              error = ft_stroke_border_lineto( border, &end, FALSE );\n              if ( error )\n                goto Exit;\n              error = ft_stroke_border_cubicto( border,\n                                                &ctrl2,\n                                                &ctrl1,\n                                                &start );\n              if ( error )\n                goto Exit;\n              /* and then move to the endpoint */\n              error = ft_stroke_border_lineto( border, &end, FALSE );\n              if ( error )\n                goto Exit;\n\n              continue;\n            }\n\n            /* else fall through */\n          }\n\n          /* simply add an arc */\n          error = ft_stroke_border_cubicto( border, &ctrl1, &ctrl2, &end );\n          if ( error )\n            goto Exit;\n        }\n      }\n\n      arc -= 3;\n\n      stroker->angle_in = angle_out;\n    }\n\n    stroker->center = *to;\n\n  Exit:\n    return error;\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Stroker_BeginSubPath( FT_Stroker  stroker,\n                           FT_Vector*  to,\n                           FT_Bool     open )\n  {\n    /* We cannot process the first point, because there is not enough      */\n    /* information regarding its corner/cap.  The latter will be processed */\n    /* in the `FT_Stroker_EndSubPath' routine.                             */\n    /*                                                                     */\n    stroker->first_point  = TRUE;\n    stroker->center       = *to;\n    stroker->subpath_open = open;\n\n    /* Determine if we need to check whether the border radius is greater */\n    /* than the radius of curvature of a curve, to handle this case       */\n    /* specially.  This is only required if bevel joins or butt caps may  */\n    /* be created, because round & miter joins and round & square caps    */\n    /* cover the negative sector created with wide strokes.               */\n    stroker->handle_wide_strokes =\n      FT_BOOL( stroker->line_join != FT_STROKER_LINEJOIN_ROUND  ||\n               ( stroker->subpath_open                        &&\n                 stroker->line_cap == FT_STROKER_LINECAP_BUTT ) );\n\n    /* record the subpath start point for each border */\n    stroker->subpath_start = *to;\n\n    stroker->angle_in = 0;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_Error\n  ft_stroker_add_reverse_left( FT_Stroker  stroker,\n                               FT_Bool     open )\n  {\n    FT_StrokeBorder  right = stroker->borders + 0;\n    FT_StrokeBorder  left  = stroker->borders + 1;\n    FT_Int           new_points;\n    FT_Error         error = FT_Err_Ok;\n\n\n    FT_ASSERT( left->start >= 0 );\n\n    new_points = left->num_points - left->start;\n    if ( new_points > 0 )\n    {\n      error = ft_stroke_border_grow( right, (FT_UInt)new_points );\n      if ( error )\n        goto Exit;\n\n      {\n        FT_Vector*  dst_point = right->points + right->num_points;\n        FT_Byte*    dst_tag   = right->tags   + right->num_points;\n        FT_Vector*  src_point = left->points  + left->num_points - 1;\n        FT_Byte*    src_tag   = left->tags    + left->num_points - 1;\n\n\n        while ( src_point >= left->points + left->start )\n        {\n          *dst_point = *src_point;\n          *dst_tag   = *src_tag;\n\n          if ( open )\n            dst_tag[0] &= ~FT_STROKE_TAG_BEGIN_END;\n          else\n          {\n            FT_Byte  ttag =\n                       (FT_Byte)( dst_tag[0] & FT_STROKE_TAG_BEGIN_END );\n\n\n            /* switch begin/end tags if necessary */\n            if ( ttag == FT_STROKE_TAG_BEGIN ||\n                 ttag == FT_STROKE_TAG_END   )\n              dst_tag[0] ^= FT_STROKE_TAG_BEGIN_END;\n          }\n\n          src_point--;\n          src_tag--;\n          dst_point++;\n          dst_tag++;\n        }\n      }\n\n      left->num_points   = left->start;\n      right->num_points += new_points;\n\n      right->movable = FALSE;\n      left->movable  = FALSE;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  /* there's a lot of magic in this function! */\n  FT_EXPORT_DEF( FT_Error )\n  FT_Stroker_EndSubPath( FT_Stroker  stroker )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    if ( stroker->subpath_open )\n    {\n      FT_StrokeBorder  right = stroker->borders;\n\n\n      /* All right, this is an opened path, we need to add a cap between */\n      /* right & left, add the reverse of left, then add a final cap     */\n      /* between left & right.                                           */\n      error = ft_stroker_cap( stroker, stroker->angle_in, 0 );\n      if ( error )\n        goto Exit;\n\n      /* add reversed points from `left' to `right' */\n      error = ft_stroker_add_reverse_left( stroker, TRUE );\n      if ( error )\n        goto Exit;\n\n      /* now add the final cap */\n      stroker->center = stroker->subpath_start;\n      error = ft_stroker_cap( stroker,\n                              stroker->subpath_angle + FT_ANGLE_PI, 0 );\n      if ( error )\n        goto Exit;\n\n      /* Now end the right subpath accordingly.  The left one is */\n      /* rewind and doesn't need further processing.             */\n      ft_stroke_border_close( right, FALSE );\n    }\n    else\n    {\n      FT_Angle  turn;\n      FT_Int    inside_side;\n\n\n      /* close the path if needed */\n      if ( stroker->center.x != stroker->subpath_start.x ||\n           stroker->center.y != stroker->subpath_start.y )\n      {\n         error = FT_Stroker_LineTo( stroker, &stroker->subpath_start );\n         if ( error )\n           goto Exit;\n      }\n\n      /* process the corner */\n      stroker->angle_out = stroker->subpath_angle;\n      turn               = FT_Angle_Diff( stroker->angle_in,\n                                          stroker->angle_out );\n\n      /* no specific corner processing is required if the turn is 0 */\n      if ( turn != 0 )\n      {\n        /* when we turn to the right, the inside side is 0 */\n        inside_side = 0;\n\n        /* otherwise, the inside side is 1 */\n        if ( turn < 0 )\n          inside_side = 1;\n\n        error = ft_stroker_inside( stroker,\n                                   inside_side,\n                                   stroker->subpath_line_length );\n        if ( error )\n          goto Exit;\n\n        /* process the outside side */\n        error = ft_stroker_outside( stroker,\n                                    1 - inside_side,\n                                    stroker->subpath_line_length );\n        if ( error )\n          goto Exit;\n      }\n\n      /* then end our two subpaths */\n      ft_stroke_border_close( stroker->borders + 0, FALSE );\n      ft_stroke_border_close( stroker->borders + 1, TRUE );\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Stroker_GetBorderCounts( FT_Stroker        stroker,\n                              FT_StrokerBorder  border,\n                              FT_UInt          *anum_points,\n                              FT_UInt          *anum_contours )\n  {\n    FT_UInt   num_points = 0, num_contours = 0;\n    FT_Error  error;\n\n\n    if ( !stroker || border > 1 )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    error = ft_stroke_border_get_counts( stroker->borders + border,\n                                         &num_points, &num_contours );\n  Exit:\n    if ( anum_points )\n      *anum_points = num_points;\n\n    if ( anum_contours )\n      *anum_contours = num_contours;\n\n    return error;\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Stroker_GetCounts( FT_Stroker  stroker,\n                        FT_UInt    *anum_points,\n                        FT_UInt    *anum_contours )\n  {\n    FT_UInt   count1, count2, num_points   = 0;\n    FT_UInt   count3, count4, num_contours = 0;\n    FT_Error  error;\n\n\n    error = ft_stroke_border_get_counts( stroker->borders + 0,\n                                         &count1, &count2 );\n    if ( error )\n      goto Exit;\n\n    error = ft_stroke_border_get_counts( stroker->borders + 1,\n                                         &count3, &count4 );\n    if ( error )\n      goto Exit;\n\n    num_points   = count1 + count3;\n    num_contours = count2 + count4;\n\n  Exit:\n    *anum_points   = num_points;\n    *anum_contours = num_contours;\n    return error;\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Stroker_ExportBorder( FT_Stroker        stroker,\n                           FT_StrokerBorder  border,\n                           FT_Outline*       outline )\n  {\n    if ( border == FT_STROKER_BORDER_LEFT  ||\n         border == FT_STROKER_BORDER_RIGHT )\n    {\n      FT_StrokeBorder  sborder = & stroker->borders[border];\n\n\n      if ( sborder->valid )\n        ft_stroke_border_export( sborder, outline );\n    }\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Stroker_Export( FT_Stroker   stroker,\n                     FT_Outline*  outline )\n  {\n    FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_LEFT, outline );\n    FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_RIGHT, outline );\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  /*\n   *  The following is very similar to FT_Outline_Decompose, except\n   *  that we do support opened paths, and do not scale the outline.\n   */\n  FT_EXPORT_DEF( FT_Error )\n  FT_Stroker_ParseOutline( FT_Stroker   stroker,\n                           FT_Outline*  outline,\n                           FT_Bool      opened )\n  {\n    FT_Vector   v_last;\n    FT_Vector   v_control;\n    FT_Vector   v_start;\n\n    FT_Vector*  point;\n    FT_Vector*  limit;\n    char*       tags;\n\n    FT_Error    error;\n\n    FT_Int      n;         /* index of contour in outline     */\n    FT_UInt     first;     /* index of first point in contour */\n    FT_Int      tag;       /* current point's state           */\n\n\n    if ( !outline || !stroker )\n      return FT_THROW( Invalid_Argument );\n\n    FT_Stroker_Rewind( stroker );\n\n    first = 0;\n\n    for ( n = 0; n < outline->n_contours; n++ )\n    {\n      FT_UInt  last;  /* index of last point in contour */\n\n\n      last  = outline->contours[n];\n      limit = outline->points + last;\n\n      /* skip empty points; we don't stroke these */\n      if ( last <= first )\n      {\n        first = last + 1;\n        continue;\n      }\n\n      v_start = outline->points[first];\n      v_last  = outline->points[last];\n\n      v_control = v_start;\n\n      point = outline->points + first;\n      tags  = outline->tags   + first;\n      tag   = FT_CURVE_TAG( tags[0] );\n\n      /* A contour cannot start with a cubic control point! */\n      if ( tag == FT_CURVE_TAG_CUBIC )\n        goto Invalid_Outline;\n\n      /* check first point to determine origin */\n      if ( tag == FT_CURVE_TAG_CONIC )\n      {\n        /* First point is conic control.  Yes, this happens. */\n        if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON )\n        {\n          /* start at last point if it is on the curve */\n          v_start = v_last;\n          limit--;\n        }\n        else\n        {\n          /* if both first and last points are conic, */\n          /* start at their middle                    */\n          v_start.x = ( v_start.x + v_last.x ) / 2;\n          v_start.y = ( v_start.y + v_last.y ) / 2;\n        }\n        point--;\n        tags--;\n      }\n\n      error = FT_Stroker_BeginSubPath( stroker, &v_start, opened );\n      if ( error )\n        goto Exit;\n\n      while ( point < limit )\n      {\n        point++;\n        tags++;\n\n        tag = FT_CURVE_TAG( tags[0] );\n        switch ( tag )\n        {\n        case FT_CURVE_TAG_ON:  /* emit a single line_to */\n          {\n            FT_Vector  vec;\n\n\n            vec.x = point->x;\n            vec.y = point->y;\n\n            error = FT_Stroker_LineTo( stroker, &vec );\n            if ( error )\n              goto Exit;\n            continue;\n          }\n\n        case FT_CURVE_TAG_CONIC:  /* consume conic arcs */\n          v_control.x = point->x;\n          v_control.y = point->y;\n\n        Do_Conic:\n          if ( point < limit )\n          {\n            FT_Vector  vec;\n            FT_Vector  v_middle;\n\n\n            point++;\n            tags++;\n            tag = FT_CURVE_TAG( tags[0] );\n\n            vec = point[0];\n\n            if ( tag == FT_CURVE_TAG_ON )\n            {\n              error = FT_Stroker_ConicTo( stroker, &v_control, &vec );\n              if ( error )\n                goto Exit;\n              continue;\n            }\n\n            if ( tag != FT_CURVE_TAG_CONIC )\n              goto Invalid_Outline;\n\n            v_middle.x = ( v_control.x + vec.x ) / 2;\n            v_middle.y = ( v_control.y + vec.y ) / 2;\n\n            error = FT_Stroker_ConicTo( stroker, &v_control, &v_middle );\n            if ( error )\n              goto Exit;\n\n            v_control = vec;\n            goto Do_Conic;\n          }\n\n          error = FT_Stroker_ConicTo( stroker, &v_control, &v_start );\n          goto Close;\n\n        default:  /* FT_CURVE_TAG_CUBIC */\n          {\n            FT_Vector  vec1, vec2;\n\n\n            if ( point + 1 > limit                             ||\n                 FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )\n              goto Invalid_Outline;\n\n            point += 2;\n            tags  += 2;\n\n            vec1 = point[-2];\n            vec2 = point[-1];\n\n            if ( point <= limit )\n            {\n              FT_Vector  vec;\n\n\n              vec = point[0];\n\n              error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &vec );\n              if ( error )\n                goto Exit;\n              continue;\n            }\n\n            error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &v_start );\n            goto Close;\n          }\n        }\n      }\n\n    Close:\n      if ( error )\n        goto Exit;\n\n      /* don't try to end the path if no segments have been generated */\n      if ( !stroker->first_point )\n      {\n        error = FT_Stroker_EndSubPath( stroker );\n        if ( error )\n          goto Exit;\n      }\n\n      first = last + 1;\n    }\n\n    return FT_Err_Ok;\n\n  Exit:\n    return error;\n\n  Invalid_Outline:\n    return FT_THROW( Invalid_Outline );\n  }\n\n\n  /* declare an extern to access `ft_outline_glyph_class' globally     */\n  /* allocated  in `ftglyph.c', and use the FT_OUTLINE_GLYPH_CLASS_GET */\n  /* macro to access it when FT_CONFIG_OPTION_PIC is defined           */\n#ifndef FT_CONFIG_OPTION_PIC\n  extern const FT_Glyph_Class  ft_outline_glyph_class;\n#endif\n#include \"basepic.h\"\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Glyph_Stroke( FT_Glyph    *pglyph,\n                   FT_Stroker   stroker,\n                   FT_Bool      destroy )\n  {\n    FT_Error    error   = FT_ERR( Invalid_Argument );\n    FT_Glyph    glyph   = NULL;\n    FT_Library  library = stroker->library;\n\n    FT_UNUSED( library );\n\n\n    if ( pglyph == NULL )\n      goto Exit;\n\n    glyph = *pglyph;\n    if ( glyph == NULL || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET )\n      goto Exit;\n\n    {\n      FT_Glyph  copy;\n\n\n      error = FT_Glyph_Copy( glyph, &copy );\n      if ( error )\n        goto Exit;\n\n      glyph = copy;\n    }\n\n    {\n      FT_OutlineGlyph  oglyph  = (FT_OutlineGlyph)glyph;\n      FT_Outline*      outline = &oglyph->outline;\n      FT_UInt          num_points, num_contours;\n\n\n      error = FT_Stroker_ParseOutline( stroker, outline, FALSE );\n      if ( error )\n        goto Fail;\n\n      (void)FT_Stroker_GetCounts( stroker, &num_points, &num_contours );\n\n      FT_Outline_Done( glyph->library, outline );\n\n      error = FT_Outline_New( glyph->library,\n                              num_points, num_contours, outline );\n      if ( error )\n        goto Fail;\n\n      outline->n_points   = 0;\n      outline->n_contours = 0;\n\n      FT_Stroker_Export( stroker, outline );\n    }\n\n    if ( destroy )\n      FT_Done_Glyph( *pglyph );\n\n    *pglyph = glyph;\n    goto Exit;\n\n  Fail:\n    FT_Done_Glyph( glyph );\n    glyph = NULL;\n\n    if ( !destroy )\n      *pglyph = NULL;\n\n  Exit:\n    return error;\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Glyph_StrokeBorder( FT_Glyph    *pglyph,\n                         FT_Stroker   stroker,\n                         FT_Bool      inside,\n                         FT_Bool      destroy )\n  {\n    FT_Error    error   = FT_ERR( Invalid_Argument );\n    FT_Glyph    glyph   = NULL;\n    FT_Library  library = stroker->library;\n\n    FT_UNUSED( library );\n\n\n    if ( pglyph == NULL )\n      goto Exit;\n\n    glyph = *pglyph;\n    if ( glyph == NULL || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET )\n      goto Exit;\n\n    {\n      FT_Glyph  copy;\n\n\n      error = FT_Glyph_Copy( glyph, &copy );\n      if ( error )\n        goto Exit;\n\n      glyph = copy;\n    }\n\n    {\n      FT_OutlineGlyph   oglyph  = (FT_OutlineGlyph)glyph;\n      FT_StrokerBorder  border;\n      FT_Outline*       outline = &oglyph->outline;\n      FT_UInt           num_points, num_contours;\n\n\n      border = FT_Outline_GetOutsideBorder( outline );\n      if ( inside )\n      {\n        if ( border == FT_STROKER_BORDER_LEFT )\n          border = FT_STROKER_BORDER_RIGHT;\n        else\n          border = FT_STROKER_BORDER_LEFT;\n      }\n\n      error = FT_Stroker_ParseOutline( stroker, outline, FALSE );\n      if ( error )\n        goto Fail;\n\n      (void)FT_Stroker_GetBorderCounts( stroker, border,\n                                        &num_points, &num_contours );\n\n      FT_Outline_Done( glyph->library, outline );\n\n      error = FT_Outline_New( glyph->library,\n                              num_points,\n                              num_contours,\n                              outline );\n      if ( error )\n        goto Fail;\n\n      outline->n_points   = 0;\n      outline->n_contours = 0;\n\n      FT_Stroker_ExportBorder( stroker, border, outline );\n    }\n\n    if ( destroy )\n      FT_Done_Glyph( *pglyph );\n\n    *pglyph = glyph;\n    goto Exit;\n\n  Fail:\n    FT_Done_Glyph( glyph );\n    glyph = NULL;\n\n    if ( !destroy )\n      *pglyph = NULL;\n\n  Exit:\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftsynth.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftsynth.c                                                              */\n/*                                                                         */\n/*    FreeType synthesizing code for emboldening and slanting (body).      */\n/*                                                                         */\n/*  Copyright 2000-2006, 2010, 2012 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/ftsynth.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/ftoutln.h\"\n#include \"../../include/freetype/ftbitmap.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_synth\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****   EXPERIMENTAL OBLIQUING SUPPORT                                ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* documentation is in ftsynth.h */\n\n  FT_EXPORT_DEF( void )\n  FT_GlyphSlot_Oblique( FT_GlyphSlot  slot )\n  {\n    FT_Matrix    transform;\n    FT_Outline*  outline = &slot->outline;\n\n\n    /* only oblique outline glyphs */\n    if ( slot->format != FT_GLYPH_FORMAT_OUTLINE )\n      return;\n\n    /* we don't touch the advance width */\n\n    /* For italic, simply apply a shear transform, with an angle */\n    /* of about 12 degrees.                                      */\n\n    transform.xx = 0x10000L;\n    transform.yx = 0x00000L;\n\n    transform.xy = 0x0366AL;\n    transform.yy = 0x10000L;\n\n    FT_Outline_Transform( outline, &transform );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****   EXPERIMENTAL EMBOLDENING SUPPORT                              ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* documentation is in ftsynth.h */\n\n  FT_EXPORT_DEF( void )\n  FT_GlyphSlot_Embolden( FT_GlyphSlot  slot )\n  {\n    FT_Library  library = slot->library;\n    FT_Face     face    = slot->face;\n    FT_Error    error;\n    FT_Pos      xstr, ystr;\n\n\n    if ( slot->format != FT_GLYPH_FORMAT_OUTLINE &&\n         slot->format != FT_GLYPH_FORMAT_BITMAP  )\n      return;\n\n    /* some reasonable strength */\n    xstr = FT_MulFix( face->units_per_EM,\n                      face->size->metrics.y_scale ) / 24;\n    ystr = xstr;\n\n    if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )\n    {\n      /* ignore error */\n      (void)FT_Outline_EmboldenXY( &slot->outline, xstr, ystr );\n    }\n    else /* slot->format == FT_GLYPH_FORMAT_BITMAP */\n    {\n      /* round to full pixels */\n      xstr &= ~63;\n      if ( xstr == 0 )\n        xstr = 1 << 6;\n      ystr &= ~63;\n\n      /*\n       * XXX: overflow check for 16-bit system, for compatibility\n       *      with FT_GlyphSlot_Embolden() since freetype-2.1.10.\n       *      unfortunately, this function return no informations\n       *      about the cause of error.\n       */\n      if ( ( ystr >> 6 ) > FT_INT_MAX || ( ystr >> 6 ) < FT_INT_MIN )\n      {\n        FT_TRACE1(( \"FT_GlyphSlot_Embolden:\" ));\n        FT_TRACE1(( \"too strong embolding parameter ystr=%d\\n\", ystr ));\n        return;\n      }\n      error = FT_GlyphSlot_Own_Bitmap( slot );\n      if ( error )\n        return;\n\n      error = FT_Bitmap_Embolden( library, &slot->bitmap, xstr, ystr );\n      if ( error )\n        return;\n    }\n\n    if ( slot->advance.x )\n      slot->advance.x += xstr;\n\n    if ( slot->advance.y )\n      slot->advance.y += ystr;\n\n    slot->metrics.width       += xstr;\n    slot->metrics.height      += ystr;\n    slot->metrics.horiAdvance += xstr;\n    slot->metrics.vertAdvance += ystr;\n\n    /* XXX: 16-bit overflow case must be excluded before here */\n    if ( slot->format == FT_GLYPH_FORMAT_BITMAP )\n      slot->bitmap_top += (FT_Int)( ystr >> 6 );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttrigon.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  fttrigon.c                                                             */\n/*                                                                         */\n/*    FreeType trigonometric functions (body).                             */\n/*                                                                         */\n/*  Copyright 2001-2005, 2012-2013 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This is a fixed-point CORDIC implementation of trigonometric          */\n  /* functions as well as transformations between Cartesian and polar      */\n  /* coordinates.  The angles are represented as 16.16 fixed-point values  */\n  /* in degrees, i.e., the angular resolution is 2^-16 degrees.  Note that */\n  /* only vectors longer than 2^16*180/pi (or at least 22 bits) on a       */\n  /* discrete Cartesian grid can have the same or better angular           */\n  /* resolution.  Therefore, to maintain this precision, some functions    */\n  /* require an interim upscaling of the vectors, whereas others operate   */\n  /* with 24-bit long vectors directly.                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/internal/ftcalc.h\"\n#include \"../../include/freetype/fttrigon.h\"\n\n\n  /* the Cordic shrink factor 0.858785336480436 * 2^32 */\n#define FT_TRIG_SCALE      0xDBD95B16UL\n\n  /* the highest bit in overflow-safe vector components, */\n  /* MSB of 0.858785336480436 * sqrt(0.5) * 2^30         */\n#define FT_TRIG_SAFE_MSB   29\n\n  /* this table was generated for FT_PI = 180L << 16, i.e. degrees */\n#define FT_TRIG_MAX_ITERS  23\n\n  static const FT_Fixed\n  ft_trig_arctan_table[] =\n  {\n    1740967L, 919879L, 466945L, 234379L, 117304L, 58666L, 29335L,\n    14668L, 7334L, 3667L, 1833L, 917L, 458L, 229L, 115L,\n    57L, 29L, 14L, 7L, 4L, 2L, 1L\n  };\n\n\n#ifdef FT_LONG64\n\n  /* multiply a given value by the CORDIC shrink factor */\n  static FT_Fixed\n  ft_trig_downscale( FT_Fixed  val )\n  {\n    FT_Fixed  s;\n    FT_Int64  v;\n\n\n    s   = val;\n    val = FT_ABS( val );\n\n    v   = ( val * (FT_Int64)FT_TRIG_SCALE ) + 0x100000000UL;\n    val = (FT_Fixed)( v >> 32 );\n\n    return ( s >= 0 ) ? val : -val;\n  }\n\n#else /* !FT_LONG64 */\n\n  /* multiply a given value by the CORDIC shrink factor */\n  static FT_Fixed\n  ft_trig_downscale( FT_Fixed  val )\n  {\n    FT_Fixed   s;\n    FT_UInt32  v1, v2, k1, k2, hi, lo1, lo2, lo3;\n\n\n    s   = val;\n    val = FT_ABS( val );\n\n    v1 = (FT_UInt32)val >> 16;\n    v2 = (FT_UInt32)( val & 0xFFFFL );\n\n    k1 = (FT_UInt32)FT_TRIG_SCALE >> 16;           /* constant */\n    k2 = (FT_UInt32)( FT_TRIG_SCALE & 0xFFFFL );   /* constant */\n\n    hi   = k1 * v1;\n    lo1  = k1 * v2 + k2 * v1;       /* can't overflow */\n\n    lo2  = ( k2 * v2 ) >> 16;\n    lo3  = FT_MAX( lo1, lo2 );\n    lo1 += lo2;\n\n    hi  += lo1 >> 16;\n    if ( lo1 < lo3 )\n      hi += (FT_UInt32)0x10000UL;\n\n    val  = (FT_Fixed)hi;\n\n    return ( s >= 0 ) ? val : -val;\n  }\n\n#endif /* !FT_LONG64 */\n\n\n  static FT_Int\n  ft_trig_prenorm( FT_Vector*  vec )\n  {\n    FT_Pos  x, y;\n    FT_Int  shift;\n\n\n    x = vec->x;\n    y = vec->y;\n\n    shift = FT_MSB( FT_ABS( x ) | FT_ABS( y ) );\n\n    if ( shift <= FT_TRIG_SAFE_MSB )\n    {\n      shift  = FT_TRIG_SAFE_MSB - shift;\n      vec->x = (FT_Pos)( (FT_ULong)x << shift );\n      vec->y = (FT_Pos)( (FT_ULong)y << shift );\n    }\n    else\n    {\n      shift -= FT_TRIG_SAFE_MSB;\n      vec->x = x >> shift;\n      vec->y = y >> shift;\n      shift  = -shift;\n    }\n\n    return shift;\n  }\n\n\n  static void\n  ft_trig_pseudo_rotate( FT_Vector*  vec,\n                         FT_Angle    theta )\n  {\n    FT_Int           i;\n    FT_Fixed         x, y, xtemp, b;\n    const FT_Fixed  *arctanptr;\n\n\n    x = vec->x;\n    y = vec->y;\n\n    /* Rotate inside [-PI/4,PI/4] sector */\n    while ( theta < -FT_ANGLE_PI4 )\n    {\n      xtemp  =  y;\n      y      = -x;\n      x      =  xtemp;\n      theta +=  FT_ANGLE_PI2;\n    }\n\n    while ( theta > FT_ANGLE_PI4 )\n    {\n      xtemp  = -y;\n      y      =  x;\n      x      =  xtemp;\n      theta -=  FT_ANGLE_PI2;\n    }\n\n    arctanptr = ft_trig_arctan_table;\n\n    /* Pseudorotations, with right shifts */\n    for ( i = 1, b = 1; i < FT_TRIG_MAX_ITERS; b <<= 1, i++ )\n    {\n      if ( theta < 0 )\n      {\n        xtemp  = x + ( ( y + b ) >> i );\n        y      = y - ( ( x + b ) >> i );\n        x      = xtemp;\n        theta += *arctanptr++;\n      }\n      else\n      {\n        xtemp  = x - ( ( y + b ) >> i );\n        y      = y + ( ( x + b ) >> i );\n        x      = xtemp;\n        theta -= *arctanptr++;\n      }\n    }\n\n    vec->x = x;\n    vec->y = y;\n  }\n\n\n  static void\n  ft_trig_pseudo_polarize( FT_Vector*  vec )\n  {\n    FT_Angle         theta;\n    FT_Int           i;\n    FT_Fixed         x, y, xtemp, b;\n    const FT_Fixed  *arctanptr;\n\n\n    x = vec->x;\n    y = vec->y;\n\n    /* Get the vector into [-PI/4,PI/4] sector */\n    if ( y > x )\n    {\n      if ( y > -x )\n      {\n        theta =  FT_ANGLE_PI2;\n        xtemp =  y;\n        y     = -x;\n        x     =  xtemp;\n      }\n      else\n      {\n        theta =  y > 0 ? FT_ANGLE_PI : -FT_ANGLE_PI;\n        x     = -x;\n        y     = -y;\n      }\n    }\n    else\n    {\n      if ( y < -x )\n      {\n        theta = -FT_ANGLE_PI2;\n        xtemp = -y;\n        y     =  x;\n        x     =  xtemp;\n      }\n      else\n      {\n        theta = 0;\n      }\n    }\n\n    arctanptr = ft_trig_arctan_table;\n\n    /* Pseudorotations, with right shifts */\n    for ( i = 1, b = 1; i < FT_TRIG_MAX_ITERS; b <<= 1, i++ )\n    {\n      if ( y > 0 )\n      {\n        xtemp  = x + ( ( y + b ) >> i );\n        y      = y - ( ( x + b ) >> i );\n        x      = xtemp;\n        theta += *arctanptr++;\n      }\n      else\n      {\n        xtemp  = x - ( ( y + b ) >> i );\n        y      = y + ( ( x + b ) >> i );\n        x      = xtemp;\n        theta -= *arctanptr++;\n      }\n    }\n\n    /* round theta */\n    if ( theta >= 0 )\n      theta = FT_PAD_ROUND( theta, 32 );\n    else\n      theta = -FT_PAD_ROUND( -theta, 32 );\n\n    vec->x = x;\n    vec->y = theta;\n  }\n\n\n  /* documentation is in fttrigon.h */\n\n  FT_EXPORT_DEF( FT_Fixed )\n  FT_Cos( FT_Angle  angle )\n  {\n    FT_Vector  v;\n\n\n    v.x = FT_TRIG_SCALE >> 8;\n    v.y = 0;\n    ft_trig_pseudo_rotate( &v, angle );\n\n    return ( v.x + 0x80L ) >> 8;\n  }\n\n\n  /* documentation is in fttrigon.h */\n\n  FT_EXPORT_DEF( FT_Fixed )\n  FT_Sin( FT_Angle  angle )\n  {\n    return FT_Cos( FT_ANGLE_PI2 - angle );\n  }\n\n\n  /* documentation is in fttrigon.h */\n\n  FT_EXPORT_DEF( FT_Fixed )\n  FT_Tan( FT_Angle  angle )\n  {\n    FT_Vector  v;\n\n\n    v.x = FT_TRIG_SCALE >> 8;\n    v.y = 0;\n    ft_trig_pseudo_rotate( &v, angle );\n\n    return FT_DivFix( v.y, v.x );\n  }\n\n\n  /* documentation is in fttrigon.h */\n\n  FT_EXPORT_DEF( FT_Angle )\n  FT_Atan2( FT_Fixed  dx,\n            FT_Fixed  dy )\n  {\n    FT_Vector  v;\n\n\n    if ( dx == 0 && dy == 0 )\n      return 0;\n\n    v.x = dx;\n    v.y = dy;\n    ft_trig_prenorm( &v );\n    ft_trig_pseudo_polarize( &v );\n\n    return v.y;\n  }\n\n\n  /* documentation is in fttrigon.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Vector_Unit( FT_Vector*  vec,\n                  FT_Angle    angle )\n  {\n    vec->x = FT_TRIG_SCALE >> 8;\n    vec->y = 0;\n    ft_trig_pseudo_rotate( vec, angle );\n    vec->x = ( vec->x + 0x80L ) >> 8;\n    vec->y = ( vec->y + 0x80L ) >> 8;\n  }\n\n\n  /* these macros return 0 for positive numbers,\n     and -1 for negative ones */\n#define FT_SIGN_LONG( x )   ( (x) >> ( FT_SIZEOF_LONG * 8 - 1 ) )\n#define FT_SIGN_INT( x )    ( (x) >> ( FT_SIZEOF_INT * 8 - 1 ) )\n#define FT_SIGN_INT32( x )  ( (x) >> 31 )\n#define FT_SIGN_INT16( x )  ( (x) >> 15 )\n\n\n  /* documentation is in fttrigon.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Vector_Rotate( FT_Vector*  vec,\n                    FT_Angle    angle )\n  {\n    FT_Int     shift;\n    FT_Vector  v;\n\n\n    v.x   = vec->x;\n    v.y   = vec->y;\n\n    if ( angle && ( v.x != 0 || v.y != 0 ) )\n    {\n      shift = ft_trig_prenorm( &v );\n      ft_trig_pseudo_rotate( &v, angle );\n      v.x = ft_trig_downscale( v.x );\n      v.y = ft_trig_downscale( v.y );\n\n      if ( shift > 0 )\n      {\n        FT_Int32  half = (FT_Int32)1L << ( shift - 1 );\n\n\n        vec->x = ( v.x + half + FT_SIGN_LONG( v.x ) ) >> shift;\n        vec->y = ( v.y + half + FT_SIGN_LONG( v.y ) ) >> shift;\n      }\n      else\n      {\n        shift  = -shift;\n        vec->x = (FT_Pos)( (FT_ULong)v.x << shift );\n        vec->y = (FT_Pos)( (FT_ULong)v.y << shift );\n      }\n    }\n  }\n\n\n  /* documentation is in fttrigon.h */\n\n  FT_EXPORT_DEF( FT_Fixed )\n  FT_Vector_Length( FT_Vector*  vec )\n  {\n    FT_Int     shift;\n    FT_Vector  v;\n\n\n    v = *vec;\n\n    /* handle trivial cases */\n    if ( v.x == 0 )\n    {\n      return FT_ABS( v.y );\n    }\n    else if ( v.y == 0 )\n    {\n      return FT_ABS( v.x );\n    }\n\n    /* general case */\n    shift = ft_trig_prenorm( &v );\n    ft_trig_pseudo_polarize( &v );\n\n    v.x = ft_trig_downscale( v.x );\n\n    if ( shift > 0 )\n      return ( v.x + ( 1 << ( shift - 1 ) ) ) >> shift;\n\n    return (FT_Fixed)( (FT_UInt32)v.x << -shift );\n  }\n\n\n  /* documentation is in fttrigon.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Vector_Polarize( FT_Vector*  vec,\n                      FT_Fixed   *length,\n                      FT_Angle   *angle )\n  {\n    FT_Int     shift;\n    FT_Vector  v;\n\n\n    v = *vec;\n\n    if ( v.x == 0 && v.y == 0 )\n      return;\n\n    shift = ft_trig_prenorm( &v );\n    ft_trig_pseudo_polarize( &v );\n\n    v.x = ft_trig_downscale( v.x );\n\n    *length = ( shift >= 0 ) ?                      ( v.x >>  shift )\n                             : (FT_Fixed)( (FT_UInt32)v.x << -shift );\n    *angle  = v.y;\n  }\n\n\n  /* documentation is in fttrigon.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Vector_From_Polar( FT_Vector*  vec,\n                        FT_Fixed    length,\n                        FT_Angle    angle )\n  {\n    vec->x = length;\n    vec->y = 0;\n\n    FT_Vector_Rotate( vec, angle );\n  }\n\n\n  /* documentation is in fttrigon.h */\n\n  FT_EXPORT_DEF( FT_Angle )\n  FT_Angle_Diff( FT_Angle  angle1,\n                 FT_Angle  angle2 )\n  {\n    FT_Angle  delta = angle2 - angle1;\n\n\n    delta %= FT_ANGLE_2PI;\n    if ( delta < 0 )\n      delta += FT_ANGLE_2PI;\n\n    if ( delta > FT_ANGLE_PI )\n      delta -= FT_ANGLE_2PI;\n\n    return delta;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttype1.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  fttype1.c                                                              */\n/*                                                                         */\n/*    FreeType utility file for PS names support (body).                   */\n/*                                                                         */\n/*  Copyright 2002-2004, 2011 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/internal/ftserv.h\"\n#include \"../../include/freetype/internal/services/svpsinfo.h\"\n\n\n  /* documentation is in t1tables.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_PS_Font_Info( FT_Face          face,\n                       PS_FontInfoRec*  afont_info )\n  {\n    FT_Error  error = FT_ERR( Invalid_Argument );\n\n\n    if ( face )\n    {\n      FT_Service_PsInfo  service = NULL;\n\n\n      FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );\n\n      if ( service && service->ps_get_font_info )\n        error = service->ps_get_font_info( face, afont_info );\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in t1tables.h */\n\n  FT_EXPORT_DEF( FT_Int )\n  FT_Has_PS_Glyph_Names( FT_Face  face )\n  {\n    FT_Int             result  = 0;\n    FT_Service_PsInfo  service = NULL;\n\n\n    if ( face )\n    {\n      FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );\n\n      if ( service && service->ps_has_glyph_names )\n        result = service->ps_has_glyph_names( face );\n    }\n\n    return result;\n  }\n\n\n  /* documentation is in t1tables.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_PS_Font_Private( FT_Face         face,\n                          PS_PrivateRec*  afont_private )\n  {\n    FT_Error  error = FT_ERR( Invalid_Argument );\n\n\n    if ( face )\n    {\n      FT_Service_PsInfo  service = NULL;\n\n\n      FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );\n\n      if ( service && service->ps_get_font_private )\n        error = service->ps_get_font_private( face, afont_private );\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in t1tables.h */\n\n  FT_EXPORT_DEF( FT_Long )\n  FT_Get_PS_Font_Value( FT_Face       face,\n                        PS_Dict_Keys  key,\n                        FT_UInt       idx,\n                        void         *value,\n                        FT_Long       value_len )\n  {\n    FT_Int             result  = 0;\n    FT_Service_PsInfo  service = NULL;\n\n\n    if ( face )\n    {\n      FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );\n\n      if ( service && service->ps_get_font_value )\n        result = service->ps_get_font_value( face, key, idx,\n                                             value, value_len );\n    }\n\n    return result;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftutil.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftutil.c                                                               */\n/*                                                                         */\n/*    FreeType utility file for memory and list management (body).         */\n/*                                                                         */\n/*  Copyright 2002, 2004-2007, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftmemory.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/ftlist.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_memory\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                                                               *****/\n  /*****               M E M O R Y   M A N A G E M E N T               *****/\n  /*****                                                               *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  FT_BASE_DEF( FT_Pointer )\n  ft_mem_alloc( FT_Memory  memory,\n                FT_Long    size,\n                FT_Error  *p_error )\n  {\n    FT_Error    error;\n    FT_Pointer  block = ft_mem_qalloc( memory, size, &error );\n\n    if ( !error && size > 0 )\n      FT_MEM_ZERO( block, size );\n\n    *p_error = error;\n    return block;\n  }\n\n\n  FT_BASE_DEF( FT_Pointer )\n  ft_mem_qalloc( FT_Memory  memory,\n                 FT_Long    size,\n                 FT_Error  *p_error )\n  {\n    FT_Error    error = FT_Err_Ok;\n    FT_Pointer  block = NULL;\n\n\n    if ( size > 0 )\n    {\n      block = memory->alloc( memory, size );\n      if ( block == NULL )\n        error = FT_THROW( Out_Of_Memory );\n    }\n    else if ( size < 0 )\n    {\n      /* may help catch/prevent security issues */\n      error = FT_THROW( Invalid_Argument );\n    }\n\n    *p_error = error;\n    return block;\n  }\n\n\n  FT_BASE_DEF( FT_Pointer )\n  ft_mem_realloc( FT_Memory  memory,\n                  FT_Long    item_size,\n                  FT_Long    cur_count,\n                  FT_Long    new_count,\n                  void*      block,\n                  FT_Error  *p_error )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    block = ft_mem_qrealloc( memory, item_size,\n                             cur_count, new_count, block, &error );\n    if ( !error && new_count > cur_count )\n      FT_MEM_ZERO( (char*)block + cur_count * item_size,\n                   ( new_count - cur_count ) * item_size );\n\n    *p_error = error;\n    return block;\n  }\n\n\n  FT_BASE_DEF( FT_Pointer )\n  ft_mem_qrealloc( FT_Memory  memory,\n                   FT_Long    item_size,\n                   FT_Long    cur_count,\n                   FT_Long    new_count,\n                   void*      block,\n                   FT_Error  *p_error )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    /* Note that we now accept `item_size == 0' as a valid parameter, in\n     * order to cover very weird cases where an ALLOC_MULT macro would be\n     * called.\n     */\n    if ( cur_count < 0 || new_count < 0 || item_size < 0 )\n    {\n      /* may help catch/prevent nasty security issues */\n      error = FT_THROW( Invalid_Argument );\n    }\n    else if ( new_count == 0 || item_size == 0 )\n    {\n      ft_mem_free( memory, block );\n      block = NULL;\n    }\n    else if ( new_count > FT_INT_MAX/item_size )\n    {\n      error = FT_THROW( Array_Too_Large );\n    }\n    else if ( cur_count == 0 )\n    {\n      FT_ASSERT( block == NULL );\n\n      block = ft_mem_alloc( memory, new_count*item_size, &error );\n    }\n    else\n    {\n      FT_Pointer  block2;\n      FT_Long     cur_size = cur_count*item_size;\n      FT_Long     new_size = new_count*item_size;\n\n\n      block2 = memory->realloc( memory, cur_size, new_size, block );\n      if ( block2 == NULL )\n        error = FT_THROW( Out_Of_Memory );\n      else\n        block = block2;\n    }\n\n    *p_error = error;\n    return block;\n  }\n\n  #ifdef _XYQ_MEM_DEBUG\t/** XYQ 2006-10-12 */\n  FT_BASE_DEF( FT_Pointer )\n  ft_mem_allocdebug( FT_Memory  memory,\n                FT_Long    size, const char* file, int line,\n                FT_Error  *p_error )\n  {\n    FT_Error    error;\n    FT_Pointer  block = ft_mem_qallocdebug( memory, size, file, line, &error );\n\n    if ( !error && size > 0 )\n      FT_MEM_ZERO( block, size );\n\n    *p_error = error;\n    return block;\n  }\n\n\n  FT_BASE_DEF( FT_Pointer )\n  ft_mem_qallocdebug( FT_Memory  memory,\n                 FT_Long    size, const char* file, int line,\n                 FT_Error  *p_error )\n  {\n    FT_Error    error = FT_Err_Ok;\n    FT_Pointer  block = NULL;\n\n\n    if ( size > 0 )\n    {\n      block = memory->allocdebug( memory, size, file, line );\n      if ( block == NULL )\n        error = FT_Err_Out_Of_Memory;\n    }\n    else if ( size < 0 )\n    {\n      /* may help catch/prevent security issues */\n      error = FT_Err_Invalid_Argument;\n    }\n\n    *p_error = error;\n    return block;\n  }\n\n\n  FT_BASE_DEF( FT_Pointer )\n  ft_mem_reallocdebug( FT_Memory  memory,\n                  FT_Long    item_size,\n                  FT_Long    cur_count,\n                  FT_Long    new_count,\n                  void*      block, const char* file, int line,\n                  FT_Error  *p_error )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n    block = ft_mem_qreallocdebug( memory, item_size,\n                             cur_count, new_count, block, file, line, &error );\n    if ( !error && new_count > cur_count )\n      FT_MEM_ZERO( (char*)block + cur_count * item_size,\n                   ( new_count - cur_count ) * item_size );\n\n    *p_error = error;\n    return block;\n  }\n\n\n  FT_BASE_DEF( FT_Pointer )\n  ft_mem_qreallocdebug( FT_Memory  memory,\n                   FT_Long    item_size,\n                   FT_Long    cur_count,\n                   FT_Long    new_count,\n                   void*      block, const char* file, int line,\n                   FT_Error  *p_error )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    if ( cur_count < 0 || new_count < 0 || item_size <= 0 )\n    {\n      /* may help catch/prevent nasty security issues */\n      error = FT_Err_Invalid_Argument;\n    }\n    else if ( new_count == 0 )\n    {\n      ft_mem_free( memory, block );\n      block = NULL;\n    }\n    else if ( new_count > FT_INT_MAX/item_size )\n    {\n      error = FT_Err_Array_Too_Large;\n    }\n    else if ( cur_count == 0 )\n    {\n      FT_ASSERT( block == NULL );\n\n      block = ft_mem_allocdebug( memory, new_count*item_size, file, line, &error );\n    }\n    else\n    {\n      FT_Pointer  block2;\n      FT_Long     cur_size = cur_count*item_size;\n      FT_Long     new_size = new_count*item_size;\n\n\n      block2 = memory->realloc( memory, cur_size, new_size, block );\n      if ( block2 == NULL )\n        error = FT_Err_Out_Of_Memory;\n      else\n        block = block2;\n    }\n\n    *p_error = error;\n    return block;\n  }\n#endif\n  FT_BASE_DEF( void )\n  ft_mem_free( FT_Memory   memory,\n               const void *P )\n  {\n    if ( P )\n      memory->free( memory, (void*)P );\n  }\n\n\n  FT_BASE_DEF( FT_Pointer )\n  ft_mem_dup( FT_Memory    memory,\n              const void*  address,\n              FT_ULong     size,\n              FT_Error    *p_error )\n  {\n    FT_Error    error;\n    FT_Pointer  p = ft_mem_qalloc( memory, size, &error );\n\n\n    if ( !error && address )\n      ft_memcpy( p, address, size );\n\n    *p_error = error;\n    return p;\n  }\n\n\n  FT_BASE_DEF( FT_Pointer )\n  ft_mem_strdup( FT_Memory    memory,\n                 const char*  str,\n                 FT_Error    *p_error )\n  {\n    FT_ULong  len = str ? (FT_ULong)ft_strlen( str ) + 1\n                        : 0;\n\n\n    return ft_mem_dup( memory, str, len, p_error );\n  }\n\n\n  FT_BASE_DEF( FT_Int )\n  ft_mem_strcpyn( char*        dst,\n                  const char*  src,\n                  FT_ULong     size )\n  {\n    while ( size > 1 && *src != 0 )\n    {\n      *dst++ = *src++;\n      size--;\n    }\n\n    *dst = 0;  /* always zero-terminate */\n\n    return *src != 0;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                                                               *****/\n  /*****            D O U B L Y   L I N K E D   L I S T S              *****/\n  /*****                                                               *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_list\n\n  /* documentation is in ftlist.h */\n\n  FT_EXPORT_DEF( FT_ListNode )\n  FT_List_Find( FT_List  list,\n                void*    data )\n  {\n    FT_ListNode  cur;\n\n\n    cur = list->head;\n    while ( cur )\n    {\n      if ( cur->data == data )\n        return cur;\n\n      cur = cur->next;\n    }\n\n    return (FT_ListNode)0;\n  }\n\n\n  /* documentation is in ftlist.h */\n\n  FT_EXPORT_DEF( void )\n  FT_List_Add( FT_List      list,\n               FT_ListNode  node )\n  {\n    FT_ListNode  before = list->tail;\n\n\n    node->next = 0;\n    node->prev = before;\n\n    if ( before )\n      before->next = node;\n    else\n      list->head = node;\n\n    list->tail = node;\n  }\n\n\n  /* documentation is in ftlist.h */\n\n  FT_EXPORT_DEF( void )\n  FT_List_Insert( FT_List      list,\n                  FT_ListNode  node )\n  {\n    FT_ListNode  after = list->head;\n\n\n    node->next = after;\n    node->prev = 0;\n\n    if ( !after )\n      list->tail = node;\n    else\n      after->prev = node;\n\n    list->head = node;\n  }\n\n\n  /* documentation is in ftlist.h */\n\n  FT_EXPORT_DEF( void )\n  FT_List_Remove( FT_List      list,\n                  FT_ListNode  node )\n  {\n    FT_ListNode  before, after;\n\n\n    before = node->prev;\n    after  = node->next;\n\n    if ( before )\n      before->next = after;\n    else\n      list->head = after;\n\n    if ( after )\n      after->prev = before;\n    else\n      list->tail = before;\n  }\n\n\n  /* documentation is in ftlist.h */\n\n  FT_EXPORT_DEF( void )\n  FT_List_Up( FT_List      list,\n              FT_ListNode  node )\n  {\n    FT_ListNode  before, after;\n\n\n    before = node->prev;\n    after  = node->next;\n\n    /* check whether we are already on top of the list */\n    if ( !before )\n      return;\n\n    before->next = after;\n\n    if ( after )\n      after->prev = before;\n    else\n      list->tail = before;\n\n    node->prev       = 0;\n    node->next       = list->head;\n    list->head->prev = node;\n    list->head       = node;\n  }\n\n\n  /* documentation is in ftlist.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_List_Iterate( FT_List            list,\n                   FT_List_Iterator   iterator,\n                   void*              user )\n  {\n    FT_ListNode  cur   = list->head;\n    FT_Error     error = FT_Err_Ok;\n\n\n    while ( cur )\n    {\n      FT_ListNode  next = cur->next;\n\n\n      error = iterator( cur, user );\n      if ( error )\n        break;\n\n      cur = next;\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in ftlist.h */\n\n  FT_EXPORT_DEF( void )\n  FT_List_Finalize( FT_List             list,\n                    FT_List_Destructor  destroy,\n                    FT_Memory           memory,\n                    void*               user )\n  {\n    FT_ListNode  cur;\n\n\n    cur = list->head;\n    while ( cur )\n    {\n      FT_ListNode  next = cur->next;\n      void*        data = cur->data;\n\n\n      if ( destroy )\n        destroy( memory, data, user );\n\n      FT_FREE( cur );\n      cur = next;\n    }\n\n    list->head = 0;\n    list->tail = 0;\n  }\n\n\n  FT_BASE_DEF( FT_UInt32 )\n  ft_highpow2( FT_UInt32  value )\n  {\n    FT_UInt32  value2;\n\n\n    /*\n     *  We simply clear the lowest bit in each iteration.  When\n     *  we reach 0, we know that the previous value was our result.\n     */\n    for ( ;; )\n    {\n      value2 = value & (value - 1);  /* clear lowest bit */\n      if ( value2 == 0 )\n        break;\n\n      value = value2;\n    }\n    return value;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftwinfnt.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftwinfnt.c                                                             */\n/*                                                                         */\n/*    FreeType API for accessing Windows FNT specific info (body).         */\n/*                                                                         */\n/*  Copyright 2003, 2004 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/ftwinfnt.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/internal/services/svwinfnt.h\"\n\n\n  /* documentation is in ftwinfnt.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_WinFNT_Header( FT_Face               face,\n                        FT_WinFNT_HeaderRec  *header )\n  {\n    FT_Service_WinFnt  service;\n    FT_Error           error;\n\n\n    error = FT_ERR( Invalid_Argument );\n\n    if ( face != NULL )\n    {\n      FT_FACE_LOOKUP_SERVICE( face, service, WINFNT );\n\n      if ( service != NULL )\n      {\n        error = service->get_header( face, header );\n      }\n    }\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftxf86.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftxf86.c                                                               */\n/*                                                                         */\n/*    FreeType utility file for X11 support (body).                        */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2004 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/ftxf86.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/internal/services/svxf86nm.h\"\n\n\n  /* documentation is in ftxf86.h */\n\n  FT_EXPORT_DEF( const char* )\n  FT_Get_X11_Font_Format( FT_Face  face )\n  {\n    const char*  result = NULL;\n\n\n    if ( face )\n      FT_FACE_FIND_SERVICE( face, result, XF86_NAME );\n\n    return result;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftbase.c",
    "content": "#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501\n/***************************************************************************/\n/*                                                                         */\n/*  ftbase.c                                                               */\n/*                                                                         */\n/*    Single object library component (body only).                         */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008, 2009 by       */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#define FT2_BUILD_LIBRARY\n#include \"../../include/ft2build.h\"\n\n#define  FT_MAKE_OPTION_SINGLE_OBJECT\n\n#include \"ftpic.c\"\n#include \"basepic.c\"\n#include \"ftadvanc.c\"\n#include \"ftcalc.c\"\n#include \"ftdbgmem.c\"\n#include \"ftgloadr.c\"\n#include \"ftobjs.c\"\n#include \"ftoutln.c\"\n#include \"ftrfork.c\"\n#include \"ftsnames.c\"\n#include \"ftstream.c\"\n#include \"fttrigon.c\"\n#include \"ftutil.c\"\n#include \"ftxf86.c\"\n\n#if defined( FT_MACINTOSH ) && !defined ( DARWIN_NO_CARBON )\n/*#include \"ftmac.c\"*/\n#endif\n\n/* END */\n#endif\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftbitmap.c",
    "content": "#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501\n/***************************************************************************/\n/*                                                                         */\n/*  ftbitmap.c                                                             */\n/*                                                                         */\n/*    FreeType utility functions for bitmaps (body).                       */\n/*                                                                         */\n/*  Copyright 2004-2009, 2011, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#define FT2_BUILD_LIBRARY\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/ftbitmap.h\"\n#include \"../../include/freetype/ftimage.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n\n\n  static\n  const FT_Bitmap  null_bitmap = { 0, 0, 0, 0, 0, 0, 0, 0 };\n\n\n  /* documentation is in ftbitmap.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Bitmap_New( FT_Bitmap  *abitmap )\n  {\n    *abitmap = null_bitmap;\n  }\n\n\n  /* documentation is in ftbitmap.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Bitmap_Copy( FT_Library        library,\n                  const FT_Bitmap  *source,\n                  FT_Bitmap        *target)\n  {\n    FT_Memory  memory = library->memory;\n    FT_Error   error  = FT_Err_Ok;\n    FT_Int     pitch  = source->pitch;\n    FT_ULong   size;\n\n\n    if ( source == target )\n      return FT_Err_Ok;\n\n    if ( source->buffer == NULL )\n    {\n      *target = *source;\n\n      return FT_Err_Ok;\n    }\n\n    if ( pitch < 0 )\n      pitch = -pitch;\n    size = (FT_ULong)( pitch * source->rows );\n\n    if ( target->buffer )\n    {\n      FT_Int    target_pitch = target->pitch;\n      FT_ULong  target_size;\n\n\n      if ( target_pitch < 0  )\n        target_pitch = -target_pitch;\n      target_size = (FT_ULong)( target_pitch * target->rows );\n\n      if ( target_size != size )\n        (void)FT_QREALLOC( target->buffer, target_size, size );\n    }\n    else\n      (void)FT_QALLOC( target->buffer, size );\n\n    if ( !error )\n    {\n      unsigned char *p;\n\n\n      p = target->buffer;\n      *target = *source;\n      target->buffer = p;\n\n      FT_MEM_COPY( target->buffer, source->buffer, size );\n    }\n\n    return error;\n  }\n\n\n  static FT_Error\n  ft_bitmap_assure_buffer( FT_Memory   memory,\n                           FT_Bitmap*  bitmap,\n                           FT_UInt     xpixels,\n                           FT_UInt     ypixels )\n  {\n    FT_Error        error;\n    int             pitch;\n    int             new_pitch;\n    FT_UInt         bpp;\n    FT_Int          i, width, height;\n    unsigned char*  buffer = NULL;\n\n\n    width  = bitmap->width;\n    height = bitmap->rows;\n    pitch  = bitmap->pitch;\n    if ( pitch < 0 )\n      pitch = -pitch;\n\n    switch ( bitmap->pixel_mode )\n    {\n    case FT_PIXEL_MODE_MONO:\n      bpp       = 1;\n      new_pitch = ( width + xpixels + 7 ) >> 3;\n      break;\n    case FT_PIXEL_MODE_GRAY2:\n      bpp       = 2;\n      new_pitch = ( width + xpixels + 3 ) >> 2;\n      break;\n    case FT_PIXEL_MODE_GRAY4:\n      bpp       = 4;\n      new_pitch = ( width + xpixels + 1 ) >> 1;\n      break;\n    case FT_PIXEL_MODE_GRAY:\n    case FT_PIXEL_MODE_LCD:\n    case FT_PIXEL_MODE_LCD_V:\n      bpp       = 8;\n      new_pitch = ( width + xpixels );\n      break;\n    default:\n      return FT_THROW( Invalid_Glyph_Format );\n    }\n\n    /* if no need to allocate memory */\n    if ( ypixels == 0 && new_pitch <= pitch )\n    {\n      /* zero the padding */\n      FT_Int  bit_width = pitch * 8;\n      FT_Int  bit_last  = ( width + xpixels ) * bpp;\n\n\n      if ( bit_last < bit_width )\n      {\n        FT_Byte*  line  = bitmap->buffer + ( bit_last >> 3 );\n        FT_Byte*  end   = bitmap->buffer + pitch;\n        FT_Int    shift = bit_last & 7;\n        FT_UInt   mask  = 0xFF00U >> shift;\n        FT_Int    count = height;\n\n\n        for ( ; count > 0; count--, line += pitch, end += pitch )\n        {\n          FT_Byte*  write = line;\n\n\n          if ( shift > 0 )\n          {\n            write[0] = (FT_Byte)( write[0] & mask );\n            write++;\n          }\n          if ( write < end )\n            FT_MEM_ZERO( write, end-write );\n        }\n      }\n\n      return FT_Err_Ok;\n    }\n\n    if ( FT_QALLOC_MULT( buffer, new_pitch, bitmap->rows + ypixels ) )\n      return error;\n\n    if ( bitmap->pitch > 0 )\n    {\n      FT_Int  len = ( width * bpp + 7 ) >> 3;\n\n\n      for ( i = 0; i < bitmap->rows; i++ )\n        FT_MEM_COPY( buffer + new_pitch * ( ypixels + i ),\n                     bitmap->buffer + pitch * i, len );\n    }\n    else\n    {\n      FT_Int  len = ( width * bpp + 7 ) >> 3;\n\n\n      for ( i = 0; i < bitmap->rows; i++ )\n        FT_MEM_COPY( buffer + new_pitch * i,\n                     bitmap->buffer + pitch * i, len );\n    }\n\n    FT_FREE( bitmap->buffer );\n    bitmap->buffer = buffer;\n\n    if ( bitmap->pitch < 0 )\n      new_pitch = -new_pitch;\n\n    /* set pitch only, width and height are left untouched */\n    bitmap->pitch = new_pitch;\n\n    return FT_Err_Ok;\n  }\n\n\n  /* documentation is in ftbitmap.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Bitmap_Embolden( FT_Library  library,\n                      FT_Bitmap*  bitmap,\n                      FT_Pos      xStrength,\n                      FT_Pos      yStrength )\n  {\n    FT_Error        error;\n    unsigned char*  p;\n    FT_Int          i, x, y, pitch;\n    FT_Int          xstr, ystr;\n\n\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    if ( !bitmap || !bitmap->buffer )\n      return FT_THROW( Invalid_Argument );\n\n    if ( ( ( FT_PIX_ROUND( xStrength ) >> 6 ) > FT_INT_MAX ) ||\n         ( ( FT_PIX_ROUND( yStrength ) >> 6 ) > FT_INT_MAX ) )\n      return FT_THROW( Invalid_Argument );\n\n    xstr = (FT_Int)FT_PIX_ROUND( xStrength ) >> 6;\n    ystr = (FT_Int)FT_PIX_ROUND( yStrength ) >> 6;\n\n    if ( xstr == 0 && ystr == 0 )\n      return FT_Err_Ok;\n    else if ( xstr < 0 || ystr < 0 )\n      return FT_THROW( Invalid_Argument );\n\n    switch ( bitmap->pixel_mode )\n    {\n    case FT_PIXEL_MODE_GRAY2:\n    case FT_PIXEL_MODE_GRAY4:\n      {\n        FT_Bitmap  tmp;\n        FT_Int     align;\n\n\n        if ( bitmap->pixel_mode == FT_PIXEL_MODE_GRAY2 )\n          align = ( bitmap->width + xstr + 3 ) / 4;\n        else\n          align = ( bitmap->width + xstr + 1 ) / 2;\n\n        FT_Bitmap_New( &tmp );\n\n        error = FT_Bitmap_Convert( library, bitmap, &tmp, align );\n        if ( error )\n          return error;\n\n        FT_Bitmap_Done( library, bitmap );\n        *bitmap = tmp;\n      }\n      break;\n\n    case FT_PIXEL_MODE_MONO:\n      if ( xstr > 8 )\n        xstr = 8;\n      break;\n\n    case FT_PIXEL_MODE_LCD:\n      xstr *= 3;\n      break;\n\n    case FT_PIXEL_MODE_LCD_V:\n      ystr *= 3;\n      break;\n\n    case FT_PIXEL_MODE_BGRA:\n      /* We don't embolden color glyphs. */\n      return FT_Err_Ok;\n    }\n\n    error = ft_bitmap_assure_buffer( library->memory, bitmap, xstr, ystr );\n    if ( error )\n      return error;\n\n    pitch = bitmap->pitch;\n    if ( pitch > 0 )\n      p = bitmap->buffer + pitch * ystr;\n    else\n    {\n      pitch = -pitch;\n      p = bitmap->buffer + pitch * ( bitmap->rows - 1 );\n    }\n\n    /* for each row */\n    for ( y = 0; y < bitmap->rows ; y++ )\n    {\n      /*\n       * Horizontally:\n       *\n       * From the last pixel on, make each pixel or'ed with the\n       * `xstr' pixels before it.\n       */\n      for ( x = pitch - 1; x >= 0; x-- )\n      {\n        unsigned char tmp;\n\n\n        tmp = p[x];\n        for ( i = 1; i <= xstr; i++ )\n        {\n          if ( bitmap->pixel_mode == FT_PIXEL_MODE_MONO )\n          {\n            p[x] |= tmp >> i;\n\n            /* the maximum value of 8 for `xstr' comes from here */\n            if ( x > 0 )\n              p[x] |= p[x - 1] << ( 8 - i );\n\n#if 0\n            if ( p[x] == 0xff )\n              break;\n#endif\n          }\n          else\n          {\n            if ( x - i >= 0 )\n            {\n              if ( p[x] + p[x - i] > bitmap->num_grays - 1 )\n              {\n                p[x] = (unsigned char)(bitmap->num_grays - 1);\n                break;\n              }\n              else\n              {\n                p[x] = (unsigned char)(p[x] + p[x-i]);\n                if ( p[x] == bitmap->num_grays - 1 )\n                  break;\n              }\n            }\n            else\n              break;\n          }\n        }\n      }\n\n      /*\n       * Vertically:\n       *\n       * Make the above `ystr' rows or'ed with it.\n       */\n      for ( x = 1; x <= ystr; x++ )\n      {\n        unsigned char*  q;\n\n\n        q = p - bitmap->pitch * x;\n        for ( i = 0; i < pitch; i++ )\n          q[i] |= p[i];\n      }\n\n      p += bitmap->pitch;\n    }\n\n    bitmap->width += xstr;\n    bitmap->rows += ystr;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_Byte\n  ft_gray_for_premultiplied_srgb_bgra( const FT_Byte*  bgra )\n  {\n    FT_Long  a = bgra[3];\n    FT_Long  b = bgra[0];\n    FT_Long  g = bgra[1];\n    FT_Long  r = bgra[2];\n    FT_Long  l;\n\n\n    /*\n     * Luminosity for sRGB is defined using ~0.2126,0.7152,0.0722\n     * coefficients for RGB channels *on the linear colors*.\n     * A gamma of 2.2 is fair to assume.  And then, we need to\n     * undo the premultiplication too.\n     *\n     * http://accessibility.kde.org/hsl-adjusted.php\n     *\n     * We do the computation with integers only.\n     */\n\n    /* Undo premultification, get the number in a 16.16 form. */\n    b = FT_MulDiv( b, 65536, a );\n    g = FT_MulDiv( g, 65536, a );\n    r = FT_MulDiv( r, 65536, a );\n    a = a * 256;\n\n    /* Apply gamma of 2.0 instead of 2.2. */\n    b = FT_MulFix( b, b );\n    g = FT_MulFix( g, g );\n    r = FT_MulFix( r, r );\n\n    /* Apply coefficients. */\n    b = FT_MulFix( b,  4731 /* 0.0722 * 65536 */ );\n    g = FT_MulFix( g, 46871 /* 0.7152 * 65536 */ );\n    r = FT_MulFix( r, 13933 /* 0.2126 * 65536 */ );\n\n    l = r + g + b;\n\n    /*\n     * Final transparency can be determined this way:\n     *\n     * - If alpha is zero, we want 0.\n     * - If alpha is zero and luminosity is zero, we want 255.\n     * - If alpha is zero and luminosity is one, we want 0.\n     *\n     * So the formula is a * (1 - l).\n     */\n\n    return (FT_Byte)( FT_MulFix( 65535 - l, a ) >> 8 );\n  }\n\n\n  /* documentation is in ftbitmap.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Bitmap_Convert( FT_Library        library,\n                     const FT_Bitmap  *source,\n                     FT_Bitmap        *target,\n                     FT_Int            alignment )\n  {\n    FT_Error   error = FT_Err_Ok;\n    FT_Memory  memory;\n\n\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    memory = library->memory;\n\n    switch ( source->pixel_mode )\n    {\n    case FT_PIXEL_MODE_MONO:\n    case FT_PIXEL_MODE_GRAY:\n    case FT_PIXEL_MODE_GRAY2:\n    case FT_PIXEL_MODE_GRAY4:\n    case FT_PIXEL_MODE_LCD:\n    case FT_PIXEL_MODE_LCD_V:\n    case FT_PIXEL_MODE_BGRA:\n      {\n        FT_Int   pad;\n        FT_Long  old_size;\n\n\n        old_size = target->rows * target->pitch;\n        if ( old_size < 0 )\n          old_size = -old_size;\n\n        target->pixel_mode = FT_PIXEL_MODE_GRAY;\n        target->rows       = source->rows;\n        target->width      = source->width;\n\n        pad = 0;\n        if ( alignment > 0 )\n        {\n          pad = source->width % alignment;\n          if ( pad != 0 )\n            pad = alignment - pad;\n        }\n\n        target->pitch = source->width + pad;\n\n        if ( target->pitch > 0                                     &&\n             (FT_ULong)target->rows > FT_ULONG_MAX / target->pitch )\n          return FT_THROW( Invalid_Argument );\n\n        if ( target->rows * target->pitch > old_size             &&\n             FT_QREALLOC( target->buffer,\n                          old_size, target->rows * target->pitch ) )\n          return error;\n      }\n      break;\n\n    default:\n      error = FT_THROW( Invalid_Argument );\n    }\n\n    switch ( source->pixel_mode )\n    {\n    case FT_PIXEL_MODE_MONO:\n      {\n        FT_Byte*  s = source->buffer;\n        FT_Byte*  t = target->buffer;\n        FT_Int    i;\n\n\n        target->num_grays = 2;\n\n        for ( i = source->rows; i > 0; i-- )\n        {\n          FT_Byte*  ss = s;\n          FT_Byte*  tt = t;\n          FT_Int    j;\n\n\n          /* get the full bytes */\n          for ( j = source->width >> 3; j > 0; j-- )\n          {\n            FT_Int  val = ss[0]; /* avoid a byte->int cast on each line */\n\n\n            tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7 );\n            tt[1] = (FT_Byte)( ( val & 0x40 ) >> 6 );\n            tt[2] = (FT_Byte)( ( val & 0x20 ) >> 5 );\n            tt[3] = (FT_Byte)( ( val & 0x10 ) >> 4 );\n            tt[4] = (FT_Byte)( ( val & 0x08 ) >> 3 );\n            tt[5] = (FT_Byte)( ( val & 0x04 ) >> 2 );\n            tt[6] = (FT_Byte)( ( val & 0x02 ) >> 1 );\n            tt[7] = (FT_Byte)(   val & 0x01 );\n\n            tt += 8;\n            ss += 1;\n          }\n\n          /* get remaining pixels (if any) */\n          j = source->width & 7;\n          if ( j > 0 )\n          {\n            FT_Int  val = *ss;\n\n\n            for ( ; j > 0; j-- )\n            {\n              tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7);\n              val <<= 1;\n              tt   += 1;\n            }\n          }\n\n          s += source->pitch;\n          t += target->pitch;\n        }\n      }\n      break;\n\n\n    case FT_PIXEL_MODE_GRAY:\n    case FT_PIXEL_MODE_LCD:\n    case FT_PIXEL_MODE_LCD_V:\n      {\n        FT_Int    width   = source->width;\n        FT_Byte*  s       = source->buffer;\n        FT_Byte*  t       = target->buffer;\n        FT_Int    s_pitch = source->pitch;\n        FT_Int    t_pitch = target->pitch;\n        FT_Int    i;\n\n\n        target->num_grays = 256;\n\n        for ( i = source->rows; i > 0; i-- )\n        {\n          FT_ARRAY_COPY( t, s, width );\n\n          s += s_pitch;\n          t += t_pitch;\n        }\n      }\n      break;\n\n\n    case FT_PIXEL_MODE_GRAY2:\n      {\n        FT_Byte*  s = source->buffer;\n        FT_Byte*  t = target->buffer;\n        FT_Int    i;\n\n\n        target->num_grays = 4;\n\n        for ( i = source->rows; i > 0; i-- )\n        {\n          FT_Byte*  ss = s;\n          FT_Byte*  tt = t;\n          FT_Int    j;\n\n\n          /* get the full bytes */\n          for ( j = source->width >> 2; j > 0; j-- )\n          {\n            FT_Int  val = ss[0];\n\n\n            tt[0] = (FT_Byte)( ( val & 0xC0 ) >> 6 );\n            tt[1] = (FT_Byte)( ( val & 0x30 ) >> 4 );\n            tt[2] = (FT_Byte)( ( val & 0x0C ) >> 2 );\n            tt[3] = (FT_Byte)( ( val & 0x03 ) );\n\n            ss += 1;\n            tt += 4;\n          }\n\n          j = source->width & 3;\n          if ( j > 0 )\n          {\n            FT_Int  val = ss[0];\n\n\n            for ( ; j > 0; j-- )\n            {\n              tt[0]  = (FT_Byte)( ( val & 0xC0 ) >> 6 );\n              val  <<= 2;\n              tt    += 1;\n            }\n          }\n\n          s += source->pitch;\n          t += target->pitch;\n        }\n      }\n      break;\n\n\n    case FT_PIXEL_MODE_GRAY4:\n      {\n        FT_Byte*  s = source->buffer;\n        FT_Byte*  t = target->buffer;\n        FT_Int    i;\n\n\n        target->num_grays = 16;\n\n        for ( i = source->rows; i > 0; i-- )\n        {\n          FT_Byte*  ss = s;\n          FT_Byte*  tt = t;\n          FT_Int    j;\n\n\n          /* get the full bytes */\n          for ( j = source->width >> 1; j > 0; j-- )\n          {\n            FT_Int  val = ss[0];\n\n\n            tt[0] = (FT_Byte)( ( val & 0xF0 ) >> 4 );\n            tt[1] = (FT_Byte)( ( val & 0x0F ) );\n\n            ss += 1;\n            tt += 2;\n          }\n\n          if ( source->width & 1 )\n            tt[0] = (FT_Byte)( ( ss[0] & 0xF0 ) >> 4 );\n\n          s += source->pitch;\n          t += target->pitch;\n        }\n      }\n      break;\n\n    case FT_PIXEL_MODE_BGRA:\n      {\n        FT_Byte*  s       = source->buffer;\n        FT_Byte*  t       = target->buffer;\n        FT_Int    s_pitch = source->pitch;\n        FT_Int    t_pitch = target->pitch;\n        FT_Int    i;\n\n\n        target->num_grays = 256;\n\n        for ( i = source->rows; i > 0; i-- )\n        {\n          FT_Byte*  ss = s;\n          FT_Byte*  tt = t;\n          FT_Int    j;\n\n\n          for ( j = source->width; j > 0; j-- )\n          {\n            tt[0] = ft_gray_for_premultiplied_srgb_bgra( ss );\n\n            ss += 4;\n            tt += 1;\n          }\n\n          s += s_pitch;\n          t += t_pitch;\n        }\n      }\n      break;\n\n    default:\n      ;\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in ftbitmap.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot  slot )\n  {\n    if ( slot && slot->format == FT_GLYPH_FORMAT_BITMAP   &&\n         !( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) )\n    {\n      FT_Bitmap  bitmap;\n      FT_Error   error;\n\n\n      FT_Bitmap_New( &bitmap );\n      error = FT_Bitmap_Copy( slot->library, &slot->bitmap, &bitmap );\n      if ( error )\n        return error;\n\n      slot->bitmap = bitmap;\n      slot->internal->flags |= FT_GLYPH_OWN_BITMAP;\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  /* documentation is in ftbitmap.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Bitmap_Done( FT_Library  library,\n                  FT_Bitmap  *bitmap )\n  {\n    FT_Memory  memory;\n\n\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    if ( !bitmap )\n      return FT_THROW( Invalid_Argument );\n\n    memory = library->memory;\n\n    FT_FREE( bitmap->buffer );\n    *bitmap = null_bitmap;\n\n    return FT_Err_Ok;\n  }\n\n\n/* END */\n#endif\n\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftglyph.c",
    "content": "#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501\n/***************************************************************************/\n/*                                                                         */\n/*  ftglyph.c                                                              */\n/*                                                                         */\n/*    FreeType convenience functions to handle glyphs (body).              */\n/*                                                                         */\n/*  Copyright 1996-2005, 2007, 2008, 2010, 2012, 2013 by                   */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  This file contains the definition of several convenience functions   */\n  /*  that can be used by client applications to easily retrieve glyph     */\n  /*  bitmaps and outlines from a given face.                              */\n  /*                                                                       */\n  /*  These functions should be optional if you are writing a font server  */\n  /*  or text layout engine on top of FreeType.  However, they are pretty  */\n  /*  handy for many other simple uses of the library.                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n#define FT2_BUILD_LIBRARY\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/ftglyph.h\"\n#include \"../../include/freetype/ftoutln.h\"\n#include \"../../include/freetype/ftbitmap.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n\n#include \"basepic.h\"\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_glyph\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****   FT_BitmapGlyph support                                        ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_CALLBACK_DEF( FT_Error )\n  ft_bitmap_glyph_init( FT_Glyph      bitmap_glyph,\n                        FT_GlyphSlot  slot )\n  {\n    FT_BitmapGlyph  glyph   = (FT_BitmapGlyph)bitmap_glyph;\n    FT_Error        error   = FT_Err_Ok;\n    FT_Library      library = FT_GLYPH( glyph )->library;\n\n\n    if ( slot->format != FT_GLYPH_FORMAT_BITMAP )\n    {\n      error = FT_THROW( Invalid_Glyph_Format );\n      goto Exit;\n    }\n\n    glyph->left = slot->bitmap_left;\n    glyph->top  = slot->bitmap_top;\n\n    /* do lazy copying whenever possible */\n    if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )\n    {\n      glyph->bitmap = slot->bitmap;\n      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;\n    }\n    else\n    {\n      FT_Bitmap_New( &glyph->bitmap );\n      error = FT_Bitmap_Copy( library, &slot->bitmap, &glyph->bitmap );\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  ft_bitmap_glyph_copy( FT_Glyph  bitmap_source,\n                        FT_Glyph  bitmap_target )\n  {\n    FT_Library      library = bitmap_source->library;\n    FT_BitmapGlyph  source  = (FT_BitmapGlyph)bitmap_source;\n    FT_BitmapGlyph  target  = (FT_BitmapGlyph)bitmap_target;\n\n\n    target->left = source->left;\n    target->top  = source->top;\n\n    return FT_Bitmap_Copy( library, &source->bitmap, &target->bitmap );\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  ft_bitmap_glyph_done( FT_Glyph  bitmap_glyph )\n  {\n    FT_BitmapGlyph  glyph   = (FT_BitmapGlyph)bitmap_glyph;\n    FT_Library      library = FT_GLYPH( glyph )->library;\n\n\n    FT_Bitmap_Done( library, &glyph->bitmap );\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  ft_bitmap_glyph_bbox( FT_Glyph  bitmap_glyph,\n                        FT_BBox*  cbox )\n  {\n    FT_BitmapGlyph  glyph = (FT_BitmapGlyph)bitmap_glyph;\n\n\n    cbox->xMin = glyph->left << 6;\n    cbox->xMax = cbox->xMin + ( glyph->bitmap.width << 6 );\n    cbox->yMax = glyph->top << 6;\n    cbox->yMin = cbox->yMax - ( glyph->bitmap.rows << 6 );\n  }\n\n\n  FT_DEFINE_GLYPH(ft_bitmap_glyph_class,\n    sizeof ( FT_BitmapGlyphRec ),\n    FT_GLYPH_FORMAT_BITMAP,\n\n    ft_bitmap_glyph_init,\n    ft_bitmap_glyph_done,\n    ft_bitmap_glyph_copy,\n    0,                          /* FT_Glyph_TransformFunc */\n    ft_bitmap_glyph_bbox,\n    0                           /* FT_Glyph_PrepareFunc   */\n  )\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****   FT_OutlineGlyph support                                       ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  ft_outline_glyph_init( FT_Glyph      outline_glyph,\n                         FT_GlyphSlot  slot )\n  {\n    FT_OutlineGlyph  glyph   = (FT_OutlineGlyph)outline_glyph;\n    FT_Error         error   = FT_Err_Ok;\n    FT_Library       library = FT_GLYPH( glyph )->library;\n    FT_Outline*      source  = &slot->outline;\n    FT_Outline*      target  = &glyph->outline;\n\n\n    /* check format in glyph slot */\n    if ( slot->format != FT_GLYPH_FORMAT_OUTLINE )\n    {\n      error = FT_THROW( Invalid_Glyph_Format );\n      goto Exit;\n    }\n\n    /* allocate new outline */\n    error = FT_Outline_New( library, source->n_points, source->n_contours,\n                            &glyph->outline );\n    if ( error )\n      goto Exit;\n\n    FT_Outline_Copy( source, target );\n\n  Exit:\n    return error;\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  ft_outline_glyph_done( FT_Glyph  outline_glyph )\n  {\n    FT_OutlineGlyph  glyph = (FT_OutlineGlyph)outline_glyph;\n\n\n    FT_Outline_Done( FT_GLYPH( glyph )->library, &glyph->outline );\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  ft_outline_glyph_copy( FT_Glyph  outline_source,\n                         FT_Glyph  outline_target )\n  {\n    FT_OutlineGlyph  source  = (FT_OutlineGlyph)outline_source;\n    FT_OutlineGlyph  target  = (FT_OutlineGlyph)outline_target;\n    FT_Error         error;\n    FT_Library       library = FT_GLYPH( source )->library;\n\n\n    error = FT_Outline_New( library, source->outline.n_points,\n                            source->outline.n_contours, &target->outline );\n    if ( !error )\n      FT_Outline_Copy( &source->outline, &target->outline );\n\n    return error;\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  ft_outline_glyph_transform( FT_Glyph          outline_glyph,\n                              const FT_Matrix*  matrix,\n                              const FT_Vector*  delta )\n  {\n    FT_OutlineGlyph  glyph = (FT_OutlineGlyph)outline_glyph;\n\n\n    if ( matrix )\n      FT_Outline_Transform( &glyph->outline, matrix );\n\n    if ( delta )\n      FT_Outline_Translate( &glyph->outline, delta->x, delta->y );\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  ft_outline_glyph_bbox( FT_Glyph  outline_glyph,\n                         FT_BBox*  bbox )\n  {\n    FT_OutlineGlyph  glyph = (FT_OutlineGlyph)outline_glyph;\n\n\n    FT_Outline_Get_CBox( &glyph->outline, bbox );\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  ft_outline_glyph_prepare( FT_Glyph      outline_glyph,\n                            FT_GlyphSlot  slot )\n  {\n    FT_OutlineGlyph  glyph = (FT_OutlineGlyph)outline_glyph;\n\n\n    slot->format         = FT_GLYPH_FORMAT_OUTLINE;\n    slot->outline        = glyph->outline;\n    slot->outline.flags &= ~FT_OUTLINE_OWNER;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_DEFINE_GLYPH( ft_outline_glyph_class,\n    sizeof ( FT_OutlineGlyphRec ),\n    FT_GLYPH_FORMAT_OUTLINE,\n\n    ft_outline_glyph_init,\n    ft_outline_glyph_done,\n    ft_outline_glyph_copy,\n    ft_outline_glyph_transform,\n    ft_outline_glyph_bbox,\n    ft_outline_glyph_prepare\n  )\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****   FT_Glyph class and API                                        ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n   static FT_Error\n   ft_new_glyph( FT_Library             library,\n                 const FT_Glyph_Class*  clazz,\n                 FT_Glyph*              aglyph )\n   {\n     FT_Memory  memory = library->memory;\n     FT_Error   error;\n     FT_Glyph   glyph  = NULL;\n\n\n     *aglyph = 0;\n\n     if ( !FT_ALLOC( glyph, clazz->glyph_size ) )\n     {\n       glyph->library = library;\n       glyph->clazz   = clazz;\n       glyph->format  = clazz->glyph_format;\n\n       *aglyph = glyph;\n     }\n\n     return error;\n   }\n\n\n  /* documentation is in ftglyph.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Glyph_Copy( FT_Glyph   source,\n                 FT_Glyph  *target )\n  {\n    FT_Glyph               copy;\n    FT_Error               error;\n    const FT_Glyph_Class*  clazz;\n\n\n    /* check arguments */\n    if ( !target )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    *target = 0;\n\n    if ( !source || !source->clazz )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    clazz = source->clazz;\n    error = ft_new_glyph( source->library, clazz, &copy );\n    if ( error )\n      goto Exit;\n\n    copy->advance = source->advance;\n    copy->format  = source->format;\n\n    if ( clazz->glyph_copy )\n      error = clazz->glyph_copy( source, copy );\n\n    if ( error )\n      FT_Done_Glyph( copy );\n    else\n      *target = copy;\n\n  Exit:\n    return error;\n  }\n\n\n  /* documentation is in ftglyph.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_Glyph( FT_GlyphSlot  slot,\n                FT_Glyph     *aglyph )\n  {\n    FT_Library  library;\n    FT_Error    error;\n    FT_Glyph    glyph;\n\n    const FT_Glyph_Class*  clazz = 0;\n\n\n    if ( !slot )\n      return FT_THROW( Invalid_Slot_Handle );\n\n    library = slot->library;\n\n    if ( !aglyph )\n      return FT_THROW( Invalid_Argument );\n\n    /* if it is a bitmap, that's easy :-) */\n    if ( slot->format == FT_GLYPH_FORMAT_BITMAP )\n      clazz = FT_BITMAP_GLYPH_CLASS_GET;\n\n    /* if it is an outline */\n    else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )\n      clazz = FT_OUTLINE_GLYPH_CLASS_GET;\n\n    else\n    {\n      /* try to find a renderer that supports the glyph image format */\n      FT_Renderer  render = FT_Lookup_Renderer( library, slot->format, 0 );\n\n\n      if ( render )\n        clazz = &render->glyph_class;\n    }\n\n    if ( !clazz )\n    {\n      error = FT_THROW( Invalid_Glyph_Format );\n      goto Exit;\n    }\n\n    /* create FT_Glyph object */\n    error = ft_new_glyph( library, clazz, &glyph );\n    if ( error )\n      goto Exit;\n\n    /* copy advance while converting it to 16.16 format */\n    glyph->advance.x = slot->advance.x << 10;\n    glyph->advance.y = slot->advance.y << 10;\n\n    /* now import the image from the glyph slot */\n    error = clazz->glyph_init( glyph, slot );\n\n    /* if an error occurred, destroy the glyph */\n    if ( error )\n      FT_Done_Glyph( glyph );\n    else\n      *aglyph = glyph;\n\n  Exit:\n    return error;\n  }\n\n\n  /* documentation is in ftglyph.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Glyph_Transform( FT_Glyph    glyph,\n                      FT_Matrix*  matrix,\n                      FT_Vector*  delta )\n  {\n    const FT_Glyph_Class*  clazz;\n    FT_Error               error = FT_Err_Ok;\n\n\n    if ( !glyph || !glyph->clazz )\n      error = FT_THROW( Invalid_Argument );\n    else\n    {\n      clazz = glyph->clazz;\n      if ( clazz->glyph_transform )\n      {\n        /* transform glyph image */\n        clazz->glyph_transform( glyph, matrix, delta );\n\n        /* transform advance vector */\n        if ( matrix )\n          FT_Vector_Transform( &glyph->advance, matrix );\n      }\n      else\n        error = FT_THROW( Invalid_Glyph_Format );\n    }\n    return error;\n  }\n\n\n  /* documentation is in ftglyph.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Glyph_Get_CBox( FT_Glyph  glyph,\n                     FT_UInt   bbox_mode,\n                     FT_BBox  *acbox )\n  {\n    const FT_Glyph_Class*  clazz;\n\n\n    if ( !acbox )\n      return;\n\n    acbox->xMin = acbox->yMin = acbox->xMax = acbox->yMax = 0;\n\n    if ( !glyph || !glyph->clazz )\n      return;\n    else\n    {\n      clazz = glyph->clazz;\n      if ( !clazz->glyph_bbox )\n        return;\n      else\n      {\n        /* retrieve bbox in 26.6 coordinates */\n        clazz->glyph_bbox( glyph, acbox );\n\n        /* perform grid fitting if needed */\n        if ( bbox_mode == FT_GLYPH_BBOX_GRIDFIT ||\n             bbox_mode == FT_GLYPH_BBOX_PIXELS  )\n        {\n          acbox->xMin = FT_PIX_FLOOR( acbox->xMin );\n          acbox->yMin = FT_PIX_FLOOR( acbox->yMin );\n          acbox->xMax = FT_PIX_CEIL( acbox->xMax );\n          acbox->yMax = FT_PIX_CEIL( acbox->yMax );\n        }\n\n        /* convert to integer pixels if needed */\n        if ( bbox_mode == FT_GLYPH_BBOX_TRUNCATE ||\n             bbox_mode == FT_GLYPH_BBOX_PIXELS   )\n        {\n          acbox->xMin >>= 6;\n          acbox->yMin >>= 6;\n          acbox->xMax >>= 6;\n          acbox->yMax >>= 6;\n        }\n      }\n    }\n    return;\n  }\n\n\n  /* documentation is in ftglyph.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Glyph_To_Bitmap( FT_Glyph*       the_glyph,\n                      FT_Render_Mode  render_mode,\n                      FT_Vector*      origin,\n                      FT_Bool         destroy )\n  {\n    FT_GlyphSlotRec           dummy;\n    FT_GlyphSlot_InternalRec  dummy_internal;\n    FT_Error                  error = FT_Err_Ok;\n    FT_Glyph                  b, glyph;\n    FT_BitmapGlyph            bitmap = NULL;\n    const FT_Glyph_Class*     clazz;\n\n    /* FT_BITMAP_GLYPH_CLASS_GET derefers `library' in PIC mode */\n    FT_Library                library;\n\n\n    /* check argument */\n    if ( !the_glyph )\n      goto Bad;\n    glyph = *the_glyph;\n    if ( !glyph )\n      goto Bad;\n\n    clazz   = glyph->clazz;\n    library = glyph->library;\n    if ( !library || !clazz )\n      goto Bad;\n\n    /* when called with a bitmap glyph, do nothing and return successfully */\n    if ( clazz == FT_BITMAP_GLYPH_CLASS_GET )\n      goto Exit;\n\n    if ( !clazz->glyph_prepare )\n      goto Bad;\n\n    /* we render the glyph into a glyph bitmap using a `dummy' glyph slot */\n    /* then calling FT_Render_Glyph_Internal()                            */\n\n    FT_MEM_ZERO( &dummy, sizeof ( dummy ) );\n    FT_MEM_ZERO( &dummy_internal, sizeof ( dummy_internal ) );\n    dummy.internal = &dummy_internal;\n    dummy.library  = library;\n    dummy.format   = clazz->glyph_format;\n\n    /* create result bitmap glyph */\n    error = ft_new_glyph( library, FT_BITMAP_GLYPH_CLASS_GET, &b );\n    if ( error )\n      goto Exit;\n    bitmap = (FT_BitmapGlyph)b;\n\n#if 1\n    /* if `origin' is set, translate the glyph image */\n    if ( origin )\n      FT_Glyph_Transform( glyph, 0, origin );\n#else\n    FT_UNUSED( origin );\n#endif\n\n    /* prepare dummy slot for rendering */\n    error = clazz->glyph_prepare( glyph, &dummy );\n    if ( !error )\n      error = FT_Render_Glyph_Internal( glyph->library, &dummy, render_mode );\n\n#if 1\n    if ( !destroy && origin )\n    {\n      FT_Vector  v;\n\n\n      v.x = -origin->x;\n      v.y = -origin->y;\n      FT_Glyph_Transform( glyph, 0, &v );\n    }\n#endif\n\n    if ( error )\n      goto Exit;\n\n    /* in case of success, copy the bitmap to the glyph bitmap */\n    error = ft_bitmap_glyph_init( (FT_Glyph)bitmap, &dummy );\n    if ( error )\n      goto Exit;\n\n    /* copy advance */\n    bitmap->root.advance = glyph->advance;\n\n    if ( destroy )\n      FT_Done_Glyph( glyph );\n\n    *the_glyph = FT_GLYPH( bitmap );\n\n  Exit:\n    if ( error && bitmap )\n      FT_Done_Glyph( FT_GLYPH( bitmap ) );\n\n    return error;\n\n  Bad:\n    error = FT_THROW( Invalid_Argument );\n    goto Exit;\n  }\n\n\n  /* documentation is in ftglyph.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Done_Glyph( FT_Glyph  glyph )\n  {\n    if ( glyph )\n    {\n      FT_Memory              memory = glyph->library->memory;\n      const FT_Glyph_Class*  clazz  = glyph->clazz;\n\n\n      if ( clazz->glyph_done )\n        clazz->glyph_done( glyph );\n\n      FT_FREE( glyph );\n    }\n  }\n\n\n/* END */\n#endif\n\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftinit.c",
    "content": "#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501\n/***************************************************************************/\n/*                                                                         */\n/*  ftinit.c                                                               */\n/*                                                                         */\n/*    FreeType initialization layer (body).                                */\n/*                                                                         */\n/*  Copyright 1996-2002, 2005, 2007, 2009, 2012, 2013 by                   */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  The purpose of this file is to implement the following two           */\n  /*  functions:                                                           */\n  /*                                                                       */\n  /*  FT_Add_Default_Modules():                                            */\n  /*     This function is used to add the set of default modules to a      */\n  /*     fresh new library object.  The set is taken from the header file  */\n  /*     `freetype/config/ftmodule.h'.  See the document `FreeType 2.0     */\n  /*     Build System' for more information.                               */\n  /*                                                                       */\n  /*  FT_Init_FreeType():                                                  */\n  /*     This function creates a system object for the current platform,   */\n  /*     builds a library out of it, then calls FT_Default_Drivers().      */\n  /*                                                                       */\n  /*  Note that even if FT_Init_FreeType() uses the implementation of the  */\n  /*  system object defined at build time, client applications are still   */\n  /*  able to provide their own `ftsystem.c'.                              */\n  /*                                                                       */\n  /*************************************************************************/\n\n#define FT2_BUILD_LIBRARY\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/config/ftconfig.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/ftmodapi.h\"\n#include \"basepic.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_init\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n\n#undef  FT_USE_MODULE\n#ifdef __cplusplus\n#define FT_USE_MODULE( type, x )  extern \"C\" const type  x;\n#else\n#define FT_USE_MODULE( type, x )  extern const type  x;\n#endif\n\n#include \"../../include/freetype/config/ftmodule.h\"\n\n#undef  FT_USE_MODULE\n#define FT_USE_MODULE( type, x )  (const FT_Module_Class*)&(x),\n\n  static\n  const FT_Module_Class*  const ft_default_modules[] =\n  {\n#include \"../../include/freetype/config/ftmodule.h\"\n    0\n  };\n\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n\n#ifdef __cplusplus\n#define FT_EXTERNC  extern \"C\"\n#else\n#define FT_EXTERNC  extern\n#endif\n\n  /* declare the module's class creation/destruction functions */\n#undef  FT_USE_MODULE\n#define FT_USE_MODULE( type, x )                            \\\n  FT_EXTERNC FT_Error                                       \\\n  FT_Create_Class_ ## x( FT_Library         library,        \\\n                         FT_Module_Class*  *output_class ); \\\n  FT_EXTERNC void                                           \\\n  FT_Destroy_Class_ ## x( FT_Library        library,        \\\n                          FT_Module_Class*  clazz );\n\n#include \"../../include/freetype/config/ftmodule.h\"\n\n  /* count all module classes */\n#undef  FT_USE_MODULE\n#define FT_USE_MODULE( type, x )  MODULE_CLASS_ ## x,\n\n  enum\n  {\n#include \"../../include/freetype/config/ftmodule.h\"\n    FT_NUM_MODULE_CLASSES\n  };\n\n  /* destroy all module classes */\n#undef  FT_USE_MODULE\n#define FT_USE_MODULE( type, x )                   \\\n  if ( classes[i] )                                \\\n  {                                                \\\n    FT_Destroy_Class_ ## x( library, classes[i] ); \\\n  }                                                \\\n  i++;\n\n\n  FT_BASE_DEF( void )\n  ft_destroy_default_module_classes( FT_Library  library )\n  {\n    FT_Module_Class*  *classes;\n    FT_Memory          memory;\n    FT_UInt            i;\n    BasePIC*           pic_container = (BasePIC*)library->pic_container.base;\n\n\n    if ( !pic_container->default_module_classes )\n      return;\n\n    memory  = library->memory;\n    classes = pic_container->default_module_classes;\n    i       = 0;\n\n#include \"../../include/freetype/config/ftmodule.h\"\n\n    FT_FREE( classes );\n    pic_container->default_module_classes = 0;\n  }\n\n\n  /* initialize all module classes and the pointer table */\n#undef  FT_USE_MODULE\n#define FT_USE_MODULE( type, x )                     \\\n  error = FT_Create_Class_ ## x( library, &clazz );  \\\n  if ( error )                                       \\\n    goto Exit;                                       \\\n  classes[i++] = clazz;\n\n\n  FT_BASE_DEF( FT_Error )\n  ft_create_default_module_classes( FT_Library  library )\n  {\n    FT_Error           error;\n    FT_Memory          memory;\n    FT_Module_Class*  *classes = NULL;\n    FT_Module_Class*   clazz;\n    FT_UInt            i;\n    BasePIC*           pic_container = (BasePIC*)library->pic_container.base;\n\n\n    memory = library->memory;\n\n    pic_container->default_module_classes = 0;\n\n    if ( FT_ALLOC( classes, sizeof ( FT_Module_Class* ) *\n                              ( FT_NUM_MODULE_CLASSES + 1 ) ) )\n      return error;\n\n    /* initialize all pointers to 0, especially the last one */\n    for ( i = 0; i < FT_NUM_MODULE_CLASSES; i++ )\n      classes[i] = 0;\n    classes[FT_NUM_MODULE_CLASSES] = 0;\n\n    i = 0;\n\n#include \"../../include/freetype/config/ftmodule.h\"\n\n  Exit:\n    if ( error )\n      ft_destroy_default_module_classes( library );\n    else\n      pic_container->default_module_classes = classes;\n\n    return error;\n  }\n\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n  /* documentation is in ftmodapi.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Add_Default_Modules( FT_Library  library )\n  {\n    FT_Error                       error;\n    const FT_Module_Class* const*  cur;\n\n\n    /* FT_DEFAULT_MODULES_GET dereferences `library' in PIC mode */\n#ifdef FT_CONFIG_OPTION_PIC\n    if ( !library )\n      return;\n#endif\n\n    /* GCC 4.6 warns the type difference:\n     *   FT_Module_Class** != const FT_Module_Class* const*\n     */\n    cur = (const FT_Module_Class* const*)FT_DEFAULT_MODULES_GET;\n\n    /* test for valid `library' delayed to FT_Add_Module() */\n    while ( *cur )\n    {\n      error = FT_Add_Module( library, *cur );\n      /* notify errors, but don't stop */\n      if ( error )\n        FT_TRACE0(( \"FT_Add_Default_Module:\"\n                    \" Cannot install `%s', error = 0x%x\\n\",\n                    (*cur)->module_name, error ));\n      cur++;\n    }\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Init_FreeType( FT_Library  *alibrary )\n  {\n    FT_Error   error;\n    FT_Memory  memory;\n\n\n    /* First of all, allocate a new system object -- this function is part */\n    /* of the system-specific component, i.e. `ftsystem.c'.                */\n\n    memory = FT_New_Memory();\n    if ( !memory )\n    {\n      FT_ERROR(( \"FT_Init_FreeType: cannot find memory manager\\n\" ));\n      return FT_THROW( Unimplemented_Feature );\n    }\n\n    /* build a library out of it, then fill it with the set of */\n    /* default drivers.                                        */\n\n    error = FT_New_Library( memory, alibrary );\n    if ( error )\n      FT_Done_Memory( memory );\n    else\n      FT_Add_Default_Modules( *alibrary );\n\n    return error;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Done_FreeType( FT_Library  library )\n  {\n    if ( library )\n    {\n      FT_Memory  memory = library->memory;\n\n\n      /* Discard the library object */\n      FT_Done_Library( library );\n\n      /* discard memory manager */\n      FT_Done_Memory( memory );\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n/* END */\n#endif\n\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftlcdfil.c",
    "content": "#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501\n/***************************************************************************/\n/*                                                                         */\n/*  ftlcdfil.c                                                             */\n/*                                                                         */\n/*    FreeType API for color filtering of subpixel bitmap glyphs (body).   */\n/*                                                                         */\n/*  Copyright 2006, 2008-2010, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#define FT2_BUILD_LIBRARY\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n\n#include \"../../include/freetype/ftlcdfil.h\"\n#include \"../../include/freetype/ftimage.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n\n\n#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING\n\n/* define USE_LEGACY to implement the legacy filter */\n#define  USE_LEGACY\n\n  /* FIR filter used by the default and light filters */\n  static void\n  _ft_lcd_filter_fir( FT_Bitmap*      bitmap,\n                      FT_Render_Mode  mode,\n                      FT_Library      library )\n  {\n    FT_Byte*  weights = library->lcd_weights;\n    FT_UInt   width   = (FT_UInt)bitmap->width;\n    FT_UInt   height  = (FT_UInt)bitmap->rows;\n\n\n    /* horizontal in-place FIR filter */\n    if ( mode == FT_RENDER_MODE_LCD && width >= 4 )\n    {\n      FT_Byte*  line = bitmap->buffer;\n\n\n      for ( ; height > 0; height--, line += bitmap->pitch )\n      {\n        FT_UInt  fir[5];\n        FT_UInt  val1, xx;\n\n\n        val1   = line[0];\n        fir[0] = weights[2] * val1;\n        fir[1] = weights[3] * val1;\n        fir[2] = weights[4] * val1;\n        fir[3] = 0;\n        fir[4] = 0;\n\n        val1    = line[1];\n        fir[0] += weights[1] * val1;\n        fir[1] += weights[2] * val1;\n        fir[2] += weights[3] * val1;\n        fir[3] += weights[4] * val1;\n\n        for ( xx = 2; xx < width; xx++ )\n        {\n          FT_UInt  val, pix;\n\n\n          val    = line[xx];\n          pix    = fir[0] + weights[0] * val;\n          fir[0] = fir[1] + weights[1] * val;\n          fir[1] = fir[2] + weights[2] * val;\n          fir[2] = fir[3] + weights[3] * val;\n          fir[3] =          weights[4] * val;\n\n          pix        >>= 8;\n          pix         |= (FT_UInt)-(FT_Int)( pix >> 8 );\n          line[xx - 2] = (FT_Byte)pix;\n        }\n\n        {\n          FT_UInt  pix;\n\n\n          pix          = fir[0] >> 8;\n          pix         |= (FT_UInt)-(FT_Int)( pix >> 8 );\n          line[xx - 2] = (FT_Byte)pix;\n\n          pix          = fir[1] >> 8;\n          pix         |= (FT_UInt)-(FT_Int)( pix >> 8 );\n          line[xx - 1] = (FT_Byte)pix;\n        }\n      }\n    }\n\n    /* vertical in-place FIR filter */\n    else if ( mode == FT_RENDER_MODE_LCD_V && height >= 4 )\n    {\n      FT_Byte*  column = bitmap->buffer;\n      FT_Int    pitch  = bitmap->pitch;\n\n\n      for ( ; width > 0; width--, column++ )\n      {\n        FT_Byte*  col = column;\n        FT_UInt   fir[5];\n        FT_UInt   val1, yy;\n\n\n        val1   = col[0];\n        fir[0] = weights[2] * val1;\n        fir[1] = weights[3] * val1;\n        fir[2] = weights[4] * val1;\n        fir[3] = 0;\n        fir[4] = 0;\n        col   += pitch;\n\n        val1    = col[0];\n        fir[0] += weights[1] * val1;\n        fir[1] += weights[2] * val1;\n        fir[2] += weights[3] * val1;\n        fir[3] += weights[4] * val1;\n        col    += pitch;\n\n        for ( yy = 2; yy < height; yy++ )\n        {\n          FT_UInt  val, pix;\n\n\n          val    = col[0];\n          pix    = fir[0] + weights[0] * val;\n          fir[0] = fir[1] + weights[1] * val;\n          fir[1] = fir[2] + weights[2] * val;\n          fir[2] = fir[3] + weights[3] * val;\n          fir[3] =          weights[4] * val;\n\n          pix           >>= 8;\n          pix            |= (FT_UInt)-(FT_Int)( pix >> 8 );\n          col[-2 * pitch] = (FT_Byte)pix;\n          col            += pitch;\n        }\n\n        {\n          FT_UInt  pix;\n\n\n          pix             = fir[0] >> 8;\n          pix            |= (FT_UInt)-(FT_Int)( pix >> 8 );\n          col[-2 * pitch] = (FT_Byte)pix;\n\n          pix         = fir[1] >> 8;\n          pix            |= (FT_UInt)-(FT_Int)( pix >> 8 );\n          col[-pitch] = (FT_Byte)pix;\n        }\n      }\n    }\n  }\n\n\n#ifdef USE_LEGACY\n\n  /* intra-pixel filter used by the legacy filter */\n  static void\n  _ft_lcd_filter_legacy( FT_Bitmap*      bitmap,\n                         FT_Render_Mode  mode,\n                         FT_Library      library )\n  {\n    FT_UInt  width  = (FT_UInt)bitmap->width;\n    FT_UInt  height = (FT_UInt)bitmap->rows;\n    FT_Int   pitch  = bitmap->pitch;\n\n    static const int  filters[3][3] =\n    {\n      { 65538 * 9/13, 65538 * 1/6, 65538 * 1/13 },\n      { 65538 * 3/13, 65538 * 4/6, 65538 * 3/13 },\n      { 65538 * 1/13, 65538 * 1/6, 65538 * 9/13 }\n    };\n\n    FT_UNUSED( library );\n\n\n    /* horizontal in-place intra-pixel filter */\n    if ( mode == FT_RENDER_MODE_LCD && width >= 3 )\n    {\n      FT_Byte*  line = bitmap->buffer;\n\n\n      for ( ; height > 0; height--, line += pitch )\n      {\n        FT_UInt  xx;\n\n\n        for ( xx = 0; xx < width; xx += 3 )\n        {\n          FT_UInt  r = 0;\n          FT_UInt  g = 0;\n          FT_UInt  b = 0;\n          FT_UInt  p;\n\n\n          p  = line[xx];\n          r += filters[0][0] * p;\n          g += filters[0][1] * p;\n          b += filters[0][2] * p;\n\n          p  = line[xx + 1];\n          r += filters[1][0] * p;\n          g += filters[1][1] * p;\n          b += filters[1][2] * p;\n\n          p  = line[xx + 2];\n          r += filters[2][0] * p;\n          g += filters[2][1] * p;\n          b += filters[2][2] * p;\n\n          line[xx]     = (FT_Byte)( r / 65536 );\n          line[xx + 1] = (FT_Byte)( g / 65536 );\n          line[xx + 2] = (FT_Byte)( b / 65536 );\n        }\n      }\n    }\n    else if ( mode == FT_RENDER_MODE_LCD_V && height >= 3 )\n    {\n      FT_Byte*  column = bitmap->buffer;\n\n\n      for ( ; width > 0; width--, column++ )\n      {\n        FT_Byte*  col     = column;\n        FT_Byte*  col_end = col + height * pitch;\n\n\n        for ( ; col < col_end; col += 3 * pitch )\n        {\n          FT_UInt  r = 0;\n          FT_UInt  g = 0;\n          FT_UInt  b = 0;\n          FT_UInt  p;\n\n\n          p  = col[0];\n          r += filters[0][0] * p;\n          g += filters[0][1] * p;\n          b += filters[0][2] * p;\n\n          p  = col[pitch];\n          r += filters[1][0] * p;\n          g += filters[1][1] * p;\n          b += filters[1][2] * p;\n\n          p  = col[pitch * 2];\n          r += filters[2][0] * p;\n          g += filters[2][1] * p;\n          b += filters[2][2] * p;\n\n          col[0]         = (FT_Byte)( r / 65536 );\n          col[pitch]     = (FT_Byte)( g / 65536 );\n          col[2 * pitch] = (FT_Byte)( b / 65536 );\n        }\n      }\n    }\n  }\n\n#endif /* USE_LEGACY */\n\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Library_SetLcdFilterWeights( FT_Library      library,\n                                  unsigned char  *weights )\n  {\n    if ( !library || !weights )\n      return FT_THROW( Invalid_Argument );\n\n    ft_memcpy( library->lcd_weights, weights, 5 );\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Library_SetLcdFilter( FT_Library    library,\n                           FT_LcdFilter  filter )\n  {\n    static const FT_Byte  light_filter[5] =\n                            { 0x00, 0x55, 0x56, 0x55, 0x00 };\n    /* the values here sum up to a value larger than 256, */\n    /* providing a cheap gamma correction                 */\n    static const FT_Byte  default_filter[5] =\n                            { 0x10, 0x40, 0x70, 0x40, 0x10 };\n\n\n    if ( !library )\n      return FT_THROW( Invalid_Argument );\n\n    switch ( filter )\n    {\n    case FT_LCD_FILTER_NONE:\n      library->lcd_filter_func = NULL;\n      library->lcd_extra       = 0;\n      break;\n\n    case FT_LCD_FILTER_DEFAULT:\n#if defined( FT_FORCE_LEGACY_LCD_FILTER )\n\n      library->lcd_filter_func = _ft_lcd_filter_legacy;\n      library->lcd_extra       = 0;\n\n#elif defined( FT_FORCE_LIGHT_LCD_FILTER )\n\n      ft_memcpy( library->lcd_weights, light_filter, 5 );\n      library->lcd_filter_func = _ft_lcd_filter_fir;\n      library->lcd_extra       = 2;\n\n#else\n\n      ft_memcpy( library->lcd_weights, default_filter, 5 );\n      library->lcd_filter_func = _ft_lcd_filter_fir;\n      library->lcd_extra       = 2;\n\n#endif\n\n      break;\n\n    case FT_LCD_FILTER_LIGHT:\n      ft_memcpy( library->lcd_weights, light_filter, 5 );\n      library->lcd_filter_func = _ft_lcd_filter_fir;\n      library->lcd_extra       = 2;\n      break;\n\n#ifdef USE_LEGACY\n\n    case FT_LCD_FILTER_LEGACY:\n      library->lcd_filter_func = _ft_lcd_filter_legacy;\n      library->lcd_extra       = 0;\n      break;\n\n#endif\n\n    default:\n      return FT_THROW( Invalid_Argument );\n    }\n\n    library->lcd_filter = filter;\n\n    return FT_Err_Ok;\n  }\n\n#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Library_SetLcdFilterWeights( FT_Library      library,\n                                  unsigned char  *weights )\n  {\n    FT_UNUSED( library );\n    FT_UNUSED( weights );\n\n    return FT_THROW( Unimplemented_Feature );\n  }\n\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Library_SetLcdFilter( FT_Library    library,\n                           FT_LcdFilter  filter )\n  {\n    FT_UNUSED( library );\n    FT_UNUSED( filter );\n\n    return FT_THROW( Unimplemented_Feature );\n  }\n\n#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */\n\n\n/* END */\n#endif\n\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftmm.c",
    "content": "#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501\n/***************************************************************************/\n/*                                                                         */\n/*  ftmm.c                                                                 */\n/*                                                                         */\n/*    Multiple Master font support (body).                                 */\n/*                                                                         */\n/*  Copyright 1996-2001, 2003, 2004, 2009, 2013 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#define FT2_BUILD_LIBRARY\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/ftmm.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/internal/services/svmm.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_mm\n\n\n  static FT_Error\n  ft_face_get_mm_service( FT_Face                   face,\n                          FT_Service_MultiMasters  *aservice )\n  {\n    FT_Error  error;\n\n\n    *aservice = NULL;\n\n    if ( !face )\n      return FT_THROW( Invalid_Face_Handle );\n\n    error = FT_ERR( Invalid_Argument );\n\n    if ( FT_HAS_MULTIPLE_MASTERS( face ) )\n    {\n      FT_FACE_LOOKUP_SERVICE( face,\n                              *aservice,\n                              MULTI_MASTERS );\n\n      if ( *aservice )\n        error = FT_Err_Ok;\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in ftmm.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_Multi_Master( FT_Face           face,\n                       FT_Multi_Master  *amaster )\n  {\n    FT_Error                 error;\n    FT_Service_MultiMasters  service;\n\n\n    error = ft_face_get_mm_service( face, &service );\n    if ( !error )\n    {\n      error = FT_ERR( Invalid_Argument );\n      if ( service->get_mm )\n        error = service->get_mm( face, amaster );\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in ftmm.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_MM_Var( FT_Face      face,\n                 FT_MM_Var*  *amaster )\n  {\n    FT_Error                 error;\n    FT_Service_MultiMasters  service;\n\n\n    error = ft_face_get_mm_service( face, &service );\n    if ( !error )\n    {\n      error = FT_ERR( Invalid_Argument );\n      if ( service->get_mm_var )\n        error = service->get_mm_var( face, amaster );\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in ftmm.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Set_MM_Design_Coordinates( FT_Face   face,\n                                FT_UInt   num_coords,\n                                FT_Long*  coords )\n  {\n    FT_Error                 error;\n    FT_Service_MultiMasters  service;\n\n\n    error = ft_face_get_mm_service( face, &service );\n    if ( !error )\n    {\n      error = FT_ERR( Invalid_Argument );\n      if ( service->set_mm_design )\n        error = service->set_mm_design( face, num_coords, coords );\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in ftmm.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Set_Var_Design_Coordinates( FT_Face    face,\n                                 FT_UInt    num_coords,\n                                 FT_Fixed*  coords )\n  {\n    FT_Error                 error;\n    FT_Service_MultiMasters  service;\n\n\n    error = ft_face_get_mm_service( face, &service );\n    if ( !error )\n    {\n      error = FT_ERR( Invalid_Argument );\n      if ( service->set_var_design )\n        error = service->set_var_design( face, num_coords, coords );\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in ftmm.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Set_MM_Blend_Coordinates( FT_Face    face,\n                               FT_UInt    num_coords,\n                               FT_Fixed*  coords )\n  {\n    FT_Error                 error;\n    FT_Service_MultiMasters  service;\n\n\n    error = ft_face_get_mm_service( face, &service );\n    if ( !error )\n    {\n      error = FT_ERR( Invalid_Argument );\n      if ( service->set_mm_blend )\n         error = service->set_mm_blend( face, num_coords, coords );\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in ftmm.h */\n\n  /* This is exactly the same as the previous function.  It exists for */\n  /* orthogonality.                                                    */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Set_Var_Blend_Coordinates( FT_Face    face,\n                                FT_UInt    num_coords,\n                                FT_Fixed*  coords )\n  {\n    FT_Error                 error;\n    FT_Service_MultiMasters  service;\n\n\n    error = ft_face_get_mm_service( face, &service );\n    if ( !error )\n    {\n      error = FT_ERR( Invalid_Argument );\n      if ( service->set_mm_blend )\n         error = service->set_mm_blend( face, num_coords, coords );\n    }\n\n    return error;\n  }\n\n\n/* END */\n#endif\n\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftsystem.c",
    "content": "#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501\n/***************************************************************************/\n/*                                                                         */\n/*  ftsystem.c                                                             */\n/*                                                                         */\n/*    ANSI-specific FreeType low-level system interface (body).            */\n/*                                                                         */\n/*  Copyright 1996-2002, 2006, 2008-2011, 2013 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file contains the default interface used by FreeType to access   */\n  /* low-level, i.e. memory management, i/o access as well as thread       */\n  /* synchronisation.  It can be replaced by user-specific routines if     */\n  /* necessary.                                                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n#define FT2_BUILD_LIBRARY\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/config/ftconfig.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/ftsystem.h\"\n#include \"../../include/freetype/fterrors.h\"\n#include \"../../include/freetype/fttypes.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                       MEMORY MANAGEMENT INTERFACE                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* It is not necessary to do any error checking for the                  */\n  /* allocation-related functions.  This will be done by the higher level  */\n  /* routines like ft_mem_alloc() or ft_mem_realloc().                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n#define _FOXIT_MEM_MANAGER_\n\n#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)\nextern \"C\" {\n#endif\n\n/** Allocate number of bytes */\nvoid*\tFXMEM_DefaultAlloc(int byte_size, int flags);\n\n/** Allocate with debug information */\nvoid*\tFXMEM_DefaultAllocDebug(int size, int flags, const char* file, int line);\n\nvoid*\tFXMEM_DefaultRealloc(void* pointer, int new_size, int flags);\n\n/** Free previously allocated memory */\nvoid\tFXMEM_DefaultFree(void* pointer, int flags);\n\n#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)\n}\n#endif\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    ft_alloc                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The memory allocation function.                                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory :: A pointer to the memory object.                          */\n  /*                                                                       */\n  /*    size   :: The requested size in bytes.                             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The address of newly allocated block.                              */\n  /*                                                                       */\n  FT_CALLBACK_DEF( void* )\n  ft_alloc( FT_Memory  memory,\n            long       size )\n  {\n    FT_UNUSED( memory );\n  #ifdef _FOXIT_MEM_MANAGER_\n\treturn FXMEM_DefaultAlloc(size, 0);\n#else\n    return ft_smalloc( size );\n#endif\n  }\n  \n  /* XYQ 2006-10-12 */\n#ifdef _XYQ_MEM_DEBUG\n  FT_CALLBACK_DEF( void* )\n\t  ft_allocdebug( FT_Memory  memory,\n\t  long       size, const char* filename, int line)\n  {\n\t  FT_UNUSED( memory );\n\t  \n\t  return FXMEM_DefaultAllocDebug( size, 0, filename, line );\n  }\n#endif\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    ft_realloc                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The memory reallocation function.                                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory   :: A pointer to the memory object.                        */\n  /*                                                                       */\n  /*    cur_size :: The current size of the allocated memory block.        */\n  /*                                                                       */\n  /*    new_size :: The newly requested size in bytes.                     */\n  /*                                                                       */\n  /*    block    :: The current address of the block in memory.            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The address of the reallocated memory block.                       */\n  /*                                                                       */\n  FT_CALLBACK_DEF( void* )\n  ft_realloc( FT_Memory  memory,\n              long       cur_size,\n              long       new_size,\n              void*      block )\n  {\n    FT_UNUSED( memory );\n    FT_UNUSED( cur_size );\n\n#ifdef _FOXIT_MEM_MANAGER_\n\treturn FXMEM_DefaultRealloc(block, new_size, 0);\n#else\n    return ft_srealloc( block, new_size );\n#endif\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    ft_free                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The memory release function.                                       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory  :: A pointer to the memory object.                         */\n  /*                                                                       */\n  /*    block   :: The address of block in memory to be freed.             */\n  /*                                                                       */\n  FT_CALLBACK_DEF( void )\n  ft_free( FT_Memory  memory,\n           void*      block )\n  {\n    FT_UNUSED( memory );\n\n#ifdef _FOXIT_MEM_MANAGER_\n\tFXMEM_DefaultFree(block, 0);\n#else\n    ft_sfree( block );\n#endif\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                     RESOURCE MANAGEMENT INTERFACE                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_io\n\n  /* We use the macro STREAM_FILE for convenience to extract the       */\n  /* system-specific stream handle from a given FreeType stream object */\n#define STREAM_FILE( stream )  ( (FT_FILE*)stream->descriptor.pointer )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    ft_ansi_stream_close                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The function to close a stream.                                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream :: A pointer to the stream object.                          */\n  /*                                                                       */\n  FT_CALLBACK_DEF( void )\n  ft_ansi_stream_close( FT_Stream  stream )\n  {\n//#if _FX_COMPILER_ != _FX_IARCC_ && _FX_OS_ != _FX_PALMOS_\n    ft_fclose( STREAM_FILE( stream ) );\n\n    stream->descriptor.pointer = NULL;\n    stream->size               = 0;\n    stream->base               = 0;\n//#endif\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    ft_ansi_stream_io                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The function to open a stream.                                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream :: A pointer to the stream object.                          */\n  /*                                                                       */\n  /*    offset :: The position in the data stream to start reading.        */\n  /*                                                                       */\n  /*    buffer :: The address of buffer to store the read data.            */\n  /*                                                                       */\n  /*    count  :: The number of bytes to read from the stream.             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The number of bytes actually read.  If `count' is zero (this is,   */\n  /*    the function is used for seeking), a non-zero return value         */\n  /*    indicates an error.                                                */\n  /*                                                                       */\n  FT_CALLBACK_DEF( unsigned long )\n  ft_ansi_stream_io( FT_Stream       stream,\n                     unsigned long   offset,\n                     unsigned char*  buffer,\n                     unsigned long   count )\n  {\n//#if _FX_COMPILER_ != _FX_IARCC_ && _FX_OS_ != _FX_PALMOS_\n    FT_FILE*  file;\n\n\n    if ( !count && offset > stream->size )\n      return 1;\n\n    file = STREAM_FILE( stream );\n\n    if ( stream->pos != offset )\n      ft_fseek( file, offset, SEEK_SET );\n\n    return (unsigned long)ft_fread( buffer, 1, count, file );\n//#else\n//    return 0;\n//#endif\n  }\n\n\n  /* documentation is in ftstream.h */\n\n  FT_BASE_DEF( FT_Error )\n  FT_Stream_Open( FT_Stream    stream,\n                  const char*  filepathname )\n  {\n//#if _FX_COMPILER_ != _FX_IARCC_ && _FX_OS_ != _FX_PALMOS_\n    FT_FILE*  file;\n\n\n    if ( !stream )\n      return FT_THROW( Invalid_Stream_Handle );\n\n    stream->descriptor.pointer = NULL;\n    stream->pathname.pointer   = (char*)filepathname;\n    stream->base               = 0;\n    stream->pos                = 0;\n    stream->read               = NULL;\n    stream->close              = NULL;\n\n    file = ft_fopen( filepathname, \"rb\" );\n    if ( !file )\n    {\n      FT_ERROR(( \"FT_Stream_Open:\"\n                 \" could not open `%s'\\n\", filepathname ));\n\n      return FT_THROW( Cannot_Open_Resource );\n    }\n\n    ft_fseek( file, 0, FXSYS_SEEK_END );\n    stream->size = ft_ftell( file );\n    if ( !stream->size )\n    {\n      FT_ERROR(( \"FT_Stream_Open:\" ));\n      FT_ERROR(( \" opened `%s' but zero-sized\\n\", filepathname ));\n      ft_fclose( file );\n      return FT_THROW( Cannot_Open_Stream );\n    }\n    ft_fseek( file, 0, FXSYS_SEEK_SET );\n\n    stream->descriptor.pointer = file;\n    stream->read  = ft_ansi_stream_io;\n    stream->close = ft_ansi_stream_close;\n\n    FT_TRACE1(( \"FT_Stream_Open:\" ));\n    FT_TRACE1(( \" opened `%s' (%d bytes) successfully\\n\",\n                filepathname, stream->size ));\n//#endif\n\n    return FT_Err_Ok;\n  }\n\n#endif /* !FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */\n\n#ifdef FT_DEBUG_MEMORY\n\n  extern FT_Int\n  ft_mem_debug_init( FT_Memory  memory );\n\n  extern void\n  ft_mem_debug_done( FT_Memory  memory );\n\n#endif\n\n\n  /* documentation is in ftobjs.h */\n\n  FT_BASE_DEF( FT_Memory )\n  FT_New_Memory( void )\n  {\n    FT_Memory  memory;\n\n\n    memory = (FT_Memory)FXMEM_DefaultAlloc( sizeof ( *memory ), 0 );\n    if ( memory )\n    {\n      memory->user    = 0;\n      memory->alloc   = ft_alloc;\n#ifdef _XYQ_MEM_DEBUG\n\t  memory->allocdebug = ft_allocdebug;\n#endif\n      memory->realloc = ft_realloc;\n      memory->free    = ft_free;\n#ifdef FT_DEBUG_MEMORY\n      ft_mem_debug_init( memory );\n#endif\n    }\n\n    return memory;\n  }\n\n\n  /* documentation is in ftobjs.h */\n\n  FT_BASE_DEF( void )\n  FT_Done_Memory( FT_Memory  memory )\n  {\n#ifdef FT_DEBUG_MEMORY\n    ft_mem_debug_done( memory );\n#endif\n    FXMEM_DefaultFree( memory, 0 );\n  }\n\n\n/* END */\n#endif\n\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/md5.c",
    "content": "/*\n * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.\n * MD5 Message-Digest Algorithm (RFC 1321).\n *\n * Homepage:\n * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5\n *\n * Author:\n * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>\n *\n * This software was written by Alexander Peslyak in 2001.  No copyright is\n * claimed, and the software is hereby placed in the public domain.\n * In case this attempt to disclaim copyright and place the software in the\n * public domain is deemed null and void, then the software is\n * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the\n * general public under the following terms:\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * There's ABSOLUTELY NO WARRANTY, express or implied.\n *\n * (This is a heavily cut-down \"BSD license\".)\n *\n * This differs from Colin Plumb's older public domain implementation in that\n * no exactly 32-bit integer data type is required (any 32-bit or wider\n * unsigned integer data type will do), there's no compile-time endianness\n * configuration, and the function prototypes match OpenSSL's.  No code from\n * Colin Plumb's implementation has been reused; this comment merely compares\n * the properties of the two independent implementations.\n *\n * The primary goals of this implementation are portability and ease of use.\n * It is meant to be fast, but not as fast as possible.  Some known\n * optimizations are not included to reduce source code size and avoid\n * compile-time configuration.\n */\n\n#ifndef HAVE_OPENSSL\n\n#include <string.h>\n\n#include \"md5.h\"\n\n/*\n * The basic MD5 functions.\n *\n * F and G are optimized compared to their RFC 1321 definitions for\n * architectures that lack an AND-NOT instruction, just like in Colin Plumb's\n * implementation.\n */\n#define F(x, y, z)\t\t\t((z) ^ ((x) & ((y) ^ (z))))\n#define G(x, y, z)\t\t\t((y) ^ ((z) & ((x) ^ (y))))\n#define H(x, y, z)\t\t\t((x) ^ (y) ^ (z))\n#define I(x, y, z)\t\t\t((y) ^ ((x) | ~(z)))\n\n/*\n * The MD5 transformation for all four rounds.\n */\n#define STEP(f, a, b, c, d, x, t, s) \\\n\t(a) += f((b), (c), (d)) + (x) + (t); \\\n\t(a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \\\n\t(a) += (b);\n\n/*\n * SET reads 4 input bytes in little-endian byte order and stores them\n * in a properly aligned word in host byte order.\n *\n * The check for little-endian architectures that tolerate unaligned\n * memory accesses is just an optimization.  Nothing will break if it\n * doesn't work.\n */\n#if defined(__i386__) || defined(__x86_64__) || defined(__vax__)\n#define SET(n) \\\n\t(*(MD5_u32plus *)&ptr[(n) * 4])\n#define GET(n) \\\n\tSET(n)\n#else\n#define SET(n) \\\n\t(ctx->block[(n)] = \\\n\t(MD5_u32plus)ptr[(n) * 4] | \\\n\t((MD5_u32plus)ptr[(n) * 4 + 1] << 8) | \\\n\t((MD5_u32plus)ptr[(n) * 4 + 2] << 16) | \\\n\t((MD5_u32plus)ptr[(n) * 4 + 3] << 24))\n#define GET(n) \\\n\t(ctx->block[(n)])\n#endif\n\n/*\n * This processes one or more 64-byte data blocks, but does NOT update\n * the bit counters.  There are no alignment requirements.\n */\nstatic void *body(MD5_CTX *ctx, void *data, unsigned long size)\n{\n\tunsigned char *ptr;\n\tMD5_u32plus a, b, c, d;\n\tMD5_u32plus saved_a, saved_b, saved_c, saved_d;\n\n\tptr = (unsigned char *)data;\n\n\ta = ctx->a;\n\tb = ctx->b;\n\tc = ctx->c;\n\td = ctx->d;\n\n\tdo {\n\t\tsaved_a = a;\n\t\tsaved_b = b;\n\t\tsaved_c = c;\n\t\tsaved_d = d;\n\n/* Round 1 */\n\t\tSTEP(F, a, b, c, d, SET(0), 0xd76aa478, 7)\n\t\tSTEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12)\n\t\tSTEP(F, c, d, a, b, SET(2), 0x242070db, 17)\n\t\tSTEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22)\n\t\tSTEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7)\n\t\tSTEP(F, d, a, b, c, SET(5), 0x4787c62a, 12)\n\t\tSTEP(F, c, d, a, b, SET(6), 0xa8304613, 17)\n\t\tSTEP(F, b, c, d, a, SET(7), 0xfd469501, 22)\n\t\tSTEP(F, a, b, c, d, SET(8), 0x698098d8, 7)\n\t\tSTEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12)\n\t\tSTEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17)\n\t\tSTEP(F, b, c, d, a, SET(11), 0x895cd7be, 22)\n\t\tSTEP(F, a, b, c, d, SET(12), 0x6b901122, 7)\n\t\tSTEP(F, d, a, b, c, SET(13), 0xfd987193, 12)\n\t\tSTEP(F, c, d, a, b, SET(14), 0xa679438e, 17)\n\t\tSTEP(F, b, c, d, a, SET(15), 0x49b40821, 22)\n\n/* Round 2 */\n\t\tSTEP(G, a, b, c, d, GET(1), 0xf61e2562, 5)\n\t\tSTEP(G, d, a, b, c, GET(6), 0xc040b340, 9)\n\t\tSTEP(G, c, d, a, b, GET(11), 0x265e5a51, 14)\n\t\tSTEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20)\n\t\tSTEP(G, a, b, c, d, GET(5), 0xd62f105d, 5)\n\t\tSTEP(G, d, a, b, c, GET(10), 0x02441453, 9)\n\t\tSTEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14)\n\t\tSTEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20)\n\t\tSTEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5)\n\t\tSTEP(G, d, a, b, c, GET(14), 0xc33707d6, 9)\n\t\tSTEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14)\n\t\tSTEP(G, b, c, d, a, GET(8), 0x455a14ed, 20)\n\t\tSTEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5)\n\t\tSTEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9)\n\t\tSTEP(G, c, d, a, b, GET(7), 0x676f02d9, 14)\n\t\tSTEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20)\n\n/* Round 3 */\n\t\tSTEP(H, a, b, c, d, GET(5), 0xfffa3942, 4)\n\t\tSTEP(H, d, a, b, c, GET(8), 0x8771f681, 11)\n\t\tSTEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16)\n\t\tSTEP(H, b, c, d, a, GET(14), 0xfde5380c, 23)\n\t\tSTEP(H, a, b, c, d, GET(1), 0xa4beea44, 4)\n\t\tSTEP(H, d, a, b, c, GET(4), 0x4bdecfa9, 11)\n\t\tSTEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16)\n\t\tSTEP(H, b, c, d, a, GET(10), 0xbebfbc70, 23)\n\t\tSTEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4)\n\t\tSTEP(H, d, a, b, c, GET(0), 0xeaa127fa, 11)\n\t\tSTEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16)\n\t\tSTEP(H, b, c, d, a, GET(6), 0x04881d05, 23)\n\t\tSTEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4)\n\t\tSTEP(H, d, a, b, c, GET(12), 0xe6db99e5, 11)\n\t\tSTEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16)\n\t\tSTEP(H, b, c, d, a, GET(2), 0xc4ac5665, 23)\n\n/* Round 4 */\n\t\tSTEP(I, a, b, c, d, GET(0), 0xf4292244, 6)\n\t\tSTEP(I, d, a, b, c, GET(7), 0x432aff97, 10)\n\t\tSTEP(I, c, d, a, b, GET(14), 0xab9423a7, 15)\n\t\tSTEP(I, b, c, d, a, GET(5), 0xfc93a039, 21)\n\t\tSTEP(I, a, b, c, d, GET(12), 0x655b59c3, 6)\n\t\tSTEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10)\n\t\tSTEP(I, c, d, a, b, GET(10), 0xffeff47d, 15)\n\t\tSTEP(I, b, c, d, a, GET(1), 0x85845dd1, 21)\n\t\tSTEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6)\n\t\tSTEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10)\n\t\tSTEP(I, c, d, a, b, GET(6), 0xa3014314, 15)\n\t\tSTEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21)\n\t\tSTEP(I, a, b, c, d, GET(4), 0xf7537e82, 6)\n\t\tSTEP(I, d, a, b, c, GET(11), 0xbd3af235, 10)\n\t\tSTEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15)\n\t\tSTEP(I, b, c, d, a, GET(9), 0xeb86d391, 21)\n\n\t\ta += saved_a;\n\t\tb += saved_b;\n\t\tc += saved_c;\n\t\td += saved_d;\n\n\t\tptr += 64;\n\t} while (size -= 64);\n\n\tctx->a = a;\n\tctx->b = b;\n\tctx->c = c;\n\tctx->d = d;\n\n\treturn ptr;\n}\n\nvoid MD5_Init(MD5_CTX *ctx)\n{\n\tctx->a = 0x67452301;\n\tctx->b = 0xefcdab89;\n\tctx->c = 0x98badcfe;\n\tctx->d = 0x10325476;\n\n\tctx->lo = 0;\n\tctx->hi = 0;\n}\n\nvoid MD5_Update(MD5_CTX *ctx, void *data, unsigned long size)\n{\n\tMD5_u32plus saved_lo;\n\tunsigned long used, free;\n\n\tsaved_lo = ctx->lo;\n\tif ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo)\n\t\tctx->hi++;\n\tctx->hi += size >> 29;\n\n\tused = saved_lo & 0x3f;\n\n\tif (used) {\n\t\tfree = 64 - used;\n\n\t\tif (size < free) {\n\t\t\tmemcpy(&ctx->buffer[used], data, size);\n\t\t\treturn;\n\t\t}\n\n\t\tmemcpy(&ctx->buffer[used], data, free);\n\t\tdata = (unsigned char *)data + free;\n\t\tsize -= free;\n\t\tbody(ctx, ctx->buffer, 64);\n\t}\n\n\tif (size >= 64) {\n\t\tdata = body(ctx, data, size & ~(unsigned long)0x3f);\n\t\tsize &= 0x3f;\n\t}\n\n\tmemcpy(ctx->buffer, data, size);\n}\n\nvoid MD5_Final(unsigned char *result, MD5_CTX *ctx)\n{\n\tunsigned long used, free;\n\n\tused = ctx->lo & 0x3f;\n\n\tctx->buffer[used++] = 0x80;\n\n\tfree = 64 - used;\n\n\tif (free < 8) {\n\t\tmemset(&ctx->buffer[used], 0, free);\n\t\tbody(ctx, ctx->buffer, 64);\n\t\tused = 0;\n\t\tfree = 64;\n\t}\n\n\tmemset(&ctx->buffer[used], 0, free - 8);\n\n\tctx->lo <<= 3;\n\tctx->buffer[56] = ctx->lo;\n\tctx->buffer[57] = ctx->lo >> 8;\n\tctx->buffer[58] = ctx->lo >> 16;\n\tctx->buffer[59] = ctx->lo >> 24;\n\tctx->buffer[60] = ctx->hi;\n\tctx->buffer[61] = ctx->hi >> 8;\n\tctx->buffer[62] = ctx->hi >> 16;\n\tctx->buffer[63] = ctx->hi >> 24;\n\n\tbody(ctx, ctx->buffer, 64);\n\n\tresult[0] = ctx->a;\n\tresult[1] = ctx->a >> 8;\n\tresult[2] = ctx->a >> 16;\n\tresult[3] = ctx->a >> 24;\n\tresult[4] = ctx->b;\n\tresult[5] = ctx->b >> 8;\n\tresult[6] = ctx->b >> 16;\n\tresult[7] = ctx->b >> 24;\n\tresult[8] = ctx->c;\n\tresult[9] = ctx->c >> 8;\n\tresult[10] = ctx->c >> 16;\n\tresult[11] = ctx->c >> 24;\n\tresult[12] = ctx->d;\n\tresult[13] = ctx->d >> 8;\n\tresult[14] = ctx->d >> 16;\n\tresult[15] = ctx->d >> 24;\n\n\tmemset(ctx, 0, sizeof(*ctx));\n}\n\n#endif\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/base/md5.h",
    "content": "/*\n * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.\n * MD5 Message-Digest Algorithm (RFC 1321).\n *\n * Homepage:\n * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5\n *\n * Author:\n * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>\n *\n * This software was written by Alexander Peslyak in 2001.  No copyright is\n * claimed, and the software is hereby placed in the public domain.\n * In case this attempt to disclaim copyright and place the software in the\n * public domain is deemed null and void, then the software is\n * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the\n * general public under the following terms:\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * There's ABSOLUTELY NO WARRANTY, express or implied.\n *\n * See md5.c for more information.\n */\n\n#ifdef HAVE_OPENSSL\n#include <openssl/md5.h>\n#elif !defined(_MD5_H)\n#define _MD5_H\n\n/* Any 32-bit or wider unsigned integer data type will do */\ntypedef unsigned int MD5_u32plus;\n\ntypedef struct {\n\tMD5_u32plus lo, hi;\n\tMD5_u32plus a, b, c, d;\n\tunsigned char buffer[64];\n\tMD5_u32plus block[16];\n} MD5_CTX;\n\nextern void MD5_Init(MD5_CTX *ctx);\nextern void MD5_Update(MD5_CTX *ctx, void *data, unsigned long size);\nextern void MD5_Final(unsigned char *result, MD5_CTX *ctx);\n\n#endif\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/Jamfile",
    "content": "# FreeType 2 src/cff Jamfile\n#\n# Copyright 2001, 2002 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) cff ;\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = cffdrivr cffgload cffload cffobjs cffparse cffcmap cffpic ;\n  }\n  else\n  {\n    _sources = cff ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/cff Jamfile\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2arrst.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2arrst.c                                                             */\n/*                                                                         */\n/*    Adobe's code for Array Stacks (body).                                */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"cf2ft.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n\n#include \"cf2glue.h\"\n#include \"cf2arrst.h\"\n\n#include \"cf2error.h\"\n\n\n  /*\n   * CF2_ArrStack uses an error pointer, to enable shared errors.\n   * Shared errors are necessary when multiple objects allow the program\n   * to continue after detecting errors.  Only the first error should be\n   * recorded.\n   */\n\n  FT_LOCAL_DEF( void )\n  cf2_arrstack_init( CF2_ArrStack  arrstack,\n                     FT_Memory     memory,\n                     FT_Error*     error,\n                     size_t        sizeItem )\n  {\n    FT_ASSERT( arrstack != NULL );\n\n    /* initialize the structure */\n    arrstack->memory    = memory;\n    arrstack->error     = error;\n    arrstack->sizeItem  = sizeItem;\n    arrstack->allocated = 0;\n    arrstack->chunk     = 10;    /* chunks of 10 items */\n    arrstack->count     = 0;\n    arrstack->totalSize = 0;\n    arrstack->ptr       = NULL;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_arrstack_finalize( CF2_ArrStack  arrstack )\n  {\n    FT_Memory  memory = arrstack->memory;     /* for FT_FREE */\n\n\n    FT_ASSERT( arrstack != NULL );\n\n    arrstack->allocated = 0;\n    arrstack->count     = 0;\n    arrstack->totalSize = 0;\n\n    /* free the data buffer */\n    FT_FREE( arrstack->ptr );\n  }\n\n\n  /* allocate or reallocate the buffer size; */\n  /* return false on memory error */\n  static FT_Bool\n  cf2_arrstack_setNumElements( CF2_ArrStack  arrstack,\n                               size_t        numElements )\n  {\n    FT_ASSERT( arrstack != NULL );\n\n    {\n      FT_Error   error  = FT_Err_Ok;        /* for FT_REALLOC */\n      FT_Memory  memory = arrstack->memory; /* for FT_REALLOC */\n\n      FT_Long  newSize = (FT_Long)( numElements * arrstack->sizeItem );\n\n\n      if ( numElements > LONG_MAX / arrstack->sizeItem )\n        goto exit;\n\n\n      FT_ASSERT( newSize > 0 );   /* avoid realloc with zero size */\n\n      if ( !FT_REALLOC( arrstack->ptr, arrstack->totalSize, newSize ) )\n      {\n        arrstack->allocated = numElements;\n        arrstack->totalSize = newSize;\n\n        if ( arrstack->count > numElements )\n        {\n          /* we truncated the list! */\n          CF2_SET_ERROR( arrstack->error, Stack_Overflow );\n          arrstack->count = numElements;\n          return FALSE;\n        }\n\n        return TRUE;     /* success */\n      }\n    }\n\n  exit:\n    /* if there's not already an error, store this one */\n    CF2_SET_ERROR( arrstack->error, Out_Of_Memory );\n\n    return FALSE;\n  }\n\n\n  /* set the count, ensuring allocation is sufficient */\n  FT_LOCAL_DEF( void )\n  cf2_arrstack_setCount( CF2_ArrStack  arrstack,\n                         size_t        numElements )\n  {\n    FT_ASSERT( arrstack != NULL );\n\n    if ( numElements > arrstack->allocated )\n    {\n      /* expand the allocation first */\n      if ( !cf2_arrstack_setNumElements( arrstack, numElements ) )\n        return;\n    }\n\n    arrstack->count = numElements;\n  }\n\n\n  /* clear the count */\n  FT_LOCAL_DEF( void )\n  cf2_arrstack_clear( CF2_ArrStack  arrstack )\n  {\n    FT_ASSERT( arrstack != NULL );\n\n    arrstack->count = 0;\n  }\n\n\n  /* current number of items */\n  FT_LOCAL_DEF( size_t )\n  cf2_arrstack_size( const CF2_ArrStack  arrstack )\n  {\n    FT_ASSERT( arrstack != NULL );\n\n    return arrstack->count;\n  }\n\n\n  FT_LOCAL_DEF( void* )\n  cf2_arrstack_getBuffer( const CF2_ArrStack  arrstack )\n  {\n    FT_ASSERT( arrstack != NULL );\n\n    return arrstack->ptr;\n  }\n\n\n  /* return pointer to the given element */\n  FT_LOCAL_DEF( void* )\n  cf2_arrstack_getPointer( const CF2_ArrStack  arrstack,\n                           size_t              idx )\n  {\n    void*  newPtr;\n\n\n    FT_ASSERT( arrstack != NULL );\n\n    if ( idx >= arrstack->count )\n    {\n      /* overflow */\n      CF2_SET_ERROR( arrstack->error, Stack_Overflow );\n      idx = 0;    /* choose safe default */\n    }\n\n    newPtr = (FT_Byte*)arrstack->ptr + idx * arrstack->sizeItem;\n\n    return newPtr;\n  }\n\n\n  /* push (append) an element at the end of the list;         */\n  /* return false on memory error                             */\n  /* TODO: should there be a length param for extra checking? */\n  FT_LOCAL_DEF( void )\n  cf2_arrstack_push( CF2_ArrStack  arrstack,\n                     const void*   ptr )\n  {\n    FT_ASSERT( arrstack != NULL );\n\n    if ( arrstack->count == arrstack->allocated )\n    {\n      /* grow the buffer by one chunk */\n      if ( !cf2_arrstack_setNumElements(\n             arrstack, arrstack->allocated + arrstack->chunk ) )\n      {\n        /* on error, ignore the push */\n        return;\n      }\n    }\n\n    FT_ASSERT( ptr != NULL );\n\n    {\n      size_t  offset = arrstack->count * arrstack->sizeItem;\n      void*   newPtr = (FT_Byte*)arrstack->ptr + offset;\n\n\n      FT_MEM_COPY( newPtr, ptr, arrstack->sizeItem );\n      arrstack->count += 1;\n    }\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2arrst.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2arrst.h                                                             */\n/*                                                                         */\n/*    Adobe's code for Array Stacks (specification).                       */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CF2ARRST_H__\n#define __CF2ARRST_H__\n\n\n#include \"cf2error.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /* need to define the struct here (not opaque) so it can be allocated by */\n  /* clients                                                               */\n  typedef struct  CF2_ArrStackRec_\n  {\n    FT_Memory  memory;\n    FT_Error*  error;\n\n    size_t  sizeItem;       /* bytes per element             */\n    size_t  allocated;      /* items allocated               */\n    size_t  chunk;          /* allocation increment in items */\n    size_t  count;          /* number of elements allocated  */\n    size_t  totalSize;      /* total bytes allocated         */\n\n    void*  ptr;             /* ptr to data                   */\n\n  } CF2_ArrStackRec, *CF2_ArrStack;\n\n\n  FT_LOCAL( void )\n  cf2_arrstack_init( CF2_ArrStack  arrstack,\n                     FT_Memory     memory,\n                     FT_Error*     error,\n                     size_t        sizeItem );\n  FT_LOCAL( void )\n  cf2_arrstack_finalize( CF2_ArrStack  arrstack );\n\n  FT_LOCAL( void )\n  cf2_arrstack_setCount( CF2_ArrStack  arrstack,\n                         size_t        numElements );\n  FT_LOCAL( void )\n  cf2_arrstack_clear( CF2_ArrStack  arrstack );\n  FT_LOCAL( size_t )\n  cf2_arrstack_size( const CF2_ArrStack  arrstack );\n\n  FT_LOCAL( void* )\n  cf2_arrstack_getBuffer( const CF2_ArrStack  arrstack );\n  FT_LOCAL( void* )\n  cf2_arrstack_getPointer( const CF2_ArrStack  arrstack,\n                           size_t              idx );\n\n  FT_LOCAL( void )\n  cf2_arrstack_push( CF2_ArrStack  arrstack,\n                     const void*   ptr );\n\n\nFT_END_HEADER\n\n\n#endif /* __CF2ARRST_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2blues.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2blues.c                                                             */\n/*                                                                         */\n/*    Adobe's code for handling Blue Zones (body).                         */\n/*                                                                         */\n/*  Copyright 2009-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"cf2ft.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n\n#include \"cf2blues.h\"\n#include \"cf2hints.h\"\n#include \"cf2font.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cf2blues\n\n\n  /*\n   * For blue values, the FreeType parser produces an array of integers,\n   * while the Adobe CFF engine produces an array of fixed.\n   * Define a macro to convert FreeType to fixed.\n   */\n#define cf2_blueToFixed( x )  cf2_intToFixed( x )\n\n\n  FT_LOCAL_DEF( void )\n  cf2_blues_init( CF2_Blues  blues,\n                  CF2_Font   font )\n  {\n    /* pointer to parsed font object */\n    CFF_Decoder*  decoder = font->decoder;\n\n    CF2_Fixed  zoneHeight;\n    CF2_Fixed  maxZoneHeight = 0;\n    CF2_Fixed  csUnitsPerPixel;\n\n    size_t  numBlueValues;\n    size_t  numOtherBlues;\n    size_t  numFamilyBlues;\n    size_t  numFamilyOtherBlues;\n\n    FT_Pos*  blueValues;\n    FT_Pos*  otherBlues;\n    FT_Pos*  familyBlues;\n    FT_Pos*  familyOtherBlues;\n\n    size_t     i;\n    CF2_Fixed  emBoxBottom, emBoxTop;\n\n    CF2_Int  unitsPerEm = font->unitsPerEm;\n\n\n    if ( unitsPerEm == 0 )\n      unitsPerEm = 1000;\n\n    FT_ZERO( blues );\n    blues->scale = font->innerTransform.d;\n\n    cf2_getBlueMetrics( decoder,\n                        &blues->blueScale,\n                        &blues->blueShift,\n                        &blues->blueFuzz );\n\n    cf2_getBlueValues( decoder, &numBlueValues, &blueValues );\n    cf2_getOtherBlues( decoder, &numOtherBlues, &otherBlues );\n    cf2_getFamilyBlues( decoder, &numFamilyBlues, &familyBlues );\n    cf2_getFamilyOtherBlues( decoder, &numFamilyOtherBlues, &familyOtherBlues );\n\n    /*\n     * synthetic em box hint heuristic\n     *\n     * Apply this when ideographic dictionary (LanguageGroup 1) has no\n     * real alignment zones.  Adobe tools generate dummy zones at -250 and\n     * 1100 for a 1000 unit em.  Fonts with ICF-based alignment zones\n     * should not enable the heuristic.  When the heuristic is enabled,\n     * the font's blue zones are ignored.\n     *\n     */\n\n    /* get em box from OS/2 typoAscender/Descender                      */\n    /* TODO: FreeType does not parse these metrics.  Skip them for now. */\n#if 0\n    FCM_getHorizontalLineMetrics( &e,\n                                  font->font,\n                                  &ascender,\n                                  &descender,\n                                  &linegap );\n    if ( ascender - descender == unitsPerEm )\n    {\n      emBoxBottom = cf2_intToFixed( descender );\n      emBoxTop    = cf2_intToFixed( ascender );\n    }\n    else\n#endif\n    {\n      emBoxBottom = CF2_ICF_Bottom;\n      emBoxTop    = CF2_ICF_Top;\n    }\n\n    if ( cf2_getLanguageGroup( decoder ) == 1                   &&\n         ( numBlueValues == 0                                 ||\n           ( numBlueValues == 4                             &&\n             cf2_blueToFixed( blueValues[0] ) < emBoxBottom &&\n             cf2_blueToFixed( blueValues[1] ) < emBoxBottom &&\n             cf2_blueToFixed( blueValues[2] ) > emBoxTop    &&\n             cf2_blueToFixed( blueValues[3] ) > emBoxTop    ) ) )\n    {\n      /*\n       * Construct hint edges suitable for synthetic ghost hints at top\n       * and bottom of em box.  +-CF2_MIN_COUNTER allows for unhinted\n       * features above or below the last hinted edge.  This also gives a\n       * net 1 pixel boost to the height of ideographic glyphs.\n       *\n       * Note: Adjust synthetic hints outward by epsilon (0x.0001) to\n       *       avoid interference.  E.g., some fonts have real hints at\n       *       880 and -120.\n       */\n\n      blues->emBoxBottomEdge.csCoord = emBoxBottom - CF2_FIXED_EPSILON;\n      blues->emBoxBottomEdge.dsCoord = cf2_fixedRound(\n                                         FT_MulFix(\n                                           blues->emBoxBottomEdge.csCoord,\n                                           blues->scale ) ) -\n                                       CF2_MIN_COUNTER;\n      blues->emBoxBottomEdge.scale   = blues->scale;\n      blues->emBoxBottomEdge.flags   = CF2_GhostBottom |\n                                       CF2_Locked |\n                                       CF2_Synthetic;\n\n      blues->emBoxTopEdge.csCoord = emBoxTop + CF2_FIXED_EPSILON +\n                                    2 * font->darkenY;\n      blues->emBoxTopEdge.dsCoord = cf2_fixedRound(\n                                      FT_MulFix(\n                                        blues->emBoxTopEdge.csCoord,\n                                        blues->scale ) ) +\n                                    CF2_MIN_COUNTER;\n      blues->emBoxTopEdge.scale   = blues->scale;\n      blues->emBoxTopEdge.flags   = CF2_GhostTop |\n                                    CF2_Locked |\n                                    CF2_Synthetic;\n\n      blues->doEmBoxHints = TRUE;    /* enable the heuristic */\n\n      return;\n    }\n\n    /* copy `BlueValues' and `OtherBlues' to a combined array of top and */\n    /* bottom zones                                                      */\n    for ( i = 0; i < numBlueValues; i += 2 )\n    {\n      blues->zone[blues->count].csBottomEdge =\n        cf2_blueToFixed( blueValues[i] );\n      blues->zone[blues->count].csTopEdge =\n        cf2_blueToFixed( blueValues[i + 1] );\n\n      zoneHeight = blues->zone[blues->count].csTopEdge -\n                   blues->zone[blues->count].csBottomEdge;\n\n      if ( zoneHeight < 0 )\n      {\n        FT_TRACE4(( \"cf2_blues_init: ignoring negative zone height\\n\" ));\n        continue;   /* reject this zone */\n      }\n\n      if ( zoneHeight > maxZoneHeight )\n      {\n        /* take maximum before darkening adjustment      */\n        /* so overshoot suppression point doesn't change */\n        maxZoneHeight = zoneHeight;\n      }\n\n      /* adjust both edges of top zone upward by twice darkening amount */\n      if ( i != 0 )\n      {\n        blues->zone[blues->count].csTopEdge    += 2 * font->darkenY;\n        blues->zone[blues->count].csBottomEdge += 2 * font->darkenY;\n      }\n\n      /* first `BlueValue' is bottom zone; others are top */\n      if ( i == 0 )\n      {\n        blues->zone[blues->count].bottomZone =\n          TRUE;\n        blues->zone[blues->count].csFlatEdge =\n          blues->zone[blues->count].csTopEdge;\n      }\n      else\n      {\n        blues->zone[blues->count].bottomZone =\n          FALSE;\n        blues->zone[blues->count].csFlatEdge =\n          blues->zone[blues->count].csBottomEdge;\n      }\n\n      blues->count += 1;\n    }\n\n    for ( i = 0; i < numOtherBlues; i += 2 )\n    {\n      blues->zone[blues->count].csBottomEdge =\n        cf2_blueToFixed( otherBlues[i] );\n      blues->zone[blues->count].csTopEdge =\n        cf2_blueToFixed( otherBlues[i + 1] );\n\n      zoneHeight = blues->zone[blues->count].csTopEdge -\n                   blues->zone[blues->count].csBottomEdge;\n\n      if ( zoneHeight < 0 )\n      {\n        FT_TRACE4(( \"cf2_blues_init: ignoring negative zone height\\n\" ));\n        continue;   /* reject this zone */\n      }\n\n      if ( zoneHeight > maxZoneHeight )\n      {\n        /* take maximum before darkening adjustment      */\n        /* so overshoot suppression point doesn't change */\n        maxZoneHeight = zoneHeight;\n      }\n\n      /* Note: bottom zones are not adjusted for darkening amount */\n\n      /* all OtherBlues are bottom zone */\n      blues->zone[blues->count].bottomZone =\n        TRUE;\n      blues->zone[blues->count].csFlatEdge =\n        blues->zone[blues->count].csTopEdge;\n\n      blues->count += 1;\n    }\n\n    /* Adjust for FamilyBlues */\n\n    /* Search for the nearest flat edge in `FamilyBlues' or                */\n    /* `FamilyOtherBlues'.  According to the Black Book, any matching edge */\n    /* must be within one device pixel                                     */\n\n    csUnitsPerPixel = FT_DivFix( cf2_intToFixed( 1 ), blues->scale );\n\n    /* loop on all zones in this font */\n    for ( i = 0; i < blues->count; i++ )\n    {\n      size_t     j;\n      CF2_Fixed  minDiff;\n      CF2_Fixed  flatFamilyEdge, diff;\n      /* value for this font */\n      CF2_Fixed  flatEdge = blues->zone[i].csFlatEdge;\n\n\n      if ( blues->zone[i].bottomZone )\n      {\n        /* In a bottom zone, the top edge is the flat edge.             */\n        /* Search `FamilyOtherBlues' for bottom zones; look for closest */\n        /* Family edge that is within the one pixel threshold.          */\n\n        minDiff = CF2_FIXED_MAX;\n\n        for ( j = 0; j < numFamilyOtherBlues; j += 2 )\n        {\n          /* top edge */\n          flatFamilyEdge = cf2_blueToFixed( familyOtherBlues[j + 1] );\n\n          diff = cf2_fixedAbs( flatEdge - flatFamilyEdge );\n\n          if ( diff < minDiff && diff < csUnitsPerPixel )\n          {\n            blues->zone[i].csFlatEdge = flatFamilyEdge;\n            minDiff                   = diff;\n\n            if ( diff == 0 )\n              break;\n          }\n        }\n\n        /* check the first member of FamilyBlues, which is a bottom zone */\n        if ( numFamilyBlues >= 2 )\n        {\n          /* top edge */\n          flatFamilyEdge = cf2_blueToFixed( familyBlues[1] );\n\n          diff = cf2_fixedAbs( flatEdge - flatFamilyEdge );\n\n          if ( diff < minDiff && diff < csUnitsPerPixel )\n            blues->zone[i].csFlatEdge = flatFamilyEdge;\n        }\n      }\n      else\n      {\n        /* In a top zone, the bottom edge is the flat edge.                */\n        /* Search `FamilyBlues' for top zones; skip first zone, which is a */\n        /* bottom zone; look for closest Family edge that is within the    */\n        /* one pixel threshold                                             */\n\n        minDiff = CF2_FIXED_MAX;\n\n        for ( j = 2; j < numFamilyBlues; j += 2 )\n        {\n          /* bottom edge */\n          flatFamilyEdge = cf2_blueToFixed( familyBlues[j] );\n\n          /* adjust edges of top zone upward by twice darkening amount */\n          flatFamilyEdge += 2 * font->darkenY;      /* bottom edge */\n\n          diff = cf2_fixedAbs( flatEdge - flatFamilyEdge );\n\n          if ( diff < minDiff && diff < csUnitsPerPixel )\n          {\n            blues->zone[i].csFlatEdge = flatFamilyEdge;\n            minDiff                   = diff;\n\n            if ( diff == 0 )\n              break;\n          }\n        }\n      }\n    }\n\n    /* TODO: enforce separation of zones, including BlueFuzz */\n\n    /* Adjust BlueScale; similar to AdjustBlueScale() in coretype */\n    /* `bcsetup.c'.                                               */\n\n    if ( maxZoneHeight > 0 )\n    {\n      if ( blues->blueScale > FT_DivFix( cf2_intToFixed( 1 ),\n                                         maxZoneHeight ) )\n      {\n        /* clamp at maximum scale */\n        blues->blueScale = FT_DivFix( cf2_intToFixed( 1 ),\n                                      maxZoneHeight );\n      }\n\n      /*\n       * TODO: Revisit the bug fix for 613448.  The minimum scale\n       *       requirement catches a number of library fonts.  For\n       *       example, with default BlueScale (.039625) and 0.4 minimum,\n       *       the test below catches any font with maxZoneHeight < 10.1.\n       *       There are library fonts ranging from 2 to 10 that get\n       *       caught, including e.g., Eurostile LT Std Medium with\n       *       maxZoneHeight of 6.\n       *\n       */\n#if 0\n      if ( blueScale < .4 / maxZoneHeight )\n      {\n        tetraphilia_assert( 0 );\n        /* clamp at minimum scale, per bug 0613448 fix */\n        blueScale = .4 / maxZoneHeight;\n      }\n#endif\n\n    }\n\n    /*\n     * Suppress overshoot and boost blue zones at small sizes.  Boost\n     * amount varies linearly from 0.5 pixel near 0 to 0 pixel at\n     * blueScale cutoff.\n     * Note: This boost amount is different from the coretype heuristic.\n     *\n     */\n\n    if ( blues->scale < blues->blueScale )\n    {\n      blues->suppressOvershoot = TRUE;\n\n      /* Change rounding threshold for `dsFlatEdge'.                    */\n      /* Note: constant changed from 0.5 to 0.6 to avoid a problem with */\n      /*       10ppem Arial                                             */\n\n      blues->boost = FT_MulFix(\n                       cf2_floatToFixed( .6 ),\n                       ( cf2_intToFixed( 1 ) -\n                         FT_DivFix( blues->scale,\n                                    blues->blueScale ) ) );\n      if ( blues->boost > 0x7FFF )\n      {\n        /* boost must remain less than 0.5, or baseline could go negative */\n        blues->boost = 0x7FFF;\n      }\n    }\n\n    /* boost and darkening have similar effects; don't do both */\n    if ( font->stemDarkened )\n      blues->boost = 0;\n\n    /* set device space alignment for each zone;    */\n    /* apply boost amount before rounding flat edge */\n\n    for ( i = 0; i < blues->count; i++ )\n    {\n      if ( blues->zone[i].bottomZone )\n        blues->zone[i].dsFlatEdge = cf2_fixedRound(\n                                      FT_MulFix(\n                                        blues->zone[i].csFlatEdge,\n                                        blues->scale ) -\n                                      blues->boost );\n      else\n        blues->zone[i].dsFlatEdge = cf2_fixedRound(\n                                      FT_MulFix(\n                                        blues->zone[i].csFlatEdge,\n                                        blues->scale ) +\n                                      blues->boost );\n    }\n  }\n\n\n  /*\n   * Check whether `stemHint' is captured by one of the blue zones.\n   *\n   * Zero, one or both edges may be valid; only valid edges can be\n   * captured.  For compatibility with CoolType, search top and bottom\n   * zones in the same pass (see `BlueLock').  If a hint is captured,\n   * return true and position the edge(s) in one of 3 ways:\n   *\n   *  1) If `BlueScale' suppresses overshoot, position the captured edge\n   *     at the flat edge of the zone.\n   *  2) If overshoot is not suppressed and `BlueShift' requires\n   *     overshoot, position the captured edge a minimum of 1 device pixel\n   *     from the flat edge.\n   *  3) If overshoot is not suppressed or required, position the captured\n   *     edge at the nearest device pixel.\n   *\n   */\n  FT_LOCAL_DEF( FT_Bool )\n  cf2_blues_capture( const CF2_Blues  blues,\n                     CF2_Hint         bottomHintEdge,\n                     CF2_Hint         topHintEdge )\n  {\n    /* TODO: validate? */\n    CF2_Fixed  csFuzz = blues->blueFuzz;\n\n    /* new position of captured edge */\n    CF2_Fixed  dsNew;\n\n    /* amount that hint is moved when positioned */\n    CF2_Fixed  dsMove = 0;\n\n    FT_Bool   captured = FALSE;\n    CF2_UInt  i;\n\n\n    /* assert edge flags are consistent */\n    FT_ASSERT( !cf2_hint_isTop( bottomHintEdge ) &&\n               !cf2_hint_isBottom( topHintEdge ) );\n\n    /* TODO: search once without blue fuzz for compatibility with coretype? */\n    for ( i = 0; i < blues->count; i++ )\n    {\n      if ( blues->zone[i].bottomZone           &&\n           cf2_hint_isBottom( bottomHintEdge ) )\n      {\n        if ( ( blues->zone[i].csBottomEdge - csFuzz ) <=\n               bottomHintEdge->csCoord                   &&\n             bottomHintEdge->csCoord <=\n               ( blues->zone[i].csTopEdge + csFuzz )     )\n        {\n          /* bottom edge captured by bottom zone */\n\n          if ( blues->suppressOvershoot )\n            dsNew = blues->zone[i].dsFlatEdge;\n\n          else if ( ( blues->zone[i].csTopEdge - bottomHintEdge->csCoord ) >=\n                      blues->blueShift )\n          {\n            /* guarantee minimum of 1 pixel overshoot */\n            dsNew = FT_MIN(\n                      cf2_fixedRound( bottomHintEdge->dsCoord ),\n                      blues->zone[i].dsFlatEdge - cf2_intToFixed( 1 ) );\n          }\n\n          else\n          {\n            /* simply round captured edge */\n            dsNew = cf2_fixedRound( bottomHintEdge->dsCoord );\n          }\n\n          dsMove   = dsNew - bottomHintEdge->dsCoord;\n          captured = TRUE;\n\n          break;\n        }\n      }\n\n      if ( !blues->zone[i].bottomZone && cf2_hint_isTop( topHintEdge ) )\n      {\n        if ( ( blues->zone[i].csBottomEdge - csFuzz ) <=\n               topHintEdge->csCoord                      &&\n             topHintEdge->csCoord <=\n               ( blues->zone[i].csTopEdge + csFuzz )     )\n        {\n          /* top edge captured by top zone */\n\n          if ( blues->suppressOvershoot )\n            dsNew = blues->zone[i].dsFlatEdge;\n\n          else if ( ( topHintEdge->csCoord - blues->zone[i].csBottomEdge ) >=\n                      blues->blueShift )\n          {\n            /* guarantee minimum of 1 pixel overshoot */\n            dsNew = FT_MAX(\n                      cf2_fixedRound( topHintEdge->dsCoord ),\n                      blues->zone[i].dsFlatEdge + cf2_intToFixed( 1 ) );\n          }\n\n          else\n          {\n            /* simply round captured edge */\n            dsNew = cf2_fixedRound( topHintEdge->dsCoord );\n          }\n\n          dsMove   = dsNew - topHintEdge->dsCoord;\n          captured = TRUE;\n\n          break;\n        }\n      }\n    }\n\n    if ( captured )\n    {\n      /* move both edges and flag them `locked' */\n      if ( cf2_hint_isValid( bottomHintEdge ) )\n      {\n        bottomHintEdge->dsCoord += dsMove;\n        cf2_hint_lock( bottomHintEdge );\n      }\n\n      if ( cf2_hint_isValid( topHintEdge ) )\n      {\n        topHintEdge->dsCoord += dsMove;\n        cf2_hint_lock( topHintEdge );\n      }\n    }\n\n    return captured;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2blues.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2blues.h                                                             */\n/*                                                                         */\n/*    Adobe's code for handling Blue Zones (specification).                */\n/*                                                                         */\n/*  Copyright 2009-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*\n   * A `CF2_Blues' object stores the blue zones (horizontal alignment\n   * zones) of a font.  These are specified in the CFF private dictionary\n   * by `BlueValues', `OtherBlues', `FamilyBlues', and `FamilyOtherBlues'.\n   * Each zone is defined by a top and bottom edge in character space.\n   * Further, each zone is either a top zone or a bottom zone, as recorded\n   * by `bottomZone'.\n   *\n   * The maximum number of `BlueValues' and `FamilyBlues' is 7 each.\n   * However, these are combined to produce a total of 7 zones.\n   * Similarly, the maximum number of `OtherBlues' and `FamilyOtherBlues'\n   * is 5 and these are combined to produce an additional 5 zones.\n   *\n   * Blue zones are used to `capture' hints and force them to a common\n   * alignment point.  This alignment is recorded in device space in\n   * `dsFlatEdge'.  Except for this value, a `CF2_Blues' object could be\n   * constructed independently of scaling.  Construction may occur once\n   * the matrix is known.  Other features implemented in the Capture\n   * method are overshoot suppression, overshoot enforcement, and Blue\n   * Boost.\n   *\n   * Capture is determined by `BlueValues' and `OtherBlues', but the\n   * alignment point may be adjusted to the scaled flat edge of\n   * `FamilyBlues' or `FamilyOtherBlues'.  No alignment is done to the\n   * curved edge of a zone.\n   *\n   */\n\n\n#ifndef __CF2BLUES_H__\n#define __CF2BLUES_H__\n\n\n#include \"cf2glue.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*\n   * `CF2_Hint' is shared by `cf2hints.h' and\n   * `cf2blues.h', but `cf2blues.h' depends on\n   * `cf2hints.h', so define it here.  Note: The typedef is in\n   * `cf2glue.h'.\n   *\n   */\n  enum\n  {\n    CF2_GhostBottom = 0x1,  /* a single bottom edge           */\n    CF2_GhostTop    = 0x2,  /* a single top edge              */\n    CF2_PairBottom  = 0x4,  /* the bottom edge of a stem hint */\n    CF2_PairTop     = 0x8,  /* the top edge of a stem hint    */\n    CF2_Locked      = 0x10, /* this edge has been aligned     */\n                            /* by a blue zone                 */\n    CF2_Synthetic   = 0x20  /* this edge was synthesized      */\n  };\n\n\n  /*\n   * Default value for OS/2 typoAscender/Descender when their difference\n   * is not equal to `unitsPerEm'.  The default is based on -250 and 1100\n   * in `CF2_Blues', assuming 1000 units per em here.\n   *\n   */\n  enum\n  {\n    CF2_ICF_Top    = cf2_intToFixed(  880 ),\n    CF2_ICF_Bottom = cf2_intToFixed( -120 )\n  };\n\n\n  /*\n   * Constant used for hint adjustment and for synthetic em box hint\n   * placement.\n   */\n#define CF2_MIN_COUNTER  cf2_floatToFixed( 0.5 )\n\n\n  /* shared typedef is in cf2glue.h */\n  struct  CF2_HintRec_\n  {\n    CF2_UInt  flags;  /* attributes of the edge            */\n    size_t    index;  /* index in original stem hint array */\n                      /* (if not synthetic)                */\n    CF2_Fixed  csCoord;\n    CF2_Fixed  dsCoord;\n    CF2_Fixed  scale;\n  };\n\n\n  typedef struct  CF2_BlueRec_\n  {\n    CF2_Fixed  csBottomEdge;\n    CF2_Fixed  csTopEdge;\n    CF2_Fixed  csFlatEdge; /* may be from either local or Family zones */\n    CF2_Fixed  dsFlatEdge; /* top edge of bottom zone or bottom edge   */\n                           /* of top zone (rounded)                    */\n    FT_Bool  bottomZone;\n\n  } CF2_BlueRec;\n\n\n  /* max total blue zones is 12 */\n  enum\n  {\n    CF2_MAX_BLUES      = 7,\n    CF2_MAX_OTHERBLUES = 5\n  };\n\n\n  typedef struct  CF2_BluesRec_\n  {\n    CF2_Fixed  scale;\n    CF2_UInt   count;\n    FT_Bool    suppressOvershoot;\n    FT_Bool    doEmBoxHints;\n\n    CF2_Fixed  blueScale;\n    CF2_Fixed  blueShift;\n    CF2_Fixed  blueFuzz;\n\n    CF2_Fixed  boost;\n\n    CF2_HintRec  emBoxTopEdge;\n    CF2_HintRec  emBoxBottomEdge;\n\n    CF2_BlueRec  zone[CF2_MAX_BLUES + CF2_MAX_OTHERBLUES];\n\n  } CF2_BluesRec, *CF2_Blues;\n\n\n  FT_LOCAL( void )\n  cf2_blues_init( CF2_Blues  blues,\n                  CF2_Font   font );\n  FT_LOCAL( FT_Bool )\n  cf2_blues_capture( const CF2_Blues  blues,\n                     CF2_Hint         bottomHintEdge,\n                     CF2_Hint         topHintEdge );\n\n\nFT_END_HEADER\n\n\n#endif /* __CF2BLUES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2error.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2error.c                                                             */\n/*                                                                         */\n/*    Adobe's code for error handling (body).                              */\n/*                                                                         */\n/*  Copyright 2006-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"cf2ft.h\"\n#include \"cf2error.h\"\n\n\n  FT_LOCAL_DEF( void )\n  cf2_setError( FT_Error*  error,\n                FT_Error   value )\n  {\n    if ( error && *error == 0 )\n      *error = value;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2error.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2error.h                                                             */\n/*                                                                         */\n/*    Adobe's code for error handling (specification).                     */\n/*                                                                         */\n/*  Copyright 2006-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CF2ERROR_H__\n#define __CF2ERROR_H__\n\n\n#include \"../../include/freetype/ftmoderr.h\"\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  CF2_Err_\n#define FT_ERR_BASE    FT_Mod_Err_CF2\n\n\n#include \"../../include/freetype/fterrors.h\"\n#include \"cf2ft.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*\n   * A poor-man error facility.\n   *\n   * This code being written in vanilla C, doesn't have the luxury of a\n   * language-supported exception mechanism such as the one available in\n   * Java.  Instead, we are stuck with using error codes that must be\n   * carefully managed and preserved.  However, it is convenient for us to\n   * model our error mechanism on a Java-like exception mechanism.\n   * When we assign an error code we are thus `throwing' an error.\n   *\n   * The perservation of an error code is done by coding convention.\n   * Upon a function call if the error code is anything other than\n   * `FT_Err_Ok', which is guaranteed to be zero, we\n   * will return without altering that error.  This will allow the\n   * error to propogate and be handled at the appropriate location in\n   * the code.\n   *\n   * This allows a style of code where the error code is initialized\n   * up front and a block of calls are made with the error code only\n   * being checked after the block.  If a new error occurs, the original\n   * error will be preserved and a functional no-op should result in any\n   * subsequent function that has an initial error code not equal to\n   * `FT_Err_Ok'.\n   *\n   * Errors are encoded by calling the `FT_THROW' macro.  For example,\n   *\n   * {\n   *   FT_Error  e;\n   *\n   *\n   *   ...\n   *   e = FT_THROW( Out_Of_Memory );\n   * }\n   *\n   */\n\n\n  /* Set error code to a particular value. */\n  FT_LOCAL( void )\n  cf2_setError( FT_Error*  error,\n                FT_Error   value );\n\n\n  /*\n   * A macro that conditionally sets an error code.\n   *\n   * This macro will first check whether `error' is set;\n   * if not, it will set it to `e'.\n   *\n  */\n#define CF2_SET_ERROR( error, e )              \\\n          cf2_setError( error, FT_THROW( e ) )\n\n\nFT_END_HEADER\n\n\n#endif /* __CF2ERROR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2fixed.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2fixed.h                                                             */\n/*                                                                         */\n/*    Adobe's code for Fixed Point Mathematics (specification only).       */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CF2FIXED_H__\n#define __CF2FIXED_H__\n\n\nFT_BEGIN_HEADER\n\n\n  /* rasterizer integer and fixed point arithmetic must be 32-bit */\n\n#define   CF2_Fixed  CF2_F16Dot16\n  typedef FT_Int32   CF2_Frac;   /* 2.30 fixed point */\n\n\n#define CF2_FIXED_MAX      ( (CF2_Fixed)0x7FFFFFFFL )\n#define CF2_FIXED_MIN      ( (CF2_Fixed)0x80000000L )\n#define CF2_FIXED_ONE      0x10000L\n#define CF2_FIXED_EPSILON  0x0001\n\n  /* in C 89, left and right shift of negative numbers is  */\n  /* implementation specific behaviour in the general case */\n\n#define cf2_intToFixed( i )                                    \\\n          ( (CF2_Fixed)( (FT_UInt32)(i) << 16 ) )\n#define cf2_fixedToInt( x )                                    \\\n          ( (FT_Short)( ( (FT_UInt32)(x) + 0x8000U ) >> 16 ) )\n#define cf2_fixedRound( x )                                    \\\n          ( (CF2_Fixed)( ( (x) + 0x8000 ) & 0xFFFF0000L ) )\n#define cf2_floatToFixed( f )                                  \\\n          ( (CF2_Fixed)( (f) * 65536.0 + 0.5 ) )\n#define cf2_fixedAbs( x )                                      \\\n          ( (x) < 0 ? -(x) : (x) )\n#define cf2_fixedFloor( x )                                    \\\n          ( (CF2_Fixed)( (x) & 0xFFFF0000L ) )\n#define cf2_fixedFraction( x )                                 \\\n          ( (x) - cf2_fixedFloor( x ) )\n#define cf2_fracToFixed( x )                                   \\\n          ( (x) < 0 ? -( ( -(x) + 0x2000 ) >> 14 )             \\\n                    :  ( (  (x) + 0x2000 ) >> 14 ) )\n\n\n  /* signed numeric types */\n  typedef enum  CF2_NumberType_\n  {\n    CF2_NumberFixed,    /* 16.16 */\n    CF2_NumberFrac,     /*  2.30 */\n    CF2_NumberInt       /* 32.0  */\n\n  } CF2_NumberType;\n\n\nFT_END_HEADER\n\n\n#endif /*  __CF2FIXED_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2font.c                                                              */\n/*                                                                         */\n/*    Adobe's code for font instances (body).                              */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"cf2ft.h\"\n\n#include \"cf2glue.h\"\n#include \"cf2font.h\"\n#include \"cf2error.h\"\n#include \"cf2intrp.h\"\n\n\n  /* Compute a stem darkening amount in character space. */\n  static void\n  cf2_computeDarkening( CF2_Fixed   emRatio,\n                        CF2_Fixed   ppem,\n                        CF2_Fixed   stemWidth,\n                        CF2_Fixed*  darkenAmount,\n                        CF2_Fixed   boldenAmount,\n                        FT_Bool     stemDarkened )\n  {\n    /* Internal calculations are done in units per thousand for */\n    /* convenience.                                             */\n    CF2_Fixed  stemWidthPer1000, scaledStem;\n\n\n    *darkenAmount = 0;\n\n    if ( boldenAmount == 0 && !stemDarkened )\n      return;\n\n    /* protect against range problems and divide by zero */\n    if ( emRatio < cf2_floatToFixed( .01 ) )\n      return;\n\n    if ( stemDarkened )\n    {\n      /* convert from true character space to 1000 unit character space; */\n      /* add synthetic emboldening effect                                */\n\n      /* we have to assure that the computation of `scaledStem' */\n      /* and `stemWidthPer1000' don't overflow                  */\n\n      stemWidthPer1000 = FT_MulFix( stemWidth + boldenAmount, emRatio );\n\n      if ( emRatio > CF2_FIXED_ONE                          &&\n           stemWidthPer1000 <= ( stemWidth + boldenAmount ) )\n      {\n        stemWidthPer1000 = 0;                      /* to pacify compiler */\n        scaledStem       = cf2_intToFixed( 2333 );\n      }\n      else\n      {\n        scaledStem = FT_MulFix( stemWidthPer1000, ppem );\n\n        if ( ppem > CF2_FIXED_ONE           &&\n             scaledStem <= stemWidthPer1000 )\n          scaledStem = cf2_intToFixed( 2333 );\n      }\n\n      /*\n       * Total darkening amount is computed in 1000 unit character space\n       * using the modified 5 part curve as Avalon rasterizer.\n       * The darkening amount is smaller for thicker stems.\n       * It becomes zero when the stem is thicker than 2.333 pixels.\n       *\n       * In Avalon rasterizer,\n       *\n       *   darkenAmount = 0.5 pixels   if scaledStem <= 0.5 pixels,\n       *   darkenAmount = 0.333 pixels if 1 <= scaledStem <= 1.667 pixels,\n       *   darkenAmount = 0 pixel      if scaledStem >= 2.333 pixels,\n       *\n       * and piecewise linear in-between.\n       *\n       */\n      if ( scaledStem < cf2_intToFixed( 500 ) )\n        *darkenAmount = FT_DivFix( cf2_intToFixed( 400 ), ppem );\n\n      else if ( scaledStem < cf2_intToFixed( 1000 ) )\n        *darkenAmount = FT_DivFix( cf2_intToFixed( 525 ), ppem ) -\n                          FT_MulFix( stemWidthPer1000,\n                                     cf2_floatToFixed( .25 ) );\n\n      else if ( scaledStem < cf2_intToFixed( 1667 ) )\n        *darkenAmount = FT_DivFix( cf2_intToFixed( 275 ), ppem );\n\n      else if ( scaledStem < cf2_intToFixed( 2333 ) )\n        *darkenAmount = FT_DivFix( cf2_intToFixed( 963 ), ppem ) -\n                          FT_MulFix( stemWidthPer1000,\n                                     cf2_floatToFixed( .413 ) );\n\n      /* use half the amount on each side and convert back to true */\n      /* character space                                           */\n      *darkenAmount = FT_DivFix( *darkenAmount, 2 * emRatio );\n    }\n\n    /* add synthetic emboldening effect in character space */\n    *darkenAmount += boldenAmount / 2;\n  }\n\n\n  /* set up values for the current FontDict and matrix */\n\n  /* caller's transform is adjusted for subpixel positioning */\n  static void\n  cf2_font_setup( CF2_Font           font,\n                  const CF2_Matrix*  transform )\n  {\n    /* pointer to parsed font object */\n    CFF_Decoder*  decoder = font->decoder;\n\n    FT_Bool  needExtraSetup;\n\n    /* character space units */\n    CF2_Fixed  boldenX = font->syntheticEmboldeningAmountX;\n    CF2_Fixed  boldenY = font->syntheticEmboldeningAmountY;\n\n    CF2_Fixed  ppem;\n\n\n    /* clear previous error */\n    font->error = FT_Err_Ok;\n\n    /* if a CID fontDict has changed, we need to recompute some cached */\n    /* data                                                            */\n    needExtraSetup =\n      (FT_Bool)( font->lastSubfont != cf2_getSubfont( decoder ) );\n\n    /* if ppem has changed, we need to recompute some cached data         */\n    /* note: because of CID font matrix concatenation, ppem and transform */\n    /*       do not necessarily track.                                    */\n    ppem = cf2_getPpemY( decoder );\n    if ( font->ppem != ppem )\n    {\n      font->ppem     = ppem;\n      needExtraSetup = TRUE;\n    }\n\n    /* copy hinted flag on each call */\n    font->hinted = (FT_Bool)( font->renderingFlags & CF2_FlagsHinted );\n\n    /* determine if transform has changed;       */\n    /* include Fontmatrix but ignore translation */\n    if ( ft_memcmp( transform,\n                    &font->currentTransform,\n                    4 * sizeof ( CF2_Fixed ) ) != 0 )\n    {\n      /* save `key' information for `cache of one' matrix data; */\n      /* save client transform, without the translation         */\n      font->currentTransform    = *transform;\n      font->currentTransform.tx =\n      font->currentTransform.ty = cf2_intToFixed( 0 );\n\n      /* TODO: FreeType transform is simple scalar; for now, use identity */\n      /*       for outer                                                  */\n      font->innerTransform   = *transform;\n      font->outerTransform.a =\n      font->outerTransform.d = cf2_intToFixed( 1 );\n      font->outerTransform.b =\n      font->outerTransform.c = cf2_intToFixed( 0 );\n\n      needExtraSetup = TRUE;\n    }\n\n    /*\n     * font->darkened is set to true if there is a stem darkening request or\n     * the font is synthetic emboldened.\n     * font->darkened controls whether to adjust blue zones, winding order,\n     * and hinting.\n     *\n     */\n    if ( font->stemDarkened != ( font->renderingFlags & CF2_FlagsDarkened ) )\n    {\n      font->stemDarkened =\n        (FT_Bool)( font->renderingFlags & CF2_FlagsDarkened );\n\n      /* blue zones depend on darkened flag */\n      needExtraSetup = TRUE;\n    }\n\n    /* recompute variables that are dependent on transform or FontDict or */\n    /* darken flag                                                        */\n    if ( needExtraSetup )\n    {\n      /* StdVW is found in the private dictionary;                       */\n      /* recompute darkening amounts whenever private dictionary or      */\n      /* transform change                                                */\n      /* Note: a rendering flag turns darkening on or off, so we want to */\n      /*       store the `on' amounts;                                   */\n      /*       darkening amount is computed in character space           */\n      /* TODO: testing size-dependent darkening here;                    */\n      /*       what to do for rotations?                                 */\n\n      CF2_Fixed  emRatio;\n      CF2_Fixed  stdHW;\n      CF2_Int    unitsPerEm = font->unitsPerEm;\n\n\n      if ( unitsPerEm == 0 )\n        unitsPerEm = 1000;\n\n      ppem = FT_MAX( cf2_intToFixed( 4 ),\n                     font->ppem ); /* use minimum ppem of 4 */\n\n#if 0\n      /* since vstem is measured in the x-direction, we use the `a' member */\n      /* of the fontMatrix                                                 */\n      emRatio = cf2_fixedFracMul( cf2_intToFixed( 1000 ), fontMatrix->a );\n#endif\n\n      /* Freetype does not preserve the fontMatrix when parsing; use */\n      /* unitsPerEm instead.                                         */\n      /* TODO: check precision of this                               */\n      emRatio     = cf2_intToFixed( 1000 ) / unitsPerEm;\n      font->stdVW = cf2_getStdVW( decoder );\n\n      if ( font->stdVW <= 0 )\n        font->stdVW = FT_DivFix( cf2_intToFixed( 75 ), emRatio );\n\n      if ( boldenX > 0 )\n      {\n        /* Ensure that boldenX is at least 1 pixel for synthetic bold font */\n        /* (similar to what Avalon does)                                   */\n        boldenX = FT_MAX( boldenX,\n                          FT_DivFix( cf2_intToFixed( unitsPerEm ), ppem ) );\n\n        /* Synthetic emboldening adds at least 1 pixel to darkenX, while */\n        /* stem darkening adds at most half pixel.  Since the purpose of */\n        /* stem darkening (readability at small sizes) is met with       */\n        /* synthetic emboldening, no need to add stem darkening for a    */\n        /* synthetic bold font.                                          */\n        cf2_computeDarkening( emRatio,\n                              ppem,\n                              font->stdVW,\n                              &font->darkenX,\n                              boldenX,\n                              FALSE );\n      }\n      else\n        cf2_computeDarkening( emRatio,\n                              ppem,\n                              font->stdVW,\n                              &font->darkenX,\n                              0,\n                              font->stemDarkened );\n\n#if 0\n      /* since hstem is measured in the y-direction, we use the `d' member */\n      /* of the fontMatrix                                                 */\n      /* TODO: use the same units per em as above; check this              */\n      emRatio = cf2_fixedFracMul( cf2_intToFixed( 1000 ), fontMatrix->d );\n#endif\n\n      /* set the default stem width, because it must be the same for all */\n      /* family members;                                                 */\n      /* choose a constant for StdHW that depends on font contrast       */\n      stdHW = cf2_getStdHW( decoder );\n\n      if ( stdHW > 0 && font->stdVW > 2 * stdHW )\n        font->stdHW = FT_DivFix( cf2_intToFixed( 75 ), emRatio );\n      else\n      {\n        /* low contrast font gets less hstem darkening */\n        font->stdHW = FT_DivFix( cf2_intToFixed( 110 ), emRatio );\n      }\n\n      cf2_computeDarkening( emRatio,\n                            ppem,\n                            font->stdHW,\n                            &font->darkenY,\n                            boldenY,\n                            font->stemDarkened );\n\n      if ( font->darkenX != 0 || font->darkenY != 0 )\n        font->darkened = TRUE;\n      else\n        font->darkened = FALSE;\n\n      font->reverseWinding = FALSE; /* initial expectation is CCW */\n\n      /* compute blue zones for this instance */\n      cf2_blues_init( &font->blues, font );\n    }\n  }\n\n\n  /* equivalent to AdobeGetOutline */\n  FT_LOCAL_DEF( FT_Error )\n  cf2_getGlyphOutline( CF2_Font           font,\n                       CF2_Buffer         charstring,\n                       const CF2_Matrix*  transform,\n                       CF2_F16Dot16*      glyphWidth )\n  {\n    FT_Error  lastError = FT_Err_Ok;\n\n    FT_Vector  translation;\n\n#if 0\n    FT_Vector  advancePoint;\n#endif\n\n    CF2_Fixed  advWidth = 0;\n    FT_Bool    needWinding;\n\n\n    /* Note: use both integer and fraction for outlines.  This allows bbox */\n    /*       to come out directly.                                         */\n\n    translation.x = transform->tx;\n    translation.y = transform->ty;\n\n    /* set up values based on transform */\n    cf2_font_setup( font, transform );\n    if ( font->error )\n      goto exit;                      /* setup encountered an error */\n\n    /* reset darken direction */\n    font->reverseWinding = FALSE;\n\n    /* winding order only affects darkening */\n    needWinding = font->darkened;\n\n    while ( 1 )\n    {\n      /* reset output buffer */\n      cf2_outline_reset( &font->outline );\n\n      /* build the outline, passing the full translation */\n      cf2_interpT2CharString( font,\n                              charstring,\n                              (CF2_OutlineCallbacks)&font->outline,\n                              &translation,\n                              FALSE,\n                              0,\n                              0,\n                              &advWidth );\n\n      if ( font->error )\n        goto exit;\n\n      if ( !needWinding )\n        break;\n\n      /* check winding order */\n      if ( font->outline.root.windingMomentum >= 0 ) /* CFF is CCW */\n        break;\n\n      /* invert darkening and render again                            */\n      /* TODO: this should be a parameter to getOutline-computeOffset */\n      font->reverseWinding = TRUE;\n\n      needWinding = FALSE;    /* exit after next iteration */\n    }\n\n    /* finish storing client outline */\n    cf2_outline_close( &font->outline );\n\n  exit:\n    /* FreeType just wants the advance width; there is no translation */\n    *glyphWidth = advWidth;\n\n    /* free resources and collect errors from objects we've used */\n    cf2_setError( &font->error, lastError );\n\n    return font->error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2font.h                                                              */\n/*                                                                         */\n/*    Adobe's code for font instances (specification).                     */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CF2FONT_H__\n#define __CF2FONT_H__\n\n\n#include \"cf2ft.h\"\n#include \"cf2blues.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#define CF2_OPERAND_STACK_SIZE  48\n#define CF2_MAX_SUBR            10 /* maximum subroutine nesting */\n\n\n  /* typedef is in `cf2glue.h' */\n  struct  CF2_FontRec_\n  {\n    FT_Memory  memory;\n    FT_Error   error;     /* shared error for this instance */\n\n    CF2_RenderingFlags  renderingFlags;\n\n    /* variables that depend on Transform:  */\n    /* the following have zero translation; */\n    /* inner * outer = font * original      */\n\n    CF2_Matrix  currentTransform;  /* original client matrix           */\n    CF2_Matrix  innerTransform;    /* for hinting; erect, scaled       */\n    CF2_Matrix  outerTransform;    /* post hinting; includes rotations */\n    CF2_Fixed   ppem;              /* transform-dependent              */\n\n    CF2_Int  unitsPerEm;\n\n    CF2_Fixed  syntheticEmboldeningAmountX;   /* character space units */\n    CF2_Fixed  syntheticEmboldeningAmountY;   /* character space units */\n\n    /* FreeType related members */\n    CF2_OutlineRec  outline;       /* freetype glyph outline functions */\n    CFF_Decoder*    decoder;\n    CFF_SubFont     lastSubfont;              /* FreeType parsed data; */\n                                              /* top font or subfont   */\n\n    /* these flags can vary from one call to the next */\n    FT_Bool  hinted;\n    FT_Bool  darkened;       /* true if stemDarkened or synthetic bold */\n                             /* i.e. darkenX != 0 || darkenY != 0      */\n    FT_Bool  stemDarkened;\n\n    /* variables that depend on both FontDict and Transform */\n    CF2_Fixed  stdVW;     /* in character space; depends on dict entry */\n    CF2_Fixed  stdHW;     /* in character space; depends on dict entry */\n    CF2_Fixed  darkenX;                    /* character space units    */\n    CF2_Fixed  darkenY;                    /* depends on transform     */\n                                           /* and private dict (StdVW) */\n    FT_Bool  reverseWinding;               /* darken assuming          */\n                                           /* counterclockwise winding */\n\n    CF2_BluesRec  blues;                         /* computed zone data */\n  };\n\n\n  FT_LOCAL( FT_Error )\n  cf2_getGlyphOutline( CF2_Font           font,\n                       CF2_Buffer         charstring,\n                       const CF2_Matrix*  transform,\n                       CF2_F16Dot16*      glyphWidth );\n\n\nFT_END_HEADER\n\n\n#endif /* __CF2FONT_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2ft.c                                                                */\n/*                                                                         */\n/*    FreeType Glue Component to Adobe's Interpreter (body).               */\n/*                                                                         */\n/*  Copyright 2013 Adobe Systems Incorporated.                             */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"cf2ft.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n\n#include \"cf2font.h\"\n#include \"cf2error.h\"\n\n\n#define CF2_MAX_SIZE  cf2_intToFixed( 2000 )    /* max ppem */\n\n\n  /*\n   * This check should avoid most internal overflow cases.  Clients should\n   * generally respond to `Glyph_Too_Big' by getting a glyph outline\n   * at EM size, scaling it and filling it as a graphics operation.\n   *\n   */\n  static FT_Error\n  cf2_checkTransform( const CF2_Matrix*  transform,\n                      CF2_Int            unitsPerEm )\n  {\n    CF2_Fixed  maxScale;\n\n\n    FT_ASSERT( unitsPerEm > 0 );\n\n    FT_ASSERT( transform->a > 0 && transform->d > 0 );\n    FT_ASSERT( transform->b == 0 && transform->c == 0 );\n    FT_ASSERT( transform->tx == 0 && transform->ty == 0 );\n\n    if ( unitsPerEm > 0x7FFF )\n      return FT_THROW( Glyph_Too_Big );\n\n    maxScale = FT_DivFix( CF2_MAX_SIZE, cf2_intToFixed( unitsPerEm ) );\n\n    if ( transform->a > maxScale || transform->d > maxScale )\n      return FT_THROW( Glyph_Too_Big );\n\n    return FT_Err_Ok;\n  }\n\n\n  static void\n  cf2_setGlyphWidth( CF2_Outline  outline,\n                     CF2_Fixed    width )\n  {\n    CFF_Decoder*  decoder = outline->decoder;\n\n\n    FT_ASSERT( decoder );\n\n    decoder->glyph_width = cf2_fixedToInt( width );\n  }\n\n\n  /* Clean up font instance. */\n  static void\n  cf2_free_instance( void*  ptr )\n  {\n    CF2_Font  font = (CF2_Font)ptr;\n\n\n    if ( font )\n    {\n      FT_Memory  memory = font->memory;\n\n\n      (void)memory;\n    }\n  }\n\n\n  /********************************************/\n  /*                                          */\n  /* functions for handling client outline;   */\n  /* FreeType uses coordinates in 26.6 format */\n  /*                                          */\n  /********************************************/\n\n  static void\n  cf2_builder_moveTo( CF2_OutlineCallbacks      callbacks,\n                      const CF2_CallbackParams  params )\n  {\n    /* downcast the object pointer */\n    CF2_Outline   outline = (CF2_Outline)callbacks;\n    CFF_Builder*  builder;\n\n    (void)params;        /* only used in debug mode */\n\n\n    FT_ASSERT( outline && outline->decoder );\n    FT_ASSERT( params->op == CF2_PathOpMoveTo );\n\n    builder = &outline->decoder->builder;\n\n    /* note: two successive moves simply close the contour twice */\n    cff_builder_close_contour( builder );\n    builder->path_begun = 0;\n  }\n\n\n  static void\n  cf2_builder_lineTo( CF2_OutlineCallbacks      callbacks,\n                      const CF2_CallbackParams  params )\n  {\n    /* downcast the object pointer */\n    CF2_Outline   outline = (CF2_Outline)callbacks;\n    CFF_Builder*  builder;\n\tFT_Error\t  error;\n\n\n    FT_ASSERT( outline && outline->decoder );\n    FT_ASSERT( params->op == CF2_PathOpLineTo );\n\n    builder = &outline->decoder->builder;\n\n    if ( !builder->path_begun )\n    {\n      /* record the move before the line; also check points and set */\n      /* `path_begun'                                               */\n\t\terror = cff_builder_start_point(builder,\n                               params->pt0.x,\n                               params->pt0.y );\n\t\tif (callbacks && callbacks->error) *callbacks->error = error;\n\t\tif (error) return;\n    }\n\n    /* `cff_builder_add_point1' includes a check_points call for one point */\n\terror = cff_builder_add_point1(builder,\n                            params->pt1.x,\n                            params->pt1.y );\n\tif (callbacks && callbacks->error) *callbacks->error = error;\n  }\n\n\n  static void\n  cf2_builder_cubeTo( CF2_OutlineCallbacks      callbacks,\n                      const CF2_CallbackParams  params )\n  {\n    /* downcast the object pointer */\n    CF2_Outline   outline = (CF2_Outline)callbacks;\n    CFF_Builder*  builder;\n\tFT_Error\t  error;\n\n\n    FT_ASSERT( outline && outline->decoder );\n    FT_ASSERT( params->op == CF2_PathOpCubeTo );\n\n    builder = &outline->decoder->builder;\n\n    if ( !builder->path_begun )\n    {\n      /* record the move before the line; also check points and set */\n      /* `path_begun'                                               */\n      error = cff_builder_start_point( builder,\n                               params->pt0.x,\n                               params->pt0.y );\n\t  if (callbacks && callbacks->error) *callbacks->error = error;\n\t  if (error) return;\n    }\n\n    /* prepare room for 3 points: 2 off-curve, 1 on-curve */\n    error = cff_check_points( builder, 3 );\n\tif (callbacks && callbacks->error) *callbacks->error = error;\n\tif (error) return;\n\n    cff_builder_add_point( builder,\n                           params->pt1.x,\n                           params->pt1.y, 0 );\n    cff_builder_add_point( builder,\n                           params->pt2.x,\n                           params->pt2.y, 0 );\n    cff_builder_add_point( builder,\n                           params->pt3.x,\n                           params->pt3.y, 1 );\n  }\n\n\n  static void\n  cf2_outline_init( CF2_Outline  outline,\n                    FT_Memory    memory,\n                    FT_Error*    error )\n  {\n    FT_MEM_ZERO( outline, sizeof ( CF2_OutlineRec ) );\n\n    outline->root.memory = memory;\n    outline->root.error  = error;\n\n    outline->root.moveTo = cf2_builder_moveTo;\n    outline->root.lineTo = cf2_builder_lineTo;\n    outline->root.cubeTo = cf2_builder_cubeTo;\n  }\n\n\n  /* get scaling and hint flag from GlyphSlot */\n  static void\n  cf2_getScaleAndHintFlag( CFF_Decoder*  decoder,\n                           CF2_Fixed*    x_scale,\n                           CF2_Fixed*    y_scale,\n                           FT_Bool*      hinted,\n                           FT_Bool*      scaled )\n  {\n    FT_ASSERT( decoder && decoder->builder.glyph );\n\n    /* note: FreeType scale includes a factor of 64 */\n    *hinted = decoder->builder.glyph->hint;\n    *scaled = decoder->builder.glyph->scaled;\n\n    if ( *hinted )\n    {\n      *x_scale = FT_DivFix( decoder->builder.glyph->x_scale,\n                            cf2_intToFixed( 64 ) );\n      *y_scale = FT_DivFix( decoder->builder.glyph->y_scale,\n                            cf2_intToFixed( 64 ) );\n    }\n    else\n    {\n      /* for unhinted outlines, `cff_slot_load' does the scaling, */\n      /* thus render at `unity' scale                             */\n\n      *x_scale = 0x0400;   /* 1/64 as 16.16 */\n      *y_scale = 0x0400;\n    }\n  }\n\n\n  /* get units per em from `FT_Face' */\n  /* TODO: should handle font matrix concatenation? */\n  static FT_UShort\n  cf2_getUnitsPerEm( CFF_Decoder*  decoder )\n  {\n    FT_ASSERT( decoder && decoder->builder.face );\n    FT_ASSERT( decoder->builder.face->root.units_per_EM );\n\n    return decoder->builder.face->root.units_per_EM;\n  }\n\n\n  /* Main entry point: Render one glyph. */\n  FT_LOCAL_DEF( FT_Error )\n  cf2_decoder_parse_charstrings( CFF_Decoder*  decoder,\n                                 FT_Byte*      charstring_base,\n                                 FT_ULong      charstring_len )\n  {\n    FT_Memory  memory;\n    FT_Error   error = FT_Err_Ok;\n    CF2_Font   font;\n\n\n    FT_ASSERT( decoder && decoder->cff );\n\n    memory = decoder->builder.memory;\n\n    /* CF2 data is saved here across glyphs */\n    font = (CF2_Font)decoder->cff->cf2_instance.data;\n\n    /* on first glyph, allocate instance structure */\n    if ( decoder->cff->cf2_instance.data == NULL )\n    {\n      decoder->cff->cf2_instance.finalizer =\n        (FT_Generic_Finalizer)cf2_free_instance;\n\n      if ( FT_ALLOC( decoder->cff->cf2_instance.data,\n                     sizeof ( CF2_FontRec ) ) )\n        return FT_THROW( Out_Of_Memory );\n\n      font = (CF2_Font)decoder->cff->cf2_instance.data;\n\n      font->memory = memory;\n\n      /* initialize a client outline, to be shared by each glyph rendered */\n      cf2_outline_init( &font->outline, font->memory, &font->error );\n    }\n\n    /* save decoder; it is a stack variable and will be different on each */\n    /* call                                                               */\n    font->decoder         = decoder;\n    font->outline.decoder = decoder;\n\n    {\n      /* build parameters for Adobe engine */\n\n      CFF_Builder*  builder = &decoder->builder;\n      CFF_Driver    driver  = (CFF_Driver)FT_FACE_DRIVER( builder->face );\n\n      /* local error */\n      FT_Error       error2 = FT_Err_Ok;\n      CF2_BufferRec  buf;\n      CF2_Matrix     transform;\n      CF2_F16Dot16   glyphWidth;\n\n      FT_Bool  hinted;\n      FT_Bool  scaled;\n\n\n      /* FreeType has already looked up the GID; convert to         */\n      /* `RegionBuffer', assuming that the input has been validated */\n      FT_ASSERT( charstring_base + charstring_len >= charstring_base );\n\n      FT_ZERO( &buf );\n      buf.start =\n      buf.ptr   = charstring_base;\n      buf.end   = charstring_base + charstring_len;\n\n      FT_ZERO( &transform );\n\n      cf2_getScaleAndHintFlag( decoder,\n                               &transform.a,\n                               &transform.d,\n                               &hinted,\n                               &scaled );\n\n      font->renderingFlags = 0;\n      if ( hinted )\n        font->renderingFlags |= CF2_FlagsHinted;\n      if ( scaled && !driver->no_stem_darkening )\n        font->renderingFlags |= CF2_FlagsDarkened;\n\n      /* now get an outline for this glyph;      */\n      /* also get units per em to validate scale */\n      font->unitsPerEm = (CF2_Int)cf2_getUnitsPerEm( decoder );\n\n      error2 = cf2_checkTransform( &transform, font->unitsPerEm );\n      if ( error2 )\n        return error2;\n\n      error2 = cf2_getGlyphOutline( font, &buf, &transform, &glyphWidth );\n      if ( error2 )\n        return FT_ERR( Invalid_File_Format );\n\n      cf2_setGlyphWidth( &font->outline, glyphWidth );\n\n      return FT_Err_Ok;\n    }\n  }\n\n\n  /* get pointer to current FreeType subfont (based on current glyphID) */\n  FT_LOCAL_DEF( CFF_SubFont )\n  cf2_getSubfont( CFF_Decoder*  decoder )\n  {\n    FT_ASSERT( decoder && decoder->current_subfont );\n\n    return decoder->current_subfont;\n  }\n\n\n  /* get `y_ppem' from `CFF_Size' */\n  FT_LOCAL_DEF( CF2_Fixed )\n  cf2_getPpemY( CFF_Decoder*  decoder )\n  {\n    FT_ASSERT( decoder                          &&\n               decoder->builder.face            &&\n               decoder->builder.face->root.size );\n    FT_ASSERT( decoder->builder.face->root.size->metrics.y_ppem );\n\n    return cf2_intToFixed(\n             decoder->builder.face->root.size->metrics.y_ppem );\n  }\n\n\n  /* get standard stem widths for the current subfont; */\n  /* FreeType stores these as integer font units       */\n  /* (note: variable names seem swapped)               */\n  FT_LOCAL_DEF( CF2_Fixed )\n  cf2_getStdVW( CFF_Decoder*  decoder )\n  {\n    FT_ASSERT( decoder && decoder->current_subfont );\n\n    return cf2_intToFixed(\n             decoder->current_subfont->private_dict.standard_height );\n  }\n\n\n  FT_LOCAL_DEF( CF2_Fixed )\n  cf2_getStdHW( CFF_Decoder*  decoder )\n  {\n    FT_ASSERT( decoder && decoder->current_subfont );\n\n    return cf2_intToFixed(\n             decoder->current_subfont->private_dict.standard_width );\n  }\n\n\n  /* note: FreeType stores 1000 times the actual value for `BlueScale' */\n  FT_LOCAL_DEF( void )\n  cf2_getBlueMetrics( CFF_Decoder*  decoder,\n                      CF2_Fixed*    blueScale,\n                      CF2_Fixed*    blueShift,\n                      CF2_Fixed*    blueFuzz )\n  {\n    FT_ASSERT( decoder && decoder->current_subfont );\n\n    *blueScale = FT_DivFix(\n                   decoder->current_subfont->private_dict.blue_scale,\n                   cf2_intToFixed( 1000 ) );\n    *blueShift = cf2_intToFixed(\n                   decoder->current_subfont->private_dict.blue_shift );\n    *blueFuzz  = cf2_intToFixed(\n                   decoder->current_subfont->private_dict.blue_fuzz );\n  }\n\n\n  /* get blue values counts and arrays; the FreeType parser has validated */\n  /* the counts and verified that each is an even number                  */\n  FT_LOCAL_DEF( void )\n  cf2_getBlueValues( CFF_Decoder*  decoder,\n                     size_t*       count,\n                     FT_Pos*      *data )\n  {\n    FT_ASSERT( decoder && decoder->current_subfont );\n\n    *count = decoder->current_subfont->private_dict.num_blue_values;\n    *data  = (FT_Pos*)\n               &decoder->current_subfont->private_dict.blue_values;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_getOtherBlues( CFF_Decoder*  decoder,\n                     size_t*       count,\n                     FT_Pos*      *data )\n  {\n    FT_ASSERT( decoder && decoder->current_subfont );\n\n    *count = decoder->current_subfont->private_dict.num_other_blues;\n    *data  = (FT_Pos*)\n               &decoder->current_subfont->private_dict.other_blues;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_getFamilyBlues( CFF_Decoder*  decoder,\n                      size_t*       count,\n                      FT_Pos*      *data )\n  {\n    FT_ASSERT( decoder && decoder->current_subfont );\n\n    *count = decoder->current_subfont->private_dict.num_family_blues;\n    *data  = (FT_Pos*)\n               &decoder->current_subfont->private_dict.family_blues;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_getFamilyOtherBlues( CFF_Decoder*  decoder,\n                           size_t*       count,\n                           FT_Pos*      *data )\n  {\n    FT_ASSERT( decoder && decoder->current_subfont );\n\n    *count = decoder->current_subfont->private_dict.num_family_other_blues;\n    *data  = (FT_Pos*)\n               &decoder->current_subfont->private_dict.family_other_blues;\n  }\n\n\n  FT_LOCAL_DEF( CF2_Int )\n  cf2_getLanguageGroup( CFF_Decoder*  decoder )\n  {\n    FT_ASSERT( decoder && decoder->current_subfont );\n\n    return decoder->current_subfont->private_dict.language_group;\n  }\n\n\n  /* convert unbiased subroutine index to `CF2_Buffer' and */\n  /* return 0 on success                                   */\n  FT_LOCAL_DEF( CF2_Int )\n  cf2_initGlobalRegionBuffer( CFF_Decoder*  decoder,\n                              CF2_UInt      idx,\n                              CF2_Buffer    buf )\n  {\n    FT_ASSERT( decoder && decoder->globals );\n\n    FT_ZERO( buf );\n\n    idx += decoder->globals_bias;\n    if ( idx >= decoder->num_globals )\n      return TRUE;     /* error */\n\n    buf->start =\n    buf->ptr   = decoder->globals[idx];\n    buf->end   = decoder->globals[idx + 1];\n\n    return FALSE;      /* success */\n  }\n\n\n  /* convert AdobeStandardEncoding code to CF2_Buffer; */\n  /* used for seac component                           */\n  FT_LOCAL_DEF( FT_Error )\n  cf2_getSeacComponent( CFF_Decoder*  decoder,\n                        CF2_UInt      code,\n                        CF2_Buffer    buf )\n  {\n    CF2_Int   gid;\n    FT_Byte*  charstring;\n    FT_ULong  len;\n    FT_Error  error;\n\n\n    FT_ASSERT( decoder );\n\n    FT_ZERO( buf );\n\n    gid = cff_lookup_glyph_by_stdcharcode( decoder->cff, code );\n    if ( gid < 0 )\n      return FT_THROW( Invalid_Glyph_Format );\n\n    error = cff_get_glyph_data( decoder->builder.face,\n                                gid,\n                                &charstring,\n                                &len );\n    /* TODO: for now, just pass the FreeType error through */\n    if ( error )\n      return error;\n\n    /* assume input has been validated */\n    FT_ASSERT( charstring + len >= charstring );\n\n    buf->start = charstring;\n    buf->end   = charstring + len;\n    buf->ptr   = buf->start;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_freeSeacComponent( CFF_Decoder*  decoder,\n                         CF2_Buffer    buf )\n  {\n    FT_ASSERT( decoder );\n\n    cff_free_glyph_data( decoder->builder.face,\n                         (FT_Byte**)&buf->start,\n                         (FT_ULong)( buf->end - buf->start ) );\n  }\n\n\n  FT_LOCAL_DEF( CF2_Int )\n  cf2_initLocalRegionBuffer( CFF_Decoder*  decoder,\n                             CF2_UInt      idx,\n                             CF2_Buffer    buf )\n  {\n    FT_ASSERT( decoder && decoder->locals );\n\n    FT_ZERO( buf );\n\n    idx += decoder->locals_bias;\n    if ( idx >= decoder->num_locals )\n      return TRUE;     /* error */\n\n    buf->start =\n    buf->ptr   = decoder->locals[idx];\n    buf->end   = decoder->locals[idx + 1];\n\n    return FALSE;      /* success */\n  }\n\n\n  FT_LOCAL_DEF( CF2_Fixed )\n  cf2_getDefaultWidthX( CFF_Decoder*  decoder )\n  {\n    FT_ASSERT( decoder && decoder->current_subfont );\n\n    return cf2_intToFixed(\n             decoder->current_subfont->private_dict.default_width );\n  }\n\n\n  FT_LOCAL_DEF( CF2_Fixed )\n  cf2_getNominalWidthX( CFF_Decoder*  decoder )\n  {\n    FT_ASSERT( decoder && decoder->current_subfont );\n\n    return cf2_intToFixed(\n             decoder->current_subfont->private_dict.nominal_width );\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_outline_reset( CF2_Outline  outline )\n  {\n    CFF_Decoder*  decoder = outline->decoder;\n\n\n    FT_ASSERT( decoder );\n\n    outline->root.windingMomentum = 0;\n\n    FT_GlyphLoader_Rewind( decoder->builder.loader );\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_outline_close( CF2_Outline  outline )\n  {\n    CFF_Decoder*  decoder = outline->decoder;\n\n\n    FT_ASSERT( decoder );\n\n    cff_builder_close_contour( &decoder->builder );\n\n    FT_GlyphLoader_Add( decoder->builder.loader );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2ft.h                                                                */\n/*                                                                         */\n/*    FreeType Glue Component to Adobe's Interpreter (specification).      */\n/*                                                                         */\n/*  Copyright 2013 Adobe Systems Incorporated.                             */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CF2FT_H__\n#define __CF2FT_H__\n\n\n#include \"cf2types.h\"\n\n\n  /* TODO: disable asserts for now */\n#define CF2_NDEBUG\n\n\n#include \"../../include/freetype/ftsystem.h\"\n\n#include \"cf2glue.h\"\n#include \"cffgload.h\"    /* for CFF_Decoder */\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( FT_Error )\n  cf2_decoder_parse_charstrings( CFF_Decoder*  decoder,\n                                 FT_Byte*      charstring_base,\n                                 FT_ULong      charstring_len );\n\n  FT_LOCAL( CFF_SubFont )\n  cf2_getSubfont( CFF_Decoder*  decoder );\n\n\n  FT_LOCAL( CF2_Fixed )\n  cf2_getPpemY( CFF_Decoder*  decoder );\n  FT_LOCAL( CF2_Fixed )\n  cf2_getStdVW( CFF_Decoder*  decoder );\n  FT_LOCAL( CF2_Fixed )\n  cf2_getStdHW( CFF_Decoder*  decoder );\n\n  FT_LOCAL( void )\n  cf2_getBlueMetrics( CFF_Decoder*  decoder,\n                      CF2_Fixed*    blueScale,\n                      CF2_Fixed*    blueShift,\n                      CF2_Fixed*    blueFuzz );\n  FT_LOCAL( void )\n  cf2_getBlueValues( CFF_Decoder*  decoder,\n                     size_t*       count,\n                     FT_Pos*      *data );\n  FT_LOCAL( void )\n  cf2_getOtherBlues( CFF_Decoder*  decoder,\n                     size_t*       count,\n                     FT_Pos*      *data );\n  FT_LOCAL( void )\n  cf2_getFamilyBlues( CFF_Decoder*  decoder,\n                      size_t*       count,\n                      FT_Pos*      *data );\n  FT_LOCAL( void )\n  cf2_getFamilyOtherBlues( CFF_Decoder*  decoder,\n                           size_t*       count,\n                           FT_Pos*      *data );\n\n  FT_LOCAL( CF2_Int )\n  cf2_getLanguageGroup( CFF_Decoder*  decoder );\n\n  FT_LOCAL( CF2_Int )\n  cf2_initGlobalRegionBuffer( CFF_Decoder*  decoder,\n                              CF2_UInt      idx,\n                              CF2_Buffer    buf );\n  FT_LOCAL( FT_Error )\n  cf2_getSeacComponent( CFF_Decoder*  decoder,\n                        CF2_UInt      code,\n                        CF2_Buffer    buf );\n  FT_LOCAL( void )\n  cf2_freeSeacComponent( CFF_Decoder*  decoder,\n                         CF2_Buffer    buf );\n  FT_LOCAL( CF2_Int )\n  cf2_initLocalRegionBuffer( CFF_Decoder*  decoder,\n                             CF2_UInt      idx,\n                             CF2_Buffer    buf );\n\n  FT_LOCAL( CF2_Fixed )\n  cf2_getDefaultWidthX( CFF_Decoder*  decoder );\n  FT_LOCAL( CF2_Fixed )\n  cf2_getNominalWidthX( CFF_Decoder*  decoder );\n\n\n  /*\n   * FreeType client outline\n   *\n   * process output from the charstring interpreter\n   */\n  typedef struct  CF2_OutlineRec_\n  {\n    CF2_OutlineCallbacksRec  root;        /* base class must be first */\n    CFF_Decoder*             decoder;\n\n  } CF2_OutlineRec, *CF2_Outline;\n\n\n  FT_LOCAL( void )\n  cf2_outline_reset( CF2_Outline  outline );\n  FT_LOCAL( void )\n  cf2_outline_close( CF2_Outline  outline );\n\n\nFT_END_HEADER\n\n\n#endif /* __CF2FT_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2glue.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2glue.h                                                              */\n/*                                                                         */\n/*    Adobe's code for shared stuff (specification only).                  */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CF2GLUE_H__\n#define __CF2GLUE_H__\n\n\n/* common includes for other modules */\n#include \"cf2error.h\"\n#include \"cf2fixed.h\"\n#include \"cf2arrst.h\"\n#include \"cf2read.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /* rendering parameters */\n\n  /* apply hints to rendered glyphs */\n#define CF2_FlagsHinted    1\n  /* for testing */\n#define CF2_FlagsDarkened  2\n\n  /* type for holding the flags */\n  typedef CF2_Int  CF2_RenderingFlags;\n\n\n  /* elements of a glyph outline */\n  typedef enum  CF2_PathOp_\n  {\n    CF2_PathOpMoveTo = 1,     /* change the current point */\n    CF2_PathOpLineTo = 2,     /* line                     */\n    CF2_PathOpQuadTo = 3,     /* quadratic curve          */\n    CF2_PathOpCubeTo = 4      /* cubic curve              */\n\n  } CF2_PathOp;\n\n\n  /* a matrix of fixed point values */\n  typedef struct  CF2_Matrix_\n  {\n    CF2_F16Dot16  a;\n    CF2_F16Dot16  b;\n    CF2_F16Dot16  c;\n    CF2_F16Dot16  d;\n    CF2_F16Dot16  tx;\n    CF2_F16Dot16  ty;\n\n  } CF2_Matrix;\n\n\n  /* these typedefs are needed by more than one header file */\n  /* and gcc compiler doesn't allow redefinition            */\n  typedef struct CF2_FontRec_  CF2_FontRec, *CF2_Font;\n  typedef struct CF2_HintRec_  CF2_HintRec, *CF2_Hint;\n\n\n  /* A common structure for all callback parameters.                       */\n  /*                                                                       */\n  /* Some members may be unused.  For example, `pt0' is not used for       */\n  /* `moveTo' and `pt3' is not used for `quadTo'.  The initial point `pt0' */\n  /* is included for each path element for generality; curve conversions   */\n  /* need it.  The `op' parameter allows one function to handle multiple   */\n  /* element types.                                                        */\n\n  typedef struct  CF2_CallbackParamsRec_\n  {\n    FT_Vector  pt0;\n    FT_Vector  pt1;\n    FT_Vector  pt2;\n    FT_Vector  pt3;\n\n    CF2_Int  op;\n\n  } CF2_CallbackParamsRec, *CF2_CallbackParams;\n\n\n  /* forward reference */\n  typedef struct CF2_OutlineCallbacksRec_  CF2_OutlineCallbacksRec,\n                                           *CF2_OutlineCallbacks;\n\n  /* callback function pointers */\n  typedef void\n  (*CF2_Callback_Type)( CF2_OutlineCallbacks      callbacks,\n                        const CF2_CallbackParams  params );\n\n\n  struct  CF2_OutlineCallbacksRec_\n  {\n    CF2_Callback_Type  moveTo;\n    CF2_Callback_Type  lineTo;\n    CF2_Callback_Type  quadTo;\n    CF2_Callback_Type  cubeTo;\n\n    CF2_Int  windingMomentum;    /* for winding order detection */\n\n    FT_Memory  memory;\n    FT_Error*  error;\n  };\n\n\nFT_END_HEADER\n\n\n#endif /* __CF2GLUE_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2hints.c                                                             */\n/*                                                                         */\n/*    Adobe's code for handling CFF hints (body).                          */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"cf2ft.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n\n#include \"cf2glue.h\"\n#include \"cf2font.h\"\n#include \"cf2hints.h\"\n#include \"cf2intrp.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cf2hints\n\n\n  typedef struct  CF2_HintMoveRec_\n  {\n    size_t     j;          /* index of upper hint map edge   */\n    CF2_Fixed  moveUp;     /* adjustment to optimum position */\n\n  } CF2_HintMoveRec, *CF2_HintMove;\n\n\n  /* Compute angular momentum for winding order detection.  It is called */\n  /* for all lines and curves, but not necessarily in element order.     */\n  static CF2_Int\n  cf2_getWindingMomentum( CF2_Fixed  x1,\n                          CF2_Fixed  y1,\n                          CF2_Fixed  x2,\n                          CF2_Fixed  y2 )\n  {\n    /* cross product of pt1 position from origin with pt2 position from  */\n    /* pt1; we reduce the precision so that the result fits into 32 bits */\n\n    return ( x1 >> 16 ) * ( ( y2 - y1 ) >> 16 ) -\n           ( y1 >> 16 ) * ( ( x2 - x1 ) >> 16 );\n  }\n\n\n  /*\n   * Construct from a StemHint; this is used as a parameter to\n   * `cf2_blues_capture'.\n   * `hintOrigin' is the character space displacement of a seac accent.\n   * Adjust stem hint for darkening here.\n   *\n   */\n  static void\n  cf2_hint_init( CF2_Hint            hint,\n                 const CF2_ArrStack  stemHintArray,\n                 size_t              indexStemHint,\n                 const CF2_Font      font,\n                 CF2_Fixed           hintOrigin,\n                 CF2_Fixed           scale,\n                 FT_Bool             bottom )\n  {\n    CF2_Fixed               width;\n    const CF2_StemHintRec*  stemHint;\n\n\n    FT_ZERO( hint );\n\n    stemHint = (const CF2_StemHintRec*)cf2_arrstack_getPointer(\n                                         stemHintArray,\n                                         indexStemHint );\n\n    width = stemHint->max - stemHint->min;\n\n    if ( width == cf2_intToFixed( -21 ) )\n    {\n      /* ghost bottom */\n\n      if ( bottom )\n      {\n        hint->csCoord = stemHint->max;\n        hint->flags   = CF2_GhostBottom;\n      }\n      else\n        hint->flags = 0;\n    }\n\n    else if ( width == cf2_intToFixed( -20 ) )\n    {\n      /* ghost top */\n\n      if ( bottom )\n        hint->flags = 0;\n      else\n      {\n        hint->csCoord = stemHint->min;\n        hint->flags   = CF2_GhostTop;\n      }\n    }\n\n    else if ( width < 0 )\n    {\n      /* inverted pair */\n\n      /*\n       * Hints with negative widths were produced by an early version of a\n       * non-Adobe font tool.  The Type 2 spec allows edge (ghost) hints\n       * with negative widths, but says\n       *\n       *   All other negative widths have undefined meaning.\n       *\n       * CoolType has a silent workaround that negates the hint width; for\n       * permissive mode, we do the same here.\n       *\n       * Note: Such fonts cannot use ghost hints, but should otherwise work.\n       * Note: Some poor hints in our faux fonts can produce negative\n       *       widths at some blends.  For example, see a light weight of\n       *       `u' in ASerifMM.\n       *\n       */\n      if ( bottom )\n      {\n        hint->csCoord = stemHint->max;\n        hint->flags   = CF2_PairBottom;\n      }\n      else\n      {\n        hint->csCoord = stemHint->min;\n        hint->flags   = CF2_PairTop;\n      }\n    }\n\n    else\n    {\n      /* normal pair */\n\n      if ( bottom )\n      {\n        hint->csCoord = stemHint->min;\n        hint->flags   = CF2_PairBottom;\n      }\n      else\n      {\n        hint->csCoord = stemHint->max;\n        hint->flags   = CF2_PairTop;\n      }\n    }\n\n    /* Now that ghost hints have been detected, adjust this edge for      */\n    /* darkening.  Bottoms are not changed; tops are incremented by twice */\n    /* `darkenY'.                                                         */\n    if ( cf2_hint_isTop( hint ) )\n      hint->csCoord += 2 * font->darkenY;\n\n    hint->csCoord += hintOrigin;\n    hint->scale    = scale;\n    hint->index    = indexStemHint;   /* index in original stem hint array */\n\n    /* if original stem hint has been used, use the same position */\n    if ( hint->flags != 0 && stemHint->used )\n    {\n      if ( cf2_hint_isTop( hint ) )\n        hint->dsCoord = stemHint->maxDS;\n      else\n        hint->dsCoord = stemHint->minDS;\n\n      cf2_hint_lock( hint );\n    }\n    else\n      hint->dsCoord = FT_MulFix( hint->csCoord, scale );\n  }\n\n\n  /* initialize an invalid hint map element */\n  static void\n  cf2_hint_initZero( CF2_Hint  hint )\n  {\n    FT_ZERO( hint );\n  }\n\n\n  FT_LOCAL_DEF( FT_Bool )\n  cf2_hint_isValid( const CF2_Hint  hint )\n  {\n    return (FT_Bool)( hint->flags != 0 );\n  }\n\n\n  static FT_Bool\n  cf2_hint_isPair( const CF2_Hint  hint )\n  {\n    return (FT_Bool)( ( hint->flags                      &\n                        ( CF2_PairBottom | CF2_PairTop ) ) != 0 );\n  }\n\n\n  static FT_Bool\n  cf2_hint_isPairTop( const CF2_Hint  hint )\n  {\n    return (FT_Bool)( ( hint->flags & CF2_PairTop ) != 0 );\n  }\n\n\n  FT_LOCAL_DEF( FT_Bool )\n  cf2_hint_isTop( const CF2_Hint  hint )\n  {\n    return (FT_Bool)( ( hint->flags                    &\n                        ( CF2_PairTop | CF2_GhostTop ) ) != 0 );\n  }\n\n\n  FT_LOCAL_DEF( FT_Bool )\n  cf2_hint_isBottom( const CF2_Hint  hint )\n  {\n    return (FT_Bool)( ( hint->flags                          &\n                        ( CF2_PairBottom | CF2_GhostBottom ) ) != 0 );\n  }\n\n\n  static FT_Bool\n  cf2_hint_isLocked( const CF2_Hint  hint )\n  {\n    return (FT_Bool)( ( hint->flags & CF2_Locked ) != 0 );\n  }\n\n\n  static FT_Bool\n  cf2_hint_isSynthetic( const CF2_Hint  hint )\n  {\n    return (FT_Bool)( ( hint->flags & CF2_Synthetic ) != 0 );\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_hint_lock( CF2_Hint  hint )\n  {\n    hint->flags |= CF2_Locked;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_hintmap_init( CF2_HintMap   hintmap,\n                    CF2_Font      font,\n                    CF2_HintMap   initialMap,\n                    CF2_ArrStack  hintMoves,\n                    CF2_Fixed     scale )\n  {\n    FT_ZERO( hintmap );\n\n    /* copy parameters from font instance */\n    hintmap->hinted         = font->hinted;\n    hintmap->scale          = scale;\n    hintmap->font           = font;\n    hintmap->initialHintMap = initialMap;\n    /* will clear in `cf2_hintmap_adjustHints' */\n    hintmap->hintMoves      = hintMoves;\n  }\n\n\n  static FT_Bool\n  cf2_hintmap_isValid( const CF2_HintMap  hintmap )\n  {\n    return hintmap->isValid;\n  }\n\n\n  /* transform character space coordinate to device space using hint map */\n  static CF2_Fixed\n  cf2_hintmap_map( CF2_HintMap  hintmap,\n                   CF2_Fixed    csCoord )\n  {\n    FT_ASSERT( hintmap->isValid );  /* must call Build before Map */\n    FT_ASSERT( hintmap->lastIndex < CF2_MAX_HINT_EDGES );\n\n    if ( hintmap->count == 0 || ! hintmap->hinted )\n    {\n      /* there are no hints; use uniform scale and zero offset */\n      return FT_MulFix( csCoord, hintmap->scale );\n    }\n    else\n    {\n      /* start linear search from last hit */\n      CF2_UInt  i = hintmap->lastIndex;\n\n\n      /* search up */\n      while ( i < hintmap->count - 1                  &&\n              csCoord >= hintmap->edge[i + 1].csCoord )\n        i += 1;\n\n      /* search down */\n      while ( i > 0 && csCoord < hintmap->edge[i].csCoord )\n        i -= 1;\n\n      hintmap->lastIndex = i;\n\n      if ( i == 0 && csCoord < hintmap->edge[0].csCoord )\n      {\n        /* special case for points below first edge: use uniform scale */\n        return FT_MulFix( csCoord - hintmap->edge[0].csCoord,\n                          hintmap->scale ) +\n                 hintmap->edge[0].dsCoord;\n      }\n      else\n      {\n        /*\n         * Note: entries with duplicate csCoord are allowed.\n         * Use edge[i], the highest entry where csCoord >= entry[i].csCoord\n         */\n        return FT_MulFix( csCoord - hintmap->edge[i].csCoord,\n                          hintmap->edge[i].scale ) +\n                 hintmap->edge[i].dsCoord;\n      }\n    }\n  }\n\n\n  /*\n   * This hinting policy moves a hint pair in device space so that one of\n   * its two edges is on a device pixel boundary (its fractional part is\n   * zero).  `cf2_hintmap_insertHint' guarantees no overlap in CS\n   * space.  Ensure here that there is no overlap in DS.\n   *\n   * In the first pass, edges are adjusted relative to adjacent hints.\n   * Those that are below have already been adjusted.  Those that are\n   * above have not yet been adjusted.  If a hint above blocks an\n   * adjustment to an optimal position, we will try again in a second\n   * pass.  The second pass is top-down.\n   *\n   */\n\n  static void\n  cf2_hintmap_adjustHints( CF2_HintMap  hintmap )\n  {\n    size_t  i, j;\n\n\n    cf2_arrstack_clear( hintmap->hintMoves );      /* working storage */\n\n    /*\n     * First pass is bottom-up (font hint order) without look-ahead.\n     * Locked edges are already adjusted.\n     * Unlocked edges begin with dsCoord from `initialHintMap'.\n     * Save edges that are not optimally adjusted in `hintMoves' array,\n     * and process them in second pass.\n     */\n\n    for ( i = 0; i < hintmap->count; i++ )\n    {\n      FT_Bool  isPair = cf2_hint_isPair( &hintmap->edge[i] );\n\n\n      /* index of upper edge (same value for ghost hint) */\n      j = isPair ? i + 1 : i;\n\n      FT_ASSERT( j < hintmap->count );\n      FT_ASSERT( cf2_hint_isValid( &hintmap->edge[i] ) );\n      FT_ASSERT( cf2_hint_isValid( &hintmap->edge[j] ) );\n      FT_ASSERT( cf2_hint_isLocked( &hintmap->edge[i] ) ==\n                   cf2_hint_isLocked( &hintmap->edge[j] ) );\n\n      if ( !cf2_hint_isLocked( &hintmap->edge[i] ) )\n      {\n        /* hint edge is not locked, we can adjust it */\n        CF2_Fixed  fracDown = cf2_fixedFraction( hintmap->edge[i].dsCoord );\n        CF2_Fixed  fracUp   = cf2_fixedFraction( hintmap->edge[j].dsCoord );\n\n        /* calculate all four possibilities; moves down are negative */\n        CF2_Fixed  downMoveDown = 0 - fracDown;\n        CF2_Fixed  upMoveDown   = 0 - fracUp;\n        CF2_Fixed  downMoveUp   = fracDown == 0\n                                    ? 0\n                                    : cf2_intToFixed( 1 ) - fracDown;\n        CF2_Fixed  upMoveUp     = fracUp == 0\n                                    ? 0\n                                    : cf2_intToFixed( 1 ) - fracUp;\n\n        /* smallest move up */\n        CF2_Fixed  moveUp   = FT_MIN( downMoveUp, upMoveUp );\n        /* smallest move down */\n        CF2_Fixed  moveDown = FT_MAX( downMoveDown, upMoveDown );\n\n        /* final amount to move edge or edge pair */\n        CF2_Fixed  move;\n\n        CF2_Fixed  downMinCounter = CF2_MIN_COUNTER;\n        CF2_Fixed  upMinCounter   = CF2_MIN_COUNTER;\n        FT_Bool    saveEdge       = FALSE;\n\n\n        /* minimum counter constraint doesn't apply when adjacent edges */\n        /* are synthetic                                                */\n        /* TODO: doesn't seem a big effect; for now, reduce the code    */\n#if 0\n        if ( i == 0                                        ||\n             cf2_hint_isSynthetic( &hintmap->edge[i - 1] ) )\n          downMinCounter = 0;\n\n        if ( j >= hintmap->count - 1                       ||\n             cf2_hint_isSynthetic( &hintmap->edge[j + 1] ) )\n          upMinCounter = 0;\n#endif\n\n        /* is there room to move up?                                    */\n        /* there is if we are at top of array or the next edge is at or */\n        /* beyond proposed move up?                                     */\n        if ( j >= hintmap->count - 1                            ||\n             hintmap->edge[j + 1].dsCoord >=\n               hintmap->edge[j].dsCoord + moveUp + upMinCounter )\n        {\n          /* there is room to move up; is there also room to move down? */\n          if ( i == 0                                                 ||\n               hintmap->edge[i - 1].dsCoord <=\n                 hintmap->edge[i].dsCoord + moveDown - downMinCounter )\n          {\n            /* move smaller absolute amount */\n            move = ( -moveDown < moveUp ) ? moveDown : moveUp;  /* optimum */\n          }\n          else\n            move = moveUp;\n        }\n        else\n        {\n          /* is there room to move down? */\n          if ( i == 0                                                 ||\n               hintmap->edge[i - 1].dsCoord <=\n                 hintmap->edge[i].dsCoord + moveDown - downMinCounter )\n          {\n            move     = moveDown;\n            /* true if non-optimum move */\n            saveEdge = (FT_Bool)( moveUp < -moveDown );\n          }\n          else\n          {\n            /* no room to move either way without overlapping or reducing */\n            /* the counter too much                                       */\n            move     = 0;\n            saveEdge = TRUE;\n          }\n        }\n\n        /* Identify non-moves and moves down that aren't optimal, and save */\n        /* them for second pass.                                           */\n        /* Do this only if there is an unlocked edge above (which could    */\n        /* possibly move).                                                 */\n        if ( saveEdge                                    &&\n             j < hintmap->count - 1                      &&\n             !cf2_hint_isLocked( &hintmap->edge[j + 1] ) )\n        {\n          CF2_HintMoveRec  savedMove;\n\n\n          savedMove.j      = j;\n          /* desired adjustment in second pass */\n          savedMove.moveUp = moveUp - move;\n\n          cf2_arrstack_push( hintmap->hintMoves, &savedMove );\n        }\n\n        /* move the edge(s) */\n        hintmap->edge[i].dsCoord += move;\n        if ( isPair )\n          hintmap->edge[j].dsCoord += move;\n      }\n\n      /* assert there are no overlaps in device space */\n      FT_ASSERT( i == 0                                                   ||\n                 hintmap->edge[i - 1].dsCoord <= hintmap->edge[i].dsCoord );\n      FT_ASSERT( i < j                                                ||\n                 hintmap->edge[i].dsCoord <= hintmap->edge[j].dsCoord );\n\n      /* adjust the scales, avoiding divide by zero */\n      if ( i > 0 )\n      {\n        if ( hintmap->edge[i].csCoord != hintmap->edge[i - 1].csCoord )\n          hintmap->edge[i - 1].scale =\n            FT_DivFix(\n              hintmap->edge[i].dsCoord - hintmap->edge[i - 1].dsCoord,\n              hintmap->edge[i].csCoord - hintmap->edge[i - 1].csCoord );\n      }\n\n      if ( isPair )\n      {\n        if ( hintmap->edge[j].csCoord != hintmap->edge[j - 1].csCoord )\n          hintmap->edge[j - 1].scale =\n            FT_DivFix(\n              hintmap->edge[j].dsCoord - hintmap->edge[j - 1].dsCoord,\n              hintmap->edge[j].csCoord - hintmap->edge[j - 1].csCoord );\n\n        i += 1;     /* skip upper edge on next loop */\n      }\n    }\n\n    /* second pass tries to move non-optimal hints up, in case there is */\n    /* room now                                                         */\n    for ( i = cf2_arrstack_size( hintmap->hintMoves ); i > 0; i-- )\n    {\n      CF2_HintMove  hintMove = (CF2_HintMove)\n                      cf2_arrstack_getPointer( hintmap->hintMoves, i - 1 );\n\n\n      j = hintMove->j;\n\n      /* this was tested before the push, above */\n      FT_ASSERT( j < hintmap->count - 1 );\n\n      /* is there room to move up? */\n      if ( hintmap->edge[j + 1].dsCoord >=\n             hintmap->edge[j].dsCoord + hintMove->moveUp + CF2_MIN_COUNTER )\n      {\n        /* there is more room now, move edge up */\n        hintmap->edge[j].dsCoord += hintMove->moveUp;\n\n        if ( cf2_hint_isPair( &hintmap->edge[j] ) )\n        {\n          FT_ASSERT( j > 0 );\n          hintmap->edge[j - 1].dsCoord += hintMove->moveUp;\n        }\n      }\n    }\n  }\n\n\n  /* insert hint edges into map, sorted by csCoord */\n  static void\n  cf2_hintmap_insertHint( CF2_HintMap  hintmap,\n                          CF2_Hint     bottomHintEdge,\n                          CF2_Hint     topHintEdge )\n  {\n    CF2_UInt  indexInsert;\n\n    /* set default values, then check for edge hints */\n    FT_Bool   isPair         = TRUE;\n    CF2_Hint  firstHintEdge  = bottomHintEdge;\n    CF2_Hint  secondHintEdge = topHintEdge;\n\n\n    /* one or none of the input params may be invalid when dealing with */\n    /* edge hints; at least one edge must be valid                      */\n    FT_ASSERT( cf2_hint_isValid( bottomHintEdge ) ||\n               cf2_hint_isValid( topHintEdge )    );\n\n    /* determine how many and which edges to insert */\n    if ( !cf2_hint_isValid( bottomHintEdge ) )\n    {\n      /* insert only the top edge */\n      firstHintEdge = topHintEdge;\n      isPair        = FALSE;\n    }\n    else if ( !cf2_hint_isValid( topHintEdge ) )\n    {\n      /* insert only the bottom edge */\n      isPair = FALSE;\n    }\n\n    /* paired edges must be in proper order */\n    FT_ASSERT( !isPair                                         ||\n               topHintEdge->csCoord >= bottomHintEdge->csCoord );\n\n    /* linear search to find index value of insertion point */\n    indexInsert = 0;\n    for ( ; indexInsert < hintmap->count; indexInsert++ )\n    {\n      if ( hintmap->edge[indexInsert].csCoord > firstHintEdge->csCoord )\n        break;\n    }\n\n    /*\n     * Discard any hints that overlap in character space.  Most often,\n     * this is while building the initial map, but in theory, it can also\n     * occur because of darkening.\n     *\n     */\n    if ( indexInsert < hintmap->count )\n    {\n      /* we are inserting before an existing edge:              */\n      /* verify that a new pair does not straddle the next edge */\n      if ( isPair                                                       &&\n           hintmap->edge[indexInsert].csCoord < secondHintEdge->csCoord )\n        return; /* ignore overlapping stem hint */\n\n      /* verify that we are not inserting between paired edges */\n      if ( cf2_hint_isPairTop( &hintmap->edge[indexInsert] ) )\n        return; /* ignore overlapping stem hint */\n    }\n\n    /* recompute device space locations using initial hint map */\n    if ( cf2_hintmap_isValid( hintmap->initialHintMap ) &&\n         !cf2_hint_isLocked( firstHintEdge )            )\n    {\n      if ( isPair )\n      {\n        /* Use hint map to position the center of stem, and nominal scale */\n        /* to position the two edges.  This preserves the stem width.     */\n        CF2_Fixed  midpoint  = cf2_hintmap_map(\n                                 hintmap->initialHintMap,\n                                 ( secondHintEdge->csCoord +\n                                   firstHintEdge->csCoord ) / 2 );\n        CF2_Fixed  halfWidth = FT_MulFix(\n                                 ( secondHintEdge->csCoord -\n                                   firstHintEdge->csCoord ) / 2,\n                                 hintmap->scale );\n\n\n        firstHintEdge->dsCoord  = midpoint - halfWidth;\n        secondHintEdge->dsCoord = midpoint + halfWidth;\n      }\n      else\n        firstHintEdge->dsCoord = cf2_hintmap_map( hintmap->initialHintMap,\n                                                  firstHintEdge->csCoord );\n    }\n\n    /* discard any hints that overlap in device space; this can occur */\n    /* because locked hints have been moved to align with blue zones  */\n    if ( indexInsert > 0 )\n    {\n      /* we are inserting after an existing edge */\n      if ( firstHintEdge->dsCoord < hintmap->edge[indexInsert - 1].dsCoord )\n        return;\n    }\n\n    if ( indexInsert < hintmap->count )\n    {\n      /* we are inserting before an existing edge */\n      if ( isPair )\n      {\n        if ( secondHintEdge->dsCoord > hintmap->edge[indexInsert].dsCoord )\n          return;\n      }\n      else\n      {\n        if ( firstHintEdge->dsCoord > hintmap->edge[indexInsert].dsCoord )\n          return;\n      }\n    }\n\n    /* make room to insert */\n    {\n      CF2_Int  iSrc = hintmap->count - 1;\n      CF2_Int  iDst = isPair ? hintmap->count + 1 : hintmap->count;\n\n      CF2_Int  count = hintmap->count - indexInsert;\n\n\n      if ( iDst >= CF2_MAX_HINT_EDGES )\n      {\n        FT_TRACE4(( \"cf2_hintmap_insertHint: too many hintmaps\\n\" ));\n        return;\n      }\n\n      while ( count-- )\n        hintmap->edge[iDst--] = hintmap->edge[iSrc--];\n\n      /* insert first edge */\n      hintmap->edge[indexInsert] = *firstHintEdge;         /* copy struct */\n      hintmap->count += 1;\n\n      if ( isPair )\n      {\n        /* insert second edge */\n        hintmap->edge[indexInsert + 1] = *secondHintEdge;  /* copy struct */\n        hintmap->count                += 1;\n      }\n    }\n\n    return;\n  }\n\n\n  /*\n   * Build a map from hints and mask.\n   *\n   * This function may recur one level if `hintmap->initialHintMap' is not yet\n   * valid.\n   * If `initialMap' is true, simply build initial map.\n   *\n   * Synthetic hints are used in two ways.  A hint at zero is inserted, if\n   * needed, in the initial hint map, to prevent translations from\n   * propagating across the origin.  If synthetic em box hints are enabled\n   * for ideographic dictionaries, then they are inserted in all hint\n   * maps, including the initial one.\n   *\n   */\n  FT_LOCAL_DEF( void )\n  cf2_hintmap_build( CF2_HintMap   hintmap,\n                     CF2_ArrStack  hStemHintArray,\n                     CF2_ArrStack  vStemHintArray,\n                     CF2_HintMask  hintMask,\n                     CF2_Fixed     hintOrigin,\n                     FT_Bool       initialMap )\n  {\n    FT_Byte*  maskPtr;\n\tFT_Byte*  maskEndPtr;\t// add by Xiaochuan_Liu\n\n    CF2_Font         font = hintmap->font;\n    CF2_HintMaskRec  tempHintMask;\n\n    size_t   bitCount, i;\n    FT_Byte  maskByte;\n\n\n    /* check whether initial map is constructed */\n    if ( !initialMap && !cf2_hintmap_isValid( hintmap->initialHintMap ) )\n    {\n      /* make recursive call with initialHintMap and temporary mask; */\n      /* temporary mask will get all bits set, below */\n      cf2_hintmask_init( &tempHintMask, hintMask->error );\n      cf2_hintmap_build( hintmap->initialHintMap,\n                         hStemHintArray,\n                         vStemHintArray,\n                         &tempHintMask,\n                         hintOrigin,\n                         TRUE );\n    }\n\n    if ( !cf2_hintmask_isValid( hintMask ) )\n    {\n      /* without a hint mask, assume all hints are active */\n      cf2_hintmask_setAll( hintMask,\n                           cf2_arrstack_size( hStemHintArray ) +\n                             cf2_arrstack_size( vStemHintArray ) );\n    }\n\n    /* begin by clearing the map */\n    hintmap->count     = 0;\n    hintmap->lastIndex = 0;\n\n    /* make a copy of the hint mask so we can modify it */\n    tempHintMask = *hintMask;\n    maskPtr      = cf2_hintmask_getMaskPtr( &tempHintMask );\n\tmaskEndPtr   = maskPtr + ( CF2_MAX_HINTS + 7 ) / 8;\n\n\n    /* use the hStem hints only, which are first in the mask */\n    /* TODO: compare this to cffhintmaskGetBitCount */\n    bitCount = cf2_arrstack_size( hStemHintArray );\n\n    /* synthetic embox hints get highest priority */\n    if ( font->blues.doEmBoxHints )\n    {\n      CF2_HintRec  dummy;\n\n\n      cf2_hint_initZero( &dummy );   /* invalid hint map element */\n\n      /* ghost bottom */\n      cf2_hintmap_insertHint( hintmap,\n                              &font->blues.emBoxBottomEdge,\n                              &dummy );\n      /* ghost top */\n      cf2_hintmap_insertHint( hintmap,\n                              &dummy,\n                              &font->blues.emBoxTopEdge );\n    }\n\n    /* insert hints captured by a blue zone or already locked (higher */\n    /* priority)                                                      */\n    for ( i = 0, maskByte = 0x80; i < bitCount; i++ )\n    {\n      if ( maskByte & *maskPtr )\n      {\n        /* expand StemHint into two `CF2_Hint' elements */\n        CF2_HintRec  bottomHintEdge, topHintEdge;\n\n\n        cf2_hint_init( &bottomHintEdge,\n                       hStemHintArray,\n                       i,\n                       font,\n                       hintOrigin,\n                       hintmap->scale,\n                       TRUE /* bottom */ );\n        cf2_hint_init( &topHintEdge,\n                       hStemHintArray,\n                       i,\n                       font,\n                       hintOrigin,\n                       hintmap->scale,\n                       FALSE /* top */ );\n\n        if ( cf2_hint_isLocked( &bottomHintEdge ) ||\n             cf2_hint_isLocked( &topHintEdge )    ||\n             cf2_blues_capture( &font->blues,\n                                &bottomHintEdge,\n                                &topHintEdge )   )\n        {\n          /* insert captured hint into map */\n          cf2_hintmap_insertHint( hintmap, &bottomHintEdge, &topHintEdge );\n\n          *maskPtr &= ~maskByte;      /* turn off the bit for this hint */\n        }\n      }\n\n      if ( ( i & 7 ) == 7 )\n      {\n        /* move to next mask byte */\n        maskPtr++;\n\t\tif (maskPtr >= maskEndPtr)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t\t\n        maskByte = 0x80;\n      }\n      else\n        maskByte >>= 1;\n    }\n\n    /* initial hint map includes only captured hints plus maybe one at 0 */\n\n    /*\n     * TODO: There is a problem here because we are trying to build a\n     *       single hint map containing all captured hints.  It is\n     *       possible for there to be conflicts between captured hints,\n     *       either because of darkening or because the hints are in\n     *       separate hint zones (we are ignoring hint zones for the\n     *       initial map).  An example of the latter is MinionPro-Regular\n     *       v2.030 glyph 883 (Greek Capital Alpha with Psili) at 15ppem.\n     *       A stem hint for the psili conflicts with the top edge hint\n     *       for the base character.  The stem hint gets priority because\n     *       of its sort order.  In glyph 884 (Greek Capital Alpha with\n     *       Psili and Oxia), the top of the base character gets a stem\n     *       hint, and the psili does not.  This creates different initial\n     *       maps for the two glyphs resulting in different renderings of\n     *       the base character.  Will probably defer this either as not\n     *       worth the cost or as a font bug.  I don't think there is any\n     *       good reason for an accent to be captured by an alignment\n     *       zone.  -darnold 2/12/10\n     */\n\n    if ( initialMap )\n    {\n      /* Apply a heuristic that inserts a point for (0,0), unless it's     */\n      /* already covered by a mapping.  This locks the baseline for glyphs */\n      /* that have no baseline hints.                                      */\n\n      if ( hintmap->count == 0                           ||\n           hintmap->edge[0].csCoord > 0                  ||\n           hintmap->edge[hintmap->count - 1].csCoord < 0 )\n      {\n        /* all edges are above 0 or all edges are below 0; */\n        /* construct a locked edge hint at 0               */\n\n        CF2_HintRec  edge, invalid;\n\n\n        cf2_hint_initZero( &edge );\n\n        edge.flags = CF2_GhostBottom |\n                     CF2_Locked      |\n                     CF2_Synthetic;\n        edge.scale = hintmap->scale;\n\n        cf2_hint_initZero( &invalid );\n        cf2_hintmap_insertHint( hintmap, &edge, &invalid );\n      }\n    }\n    else\n    {\n      /* insert remaining hints */\n\n      maskPtr = cf2_hintmask_getMaskPtr( &tempHintMask );\n\t  maskEndPtr   = maskPtr + ( CF2_MAX_HINTS + 7 ) / 8;\n\n      for ( i = 0, maskByte = 0x80; i < bitCount; i++ )\n      {\n        if ( maskByte & *maskPtr )\n        {\n          CF2_HintRec  bottomHintEdge, topHintEdge;\n\n\n          cf2_hint_init( &bottomHintEdge,\n                         hStemHintArray,\n                         i,\n                         font,\n                         hintOrigin,\n                         hintmap->scale,\n                         TRUE /* bottom */ );\n          cf2_hint_init( &topHintEdge,\n                         hStemHintArray,\n                         i,\n                         font,\n                         hintOrigin,\n                         hintmap->scale,\n                         FALSE /* top */ );\n\n          cf2_hintmap_insertHint( hintmap, &bottomHintEdge, &topHintEdge );\n        }\n\n        if ( ( i & 7 ) == 7 )\n        {\n          /* move to next mask byte */\n          maskPtr++;\n\t\t  if (maskPtr >= maskEndPtr)\n\t\t  {\n\t\t\tbreak;\n\t\t  }\n          maskByte = 0x80;\n        }\n        else\n          maskByte >>= 1;\n      }\n    }\n\n    /*\n     * Note: The following line is a convenient place to break when\n     *       debugging hinting.  Examine `hintmap->edge' for the list of\n     *       enabled hints, then step over the call to see the effect of\n     *       adjustment.  We stop here first on the recursive call that\n     *       creates the initial map, and then on each counter group and\n     *       hint zone.\n     */\n\n    /* adjust positions of hint edges that are not locked to blue zones */\n    cf2_hintmap_adjustHints( hintmap );\n\n    /* save the position of all hints that were used in this hint map; */\n    /* if we use them again, we'll locate them in the same position    */\n    if ( !initialMap )\n    {\n      for ( i = 0; i < hintmap->count; i++ )\n      {\n        if ( !cf2_hint_isSynthetic( &hintmap->edge[i] ) )\n        {\n          /* Note: include both valid and invalid edges            */\n          /* Note: top and bottom edges are copied back separately */\n          CF2_StemHint  stemhint = (CF2_StemHint)\n                          cf2_arrstack_getPointer( hStemHintArray,\n                                                   hintmap->edge[i].index );\n\n\n          if ( cf2_hint_isTop( &hintmap->edge[i] ) )\n            stemhint->maxDS = hintmap->edge[i].dsCoord;\n          else\n            stemhint->minDS = hintmap->edge[i].dsCoord;\n\n          stemhint->used = TRUE;\n        }\n      }\n    }\n\n    /* hint map is ready to use */\n    hintmap->isValid = TRUE;\n\n    /* remember this mask has been used */\n    cf2_hintmask_setNew( hintMask, FALSE );\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_glyphpath_init( CF2_GlyphPath         glyphpath,\n                      CF2_Font              font,\n                      CF2_OutlineCallbacks  callbacks,\n                      CF2_Fixed             scaleY,\n                      /* CF2_Fixed  hShift, */\n                      CF2_ArrStack          hStemHintArray,\n                      CF2_ArrStack          vStemHintArray,\n                      CF2_HintMask          hintMask,\n                      CF2_Fixed             hintOriginY,\n                      const CF2_Blues       blues,\n                      const FT_Vector*      fractionalTranslation )\n  {\n    FT_ZERO( glyphpath );\n\n    glyphpath->font      = font;\n    glyphpath->callbacks = callbacks;\n\n    cf2_arrstack_init( &glyphpath->hintMoves,\n                       font->memory,\n                       &font->error,\n                       sizeof ( CF2_HintMoveRec ) );\n\n    cf2_hintmap_init( &glyphpath->initialHintMap,\n                      font,\n                      &glyphpath->initialHintMap,\n                      &glyphpath->hintMoves,\n                      scaleY );\n    cf2_hintmap_init( &glyphpath->firstHintMap,\n                      font,\n                      &glyphpath->initialHintMap,\n                      &glyphpath->hintMoves,\n                      scaleY );\n    cf2_hintmap_init( &glyphpath->hintMap,\n                      font,\n                      &glyphpath->initialHintMap,\n                      &glyphpath->hintMoves,\n                      scaleY );\n\n    glyphpath->scaleX = font->innerTransform.a;\n    glyphpath->scaleC = font->innerTransform.c;\n    glyphpath->scaleY = font->innerTransform.d;\n\n    glyphpath->fractionalTranslation = *fractionalTranslation;\n\n#if 0\n    glyphpath->hShift = hShift;       /* for fauxing */\n#endif\n\n    glyphpath->hStemHintArray = hStemHintArray;\n    glyphpath->vStemHintArray = vStemHintArray;\n    glyphpath->hintMask       = hintMask;      /* ptr to current mask */\n    glyphpath->hintOriginY    = hintOriginY;\n    glyphpath->blues          = blues;\n    glyphpath->darken         = font->darkened; /* TODO: should we make copies? */\n    glyphpath->xOffset        = font->darkenX;\n    glyphpath->yOffset        = font->darkenY;\n    glyphpath->miterLimit     = 2 * FT_MAX(\n                                     cf2_fixedAbs( glyphpath->xOffset ),\n                                     cf2_fixedAbs( glyphpath->yOffset ) );\n\n    /* .1 character space unit */\n    glyphpath->snapThreshold = cf2_floatToFixed( 0.1f );\n\n    glyphpath->moveIsPending = TRUE;\n    glyphpath->pathIsOpen    = FALSE;\n    glyphpath->elemIsQueued  = FALSE;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_glyphpath_finalize( CF2_GlyphPath  glyphpath )\n  {\n    cf2_arrstack_finalize( &glyphpath->hintMoves );\n  }\n\n\n  /*\n   * Hint point in y-direction and apply outerTransform.\n   * Input `current' hint map (which is actually delayed by one element).\n   * Input x,y point in Character Space.\n   * Output x,y point in Device Space, including translation.\n   */\n  static void\n  cf2_glyphpath_hintPoint( CF2_GlyphPath  glyphpath,\n                           CF2_HintMap    hintmap,\n                           FT_Vector*     ppt,\n                           CF2_Fixed      x,\n                           CF2_Fixed      y )\n  {\n    FT_Vector  pt;   /* hinted point in upright DS */\n\n\n    pt.x = FT_MulFix( glyphpath->scaleX, x ) +\n             FT_MulFix( glyphpath->scaleC, y );\n    pt.y = cf2_hintmap_map( hintmap, y );\n\n    ppt->x = FT_MulFix( glyphpath->font->outerTransform.a, pt.x )   +\n               FT_MulFix( glyphpath->font->outerTransform.c, pt.y ) +\n               glyphpath->fractionalTranslation.x;\n    ppt->y = FT_MulFix( glyphpath->font->outerTransform.b, pt.x )   +\n               FT_MulFix( glyphpath->font->outerTransform.d, pt.y ) +\n               glyphpath->fractionalTranslation.y;\n  }\n\n\n  /*\n   * From two line segments, (u1,u2) and (v1,v2), compute a point of\n   * intersection on the corresponding lines.\n   * Return false if no intersection is found, or if the intersection is\n   * too far away from the ends of the line segments, u2 and v1.\n   *\n   */\n  static FT_Bool\n  cf2_glyphpath_computeIntersection( CF2_GlyphPath     glyphpath,\n                                     const FT_Vector*  u1,\n                                     const FT_Vector*  u2,\n                                     const FT_Vector*  v1,\n                                     const FT_Vector*  v2,\n                                     FT_Vector*        intersection )\n  {\n    /*\n     * Let `u' be a zero-based vector from the first segment, `v' from the\n     * second segment.\n     * Let `w 'be the zero-based vector from `u1' to `v1'.\n     * `perp' is the `perpendicular dot product'; see\n     * http://mathworld.wolfram.com/PerpDotProduct.html.\n     * `s' is the parameter for the parametric line for the first segment\n     * (`u').\n     *\n     * See notation in\n     * http://softsurfer.com/Archive/algorithm_0104/algorithm_0104B.htm.\n     * Calculations are done in 16.16, but must handle the squaring of\n     * line lengths in character space.  We scale all vectors by 1/32 to\n     * avoid overflow.  This allows values up to 4095 to be squared.  The\n     * scale factor cancels in the divide.\n     *\n     * TODO: the scale factor could be computed from UnitsPerEm.\n     *\n     */\n\n#define cf2_perp( a, b )                                    \\\n          ( FT_MulFix( a.x, b.y ) - FT_MulFix( a.y, b.x ) )\n\n  /* round and divide by 32 */\n#define CF2_CS_SCALE( x )         \\\n          ( ( (x) + 0x10 ) >> 5 )\n\n    FT_Vector  u, v, w;      /* scaled vectors */\n    CF2_Fixed  denominator, s;\n\n\n    u.x = CF2_CS_SCALE( u2->x - u1->x );\n    u.y = CF2_CS_SCALE( u2->y - u1->y );\n    v.x = CF2_CS_SCALE( v2->x - v1->x );\n    v.y = CF2_CS_SCALE( v2->y - v1->y );\n    w.x = CF2_CS_SCALE( v1->x - u1->x );\n    w.y = CF2_CS_SCALE( v1->y - u1->y );\n\n    denominator = cf2_perp( u, v );\n\n    if ( denominator == 0 )\n      return FALSE;           /* parallel or coincident lines */\n\n    s = FT_DivFix( cf2_perp( w, v ), denominator );\n\n    intersection->x = u1->x + FT_MulFix( s, u2->x - u1->x );\n    intersection->y = u1->y + FT_MulFix( s, u2->y - u1->y );\n\n    /*\n     * Special case snapping for horizontal and vertical lines.\n     * This cleans up intersections and reduces problems with winding\n     * order detection.\n     * Sample case is sbc cd KozGoPr6N-Medium.otf 20 16685.\n     * Note: these calculations are in character space.\n     *\n     */\n\n    if ( u1->x == u2->x                                                     &&\n         cf2_fixedAbs( intersection->x - u1->x ) < glyphpath->snapThreshold )\n      intersection->x = u1->x;\n    if ( u1->y == u2->y                                                     &&\n         cf2_fixedAbs( intersection->y - u1->y ) < glyphpath->snapThreshold )\n      intersection->y = u1->y;\n\n    if ( v1->x == v2->x                                                     &&\n         cf2_fixedAbs( intersection->x - v1->x ) < glyphpath->snapThreshold )\n      intersection->x = v1->x;\n    if ( v1->y == v2->y                                                     &&\n         cf2_fixedAbs( intersection->y - v1->y ) < glyphpath->snapThreshold )\n      intersection->y = v1->y;\n\n    /* limit the intersection distance from midpoint of u2 and v1 */\n    if ( cf2_fixedAbs( intersection->x - ( u2->x + v1->x ) / 2 ) >\n           glyphpath->miterLimit                                   ||\n         cf2_fixedAbs( intersection->y - ( u2->y + v1->y ) / 2 ) >\n           glyphpath->miterLimit                                   )\n      return FALSE;\n\n    return TRUE;\n  }\n\n\n  /*\n   * Push the cached element (glyphpath->prevElem*) to the outline\n   * consumer.  When a darkening offset is used, the end point of the\n   * cached element may be adjusted to an intersection point or it may be\n   * connected by a line to the current element.  This calculation must\n   * use a HintMap that was valid at the time the element was saved.  For\n   * the first point in a subpath, that is a saved HintMap.  For most\n   * elements, it just means the caller has delayed building a HintMap\n   * from the current HintMask.\n   *\n   * Transform each point with outerTransform and call the outline\n   * callbacks.  This is a general 3x3 transform:\n   *\n   *   x' = a*x + c*y + tx, y' = b*x + d*y + ty\n   *\n   * but it uses 4 elements from CF2_Font and the translation part\n   * from CF2_GlyphPath.\n   *\n   */\n  static void\n  cf2_glyphpath_pushPrevElem( CF2_GlyphPath  glyphpath,\n                              CF2_HintMap    hintmap,\n                              FT_Vector*     nextP0,\n                              FT_Vector      nextP1,\n                              FT_Bool        close )\n  {\n    CF2_CallbackParamsRec  params;\n\n    FT_Vector*  prevP0;\n    FT_Vector*  prevP1;\n\n    FT_Vector  intersection    = { 0, 0 };\n    FT_Bool    useIntersection = FALSE;\n\n\n    FT_ASSERT( glyphpath->prevElemOp == CF2_PathOpLineTo ||\n               glyphpath->prevElemOp == CF2_PathOpCubeTo );\n\n    if ( glyphpath->prevElemOp == CF2_PathOpLineTo )\n    {\n      prevP0 = &glyphpath->prevElemP0;\n      prevP1 = &glyphpath->prevElemP1;\n    }\n    else\n    {\n      prevP0 = &glyphpath->prevElemP2;\n      prevP1 = &glyphpath->prevElemP3;\n    }\n\n    /* optimization: if previous and next elements are offset by the same */\n    /* amount, then there will be no gap, and no need to compute an       */\n    /* intersection.                                                      */\n    if ( prevP1->x != nextP0->x || prevP1->y != nextP0->y )\n    {\n      /* previous element does not join next element:             */\n      /* adjust end point of previous element to the intersection */\n      useIntersection = cf2_glyphpath_computeIntersection( glyphpath,\n                                                           prevP0,\n                                                           prevP1,\n                                                           nextP0,\n                                                           &nextP1,\n                                                           &intersection );\n      if ( useIntersection )\n      {\n        /* modify the last point of the cached element (either line or */\n        /* curve)                                                      */\n        *prevP1 = intersection;\n      }\n    }\n\n    params.pt0 = glyphpath->currentDS;\n\n    switch( glyphpath->prevElemOp )\n    {\n    case CF2_PathOpLineTo:\n      params.op = CF2_PathOpLineTo;\n\n      /* note: pt2 and pt3 are unused */\n      cf2_glyphpath_hintPoint( glyphpath,\n                               hintmap,\n                               &params.pt1,\n                               glyphpath->prevElemP1.x,\n                               glyphpath->prevElemP1.y );\n\n      glyphpath->callbacks->lineTo( glyphpath->callbacks, &params );\n\n      glyphpath->currentDS = params.pt1;\n\n      break;\n\n    case CF2_PathOpCubeTo:\n      params.op = CF2_PathOpCubeTo;\n\n      /* TODO: should we intersect the interior joins (p1-p2 and p2-p3)? */\n      cf2_glyphpath_hintPoint( glyphpath,\n                               hintmap,\n                               &params.pt1,\n                               glyphpath->prevElemP1.x,\n                               glyphpath->prevElemP1.y );\n      cf2_glyphpath_hintPoint( glyphpath,\n                               hintmap,\n                               &params.pt2,\n                               glyphpath->prevElemP2.x,\n                               glyphpath->prevElemP2.y );\n      cf2_glyphpath_hintPoint( glyphpath,\n                               hintmap,\n                               &params.pt3,\n                               glyphpath->prevElemP3.x,\n                               glyphpath->prevElemP3.y );\n\n      glyphpath->callbacks->cubeTo( glyphpath->callbacks, &params );\n\n      glyphpath->currentDS = params.pt3;\n\n      break;\n    }\n\n    if ( !useIntersection || close )\n    {\n      /* insert connecting line between end of previous element and start */\n      /* of current one                                                   */\n      /* note: at the end of a subpath, we might do both, so use `nextP0' */\n      /* before we change it, below                                       */\n\n      cf2_glyphpath_hintPoint( glyphpath,\n                               hintmap,\n                               &params.pt1,\n                               nextP0->x,\n                               nextP0->y );\n\n      if ( params.pt1.x != glyphpath->currentDS.x ||\n           params.pt1.y != glyphpath->currentDS.y )\n      {\n        /* length is nonzero */\n        params.op  = CF2_PathOpLineTo;\n        params.pt0 = glyphpath->currentDS;\n\n        /* note: pt2 and pt3 are unused */\n        glyphpath->callbacks->lineTo( glyphpath->callbacks, &params );\n\n        glyphpath->currentDS = params.pt1;\n      }\n    }\n\n    if ( useIntersection )\n    {\n      /* return intersection point to caller */\n      *nextP0 = intersection;\n    }\n  }\n\n\n  /* push a MoveTo element based on current point and offset of current */\n  /* element                                                            */\n  static void\n  cf2_glyphpath_pushMove( CF2_GlyphPath  glyphpath,\n                          FT_Vector      start )\n  {\n    CF2_CallbackParamsRec  params;\n\n\n    params.op  = CF2_PathOpMoveTo;\n    params.pt0 = glyphpath->currentDS;\n\n    /* Test if move has really happened yet; it would have called */\n    /* `cf2_hintmap_build' to set `isValid'.                   */\n    if ( !cf2_hintmap_isValid( &glyphpath->hintMap ) )\n    {\n      /* we are here iff first subpath is missing a moveto operator: */\n      /* synthesize first moveTo to finish initialization of hintMap */\n      cf2_glyphpath_moveTo( glyphpath,\n                            glyphpath->start.x,\n                            glyphpath->start.y );\n    }\n\n    cf2_glyphpath_hintPoint( glyphpath,\n                             &glyphpath->hintMap,\n                             &params.pt1,\n                             start.x,\n                             start.y );\n\n    /* note: pt2 and pt3 are unused */\n    glyphpath->callbacks->moveTo( glyphpath->callbacks, &params );\n\n    glyphpath->currentDS    = params.pt1;\n    glyphpath->offsetStart0 = start;\n  }\n\n\n  /*\n   * All coordinates are in character space.\n   * On input, (x1, y1) and (x2, y2) give line segment.\n   * On output, (x, y) give offset vector.\n   * We use a piecewise approximation to trig functions.\n   *\n   * TODO: Offset true perpendicular and proper length\n   *       supply the y-translation for hinting here, too,\n   *       that adds yOffset unconditionally to *y.\n   */\n  static void\n  cf2_glyphpath_computeOffset( CF2_GlyphPath  glyphpath,\n                               CF2_Fixed      x1,\n                               CF2_Fixed      y1,\n                               CF2_Fixed      x2,\n                               CF2_Fixed      y2,\n                               CF2_Fixed*     x,\n                               CF2_Fixed*     y )\n  {\n    CF2_Fixed  dx = x2 - x1;\n    CF2_Fixed  dy = y2 - y1;\n\n\n    /* note: negative offsets don't work here; negate deltas to change */\n    /* quadrants, below                                                */\n    if ( glyphpath->font->reverseWinding )\n    {\n      dx = -dx;\n      dy = -dy;\n    }\n\n    *x = *y = 0;\n\n    if ( !glyphpath->darken )\n        return;\n\n    /* add momentum for this path element */\n    glyphpath->callbacks->windingMomentum +=\n      cf2_getWindingMomentum( x1, y1, x2, y2 );\n\n    /* note: allow mixed integer and fixed multiplication here */\n    if ( dx >= 0 )\n    {\n      if ( dy >= 0 )\n      {\n        /* first quadrant, +x +y */\n\n        if ( dx > 2 * dy )\n        {\n          /* +x */\n          *x = 0;\n          *y = 0;\n        }\n        else if ( dy > 2 * dx )\n        {\n          /* +y */\n          *x = glyphpath->xOffset;\n          *y = glyphpath->yOffset;\n        }\n        else\n        {\n          /* +x +y */\n          *x = FT_MulFix( cf2_floatToFixed( 0.7 ),\n                          glyphpath->xOffset );\n          *y = FT_MulFix( cf2_floatToFixed( 1.0 - 0.7 ),\n                          glyphpath->yOffset );\n        }\n      }\n      else\n      {\n        /* fourth quadrant, +x -y */\n\n        if ( dx > -2 * dy )\n        {\n          /* +x */\n          *x = 0;\n          *y = 0;\n        }\n        else if ( -dy > 2 * dx )\n        {\n          /* -y */\n          *x = -glyphpath->xOffset;\n          *y = glyphpath->yOffset;\n        }\n        else\n        {\n          /* +x -y */\n          *x = FT_MulFix( cf2_floatToFixed( -0.7 ),\n                          glyphpath->xOffset );\n          *y = FT_MulFix( cf2_floatToFixed( 1.0 - 0.7 ),\n                          glyphpath->yOffset );\n        }\n      }\n    }\n    else\n    {\n      if ( dy >= 0 )\n      {\n        /* second quadrant, -x +y */\n\n        if ( -dx > 2 * dy )\n        {\n          /* -x */\n          *x = 0;\n          *y = 2 * glyphpath->yOffset;\n        }\n        else if ( dy > -2 * dx )\n        {\n          /* +y */\n          *x = glyphpath->xOffset;\n          *y = glyphpath->yOffset;\n        }\n        else\n        {\n          /* -x +y */\n          *x = FT_MulFix( cf2_floatToFixed( 0.7 ),\n                          glyphpath->xOffset );\n          *y = FT_MulFix( cf2_floatToFixed( 1.0 + 0.7 ),\n                          glyphpath->yOffset );\n        }\n      }\n      else\n      {\n        /* third quadrant, -x -y */\n\n        if ( -dx > -2 * dy )\n        {\n          /* -x */\n          *x = 0;\n          *y = 2 * glyphpath->yOffset;\n        }\n        else if ( -dy > -2 * dx )\n        {\n          /* -y */\n          *x = -glyphpath->xOffset;\n          *y = glyphpath->xOffset;\n        }\n        else\n        {\n          /* -x -y */\n          *x = FT_MulFix( cf2_floatToFixed( -0.7 ),\n                          glyphpath->xOffset );\n          *y = FT_MulFix( cf2_floatToFixed( 1.0 + 0.7 ),\n                          glyphpath->yOffset );\n        }\n      }\n    }\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_glyphpath_moveTo( CF2_GlyphPath  glyphpath,\n                        CF2_Fixed      x,\n                        CF2_Fixed      y )\n  {\n    cf2_glyphpath_closeOpenPath( glyphpath );\n\n    /* save the parameters of the move for later, when we'll know how to */\n    /* offset it;                                                        */\n    /* also save last move point */\n    glyphpath->currentCS.x = glyphpath->start.x = x;\n    glyphpath->currentCS.y = glyphpath->start.y = y;\n\n    glyphpath->moveIsPending = TRUE;\n\n    /* ensure we have a valid map with current mask */\n    if ( !cf2_hintmap_isValid( &glyphpath->hintMap ) ||\n         cf2_hintmask_isNew( glyphpath->hintMask )   )\n      cf2_hintmap_build( &glyphpath->hintMap,\n                         glyphpath->hStemHintArray,\n                         glyphpath->vStemHintArray,\n                         glyphpath->hintMask,\n                         glyphpath->hintOriginY,\n                         FALSE );\n\n    /* save a copy of current HintMap to use when drawing initial point */\n    glyphpath->firstHintMap = glyphpath->hintMap;     /* structure copy */\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_glyphpath_lineTo( CF2_GlyphPath  glyphpath,\n                        CF2_Fixed      x,\n                        CF2_Fixed      y )\n  {\n    CF2_Fixed  xOffset, yOffset;\n    FT_Vector  P0, P1;\n\n\n    /* can't compute offset of zero length line, so ignore them */\n    if ( glyphpath->currentCS.x == x && glyphpath->currentCS.y == y )\n      return;\n\n    cf2_glyphpath_computeOffset( glyphpath,\n                                 glyphpath->currentCS.x,\n                                 glyphpath->currentCS.y,\n                                 x,\n                                 y,\n                                 &xOffset,\n                                 &yOffset );\n\n    /* construct offset points */\n    P0.x = glyphpath->currentCS.x + xOffset;\n    P0.y = glyphpath->currentCS.y + yOffset;\n    P1.x = x + xOffset;\n    P1.y = y + yOffset;\n\n    if ( glyphpath->moveIsPending )\n    {\n      /* emit offset 1st point as MoveTo */\n      cf2_glyphpath_pushMove( glyphpath, P0 );\n\t  if (glyphpath->callbacks && glyphpath->callbacks->error && *glyphpath->callbacks->error) return;\n\n      glyphpath->moveIsPending = FALSE;  /* adjust state machine */\n      glyphpath->pathIsOpen    = TRUE;\n\n      glyphpath->offsetStart1 = P1;              /* record second point */\n    }\n\n    if ( glyphpath->elemIsQueued )\n    {\n      FT_ASSERT( cf2_hintmap_isValid( &glyphpath->hintMap ) );\n\n      cf2_glyphpath_pushPrevElem( glyphpath,\n                                  &glyphpath->hintMap,\n                                  &P0,\n                                  P1,\n                                  FALSE );\n\t  if (glyphpath->callbacks && glyphpath->callbacks->error && *glyphpath->callbacks->error) return;\n    }\n\n    /* queue the current element with offset points */\n    glyphpath->elemIsQueued = TRUE;\n    glyphpath->prevElemOp   = CF2_PathOpLineTo;\n    glyphpath->prevElemP0   = P0;\n    glyphpath->prevElemP1   = P1;\n\n    /* update current map */\n    if ( cf2_hintmask_isNew( glyphpath->hintMask ) )\n      cf2_hintmap_build( &glyphpath->hintMap,\n                         glyphpath->hStemHintArray,\n                         glyphpath->vStemHintArray,\n                         glyphpath->hintMask,\n                         glyphpath->hintOriginY,\n                         FALSE );\n\n    glyphpath->currentCS.x = x;     /* pre-offset current point */\n    glyphpath->currentCS.y = y;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_glyphpath_curveTo( CF2_GlyphPath  glyphpath,\n                         CF2_Fixed      x1,\n                         CF2_Fixed      y1,\n                         CF2_Fixed      x2,\n                         CF2_Fixed      y2,\n                         CF2_Fixed      x3,\n                         CF2_Fixed      y3 )\n  {\n    CF2_Fixed  xOffset1, yOffset1, xOffset3, yOffset3;\n    FT_Vector  P0, P1, P2, P3;\n\n\n    /* TODO: ignore zero length portions of curve?? */\n    cf2_glyphpath_computeOffset( glyphpath,\n                                 glyphpath->currentCS.x,\n                                 glyphpath->currentCS.y,\n                                 x1,\n                                 y1,\n                                 &xOffset1,\n                                 &yOffset1 );\n    cf2_glyphpath_computeOffset( glyphpath,\n                                 x2,\n                                 y2,\n                                 x3,\n                                 y3,\n                                 &xOffset3,\n                                 &yOffset3 );\n\n    /* add momentum from the middle segment */\n    glyphpath->callbacks->windingMomentum +=\n      cf2_getWindingMomentum( x1, y1, x2, y2 );\n\n    /* construct offset points */\n    P0.x = glyphpath->currentCS.x + xOffset1;\n    P0.y = glyphpath->currentCS.y + yOffset1;\n    P1.x = x1 + xOffset1;\n    P1.y = y1 + yOffset1;\n    /* note: preserve angle of final segment by using offset3 at both ends */\n    P2.x = x2 + xOffset3;\n    P2.y = y2 + yOffset3;\n    P3.x = x3 + xOffset3;\n    P3.y = y3 + yOffset3;\n\n    if ( glyphpath->moveIsPending )\n    {\n      /* emit offset 1st point as MoveTo */\n      cf2_glyphpath_pushMove( glyphpath, P0 );\n\t  if (glyphpath->callbacks && glyphpath->callbacks->error && *glyphpath->callbacks->error) return;\n\n      glyphpath->moveIsPending = FALSE;\n      glyphpath->pathIsOpen    = TRUE;\n\n      glyphpath->offsetStart1 = P1;              /* record second point */\n    }\n\n    if ( glyphpath->elemIsQueued )\n    {\n      FT_ASSERT( cf2_hintmap_isValid( &glyphpath->hintMap ) );\n\n      cf2_glyphpath_pushPrevElem( glyphpath,\n                                  &glyphpath->hintMap,\n                                  &P0,\n                                  P1,\n                                  FALSE );\n\t  if (glyphpath->callbacks && glyphpath->callbacks->error && *glyphpath->callbacks->error) return;\n    }\n\n    /* queue the current element with offset points */\n    glyphpath->elemIsQueued = TRUE;\n    glyphpath->prevElemOp   = CF2_PathOpCubeTo;\n    glyphpath->prevElemP0   = P0;\n    glyphpath->prevElemP1   = P1;\n    glyphpath->prevElemP2   = P2;\n    glyphpath->prevElemP3   = P3;\n\n    /* update current map */\n    if ( cf2_hintmask_isNew( glyphpath->hintMask ) )\n      cf2_hintmap_build( &glyphpath->hintMap,\n                         glyphpath->hStemHintArray,\n                         glyphpath->vStemHintArray,\n                         glyphpath->hintMask,\n                         glyphpath->hintOriginY,\n                         FALSE );\n\n    glyphpath->currentCS.x = x3;       /* pre-offset current point */\n    glyphpath->currentCS.y = y3;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_glyphpath_closeOpenPath( CF2_GlyphPath  glyphpath )\n  {\n    if ( glyphpath->pathIsOpen )\n    {\n      FT_ASSERT( cf2_hintmap_isValid( &glyphpath->firstHintMap ) );\n\n      /* since we need to apply an offset to the implicit lineto, we make */\n      /* it explicit here                                                 */\n      cf2_glyphpath_lineTo( glyphpath,\n                            glyphpath->start.x,\n                            glyphpath->start.y );\n\t  if (glyphpath->callbacks && glyphpath->callbacks->error && *glyphpath->callbacks->error) return;\n\n      /* Draw previous element (the explicit LineTo we just created,      */\n      /* above) and connect it to the start point, but with the offset we */\n      /* saved from the first element.                                    */\n      /* Use the saved HintMap, too. */\n      FT_ASSERT( glyphpath->elemIsQueued );\n\n      cf2_glyphpath_pushPrevElem( glyphpath,\n                                  &glyphpath->firstHintMap,\n                                  &glyphpath->offsetStart0,\n                                  glyphpath->offsetStart1,\n                                  TRUE );\n\n      /* reset state machine */\n      glyphpath->moveIsPending = TRUE;\n      glyphpath->pathIsOpen    = FALSE;\n      glyphpath->elemIsQueued  = FALSE;\n    }\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2hints.h                                                             */\n/*                                                                         */\n/*    Adobe's code for handling CFF hints (body).                          */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CF2HINTS_H__\n#define __CF2HINTS_H__\n\n\nFT_BEGIN_HEADER\n\n\n  enum\n  {\n    CF2_MAX_HINTS = 96    /* maximum # of hints */\n  };\n\n\n  /*\n   * A HintMask object stores a bit mask that specifies which hints in the\n   * charstring are active at a given time.  Hints in CFF must be declared\n   * at the start, before any drawing operators, with horizontal hints\n   * preceding vertical hints.  The HintMask is ordered the same way, with\n   * horizontal hints immediately followed by vertical hints.  Clients are\n   * responsible for knowing how many of each type are present.\n   *\n   * The maximum total number of hints is 96, as specified by the CFF\n   * specification.\n   *\n   * A HintMask is built 0 or more times while interpreting a charstring, by\n   * the HintMask operator.  There is only one HintMask, but it is built or\n   * rebuilt each time there is a hint substitution (HintMask operator) in\n   * the charstring.  A default HintMask with all bits set is built if there\n   * has been no HintMask operator prior to the first drawing operator.\n   *\n   */\n\n  typedef struct  CF2_HintMaskRec_\n  {\n    FT_Error*  error;\n\n    FT_Bool  isValid;\n    FT_Bool  isNew;\n\n    size_t  bitCount;\n    size_t  byteCount;\n\n    FT_Byte  mask[( CF2_MAX_HINTS + 7 ) / 8];\n\n  } CF2_HintMaskRec, *CF2_HintMask;\n\n\n  typedef struct  CF2_StemHintRec_\n  {\n    FT_Bool  used;     /* DS positions are valid         */\n\n    CF2_Fixed  min;    /* original character space value */\n    CF2_Fixed  max;\n\n    CF2_Fixed  minDS;  /* DS position after first use    */\n    CF2_Fixed  maxDS;\n\n  } CF2_StemHintRec, *CF2_StemHint;\n\n\n  /*\n   * A HintMap object stores a piecewise linear function for mapping\n   * y-coordinates from character space to device space, providing\n   * appropriate pixel alignment to stem edges.\n   *\n   * The map is implemented as an array of `CF2_Hint' elements, each\n   * representing an edge.  When edges are paired, as from stem hints, the\n   * bottom edge must immediately precede the top edge in the array.\n   * Element character space AND device space positions must both increase\n   * monotonically in the array.  `CF2_Hint' elements are also used as\n   * parameters to `cf2_blues_capture'.\n   *\n   * The `cf2_hintmap_build' method must be called before any drawing\n   * operation (beginning with a Move operator) and at each hint\n   * substitution (HintMask operator).\n   *\n   * The `cf2_hintmap_map' method is called to transform y-coordinates at\n   * each drawing operation (move, line, curve).\n   *\n   */\n\n  /* TODO: make this a CF2_ArrStack and add a deep copy method */\n  enum\n  {\n    CF2_MAX_HINT_EDGES = CF2_MAX_HINTS * 2\n  };\n\n\n  typedef struct  CF2_HintMapRec_\n  {\n    CF2_Font  font;\n\n    /* initial map based on blue zones */\n    struct CF2_HintMapRec_*  initialHintMap;\n\n    /* working storage for 2nd pass adjustHints */\n    CF2_ArrStack  hintMoves;\n\n    FT_Bool  isValid;\n    FT_Bool  hinted;\n\n    CF2_Fixed  scale;\n    CF2_UInt   count;\n\n    /* start search from this index */\n    CF2_UInt  lastIndex;\n\n    CF2_HintRec  edge[CF2_MAX_HINT_EDGES]; /* 192 */\n\n  } CF2_HintMapRec, *CF2_HintMap;\n\n\n  FT_LOCAL( FT_Bool )\n  cf2_hint_isValid( const CF2_Hint  hint );\n  FT_LOCAL( FT_Bool )\n  cf2_hint_isTop( const CF2_Hint  hint );\n  FT_LOCAL( FT_Bool )\n  cf2_hint_isBottom( const CF2_Hint  hint );\n  FT_LOCAL( void )\n  cf2_hint_lock( CF2_Hint  hint );\n\n\n  FT_LOCAL( void )\n  cf2_hintmap_init( CF2_HintMap   hintmap,\n                    CF2_Font      font,\n                    CF2_HintMap   initialMap,\n                    CF2_ArrStack  hintMoves,\n                    CF2_Fixed     scale );\n  FT_LOCAL( void )\n  cf2_hintmap_build( CF2_HintMap   hintmap,\n                     CF2_ArrStack  hStemHintArray,\n                     CF2_ArrStack  vStemHintArray,\n                     CF2_HintMask  hintMask,\n                     CF2_Fixed     hintOrigin,\n                     FT_Bool       initialMap );\n\n\n  /*\n   * GlyphPath is a wrapper for drawing operations that scales the\n   * coordinates according to the render matrix and HintMap.  It also tracks\n   * open paths to control ClosePath and to insert MoveTo for broken fonts.\n   *\n   */\n  typedef struct  CF2_GlyphPathRec_\n  {\n    /* TODO: gather some of these into a hinting context */\n\n    CF2_Font              font;           /* font instance    */\n    CF2_OutlineCallbacks  callbacks;      /* outline consumer */\n\n\n    CF2_HintMapRec  hintMap;        /* current hint map            */\n    CF2_HintMapRec  firstHintMap;   /* saved copy                  */\n    CF2_HintMapRec  initialHintMap; /* based on all captured hints */\n\n    CF2_ArrStackRec  hintMoves;  /* list of hint moves for 2nd pass */\n\n    CF2_Fixed  scaleX;         /* matrix a */\n    CF2_Fixed  scaleC;         /* matrix c */\n    CF2_Fixed  scaleY;         /* matrix d */\n\n    FT_Vector  fractionalTranslation;  /* including deviceXScale */\n#if 0\n    CF2_Fixed  hShift;    /* character space horizontal shift */\n                          /* (for fauxing)                    */\n#endif\n\n    FT_Bool  pathIsOpen;     /* true after MoveTo                     */\n    FT_Bool  darken;         /* true if stem darkening                */\n    FT_Bool  moveIsPending;  /* true between MoveTo and offset MoveTo */\n\n    /* references used to call `cf2_hintmap_build', if necessary */\n    CF2_ArrStack         hStemHintArray;\n    CF2_ArrStack         vStemHintArray;\n    CF2_HintMask         hintMask;     /* ptr to the current mask */\n    CF2_Fixed            hintOriginY;  /* copy of current origin  */\n    const CF2_BluesRec*  blues;\n\n    CF2_Fixed  xOffset;        /* character space offsets */\n    CF2_Fixed  yOffset;\n\n    /* character space miter limit threshold */\n    CF2_Fixed  miterLimit;\n    /* vertical/horzizontal snap distance in character space */\n    CF2_Fixed  snapThreshold;\n\n    FT_Vector  offsetStart0;  /* first and second points of first */\n    FT_Vector  offsetStart1;  /* element with offset applied      */\n\n    /* current point, character space, before offset */\n    FT_Vector  currentCS;\n    /* current point, device space */\n    FT_Vector  currentDS;\n    FT_Vector  start;         /* start point of subpath */\n\n    /* the following members constitute the `queue' of one element */\n    FT_Bool  elemIsQueued;\n    CF2_Int  prevElemOp;\n\n    FT_Vector  prevElemP0;\n    FT_Vector  prevElemP1;\n    FT_Vector  prevElemP2;\n    FT_Vector  prevElemP3;\n\n  } CF2_GlyphPathRec, *CF2_GlyphPath;\n\n\n  FT_LOCAL( void )\n  cf2_glyphpath_init( CF2_GlyphPath         glyphpath,\n                      CF2_Font              font,\n                      CF2_OutlineCallbacks  callbacks,\n                      CF2_Fixed             scaleY,\n                      /* CF2_Fixed hShift, */\n                      CF2_ArrStack          hStemHintArray,\n                      CF2_ArrStack          vStemHintArray,\n                      CF2_HintMask          hintMask,\n                      CF2_Fixed             hintOrigin,\n                      const CF2_Blues       blues,\n                      const FT_Vector*      fractionalTranslation );\n  FT_LOCAL( void )\n  cf2_glyphpath_finalize( CF2_GlyphPath  glyphpath );\n\n  FT_LOCAL( void )\n  cf2_glyphpath_moveTo( CF2_GlyphPath  glyphpath,\n                        CF2_Fixed      x,\n                        CF2_Fixed      y );\n  FT_LOCAL( void )\n  cf2_glyphpath_lineTo( CF2_GlyphPath  glyphpath,\n                        CF2_Fixed      x,\n                        CF2_Fixed      y );\n  FT_LOCAL( void )\n  cf2_glyphpath_curveTo( CF2_GlyphPath  glyphpath,\n                         CF2_Fixed      x1,\n                         CF2_Fixed      y1,\n                         CF2_Fixed      x2,\n                         CF2_Fixed      y2,\n                         CF2_Fixed      x3,\n                         CF2_Fixed      y3 );\n  FT_LOCAL( void )\n  cf2_glyphpath_closeOpenPath( CF2_GlyphPath  glyphpath );\n\n\nFT_END_HEADER\n\n\n#endif /* __CF2HINTS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2intrp.c                                                             */\n/*                                                                         */\n/*    Adobe's CFF Interpreter (body).                                      */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"cf2ft.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n\n#include \"cf2glue.h\"\n#include \"cf2font.h\"\n#include \"cf2stack.h\"\n#include \"cf2hints.h\"\n\n#include \"cf2error.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cf2interp\n\n\n  /* some operators are not implemented yet */\n#define CF2_FIXME  FT_TRACE4(( \"cf2_interpT2CharString:\"            \\\n                               \" operator not implemented yet\\n\" ))\n\n\n\n  FT_LOCAL_DEF( void )\n  cf2_hintmask_init( CF2_HintMask  hintmask,\n                     FT_Error*     error )\n  {\n    FT_ZERO( hintmask );\n\n    hintmask->error = error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Bool )\n  cf2_hintmask_isValid( const CF2_HintMask  hintmask )\n  {\n    return hintmask->isValid;\n  }\n\n\n  FT_LOCAL_DEF( FT_Bool )\n  cf2_hintmask_isNew( const CF2_HintMask  hintmask )\n  {\n    return hintmask->isNew;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_hintmask_setNew( CF2_HintMask  hintmask,\n                       FT_Bool       val )\n  {\n    hintmask->isNew = val;\n  }\n\n\n  /* clients call `getMaskPtr' in order to iterate */\n  /* through hint mask                             */\n\n  FT_LOCAL_DEF( FT_Byte* )\n  cf2_hintmask_getMaskPtr( CF2_HintMask  hintmask )\n  {\n    return hintmask->mask;\n  }\n\n\n  static size_t\n  cf2_hintmask_setCounts( CF2_HintMask  hintmask,\n                          size_t        bitCount )\n  {\n    if ( bitCount > CF2_MAX_HINTS )\n    {\n      /* total of h and v stems must be <= 96 */\n      CF2_SET_ERROR( hintmask->error, Invalid_Glyph_Format );\n      return 0;\n    }\n\n    hintmask->bitCount  = bitCount;\n    hintmask->byteCount = ( hintmask->bitCount + 7 ) / 8;\n\n    hintmask->isValid = TRUE;\n    hintmask->isNew   = TRUE;\n\n    return bitCount;\n  }\n\n\n  /* consume the hintmask bytes from the charstring, advancing the src */\n  /* pointer                                                           */\n  static void\n  cf2_hintmask_read( CF2_HintMask  hintmask,\n                     CF2_Buffer    charstring,\n                     size_t        bitCount )\n  {\n    size_t  i;\n\n#ifndef CF2_NDEBUG\n    /* these are the bits in the final mask byte that should be zero  */\n    /* Note: this variable is only used in an assert expression below */\n    /* and then only if CF2_NDEBUG is not defined                     */\n    CF2_UInt  mask = ( 1 << ( -(CF2_Int)bitCount & 7 ) ) - 1;\n#endif\n\n\n    /* initialize counts and isValid */\n    if ( cf2_hintmask_setCounts( hintmask, bitCount ) == 0 )\n      return;\n\n    FT_ASSERT( hintmask->byteCount > 0 );\n\n    FT_TRACE4(( \" (maskbytes:\" ));\n\n    /* set mask and advance interpreter's charstring pointer */\n    for ( i = 0; i < hintmask->byteCount; i++ )\n    {\n      hintmask->mask[i] = (FT_Byte)cf2_buf_readByte( charstring );\n      FT_TRACE4(( \" 0x%02X\", hintmask->mask[i] ));\n    }\n\n    FT_TRACE4(( \")\\n\" ));\n\n    /* assert any unused bits in last byte are zero unless there's a prior */\n    /* error                                                               */\n    /* bitCount -> mask, 0 -> 0, 1 -> 7f, 2 -> 3f, ... 6 -> 3, 7 -> 1      */\n#ifndef CF2_NDEBUG\n    FT_ASSERT( ( hintmask->mask[hintmask->byteCount - 1] & mask ) == 0 ||\n               *hintmask->error                                        );\n#endif\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_hintmask_setAll( CF2_HintMask  hintmask,\n                       size_t        bitCount )\n  {\n    size_t    i;\n    CF2_UInt  mask = ( 1 << ( -(CF2_Int)bitCount & 7 ) ) - 1;\n\n\n    /* initialize counts and isValid */\n    if ( cf2_hintmask_setCounts( hintmask, bitCount ) == 0 )\n      return;\n\n    FT_ASSERT( hintmask->byteCount > 0 );\n    FT_ASSERT( hintmask->byteCount <\n                 sizeof ( hintmask->mask ) / sizeof ( hintmask->mask[0] ) );\n\n    /* set mask to all ones */\n    for ( i = 0; i < hintmask->byteCount; i++ )\n      hintmask->mask[i] = 0xFF;\n\n    /* clear unused bits                                              */\n    /* bitCount -> mask, 0 -> 0, 1 -> 7f, 2 -> 3f, ... 6 -> 3, 7 -> 1 */\n    hintmask->mask[hintmask->byteCount - 1] &= ~mask;\n  }\n\n\n  /* Type2 charstring opcodes */\n  enum\n  {\n    cf2_cmdRESERVED_0,   /* 0 */\n    cf2_cmdHSTEM,        /* 1 */\n    cf2_cmdRESERVED_2,   /* 2 */\n    cf2_cmdVSTEM,        /* 3 */\n    cf2_cmdVMOVETO,      /* 4 */\n    cf2_cmdRLINETO,      /* 5 */\n    cf2_cmdHLINETO,      /* 6 */\n    cf2_cmdVLINETO,      /* 7 */\n    cf2_cmdRRCURVETO,    /* 8 */\n    cf2_cmdRESERVED_9,   /* 9 */\n    cf2_cmdCALLSUBR,     /* 10 */\n    cf2_cmdRETURN,       /* 11 */\n    cf2_cmdESC,          /* 12 */\n    cf2_cmdRESERVED_13,  /* 13 */\n    cf2_cmdENDCHAR,      /* 14 */\n    cf2_cmdRESERVED_15,  /* 15 */\n    cf2_cmdRESERVED_16,  /* 16 */\n    cf2_cmdRESERVED_17,  /* 17 */\n    cf2_cmdHSTEMHM,      /* 18 */\n    cf2_cmdHINTMASK,     /* 19 */\n    cf2_cmdCNTRMASK,     /* 20 */\n    cf2_cmdRMOVETO,      /* 21 */\n    cf2_cmdHMOVETO,      /* 22 */\n    cf2_cmdVSTEMHM,      /* 23 */\n    cf2_cmdRCURVELINE,   /* 24 */\n    cf2_cmdRLINECURVE,   /* 25 */\n    cf2_cmdVVCURVETO,    /* 26 */\n    cf2_cmdHHCURVETO,    /* 27 */\n    cf2_cmdEXTENDEDNMBR, /* 28 */\n    cf2_cmdCALLGSUBR,    /* 29 */\n    cf2_cmdVHCURVETO,    /* 30 */\n    cf2_cmdHVCURVETO     /* 31 */\n  };\n\n  enum\n  {\n    cf2_escDOTSECTION,   /* 0 */\n    cf2_escRESERVED_1,   /* 1 */\n    cf2_escRESERVED_2,   /* 2 */\n    cf2_escAND,          /* 3 */\n    cf2_escOR,           /* 4 */\n    cf2_escNOT,          /* 5 */\n    cf2_escRESERVED_6,   /* 6 */\n    cf2_escRESERVED_7,   /* 7 */\n    cf2_escRESERVED_8,   /* 8 */\n    cf2_escABS,          /* 9 */\n    cf2_escADD,          /* 10     like otherADD */\n    cf2_escSUB,          /* 11     like otherSUB */\n    cf2_escDIV,          /* 12 */\n    cf2_escRESERVED_13,  /* 13 */\n    cf2_escNEG,          /* 14 */\n    cf2_escEQ,           /* 15 */\n    cf2_escRESERVED_16,  /* 16 */\n    cf2_escRESERVED_17,  /* 17 */\n    cf2_escDROP,         /* 18 */\n    cf2_escRESERVED_19,  /* 19 */\n    cf2_escPUT,          /* 20     like otherPUT    */\n    cf2_escGET,          /* 21     like otherGET    */\n    cf2_escIFELSE,       /* 22     like otherIFELSE */\n    cf2_escRANDOM,       /* 23     like otherRANDOM */\n    cf2_escMUL,          /* 24     like otherMUL    */\n    cf2_escRESERVED_25,  /* 25 */\n    cf2_escSQRT,         /* 26 */\n    cf2_escDUP,          /* 27     like otherDUP    */\n    cf2_escEXCH,         /* 28     like otherEXCH   */\n    cf2_escINDEX,        /* 29 */\n    cf2_escROLL,         /* 30 */\n    cf2_escRESERVED_31,  /* 31 */\n    cf2_escRESERVED_32,  /* 32 */\n    cf2_escRESERVED_33,  /* 33 */\n    cf2_escHFLEX,        /* 34 */\n    cf2_escFLEX,         /* 35 */\n    cf2_escHFLEX1,       /* 36 */\n    cf2_escFLEX1         /* 37 */\n  };\n\n\n  /* `stemHintArray' does not change once we start drawing the outline. */\n  static void\n  cf2_doStems( const CF2_Font  font,\n               CF2_Stack       opStack,\n               CF2_ArrStack    stemHintArray,\n               CF2_Fixed*      width,\n               FT_Bool*        haveWidth,\n               CF2_Fixed       hintOffset )\n  {\n    CF2_UInt  i;\n    CF2_UInt  count       = cf2_stack_count( opStack );\n    FT_Bool   hasWidthArg = (FT_Bool)( count & 1 );\n\n    /* variable accumulates delta values from operand stack */\n    CF2_Fixed  position = hintOffset;\n\n    if ( hasWidthArg && ! *haveWidth )\n      *width = cf2_stack_getReal( opStack, 0 ) +\n                 cf2_getNominalWidthX( font->decoder );\n\n    if ( font->decoder->width_only )\n      goto exit;\n\n    for ( i = hasWidthArg ? 1 : 0; i < count; i += 2 )\n    {\n      /* construct a CF2_StemHint and push it onto the list */\n      CF2_StemHintRec  stemhint;\n\n\n      stemhint.min  =\n        position   += cf2_stack_getReal( opStack, i );\n      stemhint.max  =\n        position   += cf2_stack_getReal( opStack, i + 1 );\n\n      stemhint.used  = FALSE;\n      stemhint.maxDS =\n      stemhint.minDS = 0;\n\n      cf2_arrstack_push( stemHintArray, &stemhint ); /* defer error check */\n    }\n\n    cf2_stack_clear( opStack );\n\n  exit:\n    /* cf2_doStems must define a width (may be default) */\n    *haveWidth = TRUE;\n  }\n\n\n  static void\n  cf2_doFlex( CF2_Stack       opStack,\n              CF2_Fixed*      curX,\n              CF2_Fixed*      curY,\n              CF2_GlyphPath   glyphPath,\n              const FT_Bool*  readFromStack,\n              FT_Bool         doConditionalLastRead )\n  {\n    CF2_Fixed  vals[14];\n    CF2_UInt   index;\n    FT_Bool    isHFlex;\n    CF2_Int    top, i, j;\n\n\n    vals[0] = *curX;\n    vals[1] = *curY;\n    index   = 0;\n    isHFlex = readFromStack[9] == FALSE;\n    top     = isHFlex ? 9 : 10;\n\n    for ( i = 0; i < top; i++ )\n    {\n      vals[i + 2] = vals[i];\n      if ( readFromStack[i] )\n        vals[i + 2] += cf2_stack_getReal( opStack, index++ );\n    }\n\n    if ( isHFlex )\n      vals[9 + 2] = *curY;\n\n    if ( doConditionalLastRead )\n    {\n      FT_Bool    lastIsX = (FT_Bool)( cf2_fixedAbs( vals[10] - *curX ) >\n                                        cf2_fixedAbs( vals[11] - *curY ) );\n      CF2_Fixed  lastVal = cf2_stack_getReal( opStack, index );\n\n\n      if ( lastIsX )\n      {\n        vals[12] = vals[10] + lastVal;\n        vals[13] = *curY;\n      }\n      else\n      {\n        vals[12] = *curX;\n        vals[13] = vals[11] + lastVal;\n      }\n    }\n    else\n    {\n      if ( readFromStack[10] )\n        vals[12] = vals[10] + cf2_stack_getReal( opStack, index++ );\n      else\n        vals[12] = *curX;\n\n      if ( readFromStack[11] )\n        vals[13] = vals[11] + cf2_stack_getReal( opStack, index );\n      else\n        vals[13] = *curY;\n    }\n\n    for ( j = 0; j < 2; j++ )\n      cf2_glyphpath_curveTo( glyphPath, vals[j * 6 + 2],\n                                        vals[j * 6 + 3],\n                                        vals[j * 6 + 4],\n                                        vals[j * 6 + 5],\n                                        vals[j * 6 + 6],\n                                        vals[j * 6 + 7] );\n\n    cf2_stack_clear( opStack );\n\n    *curX = vals[12];\n    *curY = vals[13];\n  }\n\n\n  /*\n   * `error' is a shared error code used by many objects in this\n   * routine.  Before the code continues from an error, it must check and\n   * record the error in `*error'.  The idea is that this shared\n   * error code will record the first error encountered.  If testing\n   * for an error anyway, the cost of `goto exit' is small, so we do it,\n   * even if continuing would be safe.  In this case, `lastError' is\n   * set, so the testing and storing can be done in one place, at `exit'.\n   *\n   * Continuing after an error is intended for objects which do their own\n   * testing of `*error', e.g., array stack functions.  This allows us to\n   * avoid an extra test after the call.\n   *\n   * Unimplemented opcodes are ignored.\n   *\n   */\n  FT_LOCAL_DEF( void )\n  cf2_interpT2CharString( CF2_Font              font,\n                          CF2_Buffer            buf,\n                          CF2_OutlineCallbacks  callbacks,\n                          const FT_Vector*      translation,\n                          FT_Bool               doingSeac,\n                          CF2_Fixed             curX,\n                          CF2_Fixed             curY,\n                          CF2_Fixed*            width )\n  {\n    /* lastError is used for errors that are immediately tested */\n    FT_Error  lastError = FT_Err_Ok;\n\n    /* pointer to parsed font object */\n    CFF_Decoder*  decoder = font->decoder;\n\n    FT_Error*  error  = &font->error;\n    FT_Memory  memory = font->memory;\n\n    CF2_Fixed  scaleY        = font->innerTransform.d;\n    CF2_Fixed  nominalWidthX = cf2_getNominalWidthX( decoder );\n\n    /* save this for hinting seac accents */\n    CF2_Fixed  hintOriginY = curY;\n\n    CF2_Stack  opStack = NULL;\n    FT_Byte    op1;                       /* first opcode byte */\n\n    /* instruction limit; 20,000,000 matches Avalon */\n    FT_UInt32  instructionLimit = 20000000UL;\n\n    CF2_ArrStackRec  subrStack;\n\n    FT_Bool     haveWidth;\n    CF2_Buffer  charstring = NULL;\n\n    CF2_Int  charstringIndex = -1;       /* initialize to empty */\n\n    /* TODO: placeholders for hint structures */\n\n    /* objects used for hinting */\n    CF2_ArrStackRec  hStemHintArray;\n    CF2_ArrStackRec  vStemHintArray;\n\n    CF2_HintMaskRec   hintMask;\n    CF2_GlyphPathRec  glyphPath;\n\n    /* initialize the remaining objects */\n    cf2_arrstack_init( &subrStack,\n                       memory,\n                       error,\n                       sizeof ( CF2_BufferRec ) );\n    cf2_arrstack_init( &hStemHintArray,\n                       memory,\n                       error,\n                       sizeof ( CF2_StemHintRec ) );\n    cf2_arrstack_init( &vStemHintArray,\n                       memory,\n                       error,\n                       sizeof ( CF2_StemHintRec ) );\n\n    /* initialize CF2_StemHint arrays */\n    cf2_hintmask_init( &hintMask, error );\n\n    /* initialize path map to manage drawing operations */\n\n    /* Note: last 4 params are used to handle `MoveToPermissive', which */\n    /*       may need to call `hintMap.Build'                           */\n    /* TODO: MoveToPermissive is gone; are these still needed?          */\n    cf2_glyphpath_init( &glyphPath,\n                        font,\n                        callbacks,\n                        scaleY,\n                        /* hShift, */\n                        &hStemHintArray,\n                        &vStemHintArray,\n                        &hintMask,\n                        hintOriginY,\n                        &font->blues,\n                        translation );\n\n    /*\n     * Initialize state for width parsing.  From the CFF Spec:\n     *\n     *   The first stack-clearing operator, which must be one of hstem,\n     *   hstemhm, vstem, vstemhm, cntrmask, hintmask, hmoveto, vmoveto,\n     *   rmoveto, or endchar, takes an additional argument - the width (as\n     *   described earlier), which may be expressed as zero or one numeric\n     *   argument.\n     *\n     * What we implement here uses the first validly specified width, but\n     * does not detect errors for specifying more than one width.\n     *\n     * If one of the above operators occurs without explicitly specifying\n     * a width, we assume the default width.\n     *\n     */\n    haveWidth = FALSE;\n    *width    = cf2_getDefaultWidthX( decoder );\n\n    /*\n     * Note: at this point, all pointers to resources must be NULL\n     * and all local objects must be initialized.\n     * There must be no branches to exit: above this point.\n     *\n     */\n\n    /* allocate an operand stack */\n    opStack = cf2_stack_init( memory, error );\n    if ( !opStack )\n    {\n      lastError = FT_THROW( Out_Of_Memory );\n      goto exit;\n    }\n\n    /* initialize subroutine stack by placing top level charstring as */\n    /* first element (max depth plus one for the charstring)          */\n    /* Note: Caller owns and must finalize the first charstring.      */\n    /*       Our copy of it does not change that requirement.         */\n    cf2_arrstack_setCount( &subrStack, CF2_MAX_SUBR + 1 );\n\n    charstring  = (CF2_Buffer)cf2_arrstack_getBuffer( &subrStack );\n    *charstring = *buf;    /* structure copy */\n\n    charstringIndex = 0;       /* entry is valid now */\n\n    /* catch errors so far */\n    if ( *error )\n      goto exit;\n\n    /* main interpreter loop */\n    while ( 1 )\n    {\n      if ( cf2_buf_isEnd( charstring ) )\n      {\n        /* If we've reached the end of the charstring, simulate a */\n        /* cf2_cmdRETURN or cf2_cmdENDCHAR.                       */\n        if ( charstringIndex )\n          op1 = cf2_cmdRETURN;  /* end of buffer for subroutine */\n        else\n          op1 = cf2_cmdENDCHAR; /* end of buffer for top level charstring */\n      }\n      else\n        op1 = (FT_Byte)cf2_buf_readByte( charstring );\n\n      /* check for errors once per loop */\n      if ( *error )\n        goto exit;\n\n      instructionLimit--;\n      if ( instructionLimit == 0 )\n      {\n        lastError = FT_THROW( Invalid_Glyph_Format );\n        goto exit;\n      }\n\n      switch( op1 )\n      {\n      case cf2_cmdRESERVED_0:\n      case cf2_cmdRESERVED_2:\n      case cf2_cmdRESERVED_9:\n      case cf2_cmdRESERVED_13:\n      case cf2_cmdRESERVED_15:\n      case cf2_cmdRESERVED_16:\n      case cf2_cmdRESERVED_17:\n        /* we may get here if we have a prior error */\n        FT_TRACE4(( \" unknown op (%d)\\n\", op1 ));\n        break;\n\n      case cf2_cmdHSTEMHM:\n      case cf2_cmdHSTEM:\n        FT_TRACE4(( op1 == cf2_cmdHSTEMHM ? \" hstemhm\\n\" : \" hstem\\n\" ));\n\n        /* never add hints after the mask is computed */\n        if ( cf2_hintmask_isValid( &hintMask ) )\n          FT_TRACE4(( \"cf2_interpT2CharString:\"\n                      \" invalid horizontal hint mask\\n\" ));\n\n        cf2_doStems( font,\n                     opStack,\n                     &hStemHintArray,\n                     width,\n                     &haveWidth,\n                     0 );\n\n        if ( font->decoder->width_only )\n            goto exit;\n\n        break;\n\n      case cf2_cmdVSTEMHM:\n      case cf2_cmdVSTEM:\n        FT_TRACE4(( op1 == cf2_cmdVSTEMHM ? \" vstemhm\\n\" : \" vstem\\n\" ));\n\n        /* never add hints after the mask is computed */\n        if ( cf2_hintmask_isValid( &hintMask ) )\n          FT_TRACE4(( \"cf2_interpT2CharString:\"\n                      \" invalid vertical hint mask\\n\" ));\n\n        cf2_doStems( font,\n                     opStack,\n                     &vStemHintArray,\n                     width,\n                     &haveWidth,\n                     0 );\n\n        if ( font->decoder->width_only )\n            goto exit;\n\n        break;\n\n      case cf2_cmdVMOVETO:\n        FT_TRACE4(( \" vmoveto\\n\" ));\n\n        if ( cf2_stack_count( opStack ) > 1 && !haveWidth )\n          *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX;\n\n        /* width is defined or default after this */\n        haveWidth = TRUE;\n\n        if ( font->decoder->width_only )\n            goto exit;\n\n        curY += cf2_stack_popFixed( opStack );\n\n        cf2_glyphpath_moveTo( &glyphPath, curX, curY );\n\t\tif (glyphPath.callbacks && glyphPath.callbacks->error && *glyphPath.callbacks->error) goto exit;\n\n        break;\n\n      case cf2_cmdRLINETO:\n        {\n          CF2_UInt  index;\n          CF2_UInt  count = cf2_stack_count( opStack );\n\n\n          FT_TRACE4(( \" rlineto\\n\" ));\n\n          for ( index = 0; index < count; index += 2 )\n          {\n            curX += cf2_stack_getReal( opStack, index + 0 );\n            curY += cf2_stack_getReal( opStack, index + 1 );\n\n            cf2_glyphpath_lineTo( &glyphPath, curX, curY );\n\t\t\tif (glyphPath.callbacks && glyphPath.callbacks->error && *glyphPath.callbacks->error) goto exit;\n          }\n\n          cf2_stack_clear( opStack );\n        }\n        continue; /* no need to clear stack again */\n\n      case cf2_cmdHLINETO:\n      case cf2_cmdVLINETO:\n        {\n          CF2_UInt  index;\n          CF2_UInt  count = cf2_stack_count( opStack );\n\n          FT_Bool  isX = op1 == cf2_cmdHLINETO;\n\n\n          FT_TRACE4(( isX ? \" hlineto\\n\" : \" vlineto\\n\" ));\n\n          for ( index = 0; index < count; index++ )\n          {\n            CF2_Fixed  v = cf2_stack_getReal( opStack, index );\n\n\n            if ( isX )\n              curX += v;\n            else\n              curY += v;\n\n            isX = !isX;\n\n            cf2_glyphpath_lineTo( &glyphPath, curX, curY );\n\t\t\tif (glyphPath.callbacks && glyphPath.callbacks->error && *glyphPath.callbacks->error) goto exit;\n          }\n\n          cf2_stack_clear( opStack );\n        }\n        continue;\n\n      case cf2_cmdRCURVELINE:\n      case cf2_cmdRRCURVETO:\n        {\n          CF2_UInt  count = cf2_stack_count( opStack );\n          CF2_UInt  index = 0;\n\n\n          FT_TRACE4(( op1 == cf2_cmdRCURVELINE ? \" rcurveline\\n\"\n                                               : \" rrcurveto\\n\" ));\n\n          while ( index + 6 <= count )\n          {\n            CF2_Fixed  x1 = cf2_stack_getReal( opStack, index + 0 ) + curX;\n            CF2_Fixed  y1 = cf2_stack_getReal( opStack, index + 1 ) + curY;\n            CF2_Fixed  x2 = cf2_stack_getReal( opStack, index + 2 ) + x1;\n            CF2_Fixed  y2 = cf2_stack_getReal( opStack, index + 3 ) + y1;\n            CF2_Fixed  x3 = cf2_stack_getReal( opStack, index + 4 ) + x2;\n            CF2_Fixed  y3 = cf2_stack_getReal( opStack, index + 5 ) + y2;\n\n\n            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );\n\t\t\tif (glyphPath.callbacks && glyphPath.callbacks->error && *glyphPath.callbacks->error) goto exit;\n\n            curX   = x3;\n            curY   = y3;\n            index += 6;\n          }\n\n          if ( op1 == cf2_cmdRCURVELINE )\n          {\n            curX += cf2_stack_getReal( opStack, index + 0 );\n            curY += cf2_stack_getReal( opStack, index + 1 );\n\n            cf2_glyphpath_lineTo( &glyphPath, curX, curY );\n\t\t\tif (glyphPath.callbacks && glyphPath.callbacks->error && *glyphPath.callbacks->error) goto exit;\n          }\n\n          cf2_stack_clear( opStack );\n        }\n        continue; /* no need to clear stack again */\n\n      case cf2_cmdCALLGSUBR:\n      case cf2_cmdCALLSUBR:\n        {\n          CF2_UInt  subrIndex;\n\n\n          FT_TRACE4(( op1 == cf2_cmdCALLGSUBR ? \" callgsubr\"\n                                              : \" callsubr\" ));\n\n          if ( charstringIndex > CF2_MAX_SUBR )\n          {\n            /* max subr plus one for charstring */\n            lastError = FT_THROW( Invalid_Glyph_Format );\n            goto exit;                      /* overflow of stack */\n          }\n\n          /* push our current CFF charstring region on subrStack */\n          charstring = (CF2_Buffer)\n                         cf2_arrstack_getPointer( &subrStack,\n                                                  charstringIndex + 1 );\n\n          /* set up the new CFF region and pointer */\n          subrIndex = cf2_stack_popInt( opStack );\n\n          switch ( op1 )\n          {\n          case cf2_cmdCALLGSUBR:\n            FT_TRACE4(( \"(%d)\\n\", subrIndex + decoder->globals_bias ));\n\n            if ( cf2_initGlobalRegionBuffer( decoder,\n                                             subrIndex,\n                                             charstring ) )\n            {\n              lastError = FT_THROW( Invalid_Glyph_Format );\n              goto exit;  /* subroutine lookup or stream error */\n            }\n            break;\n\n          default:\n            /* cf2_cmdCALLSUBR */\n            FT_TRACE4(( \"(%d)\\n\", subrIndex + decoder->locals_bias ));\n\n            if ( cf2_initLocalRegionBuffer( decoder,\n                                            subrIndex,\n                                            charstring ) )\n            {\n              lastError = FT_THROW( Invalid_Glyph_Format );\n              goto exit;  /* subroutine lookup or stream error */\n            }\n          }\n\n          charstringIndex += 1;       /* entry is valid now */\n        }\n        continue; /* do not clear the stack */\n\n      case cf2_cmdRETURN:\n        FT_TRACE4(( \" return\\n\" ));\n\n        if ( charstringIndex < 1 )\n        {\n          /* Note: cannot return from top charstring */\n          lastError = FT_THROW( Invalid_Glyph_Format );\n          goto exit;                      /* underflow of stack */\n        }\n\n        /* restore position in previous charstring */\n        charstring = (CF2_Buffer)\n                       cf2_arrstack_getPointer( &subrStack,\n                                                --charstringIndex );\n        continue;     /* do not clear the stack */\n\n      case cf2_cmdESC:\n        {\n          FT_Byte  op2 = (FT_Byte)cf2_buf_readByte( charstring );\n\n\n          switch ( op2 )\n          {\n          case cf2_escDOTSECTION:\n            /* something about `flip type of locking' -- ignore it */\n            FT_TRACE4(( \" dotsection\\n\" ));\n\n            break;\n\n          /* TODO: should these operators be supported? */\n          case cf2_escAND: /* in spec */\n            FT_TRACE4(( \" and\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escOR: /* in spec */\n            FT_TRACE4(( \" or\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escNOT: /* in spec */\n            FT_TRACE4(( \" not\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escABS: /* in spec */\n            FT_TRACE4(( \" abs\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escADD: /* in spec */\n            FT_TRACE4(( \" add\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escSUB: /* in spec */\n            FT_TRACE4(( \" sub\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escDIV: /* in spec */\n            FT_TRACE4(( \" div\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escNEG: /* in spec */\n            FT_TRACE4(( \" neg\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escEQ: /* in spec */\n            FT_TRACE4(( \" eq\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escDROP: /* in spec */\n            FT_TRACE4(( \" drop\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escPUT: /* in spec */\n            FT_TRACE4(( \" put\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escGET: /* in spec */\n            FT_TRACE4(( \" get\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escIFELSE: /* in spec */\n            FT_TRACE4(( \" ifelse\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escRANDOM: /* in spec */\n            FT_TRACE4(( \" random\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escMUL: /* in spec */\n            FT_TRACE4(( \" mul\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escSQRT: /* in spec */\n            FT_TRACE4(( \" sqrt\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escDUP: /* in spec */\n            FT_TRACE4(( \" dup\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escEXCH: /* in spec */\n            FT_TRACE4(( \" exch\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escINDEX: /* in spec */\n            FT_TRACE4(( \" index\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escROLL: /* in spec */\n            FT_TRACE4(( \" roll\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escHFLEX:\n            {\n              static const FT_Bool  readFromStack[12] =\n              {\n                TRUE /* dx1 */, FALSE /* dy1 */,\n                TRUE /* dx2 */, TRUE  /* dy2 */,\n                TRUE /* dx3 */, FALSE /* dy3 */,\n                TRUE /* dx4 */, FALSE /* dy4 */,\n                TRUE /* dx5 */, FALSE /* dy5 */,\n                TRUE /* dx6 */, FALSE /* dy6 */\n              };\n\n\n              FT_TRACE4(( \" hflex\\n\" ));\n\n              cf2_doFlex( opStack,\n                          &curX,\n                          &curY,\n                          &glyphPath,\n                          readFromStack,\n                          FALSE /* doConditionalLastRead */ );\n            }\n            continue;\n\n          case cf2_escFLEX:\n            {\n              static const FT_Bool  readFromStack[12] =\n              {\n                TRUE /* dx1 */, TRUE /* dy1 */,\n                TRUE /* dx2 */, TRUE /* dy2 */,\n                TRUE /* dx3 */, TRUE /* dy3 */,\n                TRUE /* dx4 */, TRUE /* dy4 */,\n                TRUE /* dx5 */, TRUE /* dy5 */,\n                TRUE /* dx6 */, TRUE /* dy6 */\n              };\n\n\n              FT_TRACE4(( \" flex\\n\" ));\n\n              cf2_doFlex( opStack,\n                          &curX,\n                          &curY,\n                          &glyphPath,\n                          readFromStack,\n                          FALSE /* doConditionalLastRead */ );\n            }\n            break;      /* TODO: why is this not a continue? */\n\n          case cf2_escHFLEX1:\n            {\n              static const FT_Bool  readFromStack[12] =\n              {\n                TRUE /* dx1 */, TRUE  /* dy1 */,\n                TRUE /* dx2 */, TRUE  /* dy2 */,\n                TRUE /* dx3 */, FALSE /* dy3 */,\n                TRUE /* dx4 */, FALSE /* dy4 */,\n                TRUE /* dx5 */, TRUE  /* dy5 */,\n                TRUE /* dx6 */, FALSE /* dy6 */\n              };\n\n\n              FT_TRACE4(( \" hflex1\\n\" ));\n\n              cf2_doFlex( opStack,\n                          &curX,\n                          &curY,\n                          &glyphPath,\n                          readFromStack,\n                          FALSE /* doConditionalLastRead */ );\n            }\n            continue;\n\n          case cf2_escFLEX1:\n            {\n              static const FT_Bool  readFromStack[12] =\n              {\n                TRUE  /* dx1 */, TRUE  /* dy1 */,\n                TRUE  /* dx2 */, TRUE  /* dy2 */,\n                TRUE  /* dx3 */, TRUE  /* dy3 */,\n                TRUE  /* dx4 */, TRUE  /* dy4 */,\n                TRUE  /* dx5 */, TRUE  /* dy5 */,\n                FALSE /* dx6 */, FALSE /* dy6 */\n              };\n\n\n              FT_TRACE4(( \" flex1\\n\" ));\n\n              cf2_doFlex( opStack,\n                          &curX,\n                          &curY,\n                          &glyphPath,\n                          readFromStack,\n                          TRUE /* doConditionalLastRead */ );\n            }\n            continue;\n\n          case cf2_escRESERVED_1:\n          case cf2_escRESERVED_2:\n          case cf2_escRESERVED_6:\n          case cf2_escRESERVED_7:\n          case cf2_escRESERVED_8:\n          case cf2_escRESERVED_13:\n          case cf2_escRESERVED_16:\n          case cf2_escRESERVED_17:\n          case cf2_escRESERVED_19:\n          case cf2_escRESERVED_25:\n          case cf2_escRESERVED_31:\n          case cf2_escRESERVED_32:\n          case cf2_escRESERVED_33:\n          default:\n            FT_TRACE4(( \" unknown op (12, %d)\\n\", op2 ));\n\n          }; /* end of switch statement checking `op2' */\n\n        } /* case cf2_cmdESC */\n        break;\n\n      case cf2_cmdENDCHAR:\n        FT_TRACE4(( \" endchar\\n\" ));\n\n        if ( cf2_stack_count( opStack ) == 1 ||\n             cf2_stack_count( opStack ) == 5 )\n        {\n          if ( !haveWidth )\n            *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX;\n        }\n\n        /* width is defined or default after this */\n        haveWidth = TRUE;\n\n        if ( font->decoder->width_only )\n            goto exit;\n\n        /* close path if still open */\n        cf2_glyphpath_closeOpenPath( &glyphPath );\n\n        if ( cf2_stack_count( opStack ) > 1 )\n        {\n          /* must be either 4 or 5 --                       */\n          /* this is a (deprecated) implied `seac' operator */\n\n          CF2_UInt       achar;\n          CF2_UInt       bchar;\n          CF2_BufferRec  component;\n          CF2_Fixed      dummyWidth;   /* ignore component width */\n          FT_Error       error2;\n\n\n          if ( doingSeac )\n          {\n            lastError = FT_THROW( Invalid_Glyph_Format );\n            goto exit;      /* nested seac */\n          }\n\n          achar = cf2_stack_popInt( opStack );\n          bchar = cf2_stack_popInt( opStack );\n\n          curY = cf2_stack_popFixed( opStack );\n          curX = cf2_stack_popFixed( opStack );\n\n          error2 = cf2_getSeacComponent( decoder, achar, &component );\n          if ( error2 )\n          {\n             lastError = error2;      /* pass FreeType error through */\n             goto exit;\n          }\n          cf2_interpT2CharString( font,\n                                  &component,\n                                  callbacks,\n                                  translation,\n                                  TRUE,\n                                  curX,\n                                  curY,\n                                  &dummyWidth );\n          cf2_freeSeacComponent( decoder, &component );\n\n          error2 = cf2_getSeacComponent( decoder, bchar, &component );\n          if ( error2 )\n          {\n            lastError = error2;      /* pass FreeType error through */\n            goto exit;\n          }\n          cf2_interpT2CharString( font,\n                                  &component,\n                                  callbacks,\n                                  translation,\n                                  TRUE,\n                                  0,\n                                  0,\n                                  &dummyWidth );\n          cf2_freeSeacComponent( decoder, &component );\n        }\n        goto exit;\n\n      case cf2_cmdCNTRMASK:\n      case cf2_cmdHINTMASK:\n        /* the final \\n in the tracing message gets added in      */\n        /* `cf2_hintmask_read' (which also traces the mask bytes) */\n        FT_TRACE4(( op1 == cf2_cmdCNTRMASK ? \" cntrmask\" : \" hintmask\" ));\n\n        /* if there are arguments on the stack, there this is an */\n        /* implied cf2_cmdVSTEMHM                                */\n        if ( cf2_stack_count( opStack ) != 0 )\n        {\n          /* never add hints after the mask is computed */\n          if ( cf2_hintmask_isValid( &hintMask ) )\n            FT_TRACE4(( \"cf2_interpT2CharString: invalid hint mask\\n\" ));\n        }\n\n        cf2_doStems( font,\n                     opStack,\n                     &vStemHintArray,\n                     width,\n                     &haveWidth,\n                     0 );\n\n        if ( font->decoder->width_only )\n            goto exit;\n\n        if ( op1 == cf2_cmdHINTMASK )\n        {\n          /* consume the hint mask bytes which follow the operator */\n          cf2_hintmask_read( &hintMask,\n                             charstring,\n                             cf2_arrstack_size( &hStemHintArray ) +\n                               cf2_arrstack_size( &vStemHintArray ) );\n        }\n        else\n        {\n          /*\n           * Consume the counter mask bytes which follow the operator:\n           * Build a temporary hint map, just to place and lock those\n           * stems participating in the counter mask.  These are most\n           * likely the dominant hstems, and are grouped together in a\n           * few counter groups, not necessarily in correspondence\n           * with the hint groups.  This reduces the chances of\n           * conflicts between hstems that are initially placed in\n           * separate hint groups and then brought together.  The\n           * positions are copied back to `hStemHintArray', so we can\n           * discard `counterMask' and `counterHintMap'.\n           *\n           */\n          CF2_HintMapRec   counterHintMap;\n          CF2_HintMaskRec  counterMask;\n\n\n          cf2_hintmap_init( &counterHintMap,\n                            font,\n                            &glyphPath.initialHintMap,\n                            &glyphPath.hintMoves,\n                            scaleY );\n          cf2_hintmask_init( &counterMask, error );\n\n          cf2_hintmask_read( &counterMask,\n                             charstring,\n                             cf2_arrstack_size( &hStemHintArray ) +\n                               cf2_arrstack_size( &vStemHintArray ) );\n          cf2_hintmap_build( &counterHintMap,\n                             &hStemHintArray,\n                             &vStemHintArray,\n                             &counterMask,\n                             0,\n                             FALSE );\n        }\n        break;\n\n      case cf2_cmdRMOVETO:\n        FT_TRACE4(( \" rmoveto\\n\" ));\n\n        if ( cf2_stack_count( opStack ) > 2 && !haveWidth )\n          *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX;\n\n        /* width is defined or default after this */\n        haveWidth = TRUE;\n\n        if ( font->decoder->width_only )\n            goto exit;\n\n        curY += cf2_stack_popFixed( opStack );\n        curX += cf2_stack_popFixed( opStack );\n\n        cf2_glyphpath_moveTo( &glyphPath, curX, curY );\n\t\tif (glyphPath.callbacks && glyphPath.callbacks->error && *glyphPath.callbacks->error) goto exit;\n\n        break;\n\n      case cf2_cmdHMOVETO:\n        FT_TRACE4(( \" hmoveto\\n\" ));\n\n        if ( cf2_stack_count( opStack ) > 1 && !haveWidth )\n          *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX;\n\n        /* width is defined or default after this */\n        haveWidth = TRUE;\n\n        if ( font->decoder->width_only )\n            goto exit;\n\n        curX += cf2_stack_popFixed( opStack );\n\n        cf2_glyphpath_moveTo( &glyphPath, curX, curY );\n\t\tif (glyphPath.callbacks && glyphPath.callbacks->error && *glyphPath.callbacks->error) goto exit;\n\n        break;\n\n      case cf2_cmdRLINECURVE:\n        {\n          CF2_UInt  count = cf2_stack_count( opStack );\n          CF2_UInt  index = 0;\n\n\n          FT_TRACE4(( \" rlinecurve\\n\" ));\n\n          while ( index + 6 < count )\n          {\n            curX += cf2_stack_getReal( opStack, index + 0 );\n            curY += cf2_stack_getReal( opStack, index + 1 );\n\n            cf2_glyphpath_lineTo( &glyphPath, curX, curY );\n\t\t\tif (glyphPath.callbacks && glyphPath.callbacks->error && *glyphPath.callbacks->error) goto exit;\n            index += 2;\n          }\n\n          while ( index < count )\n          {\n            CF2_Fixed  x1 = cf2_stack_getReal( opStack, index + 0 ) + curX;\n            CF2_Fixed  y1 = cf2_stack_getReal( opStack, index + 1 ) + curY;\n            CF2_Fixed  x2 = cf2_stack_getReal( opStack, index + 2 ) + x1;\n            CF2_Fixed  y2 = cf2_stack_getReal( opStack, index + 3 ) + y1;\n            CF2_Fixed  x3 = cf2_stack_getReal( opStack, index + 4 ) + x2;\n            CF2_Fixed  y3 = cf2_stack_getReal( opStack, index + 5 ) + y2;\n\n\n            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );\n\t\t\tif (glyphPath.callbacks && glyphPath.callbacks->error && *glyphPath.callbacks->error) goto exit;\n\n            curX   = x3;\n            curY   = y3;\n            index += 6;\n          }\n\n          cf2_stack_clear( opStack );\n        }\n        continue; /* no need to clear stack again */\n\n      case cf2_cmdVVCURVETO:\n        {\n          CF2_UInt  count = cf2_stack_count( opStack );\n          CF2_UInt  index = 0;\n\n\n          FT_TRACE4(( \" vvcurveto\\n\" ));\n\n          while ( index < count )\n          {\n            CF2_Fixed  x1, y1, x2, y2, x3, y3;\n\n\n            if ( ( count - index ) & 1 )\n            {\n              x1 = cf2_stack_getReal( opStack, index ) + curX;\n\n              ++index;\n            }\n            else\n              x1 = curX;\n\n            y1 = cf2_stack_getReal( opStack, index + 0 ) + curY;\n            x2 = cf2_stack_getReal( opStack, index + 1 ) + x1;\n            y2 = cf2_stack_getReal( opStack, index + 2 ) + y1;\n            x3 = x2;\n            y3 = cf2_stack_getReal( opStack, index + 3 ) + y2;\n\n            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );\n\t\t\tif (glyphPath.callbacks && glyphPath.callbacks->error && *glyphPath.callbacks->error) goto exit;\n\n            curX   = x3;\n            curY   = y3;\n            index += 4;\n          }\n\n          cf2_stack_clear( opStack );\n        }\n        continue; /* no need to clear stack again */\n\n      case cf2_cmdHHCURVETO:\n        {\n          CF2_UInt  count = cf2_stack_count( opStack );\n          CF2_UInt  index = 0;\n\n\n          FT_TRACE4(( \" hhcurveto\\n\" ));\n\n          while ( index < count )\n          {\n            CF2_Fixed  x1, y1, x2, y2, x3, y3;\n\n\n            if ( ( count - index ) & 1 )\n            {\n              y1 = cf2_stack_getReal( opStack, index ) + curY;\n\n              ++index;\n            }\n            else\n              y1 = curY;\n\n            x1 = cf2_stack_getReal( opStack, index + 0 ) + curX;\n            x2 = cf2_stack_getReal( opStack, index + 1 ) + x1;\n            y2 = cf2_stack_getReal( opStack, index + 2 ) + y1;\n            x3 = cf2_stack_getReal( opStack, index + 3 ) + x2;\n            y3 = y2;\n\n            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );\n\t\t\tif (glyphPath.callbacks && glyphPath.callbacks->error && *glyphPath.callbacks->error) goto exit;\n\n            curX   = x3;\n            curY   = y3;\n            index += 4;\n          }\n\n          cf2_stack_clear( opStack );\n        }\n        continue; /* no need to clear stack again */\n\n      case cf2_cmdVHCURVETO:\n      case cf2_cmdHVCURVETO:\n        {\n          CF2_UInt  count = cf2_stack_count( opStack );\n          CF2_UInt  index = 0;\n\n          FT_Bool  alternate = op1 == cf2_cmdHVCURVETO;\n\n\n          FT_TRACE4(( alternate ? \" hvcurveto\\n\" : \" vhcurveto\\n\" ));\n\n          while ( index < count )\n          {\n            CF2_Fixed x1, x2, x3, y1, y2, y3;\n\n\n            if ( alternate )\n            {\n              x1 = cf2_stack_getReal( opStack, index + 0 ) + curX;\n              y1 = curY;\n              x2 = cf2_stack_getReal( opStack, index + 1 ) + x1;\n              y2 = cf2_stack_getReal( opStack, index + 2 ) + y1;\n              y3 = cf2_stack_getReal( opStack, index + 3 ) + y2;\n\n              if ( count - index == 5 )\n              {\n                x3 = cf2_stack_getReal( opStack, index + 4 ) + x2;\n\n                ++index;\n              }\n              else\n                x3 = x2;\n\n              alternate = FALSE;\n            }\n            else\n            {\n              x1 = curX;\n              y1 = cf2_stack_getReal( opStack, index + 0 ) + curY;\n              x2 = cf2_stack_getReal( opStack, index + 1 ) + x1;\n              y2 = cf2_stack_getReal( opStack, index + 2 ) + y1;\n              x3 = cf2_stack_getReal( opStack, index + 3 ) + x2;\n\n              if ( count - index == 5 )\n              {\n                y3 = cf2_stack_getReal( opStack, index + 4 ) + y2;\n\n                ++index;\n              }\n              else\n                y3 = y2;\n\n              alternate = TRUE;\n            }\n\n            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );\n\t\t\tif (glyphPath.callbacks && glyphPath.callbacks->error && *glyphPath.callbacks->error) goto exit;\n\n            curX   = x3;\n            curY   = y3;\n            index += 4;\n          }\n\n          cf2_stack_clear( opStack );\n        }\n        continue;     /* no need to clear stack again */\n\n      case cf2_cmdEXTENDEDNMBR:\n        {\n          CF2_Int  v;\n\n\n          v = (FT_Short)( ( cf2_buf_readByte( charstring ) << 8 ) |\n                            cf2_buf_readByte( charstring )        );\n\n          FT_TRACE4(( \" %d\", v ));\n\n          cf2_stack_pushInt( opStack, v );\n        }\n        continue;\n\n      default:\n        /* numbers */\n        {\n          if ( /* op1 >= 32 && */ op1 <= 246 )\n          {\n            CF2_Int  v;\n\n\n            v = op1 - 139;\n\n            FT_TRACE4(( \" %d\", v ));\n\n            /* -107 .. 107 */\n            cf2_stack_pushInt( opStack, v );\n          }\n\n          else if ( /* op1 >= 247 && */ op1 <= 250 )\n          {\n            CF2_Int  v;\n\n\n            v  = op1;\n            v -= 247;\n            v *= 256;\n            v += cf2_buf_readByte( charstring );\n            v += 108;\n\n            FT_TRACE4(( \" %d\", v ));\n\n            /* 108 .. 1131 */\n            cf2_stack_pushInt( opStack, v );\n          }\n\n          else if ( /* op1 >= 251 && */ op1 <= 254 )\n          {\n            CF2_Int  v;\n\n\n            v  = op1;\n            v -= 251;\n            v *= 256;\n            v += cf2_buf_readByte( charstring );\n            v  = -v - 108;\n\n            FT_TRACE4(( \" %d\", v ));\n\n            /* -1131 .. -108 */\n            cf2_stack_pushInt( opStack, v );\n          }\n\n          else /* op1 == 255 */\n          {\n            CF2_Fixed  v;\n\n\n            v = (CF2_Fixed)\n                  ( ( (FT_UInt32)cf2_buf_readByte( charstring ) << 24 ) |\n                    ( (FT_UInt32)cf2_buf_readByte( charstring ) << 16 ) |\n                    ( (FT_UInt32)cf2_buf_readByte( charstring ) <<  8 ) |\n                      (FT_UInt32)cf2_buf_readByte( charstring )         );\n\n            FT_TRACE4(( \" %.2f\", v / 65536.0 ));\n\n            cf2_stack_pushFixed( opStack, v );\n          }\n        }\n        continue;   /* don't clear stack */\n\n      } /* end of switch statement checking `op1' */\n\n      cf2_stack_clear( opStack );\n\n    } /* end of main interpreter loop */\n\n    /* we get here if the charstring ends without cf2_cmdENDCHAR */\n    FT_TRACE4(( \"cf2_interpT2CharString:\"\n                \"  charstring ends without ENDCHAR\\n\" ));\n\n  exit:\n    /* check whether last error seen is also the first one */\n    cf2_setError( error, lastError );\n\n    /* free resources from objects we've used */\n    cf2_glyphpath_finalize( &glyphPath );\n    cf2_arrstack_finalize( &vStemHintArray );\n    cf2_arrstack_finalize( &hStemHintArray );\n    cf2_arrstack_finalize( &subrStack );\n    cf2_stack_free( opStack );\n\n    FT_TRACE4(( \"\\n\" ));\n\n    return;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2font.h                                                              */\n/*                                                                         */\n/*    Adobe's CFF Interpreter (specification).                             */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CF2INTRP_H__\n#define __CF2INTRP_H__\n\n\n#include \"cf2ft.h\"\n#include \"cf2hints.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( void )\n  cf2_hintmask_init( CF2_HintMask  hintmask,\n                     FT_Error*     error );\n  FT_LOCAL( FT_Bool )\n  cf2_hintmask_isValid( const CF2_HintMask  hintmask );\n  FT_LOCAL( FT_Bool )\n  cf2_hintmask_isNew( const CF2_HintMask  hintmask );\n  FT_LOCAL( void )\n  cf2_hintmask_setNew( CF2_HintMask  hintmask,\n                       FT_Bool       val );\n  FT_LOCAL( FT_Byte* )\n  cf2_hintmask_getMaskPtr( CF2_HintMask  hintmask );\n  FT_LOCAL( void )\n  cf2_hintmask_setAll( CF2_HintMask  hintmask,\n                       size_t        bitCount );\n\n  FT_LOCAL( void )\n  cf2_interpT2CharString( CF2_Font              font,\n                          CF2_Buffer            charstring,\n                          CF2_OutlineCallbacks  callbacks,\n                          const FT_Vector*      translation,\n                          FT_Bool               doingSeac,\n                          CF2_Fixed             curX,\n                          CF2_Fixed             curY,\n                          CF2_Fixed*            width );\n\n\nFT_END_HEADER\n\n\n#endif /* __CF2INTRP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2read.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2read.c                                                              */\n/*                                                                         */\n/*    Adobe's code for stream handling (body).                             */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"cf2ft.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n\n#include \"cf2glue.h\"\n\n#include \"cf2error.h\"\n\n\n  /* Define CF2_IO_FAIL as 1 to enable random errors and random */\n  /* value errors in I/O.                                       */\n#define CF2_IO_FAIL  0\n\n\n#if CF2_IO_FAIL\n\n  /* set the .00 value to a nonzero probability */\n  static int\n  randomError2( void )\n  {\n    /* for region buffer ReadByte (interp) function */\n    return (double)rand() / RAND_MAX < .00;\n  }\n\n  /* set the .00 value to a nonzero probability */\n  static CF2_Int\n  randomValue()\n  {\n    return (double)rand() / RAND_MAX < .00 ? rand() : 0;\n  }\n\n#endif /* CF2_IO_FAIL */\n\n\n  /* Region Buffer                                      */\n  /*                                                    */\n  /* Can be constructed from a copied buffer managed by */\n  /* `FCM_getDatablock'.                                */\n  /* Reads bytes with check for end of buffer.          */\n\n  /* reading past the end of the buffer sets error and returns zero */\n  FT_LOCAL_DEF( CF2_Int )\n  cf2_buf_readByte( CF2_Buffer  buf )\n  {\n    if ( buf->ptr < buf->end )\n    {\n#if CF2_IO_FAIL\n      if ( randomError2() )\n      {\n        CF2_SET_ERROR( buf->error, Invalid_Stream_Operation );\n        return 0;\n      }\n\n      return *(buf->ptr)++ + randomValue();\n#else\n      return *(buf->ptr)++;\n#endif\n    }\n    else\n    {\n      CF2_SET_ERROR( buf->error, Invalid_Stream_Operation );\n      return 0;\n    }\n  }\n\n\n  /* note: end condition can occur without error */\n  FT_LOCAL_DEF( FT_Bool )\n  cf2_buf_isEnd( CF2_Buffer  buf )\n  {\n    return (FT_Bool)( buf->ptr >= buf->end );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2read.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2read.h                                                              */\n/*                                                                         */\n/*    Adobe's code for stream handling (specification).                    */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CF2READ_H__\n#define __CF2READ_H__\n\n\nFT_BEGIN_HEADER\n\n\n  typedef struct  CF2_BufferRec_\n  {\n    FT_Error*       error;\n    const FT_Byte*  start;\n    const FT_Byte*  end;\n    const FT_Byte*  ptr;\n\n  } CF2_BufferRec, *CF2_Buffer;\n\n\n  FT_LOCAL( CF2_Int )\n  cf2_buf_readByte( CF2_Buffer  buf );\n  FT_LOCAL( FT_Bool )\n  cf2_buf_isEnd( CF2_Buffer  buf );\n\n\nFT_END_HEADER\n\n\n#endif /* __CF2READ_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2stack.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2stack.c                                                             */\n/*                                                                         */\n/*    Adobe's code for emulating a CFF stack (body).                       */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"cf2ft.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n\n#include \"cf2glue.h\"\n#include \"cf2font.h\"\n#include \"cf2stack.h\"\n\n#include \"cf2error.h\"\n\n\n  /* Allocate and initialize an instance of CF2_Stack.       */\n  /* Note: This function returns NULL on error (does not set */\n  /* `error').                                               */\n  FT_LOCAL_DEF( CF2_Stack )\n  cf2_stack_init( FT_Memory  memory,\n                  FT_Error*  e )\n  {\n    FT_Error  error = FT_Err_Ok;     /* for FT_QNEW */\n\n    CF2_Stack  stack = NULL;\n\n\n    if ( !FT_QNEW( stack ) )\n    {\n      /* initialize the structure; FT_QNEW zeroes it */\n      stack->memory = memory;\n      stack->error  = e;\n      stack->top    = &stack->buffer[0]; /* empty stack */\n    }\n\n    return stack;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_stack_free( CF2_Stack  stack )\n  {\n    if ( stack )\n    {\n      FT_Memory  memory = stack->memory;\n\n\n      /* free the main structure */\n      FT_FREE( stack );\n    }\n  }\n\n\n  FT_LOCAL_DEF( CF2_UInt )\n  cf2_stack_count( CF2_Stack  stack )\n  {\n    return (CF2_UInt)( stack->top - &stack->buffer[0] );\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_stack_pushInt( CF2_Stack  stack,\n                     CF2_Int    val )\n  {\n    if ( stack->top == &stack->buffer[CF2_OPERAND_STACK_SIZE] )\n    {\n      CF2_SET_ERROR( stack->error, Stack_Overflow );\n      return;     /* stack overflow */\n    }\n\n    stack->top->u.i  = val;\n    stack->top->type = CF2_NumberInt;\n    ++stack->top;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_stack_pushFixed( CF2_Stack  stack,\n                       CF2_Fixed  val )\n  {\n    if ( stack->top == &stack->buffer[CF2_OPERAND_STACK_SIZE] )\n    {\n      CF2_SET_ERROR( stack->error, Stack_Overflow );\n      return;     /* stack overflow */\n    }\n\n    stack->top->u.r  = val;\n    stack->top->type = CF2_NumberFixed;\n    ++stack->top;\n  }\n\n\n  /* this function is only allowed to pop an integer type */\n  FT_LOCAL_DEF( CF2_Int )\n  cf2_stack_popInt( CF2_Stack  stack )\n  {\n    if ( stack->top == &stack->buffer[0] )\n    {\n      CF2_SET_ERROR( stack->error, Stack_Underflow );\n      return 0;   /* underflow */\n    }\n    if ( stack->top[-1].type != CF2_NumberInt )\n    {\n      CF2_SET_ERROR( stack->error, Syntax_Error );\n      return 0;   /* type mismatch */\n    }\n\n    --stack->top;\n\n    return stack->top->u.i;\n  }\n\n\n  /* Note: type mismatch is silently cast */\n  /* TODO: check this */\n  FT_LOCAL_DEF( CF2_Fixed )\n  cf2_stack_popFixed( CF2_Stack  stack )\n  {\n    if ( stack->top == &stack->buffer[0] )\n    {\n      CF2_SET_ERROR( stack->error, Stack_Underflow );\n      return cf2_intToFixed( 0 );    /* underflow */\n    }\n\n    --stack->top;\n\n    switch ( stack->top->type )\n    {\n    case CF2_NumberInt:\n      return cf2_intToFixed( stack->top->u.i );\n    case CF2_NumberFrac:\n      return cf2_fracToFixed( stack->top->u.f );\n    default:\n      return stack->top->u.r;\n    }\n  }\n\n\n  /* Note: type mismatch is silently cast */\n  /* TODO: check this */\n  FT_LOCAL_DEF( CF2_Fixed )\n  cf2_stack_getReal( CF2_Stack  stack,\n                     CF2_UInt   idx )\n  {\n    FT_ASSERT( cf2_stack_count( stack ) <= CF2_OPERAND_STACK_SIZE );\n\n    if ( idx >= cf2_stack_count( stack ) )\n    {\n      CF2_SET_ERROR( stack->error, Stack_Overflow );\n      return cf2_intToFixed( 0 );    /* bounds error */\n    }\n\n    switch ( stack->buffer[idx].type )\n    {\n    case CF2_NumberInt:\n      return cf2_intToFixed( stack->buffer[idx].u.i );\n    case CF2_NumberFrac:\n      return cf2_fracToFixed( stack->buffer[idx].u.f );\n    default:\n      return stack->buffer[idx].u.r;\n    }\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_stack_clear( CF2_Stack  stack )\n  {\n    stack->top = &stack->buffer[0];\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2stack.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2stack.h                                                             */\n/*                                                                         */\n/*    Adobe's code for emulating a CFF stack (specification).              */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CF2STACK_H__\n#define __CF2STACK_H__\n\n\nFT_BEGIN_HEADER\n\n\n  /* CFF operand stack; specified maximum of 48 or 192 values */\n  typedef struct  CF2_StackNumber_\n  {\n    union\n    {\n      CF2_Fixed  r;      /* 16.16 fixed point */\n      CF2_Frac   f;      /* 2.30 fixed point (for font matrix) */\n      CF2_Int    i;\n    } u;\n\n    CF2_NumberType  type;\n\n  } CF2_StackNumber;\n\n\n  typedef struct  CF2_StackRec_\n  {\n    FT_Memory         memory;\n    FT_Error*         error;\n    CF2_StackNumber   buffer[CF2_OPERAND_STACK_SIZE];\n    CF2_StackNumber*  top;\n\n  } CF2_StackRec, *CF2_Stack;\n\n\n  FT_LOCAL( CF2_Stack )\n  cf2_stack_init( FT_Memory  memory,\n                  FT_Error*  error );\n  FT_LOCAL( void )\n  cf2_stack_free( CF2_Stack  stack );\n\n  FT_LOCAL( CF2_UInt )\n  cf2_stack_count( CF2_Stack  stack );\n\n  FT_LOCAL( void )\n  cf2_stack_pushInt( CF2_Stack  stack,\n                     CF2_Int    val );\n  FT_LOCAL( void )\n  cf2_stack_pushFixed( CF2_Stack  stack,\n                       CF2_Fixed  val );\n\n  FT_LOCAL( CF2_Int )\n  cf2_stack_popInt( CF2_Stack  stack );\n  FT_LOCAL( CF2_Fixed )\n  cf2_stack_popFixed( CF2_Stack  stack );\n\n  FT_LOCAL( CF2_Fixed )\n  cf2_stack_getReal( CF2_Stack  stack,\n                     CF2_UInt   idx );\n\n  FT_LOCAL( void )\n  cf2_stack_clear( CF2_Stack  stack );\n\n\nFT_END_HEADER\n\n\n#endif /* __CF2STACK_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2types.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2types.h                                                             */\n/*                                                                         */\n/*    Adobe's code for defining data types (specification only).           */\n/*                                                                         */\n/*  Copyright 2011-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CF2TYPES_H__\n#define __CF2TYPES_H__\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/freetype.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*\n   * The data models that we expect to support are as follows:\n   *\n   *   name  char short int long long-long pointer example\n   *  -----------------------------------------------------\n   *   ILP32  8    16    32  32     64*      32    32-bit MacOS, x86\n   *   LLP64  8    16    32  32     64       64    x64\n   *   LP64   8    16    32  64     64       64    64-bit MacOS\n   *\n   *    *) type may be supported by emulation on a 32-bit architecture\n   *\n   */\n\n\n  /* integers at least 32 bits wide */\n#define CF2_UInt  FT_UFast\n#define CF2_Int   FT_Fast\n\n\n  /* fixed-float numbers */\n  typedef FT_Int32  CF2_F16Dot16;\n\n\nFT_END_HEADER\n\n\n#endif /* __CF2TYPES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffcmap.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffcmap.c                                                              */\n/*                                                                         */\n/*    CFF character mapping table (cmap) support (body).                   */\n/*                                                                         */\n/*  Copyright 2002-2007, 2010, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"cffcmap.h\"\n#include \"cffload.h\"\n\n#include \"cfferrs.h\"\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****           CFF STANDARD (AND EXPERT) ENCODING CMAPS            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_CALLBACK_DEF( FT_Error )\n  cff_cmap_encoding_init( CFF_CMapStd  cmap, FT_Pointer unused)\n  {\n    TT_Face       face     = (TT_Face)FT_CMAP_FACE( cmap );\n    CFF_Font      cff      = (CFF_Font)face->extra.data;\n    CFF_Encoding  encoding = &cff->encoding;\n\n\n    cmap->gids  = encoding->codes;\n\n    return 0;\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  cff_cmap_encoding_done( CFF_CMapStd  cmap )\n  {\n    cmap->gids  = NULL;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  cff_cmap_encoding_char_index( CFF_CMapStd  cmap,\n                                FT_UInt32    char_code )\n  {\n    FT_UInt  result = 0;\n\n\n    if ( char_code < 256 )\n      result = cmap->gids[char_code];\n\n    return result;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  cff_cmap_encoding_char_next( CFF_CMapStd   cmap,\n                               FT_UInt32    *pchar_code )\n  {\n    FT_UInt    result    = 0;\n    FT_UInt32  char_code = *pchar_code;\n\n\n    *pchar_code = 0;\n\n    if ( char_code < 255 )\n    {\n      FT_UInt  code = (FT_UInt)(char_code + 1);\n\n\n      for (;;)\n      {\n        if ( code >= 256 )\n          break;\n\n        result = cmap->gids[code];\n        if ( result != 0 )\n        {\n          *pchar_code = code;\n          break;\n        }\n\n        code++;\n      }\n    }\n    return result;\n  }\n\n\n  FT_DEFINE_CMAP_CLASS(cff_cmap_encoding_class_rec,\n    sizeof ( CFF_CMapStdRec ),\n\n    (FT_CMap_InitFunc)     cff_cmap_encoding_init,\n    (FT_CMap_DoneFunc)     cff_cmap_encoding_done,\n    (FT_CMap_CharIndexFunc)cff_cmap_encoding_char_index,\n    (FT_CMap_CharNextFunc) cff_cmap_encoding_char_next,\n\n    NULL, NULL, NULL, NULL, NULL\n  )\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****              CFF SYNTHETIC UNICODE ENCODING CMAP              *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_CALLBACK_DEF( const char* )\n  cff_sid_to_glyph_name( TT_Face  face,\n                         FT_UInt  idx )\n  {\n    CFF_Font     cff     = (CFF_Font)face->extra.data;\n    CFF_Charset  charset = &cff->charset;\n    FT_UInt      sid     = charset->sids[idx];\n\n\n    return cff_index_get_sid_string( cff, sid );\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  cff_cmap_unicode_init( PS_Unicodes  unicodes, FT_Pointer unused )\n  {\n    TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );\n    FT_Memory           memory  = FT_FACE_MEMORY( face );\n    CFF_Font            cff     = (CFF_Font)face->extra.data;\n    CFF_Charset         charset = &cff->charset;\n    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;\n\n\n    /* can't build Unicode map for CID-keyed font */\n    /* because we don't know glyph names.         */\n    if ( !charset->sids )\n      return FT_THROW( No_Unicode_Glyph_Name );\n\n    return psnames->unicodes_init( memory,\n                                   unicodes,\n                                   cff->num_glyphs,\n                                   (PS_GetGlyphNameFunc)&cff_sid_to_glyph_name,\n                                   (PS_FreeGlyphNameFunc)NULL,\n                                   (FT_Pointer)face );\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  cff_cmap_unicode_done( PS_Unicodes  unicodes )\n  {\n    FT_Face    face   = FT_CMAP_FACE( unicodes );\n    FT_Memory  memory = FT_FACE_MEMORY( face );\n\n\n    FT_FREE( unicodes->maps );\n    unicodes->num_maps = 0;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  cff_cmap_unicode_char_index( PS_Unicodes  unicodes,\n                               FT_UInt32    char_code )\n  {\n    TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );\n    CFF_Font            cff     = (CFF_Font)face->extra.data;\n    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;\n\n\n    return psnames->unicodes_char_index( unicodes, char_code );\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  cff_cmap_unicode_char_next( PS_Unicodes  unicodes,\n                              FT_UInt32   *pchar_code )\n  {\n    TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );\n    CFF_Font            cff     = (CFF_Font)face->extra.data;\n    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;\n\n\n    return psnames->unicodes_char_next( unicodes, pchar_code );\n  }\n\n\n  FT_DEFINE_CMAP_CLASS(cff_cmap_unicode_class_rec,\n    sizeof ( PS_UnicodesRec ),\n\n    (FT_CMap_InitFunc)     cff_cmap_unicode_init,\n    (FT_CMap_DoneFunc)     cff_cmap_unicode_done,\n    (FT_CMap_CharIndexFunc)cff_cmap_unicode_char_index,\n    (FT_CMap_CharNextFunc) cff_cmap_unicode_char_next,\n\n    NULL, NULL, NULL, NULL, NULL\n  )\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffcmap.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffcmap.h                                                              */\n/*                                                                         */\n/*    CFF character mapping table (cmap) support (specification).          */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2006 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CFFCMAP_H__\n#define __CFFCMAP_H__\n\n#include \"cffobjs.h\"\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****          TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* standard (and expert) encoding cmaps */\n  typedef struct CFF_CMapStdRec_*  CFF_CMapStd;\n\n  typedef struct  CFF_CMapStdRec_\n  {\n    FT_CMapRec  cmap;\n    FT_UShort*  gids;   /* up to 256 elements */\n\n  } CFF_CMapStdRec;\n\n\n  FT_DECLARE_CMAP_CLASS(cff_cmap_encoding_class_rec)\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****               CFF SYNTHETIC UNICODE ENCODING CMAP             *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* unicode (synthetic) cmaps */\n\n  FT_DECLARE_CMAP_CLASS(cff_cmap_unicode_class_rec)\n\n\nFT_END_HEADER\n\n#endif /* __CFFCMAP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffdrivr.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffdrivr.c                                                             */\n/*                                                                         */\n/*    OpenType font driver implementation (body).                          */\n/*                                                                         */\n/*  Copyright 1996-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/freetype.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/internal/sfnt.h\"\n#include \"../../include/freetype/internal/services/svcid.h\"\n#include \"../../include/freetype/internal/services/svpsinfo.h\"\n#include \"../../include/freetype/internal/services/svpostnm.h\"\n#include \"../../include/freetype/internal/services/svttcmap.h\"\n\n#include \"cffdrivr.h\"\n#include \"cffgload.h\"\n#include \"cffload.h\"\n#include \"cffcmap.h\"\n#include \"cffparse.h\"\n\n#include \"cfferrs.h\"\n#include \"cffpic.h\"\n\n#include \"../../include/freetype/internal/services/svxf86nm.h\"\n#include \"../../include/freetype/internal/services/svgldict.h\"\n#include \"../../include/freetype/internal/services/svprop.h\"\n#include \"../../include/freetype/ftcffdrv.h\"\n\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cffdriver\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                          F A C E S                              ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n#undef  PAIR_TAG\n#define PAIR_TAG( left, right )  ( ( (FT_ULong)left << 16 ) | \\\n                                     (FT_ULong)right        )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    cff_get_kerning                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A driver method used to return the kerning vector between two      */\n  /*    glyphs of the same face.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face        :: A handle to the source face object.                 */\n  /*                                                                       */\n  /*    left_glyph  :: The index of the left glyph in the kern pair.       */\n  /*                                                                       */\n  /*    right_glyph :: The index of the right glyph in the kern pair.      */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    kerning     :: The kerning vector.  This is in font units for      */\n  /*                   scalable formats, and in pixels for fixed-sizes     */\n  /*                   formats.                                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Only horizontal layouts (left-to-right & right-to-left) are        */\n  /*    supported by this function.  Other layouts, or more sophisticated  */\n  /*    kernings, are out of scope of this method (the basic driver        */\n  /*    interface is meant to be simple).                                  */\n  /*                                                                       */\n  /*    They can be implemented by format-specific interfaces.             */\n  /*                                                                       */\n  FT_CALLBACK_DEF( FT_Error )\n  cff_get_kerning( FT_Face     ttface,          /* TT_Face */\n                   FT_UInt     left_glyph,\n                   FT_UInt     right_glyph,\n                   FT_Vector*  kerning )\n  {\n    TT_Face       face = (TT_Face)ttface;\n    SFNT_Service  sfnt = (SFNT_Service)face->sfnt;\n\n\n    kerning->x = 0;\n    kerning->y = 0;\n\n    if ( sfnt )\n      kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph );\n\n    return FT_Err_Ok;\n  }\n\n\n#undef PAIR_TAG\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    cff_glyph_load                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A driver method used to load a glyph within a given glyph slot.    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    slot        :: A handle to the target slot object where the glyph  */\n  /*                   will be loaded.                                     */\n  /*                                                                       */\n  /*    size        :: A handle to the source face size at which the glyph */\n  /*                   must be scaled, loaded, etc.                        */\n  /*                                                                       */\n  /*    glyph_index :: The index of the glyph in the font file.            */\n  /*                                                                       */\n  /*    load_flags  :: A flag indicating what to load for this glyph.  The */\n  /*                   FT_LOAD_??? constants can be used to control the    */\n  /*                   glyph loading process (e.g., whether the outline    */\n  /*                   should be scaled, whether to load bitmaps or not,   */\n  /*                   whether to hint the outline, etc).                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_CALLBACK_DEF( FT_Error )\n  cff_glyph_load( FT_GlyphSlot  cffslot,      /* CFF_GlyphSlot */\n                  FT_Size       cffsize,      /* CFF_Size      */\n                  FT_UInt       glyph_index,\n                  FT_Int32      load_flags )\n  {\n    FT_Error       error;\n    CFF_GlyphSlot  slot = (CFF_GlyphSlot)cffslot;\n    CFF_Size       size = (CFF_Size)cffsize;\n\n\n    if ( !slot )\n      return FT_THROW( Invalid_Slot_Handle );\n\n    /* check whether we want a scaled outline or bitmap */\n    if ( !size )\n      load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;\n\n    /* reset the size object if necessary */\n    if ( load_flags & FT_LOAD_NO_SCALE )\n      size = NULL;\n\n    if ( size )\n    {\n      /* these two objects must have the same parent */\n      if ( cffsize->face != cffslot->face )\n        return FT_THROW( Invalid_Face_Handle );\n    }\n\n    /* now load the glyph outline if necessary */\n    error = cff_slot_load( slot, size, glyph_index, load_flags );\n\n    /* force drop-out mode to 2 - irrelevant now */\n    /* slot->outline.dropout_mode = 2; */\n\n    return error;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  cff_get_advances( FT_Face    face,\n                    FT_UInt    start,\n                    FT_UInt    count,\n                    FT_Int32   flags,\n                    FT_Fixed*  advances )\n  {\n    FT_UInt       nn;\n    FT_Error      error = FT_Err_Ok;\n    FT_GlyphSlot  slot  = face->glyph;\n\n\n    flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY;\n\n    for ( nn = 0; nn < count; nn++ )\n    {\n      error = cff_glyph_load( slot, face->size, start + nn, flags );\n      if ( error )\n        break;\n\n      advances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT )\n                     ? slot->linearVertAdvance\n                     : slot->linearHoriAdvance;\n    }\n\n    return error;\n  }\n\n\n  /*\n   *  GLYPH DICT SERVICE\n   *\n   */\n\n  static FT_Error\n  cff_get_glyph_name( CFF_Face    face,\n                      FT_UInt     glyph_index,\n                      FT_Pointer  buffer,\n                      FT_UInt     buffer_max )\n  {\n    CFF_Font    font   = (CFF_Font)face->extra.data;\n    FT_String*  gname;\n    FT_UShort   sid;\n    FT_Error    error;\n\n\n    if ( !font->psnames )\n    {\n      FT_ERROR(( \"cff_get_glyph_name:\"\n                 \" cannot get glyph name from CFF & CEF fonts\\n\"\n                 \"                   \"\n                 \" without the `PSNames' module\\n\" ));\n      error = FT_THROW( Missing_Module );\n      goto Exit;\n    }\n\n    /* first, locate the sid in the charset table */\n    sid = font->charset.sids[glyph_index];\n\n    /* now, lookup the name itself */\n    gname = cff_index_get_sid_string( font, sid );\n\n    if ( gname )\n      FT_STRCPYN( buffer, gname, buffer_max );\n\n    error = FT_Err_Ok;\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_UInt\n  cff_get_name_index( CFF_Face    face,\n                      FT_String*  glyph_name )\n  {\n    CFF_Font            cff;\n    CFF_Charset         charset;\n    FT_Service_PsCMaps  psnames;\n    FT_String*          name;\n    FT_UShort           sid;\n    FT_UInt             i;\n\n\n    cff     = (CFF_FontRec *)face->extra.data;\n    charset = &cff->charset;\n\n    FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );\n    if ( !psnames )\n      return 0;\n\n    for ( i = 0; i < cff->num_glyphs; i++ )\n    {\n      sid = charset->sids[i];\n\n      if ( sid > 390 )\n        name = cff_index_get_string( cff, sid - 391 );\n      else\n        name = (FT_String *)psnames->adobe_std_strings( sid );\n\n      if ( !name )\n        continue;\n\n      if ( !ft_strcmp( glyph_name, name ) )\n        return i;\n    }\n\n    return 0;\n  }\n\n\n  FT_DEFINE_SERVICE_GLYPHDICTREC(\n    cff_service_glyph_dict,\n    (FT_GlyphDict_GetNameFunc)  cff_get_glyph_name,\n    (FT_GlyphDict_NameIndexFunc)cff_get_name_index\n  )\n\n\n  /*\n   *  POSTSCRIPT INFO SERVICE\n   *\n   */\n\n  static FT_Int\n  cff_ps_has_glyph_names( FT_Face  face )\n  {\n    return ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) > 0;\n  }\n\n\n  static FT_Error\n  cff_ps_get_font_info( CFF_Face         face,\n                        PS_FontInfoRec*  afont_info )\n  {\n    CFF_Font  cff   = (CFF_Font)face->extra.data;\n    FT_Error  error = FT_Err_Ok;\n\n\n    if ( cff && cff->font_info == NULL )\n    {\n      CFF_FontRecDict  dict   = &cff->top_font.font_dict;\n      PS_FontInfoRec  *font_info = NULL;\n      FT_Memory        memory = face->root.memory;\n\n\n      if ( FT_ALLOC( font_info, sizeof ( *font_info ) ) )\n        goto Fail;\n\n      font_info->version     = cff_index_get_sid_string( cff,\n                                                         dict->version );\n      font_info->notice      = cff_index_get_sid_string( cff,\n                                                         dict->notice );\n      font_info->full_name   = cff_index_get_sid_string( cff,\n                                                         dict->full_name );\n      font_info->family_name = cff_index_get_sid_string( cff,\n                                                         dict->family_name );\n      font_info->weight      = cff_index_get_sid_string( cff,\n                                                         dict->weight );\n      font_info->italic_angle        = dict->italic_angle;\n      font_info->is_fixed_pitch      = dict->is_fixed_pitch;\n      font_info->underline_position  = (FT_Short)dict->underline_position;\n      font_info->underline_thickness = (FT_Short)dict->underline_thickness;\n\n      cff->font_info = font_info;\n    }\n\n    if ( cff )\n      *afont_info = *cff->font_info;\n\n  Fail:\n    return error;\n  }\n\n\n  FT_DEFINE_SERVICE_PSINFOREC(\n    cff_service_ps_info,\n    (PS_GetFontInfoFunc)   cff_ps_get_font_info,\n    (PS_GetFontExtraFunc)  NULL,\n    (PS_HasGlyphNamesFunc) cff_ps_has_glyph_names,\n    (PS_GetFontPrivateFunc)NULL,        /* unsupported with CFF fonts */\n    (PS_GetFontValueFunc)  NULL         /* not implemented            */\n  )\n\n\n  /*\n   *  POSTSCRIPT NAME SERVICE\n   *\n   */\n\n  static const char*\n  cff_get_ps_name( CFF_Face  face )\n  {\n    CFF_Font  cff = (CFF_Font)face->extra.data;\n\n\n    return (const char*)cff->font_name;\n  }\n\n\n  FT_DEFINE_SERVICE_PSFONTNAMEREC(\n    cff_service_ps_name,\n    (FT_PsName_GetFunc)cff_get_ps_name\n  )\n\n\n  /*\n   * TT CMAP INFO\n   *\n   * If the charmap is a synthetic Unicode encoding cmap or\n   * a Type 1 standard (or expert) encoding cmap, hide TT CMAP INFO\n   * service defined in SFNT module.\n   *\n   * Otherwise call the service function in the sfnt module.\n   *\n   */\n  static FT_Error\n  cff_get_cmap_info( FT_CharMap    charmap,\n                     TT_CMapInfo  *cmap_info )\n  {\n    FT_CMap   cmap  = FT_CMAP( charmap );\n    FT_Error  error = FT_Err_Ok;\n\n    FT_Face     face    = FT_CMAP_FACE( cmap );\n    FT_Library  library = FT_FACE_LIBRARY( face );\n\n\n    cmap_info->language = 0;\n    cmap_info->format   = 0;\n\n    if ( cmap->clazz != &CFF_CMAP_ENCODING_CLASS_REC_GET &&\n         cmap->clazz != &CFF_CMAP_UNICODE_CLASS_REC_GET  )\n    {\n      FT_Module           sfnt    = FT_Get_Module( library, \"sfnt\" );\n      FT_Service_TTCMaps  service =\n        (FT_Service_TTCMaps)ft_module_get_service( sfnt,\n                                                   FT_SERVICE_ID_TT_CMAP );\n\n\n      if ( service && service->get_cmap_info )\n        error = service->get_cmap_info( charmap, cmap_info );\n    }\n\n    return error;\n  }\n\n\n  FT_DEFINE_SERVICE_TTCMAPSREC(\n    cff_service_get_cmap_info,\n    (TT_CMap_Info_GetFunc)cff_get_cmap_info\n  )\n\n\n  /*\n   *  CID INFO SERVICE\n   *\n   */\n  static FT_Error\n  cff_get_ros( CFF_Face      face,\n               const char*  *registry,\n               const char*  *ordering,\n               FT_Int       *supplement )\n  {\n    FT_Error  error = FT_Err_Ok;\n    CFF_Font  cff   = (CFF_Font)face->extra.data;\n\n\n    if ( cff )\n    {\n      CFF_FontRecDict  dict = &cff->top_font.font_dict;\n\n\n      if ( dict->cid_registry == 0xFFFFU )\n      {\n        error = FT_THROW( Invalid_Argument );\n        goto Fail;\n      }\n\n      if ( registry )\n      {\n        if ( cff->registry == NULL )\n          cff->registry = cff_index_get_sid_string( cff,\n                                                    dict->cid_registry );\n        *registry = cff->registry;\n      }\n\n      if ( ordering )\n      {\n        if ( cff->ordering == NULL )\n          cff->ordering = cff_index_get_sid_string( cff,\n                                                    dict->cid_ordering );\n        *ordering = cff->ordering;\n      }\n\n      /*\n       * XXX: According to Adobe TechNote #5176, the supplement in CFF\n       *      can be a real number. We truncate it to fit public API\n       *      since freetype-2.3.6.\n       */\n      if ( supplement )\n      {\n        if ( dict->cid_supplement < FT_INT_MIN ||\n             dict->cid_supplement > FT_INT_MAX )\n          FT_TRACE1(( \"cff_get_ros: too large supplement %d is truncated\\n\",\n                      dict->cid_supplement ));\n        *supplement = (FT_Int)dict->cid_supplement;\n      }\n    }\n\n  Fail:\n    return error;\n  }\n\n\n  static FT_Error\n  cff_get_is_cid( CFF_Face  face,\n                  FT_Bool  *is_cid )\n  {\n    FT_Error  error = FT_Err_Ok;\n    CFF_Font  cff   = (CFF_Font)face->extra.data;\n\n\n    *is_cid = 0;\n\n    if ( cff )\n    {\n      CFF_FontRecDict  dict = &cff->top_font.font_dict;\n\n\n      if ( dict->cid_registry != 0xFFFFU )\n        *is_cid = 1;\n    }\n\n    return error;\n  }\n\n\n  static FT_Error\n  cff_get_cid_from_glyph_index( CFF_Face  face,\n                                FT_UInt   glyph_index,\n                                FT_UInt  *cid )\n  {\n    FT_Error  error = FT_Err_Ok;\n    CFF_Font  cff;\n\n\n    cff = (CFF_Font)face->extra.data;\n\n    if ( cff )\n    {\n      FT_UInt          c;\n      CFF_FontRecDict  dict = &cff->top_font.font_dict;\n\n\n      if ( dict->cid_registry == 0xFFFFU )\n      {\n        error = FT_THROW( Invalid_Argument );\n        goto Fail;\n      }\n\n      if ( glyph_index > cff->num_glyphs )\n      {\n        error = FT_THROW( Invalid_Argument );\n        goto Fail;\n      }\n\n      c = cff->charset.sids[glyph_index];\n\n      if ( cid )\n        *cid = c;\n    }\n\n  Fail:\n    return error;\n  }\n\n\n  FT_DEFINE_SERVICE_CIDREC(\n    cff_service_cid_info,\n    (FT_CID_GetRegistryOrderingSupplementFunc)cff_get_ros,\n    (FT_CID_GetIsInternallyCIDKeyedFunc)      cff_get_is_cid,\n    (FT_CID_GetCIDFromGlyphIndexFunc)         cff_get_cid_from_glyph_index\n  )\n\n\n  /*\n   *  PROPERTY SERVICE\n   *\n   */\n  static FT_Error\n  cff_property_set( FT_Module    module,         /* CFF_Driver */\n                    const char*  property_name,\n                    const void*  value )\n  {\n    FT_Error    error  = FT_Err_Ok;\n    CFF_Driver  driver = (CFF_Driver)module;\n\n\n    if ( !ft_strcmp( property_name, \"hinting-engine\" ) )\n    {\n      FT_UInt*  hinting_engine = (FT_UInt*)value;\n\n\n#ifndef CFF_CONFIG_OPTION_OLD_ENGINE\n      if ( *hinting_engine != FT_CFF_HINTING_ADOBE )\n        error = FT_ERR( Unimplemented_Feature );\n      else\n#endif\n        driver->hinting_engine = *hinting_engine;\n\n      return error;\n    }\n    else if ( !ft_strcmp( property_name, \"no-stem-darkening\" ) )\n    {\n      FT_Bool*  no_stem_darkening = (FT_Bool*)value;\n\n\n      driver->no_stem_darkening = *no_stem_darkening;\n\n      return error;\n    }\n\n    FT_TRACE0(( \"cff_property_set: missing property `%s'\\n\",\n                property_name ));\n    return FT_THROW( Missing_Property );\n  }\n\n\n  static FT_Error\n  cff_property_get( FT_Module    module,         /* CFF_Driver */\n                    const char*  property_name,\n                    const void*  value )\n  {\n    FT_Error    error  = FT_Err_Ok;\n    CFF_Driver  driver = (CFF_Driver)module;\n\n    FT_UInt  hinting_engine    = driver->hinting_engine;\n    FT_Bool  no_stem_darkening = driver->no_stem_darkening;\n\n\n    if ( !ft_strcmp( property_name, \"hinting-engine\" ) )\n    {\n      FT_UInt*  val = (FT_UInt*)value;\n\n\n      *val = hinting_engine;\n\n      return error;\n    }\n    else if ( !ft_strcmp( property_name, \"no-stem-darkening\" ) )\n    {\n      FT_Bool*  val = (FT_Bool*)value;\n\n\n      *val = no_stem_darkening;\n\n      return error;\n    }\n\n    FT_TRACE0(( \"cff_property_get: missing property `%s'\\n\",\n                property_name ));\n    return FT_THROW( Missing_Property );\n  }\n\n\n  FT_DEFINE_SERVICE_PROPERTIESREC(\n    cff_service_properties,\n    (FT_Properties_SetFunc)cff_property_set,\n    (FT_Properties_GetFunc)cff_property_get )\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                D R I V E R  I N T E R F A C E                   ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES\n  FT_DEFINE_SERVICEDESCREC7(\n    cff_services,\n    FT_SERVICE_ID_XF86_NAME,            FT_XF86_FORMAT_CFF,\n    FT_SERVICE_ID_POSTSCRIPT_INFO,      &CFF_SERVICE_PS_INFO_GET,\n    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET,\n    FT_SERVICE_ID_GLYPH_DICT,           &CFF_SERVICE_GLYPH_DICT_GET,\n    FT_SERVICE_ID_TT_CMAP,              &CFF_SERVICE_GET_CMAP_INFO_GET,\n    FT_SERVICE_ID_CID,                  &CFF_SERVICE_CID_INFO_GET,\n    FT_SERVICE_ID_PROPERTIES,           &CFF_SERVICE_PROPERTIES_GET\n  )\n#else\n  FT_DEFINE_SERVICEDESCREC6(\n    cff_services,\n    FT_SERVICE_ID_XF86_NAME,            FT_XF86_FORMAT_CFF,\n    FT_SERVICE_ID_POSTSCRIPT_INFO,      &CFF_SERVICE_PS_INFO_GET,\n    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET,\n    FT_SERVICE_ID_TT_CMAP,              &CFF_SERVICE_GET_CMAP_INFO_GET,\n    FT_SERVICE_ID_CID,                  &CFF_SERVICE_CID_INFO_GET,\n    FT_SERVICE_ID_PROPERTIES,           &CFF_SERVICE_PROPERTIES_GET\n  )\n#endif\n\n\n  FT_CALLBACK_DEF( FT_Module_Interface )\n  cff_get_interface( FT_Module    driver,       /* CFF_Driver */\n                     const char*  module_interface )\n  {\n    FT_Library           library;\n    FT_Module            sfnt;\n    FT_Module_Interface  result;\n\n\n    /* CFF_SERVICES_GET derefers `library' in PIC mode */\n#ifdef FT_CONFIG_OPTION_PIC\n    if ( !driver )\n      return NULL;\n    library = driver->library;\n    if ( !library )\n      return NULL;\n#endif\n\n    result = ft_service_list_lookup( CFF_SERVICES_GET, module_interface );\n    if ( result != NULL )\n      return result;\n\n    /* `driver' is not yet evaluated in non-PIC mode */\n#ifndef FT_CONFIG_OPTION_PIC\n    if ( !driver )\n      return NULL;\n    library = driver->library;\n    if ( !library )\n      return NULL;\n#endif\n\n    /* we pass our request to the `sfnt' module */\n    sfnt = FT_Get_Module( library, \"sfnt\" );\n\n    return sfnt ? sfnt->clazz->get_interface( sfnt, module_interface ) : 0;\n  }\n\n\n  /* The FT_DriverInterface structure is defined in ftdriver.h. */\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n#define CFF_SIZE_SELECT cff_size_select\n#else\n#define CFF_SIZE_SELECT 0\n#endif\n\n  FT_DEFINE_DRIVER(\n    cff_driver_class,\n\n      FT_MODULE_FONT_DRIVER       |\n      FT_MODULE_DRIVER_SCALABLE   |\n      FT_MODULE_DRIVER_HAS_HINTER,\n\n      sizeof ( CFF_DriverRec ),\n      \"cff\",\n      0x10000L,\n      0x20000L,\n\n      0,   /* module-specific interface */\n\n      cff_driver_init,\n      cff_driver_done,\n      cff_get_interface,\n\n    /* now the specific driver fields */\n    sizeof ( TT_FaceRec ),\n    sizeof ( CFF_SizeRec ),\n    sizeof ( CFF_GlyphSlotRec ),\n\n    cff_face_init,\n    cff_face_done,\n    cff_size_init,\n    cff_size_done,\n    cff_slot_init,\n    cff_slot_done,\n\n    cff_glyph_load,\n\n    cff_get_kerning,\n    0,                       /* FT_Face_AttachFunc */\n    cff_get_advances,\n\n    cff_size_request,\n\n    CFF_SIZE_SELECT\n  )\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffdrivr.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffdrivr.h                                                             */\n/*                                                                         */\n/*    High-level OpenType driver interface (specification).                */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CFFDRIVER_H__\n#define __CFFDRIVER_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdriver.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  FT_DECLARE_DRIVER( cff_driver_class )\n\n\nFT_END_HEADER\n\n#endif /* __CFFDRIVER_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfferrs.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cfferrs.h                                                              */\n/*                                                                         */\n/*    CFF error codes (specification only).                                */\n/*                                                                         */\n/*  Copyright 2001, 2012 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the CFF error enumeration constants.      */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __CFFERRS_H__\n#define __CFFERRS_H__\n\n#include \"../../include/freetype/ftmoderr.h\"\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  CFF_Err_\n#define FT_ERR_BASE    FT_Mod_Err_CFF\n\n\n#include \"../../include/freetype/fterrors.h\"\n\n#endif /* __CFFERRS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffgload.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffgload.c                                                             */\n/*                                                                         */\n/*    OpenType Glyph Loader (body).                                        */\n/*                                                                         */\n/*  Copyright 1996-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/internal/sfnt.h\"\n#include \"../../include/freetype/ftoutln.h\"\n#include \"../../include/freetype/ftcffdrv.h\"\n\n#include \"cffobjs.h\"\n#include \"cffload.h\"\n#include \"cffgload.h\"\n#include \"cf2ft.h\"      /* for cf2_decoder_parse_charstrings */\n\n#include \"cfferrs.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cffgload\n\n\n#ifdef CFF_CONFIG_OPTION_OLD_ENGINE\n\n  typedef enum  CFF_Operator_\n  {\n    cff_op_unknown = 0,\n\n    cff_op_rmoveto,\n    cff_op_hmoveto,\n    cff_op_vmoveto,\n\n    cff_op_rlineto,\n    cff_op_hlineto,\n    cff_op_vlineto,\n\n    cff_op_rrcurveto,\n    cff_op_hhcurveto,\n    cff_op_hvcurveto,\n    cff_op_rcurveline,\n    cff_op_rlinecurve,\n    cff_op_vhcurveto,\n    cff_op_vvcurveto,\n\n    cff_op_flex,\n    cff_op_hflex,\n    cff_op_hflex1,\n    cff_op_flex1,\n\n    cff_op_endchar,\n\n    cff_op_hstem,\n    cff_op_vstem,\n    cff_op_hstemhm,\n    cff_op_vstemhm,\n\n    cff_op_hintmask,\n    cff_op_cntrmask,\n    cff_op_dotsection,  /* deprecated, acts as no-op */\n\n    cff_op_abs,\n    cff_op_add,\n    cff_op_sub,\n    cff_op_div,\n    cff_op_neg,\n    cff_op_random,\n    cff_op_mul,\n    cff_op_sqrt,\n\n    cff_op_blend,\n\n    cff_op_drop,\n    cff_op_exch,\n    cff_op_index,\n    cff_op_roll,\n    cff_op_dup,\n\n    cff_op_put,\n    cff_op_get,\n    cff_op_store,\n    cff_op_load,\n\n    cff_op_and,\n    cff_op_or,\n    cff_op_not,\n    cff_op_eq,\n    cff_op_ifelse,\n\n    cff_op_callsubr,\n    cff_op_callgsubr,\n    cff_op_return,\n\n    /* Type 1 opcodes: invalid but seen in real life */\n    cff_op_hsbw,\n    cff_op_closepath,\n    cff_op_callothersubr,\n    cff_op_pop,\n    cff_op_seac,\n    cff_op_sbw,\n    cff_op_setcurrentpoint,\n\n    /* do not remove */\n    cff_op_max\n\n  } CFF_Operator;\n\n\n#define CFF_COUNT_CHECK_WIDTH  0x80\n#define CFF_COUNT_EXACT        0x40\n#define CFF_COUNT_CLEAR_STACK  0x20\n\n  /* count values which have the `CFF_COUNT_CHECK_WIDTH' flag set are  */\n  /* used for checking the width and requested numbers of arguments    */\n  /* only; they are set to zero afterwards                             */\n\n  /* the other two flags are informative only and unused currently     */\n\n  static const FT_Byte  cff_argument_counts[] =\n  {\n    0,  /* unknown */\n\n    2 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, /* rmoveto */\n    1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT,\n    1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT,\n\n    0 | CFF_COUNT_CLEAR_STACK, /* rlineto */\n    0 | CFF_COUNT_CLEAR_STACK,\n    0 | CFF_COUNT_CLEAR_STACK,\n\n    0 | CFF_COUNT_CLEAR_STACK, /* rrcurveto */\n    0 | CFF_COUNT_CLEAR_STACK,\n    0 | CFF_COUNT_CLEAR_STACK,\n    0 | CFF_COUNT_CLEAR_STACK,\n    0 | CFF_COUNT_CLEAR_STACK,\n    0 | CFF_COUNT_CLEAR_STACK,\n    0 | CFF_COUNT_CLEAR_STACK,\n\n    13, /* flex */\n    7,\n    9,\n    11,\n\n    0 | CFF_COUNT_CHECK_WIDTH, /* endchar */\n\n    2 | CFF_COUNT_CHECK_WIDTH, /* hstem */\n    2 | CFF_COUNT_CHECK_WIDTH,\n    2 | CFF_COUNT_CHECK_WIDTH,\n    2 | CFF_COUNT_CHECK_WIDTH,\n\n    0 | CFF_COUNT_CHECK_WIDTH, /* hintmask */\n    0 | CFF_COUNT_CHECK_WIDTH, /* cntrmask */\n    0, /* dotsection */\n\n    1, /* abs */\n    2,\n    2,\n    2,\n    1,\n    0,\n    2,\n    1,\n\n    1, /* blend */\n\n    1, /* drop */\n    2,\n    1,\n    2,\n    1,\n\n    2, /* put */\n    1,\n    4,\n    3,\n\n    2, /* and */\n    2,\n    1,\n    2,\n    4,\n\n    1, /* callsubr */\n    1,\n    0,\n\n    2, /* hsbw */\n    0,\n    0,\n    0,\n    5, /* seac */\n    4, /* sbw */\n    2  /* setcurrentpoint */\n  };\n\n#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /**********                                                      *********/\n  /**********                                                      *********/\n  /**********             GENERIC CHARSTRING PARSING               *********/\n  /**********                                                      *********/\n  /**********                                                      *********/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    cff_builder_init                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initializes a given glyph builder.                                 */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    builder :: A pointer to the glyph builder to initialize.           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face    :: The current face object.                                */\n  /*                                                                       */\n  /*    size    :: The current size object.                                */\n  /*                                                                       */\n  /*    glyph   :: The current glyph object.                               */\n  /*                                                                       */\n  /*    hinting :: Whether hinting is active.                              */\n  /*                                                                       */\n  static void\n  cff_builder_init( CFF_Builder*   builder,\n                    TT_Face        face,\n                    CFF_Size       size,\n                    CFF_GlyphSlot  glyph,\n                    FT_Bool        hinting )\n  {\n    builder->path_begun  = 0;\n    builder->load_points = 1;\n\n    builder->face   = face;\n    builder->glyph  = glyph;\n    builder->memory = face->root.memory;\n\n    if ( glyph )\n    {\n      FT_GlyphLoader  loader = glyph->root.internal->loader;\n\n\n      builder->loader  = loader;\n      builder->base    = &loader->base.outline;\n      builder->current = &loader->current.outline;\n      FT_GlyphLoader_Rewind( loader );\n\n      builder->hints_globals = 0;\n      builder->hints_funcs   = 0;\n\n      if ( hinting && size )\n      {\n        CFF_Internal  internal = (CFF_Internal)size->root.internal;\n\n\n        builder->hints_globals = (void *)internal->topfont;\n        builder->hints_funcs   = glyph->root.internal->glyph_hints;\n      }\n    }\n\n    builder->pos_x = 0;\n    builder->pos_y = 0;\n\n    builder->left_bearing.x = 0;\n    builder->left_bearing.y = 0;\n    builder->advance.x      = 0;\n    builder->advance.y      = 0;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    cff_builder_done                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Finalizes a given glyph builder.  Its contents can still be used   */\n  /*    after the call, but the function saves important information       */\n  /*    within the corresponding glyph slot.                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    builder :: A pointer to the glyph builder to finalize.             */\n  /*                                                                       */\n  static void\n  cff_builder_done( CFF_Builder*  builder )\n  {\n    CFF_GlyphSlot  glyph = builder->glyph;\n\n\n    if ( glyph )\n      glyph->root.outline = *builder->base;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    cff_compute_bias                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Computes the bias value in dependence of the number of glyph       */\n  /*    subroutines.                                                       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    in_charstring_type :: The `CharstringType' value of the top DICT   */\n  /*                          dictionary.                                  */\n  /*                                                                       */\n  /*    num_subrs          :: The number of glyph subroutines.             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The bias value.                                                    */\n  static FT_Int\n  cff_compute_bias( FT_Int   in_charstring_type,\n                    FT_UInt  num_subrs )\n  {\n    FT_Int  result;\n\n\n    if ( in_charstring_type == 1 )\n      result = 0;\n    else if ( num_subrs < 1240 )\n      result = 107;\n    else if ( num_subrs < 33900U )\n      result = 1131;\n    else\n      result = 32768U;\n\n    return result;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    cff_decoder_init                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initializes a given glyph decoder.                                 */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    decoder :: A pointer to the glyph builder to initialize.           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face      :: The current face object.                              */\n  /*                                                                       */\n  /*    size      :: The current size object.                              */\n  /*                                                                       */\n  /*    slot      :: The current glyph object.                             */\n  /*                                                                       */\n  /*    hinting   :: Whether hinting is active.                            */\n  /*                                                                       */\n  /*    hint_mode :: The hinting mode.                                     */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  cff_decoder_init( CFF_Decoder*    decoder,\n                    TT_Face         face,\n                    CFF_Size        size,\n                    CFF_GlyphSlot   slot,\n                    FT_Bool         hinting,\n                    FT_Render_Mode  hint_mode )\n  {\n    CFF_Font  cff = (CFF_Font)face->extra.data;\n\n\n    /* clear everything */\n    FT_MEM_ZERO( decoder, sizeof ( *decoder ) );\n\n    /* initialize builder */\n    cff_builder_init( &decoder->builder, face, size, slot, hinting );\n\n    /* initialize Type2 decoder */\n    decoder->cff          = cff;\n    decoder->num_globals  = cff->global_subrs_index.count;\n    decoder->globals      = cff->global_subrs;\n    decoder->globals_bias = cff_compute_bias(\n                              cff->top_font.font_dict.charstring_type,\n                              decoder->num_globals );\n\n    decoder->hint_mode    = hint_mode;\n  }\n\n\n  /* this function is used to select the subfont */\n  /* and the locals subrs array                  */\n  FT_LOCAL_DEF( FT_Error )\n  cff_decoder_prepare( CFF_Decoder*  decoder,\n                       CFF_Size      size,\n                       FT_UInt       glyph_index )\n  {\n    CFF_Builder  *builder = &decoder->builder;\n    CFF_Font      cff     = (CFF_Font)builder->face->extra.data;\n    CFF_SubFont   sub     = &cff->top_font;\n    FT_Error      error   = FT_Err_Ok;\n\n\n    /* manage CID fonts */\n    if ( cff->num_subfonts )\n    {\n      FT_Byte  fd_index = cff_fd_select_get( &cff->fd_select, glyph_index );\n\n\n      if ( fd_index >= cff->num_subfonts )\n      {\n        FT_TRACE4(( \"cff_decoder_prepare: invalid CID subfont index\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n\n      FT_TRACE3(( \"glyph index %d (subfont %d):\\n\", glyph_index, fd_index ));\n\n      sub = cff->subfonts[fd_index];\n\n      if ( builder->hints_funcs && size )\n      {\n        CFF_Internal  internal = (CFF_Internal)size->root.internal;\n\n\n        /* for CFFs without subfonts, this value has already been set */\n        builder->hints_globals = (void *)internal->subfonts[fd_index];\n      }\n    }\n#ifdef FT_DEBUG_LEVEL_TRACE\n    else\n      FT_TRACE3(( \"glyph index %d:\\n\", glyph_index ));\n#endif\n\n    decoder->num_locals    = sub->local_subrs_index.count;\n    decoder->locals        = sub->local_subrs;\n    decoder->locals_bias   = cff_compute_bias(\n                               decoder->cff->top_font.font_dict.charstring_type,\n                               decoder->num_locals );\n\n    decoder->glyph_width   = sub->private_dict.default_width;\n    decoder->nominal_width = sub->private_dict.nominal_width;\n\n    decoder->current_subfont = sub;     /* for Adobe's CFF handler */\n\n  Exit:\n    return error;\n  }\n\n\n  /* check that there is enough space for `count' more points */\n  FT_LOCAL_DEF( FT_Error )\n  cff_check_points( CFF_Builder*  builder,\n                    FT_Int        count )\n  {\n    return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 );\n  }\n\n\n  /* add a new point, do not check space */\n  FT_LOCAL_DEF( void )\n  cff_builder_add_point( CFF_Builder*  builder,\n                         FT_Pos        x,\n                         FT_Pos        y,\n                         FT_Byte       flag )\n  {\n    FT_Outline*  outline = builder->current;\n\n\n    if ( builder->load_points )\n    {\n      FT_Vector*  point   = outline->points + outline->n_points;\n      FT_Byte*    control = (FT_Byte*)outline->tags + outline->n_points;\n\n#ifdef CFF_CONFIG_OPTION_OLD_ENGINE\n      CFF_Driver  driver  = (CFF_Driver)FT_FACE_DRIVER( builder->face );\n\n\n      if ( driver->hinting_engine == FT_CFF_HINTING_FREETYPE )\n      {\n        point->x = x >> 16;\n        point->y = y >> 16;\n      }\n      else\n#endif\n      {\n        /* cf2_decoder_parse_charstrings uses 16.16 coordinates */\n        point->x = x >> 10;\n        point->y = y >> 10;\n      }\n      *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC );\n    }\n\n    outline->n_points++;\n  }\n\n\n  /* check space for a new on-curve point, then add it */\n  FT_LOCAL_DEF( FT_Error )\n  cff_builder_add_point1( CFF_Builder*  builder,\n                          FT_Pos        x,\n                          FT_Pos        y )\n  {\n    FT_Error  error;\n\n\n    error = cff_check_points( builder, 1 );\n    if ( !error )\n      cff_builder_add_point( builder, x, y, 1 );\n\n    return error;\n  }\n\n\n  /* check space for a new contour, then add it */\n  static FT_Error\n  cff_builder_add_contour( CFF_Builder*  builder )\n  {\n    FT_Outline*  outline = builder->current;\n    FT_Error     error;\n\n\n    if ( !builder->load_points )\n    {\n      outline->n_contours++;\n      return FT_Err_Ok;\n    }\n\n    error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 );\n    if ( !error )\n    {\n      if ( outline->n_contours > 0 )\n        outline->contours[outline->n_contours - 1] =\n          (short)( outline->n_points - 1 );\n\n      outline->n_contours++;\n    }\n\n    return error;\n  }\n\n\n  /* if a path was begun, add its first on-curve point */\n  FT_LOCAL_DEF( FT_Error )\n  cff_builder_start_point( CFF_Builder*  builder,\n                           FT_Pos        x,\n                           FT_Pos        y )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    /* test whether we are building a new contour */\n    if ( !builder->path_begun )\n    {\n      builder->path_begun = 1;\n      error = cff_builder_add_contour( builder );\n      if ( !error )\n        error = cff_builder_add_point1( builder, x, y );\n    }\n\n    return error;\n  }\n\n\n  /* close the current contour */\n  FT_LOCAL_DEF( void )\n  cff_builder_close_contour( CFF_Builder*  builder )\n  {\n    FT_Outline*  outline = builder->current;\n    FT_Int       first;\n\n\n    if ( !outline )\n      return;\n\n    first = outline->n_contours <= 1\n            ? 0 : outline->contours[outline->n_contours - 2] + 1;\n\n    /* We must not include the last point in the path if it */\n    /* is located on the first point.                       */\n    if ( outline->n_points > 1 )\n    {\n      FT_Vector*  p1      = outline->points + first;\n      FT_Vector*  p2      = outline->points + outline->n_points - 1;\n      FT_Byte*    control = (FT_Byte*)outline->tags + outline->n_points - 1;\n\n\n      /* `delete' last point only if it coincides with the first    */\n      /* point and if it is not a control point (which can happen). */\n      if ( p1->x == p2->x && p1->y == p2->y )\n        if ( *control == FT_CURVE_TAG_ON )\n          outline->n_points--;\n    }\n\n    if ( outline->n_contours > 0 )\n    {\n      /* Don't add contours only consisting of one point, i.e., */\n      /* check whether begin point and last point are the same. */\n      if ( first == outline->n_points - 1 )\n      {\n        outline->n_contours--;\n        outline->n_points--;\n      }\n      else\n        outline->contours[outline->n_contours - 1] =\n          (short)( outline->n_points - 1 );\n    }\n  }\n\n\n  FT_LOCAL_DEF( FT_Int )\n  cff_lookup_glyph_by_stdcharcode( CFF_Font  cff,\n                                   FT_Int    charcode )\n  {\n    FT_UInt    n;\n    FT_UShort  glyph_sid;\n\n\n    /* CID-keyed fonts don't have glyph names */\n    if ( !cff->charset.sids )\n      return -1;\n\n    /* check range of standard char code */\n    if ( charcode < 0 || charcode > 255 )\n      return -1;\n\n    /* Get code to SID mapping from `cff_standard_encoding'. */\n    glyph_sid = cff_get_standard_encoding( (FT_UInt)charcode );\n\n    for ( n = 0; n < cff->num_glyphs; n++ )\n    {\n      if ( cff->charset.sids[n] == glyph_sid )\n        return n;\n    }\n\n    return -1;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cff_get_glyph_data( TT_Face    face,\n                      FT_UInt    glyph_index,\n                      FT_Byte**  pointer,\n                      FT_ULong*  length )\n  {\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    /* For incremental fonts get the character data using the */\n    /* callback function.                                     */\n    if ( face->root.internal->incremental_interface )\n    {\n      FT_Data   data;\n      FT_Error  error =\n                  face->root.internal->incremental_interface->funcs->get_glyph_data(\n                    face->root.internal->incremental_interface->object,\n                    glyph_index, &data );\n\n\n      *pointer = (FT_Byte*)data.pointer;\n      *length = data.length;\n\n      return error;\n    }\n    else\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n\n    {\n      CFF_Font  cff  = (CFF_Font)(face->extra.data);\n\n\n      return cff_index_access_element( &cff->charstrings_index, glyph_index,\n                                       pointer, length );\n    }\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cff_free_glyph_data( TT_Face    face,\n                       FT_Byte**  pointer,\n                       FT_ULong   length )\n  {\n#ifndef FT_CONFIG_OPTION_INCREMENTAL\n    FT_UNUSED( length );\n#endif\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    /* For incremental fonts get the character data using the */\n    /* callback function.                                     */\n    if ( face->root.internal->incremental_interface )\n    {\n      FT_Data data;\n\n\n      data.pointer = *pointer;\n      data.length  = length;\n\n      face->root.internal->incremental_interface->funcs->free_glyph_data(\n        face->root.internal->incremental_interface->object, &data );\n    }\n    else\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n\n    {\n      CFF_Font  cff = (CFF_Font)(face->extra.data);\n\n\n      cff_index_forget_element( &cff->charstrings_index, pointer );\n    }\n  }\n\n\n#ifdef CFF_CONFIG_OPTION_OLD_ENGINE\n\n  static FT_Error\n  cff_operator_seac( CFF_Decoder*  decoder,\n                     FT_Pos        asb,\n                     FT_Pos        adx,\n                     FT_Pos        ady,\n                     FT_Int        bchar,\n                     FT_Int        achar )\n  {\n    FT_Error      error;\n    CFF_Builder*  builder = &decoder->builder;\n    FT_Int        bchar_index, achar_index;\n    TT_Face       face = decoder->builder.face;\n    FT_Vector     left_bearing, advance;\n    FT_Byte*      charstring;\n    FT_ULong      charstring_len;\n    FT_Pos        glyph_width;\n\n\n    if ( decoder->seac )\n    {\n      FT_ERROR(( \"cff_operator_seac: invalid nested seac\\n\" ));\n      return FT_THROW( Syntax_Error );\n    }\n\n    adx += decoder->builder.left_bearing.x;\n    ady += decoder->builder.left_bearing.y;\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    /* Incremental fonts don't necessarily have valid charsets.        */\n    /* They use the character code, not the glyph index, in this case. */\n    if ( face->root.internal->incremental_interface )\n    {\n      bchar_index = bchar;\n      achar_index = achar;\n    }\n    else\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n    {\n      CFF_Font cff = (CFF_Font)(face->extra.data);\n\n\n      bchar_index = cff_lookup_glyph_by_stdcharcode( cff, bchar );\n      achar_index = cff_lookup_glyph_by_stdcharcode( cff, achar );\n    }\n\n    if ( bchar_index < 0 || achar_index < 0 )\n    {\n      FT_ERROR(( \"cff_operator_seac:\"\n                 \" invalid seac character code arguments\\n\" ));\n      return FT_THROW( Syntax_Error );\n    }\n\n    /* If we are trying to load a composite glyph, do not load the */\n    /* accent character and return the array of subglyphs.         */\n    if ( builder->no_recurse )\n    {\n      FT_GlyphSlot    glyph  = (FT_GlyphSlot)builder->glyph;\n      FT_GlyphLoader  loader = glyph->internal->loader;\n      FT_SubGlyph     subg;\n\n\n      /* reallocate subglyph array if necessary */\n      error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 );\n      if ( error )\n        goto Exit;\n\n      subg = loader->current.subglyphs;\n\n      /* subglyph 0 = base character */\n      subg->index = bchar_index;\n      subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES |\n                    FT_SUBGLYPH_FLAG_USE_MY_METRICS;\n      subg->arg1  = 0;\n      subg->arg2  = 0;\n      subg++;\n\n      /* subglyph 1 = accent character */\n      subg->index = achar_index;\n      subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES;\n      subg->arg1  = (FT_Int)( adx >> 16 );\n      subg->arg2  = (FT_Int)( ady >> 16 );\n\n      /* set up remaining glyph fields */\n      glyph->num_subglyphs = 2;\n      glyph->subglyphs     = loader->base.subglyphs;\n      glyph->format        = FT_GLYPH_FORMAT_COMPOSITE;\n\n      loader->current.num_subglyphs = 2;\n    }\n\n    FT_GlyphLoader_Prepare( builder->loader );\n\n    /* First load `bchar' in builder */\n    error = cff_get_glyph_data( face, bchar_index,\n                                &charstring, &charstring_len );\n    if ( !error )\n    {\n      /* the seac operator must not be nested */\n      decoder->seac = TRUE;\n      error = cff_decoder_parse_charstrings( decoder, charstring,\n                                             charstring_len );\n      decoder->seac = FALSE;\n\n      cff_free_glyph_data( face, &charstring, charstring_len );\n\n      if ( error )\n        goto Exit;\n    }\n\n    /* Save the left bearing, advance and glyph width of the base */\n    /* character as they will be erased by the next load.         */\n\n    left_bearing = builder->left_bearing;\n    advance      = builder->advance;\n    glyph_width  = decoder->glyph_width;\n\n    builder->left_bearing.x = 0;\n    builder->left_bearing.y = 0;\n\n    builder->pos_x = adx - asb;\n    builder->pos_y = ady;\n\n    /* Now load `achar' on top of the base outline. */\n    error = cff_get_glyph_data( face, achar_index,\n                                &charstring, &charstring_len );\n    if ( !error )\n    {\n      /* the seac operator must not be nested */\n      decoder->seac = TRUE;\n      error = cff_decoder_parse_charstrings( decoder, charstring,\n                                             charstring_len );\n      decoder->seac = FALSE;\n\n      cff_free_glyph_data( face, &charstring, charstring_len );\n\n      if ( error )\n        goto Exit;\n    }\n\n    /* Restore the left side bearing, advance and glyph width */\n    /* of the base character.                                 */\n    builder->left_bearing = left_bearing;\n    builder->advance      = advance;\n    decoder->glyph_width  = glyph_width;\n\n    builder->pos_x = 0;\n    builder->pos_y = 0;\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    cff_decoder_parse_charstrings                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Parses a given Type 2 charstrings program.                         */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    decoder         :: The current Type 1 decoder.                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    charstring_base :: The base of the charstring stream.              */\n  /*                                                                       */\n  /*    charstring_len  :: The length in bytes of the charstring stream.   */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  cff_decoder_parse_charstrings( CFF_Decoder*  decoder,\n                                 FT_Byte*      charstring_base,\n                                 FT_ULong      charstring_len )\n  {\n    FT_Error           error;\n    CFF_Decoder_Zone*  zone;\n    FT_Byte*           ip;\n    FT_Byte*           limit;\n    CFF_Builder*       builder = &decoder->builder;\n    FT_Pos             x, y;\n    FT_Fixed           seed;\n    FT_Fixed*          stack;\n    FT_Int             charstring_type =\n                         decoder->cff->top_font.font_dict.charstring_type;\n\n    T2_Hints_Funcs     hinter;\n\n\n    /* set default width */\n    decoder->num_hints  = 0;\n    decoder->read_width = 1;\n\n    /* compute random seed from stack address of parameter */\n    seed = (FT_Fixed)( ( (FT_PtrDist)(char*)&seed              ^\n                         (FT_PtrDist)(char*)&decoder           ^\n                         (FT_PtrDist)(char*)&charstring_base ) &\n                         FT_ULONG_MAX ) ;\n    seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL;\n    if ( seed == 0 )\n      seed = 0x7384;\n\n    /* initialize the decoder */\n    decoder->top  = decoder->stack;\n    decoder->zone = decoder->zones;\n    zone          = decoder->zones;\n    stack         = decoder->top;\n\n    hinter = (T2_Hints_Funcs)builder->hints_funcs;\n\n    builder->path_begun = 0;\n\n    zone->base           = charstring_base;\n    limit = zone->limit  = charstring_base + charstring_len;\n    ip    = zone->cursor = zone->base;\n\n    error = FT_Err_Ok;\n\n    x = builder->pos_x;\n    y = builder->pos_y;\n\n    /* begin hints recording session, if any */\n    if ( hinter )\n      hinter->open( hinter->hints );\n\n    /* now execute loop */\n    while ( ip < limit )\n    {\n      CFF_Operator  op;\n      FT_Byte       v;\n\n\n      /********************************************************************/\n      /*                                                                  */\n      /* Decode operator or operand                                       */\n      /*                                                                  */\n      v = *ip++;\n      if ( v >= 32 || v == 28 )\n      {\n        FT_Int    shift = 16;\n        FT_Int32  val;\n\n\n        /* this is an operand, push it on the stack */\n\n        /* if we use shifts, all computations are done with unsigned */\n        /* values; the conversion to a signed value is the last step */\n        if ( v == 28 )\n        {\n          if ( ip + 1 >= limit )\n            goto Syntax_Error;\n          val = (FT_Short)( ( (FT_UShort)ip[0] << 8 ) | ip[1] );\n          ip += 2;\n        }\n        else if ( v < 247 )\n          val = (FT_Int32)v - 139;\n        else if ( v < 251 )\n        {\n          if ( ip >= limit )\n            goto Syntax_Error;\n          val = ( (FT_Int32)v - 247 ) * 256 + *ip++ + 108;\n        }\n        else if ( v < 255 )\n        {\n          if ( ip >= limit )\n            goto Syntax_Error;\n          val = -( (FT_Int32)v - 251 ) * 256 - *ip++ - 108;\n        }\n        else\n        {\n          if ( ip + 3 >= limit )\n            goto Syntax_Error;\n          val = (FT_Int32)( ( (FT_UInt32)ip[0] << 24 ) |\n                            ( (FT_UInt32)ip[1] << 16 ) |\n                            ( (FT_UInt32)ip[2] <<  8 ) |\n                              (FT_UInt32)ip[3]         );\n          ip    += 4;\n          if ( charstring_type == 2 )\n            shift = 0;\n        }\n        if ( decoder->top - stack >= CFF_MAX_OPERANDS )\n          goto Stack_Overflow;\n\n        val             = (FT_Int32)( (FT_UInt32)val << shift );\n        *decoder->top++ = val;\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n        if ( !( val & 0xFFFFL ) )\n          FT_TRACE4(( \" %hd\", (FT_Short)( (FT_UInt32)val >> 16 ) ));\n        else\n          FT_TRACE4(( \" %.2f\", val / 65536.0 ));\n#endif\n\n      }\n      else\n      {\n        /* The specification says that normally arguments are to be taken */\n        /* from the bottom of the stack.  However, this seems not to be   */\n        /* correct, at least for Acroread 7.0.8 on GNU/Linux: It pops the */\n        /* arguments similar to a PS interpreter.                         */\n\n        FT_Fixed*  args     = decoder->top;\n        FT_Int     num_args = (FT_Int)( args - decoder->stack );\n        FT_Int     req_args;\n\n\n        /* find operator */\n        op = cff_op_unknown;\n\n        switch ( v )\n        {\n        case 1:\n          op = cff_op_hstem;\n          break;\n        case 3:\n          op = cff_op_vstem;\n          break;\n        case 4:\n          op = cff_op_vmoveto;\n          break;\n        case 5:\n          op = cff_op_rlineto;\n          break;\n        case 6:\n          op = cff_op_hlineto;\n          break;\n        case 7:\n          op = cff_op_vlineto;\n          break;\n        case 8:\n          op = cff_op_rrcurveto;\n          break;\n        case 9:\n          op = cff_op_closepath;\n          break;\n        case 10:\n          op = cff_op_callsubr;\n          break;\n        case 11:\n          op = cff_op_return;\n          break;\n        case 12:\n          {\n            if ( ip >= limit )\n              goto Syntax_Error;\n            v = *ip++;\n\n            switch ( v )\n            {\n            case 0:\n              op = cff_op_dotsection;\n              break;\n            case 1: /* this is actually the Type1 vstem3 operator */\n              op = cff_op_vstem;\n              break;\n            case 2: /* this is actually the Type1 hstem3 operator */\n              op = cff_op_hstem;\n              break;\n            case 3:\n              op = cff_op_and;\n              break;\n            case 4:\n              op = cff_op_or;\n              break;\n            case 5:\n              op = cff_op_not;\n              break;\n            case 6:\n              op = cff_op_seac;\n              break;\n            case 7:\n              op = cff_op_sbw;\n              break;\n            case 8:\n              op = cff_op_store;\n              break;\n            case 9:\n              op = cff_op_abs;\n              break;\n            case 10:\n              op = cff_op_add;\n              break;\n            case 11:\n              op = cff_op_sub;\n              break;\n            case 12:\n              op = cff_op_div;\n              break;\n            case 13:\n              op = cff_op_load;\n              break;\n            case 14:\n              op = cff_op_neg;\n              break;\n            case 15:\n              op = cff_op_eq;\n              break;\n            case 16:\n              op = cff_op_callothersubr;\n              break;\n            case 17:\n              op = cff_op_pop;\n              break;\n            case 18:\n              op = cff_op_drop;\n              break;\n            case 20:\n              op = cff_op_put;\n              break;\n            case 21:\n              op = cff_op_get;\n              break;\n            case 22:\n              op = cff_op_ifelse;\n              break;\n            case 23:\n              op = cff_op_random;\n              break;\n            case 24:\n              op = cff_op_mul;\n              break;\n            case 26:\n              op = cff_op_sqrt;\n              break;\n            case 27:\n              op = cff_op_dup;\n              break;\n            case 28:\n              op = cff_op_exch;\n              break;\n            case 29:\n              op = cff_op_index;\n              break;\n            case 30:\n              op = cff_op_roll;\n              break;\n            case 33:\n              op = cff_op_setcurrentpoint;\n              break;\n            case 34:\n              op = cff_op_hflex;\n              break;\n            case 35:\n              op = cff_op_flex;\n              break;\n            case 36:\n              op = cff_op_hflex1;\n              break;\n            case 37:\n              op = cff_op_flex1;\n              break;\n            /*default: */  /* XYQ 2007-9-6: we can't just quit if we see some reserved op */\n              /* decrement ip for syntax error message */\n             /* ip--;*/\n            }\n          }\n          break;\n        case 13:\n          op = cff_op_hsbw;\n          break;\n        case 14:\n          op = cff_op_endchar;\n          break;\n        case 16:\n          op = cff_op_blend;\n          break;\n        case 18:\n          op = cff_op_hstemhm;\n          break;\n        case 19:\n          op = cff_op_hintmask;\n          break;\n        case 20:\n          op = cff_op_cntrmask;\n          break;\n        case 21:\n          op = cff_op_rmoveto;\n          break;\n        case 22:\n          op = cff_op_hmoveto;\n          break;\n        case 23:\n          op = cff_op_vstemhm;\n          break;\n        case 24:\n          op = cff_op_rcurveline;\n          break;\n        case 25:\n          op = cff_op_rlinecurve;\n          break;\n        case 26:\n          op = cff_op_vvcurveto;\n          break;\n        case 27:\n          op = cff_op_hhcurveto;\n          break;\n        case 29:\n          op = cff_op_callgsubr;\n          break;\n        case 30:\n          op = cff_op_vhcurveto;\n          break;\n        case 31:\n          op = cff_op_hvcurveto;\n          break;\n        default:\n          FT_TRACE4(( \" unknown op (%d)\\n\", v ));\n          break;\n        }\n\n        if ( op == cff_op_unknown )\n          continue;\n\n        /* check arguments */\n        req_args = cff_argument_counts[op];\n        if ( req_args & CFF_COUNT_CHECK_WIDTH )\n        {\n          if ( num_args > 0 && decoder->read_width )\n          {\n            /* If `nominal_width' is non-zero, the number is really a      */\n            /* difference against `nominal_width'.  Else, the number here  */\n            /* is truly a width, not a difference against `nominal_width'. */\n            /* If the font does not set `nominal_width', then              */\n            /* `nominal_width' defaults to zero, and so we can set         */\n            /* `glyph_width' to `nominal_width' plus number on the stack   */\n            /* -- for either case.                                         */\n\n            FT_Int  set_width_ok;\n\n\n            switch ( op )\n            {\n            case cff_op_hmoveto:\n            case cff_op_vmoveto:\n              set_width_ok = num_args & 2;\n              break;\n\n            case cff_op_hstem:\n            case cff_op_vstem:\n            case cff_op_hstemhm:\n            case cff_op_vstemhm:\n            case cff_op_rmoveto:\n            case cff_op_hintmask:\n            case cff_op_cntrmask:\n              set_width_ok = num_args & 1;\n              break;\n\n            case cff_op_endchar:\n              /* If there is a width specified for endchar, we either have */\n              /* 1 argument or 5 arguments.  We like to argue.             */\n              set_width_ok = ( num_args == 5 ) || ( num_args == 1 );\n              break;\n\n            default:\n              set_width_ok = 0;\n              break;\n            }\n\n            if ( set_width_ok )\n            {\n              decoder->glyph_width = decoder->nominal_width +\n                                       ( stack[0] >> 16 );\n\n              if ( decoder->width_only )\n              {\n                /* we only want the advance width; stop here */\n                break;\n              }\n\n              /* Consumed an argument. */\n              num_args--;\n            }\n          }\n\n          decoder->read_width = 0;\n          req_args            = 0;\n        }\n\n        req_args &= 0x000F;\n        if ( num_args < req_args )\n          goto Stack_Underflow;\n        args     -= req_args;\n        num_args -= req_args;\n\n\t\t/* Sunliang.Liu sync 221's revison. */\n\t\tif (args > decoder->stack + CFF_MAX_OPERANDS)\n\t\t\tgoto Stack_Overflow;\n\n        /* At this point, `args' points to the first argument of the  */\n        /* operand in case `req_args' isn't zero.  Otherwise, we have */\n        /* to adjust `args' manually.                                 */\n\n        /* Note that we only pop arguments from the stack which we    */\n        /* really need and can digest so that we can continue in case */\n        /* of superfluous stack elements.                             */\n\n        switch ( op )\n        {\n        case cff_op_hstem:\n        case cff_op_vstem:\n        case cff_op_hstemhm:\n        case cff_op_vstemhm:\n          /* the number of arguments is always even here */\n          FT_TRACE4((\n              op == cff_op_hstem   ? \" hstem\\n\"   :\n            ( op == cff_op_vstem   ? \" vstem\\n\"   :\n            ( op == cff_op_hstemhm ? \" hstemhm\\n\" : \" vstemhm\\n\" ) ) ));\n\n          if ( hinter )\n            hinter->stems( hinter->hints,\n                           ( op == cff_op_hstem || op == cff_op_hstemhm ),\n                           num_args / 2,\n                           args - ( num_args & ~1 ) );\n\n          decoder->num_hints += num_args / 2;\n          args = stack;\n          break;\n\n        case cff_op_hintmask:\n        case cff_op_cntrmask:\n          FT_TRACE4(( op == cff_op_hintmask ? \" hintmask\" : \" cntrmask\" ));\n\n          /* implement vstem when needed --                        */\n          /* the specification doesn't say it, but this also works */\n          /* with the 'cntrmask' operator                          */\n          /*                                                       */\n          if ( num_args > 0 )\n          {\n            if ( hinter )\n              hinter->stems( hinter->hints,\n                             0,\n                             num_args / 2,\n                             args - ( num_args & ~1 ) );\n\n            decoder->num_hints += num_args / 2;\n          }\n\n          /* In a valid charstring there must be at least one byte */\n          /* after `hintmask' or `cntrmask' (e.g., for a `return'  */\n          /* instruction).  Additionally, there must be space for  */\n          /* `num_hints' bits.                                     */\n\n          if ( ( ip + ( ( decoder->num_hints + 7 ) >> 3 ) ) >= limit )\n            goto Syntax_Error;\n\n          if ( hinter )\n          {\n            if ( op == cff_op_hintmask )\n              hinter->hintmask( hinter->hints,\n                                builder->current->n_points,\n                                decoder->num_hints,\n                                ip );\n            else\n              hinter->counter( hinter->hints,\n                               decoder->num_hints,\n                               ip );\n          }\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n          {\n            FT_UInt maskbyte;\n\n\n            FT_TRACE4(( \" (maskbytes:\" ));\n\n            for ( maskbyte = 0;\n                  maskbyte < (FT_UInt)( ( decoder->num_hints + 7 ) >> 3 );\n                  maskbyte++, ip++ )\n              FT_TRACE4(( \" 0x%02X\", *ip ));\n\n            FT_TRACE4(( \")\\n\" ));\n          }\n#else\n          ip += ( decoder->num_hints + 7 ) >> 3;\n#endif\n          args = stack;\n          break;\n\n        case cff_op_rmoveto:\n          FT_TRACE4(( \" rmoveto\\n\" ));\n\n          cff_builder_close_contour( builder );\n          builder->path_begun = 0;\n          x   += args[-2];\n          y   += args[-1];\n          args = stack;\n          break;\n\n        case cff_op_vmoveto:\n          FT_TRACE4(( \" vmoveto\\n\" ));\n\n          cff_builder_close_contour( builder );\n          builder->path_begun = 0;\n          y   += args[-1];\n          args = stack;\n          break;\n\n        case cff_op_hmoveto:\n          FT_TRACE4(( \" hmoveto\\n\" ));\n\n          cff_builder_close_contour( builder );\n          builder->path_begun = 0;\n          x   += args[-1];\n          args = stack;\n          break;\n\n        case cff_op_rlineto:\n          FT_TRACE4(( \" rlineto\\n\" ));\n\n          if ( cff_builder_start_point( builder, x, y )  ||\n               cff_check_points( builder, num_args / 2 ) )\n            goto Fail;\n\n          if ( num_args < 2 )\n            goto Stack_Underflow;\n\n          args -= num_args & ~1;\n          while ( args < decoder->top )\n          {\n            x += args[0];\n            y += args[1];\n            cff_builder_add_point( builder, x, y, 1 );\n            args += 2;\n          }\n          args = stack;\n          break;\n\n        case cff_op_hlineto:\n        case cff_op_vlineto:\n          {\n            FT_Int  phase = ( op == cff_op_hlineto );\n\n\n            FT_TRACE4(( op == cff_op_hlineto ? \" hlineto\\n\"\n                                             : \" vlineto\\n\" ));\n\n            if ( num_args < 0 )\n              goto Stack_Underflow;\n\n            /* there exist subsetted fonts (found in PDFs) */\n            /* which call `hlineto' without arguments      */\n            if ( num_args == 0 )\n              break;\n\n            if ( cff_builder_start_point( builder, x, y ) ||\n                 cff_check_points( builder, num_args )    )\n              goto Fail;\n\n            args = stack;\n            while ( args < decoder->top )\n            {\n              if ( phase )\n                x += args[0];\n              else\n                y += args[0];\n\n              if ( cff_builder_add_point1( builder, x, y ) )\n                goto Fail;\n\n              args++;\n              phase ^= 1;\n            }\n            args = stack;\n          }\n          break;\n\n        case cff_op_rrcurveto:\n          {\n            FT_Int  nargs;\n\n\n            FT_TRACE4(( \" rrcurveto\\n\" ));\n\n            if ( num_args < 6 )\n              goto Stack_Underflow;\n\n            nargs = num_args - num_args % 6;\n\n            if ( cff_builder_start_point( builder, x, y ) ||\n                 cff_check_points( builder, nargs / 2 )   )\n              goto Fail;\n\n            args -= nargs;\n            while ( args < decoder->top )\n            {\n              x += args[0];\n              y += args[1];\n              cff_builder_add_point( builder, x, y, 0 );\n              x += args[2];\n              y += args[3];\n              cff_builder_add_point( builder, x, y, 0 );\n              x += args[4];\n              y += args[5];\n              cff_builder_add_point( builder, x, y, 1 );\n              args += 6;\n            }\n            args = stack;\n          }\n          break;\n\n        case cff_op_vvcurveto:\n          {\n            FT_Int  nargs;\n\n\n            FT_TRACE4(( \" vvcurveto\\n\" ));\n\n            if ( num_args < 4 )\n              goto Stack_Underflow;\n\n            /* if num_args isn't of the form 4n or 4n+1, */\n            /* we enforce it by clearing the second bit  */\n\n            nargs = num_args & ~2;\n\n            if ( cff_builder_start_point( builder, x, y ) )\n              goto Fail;\n\n            args -= nargs;\n\n            if ( nargs & 1 )\n            {\n              x += args[0];\n              args++;\n              nargs--;\n            }\n\n            if ( cff_check_points( builder, 3 * ( nargs / 4 ) ) )\n              goto Fail;\n\n            while ( args < decoder->top )\n            {\n              y += args[0];\n              cff_builder_add_point( builder, x, y, 0 );\n              x += args[1];\n              y += args[2];\n              cff_builder_add_point( builder, x, y, 0 );\n              y += args[3];\n              cff_builder_add_point( builder, x, y, 1 );\n              args += 4;\n            }\n            args = stack;\n          }\n          break;\n\n        case cff_op_hhcurveto:\n          {\n            FT_Int  nargs;\n\n\n            FT_TRACE4(( \" hhcurveto\\n\" ));\n\n            if ( num_args < 4 )\n              goto Stack_Underflow;\n\n            /* if num_args isn't of the form 4n or 4n+1, */\n            /* we enforce it by clearing the second bit  */\n\n            nargs = num_args & ~2;\n\n            if ( cff_builder_start_point( builder, x, y ) )\n              goto Fail;\n\n            args -= nargs;\n            if ( nargs & 1 )\n            {\n              y += args[0];\n              args++;\n              nargs--;\n            }\n\n            if ( cff_check_points( builder, 3 * ( nargs / 4 ) ) )\n              goto Fail;\n\n            while ( args < decoder->top )\n            {\n              x += args[0];\n              cff_builder_add_point( builder, x, y, 0 );\n              x += args[1];\n              y += args[2];\n              cff_builder_add_point( builder, x, y, 0 );\n              x += args[3];\n              cff_builder_add_point( builder, x, y, 1 );\n              args += 4;\n            }\n            args = stack;\n          }\n          break;\n\n        case cff_op_vhcurveto:\n        case cff_op_hvcurveto:\n          {\n            FT_Int  phase;\n            FT_Int  nargs;\n\n\n            FT_TRACE4(( op == cff_op_vhcurveto ? \" vhcurveto\\n\"\n                                               : \" hvcurveto\\n\" ));\n\n            if ( cff_builder_start_point( builder, x, y ) )\n              goto Fail;\n\n            if ( num_args < 4 )\n              goto Stack_Underflow;\n\n            /* if num_args isn't of the form 8n, 8n+1, 8n+4, or 8n+5, */\n            /* we enforce it by clearing the second bit               */\n\n            nargs = num_args & ~2;\n\n            args -= nargs;\n            if ( cff_check_points( builder, ( nargs / 4 ) * 3 ) )\n              goto Stack_Underflow;\n\n            phase = ( op == cff_op_hvcurveto );\n\n            while ( nargs >= 4 )\n            {\n              nargs -= 4;\n              if ( phase )\n              {\n                x += args[0];\n                cff_builder_add_point( builder, x, y, 0 );\n                x += args[1];\n                y += args[2];\n                cff_builder_add_point( builder, x, y, 0 );\n                y += args[3];\n                if ( nargs == 1 )\n                  x += args[4];\n                cff_builder_add_point( builder, x, y, 1 );\n              }\n              else\n              {\n                y += args[0];\n                cff_builder_add_point( builder, x, y, 0 );\n                x += args[1];\n                y += args[2];\n                cff_builder_add_point( builder, x, y, 0 );\n                x += args[3];\n                if ( nargs == 1 )\n                  y += args[4];\n                cff_builder_add_point( builder, x, y, 1 );\n              }\n              args  += 4;\n              phase ^= 1;\n            }\n            args = stack;\n          }\n          break;\n\n        case cff_op_rlinecurve:\n          {\n            FT_Int  num_lines;\n            FT_Int  nargs;\n\n\n            FT_TRACE4(( \" rlinecurve\\n\" ));\n\n            if ( num_args < 8 )\n              goto Stack_Underflow;\n\n            nargs     = num_args & ~1;\n            num_lines = ( nargs - 6 ) / 2;\n\n            if ( cff_builder_start_point( builder, x, y )   ||\n                 cff_check_points( builder, num_lines + 3 ) )\n              goto Fail;\n\n            args -= nargs;\n\n            /* first, add the line segments */\n            while ( num_lines > 0 )\n            {\n              x += args[0];\n              y += args[1];\n              cff_builder_add_point( builder, x, y, 1 );\n              args += 2;\n              num_lines--;\n            }\n\n            /* then the curve */\n            x += args[0];\n            y += args[1];\n            cff_builder_add_point( builder, x, y, 0 );\n            x += args[2];\n            y += args[3];\n            cff_builder_add_point( builder, x, y, 0 );\n            x += args[4];\n            y += args[5];\n            cff_builder_add_point( builder, x, y, 1 );\n            args = stack;\n          }\n          break;\n\n        case cff_op_rcurveline:\n          {\n            FT_Int  num_curves;\n            FT_Int  nargs;\n\n\n            FT_TRACE4(( \" rcurveline\\n\" ));\n\n            if ( num_args < 8 )\n              goto Stack_Underflow;\n\n            nargs      = num_args - 2;\n            nargs      = nargs - nargs % 6 + 2;\n            num_curves = ( nargs - 2 ) / 6;\n\n            if ( cff_builder_start_point( builder, x, y )        ||\n                 cff_check_points( builder, num_curves * 3 + 2 ) )\n              goto Fail;\n\n            args -= nargs;\n\n            /* first, add the curves */\n            while ( num_curves > 0 )\n            {\n              x += args[0];\n              y += args[1];\n              cff_builder_add_point( builder, x, y, 0 );\n              x += args[2];\n              y += args[3];\n              cff_builder_add_point( builder, x, y, 0 );\n              x += args[4];\n              y += args[5];\n              cff_builder_add_point( builder, x, y, 1 );\n              args += 6;\n              num_curves--;\n            }\n\n            /* then the final line */\n            x += args[0];\n            y += args[1];\n            cff_builder_add_point( builder, x, y, 1 );\n            args = stack;\n          }\n          break;\n\n        case cff_op_hflex1:\n          {\n            FT_Pos start_y;\n\n\n            FT_TRACE4(( \" hflex1\\n\" ));\n\n            /* adding five more points: 4 control points, 1 on-curve point */\n            /* -- make sure we have enough space for the start point if it */\n            /* needs to be added                                           */\n            if ( cff_builder_start_point( builder, x, y ) ||\n                 cff_check_points( builder, 6 )           )\n              goto Fail;\n\n            /* record the starting point's y position for later use */\n            start_y = y;\n\n            /* first control point */\n            x += args[0];\n            y += args[1];\n            cff_builder_add_point( builder, x, y, 0 );\n\n            /* second control point */\n            x += args[2];\n            y += args[3];\n            cff_builder_add_point( builder, x, y, 0 );\n\n            /* join point; on curve, with y-value the same as the last */\n            /* control point's y-value                                 */\n            x += args[4];\n            cff_builder_add_point( builder, x, y, 1 );\n\n            /* third control point, with y-value the same as the join */\n            /* point's y-value                                        */\n            x += args[5];\n            cff_builder_add_point( builder, x, y, 0 );\n\n            /* fourth control point */\n            x += args[6];\n            y += args[7];\n            cff_builder_add_point( builder, x, y, 0 );\n\n            /* ending point, with y-value the same as the start   */\n            x += args[8];\n            y  = start_y;\n            cff_builder_add_point( builder, x, y, 1 );\n\n            args = stack;\n            break;\n          }\n\n        case cff_op_hflex:\n          {\n            FT_Pos start_y;\n\n\n            FT_TRACE4(( \" hflex\\n\" ));\n\n            /* adding six more points; 4 control points, 2 on-curve points */\n            if ( cff_builder_start_point( builder, x, y ) ||\n                 cff_check_points( builder, 6 )           )\n              goto Fail;\n\n            /* record the starting point's y-position for later use */\n            start_y = y;\n\n            /* first control point */\n            x += args[0];\n            cff_builder_add_point( builder, x, y, 0 );\n\n            /* second control point */\n            x += args[1];\n            y += args[2];\n            cff_builder_add_point( builder, x, y, 0 );\n\n            /* join point; on curve, with y-value the same as the last */\n            /* control point's y-value                                 */\n            x += args[3];\n            cff_builder_add_point( builder, x, y, 1 );\n\n            /* third control point, with y-value the same as the join */\n            /* point's y-value                                        */\n            x += args[4];\n            cff_builder_add_point( builder, x, y, 0 );\n\n            /* fourth control point */\n            x += args[5];\n            y  = start_y;\n            cff_builder_add_point( builder, x, y, 0 );\n\n            /* ending point, with y-value the same as the start point's */\n            /* y-value -- we don't add this point, though               */\n            x += args[6];\n            cff_builder_add_point( builder, x, y, 1 );\n\n            args = stack;\n            break;\n          }\n\n        case cff_op_flex1:\n          {\n            FT_Pos     start_x, start_y; /* record start x, y values for */\n                                         /* alter use                    */\n            FT_Fixed   dx = 0, dy = 0;   /* used in horizontal/vertical  */\n                                         /* algorithm below              */\n            FT_Int     horizontal, count;\n            FT_Fixed*  temp;\n\n\n            FT_TRACE4(( \" flex1\\n\" ));\n\n            /* adding six more points; 4 control points, 2 on-curve points */\n            if ( cff_builder_start_point( builder, x, y ) ||\n                 cff_check_points( builder, 6 )           )\n              goto Fail;\n\n            /* record the starting point's x, y position for later use */\n            start_x = x;\n            start_y = y;\n\n            /* XXX: figure out whether this is supposed to be a horizontal */\n            /*      or vertical flex; the Type 2 specification is vague... */\n\n            temp = args;\n\n            /* grab up to the last argument */\n            for ( count = 5; count > 0; count-- )\n            {\n              dx += temp[0];\n              dy += temp[1];\n              temp += 2;\n            }\n\n            if ( dx < 0 )\n              dx = -dx;\n            if ( dy < 0 )\n              dy = -dy;\n\n            /* strange test, but here it is... */\n            horizontal = ( dx > dy );\n\n            for ( count = 5; count > 0; count-- )\n            {\n              x += args[0];\n              y += args[1];\n              cff_builder_add_point( builder, x, y,\n                                     (FT_Bool)( count == 3 ) );\n              args += 2;\n            }\n\n            /* is last operand an x- or y-delta? */\n            if ( horizontal )\n            {\n              x += args[0];\n              y  = start_y;\n            }\n            else\n            {\n              x  = start_x;\n              y += args[0];\n            }\n\n            cff_builder_add_point( builder, x, y, 1 );\n\n            args = stack;\n            break;\n           }\n\n        case cff_op_flex:\n          {\n            FT_UInt  count;\n\n\n            FT_TRACE4(( \" flex\\n\" ));\n\n            if ( cff_builder_start_point( builder, x, y ) ||\n                 cff_check_points( builder, 6 )           )\n              goto Fail;\n\n            for ( count = 6; count > 0; count-- )\n            {\n              x += args[0];\n              y += args[1];\n              cff_builder_add_point( builder, x, y,\n                                     (FT_Bool)( count == 4 || count == 1 ) );\n              args += 2;\n            }\n\n            args = stack;\n          }\n          break;\n\n        case cff_op_seac:\n            FT_TRACE4(( \" seac\\n\" ));\n\n            error = cff_operator_seac( decoder,\n                                       args[0], args[1], args[2],\n                                       (FT_Int)( args[3] >> 16 ),\n                                       (FT_Int)( args[4] >> 16 ) );\n\n            /* add current outline to the glyph slot */\n            FT_GlyphLoader_Add( builder->loader );\n\n            /* return now! */\n            FT_TRACE4(( \"\\n\" ));\n            return error;\n\n        case cff_op_endchar:\n          FT_TRACE4(( \" endchar\\n\" ));\n\n          /* We are going to emulate the seac operator. */\n          if ( num_args >= 4 )\n          {\n            /* Save glyph width so that the subglyphs don't overwrite it. */\n            FT_Pos  glyph_width = decoder->glyph_width;\n\n\n            error = cff_operator_seac( decoder,\n                                       0L, args[-4], args[-3],\n                                       (FT_Int)( args[-2] >> 16 ),\n                                       (FT_Int)( args[-1] >> 16 ) );\n\n            decoder->glyph_width = glyph_width;\n          }\n          else\n          {\n            if ( !error )\n              error = FT_Err_Ok;\n\n            cff_builder_close_contour( builder );\n\n            /* close hints recording session */\n            if ( hinter )\n            {\n              if ( hinter->close( hinter->hints,\n                                  builder->current->n_points ) )\n                goto Syntax_Error;\n\n              /* apply hints to the loaded glyph outline now */\n              hinter->apply( hinter->hints,\n                             builder->current,\n                             (PSH_Globals)builder->hints_globals,\n                             decoder->hint_mode );\n            }\n\n            /* add current outline to the glyph slot */\n            FT_GlyphLoader_Add( builder->loader );\n          }\n\n          /* return now! */\n          FT_TRACE4(( \"\\n\" ));\n          return error;\n\n        case cff_op_abs:\n          FT_TRACE4(( \" abs\\n\" ));\n\n          if ( args[0] < 0 )\n            args[0] = -args[0];\n          args++;\n          break;\n\n        case cff_op_add:\n          FT_TRACE4(( \" add\\n\" ));\n\n          args[0] += args[1];\n          args++;\n          break;\n\n        case cff_op_sub:\n          FT_TRACE4(( \" sub\\n\" ));\n\n          args[0] -= args[1];\n          args++;\n          break;\n\n        case cff_op_div:\n          FT_TRACE4(( \" div\\n\" ));\n\n          args[0] = FT_DivFix( args[0], args[1] );\n          args++;\n          break;\n\n        case cff_op_neg:\n          FT_TRACE4(( \" neg\\n\" ));\n\n          args[0] = -args[0];\n          args++;\n          break;\n\n        case cff_op_random:\n          {\n            FT_Fixed  Rand;\n\n\n            FT_TRACE4(( \" rand\\n\" ));\n\n            Rand = seed;\n            if ( Rand >= 0x8000L )\n              Rand++;\n\n            args[0] = Rand;\n            seed    = FT_MulFix( seed, 0x10000L - seed );\n            if ( seed == 0 )\n              seed += 0x2873;\n            args++;\n          }\n          break;\n\n        case cff_op_mul:\n          FT_TRACE4(( \" mul\\n\" ));\n\n          args[0] = FT_MulFix( args[0], args[1] );\n          args++;\n          break;\n\n        case cff_op_sqrt:\n          FT_TRACE4(( \" sqrt\\n\" ));\n\n          if ( args[0] > 0 )\n          {\n            FT_Int    count = 9;\n            FT_Fixed  root  = args[0];\n            FT_Fixed  new_root;\n\n\n            for (;;)\n            {\n              new_root = ( root + FT_DivFix( args[0], root ) + 1 ) >> 1;\n              if ( new_root == root || count <= 0 )\n                break;\n              root = new_root;\n            }\n            args[0] = new_root;\n          }\n          else\n            args[0] = 0;\n          args++;\n          break;\n\n        case cff_op_drop:\n          /* nothing */\n          FT_TRACE4(( \" drop\\n\" ));\n\n          break;\n\n        case cff_op_exch:\n          {\n            FT_Fixed  tmp;\n\n\n            FT_TRACE4(( \" exch\\n\" ));\n\n            tmp     = args[0];\n            args[0] = args[1];\n            args[1] = tmp;\n            args   += 2;\n          }\n          break;\n\n        case cff_op_index:\n          {\n            FT_Int  idx = (FT_Int)( args[0] >> 16 );\n\n\n            FT_TRACE4(( \" index\\n\" ));\n\n            if ( idx < 0 )\n              idx = 0;\n            else if ( idx > num_args - 2 )\n              idx = num_args - 2;\n            args[0] = args[-( idx + 1 )];\n            args++;\n          }\n          break;\n\n        case cff_op_roll:\n          {\n            FT_Int  count = (FT_Int)( args[0] >> 16 );\n            FT_Int  idx   = (FT_Int)( args[1] >> 16 );\n\n\n            FT_TRACE4(( \" roll\\n\" ));\n\n            if ( count <= 0 )\n              count = 1;\n\n            args -= count;\n            if ( args < stack )\n              goto Stack_Underflow;\n\n            if ( idx >= 0 )\n            {\n              while ( idx > 0 )\n              {\n                FT_Fixed  tmp = args[count - 1];\n                FT_Int    i;\n\n\n                for ( i = count - 2; i >= 0; i-- )\n                  args[i + 1] = args[i];\n                args[0] = tmp;\n                idx--;\n              }\n            }\n            else\n            {\n              while ( idx < 0 )\n              {\n                FT_Fixed  tmp = args[0];\n                FT_Int    i;\n\n\n                for ( i = 0; i < count - 1; i++ )\n                  args[i] = args[i + 1];\n                args[count - 1] = tmp;\n                idx++;\n              }\n            }\n            args += count;\n          }\n          break;\n\n        case cff_op_dup:\n          FT_TRACE4(( \" dup\\n\" ));\n\n          args[1] = args[0];\n          args += 2;\n          break;\n\n        case cff_op_put:\n          {\n            FT_Fixed  val = args[0];\n            FT_Int    idx = (FT_Int)( args[1] >> 16 );\n\n\n            FT_TRACE4(( \" put\\n\" ));\n\n            if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS )\n              decoder->buildchar[idx] = val;\n          }\n          break;\n\n        case cff_op_get:\n          {\n            FT_Int    idx = (FT_Int)( args[0] >> 16 );\n            FT_Fixed  val = 0;\n\n\n            FT_TRACE4(( \" get\\n\" ));\n\n            if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS )\n              val = decoder->buildchar[idx];\n\n            args[0] = val;\n            args++;\n          }\n          break;\n\n        case cff_op_store:\n          FT_TRACE4(( \" store\\n\"));\n\n          goto Unimplemented;\n\n        case cff_op_load:\n          FT_TRACE4(( \" load\\n\" ));\n\n          goto Unimplemented;\n\n        case cff_op_dotsection:\n          /* this operator is deprecated and ignored by the parser */\n          FT_TRACE4(( \" dotsection\\n\" ));\n          break;\n\n        case cff_op_closepath:\n          /* this is an invalid Type 2 operator; however, there        */\n          /* exist fonts which are incorrectly converted from probably */\n          /* Type 1 to CFF, and some parsers seem to accept it         */\n\n          FT_TRACE4(( \" closepath (invalid op)\\n\" ));\n\n          args = stack;\n          break;\n\n        case cff_op_hsbw:\n          /* this is an invalid Type 2 operator; however, there        */\n          /* exist fonts which are incorrectly converted from probably */\n          /* Type 1 to CFF, and some parsers seem to accept it         */\n\n          FT_TRACE4(( \" hsbw (invalid op)\\n\" ));\n\n          decoder->glyph_width = decoder->nominal_width + ( args[1] >> 16 );\n\n          decoder->builder.left_bearing.x = args[0];\n          decoder->builder.left_bearing.y = 0;\n\n          x    = decoder->builder.pos_x + args[0];\n          y    = decoder->builder.pos_y;\n          args = stack;\n          break;\n\n        case cff_op_sbw:\n          /* this is an invalid Type 2 operator; however, there        */\n          /* exist fonts which are incorrectly converted from probably */\n          /* Type 1 to CFF, and some parsers seem to accept it         */\n\n          FT_TRACE4(( \" sbw (invalid op)\\n\" ));\n\n          decoder->glyph_width = decoder->nominal_width + ( args[2] >> 16 );\n\n          decoder->builder.left_bearing.x = args[0];\n          decoder->builder.left_bearing.y = args[1];\n\n          x    = decoder->builder.pos_x + args[0];\n          y    = decoder->builder.pos_y + args[1];\n          args = stack;\n          break;\n\n        case cff_op_setcurrentpoint:\n          /* this is an invalid Type 2 operator; however, there        */\n          /* exist fonts which are incorrectly converted from probably */\n          /* Type 1 to CFF, and some parsers seem to accept it         */\n\n          FT_TRACE4(( \" setcurrentpoint (invalid op)\\n\" ));\n\n          x    = decoder->builder.pos_x + args[0];\n          y    = decoder->builder.pos_y + args[1];\n          args = stack;\n          break;\n\n        case cff_op_callothersubr:\n          /* this is an invalid Type 2 operator; however, there        */\n          /* exist fonts which are incorrectly converted from probably */\n          /* Type 1 to CFF, and some parsers seem to accept it         */\n\n          FT_TRACE4(( \" callothersubr (invalid op)\\n\" ));\n\n          /* subsequent `pop' operands should add the arguments,       */\n          /* this is the implementation described for `unknown' other  */\n          /* subroutines in the Type1 spec.                            */\n          /*                                                           */\n          /* XXX Fix return arguments (see discussion below).          */\n          args -= 2 + ( args[-2] >> 16 );\n          if ( args < stack )\n            goto Stack_Underflow;\n          break;\n\n        case cff_op_pop:\n          /* this is an invalid Type 2 operator; however, there        */\n          /* exist fonts which are incorrectly converted from probably */\n          /* Type 1 to CFF, and some parsers seem to accept it         */\n\n          FT_TRACE4(( \" pop (invalid op)\\n\" ));\n\n          /* XXX Increasing `args' is wrong: After a certain number of */\n          /* `pop's we get a stack overflow.  Reason for doing it is   */\n          /* code like this (actually found in a CFF font):            */\n          /*                                                           */\n          /*   17 1 3 callothersubr                                    */\n          /*   pop                                                     */\n          /*   callsubr                                                */\n          /*                                                           */\n          /* Since we handle `callothersubr' as a no-op, and           */\n          /* `callsubr' needs at least one argument, `pop' can't be a  */\n          /* no-op too as it basically should be.                      */\n          /*                                                           */\n          /* The right solution would be to provide real support for   */\n          /* `callothersubr' as done in `t1decode.c', however, given   */\n          /* the fact that CFF fonts with `pop' are invalid, it is     */\n          /* questionable whether it is worth the time.                */\n          args++;\n          break;\n\n        case cff_op_and:\n          {\n            FT_Fixed  cond = args[0] && args[1];\n\n\n            FT_TRACE4(( \" and\\n\" ));\n\n            args[0] = cond ? 0x10000L : 0;\n            args++;\n          }\n          break;\n\n        case cff_op_or:\n          {\n            FT_Fixed  cond = args[0] || args[1];\n\n\n            FT_TRACE4(( \" or\\n\" ));\n\n            args[0] = cond ? 0x10000L : 0;\n            args++;\n          }\n          break;\n\n        case cff_op_eq:\n          {\n            FT_Fixed  cond = !args[0];\n\n\n            FT_TRACE4(( \" eq\\n\" ));\n\n            args[0] = cond ? 0x10000L : 0;\n            args++;\n          }\n          break;\n\n        case cff_op_ifelse:\n          {\n            FT_Fixed  cond = ( args[2] <= args[3] );\n\n\n            FT_TRACE4(( \" ifelse\\n\" ));\n\n            if ( !cond )\n              args[0] = args[1];\n            args++;\n          }\n          break;\n\n        case cff_op_callsubr:\n          {\n            FT_UInt  idx = (FT_UInt)( ( args[0] >> 16 ) +\n                                      decoder->locals_bias );\n\n\n            FT_TRACE4(( \" callsubr(%d)\\n\", idx ));\n\n            if ( idx >= decoder->num_locals )\n            {\n              FT_ERROR(( \"cff_decoder_parse_charstrings:\"\n                         \" invalid local subr index\\n\" ));\n              goto Syntax_Error;\n            }\n\n            if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS )\n            {\n              FT_ERROR(( \"cff_decoder_parse_charstrings:\"\n                         \" too many nested subrs\\n\" ));\n              goto Syntax_Error;\n            }\n\n            zone->cursor = ip;  /* save current instruction pointer */\n\n            zone++;\n            zone->base   = decoder->locals[idx];\n            zone->limit  = decoder->locals[idx + 1];\n            zone->cursor = zone->base;\n\n            if ( !zone->base || zone->limit == zone->base )\n            {\n              FT_ERROR(( \"cff_decoder_parse_charstrings:\"\n                         \" invoking empty subrs\\n\" ));\n              goto Syntax_Error;\n            }\n\n            decoder->zone = zone;\n            ip            = zone->base;\n            limit         = zone->limit;\n          }\n          break;\n\n        case cff_op_callgsubr:\n          {\n            FT_UInt  idx = (FT_UInt)( ( args[0] >> 16 ) +\n                                      decoder->globals_bias );\n\n\n            FT_TRACE4(( \" callgsubr(%d)\\n\", idx ));\n\n            if ( idx >= decoder->num_globals )\n            {\n              FT_ERROR(( \"cff_decoder_parse_charstrings:\"\n                         \" invalid global subr index\\n\" ));\n              goto Syntax_Error;\n            }\n\n            if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS )\n            {\n              FT_ERROR(( \"cff_decoder_parse_charstrings:\"\n                         \" too many nested subrs\\n\" ));\n              goto Syntax_Error;\n            }\n\n            zone->cursor = ip;  /* save current instruction pointer */\n\n            zone++;\n            zone->base   = decoder->globals[idx];\n            zone->limit  = decoder->globals[idx + 1];\n            zone->cursor = zone->base;\n\n            if ( !zone->base || zone->limit == zone->base )\n            {\n              FT_ERROR(( \"cff_decoder_parse_charstrings:\"\n                         \" invoking empty subrs\\n\" ));\n              goto Syntax_Error;\n            }\n\n            decoder->zone = zone;\n            ip            = zone->base;\n            limit         = zone->limit;\n          }\n          break;\n\n        case cff_op_return:\n          FT_TRACE4(( \" return\\n\" ));\n\n          if ( decoder->zone <= decoder->zones )\n          {\n            FT_ERROR(( \"cff_decoder_parse_charstrings:\"\n                       \" unexpected return\\n\" ));\n            goto Syntax_Error;\n          }\n\n          decoder->zone--;\n          zone  = decoder->zone;\n          ip    = zone->cursor;\n          limit = zone->limit;\n          break;\n\n        default:\n        Unimplemented:\n          FT_ERROR(( \"Unimplemented opcode: %d\", ip[-1] ));\n\n          if ( ip[-1] == 12 )\n            FT_ERROR(( \" %d\", ip[0] ));\n          FT_ERROR(( \"\\n\" ));\n\n          return FT_THROW( Unimplemented_Feature );\n        }\n\n        decoder->top = args;\n\n        if ( decoder->top - stack >= CFF_MAX_OPERANDS )\n          goto Stack_Overflow;\n\n      } /* general operator processing */\n\n    } /* while ip < limit */\n\n    FT_TRACE4(( \"..end..\\n\\n\" ));\n\n  Fail:\n    return error;\n\n  Syntax_Error:\n    FT_TRACE4(( \"cff_decoder_parse_charstrings: syntax error\\n\" ));\n    return FT_THROW( Invalid_File_Format );\n\n  Stack_Underflow:\n    FT_TRACE4(( \"cff_decoder_parse_charstrings: stack underflow\\n\" ));\n    return FT_THROW( Too_Few_Arguments );\n\n  Stack_Overflow:\n    FT_TRACE4(( \"cff_decoder_parse_charstrings: stack overflow\\n\" ));\n    return FT_THROW( Stack_Overflow );\n  }\n\n#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /**********                                                      *********/\n  /**********                                                      *********/\n  /**********            COMPUTE THE MAXIMUM ADVANCE WIDTH         *********/\n  /**********                                                      *********/\n  /**********    The following code is in charge of computing      *********/\n  /**********    the maximum advance width of the font.  It        *********/\n  /**********    quickly processes each glyph charstring to        *********/\n  /**********    extract the value from either a `sbw' or `seac'   *********/\n  /**********    operator.                                         *********/\n  /**********                                                      *********/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n#if 0 /* unused until we support pure CFF fonts */\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cff_compute_max_advance( TT_Face  face,\n                           FT_Int*  max_advance )\n  {\n    FT_Error     error = FT_Err_Ok;\n    CFF_Decoder  decoder;\n    FT_Int       glyph_index;\n    CFF_Font     cff = (CFF_Font)face->other;\n\n\n    *max_advance = 0;\n\n    /* Initialize load decoder */\n    cff_decoder_init( &decoder, face, 0, 0, 0, 0 );\n\n    decoder.builder.metrics_only = 1;\n    decoder.builder.load_points  = 0;\n\n    /* For each glyph, parse the glyph charstring and extract */\n    /* the advance width.                                     */\n    for ( glyph_index = 0; glyph_index < face->root.num_glyphs;\n          glyph_index++ )\n    {\n      FT_Byte*  charstring;\n      FT_ULong  charstring_len;\n\n\n      /* now get load the unscaled outline */\n      error = cff_get_glyph_data( face, glyph_index,\n                                  &charstring, &charstring_len );\n      if ( !error )\n      {\n        error = cff_decoder_prepare( &decoder, size, glyph_index );\n        if ( !error )\n          error = cff_decoder_parse_charstrings( &decoder,\n                                                 charstring,\n                                                 charstring_len );\n\n        cff_free_glyph_data( face, &charstring, &charstring_len );\n      }\n\n      /* ignore the error if one has occurred -- skip to next glyph */\n      error = FT_Err_Ok;\n    }\n\n    *max_advance = decoder.builder.advance.x;\n\n    return FT_Err_Ok;\n  }\n\n\n#endif /* 0 */\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cff_slot_load( CFF_GlyphSlot  glyph,\n                 CFF_Size       size,\n                 FT_UInt        glyph_index,\n                 FT_Int32       load_flags )\n  {\n    FT_Error     error;\n    CFF_Decoder  decoder;\n    TT_Face      face = (TT_Face)glyph->root.face;\n    FT_Bool      hinting, scaled, force_scaling;\n    CFF_Font     cff  = (CFF_Font)face->extra.data;\n\n    FT_Matrix    font_matrix;\n    FT_Vector    font_offset;\n\n\n    force_scaling = FALSE;\n\n    /* in a CID-keyed font, consider `glyph_index' as a CID and map */\n    /* it immediately to the real glyph_index -- if it isn't a      */\n    /* subsetted font, glyph_indices and CIDs are identical, though */\n    if ( cff->top_font.font_dict.cid_registry != 0xFFFFU &&\n         cff->charset.cids                               )\n    {\n      /* don't handle CID 0 (.notdef) which is directly mapped to GID 0 */\n      if ( glyph_index != 0 )\n      {\n        glyph_index = cff_charset_cid_to_gindex( &cff->charset,\n                                                 glyph_index );\n        if ( glyph_index == 0 )\n          return FT_THROW( Invalid_Argument );\n      }\n    }\n    else if ( glyph_index >= cff->num_glyphs )\n      return FT_THROW( Invalid_Argument );\n\n    if ( load_flags & FT_LOAD_NO_RECURSE )\n      load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;\n\n    glyph->x_scale = 0x10000L;\n    glyph->y_scale = 0x10000L;\n    if ( size )\n    {\n      glyph->x_scale = size->root.metrics.x_scale;\n      glyph->y_scale = size->root.metrics.y_scale;\n    }\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n\n    /* try to load embedded bitmap if any              */\n    /*                                                 */\n    /* XXX: The convention should be emphasized in     */\n    /*      the documents because it can be confusing. */\n    if ( size )\n    {\n      CFF_Face      cff_face = (CFF_Face)size->root.face;\n      SFNT_Service  sfnt     = (SFNT_Service)cff_face->sfnt;\n      FT_Stream     stream   = cff_face->root.stream;\n\n\n      if ( size->strike_index != 0xFFFFFFFFUL      &&\n           sfnt->load_eblc                         &&\n           ( load_flags & FT_LOAD_NO_BITMAP ) == 0 )\n      {\n        TT_SBit_MetricsRec  metrics;\n\n\n        error = sfnt->load_sbit_image( face,\n                                       size->strike_index,\n                                       glyph_index,\n                                       (FT_Int)load_flags,\n                                       stream,\n                                       &glyph->root.bitmap,\n                                       &metrics );\n\n        if ( !error )\n        {\n          FT_Bool    has_vertical_info;\n          FT_UShort  advance;\n          FT_Short   dummy;\n\n\n          glyph->root.outline.n_points   = 0;\n          glyph->root.outline.n_contours = 0;\n\n          glyph->root.metrics.width  = (FT_Pos)metrics.width  << 6;\n          glyph->root.metrics.height = (FT_Pos)metrics.height << 6;\n\n          glyph->root.metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6;\n          glyph->root.metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6;\n          glyph->root.metrics.horiAdvance  = (FT_Pos)metrics.horiAdvance  << 6;\n\n          glyph->root.metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6;\n          glyph->root.metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6;\n          glyph->root.metrics.vertAdvance  = (FT_Pos)metrics.vertAdvance  << 6;\n\n          glyph->root.format = FT_GLYPH_FORMAT_BITMAP;\n\n          if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )\n          {\n            glyph->root.bitmap_left = metrics.vertBearingX;\n            glyph->root.bitmap_top  = metrics.vertBearingY;\n          }\n          else\n          {\n            glyph->root.bitmap_left = metrics.horiBearingX;\n            glyph->root.bitmap_top  = metrics.horiBearingY;\n          }\n\n          /* compute linear advance widths */\n\n          ( (SFNT_Service)face->sfnt )->get_metrics( face, 0,\n                                                     glyph_index,\n                                                     &dummy,\n                                                     &advance );\n          glyph->root.linearHoriAdvance = advance;\n\n          has_vertical_info = FT_BOOL(\n                                face->vertical_info                   &&\n                                face->vertical.number_Of_VMetrics > 0 );\n\n          /* get the vertical metrics from the vtmx table if we have one */\n          if ( has_vertical_info )\n          {\n            ( (SFNT_Service)face->sfnt )->get_metrics( face, 1,\n                                                       glyph_index,\n                                                       &dummy,\n                                                       &advance );\n            glyph->root.linearVertAdvance = advance;\n          }\n          else\n          {\n            /* make up vertical ones */\n            if ( face->os2.version != 0xFFFFU )\n              glyph->root.linearVertAdvance = (FT_Pos)\n                ( face->os2.sTypoAscender - face->os2.sTypoDescender );\n            else\n              glyph->root.linearVertAdvance = (FT_Pos)\n                ( face->horizontal.Ascender - face->horizontal.Descender );\n          }\n\n          return error;\n        }\n      }\n    }\n\n#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */\n\n    /* return immediately if we only want the embedded bitmaps */\n    if ( load_flags & FT_LOAD_SBITS_ONLY )\n      return FT_THROW( Invalid_Argument );\n\n    /* if we have a CID subfont, use its matrix (which has already */\n    /* been multiplied with the root matrix)                       */\n\n    /* this scaling is only relevant if the PS hinter isn't active */\n    if ( cff->num_subfonts )\n    {\n      FT_ULong  top_upm, sub_upm;\n      FT_Byte   fd_index = cff_fd_select_get( &cff->fd_select,\n                                              glyph_index );\n\n\n      if ( fd_index >= cff->num_subfonts )\n        fd_index = (FT_Byte)( cff->num_subfonts - 1 );\n\n      top_upm = cff->top_font.font_dict.units_per_em;\n      sub_upm = cff->subfonts[fd_index]->font_dict.units_per_em;\n\n\n      font_matrix = cff->subfonts[fd_index]->font_dict.font_matrix;\n      font_offset = cff->subfonts[fd_index]->font_dict.font_offset;\n\n      if ( top_upm != sub_upm )\n      {\n        glyph->x_scale = FT_MulDiv( glyph->x_scale, top_upm, sub_upm );\n        glyph->y_scale = FT_MulDiv( glyph->y_scale, top_upm, sub_upm );\n\n        force_scaling = TRUE;\n      }\n    }\n    else\n    {\n      font_matrix = cff->top_font.font_dict.font_matrix;\n      font_offset = cff->top_font.font_dict.font_offset;\n    }\n\n    glyph->root.outline.n_points   = 0;\n    glyph->root.outline.n_contours = 0;\n\n    /* top-level code ensures that FT_LOAD_NO_HINTING is set */\n    /* if FT_LOAD_NO_SCALE is active                         */\n    hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_HINTING ) == 0 );\n    scaled  = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 );\n\n    glyph->hint        = hinting;\n    glyph->scaled      = scaled;\n    glyph->root.format = FT_GLYPH_FORMAT_OUTLINE;  /* by default */\n\n    {\n#ifdef CFF_CONFIG_OPTION_OLD_ENGINE\n      CFF_Driver  driver = (CFF_Driver)FT_FACE_DRIVER( face );\n#endif\n\n\n      FT_Byte*  charstring;\n      FT_ULong  charstring_len;\n\n\n      cff_decoder_init( &decoder, face, size, glyph, hinting,\n                        FT_LOAD_TARGET_MODE( load_flags ) );\n\n      if ( load_flags & FT_LOAD_ADVANCE_ONLY )\n        decoder.width_only = TRUE;\n\n      decoder.builder.no_recurse =\n        (FT_Bool)( load_flags & FT_LOAD_NO_RECURSE );\n\n      /* now load the unscaled outline */\n      error = cff_get_glyph_data( face, glyph_index,\n                                  &charstring, &charstring_len );\n      if ( error )\n        goto Glyph_Build_Finished;\n\n      error = cff_decoder_prepare( &decoder, size, glyph_index );\n      if ( error )\n        goto Glyph_Build_Finished;\n\n#ifdef CFF_CONFIG_OPTION_OLD_ENGINE\n      /* choose which CFF renderer to use */\n      if ( driver->hinting_engine == FT_CFF_HINTING_FREETYPE )\n        error = cff_decoder_parse_charstrings( &decoder,\n                                               charstring,\n                                               charstring_len );\n      else\n#endif\n      {\n        error = cf2_decoder_parse_charstrings( &decoder,\n                                               charstring,\n                                               charstring_len );\n\n        /* Adobe's engine uses 16.16 numbers everywhere;              */\n        /* as a consequence, glyphs larger than 2000ppem get rejected */\n        if ( FT_ERR_EQ( error, Glyph_Too_Big ) )\n        {\n          /* this time, we retry unhinted and scale up the glyph later on */\n          /* (the engine uses and sets the hardcoded value 0x10000 / 64 = */\n          /* 0x400 for both `x_scale' and `y_scale' in this case)         */\n          hinting       = FALSE;\n          force_scaling = TRUE;\n          glyph->hint   = hinting;\n\n          error = cf2_decoder_parse_charstrings( &decoder,\n                                                 charstring,\n                                                 charstring_len );\n        }\n      }\n\n      cff_free_glyph_data( face, &charstring, charstring_len );\n\n      if ( error )\n        goto Glyph_Build_Finished;\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n      /* Control data and length may not be available for incremental */\n      /* fonts.                                                       */\n      if ( face->root.internal->incremental_interface )\n      {\n        glyph->root.control_data = 0;\n        glyph->root.control_len = 0;\n      }\n      else\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n\n      /* We set control_data and control_len if charstrings is loaded. */\n      /* See how charstring loads at cff_index_access_element() in     */\n      /* cffload.c.                                                    */\n      {\n        CFF_Index  csindex = &cff->charstrings_index;\n\n\n        if ( csindex->offsets )\n        {\n          glyph->root.control_data = csindex->bytes +\n                                     csindex->offsets[glyph_index] - 1;\n          glyph->root.control_len  = charstring_len;\n        }\n      }\n\n  Glyph_Build_Finished:\n      /* save new glyph tables, if no error */\n      if ( !error )\n        cff_builder_done( &decoder.builder );\n      /* XXX: anything to do for broken glyph entry? */\n    }\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n\n    /* Incremental fonts can optionally override the metrics. */\n    if ( !error                                                               &&\n         face->root.internal->incremental_interface                           &&\n         face->root.internal->incremental_interface->funcs->get_glyph_metrics )\n    {\n      FT_Incremental_MetricsRec  metrics;\n\n\n      metrics.bearing_x = decoder.builder.left_bearing.x;\n      metrics.bearing_y = 0;\n      metrics.advance   = decoder.builder.advance.x;\n      metrics.advance_v = decoder.builder.advance.y;\n\n      error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(\n                face->root.internal->incremental_interface->object,\n                glyph_index, FALSE, &metrics );\n\n      decoder.builder.left_bearing.x = metrics.bearing_x;\n      decoder.builder.advance.x      = metrics.advance;\n      decoder.builder.advance.y      = metrics.advance_v;\n    }\n\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n\n    if ( !error )\n    {\n      /* Now, set the metrics -- this is rather simple, as   */\n      /* the left side bearing is the xMin, and the top side */\n      /* bearing the yMax.                                   */\n\n      /* For composite glyphs, return only left side bearing and */\n      /* advance width.                                          */\n      if ( load_flags & FT_LOAD_NO_RECURSE )\n      {\n        FT_Slot_Internal  internal = glyph->root.internal;\n\n\n        glyph->root.metrics.horiBearingX = decoder.builder.left_bearing.x;\n        glyph->root.metrics.horiAdvance  = decoder.glyph_width;\n        internal->glyph_matrix           = font_matrix;\n        internal->glyph_delta            = font_offset;\n        internal->glyph_transformed      = 1;\n      }\n      else\n      {\n        FT_BBox            cbox;\n        FT_Glyph_Metrics*  metrics = &glyph->root.metrics;\n        FT_Vector          advance;\n        FT_Bool            has_vertical_info;\n\n\n        /* copy the _unscaled_ advance width */\n        metrics->horiAdvance                    = decoder.glyph_width;\n        glyph->root.linearHoriAdvance           = decoder.glyph_width;\n        glyph->root.internal->glyph_transformed = 0;\n\n        has_vertical_info = FT_BOOL( face->vertical_info                   &&\n                                     face->vertical.number_Of_VMetrics > 0 );\n\n        /* get the vertical metrics from the vtmx table if we have one */\n        if ( has_vertical_info )\n        {\n          FT_Short   vertBearingY = 0;\n          FT_UShort  vertAdvance  = 0;\n\n\n          ( (SFNT_Service)face->sfnt )->get_metrics( face, 1,\n                                                     glyph_index,\n                                                     &vertBearingY,\n                                                     &vertAdvance );\n          metrics->vertBearingY = vertBearingY;\n          metrics->vertAdvance  = vertAdvance;\n        }\n        else\n        {\n          /* make up vertical ones */\n          if ( face->os2.version != 0xFFFFU )\n            metrics->vertAdvance = (FT_Pos)( face->os2.sTypoAscender -\n                                             face->os2.sTypoDescender );\n          else\n            metrics->vertAdvance = (FT_Pos)( face->horizontal.Ascender -\n                                             face->horizontal.Descender );\n        }\n\n        glyph->root.linearVertAdvance = metrics->vertAdvance;\n\n        glyph->root.format = FT_GLYPH_FORMAT_OUTLINE;\n\n        glyph->root.outline.flags = 0;\n        if ( size && size->root.metrics.y_ppem < 24 )\n          glyph->root.outline.flags |= FT_OUTLINE_HIGH_PRECISION;\n\n        glyph->root.outline.flags |= FT_OUTLINE_REVERSE_FILL;\n\n        if ( !( font_matrix.xx == 0x10000L &&\n                font_matrix.yy == 0x10000L &&\n                font_matrix.xy == 0        &&\n                font_matrix.yx == 0        ) )\n          FT_Outline_Transform( &glyph->root.outline, &font_matrix );\n\n        if ( !( font_offset.x == 0 &&\n                font_offset.y == 0 ) )\n          FT_Outline_Translate( &glyph->root.outline,\n                                font_offset.x, font_offset.y );\n\n        advance.x = metrics->horiAdvance;\n        advance.y = 0;\n        FT_Vector_Transform( &advance, &font_matrix );\n        metrics->horiAdvance = advance.x + font_offset.x;\n\n        advance.x = 0;\n        advance.y = metrics->vertAdvance;\n        FT_Vector_Transform( &advance, &font_matrix );\n        metrics->vertAdvance = advance.y + font_offset.y;\n\n        if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 || force_scaling )\n        {\n          /* scale the outline and the metrics */\n          FT_Int       n;\n          FT_Outline*  cur     = &glyph->root.outline;\n          FT_Vector*   vec     = cur->points;\n          FT_Fixed     x_scale = glyph->x_scale;\n          FT_Fixed     y_scale = glyph->y_scale;\n\n\n          /* First of all, scale the points */\n          if ( !hinting || !decoder.builder.hints_funcs )\n            for ( n = cur->n_points; n > 0; n--, vec++ )\n            {\n              vec->x = FT_MulFix( vec->x, x_scale );\n              vec->y = FT_MulFix( vec->y, y_scale );\n            }\n\n          /* Then scale the metrics */\n          metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );\n          metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );\n        }\n\n        /* compute the other metrics */\n        FT_Outline_Get_CBox( &glyph->root.outline, &cbox );\n\n        metrics->width  = cbox.xMax - cbox.xMin;\n        metrics->height = cbox.yMax - cbox.yMin;\n\n        metrics->horiBearingX = cbox.xMin;\n        metrics->horiBearingY = cbox.yMax;\n\n        if ( has_vertical_info )\n          metrics->vertBearingX = metrics->horiBearingX -\n                                    metrics->horiAdvance / 2;\n        else\n        {\n          if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )\n            ft_synthesize_vertical_metrics( metrics,\n                                            metrics->vertAdvance );\n        }\n      }\n    }\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffgload.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffgload.h                                                             */\n/*                                                                         */\n/*    OpenType Glyph Loader (specification).                               */\n/*                                                                         */\n/*  Copyright 1996-2004, 2006-2009, 2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CFFGLOAD_H__\n#define __CFFGLOAD_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/freetype.h\"\n#include \"cffobjs.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#define CFF_MAX_OPERANDS        48\n#define CFF_MAX_SUBRS_CALLS     32\n#define CFF_MAX_TRANS_ELEMENTS  32\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Structure>                                                           */\n  /*    CFF_Builder                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*     A structure used during glyph loading to store its outline.       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    memory        :: The current memory object.                        */\n  /*                                                                       */\n  /*    face          :: The current face object.                          */\n  /*                                                                       */\n  /*    glyph         :: The current glyph slot.                           */\n  /*                                                                       */\n  /*    loader        :: The current glyph loader.                         */\n  /*                                                                       */\n  /*    base          :: The base glyph outline.                           */\n  /*                                                                       */\n  /*    current       :: The current glyph outline.                        */\n  /*                                                                       */\n  /*    pos_x         :: The horizontal translation (if composite glyph).  */\n  /*                                                                       */\n  /*    pos_y         :: The vertical translation (if composite glyph).    */\n  /*                                                                       */\n  /*    left_bearing  :: The left side bearing point.                      */\n  /*                                                                       */\n  /*    advance       :: The horizontal advance vector.                    */\n  /*                                                                       */\n  /*    bbox          :: Unused.                                           */\n  /*                                                                       */\n  /*    path_begun    :: A flag which indicates that a new path has begun. */\n  /*                                                                       */\n  /*    load_points   :: If this flag is not set, no points are loaded.    */\n  /*                                                                       */\n  /*    no_recurse    :: Set but not used.                                 */\n  /*                                                                       */\n  /*    metrics_only  :: A boolean indicating that we only want to compute */\n  /*                     the metrics of a given glyph, not load all of its */\n  /*                     points.                                           */\n  /*                                                                       */\n  /*    hints_funcs   :: Auxiliary pointer for hinting.                    */\n  /*                                                                       */\n  /*    hints_globals :: Auxiliary pointer for hinting.                    */\n  /*                                                                       */\n  typedef struct  CFF_Builder_\n  {\n    FT_Memory       memory;\n    TT_Face         face;\n    CFF_GlyphSlot   glyph;\n    FT_GlyphLoader  loader;\n    FT_Outline*     base;\n    FT_Outline*     current;\n\n    FT_Pos          pos_x;\n    FT_Pos          pos_y;\n\n    FT_Vector       left_bearing;\n    FT_Vector       advance;\n\n    FT_BBox         bbox;          /* bounding box */\n    FT_Bool         path_begun;\n    FT_Bool         load_points;\n    FT_Bool         no_recurse;\n\n    FT_Bool         metrics_only;\n\n    void*           hints_funcs;    /* hinter-specific */\n    void*           hints_globals;  /* hinter-specific */\n\n  } CFF_Builder;\n\n\n  FT_LOCAL( FT_Error )\n  cff_check_points( CFF_Builder*  builder,\n                    FT_Int        count );\n\n  FT_LOCAL( void )\n  cff_builder_add_point( CFF_Builder*  builder,\n                         FT_Pos        x,\n                         FT_Pos        y,\n                         FT_Byte       flag );\n  FT_LOCAL( FT_Error )\n  cff_builder_add_point1( CFF_Builder*  builder,\n                          FT_Pos        x,\n                          FT_Pos        y );\n  FT_LOCAL( FT_Error )\n  cff_builder_start_point( CFF_Builder*  builder,\n                           FT_Pos        x,\n                           FT_Pos        y );\n  FT_LOCAL( void )\n  cff_builder_close_contour( CFF_Builder*  builder );\n\n\n  FT_LOCAL( FT_Int )\n  cff_lookup_glyph_by_stdcharcode( CFF_Font  cff,\n                                   FT_Int    charcode );\n  FT_LOCAL( FT_Error )\n  cff_get_glyph_data( TT_Face    face,\n                      FT_UInt    glyph_index,\n                      FT_Byte**  pointer,\n                      FT_ULong*  length );\n  FT_LOCAL( void )\n  cff_free_glyph_data( TT_Face    face,\n                       FT_Byte**  pointer,\n                       FT_ULong   length );\n\n\n  /* execution context charstring zone */\n\n  typedef struct  CFF_Decoder_Zone_\n  {\n    FT_Byte*  base;\n    FT_Byte*  limit;\n    FT_Byte*  cursor;\n\n  } CFF_Decoder_Zone;\n\n\n  typedef struct  CFF_Decoder_\n  {\n    CFF_Builder        builder;\n    CFF_Font           cff;\n\n    FT_Fixed           stack[CFF_MAX_OPERANDS + 1];\n    FT_Fixed*          top;\n\n    CFF_Decoder_Zone   zones[CFF_MAX_SUBRS_CALLS + 1];\n    CFF_Decoder_Zone*  zone;\n\n    FT_Int             flex_state;\n    FT_Int             num_flex_vectors;\n    FT_Vector          flex_vectors[7];\n\n    FT_Pos             glyph_width;\n    FT_Pos             nominal_width;\n\n    FT_Bool            read_width;\n    FT_Bool            width_only;\n    FT_Int             num_hints;\n    FT_Fixed           buildchar[CFF_MAX_TRANS_ELEMENTS];\n\n    FT_UInt            num_locals;\n    FT_UInt            num_globals;\n\n    FT_Int             locals_bias;\n    FT_Int             globals_bias;\n\n    FT_Byte**          locals;\n    FT_Byte**          globals;\n\n    FT_Byte**          glyph_names;   /* for pure CFF fonts only  */\n    FT_UInt            num_glyphs;    /* number of glyphs in font */\n\n    FT_Render_Mode     hint_mode;\n\n    FT_Bool            seac;\n\n    CFF_SubFont        current_subfont; /* for current glyph_index */\n\n  } CFF_Decoder;\n\n\n  FT_LOCAL( void )\n  cff_decoder_init( CFF_Decoder*    decoder,\n                    TT_Face         face,\n                    CFF_Size        size,\n                    CFF_GlyphSlot   slot,\n                    FT_Bool         hinting,\n                    FT_Render_Mode  hint_mode );\n\n  FT_LOCAL( FT_Error )\n  cff_decoder_prepare( CFF_Decoder*  decoder,\n                       CFF_Size      size,\n                       FT_UInt       glyph_index );\n\n#if 0  /* unused until we support pure CFF fonts */\n\n  /* Compute the maximum advance width of a font through quick parsing */\n  FT_LOCAL( FT_Error )\n  cff_compute_max_advance( TT_Face  face,\n                           FT_Int*  max_advance );\n\n#endif /* 0 */\n\n#ifdef CFF_CONFIG_OPTION_OLD_ENGINE\n  FT_LOCAL( FT_Error )\n  cff_decoder_parse_charstrings( CFF_Decoder*  decoder,\n                                 FT_Byte*      charstring_base,\n                                 FT_ULong      charstring_len );\n#endif\n\n  FT_LOCAL( FT_Error )\n  cff_slot_load( CFF_GlyphSlot  glyph,\n                 CFF_Size       size,\n                 FT_UInt        glyph_index,\n                 FT_Int32       load_flags );\n\n\nFT_END_HEADER\n\n#endif /* __CFFGLOAD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffload.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffload.c                                                              */\n/*                                                                         */\n/*    OpenType and CFF data/program tables loader (body).                  */\n/*                                                                         */\n/*  Copyright 1996-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/tttags.h\"\n#include \"../../include/freetype/t1tables.h\"\n\n#include \"cffload.h\"\n#include \"cffparse.h\"\n\n#include \"cfferrs.h\"\n\n\n#if 1\n\n  static const FT_UShort  cff_isoadobe_charset[229] =\n  {\n      0,   1,   2,   3,   4,   5,   6,   7,\n      8,   9,  10,  11,  12,  13,  14,  15,\n     16,  17,  18,  19,  20,  21,  22,  23,\n     24,  25,  26,  27,  28,  29,  30,  31,\n     32,  33,  34,  35,  36,  37,  38,  39,\n     40,  41,  42,  43,  44,  45,  46,  47,\n     48,  49,  50,  51,  52,  53,  54,  55,\n     56,  57,  58,  59,  60,  61,  62,  63,\n     64,  65,  66,  67,  68,  69,  70,  71,\n     72,  73,  74,  75,  76,  77,  78,  79,\n     80,  81,  82,  83,  84,  85,  86,  87,\n     88,  89,  90,  91,  92,  93,  94,  95,\n     96,  97,  98,  99, 100, 101, 102, 103,\n    104, 105, 106, 107, 108, 109, 110, 111,\n    112, 113, 114, 115, 116, 117, 118, 119,\n    120, 121, 122, 123, 124, 125, 126, 127,\n    128, 129, 130, 131, 132, 133, 134, 135,\n    136, 137, 138, 139, 140, 141, 142, 143,\n    144, 145, 146, 147, 148, 149, 150, 151,\n    152, 153, 154, 155, 156, 157, 158, 159,\n    160, 161, 162, 163, 164, 165, 166, 167,\n    168, 169, 170, 171, 172, 173, 174, 175,\n    176, 177, 178, 179, 180, 181, 182, 183,\n    184, 185, 186, 187, 188, 189, 190, 191,\n    192, 193, 194, 195, 196, 197, 198, 199,\n    200, 201, 202, 203, 204, 205, 206, 207,\n    208, 209, 210, 211, 212, 213, 214, 215,\n    216, 217, 218, 219, 220, 221, 222, 223,\n    224, 225, 226, 227, 228\n  };\n\n  static const FT_UShort  cff_expert_charset[166] =\n  {\n      0,   1, 229, 230, 231, 232, 233, 234,\n    235, 236, 237, 238,  13,  14,  15,  99,\n    239, 240, 241, 242, 243, 244, 245, 246,\n    247, 248,  27,  28, 249, 250, 251, 252,\n    253, 254, 255, 256, 257, 258, 259, 260,\n    261, 262, 263, 264, 265, 266, 109, 110,\n    267, 268, 269, 270, 271, 272, 273, 274,\n    275, 276, 277, 278, 279, 280, 281, 282,\n    283, 284, 285, 286, 287, 288, 289, 290,\n    291, 292, 293, 294, 295, 296, 297, 298,\n    299, 300, 301, 302, 303, 304, 305, 306,\n    307, 308, 309, 310, 311, 312, 313, 314,\n    315, 316, 317, 318, 158, 155, 163, 319,\n    320, 321, 322, 323, 324, 325, 326, 150,\n    164, 169, 327, 328, 329, 330, 331, 332,\n    333, 334, 335, 336, 337, 338, 339, 340,\n    341, 342, 343, 344, 345, 346, 347, 348,\n    349, 350, 351, 352, 353, 354, 355, 356,\n    357, 358, 359, 360, 361, 362, 363, 364,\n    365, 366, 367, 368, 369, 370, 371, 372,\n    373, 374, 375, 376, 377, 378\n  };\n\n  static const FT_UShort  cff_expertsubset_charset[87] =\n  {\n      0,   1, 231, 232, 235, 236, 237, 238,\n     13,  14,  15,  99, 239, 240, 241, 242,\n    243, 244, 245, 246, 247, 248,  27,  28,\n    249, 250, 251, 253, 254, 255, 256, 257,\n    258, 259, 260, 261, 262, 263, 264, 265,\n    266, 109, 110, 267, 268, 269, 270, 272,\n    300, 301, 302, 305, 314, 315, 158, 155,\n    163, 320, 321, 322, 323, 324, 325, 326,\n    150, 164, 169, 327, 328, 329, 330, 331,\n    332, 333, 334, 335, 336, 337, 338, 339,\n    340, 341, 342, 343, 344, 345, 346\n  };\n\n  static const FT_UShort  cff_standard_encoding[256] =\n  {\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      1,   2,   3,   4,   5,   6,   7,   8,\n      9,  10,  11,  12,  13,  14,  15,  16,\n     17,  18,  19,  20,  21,  22,  23,  24,\n     25,  26,  27,  28,  29,  30,  31,  32,\n     33,  34,  35,  36,  37,  38,  39,  40,\n     41,  42,  43,  44,  45,  46,  47,  48,\n     49,  50,  51,  52,  53,  54,  55,  56,\n     57,  58,  59,  60,  61,  62,  63,  64,\n     65,  66,  67,  68,  69,  70,  71,  72,\n     73,  74,  75,  76,  77,  78,  79,  80,\n     81,  82,  83,  84,  85,  86,  87,  88,\n     89,  90,  91,  92,  93,  94,  95,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0,  96,  97,  98,  99, 100, 101, 102,\n    103, 104, 105, 106, 107, 108, 109, 110,\n      0, 111, 112, 113, 114,   0, 115, 116,\n    117, 118, 119, 120, 121, 122,   0, 123,\n      0, 124, 125, 126, 127, 128, 129, 130,\n    131,   0, 132, 133,   0, 134, 135, 136,\n    137,   0,   0,   0,   0,   0,   0,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0, 138,   0, 139,   0,   0,   0,   0,\n    140, 141, 142, 143,   0,   0,   0,   0,\n      0, 144,   0,   0,   0, 145,   0,   0,\n    146, 147, 148, 149,   0,   0,   0,   0\n  };\n\n  static const FT_UShort  cff_expert_encoding[256] =\n  {\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      1, 229, 230,   0, 231, 232, 233, 234,\n    235, 236, 237, 238,  13,  14,  15,  99,\n    239, 240, 241, 242, 243, 244, 245, 246,\n    247, 248,  27,  28, 249, 250, 251, 252,\n      0, 253, 254, 255, 256, 257,   0,   0,\n      0, 258,   0,   0, 259, 260, 261, 262,\n      0,   0, 263, 264, 265,   0, 266, 109,\n    110, 267, 268, 269,   0, 270, 271, 272,\n    273, 274, 275, 276, 277, 278, 279, 280,\n    281, 282, 283, 284, 285, 286, 287, 288,\n    289, 290, 291, 292, 293, 294, 295, 296,\n    297, 298, 299, 300, 301, 302, 303,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0, 304, 305, 306,   0,   0, 307, 308,\n    309, 310, 311,   0, 312,   0,   0, 312,\n      0,   0, 314, 315,   0,   0, 316, 317,\n    318,   0,   0,   0, 158, 155, 163, 319,\n    320, 321, 322, 323, 324, 325,   0,   0,\n    326, 150, 164, 169, 327, 328, 329, 330,\n    331, 332, 333, 334, 335, 336, 337, 338,\n    339, 340, 341, 342, 343, 344, 345, 346,\n    347, 348, 349, 350, 351, 352, 353, 354,\n    355, 356, 357, 358, 359, 360, 361, 362,\n    363, 364, 365, 366, 367, 368, 369, 370,\n    371, 372, 373, 374, 375, 376, 377, 378\n  };\n\n#endif /* 1 */\n\n\n  FT_LOCAL_DEF( FT_UShort )\n  cff_get_standard_encoding( FT_UInt  charcode )\n  {\n    return (FT_UShort)( charcode < 256 ? cff_standard_encoding[charcode]\n                                       : 0 );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cffload\n\n\n  /* read an offset from the index's stream current position */\n  static FT_ULong\n  cff_index_read_offset( CFF_Index  idx,\n                         FT_Error  *errorp )\n  {\n    FT_Error   error;\n    FT_Stream  stream = idx->stream;\n    FT_Byte    tmp[4];\n    FT_ULong   result = 0;\n\n\n    if ( !FT_STREAM_READ( tmp, idx->off_size ) )\n    {\n      FT_Int  nn;\n\n\n      for ( nn = 0; nn < idx->off_size; nn++ )\n        result = ( result << 8 ) | tmp[nn];\n    }\n\n    *errorp = error;\n    return result;\n  }\n\n\n  static FT_Error\n  cff_index_init( CFF_Index  idx,\n                  FT_Stream  stream,\n                  FT_Bool    load )\n  {\n    FT_Error   error;\n    FT_Memory  memory = stream->memory;\n    FT_UShort  count;\n\n\n    FT_MEM_ZERO( idx, sizeof ( *idx ) );\n\n    idx->stream = stream;\n    idx->start  = FT_STREAM_POS();\n    if ( !FT_READ_USHORT( count ) &&\n         count > 0                )\n    {\n      FT_Byte   offsize;\n      FT_ULong  size;\n\n\n      /* there is at least one element; read the offset size,           */\n      /* then access the offset table to compute the index's total size */\n      if ( FT_READ_BYTE( offsize ) )\n        goto Exit;\n\n      if ( offsize < 1 || offsize > 4 )\n      {\n        error = FT_THROW( Invalid_Table );\n        goto Exit;\n      }\n\n      idx->count    = count;\n      idx->off_size = offsize;\n      size          = (FT_ULong)( count + 1 ) * offsize;\n\n      idx->data_offset = idx->start + 3 + size;\n\n      if ( FT_STREAM_SKIP( size - offsize ) )\n        goto Exit;\n\n      size = cff_index_read_offset( idx, &error );\n      if ( error )\n        goto Exit;\n\n      if ( size == 0 )\n      {\n        error = FT_THROW( Invalid_Table );\n        goto Exit;\n      }\n\n      idx->data_size = --size;\n\n      if ( load )\n      {\n        /* load the data */\n        if ( FT_FRAME_EXTRACT( size, idx->bytes ) )\n          goto Exit;\n      }\n      else\n      {\n        /* skip the data */\n        if ( FT_STREAM_SKIP( size ) )\n          goto Exit;\n      }\n    }\n\n  Exit:\n    if ( error )\n      FT_FREE( idx->offsets );\n\n    return error;\n  }\n\n\n  static void\n  cff_index_done( CFF_Index  idx )\n  {\n    if ( idx->stream )\n    {\n      FT_Stream  stream = idx->stream;\n      FT_Memory  memory = stream->memory;\n\n\n      if ( idx->bytes )\n        FT_FRAME_RELEASE( idx->bytes );\n\n      FT_FREE( idx->offsets );\n      FT_MEM_ZERO( idx, sizeof ( *idx ) );\n    }\n  }\n\n\n  static FT_Error\n  cff_index_load_offsets( CFF_Index  idx )\n  {\n    FT_Error   error  = FT_Err_Ok;\n    FT_Stream  stream = idx->stream;\n    FT_Memory  memory = stream->memory;\n\n\n    if ( idx->count > 0 && idx->offsets == NULL )\n    {\n      FT_Byte    offsize = idx->off_size;\n      FT_ULong   data_size;\n      FT_Byte*   p;\n      FT_Byte*   p_end;\n      FT_ULong*  poff;\n\n\n      data_size = (FT_ULong)( idx->count + 1 ) * offsize;\n\n      if ( FT_NEW_ARRAY( idx->offsets, idx->count + 1 ) ||\n           FT_STREAM_SEEK( idx->start + 3 )             ||\n           FT_FRAME_ENTER( data_size )                  )\n        goto Exit;\n\n      poff   = idx->offsets;\n      p      = (FT_Byte*)stream->cursor;\n      p_end  = p + data_size;\n\n      switch ( offsize )\n      {\n      case 1:\n        for ( ; p < p_end; p++, poff++ )\n          poff[0] = p[0];\n        break;\n\n      case 2:\n        for ( ; p < p_end; p += 2, poff++ )\n          poff[0] = FT_PEEK_USHORT( p );\n        break;\n\n      case 3:\n        for ( ; p < p_end; p += 3, poff++ )\n          poff[0] = FT_PEEK_OFF3( p );\n        break;\n\n      default:\n        for ( ; p < p_end; p += 4, poff++ )\n          poff[0] = FT_PEEK_ULONG( p );\n      }\n\n      FT_FRAME_EXIT();\n    }\n\n  Exit:\n    if ( error )\n      FT_FREE( idx->offsets );\n\n    return error;\n  }\n\n\n  /* Allocate a table containing pointers to an index's elements. */\n  /* The `pool' argument makes this function convert the index    */\n  /* entries to C-style strings (this is, NULL-terminated).       */\n  static FT_Error\n  cff_index_get_pointers( CFF_Index   idx,\n                          FT_Byte***  table,\n                          FT_Byte**   pool )\n  {\n    FT_Error   error     = FT_Err_Ok;\n    FT_Memory  memory    = idx->stream->memory;\n\n    FT_Byte**  t         = NULL;\n    FT_Byte*   new_bytes = NULL;\n\n\n    *table = NULL;\n\n    if ( idx->offsets == NULL )\n    {\n      error = cff_index_load_offsets( idx );\n      if ( error )\n        goto Exit;\n    }\n\n    if ( idx->count > 0                                        &&\n         !FT_NEW_ARRAY( t, idx->count + 1 )                    &&\n         ( !pool || !FT_ALLOC( new_bytes,\n                               idx->data_size + idx->count ) ) )\n    {\n      FT_ULong  n, cur_offset;\n      FT_ULong  extra = 0;\n      FT_Byte*  org_bytes = idx->bytes;\n\n\n      /* at this point, `idx->offsets' can't be NULL */\n      cur_offset = idx->offsets[0] - 1;\n\n      /* sanity check */\n      if ( cur_offset >= idx->data_size )\n      {\n        FT_TRACE0(( \"cff_index_get_pointers:\"\n                    \" invalid first offset value %d set to zero\\n\",\n                    cur_offset ));\n        cur_offset = 0;\n      }\n\n      if ( !pool )\n        t[0] = org_bytes + cur_offset;\n      else\n        t[0] = new_bytes + cur_offset;\n\n      for ( n = 1; n <= idx->count; n++ )\n      {\n        FT_ULong  next_offset = idx->offsets[n] - 1;\n\n\n        /* empty slot + two sanity checks for invalid offset tables */\n        if ( next_offset == 0                                    ||\n             next_offset < cur_offset                            ||\n             ( next_offset >= idx->data_size && n < idx->count ) )\n          next_offset = cur_offset;\n\n        if ( !pool )\n          t[n] = org_bytes + next_offset;\n        else\n        {\n          t[n] = new_bytes + next_offset + extra;\n\n          if ( next_offset != cur_offset )\n          {\n            FT_MEM_COPY( t[n - 1], org_bytes + cur_offset, t[n] - t[n - 1] );\n            t[n][0] = '\\0';\n            t[n]   += 1;\n            extra++;\n          }\n        }\n\n        cur_offset = next_offset;\n      }\n      *table = t;\n\n      if ( pool )\n        *pool = new_bytes;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cff_index_access_element( CFF_Index  idx,\n                            FT_UInt    element,\n                            FT_Byte**  pbytes,\n                            FT_ULong*  pbyte_len )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    if ( idx && idx->count > element )\n    {\n      /* compute start and end offsets */\n      FT_Stream  stream = idx->stream;\n      FT_ULong   off1, off2 = 0;\n\n\n      /* load offsets from file or the offset table */\n      if ( !idx->offsets )\n      {\n        FT_ULong  pos = element * idx->off_size;\n\n\n        if ( FT_STREAM_SEEK( idx->start + 3 + pos ) )\n          goto Exit;\n\n        off1 = cff_index_read_offset( idx, &error );\n        if ( error )\n          goto Exit;\n\n        if ( off1 != 0 )\n        {\n          do\n          {\n            element++;\n            off2 = cff_index_read_offset( idx, &error );\n          }\n          while ( off2 == 0 && element < idx->count );\n        }\n      }\n      else   /* use offsets table */\n      {\n        off1 = idx->offsets[element];\n        if ( off1 )\n        {\n          do\n          {\n            element++;\n            off2 = idx->offsets[element];\n\n          } while ( off2 == 0 && element < idx->count );\n        }\n      }\n\n      /* XXX: should check off2 does not exceed the end of this entry; */\n      /*      at present, only truncate off2 at the end of this stream */\n      if ( off2 > stream->size + 1                    ||\n           idx->data_offset > stream->size - off2 + 1 )\n      {\n        FT_ERROR(( \"cff_index_access_element:\"\n                   \" offset to next entry (%d)\"\n                   \" exceeds the end of stream (%d)\\n\",\n                   off2, stream->size - idx->data_offset + 1 ));\n        off2 = stream->size - idx->data_offset + 1;\n      }\n\n      /* access element */\n      if ( off1 && off2 > off1 )\n      {\n        *pbyte_len = off2 - off1;\n\n        if ( idx->bytes )\n        {\n          /* this index was completely loaded in memory, that's easy */\n          *pbytes = idx->bytes + off1 - 1;\n        }\n        else\n        {\n          /* this index is still on disk/file, access it through a frame */\n          if ( FT_STREAM_SEEK( idx->data_offset + off1 - 1 ) ||\n               FT_FRAME_EXTRACT( off2 - off1, *pbytes )      )\n            goto Exit;\n        }\n      }\n      else\n      {\n        /* empty index element */\n        *pbytes    = 0;\n        *pbyte_len = 0;\n      }\n    }\n    else\n      error = FT_THROW( Invalid_Argument );\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cff_index_forget_element( CFF_Index  idx,\n                            FT_Byte**  pbytes )\n  {\n    if ( idx->bytes == 0 )\n    {\n      FT_Stream  stream = idx->stream;\n\n\n      FT_FRAME_RELEASE( *pbytes );\n    }\n  }\n\n\n  /* get an entry from Name INDEX */\n  FT_LOCAL_DEF( FT_String* )\n  cff_index_get_name( CFF_Font  font,\n                      FT_UInt   element )\n  {\n    CFF_Index   idx = &font->name_index;\n    FT_Memory   memory = idx->stream->memory;\n    FT_Byte*    bytes;\n    FT_ULong    byte_len;\n    FT_Error    error;\n    FT_String*  name = 0;\n\n\n    error = cff_index_access_element( idx, element, &bytes, &byte_len );\n    if ( error )\n      goto Exit;\n\n    if ( !FT_ALLOC( name, byte_len + 1 ) )\n    {\n      FT_MEM_COPY( name, bytes, byte_len );\n      name[byte_len] = 0;\n    }\n    cff_index_forget_element( idx, &bytes );\n\n  Exit:\n    return name;\n  }\n\n\n  /* get an entry from String INDEX */\n  FT_LOCAL_DEF( FT_String* )\n  cff_index_get_string( CFF_Font  font,\n                        FT_UInt   element )\n  {\n    return ( element < font->num_strings )\n             ? (FT_String*)font->strings[element]\n             : NULL;\n  }\n\n\n  FT_LOCAL_DEF( FT_String* )\n  cff_index_get_sid_string( CFF_Font  font,\n                            FT_UInt   sid )\n  {\n    /* value 0xFFFFU indicates a missing dictionary entry */\n    if ( sid == 0xFFFFU )\n      return NULL;\n\n    /* if it is not a standard string, return it */\n    if ( sid > 390 )\n      return cff_index_get_string( font, sid - 391 );\n\n    /* CID-keyed CFF fonts don't have glyph names */\n    if ( !font->psnames )\n      return NULL;\n\n    /* this is a standard string */\n    return (FT_String *)font->psnames->adobe_std_strings( sid );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***   FD Select table support                                         ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  static void\n  CFF_Done_FD_Select( CFF_FDSelect  fdselect,\n                      FT_Stream     stream )\n  {\n    if ( fdselect->data )\n      FT_FRAME_RELEASE( fdselect->data );\n\n    fdselect->data_size   = 0;\n    fdselect->format      = 0;\n    fdselect->range_count = 0;\n  }\n\n\n  static FT_Error\n  CFF_Load_FD_Select( CFF_FDSelect  fdselect,\n                      FT_UInt       num_glyphs,\n                      FT_Stream     stream,\n                      FT_ULong      offset )\n  {\n    FT_Error  error;\n    FT_Byte   format;\n    FT_UInt   num_ranges;\n\n\n    /* read format */\n    if ( FT_STREAM_SEEK( offset ) || FT_READ_BYTE( format ) )\n      goto Exit;\n\n    fdselect->format      = format;\n    fdselect->cache_count = 0;   /* clear cache */\n\n    switch ( format )\n    {\n    case 0:     /* format 0, that's simple */\n      fdselect->data_size = num_glyphs;\n      goto Load_Data;\n\n    case 3:     /* format 3, a tad more complex */\n      if ( FT_READ_USHORT( num_ranges ) )\n        goto Exit;\n\n      fdselect->data_size = num_ranges * 3 + 2;\n\n    Load_Data:\n      if ( FT_FRAME_EXTRACT( fdselect->data_size, fdselect->data ) )\n        goto Exit;\n      break;\n\n    default:    /* hmm... that's wrong */\n      error = FT_THROW( Invalid_File_Format );\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Byte )\n  cff_fd_select_get( CFF_FDSelect  fdselect,\n                     FT_UInt       glyph_index )\n  {\n    FT_Byte  fd = 0;\n\n\n    switch ( fdselect->format )\n    {\n    case 0:\n      fd = fdselect->data[glyph_index];\n      break;\n\n    case 3:\n      /* first, compare to cache */\n      if ( (FT_UInt)( glyph_index - fdselect->cache_first ) <\n                        fdselect->cache_count )\n      {\n        fd = fdselect->cache_fd;\n        break;\n      }\n\n      /* then, lookup the ranges array */\n      {\n        FT_Byte*  p       = fdselect->data;\n        FT_Byte*  p_limit = p + fdselect->data_size;\n        FT_Byte   fd2;\n        FT_UInt   first, limit;\n\n\n        first = FT_NEXT_USHORT( p );\n        do\n        {\n          if ( glyph_index < first )\n            break;\n\n          fd2   = *p++;\n          limit = FT_NEXT_USHORT( p );\n\n          if ( glyph_index < limit )\n          {\n            fd = fd2;\n\n            /* update cache */\n            fdselect->cache_first = first;\n            fdselect->cache_count = limit-first;\n            fdselect->cache_fd    = fd2;\n            break;\n          }\n          first = limit;\n\n        } while ( p < p_limit );\n      }\n      break;\n\n    default:\n      ;\n    }\n\n    return fd;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***   CFF font support                                                ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static FT_Error\n  cff_charset_compute_cids( CFF_Charset  charset,\n                            FT_UInt      num_glyphs,\n                            FT_Memory    memory )\n  {\n    FT_Error   error   = FT_Err_Ok;\n    FT_UInt    i;\n    FT_Long    j;\n    FT_UShort  max_cid = 0;\n\n\n    if ( charset->max_cid > 0 )\n      goto Exit;\n\n    for ( i = 0; i < num_glyphs; i++ )\n    {\n      if ( charset->sids[i] > max_cid )\n        max_cid = charset->sids[i];\n    }\n\n    if ( FT_NEW_ARRAY( charset->cids, (FT_ULong)max_cid + 1 ) )\n      goto Exit;\n\n    /* When multiple GIDs map to the same CID, we choose the lowest */\n    /* GID.  This is not described in any spec, but it matches the  */\n    /* behaviour of recent Acroread versions.                       */\n    for ( j = num_glyphs - 1; j >= 0 ; j-- )\n      charset->cids[charset->sids[j]] = (FT_UShort)j;\n\n    charset->max_cid    = max_cid;\n    charset->num_glyphs = num_glyphs;\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_UInt )\n  cff_charset_cid_to_gindex( CFF_Charset  charset,\n                             FT_UInt      cid )\n  {\n    FT_UInt  result = 0;\n\n\n    if ( cid <= charset->max_cid )\n      result = charset->cids[cid];\n\n    return result;\n  }\n\n\n  static void\n  cff_charset_free_cids( CFF_Charset  charset,\n                         FT_Memory    memory )\n  {\n    FT_FREE( charset->cids );\n    charset->max_cid = 0;\n  }\n\n\n  static void\n  cff_charset_done( CFF_Charset  charset,\n                    FT_Stream    stream )\n  {\n    FT_Memory  memory = stream->memory;\n\n\n    cff_charset_free_cids( charset, memory );\n\n    FT_FREE( charset->sids );\n    charset->format = 0;\n    charset->offset = 0;\n  }\n\n\n  static FT_Error\n  cff_charset_load( CFF_Charset  charset,\n                    FT_UInt      num_glyphs,\n                    FT_Stream    stream,\n                    FT_ULong     base_offset,\n                    FT_ULong     offset,\n                    FT_Bool      invert )\n  {\n    FT_Memory  memory = stream->memory;\n    FT_Error   error  = FT_Err_Ok;\n    FT_UShort  glyph_sid;\n\n\n    /* If the the offset is greater than 2, we have to parse the */\n    /* charset table.                                            */\n    if ( offset > 2 )\n    {\n      FT_UInt  j;\n\n\n      charset->offset = base_offset + offset;\n\n      /* Get the format of the table. */\n      if ( FT_STREAM_SEEK( charset->offset ) ||\n           FT_READ_BYTE( charset->format )   )\n        goto Exit;\n\n      /* Allocate memory for sids. */\n      if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )\n        goto Exit;\n\n      /* assign the .notdef glyph */\n      charset->sids[0] = 0;\n\n      switch ( charset->format )\n      {\n      case 0:\n        if ( num_glyphs > 0 )\n        {\n          if ( FT_FRAME_ENTER( ( num_glyphs - 1 ) * 2 ) )\n            goto Exit;\n\n          for ( j = 1; j < num_glyphs; j++ )\n            charset->sids[j] = FT_GET_USHORT();\n\n          FT_FRAME_EXIT();\n        }\n        break;\n\n      case 1:\n      case 2:\n        {\n          FT_UInt  nleft;\n          FT_UInt  i;\n\n\n          j = 1;\n\n          while ( j < num_glyphs )\n          {\n            /* Read the first glyph sid of the range. */\n            if ( FT_READ_USHORT( glyph_sid ) )\n              goto Exit;\n\n            /* Read the number of glyphs in the range.  */\n            if ( charset->format == 2 )\n            {\n              if ( FT_READ_USHORT( nleft ) )\n                goto Exit;\n            }\n            else\n            {\n              if ( FT_READ_BYTE( nleft ) )\n                goto Exit;\n            }\n\n            /* try to rescue some of the SIDs if `nleft' is too large */\n            if ( glyph_sid > 0xFFFFL - nleft )\n            {\n              FT_ERROR(( \"cff_charset_load: invalid SID range trimmed\"\n                         \" nleft=%d -> %d\\n\", nleft, 0xFFFFL - glyph_sid ));\n              nleft = ( FT_UInt )( 0xFFFFL - glyph_sid );\n            }\n\n            /* Fill in the range of sids -- `nleft + 1' glyphs. */\n            for ( i = 0; j < num_glyphs && i <= nleft; i++, j++, glyph_sid++ )\n              charset->sids[j] = glyph_sid;\n          }\n        }\n        break;\n\n      default:\n        FT_ERROR(( \"cff_charset_load: invalid table format\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n    }\n    else\n    {\n      /* Parse default tables corresponding to offset == 0, 1, or 2.  */\n      /* CFF specification intimates the following:                   */\n      /*                                                              */\n      /* In order to use a predefined charset, the following must be  */\n      /* true: The charset constructed for the glyphs in the font's   */\n      /* charstrings dictionary must match the predefined charset in  */\n      /* the first num_glyphs.                                        */\n\n      charset->offset = offset;  /* record charset type */\n\n      switch ( (FT_UInt)offset )\n      {\n      case 0:\n        if ( num_glyphs > 229 )\n        {\n          FT_ERROR(( \"cff_charset_load: implicit charset larger than\\n\"\n                     \"predefined charset (Adobe ISO-Latin)\\n\" ));\n          error = FT_THROW( Invalid_File_Format );\n          goto Exit;\n        }\n\n        /* Allocate memory for sids. */\n        if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )\n          goto Exit;\n\n        /* Copy the predefined charset into the allocated memory. */\n        FT_ARRAY_COPY( charset->sids, cff_isoadobe_charset, num_glyphs );\n\n        break;\n\n      case 1:\n        if ( num_glyphs > 166 )\n        {\n          FT_ERROR(( \"cff_charset_load: implicit charset larger than\\n\"\n                     \"predefined charset (Adobe Expert)\\n\" ));\n          error = FT_THROW( Invalid_File_Format );\n          goto Exit;\n        }\n\n        /* Allocate memory for sids. */\n        if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )\n          goto Exit;\n\n        /* Copy the predefined charset into the allocated memory.     */\n        FT_ARRAY_COPY( charset->sids, cff_expert_charset, num_glyphs );\n\n        break;\n\n      case 2:\n        if ( num_glyphs > 87 )\n        {\n          FT_ERROR(( \"cff_charset_load: implicit charset larger than\\n\"\n                     \"predefined charset (Adobe Expert Subset)\\n\" ));\n          error = FT_THROW( Invalid_File_Format );\n          goto Exit;\n        }\n\n        /* Allocate memory for sids. */\n        if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )\n          goto Exit;\n\n        /* Copy the predefined charset into the allocated memory.     */\n        FT_ARRAY_COPY( charset->sids, cff_expertsubset_charset, num_glyphs );\n\n        break;\n\n      default:\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n    }\n\n    /* we have to invert the `sids' array for subsetted CID-keyed fonts */\n    if ( invert )\n      error = cff_charset_compute_cids( charset, num_glyphs, memory );\n\n  Exit:\n    /* Clean up if there was an error. */\n    if ( error )\n    {\n      FT_FREE( charset->sids );\n      FT_FREE( charset->cids );\n      charset->format = 0;\n      charset->offset = 0;\n      charset->sids   = 0;\n    }\n\n    return error;\n  }\n\n\n  static void\n  cff_encoding_done( CFF_Encoding  encoding )\n  {\n    encoding->format = 0;\n    encoding->offset = 0;\n    encoding->count  = 0;\n  }\n\n\n  static FT_Error\n  cff_encoding_load( CFF_Encoding  encoding,\n                     CFF_Charset   charset,\n                     FT_UInt       num_glyphs,\n                     FT_Stream     stream,\n                     FT_ULong      base_offset,\n                     FT_ULong      offset )\n  {\n    FT_Error   error = FT_Err_Ok;\n    FT_UInt    count;\n    FT_UInt    j;\n    FT_UShort  glyph_sid;\n    FT_UInt    glyph_code;\n\n\n    /* Check for charset->sids.  If we do not have this, we fail. */\n    if ( !charset->sids )\n    {\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    /* Zero out the code to gid/sid mappings. */\n    for ( j = 0; j < 256; j++ )\n    {\n      encoding->sids [j] = 0;\n      encoding->codes[j] = 0;\n    }\n\n    /* Note: The encoding table in a CFF font is indexed by glyph index;  */\n    /* the first encoded glyph index is 1.  Hence, we read the character  */\n    /* code (`glyph_code') at index j and make the assignment:            */\n    /*                                                                    */\n    /*    encoding->codes[glyph_code] = j + 1                             */\n    /*                                                                    */\n    /* We also make the assignment:                                       */\n    /*                                                                    */\n    /*    encoding->sids[glyph_code] = charset->sids[j + 1]               */\n    /*                                                                    */\n    /* This gives us both a code to GID and a code to SID mapping.        */\n\n    if ( offset > 1 )\n    {\n      encoding->offset = base_offset + offset;\n\n      /* we need to parse the table to determine its size */\n      if ( FT_STREAM_SEEK( encoding->offset ) ||\n           FT_READ_BYTE( encoding->format )   ||\n           FT_READ_BYTE( count )              )\n        goto Exit;\n\n      switch ( encoding->format & 0x7F )\n      {\n      case 0:\n        {\n          FT_Byte*  p;\n\n\n          /* By convention, GID 0 is always \".notdef\" and is never */\n          /* coded in the font.  Hence, the number of codes found  */\n          /* in the table is `count+1'.                            */\n          /*                                                       */\n          encoding->count = count + 1;\n\n          if ( FT_FRAME_ENTER( count ) )\n            goto Exit;\n\n          p = (FT_Byte*)stream->cursor;\n\n          for ( j = 1; j <= count; j++ )\n          {\n            glyph_code = *p++;\n\n            /* Make sure j is not too big. */\n            if ( j < num_glyphs )\n            {\n              /* Assign code to GID mapping. */\n              encoding->codes[glyph_code] = (FT_UShort)j;\n\n              /* Assign code to SID mapping. */\n              encoding->sids[glyph_code] = charset->sids[j];\n            }\n          }\n\n          FT_FRAME_EXIT();\n        }\n        break;\n\n      case 1:\n        {\n          FT_UInt  nleft;\n          FT_UInt  i = 1;\n          FT_UInt  k;\n\n\n          encoding->count = 0;\n\n          /* Parse the Format1 ranges. */\n          for ( j = 0;  j < count; j++, i += nleft )\n          {\n            /* Read the first glyph code of the range. */\n            if ( FT_READ_BYTE( glyph_code ) )\n              goto Exit;\n\n            /* Read the number of codes in the range. */\n            if ( FT_READ_BYTE( nleft ) )\n              goto Exit;\n\n            /* Increment nleft, so we read `nleft + 1' codes/sids. */\n            nleft++;\n\n            /* compute max number of character codes */\n            if ( (FT_UInt)nleft > encoding->count )\n              encoding->count = nleft;\n\n            /* Fill in the range of codes/sids. */\n            for ( k = i; k < nleft + i; k++, glyph_code++ )\n            {\n              /* Make sure k is not too big. */\n              if ( k < num_glyphs && glyph_code < 256 )\n              {\n                /* Assign code to GID mapping. */\n                encoding->codes[glyph_code] = (FT_UShort)k;\n\n                /* Assign code to SID mapping. */\n                encoding->sids[glyph_code] = charset->sids[k];\n              }\n            }\n          }\n\n          /* simple check; one never knows what can be found in a font */\n          if ( encoding->count > 256 )\n            encoding->count = 256;\n        }\n        break;\n\n      default:\n        FT_ERROR(( \"cff_encoding_load: invalid table format\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n\n      /* Parse supplemental encodings, if any. */\n      if ( encoding->format & 0x80 )\n      {\n        FT_UInt  gindex;\n\n\n        /* count supplements */\n        if ( FT_READ_BYTE( count ) )\n          goto Exit;\n\n        for ( j = 0; j < count; j++ )\n        {\n          /* Read supplemental glyph code. */\n          if ( FT_READ_BYTE( glyph_code ) )\n            goto Exit;\n\n          /* Read the SID associated with this glyph code. */\n          if ( FT_READ_USHORT( glyph_sid ) )\n            goto Exit;\n\n          /* Assign code to SID mapping. */\n          encoding->sids[glyph_code] = glyph_sid;\n\n          /* First, look up GID which has been assigned to */\n          /* SID glyph_sid.                                */\n          for ( gindex = 0; gindex < num_glyphs; gindex++ )\n          {\n            if ( charset->sids[gindex] == glyph_sid )\n            {\n              encoding->codes[glyph_code] = (FT_UShort)gindex;\n              break;\n            }\n          }\n        }\n      }\n    }\n    else\n    {\n      /* We take into account the fact a CFF font can use a predefined */\n      /* encoding without containing all of the glyphs encoded by this */\n      /* encoding (see the note at the end of section 12 in the CFF    */\n      /* specification).                                               */\n\n      switch ( (FT_UInt)offset )\n      {\n      case 0:\n        /* First, copy the code to SID mapping. */\n        FT_ARRAY_COPY( encoding->sids, cff_standard_encoding, 256 );\n        goto Populate;\n\n      case 1:\n        /* First, copy the code to SID mapping. */\n        FT_ARRAY_COPY( encoding->sids, cff_expert_encoding, 256 );\n\n      Populate:\n        /* Construct code to GID mapping from code to SID mapping */\n        /* and charset.                                           */\n\n        encoding->count = 0;\n\n        error = cff_charset_compute_cids( charset, num_glyphs,\n                                          stream->memory );\n        if ( error )\n          goto Exit;\n\n        for ( j = 0; j < 256; j++ )\n        {\n          FT_UInt  sid = encoding->sids[j];\n          FT_UInt  gid = 0;\n\n\n          if ( sid )\n            gid = cff_charset_cid_to_gindex( charset, sid );\n\n          if ( gid != 0 )\n          {\n            encoding->codes[j] = (FT_UShort)gid;\n            encoding->count    = j + 1;\n          }\n          else\n          {\n            encoding->codes[j] = 0;\n            encoding->sids [j] = 0;\n          }\n        }\n        break;\n\n      default:\n        FT_ERROR(( \"cff_encoding_load: invalid table format\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n    }\n\n  Exit:\n\n    /* Clean up if there was an error. */\n    return error;\n  }\n\n\n  static FT_Error\n  cff_subfont_load( CFF_SubFont  font,\n                    CFF_Index    idx,\n                    FT_UInt      font_index,\n                    FT_Stream    stream,\n                    FT_ULong     base_offset,\n                    FT_Library   library )\n  {\n    FT_Error         error;\n    CFF_ParserRec    parser;\n    FT_Byte*         dict = NULL;\n    FT_ULong         dict_len;\n    CFF_FontRecDict  top  = &font->font_dict;\n    CFF_Private      priv = &font->private_dict;\n\n\n    cff_parser_init( &parser, CFF_CODE_TOPDICT, &font->font_dict, library );\n\n    /* set defaults */\n    FT_MEM_ZERO( top, sizeof ( *top ) );\n\n    top->underline_position  = -( 100L << 16 );\n    top->underline_thickness = 50L << 16;\n    top->charstring_type     = 2;\n    top->font_matrix.xx      = 0x10000L;\n    top->font_matrix.yy      = 0x10000L;\n    top->cid_count           = 8720;\n\n    /* we use the implementation specific SID value 0xFFFF to indicate */\n    /* missing entries                                                 */\n    top->version             = 0xFFFFU;\n    top->notice              = 0xFFFFU;\n    top->copyright           = 0xFFFFU;\n    top->full_name           = 0xFFFFU;\n    top->family_name         = 0xFFFFU;\n    top->weight              = 0xFFFFU;\n    top->embedded_postscript = 0xFFFFU;\n\n    top->cid_registry        = 0xFFFFU;\n    top->cid_ordering        = 0xFFFFU;\n    top->cid_font_name       = 0xFFFFU;\n\n    error = cff_index_access_element( idx, font_index, &dict, &dict_len );\n    if ( !error )\n    {\n      FT_TRACE4(( \" top dictionary:\\n\" ));\n      error = cff_parser_run( &parser, dict, dict + dict_len );\n    }\n\n    cff_index_forget_element( idx, &dict );\n\n    if ( error )\n      goto Exit;\n\n    /* if it is a CID font, we stop there */\n    if ( top->cid_registry != 0xFFFFU )\n      goto Exit;\n\n    /* parse the private dictionary, if any */\n    if ( top->private_offset && top->private_size )\n    {\n      /* set defaults */\n      FT_MEM_ZERO( priv, sizeof ( *priv ) );\n\n      priv->blue_shift       = 7;\n      priv->blue_fuzz        = 1;\n      priv->lenIV            = -1;\n      priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L );\n      priv->blue_scale       = (FT_Fixed)( 0.039625 * 0x10000L * 1000 );\n\n      cff_parser_init( &parser, CFF_CODE_PRIVATE, priv, library );\n\n      if ( FT_STREAM_SEEK( base_offset + font->font_dict.private_offset ) ||\n           FT_FRAME_ENTER( font->font_dict.private_size )                 )\n        goto Exit;\n\n      FT_TRACE4(( \" private dictionary:\\n\" ));\n      error = cff_parser_run( &parser,\n                              (FT_Byte*)stream->cursor,\n                              (FT_Byte*)stream->limit );\n      FT_FRAME_EXIT();\n      if ( error )\n        goto Exit;\n\n      /* ensure that `num_blue_values' is even */\n      priv->num_blue_values &= ~1;\n    }\n\n    /* read the local subrs, if any */\n    if ( priv->local_subrs_offset )\n    {\n      if ( FT_STREAM_SEEK( base_offset + top->private_offset +\n                           priv->local_subrs_offset ) )\n        goto Exit;\n\n      error = cff_index_init( &font->local_subrs_index, stream, 1 );\n      if ( error )\n        goto Exit;\n\n      error = cff_index_get_pointers( &font->local_subrs_index,\n                                      &font->local_subrs, NULL );\n      if ( error )\n        goto Exit;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  static void\n  cff_subfont_done( FT_Memory    memory,\n                    CFF_SubFont  subfont )\n  {\n    if ( subfont )\n    {\n      cff_index_done( &subfont->local_subrs_index );\n      FT_FREE( subfont->local_subrs );\n    }\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cff_font_load( FT_Library library,\n                 FT_Stream  stream,\n                 FT_Int     face_index,\n                 CFF_Font   font,\n                 FT_Bool    pure_cff )\n  {\n    static const FT_Frame_Field  cff_header_fields[] =\n    {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  CFF_FontRec\n\n      FT_FRAME_START( 4 ),\n        FT_FRAME_BYTE( version_major ),\n        FT_FRAME_BYTE( version_minor ),\n        FT_FRAME_BYTE( header_size ),\n        FT_FRAME_BYTE( absolute_offsize ),\n      FT_FRAME_END\n    };\n\n    FT_Error         error;\n    FT_Memory        memory = stream->memory;\n    FT_ULong         base_offset;\n    CFF_FontRecDict  dict;\n    CFF_IndexRec     string_index;\n    FT_Int           subfont_index;\n\n\n    FT_ZERO( font );\n    FT_ZERO( &string_index );\n\n    font->stream = stream;\n    font->memory = memory;\n    dict         = &font->top_font.font_dict;\n    base_offset  = FT_STREAM_POS();\n\n    /* read CFF font header */\n    if ( FT_STREAM_READ_FIELDS( cff_header_fields, font ) )\n      goto Exit;\n\n    /* check format */\n    if ( font->version_major   != 1 ||\n         font->header_size      < 4 ||\n         font->absolute_offsize > 4 )\n    {\n      FT_TRACE2(( \"  not a CFF font header\\n\" ));\n      error = FT_THROW( Unknown_File_Format );\n      goto Exit;\n    }\n\n    /* skip the rest of the header */\n    if ( FT_STREAM_SKIP( font->header_size - 4 ) )\n      goto Exit;\n\n    /* read the name, top dict, string and global subrs index */\n    if ( FT_SET_ERROR( cff_index_init( &font->name_index,\n                                       stream, 0 ) )                  ||\n         FT_SET_ERROR( cff_index_init( &font->font_dict_index,\n                                       stream, 0 ) )                  ||\n         FT_SET_ERROR( cff_index_init( &string_index,\n                                       stream, 1 ) )                  ||\n         FT_SET_ERROR( cff_index_init( &font->global_subrs_index,\n                                       stream, 1 ) )                  ||\n         FT_SET_ERROR( cff_index_get_pointers( &string_index,\n                                               &font->strings,\n                                               &font->string_pool ) ) )\n      goto Exit;\n\n    font->num_strings = string_index.count;\n\n    if ( pure_cff )\n    {\n      /* well, we don't really forget the `disabled' fonts... */\n      subfont_index = face_index;\n\n      if ( subfont_index >= (FT_Int)font->name_index.count )\n      {\n        FT_ERROR(( \"cff_font_load:\"\n                   \" invalid subfont index for pure CFF font (%d)\\n\",\n                   subfont_index ));\n        error = FT_THROW( Invalid_Argument );\n        goto Exit;\n      }\n\n      font->num_faces = font->name_index.count;\n    }\n    else\n    {\n      subfont_index = 0;\n\n      if ( font->name_index.count > 1 )\n      {\n        FT_ERROR(( \"cff_font_load:\"\n                   \" invalid CFF font with multiple subfonts\\n\"\n                   \"              \"\n                   \" in SFNT wrapper\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n    }\n\n    /* in case of a font format check, simply exit now */\n    if ( face_index < 0 )\n      goto Exit;\n\n    /* now, parse the top-level font dictionary */\n    FT_TRACE4(( \"parsing top-level\\n\" ));\n    error = cff_subfont_load( &font->top_font,\n                              &font->font_dict_index,\n                              subfont_index,\n                              stream,\n                              base_offset,\n                              library );\n    if ( error )\n      goto Exit;\n\n    if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) )\n      goto Exit;\n\n    error = cff_index_init( &font->charstrings_index, stream, 0 );\n    if ( error )\n      goto Exit;\n\n    /* now, check for a CID font */\n    if ( dict->cid_registry != 0xFFFFU )\n    {\n      CFF_IndexRec  fd_index;\n      CFF_SubFont   sub = NULL;\n      FT_UInt       idx;\n\n\n      /* this is a CID-keyed font, we must now allocate a table of */\n      /* sub-fonts, then load each of them separately              */\n      if ( FT_STREAM_SEEK( base_offset + dict->cid_fd_array_offset ) )\n        goto Exit;\n\n      error = cff_index_init( &fd_index, stream, 0 );\n      if ( error )\n        goto Exit;\n\n      if ( fd_index.count > CFF_MAX_CID_FONTS )\n      {\n        FT_TRACE0(( \"cff_font_load: FD array too large in CID font\\n\" ));\n        goto Fail_CID;\n      }\n\n      /* allocate & read each font dict independently */\n      font->num_subfonts = fd_index.count;\n      if ( FT_NEW_ARRAY( sub, fd_index.count ) )\n        goto Fail_CID;\n\n      /* set up pointer table */\n      for ( idx = 0; idx < fd_index.count; idx++ )\n        font->subfonts[idx] = sub + idx;\n\n      /* now load each subfont independently */\n      for ( idx = 0; idx < fd_index.count; idx++ )\n      {\n        sub = font->subfonts[idx];\n        FT_TRACE4(( \"parsing subfont %u\\n\", idx ));\n        error = cff_subfont_load( sub, &fd_index, idx,\n                                  stream, base_offset, library );\n        if ( error )\n          goto Fail_CID;\n      }\n\n      /* now load the FD Select array */\n      error = CFF_Load_FD_Select( &font->fd_select,\n                                  font->charstrings_index.count,\n                                  stream,\n                                  base_offset + dict->cid_fd_select_offset );\n\n    Fail_CID:\n      cff_index_done( &fd_index );\n\n      if ( error )\n        goto Exit;\n    }\n    else\n      font->num_subfonts = 0;\n\n    /* read the charstrings index now */\n    if ( dict->charstrings_offset == 0 )\n    {\n      FT_ERROR(( \"cff_font_load: no charstrings offset\\n\" ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    font->num_glyphs = font->charstrings_index.count;\n\n    error = cff_index_get_pointers( &font->global_subrs_index,\n                                    &font->global_subrs, NULL );\n\n    if ( error )\n      goto Exit;\n\n    /* read the Charset and Encoding tables if available */\n    if ( font->num_glyphs > 0 )\n    {\n      FT_Bool  invert = FT_BOOL( dict->cid_registry != 0xFFFFU && pure_cff );\n\n\n      error = cff_charset_load( &font->charset, font->num_glyphs, stream,\n                                base_offset, dict->charset_offset, invert );\n      if ( error )\n        goto Exit;\n\n      /* CID-keyed CFFs don't have an encoding */\n      if ( dict->cid_registry == 0xFFFFU )\n      {\n        error = cff_encoding_load( &font->encoding,\n                                   &font->charset,\n                                   font->num_glyphs,\n                                   stream,\n                                   base_offset,\n                                   dict->encoding_offset );\n        if ( error )\n          goto Exit;\n      }\n    }\n\n    /* get the font name (/CIDFontName for CID-keyed fonts, */\n    /* /FontName otherwise)                                 */\n    font->font_name = cff_index_get_name( font, subfont_index );\n\n  Exit:\n    cff_index_done( &string_index );\n\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cff_font_done( CFF_Font  font )\n  {\n    FT_Memory  memory = font->memory;\n    FT_UInt    idx;\n\n\n    cff_index_done( &font->global_subrs_index );\n    cff_index_done( &font->font_dict_index );\n    cff_index_done( &font->name_index );\n    cff_index_done( &font->charstrings_index );\n\n    /* release font dictionaries, but only if working with */\n    /* a CID keyed CFF font                                */\n    if ( font->num_subfonts > 0 )\n    {\n      for ( idx = 0; idx < font->num_subfonts; idx++ )\n        cff_subfont_done( memory, font->subfonts[idx] );\n\n      /* the subfonts array has been allocated as a single block */\n      FT_FREE( font->subfonts[0] );\n    }\n\n    cff_encoding_done( &font->encoding );\n    cff_charset_done( &font->charset, font->stream );\n\n    cff_subfont_done( memory, &font->top_font );\n\n    CFF_Done_FD_Select( &font->fd_select, font->stream );\n\n    FT_FREE( font->font_info );\n\n    FT_FREE( font->font_name );\n    FT_FREE( font->global_subrs );\n    FT_FREE( font->strings );\n    FT_FREE( font->string_pool );\n\n    if ( font->cf2_instance.finalizer )\n    {\n      font->cf2_instance.finalizer( font->cf2_instance.data );\n      FT_FREE( font->cf2_instance.data );\n    }\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffload.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffload.h                                                              */\n/*                                                                         */\n/*    OpenType & CFF data/program tables loader (specification).           */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2007, 2008, 2010 by                   */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CFFLOAD_H__\n#define __CFFLOAD_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"cfftypes.h\"\n\n\nFT_BEGIN_HEADER\n\n  FT_LOCAL( FT_UShort )\n  cff_get_standard_encoding( FT_UInt  charcode );\n\n\n  FT_LOCAL( FT_String* )\n  cff_index_get_string( CFF_Font  font,\n                        FT_UInt   element );\n\n  FT_LOCAL( FT_String* )\n  cff_index_get_sid_string( CFF_Font  font,\n                            FT_UInt   sid );\n\n\n  FT_LOCAL( FT_Error )\n  cff_index_access_element( CFF_Index  idx,\n                            FT_UInt    element,\n                            FT_Byte**  pbytes,\n                            FT_ULong*  pbyte_len );\n\n  FT_LOCAL( void )\n  cff_index_forget_element( CFF_Index  idx,\n                            FT_Byte**  pbytes );\n\n  FT_LOCAL( FT_String* )\n  cff_index_get_name( CFF_Font  font,\n                      FT_UInt   element );\n\n\n  FT_LOCAL( FT_UInt )\n  cff_charset_cid_to_gindex( CFF_Charset  charset,\n                             FT_UInt      cid );\n\n\n  FT_LOCAL( FT_Error )\n  cff_font_load( FT_Library library,\n                 FT_Stream  stream,\n                 FT_Int     face_index,\n                 CFF_Font   font,\n                 FT_Bool    pure_cff );\n\n  FT_LOCAL( void )\n  cff_font_done( CFF_Font  font );\n\n\n  FT_LOCAL( FT_Byte )\n  cff_fd_select_get( CFF_FDSelect  fdselect,\n                     FT_UInt       glyph_index );\n\n\nFT_END_HEADER\n\n#endif /* __CFFLOAD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffobjs.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffobjs.c                                                              */\n/*                                                                         */\n/*    OpenType objects manager (body).                                     */\n/*                                                                         */\n/*  Copyright 1996-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftcalc.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/fterrors.h\"\n#include \"../../include/freetype/ttnameid.h\"\n#include \"../../include/freetype/tttags.h\"\n#include \"../../include/freetype/internal/sfnt.h\"\n#include \"../../include/freetype/ftcffdrv.h\"\n\n#include \"cffobjs.h\"\n#include \"cffload.h\"\n#include \"cffcmap.h\"\n#include \"cffpic.h\"\n\n#include \"cfferrs.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cffobjs\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                            SIZE FUNCTIONS                             */\n  /*                                                                       */\n  /*  Note that we store the global hints in the size's `internal' root    */\n  /*  field.                                                               */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  static PSH_Globals_Funcs\n  cff_size_get_globals_funcs( CFF_Size  size )\n  {\n    CFF_Face          face     = (CFF_Face)size->root.face;\n    CFF_Font          font     = (CFF_Font)face->extra.data;\n    PSHinter_Service  pshinter = font->pshinter;\n    FT_Module         module;\n\n\n    module = FT_Get_Module( size->root.face->driver->root.library,\n                            \"pshinter\" );\n    return ( module && pshinter && pshinter->get_globals_funcs )\n           ? pshinter->get_globals_funcs( module )\n           : 0;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cff_size_done( FT_Size  cffsize )        /* CFF_Size */\n  {\n    CFF_Size      size     = (CFF_Size)cffsize;\n    CFF_Face      face     = (CFF_Face)size->root.face;\n    CFF_Font      font     = (CFF_Font)face->extra.data;\n    CFF_Internal  internal = (CFF_Internal)cffsize->internal;\n\n\n    if ( internal )\n    {\n      PSH_Globals_Funcs  funcs;\n\n\n      funcs = cff_size_get_globals_funcs( size );\n      if ( funcs )\n      {\n        FT_UInt  i;\n\n\n        funcs->destroy( internal->topfont );\n\n        for ( i = font->num_subfonts; i > 0; i-- )\n          funcs->destroy( internal->subfonts[i - 1] );\n      }\n\n      /* `internal' is freed by destroy_size (in ftobjs.c) */\n    }\n  }\n\n\n  /* CFF and Type 1 private dictionaries have slightly different      */\n  /* structures; we need to synthesize a Type 1 dictionary on the fly */\n\n  static void\n  cff_make_private_dict( CFF_SubFont  subfont,\n                         PS_Private   priv )\n  {\n    CFF_Private  cpriv = &subfont->private_dict;\n    FT_UInt      n, count;\n\n\n    FT_MEM_ZERO( priv, sizeof ( *priv ) );\n\n    count = priv->num_blue_values = cpriv->num_blue_values;\n    for ( n = 0; n < count; n++ )\n      priv->blue_values[n] = (FT_Short)cpriv->blue_values[n];\n\n    count = priv->num_other_blues = cpriv->num_other_blues;\n    for ( n = 0; n < count; n++ )\n      priv->other_blues[n] = (FT_Short)cpriv->other_blues[n];\n\n    count = priv->num_family_blues = cpriv->num_family_blues;\n    for ( n = 0; n < count; n++ )\n      priv->family_blues[n] = (FT_Short)cpriv->family_blues[n];\n\n    count = priv->num_family_other_blues = cpriv->num_family_other_blues;\n    for ( n = 0; n < count; n++ )\n      priv->family_other_blues[n] = (FT_Short)cpriv->family_other_blues[n];\n\n    priv->blue_scale = cpriv->blue_scale;\n    priv->blue_shift = (FT_Int)cpriv->blue_shift;\n    priv->blue_fuzz  = (FT_Int)cpriv->blue_fuzz;\n\n    priv->standard_width[0]  = (FT_UShort)cpriv->standard_width;\n    priv->standard_height[0] = (FT_UShort)cpriv->standard_height;\n\n    count = priv->num_snap_widths = cpriv->num_snap_widths;\n    for ( n = 0; n < count; n++ )\n      priv->snap_widths[n] = (FT_Short)cpriv->snap_widths[n];\n\n    count = priv->num_snap_heights = cpriv->num_snap_heights;\n    for ( n = 0; n < count; n++ )\n      priv->snap_heights[n] = (FT_Short)cpriv->snap_heights[n];\n\n    priv->force_bold     = cpriv->force_bold;\n    priv->language_group = cpriv->language_group;\n    priv->lenIV          = cpriv->lenIV;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cff_size_init( FT_Size  cffsize )         /* CFF_Size */\n  {\n    CFF_Size           size  = (CFF_Size)cffsize;\n    FT_Error           error = FT_Err_Ok;\n    PSH_Globals_Funcs  funcs = cff_size_get_globals_funcs( size );\n\n\n    if ( funcs )\n    {\n      CFF_Face      face     = (CFF_Face)cffsize->face;\n      CFF_Font      font     = (CFF_Font)face->extra.data;\n      CFF_Internal  internal = NULL;\n\n      PS_PrivateRec  priv;\n      FT_Memory      memory = cffsize->face->memory;\n\n      FT_UInt  i;\n\n\n      if ( FT_NEW( internal ) )\n        goto Exit;\n\n      cff_make_private_dict( &font->top_font, &priv );\n      error = funcs->create( cffsize->face->memory, &priv,\n                             &internal->topfont );\n      if ( error )\n        goto Exit;\n\n      for ( i = font->num_subfonts; i > 0; i-- )\n      {\n        CFF_SubFont  sub = font->subfonts[i - 1];\n\n\n        cff_make_private_dict( sub, &priv );\n        error = funcs->create( cffsize->face->memory, &priv,\n                               &internal->subfonts[i - 1] );\n        if ( error )\n          goto Exit;\n      }\n\n      cffsize->internal = (FT_Size_Internal)(void*)internal;\n    }\n\n    size->strike_index = 0xFFFFFFFFUL;\n\n  Exit:\n    return error;\n  }\n\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n\n  FT_LOCAL_DEF( FT_Error )\n  cff_size_select( FT_Size   size,\n                   FT_ULong  strike_index )\n  {\n    CFF_Size           cffsize = (CFF_Size)size;\n    PSH_Globals_Funcs  funcs;\n\n\n    cffsize->strike_index = strike_index;\n\n    FT_Select_Metrics( size->face, strike_index );\n\n    funcs = cff_size_get_globals_funcs( cffsize );\n\n    if ( funcs )\n    {\n      CFF_Face      face     = (CFF_Face)size->face;\n      CFF_Font      font     = (CFF_Font)face->extra.data;\n      CFF_Internal  internal = (CFF_Internal)size->internal;\n\n      FT_ULong  top_upm  = font->top_font.font_dict.units_per_em;\n      FT_UInt   i;\n\n\n      funcs->set_scale( internal->topfont,\n                        size->metrics.x_scale, size->metrics.y_scale,\n                        0, 0 );\n\n      for ( i = font->num_subfonts; i > 0; i-- )\n      {\n        CFF_SubFont  sub     = font->subfonts[i - 1];\n        FT_ULong     sub_upm = sub->font_dict.units_per_em;\n        FT_Pos       x_scale, y_scale;\n\n\n        if ( top_upm != sub_upm )\n        {\n          x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm );\n          y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm );\n        }\n        else\n        {\n          x_scale = size->metrics.x_scale;\n          y_scale = size->metrics.y_scale;\n        }\n\n        funcs->set_scale( internal->subfonts[i - 1],\n                          x_scale, y_scale, 0, 0 );\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cff_size_request( FT_Size          size,\n                    FT_Size_Request  req )\n  {\n    CFF_Size           cffsize = (CFF_Size)size;\n    PSH_Globals_Funcs  funcs;\n\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n\n    if ( FT_HAS_FIXED_SIZES( size->face ) )\n    {\n      CFF_Face      cffface = (CFF_Face)size->face;\n      SFNT_Service  sfnt    = (SFNT_Service)cffface->sfnt;\n      FT_ULong      strike_index;\n\n\n      if ( sfnt->set_sbit_strike( cffface, req, &strike_index ) )\n        cffsize->strike_index = 0xFFFFFFFFUL;\n      else\n        return cff_size_select( size, strike_index );\n    }\n\n#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */\n\n    FT_Request_Metrics( size->face, req );\n\n    funcs = cff_size_get_globals_funcs( cffsize );\n\n    if ( funcs )\n    {\n      CFF_Face      cffface  = (CFF_Face)size->face;\n      CFF_Font      font     = (CFF_Font)cffface->extra.data;\n      CFF_Internal  internal = (CFF_Internal)size->internal;\n\n      FT_ULong  top_upm  = font->top_font.font_dict.units_per_em;\n      FT_UInt   i;\n\n\n      funcs->set_scale( internal->topfont,\n                        size->metrics.x_scale, size->metrics.y_scale,\n                        0, 0 );\n\n      for ( i = font->num_subfonts; i > 0; i-- )\n      {\n        CFF_SubFont  sub     = font->subfonts[i - 1];\n        FT_ULong     sub_upm = sub->font_dict.units_per_em;\n        FT_Pos       x_scale, y_scale;\n\n\n        if ( top_upm != sub_upm )\n        {\n          x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm );\n          y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm );\n        }\n        else\n        {\n          x_scale = size->metrics.x_scale;\n          y_scale = size->metrics.y_scale;\n        }\n\n        funcs->set_scale( internal->subfonts[i - 1],\n                          x_scale, y_scale, 0, 0 );\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                            SLOT  FUNCTIONS                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n  FT_LOCAL_DEF( void )\n  cff_slot_done( FT_GlyphSlot  slot )\n  {\n    slot->internal->glyph_hints = 0;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cff_slot_init( FT_GlyphSlot  slot )\n  {\n    CFF_Face          face     = (CFF_Face)slot->face;\n    CFF_Font          font     = (CFF_Font)face->extra.data;\n    PSHinter_Service  pshinter = font->pshinter;\n\n\n    if ( pshinter )\n    {\n      FT_Module  module;\n\n\n      module = FT_Get_Module( slot->face->driver->root.library,\n                              \"pshinter\" );\n      if ( module )\n      {\n        T2_Hints_Funcs  funcs;\n\n\n        funcs = pshinter->get_t2_funcs( module );\n        slot->internal->glyph_hints = (void*)funcs;\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                           FACE  FUNCTIONS                             */\n  /*                                                                       */\n  /*************************************************************************/\n\n  static FT_String*\n  cff_strcpy( FT_Memory         memory,\n              const FT_String*  source )\n  {\n    FT_Error    error;\n    FT_String*  result;\n\n\n    (void)FT_STRDUP( result, source );\n\n    FT_UNUSED( error );\n\n    return result;\n  }\n\n\n  /* Strip all subset prefixes of the form `ABCDEF+'.  Usually, there */\n  /* is only one, but font names like `APCOOG+JFABTD+FuturaBQ-Bold'   */\n  /* have been seen in the wild.                                      */\n\n  static void\n  remove_subset_prefix( FT_String*  name )\n  {\n    FT_Int32  idx             = 0;\n    FT_Int32  length          = (FT_Int32)strlen( name ) + 1;\n    FT_Bool   continue_search = 1;\n\n\n    while ( continue_search )\n    {\n      if ( length >= 7 && name[6] == '+' )\n      {\n        for ( idx = 0; idx < 6; idx++ )\n        {\n          /* ASCII uppercase letters */\n          if ( !( 'A' <= name[idx] && name[idx] <= 'Z' ) )\n            continue_search = 0;\n        }\n\n        if ( continue_search )\n        {\n          for ( idx = 7; idx < length; idx++ )\n            name[idx - 7] = name[idx];\n          length -= 7;\n        }\n      }\n      else\n        continue_search = 0;\n    }\n  }\n\n\n  /* Remove the style part from the family name (if present). */\n\n  static void\n  remove_style( FT_String*        family_name,\n                const FT_String*  style_name )\n  {\n    FT_Int32  family_name_length, style_name_length;\n\n\n    family_name_length = (FT_Int32)strlen( family_name );\n    style_name_length  = (FT_Int32)strlen( style_name );\n\n    if ( family_name_length > style_name_length )\n    {\n      FT_Int  idx;\n\n\n      for ( idx = 1; idx <= style_name_length; ++idx )\n      {\n        if ( family_name[family_name_length - idx] !=\n             style_name[style_name_length - idx] )\n          break;\n      }\n\n      if ( idx > style_name_length )\n      {\n        /* family_name ends with style_name; remove it */\n        idx = family_name_length - style_name_length - 1;\n\n        /* also remove special characters     */\n        /* between real family name and style */\n        while ( idx > 0                     &&\n                ( family_name[idx] == '-' ||\n                  family_name[idx] == ' ' ||\n                  family_name[idx] == '_' ||\n                  family_name[idx] == '+' ) )\n          --idx;\n\n        if ( idx > 0 )\n          family_name[idx + 1] = '\\0';\n      }\n    }\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cff_face_init( FT_Stream      stream,\n                 FT_Face        cffface,        /* CFF_Face */\n                 FT_Int         face_index,\n                 FT_Int         num_params,\n                 FT_Parameter*  params )\n  {\n    CFF_Face            face        = (CFF_Face)cffface;\n    FT_Error            error;\n    SFNT_Service        sfnt;\n    FT_Service_PsCMaps  psnames;\n    PSHinter_Service    pshinter;\n    FT_Bool             pure_cff    = 1;\n    FT_Bool             sfnt_format = 0;\n    FT_Library          library     = cffface->driver->root.library;\n\n\n    sfnt = (SFNT_Service)FT_Get_Module_Interface(\n             library, \"sfnt\" );\n    if ( !sfnt )\n    {\n      FT_ERROR(( \"cff_face_init: cannot access `sfnt' module\\n\" ));\n      error = FT_THROW( Missing_Module );\n      goto Exit;\n    }\n\n    FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );\n\n    pshinter = (PSHinter_Service)FT_Get_Module_Interface(\n                 library, \"pshinter\" );\n\n    FT_TRACE2(( \"CFF driver\\n\" ));\n\n    /* create input stream from resource */\n    if ( FT_STREAM_SEEK( 0 ) )\n      goto Exit;\n\n    /* check whether we have a valid OpenType file */\n    error = sfnt->init_face( stream, face, face_index, num_params, params );\n    if ( !error )\n    {\n      if ( face->format_tag != TTAG_OTTO && \n\t\t   face->format_tag != 0x00010000UL )  /* `OTTO'; OpenType/CFF font */\n      {\n        FT_TRACE2(( \"  not an OpenType/CFF font\\n\" ));\n        error = FT_THROW( Unknown_File_Format );\n        goto Exit;\n      }\n\n      /* if we are performing a simple font format check, exit immediately */\n      if ( face_index < 0 )\n        return FT_Err_Ok;\n\n      sfnt_format = 1;\n\n      /* now, the font can be either an OpenType/CFF font, or an SVG CEF */\n      /* font; in the latter case it doesn't have a `head' table         */\n      error = face->goto_table( face, TTAG_head, stream, 0 );\n      if ( !error )\n      {\n        pure_cff = 0;\n\n        /* load font directory */\n        error = sfnt->load_face( stream, face, face_index,\n                                 num_params, params );\n        if ( error )\n          goto Exit;\n      }\n      else\n      {\n        /* load the `cmap' table explicitly */\n        error = sfnt->load_cmap( face, stream );\n        if ( error )\n          goto Exit;\n      }\n\n      /* now load the CFF part of the file */\n      error = face->goto_table( face, TTAG_CFF, stream, 0 );\n      if ( error )\n        goto Exit;\n    }\n    else\n    {\n      /* rewind to start of file; we are going to load a pure-CFF font */\n      if ( FT_STREAM_SEEK( 0 ) )\n        goto Exit;\n      error = FT_Err_Ok;\n    }\n\n    /* now load and parse the CFF table in the file */\n    {\n      CFF_Font         cff = NULL;\n      CFF_FontRecDict  dict;\n      FT_Memory        memory = cffface->memory;\n      FT_Int32         flags;\n      FT_UInt          i;\n\n\n      if ( FT_NEW( cff ) )\n        goto Exit;\n\n      face->extra.data = cff;\n      error = cff_font_load( library, stream, face_index, cff, pure_cff );\n      if ( error )\n        goto Exit;\n\n      cff->pshinter = pshinter;\n      cff->psnames  = psnames;\n\n      cffface->face_index = face_index;\n\n      /* Complement the root flags with some interesting information. */\n      /* Note that this is only necessary for pure CFF and CEF fonts; */\n      /* SFNT based fonts use the `name' table instead.               */\n\n      cffface->num_glyphs = cff->num_glyphs;\n\n      dict = &cff->top_font.font_dict;\n\n      /* we need the `PSNames' module for CFF and CEF formats */\n      /* which aren't CID-keyed                               */\n      if ( dict->cid_registry == 0xFFFFU && !psnames )\n      {\n        FT_ERROR(( \"cff_face_init:\"\n                   \" cannot open CFF & CEF fonts\\n\"\n                   \"              \"\n                   \" without the `PSNames' module\\n\" ));\n        error = FT_THROW( Missing_Module );\n        goto Exit;\n      }\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n      {\n        FT_UInt     idx;\n        FT_String*  s;\n\n\n        FT_TRACE4(( \"SIDs\\n\" ));\n\n        /* dump string index, including default strings for convenience */\n        for ( idx = 0; idx < cff->num_strings + 390; idx++ )\n        {\n          s = cff_index_get_sid_string( cff, idx );\n          if ( s )\n            FT_TRACE4((\"  %5d %s\\n\", idx, s ));\n        }\n      }\n#endif /* FT_DEBUG_LEVEL_TRACE */\n\n      if ( !dict->has_font_matrix )\n        dict->units_per_em = pure_cff ? 1000 : face->root.units_per_EM;\n\n      /* Normalize the font matrix so that `matrix->xx' is 1; the */\n      /* scaling is done with `units_per_em' then (at this point, */\n      /* it already contains the scaling factor, but without      */\n      /* normalization of the matrix).                            */\n      /*                                                          */\n      /* Note that the offsets must be expressed in integer font  */\n      /* units.                                                   */\n\n      {\n        FT_Matrix*  matrix = &dict->font_matrix;\n        FT_Vector*  offset = &dict->font_offset;\n        FT_ULong*   upm    = &dict->units_per_em;\n        FT_Fixed    temp   = FT_ABS( matrix->yy );\n\n\n        if ( temp != 0x10000L )\n        {\n          *upm = FT_DivFix( *upm, temp );\n\n          matrix->xx = FT_DivFix( matrix->xx, temp );\n          matrix->yx = FT_DivFix( matrix->yx, temp );\n          matrix->xy = FT_DivFix( matrix->xy, temp );\n          matrix->yy = FT_DivFix( matrix->yy, temp );\n          offset->x  = FT_DivFix( offset->x,  temp );\n          offset->y  = FT_DivFix( offset->y,  temp );\n        }\n\n        offset->x >>= 16;\n        offset->y >>= 16;\n      }\n\n      for ( i = cff->num_subfonts; i > 0; i-- )\n      {\n        CFF_FontRecDict  sub = &cff->subfonts[i - 1]->font_dict;\n        CFF_FontRecDict  top = &cff->top_font.font_dict;\n\n        FT_Matrix*  matrix;\n        FT_Vector*  offset;\n        FT_ULong*   upm;\n        FT_Fixed    temp;\n\n\n        if ( sub->has_font_matrix )\n        {\n          FT_Long  scaling;\n\n\n          /* if we have a top-level matrix, */\n          /* concatenate the subfont matrix */\n\n          if ( top->has_font_matrix )\n          {\n            if ( top->units_per_em > 1 && sub->units_per_em > 1 )\n              scaling = FT_MIN( top->units_per_em, sub->units_per_em );\n            else\n              scaling = 1;\n\n            FT_Matrix_Multiply_Scaled( &top->font_matrix,\n                                       &sub->font_matrix,\n                                       scaling );\n            FT_Vector_Transform_Scaled( &sub->font_offset,\n                                        &top->font_matrix,\n                                        scaling );\n\n            sub->units_per_em = FT_MulDiv( sub->units_per_em,\n                                           top->units_per_em,\n                                           scaling );\n          }\n        }\n        else\n        {\n          sub->font_matrix = top->font_matrix;\n          sub->font_offset = top->font_offset;\n\n          sub->units_per_em = top->units_per_em;\n        }\n\n        matrix = &sub->font_matrix;\n        offset = &sub->font_offset;\n        upm    = &sub->units_per_em;\n        temp   = FT_ABS( matrix->yy );\n\n        if ( temp != 0x10000L )\n        {\n          *upm = FT_DivFix( *upm, temp );\n\n          matrix->xx = FT_DivFix( matrix->xx, temp );\n          matrix->yx = FT_DivFix( matrix->yx, temp );\n          matrix->xy = FT_DivFix( matrix->xy, temp );\n          matrix->yy = FT_DivFix( matrix->yy, temp );\n          offset->x  = FT_DivFix( offset->x,  temp );\n          offset->y  = FT_DivFix( offset->y,  temp );\n        }\n\n        offset->x >>= 16;\n        offset->y >>= 16;\n      }\n\n      if ( pure_cff )\n      {\n        char*  style_name = NULL;\n\n\n        /* set up num_faces */\n        cffface->num_faces = cff->num_faces;\n\n        /* compute number of glyphs */\n        if ( dict->cid_registry != 0xFFFFU )\n          cffface->num_glyphs = cff->charset.max_cid + 1;\n        else\n          cffface->num_glyphs = cff->charstrings_index.count;\n\n        /* set global bbox, as well as EM size */\n        cffface->bbox.xMin =   dict->font_bbox.xMin            >> 16;\n        cffface->bbox.yMin =   dict->font_bbox.yMin            >> 16;\n        /* no `U' suffix here to 0xFFFF! */\n        cffface->bbox.xMax = ( dict->font_bbox.xMax + 0xFFFF ) >> 16;\n        cffface->bbox.yMax = ( dict->font_bbox.yMax + 0xFFFF ) >> 16;\n\n        cffface->units_per_EM = (FT_UShort)( dict->units_per_em );\n\n        cffface->ascender  = (FT_Short)( cffface->bbox.yMax );\n        cffface->descender = (FT_Short)( cffface->bbox.yMin );\n\n        cffface->height = (FT_Short)( ( cffface->units_per_EM * 12 ) / 10 );\n        if ( cffface->height < cffface->ascender - cffface->descender )\n          cffface->height = (FT_Short)( cffface->ascender - cffface->descender );\n\n        cffface->underline_position  =\n          (FT_Short)( dict->underline_position >> 16 );\n        cffface->underline_thickness =\n          (FT_Short)( dict->underline_thickness >> 16 );\n\n        /* retrieve font family & style name */\n        cffface->family_name = cff_index_get_name( cff, face_index );\n        if ( cffface->family_name )\n        {\n          char*  full   = cff_index_get_sid_string( cff,\n                                                    dict->full_name );\n          char*  fullp  = full;\n          char*  family = cffface->family_name;\n          char*  family_name = NULL;\n\n\n          remove_subset_prefix( cffface->family_name );\n\n          if ( dict->family_name )\n          {\n            family_name = cff_index_get_sid_string( cff,\n                                                    dict->family_name );\n            if ( family_name )\n              family = family_name;\n          }\n\n          /* We try to extract the style name from the full name.   */\n          /* We need to ignore spaces and dashes during the search. */\n          if ( full && family )\n          {\n            while ( *fullp )\n            {\n              /* skip common characters at the start of both strings */\n              if ( *fullp == *family )\n              {\n                family++;\n                fullp++;\n                continue;\n              }\n\n              /* ignore spaces and dashes in full name during comparison */\n              if ( *fullp == ' ' || *fullp == '-' )\n              {\n                fullp++;\n                continue;\n              }\n\n              /* ignore spaces and dashes in family name during comparison */\n              if ( *family == ' ' || *family == '-' )\n              {\n                family++;\n                continue;\n              }\n\n              if ( !*family && *fullp )\n              {\n                /* The full name begins with the same characters as the  */\n                /* family name, with spaces and dashes removed.  In this */\n                /* case, the remaining string in `fullp' will be used as */\n                /* the style name.                                       */\n                style_name = cff_strcpy( memory, fullp );\n\n                /* remove the style part from the family name (if present) */\n                remove_style( cffface->family_name, style_name );\n              }\n              break;\n            }\n          }\n        }\n        else\n        {\n          char  *cid_font_name =\n                   cff_index_get_sid_string( cff,\n                                             dict->cid_font_name );\n\n\n          /* do we have a `/FontName' for a CID-keyed font? */\n          if ( cid_font_name )\n            cffface->family_name = cff_strcpy( memory, cid_font_name );\n        }\n\n        if ( style_name )\n          cffface->style_name = style_name;\n        else\n          /* assume \"Regular\" style if we don't know better */\n          cffface->style_name = cff_strcpy( memory, (char *)\"Regular\" );\n\n        /*******************************************************************/\n        /*                                                                 */\n        /* Compute face flags.                                             */\n        /*                                                                 */\n        flags = FT_FACE_FLAG_SCALABLE   | /* scalable outlines */\n                FT_FACE_FLAG_HORIZONTAL | /* horizontal data   */\n                FT_FACE_FLAG_HINTER;      /* has native hinter */\n\n        if ( sfnt_format )\n          flags |= FT_FACE_FLAG_SFNT;\n\n        /* fixed width font? */\n        if ( dict->is_fixed_pitch )\n          flags |= FT_FACE_FLAG_FIXED_WIDTH;\n\n  /* XXX: WE DO NOT SUPPORT KERNING METRICS IN THE GPOS TABLE FOR NOW */\n#if 0\n        /* kerning available? */\n        if ( face->kern_pairs )\n          flags |= FT_FACE_FLAG_KERNING;\n#endif\n\n        cffface->face_flags = flags;\n\n        /*******************************************************************/\n        /*                                                                 */\n        /* Compute style flags.                                            */\n        /*                                                                 */\n        flags = 0;\n\n        if ( dict->italic_angle )\n          flags |= FT_STYLE_FLAG_ITALIC;\n\n        {\n          char  *weight = cff_index_get_sid_string( cff,\n                                                    dict->weight );\n\n\n          if ( weight )\n            if ( !ft_strcmp( weight, \"Bold\"  ) ||\n                 !ft_strcmp( weight, \"Black\" ) )\n              flags |= FT_STYLE_FLAG_BOLD;\n        }\n\n        /* double check */\n        if ( !(flags & FT_STYLE_FLAG_BOLD) && cffface->style_name )\n          if ( !ft_strncmp( cffface->style_name, \"Bold\", 4 )  ||\n               !ft_strncmp( cffface->style_name, \"Black\", 5 ) )\n            flags |= FT_STYLE_FLAG_BOLD;\n\n\t\tif ( !(flags & FT_STYLE_FLAG_ITALIC) && cffface->style_name )\n\t\t\tif ( !ft_strncmp( cffface->style_name, \"Italic\", 6 ) )\n          flags |= FT_STYLE_FLAG_ITALIC;\n\n        cffface->style_flags = flags;\n      }\n\n\n#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES\n      /* CID-keyed CFF fonts don't have glyph names -- the SFNT loader */\n      /* has unset this flag because of the 3.0 `post' table.          */\n      if ( dict->cid_registry == 0xFFFFU )\n        cffface->face_flags |= FT_FACE_FLAG_GLYPH_NAMES;\n#endif\n\n      if ( dict->cid_registry != 0xFFFFU && pure_cff )\n        cffface->face_flags |= FT_FACE_FLAG_CID_KEYED;\n\n\n      /*******************************************************************/\n      /*                                                                 */\n      /* Compute char maps.                                              */\n      /*                                                                 */\n\n      /* Try to synthesize a Unicode charmap if there is none available */\n      /* already.  If an OpenType font contains a Unicode \"cmap\", we    */\n      /* will use it, whatever be in the CFF part of the file.          */\n      {\n        FT_CharMapRec  cmaprec;\n        FT_CharMap     cmap;\n        FT_UInt        nn;\n        CFF_Encoding   encoding = &cff->encoding;\n\n\n        for ( nn = 0; nn < (FT_UInt)cffface->num_charmaps; nn++ )\n        {\n          cmap = cffface->charmaps[nn];\n\n          /* Windows Unicode? */\n          if ( cmap->platform_id == TT_PLATFORM_MICROSOFT &&\n               cmap->encoding_id == TT_MS_ID_UNICODE_CS   )\n            goto Skip_Unicode;\n\n          /* Apple Unicode platform id? */\n          if ( cmap->platform_id == TT_PLATFORM_APPLE_UNICODE )\n            goto Skip_Unicode; /* Apple Unicode */\n        }\n\n        /* since CID-keyed fonts don't contain glyph names, we can't */\n        /* construct a cmap                                          */\n        if ( pure_cff && cff->top_font.font_dict.cid_registry != 0xFFFFU )\n          goto Exit;\n\n#ifdef FT_MAX_CHARMAP_CACHEABLE\n        if ( nn + 1 > FT_MAX_CHARMAP_CACHEABLE )\n        {\n          FT_ERROR(( \"cff_face_init: no Unicode cmap is found, \"\n                     \"and too many subtables (%d) to add synthesized cmap\\n\",\n                     nn ));\n          goto Exit;\n        }\n#endif\n\n        /* we didn't find a Unicode charmap -- synthesize one */\n        cmaprec.face        = cffface;\n        cmaprec.platform_id = TT_PLATFORM_MICROSOFT;\n        cmaprec.encoding_id = TT_MS_ID_UNICODE_CS;\n        cmaprec.encoding    = FT_ENCODING_UNICODE;\n\n        nn = (FT_UInt)cffface->num_charmaps;\n\n        error = FT_CMap_New( &CFF_CMAP_UNICODE_CLASS_REC_GET, NULL,\n                             &cmaprec, NULL );\n        if ( error                                      &&\n             FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) )\n          goto Exit;\n        error = FT_Err_Ok;\n\n        /* if no Unicode charmap was previously selected, select this one */\n        if ( cffface->charmap == NULL && nn != (FT_UInt)cffface->num_charmaps )\n          cffface->charmap = cffface->charmaps[nn];\n\n      Skip_Unicode:\n#ifdef FT_MAX_CHARMAP_CACHEABLE\n        if ( nn > FT_MAX_CHARMAP_CACHEABLE )\n        {\n          FT_ERROR(( \"cff_face_init: Unicode cmap is found, \"\n                     \"but too many preceding subtables (%d) to access\\n\",\n                     nn - 1 ));\n          goto Exit;\n        }\n#endif\n        if ( encoding->count > 0 )\n        {\n          FT_CMap_Class  clazz;\n\n\n          cmaprec.face        = cffface;\n          cmaprec.platform_id = TT_PLATFORM_ADOBE;  /* Adobe platform id */\n\n          if ( encoding->offset == 0 )\n          {\n            cmaprec.encoding_id = TT_ADOBE_ID_STANDARD;\n            cmaprec.encoding    = FT_ENCODING_ADOBE_STANDARD;\n            clazz               = &CFF_CMAP_ENCODING_CLASS_REC_GET;\n          }\n          else if ( encoding->offset == 1 )\n          {\n            cmaprec.encoding_id = TT_ADOBE_ID_EXPERT;\n            cmaprec.encoding    = FT_ENCODING_ADOBE_EXPERT;\n            clazz               = &CFF_CMAP_ENCODING_CLASS_REC_GET;\n          }\n          else\n          {\n            cmaprec.encoding_id = TT_ADOBE_ID_CUSTOM;\n            cmaprec.encoding    = FT_ENCODING_ADOBE_CUSTOM;\n            clazz               = &CFF_CMAP_ENCODING_CLASS_REC_GET;\n          }\n\n          error = FT_CMap_New( clazz, NULL, &cmaprec, NULL );\n        }\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cff_face_done( FT_Face  cffface )         /* CFF_Face */\n  {\n    CFF_Face      face = (CFF_Face)cffface;\n    FT_Memory     memory;\n    SFNT_Service  sfnt;\n\n\n    if ( !face )\n      return;\n\n    memory = cffface->memory;\n    sfnt   = (SFNT_Service)face->sfnt;\n\n    if ( sfnt )\n      sfnt->done_face( face );\n\n    {\n      CFF_Font  cff = (CFF_Font)face->extra.data;\n\n\n      if ( cff )\n      {\n        cff_font_done( cff );\n        FT_FREE( face->extra.data );\n      }\n    }\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cff_driver_init( FT_Module  module )        /* CFF_Driver */\n  {\n    CFF_Driver  driver = (CFF_Driver)module;\n\n\n    /* set default property values */\n#ifdef CFF_CONFIG_OPTION_OLD_ENGINE\n    driver->hinting_engine    = FT_CFF_HINTING_FREETYPE;\n#else\n    driver->hinting_engine    = FT_CFF_HINTING_ADOBE;\n#endif\n    driver->no_stem_darkening = FALSE;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cff_driver_done( FT_Module  module )        /* CFF_Driver */\n  {\n    FT_UNUSED( module );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffobjs.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffobjs.h                                                              */\n/*                                                                         */\n/*    OpenType objects manager (specification).                            */\n/*                                                                         */\n/*  Copyright 1996-2004, 2006-2008, 2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CFFOBJS_H__\n#define __CFFOBJS_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"cfftypes.h\"\n#include \"../../include/freetype/internal/tttypes.h\"\n#include \"../../include/freetype/internal/services/svpscmap.h\"\n#include \"../../include/freetype/internal/pshints.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    CFF_Driver                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to an OpenType driver object.                             */\n  /*                                                                       */\n  typedef struct CFF_DriverRec_*  CFF_Driver;\n\n  typedef TT_Face  CFF_Face;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    CFF_Size                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to an OpenType size object.                               */\n  /*                                                                       */\n  typedef struct  CFF_SizeRec_\n  {\n    FT_SizeRec  root;\n    FT_ULong    strike_index;    /* 0xFFFFFFFF to indicate invalid */\n\n  } CFF_SizeRec, *CFF_Size;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    CFF_GlyphSlot                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to an OpenType glyph slot object.                         */\n  /*                                                                       */\n  typedef struct  CFF_GlyphSlotRec_\n  {\n    FT_GlyphSlotRec  root;\n\n    FT_Bool          hint;\n    FT_Bool          scaled;\n\n    FT_Fixed         x_scale;\n    FT_Fixed         y_scale;\n\n  } CFF_GlyphSlotRec, *CFF_GlyphSlot;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    CFF_Internal                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The interface to the `internal' field of `FT_Size'.                */\n  /*                                                                       */\n  typedef struct  CFF_InternalRec_\n  {\n    PSH_Globals  topfont;\n    PSH_Globals  subfonts[CFF_MAX_CID_FONTS];\n\n  } CFF_InternalRec, *CFF_Internal;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Subglyph transformation record.                                       */\n  /*                                                                       */\n  typedef struct  CFF_Transform_\n  {\n    FT_Fixed    xx, xy;     /* transformation matrix coefficients */\n    FT_Fixed    yx, yy;\n    FT_F26Dot6  ox, oy;     /* offsets        */\n\n  } CFF_Transform;\n\n\n  /***********************************************************************/\n  /*                                                                     */\n  /* CFF driver class.                                                   */\n  /*                                                                     */\n  typedef struct  CFF_DriverRec_\n  {\n    FT_DriverRec  root;\n\n    FT_UInt  hinting_engine;\n    FT_Bool  no_stem_darkening;\n\n  } CFF_DriverRec;\n\n\n  FT_LOCAL( FT_Error )\n  cff_size_init( FT_Size  size );           /* CFF_Size */\n\n  FT_LOCAL( void )\n  cff_size_done( FT_Size  size );           /* CFF_Size */\n\n  FT_LOCAL( FT_Error )\n  cff_size_request( FT_Size          size,\n                    FT_Size_Request  req );\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n\n  FT_LOCAL( FT_Error )\n  cff_size_select( FT_Size   size,\n                   FT_ULong  strike_index );\n\n#endif\n\n  FT_LOCAL( void )\n  cff_slot_done( FT_GlyphSlot  slot );\n\n  FT_LOCAL( FT_Error )\n  cff_slot_init( FT_GlyphSlot  slot );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Face functions                                                        */\n  /*                                                                       */\n  FT_LOCAL( FT_Error )\n  cff_face_init( FT_Stream      stream,\n                 FT_Face        face,           /* CFF_Face */\n                 FT_Int         face_index,\n                 FT_Int         num_params,\n                 FT_Parameter*  params );\n\n  FT_LOCAL( void )\n  cff_face_done( FT_Face  face );               /* CFF_Face */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Driver functions                                                      */\n  /*                                                                       */\n  FT_LOCAL( FT_Error )\n  cff_driver_init( FT_Module  module );         /* CFF_Driver */\n\n  FT_LOCAL( void )\n  cff_driver_done( FT_Module  module );         /* CFF_Driver */\n\n\nFT_END_HEADER\n\n#endif /* __CFFOBJS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffparse.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffparse.c                                                             */\n/*                                                                         */\n/*    CFF token stream parser (body)                                       */\n/*                                                                         */\n/*  Copyright 1996-2004, 2007-2013 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"cffparse.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n\n#include \"cfferrs.h\"\n#include \"cffpic.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cffparse\n\n\n  FT_LOCAL_DEF( void )\n  cff_parser_init( CFF_Parser  parser,\n                   FT_UInt     code,\n                   void*       object,\n                   FT_Library  library)\n  {\n    FT_MEM_ZERO( parser, sizeof ( *parser ) );\n\n    parser->top         = parser->stack;\n    parser->object_code = code;\n    parser->object      = object;\n    parser->library     = library;\n  }\n\n\n  /* read an integer */\n  static FT_Long\n  cff_parse_integer( FT_Byte*  start,\n                     FT_Byte*  limit )\n  {\n    FT_Byte*  p   = start;\n    FT_Int    v   = *p++;\n    FT_Long   val = 0;\n\n\n    if ( v == 28 )\n    {\n      if ( p + 2 > limit )\n        goto Bad;\n\n      val = (FT_Short)( ( (FT_UShort)p[0] << 8 ) | p[1] );\n      p  += 2;\n    }\n    else if ( v == 29 )\n    {\n      if ( p + 4 > limit )\n        goto Bad;\n\n      val = (FT_Long)( ( (FT_ULong)p[0] << 24 ) |\n                       ( (FT_ULong)p[1] << 16 ) |\n                       ( (FT_ULong)p[2] <<  8 ) |\n                         (FT_ULong)p[3]         );\n      p += 4;\n    }\n    else if ( v < 247 )\n    {\n      val = v - 139;\n    }\n    else if ( v < 251 )\n    {\n      if ( p + 1 > limit )\n        goto Bad;\n\n      val = ( v - 247 ) * 256 + p[0] + 108;\n      p++;\n    }\n    else\n    {\n      if ( p + 1 > limit )\n        goto Bad;\n\n      val = -( v - 251 ) * 256 - p[0] - 108;\n      p++;\n    }\n\n  Exit:\n    return val;\n\n  Bad:\n    val = 0;\n    FT_TRACE4(( \"!!!END OF DATA:!!!\" ));\n    goto Exit;\n  }\n\n\n  static const FT_Long power_tens[] =\n  {\n    1L,\n    10L,\n    100L,\n    1000L,\n    10000L,\n    100000L,\n    1000000L,\n    10000000L,\n    100000000L,\n    1000000000L\n  };\n\n\n  /* read a real */\n  static FT_Fixed\n  cff_parse_real( FT_Byte*  start,\n                  FT_Byte*  limit,\n                  FT_Long   power_ten,\n                  FT_Long*  scaling )\n  {\n    FT_Byte*  p = start;\n    FT_UInt   nib;\n    FT_UInt   phase;\n\n    FT_Long   result, number, exponent;\n    FT_Int    sign = 0, exponent_sign = 0, have_overflow = 0;\n    FT_Long   exponent_add, integer_length, fraction_length;\n\n\n    if ( scaling )\n      *scaling = 0;\n\n    result = 0;\n\n    number   = 0;\n    exponent = 0;\n\n    exponent_add    = 0;\n    integer_length  = 0;\n    fraction_length = 0;\n\n    /* First of all, read the integer part. */\n    phase = 4;\n\n    for (;;)\n    {\n      /* If we entered this iteration with phase == 4, we need to */\n      /* read a new byte.  This also skips past the initial 0x1E. */\n      if ( phase )\n      {\n        p++;\n\n        /* Make sure we don't read past the end. */\n        if ( p >= limit )\n          goto Bad;\n      }\n\n      /* Get the nibble. */\n      nib   = ( p[0] >> phase ) & 0xF;\n      phase = 4 - phase;\n\n      if ( nib == 0xE )\n        sign = 1;\n      else if ( nib > 9 )\n        break;\n      else\n      {\n        /* Increase exponent if we can't add the digit. */\n        if ( number >= 0xCCCCCCCL )\n          exponent_add++;\n        /* Skip leading zeros. */\n        else if ( nib || number )\n        {\n          integer_length++;\n          number = number * 10 + nib;\n        }\n      }\n    }\n\n    /* Read fraction part, if any. */\n    if ( nib == 0xa )\n      for (;;)\n      {\n        /* If we entered this iteration with phase == 4, we need */\n        /* to read a new byte.                                   */\n        if ( phase )\n        {\n          p++;\n\n          /* Make sure we don't read past the end. */\n          if ( p >= limit )\n            goto Bad;\n        }\n\n        /* Get the nibble. */\n        nib   = ( p[0] >> phase ) & 0xF;\n        phase = 4 - phase;\n        if ( nib >= 10 )\n          break;\n\n        /* Skip leading zeros if possible. */\n        if ( !nib && !number )\n          exponent_add--;\n        /* Only add digit if we don't overflow. */\n        else if ( number < 0xCCCCCCCL && fraction_length < 9 )\n        {\n          fraction_length++;\n          number = number * 10 + nib;\n        }\n      }\n\n    /* Read exponent, if any. */\n    if ( nib == 12 )\n    {\n      exponent_sign = 1;\n      nib           = 11;\n    }\n\n    if ( nib == 11 )\n    {\n      for (;;)\n      {\n        /* If we entered this iteration with phase == 4, */\n        /* we need to read a new byte.                   */\n        if ( phase )\n        {\n          p++;\n\n          /* Make sure we don't read past the end. */\n          if ( p >= limit )\n            goto Bad;\n        }\n\n        /* Get the nibble. */\n        nib   = ( p[0] >> phase ) & 0xF;\n        phase = 4 - phase;\n        if ( nib >= 10 )\n          break;\n\n        /* Arbitrarily limit exponent. */\n        if ( exponent > 1000 )\n          have_overflow = 1;\n        else\n          exponent = exponent * 10 + nib;\n      }\n\n      if ( exponent_sign )\n        exponent = -exponent;\n    }\n\n    if ( !number )\n      goto Exit;\n\n    if ( have_overflow )\n    {\n      if ( exponent_sign )\n        goto Underflow;\n      else\n        goto Overflow;\n    }\n\n    /* We don't check `power_ten' and `exponent_add'. */\n    exponent += power_ten + exponent_add;\n\n    if ( scaling )\n    {\n      /* Only use `fraction_length'. */\n      fraction_length += integer_length;\n      exponent        += integer_length;\n\n      if ( fraction_length <= 5 )\n      {\n        if ( number > 0x7FFFL )\n        {\n          result   = FT_DivFix( number, 10 );\n          *scaling = exponent - fraction_length + 1;\n        }\n        else\n        {\n          if ( exponent > 0 )\n          {\n            FT_Long  new_fraction_length, shift;\n\n\n            /* Make `scaling' as small as possible. */\n            new_fraction_length = FT_MIN( exponent, 5 );\n            shift               = new_fraction_length - fraction_length;\n\n            if ( shift > 0 )\n            {\n              exponent -= new_fraction_length;\n              number   *= power_tens[shift];\n              if ( number > 0x7FFFL )\n              {\n                number   /= 10;\n                exponent += 1;\n              }\n            }\n            else\n              exponent -= fraction_length;\n          }\n          else\n            exponent -= fraction_length;\n\n          result   = (FT_Long)( (FT_ULong)number << 16 );\n          *scaling = exponent;\n        }\n      }\n      else\n      {\n        if ( ( number / power_tens[fraction_length - 5] ) > 0x7FFFL )\n        {\n          result   = FT_DivFix( number, power_tens[fraction_length - 4] );\n          *scaling = exponent - 4;\n        }\n        else\n        {\n          result   = FT_DivFix( number, power_tens[fraction_length - 5] );\n          *scaling = exponent - 5;\n        }\n      }\n    }\n    else\n    {\n      integer_length  += exponent;\n      fraction_length -= exponent;\n\n      if ( integer_length > 5 )\n        goto Overflow;\n      if ( integer_length < -5 )\n        goto Underflow;\n\n      /* Remove non-significant digits. */\n      if ( integer_length < 0 )\n      {\n        number          /= power_tens[-integer_length];\n        fraction_length += integer_length;\n      }\n\n      /* this can only happen if exponent was non-zero */\n      if ( fraction_length == 10 )\n      {\n        number          /= 10;\n        fraction_length -= 1;\n      }\n\n      /* Convert into 16.16 format. */\n      if ( fraction_length > 0 )\n      {\n        if ( ( number / power_tens[fraction_length] ) > 0x7FFFL )\n          goto Exit;\n\n        result = FT_DivFix( number, power_tens[fraction_length] );\n      }\n      else\n      {\n        number *= power_tens[-fraction_length];\n\n        if ( number > 0x7FFFL )\n          goto Overflow;\n\n        result = (FT_Long)( (FT_ULong)number << 16 );\n      }\n    }\n\n  Exit:\n    if ( sign )\n      result = -result;\n\n    return result;\n\n  Overflow:\n    result = 0x7FFFFFFFL;\n    FT_TRACE4(( \"!!!OVERFLOW:!!!\" ));\n    goto Exit;\n\n  Underflow:\n    result = 0;\n    FT_TRACE4(( \"!!!UNDERFLOW:!!!\" ));\n    goto Exit;\n\n  Bad:\n    result = 0;\n    FT_TRACE4(( \"!!!END OF DATA:!!!\" ));\n    goto Exit;\n  }\n\n\n  /* read a number, either integer or real */\n  static FT_Long\n  cff_parse_num( FT_Byte**  d )\n  {\n    return **d == 30 ? ( cff_parse_real( d[0], d[1], 0, NULL ) >> 16 )\n                     :   cff_parse_integer( d[0], d[1] );\n  }\n\n\n  /* read a floating point number, either integer or real */\n  static FT_Fixed\n  do_fixed( FT_Byte**  d,\n            FT_Long    scaling )\n  {\n    if ( **d == 30 )\n      return cff_parse_real( d[0], d[1], scaling, NULL );\n    else\n    {\n      FT_Long  val = cff_parse_integer( d[0], d[1] );\n\n\n      if ( scaling )\n        val *= power_tens[scaling];\n\n      if ( val > 0x7FFF )\n      {\n        val = 0x7FFFFFFFL;\n        goto Overflow;\n      }\n      else if ( val < -0x7FFF )\n      {\n        val = -0x7FFFFFFFL;\n        goto Overflow;\n      }\n\n      return (FT_Long)( (FT_ULong)val << 16 );\n\n    Overflow:\n      FT_TRACE4(( \"!!!OVERFLOW:!!!\" ));\n      return val;\n    }\n  }\n\n\n  /* read a floating point number, either integer or real */\n  static FT_Fixed\n  cff_parse_fixed( FT_Byte**  d )\n  {\n    return do_fixed( d, 0 );\n  }\n\n\n  /* read a floating point number, either integer or real, */\n  /* but return `10^scaling' times the number read in      */\n  static FT_Fixed\n  cff_parse_fixed_scaled( FT_Byte**  d,\n                          FT_Long    scaling )\n  {\n    return do_fixed( d, scaling );\n  }\n\n\n  /* read a floating point number, either integer or real,     */\n  /* and return it as precise as possible -- `scaling' returns */\n  /* the scaling factor (as a power of 10)                     */\n  static FT_Fixed\n  cff_parse_fixed_dynamic( FT_Byte**  d,\n                           FT_Long*   scaling )\n  {\n    FT_ASSERT( scaling );\n\n    if ( **d == 30 )\n      return cff_parse_real( d[0], d[1], 0, scaling );\n    else\n    {\n      FT_Long  number;\n      FT_Int   integer_length;\n\n\n      number = cff_parse_integer( d[0], d[1] );\n\n      if ( number > 0x7FFFL )\n      {\n        for ( integer_length = 5; integer_length < 10; integer_length++ )\n          if ( number < power_tens[integer_length] )\n            break;\n\n        if ( ( number / power_tens[integer_length - 5] ) > 0x7FFFL )\n        {\n          *scaling = integer_length - 4;\n          return FT_DivFix( number, power_tens[integer_length - 4] );\n        }\n        else\n        {\n          *scaling = integer_length - 5;\n          return FT_DivFix( number, power_tens[integer_length - 5] );\n        }\n      }\n      else\n      {\n        *scaling = 0;\n        return (FT_Long)( (FT_ULong)number << 16 );\n      }\n    }\n  }\n\n\n  static FT_Error\n  cff_parse_font_matrix( CFF_Parser  parser )\n  {\n    CFF_FontRecDict  dict   = (CFF_FontRecDict)parser->object;\n    FT_Matrix*       matrix = &dict->font_matrix;\n    FT_Vector*       offset = &dict->font_offset;\n    FT_ULong*        upm    = &dict->units_per_em;\n    FT_Byte**        data   = parser->stack;\n    FT_Error         error  = FT_ERR( Stack_Underflow );\n\n\n    if ( parser->top >= parser->stack + 6 )\n    {\n      FT_Long  scaling;\n\n\n      error = FT_Err_Ok;\n\n      dict->has_font_matrix = TRUE;\n\n      /* We expect a well-formed font matrix, this is, the matrix elements */\n      /* `xx' and `yy' are of approximately the same magnitude.  To avoid  */\n      /* loss of precision, we use the magnitude of element `xx' to scale  */\n      /* all other elements.  The scaling factor is then contained in the  */\n      /* `units_per_em' value.                                             */\n\n      matrix->xx = cff_parse_fixed_dynamic( data++, &scaling );\n\n      scaling = -scaling;\n\n      if ( scaling < 0 || scaling > 9 )\n      {\n        /* Return default matrix in case of unlikely values. */\n\n        FT_TRACE1(( \"cff_parse_font_matrix:\"\n                    \" strange scaling value for xx element (%d),\\n\"\n                    \"                      \"\n                    \" using default matrix\\n\", scaling ));\n\n        matrix->xx = 0x10000L;\n        matrix->yx = 0;\n        matrix->xy = 0;\n        matrix->yy = 0x10000L;\n        offset->x  = 0;\n        offset->y  = 0;\n        *upm       = 1;\n\n        goto Exit;\n      }\n\n      matrix->yx = cff_parse_fixed_scaled( data++, scaling );\n      matrix->xy = cff_parse_fixed_scaled( data++, scaling );\n      matrix->yy = cff_parse_fixed_scaled( data++, scaling );\n      offset->x  = cff_parse_fixed_scaled( data++, scaling );\n      offset->y  = cff_parse_fixed_scaled( data,   scaling );\n\n      *upm = power_tens[scaling];\n\n      FT_TRACE4(( \" [%f %f %f %f %f %f]\\n\",\n                  (double)matrix->xx / *upm / 65536,\n                  (double)matrix->xy / *upm / 65536,\n                  (double)matrix->yx / *upm / 65536,\n                  (double)matrix->yy / *upm / 65536,\n                  (double)offset->x  / *upm / 65536,\n                  (double)offset->y  / *upm / 65536 ));\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  cff_parse_font_bbox( CFF_Parser  parser )\n  {\n    CFF_FontRecDict  dict = (CFF_FontRecDict)parser->object;\n    FT_BBox*         bbox = &dict->font_bbox;\n    FT_Byte**        data = parser->stack;\n    FT_Error         error;\n\n\n    error = FT_ERR( Stack_Underflow );\n\n    if ( parser->top >= parser->stack + 4 )\n    {\n      bbox->xMin = FT_RoundFix( cff_parse_fixed( data++ ) );\n      bbox->yMin = FT_RoundFix( cff_parse_fixed( data++ ) );\n      bbox->xMax = FT_RoundFix( cff_parse_fixed( data++ ) );\n      bbox->yMax = FT_RoundFix( cff_parse_fixed( data   ) );\n      error = FT_Err_Ok;\n\n      FT_TRACE4(( \" [%d %d %d %d]\\n\",\n                  bbox->xMin / 65536,\n                  bbox->yMin / 65536,\n                  bbox->xMax / 65536,\n                  bbox->yMax / 65536 ));\n    }\n\n    return error;\n  }\n\n\n  static FT_Error\n  cff_parse_private_dict( CFF_Parser  parser )\n  {\n    CFF_FontRecDict  dict = (CFF_FontRecDict)parser->object;\n    FT_Byte**        data = parser->stack;\n    FT_Error         error;\n\n\n    error = FT_ERR( Stack_Underflow );\n\n    if ( parser->top >= parser->stack + 2 )\n    {\n      dict->private_size   = cff_parse_num( data++ );\n      dict->private_offset = cff_parse_num( data   );\n      FT_TRACE4(( \" %lu %lu\\n\",\n                  dict->private_size, dict->private_offset ));\n\n      error = FT_Err_Ok;\n    }\n\n    return error;\n  }\n\n\n  static FT_Error\n  cff_parse_cid_ros( CFF_Parser  parser )\n  {\n    CFF_FontRecDict  dict = (CFF_FontRecDict)parser->object;\n    FT_Byte**        data = parser->stack;\n    FT_Error         error;\n\n\n    error = FT_ERR( Stack_Underflow );\n\n    if ( parser->top >= parser->stack + 3 )\n    {\n      dict->cid_registry = (FT_UInt)cff_parse_num( data++ );\n      dict->cid_ordering = (FT_UInt)cff_parse_num( data++ );\n      if ( **data == 30 )\n        FT_TRACE1(( \"cff_parse_cid_ros: real supplement is rounded\\n\" ));\n      dict->cid_supplement = cff_parse_num( data );\n      if ( dict->cid_supplement < 0 )\n        FT_TRACE1(( \"cff_parse_cid_ros: negative supplement %d is found\\n\",\n                   dict->cid_supplement ));\n      error = FT_Err_Ok;\n\n      FT_TRACE4(( \" %d %d %d\\n\",\n                  dict->cid_registry,\n                  dict->cid_ordering,\n                  dict->cid_supplement ));\n    }\n\n    return error;\n  }\n\n\n#define CFF_FIELD_NUM( code, name, id )             \\\n          CFF_FIELD( code, name, id, cff_kind_num )\n#define CFF_FIELD_FIXED( code, name, id )             \\\n          CFF_FIELD( code, name, id, cff_kind_fixed )\n#define CFF_FIELD_FIXED_1000( code, name, id )                 \\\n          CFF_FIELD( code, name, id, cff_kind_fixed_thousand )\n#define CFF_FIELD_STRING( code, name, id )             \\\n          CFF_FIELD( code, name, id, cff_kind_string )\n#define CFF_FIELD_BOOL( code, name, id )             \\\n          CFF_FIELD( code, name, id, cff_kind_bool )\n\n#define CFFCODE_TOPDICT  0x1000\n#define CFFCODE_PRIVATE  0x2000\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n\n#undef  CFF_FIELD\n#undef  CFF_FIELD_DELTA\n\n\n#ifndef FT_DEBUG_LEVEL_TRACE\n\n\n#define CFF_FIELD_CALLBACK( code, name, id ) \\\n          {                                  \\\n            cff_kind_callback,               \\\n            code | CFFCODE,                  \\\n            0, 0,                            \\\n            cff_parse_ ## name,              \\\n            0, 0                             \\\n          },\n\n#define CFF_FIELD( code, name, id, kind ) \\\n          {                               \\\n            kind,                         \\\n            code | CFFCODE,               \\\n            FT_FIELD_OFFSET( name ),      \\\n            FT_FIELD_SIZE( name ),        \\\n            0, 0, 0                       \\\n          },\n\n#define CFF_FIELD_DELTA( code, name, max, id ) \\\n          {                                    \\\n            cff_kind_delta,                    \\\n            code | CFFCODE,                    \\\n            FT_FIELD_OFFSET( name ),           \\\n            FT_FIELD_SIZE_DELTA( name ),       \\\n            0,                                 \\\n            max,                               \\\n            FT_FIELD_OFFSET( num_ ## name )    \\\n          },\n\n  static const CFF_Field_Handler  cff_field_handlers[] =\n  {\n\n#include \"cfftoken.h\"\n\n    { 0, 0, 0, 0, 0, 0, 0 }\n  };\n\n\n#else /* FT_DEBUG_LEVEL_TRACE */\n\n\n\n#define CFF_FIELD_CALLBACK( code, name, id ) \\\n          {                                  \\\n            cff_kind_callback,               \\\n            code | CFFCODE,                  \\\n            0, 0,                            \\\n            cff_parse_ ## name,              \\\n            0, 0,                            \\\n            id                               \\\n          },\n\n#define CFF_FIELD( code, name, id, kind ) \\\n          {                               \\\n            kind,                         \\\n            code | CFFCODE,               \\\n            FT_FIELD_OFFSET( name ),      \\\n            FT_FIELD_SIZE( name ),        \\\n            0, 0, 0,                      \\\n            id                            \\\n          },\n\n#define CFF_FIELD_DELTA( code, name, max, id ) \\\n          {                                    \\\n            cff_kind_delta,                    \\\n            code | CFFCODE,                    \\\n            FT_FIELD_OFFSET( name ),           \\\n            FT_FIELD_SIZE_DELTA( name ),       \\\n            0,                                 \\\n            max,                               \\\n            FT_FIELD_OFFSET( num_ ## name ),   \\\n            id                                 \\\n          },\n\n  static const CFF_Field_Handler  cff_field_handlers[] =\n  {\n\n#include \"cfftoken.h\"\n\n    { 0, 0, 0, 0, 0, 0, 0, 0 }\n  };\n\n\n#endif /* FT_DEBUG_LEVEL_TRACE */\n\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n\n  void\n  FT_Destroy_Class_cff_field_handlers( FT_Library          library,\n                                       CFF_Field_Handler*  clazz )\n  {\n    FT_Memory  memory = library->memory;\n\n\n    if ( clazz )\n      FT_FREE( clazz );\n  }\n\n\n  FT_Error\n  FT_Create_Class_cff_field_handlers( FT_Library           library,\n                                      CFF_Field_Handler**  output_class )\n  {\n    CFF_Field_Handler*  clazz  = NULL;\n    FT_Error            error;\n    FT_Memory           memory = library->memory;\n\n    int  i = 0;\n\n\n#undef CFF_FIELD\n#define CFF_FIELD( code, name, id, kind ) i++;\n#undef CFF_FIELD_DELTA\n#define CFF_FIELD_DELTA( code, name, max, id ) i++;\n#undef CFF_FIELD_CALLBACK\n#define CFF_FIELD_CALLBACK( code, name, id ) i++;\n\n#include \"cfftoken.h\"\n\n    i++; /* { 0, 0, 0, 0, 0, 0, 0 } */\n\n    if ( FT_ALLOC( clazz, sizeof ( CFF_Field_Handler ) * i ) )\n      return error;\n\n    i = 0;\n\n\n#ifndef FT_DEBUG_LEVEL_TRACE\n\n\n#undef CFF_FIELD_CALLBACK\n#define CFF_FIELD_CALLBACK( code_, name_, id_ )        \\\n          clazz[i].kind         = cff_kind_callback;   \\\n          clazz[i].code         = code_ | CFFCODE;     \\\n          clazz[i].offset       = 0;                   \\\n          clazz[i].size         = 0;                   \\\n          clazz[i].reader       = cff_parse_ ## name_; \\\n          clazz[i].array_max    = 0;                   \\\n          clazz[i].count_offset = 0;                   \\\n          i++;\n\n#undef  CFF_FIELD\n#define CFF_FIELD( code_, name_, id_, kind_ )               \\\n          clazz[i].kind         = kind_;                    \\\n          clazz[i].code         = code_ | CFFCODE;          \\\n          clazz[i].offset       = FT_FIELD_OFFSET( name_ ); \\\n          clazz[i].size         = FT_FIELD_SIZE( name_ );   \\\n          clazz[i].reader       = 0;                        \\\n          clazz[i].array_max    = 0;                        \\\n          clazz[i].count_offset = 0;                        \\\n          i++;                                              \\\n\n#undef  CFF_FIELD_DELTA\n#define CFF_FIELD_DELTA( code_, name_, max_, id_ )                  \\\n          clazz[i].kind         = cff_kind_delta;                   \\\n          clazz[i].code         = code_ | CFFCODE;                  \\\n          clazz[i].offset       = FT_FIELD_OFFSET( name_ );         \\\n          clazz[i].size         = FT_FIELD_SIZE_DELTA( name_ );     \\\n          clazz[i].reader       = 0;                                \\\n          clazz[i].array_max    = max_;                             \\\n          clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \\\n          i++;\n\n#include \"cfftoken.h\"\n\n    clazz[i].kind         = 0;\n    clazz[i].code         = 0;\n    clazz[i].offset       = 0;\n    clazz[i].size         = 0;\n    clazz[i].reader       = 0;\n    clazz[i].array_max    = 0;\n    clazz[i].count_offset = 0;\n\n\n#else /* FT_DEBUG_LEVEL_TRACE */\n\n\n#undef CFF_FIELD_CALLBACK\n#define CFF_FIELD_CALLBACK( code_, name_, id_ )        \\\n          clazz[i].kind         = cff_kind_callback;   \\\n          clazz[i].code         = code_ | CFFCODE;     \\\n          clazz[i].offset       = 0;                   \\\n          clazz[i].size         = 0;                   \\\n          clazz[i].reader       = cff_parse_ ## name_; \\\n          clazz[i].array_max    = 0;                   \\\n          clazz[i].count_offset = 0;                   \\\n          clazz[i].id           = id_;                 \\\n          i++;\n\n#undef  CFF_FIELD\n#define CFF_FIELD( code_, name_, id_, kind_ )               \\\n          clazz[i].kind         = kind_;                    \\\n          clazz[i].code         = code_ | CFFCODE;          \\\n          clazz[i].offset       = FT_FIELD_OFFSET( name_ ); \\\n          clazz[i].size         = FT_FIELD_SIZE( name_ );   \\\n          clazz[i].reader       = 0;                        \\\n          clazz[i].array_max    = 0;                        \\\n          clazz[i].count_offset = 0;                        \\\n          clazz[i].id           = id_;                      \\\n          i++;                                              \\\n\n#undef  CFF_FIELD_DELTA\n#define CFF_FIELD_DELTA( code_, name_, max_, id_ )                  \\\n          clazz[i].kind         = cff_kind_delta;                   \\\n          clazz[i].code         = code_ | CFFCODE;                  \\\n          clazz[i].offset       = FT_FIELD_OFFSET( name_ );         \\\n          clazz[i].size         = FT_FIELD_SIZE_DELTA( name_ );     \\\n          clazz[i].reader       = 0;                                \\\n          clazz[i].array_max    = max_;                             \\\n          clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \\\n          clazz[i].id           = id_;                              \\\n          i++;\n\n#include \"cfftoken.h\"\n\n    clazz[i].kind         = 0;\n    clazz[i].code         = 0;\n    clazz[i].offset       = 0;\n    clazz[i].size         = 0;\n    clazz[i].reader       = 0;\n    clazz[i].array_max    = 0;\n    clazz[i].count_offset = 0;\n    clazz[i].id           = 0;\n\n\n#endif /* FT_DEBUG_LEVEL_TRACE */\n\n\n    *output_class = clazz;\n\n    return FT_Err_Ok;\n  }\n\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cff_parser_run( CFF_Parser  parser,\n                  FT_Byte*    start,\n                  FT_Byte*    limit )\n  {\n    FT_Byte*    p       = start;\n    FT_Error    error   = FT_Err_Ok;\n    FT_Library  library = parser->library;\n    FT_UNUSED( library );\n\n\n    parser->top    = parser->stack;\n    parser->start  = start;\n    parser->limit  = limit;\n    parser->cursor = start;\n\n    while ( p < limit )\n    {\n      FT_UInt  v = *p;\n\n\n      if ( v >= 27 && v != 31 )\n      {\n        /* it's a number; we will push its position on the stack */\n        if ( parser->top - parser->stack >= CFF_MAX_STACK_DEPTH )\n          goto Stack_Overflow;\n\n        *parser->top ++ = p;\n\n        /* now, skip it */\n        if ( v == 30 )\n        {\n          /* skip real number */\n          p++;\n          for (;;)\n          {\n            /* An unterminated floating point number at the */\n            /* end of a dictionary is invalid but harmless. */\n            if ( p >= limit )\n              goto Exit;\n            v = p[0] >> 4;\n            if ( v == 15 )\n              break;\n            v = p[0] & 0xF;\n            if ( v == 15 )\n              break;\n            p++;\n          }\n        }\n        else if ( v == 28 )\n          p += 2;\n        else if ( v == 29 )\n          p += 4;\n        else if ( v > 246 )\n          p += 1;\n      }\n      else\n      {\n        /* This is not a number, hence it's an operator.  Compute its code */\n        /* and look for it in our current list.                            */\n\n        FT_UInt                   code;\n        FT_UInt                   num_args = (FT_UInt)\n                                             ( parser->top - parser->stack );\n        const CFF_Field_Handler*  field;\n\n\n        *parser->top = p;\n        code = v;\n        if ( v == 12 )\n        {\n          /* two byte operator */\n          p++;\n          if ( p >= limit )\n            goto Syntax_Error;\n\n          code = 0x100 | p[0];\n        }\n        code = code | parser->object_code;\n\n        for ( field = CFF_FIELD_HANDLERS_GET; field->kind; field++ )\n        {\n          if ( field->code == (FT_Int)code )\n          {\n            /* we found our field's handler; read it */\n            FT_Long   val;\n            FT_Byte*  q = (FT_Byte*)parser->object + field->offset;\n\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n            FT_TRACE4(( \"  %s\", field->id ));\n#endif\n\n            /* check that we have enough arguments -- except for */\n            /* delta encoded arrays, which can be empty          */\n            if ( field->kind != cff_kind_delta && num_args < 1 )\n              goto Stack_Underflow;\n\n            switch ( field->kind )\n            {\n            case cff_kind_bool:\n            case cff_kind_string:\n            case cff_kind_num:\n              val = cff_parse_num( parser->stack );\n              goto Store_Number;\n\n            case cff_kind_fixed:\n              val = cff_parse_fixed( parser->stack );\n              goto Store_Number;\n\n            case cff_kind_fixed_thousand:\n              val = cff_parse_fixed_scaled( parser->stack, 3 );\n\n            Store_Number:\n              switch ( field->size )\n              {\n              case (8 / FT_CHAR_BIT):\n                *(FT_Byte*)q = (FT_Byte)val;\n                break;\n\n              case (16 / FT_CHAR_BIT):\n                *(FT_Short*)q = (FT_Short)val;\n                break;\n\n              case (32 / FT_CHAR_BIT):\n                *(FT_Int32*)q = (FT_Int)val;\n                break;\n\n              default:  /* for 64-bit systems */\n                *(FT_Long*)q = val;\n              }\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n              switch ( field->kind )\n              {\n              case cff_kind_bool:\n                FT_TRACE4(( \" %s\\n\", val ? \"true\" : \"false\" ));\n                break;\n\n              case cff_kind_string:\n                FT_TRACE4(( \" %ld (SID)\\n\", val ));\n                break;\n\n              case cff_kind_num:\n                FT_TRACE4(( \" %ld\\n\", val ));\n                break;\n\n              case cff_kind_fixed:\n                FT_TRACE4(( \" %f\\n\", (double)val / 65536 ));\n                break;\n\n              case cff_kind_fixed_thousand:\n                FT_TRACE4(( \" %f\\n\", (double)val / 65536 / 1000 ));\n\n              default:\n                ; /* never reached */\n              }\n#endif\n\n              break;\n\n            case cff_kind_delta:\n              {\n                FT_Byte*   qcount = (FT_Byte*)parser->object +\n                                      field->count_offset;\n\n                FT_Byte**  data = parser->stack;\n\n\n                if ( num_args > field->array_max )\n                  num_args = field->array_max;\n\n                FT_TRACE4(( \" [\" ));\n\n                /* store count */\n                *qcount = (FT_Byte)num_args;\n\n                val = 0;\n                while ( num_args > 0 )\n                {\n                  val += cff_parse_num( data++ );\n                  switch ( field->size )\n                  {\n                  case (8 / FT_CHAR_BIT):\n                    *(FT_Byte*)q = (FT_Byte)val;\n                    break;\n\n                  case (16 / FT_CHAR_BIT):\n                    *(FT_Short*)q = (FT_Short)val;\n                    break;\n\n                  case (32 / FT_CHAR_BIT):\n                    *(FT_Int32*)q = (FT_Int)val;\n                    break;\n\n                  default:  /* for 64-bit systems */\n                    *(FT_Long*)q = val;\n                  }\n\n                  FT_TRACE4(( \" %ld\", val ));\n\n                  q += field->size;\n                  num_args--;\n                }\n\n                FT_TRACE4(( \"]\\n\" ));\n              }\n              break;\n\n            default:  /* callback */\n              error = field->reader( parser );\n              if ( error )\n                goto Exit;\n            }\n            goto Found;\n          }\n        }\n\n        /* this is an unknown operator, or it is unsupported; */\n        /* we will ignore it for now.                         */\n\n      Found:\n        /* clear stack */\n        parser->top = parser->stack;\n      }\n      p++;\n    }\n\n  Exit:\n    return error;\n\n  Stack_Overflow:\n    error = FT_THROW( Invalid_Argument );\n    goto Exit;\n\n  Stack_Underflow:\n    error = FT_THROW( Invalid_Argument );\n    goto Exit;\n\n  Syntax_Error:\n    error = FT_THROW( Invalid_Argument );\n    goto Exit;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffparse.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffparse.h                                                             */\n/*                                                                         */\n/*    CFF token stream parser (specification)                              */\n/*                                                                         */\n/*  Copyright 1996-2003, 2011 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CFF_PARSE_H__\n#define __CFF_PARSE_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"cfftypes.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#define CFF_MAX_STACK_DEPTH  96\n\n#define CFF_CODE_TOPDICT  0x1000\n#define CFF_CODE_PRIVATE  0x2000\n\n\n  typedef struct  CFF_ParserRec_\n  {\n    FT_Library library;\n    FT_Byte*   start;\n    FT_Byte*   limit;\n    FT_Byte*   cursor;\n\n    FT_Byte*   stack[CFF_MAX_STACK_DEPTH + 1];\n    FT_Byte**  top;\n\n    FT_UInt    object_code;\n    void*      object;\n\n  } CFF_ParserRec, *CFF_Parser;\n\n\n  FT_LOCAL( void )\n  cff_parser_init( CFF_Parser  parser,\n                   FT_UInt     code,\n                   void*       object,\n                   FT_Library  library);\n\n  FT_LOCAL( FT_Error )\n  cff_parser_run( CFF_Parser  parser,\n                  FT_Byte*    start,\n                  FT_Byte*    limit );\n\n\n  enum\n  {\n    cff_kind_none = 0,\n    cff_kind_num,\n    cff_kind_fixed,\n    cff_kind_fixed_thousand,\n    cff_kind_string,\n    cff_kind_bool,\n    cff_kind_delta,\n    cff_kind_callback,\n\n    cff_kind_max  /* do not remove */\n  };\n\n\n  /* now generate handlers for the most simple fields */\n  typedef FT_Error  (*CFF_Field_Reader)( CFF_Parser  parser );\n\n  typedef struct  CFF_Field_Handler_\n  {\n    int               kind;\n    int               code;\n    FT_UInt           offset;\n    FT_Byte           size;\n    CFF_Field_Reader  reader;\n    FT_UInt           array_max;\n    FT_UInt           count_offset;\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n    const char*       id;\n#endif\n\n  } CFF_Field_Handler;\n\n\nFT_END_HEADER\n\n\n#endif /* __CFF_PARSE_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffpic.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffpic.c                                                               */\n/*                                                                         */\n/*    The FreeType position independent code services for cff module.      */\n/*                                                                         */\n/*  Copyright 2009, 2010, 2012, 2013 by                                    */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/freetype.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"cffcmap.h\"\n#include \"cffpic.h\"\n#include \"cfferrs.h\"\n\n\n#ifdef FT_CONFIG_OPTION_PIC\n\n  /* forward declaration of PIC init functions from cffdrivr.c */\n  FT_Error\n  FT_Create_Class_cff_services( FT_Library           library,\n                                FT_ServiceDescRec**  output_class );\n  void\n  FT_Destroy_Class_cff_services( FT_Library          library,\n                                 FT_ServiceDescRec*  clazz );\n  void\n  FT_Init_Class_cff_service_ps_info( FT_Library             library,\n                                     FT_Service_PsInfoRec*  clazz );\n  void\n  FT_Init_Class_cff_service_glyph_dict( FT_Library                library,\n                                        FT_Service_GlyphDictRec*  clazz );\n  void\n  FT_Init_Class_cff_service_ps_name( FT_Library                 library,\n                                     FT_Service_PsFontNameRec*  clazz );\n  void\n  FT_Init_Class_cff_service_get_cmap_info( FT_Library              library,\n                                           FT_Service_TTCMapsRec*  clazz );\n  void\n  FT_Init_Class_cff_service_cid_info( FT_Library          library,\n                                      FT_Service_CIDRec*  clazz );\n\n  /* forward declaration of PIC init functions from cffparse.c */\n  FT_Error\n  FT_Create_Class_cff_field_handlers( FT_Library           library,\n                                      CFF_Field_Handler**  output_class );\n  void\n  FT_Destroy_Class_cff_field_handlers( FT_Library          library,\n                                       CFF_Field_Handler*  clazz );\n\n\n  void\n  cff_driver_class_pic_free( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Memory          memory        = library->memory;\n\n\n    if ( pic_container->cff )\n    {\n      CffModulePIC*  container = (CffModulePIC*)pic_container->cff;\n\n\n      if ( container->cff_services )\n        FT_Destroy_Class_cff_services( library,\n                                       container->cff_services );\n      container->cff_services = NULL;\n      if ( container->cff_field_handlers )\n        FT_Destroy_Class_cff_field_handlers(\n          library, container->cff_field_handlers );\n      container->cff_field_handlers = NULL;\n      FT_FREE( container );\n      pic_container->cff = NULL;\n    }\n  }\n\n\n  FT_Error\n  cff_driver_class_pic_init( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Error           error         = FT_Err_Ok;\n    CffModulePIC*      container     = NULL;\n    FT_Memory          memory        = library->memory;\n\n\n    /* allocate pointer, clear and set global container pointer */\n    if ( FT_ALLOC ( container, sizeof ( *container ) ) )\n      return error;\n    FT_MEM_SET( container, 0, sizeof ( *container ) );\n    pic_container->cff = container;\n\n    /* initialize pointer table -                       */\n    /* this is how the module usually expects this data */\n    error = FT_Create_Class_cff_services( library,\n                                          &container->cff_services );\n    if ( error )\n      goto Exit;\n\n    error = FT_Create_Class_cff_field_handlers(\n              library, &container->cff_field_handlers );\n    if ( error )\n      goto Exit;\n\n    FT_Init_Class_cff_service_ps_info(\n      library, &container->cff_service_ps_info );\n    FT_Init_Class_cff_service_glyph_dict(\n      library, &container->cff_service_glyph_dict );\n    FT_Init_Class_cff_service_ps_name(\n      library, &container->cff_service_ps_name );\n    FT_Init_Class_cff_service_get_cmap_info(\n      library, &container->cff_service_get_cmap_info );\n    FT_Init_Class_cff_service_cid_info(\n      library, &container->cff_service_cid_info );\n    FT_Init_Class_cff_cmap_encoding_class_rec(\n      library, &container->cff_cmap_encoding_class_rec );\n    FT_Init_Class_cff_cmap_unicode_class_rec(\n      library, &container->cff_cmap_unicode_class_rec );\n\n  Exit:\n    if ( error )\n      cff_driver_class_pic_free( library );\n    return error;\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffpic.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffpic.h                                                               */\n/*                                                                         */\n/*    The FreeType position independent code services for cff module.      */\n/*                                                                         */\n/*  Copyright 2009, 2012, 2013 by                                          */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CFFPIC_H__\n#define __CFFPIC_H__\n\n\nFT_BEGIN_HEADER\n\n#include \"../../include/freetype/internal/ftpic.h\"\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define CFF_SERVICE_PS_INFO_GET          cff_service_ps_info\n#define CFF_SERVICE_GLYPH_DICT_GET       cff_service_glyph_dict\n#define CFF_SERVICE_PS_NAME_GET          cff_service_ps_name\n#define CFF_SERVICE_GET_CMAP_INFO_GET    cff_service_get_cmap_info\n#define CFF_SERVICE_CID_INFO_GET         cff_service_cid_info\n#define CFF_SERVICE_PROPERTIES_GET       cff_service_properties\n#define CFF_SERVICES_GET                 cff_services\n#define CFF_CMAP_ENCODING_CLASS_REC_GET  cff_cmap_encoding_class_rec\n#define CFF_CMAP_UNICODE_CLASS_REC_GET   cff_cmap_unicode_class_rec\n#define CFF_FIELD_HANDLERS_GET           cff_field_handlers\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#include \"../../include/freetype/internal/services/svgldict.h\"\n#include \"cffparse.h\"\n#include \"../../include/freetype/internal/services/svpsinfo.h\"\n#include \"../../include/freetype/internal/services/svpostnm.h\"\n#include \"../../include/freetype/internal/services/svttcmap.h\"\n#include \"../../include/freetype/internal/services/svcid.h\"\n#include \"../../include/freetype/internal/services/svprop.h\"\n\n\n  typedef struct  CffModulePIC_\n  {\n    FT_ServiceDescRec*        cff_services;\n    CFF_Field_Handler*        cff_field_handlers;\n    FT_Service_PsInfoRec      cff_service_ps_info;\n    FT_Service_GlyphDictRec   cff_service_glyph_dict;\n    FT_Service_PsFontNameRec  cff_service_ps_name;\n    FT_Service_TTCMapsRec     cff_service_get_cmap_info;\n    FT_Service_CIDRec         cff_service_cid_info;\n    FT_Service_PropertiesRec  cff_service_properties;\n    FT_CMap_ClassRec          cff_cmap_encoding_class_rec;\n    FT_CMap_ClassRec          cff_cmap_unicode_class_rec;\n\n  } CffModulePIC;\n\n\n#define GET_PIC( lib )                                    \\\n          ( (CffModulePIC*)( (lib)->pic_container.cff ) )\n\n#define CFF_SERVICE_PS_INFO_GET                       \\\n          ( GET_PIC( library )->cff_service_ps_info )\n#define CFF_SERVICE_GLYPH_DICT_GET                       \\\n          ( GET_PIC( library )->cff_service_glyph_dict )\n#define CFF_SERVICE_PS_NAME_GET                       \\\n          ( GET_PIC( library )->cff_service_ps_name )\n#define CFF_SERVICE_GET_CMAP_INFO_GET                       \\\n          ( GET_PIC( library )->cff_service_get_cmap_info )\n#define CFF_SERVICE_CID_INFO_GET                       \\\n          ( GET_PIC( library )->cff_service_cid_info )\n#define CFF_SERVICE_PROPERTIES_GET                       \\\n          ( GET_PIC( library )->cff_service_properties )\n#define CFF_SERVICES_GET                       \\\n          ( GET_PIC( library )->cff_services )\n#define CFF_CMAP_ENCODING_CLASS_REC_GET                       \\\n          ( GET_PIC( library )->cff_cmap_encoding_class_rec )\n#define CFF_CMAP_UNICODE_CLASS_REC_GET                       \\\n          ( GET_PIC( library )->cff_cmap_unicode_class_rec )\n#define CFF_FIELD_HANDLERS_GET                       \\\n          ( GET_PIC( library )->cff_field_handlers )\n\n  /* see cffpic.c for the implementation */\n  void\n  cff_driver_class_pic_free( FT_Library  library );\n\n  FT_Error\n  cff_driver_class_pic_init( FT_Library  library );\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __CFFPIC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfftoken.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cfftoken.h                                                             */\n/*                                                                         */\n/*    CFF token definitions (specification only).                          */\n/*                                                                         */\n/*  Copyright 1996-2003, 2011 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  CFF_FontRecDictRec\n\n#undef  CFFCODE\n#define CFFCODE       CFFCODE_TOPDICT\n\n  CFF_FIELD_STRING  ( 0,     version,             \"Version\" )\n  CFF_FIELD_STRING  ( 1,     notice,              \"Notice\" )\n  CFF_FIELD_STRING  ( 0x100, copyright,           \"Copyright\" )\n  CFF_FIELD_STRING  ( 2,     full_name,           \"FullName\" )\n  CFF_FIELD_STRING  ( 3,     family_name,         \"FamilyName\" )\n  CFF_FIELD_STRING  ( 4,     weight,              \"Weight\" )\n  CFF_FIELD_BOOL    ( 0x101, is_fixed_pitch,      \"isFixedPitch\" )\n  CFF_FIELD_FIXED   ( 0x102, italic_angle,        \"ItalicAngle\" )\n  CFF_FIELD_FIXED   ( 0x103, underline_position,  \"UnderlinePosition\" )\n  CFF_FIELD_FIXED   ( 0x104, underline_thickness, \"UnderlineThickness\" )\n  CFF_FIELD_NUM     ( 0x105, paint_type,          \"PaintType\" )\n  CFF_FIELD_NUM     ( 0x106, charstring_type,     \"CharstringType\" )\n  CFF_FIELD_CALLBACK( 0x107, font_matrix,         \"FontMatrix\" )\n  CFF_FIELD_NUM     ( 13,    unique_id,           \"UniqueID\" )\n  CFF_FIELD_CALLBACK( 5,     font_bbox,           \"FontBBox\" )\n  CFF_FIELD_NUM     ( 0x108, stroke_width,        \"StrokeWidth\" )\n  CFF_FIELD_NUM     ( 15,    charset_offset,      \"charset\" )\n  CFF_FIELD_NUM     ( 16,    encoding_offset,     \"Encoding\" )\n  CFF_FIELD_NUM     ( 17,    charstrings_offset,  \"CharStrings\" )\n  CFF_FIELD_CALLBACK( 18,    private_dict,        \"Private\" )\n  CFF_FIELD_NUM     ( 0x114, synthetic_base,      \"SyntheticBase\" )\n  CFF_FIELD_STRING  ( 0x115, embedded_postscript, \"PostScript\" )\n\n#if 0\n  CFF_FIELD_STRING  ( 0x116, base_font_name,      \"BaseFontName\" )\n  CFF_FIELD_DELTA   ( 0x117, base_font_blend, 16, \"BaseFontBlend\" )\n  CFF_FIELD_CALLBACK( 0x118, multiple_master,     \"MultipleMaster\" )\n  CFF_FIELD_CALLBACK( 0x119, blend_axis_types,    \"BlendAxisTypes\" )\n#endif\n\n  CFF_FIELD_CALLBACK( 0x11E, cid_ros,              \"ROS\" )\n  CFF_FIELD_NUM     ( 0x11F, cid_font_version,     \"CIDFontVersion\" )\n  CFF_FIELD_NUM     ( 0x120, cid_font_revision,    \"CIDFontRevision\" )\n  CFF_FIELD_NUM     ( 0x121, cid_font_type,        \"CIDFontType\" )\n  CFF_FIELD_NUM     ( 0x122, cid_count,            \"CIDCount\" )\n  CFF_FIELD_NUM     ( 0x123, cid_uid_base,         \"UIDBase\" )\n  CFF_FIELD_NUM     ( 0x124, cid_fd_array_offset,  \"FDArray\" )\n  CFF_FIELD_NUM     ( 0x125, cid_fd_select_offset, \"FDSelect\" )\n  CFF_FIELD_STRING  ( 0x126, cid_font_name,        \"FontName\" )\n\n#if 0\n  CFF_FIELD_NUM     ( 0x127, chameleon, \"Chameleon\" )\n#endif\n\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  CFF_PrivateRec\n#undef  CFFCODE\n#define CFFCODE       CFFCODE_PRIVATE\n\n  CFF_FIELD_DELTA     ( 6,     blue_values, 14,        \"BlueValues\" )\n  CFF_FIELD_DELTA     ( 7,     other_blues, 10,        \"OtherBlues\" )\n  CFF_FIELD_DELTA     ( 8,     family_blues, 14,       \"FamilyBlues\" )\n  CFF_FIELD_DELTA     ( 9,     family_other_blues, 10, \"FamilyOtherBlues\" )\n  CFF_FIELD_FIXED_1000( 0x109, blue_scale,             \"BlueScale\" )\n  CFF_FIELD_NUM       ( 0x10A, blue_shift,             \"BlueShift\" )\n  CFF_FIELD_NUM       ( 0x10B, blue_fuzz,              \"BlueFuzz\" )\n  CFF_FIELD_NUM       ( 10,    standard_width,         \"StdHW\" )\n  CFF_FIELD_NUM       ( 11,    standard_height,        \"StdVW\" )\n  CFF_FIELD_DELTA     ( 0x10C, snap_widths, 13,        \"StemSnapH\" )\n  CFF_FIELD_DELTA     ( 0x10D, snap_heights, 13,       \"StemSnapV\" )\n  CFF_FIELD_BOOL      ( 0x10E, force_bold,             \"ForceBold\" )\n  CFF_FIELD_FIXED     ( 0x10F, force_bold_threshold,   \"ForceBoldThreshold\" )\n  CFF_FIELD_NUM       ( 0x110, lenIV,                  \"lenIV\" )\n  CFF_FIELD_NUM       ( 0x111, language_group,         \"LanguageGroup\" )\n  CFF_FIELD_FIXED     ( 0x112, expansion_factor,       \"ExpansionFactor\" )\n  CFF_FIELD_NUM       ( 0x113, initial_random_seed,    \"initialRandomSeed\" )\n  CFF_FIELD_NUM       ( 19,    local_subrs_offset,     \"Subrs\" )\n  CFF_FIELD_NUM       ( 20,    default_width,          \"defaultWidthX\" )\n  CFF_FIELD_NUM       ( 21,    nominal_width,          \"nominalWidthX\" )\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfftypes.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cfftypes.h                                                             */\n/*                                                                         */\n/*    Basic OpenType/CFF type definitions and interface (specification     */\n/*    only).                                                               */\n/*                                                                         */\n/*  Copyright 1996-2003, 2006-2008, 2010-2011, 2013 by                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CFFTYPES_H__\n#define __CFFTYPES_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/freetype.h\"\n#include \"../../include/freetype/t1tables.h\"\n#include \"../../include/freetype/internal/ftserv.h\"\n#include \"../../include/freetype/internal/services/svpscmap.h\"\n#include \"../../include/freetype/internal/pshints.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    CFF_IndexRec                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a CFF Index table.                       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    stream      :: The source input stream.                            */\n  /*                                                                       */\n  /*    start       :: The position of the first index byte in the         */\n  /*                   input stream.                                       */\n  /*                                                                       */\n  /*    count       :: The number of elements in the index.                */\n  /*                                                                       */\n  /*    off_size    :: The size in bytes of object offsets in index.       */\n  /*                                                                       */\n  /*    data_offset :: The position of first data byte in the index's      */\n  /*                   bytes.                                              */\n  /*                                                                       */\n  /*    data_size   :: The size of the data table in this index.           */\n  /*                                                                       */\n  /*    offsets     :: A table of element offsets in the index.  Must be   */\n  /*                   loaded explicitly.                                  */\n  /*                                                                       */\n  /*    bytes       :: If the index is loaded in memory, its bytes.        */\n  /*                                                                       */\n  typedef struct  CFF_IndexRec_\n  {\n    FT_Stream  stream;\n    FT_ULong   start;\n    FT_UInt    count;\n    FT_Byte    off_size;\n    FT_ULong   data_offset;\n    FT_ULong   data_size;\n\n    FT_ULong*  offsets;\n    FT_Byte*   bytes;\n\n  } CFF_IndexRec, *CFF_Index;\n\n\n  typedef struct  CFF_EncodingRec_\n  {\n    FT_UInt     format;\n    FT_ULong    offset;\n\n    FT_UInt     count;\n    FT_UShort   sids [256];  /* avoid dynamic allocations */\n    FT_UShort   codes[256];\n\n  } CFF_EncodingRec, *CFF_Encoding;\n\n\n  typedef struct  CFF_CharsetRec_\n  {\n\n    FT_UInt     format;\n    FT_ULong    offset;\n\n    FT_UShort*  sids;\n    FT_UShort*  cids;       /* the inverse mapping of `sids'; only needed */\n                            /* for CID-keyed fonts                        */\n    FT_UInt     max_cid;\n    FT_UInt     num_glyphs;\n\n  } CFF_CharsetRec, *CFF_Charset;\n\n\n  typedef struct  CFF_FontRecDictRec_\n  {\n    FT_UInt    version;\n    FT_UInt    notice;\n    FT_UInt    copyright;\n    FT_UInt    full_name;\n    FT_UInt    family_name;\n    FT_UInt    weight;\n    FT_Bool    is_fixed_pitch;\n    FT_Fixed   italic_angle;\n    FT_Fixed   underline_position;\n    FT_Fixed   underline_thickness;\n    FT_Int     paint_type;\n    FT_Int     charstring_type;\n    FT_Matrix  font_matrix;\n    FT_Bool    has_font_matrix;\n    FT_ULong   units_per_em;  /* temporarily used as scaling value also */\n    FT_Vector  font_offset;\n    FT_ULong   unique_id;\n    FT_BBox    font_bbox;\n    FT_Pos     stroke_width;\n    FT_ULong   charset_offset;\n    FT_ULong   encoding_offset;\n    FT_ULong   charstrings_offset;\n    FT_ULong   private_offset;\n    FT_ULong   private_size;\n    FT_Long    synthetic_base;\n    FT_UInt    embedded_postscript;\n\n    /* these should only be used for the top-level font dictionary */\n    FT_UInt    cid_registry;\n    FT_UInt    cid_ordering;\n    FT_Long    cid_supplement;\n\n    FT_Long    cid_font_version;\n    FT_Long    cid_font_revision;\n    FT_Long    cid_font_type;\n    FT_ULong   cid_count;\n    FT_ULong   cid_uid_base;\n    FT_ULong   cid_fd_array_offset;\n    FT_ULong   cid_fd_select_offset;\n    FT_UInt    cid_font_name;\n\n  } CFF_FontRecDictRec, *CFF_FontRecDict;\n\n\n  typedef struct  CFF_PrivateRec_\n  {\n    FT_Byte   num_blue_values;\n    FT_Byte   num_other_blues;\n    FT_Byte   num_family_blues;\n    FT_Byte   num_family_other_blues;\n\n    FT_Pos    blue_values[14];\n    FT_Pos    other_blues[10];\n    FT_Pos    family_blues[14];\n    FT_Pos    family_other_blues[10];\n\n    FT_Fixed  blue_scale;\n    FT_Pos    blue_shift;\n    FT_Pos    blue_fuzz;\n    FT_Pos    standard_width;\n    FT_Pos    standard_height;\n\n    FT_Byte   num_snap_widths;\n    FT_Byte   num_snap_heights;\n    FT_Pos    snap_widths[13];\n    FT_Pos    snap_heights[13];\n    FT_Bool   force_bold;\n    FT_Fixed  force_bold_threshold;\n    FT_Int    lenIV;\n    FT_Int    language_group;\n    FT_Fixed  expansion_factor;\n    FT_Long   initial_random_seed;\n    FT_ULong  local_subrs_offset;\n    FT_Pos    default_width;\n    FT_Pos    nominal_width;\n\n  } CFF_PrivateRec, *CFF_Private;\n\n\n  typedef struct  CFF_FDSelectRec_\n  {\n    FT_Byte   format;\n    FT_UInt   range_count;\n\n    /* that's the table, taken from the file `as is' */\n    FT_Byte*  data;\n    FT_UInt   data_size;\n\n    /* small cache for format 3 only */\n    FT_UInt   cache_first;\n    FT_UInt   cache_count;\n    FT_Byte   cache_fd;\n\n  } CFF_FDSelectRec, *CFF_FDSelect;\n\n\n  /* A SubFont packs a font dict and a private dict together.  They are */\n  /* needed to support CID-keyed CFF fonts.                             */\n  typedef struct  CFF_SubFontRec_\n  {\n    CFF_FontRecDictRec  font_dict;\n    CFF_PrivateRec      private_dict;\n\n    CFF_IndexRec        local_subrs_index;\n    FT_Byte**           local_subrs; /* array of pointers into Local Subrs INDEX data */\n\n  } CFF_SubFontRec, *CFF_SubFont;\n\n\n#define CFF_MAX_CID_FONTS  256\n\n\n  typedef struct  CFF_FontRec_\n  {\n    FT_Stream        stream;\n    FT_Memory        memory;\n    FT_UInt          num_faces;\n    FT_UInt          num_glyphs;\n\n    FT_Byte          version_major;\n    FT_Byte          version_minor;\n    FT_Byte          header_size;\n    FT_Byte          absolute_offsize;\n\n\n    CFF_IndexRec     name_index;\n    CFF_IndexRec     top_dict_index;\n    CFF_IndexRec     global_subrs_index;\n\n    CFF_EncodingRec  encoding;\n    CFF_CharsetRec   charset;\n\n    CFF_IndexRec     charstrings_index;\n    CFF_IndexRec     font_dict_index;\n    CFF_IndexRec     private_index;\n    CFF_IndexRec     local_subrs_index;\n\n    FT_String*       font_name;\n\n    /* array of pointers into Global Subrs INDEX data */\n    FT_Byte**        global_subrs;\n\n    /* array of pointers into String INDEX data stored at string_pool */\n    FT_UInt          num_strings;\n    FT_Byte**        strings;\n    FT_Byte*         string_pool;\n\n    CFF_SubFontRec   top_font;\n    FT_UInt          num_subfonts;\n    CFF_SubFont      subfonts[CFF_MAX_CID_FONTS];\n\n    CFF_FDSelectRec  fd_select;\n\n    /* interface to PostScript hinter */\n    PSHinter_Service  pshinter;\n\n    /* interface to Postscript Names service */\n    FT_Service_PsCMaps  psnames;\n\n    /* since version 2.3.0 */\n    PS_FontInfoRec*  font_info;   /* font info dictionary */\n\n    /* since version 2.3.6 */\n    FT_String*       registry;\n    FT_String*       ordering;\n\n    /* since version 2.4.12 */\n    FT_Generic       cf2_instance;\n\n  } CFF_FontRec, *CFF_Font;\n\n\nFT_END_HEADER\n\n#endif /* __CFFTYPES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cff/fxft_cff.c",
    "content": "#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501\n/***************************************************************************/\n/*                                                                         */\n/*  cff.c                                                                  */\n/*                                                                         */\n/*    FreeType OpenType driver component (body only).                      */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n#define FT2_BUILD_LIBRARY\n\n#include \"../../include/ft2build.h\"\n\n#include \"cffpic.c\"\n#include \"cffdrivr.c\"\n#include \"cffparse.c\"\n#include \"cffload.c\"\n#include \"cffobjs.c\"\n#include \"cffgload.c\"\n#include \"cffcmap.c\"\n\n#include \"cf2arrst.c\"\n#include \"cf2blues.c\"\n#include \"cf2error.c\"\n#include \"cf2font.c\"\n#include \"cf2ft.c\"\n#include \"cf2hints.c\"\n#include \"cf2intrp.c\"\n#include \"cf2read.c\"\n#include \"cf2stack.c\"\n\n/* END */\n#endif\n\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cid/Jamfile",
    "content": "# FreeType 2 src/cid Jamfile\n#\n# Copyright 2001 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) cid ;\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = cidobjs cidload cidgload cidriver cidparse ;\n  }\n  else\n  {\n    _sources = type1cid ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/cid Jamfile\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cid/ciderrs.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ciderrs.h                                                              */\n/*                                                                         */\n/*    CID error codes (specification only).                                */\n/*                                                                         */\n/*  Copyright 2001, 2012 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the CID error enumeration constants.      */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __CIDERRS_H__\n#define __CIDERRS_H__\n\n#include \"../../include/freetype/ftmoderr.h\"\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  CID_Err_\n#define FT_ERR_BASE    FT_Mod_Err_CID\n\n#include \"../../include/freetype/fterrors.h\"\n\n#endif /* __CIDERRS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidgload.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cidgload.c                                                             */\n/*                                                                         */\n/*    CID-keyed Type1 Glyph Loader (body).                                 */\n/*                                                                         */\n/*  Copyright 1996-2007, 2009, 2010, 2013 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"cidload.h\"\n#include \"cidgload.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/ftoutln.h\"\n#include \"../../include/freetype/internal/ftcalc.h\"\n\n#include \"ciderrs.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cidgload\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  cid_load_glyph( T1_Decoder  decoder,\n                  FT_UInt     glyph_index )\n  {\n    CID_Face       face = (CID_Face)decoder->builder.face;\n    CID_FaceInfo   cid  = &face->cid;\n    FT_Byte*       p;\n    FT_UInt        fd_select;\n    FT_Stream      stream       = face->cid_stream;\n    FT_Error       error        = FT_Err_Ok;\n    FT_Byte*       charstring   = 0;\n    FT_Memory      memory       = face->root.memory;\n    FT_ULong       glyph_length = 0;\n    PSAux_Service  psaux        = (PSAux_Service)face->psaux;\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    FT_Incremental_InterfaceRec *inc =\n                                  face->root.internal->incremental_interface;\n#endif\n\n\n    FT_TRACE4(( \"cid_load_glyph: glyph index %d\\n\", glyph_index ));\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n\n    /* For incremental fonts get the character data using */\n    /* the callback function.                             */\n    if ( inc )\n    {\n      FT_Data  glyph_data;\n\n\n      error = inc->funcs->get_glyph_data( inc->object,\n                                          glyph_index, &glyph_data );\n      if ( error )\n        goto Exit;\n\n      p         = (FT_Byte*)glyph_data.pointer;\n      fd_select = (FT_UInt)cid_get_offset( &p, (FT_Byte)cid->fd_bytes );\n\n      if ( glyph_data.length != 0 )\n      {\n        glyph_length = glyph_data.length - cid->fd_bytes;\n        (void)FT_ALLOC( charstring, glyph_length );\n        if ( !error )\n          ft_memcpy( charstring, glyph_data.pointer + cid->fd_bytes,\n                     glyph_length );\n      }\n\n      inc->funcs->free_glyph_data( inc->object, &glyph_data );\n\n      if ( error )\n        goto Exit;\n    }\n\n    else\n\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n\n    /* For ordinary fonts read the CID font dictionary index */\n    /* and charstring offset from the CIDMap.                */\n    {\n      FT_UInt   entry_len = cid->fd_bytes + cid->gd_bytes;\n      FT_ULong  off1;\n\n\n      if ( FT_STREAM_SEEK( cid->data_offset + cid->cidmap_offset +\n                           glyph_index * entry_len )               ||\n           FT_FRAME_ENTER( 2 * entry_len )                         )\n        goto Exit;\n\n      p            = (FT_Byte*)stream->cursor;\n      fd_select    = (FT_UInt) cid_get_offset( &p, (FT_Byte)cid->fd_bytes );\n      off1         = (FT_ULong)cid_get_offset( &p, (FT_Byte)cid->gd_bytes );\n      p           += cid->fd_bytes;\n      glyph_length = cid_get_offset( &p, (FT_Byte)cid->gd_bytes ) - off1;\n      FT_FRAME_EXIT();\n\n      if ( fd_select >= (FT_UInt)cid->num_dicts )\n      {\n        error = FT_THROW( Invalid_Offset );\n        goto Exit;\n      }\n      if ( glyph_length == 0 )\n        goto Exit;\n      if ( FT_ALLOC( charstring, glyph_length ) )\n        goto Exit;\n      if ( FT_STREAM_READ_AT( cid->data_offset + off1,\n                              charstring, glyph_length ) )\n        goto Exit;\n    }\n\n    /* Now set up the subrs array and parse the charstrings. */\n    {\n      CID_FaceDict  dict;\n      CID_Subrs     cid_subrs = face->subrs + fd_select;\n      FT_Int        cs_offset;\n\n\n      /* Set up subrs */\n      decoder->num_subrs = cid_subrs->num_subrs;\n      decoder->subrs     = cid_subrs->code;\n      decoder->subrs_len = 0;\n\n      /* Set up font matrix */\n      dict                 = cid->font_dicts + fd_select;\n\n      decoder->font_matrix = dict->font_matrix;\n      decoder->font_offset = dict->font_offset;\n      decoder->lenIV       = dict->private_dict.lenIV;\n\n      /* Decode the charstring. */\n\n      /* Adjustment for seed bytes. */\n      cs_offset = ( decoder->lenIV >= 0 ? decoder->lenIV : 0 );\n\n      /* Decrypt only if lenIV >= 0. */\n      if ( decoder->lenIV >= 0 )\n        psaux->t1_decrypt( charstring, glyph_length, 4330 );\n\n      error = decoder->funcs.parse_charstrings(\n                decoder, charstring + cs_offset,\n                (FT_Int)glyph_length - cs_offset );\n    }\n\n    FT_FREE( charstring );\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n\n    /* Incremental fonts can optionally override the metrics. */\n    if ( !error && inc && inc->funcs->get_glyph_metrics )\n    {\n      FT_Incremental_MetricsRec  metrics;\n\n\n      metrics.bearing_x = FIXED_TO_INT( decoder->builder.left_bearing.x );\n      metrics.bearing_y = 0;\n      metrics.advance   = FIXED_TO_INT( decoder->builder.advance.x );\n      metrics.advance_v = FIXED_TO_INT( decoder->builder.advance.y );\n\n      error = inc->funcs->get_glyph_metrics( inc->object,\n                                             glyph_index, FALSE, &metrics );\n\n      decoder->builder.left_bearing.x = INT_TO_FIXED( metrics.bearing_x );\n      decoder->builder.advance.x      = INT_TO_FIXED( metrics.advance );\n      decoder->builder.advance.y      = INT_TO_FIXED( metrics.advance_v );\n    }\n\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n\n  Exit:\n    return error;\n  }\n\n\n#if 0\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /**********                                                      *********/\n  /**********                                                      *********/\n  /**********            COMPUTE THE MAXIMUM ADVANCE WIDTH         *********/\n  /**********                                                      *********/\n  /**********    The following code is in charge of computing      *********/\n  /**********    the maximum advance width of the font.  It        *********/\n  /**********    quickly processes each glyph charstring to        *********/\n  /**********    extract the value from either a `sbw' or `seac'   *********/\n  /**********    operator.                                         *********/\n  /**********                                                      *********/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cid_face_compute_max_advance( CID_Face  face,\n                                FT_Int*   max_advance )\n  {\n    FT_Error       error;\n    T1_DecoderRec  decoder;\n    FT_Int         glyph_index;\n\n    PSAux_Service  psaux = (PSAux_Service)face->psaux;\n\n\n    *max_advance = 0;\n\n    /* Initialize load decoder */\n    error = psaux->t1_decoder_funcs->init( &decoder,\n                                           (FT_Face)face,\n                                           0, /* size       */\n                                           0, /* glyph slot */\n                                           0, /* glyph names! XXX */\n                                           0, /* blend == 0 */\n                                           0, /* hinting == 0 */\n                                           cid_load_glyph );\n    if ( error )\n      return error;\n\n    /* TODO: initialize decoder.len_buildchar and decoder.buildchar */\n    /*       if we ever support CID-keyed multiple master fonts     */\n\n    decoder.builder.metrics_only = 1;\n    decoder.builder.load_points  = 0;\n\n    /* for each glyph, parse the glyph charstring and extract */\n    /* the advance width                                      */\n    for ( glyph_index = 0; glyph_index < face->root.num_glyphs;\n          glyph_index++ )\n    {\n      /* now get load the unscaled outline */\n      error = cid_load_glyph( &decoder, glyph_index );\n      /* ignore the error if one occurred - skip to next glyph */\n    }\n\n    *max_advance = FIXED_TO_INT( decoder.builder.advance.x );\n\n    psaux->t1_decoder_funcs->done( &decoder );\n\n    return FT_Err_Ok;\n  }\n\n\n#endif /* 0 */\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cid_slot_load_glyph( FT_GlyphSlot  cidglyph,      /* CID_GlyphSlot */\n                       FT_Size       cidsize,       /* CID_Size      */\n                       FT_UInt       glyph_index,\n                       FT_Int32      load_flags )\n  {\n    CID_GlyphSlot  glyph = (CID_GlyphSlot)cidglyph;\n    FT_Error       error;\n    T1_DecoderRec  decoder;\n    CID_Face       face = (CID_Face)cidglyph->face;\n    FT_Bool        hinting;\n\n    PSAux_Service  psaux = (PSAux_Service)face->psaux;\n    FT_Matrix      font_matrix;\n    FT_Vector      font_offset;\n\n\n    if ( glyph_index >= (FT_UInt)face->root.num_glyphs )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    if ( load_flags & FT_LOAD_NO_RECURSE )\n      load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;\n\n    glyph->x_scale = cidsize->metrics.x_scale;\n    glyph->y_scale = cidsize->metrics.y_scale;\n\n    cidglyph->outline.n_points   = 0;\n    cidglyph->outline.n_contours = 0;\n\n    hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 &&\n                       ( load_flags & FT_LOAD_NO_HINTING ) == 0 );\n\n    cidglyph->format = FT_GLYPH_FORMAT_OUTLINE;\n\n    error = psaux->t1_decoder_funcs->init( &decoder,\n                                           cidglyph->face,\n                                           cidsize,\n                                           cidglyph,\n                                           0, /* glyph names -- XXX */\n                                           0, /* blend == 0 */\n                                           hinting,\n                                           FT_LOAD_TARGET_MODE( load_flags ),\n                                           cid_load_glyph );\n    if ( error )\n      goto Exit;\n\n    /* TODO: initialize decoder.len_buildchar and decoder.buildchar */\n    /*       if we ever support CID-keyed multiple master fonts     */\n\n    /* set up the decoder */\n    decoder.builder.no_recurse = FT_BOOL(\n      ( ( load_flags & FT_LOAD_NO_RECURSE ) != 0 ) );\n\n    error = cid_load_glyph( &decoder, glyph_index );\n    if ( error )\n      goto Exit;\n\n    font_matrix = decoder.font_matrix;\n    font_offset = decoder.font_offset;\n\n    /* save new glyph tables */\n    psaux->t1_decoder_funcs->done( &decoder );\n\n    /* now set the metrics -- this is rather simple, as    */\n    /* the left side bearing is the xMin, and the top side */\n    /* bearing the yMax                                    */\n    cidglyph->outline.flags &= FT_OUTLINE_OWNER;\n    cidglyph->outline.flags |= FT_OUTLINE_REVERSE_FILL;\n\n    /* for composite glyphs, return only left side bearing and */\n    /* advance width                                           */\n    if ( load_flags & FT_LOAD_NO_RECURSE )\n    {\n      FT_Slot_Internal  internal = cidglyph->internal;\n\n\n      cidglyph->metrics.horiBearingX =\n        FIXED_TO_INT( decoder.builder.left_bearing.x );\n      cidglyph->metrics.horiAdvance =\n        FIXED_TO_INT( decoder.builder.advance.x );\n\n      internal->glyph_matrix      = font_matrix;\n      internal->glyph_delta       = font_offset;\n      internal->glyph_transformed = 1;\n    }\n    else\n    {\n      FT_BBox            cbox;\n      FT_Glyph_Metrics*  metrics = &cidglyph->metrics;\n      FT_Vector          advance;\n\n\n      /* copy the _unscaled_ advance width */\n      metrics->horiAdvance =\n        FIXED_TO_INT( decoder.builder.advance.x );\n      cidglyph->linearHoriAdvance =\n        FIXED_TO_INT( decoder.builder.advance.x );\n      cidglyph->internal->glyph_transformed = 0;\n\n      /* make up vertical ones */\n      metrics->vertAdvance        = ( face->cid.font_bbox.yMax -\n                                      face->cid.font_bbox.yMin ) >> 16;\n      cidglyph->linearVertAdvance = metrics->vertAdvance;\n\n      cidglyph->format            = FT_GLYPH_FORMAT_OUTLINE;\n\n      if ( cidsize->metrics.y_ppem < 24 )\n        cidglyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;\n\n      /* apply the font matrix */\n      FT_Outline_Transform( &cidglyph->outline, &font_matrix );\n\n      FT_Outline_Translate( &cidglyph->outline,\n                            font_offset.x,\n                            font_offset.y );\n\n      advance.x = metrics->horiAdvance;\n      advance.y = 0;\n      FT_Vector_Transform( &advance, &font_matrix );\n      metrics->horiAdvance = advance.x + font_offset.x;\n\n      advance.x = 0;\n      advance.y = metrics->vertAdvance;\n      FT_Vector_Transform( &advance, &font_matrix );\n      metrics->vertAdvance = advance.y + font_offset.y;\n\n      if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 )\n      {\n        /* scale the outline and the metrics */\n        FT_Int       n;\n        FT_Outline*  cur = decoder.builder.base;\n        FT_Vector*   vec = cur->points;\n        FT_Fixed     x_scale = glyph->x_scale;\n        FT_Fixed     y_scale = glyph->y_scale;\n\n\n        /* First of all, scale the points */\n        if ( !hinting || !decoder.builder.hints_funcs )\n          for ( n = cur->n_points; n > 0; n--, vec++ )\n          {\n            vec->x = FT_MulFix( vec->x, x_scale );\n            vec->y = FT_MulFix( vec->y, y_scale );\n          }\n\n        /* Then scale the metrics */\n        metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );\n        metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );\n      }\n\n      /* compute the other metrics */\n      FT_Outline_Get_CBox( &cidglyph->outline, &cbox );\n\n      metrics->width  = cbox.xMax - cbox.xMin;\n      metrics->height = cbox.yMax - cbox.yMin;\n\n      metrics->horiBearingX = cbox.xMin;\n      metrics->horiBearingY = cbox.yMax;\n\n      if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )\n      {\n        /* make up vertical ones */\n        ft_synthesize_vertical_metrics( metrics,\n                                        metrics->vertAdvance );\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidgload.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cidgload.h                                                             */\n/*                                                                         */\n/*    OpenType Glyph Loader (specification).                               */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2004 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CIDGLOAD_H__\n#define __CIDGLOAD_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"cidobjs.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#if 0\n\n  /* Compute the maximum advance width of a font through quick parsing */\n  FT_LOCAL( FT_Error )\n  cid_face_compute_max_advance( CID_Face  face,\n                                FT_Int*   max_advance );\n\n#endif /* 0 */\n\n  FT_LOCAL( FT_Error )\n  cid_slot_load_glyph( FT_GlyphSlot  glyph,         /* CID_Glyph_Slot */\n                       FT_Size       size,          /* CID_Size       */\n                       FT_UInt       glyph_index,\n                       FT_Int32      load_flags );\n\n\nFT_END_HEADER\n\n#endif /* __CIDGLOAD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidload.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cidload.c                                                              */\n/*                                                                         */\n/*    CID-keyed Type1 font loader (body).                                  */\n/*                                                                         */\n/*  Copyright 1996-2006, 2009, 2011-2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/config/ftconfig.h\"\n#include \"../../include/freetype/ftmm.h\"\n#include \"../../include/freetype/internal/t1types.h\"\n\n#include \"cidload.h\"\n\n#include \"ciderrs.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cidload\n\n\n  /* read a single offset */\n  FT_LOCAL_DEF( FT_Long )\n  cid_get_offset( FT_Byte*  *start,\n                  FT_Byte    offsize )\n  {\n    FT_ULong  result;\n    FT_Byte*  p = *start;\n\n\n    for ( result = 0; offsize > 0; offsize-- )\n    {\n      result <<= 8;\n      result  |= *p++;\n    }\n\n    *start = p;\n    return (FT_Long)result;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    TYPE 1 SYMBOL PARSING                      *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  static FT_Error\n  cid_load_keyword( CID_Face        face,\n                    CID_Loader*     loader,\n                    const T1_Field  keyword )\n  {\n    FT_Error      error;\n    CID_Parser*   parser = &loader->parser;\n    FT_Byte*      object;\n    void*         dummy_object;\n    CID_FaceInfo  cid = &face->cid;\n\n\n    /* if the keyword has a dedicated callback, call it */\n    if ( keyword->type == T1_FIELD_TYPE_CALLBACK )\n    {\n      keyword->reader( (FT_Face)face, parser );\n      error = parser->root.error;\n      goto Exit;\n    }\n\n    /* we must now compute the address of our target object */\n    switch ( keyword->location )\n    {\n    case T1_FIELD_LOCATION_CID_INFO:\n      object = (FT_Byte*)cid;\n      break;\n\n    case T1_FIELD_LOCATION_FONT_INFO:\n      object = (FT_Byte*)&cid->font_info;\n      break;\n\n    case T1_FIELD_LOCATION_FONT_EXTRA:\n      object = (FT_Byte*)&face->font_extra;\n      break;\n\n    case T1_FIELD_LOCATION_BBOX:\n      object = (FT_Byte*)&cid->font_bbox;\n      break;\n\n    default:\n      {\n        CID_FaceDict  dict;\n\n\n        if ( parser->num_dict < 0 || parser->num_dict >= cid->num_dicts )\n        {\n          FT_ERROR(( \"cid_load_keyword: invalid use of `%s'\\n\",\n                     keyword->ident ));\n          error = FT_THROW( Syntax_Error );\n          goto Exit;\n        }\n\n        dict = cid->font_dicts + parser->num_dict;\n        switch ( keyword->location )\n        {\n        case T1_FIELD_LOCATION_PRIVATE:\n          object = (FT_Byte*)&dict->private_dict;\n          break;\n\n        default:\n          object = (FT_Byte*)dict;\n        }\n      }\n    }\n\n    dummy_object = object;\n\n    /* now, load the keyword data in the object's field(s) */\n    if ( keyword->type == T1_FIELD_TYPE_INTEGER_ARRAY ||\n         keyword->type == T1_FIELD_TYPE_FIXED_ARRAY   )\n      error = cid_parser_load_field_table( &loader->parser, keyword,\n                                           &dummy_object );\n    else\n      error = cid_parser_load_field( &loader->parser,\n                                     keyword, &dummy_object );\n  Exit:\n    return error;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  cid_parse_font_matrix( CID_Face     face,\n                         CID_Parser*  parser )\n  {\n    FT_Matrix*    matrix;\n    FT_Vector*    offset;\n    CID_FaceDict  dict;\n    FT_Face       root = (FT_Face)&face->root;\n    FT_Fixed      temp[6];\n    FT_Fixed      temp_scale;\n\n\n    if ( parser->num_dict >= 0 && parser->num_dict < face->cid.num_dicts )\n    {\n      dict   = face->cid.font_dicts + parser->num_dict;\n      matrix = &dict->font_matrix;\n      offset = &dict->font_offset;\n\n      (void)cid_parser_to_fixed_array( parser, 6, temp, 3 );\n\n      temp_scale = FT_ABS( temp[3] );\n\n      /* Set Units per EM based on FontMatrix values.  We set the value to */\n      /* 1000 / temp_scale, because temp_scale was already multiplied by   */\n      /* 1000 (in t1_tofixed, from psobjs.c).                              */\n\n      root->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale );\n\n      /* we need to scale the values by 1.0/temp[3] */\n      if ( temp_scale != 0x10000L )\n      {\n        temp[0] = FT_DivFix( temp[0], temp_scale );\n        temp[1] = FT_DivFix( temp[1], temp_scale );\n        temp[2] = FT_DivFix( temp[2], temp_scale );\n        temp[4] = FT_DivFix( temp[4], temp_scale );\n        temp[5] = FT_DivFix( temp[5], temp_scale );\n        temp[3] = 0x10000L;\n      }\n\n      matrix->xx = temp[0];\n      matrix->yx = temp[1];\n      matrix->xy = temp[2];\n      matrix->yy = temp[3];\n\n      /* note that the font offsets are expressed in integer font units */\n      offset->x  = temp[4] >> 16;\n      offset->y  = temp[5] >> 16;\n    }\n\n    return FT_Err_Ok;      /* this is a callback function; */\n                            /* we must return an error code */\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  parse_fd_array( CID_Face     face,\n                  CID_Parser*  parser )\n  {\n    CID_FaceInfo  cid    = &face->cid;\n    FT_Memory     memory = face->root.memory;\n    FT_Error      error  = FT_Err_Ok;\n    FT_Long       num_dicts;\n\n\n    num_dicts = cid_parser_to_int( parser );\n\n    if ( !cid->font_dicts )\n    {\n      FT_Int  n;\n\n\n      if ( FT_NEW_ARRAY( cid->font_dicts, num_dicts ) )\n        goto Exit;\n\n      cid->num_dicts = (FT_UInt)num_dicts;\n\n      /* don't forget to set a few defaults */\n      for ( n = 0; n < cid->num_dicts; n++ )\n      {\n        CID_FaceDict  dict = cid->font_dicts + n;\n\n\n        /* default value for lenIV */\n        dict->private_dict.lenIV = 4;\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /* by mistake, `expansion_factor' appears both in PS_PrivateRec */\n  /* and CID_FaceDictRec (both are public header files and can't  */\n  /* changed); we simply copy the value                           */\n\n  FT_CALLBACK_DEF( FT_Error )\n  parse_expansion_factor( CID_Face     face,\n                          CID_Parser*  parser )\n  {\n    CID_FaceDict  dict;\n\n\n    if ( parser->num_dict >= 0 && parser->num_dict < face->cid.num_dicts )\n    {\n      dict = face->cid.font_dicts + parser->num_dict;\n\n      dict->expansion_factor              = cid_parser_to_fixed( parser, 0 );\n      dict->private_dict.expansion_factor = dict->expansion_factor;\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  static\n  const T1_FieldRec  cid_field_records[] =\n  {\n\n#include \"cidtoken.h\"\n\n    T1_FIELD_CALLBACK( \"FDArray\",         parse_fd_array, 0 )\n    T1_FIELD_CALLBACK( \"FontMatrix\",      cid_parse_font_matrix, 0 )\n    T1_FIELD_CALLBACK( \"ExpansionFactor\", parse_expansion_factor, 0 )\n\n    { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 }\n  };\n\n\n  static FT_Error\n  cid_parse_dict( CID_Face     face,\n                  CID_Loader*  loader,\n                  FT_Byte*     base,\n                  FT_Long      size )\n  {\n    CID_Parser*  parser = &loader->parser;\n\n\n    parser->root.cursor = base;\n    parser->root.limit  = base + size;\n    parser->root.error  = FT_Err_Ok;\n\n    {\n      FT_Byte*  cur   = base;\n      FT_Byte*  limit = cur + size;\n\n\n      for (;;)\n      {\n        FT_Byte*  newlimit;\n\n\n        parser->root.cursor = cur;\n        cid_parser_skip_spaces( parser );\n\n        if ( parser->root.cursor >= limit )\n          newlimit = limit - 1 - 17;\n        else\n          newlimit = parser->root.cursor - 17;\n\n        /* look for `%ADOBeginFontDict' */\n        for ( ; cur < newlimit; cur++ )\n        {\n          if ( *cur == '%'                                            &&\n               ft_strncmp( (char*)cur, \"%ADOBeginFontDict\", 17 ) == 0 )\n          {\n            /* if /FDArray was found, then cid->num_dicts is > 0, and */\n            /* we can start increasing parser->num_dict               */\n            if ( face->cid.num_dicts > 0 )\n              parser->num_dict++;\n          }\n        }\n\n        cur = parser->root.cursor;\n        /* no error can occur in cid_parser_skip_spaces */\n        if ( cur >= limit )\n          break;\n\n        cid_parser_skip_PS_token( parser );\n        if ( parser->root.cursor >= limit || parser->root.error )\n          break;\n\n        /* look for immediates */\n        if ( *cur == '/' && cur + 2 < limit )\n        {\n          FT_PtrDist  len;\n\n\n          cur++;\n          len = parser->root.cursor - cur;\n\n          if ( len > 0 && len < 22 )\n          {\n            /* now compare the immediate name to the keyword table */\n            T1_Field  keyword = (T1_Field)cid_field_records;\n\n\n            for (;;)\n            {\n              FT_Byte*  name;\n\n\n              name = (FT_Byte*)keyword->ident;\n              if ( !name )\n                break;\n\n              if ( cur[0] == name[0]                                 &&\n                   len == (FT_PtrDist)ft_strlen( (const char*)name ) )\n              {\n                FT_PtrDist  n;\n\n\n                for ( n = 1; n < len; n++ )\n                  if ( cur[n] != name[n] )\n                    break;\n\n                if ( n >= len )\n                {\n                  /* we found it - run the parsing callback */\n                  parser->root.error = cid_load_keyword( face,\n                                                         loader,\n                                                         keyword );\n                  if ( parser->root.error )\n                    return parser->root.error;\n                  break;\n                }\n              }\n              keyword++;\n            }\n          }\n        }\n\n        cur = parser->root.cursor;\n      }\n    }\n    return parser->root.error;\n  }\n\n\n  /* read the subrmap and the subrs of each font dict */\n  static FT_Error\n  cid_read_subrs( CID_Face  face )\n  {\n    CID_FaceInfo   cid    = &face->cid;\n    FT_Memory      memory = face->root.memory;\n    FT_Stream      stream = face->cid_stream;\n    FT_Error       error;\n    FT_Int         n;\n    CID_Subrs      subr;\n    FT_UInt        max_offsets = 0;\n    FT_ULong*      offsets = 0;\n    PSAux_Service  psaux = (PSAux_Service)face->psaux;\n\n\n    if ( FT_NEW_ARRAY( face->subrs, cid->num_dicts ) )\n      goto Exit;\n\n    subr = face->subrs;\n    for ( n = 0; n < cid->num_dicts; n++, subr++ )\n    {\n      CID_FaceDict  dict  = cid->font_dicts + n;\n      FT_Int        lenIV = dict->private_dict.lenIV;\n      FT_UInt       count, num_subrs = dict->num_subrs;\n      FT_ULong      data_len;\n      FT_Byte*      p;\n\n\n      /* Check for possible overflow. */\n      if ( num_subrs == FT_UINT_MAX )\n      {\n        error = FT_THROW( Syntax_Error );\n        goto Fail;\n      }\n\n      /* reallocate offsets array if needed */\n      if ( num_subrs + 1 > max_offsets )\n      {\n        FT_UInt  new_max = FT_PAD_CEIL( num_subrs + 1, 4 );\n\n\n        if ( new_max <= max_offsets )\n        {\n          error = FT_THROW( Syntax_Error );\n          goto Fail;\n        }\n\n        if ( FT_RENEW_ARRAY( offsets, max_offsets, new_max ) )\n          goto Fail;\n\n        max_offsets = new_max;\n      }\n\n      /* read the subrmap's offsets */\n      if ( FT_STREAM_SEEK( cid->data_offset + dict->subrmap_offset ) ||\n           FT_FRAME_ENTER( ( num_subrs + 1 ) * dict->sd_bytes )      )\n        goto Fail;\n\n      p = (FT_Byte*)stream->cursor;\n      for ( count = 0; count <= num_subrs; count++ )\n        offsets[count] = cid_get_offset( &p, (FT_Byte)dict->sd_bytes );\n\n      FT_FRAME_EXIT();\n\n      /* offsets must be ordered */\n      for ( count = 1; count <= num_subrs; count++ )\n        if ( offsets[count - 1] > offsets[count] )\n          goto Fail;\n\n      /* now, compute the size of subrs charstrings, */\n      /* allocate, and read them                     */\n      data_len = offsets[num_subrs] - offsets[0];\n\n      if ( FT_NEW_ARRAY( subr->code, num_subrs + 1 ) ||\n               FT_ALLOC( subr->code[0], data_len )   )\n        goto Fail;\n\n      if ( FT_STREAM_SEEK( cid->data_offset + offsets[0] ) ||\n           FT_STREAM_READ( subr->code[0], data_len )  )\n        goto Fail;\n\n      /* set up pointers */\n      for ( count = 1; count <= num_subrs; count++ )\n      {\n        FT_ULong  len;\n\n\n        len               = offsets[count] - offsets[count - 1];\n        subr->code[count] = subr->code[count - 1] + len;\n      }\n\n      /* decrypt subroutines, but only if lenIV >= 0 */\n      if ( lenIV >= 0 )\n      {\n        for ( count = 0; count < num_subrs; count++ )\n        {\n          FT_ULong  len;\n\n\n          len = offsets[count + 1] - offsets[count];\n          psaux->t1_decrypt( subr->code[count], len, 4330 );\n        }\n      }\n\n      subr->num_subrs = num_subrs;\n    }\n\n  Exit:\n    FT_FREE( offsets );\n    return error;\n\n  Fail:\n    if ( face->subrs )\n    {\n      for ( n = 0; n < cid->num_dicts; n++ )\n      {\n        if ( face->subrs[n].code )\n          FT_FREE( face->subrs[n].code[0] );\n\n        FT_FREE( face->subrs[n].code );\n      }\n      FT_FREE( face->subrs );\n    }\n    goto Exit;\n  }\n\n\n  static void\n  cid_init_loader( CID_Loader*  loader,\n                   CID_Face     face )\n  {\n    FT_UNUSED( face );\n\n    FT_MEM_ZERO( loader, sizeof ( *loader ) );\n  }\n\n\n  static  void\n  cid_done_loader( CID_Loader*  loader )\n  {\n    CID_Parser*  parser = &loader->parser;\n\n\n    /* finalize parser */\n    cid_parser_done( parser );\n  }\n\n\n  static FT_Error\n  cid_hex_to_binary( FT_Byte*  data,\n                     FT_Long   data_len,\n                     FT_ULong  offset,\n                     CID_Face  face )\n  {\n    FT_Stream  stream = face->root.stream;\n    FT_Error   error;\n\n    FT_Byte    buffer[256];\n    FT_Byte   *p, *plimit;\n    FT_Byte   *d, *dlimit;\n    FT_Byte    val;\n\n    FT_Bool    upper_nibble, done;\n\n\n    if ( FT_STREAM_SEEK( offset ) )\n      goto Exit;\n\n    d      = data;\n    dlimit = d + data_len;\n    p      = buffer;\n    plimit = p;\n\n    upper_nibble = 1;\n    done         = 0;\n\n    while ( d < dlimit )\n    {\n      if ( p >= plimit )\n      {\n        FT_ULong  oldpos = FT_STREAM_POS();\n        FT_ULong  size   = stream->size - oldpos;\n\n\n        if ( size == 0 )\n        {\n          error = FT_THROW( Syntax_Error );\n          goto Exit;\n        }\n\n        if ( FT_STREAM_READ( buffer, 256 > size ? size : 256 ) )\n          goto Exit;\n        p      = buffer;\n        plimit = p + FT_STREAM_POS() - oldpos;\n      }\n\n      if ( ft_isdigit( *p ) )\n        val = (FT_Byte)( *p - '0' );\n      else if ( *p >= 'a' && *p <= 'f' )\n        val = (FT_Byte)( *p - 'a' );\n      else if ( *p >= 'A' && *p <= 'F' )\n        val = (FT_Byte)( *p - 'A' + 10 );\n      else if ( *p == ' '  ||\n                *p == '\\t' ||\n                *p == '\\r' ||\n                *p == '\\n' ||\n                *p == '\\f' ||\n                *p == '\\0' )\n      {\n        p++;\n        continue;\n      }\n      else if ( *p == '>' )\n      {\n        val  = 0;\n        done = 1;\n      }\n      else\n      {\n        error = FT_THROW( Syntax_Error );\n        goto Exit;\n      }\n\n      if ( upper_nibble )\n        *d = (FT_Byte)( val << 4 );\n      else\n      {\n        *d = (FT_Byte)( *d + val );\n        d++;\n      }\n\n      upper_nibble = (FT_Byte)( 1 - upper_nibble );\n\n      if ( done )\n        break;\n\n      p++;\n    }\n\n    error = FT_Err_Ok;\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cid_face_open( CID_Face  face,\n                 FT_Int    face_index )\n  {\n    CID_Loader   loader;\n    CID_Parser*  parser;\n    FT_Memory    memory = face->root.memory;\n    FT_Error     error;\n\n\n    cid_init_loader( &loader, face );\n\n    parser = &loader.parser;\n    error = cid_parser_new( parser, face->root.stream, face->root.memory,\n                            (PSAux_Service)face->psaux );\n    if ( error )\n      goto Exit;\n\n    error = cid_parse_dict( face, &loader,\n                            parser->postscript,\n                            parser->postscript_len );\n    if ( error )\n      goto Exit;\n\n    if ( face_index < 0 )\n      goto Exit;\n\n    if ( FT_NEW( face->cid_stream ) )\n      goto Exit;\n\n    if ( parser->binary_length )\n    {\n      /* we must convert the data section from hexadecimal to binary */\n      if ( FT_ALLOC( face->binary_data, parser->binary_length )         ||\n           cid_hex_to_binary( face->binary_data, parser->binary_length,\n                              parser->data_offset, face )               )\n        goto Exit;\n\n      FT_Stream_OpenMemory( face->cid_stream,\n                            face->binary_data, parser->binary_length );\n      face->cid.data_offset = 0;\n    }\n    else\n    {\n      *face->cid_stream     = *face->root.stream;\n      face->cid.data_offset = loader.parser.data_offset;\n    }\n\n    error = cid_read_subrs( face );\n\n  Exit:\n    cid_done_loader( &loader );\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidload.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cidload.h                                                              */\n/*                                                                         */\n/*    CID-keyed Type1 font loader (specification).                         */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2004 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CIDLOAD_H__\n#define __CIDLOAD_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"cidparse.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  typedef struct  CID_Loader_\n  {\n    CID_Parser  parser;          /* parser used to read the stream */\n    FT_Int      num_chars;       /* number of characters in encoding */\n\n  } CID_Loader;\n\n\n  FT_LOCAL( FT_Long )\n  cid_get_offset( FT_Byte**  start,\n                  FT_Byte    offsize );\n\n  FT_LOCAL( FT_Error )\n  cid_face_open( CID_Face  face,\n                 FT_Int    face_index );\n\n\nFT_END_HEADER\n\n#endif /* __CIDLOAD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidobjs.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cidobjs.c                                                              */\n/*                                                                         */\n/*    CID objects manager (body).                                          */\n/*                                                                         */\n/*  Copyright 1996-2006, 2008, 2010-2011, 2013 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n\n#include \"cidgload.h\"\n#include \"cidload.h\"\n\n#include \"../../include/freetype/internal/services/svpscmap.h\"\n#include \"../../include/freetype/internal/psaux.h\"\n#include \"../../include/freetype/internal/pshints.h\"\n\n#include \"ciderrs.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cidobjs\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                            SLOT  FUNCTIONS                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n  FT_LOCAL_DEF( void )\n  cid_slot_done( FT_GlyphSlot  slot )\n  {\n    slot->internal->glyph_hints = 0;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cid_slot_init( FT_GlyphSlot  slot )\n  {\n    CID_Face          face;\n    PSHinter_Service  pshinter;\n\n\n    face     = (CID_Face)slot->face;\n    pshinter = (PSHinter_Service)face->pshinter;\n\n    if ( pshinter )\n    {\n      FT_Module  module;\n\n\n      module = FT_Get_Module( slot->face->driver->root.library,\n                              \"pshinter\" );\n      if ( module )\n      {\n        T1_Hints_Funcs  funcs;\n\n\n        funcs = pshinter->get_t1_funcs( module );\n        slot->internal->glyph_hints = (void*)funcs;\n      }\n    }\n\n    return 0;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                           SIZE  FUNCTIONS                             */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  static PSH_Globals_Funcs\n  cid_size_get_globals_funcs( CID_Size  size )\n  {\n    CID_Face          face     = (CID_Face)size->root.face;\n    PSHinter_Service  pshinter = (PSHinter_Service)face->pshinter;\n    FT_Module         module;\n\n\n    module = FT_Get_Module( size->root.face->driver->root.library,\n                            \"pshinter\" );\n    return ( module && pshinter && pshinter->get_globals_funcs )\n           ? pshinter->get_globals_funcs( module )\n           : 0;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cid_size_done( FT_Size  cidsize )         /* CID_Size */\n  {\n    CID_Size  size = (CID_Size)cidsize;\n\n\n    if ( cidsize->internal )\n    {\n      PSH_Globals_Funcs  funcs;\n\n\n      funcs = cid_size_get_globals_funcs( size );\n      if ( funcs )\n        funcs->destroy( (PSH_Globals)cidsize->internal );\n\n      cidsize->internal = 0;\n    }\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cid_size_init( FT_Size  cidsize )     /* CID_Size */\n  {\n    CID_Size           size  = (CID_Size)cidsize;\n    FT_Error           error = FT_Err_Ok;\n    PSH_Globals_Funcs  funcs = cid_size_get_globals_funcs( size );\n\n\n    if ( funcs )\n    {\n      PSH_Globals   globals;\n      CID_Face      face = (CID_Face)cidsize->face;\n      CID_FaceDict  dict = face->cid.font_dicts + face->root.face_index;\n      PS_Private    priv = &dict->private_dict;\n\n\n      error = funcs->create( cidsize->face->memory, priv, &globals );\n      if ( !error )\n        cidsize->internal = (FT_Size_Internal)(void*)globals;\n    }\n\n    return error;\n  }\n\n\n  FT_LOCAL( FT_Error )\n  cid_size_request( FT_Size          size,\n                    FT_Size_Request  req )\n  {\n    PSH_Globals_Funcs  funcs;\n\n\n    FT_Request_Metrics( size->face, req );\n\n    funcs = cid_size_get_globals_funcs( (CID_Size)size );\n\n    if ( funcs )\n      funcs->set_scale( (PSH_Globals)size->internal,\n                        size->metrics.x_scale,\n                        size->metrics.y_scale,\n                        0, 0 );\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                           FACE  FUNCTIONS                             */\n  /*                                                                       */\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    cid_face_done                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Finalizes a given face object.                                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A pointer to the face object to destroy.                   */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  cid_face_done( FT_Face  cidface )         /* CID_Face */\n  {\n    CID_Face      face = (CID_Face)cidface;\n    FT_Memory     memory;\n    CID_FaceInfo  cid;\n    PS_FontInfo   info;\n\n\n    if ( !face )\n      return;\n\n    cid    = &face->cid;\n    info   = &cid->font_info;\n    memory = cidface->memory;\n\n    /* release subrs */\n    if ( face->subrs )\n    {\n      FT_Int  n;\n\n\n      for ( n = 0; n < cid->num_dicts; n++ )\n      {\n        CID_Subrs  subr = face->subrs + n;\n\n\n        if ( subr->code )\n        {\n          FT_FREE( subr->code[0] );\n          FT_FREE( subr->code );\n        }\n      }\n\n      FT_FREE( face->subrs );\n    }\n\n    /* release FontInfo strings */\n    FT_FREE( info->version );\n    FT_FREE( info->notice );\n    FT_FREE( info->full_name );\n    FT_FREE( info->family_name );\n    FT_FREE( info->weight );\n\n    /* release font dictionaries */\n    FT_FREE( cid->font_dicts );\n    cid->num_dicts = 0;\n\n    /* release other strings */\n    FT_FREE( cid->cid_font_name );\n    FT_FREE( cid->registry );\n    FT_FREE( cid->ordering );\n\n    cidface->family_name = 0;\n    cidface->style_name  = 0;\n\n    FT_FREE( face->binary_data );\n    FT_FREE( face->cid_stream );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    cid_face_init                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initializes a given CID face object.                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream     :: The source font stream.                              */\n  /*                                                                       */\n  /*    face_index :: The index of the font face in the resource.          */\n  /*                                                                       */\n  /*    num_params :: Number of additional generic parameters.  Ignored.   */\n  /*                                                                       */\n  /*    params     :: Additional generic parameters.  Ignored.             */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face       :: The newly built face object.                         */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  cid_face_init( FT_Stream      stream,\n                 FT_Face        cidface,        /* CID_Face */\n                 FT_Int         face_index,\n                 FT_Int         num_params,\n                 FT_Parameter*  params )\n  {\n    CID_Face          face = (CID_Face)cidface;\n    FT_Error          error;\n    PSAux_Service     psaux;\n    PSHinter_Service  pshinter;\n\n    FT_UNUSED( num_params );\n    FT_UNUSED( params );\n    FT_UNUSED( stream );\n\n\n    cidface->num_faces = 1;\n\n    psaux = (PSAux_Service)face->psaux;\n    if ( !psaux )\n    {\n      psaux = (PSAux_Service)FT_Get_Module_Interface(\n                FT_FACE_LIBRARY( face ), \"psaux\" );\n\n      if ( !psaux )\n      {\n        FT_ERROR(( \"cid_face_init: cannot access `psaux' module\\n\" ));\n        error = FT_THROW( Missing_Module );\n        goto Exit;\n      }\n\n      face->psaux = psaux;\n    }\n\n    pshinter = (PSHinter_Service)face->pshinter;\n    if ( !pshinter )\n    {\n      pshinter = (PSHinter_Service)FT_Get_Module_Interface(\n                   FT_FACE_LIBRARY( face ), \"pshinter\" );\n\n      face->pshinter = pshinter;\n    }\n\n    FT_TRACE2(( \"CID driver\\n\" ));\n\n    /* open the tokenizer; this will also check the font format */\n    if ( FT_STREAM_SEEK( 0 ) )\n      goto Exit;\n\n    error = cid_face_open( face, face_index );\n    if ( error )\n      goto Exit;\n\n    /* if we just wanted to check the format, leave successfully now */\n    if ( face_index < 0 )\n      goto Exit;\n\n    /* check the face index */\n    /* XXX: handle CID fonts with more than a single face */\n    if ( face_index != 0 )\n    {\n      FT_ERROR(( \"cid_face_init: invalid face index\\n\" ));\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    /* now load the font program into the face object */\n\n    /* initialize the face object fields */\n\n    /* set up root face fields */\n    {\n      CID_FaceInfo  cid  = &face->cid;\n      PS_FontInfo   info = &cid->font_info;\n\n\n      cidface->num_glyphs   = cid->cid_count;\n      cidface->num_charmaps = 0;\n\n      cidface->face_index = face_index;\n      cidface->face_flags = FT_FACE_FLAG_SCALABLE   | /* scalable outlines */\n                            FT_FACE_FLAG_HORIZONTAL | /* horizontal data   */\n                            FT_FACE_FLAG_HINTER;      /* has native hinter */\n\n      if ( info->is_fixed_pitch )\n        cidface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;\n\n      /* XXX: TODO: add kerning with .afm support */\n\n      /* get style name -- be careful, some broken fonts only */\n      /* have a /FontName dictionary entry!                   */\n      cidface->family_name = info->family_name;\n      /* assume \"Regular\" style if we don't know better */\n      cidface->style_name = (char *)\"Regular\";\n      if ( cidface->family_name )\n      {\n        char*  full   = info->full_name;\n        char*  family = cidface->family_name;\n\n\n        if ( full )\n        {\n          while ( *full )\n          {\n            if ( *full == *family )\n            {\n              family++;\n              full++;\n            }\n            else\n            {\n              if ( *full == ' ' || *full == '-' )\n                full++;\n              else if ( *family == ' ' || *family == '-' )\n                family++;\n              else\n              {\n                if ( !*family )\n                  cidface->style_name = full;\n                break;\n              }\n            }\n          }\n        }\n      }\n      else\n      {\n        /* do we have a `/FontName'? */\n        if ( cid->cid_font_name )\n          cidface->family_name = cid->cid_font_name;\n      }\n\n      /* compute style flags */\n      cidface->style_flags = 0;\n      if ( info->italic_angle )\n        cidface->style_flags |= FT_STYLE_FLAG_ITALIC;\n      if ( info->weight )\n      {\n        if ( !ft_strcmp( info->weight, \"Bold\"  ) ||\n             !ft_strcmp( info->weight, \"Black\" ) )\n          cidface->style_flags |= FT_STYLE_FLAG_BOLD;\n      }\n\n      /* no embedded bitmap support */\n      cidface->num_fixed_sizes = 0;\n      cidface->available_sizes = 0;\n\n      cidface->bbox.xMin =   cid->font_bbox.xMin            >> 16;\n      cidface->bbox.yMin =   cid->font_bbox.yMin            >> 16;\n      /* no `U' suffix here to 0xFFFF! */\n      cidface->bbox.xMax = ( cid->font_bbox.xMax + 0xFFFF ) >> 16;\n      cidface->bbox.yMax = ( cid->font_bbox.yMax + 0xFFFF ) >> 16;\n\n      if ( !cidface->units_per_EM )\n        cidface->units_per_EM = 1000;\n\n      cidface->ascender  = (FT_Short)( cidface->bbox.yMax );\n      cidface->descender = (FT_Short)( cidface->bbox.yMin );\n\n      cidface->height = (FT_Short)( ( cidface->units_per_EM * 12 ) / 10 );\n      if ( cidface->height < cidface->ascender - cidface->descender )\n        cidface->height = (FT_Short)( cidface->ascender - cidface->descender );\n\n      cidface->underline_position  = (FT_Short)info->underline_position;\n      cidface->underline_thickness = (FT_Short)info->underline_thickness;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    cid_driver_init                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initializes a given CID driver object.                             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    driver :: A handle to the target driver object.                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  cid_driver_init( FT_Module  driver )\n  {\n    FT_UNUSED( driver );\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    cid_driver_done                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Finalizes a given CID driver.                                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    driver :: A handle to the target CID driver.                       */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  cid_driver_done( FT_Module  driver )\n  {\n    FT_UNUSED( driver );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidobjs.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cidobjs.h                                                              */\n/*                                                                         */\n/*    CID objects manager (specification).                                 */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2004, 2006 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CIDOBJS_H__\n#define __CIDOBJS_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/config/ftconfig.h\"\n#include \"../../include/freetype/internal/t1types.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /* The following structures must be defined by the hinter */\n  typedef struct CID_Size_Hints_   CID_Size_Hints;\n  typedef struct CID_Glyph_Hints_  CID_Glyph_Hints;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    CID_Driver                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a Type 1 driver object.                                */\n  /*                                                                       */\n  typedef struct CID_DriverRec_*  CID_Driver;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    CID_Size                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a Type 1 size object.                                  */\n  /*                                                                       */\n  typedef struct CID_SizeRec_*  CID_Size;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    CID_GlyphSlot                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a Type 1 glyph slot object.                            */\n  /*                                                                       */\n  typedef struct CID_GlyphSlotRec_*  CID_GlyphSlot;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    CID_CharMap                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a Type 1 character mapping object.                     */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The Type 1 format doesn't use a charmap but an encoding table.     */\n  /*    The driver is responsible for making up charmap objects            */\n  /*    corresponding to these tables.                                     */\n  /*                                                                       */\n  typedef struct CID_CharMapRec_*  CID_CharMap;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* HERE BEGINS THE TYPE 1 SPECIFIC STUFF                                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  typedef struct  CID_SizeRec_\n  {\n    FT_SizeRec  root;\n    FT_Bool     valid;\n\n  } CID_SizeRec;\n\n\n  typedef struct  CID_GlyphSlotRec_\n  {\n    FT_GlyphSlotRec  root;\n\n    FT_Bool          hint;\n    FT_Bool          scaled;\n\n    FT_Fixed         x_scale;\n    FT_Fixed         y_scale;\n\n  } CID_GlyphSlotRec;\n\n\n  FT_LOCAL( void )\n  cid_slot_done( FT_GlyphSlot  slot );\n\n  FT_LOCAL( FT_Error )\n  cid_slot_init( FT_GlyphSlot  slot );\n\n\n  FT_LOCAL( void )\n  cid_size_done( FT_Size  size );       /* CID_Size */\n\n  FT_LOCAL( FT_Error )\n  cid_size_init( FT_Size  size );       /* CID_Size */\n\n  FT_LOCAL( FT_Error )\n  cid_size_request( FT_Size          size,      /* CID_Size */\n                    FT_Size_Request  req );\n\n  FT_LOCAL( FT_Error )\n  cid_face_init( FT_Stream      stream,\n                 FT_Face        face,           /* CID_Face */\n                 FT_Int         face_index,\n                 FT_Int         num_params,\n                 FT_Parameter*  params );\n\n  FT_LOCAL( void )\n  cid_face_done( FT_Face  face );               /* CID_Face */\n\n\n  FT_LOCAL( FT_Error )\n  cid_driver_init( FT_Module  driver );\n\n  FT_LOCAL( void )\n  cid_driver_done( FT_Module  driver );\n\n\nFT_END_HEADER\n\n#endif /* __CIDOBJS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidparse.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cidparse.c                                                             */\n/*                                                                         */\n/*    CID-keyed Type1 parser (body).                                       */\n/*                                                                         */\n/*  Copyright 1996-2007, 2009, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n\n#include \"cidparse.h\"\n\n#include \"ciderrs.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cidparse\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    INPUT STREAM PARSER                        *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cid_parser_new( CID_Parser*    parser,\n                  FT_Stream      stream,\n                  FT_Memory      memory,\n                  PSAux_Service  psaux )\n  {\n    FT_Error  error;\n    FT_ULong  base_offset, offset, ps_len;\n    FT_Byte   *cur, *limit;\n    FT_Byte   *arg1, *arg2;\n\n\n    FT_MEM_ZERO( parser, sizeof ( *parser ) );\n    psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory );\n\n    parser->stream = stream;\n\n    base_offset = FT_STREAM_POS();\n\n    /* first of all, check the font format in the header */\n    if ( FT_FRAME_ENTER( 31 ) )\n      goto Exit;\n\n    if ( ft_strncmp( (char *)stream->cursor,\n                     \"%!PS-Adobe-3.0 Resource-CIDFont\", 31 ) )\n    {\n      FT_TRACE2(( \"  not a CID-keyed font\\n\" ));\n      error = FT_THROW( Unknown_File_Format );\n    }\n\n    FT_FRAME_EXIT();\n    if ( error )\n      goto Exit;\n\n  Again:\n    /* now, read the rest of the file until we find */\n    /* `StartData' or `/sfnts'                      */\n    {\n      FT_Byte   buffer[256 + 10];\n      FT_Long   read_len = 256 + 10; /* same as signed FT_Stream->size */\n      FT_Byte*  p        = buffer;\n\n\n      for ( offset = FT_STREAM_POS(); ; offset += 256 )\n      {\n        FT_Long  stream_len; /* same as signed FT_Stream->size */\n\n\n        stream_len = stream->size - FT_STREAM_POS();\n        if ( stream_len == 0 )\n        {\n          FT_TRACE2(( \"cid_parser_new: no `StartData' keyword found\\n\" ));\n          error = FT_THROW( Invalid_File_Format );\n          goto Exit;\n        }\n\n        read_len = FT_MIN( read_len, stream_len );\n        if ( FT_STREAM_READ( p, read_len ) )\n          goto Exit;\n\n        if ( read_len < 256 )\n          p[read_len]  = '\\0';\n\n        limit = p + read_len - 10;\n\n        for ( p = buffer; p < limit; p++ )\n        {\n          if ( p[0] == 'S' && ft_strncmp( (char*)p, \"StartData\", 9 ) == 0 )\n          {\n            /* save offset of binary data after `StartData' */\n            offset += (FT_ULong)( p - buffer + 10 );\n            goto Found;\n          }\n          else if ( p[1] == 's' && ft_strncmp( (char*)p, \"/sfnts\", 6 ) == 0 )\n          {\n            offset += (FT_ULong)( p - buffer + 7 );\n            goto Found;\n          }\n        }\n\n        FT_MEM_MOVE( buffer, p, 10 );\n        read_len = 256;\n        p = buffer + 10;\n      }\n    }\n\n  Found:\n    /* We have found the start of the binary data or the `/sfnts' token. */\n    /* Now rewind and extract the frame corresponding to this PostScript */\n    /* section.                                                          */\n\n    ps_len = offset - base_offset;\n    if ( FT_STREAM_SEEK( base_offset )                  ||\n         FT_FRAME_EXTRACT( ps_len, parser->postscript ) )\n      goto Exit;\n\n    parser->data_offset    = offset;\n    parser->postscript_len = ps_len;\n    parser->root.base      = parser->postscript;\n    parser->root.cursor    = parser->postscript;\n    parser->root.limit     = parser->root.cursor + ps_len;\n    parser->num_dict       = -1;\n\n    /* Finally, we check whether `StartData' or `/sfnts' was real --  */\n    /* it could be in a comment or string.  We also get the arguments */\n    /* of `StartData' to find out whether the data is represented in  */\n    /* binary or hex format.                                          */\n\n    arg1 = parser->root.cursor;\n    cid_parser_skip_PS_token( parser );\n    cid_parser_skip_spaces  ( parser );\n    arg2 = parser->root.cursor;\n    cid_parser_skip_PS_token( parser );\n    cid_parser_skip_spaces  ( parser );\n\n    limit = parser->root.limit;\n    cur   = parser->root.cursor;\n\n    while ( cur < limit )\n    {\n      if ( parser->root.error )\n      {\n        error = parser->root.error;\n        goto Exit;\n      }\n\n      if ( cur[0] == 'S' && ft_strncmp( (char*)cur, \"StartData\", 9 ) == 0 )\n      {\n        if ( ft_strncmp( (char*)arg1, \"(Hex)\", 5 ) == 0 )\n          parser->binary_length = ft_atol( (const char *)arg2 );\n\n        limit = parser->root.limit;\n        cur   = parser->root.cursor;\n        goto Exit;\n      }\n      else if ( cur[1] == 's' && ft_strncmp( (char*)cur, \"/sfnts\", 6 ) == 0 )\n      {\n        FT_TRACE2(( \"cid_parser_new: cannot handle Type 11 fonts\\n\" ));\n        error = FT_THROW( Unknown_File_Format );\n        goto Exit;\n      }\n\n      cid_parser_skip_PS_token( parser );\n      cid_parser_skip_spaces  ( parser );\n      arg1 = arg2;\n      arg2 = cur;\n      cur  = parser->root.cursor;\n    }\n\n    /* we haven't found the correct `StartData'; go back and continue */\n    /* searching                                                      */\n    FT_FRAME_RELEASE( parser->postscript );\n    if ( !FT_STREAM_SEEK( offset ) )\n      goto Again;\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cid_parser_done( CID_Parser*  parser )\n  {\n    /* always free the private dictionary */\n    if ( parser->postscript )\n    {\n      FT_Stream  stream = parser->stream;\n\n\n      FT_FRAME_RELEASE( parser->postscript );\n    }\n    parser->root.funcs.done( &parser->root );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidparse.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cidparse.h                                                             */\n/*                                                                         */\n/*    CID-keyed Type1 parser (specification).                              */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2004 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CIDPARSE_H__\n#define __CIDPARSE_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/t1types.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/internal/psaux.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    CID_Parser                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A CID_Parser is an object used to parse a Type 1 fonts very        */\n  /*    quickly.                                                           */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    root           :: The root PS_ParserRec fields.                    */\n  /*                                                                       */\n  /*    stream         :: The current input stream.                        */\n  /*                                                                       */\n  /*    postscript     :: A pointer to the data to be parsed.              */\n  /*                                                                       */\n  /*    postscript_len :: The length of the data to be parsed.             */\n  /*                                                                       */\n  /*    data_offset    :: The start position of the binary data (i.e., the */\n  /*                      end of the data to be parsed.                    */\n  /*                                                                       */\n  /*    binary_length  :: The length of the data after the `StartData'     */\n  /*                      command if the data format is hexadecimal.       */\n  /*                                                                       */\n  /*    cid            :: A structure which holds the information about    */\n  /*                      the current font.                                */\n  /*                                                                       */\n  /*    num_dict       :: The number of font dictionaries.                 */\n  /*                                                                       */\n  typedef struct  CID_Parser_\n  {\n    PS_ParserRec  root;\n    FT_Stream     stream;\n\n    FT_Byte*      postscript;\n    FT_Long       postscript_len;\n\n    FT_ULong      data_offset;\n\n    FT_Long       binary_length;\n\n    CID_FaceInfo  cid;\n    FT_Int        num_dict;\n\n  } CID_Parser;\n\n\n  FT_LOCAL( FT_Error )\n  cid_parser_new( CID_Parser*    parser,\n                  FT_Stream      stream,\n                  FT_Memory      memory,\n                  PSAux_Service  psaux );\n\n  FT_LOCAL( void )\n  cid_parser_done( CID_Parser*  parser );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                            PARSING ROUTINES                           */\n  /*                                                                       */\n  /*************************************************************************/\n\n#define cid_parser_skip_spaces( p ) \\\n          (p)->root.funcs.skip_spaces( &(p)->root )\n#define cid_parser_skip_PS_token( p ) \\\n          (p)->root.funcs.skip_PS_token( &(p)->root )\n\n#define cid_parser_to_int( p )        (p)->root.funcs.to_int( &(p)->root )\n#define cid_parser_to_fixed( p, t )   (p)->root.funcs.to_fixed( &(p)->root, t )\n\n#define cid_parser_to_coord_array( p, m, c )                          \\\n          (p)->root.funcs.to_coord_array( &(p)->root, m, c )\n#define cid_parser_to_fixed_array( p, m, f, t )                          \\\n          (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t )\n#define cid_parser_to_token( p, t )                         \\\n          (p)->root.funcs.to_token( &(p)->root, t )\n#define cid_parser_to_token_array( p, t, m, c )                          \\\n          (p)->root.funcs.to_token_array( &(p)->root, t, m, c )\n\n#define cid_parser_load_field( p, f, o )                              \\\n          (p)->root.funcs.load_field( &(p)->root, f, o, 0, 0 )\n#define cid_parser_load_field_table( p, f, o )                              \\\n          (p)->root.funcs.load_field_table( &(p)->root, f, o, 0, 0 )\n\n\nFT_END_HEADER\n\n#endif /* __CIDPARSE_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidriver.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cidriver.c                                                             */\n/*                                                                         */\n/*    CID driver interface (body).                                         */\n/*                                                                         */\n/*  Copyright 1996-2004, 2006, 2008, 2009, 2011, 2013 by                   */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"cidriver.h\"\n#include \"cidgload.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n\n#include \"ciderrs.h\"\n\n#include \"../../include/freetype/internal/services/svpostnm.h\"\n#include \"../../include/freetype/internal/services/svxf86nm.h\"\n#include \"../../include/freetype/internal/services/svpsinfo.h\"\n#include \"../../include/freetype/internal/services/svcid.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ciddriver\n\n\n  /*\n   *  POSTSCRIPT NAME SERVICE\n   *\n   */\n\n  static const char*\n  cid_get_postscript_name( CID_Face  face )\n  {\n    const char*  result = face->cid.cid_font_name;\n\n\n    if ( result && result[0] == '/' )\n      result++;\n\n    return result;\n  }\n\n\n  static const FT_Service_PsFontNameRec  cid_service_ps_name =\n  {\n    (FT_PsName_GetFunc) cid_get_postscript_name\n  };\n\n\n  /*\n   *  POSTSCRIPT INFO SERVICE\n   *\n   */\n\n  static FT_Error\n  cid_ps_get_font_info( FT_Face          face,\n                        PS_FontInfoRec*  afont_info )\n  {\n    *afont_info = ((CID_Face)face)->cid.font_info;\n\n    return FT_Err_Ok;\n  }\n\n  static FT_Error\n  cid_ps_get_font_extra( FT_Face          face,\n                        PS_FontExtraRec*  afont_extra )\n  {\n    *afont_extra = ((CID_Face)face)->font_extra;\n\n    return FT_Err_Ok;\n  }\n\n  static const FT_Service_PsInfoRec  cid_service_ps_info =\n  {\n    (PS_GetFontInfoFunc)   cid_ps_get_font_info,\n    (PS_GetFontExtraFunc)  cid_ps_get_font_extra,\n    (PS_HasGlyphNamesFunc) NULL,        /* unsupported with CID fonts */\n    (PS_GetFontPrivateFunc)NULL,        /* unsupported                */\n    (PS_GetFontValueFunc)  NULL         /* not implemented            */\n  };\n\n\n  /*\n   *  CID INFO SERVICE\n   *\n   */\n  static FT_Error\n  cid_get_ros( CID_Face      face,\n               const char*  *registry,\n               const char*  *ordering,\n               FT_Int       *supplement )\n  {\n    CID_FaceInfo  cid = &face->cid;\n\n\n    if ( registry )\n      *registry = cid->registry;\n\n    if ( ordering )\n      *ordering = cid->ordering;\n\n    if ( supplement )\n      *supplement = cid->supplement;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_Error\n  cid_get_is_cid( CID_Face  face,\n                  FT_Bool  *is_cid )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_UNUSED( face );\n\n\n    if ( is_cid )\n      *is_cid = 1; /* cid driver is only used for CID keyed fonts */\n\n    return error;\n  }\n\n\n  static FT_Error\n  cid_get_cid_from_glyph_index( CID_Face  face,\n                                FT_UInt   glyph_index,\n                                FT_UInt  *cid )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_UNUSED( face );\n\n\n    if ( cid )\n      *cid = glyph_index; /* identity mapping */\n\n    return error;\n  }\n\n\n  static const FT_Service_CIDRec  cid_service_cid_info =\n  {\n     (FT_CID_GetRegistryOrderingSupplementFunc)cid_get_ros,\n     (FT_CID_GetIsInternallyCIDKeyedFunc)      cid_get_is_cid,\n     (FT_CID_GetCIDFromGlyphIndexFunc)         cid_get_cid_from_glyph_index\n  };\n\n\n  /*\n   *  SERVICE LIST\n   *\n   */\n\n  static const FT_ServiceDescRec  cid_services[] =\n  {\n    { FT_SERVICE_ID_XF86_NAME,            FT_XF86_FORMAT_CID },\n    { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &cid_service_ps_name },\n    { FT_SERVICE_ID_POSTSCRIPT_INFO,      &cid_service_ps_info },\n    { FT_SERVICE_ID_CID,                  &cid_service_cid_info },\n    { NULL, NULL }\n  };\n\n\n  FT_CALLBACK_DEF( FT_Module_Interface )\n  cid_get_interface( FT_Module    module,\n                     const char*  cid_interface )\n  {\n    FT_UNUSED( module );\n\n    return ft_service_list_lookup( cid_services, cid_interface );\n  }\n\n\n\n  FT_CALLBACK_TABLE_DEF\n  const FT_Driver_ClassRec  t1cid_driver_class =\n  {\n    /* first of all, the FT_Module_Class fields */\n    {\n      FT_MODULE_FONT_DRIVER       |\n      FT_MODULE_DRIVER_SCALABLE   |\n      FT_MODULE_DRIVER_HAS_HINTER,\n\n      sizeof ( FT_DriverRec ),\n      \"t1cid\",   /* module name           */\n      0x10000L,  /* version 1.0 of driver */\n      0x20000L,  /* requires FreeType 2.0 */\n\n      0,\n\n      cid_driver_init,\n      cid_driver_done,\n      cid_get_interface\n    },\n\n    /* then the other font drivers fields */\n    sizeof ( CID_FaceRec ),\n    sizeof ( CID_SizeRec ),\n    sizeof ( CID_GlyphSlotRec ),\n\n    cid_face_init,\n    cid_face_done,\n\n    cid_size_init,\n    cid_size_done,\n    cid_slot_init,\n    cid_slot_done,\n\n    cid_slot_load_glyph,\n\n    0,                      /* FT_Face_GetKerningFunc  */\n    0,                      /* FT_Face_AttachFunc      */\n\n    0,                      /* FT_Face_GetAdvancesFunc */\n\n    cid_size_request,\n    0                       /* FT_Size_SelectFunc      */\n  };\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidriver.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cidriver.h                                                             */\n/*                                                                         */\n/*    High-level CID driver interface (specification).                     */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CIDRIVER_H__\n#define __CIDRIVER_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdriver.h\"\n\n\nFT_BEGIN_HEADER\n\n#ifdef FT_CONFIG_OPTION_PIC\n#error \"this module does not support PIC yet\"\n#endif\n\n\n  FT_CALLBACK_TABLE\n  const FT_Driver_ClassRec  t1cid_driver_class;\n\n\nFT_END_HEADER\n\n#endif /* __CIDRIVER_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidtoken.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cidtoken.h                                                             */\n/*                                                                         */\n/*    CID token definitions (specification only).                          */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2006, 2008, 2009 by                   */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  CID_FaceInfoRec\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_CID_INFO\n\n  T1_FIELD_KEY   ( \"CIDFontName\",    cid_font_name, 0 )\n  T1_FIELD_FIXED ( \"CIDFontVersion\", cid_version,   0 )\n  T1_FIELD_NUM   ( \"CIDFontType\",    cid_font_type, 0 )\n  T1_FIELD_STRING( \"Registry\",       registry,      0 )\n  T1_FIELD_STRING( \"Ordering\",       ordering,      0 )\n  T1_FIELD_NUM   ( \"Supplement\",     supplement,    0 )\n  T1_FIELD_NUM   ( \"UIDBase\",        uid_base,      0 )\n  T1_FIELD_NUM   ( \"CIDMapOffset\",   cidmap_offset, 0 )\n  T1_FIELD_NUM   ( \"FDBytes\",        fd_bytes,      0 )\n  T1_FIELD_NUM   ( \"GDBytes\",        gd_bytes,      0 )\n  T1_FIELD_NUM   ( \"CIDCount\",       cid_count,     0 )\n\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  PS_FontInfoRec\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_FONT_INFO\n\n  T1_FIELD_STRING( \"version\",            version,             0 )\n  T1_FIELD_STRING( \"Notice\",             notice,              0 )\n  T1_FIELD_STRING( \"FullName\",           full_name,           0 )\n  T1_FIELD_STRING( \"FamilyName\",         family_name,         0 )\n  T1_FIELD_STRING( \"Weight\",             weight,              0 )\n  T1_FIELD_NUM   ( \"ItalicAngle\",        italic_angle,        0 )\n  T1_FIELD_BOOL  ( \"isFixedPitch\",       is_fixed_pitch,      0 )\n  T1_FIELD_NUM   ( \"UnderlinePosition\",  underline_position,  0 )\n  T1_FIELD_NUM   ( \"UnderlineThickness\", underline_thickness, 0 )\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  PS_FontExtraRec\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_FONT_EXTRA\n\n  T1_FIELD_NUM   ( \"FSType\",             fs_type,             0 )\n\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  CID_FaceDictRec\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_FONT_DICT\n\n  T1_FIELD_NUM  ( \"PaintType\",          paint_type,          0 )\n  T1_FIELD_NUM  ( \"FontType\",           font_type,           0 )\n  T1_FIELD_NUM  ( \"SubrMapOffset\",      subrmap_offset,      0 )\n  T1_FIELD_NUM  ( \"SDBytes\",            sd_bytes,            0 )\n  T1_FIELD_NUM  ( \"SubrCount\",          num_subrs,           0 )\n  T1_FIELD_NUM  ( \"lenBuildCharArray\",  len_buildchar,       0 )\n  T1_FIELD_FIXED( \"ForceBoldThreshold\", forcebold_threshold, 0 )\n  T1_FIELD_FIXED( \"StrokeWidth\",        stroke_width,        0 )\n\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  PS_PrivateRec\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_PRIVATE\n\n  T1_FIELD_NUM       ( \"UniqueID\",         unique_id,      0 )\n  T1_FIELD_NUM       ( \"lenIV\",            lenIV,          0 )\n  T1_FIELD_NUM       ( \"LanguageGroup\",    language_group, 0 )\n  T1_FIELD_NUM       ( \"password\",         password,       0 )\n\n  T1_FIELD_FIXED_1000( \"BlueScale\",        blue_scale,     0 )\n  T1_FIELD_NUM       ( \"BlueShift\",        blue_shift,     0 )\n  T1_FIELD_NUM       ( \"BlueFuzz\",         blue_fuzz,      0 )\n\n  T1_FIELD_NUM_TABLE ( \"BlueValues\",       blue_values,        14, 0 )\n  T1_FIELD_NUM_TABLE ( \"OtherBlues\",       other_blues,        10, 0 )\n  T1_FIELD_NUM_TABLE ( \"FamilyBlues\",      family_blues,       14, 0 )\n  T1_FIELD_NUM_TABLE ( \"FamilyOtherBlues\", family_other_blues, 10, 0 )\n\n  T1_FIELD_NUM_TABLE2( \"StdHW\",            standard_width,      1, 0 )\n  T1_FIELD_NUM_TABLE2( \"StdVW\",            standard_height,     1, 0 )\n  T1_FIELD_NUM_TABLE2( \"MinFeature\",       min_feature,         2, 0 )\n\n  T1_FIELD_NUM_TABLE ( \"StemSnapH\",        snap_widths,        12, 0 )\n  T1_FIELD_NUM_TABLE ( \"StemSnapV\",        snap_heights,       12, 0 )\n\n  T1_FIELD_BOOL      ( \"ForceBold\",        force_bold,          0 )\n\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  FT_BBox\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_BBOX\n\n  T1_FIELD_BBOX( \"FontBBox\", xMin, 0 )\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/cid/fxft_type1cid.c",
    "content": "#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501\n/***************************************************************************/\n/*                                                                         */\n/*  type1cid.c                                                             */\n/*                                                                         */\n/*    FreeType OpenType driver component (body only).                      */\n/*                                                                         */\n/*  Copyright 1996-2001 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n#define FT2_BUILD_LIBRARY\n\n#include \"../../include/ft2build.h\"\n#include \"cidparse.c\"\n#include \"cidload.c\"\n#include \"cidobjs.c\"\n#include \"cidriver.c\"\n#include \"cidgload.c\"\n\n\n/* END */\n#endif\n\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/Jamfile",
    "content": "# FreeType 2 src/psaux Jamfile\n#\n# Copyright 2001, 2002 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) psaux ;\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = psauxmod psobjs   t1decode t1cmap\n               psconv   afmparse\n               ;\n  }\n  else\n  {\n    _sources = psaux ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/psaux Jamfile\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/afmparse.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  afmparse.c                                                             */\n/*                                                                         */\n/*    AFM parser (body).                                                   */\n/*                                                                         */\n/*  Copyright 2006-2010, 2012, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/freetype.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/psaux.h\"\n\n#include \"afmparse.h\"\n#include \"psconv.h\"\n\n#include \"psauxerr.h\"\n\n\n/***************************************************************************/\n/*                                                                         */\n/*    AFM_Stream                                                           */\n/*                                                                         */\n/* The use of AFM_Stream is largely inspired by parseAFM.[ch] from t1lib.  */\n/*                                                                         */\n/*                                                                         */\n\n  enum\n  {\n    AFM_STREAM_STATUS_NORMAL,\n    AFM_STREAM_STATUS_EOC,\n    AFM_STREAM_STATUS_EOL,\n    AFM_STREAM_STATUS_EOF\n  };\n\n\n  typedef struct  AFM_StreamRec_\n  {\n    FT_Byte*  cursor;\n    FT_Byte*  base;\n    FT_Byte*  limit;\n\n    FT_Int    status;\n\n  } AFM_StreamRec;\n\n\n#ifndef EOF\n#define EOF -1\n#endif\n\n\n  /* this works because empty lines are ignored */\n#define AFM_IS_NEWLINE( ch )  ( (ch) == '\\r' || (ch) == '\\n' )\n\n#define AFM_IS_EOF( ch )      ( (ch) == EOF  || (ch) == '\\x1a' )\n#define AFM_IS_SPACE( ch )    ( (ch) == ' '  || (ch) == '\\t' )\n\n  /* column separator; there is no `column' in the spec actually */\n#define AFM_IS_SEP( ch )      ( (ch) == ';' )\n\n#define AFM_GETC()                                                       \\\n          ( ( (stream)->cursor < (stream)->limit ) ? *(stream)->cursor++ \\\n                                                   : EOF )\n\n#define AFM_STREAM_KEY_BEGIN( stream )    \\\n          (char*)( (stream)->cursor - 1 )\n\n#define AFM_STREAM_KEY_LEN( stream, key )       \\\n          ( (char*)(stream)->cursor - key - 1 )\n\n#define AFM_STATUS_EOC( stream ) \\\n          ( (stream)->status >= AFM_STREAM_STATUS_EOC )\n\n#define AFM_STATUS_EOL( stream ) \\\n          ( (stream)->status >= AFM_STREAM_STATUS_EOL )\n\n#define AFM_STATUS_EOF( stream ) \\\n          ( (stream)->status >= AFM_STREAM_STATUS_EOF )\n\n\n  static int\n  afm_stream_skip_spaces( AFM_Stream  stream )\n  {\n    int  ch = 0;  /* make stupid compiler happy */\n\n\n    if ( AFM_STATUS_EOC( stream ) )\n      return ';';\n\n    while ( 1 )\n    {\n      ch = AFM_GETC();\n      if ( !AFM_IS_SPACE( ch ) )\n        break;\n    }\n\n    if ( AFM_IS_NEWLINE( ch ) )\n      stream->status = AFM_STREAM_STATUS_EOL;\n    else if ( AFM_IS_SEP( ch ) )\n      stream->status = AFM_STREAM_STATUS_EOC;\n    else if ( AFM_IS_EOF( ch ) )\n      stream->status = AFM_STREAM_STATUS_EOF;\n\n    return ch;\n  }\n\n\n  /* read a key or value in current column */\n  static char*\n  afm_stream_read_one( AFM_Stream  stream )\n  {\n    char*  str;\n\n\n    afm_stream_skip_spaces( stream );\n    if ( AFM_STATUS_EOC( stream ) )\n      return NULL;\n\n    str = AFM_STREAM_KEY_BEGIN( stream );\n\n    while ( 1 )\n    {\n      int  ch = AFM_GETC();\n\n\n      if ( AFM_IS_SPACE( ch ) )\n        break;\n      else if ( AFM_IS_NEWLINE( ch ) )\n      {\n        stream->status = AFM_STREAM_STATUS_EOL;\n        break;\n      }\n      else if ( AFM_IS_SEP( ch ) )\n      {\n        stream->status = AFM_STREAM_STATUS_EOC;\n        break;\n      }\n      else if ( AFM_IS_EOF( ch ) )\n      {\n        stream->status = AFM_STREAM_STATUS_EOF;\n        break;\n      }\n    }\n\n    return str;\n  }\n\n\n  /* read a string (i.e., read to EOL) */\n  static char*\n  afm_stream_read_string( AFM_Stream  stream )\n  {\n    char*  str;\n\n\n    afm_stream_skip_spaces( stream );\n    if ( AFM_STATUS_EOL( stream ) )\n      return NULL;\n\n    str = AFM_STREAM_KEY_BEGIN( stream );\n\n    /* scan to eol */\n    while ( 1 )\n    {\n      int  ch = AFM_GETC();\n\n\n      if ( AFM_IS_NEWLINE( ch ) )\n      {\n        stream->status = AFM_STREAM_STATUS_EOL;\n        break;\n      }\n      else if ( AFM_IS_EOF( ch ) )\n      {\n        stream->status = AFM_STREAM_STATUS_EOF;\n        break;\n      }\n    }\n\n    return str;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*    AFM_Parser                                                         */\n  /*                                                                       */\n  /*                                                                       */\n\n  /* all keys defined in Ch. 7-10 of 5004.AFM_Spec.pdf */\n  typedef enum  AFM_Token_\n  {\n    AFM_TOKEN_ASCENDER,\n    AFM_TOKEN_AXISLABEL,\n    AFM_TOKEN_AXISTYPE,\n    AFM_TOKEN_B,\n    AFM_TOKEN_BLENDAXISTYPES,\n    AFM_TOKEN_BLENDDESIGNMAP,\n    AFM_TOKEN_BLENDDESIGNPOSITIONS,\n    AFM_TOKEN_C,\n    AFM_TOKEN_CC,\n    AFM_TOKEN_CH,\n    AFM_TOKEN_CAPHEIGHT,\n    AFM_TOKEN_CHARWIDTH,\n    AFM_TOKEN_CHARACTERSET,\n    AFM_TOKEN_CHARACTERS,\n    AFM_TOKEN_DESCENDER,\n    AFM_TOKEN_ENCODINGSCHEME,\n    AFM_TOKEN_ENDAXIS,\n    AFM_TOKEN_ENDCHARMETRICS,\n    AFM_TOKEN_ENDCOMPOSITES,\n    AFM_TOKEN_ENDDIRECTION,\n    AFM_TOKEN_ENDFONTMETRICS,\n    AFM_TOKEN_ENDKERNDATA,\n    AFM_TOKEN_ENDKERNPAIRS,\n    AFM_TOKEN_ENDTRACKKERN,\n    AFM_TOKEN_ESCCHAR,\n    AFM_TOKEN_FAMILYNAME,\n    AFM_TOKEN_FONTBBOX,\n    AFM_TOKEN_FONTNAME,\n    AFM_TOKEN_FULLNAME,\n    AFM_TOKEN_ISBASEFONT,\n    AFM_TOKEN_ISCIDFONT,\n    AFM_TOKEN_ISFIXEDPITCH,\n    AFM_TOKEN_ISFIXEDV,\n    AFM_TOKEN_ITALICANGLE,\n    AFM_TOKEN_KP,\n    AFM_TOKEN_KPH,\n    AFM_TOKEN_KPX,\n    AFM_TOKEN_KPY,\n    AFM_TOKEN_L,\n    AFM_TOKEN_MAPPINGSCHEME,\n    AFM_TOKEN_METRICSSETS,\n    AFM_TOKEN_N,\n    AFM_TOKEN_NOTICE,\n    AFM_TOKEN_PCC,\n    AFM_TOKEN_STARTAXIS,\n    AFM_TOKEN_STARTCHARMETRICS,\n    AFM_TOKEN_STARTCOMPOSITES,\n    AFM_TOKEN_STARTDIRECTION,\n    AFM_TOKEN_STARTFONTMETRICS,\n    AFM_TOKEN_STARTKERNDATA,\n    AFM_TOKEN_STARTKERNPAIRS,\n    AFM_TOKEN_STARTKERNPAIRS0,\n    AFM_TOKEN_STARTKERNPAIRS1,\n    AFM_TOKEN_STARTTRACKKERN,\n    AFM_TOKEN_STDHW,\n    AFM_TOKEN_STDVW,\n    AFM_TOKEN_TRACKKERN,\n    AFM_TOKEN_UNDERLINEPOSITION,\n    AFM_TOKEN_UNDERLINETHICKNESS,\n    AFM_TOKEN_VV,\n    AFM_TOKEN_VVECTOR,\n    AFM_TOKEN_VERSION,\n    AFM_TOKEN_W,\n    AFM_TOKEN_W0,\n    AFM_TOKEN_W0X,\n    AFM_TOKEN_W0Y,\n    AFM_TOKEN_W1,\n    AFM_TOKEN_W1X,\n    AFM_TOKEN_W1Y,\n    AFM_TOKEN_WX,\n    AFM_TOKEN_WY,\n    AFM_TOKEN_WEIGHT,\n    AFM_TOKEN_WEIGHTVECTOR,\n    AFM_TOKEN_XHEIGHT,\n    N_AFM_TOKENS,\n    AFM_TOKEN_UNKNOWN\n\n  } AFM_Token;\n\n\n  static const char*  const afm_key_table[N_AFM_TOKENS] =\n  {\n    \"Ascender\",\n    \"AxisLabel\",\n    \"AxisType\",\n    \"B\",\n    \"BlendAxisTypes\",\n    \"BlendDesignMap\",\n    \"BlendDesignPositions\",\n    \"C\",\n    \"CC\",\n    \"CH\",\n    \"CapHeight\",\n    \"CharWidth\",\n    \"CharacterSet\",\n    \"Characters\",\n    \"Descender\",\n    \"EncodingScheme\",\n    \"EndAxis\",\n    \"EndCharMetrics\",\n    \"EndComposites\",\n    \"EndDirection\",\n    \"EndFontMetrics\",\n    \"EndKernData\",\n    \"EndKernPairs\",\n    \"EndTrackKern\",\n    \"EscChar\",\n    \"FamilyName\",\n    \"FontBBox\",\n    \"FontName\",\n    \"FullName\",\n    \"IsBaseFont\",\n    \"IsCIDFont\",\n    \"IsFixedPitch\",\n    \"IsFixedV\",\n    \"ItalicAngle\",\n    \"KP\",\n    \"KPH\",\n    \"KPX\",\n    \"KPY\",\n    \"L\",\n    \"MappingScheme\",\n    \"MetricsSets\",\n    \"N\",\n    \"Notice\",\n    \"PCC\",\n    \"StartAxis\",\n    \"StartCharMetrics\",\n    \"StartComposites\",\n    \"StartDirection\",\n    \"StartFontMetrics\",\n    \"StartKernData\",\n    \"StartKernPairs\",\n    \"StartKernPairs0\",\n    \"StartKernPairs1\",\n    \"StartTrackKern\",\n    \"StdHW\",\n    \"StdVW\",\n    \"TrackKern\",\n    \"UnderlinePosition\",\n    \"UnderlineThickness\",\n    \"VV\",\n    \"VVector\",\n    \"Version\",\n    \"W\",\n    \"W0\",\n    \"W0X\",\n    \"W0Y\",\n    \"W1\",\n    \"W1X\",\n    \"W1Y\",\n    \"WX\",\n    \"WY\",\n    \"Weight\",\n    \"WeightVector\",\n    \"XHeight\"\n  };\n\n\n  /*\n   * `afm_parser_read_vals' and `afm_parser_next_key' provide\n   * high-level operations to an AFM_Stream.  The rest of the\n   * parser functions should use them without accessing the\n   * AFM_Stream directly.\n   */\n\n  FT_LOCAL_DEF( FT_Int )\n  afm_parser_read_vals( AFM_Parser  parser,\n                        AFM_Value   vals,\n                        FT_UInt     n )\n  {\n    AFM_Stream  stream = parser->stream;\n    char*       str;\n    FT_UInt     i;\n\n\n    if ( n > AFM_MAX_ARGUMENTS )\n      return 0;\n\n    for ( i = 0; i < n; i++ )\n    {\n      FT_Offset  len;\n      AFM_Value  val = vals + i;\n\n\n      if ( val->type == AFM_VALUE_TYPE_STRING )\n        str = afm_stream_read_string( stream );\n      else\n        str = afm_stream_read_one( stream );\n\n      if ( !str )\n        break;\n\n      len = AFM_STREAM_KEY_LEN( stream, str );\n\n      switch ( val->type )\n      {\n      case AFM_VALUE_TYPE_STRING:\n      case AFM_VALUE_TYPE_NAME:\n        {\n          FT_Memory  memory = parser->memory;\n          FT_Error   error;\n\n\n          if ( !FT_QALLOC( val->u.s, len + 1 ) )\n          {\n            ft_memcpy( val->u.s, str, len );\n            val->u.s[len] = '\\0';\n          }\n        }\n        break;\n\n      case AFM_VALUE_TYPE_FIXED:\n        val->u.f = PS_Conv_ToFixed( (FT_Byte**)(void*)&str,\n                                    (FT_Byte*)str + len, 0 );\n        break;\n\n      case AFM_VALUE_TYPE_INTEGER:\n        val->u.i = PS_Conv_ToInt( (FT_Byte**)(void*)&str,\n                                  (FT_Byte*)str + len );\n        break;\n\n      case AFM_VALUE_TYPE_BOOL:\n        val->u.b = FT_BOOL( len == 4                      &&\n                            !ft_strncmp( str, \"true\", 4 ) );\n        break;\n\n      case AFM_VALUE_TYPE_INDEX:\n        if ( parser->get_index )\n          val->u.i = parser->get_index( str, len, parser->user_data );\n        else\n          val->u.i = 0;\n        break;\n      }\n    }\n\n    return i;\n  }\n\n\n  FT_LOCAL_DEF( char* )\n  afm_parser_next_key( AFM_Parser  parser,\n                       FT_Bool     line,\n                       FT_Offset*  len )\n  {\n    AFM_Stream  stream = parser->stream;\n    char*       key    = 0;  /* make stupid compiler happy */\n\n\n    if ( line )\n    {\n      while ( 1 )\n      {\n        /* skip current line */\n        if ( !AFM_STATUS_EOL( stream ) )\n          afm_stream_read_string( stream );\n\n        stream->status = AFM_STREAM_STATUS_NORMAL;\n        key = afm_stream_read_one( stream );\n\n        /* skip empty line */\n        if ( !key                      &&\n             !AFM_STATUS_EOF( stream ) &&\n             AFM_STATUS_EOL( stream )  )\n          continue;\n\n        break;\n      }\n    }\n    else\n    {\n      while ( 1 )\n      {\n        /* skip current column */\n        while ( !AFM_STATUS_EOC( stream ) )\n          afm_stream_read_one( stream );\n\n        stream->status = AFM_STREAM_STATUS_NORMAL;\n        key = afm_stream_read_one( stream );\n\n        /* skip empty column */\n        if ( !key                      &&\n             !AFM_STATUS_EOF( stream ) &&\n             AFM_STATUS_EOC( stream )  )\n          continue;\n\n        break;\n      }\n    }\n\n    if ( len )\n      *len = ( key ) ? (FT_Offset)AFM_STREAM_KEY_LEN( stream, key )\n                     : 0;\n\n    return key;\n  }\n\n\n  static AFM_Token\n  afm_tokenize( const char*  key,\n                FT_Offset    len )\n  {\n    int  n;\n\n\n    for ( n = 0; n < N_AFM_TOKENS; n++ )\n    {\n      if ( *( afm_key_table[n] ) == *key )\n      {\n        for ( ; n < N_AFM_TOKENS; n++ )\n        {\n          if ( *( afm_key_table[n] ) != *key )\n            return AFM_TOKEN_UNKNOWN;\n\n          if ( ft_strncmp( afm_key_table[n], key, len ) == 0 )\n            return (AFM_Token) n;\n        }\n      }\n    }\n\n    return AFM_TOKEN_UNKNOWN;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  afm_parser_init( AFM_Parser  parser,\n                   FT_Memory   memory,\n                   FT_Byte*    base,\n                   FT_Byte*    limit )\n  {\n    AFM_Stream  stream = NULL;\n    FT_Error    error;\n\n\n    if ( FT_NEW( stream ) )\n      return error;\n\n    stream->cursor = stream->base = base;\n    stream->limit  = limit;\n\n    /* don't skip the first line during the first call */\n    stream->status = AFM_STREAM_STATUS_EOL;\n\n    parser->memory    = memory;\n    parser->stream    = stream;\n    parser->FontInfo  = NULL;\n    parser->get_index = NULL;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_LOCAL( void )\n  afm_parser_done( AFM_Parser  parser )\n  {\n    FT_Memory  memory = parser->memory;\n\n\n    FT_FREE( parser->stream );\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  afm_parser_read_int( AFM_Parser  parser,\n                       FT_Int*     aint )\n  {\n    AFM_ValueRec  val;\n\n\n    val.type = AFM_VALUE_TYPE_INTEGER;\n\n    if ( afm_parser_read_vals( parser, &val, 1 ) == 1 )\n    {\n      *aint = val.u.i;\n\n      return FT_Err_Ok;\n    }\n    else\n      return FT_THROW( Syntax_Error );\n  }\n\n\n  static FT_Error\n  afm_parse_track_kern( AFM_Parser  parser )\n  {\n    AFM_FontInfo   fi = parser->FontInfo;\n    AFM_TrackKern  tk;\n    char*          key;\n    FT_Offset      len;\n    int            n = -1;\n\n\n    if ( afm_parser_read_int( parser, &fi->NumTrackKern ) )\n        goto Fail;\n\n    if ( fi->NumTrackKern )\n    {\n      FT_Memory  memory = parser->memory;\n      FT_Error   error;\n\n\n      if ( FT_QNEW_ARRAY( fi->TrackKerns, fi->NumTrackKern ) )\n        return error;\n    }\n\n    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )\n    {\n      AFM_ValueRec  shared_vals[5];\n\n\n      switch ( afm_tokenize( key, len ) )\n      {\n      case AFM_TOKEN_TRACKKERN:\n        n++;\n\n        if ( n >= fi->NumTrackKern )\n          goto Fail;\n\n        tk = fi->TrackKerns + n;\n\n        shared_vals[0].type = AFM_VALUE_TYPE_INTEGER;\n        shared_vals[1].type = AFM_VALUE_TYPE_FIXED;\n        shared_vals[2].type = AFM_VALUE_TYPE_FIXED;\n        shared_vals[3].type = AFM_VALUE_TYPE_FIXED;\n        shared_vals[4].type = AFM_VALUE_TYPE_FIXED;\n        if ( afm_parser_read_vals( parser, shared_vals, 5 ) != 5 )\n          goto Fail;\n\n        tk->degree     = shared_vals[0].u.i;\n        tk->min_ptsize = shared_vals[1].u.f;\n        tk->min_kern   = shared_vals[2].u.f;\n        tk->max_ptsize = shared_vals[3].u.f;\n        tk->max_kern   = shared_vals[4].u.f;\n\n        break;\n\n      case AFM_TOKEN_ENDTRACKKERN:\n      case AFM_TOKEN_ENDKERNDATA:\n      case AFM_TOKEN_ENDFONTMETRICS:\n        fi->NumTrackKern = n + 1;\n        return FT_Err_Ok;\n\n      case AFM_TOKEN_UNKNOWN:\n        break;\n\n      default:\n        goto Fail;\n      }\n    }\n\n  Fail:\n    return FT_THROW( Syntax_Error );\n  }\n\n\n#undef  KERN_INDEX\n#define KERN_INDEX( g1, g2 )  ( ( (FT_ULong)g1 << 16 ) | g2 )\n\n\n  /* compare two kerning pairs */\n  FT_CALLBACK_DEF( int )\n  afm_compare_kern_pairs( const void*  a,\n                          const void*  b )\n  {\n    AFM_KernPair  kp1 = (AFM_KernPair)a;\n    AFM_KernPair  kp2 = (AFM_KernPair)b;\n\n    FT_ULong  index1 = KERN_INDEX( kp1->index1, kp1->index2 );\n    FT_ULong  index2 = KERN_INDEX( kp2->index1, kp2->index2 );\n\n\n    if ( index1 > index2 )\n      return 1;\n    else if ( index1 < index2 )\n      return -1;\n    else\n      return 0;\n  }\n\n\n  static FT_Error\n  afm_parse_kern_pairs( AFM_Parser  parser )\n  {\n    AFM_FontInfo  fi = parser->FontInfo;\n    AFM_KernPair  kp;\n    char*         key;\n    FT_Offset     len;\n    int           n = -1;\n\n\n    if ( afm_parser_read_int( parser, &fi->NumKernPair ) )\n      goto Fail;\n\n    if ( fi->NumKernPair )\n    {\n      FT_Memory  memory = parser->memory;\n      FT_Error   error;\n\n\n      if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) )\n        return error;\n    }\n\n    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )\n    {\n      AFM_Token  token = afm_tokenize( key, len );\n\n\n      switch ( token )\n      {\n      case AFM_TOKEN_KP:\n      case AFM_TOKEN_KPX:\n      case AFM_TOKEN_KPY:\n        {\n          FT_Int        r;\n          AFM_ValueRec  shared_vals[4];\n\n\n          n++;\n\n          if ( n >= fi->NumKernPair )\n            goto Fail;\n\n          kp = fi->KernPairs + n;\n\n          shared_vals[0].type = AFM_VALUE_TYPE_INDEX;\n          shared_vals[1].type = AFM_VALUE_TYPE_INDEX;\n          shared_vals[2].type = AFM_VALUE_TYPE_INTEGER;\n          shared_vals[3].type = AFM_VALUE_TYPE_INTEGER;\n          r = afm_parser_read_vals( parser, shared_vals, 4 );\n          if ( r < 3 )\n            goto Fail;\n\n          kp->index1 = shared_vals[0].u.i;\n          kp->index2 = shared_vals[1].u.i;\n          if ( token == AFM_TOKEN_KPY )\n          {\n            kp->x = 0;\n            kp->y = shared_vals[2].u.i;\n          }\n          else\n          {\n            kp->x = shared_vals[2].u.i;\n            kp->y = ( token == AFM_TOKEN_KP && r == 4 )\n                      ? shared_vals[3].u.i : 0;\n          }\n        }\n        break;\n\n      case AFM_TOKEN_ENDKERNPAIRS:\n      case AFM_TOKEN_ENDKERNDATA:\n      case AFM_TOKEN_ENDFONTMETRICS:\n        fi->NumKernPair = n + 1;\n        ft_qsort( fi->KernPairs, fi->NumKernPair,\n                  sizeof ( AFM_KernPairRec ),\n                  afm_compare_kern_pairs );\n        return FT_Err_Ok;\n\n      case AFM_TOKEN_UNKNOWN:\n        break;\n\n      default:\n        goto Fail;\n      }\n    }\n\n  Fail:\n    return FT_THROW( Syntax_Error );\n  }\n\n\n  static FT_Error\n  afm_parse_kern_data( AFM_Parser  parser )\n  {\n    FT_Error   error;\n    char*      key;\n    FT_Offset  len;\n\n\n    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )\n    {\n      switch ( afm_tokenize( key, len ) )\n      {\n      case AFM_TOKEN_STARTTRACKKERN:\n        error = afm_parse_track_kern( parser );\n        if ( error )\n          return error;\n        break;\n\n      case AFM_TOKEN_STARTKERNPAIRS:\n      case AFM_TOKEN_STARTKERNPAIRS0:\n        error = afm_parse_kern_pairs( parser );\n        if ( error )\n          return error;\n        break;\n\n      case AFM_TOKEN_ENDKERNDATA:\n      case AFM_TOKEN_ENDFONTMETRICS:\n        return FT_Err_Ok;\n\n      case AFM_TOKEN_UNKNOWN:\n        break;\n\n      default:\n        goto Fail;\n      }\n    }\n\n  Fail:\n    return FT_THROW( Syntax_Error );\n  }\n\n\n  static FT_Error\n  afm_parser_skip_section( AFM_Parser  parser,\n                           FT_UInt     n,\n                           AFM_Token   end_section )\n  {\n    char*      key;\n    FT_Offset  len;\n\n\n    while ( n-- > 0 )\n    {\n      key = afm_parser_next_key( parser, 1, NULL );\n      if ( !key )\n        goto Fail;\n    }\n\n    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )\n    {\n      AFM_Token  token = afm_tokenize( key, len );\n\n\n      if ( token == end_section || token == AFM_TOKEN_ENDFONTMETRICS )\n        return FT_Err_Ok;\n    }\n\n  Fail:\n    return FT_THROW( Syntax_Error );\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  afm_parser_parse( AFM_Parser  parser )\n  {\n    FT_Memory     memory = parser->memory;\n    AFM_FontInfo  fi     = parser->FontInfo;\n    FT_Error      error  = FT_ERR( Syntax_Error );\n    char*         key;\n    FT_Offset     len;\n    FT_Int        metrics_sets = 0;\n\n\n    if ( !fi )\n      return FT_THROW( Invalid_Argument );\n\n    key = afm_parser_next_key( parser, 1, &len );\n    if ( !key || len != 16                              ||\n         ft_strncmp( key, \"StartFontMetrics\", 16 ) != 0 )\n      return FT_THROW( Unknown_File_Format );\n\n    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )\n    {\n      AFM_ValueRec  shared_vals[4];\n\n\n      switch ( afm_tokenize( key, len ) )\n      {\n      case AFM_TOKEN_METRICSSETS:\n        if ( afm_parser_read_int( parser, &metrics_sets ) )\n          goto Fail;\n\n        if ( metrics_sets != 0 && metrics_sets != 2 )\n        {\n          error = FT_THROW( Unimplemented_Feature );\n\n          goto Fail;\n        }\n        break;\n\n      case AFM_TOKEN_ISCIDFONT:\n        shared_vals[0].type = AFM_VALUE_TYPE_BOOL;\n        if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 )\n          goto Fail;\n\n        fi->IsCIDFont = shared_vals[0].u.b;\n        break;\n\n      case AFM_TOKEN_FONTBBOX:\n        shared_vals[0].type = AFM_VALUE_TYPE_FIXED;\n        shared_vals[1].type = AFM_VALUE_TYPE_FIXED;\n        shared_vals[2].type = AFM_VALUE_TYPE_FIXED;\n        shared_vals[3].type = AFM_VALUE_TYPE_FIXED;\n        if ( afm_parser_read_vals( parser, shared_vals, 4 ) != 4 )\n          goto Fail;\n\n        fi->FontBBox.xMin = shared_vals[0].u.f;\n        fi->FontBBox.yMin = shared_vals[1].u.f;\n        fi->FontBBox.xMax = shared_vals[2].u.f;\n        fi->FontBBox.yMax = shared_vals[3].u.f;\n        break;\n\n      case AFM_TOKEN_ASCENDER:\n        shared_vals[0].type = AFM_VALUE_TYPE_FIXED;\n        if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 )\n          goto Fail;\n\n        fi->Ascender = shared_vals[0].u.f;\n        break;\n\n      case AFM_TOKEN_DESCENDER:\n        shared_vals[0].type = AFM_VALUE_TYPE_FIXED;\n        if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 )\n          goto Fail;\n\n        fi->Descender = shared_vals[0].u.f;\n        break;\n\n      case AFM_TOKEN_STARTCHARMETRICS:\n        {\n          FT_Int  n = 0;\n\n\n          if ( afm_parser_read_int( parser, &n ) )\n            goto Fail;\n\n          error = afm_parser_skip_section( parser, n,\n                                           AFM_TOKEN_ENDCHARMETRICS );\n          if ( error )\n            return error;\n        }\n        break;\n\n      case AFM_TOKEN_STARTKERNDATA:\n        error = afm_parse_kern_data( parser );\n        if ( error )\n          goto Fail;\n        /* fall through since we only support kern data */\n\n      case AFM_TOKEN_ENDFONTMETRICS:\n        return FT_Err_Ok;\n\n      default:\n        break;\n      }\n    }\n\n  Fail:\n    FT_FREE( fi->TrackKerns );\n    fi->NumTrackKern = 0;\n\n    FT_FREE( fi->KernPairs );\n    fi->NumKernPair = 0;\n\n    fi->IsCIDFont = 0;\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/afmparse.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  afmparse.h                                                             */\n/*                                                                         */\n/*    AFM parser (specification).                                          */\n/*                                                                         */\n/*  Copyright 2006 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __AFMPARSE_H__\n#define __AFMPARSE_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/psaux.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( FT_Error )\n  afm_parser_init( AFM_Parser  parser,\n                   FT_Memory   memory,\n                   FT_Byte*    base,\n                   FT_Byte*    limit );\n\n\n  FT_LOCAL( void )\n  afm_parser_done( AFM_Parser  parser );\n\n\n  FT_LOCAL( FT_Error )\n  afm_parser_parse( AFM_Parser  parser );\n\n\n  enum  AFM_ValueType_\n  {\n    AFM_VALUE_TYPE_STRING,\n    AFM_VALUE_TYPE_NAME,\n    AFM_VALUE_TYPE_FIXED,   /* real number */\n    AFM_VALUE_TYPE_INTEGER,\n    AFM_VALUE_TYPE_BOOL,\n    AFM_VALUE_TYPE_INDEX    /* glyph index */\n  };\n\n\n  typedef struct  AFM_ValueRec_\n  {\n    enum AFM_ValueType_  type;\n    union\n    {\n      char*     s;\n      FT_Fixed  f;\n      FT_Int    i;\n      FT_Bool   b;\n\n    } u;\n\n  } AFM_ValueRec, *AFM_Value;\n\n#define  AFM_MAX_ARGUMENTS  5\n\n  FT_LOCAL( FT_Int )\n  afm_parser_read_vals( AFM_Parser  parser,\n                        AFM_Value   vals,\n                        FT_UInt     n );\n\n  /* read the next key from the next line or column */\n  FT_LOCAL( char* )\n  afm_parser_next_key( AFM_Parser  parser,\n                       FT_Bool     line,\n                       FT_Offset*  len );\n\nFT_END_HEADER\n\n#endif /* __AFMPARSE_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/fxft_psaux.c",
    "content": "#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501\n/***************************************************************************/\n/*                                                                         */\n/*  psaux.c                                                                */\n/*                                                                         */\n/*    FreeType auxiliary PostScript driver component (body only).          */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2006 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n#define FT2_BUILD_LIBRARY\n\n#include \"../../include/ft2build.h\"\n#include \"psobjs.c\"\n#include \"psauxmod.c\"\n#include \"t1decode.c\"\n#include \"t1cmap.c\"\n\n#ifndef T1_CONFIG_OPTION_NO_AFM\n#include \"afmparse.c\"\n#endif\n\n#include \"psconv.c\"\n\n\n/* END */\n#endif\n\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxerr.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  psauxerr.h                                                             */\n/*                                                                         */\n/*    PS auxiliary module error codes (specification only).                */\n/*                                                                         */\n/*  Copyright 2001, 2012 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the PS auxiliary module error enumeration */\n  /* constants.                                                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __PSAUXERR_H__\n#define __PSAUXERR_H__\n\n#include \"../../include/freetype/ftmoderr.h\"\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  PSaux_Err_\n#define FT_ERR_BASE    FT_Mod_Err_PSaux\n\n#include \"../../include/freetype/fterrors.h\"\n\n#endif /* __PSAUXERR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxmod.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  psauxmod.c                                                             */\n/*                                                                         */\n/*    FreeType auxiliary PostScript module implementation (body).          */\n/*                                                                         */\n/*  Copyright 2000-2001, 2002, 2003, 2006 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"psauxmod.h\"\n#include \"psobjs.h\"\n#include \"t1decode.h\"\n#include \"t1cmap.h\"\n\n#ifndef T1_CONFIG_OPTION_NO_AFM\n#include \"afmparse.h\"\n#endif\n\n\n  FT_CALLBACK_TABLE_DEF\n  const PS_Table_FuncsRec  ps_table_funcs =\n  {\n    ps_table_new,\n    ps_table_done,\n    ps_table_add,\n    ps_table_release\n  };\n\n\n  FT_CALLBACK_TABLE_DEF\n  const PS_Parser_FuncsRec  ps_parser_funcs =\n  {\n    ps_parser_init,\n    ps_parser_done,\n    ps_parser_skip_spaces,\n    ps_parser_skip_PS_token,\n    ps_parser_to_int,\n    ps_parser_to_fixed,\n    ps_parser_to_bytes,\n    ps_parser_to_coord_array,\n    ps_parser_to_fixed_array,\n    ps_parser_to_token,\n    ps_parser_to_token_array,\n    ps_parser_load_field,\n    ps_parser_load_field_table\n  };\n\n\n  FT_CALLBACK_TABLE_DEF\n  const T1_Builder_FuncsRec  t1_builder_funcs =\n  {\n    t1_builder_init,\n    t1_builder_done,\n    t1_builder_check_points,\n    t1_builder_add_point,\n    t1_builder_add_point1,\n    t1_builder_add_contour,\n    t1_builder_start_point,\n    t1_builder_close_contour\n  };\n\n\n  FT_CALLBACK_TABLE_DEF\n  const T1_Decoder_FuncsRec  t1_decoder_funcs =\n  {\n    t1_decoder_init,\n    t1_decoder_done,\n    t1_decoder_parse_charstrings\n  };\n\n\n#ifndef T1_CONFIG_OPTION_NO_AFM\n  FT_CALLBACK_TABLE_DEF\n  const AFM_Parser_FuncsRec  afm_parser_funcs =\n  {\n    afm_parser_init,\n    afm_parser_done,\n    afm_parser_parse\n  };\n#endif\n\n\n  FT_CALLBACK_TABLE_DEF\n  const T1_CMap_ClassesRec  t1_cmap_classes =\n  {\n    &t1_cmap_standard_class_rec,\n    &t1_cmap_expert_class_rec,\n    &t1_cmap_custom_class_rec,\n    &t1_cmap_unicode_class_rec\n  };\n\n\n  static\n  const PSAux_Interface  psaux_interface =\n  {\n    &ps_table_funcs,\n    &ps_parser_funcs,\n    &t1_builder_funcs,\n    &t1_decoder_funcs,\n    t1_decrypt,\n\n    (const T1_CMap_ClassesRec*) &t1_cmap_classes,\n\n#ifndef T1_CONFIG_OPTION_NO_AFM\n    &afm_parser_funcs,\n#else\n    0,\n#endif\n  };\n\n\n  FT_CALLBACK_TABLE_DEF\n  const FT_Module_Class  psaux_module_class =\n  {\n    0,\n    sizeof ( FT_ModuleRec ),\n    \"psaux\",\n    0x20000L,\n    0x20000L,\n\n    &psaux_interface,  /* module-specific interface */\n\n    (FT_Module_Constructor)0,\n    (FT_Module_Destructor) 0,\n    (FT_Module_Requester)  0\n  };\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxmod.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  psauxmod.h                                                             */\n/*                                                                         */\n/*    FreeType auxiliary PostScript module implementation (specification). */\n/*                                                                         */\n/*  Copyright 2000-2001 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PSAUXMOD_H__\n#define __PSAUXMOD_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/ftmodapi.h\"\n\n\nFT_BEGIN_HEADER\n\n#ifdef FT_CONFIG_OPTION_PIC\n#error \"this module does not support PIC yet\"\n#endif\n\n\n  FT_EXPORT_VAR( const FT_Module_Class )  psaux_driver_class;\n\n\nFT_END_HEADER\n\n#endif /* __PSAUXMOD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psconv.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  psconv.c                                                               */\n/*                                                                         */\n/*    Some convenience conversions (body).                                 */\n/*                                                                         */\n/*  Copyright 2006, 2008, 2009, 2012-2013 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/psaux.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n\n#include \"psconv.h\"\n#include \"psauxerr.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_psconv\n\n\n  /* The following array is used by various functions to quickly convert */\n  /* digits (both decimal and non-decimal) into numbers.                 */\n\n#if 'A' == 65\n  /* ASCII */\n\n  static const FT_Char  ft_char_table[128] =\n  {\n    /* 0x00 */\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, -1, -1, -1, -1, -1, -1,\n    -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,\n    25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,\n    -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,\n    25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,\n  };\n\n  /* no character >= 0x80 can represent a valid number */\n#define OP  >=\n\n#endif /* 'A' == 65 */\n\n#if 'A' == 193\n  /* EBCDIC */\n\n  static const FT_Char  ft_char_table[128] =\n  {\n    /* 0x80 */\n    -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1,\n    -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1,\n    -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1,\n    -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1,\n    -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1,\n     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, -1, -1, -1, -1, -1, -1,\n  };\n\n  /* no character < 0x80 can represent a valid number */\n#define OP  <\n\n#endif /* 'A' == 193 */\n\n\n  FT_LOCAL_DEF( FT_Long )\n  PS_Conv_Strtol( FT_Byte**  cursor,\n                  FT_Byte*   limit,\n                  FT_Long    base )\n  {\n    FT_Byte*  p = *cursor;\n\n    FT_Long   num           = 0;\n    FT_Bool   sign          = 0;\n    FT_Bool   have_overflow = 0;\n\n    FT_Long   num_limit;\n    FT_Char   c_limit;\n\n\n    if ( p >= limit )\n      goto Bad;\n\n    if ( base < 2 || base > 36 )\n    {\n      FT_TRACE4(( \"!!!INVALID BASE:!!!\" ));\n      return 0;\n    }\n\n    if ( *p == '-' || *p == '+' )\n    {\n      sign = FT_BOOL( *p == '-' );\n\n      p++;\n      if ( p == limit )\n        goto Bad;\n    }\n\n    num_limit = 0x7FFFFFFFL / base;\n    c_limit   = (FT_Char)( 0x7FFFFFFFL % base );\n\n    for ( ; p < limit; p++ )\n    {\n      FT_Char  c;\n\n\n      if ( IS_PS_SPACE( *p ) || *p OP 0x80 )\n        break;\n\n      c = ft_char_table[*p & 0x7f];\n\n      if ( c < 0 || c >= base )\n        break;\n\n      if ( num > num_limit || ( num == num_limit && c > c_limit ) )\n        have_overflow = 1;\n      else\n        num = num * base + c;\n    }\n\n    *cursor = p;\n\n    if ( have_overflow )\n    {\n      num = 0x7FFFFFFFL;\n      FT_TRACE4(( \"!!!OVERFLOW:!!!\" ));\n    }\n\n    if ( sign )\n      num = -num;\n\n    return num;\n\n  Bad:\n    FT_TRACE4(( \"!!!END OF DATA:!!!\" ));\n    return 0;\n  }\n\n\n  FT_LOCAL_DEF( FT_Long )\n  PS_Conv_ToInt( FT_Byte**  cursor,\n                 FT_Byte*   limit )\n\n  {\n    FT_Byte*  p = *cursor;\n    FT_Byte*  curp;\n\n    FT_Long   num;\n\n\n    curp = p;\n    num  = PS_Conv_Strtol( &p, limit, 10 );\n\n    if ( p == curp )\n      return 0;\n\n    if ( p < limit && *p == '#' )\n    {\n      p++;\n\n      curp = p;\n      num  = PS_Conv_Strtol( &p, limit, num );\n\n      if ( p == curp )\n        return 0;\n    }\n\n    *cursor = p;\n\n    return num;\n  }\n\n\n  FT_LOCAL_DEF( FT_Fixed )\n  PS_Conv_ToFixed( FT_Byte**  cursor,\n                   FT_Byte*   limit,\n                   FT_Long    power_ten )\n  {\n    FT_Byte*  p = *cursor;\n    FT_Byte*  curp;\n\t// Fix the Vulnerability Report FoxIT Reader - MSVR-10-0077.\n\t// We must use 64-bit integer to avoid overflow. If there is some 64-bit integer support.\n\t// Since some platform doesn't support 64-bit integer, then use integer instead.\n#if defined(FT_INT64)\n    FT_INT64  integral = 0;\n    FT_INT64  decimal = 0;\n#else\n\tFT_Long integral = 0;\n\tFT_Long decimal = 0;\n\tFT_Int temp0 = 65536;\n\tFT_Int temp1 = power_ten;\n#endif\n\tFT_Long divider = 1;\n\n\tFT_Bool   sign = 0;\n    FT_Bool   have_overflow  = 0;\n    FT_Bool   have_underflow = 0;\n\n    if ( p >= limit )\n      goto Bad;\n\n    if ( *p == '-' || *p == '+' )\n    {\n      sign = FT_BOOL( *p == '-' );\n\n      p++;\n      if ( p == limit )\n        goto Bad;\n    }\n\n    /* read the integer part */\n    if ( *p != '.' )\n    {\n      curp     = p;\n\n\t\t// Fix the Vulnerability Report FoxIT Reader - MSVR-10-0077.\n\t\t// Limited to the fix-point mechanism, we have no choice now to crop the value domain.\n\t\t// Do accurate overflow check if FT_INT64 supported, otherwise vague check.\n#if defined(FT_INT64)\n\t\tintegral = ((FT_INT64)PS_Conv_ToInt( &p, limit )) << 16;\n#else\n\t\t// We use 'power_ten' and 2^16 to compute the coefficient.\n\t\t//while ( temp1 > 0 ) { temp0 *= 10; temp1 --; }\n\t\t//while ( temp1 < 0 ) { temp0 /= 10; temp1 ++; }\n\t\t\n\t\tintegral = PS_Conv_ToInt( &p, limit );\n\t\tif ( p == curp )\n\t\t\treturn 0;\n\t\tif ( integral > 0x7FFF )\n\t\t\thave_overflow = 1;\n\t\telse \n\t\t\tintegral = integral << 16;\n#endif   \n    }\n\n    /* read the decimal part */\n    if ( p < limit && *p == '.' )\n    {\n      p++;\n\n      for ( ; p < limit; p++ )\n      {\n        FT_Char  c;\n\n\n        if ( IS_PS_SPACE( *p ) || *p OP 0x80 )\n          break;\n\n        c = ft_char_table[*p & 0x7f];\n\n        if ( c < 0 || c >= 10 )\n          break;\n\n        if ( decimal < 0xCCCCCCCL )\n        {\n          decimal = decimal * 10 + c;\n\n          if ( !integral && power_ten > 0 )\n            power_ten--;\n          else\n            divider *= 10;\n        }\n      }\n    }\n\n    /* read exponent, if any */\n    if ( p + 1 < limit && ( *p == 'e' || *p == 'E' ) )\n    {\n      FT_Long  exponent;\n\n\n      p++;\n\n      curp     = p;\n      exponent = PS_Conv_ToInt( &p, limit );\n\n      if ( curp == p )\n        return 0;\n\n      /* arbitrarily limit exponent */\n      if ( exponent > 1000 )\n        have_overflow = 1;\n      else if ( exponent < -1000 )\n        have_underflow = 1;\n      else\n        power_ten += exponent;\n    }\n\n    *cursor = p;\n\n    if ( !integral && !decimal )\n      return 0;\n\n    if ( have_overflow )\n      goto Overflow;\n    if ( have_underflow )\n      goto Underflow;\n\n    while ( power_ten > 0 )\n    {\n      if ( integral >= 0xCCCCCCCL )\n        goto Overflow;\n      integral *= 10;\n\n      if ( decimal >= 0xCCCCCCCL )\n      {\n        if ( divider == 1 )\n          goto Overflow;\n        divider /= 10;\n      }\n      else\n        decimal *= 10;\n\n      power_ten--;\n    }\n\n    while ( power_ten < 0 )\n    {\n      integral /= 10;\n      if ( divider < 0xCCCCCCCL )\n        divider *= 10;\n      else\n        decimal /= 10;\n\n      if ( !integral && !decimal )\n        goto Underflow;\n\n      power_ten++;\n    }\n\n// Fix the Vulnerability Report FoxIT Reader - MSVR-10-0077.\n\t// Limited to the fix-point mechanism, we have no choice now to crop the value domain.\n\t// Do accurate overflow check if FT_INT64 supported, otherwise ignore the check at this moment.\n\t// Since there is also a check using divider < 10000000L.  \n#if defined(FT_INT64) \n    if ( decimal ) {\n\t\tintegral += FT_DivFix( (FT_Long)decimal, divider );\n\t}\n\tif ( integral > 2147483647) integral = 2147483647;\n#else\n\tif ( decimal ) {\n\t\tintegral += FT_DivFix( decimal, divider );\n\t}\n#endif\n\n\n  Exit:\n    if ( sign )\n      integral = -integral;\n\n    return (FT_Long)integral;\n\n  Bad:\n    FT_TRACE4(( \"!!!END OF DATA:!!!\" ));\n    return 0;\n\n  Overflow:\n    integral = 0x7FFFFFFFL;\n    FT_TRACE4(( \"!!!OVERFLOW:!!!\" ));\n    goto Exit;\n\n  Underflow:\n    FT_TRACE4(( \"!!!UNDERFLOW:!!!\" ));\n    return 0;\n  }\n\n\n#if 0\n  FT_LOCAL_DEF( FT_UInt )\n  PS_Conv_StringDecode( FT_Byte**  cursor,\n                        FT_Byte*   limit,\n                        FT_Byte*   buffer,\n                        FT_Offset  n )\n  {\n    FT_Byte*  p;\n    FT_UInt   r = 0;\n\n\n    for ( p = *cursor; r < n && p < limit; p++ )\n    {\n      FT_Byte  b;\n\n\n      if ( *p != '\\\\' )\n      {\n        buffer[r++] = *p;\n\n        continue;\n      }\n\n      p++;\n\n      switch ( *p )\n      {\n      case 'n':\n        b = '\\n';\n        break;\n      case 'r':\n        b = '\\r';\n        break;\n      case 't':\n        b = '\\t';\n        break;\n      case 'b':\n        b = '\\b';\n        break;\n      case 'f':\n        b = '\\f';\n        break;\n      case '\\r':\n        p++;\n        if ( *p != '\\n' )\n        {\n          b = *p;\n\n          break;\n        }\n        /* no break */\n      case '\\n':\n        continue;\n        break;\n      default:\n        if ( IS_PS_DIGIT( *p ) )\n        {\n          b = *p - '0';\n\n          p++;\n\n          if ( IS_PS_DIGIT( *p ) )\n          {\n            b = b * 8 + *p - '0';\n\n            p++;\n\n            if ( IS_PS_DIGIT( *p ) )\n              b = b * 8 + *p - '0';\n            else\n            {\n              buffer[r++] = b;\n              b = *p;\n            }\n          }\n          else\n          {\n            buffer[r++] = b;\n            b = *p;\n          }\n        }\n        else\n          b = *p;\n        break;\n      }\n\n      buffer[r++] = b;\n    }\n\n    *cursor = p;\n\n    return r;\n  }\n#endif /* 0 */\n\n\n  FT_LOCAL_DEF( FT_UInt )\n  PS_Conv_ASCIIHexDecode( FT_Byte**  cursor,\n                          FT_Byte*   limit,\n                          FT_Byte*   buffer,\n                          FT_Offset  n )\n  {\n    FT_Byte*  p;\n    FT_UInt   r   = 0;\n    FT_UInt   w   = 0;\n    FT_UInt   pad = 0x01;\n\n\n    n *= 2;\n\n#if 1\n\n    p = *cursor;\n\n    if ( p >= limit )\n      return 0;\n\n    if ( n > (FT_UInt)( limit - p ) )\n      n = (FT_UInt)( limit - p );\n\n    /* we try to process two nibbles at a time to be as fast as possible */\n    for ( ; r < n; r++ )\n    {\n      FT_UInt  c = p[r];\n\n\n      if ( IS_PS_SPACE( c ) )\n        continue;\n\n      if ( c OP 0x80 )\n        break;\n\n      c = ft_char_table[c & 0x7F];\n      if ( (unsigned)c >= 16 )\n        break;\n\n      pad = ( pad << 4 ) | c;\n      if ( pad & 0x100 )\n      {\n        buffer[w++] = (FT_Byte)pad;\n        pad         = 0x01;\n      }\n    }\n\n    if ( pad != 0x01 )\n      buffer[w++] = (FT_Byte)( pad << 4 );\n\n    *cursor = p + r;\n\n    return w;\n\n#else /* 0 */\n\n    for ( r = 0; r < n; r++ )\n    {\n      FT_Char  c;\n\n\n      if ( IS_PS_SPACE( *p ) )\n        continue;\n\n      if ( *p OP 0x80 )\n        break;\n\n      c = ft_char_table[*p & 0x7f];\n\n      if ( (unsigned)c >= 16 )\n        break;\n\n      if ( r & 1 )\n      {\n        *buffer = (FT_Byte)(*buffer + c);\n        buffer++;\n      }\n      else\n        *buffer = (FT_Byte)(c << 4);\n\n      r++;\n    }\n\n    *cursor = p;\n\n    return ( r + 1 ) / 2;\n\n#endif /* 0 */\n\n  }\n\n\n  FT_LOCAL_DEF( FT_UInt )\n  PS_Conv_EexecDecode( FT_Byte**   cursor,\n                       FT_Byte*    limit,\n                       FT_Byte*    buffer,\n                       FT_Offset   n,\n                       FT_UShort*  seed )\n  {\n    FT_Byte*  p;\n    FT_UInt   r;\n    FT_UInt   s = *seed;\n\n\n#if 1\n\n    p = *cursor;\n\n    if ( p >= limit )\n      return 0;\n\n    if ( n > (FT_UInt)(limit - p) )\n      n = (FT_UInt)(limit - p);\n\n    for ( r = 0; r < n; r++ )\n    {\n      FT_UInt  val = p[r];\n      FT_UInt  b   = ( val ^ ( s >> 8 ) );\n\n\n      s         = ( (val + s)*52845U + 22719 ) & 0xFFFFU;\n      buffer[r] = (FT_Byte) b;\n    }\n\n    *cursor = p + n;\n    *seed   = (FT_UShort)s;\n\n#else /* 0 */\n\n    for ( r = 0, p = *cursor; r < n && p < limit; r++, p++ )\n    {\n      FT_Byte  b = (FT_Byte)( *p ^ ( s >> 8 ) );\n\n\n      s = (FT_UShort)( ( *p + s ) * 52845U + 22719 );\n      *buffer++ = b;\n    }\n    *cursor = p;\n    *seed   = s;\n\n#endif /* 0 */\n\n    return r;\n  }\n\nFT_LOCAL_DEF( FT_Bool )\n\t  xyq_PS_Conv_ToInt( FT_Byte**  cursor,\n\t  FT_Byte*   limit, FT_Long* val )\n\t  \n  {\n\t  FT_Byte first_char = **cursor;\n\t  if (first_char == '+' || first_char == '-' || (first_char >= '0' && first_char <= '9')) {\n\t\t  *val = PS_Conv_ToInt(cursor, limit);\n\t\t  return 1;\n\t  }\n\t  return 0;\n  }\n\n/* END */\n\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psconv.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  psconv.h                                                               */\n/*                                                                         */\n/*    Some convenience conversions (specification).                        */\n/*                                                                         */\n/*  Copyright 2006, 2012 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PSCONV_H__\n#define __PSCONV_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/psaux.h\"\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( FT_Long )\n  PS_Conv_Strtol( FT_Byte**  cursor,\n                  FT_Byte*   limit,\n                  FT_Long    base );\n\n\n  FT_LOCAL( FT_Long )\n  PS_Conv_ToInt( FT_Byte**  cursor,\n                 FT_Byte*   limit );\n  FT_LOCAL( FT_Bool )\n\t  xyq_PS_Conv_ToInt( FT_Byte**  cursor,\n\t  FT_Byte*   limit, FT_Long* val );\t/* XYQ 2007-10-10: we add return value indicating whether it's actually a number */\n\n  FT_LOCAL( FT_Fixed )\n  PS_Conv_ToFixed( FT_Byte**  cursor,\n                   FT_Byte*   limit,\n                   FT_Long    power_ten );\n\n#if 0\n  FT_LOCAL( FT_UInt )\n  PS_Conv_StringDecode( FT_Byte**  cursor,\n                        FT_Byte*   limit,\n                        FT_Byte*   buffer,\n                        FT_Offset  n );\n#endif\n\n  FT_LOCAL( FT_UInt )\n  PS_Conv_ASCIIHexDecode( FT_Byte**  cursor,\n                          FT_Byte*   limit,\n                          FT_Byte*   buffer,\n                          FT_Offset  n );\n\n  FT_LOCAL( FT_UInt )\n  PS_Conv_EexecDecode( FT_Byte**   cursor,\n                       FT_Byte*    limit,\n                       FT_Byte*    buffer,\n                       FT_Offset   n,\n                       FT_UShort*  seed );\n\n\nFT_END_HEADER\n\n#endif /* __PSCONV_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psobjs.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  psobjs.c                                                               */\n/*                                                                         */\n/*    Auxiliary functions for PostScript fonts (body).                     */\n/*                                                                         */\n/*  Copyright 1996-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/psaux.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftcalc.h\"\n\n#include \"psobjs.h\"\n#include \"psconv.h\"\n\n#include \"psauxerr.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_psobjs\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                             PS_TABLE                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    ps_table_new                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initializes a PS_Table.                                            */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    table  :: The address of the target table.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    count  :: The table size = the maximum number of elements.         */\n  /*                                                                       */\n  /*    memory :: The memory object to use for all subsequent              */\n  /*              reallocations.                                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  ps_table_new( PS_Table   table,\n                FT_Int     count,\n                FT_Memory  memory )\n  {\n    FT_Error  error;\n\n\n    table->memory = memory;\n    if ( FT_NEW_ARRAY( table->elements, count ) ||\n         FT_NEW_ARRAY( table->lengths,  count ) )\n      goto Exit;\n\n    table->max_elems = count;\n    table->init      = 0xDEADBEEFUL;\n    table->num_elems = 0;\n    table->block     = 0;\n    table->capacity  = 0;\n    table->cursor    = 0;\n\n    *(PS_Table_FuncsRec*)&table->funcs = ps_table_funcs;\n\n  Exit:\n    if ( error )\n      FT_FREE( table->elements );\n\n    return error;\n  }\n\n\n  static void\n  shift_elements( PS_Table  table,\n                  FT_Byte*  old_base )\n  {\n    FT_PtrDist  delta  = table->block - old_base;\n    FT_Byte**   offset = table->elements;\n    FT_Byte**   limit  = offset + table->max_elems;\n\n\n    for ( ; offset < limit; offset++ )\n    {\n      if ( offset[0] )\n        offset[0] += delta;\n    }\n  }\n\n\n  static FT_Error\n  reallocate_t1_table( PS_Table   table,\n                       FT_Offset  new_size )\n  {\n    FT_Memory  memory   = table->memory;\n    FT_Byte*   old_base = table->block;\n    FT_Error   error;\n\n\n    /* allocate new base block */\n    if ( FT_ALLOC( table->block, new_size ) )\n    {\n      table->block = old_base;\n      return error;\n    }\n\n    /* copy elements and shift offsets */\n    if ( old_base )\n    {\n      FT_MEM_COPY( table->block, old_base, table->capacity );\n      shift_elements( table, old_base );\n      FT_FREE( old_base );\n    }\n\n    table->capacity = new_size;\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    ps_table_add                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Adds an object to a PS_Table, possibly growing its memory block.   */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    table  :: The target table.                                        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    idx    :: The index of the object in the table.                    */\n  /*                                                                       */\n  /*    object :: The address of the object to copy in memory.             */\n  /*                                                                       */\n  /*    length :: The length in bytes of the source object.                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.  An error is returned if a  */\n  /*    reallocation fails.                                                */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  ps_table_add( PS_Table    table,\n                FT_Int      idx,\n                void*       object,\n                FT_PtrDist  length )\n  {\n    if ( idx < 0 || idx >= table->max_elems )\n    {\n      FT_ERROR(( \"ps_table_add: invalid index\\n\" ));\n      return FT_THROW( Invalid_Argument );\n    }\n\n    if ( length < 0 )\n    {\n      FT_ERROR(( \"ps_table_add: invalid length\\n\" ));\n      return FT_THROW( Invalid_Argument );\n    }\n\n    /* grow the base block if needed */\n    if ( table->cursor + length > table->capacity )\n    {\n      FT_Error    error;\n      FT_Offset   new_size = table->capacity;\n      FT_PtrDist  in_offset;\n\n\n      in_offset = (FT_Byte*)object - table->block;\n      if ( in_offset < 0 || (FT_Offset)in_offset >= table->capacity )\n        in_offset = -1;\n\n      while ( new_size < table->cursor + length )\n      {\n        /* increase size by 25% and round up to the nearest multiple\n           of 1024 */\n        new_size += ( new_size >> 2 ) + 1;\n        new_size  = FT_PAD_CEIL( new_size, 1024 );\n      }\n\n      error = reallocate_t1_table( table, new_size );\n      if ( error )\n        return error;\n\n      if ( in_offset >= 0 )\n        object = table->block + in_offset;\n    }\n\n    /* add the object to the base block and adjust offset */\n    table->elements[idx] = table->block + table->cursor;\n    table->lengths [idx] = length;\n    FT_MEM_COPY( table->block + table->cursor, object, length );\n\n    table->cursor += length;\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    ps_table_done                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Finalizes a PS_TableRec (i.e., reallocate it to its current        */\n  /*    cursor).                                                           */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    table :: The target table.                                         */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function does NOT release the heap's memory block.  It is up  */\n  /*    to the caller to clean it, or reference it in its own structures.  */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  ps_table_done( PS_Table  table )\n  {\n    FT_Memory  memory = table->memory;\n    FT_Error   error;\n    FT_Byte*   old_base = table->block;\n\n\n    /* should never fail, because rec.cursor <= rec.size */\n    if ( !old_base )\n      return;\n\n    if ( FT_ALLOC( table->block, table->cursor ) )\n      return;\n    FT_MEM_COPY( table->block, old_base, table->cursor );\n    shift_elements( table, old_base );\n\n    table->capacity = table->cursor;\n    FT_FREE( old_base );\n\n    FT_UNUSED( error );\n  }\n\n\n  FT_LOCAL_DEF( void )\n  ps_table_release( PS_Table  table )\n  {\n    FT_Memory  memory = table->memory;\n\n\n    if ( (FT_ULong)table->init == 0xDEADBEEFUL )\n    {\n      FT_FREE( table->block );\n      FT_FREE( table->elements );\n      FT_FREE( table->lengths );\n      table->init = 0;\n    }\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                            T1 PARSER                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* first character must be already part of the comment */\n\n  static void\n  skip_comment( FT_Byte*  *acur,\n                FT_Byte*   limit )\n  {\n    FT_Byte*  cur = *acur;\n\n\n    while ( cur < limit )\n    {\n      if ( IS_PS_NEWLINE( *cur ) )\n        break;\n      cur++;\n    }\n\n    *acur = cur;\n  }\n\n\n  static void\n  skip_spaces( FT_Byte*  *acur,\n               FT_Byte*   limit )\n  {\n    FT_Byte*  cur = *acur;\n\n\n    while ( cur < limit )\n    {\n      if ( !IS_PS_SPACE( *cur ) )\n      {\n        if ( *cur == '%' )\n          /* According to the PLRM, a comment is equal to a space. */\n          skip_comment( &cur, limit );\n        else\n          break;\n      }\n      cur++;\n    }\n\n    *acur = cur;\n  }\n\n\n#define IS_OCTAL_DIGIT( c ) ( '0' <= (c) && (c) <= '7' )\n\n\n  /* first character must be `(';                               */\n  /* *acur is positioned at the character after the closing `)' */\n\n  static FT_Error\n  skip_literal_string( FT_Byte*  *acur,\n                       FT_Byte*   limit )\n  {\n    FT_Byte*      cur   = *acur;\n    FT_Int        embed = 0;\n    FT_Error      error = FT_ERR( Invalid_File_Format );\n    unsigned int  i;\n\n\n    while ( cur < limit )\n    {\n      FT_Byte  c = *cur;\n\n\n      ++cur;\n\n      if ( c == '\\\\' )\n      {\n        /* Red Book 3rd ed., section `Literal Text Strings', p. 29:     */\n        /* A backslash can introduce three different types              */\n        /* of escape sequences:                                         */\n        /*   - a special escaped char like \\r, \\n, etc.                 */\n        /*   - a one-, two-, or three-digit octal number                */\n        /*   - none of the above in which case the backslash is ignored */\n\n        if ( cur == limit )\n          /* error (or to be ignored?) */\n          break;\n\n        switch ( *cur )\n        {\n          /* skip `special' escape */\n        case 'n':\n        case 'r':\n        case 't':\n        case 'b':\n        case 'f':\n        case '\\\\':\n        case '(':\n        case ')':\n          ++cur;\n          break;\n\n        default:\n          /* skip octal escape or ignore backslash */\n          for ( i = 0; i < 3 && cur < limit; ++i )\n          {\n            if ( !IS_OCTAL_DIGIT( *cur ) )\n              break;\n\n            ++cur;\n          }\n        }\n      }\n      else if ( c == '(' )\n        embed++;\n      else if ( c == ')' )\n      {\n        embed--;\n        if ( embed == 0 )\n        {\n          error = FT_Err_Ok;\n          break;\n        }\n      }\n    }\n\n    *acur = cur;\n\n    return error;\n  }\n\n\n  /* first character must be `<' */\n\n  static FT_Error\n  skip_string( FT_Byte*  *acur,\n               FT_Byte*   limit )\n  {\n    FT_Byte*  cur = *acur;\n    FT_Error  err =  FT_Err_Ok;\n\n\n    while ( ++cur < limit )\n    {\n      /* All whitespace characters are ignored. */\n      skip_spaces( &cur, limit );\n      if ( cur >= limit )\n        break;\n\n      if ( !IS_PS_XDIGIT( *cur ) )\n        break;\n    }\n\n    if ( cur < limit && *cur != '>' )\n    {\n      FT_ERROR(( \"skip_string: missing closing delimiter `>'\\n\" ));\n      err = FT_THROW( Invalid_File_Format );\n    }\n    else\n      cur++;\n\n    *acur = cur;\n    return err;\n  }\n\n\n  /* first character must be the opening brace that */\n  /* starts the procedure                           */\n\n  /* NB: [ and ] need not match:                    */\n  /* `/foo {[} def' is a valid PostScript fragment, */\n  /* even within a Type1 font                       */\n\n  static FT_Error\n  skip_procedure( FT_Byte*  *acur,\n                  FT_Byte*   limit )\n  {\n    FT_Byte*  cur;\n    FT_Int    embed = 0;\n    FT_Error  error = FT_Err_Ok;\n\n\n    FT_ASSERT( **acur == '{' );\n\n    for ( cur = *acur; cur < limit && error == FT_Err_Ok; ++cur )\n    {\n      switch ( *cur )\n      {\n      case '{':\n        ++embed;\n        break;\n\n      case '}':\n        --embed;\n        if ( embed == 0 )\n        {\n          ++cur;\n          goto end;\n        }\n        break;\n\n      case '(':\n        error = skip_literal_string( &cur, limit );\n        break;\n\n      case '<':\n        error = skip_string( &cur, limit );\n        break;\n\n      case '%':\n        skip_comment( &cur, limit );\n        break;\n      }\n    }\n\n  end:\n    if ( embed != 0 )\n      error = FT_THROW( Invalid_File_Format );\n\n    *acur = cur;\n\n    return error;\n  }\n\n\n  /***********************************************************************/\n  /*                                                                     */\n  /* All exported parsing routines handle leading whitespace and stop at */\n  /* the first character which isn't part of the just handled token.     */\n  /*                                                                     */\n  /***********************************************************************/\n\n\n  FT_LOCAL_DEF( void )\n  ps_parser_skip_PS_token( PS_Parser  parser )\n  {\n    /* Note: PostScript allows any non-delimiting, non-whitespace        */\n    /*       character in a name (PS Ref Manual, 3rd ed, p31).           */\n    /*       PostScript delimiters are (, ), <, >, [, ], {, }, /, and %. */\n\n    FT_Byte*  cur   = parser->cursor;\n    FT_Byte*  limit = parser->limit;\n    FT_Error  error = FT_Err_Ok;\n\n\n    skip_spaces( &cur, limit );             /* this also skips comments */\n    if ( cur >= limit )\n      goto Exit;\n\n    /* self-delimiting, single-character tokens */\n    if ( *cur == '[' || *cur == ']' )\n    {\n      cur++;\n      goto Exit;\n    }\n\n    /* skip balanced expressions (procedures and strings) */\n\n    if ( *cur == '{' )                              /* {...} */\n    {\n      error = skip_procedure( &cur, limit );\n      goto Exit;\n    }\n\n    if ( *cur == '(' )                              /* (...) */\n    {\n      error = skip_literal_string( &cur, limit );\n      goto Exit;\n    }\n\n    if ( *cur == '<' )                              /* <...> */\n    {\n      if ( cur + 1 < limit && *(cur + 1) == '<' )   /* << */\n      {\n        cur++;\n        cur++;\n      }\n      else\n        error = skip_string( &cur, limit );\n\n      goto Exit;\n    }\n\n    if ( *cur == '>' )\n    {\n      cur++;\n      if ( cur >= limit || *cur != '>' )             /* >> */\n      {\n        FT_ERROR(( \"ps_parser_skip_PS_token:\"\n                   \" unexpected closing delimiter `>'\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n      cur++;\n      goto Exit;\n    }\n\n    if ( *cur == '/' )\n      cur++;\n\n    /* anything else */\n    while ( cur < limit )\n    {\n      /* *cur might be invalid (e.g., ')' or '}'), but this   */\n      /* is handled by the test `cur == parser->cursor' below */\n      if ( IS_PS_DELIM( *cur ) )\n        break;\n\n      cur++;\n    }\n\n  Exit:\n    if ( cur < limit && cur == parser->cursor )\n    {\n      FT_ERROR(( \"ps_parser_skip_PS_token:\"\n                 \" current token is `%c' which is self-delimiting\\n\"\n                 \"                        \"\n                 \" but invalid at this point\\n\",\n                 *cur ));\n\n      error = FT_THROW( Invalid_File_Format );\n    }\n\n    parser->error  = error;\n    parser->cursor = cur;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  ps_parser_skip_spaces( PS_Parser  parser )\n  {\n    skip_spaces( &parser->cursor, parser->limit );\n  }\n\n\n  /* `token' here means either something between balanced delimiters */\n  /* or the next token; the delimiters are not removed.              */\n\n  FT_LOCAL_DEF( void )\n  ps_parser_to_token( PS_Parser  parser,\n                      T1_Token   token )\n  {\n    FT_Byte*  cur;\n    FT_Byte*  limit;\n    FT_Int    embed;\n\n\n    token->type  = T1_TOKEN_TYPE_NONE;\n    token->start = 0;\n    token->limit = 0;\n\n    /* first of all, skip leading whitespace */\n    ps_parser_skip_spaces( parser );\n\n    cur   = parser->cursor;\n    limit = parser->limit;\n\n    if ( cur >= limit )\n      return;\n\n    switch ( *cur )\n    {\n      /************* check for literal string *****************/\n    case '(':\n      token->type  = T1_TOKEN_TYPE_STRING;\n      token->start = cur;\n\n      if ( skip_literal_string( &cur, limit ) == FT_Err_Ok )\n        token->limit = cur;\n      break;\n\n      /************* check for programs/array *****************/\n    case '{':\n      token->type  = T1_TOKEN_TYPE_ARRAY;\n      token->start = cur;\n\n      if ( skip_procedure( &cur, limit ) == FT_Err_Ok )\n        token->limit = cur;\n      break;\n\n      /************* check for table/array ********************/\n      /* XXX: in theory we should also look for \"<<\"          */\n      /*      since this is semantically equivalent to \"[\";   */\n      /*      in practice it doesn't matter (?)               */\n    case '[':\n      token->type  = T1_TOKEN_TYPE_ARRAY;\n      embed        = 1;\n      token->start = cur++;\n\n      /* we need this to catch `[ ]' */\n      parser->cursor = cur;\n      ps_parser_skip_spaces( parser );\n      cur = parser->cursor;\n\n      while ( cur < limit && !parser->error )\n      {\n        /* XXX: this is wrong because it does not      */\n        /*      skip comments, procedures, and strings */\n        if ( *cur == '[' )\n          embed++;\n        else if ( *cur == ']' )\n        {\n          embed--;\n          if ( embed <= 0 )\n          {\n            token->limit = ++cur;\n            break;\n          }\n        }\n\n        parser->cursor = cur;\n        ps_parser_skip_PS_token( parser );\n        /* we need this to catch `[XXX ]' */\n        ps_parser_skip_spaces  ( parser );\n        cur = parser->cursor;\n      }\n      break;\n\n      /* ************ otherwise, it is any token **************/\n    default:\n      token->start = cur;\n      token->type  = ( *cur == '/' ? T1_TOKEN_TYPE_KEY : T1_TOKEN_TYPE_ANY );\n      ps_parser_skip_PS_token( parser );\n      cur = parser->cursor;\n      if ( !parser->error )\n        token->limit = cur;\n    }\n\n    if ( !token->limit )\n    {\n      token->start = 0;\n      token->type  = T1_TOKEN_TYPE_NONE;\n    }\n\n    parser->cursor = cur;\n  }\n\n\n  /* NB: `tokens' can be NULL if we only want to count */\n  /* the number of array elements                      */\n\n  FT_LOCAL_DEF( void )\n  ps_parser_to_token_array( PS_Parser  parser,\n                            T1_Token   tokens,\n                            FT_UInt    max_tokens,\n                            FT_Int*    pnum_tokens )\n  {\n    T1_TokenRec  master;\n\n\n    *pnum_tokens = -1;\n\n    /* this also handles leading whitespace */\n    ps_parser_to_token( parser, &master );\n\n    if ( master.type == T1_TOKEN_TYPE_ARRAY )\n    {\n      FT_Byte*  old_cursor = parser->cursor;\n      FT_Byte*  old_limit  = parser->limit;\n      T1_Token  cur        = tokens;\n      T1_Token  limit      = cur + max_tokens;\n\n\n      /* don't include outermost delimiters */\n      parser->cursor = master.start + 1;\n      parser->limit  = master.limit - 1;\n\n      while ( parser->cursor < parser->limit )\n      {\n        T1_TokenRec  token;\n\n\n        ps_parser_to_token( parser, &token );\n        if ( !token.type )\n          break;\n\n        if ( tokens != NULL && cur < limit )\n          *cur = token;\n\n        cur++;\n      }\n\n      *pnum_tokens = (FT_Int)( cur - tokens );\n\n      parser->cursor = old_cursor;\n      parser->limit  = old_limit;\n    }\n  }\n\n\n  /* first character must be a delimiter or a part of a number */\n  /* NB: `coords' can be NULL if we just want to skip the      */\n  /*     array; in this case we ignore `max_coords'            */\n\n  static FT_Int\n  ps_tocoordarray( FT_Byte*  *acur,\n                   FT_Byte*   limit,\n                   FT_Int     max_coords,\n                   FT_Short*  coords )\n  {\n    FT_Byte*  cur   = *acur;\n    FT_Int    count = 0;\n    FT_Byte   c, ender;\n\n\n    if ( cur >= limit )\n      goto Exit;\n\n    /* check for the beginning of an array; otherwise, only one number */\n    /* will be read                                                    */\n    c     = *cur;\n    ender = 0;\n\n    if ( c == '[' )\n      ender = ']';\n    else if ( c == '{' )\n      ender = '}';\n\n    if ( ender )\n      cur++;\n\n    /* now, read the coordinates */\n    while ( cur < limit )\n    {\n      FT_Short  dummy;\n      FT_Byte*  old_cur;\n\n\n      /* skip whitespace in front of data */\n      skip_spaces( &cur, limit );\n      if ( cur >= limit )\n        goto Exit;\n\n      if ( *cur == ender )\n      {\n        cur++;\n        break;\n      }\n\n      old_cur = cur;\n\n      if ( coords != NULL && count >= max_coords )\n        break;\n\n      /* call PS_Conv_ToFixed() even if coords == NULL */\n      /* to properly parse number at `cur'             */\n      *( coords != NULL ? &coords[count] : &dummy ) =\n        (FT_Short)( PS_Conv_ToFixed( &cur, limit, 0 ) >> 16 );\n\n      if ( old_cur == cur )\n      {\n        count = -1;\n        goto Exit;\n      }\n      else\n        count++;\n\n      if ( !ender )\n        break;\n    }\n\n  Exit:\n    *acur = cur;\n    return count;\n  }\n\n\n  /* first character must be a delimiter or a part of a number */\n  /* NB: `values' can be NULL if we just want to skip the      */\n  /*     array; in this case we ignore `max_values'            */\n\n  static FT_Int\n  ps_tofixedarray( FT_Byte*  *acur,\n                   FT_Byte*   limit,\n                   FT_Int     max_values,\n                   FT_Fixed*  values,\n                   FT_Int     power_ten )\n  {\n    FT_Byte*  cur   = *acur;\n    FT_Int    count = 0;\n    FT_Byte   c, ender;\n\n\n    if ( cur >= limit )\n      goto Exit;\n\n    /* Check for the beginning of an array.  Otherwise, only one number */\n    /* will be read.                                                    */\n    c     = *cur;\n    ender = 0;\n\n    if ( c == '[' )\n      ender = ']';\n    else if ( c == '{' )\n      ender = '}';\n\n    if ( ender )\n      cur++;\n\n    /* now, read the values */\n    while ( cur < limit )\n    {\n      FT_Fixed  dummy;\n      FT_Byte*  old_cur;\n\n\n      /* skip whitespace in front of data */\n      skip_spaces( &cur, limit );\n      if ( cur >= limit )\n        goto Exit;\n\n      if ( *cur == ender )\n      {\n        cur++;\n        break;\n      }\n\n      old_cur = cur;\n\n      if ( values != NULL && count >= max_values )\n        break;\n\n      /* call PS_Conv_ToFixed() even if coords == NULL */\n      /* to properly parse number at `cur'             */\n      *( values != NULL ? &values[count] : &dummy ) =\n        PS_Conv_ToFixed( &cur, limit, power_ten );\n\n      if ( old_cur == cur )\n      {\n        count = -1;\n        goto Exit;\n      }\n      else\n        count++;\n\n      if ( !ender )\n        break;\n    }\n\n  Exit:\n    *acur = cur;\n    return count;\n  }\n\n\n#if 0\n\n  static FT_String*\n  ps_tostring( FT_Byte**  cursor,\n               FT_Byte*   limit,\n               FT_Memory  memory )\n  {\n    FT_Byte*    cur = *cursor;\n    FT_PtrDist  len = 0;\n    FT_Int      count;\n    FT_String*  result;\n    FT_Error    error;\n\n\n    /* XXX: some stupid fonts have a `Notice' or `Copyright' string     */\n    /*      that simply doesn't begin with an opening parenthesis, even */\n    /*      though they have a closing one!  E.g. \"amuncial.pfb\"        */\n    /*                                                                  */\n    /*      We must deal with these ill-fated cases there.  Note that   */\n    /*      these fonts didn't work with the old Type 1 driver as the   */\n    /*      notice/copyright was not recognized as a valid string token */\n    /*      and made the old token parser commit errors.                */\n\n    while ( cur < limit && ( *cur == ' ' || *cur == '\\t' ) )\n      cur++;\n    if ( cur + 1 >= limit )\n      return 0;\n\n    if ( *cur == '(' )\n      cur++;  /* skip the opening parenthesis, if there is one */\n\n    *cursor = cur;\n    count   = 0;\n\n    /* then, count its length */\n    for ( ; cur < limit; cur++ )\n    {\n      if ( *cur == '(' )\n        count++;\n\n      else if ( *cur == ')' )\n      {\n        count--;\n        if ( count < 0 )\n          break;\n      }\n    }\n\n    len = cur - *cursor;\n    if ( cur >= limit || FT_ALLOC( result, len + 1 ) )\n      return 0;\n\n    /* now copy the string */\n    FT_MEM_COPY( result, *cursor, len );\n    result[len] = '\\0';\n    *cursor = cur;\n    return result;\n  }\n\n#endif /* 0 */\n\n\n  static int\n  ps_tobool( FT_Byte*  *acur,\n             FT_Byte*   limit )\n  {\n    FT_Byte*  cur    = *acur;\n    FT_Bool   result = 0;\n\n\n    /* return 1 if we find `true', 0 otherwise */\n    if ( cur + 3 < limit &&\n         cur[0] == 't'   &&\n         cur[1] == 'r'   &&\n         cur[2] == 'u'   &&\n         cur[3] == 'e'   )\n    {\n      result = 1;\n      cur   += 5;\n    }\n    else if ( cur + 4 < limit &&\n              cur[0] == 'f'   &&\n              cur[1] == 'a'   &&\n              cur[2] == 'l'   &&\n              cur[3] == 's'   &&\n              cur[4] == 'e'   )\n    {\n      result = 0;\n      cur   += 6;\n    }\n\n    *acur = cur;\n    return result;\n  }\n\n\n  /* load a simple field (i.e. non-table) into the current list of objects */\n\n  FT_LOCAL_DEF( FT_Error )\n  ps_parser_load_field( PS_Parser       parser,\n                        const T1_Field  field,\n                        void**          objects,\n                        FT_UInt         max_objects,\n                        FT_ULong*       pflags )\n  {\n    T1_TokenRec   token;\n    FT_Byte*      cur;\n    FT_Byte*      limit;\n    FT_UInt       count;\n    FT_UInt       idx;\n    FT_Error      error;\n    T1_FieldType  type;\n\n\n    /* this also skips leading whitespace */\n    ps_parser_to_token( parser, &token );\n    if ( !token.type )\n      goto Fail;\n\n    count = 1;\n    idx   = 0;\n    cur   = token.start;\n    limit = token.limit;\n\n    type = field->type;\n\n    /* we must detect arrays in /FontBBox */\n    if ( type == T1_FIELD_TYPE_BBOX )\n    {\n      T1_TokenRec  token2;\n      FT_Byte*     old_cur   = parser->cursor;\n      FT_Byte*     old_limit = parser->limit;\n\n\n      /* don't include delimiters */\n      parser->cursor = token.start + 1;\n      parser->limit  = token.limit - 1;\n\n      ps_parser_to_token( parser, &token2 );\n      parser->cursor = old_cur;\n      parser->limit  = old_limit;\n\n      if ( token2.type == T1_TOKEN_TYPE_ARRAY )\n      {\n        type = T1_FIELD_TYPE_MM_BBOX;\n        goto FieldArray;\n      }\n    }\n    else if ( token.type == T1_TOKEN_TYPE_ARRAY )\n    {\n      count = max_objects;\n\n    FieldArray:\n      /* if this is an array and we have no blend, an error occurs */\n      if ( max_objects == 0 )\n        goto Fail;\n\n      idx = 1;\n\n      /* don't include delimiters */\n      cur++;\n      limit--;\n    }\n\n    for ( ; count > 0; count--, idx++ )\n    {\n      FT_Byte*    q = (FT_Byte*)objects[idx] + field->offset;\n      FT_Long     val;\n      FT_String*  string;\n\n\n      skip_spaces( &cur, limit );\n\n      switch ( type )\n      {\n      case T1_FIELD_TYPE_BOOL:\n        val = ps_tobool( &cur, limit );\n        goto Store_Integer;\n\n      case T1_FIELD_TYPE_FIXED:\n        val = PS_Conv_ToFixed( &cur, limit, 0 );\n        goto Store_Integer;\n\n      case T1_FIELD_TYPE_FIXED_1000:\n        val = PS_Conv_ToFixed( &cur, limit, 3 );\n        goto Store_Integer;\n\n      case T1_FIELD_TYPE_INTEGER:\n        { FT_Bool ret = xyq_PS_Conv_ToInt( &cur, limit, &val );  /* XYQ 2007-10-10: abort if not a number*/\n\t\tif (!ret) break; }\n        /* fall through */\n\n      Store_Integer:\n        switch ( field->size )\n        {\n        case (8 / FT_CHAR_BIT):\n          *(FT_Byte*)q = (FT_Byte)val;\n          break;\n\n        case (16 / FT_CHAR_BIT):\n          *(FT_UShort*)q = (FT_UShort)val;\n          break;\n\n        case (32 / FT_CHAR_BIT):\n          *(FT_UInt32*)q = (FT_UInt32)val;\n          break;\n\n        default:                /* for 64-bit systems */\n          *(FT_Long*)q = val;\n        }\n        break;\n\n      case T1_FIELD_TYPE_STRING:\n      case T1_FIELD_TYPE_KEY:\n        {\n          FT_Memory  memory = parser->memory;\n          FT_UInt    len    = (FT_UInt)( limit - cur );\n\n\n          if ( cur >= limit )\n            break;\n\n          /* we allow both a string or a name   */\n          /* for cases like /FontName (foo) def */\n          if ( token.type == T1_TOKEN_TYPE_KEY )\n          {\n            /* don't include leading `/' */\n            len--;\n            cur++;\n          }\n          else if ( token.type == T1_TOKEN_TYPE_STRING )\n          {\n            /* don't include delimiting parentheses    */\n            /* XXX we don't handle <<...>> here        */\n            /* XXX should we convert octal escapes?    */\n            /*     if so, what encoding should we use? */\n            cur++;\n            len -= 2;\n          }\n          else\n          {\n            FT_ERROR(( \"ps_parser_load_field:\"\n                       \" expected a name or string\\n\"\n                       \"                     \"\n                       \" but found token of type %d instead\\n\",\n                       token.type ));\n            error = FT_THROW( Invalid_File_Format );\n            goto Exit;\n          }\n\n          /* for this to work (FT_String**)q must have been */\n          /* initialized to NULL                            */\n          if ( *(FT_String**)q != NULL )\n          {\n            FT_TRACE0(( \"ps_parser_load_field: overwriting field %s\\n\",\n                        field->ident ));\n            FT_FREE( *(FT_String**)q );\n            *(FT_String**)q = NULL;\n          }\n\n          if ( FT_ALLOC( string, len + 1 ) )\n            goto Exit;\n\n          FT_MEM_COPY( string, cur, len );\n          string[len] = 0;\n\n          *(FT_String**)q = string;\n        }\n        break;\n\n      case T1_FIELD_TYPE_BBOX:\n        {\n\t\t  // Add by Johnson, fix a Error #1: UNINITIALIZED READ. #testdoc 1282.pdf\n          FT_Fixed  temp[4] = {0,0,0,0};\n          FT_BBox*  bbox = (FT_BBox*)q;\n          FT_Int    result;\n\n\n          result = ps_tofixedarray( &cur, limit, 4, temp, 0 );\n\n          if ( result < 0 )\n          {\n            FT_ERROR(( \"ps_parser_load_field:\"\n                       \" expected four integers in bounding box\\n\" ));\n            error = FT_THROW( Invalid_File_Format );\n            goto Exit;\n          }\n\n          bbox->xMin = FT_RoundFix( temp[0] );\n          bbox->yMin = FT_RoundFix( temp[1] );\n          bbox->xMax = FT_RoundFix( temp[2] );\n          bbox->yMax = FT_RoundFix( temp[3] );\n        }\n        break;\n\n      case T1_FIELD_TYPE_MM_BBOX:\n        {\n          FT_Memory  memory = parser->memory;\n          FT_Fixed*  temp;\n          FT_Int     result;\n          FT_UInt    i;\n\n\n          if ( FT_NEW_ARRAY( temp, max_objects * 4 ) )\n            goto Exit;\n\n          for ( i = 0; i < 4; i++ )\n          {\n            result = ps_tofixedarray( &cur, limit, max_objects,\n                                      temp + i * max_objects, 0 );\n            if ( result < 0 )\n            {\n              FT_ERROR(( \"ps_parser_load_field:\"\n                         \" expected %d integers in the %s subarray\\n\"\n                         \"                     \"\n                         \" of /FontBBox in the /Blend dictionary\\n\",\n                         max_objects,\n                         i == 0 ? \"first\"\n                                : ( i == 1 ? \"second\"\n                                           : ( i == 2 ? \"third\"\n                                                      : \"fourth\" ) ) ));\n              error = FT_THROW( Invalid_File_Format );\n              goto Exit;\n            }\n\n            skip_spaces( &cur, limit );\n          }\n\n          for ( i = 0; i < max_objects; i++ )\n          {\n            FT_BBox*  bbox = (FT_BBox*)objects[i];\n\n\n            bbox->xMin = FT_RoundFix( temp[i                  ] );\n            bbox->yMin = FT_RoundFix( temp[i +     max_objects] );\n            bbox->xMax = FT_RoundFix( temp[i + 2 * max_objects] );\n            bbox->yMax = FT_RoundFix( temp[i + 3 * max_objects] );\n          }\n\n          FT_FREE( temp );\n        }\n        break;\n\n      default:\n        /* an error occurred */\n        goto Fail;\n      }\n    }\n\n#if 0  /* obsolete -- keep for reference */\n    if ( pflags )\n      *pflags |= 1L << field->flag_bit;\n#else\n    FT_UNUSED( pflags );\n#endif\n\n    error = FT_Err_Ok;\n\n  Exit:\n    return error;\n\n  Fail:\n    error = FT_THROW( Invalid_File_Format );\n    goto Exit;\n  }\n\n\n#define T1_MAX_TABLE_ELEMENTS  32\n\n\n  FT_LOCAL_DEF( FT_Error )\n  ps_parser_load_field_table( PS_Parser       parser,\n                              const T1_Field  field,\n                              void**          objects,\n                              FT_UInt         max_objects,\n                              FT_ULong*       pflags )\n  {\n    T1_TokenRec  elements[T1_MAX_TABLE_ELEMENTS];\n    T1_Token     token;\n    FT_Int       num_elements;\n    FT_Error     error = FT_Err_Ok;\n    FT_Byte*     old_cursor;\n    FT_Byte*     old_limit;\n    T1_FieldRec  fieldrec = *(T1_Field)field;\n\n\n    fieldrec.type = T1_FIELD_TYPE_INTEGER;\n    if ( field->type == T1_FIELD_TYPE_FIXED_ARRAY ||\n         field->type == T1_FIELD_TYPE_BBOX        )\n      fieldrec.type = T1_FIELD_TYPE_FIXED;\n\n    ps_parser_to_token_array( parser, elements,\n                              T1_MAX_TABLE_ELEMENTS, &num_elements );\n    if ( num_elements < 0 )\n    {\n      error = FT_ERR( Ignore );\n      goto Exit;\n    }\n    if ( (FT_UInt)num_elements > field->array_max )\n      num_elements = field->array_max;\n\n    old_cursor = parser->cursor;\n    old_limit  = parser->limit;\n\n    /* we store the elements count if necessary;           */\n    /* we further assume that `count_offset' can't be zero */\n    if ( field->type != T1_FIELD_TYPE_BBOX && field->count_offset != 0 )\n      *(FT_Byte*)( (FT_Byte*)objects[0] + field->count_offset ) =\n        (FT_Byte)num_elements;\n\n    /* we now load each element, adjusting the field.offset on each one */\n    token = elements;\n    for ( ; num_elements > 0; num_elements--, token++ )\n    {\n      parser->cursor = token->start;\n      parser->limit  = token->limit;\n      ps_parser_load_field( parser, &fieldrec, objects, max_objects, 0 );\n      fieldrec.offset += fieldrec.size;\n    }\n\n#if 0  /* obsolete -- keep for reference */\n    if ( pflags )\n      *pflags |= 1L << field->flag_bit;\n#else\n    FT_UNUSED( pflags );\n#endif\n\n    parser->cursor = old_cursor;\n    parser->limit  = old_limit;\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Long )\n  ps_parser_to_int( PS_Parser  parser )\n  {\n    ps_parser_skip_spaces( parser );\n    return PS_Conv_ToInt( &parser->cursor, parser->limit );\n  }\n\n\n  /* first character must be `<' if `delimiters' is non-zero */\n\n  FT_LOCAL_DEF( FT_Error )\n  ps_parser_to_bytes( PS_Parser  parser,\n                      FT_Byte*   bytes,\n                      FT_Offset  max_bytes,\n                      FT_Long*   pnum_bytes,\n                      FT_Bool    delimiters )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_Byte*  cur;\n\n\n    ps_parser_skip_spaces( parser );\n    cur = parser->cursor;\n\n    if ( cur >= parser->limit )\n      goto Exit;\n\n    if ( delimiters )\n    {\n      if ( *cur != '<' )\n      {\n        FT_ERROR(( \"ps_parser_to_bytes: Missing starting delimiter `<'\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n\n      cur++;\n    }\n\n    *pnum_bytes = PS_Conv_ASCIIHexDecode( &cur,\n                                          parser->limit,\n                                          bytes,\n                                          max_bytes );\n\n    if ( delimiters )\n    {\n      if ( cur < parser->limit && *cur != '>' )\n      {\n        FT_ERROR(( \"ps_parser_to_bytes: Missing closing delimiter `>'\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n\n      cur++;\n    }\n\n    parser->cursor = cur;\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Fixed )\n  ps_parser_to_fixed( PS_Parser  parser,\n                      FT_Int     power_ten )\n  {\n    ps_parser_skip_spaces( parser );\n    return PS_Conv_ToFixed( &parser->cursor, parser->limit, power_ten );\n  }\n\n\n  FT_LOCAL_DEF( FT_Int )\n  ps_parser_to_coord_array( PS_Parser  parser,\n                            FT_Int     max_coords,\n                            FT_Short*  coords )\n  {\n    ps_parser_skip_spaces( parser );\n    return ps_tocoordarray( &parser->cursor, parser->limit,\n                            max_coords, coords );\n  }\n\n\n  FT_LOCAL_DEF( FT_Int )\n  ps_parser_to_fixed_array( PS_Parser  parser,\n                            FT_Int     max_values,\n                            FT_Fixed*  values,\n                            FT_Int     power_ten )\n  {\n    ps_parser_skip_spaces( parser );\n    return ps_tofixedarray( &parser->cursor, parser->limit,\n                            max_values, values, power_ten );\n  }\n\n\n#if 0\n\n  FT_LOCAL_DEF( FT_String* )\n  T1_ToString( PS_Parser  parser )\n  {\n    return ps_tostring( &parser->cursor, parser->limit, parser->memory );\n  }\n\n\n  FT_LOCAL_DEF( FT_Bool )\n  T1_ToBool( PS_Parser  parser )\n  {\n    return ps_tobool( &parser->cursor, parser->limit );\n  }\n\n#endif /* 0 */\n\n\n  FT_LOCAL_DEF( void )\n  ps_parser_init( PS_Parser  parser,\n                  FT_Byte*   base,\n                  FT_Byte*   limit,\n                  FT_Memory  memory )\n  {\n    parser->error  = FT_Err_Ok;\n    parser->base   = base;\n    parser->limit  = limit;\n    parser->cursor = base;\n    parser->memory = memory;\n    parser->funcs  = ps_parser_funcs;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  ps_parser_done( PS_Parser  parser )\n  {\n    FT_UNUSED( parser );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                            T1 BUILDER                         *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    t1_builder_init                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initializes a given glyph builder.                                 */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    builder :: A pointer to the glyph builder to initialize.           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face    :: The current face object.                                */\n  /*                                                                       */\n  /*    size    :: The current size object.                                */\n  /*                                                                       */\n  /*    glyph   :: The current glyph object.                               */\n  /*                                                                       */\n  /*    hinting :: Whether hinting should be applied.                      */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  t1_builder_init( T1_Builder    builder,\n                   FT_Face       face,\n                   FT_Size       size,\n                   FT_GlyphSlot  glyph,\n                   FT_Bool       hinting )\n  {\n    builder->parse_state = T1_Parse_Start;\n    builder->load_points = 1;\n\n    builder->face   = face;\n    builder->glyph  = glyph;\n    builder->memory = face->memory;\n\n    if ( glyph )\n    {\n      FT_GlyphLoader  loader = glyph->internal->loader;\n\n\n      builder->loader  = loader;\n      builder->base    = &loader->base.outline;\n      builder->current = &loader->current.outline;\n      FT_GlyphLoader_Rewind( loader );\n\n      builder->hints_globals = size->internal;\n      builder->hints_funcs   = 0;\n\n      if ( hinting )\n        builder->hints_funcs = glyph->internal->glyph_hints;\n    }\n\n    builder->pos_x = 0;\n    builder->pos_y = 0;\n\n    builder->left_bearing.x = 0;\n    builder->left_bearing.y = 0;\n    builder->advance.x      = 0;\n    builder->advance.y      = 0;\n\n    builder->funcs = t1_builder_funcs;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    t1_builder_done                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Finalizes a given glyph builder.  Its contents can still be used   */\n  /*    after the call, but the function saves important information       */\n  /*    within the corresponding glyph slot.                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    builder :: A pointer to the glyph builder to finalize.             */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  t1_builder_done( T1_Builder  builder )\n  {\n    FT_GlyphSlot  glyph = builder->glyph;\n\n\n    if ( glyph )\n      glyph->outline = *builder->base;\n  }\n\n\n  /* check that there is enough space for `count' more points */\n  FT_LOCAL_DEF( FT_Error )\n  t1_builder_check_points( T1_Builder  builder,\n                           FT_Int      count )\n  {\n    return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 );\n  }\n\n\n  /* add a new point, do not check space */\n  FT_LOCAL_DEF( void )\n  t1_builder_add_point( T1_Builder  builder,\n                        FT_Pos      x,\n                        FT_Pos      y,\n                        FT_Byte     flag )\n  {\n    FT_Outline*  outline = builder->current;\n\n\n    if ( builder->load_points )\n    {\n      FT_Vector*  point   = outline->points + outline->n_points;\n      FT_Byte*    control = (FT_Byte*)outline->tags + outline->n_points;\n\n\n      point->x = FIXED_TO_INT( x );\n      point->y = FIXED_TO_INT( y );\n      *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC );\n    }\n    outline->n_points++;\n  }\n\n\n  /* check space for a new on-curve point, then add it */\n  FT_LOCAL_DEF( FT_Error )\n  t1_builder_add_point1( T1_Builder  builder,\n                         FT_Pos      x,\n                         FT_Pos      y )\n  {\n    FT_Error  error;\n\n\n    error = t1_builder_check_points( builder, 1 );\n    if ( !error )\n      t1_builder_add_point( builder, x, y, 1 );\n\n    return error;\n  }\n\n\n  /* check space for a new contour, then add it */\n  FT_LOCAL_DEF( FT_Error )\n  t1_builder_add_contour( T1_Builder  builder )\n  {\n    FT_Outline*  outline = builder->current;\n    FT_Error     error;\n\n\n    /* this might happen in invalid fonts */\n    if ( !outline )\n    {\n      FT_ERROR(( \"t1_builder_add_contour: no outline to add points to\\n\" ));\n      return FT_THROW( Invalid_File_Format );\n    }\n\n    if ( !builder->load_points )\n    {\n      outline->n_contours++;\n      return FT_Err_Ok;\n    }\n\n    error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 );\n    if ( !error )\n    {\n      if ( outline->n_contours > 0 )\n        outline->contours[outline->n_contours - 1] =\n          (short)( outline->n_points - 1 );\n\n      outline->n_contours++;\n    }\n\n    return error;\n  }\n\n\n  /* if a path was begun, add its first on-curve point */\n  FT_LOCAL_DEF( FT_Error )\n  t1_builder_start_point( T1_Builder  builder,\n                          FT_Pos      x,\n                          FT_Pos      y )\n  {\n    FT_Error  error = FT_ERR( Invalid_File_Format );\n\n\n    /* test whether we are building a new contour */\n\n    if ( builder->parse_state == T1_Parse_Have_Path )\n      error = FT_Err_Ok;\n    else\n    {\n      builder->parse_state = T1_Parse_Have_Path;\n      error = t1_builder_add_contour( builder );\n      if ( !error )\n        error = t1_builder_add_point1( builder, x, y );\n    }\n\n    return error;\n  }\n\n\n  /* close the current contour */\n  FT_LOCAL_DEF( void )\n  t1_builder_close_contour( T1_Builder  builder )\n  {\n    FT_Outline*  outline = builder->current;\n    FT_Int       first;\n\n\n    if ( !outline )\n      return;\n\n    first = outline->n_contours <= 1\n            ? 0 : outline->contours[outline->n_contours - 2] + 1;\n\n    /* We must not include the last point in the path if it */\n    /* is located on the first point.                       */\n    if ( outline->n_points > 1 )\n    {\n      FT_Vector*  p1      = outline->points + first;\n      FT_Vector*  p2      = outline->points + outline->n_points - 1;\n      FT_Byte*    control = (FT_Byte*)outline->tags + outline->n_points - 1;\n\n\n      /* `delete' last point only if it coincides with the first */\n      /* point and it is not a control point (which can happen). */\n      if ( p1->x == p2->x && p1->y == p2->y )\n        if ( *control == FT_CURVE_TAG_ON )\n          outline->n_points--;\n    }\n\n    if ( outline->n_contours > 0 )\n    {\n      /* Don't add contours only consisting of one point, i.e.,  */\n      /* check whether the first and the last point is the same. */\n      if ( first == outline->n_points - 1 )\n      {\n        outline->n_contours--;\n        outline->n_points--;\n      }\n      else\n        outline->contours[outline->n_contours - 1] =\n          (short)( outline->n_points - 1 );\n    }\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                            OTHER                              *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL_DEF( void )\n  t1_decrypt( FT_Byte*   buffer,\n              FT_Offset  length,\n              FT_UShort  seed )\n  {\n    PS_Conv_EexecDecode( &buffer,\n                         buffer + length,\n                         buffer,\n                         length,\n                         &seed );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psobjs.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  psobjs.h                                                               */\n/*                                                                         */\n/*    Auxiliary functions for PostScript fonts (specification).            */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PSOBJS_H__\n#define __PSOBJS_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/psaux.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                             T1_TABLE                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  FT_CALLBACK_TABLE\n  const PS_Table_FuncsRec    ps_table_funcs;\n\n  FT_CALLBACK_TABLE\n  const PS_Parser_FuncsRec   ps_parser_funcs;\n\n  FT_CALLBACK_TABLE\n  const T1_Builder_FuncsRec  t1_builder_funcs;\n\n\n  FT_LOCAL( FT_Error )\n  ps_table_new( PS_Table   table,\n                FT_Int     count,\n                FT_Memory  memory );\n\n  FT_LOCAL( FT_Error )\n  ps_table_add( PS_Table    table,\n                FT_Int      idx,\n                void*       object,\n                FT_PtrDist  length );\n\n  FT_LOCAL( void )\n  ps_table_done( PS_Table  table );\n\n\n  FT_LOCAL( void )\n  ps_table_release( PS_Table  table );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                            T1 PARSER                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  FT_LOCAL( void )\n  ps_parser_skip_spaces( PS_Parser  parser );\n\n  FT_LOCAL( void )\n  ps_parser_skip_PS_token( PS_Parser  parser );\n\n  FT_LOCAL( void )\n  ps_parser_to_token( PS_Parser  parser,\n                      T1_Token   token );\n\n  FT_LOCAL( void )\n  ps_parser_to_token_array( PS_Parser  parser,\n                            T1_Token   tokens,\n                            FT_UInt    max_tokens,\n                            FT_Int*    pnum_tokens );\n\n  FT_LOCAL( FT_Error )\n  ps_parser_load_field( PS_Parser       parser,\n                        const T1_Field  field,\n                        void**          objects,\n                        FT_UInt         max_objects,\n                        FT_ULong*       pflags );\n\n  FT_LOCAL( FT_Error )\n  ps_parser_load_field_table( PS_Parser       parser,\n                              const T1_Field  field,\n                              void**          objects,\n                              FT_UInt         max_objects,\n                              FT_ULong*       pflags );\n\n  FT_LOCAL( FT_Long )\n  ps_parser_to_int( PS_Parser  parser );\n\n\n  FT_LOCAL( FT_Error )\n  ps_parser_to_bytes( PS_Parser  parser,\n                      FT_Byte*   bytes,\n                      FT_Offset  max_bytes,\n                      FT_Long*   pnum_bytes,\n                      FT_Bool    delimiters );\n\n\n  FT_LOCAL( FT_Fixed )\n  ps_parser_to_fixed( PS_Parser  parser,\n                      FT_Int     power_ten );\n\n\n  FT_LOCAL( FT_Int )\n  ps_parser_to_coord_array( PS_Parser  parser,\n                            FT_Int     max_coords,\n                            FT_Short*  coords );\n\n  FT_LOCAL( FT_Int )\n  ps_parser_to_fixed_array( PS_Parser  parser,\n                            FT_Int     max_values,\n                            FT_Fixed*  values,\n                            FT_Int     power_ten );\n\n\n  FT_LOCAL( void )\n  ps_parser_init( PS_Parser  parser,\n                  FT_Byte*   base,\n                  FT_Byte*   limit,\n                  FT_Memory  memory );\n\n  FT_LOCAL( void )\n  ps_parser_done( PS_Parser  parser );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                            T1 BUILDER                         *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL( void )\n  t1_builder_init( T1_Builder    builder,\n                   FT_Face       face,\n                   FT_Size       size,\n                   FT_GlyphSlot  glyph,\n                   FT_Bool       hinting );\n\n  FT_LOCAL( void )\n  t1_builder_done( T1_Builder  builder );\n\n  FT_LOCAL( FT_Error )\n  t1_builder_check_points( T1_Builder  builder,\n                           FT_Int      count );\n\n  FT_LOCAL( void )\n  t1_builder_add_point( T1_Builder  builder,\n                        FT_Pos      x,\n                        FT_Pos      y,\n                        FT_Byte     flag );\n\n  FT_LOCAL( FT_Error )\n  t1_builder_add_point1( T1_Builder  builder,\n                         FT_Pos      x,\n                         FT_Pos      y );\n\n  FT_LOCAL( FT_Error )\n  t1_builder_add_contour( T1_Builder  builder );\n\n\n  FT_LOCAL( FT_Error )\n  t1_builder_start_point( T1_Builder  builder,\n                          FT_Pos      x,\n                          FT_Pos      y );\n\n\n  FT_LOCAL( void )\n  t1_builder_close_contour( T1_Builder  builder );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                            OTHER                              *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL( void )\n  t1_decrypt( FT_Byte*   buffer,\n              FT_Offset  length,\n              FT_UShort  seed );\n\n\nFT_END_HEADER\n\n#endif /* __PSOBJS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1cmap.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1cmap.c                                                               */\n/*                                                                         */\n/*    Type 1 character map support (body).                                 */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2006, 2007, 2012 by                              */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"t1cmap.h\"\n\n#include \"../../include/freetype/internal/ftdebug.h\"\n\n#include \"psauxerr.h\"\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****          TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  t1_cmap_std_init( T1_CMapStd  cmap,\n                    FT_Int      is_expert )\n  {\n    T1_Face             face    = (T1_Face)FT_CMAP_FACE( cmap );\n    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;\n\n\n    cmap->num_glyphs    = face->type1.num_glyphs;\n    cmap->glyph_names   = (const char* const*)face->type1.glyph_names;\n    cmap->sid_to_string = psnames->adobe_std_strings;\n    cmap->code_to_sid   = is_expert ? psnames->adobe_expert_encoding\n                                    : psnames->adobe_std_encoding;\n\n    FT_ASSERT( cmap->code_to_sid != NULL );\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  t1_cmap_std_done( T1_CMapStd  cmap )\n  {\n    cmap->num_glyphs    = 0;\n    cmap->glyph_names   = NULL;\n    cmap->sid_to_string = NULL;\n    cmap->code_to_sid   = NULL;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  t1_cmap_std_char_index( T1_CMapStd  cmap,\n                          FT_UInt32   char_code )\n  {\n    FT_UInt  result = 0;\n\n\n    if ( char_code < 256 )\n    {\n      FT_UInt      code, n;\n      const char*  glyph_name;\n\n\n      /* convert character code to Adobe SID string */\n      code       = cmap->code_to_sid[char_code];\n      glyph_name = cmap->sid_to_string( code );\n\n      /* look for the corresponding glyph name */\n      for ( n = 0; n < cmap->num_glyphs; n++ )\n      {\n        const char* gname = cmap->glyph_names[n];\n\n\n        if ( gname && gname[0] == glyph_name[0]  &&\n             ft_strcmp( gname, glyph_name ) == 0 )\n        {\n          result = n;\n          break;\n        }\n      }\n    }\n\n    return result;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  t1_cmap_std_char_next( T1_CMapStd   cmap,\n                         FT_UInt32   *pchar_code )\n  {\n    FT_UInt    result    = 0;\n    FT_UInt32  char_code = *pchar_code + 1;\n\n\n    while ( char_code < 256 )\n    {\n      result = t1_cmap_std_char_index( cmap, char_code );\n      if ( result != 0 )\n        goto Exit;\n\n      char_code++;\n    }\n    char_code = 0;\n\n  Exit:\n    *pchar_code = char_code;\n    return result;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  t1_cmap_standard_init( T1_CMapStd  cmap, FT_Pointer unused)\n  {\n    t1_cmap_std_init( cmap, 0 );\n    return 0;\n  }\n\n\n  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec\n  t1_cmap_standard_class_rec =\n  {\n    sizeof ( T1_CMapStdRec ),\n\n    (FT_CMap_InitFunc)     t1_cmap_standard_init,\n    (FT_CMap_DoneFunc)     t1_cmap_std_done,\n    (FT_CMap_CharIndexFunc)t1_cmap_std_char_index,\n    (FT_CMap_CharNextFunc) t1_cmap_std_char_next,\n\n    NULL, NULL, NULL, NULL, NULL\n  };\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  t1_cmap_expert_init( T1_CMapStd  cmap, FT_Pointer unused )\n  {\n    t1_cmap_std_init( cmap, 1 );\n    return 0;\n  }\n\n  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec\n  t1_cmap_expert_class_rec =\n  {\n    sizeof ( T1_CMapStdRec ),\n\n    (FT_CMap_InitFunc)     t1_cmap_expert_init,\n    (FT_CMap_DoneFunc)     t1_cmap_std_done,\n    (FT_CMap_CharIndexFunc)t1_cmap_std_char_index,\n    (FT_CMap_CharNextFunc) t1_cmap_std_char_next,\n\n    NULL, NULL, NULL, NULL, NULL\n  };\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    TYPE1 CUSTOM ENCODING CMAP                 *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  t1_cmap_custom_init( T1_CMapCustom  cmap, FT_Pointer unused)\n  {\n    T1_Face      face     = (T1_Face)FT_CMAP_FACE( cmap );\n    T1_Encoding  encoding = &face->type1.encoding;\n\n\n    cmap->first   = encoding->code_first;\n    cmap->count   = (FT_UInt)( encoding->code_last - cmap->first );\n    cmap->indices = encoding->char_index;\n\n    FT_ASSERT( cmap->indices != NULL );\n    FT_ASSERT( encoding->code_first <= encoding->code_last );\n\n    return 0;\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  t1_cmap_custom_done( T1_CMapCustom  cmap )\n  {\n    cmap->indices = NULL;\n    cmap->first   = 0;\n    cmap->count   = 0;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  t1_cmap_custom_char_index( T1_CMapCustom  cmap,\n                             FT_UInt32      char_code )\n  {\n    FT_UInt    result = 0;\n\n\n    if ( ( char_code >= cmap->first )                  &&\n         ( char_code < ( cmap->first + cmap->count ) ) )\n      result = cmap->indices[char_code];\n\n    return result;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  t1_cmap_custom_char_next( T1_CMapCustom  cmap,\n                            FT_UInt32     *pchar_code )\n  {\n    FT_UInt    result = 0;\n    FT_UInt32  char_code = *pchar_code;\n\n\n    ++char_code;\n\n    if ( char_code < cmap->first )\n      char_code = cmap->first;\n\n    for ( ; char_code < ( cmap->first + cmap->count ); char_code++ )\n    {\n      result = cmap->indices[char_code];\n      if ( result != 0 )\n        goto Exit;\n    }\n\n    char_code = 0;\n\n  Exit:\n    *pchar_code = char_code;\n    return result;\n  }\n\n\n  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec\n  t1_cmap_custom_class_rec =\n  {\n    sizeof ( T1_CMapCustomRec ),\n\n    (FT_CMap_InitFunc)     t1_cmap_custom_init,\n    (FT_CMap_DoneFunc)     t1_cmap_custom_done,\n    (FT_CMap_CharIndexFunc)t1_cmap_custom_char_index,\n    (FT_CMap_CharNextFunc) t1_cmap_custom_char_next,\n\n    NULL, NULL, NULL, NULL, NULL\n  };\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****            TYPE1 SYNTHETIC UNICODE ENCODING CMAP              *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_CALLBACK_DEF( const char * )\n  psaux_get_glyph_name( T1_Face  face,\n                        FT_UInt  idx )\n  {\n    return face->type1.glyph_names[idx];\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  t1_cmap_unicode_init( PS_Unicodes  unicodes, FT_Pointer unused )\n  {\n    T1_Face             face    = (T1_Face)FT_CMAP_FACE( unicodes );\n    FT_Memory           memory  = FT_FACE_MEMORY( face );\n    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;\n\n\n    return psnames->unicodes_init( memory,\n                                   unicodes,\n                                   face->type1.num_glyphs,\n                                   (PS_GetGlyphNameFunc)&psaux_get_glyph_name,\n                                   (PS_FreeGlyphNameFunc)NULL,\n                                   (FT_Pointer)face );\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  t1_cmap_unicode_done( PS_Unicodes  unicodes )\n  {\n    FT_Face    face   = FT_CMAP_FACE( unicodes );\n    FT_Memory  memory = FT_FACE_MEMORY( face );\n\n\n    FT_FREE( unicodes->maps );\n    unicodes->num_maps = 0;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  t1_cmap_unicode_char_index( PS_Unicodes  unicodes,\n                              FT_UInt32    char_code )\n  {\n    T1_Face             face    = (T1_Face)FT_CMAP_FACE( unicodes );\n    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;\n\n\n    return psnames->unicodes_char_index( unicodes, char_code );\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  t1_cmap_unicode_char_next( PS_Unicodes  unicodes,\n                             FT_UInt32   *pchar_code )\n  {\n    T1_Face             face    = (T1_Face)FT_CMAP_FACE( unicodes );\n    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;\n\n\n    return psnames->unicodes_char_next( unicodes, pchar_code );\n  }\n\n\n  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec\n  t1_cmap_unicode_class_rec =\n  {\n    sizeof ( PS_UnicodesRec ),\n\n    (FT_CMap_InitFunc)     t1_cmap_unicode_init,\n    (FT_CMap_DoneFunc)     t1_cmap_unicode_done,\n    (FT_CMap_CharIndexFunc)t1_cmap_unicode_char_index,\n    (FT_CMap_CharNextFunc) t1_cmap_unicode_char_next,\n\n    NULL, NULL, NULL, NULL, NULL\n  };\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1cmap.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1cmap.h                                                               */\n/*                                                                         */\n/*    Type 1 character map support (specification).                        */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2006 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __T1CMAP_H__\n#define __T1CMAP_H__\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/internal/t1types.h\"\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****          TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* standard (and expert) encoding cmaps */\n  typedef struct T1_CMapStdRec_*  T1_CMapStd;\n\n  typedef struct  T1_CMapStdRec_\n  {\n    FT_CMapRec                cmap;\n\n    const FT_UShort*          code_to_sid;\n    PS_Adobe_Std_StringsFunc  sid_to_string;\n\n    FT_UInt                   num_glyphs;\n    const char* const*        glyph_names;\n\n  } T1_CMapStdRec;\n\n\n  FT_CALLBACK_TABLE const FT_CMap_ClassRec\n  t1_cmap_standard_class_rec;\n\n  FT_CALLBACK_TABLE const FT_CMap_ClassRec\n  t1_cmap_expert_class_rec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                  TYPE1 CUSTOM ENCODING CMAP                   *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct T1_CMapCustomRec_*  T1_CMapCustom;\n\n  typedef struct  T1_CMapCustomRec_\n  {\n    FT_CMapRec  cmap;\n    FT_UInt     first;\n    FT_UInt     count;\n    FT_UShort*  indices;\n\n  } T1_CMapCustomRec;\n\n\n  FT_CALLBACK_TABLE const FT_CMap_ClassRec\n  t1_cmap_custom_class_rec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****             TYPE1 SYNTHETIC UNICODE ENCODING CMAP             *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* unicode (synthetic) cmaps */\n\n  FT_CALLBACK_TABLE const FT_CMap_ClassRec\n  t1_cmap_unicode_class_rec;\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __T1CMAP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1decode.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1decode.c                                                             */\n/*                                                                         */\n/*    PostScript Type 1 decoding routines (body).                          */\n/*                                                                         */\n/*  Copyright 2000-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftcalc.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/pshints.h\"\n#include \"../../include/freetype/ftoutln.h\"\n\n#include \"t1decode.h\"\n#include \"psobjs.h\"\n\n#include \"psauxerr.h\"\n\n/* ensure proper sign extension */\n#define Fix2Int( f )  ( (FT_Int)(FT_Short)( (f) >> 16 ) )\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_t1decode\n\n\n  typedef enum  T1_Operator_\n  {\n    op_none = 0,\n    op_endchar,\n    op_hsbw,\n    op_seac,\n    op_sbw,\n    op_closepath,\n    op_hlineto,\n    op_hmoveto,\n    op_hvcurveto,\n    op_rlineto,\n    op_rmoveto,\n    op_rrcurveto,\n    op_vhcurveto,\n    op_vlineto,\n    op_vmoveto,\n    op_dotsection,\n    op_hstem,\n    op_hstem3,\n    op_vstem,\n    op_vstem3,\n    op_div,\n    op_callothersubr,\n    op_callsubr,\n    op_pop,\n    op_return,\n    op_setcurrentpoint,\n    op_unknown15,\n\n    op_max    /* never remove this one */\n\n  } T1_Operator;\n\n\n  static\n  const FT_Int  t1_args_count[op_max] =\n  {\n    0, /* none */\n    0, /* endchar */\n    2, /* hsbw */\n    5, /* seac */\n    4, /* sbw */\n    0, /* closepath */\n    1, /* hlineto */\n    1, /* hmoveto */\n    4, /* hvcurveto */\n    2, /* rlineto */\n    2, /* rmoveto */\n    6, /* rrcurveto */\n    4, /* vhcurveto */\n    1, /* vlineto */\n    1, /* vmoveto */\n    0, /* dotsection */\n    2, /* hstem */\n    6, /* hstem3 */\n    2, /* vstem */\n    6, /* vstem3 */\n    2, /* div */\n   -1, /* callothersubr */\n    1, /* callsubr */\n    0, /* pop */\n    0, /* return */\n    2, /* setcurrentpoint */\n    2  /* opcode 15 (undocumented and obsolete) */\n  };\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    t1_lookup_glyph_by_stdcharcode                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Looks up a given glyph by its StandardEncoding charcode.  Used to  */\n  /*    implement the SEAC Type 1 operator.                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face     :: The current face object.                               */\n  /*                                                                       */\n  /*    charcode :: The character code to look for.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A glyph index in the font face.  Returns -1 if the corresponding   */\n  /*    glyph wasn't found.                                                */\n  /*                                                                       */\n  static FT_Int\n  t1_lookup_glyph_by_stdcharcode( T1_Decoder  decoder,\n                                  FT_Int      charcode )\n  {\n    FT_UInt             n;\n    const FT_String*    glyph_name;\n    FT_Service_PsCMaps  psnames = decoder->psnames;\n\n\n    /* check range of standard char code */\n    if ( charcode < 0 || charcode > 255 )\n      return -1;\n\n    glyph_name = psnames->adobe_std_strings(\n                   psnames->adobe_std_encoding[charcode]);\n\n    for ( n = 0; n < decoder->num_glyphs; n++ )\n    {\n      FT_String*  name = (FT_String*)decoder->glyph_names[n];\n\n\n      if ( name                               &&\n           name[0] == glyph_name[0]           &&\n           ft_strcmp( name, glyph_name ) == 0 )\n        return n;\n    }\n\n    return -1;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    t1operator_seac                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Implements the `seac' Type 1 operator for a Type 1 decoder.        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    decoder :: The current CID decoder.                                */\n  /*                                                                       */\n  /*    asb     :: The accent's side bearing.                              */\n  /*                                                                       */\n  /*    adx     :: The horizontal offset of the accent.                    */\n  /*                                                                       */\n  /*    ady     :: The vertical offset of the accent.                      */\n  /*                                                                       */\n  /*    bchar   :: The base character's StandardEncoding charcode.         */\n  /*                                                                       */\n  /*    achar   :: The accent character's StandardEncoding charcode.       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  static FT_Error\n  t1operator_seac( T1_Decoder  decoder,\n                   FT_Pos      asb,\n                   FT_Pos      adx,\n                   FT_Pos      ady,\n                   FT_Int      bchar,\n                   FT_Int      achar )\n  {\n    FT_Error     error;\n    FT_Int       bchar_index, achar_index;\n#if 0\n    FT_Int       n_base_points;\n    FT_Outline*  base = decoder->builder.base;\n#endif\n    FT_Vector    left_bearing, advance;\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    T1_Face      face  = (T1_Face)decoder->builder.face;\n#endif\n\n\n    if ( decoder->seac )\n    {\n      FT_ERROR(( \"t1operator_seac: invalid nested seac\\n\" ));\n      return FT_THROW( Syntax_Error );\n    }\n\n    if ( decoder->builder.metrics_only )\n    {\n      FT_ERROR(( \"t1operator_seac: unexpected seac\\n\" ));\n      return FT_THROW( Syntax_Error );\n    }\n\n    /* seac weirdness */\n    adx += decoder->builder.left_bearing.x;\n\n    /* `glyph_names' is set to 0 for CID fonts which do not */\n    /* include an encoding.  How can we deal with these?    */\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    if ( decoder->glyph_names == 0                   &&\n         !face->root.internal->incremental_interface )\n#else\n    if ( decoder->glyph_names == 0 )\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n    {\n      FT_ERROR(( \"t1operator_seac:\"\n                 \" glyph names table not available in this font\\n\" ));\n      return FT_THROW( Syntax_Error );\n    }\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    if ( face->root.internal->incremental_interface )\n    {\n      /* the caller must handle the font encoding also */\n      bchar_index = bchar;\n      achar_index = achar;\n    }\n    else\n#endif\n    {\n      bchar_index = t1_lookup_glyph_by_stdcharcode( decoder, bchar );\n      achar_index = t1_lookup_glyph_by_stdcharcode( decoder, achar );\n    }\n\n    if ( bchar_index < 0 || achar_index < 0 )\n    {\n      FT_ERROR(( \"t1operator_seac:\"\n                 \" invalid seac character code arguments\\n\" ));\n      return FT_THROW( Syntax_Error );\n    }\n\n    /* if we are trying to load a composite glyph, do not load the */\n    /* accent character and return the array of subglyphs.         */\n    if ( decoder->builder.no_recurse )\n    {\n      FT_GlyphSlot    glyph  = (FT_GlyphSlot)decoder->builder.glyph;\n      FT_GlyphLoader  loader = glyph->internal->loader;\n      FT_SubGlyph     subg;\n\n\n      /* reallocate subglyph array if necessary */\n      error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 );\n      if ( error )\n        goto Exit;\n\n      subg = loader->current.subglyphs;\n\n      /* subglyph 0 = base character */\n      subg->index = bchar_index;\n      subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES |\n                    FT_SUBGLYPH_FLAG_USE_MY_METRICS;\n      subg->arg1  = 0;\n      subg->arg2  = 0;\n      subg++;\n\n      /* subglyph 1 = accent character */\n      subg->index = achar_index;\n      subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES;\n      subg->arg1  = (FT_Int)FIXED_TO_INT( adx - asb );\n      subg->arg2  = (FT_Int)FIXED_TO_INT( ady );\n\n      /* set up remaining glyph fields */\n      glyph->num_subglyphs = 2;\n      glyph->subglyphs     = loader->base.subglyphs;\n      glyph->format        = FT_GLYPH_FORMAT_COMPOSITE;\n\n      loader->current.num_subglyphs = 2;\n      goto Exit;\n    }\n\n    /* First load `bchar' in builder */\n    /* now load the unscaled outline */\n\n    FT_GlyphLoader_Prepare( decoder->builder.loader );  /* prepare loader */\n\n    /* the seac operator must not be nested */\n    decoder->seac = TRUE;\n    error = t1_decoder_parse_glyph( decoder, bchar_index );\n    decoder->seac = FALSE;\n    if ( error )\n      goto Exit;\n\n    /* save the left bearing and width of the base character */\n    /* as they will be erased by the next load.              */\n\n    left_bearing = decoder->builder.left_bearing;\n    advance      = decoder->builder.advance;\n\n    decoder->builder.left_bearing.x = 0;\n    decoder->builder.left_bearing.y = 0;\n\n    decoder->builder.pos_x = adx - asb;\n    decoder->builder.pos_y = ady;\n\n    /* Now load `achar' on top of */\n    /* the base outline           */\n\n    /* the seac operator must not be nested */\n    decoder->seac = TRUE;\n    error = t1_decoder_parse_glyph( decoder, achar_index );\n    decoder->seac = FALSE;\n    if ( error )\n      goto Exit;\n\n    /* restore the left side bearing and   */\n    /* advance width of the base character */\n\n    decoder->builder.left_bearing = left_bearing;\n    decoder->builder.advance      = advance;\n\n    decoder->builder.pos_x = 0;\n    decoder->builder.pos_y = 0;\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    t1_decoder_parse_charstrings                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Parses a given Type 1 charstrings program.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    decoder         :: The current Type 1 decoder.                     */\n  /*                                                                       */\n  /*    charstring_base :: The base address of the charstring stream.      */\n  /*                                                                       */\n  /*    charstring_len  :: The length in bytes of the charstring stream.   */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  t1_decoder_parse_charstrings( T1_Decoder  decoder,\n                                FT_Byte*    charstring_base,\n                                FT_UInt     charstring_len )\n  {\n    FT_Error         error;\n    T1_Decoder_Zone  zone;\n    FT_Byte*         ip;\n    FT_Byte*         limit;\n    T1_Builder       builder = &decoder->builder;\n    FT_Pos           x, y, orig_x, orig_y;\n    FT_Int           known_othersubr_result_cnt   = 0;\n    FT_Int           unknown_othersubr_result_cnt = 0;\n    FT_Bool          large_int;\n    FT_Fixed         seed;\n\n    T1_Hints_Funcs   hinter;\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n    FT_Bool          bol = TRUE;\n#endif\n\n\n    /* compute random seed from stack address of parameter */\n    seed = (FT_Fixed)( ( (FT_PtrDist)(char*)&seed              ^\n                         (FT_PtrDist)(char*)&decoder           ^\n                         (FT_PtrDist)(char*)&charstring_base ) &\n                         FT_ULONG_MAX ) ;\n    seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL;\n    if ( seed == 0 )\n      seed = 0x7384;\n\n    /* First of all, initialize the decoder */\n    decoder->top  = decoder->stack;\n    decoder->zone = decoder->zones;\n    zone          = decoder->zones;\n\n    builder->parse_state = T1_Parse_Start;\n\n    hinter = (T1_Hints_Funcs)builder->hints_funcs;\n\n    /* a font that reads BuildCharArray without setting */\n    /* its values first is buggy, but ...               */\n    FT_ASSERT( ( decoder->len_buildchar == 0 ) ==\n               ( decoder->buildchar == NULL )  );\n\n    if ( decoder->buildchar && decoder->len_buildchar > 0 )\n      ft_memset( &decoder->buildchar[0],\n                 0,\n                 sizeof ( decoder->buildchar[0] ) * decoder->len_buildchar );\n\n    FT_TRACE4(( \"\\n\"\n                \"Start charstring\\n\" ));\n\n    zone->base           = charstring_base;\n    limit = zone->limit  = charstring_base + charstring_len;\n    ip    = zone->cursor = zone->base;\n\n    error = FT_Err_Ok;\n\n    x = orig_x = builder->pos_x;\n    y = orig_y = builder->pos_y;\n\n    /* begin hints recording session, if any */\n    if ( hinter )\n      hinter->open( hinter->hints );\n\n    large_int = FALSE;\n\n    /* now, execute loop */\n    while ( ip < limit )\n    {\n      FT_Long*     top   = decoder->top;\n      T1_Operator  op    = op_none;\n      FT_Int32     value = 0;\n\n\n      FT_ASSERT( known_othersubr_result_cnt == 0   ||\n                 unknown_othersubr_result_cnt == 0 );\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n      if ( bol )\n      {\n        FT_TRACE5(( \" (%d)\", decoder->top - decoder->stack ));\n        bol = FALSE;\n      }\n#endif\n\n      /*********************************************************************/\n      /*                                                                   */\n      /* Decode operator or operand                                        */\n      /*                                                                   */\n      /*                                                                   */\n\n      /* first of all, decompress operator or value */\n      switch ( *ip++ )\n      {\n      case 1:\n        op = op_hstem;\n        break;\n\n      case 3:\n        op = op_vstem;\n        break;\n      case 4:\n        op = op_vmoveto;\n        break;\n      case 5:\n        op = op_rlineto;\n        break;\n      case 6:\n        op = op_hlineto;\n        break;\n      case 7:\n        op = op_vlineto;\n        break;\n      case 8:\n        op = op_rrcurveto;\n        break;\n      case 9:\n        op = op_closepath;\n        break;\n      case 10:\n        op = op_callsubr;\n        break;\n      case 11:\n        op = op_return;\n        break;\n\n      case 13:\n        op = op_hsbw;\n        break;\n      case 14:\n        op = op_endchar;\n        break;\n\n      case 15:          /* undocumented, obsolete operator */\n        op = op_unknown15;\n        break;\n\n      case 21:\n        op = op_rmoveto;\n        break;\n      case 22:\n        op = op_hmoveto;\n        break;\n\n      case 30:\n        op = op_vhcurveto;\n        break;\n      case 31:\n        op = op_hvcurveto;\n        break;\n\n      case 12:\n        if ( ip > limit )\n        {\n          FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                     \" invalid escape (12+EOF)\\n\" ));\n          goto Syntax_Error;\n        }\n\n        switch ( *ip++ )\n        {\n        case 0:\n          op = op_dotsection;\n          break;\n        case 1:\n          op = op_vstem3;\n          break;\n        case 2:\n          op = op_hstem3;\n          break;\n        case 6:\n          op = op_seac;\n          break;\n        case 7:\n          op = op_sbw;\n          break;\n        case 12:\n          op = op_div;\n          break;\n        case 16:\n          op = op_callothersubr;\n          break;\n        case 17:\n          op = op_pop;\n          break;\n        case 33:\n          op = op_setcurrentpoint;\n          break;\n\n        default:\n          FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                     \" invalid escape (12+%d)\\n\",\n                     ip[-1] ));\n          goto Syntax_Error;\n        }\n        break;\n\n      case 255:    /* four bytes integer */\n        if ( ip + 4 > limit )\n        {\n          FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                     \" unexpected EOF in integer\\n\" ));\n          goto Syntax_Error;\n        }\n\n        value = (FT_Int32)( ( (FT_UInt32)ip[0] << 24 ) |\n                            ( (FT_UInt32)ip[1] << 16 ) |\n                            ( (FT_UInt32)ip[2] << 8  ) |\n                              (FT_UInt32)ip[3]         );\n        ip += 4;\n\n        /* According to the specification, values > 32000 or < -32000 must */\n        /* be followed by a `div' operator to make the result be in the    */\n        /* range [-32000;32000].  We expect that the second argument of    */\n        /* `div' is not a large number.  Additionally, we don't handle     */\n        /* stuff like `<large1> <large2> <num> div <num> div' or           */\n        /* <large1> <large2> <num> div div'.  This is probably not allowed */\n        /* anyway.                                                         */\n        if ( value > 32000 || value < -32000 )\n        {\n          if ( large_int )\n          {\n            FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                       \" no `div' after large integer\\n\" ));\n          }\n          else\n            large_int = TRUE;\n        }\n        else\n        {\n          if ( !large_int )\n            value = (FT_Int32)( (FT_UInt32)value << 16 );\n        }\n\n        break;\n\n      default:\n        if ( ip[-1] >= 32 )\n        {\n          if ( ip[-1] < 247 )\n            value = (FT_Int32)ip[-1] - 139;\n          else\n          {\n            if ( ++ip > limit )\n            {\n              FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                         \" unexpected EOF in integer\\n\" ));\n              goto Syntax_Error;\n            }\n\n            if ( ip[-2] < 251 )\n              value =    ( ( ip[-2] - 247 ) * 256 ) + ip[-1] + 108;\n            else\n              value = -( ( ( ip[-2] - 251 ) * 256 ) + ip[-1] + 108 );\n          }\n\n          if ( !large_int )\n            value = (FT_Int32)( (FT_UInt32)value << 16 );\n        }\n        else\n        {\n          FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                     \" invalid byte (%d)\\n\", ip[-1] ));\n          goto Syntax_Error;\n        }\n      }\n\n      if ( unknown_othersubr_result_cnt > 0 )\n      {\n        switch ( op )\n        {\n        case op_callsubr:\n        case op_return:\n        case op_none:\n        case op_pop:\n          break;\n\n        default:\n          /* all operands have been transferred by previous pops */\n          unknown_othersubr_result_cnt = 0;\n          break;\n        }\n      }\n\n      if ( large_int && !( op == op_none || op == op_div ) )\n      {\n        FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                   \" no `div' after large integer\\n\" ));\n\n        large_int = FALSE;\n      }\n\n      /*********************************************************************/\n      /*                                                                   */\n      /*  Push value on stack, or process operator                         */\n      /*                                                                   */\n      /*                                                                   */\n      if ( op == op_none )\n      {\n        if ( top - decoder->stack >= T1_MAX_CHARSTRINGS_OPERANDS )\n        {\n          FT_ERROR(( \"t1_decoder_parse_charstrings: stack overflow\\n\" ));\n          goto Syntax_Error;\n        }\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n        if ( large_int )\n          FT_TRACE4(( \" %ld\", value ));\n        else\n          FT_TRACE4(( \" %ld\", Fix2Int( value ) ));\n#endif\n\n        *top++       = value;\n        decoder->top = top;\n      }\n      else if ( op == op_callothersubr )  /* callothersubr */\n      {\n        FT_Int  subr_no;\n        FT_Int  arg_cnt;\n\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n        FT_TRACE4(( \" callothersubr\\n\" ));\n        bol = TRUE;\n#endif\n\n        if ( top - decoder->stack < 2 )\n          goto Stack_Underflow;\n\n        top -= 2;\n\n        subr_no = Fix2Int( top[1] );\n        arg_cnt = Fix2Int( top[0] );\n\n        /***********************************************************/\n        /*                                                         */\n        /* remove all operands to callothersubr from the stack     */\n        /*                                                         */\n        /* for handled othersubrs, where we know the number of     */\n        /* arguments, we increase the stack by the value of        */\n        /* known_othersubr_result_cnt                              */\n        /*                                                         */\n        /* for unhandled othersubrs the following pops adjust the  */\n        /* stack pointer as necessary                              */\n\n        if ( arg_cnt > top - decoder->stack )\n          goto Stack_Underflow;\n\n        top -= arg_cnt;\n\n        known_othersubr_result_cnt   = 0;\n        unknown_othersubr_result_cnt = 0;\n\n        /* XXX TODO: The checks to `arg_count == <whatever>'       */\n        /* might not be correct; an othersubr expects a certain    */\n        /* number of operands on the PostScript stack (as opposed  */\n        /* to the T1 stack) but it doesn't have to put them there  */\n        /* by itself; previous othersubrs might have left the      */\n        /* operands there if they were not followed by an          */\n        /* appropriate number of pops                              */\n        /*                                                         */\n        /* On the other hand, Adobe Reader 7.0.8 for Linux doesn't */\n        /* accept a font that contains charstrings like            */\n        /*                                                         */\n        /*     100 200 2 20 callothersubr                          */\n        /*     300 1 20 callothersubr pop                          */\n        /*                                                         */\n        /* Perhaps this is the reason why BuildCharArray exists.   */\n\n        switch ( subr_no )\n        {\n        case 0:                     /* end flex feature */\n          if ( arg_cnt != 3 )\n            goto Unexpected_OtherSubr;\n\n          if ( decoder->flex_state       == 0 ||\n               decoder->num_flex_vectors != 7 )\n          {\n            FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                       \" unexpected flex end\\n\" ));\n            goto Syntax_Error;\n          }\n\n          /* the two `results' are popped by the following setcurrentpoint */\n          top[0] = x;\n          top[1] = y;\n          known_othersubr_result_cnt = 2;\n          break;\n\n        case 1:                     /* start flex feature */\n          if ( arg_cnt != 0 )\n            goto Unexpected_OtherSubr;\n\n          decoder->flex_state        = 1;\n          decoder->num_flex_vectors  = 0;\n          if ( ( error = t1_builder_start_point( builder, x, y ) )\n                 != FT_Err_Ok                                   ||\n               ( error = t1_builder_check_points( builder, 6 ) )\n                 != FT_Err_Ok                                   )\n            goto Fail;\n          break;\n\n        case 2:                     /* add flex vectors */\n          {\n            FT_Int  idx;\n\n\n            if ( arg_cnt != 0 )\n              goto Unexpected_OtherSubr;\n\n            if ( decoder->flex_state == 0 )\n            {\n              FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                         \" missing flex start\\n\" ));\n              goto Syntax_Error;\n            }\n\n            /* note that we should not add a point for index 0; */\n            /* this will move our current position to the flex  */\n            /* point without adding any point to the outline    */\n            idx = decoder->num_flex_vectors++;\n            if ( idx > 0 && idx < 7 )\n              t1_builder_add_point( builder,\n                                    x,\n                                    y,\n                                    (FT_Byte)( idx == 3 || idx == 6 ) );\n          }\n          break;\n\n        case 3:                     /* change hints */\n          if ( arg_cnt != 1 )\n            goto Unexpected_OtherSubr;\n\n          known_othersubr_result_cnt = 1;\n\n          if ( hinter )\n            hinter->reset( hinter->hints, builder->current->n_points );\n          break;\n\n        case 12:\n        case 13:\n          /* counter control hints, clear stack */\n          top = decoder->stack;\n          break;\n\n        case 14:\n        case 15:\n        case 16:\n        case 17:\n        case 18:                    /* multiple masters */\n          {\n            PS_Blend  blend = decoder->blend;\n            FT_UInt   num_points, nn, mm;\n            FT_Long*  delta;\n            FT_Long*  values;\n\n\n            if ( !blend )\n            {\n              FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                         \" unexpected multiple masters operator\\n\" ));\n              goto Syntax_Error;\n            }\n\n            num_points = (FT_UInt)subr_no - 13 + ( subr_no == 18 );\n            if ( arg_cnt != (FT_Int)( num_points * blend->num_designs ) )\n            {\n              FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                         \" incorrect number of multiple masters arguments\\n\" ));\n              goto Syntax_Error;\n            }\n\n            /* We want to compute                                    */\n            /*                                                       */\n            /*   a0*w0 + a1*w1 + ... + ak*wk                         */\n            /*                                                       */\n            /* but we only have a0, a1-a0, a2-a0, ..., ak-a0.        */\n            /*                                                       */\n            /* However, given that w0 + w1 + ... + wk == 1, we can   */\n            /* rewrite it easily as                                  */\n            /*                                                       */\n            /*   a0 + (a1-a0)*w1 + (a2-a0)*w2 + ... + (ak-a0)*wk     */\n            /*                                                       */\n            /* where k == num_designs-1.                             */\n            /*                                                       */\n            /* I guess that's why it's written in this `compact'     */\n            /* form.                                                 */\n            /*                                                       */\n            delta  = top + num_points;\n            values = top;\n            for ( nn = 0; nn < num_points; nn++ )\n            {\n              FT_Long  tmp = values[0];\n\n\n              for ( mm = 1; mm < blend->num_designs; mm++ )\n                tmp += FT_MulFix( *delta++, blend->weight_vector[mm] );\n\n              *values++ = tmp;\n            }\n\n            known_othersubr_result_cnt = num_points;\n            break;\n          }\n\n        case 19:\n          /* <idx> 1 19 callothersubr                             */\n          /* => replace elements starting from index cvi( <idx> ) */\n          /*    of BuildCharArray with WeightVector               */\n          {\n            FT_Int    idx;\n            PS_Blend  blend = decoder->blend;\n\n\n            if ( arg_cnt != 1 || blend == NULL )\n              goto Unexpected_OtherSubr;\n\n            idx = Fix2Int( top[0] );\n\n            if ( idx < 0                                           ||\n                 idx + blend->num_designs > decoder->len_buildchar )\n              goto Unexpected_OtherSubr;\n\n            ft_memcpy( &decoder->buildchar[idx],\n                       blend->weight_vector,\n                       blend->num_designs *\n                         sizeof ( blend->weight_vector[0] ) );\n          }\n          break;\n\n        case 20:\n          /* <arg1> <arg2> 2 20 callothersubr pop   */\n          /* ==> push <arg1> + <arg2> onto T1 stack */\n          if ( arg_cnt != 2 )\n            goto Unexpected_OtherSubr;\n\n          top[0] += top[1]; /* XXX (over|under)flow */\n\n          known_othersubr_result_cnt = 1;\n          break;\n\n        case 21:\n          /* <arg1> <arg2> 2 21 callothersubr pop   */\n          /* ==> push <arg1> - <arg2> onto T1 stack */\n          if ( arg_cnt != 2 )\n            goto Unexpected_OtherSubr;\n\n          top[0] -= top[1]; /* XXX (over|under)flow */\n\n          known_othersubr_result_cnt = 1;\n          break;\n\n        case 22:\n          /* <arg1> <arg2> 2 22 callothersubr pop   */\n          /* ==> push <arg1> * <arg2> onto T1 stack */\n          if ( arg_cnt != 2 )\n            goto Unexpected_OtherSubr;\n\n          top[0] = FT_MulFix( top[0], top[1] );\n\n          known_othersubr_result_cnt = 1;\n          break;\n\n        case 23:\n          /* <arg1> <arg2> 2 23 callothersubr pop   */\n          /* ==> push <arg1> / <arg2> onto T1 stack */\n          if ( arg_cnt != 2 || top[1] == 0 )\n            goto Unexpected_OtherSubr;\n\n          top[0] = FT_DivFix( top[0], top[1] );\n\n          known_othersubr_result_cnt = 1;\n          break;\n\n        case 24:\n          /* <val> <idx> 2 24 callothersubr               */\n          /* ==> set BuildCharArray[cvi( <idx> )] = <val> */\n          {\n            FT_Int    idx;\n            PS_Blend  blend = decoder->blend;\n\n\n            if ( arg_cnt != 2 || blend == NULL )\n              goto Unexpected_OtherSubr;\n\n            idx = Fix2Int( top[1] );\n\n            if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar )\n              goto Unexpected_OtherSubr;\n\n            decoder->buildchar[idx] = top[0];\n          }\n          break;\n\n        case 25:\n          /* <idx> 1 25 callothersubr pop        */\n          /* ==> push BuildCharArray[cvi( idx )] */\n          /*     onto T1 stack                   */\n          {\n            FT_Int    idx;\n            PS_Blend  blend = decoder->blend;\n\n\n            if ( arg_cnt != 1 || blend == NULL )\n              goto Unexpected_OtherSubr;\n\n            idx = Fix2Int( top[0] );\n\n            if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar )\n              goto Unexpected_OtherSubr;\n\n            top[0] = decoder->buildchar[idx];\n          }\n\n          known_othersubr_result_cnt = 1;\n          break;\n\n#if 0\n        case 26:\n          /* <val> mark <idx> ==> set BuildCharArray[cvi( <idx> )] = <val>, */\n          /*                      leave mark on T1 stack                    */\n          /* <val> <idx>      ==> set BuildCharArray[cvi( <idx> )] = <val>  */\n          XXX which routine has left its mark on the (PostScript) stack?;\n          break;\n#endif\n\n        case 27:\n          /* <res1> <res2> <val1> <val2> 4 27 callothersubr pop */\n          /* ==> push <res1> onto T1 stack if <val1> <= <val2>, */\n          /*     otherwise push <res2>                          */\n          if ( arg_cnt != 4 )\n            goto Unexpected_OtherSubr;\n\n          if ( top[2] > top[3] )\n            top[0] = top[1];\n\n          known_othersubr_result_cnt = 1;\n          break;\n\n        case 28:\n          /* 0 28 callothersubr pop                               */\n          /* => push random value from interval [0, 1) onto stack */\n          if ( arg_cnt != 0 )\n            goto Unexpected_OtherSubr;\n\n          {\n            FT_Fixed  Rand;\n\n\n            Rand = seed;\n            if ( Rand >= 0x8000L )\n              Rand++;\n\n            top[0] = Rand;\n\n            seed = FT_MulFix( seed, 0x10000L - seed );\n            if ( seed == 0 )\n              seed += 0x2873;\n          }\n\n          known_othersubr_result_cnt = 1;\n          break;\n\n        default:\n          if ( arg_cnt >= 0 && subr_no >= 0 )\n          {\n            FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                       \" unknown othersubr [%d %d], wish me luck\\n\",\n                       arg_cnt, subr_no ));\n            unknown_othersubr_result_cnt = arg_cnt;\n            break;\n          }\n          /* fall through */\n\n        Unexpected_OtherSubr:\n          FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                     \" invalid othersubr [%d %d]\\n\", arg_cnt, subr_no ));\n          goto Syntax_Error;\n        }\n\n        top += known_othersubr_result_cnt;\n\n        decoder->top = top;\n      }\n      else  /* general operator */\n      {\n        FT_Int  num_args = t1_args_count[op];\n\n\n        FT_ASSERT( num_args >= 0 );\n\n        if ( top - decoder->stack < num_args )\n          goto Stack_Underflow;\n\n        /* XXX Operators usually take their operands from the        */\n        /*     bottom of the stack, i.e., the operands are           */\n        /*     decoder->stack[0], ..., decoder->stack[num_args - 1]; */\n        /*     only div, callsubr, and callothersubr are different.  */\n        /*     In practice it doesn't matter (?).                    */\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n        switch ( op )\n        {\n        case op_callsubr:\n        case op_div:\n        case op_callothersubr:\n        case op_pop:\n        case op_return:\n          break;\n\n        default:\n          if ( top - decoder->stack != num_args )\n            FT_TRACE0(( \"t1_decoder_parse_charstrings:\"\n                        \" too much operands on the stack\"\n                        \" (seen %d, expected %d)\\n\",\n                        top - decoder->stack, num_args ));\n            break;\n        }\n\n#endif /* FT_DEBUG_LEVEL_TRACE */\n\n        top -= num_args;\n\n        switch ( op )\n        {\n        case op_endchar:\n          FT_TRACE4(( \" endchar\\n\" ));\n\n          t1_builder_close_contour( builder );\n\n          /* close hints recording session */\n          if ( hinter )\n          {\n            if ( hinter->close( hinter->hints, builder->current->n_points ) )\n              goto Syntax_Error;\n\n            /* apply hints to the loaded glyph outline now */\n            hinter->apply( hinter->hints,\n                           builder->current,\n                           (PSH_Globals)builder->hints_globals,\n                           decoder->hint_mode );\n          }\n\n          /* add current outline to the glyph slot */\n          FT_GlyphLoader_Add( builder->loader );\n\n          /* the compiler should optimize away this empty loop but ... */\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n          if ( decoder->len_buildchar > 0 )\n          {\n            FT_UInt  i;\n\n\n            FT_TRACE4(( \"BuildCharArray = [ \" ));\n\n            for ( i = 0; i < decoder->len_buildchar; ++i )\n              FT_TRACE4(( \"%d \", decoder->buildchar[i] ));\n\n            FT_TRACE4(( \"]\\n\" ));\n          }\n\n#endif /* FT_DEBUG_LEVEL_TRACE */\n\n          FT_TRACE4(( \"\\n\" ));\n\n          /* return now! */\n          return FT_Err_Ok;\n\n        case op_hsbw:\n          FT_TRACE4(( \" hsbw\" ));\n\n          builder->parse_state = T1_Parse_Have_Width;\n\n          builder->left_bearing.x += top[0];\n          builder->advance.x       = top[1];\n          builder->advance.y       = 0;\n\n          orig_x = x = builder->pos_x + top[0];\n          orig_y = y = builder->pos_y;\n\n          FT_UNUSED( orig_y );\n\n          /* the `metrics_only' indicates that we only want to compute */\n          /* the glyph's metrics (lsb + advance width), not load the   */\n          /* rest of it; so exit immediately                           */\n          if ( builder->metrics_only )\n            return FT_Err_Ok;\n\n          break;\n\n        case op_seac:\n          return t1operator_seac( decoder,\n                                  top[0],\n                                  top[1],\n                                  top[2],\n                                  Fix2Int( top[3] ),\n                                  Fix2Int( top[4] ) );\n\n        case op_sbw:\n          FT_TRACE4(( \" sbw\" ));\n\n          builder->parse_state = T1_Parse_Have_Width;\n\n          builder->left_bearing.x += top[0];\n          builder->left_bearing.y += top[1];\n          builder->advance.x       = top[2];\n          builder->advance.y       = top[3];\n\n          x = builder->pos_x + top[0];\n          y = builder->pos_y + top[1];\n\n          /* the `metrics_only' indicates that we only want to compute */\n          /* the glyph's metrics (lsb + advance width), not load the   */\n          /* rest of it; so exit immediately                           */\n          if ( builder->metrics_only )\n            return FT_Err_Ok;\n\n          break;\n\n        case op_closepath:\n          FT_TRACE4(( \" closepath\" ));\n\n          /* if there is no path, `closepath' is a no-op */\n          if ( builder->parse_state == T1_Parse_Have_Path   ||\n               builder->parse_state == T1_Parse_Have_Moveto )\n            t1_builder_close_contour( builder );\n\n          builder->parse_state = T1_Parse_Have_Width;\n          break;\n\n        case op_hlineto:\n          FT_TRACE4(( \" hlineto\" ));\n\n          if ( ( error = t1_builder_start_point( builder, x, y ) )\n                 != FT_Err_Ok )\n            goto Fail;\n\n          x += top[0];\n          goto Add_Line;\n\n        case op_hmoveto:\n          FT_TRACE4(( \" hmoveto\" ));\n\n          x += top[0];\n          if ( !decoder->flex_state )\n          {\n            if ( builder->parse_state == T1_Parse_Start )\n              goto Syntax_Error;\n            builder->parse_state = T1_Parse_Have_Moveto;\n          }\n          break;\n\n        case op_hvcurveto:\n          FT_TRACE4(( \" hvcurveto\" ));\n\n          if ( ( error = t1_builder_start_point( builder, x, y ) )\n                 != FT_Err_Ok                                   ||\n               ( error = t1_builder_check_points( builder, 3 ) )\n                 != FT_Err_Ok                                   )\n            goto Fail;\n\n          x += top[0];\n          t1_builder_add_point( builder, x, y, 0 );\n          x += top[1];\n          y += top[2];\n          t1_builder_add_point( builder, x, y, 0 );\n          y += top[3];\n          t1_builder_add_point( builder, x, y, 1 );\n          break;\n\n        case op_rlineto:\n          FT_TRACE4(( \" rlineto\" ));\n\n          if ( ( error = t1_builder_start_point( builder, x, y ) )\n                 != FT_Err_Ok )\n            goto Fail;\n\n          x += top[0];\n          y += top[1];\n\n        Add_Line:\n          if ( ( error = t1_builder_add_point1( builder, x, y ) )\n                 != FT_Err_Ok )\n            goto Fail;\n          break;\n\n        case op_rmoveto:\n          FT_TRACE4(( \" rmoveto\" ));\n\n          x += top[0];\n          y += top[1];\n          if ( !decoder->flex_state )\n          {\n            if ( builder->parse_state == T1_Parse_Start )\n              goto Syntax_Error;\n            builder->parse_state = T1_Parse_Have_Moveto;\n          }\n          break;\n\n        case op_rrcurveto:\n          FT_TRACE4(( \" rrcurveto\" ));\n\n          if ( ( error = t1_builder_start_point( builder, x, y ) )\n                 != FT_Err_Ok                                   ||\n               ( error = t1_builder_check_points( builder, 3 ) )\n                 != FT_Err_Ok                                   )\n            goto Fail;\n\n          x += top[0];\n          y += top[1];\n          t1_builder_add_point( builder, x, y, 0 );\n\n          x += top[2];\n          y += top[3];\n          t1_builder_add_point( builder, x, y, 0 );\n\n          x += top[4];\n          y += top[5];\n          t1_builder_add_point( builder, x, y, 1 );\n          break;\n\n        case op_vhcurveto:\n          FT_TRACE4(( \" vhcurveto\" ));\n\n          if ( ( error = t1_builder_start_point( builder, x, y ) )\n                 != FT_Err_Ok                                   ||\n               ( error = t1_builder_check_points( builder, 3 ) )\n                 != FT_Err_Ok                                   )\n            goto Fail;\n\n          y += top[0];\n          t1_builder_add_point( builder, x, y, 0 );\n          x += top[1];\n          y += top[2];\n          t1_builder_add_point( builder, x, y, 0 );\n          x += top[3];\n          t1_builder_add_point( builder, x, y, 1 );\n          break;\n\n        case op_vlineto:\n          FT_TRACE4(( \" vlineto\" ));\n\n          if ( ( error = t1_builder_start_point( builder, x, y ) )\n                 != FT_Err_Ok )\n            goto Fail;\n\n          y += top[0];\n          goto Add_Line;\n\n        case op_vmoveto:\n          FT_TRACE4(( \" vmoveto\" ));\n\n          y += top[0];\n          if ( !decoder->flex_state )\n          {\n            if ( builder->parse_state == T1_Parse_Start )\n              goto Syntax_Error;\n            builder->parse_state = T1_Parse_Have_Moveto;\n          }\n          break;\n\n        case op_div:\n          FT_TRACE4(( \" div\" ));\n\n          /* if `large_int' is set, we divide unscaled numbers; */\n          /* otherwise, we divide numbers in 16.16 format --    */\n          /* in both cases, it is the same operation            */\n          *top = FT_DivFix( top[0], top[1] );\n          ++top;\n\n          large_int = FALSE;\n          break;\n\n        case op_callsubr:\n          {\n            FT_Int  idx;\n\n\n            FT_TRACE4(( \" callsubr\" ));\n\n            idx = Fix2Int( top[0] );\n            if ( idx < 0 || idx >= (FT_Int)decoder->num_subrs )\n            {\n              FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                         \" invalid subrs index\\n\" ));\n              goto Syntax_Error;\n            }\n\n            if ( zone - decoder->zones >= T1_MAX_SUBRS_CALLS )\n            {\n              FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                         \" too many nested subrs\\n\" ));\n              goto Syntax_Error;\n            }\n\n            zone->cursor = ip;  /* save current instruction pointer */\n\n            zone++;\n\n            /* The Type 1 driver stores subroutines without the seed bytes. */\n            /* The CID driver stores subroutines with seed bytes.  This     */\n            /* case is taken care of when decoder->subrs_len == 0.          */\n            zone->base = decoder->subrs[idx];\n\n            if ( decoder->subrs_len )\n              zone->limit = zone->base + decoder->subrs_len[idx];\n            else\n            {\n              /* We are using subroutines from a CID font.  We must adjust */\n              /* for the seed bytes.                                       */\n              zone->base  += ( decoder->lenIV >= 0 ? decoder->lenIV : 0 );\n              zone->limit  = decoder->subrs[idx + 1];\n            }\n\n            zone->cursor = zone->base;\n\n            if ( !zone->base )\n            {\n              FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                         \" invoking empty subrs\\n\" ));\n              goto Syntax_Error;\n            }\n\n            decoder->zone = zone;\n            ip            = zone->base;\n            limit         = zone->limit;\n            break;\n          }\n\n        case op_pop:\n          FT_TRACE4(( \" pop\" ));\n\n          if ( known_othersubr_result_cnt > 0 )\n          {\n            known_othersubr_result_cnt--;\n            /* ignore, we pushed the operands ourselves */\n            break;\n          }\n\n          if ( unknown_othersubr_result_cnt == 0 )\n          {\n            FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                       \" no more operands for othersubr\\n\" ));\n            goto Syntax_Error;\n          }\n\n          unknown_othersubr_result_cnt--;\n          top++;   /* `push' the operand to callothersubr onto the stack */\n          break;\n\n        case op_return:\n          FT_TRACE4(( \" return\" ));\n\n          if ( zone <= decoder->zones )\n          {\n            FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                       \" unexpected return\\n\" ));\n            goto Syntax_Error;\n          }\n\n          zone--;\n          ip            = zone->cursor;\n          limit         = zone->limit;\n          decoder->zone = zone;\n          break;\n\n        case op_dotsection:\n          FT_TRACE4(( \" dotsection\" ));\n\n          break;\n\n        case op_hstem:\n          FT_TRACE4(( \" hstem\" ));\n\n          /* record horizontal hint */\n          if ( hinter )\n          {\n            /* top[0] += builder->left_bearing.y; */\n            hinter->stem( hinter->hints, 1, top );\n          }\n          break;\n\n        case op_hstem3:\n          FT_TRACE4(( \" hstem3\" ));\n\n          /* record horizontal counter-controlled hints */\n          if ( hinter )\n            hinter->stem3( hinter->hints, 1, top );\n          break;\n\n        case op_vstem:\n          FT_TRACE4(( \" vstem\" ));\n\n          /* record vertical hint */\n          if ( hinter )\n          {\n            top[0] += orig_x;\n            hinter->stem( hinter->hints, 0, top );\n          }\n          break;\n\n        case op_vstem3:\n          FT_TRACE4(( \" vstem3\" ));\n\n          /* record vertical counter-controlled hints */\n          if ( hinter )\n          {\n            FT_Pos  dx = orig_x;\n\n\n            top[0] += dx;\n            top[2] += dx;\n            top[4] += dx;\n            hinter->stem3( hinter->hints, 0, top );\n          }\n          break;\n\n        case op_setcurrentpoint:\n          FT_TRACE4(( \" setcurrentpoint\" ));\n\n          /* From the T1 specification, section 6.4:                */\n          /*                                                        */\n          /*   The setcurrentpoint command is used only in          */\n          /*   conjunction with results from OtherSubrs procedures. */\n\n          /* known_othersubr_result_cnt != 0 is already handled     */\n          /* above.                                                 */\n\n          /* Note, however, that both Ghostscript and Adobe         */\n          /* Distiller handle this situation by silently ignoring   */\n          /* the inappropriate `setcurrentpoint' instruction.  So   */\n          /* we do the same.                                        */\n#if 0\n\n          if ( decoder->flex_state != 1 )\n          {\n            FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                       \" unexpected `setcurrentpoint'\\n\" ));\n            goto Syntax_Error;\n          }\n          else\n            ...\n#endif\n\n          x = top[0];\n          y = top[1];\n          decoder->flex_state = 0;\n          break;\n\n        case op_unknown15:\n          FT_TRACE4(( \" opcode_15\" ));\n          /* nothing to do except to pop the two arguments */\n          break;\n\n        default:\n          FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                     \" unhandled opcode %d\\n\", op ));\n          goto Syntax_Error;\n        }\n\n        /* XXX Operators usually clear the operand stack;  */\n        /*     only div, callsubr, callothersubr, pop, and */\n        /*     return are different.                       */\n        /*     In practice it doesn't matter (?).          */\n\n        decoder->top = top;\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n        FT_TRACE4(( \"\\n\" ));\n        bol = TRUE;\n#endif\n\n      } /* general operator processing */\n\n    } /* while ip < limit */\n\n    FT_TRACE4(( \"..end..\\n\\n\" ));\n\n  Fail:\n    return error;\n\n  Syntax_Error:\n    return FT_THROW( Syntax_Error );\n\n  Stack_Underflow:\n    return FT_THROW( Stack_Underflow );\n  }\n\n\n  /* parse a single Type 1 glyph */\n  FT_LOCAL_DEF( FT_Error )\n  t1_decoder_parse_glyph( T1_Decoder  decoder,\n                          FT_UInt     glyph )\n  {\n    return decoder->parse_callback( decoder, glyph );\n  }\n\n\n  /* initialize T1 decoder */\n  FT_LOCAL_DEF( FT_Error )\n  t1_decoder_init( T1_Decoder           decoder,\n                   FT_Face              face,\n                   FT_Size              size,\n                   FT_GlyphSlot         slot,\n                   FT_Byte**            glyph_names,\n                   PS_Blend             blend,\n                   FT_Bool              hinting,\n                   FT_Render_Mode       hint_mode,\n                   T1_Decoder_Callback  parse_callback )\n  {\n    FT_MEM_ZERO( decoder, sizeof ( *decoder ) );\n\n    /* retrieve PSNames interface from list of current modules */\n    {\n      FT_Service_PsCMaps  psnames = 0;\n\n\n      FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );\n      if ( !psnames )\n      {\n        FT_ERROR(( \"t1_decoder_init:\"\n                   \" the `psnames' module is not available\\n\" ));\n        return FT_THROW( Unimplemented_Feature );\n      }\n\n      decoder->psnames = psnames;\n    }\n\n    t1_builder_init( &decoder->builder, face, size, slot, hinting );\n\n    /* decoder->buildchar and decoder->len_buildchar have to be  */\n    /* initialized by the caller since we cannot know the length */\n    /* of the BuildCharArray                                     */\n\n    decoder->num_glyphs     = (FT_UInt)face->num_glyphs;\n    decoder->glyph_names    = glyph_names;\n    decoder->hint_mode      = hint_mode;\n    decoder->blend          = blend;\n    decoder->parse_callback = parse_callback;\n\n    decoder->funcs          = t1_decoder_funcs;\n\n    return FT_Err_Ok;\n  }\n\n\n  /* finalize T1 decoder */\n  FT_LOCAL_DEF( void )\n  t1_decoder_done( T1_Decoder  decoder )\n  {\n    t1_builder_done( &decoder->builder );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1decode.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1decode.h                                                             */\n/*                                                                         */\n/*    PostScript Type 1 decoding routines (specification).                 */\n/*                                                                         */\n/*  Copyright 2000-2001, 2002, 2003 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __T1DECODE_H__\n#define __T1DECODE_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/psaux.h\"\n#include \"../../include/freetype/internal/t1types.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  FT_CALLBACK_TABLE\n  const T1_Decoder_FuncsRec  t1_decoder_funcs;\n\n\n  FT_LOCAL( FT_Error )\n  t1_decoder_parse_glyph( T1_Decoder  decoder,\n                          FT_UInt     glyph_index );\n\n  FT_LOCAL( FT_Error )\n  t1_decoder_parse_charstrings( T1_Decoder  decoder,\n                                FT_Byte*    base,\n                                FT_UInt     len );\n\n  FT_LOCAL( FT_Error )\n  t1_decoder_init( T1_Decoder           decoder,\n                   FT_Face              face,\n                   FT_Size              size,\n                   FT_GlyphSlot         slot,\n                   FT_Byte**            glyph_names,\n                   PS_Blend             blend,\n                   FT_Bool              hinting,\n                   FT_Render_Mode       hint_mode,\n                   T1_Decoder_Callback  parse_glyph );\n\n  FT_LOCAL( void )\n  t1_decoder_done( T1_Decoder  decoder );\n\n\nFT_END_HEADER\n\n#endif /* __T1DECODE_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/Jamfile",
    "content": "# FreeType 2 src/pshinter Jamfile\n#\n# Copyright 2001, 2003 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) pshinter ;\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = pshrec pshglob pshalgo pshmod pshpic ;\n  }\n  else\n  {\n    _sources = pshinter ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/pshinter Jamfile\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/fxft_pshinter.c",
    "content": "#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501\n/***************************************************************************/\n/*                                                                         */\n/*  pshinter.c                                                             */\n/*                                                                         */\n/*    FreeType PostScript Hinting module                                   */\n/*                                                                         */\n/*  Copyright 2001, 2003 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n#define FT2_BUILD_LIBRARY\n\n#include \"../../include/ft2build.h\"\n#include \"pshpic.c\"\n#include \"pshrec.c\"\n#include \"pshglob.c\"\n#include \"pshalgo.c\"\n#include \"pshmod.c\"\n\n\n/* END */\n#endif\n\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshalgo.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pshalgo.c                                                              */\n/*                                                                         */\n/*    PostScript hinting algorithm (body).                                 */\n/*                                                                         */\n/*  Copyright 2001-2010, 2012, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used        */\n/*  modified and distributed under the terms of the FreeType project       */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftcalc.h\"\n#include \"pshalgo.h\"\n\n#include \"pshnterr.h\"\n\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_pshalgo2\n\n\n#ifdef DEBUG_HINTER\n  PSH_Hint_Table  ps_debug_hint_table = 0;\n  PSH_HintFunc    ps_debug_hint_func  = 0;\n  PSH_Glyph       ps_debug_glyph      = 0;\n#endif\n\n\n#define  COMPUTE_INFLEXS  /* compute inflection points to optimize `S' */\n                          /* and similar glyphs                        */\n#define  STRONGER         /* slightly increase the contrast of smooth  */\n                          /* hinting                                   */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                  BASIC HINTS RECORDINGS                       *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* return true if two stem hints overlap */\n  static FT_Int\n  psh_hint_overlap( PSH_Hint  hint1,\n                    PSH_Hint  hint2 )\n  {\n    return hint1->org_pos + hint1->org_len >= hint2->org_pos &&\n           hint2->org_pos + hint2->org_len >= hint1->org_pos;\n  }\n\n\n  /* destroy hints table */\n  static void\n  psh_hint_table_done( PSH_Hint_Table  table,\n                       FT_Memory       memory )\n  {\n    FT_FREE( table->zones );\n    table->num_zones = 0;\n    table->zone      = 0;\n\n    FT_FREE( table->sort );\n    FT_FREE( table->hints );\n    table->num_hints   = 0;\n    table->max_hints   = 0;\n    table->sort_global = 0;\n  }\n\n\n  /* deactivate all hints in a table */\n  static void\n  psh_hint_table_deactivate( PSH_Hint_Table  table )\n  {\n    FT_UInt   count = table->max_hints;\n    PSH_Hint  hint  = table->hints;\n\n\n    for ( ; count > 0; count--, hint++ )\n    {\n      psh_hint_deactivate( hint );\n      hint->order = -1;\n    }\n  }\n\n\n  /* internal function to record a new hint */\n  static void\n  psh_hint_table_record( PSH_Hint_Table  table,\n                         FT_UInt         idx )\n  {\n    PSH_Hint  hint = table->hints + idx;\n\n\n    if ( idx >= table->max_hints )\n    {\n      FT_TRACE0(( \"psh_hint_table_record: invalid hint index %d\\n\", idx ));\n      return;\n    }\n\n    /* ignore active hints */\n    if ( psh_hint_is_active( hint ) )\n      return;\n\n    psh_hint_activate( hint );\n\n    /* now scan the current active hint set to check */\n    /* whether `hint' overlaps with another hint     */\n    {\n      PSH_Hint*  sorted = table->sort_global;\n      FT_UInt    count  = table->num_hints;\n      PSH_Hint   hint2;\n\n\n      hint->parent = 0;\n      for ( ; count > 0; count--, sorted++ )\n      {\n        hint2 = sorted[0];\n\n        if ( psh_hint_overlap( hint, hint2 ) )\n        {\n          hint->parent = hint2;\n          break;\n        }\n      }\n    }\n\n    if ( table->num_hints < table->max_hints )\n      table->sort_global[table->num_hints++] = hint;\n    else\n      FT_TRACE0(( \"psh_hint_table_record: too many sorted hints!  BUG!\\n\" ));\n  }\n\n\n  static void\n  psh_hint_table_record_mask( PSH_Hint_Table  table,\n                              PS_Mask         hint_mask )\n  {\n    FT_Int    mask = 0, val = 0;\n    FT_Byte*  cursor = hint_mask->bytes;\n    FT_UInt   idx, limit;\n\n\n    limit = hint_mask->num_bits;\n\n    for ( idx = 0; idx < limit; idx++ )\n    {\n      if ( mask == 0 )\n      {\n        val  = *cursor++;\n        mask = 0x80;\n      }\n\n      if ( val & mask )\n        psh_hint_table_record( table, idx );\n\n      mask >>= 1;\n    }\n  }\n\n\n  /* create hints table */\n  static FT_Error\n  psh_hint_table_init( PSH_Hint_Table  table,\n                       PS_Hint_Table   hints,\n                       PS_Mask_Table   hint_masks,\n                       PS_Mask_Table   counter_masks,\n                       FT_Memory       memory )\n  {\n    FT_UInt   count;\n    FT_Error  error;\n\n    FT_UNUSED( counter_masks );\n\n\n    count = hints->num_hints;\n\n    /* allocate our tables */\n    if ( FT_NEW_ARRAY( table->sort,  2 * count     ) ||\n         FT_NEW_ARRAY( table->hints,     count     ) ||\n         FT_NEW_ARRAY( table->zones, 2 * count + 1 ) )\n      goto Exit;\n\n    table->max_hints   = count;\n    table->sort_global = table->sort + count;\n    table->num_hints   = 0;\n    table->num_zones   = 0;\n    table->zone        = 0;\n\n    /* initialize the `table->hints' array */\n    {\n      PSH_Hint  write = table->hints;\n      PS_Hint   read  = hints->hints;\n\n\n      for ( ; count > 0; count--, write++, read++ )\n      {\n        write->org_pos = read->pos;\n        write->org_len = read->len;\n        write->flags   = read->flags;\n      }\n    }\n\n    /* we now need to determine the initial `parent' stems; first  */\n    /* activate the hints that are given by the initial hint masks */\n    if ( hint_masks )\n    {\n      PS_Mask  mask = hint_masks->masks;\n\n\n      count             = hint_masks->num_masks;\n      table->hint_masks = hint_masks;\n\n      for ( ; count > 0; count--, mask++ )\n        psh_hint_table_record_mask( table, mask );\n    }\n\n    /* finally, do a linear parse in case some hints were left alone */\n    if ( table->num_hints != table->max_hints )\n    {\n      FT_UInt  idx;\n\n\n      FT_TRACE0(( \"psh_hint_table_init: missing/incorrect hint masks\\n\" ));\n\n      count = table->max_hints;\n      for ( idx = 0; idx < count; idx++ )\n        psh_hint_table_record( table, idx );\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  static void\n  psh_hint_table_activate_mask( PSH_Hint_Table  table,\n                                PS_Mask         hint_mask )\n  {\n    FT_Int    mask = 0, val = 0;\n    FT_Byte*  cursor = hint_mask->bytes;\n    FT_UInt   idx, limit, count;\n\n\n    limit = hint_mask->num_bits;\n    count = 0;\n\n    psh_hint_table_deactivate( table );\n\n    for ( idx = 0; idx < limit; idx++ )\n    {\n      if ( mask == 0 )\n      {\n        val  = *cursor++;\n        mask = 0x80;\n      }\n\n      if ( val & mask )\n      {\n        PSH_Hint  hint = &table->hints[idx];\n\n\n        if ( !psh_hint_is_active( hint ) )\n        {\n          FT_UInt     count2;\n\n#if 0\n          PSH_Hint*  sort = table->sort;\n          PSH_Hint   hint2;\n\n\n          for ( count2 = count; count2 > 0; count2--, sort++ )\n          {\n            hint2 = sort[0];\n            if ( psh_hint_overlap( hint, hint2 ) )\n              FT_TRACE0(( \"psh_hint_table_activate_mask:\"\n                          \" found overlapping hints\\n\" ))\n          }\n#else\n          count2 = 0;\n#endif\n\n          if ( count2 == 0 )\n          {\n            psh_hint_activate( hint );\n            if ( count < table->max_hints )\n              table->sort[count++] = hint;\n            else\n              FT_TRACE0(( \"psh_hint_tableactivate_mask:\"\n                          \" too many active hints\\n\" ));\n          }\n        }\n      }\n\n      mask >>= 1;\n    }\n    table->num_hints = count;\n\n    /* now, sort the hints; they are guaranteed to not overlap */\n    /* so we can compare their \"org_pos\" field directly        */\n    {\n      FT_Int     i1, i2;\n      PSH_Hint   hint1, hint2;\n      PSH_Hint*  sort = table->sort;\n\n\n      /* a simple bubble sort will do, since in 99% of cases, the hints */\n      /* will be already sorted -- and the sort will be linear          */\n      for ( i1 = 1; i1 < (FT_Int)count; i1++ )\n      {\n        hint1 = sort[i1];\n        for ( i2 = i1 - 1; i2 >= 0; i2-- )\n        {\n          hint2 = sort[i2];\n\n          if ( hint2->org_pos < hint1->org_pos )\n            break;\n\n          sort[i2 + 1] = hint2;\n          sort[i2]     = hint1;\n        }\n      }\n    }\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****               HINTS GRID-FITTING AND OPTIMIZATION             *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#if 1\n  static FT_Pos\n  psh_dimension_quantize_len( PSH_Dimension  dim,\n                              FT_Pos         len,\n                              FT_Bool        do_snapping )\n  {\n    if ( len <= 64 )\n      len = 64;\n    else\n    {\n      FT_Pos  delta = len - dim->stdw.widths[0].cur;\n\n\n      if ( delta < 0 )\n        delta = -delta;\n\n      if ( delta < 40 )\n      {\n        len = dim->stdw.widths[0].cur;\n        if ( len < 48 )\n          len = 48;\n      }\n\n      if ( len < 3 * 64 )\n      {\n        delta = ( len & 63 );\n        len  &= -64;\n\n        if ( delta < 10 )\n          len += delta;\n\n        else if ( delta < 32 )\n          len += 10;\n\n        else if ( delta < 54 )\n          len += 54;\n\n        else\n          len += delta;\n      }\n      else\n        len = FT_PIX_ROUND( len );\n    }\n\n    if ( do_snapping )\n      len = FT_PIX_ROUND( len );\n\n    return  len;\n  }\n#endif /* 0 */\n\n\n#ifdef DEBUG_HINTER\n\n  static void\n  ps_simple_scale( PSH_Hint_Table  table,\n                   FT_Fixed        scale,\n                   FT_Fixed        delta,\n                   FT_Int          dimension )\n  {\n    FT_UInt  count;\n\n\n    for ( count = 0; count < table->max_hints; count++ )\n    {\n      PSH_Hint  hint = table->hints + count;\n\n\n      hint->cur_pos = FT_MulFix( hint->org_pos, scale ) + delta;\n      hint->cur_len = FT_MulFix( hint->org_len, scale );\n\n      if ( ps_debug_hint_func )\n        ps_debug_hint_func( hint, dimension );\n    }\n  }\n\n#endif /* DEBUG_HINTER */\n\n\n  static FT_Fixed\n  psh_hint_snap_stem_side_delta( FT_Fixed  pos,\n                                 FT_Fixed  len )\n  {\n    FT_Fixed  delta1 = FT_PIX_ROUND( pos ) - pos;\n    FT_Fixed  delta2 = FT_PIX_ROUND( pos + len ) - pos - len;\n\n\n    if ( FT_ABS( delta1 ) <= FT_ABS( delta2 ) )\n      return delta1;\n    else\n      return delta2;\n  }\n\n\n  static void\n  psh_hint_align( PSH_Hint     hint,\n                  PSH_Globals  globals,\n                  FT_Int       dimension,\n                  PSH_Glyph    glyph )\n  {\n    PSH_Dimension  dim   = &globals->dimension[dimension];\n    FT_Fixed       scale = dim->scale_mult;\n    FT_Fixed       delta = dim->scale_delta;\n\n\n    if ( !psh_hint_is_fitted( hint ) )\n    {\n      FT_Pos  pos = FT_MulFix( hint->org_pos, scale ) + delta;\n      FT_Pos  len = FT_MulFix( hint->org_len, scale );\n\n      FT_Int            do_snapping;\n      FT_Pos            fit_len;\n      PSH_AlignmentRec  align;\n\n\n      /* ignore stem alignments when requested through the hint flags */\n      if ( ( dimension == 0 && !glyph->do_horz_hints ) ||\n           ( dimension == 1 && !glyph->do_vert_hints ) )\n      {\n        hint->cur_pos = pos;\n        hint->cur_len = len;\n\n        psh_hint_set_fitted( hint );\n        return;\n      }\n\n      /* perform stem snapping when requested - this is necessary\n       * for monochrome and LCD hinting modes only\n       */\n      do_snapping = ( dimension == 0 && glyph->do_horz_snapping ) ||\n                    ( dimension == 1 && glyph->do_vert_snapping );\n\n      hint->cur_len = fit_len = len;\n\n      /* check blue zones for horizontal stems */\n      align.align     = PSH_BLUE_ALIGN_NONE;\n      align.align_bot = align.align_top = 0;\n\n      if ( dimension == 1 )\n        psh_blues_snap_stem( &globals->blues,\n                             hint->org_pos + hint->org_len,\n                             hint->org_pos,\n                             &align );\n\n      switch ( align.align )\n      {\n      case PSH_BLUE_ALIGN_TOP:\n        /* the top of the stem is aligned against a blue zone */\n        hint->cur_pos = align.align_top - fit_len;\n        break;\n\n      case PSH_BLUE_ALIGN_BOT:\n        /* the bottom of the stem is aligned against a blue zone */\n        hint->cur_pos = align.align_bot;\n        break;\n\n      case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT:\n        /* both edges of the stem are aligned against blue zones */\n        hint->cur_pos = align.align_bot;\n        hint->cur_len = align.align_top - align.align_bot;\n        break;\n\n      default:\n        {\n          PSH_Hint  parent = hint->parent;\n\n\n          if ( parent )\n          {\n            FT_Pos  par_org_center, par_cur_center;\n            FT_Pos  cur_org_center, cur_delta;\n\n\n            /* ensure that parent is already fitted */\n            if ( !psh_hint_is_fitted( parent ) )\n              psh_hint_align( parent, globals, dimension, glyph );\n\n            /* keep original relation between hints, this is, use the */\n            /* scaled distance between the centers of the hints to    */\n            /* compute the new position                               */\n            par_org_center = parent->org_pos + ( parent->org_len >> 1 );\n            par_cur_center = parent->cur_pos + ( parent->cur_len >> 1 );\n            cur_org_center = hint->org_pos   + ( hint->org_len   >> 1 );\n\n            cur_delta = FT_MulFix( cur_org_center - par_org_center, scale );\n            pos       = par_cur_center + cur_delta - ( len >> 1 );\n          }\n\n          hint->cur_pos = pos;\n          hint->cur_len = fit_len;\n\n          /* Stem adjustment tries to snap stem widths to standard\n           * ones.  This is important to prevent unpleasant rounding\n           * artefacts.\n           */\n          if ( glyph->do_stem_adjust )\n          {\n            if ( len <= 64 )\n            {\n              /* the stem is less than one pixel; we will center it\n               * around the nearest pixel center\n               */\n              if ( len >= 32 )\n              {\n                /* This is a special case where we also widen the stem\n                 * and align it to the pixel grid.\n                 *\n                 *   stem_center          = pos + (len/2)\n                 *   nearest_pixel_center = FT_ROUND(stem_center-32)+32\n                 *   new_pos              = nearest_pixel_center-32\n                 *                        = FT_ROUND(stem_center-32)\n                 *                        = FT_FLOOR(stem_center-32+32)\n                 *                        = FT_FLOOR(stem_center)\n                 *   new_len              = 64\n                 */\n                pos = FT_PIX_FLOOR( pos + ( len >> 1 ) );\n                len = 64;\n              }\n              else if ( len > 0 )\n              {\n                /* This is a very small stem; we simply align it to the\n                 * pixel grid, trying to find the minimum displacement.\n                 *\n                 * left               = pos\n                 * right              = pos + len\n                 * left_nearest_edge  = ROUND(pos)\n                 * right_nearest_edge = ROUND(right)\n                 *\n                 * if ( ABS(left_nearest_edge - left) <=\n                 *      ABS(right_nearest_edge - right) )\n                 *    new_pos = left\n                 * else\n                 *    new_pos = right\n                 */\n                FT_Pos  left_nearest  = FT_PIX_ROUND( pos );\n                FT_Pos  right_nearest = FT_PIX_ROUND( pos + len );\n                FT_Pos  left_disp     = left_nearest - pos;\n                FT_Pos  right_disp    = right_nearest - ( pos + len );\n\n\n                if ( left_disp < 0 )\n                  left_disp = -left_disp;\n                if ( right_disp < 0 )\n                  right_disp = -right_disp;\n                if ( left_disp <= right_disp )\n                  pos = left_nearest;\n                else\n                  pos = right_nearest;\n              }\n              else\n              {\n                /* this is a ghost stem; we simply round it */\n                pos = FT_PIX_ROUND( pos );\n              }\n            }\n            else\n            {\n              len = psh_dimension_quantize_len( dim, len, 0 );\n            }\n          }\n\n          /* now that we have a good hinted stem width, try to position */\n          /* the stem along a pixel grid integer coordinate             */\n          hint->cur_pos = pos + psh_hint_snap_stem_side_delta( pos, len );\n          hint->cur_len = len;\n        }\n      }\n\n      if ( do_snapping )\n      {\n        pos = hint->cur_pos;\n        len = hint->cur_len;\n\n        if ( len < 64 )\n          len = 64;\n        else\n          len = FT_PIX_ROUND( len );\n\n        switch ( align.align )\n        {\n          case PSH_BLUE_ALIGN_TOP:\n            hint->cur_pos = align.align_top - len;\n            hint->cur_len = len;\n            break;\n\n          case PSH_BLUE_ALIGN_BOT:\n            hint->cur_len = len;\n            break;\n\n          case PSH_BLUE_ALIGN_BOT | PSH_BLUE_ALIGN_TOP:\n            /* don't touch */\n            break;\n\n\n          default:\n            hint->cur_len = len;\n            if ( len & 64 )\n              pos = FT_PIX_FLOOR( pos + ( len >> 1 ) ) + 32;\n            else\n              pos = FT_PIX_ROUND( pos + ( len >> 1 ) );\n\n            hint->cur_pos = pos - ( len >> 1 );\n            hint->cur_len = len;\n        }\n      }\n\n      psh_hint_set_fitted( hint );\n\n#ifdef DEBUG_HINTER\n      if ( ps_debug_hint_func )\n        ps_debug_hint_func( hint, dimension );\n#endif\n    }\n  }\n\n\n#if 0  /* not used for now, experimental */\n\n /*\n  *  A variant to perform \"light\" hinting (i.e. FT_RENDER_MODE_LIGHT)\n  *  of stems\n  */\n  static void\n  psh_hint_align_light( PSH_Hint     hint,\n                        PSH_Globals  globals,\n                        FT_Int       dimension,\n                        PSH_Glyph    glyph )\n  {\n    PSH_Dimension  dim   = &globals->dimension[dimension];\n    FT_Fixed       scale = dim->scale_mult;\n    FT_Fixed       delta = dim->scale_delta;\n\n\n    if ( !psh_hint_is_fitted( hint ) )\n    {\n      FT_Pos  pos = FT_MulFix( hint->org_pos, scale ) + delta;\n      FT_Pos  len = FT_MulFix( hint->org_len, scale );\n\n      FT_Pos  fit_len;\n\n      PSH_AlignmentRec  align;\n\n\n      /* ignore stem alignments when requested through the hint flags */\n      if ( ( dimension == 0 && !glyph->do_horz_hints ) ||\n           ( dimension == 1 && !glyph->do_vert_hints ) )\n      {\n        hint->cur_pos = pos;\n        hint->cur_len = len;\n\n        psh_hint_set_fitted( hint );\n        return;\n      }\n\n      fit_len = len;\n\n      hint->cur_len = fit_len;\n\n      /* check blue zones for horizontal stems */\n      align.align = PSH_BLUE_ALIGN_NONE;\n      align.align_bot = align.align_top = 0;\n\n      if ( dimension == 1 )\n        psh_blues_snap_stem( &globals->blues,\n                             hint->org_pos + hint->org_len,\n                             hint->org_pos,\n                             &align );\n\n      switch ( align.align )\n      {\n      case PSH_BLUE_ALIGN_TOP:\n        /* the top of the stem is aligned against a blue zone */\n        hint->cur_pos = align.align_top - fit_len;\n        break;\n\n      case PSH_BLUE_ALIGN_BOT:\n        /* the bottom of the stem is aligned against a blue zone */\n        hint->cur_pos = align.align_bot;\n        break;\n\n      case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT:\n        /* both edges of the stem are aligned against blue zones */\n        hint->cur_pos = align.align_bot;\n        hint->cur_len = align.align_top - align.align_bot;\n        break;\n\n      default:\n        {\n          PSH_Hint  parent = hint->parent;\n\n\n          if ( parent )\n          {\n            FT_Pos  par_org_center, par_cur_center;\n            FT_Pos  cur_org_center, cur_delta;\n\n\n            /* ensure that parent is already fitted */\n            if ( !psh_hint_is_fitted( parent ) )\n              psh_hint_align_light( parent, globals, dimension, glyph );\n\n            par_org_center = parent->org_pos + ( parent->org_len / 2 );\n            par_cur_center = parent->cur_pos + ( parent->cur_len / 2 );\n            cur_org_center = hint->org_pos   + ( hint->org_len   / 2 );\n\n            cur_delta = FT_MulFix( cur_org_center - par_org_center, scale );\n            pos       = par_cur_center + cur_delta - ( len >> 1 );\n          }\n\n          /* Stems less than one pixel wide are easy -- we want to\n           * make them as dark as possible, so they must fall within\n           * one pixel.  If the stem is split between two pixels\n           * then snap the edge that is nearer to the pixel boundary\n           * to the pixel boundary.\n           */\n          if ( len <= 64 )\n          {\n            if ( ( pos + len + 63 ) / 64  != pos / 64 + 1 )\n              pos += psh_hint_snap_stem_side_delta ( pos, len );\n          }\n\n          /* Position stems other to minimize the amount of mid-grays.\n           * There are, in general, two positions that do this,\n           * illustrated as A) and B) below.\n           *\n           *   +                   +                   +                   +\n           *\n           * A)             |--------------------------------|\n           * B)   |--------------------------------|\n           * C)       |--------------------------------|\n           *\n           * Position A) (split the excess stem equally) should be better\n           * for stems of width N + f where f < 0.5.\n           *\n           * Position B) (split the deficiency equally) should be better\n           * for stems of width N + f where f > 0.5.\n           *\n           * It turns out though that minimizing the total number of lit\n           * pixels is also important, so position C), with one edge\n           * aligned with a pixel boundary is actually preferable\n           * to A).  There are also more possibile positions for C) than\n           * for A) or B), so it involves less distortion of the overall\n           * character shape.\n           */\n          else /* len > 64 */\n          {\n            FT_Fixed  frac_len = len & 63;\n            FT_Fixed  center = pos + ( len >> 1 );\n            FT_Fixed  delta_a, delta_b;\n\n\n            if ( ( len / 64 ) & 1 )\n            {\n              delta_a = FT_PIX_FLOOR( center ) + 32 - center;\n              delta_b = FT_PIX_ROUND( center ) - center;\n            }\n            else\n            {\n              delta_a = FT_PIX_ROUND( center ) - center;\n              delta_b = FT_PIX_FLOOR( center ) + 32 - center;\n            }\n\n            /* We choose between B) and C) above based on the amount\n             * of fractinal stem width; for small amounts, choose\n             * C) always, for large amounts, B) always, and inbetween,\n             * pick whichever one involves less stem movement.\n             */\n            if ( frac_len < 32 )\n            {\n              pos += psh_hint_snap_stem_side_delta ( pos, len );\n            }\n            else if ( frac_len < 48 )\n            {\n              FT_Fixed  side_delta = psh_hint_snap_stem_side_delta ( pos,\n                                                                     len );\n\n              if ( FT_ABS( side_delta ) < FT_ABS( delta_b ) )\n                pos += side_delta;\n              else\n                pos += delta_b;\n            }\n            else\n            {\n              pos += delta_b;\n            }\n          }\n\n          hint->cur_pos = pos;\n        }\n      }  /* switch */\n\n      psh_hint_set_fitted( hint );\n\n#ifdef DEBUG_HINTER\n      if ( ps_debug_hint_func )\n        ps_debug_hint_func( hint, dimension );\n#endif\n    }\n  }\n\n#endif /* 0 */\n\n\n  static void\n  psh_hint_table_align_hints( PSH_Hint_Table  table,\n                              PSH_Globals     globals,\n                              FT_Int          dimension,\n                              PSH_Glyph       glyph )\n  {\n    PSH_Hint       hint;\n    FT_UInt        count;\n\n#ifdef DEBUG_HINTER\n\n    PSH_Dimension  dim   = &globals->dimension[dimension];\n    FT_Fixed       scale = dim->scale_mult;\n    FT_Fixed       delta = dim->scale_delta;\n\n\n    if ( ps_debug_no_vert_hints && dimension == 0 )\n    {\n      ps_simple_scale( table, scale, delta, dimension );\n      return;\n    }\n\n    if ( ps_debug_no_horz_hints && dimension == 1 )\n    {\n      ps_simple_scale( table, scale, delta, dimension );\n      return;\n    }\n\n#endif /* DEBUG_HINTER*/\n\n    hint  = table->hints;\n    count = table->max_hints;\n\n    for ( ; count > 0; count--, hint++ )\n      psh_hint_align( hint, globals, dimension, glyph );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                POINTS INTERPOLATION ROUTINES                  *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#define PSH_ZONE_MIN  -3200000L\n#define PSH_ZONE_MAX  +3200000L\n\n#define xxDEBUG_ZONES\n\n\n#ifdef DEBUG_ZONES\n\n#include \"../../include/freetype/config/ftstdlib.h\"\n\n  static void\n  psh_print_zone( PSH_Zone  zone )\n  {\n    printf( \"zone [scale,delta,min,max] = [%.3f,%.3f,%d,%d]\\n\",\n             zone->scale / 65536.0,\n             zone->delta / 64.0,\n             zone->min,\n             zone->max );\n  }\n\n#else\n\n#define psh_print_zone( x )  do { } while ( 0 )\n\n#endif /* DEBUG_ZONES */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    HINTER GLYPH MANAGEMENT                    *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#if 1\n\n#define  psh_corner_is_flat      ft_corner_is_flat\n#define  psh_corner_orientation  ft_corner_orientation\n\n#else\n\n  FT_LOCAL_DEF( FT_Int )\n  psh_corner_is_flat( FT_Pos  x_in,\n                      FT_Pos  y_in,\n                      FT_Pos  x_out,\n                      FT_Pos  y_out )\n  {\n    FT_Pos  ax = x_in;\n    FT_Pos  ay = y_in;\n\n    FT_Pos  d_in, d_out, d_corner;\n\n\n    if ( ax < 0 )\n      ax = -ax;\n    if ( ay < 0 )\n      ay = -ay;\n    d_in = ax + ay;\n\n    ax = x_out;\n    if ( ax < 0 )\n      ax = -ax;\n    ay = y_out;\n    if ( ay < 0 )\n      ay = -ay;\n    d_out = ax + ay;\n\n    ax = x_out + x_in;\n    if ( ax < 0 )\n      ax = -ax;\n    ay = y_out + y_in;\n    if ( ay < 0 )\n      ay = -ay;\n    d_corner = ax + ay;\n\n    return ( d_in + d_out - d_corner ) < ( d_corner >> 4 );\n  }\n\n  static FT_Int\n  psh_corner_orientation( FT_Pos  in_x,\n                          FT_Pos  in_y,\n                          FT_Pos  out_x,\n                          FT_Pos  out_y )\n  {\n    FT_Int  result;\n\n\n    /* deal with the trivial cases quickly */\n    if ( in_y == 0 )\n    {\n      if ( in_x >= 0 )\n        result = out_y;\n      else\n        result = -out_y;\n    }\n    else if ( in_x == 0 )\n    {\n      if ( in_y >= 0 )\n        result = -out_x;\n      else\n        result = out_x;\n    }\n    else if ( out_y == 0 )\n    {\n      if ( out_x >= 0 )\n        result = in_y;\n      else\n        result = -in_y;\n    }\n    else if ( out_x == 0 )\n    {\n      if ( out_y >= 0 )\n        result = -in_x;\n      else\n        result =  in_x;\n    }\n    else /* general case */\n    {\n      long long  delta = (long long)in_x * out_y - (long long)in_y * out_x;\n\n      if ( delta == 0 )\n        result = 0;\n      else\n        result = 1 - 2 * ( delta < 0 );\n    }\n\n    return result;\n  }\n\n#endif /* !1 */\n\n\n#ifdef COMPUTE_INFLEXS\n\n  /* compute all inflex points in a given glyph */\n  static void\n  psh_glyph_compute_inflections( PSH_Glyph  glyph )\n  {\n    FT_UInt  n;\n\n\n    for ( n = 0; n < glyph->num_contours; n++ )\n    {\n      PSH_Point  first, start, end, before, after;\n      FT_Pos     in_x, in_y, out_x, out_y;\n      FT_Int     orient_prev, orient_cur;\n      FT_Int     finished = 0;\n\n\n      /* we need at least 4 points to create an inflection point */\n      if ( glyph->contours[n].count < 4 )\n        continue;\n\n      /* compute first segment in contour */\n      first = glyph->contours[n].start;\n\n      start = end = first;\n      do\n      {\n        end = end->next;\n        if ( end == first )\n          goto Skip;\n\n        in_x = end->org_u - start->org_u;\n        in_y = end->org_v - start->org_v;\n\n      } while ( in_x == 0 && in_y == 0 );\n\n      /* extend the segment start whenever possible */\n      before = start;\n      do\n      {\n        do\n        {\n          start  = before;\n          before = before->prev;\n          if ( before == first )\n            goto Skip;\n\n          out_x = start->org_u - before->org_u;\n          out_y = start->org_v - before->org_v;\n\n        } while ( out_x == 0 && out_y == 0 );\n\n        orient_prev = psh_corner_orientation( in_x, in_y, out_x, out_y );\n\n      } while ( orient_prev == 0 );\n\n      first = start;\n      in_x  = out_x;\n      in_y  = out_y;\n\n      /* now, process all segments in the contour */\n      do\n      {\n        /* first, extend current segment's end whenever possible */\n        after = end;\n        do\n        {\n          do\n          {\n            end   = after;\n            after = after->next;\n            if ( after == first )\n              finished = 1;\n\n            out_x = after->org_u - end->org_u;\n            out_y = after->org_v - end->org_v;\n\n          } while ( out_x == 0 && out_y == 0 );\n\n          orient_cur = psh_corner_orientation( in_x, in_y, out_x, out_y );\n\n        } while ( orient_cur == 0 );\n\n        if ( ( orient_cur ^ orient_prev ) < 0 )\n        {\n          do\n          {\n            psh_point_set_inflex( start );\n            start = start->next;\n          }\n          while ( start != end );\n\n          psh_point_set_inflex( start );\n        }\n\n        start       = end;\n        end         = after;\n        orient_prev = orient_cur;\n        in_x        = out_x;\n        in_y        = out_y;\n\n      } while ( !finished );\n\n    Skip:\n      ;\n    }\n  }\n\n#endif /* COMPUTE_INFLEXS */\n\n\n  static void\n  psh_glyph_done( PSH_Glyph  glyph )\n  {\n    FT_Memory  memory = glyph->memory;\n\n\n    psh_hint_table_done( &glyph->hint_tables[1], memory );\n    psh_hint_table_done( &glyph->hint_tables[0], memory );\n\n    FT_FREE( glyph->points );\n    FT_FREE( glyph->contours );\n\n    glyph->num_points   = 0;\n    glyph->num_contours = 0;\n\n    glyph->memory = 0;\n  }\n\n\n  static int\n  psh_compute_dir( FT_Pos  dx,\n                   FT_Pos  dy )\n  {\n    FT_Pos  ax, ay;\n    int     result = PSH_DIR_NONE;\n\n\n    ax = FT_ABS( dx );\n    ay = FT_ABS( dy );\n\n    if ( ay * 12 < ax )\n    {\n      /* |dy| <<< |dx|  means a near-horizontal segment */\n      result = ( dx >= 0 ) ? PSH_DIR_RIGHT : PSH_DIR_LEFT;\n    }\n    else if ( ax * 12 < ay )\n    {\n      /* |dx| <<< |dy|  means a near-vertical segment */\n      result = ( dy >= 0 ) ? PSH_DIR_UP : PSH_DIR_DOWN;\n    }\n\n    return result;\n  }\n\n\n  /* load outline point coordinates into hinter glyph */\n  static void\n  psh_glyph_load_points( PSH_Glyph  glyph,\n                         FT_Int     dimension )\n  {\n    FT_Vector*  vec   = glyph->outline->points;\n    PSH_Point   point = glyph->points;\n    FT_UInt     count = glyph->num_points;\n\n\n    for ( ; count > 0; count--, point++, vec++ )\n    {\n      point->flags2 = 0;\n      point->hint   = NULL;\n      if ( dimension == 0 )\n      {\n        point->org_u = vec->x;\n        point->org_v = vec->y;\n      }\n      else\n      {\n        point->org_u = vec->y;\n        point->org_v = vec->x;\n      }\n\n#ifdef DEBUG_HINTER\n      point->org_x = vec->x;\n      point->org_y = vec->y;\n#endif\n\n    }\n  }\n\n\n  /* save hinted point coordinates back to outline */\n  static void\n  psh_glyph_save_points( PSH_Glyph  glyph,\n                         FT_Int     dimension )\n  {\n    FT_UInt     n;\n    PSH_Point   point = glyph->points;\n    FT_Vector*  vec   = glyph->outline->points;\n    char*       tags  = glyph->outline->tags;\n\n\n    for ( n = 0; n < glyph->num_points; n++ )\n    {\n      if ( dimension == 0 )\n        vec[n].x = point->cur_u;\n      else\n        vec[n].y = point->cur_u;\n\n      if ( psh_point_is_strong( point ) )\n        tags[n] |= (char)( ( dimension == 0 ) ? 32 : 64 );\n\n#ifdef DEBUG_HINTER\n\n      if ( dimension == 0 )\n      {\n        point->cur_x   = point->cur_u;\n        point->flags_x = point->flags2 | point->flags;\n      }\n      else\n      {\n        point->cur_y   = point->cur_u;\n        point->flags_y = point->flags2 | point->flags;\n      }\n\n#endif\n\n      point++;\n    }\n  }\n\n\n  static FT_Error\n  psh_glyph_init( PSH_Glyph    glyph,\n                  FT_Outline*  outline,\n                  PS_Hints     ps_hints,\n                  PSH_Globals  globals )\n  {\n    FT_Error   error;\n    FT_Memory  memory;\n\n\n    /* clear all fields */\n    FT_MEM_ZERO( glyph, sizeof ( *glyph ) );\n\n    memory = glyph->memory = globals->memory;\n\n    /* allocate and setup points + contours arrays */\n    if ( FT_NEW_ARRAY( glyph->points,   outline->n_points   ) ||\n         FT_NEW_ARRAY( glyph->contours, outline->n_contours ) )\n      goto Exit;\n\n    glyph->num_points   = outline->n_points;\n    glyph->num_contours = outline->n_contours;\n\n    {\n      FT_UInt      first = 0, next, n;\n      PSH_Point    points  = glyph->points;\n      PSH_Contour  contour = glyph->contours;\n\n\n      for ( n = 0; n < glyph->num_contours; n++ )\n      {\n        FT_Int     count;\n        PSH_Point  point;\n\n\n        next  = outline->contours[n] + 1;\n        count = next - first;\n\n        contour->start = points + first;\n        contour->count = (FT_UInt)count;\n\n        if ( count > 0 )\n        {\n          point = points + first;\n\n          point->prev    = points + next - 1;\n          point->contour = contour;\n\n          for ( ; count > 1; count-- )\n          {\n            point[0].next = point + 1;\n            point[1].prev = point;\n            point++;\n            point->contour = contour;\n          }\n          point->next = points + first;\n        }\n\n        contour++;\n        first = next;\n      }\n    }\n\n    {\n      PSH_Point   points = glyph->points;\n      PSH_Point   point  = points;\n      FT_Vector*  vec    = outline->points;\n      FT_UInt     n;\n\n\n      for ( n = 0; n < glyph->num_points; n++, point++ )\n      {\n        FT_Int  n_prev = (FT_Int)( point->prev - points );\n        FT_Int  n_next = (FT_Int)( point->next - points );\n        FT_Pos  dxi, dyi, dxo, dyo;\n\n\n        if ( !( outline->tags[n] & FT_CURVE_TAG_ON ) )\n          point->flags = PSH_POINT_OFF;\n\n        dxi = vec[n].x - vec[n_prev].x;\n        dyi = vec[n].y - vec[n_prev].y;\n\n        point->dir_in = (FT_Char)psh_compute_dir( dxi, dyi );\n\n        dxo = vec[n_next].x - vec[n].x;\n        dyo = vec[n_next].y - vec[n].y;\n\n        point->dir_out = (FT_Char)psh_compute_dir( dxo, dyo );\n\n        /* detect smooth points */\n        if ( point->flags & PSH_POINT_OFF )\n          point->flags |= PSH_POINT_SMOOTH;\n\n        else if ( point->dir_in == point->dir_out )\n        {\n          if ( point->dir_out != PSH_DIR_NONE           ||\n               psh_corner_is_flat( dxi, dyi, dxo, dyo ) )\n            point->flags |= PSH_POINT_SMOOTH;\n        }\n      }\n    }\n\n    glyph->outline = outline;\n    glyph->globals = globals;\n\n#ifdef COMPUTE_INFLEXS\n    psh_glyph_load_points( glyph, 0 );\n    psh_glyph_compute_inflections( glyph );\n#endif /* COMPUTE_INFLEXS */\n\n    /* now deal with hints tables */\n    error = psh_hint_table_init( &glyph->hint_tables [0],\n                                 &ps_hints->dimension[0].hints,\n                                 &ps_hints->dimension[0].masks,\n                                 &ps_hints->dimension[0].counters,\n                                 memory );\n    if ( error )\n      goto Exit;\n\n    error = psh_hint_table_init( &glyph->hint_tables [1],\n                                 &ps_hints->dimension[1].hints,\n                                 &ps_hints->dimension[1].masks,\n                                 &ps_hints->dimension[1].counters,\n                                 memory );\n    if ( error )\n      goto Exit;\n\n  Exit:\n    return error;\n  }\n\n\n  /* compute all extrema in a glyph for a given dimension */\n  static void\n  psh_glyph_compute_extrema( PSH_Glyph  glyph )\n  {\n    FT_UInt  n;\n\n\n    /* first of all, compute all local extrema */\n    for ( n = 0; n < glyph->num_contours; n++ )\n    {\n      PSH_Point  first = glyph->contours[n].start;\n      PSH_Point  point, before, after;\n\n\n      if ( glyph->contours[n].count == 0 )\n        continue;\n\n      point  = first;\n      before = point;\n      after  = point;\n\n      do\n      {\n        before = before->prev;\n        if ( before == first )\n          goto Skip;\n\n      } while ( before->org_u == point->org_u );\n\n      first = point = before->next;\n\n      for (;;)\n      {\n        after = point;\n        do\n        {\n          after = after->next;\n          if ( after == first )\n            goto Next;\n\n        } while ( after->org_u == point->org_u );\n\n        if ( before->org_u < point->org_u )\n        {\n          if ( after->org_u < point->org_u )\n          {\n            /* local maximum */\n            goto Extremum;\n          }\n        }\n        else /* before->org_u > point->org_u */\n        {\n          if ( after->org_u > point->org_u )\n          {\n            /* local minimum */\n          Extremum:\n            do\n            {\n              psh_point_set_extremum( point );\n              point = point->next;\n\n            } while ( point != after );\n          }\n        }\n\n        before = after->prev;\n        point  = after;\n\n      } /* for  */\n\n    Next:\n      ;\n    }\n\n    /* for each extremum, determine its direction along the */\n    /* orthogonal axis                                      */\n    for ( n = 0; n < glyph->num_points; n++ )\n    {\n      PSH_Point  point, before, after;\n\n\n      point  = &glyph->points[n];\n      before = point;\n      after  = point;\n\n      if ( psh_point_is_extremum( point ) )\n      {\n        do\n        {\n          before = before->prev;\n          if ( before == point )\n            goto Skip;\n\n        } while ( before->org_v == point->org_v );\n\n        do\n        {\n          after = after->next;\n          if ( after == point )\n            goto Skip;\n\n        } while ( after->org_v == point->org_v );\n      }\n\n      if ( before->org_v < point->org_v &&\n           after->org_v  > point->org_v )\n      {\n        psh_point_set_positive( point );\n      }\n      else if ( before->org_v > point->org_v &&\n                after->org_v  < point->org_v )\n      {\n        psh_point_set_negative( point );\n      }\n\n    Skip:\n      ;\n    }\n  }\n\n\n  /* major_dir is the direction for points on the bottom/left of the stem; */\n  /* Points on the top/right of the stem will have a direction of          */\n  /* -major_dir.                                                           */\n\n  static void\n  psh_hint_table_find_strong_points( PSH_Hint_Table  table,\n                                     PSH_Point       point,\n                                     FT_UInt         count,\n                                     FT_Int          threshold,\n                                     FT_Int          major_dir )\n  {\n    PSH_Hint*  sort      = table->sort;\n    FT_UInt    num_hints = table->num_hints;\n\n\n    for ( ; count > 0; count--, point++ )\n    {\n      FT_Int  point_dir = 0;\n      FT_Pos  org_u     = point->org_u;\n\n\n      if ( psh_point_is_strong( point ) )\n        continue;\n\n      if ( PSH_DIR_COMPARE( point->dir_in, major_dir ) )\n        point_dir = point->dir_in;\n\n      else if ( PSH_DIR_COMPARE( point->dir_out, major_dir ) )\n        point_dir = point->dir_out;\n\n      if ( point_dir )\n      {\n        if ( point_dir == major_dir )\n        {\n          FT_UInt  nn;\n\n\n          for ( nn = 0; nn < num_hints; nn++ )\n          {\n            PSH_Hint  hint = sort[nn];\n            FT_Pos    d    = org_u - hint->org_pos;\n\n\n            if ( d < threshold && -d < threshold )\n            {\n              psh_point_set_strong( point );\n              point->flags2 |= PSH_POINT_EDGE_MIN;\n              point->hint    = hint;\n              break;\n            }\n          }\n        }\n        else if ( point_dir == -major_dir )\n        {\n          FT_UInt  nn;\n\n\n          for ( nn = 0; nn < num_hints; nn++ )\n          {\n            PSH_Hint  hint = sort[nn];\n            FT_Pos    d    = org_u - hint->org_pos - hint->org_len;\n\n\n            if ( d < threshold && -d < threshold )\n            {\n              psh_point_set_strong( point );\n              point->flags2 |= PSH_POINT_EDGE_MAX;\n              point->hint    = hint;\n              break;\n            }\n          }\n        }\n      }\n\n#if 1\n      else if ( psh_point_is_extremum( point ) )\n      {\n        /* treat extrema as special cases for stem edge alignment */\n        FT_UInt  nn, min_flag, max_flag;\n\n\n        if ( major_dir == PSH_DIR_HORIZONTAL )\n        {\n          min_flag = PSH_POINT_POSITIVE;\n          max_flag = PSH_POINT_NEGATIVE;\n        }\n        else\n        {\n          min_flag = PSH_POINT_NEGATIVE;\n          max_flag = PSH_POINT_POSITIVE;\n        }\n\n        if ( point->flags2 & min_flag )\n        {\n          for ( nn = 0; nn < num_hints; nn++ )\n          {\n            PSH_Hint  hint = sort[nn];\n            FT_Pos    d    = org_u - hint->org_pos;\n\n\n            if ( d < threshold && -d < threshold )\n            {\n              point->flags2 |= PSH_POINT_EDGE_MIN;\n              point->hint    = hint;\n              psh_point_set_strong( point );\n              break;\n            }\n          }\n        }\n        else if ( point->flags2 & max_flag )\n        {\n          for ( nn = 0; nn < num_hints; nn++ )\n          {\n            PSH_Hint  hint = sort[nn];\n            FT_Pos    d    = org_u - hint->org_pos - hint->org_len;\n\n\n            if ( d < threshold && -d < threshold )\n            {\n              point->flags2 |= PSH_POINT_EDGE_MAX;\n              point->hint    = hint;\n              psh_point_set_strong( point );\n              break;\n            }\n          }\n        }\n\n        if ( point->hint == NULL )\n        {\n          for ( nn = 0; nn < num_hints; nn++ )\n          {\n            PSH_Hint  hint = sort[nn];\n\n\n            if ( org_u >= hint->org_pos                 &&\n                org_u <= hint->org_pos + hint->org_len )\n            {\n              point->hint = hint;\n              break;\n            }\n          }\n        }\n      }\n\n#endif /* 1 */\n    }\n  }\n\n\n  /* the accepted shift for strong points in fractional pixels */\n#define PSH_STRONG_THRESHOLD  32\n\n  /* the maximum shift value in font units */\n#define PSH_STRONG_THRESHOLD_MAXIMUM  30\n\n\n  /* find strong points in a glyph */\n  static void\n  psh_glyph_find_strong_points( PSH_Glyph  glyph,\n                                FT_Int     dimension )\n  {\n    /* a point is `strong' if it is located on a stem edge and       */\n    /* has an `in' or `out' tangent parallel to the hint's direction */\n\n    PSH_Hint_Table  table     = &glyph->hint_tables[dimension];\n    PS_Mask         mask      = table->hint_masks->masks;\n    FT_UInt         num_masks = table->hint_masks->num_masks;\n    FT_UInt         first     = 0;\n    FT_Int          major_dir = dimension == 0 ? PSH_DIR_VERTICAL\n                                               : PSH_DIR_HORIZONTAL;\n    PSH_Dimension   dim       = &glyph->globals->dimension[dimension];\n    FT_Fixed        scale     = dim->scale_mult;\n    FT_Int          threshold;\n\n\n    threshold = (FT_Int)FT_DivFix( PSH_STRONG_THRESHOLD, scale );\n    if ( threshold > PSH_STRONG_THRESHOLD_MAXIMUM )\n      threshold = PSH_STRONG_THRESHOLD_MAXIMUM;\n\n    /* process secondary hints to `selected' points */\n    if ( num_masks > 1 && glyph->num_points > 0 )\n    {\n      /* the `endchar' op can reduce the number of points */\n      first = mask->end_point > glyph->num_points\n                ? glyph->num_points\n                : mask->end_point;\n      mask++;\n      for ( ; num_masks > 1; num_masks--, mask++ )\n      {\n        FT_UInt  next;\n        FT_Int   count;\n\n\n        next  = mask->end_point > glyph->num_points\n                  ? glyph->num_points\n                  : mask->end_point;\n        count = next - first;\n        if ( count > 0 )\n        {\n          PSH_Point  point = glyph->points + first;\n\n\n          psh_hint_table_activate_mask( table, mask );\n\n          psh_hint_table_find_strong_points( table, point, count,\n                                             threshold, major_dir );\n        }\n        first = next;\n      }\n    }\n\n    /* process primary hints for all points */\n    if ( num_masks == 1 )\n    {\n      FT_UInt    count = glyph->num_points;\n      PSH_Point  point = glyph->points;\n\n\n      psh_hint_table_activate_mask( table, table->hint_masks->masks );\n\n      psh_hint_table_find_strong_points( table, point, count,\n                                         threshold, major_dir );\n    }\n\n    /* now, certain points may have been attached to a hint and */\n    /* not marked as strong; update their flags then            */\n    {\n      FT_UInt    count = glyph->num_points;\n      PSH_Point  point = glyph->points;\n\n\n      for ( ; count > 0; count--, point++ )\n        if ( point->hint && !psh_point_is_strong( point ) )\n          psh_point_set_strong( point );\n    }\n  }\n\n\n  /* find points in a glyph which are in a blue zone and have `in' or */\n  /* `out' tangents parallel to the horizontal axis                   */\n  static void\n  psh_glyph_find_blue_points( PSH_Blues  blues,\n                              PSH_Glyph  glyph )\n  {\n    PSH_Blue_Table  table;\n    PSH_Blue_Zone   zone;\n    FT_UInt         glyph_count = glyph->num_points;\n    FT_UInt         blue_count;\n    PSH_Point       point = glyph->points;\n\n\n    for ( ; glyph_count > 0; glyph_count--, point++ )\n    {\n      FT_Pos  y;\n\n\n      /* check tangents */\n      if ( !PSH_DIR_COMPARE( point->dir_in,  PSH_DIR_HORIZONTAL ) &&\n           !PSH_DIR_COMPARE( point->dir_out, PSH_DIR_HORIZONTAL ) )\n        continue;\n\n      /* skip strong points */\n      if ( psh_point_is_strong( point ) )\n        continue;\n\n      y = point->org_u;\n\n      /* look up top zones */\n      table      = &blues->normal_top;\n      blue_count = table->count;\n      zone       = table->zones;\n\n      for ( ; blue_count > 0; blue_count--, zone++ )\n      {\n        FT_Pos  delta = y - zone->org_bottom;\n\n\n        if ( delta < -blues->blue_fuzz )\n          break;\n\n        if ( y <= zone->org_top + blues->blue_fuzz )\n          if ( blues->no_overshoots || delta <= blues->blue_threshold )\n          {\n            point->cur_u = zone->cur_bottom;\n            psh_point_set_strong( point );\n            psh_point_set_fitted( point );\n          }\n      }\n\n      /* look up bottom zones */\n      table      = &blues->normal_bottom;\n      blue_count = table->count;\n      zone       = table->zones + blue_count - 1;\n\n      for ( ; blue_count > 0; blue_count--, zone-- )\n      {\n        FT_Pos  delta = zone->org_top - y;\n\n\n        if ( delta < -blues->blue_fuzz )\n          break;\n\n        if ( y >= zone->org_bottom - blues->blue_fuzz )\n          if ( blues->no_overshoots || delta < blues->blue_threshold )\n          {\n            point->cur_u = zone->cur_top;\n            psh_point_set_strong( point );\n            psh_point_set_fitted( point );\n          }\n      }\n    }\n  }\n\n\n  /* interpolate strong points with the help of hinted coordinates */\n  static void\n  psh_glyph_interpolate_strong_points( PSH_Glyph  glyph,\n                                       FT_Int     dimension )\n  {\n    PSH_Dimension  dim   = &glyph->globals->dimension[dimension];\n    FT_Fixed       scale = dim->scale_mult;\n\n    FT_UInt        count = glyph->num_points;\n    PSH_Point      point = glyph->points;\n\n\n    for ( ; count > 0; count--, point++ )\n    {\n      PSH_Hint  hint = point->hint;\n\n\n      if ( hint )\n      {\n        FT_Pos  delta;\n\n\n        if ( psh_point_is_edge_min( point ) )\n          point->cur_u = hint->cur_pos;\n\n        else if ( psh_point_is_edge_max( point ) )\n          point->cur_u = hint->cur_pos + hint->cur_len;\n\n        else\n        {\n          delta = point->org_u - hint->org_pos;\n\n          if ( delta <= 0 )\n            point->cur_u = hint->cur_pos + FT_MulFix( delta, scale );\n\n          else if ( delta >= hint->org_len )\n            point->cur_u = hint->cur_pos + hint->cur_len +\n                             FT_MulFix( delta - hint->org_len, scale );\n\n          else /* hint->org_len > 0 */\n            point->cur_u = hint->cur_pos +\n                             FT_MulDiv( delta, hint->cur_len,\n                                        hint->org_len );\n        }\n        psh_point_set_fitted( point );\n      }\n    }\n  }\n\n\n#define  PSH_MAX_STRONG_INTERNAL  16\n\n  static void\n  psh_glyph_interpolate_normal_points( PSH_Glyph  glyph,\n                                       FT_Int     dimension )\n  {\n\n#if 1\n    /* first technique: a point is strong if it is a local extremum */\n\n    PSH_Dimension  dim    = &glyph->globals->dimension[dimension];\n    FT_Fixed       scale  = dim->scale_mult;\n    FT_Memory      memory = glyph->memory;\n\n    PSH_Point*     strongs     = NULL;\n    PSH_Point      strongs_0[PSH_MAX_STRONG_INTERNAL];\n    FT_UInt        num_strongs = 0;\n\n    PSH_Point      points = glyph->points;\n    PSH_Point      points_end = points + glyph->num_points;\n    PSH_Point      point;\n\n\n    /* first count the number of strong points */\n    for ( point = points; point < points_end; point++ )\n    {\n      if ( psh_point_is_strong( point ) )\n        num_strongs++;\n    }\n\n    if ( num_strongs == 0 )  /* nothing to do here */\n      return;\n\n    /* allocate an array to store a list of points, */\n    /* stored in increasing org_u order             */\n    if ( num_strongs <= PSH_MAX_STRONG_INTERNAL )\n      strongs = strongs_0;\n    else\n    {\n      FT_Error  error;\n\n\n      if ( FT_NEW_ARRAY( strongs, num_strongs ) )\n        return;\n    }\n\n    num_strongs = 0;\n    for ( point = points; point < points_end; point++ )\n    {\n      PSH_Point*  insert;\n\n\n      if ( !psh_point_is_strong( point ) )\n        continue;\n\n      for ( insert = strongs + num_strongs; insert > strongs; insert-- )\n      {\n        if ( insert[-1]->org_u <= point->org_u )\n          break;\n\n        insert[0] = insert[-1];\n      }\n      insert[0] = point;\n      num_strongs++;\n    }\n\n    /* now try to interpolate all normal points */\n    for ( point = points; point < points_end; point++ )\n    {\n      if ( psh_point_is_strong( point ) )\n        continue;\n\n      /* sometimes, some local extrema are smooth points */\n      if ( psh_point_is_smooth( point ) )\n      {\n        if ( point->dir_in == PSH_DIR_NONE   ||\n             point->dir_in != point->dir_out )\n          continue;\n\n        if ( !psh_point_is_extremum( point ) &&\n             !psh_point_is_inflex( point )   )\n          continue;\n\n        point->flags &= ~PSH_POINT_SMOOTH;\n      }\n\n      /* find best enclosing point coordinates then interpolate */\n      {\n        PSH_Point   before, after;\n        FT_UInt     nn;\n\n\n        for ( nn = 0; nn < num_strongs; nn++ )\n          if ( strongs[nn]->org_u > point->org_u )\n            break;\n\n        if ( nn == 0 )  /* point before the first strong point */\n        {\n          after = strongs[0];\n\n          point->cur_u = after->cur_u +\n                           FT_MulFix( point->org_u - after->org_u,\n                                      scale );\n        }\n        else\n        {\n          before = strongs[nn - 1];\n\n          for ( nn = num_strongs; nn > 0; nn-- )\n            if ( strongs[nn - 1]->org_u < point->org_u )\n              break;\n\n          if ( nn == num_strongs )  /* point is after last strong point */\n          {\n            before = strongs[nn - 1];\n\n            point->cur_u = before->cur_u +\n                             FT_MulFix( point->org_u - before->org_u,\n                                        scale );\n          }\n          else\n          {\n            FT_Pos  u;\n\n\n            after = strongs[nn];\n\n            /* now interpolate point between before and after */\n            u = point->org_u;\n\n            if ( u == before->org_u )\n              point->cur_u = before->cur_u;\n\n            else if ( u == after->org_u )\n              point->cur_u = after->cur_u;\n\n            else\n              point->cur_u = before->cur_u +\n                               FT_MulDiv( u - before->org_u,\n                                          after->cur_u - before->cur_u,\n                                          after->org_u - before->org_u );\n          }\n        }\n        psh_point_set_fitted( point );\n      }\n    }\n\n    if ( strongs != strongs_0 )\n      FT_FREE( strongs );\n\n#endif /* 1 */\n\n  }\n\n\n  /* interpolate other points */\n  static void\n  psh_glyph_interpolate_other_points( PSH_Glyph  glyph,\n                                      FT_Int     dimension )\n  {\n    PSH_Dimension  dim          = &glyph->globals->dimension[dimension];\n    FT_Fixed       scale        = dim->scale_mult;\n    FT_Fixed       delta        = dim->scale_delta;\n    PSH_Contour    contour      = glyph->contours;\n    FT_UInt        num_contours = glyph->num_contours;\n\n\n    for ( ; num_contours > 0; num_contours--, contour++ )\n    {\n      PSH_Point  start = contour->start;\n      PSH_Point  first, next, point;\n      FT_UInt    fit_count;\n\n\n      /* count the number of strong points in this contour */\n      next      = start + contour->count;\n      fit_count = 0;\n      first     = 0;\n\n      for ( point = start; point < next; point++ )\n        if ( psh_point_is_fitted( point ) )\n        {\n          if ( !first )\n            first = point;\n\n          fit_count++;\n        }\n\n      /* if there are less than 2 fitted points in the contour, we */\n      /* simply scale and eventually translate the contour points  */\n      if ( fit_count < 2 )\n      {\n        if ( fit_count == 1 )\n          delta = first->cur_u - FT_MulFix( first->org_u, scale );\n\n        for ( point = start; point < next; point++ )\n          if ( point != first )\n            point->cur_u = FT_MulFix( point->org_u, scale ) + delta;\n\n        goto Next_Contour;\n      }\n\n      /* there are more than 2 strong points in this contour; we */\n      /* need to interpolate weak points between them            */\n      start = first;\n      do\n      {\n        point = first;\n\n        /* skip consecutive fitted points */\n        for (;;)\n        {\n          next = first->next;\n          if ( next == start )\n            goto Next_Contour;\n\n          if ( !psh_point_is_fitted( next ) )\n            break;\n\n          first = next;\n        }\n\n        /* find next fitted point after unfitted one */\n        for (;;)\n        {\n          next = next->next;\n          if ( psh_point_is_fitted( next ) )\n            break;\n        }\n\n        /* now interpolate between them */\n        {\n          FT_Pos    org_a, org_ab, cur_a, cur_ab;\n          FT_Pos    org_c, org_ac, cur_c;\n          FT_Fixed  scale_ab;\n\n\n          if ( first->org_u <= next->org_u )\n          {\n            org_a  = first->org_u;\n            cur_a  = first->cur_u;\n            org_ab = next->org_u - org_a;\n            cur_ab = next->cur_u - cur_a;\n          }\n          else\n          {\n            org_a  = next->org_u;\n            cur_a  = next->cur_u;\n            org_ab = first->org_u - org_a;\n            cur_ab = first->cur_u - cur_a;\n          }\n\n          scale_ab = 0x10000L;\n          if ( org_ab > 0 )\n            scale_ab = FT_DivFix( cur_ab, org_ab );\n\n          point = first->next;\n          do\n          {\n            org_c  = point->org_u;\n            org_ac = org_c - org_a;\n\n            if ( org_ac <= 0 )\n            {\n              /* on the left of the interpolation zone */\n              cur_c = cur_a + FT_MulFix( org_ac, scale );\n            }\n            else if ( org_ac >= org_ab )\n            {\n              /* on the right on the interpolation zone */\n              cur_c = cur_a + cur_ab + FT_MulFix( org_ac - org_ab, scale );\n            }\n            else\n            {\n              /* within the interpolation zone */\n              cur_c = cur_a + FT_MulFix( org_ac, scale_ab );\n            }\n\n            point->cur_u = cur_c;\n\n            point = point->next;\n\n          } while ( point != next );\n        }\n\n        /* keep going until all points in the contours have been processed */\n        first = next;\n\n      } while ( first != start );\n\n    Next_Contour:\n      ;\n    }\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                     HIGH-LEVEL INTERFACE                      *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_Error\n  ps_hints_apply( PS_Hints        ps_hints,\n                  FT_Outline*     outline,\n                  PSH_Globals     globals,\n                  FT_Render_Mode  hint_mode )\n  {\n    PSH_GlyphRec  glyphrec;\n    PSH_Glyph     glyph = &glyphrec;\n    FT_Error      error;\n#ifdef DEBUG_HINTER\n    FT_Memory     memory;\n#endif\n    FT_Int        dimension;\n\n\n    /* something to do? */\n    if ( outline->n_points == 0 || outline->n_contours == 0 )\n      return FT_Err_Ok;\n\n#ifdef DEBUG_HINTER\n\n    memory = globals->memory;\n\n    if ( ps_debug_glyph )\n    {\n      psh_glyph_done( ps_debug_glyph );\n      FT_FREE( ps_debug_glyph );\n    }\n\n    if ( FT_NEW( glyph ) )\n      return error;\n\n    ps_debug_glyph = glyph;\n\n#endif /* DEBUG_HINTER */\n\n    error = psh_glyph_init( glyph, outline, ps_hints, globals );\n    if ( error )\n      goto Exit;\n\n    /* try to optimize the y_scale so that the top of non-capital letters\n     * is aligned on a pixel boundary whenever possible\n     */\n    {\n      PSH_Dimension  dim_x = &glyph->globals->dimension[0];\n      PSH_Dimension  dim_y = &glyph->globals->dimension[1];\n\n      FT_Fixed  x_scale = dim_x->scale_mult;\n      FT_Fixed  y_scale = dim_y->scale_mult;\n\n      FT_Fixed  old_x_scale = x_scale;\n      FT_Fixed  old_y_scale = y_scale;\n\n      FT_Fixed  scaled;\n      FT_Fixed  fitted;\n\n      FT_Bool  rescale = FALSE;\n\n\n      scaled = FT_MulFix( globals->blues.normal_top.zones->org_ref, y_scale );\n      fitted = FT_PIX_ROUND( scaled );\n\n      if ( fitted != 0 && scaled != fitted )\n      {\n        rescale = TRUE;\n\n        y_scale = FT_MulDiv( y_scale, fitted, scaled );\n\n        if ( fitted < scaled )\n          x_scale -= x_scale / 50;\n\n        psh_globals_set_scale( glyph->globals, x_scale, y_scale, 0, 0 );\n      }\n\n      glyph->do_horz_hints = 1;\n      glyph->do_vert_hints = 1;\n\n      glyph->do_horz_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO ||\n                                         hint_mode == FT_RENDER_MODE_LCD  );\n\n      glyph->do_vert_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO  ||\n                                         hint_mode == FT_RENDER_MODE_LCD_V );\n\n      glyph->do_stem_adjust   = FT_BOOL( hint_mode != FT_RENDER_MODE_LIGHT );\n\n      for ( dimension = 0; dimension < 2; dimension++ )\n      {\n        /* load outline coordinates into glyph */\n        psh_glyph_load_points( glyph, dimension );\n\n        /* compute local extrema */\n        psh_glyph_compute_extrema( glyph );\n\n        /* compute aligned stem/hints positions */\n        psh_hint_table_align_hints( &glyph->hint_tables[dimension],\n                                    glyph->globals,\n                                    dimension,\n                                    glyph );\n\n        /* find strong points, align them, then interpolate others */\n        psh_glyph_find_strong_points( glyph, dimension );\n        if ( dimension == 1 )\n          psh_glyph_find_blue_points( &globals->blues, glyph );\n        psh_glyph_interpolate_strong_points( glyph, dimension );\n        psh_glyph_interpolate_normal_points( glyph, dimension );\n        psh_glyph_interpolate_other_points( glyph, dimension );\n\n        /* save hinted coordinates back to outline */\n        psh_glyph_save_points( glyph, dimension );\n\n        if ( rescale )\n          psh_globals_set_scale( glyph->globals,\n                                 old_x_scale, old_y_scale, 0, 0 );\n      }\n    }\n\n  Exit:\n\n#ifndef DEBUG_HINTER\n    psh_glyph_done( glyph );\n#endif\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshalgo.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pshalgo.h                                                              */\n/*                                                                         */\n/*    PostScript hinting algorithm (specification).                        */\n/*                                                                         */\n/*  Copyright 2001-2003, 2008, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PSHALGO_H__\n#define __PSHALGO_H__\n\n\n#include \"pshrec.h\"\n#include \"pshglob.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /* handle to Hint structure */\n  typedef struct PSH_HintRec_*  PSH_Hint;\n\n  /* hint bit-flags */\n  typedef enum  PSH_Hint_Flags_\n  {\n    PSH_HINT_GHOST  = PS_HINT_FLAG_GHOST,\n    PSH_HINT_BOTTOM = PS_HINT_FLAG_BOTTOM,\n    PSH_HINT_ACTIVE = 4,\n    PSH_HINT_FITTED = 8\n\n  } PSH_Hint_Flags;\n\n\n#define psh_hint_is_active( x )  ( ( (x)->flags & PSH_HINT_ACTIVE ) != 0 )\n#define psh_hint_is_ghost( x )   ( ( (x)->flags & PSH_HINT_GHOST  ) != 0 )\n#define psh_hint_is_fitted( x )  ( ( (x)->flags & PSH_HINT_FITTED ) != 0 )\n\n#define psh_hint_activate( x )    (x)->flags |=  PSH_HINT_ACTIVE\n#define psh_hint_deactivate( x )  (x)->flags &= ~PSH_HINT_ACTIVE\n#define psh_hint_set_fitted( x )  (x)->flags |=  PSH_HINT_FITTED\n\n  /* hint structure */\n  typedef struct  PSH_HintRec_\n  {\n    FT_Int    org_pos;\n    FT_Int    org_len;\n    FT_Pos    cur_pos;\n    FT_Pos    cur_len;\n    FT_UInt   flags;\n    PSH_Hint  parent;\n    FT_Int    order;\n\n  } PSH_HintRec;\n\n\n  /* this is an interpolation zone used for strong points;  */\n  /* weak points are interpolated according to their strong */\n  /* neighbours                                             */\n  typedef struct  PSH_ZoneRec_\n  {\n    FT_Fixed  scale;\n    FT_Fixed  delta;\n    FT_Pos    min;\n    FT_Pos    max;\n\n  } PSH_ZoneRec, *PSH_Zone;\n\n\n  typedef struct  PSH_Hint_TableRec_\n  {\n    FT_UInt        max_hints;\n    FT_UInt        num_hints;\n    PSH_Hint       hints;\n    PSH_Hint*      sort;\n    PSH_Hint*      sort_global;\n    FT_UInt        num_zones;\n    PSH_ZoneRec*   zones;\n    PSH_Zone       zone;\n    PS_Mask_Table  hint_masks;\n    PS_Mask_Table  counter_masks;\n\n  } PSH_Hint_TableRec, *PSH_Hint_Table;\n\n\n  typedef struct PSH_PointRec_*    PSH_Point;\n  typedef struct PSH_ContourRec_*  PSH_Contour;\n\n  enum\n  {\n    PSH_DIR_NONE  =  4,\n    PSH_DIR_UP    = -1,\n    PSH_DIR_DOWN  =  1,\n    PSH_DIR_LEFT  = -2,\n    PSH_DIR_RIGHT =  2\n  };\n\n#define PSH_DIR_HORIZONTAL  2\n#define PSH_DIR_VERTICAL    1\n\n#define PSH_DIR_COMPARE( d1, d2 )   ( (d1) == (d2) || (d1) == -(d2) )\n#define PSH_DIR_IS_HORIZONTAL( d )  PSH_DIR_COMPARE( d, PSH_DIR_HORIZONTAL )\n#define PSH_DIR_IS_VERTICAL( d )    PSH_DIR_COMPARE( d, PSH_DIR_VERTICAL )\n\n\n /* the following bit-flags are computed once by the glyph */\n /* analyzer, for both dimensions                          */\n  enum\n  {\n    PSH_POINT_OFF    = 1,   /* point is off the curve */\n    PSH_POINT_SMOOTH = 2,   /* point is smooth        */\n    PSH_POINT_INFLEX = 4    /* point is inflection    */\n  };\n\n#define psh_point_is_smooth( p )  ( (p)->flags & PSH_POINT_SMOOTH )\n#define psh_point_is_off( p )     ( (p)->flags & PSH_POINT_OFF    )\n#define psh_point_is_inflex( p )  ( (p)->flags & PSH_POINT_INFLEX )\n\n#define psh_point_set_smooth( p )  (p)->flags |= PSH_POINT_SMOOTH\n#define psh_point_set_off( p )     (p)->flags |= PSH_POINT_OFF\n#define psh_point_set_inflex( p )  (p)->flags |= PSH_POINT_INFLEX\n\n  /* the following bit-flags are re-computed for each dimension */\n  enum\n  {\n    PSH_POINT_STRONG   = 16,   /* point is strong                           */\n    PSH_POINT_FITTED   = 32,   /* point is already fitted                   */\n    PSH_POINT_EXTREMUM = 64,   /* point is local extremum                   */\n    PSH_POINT_POSITIVE = 128,  /* extremum has positive contour flow        */\n    PSH_POINT_NEGATIVE = 256,  /* extremum has negative contour flow        */\n    PSH_POINT_EDGE_MIN = 512,  /* point is aligned to left/bottom stem edge */\n    PSH_POINT_EDGE_MAX = 1024  /* point is aligned to top/right stem edge   */\n  };\n\n#define psh_point_is_strong( p )    ( (p)->flags2 & PSH_POINT_STRONG )\n#define psh_point_is_fitted( p )    ( (p)->flags2 & PSH_POINT_FITTED )\n#define psh_point_is_extremum( p )  ( (p)->flags2 & PSH_POINT_EXTREMUM )\n#define psh_point_is_positive( p )  ( (p)->flags2 & PSH_POINT_POSITIVE )\n#define psh_point_is_negative( p )  ( (p)->flags2 & PSH_POINT_NEGATIVE )\n#define psh_point_is_edge_min( p )  ( (p)->flags2 & PSH_POINT_EDGE_MIN )\n#define psh_point_is_edge_max( p )  ( (p)->flags2 & PSH_POINT_EDGE_MAX )\n\n#define psh_point_set_strong( p )    (p)->flags2 |= PSH_POINT_STRONG\n#define psh_point_set_fitted( p )    (p)->flags2 |= PSH_POINT_FITTED\n#define psh_point_set_extremum( p )  (p)->flags2 |= PSH_POINT_EXTREMUM\n#define psh_point_set_positive( p )  (p)->flags2 |= PSH_POINT_POSITIVE\n#define psh_point_set_negative( p )  (p)->flags2 |= PSH_POINT_NEGATIVE\n#define psh_point_set_edge_min( p )  (p)->flags2 |= PSH_POINT_EDGE_MIN\n#define psh_point_set_edge_max( p )  (p)->flags2 |= PSH_POINT_EDGE_MAX\n\n\n  typedef struct  PSH_PointRec_\n  {\n    PSH_Point    prev;\n    PSH_Point    next;\n    PSH_Contour  contour;\n    FT_UInt      flags;\n    FT_UInt      flags2;\n    FT_Char      dir_in;\n    FT_Char      dir_out;\n    PSH_Hint     hint;\n    FT_Pos       org_u;\n    FT_Pos       org_v;\n    FT_Pos       cur_u;\n#ifdef DEBUG_HINTER\n    FT_Pos       org_x;\n    FT_Pos       cur_x;\n    FT_Pos       org_y;\n    FT_Pos       cur_y;\n    FT_UInt      flags_x;\n    FT_UInt      flags_y;\n#endif\n\n  } PSH_PointRec;\n\n\n  typedef struct  PSH_ContourRec_\n  {\n    PSH_Point  start;\n    FT_UInt    count;\n\n  } PSH_ContourRec;\n\n\n  typedef struct  PSH_GlyphRec_\n  {\n    FT_UInt            num_points;\n    FT_UInt            num_contours;\n\n    PSH_Point          points;\n    PSH_Contour        contours;\n\n    FT_Memory          memory;\n    FT_Outline*        outline;\n    PSH_Globals        globals;\n    PSH_Hint_TableRec  hint_tables[2];\n\n    FT_Bool            vertical;\n    FT_Int             major_dir;\n    FT_Int             minor_dir;\n\n    FT_Bool            do_horz_hints;\n    FT_Bool            do_vert_hints;\n    FT_Bool            do_horz_snapping;\n    FT_Bool            do_vert_snapping;\n    FT_Bool            do_stem_adjust;\n\n  } PSH_GlyphRec, *PSH_Glyph;\n\n\n#ifdef DEBUG_HINTER\n  extern PSH_Hint_Table  ps_debug_hint_table;\n\n  typedef void\n  (*PSH_HintFunc)( PSH_Hint  hint,\n                   FT_Bool   vertical );\n\n  extern PSH_HintFunc    ps_debug_hint_func;\n\n  extern PSH_Glyph       ps_debug_glyph;\n#endif\n\n\n  extern FT_Error\n  ps_hints_apply( PS_Hints        ps_hints,\n                  FT_Outline*     outline,\n                  PSH_Globals     globals,\n                  FT_Render_Mode  hint_mode );\n\n\nFT_END_HEADER\n\n\n#endif /* __PSHALGO_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshglob.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pshglob.c                                                              */\n/*                                                                         */\n/*    PostScript hinter global hinting management (body).                  */\n/*    Inspired by the new auto-hinter module.                              */\n/*                                                                         */\n/*  Copyright 2001-2004, 2006, 2010, 2012 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used        */\n/*  modified and distributed under the terms of the FreeType project       */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/freetype.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"pshglob.h\"\n\n#ifdef DEBUG_HINTER\n  PSH_Globals  ps_debug_globals = 0;\n#endif\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                       STANDARD WIDTHS                         *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* scale the widths/heights table */\n  static void\n  psh_globals_scale_widths( PSH_Globals  globals,\n                            FT_UInt      direction )\n  {\n    PSH_Dimension  dim   = &globals->dimension[direction];\n    PSH_Widths     stdw  = &dim->stdw;\n    FT_UInt        count = stdw->count;\n    PSH_Width      width = stdw->widths;\n    PSH_Width      stand = width;               /* standard width/height */\n    FT_Fixed       scale = dim->scale_mult;\n\n\n    if ( count > 0 )\n    {\n      width->cur = FT_MulFix( width->org, scale );\n      width->fit = FT_PIX_ROUND( width->cur );\n\n      width++;\n      count--;\n\n      for ( ; count > 0; count--, width++ )\n      {\n        FT_Pos  w, dist;\n\n\n        w    = FT_MulFix( width->org, scale );\n        dist = w - stand->cur;\n\n        if ( dist < 0 )\n          dist = -dist;\n\n        if ( dist < 128 )\n          w = stand->cur;\n\n        width->cur = w;\n        width->fit = FT_PIX_ROUND( w );\n      }\n    }\n  }\n\n\n#if 0\n\n  /* org_width is is font units, result in device pixels, 26.6 format */\n  FT_LOCAL_DEF( FT_Pos )\n  psh_dimension_snap_width( PSH_Dimension  dimension,\n                            FT_Int         org_width )\n  {\n    FT_UInt  n;\n    FT_Pos   width     = FT_MulFix( org_width, dimension->scale_mult );\n    FT_Pos   best      = 64 + 32 + 2;\n    FT_Pos   reference = width;\n\n\n    for ( n = 0; n < dimension->stdw.count; n++ )\n    {\n      FT_Pos  w;\n      FT_Pos  dist;\n\n\n      w = dimension->stdw.widths[n].cur;\n      dist = width - w;\n      if ( dist < 0 )\n        dist = -dist;\n      if ( dist < best )\n      {\n        best      = dist;\n        reference = w;\n      }\n    }\n\n    if ( width >= reference )\n    {\n      width -= 0x21;\n      if ( width < reference )\n        width = reference;\n    }\n    else\n    {\n      width += 0x21;\n      if ( width > reference )\n        width = reference;\n    }\n\n    return width;\n  }\n\n#endif /* 0 */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                       BLUE ZONES                              *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  psh_blues_set_zones_0( PSH_Blues       target,\n                         FT_Bool         is_others,\n                         FT_UInt         read_count,\n                         FT_Short*       read,\n                         PSH_Blue_Table  top_table,\n                         PSH_Blue_Table  bot_table )\n  {\n    FT_UInt  count_top = top_table->count;\n    FT_UInt  count_bot = bot_table->count;\n    FT_Bool  first     = 1;\n\n    FT_UNUSED( target );\n\n\n    for ( ; read_count > 1; read_count -= 2 )\n    {\n      FT_Int         reference, delta;\n      FT_UInt        count;\n      PSH_Blue_Zone  zones, zone;\n      FT_Bool        top;\n\n\n      /* read blue zone entry, and select target top/bottom zone */\n      top = 0;\n      if ( first || is_others )\n      {\n        reference = read[1];\n        delta     = read[0] - reference;\n\n        zones = bot_table->zones;\n        count = count_bot;\n        first = 0;\n      }\n      else\n      {\n        reference = read[0];\n        delta     = read[1] - reference;\n\n        zones = top_table->zones;\n        count = count_top;\n        top   = 1;\n      }\n\n      /* insert into sorted table */\n      zone = zones;\n      for ( ; count > 0; count--, zone++ )\n      {\n        if ( reference < zone->org_ref )\n          break;\n\n        if ( reference == zone->org_ref )\n        {\n          FT_Int  delta0 = zone->org_delta;\n\n\n          /* we have two zones on the same reference position -- */\n          /* only keep the largest one                           */\n          if ( delta < 0 )\n          {\n            if ( delta < delta0 )\n              zone->org_delta = delta;\n          }\n          else\n          {\n            if ( delta > delta0 )\n              zone->org_delta = delta;\n          }\n          goto Skip;\n        }\n      }\n\n      for ( ; count > 0; count-- )\n        zone[count] = zone[count-1];\n\n      zone->org_ref   = reference;\n      zone->org_delta = delta;\n\n      if ( top )\n        count_top++;\n      else\n        count_bot++;\n\n    Skip:\n      read += 2;\n    }\n\n    top_table->count = count_top;\n    bot_table->count = count_bot;\n  }\n\n\n  /* Re-read blue zones from the original fonts and store them into out */\n  /* private structure.  This function re-orders, sanitizes and         */\n  /* fuzz-expands the zones as well.                                    */\n  static void\n  psh_blues_set_zones( PSH_Blues  target,\n                       FT_UInt    count,\n                       FT_Short*  blues,\n                       FT_UInt    count_others,\n                       FT_Short*  other_blues,\n                       FT_Int     fuzz,\n                       FT_Int     family )\n  {\n    PSH_Blue_Table  top_table, bot_table;\n    FT_Int          count_top, count_bot;\n\n\n    if ( family )\n    {\n      top_table = &target->family_top;\n      bot_table = &target->family_bottom;\n    }\n    else\n    {\n      top_table = &target->normal_top;\n      bot_table = &target->normal_bottom;\n    }\n\n    /* read the input blue zones, and build two sorted tables  */\n    /* (one for the top zones, the other for the bottom zones) */\n    top_table->count = 0;\n    bot_table->count = 0;\n\n    /* first, the blues */\n    psh_blues_set_zones_0( target, 0,\n                           count, blues, top_table, bot_table );\n    psh_blues_set_zones_0( target, 1,\n                           count_others, other_blues, top_table, bot_table );\n\n    count_top = top_table->count;\n    count_bot = bot_table->count;\n\n    /* sanitize top table */\n    if ( count_top > 0 )\n    {\n      PSH_Blue_Zone  zone = top_table->zones;\n\n\n      for ( count = count_top; count > 0; count--, zone++ )\n      {\n        FT_Int  delta;\n\n\n        if ( count > 1 )\n        {\n          delta = zone[1].org_ref - zone[0].org_ref;\n          if ( zone->org_delta > delta )\n            zone->org_delta = delta;\n        }\n\n        zone->org_bottom = zone->org_ref;\n        zone->org_top    = zone->org_delta + zone->org_ref;\n      }\n    }\n\n    /* sanitize bottom table */\n    if ( count_bot > 0 )\n    {\n      PSH_Blue_Zone  zone = bot_table->zones;\n\n\n      for ( count = count_bot; count > 0; count--, zone++ )\n      {\n        FT_Int  delta;\n\n\n        if ( count > 1 )\n        {\n          delta = zone[0].org_ref - zone[1].org_ref;\n          if ( zone->org_delta < delta )\n            zone->org_delta = delta;\n        }\n\n        zone->org_top    = zone->org_ref;\n        zone->org_bottom = zone->org_delta + zone->org_ref;\n\t\t// XYQ 2006-3-11: FT PS hinter doesn't process wide zone well (all points shrinked to one horizontal line)\n\t\t// therefore, we have to do some nasty thing here, because some fonts do give wide bottom zones.\n\t\t// Our principle is to preserve the bottom line\n\t\t// TEST DOC: bug#395 csl.pdf  letters \"y\", \"j\", etc.\n\t\tif (zone->org_top - zone->org_bottom > 10) {\n\t\t\tzone->org_top = zone->org_bottom;\n\t\t\tzone->org_delta = 0;\n\t\t}\n      }\n    }\n\n    /* expand top and bottom tables with blue fuzz */\n    {\n      FT_Int         dim, top, bot, delta;\n      PSH_Blue_Zone  zone;\n\n\n      zone  = top_table->zones;\n      count = count_top;\n\n      for ( dim = 1; dim >= 0; dim-- )\n      {\n        if ( count > 0 )\n        {\n          /* expand the bottom of the lowest zone normally */\n          zone->org_bottom -= fuzz;\n\n          /* expand the top and bottom of intermediate zones;    */\n          /* checking that the interval is smaller than the fuzz */\n          top = zone->org_top;\n\n          for ( count--; count > 0; count-- )\n          {\n            bot   = zone[1].org_bottom;\n            delta = bot - top;\n\n            if ( delta < 2 * fuzz )\n              zone[0].org_top = zone[1].org_bottom = top + delta / 2;\n            else\n            {\n              zone[0].org_top    = top + fuzz;\n              zone[1].org_bottom = bot - fuzz;\n            }\n\n            zone++;\n            top = zone->org_top;\n          }\n\n          /* expand the top of the highest zone normally */\n          zone->org_top = top + fuzz;\n        }\n        zone  = bot_table->zones;\n        count = count_bot;\n      }\n    }\n  }\n\n\n  /* reset the blues table when the device transform changes */\n  static void\n  psh_blues_scale_zones( PSH_Blues  blues,\n                         FT_Fixed   scale,\n                         FT_Pos     delta )\n  {\n    FT_UInt         count;\n    FT_UInt         num;\n    PSH_Blue_Table  table = 0;\n\n    /*                                                        */\n    /* Determine whether we need to suppress overshoots or    */\n    /* not.  We simply need to compare the vertical scale     */\n    /* parameter to the raw bluescale value.  Here is why:    */\n    /*                                                        */\n    /*   We need to suppress overshoots for all pointsizes.   */\n    /*   At 300dpi that satisfies:                            */\n    /*                                                        */\n    /*      pointsize < 240*bluescale + 0.49                  */\n    /*                                                        */\n    /*   This corresponds to:                                 */\n    /*                                                        */\n    /*      pixelsize < 1000*bluescale + 49/24                */\n    /*                                                        */\n    /*      scale*EM_Size < 1000*bluescale + 49/24            */\n    /*                                                        */\n    /*   However, for normal Type 1 fonts, EM_Size is 1000!   */\n    /*   We thus only check:                                  */\n    /*                                                        */\n    /*      scale < bluescale + 49/24000                      */\n    /*                                                        */\n    /*   which we shorten to                                  */\n    /*                                                        */\n    /*      \"scale < bluescale\"                               */\n    /*                                                        */\n    /* Note that `blue_scale' is stored 1000 times its real   */\n    /* value, and that `scale' converts from font units to    */\n    /* fractional pixels.                                     */\n    /*                                                        */\n\n    /* 1000 / 64 = 125 / 8 */\n    if ( scale >= 0x20C49BAL )\n      blues->no_overshoots = FT_BOOL( scale < blues->blue_scale * 8 / 125 );\n    else\n      blues->no_overshoots = FT_BOOL( scale * 125 < blues->blue_scale * 8 );\n\n    /*                                                        */\n    /*  The blue threshold is the font units distance under   */\n    /*  which overshoots are suppressed due to the BlueShift  */\n    /*  even if the scale is greater than BlueScale.          */\n    /*                                                        */\n    /*  It is the smallest distance such that                 */\n    /*                                                        */\n    /*    dist <= BlueShift && dist*scale <= 0.5 pixels       */\n    /*                                                        */\n    {\n      FT_Int  threshold = blues->blue_shift;\n\n\n      while ( threshold > 0 && FT_MulFix( threshold, scale ) > 32 )\n        threshold--;\n\n      blues->blue_threshold = threshold;\n    }\n\n    for ( num = 0; num < 4; num++ )\n    {\n      PSH_Blue_Zone  zone;\n\n\n      switch ( num )\n      {\n      case 0:\n        table = &blues->normal_top;\n        break;\n      case 1:\n        table = &blues->normal_bottom;\n        break;\n      case 2:\n        table = &blues->family_top;\n        break;\n      default:\n        table = &blues->family_bottom;\n        break;\n      }\n\n      zone  = table->zones;\n      count = table->count;\n      for ( ; count > 0; count--, zone++ )\n      {\n        zone->cur_top    = FT_MulFix( zone->org_top,    scale ) + delta;\n        zone->cur_bottom = FT_MulFix( zone->org_bottom, scale ) + delta;\n        zone->cur_ref    = FT_MulFix( zone->org_ref,    scale ) + delta;\n        zone->cur_delta  = FT_MulFix( zone->org_delta,  scale );\n\n        /* round scaled reference position */\n        zone->cur_ref = FT_PIX_ROUND( zone->cur_ref );\n\n#if 0\n        if ( zone->cur_ref > zone->cur_top )\n          zone->cur_ref -= 64;\n        else if ( zone->cur_ref < zone->cur_bottom )\n          zone->cur_ref += 64;\n#endif\n      }\n    }\n\n    /* process the families now */\n\n    for ( num = 0; num < 2; num++ )\n    {\n      PSH_Blue_Zone   zone1, zone2;\n      FT_UInt         count1, count2;\n      PSH_Blue_Table  normal, family;\n\n\n      switch ( num )\n      {\n      case 0:\n        normal = &blues->normal_top;\n        family = &blues->family_top;\n        break;\n\n      default:\n        normal = &blues->normal_bottom;\n        family = &blues->family_bottom;\n      }\n\n      zone1  = normal->zones;\n      count1 = normal->count;\n\n      for ( ; count1 > 0; count1--, zone1++ )\n      {\n        /* try to find a family zone whose reference position is less */\n        /* than 1 pixel far from the current zone                     */\n        zone2  = family->zones;\n        count2 = family->count;\n\n        for ( ; count2 > 0; count2--, zone2++ )\n        {\n          FT_Pos  Delta;\n\n\n          Delta = zone1->org_ref - zone2->org_ref;\n          if ( Delta < 0 )\n            Delta = -Delta;\n\n          if ( FT_MulFix( Delta, scale ) < 64 )\n          {\n            zone1->cur_top    = zone2->cur_top;\n            zone1->cur_bottom = zone2->cur_bottom;\n            zone1->cur_ref    = zone2->cur_ref;\n            zone1->cur_delta  = zone2->cur_delta;\n            break;\n          }\n        }\n      }\n    }\n  }\n\n\n  /* calculate the maximum height of given blue zones */\n  static FT_Short\n  psh_calc_max_height( FT_UInt          num,\n                       const FT_Short*  values,\n                       FT_Short         cur_max )\n  {\n    FT_UInt  count;\n\n\n    for ( count = 0; count < num; count += 2 )\n    {\n      FT_Short  cur_height = values[count + 1] - values[count];\n\n\n      if ( cur_height > cur_max )\n        cur_max = cur_height;\n    }\n\n    return cur_max;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  psh_blues_snap_stem( PSH_Blues      blues,\n                       FT_Int         stem_top,\n                       FT_Int         stem_bot,\n                       PSH_Alignment  alignment )\n  {\n    PSH_Blue_Table  table;\n    FT_UInt         count;\n    FT_Pos          delta;\n    PSH_Blue_Zone   zone;\n    FT_Int          no_shoots;\n\n\n    alignment->align = PSH_BLUE_ALIGN_NONE;\n\n    no_shoots = blues->no_overshoots;\n\n    /* look up stem top in top zones table */\n    table = &blues->normal_top;\n    count = table->count;\n    zone  = table->zones;\n\n    for ( ; count > 0; count--, zone++ )\n    {\n      delta = stem_top - zone->org_bottom;\n      if ( delta < -blues->blue_fuzz )\n        break;\n\n      if ( stem_top <= zone->org_top + blues->blue_fuzz )\n      {\n        if ( no_shoots || delta <= blues->blue_threshold )\n        {\n          alignment->align    |= PSH_BLUE_ALIGN_TOP;\n          alignment->align_top = zone->cur_ref;\n        }\n        break;\n      }\n    }\n\n    /* look up stem bottom in bottom zones table */\n    table = &blues->normal_bottom;\n    count = table->count;\n    zone  = table->zones + count-1;\n\n    for ( ; count > 0; count--, zone-- )\n    {\n      delta = zone->org_top - stem_bot;\n      if ( delta < -blues->blue_fuzz )\n        break;\n\n      if ( stem_bot >= zone->org_bottom - blues->blue_fuzz )\n      {\n        if ( no_shoots || delta < blues->blue_threshold )\n        {\n          alignment->align    |= PSH_BLUE_ALIGN_BOT;\n          alignment->align_bot = zone->cur_ref;\n        }\n        break;\n      }\n    }\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                        GLOBAL HINTS                           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  psh_globals_destroy( PSH_Globals  globals )\n  {\n    if ( globals )\n    {\n      FT_Memory  memory;\n\n\n      memory = globals->memory;\n      globals->dimension[0].stdw.count = 0;\n      globals->dimension[1].stdw.count = 0;\n\n      globals->blues.normal_top.count    = 0;\n      globals->blues.normal_bottom.count = 0;\n      globals->blues.family_top.count    = 0;\n      globals->blues.family_bottom.count = 0;\n\n      FT_FREE( globals );\n\n#ifdef DEBUG_HINTER\n      ps_debug_globals = 0;\n#endif\n    }\n  }\n\n\n  static FT_Error\n  psh_globals_new( FT_Memory     memory,\n                   T1_Private*   priv,\n                   PSH_Globals  *aglobals )\n  {\n    PSH_Globals  globals = NULL;\n    FT_Error     error;\n\n\n    if ( !FT_NEW( globals ) )\n    {\n      FT_UInt    count;\n      FT_Short*  read;\n\n\n      globals->memory = memory;\n\n      /* copy standard widths */\n      {\n        PSH_Dimension  dim   = &globals->dimension[1];\n        PSH_Width      write = dim->stdw.widths;\n\n\n        write->org = priv->standard_width[0];\n        write++;\n\n        read = priv->snap_widths;\n        for ( count = priv->num_snap_widths; count > 0; count-- )\n        {\n          write->org = *read;\n          write++;\n          read++;\n        }\n\n        dim->stdw.count = priv->num_snap_widths + 1;\n      }\n\n      /* copy standard heights */\n      {\n        PSH_Dimension  dim = &globals->dimension[0];\n        PSH_Width      write = dim->stdw.widths;\n\n\n        write->org = priv->standard_height[0];\n        write++;\n        read = priv->snap_heights;\n        for ( count = priv->num_snap_heights; count > 0; count-- )\n        {\n          write->org = *read;\n          write++;\n          read++;\n        }\n\n        dim->stdw.count = priv->num_snap_heights + 1;\n      }\n\n      /* copy blue zones */\n      psh_blues_set_zones( &globals->blues, priv->num_blue_values,\n                           priv->blue_values, priv->num_other_blues,\n                           priv->other_blues, priv->blue_fuzz, 0 );\n\n      psh_blues_set_zones( &globals->blues, priv->num_family_blues,\n                           priv->family_blues, priv->num_family_other_blues,\n                           priv->family_other_blues, priv->blue_fuzz, 1 );\n\n      /* limit the BlueScale value to `1 / max_of_blue_zone_heights' */\n      {\n        FT_Fixed  max_scale;\n        FT_Short  max_height = 1;\n\n\n        max_height = psh_calc_max_height( priv->num_blue_values,\n                                          priv->blue_values,\n                                          max_height );\n        max_height = psh_calc_max_height( priv->num_other_blues,\n                                          priv->other_blues,\n                                          max_height );\n        max_height = psh_calc_max_height( priv->num_family_blues,\n                                          priv->family_blues,\n                                          max_height );\n        max_height = psh_calc_max_height( priv->num_family_other_blues,\n                                          priv->family_other_blues,\n                                          max_height );\n\n        /* BlueScale is scaled 1000 times */\n        max_scale = FT_DivFix( 1000, max_height );\n        globals->blues.blue_scale = priv->blue_scale < max_scale\n                                      ? priv->blue_scale\n                                      : max_scale;\n      }\n\n      globals->blues.blue_shift = priv->blue_shift;\n      globals->blues.blue_fuzz  = priv->blue_fuzz;\n\n      globals->dimension[0].scale_mult  = 0;\n      globals->dimension[0].scale_delta = 0;\n      globals->dimension[1].scale_mult  = 0;\n      globals->dimension[1].scale_delta = 0;\n\n#ifdef DEBUG_HINTER\n      ps_debug_globals = globals;\n#endif\n    }\n\n    *aglobals = globals;\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  psh_globals_set_scale( PSH_Globals  globals,\n                         FT_Fixed     x_scale,\n                         FT_Fixed     y_scale,\n                         FT_Fixed     x_delta,\n                         FT_Fixed     y_delta )\n  {\n    PSH_Dimension  dim = &globals->dimension[0];\n\n\n    dim = &globals->dimension[0];\n    if ( x_scale != dim->scale_mult  ||\n         x_delta != dim->scale_delta )\n    {\n      dim->scale_mult  = x_scale;\n      dim->scale_delta = x_delta;\n\n      psh_globals_scale_widths( globals, 0 );\n    }\n\n    dim = &globals->dimension[1];\n    if ( y_scale != dim->scale_mult  ||\n         y_delta != dim->scale_delta )\n    {\n      dim->scale_mult  = y_scale;\n      dim->scale_delta = y_delta;\n\n      psh_globals_scale_widths( globals, 1 );\n      psh_blues_scale_zones( &globals->blues, y_scale, y_delta );\n    }\n\n    return 0;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  psh_globals_funcs_init( PSH_Globals_FuncsRec*  funcs )\n  {\n    funcs->create    = psh_globals_new;\n    funcs->set_scale = psh_globals_set_scale;\n    funcs->destroy   = psh_globals_destroy;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshglob.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pshglob.h                                                              */\n/*                                                                         */\n/*    PostScript hinter global hinting management.                         */\n/*                                                                         */\n/*  Copyright 2001, 2002, 2003 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PSHGLOB_H__\n#define __PSHGLOB_H__\n\n\n#include \"../../include/freetype/freetype.h\"\n#include \"../../include/freetype/internal/pshints.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    GLOBAL HINTS INTERNALS                     *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* @constant:                                                            */\n  /*    PS_GLOBALS_MAX_BLUE_ZONES                                          */\n  /*                                                                       */\n  /* @description:                                                         */\n  /*    The maximum number of blue zones in a font global hints structure. */\n  /*    See @PS_Globals_BluesRec.                                          */\n  /*                                                                       */\n#define PS_GLOBALS_MAX_BLUE_ZONES  16\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* @constant:                                                            */\n  /*    PS_GLOBALS_MAX_STD_WIDTHS                                          */\n  /*                                                                       */\n  /* @description:                                                         */\n  /*    The maximum number of standard and snap widths in either the       */\n  /*    horizontal or vertical direction.  See @PS_Globals_WidthsRec.      */\n  /*                                                                       */\n#define PS_GLOBALS_MAX_STD_WIDTHS  16\n\n\n  /* standard and snap width */\n  typedef struct  PSH_WidthRec_\n  {\n    FT_Int  org;\n    FT_Pos  cur;\n    FT_Pos  fit;\n\n  } PSH_WidthRec, *PSH_Width;\n\n\n  /* standard and snap widths table */\n  typedef struct  PSH_WidthsRec_\n  {\n    FT_UInt       count;\n    PSH_WidthRec  widths[PS_GLOBALS_MAX_STD_WIDTHS];\n\n  } PSH_WidthsRec, *PSH_Widths;\n\n\n  typedef struct  PSH_DimensionRec_\n  {\n    PSH_WidthsRec  stdw;\n    FT_Fixed       scale_mult;\n    FT_Fixed       scale_delta;\n\n  } PSH_DimensionRec, *PSH_Dimension;\n\n\n  /* blue zone descriptor */\n  typedef struct  PSH_Blue_ZoneRec_\n  {\n    FT_Int  org_ref;\n    FT_Int  org_delta;\n    FT_Int  org_top;\n    FT_Int  org_bottom;\n\n    FT_Pos  cur_ref;\n    FT_Pos  cur_delta;\n    FT_Pos  cur_bottom;\n    FT_Pos  cur_top;\n\n  } PSH_Blue_ZoneRec, *PSH_Blue_Zone;\n\n\n  typedef struct  PSH_Blue_TableRec_\n  {\n    FT_UInt           count;\n    PSH_Blue_ZoneRec  zones[PS_GLOBALS_MAX_BLUE_ZONES];\n\n  } PSH_Blue_TableRec, *PSH_Blue_Table;\n\n\n  /* blue zones table */\n  typedef struct  PSH_BluesRec_\n  {\n    PSH_Blue_TableRec  normal_top;\n    PSH_Blue_TableRec  normal_bottom;\n    PSH_Blue_TableRec  family_top;\n    PSH_Blue_TableRec  family_bottom;\n\n    FT_Fixed           blue_scale;\n    FT_Int             blue_shift;\n    FT_Int             blue_threshold;\n    FT_Int             blue_fuzz;\n    FT_Bool            no_overshoots;\n\n  } PSH_BluesRec, *PSH_Blues;\n\n\n  /* font globals.                                         */\n  /* dimension 0 => X coordinates + vertical hints/stems   */\n  /* dimension 1 => Y coordinates + horizontal hints/stems */\n  typedef struct  PSH_GlobalsRec_\n  {\n    FT_Memory         memory;\n    PSH_DimensionRec  dimension[2];\n    PSH_BluesRec      blues;\n\n  } PSH_GlobalsRec;\n\n\n#define PSH_BLUE_ALIGN_NONE  0\n#define PSH_BLUE_ALIGN_TOP   1\n#define PSH_BLUE_ALIGN_BOT   2\n\n\n  typedef struct  PSH_AlignmentRec_\n  {\n    int     align;\n    FT_Pos  align_top;\n    FT_Pos  align_bot;\n\n  } PSH_AlignmentRec, *PSH_Alignment;\n\n\n  FT_LOCAL( void )\n  psh_globals_funcs_init( PSH_Globals_FuncsRec*  funcs );\n\n\n#if 0\n  /* snap a stem width to fitter coordinates.  `org_width' is in font */\n  /* units.  The result is in device pixels (26.6 format).            */\n  FT_LOCAL( FT_Pos )\n  psh_dimension_snap_width( PSH_Dimension  dimension,\n                            FT_Int         org_width );\n#endif\n\n  FT_LOCAL( FT_Error )\n  psh_globals_set_scale( PSH_Globals  globals,\n                         FT_Fixed     x_scale,\n                         FT_Fixed     y_scale,\n                         FT_Fixed     x_delta,\n                         FT_Fixed     y_delta );\n\n  /* snap a stem to one or two blue zones */\n  FT_LOCAL( void )\n  psh_blues_snap_stem( PSH_Blues      blues,\n                       FT_Int         stem_top,\n                       FT_Int         stem_bot,\n                       PSH_Alignment  alignment );\n  /* */\n\n#ifdef DEBUG_HINTER\n  extern PSH_Globals  ps_debug_globals;\n#endif\n\n\nFT_END_HEADER\n\n\n#endif /* __PSHGLOB_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshmod.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pshmod.c                                                               */\n/*                                                                         */\n/*    FreeType PostScript hinter module implementation (body).             */\n/*                                                                         */\n/*  Copyright 2001, 2002, 2007, 2009, 2012 by                              */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"pshrec.h\"\n#include \"pshalgo.h\"\n#include \"pshpic.h\"\n\n\n  /* the Postscript Hinter module structure */\n  typedef struct  PS_Hinter_Module_Rec_\n  {\n    FT_ModuleRec          root;\n    PS_HintsRec           ps_hints;\n\n    PSH_Globals_FuncsRec  globals_funcs;\n    T1_Hints_FuncsRec     t1_funcs;\n    T2_Hints_FuncsRec     t2_funcs;\n\n  } PS_Hinter_ModuleRec, *PS_Hinter_Module;\n\n\n  /* finalize module */\n  FT_CALLBACK_DEF( void )\n  ps_hinter_done( PS_Hinter_Module  module )\n  {\n    module->t1_funcs.hints = NULL;\n    module->t2_funcs.hints = NULL;\n\n    ps_hints_done( &module->ps_hints );\n  }\n\n\n  /* initialize module, create hints recorder and the interface */\n  FT_CALLBACK_DEF( FT_Error )\n  ps_hinter_init( PS_Hinter_Module  module )\n  {\n    FT_Memory  memory = module->root.memory;\n    void*      ph     = &module->ps_hints;\n\n\n    ps_hints_init( &module->ps_hints, memory );\n\n    psh_globals_funcs_init( &module->globals_funcs );\n\n    t1_hints_funcs_init( &module->t1_funcs );\n    module->t1_funcs.hints = (T1_Hints)ph;\n\n    t2_hints_funcs_init( &module->t2_funcs );\n    module->t2_funcs.hints = (T2_Hints)ph;\n\n    return 0;\n  }\n\n\n  /* returns global hints interface */\n  FT_CALLBACK_DEF( PSH_Globals_Funcs )\n  pshinter_get_globals_funcs( FT_Module  module )\n  {\n    return &((PS_Hinter_Module)module)->globals_funcs;\n  }\n\n\n  /* return Type 1 hints interface */\n  FT_CALLBACK_DEF( T1_Hints_Funcs )\n  pshinter_get_t1_funcs( FT_Module  module )\n  {\n    return &((PS_Hinter_Module)module)->t1_funcs;\n  }\n\n\n  /* return Type 2 hints interface */\n  FT_CALLBACK_DEF( T2_Hints_Funcs )\n  pshinter_get_t2_funcs( FT_Module  module )\n  {\n    return &((PS_Hinter_Module)module)->t2_funcs;\n  }\n\n\n  FT_DEFINE_PSHINTER_INTERFACE(\n    pshinter_interface,\n    pshinter_get_globals_funcs,\n    pshinter_get_t1_funcs,\n    pshinter_get_t2_funcs )\n\n\n  FT_DEFINE_MODULE(\n    pshinter_module_class,\n\n    0,\n    sizeof ( PS_Hinter_ModuleRec ),\n    \"pshinter\",\n    0x10000L,\n    0x20000L,\n\n    &PSHINTER_INTERFACE_GET,              /* module-specific interface */\n\n    (FT_Module_Constructor)ps_hinter_init,\n    (FT_Module_Destructor) ps_hinter_done,\n    (FT_Module_Requester)  NULL )   /* no additional interface for now */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshmod.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pshmod.h                                                               */\n/*                                                                         */\n/*    PostScript hinter module interface (specification).                  */\n/*                                                                         */\n/*  Copyright 2001 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PSHMOD_H__\n#define __PSHMOD_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/ftmodapi.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  FT_DECLARE_MODULE( pshinter_module_class )\n\n\nFT_END_HEADER\n\n\n#endif /* __PSHMOD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshnterr.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pshnterr.h                                                             */\n/*                                                                         */\n/*    PS Hinter error codes (specification only).                          */\n/*                                                                         */\n/*  Copyright 2003, 2012 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the PSHinter error enumeration constants. */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __PSHNTERR_H__\n#define __PSHNTERR_H__\n\n#include \"../../include/freetype/ftmoderr.h\"\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  PSH_Err_\n#define FT_ERR_BASE    FT_Mod_Err_PShinter\n\n#include \"../../include/freetype/fterrors.h\"\n\n#endif /* __PSHNTERR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshpic.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pshpic.c                                                               */\n/*                                                                         */\n/*    The FreeType position independent code services for pshinter module. */\n/*                                                                         */\n/*  Copyright 2009, 2010, 2012, 2013 by                                    */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/freetype.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"pshpic.h\"\n#include \"pshnterr.h\"\n\n\n#ifdef FT_CONFIG_OPTION_PIC\n\n  /* forward declaration of PIC init functions from pshmod.c */\n  void\n  FT_Init_Class_pshinter_interface( FT_Library           library,\n                                    PSHinter_Interface*  clazz );\n\n  void\n  pshinter_module_class_pic_free( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Memory          memory        = library->memory;\n\n\n    if ( pic_container->pshinter )\n    {\n      FT_FREE( pic_container->pshinter );\n      pic_container->pshinter = NULL;\n    }\n  }\n\n\n  FT_Error\n  pshinter_module_class_pic_init( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Error           error         = FT_Err_Ok;\n    PSHinterPIC*       container     = NULL;\n    FT_Memory          memory        = library->memory;\n\n\n    /* allocate pointer, clear and set global container pointer */\n    if ( FT_ALLOC( container, sizeof ( *container ) ) )\n      return error;\n    FT_MEM_SET( container, 0, sizeof ( *container ) );\n    pic_container->pshinter = container;\n\n    /* add call to initialization function when you add new scripts */\n    FT_Init_Class_pshinter_interface(\n      library, &container->pshinter_interface );\n\n    if ( error )\n      pshinter_module_class_pic_free( library );\n\n    return error;\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshpic.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pshpic.h                                                               */\n/*                                                                         */\n/*    The FreeType position independent code services for pshinter module. */\n/*                                                                         */\n/*  Copyright 2009, 2012, 2013 by                                          */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PSHPIC_H__\n#define __PSHPIC_H__\n\n\nFT_BEGIN_HEADER\n\n#include \"../../include/freetype/internal/ftpic.h\"\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define PSHINTER_INTERFACE_GET  pshinter_interface\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#include \"../../include/freetype/internal/pshints.h\"\n\n  typedef struct  PSHinterPIC_\n  {\n    PSHinter_Interface  pshinter_interface;\n\n  } PSHinterPIC;\n\n\n#define GET_PIC( lib )  ( (PSHinterPIC*)( (lib)->pic_container.pshinter ) )\n\n#define PSHINTER_INTERFACE_GET  ( GET_PIC( library )->pshinter_interface )\n\n  /* see pshpic.c for the implementation */\n  void\n  pshinter_module_class_pic_free( FT_Library  library );\n\n  FT_Error\n  pshinter_module_class_pic_init( FT_Library  library );\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __PSHPIC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshrec.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pshrec.c                                                               */\n/*                                                                         */\n/*    FreeType PostScript hints recorder (body).                           */\n/*                                                                         */\n/*  Copyright 2001-2004, 2007, 2009, 2013 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/freetype.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftcalc.h\"\n\n#include \"pshrec.h\"\n#include \"pshalgo.h\"\n\n#include \"pshnterr.h\"\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_pshrec\n\n#ifdef DEBUG_HINTER\n  PS_Hints  ps_debug_hints         = 0;\n  int       ps_debug_no_horz_hints = 0;\n  int       ps_debug_no_vert_hints = 0;\n#endif\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      PS_HINT MANAGEMENT                       *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* destroy hints table */\n  static void\n  ps_hint_table_done( PS_Hint_Table  table,\n                      FT_Memory      memory )\n  {\n    FT_FREE( table->hints );\n    table->num_hints = 0;\n    table->max_hints = 0;\n  }\n\n\n  /* ensure that a table can contain \"count\" elements */\n  static FT_Error\n  ps_hint_table_ensure( PS_Hint_Table  table,\n                        FT_UInt        count,\n                        FT_Memory      memory )\n  {\n    FT_UInt   old_max = table->max_hints;\n    FT_UInt   new_max = count;\n    FT_Error  error   = FT_Err_Ok;\n\n\n    if ( new_max > old_max )\n    {\n      /* try to grow the table */\n      new_max = FT_PAD_CEIL( new_max, 8 );\n      if ( !FT_RENEW_ARRAY( table->hints, old_max, new_max ) )\n        table->max_hints = new_max;\n    }\n    return error;\n  }\n\n\n  static FT_Error\n  ps_hint_table_alloc( PS_Hint_Table  table,\n                       FT_Memory      memory,\n                       PS_Hint       *ahint )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_UInt   count;\n    PS_Hint   hint = 0;\n\n\n    count = table->num_hints;\n    count++;\n\n    if ( count >= table->max_hints )\n    {\n      error = ps_hint_table_ensure( table, count, memory );\n      if ( error )\n        goto Exit;\n    }\n\n    hint        = table->hints + count - 1;\n    hint->pos   = 0;\n    hint->len   = 0;\n    hint->flags = 0;\n\n    table->num_hints = count;\n\n  Exit:\n    *ahint = hint;\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      PS_MASK MANAGEMENT                       *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* destroy mask */\n  static void\n  ps_mask_done( PS_Mask    mask,\n                FT_Memory  memory )\n  {\n    FT_FREE( mask->bytes );\n    mask->num_bits  = 0;\n    mask->max_bits  = 0;\n    mask->end_point = 0;\n  }\n\n\n  /* ensure that a mask can contain \"count\" bits */\n  static FT_Error\n  ps_mask_ensure( PS_Mask    mask,\n                  FT_UInt    count,\n                  FT_Memory  memory )\n  {\n    FT_UInt   old_max = ( mask->max_bits + 7 ) >> 3;\n    FT_UInt   new_max = ( count          + 7 ) >> 3;\n    FT_Error  error   = FT_Err_Ok;\n\n\n    if ( new_max > old_max )\n    {\n      new_max = FT_PAD_CEIL( new_max, 8 );\n      if ( !FT_RENEW_ARRAY( mask->bytes, old_max, new_max ) )\n        mask->max_bits = new_max * 8;\n    }\n    return error;\n  }\n\n\n  /* test a bit value in a given mask */\n  static FT_Int\n  ps_mask_test_bit( PS_Mask  mask,\n                    FT_Int   idx )\n  {\n    if ( (FT_UInt)idx >= mask->num_bits )\n      return 0;\n\n    return mask->bytes[idx >> 3] & ( 0x80 >> ( idx & 7 ) );\n  }\n\n\n  /* clear a given bit */\n  static void\n  ps_mask_clear_bit( PS_Mask  mask,\n                     FT_Int   idx )\n  {\n    FT_Byte*  p;\n\n\n    if ( (FT_UInt)idx >= mask->num_bits )\n      return;\n\n    p    = mask->bytes + ( idx >> 3 );\n    p[0] = (FT_Byte)( p[0] & ~( 0x80 >> ( idx & 7 ) ) );\n  }\n\n\n  /* set a given bit, possibly grow the mask */\n  static FT_Error\n  ps_mask_set_bit( PS_Mask    mask,\n                   FT_Int     idx,\n                   FT_Memory  memory )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_Byte*  p;\n\n\n    if ( idx < 0 )\n      goto Exit;\n\n    if ( (FT_UInt)idx >= mask->num_bits )\n    {\n      error = ps_mask_ensure( mask, idx + 1, memory );\n      if ( error )\n        goto Exit;\n\n      mask->num_bits = idx + 1;\n    }\n\n    p    = mask->bytes + ( idx >> 3 );\n    p[0] = (FT_Byte)( p[0] | ( 0x80 >> ( idx & 7 ) ) );\n\n  Exit:\n    return error;\n  }\n\n\n  /* destroy mask table */\n  static void\n  ps_mask_table_done( PS_Mask_Table  table,\n                      FT_Memory      memory )\n  {\n    FT_UInt  count = table->max_masks;\n    PS_Mask  mask  = table->masks;\n\n\n    for ( ; count > 0; count--, mask++ )\n      ps_mask_done( mask, memory );\n\n    FT_FREE( table->masks );\n    table->num_masks = 0;\n    table->max_masks = 0;\n  }\n\n\n  /* ensure that a mask table can contain \"count\" masks */\n  static FT_Error\n  ps_mask_table_ensure( PS_Mask_Table  table,\n                        FT_UInt        count,\n                        FT_Memory      memory )\n  {\n    FT_UInt   old_max = table->max_masks;\n    FT_UInt   new_max = count;\n    FT_Error  error   = FT_Err_Ok;\n\n\n    if ( new_max > old_max )\n    {\n      new_max = FT_PAD_CEIL( new_max, 8 );\n      if ( !FT_RENEW_ARRAY( table->masks, old_max, new_max ) )\n        table->max_masks = new_max;\n    }\n    return error;\n  }\n\n\n  /* allocate a new mask in a table */\n  static FT_Error\n  ps_mask_table_alloc( PS_Mask_Table  table,\n                       FT_Memory      memory,\n                       PS_Mask       *amask )\n  {\n    FT_UInt   count;\n    FT_Error  error = FT_Err_Ok;\n    PS_Mask   mask  = 0;\n\n\n    count = table->num_masks;\n    count++;\n\n    if ( count > table->max_masks )\n    {\n      error = ps_mask_table_ensure( table, count, memory );\n      if ( error )\n        goto Exit;\n    }\n\n    mask             = table->masks + count - 1;\n    mask->num_bits   = 0;\n    mask->end_point  = 0;\n    table->num_masks = count;\n\n  Exit:\n    *amask = mask;\n    return error;\n  }\n\n\n  /* return last hint mask in a table, create one if the table is empty */\n  static FT_Error\n  ps_mask_table_last( PS_Mask_Table  table,\n                      FT_Memory      memory,\n                      PS_Mask       *amask )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_UInt   count;\n    PS_Mask   mask;\n\n\n    count = table->num_masks;\n    if ( count == 0 )\n    {\n      error = ps_mask_table_alloc( table, memory, &mask );\n      if ( error )\n        goto Exit;\n    }\n    else\n      mask = table->masks + count - 1;\n\n  Exit:\n    *amask = mask;\n    return error;\n  }\n\n\n  /* set a new mask to a given bit range */\n  static FT_Error\n  ps_mask_table_set_bits( PS_Mask_Table   table,\n                          const FT_Byte*  source,\n                          FT_UInt         bit_pos,\n                          FT_UInt         bit_count,\n                          FT_Memory       memory )\n  {\n    FT_Error  error;\n    PS_Mask   mask;\n\n\n    error = ps_mask_table_last( table, memory, &mask );\n    if ( error )\n      goto Exit;\n\n    error = ps_mask_ensure( mask, bit_count, memory );\n    if ( error )\n      goto Exit;\n\n    mask->num_bits = bit_count;\n\n    /* now, copy bits */\n    {\n      FT_Byte*  read  = (FT_Byte*)source + ( bit_pos >> 3 );\n      FT_Int    rmask = 0x80 >> ( bit_pos & 7 );\n      FT_Byte*  write = mask->bytes;\n      FT_Int    wmask = 0x80;\n      FT_Int    val;\n\n\n      for ( ; bit_count > 0; bit_count-- )\n      {\n        val = write[0] & ~wmask;\n\n        if ( read[0] & rmask )\n          val |= wmask;\n\n        write[0] = (FT_Byte)val;\n\n        rmask >>= 1;\n        if ( rmask == 0 )\n        {\n          read++;\n          rmask = 0x80;\n        }\n\n        wmask >>= 1;\n        if ( wmask == 0 )\n        {\n          write++;\n          wmask = 0x80;\n        }\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /* test whether two masks in a table intersect */\n  static FT_Int\n  ps_mask_table_test_intersect( PS_Mask_Table  table,\n                                FT_Int         index1,\n                                FT_Int         index2 )\n  {\n    PS_Mask   mask1  = table->masks + index1;\n    PS_Mask   mask2  = table->masks + index2;\n    FT_Byte*  p1     = mask1->bytes;\n    FT_Byte*  p2     = mask2->bytes;\n    FT_UInt   count1 = mask1->num_bits;\n    FT_UInt   count2 = mask2->num_bits;\n    FT_UInt   count;\n\n\n    count = FT_MIN( count1, count2 );\n    for ( ; count >= 8; count -= 8 )\n    {\n      if ( p1[0] & p2[0] )\n        return 1;\n\n      p1++;\n      p2++;\n    }\n\n    if ( count == 0 )\n      return 0;\n\n    return ( p1[0] & p2[0] ) & ~( 0xFF >> count );\n  }\n\n\n  /* merge two masks, used by ps_mask_table_merge_all */\n  static FT_Error\n  ps_mask_table_merge( PS_Mask_Table  table,\n                       FT_Int         index1,\n                       FT_Int         index2,\n                       FT_Memory      memory )\n  {\n    FT_UInt   temp;\n    FT_Error  error = FT_Err_Ok;\n\n\n    /* swap index1 and index2 so that index1 < index2 */\n    if ( index1 > index2 )\n    {\n      temp   = index1;\n      index1 = index2;\n      index2 = temp;\n    }\n\n    if ( index1 < index2 && index1 >= 0 && index2 < (FT_Int)table->num_masks )\n    {\n      /* we need to merge the bitsets of index1 and index2 with a */\n      /* simple union                                             */\n      PS_Mask  mask1  = table->masks + index1;\n      PS_Mask  mask2  = table->masks + index2;\n      FT_UInt  count1 = mask1->num_bits;\n      FT_UInt  count2 = mask2->num_bits;\n      FT_Int   delta;\n\n\n      if ( count2 > 0 )\n      {\n        FT_UInt   pos;\n        FT_Byte*  read;\n        FT_Byte*  write;\n\n\n        /* if \"count2\" is greater than \"count1\", we need to grow the */\n        /* first bitset, and clear the highest bits                  */\n        if ( count2 > count1 )\n        {\n          error = ps_mask_ensure( mask1, count2, memory );\n          if ( error )\n            goto Exit;\n\n          for ( pos = count1; pos < count2; pos++ )\n            ps_mask_clear_bit( mask1, pos );\n        }\n\n        /* merge (unite) the bitsets */\n        read  = mask2->bytes;\n        write = mask1->bytes;\n        pos   = (FT_UInt)( ( count2 + 7 ) >> 3 );\n\n        for ( ; pos > 0; pos-- )\n        {\n          write[0] = (FT_Byte)( write[0] | read[0] );\n          write++;\n          read++;\n        }\n      }\n\n      /* Now, remove \"mask2\" from the list.  We need to keep the masks */\n      /* sorted in order of importance, so move table elements.        */\n      mask2->num_bits  = 0;\n      mask2->end_point = 0;\n\n      delta = table->num_masks - 1 - index2; /* number of masks to move */\n      if ( delta > 0 )\n      {\n        /* move to end of table for reuse */\n        PS_MaskRec  dummy = *mask2;\n\n\n        ft_memmove( mask2, mask2 + 1, delta * sizeof ( PS_MaskRec ) );\n\n        mask2[delta] = dummy;\n      }\n\n      table->num_masks--;\n    }\n    else\n      FT_TRACE0(( \"ps_mask_table_merge: ignoring invalid indices (%d,%d)\\n\",\n                  index1, index2 ));\n\n  Exit:\n    return error;\n  }\n\n\n  /* Try to merge all masks in a given table.  This is used to merge */\n  /* all counter masks into independent counter \"paths\".             */\n  /*                                                                 */\n  static FT_Error\n  ps_mask_table_merge_all( PS_Mask_Table  table,\n                           FT_Memory      memory )\n  {\n    FT_Int    index1, index2;\n    FT_Error  error = FT_Err_Ok;\n\n\n    for ( index1 = table->num_masks - 1; index1 > 0; index1-- )\n    {\n      for ( index2 = index1 - 1; index2 >= 0; index2-- )\n      {\n        if ( ps_mask_table_test_intersect( table, index1, index2 ) )\n        {\n          error = ps_mask_table_merge( table, index2, index1, memory );\n          if ( error )\n            goto Exit;\n\n          break;\n        }\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    PS_DIMENSION MANAGEMENT                    *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* finalize a given dimension */\n  static void\n  ps_dimension_done( PS_Dimension  dimension,\n                     FT_Memory     memory )\n  {\n    ps_mask_table_done( &dimension->counters, memory );\n    ps_mask_table_done( &dimension->masks,    memory );\n    ps_hint_table_done( &dimension->hints,    memory );\n  }\n\n\n  /* initialize a given dimension */\n  static void\n  ps_dimension_init( PS_Dimension  dimension )\n  {\n    dimension->hints.num_hints    = 0;\n    dimension->masks.num_masks    = 0;\n    dimension->counters.num_masks = 0;\n  }\n\n\n#if 0\n\n  /* set a bit at a given index in the current hint mask */\n  static FT_Error\n  ps_dimension_set_mask_bit( PS_Dimension  dim,\n                             FT_UInt       idx,\n                             FT_Memory     memory )\n  {\n    PS_Mask   mask;\n    FT_Error  error = FT_Err_Ok;\n\n\n    /* get last hint mask */\n    error = ps_mask_table_last( &dim->masks, memory, &mask );\n    if ( error )\n      goto Exit;\n\n    error = ps_mask_set_bit( mask, idx, memory );\n\n  Exit:\n    return error;\n  }\n\n#endif\n\n  /* set the end point in a mask, called from \"End\" & \"Reset\" methods */\n  static void\n  ps_dimension_end_mask( PS_Dimension  dim,\n                         FT_UInt       end_point )\n  {\n    FT_UInt  count = dim->masks.num_masks;\n\n\n    if ( count > 0 )\n    {\n      PS_Mask  mask = dim->masks.masks + count - 1;\n\n\n      mask->end_point = end_point;\n    }\n  }\n\n\n  /* set the end point in the current mask, then create a new empty one */\n  /* (called by \"Reset\" method)                                         */\n  static FT_Error\n  ps_dimension_reset_mask( PS_Dimension  dim,\n                           FT_UInt       end_point,\n                           FT_Memory     memory )\n  {\n    PS_Mask  mask;\n\n\n    /* end current mask */\n    ps_dimension_end_mask( dim, end_point );\n\n    /* allocate new one */\n    return ps_mask_table_alloc( &dim->masks, memory, &mask );\n  }\n\n\n  /* set a new mask, called from the \"T2Stem\" method */\n  static FT_Error\n  ps_dimension_set_mask_bits( PS_Dimension    dim,\n                              const FT_Byte*  source,\n                              FT_UInt         source_pos,\n                              FT_UInt         source_bits,\n                              FT_UInt         end_point,\n                              FT_Memory       memory )\n  {\n    FT_Error  error;\n\n\n    /* reset current mask, if any */\n    error = ps_dimension_reset_mask( dim, end_point, memory );\n    if ( error )\n      goto Exit;\n\n    /* set bits in new mask */\n    error = ps_mask_table_set_bits( &dim->masks, source,\n                                    source_pos, source_bits, memory );\n\n  Exit:\n    return error;\n  }\n\n\n  /* add a new single stem (called from \"T1Stem\" method) */\n  static FT_Error\n  ps_dimension_add_t1stem( PS_Dimension  dim,\n                           FT_Int        pos,\n                           FT_Int        len,\n                           FT_Memory     memory,\n                           FT_Int       *aindex )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_UInt   flags = 0;\n\n\n    /* detect ghost stem */\n    if ( len < 0 )\n    {\n      flags |= PS_HINT_FLAG_GHOST;\n      if ( len == -21 )\n      {\n        flags |= PS_HINT_FLAG_BOTTOM;\n        pos   += len;\n      }\n      len = 0;\n    }\n\n    if ( aindex )\n      *aindex = -1;\n\n    /* now, lookup stem in the current hints table */\n    {\n      PS_Mask  mask;\n      FT_UInt  idx;\n      FT_UInt  max   = dim->hints.num_hints;\n      PS_Hint  hint  = dim->hints.hints;\n\n\n      for ( idx = 0; idx < max; idx++, hint++ )\n      {\n        if ( hint->pos == pos && hint->len == len )\n          break;\n      }\n\n      /* we need to create a new hint in the table */\n      if ( idx >= max )\n      {\n        error = ps_hint_table_alloc( &dim->hints, memory, &hint );\n        if ( error )\n          goto Exit;\n\n        hint->pos   = pos;\n        hint->len   = len;\n        hint->flags = flags;\n      }\n\n      /* now, store the hint in the current mask */\n      error = ps_mask_table_last( &dim->masks, memory, &mask );\n      if ( error )\n        goto Exit;\n\n      error = ps_mask_set_bit( mask, idx, memory );\n      if ( error )\n        goto Exit;\n\n      if ( aindex )\n        *aindex = (FT_Int)idx;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /* add a \"hstem3/vstem3\" counter to our dimension table */\n  static FT_Error\n  ps_dimension_add_counter( PS_Dimension  dim,\n                            FT_Int        hint1,\n                            FT_Int        hint2,\n                            FT_Int        hint3,\n                            FT_Memory     memory )\n  {\n    FT_Error  error   = FT_Err_Ok;\n    FT_UInt   count   = dim->counters.num_masks;\n    PS_Mask   counter = dim->counters.masks;\n\n\n    /* try to find an existing counter mask that already uses */\n    /* one of these stems here                                */\n    for ( ; count > 0; count--, counter++ )\n    {\n      if ( ps_mask_test_bit( counter, hint1 ) ||\n           ps_mask_test_bit( counter, hint2 ) ||\n           ps_mask_test_bit( counter, hint3 ) )\n        break;\n    }\n\n    /* create a new counter when needed */\n    if ( count == 0 )\n    {\n      error = ps_mask_table_alloc( &dim->counters, memory, &counter );\n      if ( error )\n        goto Exit;\n    }\n\n    /* now, set the bits for our hints in the counter mask */\n    error = ps_mask_set_bit( counter, hint1, memory );\n    if ( error )\n      goto Exit;\n\n    error = ps_mask_set_bit( counter, hint2, memory );\n    if ( error )\n      goto Exit;\n\n    error = ps_mask_set_bit( counter, hint3, memory );\n    if ( error )\n      goto Exit;\n\n  Exit:\n    return error;\n  }\n\n\n  /* end of recording session for a given dimension */\n  static FT_Error\n  ps_dimension_end( PS_Dimension  dim,\n                    FT_UInt       end_point,\n                    FT_Memory     memory )\n  {\n    /* end hint mask table */\n    ps_dimension_end_mask( dim, end_point );\n\n    /* merge all counter masks into independent \"paths\" */\n    return ps_mask_table_merge_all( &dim->counters, memory );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    PS_RECORDER MANAGEMENT                     *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* destroy hints */\n  FT_LOCAL( void )\n  ps_hints_done( PS_Hints  hints )\n  {\n    FT_Memory  memory = hints->memory;\n\n\n    ps_dimension_done( &hints->dimension[0], memory );\n    ps_dimension_done( &hints->dimension[1], memory );\n\n    hints->error  = FT_Err_Ok;\n    hints->memory = 0;\n  }\n\n\n  FT_LOCAL( FT_Error )\n  ps_hints_init( PS_Hints   hints,\n                 FT_Memory  memory )\n  {\n    FT_MEM_ZERO( hints, sizeof ( *hints ) );\n    hints->memory = memory;\n    return FT_Err_Ok;\n  }\n\n\n  /* initialize a hints for a new session */\n  static void\n  ps_hints_open( PS_Hints      hints,\n                 PS_Hint_Type  hint_type )\n  {\n    switch ( hint_type )\n    {\n    case PS_HINT_TYPE_1:\n    case PS_HINT_TYPE_2:\n      hints->error     = FT_Err_Ok;\n      hints->hint_type = hint_type;\n\n      ps_dimension_init( &hints->dimension[0] );\n      ps_dimension_init( &hints->dimension[1] );\n      break;\n\n    default:\n      hints->error     = FT_THROW( Invalid_Argument );\n      hints->hint_type = hint_type;\n\n      FT_TRACE0(( \"ps_hints_open: invalid charstring type\\n\" ));\n      break;\n    }\n  }\n\n\n  /* add one or more stems to the current hints table */\n  static void\n  ps_hints_stem( PS_Hints  hints,\n                 FT_Int    dimension,\n                 FT_UInt   count,\n                 FT_Long*  stems )\n  {\n    if ( !hints->error )\n    {\n      /* limit \"dimension\" to 0..1 */\n      if ( dimension < 0 || dimension > 1 )\n      {\n        FT_TRACE0(( \"ps_hints_stem: invalid dimension (%d) used\\n\",\n                    dimension ));\n        dimension = ( dimension != 0 );\n      }\n\n      /* record the stems in the current hints/masks table */\n      switch ( hints->hint_type )\n      {\n      case PS_HINT_TYPE_1:  /* Type 1 \"hstem\" or \"vstem\" operator */\n      case PS_HINT_TYPE_2:  /* Type 2 \"hstem\" or \"vstem\" operator */\n        {\n          PS_Dimension  dim = &hints->dimension[dimension];\n\n\n          for ( ; count > 0; count--, stems += 2 )\n          {\n            FT_Error   error;\n            FT_Memory  memory = hints->memory;\n\n\n            error = ps_dimension_add_t1stem(\n                      dim, (FT_Int)stems[0], (FT_Int)stems[1],\n                      memory, NULL );\n            if ( error )\n            {\n              FT_ERROR(( \"ps_hints_stem: could not add stem\"\n                         \" (%d,%d) to hints table\\n\", stems[0], stems[1] ));\n\n              hints->error = error;\n              return;\n            }\n          }\n          break;\n        }\n\n      default:\n        FT_TRACE0(( \"ps_hints_stem: called with invalid hint type (%d)\\n\",\n                    hints->hint_type ));\n        break;\n      }\n    }\n  }\n\n\n  /* add one Type1 counter stem to the current hints table */\n  static void\n  ps_hints_t1stem3( PS_Hints   hints,\n                    FT_Int     dimension,\n                    FT_Fixed*  stems )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    if ( !hints->error )\n    {\n      PS_Dimension  dim;\n      FT_Memory     memory = hints->memory;\n      FT_Int        count;\n      FT_Int        idx[3];\n\n\n      /* limit \"dimension\" to 0..1 */\n      if ( dimension < 0 || dimension > 1 )\n      {\n        FT_TRACE0(( \"ps_hints_t1stem3: invalid dimension (%d) used\\n\",\n                    dimension ));\n        dimension = ( dimension != 0 );\n      }\n\n      dim = &hints->dimension[dimension];\n\n      /* there must be 6 elements in the 'stem' array */\n      if ( hints->hint_type == PS_HINT_TYPE_1 )\n      {\n        /* add the three stems to our hints/masks table */\n        for ( count = 0; count < 3; count++, stems += 2 )\n        {\n          error = ps_dimension_add_t1stem( dim,\n                                           (FT_Int)FIXED_TO_INT( stems[0] ),\n                                           (FT_Int)FIXED_TO_INT( stems[1] ),\n                                           memory, &idx[count] );\n          if ( error )\n            goto Fail;\n        }\n\n        /* now, add the hints to the counters table */\n        error = ps_dimension_add_counter( dim, idx[0], idx[1], idx[2],\n                                          memory );\n        if ( error )\n          goto Fail;\n      }\n      else\n      {\n        FT_ERROR(( \"ps_hints_t1stem3: called with invalid hint type\\n\" ));\n        error = FT_THROW( Invalid_Argument );\n        goto Fail;\n      }\n    }\n\n    return;\n\n  Fail:\n    FT_ERROR(( \"ps_hints_t1stem3: could not add counter stems to table\\n\" ));\n    hints->error = error;\n  }\n\n\n  /* reset hints (only with Type 1 hints) */\n  static void\n  ps_hints_t1reset( PS_Hints  hints,\n                    FT_UInt   end_point )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    if ( !hints->error )\n    {\n      FT_Memory  memory = hints->memory;\n\n\n      if ( hints->hint_type == PS_HINT_TYPE_1 )\n      {\n        error = ps_dimension_reset_mask( &hints->dimension[0],\n                                         end_point, memory );\n        if ( error )\n          goto Fail;\n\n        error = ps_dimension_reset_mask( &hints->dimension[1],\n                                         end_point, memory );\n        if ( error )\n          goto Fail;\n      }\n      else\n      {\n        /* invalid hint type */\n        error = FT_THROW( Invalid_Argument );\n        goto Fail;\n      }\n    }\n    return;\n\n  Fail:\n    hints->error = error;\n  }\n\n\n  /* Type2 \"hintmask\" operator, add a new hintmask to each direction */\n  static void\n  ps_hints_t2mask( PS_Hints        hints,\n                   FT_UInt         end_point,\n                   FT_UInt         bit_count,\n                   const FT_Byte*  bytes )\n  {\n    FT_Error  error;\n\n\n    if ( !hints->error )\n    {\n      PS_Dimension  dim    = hints->dimension;\n      FT_Memory     memory = hints->memory;\n      FT_UInt       count1 = dim[0].hints.num_hints;\n      FT_UInt       count2 = dim[1].hints.num_hints;\n\n\n      /* check bit count; must be equal to current total hint count */\n      if ( bit_count !=  count1 + count2 )\n      {\n        FT_TRACE0(( \"ps_hints_t2mask:\"\n                    \" called with invalid bitcount %d (instead of %d)\\n\",\n                   bit_count, count1 + count2 ));\n\n        /* simply ignore the operator */\n        return;\n      }\n\n      /* set-up new horizontal and vertical hint mask now */\n      error = ps_dimension_set_mask_bits( &dim[0], bytes, count2, count1,\n                                          end_point, memory );\n      if ( error )\n        goto Fail;\n\n      error = ps_dimension_set_mask_bits( &dim[1], bytes, 0, count2,\n                                          end_point, memory );\n      if ( error )\n        goto Fail;\n    }\n    return;\n\n  Fail:\n    hints->error = error;\n  }\n\n\n  static void\n  ps_hints_t2counter( PS_Hints        hints,\n                      FT_UInt         bit_count,\n                      const FT_Byte*  bytes )\n  {\n    FT_Error  error;\n\n\n    if ( !hints->error )\n    {\n      PS_Dimension  dim    = hints->dimension;\n      FT_Memory     memory = hints->memory;\n      FT_UInt       count1 = dim[0].hints.num_hints;\n      FT_UInt       count2 = dim[1].hints.num_hints;\n\n\n      /* check bit count, must be equal to current total hint count */\n      if ( bit_count !=  count1 + count2 )\n      {\n        FT_TRACE0(( \"ps_hints_t2counter:\"\n                    \" called with invalid bitcount %d (instead of %d)\\n\",\n                   bit_count, count1 + count2 ));\n\n        /* simply ignore the operator */\n        return;\n      }\n\n      /* set-up new horizontal and vertical hint mask now */\n      error = ps_dimension_set_mask_bits( &dim[0], bytes, 0, count1,\n                                          0, memory );\n      if ( error )\n        goto Fail;\n\n      error = ps_dimension_set_mask_bits( &dim[1], bytes, count1, count2,\n                                          0, memory );\n      if ( error )\n        goto Fail;\n    }\n    return;\n\n  Fail:\n    hints->error = error;\n  }\n\n\n  /* end recording session */\n  static FT_Error\n  ps_hints_close( PS_Hints  hints,\n                  FT_UInt   end_point )\n  {\n    FT_Error  error;\n\n\n    error = hints->error;\n    if ( !error )\n    {\n      FT_Memory     memory = hints->memory;\n      PS_Dimension  dim    = hints->dimension;\n\n\n      error = ps_dimension_end( &dim[0], end_point, memory );\n      if ( !error )\n      {\n        error = ps_dimension_end( &dim[1], end_point, memory );\n      }\n    }\n\n#ifdef DEBUG_HINTER\n    if ( !error )\n      ps_debug_hints = hints;\n#endif\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                TYPE 1 HINTS RECORDING INTERFACE               *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  t1_hints_open( T1_Hints  hints )\n  {\n    ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_1 );\n  }\n\n  static void\n  t1_hints_stem( T1_Hints   hints,\n                 FT_Int     dimension,\n                 FT_Fixed*  coords )\n  {\n    FT_Pos  stems[2];\n\n\n    stems[0] = FIXED_TO_INT( coords[0] );\n    stems[1] = FIXED_TO_INT( coords[1] );\n\n    ps_hints_stem( (PS_Hints)hints, dimension, 1, stems );\n  }\n\n\n  FT_LOCAL_DEF( void )\n  t1_hints_funcs_init( T1_Hints_FuncsRec*  funcs )\n  {\n    FT_MEM_ZERO( (char*)funcs, sizeof ( *funcs ) );\n\n    funcs->open  = (T1_Hints_OpenFunc)    t1_hints_open;\n    funcs->close = (T1_Hints_CloseFunc)   ps_hints_close;\n    funcs->stem  = (T1_Hints_SetStemFunc) t1_hints_stem;\n    funcs->stem3 = (T1_Hints_SetStem3Func)ps_hints_t1stem3;\n    funcs->reset = (T1_Hints_ResetFunc)   ps_hints_t1reset;\n    funcs->apply = (T1_Hints_ApplyFunc)   ps_hints_apply;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                TYPE 2 HINTS RECORDING INTERFACE               *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  t2_hints_open( T2_Hints  hints )\n  {\n    ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_2 );\n  }\n\n\n  static void\n  t2_hints_stems( T2_Hints   hints,\n                  FT_Int     dimension,\n                  FT_Int     count,\n                  FT_Fixed*  coords )\n  {\n    FT_Pos  stems[32], y, n;\n    FT_Int  total = count;\n\n\n    y = 0;\n    while ( total > 0 )\n    {\n      /* determine number of stems to write */\n      count = total;\n      if ( count > 16 )\n        count = 16;\n\n      /* compute integer stem positions in font units */\n      for ( n = 0; n < count * 2; n++ )\n      {\n        y       += coords[n];\n        stems[n] = FIXED_TO_INT( y );\n      }\n\n      /* compute lengths */\n      for ( n = 0; n < count * 2; n += 2 )\n        stems[n + 1] = stems[n + 1] - stems[n];\n\n      /* add them to the current dimension */\n      ps_hints_stem( (PS_Hints)hints, dimension, count, stems );\n\n      total -= count;\n    }\n  }\n\n\n  FT_LOCAL_DEF( void )\n  t2_hints_funcs_init( T2_Hints_FuncsRec*  funcs )\n  {\n    FT_MEM_ZERO( funcs, sizeof ( *funcs ) );\n\n    funcs->open    = (T2_Hints_OpenFunc)   t2_hints_open;\n    funcs->close   = (T2_Hints_CloseFunc)  ps_hints_close;\n    funcs->stems   = (T2_Hints_StemsFunc)  t2_hints_stems;\n    funcs->hintmask= (T2_Hints_MaskFunc)   ps_hints_t2mask;\n    funcs->counter = (T2_Hints_CounterFunc)ps_hints_t2counter;\n    funcs->apply   = (T2_Hints_ApplyFunc)  ps_hints_apply;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshrec.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pshrec.h                                                               */\n/*                                                                         */\n/*    Postscript (Type1/Type2) hints recorder (specification).             */\n/*                                                                         */\n/*  Copyright 2001, 2002, 2003, 2006, 2008 by                              */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /**************************************************************************/\n  /*                                                                        */\n  /*  The functions defined here are called from the Type 1, CID and CFF    */\n  /*  font drivers to record the hints of a given character/glyph.          */\n  /*                                                                        */\n  /*  The hints are recorded in a unified format, and are later processed   */\n  /*  by the `optimizer' and `fitter' to adjust the outlines to the pixel   */\n  /*  grid.                                                                 */\n  /*                                                                        */\n  /**************************************************************************/\n\n\n#ifndef __PSHREC_H__\n#define __PSHREC_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/pshints.h\"\n#include \"pshglob.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                 GLYPH HINTS RECORDER INTERNALS                *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* handle to hint record */\n  typedef struct PS_HintRec_*  PS_Hint;\n\n  /* hint types */\n  typedef enum  PS_Hint_Type_\n  {\n    PS_HINT_TYPE_1 = 1,\n    PS_HINT_TYPE_2 = 2\n\n  } PS_Hint_Type;\n\n\n  /* hint flags */\n  typedef enum  PS_Hint_Flags_\n  {\n    PS_HINT_FLAG_GHOST  = 1,\n    PS_HINT_FLAG_BOTTOM = 2\n\n  } PS_Hint_Flags;\n\n\n  /* hint descriptor */\n  typedef struct  PS_HintRec_\n  {\n    FT_Int   pos;\n    FT_Int   len;\n    FT_UInt  flags;\n\n  } PS_HintRec;\n\n\n#define ps_hint_is_active( x )  ( (x)->flags & PS_HINT_FLAG_ACTIVE )\n#define ps_hint_is_ghost( x )   ( (x)->flags & PS_HINT_FLAG_GHOST  )\n#define ps_hint_is_bottom( x )  ( (x)->flags & PS_HINT_FLAG_BOTTOM )\n\n\n  /* hints table descriptor */\n  typedef struct  PS_Hint_TableRec_\n  {\n    FT_UInt  num_hints;\n    FT_UInt  max_hints;\n    PS_Hint  hints;\n\n  } PS_Hint_TableRec, *PS_Hint_Table;\n\n\n  /* hint and counter mask descriptor */\n  typedef struct  PS_MaskRec_\n  {\n    FT_UInt   num_bits;\n    FT_UInt   max_bits;\n    FT_Byte*  bytes;\n    FT_UInt   end_point;\n\n  } PS_MaskRec, *PS_Mask;\n\n\n  /* masks and counters table descriptor */\n  typedef struct  PS_Mask_TableRec_\n  {\n    FT_UInt  num_masks;\n    FT_UInt  max_masks;\n    PS_Mask  masks;\n\n  } PS_Mask_TableRec, *PS_Mask_Table;\n\n\n /* dimension-specific hints descriptor */\n  typedef struct  PS_DimensionRec_\n  {\n    PS_Hint_TableRec  hints;\n    PS_Mask_TableRec  masks;\n    PS_Mask_TableRec  counters;\n\n  } PS_DimensionRec, *PS_Dimension;\n\n\n  /* glyph hints descriptor                                */\n  /* dimension 0 => X coordinates + vertical hints/stems   */\n  /* dimension 1 => Y coordinates + horizontal hints/stems */\n  typedef struct  PS_HintsRec_\n  {\n    FT_Memory        memory;\n    FT_Error         error;\n    FT_UInt32        magic;\n    PS_Hint_Type     hint_type;\n    PS_DimensionRec  dimension[2];\n\n  } PS_HintsRec, *PS_Hints;\n\n  /* */\n\n  /* initialize hints recorder */\n  FT_LOCAL( FT_Error )\n  ps_hints_init( PS_Hints   hints,\n                 FT_Memory  memory );\n\n  /* finalize hints recorder */\n  FT_LOCAL( void )\n  ps_hints_done( PS_Hints  hints );\n\n  /* initialize Type1 hints recorder interface */\n  FT_LOCAL( void )\n  t1_hints_funcs_init( T1_Hints_FuncsRec*  funcs );\n\n  /* initialize Type2 hints recorder interface */\n  FT_LOCAL( void )\n  t2_hints_funcs_init( T2_Hints_FuncsRec*  funcs );\n\n\n#ifdef DEBUG_HINTER\n  extern PS_Hints  ps_debug_hints;\n  extern  int      ps_debug_no_horz_hints;\n  extern  int      ps_debug_no_vert_hints;\n#endif\n\n /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __PS_HINTER_RECORD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/Jamfile",
    "content": "# FreeType 2 src/psnames Jamfile\n#\n# Copyright 2001 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) psnames ;\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = psmodule pspic ;\n  }\n  else\n  {\n    _sources = psnames ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/psnames Jamfile\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/fxft_psmodule.c",
    "content": "#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501\n/***************************************************************************/\n/*                                                                         */\n/*  psmodule.c                                                             */\n/*                                                                         */\n/*    PSNames module implementation (body).                                */\n/*                                                                         */\n/*  Copyright 1996-2003, 2005-2008, 2012, 2013 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#define FT2_BUILD_LIBRARY\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/internal/services/svpscmap.h\"\n\n#include \"psmodule.h\"\n#include \"pstables.h\"\n\n#include \"psnamerr.h\"\n#include \"pspic.h\"\n\n\n#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES\n\n\n#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST\n\n\n#define VARIANT_BIT         0x80000000UL\n#define BASE_GLYPH( code )  ( (FT_UInt32)( (code) & ~VARIANT_BIT ) )\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n  /* Return the Unicode value corresponding to a given glyph.  Note that */\n  /* we do deal with glyph variants by detecting a non-initial dot in    */\n  /* the name, as in `A.swash' or `e.final'; in this case, the           */\n  /* VARIANT_BIT is set in the return value.                             */\n  /*                                                                     */\nint FXFT_unicode_from_adobe_name( const char*  glyph_name )\n  {\n    /* If the name begins with `uni', then the glyph name may be a */\n    /* hard-coded unicode character code.                          */\n    if ( glyph_name[0] == 'u' &&\n         glyph_name[1] == 'n' &&\n         glyph_name[2] == 'i' )\n    {\n      /* determine whether the next four characters following are */\n      /* hexadecimal.                                             */\n\n      /* XXX: Add code to deal with ligatures, i.e. glyph names like */\n      /*      `uniXXXXYYYYZZZZ'...                                   */\n\n      FT_Int       count;\n      FT_UInt32    value = 0;\n      const char*  p     = glyph_name + 3;\n\n\n      for ( count = 4; count > 0; count--, p++ )\n      {\n        char          c = *p;\n        unsigned int  d;\n\n\n        d = (unsigned char)c - '0';\n        if ( d >= 10 )\n        {\n          d = (unsigned char)c - 'A';\n          if ( d >= 6 )\n            d = 16;\n          else\n            d += 10;\n        }\n\n        /* Exit if a non-uppercase hexadecimal character was found   */\n        /* -- this also catches character codes below `0' since such */\n        /* negative numbers cast to `unsigned int' are far too big.  */\n        if ( d >= 16 )\n          break;\n\n        value = ( value << 4 ) + d;\n      }\n\n      /* there must be exactly four hex digits */\n      if ( count == 0 )\n      {\n        if ( *p == '\\0' )\n          return value;\n        if ( *p == '.' )\n          return (FT_UInt32)( value | VARIANT_BIT );\n      }\n    }\n\n    /* If the name begins with `u', followed by four to six uppercase */\n    /* hexadecimal digits, it is a hard-coded unicode character code. */\n    if ( glyph_name[0] == 'u' )\n    {\n      FT_Int       count;\n      FT_UInt32    value = 0;\n      const char*  p     = glyph_name + 1;\n\n\n      for ( count = 6; count > 0; count--, p++ )\n      {\n        char          c = *p;\n        unsigned int  d;\n\n\n        d = (unsigned char)c - '0';\n        if ( d >= 10 )\n        {\n          d = (unsigned char)c - 'A';\n          if ( d >= 6 )\n            d = 16;\n          else\n            d += 10;\n        }\n\n        if ( d >= 16 )\n          break;\n\n        value = ( value << 4 ) + d;\n      }\n\n      if ( count <= 2 )\n      {\n        if ( *p == '\\0' )\n          return value;\n        if ( *p == '.' )\n          return (FT_UInt32)( value | VARIANT_BIT );\n      }\n    }\n\n    /* Look for a non-initial dot in the glyph name in order to */\n    /* find variants like `A.swash', `e.final', etc.            */\n    {\n      const char*  p   = glyph_name;\n      const char*  dot = NULL;\n\n\n      for ( ; *p; p++ )\n      {\n        if ( *p == '.' && p > glyph_name )\n        {\n          dot = p;\n          break;\n        }\n      }\n\n      /* now look up the glyph in the Adobe Glyph List */\n      if ( !dot )\n        return (FT_UInt32)ft_get_adobe_glyph_index( glyph_name, p );\n      else\n        return (FT_UInt32)( ft_get_adobe_glyph_index( glyph_name, dot ) |\n                            VARIANT_BIT );\n    }\n  }\n  #ifdef __cplusplus\n}\n#endif\n\n#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)\nstatic int xyq_search_node(char* glyph_name, int name_offset, int table_offset, FT_UInt32 unicode)\n{\n\tint i, count;\n\n\t// copy letters\n\twhile (1) {\n\t\tglyph_name[name_offset] = ft_adobe_glyph_list[table_offset] & 0x7f;\n\t\tname_offset ++;\n\t\ttable_offset ++;\n\t\tif (!(ft_adobe_glyph_list[table_offset-1] & 0x80)) break;\n\t}\n\tglyph_name[name_offset] = 0;\n\n\t// get child count\n\tcount = ft_adobe_glyph_list[table_offset] & 0x7f;\n\n\t// check if we have value for this node\n\tif (ft_adobe_glyph_list[table_offset] & 0x80) {\n\t\tunsigned short thiscode = ft_adobe_glyph_list[table_offset+1] * 256 + ft_adobe_glyph_list[table_offset+2];\n\t\tif (thiscode == unicode)\t// found it!\n\t\t\treturn 1;\n\t\ttable_offset += 3;\n\t} else\n\t\ttable_offset ++;\n\n\t// now search in sub-nodes\n\tif (count == 0) return 0;\n\tfor (i = 0; i < count; i ++) {\n\t\tint child_offset = ft_adobe_glyph_list[table_offset+i*2] * 256 + ft_adobe_glyph_list[table_offset+i*2+1];\n\t\tif (xyq_search_node(glyph_name, name_offset, child_offset, unicode))\n\t\t\t// found in child\n\t\t\treturn 1;\n\t}\n\treturn 0;\n}\n\n// XYQ: function for searching Unicode in the glyph list\nvoid FXFT_adobe_name_from_unicode(char* glyph_name, FT_UInt32 unicode)\n{\n\tint i, count;\n\t\n\t// start from top level node\n\tcount = ft_adobe_glyph_list[1];\n\tfor (i = 0; i < count; i ++) {\n\t\tint child_offset = ft_adobe_glyph_list[i*2+2] * 256 + ft_adobe_glyph_list[i*2+3];\n\t\tif (xyq_search_node(glyph_name, 0, child_offset, unicode))\n\t\t\treturn;\n\t}\n\n\t// failed, clear the buffer\n\tglyph_name[0] = 0;\n}\n#endif\n\n  /* ft_qsort callback to sort the unicode map */\n  FT_CALLBACK_DEF( int )\n  compare_uni_maps( const void*  a,\n                    const void*  b )\n  {\n    PS_UniMap*  map1 = (PS_UniMap*)a;\n    PS_UniMap*  map2 = (PS_UniMap*)b;\n    FT_UInt32   unicode1 = BASE_GLYPH( map1->unicode );\n    FT_UInt32   unicode2 = BASE_GLYPH( map2->unicode );\n\n\n    /* sort base glyphs before glyph variants */\n    if ( unicode1 == unicode2 )\n    {\n      if ( map1->unicode > map2->unicode )\n        return 1;\n      else if ( map1->unicode < map2->unicode )\n        return -1;\n      else\n        return 0;\n    }\n    else\n    {\n      if ( unicode1 > unicode2 )\n        return 1;\n      else if ( unicode1 < unicode2 )\n        return -1;\n      else\n        return 0;\n    }\n  }\n\n\n  /* support for extra glyphs not handled (well) in AGL; */\n  /* we add extra mappings for them if necessary         */\n\n#define EXTRA_GLYPH_LIST_SIZE  10\n\n  static const FT_UInt32  ft_extra_glyph_unicodes[EXTRA_GLYPH_LIST_SIZE] =\n  {\n    /* WGL 4 */\n    0x0394,\n    0x03A9,\n    0x2215,\n    0x00AD,\n    0x02C9,\n    0x03BC,\n    0x2219,\n    0x00A0,\n    /* Romanian */\n    0x021A,\n    0x021B\n  };\n\n  static const char  ft_extra_glyph_names[] =\n  {\n    'D','e','l','t','a',0,\n    'O','m','e','g','a',0,\n    'f','r','a','c','t','i','o','n',0,\n    'h','y','p','h','e','n',0,\n    'm','a','c','r','o','n',0,\n    'm','u',0,\n    'p','e','r','i','o','d','c','e','n','t','e','r','e','d',0,\n    's','p','a','c','e',0,\n    'T','c','o','m','m','a','a','c','c','e','n','t',0,\n    't','c','o','m','m','a','a','c','c','e','n','t',0\n  };\n\n  static const FT_Int\n  ft_extra_glyph_name_offsets[EXTRA_GLYPH_LIST_SIZE] =\n  {\n     0,\n     6,\n    12,\n    21,\n    28,\n    35,\n    38,\n    53,\n    59,\n    72\n  };\n\n\n  static void\n  ps_check_extra_glyph_name( const char*  gname,\n                             FT_UInt      glyph,\n                             FT_UInt*     extra_glyphs,\n                             FT_UInt     *states )\n  {\n    FT_UInt  n;\n\n\n    for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ )\n    {\n      if ( ft_strcmp( ft_extra_glyph_names +\n                        ft_extra_glyph_name_offsets[n], gname ) == 0 )\n      {\n        if ( states[n] == 0 )\n        {\n          /* mark this extra glyph as a candidate for the cmap */\n          states[n]     = 1;\n          extra_glyphs[n] = glyph;\n        }\n\n        return;\n      }\n    }\n  }\n\n\n  static void\n  ps_check_extra_glyph_unicode( FT_UInt32  uni_char,\n                                FT_UInt   *states )\n  {\n    FT_UInt  n;\n\n\n    for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ )\n    {\n      if ( uni_char == ft_extra_glyph_unicodes[n] )\n      {\n        /* disable this extra glyph from being added to the cmap */\n        states[n] = 2;\n\n        return;\n      }\n    }\n  }\n\n\n  /* Build a table that maps Unicode values to glyph indices. */\n  static FT_Error\n  ps_unicodes_init( FT_Memory             memory,\n                    PS_Unicodes           table,\n                    FT_UInt               num_glyphs,\n                    PS_GetGlyphNameFunc   get_glyph_name,\n                    PS_FreeGlyphNameFunc  free_glyph_name,\n                    FT_Pointer            glyph_data )\n  {\n    FT_Error  error;\n\n    FT_UInt  extra_glyph_list_states[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };\n    FT_UInt  extra_glyphs[EXTRA_GLYPH_LIST_SIZE];\n\n\n    /* we first allocate the table */\n    table->num_maps = 0;\n    table->maps     = 0;\n\n    if ( !FT_NEW_ARRAY( table->maps, num_glyphs + EXTRA_GLYPH_LIST_SIZE ) )\n    {\n      FT_UInt     n;\n      FT_UInt     count;\n      PS_UniMap*  map;\n      FT_UInt32   uni_char;\n\n\n      map = table->maps;\n\n      for ( n = 0; n < num_glyphs; n++ )\n      {\n        const char*  gname = get_glyph_name( glyph_data, n );\n\n\n        if ( gname )\n        {\n          ps_check_extra_glyph_name( gname, n,\n                                     extra_glyphs, extra_glyph_list_states );\n          uni_char = FXFT_unicode_from_adobe_name( gname );\n\n          if ( BASE_GLYPH( uni_char ) != 0 )\n          {\n            ps_check_extra_glyph_unicode( uni_char,\n                                          extra_glyph_list_states );\n            map->unicode     = uni_char;\n            map->glyph_index = n;\n            map++;\n          }\n\n          if ( free_glyph_name )\n            free_glyph_name( glyph_data, gname );\n        }\n      }\n\n      for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ )\n      {\n        if ( extra_glyph_list_states[n] == 1 )\n        {\n          /* This glyph name has an additional representation. */\n          /* Add it to the cmap.                               */\n\n          map->unicode     = ft_extra_glyph_unicodes[n];\n          map->glyph_index = extra_glyphs[n];\n          map++;\n        }\n      }\n\n      /* now compress the table a bit */\n      count = (FT_UInt)( map - table->maps );\n\n      if ( count == 0 )\n      {\n        /* No unicode chars here! */\n        FT_FREE( table->maps );\n        if ( !error )\n          error = FT_THROW( No_Unicode_Glyph_Name );\n      }\n      else\n      {\n        /* Reallocate if the number of used entries is much smaller. */\n        if ( count < num_glyphs / 2 )\n        {\n          (void)FT_RENEW_ARRAY( table->maps, num_glyphs, count );\n          error = FT_Err_Ok;\n        }\n\n        /* Sort the table in increasing order of unicode values, */\n        /* taking care of glyph variants.                        */\n        ft_qsort( table->maps, count, sizeof ( PS_UniMap ),\n                  compare_uni_maps );\n      }\n\n      table->num_maps = count;\n    }\n\n    return error;\n  }\n\n\n  static FT_UInt\n  ps_unicodes_char_index( PS_Unicodes  table,\n                          FT_UInt32    unicode )\n  {\n    PS_UniMap  *min, *max, *mid, *result = NULL;\n\n\n    /* Perform a binary search on the table. */\n\n    min = table->maps;\n    max = min + table->num_maps - 1;\n\n    while ( min <= max )\n    {\n      FT_UInt32  base_glyph;\n\n\n      mid = min + ( ( max - min ) >> 1 );\n\n      if ( mid->unicode == unicode )\n      {\n        result = mid;\n        break;\n      }\n\n      base_glyph = BASE_GLYPH( mid->unicode );\n\n      if ( base_glyph == unicode )\n        result = mid; /* remember match but continue search for base glyph */\n\n      if ( min == max )\n        break;\n\n      if ( base_glyph < unicode )\n        min = mid + 1;\n      else\n        max = mid - 1;\n    }\n\n    if ( result )\n      return result->glyph_index;\n    else\n      return 0;\n  }\n\n\n  static FT_UInt32\n  ps_unicodes_char_next( PS_Unicodes  table,\n                         FT_UInt32   *unicode )\n  {\n    FT_UInt    result    = 0;\n    FT_UInt32  char_code = *unicode + 1;\n\n\n    {\n      FT_UInt     min = 0;\n      FT_UInt     max = table->num_maps;\n      FT_UInt     mid;\n      PS_UniMap*  map;\n      FT_UInt32   base_glyph;\n\n\n      while ( min < max )\n      {\n        mid = min + ( ( max - min ) >> 1 );\n        map = table->maps + mid;\n\n        if ( map->unicode == char_code )\n        {\n          result = map->glyph_index;\n          goto Exit;\n        }\n\n        base_glyph = BASE_GLYPH( map->unicode );\n\n        if ( base_glyph == char_code )\n          result = map->glyph_index;\n\n        if ( base_glyph < char_code )\n          min = mid + 1;\n        else\n          max = mid;\n      }\n\n      if ( result )\n        goto Exit;               /* we have a variant glyph */\n\n      /* we didn't find it; check whether we have a map just above it */\n      char_code = 0;\n\n      if ( min < table->num_maps )\n      {\n        map       = table->maps + min;\n        result    = map->glyph_index;\n        char_code = BASE_GLYPH( map->unicode );\n      }\n    }\n\n  Exit:\n    *unicode = char_code;\n    return result;\n  }\n\n\n#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */\n\n\n  static const char*\n  ps_get_macintosh_name( FT_UInt  name_index )\n  {\n    if ( name_index >= FT_NUM_MAC_NAMES )\n      name_index = 0;\n\n    return ft_standard_glyph_names + ft_mac_names[name_index];\n  }\n\n\n  static const char*\n  ps_get_standard_strings( FT_UInt  sid )\n  {\n    if ( sid >= FT_NUM_SID_NAMES )\n      return 0;\n\n    return ft_standard_glyph_names + ft_sid_names[sid];\n  }\n\n\n#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST\n\n  FT_DEFINE_SERVICE_PSCMAPSREC(\n    pscmaps_interface,\n    (PS_Unicode_ValueFunc)     FXFT_unicode_from_adobe_name,\n    (PS_Unicodes_InitFunc)     ps_unicodes_init,\n    (PS_Unicodes_CharIndexFunc)ps_unicodes_char_index,\n    (PS_Unicodes_CharNextFunc) ps_unicodes_char_next,\n\n    (PS_Macintosh_NameFunc)    ps_get_macintosh_name,\n    (PS_Adobe_Std_StringsFunc) ps_get_standard_strings,\n\n    t1_standard_encoding,\n    t1_expert_encoding )\n\n#else\n\n  FT_DEFINE_SERVICE_PSCMAPSREC(\n    pscmaps_interface,\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n\n    (PS_Macintosh_NameFunc)    ps_get_macintosh_name,\n    (PS_Adobe_Std_StringsFunc) ps_get_standard_strings,\n\n    t1_standard_encoding,\n    t1_expert_encoding )\n\n#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */\n\n\n  FT_DEFINE_SERVICEDESCREC1(\n    pscmaps_services,\n    FT_SERVICE_ID_POSTSCRIPT_CMAPS, &PSCMAPS_INTERFACE_GET )\n\n\n  static FT_Pointer\n  psnames_get_service( FT_Module    module,\n                       const char*  service_id )\n  {\n    /* PSCMAPS_SERVICES_GET derefers `library' in PIC mode */\n#ifdef FT_CONFIG_OPTION_PIC\n    FT_Library  library;\n\n\n    if ( !module )\n      return NULL;\n    library = module->library;\n    if ( !library )\n      return NULL;\n#else\n    FT_UNUSED( module );\n#endif\n\n    return ft_service_list_lookup( PSCMAPS_SERVICES_GET, service_id );\n  }\n\n#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */\n\n\n#ifndef FT_CONFIG_OPTION_POSTSCRIPT_NAMES\n#define PUT_PS_NAMES_SERVICE( a )  NULL\n#else\n#define PUT_PS_NAMES_SERVICE( a )  a\n#endif\n\n  FT_DEFINE_MODULE(\n    psnames_module_class,\n\n    0,  /* this is not a font driver, nor a renderer */\n    sizeof ( FT_ModuleRec ),\n\n    \"psnames\",  /* driver name                         */\n    0x10000L,   /* driver version                      */\n    0x20000L,   /* driver requires FreeType 2 or above */\n\n    PUT_PS_NAMES_SERVICE(\n      (void*)&PSCMAPS_INTERFACE_GET ),   /* module specific interface */\n    (FT_Module_Constructor)NULL,\n    (FT_Module_Destructor) NULL,\n    (FT_Module_Requester)  PUT_PS_NAMES_SERVICE( psnames_get_service ) )\n\n\n/* END */\n#endif\n\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psmodule.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  psmodule.h                                                             */\n/*                                                                         */\n/*    High-level PSNames module interface (specification).                 */\n/*                                                                         */\n/*  Copyright 1996-2001 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PSMODULE_H__\n#define __PSMODULE_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/ftmodapi.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  FT_DECLARE_MODULE( psnames_module_class )\n\n\nFT_END_HEADER\n\n#endif /* __PSMODULE_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psnamerr.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  psnamerr.h                                                             */\n/*                                                                         */\n/*    PS names module error codes (specification only).                    */\n/*                                                                         */\n/*  Copyright 2001, 2012 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the PS names module error enumeration     */\n  /* constants.                                                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __PSNAMERR_H__\n#define __PSNAMERR_H__\n\n#include \"../../include/freetype/ftmoderr.h\"\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  PSnames_Err_\n#define FT_ERR_BASE    FT_Mod_Err_PSnames\n\n#include \"../../include/freetype/fterrors.h\"\n\n#endif /* __PSNAMERR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psnames.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  psnames.c                                                              */\n/*                                                                         */\n/*    FreeType PSNames module component (body only).                       */\n/*                                                                         */\n/*  Copyright 1996-2001 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n\n#include \"../../include/ft2build.h\"\n#include \"pspic.c\"\n#include \"psmodule.c\"\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pspic.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pspic.c                                                                */\n/*                                                                         */\n/*    The FreeType position independent code services for psnames module.  */\n/*                                                                         */\n/*  Copyright 2009, 2010, 2012, 2013 by                                    */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/freetype.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"pspic.h\"\n#include \"psnamerr.h\"\n\n\n#ifdef FT_CONFIG_OPTION_PIC\n\n  /* forward declaration of PIC init functions from psmodule.c */\n  FT_Error\n  FT_Create_Class_pscmaps_services( FT_Library           library,\n                                    FT_ServiceDescRec**  output_class );\n  void\n  FT_Destroy_Class_pscmaps_services( FT_Library          library,\n                                     FT_ServiceDescRec*  clazz );\n\n  void\n  FT_Init_Class_pscmaps_interface( FT_Library              library,\n                                   FT_Service_PsCMapsRec*  clazz );\n\n\n  void\n  psnames_module_class_pic_free( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Memory          memory        = library->memory;\n\n\n    if ( pic_container->psnames )\n    {\n      PSModulePIC*  container = (PSModulePIC*)pic_container->psnames;\n\n\n      if ( container->pscmaps_services )\n        FT_Destroy_Class_pscmaps_services( library,\n                                           container->pscmaps_services );\n      container->pscmaps_services = NULL;\n      FT_FREE( container );\n      pic_container->psnames = NULL;\n    }\n  }\n\n\n  FT_Error\n  psnames_module_class_pic_init( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Error           error         = FT_Err_Ok;\n    PSModulePIC*       container     = NULL;\n    FT_Memory          memory        = library->memory;\n\n\n    /* allocate pointer, clear and set global container pointer */\n    if ( FT_ALLOC( container, sizeof ( *container ) ) )\n      return error;\n    FT_MEM_SET( container, 0, sizeof ( *container ) );\n    pic_container->psnames = container;\n\n    /* initialize pointer table -                       */\n    /* this is how the module usually expects this data */\n    error = FT_Create_Class_pscmaps_services(\n              library, &container->pscmaps_services );\n    if ( error )\n      goto Exit;\n    FT_Init_Class_pscmaps_interface( library,\n                                     &container->pscmaps_interface );\n\n  Exit:\n    if ( error )\n      psnames_module_class_pic_free( library );\n    return error;\n  }\n\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pspic.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pspic.h                                                                */\n/*                                                                         */\n/*    The FreeType position independent code services for psnames module.  */\n/*                                                                         */\n/*  Copyright 2009, 2012 by                                                */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PSPIC_H__\n#define __PSPIC_H__\n\n\nFT_BEGIN_HEADER\n\n#include \"../../include/freetype/internal/ftpic.h\"\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define PSCMAPS_SERVICES_GET   pscmaps_services\n#define PSCMAPS_INTERFACE_GET  pscmaps_interface\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#include \"../../include/freetype/internal/services/svpscmap.h\"\n\n  typedef struct  PSModulePIC_\n  {\n    FT_ServiceDescRec*     pscmaps_services;\n    FT_Service_PsCMapsRec  pscmaps_interface;\n\n  } PSModulePIC;\n\n\n#define GET_PIC( lib )                                     \\\n          ( (PSModulePIC*)((lib)->pic_container.psnames) )\n#define PSCMAPS_SERVICES_GET   ( GET_PIC( library )->pscmaps_services )\n#define PSCMAPS_INTERFACE_GET  ( GET_PIC( library )->pscmaps_interface )\n\n\n  /* see pspic.c for the implementation */\n  void\n  psnames_module_class_pic_free( FT_Library  library );\n\n  FT_Error\n  psnames_module_class_pic_init( FT_Library  library );\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __PSPIC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pstables.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pstables.h                                                             */\n/*                                                                         */\n/*    PostScript glyph names.                                              */\n/*                                                                         */\n/*  Copyright 2005, 2008, 2011 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /* This file has been generated automatically -- do not edit! */\n\n#ifdef _FX_MANAGED_CODE_\n__declspec(process)\n#endif\n  static const char  ft_standard_glyph_names[3696] =\n  {\n    '.','n','u','l','l', 0,\n    'n','o','n','m','a','r','k','i','n','g','r','e','t','u','r','n', 0,\n    'n','o','t','e','q','u','a','l', 0,\n    'i','n','f','i','n','i','t','y', 0,\n    'l','e','s','s','e','q','u','a','l', 0,\n    'g','r','e','a','t','e','r','e','q','u','a','l', 0,\n    'p','a','r','t','i','a','l','d','i','f','f', 0,\n    's','u','m','m','a','t','i','o','n', 0,\n    'p','r','o','d','u','c','t', 0,\n    'p','i', 0,\n    'i','n','t','e','g','r','a','l', 0,\n    'O','m','e','g','a', 0,\n    'r','a','d','i','c','a','l', 0,\n    'a','p','p','r','o','x','e','q','u','a','l', 0,\n    'D','e','l','t','a', 0,\n    'n','o','n','b','r','e','a','k','i','n','g','s','p','a','c','e', 0,\n    'l','o','z','e','n','g','e', 0,\n    'a','p','p','l','e', 0,\n    'f','r','a','n','c', 0,\n    'G','b','r','e','v','e', 0,\n    'g','b','r','e','v','e', 0,\n    'I','d','o','t','a','c','c','e','n','t', 0,\n    'S','c','e','d','i','l','l','a', 0,\n    's','c','e','d','i','l','l','a', 0,\n    'C','a','c','u','t','e', 0,\n    'c','a','c','u','t','e', 0,\n    'C','c','a','r','o','n', 0,\n    'c','c','a','r','o','n', 0,\n    'd','c','r','o','a','t', 0,\n    '.','n','o','t','d','e','f', 0,\n    's','p','a','c','e', 0,\n    'e','x','c','l','a','m', 0,\n    'q','u','o','t','e','d','b','l', 0,\n    'n','u','m','b','e','r','s','i','g','n', 0,\n    'd','o','l','l','a','r', 0,\n    'p','e','r','c','e','n','t', 0,\n    'a','m','p','e','r','s','a','n','d', 0,\n    'q','u','o','t','e','r','i','g','h','t', 0,\n    'p','a','r','e','n','l','e','f','t', 0,\n    'p','a','r','e','n','r','i','g','h','t', 0,\n    'a','s','t','e','r','i','s','k', 0,\n    'p','l','u','s', 0,\n    'c','o','m','m','a', 0,\n    'h','y','p','h','e','n', 0,\n    'p','e','r','i','o','d', 0,\n    's','l','a','s','h', 0,\n    'z','e','r','o', 0,\n    'o','n','e', 0,\n    't','w','o', 0,\n    't','h','r','e','e', 0,\n    'f','o','u','r', 0,\n    'f','i','v','e', 0,\n    's','i','x', 0,\n    's','e','v','e','n', 0,\n    'e','i','g','h','t', 0,\n    'n','i','n','e', 0,\n    'c','o','l','o','n', 0,\n    's','e','m','i','c','o','l','o','n', 0,\n    'l','e','s','s', 0,\n    'e','q','u','a','l', 0,\n    'g','r','e','a','t','e','r', 0,\n    'q','u','e','s','t','i','o','n', 0,\n    'a','t', 0,\n    'A', 0,\n    'B', 0,\n    'C', 0,\n    'D', 0,\n    'E', 0,\n    'F', 0,\n    'G', 0,\n    'H', 0,\n    'I', 0,\n    'J', 0,\n    'K', 0,\n    'L', 0,\n    'M', 0,\n    'N', 0,\n    'O', 0,\n    'P', 0,\n    'Q', 0,\n    'R', 0,\n    'S', 0,\n    'T', 0,\n    'U', 0,\n    'V', 0,\n    'W', 0,\n    'X', 0,\n    'Y', 0,\n    'Z', 0,\n    'b','r','a','c','k','e','t','l','e','f','t', 0,\n    'b','a','c','k','s','l','a','s','h', 0,\n    'b','r','a','c','k','e','t','r','i','g','h','t', 0,\n    'a','s','c','i','i','c','i','r','c','u','m', 0,\n    'u','n','d','e','r','s','c','o','r','e', 0,\n    'q','u','o','t','e','l','e','f','t', 0,\n    'a', 0,\n    'b', 0,\n    'c', 0,\n    'd', 0,\n    'e', 0,\n    'f', 0,\n    'g', 0,\n    'h', 0,\n    'i', 0,\n    'j', 0,\n    'k', 0,\n    'l', 0,\n    'm', 0,\n    'n', 0,\n    'o', 0,\n    'p', 0,\n    'q', 0,\n    'r', 0,\n    's', 0,\n    't', 0,\n    'u', 0,\n    'v', 0,\n    'w', 0,\n    'x', 0,\n    'y', 0,\n    'z', 0,\n    'b','r','a','c','e','l','e','f','t', 0,\n    'b','a','r', 0,\n    'b','r','a','c','e','r','i','g','h','t', 0,\n    'a','s','c','i','i','t','i','l','d','e', 0,\n    'e','x','c','l','a','m','d','o','w','n', 0,\n    'c','e','n','t', 0,\n    's','t','e','r','l','i','n','g', 0,\n    'f','r','a','c','t','i','o','n', 0,\n    'y','e','n', 0,\n    'f','l','o','r','i','n', 0,\n    's','e','c','t','i','o','n', 0,\n    'c','u','r','r','e','n','c','y', 0,\n    'q','u','o','t','e','s','i','n','g','l','e', 0,\n    'q','u','o','t','e','d','b','l','l','e','f','t', 0,\n    'g','u','i','l','l','e','m','o','t','l','e','f','t', 0,\n    'g','u','i','l','s','i','n','g','l','l','e','f','t', 0,\n    'g','u','i','l','s','i','n','g','l','r','i','g','h','t', 0,\n    'f','i', 0,\n    'f','l', 0,\n    'e','n','d','a','s','h', 0,\n    'd','a','g','g','e','r', 0,\n    'd','a','g','g','e','r','d','b','l', 0,\n    'p','e','r','i','o','d','c','e','n','t','e','r','e','d', 0,\n    'p','a','r','a','g','r','a','p','h', 0,\n    'b','u','l','l','e','t', 0,\n    'q','u','o','t','e','s','i','n','g','l','b','a','s','e', 0,\n    'q','u','o','t','e','d','b','l','b','a','s','e', 0,\n    'q','u','o','t','e','d','b','l','r','i','g','h','t', 0,\n    'g','u','i','l','l','e','m','o','t','r','i','g','h','t', 0,\n    'e','l','l','i','p','s','i','s', 0,\n    'p','e','r','t','h','o','u','s','a','n','d', 0,\n    'q','u','e','s','t','i','o','n','d','o','w','n', 0,\n    'g','r','a','v','e', 0,\n    'a','c','u','t','e', 0,\n    'c','i','r','c','u','m','f','l','e','x', 0,\n    't','i','l','d','e', 0,\n    'm','a','c','r','o','n', 0,\n    'b','r','e','v','e', 0,\n    'd','o','t','a','c','c','e','n','t', 0,\n    'd','i','e','r','e','s','i','s', 0,\n    'r','i','n','g', 0,\n    'c','e','d','i','l','l','a', 0,\n    'h','u','n','g','a','r','u','m','l','a','u','t', 0,\n    'o','g','o','n','e','k', 0,\n    'c','a','r','o','n', 0,\n    'e','m','d','a','s','h', 0,\n    'A','E', 0,\n    'o','r','d','f','e','m','i','n','i','n','e', 0,\n    'L','s','l','a','s','h', 0,\n    'O','s','l','a','s','h', 0,\n    'O','E', 0,\n    'o','r','d','m','a','s','c','u','l','i','n','e', 0,\n    'a','e', 0,\n    'd','o','t','l','e','s','s','i', 0,\n    'l','s','l','a','s','h', 0,\n    'o','s','l','a','s','h', 0,\n    'o','e', 0,\n    'g','e','r','m','a','n','d','b','l','s', 0,\n    'o','n','e','s','u','p','e','r','i','o','r', 0,\n    'l','o','g','i','c','a','l','n','o','t', 0,\n    'm','u', 0,\n    't','r','a','d','e','m','a','r','k', 0,\n    'E','t','h', 0,\n    'o','n','e','h','a','l','f', 0,\n    'p','l','u','s','m','i','n','u','s', 0,\n    'T','h','o','r','n', 0,\n    'o','n','e','q','u','a','r','t','e','r', 0,\n    'd','i','v','i','d','e', 0,\n    'b','r','o','k','e','n','b','a','r', 0,\n    'd','e','g','r','e','e', 0,\n    't','h','o','r','n', 0,\n    't','h','r','e','e','q','u','a','r','t','e','r','s', 0,\n    't','w','o','s','u','p','e','r','i','o','r', 0,\n    'r','e','g','i','s','t','e','r','e','d', 0,\n    'm','i','n','u','s', 0,\n    'e','t','h', 0,\n    'm','u','l','t','i','p','l','y', 0,\n    't','h','r','e','e','s','u','p','e','r','i','o','r', 0,\n    'c','o','p','y','r','i','g','h','t', 0,\n    'A','a','c','u','t','e', 0,\n    'A','c','i','r','c','u','m','f','l','e','x', 0,\n    'A','d','i','e','r','e','s','i','s', 0,\n    'A','g','r','a','v','e', 0,\n    'A','r','i','n','g', 0,\n    'A','t','i','l','d','e', 0,\n    'C','c','e','d','i','l','l','a', 0,\n    'E','a','c','u','t','e', 0,\n    'E','c','i','r','c','u','m','f','l','e','x', 0,\n    'E','d','i','e','r','e','s','i','s', 0,\n    'E','g','r','a','v','e', 0,\n    'I','a','c','u','t','e', 0,\n    'I','c','i','r','c','u','m','f','l','e','x', 0,\n    'I','d','i','e','r','e','s','i','s', 0,\n    'I','g','r','a','v','e', 0,\n    'N','t','i','l','d','e', 0,\n    'O','a','c','u','t','e', 0,\n    'O','c','i','r','c','u','m','f','l','e','x', 0,\n    'O','d','i','e','r','e','s','i','s', 0,\n    'O','g','r','a','v','e', 0,\n    'O','t','i','l','d','e', 0,\n    'S','c','a','r','o','n', 0,\n    'U','a','c','u','t','e', 0,\n    'U','c','i','r','c','u','m','f','l','e','x', 0,\n    'U','d','i','e','r','e','s','i','s', 0,\n    'U','g','r','a','v','e', 0,\n    'Y','a','c','u','t','e', 0,\n    'Y','d','i','e','r','e','s','i','s', 0,\n    'Z','c','a','r','o','n', 0,\n    'a','a','c','u','t','e', 0,\n    'a','c','i','r','c','u','m','f','l','e','x', 0,\n    'a','d','i','e','r','e','s','i','s', 0,\n    'a','g','r','a','v','e', 0,\n    'a','r','i','n','g', 0,\n    'a','t','i','l','d','e', 0,\n    'c','c','e','d','i','l','l','a', 0,\n    'e','a','c','u','t','e', 0,\n    'e','c','i','r','c','u','m','f','l','e','x', 0,\n    'e','d','i','e','r','e','s','i','s', 0,\n    'e','g','r','a','v','e', 0,\n    'i','a','c','u','t','e', 0,\n    'i','c','i','r','c','u','m','f','l','e','x', 0,\n    'i','d','i','e','r','e','s','i','s', 0,\n    'i','g','r','a','v','e', 0,\n    'n','t','i','l','d','e', 0,\n    'o','a','c','u','t','e', 0,\n    'o','c','i','r','c','u','m','f','l','e','x', 0,\n    'o','d','i','e','r','e','s','i','s', 0,\n    'o','g','r','a','v','e', 0,\n    'o','t','i','l','d','e', 0,\n    's','c','a','r','o','n', 0,\n    'u','a','c','u','t','e', 0,\n    'u','c','i','r','c','u','m','f','l','e','x', 0,\n    'u','d','i','e','r','e','s','i','s', 0,\n    'u','g','r','a','v','e', 0,\n    'y','a','c','u','t','e', 0,\n    'y','d','i','e','r','e','s','i','s', 0,\n    'z','c','a','r','o','n', 0,\n    'e','x','c','l','a','m','s','m','a','l','l', 0,\n    'H','u','n','g','a','r','u','m','l','a','u','t','s','m','a','l','l', 0,\n    'd','o','l','l','a','r','o','l','d','s','t','y','l','e', 0,\n    'd','o','l','l','a','r','s','u','p','e','r','i','o','r', 0,\n    'a','m','p','e','r','s','a','n','d','s','m','a','l','l', 0,\n    'A','c','u','t','e','s','m','a','l','l', 0,\n    'p','a','r','e','n','l','e','f','t','s','u','p','e','r','i','o','r', 0,\n    'p','a','r','e','n','r','i','g','h','t','s','u','p','e','r','i','o','r', 0,\n    't','w','o','d','o','t','e','n','l','e','a','d','e','r', 0,\n    'o','n','e','d','o','t','e','n','l','e','a','d','e','r', 0,\n    'z','e','r','o','o','l','d','s','t','y','l','e', 0,\n    'o','n','e','o','l','d','s','t','y','l','e', 0,\n    't','w','o','o','l','d','s','t','y','l','e', 0,\n    't','h','r','e','e','o','l','d','s','t','y','l','e', 0,\n    'f','o','u','r','o','l','d','s','t','y','l','e', 0,\n    'f','i','v','e','o','l','d','s','t','y','l','e', 0,\n    's','i','x','o','l','d','s','t','y','l','e', 0,\n    's','e','v','e','n','o','l','d','s','t','y','l','e', 0,\n    'e','i','g','h','t','o','l','d','s','t','y','l','e', 0,\n    'n','i','n','e','o','l','d','s','t','y','l','e', 0,\n    'c','o','m','m','a','s','u','p','e','r','i','o','r', 0,\n    't','h','r','e','e','q','u','a','r','t','e','r','s','e','m','d','a','s','h', 0,\n    'p','e','r','i','o','d','s','u','p','e','r','i','o','r', 0,\n    'q','u','e','s','t','i','o','n','s','m','a','l','l', 0,\n    'a','s','u','p','e','r','i','o','r', 0,\n    'b','s','u','p','e','r','i','o','r', 0,\n    'c','e','n','t','s','u','p','e','r','i','o','r', 0,\n    'd','s','u','p','e','r','i','o','r', 0,\n    'e','s','u','p','e','r','i','o','r', 0,\n    'i','s','u','p','e','r','i','o','r', 0,\n    'l','s','u','p','e','r','i','o','r', 0,\n    'm','s','u','p','e','r','i','o','r', 0,\n    'n','s','u','p','e','r','i','o','r', 0,\n    'o','s','u','p','e','r','i','o','r', 0,\n    'r','s','u','p','e','r','i','o','r', 0,\n    's','s','u','p','e','r','i','o','r', 0,\n    't','s','u','p','e','r','i','o','r', 0,\n    'f','f', 0,\n    'f','f','i', 0,\n    'f','f','l', 0,\n    'p','a','r','e','n','l','e','f','t','i','n','f','e','r','i','o','r', 0,\n    'p','a','r','e','n','r','i','g','h','t','i','n','f','e','r','i','o','r', 0,\n    'C','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,\n    'h','y','p','h','e','n','s','u','p','e','r','i','o','r', 0,\n    'G','r','a','v','e','s','m','a','l','l', 0,\n    'A','s','m','a','l','l', 0,\n    'B','s','m','a','l','l', 0,\n    'C','s','m','a','l','l', 0,\n    'D','s','m','a','l','l', 0,\n    'E','s','m','a','l','l', 0,\n    'F','s','m','a','l','l', 0,\n    'G','s','m','a','l','l', 0,\n    'H','s','m','a','l','l', 0,\n    'I','s','m','a','l','l', 0,\n    'J','s','m','a','l','l', 0,\n    'K','s','m','a','l','l', 0,\n    'L','s','m','a','l','l', 0,\n    'M','s','m','a','l','l', 0,\n    'N','s','m','a','l','l', 0,\n    'O','s','m','a','l','l', 0,\n    'P','s','m','a','l','l', 0,\n    'Q','s','m','a','l','l', 0,\n    'R','s','m','a','l','l', 0,\n    'S','s','m','a','l','l', 0,\n    'T','s','m','a','l','l', 0,\n    'U','s','m','a','l','l', 0,\n    'V','s','m','a','l','l', 0,\n    'W','s','m','a','l','l', 0,\n    'X','s','m','a','l','l', 0,\n    'Y','s','m','a','l','l', 0,\n    'Z','s','m','a','l','l', 0,\n    'c','o','l','o','n','m','o','n','e','t','a','r','y', 0,\n    'o','n','e','f','i','t','t','e','d', 0,\n    'r','u','p','i','a','h', 0,\n    'T','i','l','d','e','s','m','a','l','l', 0,\n    'e','x','c','l','a','m','d','o','w','n','s','m','a','l','l', 0,\n    'c','e','n','t','o','l','d','s','t','y','l','e', 0,\n    'L','s','l','a','s','h','s','m','a','l','l', 0,\n    'S','c','a','r','o','n','s','m','a','l','l', 0,\n    'Z','c','a','r','o','n','s','m','a','l','l', 0,\n    'D','i','e','r','e','s','i','s','s','m','a','l','l', 0,\n    'B','r','e','v','e','s','m','a','l','l', 0,\n    'C','a','r','o','n','s','m','a','l','l', 0,\n    'D','o','t','a','c','c','e','n','t','s','m','a','l','l', 0,\n    'M','a','c','r','o','n','s','m','a','l','l', 0,\n    'f','i','g','u','r','e','d','a','s','h', 0,\n    'h','y','p','h','e','n','i','n','f','e','r','i','o','r', 0,\n    'O','g','o','n','e','k','s','m','a','l','l', 0,\n    'R','i','n','g','s','m','a','l','l', 0,\n    'C','e','d','i','l','l','a','s','m','a','l','l', 0,\n    'q','u','e','s','t','i','o','n','d','o','w','n','s','m','a','l','l', 0,\n    'o','n','e','e','i','g','h','t','h', 0,\n    't','h','r','e','e','e','i','g','h','t','h','s', 0,\n    'f','i','v','e','e','i','g','h','t','h','s', 0,\n    's','e','v','e','n','e','i','g','h','t','h','s', 0,\n    'o','n','e','t','h','i','r','d', 0,\n    't','w','o','t','h','i','r','d','s', 0,\n    'z','e','r','o','s','u','p','e','r','i','o','r', 0,\n    'f','o','u','r','s','u','p','e','r','i','o','r', 0,\n    'f','i','v','e','s','u','p','e','r','i','o','r', 0,\n    's','i','x','s','u','p','e','r','i','o','r', 0,\n    's','e','v','e','n','s','u','p','e','r','i','o','r', 0,\n    'e','i','g','h','t','s','u','p','e','r','i','o','r', 0,\n    'n','i','n','e','s','u','p','e','r','i','o','r', 0,\n    'z','e','r','o','i','n','f','e','r','i','o','r', 0,\n    'o','n','e','i','n','f','e','r','i','o','r', 0,\n    't','w','o','i','n','f','e','r','i','o','r', 0,\n    't','h','r','e','e','i','n','f','e','r','i','o','r', 0,\n    'f','o','u','r','i','n','f','e','r','i','o','r', 0,\n    'f','i','v','e','i','n','f','e','r','i','o','r', 0,\n    's','i','x','i','n','f','e','r','i','o','r', 0,\n    's','e','v','e','n','i','n','f','e','r','i','o','r', 0,\n    'e','i','g','h','t','i','n','f','e','r','i','o','r', 0,\n    'n','i','n','e','i','n','f','e','r','i','o','r', 0,\n    'c','e','n','t','i','n','f','e','r','i','o','r', 0,\n    'd','o','l','l','a','r','i','n','f','e','r','i','o','r', 0,\n    'p','e','r','i','o','d','i','n','f','e','r','i','o','r', 0,\n    'c','o','m','m','a','i','n','f','e','r','i','o','r', 0,\n    'A','g','r','a','v','e','s','m','a','l','l', 0,\n    'A','a','c','u','t','e','s','m','a','l','l', 0,\n    'A','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,\n    'A','t','i','l','d','e','s','m','a','l','l', 0,\n    'A','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,\n    'A','r','i','n','g','s','m','a','l','l', 0,\n    'A','E','s','m','a','l','l', 0,\n    'C','c','e','d','i','l','l','a','s','m','a','l','l', 0,\n    'E','g','r','a','v','e','s','m','a','l','l', 0,\n    'E','a','c','u','t','e','s','m','a','l','l', 0,\n    'E','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,\n    'E','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,\n    'I','g','r','a','v','e','s','m','a','l','l', 0,\n    'I','a','c','u','t','e','s','m','a','l','l', 0,\n    'I','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,\n    'I','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,\n    'E','t','h','s','m','a','l','l', 0,\n    'N','t','i','l','d','e','s','m','a','l','l', 0,\n    'O','g','r','a','v','e','s','m','a','l','l', 0,\n    'O','a','c','u','t','e','s','m','a','l','l', 0,\n    'O','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,\n    'O','t','i','l','d','e','s','m','a','l','l', 0,\n    'O','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,\n    'O','E','s','m','a','l','l', 0,\n    'O','s','l','a','s','h','s','m','a','l','l', 0,\n    'U','g','r','a','v','e','s','m','a','l','l', 0,\n    'U','a','c','u','t','e','s','m','a','l','l', 0,\n    'U','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,\n    'U','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,\n    'Y','a','c','u','t','e','s','m','a','l','l', 0,\n    'T','h','o','r','n','s','m','a','l','l', 0,\n    'Y','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,\n    '0','0','1','.','0','0','0', 0,\n    '0','0','1','.','0','0','1', 0,\n    '0','0','1','.','0','0','2', 0,\n    '0','0','1','.','0','0','3', 0,\n    'B','l','a','c','k', 0,\n    'B','o','l','d', 0,\n    'B','o','o','k', 0,\n    'L','i','g','h','t', 0,\n    'M','e','d','i','u','m', 0,\n    'R','e','g','u','l','a','r', 0,\n    'R','o','m','a','n', 0,\n    'S','e','m','i','b','o','l','d', 0,\n  };\n\n\n#define FT_NUM_MAC_NAMES  258\n\n  /* Values are offsets into the `ft_standard_glyph_names' table */\n#ifdef _FX_MANAGED_CODE_\n__declspec(process)\n#endif\n  static const short  ft_mac_names[FT_NUM_MAC_NAMES] =\n  {\n     253,   0,   6, 261, 267, 274, 283, 294, 301, 309, 758, 330, 340, 351,\n     360, 365, 371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430,\n     436, 441, 447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498,\n     500, 502, 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526,\n     528, 530, 532, 534, 536, 538, 540, 552, 562, 575, 587, 979, 608, 610,\n     612, 614, 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638,\n     640, 642, 644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685,\n    1375,1392,1405,1414,1486,1512,1562,1603,1632,1610,1622,1645,1639,1652,\n    1661,1690,1668,1680,1697,1726,1704,1716,1733,1740,1769,1747,1759,1776,\n    1790,1819,1797,1809, 839,1263, 707, 712, 741, 881, 871,1160,1302,1346,\n    1197, 985,1031,  23,1086,1108,  32,1219,  41,  51, 730,1194,  64,  76,\n      86,  94,  97,1089,1118, 106,1131,1150, 966, 696,1183, 112, 734, 120,\n     132, 783, 930, 945, 138,1385,1398,1529,1115,1157, 832,1079, 770, 916,\n     598, 319,1246, 155,1833,1586, 721, 749, 797, 811, 826, 829, 846, 856,\n     888, 903, 954,1363,1421,1356,1433,1443,1450,1457,1469,1479,1493,1500,\n     163,1522,1543,1550,1572,1134, 991,1002,1008,1015,1021,1040,1045,1053,\n    1066,1073,1101,1143,1536,1783,1596,1843,1253,1207,1319,1579,1826,1229,\n    1270,1313,1323,1171,1290,1332,1211,1235,1276, 169, 175, 182, 189, 200,\n     209, 218, 225, 232, 239, 246\n  };\n\n\n#define FT_NUM_SID_NAMES  391\n\n  /* Values are offsets into the `ft_standard_glyph_names' table */\n#ifdef _FX_MANAGED_CODE_\n__declspec(process)\n#endif\n  static const short  ft_sid_names[FT_NUM_SID_NAMES] =\n  {\n     253, 261, 267, 274, 283, 294, 301, 309, 319, 330, 340, 351, 360, 365,\n     371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430, 436, 441,\n     447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498, 500, 502,\n     504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526, 528, 530,\n     532, 534, 536, 538, 540, 552, 562, 575, 587, 598, 608, 610, 612, 614,\n     616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, 640, 642,\n     644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685, 696, 707,\n     712, 721, 730, 734, 741, 749, 758, 770, 783, 797, 811, 826, 829, 832,\n     839, 846, 856, 871, 881, 888, 903, 916, 930, 945, 954, 966, 979, 985,\n     991,1002,1008,1015,1021,1031,1040,1045,1053,1066,1073,1079,1086,1089,\n    1101,1108,1115,1118,1131,1134,1143,1150,1157,1160,1171,1183,1194,1197,\n    1207,1211,1219,1229,1235,1246,1253,1263,1270,1276,1290,1302,1313,1319,\n    1323,1332,1346,1356,1363,1375,1385,1392,1398,1405,1414,1421,1433,1443,\n    1450,1457,1469,1479,1486,1493,1500,1512,1522,1529,1536,1543,1550,1562,\n    1572,1579,1586,1596,1603,1610,1622,1632,1639,1645,1652,1661,1668,1680,\n    1690,1697,1704,1716,1726,1733,1740,1747,1759,1769,1776,1783,1790,1797,\n    1809,1819,1826,1833,1843,1850,1862,1880,1895,1910,1925,1936,1954,1973,\n    1988,2003,2016,2028,2040,2054,2067,2080,2092,2106,2120,2133,2147,2167,\n    2182,2196,2206,2216,2229,2239,2249,2259,2269,2279,2289,2299,2309,2319,\n    2329,2332,2336,2340,2358,2377,2393,2408,2419,2426,2433,2440,2447,2454,\n    2461,2468,2475,2482,2489,2496,2503,2510,2517,2524,2531,2538,2545,2552,\n    2559,2566,2573,2580,2587,2594,2601,2615,2625,2632,2643,2659,2672,2684,\n    2696,2708,2722,2733,2744,2759,2771,2782,2797,2809,2819,2832,2850,2860,\n    2873,2885,2898,2907,2917,2930,2943,2956,2968,2982,2996,3009,3022,3034,\n    3046,3060,3073,3086,3098,3112,3126,3139,3152,3167,3182,3196,3208,3220,\n    3237,3249,3264,3275,3283,3297,3309,3321,3338,3353,3365,3377,3394,3409,\n    3418,3430,3442,3454,3471,3483,3498,3506,3518,3530,3542,3559,3574,3586,\n    3597,3612,3620,3628,3636,3644,3650,3655,3660,3666,3673,3681,3687\n  };\n\n\n  /* the following are indices into the SID name table */\n#ifdef _FX_MANAGED_CODE_\n__declspec(process)\n#endif\n  static const unsigned short  t1_standard_encoding[256] =\n  {\n      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n      1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,\n     17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,\n     33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,\n     49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,\n     65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,\n     81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,  0,\n      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n      0, 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,\n      0,111,112,113,114,  0,115,116,117,118,119,120,121,122,  0,123,\n      0,124,125,126,127,128,129,130,131,  0,132,133,  0,134,135,136,\n    137,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n      0,138,  0,139,  0,  0,  0,  0,140,141,142,143,  0,  0,  0,  0,\n      0,144,  0,  0,  0,145,  0,  0,146,147,148,149,  0,  0,  0,  0\n  };\n\n\n  /* the following are indices into the SID name table */\n#ifdef _FX_MANAGED_CODE_\n__declspec(process)\n#endif\n  static const unsigned short  t1_expert_encoding[256] =\n  {\n      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n      1,229,230,  0,231,232,233,234,235,236,237,238, 13, 14, 15, 99,\n    239,240,241,242,243,244,245,246,247,248, 27, 28,249,250,251,252,\n      0,253,254,255,256,257,  0,  0,  0,258,  0,  0,259,260,261,262,\n      0,  0,263,264,265,  0,266,109,110,267,268,269,  0,270,271,272,\n    273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,\n    289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,  0,\n      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n      0,304,305,306,  0,  0,307,308,309,310,311,  0,312,  0,  0,313,\n      0,  0,314,315,  0,  0,316,317,318,  0,  0,  0,158,155,163,319,\n    320,321,322,323,324,325,  0,  0,326,150,164,169,327,328,329,330,\n    331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,\n    347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,\n    363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378\n  };\n\n\n  /*\n   *  This table is a compressed version of the Adobe Glyph List (AGL),\n   *  optimized for efficient searching.  It has been generated by the\n   *  `glnames.py' python script located in the `src/tools' directory.\n   *\n   *  The lookup function to get the Unicode value for a given string\n   *  is defined below the table.\n   */\n\n#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST\n#ifdef _FX_MANAGED_CODE_\n__declspec(process)\n#endif\n  static const unsigned char  ft_adobe_glyph_list[55997L] =\n  {\n      0, 52,  0,106,  2,167,  3, 63,  4,220,  6,125,  9,143, 10, 23,\n     11,137, 12,199, 14,246, 15, 87, 16,233, 17,219, 18,104, 19, 88,\n     22,110, 23, 32, 23, 71, 24, 77, 27,156, 29, 73, 31,247, 32,107,\n     32,222, 33, 55, 34,154, 35,218, 58, 10, 64,122, 72,188, 80,109,\n     88,104, 93, 61, 98,168,106, 91,114,111,115,237,122,180,127,255,\n    135,164,143,132,149,213,158,108,161,115,168,175,183,147,197,199,\n    202, 25,204,166,208,209,209, 81,215, 26, 65,143,  0, 65,  0,140,\n      0,175,  0,193,  1, 15,  1,147,  1,233,  1,251,  2,  7,  2, 40,\n      2, 57,  2, 82,  2, 91,  2,128,  2,136,  2,154, 69,131,  0,198,\n      0,150,  0,158,  0,167,225,227,245,244,101,128,  1,252,237,225,\n    227,242,239,110,128,  1,226,243,237,225,236,108,128,247,230,225,\n    227,245,244,101,129,  0,193,  0,185,243,237,225,236,108,128,247,\n    225,226,242,229,246,101,134,  1,  2,  0,213,  0,221,  0,232,  0,\n    243,  0,251,  1,  7,225,227,245,244,101,128, 30,174,227,249,242,\n    233,236,236,233, 99,128,  4,208,228,239,244,226,229,236,239,119,\n    128, 30,182,231,242,225,246,101,128, 30,176,232,239,239,235,225,\n    226,239,246,101,128, 30,178,244,233,236,228,101,128, 30,180, 99,\n      4,  1, 25,  1, 32,  1,121,  1,137,225,242,239,110,128,  1,205,\n    233,242, 99,  2,  1, 40,  1, 45,236,101,128, 36,182,245,237,230,\n    236,229,120,134,  0,194,  1, 66,  1, 74,  1, 85,  1, 93,  1,105,\n      1,113,225,227,245,244,101,128, 30,164,228,239,244,226,229,236,\n    239,119,128, 30,172,231,242,225,246,101,128, 30,166,232,239,239,\n    235,225,226,239,246,101,128, 30,168,243,237,225,236,108,128,247,\n    226,244,233,236,228,101,128, 30,170,245,244,101,129,246,201,  1,\n    129,243,237,225,236,108,128,247,180,249,242,233,236,236,233, 99,\n    128,  4, 16,100,  3,  1,155,  1,165,  1,209,226,236,231,242,225,\n    246,101,128,  2,  0,233,229,242,229,243,233,115,131,  0,196,  1,\n    181,  1,192,  1,201,227,249,242,233,236,236,233, 99,128,  4,210,\n    237,225,227,242,239,110,128,  1,222,243,237,225,236,108,128,247,\n    228,239,116,  2,  1,216,  1,224,226,229,236,239,119,128, 30,160,\n    237,225,227,242,239,110,128,  1,224,231,242,225,246,101,129,  0,\n    192,  1,243,243,237,225,236,108,128,247,224,232,239,239,235,225,\n    226,239,246,101,128, 30,162,105,  2,  2, 13,  2, 25,229,227,249,\n    242,233,236,236,233, 99,128,  4,212,238,246,229,242,244,229,228,\n    226,242,229,246,101,128,  2,  2,236,240,232, 97,129,  3,145,  2,\n     49,244,239,238,239,115,128,  3,134,109,  2,  2, 63,  2, 71,225,\n    227,242,239,110,128,  1,  0,239,238,239,243,240,225,227,101,128,\n    255, 33,239,231,239,238,229,107,128,  1,  4,242,233,238,103,131,\n      0,197,  2,104,  2,112,  2,120,225,227,245,244,101,128,  1,250,\n    226,229,236,239,119,128, 30,  0,243,237,225,236,108,128,247,229,\n    243,237,225,236,108,128,247, 97,244,233,236,228,101,129,  0,195,\n      2,146,243,237,225,236,108,128,247,227,249,226,225,242,237,229,\n    238,233,225,110,128,  5, 49, 66,137,  0, 66,  2,189,  2,198,  2,\n    223,  3,  3,  3, 10,  3, 22,  3, 34,  3, 46,  3, 54,227,233,242,\n    227,236,101,128, 36,183,228,239,116,  2,  2,206,  2,215,225,227,\n    227,229,238,116,128, 30,  2,226,229,236,239,119,128, 30,  4,101,\n      3,  2,231,  2,242,  2,254,227,249,242,233,236,236,233, 99,128,\n      4, 17,238,225,242,237,229,238,233,225,110,128,  5, 50,244, 97,\n    128,  3,146,232,239,239,107,128,  1,129,236,233,238,229,226,229,\n    236,239,119,128, 30,  6,237,239,238,239,243,240,225,227,101,128,\n    255, 34,242,229,246,229,243,237,225,236,108,128,246,244,243,237,\n    225,236,108,128,247, 98,244,239,240,226,225,114,128,  1,130, 67,\n    137,  0, 67,  3, 85,  3,127,  3,193,  3,210,  3,224,  4,171,  4,\n    188,  4,200,  4,212, 97,  3,  3, 93,  3,104,  3,111,225,242,237,\n    229,238,233,225,110,128,  5, 62,227,245,244,101,128,  1,  6,242,\n    239,110,129,246,202,  3,119,243,237,225,236,108,128,246,245, 99,\n      3,  3,135,  3,142,  3,171,225,242,239,110,128,  1, 12,229,228,\n    233,236,236, 97,130,  0,199,  3,155,  3,163,225,227,245,244,101,\n    128, 30,  8,243,237,225,236,108,128,247,231,233,242, 99,  2,  3,\n    179,  3,184,236,101,128, 36,184,245,237,230,236,229,120,128,  1,\n      8,228,239,116,129,  1, 10,  3,201,225,227,227,229,238,116,128,\n      1, 10,229,228,233,236,236,225,243,237,225,236,108,128,247,184,\n    104,  4,  3,234,  3,246,  4,161,  4,165,225,225,242,237,229,238,\n    233,225,110,128,  5, 73,101,  6,  4,  4,  4, 24,  4, 35,  4,103,\n      4,115,  4,136,225,226,235,232,225,243,233,225,238,227,249,242,\n    233,236,236,233, 99,128,  4,188,227,249,242,233,236,236,233, 99,\n    128,  4, 39,100,  2,  4, 41,  4, 85,229,243,227,229,238,228,229,\n    114,  2,  4, 54,  4, 74,225,226,235,232,225,243,233,225,238,227,\n    249,242,233,236,236,233, 99,128,  4,190,227,249,242,233,236,236,\n    233, 99,128,  4,182,233,229,242,229,243,233,243,227,249,242,233,\n    236,236,233, 99,128,  4,244,232,225,242,237,229,238,233,225,110,\n    128,  5, 67,235,232,225,235,225,243,243,233,225,238,227,249,242,\n    233,236,236,233, 99,128,  4,203,246,229,242,244,233,227,225,236,\n    243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128,  4,\n    184,105,128,  3,167,239,239,107,128,  1,135,233,242,227,245,237,\n    230,236,229,248,243,237,225,236,108,128,246,246,237,239,238,239,\n    243,240,225,227,101,128,255, 35,239,225,242,237,229,238,233,225,\n    110,128,  5, 81,243,237,225,236,108,128,247, 99, 68,142,  0, 68,\n      4,252,  5, 10,  5, 36,  5, 96,  5,121,  5,166,  5,173,  5,231,\n      5,244,  6,  0,  6, 12,  6, 28,  6, 48,  6, 57, 90,129,  1,241,\n      5,  2,227,225,242,239,110,128,  1,196, 97,  2,  5, 16,  5, 27,\n    225,242,237,229,238,233,225,110,128,  5, 52,230,242,233,227,225,\n    110,128,  1,137, 99,  4,  5, 46,  5, 53,  5, 62,  5, 89,225,242,\n    239,110,128,  1, 14,229,228,233,236,236, 97,128, 30, 16,233,242,\n     99,  2,  5, 70,  5, 75,236,101,128, 36,185,245,237,230,236,229,\n    248,226,229,236,239,119,128, 30, 18,242,239,225,116,128,  1, 16,\n    228,239,116,  2,  5,104,  5,113,225,227,227,229,238,116,128, 30,\n     10,226,229,236,239,119,128, 30, 12,101,  3,  5,129,  5,140,  5,\n    150,227,249,242,233,236,236,233, 99,128,  4, 20,233,227,239,240,\n    244,233, 99,128,  3,238,236,244, 97,129, 34,  6,  5,158,231,242,\n    229,229,107,128,  3,148,232,239,239,107,128,  1,138,105,  2,  5,\n    179,  5,218,229,242,229,243,233,115,131,246,203,  5,194,  5,202,\n      5,210,193,227,245,244,101,128,246,204,199,242,225,246,101,128,\n    246,205,243,237,225,236,108,128,247,168,231,225,237,237,225,231,\n    242,229,229,107,128,  3,220,234,229,227,249,242,233,236,236,233,\n     99,128,  4,  2,236,233,238,229,226,229,236,239,119,128, 30, 14,\n    237,239,238,239,243,240,225,227,101,128,255, 36,239,244,225,227,\n    227,229,238,244,243,237,225,236,108,128,246,247,115,  2,  6, 34,\n      6, 41,236,225,243,104,128,  1, 16,237,225,236,108,128,247,100,\n    244,239,240,226,225,114,128,  1,139,122,131,  1,242,  6, 67,  6,\n     75,  6,112,227,225,242,239,110,128,  1,197,101,  2,  6, 81,  6,\n    101,225,226,235,232,225,243,233,225,238,227,249,242,233,236,236,\n    233, 99,128,  4,224,227,249,242,233,236,236,233, 99,128,  4,  5,\n    232,229,227,249,242,233,236,236,233, 99,128,  4, 15, 69,146,  0,\n     69,  6,165,  6,183,  6,191,  7, 89,  7,153,  7,165,  7,183,  7,\n    211,  8,  7,  8, 36,  8, 94,  8,169,  8,189,  8,208,  8,248,  9,\n     44,  9,109,  9,115,225,227,245,244,101,129,  0,201,  6,175,243,\n    237,225,236,108,128,247,233,226,242,229,246,101,128,  1, 20, 99,\n      5,  6,203,  6,210,  6,224,  6,236,  7, 79,225,242,239,110,128,\n      1, 26,229,228,233,236,236,225,226,242,229,246,101,128, 30, 28,\n    232,225,242,237,229,238,233,225,110,128,  5, 53,233,242, 99,  2,\n      6,244,  6,249,236,101,128, 36,186,245,237,230,236,229,120,135,\n      0,202,  7, 16,  7, 24,  7, 32,  7, 43,  7, 51,  7, 63,  7, 71,\n    225,227,245,244,101,128, 30,190,226,229,236,239,119,128, 30, 24,\n    228,239,244,226,229,236,239,119,128, 30,198,231,242,225,246,101,\n    128, 30,192,232,239,239,235,225,226,239,246,101,128, 30,194,243,\n    237,225,236,108,128,247,234,244,233,236,228,101,128, 30,196,249,\n    242,233,236,236,233, 99,128,  4,  4,100,  3,  7, 97,  7,107,  7,\n    127,226,236,231,242,225,246,101,128,  2,  4,233,229,242,229,243,\n    233,115,129,  0,203,  7,119,243,237,225,236,108,128,247,235,239,\n    116,130,  1, 22,  7,136,  7,145,225,227,227,229,238,116,128,  1,\n     22,226,229,236,239,119,128, 30,184,230,227,249,242,233,236,236,\n    233, 99,128,  4, 36,231,242,225,246,101,129,  0,200,  7,175,243,\n    237,225,236,108,128,247,232,104,  2,  7,189,  7,200,225,242,237,\n    229,238,233,225,110,128,  5, 55,239,239,235,225,226,239,246,101,\n    128, 30,186,105,  3,  7,219,  7,230,  7,245,231,232,244,242,239,\n    237,225,110,128, 33,103,238,246,229,242,244,229,228,226,242,229,\n    246,101,128,  2,  6,239,244,233,230,233,229,228,227,249,242,233,\n    236,236,233, 99,128,  4,100,108,  2,  8, 13,  8, 24,227,249,242,\n    233,236,236,233, 99,128,  4, 27,229,246,229,238,242,239,237,225,\n    110,128, 33,106,109,  3,  8, 44,  8, 72,  8, 83,225,227,242,239,\n    110,130,  1, 18,  8, 56,  8, 64,225,227,245,244,101,128, 30, 22,\n    231,242,225,246,101,128, 30, 20,227,249,242,233,236,236,233, 99,\n    128,  4, 28,239,238,239,243,240,225,227,101,128,255, 37,110,  4,\n      8,104,  8,115,  8,135,  8,154,227,249,242,233,236,236,233, 99,\n    128,  4, 29,228,229,243,227,229,238,228,229,242,227,249,242,233,\n    236,236,233, 99,128,  4,162,103,129,  1, 74,  8,141,232,229,227,\n    249,242,233,236,236,233, 99,128,  4,164,232,239,239,235,227,249,\n    242,233,236,236,233, 99,128,  4,199,111,  2,  8,175,  8,183,231,\n    239,238,229,107,128,  1, 24,240,229,110,128,  1,144,240,243,233,\n    236,239,110,129,  3,149,  8,200,244,239,238,239,115,128,  3,136,\n    114,  2,  8,214,  8,225,227,249,242,233,236,236,233, 99,128,  4,\n     32,229,246,229,242,243,229,100,129,  1,142,  8,237,227,249,242,\n    233,236,236,233, 99,128,  4, 45,115,  4,  9,  2,  9, 13,  9, 33,\n      9, 37,227,249,242,233,236,236,233, 99,128,  4, 33,228,229,243,\n    227,229,238,228,229,242,227,249,242,233,236,236,233, 99,128,  4,\n    170,104,128,  1,169,237,225,236,108,128,247,101,116,  3,  9, 52,\n      9, 78,  9, 92, 97,130,  3,151,  9, 60,  9, 70,242,237,229,238,\n    233,225,110,128,  5, 56,244,239,238,239,115,128,  3,137,104,129,\n      0,208,  9, 84,243,237,225,236,108,128,247,240,233,236,228,101,\n    129, 30,188,  9,101,226,229,236,239,119,128, 30, 26,245,242,111,\n    128, 32,172,250,104,130,  1,183,  9,124,  9,132,227,225,242,239,\n    110,128,  1,238,242,229,246,229,242,243,229,100,128,  1,184, 70,\n    136,  0, 70,  9,163,  9,172,  9,184,  9,212,  9,219,  9,248, 10,\n      4, 10, 15,227,233,242,227,236,101,128, 36,187,228,239,244,225,\n    227,227,229,238,116,128, 30, 30,101,  2,  9,190,  9,202,232,225,\n    242,237,229,238,233,225,110,128,  5, 86,233,227,239,240,244,233,\n     99,128,  3,228,232,239,239,107,128,  1,145,105,  2,  9,225,  9,\n    238,244,225,227,249,242,233,236,236,233, 99,128,  4,114,246,229,\n    242,239,237,225,110,128, 33,100,237,239,238,239,243,240,225,227,\n    101,128,255, 38,239,245,242,242,239,237,225,110,128, 33, 99,243,\n    237,225,236,108,128,247,102, 71,140,  0, 71, 10, 51, 10, 61, 10,\n    107, 10,115, 10,176, 10,193, 10,205, 11, 39, 11, 52, 11, 65, 11,\n     90, 11,107,194,243,241,245,225,242,101,128, 51,135, 97,  3, 10,\n     69, 10, 76, 10, 94,227,245,244,101,128,  1,244,237,237, 97,129,\n      3,147, 10, 84,225,230,242,233,227,225,110,128,  1,148,238,231,\n    233,225,227,239,240,244,233, 99,128,  3,234,226,242,229,246,101,\n    128,  1, 30, 99,  4, 10,125, 10,132, 10,141, 10,163,225,242,239,\n    110,128,  1,230,229,228,233,236,236, 97,128,  1, 34,233,242, 99,\n      2, 10,149, 10,154,236,101,128, 36,188,245,237,230,236,229,120,\n    128,  1, 28,239,237,237,225,225,227,227,229,238,116,128,  1, 34,\n    228,239,116,129,  1, 32, 10,184,225,227,227,229,238,116,128,  1,\n     32,229,227,249,242,233,236,236,233, 99,128,  4, 19,104,  3, 10,\n    213, 10,226, 11, 33,225,228,225,242,237,229,238,233,225,110,128,\n      5, 66,101,  3, 10,234, 10,255, 11, 16,237,233,228,228,236,229,\n    232,239,239,235,227,249,242,233,236,236,233, 99,128,  4,148,243,\n    244,242,239,235,229,227,249,242,233,236,236,233, 99,128,  4,146,\n    245,240,244,245,242,238,227,249,242,233,236,236,233, 99,128,  4,\n    144,239,239,107,128,  1,147,233,237,225,242,237,229,238,233,225,\n    110,128,  5, 51,234,229,227,249,242,233,236,236,233, 99,128,  4,\n      3,109,  2, 11, 71, 11, 79,225,227,242,239,110,128, 30, 32,239,\n    238,239,243,240,225,227,101,128,255, 39,242,225,246,101,129,246,\n    206, 11, 99,243,237,225,236,108,128,247, 96,115,  2, 11,113, 11,\n    129,237,225,236,108,129,247,103, 11,122,232,239,239,107,128,  2,\n    155,244,242,239,235,101,128,  1,228, 72,140,  0, 72, 11,165, 11,\n    190, 11,198, 11,208, 12, 17, 12, 40, 12, 77, 12,117, 12,129, 12,\n    157, 12,165, 12,189,177,184, 53,  3, 11,175, 11,180, 11,185,179,\n     51,128, 37,207,180, 51,128, 37,170,181, 49,128, 37,171,178,178,\n    176,183, 51,128, 37,161,208,243,241,245,225,242,101,128, 51,203,\n     97,  3, 11,216, 11,236, 12,  0,225,226,235,232,225,243,233,225,\n    238,227,249,242,233,236,236,233, 99,128,  4,168,228,229,243,227,\n    229,238,228,229,242,227,249,242,233,236,236,233, 99,128,  4,178,\n    242,228,243,233,231,238,227,249,242,233,236,236,233, 99,128,  4,\n     42, 98,  2, 12, 23, 12, 28,225,114,128,  1, 38,242,229,246,229,\n    226,229,236,239,119,128, 30, 42, 99,  2, 12, 46, 12, 55,229,228,\n    233,236,236, 97,128, 30, 40,233,242, 99,  2, 12, 63, 12, 68,236,\n    101,128, 36,189,245,237,230,236,229,120,128,  1, 36,100,  2, 12,\n     83, 12, 93,233,229,242,229,243,233,115,128, 30, 38,239,116,  2,\n     12,100, 12,109,225,227,227,229,238,116,128, 30, 34,226,229,236,\n    239,119,128, 30, 36,237,239,238,239,243,240,225,227,101,128,255,\n     40,111,  2, 12,135, 12,146,225,242,237,229,238,233,225,110,128,\n      5, 64,242,233,227,239,240,244,233, 99,128,  3,232,243,237,225,\n    236,108,128,247,104,245,238,231,225,242,245,237,236,225,245,116,\n    129,246,207, 12,181,243,237,225,236,108,128,246,248,250,243,241,\n    245,225,242,101,128, 51,144, 73,146,  0, 73, 12,239, 12,251, 12,\n    255, 13, 11, 13, 29, 13, 37, 13, 94, 13,181, 13,214, 13,224, 13,\n    242, 13,254, 14, 48, 14, 86, 14, 99, 14,166, 14,187, 14,205,193,\n    227,249,242,233,236,236,233, 99,128,  4, 47, 74,128,  1, 50,213,\n    227,249,242,233,236,236,233, 99,128,  4, 46,225,227,245,244,101,\n    129,  0,205, 13, 21,243,237,225,236,108,128,247,237,226,242,229,\n    246,101,128,  1, 44, 99,  3, 13, 45, 13, 52, 13, 84,225,242,239,\n    110,128,  1,207,233,242, 99,  2, 13, 60, 13, 65,236,101,128, 36,\n    190,245,237,230,236,229,120,129,  0,206, 13, 76,243,237,225,236,\n    108,128,247,238,249,242,233,236,236,233, 99,128,  4,  6,100,  3,\n     13,102, 13,112, 13,155,226,236,231,242,225,246,101,128,  2,  8,\n    233,229,242,229,243,233,115,131,  0,207, 13,128, 13,136, 13,147,\n    225,227,245,244,101,128, 30, 46,227,249,242,233,236,236,233, 99,\n    128,  4,228,243,237,225,236,108,128,247,239,239,116,130,  1, 48,\n     13,164, 13,173,225,227,227,229,238,116,128,  1, 48,226,229,236,\n    239,119,128, 30,202,101,  2, 13,187, 13,203,226,242,229,246,229,\n    227,249,242,233,236,236,233, 99,128,  4,214,227,249,242,233,236,\n    236,233, 99,128,  4, 21,230,242,225,235,244,245,114,128, 33, 17,\n    231,242,225,246,101,129,  0,204, 13,234,243,237,225,236,108,128,\n    247,236,232,239,239,235,225,226,239,246,101,128, 30,200,105,  3,\n     14,  6, 14, 17, 14, 32,227,249,242,233,236,236,233, 99,128,  4,\n     24,238,246,229,242,244,229,228,226,242,229,246,101,128,  2, 10,\n    243,232,239,242,244,227,249,242,233,236,236,233, 99,128,  4, 25,\n    109,  2, 14, 54, 14, 75,225,227,242,239,110,129,  1, 42, 14, 64,\n    227,249,242,233,236,236,233, 99,128,  4,226,239,238,239,243,240,\n    225,227,101,128,255, 41,238,233,225,242,237,229,238,233,225,110,\n    128,  5, 59,111,  3, 14,107, 14,118, 14,126,227,249,242,233,236,\n    236,233, 99,128,  4,  1,231,239,238,229,107,128,  1, 46,244, 97,\n    131,  3,153, 14,137, 14,147, 14,158,225,230,242,233,227,225,110,\n    128,  1,150,228,233,229,242,229,243,233,115,128,  3,170,244,239,\n    238,239,115,128,  3,138,115,  2, 14,172, 14,179,237,225,236,108,\n    128,247,105,244,242,239,235,101,128,  1,151,244,233,236,228,101,\n    129,  1, 40, 14,197,226,229,236,239,119,128, 30, 44,250,232,233,\n    244,243, 97,  2, 14,216, 14,227,227,249,242,233,236,236,233, 99,\n    128,  4,116,228,226,236,231,242,225,246,229,227,249,242,233,236,\n    236,233, 99,128,  4,118, 74,134,  0, 74, 15,  6, 15, 18, 15, 41,\n     15, 53, 15, 67, 15, 79,225,225,242,237,229,238,233,225,110,128,\n      5, 65,227,233,242, 99,  2, 15, 27, 15, 32,236,101,128, 36,191,\n    245,237,230,236,229,120,128,  1, 52,229,227,249,242,233,236,236,\n    233, 99,128,  4,  8,232,229,232,225,242,237,229,238,233,225,110,\n    128,  5, 75,237,239,238,239,243,240,225,227,101,128,255, 42,243,\n    237,225,236,108,128,247,106, 75,140,  0, 75, 15,115, 15,125, 15,\n    135, 16, 18, 16, 65, 16, 76, 16,106, 16,143, 16,156, 16,168, 16,\n    180, 16,208,194,243,241,245,225,242,101,128, 51,133,203,243,241,\n    245,225,242,101,128, 51,205, 97,  7, 15,151, 15,169, 15,191, 15,\n    211, 15,226, 15,232, 15,249,226,225,243,232,235,233,242,227,249,\n    242,233,236,236,233, 99,128,  4,160, 99,  2, 15,175, 15,181,245,\n    244,101,128, 30, 48,249,242,233,236,236,233, 99,128,  4, 26,228,\n    229,243,227,229,238,228,229,242,227,249,242,233,236,236,233, 99,\n    128,  4,154,232,239,239,235,227,249,242,233,236,236,233, 99,128,\n      4,195,240,240, 97,128,  3,154,243,244,242,239,235,229,227,249,\n    242,233,236,236,233, 99,128,  4,158,246,229,242,244,233,227,225,\n    236,243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128,\n      4,156, 99,  4, 16, 28, 16, 35, 16, 44, 16, 52,225,242,239,110,\n    128,  1,232,229,228,233,236,236, 97,128,  1, 54,233,242,227,236,\n    101,128, 36,192,239,237,237,225,225,227,227,229,238,116,128,  1,\n     54,228,239,244,226,229,236,239,119,128, 30, 50,101,  2, 16, 82,\n     16, 94,232,225,242,237,229,238,233,225,110,128,  5, 84,238,225,\n    242,237,229,238,233,225,110,128,  5, 63,104,  3, 16,114, 16,126,\n     16,137,225,227,249,242,233,236,236,233, 99,128,  4, 37,229,233,\n    227,239,240,244,233, 99,128,  3,230,239,239,107,128,  1,152,234,\n    229,227,249,242,233,236,236,233, 99,128,  4, 12,236,233,238,229,\n    226,229,236,239,119,128, 30, 52,237,239,238,239,243,240,225,227,\n    101,128,255, 43,239,240,240, 97,  2, 16,189, 16,200,227,249,242,\n    233,236,236,233, 99,128,  4,128,231,242,229,229,107,128,  3,222,\n    115,  2, 16,214, 16,226,233,227,249,242,233,236,236,233, 99,128,\n      4,110,237,225,236,108,128,247,107, 76,138,  0, 76, 17,  1, 17,\n      5, 17,  9, 17, 29, 17, 95, 17,133, 17,147, 17,165, 17,177, 17,\n    189, 74,128,  1,199, 76,128,246,191, 97,  2, 17, 15, 17, 22,227,\n    245,244,101,128,  1, 57,237,226,228, 97,128,  3,155, 99,  4, 17,\n     39, 17, 46, 17, 55, 17, 82,225,242,239,110,128,  1, 61,229,228,\n    233,236,236, 97,128,  1, 59,233,242, 99,  2, 17, 63, 17, 68,236,\n    101,128, 36,193,245,237,230,236,229,248,226,229,236,239,119,128,\n     30, 60,239,237,237,225,225,227,227,229,238,116,128,  1, 59,228,\n    239,116,130,  1, 63, 17,105, 17,114,225,227,227,229,238,116,128,\n      1, 63,226,229,236,239,119,129, 30, 54, 17,124,237,225,227,242,\n    239,110,128, 30, 56,233,247,238,225,242,237,229,238,233,225,110,\n    128,  5, 60,106,129,  1,200, 17,153,229,227,249,242,233,236,236,\n    233, 99,128,  4,  9,236,233,238,229,226,229,236,239,119,128, 30,\n     58,237,239,238,239,243,240,225,227,101,128,255, 44,115,  2, 17,\n    195, 17,212,236,225,243,104,129,  1, 65, 17,204,243,237,225,236,\n    108,128,246,249,237,225,236,108,128,247,108, 77,137,  0, 77, 17,\n    241, 17,251, 18, 24, 18, 33, 18, 58, 18, 71, 18, 83, 18, 91, 18,\n    100,194,243,241,245,225,242,101,128, 51,134,225, 99,  2, 18,  2,\n     18, 18,242,239,110,129,246,208, 18, 10,243,237,225,236,108,128,\n    247,175,245,244,101,128, 30, 62,227,233,242,227,236,101,128, 36,\n    194,228,239,116,  2, 18, 41, 18, 50,225,227,227,229,238,116,128,\n     30, 64,226,229,236,239,119,128, 30, 66,229,238,225,242,237,229,\n    238,233,225,110,128,  5, 68,237,239,238,239,243,240,225,227,101,\n    128,255, 45,243,237,225,236,108,128,247,109,244,245,242,238,229,\n    100,128,  1,156,117,128,  3,156, 78,141,  0, 78, 18,134, 18,138,\n     18,146, 18,212, 18,237, 18,248, 19,  3, 19, 21, 19, 33, 19, 45,\n     19, 58, 19, 66, 19, 84, 74,128,  1,202,225,227,245,244,101,128,\n      1, 67, 99,  4, 18,156, 18,163, 18,172, 18,199,225,242,239,110,\n    128,  1, 71,229,228,233,236,236, 97,128,  1, 69,233,242, 99,  2,\n     18,180, 18,185,236,101,128, 36,195,245,237,230,236,229,248,226,\n    229,236,239,119,128, 30, 74,239,237,237,225,225,227,227,229,238,\n    116,128,  1, 69,228,239,116,  2, 18,220, 18,229,225,227,227,229,\n    238,116,128, 30, 68,226,229,236,239,119,128, 30, 70,232,239,239,\n    235,236,229,230,116,128,  1,157,233,238,229,242,239,237,225,110,\n    128, 33,104,106,129,  1,203, 19,  9,229,227,249,242,233,236,236,\n    233, 99,128,  4, 10,236,233,238,229,226,229,236,239,119,128, 30,\n     72,237,239,238,239,243,240,225,227,101,128,255, 46,239,247,225,\n    242,237,229,238,233,225,110,128,  5, 70,243,237,225,236,108,128,\n    247,110,244,233,236,228,101,129,  0,209, 19, 76,243,237,225,236,\n    108,128,247,241,117,128,  3,157, 79,141,  0, 79, 19,118, 19,132,\n     19,150, 19,203, 20, 78, 20,152, 20,187, 21, 48, 21, 69, 21,213,\n     21,223, 21,254, 22, 53, 69,129,  1, 82, 19,124,243,237,225,236,\n    108,128,246,250,225,227,245,244,101,129,  0,211, 19,142,243,237,\n    225,236,108,128,247,243, 98,  2, 19,156, 19,196,225,242,242,229,\n    100,  2, 19,166, 19,177,227,249,242,233,236,236,233, 99,128,  4,\n    232,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233,\n     99,128,  4,234,242,229,246,101,128,  1, 78, 99,  4, 19,213, 19,\n    220, 19,235, 20, 68,225,242,239,110,128,  1,209,229,238,244,229,\n    242,229,228,244,233,236,228,101,128,  1,159,233,242, 99,  2, 19,\n    243, 19,248,236,101,128, 36,196,245,237,230,236,229,120,134,  0,\n    212, 20, 13, 20, 21, 20, 32, 20, 40, 20, 52, 20, 60,225,227,245,\n    244,101,128, 30,208,228,239,244,226,229,236,239,119,128, 30,216,\n    231,242,225,246,101,128, 30,210,232,239,239,235,225,226,239,246,\n    101,128, 30,212,243,237,225,236,108,128,247,244,244,233,236,228,\n    101,128, 30,214,249,242,233,236,236,233, 99,128,  4, 30,100,  3,\n     20, 86, 20,109, 20,142,226,108,  2, 20, 93, 20,101,225,227,245,\n    244,101,128,  1, 80,231,242,225,246,101,128,  2, 12,233,229,242,\n    229,243,233,115,130,  0,214, 20,123, 20,134,227,249,242,233,236,\n    236,233, 99,128,  4,230,243,237,225,236,108,128,247,246,239,244,\n    226,229,236,239,119,128, 30,204,103,  2, 20,158, 20,170,239,238,\n    229,235,243,237,225,236,108,128,246,251,242,225,246,101,129,  0,\n    210, 20,179,243,237,225,236,108,128,247,242,104,  4, 20,197, 20,\n    208, 20,212, 21, 34,225,242,237,229,238,233,225,110,128,  5, 85,\n    109,128, 33, 38,111,  2, 20,218, 20,228,239,235,225,226,239,246,\n    101,128, 30,206,242,110,133,  1,160, 20,243, 20,251, 21,  6, 21,\n     14, 21, 26,225,227,245,244,101,128, 30,218,228,239,244,226,229,\n    236,239,119,128, 30,226,231,242,225,246,101,128, 30,220,232,239,\n    239,235,225,226,239,246,101,128, 30,222,244,233,236,228,101,128,\n     30,224,245,238,231,225,242,245,237,236,225,245,116,128,  1, 80,\n    105,129,  1,162, 21, 54,238,246,229,242,244,229,228,226,242,229,\n    246,101,128,  2, 14,109,  4, 21, 79, 21,107, 21,184, 21,202,225,\n    227,242,239,110,130,  1, 76, 21, 91, 21, 99,225,227,245,244,101,\n    128, 30, 82,231,242,225,246,101,128, 30, 80,229,231, 97,132, 33,\n     38, 21,121, 21,132, 21,140, 21,156,227,249,242,233,236,236,233,\n     99,128,  4, 96,231,242,229,229,107,128,  3,169,242,239,245,238,\n    228,227,249,242,233,236,236,233, 99,128,  4,122,116,  2, 21,162,\n     21,177,233,244,236,239,227,249,242,233,236,236,233, 99,128,  4,\n    124,239,238,239,115,128,  3,143,233,227,242,239,110,129,  3,159,\n     21,194,244,239,238,239,115,128,  3,140,239,238,239,243,240,225,\n    227,101,128,255, 47,238,229,242,239,237,225,110,128, 33, 96,111,\n      2, 21,229, 21,248,231,239,238,229,107,129,  1,234, 21,239,237,\n    225,227,242,239,110,128,  1,236,240,229,110,128,  1,134,115,  3,\n     22,  6, 22, 33, 22, 40,236,225,243,104,130,  0,216, 22, 17, 22,\n     25,225,227,245,244,101,128,  1,254,243,237,225,236,108,128,247,\n    248,237,225,236,108,128,247,111,244,242,239,235,229,225,227,245,\n    244,101,128,  1,254,116,  2, 22, 59, 22, 70,227,249,242,233,236,\n    236,233, 99,128,  4,126,233,236,228,101,131,  0,213, 22, 83, 22,\n     91, 22,102,225,227,245,244,101,128, 30, 76,228,233,229,242,229,\n    243,233,115,128, 30, 78,243,237,225,236,108,128,247,245, 80,136,\n      0, 80, 22,130, 22,138, 22,147, 22,159, 22,211, 22,227, 22,246,\n     23,  2,225,227,245,244,101,128, 30, 84,227,233,242,227,236,101,\n    128, 36,197,228,239,244,225,227,227,229,238,116,128, 30, 86,101,\n      3, 22,167, 22,178, 22,190,227,249,242,233,236,236,233, 99,128,\n      4, 31,232,225,242,237,229,238,233,225,110,128,  5, 74,237,233,\n    228,228,236,229,232,239,239,235,227,249,242,233,236,236,233, 99,\n    128,  4,166,104,  2, 22,217, 22,221,105,128,  3,166,239,239,107,\n    128,  1,164,105,129,  3,160, 22,233,247,242,225,242,237,229,238,\n    233,225,110,128,  5, 83,237,239,238,239,243,240,225,227,101,128,\n    255, 48,115,  2, 23,  8, 23, 25,105,129,  3,168, 23, 14,227,249,\n    242,233,236,236,233, 99,128,  4,112,237,225,236,108,128,247,112,\n     81,131,  0, 81, 23, 42, 23, 51, 23, 63,227,233,242,227,236,101,\n    128, 36,198,237,239,238,239,243,240,225,227,101,128,255, 49,243,\n    237,225,236,108,128,247,113, 82,138,  0, 82, 23, 95, 23,119, 23,\n    166, 23,217, 23,230, 23,240, 23,245, 24, 19, 24, 31, 24, 43, 97,\n      2, 23,101, 23,112,225,242,237,229,238,233,225,110,128,  5, 76,\n    227,245,244,101,128,  1, 84, 99,  4, 23,129, 23,136, 23,145, 23,\n    153,225,242,239,110,128,  1, 88,229,228,233,236,236, 97,128,  1,\n     86,233,242,227,236,101,128, 36,199,239,237,237,225,225,227,227,\n    229,238,116,128,  1, 86,100,  2, 23,172, 23,182,226,236,231,242,\n    225,246,101,128,  2, 16,239,116,  2, 23,189, 23,198,225,227,227,\n    229,238,116,128, 30, 88,226,229,236,239,119,129, 30, 90, 23,208,\n    237,225,227,242,239,110,128, 30, 92,229,232,225,242,237,229,238,\n    233,225,110,128,  5, 80,230,242,225,235,244,245,114,128, 33, 28,\n    232,111,128,  3,161,233,110,  2, 23,252, 24,  5,231,243,237,225,\n    236,108,128,246,252,246,229,242,244,229,228,226,242,229,246,101,\n    128,  2, 18,236,233,238,229,226,229,236,239,119,128, 30, 94,237,\n    239,238,239,243,240,225,227,101,128,255, 50,243,237,225,236,108,\n    129,247,114, 24, 53,233,238,246,229,242,244,229,100,129,  2,129,\n     24, 66,243,245,240,229,242,233,239,114,128,  2,182, 83,139,  0,\n     83, 24,103, 26, 17, 26, 55, 26,182, 26,221, 26,250, 27, 84, 27,\n    105, 27,117, 27,135, 27,143, 70,  6, 24,117, 24,209, 24,241, 25,\n     77, 25,119, 25,221, 48,  9, 24,137, 24,145, 24,153, 24,161, 24,\n    169, 24,177, 24,185, 24,193, 24,201,177,176,176,176, 48,128, 37,\n     12,178,176,176,176, 48,128, 37, 20,179,176,176,176, 48,128, 37,\n     16,180,176,176,176, 48,128, 37, 24,181,176,176,176, 48,128, 37,\n     60,182,176,176,176, 48,128, 37, 44,183,176,176,176, 48,128, 37,\n     52,184,176,176,176, 48,128, 37, 28,185,176,176,176, 48,128, 37,\n     36, 49,  3, 24,217, 24,225, 24,233,176,176,176,176, 48,128, 37,\n      0,177,176,176,176, 48,128, 37,  2,185,176,176,176, 48,128, 37,\n     97, 50,  9, 25,  5, 25, 13, 25, 21, 25, 29, 25, 37, 25, 45, 25,\n     53, 25, 61, 25, 69,176,176,176,176, 48,128, 37, 98,177,176,176,\n    176, 48,128, 37, 86,178,176,176,176, 48,128, 37, 85,179,176,176,\n    176, 48,128, 37, 99,180,176,176,176, 48,128, 37, 81,181,176,176,\n    176, 48,128, 37, 87,182,176,176,176, 48,128, 37, 93,183,176,176,\n    176, 48,128, 37, 92,184,176,176,176, 48,128, 37, 91, 51,  4, 25,\n     87, 25, 95, 25,103, 25,111,182,176,176,176, 48,128, 37, 94,183,\n    176,176,176, 48,128, 37, 95,184,176,176,176, 48,128, 37, 90,185,\n    176,176,176, 48,128, 37, 84, 52, 10, 25,141, 25,149, 25,157, 25,\n    165, 25,173, 25,181, 25,189, 25,197, 25,205, 25,213,176,176,176,\n    176, 48,128, 37,105,177,176,176,176, 48,128, 37,102,178,176,176,\n    176, 48,128, 37, 96,179,176,176,176, 48,128, 37, 80,180,176,176,\n    176, 48,128, 37,108,181,176,176,176, 48,128, 37,103,182,176,176,\n    176, 48,128, 37,104,183,176,176,176, 48,128, 37,100,184,176,176,\n    176, 48,128, 37,101,185,176,176,176, 48,128, 37, 89, 53,  5, 25,\n    233, 25,241, 25,249, 26,  1, 26,  9,176,176,176,176, 48,128, 37,\n     88,177,176,176,176, 48,128, 37, 82,178,176,176,176, 48,128, 37,\n     83,179,176,176,176, 48,128, 37,107,180,176,176,176, 48,128, 37,\n    106, 97,  2, 26, 23, 26, 44,227,245,244,101,129,  1, 90, 26, 32,\n    228,239,244,225,227,227,229,238,116,128, 30,100,237,240,233,231,\n    242,229,229,107,128,  3,224, 99,  5, 26, 67, 26, 98, 26,107, 26,\n    147, 26,169,225,242,239,110,130,  1, 96, 26, 78, 26, 90,228,239,\n    244,225,227,227,229,238,116,128, 30,102,243,237,225,236,108,128,\n    246,253,229,228,233,236,236, 97,128,  1, 94,232,247, 97,130,  1,\n    143, 26,117, 26,128,227,249,242,233,236,236,233, 99,128,  4,216,\n    228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99,\n    128,  4,218,233,242, 99,  2, 26,155, 26,160,236,101,128, 36,200,\n    245,237,230,236,229,120,128,  1, 92,239,237,237,225,225,227,227,\n    229,238,116,128,  2, 24,228,239,116,  2, 26,190, 26,199,225,227,\n    227,229,238,116,128, 30, 96,226,229,236,239,119,129, 30, 98, 26,\n    209,228,239,244,225,227,227,229,238,116,128, 30,104,101,  2, 26,\n    227, 26,239,232,225,242,237,229,238,233,225,110,128,  5, 77,246,\n    229,238,242,239,237,225,110,128, 33,102,104,  5, 27,  6, 27, 34,\n     27, 48, 27, 59, 27, 72, 97,  2, 27, 12, 27, 23,225,242,237,229,\n    238,233,225,110,128,  5, 71,227,249,242,233,236,236,233, 99,128,\n      4, 40,227,232,225,227,249,242,233,236,236,233, 99,128,  4, 41,\n    229,233,227,239,240,244,233, 99,128,  3,226,232,225,227,249,242,\n    233,236,236,233, 99,128,  4,186,233,237,225,227,239,240,244,233,\n     99,128,  3,236,105,  2, 27, 90, 27, 96,231,237, 97,128,  3,163,\n    248,242,239,237,225,110,128, 33,101,237,239,238,239,243,240,225,\n    227,101,128,255, 51,239,230,244,243,233,231,238,227,249,242,233,\n    236,236,233, 99,128,  4, 44,243,237,225,236,108,128,247,115,244,\n    233,231,237,225,231,242,229,229,107,128,  3,218, 84,141,  0, 84,\n     27,186, 27,191, 27,197, 28,  7, 28, 32, 28, 96, 28,147, 28,177,\n     28,189, 28,201, 28,246, 29,  6, 29, 46,225,117,128,  3,164,226,\n    225,114,128,  1,102, 99,  4, 27,207, 27,214, 27,223, 27,250,225,\n    242,239,110,128,  1,100,229,228,233,236,236, 97,128,  1, 98,233,\n    242, 99,  2, 27,231, 27,236,236,101,128, 36,201,245,237,230,236,\n    229,248,226,229,236,239,119,128, 30,112,239,237,237,225,225,227,\n    227,229,238,116,128,  1, 98,228,239,116,  2, 28, 15, 28, 24,225,\n    227,227,229,238,116,128, 30,106,226,229,236,239,119,128, 30,108,\n    101,  4, 28, 42, 28, 53, 28, 73, 28, 82,227,249,242,233,236,236,\n    233, 99,128,  4, 34,228,229,243,227,229,238,228,229,242,227,249,\n    242,233,236,236,233, 99,128,  4,172,238,242,239,237,225,110,128,\n     33,105,244,243,229,227,249,242,233,236,236,233, 99,128,  4,180,\n    104,  3, 28,104, 28,110, 28,136,229,244, 97,128,  3,152,111,  2,\n     28,116, 28,121,239,107,128,  1,172,242,110,129,  0,222, 28,128,\n    243,237,225,236,108,128,247,254,242,229,229,242,239,237,225,110,\n    128, 33, 98,105,  2, 28,153, 28,164,236,228,229,243,237,225,236,\n    108,128,246,254,247,238,225,242,237,229,238,233,225,110,128,  5,\n     79,236,233,238,229,226,229,236,239,119,128, 30,110,237,239,238,\n    239,243,240,225,227,101,128,255, 52,111,  2, 28,207, 28,218,225,\n    242,237,229,238,233,225,110,128,  5, 57,238,101,  3, 28,227, 28,\n    234, 28,240,230,233,246,101,128,  1,188,243,233,120,128,  1,132,\n    244,247,111,128,  1,167,242,229,244,242,239,230,236,229,248,232,\n    239,239,107,128,  1,174,115,  3, 29, 14, 29, 26, 29, 39,229,227,\n    249,242,233,236,236,233, 99,128,  4, 38,232,229,227,249,242,233,\n    236,236,233, 99,128,  4, 11,237,225,236,108,128,247,116,119,  2,\n     29, 52, 29, 64,229,236,246,229,242,239,237,225,110,128, 33,107,\n    239,242,239,237,225,110,128, 33, 97, 85,142,  0, 85, 29,105, 29,\n    123, 29,131, 29,198, 30, 69, 30, 87, 30,198, 30,214, 30,226, 31,\n     21, 31, 30, 31,142, 31,149, 31,219,225,227,245,244,101,129,  0,\n    218, 29,115,243,237,225,236,108,128,247,250,226,242,229,246,101,\n    128,  1,108, 99,  3, 29,139, 29,146, 29,188,225,242,239,110,128,\n      1,211,233,242, 99,  2, 29,154, 29,159,236,101,128, 36,202,245,\n    237,230,236,229,120,130,  0,219, 29,172, 29,180,226,229,236,239,\n    119,128, 30,118,243,237,225,236,108,128,247,251,249,242,233,236,\n    236,233, 99,128,  4, 35,100,  3, 29,206, 29,229, 30, 59,226,108,\n      2, 29,213, 29,221,225,227,245,244,101,128,  1,112,231,242,225,\n    246,101,128,  2, 20,233,229,242,229,243,233,115,134,  0,220, 29,\n    251, 30,  3, 30, 11, 30, 34, 30, 42, 30, 51,225,227,245,244,101,\n    128,  1,215,226,229,236,239,119,128, 30,114, 99,  2, 30, 17, 30,\n     24,225,242,239,110,128,  1,217,249,242,233,236,236,233, 99,128,\n      4,240,231,242,225,246,101,128,  1,219,237,225,227,242,239,110,\n    128,  1,213,243,237,225,236,108,128,247,252,239,244,226,229,236,\n    239,119,128, 30,228,231,242,225,246,101,129,  0,217, 30, 79,243,\n    237,225,236,108,128,247,249,104,  2, 30, 93, 30,171,111,  2, 30,\n     99, 30,109,239,235,225,226,239,246,101,128, 30,230,242,110,133,\n      1,175, 30,124, 30,132, 30,143, 30,151, 30,163,225,227,245,244,\n    101,128, 30,232,228,239,244,226,229,236,239,119,128, 30,240,231,\n    242,225,246,101,128, 30,234,232,239,239,235,225,226,239,246,101,\n    128, 30,236,244,233,236,228,101,128, 30,238,245,238,231,225,242,\n    245,237,236,225,245,116,129,  1,112, 30,187,227,249,242,233,236,\n    236,233, 99,128,  4,242,233,238,246,229,242,244,229,228,226,242,\n    229,246,101,128,  2, 22,235,227,249,242,233,236,236,233, 99,128,\n      4,120,109,  2, 30,232, 31, 10,225,227,242,239,110,130,  1,106,\n     30,244, 30,255,227,249,242,233,236,236,233, 99,128,  4,238,228,\n    233,229,242,229,243,233,115,128, 30,122,239,238,239,243,240,225,\n    227,101,128,255, 53,239,231,239,238,229,107,128,  1,114,240,243,\n    233,236,239,110,133,  3,165, 31, 49, 31, 53, 31, 90, 31,121, 31,\n    134, 49,128,  3,210, 97,  2, 31, 59, 31, 81,227,245,244,229,232,\n    239,239,235,243,249,237,226,239,236,231,242,229,229,107,128,  3,\n    211,230,242,233,227,225,110,128,  1,177,228,233,229,242,229,243,\n    233,115,129,  3,171, 31,103,232,239,239,235,243,249,237,226,239,\n    236,231,242,229,229,107,128,  3,212,232,239,239,235,243,249,237,\n    226,239,108,128,  3,210,244,239,238,239,115,128,  3,142,242,233,\n    238,103,128,  1,110,115,  3, 31,157, 31,172, 31,179,232,239,242,\n    244,227,249,242,233,236,236,233, 99,128,  4, 14,237,225,236,108,\n    128,247,117,244,242,225,233,231,232,116,  2, 31,191, 31,202,227,\n    249,242,233,236,236,233, 99,128,  4,174,243,244,242,239,235,229,\n    227,249,242,233,236,236,233, 99,128,  4,176,244,233,236,228,101,\n    130,  1,104, 31,231, 31,239,225,227,245,244,101,128, 30,120,226,\n    229,236,239,119,128, 30,116, 86,136,  0, 86, 32, 11, 32, 20, 32,\n     31, 32, 60, 32, 67, 32, 79, 32, 91, 32, 99,227,233,242,227,236,\n    101,128, 36,203,228,239,244,226,229,236,239,119,128, 30,126,101,\n      2, 32, 37, 32, 48,227,249,242,233,236,236,233, 99,128,  4, 18,\n    247,225,242,237,229,238,233,225,110,128,  5, 78,232,239,239,107,\n    128,  1,178,237,239,238,239,243,240,225,227,101,128,255, 54,239,\n    225,242,237,229,238,233,225,110,128,  5, 72,243,237,225,236,108,\n    128,247,118,244,233,236,228,101,128, 30,124, 87,134,  0, 87, 32,\n    123, 32,131, 32,154, 32,194, 32,202, 32,214,225,227,245,244,101,\n    128, 30,130,227,233,242, 99,  2, 32,140, 32,145,236,101,128, 36,\n    204,245,237,230,236,229,120,128,  1,116,100,  2, 32,160, 32,170,\n    233,229,242,229,243,233,115,128, 30,132,239,116,  2, 32,177, 32,\n    186,225,227,227,229,238,116,128, 30,134,226,229,236,239,119,128,\n     30,136,231,242,225,246,101,128, 30,128,237,239,238,239,243,240,\n    225,227,101,128,255, 55,243,237,225,236,108,128,247,119, 88,134,\n      0, 88, 32,238, 32,247, 33, 18, 33, 31, 33, 35, 33, 47,227,233,\n    242,227,236,101,128, 36,205,100,  2, 32,253, 33,  7,233,229,242,\n    229,243,233,115,128, 30,140,239,244,225,227,227,229,238,116,128,\n     30,138,229,232,225,242,237,229,238,233,225,110,128,  5, 61,105,\n    128,  3,158,237,239,238,239,243,240,225,227,101,128,255, 56,243,\n    237,225,236,108,128,247,120, 89,139,  0, 89, 33, 81, 33,116, 33,\n    139, 33,189, 33,228, 33,236, 33,253, 34, 40, 34, 52, 34, 60, 34,\n     68, 97,  2, 33, 87, 33,104,227,245,244,101,129,  0,221, 33, 96,\n    243,237,225,236,108,128,247,253,244,227,249,242,233,236,236,233,\n     99,128,  4, 98,227,233,242, 99,  2, 33,125, 33,130,236,101,128,\n     36,206,245,237,230,236,229,120,128,  1,118,100,  2, 33,145, 33,\n    165,233,229,242,229,243,233,115,129,  1,120, 33,157,243,237,225,\n    236,108,128,247,255,239,116,  2, 33,172, 33,181,225,227,227,229,\n    238,116,128, 30,142,226,229,236,239,119,128, 30,244,229,114,  2,\n     33,196, 33,208,233,227,249,242,233,236,236,233, 99,128,  4, 43,\n    245,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233,\n     99,128,  4,248,231,242,225,246,101,128, 30,242,232,239,239,107,\n    129,  1,179, 33,245,225,226,239,246,101,128, 30,246,105,  3, 34,\n      5, 34, 16, 34, 27,225,242,237,229,238,233,225,110,128,  5, 69,\n    227,249,242,233,236,236,233, 99,128,  4,  7,247,238,225,242,237,\n    229,238,233,225,110,128,  5, 82,237,239,238,239,243,240,225,227,\n    101,128,255, 57,243,237,225,236,108,128,247,121,244,233,236,228,\n    101,128, 30,248,245,115,  2, 34, 75, 34,113,226,233,103,  2, 34,\n     83, 34, 94,227,249,242,233,236,236,233, 99,128,  4,106,233,239,\n    244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128,  4,\n    108,236,233,244,244,236,101,  2, 34,124, 34,135,227,249,242,233,\n    236,236,233, 99,128,  4,102,233,239,244,233,230,233,229,228,227,\n    249,242,233,236,236,233, 99,128,  4,104, 90,136,  0, 90, 34,174,\n     34,198, 34,243, 35, 14, 35, 81, 35,173, 35,185, 35,197, 97,  2,\n     34,180, 34,191,225,242,237,229,238,233,225,110,128,  5, 54,227,\n    245,244,101,128,  1,121, 99,  2, 34,204, 34,221,225,242,239,110,\n    129,  1,125, 34,213,243,237,225,236,108,128,246,255,233,242, 99,\n      2, 34,229, 34,234,236,101,128, 36,207,245,237,230,236,229,120,\n    128, 30,144,228,239,116,130,  1,123, 34,253, 35,  6,225,227,227,\n    229,238,116,128,  1,123,226,229,236,239,119,128, 30,146,101,  3,\n     35, 22, 35, 33, 35, 76,227,249,242,233,236,236,233, 99,128,  4,\n     23,100,  2, 35, 39, 35, 58,229,243,227,229,238,228,229,242,227,\n    249,242,233,236,236,233, 99,128,  4,152,233,229,242,229,243,233,\n    243,227,249,242,233,236,236,233, 99,128,  4,222,244, 97,128,  3,\n    150,232,101,  4, 35, 92, 35,103, 35,119, 35,130,225,242,237,229,\n    238,233,225,110,128,  5, 58,226,242,229,246,229,227,249,242,233,\n    236,236,233, 99,128,  4,193,227,249,242,233,236,236,233, 99,128,\n      4, 22,100,  2, 35,136, 35,155,229,243,227,229,238,228,229,242,\n    227,249,242,233,236,236,233, 99,128,  4,150,233,229,242,229,243,\n    233,243,227,249,242,233,236,236,233, 99,128,  4,220,236,233,238,\n    229,226,229,236,239,119,128, 30,148,237,239,238,239,243,240,225,\n    227,101,128,255, 58,115,  2, 35,203, 35,210,237,225,236,108,128,\n    247,122,244,242,239,235,101,128,  1,181, 97,158,  0, 97, 36, 26,\n     38,154, 39,  4, 39, 68, 39,132, 39,196, 40,  4, 40, 68, 40,126,\n     40,190, 41, 70, 41,217, 42,137, 42,237, 43, 17, 49,192, 49,229,\n     50,  0, 50,225, 51,  7, 52, 96, 52,168, 53,123, 53,132, 54,  5,\n     56, 13, 57,  3, 57, 50, 57,201, 57,215, 49,138, 39,  1, 36, 50,\n     36,114, 36,154, 36,218, 37, 26, 37, 90, 37,154, 37,218, 38, 26,\n     38, 90, 48,138, 39, 33, 36, 74, 36, 78, 36, 82, 36, 86, 36, 90,\n     36, 94, 36, 98, 36,102, 36,106, 36,110, 48,128, 39, 94, 49,128,\n     39, 97, 50,128, 39, 98, 51,128, 39, 99, 52,128, 39,100, 53,128,\n     39, 16, 54,128, 39,101, 55,128, 39,102, 56,128, 39,103, 57,128,\n     38, 96, 49,134, 38, 27, 36,130, 36,134, 36,138, 36,142, 36,146,\n     36,150, 48,128, 38,101, 49,128, 38,102, 50,128, 38, 99, 55,128,\n     39,  9, 56,128, 39,  8, 57,128, 39,  7, 50,138, 38, 30, 36,178,\n     36,182, 36,186, 36,190, 36,194, 36,198, 36,202, 36,206, 36,210,\n     36,214, 48,128, 36, 96, 49,128, 36, 97, 50,128, 36, 98, 51,128,\n     36, 99, 52,128, 36,100, 53,128, 36,101, 54,128, 36,102, 55,128,\n     36,103, 56,128, 36,104, 57,128, 36,105, 51,138, 39, 12, 36,242,\n     36,246, 36,250, 36,254, 37,  2, 37,  6, 37, 10, 37, 14, 37, 18,\n     37, 22, 48,128, 39,118, 49,128, 39,119, 50,128, 39,120, 51,128,\n     39,121, 52,128, 39,122, 53,128, 39,123, 54,128, 39,124, 55,128,\n     39,125, 56,128, 39,126, 57,128, 39,127, 52,138, 39, 13, 37, 50,\n     37, 54, 37, 58, 37, 62, 37, 66, 37, 70, 37, 74, 37, 78, 37, 82,\n     37, 86, 48,128, 39,128, 49,128, 39,129, 50,128, 39,130, 51,128,\n     39,131, 52,128, 39,132, 53,128, 39,133, 54,128, 39,134, 55,128,\n     39,135, 56,128, 39,136, 57,128, 39,137, 53,138, 39, 14, 37,114,\n     37,118, 37,122, 37,126, 37,130, 37,134, 37,138, 37,142, 37,146,\n     37,150, 48,128, 39,138, 49,128, 39,139, 50,128, 39,140, 51,128,\n     39,141, 52,128, 39,142, 53,128, 39,143, 54,128, 39,144, 55,128,\n     39,145, 56,128, 39,146, 57,128, 39,147, 54,138, 39, 15, 37,178,\n     37,182, 37,186, 37,190, 37,194, 37,198, 37,202, 37,206, 37,210,\n     37,214, 48,128, 39,148, 49,128, 33,146, 50,128, 39,163, 51,128,\n     33,148, 52,128, 33,149, 53,128, 39,153, 54,128, 39,155, 55,128,\n     39,156, 56,128, 39,157, 57,128, 39,158, 55,138, 39, 17, 37,242,\n     37,246, 37,250, 37,254, 38,  2, 38,  6, 38, 10, 38, 14, 38, 18,\n     38, 22, 48,128, 39,159, 49,128, 39,160, 50,128, 39,161, 51,128,\n     39,162, 52,128, 39,164, 53,128, 39,165, 54,128, 39,166, 55,128,\n     39,167, 56,128, 39,168, 57,128, 39,169, 56,138, 39, 18, 38, 50,\n     38, 54, 38, 58, 38, 62, 38, 66, 38, 70, 38, 74, 38, 78, 38, 82,\n     38, 86, 48,128, 39,171, 49,128, 39,173, 50,128, 39,175, 51,128,\n     39,178, 52,128, 39,179, 53,128, 39,181, 54,128, 39,184, 55,128,\n     39,186, 56,128, 39,187, 57,128, 39,188, 57,138, 39, 19, 38,114,\n     38,118, 38,122, 38,126, 38,130, 38,134, 38,138, 38,142, 38,146,\n     38,150, 48,128, 39,189, 49,128, 39,190, 50,128, 39,154, 51,128,\n     39,170, 52,128, 39,182, 53,128, 39,185, 54,128, 39,152, 55,128,\n     39,180, 56,128, 39,183, 57,128, 39,172, 50,138, 39,  2, 38,178,\n     38,224, 38,228, 38,232, 38,236, 38,240, 38,244, 38,248, 38,252,\n     39,  0, 48,135, 39, 20, 38,196, 38,200, 38,204, 38,208, 38,212,\n     38,216, 38,220, 48,128, 39,174, 49,128, 39,177, 50,128, 39,  3,\n     51,128, 39, 80, 52,128, 39, 82, 53,128, 39,110, 54,128, 39,112,\n     49,128, 39, 21, 50,128, 39, 22, 51,128, 39, 23, 52,128, 39, 24,\n     53,128, 39, 25, 54,128, 39, 26, 55,128, 39, 27, 56,128, 39, 28,\n     57,128, 39, 34, 51,138, 39,  4, 39, 28, 39, 32, 39, 36, 39, 40,\n     39, 44, 39, 48, 39, 52, 39, 56, 39, 60, 39, 64, 48,128, 39, 35,\n     49,128, 39, 36, 50,128, 39, 37, 51,128, 39, 38, 52,128, 39, 39,\n     53,128, 38,  5, 54,128, 39, 41, 55,128, 39, 42, 56,128, 39, 43,\n     57,128, 39, 44, 52,138, 38, 14, 39, 92, 39, 96, 39,100, 39,104,\n     39,108, 39,112, 39,116, 39,120, 39,124, 39,128, 48,128, 39, 45,\n     49,128, 39, 46, 50,128, 39, 47, 51,128, 39, 48, 52,128, 39, 49,\n     53,128, 39, 50, 54,128, 39, 51, 55,128, 39, 52, 56,128, 39, 53,\n     57,128, 39, 54, 53,138, 39,  6, 39,156, 39,160, 39,164, 39,168,\n     39,172, 39,176, 39,180, 39,184, 39,188, 39,192, 48,128, 39, 55,\n     49,128, 39, 56, 50,128, 39, 57, 51,128, 39, 58, 52,128, 39, 59,\n     53,128, 39, 60, 54,128, 39, 61, 55,128, 39, 62, 56,128, 39, 63,\n     57,128, 39, 64, 54,138, 39, 29, 39,220, 39,224, 39,228, 39,232,\n     39,236, 39,240, 39,244, 39,248, 39,252, 40,  0, 48,128, 39, 65,\n     49,128, 39, 66, 50,128, 39, 67, 51,128, 39, 68, 52,128, 39, 69,\n     53,128, 39, 70, 54,128, 39, 71, 55,128, 39, 72, 56,128, 39, 73,\n     57,128, 39, 74, 55,138, 39, 30, 40, 28, 40, 32, 40, 36, 40, 40,\n     40, 44, 40, 48, 40, 52, 40, 56, 40, 60, 40, 64, 48,128, 39, 75,\n     49,128, 37,207, 50,128, 39, 77, 51,128, 37,160, 52,128, 39, 79,\n     53,128, 39, 81, 54,128, 37,178, 55,128, 37,188, 56,128, 37,198,\n     57,128, 39, 86, 56,137, 39, 31, 40, 90, 40, 94, 40, 98, 40,102,\n     40,106, 40,110, 40,114, 40,118, 40,122, 49,128, 37,215, 50,128,\n     39, 88, 51,128, 39, 89, 52,128, 39, 90, 53,128, 39,111, 54,128,\n     39,113, 55,128, 39,114, 56,128, 39,115, 57,128, 39,104, 57,138,\n     39, 32, 40,150, 40,154, 40,158, 40,162, 40,166, 40,170, 40,174,\n     40,178, 40,182, 40,186, 48,128, 39,105, 49,128, 39,108, 50,128,\n     39,109, 51,128, 39,106, 52,128, 39,107, 53,128, 39,116, 54,128,\n     39,117, 55,128, 39, 91, 56,128, 39, 92, 57,128, 39, 93, 97,  7,\n     40,206, 40,216, 40,223, 40,230, 40,255, 41, 15, 41, 26,226,229,\n    238,231,225,236,105,128,  9,134,227,245,244,101,128,  0,225,228,\n    229,246, 97,128,  9,  6,231,117,  2, 40,237, 40,246,234,225,242,\n    225,244,105,128, 10,134,242,237,245,235,232,105,128, 10,  6,237,\n    225,244,242,225,231,245,242,237,245,235,232,105,128, 10, 62,242,\n    245,243,241,245,225,242,101,128, 51,  3,246,239,247,229,236,243,\n    233,231,110,  3, 41, 42, 41, 52, 41, 59,226,229,238,231,225,236,\n    105,128,  9,190,228,229,246, 97,128,  9, 62,231,245,234,225,242,\n    225,244,105,128, 10,190, 98,  4, 41, 80, 41,121, 41,130, 41,140,\n    226,242,229,246,233,225,244,233,239,110,  2, 41, 95, 41,110,237,\n    225,242,235,225,242,237,229,238,233,225,110,128,  5, 95,243,233,\n    231,238,228,229,246, 97,128,  9,112,229,238,231,225,236,105,128,\n      9,133,239,240,239,237,239,230,111,128, 49, 26,242,229,246,101,\n    134,  1,  3, 41,159, 41,167, 41,178, 41,189, 41,197, 41,209,225,\n    227,245,244,101,128, 30,175,227,249,242,233,236,236,233, 99,128,\n      4,209,228,239,244,226,229,236,239,119,128, 30,183,231,242,225,\n    246,101,128, 30,177,232,239,239,235,225,226,239,246,101,128, 30,\n    179,244,233,236,228,101,128, 30,181, 99,  4, 41,227, 41,234, 42,\n     57, 42,127,225,242,239,110,128,  1,206,233,242, 99,  2, 41,242,\n     41,247,236,101,128, 36,208,245,237,230,236,229,120,133,  0,226,\n     42, 10, 42, 18, 42, 29, 42, 37, 42, 49,225,227,245,244,101,128,\n     30,165,228,239,244,226,229,236,239,119,128, 30,173,231,242,225,\n    246,101,128, 30,167,232,239,239,235,225,226,239,246,101,128, 30,\n    169,244,233,236,228,101,128, 30,171,245,244,101,133,  0,180, 42,\n     73, 42, 84, 42,101, 42,108, 42,117,226,229,236,239,247,227,237,\n     98,128,  3, 23, 99,  2, 42, 90, 42, 95,237, 98,128,  3,  1,239,\n    237, 98,128,  3,  1,228,229,246, 97,128,  9, 84,236,239,247,237,\n    239,100,128,  2,207,244,239,238,229,227,237, 98,128,  3, 65,249,\n    242,233,236,236,233, 99,128,  4, 48,100,  5, 42,149, 42,159, 42,\n    173, 42,179, 42,213,226,236,231,242,225,246,101,128,  2,  1,228,\n    225,235,231,245,242,237,245,235,232,105,128, 10,113,229,246, 97,\n    128,  9,  5,233,229,242,229,243,233,115,130,  0,228, 42,193, 42,\n    204,227,249,242,233,236,236,233, 99,128,  4,211,237,225,227,242,\n    239,110,128,  1,223,239,116,  2, 42,220, 42,228,226,229,236,239,\n    119,128, 30,161,237,225,227,242,239,110,128,  1,225,101,131,  0,\n    230, 42,247, 42,255, 43,  8,225,227,245,244,101,128,  1,253,235,\n    239,242,229,225,110,128, 49, 80,237,225,227,242,239,110,128,  1,\n    227,230,233,105,  6, 43, 33, 43, 53, 45,246, 45,252, 46, 11, 49,\n    111, 48,  2, 43, 39, 43, 46,176,178,176, 56,128, 32, 21,184,185,\n    180, 49,128, 32,164,177, 48,  3, 43, 62, 45, 86, 45,221, 48,  9,\n     43, 82, 43,102, 43,164, 43,226, 44, 32, 44, 94, 44,156, 44,218,\n     45, 24, 49,  3, 43, 90, 43, 94, 43, 98, 55,128,  4, 16, 56,128,\n      4, 17, 57,128,  4, 18, 50, 10, 43,124, 43,128, 43,132, 43,136,\n     43,140, 43,144, 43,148, 43,152, 43,156, 43,160, 48,128,  4, 19,\n     49,128,  4, 20, 50,128,  4, 21, 51,128,  4,  1, 52,128,  4, 22,\n     53,128,  4, 23, 54,128,  4, 24, 55,128,  4, 25, 56,128,  4, 26,\n     57,128,  4, 27, 51, 10, 43,186, 43,190, 43,194, 43,198, 43,202,\n     43,206, 43,210, 43,214, 43,218, 43,222, 48,128,  4, 28, 49,128,\n      4, 29, 50,128,  4, 30, 51,128,  4, 31, 52,128,  4, 32, 53,128,\n      4, 33, 54,128,  4, 34, 55,128,  4, 35, 56,128,  4, 36, 57,128,\n      4, 37, 52, 10, 43,248, 43,252, 44,  0, 44,  4, 44,  8, 44, 12,\n     44, 16, 44, 20, 44, 24, 44, 28, 48,128,  4, 38, 49,128,  4, 39,\n     50,128,  4, 40, 51,128,  4, 41, 52,128,  4, 42, 53,128,  4, 43,\n     54,128,  4, 44, 55,128,  4, 45, 56,128,  4, 46, 57,128,  4, 47,\n     53, 10, 44, 54, 44, 58, 44, 62, 44, 66, 44, 70, 44, 74, 44, 78,\n     44, 82, 44, 86, 44, 90, 48,128,  4,144, 49,128,  4,  2, 50,128,\n      4,  3, 51,128,  4,  4, 52,128,  4,  5, 53,128,  4,  6, 54,128,\n      4,  7, 55,128,  4,  8, 56,128,  4,  9, 57,128,  4, 10, 54, 10,\n     44,116, 44,120, 44,124, 44,128, 44,132, 44,136, 44,140, 44,144,\n     44,148, 44,152, 48,128,  4, 11, 49,128,  4, 12, 50,128,  4, 14,\n     51,128,246,196, 52,128,246,197, 53,128,  4, 48, 54,128,  4, 49,\n     55,128,  4, 50, 56,128,  4, 51, 57,128,  4, 52, 55, 10, 44,178,\n     44,182, 44,186, 44,190, 44,194, 44,198, 44,202, 44,206, 44,210,\n     44,214, 48,128,  4, 53, 49,128,  4, 81, 50,128,  4, 54, 51,128,\n      4, 55, 52,128,  4, 56, 53,128,  4, 57, 54,128,  4, 58, 55,128,\n      4, 59, 56,128,  4, 60, 57,128,  4, 61, 56, 10, 44,240, 44,244,\n     44,248, 44,252, 45,  0, 45,  4, 45,  8, 45, 12, 45, 16, 45, 20,\n     48,128,  4, 62, 49,128,  4, 63, 50,128,  4, 64, 51,128,  4, 65,\n     52,128,  4, 66, 53,128,  4, 67, 54,128,  4, 68, 55,128,  4, 69,\n     56,128,  4, 70, 57,128,  4, 71, 57, 10, 45, 46, 45, 50, 45, 54,\n     45, 58, 45, 62, 45, 66, 45, 70, 45, 74, 45, 78, 45, 82, 48,128,\n      4, 72, 49,128,  4, 73, 50,128,  4, 74, 51,128,  4, 75, 52,128,\n      4, 76, 53,128,  4, 77, 54,128,  4, 78, 55,128,  4, 79, 56,128,\n      4,145, 57,128,  4, 82, 49,  4, 45, 96, 45,158, 45,163, 45,189,\n     48, 10, 45,118, 45,122, 45,126, 45,130, 45,134, 45,138, 45,142,\n     45,146, 45,150, 45,154, 48,128,  4, 83, 49,128,  4, 84, 50,128,\n      4, 85, 51,128,  4, 86, 52,128,  4, 87, 53,128,  4, 88, 54,128,\n      4, 89, 55,128,  4, 90, 56,128,  4, 91, 57,128,  4, 92,177, 48,\n    128,  4, 94, 52,  4, 45,173, 45,177, 45,181, 45,185, 53,128,  4,\n     15, 54,128,  4, 98, 55,128,  4,114, 56,128,  4,116, 57,  5, 45,\n    201, 45,205, 45,209, 45,213, 45,217, 50,128,246,198, 51,128,  4,\n     95, 52,128,  4, 99, 53,128,  4,115, 54,128,  4,117, 56,  2, 45,\n    227, 45,241, 51,  2, 45,233, 45,237, 49,128,246,199, 50,128,246,\n    200,180, 54,128,  4,217,178,185, 57,128, 32, 14,179, 48,  2, 46,\n      3, 46,  7, 48,128, 32, 15, 49,128, 32, 13,181, 55,  7, 46, 28,\n     46, 98, 47,163, 47,240, 48,197, 49, 34, 49,105, 51,  2, 46, 34,\n     46, 48, 56,  2, 46, 40, 46, 44, 49,128,  6,106, 56,128,  6, 12,\n     57,  8, 46, 66, 46, 70, 46, 74, 46, 78, 46, 82, 46, 86, 46, 90,\n     46, 94, 50,128,  6, 96, 51,128,  6, 97, 52,128,  6, 98, 53,128,\n      6, 99, 54,128,  6,100, 55,128,  6,101, 56,128,  6,102, 57,128,\n      6,103, 52,  7, 46,114, 46,146, 46,208, 47, 14, 47, 46, 47,102,\n     47,158, 48,  5, 46,126, 46,130, 46,134, 46,138, 46,142, 48,128,\n      6,104, 49,128,  6,105, 51,128,  6, 27, 55,128,  6, 31, 57,128,\n      6, 33, 49, 10, 46,168, 46,172, 46,176, 46,180, 46,184, 46,188,\n     46,192, 46,196, 46,200, 46,204, 48,128,  6, 34, 49,128,  6, 35,\n     50,128,  6, 36, 51,128,  6, 37, 52,128,  6, 38, 53,128,  6, 39,\n     54,128,  6, 40, 55,128,  6, 41, 56,128,  6, 42, 57,128,  6, 43,\n     50, 10, 46,230, 46,234, 46,238, 46,242, 46,246, 46,250, 46,254,\n     47,  2, 47,  6, 47, 10, 48,128,  6, 44, 49,128,  6, 45, 50,128,\n      6, 46, 51,128,  6, 47, 52,128,  6, 48, 53,128,  6, 49, 54,128,\n      6, 50, 55,128,  6, 51, 56,128,  6, 52, 57,128,  6, 53, 51,  5,\n     47, 26, 47, 30, 47, 34, 47, 38, 47, 42, 48,128,  6, 54, 49,128,\n      6, 55, 50,128,  6, 56, 51,128,  6, 57, 52,128,  6, 58, 52,  9,\n     47, 66, 47, 70, 47, 74, 47, 78, 47, 82, 47, 86, 47, 90, 47, 94,\n     47, 98, 48,128,  6, 64, 49,128,  6, 65, 50,128,  6, 66, 51,128,\n      6, 67, 52,128,  6, 68, 53,128,  6, 69, 54,128,  6, 70, 56,128,\n      6, 72, 57,128,  6, 73, 53,  9, 47,122, 47,126, 47,130, 47,134,\n     47,138, 47,142, 47,146, 47,150, 47,154, 48,128,  6, 74, 49,128,\n      6, 75, 50,128,  6, 76, 51,128,  6, 77, 52,128,  6, 78, 53,128,\n      6, 79, 54,128,  6, 80, 55,128,  6, 81, 56,128,  6, 82,183, 48,\n    128,  6, 71, 53,  3, 47,171, 47,203, 47,235, 48,  5, 47,183, 47,\n    187, 47,191, 47,195, 47,199, 53,128,  6,164, 54,128,  6,126, 55,\n    128,  6,134, 56,128,  6,152, 57,128,  6,175, 49,  5, 47,215, 47,\n    219, 47,223, 47,227, 47,231, 49,128,  6,121, 50,128,  6,136, 51,\n    128,  6,145, 52,128,  6,186, 57,128,  6,210,179, 52,128,  6,213,\n     54,  7, 48,  0, 48,  5, 48, 10, 48, 15, 48, 53, 48,115, 48,177,\n    179, 54,128, 32,170,180, 53,128,  5,190,181, 56,128,  5,195, 54,\n      6, 48, 29, 48, 33, 48, 37, 48, 41, 48, 45, 48, 49, 52,128,  5,\n    208, 53,128,  5,209, 54,128,  5,210, 55,128,  5,211, 56,128,  5,\n    212, 57,128,  5,213, 55, 10, 48, 75, 48, 79, 48, 83, 48, 87, 48,\n     91, 48, 95, 48, 99, 48,103, 48,107, 48,111, 48,128,  5,214, 49,\n    128,  5,215, 50,128,  5,216, 51,128,  5,217, 52,128,  5,218, 53,\n    128,  5,219, 54,128,  5,220, 55,128,  5,221, 56,128,  5,222, 57,\n    128,  5,223, 56, 10, 48,137, 48,141, 48,145, 48,149, 48,153, 48,\n    157, 48,161, 48,165, 48,169, 48,173, 48,128,  5,224, 49,128,  5,\n    225, 50,128,  5,226, 51,128,  5,227, 52,128,  5,228, 53,128,  5,\n    229, 54,128,  5,230, 55,128,  5,231, 56,128,  5,232, 57,128,  5,\n    233, 57,  3, 48,185, 48,189, 48,193, 48,128,  5,234, 52,128,251,\n     42, 53,128,251, 43, 55,  4, 48,207, 48,221, 48,241, 48,246, 48,\n      2, 48,213, 48,217, 48,128,251, 75, 53,128,251, 31, 49,  3, 48,\n    229, 48,233, 48,237, 54,128,  5,240, 55,128,  5,241, 56,128,  5,\n    242,178, 51,128,251, 53, 57,  7, 49,  6, 49, 10, 49, 14, 49, 18,\n     49, 22, 49, 26, 49, 30, 51,128,  5,180, 52,128,  5,181, 53,128,\n      5,182, 54,128,  5,187, 55,128,  5,184, 56,128,  5,183, 57,128,\n      5,176, 56,  3, 49, 42, 49, 86, 49, 91, 48,  7, 49, 58, 49, 62,\n     49, 66, 49, 70, 49, 74, 49, 78, 49, 82, 48,128,  5,178, 49,128,\n      5,177, 50,128,  5,179, 51,128,  5,194, 52,128,  5,193, 54,128,\n      5,185, 55,128,  5,188,179, 57,128,  5,189, 52,  2, 49, 97, 49,\n    101, 49,128,  5,191, 50,128,  5,192,185,178, 57,128,  2,188, 54,\n      3, 49,119, 49,178, 49,185, 49,  4, 49,129, 49,145, 49,151, 49,\n    172, 50,  2, 49,135, 49,140,180, 56,128, 33,  5,184, 57,128, 33,\n     19,179,181, 50,128, 33, 22,181, 55,  3, 49,160, 49,164, 49,168,\n     51,128, 32, 44, 52,128, 32, 45, 53,128, 32, 46,182,182, 52,128,\n     32, 12,179,177,182, 55,128,  6,109,180,185,179, 55,128,  2,189,\n    103,  2, 49,198, 49,205,242,225,246,101,128,  0,224,117,  2, 49,\n    211, 49,220,234,225,242,225,244,105,128, 10,133,242,237,245,235,\n    232,105,128, 10,  5,104,  2, 49,235, 49,245,233,242,225,231,225,\n    238, 97,128, 48, 66,239,239,235,225,226,239,246,101,128, 30,163,\n    105,  7, 50, 16, 50, 41, 50, 48, 50, 60, 50, 85, 50,101, 50,181,\n     98,  2, 50, 22, 50, 31,229,238,231,225,236,105,128,  9,144,239,\n    240,239,237,239,230,111,128, 49, 30,228,229,246, 97,128,  9, 16,\n    229,227,249,242,233,236,236,233, 99,128,  4,213,231,117,  2, 50,\n     67, 50, 76,234,225,242,225,244,105,128, 10,144,242,237,245,235,\n    232,105,128, 10, 16,237,225,244,242,225,231,245,242,237,245,235,\n    232,105,128, 10, 72,110,  5, 50,113, 50,122, 50,136, 50,152, 50,\n    167,225,242,225,226,233, 99,128,  6, 57,230,233,238,225,236,225,\n    242,225,226,233, 99,128,254,202,233,238,233,244,233,225,236,225,\n    242,225,226,233, 99,128,254,203,237,229,228,233,225,236,225,242,\n    225,226,233, 99,128,254,204,246,229,242,244,229,228,226,242,229,\n    246,101,128,  2,  3,246,239,247,229,236,243,233,231,110,  3, 50,\n    197, 50,207, 50,214,226,229,238,231,225,236,105,128,  9,200,228,\n    229,246, 97,128,  9, 72,231,245,234,225,242,225,244,105,128, 10,\n    200,107,  2, 50,231, 50,255,225,244,225,235,225,238, 97,129, 48,\n    162, 50,243,232,225,236,230,247,233,228,244,104,128,255,113,239,\n    242,229,225,110,128, 49, 79,108,  3, 51, 15, 52, 71, 52, 80,101,\n      2, 51, 21, 52, 66,102,136,  5,208, 51, 41, 51, 50, 51, 65, 51,\n     79, 51,168, 51,182, 52, 37, 52, 51,225,242,225,226,233, 99,128,\n      6, 39,228,225,231,229,243,232,232,229,226,242,229,119,128,251,\n     48,230,233,238,225,236,225,242,225,226,233, 99,128,254,142,104,\n      2, 51, 85, 51,160,225,237,250, 97,  2, 51, 94, 51,127,225,226,\n    239,246,101,  2, 51,104, 51,113,225,242,225,226,233, 99,128,  6,\n     35,230,233,238,225,236,225,242,225,226,233, 99,128,254,132,226,\n    229,236,239,119,  2, 51,137, 51,146,225,242,225,226,233, 99,128,\n      6, 37,230,233,238,225,236,225,242,225,226,233, 99,128,254,136,\n    229,226,242,229,119,128,  5,208,236,225,237,229,228,232,229,226,\n    242,229,119,128,251, 79,237, 97,  2, 51,189, 51,225,228,228,225,\n    225,226,239,246,101,  2, 51,202, 51,211,225,242,225,226,233, 99,\n    128,  6, 34,230,233,238,225,236,225,242,225,226,233, 99,128,254,\n    130,235,243,245,242, 97,  4, 51,239, 51,248, 52,  6, 52, 22,225,\n    242,225,226,233, 99,128,  6, 73,230,233,238,225,236,225,242,225,\n    226,233, 99,128,254,240,233,238,233,244,233,225,236,225,242,225,\n    226,233, 99,128,254,243,237,229,228,233,225,236,225,242,225,226,\n    233, 99,128,254,244,240,225,244,225,232,232,229,226,242,229,119,\n    128,251, 46,241,225,237,225,244,243,232,229,226,242,229,119,128,\n    251, 47,240,104,128, 33, 53,236,229,241,245,225,108,128, 34, 76,\n    240,232, 97,129,  3,177, 52, 88,244,239,238,239,115,128,  3,172,\n    109,  4, 52,106, 52,114, 52,125, 52,159,225,227,242,239,110,128,\n      1,  1,239,238,239,243,240,225,227,101,128,255, 65,240,229,242,\n    243,225,238,100,130,  0, 38, 52,139, 52,151,237,239,238,239,243,\n    240,225,227,101,128,255,  6,243,237,225,236,108,128,247, 38,243,\n    241,245,225,242,101,128, 51,194,110,  4, 52,178, 52,189, 53, 55,\n     53, 65,226,239,240,239,237,239,230,111,128, 49, 34,103,  4, 52,\n    199, 52,210, 52,224, 53, 47,226,239,240,239,237,239,230,111,128,\n     49, 36,235,232,225,238,235,232,245,244,232,225,105,128, 14, 90,\n    236,101,131, 34, 32, 52,235, 53, 32, 53, 39,226,242,225,227,235,\n    229,116,  2, 52,247, 53, 11,236,229,230,116,129, 48,  8, 53,  0,\n    246,229,242,244,233,227,225,108,128,254, 63,242,233,231,232,116,\n    129, 48,  9, 53, 21,246,229,242,244,233,227,225,108,128,254, 64,\n    236,229,230,116,128, 35, 41,242,233,231,232,116,128, 35, 42,243,\n    244,242,239,109,128, 33, 43,239,244,229,236,229,233, 97,128,  3,\n    135,117,  2, 53, 71, 53, 83,228,225,244,244,225,228,229,246, 97,\n    128,  9, 82,243,246,225,242, 97,  3, 53, 95, 53,105, 53,112,226,\n    229,238,231,225,236,105,128,  9,130,228,229,246, 97,128,  9,  2,\n    231,245,234,225,242,225,244,105,128, 10,130,239,231,239,238,229,\n    107,128,  1,  5,112,  3, 53,140, 53,164, 53,194, 97,  2, 53,146,\n     53,158,225,244,239,243,241,245,225,242,101,128, 51,  0,242,229,\n    110,128, 36,156,239,243,244,242,239,240,232,101,  2, 53,177, 53,\n    188,225,242,237,229,238,233,225,110,128,  5, 90,237,239,100,128,\n      2,188,112,  2, 53,200, 53,205,236,101,128,248,255,242,111,  2,\n     53,212, 53,220,225,227,232,229,115,128, 34, 80,120,  2, 53,226,\n     53,246,229,241,245,225,108,129, 34, 72, 53,236,239,242,233,237,\n    225,231,101,128, 34, 82,233,237,225,244,229,236,249,229,241,245,\n    225,108,128, 34, 69,114,  4, 54, 15, 54, 42, 54, 46, 54, 91,225,\n    229, 97,  2, 54, 23, 54, 33,229,235,239,242,229,225,110,128, 49,\n    142,235,239,242,229,225,110,128, 49,141, 99,128, 35, 18,105,  2,\n     54, 52, 54, 66,231,232,244,232,225,236,230,242,233,238,103,128,\n     30,154,238,103,130,  0,229, 54, 75, 54, 83,225,227,245,244,101,\n    128,  1,251,226,229,236,239,119,128, 30,  1,242,239,119,  8, 54,\n    111, 54,118, 54,247, 55, 57, 55,107, 55,162, 55,185, 56,  4,226,\n    239,244,104,128, 33,148,100,  3, 54,126, 54,165, 54,212,225,243,\n    104,  4, 54,138, 54,145, 54,152, 54,160,228,239,247,110,128, 33,\n    227,236,229,230,116,128, 33,224,242,233,231,232,116,128, 33,226,\n    245,112,128, 33,225,226,108,  5, 54,178, 54,185, 54,192, 54,199,\n     54,207,226,239,244,104,128, 33,212,228,239,247,110,128, 33,211,\n    236,229,230,116,128, 33,208,242,233,231,232,116,128, 33,210,245,\n    112,128, 33,209,239,247,110,131, 33,147, 54,224, 54,231, 54,239,\n    236,229,230,116,128, 33,153,242,233,231,232,116,128, 33,152,247,\n    232,233,244,101,128, 33,233,104,  2, 54,253, 55, 48,229,225,100,\n      4, 55,  9, 55, 19, 55, 29, 55, 40,228,239,247,238,237,239,100,\n    128,  2,197,236,229,230,244,237,239,100,128,  2,194,242,233,231,\n    232,244,237,239,100,128,  2,195,245,240,237,239,100,128,  2,196,\n    239,242,233,250,229,120,128,248,231,236,229,230,116,131, 33,144,\n     55, 70, 55, 87, 55, 99,228,226,108,129, 33,208, 55, 78,243,244,\n    242,239,235,101,128, 33,205,239,246,229,242,242,233,231,232,116,\n    128, 33,198,247,232,233,244,101,128, 33,230,242,233,231,232,116,\n    132, 33,146, 55,123, 55,135, 55,143, 55,154,228,226,236,243,244,\n    242,239,235,101,128, 33,207,232,229,225,246,121,128, 39,158,239,\n    246,229,242,236,229,230,116,128, 33,196,247,232,233,244,101,128,\n     33,232,244,225, 98,  2, 55,170, 55,177,236,229,230,116,128, 33,\n    228,242,233,231,232,116,128, 33,229,245,112,132, 33,145, 55,198,\n     55,226, 55,244, 55,252,100,  2, 55,204, 55,216,110,129, 33,149,\n     55,210,226,243,101,128, 33,168,239,247,238,226,225,243,101,128,\n     33,168,236,229,230,116,129, 33,150, 55,235,239,230,228,239,247,\n    110,128, 33,197,242,233,231,232,116,128, 33,151,247,232,233,244,\n    101,128, 33,231,246,229,242,244,229,120,128,248,230,115,  5, 56,\n     25, 56,101, 56,146, 56,229, 56,239, 99,  2, 56, 31, 56, 83,233,\n    105,  2, 56, 38, 56, 61,227,233,242,227,245,109,129,  0, 94, 56,\n     49,237,239,238,239,243,240,225,227,101,128,255, 62,244,233,236,\n    228,101,129,  0,126, 56, 71,237,239,238,239,243,240,225,227,101,\n    128,255, 94,242,233,240,116,129,  2, 81, 56, 92,244,245,242,238,\n    229,100,128,  2, 82,237,225,236,108,  2, 56,110, 56,121,232,233,\n    242,225,231,225,238, 97,128, 48, 65,235,225,244,225,235,225,238,\n     97,129, 48,161, 56,134,232,225,236,230,247,233,228,244,104,128,\n    255,103,244,229,242,233,115,  2, 56,156, 56,225,107,131,  0, 42,\n     56,166, 56,194, 56,217, 97,  2, 56,172, 56,186,236,244,239,238,\n    229,225,242,225,226,233, 99,128,  6,109,242,225,226,233, 99,128,\n      6,109,109,  2, 56,200, 56,206,225,244,104,128, 34, 23,239,238,\n    239,243,240,225,227,101,128,255, 10,243,237,225,236,108,128,254,\n     97,109,128, 32, 66,245,240,229,242,233,239,114,128,246,233,249,\n    237,240,244,239,244,233,227,225,236,236,249,229,241,245,225,108,\n    128, 34, 67,116,132,  0, 64, 57, 15, 57, 22, 57, 34, 57, 42,233,\n    236,228,101,128,  0,227,237,239,238,239,243,240,225,227,101,128,\n    255, 32,243,237,225,236,108,128,254,107,245,242,238,229,100,128,\n      2, 80,117,  6, 57, 64, 57, 89, 57, 96, 57,121, 57,141, 57,157,\n     98,  2, 57, 70, 57, 79,229,238,231,225,236,105,128,  9,148,239,\n    240,239,237,239,230,111,128, 49, 32,228,229,246, 97,128,  9, 20,\n    231,117,  2, 57,103, 57,112,234,225,242,225,244,105,128, 10,148,\n    242,237,245,235,232,105,128, 10, 20,236,229,238,231,244,232,237,\n    225,242,235,226,229,238,231,225,236,105,128,  9,215,237,225,244,\n    242,225,231,245,242,237,245,235,232,105,128, 10, 76,246,239,247,\n    229,236,243,233,231,110,  3, 57,173, 57,183, 57,190,226,229,238,\n    231,225,236,105,128,  9,204,228,229,246, 97,128,  9, 76,231,245,\n    234,225,242,225,244,105,128, 10,204,246,225,231,242,225,232,225,\n    228,229,246, 97,128,  9, 61,121,  2, 57,221, 57,233,226,225,242,\n    237,229,238,233,225,110,128,  5, 97,233,110,130,  5,226, 57,242,\n     58,  1,225,236,244,239,238,229,232,229,226,242,229,119,128,251,\n     32,232,229,226,242,229,119,128,  5,226, 98,144,  0, 98, 58, 46,\n     58,181, 58,192, 58,201, 58,226, 60, 11, 60, 73, 60,146, 62, 72,\n     62, 84, 62,127, 62,135, 62,145, 64, 15, 64, 39, 64, 48, 97,  7,\n     58, 62, 58, 72, 58, 96, 58,103, 58,128, 58,152, 58,163,226,229,\n    238,231,225,236,105,128,  9,172,227,235,243,236,225,243,104,129,\n      0, 92, 58, 84,237,239,238,239,243,240,225,227,101,128,255, 60,\n    228,229,246, 97,128,  9, 44,231,117,  2, 58,110, 58,119,234,225,\n    242,225,244,105,128, 10,172,242,237,245,235,232,105,128, 10, 44,\n    104,  2, 58,134, 58,144,233,242,225,231,225,238, 97,128, 48,112,\n    244,244,232,225,105,128, 14, 63,235,225,244,225,235,225,238, 97,\n    128, 48,208,114,129,  0,124, 58,169,237,239,238,239,243,240,225,\n    227,101,128,255, 92,226,239,240,239,237,239,230,111,128, 49,  5,\n    227,233,242,227,236,101,128, 36,209,228,239,116,  2, 58,209, 58,\n    218,225,227,227,229,238,116,128, 30,  3,226,229,236,239,119,128,\n     30,  5,101,  6, 58,240, 59,  5, 59, 28, 59,170, 59,181, 59,193,\n    225,237,229,228,243,233,248,244,229,229,238,244,232,238,239,244,\n    229,115,128, 38,108, 99,  2, 59, 11, 59, 18,225,245,243,101,128,\n     34, 53,249,242,233,236,236,233, 99,128,  4, 49,104,  5, 59, 40,\n     59, 49, 59, 63, 59, 93, 59,152,225,242,225,226,233, 99,128,  6,\n     40,230,233,238,225,236,225,242,225,226,233, 99,128,254,144,105,\n      2, 59, 69, 59, 84,238,233,244,233,225,236,225,242,225,226,233,\n     99,128,254,145,242,225,231,225,238, 97,128, 48,121,237,101,  2,\n     59,100, 59,113,228,233,225,236,225,242,225,226,233, 99,128,254,\n    146,229,237,105,  2, 59,121, 59,136,238,233,244,233,225,236,225,\n    242,225,226,233, 99,128,252,159,243,239,236,225,244,229,228,225,\n    242,225,226,233, 99,128,252,  8,238,239,239,238,230,233,238,225,\n    236,225,242,225,226,233, 99,128,252,109,235,225,244,225,235,225,\n    238, 97,128, 48,217,238,225,242,237,229,238,233,225,110,128,  5,\n     98,116,132,  5,209, 59,205, 59,225, 59,245, 59,254, 97,129,  3,\n    178, 59,211,243,249,237,226,239,236,231,242,229,229,107,128,  3,\n    208,228,225,231,229,243,104,129,251, 49, 59,236,232,229,226,242,\n    229,119,128,251, 49,232,229,226,242,229,119,128,  5,209,242,225,\n    230,229,232,229,226,242,229,119,128,251, 76,104,  2, 60, 17, 60,\n     67, 97,  3, 60, 25, 60, 35, 60, 42,226,229,238,231,225,236,105,\n    128,  9,173,228,229,246, 97,128,  9, 45,231,117,  2, 60, 49, 60,\n     58,234,225,242,225,244,105,128, 10,173,242,237,245,235,232,105,\n    128, 10, 45,239,239,107,128,  2, 83,105,  5, 60, 85, 60, 96, 60,\n    107, 60,121, 60,135,232,233,242,225,231,225,238, 97,128, 48,115,\n    235,225,244,225,235,225,238, 97,128, 48,211,236,225,226,233,225,\n    236,227,236,233,227,107,128,  2,152,238,228,233,231,245,242,237,\n    245,235,232,105,128, 10,  2,242,245,243,241,245,225,242,101,128,\n     51, 49,108,  3, 60,154, 62, 55, 62, 66, 97,  2, 60,160, 62, 50,\n    227,107,  6, 60,175, 60,184, 60,221, 61,114, 61,169, 61,221,227,\n    233,242,227,236,101,128, 37,207,100,  2, 60,190, 60,199,233,225,\n    237,239,238,100,128, 37,198,239,247,238,240,239,233,238,244,233,\n    238,231,244,242,233,225,238,231,236,101,128, 37,188,108,  2, 60,\n    227, 61, 74,101,  2, 60,233, 61, 13,230,244,240,239,233,238,244,\n    233,238,103,  2, 60,248, 61,  2,240,239,233,238,244,229,114,128,\n     37,196,244,242,233,225,238,231,236,101,128, 37,192,238,244,233,\n    227,245,236,225,242,226,242,225,227,235,229,116,  2, 61, 33, 61,\n     53,236,229,230,116,129, 48, 16, 61, 42,246,229,242,244,233,227,\n    225,108,128,254, 59,242,233,231,232,116,129, 48, 17, 61, 63,246,\n    229,242,244,233,227,225,108,128,254, 60,239,247,229,114,  2, 61,\n     83, 61, 98,236,229,230,244,244,242,233,225,238,231,236,101,128,\n     37,227,242,233,231,232,244,244,242,233,225,238,231,236,101,128,\n     37,226,114,  2, 61,120, 61,131,229,227,244,225,238,231,236,101,\n    128, 37,172,233,231,232,244,240,239,233,238,244,233,238,103,  2,\n     61,148, 61,158,240,239,233,238,244,229,114,128, 37,186,244,242,\n    233,225,238,231,236,101,128, 37,182,115,  3, 61,177, 61,207, 61,\n    215,109,  2, 61,183, 61,195,225,236,236,243,241,245,225,242,101,\n    128, 37,170,233,236,233,238,231,230,225,227,101,128, 38, 59,241,\n    245,225,242,101,128, 37,160,244,225,114,128, 38,  5,245,240,112,\n      2, 61,229, 62, 11,229,114,  2, 61,236, 61,251,236,229,230,244,\n    244,242,233,225,238,231,236,101,128, 37,228,242,233,231,232,244,\n    244,242,233,225,238,231,236,101,128, 37,229,239,233,238,244,233,\n    238,103,  2, 62, 23, 62, 39,243,237,225,236,236,244,242,233,225,\n    238,231,236,101,128, 37,180,244,242,233,225,238,231,236,101,128,\n     37,178,238,107,128, 36, 35,233,238,229,226,229,236,239,119,128,\n     30,  7,239,227,107,128, 37,136,237,239,238,239,243,240,225,227,\n    101,128,255, 66,111,  3, 62, 92, 62,105, 62,116,226,225,233,237,\n    225,233,244,232,225,105,128, 14, 26,232,233,242,225,231,225,238,\n     97,128, 48,124,235,225,244,225,235,225,238, 97,128, 48,220,240,\n    225,242,229,110,128, 36,157,241,243,241,245,225,242,101,128, 51,\n    195,114,  4, 62,155, 63,149, 63,222, 64,  5,225, 99,  2, 62,162,\n     63, 56,101,  3, 62,170, 62,175, 62,243,229,120,128,248,244,236,\n    229,230,116,133,  0,123, 62,192, 62,197, 62,219, 62,227, 62,232,\n    226,116,128,248,243,109,  2, 62,203, 62,208,233,100,128,248,242,\n    239,238,239,243,240,225,227,101,128,255, 91,243,237,225,236,108,\n    128,254, 91,244,112,128,248,241,246,229,242,244,233,227,225,108,\n    128,254, 55,242,233,231,232,116,133,  0,125, 63,  5, 63, 10, 63,\n     32, 63, 40, 63, 45,226,116,128,248,254,109,  2, 63, 16, 63, 21,\n    233,100,128,248,253,239,238,239,243,240,225,227,101,128,255, 93,\n    243,237,225,236,108,128,254, 92,244,112,128,248,252,246,229,242,\n    244,233,227,225,108,128,254, 56,235,229,116,  2, 63, 64, 63,106,\n    236,229,230,116,132,  0, 91, 63, 79, 63, 84, 63, 89, 63,101,226,\n    116,128,248,240,229,120,128,248,239,237,239,238,239,243,240,225,\n    227,101,128,255, 59,244,112,128,248,238,242,233,231,232,116,132,\n      0, 93, 63,122, 63,127, 63,132, 63,144,226,116,128,248,251,229,\n    120,128,248,250,237,239,238,239,243,240,225,227,101,128,255, 61,\n    244,112,128,248,249,229,246,101,131,  2,216, 63,161, 63,172, 63,\n    178,226,229,236,239,247,227,237, 98,128,  3, 46,227,237, 98,128,\n      3,  6,233,238,246,229,242,244,229,100,  3, 63,193, 63,204, 63,\n    210,226,229,236,239,247,227,237, 98,128,  3, 47,227,237, 98,128,\n      3, 17,228,239,245,226,236,229,227,237, 98,128,  3, 97,233,228,\n    231,101,  2, 63,231, 63,242,226,229,236,239,247,227,237, 98,128,\n      3, 42,233,238,246,229,242,244,229,228,226,229,236,239,247,227,\n    237, 98,128,  3, 58,239,235,229,238,226,225,114,128,  0,166,115,\n      2, 64, 21, 64, 29,244,242,239,235,101,128,  1,128,245,240,229,\n    242,233,239,114,128,246,234,244,239,240,226,225,114,128,  1,131,\n    117,  3, 64, 56, 64, 67, 64, 78,232,233,242,225,231,225,238, 97,\n    128, 48,118,235,225,244,225,235,225,238, 97,128, 48,214,236,108,\n      2, 64, 85, 64,115,229,116,130, 32, 34, 64, 94, 64,104,233,238,\n    246,229,242,243,101,128, 37,216,239,240,229,242,225,244,239,114,\n    128, 34, 25,243,229,249,101,128, 37,206, 99,143,  0, 99, 64,156,\n     65,105, 65,116, 65,180, 65,211, 66, 48, 67,215, 68,199, 69, 43,\n     69, 92, 72, 84, 72, 92, 72,102, 72,114, 72,147, 97,  9, 64,176,\n     64,187, 64,197, 64,204, 64,211, 64,236, 64,246, 65, 42, 65, 51,\n    225,242,237,229,238,233,225,110,128,  5,110,226,229,238,231,225,\n    236,105,128,  9,154,227,245,244,101,128,  1,  7,228,229,246, 97,\n    128,  9, 26,231,117,  2, 64,218, 64,227,234,225,242,225,244,105,\n    128, 10,154,242,237,245,235,232,105,128, 10, 26,236,243,241,245,\n    225,242,101,128, 51,136,238,228,242,225,226,233,238,228,117,  4,\n     65,  8, 65, 18, 65, 24, 65, 31,226,229,238,231,225,236,105,128,\n      9,129,227,237, 98,128,  3, 16,228,229,246, 97,128,  9,  1,231,\n    245,234,225,242,225,244,105,128, 10,129,240,243,236,239,227,107,\n    128, 33,234,114,  3, 65, 59, 65, 65, 65, 91,229,239,102,128, 33,\n      5,239,110,130,  2,199, 65, 74, 65, 85,226,229,236,239,247,227,\n    237, 98,128,  3, 44,227,237, 98,128,  3, 12,242,233,225,231,229,\n    242,229,244,245,242,110,128, 33,181,226,239,240,239,237,239,230,\n    111,128, 49, 24, 99,  4, 65,126, 65,133, 65,152, 65,174,225,242,\n    239,110,128,  1, 13,229,228,233,236,236, 97,129,  0,231, 65,144,\n    225,227,245,244,101,128, 30,  9,233,242, 99,  2, 65,160, 65,165,\n    236,101,128, 36,210,245,237,230,236,229,120,128,  1,  9,245,242,\n    108,128,  2, 85,100,  2, 65,186, 65,202,239,116,129,  1, 11, 65,\n    193,225,227,227,229,238,116,128,  1, 11,243,241,245,225,242,101,\n    128, 51,197,101,  2, 65,217, 65,233,228,233,236,236, 97,129,  0,\n    184, 65,227,227,237, 98,128,  3, 39,238,116,132,  0,162, 65,246,\n     66, 14, 66, 26, 66, 37,105,  2, 65,252, 66,  4,231,242,225,228,\n    101,128, 33,  3,238,230,229,242,233,239,114,128,246,223,237,239,\n    238,239,243,240,225,227,101,128,255,224,239,236,228,243,244,249,\n    236,101,128,247,162,243,245,240,229,242,233,239,114,128,246,224,\n    104,  5, 66, 60, 66,123, 66,134, 67, 62, 67,154, 97,  4, 66, 70,\n     66, 81, 66, 91, 66, 98,225,242,237,229,238,233,225,110,128,  5,\n    121,226,229,238,231,225,236,105,128,  9,155,228,229,246, 97,128,\n      9, 27,231,117,  2, 66,105, 66,114,234,225,242,225,244,105,128,\n     10,155,242,237,245,235,232,105,128, 10, 27,226,239,240,239,237,\n    239,230,111,128, 49, 20,101,  6, 66,148, 66,168, 66,192, 67,  4,\n     67, 16, 67, 37,225,226,235,232,225,243,233,225,238,227,249,242,\n    233,236,236,233, 99,128,  4,189, 99,  2, 66,174, 66,182,235,237,\n    225,242,107,128, 39, 19,249,242,233,236,236,233, 99,128,  4, 71,\n    100,  2, 66,198, 66,242,229,243,227,229,238,228,229,114,  2, 66,\n    211, 66,231,225,226,235,232,225,243,233,225,238,227,249,242,233,\n    236,236,233, 99,128,  4,191,227,249,242,233,236,236,233, 99,128,\n      4,183,233,229,242,229,243,233,243,227,249,242,233,236,236,233,\n     99,128,  4,245,232,225,242,237,229,238,233,225,110,128,  5,115,\n    235,232,225,235,225,243,243,233,225,238,227,249,242,233,236,236,\n    233, 99,128,  4,204,246,229,242,244,233,227,225,236,243,244,242,\n    239,235,229,227,249,242,233,236,236,233, 99,128,  4,185,105,129,\n      3,199, 67, 68,229,245,227,104,  4, 67, 81, 67,116, 67,131, 67,\n    140, 97,  2, 67, 87, 67,102,227,233,242,227,236,229,235,239,242,\n    229,225,110,128, 50,119,240,225,242,229,238,235,239,242,229,225,\n    110,128, 50, 23,227,233,242,227,236,229,235,239,242,229,225,110,\n    128, 50,105,235,239,242,229,225,110,128, 49, 74,240,225,242,229,\n    238,235,239,242,229,225,110,128, 50,  9,111,  2, 67,160, 67,210,\n    227,104,  3, 67,169, 67,191, 67,201,225,110,  2, 67,176, 67,184,\n    231,244,232,225,105,128, 14, 10,244,232,225,105,128, 14,  8,233,\n    238,231,244,232,225,105,128, 14,  9,239,229,244,232,225,105,128,\n     14, 12,239,107,128,  1,136,105,  2, 67,221, 68, 67,229,245, 99,\n      5, 67,235, 68, 14, 68, 29, 68, 38, 68, 52, 97,  2, 67,241, 68,\n      0,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,118,\n    240,225,242,229,238,235,239,242,229,225,110,128, 50, 22,227,233,\n    242,227,236,229,235,239,242,229,225,110,128, 50,104,235,239,242,\n    229,225,110,128, 49, 72,240,225,242,229,238,235,239,242,229,225,\n    110,128, 50,  8,245,240,225,242,229,238,235,239,242,229,225,110,\n    128, 50, 28,242, 99,  2, 68, 74, 68,169,236,101,132, 37,203, 68,\n     87, 68, 98, 68,103, 68,127,237,245,236,244,233,240,236,121,128,\n     34,151,239,116,128, 34,153,112,  2, 68,109, 68,115,236,245,115,\n    128, 34,149,239,243,244,225,236,237,225,242,107,128, 48, 54,247,\n    233,244,104,  2, 68,136, 68,152,236,229,230,244,232,225,236,230,\n    226,236,225,227,107,128, 37,208,242,233,231,232,244,232,225,236,\n    230,226,236,225,227,107,128, 37,209,245,237,230,236,229,120,130,\n      2,198, 68,182, 68,193,226,229,236,239,247,227,237, 98,128,  3,\n     45,227,237, 98,128,  3,  2,108,  3, 68,207, 68,213, 69, 11,229,\n    225,114,128, 35, 39,233,227,107,  4, 68,225, 68,236, 68,245, 68,\n    255,225,236,246,229,239,236,225,114,128,  1,194,228,229,238,244,\n    225,108,128,  1,192,236,225,244,229,242,225,108,128,  1,193,242,\n    229,244,242,239,230,236,229,120,128,  1,195,245, 98,129, 38, 99,\n     69, 18,243,245,233,116,  2, 69, 27, 69, 35,226,236,225,227,107,\n    128, 38, 99,247,232,233,244,101,128, 38,103,109,  3, 69, 51, 69,\n     65, 69, 76,227,245,226,229,228,243,241,245,225,242,101,128, 51,\n    164,239,238,239,243,240,225,227,101,128,255, 67,243,241,245,225,\n    242,229,228,243,241,245,225,242,101,128, 51,160,111,  8, 69,110,\n     69,121, 69,208, 70,150, 71,179, 71,210, 72, 61, 72, 70,225,242,\n    237,229,238,233,225,110,128,  5,129,236,239,110,131,  0, 58, 69,\n    133, 69,158, 69,177,237,239,110,  2, 69,141, 69,149,229,244,225,\n    242,121,128, 32,161,239,243,240,225,227,101,128,255, 26,115,  2,\n     69,164, 69,170,233,231,110,128, 32,161,237,225,236,108,128,254,\n     85,244,242,233,225,238,231,245,236,225,114,  2, 69,192, 69,202,\n    232,225,236,230,237,239,100,128,  2,209,237,239,100,128,  2,208,\n    109,  2, 69,214, 70,143,237, 97,134,  0, 44, 69,231, 70, 39, 70,\n     50, 70, 62, 70, 92, 70,115, 97,  3, 69,239, 70,  9, 70, 17,226,\n    239,246,101,  2, 69,248, 69,254,227,237, 98,128,  3, 19,242,233,\n    231,232,244,227,237, 98,128,  3, 21,227,227,229,238,116,128,246,\n    195,114,  2, 70, 23, 70, 30,225,226,233, 99,128,  6, 12,237,229,\n    238,233,225,110,128,  5, 93,233,238,230,229,242,233,239,114,128,\n    246,225,237,239,238,239,243,240,225,227,101,128,255, 12,242,229,\n    246,229,242,243,229,100,  2, 70, 75, 70, 86,225,226,239,246,229,\n    227,237, 98,128,  3, 20,237,239,100,128,  2,189,115,  2, 70, 98,\n     70,105,237,225,236,108,128,254, 80,245,240,229,242,233,239,114,\n    128,246,226,244,245,242,238,229,100,  2, 70,126, 70,137,225,226,\n    239,246,229,227,237, 98,128,  3, 18,237,239,100,128,  2,187,240,\n    225,243,115,128, 38, 60,110,  2, 70,156, 70,165,231,242,245,229,\n    238,116,128, 34, 69,116,  2, 70,171, 70,185,239,245,242,233,238,\n    244,229,231,242,225,108,128, 34, 46,242,239,108,142, 35,  3, 70,\n    219, 70,225, 70,240, 70,255, 71, 43, 71, 88, 71,102, 71,107, 71,\n    112, 71,117, 71,123, 71,128, 71,169, 71,174,193,195, 75,128,  0,\n      6, 66,  2, 70,231, 70,236,197, 76,128,  0,  7, 83,128,  0,  8,\n     67,  2, 70,246, 70,251,193, 78,128,  0, 24, 82,128,  0, 13, 68,\n      3, 71,  7, 71, 33, 71, 38, 67,  4, 71, 17, 71, 21, 71, 25, 71,\n     29, 49,128,  0, 17, 50,128,  0, 18, 51,128,  0, 19, 52,128,  0,\n     20,197, 76,128,  0,127,204, 69,128,  0, 16, 69,  5, 71, 55, 71,\n     59, 71, 64, 71, 69, 71, 74, 77,128,  0, 25,206, 81,128,  0,  5,\n    207, 84,128,  0,  4,211, 67,128,  0, 27, 84,  2, 71, 80, 71, 84,\n     66,128,  0, 23, 88,128,  0,  3, 70,  2, 71, 94, 71, 98, 70,128,\n      0, 12, 83,128,  0, 28,199, 83,128,  0, 29,200, 84,128,  0,  9,\n    204, 70,128,  0, 10,206,193, 75,128,  0, 21,210, 83,128,  0, 30,\n     83,  5, 71,140, 71,144, 71,154, 71,159, 71,164, 73,128,  0, 15,\n     79,129,  0, 14, 71,150, 84,128,  0,  2,212, 88,128,  0,  1,213,\n     66,128,  0, 26,217, 78,128,  0, 22,213, 83,128,  0, 31,214, 84,\n    128,  0, 11,240,249,242,233,231,232,116,129,  0,169, 71,191,115,\n      2, 71,197, 71,203,225,238,115,128,248,233,229,242,233,102,128,\n    246,217,114,  2, 71,216, 72, 44,238,229,242,226,242,225,227,235,\n    229,116,  2, 71,231, 72,  9,236,229,230,116,130, 48, 12, 71,242,\n     71,254,232,225,236,230,247,233,228,244,104,128,255, 98,246,229,\n    242,244,233,227,225,108,128,254, 65,242,233,231,232,116,130, 48,\n     13, 72, 21, 72, 33,232,225,236,230,247,233,228,244,104,128,255,\n     99,246,229,242,244,233,227,225,108,128,254, 66,240,239,242,225,\n    244,233,239,238,243,241,245,225,242,101,128, 51,127,243,241,245,\n    225,242,101,128, 51,199,246,229,242,235,231,243,241,245,225,242,\n    101,128, 51,198,240,225,242,229,110,128, 36,158,242,245,250,229,\n    233,242,111,128, 32,162,243,244,242,229,244,227,232,229,100,128,\n      2,151,245,114,  2, 72,121, 72,139,236,121,  2, 72,128, 72,134,\n    225,238,100,128, 34,207,239,114,128, 34,206,242,229,238,227,121,\n    128,  0,164,249,114,  4, 72,158, 72,166, 72,173, 72,181,194,242,\n    229,246,101,128,246,209,198,236,229,120,128,246,210,226,242,229,\n    246,101,128,246,212,230,236,229,120,128,246,213,100,146,  0,100,\n     72,228, 74,110, 75,134, 75,194, 76,114, 77, 68, 77,130, 78, 59,\n     78, 72, 78, 81, 78,107, 78,132, 78,141, 79,208, 79,216, 79,227,\n     79,247, 80, 19, 97, 11, 72,252, 73,  7, 73, 17, 73, 89, 73,152,\n     73,163, 73,174, 73,243, 74, 49, 74, 55, 74, 85,225,242,237,229,\n    238,233,225,110,128,  5,100,226,229,238,231,225,236,105,128,  9,\n    166,100,  5, 73, 29, 73, 38, 73, 44, 73, 58, 73, 74,225,242,225,\n    226,233, 99,128,  6, 54,229,246, 97,128,  9, 38,230,233,238,225,\n    236,225,242,225,226,233, 99,128,254,190,233,238,233,244,233,225,\n    236,225,242,225,226,233, 99,128,254,191,237,229,228,233,225,236,\n    225,242,225,226,233, 99,128,254,192,103,  3, 73, 97, 73,114, 73,\n    128,229,243,104,129,  5,188, 73,105,232,229,226,242,229,119,128,\n      5,188,231,229,114,129, 32, 32, 73,122,228,226,108,128, 32, 33,\n    117,  2, 73,134, 73,143,234,225,242,225,244,105,128, 10,166,242,\n    237,245,235,232,105,128, 10, 38,232,233,242,225,231,225,238, 97,\n    128, 48, 96,235,225,244,225,235,225,238, 97,128, 48,192,108,  3,\n     73,182, 73,191, 73,229,225,242,225,226,233, 99,128,  6, 47,229,\n    116,130,  5,211, 73,200, 73,220,228,225,231,229,243,104,129,251,\n     51, 73,211,232,229,226,242,229,119,128,251, 51,232,229,226,242,\n    229,119,128,  5,211,230,233,238,225,236,225,242,225,226,233, 99,\n    128,254,170,237,237, 97,  3, 73,253, 74,  6, 74, 18,225,242,225,\n    226,233, 99,128,  6, 79,236,239,247,225,242,225,226,233, 99,128,\n      6, 79,244,225,238, 97,  2, 74, 27, 74, 41,236,244,239,238,229,\n    225,242,225,226,233, 99,128,  6, 76,242,225,226,233, 99,128,  6,\n     76,238,228, 97,128,  9,100,242,231, 97,  2, 74, 63, 74, 72,232,\n    229,226,242,229,119,128,  5,167,236,229,230,244,232,229,226,242,\n    229,119,128,  5,167,243,233,225,240,238,229,245,237,225,244,225,\n    227,249,242,233,236,236,233,227,227,237, 98,128,  4,133, 98,  3,\n     74,118, 75,115, 75,125,108,  9, 74,138, 74,146, 75,  3, 75, 11,\n     75, 27, 75, 38, 75, 56, 75, 70, 75, 81,199,242,225,246,101,128,\n    246,211, 97,  2, 74,152, 74,209,238,231,236,229,226,242,225,227,\n    235,229,116,  2, 74,168, 74,188,236,229,230,116,129, 48, 10, 74,\n    177,246,229,242,244,233,227,225,108,128,254, 61,242,233,231,232,\n    116,129, 48, 11, 74,198,246,229,242,244,233,227,225,108,128,254,\n     62,114,  2, 74,215, 74,236,227,232,233,238,246,229,242,244,229,\n    228,226,229,236,239,247,227,237, 98,128,  3, 43,242,239,119,  2,\n     74,244, 74,251,236,229,230,116,128, 33,212,242,233,231,232,116,\n    128, 33,210,228,225,238,228, 97,128,  9,101,231,242,225,246,101,\n    129,246,214, 75, 21,227,237, 98,128,  3, 15,233,238,244,229,231,\n    242,225,108,128, 34, 44,236,239,247,236,233,238,101,129, 32, 23,\n     75, 50,227,237, 98,128,  3, 51,239,246,229,242,236,233,238,229,\n    227,237, 98,128,  3, 63,240,242,233,237,229,237,239,100,128,  2,\n    186,246,229,242,244,233,227,225,108,  2, 75, 94, 75,100,226,225,\n    114,128, 32, 22,236,233,238,229,225,226,239,246,229,227,237, 98,\n    128,  3, 14,239,240,239,237,239,230,111,128, 49,  9,243,241,245,\n    225,242,101,128, 51,200, 99,  4, 75,144, 75,151, 75,160, 75,187,\n    225,242,239,110,128,  1, 15,229,228,233,236,236, 97,128, 30, 17,\n    233,242, 99,  2, 75,168, 75,173,236,101,128, 36,211,245,237,230,\n    236,229,248,226,229,236,239,119,128, 30, 19,242,239,225,116,128,\n      1, 17,100,  4, 75,204, 76, 29, 76, 39, 76, 90, 97,  4, 75,214,\n     75,224, 75,231, 76,  0,226,229,238,231,225,236,105,128,  9,161,\n    228,229,246, 97,128,  9, 33,231,117,  2, 75,238, 75,247,234,225,\n    242,225,244,105,128, 10,161,242,237,245,235,232,105,128, 10, 33,\n    108,  2, 76,  6, 76, 15,225,242,225,226,233, 99,128,  6,136,230,\n    233,238,225,236,225,242,225,226,233, 99,128,251,137,228,232,225,\n    228,229,246, 97,128,  9, 92,232, 97,  3, 76, 48, 76, 58, 76, 65,\n    226,229,238,231,225,236,105,128,  9,162,228,229,246, 97,128,  9,\n     34,231,117,  2, 76, 72, 76, 81,234,225,242,225,244,105,128, 10,\n    162,242,237,245,235,232,105,128, 10, 34,239,116,  2, 76, 97, 76,\n    106,225,227,227,229,238,116,128, 30, 11,226,229,236,239,119,128,\n     30, 13,101,  8, 76,132, 76,185, 76,192, 76,217, 76,227, 76,238,\n     77, 27, 77, 63, 99,  2, 76,138, 76,175,233,237,225,236,243,229,\n    240,225,242,225,244,239,114,  2, 76,156, 76,165,225,242,225,226,\n    233, 99,128,  6,107,240,229,242,243,233,225,110,128,  6,107,249,\n    242,233,236,236,233, 99,128,  4, 52,231,242,229,101,128,  0,176,\n    232,105,  2, 76,199, 76,208,232,229,226,242,229,119,128,  5,173,\n    242,225,231,225,238, 97,128, 48,103,233,227,239,240,244,233, 99,\n    128,  3,239,235,225,244,225,235,225,238, 97,128, 48,199,108,  2,\n     76,244, 77, 11,229,244,101,  2, 76,252, 77,  3,236,229,230,116,\n    128, 35, 43,242,233,231,232,116,128, 35, 38,244, 97,129,  3,180,\n     77, 18,244,245,242,238,229,100,128,  1,141,238,239,237,233,238,\n    225,244,239,242,237,233,238,245,243,239,238,229,238,245,237,229,\n    242,225,244,239,242,226,229,238,231,225,236,105,128,  9,248,250,\n    104,128,  2,164,104,  2, 77, 74, 77,124, 97,  3, 77, 82, 77, 92,\n     77, 99,226,229,238,231,225,236,105,128,  9,167,228,229,246, 97,\n    128,  9, 39,231,117,  2, 77,106, 77,115,234,225,242,225,244,105,\n    128, 10,167,242,237,245,235,232,105,128, 10, 39,239,239,107,128,\n      2, 87,105,  6, 77,144, 77,193, 77,253, 78,  8, 78, 19, 78, 29,\n     97,  2, 77,150, 77,172,236,249,244,233,235,225,244,239,238,239,\n    115,129,  3,133, 77,166,227,237, 98,128,  3, 68,237,239,238,100,\n    129, 38,102, 77,181,243,245,233,244,247,232,233,244,101,128, 38,\n     98,229,242,229,243,233,115,133,  0,168, 77,212, 77,220, 77,231,\n     77,237, 77,245,225,227,245,244,101,128,246,215,226,229,236,239,\n    247,227,237, 98,128,  3, 36,227,237, 98,128,  3,  8,231,242,225,\n    246,101,128,246,216,244,239,238,239,115,128,  3,133,232,233,242,\n    225,231,225,238, 97,128, 48, 98,235,225,244,225,235,225,238, 97,\n    128, 48,194,244,244,239,237,225,242,107,128, 48,  3,246,105,  2,\n     78, 36, 78, 47,228,101,129,  0,247, 78, 43,115,128, 34, 35,243,\n    233,239,238,243,236,225,243,104,128, 34, 21,234,229,227,249,242,\n    233,236,236,233, 99,128,  4, 82,235,243,232,225,228,101,128, 37,\n    147,108,  2, 78, 87, 78, 98,233,238,229,226,229,236,239,119,128,\n     30, 15,243,241,245,225,242,101,128, 51,151,109,  2, 78,113, 78,\n    121,225,227,242,239,110,128,  1, 17,239,238,239,243,240,225,227,\n    101,128,255, 68,238,226,236,239,227,107,128, 37,132,111, 10, 78,\n    163, 78,175, 78,185, 78,196, 78,207, 79, 23, 79, 28, 79, 39, 79,\n    154, 79,180,227,232,225,228,225,244,232,225,105,128, 14, 14,228,\n    229,235,244,232,225,105,128, 14, 20,232,233,242,225,231,225,238,\n     97,128, 48,105,235,225,244,225,235,225,238, 97,128, 48,201,236,\n    236,225,114,132,  0, 36, 78,222, 78,233, 78,245, 79,  0,233,238,\n    230,229,242,233,239,114,128,246,227,237,239,238,239,243,240,225,\n    227,101,128,255,  4,239,236,228,243,244,249,236,101,128,247, 36,\n    115,  2, 79,  6, 79, 13,237,225,236,108,128,254,105,245,240,229,\n    242,233,239,114,128,246,228,238,103,128, 32,171,242,245,243,241,\n    245,225,242,101,128, 51, 38,116,  6, 79, 53, 79, 70, 79, 92, 79,\n    103, 79,135, 79,142,225,227,227,229,238,116,129,  2,217, 79, 64,\n    227,237, 98,128,  3,  7,226,229,236,239,247, 99,  2, 79, 81, 79,\n     86,237, 98,128,  3, 35,239,237, 98,128,  3, 35,235,225,244,225,\n    235,225,238, 97,128, 48,251,236,229,243,115,  2, 79,112, 79,116,\n    105,128,  1, 49,106,129,246,190, 79,122,243,244,242,239,235,229,\n    232,239,239,107,128,  2,132,237,225,244,104,128, 34,197,244,229,\n    228,227,233,242,227,236,101,128, 37,204,245,226,236,229,249,239,\n    228,240,225,244,225,104,129,251, 31, 79,171,232,229,226,242,229,\n    119,128,251, 31,247,238,244,225,227,107,  2, 79,191, 79,202,226,\n    229,236,239,247,227,237, 98,128,  3, 30,237,239,100,128,  2,213,\n    240,225,242,229,110,128, 36,159,243,245,240,229,242,233,239,114,\n    128,246,235,116,  2, 79,233, 79,239,225,233,108,128,  2, 86,239,\n    240,226,225,114,128,  1,140,117,  2, 79,253, 80,  8,232,233,242,\n    225,231,225,238, 97,128, 48,101,235,225,244,225,235,225,238, 97,\n    128, 48,197,122,132,  1,243, 80, 31, 80, 40, 80, 59, 80, 96,225,\n    236,244,239,238,101,128,  2,163, 99,  2, 80, 46, 80, 53,225,242,\n    239,110,128,  1,198,245,242,108,128,  2,165,101,  2, 80, 65, 80,\n     85,225,226,235,232,225,243,233,225,238,227,249,242,233,236,236,\n    233, 99,128,  4,225,227,249,242,233,236,236,233, 99,128,  4, 85,\n    232,229,227,249,242,233,236,236,233, 99,128,  4, 95,101,151,  0,\n    101, 80,159, 80,178, 80,212, 81,186, 81,248, 82, 25, 82, 37, 82,\n     60, 82,113, 83,225, 84, 27, 84,129, 84,245, 85,124, 85,199, 85,\n    230, 86, 36, 86, 89, 87, 24, 87,157, 87,177, 87,221, 88, 56, 97,\n      2, 80,165, 80,172,227,245,244,101,128,  0,233,242,244,104,128,\n     38, 65, 98,  3, 80,186, 80,195, 80,205,229,238,231,225,236,105,\n    128,  9,143,239,240,239,237,239,230,111,128, 49, 28,242,229,246,\n    101,128,  1, 21, 99,  5, 80,224, 81, 41, 81, 55, 81, 87, 81,176,\n     97,  2, 80,230, 81, 35,238,228,242, 97,  3, 80,241, 80,248, 81,\n      3,228,229,246, 97,128,  9, 13,231,245,234,225,242,225,244,105,\n    128, 10,141,246,239,247,229,236,243,233,231,110,  2, 81, 17, 81,\n     24,228,229,246, 97,128,  9, 69,231,245,234,225,242,225,244,105,\n    128, 10,197,242,239,110,128,  1, 27,229,228,233,236,236,225,226,\n    242,229,246,101,128, 30, 29,104,  2, 81, 61, 81, 72,225,242,237,\n    229,238,233,225,110,128,  5,101,249,233,247,238,225,242,237,229,\n    238,233,225,110,128,  5,135,233,242, 99,  2, 81, 95, 81,100,236,\n    101,128, 36,212,245,237,230,236,229,120,134,  0,234, 81,121, 81,\n    129, 81,137, 81,148, 81,156, 81,168,225,227,245,244,101,128, 30,\n    191,226,229,236,239,119,128, 30, 25,228,239,244,226,229,236,239,\n    119,128, 30,199,231,242,225,246,101,128, 30,193,232,239,239,235,\n    225,226,239,246,101,128, 30,195,244,233,236,228,101,128, 30,197,\n    249,242,233,236,236,233, 99,128,  4, 84,100,  4, 81,196, 81,206,\n     81,212, 81,222,226,236,231,242,225,246,101,128,  2,  5,229,246,\n     97,128,  9, 15,233,229,242,229,243,233,115,128,  0,235,239,116,\n    130,  1, 23, 81,231, 81,240,225,227,227,229,238,116,128,  1, 23,\n    226,229,236,239,119,128, 30,185,101,  2, 81,254, 82,  9,231,245,\n    242,237,245,235,232,105,128, 10, 15,237,225,244,242,225,231,245,\n    242,237,245,235,232,105,128, 10, 71,230,227,249,242,233,236,236,\n    233, 99,128,  4, 68,103,  2, 82, 43, 82, 50,242,225,246,101,128,\n      0,232,245,234,225,242,225,244,105,128, 10,143,104,  4, 82, 70,\n     82, 81, 82, 92, 82,102,225,242,237,229,238,233,225,110,128,  5,\n    103,226,239,240,239,237,239,230,111,128, 49, 29,233,242,225,231,\n    225,238, 97,128, 48, 72,239,239,235,225,226,239,246,101,128, 30,\n    187,105,  4, 82,123, 82,134, 83,192, 83,207,226,239,240,239,237,\n    239,230,111,128, 49, 31,231,232,116,142,  0, 56, 82,168, 82,177,\n     82,187, 82,217, 82,224, 83,  6, 83, 31, 83, 76, 83,110, 83,122,\n     83,133, 83,166, 83,174, 83,185,225,242,225,226,233, 99,128,  6,\n    104,226,229,238,231,225,236,105,128,  9,238,227,233,242,227,236,\n    101,129, 36,103, 82,198,233,238,246,229,242,243,229,243,225,238,\n    243,243,229,242,233,102,128, 39,145,228,229,246, 97,128,  9,110,\n    229,229,110,  2, 82,232, 82,241,227,233,242,227,236,101,128, 36,\n    113,112,  2, 82,247, 82,254,225,242,229,110,128, 36,133,229,242,\n    233,239,100,128, 36,153,231,117,  2, 83, 13, 83, 22,234,225,242,\n    225,244,105,128, 10,238,242,237,245,235,232,105,128, 10,110,104,\n      2, 83, 37, 83, 63, 97,  2, 83, 43, 83, 54,227,235,225,242,225,\n    226,233, 99,128,  6,104,238,231,250,232,239,117,128, 48, 40,238,\n    239,244,229,226,229,225,237,229,100,128, 38,107,105,  2, 83, 82,\n     83,100,228,229,239,231,242,225,240,232,233,227,240,225,242,229,\n    110,128, 50, 39,238,230,229,242,233,239,114,128, 32,136,237,239,\n    238,239,243,240,225,227,101,128,255, 24,239,236,228,243,244,249,\n    236,101,128,247, 56,112,  2, 83,139, 83,146,225,242,229,110,128,\n     36,123,229,114,  2, 83,153, 83,159,233,239,100,128, 36,143,243,\n    233,225,110,128,  6,248,242,239,237,225,110,128, 33,119,243,245,\n    240,229,242,233,239,114,128, 32,120,244,232,225,105,128, 14, 88,\n    238,246,229,242,244,229,228,226,242,229,246,101,128,  2,  7,239,\n    244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128,  4,\n    101,107,  2, 83,231, 83,255,225,244,225,235,225,238, 97,129, 48,\n    168, 83,243,232,225,236,230,247,233,228,244,104,128,255,116,111,\n      2, 84,  5, 84, 20,238,235,225,242,231,245,242,237,245,235,232,\n    105,128, 10,116,242,229,225,110,128, 49, 84,108,  3, 84, 35, 84,\n     46, 84,107,227,249,242,233,236,236,233, 99,128,  4, 59,101,  2,\n     84, 52, 84, 59,237,229,238,116,128, 34,  8,246,229,110,  3, 84,\n     69, 84, 78, 84, 99,227,233,242,227,236,101,128, 36,106,112,  2,\n     84, 84, 84, 91,225,242,229,110,128, 36,126,229,242,233,239,100,\n    128, 36,146,242,239,237,225,110,128, 33,122,236,233,240,243,233,\n    115,129, 32, 38, 84,118,246,229,242,244,233,227,225,108,128, 34,\n    238,109,  5, 84,141, 84,169, 84,180, 84,200, 84,211,225,227,242,\n    239,110,130,  1, 19, 84,153, 84,161,225,227,245,244,101,128, 30,\n     23,231,242,225,246,101,128, 30, 21,227,249,242,233,236,236,233,\n     99,128,  4, 60,228,225,243,104,129, 32, 20, 84,189,246,229,242,\n    244,233,227,225,108,128,254, 49,239,238,239,243,240,225,227,101,\n    128,255, 69,112,  2, 84,217, 84,237,232,225,243,233,243,237,225,\n    242,235,225,242,237,229,238,233,225,110,128,  5, 91,244,249,243,\n    229,116,128, 34,  5,110,  6, 85,  3, 85, 14, 85, 25, 85, 69, 85,\n    101, 85,116,226,239,240,239,237,239,230,111,128, 49, 35,227,249,\n    242,233,236,236,233, 99,128,  4, 61,100,  2, 85, 31, 85, 50,225,\n    243,104,129, 32, 19, 85, 39,246,229,242,244,233,227,225,108,128,\n    254, 50,229,243,227,229,238,228,229,242,227,249,242,233,236,236,\n    233, 99,128,  4,163,103,130,  1, 75, 85, 77, 85, 88,226,239,240,\n    239,237,239,230,111,128, 49, 37,232,229,227,249,242,233,236,236,\n    233, 99,128,  4,165,232,239,239,235,227,249,242,233,236,236,233,\n     99,128,  4,200,243,240,225,227,101,128, 32,  2,111,  3, 85,132,\n     85,140, 85,149,231,239,238,229,107,128,  1, 25,235,239,242,229,\n    225,110,128, 49, 83,240,229,110,130,  2, 91, 85,159, 85,168,227,\n    236,239,243,229,100,128,  2,154,242,229,246,229,242,243,229,100,\n    130,  2, 92, 85,183, 85,192,227,236,239,243,229,100,128,  2, 94,\n    232,239,239,107,128,  2, 93,112,  2, 85,205, 85,212,225,242,229,\n    110,128, 36,160,243,233,236,239,110,129,  3,181, 85,222,244,239,\n    238,239,115,128,  3,173,241,117,  2, 85,237, 86, 25,225,108,130,\n      0, 61, 85,246, 86,  2,237,239,238,239,243,240,225,227,101,128,\n    255, 29,115,  2, 86,  8, 86, 15,237,225,236,108,128,254,102,245,\n    240,229,242,233,239,114,128, 32,124,233,246,225,236,229,238,227,\n    101,128, 34, 97,114,  3, 86, 44, 86, 55, 86, 66,226,239,240,239,\n    237,239,230,111,128, 49, 38,227,249,242,233,236,236,233, 99,128,\n      4, 64,229,246,229,242,243,229,100,129,  2, 88, 86, 78,227,249,\n    242,233,236,236,233, 99,128,  4, 77,115,  6, 86,103, 86,114, 86,\n    134, 86,215, 87,  4, 87, 14,227,249,242,233,236,236,233, 99,128,\n      4, 65,228,229,243,227,229,238,228,229,242,227,249,242,233,236,\n    236,233, 99,128,  4,171,104,132,  2,131, 86,146, 86,153, 86,184,\n     86,199,227,245,242,108,128,  2,134,239,242,116,  2, 86,161, 86,\n    168,228,229,246, 97,128,  9, 14,246,239,247,229,236,243,233,231,\n    238,228,229,246, 97,128,  9, 70,242,229,246,229,242,243,229,228,\n    236,239,239,112,128,  1,170,243,241,245,225,244,242,229,246,229,\n    242,243,229,100,128,  2,133,237,225,236,108,  2, 86,224, 86,235,\n    232,233,242,225,231,225,238, 97,128, 48, 71,235,225,244,225,235,\n    225,238, 97,129, 48,167, 86,248,232,225,236,230,247,233,228,244,\n    104,128,255,106,244,233,237,225,244,229,100,128, 33, 46,245,240,\n    229,242,233,239,114,128,246,236,116,  5, 87, 36, 87, 62, 87, 66,\n     87, 83, 87,149, 97,130,  3,183, 87, 44, 87, 54,242,237,229,238,\n    233,225,110,128,  5,104,244,239,238,239,115,128,  3,174,104,128,\n      0,240,233,236,228,101,129, 30,189, 87, 75,226,229,236,239,119,\n    128, 30, 27,238,225,232,244, 97,  3, 87, 95, 87,127, 87,136,230,\n    239,245,235,104,  2, 87,105, 87,114,232,229,226,242,229,119,128,\n      5,145,236,229,230,244,232,229,226,242,229,119,128,  5,145,232,\n    229,226,242,229,119,128,  5,145,236,229,230,244,232,229,226,242,\n    229,119,128,  5,145,245,242,238,229,100,128,  1,221,117,  2, 87,\n    163, 87,172,235,239,242,229,225,110,128, 49, 97,242,111,128, 32,\n    172,246,239,247,229,236,243,233,231,110,  3, 87,193, 87,203, 87,\n    210,226,229,238,231,225,236,105,128,  9,199,228,229,246, 97,128,\n      9, 71,231,245,234,225,242,225,244,105,128, 10,199,120,  2, 87,\n    227, 88, 44,227,236,225,109,132,  0, 33, 87,242, 87,253, 88, 24,\n     88, 36,225,242,237,229,238,233,225,110,128,  5, 92,100,  2, 88,\n      3, 88,  8,226,108,128, 32, 60,239,247,110,129,  0,161, 88, 16,\n    243,237,225,236,108,128,247,161,237,239,238,239,243,240,225,227,\n    101,128,255,  1,243,237,225,236,108,128,247, 33,233,243,244,229,\n    238,244,233,225,108,128, 34,  3,250,104,131,  2,146, 88, 67, 88,\n     86, 88, 97, 99,  2, 88, 73, 88, 80,225,242,239,110,128,  1,239,\n    245,242,108,128,  2,147,242,229,246,229,242,243,229,100,128,  1,\n    185,244,225,233,108,128,  1,186,102,140,  0,102, 88,132, 88,214,\n     88,225, 88,234, 88,246, 89, 93, 89,109, 91,117, 91,130, 91,156,\n     93, 33, 93, 41, 97,  4, 88,142, 88,149, 88,160, 88,171,228,229,\n    246, 97,128,  9, 94,231,245,242,237,245,235,232,105,128, 10, 94,\n    232,242,229,238,232,229,233,116,128, 33,  9,244,232, 97,  3, 88,\n    181, 88,190, 88,202,225,242,225,226,233, 99,128,  6, 78,236,239,\n    247,225,242,225,226,233, 99,128,  6, 78,244,225,238,225,242,225,\n    226,233, 99,128,  6, 75,226,239,240,239,237,239,230,111,128, 49,\n      8,227,233,242,227,236,101,128, 36,213,228,239,244,225,227,227,\n    229,238,116,128, 30, 31,101,  3, 88,254, 89, 76, 89, 86,104,  4,\n     89,  8, 89, 31, 89, 45, 89, 61,225,114,  2, 89, 15, 89, 22,225,\n    226,233, 99,128,  6, 65,237,229,238,233,225,110,128,  5,134,230,\n    233,238,225,236,225,242,225,226,233, 99,128,254,210,233,238,233,\n    244,233,225,236,225,242,225,226,233, 99,128,254,211,237,229,228,\n    233,225,236,225,242,225,226,233, 99,128,254,212,233,227,239,240,\n    244,233, 99,128,  3,229,237,225,236,101,128, 38, 64,102,130,251,\n      0, 89,101, 89,105,105,128,251,  3,108,128,251,  4,105,136,251,\n      1, 89,129, 89,169, 89,180, 89,202, 90, 68, 90, 85, 90, 93, 90,\n    106,230,244,229,229,110,  2, 89,139, 89,148,227,233,242,227,236,\n    101,128, 36,110,112,  2, 89,154, 89,161,225,242,229,110,128, 36,\n    130,229,242,233,239,100,128, 36,150,231,245,242,229,228,225,243,\n    104,128, 32, 18,236,236,229,100,  2, 89,189, 89,195,226,239,120,\n    128, 37,160,242,229,227,116,128, 37,172,238,225,108,  5, 89,216,\n     89,255, 90, 16, 90, 33, 90, 49,235,225,102,130,  5,218, 89,226,\n     89,246,228,225,231,229,243,104,129,251, 58, 89,237,232,229,226,\n    242,229,119,128,251, 58,232,229,226,242,229,119,128,  5,218,237,\n    229,109,129,  5,221, 90,  7,232,229,226,242,229,119,128,  5,221,\n    238,245,110,129,  5,223, 90, 24,232,229,226,242,229,119,128,  5,\n    223,240,101,129,  5,227, 90, 40,232,229,226,242,229,119,128,  5,\n    227,244,243,225,228,105,129,  5,229, 90, 59,232,229,226,242,229,\n    119,128,  5,229,242,243,244,244,239,238,229,227,232,233,238,229,\n    243,101,128,  2,201,243,232,229,249,101,128, 37,201,244,225,227,\n    249,242,233,236,236,233, 99,128,  4,115,246,101,142,  0, 53, 90,\n    139, 90,148, 90,158, 90,188, 90,195, 90,205, 90,230, 91,  1, 91,\n     35, 91, 47, 91, 58, 91, 91, 91, 99, 91,110,225,242,225,226,233,\n     99,128,  6,101,226,229,238,231,225,236,105,128,  9,235,227,233,\n    242,227,236,101,129, 36,100, 90,169,233,238,246,229,242,243,229,\n    243,225,238,243,243,229,242,233,102,128, 39,142,228,229,246, 97,\n    128,  9,107,229,233,231,232,244,232,115,128, 33, 93,231,117,  2,\n     90,212, 90,221,234,225,242,225,244,105,128, 10,235,242,237,245,\n    235,232,105,128, 10,107,232, 97,  2, 90,237, 90,248,227,235,225,\n    242,225,226,233, 99,128,  6,101,238,231,250,232,239,117,128, 48,\n     37,105,  2, 91,  7, 91, 25,228,229,239,231,242,225,240,232,233,\n    227,240,225,242,229,110,128, 50, 36,238,230,229,242,233,239,114,\n    128, 32,133,237,239,238,239,243,240,225,227,101,128,255, 21,239,\n    236,228,243,244,249,236,101,128,247, 53,112,  2, 91, 64, 91, 71,\n    225,242,229,110,128, 36,120,229,114,  2, 91, 78, 91, 84,233,239,\n    100,128, 36,140,243,233,225,110,128,  6,245,242,239,237,225,110,\n    128, 33,116,243,245,240,229,242,233,239,114,128, 32,117,244,232,\n    225,105,128, 14, 85,108,129,251,  2, 91,123,239,242,233,110,128,\n      1,146,109,  2, 91,136, 91,147,239,238,239,243,240,225,227,101,\n    128,255, 70,243,241,245,225,242,101,128, 51,153,111,  4, 91,166,\n     91,188, 91,200, 91,207,230, 97,  2, 91,173, 91,181,238,244,232,\n    225,105,128, 14, 31,244,232,225,105,128, 14, 29,238,231,237,225,\n    238,244,232,225,105,128, 14, 79,242,225,236,108,128, 34,  0,245,\n    114,142,  0, 52, 91,240, 91,249, 92,  3, 92, 33, 92, 40, 92, 65,\n     92, 92, 92,126, 92,138, 92,157, 92,168, 92,201, 92,209, 92,220,\n    225,242,225,226,233, 99,128,  6,100,226,229,238,231,225,236,105,\n    128,  9,234,227,233,242,227,236,101,129, 36, 99, 92, 14,233,238,\n    246,229,242,243,229,243,225,238,243,243,229,242,233,102,128, 39,\n    141,228,229,246, 97,128,  9,106,231,117,  2, 92, 47, 92, 56,234,\n    225,242,225,244,105,128, 10,234,242,237,245,235,232,105,128, 10,\n    106,232, 97,  2, 92, 72, 92, 83,227,235,225,242,225,226,233, 99,\n    128,  6,100,238,231,250,232,239,117,128, 48, 36,105,  2, 92, 98,\n     92,116,228,229,239,231,242,225,240,232,233,227,240,225,242,229,\n    110,128, 50, 35,238,230,229,242,233,239,114,128, 32,132,237,239,\n    238,239,243,240,225,227,101,128,255, 20,238,245,237,229,242,225,\n    244,239,242,226,229,238,231,225,236,105,128,  9,247,239,236,228,\n    243,244,249,236,101,128,247, 52,112,  2, 92,174, 92,181,225,242,\n    229,110,128, 36,119,229,114,  2, 92,188, 92,194,233,239,100,128,\n     36,139,243,233,225,110,128,  6,244,242,239,237,225,110,128, 33,\n    115,243,245,240,229,242,233,239,114,128, 32,116,116,  2, 92,226,\n     93,  8,229,229,110,  2, 92,234, 92,243,227,233,242,227,236,101,\n    128, 36,109,112,  2, 92,249, 93,  0,225,242,229,110,128, 36,129,\n    229,242,233,239,100,128, 36,149,104,  2, 93, 14, 93, 19,225,105,\n    128, 14, 84,244,239,238,229,227,232,233,238,229,243,101,128,  2,\n    203,240,225,242,229,110,128, 36,161,242, 97,  2, 93, 48, 93, 56,\n    227,244,233,239,110,128, 32, 68,238, 99,128, 32,163,103,144,  0,\n    103, 93, 97, 94, 43, 94, 66, 94,127, 94,144, 95, 65, 96, 58, 96,\n    143, 96,156, 97, 14, 97, 39, 97, 67, 97, 89, 98, 34, 98, 56, 98,\n    158, 97,  9, 93,117, 93,127, 93,134, 93,141, 93,205, 93,230, 93,\n    241, 93,252, 94, 30,226,229,238,231,225,236,105,128,  9,151,227,\n    245,244,101,128,  1,245,228,229,246, 97,128,  9, 23,102,  4, 93,\n    151, 93,160, 93,174, 93,190,225,242,225,226,233, 99,128,  6,175,\n    230,233,238,225,236,225,242,225,226,233, 99,128,251,147,233,238,\n    233,244,233,225,236,225,242,225,226,233, 99,128,251,148,237,229,\n    228,233,225,236,225,242,225,226,233, 99,128,251,149,231,117,  2,\n     93,212, 93,221,234,225,242,225,244,105,128, 10,151,242,237,245,\n    235,232,105,128, 10, 23,232,233,242,225,231,225,238, 97,128, 48,\n     76,235,225,244,225,235,225,238, 97,128, 48,172,237,237, 97,130,\n      3,179, 94,  6, 94, 19,236,225,244,233,238,243,237,225,236,108,\n    128,  2, 99,243,245,240,229,242,233,239,114,128,  2,224,238,231,\n    233,225,227,239,240,244,233, 99,128,  3,235, 98,  2, 94, 49, 94,\n     59,239,240,239,237,239,230,111,128, 49, 13,242,229,246,101,128,\n      1, 31, 99,  4, 94, 76, 94, 83, 94, 92, 94,114,225,242,239,110,\n    128,  1,231,229,228,233,236,236, 97,128,  1, 35,233,242, 99,  2,\n     94,100, 94,105,236,101,128, 36,214,245,237,230,236,229,120,128,\n      1, 29,239,237,237,225,225,227,227,229,238,116,128,  1, 35,228,\n    239,116,129,  1, 33, 94,135,225,227,227,229,238,116,128,  1, 33,\n    101,  6, 94,158, 94,169, 94,180, 94,191, 94,210, 95, 56,227,249,\n    242,233,236,236,233, 99,128,  4, 51,232,233,242,225,231,225,238,\n     97,128, 48, 82,235,225,244,225,235,225,238, 97,128, 48,178,239,\n    237,229,244,242,233,227,225,236,236,249,229,241,245,225,108,128,\n     34, 81,114,  3, 94,218, 95, 11, 95, 21,229,243,104,  3, 94,228,\n     94,243, 94,252,225,227,227,229,238,244,232,229,226,242,229,119,\n    128,  5,156,232,229,226,242,229,119,128,  5,243,237,245,241,228,\n    225,237,232,229,226,242,229,119,128,  5,157,237,225,238,228,226,\n    236,115,128,  0,223,243,232,225,249,233,109,  2, 95, 32, 95, 47,\n    225,227,227,229,238,244,232,229,226,242,229,119,128,  5,158,232,\n    229,226,242,229,119,128,  5,244,244,225,237,225,242,107,128, 48,\n     19,104,  5, 95, 77, 95,210, 96, 17, 96, 42, 96, 48, 97,  4, 95,\n     87, 95, 97, 95,120, 95,145,226,229,238,231,225,236,105,128,  9,\n    152,100,  2, 95,103, 95,114,225,242,237,229,238,233,225,110,128,\n      5,114,229,246, 97,128,  9, 24,231,117,  2, 95,127, 95,136,234,\n    225,242,225,244,105,128, 10,152,242,237,245,235,232,105,128, 10,\n     24,233,110,  4, 95,156, 95,165, 95,179, 95,195,225,242,225,226,\n    233, 99,128,  6, 58,230,233,238,225,236,225,242,225,226,233, 99,\n    128,254,206,233,238,233,244,233,225,236,225,242,225,226,233, 99,\n    128,254,207,237,229,228,233,225,236,225,242,225,226,233, 99,128,\n    254,208,101,  3, 95,218, 95,239, 96,  0,237,233,228,228,236,229,\n    232,239,239,235,227,249,242,233,236,236,233, 99,128,  4,149,243,\n    244,242,239,235,229,227,249,242,233,236,236,233, 99,128,  4,147,\n    245,240,244,245,242,238,227,249,242,233,236,236,233, 99,128,  4,\n    145,232, 97,  2, 96, 24, 96, 31,228,229,246, 97,128,  9, 90,231,\n    245,242,237,245,235,232,105,128, 10, 90,239,239,107,128,  2, 96,\n    250,243,241,245,225,242,101,128, 51,147,105,  3, 96, 66, 96, 77,\n     96, 88,232,233,242,225,231,225,238, 97,128, 48, 78,235,225,244,\n    225,235,225,238, 97,128, 48,174,109,  2, 96, 94, 96,105,225,242,\n    237,229,238,233,225,110,128,  5, 99,229,108,130,  5,210, 96,114,\n     96,134,228,225,231,229,243,104,129,251, 50, 96,125,232,229,226,\n    242,229,119,128,251, 50,232,229,226,242,229,119,128,  5,210,234,\n    229,227,249,242,233,236,236,233, 99,128,  4, 83,236,239,244,244,\n    225,108,  2, 96,167, 96,184,233,238,246,229,242,244,229,228,243,\n    244,242,239,235,101,128,  1,190,243,244,239,112,132,  2,148, 96,\n    199, 96,210, 96,216, 96,248,233,238,246,229,242,244,229,100,128,\n      2,150,237,239,100,128,  2,192,242,229,246,229,242,243,229,100,\n    130,  2,149, 96,231, 96,237,237,239,100,128,  2,193,243,245,240,\n    229,242,233,239,114,128,  2,228,243,244,242,239,235,101,129,  2,\n    161, 97,  3,242,229,246,229,242,243,229,100,128,  2,162,109,  2,\n     97, 20, 97, 28,225,227,242,239,110,128, 30, 33,239,238,239,243,\n    240,225,227,101,128,255, 71,111,  2, 97, 45, 97, 56,232,233,242,\n    225,231,225,238, 97,128, 48, 84,235,225,244,225,235,225,238, 97,\n    128, 48,180,240, 97,  2, 97, 74, 97, 80,242,229,110,128, 36,162,\n    243,241,245,225,242,101,128, 51,172,114,  2, 97, 95, 97,192, 97,\n      2, 97,101, 97,109,228,233,229,238,116,128, 34,  7,246,101,134,\n      0, 96, 97,126, 97,137, 97,154, 97,161, 97,170, 97,182,226,229,\n    236,239,247,227,237, 98,128,  3, 22, 99,  2, 97,143, 97,148,237,\n     98,128,  3,  0,239,237, 98,128,  3,  0,228,229,246, 97,128,  9,\n     83,236,239,247,237,239,100,128,  2,206,237,239,238,239,243,240,\n    225,227,101,128,255, 64,244,239,238,229,227,237, 98,128,  3, 64,\n    229,225,244,229,114,132,  0, 62, 97,208, 97,227, 97,239, 98, 26,\n    229,241,245,225,108,129, 34,101, 97,218,239,242,236,229,243,115,\n    128, 34,219,237,239,238,239,243,240,225,227,101,128,255, 30,111,\n      2, 97,245, 98, 15,114,  2, 97,251, 98,  8,229,241,245,233,246,\n    225,236,229,238,116,128, 34,115,236,229,243,115,128, 34,119,246,\n    229,242,229,241,245,225,108,128, 34,103,243,237,225,236,108,128,\n    254,101,115,  2, 98, 40, 98, 48,227,242,233,240,116,128,  2, 97,\n    244,242,239,235,101,128,  1,229,117,  4, 98, 66, 98, 77, 98,134,\n     98,145,232,233,242,225,231,225,238, 97,128, 48, 80,233,108,  2,\n     98, 84, 98,109,236,229,237,239,116,  2, 98, 94, 98,101,236,229,\n    230,116,128,  0,171,242,233,231,232,116,128,  0,187,243,233,238,\n    231,108,  2, 98,119, 98,126,236,229,230,116,128, 32, 57,242,233,\n    231,232,116,128, 32, 58,235,225,244,225,235,225,238, 97,128, 48,\n    176,242,225,237,245,243,241,245,225,242,101,128, 51, 24,249,243,\n    241,245,225,242,101,128, 51,201,104,144,  0,104, 98,204,101, 90,\n    101,125,101,162,101,202,103, 90,103,110,104, 75,104, 87,104, 99,\n    105,167,105,175,105,186,105,195,106, 19,106, 23, 97, 13, 98,232,\n     99, 15, 99, 25, 99, 55, 99, 80, 99,158, 99,170, 99,195, 99,210,\n     99,239, 99,252,100, 54,100, 63, 97,  2, 98,238, 99,  1,226,235,\n    232,225,243,233,225,238,227,249,242,233,236,236,233, 99,128,  4,\n    169,236,244,239,238,229,225,242,225,226,233, 99,128,  6,193,226,\n    229,238,231,225,236,105,128,  9,185,228,101,  2, 99, 32, 99, 50,\n    243,227,229,238,228,229,242,227,249,242,233,236,236,233, 99,128,\n      4,179,246, 97,128,  9, 57,231,117,  2, 99, 62, 99, 71,234,225,\n    242,225,244,105,128, 10,185,242,237,245,235,232,105,128, 10, 57,\n    104,  4, 99, 90, 99, 99, 99,113, 99,143,225,242,225,226,233, 99,\n    128,  6, 45,230,233,238,225,236,225,242,225,226,233, 99,128,254,\n    162,105,  2, 99,119, 99,134,238,233,244,233,225,236,225,242,225,\n    226,233, 99,128,254,163,242,225,231,225,238, 97,128, 48,111,237,\n    229,228,233,225,236,225,242,225,226,233, 99,128,254,164,233,244,\n    245,243,241,245,225,242,101,128, 51, 42,235,225,244,225,235,225,\n    238, 97,129, 48,207, 99,183,232,225,236,230,247,233,228,244,104,\n    128,255,138,236,225,238,244,231,245,242,237,245,235,232,105,128,\n     10, 77,237,250, 97,  2, 99,218, 99,227,225,242,225,226,233, 99,\n    128,  6, 33,236,239,247,225,242,225,226,233, 99,128,  6, 33,238,\n    231,245,236,230,233,236,236,229,114,128, 49,100,114,  2,100,  2,\n    100, 18,228,243,233,231,238,227,249,242,233,236,236,233, 99,128,\n      4, 74,240,239,239,110,  2,100, 27,100, 40,236,229,230,244,226,\n    225,242,226,245,112,128, 33,188,242,233,231,232,244,226,225,242,\n    226,245,112,128, 33,192,243,241,245,225,242,101,128, 51,202,244,\n    225,102,  3,100, 73,100,165,101,  0,240,225,244,225,104,134,  5,\n    178,100, 93,100, 98,100,112,100,121,100,136,100,152,177, 54,128,\n      5,178, 50,  2,100,104,100,108, 51,128,  5,178,102,128,  5,178,\n    232,229,226,242,229,119,128,  5,178,238,225,242,242,239,247,232,\n    229,226,242,229,119,128,  5,178,241,245,225,242,244,229,242,232,\n    229,226,242,229,119,128,  5,178,247,233,228,229,232,229,226,242,\n    229,119,128,  5,178,241,225,237,225,244,115,135,  5,179,100,188,\n    100,193,100,198,100,203,100,212,100,227,100,243,177, 98,128,  5,\n    179,178, 56,128,  5,179,179, 52,128,  5,179,232,229,226,242,229,\n    119,128,  5,179,238,225,242,242,239,247,232,229,226,242,229,119,\n    128,  5,179,241,245,225,242,244,229,242,232,229,226,242,229,119,\n    128,  5,179,247,233,228,229,232,229,226,242,229,119,128,  5,179,\n    243,229,231,239,108,135,  5,177,101, 22,101, 27,101, 32,101, 37,\n    101, 46,101, 61,101, 77,177, 55,128,  5,177,178, 52,128,  5,177,\n    179, 48,128,  5,177,232,229,226,242,229,119,128,  5,177,238,225,\n    242,242,239,247,232,229,226,242,229,119,128,  5,177,241,245,225,\n    242,244,229,242,232,229,226,242,229,119,128,  5,177,247,233,228,\n    229,232,229,226,242,229,119,128,  5,177, 98,  3,101, 98,101,103,\n    101,113,225,114,128,  1, 39,239,240,239,237,239,230,111,128, 49,\n     15,242,229,246,229,226,229,236,239,119,128, 30, 43, 99,  2,101,\n    131,101,140,229,228,233,236,236, 97,128, 30, 41,233,242, 99,  2,\n    101,148,101,153,236,101,128, 36,215,245,237,230,236,229,120,128,\n      1, 37,100,  2,101,168,101,178,233,229,242,229,243,233,115,128,\n     30, 39,239,116,  2,101,185,101,194,225,227,227,229,238,116,128,\n     30, 35,226,229,236,239,119,128, 30, 37,101,136,  5,212,101,222,\n    101,255,102, 19,102,248,103,  8,103, 53,103, 62,103, 75,225,242,\n    116,129, 38,101,101,230,243,245,233,116,  2,101,239,101,247,226,\n    236,225,227,107,128, 38,101,247,232,233,244,101,128, 38, 97,228,\n    225,231,229,243,104,129,251, 52,102, 10,232,229,226,242,229,119,\n    128,251, 52,104,  6,102, 33,102, 61,102, 69,102,119,102,165,102,\n    214, 97,  2,102, 39,102, 53,236,244,239,238,229,225,242,225,226,\n    233, 99,128,  6,193,242,225,226,233, 99,128,  6, 71,229,226,242,\n    229,119,128,  5,212,230,233,238,225,236, 97,  2,102, 80,102,111,\n    236,116,  2,102, 87,102, 99,239,238,229,225,242,225,226,233, 99,\n    128,251,167,244,247,239,225,242,225,226,233, 99,128,254,234,242,\n    225,226,233, 99,128,254,234,232,225,237,250,225,225,226,239,246,\n    101,  2,102,134,102,148,230,233,238,225,236,225,242,225,226,233,\n     99,128,251,165,233,243,239,236,225,244,229,228,225,242,225,226,\n    233, 99,128,251,164,105,  2,102,171,102,205,238,233,244,233,225,\n    236, 97,  2,102,183,102,197,236,244,239,238,229,225,242,225,226,\n    233, 99,128,251,168,242,225,226,233, 99,128,254,235,242,225,231,\n    225,238, 97,128, 48,120,237,229,228,233,225,236, 97,  2,102,226,\n    102,240,236,244,239,238,229,225,242,225,226,233, 99,128,251,169,\n    242,225,226,233, 99,128,254,236,233,243,229,233,229,242,225,243,\n    241,245,225,242,101,128, 51,123,107,  2,103, 14,103, 38,225,244,\n    225,235,225,238, 97,129, 48,216,103, 26,232,225,236,230,247,233,\n    228,244,104,128,255,141,245,244,225,225,242,245,243,241,245,225,\n    242,101,128, 51, 54,238,231,232,239,239,107,128,  2,103,242,245,\n    244,245,243,241,245,225,242,101,128, 51, 57,116,129,  5,215,103,\n     81,232,229,226,242,229,119,128,  5,215,232,239,239,107,129,  2,\n    102,103, 99,243,245,240,229,242,233,239,114,128,  2,177,105,  4,\n    103,120,103,205,103,216,103,241,229,245,104,  4,103,132,103,167,\n    103,182,103,191, 97,  2,103,138,103,153,227,233,242,227,236,229,\n    235,239,242,229,225,110,128, 50,123,240,225,242,229,238,235,239,\n    242,229,225,110,128, 50, 27,227,233,242,227,236,229,235,239,242,\n    229,225,110,128, 50,109,235,239,242,229,225,110,128, 49, 78,240,\n    225,242,229,238,235,239,242,229,225,110,128, 50, 13,232,233,242,\n    225,231,225,238, 97,128, 48,114,235,225,244,225,235,225,238, 97,\n    129, 48,210,103,229,232,225,236,230,247,233,228,244,104,128,255,\n    139,242,233,113,134,  5,180,104,  3,104,  8,104, 22,104, 31,104,\n     46,104, 62,177, 52,128,  5,180, 50,  2,104, 14,104, 18, 49,128,\n      5,180,100,128,  5,180,232,229,226,242,229,119,128,  5,180,238,\n    225,242,242,239,247,232,229,226,242,229,119,128,  5,180,241,245,\n    225,242,244,229,242,232,229,226,242,229,119,128,  5,180,247,233,\n    228,229,232,229,226,242,229,119,128,  5,180,236,233,238,229,226,\n    229,236,239,119,128, 30,150,237,239,238,239,243,240,225,227,101,\n    128,255, 72,111,  9,104,119,104,130,104,154,104,179,105, 11,105,\n     24,105,110,105,150,105,161,225,242,237,229,238,233,225,110,128,\n      5,112,232,105,  2,104,137,104,145,240,244,232,225,105,128, 14,\n     43,242,225,231,225,238, 97,128, 48,123,235,225,244,225,235,225,\n    238, 97,129, 48,219,104,167,232,225,236,230,247,233,228,244,104,\n    128,255,142,236,225,109,135,  5,185,104,199,104,204,104,209,104,\n    214,104,223,104,238,104,254,177, 57,128,  5,185,178, 54,128,  5,\n    185,179, 50,128,  5,185,232,229,226,242,229,119,128,  5,185,238,\n    225,242,242,239,247,232,229,226,242,229,119,128,  5,185,241,245,\n    225,242,244,229,242,232,229,226,242,229,119,128,  5,185,247,233,\n    228,229,232,229,226,242,229,119,128,  5,185,238,239,235,232,245,\n    235,244,232,225,105,128, 14, 46,111,  2,105, 30,105,100,107,  4,\n    105, 40,105, 52,105, 58,105, 80,225,226,239,246,229,227,239,237,\n     98,128,  3,  9,227,237, 98,128,  3,  9,240,225,236,225,244,225,\n    236,233,250,229,228,226,229,236,239,247,227,237, 98,128,  3, 33,\n    242,229,244,242,239,230,236,229,248,226,229,236,239,247,227,237,\n     98,128,  3, 34,238,243,241,245,225,242,101,128, 51, 66,114,  2,\n    105,116,105,143,105,  2,105,122,105,131,227,239,240,244,233, 99,\n    128,  3,233,250,239,238,244,225,236,226,225,114,128, 32, 21,238,\n    227,237, 98,128,  3, 27,244,243,240,242,233,238,231,115,128, 38,\n    104,245,243,101,128, 35,  2,240,225,242,229,110,128, 36,163,243,\n    245,240,229,242,233,239,114,128,  2,176,244,245,242,238,229,100,\n    128,  2,101,117,  4,105,205,105,216,105,229,105,254,232,233,242,\n    225,231,225,238, 97,128, 48,117,233,233,244,239,243,241,245,225,\n    242,101,128, 51, 51,235,225,244,225,235,225,238, 97,129, 48,213,\n    105,242,232,225,236,230,247,233,228,244,104,128,255,140,238,231,\n    225,242,245,237,236,225,245,116,129,  2,221,106, 13,227,237, 98,\n    128,  3, 11,118,128,  1,149,249,240,232,229,110,132,  0, 45,106,\n     39,106, 50,106, 62,106, 85,233,238,230,229,242,233,239,114,128,\n    246,229,237,239,238,239,243,240,225,227,101,128,255, 13,115,  2,\n    106, 68,106, 75,237,225,236,108,128,254, 99,245,240,229,242,233,\n    239,114,128,246,230,244,247,111,128, 32, 16,105,149,  0,105,106,\n    137,106,160,106,194,106,241,110,123,110,243,111, 24,111, 51,111,\n    213,111,217,111,255,112, 21,112,105,113, 14,113, 89,113, 97,113,\n    110,113,197,113,254,114, 26,114, 70,225, 99,  2,106,144,106,150,\n    245,244,101,128,  0,237,249,242,233,236,236,233, 99,128,  4, 79,\n     98,  3,106,168,106,177,106,187,229,238,231,225,236,105,128,  9,\n    135,239,240,239,237,239,230,111,128, 49, 39,242,229,246,101,128,\n      1, 45, 99,  3,106,202,106,209,106,231,225,242,239,110,128,  1,\n    208,233,242, 99,  2,106,217,106,222,236,101,128, 36,216,245,237,\n    230,236,229,120,128,  0,238,249,242,233,236,236,233, 99,128,  4,\n     86,100,  4,106,251,107,  5,110, 80,110,113,226,236,231,242,225,\n    246,101,128,  2,  9,101,  2,107, 11,110, 75,239,231,242,225,240,\n    104,  7,107, 32,107, 46,107, 59,109,244,110, 19,110, 32,110, 44,\n    229,225,242,244,232,227,233,242,227,236,101,128, 50,143,230,233,\n    242,229,227,233,242,227,236,101,128, 50,139,233, 99, 14,107, 90,\n    107,106,107,205,108,  3,108, 69,108, 98,108,114,108,171,108,220,\n    108,232,109,  3,109, 70,109,208,109,237,225,236,236,233,225,238,\n    227,229,240,225,242,229,110,128, 50, 63, 99,  4,107,116,107,127,\n    107,141,107,148,225,236,236,240,225,242,229,110,128, 50, 58,229,\n    238,244,242,229,227,233,242,227,236,101,128, 50,165,236,239,243,\n    101,128, 48,  6,111,  3,107,156,107,171,107,191,237,237, 97,129,\n     48,  1,107,164,236,229,230,116,128,255,100,238,231,242,225,244,\n    245,236,225,244,233,239,238,240,225,242,229,110,128, 50, 55,242,\n    242,229,227,244,227,233,242,227,236,101,128, 50,163,101,  3,107,\n    213,107,225,107,242,225,242,244,232,240,225,242,229,110,128, 50,\n     47,238,244,229,242,240,242,233,243,229,240,225,242,229,110,128,\n     50, 61,248,227,229,236,236,229,238,244,227,233,242,227,236,101,\n    128, 50,157,102,  2,108,  9,108, 24,229,243,244,233,246,225,236,\n    240,225,242,229,110,128, 50, 64,105,  2,108, 30,108, 59,238,225,\n    238,227,233,225,108,  2,108, 42,108, 51,227,233,242,227,236,101,\n    128, 50,150,240,225,242,229,110,128, 50, 54,242,229,240,225,242,\n    229,110,128, 50, 43,104,  2,108, 75,108, 86,225,246,229,240,225,\n    242,229,110,128, 50, 50,233,231,232,227,233,242,227,236,101,128,\n     50,164,233,244,229,242,225,244,233,239,238,237,225,242,107,128,\n     48,  5,108,  3,108,122,108,148,108,160,225,226,239,114,  2,108,\n    131,108,140,227,233,242,227,236,101,128, 50,152,240,225,242,229,\n    110,128, 50, 56,229,230,244,227,233,242,227,236,101,128, 50,167,\n    239,247,227,233,242,227,236,101,128, 50,166,109,  2,108,177,108,\n    209,101,  2,108,183,108,198,228,233,227,233,238,229,227,233,242,\n    227,236,101,128, 50,169,244,225,236,240,225,242,229,110,128, 50,\n     46,239,239,238,240,225,242,229,110,128, 50, 42,238,225,237,229,\n    240,225,242,229,110,128, 50, 52,112,  2,108,238,108,246,229,242,\n    233,239,100,128, 48,  2,242,233,238,244,227,233,242,227,236,101,\n    128, 50,158,114,  2,109,  9,109, 57,101,  3,109, 17,109, 28,109,\n     43,225,227,232,240,225,242,229,110,128, 50, 67,240,242,229,243,\n    229,238,244,240,225,242,229,110,128, 50, 57,243,239,245,242,227,\n    229,240,225,242,229,110,128, 50, 62,233,231,232,244,227,233,242,\n    227,236,101,128, 50,168,115,  5,109, 82,109,111,109,125,109,150,\n    109,178,101,  2,109, 88,109,101,227,242,229,244,227,233,242,227,\n    236,101,128, 50,153,236,230,240,225,242,229,110,128, 50, 66,239,\n    227,233,229,244,249,240,225,242,229,110,128, 50, 51,112,  2,109,\n    131,109,137,225,227,101,128, 48,  0,229,227,233,225,236,240,225,\n    242,229,110,128, 50, 53,116,  2,109,156,109,167,239,227,235,240,\n    225,242,229,110,128, 50, 49,245,228,249,240,225,242,229,110,128,\n     50, 59,117,  2,109,184,109,193,238,240,225,242,229,110,128, 50,\n     48,240,229,242,246,233,243,229,240,225,242,229,110,128, 50, 60,\n    119,  2,109,214,109,226,225,244,229,242,240,225,242,229,110,128,\n     50, 44,239,239,228,240,225,242,229,110,128, 50, 45,250,229,242,\n    111,128, 48,  7,109,  2,109,250,110,  7,229,244,225,236,227,233,\n    242,227,236,101,128, 50,142,239,239,238,227,233,242,227,236,101,\n    128, 50,138,238,225,237,229,227,233,242,227,236,101,128, 50,148,\n    243,245,238,227,233,242,227,236,101,128, 50,144,119,  2,110, 50,\n    110, 63,225,244,229,242,227,233,242,227,236,101,128, 50,140,239,\n    239,228,227,233,242,227,236,101,128, 50,141,246, 97,128,  9,  7,\n    233,229,242,229,243,233,115,130,  0,239,110, 94,110,102,225,227,\n    245,244,101,128, 30, 47,227,249,242,233,236,236,233, 99,128,  4,\n    229,239,244,226,229,236,239,119,128, 30,203,101,  3,110,131,110,\n    147,110,158,226,242,229,246,229,227,249,242,233,236,236,233, 99,\n    128,  4,215,227,249,242,233,236,236,233, 99,128,  4, 53,245,238,\n    103,  4,110,170,110,205,110,220,110,229, 97,  2,110,176,110,191,\n    227,233,242,227,236,229,235,239,242,229,225,110,128, 50,117,240,\n    225,242,229,238,235,239,242,229,225,110,128, 50, 21,227,233,242,\n    227,236,229,235,239,242,229,225,110,128, 50,103,235,239,242,229,\n    225,110,128, 49, 71,240,225,242,229,238,235,239,242,229,225,110,\n    128, 50,  7,103,  2,110,249,111,  0,242,225,246,101,128,  0,236,\n    117,  2,111,  6,111, 15,234,225,242,225,244,105,128, 10,135,242,\n    237,245,235,232,105,128, 10,  7,104,  2,111, 30,111, 40,233,242,\n    225,231,225,238, 97,128, 48, 68,239,239,235,225,226,239,246,101,\n    128, 30,201,105,  8,111, 69,111, 79,111, 90,111, 97,111,122,111,\n    138,111,153,111,169,226,229,238,231,225,236,105,128,  9,136,227,\n    249,242,233,236,236,233, 99,128,  4, 56,228,229,246, 97,128,  9,\n      8,231,117,  2,111,104,111,113,234,225,242,225,244,105,128, 10,\n    136,242,237,245,235,232,105,128, 10,  8,237,225,244,242,225,231,\n    245,242,237,245,235,232,105,128, 10, 64,238,246,229,242,244,229,\n    228,226,242,229,246,101,128,  2, 11,243,232,239,242,244,227,249,\n    242,233,236,236,233, 99,128,  4, 57,246,239,247,229,236,243,233,\n    231,110,  3,111,185,111,195,111,202,226,229,238,231,225,236,105,\n    128,  9,192,228,229,246, 97,128,  9, 64,231,245,234,225,242,225,\n    244,105,128, 10,192,106,128,  1, 51,107,  2,111,223,111,247,225,\n    244,225,235,225,238, 97,129, 48,164,111,235,232,225,236,230,247,\n    233,228,244,104,128,255,114,239,242,229,225,110,128, 49, 99,108,\n      2,112,  5,112, 10,228,101,128,  2,220,245,249,232,229,226,242,\n    229,119,128,  5,172,109,  2,112, 27,112, 94, 97,  3,112, 35,112,\n     55,112, 80,227,242,239,110,129,  1, 43,112, 44,227,249,242,233,\n    236,236,233, 99,128,  4,227,231,229,239,242,225,240,240,242,239,\n    248,233,237,225,244,229,236,249,229,241,245,225,108,128, 34, 83,\n    244,242,225,231,245,242,237,245,235,232,105,128, 10, 63,239,238,\n    239,243,240,225,227,101,128,255, 73,110,  5,112,117,112,127,112,\n    136,112,148,112,232,227,242,229,237,229,238,116,128, 34,  6,230,\n    233,238,233,244,121,128, 34, 30,233,225,242,237,229,238,233,225,\n    110,128,  5,107,116,  2,112,154,112,222,101,  2,112,160,112,211,\n    231,242,225,108,131, 34, 43,112,173,112,191,112,196, 98,  2,112,\n    179,112,187,239,244,244,239,109,128, 35, 33,116,128, 35, 33,229,\n    120,128,248,245,116,  2,112,202,112,207,239,112,128, 35, 32,112,\n    128, 35, 32,242,243,229,227,244,233,239,110,128, 34, 41,233,243,\n    241,245,225,242,101,128, 51,  5,118,  3,112,240,112,249,113,  2,\n    226,245,236,236,229,116,128, 37,216,227,233,242,227,236,101,128,\n     37,217,243,237,233,236,229,230,225,227,101,128, 38, 59,111,  3,\n    113, 22,113, 33,113, 41,227,249,242,233,236,236,233, 99,128,  4,\n     81,231,239,238,229,107,128,  1, 47,244, 97,131,  3,185,113, 52,\n    113, 73,113, 81,228,233,229,242,229,243,233,115,129,  3,202,113,\n     65,244,239,238,239,115,128,  3,144,236,225,244,233,110,128,  2,\n    105,244,239,238,239,115,128,  3,175,240,225,242,229,110,128, 36,\n    164,242,233,231,245,242,237,245,235,232,105,128, 10,114,115,  4,\n    113,120,113,165,113,179,113,187,237,225,236,108,  2,113,129,113,\n    140,232,233,242,225,231,225,238, 97,128, 48, 67,235,225,244,225,\n    235,225,238, 97,129, 48,163,113,153,232,225,236,230,247,233,228,\n    244,104,128,255,104,243,232,225,242,226,229,238,231,225,236,105,\n    128,  9,250,244,242,239,235,101,128,  2,104,245,240,229,242,233,\n    239,114,128,246,237,116,  2,113,203,113,237,229,242,225,244,233,\n    239,110,  2,113,215,113,226,232,233,242,225,231,225,238, 97,128,\n     48,157,235,225,244,225,235,225,238, 97,128, 48,253,233,236,228,\n    101,129,  1, 41,113,246,226,229,236,239,119,128, 30, 45,117,  2,\n    114,  4,114, 15,226,239,240,239,237,239,230,111,128, 49, 41,227,\n    249,242,233,236,236,233, 99,128,  4, 78,246,239,247,229,236,243,\n    233,231,110,  3,114, 42,114, 52,114, 59,226,229,238,231,225,236,\n    105,128,  9,191,228,229,246, 97,128,  9, 63,231,245,234,225,242,\n    225,244,105,128, 10,191,250,232,233,244,243, 97,  2,114, 81,114,\n     92,227,249,242,233,236,236,233, 99,128,  4,117,228,226,236,231,\n    242,225,246,229,227,249,242,233,236,236,233, 99,128,  4,119,106,\n    138,  0,106,114,135,114,198,114,209,115,  3,115, 19,115,132,115,\n    201,115,206,115,218,115,226, 97,  4,114,145,114,156,114,166,114,\n    173,225,242,237,229,238,233,225,110,128,  5,113,226,229,238,231,\n    225,236,105,128,  9,156,228,229,246, 97,128,  9, 28,231,117,  2,\n    114,180,114,189,234,225,242,225,244,105,128, 10,156,242,237,245,\n    235,232,105,128, 10, 28,226,239,240,239,237,239,230,111,128, 49,\n     16, 99,  3,114,217,114,224,114,246,225,242,239,110,128,  1,240,\n    233,242, 99,  2,114,232,114,237,236,101,128, 36,217,245,237,230,\n    236,229,120,128,  1, 53,242,239,243,243,229,228,244,225,233,108,\n    128,  2,157,228,239,244,236,229,243,243,243,244,242,239,235,101,\n    128,  2, 95,101,  3,115, 27,115, 38,115,103,227,249,242,233,236,\n    236,233, 99,128,  4, 88,229,109,  4,115, 49,115, 58,115, 72,115,\n     88,225,242,225,226,233, 99,128,  6, 44,230,233,238,225,236,225,\n    242,225,226,233, 99,128,254,158,233,238,233,244,233,225,236,225,\n    242,225,226,233, 99,128,254,159,237,229,228,233,225,236,225,242,\n    225,226,233, 99,128,254,160,104,  2,115,109,115,118,225,242,225,\n    226,233, 99,128,  6,152,230,233,238,225,236,225,242,225,226,233,\n     99,128,251,139,104,  2,115,138,115,188, 97,  3,115,146,115,156,\n    115,163,226,229,238,231,225,236,105,128,  9,157,228,229,246, 97,\n    128,  9, 29,231,117,  2,115,170,115,179,234,225,242,225,244,105,\n    128, 10,157,242,237,245,235,232,105,128, 10, 29,229,232,225,242,\n    237,229,238,233,225,110,128,  5,123,233,115,128, 48,  4,237,239,\n    238,239,243,240,225,227,101,128,255, 74,240,225,242,229,110,128,\n     36,165,243,245,240,229,242,233,239,114,128,  2,178,107,146,  0,\n    107,116, 21,118,110,118,121,118,183,118,194,119, 28,119, 42,120,\n    150,121, 90,121,103,121,129,121,178,122, 60,122, 82,122, 95,122,\n    118,122,160,122,170, 97, 12,116, 47,116, 79,116,101,116,131,116,\n    245,117, 14,117, 44,117, 69,117,175,117,189,118, 56,118, 85, 98,\n      2,116, 53,116, 70,225,243,232,235,233,242,227,249,242,233,236,\n    236,233, 99,128,  4,161,229,238,231,225,236,105,128,  9,149, 99,\n      2,116, 85,116, 91,245,244,101,128, 30, 49,249,242,233,236,236,\n    233, 99,128,  4, 58,228,101,  2,116,108,116,126,243,227,229,238,\n    228,229,242,227,249,242,233,236,236,233, 99,128,  4,155,246, 97,\n    128,  9, 21,102,135,  5,219,116,149,116,158,116,178,116,192,116,\n    201,116,217,116,232,225,242,225,226,233, 99,128,  6, 67,228,225,\n    231,229,243,104,129,251, 59,116,169,232,229,226,242,229,119,128,\n    251, 59,230,233,238,225,236,225,242,225,226,233, 99,128,254,218,\n    232,229,226,242,229,119,128,  5,219,233,238,233,244,233,225,236,\n    225,242,225,226,233, 99,128,254,219,237,229,228,233,225,236,225,\n    242,225,226,233, 99,128,254,220,242,225,230,229,232,229,226,242,\n    229,119,128,251, 77,231,117,  2,116,252,117,  5,234,225,242,225,\n    244,105,128, 10,149,242,237,245,235,232,105,128, 10, 21,104,  2,\n    117, 20,117, 30,233,242,225,231,225,238, 97,128, 48, 75,239,239,\n    235,227,249,242,233,236,236,233, 99,128,  4,196,235,225,244,225,\n    235,225,238, 97,129, 48,171,117, 57,232,225,236,230,247,233,228,\n    244,104,128,255,118,112,  2,117, 75,117, 96,240, 97,129,  3,186,\n    117, 82,243,249,237,226,239,236,231,242,229,229,107,128,  3,240,\n    249,229,239,245,110,  3,117,108,117,122,117,156,237,233,229,245,\n    237,235,239,242,229,225,110,128, 49,113,112,  2,117,128,117,143,\n    232,233,229,245,240,232,235,239,242,229,225,110,128, 49,132,233,\n    229,245,240,235,239,242,229,225,110,128, 49,120,243,243,225,238,\n    231,240,233,229,245,240,235,239,242,229,225,110,128, 49,121,242,\n    239,242,233,233,243,241,245,225,242,101,128, 51, 13,115,  5,117,\n    201,117,245,118,  4,118, 12,118, 40,232,233,228,225,225,245,244,\n    111,  2,117,214,117,223,225,242,225,226,233, 99,128,  6, 64,238,\n    239,243,233,228,229,226,229,225,242,233,238,231,225,242,225,226,\n    233, 99,128,  6, 64,237,225,236,236,235,225,244,225,235,225,238,\n     97,128, 48,245,241,245,225,242,101,128, 51,132,242, 97,  2,118,\n     19,118, 28,225,242,225,226,233, 99,128,  6, 80,244,225,238,225,\n    242,225,226,233, 99,128,  6, 77,244,242,239,235,229,227,249,242,\n    233,236,236,233, 99,128,  4,159,244,225,232,233,242,225,240,242,\n    239,236,239,238,231,237,225,242,235,232,225,236,230,247,233,228,\n    244,104,128,255,112,246,229,242,244,233,227,225,236,243,244,242,\n    239,235,229,227,249,242,233,236,236,233, 99,128,  4,157,226,239,\n    240,239,237,239,230,111,128, 49, 14, 99,  4,118,131,118,153,118,\n    162,118,170, 97,  2,118,137,118,147,236,243,241,245,225,242,101,\n    128, 51,137,242,239,110,128,  1,233,229,228,233,236,236, 97,128,\n      1, 55,233,242,227,236,101,128, 36,218,239,237,237,225,225,227,\n    227,229,238,116,128,  1, 55,228,239,244,226,229,236,239,119,128,\n     30, 51,101,  4,118,204,118,231,119,  0,119, 12,104,  2,118,210,\n    118,221,225,242,237,229,238,233,225,110,128,  5,132,233,242,225,\n    231,225,238, 97,128, 48, 81,235,225,244,225,235,225,238, 97,129,\n     48,177,118,244,232,225,236,230,247,233,228,244,104,128,255,121,\n    238,225,242,237,229,238,233,225,110,128,  5,111,243,237,225,236,\n    236,235,225,244,225,235,225,238, 97,128, 48,246,231,242,229,229,\n    238,236,225,238,228,233, 99,128,  1, 56,104,  6,119, 56,119,185,\n    119,196,119,221,120, 52,120,140, 97,  5,119, 68,119, 78,119, 89,\n    119, 96,119,121,226,229,238,231,225,236,105,128,  9,150,227,249,\n    242,233,236,236,233, 99,128,  4, 69,228,229,246, 97,128,  9, 22,\n    231,117,  2,119,103,119,112,234,225,242,225,244,105,128, 10,150,\n    242,237,245,235,232,105,128, 10, 22,104,  4,119,131,119,140,119,\n    154,119,170,225,242,225,226,233, 99,128,  6, 46,230,233,238,225,\n    236,225,242,225,226,233, 99,128,254,166,233,238,233,244,233,225,\n    236,225,242,225,226,233, 99,128,254,167,237,229,228,233,225,236,\n    225,242,225,226,233, 99,128,254,168,229,233,227,239,240,244,233,\n     99,128,  3,231,232, 97,  2,119,203,119,210,228,229,246, 97,128,\n      9, 89,231,245,242,237,245,235,232,105,128, 10, 89,233,229,245,\n    235,104,  4,119,235,120, 14,120, 29,120, 38, 97,  2,119,241,120,\n      0,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,120,\n    240,225,242,229,238,235,239,242,229,225,110,128, 50, 24,227,233,\n    242,227,236,229,235,239,242,229,225,110,128, 50,106,235,239,242,\n    229,225,110,128, 49, 75,240,225,242,229,238,235,239,242,229,225,\n    110,128, 50, 10,111,  4,120, 62,120,111,120,121,120,126,235,104,\n      4,120, 73,120, 82,120, 91,120,101,225,233,244,232,225,105,128,\n     14,  2,239,238,244,232,225,105,128, 14,  5,245,225,244,244,232,\n    225,105,128, 14,  3,247,225,233,244,232,225,105,128, 14,  4,237,\n    245,244,244,232,225,105,128, 14, 91,239,107,128,  1,153,242,225,\n    235,232,225,238,231,244,232,225,105,128, 14,  6,250,243,241,245,\n    225,242,101,128, 51,145,105,  4,120,160,120,171,120,196,120,245,\n    232,233,242,225,231,225,238, 97,128, 48, 77,235,225,244,225,235,\n    225,238, 97,129, 48,173,120,184,232,225,236,230,247,233,228,244,\n    104,128,255,119,242,111,  3,120,205,120,220,120,236,231,245,242,\n    225,237,245,243,241,245,225,242,101,128, 51, 21,237,229,229,244,\n    239,242,245,243,241,245,225,242,101,128, 51, 22,243,241,245,225,\n    242,101,128, 51, 20,249,229,239,107,  5,121,  4,121, 39,121, 54,\n    121, 63,121, 77, 97,  2,121, 10,121, 25,227,233,242,227,236,229,\n    235,239,242,229,225,110,128, 50,110,240,225,242,229,238,235,239,\n    242,229,225,110,128, 50, 14,227,233,242,227,236,229,235,239,242,\n    229,225,110,128, 50, 96,235,239,242,229,225,110,128, 49, 49,240,\n    225,242,229,238,235,239,242,229,225,110,128, 50,  0,243,233,239,\n    243,235,239,242,229,225,110,128, 49, 51,234,229,227,249,242,233,\n    236,236,233, 99,128,  4, 92,108,  2,121,109,121,120,233,238,229,\n    226,229,236,239,119,128, 30, 53,243,241,245,225,242,101,128, 51,\n    152,109,  3,121,137,121,151,121,162,227,245,226,229,228,243,241,\n    245,225,242,101,128, 51,166,239,238,239,243,240,225,227,101,128,\n    255, 75,243,241,245,225,242,229,228,243,241,245,225,242,101,128,\n     51,162,111,  5,121,190,121,216,121,254,122, 10,122, 24,104,  2,\n    121,196,121,206,233,242,225,231,225,238, 97,128, 48, 83,237,243,\n    241,245,225,242,101,128, 51,192,235, 97,  2,121,223,121,231,233,\n    244,232,225,105,128, 14,  1,244,225,235,225,238, 97,129, 48,179,\n    121,242,232,225,236,230,247,233,228,244,104,128,255,122,239,240,\n    239,243,241,245,225,242,101,128, 51, 30,240,240,225,227,249,242,\n    233,236,236,233, 99,128,  4,129,114,  2,122, 30,122, 50,229,225,\n    238,243,244,225,238,228,225,242,228,243,249,237,226,239,108,128,\n     50,127,239,238,233,243,227,237, 98,128,  3, 67,240, 97,  2,122,\n     67,122, 73,242,229,110,128, 36,166,243,241,245,225,242,101,128,\n     51,170,243,233,227,249,242,233,236,236,233, 99,128,  4,111,116,\n      2,122,101,122,110,243,241,245,225,242,101,128, 51,207,245,242,\n    238,229,100,128,  2,158,117,  2,122,124,122,135,232,233,242,225,\n    231,225,238, 97,128, 48, 79,235,225,244,225,235,225,238, 97,129,\n     48,175,122,148,232,225,236,230,247,233,228,244,104,128,255,120,\n    246,243,241,245,225,242,101,128, 51,184,247,243,241,245,225,242,\n    101,128, 51,190,108,146,  0,108,122,220,124,247,125, 20,125, 86,\n    125,124,126, 20,126, 29,126, 45,126, 69,126, 87,126,205,126,246,\n    127,125,127,133,127,166,127,175,127,183,127,245, 97,  7,122,236,\n    122,246,122,253,123,  4,123, 29,123, 45,124,235,226,229,238,231,\n    225,236,105,128,  9,178,227,245,244,101,128,  1, 58,228,229,246,\n     97,128,  9, 50,231,117,  2,123, 11,123, 20,234,225,242,225,244,\n    105,128, 10,178,242,237,245,235,232,105,128, 10, 50,235,235,232,\n    225,238,231,249,225,239,244,232,225,105,128, 14, 69,109, 10,123,\n     67,124,  6,124, 23,124, 61,124, 75,124, 94,124,110,124,130,124,\n    150,124,173, 97,  2,123, 73,123,254,236,229,102,  4,123, 85,123,\n     99,123,191,123,208,230,233,238,225,236,225,242,225,226,233, 99,\n    128,254,252,232,225,237,250, 97,  2,123,109,123,150,225,226,239,\n    246,101,  2,123,119,123,133,230,233,238,225,236,225,242,225,226,\n    233, 99,128,254,248,233,243,239,236,225,244,229,228,225,242,225,\n    226,233, 99,128,254,247,226,229,236,239,119,  2,123,160,123,174,\n    230,233,238,225,236,225,242,225,226,233, 99,128,254,250,233,243,\n    239,236,225,244,229,228,225,242,225,226,233, 99,128,254,249,233,\n    243,239,236,225,244,229,228,225,242,225,226,233, 99,128,254,251,\n    237,225,228,228,225,225,226,239,246,101,  2,123,223,123,237,230,\n    233,238,225,236,225,242,225,226,233, 99,128,254,246,233,243,239,\n    236,225,244,229,228,225,242,225,226,233, 99,128,254,245,242,225,\n    226,233, 99,128,  6, 68,226,228, 97,129,  3,187,124, 14,243,244,\n    242,239,235,101,128,  1,155,229,100,130,  5,220,124, 32,124, 52,\n    228,225,231,229,243,104,129,251, 60,124, 43,232,229,226,242,229,\n    119,128,251, 60,232,229,226,242,229,119,128,  5,220,230,233,238,\n    225,236,225,242,225,226,233, 99,128,254,222,232,225,232,233,238,\n    233,244,233,225,236,225,242,225,226,233, 99,128,252,202,233,238,\n    233,244,233,225,236,225,242,225,226,233, 99,128,254,223,234,229,\n    229,237,233,238,233,244,233,225,236,225,242,225,226,233, 99,128,\n    252,201,235,232,225,232,233,238,233,244,233,225,236,225,242,225,\n    226,233, 99,128,252,203,236,225,237,232,229,232,233,243,239,236,\n    225,244,229,228,225,242,225,226,233, 99,128,253,242,237,101,  2,\n    124,180,124,193,228,233,225,236,225,242,225,226,233, 99,128,254,\n    224,229,109,  2,124,200,124,219,232,225,232,233,238,233,244,233,\n    225,236,225,242,225,226,233, 99,128,253,136,233,238,233,244,233,\n    225,236,225,242,225,226,233, 99,128,252,204,242,231,229,227,233,\n    242,227,236,101,128, 37,239, 98,  3,124,255,125,  4,125, 10,225,\n    114,128,  1,154,229,236,116,128,  2,108,239,240,239,237,239,230,\n    111,128, 49, 12, 99,  4,125, 30,125, 37,125, 46,125, 73,225,242,\n    239,110,128,  1, 62,229,228,233,236,236, 97,128,  1, 60,233,242,\n     99,  2,125, 54,125, 59,236,101,128, 36,219,245,237,230,236,229,\n    248,226,229,236,239,119,128, 30, 61,239,237,237,225,225,227,227,\n    229,238,116,128,  1, 60,228,239,116,130,  1, 64,125, 96,125,105,\n    225,227,227,229,238,116,128,  1, 64,226,229,236,239,119,129, 30,\n     55,125,115,237,225,227,242,239,110,128, 30, 57,101,  3,125,132,\n    125,170,126, 15,230,116,  2,125,139,125,155,225,238,231,236,229,\n    225,226,239,246,229,227,237, 98,128,  3, 26,244,225,227,235,226,\n    229,236,239,247,227,237, 98,128,  3, 24,243,115,132,  0, 60,125,\n    183,125,205,125,217,126,  7,229,241,245,225,108,129, 34,100,125,\n    193,239,242,231,242,229,225,244,229,114,128, 34,218,237,239,238,\n    239,243,240,225,227,101,128,255, 28,111,  2,125,223,125,252,114,\n      2,125,229,125,242,229,241,245,233,246,225,236,229,238,116,128,\n     34,114,231,242,229,225,244,229,114,128, 34,118,246,229,242,229,\n    241,245,225,108,128, 34,102,243,237,225,236,108,128,254,100,250,\n    104,128,  2,110,230,226,236,239,227,107,128, 37,140,232,239,239,\n    235,242,229,244,242,239,230,236,229,120,128,  2,109,105,  2,126,\n     51,126, 56,242, 97,128, 32,164,247,238,225,242,237,229,238,233,\n    225,110,128,  5,108,106,129,  1,201,126, 75,229,227,249,242,233,\n    236,236,233, 99,128,  4, 89,108,132,246,192,126, 99,126,123,126,\n    134,126,143, 97,  2,126,105,126,112,228,229,246, 97,128,  9, 51,\n    231,245,234,225,242,225,244,105,128, 10,179,233,238,229,226,229,\n    236,239,119,128, 30, 59,236,225,228,229,246, 97,128,  9, 52,246,\n    239,227,225,236,233, 99,  3,126,157,126,167,126,174,226,229,238,\n    231,225,236,105,128,  9,225,228,229,246, 97,128,  9, 97,246,239,\n    247,229,236,243,233,231,110,  2,126,188,126,198,226,229,238,231,\n    225,236,105,128,  9,227,228,229,246, 97,128,  9, 99,109,  3,126,\n    213,126,226,126,237,233,228,228,236,229,244,233,236,228,101,128,\n      2,107,239,238,239,243,240,225,227,101,128,255, 76,243,241,245,\n    225,242,101,128, 51,208,111,  6,127,  4,127, 16,127, 58,127, 69,\n    127, 75,127,117,227,232,245,236,225,244,232,225,105,128, 14, 44,\n    231,233,227,225,108,  3,127, 28,127, 34,127, 53,225,238,100,128,\n     34, 39,238,239,116,129,  0,172,127, 42,242,229,246,229,242,243,\n    229,100,128, 35, 16,239,114,128, 34, 40,236,233,238,231,244,232,\n    225,105,128, 14, 37,238,231,115,128,  1,127,247,236,233,238,101,\n      2,127, 85,127,108, 99,  2,127, 91,127,103,229,238,244,229,242,\n    236,233,238,101,128,254, 78,237, 98,128,  3, 50,228,225,243,232,\n    229,100,128,254, 77,250,229,238,231,101,128, 37,202,240,225,242,\n    229,110,128, 36,167,115,  3,127,141,127,148,127,156,236,225,243,\n    104,128,  1, 66,241,245,225,242,101,128, 33, 19,245,240,229,242,\n    233,239,114,128,246,238,244,243,232,225,228,101,128, 37,145,245,\n    244,232,225,105,128, 14, 38,246,239,227,225,236,233, 99,  3,127,\n    197,127,207,127,214,226,229,238,231,225,236,105,128,  9,140,228,\n    229,246, 97,128,  9, 12,246,239,247,229,236,243,233,231,110,  2,\n    127,228,127,238,226,229,238,231,225,236,105,128,  9,226,228,229,\n    246, 97,128,  9, 98,248,243,241,245,225,242,101,128, 51,211,109,\n    144,  0,109,128, 35,130,144,130,169,130,196,130,221,132, 18,132,\n     40,133, 95,133,125,133,174,134, 25,134, 47,134, 72,134, 81,135,\n    108,135,136, 97, 12,128, 61,128, 71,128,135,128,142,128,167,128,\n    215,130, 51,130, 76,130, 81,130, 95,130,107,130,112,226,229,238,\n    231,225,236,105,128,  9,174, 99,  2,128, 77,128,129,242,239,110,\n    132,  0,175,128, 91,128,102,128,108,128,117,226,229,236,239,247,\n    227,237, 98,128,  3, 49,227,237, 98,128,  3,  4,236,239,247,237,\n    239,100,128,  2,205,237,239,238,239,243,240,225,227,101,128,255,\n    227,245,244,101,128, 30, 63,228,229,246, 97,128,  9, 46,231,117,\n      2,128,149,128,158,234,225,242,225,244,105,128, 10,174,242,237,\n    245,235,232,105,128, 10, 46,104,  2,128,173,128,205,225,240,225,\n    235,104,  2,128,183,128,192,232,229,226,242,229,119,128,  5,164,\n    236,229,230,244,232,229,226,242,229,119,128,  5,164,233,242,225,\n    231,225,238, 97,128, 48,126,105,  5,128,227,129, 40,129,103,129,\n    133,130, 39,227,232,225,244,244,225,247, 97,  3,128,242,129, 17,\n    129, 24,236,239,119,  2,128,250,129,  5,236,229,230,244,244,232,\n    225,105,128,248,149,242,233,231,232,244,244,232,225,105,128,248,\n    148,244,232,225,105,128, 14, 75,245,240,240,229,242,236,229,230,\n    244,244,232,225,105,128,248,147,229,107,  3,129, 49,129, 80,129,\n     87,236,239,119,  2,129, 57,129, 68,236,229,230,244,244,232,225,\n    105,128,248,140,242,233,231,232,244,244,232,225,105,128,248,139,\n    244,232,225,105,128, 14, 72,245,240,240,229,242,236,229,230,244,\n    244,232,225,105,128,248,138,232,225,238,225,235,225,116,  2,129,\n    115,129,126,236,229,230,244,244,232,225,105,128,248,132,244,232,\n    225,105,128, 14, 49,116,  3,129,141,129,169,129,232,225,233,235,\n    232,117,  2,129,151,129,162,236,229,230,244,244,232,225,105,128,\n    248,137,244,232,225,105,128, 14, 71,232,111,  3,129,178,129,209,\n    129,216,236,239,119,  2,129,186,129,197,236,229,230,244,244,232,\n    225,105,128,248,143,242,233,231,232,244,244,232,225,105,128,248,\n    142,244,232,225,105,128, 14, 73,245,240,240,229,242,236,229,230,\n    244,244,232,225,105,128,248,141,242,105,  3,129,241,130, 16,130,\n     23,236,239,119,  2,129,249,130,  4,236,229,230,244,244,232,225,\n    105,128,248,146,242,233,231,232,244,244,232,225,105,128,248,145,\n    244,232,225,105,128, 14, 74,245,240,240,229,242,236,229,230,244,\n    244,232,225,105,128,248,144,249,225,237,239,235,244,232,225,105,\n    128, 14, 70,235,225,244,225,235,225,238, 97,129, 48,222,130, 64,\n    232,225,236,230,247,233,228,244,104,128,255,143,236,101,128, 38,\n     66,238,243,249,239,238,243,241,245,225,242,101,128, 51, 71,241,\n    225,230,232,229,226,242,229,119,128,  5,190,242,115,128, 38, 66,\n    115,  2,130,118,130,136,239,242,225,227,233,242,227,236,229,232,\n    229,226,242,229,119,128,  5,175,241,245,225,242,101,128, 51,131,\n     98,  2,130,150,130,160,239,240,239,237,239,230,111,128, 49,  7,\n    243,241,245,225,242,101,128, 51,212, 99,  2,130,175,130,183,233,\n    242,227,236,101,128, 36,220,245,226,229,228,243,241,245,225,242,\n    101,128, 51,165,228,239,116,  2,130,204,130,213,225,227,227,229,\n    238,116,128, 30, 65,226,229,236,239,119,128, 30, 67,101,  7,130,\n    237,131,108,131,119,131,134,131,159,131,196,131,208,101,  2,130,\n    243,131, 95,109,  4,130,253,131,  6,131, 20,131, 36,225,242,225,\n    226,233, 99,128,  6, 69,230,233,238,225,236,225,242,225,226,233,\n     99,128,254,226,233,238,233,244,233,225,236,225,242,225,226,233,\n     99,128,254,227,237,101,  2,131, 43,131, 56,228,233,225,236,225,\n    242,225,226,233, 99,128,254,228,229,237,105,  2,131, 64,131, 79,\n    238,233,244,233,225,236,225,242,225,226,233, 99,128,252,209,243,\n    239,236,225,244,229,228,225,242,225,226,233, 99,128,252, 72,244,\n    239,242,245,243,241,245,225,242,101,128, 51, 77,232,233,242,225,\n    231,225,238, 97,128, 48,129,233,250,233,229,242,225,243,241,245,\n    225,242,101,128, 51,126,235,225,244,225,235,225,238, 97,129, 48,\n    225,131,147,232,225,236,230,247,233,228,244,104,128,255,146,109,\n    130,  5,222,131,167,131,187,228,225,231,229,243,104,129,251, 62,\n    131,178,232,229,226,242,229,119,128,251, 62,232,229,226,242,229,\n    119,128,  5,222,238,225,242,237,229,238,233,225,110,128,  5,116,\n    242,235,232, 97,  3,131,219,131,228,132,  5,232,229,226,242,229,\n    119,128,  5,165,235,229,230,245,236, 97,  2,131,239,131,248,232,\n    229,226,242,229,119,128,  5,166,236,229,230,244,232,229,226,242,\n    229,119,128,  5,166,236,229,230,244,232,229,226,242,229,119,128,\n      5,165,104,  2,132, 24,132, 30,239,239,107,128,  2,113,250,243,\n    241,245,225,242,101,128, 51,146,105,  6,132, 54,132, 91,132,228,\n    132,239,133,  8,133, 65,228,100,  2,132, 61,132, 86,236,229,228,\n    239,244,235,225,244,225,235,225,238,225,232,225,236,230,247,233,\n    228,244,104,128,255,101,239,116,128,  0,183,229,245,109,  5,132,\n    105,132,140,132,155,132,164,132,215, 97,  2,132,111,132,126,227,\n    233,242,227,236,229,235,239,242,229,225,110,128, 50,114,240,225,\n    242,229,238,235,239,242,229,225,110,128, 50, 18,227,233,242,227,\n    236,229,235,239,242,229,225,110,128, 50,100,235,239,242,229,225,\n    110,128, 49, 65,112,  2,132,170,132,202, 97,  2,132,176,132,190,\n    238,243,233,239,243,235,239,242,229,225,110,128, 49,112,242,229,\n    238,235,239,242,229,225,110,128, 50,  4,233,229,245,240,235,239,\n    242,229,225,110,128, 49,110,243,233,239,243,235,239,242,229,225,\n    110,128, 49,111,232,233,242,225,231,225,238, 97,128, 48,127,235,\n    225,244,225,235,225,238, 97,129, 48,223,132,252,232,225,236,230,\n    247,233,228,244,104,128,255,144,238,117,  2,133, 15,133, 60,115,\n    132, 34, 18,133, 27,133, 38,133, 47,133, 53,226,229,236,239,247,\n    227,237, 98,128,  3, 32,227,233,242,227,236,101,128, 34,150,237,\n    239,100,128,  2,215,240,236,245,115,128, 34, 19,244,101,128, 32,\n     50,242,105,  2,133, 72,133, 86,226,225,225,242,245,243,241,245,\n    225,242,101,128, 51, 74,243,241,245,225,242,101,128, 51, 73,108,\n      2,133,101,133,116,239,238,231,236,229,231,244,245,242,238,229,\n    100,128,  2,112,243,241,245,225,242,101,128, 51,150,109,  3,133,\n    133,133,147,133,158,227,245,226,229,228,243,241,245,225,242,101,\n    128, 51,163,239,238,239,243,240,225,227,101,128,255, 77,243,241,\n    245,225,242,229,228,243,241,245,225,242,101,128, 51,159,111,  5,\n    133,186,133,212,133,237,133,247,134,  0,104,  2,133,192,133,202,\n    233,242,225,231,225,238, 97,128, 48,130,237,243,241,245,225,242,\n    101,128, 51,193,235,225,244,225,235,225,238, 97,129, 48,226,133,\n    225,232,225,236,230,247,233,228,244,104,128,255,147,236,243,241,\n    245,225,242,101,128, 51,214,237,225,244,232,225,105,128, 14, 33,\n    246,229,242,243,243,241,245,225,242,101,129, 51,167,134, 15,228,\n    243,241,245,225,242,101,128, 51,168,240, 97,  2,134, 32,134, 38,\n    242,229,110,128, 36,168,243,241,245,225,242,101,128, 51,171,115,\n      2,134, 53,134, 62,243,241,245,225,242,101,128, 51,179,245,240,\n    229,242,233,239,114,128,246,239,244,245,242,238,229,100,128,  2,\n    111,117,141,  0,181,134,111,134,115,134,125,134,149,134,159,134,\n    181,134,192,134,217,134,240,134,250,135, 24,135, 88,135, 98, 49,\n    128,  0,181,225,243,241,245,225,242,101,128, 51,130,227,104,  2,\n    134,132,134,142,231,242,229,225,244,229,114,128, 34,107,236,229,\n    243,115,128, 34,106,230,243,241,245,225,242,101,128, 51,140,103,\n      2,134,165,134,172,242,229,229,107,128,  3,188,243,241,245,225,\n    242,101,128, 51,141,232,233,242,225,231,225,238, 97,128, 48,128,\n    235,225,244,225,235,225,238, 97,129, 48,224,134,205,232,225,236,\n    230,247,233,228,244,104,128,255,145,108,  2,134,223,134,232,243,\n    241,245,225,242,101,128, 51,149,244,233,240,236,121,128,  0,215,\n    237,243,241,245,225,242,101,128, 51,155,238,225,104,  2,135,  2,\n    135, 11,232,229,226,242,229,119,128,  5,163,236,229,230,244,232,\n    229,226,242,229,119,128,  5,163,115,  2,135, 30,135, 79,233, 99,\n      3,135, 39,135, 56,135, 67,225,236,238,239,244,101,129, 38,106,\n    135, 50,228,226,108,128, 38,107,230,236,225,244,243,233,231,110,\n    128, 38,109,243,232,225,242,240,243,233,231,110,128, 38,111,243,\n    241,245,225,242,101,128, 51,178,246,243,241,245,225,242,101,128,\n     51,182,247,243,241,245,225,242,101,128, 51,188,118,  2,135,114,\n    135,127,237,229,231,225,243,241,245,225,242,101,128, 51,185,243,\n    241,245,225,242,101,128, 51,183,119,  2,135,142,135,155,237,229,\n    231,225,243,241,245,225,242,101,128, 51,191,243,241,245,225,242,\n    101,128, 51,189,110,150,  0,110,135,212,136, 90,136,114,136,180,\n    136,205,137,  7,137, 17,137, 84,137,127,139,161,139,179,139,204,\n    139,235,140,  5,140, 70,142, 52,142, 60,142, 85,142, 93,143, 61,\n    143, 71,143, 81, 97,  8,135,230,135,250,136,  1,136,  8,136, 33,\n    136, 44,136, 69,136, 81, 98,  2,135,236,135,245,229,238,231,225,\n    236,105,128,  9,168,236, 97,128, 34,  7,227,245,244,101,128,  1,\n     68,228,229,246, 97,128,  9, 40,231,117,  2,136, 15,136, 24,234,\n    225,242,225,244,105,128, 10,168,242,237,245,235,232,105,128, 10,\n     40,232,233,242,225,231,225,238, 97,128, 48,106,235,225,244,225,\n    235,225,238, 97,129, 48,202,136, 57,232,225,236,230,247,233,228,\n    244,104,128,255,133,240,239,243,244,242,239,240,232,101,128,  1,\n     73,243,241,245,225,242,101,128, 51,129, 98,  2,136, 96,136,106,\n    239,240,239,237,239,230,111,128, 49, 11,243,240,225,227,101,128,\n      0,160, 99,  4,136,124,136,131,136,140,136,167,225,242,239,110,\n    128,  1, 72,229,228,233,236,236, 97,128,  1, 70,233,242, 99,  2,\n    136,148,136,153,236,101,128, 36,221,245,237,230,236,229,248,226,\n    229,236,239,119,128, 30, 75,239,237,237,225,225,227,227,229,238,\n    116,128,  1, 70,228,239,116,  2,136,188,136,197,225,227,227,229,\n    238,116,128, 30, 69,226,229,236,239,119,128, 30, 71,101,  3,136,\n    213,136,224,136,249,232,233,242,225,231,225,238, 97,128, 48,109,\n    235,225,244,225,235,225,238, 97,129, 48,205,136,237,232,225,236,\n    230,247,233,228,244,104,128,255,136,247,243,232,229,241,229,236,\n    243,233,231,110,128, 32,170,230,243,241,245,225,242,101,128, 51,\n    139,103,  2,137, 23,137, 73, 97,  3,137, 31,137, 41,137, 48,226,\n    229,238,231,225,236,105,128,  9,153,228,229,246, 97,128,  9, 25,\n    231,117,  2,137, 55,137, 64,234,225,242,225,244,105,128, 10,153,\n    242,237,245,235,232,105,128, 10, 25,239,238,231,245,244,232,225,\n    105,128, 14,  7,104,  2,137, 90,137,100,233,242,225,231,225,238,\n     97,128, 48,147,239,239,107,  2,137,108,137,115,236,229,230,116,\n    128,  2,114,242,229,244,242,239,230,236,229,120,128,  2,115,105,\n      4,137,137,138, 50,138, 61,138,119,229,245,110,  7,137,155,137,\n    190,137,222,137,236,137,245,138, 22,138, 35, 97,  2,137,161,137,\n    176,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,111,\n    240,225,242,229,238,235,239,242,229,225,110,128, 50, 15,227,105,\n      2,137,197,137,209,229,245,227,235,239,242,229,225,110,128, 49,\n     53,242,227,236,229,235,239,242,229,225,110,128, 50, 97,232,233,\n    229,245,232,235,239,242,229,225,110,128, 49, 54,235,239,242,229,\n    225,110,128, 49, 52,240, 97,  2,137,252,138, 10,238,243,233,239,\n    243,235,239,242,229,225,110,128, 49,104,242,229,238,235,239,242,\n    229,225,110,128, 50,  1,243,233,239,243,235,239,242,229,225,110,\n    128, 49,103,244,233,235,229,245,244,235,239,242,229,225,110,128,\n     49,102,232,233,242,225,231,225,238, 97,128, 48,107,107,  2,138,\n     67,138, 91,225,244,225,235,225,238, 97,129, 48,203,138, 79,232,\n    225,236,230,247,233,228,244,104,128,255,134,232,225,232,233,116,\n      2,138,101,138,112,236,229,230,244,244,232,225,105,128,248,153,\n    244,232,225,105,128, 14, 77,238,101,141,  0, 57,138,150,138,159,\n    138,169,138,199,138,206,138,231,139,  2,139, 36,139, 48,139, 59,\n    139, 92,139,100,139,111,225,242,225,226,233, 99,128,  6,105,226,\n    229,238,231,225,236,105,128,  9,239,227,233,242,227,236,101,129,\n     36,104,138,180,233,238,246,229,242,243,229,243,225,238,243,243,\n    229,242,233,102,128, 39,146,228,229,246, 97,128,  9,111,231,117,\n      2,138,213,138,222,234,225,242,225,244,105,128, 10,239,242,237,\n    245,235,232,105,128, 10,111,232, 97,  2,138,238,138,249,227,235,\n    225,242,225,226,233, 99,128,  6,105,238,231,250,232,239,117,128,\n     48, 41,105,  2,139,  8,139, 26,228,229,239,231,242,225,240,232,\n    233,227,240,225,242,229,110,128, 50, 40,238,230,229,242,233,239,\n    114,128, 32,137,237,239,238,239,243,240,225,227,101,128,255, 25,\n    239,236,228,243,244,249,236,101,128,247, 57,112,  2,139, 65,139,\n     72,225,242,229,110,128, 36,124,229,114,  2,139, 79,139, 85,233,\n    239,100,128, 36,144,243,233,225,110,128,  6,249,242,239,237,225,\n    110,128, 33,120,243,245,240,229,242,233,239,114,128, 32,121,116,\n      2,139,117,139,155,229,229,110,  2,139,125,139,134,227,233,242,\n    227,236,101,128, 36,114,112,  2,139,140,139,147,225,242,229,110,\n    128, 36,134,229,242,233,239,100,128, 36,154,232,225,105,128, 14,\n     89,106,129,  1,204,139,167,229,227,249,242,233,236,236,233, 99,\n    128,  4, 90,235,225,244,225,235,225,238, 97,129, 48,243,139,192,\n    232,225,236,230,247,233,228,244,104,128,255,157,108,  2,139,210,\n    139,224,229,231,242,233,231,232,244,236,239,238,103,128,  1,158,\n    233,238,229,226,229,236,239,119,128, 30, 73,109,  2,139,241,139,\n    252,239,238,239,243,240,225,227,101,128,255, 78,243,241,245,225,\n    242,101,128, 51,154,110,  2,140, 11,140, 61, 97,  3,140, 19,140,\n     29,140, 36,226,229,238,231,225,236,105,128,  9,163,228,229,246,\n     97,128,  9, 35,231,117,  2,140, 43,140, 52,234,225,242,225,244,\n    105,128, 10,163,242,237,245,235,232,105,128, 10, 35,238,225,228,\n    229,246, 97,128,  9, 41,111,  6,140, 84,140, 95,140,120,140,161,\n    141,113,142, 40,232,233,242,225,231,225,238, 97,128, 48,110,235,\n    225,244,225,235,225,238, 97,129, 48,206,140,108,232,225,236,230,\n    247,233,228,244,104,128,255,137,110,  3,140,128,140,144,140,153,\n    226,242,229,225,235,233,238,231,243,240,225,227,101,128,  0,160,\n    229,238,244,232,225,105,128, 14, 19,245,244,232,225,105,128, 14,\n     25,239,110,  7,140,178,140,187,140,201,140,235,140,251,141, 36,\n    141, 95,225,242,225,226,233, 99,128,  6, 70,230,233,238,225,236,\n    225,242,225,226,233, 99,128,254,230,231,232,245,238,238, 97,  2,\n    140,212,140,221,225,242,225,226,233, 99,128,  6,186,230,233,238,\n    225,236,225,242,225,226,233, 99,128,251,159,233,238,233,244,233,\n    225,236,225,242,225,226,233, 99,128,254,231,234,229,229,237,105,\n      2,141,  5,141, 20,238,233,244,233,225,236,225,242,225,226,233,\n     99,128,252,210,243,239,236,225,244,229,228,225,242,225,226,233,\n     99,128,252, 75,237,101,  2,141, 43,141, 56,228,233,225,236,225,\n    242,225,226,233, 99,128,254,232,229,237,105,  2,141, 64,141, 79,\n    238,233,244,233,225,236,225,242,225,226,233, 99,128,252,213,243,\n    239,236,225,244,229,228,225,242,225,226,233, 99,128,252, 78,238,\n    239,239,238,230,233,238,225,236,225,242,225,226,233, 99,128,252,\n    141,116,  7,141,129,141,140,141,169,141,204,141,216,141,236,142,\n      6,227,239,238,244,225,233,238,115,128, 34, 12,101,  2,141,146,\n    141,162,236,229,237,229,238,116,129, 34,  9,141,157,239,102,128,\n     34,  9,241,245,225,108,128, 34, 96,231,242,229,225,244,229,114,\n    129, 34,111,141,181,238,239,114,  2,141,189,141,197,229,241,245,\n    225,108,128, 34,113,236,229,243,115,128, 34,121,233,228,229,238,\n    244,233,227,225,108,128, 34, 98,236,229,243,115,129, 34,110,141,\n    225,238,239,242,229,241,245,225,108,128, 34,112,112,  2,141,242,\n    141,252,225,242,225,236,236,229,108,128, 34, 38,242,229,227,229,\n    228,229,115,128, 34,128,243,117,  3,142, 15,142, 22,142, 31,226,\n    243,229,116,128, 34,132,227,227,229,229,228,115,128, 34,129,240,\n    229,242,243,229,116,128, 34,133,247,225,242,237,229,238,233,225,\n    110,128,  5,118,240,225,242,229,110,128, 36,169,115,  2,142, 66,\n    142, 75,243,241,245,225,242,101,128, 51,177,245,240,229,242,233,\n    239,114,128, 32,127,244,233,236,228,101,128,  0,241,117,132,  3,\n    189,142,105,142,116,142,197,143, 24,232,233,242,225,231,225,238,\n     97,128, 48,108,107,  2,142,122,142,146,225,244,225,235,225,238,\n     97,129, 48,204,142,134,232,225,236,230,247,233,228,244,104,128,\n    255,135,244, 97,  3,142,155,142,165,142,172,226,229,238,231,225,\n    236,105,128,  9,188,228,229,246, 97,128,  9, 60,231,117,  2,142,\n    179,142,188,234,225,242,225,244,105,128, 10,188,242,237,245,235,\n    232,105,128, 10, 60,109,  2,142,203,142,237,226,229,242,243,233,\n    231,110,130,  0, 35,142,217,142,229,237,239,238,239,243,240,225,\n    227,101,128,255,  3,243,237,225,236,108,128,254, 95,229,114,  2,\n    142,244,143, 20,225,236,243,233,231,110,  2,142,255,143,  7,231,\n    242,229,229,107,128,  3,116,236,239,247,229,242,231,242,229,229,\n    107,128,  3,117,111,128, 33, 22,110,130,  5,224,143, 32,143, 52,\n    228,225,231,229,243,104,129,251, 64,143, 43,232,229,226,242,229,\n    119,128,251, 64,232,229,226,242,229,119,128,  5,224,246,243,241,\n    245,225,242,101,128, 51,181,247,243,241,245,225,242,101,128, 51,\n    187,249, 97,  3,143, 90,143,100,143,107,226,229,238,231,225,236,\n    105,128,  9,158,228,229,246, 97,128,  9, 30,231,117,  2,143,114,\n    143,123,234,225,242,225,244,105,128, 10,158,242,237,245,235,232,\n    105,128, 10, 30,111,147,  0,111,143,174,143,196,144, 18,144,188,\n    145,  4,145, 19,145, 59,145,182,145,203,145,241,145,252,146,174,\n    148,  8,148, 72,148,105,148,151,149, 24,149, 71,149, 83, 97,  2,\n    143,180,143,187,227,245,244,101,128,  0,243,238,231,244,232,225,\n    105,128, 14, 45, 98,  4,143,206,143,248,144,  1,144, 11,225,242,\n    242,229,100,130,  2,117,143,218,143,229,227,249,242,233,236,236,\n    233, 99,128,  4,233,228,233,229,242,229,243,233,243,227,249,242,\n    233,236,236,233, 99,128,  4,235,229,238,231,225,236,105,128,  9,\n    147,239,240,239,237,239,230,111,128, 49, 27,242,229,246,101,128,\n      1, 79, 99,  3,144, 26,144, 99,144,178, 97,  2,144, 32,144, 93,\n    238,228,242, 97,  3,144, 43,144, 50,144, 61,228,229,246, 97,128,\n      9, 17,231,245,234,225,242,225,244,105,128, 10,145,246,239,247,\n    229,236,243,233,231,110,  2,144, 75,144, 82,228,229,246, 97,128,\n      9, 73,231,245,234,225,242,225,244,105,128, 10,201,242,239,110,\n    128,  1,210,233,242, 99,  2,144,107,144,112,236,101,128, 36,222,\n    245,237,230,236,229,120,133,  0,244,144,131,144,139,144,150,144,\n    158,144,170,225,227,245,244,101,128, 30,209,228,239,244,226,229,\n    236,239,119,128, 30,217,231,242,225,246,101,128, 30,211,232,239,\n    239,235,225,226,239,246,101,128, 30,213,244,233,236,228,101,128,\n     30,215,249,242,233,236,236,233, 99,128,  4, 62,100,  4,144,198,\n    144,221,144,227,144,250,226,108,  2,144,205,144,213,225,227,245,\n    244,101,128,  1, 81,231,242,225,246,101,128,  2, 13,229,246, 97,\n    128,  9, 19,233,229,242,229,243,233,115,129,  0,246,144,239,227,\n    249,242,233,236,236,233, 99,128,  4,231,239,244,226,229,236,239,\n    119,128, 30,205,101,129,  1, 83,145, 10,235,239,242,229,225,110,\n    128, 49, 90,103,  3,145, 27,145, 42,145, 49,239,238,229,107,129,\n      2,219,145, 36,227,237, 98,128,  3, 40,242,225,246,101,128,  0,\n    242,245,234,225,242,225,244,105,128, 10,147,104,  4,145, 69,145,\n     80,145, 90,145,168,225,242,237,229,238,233,225,110,128,  5,133,\n    233,242,225,231,225,238, 97,128, 48, 74,111,  2,145, 96,145,106,\n    239,235,225,226,239,246,101,128, 30,207,242,110,133,  1,161,145,\n    121,145,129,145,140,145,148,145,160,225,227,245,244,101,128, 30,\n    219,228,239,244,226,229,236,239,119,128, 30,227,231,242,225,246,\n    101,128, 30,221,232,239,239,235,225,226,239,246,101,128, 30,223,\n    244,233,236,228,101,128, 30,225,245,238,231,225,242,245,237,236,\n    225,245,116,128,  1, 81,105,129,  1,163,145,188,238,246,229,242,\n    244,229,228,226,242,229,246,101,128,  2, 15,107,  2,145,209,145,\n    233,225,244,225,235,225,238, 97,129, 48,170,145,221,232,225,236,\n    230,247,233,228,244,104,128,255,117,239,242,229,225,110,128, 49,\n     87,236,229,232,229,226,242,229,119,128,  5,171,109,  6,146, 10,\n    146, 38,146, 45,146,134,146,145,146,163,225,227,242,239,110,130,\n      1, 77,146, 22,146, 30,225,227,245,244,101,128, 30, 83,231,242,\n    225,246,101,128, 30, 81,228,229,246, 97,128,  9, 80,229,231, 97,\n    133,  3,201,146, 61,146, 65,146, 76,146, 90,146,106, 49,128,  3,\n    214,227,249,242,233,236,236,233, 99,128,  4, 97,236,225,244,233,\n    238,227,236,239,243,229,100,128,  2,119,242,239,245,238,228,227,\n    249,242,233,236,236,233, 99,128,  4,123,116,  2,146,112,146,127,\n    233,244,236,239,227,249,242,233,236,236,233, 99,128,  4,125,239,\n    238,239,115,128,  3,206,231,245,234,225,242,225,244,105,128, 10,\n    208,233,227,242,239,110,129,  3,191,146,155,244,239,238,239,115,\n    128,  3,204,239,238,239,243,240,225,227,101,128,255, 79,238,101,\n    145,  0, 49,146,213,146,222,146,232,147,  6,147, 31,147, 40,147,\n     49,147, 74,147,108,147,142,147,154,147,173,147,184,147,217,147,\n    227,147,235,147,246,225,242,225,226,233, 99,128,  6, 97,226,229,\n    238,231,225,236,105,128,  9,231,227,233,242,227,236,101,129, 36,\n     96,146,243,233,238,246,229,242,243,229,243,225,238,243,243,229,\n    242,233,102,128, 39,138,100,  2,147, 12,147, 18,229,246, 97,128,\n      9,103,239,244,229,238,236,229,225,228,229,114,128, 32, 36,229,\n    233,231,232,244,104,128, 33, 91,230,233,244,244,229,100,128,246,\n    220,231,117,  2,147, 56,147, 65,234,225,242,225,244,105,128, 10,\n    231,242,237,245,235,232,105,128, 10,103,232, 97,  3,147, 83,147,\n     94,147, 99,227,235,225,242,225,226,233, 99,128,  6, 97,236,102,\n    128,  0,189,238,231,250,232,239,117,128, 48, 33,105,  2,147,114,\n    147,132,228,229,239,231,242,225,240,232,233,227,240,225,242,229,\n    110,128, 50, 32,238,230,229,242,233,239,114,128, 32,129,237,239,\n    238,239,243,240,225,227,101,128,255, 17,238,245,237,229,242,225,\n    244,239,242,226,229,238,231,225,236,105,128,  9,244,239,236,228,\n    243,244,249,236,101,128,247, 49,112,  2,147,190,147,197,225,242,\n    229,110,128, 36,116,229,114,  2,147,204,147,210,233,239,100,128,\n     36,136,243,233,225,110,128,  6,241,241,245,225,242,244,229,114,\n    128,  0,188,242,239,237,225,110,128, 33,112,243,245,240,229,242,\n    233,239,114,128,  0,185,244,104,  2,147,253,148,  2,225,105,128,\n     14, 81,233,242,100,128, 33, 83,111,  3,148, 16,148, 50,148, 66,\n    103,  2,148, 22,148, 40,239,238,229,107,129,  1,235,148, 31,237,\n    225,227,242,239,110,128,  1,237,245,242,237,245,235,232,105,128,\n     10, 19,237,225,244,242,225,231,245,242,237,245,235,232,105,128,\n     10, 75,240,229,110,128,  2, 84,112,  3,148, 80,148, 87,148, 98,\n    225,242,229,110,128, 36,170,229,238,226,245,236,236,229,116,128,\n     37,230,244,233,239,110,128, 35, 37,114,  2,148,111,148,140,100,\n      2,148,117,148,128,230,229,237,233,238,233,238,101,128,  0,170,\n    237,225,243,227,245,236,233,238,101,128,  0,186,244,232,239,231,\n    239,238,225,108,128, 34, 31,115,  5,148,163,148,195,148,212,149,\n      1,149, 14,232,239,242,116,  2,148,172,148,179,228,229,246, 97,\n    128,  9, 18,246,239,247,229,236,243,233,231,238,228,229,246, 97,\n    128,  9, 74,236,225,243,104,129,  0,248,148,204,225,227,245,244,\n    101,128,  1,255,237,225,236,108,  2,148,221,148,232,232,233,242,\n    225,231,225,238, 97,128, 48, 73,235,225,244,225,235,225,238, 97,\n    129, 48,169,148,245,232,225,236,230,247,233,228,244,104,128,255,\n    107,244,242,239,235,229,225,227,245,244,101,128,  1,255,245,240,\n    229,242,233,239,114,128,246,240,116,  2,149, 30,149, 41,227,249,\n    242,233,236,236,233, 99,128,  4,127,233,236,228,101,130,  0,245,\n    149, 52,149, 60,225,227,245,244,101,128, 30, 77,228,233,229,242,\n    229,243,233,115,128, 30, 79,245,226,239,240,239,237,239,230,111,\n    128, 49, 33,118,  2,149, 89,149,170,229,114,  2,149, 96,149,162,\n    236,233,238,101,131, 32, 62,149,109,149,132,149,155, 99,  2,149,\n    115,149,127,229,238,244,229,242,236,233,238,101,128,254, 74,237,\n     98,128,  3,  5,100,  2,149,138,149,146,225,243,232,229,100,128,\n    254, 73,226,236,247,225,246,121,128,254, 76,247,225,246,121,128,\n    254, 75,243,227,239,242,101,128,  0,175,239,247,229,236,243,233,\n    231,110,  3,149,185,149,195,149,202,226,229,238,231,225,236,105,\n    128,  9,203,228,229,246, 97,128,  9, 75,231,245,234,225,242,225,\n    244,105,128, 10,203,112,145,  0,112,149,251,152,123,152,134,152,\n    143,152,155,154, 80,154, 90,155, 82,156,101,156,191,156,217,157,\n     92,157,100,158,  2,158, 60,158, 88,158, 98, 97, 14,150, 25,150,\n     57,150, 67,150, 74,150, 81,150,129,150,140,150,154,150,165,150,\n    212,150,226,151,238,152, 21,152,111, 97,  2,150, 31,150, 43,237,\n    240,243,243,241,245,225,242,101,128, 51,128,243,229,238,244,239,\n    243,241,245,225,242,101,128, 51, 43,226,229,238,231,225,236,105,\n    128,  9,170,227,245,244,101,128, 30, 85,228,229,246, 97,128,  9,\n     42,103,  2,150, 87,150,105,101,  2,150, 93,150,100,228,239,247,\n    110,128, 33,223,245,112,128, 33,222,117,  2,150,111,150,120,234,\n    225,242,225,244,105,128, 10,170,242,237,245,235,232,105,128, 10,\n     42,232,233,242,225,231,225,238, 97,128, 48,113,233,249,225,238,\n    238,239,233,244,232,225,105,128, 14, 47,235,225,244,225,235,225,\n    238, 97,128, 48,209,108,  2,150,171,150,196,225,244,225,236,233,\n    250,225,244,233,239,238,227,249,242,233,236,236,233,227,227,237,\n     98,128,  4,132,239,227,232,235,225,227,249,242,233,236,236,233,\n     99,128,  4,192,238,243,233,239,243,235,239,242,229,225,110,128,\n     49,127,114,  3,150,234,150,255,151,227, 97,  2,150,240,150,248,\n    231,242,225,240,104,128,  0,182,236,236,229,108,128, 34, 37,229,\n    110,  2,151,  6,151,116,236,229,230,116,136,  0, 40,151, 29,151,\n     44,151, 49,151, 54,151, 65,151, 77,151,100,151,105,225,236,244,\n    239,238,229,225,242,225,226,233, 99,128,253, 62,226,116,128,248,\n    237,229,120,128,248,236,233,238,230,229,242,233,239,114,128, 32,\n    141,237,239,238,239,243,240,225,227,101,128,255,  8,115,  2,151,\n     83,151, 90,237,225,236,108,128,254, 89,245,240,229,242,233,239,\n    114,128, 32,125,244,112,128,248,235,246,229,242,244,233,227,225,\n    108,128,254, 53,242,233,231,232,116,136,  0, 41,151,140,151,155,\n    151,160,151,165,151,176,151,188,151,211,151,216,225,236,244,239,\n    238,229,225,242,225,226,233, 99,128,253, 63,226,116,128,248,248,\n    229,120,128,248,247,233,238,230,229,242,233,239,114,128, 32,142,\n    237,239,238,239,243,240,225,227,101,128,255,  9,115,  2,151,194,\n    151,201,237,225,236,108,128,254, 90,245,240,229,242,233,239,114,\n    128, 32,126,244,112,128,248,246,246,229,242,244,233,227,225,108,\n    128,254, 54,244,233,225,236,228,233,230,102,128, 34,  2,115,  3,\n    151,246,152,  1,152, 13,229,241,232,229,226,242,229,119,128,  5,\n    192,232,244,225,232,229,226,242,229,119,128,  5,153,241,245,225,\n    242,101,128, 51,169,244,225,104,134,  5,183,152, 39,152, 53,152,\n     58,152, 67,152, 82,152, 98, 49,  2,152, 45,152, 49, 49,128,  5,\n    183,100,128,  5,183,178, 97,128,  5,183,232,229,226,242,229,119,\n    128,  5,183,238,225,242,242,239,247,232,229,226,242,229,119,128,\n      5,183,241,245,225,242,244,229,242,232,229,226,242,229,119,128,\n      5,183,247,233,228,229,232,229,226,242,229,119,128,  5,183,250,\n    229,242,232,229,226,242,229,119,128,  5,161,226,239,240,239,237,\n    239,230,111,128, 49,  6,227,233,242,227,236,101,128, 36,223,228,\n    239,244,225,227,227,229,238,116,128, 30, 87,101,137,  5,228,152,\n    177,152,188,152,208,152,220,152,240,153, 86,153, 97,153,118,154,\n     73,227,249,242,233,236,236,233, 99,128,  4, 63,228,225,231,229,\n    243,104,129,251, 68,152,199,232,229,226,242,229,119,128,251, 68,\n    229,250,233,243,241,245,225,242,101,128, 51, 59,230,233,238,225,\n    236,228,225,231,229,243,232,232,229,226,242,229,119,128,251, 67,\n    104,  5,152,252,153, 19,153, 27,153, 41,153, 71,225,114,  2,153,\n      3,153, 10,225,226,233, 99,128,  6,126,237,229,238,233,225,110,\n    128,  5,122,229,226,242,229,119,128,  5,228,230,233,238,225,236,\n    225,242,225,226,233, 99,128,251, 87,105,  2,153, 47,153, 62,238,\n    233,244,233,225,236,225,242,225,226,233, 99,128,251, 88,242,225,\n    231,225,238, 97,128, 48,122,237,229,228,233,225,236,225,242,225,\n    226,233, 99,128,251, 89,235,225,244,225,235,225,238, 97,128, 48,\n    218,237,233,228,228,236,229,232,239,239,235,227,249,242,233,236,\n    236,233, 99,128,  4,167,114,  5,153,130,153,142,153,184,154, 49,\n    154, 62,225,230,229,232,229,226,242,229,119,128,251, 78,227,229,\n    238,116,131,  0, 37,153,155,153,164,153,176,225,242,225,226,233,\n     99,128,  6,106,237,239,238,239,243,240,225,227,101,128,255,  5,\n    243,237,225,236,108,128,254,106,105,  2,153,190,154, 31,239,100,\n    134,  0, 46,153,207,153,218,153,229,153,241,153,252,154,  8,225,\n    242,237,229,238,233,225,110,128,  5,137,227,229,238,244,229,242,\n    229,100,128,  0,183,232,225,236,230,247,233,228,244,104,128,255,\n     97,233,238,230,229,242,233,239,114,128,246,231,237,239,238,239,\n    243,240,225,227,101,128,255, 14,115,  2,154, 14,154, 21,237,225,\n    236,108,128,254, 82,245,240,229,242,233,239,114,128,246,232,243,\n    240,239,237,229,238,233,231,242,229,229,235,227,237, 98,128,  3,\n     66,240,229,238,228,233,227,245,236,225,114,128, 34,165,244,232,\n    239,245,243,225,238,100,128, 32, 48,243,229,244, 97,128, 32,167,\n    230,243,241,245,225,242,101,128, 51,138,104,  3,154, 98,154,148,\n    155, 29, 97,  3,154,106,154,116,154,123,226,229,238,231,225,236,\n    105,128,  9,171,228,229,246, 97,128,  9, 43,231,117,  2,154,130,\n    154,139,234,225,242,225,244,105,128, 10,171,242,237,245,235,232,\n    105,128, 10, 43,105,133,  3,198,154,162,154,166,154,252,155,  4,\n    155, 15, 49,128,  3,213,229,245,240,104,  4,154,179,154,214,154,\n    229,154,238, 97,  2,154,185,154,200,227,233,242,227,236,229,235,\n    239,242,229,225,110,128, 50,122,240,225,242,229,238,235,239,242,\n    229,225,110,128, 50, 26,227,233,242,227,236,229,235,239,242,229,\n    225,110,128, 50,108,235,239,242,229,225,110,128, 49, 77,240,225,\n    242,229,238,235,239,242,229,225,110,128, 50, 12,236,225,244,233,\n    110,128,  2,120,238,244,232,245,244,232,225,105,128, 14, 58,243,\n    249,237,226,239,236,231,242,229,229,107,128,  3,213,111,  3,155,\n     37,155, 42,155, 68,239,107,128,  1,165,240,104,  2,155, 49,155,\n     58,225,238,244,232,225,105,128, 14, 30,245,238,231,244,232,225,\n    105,128, 14, 28,243,225,237,240,232,225,239,244,232,225,105,128,\n     14, 32,105,133,  3,192,155, 96,156, 52,156, 63,156, 74,156, 88,\n    229,245,112,  6,155,112,155,147,155,179,155,207,155,221,156, 17,\n     97,  2,155,118,155,133,227,233,242,227,236,229,235,239,242,229,\n    225,110,128, 50,115,240,225,242,229,238,235,239,242,229,225,110,\n    128, 50, 19,227,105,  2,155,154,155,166,229,245,227,235,239,242,\n    229,225,110,128, 49,118,242,227,236,229,235,239,242,229,225,110,\n    128, 50,101,107,  2,155,185,155,199,233,249,229,239,235,235,239,\n    242,229,225,110,128, 49,114,239,242,229,225,110,128, 49, 66,240,\n    225,242,229,238,235,239,242,229,225,110,128, 50,  5,243,233,239,\n    115,  2,155,230,156,  2,107,  2,155,236,155,250,233,249,229,239,\n    235,235,239,242,229,225,110,128, 49,116,239,242,229,225,110,128,\n     49, 68,244,233,235,229,245,244,235,239,242,229,225,110,128, 49,\n    117,116,  2,156, 23,156, 38,232,233,229,245,244,232,235,239,242,\n    229,225,110,128, 49,119,233,235,229,245,244,235,239,242,229,225,\n    110,128, 49,115,232,233,242,225,231,225,238, 97,128, 48,116,235,\n    225,244,225,235,225,238, 97,128, 48,212,243,249,237,226,239,236,\n    231,242,229,229,107,128,  3,214,247,242,225,242,237,229,238,233,\n    225,110,128,  5,131,236,245,115,132,  0, 43,156,115,156,126,156,\n    135,156,168,226,229,236,239,247,227,237, 98,128,  3, 31,227,233,\n    242,227,236,101,128, 34,149,109,  2,156,141,156,148,233,238,245,\n    115,128,  0,177,111,  2,156,154,156,158,100,128,  2,214,238,239,\n    243,240,225,227,101,128,255, 11,115,  2,156,174,156,181,237,225,\n    236,108,128,254, 98,245,240,229,242,233,239,114,128, 32,122,109,\n      2,156,197,156,208,239,238,239,243,240,225,227,101,128,255, 80,\n    243,241,245,225,242,101,128, 51,216,111,  5,156,229,156,240,157,\n     51,157, 62,157, 72,232,233,242,225,231,225,238, 97,128, 48,125,\n    233,238,244,233,238,231,233,238,228,229,120,  4,157,  4,157, 16,\n    157, 28,157, 41,228,239,247,238,247,232,233,244,101,128, 38, 31,\n    236,229,230,244,247,232,233,244,101,128, 38, 28,242,233,231,232,\n    244,247,232,233,244,101,128, 38, 30,245,240,247,232,233,244,101,\n    128, 38, 29,235,225,244,225,235,225,238, 97,128, 48,221,240,236,\n    225,244,232,225,105,128, 14, 27,243,244,225,236,237,225,242,107,\n    129, 48, 18,157, 85,230,225,227,101,128, 48, 32,240,225,242,229,\n    110,128, 36,171,114,  3,157,108,157,134,157,159,101,  2,157,114,\n    157,122,227,229,228,229,115,128, 34,122,243,227,242,233,240,244,\n    233,239,110,128, 33, 30,233,237,101,  2,157,142,157,148,237,239,\n    100,128,  2,185,242,229,246,229,242,243,229,100,128, 32, 53,111,\n      4,157,169,157,176,157,186,157,199,228,245,227,116,128, 34, 15,\n    234,229,227,244,233,246,101,128, 35,  5,236,239,238,231,229,228,\n    235,225,238, 97,128, 48,252,112,  2,157,205,157,242,101,  2,157,\n    211,157,218,236,236,239,114,128, 35, 24,242,243,117,  2,157,226,\n    157,233,226,243,229,116,128, 34,130,240,229,242,243,229,116,128,\n     34,131,239,242,244,233,239,110,129, 34, 55,157,253,225,108,128,\n     34, 29,115,  2,158,  8,158, 51,105,130,  3,200,158, 16,158, 27,\n    227,249,242,233,236,236,233, 99,128,  4,113,236,233,240,238,229,\n    245,237,225,244,225,227,249,242,233,236,236,233,227,227,237, 98,\n    128,  4,134,243,241,245,225,242,101,128, 51,176,117,  2,158, 66,\n    158, 77,232,233,242,225,231,225,238, 97,128, 48,119,235,225,244,\n    225,235,225,238, 97,128, 48,215,246,243,241,245,225,242,101,128,\n     51,180,247,243,241,245,225,242,101,128, 51,186,113,136,  0,113,\n    158,128,159,177,159,188,159,197,159,204,159,216,159,254,160,  6,\n     97,  4,158,138,158,161,158,225,159,160,100,  2,158,144,158,150,\n    229,246, 97,128,  9, 88,237,225,232,229,226,242,229,119,128,  5,\n    168,102,  4,158,171,158,180,158,194,158,210,225,242,225,226,233,\n     99,128,  6, 66,230,233,238,225,236,225,242,225,226,233, 99,128,\n    254,214,233,238,233,244,233,225,236,225,242,225,226,233, 99,128,\n    254,215,237,229,228,233,225,236,225,242,225,226,233, 99,128,254,\n    216,237,225,244,115,136,  5,184,158,248,159, 12,159, 26,159, 31,\n    159, 36,159, 45,159, 60,159,147, 49,  3,159,  0,159,  4,159,  8,\n     48,128,  5,184, 97,128,  5,184, 99,128,  5,184, 50,  2,159, 18,\n    159, 22, 55,128,  5,184, 57,128,  5,184,179, 51,128,  5,184,228,\n    101,128,  5,184,232,229,226,242,229,119,128,  5,184,238,225,242,\n    242,239,247,232,229,226,242,229,119,128,  5,184,113,  2,159, 66,\n    159,132,225,244,225,110,  4,159, 79,159, 88,159,103,159,119,232,\n    229,226,242,229,119,128,  5,184,238,225,242,242,239,247,232,229,\n    226,242,229,119,128,  5,184,241,245,225,242,244,229,242,232,229,\n    226,242,229,119,128,  5,184,247,233,228,229,232,229,226,242,229,\n    119,128,  5,184,245,225,242,244,229,242,232,229,226,242,229,119,\n    128,  5,184,247,233,228,229,232,229,226,242,229,119,128,  5,184,\n    242,238,229,249,240,225,242,225,232,229,226,242,229,119,128,  5,\n    159,226,239,240,239,237,239,230,111,128, 49, 17,227,233,242,227,\n    236,101,128, 36,224,232,239,239,107,128,  2,160,237,239,238,239,\n    243,240,225,227,101,128,255, 81,239,102,130,  5,231,159,225,159,\n    245,228,225,231,229,243,104,129,251, 71,159,236,232,229,226,242,\n    229,119,128,251, 71,232,229,226,242,229,119,128,  5,231,240,225,\n    242,229,110,128, 36,172,117,  4,160, 16,160, 28,160,117,160,204,\n    225,242,244,229,242,238,239,244,101,128, 38,105,226,245,244,115,\n    135,  5,187,160, 49,160, 54,160, 59,160, 64,160, 73,160, 88,160,\n    104,177, 56,128,  5,187,178, 53,128,  5,187,179, 49,128,  5,187,\n    232,229,226,242,229,119,128,  5,187,238,225,242,242,239,247,232,\n    229,226,242,229,119,128,  5,187,241,245,225,242,244,229,242,232,\n    229,226,242,229,119,128,  5,187,247,233,228,229,232,229,226,242,\n    229,119,128,  5,187,229,243,244,233,239,110,133,  0, 63,160,136,\n    160,159,160,176,160,184,160,196,225,114,  2,160,143,160,150,225,\n    226,233, 99,128,  6, 31,237,229,238,233,225,110,128,  5, 94,228,\n    239,247,110,129,  0,191,160,168,243,237,225,236,108,128,247,191,\n    231,242,229,229,107,128,  3,126,237,239,238,239,243,240,225,227,\n    101,128,255, 31,243,237,225,236,108,128,247, 63,239,244,101,  4,\n    160,216,161, 31,161, 51,161, 80,228,226,108,133,  0, 34,160,232,\n    160,239,160,246,161,  2,161, 23,226,225,243,101,128, 32, 30,236,\n    229,230,116,128, 32, 28,237,239,238,239,243,240,225,227,101,128,\n    255,  2,240,242,233,237,101,129, 48, 30,161, 12,242,229,246,229,\n    242,243,229,100,128, 48, 29,242,233,231,232,116,128, 32, 29,236,\n    229,230,116,129, 32, 24,161, 40,242,229,246,229,242,243,229,100,\n    128, 32, 27,114,  2,161, 57,161, 67,229,246,229,242,243,229,100,\n    128, 32, 27,233,231,232,116,129, 32, 25,161, 76,110,128,  1, 73,\n    243,233,238,231,108,  2,161, 90,161, 97,226,225,243,101,128, 32,\n     26,101,129,  0, 39,161,103,237,239,238,239,243,240,225,227,101,\n    128,255,  7,114,145,  0,114,161,153,162,157,162,168,162,215,163,\n     10,164, 27,164, 51,164,146,166,180,166,217,166,229,167, 27,167,\n     35,167,197,167,208,167,243,168, 87, 97, 11,161,177,161,188,161,\n    198,161,205,162, 14,162, 30,162, 55,162, 66,162, 91,162,114,162,\n    151,225,242,237,229,238,233,225,110,128,  5,124,226,229,238,231,\n    225,236,105,128,  9,176,227,245,244,101,128,  1, 85,100,  4,161,\n    215,161,221,161,235,162,  5,229,246, 97,128,  9, 48,233,227,225,\n    108,129, 34, 26,161,230,229,120,128,248,229,239,246,229,242,243,\n    243,241,245,225,242,101,129, 51,174,161,251,228,243,241,245,225,\n    242,101,128, 51,175,243,241,245,225,242,101,128, 51,173,230,101,\n    129,  5,191,162, 21,232,229,226,242,229,119,128,  5,191,231,117,\n      2,162, 37,162, 46,234,225,242,225,244,105,128, 10,176,242,237,\n    245,235,232,105,128, 10, 48,232,233,242,225,231,225,238, 97,128,\n     48,137,235,225,244,225,235,225,238, 97,129, 48,233,162, 79,232,\n    225,236,230,247,233,228,244,104,128,255,151,236,239,247,229,242,\n    228,233,225,231,239,238,225,236,226,229,238,231,225,236,105,128,\n      9,241,109,  2,162,120,162,143,233,228,228,236,229,228,233,225,\n    231,239,238,225,236,226,229,238,231,225,236,105,128,  9,240,243,\n    232,239,242,110,128,  2,100,244,233,111,128, 34, 54,226,239,240,\n    239,237,239,230,111,128, 49, 22, 99,  4,162,178,162,185,162,194,\n    162,202,225,242,239,110,128,  1, 89,229,228,233,236,236, 97,128,\n      1, 87,233,242,227,236,101,128, 36,225,239,237,237,225,225,227,\n    227,229,238,116,128,  1, 87,100,  2,162,221,162,231,226,236,231,\n    242,225,246,101,128,  2, 17,239,116,  2,162,238,162,247,225,227,\n    227,229,238,116,128, 30, 89,226,229,236,239,119,129, 30, 91,163,\n      1,237,225,227,242,239,110,128, 30, 93,101,  6,163, 24,163, 69,\n    163,104,163,159,163,184,163,217,102,  2,163, 30,163, 43,229,242,\n    229,238,227,229,237,225,242,107,128, 32, 59,236,229,248,243,117,\n      2,163, 53,163, 60,226,243,229,116,128, 34,134,240,229,242,243,\n    229,116,128, 34,135,231,233,243,244,229,114,  2,163, 80,163, 85,\n    229,100,128,  0,174,115,  2,163, 91,163, 97,225,238,115,128,248,\n    232,229,242,233,102,128,246,218,104,  3,163,112,163,135,163,149,\n    225,114,  2,163,119,163,126,225,226,233, 99,128,  6, 49,237,229,\n    238,233,225,110,128,  5,128,230,233,238,225,236,225,242,225,226,\n    233, 99,128,254,174,233,242,225,231,225,238, 97,128, 48,140,235,\n    225,244,225,235,225,238, 97,129, 48,236,163,172,232,225,236,230,\n    247,233,228,244,104,128,255,154,243,104,130,  5,232,163,193,163,\n    208,228,225,231,229,243,232,232,229,226,242,229,119,128,251, 72,\n    232,229,226,242,229,119,128,  5,232,118,  3,163,225,163,238,164,\n     14,229,242,243,229,228,244,233,236,228,101,128, 34, 61,233, 97,\n      2,163,245,163,254,232,229,226,242,229,119,128,  5,151,237,245,\n    231,242,225,243,232,232,229,226,242,229,119,128,  5,151,236,239,\n    231,233,227,225,236,238,239,116,128, 35, 16,230,233,243,232,232,\n    239,239,107,129,  2,126,164, 40,242,229,246,229,242,243,229,100,\n    128,  2,127,104,  2,164, 57,164, 80, 97,  2,164, 63,164, 73,226,\n    229,238,231,225,236,105,128,  9,221,228,229,246, 97,128,  9, 93,\n    111,131,  3,193,164, 90,164,119,164,133,239,107,129,  2,125,164,\n     97,244,245,242,238,229,100,129,  2,123,164,108,243,245,240,229,\n    242,233,239,114,128,  2,181,243,249,237,226,239,236,231,242,229,\n    229,107,128,  3,241,244,233,227,232,239,239,235,237,239,100,128,\n      2,222,105,  6,164,160,165,204,165,250,166,  5,166, 30,166,166,\n    229,245,108,  9,164,182,164,217,164,232,164,246,165, 36,165, 50,\n    165,136,165,149,165,184, 97,  2,164,188,164,203,227,233,242,227,\n    236,229,235,239,242,229,225,110,128, 50,113,240,225,242,229,238,\n    235,239,242,229,225,110,128, 50, 17,227,233,242,227,236,229,235,\n    239,242,229,225,110,128, 50, 99,232,233,229,245,232,235,239,242,\n    229,225,110,128, 49, 64,107,  2,164,252,165, 28,233,249,229,239,\n    107,  2,165,  6,165, 15,235,239,242,229,225,110,128, 49, 58,243,\n    233,239,243,235,239,242,229,225,110,128, 49,105,239,242,229,225,\n    110,128, 49, 57,237,233,229,245,237,235,239,242,229,225,110,128,\n     49, 59,112,  3,165, 58,165, 90,165,105, 97,  2,165, 64,165, 78,\n    238,243,233,239,243,235,239,242,229,225,110,128, 49,108,242,229,\n    238,235,239,242,229,225,110,128, 50,  3,232,233,229,245,240,232,\n    235,239,242,229,225,110,128, 49, 63,233,229,245,112,  2,165,114,\n    165,123,235,239,242,229,225,110,128, 49, 60,243,233,239,243,235,\n    239,242,229,225,110,128, 49,107,243,233,239,243,235,239,242,229,\n    225,110,128, 49, 61,116,  2,165,155,165,170,232,233,229,245,244,\n    232,235,239,242,229,225,110,128, 49, 62,233,235,229,245,244,235,\n    239,242,229,225,110,128, 49,106,249,229,239,242,233,238,232,233,\n    229,245,232,235,239,242,229,225,110,128, 49,109,231,232,116,  2,\n    165,212,165,220,225,238,231,236,101,128, 34, 31,116,  2,165,226,\n    165,240,225,227,235,226,229,236,239,247,227,237, 98,128,  3, 25,\n    242,233,225,238,231,236,101,128, 34,191,232,233,242,225,231,225,\n    238, 97,128, 48,138,235,225,244,225,235,225,238, 97,129, 48,234,\n    166, 18,232,225,236,230,247,233,228,244,104,128,255,152,110,  2,\n    166, 36,166,152,103,131,  2,218,166, 46,166, 57,166, 63,226,229,\n    236,239,247,227,237, 98,128,  3, 37,227,237, 98,128,  3, 10,232,\n    225,236,102,  2,166, 72,166,118,236,229,230,116,131,  2,191,166,\n     85,166, 96,166,107,225,242,237,229,238,233,225,110,128,  5, 89,\n    226,229,236,239,247,227,237, 98,128,  3, 28,227,229,238,244,229,\n    242,229,100,128,  2,211,242,233,231,232,116,130,  2,190,166,130,\n    166,141,226,229,236,239,247,227,237, 98,128,  3, 57,227,229,238,\n    244,229,242,229,100,128,  2,210,246,229,242,244,229,228,226,242,\n    229,246,101,128,  2, 19,244,244,239,242,245,243,241,245,225,242,\n    101,128, 51, 81,108,  2,166,186,166,197,233,238,229,226,229,236,\n    239,119,128, 30, 95,239,238,231,236,229,103,129,  2,124,166,208,\n    244,245,242,238,229,100,128,  2,122,237,239,238,239,243,240,225,\n    227,101,128,255, 82,111,  3,166,237,166,248,167, 17,232,233,242,\n    225,231,225,238, 97,128, 48,141,235,225,244,225,235,225,238, 97,\n    129, 48,237,167,  5,232,225,236,230,247,233,228,244,104,128,255,\n    155,242,245,225,244,232,225,105,128, 14, 35,240,225,242,229,110,\n    128, 36,173,114,  3,167, 43,167, 79,167,109, 97,  3,167, 51,167,\n     61,167, 68,226,229,238,231,225,236,105,128,  9,220,228,229,246,\n     97,128,  9, 49,231,245,242,237,245,235,232,105,128, 10, 92,229,\n    104,  2,167, 86,167, 95,225,242,225,226,233, 99,128,  6,145,230,\n    233,238,225,236,225,242,225,226,233, 99,128,251,141,246,239,227,\n    225,236,233, 99,  4,167,125,167,135,167,142,167,153,226,229,238,\n    231,225,236,105,128,  9,224,228,229,246, 97,128,  9, 96,231,245,\n    234,225,242,225,244,105,128, 10,224,246,239,247,229,236,243,233,\n    231,110,  3,167,169,167,179,167,186,226,229,238,231,225,236,105,\n    128,  9,196,228,229,246, 97,128,  9, 68,231,245,234,225,242,225,\n    244,105,128, 10,196,243,245,240,229,242,233,239,114,128,246,241,\n    116,  2,167,214,167,222,226,236,239,227,107,128, 37,144,245,242,\n    238,229,100,129,  2,121,167,232,243,245,240,229,242,233,239,114,\n    128,  2,180,117,  4,167,253,168,  8,168, 33,168, 80,232,233,242,\n    225,231,225,238, 97,128, 48,139,235,225,244,225,235,225,238, 97,\n    129, 48,235,168, 21,232,225,236,230,247,233,228,244,104,128,255,\n    153,112,  2,168, 39,168, 74,229,101,  2,168, 46,168, 60,237,225,\n    242,235,226,229,238,231,225,236,105,128,  9,242,243,233,231,238,\n    226,229,238,231,225,236,105,128,  9,243,233,225,104,128,246,221,\n    244,232,225,105,128, 14, 36,246,239,227,225,236,233, 99,  4,168,\n    103,168,113,168,120,168,131,226,229,238,231,225,236,105,128,  9,\n    139,228,229,246, 97,128,  9, 11,231,245,234,225,242,225,244,105,\n    128, 10,139,246,239,247,229,236,243,233,231,110,  3,168,147,168,\n    157,168,164,226,229,238,231,225,236,105,128,  9,195,228,229,246,\n     97,128,  9, 67,231,245,234,225,242,225,244,105,128, 10,195,115,\n    147,  0,115,168,217,170,187,170,198,171, 68,171,107,174, 49,174,\n     60,176,203,179, 85,179,131,179,158,180, 93,180,160,181,193,181,\n    203,182,133,182,206,183,120,183,130, 97,  9,168,237,168,247,169,\n     12,169, 84,169,109,169,120,169,145,169,177,169,217,226,229,238,\n    231,225,236,105,128,  9,184,227,245,244,101,129,  1, 91,169,  0,\n    228,239,244,225,227,227,229,238,116,128, 30,101,100,  5,169, 24,\n    169, 33,169, 39,169, 53,169, 69,225,242,225,226,233, 99,128,  6,\n     53,229,246, 97,128,  9, 56,230,233,238,225,236,225,242,225,226,\n    233, 99,128,254,186,233,238,233,244,233,225,236,225,242,225,226,\n    233, 99,128,254,187,237,229,228,233,225,236,225,242,225,226,233,\n     99,128,254,188,231,117,  2,169, 91,169,100,234,225,242,225,244,\n    105,128, 10,184,242,237,245,235,232,105,128, 10, 56,232,233,242,\n    225,231,225,238, 97,128, 48, 85,235,225,244,225,235,225,238, 97,\n    129, 48,181,169,133,232,225,236,230,247,233,228,244,104,128,255,\n    123,236,236,225,236,236,225,232,239,245,225,236,225,249,232,229,\n    247,225,243,225,236,236,225,237,225,242,225,226,233, 99,128,253,\n    250,237,229,235,104,130,  5,225,169,188,169,208,228,225,231,229,\n    243,104,129,251, 65,169,199,232,229,226,242,229,119,128,251, 65,\n    232,229,226,242,229,119,128,  5,225,242, 97,  5,169,230,170, 48,\n    170, 56,170,106,170,114, 97,  5,169,242,169,250,170,  2,170, 33,\n    170, 41,225,244,232,225,105,128, 14, 50,229,244,232,225,105,128,\n     14, 65,233,237,225,233,109,  2,170, 12,170, 23,225,236,225,233,\n    244,232,225,105,128, 14, 68,245,225,238,244,232,225,105,128, 14,\n     67,237,244,232,225,105,128, 14, 51,244,232,225,105,128, 14, 48,\n    229,244,232,225,105,128, 14, 64,105,  3,170, 64,170, 88,170, 99,\n    105,  2,170, 70,170, 81,236,229,230,244,244,232,225,105,128,248,\n    134,244,232,225,105,128, 14, 53,236,229,230,244,244,232,225,105,\n    128,248,133,244,232,225,105,128, 14, 52,239,244,232,225,105,128,\n     14, 66,117,  3,170,122,170,172,170,179,101,  3,170,130,170,154,\n    170,165,101,  2,170,136,170,147,236,229,230,244,244,232,225,105,\n    128,248,136,244,232,225,105,128, 14, 55,236,229,230,244,244,232,\n    225,105,128,248,135,244,232,225,105,128, 14, 54,244,232,225,105,\n    128, 14, 56,245,244,232,225,105,128, 14, 57,226,239,240,239,237,\n    239,230,111,128, 49, 25, 99,  5,170,210,170,231,170,240,171, 33,\n    171, 55,225,242,239,110,129,  1, 97,170,219,228,239,244,225,227,\n    227,229,238,116,128, 30,103,229,228,233,236,236, 97,128,  1, 95,\n    232,247, 97,131,  2, 89,170,252,171,  7,171, 26,227,249,242,233,\n    236,236,233, 99,128,  4,217,228,233,229,242,229,243,233,243,227,\n    249,242,233,236,236,233, 99,128,  4,219,232,239,239,107,128,  2,\n     90,233,242, 99,  2,171, 41,171, 46,236,101,128, 36,226,245,237,\n    230,236,229,120,128,  1, 93,239,237,237,225,225,227,227,229,238,\n    116,128,  2, 25,228,239,116,  2,171, 76,171, 85,225,227,227,229,\n    238,116,128, 30, 97,226,229,236,239,119,129, 30, 99,171, 95,228,\n    239,244,225,227,227,229,238,116,128, 30,105,101,  9,171,127,171,\n    143,171,178,171,243,172, 90,172,117,172,142,172,223,172,250,225,\n    231,245,236,236,226,229,236,239,247,227,237, 98,128,  3, 60, 99,\n      2,171,149,171,171,239,238,100,129, 32, 51,171,157,244,239,238,\n    229,227,232,233,238,229,243,101,128,  2,202,244,233,239,110,128,\n      0,167,229,110,  4,171,189,171,198,171,212,171,228,225,242,225,\n    226,233, 99,128,  6, 51,230,233,238,225,236,225,242,225,226,233,\n     99,128,254,178,233,238,233,244,233,225,236,225,242,225,226,233,\n     99,128,254,179,237,229,228,233,225,236,225,242,225,226,233, 99,\n    128,254,180,231,239,108,135,  5,182,172,  7,172, 21,172, 26,172,\n     35,172, 50,172, 66,172, 77, 49,  2,172, 13,172, 17, 51,128,  5,\n    182,102,128,  5,182,178, 99,128,  5,182,232,229,226,242,229,119,\n    128,  5,182,238,225,242,242,239,247,232,229,226,242,229,119,128,\n      5,182,241,245,225,242,244,229,242,232,229,226,242,229,119,128,\n      5,182,244,225,232,229,226,242,229,119,128,  5,146,247,233,228,\n    229,232,229,226,242,229,119,128,  5,182,104,  2,172, 96,172,107,\n    225,242,237,229,238,233,225,110,128,  5,125,233,242,225,231,225,\n    238, 97,128, 48, 91,235,225,244,225,235,225,238, 97,129, 48,187,\n    172,130,232,225,236,230,247,233,228,244,104,128,255,126,237,105,\n      2,172,149,172,192,227,239,236,239,110,131,  0, 59,172,163,172,\n    172,172,184,225,242,225,226,233, 99,128,  6, 27,237,239,238,239,\n    243,240,225,227,101,128,255, 27,243,237,225,236,108,128,254, 84,\n    246,239,233,227,229,228,237,225,242,235,235,225,238, 97,129, 48,\n    156,172,211,232,225,236,230,247,233,228,244,104,128,255,159,238,\n    116,  2,172,230,172,240,233,243,241,245,225,242,101,128, 51, 34,\n    239,243,241,245,225,242,101,128, 51, 35,246,229,110,142,  0, 55,\n    173, 28,173, 37,173, 47,173, 77,173, 84,173, 94,173,119,173,146,\n    173,180,173,192,173,203,173,236,173,244,173,255,225,242,225,226,\n    233, 99,128,  6,103,226,229,238,231,225,236,105,128,  9,237,227,\n    233,242,227,236,101,129, 36,102,173, 58,233,238,246,229,242,243,\n    229,243,225,238,243,243,229,242,233,102,128, 39,144,228,229,246,\n     97,128,  9,109,229,233,231,232,244,232,115,128, 33, 94,231,117,\n      2,173,101,173,110,234,225,242,225,244,105,128, 10,237,242,237,\n    245,235,232,105,128, 10,109,232, 97,  2,173,126,173,137,227,235,\n    225,242,225,226,233, 99,128,  6,103,238,231,250,232,239,117,128,\n     48, 39,105,  2,173,152,173,170,228,229,239,231,242,225,240,232,\n    233,227,240,225,242,229,110,128, 50, 38,238,230,229,242,233,239,\n    114,128, 32,135,237,239,238,239,243,240,225,227,101,128,255, 23,\n    239,236,228,243,244,249,236,101,128,247, 55,112,  2,173,209,173,\n    216,225,242,229,110,128, 36,122,229,114,  2,173,223,173,229,233,\n    239,100,128, 36,142,243,233,225,110,128,  6,247,242,239,237,225,\n    110,128, 33,118,243,245,240,229,242,233,239,114,128, 32,119,116,\n      2,174,  5,174, 43,229,229,110,  2,174, 13,174, 22,227,233,242,\n    227,236,101,128, 36,112,112,  2,174, 28,174, 35,225,242,229,110,\n    128, 36,132,229,242,233,239,100,128, 36,152,232,225,105,128, 14,\n     87,230,244,232,249,240,232,229,110,128,  0,173,104,  7,174, 76,\n    175, 50,175, 61,175, 75,176, 20,176, 33,176,197, 97,  6,174, 90,\n    174,101,174,111,174,122,175,  9,175, 34,225,242,237,229,238,233,\n    225,110,128,  5,119,226,229,238,231,225,236,105,128,  9,182,227,\n    249,242,233,236,236,233, 99,128,  4, 72,100,  2,174,128,174,224,\n    228, 97,  4,174,139,174,148,174,179,174,193,225,242,225,226,233,\n     99,128,  6, 81,228,225,237,237, 97,  2,174,158,174,167,225,242,\n    225,226,233, 99,128,252, 97,244,225,238,225,242,225,226,233, 99,\n    128,252, 94,230,225,244,232,225,225,242,225,226,233, 99,128,252,\n     96,235,225,243,242, 97,  2,174,203,174,212,225,242,225,226,233,\n     99,128,252, 98,244,225,238,225,242,225,226,233, 99,128,252, 95,\n    101,132, 37,146,174,236,174,243,174,251,175,  4,228,225,242,107,\n    128, 37,147,236,233,231,232,116,128, 37,145,237,229,228,233,245,\n    109,128, 37,146,246, 97,128,  9, 54,231,117,  2,175, 16,175, 25,\n    234,225,242,225,244,105,128, 10,182,242,237,245,235,232,105,128,\n     10, 54,236,243,232,229,236,229,244,232,229,226,242,229,119,128,\n      5,147,226,239,240,239,237,239,230,111,128, 49, 21,227,232,225,\n    227,249,242,233,236,236,233, 99,128,  4, 73,101,  4,175, 85,175,\n    150,175,160,175,177,229,110,  4,175, 96,175,105,175,119,175,135,\n    225,242,225,226,233, 99,128,  6, 52,230,233,238,225,236,225,242,\n    225,226,233, 99,128,254,182,233,238,233,244,233,225,236,225,242,\n    225,226,233, 99,128,254,183,237,229,228,233,225,236,225,242,225,\n    226,233, 99,128,254,184,233,227,239,240,244,233, 99,128,  3,227,\n    241,229,108,129, 32,170,175,168,232,229,226,242,229,119,128, 32,\n    170,246, 97,134,  5,176,175,194,175,209,175,223,175,232,175,247,\n    176,  7, 49,  2,175,200,175,205,177, 53,128,  5,176, 53,128,  5,\n    176, 50,  2,175,215,175,219, 50,128,  5,176,101,128,  5,176,232,\n    229,226,242,229,119,128,  5,176,238,225,242,242,239,247,232,229,\n    226,242,229,119,128,  5,176,241,245,225,242,244,229,242,232,229,\n    226,242,229,119,128,  5,176,247,233,228,229,232,229,226,242,229,\n    119,128,  5,176,232,225,227,249,242,233,236,236,233, 99,128,  4,\n    187,105,  2,176, 39,176, 50,237,225,227,239,240,244,233, 99,128,\n      3,237,110,131,  5,233,176, 60,176,143,176,152,100,  2,176, 66,\n    176,132,225,231,229,243,104,130,251, 73,176, 78,176, 87,232,229,\n    226,242,229,119,128,251, 73,115,  2,176, 93,176,113,232,233,238,\n    228,239,116,129,251, 44,176,104,232,229,226,242,229,119,128,251,\n     44,233,238,228,239,116,129,251, 45,176,123,232,229,226,242,229,\n    119,128,251, 45,239,244,232,229,226,242,229,119,128,  5,193,232,\n    229,226,242,229,119,128,  5,233,115,  2,176,158,176,178,232,233,\n    238,228,239,116,129,251, 42,176,169,232,229,226,242,229,119,128,\n    251, 42,233,238,228,239,116,129,251, 43,176,188,232,229,226,242,\n    229,119,128,251, 43,239,239,107,128,  2,130,105,  8,176,221,177,\n      9,177, 20,177, 45,177, 75,177, 83,177, 96,178, 11,231,237, 97,\n    131,  3,195,176,233,176,237,176,245, 49,128,  3,194,230,233,238,\n    225,108,128,  3,194,236,245,238,225,244,229,243,249,237,226,239,\n    236,231,242,229,229,107,128,  3,242,232,233,242,225,231,225,238,\n     97,128, 48, 87,235,225,244,225,235,225,238, 97,129, 48,183,177,\n     33,232,225,236,230,247,233,228,244,104,128,255,124,236,245,113,\n      2,177, 53,177, 62,232,229,226,242,229,119,128,  5,189,236,229,\n    230,244,232,229,226,242,229,119,128,  5,189,237,233,236,225,114,\n    128, 34, 60,238,228,239,244,232,229,226,242,229,119,128,  5,194,\n    239,115,  6,177,111,177,146,177,178,177,206,177,220,177,252, 97,\n      2,177,117,177,132,227,233,242,227,236,229,235,239,242,229,225,\n    110,128, 50,116,240,225,242,229,238,235,239,242,229,225,110,128,\n     50, 20,227,105,  2,177,153,177,165,229,245,227,235,239,242,229,\n    225,110,128, 49,126,242,227,236,229,235,239,242,229,225,110,128,\n     50,102,107,  2,177,184,177,198,233,249,229,239,235,235,239,242,\n    229,225,110,128, 49,122,239,242,229,225,110,128, 49, 69,238,233,\n    229,245,238,235,239,242,229,225,110,128, 49,123,112,  2,177,226,\n    177,239,225,242,229,238,235,239,242,229,225,110,128, 50,  6,233,\n    229,245,240,235,239,242,229,225,110,128, 49,125,244,233,235,229,\n    245,244,235,239,242,229,225,110,128, 49,124,120,141,  0, 54,178,\n     41,178, 50,178, 60,178, 90,178, 97,178,122,178,149,178,183,178,\n    195,178,206,178,239,178,247,179,  2,225,242,225,226,233, 99,128,\n      6,102,226,229,238,231,225,236,105,128,  9,236,227,233,242,227,\n    236,101,129, 36,101,178, 71,233,238,246,229,242,243,229,243,225,\n    238,243,243,229,242,233,102,128, 39,143,228,229,246, 97,128,  9,\n    108,231,117,  2,178,104,178,113,234,225,242,225,244,105,128, 10,\n    236,242,237,245,235,232,105,128, 10,108,232, 97,  2,178,129,178,\n    140,227,235,225,242,225,226,233, 99,128,  6,102,238,231,250,232,\n    239,117,128, 48, 38,105,  2,178,155,178,173,228,229,239,231,242,\n    225,240,232,233,227,240,225,242,229,110,128, 50, 37,238,230,229,\n    242,233,239,114,128, 32,134,237,239,238,239,243,240,225,227,101,\n    128,255, 22,239,236,228,243,244,249,236,101,128,247, 54,112,  2,\n    178,212,178,219,225,242,229,110,128, 36,121,229,114,  2,178,226,\n    178,232,233,239,100,128, 36,141,243,233,225,110,128,  6,246,242,\n    239,237,225,110,128, 33,117,243,245,240,229,242,233,239,114,128,\n     32,118,116,  2,179,  8,179, 79,229,229,110,  2,179, 16,179, 58,\n     99,  2,179, 22,179, 30,233,242,227,236,101,128, 36,111,245,242,\n    242,229,238,227,249,228,229,238,239,237,233,238,225,244,239,242,\n    226,229,238,231,225,236,105,128,  9,249,112,  2,179, 64,179, 71,\n    225,242,229,110,128, 36,131,229,242,233,239,100,128, 36,151,232,\n    225,105,128, 14, 86,108,  2,179, 91,179,111,225,243,104,129,  0,\n     47,179, 99,237,239,238,239,243,240,225,227,101,128,255, 15,239,\n    238,103,129,  1,127,179,119,228,239,244,225,227,227,229,238,116,\n    128, 30,155,109,  2,179,137,179,147,233,236,229,230,225,227,101,\n    128, 38, 58,239,238,239,243,240,225,227,101,128,255, 83,111,  6,\n    179,172,179,222,179,233,180,  2,180, 47,180, 58,102,  2,179,178,\n    179,192,240,225,243,245,241,232,229,226,242,229,119,128,  5,195,\n    116,  2,179,198,179,207,232,249,240,232,229,110,128,  0,173,243,\n    233,231,238,227,249,242,233,236,236,233, 99,128,  4, 76,232,233,\n    242,225,231,225,238, 97,128, 48, 93,235,225,244,225,235,225,238,\n     97,129, 48,189,179,246,232,225,236,230,247,233,228,244,104,128,\n    255,127,236,233,228,245,115,  2,180, 12,180, 29,236,239,238,231,\n    239,246,229,242,236,225,249,227,237, 98,128,  3, 56,243,232,239,\n    242,244,239,246,229,242,236,225,249,227,237, 98,128,  3, 55,242,\n    245,243,233,244,232,225,105,128, 14, 41,115,  3,180, 66,180, 76,\n    180, 84,225,236,225,244,232,225,105,128, 14, 40,239,244,232,225,\n    105,128, 14, 11,245,225,244,232,225,105,128, 14, 42,240, 97,  3,\n    180,102,180,122,180,154,227,101,129,  0, 32,180,109,232,225,227,\n    235,225,242,225,226,233, 99,128,  0, 32,228,101,129, 38, 96,180,\n    129,243,245,233,116,  2,180,138,180,146,226,236,225,227,107,128,\n     38, 96,247,232,233,244,101,128, 38,100,242,229,110,128, 36,174,\n    241,245,225,242,101, 11,180,188,180,199,180,213,180,238,180,255,\n    181, 25,181, 40,181, 73,181,100,181,156,181,171,226,229,236,239,\n    247,227,237, 98,128,  3, 59, 99,  2,180,205,180,209, 99,128, 51,\n    196,109,128, 51,157,228,233,225,231,239,238,225,236,227,242,239,\n    243,243,232,225,244,227,232,230,233,236,108,128, 37,169,232,239,\n    242,233,250,239,238,244,225,236,230,233,236,108,128, 37,164,107,\n      2,181,  5,181,  9,103,128, 51,143,109,129, 51,158,181, 15,227,\n    225,240,233,244,225,108,128, 51,206,108,  2,181, 31,181, 35,110,\n    128, 51,209,239,103,128, 51,210,109,  4,181, 50,181, 54,181, 59,\n    181, 63,103,128, 51,142,233,108,128, 51,213,109,128, 51,156,243,\n    241,245,225,242,229,100,128, 51,161,239,242,244,232,239,231,239,\n    238,225,236,227,242,239,243,243,232,225,244,227,232,230,233,236,\n    108,128, 37,166,245,240,240,229,114,  2,181,110,181,133,236,229,\n    230,244,244,239,236,239,247,229,242,242,233,231,232,244,230,233,\n    236,108,128, 37,167,242,233,231,232,244,244,239,236,239,247,229,\n    242,236,229,230,244,230,233,236,108,128, 37,168,246,229,242,244,\n    233,227,225,236,230,233,236,108,128, 37,165,247,232,233,244,229,\n    247,233,244,232,243,237,225,236,236,226,236,225,227,107,128, 37,\n    163,242,243,241,245,225,242,101,128, 51,219,115,  2,181,209,182,\n    123, 97,  4,181,219,181,229,181,236,181,247,226,229,238,231,225,\n    236,105,128,  9,183,228,229,246, 97,128,  9, 55,231,245,234,225,\n    242,225,244,105,128, 10,183,238,103,  8,182, 10,182, 24,182, 38,\n    182, 52,182, 67,182, 81,182, 95,182,108,227,233,229,245,227,235,\n    239,242,229,225,110,128, 49, 73,232,233,229,245,232,235,239,242,\n    229,225,110,128, 49,133,233,229,245,238,231,235,239,242,229,225,\n    110,128, 49,128,235,233,249,229,239,235,235,239,242,229,225,110,\n    128, 49, 50,238,233,229,245,238,235,239,242,229,225,110,128, 49,\n    101,240,233,229,245,240,235,239,242,229,225,110,128, 49, 67,243,\n    233,239,243,235,239,242,229,225,110,128, 49, 70,244,233,235,229,\n    245,244,235,239,242,229,225,110,128, 49, 56,245,240,229,242,233,\n    239,114,128,246,242,116,  2,182,139,182,162,229,242,236,233,238,\n    103,129,  0,163,182,150,237,239,238,239,243,240,225,227,101,128,\n    255,225,242,239,235,101,  2,182,171,182,188,236,239,238,231,239,\n    246,229,242,236,225,249,227,237, 98,128,  3, 54,243,232,239,242,\n    244,239,246,229,242,236,225,249,227,237, 98,128,  3, 53,117,  7,\n    182,222,182,254,183, 20,183, 31,183, 72,183, 82,183, 86,226,243,\n    229,116,130, 34,130,182,233,182,244,238,239,244,229,241,245,225,\n    108,128, 34,138,239,242,229,241,245,225,108,128, 34,134, 99,  2,\n    183,  4,183, 12,227,229,229,228,115,128, 34,123,232,244,232,225,\n    116,128, 34, 11,232,233,242,225,231,225,238, 97,128, 48, 89,107,\n      2,183, 37,183, 61,225,244,225,235,225,238, 97,129, 48,185,183,\n     49,232,225,236,230,247,233,228,244,104,128,255,125,245,238,225,\n    242,225,226,233, 99,128,  6, 82,237,237,225,244,233,239,110,128,\n     34, 17,110,128, 38, 60,240,229,242,243,229,116,130, 34,131,183,\n     99,183,110,238,239,244,229,241,245,225,108,128, 34,139,239,242,\n    229,241,245,225,108,128, 34,135,246,243,241,245,225,242,101,128,\n     51,220,249,239,245,247,225,229,242,225,243,241,245,225,242,101,\n    128, 51,124,116,144,  0,116,183,183,184,192,184,213,185,100,185,\n    140,187,188,191, 70,192,145,192,157,192,169,193,202,193,227,194,\n     57,194,237,195,165,195,255, 97, 10,183,205,183,215,183,236,183,\n    243,184, 12,184, 90,184,107,184,132,184,146,184,150,226,229,238,\n    231,225,236,105,128,  9,164,227,107,  2,183,222,183,229,228,239,\n    247,110,128, 34,164,236,229,230,116,128, 34,163,228,229,246, 97,\n    128,  9, 36,231,117,  2,183,250,184,  3,234,225,242,225,244,105,\n    128, 10,164,242,237,245,235,232,105,128, 10, 36,104,  4,184, 22,\n    184, 31,184, 45,184, 75,225,242,225,226,233, 99,128,  6, 55,230,\n    233,238,225,236,225,242,225,226,233, 99,128,254,194,105,  2,184,\n     51,184, 66,238,233,244,233,225,236,225,242,225,226,233, 99,128,\n    254,195,242,225,231,225,238, 97,128, 48, 95,237,229,228,233,225,\n    236,225,242,225,226,233, 99,128,254,196,233,243,249,239,245,229,\n    242,225,243,241,245,225,242,101,128, 51,125,235,225,244,225,235,\n    225,238, 97,129, 48,191,184,120,232,225,236,230,247,233,228,244,\n    104,128,255,128,244,247,229,229,236,225,242,225,226,233, 99,128,\n      6, 64,117,128,  3,196,118,130,  5,234,184,158,184,183,228,225,\n    231,229,115,129,251, 74,184,168,104,129,251, 74,184,174,232,229,\n    226,242,229,119,128,251, 74,232,229,226,242,229,119,128,  5,234,\n     98,  2,184,198,184,203,225,114,128,  1,103,239,240,239,237,239,\n    230,111,128, 49, 10, 99,  6,184,227,184,234,184,241,184,250,185,\n     60,185, 87,225,242,239,110,128,  1,101,227,245,242,108,128,  2,\n    168,229,228,233,236,236, 97,128,  1, 99,232,229,104,  4,185,  6,\n    185, 15,185, 29,185, 45,225,242,225,226,233, 99,128,  6,134,230,\n    233,238,225,236,225,242,225,226,233, 99,128,251,123,233,238,233,\n    244,233,225,236,225,242,225,226,233, 99,128,251,124,237,229,228,\n    233,225,236,225,242,225,226,233, 99,128,251,125,233,242, 99,  2,\n    185, 68,185, 73,236,101,128, 36,227,245,237,230,236,229,248,226,\n    229,236,239,119,128, 30,113,239,237,237,225,225,227,227,229,238,\n    116,128,  1, 99,100,  2,185,106,185,116,233,229,242,229,243,233,\n    115,128, 30,151,239,116,  2,185,123,185,132,225,227,227,229,238,\n    116,128, 30,107,226,229,236,239,119,128, 30,109,101,  9,185,160,\n    185,171,185,191,186,201,186,226,187, 34,187,101,187,106,187,158,\n    227,249,242,233,236,236,233, 99,128,  4, 66,228,229,243,227,229,\n    238,228,229,242,227,249,242,233,236,236,233, 99,128,  4,173,104,\n      7,185,207,185,216,185,230,186, 14,186, 44,186, 85,186,183,225,\n    242,225,226,233, 99,128,  6, 42,230,233,238,225,236,225,242,225,\n    226,233, 99,128,254,150,232,225,232,105,  2,185,239,185,254,238,\n    233,244,233,225,236,225,242,225,226,233, 99,128,252,162,243,239,\n    236,225,244,229,228,225,242,225,226,233, 99,128,252, 12,105,  2,\n    186, 20,186, 35,238,233,244,233,225,236,225,242,225,226,233, 99,\n    128,254,151,242,225,231,225,238, 97,128, 48,102,234,229,229,237,\n    105,  2,186, 54,186, 69,238,233,244,233,225,236,225,242,225,226,\n    233, 99,128,252,161,243,239,236,225,244,229,228,225,242,225,226,\n    233, 99,128,252, 11,109,  2,186, 91,186,125,225,242,226,245,244,\n     97,  2,186,102,186,111,225,242,225,226,233, 99,128,  6, 41,230,\n    233,238,225,236,225,242,225,226,233, 99,128,254,148,101,  2,186,\n    131,186,144,228,233,225,236,225,242,225,226,233, 99,128,254,152,\n    229,237,105,  2,186,152,186,167,238,233,244,233,225,236,225,242,\n    225,226,233, 99,128,252,164,243,239,236,225,244,229,228,225,242,\n    225,226,233, 99,128,252, 14,238,239,239,238,230,233,238,225,236,\n    225,242,225,226,233, 99,128,252,115,235,225,244,225,235,225,238,\n     97,129, 48,198,186,214,232,225,236,230,247,233,228,244,104,128,\n    255,131,108,  2,186,232,186,251,229,240,232,239,238,101,129, 33,\n     33,186,243,226,236,225,227,107,128, 38, 14,233,243,232, 97,  2,\n    187,  4,187, 19,231,229,228,239,236,225,232,229,226,242,229,119,\n    128,  5,160,241,229,244,225,238,225,232,229,226,242,229,119,128,\n      5,169,110,  4,187, 44,187, 53,187, 72,187, 93,227,233,242,227,\n    236,101,128, 36,105,233,228,229,239,231,242,225,240,232,233,227,\n    240,225,242,229,110,128, 50, 41,112,  2,187, 78,187, 85,225,242,\n    229,110,128, 36,125,229,242,233,239,100,128, 36,145,242,239,237,\n    225,110,128, 33,121,243,104,128,  2,167,116,131,  5,216,187,116,\n    187,136,187,145,228,225,231,229,243,104,129,251, 56,187,127,232,\n    229,226,242,229,119,128,251, 56,232,229,226,242,229,119,128,  5,\n    216,243,229,227,249,242,233,236,236,233, 99,128,  4,181,246,233,\n    114,  2,187,166,187,175,232,229,226,242,229,119,128,  5,155,236,\n    229,230,244,232,229,226,242,229,119,128,  5,155,104,  6,187,202,\n    188, 98,188,220,189, 96,190,  3,191, 60, 97,  5,187,214,187,224,\n    187,231,188,  0,188, 29,226,229,238,231,225,236,105,128,  9,165,\n    228,229,246, 97,128,  9, 37,231,117,  2,187,238,187,247,234,225,\n    242,225,244,105,128, 10,165,242,237,245,235,232,105,128, 10, 37,\n    108,  2,188,  6,188, 15,225,242,225,226,233, 99,128,  6, 48,230,\n    233,238,225,236,225,242,225,226,233, 99,128,254,172,238,244,232,\n    225,235,232,225,116,  3,188, 44,188, 75,188, 82,236,239,119,  2,\n    188, 52,188, 63,236,229,230,244,244,232,225,105,128,248,152,242,\n    233,231,232,244,244,232,225,105,128,248,151,244,232,225,105,128,\n     14, 76,245,240,240,229,242,236,229,230,244,244,232,225,105,128,\n    248,150,101,  3,188,106,188,170,188,193,104,  4,188,116,188,125,\n    188,139,188,155,225,242,225,226,233, 99,128,  6, 43,230,233,238,\n    225,236,225,242,225,226,233, 99,128,254,154,233,238,233,244,233,\n    225,236,225,242,225,226,233, 99,128,254,155,237,229,228,233,225,\n    236,225,242,225,226,233, 99,128,254,156,242,101,  2,188,177,188,\n    186,229,248,233,243,244,115,128, 34,  3,230,239,242,101,128, 34,\n     52,244, 97,130,  3,184,188,202,188,206, 49,128,  3,209,243,249,\n    237,226,239,236,231,242,229,229,107,128,  3,209,105,  2,188,226,\n    189, 56,229,245,244,104,  4,188,239,189, 18,189, 33,189, 42, 97,\n      2,188,245,189,  4,227,233,242,227,236,229,235,239,242,229,225,\n    110,128, 50,121,240,225,242,229,238,235,239,242,229,225,110,128,\n     50, 25,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,\n    107,235,239,242,229,225,110,128, 49, 76,240,225,242,229,238,235,\n    239,242,229,225,110,128, 50, 11,242,244,229,229,110,  2,189, 66,\n    189, 75,227,233,242,227,236,101,128, 36,108,112,  2,189, 81,189,\n     88,225,242,229,110,128, 36,128,229,242,233,239,100,128, 36,148,\n    111,  6,189,110,189,127,189,132,189,146,189,151,189,204,238,225,\n    238,231,237,239,238,244,232,239,244,232,225,105,128, 14, 17,239,\n    107,128,  1,173,240,232,245,244,232,225,239,244,232,225,105,128,\n     14, 18,242,110,128,  0,254,244,104,  3,189,160,189,184,189,194,\n     97,  2,189,166,189,176,232,225,238,244,232,225,105,128, 14, 23,\n    238,244,232,225,105,128, 14, 16,239,238,231,244,232,225,105,128,\n     14, 24,245,238,231,244,232,225,105,128, 14, 22,245,243,225,238,\n    100,  2,189,214,189,225,227,249,242,233,236,236,233, 99,128,  4,\n    130,243,243,229,240,225,242,225,244,239,114,  2,189,240,189,249,\n    225,242,225,226,233, 99,128,  6,108,240,229,242,243,233,225,110,\n    128,  6,108,242,229,101,144,  0, 51,190, 41,190, 50,190, 60,190,\n     90,190, 97,190,107,190,132,190,159,190,193,190,205,190,224,190,\n    235,191, 12,191, 34,191, 42,191, 53,225,242,225,226,233, 99,128,\n      6, 99,226,229,238,231,225,236,105,128,  9,233,227,233,242,227,\n    236,101,129, 36, 98,190, 71,233,238,246,229,242,243,229,243,225,\n    238,243,243,229,242,233,102,128, 39,140,228,229,246, 97,128,  9,\n    105,229,233,231,232,244,232,115,128, 33, 92,231,117,  2,190,114,\n    190,123,234,225,242,225,244,105,128, 10,233,242,237,245,235,232,\n    105,128, 10,105,232, 97,  2,190,139,190,150,227,235,225,242,225,\n    226,233, 99,128,  6, 99,238,231,250,232,239,117,128, 48, 35,105,\n      2,190,165,190,183,228,229,239,231,242,225,240,232,233,227,240,\n    225,242,229,110,128, 50, 34,238,230,229,242,233,239,114,128, 32,\n    131,237,239,238,239,243,240,225,227,101,128,255, 19,238,245,237,\n    229,242,225,244,239,242,226,229,238,231,225,236,105,128,  9,246,\n    239,236,228,243,244,249,236,101,128,247, 51,112,  2,190,241,190,\n    248,225,242,229,110,128, 36,118,229,114,  2,190,255,191,  5,233,\n    239,100,128, 36,138,243,233,225,110,128,  6,243,241,245,225,242,\n    244,229,242,115,129,  0,190,191, 25,229,237,228,225,243,104,128,\n    246,222,242,239,237,225,110,128, 33,114,243,245,240,229,242,233,\n    239,114,128,  0,179,244,232,225,105,128, 14, 83,250,243,241,245,\n    225,242,101,128, 51,148,105,  7,191, 86,191, 97,191,212,192, 54,\n    192, 66,192,115,192,132,232,233,242,225,231,225,238, 97,128, 48,\n     97,107,  2,191,103,191,127,225,244,225,235,225,238, 97,129, 48,\n    193,191,115,232,225,236,230,247,233,228,244,104,128,255,129,229,\n    245,116,  4,191,139,191,174,191,189,191,198, 97,  2,191,145,191,\n    160,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,112,\n    240,225,242,229,238,235,239,242,229,225,110,128, 50, 16,227,233,\n    242,227,236,229,235,239,242,229,225,110,128, 50, 98,235,239,242,\n    229,225,110,128, 49, 55,240,225,242,229,238,235,239,242,229,225,\n    110,128, 50,  2,236,228,101,133,  2,220,191,228,191,239,192,  0,\n    192, 12,192, 40,226,229,236,239,247,227,237, 98,128,  3, 48, 99,\n      2,191,245,191,250,237, 98,128,  3,  3,239,237, 98,128,  3,  3,\n    228,239,245,226,236,229,227,237, 98,128,  3, 96,111,  2,192, 18,\n    192, 28,240,229,242,225,244,239,114,128, 34, 60,246,229,242,236,\n    225,249,227,237, 98,128,  3, 52,246,229,242,244,233,227,225,236,\n    227,237, 98,128,  3, 62,237,229,243,227,233,242,227,236,101,128,\n     34,151,112,  2,192, 72,192,102,229,232, 97,  2,192, 80,192, 89,\n    232,229,226,242,229,119,128,  5,150,236,229,230,244,232,229,226,\n    242,229,119,128,  5,150,240,233,231,245,242,237,245,235,232,105,\n    128, 10,112,244,236,239,227,249,242,233,236,236,233,227,227,237,\n     98,128,  4,131,247,238,225,242,237,229,238,233,225,110,128,  5,\n    127,236,233,238,229,226,229,236,239,119,128, 30,111,237,239,238,\n    239,243,240,225,227,101,128,255, 84,111,  7,192,185,192,196,192,\n    207,192,232,193, 96,193,108,193,192,225,242,237,229,238,233,225,\n    110,128,  5,105,232,233,242,225,231,225,238, 97,128, 48,104,235,\n    225,244,225,235,225,238, 97,129, 48,200,192,220,232,225,236,230,\n    247,233,228,244,104,128,255,132,110,  3,192,240,193, 82,193, 87,\n    101,  4,192,250,193, 63,193, 70,193, 76,226,225,114,  4,193,  6,\n    193, 35,193, 45,193, 54,229,248,244,242, 97,  2,193, 16,193, 26,\n    232,233,231,232,237,239,100,128,  2,229,236,239,247,237,239,100,\n    128,  2,233,232,233,231,232,237,239,100,128,  2,230,236,239,247,\n    237,239,100,128,  2,232,237,233,228,237,239,100,128,  2,231,230,\n    233,246,101,128,  1,189,243,233,120,128,  1,133,244,247,111,128,\n      1,168,239,115,128,  3,132,243,241,245,225,242,101,128, 51, 39,\n    240,225,244,225,235,244,232,225,105,128, 14, 15,242,244,239,233,\n    243,229,243,232,229,236,236,226,242,225,227,235,229,116,  2,193,\n    131,193,161,236,229,230,116,130, 48, 20,193,142,193,150,243,237,\n    225,236,108,128,254, 93,246,229,242,244,233,227,225,108,128,254,\n     57,242,233,231,232,116,130, 48, 21,193,173,193,181,243,237,225,\n    236,108,128,254, 94,246,229,242,244,233,227,225,108,128,254, 58,\n    244,225,239,244,232,225,105,128, 14, 21,240, 97,  2,193,209,193,\n    221,236,225,244,225,236,232,239,239,107,128,  1,171,242,229,110,\n    128, 36,175,114,  3,193,235,194, 10,194, 25,225,228,229,237,225,\n    242,107,129, 33, 34,193,247,115,  2,193,253,194,  3,225,238,115,\n    128,248,234,229,242,233,102,128,246,219,229,244,242,239,230,236,\n    229,248,232,239,239,107,128,  2,136,233,225,103,  4,194, 37,194,\n     42,194, 47,194, 52,228,110,128, 37,188,236,102,128, 37,196,242,\n    116,128, 37,186,245,112,128, 37,178,115,132,  2,166,194, 69,194,\n    108,194,214,194,227,225,228,105,130,  5,230,194, 79,194, 99,228,\n    225,231,229,243,104,129,251, 70,194, 90,232,229,226,242,229,119,\n    128,251, 70,232,229,226,242,229,119,128,  5,230,101,  2,194,114,\n    194,125,227,249,242,233,236,236,233, 99,128,  4, 70,242,101,134,\n      5,181,194,142,194,156,194,161,194,170,194,185,194,201, 49,  2,\n    194,148,194,152, 50,128,  5,181,101,128,  5,181,178, 98,128,  5,\n    181,232,229,226,242,229,119,128,  5,181,238,225,242,242,239,247,\n    232,229,226,242,229,119,128,  5,181,241,245,225,242,244,229,242,\n    232,229,226,242,229,119,128,  5,181,247,233,228,229,232,229,226,\n    242,229,119,128,  5,181,232,229,227,249,242,233,236,236,233, 99,\n    128,  4, 91,245,240,229,242,233,239,114,128,246,243,116,  4,194,\n    247,195, 41,195,106,195,157, 97,  3,194,255,195,  9,195, 16,226,\n    229,238,231,225,236,105,128,  9,159,228,229,246, 97,128,  9, 31,\n    231,117,  2,195, 23,195, 32,234,225,242,225,244,105,128, 10,159,\n    242,237,245,235,232,105,128, 10, 31,229,104,  4,195, 52,195, 61,\n    195, 75,195, 91,225,242,225,226,233, 99,128,  6,121,230,233,238,\n    225,236,225,242,225,226,233, 99,128,251,103,233,238,233,244,233,\n    225,236,225,242,225,226,233, 99,128,251,104,237,229,228,233,225,\n    236,225,242,225,226,233, 99,128,251,105,232, 97,  3,195,115,195,\n    125,195,132,226,229,238,231,225,236,105,128,  9,160,228,229,246,\n     97,128,  9, 32,231,117,  2,195,139,195,148,234,225,242,225,244,\n    105,128, 10,160,242,237,245,235,232,105,128, 10, 32,245,242,238,\n    229,100,128,  2,135,117,  3,195,173,195,184,195,209,232,233,242,\n    225,231,225,238, 97,128, 48,100,235,225,244,225,235,225,238, 97,\n    129, 48,196,195,197,232,225,236,230,247,233,228,244,104,128,255,\n    130,243,237,225,236,108,  2,195,219,195,230,232,233,242,225,231,\n    225,238, 97,128, 48, 99,235,225,244,225,235,225,238, 97,129, 48,\n    195,195,243,232,225,236,230,247,233,228,244,104,128,255,111,119,\n      2,196,  5,196,110,101,  2,196, 11,196, 59,236,246,101,  3,196,\n     21,196, 30,196, 51,227,233,242,227,236,101,128, 36,107,112,  2,\n    196, 36,196, 43,225,242,229,110,128, 36,127,229,242,233,239,100,\n    128, 36,147,242,239,237,225,110,128, 33,123,238,244,121,  3,196,\n     69,196, 78,196, 89,227,233,242,227,236,101,128, 36,115,232,225,\n    238,231,250,232,239,117,128, 83, 68,112,  2,196, 95,196,102,225,\n    242,229,110,128, 36,135,229,242,233,239,100,128, 36,155,111,142,\n      0, 50,196,142,196,151,196,161,196,191,196,243,197, 12,197, 39,\n    197, 73,197, 85,197,104,197,115,197,148,197,156,197,180,225,242,\n    225,226,233, 99,128,  6, 98,226,229,238,231,225,236,105,128,  9,\n    232,227,233,242,227,236,101,129, 36, 97,196,172,233,238,246,229,\n    242,243,229,243,225,238,243,243,229,242,233,102,128, 39,139,100,\n      2,196,197,196,203,229,246, 97,128,  9,104,239,116,  2,196,210,\n    196,221,229,238,236,229,225,228,229,114,128, 32, 37,236,229,225,\n    228,229,114,129, 32, 37,196,232,246,229,242,244,233,227,225,108,\n    128,254, 48,231,117,  2,196,250,197,  3,234,225,242,225,244,105,\n    128, 10,232,242,237,245,235,232,105,128, 10,104,232, 97,  2,197,\n     19,197, 30,227,235,225,242,225,226,233, 99,128,  6, 98,238,231,\n    250,232,239,117,128, 48, 34,105,  2,197, 45,197, 63,228,229,239,\n    231,242,225,240,232,233,227,240,225,242,229,110,128, 50, 33,238,\n    230,229,242,233,239,114,128, 32,130,237,239,238,239,243,240,225,\n    227,101,128,255, 18,238,245,237,229,242,225,244,239,242,226,229,\n    238,231,225,236,105,128,  9,245,239,236,228,243,244,249,236,101,\n    128,247, 50,112,  2,197,121,197,128,225,242,229,110,128, 36,117,\n    229,114,  2,197,135,197,141,233,239,100,128, 36,137,243,233,225,\n    110,128,  6,242,242,239,237,225,110,128, 33,113,115,  2,197,162,\n    197,170,244,242,239,235,101,128,  1,187,245,240,229,242,233,239,\n    114,128,  0,178,244,104,  2,197,187,197,192,225,105,128, 14, 82,\n    233,242,228,115,128, 33, 84,117,145,  0,117,197,237,197,245,198,\n     30,198, 87,198,225,199,  6,199,129,199,145,199,196,200, 10,200,\n     91,200,100,200,219,200,243,201, 95,201,123,201,237,225,227,245,\n    244,101,128,  0,250, 98,  4,197,255,198,  4,198, 13,198, 23,225,\n    114,128,  2,137,229,238,231,225,236,105,128,  9,137,239,240,239,\n    237,239,230,111,128, 49, 40,242,229,246,101,128,  1,109, 99,  3,\n    198, 38,198, 45,198, 77,225,242,239,110,128,  1,212,233,242, 99,\n      2,198, 53,198, 58,236,101,128, 36,228,245,237,230,236,229,120,\n    129,  0,251,198, 69,226,229,236,239,119,128, 30,119,249,242,233,\n    236,236,233, 99,128,  4, 67,100,  5,198, 99,198,110,198,133,198,\n    139,198,215,225,244,244,225,228,229,246, 97,128,  9, 81,226,108,\n      2,198,117,198,125,225,227,245,244,101,128,  1,113,231,242,225,\n    246,101,128,  2, 21,229,246, 97,128,  9,  9,233,229,242,229,243,\n    233,115,133,  0,252,198,159,198,167,198,175,198,198,198,206,225,\n    227,245,244,101,128,  1,216,226,229,236,239,119,128, 30,115, 99,\n      2,198,181,198,188,225,242,239,110,128,  1,218,249,242,233,236,\n    236,233, 99,128,  4,241,231,242,225,246,101,128,  1,220,237,225,\n    227,242,239,110,128,  1,214,239,244,226,229,236,239,119,128, 30,\n    229,103,  2,198,231,198,238,242,225,246,101,128,  0,249,117,  2,\n    198,244,198,253,234,225,242,225,244,105,128, 10,137,242,237,245,\n    235,232,105,128, 10,  9,104,  3,199, 14,199, 24,199,102,233,242,\n    225,231,225,238, 97,128, 48, 70,111,  2,199, 30,199, 40,239,235,\n    225,226,239,246,101,128, 30,231,242,110,133,  1,176,199, 55,199,\n     63,199, 74,199, 82,199, 94,225,227,245,244,101,128, 30,233,228,\n    239,244,226,229,236,239,119,128, 30,241,231,242,225,246,101,128,\n     30,235,232,239,239,235,225,226,239,246,101,128, 30,237,244,233,\n    236,228,101,128, 30,239,245,238,231,225,242,245,237,236,225,245,\n    116,129,  1,113,199,118,227,249,242,233,236,236,233, 99,128,  4,\n    243,233,238,246,229,242,244,229,228,226,242,229,246,101,128,  2,\n     23,107,  3,199,153,199,177,199,188,225,244,225,235,225,238, 97,\n    129, 48,166,199,165,232,225,236,230,247,233,228,244,104,128,255,\n    115,227,249,242,233,236,236,233, 99,128,  4,121,239,242,229,225,\n    110,128, 49, 92,109,  2,199,202,199,255, 97,  2,199,208,199,241,\n    227,242,239,110,130,  1,107,199,219,199,230,227,249,242,233,236,\n    236,233, 99,128,  4,239,228,233,229,242,229,243,233,115,128, 30,\n    123,244,242,225,231,245,242,237,245,235,232,105,128, 10, 65,239,\n    238,239,243,240,225,227,101,128,255, 85,110,  2,200, 16,200, 71,\n    228,229,242,243,227,239,242,101,132,  0, 95,200, 35,200, 41,200,\n     53,200, 64,228,226,108,128, 32, 23,237,239,238,239,243,240,225,\n    227,101,128,255, 63,246,229,242,244,233,227,225,108,128,254, 51,\n    247,225,246,121,128,254, 79,105,  2,200, 77,200, 82,239,110,128,\n     34, 42,246,229,242,243,225,108,128, 34,  0,239,231,239,238,229,\n    107,128,  1,115,112,  5,200,112,200,119,200,127,200,142,200,193,\n    225,242,229,110,128, 36,176,226,236,239,227,107,128, 37,128,240,\n    229,242,228,239,244,232,229,226,242,229,119,128,  5,196,243,233,\n    236,239,110,131,  3,197,200,156,200,177,200,185,228,233,229,242,\n    229,243,233,115,129,  3,203,200,169,244,239,238,239,115,128,  3,\n    176,236,225,244,233,110,128,  2,138,244,239,238,239,115,128,  3,\n    205,244,225,227,107,  2,200,202,200,213,226,229,236,239,247,227,\n    237, 98,128,  3, 29,237,239,100,128,  2,212,114,  2,200,225,200,\n    237,225,231,245,242,237,245,235,232,105,128, 10,115,233,238,103,\n    128,  1,111,115,  3,200,251,201, 10,201, 55,232,239,242,244,227,\n    249,242,233,236,236,233, 99,128,  4, 94,237,225,236,108,  2,201,\n     19,201, 30,232,233,242,225,231,225,238, 97,128, 48, 69,235,225,\n    244,225,235,225,238, 97,129, 48,165,201, 43,232,225,236,230,247,\n    233,228,244,104,128,255,105,244,242,225,233,231,232,116,  2,201,\n     67,201, 78,227,249,242,233,236,236,233, 99,128,  4,175,243,244,\n    242,239,235,229,227,249,242,233,236,236,233, 99,128,  4,177,244,\n    233,236,228,101,130,  1,105,201,107,201,115,225,227,245,244,101,\n    128, 30,121,226,229,236,239,119,128, 30,117,117,  5,201,135,201,\n    145,201,152,201,177,201,193,226,229,238,231,225,236,105,128,  9,\n    138,228,229,246, 97,128,  9, 10,231,117,  2,201,159,201,168,234,\n    225,242,225,244,105,128, 10,138,242,237,245,235,232,105,128, 10,\n     10,237,225,244,242,225,231,245,242,237,245,235,232,105,128, 10,\n     66,246,239,247,229,236,243,233,231,110,  3,201,209,201,219,201,\n    226,226,229,238,231,225,236,105,128,  9,194,228,229,246, 97,128,\n      9, 66,231,245,234,225,242,225,244,105,128, 10,194,246,239,247,\n    229,236,243,233,231,110,  3,201,253,202,  7,202, 14,226,229,238,\n    231,225,236,105,128,  9,193,228,229,246, 97,128,  9, 65,231,245,\n    234,225,242,225,244,105,128, 10,193,118,139,  0,118,202, 51,202,\n    199,202,208,202,219,203,148,203,155,203,253,204,  9,204,109,204,\n    117,204,138, 97,  4,202, 61,202, 68,202, 93,202,104,228,229,246,\n     97,128,  9, 53,231,117,  2,202, 75,202, 84,234,225,242,225,244,\n    105,128, 10,181,242,237,245,235,232,105,128, 10, 53,235,225,244,\n    225,235,225,238, 97,128, 48,247,118,132,  5,213,202,116,202,143,\n    202,175,202,187,228,225,231,229,243,104,130,251, 53,202,129,202,\n    134,182, 53,128,251, 53,232,229,226,242,229,119,128,251, 53,104,\n      2,202,149,202,157,229,226,242,229,119,128,  5,213,239,236,225,\n    109,129,251, 75,202,166,232,229,226,242,229,119,128,251, 75,246,\n    225,246,232,229,226,242,229,119,128,  5,240,249,239,228,232,229,\n    226,242,229,119,128,  5,241,227,233,242,227,236,101,128, 36,229,\n    228,239,244,226,229,236,239,119,128, 30,127,101,  6,202,233,202,\n    244,203, 52,203, 63,203, 69,203,136,227,249,242,233,236,236,233,\n     99,128,  4, 50,104,  4,202,254,203,  7,203, 21,203, 37,225,242,\n    225,226,233, 99,128,  6,164,230,233,238,225,236,225,242,225,226,\n    233, 99,128,251,107,233,238,233,244,233,225,236,225,242,225,226,\n    233, 99,128,251,108,237,229,228,233,225,236,225,242,225,226,233,\n     99,128,251,109,235,225,244,225,235,225,238, 97,128, 48,249,238,\n    245,115,128, 38, 64,242,244,233,227,225,108,  2,203, 80,203, 86,\n    226,225,114,128,  0,124,236,233,238,101,  4,203, 99,203,110,203,\n    121,203,130,225,226,239,246,229,227,237, 98,128,  3, 13,226,229,\n    236,239,247,227,237, 98,128,  3, 41,236,239,247,237,239,100,128,\n      2,204,237,239,100,128,  2,200,247,225,242,237,229,238,233,225,\n    110,128,  5,126,232,239,239,107,128,  2,139,105,  3,203,163,203,\n    174,203,213,235,225,244,225,235,225,238, 97,128, 48,248,242,225,\n    237, 97,  3,203,185,203,195,203,202,226,229,238,231,225,236,105,\n    128,  9,205,228,229,246, 97,128,  9, 77,231,245,234,225,242,225,\n    244,105,128, 10,205,243,225,242,231, 97,  3,203,225,203,235,203,\n    242,226,229,238,231,225,236,105,128,  9,131,228,229,246, 97,128,\n      9,  3,231,245,234,225,242,225,244,105,128, 10,131,237,239,238,\n    239,243,240,225,227,101,128,255, 86,111,  3,204, 17,204, 28,204,\n     98,225,242,237,229,238,233,225,110,128,  5,120,233,227,229,100,\n      2,204, 37,204, 73,233,244,229,242,225,244,233,239,110,  2,204,\n     51,204, 62,232,233,242,225,231,225,238, 97,128, 48,158,235,225,\n    244,225,235,225,238, 97,128, 48,254,237,225,242,235,235,225,238,\n     97,129, 48,155,204, 86,232,225,236,230,247,233,228,244,104,128,\n    255,158,235,225,244,225,235,225,238, 97,128, 48,250,240,225,242,\n    229,110,128, 36,177,116,  2,204,123,204,130,233,236,228,101,128,\n     30,125,245,242,238,229,100,128,  2,140,117,  2,204,144,204,155,\n    232,233,242,225,231,225,238, 97,128, 48,148,235,225,244,225,235,\n    225,238, 97,128, 48,244,119,143,  0,119,204,200,205,177,205,187,\n    205,210,205,250,206, 61,206, 69,208, 40,208, 81,208, 93,208,168,\n    208,176,208,183,208,194,208,203, 97,  8,204,218,204,225,204,235,\n    204,246,205, 28,205, 60,205, 72,205,108,227,245,244,101,128, 30,\n    131,229,235,239,242,229,225,110,128, 49, 89,232,233,242,225,231,\n    225,238, 97,128, 48,143,107,  2,204,252,205, 20,225,244,225,235,\n    225,238, 97,129, 48,239,205,  8,232,225,236,230,247,233,228,244,\n    104,128,255,156,239,242,229,225,110,128, 49, 88,243,237,225,236,\n    108,  2,205, 38,205, 49,232,233,242,225,231,225,238, 97,128, 48,\n    142,235,225,244,225,235,225,238, 97,128, 48,238,244,244,239,243,\n    241,245,225,242,101,128, 51, 87,118,  2,205, 78,205, 86,229,228,\n    225,243,104,128, 48, 28,249,245,238,228,229,242,243,227,239,242,\n    229,246,229,242,244,233,227,225,108,128,254, 52,119,  3,205,116,\n    205,125,205,139,225,242,225,226,233, 99,128,  6, 72,230,233,238,\n    225,236,225,242,225,226,233, 99,128,254,238,232,225,237,250,225,\n    225,226,239,246,101,  2,205,154,205,163,225,242,225,226,233, 99,\n    128,  6, 36,230,233,238,225,236,225,242,225,226,233, 99,128,254,\n    134,226,243,241,245,225,242,101,128, 51,221,227,233,242, 99,  2,\n    205,196,205,201,236,101,128, 36,230,245,237,230,236,229,120,128,\n      1,117,100,  2,205,216,205,226,233,229,242,229,243,233,115,128,\n     30,133,239,116,  2,205,233,205,242,225,227,227,229,238,116,128,\n     30,135,226,229,236,239,119,128, 30,137,101,  4,206,  4,206, 15,\n    206, 27,206, 51,232,233,242,225,231,225,238, 97,128, 48,145,233,\n    229,242,243,244,242,225,243,115,128, 33, 24,107,  2,206, 33,206,\n     43,225,244,225,235,225,238, 97,128, 48,241,239,242,229,225,110,\n    128, 49, 94,239,235,239,242,229,225,110,128, 49, 93,231,242,225,\n    246,101,128, 30,129,232,233,244,101,  8,206, 90,206, 99,206,183,\n    207, 17,207,101,207,146,207,198,207,254,226,245,236,236,229,116,\n    128, 37,230, 99,  2,206,105,206,125,233,242,227,236,101,129, 37,\n    203,206,115,233,238,246,229,242,243,101,128, 37,217,239,242,238,\n    229,242,226,242,225,227,235,229,116,  2,206,142,206,162,236,229,\n    230,116,129, 48, 14,206,151,246,229,242,244,233,227,225,108,128,\n    254, 67,242,233,231,232,116,129, 48, 15,206,172,246,229,242,244,\n    233,227,225,108,128,254, 68,100,  2,206,189,206,230,233,225,237,\n    239,238,100,129, 37,199,206,200,227,239,238,244,225,233,238,233,\n    238,231,226,236,225,227,235,243,237,225,236,236,228,233,225,237,\n    239,238,100,128, 37,200,239,247,238,240,239,233,238,244,233,238,\n    103,  2,206,246,207,  6,243,237,225,236,236,244,242,233,225,238,\n    231,236,101,128, 37,191,244,242,233,225,238,231,236,101,128, 37,\n    189,236,101,  2,207, 24,207, 66,230,244,240,239,233,238,244,233,\n    238,103,  2,207, 39,207, 55,243,237,225,236,236,244,242,233,225,\n    238,231,236,101,128, 37,195,244,242,233,225,238,231,236,101,128,\n     37,193,238,244,233,227,245,236,225,242,226,242,225,227,235,229,\n    116,  2,207, 86,207, 93,236,229,230,116,128, 48, 22,242,233,231,\n    232,116,128, 48, 23,242,233,231,232,244,240,239,233,238,244,233,\n    238,103,  2,207,119,207,135,243,237,225,236,236,244,242,233,225,\n    238,231,236,101,128, 37,185,244,242,233,225,238,231,236,101,128,\n     37,183,115,  3,207,154,207,184,207,192,109,  2,207,160,207,172,\n    225,236,236,243,241,245,225,242,101,128, 37,171,233,236,233,238,\n    231,230,225,227,101,128, 38, 58,241,245,225,242,101,128, 37,161,\n    244,225,114,128, 38,  6,116,  2,207,204,207,215,229,236,229,240,\n    232,239,238,101,128, 38, 15,239,242,244,239,233,243,229,243,232,\n    229,236,236,226,242,225,227,235,229,116,  2,207,239,207,246,236,\n    229,230,116,128, 48, 24,242,233,231,232,116,128, 48, 25,245,240,\n    240,239,233,238,244,233,238,103,  2,208, 13,208, 29,243,237,225,\n    236,236,244,242,233,225,238,231,236,101,128, 37,181,244,242,233,\n    225,238,231,236,101,128, 37,179,105,  2,208, 46,208, 57,232,233,\n    242,225,231,225,238, 97,128, 48,144,107,  2,208, 63,208, 73,225,\n    244,225,235,225,238, 97,128, 48,240,239,242,229,225,110,128, 49,\n     95,237,239,238,239,243,240,225,227,101,128,255, 87,111,  4,208,\n    103,208,114,208,139,208,157,232,233,242,225,231,225,238, 97,128,\n     48,146,235,225,244,225,235,225,238, 97,129, 48,242,208,127,232,\n    225,236,230,247,233,228,244,104,128,255,102,110,129, 32,169,208,\n    145,237,239,238,239,243,240,225,227,101,128,255,230,247,225,229,\n    238,244,232,225,105,128, 14, 39,240,225,242,229,110,128, 36,178,\n    242,233,238,103,128, 30,152,243,245,240,229,242,233,239,114,128,\n      2,183,244,245,242,238,229,100,128,  2,141,249,238,110,128,  1,\n    191,120,137,  0,120,208,231,208,242,208,253,209,  6,209, 33,209,\n     46,209, 50,209, 62,209, 70,225,226,239,246,229,227,237, 98,128,\n      3, 61,226,239,240,239,237,239,230,111,128, 49, 18,227,233,242,\n    227,236,101,128, 36,231,100,  2,209, 12,209, 22,233,229,242,229,\n    243,233,115,128, 30,141,239,244,225,227,227,229,238,116,128, 30,\n    139,229,232,225,242,237,229,238,233,225,110,128,  5,109,105,128,\n      3,190,237,239,238,239,243,240,225,227,101,128,255, 88,240,225,\n    242,229,110,128, 36,179,243,245,240,229,242,233,239,114,128,  2,\n    227,121,143,  0,121,209,115,210, 74,210, 97,210,137,212,103,212,\n    111,212,128,212,192,212,204,213,201,213,241,213,253,214,  8,214,\n     29,215,  2, 97, 11,209,139,209,151,209,161,209,168,209,175,209,\n    185,209,210,209,221,210,  3,210, 16,210, 62,225,228,239,243,241,\n    245,225,242,101,128, 51, 78,226,229,238,231,225,236,105,128,  9,\n    175,227,245,244,101,128,  0,253,228,229,246, 97,128,  9, 47,229,\n    235,239,242,229,225,110,128, 49, 82,231,117,  2,209,192,209,201,\n    234,225,242,225,244,105,128, 10,175,242,237,245,235,232,105,128,\n     10, 47,232,233,242,225,231,225,238, 97,128, 48,132,107,  2,209,\n    227,209,251,225,244,225,235,225,238, 97,129, 48,228,209,239,232,\n    225,236,230,247,233,228,244,104,128,255,148,239,242,229,225,110,\n    128, 49, 81,237,225,235,235,225,238,244,232,225,105,128, 14, 78,\n    243,237,225,236,108,  2,210, 26,210, 37,232,233,242,225,231,225,\n    238, 97,128, 48,131,235,225,244,225,235,225,238, 97,129, 48,227,\n    210, 50,232,225,236,230,247,233,228,244,104,128,255,108,244,227,\n    249,242,233,236,236,233, 99,128,  4, 99,227,233,242, 99,  2,210,\n     83,210, 88,236,101,128, 36,232,245,237,230,236,229,120,128,  1,\n    119,100,  2,210,103,210,113,233,229,242,229,243,233,115,128,  0,\n    255,239,116,  2,210,120,210,129,225,227,227,229,238,116,128, 30,\n    143,226,229,236,239,119,128, 30,245,101,  7,210,153,211,161,211,\n    170,211,188,211,220,212, 40,212, 91,104,  8,210,171,210,180,210,\n    214,210,228,211, 45,211, 61,211,120,211,138,225,242,225,226,233,\n     99,128,  6, 74,226,225,242,242,229,101,  2,210,191,210,200,225,\n    242,225,226,233, 99,128,  6,210,230,233,238,225,236,225,242,225,\n    226,233, 99,128,251,175,230,233,238,225,236,225,242,225,226,233,\n     99,128,254,242,232,225,237,250,225,225,226,239,246,101,  4,210,\n    247,211,  0,211, 14,211, 30,225,242,225,226,233, 99,128,  6, 38,\n    230,233,238,225,236,225,242,225,226,233, 99,128,254,138,233,238,\n    233,244,233,225,236,225,242,225,226,233, 99,128,254,139,237,229,\n    228,233,225,236,225,242,225,226,233, 99,128,254,140,233,238,233,\n    244,233,225,236,225,242,225,226,233, 99,128,254,243,237,101,  2,\n    211, 68,211, 81,228,233,225,236,225,242,225,226,233, 99,128,254,\n    244,229,237,105,  2,211, 89,211,104,238,233,244,233,225,236,225,\n    242,225,226,233, 99,128,252,221,243,239,236,225,244,229,228,225,\n    242,225,226,233, 99,128,252, 88,238,239,239,238,230,233,238,225,\n    236,225,242,225,226,233, 99,128,252,148,244,232,242,229,229,228,\n    239,244,243,226,229,236,239,247,225,242,225,226,233, 99,128,  6,\n    209,235,239,242,229,225,110,128, 49, 86,110,129,  0,165,211,176,\n    237,239,238,239,243,240,225,227,101,128,255,229,111,  2,211,194,\n    211,203,235,239,242,229,225,110,128, 49, 85,242,233,238,232,233,\n    229,245,232,235,239,242,229,225,110,128, 49,134,114,  3,211,228,\n    212,  8,212, 20,225,232,226,229,238,249,239,237,111,  2,211,242,\n    211,251,232,229,226,242,229,119,128,  5,170,236,229,230,244,232,\n    229,226,242,229,119,128,  5,170,233,227,249,242,233,236,236,233,\n     99,128,  4, 75,245,228,233,229,242,229,243,233,243,227,249,242,\n    233,236,236,233, 99,128,  4,249,243,233,229,245,238,103,  3,212,\n     53,212, 62,212, 78,235,239,242,229,225,110,128, 49,129,240,225,\n    238,243,233,239,243,235,239,242,229,225,110,128, 49,131,243,233,\n    239,243,235,239,242,229,225,110,128, 49,130,244,233,246,232,229,\n    226,242,229,119,128,  5,154,231,242,225,246,101,128, 30,243,232,\n    239,239,107,129,  1,180,212,120,225,226,239,246,101,128, 30,247,\n    105,  5,212,140,212,151,212,162,212,171,212,179,225,242,237,229,\n    238,233,225,110,128,  5,117,227,249,242,233,236,236,233, 99,128,\n      4, 87,235,239,242,229,225,110,128, 49, 98,238,249,225,238,103,\n    128, 38, 47,247,238,225,242,237,229,238,233,225,110,128,  5,130,\n    237,239,238,239,243,240,225,227,101,128,255, 89,111,  7,212,220,\n    213, 34,213, 45,213, 55,213, 93,213,139,213,148,100,131,  5,217,\n    212,230,212,250,213,  3,228,225,231,229,243,104,129,251, 57,212,\n    241,232,229,226,242,229,119,128,251, 57,232,229,226,242,229,119,\n    128,  5,217,249,239,100,  2,213, 11,213, 20,232,229,226,242,229,\n    119,128,  5,242,240,225,244,225,232,232,229,226,242,229,119,128,\n    251, 31,232,233,242,225,231,225,238, 97,128, 48,136,233,235,239,\n    242,229,225,110,128, 49,137,107,  2,213, 61,213, 85,225,244,225,\n    235,225,238, 97,129, 48,232,213, 73,232,225,236,230,247,233,228,\n    244,104,128,255,150,239,242,229,225,110,128, 49, 91,243,237,225,\n    236,108,  2,213,103,213,114,232,233,242,225,231,225,238, 97,128,\n     48,135,235,225,244,225,235,225,238, 97,129, 48,231,213,127,232,\n    225,236,230,247,233,228,244,104,128,255,110,244,231,242,229,229,\n    107,128,  3,243,121,  2,213,154,213,191, 97,  2,213,160,213,170,\n    229,235,239,242,229,225,110,128, 49,136,107,  2,213,176,213,184,\n    239,242,229,225,110,128, 49,135,244,232,225,105,128, 14, 34,233,\n    238,231,244,232,225,105,128, 14, 13,112,  2,213,207,213,214,225,\n    242,229,110,128, 36,180,239,231,229,231,242,225,237,237,229,238,\n    105,129,  3,122,213,230,231,242,229,229,235,227,237, 98,128,  3,\n     69,114,129,  1,166,213,247,233,238,103,128, 30,153,243,245,240,\n    229,242,233,239,114,128,  2,184,116,  2,214, 14,214, 21,233,236,\n    228,101,128, 30,249,245,242,238,229,100,128,  2,142,117,  5,214,\n     41,214, 52,214, 62,214,100,214,232,232,233,242,225,231,225,238,\n     97,128, 48,134,233,235,239,242,229,225,110,128, 49,140,107,  2,\n    214, 68,214, 92,225,244,225,235,225,238, 97,129, 48,230,214, 80,\n    232,225,236,230,247,233,228,244,104,128,255,149,239,242,229,225,\n    110,128, 49, 96,115,  3,214,108,214,146,214,187,226,233,103,  2,\n    214,116,214,127,227,249,242,233,236,236,233, 99,128,  4,107,233,\n    239,244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128,\n      4,109,236,233,244,244,236,101,  2,214,157,214,168,227,249,242,\n    233,236,236,233, 99,128,  4,103,233,239,244,233,230,233,229,228,\n    227,249,242,233,236,236,233, 99,128,  4,105,237,225,236,108,  2,\n    214,196,214,207,232,233,242,225,231,225,238, 97,128, 48,133,235,\n    225,244,225,235,225,238, 97,129, 48,229,214,220,232,225,236,230,\n    247,233,228,244,104,128,255,109,249,101,  2,214,239,214,248,235,\n    239,242,229,225,110,128, 49,139,239,235,239,242,229,225,110,128,\n     49,138,249, 97,  2,215,  9,215, 19,226,229,238,231,225,236,105,\n    128,  9,223,228,229,246, 97,128,  9, 95,122,142,  0,122,215, 58,\n    216, 66,216, 77,216,120,216,147,217,182,218, 34,218, 76,218, 88,\n    218,100,218,128,218,136,218,152,218,161, 97, 10,215, 80,215, 91,\n    215, 98,215,105,215,116,215,194,215,224,215,235,216, 15,216, 27,\n    225,242,237,229,238,233,225,110,128,  5,102,227,245,244,101,128,\n      1,122,228,229,246, 97,128,  9, 91,231,245,242,237,245,235,232,\n    105,128, 10, 91,104,  4,215,126,215,135,215,149,215,179,225,242,\n    225,226,233, 99,128,  6, 56,230,233,238,225,236,225,242,225,226,\n    233, 99,128,254,198,105,  2,215,155,215,170,238,233,244,233,225,\n    236,225,242,225,226,233, 99,128,254,199,242,225,231,225,238, 97,\n    128, 48, 86,237,229,228,233,225,236,225,242,225,226,233, 99,128,\n    254,200,233,110,  2,215,201,215,210,225,242,225,226,233, 99,128,\n      6, 50,230,233,238,225,236,225,242,225,226,233, 99,128,254,176,\n    235,225,244,225,235,225,238, 97,128, 48,182,241,229,102,  2,215,\n    243,216,  1,231,225,228,239,236,232,229,226,242,229,119,128,  5,\n    149,241,225,244,225,238,232,229,226,242,229,119,128,  5,148,242,\n    241,225,232,229,226,242,229,119,128,  5,152,249,233,110,130,  5,\n    214,216, 37,216, 57,228,225,231,229,243,104,129,251, 54,216, 48,\n    232,229,226,242,229,119,128,251, 54,232,229,226,242,229,119,128,\n      5,214,226,239,240,239,237,239,230,111,128, 49, 23, 99,  3,216,\n     85,216, 92,216,114,225,242,239,110,128,  1,126,233,242, 99,  2,\n    216,100,216,105,236,101,128, 36,233,245,237,230,236,229,120,128,\n     30,145,245,242,108,128,  2,145,228,239,116,130,  1,124,216,130,\n    216,139,225,227,227,229,238,116,128,  1,124,226,229,236,239,119,\n    128, 30,147,101,  6,216,161,216,172,216,215,216,226,216,237,217,\n    177,227,249,242,233,236,236,233, 99,128,  4, 55,100,  2,216,178,\n    216,197,229,243,227,229,238,228,229,242,227,249,242,233,236,236,\n    233, 99,128,  4,153,233,229,242,229,243,233,243,227,249,242,233,\n    236,236,233, 99,128,  4,223,232,233,242,225,231,225,238, 97,128,\n     48, 92,235,225,244,225,235,225,238, 97,128, 48,188,242,111,140,\n      0, 48,217, 10,217, 19,217, 29,217, 36,217, 61,217, 74,217, 85,\n    217, 97,217,108,217,118,217,129,217,136,225,242,225,226,233, 99,\n    128,  6, 96,226,229,238,231,225,236,105,128,  9,230,228,229,246,\n     97,128,  9,102,231,117,  2,217, 43,217, 52,234,225,242,225,244,\n    105,128, 10,230,242,237,245,235,232,105,128, 10,102,232,225,227,\n    235,225,242,225,226,233, 99,128,  6, 96,233,238,230,229,242,233,\n    239,114,128, 32,128,237,239,238,239,243,240,225,227,101,128,255,\n     16,239,236,228,243,244,249,236,101,128,247, 48,240,229,242,243,\n    233,225,110,128,  6,240,243,245,240,229,242,233,239,114,128, 32,\n    112,244,232,225,105,128, 14, 80,247,233,228,244,104,  3,217,148,\n    217,157,217,169,234,239,233,238,229,114,128,254,255,238,239,238,\n    234,239,233,238,229,114,128, 32, 12,243,240,225,227,101,128, 32,\n     11,244, 97,128,  3,182,104,  2,217,188,217,199,226,239,240,239,\n    237,239,230,111,128, 49, 19,101,  4,217,209,217,220,217,236,217,\n    247,225,242,237,229,238,233,225,110,128,  5,106,226,242,229,246,\n    229,227,249,242,233,236,236,233, 99,128,  4,194,227,249,242,233,\n    236,236,233, 99,128,  4, 54,100,  2,217,253,218, 16,229,243,227,\n    229,238,228,229,242,227,249,242,233,236,236,233, 99,128,  4,151,\n    233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99,128,\n      4,221,105,  3,218, 42,218, 53,218, 64,232,233,242,225,231,225,\n    238, 97,128, 48, 88,235,225,244,225,235,225,238, 97,128, 48,184,\n    238,239,242,232,229,226,242,229,119,128,  5,174,236,233,238,229,\n    226,229,236,239,119,128, 30,149,237,239,238,239,243,240,225,227,\n    101,128,255, 90,111,  2,218,106,218,117,232,233,242,225,231,225,\n    238, 97,128, 48, 94,235,225,244,225,235,225,238, 97,128, 48,190,\n    240,225,242,229,110,128, 36,181,242,229,244,242,239,230,236,229,\n    248,232,239,239,107,128,  2,144,243,244,242,239,235,101,128,  1,\n    182,117,  2,218,167,218,178,232,233,242,225,231,225,238, 97,128,\n     48, 90,235,225,244,225,235,225,238, 97,128, 48,186\n  };\n\n\n  /*\n   *  This function searches the compressed table efficiently.\n   */\n  static unsigned long\n  ft_get_adobe_glyph_index( const char*  name,\n                            const char*  limit )\n  {\n    int                   c = 0;\n    int                   count, min, max;\n    const unsigned char*  p = ft_adobe_glyph_list;\n\n\n    if ( name == 0 || name >= limit )\n      goto NotFound;\n\n    c     = *name++;\n    count = p[1];\n    p    += 2;\n\n    min = 0;\n    max = count;\n\n    while ( min < max )\n    {\n      int                   mid = ( min + max ) >> 1;\n      const unsigned char*  q   = p + mid * 2;\n      int                   c2;\n\n\n      q = ft_adobe_glyph_list + ( ( (int)q[0] << 8 ) | q[1] );\n\n      c2 = q[0] & 127;\n      if ( c2 == c )\n      {\n        p = q;\n        goto Found;\n      }\n      if ( c2 < c )\n        min = mid + 1;\n      else\n        max = mid;\n    }\n    goto NotFound;\n\n  Found:\n    for (;;)\n    {\n      /* assert (*p & 127) == c */\n\n      if ( name >= limit )\n      {\n        if ( (p[0] & 128) == 0 &&\n             (p[1] & 128) != 0 )\n          return (unsigned long)( ( (int)p[2] << 8 ) | p[3] );\n\n        goto NotFound;\n      }\n      c = *name++;\n      if ( p[0] & 128 )\n      {\n        p++;\n        if ( c != (p[0] & 127) )\n          goto NotFound;\n\n        continue;\n      }\n\n      p++;\n      count = p[0] & 127;\n      if ( p[0] & 128 )\n        p += 2;\n\n      p++;\n\n      for ( ; count > 0; count--, p += 2 )\n      {\n        int                   offset = ( (int)p[0] << 8 ) | p[1];\n        const unsigned char*  q      = ft_adobe_glyph_list + offset;\n\n        if ( c == ( q[0] & 127 ) )\n        {\n          p = q;\n          goto NextIter;\n        }\n      }\n      goto NotFound;\n\n    NextIter:\n      ;\n    }\n\n  NotFound:\n    return 0;\n  }\n\n#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/raster/Jamfile",
    "content": "# FreeType 2 src/raster Jamfile\n#\n# Copyright 2001 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) raster ;\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = ftraster ftrend1 rastpic ;\n  }\n  else\n  {\n    _sources = raster ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/raster Jamfile\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftmisc.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftmisc.h                                                               */\n/*                                                                         */\n/*    Miscellaneous macros for stand-alone rasterizer (specification       */\n/*    only).                                                               */\n/*                                                                         */\n/*  Copyright 2005, 2009, 2010 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used        */\n/*  modified and distributed under the terms of the FreeType project       */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /***************************************************/\n  /*                                                 */\n  /* This file is *not* portable!  You have to adapt */\n  /* its definitions to your platform.               */\n  /*                                                 */\n  /***************************************************/\n\n#ifndef __FTMISC_H__\n#define __FTMISC_H__\n\n\n  /* memset */\n#include \"../../include/freetype/config/ftstdlib.h\"\n\n#define FT_BEGIN_HEADER\n#define FT_END_HEADER\n\n#define FT_LOCAL_DEF( x )   static x\n\n\n  /* from include/freetype2/fttypes.h */\n\n  typedef unsigned char  FT_Byte;\n  typedef signed int     FT_Int;\n  typedef unsigned int   FT_UInt;\n  typedef signed long    FT_Long;\n  typedef unsigned long  FT_ULong;\n  typedef signed long    FT_F26Dot6;\n  typedef int            FT_Error;\n\n#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \\\n          ( ( (FT_ULong)_x1 << 24 ) |     \\\n            ( (FT_ULong)_x2 << 16 ) |     \\\n            ( (FT_ULong)_x3 <<  8 ) |     \\\n              (FT_ULong)_x4         )\n\n\n  /* from include/freetype2/ftsystem.h */\n\n  typedef struct FT_MemoryRec_*  FT_Memory;\n\n  typedef void* (*FT_Alloc_Func)( FT_Memory  memory,\n                                  long       size );\n\n  typedef void (*FT_Free_Func)( FT_Memory  memory,\n                                void*      block );\n\n  typedef void* (*FT_Realloc_Func)( FT_Memory  memory,\n                                    long       cur_size,\n                                    long       new_size,\n                                    void*      block );\n\n  typedef struct FT_MemoryRec_\n  {\n    void*            user;\n\n    FT_Alloc_Func    alloc;\n    FT_Free_Func     free;\n    FT_Realloc_Func  realloc;\n\n  } FT_MemoryRec;\n\n\n  /* from src/ftcalc.c */\n\n#if ( defined _WIN32 || defined _WIN64 )\n\n  typedef __int64  FT_Int64;\n\n#else\n\n#include \"inttypes.h\"\n\n  typedef int64_t  FT_Int64;\n\n#endif\n\n\n  static FT_Long\n  FT_MulDiv( FT_Long  a,\n             FT_Long  b,\n             FT_Long  c )\n  {\n    FT_Int   s;\n    FT_Long  d;\n\n\n    s = 1;\n    if ( a < 0 ) { a = -a; s = -1; }\n    if ( b < 0 ) { b = -b; s = -s; }\n    if ( c < 0 ) { c = -c; s = -s; }\n\n    d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c\n                         : 0x7FFFFFFFL );\n\n    return ( s > 0 ) ? d : -d;\n  }\n\n\n  static FT_Long\n  FT_MulDiv_No_Round( FT_Long  a,\n                      FT_Long  b,\n                      FT_Long  c )\n  {\n    FT_Int   s;\n    FT_Long  d;\n\n\n    s = 1;\n    if ( a < 0 ) { a = -a; s = -1; }\n    if ( b < 0 ) { b = -b; s = -s; }\n    if ( c < 0 ) { c = -c; s = -s; }\n\n    d = (FT_Long)( c > 0 ? (FT_Int64)a * b / c\n                         : 0x7FFFFFFFL );\n\n    return ( s > 0 ) ? d : -d;\n  }\n\n#endif /* __FTMISC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftraster.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftraster.c                                                             */\n/*                                                                         */\n/*    The FreeType glyph rasterizer (body).                                */\n/*                                                                         */\n/*  Copyright 1996-2003, 2005, 2007-2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file can be compiled without the rest of the FreeType engine, by */\n  /* defining the _STANDALONE_ macro when compiling it.  You also need to  */\n  /* put the files `ftimage.h' and `ftmisc.h' into the $(incdir)           */\n  /* directory.  Typically, you should do something like                   */\n  /*                                                                       */\n  /* - copy `src/raster/ftraster.c' (this file) to your current directory  */\n  /*                                                                       */\n  /* - copy `include/freetype/ftimage.h' and `src/raster/ftmisc.h'         */\n  /*   to your current directory                                           */\n  /*                                                                       */\n  /* - compile `ftraster' with the _STANDALONE_ macro defined, as in       */\n  /*                                                                       */\n  /*     cc -c -D_STANDALONE_ ftraster.c                                   */\n  /*                                                                       */\n  /* The renderer can be initialized with a call to                        */\n  /* `ft_standard_raster.raster_new'; a bitmap can be generated            */\n  /* with a call to `ft_standard_raster.raster_render'.                    */\n  /*                                                                       */\n  /* See the comments and documentation in the file `ftimage.h' for more   */\n  /* details on how the raster works.                                      */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This is a rewrite of the FreeType 1.x scan-line converter             */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifdef _STANDALONE_\n\n#define FT_CONFIG_STANDARD_LIBRARY_H  <stdlib.h>\n\n#include <string.h>           /* for memset */\n\n#include \"ftmisc.h\"\n#include \"ftimage.h\"\n\n#else /* !_STANDALONE_ */\n\n#include \"../../include/ft2build.h\"\n#include \"ftraster.h\"\n#include \"../../include/freetype/internal/ftcalc.h\"   /* for FT_MulDiv and FT_MulDiv_No_Round */\n\n#include \"rastpic.h\"\n\n#endif /* !_STANDALONE_ */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* A simple technical note on how the raster works                       */\n  /* -----------------------------------------------                       */\n  /*                                                                       */\n  /*   Converting an outline into a bitmap is achieved in several steps:   */\n  /*                                                                       */\n  /*   1 - Decomposing the outline into successive `profiles'.  Each       */\n  /*       profile is simply an array of scanline intersections on a given */\n  /*       dimension.  A profile's main attributes are                     */\n  /*                                                                       */\n  /*       o its scanline position boundaries, i.e. `Ymin' and `Ymax'      */\n  /*                                                                       */\n  /*       o an array of intersection coordinates for each scanline        */\n  /*         between `Ymin' and `Ymax'                                     */\n  /*                                                                       */\n  /*       o a direction, indicating whether it was built going `up' or    */\n  /*         `down', as this is very important for filling rules           */\n  /*                                                                       */\n  /*       o its drop-out mode                                             */\n  /*                                                                       */\n  /*   2 - Sweeping the target map's scanlines in order to compute segment */\n  /*       `spans' which are then filled.  Additionally, this pass         */\n  /*       performs drop-out control.                                      */\n  /*                                                                       */\n  /*   The outline data is parsed during step 1 only.  The profiles are    */\n  /*   built from the bottom of the render pool, used as a stack.  The     */\n  /*   following graphics shows the profile list under construction:       */\n  /*                                                                       */\n  /*     __________________________________________________________ _ _    */\n  /*    |         |                 |         |                 |          */\n  /*    | profile | coordinates for | profile | coordinates for |-->       */\n  /*    |    1    |  profile 1      |    2    |  profile 2      |-->       */\n  /*    |_________|_________________|_________|_________________|__ _ _    */\n  /*                                                                       */\n  /*    ^                                                       ^          */\n  /*    |                                                       |          */\n  /* start of render pool                                      top         */\n  /*                                                                       */\n  /*   The top of the profile stack is kept in the `top' variable.         */\n  /*                                                                       */\n  /*   As you can see, a profile record is pushed on top of the render     */\n  /*   pool, which is then followed by its coordinates/intersections.  If  */\n  /*   a change of direction is detected in the outline, a new profile is  */\n  /*   generated until the end of the outline.                             */\n  /*                                                                       */\n  /*   Note that when all profiles have been generated, the function       */\n  /*   Finalize_Profile_Table() is used to record, for each profile, its   */\n  /*   bottom-most scanline as well as the scanline above its upmost       */\n  /*   boundary.  These positions are called `y-turns' because they (sort  */\n  /*   of) correspond to local extrema.  They are stored in a sorted list  */\n  /*   built from the top of the render pool as a downwards stack:         */\n  /*                                                                       */\n  /*      _ _ _______________________________________                      */\n  /*                            |                    |                     */\n  /*                         <--| sorted list of     |                     */\n  /*                         <--|  extrema scanlines |                     */\n  /*      _ _ __________________|____________________|                     */\n  /*                                                                       */\n  /*                            ^                    ^                     */\n  /*                            |                    |                     */\n  /*                         maxBuff           sizeBuff = end of pool      */\n  /*                                                                       */\n  /*   This list is later used during the sweep phase in order to          */\n  /*   optimize performance (see technical note on the sweep below).       */\n  /*                                                                       */\n  /*   Of course, the raster detects whether the two stacks collide and    */\n  /*   handles the situation properly.                                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /**                                                                     **/\n  /**  CONFIGURATION MACROS                                               **/\n  /**                                                                     **/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* define DEBUG_RASTER if you want to compile a debugging version */\n/* #define DEBUG_RASTER */\n\n  /* define FT_RASTER_OPTION_ANTI_ALIASING if you want to support */\n  /* 5-levels anti-aliasing                                       */\n/* #define FT_RASTER_OPTION_ANTI_ALIASING */\n\n  /* The size of the two-lines intermediate bitmap used */\n  /* for anti-aliasing, in bytes.                       */\n#define RASTER_GRAY_LINES  2048\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /**                                                                     **/\n  /**  OTHER MACROS (do not change)                                       **/\n  /**                                                                     **/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_raster\n\n\n#ifdef _STANDALONE_\n\n  /* Auxiliary macros for token concatenation. */\n#define FT_ERR_XCAT( x, y )  x ## y\n#define FT_ERR_CAT( x, y )   FT_ERR_XCAT( x, y )\n\n  /* This macro is used to indicate that a function parameter is unused. */\n  /* Its purpose is simply to reduce compiler warnings.  Note also that  */\n  /* simply defining it as `(void)x' doesn't avoid warnings with certain */\n  /* ANSI compilers (e.g. LCC).                                          */\n#define FT_UNUSED( x )  (x) = (x)\n\n  /* Disable the tracing mechanism for simplicity -- developers can      */\n  /* activate it easily by redefining these macros.                      */\n#ifndef FT_ERROR\n#define FT_ERROR( x )  do { } while ( 0 )     /* nothing */\n#endif\n\n#ifndef FT_TRACE\n#define FT_TRACE( x )   do { } while ( 0 )    /* nothing */\n#define FT_TRACE1( x )  do { } while ( 0 )    /* nothing */\n#define FT_TRACE6( x )  do { } while ( 0 )    /* nothing */\n#endif\n\n#ifndef FT_THROW\n#define FT_THROW( e )  FT_ERR_CAT( Raster_Err_, e )\n#endif\n\n#define Raster_Err_None          0\n#define Raster_Err_Not_Ini      -1\n#define Raster_Err_Overflow     -2\n#define Raster_Err_Neg_Height   -3\n#define Raster_Err_Invalid      -4\n#define Raster_Err_Unsupported  -5\n\n#define ft_memset  memset\n\n#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_, raster_new_, \\\n                                raster_reset_, raster_set_mode_,    \\\n                                raster_render_, raster_done_ )      \\\n          const FT_Raster_Funcs class_ =                            \\\n          {                                                         \\\n            glyph_format_,                                          \\\n            raster_new_,                                            \\\n            raster_reset_,                                          \\\n            raster_set_mode_,                                       \\\n            raster_render_,                                         \\\n            raster_done_                                            \\\n         };\n\n#else /* !_STANDALONE_ */\n\n\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"       /* for FT_TRACE, FT_ERROR, and FT_THROW */\n\n#include \"rasterrs.h\"\n\n#define Raster_Err_None         FT_Err_Ok\n#define Raster_Err_Not_Ini      Raster_Err_Raster_Uninitialized\n#define Raster_Err_Overflow     Raster_Err_Raster_Overflow\n#define Raster_Err_Neg_Height   Raster_Err_Raster_Negative_Height\n#define Raster_Err_Invalid      Raster_Err_Invalid_Outline\n#define Raster_Err_Unsupported  Raster_Err_Cannot_Render_Glyph\n\n\n#endif /* !_STANDALONE_ */\n\n\n#ifndef FT_MEM_SET\n#define FT_MEM_SET( d, s, c )  ft_memset( d, s, c )\n#endif\n\n#ifndef FT_MEM_ZERO\n#define FT_MEM_ZERO( dest, count )  FT_MEM_SET( dest, 0, count )\n#endif\n\n  /* FMulDiv means `Fast MulDiv'; it is used in case where `b' is       */\n  /* typically a small value and the result of a*b is known to fit into */\n  /* 32 bits.                                                           */\n#define FMulDiv( a, b, c )  ( (a) * (b) / (c) )\n\n  /* On the other hand, SMulDiv means `Slow MulDiv', and is used typically */\n  /* for clipping computations.  It simply uses the FT_MulDiv() function   */\n  /* defined in `ftcalc.h'.                                                */\n#define SMulDiv           FT_MulDiv\n#define SMulDiv_No_Round  FT_MulDiv_No_Round\n\n  /* The rasterizer is a very general purpose component; please leave */\n  /* the following redefinitions there (you never know your target    */\n  /* environment).                                                    */\n\n#ifndef TRUE\n#define TRUE   1\n#endif\n\n#ifndef FALSE\n#define FALSE  0\n#endif\n\n#ifndef NULL\n#define NULL  (void*)0\n#endif\n\n#ifndef SUCCESS\n#define SUCCESS  0\n#endif\n\n#ifndef FAILURE\n#define FAILURE  1\n#endif\n\n\n#define MaxBezier  32   /* The maximum number of stacked Bezier curves. */\n                        /* Setting this constant to more than 32 is a   */\n                        /* pure waste of space.                         */\n\n#define Pixel_Bits  6   /* fractional bits of *input* coordinates */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /**                                                                     **/\n  /**  SIMPLE TYPE DECLARATIONS                                           **/\n  /**                                                                     **/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef int             Int;\n  typedef unsigned int    UInt;\n  typedef short           Short;\n  typedef unsigned short  UShort, *PUShort;\n  typedef long            Long, *PLong;\n  typedef unsigned long   ULong;\n\n  typedef unsigned char   Byte, *PByte;\n  typedef char            Bool;\n\n\n  typedef union  Alignment_\n  {\n    long    l;\n    void*   p;\n    void  (*f)(void);\n\n  } Alignment, *PAlignment;\n\n\n  typedef struct  TPoint_\n  {\n    Long  x;\n    Long  y;\n\n  } TPoint;\n\n\n  /* values for the `flags' bit field */\n#define Flow_Up           0x8\n#define Overshoot_Top     0x10\n#define Overshoot_Bottom  0x20\n\n\n  /* States of each line, arc, and profile */\n  typedef enum  TStates_\n  {\n    Unknown_State,\n    Ascending_State,\n    Descending_State,\n    Flat_State\n\n  } TStates;\n\n\n  typedef struct TProfile_  TProfile;\n  typedef TProfile*         PProfile;\n\n  struct  TProfile_\n  {\n    FT_F26Dot6  X;           /* current coordinate during sweep          */\n    PProfile    link;        /* link to next profile (various purposes)  */\n    PLong       offset;      /* start of profile's data in render pool   */\n    unsigned    flags;       /* Bit 0-2: drop-out mode                   */\n                             /* Bit 3: profile orientation (up/down)     */\n                             /* Bit 4: is top profile?                   */\n                             /* Bit 5: is bottom profile?                */\n    long        height;      /* profile's height in scanlines            */\n    long        start;       /* profile's starting scanline              */\n\n    unsigned    countL;      /* number of lines to step before this      */\n                             /* profile becomes drawable                 */\n\n    PProfile    next;        /* next profile in same contour, used       */\n                             /* during drop-out control                  */\n  };\n\n  typedef PProfile   TProfileList;\n  typedef PProfile*  PProfileList;\n\n\n  /* Simple record used to implement a stack of bands, required */\n  /* by the sub-banding mechanism                               */\n  typedef struct  black_TBand_\n  {\n    Short  y_min;   /* band's minimum */\n    Short  y_max;   /* band's maximum */\n\n  } black_TBand;\n\n\n#define AlignProfileSize \\\n  ( ( sizeof ( TProfile ) + sizeof ( Alignment ) - 1 ) / sizeof ( long ) )\n\n\n#undef RAS_ARG\n#undef RAS_ARGS\n#undef RAS_VAR\n#undef RAS_VARS\n\n#ifdef FT_STATIC_RASTER\n\n\n#define RAS_ARGS       /* void */\n#define RAS_ARG        /* void */\n\n#define RAS_VARS       /* void */\n#define RAS_VAR        /* void */\n\n#define FT_UNUSED_RASTER  do { } while ( 0 )\n\n\n#else /* !FT_STATIC_RASTER */\n\n\n#define RAS_ARGS       black_PWorker  worker,\n#define RAS_ARG        black_PWorker  worker\n\n#define RAS_VARS       worker,\n#define RAS_VAR        worker\n\n#define FT_UNUSED_RASTER  FT_UNUSED( worker )\n\n\n#endif /* !FT_STATIC_RASTER */\n\n\n  typedef struct black_TWorker_  black_TWorker, *black_PWorker;\n\n\n  /* prototypes used for sweep function dispatch */\n  typedef void\n  Function_Sweep_Init( RAS_ARGS Short*  min,\n                                Short*  max );\n\n  typedef void\n  Function_Sweep_Span( RAS_ARGS Short       y,\n                                FT_F26Dot6  x1,\n                                FT_F26Dot6  x2,\n                                PProfile    left,\n                                PProfile    right );\n\n  typedef void\n  Function_Sweep_Step( RAS_ARG );\n\n\n  /* NOTE: These operations are only valid on 2's complement processors */\n#undef FLOOR\n#undef CEILING\n#undef TRUNC\n#undef SCALED\n\n#define FLOOR( x )    ( (x) & -ras.precision )\n#define CEILING( x )  ( ( (x) + ras.precision - 1 ) & -ras.precision )\n#define TRUNC( x )    ( (Long)(x) >> ras.precision_bits )\n#define FRAC( x )     ( (x) & ( ras.precision - 1 ) )\n#define SCALED( x )   ( ( (ULong)(x) << ras.scale_shift ) - ras.precision_half )\n\n#define IS_BOTTOM_OVERSHOOT( x ) \\\n          (Bool)( CEILING( x ) - x >= ras.precision_half )\n#define IS_TOP_OVERSHOOT( x )    \\\n          (Bool)( x - FLOOR( x ) >= ras.precision_half )\n\n  /* The most used variables are positioned at the top of the structure. */\n  /* Thus, their offset can be coded with less opcodes, resulting in a   */\n  /* smaller executable.                                                 */\n\n  struct  black_TWorker_\n  {\n    Int         precision_bits;     /* precision related variables         */\n    Int         precision;\n    Int         precision_half;\n    Int         precision_shift;\n    Int         precision_step;\n    Int         precision_jitter;\n\n    Int         scale_shift;        /* == precision_shift   for bitmaps    */\n                                    /* == precision_shift+1 for pixmaps    */\n\n    PLong       buff;               /* The profiles buffer                 */\n    PLong       sizeBuff;           /* Render pool size                    */\n    PLong       maxBuff;            /* Profiles buffer size                */\n    PLong       top;                /* Current cursor in buffer            */\n\n    FT_Error    error;\n\n    Int         numTurns;           /* number of Y-turns in outline        */\n\n    TPoint*     arc;                /* current Bezier arc pointer          */\n\n    UShort      bWidth;             /* target bitmap width                 */\n    PByte       bTarget;            /* target bitmap buffer                */\n    PByte       gTarget;            /* target pixmap buffer                */\n\n    Long        lastX, lastY;\n    Long        minY, maxY;\n\n    UShort      num_Profs;          /* current number of profiles          */\n\n    Bool        fresh;              /* signals a fresh new profile which   */\n                                    /* `start' field must be completed     */\n    Bool        joint;              /* signals that the last arc ended     */\n                                    /* exactly on a scanline.  Allows      */\n                                    /* removal of doublets                 */\n    PProfile    cProfile;           /* current profile                     */\n    PProfile    fProfile;           /* head of linked list of profiles     */\n    PProfile    gProfile;           /* contour's first profile in case     */\n                                    /* of impact                           */\n\n    TStates     state;              /* rendering state                     */\n\n    FT_Bitmap   target;             /* description of target bit/pixmap    */\n    FT_Outline  outline;\n\n    Long        traceOfs;           /* current offset in target bitmap     */\n    Long        traceG;             /* current offset in target pixmap     */\n\n    Short       traceIncr;          /* sweep's increment in target bitmap  */\n\n    Short       gray_min_x;         /* current min x during gray rendering */\n    Short       gray_max_x;         /* current max x during gray rendering */\n\n    /* dispatch variables */\n\n    Function_Sweep_Init*  Proc_Sweep_Init;\n    Function_Sweep_Span*  Proc_Sweep_Span;\n    Function_Sweep_Span*  Proc_Sweep_Drop;\n    Function_Sweep_Step*  Proc_Sweep_Step;\n\n    Byte        dropOutControl;     /* current drop_out control method     */\n\n    Bool        second_pass;        /* indicates whether a horizontal pass */\n                                    /* should be performed to control      */\n                                    /* drop-out accurately when calling    */\n                                    /* Render_Glyph.  Note that there is   */\n                                    /* no horizontal pass during gray      */\n                                    /* rendering.                          */\n\n    TPoint      arcs[3 * MaxBezier + 1]; /* The Bezier stack               */\n\n    black_TBand  band_stack[16];    /* band stack used for sub-banding     */\n    Int          band_top;          /* band stack top                      */\n\n#ifdef FT_RASTER_OPTION_ANTI_ALIASING\n\n    Byte*       grays;\n\n    Byte        gray_lines[RASTER_GRAY_LINES];\n                                /* Intermediate table used to render the   */\n                                /* graylevels pixmaps.                     */\n                                /* gray_lines is a buffer holding two      */\n                                /* monochrome scanlines                    */\n\n    Short       gray_width;     /* width in bytes of one monochrome        */\n                                /* intermediate scanline of gray_lines.    */\n                                /* Each gray pixel takes 2 bits long there */\n\n                       /* The gray_lines must hold 2 lines, thus with size */\n                       /* in bytes of at least `gray_width*2'.             */\n\n#endif /* FT_RASTER_ANTI_ALIASING */\n\n  };\n\n\n  typedef struct  black_TRaster_\n  {\n    char*          buffer;\n    long           buffer_size;\n    void*          memory;\n    black_PWorker  worker;\n    Byte           grays[5];\n    Short          gray_width;\n\n  } black_TRaster, *black_PRaster;\n\n#ifdef FT_STATIC_RASTER\n\n  static black_TWorker  cur_ras;\n#define ras  cur_ras\n\n#else /* !FT_STATIC_RASTER */\n\n#define ras  (*worker)\n\n#endif /* !FT_STATIC_RASTER */\n\n\n#ifdef FT_RASTER_OPTION_ANTI_ALIASING\n\n  /* A lookup table used to quickly count set bits in four gray 2x2 */\n  /* cells.  The values of the table have been produced with the    */\n  /* following code:                                                */\n  /*                                                                */\n  /*   for ( i = 0; i < 256; i++ )                                  */\n  /*   {                                                            */\n  /*     l = 0;                                                     */\n  /*     j = i;                                                     */\n  /*                                                                */\n  /*     for ( c = 0; c < 4; c++ )                                  */\n  /*     {                                                          */\n  /*       l <<= 4;                                                 */\n  /*                                                                */\n  /*       if ( j & 0x80 ) l++;                                     */\n  /*       if ( j & 0x40 ) l++;                                     */\n  /*                                                                */\n  /*       j = ( j << 2 ) & 0xFF;                                   */\n  /*     }                                                          */\n  /*     printf( \"0x%04X\", l );                                     */\n  /*   }                                                            */\n  /*                                                                */\n\n  static const short  count_table[256] =\n  {\n    0x0000, 0x0001, 0x0001, 0x0002, 0x0010, 0x0011, 0x0011, 0x0012,\n    0x0010, 0x0011, 0x0011, 0x0012, 0x0020, 0x0021, 0x0021, 0x0022,\n    0x0100, 0x0101, 0x0101, 0x0102, 0x0110, 0x0111, 0x0111, 0x0112,\n    0x0110, 0x0111, 0x0111, 0x0112, 0x0120, 0x0121, 0x0121, 0x0122,\n    0x0100, 0x0101, 0x0101, 0x0102, 0x0110, 0x0111, 0x0111, 0x0112,\n    0x0110, 0x0111, 0x0111, 0x0112, 0x0120, 0x0121, 0x0121, 0x0122,\n    0x0200, 0x0201, 0x0201, 0x0202, 0x0210, 0x0211, 0x0211, 0x0212,\n    0x0210, 0x0211, 0x0211, 0x0212, 0x0220, 0x0221, 0x0221, 0x0222,\n    0x1000, 0x1001, 0x1001, 0x1002, 0x1010, 0x1011, 0x1011, 0x1012,\n    0x1010, 0x1011, 0x1011, 0x1012, 0x1020, 0x1021, 0x1021, 0x1022,\n    0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,\n    0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,\n    0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,\n    0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,\n    0x1200, 0x1201, 0x1201, 0x1202, 0x1210, 0x1211, 0x1211, 0x1212,\n    0x1210, 0x1211, 0x1211, 0x1212, 0x1220, 0x1221, 0x1221, 0x1222,\n    0x1000, 0x1001, 0x1001, 0x1002, 0x1010, 0x1011, 0x1011, 0x1012,\n    0x1010, 0x1011, 0x1011, 0x1012, 0x1020, 0x1021, 0x1021, 0x1022,\n    0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,\n    0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,\n    0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,\n    0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,\n    0x1200, 0x1201, 0x1201, 0x1202, 0x1210, 0x1211, 0x1211, 0x1212,\n    0x1210, 0x1211, 0x1211, 0x1212, 0x1220, 0x1221, 0x1221, 0x1222,\n    0x2000, 0x2001, 0x2001, 0x2002, 0x2010, 0x2011, 0x2011, 0x2012,\n    0x2010, 0x2011, 0x2011, 0x2012, 0x2020, 0x2021, 0x2021, 0x2022,\n    0x2100, 0x2101, 0x2101, 0x2102, 0x2110, 0x2111, 0x2111, 0x2112,\n    0x2110, 0x2111, 0x2111, 0x2112, 0x2120, 0x2121, 0x2121, 0x2122,\n    0x2100, 0x2101, 0x2101, 0x2102, 0x2110, 0x2111, 0x2111, 0x2112,\n    0x2110, 0x2111, 0x2111, 0x2112, 0x2120, 0x2121, 0x2121, 0x2122,\n    0x2200, 0x2201, 0x2201, 0x2202, 0x2210, 0x2211, 0x2211, 0x2212,\n    0x2210, 0x2211, 0x2211, 0x2212, 0x2220, 0x2221, 0x2221, 0x2222\n  };\n\n#endif /* FT_RASTER_OPTION_ANTI_ALIASING */\n\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /**                                                                     **/\n  /**  PROFILES COMPUTATION                                               **/\n  /**                                                                     **/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Set_High_Precision                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Set precision variables according to param flag.                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    High :: Set to True for high precision (typically for ppem < 24),  */\n  /*            false otherwise.                                           */\n  /*                                                                       */\n  static void\n  Set_High_Precision( RAS_ARGS Int  High )\n  {\n    /*\n     * `precision_step' is used in `Bezier_Up' to decide when to split a\n     * given y-monotonous Bezier arc that crosses a scanline before\n     * approximating it as a straight segment.  The default value of 32 (for\n     * low accuracy) corresponds to\n     *\n     *   32 / 64 == 0.5 pixels ,\n     *\n     * while for the high accuracy case we have\n     *\n     *   256/ (1 << 12) = 0.0625 pixels .\n     *\n     * `precision_jitter' is an epsilon threshold used in\n     * `Vertical_Sweep_Span' to deal with small imperfections in the Bezier\n     * decomposition (after all, we are working with approximations only);\n     * it avoids switching on additional pixels which would cause artifacts\n     * otherwise.\n     *\n     * The value of `precision_jitter' has been determined heuristically.\n     *\n     */\n\n    if ( High )\n    {\n      ras.precision_bits   = 12;\n      ras.precision_step   = 256;\n      ras.precision_jitter = 30;\n    }\n    else\n    {\n      ras.precision_bits   = 6;\n      ras.precision_step   = 32;\n      ras.precision_jitter = 2;\n    }\n\n    FT_TRACE6(( \"Set_High_Precision(%s)\\n\", High ? \"true\" : \"false\" ));\n\n    ras.precision       = 1 << ras.precision_bits;\n    ras.precision_half  = ras.precision / 2;\n    ras.precision_shift = ras.precision_bits - Pixel_Bits;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    New_Profile                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a new profile in the render pool.                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    aState    :: The state/orientation of the new profile.             */\n  /*                                                                       */\n  /*    overshoot :: Whether the profile's unrounded start position        */\n  /*                 differs by at least a half pixel.                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*   SUCCESS on success.  FAILURE in case of overflow or of incoherent   */\n  /*   profile.                                                            */\n  /*                                                                       */\n  static Bool\n  New_Profile( RAS_ARGS TStates  aState,\n                        Bool     overshoot )\n  {\n    if ( !ras.fProfile )\n    {\n      ras.cProfile  = (PProfile)ras.top;\n      ras.fProfile  = ras.cProfile;\n      ras.top      += AlignProfileSize;\n    }\n\n    if ( ras.top >= ras.maxBuff )\n    {\n      ras.error = FT_THROW( Overflow );\n      return FAILURE;\n    }\n\n    ras.cProfile->flags  = 0;\n    ras.cProfile->start  = 0;\n    ras.cProfile->height = 0;\n    ras.cProfile->offset = ras.top;\n    ras.cProfile->link   = (PProfile)0;\n    ras.cProfile->next   = (PProfile)0;\n    ras.cProfile->flags  = ras.dropOutControl;\n\n    switch ( aState )\n    {\n    case Ascending_State:\n      ras.cProfile->flags |= Flow_Up;\n      if ( overshoot )\n        ras.cProfile->flags |= Overshoot_Bottom;\n\n      FT_TRACE6(( \"New ascending profile = %p\\n\", ras.cProfile ));\n      break;\n\n    case Descending_State:\n      if ( overshoot )\n        ras.cProfile->flags |= Overshoot_Top;\n      FT_TRACE6(( \"New descending profile = %p\\n\", ras.cProfile ));\n      break;\n\n    default:\n      FT_ERROR(( \"New_Profile: invalid profile direction\\n\" ));\n      ras.error = FT_THROW( Invalid );\n      return FAILURE;\n    }\n\n    if ( !ras.gProfile )\n      ras.gProfile = ras.cProfile;\n\n    ras.state = aState;\n    ras.fresh = TRUE;\n    ras.joint = FALSE;\n\n    return SUCCESS;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    End_Profile                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Finalize the current profile.                                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    overshoot :: Whether the profile's unrounded end position differs  */\n  /*                 by at least a half pixel.                             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    SUCCESS on success.  FAILURE in case of overflow or incoherency.   */\n  /*                                                                       */\n  static Bool\n  End_Profile( RAS_ARGS Bool  overshoot )\n  {\n    Long  h;\n\n\n    h = (Long)( ras.top - ras.cProfile->offset );\n\n    if ( h < 0 )\n    {\n      FT_ERROR(( \"End_Profile: negative height encountered\\n\" ));\n      ras.error = FT_THROW( Neg_Height );\n      return FAILURE;\n    }\n\n    if ( h > 0 )\n    {\n      PProfile  oldProfile;\n\n\n      FT_TRACE6(( \"Ending profile %p, start = %ld, height = %ld\\n\",\n                  ras.cProfile, ras.cProfile->start, h ));\n\n      ras.cProfile->height = h;\n      if ( overshoot )\n      {\n        if ( ras.cProfile->flags & Flow_Up )\n          ras.cProfile->flags |= Overshoot_Top;\n        else\n          ras.cProfile->flags |= Overshoot_Bottom;\n      }\n\n      oldProfile   = ras.cProfile;\n      ras.cProfile = (PProfile)ras.top;\n\n      ras.top += AlignProfileSize;\n\n      ras.cProfile->height = 0;\n      ras.cProfile->offset = ras.top;\n\n      oldProfile->next = ras.cProfile;\n      ras.num_Profs++;\n    }\n\n    if ( ras.top >= ras.maxBuff )\n    {\n      FT_TRACE1(( \"overflow in End_Profile\\n\" ));\n      ras.error = FT_THROW( Overflow );\n      return FAILURE;\n    }\n\n    ras.joint = FALSE;\n\n    return SUCCESS;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Insert_Y_Turn                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Insert a salient into the sorted list placed on top of the render  */\n  /*    pool.                                                              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    New y scanline position.                                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    SUCCESS on success.  FAILURE in case of overflow.                  */\n  /*                                                                       */\n  static Bool\n  Insert_Y_Turn( RAS_ARGS Int  y )\n  {\n    PLong  y_turns;\n    Int    n;\n\n\n    n       = ras.numTurns - 1;\n    y_turns = ras.sizeBuff - ras.numTurns;\n\n    /* look for first y value that is <= */\n    while ( n >= 0 && y < y_turns[n] )\n      n--;\n\n    /* if it is <, simply insert it, ignore if == */\n    if ( n >= 0 && y > y_turns[n] )\n      while ( n >= 0 )\n      {\n        Int  y2 = (Int)y_turns[n];\n\n\n        y_turns[n] = y;\n        y = y2;\n        n--;\n      }\n\n    if ( n < 0 )\n    {\n      ras.maxBuff--;\n      if ( ras.maxBuff <= ras.top )\n      {\n        ras.error = FT_THROW( Overflow );\n        return FAILURE;\n      }\n      ras.numTurns++;\n      ras.sizeBuff[-ras.numTurns] = y;\n    }\n\n    return SUCCESS;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Finalize_Profile_Table                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Adjust all links in the profiles list.                             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    SUCCESS on success.  FAILURE in case of overflow.                  */\n  /*                                                                       */\n  static Bool\n  Finalize_Profile_Table( RAS_ARG )\n  {\n    UShort    n;\n    PProfile  p;\n\n\n    n = ras.num_Profs;\n    p = ras.fProfile;\n\n    if ( n > 1 && p )\n    {\n      while ( n > 0 )\n      {\n        Int  bottom, top;\n\n\n        if ( n > 1 )\n          p->link = (PProfile)( p->offset + p->height );\n        else\n          p->link = NULL;\n\n        if ( p->flags & Flow_Up )\n        {\n          bottom = (Int)p->start;\n          top    = (Int)( p->start + p->height - 1 );\n        }\n        else\n        {\n          bottom     = (Int)( p->start - p->height + 1 );\n          top        = (Int)p->start;\n          p->start   = bottom;\n          p->offset += p->height - 1;\n        }\n\n        if ( Insert_Y_Turn( RAS_VARS bottom )  ||\n             Insert_Y_Turn( RAS_VARS top + 1 ) )\n          return FAILURE;\n\n        p = p->link;\n        n--;\n      }\n    }\n    else\n      ras.fProfile = NULL;\n\n    return SUCCESS;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Split_Conic                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Subdivide one conic Bezier into two joint sub-arcs in the Bezier   */\n  /*    stack.                                                             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    None (subdivided Bezier is taken from the top of the stack).       */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This routine is the `beef' of this component.  It is  _the_ inner  */\n  /*    loop that should be optimized to hell to get the best performance. */\n  /*                                                                       */\n  static void\n  Split_Conic( TPoint*  base )\n  {\n    Long  a, b;\n\n\n    base[4].x = base[2].x;\n    b = base[1].x;\n    a = base[3].x = ( base[2].x + b ) / 2;\n    b = base[1].x = ( base[0].x + b ) / 2;\n    base[2].x = ( a + b ) / 2;\n\n    base[4].y = base[2].y;\n    b = base[1].y;\n    a = base[3].y = ( base[2].y + b ) / 2;\n    b = base[1].y = ( base[0].y + b ) / 2;\n    base[2].y = ( a + b ) / 2;\n\n    /* hand optimized.  gcc doesn't seem to be too good at common      */\n    /* expression substitution and instruction scheduling ;-)          */\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Split_Cubic                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Subdivide a third-order Bezier arc into two joint sub-arcs in the  */\n  /*    Bezier stack.                                                      */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This routine is the `beef' of the component.  It is one of _the_   */\n  /*    inner loops that should be optimized like hell to get the best     */\n  /*    performance.                                                       */\n  /*                                                                       */\n  static void\n  Split_Cubic( TPoint*  base )\n  {\n    Long  a, b, c, d;\n\n\n    base[6].x = base[3].x;\n    c = base[1].x;\n    d = base[2].x;\n    base[1].x = a = ( base[0].x + c + 1 ) >> 1;\n    base[5].x = b = ( base[3].x + d + 1 ) >> 1;\n    c = ( c + d + 1 ) >> 1;\n    base[2].x = a = ( a + c + 1 ) >> 1;\n    base[4].x = b = ( b + c + 1 ) >> 1;\n    base[3].x = ( a + b + 1 ) >> 1;\n\n    base[6].y = base[3].y;\n    c = base[1].y;\n    d = base[2].y;\n    base[1].y = a = ( base[0].y + c + 1 ) >> 1;\n    base[5].y = b = ( base[3].y + d + 1 ) >> 1;\n    c = ( c + d + 1 ) >> 1;\n    base[2].y = a = ( a + c + 1 ) >> 1;\n    base[4].y = b = ( b + c + 1 ) >> 1;\n    base[3].y = ( a + b + 1 ) >> 1;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Line_Up                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Compute the x-coordinates of an ascending line segment and store   */\n  /*    them in the render pool.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    x1   :: The x-coordinate of the segment's start point.             */\n  /*                                                                       */\n  /*    y1   :: The y-coordinate of the segment's start point.             */\n  /*                                                                       */\n  /*    x2   :: The x-coordinate of the segment's end point.               */\n  /*                                                                       */\n  /*    y2   :: The y-coordinate of the segment's end point.               */\n  /*                                                                       */\n  /*    miny :: A lower vertical clipping bound value.                     */\n  /*                                                                       */\n  /*    maxy :: An upper vertical clipping bound value.                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    SUCCESS on success, FAILURE on render pool overflow.               */\n  /*                                                                       */\n  static Bool\n  Line_Up( RAS_ARGS Long  x1,\n                    Long  y1,\n                    Long  x2,\n                    Long  y2,\n                    Long  miny,\n                    Long  maxy )\n  {\n    Long   Dx, Dy;\n    Int    e1, e2, f1, f2, size;     /* XXX: is `Short' sufficient? */\n    Long   Ix, Rx, Ax;\n\n    PLong  top;\n\n\n    Dx = x2 - x1;\n    Dy = y2 - y1;\n\n    if ( Dy <= 0 || y2 < miny || y1 > maxy )\n      return SUCCESS;\n\n    if ( y1 < miny )\n    {\n      /* Take care: miny-y1 can be a very large value; we use     */\n      /*            a slow MulDiv function to avoid clipping bugs */\n      x1 += SMulDiv( Dx, miny - y1, Dy );\n      e1  = (Int)TRUNC( miny );\n      f1  = 0;\n    }\n    else\n    {\n      e1 = (Int)TRUNC( y1 );\n      f1 = (Int)FRAC( y1 );\n    }\n\n    if ( y2 > maxy )\n    {\n      /* x2 += FMulDiv( Dx, maxy - y2, Dy );  UNNECESSARY */\n      e2  = (Int)TRUNC( maxy );\n      f2  = 0;\n    }\n    else\n    {\n      e2 = (Int)TRUNC( y2 );\n      f2 = (Int)FRAC( y2 );\n    }\n\n    if ( f1 > 0 )\n    {\n      if ( e1 == e2 )\n        return SUCCESS;\n      else\n      {\n        x1 += SMulDiv( Dx, ras.precision - f1, Dy );\n        e1 += 1;\n      }\n    }\n    else\n      if ( ras.joint )\n      {\n        ras.top--;\n        ras.joint = FALSE;\n      }\n\n    ras.joint = (char)( f2 == 0 );\n\n    if ( ras.fresh )\n    {\n      ras.cProfile->start = e1;\n      ras.fresh           = FALSE;\n    }\n\n    size = e2 - e1 + 1;\n    if ( ras.top + size >= ras.maxBuff )\n    {\n      ras.error = FT_THROW( Overflow );\n      return FAILURE;\n    }\n\n    if ( Dx > 0 )\n    {\n      Ix = SMulDiv_No_Round( ras.precision, Dx, Dy );\n      Rx = ( ras.precision * Dx ) % Dy;\n      Dx = 1;\n    }\n    else\n    {\n      Ix = -SMulDiv_No_Round( ras.precision, -Dx, Dy );\n      Rx = ( ras.precision * -Dx ) % Dy;\n      Dx = -1;\n    }\n\n    Ax  = -Dy;\n    top = ras.top;\n\n    while ( size > 0 )\n    {\n      *top++ = x1;\n\n      x1 += Ix;\n      Ax += Rx;\n      if ( Ax >= 0 )\n      {\n        Ax -= Dy;\n        x1 += Dx;\n      }\n      size--;\n    }\n\n    ras.top = top;\n    return SUCCESS;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Line_Down                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Compute the x-coordinates of an descending line segment and store  */\n  /*    them in the render pool.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    x1   :: The x-coordinate of the segment's start point.             */\n  /*                                                                       */\n  /*    y1   :: The y-coordinate of the segment's start point.             */\n  /*                                                                       */\n  /*    x2   :: The x-coordinate of the segment's end point.               */\n  /*                                                                       */\n  /*    y2   :: The y-coordinate of the segment's end point.               */\n  /*                                                                       */\n  /*    miny :: A lower vertical clipping bound value.                     */\n  /*                                                                       */\n  /*    maxy :: An upper vertical clipping bound value.                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    SUCCESS on success, FAILURE on render pool overflow.               */\n  /*                                                                       */\n  static Bool\n  Line_Down( RAS_ARGS Long  x1,\n                      Long  y1,\n                      Long  x2,\n                      Long  y2,\n                      Long  miny,\n                      Long  maxy )\n  {\n    Bool  result, fresh;\n\n\n    fresh  = ras.fresh;\n\n    result = Line_Up( RAS_VARS x1, -y1, x2, -y2, -maxy, -miny );\n\n    if ( fresh && !ras.fresh )\n      ras.cProfile->start = -ras.cProfile->start;\n\n    return result;\n  }\n\n\n  /* A function type describing the functions used to split Bezier arcs */\n  typedef void  (*TSplitter)( TPoint*  base );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Bezier_Up                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Compute the x-coordinates of an ascending Bezier arc and store     */\n  /*    them in the render pool.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    degree   :: The degree of the Bezier arc (either 2 or 3).          */\n  /*                                                                       */\n  /*    splitter :: The function to split Bezier arcs.                     */\n  /*                                                                       */\n  /*    miny     :: A lower vertical clipping bound value.                 */\n  /*                                                                       */\n  /*    maxy     :: An upper vertical clipping bound value.                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    SUCCESS on success, FAILURE on render pool overflow.               */\n  /*                                                                       */\n  static Bool\n  Bezier_Up( RAS_ARGS Int        degree,\n                      TSplitter  splitter,\n                      Long       miny,\n                      Long       maxy )\n  {\n    Long   y1, y2, e, e2, e0;\n    Short  f1;\n\n    TPoint*  arc;\n    TPoint*  start_arc;\n\n    PLong top;\n\n\n    arc = ras.arc;\n    y1  = arc[degree].y;\n    y2  = arc[0].y;\n    top = ras.top;\n\n    if ( y2 < miny || y1 > maxy )\n      goto Fin;\n\n    e2 = FLOOR( y2 );\n\n    if ( e2 > maxy )\n      e2 = maxy;\n\n    e0 = miny;\n\n    if ( y1 < miny )\n      e = miny;\n    else\n    {\n      e  = CEILING( y1 );\n      f1 = (Short)( FRAC( y1 ) );\n      e0 = e;\n\n      if ( f1 == 0 )\n      {\n        if ( ras.joint )\n        {\n          top--;\n          ras.joint = FALSE;\n        }\n\n        *top++ = arc[degree].x;\n\n        e += ras.precision;\n      }\n    }\n\n    if ( ras.fresh )\n    {\n      ras.cProfile->start = TRUNC( e0 );\n      ras.fresh = FALSE;\n    }\n\n    if ( e2 < e )\n      goto Fin;\n\n    if ( ( top + TRUNC( e2 - e ) + 1 ) >= ras.maxBuff )\n    {\n      ras.top   = top;\n      ras.error = FT_THROW( Overflow );\n      return FAILURE;\n    }\n\n    start_arc = arc;\n\n    while ( arc >= start_arc && e <= e2 )\n    {\n      ras.joint = FALSE;\n\n      y2 = arc[0].y;\n\n      if ( y2 > e )\n      {\n        y1 = arc[degree].y;\n        if ( y2 - y1 >= ras.precision_step )\n        {\n          splitter( arc );\n          arc += degree;\n        }\n        else\n        {\n          *top++ = arc[degree].x + FMulDiv( arc[0].x - arc[degree].x,\n                                            e - y1, y2 - y1 );\n          arc -= degree;\n          e   += ras.precision;\n        }\n      }\n      else\n      {\n        if ( y2 == e )\n        {\n          ras.joint  = TRUE;\n          *top++     = arc[0].x;\n\n          e += ras.precision;\n        }\n        arc -= degree;\n      }\n    }\n\n  Fin:\n    ras.top  = top;\n    ras.arc -= degree;\n    return SUCCESS;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Bezier_Down                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Compute the x-coordinates of an descending Bezier arc and store    */\n  /*    them in the render pool.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    degree   :: The degree of the Bezier arc (either 2 or 3).          */\n  /*                                                                       */\n  /*    splitter :: The function to split Bezier arcs.                     */\n  /*                                                                       */\n  /*    miny     :: A lower vertical clipping bound value.                 */\n  /*                                                                       */\n  /*    maxy     :: An upper vertical clipping bound value.                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    SUCCESS on success, FAILURE on render pool overflow.               */\n  /*                                                                       */\n  static Bool\n  Bezier_Down( RAS_ARGS Int        degree,\n                        TSplitter  splitter,\n                        Long       miny,\n                        Long       maxy )\n  {\n    TPoint*  arc = ras.arc;\n    Bool     result, fresh;\n\n\n    arc[0].y = -arc[0].y;\n    arc[1].y = -arc[1].y;\n    arc[2].y = -arc[2].y;\n    if ( degree > 2 )\n      arc[3].y = -arc[3].y;\n\n    fresh = ras.fresh;\n\n    result = Bezier_Up( RAS_VARS degree, splitter, -maxy, -miny );\n\n    if ( fresh && !ras.fresh )\n      ras.cProfile->start = -ras.cProfile->start;\n\n    arc[0].y = -arc[0].y;\n    return result;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Line_To                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Inject a new line segment and adjust the Profiles list.            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*   x :: The x-coordinate of the segment's end point (its start point   */\n  /*        is stored in `lastX').                                         */\n  /*                                                                       */\n  /*   y :: The y-coordinate of the segment's end point (its start point   */\n  /*        is stored in `lastY').                                         */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*   SUCCESS on success, FAILURE on render pool overflow or incorrect    */\n  /*   profile.                                                            */\n  /*                                                                       */\n  static Bool\n  Line_To( RAS_ARGS Long  x,\n                    Long  y )\n  {\n    /* First, detect a change of direction */\n\n    switch ( ras.state )\n    {\n    case Unknown_State:\n      if ( y > ras.lastY )\n      {\n        if ( New_Profile( RAS_VARS Ascending_State,\n                                   IS_BOTTOM_OVERSHOOT( ras.lastY ) ) )\n          return FAILURE;\n      }\n      else\n      {\n        if ( y < ras.lastY )\n          if ( New_Profile( RAS_VARS Descending_State,\n                                     IS_TOP_OVERSHOOT( ras.lastY ) ) )\n            return FAILURE;\n      }\n      break;\n\n    case Ascending_State:\n      if ( y < ras.lastY )\n      {\n        if ( End_Profile( RAS_VARS IS_TOP_OVERSHOOT( ras.lastY ) ) ||\n             New_Profile( RAS_VARS Descending_State,\n                                   IS_TOP_OVERSHOOT( ras.lastY ) ) )\n          return FAILURE;\n      }\n      break;\n\n    case Descending_State:\n      if ( y > ras.lastY )\n      {\n        if ( End_Profile( RAS_VARS IS_BOTTOM_OVERSHOOT( ras.lastY ) ) ||\n             New_Profile( RAS_VARS Ascending_State,\n                                   IS_BOTTOM_OVERSHOOT( ras.lastY ) ) )\n          return FAILURE;\n      }\n      break;\n\n    default:\n      ;\n    }\n\n    /* Then compute the lines */\n\n    switch ( ras.state )\n    {\n    case Ascending_State:\n      if ( Line_Up( RAS_VARS ras.lastX, ras.lastY,\n                             x, y, ras.minY, ras.maxY ) )\n        return FAILURE;\n      break;\n\n    case Descending_State:\n      if ( Line_Down( RAS_VARS ras.lastX, ras.lastY,\n                               x, y, ras.minY, ras.maxY ) )\n        return FAILURE;\n      break;\n\n    default:\n      ;\n    }\n\n    ras.lastX = x;\n    ras.lastY = y;\n\n    return SUCCESS;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Conic_To                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Inject a new conic arc and adjust the profile list.                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*   cx :: The x-coordinate of the arc's new control point.              */\n  /*                                                                       */\n  /*   cy :: The y-coordinate of the arc's new control point.              */\n  /*                                                                       */\n  /*   x  :: The x-coordinate of the arc's end point (its start point is   */\n  /*         stored in `lastX').                                           */\n  /*                                                                       */\n  /*   y  :: The y-coordinate of the arc's end point (its start point is   */\n  /*         stored in `lastY').                                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*   SUCCESS on success, FAILURE on render pool overflow or incorrect    */\n  /*   profile.                                                            */\n  /*                                                                       */\n  static Bool\n  Conic_To( RAS_ARGS Long  cx,\n                     Long  cy,\n                     Long  x,\n                     Long  y )\n  {\n    Long     y1, y2, y3, x3, ymin, ymax;\n    TStates  state_bez;\n\n\n    ras.arc      = ras.arcs;\n    ras.arc[2].x = ras.lastX;\n    ras.arc[2].y = ras.lastY;\n    ras.arc[1].x = cx;\n    ras.arc[1].y = cy;\n    ras.arc[0].x = x;\n    ras.arc[0].y = y;\n\n    do\n    {\n      y1 = ras.arc[2].y;\n      y2 = ras.arc[1].y;\n      y3 = ras.arc[0].y;\n      x3 = ras.arc[0].x;\n\n      /* first, categorize the Bezier arc */\n\n      if ( y1 <= y3 )\n      {\n        ymin = y1;\n        ymax = y3;\n      }\n      else\n      {\n        ymin = y3;\n        ymax = y1;\n      }\n\n      if ( y2 < ymin || y2 > ymax )\n      {\n        /* this arc has no given direction, split it! */\n        Split_Conic( ras.arc );\n        ras.arc += 2;\n      }\n      else if ( y1 == y3 )\n      {\n        /* this arc is flat, ignore it and pop it from the Bezier stack */\n        ras.arc -= 2;\n      }\n      else\n      {\n        /* the arc is y-monotonous, either ascending or descending */\n        /* detect a change of direction                            */\n        state_bez = y1 < y3 ? Ascending_State : Descending_State;\n        if ( ras.state != state_bez )\n        {\n          Bool  o = state_bez == Ascending_State ? IS_BOTTOM_OVERSHOOT( y1 )\n                                                 : IS_TOP_OVERSHOOT( y1 );\n\n\n          /* finalize current profile if any */\n          if ( ras.state != Unknown_State &&\n               End_Profile( RAS_VARS o )  )\n            goto Fail;\n\n          /* create a new profile */\n          if ( New_Profile( RAS_VARS state_bez, o ) )\n            goto Fail;\n        }\n\n        /* now call the appropriate routine */\n        if ( state_bez == Ascending_State )\n        {\n          if ( Bezier_Up( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) )\n            goto Fail;\n        }\n        else\n          if ( Bezier_Down( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) )\n            goto Fail;\n      }\n\n    } while ( ras.arc >= ras.arcs );\n\n    ras.lastX = x3;\n    ras.lastY = y3;\n\n    return SUCCESS;\n\n  Fail:\n    return FAILURE;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Cubic_To                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Inject a new cubic arc and adjust the profile list.                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*   cx1 :: The x-coordinate of the arc's first new control point.       */\n  /*                                                                       */\n  /*   cy1 :: The y-coordinate of the arc's first new control point.       */\n  /*                                                                       */\n  /*   cx2 :: The x-coordinate of the arc's second new control point.      */\n  /*                                                                       */\n  /*   cy2 :: The y-coordinate of the arc's second new control point.      */\n  /*                                                                       */\n  /*   x   :: The x-coordinate of the arc's end point (its start point is  */\n  /*          stored in `lastX').                                          */\n  /*                                                                       */\n  /*   y   :: The y-coordinate of the arc's end point (its start point is  */\n  /*          stored in `lastY').                                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*   SUCCESS on success, FAILURE on render pool overflow or incorrect    */\n  /*   profile.                                                            */\n  /*                                                                       */\n  static Bool\n  Cubic_To( RAS_ARGS Long  cx1,\n                     Long  cy1,\n                     Long  cx2,\n                     Long  cy2,\n                     Long  x,\n                     Long  y )\n  {\n    Long     y1, y2, y3, y4, x4, ymin1, ymax1, ymin2, ymax2;\n    TStates  state_bez;\n\n\n    ras.arc      = ras.arcs;\n    ras.arc[3].x = ras.lastX;\n    ras.arc[3].y = ras.lastY;\n    ras.arc[2].x = cx1;\n    ras.arc[2].y = cy1;\n    ras.arc[1].x = cx2;\n    ras.arc[1].y = cy2;\n    ras.arc[0].x = x;\n    ras.arc[0].y = y;\n\n    do\n    {\n      y1 = ras.arc[3].y;\n      y2 = ras.arc[2].y;\n      y3 = ras.arc[1].y;\n      y4 = ras.arc[0].y;\n      x4 = ras.arc[0].x;\n\n      /* first, categorize the Bezier arc */\n\n      if ( y1 <= y4 )\n      {\n        ymin1 = y1;\n        ymax1 = y4;\n      }\n      else\n      {\n        ymin1 = y4;\n        ymax1 = y1;\n      }\n\n      if ( y2 <= y3 )\n      {\n        ymin2 = y2;\n        ymax2 = y3;\n      }\n      else\n      {\n        ymin2 = y3;\n        ymax2 = y2;\n      }\n\n      if ( ymin2 < ymin1 || ymax2 > ymax1 )\n      {\n        /* this arc has no given direction, split it! */\n        Split_Cubic( ras.arc );\n        ras.arc += 3;\n      }\n      else if ( y1 == y4 )\n      {\n        /* this arc is flat, ignore it and pop it from the Bezier stack */\n        ras.arc -= 3;\n      }\n      else\n      {\n        state_bez = ( y1 <= y4 ) ? Ascending_State : Descending_State;\n\n        /* detect a change of direction */\n        if ( ras.state != state_bez )\n        {\n          Bool  o = state_bez == Ascending_State ? IS_BOTTOM_OVERSHOOT( y1 )\n                                                 : IS_TOP_OVERSHOOT( y1 );\n\n\n          /* finalize current profile if any */\n          if ( ras.state != Unknown_State &&\n               End_Profile( RAS_VARS o )  )\n            goto Fail;\n\n          if ( New_Profile( RAS_VARS state_bez, o ) )\n            goto Fail;\n        }\n\n        /* compute intersections */\n        if ( state_bez == Ascending_State )\n        {\n          if ( Bezier_Up( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) )\n            goto Fail;\n        }\n        else\n          if ( Bezier_Down( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) )\n            goto Fail;\n      }\n\n    } while ( ras.arc >= ras.arcs );\n\n    ras.lastX = x4;\n    ras.lastY = y4;\n\n    return SUCCESS;\n\n  Fail:\n    return FAILURE;\n  }\n\n\n#undef  SWAP_\n#define SWAP_( x, y )  do                \\\n                       {                 \\\n                         Long  swap = x; \\\n                                         \\\n                                         \\\n                         x = y;          \\\n                         y = swap;       \\\n                       } while ( 0 )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Decompose_Curve                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Scan the outline arrays in order to emit individual segments and   */\n  /*    Beziers by calling Line_To() and Bezier_To().  It handles all      */\n  /*    weird cases, like when the first point is off the curve, or when   */\n  /*    there are simply no `on' points in the contour!                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    first   :: The index of the first point in the contour.            */\n  /*                                                                       */\n  /*    last    :: The index of the last point in the contour.             */\n  /*                                                                       */\n  /*    flipped :: If set, flip the direction of the curve.                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    SUCCESS on success, FAILURE on error.                              */\n  /*                                                                       */\n  static Bool\n  Decompose_Curve( RAS_ARGS UShort  first,\n                            UShort  last,\n                            int     flipped )\n  {\n    FT_Vector   v_last;\n    FT_Vector   v_control;\n    FT_Vector   v_start;\n\n    FT_Vector*  points;\n    FT_Vector*  point;\n    FT_Vector*  limit;\n    char*       tags;\n\n    unsigned    tag;       /* current point's state           */\n\n\n    points = ras.outline.points;\n    limit  = points + last;\n\n    v_start.x = SCALED( points[first].x );\n    v_start.y = SCALED( points[first].y );\n    v_last.x  = SCALED( points[last].x );\n    v_last.y  = SCALED( points[last].y );\n\n    if ( flipped )\n    {\n      SWAP_( v_start.x, v_start.y );\n      SWAP_( v_last.x, v_last.y );\n    }\n\n    v_control = v_start;\n\n    point = points + first;\n    tags  = ras.outline.tags + first;\n\n    /* set scan mode if necessary */\n    if ( tags[0] & FT_CURVE_TAG_HAS_SCANMODE )\n      ras.dropOutControl = (Byte)tags[0] >> 5;\n\n    tag = FT_CURVE_TAG( tags[0] );\n\n    /* A contour cannot start with a cubic control point! */\n    if ( tag == FT_CURVE_TAG_CUBIC )\n      goto Invalid_Outline;\n\n    /* check first point to determine origin */\n    if ( tag == FT_CURVE_TAG_CONIC )\n    {\n      /* first point is conic control.  Yes, this happens. */\n      if ( FT_CURVE_TAG( ras.outline.tags[last] ) == FT_CURVE_TAG_ON )\n      {\n        /* start at last point if it is on the curve */\n        v_start = v_last;\n        limit--;\n      }\n      else\n      {\n        /* if both first and last points are conic,         */\n        /* start at their middle and record its position    */\n        /* for closure                                      */\n        v_start.x = ( v_start.x + v_last.x ) / 2;\n        v_start.y = ( v_start.y + v_last.y ) / 2;\n\n        v_last = v_start;\n      }\n      point--;\n      tags--;\n    }\n\n    ras.lastX = v_start.x;\n    ras.lastY = v_start.y;\n\n    while ( point < limit )\n    {\n      point++;\n      tags++;\n\n      tag = FT_CURVE_TAG( tags[0] );\n\n      switch ( tag )\n      {\n      case FT_CURVE_TAG_ON:  /* emit a single line_to */\n        {\n          Long  x, y;\n\n\n          x = SCALED( point->x );\n          y = SCALED( point->y );\n          if ( flipped )\n            SWAP_( x, y );\n\n          if ( Line_To( RAS_VARS x, y ) )\n            goto Fail;\n          continue;\n        }\n\n      case FT_CURVE_TAG_CONIC:  /* consume conic arcs */\n        v_control.x = SCALED( point[0].x );\n        v_control.y = SCALED( point[0].y );\n\n        if ( flipped )\n          SWAP_( v_control.x, v_control.y );\n\n      Do_Conic:\n        if ( point < limit )\n        {\n          FT_Vector  v_middle;\n          Long       x, y;\n\n\n          point++;\n          tags++;\n          tag = FT_CURVE_TAG( tags[0] );\n\n          x = SCALED( point[0].x );\n          y = SCALED( point[0].y );\n\n          if ( flipped )\n            SWAP_( x, y );\n\n          if ( tag == FT_CURVE_TAG_ON )\n          {\n            if ( Conic_To( RAS_VARS v_control.x, v_control.y, x, y ) )\n              goto Fail;\n            continue;\n          }\n\n          if ( tag != FT_CURVE_TAG_CONIC )\n            goto Invalid_Outline;\n\n          v_middle.x = ( v_control.x + x ) / 2;\n          v_middle.y = ( v_control.y + y ) / 2;\n\n          if ( Conic_To( RAS_VARS v_control.x, v_control.y,\n                                  v_middle.x,  v_middle.y ) )\n            goto Fail;\n\n          v_control.x = x;\n          v_control.y = y;\n\n          goto Do_Conic;\n        }\n\n        if ( Conic_To( RAS_VARS v_control.x, v_control.y,\n                                v_start.x,   v_start.y ) )\n          goto Fail;\n\n        goto Close;\n\n      default:  /* FT_CURVE_TAG_CUBIC */\n        {\n          Long  x1, y1, x2, y2, x3, y3;\n\n\n          if ( point + 1 > limit                             ||\n               FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )\n            goto Invalid_Outline;\n\n          point += 2;\n          tags  += 2;\n\n          x1 = SCALED( point[-2].x );\n          y1 = SCALED( point[-2].y );\n          x2 = SCALED( point[-1].x );\n          y2 = SCALED( point[-1].y );\n\n          if ( flipped )\n          {\n            SWAP_( x1, y1 );\n            SWAP_( x2, y2 );\n          }\n\n          if ( point <= limit )\n          {\n            x3 = SCALED( point[0].x );\n            y3 = SCALED( point[0].y );\n\n            if ( flipped )\n              SWAP_( x3, y3 );\n\n            if ( Cubic_To( RAS_VARS x1, y1, x2, y2, x3, y3 ) )\n              goto Fail;\n            continue;\n          }\n\n          if ( Cubic_To( RAS_VARS x1, y1, x2, y2, v_start.x, v_start.y ) )\n            goto Fail;\n          goto Close;\n        }\n      }\n    }\n\n    /* close the contour with a line segment */\n    if ( Line_To( RAS_VARS v_start.x, v_start.y ) )\n      goto Fail;\n\n  Close:\n    return SUCCESS;\n\n  Invalid_Outline:\n    ras.error = FT_THROW( Invalid );\n\n  Fail:\n    return FAILURE;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Convert_Glyph                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Convert a glyph into a series of segments and arcs and make a      */\n  /*    profiles list with them.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    flipped :: If set, flip the direction of curve.                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    SUCCESS on success, FAILURE if any error was encountered during    */\n  /*    rendering.                                                         */\n  /*                                                                       */\n  static Bool\n  Convert_Glyph( RAS_ARGS int  flipped )\n  {\n    int       i;\n    unsigned  start;\n\n\n    ras.fProfile = NULL;\n    ras.joint    = FALSE;\n    ras.fresh    = FALSE;\n\n    ras.maxBuff  = ras.sizeBuff - AlignProfileSize;\n\n    ras.numTurns = 0;\n\n    ras.cProfile         = (PProfile)ras.top;\n    ras.cProfile->offset = ras.top;\n    ras.num_Profs        = 0;\n\n    start = 0;\n\n    for ( i = 0; i < ras.outline.n_contours; i++ )\n    {\n      PProfile  lastProfile;\n      Bool      o;\n\n\n      ras.state    = Unknown_State;\n      ras.gProfile = NULL;\n\n      if ( Decompose_Curve( RAS_VARS (unsigned short)start,\n                                     ras.outline.contours[i],\n                                     flipped ) )\n        return FAILURE;\n\n      start = ras.outline.contours[i] + 1;\n\n      /* we must now check whether the extreme arcs join or not */\n      if ( FRAC( ras.lastY ) == 0 &&\n           ras.lastY >= ras.minY  &&\n           ras.lastY <= ras.maxY  )\n        if ( ras.gProfile                        &&\n             ( ras.gProfile->flags & Flow_Up ) ==\n               ( ras.cProfile->flags & Flow_Up ) )\n          ras.top--;\n        /* Note that ras.gProfile can be nil if the contour was too small */\n        /* to be drawn.                                                   */\n\n      lastProfile = ras.cProfile;\n      if ( ras.cProfile->flags & Flow_Up )\n        o = IS_TOP_OVERSHOOT( ras.lastY );\n      else\n        o = IS_BOTTOM_OVERSHOOT( ras.lastY );\n      if ( End_Profile( RAS_VARS o ) )\n        return FAILURE;\n\n      /* close the `next profile in contour' linked list */\n      if ( ras.gProfile )\n        lastProfile->next = ras.gProfile;\n    }\n\n    if ( Finalize_Profile_Table( RAS_VAR ) )\n      return FAILURE;\n\n    return (Bool)( ras.top < ras.maxBuff ? SUCCESS : FAILURE );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /**                                                                     **/\n  /**  SCAN-LINE SWEEPS AND DRAWING                                       **/\n  /**                                                                     **/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  Init_Linked                                                          */\n  /*                                                                       */\n  /*    Initializes an empty linked list.                                  */\n  /*                                                                       */\n  static void\n  Init_Linked( TProfileList*  l )\n  {\n    *l = NULL;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  InsNew                                                               */\n  /*                                                                       */\n  /*    Inserts a new profile in a linked list.                            */\n  /*                                                                       */\n  static void\n  InsNew( PProfileList  list,\n          PProfile      profile )\n  {\n    PProfile  *old, current;\n    Long       x;\n\n\n    old     = list;\n    current = *old;\n    x       = profile->X;\n\n    while ( current )\n    {\n      if ( x < current->X )\n        break;\n      old     = &current->link;\n      current = *old;\n    }\n\n    profile->link = current;\n    *old          = profile;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  DelOld                                                               */\n  /*                                                                       */\n  /*    Removes an old profile from a linked list.                         */\n  /*                                                                       */\n  static void\n  DelOld( PProfileList  list,\n          PProfile      profile )\n  {\n    PProfile  *old, current;\n\n\n    old     = list;\n    current = *old;\n\n    while ( current )\n    {\n      if ( current == profile )\n      {\n        *old = current->link;\n        return;\n      }\n\n      old     = &current->link;\n      current = *old;\n    }\n\n    /* we should never get there, unless the profile was not part of */\n    /* the list.                                                     */\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  Sort                                                                 */\n  /*                                                                       */\n  /*    Sorts a trace list.  In 95%, the list is already sorted.  We need  */\n  /*    an algorithm which is fast in this case.  Bubble sort is enough    */\n  /*    and simple.                                                        */\n  /*                                                                       */\n  static void\n  Sort( PProfileList  list )\n  {\n    PProfile  *old, current, next;\n\n\n    /* First, set the new X coordinate of each profile */\n    current = *list;\n    while ( current )\n    {\n      current->X       = *current->offset;\n      current->offset += current->flags & Flow_Up ? 1 : -1;\n      current->height--;\n      current = current->link;\n    }\n\n    /* Then sort them */\n    old     = list;\n    current = *old;\n\n    if ( !current )\n      return;\n\n    next = current->link;\n\n    while ( next )\n    {\n      if ( current->X <= next->X )\n      {\n        old     = &current->link;\n        current = *old;\n\n        if ( !current )\n          return;\n      }\n      else\n      {\n        *old          = next;\n        current->link = next->link;\n        next->link    = current;\n\n        old     = list;\n        current = *old;\n      }\n\n      next = current->link;\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  Vertical Sweep Procedure Set                                         */\n  /*                                                                       */\n  /*  These four routines are used during the vertical black/white sweep   */\n  /*  phase by the generic Draw_Sweep() function.                          */\n  /*                                                                       */\n  /*************************************************************************/\n\n  static void\n  Vertical_Sweep_Init( RAS_ARGS Short*  min,\n                                Short*  max )\n  {\n    Long  pitch = ras.target.pitch;\n\n    FT_UNUSED( max );\n\n\n    ras.traceIncr = (Short)-pitch;\n    ras.traceOfs  = -*min * pitch;\n    if ( pitch > 0 )\n      ras.traceOfs += ( ras.target.rows - 1 ) * pitch;\n\n    ras.gray_min_x = 0;\n    ras.gray_max_x = 0;\n  }\n\n\n  static void\n  Vertical_Sweep_Span( RAS_ARGS Short       y,\n                                FT_F26Dot6  x1,\n                                FT_F26Dot6  x2,\n                                PProfile    left,\n                                PProfile    right )\n  {\n    Long   e1, e2;\n    Byte*  target;\n\n    FT_UNUSED( y );\n    FT_UNUSED( left );\n    FT_UNUSED( right );\n\n\n    /* Drop-out control */\n\n    e1 = TRUNC( CEILING( x1 ) );\n\n    if ( x2 - x1 - ras.precision <= ras.precision_jitter )\n      e2 = e1;\n    else\n      e2 = TRUNC( FLOOR( x2 ) );\n\n    if ( e2 >= 0 && e1 < ras.bWidth )\n    {\n      int   c1, c2;\n      Byte  f1, f2;\n\n\n      if ( e1 < 0 )\n        e1 = 0;\n      if ( e2 >= ras.bWidth )\n        e2 = ras.bWidth - 1;\n\n      c1 = (Short)( e1 >> 3 );\n      c2 = (Short)( e2 >> 3 );\n\n      f1 = (Byte)  ( 0xFF >> ( e1 & 7 ) );\n      f2 = (Byte) ~( 0x7F >> ( e2 & 7 ) );\n\n      if ( ras.gray_min_x > c1 )\n        ras.gray_min_x = (short)c1;\n      if ( ras.gray_max_x < c2 )\n        ras.gray_max_x = (short)c2;\n\n      target = ras.bTarget + ras.traceOfs + c1;\n      c2 -= c1;\n\n      if ( c2 > 0 )\n      {\n        target[0] |= f1;\n\n        /* memset() is slower than the following code on many platforms. */\n        /* This is due to the fact that, in the vast majority of cases,  */\n        /* the span length in bytes is relatively small.                 */\n        c2--;\n        while ( c2 > 0 )\n        {\n          *(++target) = 0xFF;\n          c2--;\n        }\n        target[1] |= f2;\n      }\n      else\n        *target |= ( f1 & f2 );\n    }\n  }\n\n\n  static void\n  Vertical_Sweep_Drop( RAS_ARGS Short       y,\n                                FT_F26Dot6  x1,\n                                FT_F26Dot6  x2,\n                                PProfile    left,\n                                PProfile    right )\n  {\n    Long   e1, e2, pxl;\n    Short  c1, f1;\n\n\n    /* Drop-out control */\n\n    /*   e2            x2                    x1           e1   */\n    /*                                                         */\n    /*                 ^                     |                 */\n    /*                 |                     |                 */\n    /*   +-------------+---------------------+------------+    */\n    /*                 |                     |                 */\n    /*                 |                     v                 */\n    /*                                                         */\n    /* pixel         contour              contour       pixel  */\n    /* center                                           center */\n\n    /* drop-out mode    scan conversion rules (as defined in OpenType) */\n    /* --------------------------------------------------------------- */\n    /*  0                1, 2, 3                                       */\n    /*  1                1, 2, 4                                       */\n    /*  2                1, 2                                          */\n    /*  3                same as mode 2                                */\n    /*  4                1, 2, 5                                       */\n    /*  5                1, 2, 6                                       */\n    /*  6, 7             same as mode 2                                */\n\n    e1  = CEILING( x1 );\n    e2  = FLOOR  ( x2 );\n    pxl = e1;\n\n    if ( e1 > e2 )\n    {\n      Int  dropOutControl = left->flags & 7;\n\n\n      if ( e1 == e2 + ras.precision )\n      {\n        switch ( dropOutControl )\n        {\n        case 0: /* simple drop-outs including stubs */\n          pxl = e2;\n          break;\n\n        case 4: /* smart drop-outs including stubs */\n          pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );\n          break;\n\n        case 1: /* simple drop-outs excluding stubs */\n        case 5: /* smart drop-outs excluding stubs  */\n\n          /* Drop-out Control Rules #4 and #6 */\n\n          /* The specification neither provides an exact definition */\n          /* of a `stub' nor gives exact rules to exclude them.     */\n          /*                                                        */\n          /* Here the constraints we use to recognize a stub.       */\n          /*                                                        */\n          /*  upper stub:                                           */\n          /*                                                        */\n          /*   - P_Left and P_Right are in the same contour         */\n          /*   - P_Right is the successor of P_Left in that contour */\n          /*   - y is the top of P_Left and P_Right                 */\n          /*                                                        */\n          /*  lower stub:                                           */\n          /*                                                        */\n          /*   - P_Left and P_Right are in the same contour         */\n          /*   - P_Left is the successor of P_Right in that contour */\n          /*   - y is the bottom of P_Left                          */\n          /*                                                        */\n          /* We draw a stub if the following constraints are met.   */\n          /*                                                        */\n          /*   - for an upper or lower stub, there is top or bottom */\n          /*     overshoot, respectively                            */\n          /*   - the covered interval is greater or equal to a half */\n          /*     pixel                                              */\n\n          /* upper stub test */\n          if ( left->next == right                &&\n               left->height <= 0                  &&\n               !( left->flags & Overshoot_Top   &&\n                  x2 - x1 >= ras.precision_half ) )\n            return;\n\n          /* lower stub test */\n          if ( right->next == left                 &&\n               left->start == y                    &&\n               !( left->flags & Overshoot_Bottom &&\n                  x2 - x1 >= ras.precision_half  ) )\n            return;\n\n          if ( dropOutControl == 1 )\n            pxl = e2;\n          else\n            pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );\n          break;\n\n        default: /* modes 2, 3, 6, 7 */\n          return;  /* no drop-out control */\n        }\n\n        /* undocumented but confirmed: If the drop-out would result in a  */\n        /* pixel outside of the bounding box, use the pixel inside of the */\n        /* bounding box instead                                           */\n        if ( pxl < 0 )\n          pxl = e1;\n        else if ( TRUNC( pxl ) >= ras.bWidth )\n          pxl = e2;\n\n        /* check that the other pixel isn't set */\n        e1 = pxl == e1 ? e2 : e1;\n\n        e1 = TRUNC( e1 );\n\n        c1 = (Short)( e1 >> 3 );\n        f1 = (Short)( e1 &  7 );\n\n        if ( e1 >= 0 && e1 < ras.bWidth                      &&\n             ras.bTarget[ras.traceOfs + c1] & ( 0x80 >> f1 ) )\n          return;\n      }\n      else\n        return;\n    }\n\n    e1 = TRUNC( pxl );\n\n    if ( e1 >= 0 && e1 < ras.bWidth )\n    {\n      c1 = (Short)( e1 >> 3 );\n      f1 = (Short)( e1 & 7 );\n\n      if ( ras.gray_min_x > c1 )\n        ras.gray_min_x = c1;\n      if ( ras.gray_max_x < c1 )\n        ras.gray_max_x = c1;\n\n      ras.bTarget[ras.traceOfs + c1] |= (char)( 0x80 >> f1 );\n    }\n  }\n\n\n  static void\n  Vertical_Sweep_Step( RAS_ARG )\n  {\n    ras.traceOfs += ras.traceIncr;\n  }\n\n\n  /***********************************************************************/\n  /*                                                                     */\n  /*  Horizontal Sweep Procedure Set                                     */\n  /*                                                                     */\n  /*  These four routines are used during the horizontal black/white     */\n  /*  sweep phase by the generic Draw_Sweep() function.                  */\n  /*                                                                     */\n  /***********************************************************************/\n\n  static void\n  Horizontal_Sweep_Init( RAS_ARGS Short*  min,\n                                  Short*  max )\n  {\n    /* nothing, really */\n    FT_UNUSED_RASTER;\n    FT_UNUSED( min );\n    FT_UNUSED( max );\n  }\n\n\n  static void\n  Horizontal_Sweep_Span( RAS_ARGS Short       y,\n                                  FT_F26Dot6  x1,\n                                  FT_F26Dot6  x2,\n                                  PProfile    left,\n                                  PProfile    right )\n  {\n    FT_UNUSED( left );\n    FT_UNUSED( right );\n\n\n    if ( x2 - x1 < ras.precision )\n    {\n      Long  e1, e2;\n\n\n      e1 = CEILING( x1 );\n      e2 = FLOOR  ( x2 );\n\n      if ( e1 == e2 )\n      {\n        Byte   f1;\n        PByte  bits;\n\n\n        bits = ras.bTarget + ( y >> 3 );\n        f1   = (Byte)( 0x80 >> ( y & 7 ) );\n\n        e1 = TRUNC( e1 );\n\n        if ( e1 >= 0 && e1 < ras.target.rows )\n        {\n          PByte  p;\n\n\n          p = bits - e1 * ras.target.pitch;\n          if ( ras.target.pitch > 0 )\n            p += ( ras.target.rows - 1 ) * ras.target.pitch;\n\n          p[0] |= f1;\n        }\n      }\n    }\n  }\n\n\n  static void\n  Horizontal_Sweep_Drop( RAS_ARGS Short       y,\n                                  FT_F26Dot6  x1,\n                                  FT_F26Dot6  x2,\n                                  PProfile    left,\n                                  PProfile    right )\n  {\n    Long   e1, e2, pxl;\n    PByte  bits;\n    Byte   f1;\n\n\n    /* During the horizontal sweep, we only take care of drop-outs */\n\n    /* e1     +       <-- pixel center */\n    /*        |                        */\n    /* x1  ---+-->    <-- contour      */\n    /*        |                        */\n    /*        |                        */\n    /* x2  <--+---    <-- contour      */\n    /*        |                        */\n    /*        |                        */\n    /* e2     +       <-- pixel center */\n\n    e1  = CEILING( x1 );\n    e2  = FLOOR  ( x2 );\n    pxl = e1;\n\n    if ( e1 > e2 )\n    {\n      Int  dropOutControl = left->flags & 7;\n\n\n      if ( e1 == e2 + ras.precision )\n      {\n        switch ( dropOutControl )\n        {\n        case 0: /* simple drop-outs including stubs */\n          pxl = e2;\n          break;\n\n        case 4: /* smart drop-outs including stubs */\n          pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );\n          break;\n\n        case 1: /* simple drop-outs excluding stubs */\n        case 5: /* smart drop-outs excluding stubs  */\n          /* see Vertical_Sweep_Drop for details */\n\n          /* rightmost stub test */\n          if ( left->next == right                &&\n               left->height <= 0                  &&\n               !( left->flags & Overshoot_Top   &&\n                  x2 - x1 >= ras.precision_half ) )\n            return;\n\n          /* leftmost stub test */\n          if ( right->next == left                 &&\n               left->start == y                    &&\n               !( left->flags & Overshoot_Bottom &&\n                  x2 - x1 >= ras.precision_half  ) )\n            return;\n\n          if ( dropOutControl == 1 )\n            pxl = e2;\n          else\n            pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );\n          break;\n\n        default: /* modes 2, 3, 6, 7 */\n          return;  /* no drop-out control */\n        }\n\n        /* undocumented but confirmed: If the drop-out would result in a  */\n        /* pixel outside of the bounding box, use the pixel inside of the */\n        /* bounding box instead                                           */\n        if ( pxl < 0 )\n          pxl = e1;\n        else if ( TRUNC( pxl ) >= ras.target.rows )\n          pxl = e2;\n\n        /* check that the other pixel isn't set */\n        e1 = pxl == e1 ? e2 : e1;\n\n        e1 = TRUNC( e1 );\n\n        bits = ras.bTarget + ( y >> 3 );\n        f1   = (Byte)( 0x80 >> ( y & 7 ) );\n\n        bits -= e1 * ras.target.pitch;\n        if ( ras.target.pitch > 0 )\n          bits += ( ras.target.rows - 1 ) * ras.target.pitch;\n\n        if ( e1 >= 0              &&\n             e1 < ras.target.rows &&\n             *bits & f1           )\n          return;\n      }\n      else\n        return;\n    }\n\n    bits = ras.bTarget + ( y >> 3 );\n    f1   = (Byte)( 0x80 >> ( y & 7 ) );\n\n    e1 = TRUNC( pxl );\n\n    if ( e1 >= 0 && e1 < ras.target.rows )\n    {\n      bits -= e1 * ras.target.pitch;\n      if ( ras.target.pitch > 0 )\n        bits += ( ras.target.rows - 1 ) * ras.target.pitch;\n\n      bits[0] |= f1;\n    }\n  }\n\n\n  static void\n  Horizontal_Sweep_Step( RAS_ARG )\n  {\n    /* Nothing, really */\n    FT_UNUSED_RASTER;\n  }\n\n\n#ifdef FT_RASTER_OPTION_ANTI_ALIASING\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  Vertical Gray Sweep Procedure Set                                    */\n  /*                                                                       */\n  /*  These two routines are used during the vertical gray-levels sweep    */\n  /*  phase by the generic Draw_Sweep() function.                          */\n  /*                                                                       */\n  /*  NOTES                                                                */\n  /*                                                                       */\n  /*  - The target pixmap's width *must* be a multiple of 4.               */\n  /*                                                                       */\n  /*  - You have to use the function Vertical_Sweep_Span() for the gray    */\n  /*    span call.                                                         */\n  /*                                                                       */\n  /*************************************************************************/\n\n  static void\n  Vertical_Gray_Sweep_Init( RAS_ARGS Short*  min,\n                                     Short*  max )\n  {\n    Long  pitch, byte_len;\n\n\n    *min = *min & -2;\n    *max = ( *max + 3 ) & -2;\n\n    ras.traceOfs  = 0;\n    pitch         = ras.target.pitch;\n    byte_len      = -pitch;\n    ras.traceIncr = (Short)byte_len;\n    ras.traceG    = ( *min / 2 ) * byte_len;\n\n    if ( pitch > 0 )\n    {\n      ras.traceG += ( ras.target.rows - 1 ) * pitch;\n      byte_len    = -byte_len;\n    }\n\n    ras.gray_min_x =  (Short)byte_len;\n    ras.gray_max_x = -(Short)byte_len;\n  }\n\n\n  static void\n  Vertical_Gray_Sweep_Step( RAS_ARG )\n  {\n    short*  count = (short*)count_table;\n    Byte*   grays;\n\n\n    ras.traceOfs += ras.gray_width;\n\n    if ( ras.traceOfs > ras.gray_width )\n    {\n      PByte  pix;\n\n\n      pix   = ras.gTarget + ras.traceG + ras.gray_min_x * 4;\n      grays = ras.grays;\n\n      if ( ras.gray_max_x >= 0 )\n      {\n        Long  last_pixel = ras.target.width - 1;\n        Int   last_cell  = last_pixel >> 2;\n        Int   last_bit   = last_pixel & 3;\n        Bool  over       = 0;\n\n        Int    c1, c2;\n        PByte  bit, bit2;\n\n\n        if ( ras.gray_max_x >= last_cell && last_bit != 3 )\n        {\n          ras.gray_max_x = last_cell - 1;\n          over = 1;\n        }\n\n        if ( ras.gray_min_x < 0 )\n          ras.gray_min_x = 0;\n\n        bit  = ras.bTarget + ras.gray_min_x;\n        bit2 = bit + ras.gray_width;\n\n        c1 = ras.gray_max_x - ras.gray_min_x;\n\n        while ( c1 >= 0 )\n        {\n          c2 = count[*bit] + count[*bit2];\n\n          if ( c2 )\n          {\n            pix[0] = grays[(c2 >> 12) & 0x000F];\n            pix[1] = grays[(c2 >> 8 ) & 0x000F];\n            pix[2] = grays[(c2 >> 4 ) & 0x000F];\n            pix[3] = grays[ c2        & 0x000F];\n\n            *bit  = 0;\n            *bit2 = 0;\n          }\n\n          bit++;\n          bit2++;\n          pix += 4;\n          c1--;\n        }\n\n        if ( over )\n        {\n          c2 = count[*bit] + count[*bit2];\n          if ( c2 )\n          {\n            switch ( last_bit )\n            {\n            case 2:\n              pix[2] = grays[(c2 >> 4 ) & 0x000F];\n            case 1:\n              pix[1] = grays[(c2 >> 8 ) & 0x000F];\n            default:\n              pix[0] = grays[(c2 >> 12) & 0x000F];\n            }\n\n            *bit  = 0;\n            *bit2 = 0;\n          }\n        }\n      }\n\n      ras.traceOfs = 0;\n      ras.traceG  += ras.traceIncr;\n\n      ras.gray_min_x =  32000;\n      ras.gray_max_x = -32000;\n    }\n  }\n\n\n  static void\n  Horizontal_Gray_Sweep_Span( RAS_ARGS Short       y,\n                                       FT_F26Dot6  x1,\n                                       FT_F26Dot6  x2,\n                                       PProfile    left,\n                                       PProfile    right )\n  {\n    /* nothing, really */\n    FT_UNUSED_RASTER;\n    FT_UNUSED( y );\n    FT_UNUSED( x1 );\n    FT_UNUSED( x2 );\n    FT_UNUSED( left );\n    FT_UNUSED( right );\n  }\n\n\n  static void\n  Horizontal_Gray_Sweep_Drop( RAS_ARGS Short       y,\n                                       FT_F26Dot6  x1,\n                                       FT_F26Dot6  x2,\n                                       PProfile    left,\n                                       PProfile    right )\n  {\n    Long   e1, e2;\n    PByte  pixel;\n\n\n    /* During the horizontal sweep, we only take care of drop-outs */\n\n    e1 = CEILING( x1 );\n    e2 = FLOOR  ( x2 );\n\n    if ( e1 > e2 )\n    {\n      Int  dropOutControl = left->flags & 7;\n\n\n      if ( e1 == e2 + ras.precision )\n      {\n        switch ( dropOutControl )\n        {\n        case 0: /* simple drop-outs including stubs */\n          e1 = e2;\n          break;\n\n        case 4: /* smart drop-outs including stubs */\n          e1 = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );\n          break;\n\n        case 1: /* simple drop-outs excluding stubs */\n        case 5: /* smart drop-outs excluding stubs  */\n          /* see Vertical_Sweep_Drop for details */\n\n          /* rightmost stub test */\n          if ( left->next == right && left->height <= 0 )\n            return;\n\n          /* leftmost stub test */\n          if ( right->next == left && left->start == y )\n            return;\n\n          if ( dropOutControl == 1 )\n            e1 = e2;\n          else\n            e1 = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );\n\n          break;\n\n        default: /* modes 2, 3, 6, 7 */\n          return;  /* no drop-out control */\n        }\n      }\n      else\n        return;\n    }\n\n    if ( e1 >= 0 )\n    {\n      Byte  color;\n\n\n      if ( x2 - x1 >= ras.precision_half )\n        color = ras.grays[2];\n      else\n        color = ras.grays[1];\n\n      e1 = TRUNC( e1 ) / 2;\n      if ( e1 < ras.target.rows )\n      {\n        pixel = ras.gTarget - e1 * ras.target.pitch + y / 2;\n        if ( ras.target.pitch > 0 )\n          pixel += ( ras.target.rows - 1 ) * ras.target.pitch;\n\n        if ( pixel[0] == ras.grays[0] )\n          pixel[0] = color;\n      }\n    }\n  }\n\n\n#endif /* FT_RASTER_OPTION_ANTI_ALIASING */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  Generic Sweep Drawing routine                                        */\n  /*                                                                       */\n  /*************************************************************************/\n\n  static Bool\n  Draw_Sweep( RAS_ARG )\n  {\n    Short         y, y_change, y_height;\n\n    PProfile      P, Q, P_Left, P_Right;\n\n    Short         min_Y, max_Y, top, bottom, dropouts;\n\n    Long          x1, x2, xs, e1, e2;\n\n    TProfileList  waiting;\n    TProfileList  draw_left, draw_right;\n\n\n    /* initialize empty linked lists */\n\n    Init_Linked( &waiting );\n\n    Init_Linked( &draw_left  );\n    Init_Linked( &draw_right );\n\n    /* first, compute min and max Y */\n\n    P     = ras.fProfile;\n    max_Y = (Short)TRUNC( ras.minY );\n    min_Y = (Short)TRUNC( ras.maxY );\n\n    while ( P )\n    {\n      Q = P->link;\n\n      bottom = (Short)P->start;\n      top    = (Short)( P->start + P->height - 1 );\n\n      if ( min_Y > bottom )\n        min_Y = bottom;\n      if ( max_Y < top )\n        max_Y = top;\n\n      P->X = 0;\n      InsNew( &waiting, P );\n\n      P = Q;\n    }\n\n    /* check the Y-turns */\n    if ( ras.numTurns == 0 )\n    {\n      ras.error = FT_THROW( Invalid );\n      return FAILURE;\n    }\n\n    /* now initialize the sweep */\n\n    ras.Proc_Sweep_Init( RAS_VARS &min_Y, &max_Y );\n\n    /* then compute the distance of each profile from min_Y */\n\n    P = waiting;\n\n    while ( P )\n    {\n      P->countL = (UShort)( P->start - min_Y );\n      P = P->link;\n    }\n\n    /* let's go */\n\n    y        = min_Y;\n    y_height = 0;\n\n    if ( ras.numTurns > 0                     &&\n         ras.sizeBuff[-ras.numTurns] == min_Y )\n      ras.numTurns--;\n\n    while ( ras.numTurns > 0 )\n    {\n      /* check waiting list for new activations */\n\n      P = waiting;\n\n      while ( P )\n      {\n        Q = P->link;\n        P->countL -= y_height;\n        if ( P->countL == 0 )\n        {\n          DelOld( &waiting, P );\n\n          if ( P->flags & Flow_Up )\n            InsNew( &draw_left,  P );\n          else\n            InsNew( &draw_right, P );\n        }\n\n        P = Q;\n      }\n\n      /* sort the drawing lists */\n\n      Sort( &draw_left );\n      Sort( &draw_right );\n\n      y_change = (Short)ras.sizeBuff[-ras.numTurns--];\n      y_height = (Short)( y_change - y );\n\n      while ( y < y_change )\n      {\n        /* let's trace */\n\n        dropouts = 0;\n\n        P_Left  = draw_left;\n        P_Right = draw_right;\n\n        while ( P_Left )\n        {\n          x1 = P_Left ->X;\n          x2 = P_Right->X;\n\n          if ( x1 > x2 )\n          {\n            xs = x1;\n            x1 = x2;\n            x2 = xs;\n          }\n\n          e1 = FLOOR( x1 );\n          e2 = CEILING( x2 );\n\n          if ( x2 - x1 <= ras.precision &&\n               e1 != x1 && e2 != x2     )\n          {\n            if ( e1 > e2 || e2 == e1 + ras.precision )\n            {\n              Int  dropOutControl = P_Left->flags & 7;\n\n\n              if ( dropOutControl != 2 )\n              {\n                /* a drop-out was detected */\n\n                P_Left ->X = x1;\n                P_Right->X = x2;\n\n                /* mark profile for drop-out processing */\n                P_Left->countL = 1;\n                dropouts++;\n              }\n\n              goto Skip_To_Next;\n            }\n          }\n\n          ras.Proc_Sweep_Span( RAS_VARS y, x1, x2, P_Left, P_Right );\n\n        Skip_To_Next:\n\n          P_Left  = P_Left->link;\n          P_Right = P_Right->link;\n        }\n\n        /* handle drop-outs _after_ the span drawing --       */\n        /* drop-out processing has been moved out of the loop */\n        /* for performance tuning                             */\n        if ( dropouts > 0 )\n          goto Scan_DropOuts;\n\n      Next_Line:\n\n        ras.Proc_Sweep_Step( RAS_VAR );\n\n        y++;\n\n        if ( y < y_change )\n        {\n          Sort( &draw_left  );\n          Sort( &draw_right );\n        }\n      }\n\n      /* now finalize the profiles that need it */\n\n      P = draw_left;\n      while ( P )\n      {\n        Q = P->link;\n        if ( P->height == 0 )\n          DelOld( &draw_left, P );\n        P = Q;\n      }\n\n      P = draw_right;\n      while ( P )\n      {\n        Q = P->link;\n        if ( P->height == 0 )\n          DelOld( &draw_right, P );\n        P = Q;\n      }\n    }\n\n    /* for gray-scaling, flush the bitmap scanline cache */\n    while ( y <= max_Y )\n    {\n      ras.Proc_Sweep_Step( RAS_VAR );\n      y++;\n    }\n\n    return SUCCESS;\n\n  Scan_DropOuts:\n\n    P_Left  = draw_left;\n    P_Right = draw_right;\n\n    while ( P_Left )\n    {\n      if ( P_Left->countL )\n      {\n        P_Left->countL = 0;\n#if 0\n        dropouts--;  /* -- this is useful when debugging only */\n#endif\n        ras.Proc_Sweep_Drop( RAS_VARS y,\n                                      P_Left->X,\n                                      P_Right->X,\n                                      P_Left,\n                                      P_Right );\n      }\n\n      P_Left  = P_Left->link;\n      P_Right = P_Right->link;\n    }\n\n    goto Next_Line;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Render_Single_Pass                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Perform one sweep with sub-banding.                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    flipped :: If set, flip the direction of the outline.              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Renderer error code.                                               */\n  /*                                                                       */\n  static int\n  Render_Single_Pass( RAS_ARGS Bool  flipped )\n  {\n    Short  i, j, k;\n\n\n    while ( ras.band_top >= 0 )\n    {\n      ras.maxY = (Long)ras.band_stack[ras.band_top].y_max * ras.precision;\n      ras.minY = (Long)ras.band_stack[ras.band_top].y_min * ras.precision;\n\n      ras.top = ras.buff;\n\n      ras.error = Raster_Err_None;\n\n      if ( Convert_Glyph( RAS_VARS flipped ) )\n      {\n        if ( ras.error != Raster_Err_Overflow )\n          return FAILURE;\n\n        ras.error = Raster_Err_None;\n\n        /* sub-banding */\n\n#ifdef DEBUG_RASTER\n        ClearBand( RAS_VARS TRUNC( ras.minY ), TRUNC( ras.maxY ) );\n#endif\n\n        i = ras.band_stack[ras.band_top].y_min;\n        j = ras.band_stack[ras.band_top].y_max;\n\n        k = (Short)( ( i + j ) / 2 );\n\n        if ( ras.band_top >= 7 || k < i )\n        {\n          ras.band_top = 0;\n          ras.error    = FT_THROW( Invalid );\n\n          return ras.error;\n        }\n\n        ras.band_stack[ras.band_top + 1].y_min = k;\n        ras.band_stack[ras.band_top + 1].y_max = j;\n\n        ras.band_stack[ras.band_top].y_max = (Short)( k - 1 );\n\n        ras.band_top++;\n      }\n      else\n      {\n        if ( ras.fProfile )\n          if ( Draw_Sweep( RAS_VAR ) )\n             return ras.error;\n        ras.band_top--;\n      }\n    }\n\n    return SUCCESS;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Render_Glyph                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Render a glyph in a bitmap.  Sub-banding if needed.                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  Render_Glyph( RAS_ARG )\n  {\n    FT_Error  error;\n\n\n    Set_High_Precision( RAS_VARS ras.outline.flags &\n                                 FT_OUTLINE_HIGH_PRECISION );\n    ras.scale_shift = ras.precision_shift;\n\n    if ( ras.outline.flags & FT_OUTLINE_IGNORE_DROPOUTS )\n      ras.dropOutControl = 2;\n    else\n    {\n      if ( ras.outline.flags & FT_OUTLINE_SMART_DROPOUTS )\n        ras.dropOutControl = 4;\n      else\n        ras.dropOutControl = 0;\n\n      if ( !( ras.outline.flags & FT_OUTLINE_INCLUDE_STUBS ) )\n        ras.dropOutControl += 1;\n    }\n\n    ras.second_pass = (FT_Byte)( !( ras.outline.flags &\n                                    FT_OUTLINE_SINGLE_PASS ) );\n\n    /* Vertical Sweep */\n    ras.Proc_Sweep_Init = Vertical_Sweep_Init;\n    ras.Proc_Sweep_Span = Vertical_Sweep_Span;\n    ras.Proc_Sweep_Drop = Vertical_Sweep_Drop;\n    ras.Proc_Sweep_Step = Vertical_Sweep_Step;\n\n    ras.band_top            = 0;\n    ras.band_stack[0].y_min = 0;\n    ras.band_stack[0].y_max = (short)( ras.target.rows - 1 );\n\n    ras.bWidth  = (unsigned short)ras.target.width;\n    ras.bTarget = (Byte*)ras.target.buffer;\n\n    if ( ( error = Render_Single_Pass( RAS_VARS 0 ) ) != 0 )\n      return error;\n\n    /* Horizontal Sweep */\n    if ( ras.second_pass && ras.dropOutControl != 2 )\n    {\n      ras.Proc_Sweep_Init = Horizontal_Sweep_Init;\n      ras.Proc_Sweep_Span = Horizontal_Sweep_Span;\n      ras.Proc_Sweep_Drop = Horizontal_Sweep_Drop;\n      ras.Proc_Sweep_Step = Horizontal_Sweep_Step;\n\n      ras.band_top            = 0;\n      ras.band_stack[0].y_min = 0;\n      ras.band_stack[0].y_max = (short)( ras.target.width - 1 );\n\n      if ( ( error = Render_Single_Pass( RAS_VARS 1 ) ) != 0 )\n        return error;\n    }\n\n    return Raster_Err_None;\n  }\n\n\n#ifdef FT_RASTER_OPTION_ANTI_ALIASING\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Render_Gray_Glyph                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Render a glyph with grayscaling.  Sub-banding if needed.           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  Render_Gray_Glyph( RAS_ARG )\n  {\n    Long      pixel_width;\n    FT_Error  error;\n\n\n    Set_High_Precision( RAS_VARS ras.outline.flags &\n                                 FT_OUTLINE_HIGH_PRECISION );\n    ras.scale_shift = ras.precision_shift + 1;\n\n    if ( ras.outline.flags & FT_OUTLINE_IGNORE_DROPOUTS )\n      ras.dropOutControl = 2;\n    else\n    {\n      if ( ras.outline.flags & FT_OUTLINE_SMART_DROPOUTS )\n        ras.dropOutControl = 4;\n      else\n        ras.dropOutControl = 0;\n\n      if ( !( ras.outline.flags & FT_OUTLINE_INCLUDE_STUBS ) )\n        ras.dropOutControl += 1;\n    }\n\n    ras.second_pass = !( ras.outline.flags & FT_OUTLINE_SINGLE_PASS );\n\n    /* Vertical Sweep */\n\n    ras.band_top            = 0;\n    ras.band_stack[0].y_min = 0;\n    ras.band_stack[0].y_max = 2 * ras.target.rows - 1;\n\n    ras.bWidth  = ras.gray_width;\n    pixel_width = 2 * ( ( ras.target.width + 3 ) >> 2 );\n\n    if ( ras.bWidth > pixel_width )\n      ras.bWidth = pixel_width;\n\n    ras.bWidth  = ras.bWidth * 8;\n    ras.bTarget = (Byte*)ras.gray_lines;\n    ras.gTarget = (Byte*)ras.target.buffer;\n\n    ras.Proc_Sweep_Init = Vertical_Gray_Sweep_Init;\n    ras.Proc_Sweep_Span = Vertical_Sweep_Span;\n    ras.Proc_Sweep_Drop = Vertical_Sweep_Drop;\n    ras.Proc_Sweep_Step = Vertical_Gray_Sweep_Step;\n\n    error = Render_Single_Pass( RAS_VARS 0 );\n    if ( error )\n      return error;\n\n    /* Horizontal Sweep */\n    if ( ras.second_pass && ras.dropOutControl != 2 )\n    {\n      ras.Proc_Sweep_Init = Horizontal_Sweep_Init;\n      ras.Proc_Sweep_Span = Horizontal_Gray_Sweep_Span;\n      ras.Proc_Sweep_Drop = Horizontal_Gray_Sweep_Drop;\n      ras.Proc_Sweep_Step = Horizontal_Sweep_Step;\n\n      ras.band_top            = 0;\n      ras.band_stack[0].y_min = 0;\n      ras.band_stack[0].y_max = ras.target.width * 2 - 1;\n\n      error = Render_Single_Pass( RAS_VARS 1 );\n      if ( error )\n        return error;\n    }\n\n    return Raster_Err_None;\n  }\n\n#else /* !FT_RASTER_OPTION_ANTI_ALIASING */\n\n  FT_LOCAL_DEF( FT_Error )\n  Render_Gray_Glyph( RAS_ARG )\n  {\n    FT_UNUSED_RASTER;\n\n    return FT_THROW( Unsupported );\n  }\n\n#endif /* !FT_RASTER_OPTION_ANTI_ALIASING */\n\n\n  static void\n  ft_black_init( black_PRaster  raster )\n  {\n#ifdef FT_RASTER_OPTION_ANTI_ALIASING\n    FT_UInt  n;\n\n\n    /* set default 5-levels gray palette */\n    for ( n = 0; n < 5; n++ )\n      raster->grays[n] = n * 255 / 4;\n\n    raster->gray_width = RASTER_GRAY_LINES / 2;\n#else\n    FT_UNUSED( raster );\n#endif\n  }\n\n\n  /**** RASTER OBJECT CREATION: In standalone mode, we simply use *****/\n  /****                         a static object.                  *****/\n\n\n#ifdef _STANDALONE_\n\n\n  static int\n  ft_black_new( void*       memory,\n                FT_Raster  *araster )\n  {\n     static black_TRaster  the_raster;\n     FT_UNUSED( memory );\n\n\n     *araster = (FT_Raster)&the_raster;\n     FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) );\n     ft_black_init( &the_raster );\n\n     return 0;\n  }\n\n\n  static void\n  ft_black_done( FT_Raster  raster )\n  {\n    /* nothing */\n    FT_UNUSED( raster );\n  }\n\n\n#else /* !_STANDALONE_ */\n\n\n  static int\n  ft_black_new( FT_Memory       memory,\n                black_PRaster  *araster )\n  {\n    FT_Error       error;\n    black_PRaster  raster = NULL;\n\n\n    *araster = 0;\n    if ( !FT_NEW( raster ) )\n    {\n      raster->memory = memory;\n      ft_black_init( raster );\n\n      *araster = raster;\n    }\n\n    return error;\n  }\n\n\n  static void\n  ft_black_done( black_PRaster  raster )\n  {\n    FT_Memory  memory = (FT_Memory)raster->memory;\n\n\n    FT_FREE( raster );\n  }\n\n\n#endif /* !_STANDALONE_ */\n\n\n  static void\n  ft_black_reset( black_PRaster  raster,\n                  char*          pool_base,\n                  long           pool_size )\n  {\n    if ( raster )\n    {\n      if ( pool_base && pool_size >= (long)sizeof ( black_TWorker ) + 2048 )\n      {\n        black_PWorker  worker = (black_PWorker)pool_base;\n\n\n        raster->buffer      = pool_base + ( ( sizeof ( *worker ) + 7 ) & ~7 );\n        raster->buffer_size = (long)( pool_base + pool_size -\n                                        (char*)raster->buffer );\n        raster->worker      = worker;\n      }\n      else\n      {\n        raster->buffer      = NULL;\n        raster->buffer_size = 0;\n        raster->worker      = NULL;\n      }\n    }\n  }\n\n\n  static void\n  ft_black_set_mode( black_PRaster  raster,\n                     unsigned long  mode,\n                     const char*    palette )\n  {\n#ifdef FT_RASTER_OPTION_ANTI_ALIASING\n\n    if ( mode == FT_MAKE_TAG( 'p', 'a', 'l', '5' ) )\n    {\n      /* set 5-levels gray palette */\n      raster->grays[0] = palette[0];\n      raster->grays[1] = palette[1];\n      raster->grays[2] = palette[2];\n      raster->grays[3] = palette[3];\n      raster->grays[4] = palette[4];\n    }\n\n#else\n\n    FT_UNUSED( raster );\n    FT_UNUSED( mode );\n    FT_UNUSED( palette );\n\n#endif\n  }\n\n\n  static int\n  ft_black_render( black_PRaster            raster,\n                   const FT_Raster_Params*  params )\n  {\n    const FT_Outline*  outline    = (const FT_Outline*)params->source;\n    const FT_Bitmap*   target_map = params->target;\n    black_PWorker      worker;\n\n\n    if ( !raster || !raster->buffer || !raster->buffer_size )\n      return FT_THROW( Not_Ini );\n\n    if ( !outline )\n      return FT_THROW( Invalid );\n\n    /* return immediately if the outline is empty */\n    if ( outline->n_points == 0 || outline->n_contours <= 0 )\n      return Raster_Err_None;\n\n    if ( !outline->contours || !outline->points )\n      return FT_THROW( Invalid );\n\n    if ( outline->n_points !=\n           outline->contours[outline->n_contours - 1] + 1 )\n      return FT_THROW( Invalid );\n\n    worker = raster->worker;\n\n    /* this version of the raster does not support direct rendering, sorry */\n    if ( params->flags & FT_RASTER_FLAG_DIRECT )\n      return FT_THROW( Unsupported );\n\n    if ( !target_map )\n      return FT_THROW( Invalid );\n\n    /* nothing to do */\n    if ( !target_map->width || !target_map->rows )\n      return Raster_Err_None;\n\n    if ( !target_map->buffer )\n      return FT_THROW( Invalid );\n\n    ras.outline = *outline;\n    ras.target  = *target_map;\n\n    worker->buff       = (PLong) raster->buffer;\n    worker->sizeBuff   = worker->buff +\n                           raster->buffer_size / sizeof ( Long );\n#ifdef FT_RASTER_OPTION_ANTI_ALIASING\n    worker->grays      = raster->grays;\n    worker->gray_width = raster->gray_width;\n\n    FT_MEM_ZERO( worker->gray_lines, worker->gray_width * 2 );\n#endif\n\n    return ( params->flags & FT_RASTER_FLAG_AA )\n           ? Render_Gray_Glyph( RAS_VAR )\n           : Render_Glyph( RAS_VAR );\n  }\n\n\n  FT_DEFINE_RASTER_FUNCS( ft_standard_raster,\n    FT_GLYPH_FORMAT_OUTLINE,\n    (FT_Raster_New_Func)     ft_black_new,\n    (FT_Raster_Reset_Func)   ft_black_reset,\n    (FT_Raster_Set_Mode_Func)ft_black_set_mode,\n    (FT_Raster_Render_Func)  ft_black_render,\n    (FT_Raster_Done_Func)    ft_black_done\n  )\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftraster.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftraster.h                                                             */\n/*                                                                         */\n/*    The FreeType glyph rasterizer (specification).                       */\n/*                                                                         */\n/*  Copyright 1996-2001 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used        */\n/*  modified and distributed under the terms of the FreeType project       */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTRASTER_H__\n#define __FTRASTER_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/config/ftconfig.h\"\n#include \"../../include/freetype/ftimage.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Uncomment the following line if you are using ftraster.c as a         */\n  /* standalone module, fully independent of FreeType.                     */\n  /*                                                                       */\n/* #define _STANDALONE_ */\n\n  FT_EXPORT_VAR( const FT_Raster_Funcs )  ft_standard_raster;\n\n\nFT_END_HEADER\n\n#endif /* __FTRASTER_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftrend1.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftrend1.c                                                              */\n/*                                                                         */\n/*    The FreeType glyph rasterizer interface (body).                      */\n/*                                                                         */\n/*  Copyright 1996-2003, 2005, 2006, 2011, 2013 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/ftoutln.h\"\n#include \"ftrend1.h\"\n#include \"ftraster.h\"\n#include \"rastpic.h\"\n\n#include \"rasterrs.h\"\n\n\n  /* initialize renderer -- init its raster */\n  static FT_Error\n  ft_raster1_init( FT_Renderer  render )\n  {\n    FT_Library  library = FT_MODULE_LIBRARY( render );\n\n\n    render->clazz->raster_class->raster_reset( render->raster,\n                                               library->raster_pool,\n                                               library->raster_pool_size );\n\n    return FT_Err_Ok;\n  }\n\n\n  /* set render-specific mode */\n  static FT_Error\n  ft_raster1_set_mode( FT_Renderer  render,\n                       FT_ULong     mode_tag,\n                       FT_Pointer   data )\n  {\n    /* we simply pass it to the raster */\n    return render->clazz->raster_class->raster_set_mode( render->raster,\n                                                         mode_tag,\n                                                         data );\n  }\n\n\n  /* transform a given glyph image */\n  static FT_Error\n  ft_raster1_transform( FT_Renderer       render,\n                        FT_GlyphSlot      slot,\n                        const FT_Matrix*  matrix,\n                        const FT_Vector*  delta )\n  {\n    FT_Error error = FT_Err_Ok;\n\n\n    if ( slot->format != render->glyph_format )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    if ( matrix )\n      FT_Outline_Transform( &slot->outline, matrix );\n\n    if ( delta )\n      FT_Outline_Translate( &slot->outline, delta->x, delta->y );\n\n  Exit:\n    return error;\n  }\n\n\n  /* return the glyph's control box */\n  static void\n  ft_raster1_get_cbox( FT_Renderer   render,\n                       FT_GlyphSlot  slot,\n                       FT_BBox*      cbox )\n  {\n    FT_MEM_ZERO( cbox, sizeof ( *cbox ) );\n\n    if ( slot->format == render->glyph_format )\n      FT_Outline_Get_CBox( &slot->outline, cbox );\n  }\n\n\n  /* convert a slot's glyph image into a bitmap */\n  static FT_Error\n  ft_raster1_render( FT_Renderer       render,\n                     FT_GlyphSlot      slot,\n                     FT_Render_Mode    mode,\n                     const FT_Vector*  origin )\n  {\n    FT_Error     error;\n    FT_Outline*  outline;\n    FT_BBox      cbox;\n    FT_UInt      width, height, pitch;\n    FT_Bitmap*   bitmap;\n    FT_Memory    memory;\n\n    FT_Raster_Params  params;\n\n\n    /* check glyph image format */\n    if ( slot->format != render->glyph_format )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    /* check rendering mode */\n#ifndef FT_CONFIG_OPTION_PIC\n    if ( mode != FT_RENDER_MODE_MONO )\n    {\n      /* raster1 is only capable of producing monochrome bitmaps */\n      if ( render->clazz == &ft_raster1_renderer_class )\n        return FT_THROW( Cannot_Render_Glyph );\n    }\n    else\n    {\n      /* raster5 is only capable of producing 5-gray-levels bitmaps */\n      if ( render->clazz == &ft_raster5_renderer_class )\n        return FT_THROW( Cannot_Render_Glyph );\n    }\n#else /* FT_CONFIG_OPTION_PIC */\n    /* When PIC is enabled, we cannot get to the class object      */\n    /* so instead we check the final character in the class name   */\n    /* (\"raster5\" or \"raster1\"). Yes this is a hack.               */\n    /* The \"correct\" thing to do is have different render function */\n    /* for each of the classes.                                    */\n    if ( mode != FT_RENDER_MODE_MONO )\n    {\n      /* raster1 is only capable of producing monochrome bitmaps */\n      if ( render->clazz->root.module_name[6] == '1' )\n        return FT_THROW( Cannot_Render_Glyph );\n    }\n    else\n    {\n      /* raster5 is only capable of producing 5-gray-levels bitmaps */\n      if ( render->clazz->root.module_name[6] == '5' )\n        return FT_THROW( Cannot_Render_Glyph );\n    }\n#endif /* FT_CONFIG_OPTION_PIC */\n\n    outline = &slot->outline;\n\n    /* translate the outline to the new origin if needed */\n    if ( origin )\n      FT_Outline_Translate( outline, origin->x, origin->y );\n\n    /* compute the control box, and grid fit it */\n    FT_Outline_Get_CBox( outline, &cbox );\n\n    /* undocumented but confirmed: bbox values get rounded */\n#if 1\n    cbox.xMin = FT_PIX_ROUND( cbox.xMin );\n    cbox.yMin = FT_PIX_ROUND( cbox.yMin );\n    cbox.xMax = FT_PIX_ROUND( cbox.xMax );\n    cbox.yMax = FT_PIX_ROUND( cbox.yMax );\n#else\n    cbox.xMin = FT_PIX_FLOOR( cbox.xMin );\n    cbox.yMin = FT_PIX_FLOOR( cbox.yMin );\n    cbox.xMax = FT_PIX_CEIL( cbox.xMax );\n    cbox.yMax = FT_PIX_CEIL( cbox.yMax );\n#endif\n\n    width  = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 );\n    height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 );\n\n    if ( width > FT_USHORT_MAX || height > FT_USHORT_MAX )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    bitmap = &slot->bitmap;\n    memory = render->root.memory;\n\n    /* release old bitmap buffer */\n    if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )\n    {\n      FT_FREE( bitmap->buffer );\n      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;\n    }\n\n    /* allocate new one, depends on pixel format */\n    if ( !( mode & FT_RENDER_MODE_MONO ) )\n    {\n      /* we pad to 32 bits, only for backwards compatibility with FT 1.x */\n      pitch              = FT_PAD_CEIL( width, 4 );\n      bitmap->pixel_mode = FT_PIXEL_MODE_GRAY;\n      bitmap->num_grays  = 256;\n    }\n    else\n    {\n      pitch              = ( ( width + 15 ) >> 4 ) << 1;\n      bitmap->pixel_mode = FT_PIXEL_MODE_MONO;\n    }\n\n    bitmap->width = width;\n    bitmap->rows  = height;\n    bitmap->pitch = pitch;\n\n    if ( FT_ALLOC_MULT( bitmap->buffer, pitch, height ) )\n      goto Exit;\n\n    slot->internal->flags |= FT_GLYPH_OWN_BITMAP;\n\n    /* translate outline to render it into the bitmap */\n    FT_Outline_Translate( outline, -cbox.xMin, -cbox.yMin );\n\n    /* set up parameters */\n    params.target = bitmap;\n    params.source = outline;\n    params.flags  = 0;\n\n    if ( bitmap->pixel_mode == FT_PIXEL_MODE_GRAY )\n      params.flags |= FT_RASTER_FLAG_AA;\n\n    /* render outline into the bitmap */\n    error = render->raster_render( render->raster, &params );\n\n    FT_Outline_Translate( outline, cbox.xMin, cbox.yMin );\n\n    if ( error )\n      goto Exit;\n\n    slot->format      = FT_GLYPH_FORMAT_BITMAP;\n    slot->bitmap_left = (FT_Int)( cbox.xMin >> 6 );\n    slot->bitmap_top  = (FT_Int)( cbox.yMax >> 6 );\n\n  Exit:\n    return error;\n  }\n\n\n  FT_DEFINE_RENDERER( ft_raster1_renderer_class,\n\n      FT_MODULE_RENDERER,\n      sizeof ( FT_RendererRec ),\n\n      \"raster1\",\n      0x10000L,\n      0x20000L,\n\n      0,    /* module specific interface */\n\n      (FT_Module_Constructor)ft_raster1_init,\n      (FT_Module_Destructor) 0,\n      (FT_Module_Requester)  0\n    ,\n\n    FT_GLYPH_FORMAT_OUTLINE,\n\n    (FT_Renderer_RenderFunc)   ft_raster1_render,\n    (FT_Renderer_TransformFunc)ft_raster1_transform,\n    (FT_Renderer_GetCBoxFunc)  ft_raster1_get_cbox,\n    (FT_Renderer_SetModeFunc)  ft_raster1_set_mode,\n\n    (FT_Raster_Funcs*)    &FT_STANDARD_RASTER_GET\n  )\n\n\n  /* This renderer is _NOT_ part of the default modules; you will need */\n  /* to register it by hand in your application.  It should only be    */\n  /* used for backwards-compatibility with FT 1.x anyway.              */\n  /*                                                                   */\n  FT_DEFINE_RENDERER( ft_raster5_renderer_class,\n\n      FT_MODULE_RENDERER,\n      sizeof ( FT_RendererRec ),\n\n      \"raster5\",\n      0x10000L,\n      0x20000L,\n\n      0,    /* module specific interface */\n\n      (FT_Module_Constructor)ft_raster1_init,\n      (FT_Module_Destructor) 0,\n      (FT_Module_Requester)  0\n    ,\n\n    FT_GLYPH_FORMAT_OUTLINE,\n\n    (FT_Renderer_RenderFunc)   ft_raster1_render,\n    (FT_Renderer_TransformFunc)ft_raster1_transform,\n    (FT_Renderer_GetCBoxFunc)  ft_raster1_get_cbox,\n    (FT_Renderer_SetModeFunc)  ft_raster1_set_mode,\n\n    (FT_Raster_Funcs*)    &FT_STANDARD_RASTER_GET\n  )\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftrend1.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftrend1.h                                                              */\n/*                                                                         */\n/*    The FreeType glyph rasterizer interface (specification).             */\n/*                                                                         */\n/*  Copyright 1996-2001 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTREND1_H__\n#define __FTREND1_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/ftrender.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  FT_DECLARE_RENDERER( ft_raster1_renderer_class )\n\n  /* this renderer is _NOT_ part of the default modules, you'll need */\n  /* to register it by hand in your application.  It should only be  */\n  /* used for backwards-compatibility with FT 1.x anyway.            */\n  /*                                                                 */\n  FT_DECLARE_RENDERER( ft_raster5_renderer_class )\n\n\nFT_END_HEADER\n\n#endif /* __FTREND1_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/raster/fxft_raster.c",
    "content": "#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501\n/***************************************************************************/\n/*                                                                         */\n/*  raster.c                                                               */\n/*                                                                         */\n/*    FreeType monochrome rasterer module component (body only).           */\n/*                                                                         */\n/*  Copyright 1996-2001 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n#define FT2_BUILD_LIBRARY\n\n#include \"../../include/ft2build.h\"\n#include \"rastpic.c\"\n#ifdef _FX_MANAGED_CODE_\n#define TWorker_\tTWorker_raster\n#define TRaster_\tTRaster_raster\n#endif\n#include \"ftraster.c\"\n#include \"ftrend1.c\"\n\n\n/* END */\n#endif\n\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rasterrs.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  rasterrs.h                                                             */\n/*                                                                         */\n/*    monochrome renderer error codes (specification only).                */\n/*                                                                         */\n/*  Copyright 2001, 2012 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the monochrome renderer error enumeration */\n  /* constants.                                                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __RASTERRS_H__\n#define __RASTERRS_H__\n\n#include \"../../include/freetype/ftmoderr.h\"\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  Raster_Err_\n#define FT_ERR_BASE    FT_Mod_Err_Raster\n\n#include \"../../include/freetype/fterrors.h\"\n\n#endif /* __RASTERRS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rastpic.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  rastpic.c                                                              */\n/*                                                                         */\n/*    The FreeType position independent code services for raster module.   */\n/*                                                                         */\n/*  Copyright 2009, 2010, 2012, 2013 by                                    */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/freetype.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"rastpic.h\"\n#include \"rasterrs.h\"\n\n\n#ifdef FT_CONFIG_OPTION_PIC\n\n  /* forward declaration of PIC init functions from ftraster.c */\n  void\n  FT_Init_Class_ft_standard_raster( FT_Raster_Funcs*  funcs );\n\n\n  void\n  ft_raster1_renderer_class_pic_free( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Memory          memory        = library->memory;\n\n\n    if ( pic_container->raster )\n    {\n      RasterPIC*  container = (RasterPIC*)pic_container->raster;\n\n\n      if ( --container->ref_count )\n        return;\n      FT_FREE( container );\n      pic_container->raster = NULL;\n    }\n  }\n\n\n  FT_Error\n  ft_raster1_renderer_class_pic_init( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Error           error         = FT_Err_Ok;\n    RasterPIC*         container     = NULL;\n    FT_Memory          memory        = library->memory;\n\n\n    /* since this function also serves raster5 renderer, */\n    /* it implements reference counting                  */\n    if ( pic_container->raster )\n    {\n      ((RasterPIC*)pic_container->raster)->ref_count++;\n      return error;\n    }\n\n    /* allocate pointer, clear and set global container pointer */\n    if ( FT_ALLOC( container, sizeof ( *container ) ) )\n      return error;\n    FT_MEM_SET( container, 0, sizeof ( *container ) );\n    pic_container->raster = container;\n\n    container->ref_count = 1;\n\n    /* initialize pointer table -                       */\n    /* this is how the module usually expects this data */\n    FT_Init_Class_ft_standard_raster( &container->ft_standard_raster );\n\n    return error;\n  }\n\n\n  /* re-route these init and free functions to the above functions */\n  FT_Error\n  ft_raster5_renderer_class_pic_init( FT_Library  library )\n  {\n    return ft_raster1_renderer_class_pic_init( library );\n  }\n\n\n  void\n  ft_raster5_renderer_class_pic_free( FT_Library  library )\n  {\n    ft_raster1_renderer_class_pic_free( library );\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rastpic.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  rastpic.h                                                              */\n/*                                                                         */\n/*    The FreeType position independent code services for raster module.   */\n/*                                                                         */\n/*  Copyright 2009 by                                                      */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __RASTPIC_H__\n#define __RASTPIC_H__\n\n\nFT_BEGIN_HEADER\n\n#include \"../../include/freetype/internal/ftpic.h\"\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_STANDARD_RASTER_GET  ft_standard_raster\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n  typedef struct  RasterPIC_\n  {\n    int              ref_count;\n    FT_Raster_Funcs  ft_standard_raster;\n\n  } RasterPIC;\n\n\n#define GET_PIC( lib )                                    \\\n          ( (RasterPIC*)( (lib)->pic_container.raster ) )\n#define FT_STANDARD_RASTER_GET  ( GET_PIC( library )->ft_standard_raster )\n\n\n  /* see rastpic.c for the implementation */\n  void\n  ft_raster1_renderer_class_pic_free( FT_Library  library );\n\n  void\n  ft_raster5_renderer_class_pic_free( FT_Library  library );\n\n  FT_Error\n  ft_raster1_renderer_class_pic_init( FT_Library  library );\n\n  FT_Error\n  ft_raster5_renderer_class_pic_init( FT_Library  library );\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __RASTPIC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/Jamfile",
    "content": "# FreeType 2 src/sfnt Jamfile\n#\n# Copyright 2001, 2002, 2004, 2005 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) sfnt ;\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = sfobjs sfdriver ttcmap ttmtx ttpost ttload ttsbit ttkern ttbdf sfntpic ;\n  }\n  else\n  {\n    _sources = sfnt ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/sfnt Jamfile\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/fxft_sfnt.c",
    "content": "#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501\n/***************************************************************************/\n/*                                                                         */\n/*  sfnt.c                                                                 */\n/*                                                                         */\n/*    Single object library component.                                     */\n/*                                                                         */\n/*  Copyright 1996-2006, 2013 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n#define FT2_BUILD_LIBRARY\n\n#include \"../../include/ft2build.h\"\n#include \"sfntpic.c\"\n#include \"ttload.c\"\n#include \"ttmtx.c\"\n#include \"ttcmap.c\"\n#include \"ttkern.c\"\n#include \"sfobjs.c\"\n#include \"sfdriver.c\"\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n#include \"pngshim.c\"\n#include \"ttsbit.c\"\n#endif\n\n#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES\n#include \"ttpost.c\"\n#endif\n\n#ifdef TT_CONFIG_OPTION_BDF\n#include \"ttbdf.c\"\n#endif\n\n/* END */\n#endif\n\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/pngshim.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pngshim.c                                                              */\n/*                                                                         */\n/*    PNG Bitmap glyph support.                                            */\n/*                                                                         */\n/*  Copyright 2013 by Google, Inc.                                         */\n/*  Written by Stuart Gill and Behdad Esfahbod.                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/tttags.h\"\n#include \"../../include/freetype/config/ftstdlib.h\"\n\n\n#ifdef FT_CONFIG_OPTION_USE_PNG\n\n  /* We always include <stjmp.h>, so make libpng shut up! */\n#define PNG_SKIP_SETJMP_CHECK 1\n#include <png.h>\n#include \"pngshim.h\"\n\n#include \"sferrors.h\"\n\n\n  /* This code is freely based on cairo-png.c.  There's so many ways */\n  /* to call libpng, and the way cairo does it is defacto standard.  */\n\n  static int\n  multiply_alpha( int  alpha,\n                  int  color )\n  {\n    int  temp = ( alpha * color ) + 0x80;\n\n\n    return ( temp + ( temp >> 8 ) ) >> 8;\n  }\n\n\n  /* Premultiplies data and converts RGBA bytes => native endian. */\n  static void\n  premultiply_data( png_structp    png,\n                    png_row_infop  row_info,\n                    png_bytep      data )\n  {\n    unsigned int  i;\n\n    FT_UNUSED( png );\n\n\n    for ( i = 0; i < row_info->rowbytes; i += 4 )\n    {\n      unsigned char*  base  = &data[i];\n      unsigned int    alpha = base[3];\n\n\n      if ( alpha == 0 )\n        base[0] = base[1] = base[2] = base[3] = 0;\n\n      else\n      {\n        unsigned int  red   = base[0];\n        unsigned int  green = base[1];\n        unsigned int  blue  = base[2];\n\n\n        if ( alpha != 0xFF )\n        {\n          red   = multiply_alpha( alpha, red   );\n          green = multiply_alpha( alpha, green );\n          blue  = multiply_alpha( alpha, blue  );\n        }\n\n        base[0] = blue;\n        base[1] = green;\n        base[2] = red;\n        base[3] = alpha;\n      }\n    }\n  }\n\n\n  /* Converts RGBx bytes to BGRA. */\n  static void\n  convert_bytes_to_data( png_structp    png,\n                         png_row_infop  row_info,\n                         png_bytep      data )\n  {\n    unsigned int  i;\n\n    FT_UNUSED( png );\n\n\n    for ( i = 0; i < row_info->rowbytes; i += 4 )\n    {\n      unsigned char*  base  = &data[i];\n      unsigned int    red   = base[0];\n      unsigned int    green = base[1];\n      unsigned int    blue  = base[2];\n\n\n      base[0] = blue;\n      base[1] = green;\n      base[2] = red;\n      base[3] = 0xFF;\n    }\n  }\n\n\n  /* Use error callback to avoid png writing to stderr. */\n  static void\n  error_callback( png_structp      png,\n                  png_const_charp  error_msg )\n  {\n    FT_Error*  error = png_get_error_ptr( png );\n\n    FT_UNUSED( error_msg );\n\n\n    *error = FT_THROW( Out_Of_Memory );\n#ifdef PNG_SETJMP_SUPPORTED\n    longjmp( png_jmpbuf( png ), 1 );\n#endif\n    /* if we get here, then we have no choice but to abort ... */\n  }\n\n\n  /* Use warning callback to avoid png writing to stderr. */\n  static void\n  warning_callback( png_structp      png,\n                    png_const_charp  error_msg )\n  {\n    FT_UNUSED( png );\n    FT_UNUSED( error_msg );\n\n    /* Just ignore warnings. */\n  }\n\n\n  static void\n  read_data_from_FT_Stream( png_structp  png,\n                            png_bytep    data,\n                            png_size_t   length )\n  {\n    FT_Error   error;\n    png_voidp  p      = png_get_io_ptr( png );\n    FT_Stream  stream = (FT_Stream)p;\n\n\n    if ( FT_FRAME_ENTER( length ) )\n    {\n      FT_Error*  e = png_get_error_ptr( png );\n\n\n      *e = FT_THROW( Invalid_Stream_Read );\n      png_error( png, NULL );\n\n      return;\n    }\n\n    memcpy( data, stream->cursor, length );\n\n    FT_FRAME_EXIT();\n  }\n\n\n  static FT_Error\n  Load_SBit_Png( FT_Bitmap*       map,\n                 FT_Int           x_offset,\n                 FT_Int           y_offset,\n                 FT_Int           pix_bits,\n                 TT_SBit_Metrics  metrics,\n                 FT_Memory        memory,\n                 FT_Byte*         data,\n                 FT_UInt          png_len )\n  {\n    FT_Error      error = FT_Err_Ok;\n    FT_StreamRec  stream;\n\n    png_structp  png;\n    png_infop    info;\n    png_uint_32  imgWidth, imgHeight;\n\n    int         bitdepth, color_type, interlace;\n    FT_Int      i;\n    png_byte*  *rows;\n\n\n    if ( x_offset < 0 || x_offset + metrics->width  > map->width ||\n         y_offset < 0 || y_offset + metrics->height > map->rows  ||\n         pix_bits != 32 || map->pixel_mode != FT_PIXEL_MODE_BGRA )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    FT_Stream_OpenMemory( &stream, data, png_len );\n\n    png = png_create_read_struct( PNG_LIBPNG_VER_STRING,\n                                  &error,\n                                  error_callback,\n                                  warning_callback );\n    if ( !png )\n    {\n      error = FT_THROW( Out_Of_Memory );\n      goto Exit;\n    }\n\n    info = png_create_info_struct( png );\n    if ( !info )\n    {\n      error = FT_THROW( Out_Of_Memory );\n      png_destroy_read_struct( &png, NULL, NULL );\n      goto Exit;\n    }\n\n    if ( ft_setjmp( png_jmpbuf( png ) ) )\n    {\n      error = FT_THROW( Invalid_File_Format );\n      goto DestroyExit;\n    }\n\n    png_set_read_fn( png, &stream, read_data_from_FT_Stream );\n\n    png_read_info( png, info );\n    png_get_IHDR( png, info,\n                  &imgWidth, &imgHeight,\n                  &bitdepth, &color_type, &interlace,\n                  NULL, NULL );\n\n    if ( error != FT_Err_Ok                   ||\n         (FT_Int)imgWidth  != metrics->width  ||\n         (FT_Int)imgHeight != metrics->height )\n      goto DestroyExit;\n\n    /* convert palette/gray image to rgb */\n    if ( color_type == PNG_COLOR_TYPE_PALETTE )\n      png_set_palette_to_rgb( png );\n\n    /* expand gray bit depth if needed */\n    if ( color_type == PNG_COLOR_TYPE_GRAY )\n    {\n#if PNG_LIBPNG_VER >= 10209\n      png_set_expand_gray_1_2_4_to_8( png );\n#else\n      png_set_gray_1_2_4_to_8( png );\n#endif\n    }\n\n    /* transform transparency to alpha */\n    if ( png_get_valid(png, info, PNG_INFO_tRNS ) )\n      png_set_tRNS_to_alpha( png );\n\n    if ( bitdepth == 16 )\n      png_set_strip_16( png );\n\n    if ( bitdepth < 8 )\n      png_set_packing( png );\n\n    /* convert grayscale to RGB */\n    if ( color_type == PNG_COLOR_TYPE_GRAY       ||\n         color_type == PNG_COLOR_TYPE_GRAY_ALPHA )\n      png_set_gray_to_rgb( png );\n\n    if ( interlace != PNG_INTERLACE_NONE )\n      png_set_interlace_handling( png );\n\n    png_set_filler( png, 0xFF, PNG_FILLER_AFTER );\n\n    /* recheck header after setting EXPAND options */\n    png_read_update_info(png, info );\n    png_get_IHDR( png, info,\n                  &imgWidth, &imgHeight,\n                  &bitdepth, &color_type, &interlace,\n                  NULL, NULL );\n\n    if ( bitdepth != 8                              ||\n        !( color_type == PNG_COLOR_TYPE_RGB       ||\n           color_type == PNG_COLOR_TYPE_RGB_ALPHA ) )\n    {\n      error = FT_THROW( Invalid_File_Format );\n      goto DestroyExit;\n    }\n\n    switch ( color_type )\n    {\n    default:\n      /* Shouldn't happen, but fall through. */\n\n    case PNG_COLOR_TYPE_RGB_ALPHA:\n      png_set_read_user_transform_fn( png, premultiply_data );\n      break;\n\n    case PNG_COLOR_TYPE_RGB:\n      /* Humm, this smells.  Carry on though. */\n      png_set_read_user_transform_fn( png, convert_bytes_to_data );\n      break;\n    }\n\n    if ( FT_NEW_ARRAY( rows, imgHeight ) )\n    {\n      error = FT_THROW( Out_Of_Memory );\n      goto DestroyExit;\n    }\n\n    for ( i = 0; i < (FT_Int)imgHeight; i++ )\n      rows[i] = map->buffer + ( y_offset + i ) * map->pitch + x_offset * 4;\n\n    png_read_image( png, rows );\n\n    FT_FREE( rows );\n\n    png_read_end( png, info );\n\n  DestroyExit:\n    png_destroy_read_struct( &png, &info, NULL );\n    FT_Stream_Close( &stream );\n\n  Exit:\n    return error;\n  }\n\n#endif /* FT_CONFIG_OPTION_USE_PNG */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/pngshim.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pngshim.h                                                              */\n/*                                                                         */\n/*    PNG Bitmap glyph support.                                            */\n/*                                                                         */\n/*  Copyright 2013 by Google, Inc.                                         */\n/*  Written by Stuart Gill and Behdad Esfahbod.                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PNGSHIM_H__\n#define __PNGSHIM_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"ttload.h\"\n\n\nFT_BEGIN_HEADER\n\n#ifdef FT_CONFIG_OPTION_USE_PNG\n\n  FT_LOCAL( FT_Error )\n  Load_SBit_Png( FT_Bitmap*       map,\n                 FT_Int           x_offset,\n                 FT_Int           y_offset,\n                 FT_Int           pix_bits,\n                 TT_SBit_Metrics  metrics,\n                 FT_Memory        memory,\n                 FT_Byte*         data,\n                 FT_UInt          png_len );\n\n#endif\n\nFT_END_HEADER\n\n#endif /* __PNGSHIM_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfdriver.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  sfdriver.c                                                             */\n/*                                                                         */\n/*    High-level SFNT driver interface (body).                             */\n/*                                                                         */\n/*  Copyright 1996-2007, 2009-2013 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/sfnt.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n\n#include \"sfdriver.h\"\n#include \"ttload.h\"\n#include \"sfobjs.h\"\n#include \"sfntpic.h\"\n\n#include \"sferrors.h\"\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n#include \"ttsbit.h\"\n#endif\n\n#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES\n#include \"ttpost.h\"\n#endif\n\n#ifdef TT_CONFIG_OPTION_BDF\n#include \"ttbdf.h\"\n#include \"../../include/freetype/internal/services/svbdf.h\"\n#endif\n\n#include \"ttcmap.h\"\n#include \"ttkern.h\"\n#include \"ttmtx.h\"\n\n#include \"../../include/freetype/internal/services/svgldict.h\"\n#include \"../../include/freetype/internal/services/svpostnm.h\"\n#include \"../../include/freetype/internal/services/svsfnt.h\"\n#include \"../../include/freetype/internal/services/svttcmap.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_sfdriver\n\n\n  /*\n   *  SFNT TABLE SERVICE\n   *\n   */\n\n  static void*\n  get_sfnt_table( TT_Face      face,\n                  FT_Sfnt_Tag  tag )\n  {\n    void*  table;\n\n\n    switch ( tag )\n    {\n    case ft_sfnt_head:\n      table = &face->header;\n      break;\n\n    case ft_sfnt_hhea:\n      table = &face->horizontal;\n      break;\n\n    case ft_sfnt_vhea:\n      table = face->vertical_info ? &face->vertical : 0;\n      break;\n\n    case ft_sfnt_os2:\n      table = face->os2.version == 0xFFFFU ? 0 : &face->os2;\n      break;\n\n    case ft_sfnt_post:\n      table = &face->postscript;\n      break;\n\n    case ft_sfnt_maxp:\n      table = &face->max_profile;\n      break;\n\n    case ft_sfnt_pclt:\n      table = face->pclt.Version ? &face->pclt : 0;\n      break;\n\n    default:\n      table = 0;\n    }\n\n    return table;\n  }\n\n\n  static FT_Error\n  sfnt_table_info( TT_Face    face,\n                   FT_UInt    idx,\n                   FT_ULong  *tag,\n                   FT_ULong  *offset,\n                   FT_ULong  *length )\n  {\n    if ( !offset || !length )\n      return FT_THROW( Invalid_Argument );\n\n    if ( !tag )\n      *length = face->num_tables;\n    else\n    {\n      if ( idx >= face->num_tables )\n        return FT_THROW( Table_Missing );\n\n      *tag    = face->dir_tables[idx].Tag;\n      *offset = face->dir_tables[idx].Offset;\n      *length = face->dir_tables[idx].Length;\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_DEFINE_SERVICE_SFNT_TABLEREC(\n    sfnt_service_sfnt_table,\n    (FT_SFNT_TableLoadFunc)tt_face_load_any,\n    (FT_SFNT_TableGetFunc) get_sfnt_table,\n    (FT_SFNT_TableInfoFunc)sfnt_table_info )\n\n\n#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES\n\n  /*\n   *  GLYPH DICT SERVICE\n   *\n   */\n\n  static FT_Error\n  sfnt_get_glyph_name( TT_Face     face,\n                       FT_UInt     glyph_index,\n                       FT_Pointer  buffer,\n                       FT_UInt     buffer_max )\n  {\n    FT_String*  gname;\n    FT_Error    error;\n\n\n    error = tt_face_get_ps_name( face, glyph_index, &gname );\n    if ( !error )\n      FT_STRCPYN( buffer, gname, buffer_max );\n\n    return error;\n  }\n\n\n  static FT_UInt\n  sfnt_get_name_index( TT_Face     face,\n                       FT_String*  glyph_name )\n  {\n    FT_Face  root = &face->root;\n\n    FT_UInt  i, max_gid = FT_UINT_MAX;\n\n\n    if ( root->num_glyphs < 0 )\n      return 0;\n    else if ( (FT_ULong)root->num_glyphs < FT_UINT_MAX )\n      max_gid = (FT_UInt)root->num_glyphs;\n    else\n      FT_TRACE0(( \"Ignore glyph names for invalid GID 0x%08x - 0x%08x\\n\",\n                  FT_UINT_MAX, root->num_glyphs ));\n\n    for ( i = 0; i < max_gid; i++ )\n    {\n      FT_String*  gname;\n      FT_Error    error = tt_face_get_ps_name( face, i, &gname );\n\n\n      if ( error )\n        continue;\n\n      if ( !ft_strcmp( glyph_name, gname ) )\n        return i;\n    }\n\n    return 0;\n  }\n\n\n  FT_DEFINE_SERVICE_GLYPHDICTREC(\n    sfnt_service_glyph_dict,\n    (FT_GlyphDict_GetNameFunc)  sfnt_get_glyph_name,\n    (FT_GlyphDict_NameIndexFunc)sfnt_get_name_index )\n\n\n#endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */\n\n\n  /*\n   *  POSTSCRIPT NAME SERVICE\n   *\n   */\n\n  static const char*\n  sfnt_get_ps_name( TT_Face  face )\n  {\n    FT_Int       n, found_win, found_apple;\n    const char*  result = NULL;\n\n\n    /* shouldn't happen, but just in case to avoid memory leaks */\n    if ( face->postscript_name )\n      return face->postscript_name;\n\n    /* scan the name table to see whether we have a Postscript name here, */\n    /* either in Macintosh or Windows platform encodings                  */\n    found_win   = -1;\n    found_apple = -1;\n\n    for ( n = 0; n < face->num_names; n++ )\n    {\n      TT_NameEntryRec*  name = face->name_table.names + n;\n\n\n      if ( name->nameID == 6 && name->stringLength > 0 )\n      {\n        if ( name->platformID == 3     &&\n             name->encodingID == 1     &&\n             name->languageID == 0x409 )\n          found_win = n;\n\n        if ( name->platformID == 1 &&\n             name->encodingID == 0 &&\n             name->languageID == 0 )\n          found_apple = n;\n      }\n    }\n\n    if ( found_win != -1 )\n    {\n      FT_Memory         memory = face->root.memory;\n      TT_NameEntryRec*  name   = face->name_table.names + found_win;\n      FT_UInt           len    = name->stringLength / 2;\n      FT_Error          error  = FT_Err_Ok;\n\n      FT_UNUSED( error );\n\n\n      if ( !FT_ALLOC( result, name->stringLength + 1 ) )\n      {\n        FT_Stream   stream = face->name_table.stream;\n        FT_String*  r      = (FT_String*)result;\n        FT_Byte*    p      = (FT_Byte*)name->string;\n\n\n        if ( FT_STREAM_SEEK( name->stringOffset ) ||\n             FT_FRAME_ENTER( name->stringLength ) )\n        {\n          FT_FREE( result );\n          name->stringLength = 0;\n          name->stringOffset = 0;\n          FT_FREE( name->string );\n\n          goto Exit;\n        }\n\n        p = (FT_Byte*)stream->cursor;\n\n        for ( ; len > 0; len--, p += 2 )\n        {\n          if ( p[0] == 0 && p[1] >= 32 && p[1] < 128 )\n            *r++ = p[1];\n        }\n        *r = '\\0';\n\n        FT_FRAME_EXIT();\n      }\n      goto Exit;\n    }\n\n    if ( found_apple != -1 )\n    {\n      FT_Memory         memory = face->root.memory;\n      TT_NameEntryRec*  name   = face->name_table.names + found_apple;\n      FT_UInt           len    = name->stringLength;\n      FT_Error          error  = FT_Err_Ok;\n\n      FT_UNUSED( error );\n\n\n      if ( !FT_ALLOC( result, len + 1 ) )\n      {\n        FT_Stream  stream = face->name_table.stream;\n\n\n        if ( FT_STREAM_SEEK( name->stringOffset ) ||\n             FT_STREAM_READ( result, len )        )\n        {\n          name->stringOffset = 0;\n          name->stringLength = 0;\n          FT_FREE( name->string );\n          FT_FREE( result );\n          goto Exit;\n        }\n        ((char*)result)[len] = '\\0';\n      }\n    }\n\n  Exit:\n    face->postscript_name = result;\n    return result;\n  }\n\n\n  FT_DEFINE_SERVICE_PSFONTNAMEREC(\n    sfnt_service_ps_name,\n    (FT_PsName_GetFunc)sfnt_get_ps_name )\n\n\n  /*\n   *  TT CMAP INFO\n   */\n  FT_DEFINE_SERVICE_TTCMAPSREC(\n    tt_service_get_cmap_info,\n    (TT_CMap_Info_GetFunc)tt_get_cmap_info )\n\n\n#ifdef TT_CONFIG_OPTION_BDF\n\n  static FT_Error\n  sfnt_get_charset_id( TT_Face       face,\n                       const char*  *acharset_encoding,\n                       const char*  *acharset_registry )\n  {\n    BDF_PropertyRec  encoding, registry;\n    FT_Error         error;\n\n\n    /* XXX: I don't know whether this is correct, since\n     *      tt_face_find_bdf_prop only returns something correct if we have\n     *      previously selected a size that is listed in the BDF table.\n     *      Should we change the BDF table format to include single offsets\n     *      for `CHARSET_REGISTRY' and `CHARSET_ENCODING'?\n     */\n    error = tt_face_find_bdf_prop( face, \"CHARSET_REGISTRY\", &registry );\n    if ( !error )\n    {\n      error = tt_face_find_bdf_prop( face, \"CHARSET_ENCODING\", &encoding );\n      if ( !error )\n      {\n        if ( registry.type == BDF_PROPERTY_TYPE_ATOM &&\n             encoding.type == BDF_PROPERTY_TYPE_ATOM )\n        {\n          *acharset_encoding = encoding.u.atom;\n          *acharset_registry = registry.u.atom;\n        }\n        else\n          error = FT_THROW( Invalid_Argument );\n      }\n    }\n\n    return error;\n  }\n\n\n  FT_DEFINE_SERVICE_BDFRec(\n    sfnt_service_bdf,\n    (FT_BDF_GetCharsetIdFunc)sfnt_get_charset_id,\n    (FT_BDF_GetPropertyFunc) tt_face_find_bdf_prop )\n\n\n#endif /* TT_CONFIG_OPTION_BDF */\n\n\n  /*\n   *  SERVICE LIST\n   */\n\n#if defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES && defined TT_CONFIG_OPTION_BDF\n  FT_DEFINE_SERVICEDESCREC5(\n    sfnt_services,\n    FT_SERVICE_ID_SFNT_TABLE,           &SFNT_SERVICE_SFNT_TABLE_GET,\n    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,\n    FT_SERVICE_ID_GLYPH_DICT,           &SFNT_SERVICE_GLYPH_DICT_GET,\n    FT_SERVICE_ID_BDF,                  &SFNT_SERVICE_BDF_GET,\n    FT_SERVICE_ID_TT_CMAP,              &TT_SERVICE_CMAP_INFO_GET )\n#elif defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES\n  FT_DEFINE_SERVICEDESCREC4(\n    sfnt_services,\n    FT_SERVICE_ID_SFNT_TABLE,           &SFNT_SERVICE_SFNT_TABLE_GET,\n    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,\n    FT_SERVICE_ID_GLYPH_DICT,           &SFNT_SERVICE_GLYPH_DICT_GET,\n    FT_SERVICE_ID_TT_CMAP,              &TT_SERVICE_CMAP_INFO_GET )\n#elif defined TT_CONFIG_OPTION_BDF\n  FT_DEFINE_SERVICEDESCREC4(\n    sfnt_services,\n    FT_SERVICE_ID_SFNT_TABLE,           &SFNT_SERVICE_SFNT_TABLE_GET,\n    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,\n    FT_SERVICE_ID_BDF,                  &SFNT_SERVICE_BDF_GET,\n    FT_SERVICE_ID_TT_CMAP,              &TT_SERVICE_CMAP_INFO_GET )\n#else\n  FT_DEFINE_SERVICEDESCREC3(\n    sfnt_services,\n    FT_SERVICE_ID_SFNT_TABLE,           &SFNT_SERVICE_SFNT_TABLE_GET,\n    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,\n    FT_SERVICE_ID_TT_CMAP,              &TT_SERVICE_CMAP_INFO_GET )\n#endif\n\n\n  FT_CALLBACK_DEF( FT_Module_Interface )\n  sfnt_get_interface( FT_Module    module,\n                      const char*  module_interface )\n  {\n    /* SFNT_SERVICES_GET derefers `library' in PIC mode */\n#ifdef FT_CONFIG_OPTION_PIC\n    FT_Library  library;\n\n\n    if ( !module )\n      return NULL;\n    library = module->library;\n    if ( !library )\n      return NULL;\n#else\n    FT_UNUSED( module );\n#endif\n\n    return ft_service_list_lookup( SFNT_SERVICES_GET, module_interface );\n  }\n\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n#define PUT_EMBEDDED_BITMAPS( a )  a\n#else\n#define PUT_EMBEDDED_BITMAPS( a )  NULL\n#endif\n\n#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES\n#define PUT_PS_NAMES( a )  a\n#else\n#define PUT_PS_NAMES( a )  NULL\n#endif\n\n  FT_DEFINE_SFNT_INTERFACE(\n    sfnt_interface,\n    tt_face_goto_table,\n\n    sfnt_init_face,\n    sfnt_load_face,\n    sfnt_done_face,\n    sfnt_get_interface,\n\n    tt_face_load_any,\n\n    tt_face_load_head,\n    tt_face_load_hhea,\n    tt_face_load_cmap,\n    tt_face_load_maxp,\n    tt_face_load_os2,\n    tt_face_load_post,\n\n    tt_face_load_name,\n    tt_face_free_name,\n\n    tt_face_load_kern,\n    tt_face_load_gasp,\n    tt_face_load_pclt,\n\n    /* see `ttload.h' */\n    PUT_EMBEDDED_BITMAPS( tt_face_load_bhed ),\n\n    PUT_EMBEDDED_BITMAPS( tt_face_load_sbit_image ),\n\n    /* see `ttpost.h' */\n    PUT_PS_NAMES( tt_face_get_ps_name   ),\n    PUT_PS_NAMES( tt_face_free_ps_names ),\n\n    /* since version 2.1.8 */\n    tt_face_get_kerning,\n\n    /* since version 2.2 */\n    tt_face_load_font_dir,\n    tt_face_load_hmtx,\n\n    /* see `ttsbit.h' and `sfnt.h' */\n    PUT_EMBEDDED_BITMAPS( tt_face_load_eblc ),\n    PUT_EMBEDDED_BITMAPS( tt_face_free_eblc ),\n\n    PUT_EMBEDDED_BITMAPS( tt_face_set_sbit_strike     ),\n    PUT_EMBEDDED_BITMAPS( tt_face_load_strike_metrics ),\n\n    tt_face_get_metrics\n  )\n\n\n  FT_DEFINE_MODULE(\n    sfnt_module_class,\n\n    0,  /* not a font driver or renderer */\n    sizeof ( FT_ModuleRec ),\n\n    \"sfnt\",     /* driver name                            */\n    0x10000L,   /* driver version 1.0                     */\n    0x20000L,   /* driver requires FreeType 2.0 or higher */\n\n    (const void*)&SFNT_INTERFACE_GET,  /* module specific interface */\n\n    (FT_Module_Constructor)0,\n    (FT_Module_Destructor) 0,\n    (FT_Module_Requester)  sfnt_get_interface )\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfdriver.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  sfdriver.h                                                             */\n/*                                                                         */\n/*    High-level SFNT driver interface (specification).                    */\n/*                                                                         */\n/*  Copyright 1996-2001 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SFDRIVER_H__\n#define __SFDRIVER_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/ftmodapi.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  FT_DECLARE_MODULE( sfnt_module_class )\n\n\nFT_END_HEADER\n\n#endif /* __SFDRIVER_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sferrors.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  sferrors.h                                                             */\n/*                                                                         */\n/*    SFNT error codes (specification only).                               */\n/*                                                                         */\n/*  Copyright 2001, 2004, 2012, 2013 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the SFNT error enumeration constants.     */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __SFERRORS_H__\n#define __SFERRORS_H__\n\n#include \"../../include/freetype/ftmoderr.h\"\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  SFNT_Err_\n#define FT_ERR_BASE    FT_Mod_Err_SFNT\n\n#include \"../../include/freetype/fterrors.h\"\n\n#endif /* __SFERRORS_H__ */\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfntpic.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  sfntpic.c                                                              */\n/*                                                                         */\n/*    The FreeType position independent code services for sfnt module.     */\n/*                                                                         */\n/*  Copyright 2009, 2010, 2012, 2013 by                                    */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/freetype.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"sfntpic.h\"\n#include \"sferrors.h\"\n\n\n#ifdef FT_CONFIG_OPTION_PIC\n\n  /* forward declaration of PIC init functions from sfdriver.c */\n  FT_Error\n  FT_Create_Class_sfnt_services( FT_Library           library,\n                                 FT_ServiceDescRec**  output_class );\n  void\n  FT_Destroy_Class_sfnt_services( FT_Library          library,\n                                  FT_ServiceDescRec*  clazz );\n  void\n  FT_Init_Class_sfnt_service_bdf( FT_Service_BDFRec*  clazz );\n  void\n  FT_Init_Class_sfnt_interface( FT_Library       library,\n                                SFNT_Interface*  clazz );\n  void\n  FT_Init_Class_sfnt_service_glyph_dict(\n    FT_Library                library,\n    FT_Service_GlyphDictRec*  clazz );\n  void\n  FT_Init_Class_sfnt_service_ps_name(\n    FT_Library                 library,\n    FT_Service_PsFontNameRec*  clazz );\n  void\n  FT_Init_Class_tt_service_get_cmap_info(\n    FT_Library              library,\n    FT_Service_TTCMapsRec*  clazz );\n  void\n  FT_Init_Class_sfnt_service_sfnt_table(\n    FT_Service_SFNT_TableRec*  clazz );\n\n\n  /* forward declaration of PIC init functions from ttcmap.c */\n  FT_Error\n  FT_Create_Class_tt_cmap_classes( FT_Library       library,\n                                   TT_CMap_Class**  output_class );\n  void\n  FT_Destroy_Class_tt_cmap_classes( FT_Library      library,\n                                    TT_CMap_Class*  clazz );\n\n\n  void\n  sfnt_module_class_pic_free( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Memory          memory        = library->memory;\n\n\n    if ( pic_container->sfnt )\n    {\n      sfntModulePIC*  container = (sfntModulePIC*)pic_container->sfnt;\n\n\n      if ( container->sfnt_services )\n        FT_Destroy_Class_sfnt_services( library,\n                                        container->sfnt_services );\n      container->sfnt_services = NULL;\n\n      if ( container->tt_cmap_classes )\n        FT_Destroy_Class_tt_cmap_classes( library,\n                                          container->tt_cmap_classes );\n      container->tt_cmap_classes = NULL;\n\n      FT_FREE( container );\n      pic_container->sfnt = NULL;\n    }\n  }\n\n\n  FT_Error\n  sfnt_module_class_pic_init( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Error           error         = FT_Err_Ok;\n    sfntModulePIC*     container     = NULL;\n    FT_Memory          memory        = library->memory;\n\n\n    /* allocate pointer, clear and set global container pointer */\n    if ( FT_ALLOC( container, sizeof ( *container ) ) )\n      return error;\n    FT_MEM_SET( container, 0, sizeof ( *container ) );\n    pic_container->sfnt = container;\n\n    /* initialize pointer table -                       */\n    /* this is how the module usually expects this data */\n    error = FT_Create_Class_sfnt_services( library,\n                                           &container->sfnt_services );\n    if ( error )\n      goto Exit;\n\n    error = FT_Create_Class_tt_cmap_classes( library,\n                                             &container->tt_cmap_classes );\n    if ( error )\n      goto Exit;\n\n    FT_Init_Class_sfnt_service_glyph_dict(\n      library, &container->sfnt_service_glyph_dict );\n    FT_Init_Class_sfnt_service_ps_name(\n      library, &container->sfnt_service_ps_name );\n    FT_Init_Class_tt_service_get_cmap_info(\n      library, &container->tt_service_get_cmap_info );\n    FT_Init_Class_sfnt_service_sfnt_table(\n      &container->sfnt_service_sfnt_table );\n#ifdef TT_CONFIG_OPTION_BDF\n    FT_Init_Class_sfnt_service_bdf( &container->sfnt_service_bdf );\n#endif\n    FT_Init_Class_sfnt_interface( library, &container->sfnt_interface );\n\n  Exit:\n    if ( error )\n      sfnt_module_class_pic_free( library );\n    return error;\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfntpic.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  sfntpic.h                                                              */\n/*                                                                         */\n/*    The FreeType position independent code services for sfnt module.     */\n/*                                                                         */\n/*  Copyright 2009, 2012 by                                                */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SFNTPIC_H__\n#define __SFNTPIC_H__\n\n\nFT_BEGIN_HEADER\n\n#include \"../../include/freetype/internal/ftpic.h\"\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define SFNT_SERVICES_GET            sfnt_services\n#define SFNT_SERVICE_GLYPH_DICT_GET  sfnt_service_glyph_dict\n#define SFNT_SERVICE_PS_NAME_GET     sfnt_service_ps_name\n#define TT_SERVICE_CMAP_INFO_GET     tt_service_get_cmap_info\n#define SFNT_SERVICES_GET            sfnt_services\n#define TT_CMAP_CLASSES_GET          tt_cmap_classes\n#define SFNT_SERVICE_SFNT_TABLE_GET  sfnt_service_sfnt_table\n#define SFNT_SERVICE_BDF_GET         sfnt_service_bdf\n#define SFNT_INTERFACE_GET           sfnt_interface\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n  /* some include files required for members of sfntModulePIC */\n#include \"../../include/freetype/internal/services/svgldict.h\"\n#include \"../../include/freetype/internal/services/svpostnm.h\"\n#include \"../../include/freetype/internal/services/svsfnt.h\"\n#include \"../../include/freetype/internal/services/svttcmap.h\"\n\n#ifdef TT_CONFIG_OPTION_BDF\n#include \"ttbdf.h\"\n#include \"../../include/freetype/internal/services/svbdf.h\"\n#endif\n\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/internal/sfnt.h\"\n#include \"ttcmap.h\"\n\n\n  typedef struct  sfntModulePIC_\n  {\n    FT_ServiceDescRec*        sfnt_services;\n    FT_Service_GlyphDictRec   sfnt_service_glyph_dict;\n    FT_Service_PsFontNameRec  sfnt_service_ps_name;\n    FT_Service_TTCMapsRec     tt_service_get_cmap_info;\n    TT_CMap_Class*            tt_cmap_classes;\n    FT_Service_SFNT_TableRec  sfnt_service_sfnt_table;\n#ifdef TT_CONFIG_OPTION_BDF\n    FT_Service_BDFRec         sfnt_service_bdf;\n#endif\n    SFNT_Interface            sfnt_interface;\n\n  } sfntModulePIC;\n\n\n#define GET_PIC( lib )                                      \\\n          ( (sfntModulePIC*)( (lib)->pic_container.sfnt ) )\n\n#define SFNT_SERVICES_GET                       \\\n          ( GET_PIC( library )->sfnt_services )\n#define SFNT_SERVICE_GLYPH_DICT_GET                       \\\n          ( GET_PIC( library )->sfnt_service_glyph_dict )\n#define SFNT_SERVICE_PS_NAME_GET                       \\\n          ( GET_PIC( library )->sfnt_service_ps_name )\n#define TT_SERVICE_CMAP_INFO_GET                           \\\n          ( GET_PIC( library )->tt_service_get_cmap_info )\n#define SFNT_SERVICES_GET                       \\\n          ( GET_PIC( library )->sfnt_services )\n#define TT_CMAP_CLASSES_GET                       \\\n          ( GET_PIC( library )->tt_cmap_classes )\n#define SFNT_SERVICE_SFNT_TABLE_GET                       \\\n          ( GET_PIC( library )->sfnt_service_sfnt_table )\n#define SFNT_SERVICE_BDF_GET                       \\\n          ( GET_PIC( library )->sfnt_service_bdf )\n#define SFNT_INTERFACE_GET                       \\\n          ( GET_PIC( library )->sfnt_interface )\n\n\n  /* see sfntpic.c for the implementation */\n  void\n  sfnt_module_class_pic_free( FT_Library  library );\n\n  FT_Error\n  sfnt_module_class_pic_init( FT_Library  library );\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\nFT_END_HEADER\n\n#endif /* __SFNTPIC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfobjs.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  sfobjs.c                                                               */\n/*                                                                         */\n/*    SFNT object management (base).                                       */\n/*                                                                         */\n/*  Copyright 1996-2008, 2010-2013 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"sfobjs.h\"\n#include \"ttload.h\"\n#include \"ttcmap.h\"\n#include \"ttkern.h\"\n#include \"../../include/freetype/internal/sfnt.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/ttnameid.h\"\n#include \"../../include/freetype/tttags.h\"\n#include \"../../include/freetype/internal/services/svpscmap.h\"\n#include \"../../include/freetype/ftsnames.h\"\n#include \"sferrors.h\"\n\n#ifdef TT_CONFIG_OPTION_BDF\n#include \"ttbdf.h\"\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_sfobjs\n\n\n\n  /* convert a UTF-16 name entry to ASCII */\n  static FT_String*\n  tt_name_entry_ascii_from_utf16( TT_NameEntry  entry,\n                                  FT_Memory     memory )\n  {\n    FT_String*  string = NULL;\n    FT_UInt     len, code, n;\n    FT_Byte*    read   = (FT_Byte*)entry->string;\n    FT_Error    error;\n\n\n    len = (FT_UInt)entry->stringLength / 2;\n\n    if ( FT_NEW_ARRAY( string, len + 1 ) )\n      return NULL;\n\n    for ( n = 0; n < len; n++ )\n    {\n      code = FT_NEXT_USHORT( read );\n\n      if ( code == 0 )\n        break;\n\n      if (code > 255) /*Johnson 2010-10-09, #TESTDOC:0000042_QUT20005_5.pdf.*/\n\t\t  code = code>>8&0x00ff;\n\t  if ( code < 32 || code > 127 )\n        code = '?';\n\n      string[n] = (char)code;\n    }\n\n    string[n] = 0;\n\n    return string;\n  }\n\n\n  /* convert an Apple Roman or symbol name entry to ASCII */\n  static FT_String*\n  tt_name_entry_ascii_from_other( TT_NameEntry  entry,\n                                  FT_Memory     memory )\n  {\n    FT_String*  string = NULL;\n    FT_UInt     len, code, n;\n    FT_Byte*    read   = (FT_Byte*)entry->string;\n    FT_Error    error;\n\n\n    len = (FT_UInt)entry->stringLength;\n\n    if ( FT_NEW_ARRAY( string, len + 1 ) )\n      return NULL;\n\n    for ( n = 0; n < len; n++ )\n    {\n      code = *read++;\n\n      if ( code == 0 )\n        break;\n\n      if ( code < 32 || code > 127 )\n        code = '?';\n\n      string[n] = (char)code;\n    }\n\n    string[n] = 0;\n\n    return string;\n  }\n\n\n  typedef FT_String*  (*TT_NameEntry_ConvertFunc)( TT_NameEntry  entry,\n                                                   FT_Memory     memory );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_get_name                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Returns a given ENGLISH name record in ASCII.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the source face object.                      */\n  /*                                                                       */\n  /*    nameid :: The name id of the name record to return.                */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    name   :: The address of a string pointer.  NULL if no name is     */\n  /*              present.                                                 */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  static FT_Error\n  tt_face_get_name( TT_Face      face,\n                    FT_UShort    nameid,\n                    FT_String**  name )\n  {\n    FT_Memory         memory = face->root.memory;\n    FT_Error          error  = FT_Err_Ok;\n    FT_String*        result = NULL;\n    FT_UShort         n;\n    TT_NameEntryRec*  rec;\n    FT_Int            found_apple         = -1;\n    FT_Int            found_apple_roman   = -1;\n    FT_Int            found_apple_english = -1;\n    FT_Int            found_win           = -1;\n    FT_Int            found_unicode       = -1;\n\n    FT_Bool           is_english = 0;\n\n    TT_NameEntry_ConvertFunc  convert;\n\n\n    FT_ASSERT( name );\n\n    rec = face->name_table.names;\n    for ( n = 0; n < face->num_names; n++, rec++ )\n    {\n      /* According to the OpenType 1.3 specification, only Microsoft or  */\n      /* Apple platform IDs might be used in the `name' table.  The      */\n      /* `Unicode' platform is reserved for the `cmap' table, and the    */\n      /* `ISO' one is deprecated.                                        */\n      /*                                                                 */\n      /* However, the Apple TrueType specification doesn't say the same  */\n      /* thing and goes to suggest that all Unicode `name' table entries */\n      /* should be coded in UTF-16 (in big-endian format I suppose).     */\n      /*                                                                 */\n      if ( rec->nameID == nameid && rec->stringLength > 0 )\n      {\n        switch ( rec->platformID )\n        {\n        case TT_PLATFORM_APPLE_UNICODE:\n        case TT_PLATFORM_ISO:\n          /* there is `languageID' to check there.  We should use this */\n          /* field only as a last solution when nothing else is        */\n          /* available.                                                */\n          /*                                                           */\n          found_unicode = n;\n          break;\n\n        case TT_PLATFORM_MACINTOSH:\n          /* This is a bit special because some fonts will use either    */\n          /* an English language id, or a Roman encoding id, to indicate */\n          /* the English version of its font name.                       */\n          /*                                                             */\n          if ( rec->languageID == TT_MAC_LANGID_ENGLISH )\n            found_apple_english = n;\n          else if ( rec->encodingID == TT_MAC_ID_ROMAN )\n            found_apple_roman = n;\n          break;\n\n        case TT_PLATFORM_MICROSOFT:\n          /* we only take a non-English name when there is nothing */\n          /* else available in the font                            */\n          /*                                                       */\n          if ( found_win == -1 || ( rec->languageID & 0x3FF ) == 0x009 )\n          {\n            switch ( rec->encodingID )\n            {\n            case TT_MS_ID_SYMBOL_CS:\n            case TT_MS_ID_UNICODE_CS:\n            case TT_MS_ID_UCS_4:\n              is_english = FT_BOOL( ( rec->languageID & 0x3FF ) == 0x009 );\n              found_win  = n;\n              break;\n\n            default:\n              ;\n            }\n          }\n          break;\n\n        default:\n          ;\n        }\n      }\n    }\n\n    found_apple = found_apple_roman;\n    if ( found_apple_english >= 0 )\n      found_apple = found_apple_english;\n\n    /* some fonts contain invalid Unicode or Macintosh formatted entries; */\n    /* we will thus favor names encoded in Windows formats if available   */\n    /* (provided it is an English name)                                   */\n    /*                                                                    */\n    convert = NULL;\n    if ( found_win >= 0 && !( found_apple >= 0 && !is_english ) )\n    {\n      rec = face->name_table.names + found_win;\n      switch ( rec->encodingID )\n      {\n        /* all Unicode strings are encoded using UTF-16BE */\n      case TT_MS_ID_UNICODE_CS:\n      case TT_MS_ID_SYMBOL_CS:\n        convert = tt_name_entry_ascii_from_utf16;\n        break;\n\n      case TT_MS_ID_UCS_4:\n        /* Apparently, if this value is found in a name table entry, it is */\n        /* documented as `full Unicode repertoire'.  Experience with the   */\n        /* MsGothic font shipped with Windows Vista shows that this really */\n        /* means UTF-16 encoded names (UCS-4 values are only used within   */\n        /* charmaps).                                                      */\n        convert = tt_name_entry_ascii_from_utf16;\n        break;\n\n      default:\n        ;\n      }\n    }\n    else if ( found_apple >= 0 )\n    {\n      rec     = face->name_table.names + found_apple;\n      convert = tt_name_entry_ascii_from_other;\n    }\n    else if ( found_unicode >= 0 )\n    {\n      rec     = face->name_table.names + found_unicode;\n      convert = tt_name_entry_ascii_from_utf16;\n    }\n\n    if ( rec && convert )\n    {\n      if ( rec->string == NULL )\n      {\n        FT_Stream  stream = face->name_table.stream;\n\n\n        if ( FT_QNEW_ARRAY ( rec->string, rec->stringLength ) ||\n             FT_STREAM_SEEK( rec->stringOffset )              ||\n             FT_STREAM_READ( rec->string, rec->stringLength ) )\n        {\n          FT_FREE( rec->string );\n          rec->stringLength = 0;\n          result            = NULL;\n          goto Exit;\n        }\n      }\n\n      result = convert( rec, memory );\n    }\n\n  Exit:\n    *name = result;\n    return error;\n  }\n\n\n  static FT_Encoding\n  sfnt_find_encoding( int  platform_id,\n                      int  encoding_id )\n  {\n    typedef struct  TEncoding_\n    {\n      int          platform_id;\n      int          encoding_id;\n      FT_Encoding  encoding;\n\n    } TEncoding;\n\n    static\n    const TEncoding  tt_encodings[] =\n    {\n      { TT_PLATFORM_ISO,           -1,                  FT_ENCODING_UNICODE },\n\n      { TT_PLATFORM_APPLE_UNICODE, -1,                  FT_ENCODING_UNICODE },\n\n      { TT_PLATFORM_MACINTOSH,     TT_MAC_ID_ROMAN,     FT_ENCODING_APPLE_ROMAN },\n\n      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_SYMBOL_CS,  FT_ENCODING_MS_SYMBOL },\n      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_UCS_4,      FT_ENCODING_UNICODE },\n      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_UNICODE_CS, FT_ENCODING_UNICODE },\n      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_SJIS,       FT_ENCODING_SJIS },\n      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_GB2312,     FT_ENCODING_GB2312 },\n      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_BIG_5,      FT_ENCODING_BIG5 },\n      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_WANSUNG,    FT_ENCODING_WANSUNG },\n      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_JOHAB,      FT_ENCODING_JOHAB }\n    };\n\n    const TEncoding  *cur, *limit;\n\n\n    cur   = tt_encodings;\n    limit = cur + sizeof ( tt_encodings ) / sizeof ( tt_encodings[0] );\n\n    for ( ; cur < limit; cur++ )\n    {\n      if ( cur->platform_id == platform_id )\n      {\n        if ( cur->encoding_id == encoding_id ||\n             cur->encoding_id == -1          )\n          return cur->encoding;\n      }\n    }\n\n    return FT_ENCODING_NONE;\n  }\n\n\n  /* Fill in face->ttc_header.  If the font is not a TTC, it is */\n  /* synthesized into a TTC with one offset table.              */\n  static FT_Error\n  sfnt_open_font( FT_Stream  stream,\n                  TT_Face    face )\n  {\n    FT_Memory  memory = stream->memory;\n    FT_Error   error;\n    FT_ULong   tag, offset;\n\n    static const FT_Frame_Field  ttc_header_fields[] =\n    {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  TTC_HeaderRec\n\n      FT_FRAME_START( 8 ),\n        FT_FRAME_LONG( version ),\n        FT_FRAME_LONG( count   ),  /* this is ULong in the specs */\n      FT_FRAME_END\n    };\n\n\n    face->ttc_header.tag     = 0;\n    face->ttc_header.version = 0;\n    face->ttc_header.count   = 0;\n\n    offset = FT_STREAM_POS();\n\n    if ( FT_READ_ULONG( tag ) )\n      return error;\n\n    if ( tag != 0x00010000UL &&\n         tag != TTAG_ttcf    &&\n         tag != TTAG_OTTO    &&\n         tag != TTAG_true    &&\n         tag != TTAG_typ1    &&\n         tag != 0x00020000UL )\n    {\n      FT_TRACE2(( \"  not a font using the SFNT container format\\n\" ));\n      return FT_THROW( Unknown_File_Format );\n    }\n\n    face->ttc_header.tag = TTAG_ttcf;\n\n    if ( tag == TTAG_ttcf )\n    {\n      FT_Int  n;\n\n\n      FT_TRACE3(( \"sfnt_open_font: file is a collection\\n\" ));\n\n      if ( FT_STREAM_READ_FIELDS( ttc_header_fields, &face->ttc_header ) )\n        return error;\n\n      if ( face->ttc_header.count == 0 )\n        return FT_THROW( Invalid_Table );\n\n      /* a rough size estimate: let's conservatively assume that there   */\n      /* is just a single table info in each subfont header (12 + 16*1 = */\n      /* 28 bytes), thus we have (at least) `12 + 4*count' bytes for the */\n      /* size of the TTC header plus `28*count' bytes for all subfont    */\n      /* headers                                                         */\n      if ( (FT_ULong)face->ttc_header.count > stream->size / ( 28 + 4 ) )\n        return FT_THROW( Array_Too_Large );\n\n      /* now read the offsets of each font in the file */\n      if ( FT_NEW_ARRAY( face->ttc_header.offsets, face->ttc_header.count ) )\n        return error;\n\n      if ( FT_FRAME_ENTER( face->ttc_header.count * 4L ) )\n        return error;\n\n      for ( n = 0; n < face->ttc_header.count; n++ )\n        face->ttc_header.offsets[n] = FT_GET_ULONG();\n\n      FT_FRAME_EXIT();\n    }\n    else\n    {\n      FT_TRACE3(( \"sfnt_open_font: synthesize TTC\\n\" ));\n\n      face->ttc_header.version = 1 << 16;\n      face->ttc_header.count   = 1;\n\n      if ( FT_NEW( face->ttc_header.offsets ) )\n        return error;\n\n      face->ttc_header.offsets[0] = offset;\n    }\n\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  sfnt_init_face( FT_Stream      stream,\n                  TT_Face        face,\n                  FT_Int         face_index,\n                  FT_Int         num_params,\n                  FT_Parameter*  params )\n  {\n    FT_Error        error;\n    FT_Library      library = face->root.driver->root.library;\n    SFNT_Service    sfnt;\n\n\n    /* for now, parameters are unused */\n    FT_UNUSED( num_params );\n    FT_UNUSED( params );\n\n\n    sfnt = (SFNT_Service)face->sfnt;\n    if ( !sfnt )\n    {\n      sfnt = (SFNT_Service)FT_Get_Module_Interface( library, \"sfnt\" );\n      if ( !sfnt )\n      {\n        FT_ERROR(( \"sfnt_init_face: cannot access `sfnt' module\\n\" ));\n        return FT_THROW( Missing_Module );\n      }\n\n      face->sfnt       = sfnt;\n      face->goto_table = sfnt->goto_table;\n    }\n\n    FT_FACE_FIND_GLOBAL_SERVICE( face, face->psnames, POSTSCRIPT_CMAPS );\n\n    FT_TRACE2(( \"SFNT driver\\n\" ));\n\n    error = sfnt_open_font( stream, face );\n    if ( error )\n      return error;\n\n    FT_TRACE2(( \"sfnt_init_face: %08p, %ld\\n\", face, face_index ));\n\n    if ( face_index < 0 )\n      face_index = 0;\n\n    if ( face_index >= face->ttc_header.count )\n      return FT_THROW( Invalid_Argument );\n\n    if ( FT_STREAM_SEEK( face->ttc_header.offsets[face_index] ) )\n      return error;\n\n    /* check that we have a valid TrueType file */\n    error = sfnt->load_font_dir( face, stream );\n    if ( error )\n      return error;\n\n    face->root.num_faces  = face->ttc_header.count;\n    face->root.face_index = face_index;\n\n    return error;\n  }\n\n\n#define LOAD_( x )                                          \\\n  do {                                                      \\\n    FT_TRACE2(( \"`\" #x \"' \" ));                             \\\n    FT_TRACE3(( \"-->\\n\" ));                                 \\\n                                                            \\\n    error = sfnt->load_ ## x( face, stream );               \\\n                                                            \\\n    FT_TRACE2(( \"%s\\n\", ( !error )                          \\\n                        ? \"loaded\"                          \\\n                        : FT_ERR_EQ( error, Table_Missing ) \\\n                          ? \"missing\"                       \\\n                          : \"failed to load\" ));            \\\n    FT_TRACE3(( \"\\n\" ));                                    \\\n  } while ( 0 )\n\n#define LOADM_( x, vertical )                               \\\n  do {                                                      \\\n    FT_TRACE2(( \"`%s\" #x \"' \",                              \\\n                vertical ? \"vertical \" : \"\" ));             \\\n    FT_TRACE3(( \"-->\\n\" ));                                 \\\n                                                            \\\n    error = sfnt->load_ ## x( face, stream, vertical );     \\\n                                                            \\\n    FT_TRACE2(( \"%s\\n\", ( !error )                          \\\n                        ? \"loaded\"                          \\\n                        : FT_ERR_EQ( error, Table_Missing ) \\\n                          ? \"missing\"                       \\\n                          : \"failed to load\" ));            \\\n    FT_TRACE3(( \"\\n\" ));                                    \\\n  } while ( 0 )\n\n#define GET_NAME( id, field )                                   \\\n  do {                                                          \\\n    error = tt_face_get_name( face, TT_NAME_ID_ ## id, field ); \\\n    if ( error )                                                \\\n      goto Exit;                                                \\\n  } while ( 0 )\n\n\n  FT_LOCAL_DEF( FT_Error )\n  sfnt_load_face( FT_Stream      stream,\n                  TT_Face        face,\n                  FT_Int         face_index,\n                  FT_Int         num_params,\n                  FT_Parameter*  params )\n  {\n    FT_Error      error;\n#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES\n    FT_Error      psnames_error;\n#endif\n    FT_Bool       has_outline;\n    FT_Bool       is_apple_sbit;\n    FT_Bool       ignore_preferred_family    = FALSE;\n    FT_Bool       ignore_preferred_subfamily = FALSE;\n\n    SFNT_Service  sfnt = (SFNT_Service)face->sfnt;\n\n    FT_UNUSED( face_index );\n\n\n    /* Check parameters */\n\n    {\n      FT_Int  i;\n\n\n      for ( i = 0; i < num_params; i++ )\n      {\n        if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY )\n          ignore_preferred_family = TRUE;\n        else if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY )\n          ignore_preferred_subfamily = TRUE;\n      }\n    }\n\n    /* Load tables */\n\n    /* We now support two SFNT-based bitmapped font formats.  They */\n    /* are recognized easily as they do not include a `glyf'       */\n    /* table.                                                      */\n    /*                                                             */\n    /* The first format comes from Apple, and uses a table named   */\n    /* `bhed' instead of `head' to store the font header (using    */\n    /* the same format).  It also doesn't include horizontal and   */\n    /* vertical metrics tables (i.e. `hhea' and `vhea' tables are  */\n    /* missing).                                                   */\n    /*                                                             */\n    /* The other format comes from Microsoft, and is used with     */\n    /* WinCE/PocketPC.  It looks like a standard TTF, except that  */\n    /* it doesn't contain outlines.                                */\n    /*                                                             */\n\n    FT_TRACE2(( \"sfnt_load_face: %08p\\n\\n\", face ));\n\n    /* do we have outlines in there? */\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    has_outline = FT_BOOL( face->root.internal->incremental_interface != 0 ||\n                           tt_face_lookup_table( face, TTAG_glyf )    != 0 ||\n                           tt_face_lookup_table( face, TTAG_CFF )     != 0 );\n#else\n    has_outline = FT_BOOL( tt_face_lookup_table( face, TTAG_glyf ) != 0 ||\n                           tt_face_lookup_table( face, TTAG_CFF )  != 0 );\n#endif\n\n    is_apple_sbit = 0;\n\n    /* if this font doesn't contain outlines, we try to load */\n    /* a `bhed' table                                        */\n    if ( !has_outline && sfnt->load_bhed )\n    {\n      LOAD_( bhed );\n      is_apple_sbit = FT_BOOL( !error );\n    }\n\n    /* load the font header (`head' table) if this isn't an Apple */\n    /* sbit font file                                             */\n    if ( !is_apple_sbit )\n    {\n      LOAD_( head );\n      if ( error )\n        goto Exit;\n    }\n\n    if ( face->header.Units_Per_EM == 0 )\n    {\n      error = FT_THROW( Invalid_Table );\n\n      goto Exit;\n    }\n\n    /* the following tables are often not present in embedded TrueType */\n    /* fonts within PDF documents, so don't check for them.            */\n    LOAD_( maxp );\n    LOAD_( cmap );\n\n    /* the following tables are optional in PCL fonts -- */\n    /* don't check for errors                            */\n    LOAD_( name );\n    LOAD_( post );\n\n#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES\n    psnames_error = error;\n#endif\n\n    /* do not load the metrics headers and tables if this is an Apple */\n    /* sbit font file                                                 */\n    if ( !is_apple_sbit )\n    {\n      /* load the `hhea' and `hmtx' tables */\n      LOADM_( hhea, 0 );\n      if ( !error )\n      {\n        LOADM_( hmtx, 0 );\n        if ( FT_ERR_EQ( error, Table_Missing ) )\n        {\n          error = FT_THROW( Hmtx_Table_Missing );\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n          /* If this is an incrementally loaded font and there are */\n          /* overriding metrics, tolerate a missing `hmtx' table.  */\n          if ( face->root.internal->incremental_interface          &&\n               face->root.internal->incremental_interface->funcs->\n                 get_glyph_metrics                                 )\n          {\n            face->horizontal.number_Of_HMetrics = 0;\n            error                               = FT_Err_Ok;\n          }\n#endif\n        }\n      }\n      else if ( FT_ERR_EQ( error, Table_Missing ) )\n      {\n        /* No `hhea' table necessary for SFNT Mac fonts. */\n        if ( face->format_tag == TTAG_true )\n        {\n          FT_TRACE2(( \"This is an SFNT Mac font.\\n\" ));\n\n          has_outline = 0;\n          error       = FT_Err_Ok;\n        }\n        else\n        {\n          error = FT_THROW( Horiz_Header_Missing );\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n          /* If this is an incrementally loaded font and there are */\n          /* overriding metrics, tolerate a missing `hhea' table.  */\n          if ( face->root.internal->incremental_interface          &&\n               face->root.internal->incremental_interface->funcs->\n                 get_glyph_metrics                                 )\n          {\n            face->horizontal.number_Of_HMetrics = 0;\n            error                               = FT_Err_Ok;\n          }\n#endif\n\n        }\n      }\n\n      if ( error )\n       goto Exit;\n\n      /* try to load the `vhea' and `vmtx' tables */\n      LOADM_( hhea, 1 );\n      if ( !error )\n      {\n        LOADM_( hmtx, 1 );\n        if ( !error )\n          face->vertical_info = 1;\n      }\n\n      if ( error && FT_ERR_NEQ( error, Table_Missing ) )\n        goto Exit;\n\n      LOAD_( os2 );\n      if ( error )\n      {\n        /* we treat the table as missing if there are any errors */\n        face->os2.version = 0xFFFFU;\n      }\n    }\n\n    /* the optional tables */\n\n    /* embedded bitmap support */\n    if ( sfnt->load_eblc )\n    {\n      LOAD_( eblc );\n      if ( error )\n      {\n        /* a font which contains neither bitmaps nor outlines is */\n        /* still valid (although rather useless in most cases);  */\n        /* however, you can find such stripped fonts in PDFs     */\n        if ( FT_ERR_EQ( error, Table_Missing ) )\n          error = FT_Err_Ok;\n        else\n          goto Exit;\n      }\n    }\n\n    LOAD_( pclt );\n    if ( error )\n    {\n      if ( FT_ERR_NEQ( error, Table_Missing ) )\n        goto Exit;\n\n      face->pclt.Version = 0;\n    }\n\n    /* consider the kerning and gasp tables as optional */\n    LOAD_( gasp );\n    LOAD_( kern );\n\n    face->root.num_glyphs = face->max_profile.numGlyphs;\n\n    /* Bit 8 of the `fsSelection' field in the `OS/2' table denotes  */\n    /* a WWS-only font face.  `WWS' stands for `weight', width', and */\n    /* `slope', a term used by Microsoft's Windows Presentation      */\n    /* Foundation (WPF).  This flag has been introduced in version   */\n    /* 1.5 of the OpenType specification (May 2008).                 */\n\n    face->root.family_name = NULL;\n    face->root.style_name  = NULL;\n    if ( face->os2.version != 0xFFFFU && face->os2.fsSelection & 256 )\n    {\n      if ( !ignore_preferred_family )\n        GET_NAME( PREFERRED_FAMILY, &face->root.family_name );\n      if ( !face->root.family_name )\n        GET_NAME( FONT_FAMILY, &face->root.family_name );\n\n      if ( !ignore_preferred_subfamily )\n        GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name );\n      if ( !face->root.style_name )\n        GET_NAME( FONT_SUBFAMILY, &face->root.style_name );\n    }\n    else\n    {\n      GET_NAME( WWS_FAMILY, &face->root.family_name );\n      if ( !face->root.family_name && !ignore_preferred_family )\n        GET_NAME( PREFERRED_FAMILY, &face->root.family_name );\n      if ( !face->root.family_name )\n        GET_NAME( FONT_FAMILY, &face->root.family_name );\n\n      GET_NAME( WWS_SUBFAMILY, &face->root.style_name );\n      if ( !face->root.style_name && !ignore_preferred_subfamily )\n        GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name );\n      if ( !face->root.style_name )\n        GET_NAME( FONT_SUBFAMILY, &face->root.style_name );\n    }\n\n    /* now set up root fields */\n    {\n      FT_Face  root  = &face->root;\n      FT_Long  flags = root->face_flags;\n\n\n      /*********************************************************************/\n      /*                                                                   */\n      /* Compute face flags.                                               */\n      /*                                                                   */\n      if ( has_outline == TRUE )\n        flags |= FT_FACE_FLAG_SCALABLE;   /* scalable outlines */\n\n      /* The sfnt driver only supports bitmap fonts natively, thus we */\n      /* don't set FT_FACE_FLAG_HINTER.                               */\n      flags |= FT_FACE_FLAG_SFNT       |  /* SFNT file format  */\n               FT_FACE_FLAG_HORIZONTAL;   /* horizontal data   */\n\n#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES\n      if ( !psnames_error                             &&\n           face->postscript.FormatType != 0x00030000L )\n        flags |= FT_FACE_FLAG_GLYPH_NAMES;\n#endif\n\n      /* fixed width font? */\n      if ( face->postscript.isFixedPitch )\n        flags |= FT_FACE_FLAG_FIXED_WIDTH;\n\n      /* vertical information? */\n      if ( face->vertical_info )\n        flags |= FT_FACE_FLAG_VERTICAL;\n\n      /* kerning available ? */\n      if ( TT_FACE_HAS_KERNING( face ) )\n        flags |= FT_FACE_FLAG_KERNING;\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n      /* Don't bother to load the tables unless somebody asks for them. */\n      /* No need to do work which will (probably) not be used.          */\n      if ( tt_face_lookup_table( face, TTAG_glyf ) != 0 &&\n           tt_face_lookup_table( face, TTAG_fvar ) != 0 &&\n           tt_face_lookup_table( face, TTAG_gvar ) != 0 )\n        flags |= FT_FACE_FLAG_MULTIPLE_MASTERS;\n#endif\n\n      root->face_flags = flags;\n\n      /*********************************************************************/\n      /*                                                                   */\n      /* Compute style flags.                                              */\n      /*                                                                   */\n\n      flags = 0;\n      if ( has_outline == TRUE && face->os2.version != 0xFFFFU )\n      {\n        /* We have an OS/2 table; use the `fsSelection' field.  Bit 9 */\n        /* indicates an oblique font face.  This flag has been        */\n        /* introduced in version 1.5 of the OpenType specification.   */\n\n        if ( face->os2.fsSelection & 512 )       /* bit 9 */\n          flags |= FT_STYLE_FLAG_ITALIC;\n        else if ( face->os2.fsSelection & 1 )    /* bit 0 */\n          flags |= FT_STYLE_FLAG_ITALIC;\n\n        if ( face->os2.fsSelection & 32 )        /* bit 5 */\n          flags |= FT_STYLE_FLAG_BOLD;\n      }\n      else\n      {\n        /* this is an old Mac font, use the header field */\n\n        if ( face->header.Mac_Style & 1 )\n          flags |= FT_STYLE_FLAG_BOLD;\n\n        if ( face->header.Mac_Style & 2 )\n          flags |= FT_STYLE_FLAG_ITALIC;\n      }\n\n      root->style_flags = flags;\n\n      /*********************************************************************/\n      /*                                                                   */\n      /* Polish the charmaps.                                              */\n      /*                                                                   */\n      /*   Try to set the charmap encoding according to the platform &     */\n      /*   encoding ID of each charmap.                                    */\n      /*                                                                   */\n\n      tt_face_build_cmaps( face );  /* ignore errors */\n\n\n      /* set the encoding fields */\n      {\n        FT_Int  m;\n\n\n        for ( m = 0; m < root->num_charmaps; m++ )\n        {\n          FT_CharMap  charmap = root->charmaps[m];\n\n\n          charmap->encoding = sfnt_find_encoding( charmap->platform_id,\n                                                  charmap->encoding_id );\n\n#if 0\n          if ( root->charmap     == NULL &&\n               charmap->encoding == FT_ENCODING_UNICODE )\n          {\n            /* set 'root->charmap' to the first Unicode encoding we find */\n            root->charmap = charmap;\n          }\n#endif\n        }\n      }\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n\n      /*\n       *  Now allocate the root array of FT_Bitmap_Size records and\n       *  populate them.  Unfortunately, it isn't possible to indicate bit\n       *  depths in the FT_Bitmap_Size record.  This is a design error.\n       */\n      {\n        FT_UInt  i, count;\n\n\n        count = face->sbit_num_strikes;\n\n        if ( count > 0 )\n        {\n          FT_Memory        memory   = face->root.stream->memory;\n          FT_UShort        em_size  = face->header.Units_Per_EM;\n          FT_Short         avgwidth = face->os2.xAvgCharWidth;\n          FT_Size_Metrics  metrics;\n\n\n          if ( em_size == 0 || face->os2.version == 0xFFFFU )\n          {\n            avgwidth = 0;\n            em_size = 1;\n          }\n\n          if ( FT_NEW_ARRAY( root->available_sizes, count ) )\n            goto Exit;\n\n          for ( i = 0; i < count; i++ )\n          {\n            FT_Bitmap_Size*  bsize = root->available_sizes + i;\n\n\n            error = sfnt->load_strike_metrics( face, i, &metrics );\n            if ( error )\n              goto Exit;\n\n            bsize->height = (FT_Short)( metrics.height >> 6 );\n            bsize->width = (FT_Short)(\n                ( avgwidth * metrics.x_ppem + em_size / 2 ) / em_size );\n\n            bsize->x_ppem = metrics.x_ppem << 6;\n            bsize->y_ppem = metrics.y_ppem << 6;\n\n            /* assume 72dpi */\n            bsize->size   = metrics.y_ppem << 6;\n          }\n\n          root->face_flags     |= FT_FACE_FLAG_FIXED_SIZES;\n          root->num_fixed_sizes = (FT_Int)count;\n        }\n      }\n\n#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */\n\n      /* a font with no bitmaps and no outlines is scalable; */\n      /* it has only empty glyphs then                       */\n      if ( !FT_HAS_FIXED_SIZES( root ) && !FT_IS_SCALABLE( root ) )\n        root->face_flags |= FT_FACE_FLAG_SCALABLE;\n\n\n      /*********************************************************************/\n      /*                                                                   */\n      /*  Set up metrics.                                                  */\n      /*                                                                   */\n      if ( FT_IS_SCALABLE( root ) )\n      {\n        /* XXX What about if outline header is missing */\n        /*     (e.g. sfnt wrapped bitmap)?             */\n        root->bbox.xMin    = face->header.xMin;\n        root->bbox.yMin    = face->header.yMin;\n        root->bbox.xMax    = face->header.xMax;\n        root->bbox.yMax    = face->header.yMax;\n        root->units_per_EM = face->header.Units_Per_EM;\n\n\n        /* XXX: Computing the ascender/descender/height is very different */\n        /*      from what the specification tells you.  Apparently, we    */\n        /*      must be careful because                                   */\n        /*                                                                */\n        /*      - not all fonts have an OS/2 table; in this case, we take */\n        /*        the values in the horizontal header.  However, these    */\n        /*        values very often are not reliable.                     */\n        /*                                                                */\n        /*      - otherwise, the correct typographic values are in the    */\n        /*        sTypoAscender, sTypoDescender & sTypoLineGap fields.    */\n        /*                                                                */\n        /*        However, certain fonts have these fields set to 0.      */\n        /*        Rather, they have usWinAscent & usWinDescent correctly  */\n        /*        set (but with different values).                        */\n        /*                                                                */\n        /*      As an example, Arial Narrow is implemented through four   */\n        /*      files ARIALN.TTF, ARIALNI.TTF, ARIALNB.TTF & ARIALNBI.TTF */\n        /*                                                                */\n        /*      Strangely, all fonts have the same values in their        */\n        /*      sTypoXXX fields, except ARIALNB which sets them to 0.     */\n        /*                                                                */\n        /*      On the other hand, they all have different                */\n        /*      usWinAscent/Descent values -- as a conclusion, the OS/2   */\n        /*      table cannot be used to compute the text height reliably! */\n        /*                                                                */\n\n        /* The ascender and descender are taken from the `hhea' table. */\n        /* If zero, they are taken from the `OS/2' table.              */\n\n        root->ascender  = face->horizontal.Ascender;\n        root->descender = face->horizontal.Descender;\n\n        root->height = (FT_Short)( root->ascender - root->descender +\n                                   face->horizontal.Line_Gap );\n\n        if ( !( root->ascender || root->descender ) )\n        {\n          if ( face->os2.version != 0xFFFFU )\n          {\n            if ( face->os2.sTypoAscender || face->os2.sTypoDescender )\n            {\n              root->ascender  = face->os2.sTypoAscender;\n              root->descender = face->os2.sTypoDescender;\n\n              root->height = (FT_Short)( root->ascender - root->descender +\n                                         face->os2.sTypoLineGap );\n            }\n            else\n            {\n              root->ascender  =  (FT_Short)face->os2.usWinAscent;\n              root->descender = -(FT_Short)face->os2.usWinDescent;\n\n              root->height = (FT_UShort)( root->ascender - root->descender );\n            }\n          }\n        }\n\n        root->max_advance_width  = face->horizontal.advance_Width_Max;\n        root->max_advance_height = (FT_Short)( face->vertical_info\n                                     ? face->vertical.advance_Height_Max\n                                     : root->height );\n\n        /* See http://www.microsoft.com/OpenType/OTSpec/post.htm -- */\n        /* Adjust underline position from top edge to centre of     */\n        /* stroke to convert TrueType meaning to FreeType meaning.  */\n        root->underline_position  = face->postscript.underlinePosition -\n                                    face->postscript.underlineThickness / 2;\n        root->underline_thickness = face->postscript.underlineThickness;\n      }\n\n    }\n\n  Exit:\n    FT_TRACE2(( \"sfnt_load_face: done\\n\" ));\n\n    return error;\n  }\n\n\n#undef LOAD_\n#undef LOADM_\n#undef GET_NAME\n\n\n  FT_LOCAL_DEF( void )\n  sfnt_done_face( TT_Face  face )\n  {\n    FT_Memory     memory;\n    SFNT_Service  sfnt;\n\n\n    if ( !face )\n      return;\n\n    memory = face->root.memory;\n    sfnt   = (SFNT_Service)face->sfnt;\n\n    if ( sfnt )\n    {\n      /* destroy the postscript names table if it is loaded */\n      if ( sfnt->free_psnames )\n        sfnt->free_psnames( face );\n\n      /* destroy the embedded bitmaps table if it is loaded */\n      if ( sfnt->free_eblc )\n        sfnt->free_eblc( face );\n    }\n\n#ifdef TT_CONFIG_OPTION_BDF\n    /* freeing the embedded BDF properties */\n    tt_face_free_bdf_props( face );\n#endif\n\n    /* freeing the kerning table */\n    tt_face_done_kern( face );\n\n    /* freeing the collection table */\n    FT_FREE( face->ttc_header.offsets );\n    face->ttc_header.count = 0;\n\n    /* freeing table directory */\n    FT_FREE( face->dir_tables );\n    face->num_tables = 0;\n\n    {\n      FT_Stream  stream = FT_FACE_STREAM( face );\n\n\n      /* simply release the 'cmap' table frame */\n      FT_FRAME_RELEASE( face->cmap_table );\n      face->cmap_size = 0;\n    }\n\n    /* freeing the horizontal metrics */\n    {\n      FT_Stream  stream = FT_FACE_STREAM( face );\n\n\n      FT_FRAME_RELEASE( face->horz_metrics );\n      FT_FRAME_RELEASE( face->vert_metrics );\n      face->horz_metrics_size = 0;\n      face->vert_metrics_size = 0;\n    }\n\n    /* freeing the vertical ones, if any */\n    if ( face->vertical_info )\n    {\n      FT_FREE( face->vertical.long_metrics  );\n      FT_FREE( face->vertical.short_metrics );\n      face->vertical_info = 0;\n    }\n\n    /* freeing the gasp table */\n    FT_FREE( face->gasp.gaspRanges );\n    face->gasp.numRanges = 0;\n\n    /* freeing the name table */\n    if ( sfnt )\n      sfnt->free_name( face );\n\n    /* freeing family and style name */\n    FT_FREE( face->root.family_name );\n    FT_FREE( face->root.style_name );\n\n    /* freeing sbit size table */\n    FT_FREE( face->root.available_sizes );\n    face->root.num_fixed_sizes = 0;\n\n    FT_FREE( face->postscript_name );\n\n    face->sfnt = 0;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfobjs.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  sfobjs.h                                                               */\n/*                                                                         */\n/*    SFNT object management (specification).                              */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SFOBJS_H__\n#define __SFOBJS_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/sfnt.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( FT_Error )\n  sfnt_init_face( FT_Stream      stream,\n                  TT_Face        face,\n                  FT_Int         face_index,\n                  FT_Int         num_params,\n                  FT_Parameter*  params );\n\n  FT_LOCAL( FT_Error )\n  sfnt_load_face( FT_Stream      stream,\n                  TT_Face        face,\n                  FT_Int         face_index,\n                  FT_Int         num_params,\n                  FT_Parameter*  params );\n\n  FT_LOCAL( void )\n  sfnt_done_face( TT_Face  face );\n\n\nFT_END_HEADER\n\n#endif /* __SFDRIVER_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttbdf.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttbdf.c                                                                */\n/*                                                                         */\n/*    TrueType and OpenType embedded BDF properties (body).                */\n/*                                                                         */\n/*  Copyright 2005, 2006, 2010, 2013 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/tttags.h\"\n#include \"ttbdf.h\"\n\n#include \"sferrors.h\"\n\n\n#ifdef TT_CONFIG_OPTION_BDF\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttbdf\n\n\n  FT_LOCAL_DEF( void )\n  tt_face_free_bdf_props( TT_Face  face )\n  {\n    TT_BDF  bdf = &face->bdf;\n\n\n    if ( bdf->loaded )\n    {\n      FT_Stream  stream = FT_FACE(face)->stream;\n\n\n      if ( bdf->table != NULL )\n        FT_FRAME_RELEASE( bdf->table );\n\n      bdf->table_end    = NULL;\n      bdf->strings      = NULL;\n      bdf->strings_size = 0;\n    }\n  }\n\n\n  static FT_Error\n  tt_face_load_bdf_props( TT_Face    face,\n                          FT_Stream  stream )\n  {\n    TT_BDF    bdf = &face->bdf;\n    FT_ULong  length;\n    FT_Error  error;\n\n\n    FT_ZERO( bdf );\n\n    error = tt_face_goto_table( face, TTAG_BDF, stream, &length );\n    if ( error                                  ||\n         length < 8                             ||\n         FT_FRAME_EXTRACT( length, bdf->table ) )\n    {\n      error = FT_THROW( Invalid_Table );\n      goto Exit;\n    }\n\n    bdf->table_end = bdf->table + length;\n\n    {\n      FT_Byte*   p           = bdf->table;\n      FT_UInt    version     = FT_NEXT_USHORT( p );\n      FT_UInt    num_strikes = FT_NEXT_USHORT( p );\n      FT_ULong   strings     = FT_NEXT_ULONG ( p );\n      FT_UInt    count;\n      FT_Byte*   strike;\n\n\n      if ( version != 0x0001                 ||\n           strings < 8                       ||\n           ( strings - 8 ) / 4 < num_strikes ||\n           strings + 1 > length              )\n      {\n        goto BadTable;\n      }\n\n      bdf->num_strikes  = num_strikes;\n      bdf->strings      = bdf->table + strings;\n      bdf->strings_size = length - strings;\n\n      count  = bdf->num_strikes;\n      p      = bdf->table + 8;\n      strike = p + count * 4;\n\n\n      for ( ; count > 0; count-- )\n      {\n        FT_UInt  num_items = FT_PEEK_USHORT( p + 2 );\n\n        /*\n         *  We don't need to check the value sets themselves, since this\n         *  is done later.\n         */\n        strike += 10 * num_items;\n\n        p += 4;\n      }\n\n      if ( strike > bdf->strings )\n        goto BadTable;\n    }\n\n    bdf->loaded = 1;\n\n  Exit:\n    return error;\n\n  BadTable:\n    FT_FRAME_RELEASE( bdf->table );\n    FT_ZERO( bdf );\n    error = FT_THROW( Invalid_Table );\n    goto Exit;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_find_bdf_prop( TT_Face           face,\n                         const char*       property_name,\n                         BDF_PropertyRec  *aprop )\n  {\n    TT_BDF     bdf   = &face->bdf;\n    FT_Size    size  = FT_FACE(face)->size;\n    FT_Error   error = FT_Err_Ok;\n    FT_Byte*   p;\n    FT_UInt    count;\n    FT_Byte*   strike;\n    FT_Offset  property_len;\n\n\n    aprop->type = BDF_PROPERTY_TYPE_NONE;\n\n    if ( bdf->loaded == 0 )\n    {\n      error = tt_face_load_bdf_props( face, FT_FACE( face )->stream );\n      if ( error )\n        goto Exit;\n    }\n\n    count  = bdf->num_strikes;\n    p      = bdf->table + 8;\n    strike = p + 4 * count;\n\n    error = FT_ERR( Invalid_Argument );\n\n    if ( size == NULL || property_name == NULL )\n      goto Exit;\n\n    property_len = ft_strlen( property_name );\n    if ( property_len == 0 )\n      goto Exit;\n\n    for ( ; count > 0; count-- )\n    {\n      FT_UInt  _ppem  = FT_NEXT_USHORT( p );\n      FT_UInt  _count = FT_NEXT_USHORT( p );\n\n      if ( _ppem == size->metrics.y_ppem )\n      {\n        count = _count;\n        goto FoundStrike;\n      }\n\n      strike += 10 * _count;\n    }\n    goto Exit;\n\n  FoundStrike:\n    p = strike;\n    for ( ; count > 0; count-- )\n    {\n      FT_UInt  type = FT_PEEK_USHORT( p + 4 );\n\n      if ( ( type & 0x10 ) != 0 )\n      {\n        FT_UInt32  name_offset = FT_PEEK_ULONG( p     );\n        FT_UInt32  value       = FT_PEEK_ULONG( p + 6 );\n\n        /* be a bit paranoid for invalid entries here */\n        if ( name_offset < bdf->strings_size                    &&\n             property_len < bdf->strings_size - name_offset     &&\n             ft_strncmp( property_name,\n                         (const char*)bdf->strings + name_offset,\n                         bdf->strings_size - name_offset ) == 0 )\n        {\n          switch ( type & 0x0F )\n          {\n          case 0x00:  /* string */\n          case 0x01:  /* atoms */\n            /* check that the content is really 0-terminated */\n            if ( value < bdf->strings_size &&\n                 ft_memchr( bdf->strings + value, 0, bdf->strings_size ) )\n            {\n              aprop->type   = BDF_PROPERTY_TYPE_ATOM;\n              aprop->u.atom = (const char*)bdf->strings + value;\n              error         = FT_Err_Ok;\n              goto Exit;\n            }\n            break;\n\n          case 0x02:\n            aprop->type      = BDF_PROPERTY_TYPE_INTEGER;\n            aprop->u.integer = (FT_Int32)value;\n            error            = FT_Err_Ok;\n            goto Exit;\n\n          case 0x03:\n            aprop->type       = BDF_PROPERTY_TYPE_CARDINAL;\n            aprop->u.cardinal = value;\n            error             = FT_Err_Ok;\n            goto Exit;\n\n          default:\n            ;\n          }\n        }\n      }\n      p += 10;\n    }\n\n  Exit:\n    return error;\n  }\n\n#endif /* TT_CONFIG_OPTION_BDF */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttbdf.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttbdf.h                                                                */\n/*                                                                         */\n/*    TrueType and OpenType embedded BDF properties (specification).       */\n/*                                                                         */\n/*  Copyright 2005 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTBDF_H__\n#define __TTBDF_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"ttload.h\"\n#include \"../../include/freetype/ftbdf.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( void )\n  tt_face_free_bdf_props( TT_Face  face );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_find_bdf_prop( TT_Face           face,\n                         const char*       property_name,\n                         BDF_PropertyRec  *aprop );\n\n\nFT_END_HEADER\n\n#endif /* __TTBDF_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmap.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttcmap.c                                                               */\n/*                                                                         */\n/*    TrueType character mapping table (cmap) support (body).              */\n/*                                                                         */\n/*  Copyright 2002-2010, 2012, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n\n#include \"sferrors.h\"           /* must come before FT_INTERNAL_VALIDATE_H */\n\n#include \"../../include/freetype/internal/ftvalid.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"ttload.h\"\n#include \"ttcmap.h\"\n#include \"sfntpic.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttcmap\n\n\n#define TT_PEEK_SHORT   FT_PEEK_SHORT\n#define TT_PEEK_USHORT  FT_PEEK_USHORT\n#define TT_PEEK_UINT24  FT_PEEK_UOFF3\n#define TT_PEEK_LONG    FT_PEEK_LONG\n#define TT_PEEK_ULONG   FT_PEEK_ULONG\n\n#define TT_NEXT_SHORT   FT_NEXT_SHORT\n#define TT_NEXT_USHORT  FT_NEXT_USHORT\n#define TT_NEXT_UINT24  FT_NEXT_UOFF3\n#define TT_NEXT_LONG    FT_NEXT_LONG\n#define TT_NEXT_ULONG   FT_NEXT_ULONG\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap_init( TT_CMap   cmap,\n                FT_Byte*  table )\n  {\n    cmap->data = table;\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                           FORMAT 0                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* TABLE OVERVIEW                                                        */\n  /* --------------                                                        */\n  /*                                                                       */\n  /*   NAME        OFFSET         TYPE          DESCRIPTION                */\n  /*                                                                       */\n  /*   format      0              USHORT        must be 0                  */\n  /*   length      2              USHORT        table length in bytes      */\n  /*   language    4              USHORT        Mac language code          */\n  /*   glyph_ids   6              BYTE[256]     array of glyph indices     */\n  /*               262                                                     */\n  /*                                                                       */\n\n#ifdef TT_CONFIG_CMAP_FORMAT_0\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap0_validate( FT_Byte*      table,\n                     FT_Validator  valid )\n  {\n    FT_Byte*  p      = table + 2;\n    FT_UInt   length = TT_NEXT_USHORT( p );\n\n\n    if ( table + length > valid->limit || length < 262 )\n      FT_INVALID_TOO_SHORT;\n\n    /* check glyph indices whenever necessary */\n    if ( valid->level >= FT_VALIDATE_TIGHT )\n    {\n      FT_UInt  n, idx;\n\n\n      p = table + 6;\n      for ( n = 0; n < 256; n++ )\n      {\n        idx = *p++;\n        if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )\n          FT_INVALID_GLYPH_ID;\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  tt_cmap0_char_index( TT_CMap    cmap,\n                       FT_UInt32  char_code )\n  {\n    FT_Byte*  table = cmap->data;\n\n\n    return char_code < 256 ? table[6 + char_code] : 0;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  tt_cmap0_char_next( TT_CMap     cmap,\n                      FT_UInt32  *pchar_code )\n  {\n    FT_Byte*   table    = cmap->data;\n    FT_UInt32  charcode = *pchar_code;\n    FT_UInt32  result   = 0;\n    FT_UInt    gindex   = 0;\n\n\n    table += 6;  /* go to glyph IDs */\n    while ( ++charcode < 256 )\n    {\n      gindex = table[charcode];\n      if ( gindex != 0 )\n      {\n        result = charcode;\n        break;\n      }\n    }\n\n    *pchar_code = result;\n    return gindex;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap0_get_info( TT_CMap       cmap,\n                     TT_CMapInfo  *cmap_info )\n  {\n    FT_Byte*  p = cmap->data + 4;\n\n\n    cmap_info->format   = 0;\n    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_DEFINE_TT_CMAP(\n    tt_cmap0_class_rec,\n    sizeof ( TT_CMapRec ),\n\n    (FT_CMap_InitFunc)     tt_cmap_init,\n    (FT_CMap_DoneFunc)     NULL,\n    (FT_CMap_CharIndexFunc)tt_cmap0_char_index,\n    (FT_CMap_CharNextFunc) tt_cmap0_char_next,\n\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n\n    0,\n    (TT_CMap_ValidateFunc)tt_cmap0_validate,\n    (TT_CMap_Info_GetFunc)tt_cmap0_get_info )\n\n#endif /* TT_CONFIG_CMAP_FORMAT_0 */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                          FORMAT 2                             *****/\n  /*****                                                               *****/\n  /***** This is used for certain CJK encodings that encode text in a  *****/\n  /***** mixed 8/16 bits encoding along the following lines:           *****/\n  /*****                                                               *****/\n  /***** * Certain byte values correspond to an 8-bit character code   *****/\n  /*****   (typically in the range 0..127 for ASCII compatibility).    *****/\n  /*****                                                               *****/\n  /***** * Certain byte values signal the first byte of a 2-byte       *****/\n  /*****   character code (but these values are also valid as the      *****/\n  /*****   second byte of a 2-byte character).                         *****/\n  /*****                                                               *****/\n  /***** The following charmap lookup and iteration functions all      *****/\n  /***** assume that the value \"charcode\" correspond to following:     *****/\n  /*****                                                               *****/\n  /*****   - For one byte characters, \"charcode\" is simply the         *****/\n  /*****     character code.                                           *****/\n  /*****                                                               *****/\n  /*****   - For two byte characters, \"charcode\" is the 2-byte         *****/\n  /*****     character code in big endian format.  More exactly:       *****/\n  /*****                                                               *****/\n  /*****       (charcode >> 8)    is the first byte value              *****/\n  /*****       (charcode & 0xFF)  is the second byte value             *****/\n  /*****                                                               *****/\n  /***** Note that not all values of \"charcode\" are valid according    *****/\n  /***** to these rules, and the function moderately check the         *****/\n  /***** arguments.                                                    *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* TABLE OVERVIEW                                                        */\n  /* --------------                                                        */\n  /*                                                                       */\n  /*   NAME        OFFSET         TYPE            DESCRIPTION              */\n  /*                                                                       */\n  /*   format      0              USHORT          must be 2                */\n  /*   length      2              USHORT          table length in bytes    */\n  /*   language    4              USHORT          Mac language code        */\n  /*   keys        6              USHORT[256]     sub-header keys          */\n  /*   subs        518            SUBHEAD[NSUBS]  sub-headers array        */\n  /*   glyph_ids   518+NSUB*8     USHORT[]        glyph ID array           */\n  /*                                                                       */\n  /* The `keys' table is used to map charcode high-bytes to sub-headers.   */\n  /* The value of `NSUBS' is the number of sub-headers defined in the      */\n  /* table and is computed by finding the maximum of the `keys' table.     */\n  /*                                                                       */\n  /* Note that for any n, `keys[n]' is a byte offset within the `subs'     */\n  /* table, i.e., it is the corresponding sub-header index multiplied      */\n  /* by 8.                                                                 */\n  /*                                                                       */\n  /* Each sub-header has the following format:                             */\n  /*                                                                       */\n  /*   NAME        OFFSET      TYPE            DESCRIPTION                 */\n  /*                                                                       */\n  /*   first       0           USHORT          first valid low-byte        */\n  /*   count       2           USHORT          number of valid low-bytes   */\n  /*   delta       4           SHORT           see below                   */\n  /*   offset      6           USHORT          see below                   */\n  /*                                                                       */\n  /* A sub-header defines, for each high-byte, the range of valid          */\n  /* low-bytes within the charmap.  Note that the range defined by `first' */\n  /* and `count' must be completely included in the interval [0..255]      */\n  /* according to the specification.                                       */\n  /*                                                                       */\n  /* If a character code is contained within a given sub-header, then      */\n  /* mapping it to a glyph index is done as follows:                       */\n  /*                                                                       */\n  /* * The value of `offset' is read.  This is a _byte_ distance from the  */\n  /*   location of the `offset' field itself into a slice of the           */\n  /*   `glyph_ids' table.  Let's call it `slice' (it is a USHORT[] too).   */\n  /*                                                                       */\n  /* * The value `slice[char.lo - first]' is read.  If it is 0, there is   */\n  /*   no glyph for the charcode.  Otherwise, the value of `delta' is      */\n  /*   added to it (modulo 65536) to form a new glyph index.               */\n  /*                                                                       */\n  /* It is up to the validation routine to check that all offsets fall     */\n  /* within the glyph IDs table (and not within the `subs' table itself or */\n  /* outside of the CMap).                                                 */\n  /*                                                                       */\n\n#ifdef TT_CONFIG_CMAP_FORMAT_2\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap2_validate( FT_Byte*      table,\n                     FT_Validator  valid )\n  {\n    FT_Byte*  p      = table + 2;           /* skip format */\n    FT_UInt   length = TT_PEEK_USHORT( p );\n    FT_UInt   n, max_subs;\n    FT_Byte*  keys;                         /* keys table */\n    FT_Byte*  subs;                         /* sub-headers */\n    FT_Byte*  glyph_ids;                    /* glyph ID array */\n\n\n    if ( table + length > valid->limit || length < 6 + 512 )\n      FT_INVALID_TOO_SHORT;\n\n    keys = table + 6;\n\n    /* parse keys to compute sub-headers count */\n    p        = keys;\n    max_subs = 0;\n    for ( n = 0; n < 256; n++ )\n    {\n      FT_UInt  idx = TT_NEXT_USHORT( p );\n\n\n      /* value must be multiple of 8 */\n      if ( valid->level >= FT_VALIDATE_PARANOID && ( idx & 7 ) != 0 )\n        FT_INVALID_DATA;\n\n      idx >>= 3;\n\n      if ( idx > max_subs )\n        max_subs = idx;\n    }\n\n    FT_ASSERT( p == table + 518 );\n\n    subs      = p;\n    glyph_ids = subs + (max_subs + 1) * 8;\n    if ( glyph_ids > valid->limit )\n      FT_INVALID_TOO_SHORT;\n\n    /* parse sub-headers */\n    for ( n = 0; n <= max_subs; n++ )\n    {\n      FT_UInt   first_code, code_count, offset;\n      FT_Int    delta;\n      FT_Byte*  ids;\n\n\n      first_code = TT_NEXT_USHORT( p );\n      code_count = TT_NEXT_USHORT( p );\n      delta      = TT_NEXT_SHORT( p );\n      offset     = TT_NEXT_USHORT( p );\n\n      /* many Dynalab fonts have empty sub-headers */\n      if ( code_count == 0 )\n        continue;\n\n      /* check range within 0..255 */\n      if ( valid->level >= FT_VALIDATE_PARANOID )\n      {\n        if ( first_code >= 256 || first_code + code_count > 256 )\n          FT_INVALID_DATA;\n      }\n\n      /* check offset */\n      if ( offset != 0 )\n      {\n        ids = p - 2 + offset;\n        if ( ids < glyph_ids || ids + code_count*2 > table + length )\n          FT_INVALID_OFFSET;\n\n        /* check glyph IDs */\n        if ( valid->level >= FT_VALIDATE_TIGHT )\n        {\n          FT_Byte*  limit = p + code_count * 2;\n          FT_UInt   idx;\n\n\n          for ( ; p < limit; )\n          {\n            idx = TT_NEXT_USHORT( p );\n            if ( idx != 0 )\n            {\n              idx = ( idx + delta ) & 0xFFFFU;\n              if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )\n                FT_INVALID_GLYPH_ID;\n            }\n          }\n        }\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  /* return sub header corresponding to a given character code */\n  /* NULL on invalid charcode                                  */\n  static FT_Byte*\n  tt_cmap2_get_subheader( FT_Byte*   table,\n                          FT_UInt32  char_code )\n  {\n    FT_Byte*  result = NULL;\n\n\n    if ( char_code < 0x10000UL )\n    {\n      FT_UInt   char_lo = (FT_UInt)( char_code & 0xFF );\n      FT_UInt   char_hi = (FT_UInt)( char_code >> 8 );\n      FT_Byte*  p       = table + 6;    /* keys table */\n      FT_Byte*  subs    = table + 518;  /* subheaders table */\n      FT_Byte*  sub;\n\n\n      if ( char_hi == 0 )\n      {\n        /* an 8-bit character code -- we use subHeader 0 in this case */\n        /* to test whether the character code is in the charmap       */\n        /*                                                            */\n        sub = subs;  /* jump to first sub-header */\n\n        /* check that the sub-header for this byte is 0, which */\n        /* indicates that it is really a valid one-byte value  */\n        /* Otherwise, return 0                                 */\n        /*                                                     */\n        p += char_lo * 2;\n        if ( TT_PEEK_USHORT( p ) != 0 )\n          goto Exit;\n      }\n      else\n      {\n        /* a 16-bit character code */\n\n        /* jump to key entry  */\n        p  += char_hi * 2;\n        /* jump to sub-header */\n        sub = subs + ( FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 8 ) );\n\n        /* check that the high byte isn't a valid one-byte value */\n        if ( sub == subs )\n          goto Exit;\n      }\n      result = sub;\n    }\n  Exit:\n    return result;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  tt_cmap2_char_index( TT_CMap    cmap,\n                       FT_UInt32  char_code )\n  {\n    FT_Byte*  table   = cmap->data;\n    FT_UInt   result  = 0;\n    FT_Byte*  subheader;\n\n\n    subheader = tt_cmap2_get_subheader( table, char_code );\n    if ( subheader )\n    {\n      FT_Byte*  p   = subheader;\n      FT_UInt   idx = (FT_UInt)(char_code & 0xFF);\n      FT_UInt   start, count;\n      FT_Int    delta;\n      FT_UInt   offset;\n\n\n      start  = TT_NEXT_USHORT( p );\n      count  = TT_NEXT_USHORT( p );\n      delta  = TT_NEXT_SHORT ( p );\n      offset = TT_PEEK_USHORT( p );\n\n      idx -= start;\n      if ( idx < count && offset != 0 )\n      {\n        p  += offset + 2 * idx;\n        idx = TT_PEEK_USHORT( p );\n\n        if ( idx != 0 )\n          result = (FT_UInt)( idx + delta ) & 0xFFFFU;\n      }\n    }\n    return result;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  tt_cmap2_char_next( TT_CMap     cmap,\n                      FT_UInt32  *pcharcode )\n  {\n    FT_Byte*   table    = cmap->data;\n    FT_UInt    gindex   = 0;\n    FT_UInt32  result   = 0;\n    FT_UInt32  charcode = *pcharcode + 1;\n    FT_Byte*   subheader;\n\n\n    while ( charcode < 0x10000UL )\n    {\n      subheader = tt_cmap2_get_subheader( table, charcode );\n      if ( subheader )\n      {\n        FT_Byte*  p       = subheader;\n        FT_UInt   start   = TT_NEXT_USHORT( p );\n        FT_UInt   count   = TT_NEXT_USHORT( p );\n        FT_Int    delta   = TT_NEXT_SHORT ( p );\n        FT_UInt   offset  = TT_PEEK_USHORT( p );\n        FT_UInt   char_lo = (FT_UInt)( charcode & 0xFF );\n        FT_UInt   pos, idx;\n\n\n        if ( offset == 0 )\n          goto Next_SubHeader;\n\n        if ( char_lo < start )\n        {\n          char_lo = start;\n          pos     = 0;\n        }\n        else\n          pos = (FT_UInt)( char_lo - start );\n\n        p       += offset + pos * 2;\n        charcode = FT_PAD_FLOOR( charcode, 256 ) + char_lo;\n\n        for ( ; pos < count; pos++, charcode++ )\n        {\n          idx = TT_NEXT_USHORT( p );\n\n          if ( idx != 0 )\n          {\n            gindex = ( idx + delta ) & 0xFFFFU;\n            if ( gindex != 0 )\n            {\n              result = charcode;\n              goto Exit;\n            }\n          }\n        }\n      }\n\n      /* jump to next sub-header, i.e. higher byte value */\n    Next_SubHeader:\n      charcode = FT_PAD_FLOOR( charcode, 256 ) + 256;\n    }\n\n  Exit:\n    *pcharcode = result;\n\n    return gindex;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap2_get_info( TT_CMap       cmap,\n                     TT_CMapInfo  *cmap_info )\n  {\n    FT_Byte*  p = cmap->data + 4;\n\n\n    cmap_info->format   = 2;\n    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_DEFINE_TT_CMAP(\n    tt_cmap2_class_rec,\n    sizeof ( TT_CMapRec ),\n\n    (FT_CMap_InitFunc)     tt_cmap_init,\n    (FT_CMap_DoneFunc)     NULL,\n    (FT_CMap_CharIndexFunc)tt_cmap2_char_index,\n    (FT_CMap_CharNextFunc) tt_cmap2_char_next,\n\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n\n    2,\n    (TT_CMap_ValidateFunc)tt_cmap2_validate,\n    (TT_CMap_Info_GetFunc)tt_cmap2_get_info )\n\n#endif /* TT_CONFIG_CMAP_FORMAT_2 */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                           FORMAT 4                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* TABLE OVERVIEW                                                        */\n  /* --------------                                                        */\n  /*                                                                       */\n  /*   NAME          OFFSET         TYPE              DESCRIPTION          */\n  /*                                                                       */\n  /*   format        0              USHORT            must be 4            */\n  /*   length        2              USHORT            table length         */\n  /*                                                  in bytes             */\n  /*   language      4              USHORT            Mac language code    */\n  /*                                                                       */\n  /*   segCountX2    6              USHORT            2*NUM_SEGS           */\n  /*   searchRange   8              USHORT            2*(1 << LOG_SEGS)    */\n  /*   entrySelector 10             USHORT            LOG_SEGS             */\n  /*   rangeShift    12             USHORT            segCountX2 -         */\n  /*                                                    searchRange        */\n  /*                                                                       */\n  /*   endCount      14             USHORT[NUM_SEGS]  end charcode for     */\n  /*                                                  each segment; last   */\n  /*                                                  is 0xFFFF            */\n  /*                                                                       */\n  /*   pad           14+NUM_SEGS*2  USHORT            padding              */\n  /*                                                                       */\n  /*   startCount    16+NUM_SEGS*2  USHORT[NUM_SEGS]  first charcode for   */\n  /*                                                  each segment         */\n  /*                                                                       */\n  /*   idDelta       16+NUM_SEGS*4  SHORT[NUM_SEGS]   delta for each       */\n  /*                                                  segment              */\n  /*   idOffset      16+NUM_SEGS*6  SHORT[NUM_SEGS]   range offset for     */\n  /*                                                  each segment; can be */\n  /*                                                  zero                 */\n  /*                                                                       */\n  /*   glyphIds      16+NUM_SEGS*8  USHORT[]          array of glyph ID    */\n  /*                                                  ranges               */\n  /*                                                                       */\n  /* Character codes are modelled by a series of ordered (increasing)      */\n  /* intervals called segments.  Each segment has start and end codes,     */\n  /* provided by the `startCount' and `endCount' arrays.  Segments must    */\n  /* not overlap, and the last segment should always contain the value     */\n  /* 0xFFFF for `endCount'.                                                */\n  /*                                                                       */\n  /* The fields `searchRange', `entrySelector' and `rangeShift' are better */\n  /* ignored (they are traces of over-engineering in the TrueType          */\n  /* specification).                                                       */\n  /*                                                                       */\n  /* Each segment also has a signed `delta', as well as an optional offset */\n  /* within the `glyphIds' table.                                          */\n  /*                                                                       */\n  /* If a segment's idOffset is 0, the glyph index corresponding to any    */\n  /* charcode within the segment is obtained by adding the value of        */\n  /* `idDelta' directly to the charcode, modulo 65536.                     */\n  /*                                                                       */\n  /* Otherwise, a glyph index is taken from the glyph IDs sub-array for    */\n  /* the segment, and the value of `idDelta' is added to it.               */\n  /*                                                                       */\n  /*                                                                       */\n  /* Finally, note that a lot of fonts contain an invalid last segment,    */\n  /* where `start' and `end' are correctly set to 0xFFFF but both `delta'  */\n  /* and `offset' are incorrect (e.g., `opens___.ttf' which comes with     */\n  /* OpenOffice.org).  We need special code to deal with them correctly.   */\n  /*                                                                       */\n\n#ifdef TT_CONFIG_CMAP_FORMAT_4\n\n  typedef struct  TT_CMap4Rec_\n  {\n    TT_CMapRec  cmap;\n    FT_UInt32   cur_charcode;   /* current charcode */\n    FT_UInt     cur_gindex;     /* current glyph index */\n\n    FT_UInt     num_ranges;\n    FT_UInt     cur_range;\n    FT_UInt     cur_start;\n    FT_UInt     cur_end;\n    FT_Int      cur_delta;\n    FT_Byte*    cur_values;\n\n  } TT_CMap4Rec, *TT_CMap4;\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap4_init( TT_CMap4  cmap,\n                 FT_Byte*  table )\n  {\n    FT_Byte*  p;\n\n\n    cmap->cmap.data    = table;\n\n    p                  = table + 6;\n    cmap->num_ranges   = FT_PEEK_USHORT( p ) >> 1;\n    cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL;\n    cmap->cur_gindex   = 0;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_Int\n  tt_cmap4_set_range( TT_CMap4  cmap,\n                      FT_UInt   range_index )\n  {\n    FT_Byte*  table = cmap->cmap.data;\n    FT_Byte*  p;\n    FT_UInt   num_ranges = cmap->num_ranges;\n\n\n    while ( range_index < num_ranges )\n    {\n      FT_UInt  offset;\n\n\n      p             = table + 14 + range_index * 2;\n      cmap->cur_end = FT_PEEK_USHORT( p );\n\n      p              += 2 + num_ranges * 2;\n      cmap->cur_start = FT_PEEK_USHORT( p );\n\n      p              += num_ranges * 2;\n      cmap->cur_delta = FT_PEEK_SHORT( p );\n\n      p     += num_ranges * 2;\n      offset = FT_PEEK_USHORT( p );\n\n      /* some fonts have an incorrect last segment; */\n      /* we have to catch it                        */\n      if ( range_index     >= num_ranges - 1 &&\n           cmap->cur_start == 0xFFFFU        &&\n           cmap->cur_end   == 0xFFFFU        )\n      {\n        TT_Face   face  = (TT_Face)cmap->cmap.cmap.charmap.face;\n        FT_Byte*  limit = face->cmap_table + face->cmap_size;\n\n\n        if ( offset && p + offset + 2 > limit )\n        {\n          cmap->cur_delta = 1;\n          offset          = 0;\n        }\n      }\n\n      if ( offset != 0xFFFFU )\n      {\n        cmap->cur_values = offset ? p + offset : NULL;\n        cmap->cur_range  = range_index;\n        return 0;\n      }\n\n      /* we skip empty segments */\n      range_index++;\n    }\n\n    return -1;\n  }\n\n\n  /* search the index of the charcode next to cmap->cur_charcode; */\n  /* caller should call tt_cmap4_set_range with proper range      */\n  /* before calling this function                                 */\n  /*                                                              */\n  static void\n  tt_cmap4_next( TT_CMap4  cmap )\n  {\n    FT_UInt  charcode;\n\n\n    if ( cmap->cur_charcode >= 0xFFFFUL )\n      goto Fail;\n\n    charcode = (FT_UInt)cmap->cur_charcode + 1;\n\n    if ( charcode < cmap->cur_start )\n      charcode = cmap->cur_start;\n\n    for ( ;; )\n    {\n      FT_Byte*  values = cmap->cur_values;\n      FT_UInt   end    = cmap->cur_end;\n      FT_Int    delta  = cmap->cur_delta;\n\n\n      if ( charcode <= end )\n      {\n        if ( values )\n        {\n          FT_Byte*  p = values + 2 * ( charcode - cmap->cur_start );\n\n\n          do\n          {\n            FT_UInt  gindex = FT_NEXT_USHORT( p );\n\n\n            if ( gindex != 0 )\n            {\n              gindex = (FT_UInt)( ( gindex + delta ) & 0xFFFFU );\n              if ( gindex != 0 )\n              {\n                cmap->cur_charcode = charcode;\n                cmap->cur_gindex   = gindex;\n                return;\n              }\n            }\n          } while ( ++charcode <= end );\n        }\n        else\n        {\n          do\n          {\n            FT_UInt  gindex = (FT_UInt)( ( charcode + delta ) & 0xFFFFU );\n\n\n            if ( gindex != 0 )\n            {\n              cmap->cur_charcode = charcode;\n              cmap->cur_gindex   = gindex;\n              return;\n            }\n          } while ( ++charcode <= end );\n        }\n      }\n\n      /* we need to find another range */\n      if ( tt_cmap4_set_range( cmap, cmap->cur_range + 1 ) < 0 )\n        break;\n\n      if ( charcode < cmap->cur_start )\n        charcode = cmap->cur_start;\n    }\n\n  Fail:\n    cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL;\n    cmap->cur_gindex   = 0;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap4_validate( FT_Byte*      table,\n                     FT_Validator  valid )\n  {\n    FT_Byte*  p      = table + 2;               /* skip format */\n    FT_UInt   length = TT_NEXT_USHORT( p );\n    FT_Byte   *ends, *starts, *offsets, *deltas, *glyph_ids;\n    FT_UInt   num_segs;\n    FT_Error  error = FT_Err_Ok;\n\n\n    if ( length < 16 )\n      FT_INVALID_TOO_SHORT;\n\n    /* in certain fonts, the `length' field is invalid and goes */\n    /* out of bound.  We try to correct this here...            */\n    if ( table + length > valid->limit )\n    {\n      if ( valid->level >= FT_VALIDATE_TIGHT )\n        FT_INVALID_TOO_SHORT;\n\n      length = (FT_UInt)( valid->limit - table );\n    }\n\n    p        = table + 6;\n    num_segs = TT_NEXT_USHORT( p );   /* read segCountX2 */\n\n    if ( valid->level >= FT_VALIDATE_PARANOID )\n    {\n      /* check that we have an even value here */\n      if ( num_segs & 1 )\n        FT_INVALID_DATA;\n    }\n\n    num_segs /= 2;\n\n    if ( length < 16 + num_segs * 2 * 4 )\n      FT_INVALID_TOO_SHORT;\n\n    /* check the search parameters - even though we never use them */\n    /*                                                             */\n    if ( valid->level >= FT_VALIDATE_PARANOID )\n    {\n      /* check the values of `searchRange', `entrySelector', `rangeShift' */\n      FT_UInt  search_range   = TT_NEXT_USHORT( p );\n      FT_UInt  entry_selector = TT_NEXT_USHORT( p );\n      FT_UInt  range_shift    = TT_NEXT_USHORT( p );\n\n\n      if ( ( search_range | range_shift ) & 1 )  /* must be even values */\n        FT_INVALID_DATA;\n\n      search_range /= 2;\n      range_shift  /= 2;\n\n      /* `search range' is the greatest power of 2 that is <= num_segs */\n\n      if ( search_range                > num_segs                 ||\n           search_range * 2            < num_segs                 ||\n           search_range + range_shift != num_segs                 ||\n           search_range               != ( 1U << entry_selector ) )\n        FT_INVALID_DATA;\n    }\n\n    ends      = table   + 14;\n    starts    = table   + 16 + num_segs * 2;\n    deltas    = starts  + num_segs * 2;\n    offsets   = deltas  + num_segs * 2;\n    glyph_ids = offsets + num_segs * 2;\n\n    /* check last segment; its end count value must be 0xFFFF */\n    if ( valid->level >= FT_VALIDATE_PARANOID )\n    {\n      p = ends + ( num_segs - 1 ) * 2;\n      if ( TT_PEEK_USHORT( p ) != 0xFFFFU )\n        FT_INVALID_DATA;\n    }\n\n    {\n      FT_UInt   start, end, offset, n;\n      FT_UInt   last_start = 0, last_end = 0;\n      FT_Int    delta;\n      FT_Byte*  p_start   = starts;\n      FT_Byte*  p_end     = ends;\n      FT_Byte*  p_delta   = deltas;\n      FT_Byte*  p_offset  = offsets;\n\n\n      for ( n = 0; n < num_segs; n++ )\n      {\n        p      = p_offset;\n        start  = TT_NEXT_USHORT( p_start );\n        end    = TT_NEXT_USHORT( p_end );\n        delta  = TT_NEXT_SHORT( p_delta );\n        offset = TT_NEXT_USHORT( p_offset );\n\n        if ( start > end )\n          FT_INVALID_DATA;\n\n        /* this test should be performed at default validation level; */\n        /* unfortunately, some popular Asian fonts have overlapping   */\n        /* ranges in their charmaps                                   */\n        /*                                                            */\n        if ( start <= last_end && n > 0 )\n        {\n          if ( valid->level >= FT_VALIDATE_TIGHT )\n            FT_INVALID_DATA;\n          else\n          {\n            /* allow overlapping segments, provided their start points */\n            /* and end points, respectively, are in ascending order    */\n            /*                                                         */\n            if ( last_start > start || last_end > end )\n              error |= TT_CMAP_FLAG_UNSORTED;\n            else\n              error |= TT_CMAP_FLAG_OVERLAPPING;\n          }\n        }\n\n        if ( offset && offset != 0xFFFFU )\n        {\n          p += offset;  /* start of glyph ID array */\n\n          /* check that we point within the glyph IDs table only */\n          if ( valid->level >= FT_VALIDATE_TIGHT )\n          {\n            if ( p < glyph_ids                                ||\n                 p + ( end - start + 1 ) * 2 > table + length )\n              FT_INVALID_DATA;\n          }\n          /* Some fonts handle the last segment incorrectly.  In */\n          /* theory, 0xFFFF might point to an ordinary glyph --  */\n          /* a cmap 4 is versatile and could be used for any     */\n          /* encoding, not only Unicode.  However, reality shows */\n          /* that far too many fonts are sloppy and incorrectly  */\n          /* set all fields but `start' and `end' for the last   */\n          /* segment if it contains only a single character.     */\n          /*                                                     */\n          /* We thus omit the test here, delaying it to the      */\n          /* routines which actually access the cmap.            */\n          else if ( n != num_segs - 1                       ||\n                    !( start == 0xFFFFU && end == 0xFFFFU ) )\n          {\n            if ( p < glyph_ids                              ||\n                 p + ( end - start + 1 ) * 2 > valid->limit )\n              FT_INVALID_DATA;\n          }\n\n          /* check glyph indices within the segment range */\n          if ( valid->level >= FT_VALIDATE_TIGHT )\n          {\n            FT_UInt  i, idx;\n\n\n            for ( i = start; i < end; i++ )\n            {\n              idx = FT_NEXT_USHORT( p );\n              if ( idx != 0 )\n              {\n                idx = (FT_UInt)( idx + delta ) & 0xFFFFU;\n\n                if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )\n                  FT_INVALID_GLYPH_ID;\n              }\n            }\n          }\n        }\n        else if ( offset == 0xFFFFU )\n        {\n          /* some fonts (erroneously?) use a range offset of 0xFFFF */\n          /* to mean missing glyph in cmap table                    */\n          /*                                                        */\n          if ( valid->level >= FT_VALIDATE_PARANOID    ||\n               n != num_segs - 1                       ||\n               !( start == 0xFFFFU && end == 0xFFFFU ) )\n            FT_INVALID_DATA;\n        }\n\n        last_start = start;\n        last_end   = end;\n      }\n    }\n\n    return error;\n  }\n\n\n  static FT_UInt\n  tt_cmap4_char_map_linear( TT_CMap     cmap,\n                            FT_UInt32*  pcharcode,\n                            FT_Bool     next )\n  {\n    FT_UInt    num_segs2, start, end, offset;\n    FT_Int     delta;\n    FT_UInt    i, num_segs;\n    FT_UInt32  charcode = *pcharcode;\n    FT_UInt    gindex   = 0;\n    FT_Byte*   p;\n\n\n    p = cmap->data + 6;\n    num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 );\n\n    num_segs = num_segs2 >> 1;\n\n    if ( !num_segs )\n      return 0;\n\n    if ( next )\n      charcode++;\n\n    /* linear search */\n    for ( ; charcode <= 0xFFFFU; charcode++ )\n    {\n      FT_Byte*  q;\n\n\n      p = cmap->data + 14;               /* ends table   */\n      q = cmap->data + 16 + num_segs2;   /* starts table */\n\n      for ( i = 0; i < num_segs; i++ )\n      {\n        end   = TT_NEXT_USHORT( p );\n        start = TT_NEXT_USHORT( q );\n\n        if ( charcode >= start && charcode <= end )\n        {\n          p       = q - 2 + num_segs2;\n          delta   = TT_PEEK_SHORT( p );\n          p      += num_segs2;\n          offset  = TT_PEEK_USHORT( p );\n\n          /* some fonts have an incorrect last segment; */\n          /* we have to catch it                        */\n          if ( i >= num_segs - 1                  &&\n               start == 0xFFFFU && end == 0xFFFFU )\n          {\n            TT_Face   face  = (TT_Face)cmap->cmap.charmap.face;\n            FT_Byte*  limit = face->cmap_table + face->cmap_size;\n\n\n            if ( offset && p + offset + 2 > limit )\n            {\n              delta  = 1;\n              offset = 0;\n            }\n          }\n\n          if ( offset == 0xFFFFU )\n            continue;\n\n          if ( offset )\n          {\n            p += offset + ( charcode - start ) * 2;\n            gindex = TT_PEEK_USHORT( p );\n            if ( gindex != 0 )\n              gindex = (FT_UInt)( gindex + delta ) & 0xFFFFU;\n          }\n          else\n            gindex = (FT_UInt)( charcode + delta ) & 0xFFFFU;\n\n          break;\n        }\n      }\n\n      if ( !next || gindex )\n        break;\n    }\n\n    if ( next && gindex )\n      *pcharcode = charcode;\n\n    return gindex;\n  }\n\n\n  static FT_UInt\n  tt_cmap4_char_map_binary( TT_CMap     cmap,\n                            FT_UInt32*  pcharcode,\n                            FT_Bool     next )\n  {\n    FT_UInt   num_segs2, start, end, offset;\n    FT_Int    delta;\n    FT_UInt   max, min, mid, num_segs;\n    FT_UInt   charcode = (FT_UInt)*pcharcode;\n    FT_UInt   gindex   = 0;\n    FT_Byte*  p;\n\n\n    p = cmap->data + 6;\n    num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 );\n\n    if ( !num_segs2 )\n      return 0;\n\n    num_segs = num_segs2 >> 1;\n\n    /* make compiler happy */\n    mid = num_segs;\n    end = 0xFFFFU;\n\n    if ( next )\n      charcode++;\n\n    min = 0;\n    max = num_segs;\n\n    /* binary search */\n    while ( min < max )\n    {\n      mid    = ( min + max ) >> 1;\n      p      = cmap->data + 14 + mid * 2;\n      end    = TT_PEEK_USHORT( p );\n      p     += 2 + num_segs2;\n      start  = TT_PEEK_USHORT( p );\n\n      if ( charcode < start )\n        max = mid;\n      else if ( charcode > end )\n        min = mid + 1;\n      else\n      {\n        p     += num_segs2;\n        delta  = TT_PEEK_SHORT( p );\n        p     += num_segs2;\n        offset = TT_PEEK_USHORT( p );\n\n        /* some fonts have an incorrect last segment; */\n        /* we have to catch it                        */\n        if ( mid >= num_segs - 1                &&\n             start == 0xFFFFU && end == 0xFFFFU )\n        {\n          TT_Face   face  = (TT_Face)cmap->cmap.charmap.face;\n          FT_Byte*  limit = face->cmap_table + face->cmap_size;\n\n\n          if ( offset && p + offset + 2 > limit )\n          {\n            delta  = 1;\n            offset = 0;\n          }\n        }\n\n        /* search the first segment containing `charcode' */\n        if ( cmap->flags & TT_CMAP_FLAG_OVERLAPPING )\n        {\n          FT_UInt  i;\n\n\n          /* call the current segment `max' */\n          max = mid;\n\n          if ( offset == 0xFFFFU )\n            mid = max + 1;\n\n          /* search in segments before the current segment */\n          for ( i = max ; i > 0; i-- )\n          {\n            FT_UInt   prev_end;\n            FT_Byte*  old_p;\n\n\n            old_p    = p;\n            p        = cmap->data + 14 + ( i - 1 ) * 2;\n            prev_end = TT_PEEK_USHORT( p );\n\n            if ( charcode > prev_end )\n            {\n              p = old_p;\n              break;\n            }\n\n            end    = prev_end;\n            p     += 2 + num_segs2;\n            start  = TT_PEEK_USHORT( p );\n            p     += num_segs2;\n            delta  = TT_PEEK_SHORT( p );\n            p     += num_segs2;\n            offset = TT_PEEK_USHORT( p );\n\n            if ( offset != 0xFFFFU )\n              mid = i - 1;\n          }\n\n          /* no luck */\n          if ( mid == max + 1 )\n          {\n            if ( i != max )\n            {\n              p      = cmap->data + 14 + max * 2;\n              end    = TT_PEEK_USHORT( p );\n              p     += 2 + num_segs2;\n              start  = TT_PEEK_USHORT( p );\n              p     += num_segs2;\n              delta  = TT_PEEK_SHORT( p );\n              p     += num_segs2;\n              offset = TT_PEEK_USHORT( p );\n            }\n\n            mid = max;\n\n            /* search in segments after the current segment */\n            for ( i = max + 1; i < num_segs; i++ )\n            {\n              FT_UInt  next_end, next_start;\n\n\n              p          = cmap->data + 14 + i * 2;\n              next_end   = TT_PEEK_USHORT( p );\n              p         += 2 + num_segs2;\n              next_start = TT_PEEK_USHORT( p );\n\n              if ( charcode < next_start )\n                break;\n\n              end    = next_end;\n              start  = next_start;\n              p     += num_segs2;\n              delta  = TT_PEEK_SHORT( p );\n              p     += num_segs2;\n              offset = TT_PEEK_USHORT( p );\n\n              if ( offset != 0xFFFFU )\n                mid = i;\n            }\n            i--;\n\n            /* still no luck */\n            if ( mid == max )\n            {\n              mid = i;\n\n              break;\n            }\n          }\n\n          /* end, start, delta, and offset are for the i'th segment */\n          if ( mid != i )\n          {\n            p      = cmap->data + 14 + mid * 2;\n            end    = TT_PEEK_USHORT( p );\n            p     += 2 + num_segs2;\n            start  = TT_PEEK_USHORT( p );\n            p     += num_segs2;\n            delta  = TT_PEEK_SHORT( p );\n            p     += num_segs2;\n            offset = TT_PEEK_USHORT( p );\n          }\n        }\n        else\n        {\n          if ( offset == 0xFFFFU )\n            break;\n        }\n\n        if ( offset )\n        {\n          p += offset + ( charcode - start ) * 2;\n          gindex = TT_PEEK_USHORT( p );\n          if ( gindex != 0 )\n            gindex = (FT_UInt)( gindex + delta ) & 0xFFFFU;\n        }\n        else\n          gindex = (FT_UInt)( charcode + delta ) & 0xFFFFU;\n\n        break;\n      }\n    }\n\n    if ( next )\n    {\n      TT_CMap4  cmap4 = (TT_CMap4)cmap;\n\n\n      /* if `charcode' is not in any segment, then `mid' is */\n      /* the segment nearest to `charcode'                  */\n      /*                                                    */\n\n      if ( charcode > end )\n      {\n        mid++;\n        if ( mid == num_segs )\n          return 0;\n      }\n\n      if ( tt_cmap4_set_range( cmap4, mid ) )\n      {\n        if ( gindex )\n          *pcharcode = charcode;\n      }\n      else\n      {\n        cmap4->cur_charcode = charcode;\n\n        if ( gindex )\n          cmap4->cur_gindex = gindex;\n        else\n        {\n          cmap4->cur_charcode = charcode;\n          tt_cmap4_next( cmap4 );\n          gindex = cmap4->cur_gindex;\n        }\n\n        if ( gindex )\n          *pcharcode = cmap4->cur_charcode;\n      }\n    }\n\n    return gindex;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  tt_cmap4_char_index( TT_CMap    cmap,\n                       FT_UInt32  char_code )\n  {\n    if ( char_code >= 0x10000UL )\n      return 0;\n\n    if ( cmap->flags & TT_CMAP_FLAG_UNSORTED )\n      return tt_cmap4_char_map_linear( cmap, &char_code, 0 );\n    else\n      return tt_cmap4_char_map_binary( cmap, &char_code, 0 );\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  tt_cmap4_char_next( TT_CMap     cmap,\n                      FT_UInt32  *pchar_code )\n  {\n    FT_UInt  gindex;\n\n\n    if ( *pchar_code >= 0xFFFFU )\n      return 0;\n\n    if ( cmap->flags & TT_CMAP_FLAG_UNSORTED )\n      gindex = tt_cmap4_char_map_linear( cmap, pchar_code, 1 );\n    else\n    {\n      TT_CMap4  cmap4 = (TT_CMap4)cmap;\n\n\n      /* no need to search */\n      if ( *pchar_code == cmap4->cur_charcode )\n      {\n        tt_cmap4_next( cmap4 );\n        gindex = cmap4->cur_gindex;\n        if ( gindex )\n          *pchar_code = cmap4->cur_charcode;\n      }\n      else\n        gindex = tt_cmap4_char_map_binary( cmap, pchar_code, 1 );\n    }\n\n    return gindex;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap4_get_info( TT_CMap       cmap,\n                     TT_CMapInfo  *cmap_info )\n  {\n    FT_Byte*  p = cmap->data + 4;\n\n\n    cmap_info->format   = 4;\n    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_DEFINE_TT_CMAP(\n    tt_cmap4_class_rec,\n    sizeof ( TT_CMap4Rec ),\n    (FT_CMap_InitFunc)     tt_cmap4_init,\n    (FT_CMap_DoneFunc)     NULL,\n    (FT_CMap_CharIndexFunc)tt_cmap4_char_index,\n    (FT_CMap_CharNextFunc) tt_cmap4_char_next,\n\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n\n    4,\n    (TT_CMap_ValidateFunc)tt_cmap4_validate,\n    (TT_CMap_Info_GetFunc)tt_cmap4_get_info )\n\n#endif /* TT_CONFIG_CMAP_FORMAT_4 */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                          FORMAT 6                             *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* TABLE OVERVIEW                                                        */\n  /* --------------                                                        */\n  /*                                                                       */\n  /*   NAME        OFFSET          TYPE             DESCRIPTION            */\n  /*                                                                       */\n  /*   format       0              USHORT           must be 4              */\n  /*   length       2              USHORT           table length in bytes  */\n  /*   language     4              USHORT           Mac language code      */\n  /*                                                                       */\n  /*   first        6              USHORT           first segment code     */\n  /*   count        8              USHORT           segment size in chars  */\n  /*   glyphIds     10             USHORT[count]    glyph IDs              */\n  /*                                                                       */\n  /* A very simplified segment mapping.                                    */\n  /*                                                                       */\n\n#ifdef TT_CONFIG_CMAP_FORMAT_6\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap6_validate( FT_Byte*      table,\n                     FT_Validator  valid )\n  {\n    FT_Byte*  p;\n    FT_UInt   length, count;\n\n\n    if ( table + 10 > valid->limit )\n      FT_INVALID_TOO_SHORT;\n\n    p      = table + 2;\n    length = TT_NEXT_USHORT( p );\n\n    p      = table + 8;             /* skip language and start index */\n    count  = TT_NEXT_USHORT( p );\n\n    if ( table + length > valid->limit || length < 10 + count/* * 2 */) // Zhangxuefeng 2013.12.23. remove count multiply 2.\n      FT_INVALID_TOO_SHORT;\n\n    /* check glyph indices */\n    if ( valid->level >= FT_VALIDATE_TIGHT )\n    {\n      FT_UInt  gindex;\n\n\n      for ( ; count > 0; count-- )\n      {\n        gindex = TT_NEXT_USHORT( p );\n        if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) )\n          FT_INVALID_GLYPH_ID;\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  tt_cmap6_char_index( TT_CMap    cmap,\n                       FT_UInt32  char_code )\n  {\n    FT_Byte*  table  = cmap->data;\n    FT_UInt   result = 0;\n    FT_Byte*  p      = table + 6;\n    FT_UInt   start  = TT_NEXT_USHORT( p );\n    FT_UInt   count  = TT_NEXT_USHORT( p );\n    FT_UInt   idx    = (FT_UInt)( char_code - start );\n\n\n    if ( idx < count )\n    {\n      p += 2 * idx;\n      result = TT_PEEK_USHORT( p );\n    }\n    return result;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  tt_cmap6_char_next( TT_CMap     cmap,\n                      FT_UInt32  *pchar_code )\n  {\n    FT_Byte*   table     = cmap->data;\n    FT_UInt32  result    = 0;\n    FT_UInt32  char_code = *pchar_code + 1;\n    FT_UInt    gindex    = 0;\n\n    FT_Byte*   p         = table + 6;\n    FT_UInt    start     = TT_NEXT_USHORT( p );\n    FT_UInt    count     = TT_NEXT_USHORT( p );\n    FT_UInt    idx;\n\n\n    if ( char_code >= 0x10000UL )\n      goto Exit;\n\n    if ( char_code < start )\n      char_code = start;\n\n    idx = (FT_UInt)( char_code - start );\n    p  += 2 * idx;\n\n    for ( ; idx < count; idx++ )\n    {\n      gindex = TT_NEXT_USHORT( p );\n      if ( gindex != 0 )\n      {\n        result = char_code;\n        break;\n      }\n      char_code++;\n    }\n\n  Exit:\n    *pchar_code = result;\n    return gindex;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap6_get_info( TT_CMap       cmap,\n                     TT_CMapInfo  *cmap_info )\n  {\n    FT_Byte*  p = cmap->data + 4;\n\n\n    cmap_info->format   = 6;\n    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_DEFINE_TT_CMAP(\n    tt_cmap6_class_rec,\n    sizeof ( TT_CMapRec ),\n\n    (FT_CMap_InitFunc)     tt_cmap_init,\n    (FT_CMap_DoneFunc)     NULL,\n    (FT_CMap_CharIndexFunc)tt_cmap6_char_index,\n    (FT_CMap_CharNextFunc) tt_cmap6_char_next,\n\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n\n    6,\n    (TT_CMap_ValidateFunc)tt_cmap6_validate,\n    (TT_CMap_Info_GetFunc)tt_cmap6_get_info )\n\n#endif /* TT_CONFIG_CMAP_FORMAT_6 */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                          FORMAT 8                             *****/\n  /*****                                                               *****/\n  /***** It is hard to completely understand what the OpenType spec    *****/\n  /***** says about this format, but here is my conclusion.            *****/\n  /*****                                                               *****/\n  /***** The purpose of this format is to easily map UTF-16 text to    *****/\n  /***** glyph indices.  Basically, the `char_code' must be in one of  *****/\n  /***** the following formats:                                        *****/\n  /*****                                                               *****/\n  /*****   - A 16-bit value that isn't part of the Unicode Surrogates  *****/\n  /*****     Area (i.e. U+D800-U+DFFF).                                *****/\n  /*****                                                               *****/\n  /*****   - A 32-bit value, made of two surrogate values, i.e.. if    *****/\n  /*****     `char_code = (char_hi << 16) | char_lo', then both        *****/\n  /*****     `char_hi' and `char_lo' must be in the Surrogates Area.   *****/\n  /*****      Area.                                                    *****/\n  /*****                                                               *****/\n  /***** The `is32' table embedded in the charmap indicates whether a  *****/\n  /***** given 16-bit value is in the surrogates area or not.          *****/\n  /*****                                                               *****/\n  /***** So, for any given `char_code', we can assert the following:   *****/\n  /*****                                                               *****/\n  /*****   If `char_hi == 0' then we must have `is32[char_lo] == 0'.   *****/\n  /*****                                                               *****/\n  /*****   If `char_hi != 0' then we must have both                    *****/\n  /*****   `is32[char_hi] != 0' and `is32[char_lo] != 0'.              *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* TABLE OVERVIEW                                                        */\n  /* --------------                                                        */\n  /*                                                                       */\n  /*   NAME        OFFSET         TYPE        DESCRIPTION                  */\n  /*                                                                       */\n  /*   format      0              USHORT      must be 8                    */\n  /*   reserved    2              USHORT      reserved                     */\n  /*   length      4              ULONG       length in bytes              */\n  /*   language    8              ULONG       Mac language code            */\n  /*   is32        12             BYTE[8192]  32-bitness bitmap            */\n  /*   count       8204           ULONG       number of groups             */\n  /*                                                                       */\n  /* This header is followed by `count' groups of the following format:    */\n  /*                                                                       */\n  /*   start       0              ULONG       first charcode               */\n  /*   end         4              ULONG       last charcode                */\n  /*   startId     8              ULONG       start glyph ID for the group */\n  /*                                                                       */\n\n#ifdef TT_CONFIG_CMAP_FORMAT_8\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap8_validate( FT_Byte*      table,\n                     FT_Validator  valid )\n  {\n    FT_Byte*   p = table + 4;\n    FT_Byte*   is32;\n    FT_UInt32  length;\n    FT_UInt32  num_groups;\n\n\n    if ( table + 16 + 8192 > valid->limit )\n      FT_INVALID_TOO_SHORT;\n\n    length = TT_NEXT_ULONG( p );\n    if ( length > (FT_UInt32)( valid->limit - table ) || length < 8192 + 16 )\n      FT_INVALID_TOO_SHORT;\n\n    is32       = table + 12;\n    p          = is32  + 8192;          /* skip `is32' array */\n    num_groups = TT_NEXT_ULONG( p );\n\n    if ( p + num_groups * 12 > valid->limit )\n      FT_INVALID_TOO_SHORT;\n\n    /* check groups, they must be in increasing order */\n    {\n      FT_UInt32  n, start, end, start_id, count, last = 0;\n\n\n      for ( n = 0; n < num_groups; n++ )\n      {\n        FT_UInt   hi, lo;\n\n\n        start    = TT_NEXT_ULONG( p );\n        end      = TT_NEXT_ULONG( p );\n        start_id = TT_NEXT_ULONG( p );\n\n        if ( start > end )\n          FT_INVALID_DATA;\n\n        if ( n > 0 && start <= last )\n          FT_INVALID_DATA;\n\n        if ( valid->level >= FT_VALIDATE_TIGHT )\n        {\n          if ( start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) )\n            FT_INVALID_GLYPH_ID;\n\n          count = (FT_UInt32)( end - start + 1 );\n\n          if ( start & ~0xFFFFU )\n          {\n            /* start_hi != 0; check that is32[i] is 1 for each i in */\n            /* the `hi' and `lo' of the range [start..end]          */\n            for ( ; count > 0; count--, start++ )\n            {\n              hi = (FT_UInt)( start >> 16 );\n              lo = (FT_UInt)( start & 0xFFFFU );\n\n              if ( (is32[hi >> 3] & ( 0x80 >> ( hi & 7 ) ) ) == 0 )\n                FT_INVALID_DATA;\n\n              if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) == 0 )\n                FT_INVALID_DATA;\n            }\n          }\n          else\n          {\n            /* start_hi == 0; check that is32[i] is 0 for each i in */\n            /* the range [start..end]                               */\n\n            /* end_hi cannot be != 0! */\n            if ( end & ~0xFFFFU )\n              FT_INVALID_DATA;\n\n            for ( ; count > 0; count--, start++ )\n            {\n              lo = (FT_UInt)( start & 0xFFFFU );\n\n              if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) != 0 )\n                FT_INVALID_DATA;\n            }\n          }\n        }\n\n        last = end;\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  tt_cmap8_char_index( TT_CMap    cmap,\n                       FT_UInt32  char_code )\n  {\n    FT_Byte*   table      = cmap->data;\n    FT_UInt    result     = 0;\n    FT_Byte*   p          = table + 8204;\n    FT_UInt32  num_groups = TT_NEXT_ULONG( p );\n    FT_UInt32  start, end, start_id;\n\n\n    for ( ; num_groups > 0; num_groups-- )\n    {\n      start    = TT_NEXT_ULONG( p );\n      end      = TT_NEXT_ULONG( p );\n      start_id = TT_NEXT_ULONG( p );\n\n      if ( char_code < start )\n        break;\n\n      if ( char_code <= end )\n      {\n        result = (FT_UInt)( start_id + char_code - start );\n        break;\n      }\n    }\n    return result;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  tt_cmap8_char_next( TT_CMap     cmap,\n                      FT_UInt32  *pchar_code )\n  {\n    FT_UInt32  result     = 0;\n    FT_UInt32  char_code  = *pchar_code + 1;\n    FT_UInt    gindex     = 0;\n    FT_Byte*   table      = cmap->data;\n    FT_Byte*   p          = table + 8204;\n    FT_UInt32  num_groups = TT_NEXT_ULONG( p );\n    FT_UInt32  start, end, start_id;\n\n\n    p = table + 8208;\n\n    for ( ; num_groups > 0; num_groups-- )\n    {\n      start    = TT_NEXT_ULONG( p );\n      end      = TT_NEXT_ULONG( p );\n      start_id = TT_NEXT_ULONG( p );\n\n      if ( char_code < start )\n        char_code = start;\n\n      if ( char_code <= end )\n      {\n        gindex = (FT_UInt)( char_code - start + start_id );\n        if ( gindex != 0 )\n        {\n          result = char_code;\n          goto Exit;\n        }\n      }\n    }\n\n  Exit:\n    *pchar_code = result;\n    return gindex;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap8_get_info( TT_CMap       cmap,\n                     TT_CMapInfo  *cmap_info )\n  {\n    FT_Byte*  p = cmap->data + 8;\n\n\n    cmap_info->format   = 8;\n    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_DEFINE_TT_CMAP(\n    tt_cmap8_class_rec,\n    sizeof ( TT_CMapRec ),\n\n    (FT_CMap_InitFunc)     tt_cmap_init,\n    (FT_CMap_DoneFunc)     NULL,\n    (FT_CMap_CharIndexFunc)tt_cmap8_char_index,\n    (FT_CMap_CharNextFunc) tt_cmap8_char_next,\n\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n\n    8,\n    (TT_CMap_ValidateFunc)tt_cmap8_validate,\n    (TT_CMap_Info_GetFunc)tt_cmap8_get_info )\n\n#endif /* TT_CONFIG_CMAP_FORMAT_8 */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                          FORMAT 10                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* TABLE OVERVIEW                                                        */\n  /* --------------                                                        */\n  /*                                                                       */\n  /*   NAME      OFFSET  TYPE               DESCRIPTION                    */\n  /*                                                                       */\n  /*   format     0      USHORT             must be 10                     */\n  /*   reserved   2      USHORT             reserved                       */\n  /*   length     4      ULONG              length in bytes                */\n  /*   language   8      ULONG              Mac language code              */\n  /*                                                                       */\n  /*   start     12      ULONG              first char in range            */\n  /*   count     16      ULONG              number of chars in range       */\n  /*   glyphIds  20      USHORT[count]      glyph indices covered          */\n  /*                                                                       */\n\n#ifdef TT_CONFIG_CMAP_FORMAT_10\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap10_validate( FT_Byte*      table,\n                      FT_Validator  valid )\n  {\n    FT_Byte*  p = table + 4;\n    FT_ULong  length, count;\n\n\n    if ( table + 20 > valid->limit )\n      FT_INVALID_TOO_SHORT;\n\n    length = TT_NEXT_ULONG( p );\n    p      = table + 16;\n    count  = TT_NEXT_ULONG( p );\n\n    if ( length > (FT_ULong)( valid->limit - table ) ||\n         length < 20 + count * 2                     )\n      FT_INVALID_TOO_SHORT;\n\n    /* check glyph indices */\n    if ( valid->level >= FT_VALIDATE_TIGHT )\n    {\n      FT_UInt  gindex;\n\n\n      for ( ; count > 0; count-- )\n      {\n        gindex = TT_NEXT_USHORT( p );\n        if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) )\n          FT_INVALID_GLYPH_ID;\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  tt_cmap10_char_index( TT_CMap    cmap,\n                        FT_UInt32  char_code )\n  {\n    FT_Byte*   table  = cmap->data;\n    FT_UInt    result = 0;\n    FT_Byte*   p      = table + 12;\n    FT_UInt32  start  = TT_NEXT_ULONG( p );\n    FT_UInt32  count  = TT_NEXT_ULONG( p );\n    FT_UInt32  idx    = (FT_ULong)( char_code - start );\n\n\n    if ( idx < count )\n    {\n      p     += 2 * idx;\n      result = TT_PEEK_USHORT( p );\n    }\n    return result;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  tt_cmap10_char_next( TT_CMap     cmap,\n                       FT_UInt32  *pchar_code )\n  {\n    FT_Byte*   table     = cmap->data;\n    FT_UInt32  char_code = *pchar_code + 1;\n    FT_UInt    gindex    = 0;\n    FT_Byte*   p         = table + 12;\n    FT_UInt32  start     = TT_NEXT_ULONG( p );\n    FT_UInt32  count     = TT_NEXT_ULONG( p );\n    FT_UInt32  idx;\n\n\n    if ( char_code < start )\n      char_code = start;\n\n    idx = (FT_UInt32)( char_code - start );\n    p  += 2 * idx;\n\n    for ( ; idx < count; idx++ )\n    {\n      gindex = TT_NEXT_USHORT( p );\n      if ( gindex != 0 )\n        break;\n      char_code++;\n    }\n\n    *pchar_code = char_code;\n    return gindex;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap10_get_info( TT_CMap       cmap,\n                      TT_CMapInfo  *cmap_info )\n  {\n    FT_Byte*  p = cmap->data + 8;\n\n\n    cmap_info->format   = 10;\n    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_DEFINE_TT_CMAP(\n    tt_cmap10_class_rec,\n    sizeof ( TT_CMapRec ),\n\n    (FT_CMap_InitFunc)     tt_cmap_init,\n    (FT_CMap_DoneFunc)     NULL,\n    (FT_CMap_CharIndexFunc)tt_cmap10_char_index,\n    (FT_CMap_CharNextFunc) tt_cmap10_char_next,\n\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n\n    10,\n    (TT_CMap_ValidateFunc)tt_cmap10_validate,\n    (TT_CMap_Info_GetFunc)tt_cmap10_get_info )\n\n#endif /* TT_CONFIG_CMAP_FORMAT_10 */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                          FORMAT 12                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* TABLE OVERVIEW                                                        */\n  /* --------------                                                        */\n  /*                                                                       */\n  /*   NAME        OFFSET     TYPE       DESCRIPTION                       */\n  /*                                                                       */\n  /*   format      0          USHORT     must be 12                        */\n  /*   reserved    2          USHORT     reserved                          */\n  /*   length      4          ULONG      length in bytes                   */\n  /*   language    8          ULONG      Mac language code                 */\n  /*   count       12         ULONG      number of groups                  */\n  /*               16                                                      */\n  /*                                                                       */\n  /* This header is followed by `count' groups of the following format:    */\n  /*                                                                       */\n  /*   start       0          ULONG      first charcode                    */\n  /*   end         4          ULONG      last charcode                     */\n  /*   startId     8          ULONG      start glyph ID for the group      */\n  /*                                                                       */\n\n#ifdef TT_CONFIG_CMAP_FORMAT_12\n\n  typedef struct  TT_CMap12Rec_\n  {\n    TT_CMapRec  cmap;\n    FT_Bool     valid;\n    FT_ULong    cur_charcode;\n    FT_UInt     cur_gindex;\n    FT_ULong    cur_group;\n    FT_ULong    num_groups;\n\n  } TT_CMap12Rec, *TT_CMap12;\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap12_init( TT_CMap12  cmap,\n                  FT_Byte*   table )\n  {\n    cmap->cmap.data  = table;\n\n    table           += 12;\n    cmap->num_groups = FT_PEEK_ULONG( table );\n\n    cmap->valid      = 0;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap12_validate( FT_Byte*      table,\n                      FT_Validator  valid )\n  {\n    FT_Byte*   p;\n    FT_ULong   length;\n    FT_ULong   num_groups;\n\n\n    if ( table + 16 > valid->limit )\n      FT_INVALID_TOO_SHORT;\n\n    p      = table + 4;\n    length = TT_NEXT_ULONG( p );\n\n    p          = table + 12;\n    num_groups = TT_NEXT_ULONG( p );\n\n    if ( length > (FT_ULong)( valid->limit - table ) ||\n         length < 16 + 12 * num_groups               )\n      FT_INVALID_TOO_SHORT;\n\n    /* check groups, they must be in increasing order */\n    {\n      FT_ULong  n, start, end, start_id, last = 0;\n\n\n      for ( n = 0; n < num_groups; n++ )\n      {\n        start    = TT_NEXT_ULONG( p );\n        end      = TT_NEXT_ULONG( p );\n        start_id = TT_NEXT_ULONG( p );\n\n        if ( start > end )\n          FT_INVALID_DATA;\n\n        if ( n > 0 && start <= last )\n          FT_INVALID_DATA;\n\n        if ( valid->level >= FT_VALIDATE_TIGHT )\n        {\n          if ( start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) )\n            FT_INVALID_GLYPH_ID;\n        }\n\n        last = end;\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  /* search the index of the charcode next to cmap->cur_charcode */\n  /* cmap->cur_group should be set up properly by caller         */\n  /*                                                             */\n  static void\n  tt_cmap12_next( TT_CMap12  cmap )\n  {\n    FT_Byte*  p;\n    FT_ULong  start, end, start_id, char_code;\n    FT_ULong  n;\n    FT_UInt   gindex;\n\n\n    if ( cmap->cur_charcode >= 0xFFFFFFFFUL )\n      goto Fail;\n\n    char_code = cmap->cur_charcode + 1;\n\n    n = cmap->cur_group;\n\n    for ( n = cmap->cur_group; n < cmap->num_groups; n++ )\n    {\n      p        = cmap->cmap.data + 16 + 12 * n;\n      start    = TT_NEXT_ULONG( p );\n      end      = TT_NEXT_ULONG( p );\n      start_id = TT_PEEK_ULONG( p );\n\n      if ( char_code < start )\n        char_code = start;\n\n      for ( ; char_code <= end; char_code++ )\n      {\n        gindex = (FT_UInt)( start_id + char_code - start );\n\n        if ( gindex )\n        {\n          cmap->cur_charcode = char_code;;\n          cmap->cur_gindex   = gindex;\n          cmap->cur_group    = n;\n\n          return;\n        }\n      }\n    }\n\n  Fail:\n    cmap->valid = 0;\n  }\n\n\n  static FT_UInt\n  tt_cmap12_char_map_binary( TT_CMap     cmap,\n                             FT_UInt32*  pchar_code,\n                             FT_Bool     next )\n  {\n    FT_UInt    gindex     = 0;\n    FT_Byte*   p          = cmap->data + 12;\n    FT_UInt32  num_groups = TT_PEEK_ULONG( p );\n    FT_UInt32  char_code  = *pchar_code;\n    FT_UInt32  start, end, start_id;\n    FT_UInt32  max, min, mid;\n\n\n    if ( !num_groups )\n      return 0;\n\n    /* make compiler happy */\n    mid = num_groups;\n    end = 0xFFFFFFFFUL;\n\n    if ( next )\n      char_code++;\n\n    min = 0;\n    max = num_groups;\n\n    /* binary search */\n    while ( min < max )\n    {\n      mid = ( min + max ) >> 1;\n      p   = cmap->data + 16 + 12 * mid;\n\n      start = TT_NEXT_ULONG( p );\n      end   = TT_NEXT_ULONG( p );\n\n      if ( char_code < start )\n        max = mid;\n      else if ( char_code > end )\n        min = mid + 1;\n      else\n      {\n        start_id = TT_PEEK_ULONG( p );\n        gindex = (FT_UInt)( start_id + char_code - start );\n\n        break;\n      }\n    }\n\n    if ( next )\n    {\n      TT_CMap12  cmap12 = (TT_CMap12)cmap;\n\n\n      /* if `char_code' is not in any group, then `mid' is */\n      /* the group nearest to `char_code'                  */\n      /*                                                   */\n\n      if ( char_code > end )\n      {\n        mid++;\n        if ( mid == num_groups )\n          return 0;\n      }\n\n      cmap12->valid        = 1;\n      cmap12->cur_charcode = char_code;\n      cmap12->cur_group    = mid;\n\n      if ( !gindex )\n      {\n        tt_cmap12_next( cmap12 );\n\n        if ( cmap12->valid )\n          gindex = cmap12->cur_gindex;\n      }\n      else\n        cmap12->cur_gindex = gindex;\n\n      if ( gindex )\n        *pchar_code = cmap12->cur_charcode;\n    }\n\n    return gindex;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  tt_cmap12_char_index( TT_CMap    cmap,\n                        FT_UInt32  char_code )\n  {\n    return tt_cmap12_char_map_binary( cmap, &char_code, 0 );\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  tt_cmap12_char_next( TT_CMap     cmap,\n                       FT_UInt32  *pchar_code )\n  {\n    TT_CMap12  cmap12 = (TT_CMap12)cmap;\n    FT_ULong   gindex;\n\n\n    if ( cmap12->cur_charcode >= 0xFFFFFFFFUL )\n      return 0;\n\n    /* no need to search */\n    if ( cmap12->valid && cmap12->cur_charcode == *pchar_code )\n    {\n      tt_cmap12_next( cmap12 );\n      if ( cmap12->valid )\n      {\n        gindex = cmap12->cur_gindex;\n\n        /* XXX: check cur_charcode overflow is expected */\n        if ( gindex )\n          *pchar_code = (FT_UInt32)cmap12->cur_charcode;\n      }\n      else\n        gindex = 0;\n    }\n    else\n      gindex = tt_cmap12_char_map_binary( cmap, pchar_code, 1 );\n\n    /* XXX: check gindex overflow is expected */\n    return (FT_UInt32)gindex;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap12_get_info( TT_CMap       cmap,\n                      TT_CMapInfo  *cmap_info )\n  {\n    FT_Byte*  p = cmap->data + 8;\n\n\n    cmap_info->format   = 12;\n    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_DEFINE_TT_CMAP(\n    tt_cmap12_class_rec,\n    sizeof ( TT_CMap12Rec ),\n\n    (FT_CMap_InitFunc)     tt_cmap12_init,\n    (FT_CMap_DoneFunc)     NULL,\n    (FT_CMap_CharIndexFunc)tt_cmap12_char_index,\n    (FT_CMap_CharNextFunc) tt_cmap12_char_next,\n\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n\n    12,\n    (TT_CMap_ValidateFunc)tt_cmap12_validate,\n    (TT_CMap_Info_GetFunc)tt_cmap12_get_info )\n\n#endif /* TT_CONFIG_CMAP_FORMAT_12 */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                          FORMAT 13                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* TABLE OVERVIEW                                                        */\n  /* --------------                                                        */\n  /*                                                                       */\n  /*   NAME        OFFSET     TYPE       DESCRIPTION                       */\n  /*                                                                       */\n  /*   format      0          USHORT     must be 13                        */\n  /*   reserved    2          USHORT     reserved                          */\n  /*   length      4          ULONG      length in bytes                   */\n  /*   language    8          ULONG      Mac language code                 */\n  /*   count       12         ULONG      number of groups                  */\n  /*               16                                                      */\n  /*                                                                       */\n  /* This header is followed by `count' groups of the following format:    */\n  /*                                                                       */\n  /*   start       0          ULONG      first charcode                    */\n  /*   end         4          ULONG      last charcode                     */\n  /*   glyphId     8          ULONG      glyph ID for the whole group      */\n  /*                                                                       */\n\n#ifdef TT_CONFIG_CMAP_FORMAT_13\n\n  typedef struct  TT_CMap13Rec_\n  {\n    TT_CMapRec  cmap;\n    FT_Bool     valid;\n    FT_ULong    cur_charcode;\n    FT_UInt     cur_gindex;\n    FT_ULong    cur_group;\n    FT_ULong    num_groups;\n\n  } TT_CMap13Rec, *TT_CMap13;\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap13_init( TT_CMap13  cmap,\n                  FT_Byte*   table )\n  {\n    cmap->cmap.data  = table;\n\n    table           += 12;\n    cmap->num_groups = FT_PEEK_ULONG( table );\n\n    cmap->valid      = 0;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap13_validate( FT_Byte*      table,\n                      FT_Validator  valid )\n  {\n    FT_Byte*  p;\n    FT_ULong  length;\n    FT_ULong  num_groups;\n\n\n    if ( table + 16 > valid->limit )\n      FT_INVALID_TOO_SHORT;\n\n    p      = table + 4;\n    length = TT_NEXT_ULONG( p );\n\n    p          = table + 12;\n    num_groups = TT_NEXT_ULONG( p );\n\n    if ( length > (FT_ULong)( valid->limit - table ) ||\n         length < 16 + 12 * num_groups               )\n      FT_INVALID_TOO_SHORT;\n\n    /* check groups, they must be in increasing order */\n    {\n      FT_ULong  n, start, end, glyph_id, last = 0;\n\n\n      for ( n = 0; n < num_groups; n++ )\n      {\n        start    = TT_NEXT_ULONG( p );\n        end      = TT_NEXT_ULONG( p );\n        glyph_id = TT_NEXT_ULONG( p );\n\n        if ( start > end )\n          FT_INVALID_DATA;\n\n        if ( n > 0 && start <= last )\n          FT_INVALID_DATA;\n\n        if ( valid->level >= FT_VALIDATE_TIGHT )\n        {\n          if ( glyph_id >= TT_VALID_GLYPH_COUNT( valid ) )\n            FT_INVALID_GLYPH_ID;\n        }\n\n        last = end;\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  /* search the index of the charcode next to cmap->cur_charcode */\n  /* cmap->cur_group should be set up properly by caller         */\n  /*                                                             */\n  static void\n  tt_cmap13_next( TT_CMap13  cmap )\n  {\n    FT_Byte*  p;\n    FT_ULong  start, end, glyph_id, char_code;\n    FT_ULong  n;\n    FT_UInt   gindex;\n\n\n    if ( cmap->cur_charcode >= 0xFFFFFFFFUL )\n      goto Fail;\n\n    char_code = cmap->cur_charcode + 1;\n\n    n = cmap->cur_group;\n\n    for ( n = cmap->cur_group; n < cmap->num_groups; n++ )\n    {\n      p        = cmap->cmap.data + 16 + 12 * n;\n      start    = TT_NEXT_ULONG( p );\n      end      = TT_NEXT_ULONG( p );\n      glyph_id = TT_PEEK_ULONG( p );\n\n      if ( char_code < start )\n        char_code = start;\n\n      if ( char_code <= end )\n      {\n        gindex = (FT_UInt)glyph_id;\n\n        if ( gindex )\n        {\n          cmap->cur_charcode = char_code;;\n          cmap->cur_gindex   = gindex;\n          cmap->cur_group    = n;\n\n          return;\n        }\n      }\n    }\n\n  Fail:\n    cmap->valid = 0;\n  }\n\n\n  static FT_UInt\n  tt_cmap13_char_map_binary( TT_CMap     cmap,\n                             FT_UInt32*  pchar_code,\n                             FT_Bool     next )\n  {\n    FT_UInt    gindex     = 0;\n    FT_Byte*   p          = cmap->data + 12;\n    FT_UInt32  num_groups = TT_PEEK_ULONG( p );\n    FT_UInt32  char_code  = *pchar_code;\n    FT_UInt32  start, end;\n    FT_UInt32  max, min, mid;\n\n\n    if ( !num_groups )\n      return 0;\n\n    /* make compiler happy */\n    mid = num_groups;\n    end = 0xFFFFFFFFUL;\n\n    if ( next )\n      char_code++;\n\n    min = 0;\n    max = num_groups;\n\n    /* binary search */\n    while ( min < max )\n    {\n      mid = ( min + max ) >> 1;\n      p   = cmap->data + 16 + 12 * mid;\n\n      start = TT_NEXT_ULONG( p );\n      end   = TT_NEXT_ULONG( p );\n\n      if ( char_code < start )\n        max = mid;\n      else if ( char_code > end )\n        min = mid + 1;\n      else\n      {\n        gindex = (FT_UInt)TT_PEEK_ULONG( p );\n\n        break;\n      }\n    }\n\n    if ( next )\n    {\n      TT_CMap13  cmap13 = (TT_CMap13)cmap;\n\n\n      /* if `char_code' is not in any group, then `mid' is */\n      /* the group nearest to `char_code'                  */\n\n      if ( char_code > end )\n      {\n        mid++;\n        if ( mid == num_groups )\n          return 0;\n      }\n\n      cmap13->valid        = 1;\n      cmap13->cur_charcode = char_code;\n      cmap13->cur_group    = mid;\n\n      if ( !gindex )\n      {\n        tt_cmap13_next( cmap13 );\n\n        if ( cmap13->valid )\n          gindex = cmap13->cur_gindex;\n      }\n      else\n        cmap13->cur_gindex = gindex;\n\n      if ( gindex )\n        *pchar_code = cmap13->cur_charcode;\n    }\n\n    return gindex;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  tt_cmap13_char_index( TT_CMap    cmap,\n                        FT_UInt32  char_code )\n  {\n    return tt_cmap13_char_map_binary( cmap, &char_code, 0 );\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  tt_cmap13_char_next( TT_CMap     cmap,\n                       FT_UInt32  *pchar_code )\n  {\n    TT_CMap13  cmap13 = (TT_CMap13)cmap;\n    FT_UInt    gindex;\n\n\n    if ( cmap13->cur_charcode >= 0xFFFFFFFFUL )\n      return 0;\n\n    /* no need to search */\n    if ( cmap13->valid && cmap13->cur_charcode == *pchar_code )\n    {\n      tt_cmap13_next( cmap13 );\n      if ( cmap13->valid )\n      {\n        gindex = cmap13->cur_gindex;\n        if ( gindex )\n          *pchar_code = cmap13->cur_charcode;\n      }\n      else\n        gindex = 0;\n    }\n    else\n      gindex = tt_cmap13_char_map_binary( cmap, pchar_code, 1 );\n\n    return gindex;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap13_get_info( TT_CMap       cmap,\n                      TT_CMapInfo  *cmap_info )\n  {\n    FT_Byte*  p = cmap->data + 8;\n\n\n    cmap_info->format   = 13;\n    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_DEFINE_TT_CMAP(\n    tt_cmap13_class_rec,\n    sizeof ( TT_CMap13Rec ),\n\n    (FT_CMap_InitFunc)     tt_cmap13_init,\n    (FT_CMap_DoneFunc)     NULL,\n    (FT_CMap_CharIndexFunc)tt_cmap13_char_index,\n    (FT_CMap_CharNextFunc) tt_cmap13_char_next,\n\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n\n    13,\n    (TT_CMap_ValidateFunc)tt_cmap13_validate,\n    (TT_CMap_Info_GetFunc)tt_cmap13_get_info )\n\n#endif /* TT_CONFIG_CMAP_FORMAT_13 */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                           FORMAT 14                           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* TABLE OVERVIEW                                                        */\n  /* --------------                                                        */\n  /*                                                                       */\n  /*   NAME         OFFSET  TYPE    DESCRIPTION                            */\n  /*                                                                       */\n  /*   format         0     USHORT  must be 14                             */\n  /*   length         2     ULONG   table length in bytes                  */\n  /*   numSelector    6     ULONG   number of variation sel. records       */\n  /*                                                                       */\n  /* Followed by numSelector records, each of which looks like             */\n  /*                                                                       */\n  /*   varSelector    0     UINT24  Unicode codepoint of sel.              */\n  /*   defaultOff     3     ULONG   offset to a default UVS table          */\n  /*                                describing any variants to be found in */\n  /*                                the normal Unicode subtable.           */\n  /*   nonDefOff      7     ULONG   offset to a non-default UVS table      */\n  /*                                describing any variants not in the     */\n  /*                                standard cmap, with GIDs here          */\n  /* (either offset may be 0 NULL)                                         */\n  /*                                                                       */\n  /* Selectors are sorted by code point.                                   */\n  /*                                                                       */\n  /* A default Unicode Variation Selector (UVS) subtable is just a list of */\n  /* ranges of code points which are to be found in the standard cmap.  No */\n  /* glyph IDs (GIDs) here.                                                */\n  /*                                                                       */\n  /*   numRanges      0     ULONG   number of ranges following             */\n  /*                                                                       */\n  /* A range looks like                                                    */\n  /*                                                                       */\n  /*   uniStart       0     UINT24  code point of the first character in   */\n  /*                                this range                             */\n  /*   additionalCnt  3     UBYTE   count of additional characters in this */\n  /*                                range (zero means a range of a single  */\n  /*                                character)                             */\n  /*                                                                       */\n  /* Ranges are sorted by `uniStart'.                                      */\n  /*                                                                       */\n  /* A non-default Unicode Variation Selector (UVS) subtable is a list of  */\n  /* mappings from codepoint to GID.                                       */\n  /*                                                                       */\n  /*   numMappings    0     ULONG   number of mappings                     */\n  /*                                                                       */\n  /* A range looks like                                                    */\n  /*                                                                       */\n  /*   uniStart       0     UINT24  code point of the first character in   */\n  /*                                this range                             */\n  /*   GID            3     USHORT  and its GID                            */\n  /*                                                                       */\n  /* Ranges are sorted by `uniStart'.                                      */\n\n#ifdef TT_CONFIG_CMAP_FORMAT_14\n\n  typedef struct  TT_CMap14Rec_\n  {\n    TT_CMapRec  cmap;\n    FT_ULong    num_selectors;\n\n    /* This array is used to store the results of various\n     * cmap 14 query functions.  The data is overwritten\n     * on each call to these functions.\n     */\n    FT_UInt32   max_results;\n    FT_UInt32*  results;\n    FT_Memory   memory;\n\n  } TT_CMap14Rec, *TT_CMap14;\n\n\n  FT_CALLBACK_DEF( void )\n  tt_cmap14_done( TT_CMap14  cmap )\n  {\n    FT_Memory  memory = cmap->memory;\n\n\n    cmap->max_results = 0;\n    if ( memory != NULL && cmap->results != NULL )\n      FT_FREE( cmap->results );\n  }\n\n\n  static FT_Error\n  tt_cmap14_ensure( TT_CMap14  cmap,\n                    FT_UInt32  num_results,\n                    FT_Memory  memory )\n  {\n    FT_UInt32  old_max = cmap->max_results;\n    FT_Error   error   = FT_Err_Ok;\n\n\n    if ( num_results > cmap->max_results )\n    {\n       cmap->memory = memory;\n\n       if ( FT_QRENEW_ARRAY( cmap->results, old_max, num_results ) )\n         return error;\n\n       cmap->max_results = num_results;\n    }\n\n    return error;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap14_init( TT_CMap14  cmap,\n                  FT_Byte*   table )\n  {\n    cmap->cmap.data = table;\n\n    table               += 6;\n    cmap->num_selectors  = FT_PEEK_ULONG( table );\n    cmap->max_results    = 0;\n    cmap->results        = NULL;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap14_validate( FT_Byte*      table,\n                      FT_Validator  valid )\n  {\n    FT_Byte*  p             = table + 2;\n    FT_ULong  length        = TT_NEXT_ULONG( p );\n    FT_ULong  num_selectors = TT_NEXT_ULONG( p );\n\n\n    if ( length > (FT_ULong)( valid->limit - table ) ||\n         length < 10 + 11 * num_selectors            )\n      FT_INVALID_TOO_SHORT;\n\n    /* check selectors, they must be in increasing order */\n    {\n      /* we start lastVarSel at 1 because a variant selector value of 0\n       * isn't valid.\n       */\n      FT_ULong  n, lastVarSel = 1;\n\n\n      for ( n = 0; n < num_selectors; n++ )\n      {\n        FT_ULong  varSel    = TT_NEXT_UINT24( p );\n        FT_ULong  defOff    = TT_NEXT_ULONG( p );\n        FT_ULong  nondefOff = TT_NEXT_ULONG( p );\n\n\n        if ( defOff >= length || nondefOff >= length )\n          FT_INVALID_TOO_SHORT;\n\n        if ( varSel < lastVarSel )\n          FT_INVALID_DATA;\n\n        lastVarSel = varSel + 1;\n\n        /* check the default table (these glyphs should be reached     */\n        /* through the normal Unicode cmap, no GIDs, just check order) */\n        if ( defOff != 0 )\n        {\n          FT_Byte*  defp      = table + defOff;\n          FT_ULong  numRanges = TT_NEXT_ULONG( defp );\n          FT_ULong  i;\n          FT_ULong  lastBase  = 0;\n\n\n          if ( defp + numRanges * 4 > valid->limit )\n            FT_INVALID_TOO_SHORT;\n\n          for ( i = 0; i < numRanges; ++i )\n          {\n            FT_ULong  base = TT_NEXT_UINT24( defp );\n            FT_ULong  cnt  = FT_NEXT_BYTE( defp );\n\n\n            if ( base + cnt >= 0x110000UL )              /* end of Unicode */\n              FT_INVALID_DATA;\n\n            if ( base < lastBase )\n              FT_INVALID_DATA;\n\n            lastBase = base + cnt + 1U;\n          }\n        }\n\n        /* and the non-default table (these glyphs are specified here) */\n        if ( nondefOff != 0 )\n        {\n          FT_Byte*  ndp         = table + nondefOff;\n          FT_ULong  numMappings = TT_NEXT_ULONG( ndp );\n          FT_ULong  i, lastUni  = 0;\n\n\n          if ( numMappings * 4 > (FT_ULong)( valid->limit - ndp ) )\n            FT_INVALID_TOO_SHORT;\n\n          for ( i = 0; i < numMappings; ++i )\n          {\n            FT_ULong  uni = TT_NEXT_UINT24( ndp );\n            FT_ULong  gid = TT_NEXT_USHORT( ndp );\n\n\n            if ( uni >= 0x110000UL )                     /* end of Unicode */\n              FT_INVALID_DATA;\n\n            if ( uni < lastUni )\n              FT_INVALID_DATA;\n\n            lastUni = uni + 1U;\n\n            if ( valid->level >= FT_VALIDATE_TIGHT    &&\n                 gid >= TT_VALID_GLYPH_COUNT( valid ) )\n              FT_INVALID_GLYPH_ID;\n          }\n        }\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  tt_cmap14_char_index( TT_CMap    cmap,\n                        FT_UInt32  char_code )\n  {\n    FT_UNUSED( cmap );\n    FT_UNUSED( char_code );\n\n    /* This can't happen */\n    return 0;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  tt_cmap14_char_next( TT_CMap     cmap,\n                       FT_UInt32  *pchar_code )\n  {\n    FT_UNUSED( cmap );\n\n    /* This can't happen */\n    *pchar_code = 0;\n    return 0;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap14_get_info( TT_CMap       cmap,\n                      TT_CMapInfo  *cmap_info )\n  {\n    FT_UNUSED( cmap );\n\n    cmap_info->format   = 14;\n    /* subtable 14 does not define a language field */\n    cmap_info->language = 0xFFFFFFFFUL;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_UInt\n  tt_cmap14_char_map_def_binary( FT_Byte    *base,\n                                 FT_UInt32   char_code )\n  {\n    FT_UInt32  numRanges = TT_PEEK_ULONG( base );\n    FT_UInt32  max, min;\n\n\n    min = 0;\n    max = numRanges;\n\n    base += 4;\n\n    /* binary search */\n    while ( min < max )\n    {\n      FT_UInt32  mid   = ( min + max ) >> 1;\n      FT_Byte*   p     = base + 4 * mid;\n      FT_ULong   start = TT_NEXT_UINT24( p );\n      FT_UInt    cnt   = FT_NEXT_BYTE( p );\n\n\n      if ( char_code < start )\n        max = mid;\n      else if ( char_code > start+cnt )\n        min = mid + 1;\n      else\n        return TRUE;\n    }\n\n    return FALSE;\n  }\n\n\n  static FT_UInt\n  tt_cmap14_char_map_nondef_binary( FT_Byte    *base,\n                                    FT_UInt32   char_code )\n  {\n    FT_UInt32  numMappings = TT_PEEK_ULONG( base );\n    FT_UInt32  max, min;\n\n\n    min = 0;\n    max = numMappings;\n\n    base += 4;\n\n    /* binary search */\n    while ( min < max )\n    {\n      FT_UInt32  mid = ( min + max ) >> 1;\n      FT_Byte*   p   = base + 5 * mid;\n      FT_UInt32  uni = (FT_UInt32)TT_NEXT_UINT24( p );\n\n\n      if ( char_code < uni )\n        max = mid;\n      else if ( char_code > uni )\n        min = mid + 1;\n      else\n        return TT_PEEK_USHORT( p );\n    }\n\n    return 0;\n  }\n\n\n  static FT_Byte*\n  tt_cmap14_find_variant( FT_Byte    *base,\n                          FT_UInt32   variantCode )\n  {\n    FT_UInt32  numVar = TT_PEEK_ULONG( base );\n    FT_UInt32  max, min;\n\n\n    min = 0;\n    max = numVar;\n\n    base += 4;\n\n    /* binary search */\n    while ( min < max )\n    {\n      FT_UInt32  mid    = ( min + max ) >> 1;\n      FT_Byte*   p      = base + 11 * mid;\n      FT_ULong   varSel = TT_NEXT_UINT24( p );\n\n\n      if ( variantCode < varSel )\n        max = mid;\n      else if ( variantCode > varSel )\n        min = mid + 1;\n      else\n        return p;\n    }\n\n    return NULL;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  tt_cmap14_char_var_index( TT_CMap    cmap,\n                            TT_CMap    ucmap,\n                            FT_UInt32  charcode,\n                            FT_UInt32  variantSelector )\n  {\n    FT_Byte*  p = tt_cmap14_find_variant( cmap->data + 6, variantSelector );\n    FT_ULong  defOff;\n    FT_ULong  nondefOff;\n\n\n    if ( !p )\n      return 0;\n\n    defOff    = TT_NEXT_ULONG( p );\n    nondefOff = TT_PEEK_ULONG( p );\n\n    if ( defOff != 0                                                    &&\n         tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) )\n    {\n      /* This is the default variant of this charcode.  GID not stored */\n      /* here; stored in the normal Unicode charmap instead.           */\n      return ucmap->cmap.clazz->char_index( &ucmap->cmap, charcode );\n    }\n\n    if ( nondefOff != 0 )\n      return tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,\n                                               charcode );\n\n    return 0;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Int )\n  tt_cmap14_char_var_isdefault( TT_CMap    cmap,\n                                FT_UInt32  charcode,\n                                FT_UInt32  variantSelector )\n  {\n    FT_Byte*  p = tt_cmap14_find_variant( cmap->data + 6, variantSelector );\n    FT_ULong  defOff;\n    FT_ULong  nondefOff;\n\n\n    if ( !p )\n      return -1;\n\n    defOff    = TT_NEXT_ULONG( p );\n    nondefOff = TT_NEXT_ULONG( p );\n\n    if ( defOff != 0                                                    &&\n         tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) )\n      return 1;\n\n    if ( nondefOff != 0                                            &&\n         tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,\n                                           charcode ) != 0         )\n      return 0;\n\n    return -1;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32* )\n  tt_cmap14_variants( TT_CMap    cmap,\n                      FT_Memory  memory )\n  {\n    TT_CMap14   cmap14 = (TT_CMap14)cmap;\n    FT_UInt32   count  = cmap14->num_selectors;\n    FT_Byte*    p      = cmap->data + 10;\n    FT_UInt32*  result;\n    FT_UInt32   i;\n\n\n    if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) )\n      return NULL;\n\n    result = cmap14->results;\n    for ( i = 0; i < count; ++i )\n    {\n      result[i] = (FT_UInt32)TT_NEXT_UINT24( p );\n      p        += 8;\n    }\n    result[i] = 0;\n\n    return result;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 * )\n  tt_cmap14_char_variants( TT_CMap    cmap,\n                           FT_Memory  memory,\n                           FT_UInt32  charCode )\n  {\n    TT_CMap14   cmap14 = (TT_CMap14)  cmap;\n    FT_UInt32   count  = cmap14->num_selectors;\n    FT_Byte*    p      = cmap->data + 10;\n    FT_UInt32*  q;\n\n\n    if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) )\n      return NULL;\n\n    for ( q = cmap14->results; count > 0; --count )\n    {\n      FT_UInt32  varSel    = TT_NEXT_UINT24( p );\n      FT_ULong   defOff    = TT_NEXT_ULONG( p );\n      FT_ULong   nondefOff = TT_NEXT_ULONG( p );\n\n\n      if ( ( defOff != 0                                               &&\n             tt_cmap14_char_map_def_binary( cmap->data + defOff,\n                                            charCode )                 ) ||\n           ( nondefOff != 0                                            &&\n             tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,\n                                               charCode ) != 0         ) )\n      {\n        q[0] = varSel;\n        q++;\n      }\n    }\n    q[0] = 0;\n\n    return cmap14->results;\n  }\n\n\n  static FT_UInt\n  tt_cmap14_def_char_count( FT_Byte  *p )\n  {\n    FT_UInt32  numRanges = (FT_UInt32)TT_NEXT_ULONG( p );\n    FT_UInt    tot       = 0;\n\n\n    p += 3;  /* point to the first `cnt' field */\n    for ( ; numRanges > 0; numRanges-- )\n    {\n      tot += 1 + p[0];\n      p   += 4;\n    }\n\n    return tot;\n  }\n\n\n  static FT_UInt32*\n  tt_cmap14_get_def_chars( TT_CMap    cmap,\n                           FT_Byte*   p,\n                           FT_Memory  memory )\n  {\n    TT_CMap14   cmap14 = (TT_CMap14) cmap;\n    FT_UInt32   numRanges;\n    FT_UInt     cnt;\n    FT_UInt32*  q;\n\n\n    cnt       = tt_cmap14_def_char_count( p );\n    numRanges = (FT_UInt32)TT_NEXT_ULONG( p );\n\n    if ( tt_cmap14_ensure( cmap14, ( cnt + 1 ), memory ) )\n      return NULL;\n\n    for ( q = cmap14->results; numRanges > 0; --numRanges )\n    {\n      FT_UInt32  uni = (FT_UInt32)TT_NEXT_UINT24( p );\n\n\n      cnt = FT_NEXT_BYTE( p ) + 1;\n      do\n      {\n        q[0]  = uni;\n        uni  += 1;\n        q    += 1;\n\n      } while ( --cnt != 0 );\n    }\n    q[0] = 0;\n\n    return cmap14->results;\n  }\n\n\n  static FT_UInt32*\n  tt_cmap14_get_nondef_chars( TT_CMap     cmap,\n                              FT_Byte    *p,\n                              FT_Memory   memory )\n  {\n    TT_CMap14   cmap14 = (TT_CMap14) cmap;\n    FT_UInt32   numMappings;\n    FT_UInt     i;\n    FT_UInt32  *ret;\n\n\n    numMappings = (FT_UInt32)TT_NEXT_ULONG( p );\n\n    if ( tt_cmap14_ensure( cmap14, ( numMappings + 1 ), memory ) )\n      return NULL;\n\n    ret = cmap14->results;\n    for ( i = 0; i < numMappings; ++i )\n    {\n      ret[i] = (FT_UInt32)TT_NEXT_UINT24( p );\n      p += 2;\n    }\n    ret[i] = 0;\n\n    return ret;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 * )\n  tt_cmap14_variant_chars( TT_CMap    cmap,\n                           FT_Memory  memory,\n                           FT_UInt32  variantSelector )\n  {\n    FT_Byte    *p  = tt_cmap14_find_variant( cmap->data + 6,\n                                             variantSelector );\n    FT_UInt32  *ret;\n    FT_Int      i;\n    FT_ULong    defOff;\n    FT_ULong    nondefOff;\n\n\n    if ( !p )\n      return NULL;\n\n    defOff    = TT_NEXT_ULONG( p );\n    nondefOff = TT_NEXT_ULONG( p );\n\n    if ( defOff == 0 && nondefOff == 0 )\n      return NULL;\n\n    if ( defOff == 0 )\n      return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff,\n                                         memory );\n    else if ( nondefOff == 0 )\n      return tt_cmap14_get_def_chars( cmap, cmap->data + defOff,\n                                      memory );\n    else\n    {\n      /* Both a default and a non-default glyph set?  That's probably not */\n      /* good font design, but the spec allows for it...                  */\n      TT_CMap14  cmap14 = (TT_CMap14) cmap;\n      FT_UInt32  numRanges;\n      FT_UInt32  numMappings;\n      FT_UInt32  duni;\n      FT_UInt32  dcnt;\n      FT_UInt32  nuni;\n      FT_Byte*   dp;\n      FT_UInt    di, ni, k;\n\n\n      p  = cmap->data + nondefOff;\n      dp = cmap->data + defOff;\n\n      numMappings = (FT_UInt32)TT_NEXT_ULONG( p );\n      dcnt        = tt_cmap14_def_char_count( dp );\n      numRanges   = (FT_UInt32)TT_NEXT_ULONG( dp );\n\n      if ( numMappings == 0 )\n        return tt_cmap14_get_def_chars( cmap, cmap->data + defOff,\n                                        memory );\n      if ( dcnt == 0 )\n        return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff,\n                                           memory );\n\n      if ( tt_cmap14_ensure( cmap14, ( dcnt + numMappings + 1 ), memory ) )\n        return NULL;\n\n      ret  = cmap14->results;\n      duni = (FT_UInt32)TT_NEXT_UINT24( dp );\n      dcnt = FT_NEXT_BYTE( dp );\n      di   = 1;\n      nuni = (FT_UInt32)TT_NEXT_UINT24( p );\n      p   += 2;\n      ni   = 1;\n      i    = 0;\n\n      for ( ;; )\n      {\n        if ( nuni > duni + dcnt )\n        {\n          for ( k = 0; k <= dcnt; ++k )\n            ret[i++] = duni + k;\n\n          ++di;\n\n          if ( di > numRanges )\n            break;\n\n          duni = (FT_UInt32)TT_NEXT_UINT24( dp );\n          dcnt = FT_NEXT_BYTE( dp );\n        }\n        else\n        {\n          if ( nuni < duni )\n            ret[i++] = nuni;\n          /* If it is within the default range then ignore it -- */\n          /* that should not have happened                       */\n          ++ni;\n          if ( ni > numMappings )\n            break;\n\n          nuni = (FT_UInt32)TT_NEXT_UINT24( p );\n          p += 2;\n        }\n      }\n\n      if ( ni <= numMappings )\n      {\n        /* If we get here then we have run out of all default ranges.   */\n        /* We have read one non-default mapping which we haven't stored */\n        /* and there may be others that need to be read.                */\n        ret[i++] = nuni;\n        while ( ni < numMappings )\n        {\n          ret[i++] = (FT_UInt32)TT_NEXT_UINT24( p );\n          p += 2;\n          ++ni;\n        }\n      }\n      else if ( di <= numRanges )\n      {\n        /* If we get here then we have run out of all non-default     */\n        /* mappings.  We have read one default range which we haven't */\n        /* stored and there may be others that need to be read.       */\n        for ( k = 0; k <= dcnt; ++k )\n          ret[i++] = duni + k;\n\n        while ( di < numRanges )\n        {\n          duni = (FT_UInt32)TT_NEXT_UINT24( dp );\n          dcnt = FT_NEXT_BYTE( dp );\n\n          for ( k = 0; k <= dcnt; ++k )\n            ret[i++] = duni + k;\n          ++di;\n        }\n      }\n\n      ret[i] = 0;\n\n      return ret;\n    }\n  }\n\n\n  FT_DEFINE_TT_CMAP(\n    tt_cmap14_class_rec,\n    sizeof ( TT_CMap14Rec ),\n\n    (FT_CMap_InitFunc)     tt_cmap14_init,\n    (FT_CMap_DoneFunc)     tt_cmap14_done,\n    (FT_CMap_CharIndexFunc)tt_cmap14_char_index,\n    (FT_CMap_CharNextFunc) tt_cmap14_char_next,\n\n    /* Format 14 extension functions */\n    (FT_CMap_CharVarIndexFunc)    tt_cmap14_char_var_index,\n    (FT_CMap_CharVarIsDefaultFunc)tt_cmap14_char_var_isdefault,\n    (FT_CMap_VariantListFunc)     tt_cmap14_variants,\n    (FT_CMap_CharVariantListFunc) tt_cmap14_char_variants,\n    (FT_CMap_VariantCharListFunc) tt_cmap14_variant_chars,\n\n    14,\n    (TT_CMap_ValidateFunc)tt_cmap14_validate,\n    (TT_CMap_Info_GetFunc)tt_cmap14_get_info )\n\n#endif /* TT_CONFIG_CMAP_FORMAT_14 */\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n  static const TT_CMap_Class  tt_cmap_classes[] =\n  {\n#define TTCMAPCITEM( a )  &a,\n#include \"ttcmapc.h\"\n    NULL,\n  };\n\n#else /*FT_CONFIG_OPTION_PIC*/\n\n  void\n  FT_Destroy_Class_tt_cmap_classes( FT_Library      library,\n                                    TT_CMap_Class*  clazz )\n  {\n    FT_Memory  memory = library->memory;\n\n\n    if ( clazz )\n      FT_FREE( clazz );\n  }\n\n\n  FT_Error\n  FT_Create_Class_tt_cmap_classes( FT_Library       library,\n                                   TT_CMap_Class**  output_class )\n  {\n    TT_CMap_Class*     clazz  = NULL;\n    TT_CMap_ClassRec*  recs;\n    FT_Error           error;\n    FT_Memory          memory = library->memory;\n\n    int  i = 0;\n\n\n#define TTCMAPCITEM( a ) i++;\n#include \"ttcmapc.h\"\n\n    /* allocate enough space for both the pointers */\n    /* plus terminator and the class instances     */\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * ( i + 1 ) +\n                          sizeof ( TT_CMap_ClassRec ) * i ) )\n      return error;\n\n    /* the location of the class instances follows the array of pointers */\n    recs = (TT_CMap_ClassRec*)( (char*)clazz +\n                                sizeof ( *clazz ) * ( i + 1 ) );\n    i    = 0;\n\n#undef TTCMAPCITEM\n#define  TTCMAPCITEM( a )             \\\n    FT_Init_Class_ ## a( &recs[i] );  \\\n    clazz[i] = &recs[i];              \\\n    i++;\n#include \"ttcmapc.h\"\n\n    clazz[i] = NULL;\n\n    *output_class = clazz;\n    return FT_Err_Ok;\n  }\n\n#endif /*FT_CONFIG_OPTION_PIC*/\n\n\n  /* parse the `cmap' table and build the corresponding TT_CMap objects */\n  /* in the current face                                                */\n  /*                                                                    */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_build_cmaps( TT_Face  face )\n  {\n    FT_Byte*           table = face->cmap_table;\n    FT_Byte*           limit = table + face->cmap_size;\n    FT_UInt volatile   num_cmaps;\n    FT_Byte* volatile  p     = table;\n    FT_Library         library = FT_FACE_LIBRARY( face );\n\n    FT_UNUSED( library );\n\n\n    if ( !p || p + 4 > limit )\n      return FT_THROW( Invalid_Table );\n\n    /* only recognize format 0 */\n    if ( TT_NEXT_USHORT( p ) != 0 )\n    {\n      p -= 2;\n      FT_ERROR(( \"tt_face_build_cmaps:\"\n                 \" unsupported `cmap' table format = %d\\n\",\n                 TT_PEEK_USHORT( p ) ));\n      return FT_THROW( Invalid_Table );\n    }\n\n    num_cmaps = TT_NEXT_USHORT( p );\n\n#ifdef FT_MAX_CHARMAP_CACHEABLE\n    if ( num_cmaps > FT_MAX_CHARMAP_CACHEABLE )\n      FT_ERROR(( \"tt_face_build_cmaps: too many cmap subtables (%d)\\n\"\n                 \"                     subtable #%d and higher are loaded\"\n                 \"                     but cannot be searched\\n\",\n                 num_cmaps, FT_MAX_CHARMAP_CACHEABLE + 1 ));\n#endif\n\n    for ( ; num_cmaps > 0 && p + 8 <= limit; num_cmaps-- )\n    {\n      FT_CharMapRec  charmap;\n      FT_UInt32      offset;\n\n\n      charmap.platform_id = TT_NEXT_USHORT( p );\n      charmap.encoding_id = TT_NEXT_USHORT( p );\n      charmap.face        = FT_FACE( face );\n      charmap.encoding    = FT_ENCODING_NONE;  /* will be filled later */\n      offset              = TT_NEXT_ULONG( p );\n\n      if ( offset && offset <= face->cmap_size - 2 )\n      {\n        FT_Byte* volatile              cmap   = table + offset;\n        volatile FT_UInt               format = TT_PEEK_USHORT( cmap );\n        const TT_CMap_Class* volatile  pclazz = TT_CMAP_CLASSES_GET;\n        TT_CMap_Class volatile         clazz;\n\n\n        for ( ; *pclazz; pclazz++ )\n        {\n          clazz = *pclazz;\n          if ( clazz->format == format )\n          {\n            volatile TT_ValidatorRec  valid;\n            volatile FT_Error         error = FT_Err_Ok;\n\n\n            ft_validator_init( FT_VALIDATOR( &valid ), cmap, limit,\n                               FT_VALIDATE_DEFAULT );\n\n            valid.num_glyphs = (FT_UInt)face->max_profile.numGlyphs;\n#ifndef _FX_MANAGED_CODE_\n            if ( ft_setjmp( FT_VALIDATOR( &valid )->jump_buffer) == 0 )\n            {\n#endif\n              /* validate this cmap sub-table */\n              error = clazz->validate( cmap, FT_VALIDATOR( &valid ) );\n#ifndef _FX_MANAGED_CODE_            \n\t\t\t}\n#endif\n\n            if ( valid.validator.error == 0 )\n            {\n              FT_CMap  ttcmap;\n\n\n              /* It might make sense to store the single variation         */\n              /* selector cmap somewhere special.  But it would have to be */\n              /* in the public FT_FaceRec, and we can't change that.       */\n\n              if ( !FT_CMap_New( (FT_CMap_Class)clazz,\n                                 cmap, &charmap, &ttcmap ) )\n              {\n                /* it is simpler to directly set `flags' than adding */\n                /* a parameter to FT_CMap_New                        */\n                ((TT_CMap)ttcmap)->flags = (FT_Int)error;\n              }\n            }\n            else\n            {\n              FT_TRACE0(( \"tt_face_build_cmaps:\"\n                          \" broken cmap sub-table ignored\\n\" ));\n            }\n            break;\n          }\n        }\n\n        if ( *pclazz == NULL )\n        {\n          FT_TRACE0(( \"tt_face_build_cmaps:\"\n                      \" unsupported cmap sub-table ignored\\n\" ));\n        }\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_LOCAL( FT_Error )\n  tt_get_cmap_info( FT_CharMap    charmap,\n                    TT_CMapInfo  *cmap_info )\n  {\n    FT_CMap        cmap  = (FT_CMap)charmap;\n    TT_CMap_Class  clazz = (TT_CMap_Class)cmap->clazz;\n\n\n    return clazz->get_cmap_info( charmap, cmap_info );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmap.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttcmap.h                                                               */\n/*                                                                         */\n/*    TrueType character mapping table (cmap) support (specification).     */\n/*                                                                         */\n/*  Copyright 2002-2005, 2009, 2012 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTCMAP_H__\n#define __TTCMAP_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/tttypes.h\"\n#include \"../../include/freetype/internal/ftvalid.h\"\n#include \"../../include/freetype/internal/services/svttcmap.h\"\n\nFT_BEGIN_HEADER\n\n\n#define TT_CMAP_FLAG_UNSORTED     1\n#define TT_CMAP_FLAG_OVERLAPPING  2\n\n  typedef struct  TT_CMapRec_\n  {\n    FT_CMapRec  cmap;\n    FT_Byte*    data;           /* pointer to in-memory cmap table */\n    FT_Int      flags;          /* for format 4 only               */\n\n  } TT_CMapRec, *TT_CMap;\n\n  typedef const struct TT_CMap_ClassRec_*  TT_CMap_Class;\n\n\n  typedef FT_Error\n  (*TT_CMap_ValidateFunc)( FT_Byte*      data,\n                           FT_Validator  valid );\n\n  typedef struct  TT_CMap_ClassRec_\n  {\n    FT_CMap_ClassRec      clazz;\n    FT_UInt               format;\n    TT_CMap_ValidateFunc  validate;\n    TT_CMap_Info_GetFunc  get_cmap_info;\n\n  } TT_CMap_ClassRec;\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_TT_CMAP( class_,             \\\n                           size_,              \\\n                           init_,              \\\n                           done_,              \\\n                           char_index_,        \\\n                           char_next_,         \\\n                           char_var_index_,    \\\n                           char_var_default_,  \\\n                           variant_list_,      \\\n                           charvariant_list_,  \\\n                           variantchar_list_,  \\\n                           format_,            \\\n                           validate_,          \\\n                           get_cmap_info_ )    \\\n  FT_CALLBACK_TABLE_DEF                        \\\n  const TT_CMap_ClassRec  class_ =             \\\n  {                                            \\\n    { size_,                                   \\\n      init_,                                   \\\n      done_,                                   \\\n      char_index_,                             \\\n      char_next_,                              \\\n      char_var_index_,                         \\\n      char_var_default_,                       \\\n      variant_list_,                           \\\n      charvariant_list_,                       \\\n      variantchar_list_                        \\\n    },                                         \\\n                                               \\\n    format_,                                   \\\n    validate_,                                 \\\n    get_cmap_info_                             \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_TT_CMAP( class_,                      \\\n                           size_,                       \\\n                           init_,                       \\\n                           done_,                       \\\n                           char_index_,                 \\\n                           char_next_,                  \\\n                           char_var_index_,             \\\n                           char_var_default_,           \\\n                           variant_list_,               \\\n                           charvariant_list_,           \\\n                           variantchar_list_,           \\\n                           format_,                     \\\n                           validate_,                   \\\n                           get_cmap_info_ )             \\\n  void                                                  \\\n  FT_Init_Class_ ## class_( TT_CMap_ClassRec*  clazz )  \\\n  {                                                     \\\n    clazz->clazz.size             = size_;              \\\n    clazz->clazz.init             = init_;              \\\n    clazz->clazz.done             = done_;              \\\n    clazz->clazz.char_index       = char_index_;        \\\n    clazz->clazz.char_next        = char_next_;         \\\n    clazz->clazz.char_var_index   = char_var_index_;    \\\n    clazz->clazz.char_var_default = char_var_default_;  \\\n    clazz->clazz.variant_list     = variant_list_;      \\\n    clazz->clazz.charvariant_list = charvariant_list_;  \\\n    clazz->clazz.variantchar_list = variantchar_list_;  \\\n    clazz->format                 = format_;            \\\n    clazz->validate               = validate_;          \\\n    clazz->get_cmap_info          = get_cmap_info_;     \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n  typedef struct  TT_ValidatorRec_\n  {\n    FT_ValidatorRec  validator;\n    FT_UInt          num_glyphs;\n\n  } TT_ValidatorRec, *TT_Validator;\n\n\n#define TT_VALIDATOR( x )          ( (TT_Validator)( x ) )\n#define TT_VALID_GLYPH_COUNT( x )  TT_VALIDATOR( x )->num_glyphs\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_build_cmaps( TT_Face  face );\n\n  /* used in tt-cmaps service */\n  FT_LOCAL( FT_Error )\n  tt_get_cmap_info( FT_CharMap    charmap,\n                    TT_CMapInfo  *cmap_info );\n\n\nFT_END_HEADER\n\n#endif /* __TTCMAP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmapc.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttcmapc.h                                                              */\n/*                                                                         */\n/*    TT CMAP classes definitions (specification only).                    */\n/*                                                                         */\n/*  Copyright 2009 by                                                      */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifdef TT_CONFIG_CMAP_FORMAT_0\n  TTCMAPCITEM( tt_cmap0_class_rec )\n#endif\n\n#ifdef TT_CONFIG_CMAP_FORMAT_2\n  TTCMAPCITEM( tt_cmap2_class_rec )\n#endif\n\n#ifdef TT_CONFIG_CMAP_FORMAT_4\n  TTCMAPCITEM( tt_cmap4_class_rec )\n#endif\n\n#ifdef TT_CONFIG_CMAP_FORMAT_6\n  TTCMAPCITEM( tt_cmap6_class_rec )\n#endif\n\n#ifdef TT_CONFIG_CMAP_FORMAT_8\n  TTCMAPCITEM( tt_cmap8_class_rec )\n#endif\n\n#ifdef TT_CONFIG_CMAP_FORMAT_10\n  TTCMAPCITEM( tt_cmap10_class_rec )\n#endif\n\n#ifdef TT_CONFIG_CMAP_FORMAT_12\n  TTCMAPCITEM( tt_cmap12_class_rec )\n#endif\n\n#ifdef TT_CONFIG_CMAP_FORMAT_13\n  TTCMAPCITEM( tt_cmap13_class_rec )\n#endif\n\n#ifdef TT_CONFIG_CMAP_FORMAT_14\n  TTCMAPCITEM( tt_cmap14_class_rec )\n#endif\n\n\n  /* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttkern.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttkern.c                                                               */\n/*                                                                         */\n/*    Load the basic TrueType kerning table.  This doesn't handle          */\n/*    kerning data within the GPOS table at the moment.                    */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 by */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/tttags.h\"\n#include \"ttkern.h\"\n\n#include \"sferrors.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttkern\n\n\n#undef  TT_KERN_INDEX\n#define TT_KERN_INDEX( g1, g2 )  ( ( (FT_ULong)(g1) << 16 ) | (g2) )\n\n\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_kern( TT_Face    face,\n                     FT_Stream  stream )\n  {\n    FT_Error   error;\n    FT_ULong   table_size;\n    FT_Byte*   p;\n    FT_Byte*   p_limit;\n    FT_UInt    nn, num_tables;\n    FT_UInt32  avail = 0, ordered = 0;\n\n\n    /* the kern table is optional; exit silently if it is missing */\n    error = face->goto_table( face, TTAG_kern, stream, &table_size );\n    if ( error )\n      goto Exit;\n\n    if ( table_size < 4 )  /* the case of a malformed table */\n    {\n      FT_ERROR(( \"tt_face_load_kern:\"\n                 \" kerning table is too small - ignored\\n\" ));\n      error = FT_THROW( Table_Missing );\n      goto Exit;\n    }\n\n    if ( FT_FRAME_EXTRACT( table_size, face->kern_table ) )\n    {\n      FT_ERROR(( \"tt_face_load_kern:\"\n                 \" could not extract kerning table\\n\" ));\n      goto Exit;\n    }\n\n    face->kern_table_size = table_size;\n\n    p       = face->kern_table;\n    p_limit = p + table_size;\n\n    p         += 2; /* skip version */\n    num_tables = FT_NEXT_USHORT( p );\n\n    if ( num_tables > 32 ) /* we only support up to 32 sub-tables */\n      num_tables = 32;\n\n    for ( nn = 0; nn < num_tables; nn++ )\n    {\n      FT_UInt    num_pairs, length, coverage;\n      FT_Byte*   p_next;\n      FT_UInt32  mask = (FT_UInt32)1UL << nn;\n\n\n      if ( p + 6 > p_limit )\n        break;\n\n      p_next = p;\n\n      p += 2; /* skip version */\n      length   = FT_NEXT_USHORT( p );\n      coverage = FT_NEXT_USHORT( p );\n\n      if ( length <= 6 )\n        break;\n\n      p_next += length;\n\n      if ( p_next > p_limit )  /* handle broken table */\n        p_next = p_limit;\n\n      /* only use horizontal kerning tables */\n      if ( ( coverage & ~8 ) != 0x0001 ||\n           p + 8 > p_limit             )\n        goto NextTable;\n\n      num_pairs = FT_NEXT_USHORT( p );\n      p        += 6;\n\n      if ( ( p_next - p ) < 6 * (int)num_pairs ) /* handle broken count */\n        num_pairs = (FT_UInt)( ( p_next - p ) / 6 );\n\n      avail |= mask;\n\n      /*\n       *  Now check whether the pairs in this table are ordered.\n       *  We then can use binary search.\n       */\n      if ( num_pairs > 0 )\n      {\n        FT_ULong  count;\n        FT_ULong  old_pair;\n\n\n        old_pair = FT_NEXT_ULONG( p );\n        p       += 2;\n\n        for ( count = num_pairs - 1; count > 0; count-- )\n        {\n          FT_UInt32  cur_pair;\n\n\n          cur_pair = FT_NEXT_ULONG( p );\n          if ( cur_pair <= old_pair )\n            break;\n\n          p += 2;\n          old_pair = cur_pair;\n        }\n\n        if ( count == 0 )\n          ordered |= mask;\n      }\n\n    NextTable:\n      p = p_next;\n    }\n\n    face->num_kern_tables = nn;\n    face->kern_avail_bits = avail;\n    face->kern_order_bits = ordered;\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  tt_face_done_kern( TT_Face  face )\n  {\n    FT_Stream  stream = face->root.stream;\n\n\n    FT_FRAME_RELEASE( face->kern_table );\n    face->kern_table_size = 0;\n    face->num_kern_tables = 0;\n    face->kern_avail_bits = 0;\n    face->kern_order_bits = 0;\n  }\n\n\n  FT_LOCAL_DEF( FT_Int )\n  tt_face_get_kerning( TT_Face  face,\n                       FT_UInt  left_glyph,\n                       FT_UInt  right_glyph )\n  {\n    FT_Int    result = 0;\n    FT_UInt   count, mask = 1;\n    FT_Byte*  p       = face->kern_table;\n    FT_Byte*  p_limit = p + face->kern_table_size;\n\n\n    p   += 4;\n    mask = 0x0001;\n\n    for ( count = face->num_kern_tables;\n          count > 0 && p + 6 <= p_limit;\n          count--, mask <<= 1 )\n    {\n      FT_Byte* base     = p;\n      FT_Byte* next     = base;\n      FT_UInt  version  = FT_NEXT_USHORT( p );\n      FT_UInt  length   = FT_NEXT_USHORT( p );\n      FT_UInt  coverage = FT_NEXT_USHORT( p );\n      FT_UInt  num_pairs;\n      FT_Int   value    = 0;\n\n      FT_UNUSED( version );\n\n\n      next = base + length;\n\n      if ( next > p_limit )  /* handle broken table */\n        next = p_limit;\n\n      if ( ( face->kern_avail_bits & mask ) == 0 )\n        goto NextTable;\n\n      if ( p + 8 > next )\n        goto NextTable;\n\n      num_pairs = FT_NEXT_USHORT( p );\n      p        += 6;\n\n      if ( ( next - p ) < 6 * (int)num_pairs )  /* handle broken count  */\n        num_pairs = (FT_UInt)( ( next - p ) / 6 );\n\n      switch ( coverage >> 8 )\n      {\n      case 0:\n        {\n          FT_ULong  key0 = TT_KERN_INDEX( left_glyph, right_glyph );\n\n\n          if ( face->kern_order_bits & mask )   /* binary search */\n          {\n            FT_UInt   min = 0;\n            FT_UInt   max = num_pairs;\n\n\n            while ( min < max )\n            {\n              FT_UInt   mid = ( min + max ) >> 1;\n              FT_Byte*  q   = p + 6 * mid;\n              FT_ULong  key;\n\n\n              key = FT_NEXT_ULONG( q );\n\n              if ( key == key0 )\n              {\n                value = FT_PEEK_SHORT( q );\n                goto Found;\n              }\n              if ( key < key0 )\n                min = mid + 1;\n              else\n                max = mid;\n            }\n          }\n          else /* linear search */\n          {\n            FT_UInt  count2;\n\n\n            for ( count2 = num_pairs; count2 > 0; count2-- )\n            {\n              FT_ULong  key = FT_NEXT_ULONG( p );\n\n\n              if ( key == key0 )\n              {\n                value = FT_PEEK_SHORT( p );\n                goto Found;\n              }\n              p += 2;\n            }\n          }\n        }\n        break;\n\n       /*\n        *  We don't support format 2 because we haven't seen a single font\n        *  using it in real life...\n        */\n\n      default:\n        ;\n      }\n\n      goto NextTable;\n\n    Found:\n      if ( coverage & 8 ) /* override or add */\n        result = value;\n      else\n        result += value;\n\n    NextTable:\n      p = next;\n    }\n\n    return result;\n  }\n\n#undef TT_KERN_INDEX\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttkern.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttkern.h                                                               */\n/*                                                                         */\n/*    Load the basic TrueType kerning table.  This doesn't handle          */\n/*    kerning data within the GPOS table at the moment.                    */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2005, 2007 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTKERN_H__\n#define __TTKERN_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/internal/tttypes.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( FT_Error  )\n  tt_face_load_kern( TT_Face    face,\n                     FT_Stream  stream );\n\n  FT_LOCAL( void )\n  tt_face_done_kern( TT_Face  face );\n\n  FT_LOCAL( FT_Int )\n  tt_face_get_kerning( TT_Face     face,\n                       FT_UInt     left_glyph,\n                       FT_UInt     right_glyph );\n\n#define TT_FACE_HAS_KERNING( face )  ( (face)->kern_avail_bits != 0 )\n\n\nFT_END_HEADER\n\n#endif /* __TTKERN_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttload.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttload.c                                                               */\n/*                                                                         */\n/*    Load the basic TrueType tables, i.e., tables that can be either in   */\n/*    TTF or OTF fonts (body).                                             */\n/*                                                                         */\n/*  Copyright 1996-2010, 2012, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/tttags.h\"\n#include \"ttload.h\"\n\n#include \"sferrors.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttload\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_lookup_table                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Looks for a TrueType table by name.                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A face object handle.                                      */\n  /*                                                                       */\n  /*    tag  :: The searched tag.                                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A pointer to the table directory entry.  0 if not found.           */\n  /*                                                                       */\n  FT_LOCAL_DEF( TT_Table  )\n  tt_face_get_nexttable(TT_Table first, TT_Table limit, TT_Table entry)\n  {\n\t  TT_Table temp = NULL;\n\t  if (!entry) return NULL;\n\n\t  for (; first < limit; first++){\n\t\t  if (entry->Offset + entry->Length <= first->Offset){\n\t\t\t  if (!temp || first->Offset < temp->Offset){\n\t\t\t\t  temp = first;\n\t\t\t  }\n\t\t  }\n\t  }\n\t  return temp;\n  }\n\n  FT_LOCAL_DEF( TT_Table  )\n  tt_face_lookup_table( TT_Face   face,\n                        FT_ULong  tag  )\n  {\n    TT_Table  entry;\n    TT_Table  limit;\n#ifdef FT_DEBUG_LEVEL_TRACE\n    FT_Bool   zero_length = FALSE;\n#endif\n\n\n    FT_TRACE4(( \"tt_face_lookup_table: %08p, `%c%c%c%c' -- \",\n                face,\n                (FT_Char)( tag >> 24 ),\n                (FT_Char)( tag >> 16 ),\n                (FT_Char)( tag >> 8  ),\n                (FT_Char)( tag       ) ));\n\n    entry = face->dir_tables;\n    limit = entry + face->num_tables;\n\n    for ( ; entry < limit; entry++ )\n    {\n      /* For compatibility with Windows, we consider    */\n      /* zero-length tables the same as missing tables. */\n      if ( entry->Tag == tag )\n      {\n        if ( entry->Length != 0 )\n        {\n          if (tag == TTAG_loca){\n\t\t\t  TT_Table next = tt_face_get_nexttable(face->dir_tables, limit, entry);\n\t\t\t  if (next && entry->Offset + entry->Length < next->Offset)\n\t\t\t\t  entry->Length = next->Offset - entry->Offset;\n\t\t  }\n          FT_TRACE4(( \"found table.\\n\" ));\n          return entry;\n        }\n#ifdef FT_DEBUG_LEVEL_TRACE\n        zero_length = TRUE;\n#endif\n      }\n    }\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n    if ( zero_length )\n      FT_TRACE4(( \"ignoring empty table\\n\" ));\n    else\n      FT_TRACE4(( \"could not find table\\n\" ));\n#endif\n\n    return NULL;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_goto_table                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Looks for a TrueType table by name, then seek a stream to it.      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A face object handle.                                    */\n  /*                                                                       */\n  /*    tag    :: The searched tag.                                        */\n  /*                                                                       */\n  /*    stream :: The stream to seek when the table is found.              */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    length :: The length of the table if found, undefined otherwise.   */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_goto_table( TT_Face    face,\n                      FT_ULong   tag,\n                      FT_Stream  stream,\n                      FT_ULong*  length )\n  {\n    TT_Table  table;\n    FT_Error  error = 0;\n\n\n    table = tt_face_lookup_table( face, tag );\n    if ( table )\n    {\n      if ( length )\n        *length = table->Length;\n\n      if ( FT_STREAM_SEEK( table->Offset ) )\n        goto Exit;\n    }\n    else\n      error = FT_THROW( Table_Missing );\n\n  Exit:\n    return error;\n  }\n\n\n  /* Here, we                                                         */\n  /*                                                                  */\n  /* - check that `num_tables' is valid (and adjust it if necessary)  */\n  /*                                                                  */\n  /* - look for a `head' table, check its size, and parse it to check */\n  /*   whether its `magic' field is correctly set                     */\n  /*                                                                  */\n  /* - errors (except errors returned by stream handling)             */\n  /*                                                                  */\n  /*     SFNT_Err_Unknown_File_Format:                                */\n  /*       no table is defined in directory, it is not sfnt-wrapped   */\n  /*       data                                                       */\n  /*     SFNT_Err_Table_Missing:                                      */\n  /*       table directory is valid, but essential tables             */\n  /*       (head/bhed/SING) are missing                               */\n  /*                                                                  */\n  static FT_Error\n  check_table_dir( SFNT_Header  sfnt,\n                   FT_Stream    stream )\n  {\n    FT_Error   error;\n    FT_UShort  nn, valid_entries = 0;\n    FT_UInt    has_head = 0, has_sing = 0, has_meta = 0;\n    FT_ULong   offset = sfnt->offset + 12;\n\n    static const FT_Frame_Field  table_dir_entry_fields[] =\n    {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  TT_TableRec\n\n      FT_FRAME_START( 16 ),\n        FT_FRAME_ULONG( Tag ),\n        FT_FRAME_ULONG( CheckSum ),\n        FT_FRAME_ULONG( Offset ),\n        FT_FRAME_ULONG( Length ),\n      FT_FRAME_END\n    };\n\n\n    if ( FT_STREAM_SEEK( offset ) )\n      goto Exit;\n\n    for ( nn = 0; nn < sfnt->num_tables; nn++ )\n    {\n      TT_TableRec  table;\n\n\n      if ( FT_STREAM_READ_FIELDS( table_dir_entry_fields, &table ) )\n      {\n        nn--;\n        FT_TRACE2(( \"check_table_dir:\"\n                    \" can read only %d table%s in font (instead of %d)\\n\",\n                    nn, nn == 1 ? \"\" : \"s\", sfnt->num_tables ));\n        sfnt->num_tables = nn;\n        break;\n      }\n\n      /* we ignore invalid tables */\n      if ( table.Offset + table.Length > stream->size )\n      {\n\t\t//BUGID: 53876, the cmap table is invalid, the font file couldn't be used.\n\t\tif (table.Tag == TTAG_cmap) break;\n        FT_TRACE2(( \"check_table_dir: table entry %d invalid\\n\", nn ));\n        continue;\n      }\n      else\n        valid_entries++;\n\n      if ( table.Tag == TTAG_head || table.Tag == TTAG_bhed )\n      {\n        FT_UInt32  magic;\n\n\n#ifndef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n        if ( table.Tag == TTAG_head )\n#endif\n          has_head = 1;\n\n        /*\n         * The table length should be 0x36, but certain font tools make it\n         * 0x38, so we will just check that it is greater.\n         *\n         * Note that according to the specification, the table must be\n         * padded to 32-bit lengths, but this doesn't apply to the value of\n         * its `Length' field!\n         *\n         */\n        if ( table.Length < 0x36 )\n        {\n          FT_TRACE2(( \"check_table_dir: `head' table too small\\n\" ));\n          error = FT_THROW( Table_Missing );\n          goto Exit;\n        }\n\n        if ( FT_STREAM_SEEK( table.Offset + 12 ) ||\n             FT_READ_ULONG( magic )              )\n          goto Exit;\n\n        if ( magic != 0x5F0F3CF5UL )\n        {\n          FT_TRACE2(( \"check_table_dir:\"\n                      \" no magic number found in `head' table\\n\"));\n          error = FT_THROW( Table_Missing );\n          goto Exit;\n        }\n\n        if ( FT_STREAM_SEEK( offset + ( nn + 1 ) * 16 ) )\n          goto Exit;\n      }\n      else if ( table.Tag == TTAG_SING )\n        has_sing = 1;\n      else if ( table.Tag == TTAG_META )\n        has_meta = 1;\n    }\n\n    sfnt->num_tables = valid_entries;\n\n    if ( sfnt->num_tables == 0 )\n    {\n      FT_TRACE2(( \"check_table_dir: no tables found\\n\" ));\n      error = FT_THROW( Unknown_File_Format );\n      goto Exit;\n    }\n\n    /* if `sing' and `meta' tables are present, there is no `head' table */\n    if ( has_head || ( has_sing && has_meta ) )\n    {\n      error = FT_Err_Ok;\n      goto Exit;\n    }\n    else\n    {\n      FT_TRACE2(( \"check_table_dir:\" ));\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n      FT_TRACE2(( \" neither `head', `bhed', nor `sing' table found\\n\" ));\n#else\n      FT_TRACE2(( \" neither `head' nor `sing' table found\\n\" ));\n#endif\n      error = FT_THROW( Table_Missing );\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_font_dir                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads the header of a SFNT font file.                              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face       :: A handle to the target face object.                  */\n  /*                                                                       */\n  /*    stream     :: The input stream.                                    */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    sfnt       :: The SFNT header.                                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The stream cursor must be at the beginning of the font directory.  */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_font_dir( TT_Face    face,\n                         FT_Stream  stream )\n  {\n    SFNT_HeaderRec  sfnt;\n    FT_Error        error;\n    FT_Memory       memory = stream->memory;\n    TT_TableRec*    entry;\n    FT_Int          nn;\n\n    static const FT_Frame_Field  offset_table_fields[] =\n    {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  SFNT_HeaderRec\n\n      FT_FRAME_START( 8 ),\n        FT_FRAME_USHORT( num_tables ),\n        FT_FRAME_USHORT( search_range ),\n        FT_FRAME_USHORT( entry_selector ),\n        FT_FRAME_USHORT( range_shift ),\n      FT_FRAME_END\n    };\n\n\n    FT_TRACE2(( \"tt_face_load_font_dir: %08p\\n\", face ));\n\n    /* read the offset table */\n\n    sfnt.offset = FT_STREAM_POS();\n\n    if ( FT_READ_ULONG( sfnt.format_tag )                    ||\n         FT_STREAM_READ_FIELDS( offset_table_fields, &sfnt ) )\n      goto Exit;\n\n    /* many fonts don't have these fields set correctly */\n#if 0\n    if ( sfnt.search_range != 1 << ( sfnt.entry_selector + 4 )        ||\n         sfnt.search_range + sfnt.range_shift != sfnt.num_tables << 4 )\n      return FT_THROW( Unknown_File_Format );\n#endif\n\n    /* load the table directory */\n\n    FT_TRACE2(( \"-- Number of tables: %10u\\n\",    sfnt.num_tables ));\n    FT_TRACE2(( \"-- Format version:   0x%08lx\\n\", sfnt.format_tag ));\n\n    if ( sfnt.format_tag != TTAG_OTTO )\n    {\n      /* check first */\n      error = check_table_dir( &sfnt, stream );\n      if ( error )\n      {\n        FT_TRACE2(( \"tt_face_load_font_dir:\"\n                    \" invalid table directory for TrueType\\n\" ));\n\n        goto Exit;\n      }\n    }\n\n    face->num_tables = sfnt.num_tables;\n    face->format_tag = sfnt.format_tag;\n\n    if ( FT_QNEW_ARRAY( face->dir_tables, face->num_tables ) )\n      goto Exit;\n\n    if ( FT_STREAM_SEEK( sfnt.offset + 12 )       ||\n         FT_FRAME_ENTER( face->num_tables * 16L ) )\n      goto Exit;\n\n    entry = face->dir_tables;\n\n    FT_TRACE2(( \"\\n\"\n                \"  tag    offset    length   checksum\\n\"\n                \"  ----------------------------------\\n\" ));\n\n    for ( nn = 0; nn < sfnt.num_tables; nn++ )\n    {\n      entry->Tag      = FT_GET_TAG4();\n      entry->CheckSum = FT_GET_ULONG();\n      entry->Offset   = FT_GET_LONG();\n      entry->Length   = FT_GET_LONG();\n\n      /* ignore invalid tables */\n      if ( entry->Offset + entry->Length > stream->size )\n        continue;\n      else\n      {\n        FT_TRACE2(( \"  %c%c%c%c  %08lx  %08lx  %08lx\\n\",\n                    (FT_Char)( entry->Tag >> 24 ),\n                    (FT_Char)( entry->Tag >> 16 ),\n                    (FT_Char)( entry->Tag >> 8  ),\n                    (FT_Char)( entry->Tag       ),\n                    entry->Offset,\n                    entry->Length,\n                    entry->CheckSum ));\n        entry++;\n      }\n    }\n\n    FT_FRAME_EXIT();\n\n    FT_TRACE2(( \"table directory loaded\\n\\n\" ));\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_any                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads any font table into client memory.                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: The face object to look for.                             */\n  /*                                                                       */\n  /*    tag    :: The tag of table to load.  Use the value 0 if you want   */\n  /*              to access the whole font file, else set this parameter   */\n  /*              to a valid TrueType table tag that you can forge with    */\n  /*              the MAKE_TT_TAG macro.                                   */\n  /*                                                                       */\n  /*    offset :: The starting offset in the table (or the file if         */\n  /*              tag == 0).                                               */\n  /*                                                                       */\n  /*    length :: The address of the decision variable:                    */\n  /*                                                                       */\n  /*                If length == NULL:                                     */\n  /*                  Loads the whole table.  Returns an error if          */\n  /*                  `offset' == 0!                                       */\n  /*                                                                       */\n  /*                If *length == 0:                                       */\n  /*                  Exits immediately; returning the length of the given */\n  /*                  table or of the font file, depending on the value of */\n  /*                  `tag'.                                               */\n  /*                                                                       */\n  /*                If *length != 0:                                       */\n  /*                  Loads the next `length' bytes of table or font,      */\n  /*                  starting at offset `offset' (in table or font too).  */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    buffer :: The address of target buffer.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_any( TT_Face    face,\n                    FT_ULong   tag,\n                    FT_Long    offset,\n                    FT_Byte*   buffer,\n                    FT_ULong*  length )\n  {\n    FT_Error   error;\n    FT_Stream  stream;\n    TT_Table   table;\n    FT_ULong   size;\n\n\n    if ( tag != 0 )\n    {\n      /* look for tag in font directory */\n      table = tt_face_lookup_table( face, tag );\n      if ( !table )\n      {\n        error = FT_THROW( Table_Missing );\n        goto Exit;\n      }\n\n      offset += table->Offset;\n      size    = table->Length;\n    }\n    else\n      /* tag == 0 -- the user wants to access the font file directly */\n      size = face->root.stream->size;\n\n    if ( length && *length == 0 )\n    {\n      *length = size;\n\n      return FT_Err_Ok;\n    }\n\n    if ( length )\n      size = *length;\n\n    stream = face->root.stream;\n    /* the `if' is syntactic sugar for picky compilers */\n    if ( FT_STREAM_READ_AT( offset, buffer, size ) )\n      goto Exit;\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_generic_header                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads the TrueType table `head' or `bhed'.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /*    stream :: The input stream.                                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  static FT_Error\n  tt_face_load_generic_header( TT_Face    face,\n                               FT_Stream  stream,\n                               FT_ULong   tag )\n  {\n    FT_Error    error;\n    TT_Header*  header;\n\n    static const FT_Frame_Field  header_fields[] =\n    {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  TT_Header\n\n      FT_FRAME_START( 54 ),\n        FT_FRAME_ULONG ( Table_Version ),\n        FT_FRAME_ULONG ( Font_Revision ),\n        FT_FRAME_LONG  ( CheckSum_Adjust ),\n        FT_FRAME_LONG  ( Magic_Number ),\n        FT_FRAME_USHORT( Flags ),\n        FT_FRAME_USHORT( Units_Per_EM ),\n        FT_FRAME_LONG  ( Created[0] ),\n        FT_FRAME_LONG  ( Created[1] ),\n        FT_FRAME_LONG  ( Modified[0] ),\n        FT_FRAME_LONG  ( Modified[1] ),\n        FT_FRAME_SHORT ( xMin ),\n        FT_FRAME_SHORT ( yMin ),\n        FT_FRAME_SHORT ( xMax ),\n        FT_FRAME_SHORT ( yMax ),\n        FT_FRAME_USHORT( Mac_Style ),\n        FT_FRAME_USHORT( Lowest_Rec_PPEM ),\n        FT_FRAME_SHORT ( Font_Direction ),\n        FT_FRAME_SHORT ( Index_To_Loc_Format ),\n        FT_FRAME_SHORT ( Glyph_Data_Format ),\n      FT_FRAME_END\n    };\n\n\n    error = face->goto_table( face, tag, stream, 0 );\n    if ( error )\n      goto Exit;\n\n    header = &face->header;\n\n    if ( FT_STREAM_READ_FIELDS( header_fields, header ) )\n      goto Exit;\n\n    FT_TRACE3(( \"Units per EM: %4u\\n\", header->Units_Per_EM ));\n    FT_TRACE3(( \"IndexToLoc:   %4d\\n\", header->Index_To_Loc_Format ));\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_head( TT_Face    face,\n                     FT_Stream  stream )\n  {\n    return tt_face_load_generic_header( face, stream, TTAG_head );\n  }\n\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_bhed( TT_Face    face,\n                     FT_Stream  stream )\n  {\n    return tt_face_load_generic_header( face, stream, TTAG_bhed );\n  }\n\n#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_max_profile                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads the maximum profile into a face object.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /*    stream :: The input stream.                                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_maxp( TT_Face    face,\n                     FT_Stream  stream )\n  {\n    FT_Error        error;\n    TT_MaxProfile*  maxProfile = &face->max_profile;\n\n    static const FT_Frame_Field  maxp_fields[] =\n    {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  TT_MaxProfile\n\n      FT_FRAME_START( 6 ),\n        FT_FRAME_LONG  ( version ),\n        FT_FRAME_USHORT( numGlyphs ),\n      FT_FRAME_END\n    };\n\n    static const FT_Frame_Field  maxp_fields_extra[] =\n    {\n      FT_FRAME_START( 26 ),\n        FT_FRAME_USHORT( maxPoints ),\n        FT_FRAME_USHORT( maxContours ),\n        FT_FRAME_USHORT( maxCompositePoints ),\n        FT_FRAME_USHORT( maxCompositeContours ),\n        FT_FRAME_USHORT( maxZones ),\n        FT_FRAME_USHORT( maxTwilightPoints ),\n        FT_FRAME_USHORT( maxStorage ),\n        FT_FRAME_USHORT( maxFunctionDefs ),\n        FT_FRAME_USHORT( maxInstructionDefs ),\n        FT_FRAME_USHORT( maxStackElements ),\n        FT_FRAME_USHORT( maxSizeOfInstructions ),\n        FT_FRAME_USHORT( maxComponentElements ),\n        FT_FRAME_USHORT( maxComponentDepth ),\n      FT_FRAME_END\n    };\n\n\n    error = face->goto_table( face, TTAG_maxp, stream, 0 );\n    if ( error )\n      goto Exit;\n\n    if ( FT_STREAM_READ_FIELDS( maxp_fields, maxProfile ) )\n      goto Exit;\n\n    maxProfile->maxPoints             = 0;\n    maxProfile->maxContours           = 0;\n    maxProfile->maxCompositePoints    = 0;\n    maxProfile->maxCompositeContours  = 0;\n    maxProfile->maxZones              = 0;\n    maxProfile->maxTwilightPoints     = 0;\n    maxProfile->maxStorage            = 0;\n    maxProfile->maxFunctionDefs       = 0;\n    maxProfile->maxInstructionDefs    = 0;\n    maxProfile->maxStackElements      = 0;\n    maxProfile->maxSizeOfInstructions = 0;\n    maxProfile->maxComponentElements  = 0;\n    maxProfile->maxComponentDepth     = 0;\n\n    if ( maxProfile->version >= 0x10000L )\n    {\n      if ( FT_STREAM_READ_FIELDS( maxp_fields_extra, maxProfile ) )\n        goto Exit;\n\n      /* XXX: an adjustment that is necessary to load certain */\n      /*      broken fonts like `Keystrokes MT' :-(           */\n      /*                                                      */\n      /*   We allocate 64 function entries by default when    */\n      /*   the maxFunctionDefs value is smaller.              */\n\n      if ( maxProfile->maxFunctionDefs < 64 )\n        maxProfile->maxFunctionDefs = 64;\n\n      /* we add 4 phantom points later */\n      if ( maxProfile->maxTwilightPoints > ( 0xFFFFU - 4 ) )\n      {\n        FT_TRACE0(( \"tt_face_load_maxp:\"\n                    \" too much twilight points in `maxp' table;\\n\"\n                    \"                  \"\n                    \" some glyphs might be rendered incorrectly\\n\" ));\n\n        maxProfile->maxTwilightPoints = 0xFFFFU - 4;\n      }\n\n      /* we arbitrarily limit recursion to avoid stack exhaustion */\n      if ( maxProfile->maxComponentDepth > 100 )\n      {\n        FT_TRACE0(( \"tt_face_load_maxp:\"\n                    \" abnormally large component depth (%d) set to 100\\n\",\n                    maxProfile->maxComponentDepth ));\n        maxProfile->maxComponentDepth = 100;\n      }\n    }\n\n    FT_TRACE3(( \"numGlyphs: %u\\n\", maxProfile->numGlyphs ));\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_name                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads the name records.                                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /*    stream :: The input stream.                                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_name( TT_Face    face,\n                     FT_Stream  stream )\n  {\n    FT_Error      error;\n    FT_Memory     memory = stream->memory;\n    FT_ULong      table_pos, table_len;\n    FT_ULong      storage_start, storage_limit;\n    FT_UInt       count;\n    TT_NameTable  table;\n\n    static const FT_Frame_Field  name_table_fields[] =\n    {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  TT_NameTableRec\n\n      FT_FRAME_START( 6 ),\n        FT_FRAME_USHORT( format ),\n        FT_FRAME_USHORT( numNameRecords ),\n        FT_FRAME_USHORT( storageOffset ),\n      FT_FRAME_END\n    };\n\n    static const FT_Frame_Field  name_record_fields[] =\n    {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  TT_NameEntryRec\n\n      /* no FT_FRAME_START */\n        FT_FRAME_USHORT( platformID ),\n        FT_FRAME_USHORT( encodingID ),\n        FT_FRAME_USHORT( languageID ),\n        FT_FRAME_USHORT( nameID ),\n        FT_FRAME_USHORT( stringLength ),\n        FT_FRAME_USHORT( stringOffset ),\n      FT_FRAME_END\n    };\n\n\n    table         = &face->name_table;\n    table->stream = stream;\n\n    error = face->goto_table( face, TTAG_name, stream, &table_len );\n    if ( error )\n      goto Exit;\n\n    table_pos = FT_STREAM_POS();\n\n\n    if ( FT_STREAM_READ_FIELDS( name_table_fields, table ) )\n      goto Exit;\n\n    /* Some popular Asian fonts have an invalid `storageOffset' value   */\n    /* (it should be at least \"6 + 12*num_names\").  However, the string */\n    /* offsets, computed as \"storageOffset + entry->stringOffset\", are  */\n    /* valid pointers within the name table...                          */\n    /*                                                                  */\n    /* We thus can't check `storageOffset' right now.                   */\n    /*                                                                  */\n    storage_start = table_pos + 6 + 12*table->numNameRecords;\n    storage_limit = table_pos + table_len;\n\n    if ( storage_start > storage_limit )\n    {\n      FT_ERROR(( \"tt_face_load_name: invalid `name' table\\n\" ));\n      error = FT_THROW( Name_Table_Missing );\n      goto Exit;\n    }\n\n    /* Allocate the array of name records. */\n    count                 = table->numNameRecords;\n    table->numNameRecords = 0;\n\n    if ( FT_NEW_ARRAY( table->names, count ) ||\n         FT_FRAME_ENTER( count * 12 )        )\n      goto Exit;\n\n    /* Load the name records and determine how much storage is needed */\n    /* to hold the strings themselves.                                */\n    {\n      TT_NameEntryRec*  entry = table->names;\n\n\n      for ( ; count > 0; count-- )\n      {\n        if ( FT_STREAM_READ_FIELDS( name_record_fields, entry ) )\n          continue;\n\n        /* check that the name is not empty */\n        if ( entry->stringLength == 0 )\n          continue;\n\n        /* check that the name string is within the table */\n        entry->stringOffset += table_pos + table->storageOffset;\n        if ( entry->stringOffset                       < storage_start ||\n             entry->stringOffset + entry->stringLength > storage_limit )\n        {\n          /* invalid entry - ignore it */\n          entry->stringOffset = 0;\n          entry->stringLength = 0;\n          continue;\n        }\n\n        entry++;\n      }\n\n      table->numNameRecords = (FT_UInt)( entry - table->names );\n    }\n\n    FT_FRAME_EXIT();\n\n    /* everything went well, update face->num_names */\n    face->num_names = (FT_UShort) table->numNameRecords;\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_free_names                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Frees the name records.                                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to the target face object.                        */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  tt_face_free_name( TT_Face  face )\n  {\n    FT_Memory     memory = face->root.driver->root.memory;\n    TT_NameTable  table  = &face->name_table;\n    TT_NameEntry  entry  = table->names;\n    FT_UInt       count  = table->numNameRecords;\n\n\n    if ( table->names )\n    {\n      for ( ; count > 0; count--, entry++ )\n      {\n        FT_FREE( entry->string );\n        entry->stringLength = 0;\n      }\n\n      /* free strings table */\n      FT_FREE( table->names );\n    }\n\n    table->numNameRecords = 0;\n    table->format         = 0;\n    table->storageOffset  = 0;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_cmap                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads the cmap directory in a face object.  The cmaps themselves   */\n  /*    are loaded on demand in the `ttcmap.c' module.                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /*    stream :: A handle to the input stream.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_cmap( TT_Face    face,\n                     FT_Stream  stream )\n  {\n    FT_Error  error;\n\n\n    error = face->goto_table( face, TTAG_cmap, stream, &face->cmap_size );\n    if ( error )\n      goto Exit;\n\n    if ( FT_FRAME_EXTRACT( face->cmap_size, face->cmap_table ) )\n      face->cmap_size = 0;\n\n  Exit:\n    return error;\n  }\n\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_os2                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads the OS2 table.                                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /*    stream :: A handle to the input stream.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_os2( TT_Face    face,\n                    FT_Stream  stream )\n  {\n    FT_Error  error;\n    TT_OS2*   os2;\n\n    static const FT_Frame_Field  os2_fields[] =\n    {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  TT_OS2\n\n      FT_FRAME_START( 78 ),\n        FT_FRAME_USHORT( version ),\n        FT_FRAME_SHORT ( xAvgCharWidth ),\n        FT_FRAME_USHORT( usWeightClass ),\n        FT_FRAME_USHORT( usWidthClass ),\n        FT_FRAME_SHORT ( fsType ),\n        FT_FRAME_SHORT ( ySubscriptXSize ),\n        FT_FRAME_SHORT ( ySubscriptYSize ),\n        FT_FRAME_SHORT ( ySubscriptXOffset ),\n        FT_FRAME_SHORT ( ySubscriptYOffset ),\n        FT_FRAME_SHORT ( ySuperscriptXSize ),\n        FT_FRAME_SHORT ( ySuperscriptYSize ),\n        FT_FRAME_SHORT ( ySuperscriptXOffset ),\n        FT_FRAME_SHORT ( ySuperscriptYOffset ),\n        FT_FRAME_SHORT ( yStrikeoutSize ),\n        FT_FRAME_SHORT ( yStrikeoutPosition ),\n        FT_FRAME_SHORT ( sFamilyClass ),\n        FT_FRAME_BYTE  ( panose[0] ),\n        FT_FRAME_BYTE  ( panose[1] ),\n        FT_FRAME_BYTE  ( panose[2] ),\n        FT_FRAME_BYTE  ( panose[3] ),\n        FT_FRAME_BYTE  ( panose[4] ),\n        FT_FRAME_BYTE  ( panose[5] ),\n        FT_FRAME_BYTE  ( panose[6] ),\n        FT_FRAME_BYTE  ( panose[7] ),\n        FT_FRAME_BYTE  ( panose[8] ),\n        FT_FRAME_BYTE  ( panose[9] ),\n        FT_FRAME_ULONG ( ulUnicodeRange1 ),\n        FT_FRAME_ULONG ( ulUnicodeRange2 ),\n        FT_FRAME_ULONG ( ulUnicodeRange3 ),\n        FT_FRAME_ULONG ( ulUnicodeRange4 ),\n        FT_FRAME_BYTE  ( achVendID[0] ),\n        FT_FRAME_BYTE  ( achVendID[1] ),\n        FT_FRAME_BYTE  ( achVendID[2] ),\n        FT_FRAME_BYTE  ( achVendID[3] ),\n\n        FT_FRAME_USHORT( fsSelection ),\n        FT_FRAME_USHORT( usFirstCharIndex ),\n        FT_FRAME_USHORT( usLastCharIndex ),\n        FT_FRAME_SHORT ( sTypoAscender ),\n        FT_FRAME_SHORT ( sTypoDescender ),\n        FT_FRAME_SHORT ( sTypoLineGap ),\n        FT_FRAME_USHORT( usWinAscent ),\n        FT_FRAME_USHORT( usWinDescent ),\n      FT_FRAME_END\n    };\n\n    static const FT_Frame_Field  os2_fields_extra[] =\n    {\n      FT_FRAME_START( 8 ),\n        FT_FRAME_ULONG( ulCodePageRange1 ),\n        FT_FRAME_ULONG( ulCodePageRange2 ),\n      FT_FRAME_END\n    };\n\n    static const FT_Frame_Field  os2_fields_extra2[] =\n    {\n      FT_FRAME_START( 10 ),\n        FT_FRAME_SHORT ( sxHeight ),\n        FT_FRAME_SHORT ( sCapHeight ),\n        FT_FRAME_USHORT( usDefaultChar ),\n        FT_FRAME_USHORT( usBreakChar ),\n        FT_FRAME_USHORT( usMaxContext ),\n      FT_FRAME_END\n    };\n\n\n    /* We now support old Mac fonts where the OS/2 table doesn't  */\n    /* exist.  Simply put, we set the `version' field to 0xFFFF   */\n    /* and test this value each time we need to access the table. */\n    error = face->goto_table( face, TTAG_OS2, stream, 0 );\n    if ( error )\n      goto Exit;\n\n    os2 = &face->os2;\n\n    if ( FT_STREAM_READ_FIELDS( os2_fields, os2 ) )\n      goto Exit;\n\n    os2->ulCodePageRange1 = 0;\n    os2->ulCodePageRange2 = 0;\n    os2->sxHeight         = 0;\n    os2->sCapHeight       = 0;\n    os2->usDefaultChar    = 0;\n    os2->usBreakChar      = 0;\n    os2->usMaxContext     = 0;\n\n    if ( os2->version >= 0x0001 )\n    {\n      /* only version 1 tables */\n      if ( FT_STREAM_READ_FIELDS( os2_fields_extra, os2 ) )\n        goto Exit;\n\n      if ( os2->version >= 0x0002 )\n      {\n        /* only version 2 tables */\n        if ( FT_STREAM_READ_FIELDS( os2_fields_extra2, os2 ) )\n          goto Exit;\n      }\n    }\n\n    FT_TRACE3(( \"sTypoAscender:  %4d\\n\",   os2->sTypoAscender ));\n    FT_TRACE3(( \"sTypoDescender: %4d\\n\",   os2->sTypoDescender ));\n    FT_TRACE3(( \"usWinAscent:    %4u\\n\",   os2->usWinAscent ));\n    FT_TRACE3(( \"usWinDescent:   %4u\\n\",   os2->usWinDescent ));\n    FT_TRACE3(( \"fsSelection:    0x%2x\\n\", os2->fsSelection ));\n\n  Exit:\n     /*return error;*/\n\treturn 0;\t/* XYQ 2007-11-23 We can't just quit if OS/2 table can't be loaded.\n\t\t\t\tTESTDOC: Bug #3160 - MyDoc.pdf */\n\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_postscript                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads the Postscript table.                                        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /*    stream :: A handle to the input stream.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_post( TT_Face    face,\n                     FT_Stream  stream )\n  {\n    FT_Error        error;\n    TT_Postscript*  post = &face->postscript;\n\n    static const FT_Frame_Field  post_fields[] =\n    {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  TT_Postscript\n\n      FT_FRAME_START( 32 ),\n        FT_FRAME_ULONG( FormatType ),\n        FT_FRAME_ULONG( italicAngle ),\n        FT_FRAME_SHORT( underlinePosition ),\n        FT_FRAME_SHORT( underlineThickness ),\n        FT_FRAME_ULONG( isFixedPitch ),\n        FT_FRAME_ULONG( minMemType42 ),\n        FT_FRAME_ULONG( maxMemType42 ),\n        FT_FRAME_ULONG( minMemType1 ),\n        FT_FRAME_ULONG( maxMemType1 ),\n      FT_FRAME_END\n    };\n\n\n    error = face->goto_table( face, TTAG_post, stream, 0 );\n    if ( error )\n      return error;\n\n    if ( FT_STREAM_READ_FIELDS( post_fields, post ) )\n      return error;\n\n    /* we don't load the glyph names, we do that in another */\n    /* module (ttpost).                                     */\n\n    FT_TRACE3(( \"FormatType:   0x%x\\n\", post->FormatType ));\n    FT_TRACE3(( \"isFixedPitch:   %s\\n\", post->isFixedPitch\n                                        ? \"  yes\" : \"   no\" ));\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_pclt                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads the PCL 5 Table.                                             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /*    stream :: A handle to the input stream.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_pclt( TT_Face    face,\n                     FT_Stream  stream )\n  {\n    static const FT_Frame_Field  pclt_fields[] =\n    {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  TT_PCLT\n\n      FT_FRAME_START( 54 ),\n        FT_FRAME_ULONG ( Version ),\n        FT_FRAME_ULONG ( FontNumber ),\n        FT_FRAME_USHORT( Pitch ),\n        FT_FRAME_USHORT( xHeight ),\n        FT_FRAME_USHORT( Style ),\n        FT_FRAME_USHORT( TypeFamily ),\n        FT_FRAME_USHORT( CapHeight ),\n        FT_FRAME_BYTES ( TypeFace, 16 ),\n        FT_FRAME_BYTES ( CharacterComplement, 8 ),\n        FT_FRAME_BYTES ( FileName, 6 ),\n        FT_FRAME_CHAR  ( StrokeWeight ),\n        FT_FRAME_CHAR  ( WidthType ),\n        FT_FRAME_BYTE  ( SerifStyle ),\n        FT_FRAME_BYTE  ( Reserved ),\n      FT_FRAME_END\n    };\n\n    FT_Error  error;\n    TT_PCLT*  pclt = &face->pclt;\n\n\n    /* optional table */\n    error = face->goto_table( face, TTAG_PCLT, stream, 0 );\n    if ( error )\n      goto Exit;\n\n    if ( FT_STREAM_READ_FIELDS( pclt_fields, pclt ) )\n      goto Exit;\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_gasp                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads the `gasp' table into a face object.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /*    stream :: The input stream.                                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_gasp( TT_Face    face,\n                     FT_Stream  stream )\n  {\n    FT_Error   error;\n    FT_Memory  memory = stream->memory;\n\n    FT_UInt        j,num_ranges;\n    TT_GaspRange   gaspranges = NULL;\n\n\n    /* the gasp table is optional */\n    error = face->goto_table( face, TTAG_gasp, stream, 0 );\n    if ( error )\n      goto Exit;\n\n    if ( FT_FRAME_ENTER( 4L ) )\n      goto Exit;\n\n    face->gasp.version   = FT_GET_USHORT();\n    face->gasp.numRanges = FT_GET_USHORT();\n\n    FT_FRAME_EXIT();\n\n    /* only support versions 0 and 1 of the table */\n    if ( face->gasp.version >= 2 )\n    {\n      face->gasp.numRanges = 0;\n      error = FT_THROW( Invalid_Table );\n      goto Exit;\n    }\n\n    num_ranges = face->gasp.numRanges;\n    FT_TRACE3(( \"numRanges: %u\\n\", num_ranges ));\n\n    if ( FT_QNEW_ARRAY( face->gasp.gaspRanges, num_ranges ) ||\n         FT_FRAME_ENTER( num_ranges * 4L )                  )\n      goto Exit;\n\n    gaspranges = face->gasp.gaspRanges;\n\n    for ( j = 0; j < num_ranges; j++ )\n    {\n      gaspranges[j].maxPPEM  = FT_GET_USHORT();\n      gaspranges[j].gaspFlag = FT_GET_USHORT();\n\n      FT_TRACE3(( \"gaspRange %d: rangeMaxPPEM %5d, rangeGaspBehavior 0x%x\\n\",\n                  j,\n                  gaspranges[j].maxPPEM,\n                  gaspranges[j].gaspFlag ));\n    }\n\n    FT_FRAME_EXIT();\n\n  Exit:\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttload.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttload.h                                                               */\n/*                                                                         */\n/*    Load the basic TrueType tables, i.e., tables that can be either in   */\n/*    TTF or OTF fonts (specification).                                    */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2005, 2006 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTLOAD_H__\n#define __TTLOAD_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/internal/tttypes.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( TT_Table  )\n  tt_face_lookup_table( TT_Face   face,\n                        FT_ULong  tag );\n\n  FT_LOCAL( FT_Error )\n  tt_face_goto_table( TT_Face    face,\n                      FT_ULong   tag,\n                      FT_Stream  stream,\n                      FT_ULong*  length );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_font_dir( TT_Face    face,\n                         FT_Stream  stream );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_any( TT_Face    face,\n                    FT_ULong   tag,\n                    FT_Long    offset,\n                    FT_Byte*   buffer,\n                    FT_ULong*  length );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_head( TT_Face    face,\n                     FT_Stream  stream );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_cmap( TT_Face    face,\n                     FT_Stream  stream );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_maxp( TT_Face    face,\n                     FT_Stream  stream );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_name( TT_Face    face,\n                     FT_Stream  stream );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_os2( TT_Face    face,\n                    FT_Stream  stream );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_post( TT_Face    face,\n                     FT_Stream  stream );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_pclt( TT_Face    face,\n                     FT_Stream  stream );\n\n  FT_LOCAL( void )\n  tt_face_free_name( TT_Face  face );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_gasp( TT_Face    face,\n                     FT_Stream  stream );\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_bhed( TT_Face    face,\n                     FT_Stream  stream );\n\n#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */\n\n\nFT_END_HEADER\n\n#endif /* __TTLOAD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttmtx.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttmtx.c                                                                */\n/*                                                                         */\n/*    Load the metrics tables common to TTF and OTF fonts (body).          */\n/*                                                                         */\n/*  Copyright 2006-2009, 2011-2013 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/tttags.h\"\n#include \"ttmtx.h\"\n\n#include \"sferrors.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttmtx\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_hmtx                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load the `hmtx' or `vmtx' table into a face object.                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face     :: A handle to the target face object.                    */\n  /*                                                                       */\n  /*    stream   :: The input stream.                                      */\n  /*                                                                       */\n  /*    vertical :: A boolean flag.  If set, load `vmtx'.                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_hmtx( TT_Face    face,\n                     FT_Stream  stream,\n                     FT_Bool    vertical )\n  {\n    FT_Error   error;\n    FT_ULong   tag, table_size;\n    FT_ULong*  ptable_offset;\n    FT_ULong*  ptable_size;\n\n\n    if ( vertical )\n    {\n      tag           = TTAG_vmtx;\n      ptable_offset = &face->vert_metrics_offset;\n      ptable_size   = &face->vert_metrics_size;\n    }\n    else\n    {\n      tag           = TTAG_hmtx;\n      ptable_offset = &face->horz_metrics_offset;\n      ptable_size   = &face->horz_metrics_size;\n    }\n\n    error = face->goto_table( face, tag, stream, &table_size );\n#if 0\n    if ( error )\n      goto Fail;\n\n    *ptable_size   = table_size;\n    *ptable_offset = FT_STREAM_POS();\n\n  Fail:\n    return error;\n#else\n\t*ptable_size   =  error ? 0 : table_size;\n\t*ptable_offset = FT_STREAM_POS();\n\n\treturn 0;\n#endif\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_hhea                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load the `hhea' or 'vhea' table into a face object.                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face     :: A handle to the target face object.                    */\n  /*                                                                       */\n  /*    stream   :: The input stream.                                      */\n  /*                                                                       */\n  /*    vertical :: A boolean flag.  If set, load `vhea'.                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_hhea( TT_Face    face,\n                     FT_Stream  stream,\n                     FT_Bool    vertical )\n  {\n    FT_Error        error;\n    TT_HoriHeader*  header;\n\n    static const FT_Frame_Field  metrics_header_fields[] =\n    {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  TT_HoriHeader\n\n      FT_FRAME_START( 36 ),\n        FT_FRAME_ULONG ( Version ),\n        FT_FRAME_SHORT ( Ascender ),\n        FT_FRAME_SHORT ( Descender ),\n        FT_FRAME_SHORT ( Line_Gap ),\n        FT_FRAME_USHORT( advance_Width_Max ),\n        FT_FRAME_SHORT ( min_Left_Side_Bearing ),\n        FT_FRAME_SHORT ( min_Right_Side_Bearing ),\n        FT_FRAME_SHORT ( xMax_Extent ),\n        FT_FRAME_SHORT ( caret_Slope_Rise ),\n        FT_FRAME_SHORT ( caret_Slope_Run ),\n        FT_FRAME_SHORT ( caret_Offset ),\n        FT_FRAME_SHORT ( Reserved[0] ),\n        FT_FRAME_SHORT ( Reserved[1] ),\n        FT_FRAME_SHORT ( Reserved[2] ),\n        FT_FRAME_SHORT ( Reserved[3] ),\n        FT_FRAME_SHORT ( metric_Data_Format ),\n        FT_FRAME_USHORT( number_Of_HMetrics ),\n      FT_FRAME_END\n    };\n\n\n    if ( vertical )\n    {\n      void  *v = &face->vertical;\n\n\n      error = face->goto_table( face, TTAG_vhea, stream, 0 );\n      if ( error )\n        goto Fail;\n\n      header = (TT_HoriHeader*)v;\n    }\n    else\n    {\n      error = face->goto_table( face, TTAG_hhea, stream, 0 );\n      if ( error )\n        goto Fail;\n\n      header = &face->horizontal;\n    }\n\n    if ( FT_STREAM_READ_FIELDS( metrics_header_fields, header ) )\n      goto Fail;\n\n    FT_TRACE3(( \"Ascender:          %5d\\n\", header->Ascender ));\n    FT_TRACE3(( \"Descender:         %5d\\n\", header->Descender ));\n    FT_TRACE3(( \"number_Of_Metrics: %5u\\n\", header->number_Of_HMetrics ));\n\n    header->long_metrics  = NULL;\n    header->short_metrics = NULL;\n\n  Fail:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_get_metrics                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Returns the horizontal or vertical metrics in font units for a     */\n  /*    given glyph.  The metrics are the left side bearing (resp. top     */\n  /*    side bearing) and advance width (resp. advance height).            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    header  :: A pointer to either the horizontal or vertical metrics  */\n  /*               structure.                                              */\n  /*                                                                       */\n  /*    idx     :: The glyph index.                                        */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    bearing :: The bearing, either left side or top side.              */\n  /*                                                                       */\n  /*    advance :: The advance width resp. advance height.                 */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_get_metrics( TT_Face     face,\n                       FT_Bool     vertical,\n                       FT_UInt     gindex,\n                       FT_Short   *abearing,\n                       FT_UShort  *aadvance )\n  {\n    FT_Error        error;\n    FT_Stream       stream = face->root.stream;\n    TT_HoriHeader*  header;\n    FT_ULong        table_pos, table_size, table_end;\n    FT_UShort       k;\n\n\n    if ( vertical )\n    {\n      void*  v = &face->vertical;\n\n\n      header     = (TT_HoriHeader*)v;\n      table_pos  = face->vert_metrics_offset;\n      table_size = face->vert_metrics_size;\n    }\n    else\n    {\n      header     = &face->horizontal;\n      table_pos  = face->horz_metrics_offset;\n      table_size = face->horz_metrics_size;\n    }\n\n    table_end = table_pos + table_size;\n\n    k = header->number_Of_HMetrics;\n\n    if ( k > 0 )\n    {\n      if ( gindex < (FT_UInt)k )\n      {\n        table_pos += 4 * gindex;\n        if ( table_pos + 4 > table_end )\n          goto NoData;\n\n        if ( FT_STREAM_SEEK( table_pos ) ||\n             FT_READ_USHORT( *aadvance ) ||\n             FT_READ_SHORT( *abearing )  )\n          goto NoData;\n      }\n      else\n      {\n        table_pos += 4 * ( k - 1 );\n        if ( table_pos + 4 > table_end )\n          goto NoData;\n\n        if ( FT_STREAM_SEEK( table_pos ) ||\n             FT_READ_USHORT( *aadvance ) )\n          goto NoData;\n\n        table_pos += 4 + 2 * ( gindex - k );\n        if ( table_pos + 2 > table_end )\n          *abearing = 0;\n        else\n        {\n          if ( !FT_STREAM_SEEK( table_pos ) )\n            (void)FT_READ_SHORT( *abearing );\n        }\n      }\n    }\n    else\n    {\n    NoData:\n      *abearing = 0;\n      *aadvance = 0;\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttmtx.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttmtx.h                                                                */\n/*                                                                         */\n/*    Load the metrics tables common to TTF and OTF fonts (specification). */\n/*                                                                         */\n/*  Copyright 2006 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTMTX_H__\n#define __TTMTX_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/internal/tttypes.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_hhea( TT_Face    face,\n                     FT_Stream  stream,\n                     FT_Bool    vertical );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_hmtx( TT_Face    face,\n                     FT_Stream  stream,\n                     FT_Bool    vertical );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_get_metrics( TT_Face     face,\n                       FT_Bool     vertical,\n                       FT_UInt     gindex,\n                       FT_Short*   abearing,\n                       FT_UShort*  aadvance );\n\nFT_END_HEADER\n\n#endif /* __TTMTX_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttpost.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttpost.c                                                               */\n/*                                                                         */\n/*    Postcript name table processing for TrueType and OpenType fonts      */\n/*    (body).                                                              */\n/*                                                                         */\n/*  Copyright 1996-2003, 2006-2010, 2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The post table is not completely loaded by the core engine.  This     */\n  /* file loads the missing PS glyph names and implements an API to access */\n  /* them.                                                                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/tttags.h\"\n#include \"ttpost.h\"\n\n#include \"sferrors.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttpost\n\n\n  /* If this configuration macro is defined, we rely on the `PSNames' */\n  /* module to grab the glyph names.                                  */\n\n#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES\n\n\n#include \"../../include/freetype/internal/services/svpscmap.h\"\n\n#define MAC_NAME( x )  ( (FT_String*)psnames->macintosh_name( x ) )\n\n\n#else /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */\n\n\n   /* Otherwise, we ignore the `PSNames' module, and provide our own  */\n   /* table of Mac names.  Thus, it is possible to build a version of */\n   /* FreeType without the Type 1 driver & PSNames module.            */\n\n#define MAC_NAME( x )  ( (FT_String*)tt_post_default_names[x] )\n\n  /* the 258 default Mac PS glyph names */\n\n  static const FT_String* const  tt_post_default_names[258] =\n  {\n    /*   0 */\n    \".notdef\", \".null\", \"CR\", \"space\", \"exclam\",\n    \"quotedbl\", \"numbersign\", \"dollar\", \"percent\", \"ampersand\",\n    /*  10 */\n    \"quotesingle\", \"parenleft\", \"parenright\", \"asterisk\", \"plus\",\n    \"comma\", \"hyphen\", \"period\", \"slash\", \"zero\",\n    /*  20 */\n    \"one\", \"two\", \"three\", \"four\", \"five\",\n    \"six\", \"seven\", \"eight\", \"nine\", \"colon\",\n    /*  30 */\n    \"semicolon\", \"less\", \"equal\", \"greater\", \"question\",\n    \"at\", \"A\", \"B\", \"C\", \"D\",\n    /*  40 */\n    \"E\", \"F\", \"G\", \"H\", \"I\",\n    \"J\", \"K\", \"L\", \"M\", \"N\",\n    /*  50 */\n    \"O\", \"P\", \"Q\", \"R\", \"S\",\n    \"T\", \"U\", \"V\", \"W\", \"X\",\n    /*  60 */\n    \"Y\", \"Z\", \"bracketleft\", \"backslash\", \"bracketright\",\n    \"asciicircum\", \"underscore\", \"grave\", \"a\", \"b\",\n    /*  70 */\n    \"c\", \"d\", \"e\", \"f\", \"g\",\n    \"h\", \"i\", \"j\", \"k\", \"l\",\n    /*  80 */\n    \"m\", \"n\", \"o\", \"p\", \"q\",\n    \"r\", \"s\", \"t\", \"u\", \"v\",\n    /*  90 */\n    \"w\", \"x\", \"y\", \"z\", \"braceleft\",\n    \"bar\", \"braceright\", \"asciitilde\", \"Adieresis\", \"Aring\",\n    /* 100 */\n    \"Ccedilla\", \"Eacute\", \"Ntilde\", \"Odieresis\", \"Udieresis\",\n    \"aacute\", \"agrave\", \"acircumflex\", \"adieresis\", \"atilde\",\n    /* 110 */\n    \"aring\", \"ccedilla\", \"eacute\", \"egrave\", \"ecircumflex\",\n    \"edieresis\", \"iacute\", \"igrave\", \"icircumflex\", \"idieresis\",\n    /* 120 */\n    \"ntilde\", \"oacute\", \"ograve\", \"ocircumflex\", \"odieresis\",\n    \"otilde\", \"uacute\", \"ugrave\", \"ucircumflex\", \"udieresis\",\n    /* 130 */\n    \"dagger\", \"degree\", \"cent\", \"sterling\", \"section\",\n    \"bullet\", \"paragraph\", \"germandbls\", \"registered\", \"copyright\",\n    /* 140 */\n    \"trademark\", \"acute\", \"dieresis\", \"notequal\", \"AE\",\n    \"Oslash\", \"infinity\", \"plusminus\", \"lessequal\", \"greaterequal\",\n    /* 150 */\n    \"yen\", \"mu\", \"partialdiff\", \"summation\", \"product\",\n    \"pi\", \"integral\", \"ordfeminine\", \"ordmasculine\", \"Omega\",\n    /* 160 */\n    \"ae\", \"oslash\", \"questiondown\", \"exclamdown\", \"logicalnot\",\n    \"radical\", \"florin\", \"approxequal\", \"Delta\", \"guillemotleft\",\n    /* 170 */\n    \"guillemotright\", \"ellipsis\", \"nbspace\", \"Agrave\", \"Atilde\",\n    \"Otilde\", \"OE\", \"oe\", \"endash\", \"emdash\",\n    /* 180 */\n    \"quotedblleft\", \"quotedblright\", \"quoteleft\", \"quoteright\", \"divide\",\n    \"lozenge\", \"ydieresis\", \"Ydieresis\", \"fraction\", \"currency\",\n    /* 190 */\n    \"guilsinglleft\", \"guilsinglright\", \"fi\", \"fl\", \"daggerdbl\",\n    \"periodcentered\", \"quotesinglbase\", \"quotedblbase\", \"perthousand\", \"Acircumflex\",\n    /* 200 */\n    \"Ecircumflex\", \"Aacute\", \"Edieresis\", \"Egrave\", \"Iacute\",\n    \"Icircumflex\", \"Idieresis\", \"Igrave\", \"Oacute\", \"Ocircumflex\",\n    /* 210 */\n    \"apple\", \"Ograve\", \"Uacute\", \"Ucircumflex\", \"Ugrave\",\n    \"dotlessi\", \"circumflex\", \"tilde\", \"macron\", \"breve\",\n    /* 220 */\n    \"dotaccent\", \"ring\", \"cedilla\", \"hungarumlaut\", \"ogonek\",\n    \"caron\", \"Lslash\", \"lslash\", \"Scaron\", \"scaron\",\n    /* 230 */\n    \"Zcaron\", \"zcaron\", \"brokenbar\", \"Eth\", \"eth\",\n    \"Yacute\", \"yacute\", \"Thorn\", \"thorn\", \"minus\",\n    /* 240 */\n    \"multiply\", \"onesuperior\", \"twosuperior\", \"threesuperior\", \"onehalf\",\n    \"onequarter\", \"threequarters\", \"franc\", \"Gbreve\", \"gbreve\",\n    /* 250 */\n    \"Idot\", \"Scedilla\", \"scedilla\", \"Cacute\", \"cacute\",\n    \"Ccaron\", \"ccaron\", \"dmacron\",\n  };\n\n\n#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */\n\n\n  static FT_Error\n  load_format_20( TT_Face    face,\n                  FT_Stream  stream,\n                  FT_Long    post_limit )\n  {\n    FT_Memory   memory = stream->memory;\n    FT_Error    error;\n\n    FT_Int      num_glyphs;\n    FT_UShort   num_names;\n\n    FT_UShort*  glyph_indices = 0;\n    FT_Char**   name_strings  = 0;\n\n\n    if ( FT_READ_USHORT( num_glyphs ) )\n      goto Exit;\n\n    /* UNDOCUMENTED!  The number of glyphs in this table can be smaller */\n    /* than the value in the maxp table (cf. cyberbit.ttf).             */\n\n    /* There already exist fonts which have more than 32768 glyph names */\n    /* in this table, so the test for this threshold has been dropped.  */\n\n    if ( num_glyphs > face->max_profile.numGlyphs )\n    {\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    /* load the indices */\n    {\n      FT_Int  n;\n\n\n      if ( FT_NEW_ARRAY ( glyph_indices, num_glyphs ) ||\n           FT_FRAME_ENTER( num_glyphs * 2L )          )\n        goto Fail;\n\n      for ( n = 0; n < num_glyphs; n++ )\n        glyph_indices[n] = FT_GET_USHORT();\n\n      FT_FRAME_EXIT();\n    }\n\n    /* compute number of names stored in table */\n    {\n      FT_Int  n;\n\n\n      num_names = 0;\n\n      for ( n = 0; n < num_glyphs; n++ )\n      {\n        FT_Int  idx;\n\n\n        idx = glyph_indices[n];\n        if ( idx >= 258 )\n        {\n          idx -= 257;\n          if ( idx > num_names )\n            num_names = (FT_UShort)idx;\n        }\n      }\n    }\n\n    /* now load the name strings */\n    {\n      FT_UShort  n;\n\n\n      if ( FT_NEW_ARRAY( name_strings, num_names ) )\n        goto Fail;\n\n      for ( n = 0; n < num_names; n++ )\n      {\n        FT_UInt  len;\n\n\n        if ( FT_STREAM_POS() >= post_limit )\n          break;\n        else\n        {\n          FT_TRACE6(( \"load_format_20: %d byte left in post table\\n\",\n                      post_limit - FT_STREAM_POS() ));\n\n          if ( FT_READ_BYTE( len ) )\n            goto Fail1;\n        }\n\n        if ( (FT_Int)len > post_limit                   ||\n             FT_STREAM_POS() > post_limit - (FT_Int)len )\n        {\n          FT_ERROR(( \"load_format_20:\"\n                     \" exceeding string length (%d),\"\n                     \" truncating at end of post table (%d byte left)\\n\",\n                     len, post_limit - FT_STREAM_POS() ));\n          len = FT_MAX( 0, post_limit - FT_STREAM_POS() );\n        }\n\n        if ( FT_NEW_ARRAY( name_strings[n], len + 1 ) ||\n             FT_STREAM_READ( name_strings[n], len   ) )\n          goto Fail1;\n\n        name_strings[n][len] = '\\0';\n      }\n\n      if ( n < num_names )\n      {\n        FT_ERROR(( \"load_format_20:\"\n                   \" all entries in post table are already parsed,\"\n                   \" using NULL names for gid %d - %d\\n\",\n                    n, num_names - 1 ));\n        for ( ; n < num_names; n++ )\n          if ( FT_NEW_ARRAY( name_strings[n], 1 ) )\n            goto Fail1;\n          else\n            name_strings[n][0] = '\\0';\n      }\n    }\n\n    /* all right, set table fields and exit successfully */\n    {\n      TT_Post_20  table = &face->postscript_names.names.format_20;\n\n\n      table->num_glyphs    = (FT_UShort)num_glyphs;\n      table->num_names     = (FT_UShort)num_names;\n      table->glyph_indices = glyph_indices;\n      table->glyph_names   = name_strings;\n    }\n    return FT_Err_Ok;\n\n  Fail1:\n    {\n      FT_UShort  n;\n\n\n      for ( n = 0; n < num_names; n++ )\n        FT_FREE( name_strings[n] );\n    }\n\n  Fail:\n    FT_FREE( name_strings );\n    FT_FREE( glyph_indices );\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  load_format_25( TT_Face    face,\n                  FT_Stream  stream,\n                  FT_Long    post_limit )\n  {\n    FT_Memory  memory = stream->memory;\n    FT_Error   error;\n\n    FT_Int     num_glyphs;\n    FT_Char*   offset_table = 0;\n\n    FT_UNUSED( post_limit );\n\n\n    /* UNDOCUMENTED!  This value appears only in the Apple TT specs. */\n    if ( FT_READ_USHORT( num_glyphs ) )\n      goto Exit;\n\n    /* check the number of glyphs */\n    if ( num_glyphs > face->max_profile.numGlyphs || num_glyphs > 258 )\n    {\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    if ( FT_NEW_ARRAY( offset_table, num_glyphs )   ||\n         FT_STREAM_READ( offset_table, num_glyphs ) )\n      goto Fail;\n\n    /* now check the offset table */\n    {\n      FT_Int  n;\n\n\n      for ( n = 0; n < num_glyphs; n++ )\n      {\n        FT_Long  idx = (FT_Long)n + offset_table[n];\n\n\n        if ( idx < 0 || idx > num_glyphs )\n        {\n          error = FT_THROW( Invalid_File_Format );\n          goto Fail;\n        }\n      }\n    }\n\n    /* OK, set table fields and exit successfully */\n    {\n      TT_Post_25  table = &face->postscript_names.names.format_25;\n\n\n      table->num_glyphs = (FT_UShort)num_glyphs;\n      table->offsets    = offset_table;\n    }\n\n    return FT_Err_Ok;\n\n  Fail:\n    FT_FREE( offset_table );\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  load_post_names( TT_Face  face )\n  {\n    FT_Stream  stream;\n    FT_Error   error;\n    FT_Fixed   format;\n    FT_ULong   post_len;\n    FT_Long    post_limit;\n\n\n    /* get a stream for the face's resource */\n    stream = face->root.stream;\n\n    /* seek to the beginning of the PS names table */\n    error = face->goto_table( face, TTAG_post, stream, &post_len );\n    if ( error )\n      goto Exit;\n\n    post_limit = FT_STREAM_POS() + post_len;\n\n    format = face->postscript.FormatType;\n\n    /* go to beginning of subtable */\n    if ( FT_STREAM_SKIP( 32 ) )\n      goto Exit;\n\n    /* now read postscript table */\n    if ( format == 0x00020000L )\n      error = load_format_20( face, stream, post_limit );\n    else if ( format == 0x00028000L )\n      error = load_format_25( face, stream, post_limit );\n    else\n      error = FT_THROW( Invalid_File_Format );\n\n    face->postscript_names.loaded = 1;\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  tt_face_free_ps_names( TT_Face  face )\n  {\n    FT_Memory      memory = face->root.memory;\n    TT_Post_Names  names  = &face->postscript_names;\n    FT_Fixed       format;\n\n\n    if ( names->loaded )\n    {\n      format = face->postscript.FormatType;\n\n      if ( format == 0x00020000L )\n      {\n        TT_Post_20  table = &names->names.format_20;\n        FT_UShort   n;\n\n\n        FT_FREE( table->glyph_indices );\n        table->num_glyphs = 0;\n\n        for ( n = 0; n < table->num_names; n++ )\n          FT_FREE( table->glyph_names[n] );\n\n        FT_FREE( table->glyph_names );\n        table->num_names = 0;\n      }\n      else if ( format == 0x00028000L )\n      {\n        TT_Post_25  table = &names->names.format_25;\n\n\n        FT_FREE( table->offsets );\n        table->num_glyphs = 0;\n      }\n    }\n    names->loaded = 0;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_get_ps_name                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Get the PostScript glyph name of a glyph.                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the parent face.                             */\n  /*                                                                       */\n  /*    idx    :: The glyph index.                                         */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    PSname :: The address of a string pointer.  Will be NULL in case   */\n  /*              of error, otherwise it is a pointer to the glyph name.   */\n  /*                                                                       */\n  /*              You must not modify the returned string!                 */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_get_ps_name( TT_Face      face,\n                       FT_UInt      idx,\n                       FT_String**  PSname )\n  {\n    FT_Error       error;\n    TT_Post_Names  names;\n    FT_Fixed       format;\n\n#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES\n    FT_Service_PsCMaps  psnames;\n#endif\n\n\n    if ( !face )\n      return FT_THROW( Invalid_Face_Handle );\n\n    if ( idx >= (FT_UInt)face->max_profile.numGlyphs )\n      return FT_THROW( Invalid_Glyph_Index );\n\n#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES\n    psnames = (FT_Service_PsCMaps)face->psnames;\n    if ( !psnames )\n      return FT_THROW( Unimplemented_Feature );\n#endif\n\n    names = &face->postscript_names;\n\n    /* `.notdef' by default */\n    *PSname = MAC_NAME( 0 );\n\n    format = face->postscript.FormatType;\n\n    if ( format == 0x00010000L )\n    {\n      if ( idx < 258 )                    /* paranoid checking */\n        *PSname = MAC_NAME( idx );\n    }\n    else if ( format == 0x00020000L )\n    {\n      TT_Post_20  table = &names->names.format_20;\n\n\n      if ( !names->loaded )\n      {\n        error = load_post_names( face );\n        if ( error )\n          goto End;\n      }\n\n      if ( idx < (FT_UInt)table->num_glyphs )\n      {\n        FT_UShort  name_index = table->glyph_indices[idx];\n\n\n        if ( name_index < 258 )\n          *PSname = MAC_NAME( name_index );\n        else\n          *PSname = (FT_String*)table->glyph_names[name_index - 258];\n      }\n    }\n    else if ( format == 0x00028000L )\n    {\n      TT_Post_25  table = &names->names.format_25;\n\n\n      if ( !names->loaded )\n      {\n        error = load_post_names( face );\n        if ( error )\n          goto End;\n      }\n\n      if ( idx < (FT_UInt)table->num_glyphs )    /* paranoid checking */\n      {\n        idx    += table->offsets[idx];\n        *PSname = MAC_NAME( idx );\n      }\n    }\n\n    /* nothing to do for format == 0x00030000L */\n\n  End:\n    return FT_Err_Ok;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttpost.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttpost.h                                                               */\n/*                                                                         */\n/*    Postcript name table processing for TrueType and OpenType fonts      */\n/*    (specification).                                                     */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTPOST_H__\n#define __TTPOST_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/config/ftconfig.h\"\n#include \"../../include/freetype/internal/tttypes.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_get_ps_name( TT_Face      face,\n                       FT_UInt      idx,\n                       FT_String**  PSname );\n\n  FT_LOCAL( void )\n  tt_face_free_ps_names( TT_Face  face );\n\n\nFT_END_HEADER\n\n#endif /* __TTPOST_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttsbit.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttsbit.c                                                               */\n/*                                                                         */\n/*    TrueType and OpenType embedded bitmap support (body).                */\n/*                                                                         */\n/*  Copyright 2005-2009, 2013 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  Copyright 2013 by Google, Inc.                                         */\n/*  Google Author(s): Behdad Esfahbod.                                     */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/tttags.h\"\n#include \"../../include/freetype/ftbitmap.h\"\n#include \"ttsbit.h\"\n\n#include \"sferrors.h\"\n\n#include \"pngshim.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttsbit\n\n\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_eblc( TT_Face    face,\n                     FT_Stream  stream )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_Fixed  version;\n    FT_ULong  num_strikes, table_size;\n    FT_Byte*  p;\n    FT_Byte*  p_limit;\n    FT_UInt   count;\n\n\n    face->sbit_num_strikes = 0;\n\n    /* this table is optional */\n    error = face->goto_table( face, TTAG_CBLC, stream, &table_size );\n    if ( error )\n      error = face->goto_table( face, TTAG_EBLC, stream, &table_size );\n    if ( error )\n      error = face->goto_table( face, TTAG_bloc, stream, &table_size );\n    if ( error )\n      goto Exit;\n\n    if ( table_size < 8 )\n    {\n      FT_ERROR(( \"tt_face_load_sbit_strikes: table too short\\n\" ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    if ( FT_FRAME_EXTRACT( table_size, face->sbit_table ) )\n      goto Exit;\n\n    face->sbit_table_size = table_size;\n\n    p       = face->sbit_table;\n    p_limit = p + table_size;\n\n    version     = FT_NEXT_ULONG( p );\n    num_strikes = FT_NEXT_ULONG( p );\n\n    if ( version != 0x00020000UL || num_strikes >= 0x10000UL )\n    {\n      FT_ERROR(( \"tt_face_load_sbit_strikes: invalid table version\\n\" ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Fail;\n    }\n\n    /*\n     *  Count the number of strikes available in the table.  We are a bit\n     *  paranoid there and don't trust the data.\n     */\n    count = (FT_UInt)num_strikes;\n    if ( 8 + 48UL * count > table_size )\n      count = (FT_UInt)( ( p_limit - p ) / 48 );\n\n    face->sbit_num_strikes = count;\n\n    FT_TRACE3(( \"sbit_num_strikes: %u\\n\", count ));\n  Exit:\n    return error;\n\n  Fail:\n    FT_FRAME_RELEASE( face->sbit_table );\n    face->sbit_table_size = 0;\n    goto Exit;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  tt_face_free_eblc( TT_Face  face )\n  {\n    FT_Stream  stream = face->root.stream;\n\n\n    FT_FRAME_RELEASE( face->sbit_table );\n    face->sbit_table_size  = 0;\n    face->sbit_num_strikes = 0;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_set_sbit_strike( TT_Face          face,\n                           FT_Size_Request  req,\n                           FT_ULong*        astrike_index )\n  {\n    return FT_Match_Size( (FT_Face)face, req, 0, astrike_index );\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_strike_metrics( TT_Face           face,\n                               FT_ULong          strike_index,\n                               FT_Size_Metrics*  metrics )\n  {\n    FT_Byte*  strike;\n\n\n    if ( strike_index >= (FT_ULong)face->sbit_num_strikes )\n      return FT_THROW( Invalid_Argument );\n\n    strike = face->sbit_table + 8 + strike_index * 48;\n\n    metrics->x_ppem = (FT_UShort)strike[44];\n    metrics->y_ppem = (FT_UShort)strike[45];\n\n    metrics->ascender  = (FT_Char)strike[16] << 6;  /* hori.ascender  */\n    metrics->descender = (FT_Char)strike[17] << 6;  /* hori.descender */\n    metrics->height    = metrics->ascender - metrics->descender;\n\n    /* XXX: Is this correct? */\n    metrics->max_advance = ( (FT_Char)strike[22] + /* min_origin_SB  */\n                                      strike[18] + /* max_width      */\n                             (FT_Char)strike[23]   /* min_advance_SB */\n                                                 ) << 6;\n\n    return FT_Err_Ok;\n  }\n\n\n  typedef struct  TT_SBitDecoderRec_\n  {\n    TT_Face          face;\n    FT_Stream        stream;\n    FT_Bitmap*       bitmap;\n    TT_SBit_Metrics  metrics;\n    FT_Bool          metrics_loaded;\n    FT_Bool          bitmap_allocated;\n    FT_Byte          bit_depth;\n\n    FT_ULong         ebdt_start;\n    FT_ULong         ebdt_size;\n\n    FT_ULong         strike_index_array;\n    FT_ULong         strike_index_count;\n    FT_Byte*         eblc_base;\n    FT_Byte*         eblc_limit;\n\n  } TT_SBitDecoderRec, *TT_SBitDecoder;\n\n\n  static FT_Error\n  tt_sbit_decoder_init( TT_SBitDecoder       decoder,\n                        TT_Face              face,\n                        FT_ULong             strike_index,\n                        TT_SBit_MetricsRec*  metrics )\n  {\n    FT_Error   error;\n    FT_Stream  stream = face->root.stream;\n    FT_ULong   ebdt_size;\n\n\n    error = face->goto_table( face, TTAG_CBDT, stream, &ebdt_size );\n    if ( error )\n      error = face->goto_table( face, TTAG_EBDT, stream, &ebdt_size );\n    if ( error )\n      error = face->goto_table( face, TTAG_bdat, stream, &ebdt_size );\n    if ( error )\n      goto Exit;\n\n    decoder->face    = face;\n    decoder->stream  = stream;\n    decoder->bitmap  = &face->root.glyph->bitmap;\n    decoder->metrics = metrics;\n\n    decoder->metrics_loaded   = 0;\n    decoder->bitmap_allocated = 0;\n\n    decoder->ebdt_start = FT_STREAM_POS();\n    decoder->ebdt_size  = ebdt_size;\n\n    decoder->eblc_base  = face->sbit_table;\n    decoder->eblc_limit = face->sbit_table + face->sbit_table_size;\n\n    /* now find the strike corresponding to the index */\n    {\n      FT_Byte*  p;\n\n\n      if ( 8 + 48 * strike_index + 3 * 4 + 34 + 1 > face->sbit_table_size )\n      {\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n\n      p = decoder->eblc_base + 8 + 48 * strike_index;\n\n      decoder->strike_index_array = FT_NEXT_ULONG( p );\n      p                          += 4;\n      decoder->strike_index_count = FT_NEXT_ULONG( p );\n      p                          += 34;\n      decoder->bit_depth          = *p;\n\n      if ( decoder->strike_index_array > face->sbit_table_size             ||\n           decoder->strike_index_array + 8 * decoder->strike_index_count >\n             face->sbit_table_size                                         )\n        error = FT_THROW( Invalid_File_Format );\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  static void\n  tt_sbit_decoder_done( TT_SBitDecoder  decoder )\n  {\n    FT_UNUSED( decoder );\n  }\n\n\n  static FT_Error\n  tt_sbit_decoder_alloc_bitmap( TT_SBitDecoder  decoder,\n                                FT_UInt         load_flags )\n  {\n    FT_Error    error = FT_Err_Ok;\n    FT_UInt     width, height;\n    FT_Bitmap*  map = decoder->bitmap;\n    FT_Long     size;\n\n\n    if ( !decoder->metrics_loaded )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    width  = decoder->metrics->width;\n    height = decoder->metrics->height;\n\n    map->width = (int)width;\n    map->rows  = (int)height;\n\n    switch ( decoder->bit_depth )\n    {\n    case 1:\n      map->pixel_mode = FT_PIXEL_MODE_MONO;\n      map->pitch      = ( map->width + 7 ) >> 3;\n      map->num_grays  = 2;\n      break;\n\n    case 2:\n      map->pixel_mode = FT_PIXEL_MODE_GRAY2;\n      map->pitch      = ( map->width + 3 ) >> 2;\n      map->num_grays  = 4;\n      break;\n\n    case 4:\n      map->pixel_mode = FT_PIXEL_MODE_GRAY4;\n      map->pitch      = ( map->width + 1 ) >> 1;\n      map->num_grays  = 16;\n      break;\n\n    case 8:\n      map->pixel_mode = FT_PIXEL_MODE_GRAY;\n      map->pitch      = map->width;\n      map->num_grays  = 256;\n      break;\n\n    case 32:\n      if ( load_flags & FT_LOAD_COLOR )\n      {\n        map->pixel_mode = FT_PIXEL_MODE_BGRA;\n        map->pitch      = map->width * 4;\n        map->num_grays  = 256;\n      }\n      else\n      {\n        map->pixel_mode = FT_PIXEL_MODE_GRAY;\n        map->pitch      = map->width;\n        map->num_grays  = 256;\n      }\n      break;\n\n    default:\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    size = map->rows * map->pitch;\n\n    /* check that there is no empty image */\n    if ( size == 0 )\n      goto Exit;     /* exit successfully! */\n\n    error = ft_glyphslot_alloc_bitmap( decoder->face->root.glyph, size );\n    if ( error )\n      goto Exit;\n\n    decoder->bitmap_allocated = 1;\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  tt_sbit_decoder_load_metrics( TT_SBitDecoder  decoder,\n                                FT_Byte*       *pp,\n                                FT_Byte*        limit,\n                                FT_Bool         big )\n  {\n    FT_Byte*         p       = *pp;\n    TT_SBit_Metrics  metrics = decoder->metrics;\n\n\n    if ( p + 5 > limit )\n      goto Fail;\n\n    metrics->height       = p[0];\n    metrics->width        = p[1];\n    metrics->horiBearingX = (FT_Char)p[2];\n    metrics->horiBearingY = (FT_Char)p[3];\n    metrics->horiAdvance  = p[4];\n\n    p += 5;\n    if ( big )\n    {\n      if ( p + 3 > limit )\n        goto Fail;\n\n      metrics->vertBearingX = (FT_Char)p[0];\n      metrics->vertBearingY = (FT_Char)p[1];\n      metrics->vertAdvance  = p[2];\n\n      p += 3;\n    }\n\n    decoder->metrics_loaded = 1;\n    *pp = p;\n    return FT_Err_Ok;\n\n  Fail:\n    FT_TRACE1(( \"tt_sbit_decoder_load_metrics: broken table\" ));\n    return FT_THROW( Invalid_Argument );\n  }\n\n\n  /* forward declaration */\n  static FT_Error\n  tt_sbit_decoder_load_image( TT_SBitDecoder  decoder,\n                              FT_UInt         load_flags,\n                              FT_UInt         glyph_index,\n                              FT_Int          x_pos,\n                              FT_Int          y_pos );\n\n  typedef FT_Error  (*TT_SBitDecoder_LoadFunc)( TT_SBitDecoder  decoder,\n                                                FT_UInt         load_flags,\n                                                FT_Byte*        p,\n                                                FT_Byte*        plimit,\n                                                FT_Int          x_pos,\n                                                FT_Int          y_pos );\n\n\n  static FT_Error\n  tt_sbit_decoder_load_byte_aligned( TT_SBitDecoder  decoder,\n                                     FT_UInt         load_flags,\n                                     FT_Byte*        p,\n                                     FT_Byte*        limit,\n                                     FT_Int          x_pos,\n                                     FT_Int          y_pos )\n  {\n    FT_Error    error = FT_Err_Ok;\n    FT_Byte*    line;\n    FT_Int      bit_height, bit_width, pitch, width, height, line_bits, h;\n    FT_Bitmap*  bitmap;\n\n    FT_UNUSED( load_flags );\n\n\n    /* check that we can write the glyph into the bitmap */\n    bitmap     = decoder->bitmap;\n    bit_width  = bitmap->width;\n    bit_height = bitmap->rows;\n    pitch      = bitmap->pitch;\n    line       = bitmap->buffer;\n\n    width  = decoder->metrics->width;\n    height = decoder->metrics->height;\n\n    line_bits = width * decoder->bit_depth;\n\n    if ( x_pos < 0 || x_pos + width > bit_width   ||\n         y_pos < 0 || y_pos + height > bit_height )\n    {\n      FT_TRACE1(( \"tt_sbit_decoder_load_byte_aligned:\"\n                  \" invalid bitmap dimensions\\n\" ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    if ( p + ( ( line_bits + 7 ) >> 3 ) * height > limit )\n    {\n      FT_TRACE1(( \"tt_sbit_decoder_load_byte_aligned: broken bitmap\\n\" ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    /* now do the blit */\n    line  += y_pos * pitch + ( x_pos >> 3 );\n    x_pos &= 7;\n\n    if ( x_pos == 0 )  /* the easy one */\n    {\n      for ( h = height; h > 0; h--, line += pitch )\n      {\n        FT_Byte*  pwrite = line;\n        FT_Int    w;\n\n\n        for ( w = line_bits; w >= 8; w -= 8 )\n        {\n          pwrite[0] = (FT_Byte)( pwrite[0] | *p++ );\n          pwrite   += 1;\n        }\n\n        if ( w > 0 )\n          pwrite[0] = (FT_Byte)( pwrite[0] | ( *p++ & ( 0xFF00U >> w ) ) );\n      }\n    }\n    else  /* x_pos > 0 */\n    {\n      for ( h = height; h > 0; h--, line += pitch )\n      {\n        FT_Byte*  pwrite = line;\n        FT_Int    w;\n        FT_UInt   wval = 0;\n\n\n        for ( w = line_bits; w >= 8; w -= 8 )\n        {\n          wval       = (FT_UInt)( wval | *p++ );\n          pwrite[0]  = (FT_Byte)( pwrite[0] | ( wval >> x_pos ) );\n          pwrite    += 1;\n          wval     <<= 8;\n        }\n\n        if ( w > 0 )\n          wval = (FT_UInt)( wval | ( *p++ & ( 0xFF00U >> w ) ) );\n\n        /* all bits read and there are `x_pos + w' bits to be written */\n\n        pwrite[0] = (FT_Byte)( pwrite[0] | ( wval >> x_pos ) );\n\n        if ( x_pos + w > 8 )\n        {\n          pwrite++;\n          wval     <<= 8;\n          pwrite[0]  = (FT_Byte)( pwrite[0] | ( wval >> x_pos ) );\n        }\n      }\n    }\n\n  Exit:\n    if ( !error )\n      FT_TRACE3(( \"tt_sbit_decoder_load_byte_aligned: loaded\\n\" ));\n    return error;\n  }\n\n\n  /*\n   * Load a bit-aligned bitmap (with pointer `p') into a line-aligned bitmap\n   * (with pointer `pwrite').  In the example below, the width is 3 pixel,\n   * and `x_pos' is 1 pixel.\n   *\n   *       p                               p+1\n   *     |                               |                               |\n   *     | 7   6   5   4   3   2   1   0 | 7   6   5   4   3   2   1   0 |...\n   *     |                               |                               |\n   *       +-------+   +-------+   +-------+ ...\n   *           .           .           .\n   *           .           .           .\n   *           v           .           .\n   *       +-------+       .           .\n   * |                               | .\n   * | 7   6   5   4   3   2   1   0 | .\n   * |                               | .\n   *   pwrite              .           .\n   *                       .           .\n   *                       v           .\n   *                   +-------+       .\n   *             |                               |\n   *             | 7   6   5   4   3   2   1   0 |\n   *             |                               |\n   *               pwrite+1            .\n   *                                   .\n   *                                   v\n   *                               +-------+\n   *                         |                               |\n   *                         | 7   6   5   4   3   2   1   0 |\n   *                         |                               |\n   *                           pwrite+2\n   *\n   */\n\n  static FT_Error\n  tt_sbit_decoder_load_bit_aligned( TT_SBitDecoder  decoder,\n                                    FT_UInt         load_flags,\n                                    FT_Byte*        p,\n                                    FT_Byte*        limit,\n                                    FT_Int          x_pos,\n                                    FT_Int          y_pos )\n  {\n    FT_Error    error = FT_Err_Ok;\n    FT_Byte*    line;\n    FT_Int      bit_height, bit_width, pitch, width, height, line_bits, h, nbits;\n    FT_Bitmap*  bitmap;\n    FT_UShort   rval;\n\n    FT_UNUSED( load_flags );\n\n\n    /* check that we can write the glyph into the bitmap */\n    bitmap     = decoder->bitmap;\n    bit_width  = bitmap->width;\n    bit_height = bitmap->rows;\n    pitch      = bitmap->pitch;\n    line       = bitmap->buffer;\n\n    width  = decoder->metrics->width;\n    height = decoder->metrics->height;\n\n    line_bits = width * decoder->bit_depth;\n\n    if ( x_pos < 0 || x_pos + width  > bit_width  ||\n         y_pos < 0 || y_pos + height > bit_height )\n    {\n      FT_TRACE1(( \"tt_sbit_decoder_load_bit_aligned:\"\n                  \" invalid bitmap dimensions\\n\" ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    if ( p + ( ( line_bits * height + 7 ) >> 3 ) > limit )\n    {\n      FT_TRACE1(( \"tt_sbit_decoder_load_bit_aligned: broken bitmap\\n\" ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    /* now do the blit */\n\n    /* adjust `line' to point to the first byte of the bitmap */\n    line  += y_pos * pitch + ( x_pos >> 3 );\n    x_pos &= 7;\n\n    /* the higher byte of `rval' is used as a buffer */\n    rval  = 0;\n    nbits = 0;\n\n    for ( h = height; h > 0; h--, line += pitch )\n    {\n      FT_Byte*  pwrite = line;\n      FT_Int    w      = line_bits;\n\n\n      /* handle initial byte (in target bitmap) specially if necessary */\n      if ( x_pos )\n      {\n        w = ( line_bits < 8 - x_pos ) ? line_bits : 8 - x_pos;\n\n        if ( h == height )\n        {\n          rval  = *p++;\n          nbits = x_pos;\n        }\n        else if ( nbits < w )\n        {\n          if ( p < limit )\n            rval |= *p++;\n          nbits += 8 - w;\n        }\n        else\n        {\n          rval  >>= 8;\n          nbits  -= w;\n        }\n\n        *pwrite++ |= ( ( rval >> nbits ) & 0xFF ) &\n                     ( ~( 0xFF << w ) << ( 8 - w - x_pos ) );\n        rval     <<= 8;\n\n        w = line_bits - w;\n      }\n\n      /* handle medial bytes */\n      for ( ; w >= 8; w -= 8 )\n      {\n        rval      |= *p++;\n        *pwrite++ |= ( rval >> nbits ) & 0xFF;\n\n        rval <<= 8;\n      }\n\n      /* handle final byte if necessary */\n      if ( w > 0 )\n      {\n        if ( nbits < w )\n        {\n          if ( p < limit )\n            rval |= *p++;\n          *pwrite |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w );\n          nbits   += 8 - w;\n\n          rval <<= 8;\n        }\n        else\n        {\n          *pwrite |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w );\n          nbits   -= w;\n        }\n      }\n    }\n\n  Exit:\n    if ( !error )\n      FT_TRACE3(( \"tt_sbit_decoder_load_bit_aligned: loaded\\n\" ));\n    return error;\n  }\n\n\n  static FT_Error\n  tt_sbit_decoder_load_compound( TT_SBitDecoder  decoder,\n                                 FT_UInt         load_flags,\n                                 FT_Byte*        p,\n                                 FT_Byte*        limit,\n                                 FT_Int          x_pos,\n                                 FT_Int          y_pos )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_UInt   num_components, nn;\n\n    FT_Char  horiBearingX = decoder->metrics->horiBearingX;\n    FT_Char  horiBearingY = decoder->metrics->horiBearingY;\n    FT_Byte  horiAdvance  = decoder->metrics->horiAdvance;\n    FT_Char  vertBearingX = decoder->metrics->vertBearingX;\n    FT_Char  vertBearingY = decoder->metrics->vertBearingY;\n    FT_Byte  vertAdvance  = decoder->metrics->vertAdvance;\n\n\n    if ( p + 2 > limit )\n      goto Fail;\n\n    num_components = FT_NEXT_USHORT( p );\n    if ( p + 4 * num_components > limit )\n    {\n      FT_TRACE1(( \"tt_sbit_decoder_load_compound: broken table\\n\" ));\n      goto Fail;\n    }\n\n    FT_TRACE3(( \"tt_sbit_decoder_load_compound: loading %d components\\n\",\n                num_components ));\n\n    for ( nn = 0; nn < num_components; nn++ )\n    {\n      FT_UInt  gindex = FT_NEXT_USHORT( p );\n      FT_Byte  dx     = FT_NEXT_BYTE( p );\n      FT_Byte  dy     = FT_NEXT_BYTE( p );\n\n\n      /* NB: a recursive call */\n      error = tt_sbit_decoder_load_image( decoder, load_flags, gindex,\n                                          x_pos + dx, y_pos + dy );\n      if ( error )\n        break;\n    }\n\n    FT_TRACE3(( \"tt_sbit_decoder_load_compound: done\\n\" ));\n\n    decoder->metrics->horiBearingX = horiBearingX;\n    decoder->metrics->horiBearingY = horiBearingY;\n    decoder->metrics->horiAdvance  = horiAdvance;\n    decoder->metrics->vertBearingX = vertBearingX;\n    decoder->metrics->vertBearingY = vertBearingY;\n    decoder->metrics->vertAdvance  = vertAdvance;\n    decoder->metrics->width        = (FT_Byte)decoder->bitmap->width;\n    decoder->metrics->height       = (FT_Byte)decoder->bitmap->rows;\n\n  Exit:\n    return error;\n\n  Fail:\n    error = FT_THROW( Invalid_File_Format );\n    goto Exit;\n  }\n\n\n#ifdef FT_CONFIG_OPTION_USE_PNG\n\n  static FT_Error\n  tt_sbit_decoder_load_png( TT_SBitDecoder  decoder,\n                            FT_UInt         load_flags,\n                            FT_Byte*        p,\n                            FT_Byte*        limit,\n                            FT_Int          x_pos,\n                            FT_Int          y_pos )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_ULong  png_len;\n\n    FT_UNUSED( load_flags );\n\n\n    if ( limit - p < 4 )\n    {\n      FT_TRACE1(( \"tt_sbit_decoder_load_png: broken bitmap\\n\" ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    png_len = FT_NEXT_ULONG( p );\n    if ( (FT_ULong)( limit - p ) < png_len )\n    {\n      FT_TRACE1(( \"tt_sbit_decoder_load_png: broken bitmap\\n\" ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    error = Load_SBit_Png( decoder->bitmap,\n                           x_pos,\n                           y_pos,\n                           decoder->bit_depth,\n                           decoder->metrics,\n                           decoder->stream->memory,\n                           p,\n                           png_len );\n\n  Exit:\n    if ( !error )\n      FT_TRACE3(( \"tt_sbit_decoder_load_png: loaded\\n\" ));\n    return error;\n  }\n\n#endif /* FT_CONFIG_OPTION_USE_PNG */\n\n\n  static FT_Error\n  tt_sbit_decoder_load_bitmap( TT_SBitDecoder  decoder,\n                               FT_UInt         load_flags,\n                               FT_UInt         glyph_format,\n                               FT_ULong        glyph_start,\n                               FT_ULong        glyph_size,\n                               FT_Int          x_pos,\n                               FT_Int          y_pos )\n  {\n    FT_Error   error;\n    FT_Stream  stream = decoder->stream;\n    FT_Byte*   p;\n    FT_Byte*   p_limit;\n    FT_Byte*   data;\n\n\n    /* seek into the EBDT table now */\n    if ( glyph_start + glyph_size > decoder->ebdt_size )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    if ( FT_STREAM_SEEK( decoder->ebdt_start + glyph_start ) ||\n         FT_FRAME_EXTRACT( glyph_size, data )                )\n      goto Exit;\n\n    p       = data;\n    p_limit = p + glyph_size;\n\n    /* read the data, depending on the glyph format */\n    switch ( glyph_format )\n    {\n    case 1:\n    case 2:\n    case 8:\n    case 17:\n      error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 0 );\n      break;\n\n    case 6:\n    case 7:\n    case 9:\n    case 18:\n      error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 );\n      break;\n\n    default:\n      error = FT_Err_Ok;\n    }\n\n    if ( error )\n      goto Fail;\n\n    {\n      TT_SBitDecoder_LoadFunc  loader;\n\n\n      switch ( glyph_format )\n      {\n      case 1:\n      case 6:\n        loader = tt_sbit_decoder_load_byte_aligned;\n        break;\n\n      case 2:\n      case 5:\n      case 7:\n        loader = tt_sbit_decoder_load_bit_aligned;\n        break;\n\n      case 8:\n        if ( p + 1 > p_limit )\n          goto Fail;\n\n        p += 1;  /* skip padding */\n        /* fall-through */\n\n      case 9:\n        loader = tt_sbit_decoder_load_compound;\n        break;\n\n#ifdef FT_CONFIG_OPTION_USE_PNG\n      case 17: /* small metrics, PNG image data   */\n      case 18: /* big metrics, PNG image data     */\n      case 19: /* metrics in EBLC, PNG image data */\n        loader = tt_sbit_decoder_load_png;\n        break;\n#endif /* FT_CONFIG_OPTION_USE_PNG */\n\n      default:\n        error = FT_THROW( Invalid_Table );\n        goto Fail;\n      }\n\n      if ( !decoder->bitmap_allocated )\n      {\n        error = tt_sbit_decoder_alloc_bitmap( decoder, load_flags );\n        if ( error )\n          goto Fail;\n      }\n\n      if ( decoder->bit_depth == 32                          &&\n           decoder->bitmap->pixel_mode != FT_PIXEL_MODE_BGRA )\n      {\n        /* Flatten color bitmaps if color was not requested. */\n\n        FT_Library library = decoder->face->root.glyph->library;\n        FT_Memory  memory  = decoder->stream->memory;\n\n        FT_Bitmap color, *orig;\n\n\n        if ( decoder->bitmap->pixel_mode != FT_PIXEL_MODE_GRAY ||\n             x_pos != 0 || y_pos != 0                          )\n        {\n          /* Shouldn't happen. */\n          error = FT_THROW( Invalid_Table );\n          goto Fail;\n        }\n\n        FT_Bitmap_New( &color );\n\n        color.rows       = decoder->bitmap->rows;\n        color.width      = decoder->bitmap->width;\n        color.pitch      = color.width * 4;\n        color.pixel_mode = FT_PIXEL_MODE_BGRA;\n\n        if ( FT_ALLOC( color.buffer, color.rows * color.pitch ) )\n          goto Fail;\n\n        orig            = decoder->bitmap;\n        decoder->bitmap = &color;\n\n        error = loader( decoder, load_flags, p, p_limit, x_pos, y_pos );\n\n        decoder->bitmap = orig;\n\n        /* explicitly test against FT_Err_Ok to avoid compiler warnings */\n        /* (we do an assignment within a conditional)                   */\n        if ( error                                           ||\n             ( error = FT_Bitmap_Convert( library,\n                                          &color,\n                                          decoder->bitmap,\n                                          1 ) ) != FT_Err_Ok )\n        {\n          FT_Bitmap_Done( library, &color );\n          goto Fail;\n        }\n\n        FT_Bitmap_Done( library, &color );\n      }\n\n      else\n        error = loader( decoder, load_flags, p, p_limit, x_pos, y_pos );\n    }\n\n  Fail:\n    FT_FRAME_RELEASE( data );\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  tt_sbit_decoder_load_image( TT_SBitDecoder  decoder,\n                              FT_UInt         load_flags,\n                              FT_UInt         glyph_index,\n                              FT_Int          x_pos,\n                              FT_Int          y_pos )\n  {\n    /*\n     *  First, we find the correct strike range that applies to this\n     *  glyph index.\n     */\n\n    FT_Byte*  p          = decoder->eblc_base + decoder->strike_index_array;\n    FT_Byte*  p_limit    = decoder->eblc_limit;\n    FT_ULong  num_ranges = decoder->strike_index_count;\n    FT_UInt   start, end, index_format, image_format;\n    FT_ULong  image_start = 0, image_end = 0, image_offset;\n\n\n    for ( ; num_ranges > 0; num_ranges-- )\n    {\n      start = FT_NEXT_USHORT( p );\n      end   = FT_NEXT_USHORT( p );\n\n      if ( glyph_index >= start && glyph_index <= end )\n        goto FoundRange;\n\n      p += 4;  /* ignore index offset */\n    }\n    goto NoBitmap;\n\n  FoundRange:\n    image_offset = FT_NEXT_ULONG( p );\n\n    /* overflow check */\n    p = decoder->eblc_base + decoder->strike_index_array;\n    if ( image_offset > (FT_ULong)( p_limit - p ) )\n      goto Failure;\n\n    p += image_offset;\n    if ( p + 8 > p_limit )\n      goto NoBitmap;\n\n    /* now find the glyph's location and extend within the ebdt table */\n    index_format = FT_NEXT_USHORT( p );\n    image_format = FT_NEXT_USHORT( p );\n    image_offset = FT_NEXT_ULONG ( p );\n\n    switch ( index_format )\n    {\n    case 1: /* 4-byte offsets relative to `image_offset' */\n      {\n        p += 4 * ( glyph_index - start );\n        if ( p + 8 > p_limit )\n          goto NoBitmap;\n\n        image_start = FT_NEXT_ULONG( p );\n        image_end   = FT_NEXT_ULONG( p );\n\n        if ( image_start == image_end )  /* missing glyph */\n          goto NoBitmap;\n      }\n      break;\n\n    case 2: /* big metrics, constant image size */\n      {\n        FT_ULong  image_size;\n\n\n        if ( p + 12 > p_limit )\n          goto NoBitmap;\n\n        image_size = FT_NEXT_ULONG( p );\n\n        if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) )\n          goto NoBitmap;\n\n        image_start = image_size * ( glyph_index - start );\n        image_end   = image_start + image_size;\n      }\n      break;\n\n    case 3: /* 2-byte offsets relative to 'image_offset' */\n      {\n        p += 2 * ( glyph_index - start );\n        if ( p + 4 > p_limit )\n          goto NoBitmap;\n\n        image_start = FT_NEXT_USHORT( p );\n        image_end   = FT_NEXT_USHORT( p );\n\n        if ( image_start == image_end )  /* missing glyph */\n          goto NoBitmap;\n      }\n      break;\n\n    case 4: /* sparse glyph array with (glyph,offset) pairs */\n      {\n        FT_ULong  mm, num_glyphs;\n\n\n        if ( p + 4 > p_limit )\n          goto NoBitmap;\n\n        num_glyphs = FT_NEXT_ULONG( p );\n\n        /* overflow check for p + ( num_glyphs + 1 ) * 4 */\n        if ( num_glyphs > (FT_ULong)( ( ( p_limit - p ) >> 2 ) - 1 ) )\n          goto NoBitmap;\n\n        for ( mm = 0; mm < num_glyphs; mm++ )\n        {\n          FT_UInt  gindex = FT_NEXT_USHORT( p );\n\n\n          if ( gindex == glyph_index )\n          {\n            image_start = FT_NEXT_USHORT( p );\n            p          += 2;\n            image_end   = FT_PEEK_USHORT( p );\n            break;\n          }\n          p += 2;\n        }\n\n        if ( mm >= num_glyphs )\n          goto NoBitmap;\n      }\n      break;\n\n    case 5: /* constant metrics with sparse glyph codes */\n    case 19:\n      {\n        FT_ULong  image_size, mm, num_glyphs;\n\n\n        if ( p + 16 > p_limit )\n          goto NoBitmap;\n\n        image_size = FT_NEXT_ULONG( p );\n\n        if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) )\n          goto NoBitmap;\n\n        num_glyphs = FT_NEXT_ULONG( p );\n\n        /* overflow check for p + 2 * num_glyphs */\n        if ( num_glyphs > (FT_ULong)( ( p_limit - p ) >> 1 ) )\n          goto NoBitmap;\n\n        for ( mm = 0; mm < num_glyphs; mm++ )\n        {\n          FT_UInt  gindex = FT_NEXT_USHORT( p );\n\n\n          if ( gindex == glyph_index )\n            break;\n        }\n\n        if ( mm >= num_glyphs )\n          goto NoBitmap;\n\n        image_start = image_size * mm;\n        image_end   = image_start + image_size;\n      }\n      break;\n\n    default:\n      goto NoBitmap;\n    }\n\n    if ( image_start > image_end )\n      goto NoBitmap;\n\n    image_end  -= image_start;\n    image_start = image_offset + image_start;\n\n    FT_TRACE3(( \"tt_sbit_decoder_load_image:\"\n                \" found sbit (format %d) for glyph index %d\\n\",\n                image_format, glyph_index ));\n\n    return tt_sbit_decoder_load_bitmap( decoder,\n                                        load_flags,\n                                        image_format,\n                                        image_start,\n                                        image_end,\n                                        x_pos,\n                                        y_pos );\n\n  Failure:\n    return FT_THROW( Invalid_Table );\n\n  NoBitmap:\n    FT_TRACE4(( \"tt_sbit_decoder_load_image:\"\n                \" no sbit found for glyph index %d\\n\", glyph_index ));\n\n    return FT_THROW( Invalid_Argument );\n  }\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_sbit_image( TT_Face              face,\n                           FT_ULong             strike_index,\n                           FT_UInt              glyph_index,\n                           FT_UInt              load_flags,\n                           FT_Stream            stream,\n                           FT_Bitmap           *map,\n                           TT_SBit_MetricsRec  *metrics )\n  {\n    TT_SBitDecoderRec  decoder[1];\n    FT_Error           error;\n\n    FT_UNUSED( load_flags );\n    FT_UNUSED( stream );\n    FT_UNUSED( map );\n\n\n    error = tt_sbit_decoder_init( decoder, face, strike_index, metrics );\n    if ( !error )\n    {\n      error = tt_sbit_decoder_load_image( decoder,\n                                          load_flags,\n                                          glyph_index,\n                                          0,\n                                          0 );\n      tt_sbit_decoder_done( decoder );\n    }\n\n    return error;\n  }\n\n\n/* EOF */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttsbit.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttsbit.h                                                               */\n/*                                                                         */\n/*    TrueType and OpenType embedded bitmap support (specification).       */\n/*                                                                         */\n/*  Copyright 1996-2008, 2013 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTSBIT_H__\n#define __TTSBIT_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"ttload.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_eblc( TT_Face    face,\n                     FT_Stream  stream );\n\n  FT_LOCAL( void )\n  tt_face_free_eblc( TT_Face  face );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_set_sbit_strike( TT_Face          face,\n                           FT_Size_Request  req,\n                           FT_ULong*        astrike_index );\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_strike_metrics( TT_Face           face,\n                               FT_ULong          strike_index,\n                               FT_Size_Metrics*  metrics );\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_sbit_image( TT_Face              face,\n                           FT_ULong             strike_index,\n                           FT_UInt              glyph_index,\n                           FT_UInt              load_flags,\n                           FT_Stream            stream,\n                           FT_Bitmap           *map,\n                           TT_SBit_MetricsRec  *metrics );\n\n\nFT_END_HEADER\n\n#endif /* __TTSBIT_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/Jamfile",
    "content": "# FreeType 2 src/smooth Jamfile\n#\n# Copyright 2001 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) smooth ;\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = ftgrays ftsmooth ftspic ;\n  }\n  else\n  {\n    _sources = smooth ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/smooth Jamfile\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftgrays.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftgrays.c                                                              */\n/*                                                                         */\n/*    A new `perfect' anti-aliasing renderer (body).                       */\n/*                                                                         */\n/*  Copyright 2000-2003, 2005-2013 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file can be compiled without the rest of the FreeType engine, by */\n  /* defining the _STANDALONE_ macro when compiling it.  You also need to  */\n  /* put the files `ftgrays.h' and `ftimage.h' into the current            */\n  /* compilation directory.  Typically, you could do something like        */\n  /*                                                                       */\n  /* - copy `src/smooth/ftgrays.c' (this file) to your current directory   */\n  /*                                                                       */\n  /* - copy `include/freetype/ftimage.h' and `src/smooth/ftgrays.h' to the */\n  /*   same directory                                                      */\n  /*                                                                       */\n  /* - compile `ftgrays' with the _STANDALONE_ macro defined, as in        */\n  /*                                                                       */\n  /*     cc -c -D_STANDALONE_ ftgrays.c                                    */\n  /*                                                                       */\n  /* The renderer can be initialized with a call to                        */\n  /* `ft_gray_raster.raster_new'; an anti-aliased bitmap can be generated  */\n  /* with a call to `ft_gray_raster.raster_render'.                        */\n  /*                                                                       */\n  /* See the comments and documentation in the file `ftimage.h' for more   */\n  /* details on how the raster works.                                      */\n  /*                                                                       */\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This is a new anti-aliasing scan-converter for FreeType 2.  The       */\n  /* algorithm used here is _very_ different from the one in the standard  */\n  /* `ftraster' module.  Actually, `ftgrays' computes the _exact_          */\n  /* coverage of the outline on each pixel cell.                           */\n  /*                                                                       */\n  /* It is based on ideas that I initially found in Raph Levien's          */\n  /* excellent LibArt graphics library (see http://www.levien.com/libart   */\n  /* for more information, though the web pages do not tell anything       */\n  /* about the renderer; you'll have to dive into the source code to       */\n  /* understand how it works).                                             */\n  /*                                                                       */\n  /* Note, however, that this is a _very_ different implementation         */\n  /* compared to Raph's.  Coverage information is stored in a very         */\n  /* different way, and I don't use sorted vector paths.  Also, it doesn't */\n  /* use floating point values.                                            */\n  /*                                                                       */\n  /* This renderer has the following advantages:                           */\n  /*                                                                       */\n  /* - It doesn't need an intermediate bitmap.  Instead, one can supply a  */\n  /*   callback function that will be called by the renderer to draw gray  */\n  /*   spans on any target surface.  You can thus do direct composition on */\n  /*   any kind of bitmap, provided that you give the renderer the right   */\n  /*   callback.                                                           */\n  /*                                                                       */\n  /* - A perfect anti-aliaser, i.e., it computes the _exact_ coverage on   */\n  /*   each pixel cell.                                                    */\n  /*                                                                       */\n  /* - It performs a single pass on the outline (the `standard' FT2        */\n  /*   renderer makes two passes).                                         */\n  /*                                                                       */\n  /* - It can easily be modified to render to _any_ number of gray levels  */\n  /*   cheaply.                                                            */\n  /*                                                                       */\n  /* - For small (< 20) pixel sizes, it is faster than the standard        */\n  /*   renderer.                                                           */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_smooth\n\n\n#ifdef _STANDALONE_\n\n\n  /* Auxiliary macros for token concatenation. */\n#define FT_ERR_XCAT( x, y )  x ## y\n#define FT_ERR_CAT( x, y )   FT_ERR_XCAT( x, y )\n\n\n  /* define this to dump debugging information */\n/* #define FT_DEBUG_LEVEL_TRACE */\n\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n#include <stdio.h>\n#include <stdarg.h>\n#endif\n\n#include <stddef.h>\n#include <string.h>\n#include <setjmp.h>\n#include <limits.h>\n#define FT_UINT_MAX  UINT_MAX\n#define FT_INT_MAX   INT_MAX\n\n#define ft_memset   memset\n\n#define ft_setjmp   setjmp\n#define ft_longjmp  longjmp\n#define ft_jmp_buf  jmp_buf\n\ntypedef ptrdiff_t  FT_PtrDist;\n\n\n#define ErrRaster_Invalid_Mode      -2\n#define ErrRaster_Invalid_Outline   -1\n#define ErrRaster_Invalid_Argument  -3\n#define ErrRaster_Memory_Overflow   -4\n\n#define FT_BEGIN_HEADER\n#define FT_END_HEADER\n\n#include \"ftimage.h\"\n#include \"ftgrays.h\"\n\n\n  /* This macro is used to indicate that a function parameter is unused. */\n  /* Its purpose is simply to reduce compiler warnings.  Note also that  */\n  /* simply defining it as `(void)x' doesn't avoid warnings with certain */\n  /* ANSI compilers (e.g. LCC).                                          */\n#define FT_UNUSED( x )  (x) = (x)\n\n\n  /* we only use level 5 & 7 tracing messages; cf. ftdebug.h */\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n  void\n  FT_Message( const char*  fmt,\n              ... )\n  {\n    va_list  ap;\n\n\n    va_start( ap, fmt );\n    vfprintf( stderr, fmt, ap );\n    va_end( ap );\n  }\n\n\n  /* empty function useful for setting a breakpoint to catch errors */\n  int\n  FT_Throw( int          error,\n            int          line,\n            const char*  file )\n  {\n    FT_UNUSED( error );\n    FT_UNUSED( line );\n    FT_UNUSED( file );\n\n    return 0;\n  }\n\n\n  /* we don't handle tracing levels in stand-alone mode; */\n#ifndef FT_TRACE5\n#define FT_TRACE5( varformat )  FT_Message varformat\n#endif\n#ifndef FT_TRACE7\n#define FT_TRACE7( varformat )  FT_Message varformat\n#endif\n#ifndef FT_ERROR\n#define FT_ERROR( varformat )   FT_Message varformat\n#endif\n\n#define FT_THROW( e )                               \\\n          ( FT_Throw( FT_ERR_CAT( ErrRaster, e ),   \\\n                      __LINE__,                     \\\n                      __FILE__ )                  | \\\n            FT_ERR_CAT( ErrRaster, e )            )\n\n#else /* !FT_DEBUG_LEVEL_TRACE */\n\n#define FT_TRACE5( x )  do { } while ( 0 )     /* nothing */\n#define FT_TRACE7( x )  do { } while ( 0 )     /* nothing */\n#define FT_ERROR( x )   do { } while ( 0 )     /* nothing */\n#define FT_THROW( e )   FT_ERR_CAT( ErrRaster_, e )\n\n\n#endif /* !FT_DEBUG_LEVEL_TRACE */\n\n\n#define FT_DEFINE_OUTLINE_FUNCS( class_,               \\\n                                 move_to_, line_to_,   \\\n                                 conic_to_, cubic_to_, \\\n                                 shift_, delta_ )      \\\n          static const FT_Outline_Funcs class_ =       \\\n          {                                            \\\n            move_to_,                                  \\\n            line_to_,                                  \\\n            conic_to_,                                 \\\n            cubic_to_,                                 \\\n            shift_,                                    \\\n            delta_                                     \\\n         };\n\n#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_,            \\\n                                raster_new_, raster_reset_,       \\\n                                raster_set_mode_, raster_render_, \\\n                                raster_done_ )                    \\\n          const FT_Raster_Funcs class_ =                          \\\n          {                                                       \\\n            glyph_format_,                                        \\\n            raster_new_,                                          \\\n            raster_reset_,                                        \\\n            raster_set_mode_,                                     \\\n            raster_render_,                                       \\\n            raster_done_                                          \\\n         };\n\n\n#else /* !_STANDALONE_ */\n\n\n#include \"../../include/ft2build.h\"\n#include \"ftgrays.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/ftoutln.h\"\n\n#include \"ftsmerrs.h\"\n\n#include \"ftspic.h\"\n\n#define Smooth_Err_Invalid_Mode     Smooth_Err_Cannot_Render_Glyph\n#define Smooth_Err_Memory_Overflow  Smooth_Err_Out_Of_Memory\n#define ErrRaster_Memory_Overflow   Smooth_Err_Out_Of_Memory\n\n\n#endif /* !_STANDALONE_ */\n\n\n#ifndef FT_MEM_SET\n#define FT_MEM_SET( d, s, c )  ft_memset( d, s, c )\n#endif\n\n#ifndef FT_MEM_ZERO\n#define FT_MEM_ZERO( dest, count )  FT_MEM_SET( dest, 0, count )\n#endif\n\n  /* as usual, for the speed hungry :-) */\n\n#undef RAS_ARG\n#undef RAS_ARG_\n#undef RAS_VAR\n#undef RAS_VAR_\n\n#ifndef FT_STATIC_RASTER\n\n#define RAS_ARG   gray_PWorker  worker\n#define RAS_ARG_  gray_PWorker  worker,\n\n#define RAS_VAR   worker\n#define RAS_VAR_  worker,\n\n#else /* FT_STATIC_RASTER */\n\n#define RAS_ARG   /* empty */\n#define RAS_ARG_  /* empty */\n#define RAS_VAR   /* empty */\n#define RAS_VAR_  /* empty */\n\n#endif /* FT_STATIC_RASTER */\n\n\n  /* must be at least 6 bits! */\n#define PIXEL_BITS  8\n\n#undef FLOOR\n#undef CEILING\n#undef TRUNC\n#undef SCALED\n\n#define ONE_PIXEL       ( 1L << PIXEL_BITS )\n#define PIXEL_MASK      ( -1L << PIXEL_BITS )\n#define TRUNC( x )      ( (TCoord)( (x) >> PIXEL_BITS ) )\n#define SUBPIXELS( x )  ( (TPos)(x) << PIXEL_BITS )\n#define FLOOR( x )      ( (x) & -ONE_PIXEL )\n#define CEILING( x )    ( ( (x) + ONE_PIXEL - 1 ) & -ONE_PIXEL )\n#define ROUND( x )      ( ( (x) + ONE_PIXEL / 2 ) & -ONE_PIXEL )\n\n#if PIXEL_BITS >= 6\n#define UPSCALE( x )    ( (x) << ( PIXEL_BITS - 6 ) )\n#define DOWNSCALE( x )  ( (x) >> ( PIXEL_BITS - 6 ) )\n#else\n#define UPSCALE( x )    ( (x) >> ( 6 - PIXEL_BITS ) )\n#define DOWNSCALE( x )  ( (x) << ( 6 - PIXEL_BITS ) )\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*   TYPE DEFINITIONS                                                    */\n  /*                                                                       */\n\n  /* don't change the following types to FT_Int or FT_Pos, since we might */\n  /* need to define them to \"float\" or \"double\" when experimenting with   */\n  /* new algorithms                                                       */\n\n  typedef long  TCoord;   /* integer scanline/pixel coordinate */\n  typedef long  TPos;     /* sub-pixel coordinate              */\n\n  /* determine the type used to store cell areas.  This normally takes at */\n  /* least PIXEL_BITS*2 + 1 bits.  On 16-bit systems, we need to use      */\n  /* `long' instead of `int', otherwise bad things happen                 */\n\n#if PIXEL_BITS <= 7\n\n  typedef int  TArea;\n\n#else /* PIXEL_BITS >= 8 */\n\n  /* approximately determine the size of integers using an ANSI-C header */\n#if FT_UINT_MAX == 0xFFFFU\n  typedef long  TArea;\n#else\n  typedef int   TArea;\n#endif\n\n#endif /* PIXEL_BITS >= 8 */\n\n\n  /* maximum number of gray spans in a call to the span callback */\n#define FT_MAX_GRAY_SPANS  32\n\n\n  typedef struct TCell_*  PCell;\n\n  typedef struct  TCell_\n  {\n    TPos    x;     /* same with gray_TWorker.ex    */\n    TCoord  cover; /* same with gray_TWorker.cover */\n    TArea   area;\n    PCell   next;\n\n  } TCell;\n\n\n#if defined( _MSC_VER )      /* Visual C++ (and Intel C++) */\n  /* We disable the warning `structure was padded due to   */\n  /* __declspec(align())' in order to compile cleanly with */\n  /* the maximum level of warnings.                        */\n#pragma warning( push )\n#pragma warning( disable : 4324 )\n#endif /* _MSC_VER */\n\n  typedef struct  gray_TWorker_\n  {\n    TCoord  ex, ey;\n    TPos    min_ex, max_ex;\n    TPos    min_ey, max_ey;\n    TPos    count_ex, count_ey;\n\n    TArea   area;\n    TCoord  cover;\n    int     invalid;\n\n    PCell       cells;\n    FT_PtrDist  max_cells;\n    FT_PtrDist  num_cells;\n\n    TCoord  cx, cy;\n    TPos    x,  y;\n\n    TPos    last_ey;\n\n    FT_Vector   bez_stack[32 * 3 + 1];\n    int         lev_stack[32];\n\n    FT_Outline  outline;\n    FT_Bitmap   target;\n    FT_BBox     clip_box;\n\n    FT_Span     gray_spans[FT_MAX_GRAY_SPANS];\n    int         num_gray_spans;\n\n    FT_Raster_Span_Func  render_span;\n    void*                render_span_data;\n    int                  span_y;\n\n    int  band_size;\n    int  band_shoot;\n\n    ft_jmp_buf  jump_buffer;\n\n    void*       buffer;\n    long        buffer_size;\n\n    PCell*     ycells;\n    TPos       ycount;\n\n  } gray_TWorker, *gray_PWorker;\n\n#if defined( _MSC_VER )\n#pragma warning( pop )\n#endif\n\n\n#ifndef FT_STATIC_RASTER\n#define ras  (*worker)\n#else\n  static gray_TWorker  ras;\n#endif\n\n\n  typedef struct gray_TRaster_\n  {\n    void*         buffer;\n    long          buffer_size;\n    int           band_size;\n    void*         memory;\n    gray_PWorker  worker;\n\n  } gray_TRaster, *gray_PRaster;\n\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Initialize the cells table.                                           */\n  /*                                                                       */\n  static void\n  gray_init_cells( RAS_ARG_ void*  buffer,\n                   long            byte_size )\n  {\n    ras.buffer      = buffer;\n    ras.buffer_size = byte_size;\n\n    ras.ycells      = (PCell*) buffer;\n    ras.cells       = NULL;\n    ras.max_cells   = 0;\n    ras.num_cells   = 0;\n    ras.area        = 0;\n    ras.cover       = 0;\n    ras.invalid     = 1;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Compute the outline bounding box.                                     */\n  /*                                                                       */\n  static void\n  gray_compute_cbox( RAS_ARG )\n  {\n    FT_Outline*  outline = &ras.outline;\n    FT_Vector*   vec     = outline->points;\n    FT_Vector*   limit   = vec + outline->n_points;\n\n\n    if ( outline->n_points <= 0 )\n    {\n      ras.min_ex = ras.max_ex = 0;\n      ras.min_ey = ras.max_ey = 0;\n      return;\n    }\n\n    ras.min_ex = ras.max_ex = vec->x;\n    ras.min_ey = ras.max_ey = vec->y;\n\n    vec++;\n\n    for ( ; vec < limit; vec++ )\n    {\n      TPos  x = vec->x;\n      TPos  y = vec->y;\n\n\n      if ( x < ras.min_ex ) ras.min_ex = x;\n      if ( x > ras.max_ex ) ras.max_ex = x;\n      if ( y < ras.min_ey ) ras.min_ey = y;\n      if ( y > ras.max_ey ) ras.max_ey = y;\n    }\n\n    /* truncate the bounding box to integer pixels */\n    ras.min_ex = ras.min_ex >> 6;\n    ras.min_ey = ras.min_ey >> 6;\n    ras.max_ex = ( ras.max_ex + 63 ) >> 6;\n    ras.max_ey = ( ras.max_ey + 63 ) >> 6;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Record the current cell in the table.                                 */\n  /*                                                                       */\n  static PCell\n  gray_find_cell( RAS_ARG )\n  {\n    PCell  *pcell, cell;\n    TPos    x = ras.ex;\n\n\n    if ( x > ras.count_ex )\n      x = ras.count_ex;\n\n    pcell = &ras.ycells[ras.ey];\n    for (;;)\n    {\n      cell = *pcell;\n      if ( cell == NULL || cell->x > x )\n        break;\n\n      if ( cell->x == x )\n        goto Exit;\n\n      pcell = &cell->next;\n    }\n\n    if ( ras.num_cells >= ras.max_cells )\n      ft_longjmp( ras.jump_buffer, 1 );\n\n    cell        = ras.cells + ras.num_cells++;\n    cell->x     = x;\n    cell->area  = 0;\n    cell->cover = 0;\n\n    cell->next  = *pcell;\n    *pcell      = cell;\n\n  Exit:\n    return cell;\n  }\n\n\n  static void\n  gray_record_cell( RAS_ARG )\n  {\n    if ( !ras.invalid && ( ras.area | ras.cover ) )\n    {\n      PCell  cell = gray_find_cell( RAS_VAR );\n\n\n      cell->area  += ras.area;\n      cell->cover += ras.cover;\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Set the current cell to a new position.                               */\n  /*                                                                       */\n  static void\n  gray_set_cell( RAS_ARG_ TCoord  ex,\n                          TCoord  ey )\n  {\n    /* Move the cell pointer to a new position.  We set the `invalid'      */\n    /* flag to indicate that the cell isn't part of those we're interested */\n    /* in during the render phase.  This means that:                       */\n    /*                                                                     */\n    /* . the new vertical position must be within min_ey..max_ey-1.        */\n    /* . the new horizontal position must be strictly less than max_ex     */\n    /*                                                                     */\n    /* Note that if a cell is to the left of the clipping region, it is    */\n    /* actually set to the (min_ex-1) horizontal position.                 */\n\n    /* All cells that are on the left of the clipping region go to the */\n    /* min_ex - 1 horizontal position.                                 */\n    ey -= ras.min_ey;\n\n    if ( ex > ras.max_ex )\n      ex = ras.max_ex;\n\n    ex -= ras.min_ex;\n    if ( ex < 0 )\n      ex = -1;\n\n    /* are we moving to a different cell ? */\n    if ( ex != ras.ex || ey != ras.ey )\n    {\n      /* record the current one if it is valid */\n      if ( !ras.invalid )\n        gray_record_cell( RAS_VAR );\n\n      ras.area  = 0;\n      ras.cover = 0;\n    }\n\n    ras.ex      = ex;\n    ras.ey      = ey;\n    ras.invalid = ( (unsigned)ey >= (unsigned)ras.count_ey ||\n                              ex >= ras.count_ex           );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Start a new contour at a given cell.                                  */\n  /*                                                                       */\n  static void\n  gray_start_cell( RAS_ARG_ TCoord  ex,\n                            TCoord  ey )\n  {\n    if ( ex > ras.max_ex )\n      ex = (TCoord)( ras.max_ex );\n\n    if ( ex < ras.min_ex )\n      ex = (TCoord)( ras.min_ex - 1 );\n\n    ras.area    = 0;\n    ras.cover   = 0;\n    ras.ex      = ex - ras.min_ex;\n    ras.ey      = ey - ras.min_ey;\n    ras.last_ey = SUBPIXELS( ey );\n    ras.invalid = 0;\n\n    gray_set_cell( RAS_VAR_ ex, ey );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Render a scanline as one or more cells.                               */\n  /*                                                                       */\n  static void\n  gray_render_scanline( RAS_ARG_ TCoord  ey,\n                                 TPos    x1,\n                                 TCoord  y1,\n                                 TPos    x2,\n                                 TCoord  y2 )\n  {\n    TCoord  ex1, ex2, fx1, fx2, delta, mod;\n    long    p, first, dx;\n    int     incr;\n\n\n    dx = x2 - x1;\n\n    ex1 = TRUNC( x1 );\n    ex2 = TRUNC( x2 );\n    fx1 = (TCoord)( x1 - SUBPIXELS( ex1 ) );\n    fx2 = (TCoord)( x2 - SUBPIXELS( ex2 ) );\n\n    /* trivial case.  Happens often */\n    if ( y1 == y2 )\n    {\n      gray_set_cell( RAS_VAR_ ex2, ey );\n      return;\n    }\n\n    /* everything is located in a single cell.  That is easy! */\n    /*                                                        */\n    if ( ex1 == ex2 )\n    {\n      delta      = y2 - y1;\n      ras.area  += (TArea)(( fx1 + fx2 ) * delta);\n      ras.cover += delta;\n      return;\n    }\n\n    /* ok, we'll have to render a run of adjacent cells on the same */\n    /* scanline...                                                  */\n    /*                                                              */\n    p     = ( ONE_PIXEL - fx1 ) * ( y2 - y1 );\n    first = ONE_PIXEL;\n    incr  = 1;\n\n    if ( dx < 0 )\n    {\n      p     = fx1 * ( y2 - y1 );\n      first = 0;\n      incr  = -1;\n      dx    = -dx;\n    }\n\n    delta = (TCoord)( p / dx );\n    mod   = (TCoord)( p % dx );\n    if ( mod < 0 )\n    {\n      delta--;\n      mod += (TCoord)dx;\n    }\n\n    ras.area  += (TArea)(( fx1 + first ) * delta);\n    ras.cover += delta;\n\n    ex1 += incr;\n    gray_set_cell( RAS_VAR_ ex1, ey );\n    y1  += delta;\n\n    if ( ex1 != ex2 )\n    {\n      TCoord  lift, rem;\n\n\n      p    = ONE_PIXEL * ( y2 - y1 + delta );\n      lift = (TCoord)( p / dx );\n      rem  = (TCoord)( p % dx );\n      if ( rem < 0 )\n      {\n        lift--;\n        rem += (TCoord)dx;\n      }\n\n      mod -= (int)dx;\n\n      while ( ex1 != ex2 )\n      {\n        delta = lift;\n        mod  += rem;\n        if ( mod >= 0 )\n        {\n          mod -= (TCoord)dx;\n          delta++;\n        }\n\n        ras.area  += (TArea)(ONE_PIXEL * delta);\n        ras.cover += delta;\n        y1        += delta;\n        ex1       += incr;\n        gray_set_cell( RAS_VAR_ ex1, ey );\n      }\n    }\n\n    delta      = y2 - y1;\n    ras.area  += (TArea)(( fx2 + ONE_PIXEL - first ) * delta);\n    ras.cover += delta;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Render a given line as a series of scanlines.                         */\n  /*                                                                       */\n  static void\n  gray_render_line( RAS_ARG_ TPos  to_x,\n                             TPos  to_y )\n  {\n    TCoord  ey1, ey2, fy1, fy2, mod;\n    TPos    dx, dy, x, x2;\n    long    p, first;\n    int     delta, rem, lift, incr;\n\n\n    ey1 = TRUNC( ras.last_ey );\n    ey2 = TRUNC( to_y );     /* if (ey2 >= ras.max_ey) ey2 = ras.max_ey-1; */\n    fy1 = (TCoord)( ras.y - ras.last_ey );\n    fy2 = (TCoord)( to_y - SUBPIXELS( ey2 ) );\n\n    dx = to_x - ras.x;\n    dy = to_y - ras.y;\n\n    /* XXX: we should do something about the trivial case where dx == 0, */\n    /*      as it happens very often!                                    */\n\n    /* perform vertical clipping */\n    {\n      TCoord  min, max;\n\n\n      min = ey1;\n      max = ey2;\n      if ( ey1 > ey2 )\n      {\n        min = ey2;\n        max = ey1;\n      }\n      if ( min >= ras.max_ey || max < ras.min_ey )\n        goto End;\n    }\n\n    /* everything is on a single scanline */\n    if ( ey1 == ey2 )\n    {\n      gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, to_x, fy2 );\n      goto End;\n    }\n\n    /* vertical line - avoid calling gray_render_scanline */\n    incr = 1;\n\n    if ( dx == 0 )\n    {\n      TCoord  ex     = TRUNC( ras.x );\n      TCoord  two_fx = (TCoord)( ( ras.x - SUBPIXELS( ex ) ) << 1 );\n      TArea   area;\n\n\n      first = ONE_PIXEL;\n      if ( dy < 0 )\n      {\n        first = 0;\n        incr  = -1;\n      }\n\n      delta      = (int)( first - fy1 );\n      ras.area  += (TArea)two_fx * delta;\n      ras.cover += delta;\n      ey1       += incr;\n\n      gray_set_cell( RAS_VAR_ ex, ey1 );\n\n      delta = (int)( first + first - ONE_PIXEL );\n      area  = (TArea)two_fx * delta;\n      while ( ey1 != ey2 )\n      {\n        ras.area  += area;\n        ras.cover += delta;\n        ey1       += incr;\n\n        gray_set_cell( RAS_VAR_ ex, ey1 );\n      }\n\n      delta      = (int)( fy2 - ONE_PIXEL + first );\n      ras.area  += (TArea)two_fx * delta;\n      ras.cover += delta;\n\n      goto End;\n    }\n\n    /* ok, we have to render several scanlines */\n    p     = ( ONE_PIXEL - fy1 ) * dx;\n    first = ONE_PIXEL;\n    incr  = 1;\n\n    if ( dy < 0 )\n    {\n      p     = fy1 * dx;\n      first = 0;\n      incr  = -1;\n      dy    = -dy;\n    }\n\n    delta = (int)( p / dy );\n    mod   = (int)( p % dy );\n    if ( mod < 0 )\n    {\n      delta--;\n      mod += (TCoord)dy;\n    }\n\n    x = ras.x + delta;\n    gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, x, (TCoord)first );\n\n    ey1 += incr;\n    gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 );\n\n    if ( ey1 != ey2 )\n    {\n      p     = ONE_PIXEL * dx;\n      lift  = (int)( p / dy );\n      rem   = (int)( p % dy );\n      if ( rem < 0 )\n      {\n        lift--;\n        rem += (int)dy;\n      }\n      mod -= (int)dy;\n\n      while ( ey1 != ey2 )\n      {\n        delta = lift;\n        mod  += rem;\n        if ( mod >= 0 )\n        {\n          mod -= (int)dy;\n          delta++;\n        }\n\n        x2 = x + delta;\n        gray_render_scanline( RAS_VAR_ ey1, x,\n                                       (TCoord)( ONE_PIXEL - first ), x2,\n                                       (TCoord)first );\n        x = x2;\n\n        ey1 += incr;\n        gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 );\n      }\n    }\n\n    gray_render_scanline( RAS_VAR_ ey1, x,\n                                   (TCoord)( ONE_PIXEL - first ), to_x,\n                                   fy2 );\n\n  End:\n    ras.x       = to_x;\n    ras.y       = to_y;\n    ras.last_ey = SUBPIXELS( ey2 );\n  }\n\n\n  static void\n  gray_split_conic( FT_Vector*  base )\n  {\n    TPos  a, b;\n\n\n    base[4].x = base[2].x;\n    b = base[1].x;\n    a = base[3].x = ( base[2].x + b ) / 2;\n    b = base[1].x = ( base[0].x + b ) / 2;\n    base[2].x = ( a + b ) / 2;\n\n    base[4].y = base[2].y;\n    b = base[1].y;\n    a = base[3].y = ( base[2].y + b ) / 2;\n    b = base[1].y = ( base[0].y + b ) / 2;\n    base[2].y = ( a + b ) / 2;\n  }\n\n\n  static void\n  gray_render_conic( RAS_ARG_ const FT_Vector*  control,\n                              const FT_Vector*  to )\n  {\n    TPos        dx, dy;\n    TPos        min, max, y;\n    int         top, level;\n    int*        levels;\n    FT_Vector*  arc;\n\n\n    levels = ras.lev_stack;\n\n    arc      = ras.bez_stack;\n    arc[0].x = UPSCALE( to->x );\n    arc[0].y = UPSCALE( to->y );\n    arc[1].x = UPSCALE( control->x );\n    arc[1].y = UPSCALE( control->y );\n    arc[2].x = ras.x;\n    arc[2].y = ras.y;\n    top      = 0;\n\n    dx = FT_ABS( arc[2].x + arc[0].x - 2 * arc[1].x );\n    dy = FT_ABS( arc[2].y + arc[0].y - 2 * arc[1].y );\n    if ( dx < dy )\n      dx = dy;\n\n    if ( dx < ONE_PIXEL / 4 )\n      goto Draw;\n\n    /* short-cut the arc that crosses the current band */\n    min = max = arc[0].y;\n\n    y = arc[1].y;\n    if ( y < min ) min = y;\n    if ( y > max ) max = y;\n\n    y = arc[2].y;\n    if ( y < min ) min = y;\n    if ( y > max ) max = y;\n\n    if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < ras.min_ey )\n      goto Draw;\n\n    level = 0;\n    do\n    {\n      dx >>= 2;\n      level++;\n    } while ( dx > ONE_PIXEL / 4 );\n\n    levels[0] = level;\n\n    do\n    {\n      level = levels[top];\n      if ( level > 0 )\n      {\n        gray_split_conic( arc );\n        arc += 2;\n        top++;\n        levels[top] = levels[top - 1] = level - 1;\n        continue;\n      }\n\n    Draw:\n      gray_render_line( RAS_VAR_ arc[0].x, arc[0].y );\n      top--;\n      arc -= 2;\n\n    } while ( top >= 0 );\n  }\n\n\n  static void\n  gray_split_cubic( FT_Vector*  base )\n  {\n    TPos  a, b, c, d;\n\n\n    base[6].x = base[3].x;\n    c = base[1].x;\n    d = base[2].x;\n    base[1].x = a = ( base[0].x + c ) / 2;\n    base[5].x = b = ( base[3].x + d ) / 2;\n    c = ( c + d ) / 2;\n    base[2].x = a = ( a + c ) / 2;\n    base[4].x = b = ( b + c ) / 2;\n    base[3].x = ( a + b ) / 2;\n\n    base[6].y = base[3].y;\n    c = base[1].y;\n    d = base[2].y;\n    base[1].y = a = ( base[0].y + c ) / 2;\n    base[5].y = b = ( base[3].y + d ) / 2;\n    c = ( c + d ) / 2;\n    base[2].y = a = ( a + c ) / 2;\n    base[4].y = b = ( b + c ) / 2;\n    base[3].y = ( a + b ) / 2;\n  }\n\n\n  static void\n  gray_render_cubic( RAS_ARG_ const FT_Vector*  control1,\n                              const FT_Vector*  control2,\n                              const FT_Vector*  to )\n  {\n    FT_Vector*  arc;\n    TPos        min, max, y;\n\n\n    arc      = ras.bez_stack;\n    arc[0].x = UPSCALE( to->x );\n    arc[0].y = UPSCALE( to->y );\n    arc[1].x = UPSCALE( control2->x );\n    arc[1].y = UPSCALE( control2->y );\n    arc[2].x = UPSCALE( control1->x );\n    arc[2].y = UPSCALE( control1->y );\n    arc[3].x = ras.x;\n    arc[3].y = ras.y;\n\n    /* Short-cut the arc that crosses the current band. */\n    min = max = arc[0].y;\n\n    y = arc[1].y;\n    if ( y < min )\n      min = y;\n    if ( y > max )\n      max = y;\n\n    y = arc[2].y;\n    if ( y < min )\n      min = y;\n    if ( y > max )\n      max = y;\n\n    y = arc[3].y;\n    if ( y < min )\n      min = y;\n    if ( y > max )\n      max = y;\n\n    if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < ras.min_ey )\n      goto Draw;\n\n    for (;;)\n    {\n      /* Decide whether to split or draw. See `Rapid Termination          */\n      /* Evaluation for Recursive Subdivision of Bezier Curves' by Thomas */\n      /* F. Hain, at                                                      */\n      /* http://www.cis.southalabama.edu/~hain/general/Publications/Bezier/Camera-ready%20CISST02%202.pdf */\n\n      {\n        TPos  dx, dy, dx_, dy_;\n        TPos  dx1, dy1, dx2, dy2;\n        TPos  L, s, s_limit;\n\n\n        /* dx and dy are x and y components of the P0-P3 chord vector. */\n        dx = arc[3].x - arc[0].x;\n        dy = arc[3].y - arc[0].y;\n\n        /* L is an (under)estimate of the Euclidean distance P0-P3.       */\n        /*                                                                */\n        /* If dx >= dy, then r = sqrt(dx^2 + dy^2) can be overestimated   */\n        /* with least maximum error by                                    */\n        /*                                                                */\n        /*   r_upperbound = dx + (sqrt(2) - 1) * dy  ,                    */\n        /*                                                                */\n        /* where sqrt(2) - 1 can be (over)estimated by 107/256, giving an */\n        /* error of no more than 8.4%.                                    */\n        /*                                                                */\n        /* Similarly, some elementary calculus shows that r can be        */\n        /* underestimated with least maximum error by                     */\n        /*                                                                */\n        /*   r_lowerbound = sqrt(2 + sqrt(2)) / 2 * dx                    */\n        /*                  + sqrt(2 - sqrt(2)) / 2 * dy  .               */\n        /*                                                                */\n        /* 236/256 and 97/256 are (under)estimates of the two algebraic   */\n        /* numbers, giving an error of no more than 8.1%.                 */\n\n        dx_ = FT_ABS( dx );\n        dy_ = FT_ABS( dy );\n\n        /* This is the same as                     */\n        /*                                         */\n        /*   L = ( 236 * FT_MAX( dx_, dy_ )        */\n        /*       + 97 * FT_MIN( dx_, dy_ ) ) >> 8; */\n        L = ( dx_ > dy_ ? 236 * dx_ +  97 * dy_\n                        :  97 * dx_ + 236 * dy_ ) >> 8;\n\n        /* Avoid possible arithmetic overflow below by splitting. */\n        if ( L > 32767 )\n          goto Split;\n\n        /* Max deviation may be as much as (s/L) * 3/4 (if Hain's v = 1). */\n        s_limit = L * (TPos)( ONE_PIXEL / 6 );\n\n        /* s is L * the perpendicular distance from P1 to the line P0-P3. */\n        dx1 = arc[1].x - arc[0].x;\n        dy1 = arc[1].y - arc[0].y;\n        s = FT_ABS( dy * dx1 - dx * dy1 );\n\n        if ( s > s_limit )\n          goto Split;\n\n        /* s is L * the perpendicular distance from P2 to the line P0-P3. */\n        dx2 = arc[2].x - arc[0].x;\n        dy2 = arc[2].y - arc[0].y;\n        s = FT_ABS( dy * dx2 - dx * dy2 );\n\n        if ( s > s_limit )\n          goto Split;\n\n        /* Split super curvy segments where the off points are so far\n           from the chord that the angles P0-P1-P3 or P0-P2-P3 become\n           acute as detected by appropriate dot products. */\n        if ( dx1 * ( dx1 - dx ) + dy1 * ( dy1 - dy ) > 0 ||\n             dx2 * ( dx2 - dx ) + dy2 * ( dy2 - dy ) > 0 )\n          goto Split;\n\n        /* No reason to split. */\n        goto Draw;\n      }\n\n    Split:\n      gray_split_cubic( arc );\n      arc += 3;\n      continue;\n\n    Draw:\n      gray_render_line( RAS_VAR_ arc[0].x, arc[0].y );\n\n      if ( arc == ras.bez_stack )\n        return;\n\n      arc -= 3;\n    }\n  }\n\n\n  static int\n  gray_move_to( const FT_Vector*  to,\n                gray_PWorker      worker )\n  {\n    TPos  x, y;\n\n\n    /* record current cell, if any */\n    gray_record_cell( RAS_VAR );\n\n    /* start to a new position */\n    x = UPSCALE( to->x );\n    y = UPSCALE( to->y );\n\n    gray_start_cell( RAS_VAR_ TRUNC( x ), TRUNC( y ) );\n\n    worker->x = x;\n    worker->y = y;\n    return 0;\n  }\n\n\n  static int\n  gray_line_to( const FT_Vector*  to,\n                gray_PWorker      worker )\n  {\n    gray_render_line( RAS_VAR_ UPSCALE( to->x ), UPSCALE( to->y ) );\n    return 0;\n  }\n\n\n  static int\n  gray_conic_to( const FT_Vector*  control,\n                 const FT_Vector*  to,\n                 gray_PWorker      worker )\n  {\n    gray_render_conic( RAS_VAR_ control, to );\n    return 0;\n  }\n\n\n  static int\n  gray_cubic_to( const FT_Vector*  control1,\n                 const FT_Vector*  control2,\n                 const FT_Vector*  to,\n                 gray_PWorker      worker )\n  {\n    gray_render_cubic( RAS_VAR_ control1, control2, to );\n    return 0;\n  }\n\n\n  static void\n  gray_render_span( int             y,\n                    int             count,\n                    const FT_Span*  spans,\n                    gray_PWorker    worker )\n  {\n    unsigned char*  p;\n    FT_Bitmap*      map = &worker->target;\n\n\n    /* first of all, compute the scanline offset */\n    p = (unsigned char*)map->buffer - y * map->pitch;\n    if ( map->pitch >= 0 )\n      p += (unsigned)( ( map->rows - 1 ) * map->pitch );\n\n    for ( ; count > 0; count--, spans++ )\n    {\n      unsigned char  coverage = spans->coverage;\n\n\n      if ( coverage )\n      {\n        /* For small-spans it is faster to do it by ourselves than\n         * calling `memset'.  This is mainly due to the cost of the\n         * function call.\n         */\n        if ( spans->len >= 8 )\n          FT_MEM_SET( p + spans->x, (unsigned char)coverage, spans->len );\n        else\n        {\n          unsigned char*  q = p + spans->x;\n\n\n          switch ( spans->len )\n          {\n          case 7: *q++ = (unsigned char)coverage;\n          case 6: *q++ = (unsigned char)coverage;\n          case 5: *q++ = (unsigned char)coverage;\n          case 4: *q++ = (unsigned char)coverage;\n          case 3: *q++ = (unsigned char)coverage;\n          case 2: *q++ = (unsigned char)coverage;\n          case 1: *q   = (unsigned char)coverage;\n          default:\n            ;\n          }\n        }\n      }\n    }\n  }\n\n\n  static void\n  gray_hline( RAS_ARG_ TCoord  x,\n                       TCoord  y,\n                       TPos    area,\n                       TCoord  acount )\n  {\n    int  coverage;\n\n\n    /* compute the coverage line's coverage, depending on the    */\n    /* outline fill rule                                         */\n    /*                                                           */\n    /* the coverage percentage is area/(PIXEL_BITS*PIXEL_BITS*2) */\n    /*                                                           */\n    coverage = (int)( area >> ( PIXEL_BITS * 2 + 1 - 8 ) );\n                                                    /* use range 0..256 */\n    if ( coverage < 0 )\n      coverage = -coverage;\n\n    if ( ras.outline.flags & FT_OUTLINE_EVEN_ODD_FILL )\n    {\n      coverage &= 511;\n\n      if ( coverage > 256 )\n        coverage = 512 - coverage;\n      else if ( coverage == 256 )\n        coverage = 255;\n    }\n    else\n    {\n      /* normal non-zero winding rule */\n      if ( coverage >= 256 )\n        coverage = 255;\n    }\n\n    y += (TCoord)ras.min_ey;\n    x += (TCoord)ras.min_ex;\n\n    /* FT_Span.x is a 16-bit short, so limit our coordinates appropriately */\n    if ( x >= 32767 )\n      x = 32767;\n\n    /* FT_Span.y is an integer, so limit our coordinates appropriately */\n    if ( y >= FT_INT_MAX )\n      y = FT_INT_MAX;\n\n    if ( coverage )\n    {\n      FT_Span*  span;\n      int       count;\n\n\n      /* see whether we can add this span to the current list */\n      count = ras.num_gray_spans;\n      span  = ras.gray_spans + count - 1;\n      if ( count > 0                          &&\n           ras.span_y == y                    &&\n           (int)span->x + span->len == (int)x &&\n           span->coverage == coverage         )\n      {\n        span->len = (unsigned short)( span->len + acount );\n        return;\n      }\n\n      if ( ras.span_y != y || count >= FT_MAX_GRAY_SPANS )\n      {\n        if ( ras.render_span && count > 0 )\n          ras.render_span( ras.span_y, count, ras.gray_spans,\n                           ras.render_span_data );\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n        if ( count > 0 )\n        {\n          int  n;\n\n\n          FT_TRACE7(( \"y = %3d \", ras.span_y ));\n          span = ras.gray_spans;\n          for ( n = 0; n < count; n++, span++ )\n            FT_TRACE7(( \"[%d..%d]:%02x \",\n                        span->x, span->x + span->len - 1, span->coverage ));\n          FT_TRACE7(( \"\\n\" ));\n        }\n\n#endif /* FT_DEBUG_LEVEL_TRACE */\n\n        ras.num_gray_spans = 0;\n        ras.span_y         = (int)y;\n\n        count = 0;\n        span  = ras.gray_spans;\n      }\n      else\n        span++;\n\t  // Fix the Vulnerability Report FoxIT Reader - MSVR-10-0077.\n\t  // Limited to the value range of 'x', we have to crop it for avoid the overflow.\n\t  if (x < 32768) {\n      /* add a gray span to the current list */\n      span->x        = (short)x;\n      span->len      = (unsigned short)acount;\n      span->coverage = (unsigned char)coverage;\n\n      ras.num_gray_spans++;\n\t  }\n    }\n  }\n\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n  /* to be called while in the debugger --                                */\n  /* this function causes a compiler warning since it is unused otherwise */\n  static void\n  gray_dump_cells( RAS_ARG )\n  {\n    int  yindex;\n\n\n    for ( yindex = 0; yindex < ras.ycount; yindex++ )\n    {\n      PCell  cell;\n\n\n      printf( \"%3d:\", yindex );\n\n      for ( cell = ras.ycells[yindex]; cell != NULL; cell = cell->next )\n        printf( \" (%3ld, c:%4ld, a:%6d)\", cell->x, cell->cover, cell->area );\n      printf( \"\\n\" );\n    }\n  }\n\n#endif /* FT_DEBUG_LEVEL_TRACE */\n\n\n  static void\n  gray_sweep( RAS_ARG_ const FT_Bitmap*  target )\n  {\n    int  yindex;\n\n    FT_UNUSED( target );\n\n\n    if ( ras.num_cells == 0 )\n      return;\n\n    ras.num_gray_spans = 0;\n\n    FT_TRACE7(( \"gray_sweep: start\\n\" ));\n\n    for ( yindex = 0; yindex < ras.ycount; yindex++ )\n    {\n      PCell   cell  = ras.ycells[yindex];\n      TCoord  cover = 0;\n      TCoord  x     = 0;\n\n\n      for ( ; cell != NULL; cell = cell->next )\n      {\n        TPos  area;\n\n\n        if ( cell->x > x && cover != 0 )\n          gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ),\n                      cell->x - x );\n\n        cover += cell->cover;\n        area   = cover * ( ONE_PIXEL * 2 ) - cell->area;\n\n        if ( area != 0 && cell->x >= 0 )\n          gray_hline( RAS_VAR_ cell->x, yindex, area, 1 );\n\n        x = cell->x + 1;\n      }\n\n      if ( cover != 0 )\n        gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ),\n                    ras.count_ex - x );\n    }\n\n    if ( ras.render_span && ras.num_gray_spans > 0 )\n      ras.render_span( ras.span_y, ras.num_gray_spans,\n                       ras.gray_spans, ras.render_span_data );\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n    if ( ras.num_gray_spans > 0 )\n    {\n      FT_Span*  span;\n      int       n;\n\n\n      FT_TRACE7(( \"y = %3d \", ras.span_y ));\n      span = ras.gray_spans;\n      for ( n = 0; n < ras.num_gray_spans; n++, span++ )\n        FT_TRACE7(( \"[%d..%d]:%02x \",\n                    span->x, span->x + span->len - 1, span->coverage ));\n      FT_TRACE7(( \"\\n\" ));\n    }\n\n    FT_TRACE7(( \"gray_sweep: end\\n\" ));\n\n#endif /* FT_DEBUG_LEVEL_TRACE */\n\n  }\n\n\n#ifdef _STANDALONE_\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  The following function should only compile in stand-alone mode,      */\n  /*  i.e., when building this component without the rest of FreeType.     */\n  /*                                                                       */\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Decompose                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Walk over an outline's structure to decompose it into individual   */\n  /*    segments and Bézier arcs.  This function is also able to emit      */\n  /*    `move to' and `close to' operations to indicate the start and end  */\n  /*    of new contours in the outline.                                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    outline        :: A pointer to the source target.                  */\n  /*                                                                       */\n  /*    func_interface :: A table of `emitters', i.e., function pointers   */\n  /*                      called during decomposition to indicate path     */\n  /*                      operations.                                      */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    user           :: A typeless pointer which is passed to each       */\n  /*                      emitter during the decomposition.  It can be     */\n  /*                      used to store the state during the               */\n  /*                      decomposition.                                   */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Error code.  0 means success.                                      */\n  /*                                                                       */\n  static int\n  FT_Outline_Decompose( const FT_Outline*        outline,\n                        const FT_Outline_Funcs*  func_interface,\n                        void*                    user )\n  {\n#undef SCALED\n#define SCALED( x )  ( ( (x) << shift ) - delta )\n\n    FT_Vector   v_last;\n    FT_Vector   v_control;\n    FT_Vector   v_start;\n\n    FT_Vector*  point;\n    FT_Vector*  limit;\n    char*       tags;\n\n    int         error;\n\n    int   n;         /* index of contour in outline     */\n    int   first;     /* index of first point in contour */\n    char  tag;       /* current point's state           */\n\n    int   shift;\n    TPos  delta;\n\n\n    if ( !outline || !func_interface )\n      return FT_THROW( Invalid_Argument );\n\n    shift = func_interface->shift;\n    delta = func_interface->delta;\n    first = 0;\n\n    for ( n = 0; n < outline->n_contours; n++ )\n    {\n      int  last;  /* index of last point in contour */\n\n\n      FT_TRACE5(( \"FT_Outline_Decompose: Outline %d\\n\", n ));\n\n      last  = outline->contours[n];\n      if ( last < 0 )\n        goto Invalid_Outline;\n      limit = outline->points + last;\n\n      v_start   = outline->points[first];\n      v_start.x = SCALED( v_start.x );\n      v_start.y = SCALED( v_start.y );\n\n      v_last   = outline->points[last];\n      v_last.x = SCALED( v_last.x );\n      v_last.y = SCALED( v_last.y );\n\n      v_control = v_start;\n\n      point = outline->points + first;\n      tags  = outline->tags   + first;\n      tag   = FT_CURVE_TAG( tags[0] );\n\n      /* A contour cannot start with a cubic control point! */\n      if ( tag == FT_CURVE_TAG_CUBIC )\n        goto Invalid_Outline;\n\n      /* check first point to determine origin */\n      if ( tag == FT_CURVE_TAG_CONIC )\n      {\n        /* first point is conic control.  Yes, this happens. */\n        if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON )\n        {\n          /* start at last point if it is on the curve */\n          v_start = v_last;\n          limit--;\n        }\n        else\n        {\n          /* if both first and last points are conic,         */\n          /* start at their middle and record its position    */\n          /* for closure                                      */\n          v_start.x = ( v_start.x + v_last.x ) / 2;\n          v_start.y = ( v_start.y + v_last.y ) / 2;\n\n          v_last = v_start;\n        }\n        point--;\n        tags--;\n      }\n\n      FT_TRACE5(( \"  move to (%.2f, %.2f)\\n\",\n                  v_start.x / 64.0, v_start.y / 64.0 ));\n      error = func_interface->move_to( &v_start, user );\n      if ( error )\n        goto Exit;\n\n      while ( point < limit )\n      {\n        point++;\n        tags++;\n\n        tag = FT_CURVE_TAG( tags[0] );\n        switch ( tag )\n        {\n        case FT_CURVE_TAG_ON:  /* emit a single line_to */\n          {\n            FT_Vector  vec;\n\n\n            vec.x = SCALED( point->x );\n            vec.y = SCALED( point->y );\n\n            FT_TRACE5(( \"  line to (%.2f, %.2f)\\n\",\n                        vec.x / 64.0, vec.y / 64.0 ));\n            error = func_interface->line_to( &vec, user );\n            if ( error )\n              goto Exit;\n            continue;\n          }\n\n        case FT_CURVE_TAG_CONIC:  /* consume conic arcs */\n          v_control.x = SCALED( point->x );\n          v_control.y = SCALED( point->y );\n\n        Do_Conic:\n          if ( point < limit )\n          {\n            FT_Vector  vec;\n            FT_Vector  v_middle;\n\n\n            point++;\n            tags++;\n            tag = FT_CURVE_TAG( tags[0] );\n\n            vec.x = SCALED( point->x );\n            vec.y = SCALED( point->y );\n\n            if ( tag == FT_CURVE_TAG_ON )\n            {\n              FT_TRACE5(( \"  conic to (%.2f, %.2f)\"\n                          \" with control (%.2f, %.2f)\\n\",\n                          vec.x / 64.0, vec.y / 64.0,\n                          v_control.x / 64.0, v_control.y / 64.0 ));\n              error = func_interface->conic_to( &v_control, &vec, user );\n              if ( error )\n                goto Exit;\n              continue;\n            }\n\n            if ( tag != FT_CURVE_TAG_CONIC )\n              goto Invalid_Outline;\n\n            v_middle.x = ( v_control.x + vec.x ) / 2;\n            v_middle.y = ( v_control.y + vec.y ) / 2;\n\n            FT_TRACE5(( \"  conic to (%.2f, %.2f)\"\n                        \" with control (%.2f, %.2f)\\n\",\n                        v_middle.x / 64.0, v_middle.y / 64.0,\n                        v_control.x / 64.0, v_control.y / 64.0 ));\n            error = func_interface->conic_to( &v_control, &v_middle, user );\n            if ( error )\n              goto Exit;\n\n            v_control = vec;\n            goto Do_Conic;\n          }\n\n          FT_TRACE5(( \"  conic to (%.2f, %.2f)\"\n                      \" with control (%.2f, %.2f)\\n\",\n                      v_start.x / 64.0, v_start.y / 64.0,\n                      v_control.x / 64.0, v_control.y / 64.0 ));\n          error = func_interface->conic_to( &v_control, &v_start, user );\n          goto Close;\n\n        default:  /* FT_CURVE_TAG_CUBIC */\n          {\n            FT_Vector  vec1, vec2;\n\n\n            if ( point + 1 > limit                             ||\n                 FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )\n              goto Invalid_Outline;\n\n            point += 2;\n            tags  += 2;\n\n            vec1.x = SCALED( point[-2].x );\n            vec1.y = SCALED( point[-2].y );\n\n            vec2.x = SCALED( point[-1].x );\n            vec2.y = SCALED( point[-1].y );\n\n            if ( point <= limit )\n            {\n              FT_Vector  vec;\n\n\n              vec.x = SCALED( point->x );\n              vec.y = SCALED( point->y );\n\n              FT_TRACE5(( \"  cubic to (%.2f, %.2f)\"\n                          \" with controls (%.2f, %.2f) and (%.2f, %.2f)\\n\",\n                          vec.x / 64.0, vec.y / 64.0,\n                          vec1.x / 64.0, vec1.y / 64.0,\n                          vec2.x / 64.0, vec2.y / 64.0 ));\n              error = func_interface->cubic_to( &vec1, &vec2, &vec, user );\n              if ( error )\n                goto Exit;\n              continue;\n            }\n\n            FT_TRACE5(( \"  cubic to (%.2f, %.2f)\"\n                        \" with controls (%.2f, %.2f) and (%.2f, %.2f)\\n\",\n                        v_start.x / 64.0, v_start.y / 64.0,\n                        vec1.x / 64.0, vec1.y / 64.0,\n                        vec2.x / 64.0, vec2.y / 64.0 ));\n            error = func_interface->cubic_to( &vec1, &vec2, &v_start, user );\n            goto Close;\n          }\n        }\n      }\n\n      /* close the contour with a line segment */\n      FT_TRACE5(( \"  line to (%.2f, %.2f)\\n\",\n                  v_start.x / 64.0, v_start.y / 64.0 ));\n      error = func_interface->line_to( &v_start, user );\n\n   Close:\n      if ( error )\n        goto Exit;\n\n      first = last + 1;\n    }\n\n    FT_TRACE5(( \"FT_Outline_Decompose: Done\\n\", n ));\n    return 0;\n\n  Exit:\n    FT_TRACE5(( \"FT_Outline_Decompose: Error %d\\n\", error ));\n    return error;\n\n  Invalid_Outline:\n    return FT_THROW( Invalid_Outline );\n  }\n\n#endif /* _STANDALONE_ */\n\n\n  typedef struct  gray_TBand_\n  {\n    TPos  min, max;\n\n  } gray_TBand;\n\n    FT_DEFINE_OUTLINE_FUNCS(func_interface,\n      (FT_Outline_MoveTo_Func) gray_move_to,\n      (FT_Outline_LineTo_Func) gray_line_to,\n      (FT_Outline_ConicTo_Func)gray_conic_to,\n      (FT_Outline_CubicTo_Func)gray_cubic_to,\n      0,\n      0\n    )\n\n  static int\n  gray_convert_glyph_inner( RAS_ARG )\n  {\n\n    volatile int  error = 0;\n\n#ifdef FT_CONFIG_OPTION_PIC\n      FT_Outline_Funcs func_interface;\n      Init_Class_func_interface(&func_interface);\n#endif\n#ifndef _FX_MANAGED_CODE_    \n    if ( ft_setjmp( ras.jump_buffer ) == 0 )\n    {\n#endif\n      error = FT_Outline_Decompose( &ras.outline, &func_interface, &ras );\n      gray_record_cell( RAS_VAR );\n#ifndef _FX_MANAGED_CODE_ \n\t}\n    else\n      error = FT_THROW( Memory_Overflow );\n#endif\n    return error;\n  }\n\n\n  static int\n  gray_convert_glyph( RAS_ARG )\n  {\n    gray_TBand            bands[40];\n    gray_TBand* volatile  band;\n    int volatile          n, num_bands;\n    TPos volatile         min, max, max_y;\n    FT_BBox*              clip;\n\n\n    /* Set up state in the raster object */\n    gray_compute_cbox( RAS_VAR );\n\n    /* clip to target bitmap, exit if nothing to do */\n    clip = &ras.clip_box;\n\n    if ( ras.max_ex <= clip->xMin || ras.min_ex >= clip->xMax ||\n         ras.max_ey <= clip->yMin || ras.min_ey >= clip->yMax )\n      return 0;\n\n    if ( ras.min_ex < clip->xMin ) ras.min_ex = clip->xMin;\n    if ( ras.min_ey < clip->yMin ) ras.min_ey = clip->yMin;\n\n    if ( ras.max_ex > clip->xMax ) ras.max_ex = clip->xMax;\n    if ( ras.max_ey > clip->yMax ) ras.max_ey = clip->yMax;\n\n    ras.count_ex = ras.max_ex - ras.min_ex;\n    ras.count_ey = ras.max_ey - ras.min_ey;\n\n    /* set up vertical bands */\n    num_bands = (int)( ( ras.max_ey - ras.min_ey ) / ras.band_size );\n    if ( num_bands == 0 )\n      num_bands = 1;\n    if ( num_bands >= 39 )\n      num_bands = 39;\n\n    ras.band_shoot = 0;\n\n    min   = ras.min_ey;\n    max_y = ras.max_ey;\n\n    for ( n = 0; n < num_bands; n++, min = max )\n    {\n      max = min + ras.band_size;\n      if ( n == num_bands - 1 || max > max_y )\n        max = max_y;\n\n      bands[0].min = min;\n      bands[0].max = max;\n      band         = bands;\n\n      while ( band >= bands )\n      {\n        TPos  bottom, top, middle;\n        int   error;\n\n        {\n          PCell  cells_max;\n          int    yindex;\n          long   cell_start, cell_end, cell_mod;\n\n\n          ras.ycells = (PCell*)ras.buffer;\n          ras.ycount = band->max - band->min;\n\n          cell_start = sizeof ( PCell ) * ras.ycount;\n          cell_mod   = cell_start % sizeof ( TCell );\n          if ( cell_mod > 0 )\n            cell_start += sizeof ( TCell ) - cell_mod;\n\n          cell_end  = ras.buffer_size;\n          cell_end -= cell_end % sizeof ( TCell );\n\n          cells_max = (PCell)( (char*)ras.buffer + cell_end );\n          ras.cells = (PCell)( (char*)ras.buffer + cell_start );\n          if ( ras.cells >= cells_max )\n            goto ReduceBands;\n\n          ras.max_cells = cells_max - ras.cells;\n          if ( ras.max_cells < 2 )\n            goto ReduceBands;\n\n          for ( yindex = 0; yindex < ras.ycount; yindex++ )\n            ras.ycells[yindex] = NULL;\n        }\n\n        ras.num_cells = 0;\n        ras.invalid   = 1;\n        ras.min_ey    = band->min;\n        ras.max_ey    = band->max;\n        ras.count_ey  = band->max - band->min;\n\n        error = gray_convert_glyph_inner( RAS_VAR );\n\n        if ( !error )\n        {\n          gray_sweep( RAS_VAR_ &ras.target );\n          band--;\n          continue;\n        }\n        else if ( error != ErrRaster_Memory_Overflow )\n          return 1;\n\n      ReduceBands:\n        /* render pool overflow; we will reduce the render band by half */\n        bottom = band->min;\n        top    = band->max;\n        middle = bottom + ( ( top - bottom ) >> 1 );\n\n        /* This is too complex for a single scanline; there must */\n        /* be some problems.                                     */\n        if ( middle == bottom )\n        {\n#ifdef FT_DEBUG_LEVEL_TRACE\n          FT_TRACE7(( \"gray_convert_glyph: rotten glyph\\n\" ));\n#endif\n          return 1;\n        }\n\n        if ( bottom-top >= ras.band_size )\n          ras.band_shoot++;\n\n        band[1].min = bottom;\n        band[1].max = middle;\n        band[0].min = middle;\n        band[0].max = top;\n        band++;\n      }\n    }\n\n    if ( ras.band_shoot > 8 && ras.band_size > 16 )\n      ras.band_size = ras.band_size / 2;\n\n    return 0;\n  }\n\n\n  static int\n  gray_raster_render( gray_PRaster             raster,\n                      const FT_Raster_Params*  params )\n  {\n    const FT_Outline*  outline    = (const FT_Outline*)params->source;\n    const FT_Bitmap*   target_map = params->target;\n    gray_PWorker       worker;\n\n\n    if ( !raster || !raster->buffer || !raster->buffer_size )\n      return FT_THROW( Invalid_Argument );\n\n    if ( !outline )\n      return FT_THROW( Invalid_Outline );\n\n    /* return immediately if the outline is empty */\n    if ( outline->n_points == 0 || outline->n_contours <= 0 )\n      return 0;\n\n    if ( !outline->contours || !outline->points )\n      return FT_THROW( Invalid_Outline );\n\n    if ( outline->n_points !=\n           outline->contours[outline->n_contours - 1] + 1 )\n      return FT_THROW( Invalid_Outline );\n\n    worker = raster->worker;\n\n    /* if direct mode is not set, we must have a target bitmap */\n    if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) )\n    {\n      if ( !target_map )\n        return FT_THROW( Invalid_Argument );\n\n      /* nothing to do */\n      if ( !target_map->width || !target_map->rows )\n        return 0;\n\n      if ( !target_map->buffer )\n        return FT_THROW( Invalid_Argument );\n    }\n\n    /* this version does not support monochrome rendering */\n    if ( !( params->flags & FT_RASTER_FLAG_AA ) )\n      return FT_THROW( Invalid_Mode );\n\n    /* compute clipping box */\n    if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) )\n    {\n      /* compute clip box from target pixmap */\n      ras.clip_box.xMin = 0;\n      ras.clip_box.yMin = 0;\n      ras.clip_box.xMax = target_map->width;\n      ras.clip_box.yMax = target_map->rows;\n    }\n    else if ( params->flags & FT_RASTER_FLAG_CLIP )\n      ras.clip_box = params->clip_box;\n    else\n    {\n      ras.clip_box.xMin = -32768L;\n      ras.clip_box.yMin = -32768L;\n      ras.clip_box.xMax =  32767L;\n      ras.clip_box.yMax =  32767L;\n    }\n\n    gray_init_cells( RAS_VAR_ raster->buffer, raster->buffer_size );\n\n    ras.outline        = *outline;\n    ras.num_cells      = 0;\n    ras.invalid        = 1;\n    ras.band_size      = raster->band_size;\n    ras.num_gray_spans = 0;\n\n    if ( params->flags & FT_RASTER_FLAG_DIRECT )\n    {\n      ras.render_span      = (FT_Raster_Span_Func)params->gray_spans;\n      ras.render_span_data = params->user;\n    }\n    else\n    {\n      ras.target           = *target_map;\n      ras.render_span      = (FT_Raster_Span_Func)gray_render_span;\n      ras.render_span_data = &ras;\n    }\n\n    return gray_convert_glyph( RAS_VAR );\n  }\n\n\n  /**** RASTER OBJECT CREATION: In stand-alone mode, we simply use *****/\n  /****                         a static object.                   *****/\n\n#ifdef _STANDALONE_\n\n  static int\n  gray_raster_new( void*       memory,\n                   FT_Raster*  araster )\n  {\n    static gray_TRaster  the_raster;\n\n    FT_UNUSED( memory );\n\n\n    *araster = (FT_Raster)&the_raster;\n    FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) );\n\n    return 0;\n  }\n\n\n  static void\n  gray_raster_done( FT_Raster  raster )\n  {\n    /* nothing */\n    FT_UNUSED( raster );\n  }\n\n#else /* !_STANDALONE_ */\n\n  static int\n  gray_raster_new( FT_Memory   memory,\n                   FT_Raster*  araster )\n  {\n    FT_Error      error;\n    gray_PRaster  raster = NULL;\n\n\n    *araster = 0;\n    if ( !FT_ALLOC( raster, sizeof ( gray_TRaster ) ) )\n    {\n      raster->memory = memory;\n      *araster       = (FT_Raster)raster;\n    }\n\n    return error;\n  }\n\n\n  static void\n  gray_raster_done( FT_Raster  raster )\n  {\n    FT_Memory  memory = (FT_Memory)((gray_PRaster)raster)->memory;\n\n\n    FT_FREE( raster );\n  }\n\n#endif /* !_STANDALONE_ */\n\n\n  static void\n  gray_raster_reset( FT_Raster  raster,\n                     char*      pool_base,\n                     long       pool_size )\n  {\n    gray_PRaster  rast = (gray_PRaster)raster;\n\n\n    if ( raster )\n    {\n      if ( pool_base && pool_size >= (long)sizeof ( gray_TWorker ) + 2048 )\n      {\n        gray_PWorker  worker = (gray_PWorker)pool_base;\n\n\n        rast->worker      = worker;\n        rast->buffer      = pool_base +\n                              ( ( sizeof ( gray_TWorker ) +\n                                  sizeof ( TCell ) - 1 )  &\n                                ~( sizeof ( TCell ) - 1 ) );\n        rast->buffer_size = (long)( ( pool_base + pool_size ) -\n                                    (char*)rast->buffer ) &\n                                      ~( sizeof ( TCell ) - 1 );\n        rast->band_size   = (int)( rast->buffer_size /\n                                     ( sizeof ( TCell ) * 8 ) );\n      }\n      else\n      {\n        rast->buffer      = NULL;\n        rast->buffer_size = 0;\n        rast->worker      = NULL;\n      }\n    }\n  }\n\n\n  FT_DEFINE_RASTER_FUNCS(ft_grays_raster,\n    FT_GLYPH_FORMAT_OUTLINE,\n\n    (FT_Raster_New_Func)     gray_raster_new,\n    (FT_Raster_Reset_Func)   gray_raster_reset,\n    (FT_Raster_Set_Mode_Func)0,\n    (FT_Raster_Render_Func)  gray_raster_render,\n    (FT_Raster_Done_Func)    gray_raster_done\n  )\n\n\n/* END */\n\n\n/* Local Variables: */\n/* coding: utf-8    */\n/* End:             */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftgrays.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftgrays.h                                                              */\n/*                                                                         */\n/*    FreeType smooth renderer declaration                                 */\n/*                                                                         */\n/*  Copyright 1996-2001 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTGRAYS_H__\n#define __FTGRAYS_H__\n\n#ifdef __cplusplus\n  extern \"C\" {\n#endif\n\n\n#ifdef _STANDALONE_\n#include \"ftimage.h\"\n#else\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/config/ftconfig.h\" /* for FT_CONFIG_OPTION_PIC */\n#include \"../../include/freetype/ftimage.h\"\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* To make ftgrays.h independent from configuration files we check       */\n  /* whether FT_EXPORT_VAR has been defined already.                       */\n  /*                                                                       */\n  /* On some systems and compilers (Win32 mostly), an extra keyword is     */\n  /* necessary to compile the library as a DLL.                            */\n  /*                                                                       */\n#ifndef FT_EXPORT_VAR\n#define FT_EXPORT_VAR( x )  extern  x\n#endif\n\n  FT_EXPORT_VAR( const FT_Raster_Funcs )  ft_grays_raster;\n\n\n#ifdef __cplusplus\n  }\n#endif\n\n#endif /* __FTGRAYS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmerrs.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftsmerrs.h                                                             */\n/*                                                                         */\n/*    smooth renderer error codes (specification only).                    */\n/*                                                                         */\n/*  Copyright 2001, 2012 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the smooth renderer error enumeration     */\n  /* constants.                                                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __FTSMERRS_H__\n#define __FTSMERRS_H__\n\n#include \"../../include/freetype/ftmoderr.h\"\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  Smooth_Err_\n#define FT_ERR_BASE    FT_Mod_Err_Smooth\n\n#include \"../../include/freetype/fterrors.h\"\n\n#endif /* __FTSMERRS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftsmooth.c                                                             */\n/*                                                                         */\n/*    Anti-aliasing renderer interface (body).                             */\n/*                                                                         */\n/*  Copyright 2000-2006, 2009-2013 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/ftoutln.h\"\n#include \"ftsmooth.h\"\n#include \"ftgrays.h\"\n#include \"ftspic.h\"\n\n#include \"ftsmerrs.h\"\n\n\n  /* initialize renderer -- init its raster */\n  static FT_Error\n  ft_smooth_init( FT_Renderer  render )\n  {\n    FT_Library  library = FT_MODULE_LIBRARY( render );\n\n\n    render->clazz->raster_class->raster_reset( render->raster,\n                                               library->raster_pool,\n                                               library->raster_pool_size );\n\n    return 0;\n  }\n\n\n  /* sets render-specific mode */\n  static FT_Error\n  ft_smooth_set_mode( FT_Renderer  render,\n                      FT_ULong     mode_tag,\n                      FT_Pointer   data )\n  {\n    /* we simply pass it to the raster */\n    return render->clazz->raster_class->raster_set_mode( render->raster,\n                                                         mode_tag,\n                                                         data );\n  }\n\n  /* transform a given glyph image */\n  static FT_Error\n  ft_smooth_transform( FT_Renderer       render,\n                       FT_GlyphSlot      slot,\n                       const FT_Matrix*  matrix,\n                       const FT_Vector*  delta )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    if ( slot->format != render->glyph_format )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    if ( matrix )\n      FT_Outline_Transform( &slot->outline, matrix );\n\n    if ( delta )\n      FT_Outline_Translate( &slot->outline, delta->x, delta->y );\n\n  Exit:\n    return error;\n  }\n\n\n  /* return the glyph's control box */\n  static void\n  ft_smooth_get_cbox( FT_Renderer   render,\n                      FT_GlyphSlot  slot,\n                      FT_BBox*      cbox )\n  {\n    FT_MEM_ZERO( cbox, sizeof ( *cbox ) );\n\n    if ( slot->format == render->glyph_format )\n      FT_Outline_Get_CBox( &slot->outline, cbox );\n  }\n\n\n  /* convert a slot's glyph image into a bitmap */\n  static FT_Error\n  ft_smooth_render_generic( FT_Renderer       render,\n                            FT_GlyphSlot      slot,\n                            FT_Render_Mode    mode,\n                            const FT_Vector*  origin,\n                            FT_Render_Mode    required_mode )\n  {\n    FT_Error     error;\n    FT_Outline*  outline = NULL;\n    FT_BBox      cbox;\n    FT_Pos       width, height, pitch;\n#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING\n    FT_Pos       height_org, width_org;\n#endif\n    FT_Bitmap*   bitmap  = &slot->bitmap;\n    FT_Memory    memory  = render->root.memory;\n    FT_Int       hmul    = mode == FT_RENDER_MODE_LCD;\n    FT_Int       vmul    = mode == FT_RENDER_MODE_LCD_V;\n    FT_Pos       x_shift = 0;\n    FT_Pos       y_shift = 0;\n    FT_Pos       x_left, y_top;\n\n    FT_Raster_Params  params;\n\n    FT_Bool  have_translated_origin = FALSE;\n    FT_Bool  have_outline_shifted   = FALSE;\n    FT_Bool  have_buffer            = FALSE;\n\n\n    /* check glyph image format */\n    if ( slot->format != render->glyph_format )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    /* check mode */\n    if ( mode != required_mode )\n    {\n      error = FT_THROW( Cannot_Render_Glyph );\n      goto Exit;\n    }\n\n    outline = &slot->outline;\n\n    /* translate the outline to the new origin if needed */\n    if ( origin )\n    {\n      FT_Outline_Translate( outline, origin->x, origin->y );\n      have_translated_origin = TRUE;\n    }\n\n    /* compute the control box, and grid fit it */\n    FT_Outline_Get_CBox( outline, &cbox );\n\n    cbox.xMin = FT_PIX_FLOOR( cbox.xMin );\n    cbox.yMin = FT_PIX_FLOOR( cbox.yMin );\n    cbox.xMax = FT_PIX_CEIL( cbox.xMax );\n    cbox.yMax = FT_PIX_CEIL( cbox.yMax );\n\n    if ( cbox.xMin < 0 && cbox.xMax > FT_INT_MAX + cbox.xMin )\n    {\n      FT_ERROR(( \"ft_smooth_render_generic: glyph too large:\"\n                 \" xMin = %d, xMax = %d\\n\",\n                 cbox.xMin >> 6, cbox.xMax >> 6 ));\n      error = FT_THROW( Raster_Overflow );\n      goto Exit;\n    }\n    else\n      width = ( cbox.xMax - cbox.xMin ) >> 6;\n\n    if ( cbox.yMin < 0 && cbox.yMax > FT_INT_MAX + cbox.yMin )\n    {\n      FT_ERROR(( \"ft_smooth_render_generic: glyph too large:\"\n                 \" yMin = %d, yMax = %d\\n\",\n                 cbox.yMin >> 6, cbox.yMax >> 6 ));\n      error = FT_THROW( Raster_Overflow );\n      goto Exit;\n    }\n    else\n      height = ( cbox.yMax - cbox.yMin ) >> 6;\n\n#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING\n    width_org  = width;\n    height_org = height;\n#endif\n\n    /* release old bitmap buffer */\n    if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )\n    {\n      FT_FREE( bitmap->buffer );\n      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;\n    }\n\n    /* allocate new one */\n    pitch = width;\n    if ( hmul )\n    {\n      width = width * 3;\n      pitch = FT_PAD_CEIL( width, 4 );\n    }\n\n    if ( vmul )\n      height *= 3;\n\n    x_shift = (FT_Int) cbox.xMin;\n    y_shift = (FT_Int) cbox.yMin;\n    x_left  = (FT_Int)( cbox.xMin >> 6 );\n    y_top   = (FT_Int)( cbox.yMax >> 6 );\n\n#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING\n\n    if ( slot->library->lcd_filter_func )\n    {\n      FT_Int  extra = slot->library->lcd_extra;\n\n\n      if ( hmul )\n      {\n        x_shift -= 64 * ( extra >> 1 );\n        width   += 3 * extra;\n        pitch    = FT_PAD_CEIL( width, 4 );\n        x_left  -= extra >> 1;\n      }\n\n      if ( vmul )\n      {\n        y_shift -= 64 * ( extra >> 1 );\n        height  += 3 * extra;\n        y_top   += extra >> 1;\n      }\n    }\n\n#endif\n\n#if FT_UINT_MAX > 0xFFFFU\n\n    /* Required check is (pitch * height < FT_ULONG_MAX),        */\n    /* but we care realistic cases only.  Always pitch <= width. */\n    if ( width > 0x7FFF || height > 0x7FFF )\n    {\n      FT_ERROR(( \"ft_smooth_render_generic: glyph too large: %u x %u\\n\",\n                 width, height ));\n      error = FT_THROW( Raster_Overflow );\n      goto Exit;\n    }\n\n#endif\n\n    bitmap->pixel_mode = FT_PIXEL_MODE_GRAY;\n    bitmap->num_grays  = 256;\n    bitmap->width      = width;\n    bitmap->rows       = height;\n    bitmap->pitch      = pitch;\n\n    /* translate outline to render it into the bitmap */\n    FT_Outline_Translate( outline, -x_shift, -y_shift );\n    have_outline_shifted = TRUE;\n\n    if ( FT_ALLOC( bitmap->buffer, (FT_ULong)pitch * height ) )\n      goto Exit;\n    else\n      have_buffer = TRUE;\n\n    slot->internal->flags |= FT_GLYPH_OWN_BITMAP;\n\n    /* set up parameters */\n    params.target = bitmap;\n    params.source = outline;\n    params.flags  = FT_RASTER_FLAG_AA;\n\n#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING\n\n    /* implode outline if needed */\n    {\n      FT_Vector*  points     = outline->points;\n      FT_Vector*  points_end = points + outline->n_points;\n      FT_Vector*  vec;\n\n\n      if ( hmul )\n        for ( vec = points; vec < points_end; vec++ )\n          vec->x *= 3;\n\n      if ( vmul )\n        for ( vec = points; vec < points_end; vec++ )\n          vec->y *= 3;\n    }\n\n    /* render outline into the bitmap */\n    error = render->raster_render( render->raster, &params );\n\n    /* deflate outline if needed */\n    {\n      FT_Vector*  points     = outline->points;\n      FT_Vector*  points_end = points + outline->n_points;\n      FT_Vector*  vec;\n\n\n      if ( hmul )\n        for ( vec = points; vec < points_end; vec++ )\n          vec->x /= 3;\n\n      if ( vmul )\n        for ( vec = points; vec < points_end; vec++ )\n          vec->y /= 3;\n    }\n\n    if ( error )\n      goto Exit;\n\n    if ( slot->library->lcd_filter_func )\n      slot->library->lcd_filter_func( bitmap, mode, slot->library );\n\n#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */\n\n    /* render outline into bitmap */\n    error = render->raster_render( render->raster, &params );\n    if ( error )\n      goto Exit;\n\n    /* expand it horizontally */\n    if ( hmul )\n    {\n      FT_Byte*  line = bitmap->buffer;\n      FT_UInt   hh;\n\n\n      for ( hh = height_org; hh > 0; hh--, line += pitch )\n      {\n        FT_UInt   xx;\n        FT_Byte*  end = line + width;\n\n\n        for ( xx = width_org; xx > 0; xx-- )\n        {\n          FT_UInt  pixel = line[xx-1];\n\n\n          end[-3] = (FT_Byte)pixel;\n          end[-2] = (FT_Byte)pixel;\n          end[-1] = (FT_Byte)pixel;\n          end    -= 3;\n        }\n      }\n    }\n\n    /* expand it vertically */\n    if ( vmul )\n    {\n      FT_Byte*  read  = bitmap->buffer + ( height - height_org ) * pitch;\n      FT_Byte*  write = bitmap->buffer;\n      FT_UInt   hh;\n\n\n      for ( hh = height_org; hh > 0; hh-- )\n      {\n        ft_memcpy( write, read, pitch );\n        write += pitch;\n\n        ft_memcpy( write, read, pitch );\n        write += pitch;\n\n        ft_memcpy( write, read, pitch );\n        write += pitch;\n        read  += pitch;\n      }\n    }\n\n#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */\n\n    /*\n     * XXX: on 16bit system, we return an error for huge bitmap\n     * to prevent an overflow.\n     */\n    if ( x_left > FT_INT_MAX || y_top > FT_INT_MAX )\n    {\n      error = FT_THROW( Invalid_Pixel_Size );\n      goto Exit;\n    }\n\n    slot->format      = FT_GLYPH_FORMAT_BITMAP;\n    slot->bitmap_left = (FT_Int)x_left;\n    slot->bitmap_top  = (FT_Int)y_top;\n\n    /* everything is fine; don't deallocate buffer */\n    have_buffer = FALSE;\n\n    error = FT_Err_Ok;\n\n  Exit:\n    if ( have_outline_shifted )\n      FT_Outline_Translate( outline, x_shift, y_shift );\n    if ( have_translated_origin )\n      FT_Outline_Translate( outline, -origin->x, -origin->y );\n    if ( have_buffer )\n    {\n      FT_FREE( bitmap->buffer );\n      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;\n    }\n\n    return error;\n  }\n\n\n  /* convert a slot's glyph image into a bitmap */\n  static FT_Error\n  ft_smooth_render( FT_Renderer       render,\n                    FT_GlyphSlot      slot,\n                    FT_Render_Mode    mode,\n                    const FT_Vector*  origin )\n  {\n    if ( mode == FT_RENDER_MODE_LIGHT )\n      mode = FT_RENDER_MODE_NORMAL;\n\n    return ft_smooth_render_generic( render, slot, mode, origin,\n                                     FT_RENDER_MODE_NORMAL );\n  }\n\n\n  /* convert a slot's glyph image into a horizontal LCD bitmap */\n  static FT_Error\n  ft_smooth_render_lcd( FT_Renderer       render,\n                        FT_GlyphSlot      slot,\n                        FT_Render_Mode    mode,\n                        const FT_Vector*  origin )\n  {\n    FT_Error  error;\n\n    error = ft_smooth_render_generic( render, slot, mode, origin,\n                                      FT_RENDER_MODE_LCD );\n    if ( !error )\n      slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD;\n\n    return error;\n  }\n\n\n  /* convert a slot's glyph image into a vertical LCD bitmap */\n  static FT_Error\n  ft_smooth_render_lcd_v( FT_Renderer       render,\n                          FT_GlyphSlot      slot,\n                          FT_Render_Mode    mode,\n                          const FT_Vector*  origin )\n  {\n    FT_Error  error;\n\n    error = ft_smooth_render_generic( render, slot, mode, origin,\n                                      FT_RENDER_MODE_LCD_V );\n    if ( !error )\n      slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD_V;\n\n    return error;\n  }\n\n\n  FT_DEFINE_RENDERER( ft_smooth_renderer_class,\n\n      FT_MODULE_RENDERER,\n      sizeof ( FT_RendererRec ),\n\n      \"smooth\",\n      0x10000L,\n      0x20000L,\n\n      0,    /* module specific interface */\n\n      (FT_Module_Constructor)ft_smooth_init,\n      (FT_Module_Destructor) 0,\n      (FT_Module_Requester)  0\n    ,\n\n    FT_GLYPH_FORMAT_OUTLINE,\n\n    (FT_Renderer_RenderFunc)   ft_smooth_render,\n    (FT_Renderer_TransformFunc)ft_smooth_transform,\n    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,\n    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,\n\n    (FT_Raster_Funcs*)    &FT_GRAYS_RASTER_GET\n  )\n\n\n  FT_DEFINE_RENDERER( ft_smooth_lcd_renderer_class,\n\n      FT_MODULE_RENDERER,\n      sizeof ( FT_RendererRec ),\n\n      \"smooth-lcd\",\n      0x10000L,\n      0x20000L,\n\n      0,    /* module specific interface */\n\n      (FT_Module_Constructor)ft_smooth_init,\n      (FT_Module_Destructor) 0,\n      (FT_Module_Requester)  0\n    ,\n\n    FT_GLYPH_FORMAT_OUTLINE,\n\n    (FT_Renderer_RenderFunc)   ft_smooth_render_lcd,\n    (FT_Renderer_TransformFunc)ft_smooth_transform,\n    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,\n    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,\n\n    (FT_Raster_Funcs*)    &FT_GRAYS_RASTER_GET\n  )\n\n  FT_DEFINE_RENDERER( ft_smooth_lcdv_renderer_class,\n\n      FT_MODULE_RENDERER,\n      sizeof ( FT_RendererRec ),\n\n      \"smooth-lcdv\",\n      0x10000L,\n      0x20000L,\n\n      0,    /* module specific interface */\n\n      (FT_Module_Constructor)ft_smooth_init,\n      (FT_Module_Destructor) 0,\n      (FT_Module_Requester)  0\n    ,\n\n    FT_GLYPH_FORMAT_OUTLINE,\n\n    (FT_Renderer_RenderFunc)   ft_smooth_render_lcd_v,\n    (FT_Renderer_TransformFunc)ft_smooth_transform,\n    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,\n    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,\n\n    (FT_Raster_Funcs*)    &FT_GRAYS_RASTER_GET\n  )\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftsmooth.h                                                             */\n/*                                                                         */\n/*    Anti-aliasing renderer interface (specification).                    */\n/*                                                                         */\n/*  Copyright 1996-2001 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTSMOOTH_H__\n#define __FTSMOOTH_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/ftrender.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#ifndef FT_CONFIG_OPTION_NO_STD_RASTER\n  FT_DECLARE_RENDERER( ft_std_renderer_class )\n#endif\n\n#ifndef FT_CONFIG_OPTION_NO_SMOOTH_RASTER\n  FT_DECLARE_RENDERER( ft_smooth_renderer_class )\n\n  FT_DECLARE_RENDERER( ft_smooth_lcd_renderer_class )\n\n  FT_DECLARE_RENDERER( ft_smooth_lcd_v_renderer_class )\n#endif\n\n\n\nFT_END_HEADER\n\n#endif /* __FTSMOOTH_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftspic.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftspic.c                                                               */\n/*                                                                         */\n/*    The FreeType position independent code services for smooth module.   */\n/*                                                                         */\n/*  Copyright 2009, 2010, 2012, 2013 by                                    */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/freetype.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"ftspic.h\"\n#include \"ftsmerrs.h\"\n\n\n#ifdef FT_CONFIG_OPTION_PIC\n\n  /* forward declaration of PIC init functions from ftgrays.c */\n  void\n  FT_Init_Class_ft_grays_raster( FT_Raster_Funcs*  funcs );\n\n\n  void\n  ft_smooth_renderer_class_pic_free( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Memory          memory        = library->memory;\n\n\n    if ( pic_container->smooth )\n    {\n      SmoothPIC*  container = (SmoothPIC*)pic_container->smooth;\n\n\n      if ( --container->ref_count )\n        return;\n\n      FT_FREE( container );\n      pic_container->smooth = NULL;\n    }\n  }\n\n\n  FT_Error\n  ft_smooth_renderer_class_pic_init( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Error           error         = FT_Err_Ok;\n    SmoothPIC*         container     = NULL;\n    FT_Memory          memory        = library->memory;\n\n\n    /* since this function also serve smooth_lcd and smooth_lcdv renderers,\n       it implements reference counting */\n    if ( pic_container->smooth )\n    {\n      ((SmoothPIC*)pic_container->smooth)->ref_count++;\n      return error;\n    }\n\n    /* allocate pointer, clear and set global container pointer */\n    if ( FT_ALLOC( container, sizeof ( *container ) ) )\n      return error;\n    FT_MEM_SET( container, 0, sizeof ( *container ) );\n    pic_container->smooth = container;\n\n    container->ref_count = 1;\n\n    /* initialize pointer table -                       */\n    /* this is how the module usually expects this data */\n    FT_Init_Class_ft_grays_raster( &container->ft_grays_raster );\n\n    return error;\n  }\n\n\n  /* re-route these init and free functions to the above functions */\n  FT_Error\n  ft_smooth_lcd_renderer_class_pic_init( FT_Library  library )\n  {\n    return ft_smooth_renderer_class_pic_init( library );\n  }\n\n\n  void\n  ft_smooth_lcd_renderer_class_pic_free( FT_Library  library )\n  {\n    ft_smooth_renderer_class_pic_free( library );\n  }\n\n\n  FT_Error\n  ft_smooth_lcdv_renderer_class_pic_init( FT_Library  library )\n  {\n    return ft_smooth_renderer_class_pic_init( library );\n  }\n\n\n  void\n  ft_smooth_lcdv_renderer_class_pic_free( FT_Library  library )\n  {\n    ft_smooth_renderer_class_pic_free( library );\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftspic.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftspic.h                                                               */\n/*                                                                         */\n/*    The FreeType position independent code services for smooth module.   */\n/*                                                                         */\n/*  Copyright 2009 by                                                      */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTSPIC_H__\n#define __FTSPIC_H__\n\n\nFT_BEGIN_HEADER\n\n#include \"../../include/freetype/internal/ftpic.h\"\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_GRAYS_RASTER_GET  ft_grays_raster\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n  typedef struct  SmoothPIC_\n  {\n    int              ref_count;\n    FT_Raster_Funcs  ft_grays_raster;\n\n  } SmoothPIC;\n\n\n#define GET_PIC( lib ) \\\n          ( (SmoothPIC*)( (lib)->pic_container.smooth ) )\n#define FT_GRAYS_RASTER_GET  ( GET_PIC( library )->ft_grays_raster )\n\n\n  /* see ftspic.c for the implementation */\n  void\n  ft_smooth_renderer_class_pic_free( FT_Library  library );\n\n  void\n  ft_smooth_lcd_renderer_class_pic_free( FT_Library  library );\n\n  void\n  ft_smooth_lcdv_renderer_class_pic_free( FT_Library  library );\n\n  FT_Error\n  ft_smooth_renderer_class_pic_init( FT_Library  library );\n\n  FT_Error\n  ft_smooth_lcd_renderer_class_pic_init( FT_Library  library );\n\n  FT_Error\n  ft_smooth_lcdv_renderer_class_pic_init( FT_Library  library );\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FTSPIC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/fxft_smooth.c",
    "content": "#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501\n/***************************************************************************/\n/*                                                                         */\n/*  smooth.c                                                               */\n/*                                                                         */\n/*    FreeType anti-aliasing rasterer module component (body only).        */\n/*                                                                         */\n/*  Copyright 1996-2001 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n#define FT2_BUILD_LIBRARY\n\n#include \"../../include/ft2build.h\"\n#include \"ftspic.c\"\n#include \"ftgrays.c\"\n#include \"ftsmooth.c\"\n\n\n/* END */\n#endif\n\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/Jamfile",
    "content": "# FreeType 2 src/truetype Jamfile\n#\n# Copyright 2001, 2004 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) truetype ;\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = ttdriver ttobjs ttpload ttgload ttinterp ttgxvar ttpic ;\n  }\n  else\n  {\n    _sources = truetype ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/truetype Jamfile\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/fxft_truetype.c",
    "content": "#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501\n/***************************************************************************/\n/*                                                                         */\n/*  truetype.c                                                             */\n/*                                                                         */\n/*    FreeType TrueType driver component (body only).                      */\n/*                                                                         */\n/*  Copyright 1996-2001, 2004, 2006, 2012 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n#define FT2_BUILD_LIBRARY\n\n#include \"../../include/ft2build.h\"\n#include \"ttpic.c\"\n#include \"ttdriver.c\"   /* driver interface    */\n#include \"ttpload.c\"    /* tables loader       */\n#include \"ttgload.c\"    /* glyph loader        */\n#include \"ttobjs.c\"     /* object manager      */\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n#include \"ttinterp.c\"\n#include \"ttsubpix.c\"\n#endif\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n#include \"ttgxvar.c\"    /* gx distortable font */\n#endif\n\n\n/* END */\n#endif\n\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttdriver.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttdriver.c                                                             */\n/*                                                                         */\n/*    TrueType font driver implementation (body).                          */\n/*                                                                         */\n/*  Copyright 1996-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/internal/sfnt.h\"\n#include \"../../include/freetype/internal/services/svxf86nm.h\"\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n#include \"../../include/freetype/ftmm.h\"\n#include \"../../include/freetype/internal/services/svmm.h\"\n#endif\n\n#include \"../../include/freetype/internal/services/svtteng.h\"\n#include \"../../include/freetype/internal/services/svttglyf.h\"\n#include \"../../include/freetype/internal/services/svprop.h\"\n#include \"../../include/freetype/ftttdrv.h\"\n\n#include \"ttdriver.h\"\n#include \"ttgload.h\"\n#include \"ttpload.h\"\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n#include \"ttgxvar.h\"\n#endif\n\n#include \"tterrors.h\"\n\n#include \"ttpic.h\"\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttdriver\n\n\n  /*\n   *  PROPERTY SERVICE\n   *\n   */\n  static FT_Error\n  tt_property_set( FT_Module    module,         /* TT_Driver */\n                   const char*  property_name,\n                   const void*  value )\n  {\n    FT_Error   error  = FT_Err_Ok;\n    TT_Driver  driver = (TT_Driver)module;\n\n\n    if ( !ft_strcmp( property_name, \"interpreter-version\" ) )\n    {\n      FT_UInt*  interpreter_version = (FT_UInt*)value;\n\n\n#ifndef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n      if ( *interpreter_version != TT_INTERPRETER_VERSION_35 )\n        error = FT_ERR( Unimplemented_Feature );\n      else\n#endif\n        driver->interpreter_version = *interpreter_version;\n\n      return error;\n    }\n\n    FT_TRACE0(( \"tt_property_set: missing property `%s'\\n\",\n                property_name ));\n    return FT_THROW( Missing_Property );\n  }\n\n\n  static FT_Error\n  tt_property_get( FT_Module    module,         /* TT_Driver */\n                   const char*  property_name,\n                   const void*  value )\n  {\n    FT_Error   error  = FT_Err_Ok;\n    TT_Driver  driver = (TT_Driver)module;\n\n    FT_UInt  interpreter_version = driver->interpreter_version;\n\n\n    if ( !ft_strcmp( property_name, \"interpreter-version\" ) )\n    {\n      FT_UInt*  val = (FT_UInt*)value;\n\n\n      *val = interpreter_version;\n\n      return error;\n    }\n\n    FT_TRACE0(( \"tt_property_get: missing property `%s'\\n\",\n                property_name ));\n    return FT_THROW( Missing_Property );\n  }\n\n\n  FT_DEFINE_SERVICE_PROPERTIESREC(\n    tt_service_properties,\n    (FT_Properties_SetFunc)tt_property_set,\n    (FT_Properties_GetFunc)tt_property_get )\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                          F A C E S                              ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n#undef  PAIR_TAG\n#define PAIR_TAG( left, right )  ( ( (FT_ULong)left << 16 ) | \\\n                                     (FT_ULong)right        )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_get_kerning                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A driver method used to return the kerning vector between two      */\n  /*    glyphs of the same face.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face        :: A handle to the source face object.                 */\n  /*                                                                       */\n  /*    left_glyph  :: The index of the left glyph in the kern pair.       */\n  /*                                                                       */\n  /*    right_glyph :: The index of the right glyph in the kern pair.      */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    kerning     :: The kerning vector.  This is in font units for      */\n  /*                   scalable formats, and in pixels for fixed-sizes     */\n  /*                   formats.                                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Only horizontal layouts (left-to-right & right-to-left) are        */\n  /*    supported by this function.  Other layouts, or more sophisticated  */\n  /*    kernings, are out of scope of this method (the basic driver        */\n  /*    interface is meant to be simple).                                  */\n  /*                                                                       */\n  /*    They can be implemented by format-specific interfaces.             */\n  /*                                                                       */\n  static FT_Error\n  tt_get_kerning( FT_Face     ttface,          /* TT_Face */\n                  FT_UInt     left_glyph,\n                  FT_UInt     right_glyph,\n                  FT_Vector*  kerning )\n  {\n    TT_Face       face = (TT_Face)ttface;\n    SFNT_Service  sfnt = (SFNT_Service)face->sfnt;\n\n\n    kerning->x = 0;\n    kerning->y = 0;\n\n    if ( sfnt )\n      kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph );\n\n    return 0;\n  }\n\n\n#undef PAIR_TAG\n\n\n  static FT_Error\n  tt_get_advances( FT_Face    ttface,\n                   FT_UInt    start,\n                   FT_UInt    count,\n                   FT_Int32   flags,\n                   FT_Fixed  *advances )\n  {\n    FT_UInt  nn;\n    TT_Face  face  = (TT_Face) ttface;\n\n\n    /* XXX: TODO: check for sbits */\n\n    if ( flags & FT_LOAD_VERTICAL_LAYOUT )\n    {\n      for ( nn = 0; nn < count; nn++ )\n      {\n        FT_Short   tsb;\n        FT_UShort  ah;\n\n\n        TT_Get_VMetrics( face, start + nn, &tsb, &ah );\n        advances[nn] = ah;\n      }\n    }\n    else\n    {\n      for ( nn = 0; nn < count; nn++ )\n      {\n        FT_Short   lsb;\n        FT_UShort  aw;\n\n\n        TT_Get_HMetrics( face, start + nn, &lsb, &aw );\n        advances[nn] = aw;\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                           S I Z E S                             ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n\n  static FT_Error\n  tt_size_select( FT_Size   size,\n                  FT_ULong  strike_index )\n  {\n    TT_Face   ttface = (TT_Face)size->face;\n    TT_Size   ttsize = (TT_Size)size;\n    FT_Error  error  = FT_Err_Ok;\n\n\n    ttsize->strike_index = strike_index;\n\n    if ( FT_IS_SCALABLE( size->face ) )\n    {\n      /* use the scaled metrics, even when tt_size_reset fails */\n      FT_Select_Metrics( size->face, strike_index );\n\n      tt_size_reset( ttsize );\n    }\n    else\n    {\n      SFNT_Service      sfnt    = (SFNT_Service) ttface->sfnt;\n      FT_Size_Metrics*  metrics = &size->metrics;\n\n\n      error = sfnt->load_strike_metrics( ttface, strike_index, metrics );\n      if ( error )\n        ttsize->strike_index = 0xFFFFFFFFUL;\n    }\n\n    return error;\n  }\n\n#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */\n\n\n  static FT_Error\n  tt_size_request( FT_Size          size,\n                   FT_Size_Request  req )\n  {\n    TT_Size   ttsize = (TT_Size)size;\n    FT_Error  error  = FT_Err_Ok;\n\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n\n    if ( FT_HAS_FIXED_SIZES( size->face ) )\n    {\n      TT_Face       ttface = (TT_Face)size->face;\n      SFNT_Service  sfnt   = (SFNT_Service) ttface->sfnt;\n      FT_ULong      strike_index;\n\n\n      error = sfnt->set_sbit_strike( ttface, req, &strike_index );\n\n      if ( error )\n        ttsize->strike_index = 0xFFFFFFFFUL;\n      else\n        return tt_size_select( size, strike_index );\n    }\n\n#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */\n\n    FT_Request_Metrics( size->face, req );\n\n    if ( FT_IS_SCALABLE( size->face ) )\n    {\n      error = tt_size_reset( ttsize );\n      ttsize->root.metrics = ttsize->metrics;\n    }\n\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_glyph_load                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A driver method used to load a glyph within a given glyph slot.    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    slot        :: A handle to the target slot object where the glyph  */\n  /*                   will be loaded.                                     */\n  /*                                                                       */\n  /*    size        :: A handle to the source face size at which the glyph */\n  /*                   must be scaled, loaded, etc.                        */\n  /*                                                                       */\n  /*    glyph_index :: The index of the glyph in the font file.            */\n  /*                                                                       */\n  /*    load_flags  :: A flag indicating what to load for this glyph.  The */\n  /*                   FT_LOAD_XXX constants can be used to control the    */\n  /*                   glyph loading process (e.g., whether the outline    */\n  /*                   should be scaled, whether to load bitmaps or not,   */\n  /*                   whether to hint the outline, etc).                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  static FT_Error\n  tt_glyph_load( FT_GlyphSlot  ttslot,      /* TT_GlyphSlot */\n                 FT_Size       ttsize,      /* TT_Size      */\n                 FT_UInt       glyph_index,\n                 FT_Int32      load_flags )\n  {\n    TT_GlyphSlot  slot = (TT_GlyphSlot)ttslot;\n    TT_Size       size = (TT_Size)ttsize;\n    FT_Face       face = ttslot->face;\n    FT_Error      error;\n\n\n    if ( !slot )\n      return FT_THROW( Invalid_Slot_Handle );\n\n    if ( !size )\n      return FT_THROW( Invalid_Size_Handle );\n\n    if ( !face )\n      return FT_THROW( Invalid_Argument );\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    if ( glyph_index >= (FT_UInt)face->num_glyphs &&\n         !face->internal->incremental_interface   )\n#else\n    if ( glyph_index >= (FT_UInt)face->num_glyphs )\n#endif\n      return FT_THROW( Invalid_Argument );\n\n    if ( load_flags & FT_LOAD_NO_HINTING )\n    {\n      /* both FT_LOAD_NO_HINTING and FT_LOAD_NO_AUTOHINT   */\n      /* are necessary to disable hinting for tricky fonts */\n\n      if ( FT_IS_TRICKY( face ) )\n        load_flags &= ~FT_LOAD_NO_HINTING;\n\n      if ( load_flags & FT_LOAD_NO_AUTOHINT )\n        load_flags |= FT_LOAD_NO_HINTING;\n    }\n\n    if ( load_flags & ( FT_LOAD_NO_RECURSE | FT_LOAD_NO_SCALE ) )\n    {\n      load_flags |= FT_LOAD_NO_BITMAP | FT_LOAD_NO_SCALE;\n\n      if ( !FT_IS_TRICKY( face ) )\n        load_flags |= FT_LOAD_NO_HINTING;\n    }\n\n    /* now load the glyph outline if necessary */\n    error = TT_Load_Glyph( size, slot, glyph_index, load_flags );\n\n    /* force drop-out mode to 2 - irrelevant now */\n    /* slot->outline.dropout_mode = 2; */\n\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                D R I V E R  I N T E R F A C E                   ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n  FT_DEFINE_SERVICE_MULTIMASTERSREC(\n    tt_service_gx_multi_masters,\n    (FT_Get_MM_Func)        NULL,\n    (FT_Set_MM_Design_Func) NULL,\n    (FT_Set_MM_Blend_Func)  TT_Set_MM_Blend,\n    (FT_Get_MM_Var_Func)    TT_Get_MM_Var,\n    (FT_Set_Var_Design_Func)TT_Set_Var_Design )\n#endif\n\n  static const FT_Service_TrueTypeEngineRec  tt_service_truetype_engine =\n  {\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    FT_TRUETYPE_ENGINE_TYPE_UNPATENTED\n#else\n    FT_TRUETYPE_ENGINE_TYPE_PATENTED\n#endif\n\n#else /* !TT_USE_BYTECODE_INTERPRETER */\n\n    FT_TRUETYPE_ENGINE_TYPE_NONE\n\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n  };\n\n  FT_DEFINE_SERVICE_TTGLYFREC(\n    tt_service_truetype_glyf,\n    (TT_Glyf_GetLocationFunc)tt_face_get_location )\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n  FT_DEFINE_SERVICEDESCREC5(\n    tt_services,\n    FT_SERVICE_ID_XF86_NAME,       FT_XF86_FORMAT_TRUETYPE,\n    FT_SERVICE_ID_MULTI_MASTERS,   &TT_SERVICE_GX_MULTI_MASTERS_GET,\n    FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine,\n    FT_SERVICE_ID_TT_GLYF,         &TT_SERVICE_TRUETYPE_GLYF_GET,\n    FT_SERVICE_ID_PROPERTIES,      &TT_SERVICE_PROPERTIES_GET )\n#else\n  FT_DEFINE_SERVICEDESCREC4(\n    tt_services,\n    FT_SERVICE_ID_XF86_NAME,       FT_XF86_FORMAT_TRUETYPE,\n    FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine,\n    FT_SERVICE_ID_TT_GLYF,         &TT_SERVICE_TRUETYPE_GLYF_GET,\n    FT_SERVICE_ID_PROPERTIES,      &TT_SERVICE_PROPERTIES_GET )\n#endif\n\n\n  FT_CALLBACK_DEF( FT_Module_Interface )\n  tt_get_interface( FT_Module    driver,    /* TT_Driver */\n                    const char*  tt_interface )\n  {\n    FT_Library           library;\n    FT_Module_Interface  result;\n    FT_Module            sfntd;\n    SFNT_Service         sfnt;\n\n\n    /* TT_SERVICES_GET derefers `library' in PIC mode */\n#ifdef FT_CONFIG_OPTION_PIC\n    if ( !driver )\n      return NULL;\n    library = driver->library;\n    if ( !library )\n      return NULL;\n#endif\n\n    result = ft_service_list_lookup( TT_SERVICES_GET, tt_interface );\n    if ( result != NULL )\n      return result;\n\n#ifndef FT_CONFIG_OPTION_PIC\n    if ( !driver )\n      return NULL;\n    library = driver->library;\n    if ( !library )\n      return NULL;\n#endif\n\n    /* only return the default interface from the SFNT module */\n    sfntd = FT_Get_Module( library, \"sfnt\" );\n    if ( sfntd )\n    {\n      sfnt = (SFNT_Service)( sfntd->clazz->module_interface );\n      if ( sfnt )\n        return sfnt->get_interface( driver, tt_interface );\n    }\n\n    return 0;\n  }\n\n\n  /* The FT_DriverInterface structure is defined in ftdriver.h. */\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n#define TT_HINTER_FLAG  FT_MODULE_DRIVER_HAS_HINTER\n#else\n#define TT_HINTER_FLAG  0\n#endif\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n#define TT_SIZE_SELECT  tt_size_select\n#else\n#define TT_SIZE_SELECT  0\n#endif\n\n  FT_DEFINE_DRIVER(\n    tt_driver_class,\n\n      FT_MODULE_FONT_DRIVER     |\n      FT_MODULE_DRIVER_SCALABLE |\n      TT_HINTER_FLAG,\n\n      sizeof ( TT_DriverRec ),\n\n      \"truetype_xyq\",      /* driver name                           */\n      0x10000L,        /* driver version == 1.0                 */\n      0x20000L,        /* driver requires FreeType 2.0 or above */\n\n      (void*)0,        /* driver specific interface */\n\n      tt_driver_init,\n      tt_driver_done,\n      tt_get_interface,\n\n    sizeof ( TT_FaceRec ),\n    sizeof ( TT_SizeRec ),\n    sizeof ( FT_GlyphSlotRec ),\n\n    tt_face_init,\n    tt_face_done,\n    tt_size_init,\n    tt_size_done,\n    tt_slot_init,\n    0,                       /* FT_Slot_DoneFunc */\n\n    tt_glyph_load,\n\n    tt_get_kerning,\n    0,                       /* FT_Face_AttachFunc */\n    tt_get_advances,\n\n    tt_size_request,\n    TT_SIZE_SELECT\n  )\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttdriver.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttdriver.h                                                             */\n/*                                                                         */\n/*    High-level TrueType driver interface (specification).                */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTDRIVER_H__\n#define __TTDRIVER_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdriver.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  FT_DECLARE_DRIVER( tt_driver_class )\n\n\nFT_END_HEADER\n\n#endif /* __TTDRIVER_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/tterrors.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  tterrors.h                                                             */\n/*                                                                         */\n/*    TrueType error codes (specification only).                           */\n/*                                                                         */\n/*  Copyright 2001, 2012 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the TrueType error enumeration            */\n  /* constants.                                                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __TTERRORS_H__\n#define __TTERRORS_H__\n\n#include \"../../include/freetype/ftmoderr.h\"\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  TT_Err_\n#define FT_ERR_BASE    FT_Mod_Err_TrueType\n\n#include \"../../include/freetype/fterrors.h\"\n\n#endif /* __TTERRORS_H__ */\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgload.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttgload.c                                                              */\n/*                                                                         */\n/*    TrueType Glyph Loader (body).                                        */\n/*                                                                         */\n/*  Copyright 1996-2013                                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftcalc.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/internal/sfnt.h\"\n#include \"../../include/freetype/tttags.h\"\n#include \"../../include/freetype/ftoutln.h\"\n#include \"../../include/freetype/ftttdrv.h\"\n\n\n#include \"ttgload.h\"\n#include \"ttpload.h\"\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n#include \"ttgxvar.h\"\n#endif\n\n#include \"tterrors.h\"\n#include \"ttsubpix.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttgload\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Composite glyph flags.                                                */\n  /*                                                                       */\n#define ARGS_ARE_WORDS             0x0001\n#define ARGS_ARE_XY_VALUES         0x0002\n#define ROUND_XY_TO_GRID           0x0004\n#define WE_HAVE_A_SCALE            0x0008\n/* reserved                        0x0010 */\n#define MORE_COMPONENTS            0x0020\n#define WE_HAVE_AN_XY_SCALE        0x0040\n#define WE_HAVE_A_2X2              0x0080\n#define WE_HAVE_INSTR              0x0100\n#define USE_MY_METRICS             0x0200\n#define OVERLAP_COMPOUND           0x0400\n#define SCALED_COMPONENT_OFFSET    0x0800\n#define UNSCALED_COMPONENT_OFFSET  0x1000\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Return the horizontal metrics in font units for a given glyph.        */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  TT_Get_HMetrics( TT_Face     face,\n                   FT_UInt     idx,\n                   FT_Short*   lsb,\n                   FT_UShort*  aw )\n  {\n    ( (SFNT_Service)face->sfnt )->get_metrics( face, 0, idx, lsb, aw );\n\n    FT_TRACE5(( \"  advance width (font units): %d\\n\", *aw ));\n    FT_TRACE5(( \"  left side bearing (font units): %d\\n\", *lsb ));\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Return the vertical metrics in font units for a given glyph.          */\n  /* Greg Hitchcock from Microsoft told us that if there were no `vmtx'    */\n  /* table, typoAscender/Descender from the `OS/2' table would be used     */\n  /* instead, and if there were no `OS/2' table, use ascender/descender    */\n  /* from the `hhea' table.  But that is not what Microsoft's rasterizer   */\n  /* apparently does: It uses the ppem value as the advance height, and    */\n  /* sets the top side bearing to be zero.                                 */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  TT_Get_VMetrics( TT_Face     face,\n                   FT_UInt     idx,\n                   FT_Short*   tsb,\n                   FT_UShort*  ah )\n  {\n    if ( face->vertical_info )\n      ( (SFNT_Service)face->sfnt )->get_metrics( face, 1, idx, tsb, ah );\n\n#if 1             /* Empirically determined, at variance with what MS said */\n\n    else\n    {\n      *tsb = 0;\n      *ah  = face->root.units_per_EM;\n    }\n\n#else      /* This is what MS said to do.  It isn't what they do, however. */\n\n    else if ( face->os2.version != 0xFFFFU )\n    {\n      *tsb = face->os2.sTypoAscender;\n      *ah  = face->os2.sTypoAscender - face->os2.sTypoDescender;\n    }\n    else\n    {\n      *tsb = face->horizontal.Ascender;\n      *ah  = face->horizontal.Ascender - face->horizontal.Descender;\n    }\n\n#endif\n\n    FT_TRACE5(( \"  advance height (font units): %d\\n\", *ah ));\n    FT_TRACE5(( \"  top side bearing (font units): %d\\n\", *tsb ));\n  }\n\n\n  static void\n  tt_get_metrics( TT_Loader  loader,\n                  FT_UInt    glyph_index )\n  {\n    TT_Face    face   = (TT_Face)loader->face;\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( face );\n#endif\n\n    FT_Short   left_bearing = 0, top_bearing = 0;\n    FT_UShort  advance_width = 0, advance_height = 0;\n\n\n    TT_Get_HMetrics( face, glyph_index,\n                     &left_bearing,\n                     &advance_width );\n    TT_Get_VMetrics( face, glyph_index,\n                     &top_bearing,\n                     &advance_height );\n\n    loader->left_bearing = left_bearing;\n    loader->advance      = advance_width;\n    loader->top_bearing  = top_bearing;\n    loader->vadvance     = advance_height;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )\n    {\n      if ( loader->exec )\n        loader->exec->sph_tweak_flags = 0;\n\n      /* this may not be the right place for this, but it works */\n      if ( loader->exec && loader->exec->ignore_x_mode )\n        sph_set_tweaks( loader, glyph_index );\n    }\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    if ( !loader->linear_def )\n    {\n      loader->linear_def = 1;\n      loader->linear     = advance_width;\n    }\n  }\n\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n\n  static void\n  tt_get_metrics_incr_overrides( TT_Loader  loader,\n                                 FT_UInt    glyph_index )\n  {\n    TT_Face  face = (TT_Face)loader->face;\n\n    FT_Short   left_bearing = 0, top_bearing = 0;\n    FT_UShort  advance_width = 0, advance_height = 0;\n\n\n    /* If this is an incrementally loaded font check whether there are */\n    /* overriding metrics for this glyph.                              */\n    if ( face->root.internal->incremental_interface                           &&\n         face->root.internal->incremental_interface->funcs->get_glyph_metrics )\n    {\n      FT_Incremental_MetricsRec  metrics;\n      FT_Error                   error;\n\n\n      metrics.bearing_x = loader->left_bearing;\n      metrics.bearing_y = 0;\n      metrics.advance   = loader->advance;\n      metrics.advance_v = 0;\n\n      error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(\n                face->root.internal->incremental_interface->object,\n                glyph_index, FALSE, &metrics );\n      if ( error )\n        goto Exit;\n\n      left_bearing  = (FT_Short)metrics.bearing_x;\n      advance_width = (FT_UShort)metrics.advance;\n\n#if 0\n\n      /* GWW: Do I do the same for vertical metrics? */\n      metrics.bearing_x = 0;\n      metrics.bearing_y = loader->top_bearing;\n      metrics.advance   = loader->vadvance;\n\n      error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(\n                face->root.internal->incremental_interface->object,\n                glyph_index, TRUE, &metrics );\n      if ( error )\n        goto Exit;\n\n      top_bearing    = (FT_Short)metrics.bearing_y;\n      advance_height = (FT_UShort)metrics.advance;\n\n#endif /* 0 */\n\n      loader->left_bearing = left_bearing;\n      loader->advance      = advance_width;\n      loader->top_bearing  = top_bearing;\n      loader->vadvance     = advance_height;\n\n      if ( !loader->linear_def )\n      {\n        loader->linear_def = 1;\n        loader->linear     = advance_width;\n      }\n    }\n\n  Exit:\n    return;\n  }\n\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Translates an array of coordinates.                                   */\n  /*                                                                       */\n  static void\n  translate_array( FT_UInt     n,\n                   FT_Vector*  coords,\n                   FT_Pos      delta_x,\n                   FT_Pos      delta_y )\n  {\n    FT_UInt  k;\n\n\n    if ( delta_x )\n      for ( k = 0; k < n; k++ )\n        coords[k].x += delta_x;\n\n    if ( delta_y )\n      for ( k = 0; k < n; k++ )\n        coords[k].y += delta_y;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The following functions are used by default with TrueType fonts.      */\n  /* However, they can be replaced by alternatives if we need to support   */\n  /* TrueType-compressed formats (like MicroType) in the future.           */\n  /*                                                                       */\n  /*************************************************************************/\n\n  FT_CALLBACK_DEF( FT_Error )\n  TT_Access_Glyph_Frame( TT_Loader  loader,\n                         FT_UInt    glyph_index,\n                         FT_ULong   offset,\n                         FT_UInt    byte_count )\n  {\n    FT_Error   error;\n    FT_Stream  stream = loader->stream;\n\n    /* for non-debug mode */\n    FT_UNUSED( glyph_index );\n\n\n    FT_TRACE4(( \"Glyph %ld\\n\", glyph_index ));\n\n    /* the following line sets the `error' variable through macros! */\n    if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( byte_count ) )\n      return error;\n\n    loader->cursor = stream->cursor;\n    loader->limit  = stream->limit;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  TT_Forget_Glyph_Frame( TT_Loader  loader )\n  {\n    FT_Stream  stream = loader->stream;\n\n\n    FT_FRAME_EXIT();\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  TT_Load_Glyph_Header( TT_Loader  loader )\n  {\n    FT_Byte*  p     = loader->cursor;\n    FT_Byte*  limit = loader->limit;\n\n\n    if ( p + 10 > limit )\n      return FT_THROW( Invalid_Outline );\n\n    loader->n_contours = FT_NEXT_SHORT( p );\n\n    loader->bbox.xMin = FT_NEXT_SHORT( p );\n    loader->bbox.yMin = FT_NEXT_SHORT( p );\n    loader->bbox.xMax = FT_NEXT_SHORT( p );\n    loader->bbox.yMax = FT_NEXT_SHORT( p );\n\n    FT_TRACE5(( \"  # of contours: %d\\n\", loader->n_contours ));\n    FT_TRACE5(( \"  xMin: %4d  xMax: %4d\\n\", loader->bbox.xMin,\n                                            loader->bbox.xMax ));\n    FT_TRACE5(( \"  yMin: %4d  yMax: %4d\\n\", loader->bbox.yMin,\n                                            loader->bbox.yMax ));\n    loader->cursor = p;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  TT_Load_Simple_Glyph( TT_Loader  load )\n  {\n    FT_Error        error;\n    FT_Byte*        p          = load->cursor;\n    FT_Byte*        limit      = load->limit;\n    FT_GlyphLoader  gloader    = load->gloader;\n    FT_Int          n_contours = load->n_contours;\n    FT_Outline*     outline;\n    TT_Face         face       = (TT_Face)load->face;\n    FT_UShort       n_ins;\n    FT_Int          n_points;\n\n    FT_Byte         *flag, *flag_limit;\n    FT_Byte         c, count;\n    FT_Vector       *vec, *vec_limit;\n    FT_Pos          x;\n    FT_Short        *cont, *cont_limit, prev_cont;\n    FT_Int          xy_size = 0;\n\n\n    /* check that we can add the contours to the glyph */\n    error = FT_GLYPHLOADER_CHECK_POINTS( gloader, 0, n_contours );\n    if ( error )\n      goto Fail;\n\n    /* reading the contours' endpoints & number of points */\n    cont       = gloader->current.outline.contours;\n    cont_limit = cont + n_contours;\n\n    /* check space for contours array + instructions count */\n    if ( n_contours >= 0xFFF || p + ( n_contours + 1 ) * 2 > limit )\n      goto Invalid_Outline;\n\n    prev_cont = FT_NEXT_SHORT( p );\n\n    if ( n_contours > 0 )\n      cont[0] = prev_cont;\n\n    if ( prev_cont < 0 )\n      goto Invalid_Outline;\n\n    for ( cont++; cont < cont_limit; cont++ )\n    {\n      cont[0] = FT_NEXT_SHORT( p );\n      if ( cont[0] <= prev_cont )\n      {\n        /* unordered contours: this is invalid */\n        goto Invalid_Outline;\n      }\n      prev_cont = cont[0];\n    }\n\n    n_points = 0;\n    if ( n_contours > 0 )\n    {\n      n_points = cont[-1] + 1;\n      if ( n_points < 0 )\n        goto Invalid_Outline;\n    }\n\n    /* note that we will add four phantom points later */\n    error = FT_GLYPHLOADER_CHECK_POINTS( gloader, n_points + 4, 0 );\n    if ( error )\n      goto Fail;\n\n    /* reading the bytecode instructions */\n    load->glyph->control_len  = 0;\n    load->glyph->control_data = 0;\n\n    if ( p + 2 > limit )\n      goto Invalid_Outline;\n\n    n_ins = FT_NEXT_USHORT( p );\n\n    FT_TRACE5(( \"  Instructions size: %u\\n\", n_ins ));\n\n    if ( n_ins > face->max_profile.maxSizeOfInstructions )\n    {\n      FT_TRACE0(( \"TT_Load_Simple_Glyph: too many instructions (%d)\\n\",\n                  n_ins ));\n      error = FT_THROW( Too_Many_Hints );\n      goto Fail;\n    }\n\n    if ( ( limit - p ) < n_ins )\n    {\n      FT_TRACE0(( \"TT_Load_Simple_Glyph: instruction count mismatch\\n\" ));\n      error = FT_THROW( Too_Many_Hints );\n      goto Fail;\n    }\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n    if ( IS_HINTED( load->load_flags ) )\n    {\n      load->glyph->control_len  = n_ins;\n      load->glyph->control_data = load->exec->glyphIns;\n\n      FT_MEM_COPY( load->exec->glyphIns, p, (FT_Long)n_ins );\n    }\n\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n\n    p += n_ins;\n\n    outline = &gloader->current.outline;\n\tif (outline->tags == NULL) {\n\t\tFT_TRACE0(( \"TT_Load_Simple_Glyph: Outline->tags = NULL!\\n\" ));\n\t\tgoto Invalid_Outline;\n\t}\n\n    /* reading the point tags */\n    flag       = (FT_Byte*)outline->tags;\n    flag_limit = flag + n_points;\n\n    //FT_ASSERT( flag != NULL );\n\n    while ( flag < flag_limit )\n    {\n      if ( p + 1 > limit )\n        goto Invalid_Outline;\n\n      *flag++ = c = FT_NEXT_BYTE( p );\n      if ( c & 8 )\n      {\n        if ( p + 1 > limit )\n          goto Invalid_Outline;\n\n        count = FT_NEXT_BYTE( p );\n        if ( flag + (FT_Int)count > flag_limit )\n          goto Invalid_Outline;\n\n        for ( ; count > 0; count-- )\n          *flag++ = c;\n      }\n    }\n\n    /* reading the X coordinates */\n\n    vec       = outline->points;\n    vec_limit = vec + n_points;\n    flag      = (FT_Byte*)outline->tags;\n    x         = 0;\n\n    if ( p + xy_size > limit )\n      goto Invalid_Outline;\n\n    for ( ; vec < vec_limit; vec++, flag++ )\n    {\n      FT_Pos   y = 0;\n      FT_Byte  f = *flag;\n\n\n      if ( f & 2 )\n      {\n        if ( p + 1 > limit )\n          goto Invalid_Outline;\n\n        y = (FT_Pos)FT_NEXT_BYTE( p );\n        if ( ( f & 16 ) == 0 )\n          y = -y;\n      }\n      else if ( ( f & 16 ) == 0 )\n      {\n        if ( p + 2 > limit )\n          goto Invalid_Outline;\n\n        y = (FT_Pos)FT_NEXT_SHORT( p );\n      }\n\n      x     += y;\n      vec->x = x;\n      /* the cast is for stupid compilers */\n      *flag  = (FT_Byte)( f & ~( 2 | 16 ) );\n    }\n\n    /* reading the Y coordinates */\n\n    vec       = gloader->current.outline.points;\n    vec_limit = vec + n_points;\n    flag      = (FT_Byte*)outline->tags;\n    x         = 0;\n\n    for ( ; vec < vec_limit; vec++, flag++ )\n    {\n      FT_Pos   y = 0;\n      FT_Byte  f = *flag;\n\n\n      if ( f & 4 )\n      {\n        if ( p + 1 > limit )\n          goto Invalid_Outline;\n\n        y = (FT_Pos)FT_NEXT_BYTE( p );\n        if ( ( f & 32 ) == 0 )\n          y = -y;\n      }\n      else if ( ( f & 32 ) == 0 )\n      {\n        if ( p + 2 > limit )\n          goto Invalid_Outline;\n\n        y = (FT_Pos)FT_NEXT_SHORT( p );\n      }\n\n      x     += y;\n      vec->y = x;\n      /* the cast is for stupid compilers */\n      *flag  = (FT_Byte)( f & FT_CURVE_TAG_ON );\n    }\n\n    outline->n_points   = (FT_UShort)n_points;\n    outline->n_contours = (FT_Short) n_contours;\n\n    load->cursor = p;\n\n  Fail:\n    return error;\n\n  Invalid_Outline:\n    error = FT_THROW( Invalid_Outline );\n    goto Fail;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  TT_Load_Composite_Glyph( TT_Loader  loader )\n  {\n    FT_Error        error;\n    FT_Byte*        p       = loader->cursor;\n    FT_Byte*        limit   = loader->limit;\n    FT_GlyphLoader  gloader = loader->gloader;\n    FT_SubGlyph     subglyph;\n    FT_UInt         num_subglyphs;\n\n\n    num_subglyphs = 0;\n\n    do\n    {\n      FT_Fixed  xx, xy, yy, yx;\n      FT_UInt   count;\n\n\n      /* check that we can load a new subglyph */\n      error = FT_GlyphLoader_CheckSubGlyphs( gloader, num_subglyphs + 1 );\n      if ( error )\n        goto Fail;\n\n      /* check space */\n      if ( p + 4 > limit )\n        goto Invalid_Composite;\n\n      subglyph = gloader->current.subglyphs + num_subglyphs;\n\n      subglyph->arg1 = subglyph->arg2 = 0;\n\n      subglyph->flags = FT_NEXT_USHORT( p );\n      subglyph->index = FT_NEXT_USHORT( p );\n\n      /* check space */\n      count = 2;\n      if ( subglyph->flags & ARGS_ARE_WORDS )\n        count += 2;\n      if ( subglyph->flags & WE_HAVE_A_SCALE )\n        count += 2;\n      else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE )\n        count += 4;\n      else if ( subglyph->flags & WE_HAVE_A_2X2 )\n        count += 8;\n\n      if ( p + count > limit )\n        goto Invalid_Composite;\n\n      /* read arguments */\n      if ( subglyph->flags & ARGS_ARE_WORDS )\n      {\n        subglyph->arg1 = FT_NEXT_SHORT( p );\n        subglyph->arg2 = FT_NEXT_SHORT( p );\n      }\n      else\n      {\n        subglyph->arg1 = FT_NEXT_CHAR( p );\n        subglyph->arg2 = FT_NEXT_CHAR( p );\n      }\n\n      /* read transform */\n      xx = yy = 0x10000L;\n      xy = yx = 0;\n\n      if ( subglyph->flags & WE_HAVE_A_SCALE )\n      {\n        xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;\n        yy = xx;\n      }\n      else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE )\n      {\n        xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;\n        yy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;\n      }\n      else if ( subglyph->flags & WE_HAVE_A_2X2 )\n      {\n        xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;\n        yx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;\n        xy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;\n        yy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;\n      }\n\n      subglyph->transform.xx = xx;\n      subglyph->transform.xy = xy;\n      subglyph->transform.yx = yx;\n      subglyph->transform.yy = yy;\n\n      num_subglyphs++;\n\n    } while ( subglyph->flags & MORE_COMPONENTS );\n\n    gloader->current.num_subglyphs = num_subglyphs;\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n    {\n      FT_Stream  stream = loader->stream;\n\n\n      /* we must undo the FT_FRAME_ENTER in order to point */\n      /* to the composite instructions, if we find some.   */\n      /* We will process them later.                       */\n      /*                                                   */\n      loader->ins_pos = (FT_ULong)( FT_STREAM_POS() +\n                                    p - limit );\n    }\n\n#endif\n\n    loader->cursor = p;\n\n  Fail:\n    return error;\n\n  Invalid_Composite:\n    error = FT_THROW( Invalid_Composite );\n    goto Fail;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  TT_Init_Glyph_Loading( TT_Face  face )\n  {\n    face->access_glyph_frame   = TT_Access_Glyph_Frame;\n    face->read_glyph_header    = TT_Load_Glyph_Header;\n    face->read_simple_glyph    = TT_Load_Simple_Glyph;\n    face->read_composite_glyph = TT_Load_Composite_Glyph;\n    face->forget_glyph_frame   = TT_Forget_Glyph_Frame;\n  }\n\n\n  static void\n  tt_prepare_zone( TT_GlyphZone  zone,\n                   FT_GlyphLoad  load,\n                   FT_UInt       start_point,\n                   FT_UInt       start_contour )\n  {\n    zone->n_points    = (FT_UShort)( load->outline.n_points - start_point );\n    zone->n_contours  = (FT_Short) ( load->outline.n_contours -\n                                       start_contour );\n    zone->org         = load->extra_points + start_point;\n    zone->cur         = load->outline.points + start_point;\n    zone->orus        = load->extra_points2 + start_point;\n    zone->tags        = (FT_Byte*)load->outline.tags + start_point;\n    zone->contours    = (FT_UShort*)load->outline.contours + start_contour;\n    zone->first_point = (FT_UShort)start_point;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Hint_Glyph                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Hint the glyph using the zone prepared by the caller.  Note that   */\n  /*    the zone is supposed to include four phantom points.               */\n  /*                                                                       */\n  static FT_Error\n  TT_Hint_Glyph( TT_Loader  loader,\n                 FT_Bool    is_composite )\n  {\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    TT_Face    face   = (TT_Face)loader->face;\n    TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( face );\n#endif\n\n    TT_GlyphZone  zone = &loader->zone;\n    FT_Pos        origin;\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n    FT_UInt       n_ins;\n#else\n    FT_UNUSED( is_composite );\n#endif\n\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n    if ( loader->glyph->control_len > 0xFFFFL )\n    {\n      FT_TRACE1(( \"TT_Hint_Glyph: too long instructions \" ));\n      FT_TRACE1(( \"(0x%lx byte) is truncated\\n\",\n                 loader->glyph->control_len ));\n    }\n    n_ins = (FT_UInt)( loader->glyph->control_len );\n#endif\n\n    origin = zone->cur[zone->n_points - 4].x;\n    origin = FT_PIX_ROUND( origin ) - origin;\n    if ( origin )\n      translate_array( zone->n_points, zone->cur, origin, 0 );\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n    /* save original point position in org */\n    if ( n_ins > 0 )\n      FT_ARRAY_COPY( zone->org, zone->cur, zone->n_points );\n\n    /* Reset graphics state. */\n    loader->exec->GS = ((TT_Size)loader->size)->GS;\n\n    /* XXX: UNDOCUMENTED! Hinting instructions of a composite glyph */\n    /*      completely refer to the (already) hinted subglyphs.     */\n    if ( is_composite )\n    {\n      loader->exec->metrics.x_scale = 1 << 16;\n      loader->exec->metrics.y_scale = 1 << 16;\n\n      FT_ARRAY_COPY( zone->orus, zone->cur, zone->n_points );\n    }\n    else\n    {\n      loader->exec->metrics.x_scale =\n        ((TT_Size)loader->size)->metrics.x_scale;\n      loader->exec->metrics.y_scale =\n        ((TT_Size)loader->size)->metrics.y_scale;\n    }\n#endif\n\n    /* round pp2 and pp4 */\n    zone->cur[zone->n_points - 3].x =\n      FT_PIX_ROUND( zone->cur[zone->n_points - 3].x );\n    zone->cur[zone->n_points - 1].y =\n      FT_PIX_ROUND( zone->cur[zone->n_points - 1].y );\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n    if ( n_ins > 0 )\n    {\n      FT_Bool   debug;\n      FT_Error  error;\n\n      FT_GlyphLoader  gloader         = loader->gloader;\n      FT_Outline      current_outline = gloader->current.outline;\n\n\n      error = TT_Set_CodeRange( loader->exec, tt_coderange_glyph,\n                                loader->exec->glyphIns, n_ins );\n      if ( error )\n        return error;\n\n      loader->exec->is_composite = is_composite;\n      loader->exec->pts          = *zone;\n\n      debug = FT_BOOL( !( loader->load_flags & FT_LOAD_NO_SCALE ) &&\n                       ((TT_Size)loader->size)->debug             );\n\n      error = TT_Run_Context( loader->exec, debug );\n      if ( error && loader->exec->pedantic_hinting )\n        return error;\n\n      /* store drop-out mode in bits 5-7; set bit 2 also as a marker */\n      current_outline.tags[0] |=\n        ( loader->exec->GS.scan_type << 5 ) | FT_CURVE_TAG_HAS_SCANMODE;\n    }\n\n#endif\n\n    /* save glyph phantom points */\n    if ( !loader->preserve_pps )\n    {\n      loader->pp1 = zone->cur[zone->n_points - 4];\n      loader->pp2 = zone->cur[zone->n_points - 3];\n      loader->pp3 = zone->cur[zone->n_points - 2];\n      loader->pp4 = zone->cur[zone->n_points - 1];\n    }\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )\n    {\n      if ( loader->exec->sph_tweak_flags & SPH_TWEAK_DEEMBOLDEN )\n        FT_Outline_EmboldenXY( &loader->gloader->current.outline, -24, 0 );\n\n      else if ( loader->exec->sph_tweak_flags & SPH_TWEAK_EMBOLDEN )\n        FT_Outline_EmboldenXY( &loader->gloader->current.outline, 24, 0 );\n    }\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Process_Simple_Glyph                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Once a simple glyph has been loaded, it needs to be processed.     */\n  /*    Usually, this means scaling and hinting through bytecode           */\n  /*    interpretation.                                                    */\n  /*                                                                       */\n  static FT_Error\n  TT_Process_Simple_Glyph( TT_Loader  loader )\n  {\n    FT_GlyphLoader  gloader = loader->gloader;\n    FT_Error        error   = FT_Err_Ok;\n    FT_Outline*     outline;\n    FT_Int          n_points;\n\n\n    outline  = &gloader->current.outline;\n    n_points = outline->n_points;\n\n    /* set phantom points */\n\n    outline->points[n_points    ] = loader->pp1;\n    outline->points[n_points + 1] = loader->pp2;\n    outline->points[n_points + 2] = loader->pp3;\n    outline->points[n_points + 3] = loader->pp4;\n\n    outline->tags[n_points    ] = 0;\n    outline->tags[n_points + 1] = 0;\n    outline->tags[n_points + 2] = 0;\n    outline->tags[n_points + 3] = 0;\n\n    n_points += 4;\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n\n    if ( ((TT_Face)loader->face)->doblend )\n    {\n      /* Deltas apply to the unscaled data. */\n      FT_Vector*  deltas;\n      FT_Memory   memory = loader->face->memory;\n      FT_Int      i;\n\n\n      error = TT_Vary_Get_Glyph_Deltas( (TT_Face)(loader->face),\n                                        loader->glyph_index,\n                                        &deltas,\n                                        n_points );\n      if ( error )\n        return error;\n\n      for ( i = 0; i < n_points; ++i )\n      {\n        outline->points[i].x += deltas[i].x;\n        outline->points[i].y += deltas[i].y;\n      }\n\n      FT_FREE( deltas );\n    }\n\n#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */\n\n    if ( IS_HINTED( loader->load_flags ) )\n    {\n      tt_prepare_zone( &loader->zone, &gloader->current, 0, 0 );\n\n      FT_ARRAY_COPY( loader->zone.orus, loader->zone.cur,\n                     loader->zone.n_points + 4 );\n    }\n\n    {\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n      TT_Face    face   = (TT_Face)loader->face;\n      TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( face );\n\n      FT_String*  family         = face->root.family_name;\n      FT_Int      ppem           = loader->size->metrics.x_ppem;\n      FT_String*  style          = face->root.style_name;\n      FT_Int      x_scale_factor = 1000;\n#endif\n\n      FT_Vector*  vec   = outline->points;\n      FT_Vector*  limit = outline->points + n_points;\n\n      FT_Fixed  x_scale = 0; /* pacify compiler */\n      FT_Fixed  y_scale = 0;\n\n      FT_Bool  do_scale = FALSE;\n\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n\n      if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )\n      {\n        /* scale, but only if enabled and only if TT hinting is being used */\n        if ( IS_HINTED( loader->load_flags ) )\n          x_scale_factor = sph_test_tweak_x_scaling( face,\n                                                     family,\n                                                     ppem,\n                                                     style,\n                                                     loader->glyph_index );\n        /* scale the glyph */\n        if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ||\n             x_scale_factor != 1000                         )\n        {\n          x_scale = FT_MulDiv( ((TT_Size)loader->size)->metrics.x_scale,\n                               x_scale_factor, 1000 );\n          y_scale = ((TT_Size)loader->size)->metrics.y_scale;\n\n          /* compensate for any scaling by de/emboldening; */\n          /* the amount was determined via experimentation */\n          if ( x_scale_factor != 1000 && ppem > 11 )\n            FT_Outline_EmboldenXY( outline,\n                                   FT_MulFix( 1280 * ppem,\n                                              1000 - x_scale_factor ),\n                                   0 );\n          do_scale = TRUE;\n        }\n      }\n      else\n\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n      {\n        /* scale the glyph */\n        if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )\n        {\n          x_scale = ((TT_Size)loader->size)->metrics.x_scale;\n          y_scale = ((TT_Size)loader->size)->metrics.y_scale;\n\n          do_scale = TRUE;\n        }\n      }\n\n      if ( do_scale )\n      {\n        for ( ; vec < limit; vec++ )\n        {\n          vec->x = FT_MulFix( vec->x, x_scale );\n          vec->y = FT_MulFix( vec->y, y_scale );\n        }\n\n        loader->pp1 = outline->points[n_points - 4];\n        loader->pp2 = outline->points[n_points - 3];\n        loader->pp3 = outline->points[n_points - 2];\n        loader->pp4 = outline->points[n_points - 1];\n      }\n    }\n\n    /**We Disable HINT except tricky font, seem it looks better, #Testdoc:0000584_Open_CAC5U7WH.pdf,\n\t0000879_Image_MSFNUnattendedPDF.pdf,0005480_sample-barcodes print.pdf.\n\t*/\n\t\n    if ( IS_HINTED( loader->load_flags ) && (loader->face->face_flags&FT_FACE_FLAG_TRICKY))\n    {\n      loader->zone.n_points += 4;\n\n      error = TT_Hint_Glyph( loader, 0 );\n    }\n\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Process_Composite_Component                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Once a composite component has been loaded, it needs to be         */\n  /*    processed.  Usually, this means transforming and translating.      */\n  /*                                                                       */\n  static FT_Error\n  TT_Process_Composite_Component( TT_Loader    loader,\n                                  FT_SubGlyph  subglyph,\n                                  FT_UInt      start_point,\n                                  FT_UInt      num_base_points )\n  {\n    FT_GlyphLoader  gloader    = loader->gloader;\n    FT_Vector*      base_vec   = gloader->base.outline.points;\n    FT_UInt         num_points = gloader->base.outline.n_points;\n    FT_Bool         have_scale;\n    FT_Pos          x, y;\n\n\n    have_scale = FT_BOOL( subglyph->flags & ( WE_HAVE_A_SCALE     |\n                                              WE_HAVE_AN_XY_SCALE |\n                                              WE_HAVE_A_2X2       ) );\n\n    /* perform the transform required for this subglyph */\n    if ( have_scale )\n    {\n      FT_UInt  i;\n\n\n      for ( i = num_base_points; i < num_points; i++ )\n        FT_Vector_Transform( base_vec + i, &subglyph->transform );\n    }\n\n    /* get offset */\n    if ( !( subglyph->flags & ARGS_ARE_XY_VALUES ) )\n    {\n      FT_UInt     k = subglyph->arg1;\n      FT_UInt     l = subglyph->arg2;\n      FT_Vector*  p1;\n      FT_Vector*  p2;\n\n\n      /* match l-th point of the newly loaded component to the k-th point */\n      /* of the previously loaded components.                             */\n\n      /* change to the point numbers used by our outline */\n      k += start_point;\n      l += num_base_points;\n      if ( k >= num_base_points ||\n           l >= num_points      )\n        return FT_THROW( Invalid_Composite );\n\n      p1 = gloader->base.outline.points + k;\n      p2 = gloader->base.outline.points + l;\n\n      x = p1->x - p2->x;\n      y = p1->y - p2->y;\n    }\n    else\n    {\n      x = subglyph->arg1;\n      y = subglyph->arg2;\n\n      if ( !x && !y )\n        return FT_Err_Ok;\n\n  /* Use a default value dependent on                                     */\n  /* TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED.  This is useful for old TT */\n  /* fonts which don't set the xxx_COMPONENT_OFFSET bit.                  */\n\n      if ( have_scale &&\n#ifdef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED\n           !( subglyph->flags & UNSCALED_COMPONENT_OFFSET ) )\n#else\n            ( subglyph->flags & SCALED_COMPONENT_OFFSET ) )\n#endif\n      {\n\n#if 0\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This algorithm is what Apple documents.  But it doesn't work.         */\n  /*                                                                       */\n        int  a = subglyph->transform.xx > 0 ?  subglyph->transform.xx\n                                            : -subglyph->transform.xx;\n        int  b = subglyph->transform.yx > 0 ?  subglyph->transform.yx\n                                            : -subglyph->transform.yx;\n        int  c = subglyph->transform.xy > 0 ?  subglyph->transform.xy\n                                            : -subglyph->transform.xy;\n        int  d = subglyph->transform.yy > 0 ? subglyph->transform.yy\n                                            : -subglyph->transform.yy;\n        int  m = a > b ? a : b;\n        int  n = c > d ? c : d;\n\n\n        if ( a - b <= 33 && a - b >= -33 )\n          m *= 2;\n        if ( c - d <= 33 && c - d >= -33 )\n          n *= 2;\n        x = FT_MulFix( x, m );\n        y = FT_MulFix( y, n );\n\n#else /* 0 */\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This algorithm is a guess and works much better than the above.       */\n  /*                                                                       */\n        FT_Fixed  mac_xscale = FT_Hypot( subglyph->transform.xx,\n                                         subglyph->transform.xy );\n        FT_Fixed  mac_yscale = FT_Hypot( subglyph->transform.yy,\n                                         subglyph->transform.yx );\n\n\n        x = FT_MulFix( x, mac_xscale );\n        y = FT_MulFix( y, mac_yscale );\n\n#endif /* 0 */\n\n      }\n\n      if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) )\n      {\n        FT_Fixed  x_scale = ((TT_Size)loader->size)->metrics.x_scale;\n        FT_Fixed  y_scale = ((TT_Size)loader->size)->metrics.y_scale;\n\n\n        x = FT_MulFix( x, x_scale );\n        y = FT_MulFix( y, y_scale );\n\n        if ( subglyph->flags & ROUND_XY_TO_GRID )\n        {\n          x = FT_PIX_ROUND( x );\n          y = FT_PIX_ROUND( y );\n        }\n      }\n    }\n\n    if ( x || y )\n      translate_array( num_points - num_base_points,\n                       base_vec + num_base_points,\n                       x, y );\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Process_Composite_Glyph                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This is slightly different from TT_Process_Simple_Glyph, in that   */\n  /*    its sole purpose is to hint the glyph.  Thus this function is      */\n  /*    only available when bytecode interpreter is enabled.               */\n  /*                                                                       */\n  static FT_Error\n  TT_Process_Composite_Glyph( TT_Loader  loader,\n                              FT_UInt    start_point,\n                              FT_UInt    start_contour )\n  {\n    FT_Error     error;\n    FT_Outline*  outline;\n    FT_UInt      i;\n\n\n    outline = &loader->gloader->base.outline;\n\n    /* make room for phantom points */\n    error = FT_GLYPHLOADER_CHECK_POINTS( loader->gloader,\n                                         outline->n_points + 4,\n                                         0 );\n    if ( error )\n      return error;\n\n    outline->points[outline->n_points    ] = loader->pp1;\n    outline->points[outline->n_points + 1] = loader->pp2;\n    outline->points[outline->n_points + 2] = loader->pp3;\n    outline->points[outline->n_points + 3] = loader->pp4;\n\n    outline->tags[outline->n_points    ] = 0;\n    outline->tags[outline->n_points + 1] = 0;\n    outline->tags[outline->n_points + 2] = 0;\n    outline->tags[outline->n_points + 3] = 0;\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n    {\n      FT_Stream  stream = loader->stream;\n      FT_UShort  n_ins, max_ins;\n      FT_ULong   tmp;\n\n\n      /* TT_Load_Composite_Glyph only gives us the offset of instructions */\n      /* so we read them here                                             */\n      if ( FT_STREAM_SEEK( loader->ins_pos ) ||\n           FT_READ_USHORT( n_ins )           )\n        return error;\n\n      FT_TRACE5(( \"  Instructions size = %d\\n\", n_ins ));\n\n      /* check it */\n      max_ins = ((TT_Face)loader->face)->max_profile.maxSizeOfInstructions;\n      if ( n_ins > max_ins )\n      {\n        /* acroread ignores this field, so we only do a rough safety check */\n        if ( (FT_Int)n_ins > loader->byte_len )\n        {\n          FT_TRACE1(( \"TT_Process_Composite_Glyph: \"\n                      \"too many instructions (%d) for glyph with length %d\\n\",\n                      n_ins, loader->byte_len ));\n          return FT_THROW( Too_Many_Hints );\n        }\n\n        tmp = loader->exec->glyphSize;\n        error = Update_Max( loader->exec->memory,\n                            &tmp,\n                            sizeof ( FT_Byte ),\n                            (void*)&loader->exec->glyphIns,\n                            n_ins );\n        loader->exec->glyphSize = (FT_UShort)tmp;\n        if ( error )\n          return error;\n      }\n      else if ( n_ins == 0 )\n        return FT_Err_Ok;\n\n      if ( FT_STREAM_READ( loader->exec->glyphIns, n_ins ) )\n        return error;\n\n      loader->glyph->control_data = loader->exec->glyphIns;\n      loader->glyph->control_len  = n_ins;\n    }\n\n#endif\n\n    tt_prepare_zone( &loader->zone, &loader->gloader->base,\n                     start_point, start_contour );\n\n    /* Some points are likely touched during execution of  */\n    /* instructions on components.  So let's untouch them. */\n    for ( i = start_point; i < loader->zone.n_points; i++ )\n      loader->zone.tags[i] &= ~FT_CURVE_TAG_TOUCH_BOTH;\n\n    loader->zone.n_points += 4;\n\n    return TT_Hint_Glyph( loader, 1 );\n  }\n\n\n  /* Calculate the four phantom points.                     */\n  /* The first two stand for horizontal origin and advance. */\n  /* The last two stand for vertical origin and advance.    */\n#define TT_LOADER_SET_PP( loader )                                          \\\n          do {                                                              \\\n            (loader)->pp1.x = (loader)->bbox.xMin - (loader)->left_bearing; \\\n            (loader)->pp1.y = 0;                                            \\\n            (loader)->pp2.x = (loader)->pp1.x + (loader)->advance;          \\\n            (loader)->pp2.y = 0;                                            \\\n            (loader)->pp3.x = 0;                                            \\\n            (loader)->pp3.y = (loader)->top_bearing + (loader)->bbox.yMax;  \\\n            (loader)->pp4.x = 0;                                            \\\n            (loader)->pp4.y = (loader)->pp3.y - (loader)->vadvance;         \\\n          } while ( 0 )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    load_truetype_glyph                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads a given truetype glyph.  Handles composites and uses a       */\n  /*    TT_Loader object.                                                  */\n  /*                                                                       */\n  static FT_Error\n  load_truetype_glyph( TT_Loader  loader,\n                       FT_UInt    glyph_index,\n                       FT_UInt    recurse_count,\n                       FT_Bool    header_only )\n  {\n    FT_Error        error        = FT_Err_Ok;\n    FT_Fixed        x_scale, y_scale;\n    FT_ULong        offset;\n    TT_Face         face         = (TT_Face)loader->face;\n    FT_GlyphLoader  gloader      = loader->gloader;\n    FT_Bool         opened_frame = 0;\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n    FT_Vector*      deltas       = NULL;\n#endif\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    FT_StreamRec    inc_stream;\n    FT_Data         glyph_data;\n    FT_Bool         glyph_data_loaded = 0;\n#endif\n\n\n    /* some fonts have an incorrect value of `maxComponentDepth', */\n    /* thus we allow depth 1 to catch the majority of them        */\n    if ( recurse_count > 1                                   &&\n         recurse_count > face->max_profile.maxComponentDepth )\n    {\n      error = FT_THROW( Invalid_Composite );\n      goto Exit;\n    }\n\n    /* check glyph index */\n    if ( glyph_index >= (FT_UInt)face->root.num_glyphs )\n    {\n      error = FT_THROW( Invalid_Glyph_Index );\n      goto Exit;\n    }\n\n    loader->glyph_index = glyph_index;\n\n    if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )\n    {\n      x_scale = ((TT_Size)loader->size)->metrics.x_scale;\n      y_scale = ((TT_Size)loader->size)->metrics.y_scale;\n    }\n    else\n    {\n      x_scale = 0x10000L;\n      y_scale = 0x10000L;\n    }\n\n    tt_get_metrics( loader, glyph_index );\n\n    /* Set `offset' to the start of the glyph relative to the start of */\n    /* the `glyf' table, and `byte_len' to the length of the glyph in  */\n    /* bytes.                                                          */\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n\n    /* If we are loading glyph data via the incremental interface, set */\n    /* the loader stream to a memory stream reading the data returned  */\n    /* by the interface.                                               */\n    if ( face->root.internal->incremental_interface )\n    {\n      error = face->root.internal->incremental_interface->funcs->get_glyph_data(\n                face->root.internal->incremental_interface->object,\n                glyph_index, &glyph_data );\n      if ( error )\n        goto Exit;\n\n      glyph_data_loaded = 1;\n      offset            = 0;\n      loader->byte_len  = glyph_data.length;\n\n      FT_MEM_ZERO( &inc_stream, sizeof ( inc_stream ) );\n      FT_Stream_OpenMemory( &inc_stream,\n                            glyph_data.pointer, glyph_data.length );\n\n      loader->stream = &inc_stream;\n    }\n    else\n\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n\n      offset = tt_face_get_location( face, glyph_index,\n                                     (FT_UInt*)&loader->byte_len );\n\n    if ( loader->byte_len > 0 )\n    {\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n      /* for the incremental interface, `glyf_offset' is always zero */\n      if ( !loader->glyf_offset                        &&\n           !face->root.internal->incremental_interface )\n#else\n      if ( !loader->glyf_offset )\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n      {\n        FT_TRACE2(( \"no `glyf' table but non-zero `loca' entry\\n\" ));\n        error = FT_THROW( Invalid_Table );\n        goto Exit;\n      }\n\n      error = face->access_glyph_frame( loader, glyph_index,\n                                        loader->glyf_offset + offset,\n                                        loader->byte_len );\n      if ( error )\n        goto Exit;\n\n      opened_frame = 1;\n\n      /* read glyph header first */\n      error = face->read_glyph_header( loader );\n      if ( error || header_only )\n        goto Exit;\n    }\n\n    if ( loader->byte_len == 0 || loader->n_contours == 0 )\n    {\n      loader->bbox.xMin = 0;\n      loader->bbox.xMax = 0;\n      loader->bbox.yMin = 0;\n      loader->bbox.yMax = 0;\n\n      if ( header_only )\n        goto Exit;\n\n      /* must initialize points before (possibly) overriding */\n      /* glyph metrics from the incremental interface        */\n      TT_LOADER_SET_PP( loader );\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n      tt_get_metrics_incr_overrides( loader, glyph_index );\n#endif\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n\n      if ( ((TT_Face)(loader->face))->doblend )\n      {\n        /* this must be done before scaling */\n        FT_Memory  memory = loader->face->memory;\n\n\n        error = TT_Vary_Get_Glyph_Deltas( (TT_Face)(loader->face),\n                                          glyph_index, &deltas, 4 );\n        if ( error )\n          goto Exit;\n\n        loader->pp1.x += deltas[0].x; loader->pp1.y += deltas[0].y;\n        loader->pp2.x += deltas[1].x; loader->pp2.y += deltas[1].y;\n        loader->pp3.x += deltas[2].x; loader->pp3.y += deltas[2].y;\n        loader->pp4.x += deltas[3].x; loader->pp4.y += deltas[3].y;\n\n        FT_FREE( deltas );\n      }\n\n#endif\n\n      if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )\n      {\n        loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale );\n        loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale );\n        loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale );\n        loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale );\n      }\n\n      error = FT_Err_Ok;\n      goto Exit;\n    }\n\n    /* must initialize points before (possibly) overriding */\n    /* glyph metrics from the incremental interface        */\n    TT_LOADER_SET_PP( loader );\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    tt_get_metrics_incr_overrides( loader, glyph_index );\n#endif\n\n    /***********************************************************************/\n    /***********************************************************************/\n    /***********************************************************************/\n\n    /* if it is a simple glyph, load it */\n\n    if ( loader->n_contours > 0 )\n    {\n      error = face->read_simple_glyph( loader );\n      if ( error )\n        goto Exit;\n\n      /* all data have been read */\n      face->forget_glyph_frame( loader );\n      opened_frame = 0;\n\n      error = TT_Process_Simple_Glyph( loader );\n      if ( error )\n        goto Exit;\n\n      FT_GlyphLoader_Add( gloader );\n    }\n\n    /***********************************************************************/\n    /***********************************************************************/\n    /***********************************************************************/\n\n    /* otherwise, load a composite! */\n    else if ( loader->n_contours == -1 )\n    {\n      FT_UInt   start_point;\n      FT_UInt   start_contour;\n      FT_ULong  ins_pos;  /* position of composite instructions, if any */\n\n\n      start_point   = gloader->base.outline.n_points;\n      start_contour = gloader->base.outline.n_contours;\n\n      /* for each subglyph, read composite header */\n      error = face->read_composite_glyph( loader );\n      if ( error )\n        goto Exit;\n\n      /* store the offset of instructions */\n      ins_pos = loader->ins_pos;\n\n      /* all data we need are read */\n      face->forget_glyph_frame( loader );\n      opened_frame = 0;\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n\n      if ( face->doblend )\n      {\n        FT_Int       i, limit;\n        FT_SubGlyph  subglyph;\n        FT_Memory    memory = face->root.memory;\n\n\n        /* this provides additional offsets */\n        /* for each component's translation */\n\n        if ( ( error = TT_Vary_Get_Glyph_Deltas(\n                         face,\n                         glyph_index,\n                         &deltas,\n                         gloader->current.num_subglyphs + 4 )) != 0 )\n          goto Exit;\n\n        subglyph = gloader->current.subglyphs + gloader->base.num_subglyphs;\n        limit    = gloader->current.num_subglyphs;\n\n        for ( i = 0; i < limit; ++i, ++subglyph )\n        {\n          if ( subglyph->flags & ARGS_ARE_XY_VALUES )\n          {\n            /* XXX: overflow check for subglyph->{arg1,arg2}.   */\n            /* deltas[i].{x,y} must be within signed 16-bit,    */\n            /* but the restriction of summed delta is not clear */\n            subglyph->arg1 += (FT_Int16)deltas[i].x;\n            subglyph->arg2 += (FT_Int16)deltas[i].y;\n          }\n        }\n\n        loader->pp1.x += deltas[i + 0].x; loader->pp1.y += deltas[i + 0].y;\n        loader->pp2.x += deltas[i + 1].x; loader->pp2.y += deltas[i + 1].y;\n        loader->pp3.x += deltas[i + 2].x; loader->pp3.y += deltas[i + 2].y;\n        loader->pp4.x += deltas[i + 3].x; loader->pp4.y += deltas[i + 3].y;\n\n        FT_FREE( deltas );\n      }\n\n#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */\n\n      if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )\n      {\n        loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale );\n        loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale );\n        loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale );\n        loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale );\n      }\n\n      /* if the flag FT_LOAD_NO_RECURSE is set, we return the subglyph */\n      /* `as is' in the glyph slot (the client application will be     */\n      /* responsible for interpreting these data)...                   */\n      if ( loader->load_flags & FT_LOAD_NO_RECURSE )\n      {\n        FT_GlyphLoader_Add( gloader );\n        loader->glyph->format = FT_GLYPH_FORMAT_COMPOSITE;\n\n        goto Exit;\n      }\n\n      /*********************************************************************/\n      /*********************************************************************/\n      /*********************************************************************/\n\n      {\n        FT_UInt      n, num_base_points;\n        FT_SubGlyph  subglyph       = 0;\n\n        FT_UInt      num_points     = start_point;\n        FT_UInt      num_subglyphs  = gloader->current.num_subglyphs;\n        FT_UInt      num_base_subgs = gloader->base.num_subglyphs;\n\n        FT_Stream    old_stream     = loader->stream;\n        FT_Int       old_byte_len   = loader->byte_len;\n\n\n        FT_GlyphLoader_Add( gloader );\n\n        /* read each subglyph independently */\n        for ( n = 0; n < num_subglyphs; n++ )\n        {\n          FT_Vector  pp[4];\n\n\n          /* Each time we call load_truetype_glyph in this loop, the   */\n          /* value of `gloader.base.subglyphs' can change due to table */\n          /* reallocations.  We thus need to recompute the subglyph    */\n          /* pointer on each iteration.                                */\n          subglyph = gloader->base.subglyphs + num_base_subgs + n;\n\n          pp[0] = loader->pp1;\n          pp[1] = loader->pp2;\n          pp[2] = loader->pp3;\n          pp[3] = loader->pp4;\n\n          num_base_points = gloader->base.outline.n_points;\n\n          error = load_truetype_glyph( loader, subglyph->index,\n                                       recurse_count + 1, FALSE );\n          if ( error )\n            goto Exit;\n\n          /* restore subglyph pointer */\n          subglyph = gloader->base.subglyphs + num_base_subgs + n;\n\n          if ( !( subglyph->flags & USE_MY_METRICS ) )\n          {\n            loader->pp1 = pp[0];\n            loader->pp2 = pp[1];\n            loader->pp3 = pp[2];\n            loader->pp4 = pp[3];\n          }\n\n          num_points = gloader->base.outline.n_points;\n\n          if ( num_points == num_base_points )\n            continue;\n\n          /* gloader->base.outline consists of three parts:               */\n          /* 0 -(1)-> start_point -(2)-> num_base_points -(3)-> n_points. */\n          /*                                                              */\n          /* (1): exists from the beginning                               */\n          /* (2): components that have been loaded so far                 */\n          /* (3): the newly loaded component                              */\n          TT_Process_Composite_Component( loader, subglyph, start_point,\n                                          num_base_points );\n        }\n\n        loader->stream   = old_stream;\n        loader->byte_len = old_byte_len;\n\n        /* process the glyph */\n        loader->ins_pos = ins_pos;\n        if ( IS_HINTED( loader->load_flags ) &&\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n             subglyph->flags & WE_HAVE_INSTR &&\n\n#endif\n\n             num_points > start_point )\n          TT_Process_Composite_Glyph( loader, start_point, start_contour );\n\n      }\n    }\n    else\n    {\n      /* invalid composite count (negative but not -1) */\n      error = FT_THROW( Invalid_Outline );\n      goto Exit;\n    }\n\n    /***********************************************************************/\n    /***********************************************************************/\n    /***********************************************************************/\n\n  Exit:\n\n    if ( opened_frame )\n      face->forget_glyph_frame( loader );\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n\n    if ( glyph_data_loaded )\n      face->root.internal->incremental_interface->funcs->free_glyph_data(\n        face->root.internal->incremental_interface->object,\n        &glyph_data );\n\n#endif\n\n    return error;\n  }\n\n\n  static FT_Error\n  compute_glyph_metrics( TT_Loader  loader,\n                         FT_UInt    glyph_index )\n  {\n    TT_Face    face   = (TT_Face)loader->face;\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( face );\n#endif\n\n    FT_BBox       bbox;\n    FT_Fixed      y_scale;\n    TT_GlyphSlot  glyph = loader->glyph;\n    TT_Size       size  = (TT_Size)loader->size;\n\n\n    y_scale = 0x10000L;\n    if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )\n      y_scale = size->root.metrics.y_scale;\n\n    if ( glyph->format != FT_GLYPH_FORMAT_COMPOSITE )\n      FT_Outline_Get_CBox( &glyph->outline, &bbox );\n    else\n      bbox = loader->bbox;\n\n    /* get the device-independent horizontal advance; it is scaled later */\n    /* by the base layer.                                                */\n    glyph->linearHoriAdvance = loader->linear;\n\n    glyph->metrics.horiBearingX = bbox.xMin;\n    glyph->metrics.horiBearingY = bbox.yMax;\n    glyph->metrics.horiAdvance  = loader->pp2.x - loader->pp1.x;\n\n    /* adjust advance width to the value contained in the hdmx table */\n    if ( !face->postscript.isFixedPitch  &&\n         IS_HINTED( loader->load_flags ) )\n    {\n      FT_Byte*  widthp;\n\n\n      widthp = tt_face_get_device_metrics( face,\n                                           size->root.metrics.x_ppem,\n                                           glyph_index );\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n\n      if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )\n      {\n        FT_Bool  ignore_x_mode;\n\n\n        ignore_x_mode = FT_BOOL( FT_LOAD_TARGET_MODE( loader->load_flags ) !=\n                                 FT_RENDER_MODE_MONO );\n\n        if ( widthp                                                   &&\n             ( ( ignore_x_mode && loader->exec->compatible_widths ) ||\n                !ignore_x_mode                                      ||\n                SPH_OPTION_BITMAP_WIDTHS                            ) )\n          glyph->metrics.horiAdvance = *widthp << 6;\n      }\n      else\n\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n      {\n        if ( widthp )\n          glyph->metrics.horiAdvance = *widthp << 6;\n      }\n    }\n\n    /* set glyph dimensions */\n    glyph->metrics.width  = bbox.xMax - bbox.xMin;\n    glyph->metrics.height = bbox.yMax - bbox.yMin;\n\n    /* Now take care of vertical metrics.  In the case where there is */\n    /* no vertical information within the font (relatively common),   */\n    /* create some metrics manually                                   */\n    {\n      FT_Pos  top;      /* scaled vertical top side bearing  */\n      FT_Pos  advance;  /* scaled vertical advance height    */\n\n\n      /* Get the unscaled top bearing and advance height. */\n      if ( face->vertical_info                   &&\n           face->vertical.number_Of_VMetrics > 0 )\n      {\n        top = (FT_Short)FT_DivFix( loader->pp3.y - bbox.yMax,\n                                   y_scale );\n\n        if ( loader->pp3.y <= loader->pp4.y )\n          advance = 0;\n        else\n          advance = (FT_UShort)FT_DivFix( loader->pp3.y - loader->pp4.y,\n                                          y_scale );\n      }\n      else\n      {\n        FT_Pos  height;\n\n\n        /* XXX Compute top side bearing and advance height in  */\n        /*     Get_VMetrics instead of here.                   */\n\n        /* NOTE: The OS/2 values are the only `portable' ones, */\n        /*       which is why we use them, if there is an OS/2 */\n        /*       table in the font.  Otherwise, we use the     */\n        /*       values defined in the horizontal header.      */\n\n        height = (FT_Short)FT_DivFix( bbox.yMax - bbox.yMin,\n                                      y_scale );\n        if ( face->os2.version != 0xFFFFU )\n          advance = (FT_Pos)( face->os2.sTypoAscender -\n                              face->os2.sTypoDescender );\n        else\n          advance = (FT_Pos)( face->horizontal.Ascender -\n                              face->horizontal.Descender );\n\n        top = ( advance - height ) / 2;\n      }\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n      {\n        FT_Incremental_InterfaceRec*  incr;\n        FT_Incremental_MetricsRec     metrics;\n        FT_Error                      error;\n\n\n        incr = face->root.internal->incremental_interface;\n\n        /* If this is an incrementally loaded font see if there are */\n        /* overriding metrics for this glyph.                       */\n        if ( incr && incr->funcs->get_glyph_metrics )\n        {\n          metrics.bearing_x = 0;\n          metrics.bearing_y = top;\n          metrics.advance   = advance;\n\n          error = incr->funcs->get_glyph_metrics( incr->object,\n                                                  glyph_index,\n                                                  TRUE,\n                                                  &metrics );\n          if ( error )\n            return error;\n\n          top     = metrics.bearing_y;\n          advance = metrics.advance;\n        }\n      }\n\n      /* GWW: Do vertical metrics get loaded incrementally too? */\n\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n\n      glyph->linearVertAdvance = advance;\n\n      /* scale the metrics */\n      if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) )\n      {\n        top     = FT_MulFix( top,     y_scale );\n        advance = FT_MulFix( advance, y_scale );\n      }\n\n      /* XXX: for now, we have no better algorithm for the lsb, but it */\n      /*      should work fine.                                        */\n      /*                                                               */\n      glyph->metrics.vertBearingX = glyph->metrics.horiBearingX -\n                                      glyph->metrics.horiAdvance / 2;\n      glyph->metrics.vertBearingY = top;\n      glyph->metrics.vertAdvance  = advance;\n    }\n\n    return 0;\n  }\n\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n\n  static FT_Error\n  load_sbit_image( TT_Size       size,\n                   TT_GlyphSlot  glyph,\n                   FT_UInt       glyph_index,\n                   FT_Int32      load_flags )\n  {\n    TT_Face             face;\n    SFNT_Service        sfnt;\n    FT_Stream           stream;\n    FT_Error            error;\n    TT_SBit_MetricsRec  metrics;\n\n\n    face   = (TT_Face)glyph->face;\n    sfnt   = (SFNT_Service)face->sfnt;\n    stream = face->root.stream;\n\n    error = sfnt->load_sbit_image( face,\n                                   size->strike_index,\n                                   glyph_index,\n                                   (FT_Int)load_flags,\n                                   stream,\n                                   &glyph->bitmap,\n                                   &metrics );\n    if ( !error )\n    {\n      glyph->outline.n_points   = 0;\n      glyph->outline.n_contours = 0;\n\n      glyph->metrics.width  = (FT_Pos)metrics.width  << 6;\n      glyph->metrics.height = (FT_Pos)metrics.height << 6;\n\n      glyph->metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6;\n      glyph->metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6;\n      glyph->metrics.horiAdvance  = (FT_Pos)metrics.horiAdvance  << 6;\n\n      glyph->metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6;\n      glyph->metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6;\n      glyph->metrics.vertAdvance  = (FT_Pos)metrics.vertAdvance  << 6;\n\n      glyph->format = FT_GLYPH_FORMAT_BITMAP;\n\n      if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )\n      {\n        glyph->bitmap_left = metrics.vertBearingX;\n        glyph->bitmap_top  = metrics.vertBearingY;\n      }\n      else\n      {\n        glyph->bitmap_left = metrics.horiBearingX;\n        glyph->bitmap_top  = metrics.horiBearingY;\n      }\n    }\n\n    return error;\n  }\n\n#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */\n\n\n  static FT_Error\n  tt_loader_init( TT_Loader     loader,\n                  TT_Size       size,\n                  TT_GlyphSlot  glyph,\n                  FT_Int32      load_flags,\n                  FT_Bool       glyf_table_only )\n  {\n    TT_Face    face;\n    FT_Stream  stream;\n#ifdef TT_USE_BYTECODE_INTERPRETER\n    FT_Bool    pedantic = FT_BOOL( load_flags & FT_LOAD_PEDANTIC );\n#endif\n\n\n    face   = (TT_Face)glyph->face;\n    stream = face->root.stream;\n\n    FT_MEM_ZERO( loader, sizeof ( TT_LoaderRec ) );\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n    /* load execution context */\n    if ( IS_HINTED( load_flags ) && !glyf_table_only )\n    {\n      TT_ExecContext  exec;\n      FT_Bool         grayscale;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n      TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( face );\n\n      FT_Bool  subpixel_hinting  = FALSE;\n      FT_Bool  grayscale_hinting = TRUE;\n\n#if 0\n      /* not used yet */\n      FT_Bool  compatible_widths;\n      FT_Bool  symmetrical_smoothing;\n      FT_Bool  bgr;\n      FT_Bool  subpixel_positioned;\n#endif\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n      FT_Bool  reexecute = FALSE;\n\n\n      if ( !size->cvt_ready )\n      {\n        FT_Error  error = tt_size_ready_bytecode( size, pedantic );\n\n\n        if ( error )\n          return error;\n      }\n\n      /* query new execution context */\n      exec = size->debug ? size->context\n                         : ( (TT_Driver)FT_FACE_DRIVER( face ) )->context;\n      if ( !exec )\n        return FT_THROW( Could_Not_Find_Context );\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n\n      if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )\n      {\n        subpixel_hinting = FT_BOOL( ( FT_LOAD_TARGET_MODE( load_flags )\n                                      != FT_RENDER_MODE_MONO )          &&\n                                    SPH_OPTION_SET_SUBPIXEL             );\n\n        if ( subpixel_hinting )\n          grayscale = grayscale_hinting = FALSE;\n        else if ( SPH_OPTION_SET_GRAYSCALE )\n        {\n          grayscale = grayscale_hinting = TRUE;\n          subpixel_hinting              = FALSE;\n        }\n        else\n          grayscale = grayscale_hinting = FALSE;\n\n        if ( FT_IS_TRICKY( glyph->face ) )\n          subpixel_hinting = grayscale_hinting = FALSE;\n\n        exec->ignore_x_mode      = subpixel_hinting || grayscale_hinting;\n        exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;\n        if ( exec->sph_tweak_flags & SPH_TWEAK_RASTERIZER_35 )\n          exec->rasterizer_version = TT_INTERPRETER_VERSION_35;\n\n#if 1\n        exec->compatible_widths     = SPH_OPTION_SET_COMPATIBLE_WIDTHS;\n        exec->symmetrical_smoothing = FALSE;\n        exec->bgr                   = FALSE;\n        exec->subpixel_positioned   = TRUE;\n#else /* 0 */\n        exec->compatible_widths =\n          FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=\n                   TT_LOAD_COMPATIBLE_WIDTHS );\n        exec->symmetrical_smoothing =\n          FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=\n                   TT_LOAD_SYMMETRICAL_SMOOTHING );\n        exec->bgr =\n          FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=\n                   TT_LOAD_BGR );\n        exec->subpixel_positioned =\n          FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=\n                   TT_LOAD_SUBPIXEL_POSITIONED );\n#endif /* 0 */\n\n      }\n      else\n\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n      {\n        grayscale = FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=\n                             FT_RENDER_MODE_MONO );\n      }\n\n      TT_Load_Context( exec, face, size );\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n\n      if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )\n      {\n        /* a change from mono to subpixel rendering (and vice versa) */\n        /* requires a re-execution of the CVT program                */\n        if ( subpixel_hinting != exec->subpixel_hinting )\n        {\n          FT_TRACE4(( \"tt_loader_init: subpixel hinting change,\"\n                      \" re-executing `prep' table\\n\" ));\n\n          exec->subpixel_hinting = subpixel_hinting;\n          reexecute              = TRUE;\n        }\n\n        /* a change from mono to grayscale rendering (and vice versa) */\n        /* requires a re-execution of the CVT program                 */\n        if ( grayscale != exec->grayscale_hinting )\n        {\n          FT_TRACE4(( \"tt_loader_init: grayscale hinting change,\"\n                      \" re-executing `prep' table\\n\" ));\n\n          exec->grayscale_hinting = grayscale_hinting;\n          reexecute               = TRUE;\n        }\n      }\n      else\n\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n      {\n        /* a change from mono to grayscale rendering (and vice versa) */\n        /* requires a re-execution of the CVT program                 */\n        if ( grayscale != exec->grayscale )\n        {\n          FT_TRACE4(( \"tt_loader_init: grayscale change,\"\n                      \" re-executing `prep' table\\n\" ));\n\n          exec->grayscale = grayscale;\n          reexecute       = TRUE;\n        }\n      }\n\n      if ( reexecute )\n      {\n        FT_UInt  i;\n\n\n        for ( i = 0; i < size->cvt_size; i++ )\n          size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale );\n        tt_size_run_prep( size, pedantic );\n      }\n\n      /* see whether the cvt program has disabled hinting */\n      if ( exec->GS.instruct_control & 1 )\n        load_flags |= FT_LOAD_NO_HINTING;\n\n      /* load default graphics state -- if needed */\n      if ( exec->GS.instruct_control & 2 )\n        exec->GS = tt_default_graphics_state;\n\n      exec->pedantic_hinting = FT_BOOL( load_flags & FT_LOAD_PEDANTIC );\n      loader->exec = exec;\n      loader->instructions = exec->glyphIns;\n    }\n\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n\n    /* seek to the beginning of the glyph table -- for Type 42 fonts     */\n    /* the table might be accessed from a Postscript stream or something */\n    /* else...                                                           */\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n\n    if ( face->root.internal->incremental_interface )\n      loader->glyf_offset = 0;\n    else\n\n#endif\n\n    {\n      FT_Error  error = face->goto_table( face, TTAG_glyf, stream, 0 );\n\n\n      if ( FT_ERR_EQ( error, Table_Missing ) )\n        loader->glyf_offset = 0;\n      else if ( error )\n      {\n        FT_ERROR(( \"tt_loader_init: could not access glyph table\\n\" ));\n        return error;\n      }\n      else\n        loader->glyf_offset = FT_STREAM_POS();\n    }\n\n    /* get face's glyph loader */\n    if ( !glyf_table_only )\n    {\n      FT_GlyphLoader  gloader = glyph->internal->loader;\n\n\n      FT_GlyphLoader_Rewind( gloader );\n      loader->gloader = gloader;\n    }\n\n    loader->load_flags = load_flags;\n\n    loader->face   = (FT_Face)face;\n    loader->size   = (FT_Size)size;\n    loader->glyph  = (FT_GlyphSlot)glyph;\n    loader->stream = stream;\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Load_Glyph                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to load a single glyph within a given glyph slot,  */\n  /*    for a given size.                                                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    glyph       :: A handle to a target slot object where the glyph    */\n  /*                   will be loaded.                                     */\n  /*                                                                       */\n  /*    size        :: A handle to the source face size at which the glyph */\n  /*                   must be scaled/loaded.                              */\n  /*                                                                       */\n  /*    glyph_index :: The index of the glyph in the font file.            */\n  /*                                                                       */\n  /*    load_flags  :: A flag indicating what to load for this glyph.  The */\n  /*                   FT_LOAD_XXX constants can be used to control the    */\n  /*                   glyph loading process (e.g., whether the outline    */\n  /*                   should be scaled, whether to load bitmaps or not,   */\n  /*                   whether to hint the outline, etc).                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  TT_Load_Glyph( TT_Size       size,\n                 TT_GlyphSlot  glyph,\n                 FT_UInt       glyph_index,\n                 FT_Int32      load_flags )\n  {\n    FT_Error      error;\n    TT_LoaderRec  loader;\n\n\n    error = FT_Err_Ok;\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n\n    /* try to load embedded bitmap if any              */\n    /*                                                 */\n    /* XXX: The convention should be emphasized in     */\n    /*      the documents because it can be confusing. */\n    if ( size->strike_index != 0xFFFFFFFFUL      &&\n         ( load_flags & FT_LOAD_NO_BITMAP ) == 0 )\n    {\n      error = load_sbit_image( size, glyph, glyph_index, load_flags );\n      if ( !error )\n      {\n        if ( FT_IS_SCALABLE( glyph->face ) )\n        {\n          /* for the bbox we need the header only */\n          (void)tt_loader_init( &loader, size, glyph, load_flags, TRUE );\n          (void)load_truetype_glyph( &loader, glyph_index, 0, TRUE );\n          glyph->linearHoriAdvance = loader.linear;\n          glyph->linearVertAdvance = loader.top_bearing + loader.bbox.yMax -\n                                       loader.vadvance;\n\n          /* sanity check: if `horiAdvance' in the sbit metric */\n          /* structure isn't set, use `linearHoriAdvance'      */\n          if ( !glyph->metrics.horiAdvance && glyph->linearHoriAdvance )\n            glyph->metrics.horiAdvance =\n              FT_MulFix( glyph->linearHoriAdvance,\n                         size->root.metrics.x_scale );\n        }\n\n        return FT_Err_Ok;\n      }\n    }\n\n#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */\n\n    /* if FT_LOAD_NO_SCALE is not set, `ttmetrics' must be valid */\n    if ( !( load_flags & FT_LOAD_NO_SCALE ) && !size->ttmetrics.valid )\n      return FT_THROW( Invalid_Size_Handle );\n\n    if ( load_flags & FT_LOAD_SBITS_ONLY )\n      return FT_THROW( Invalid_Argument );\n\n    error = tt_loader_init( &loader, size, glyph, load_flags, FALSE );\n    if ( error )\n      return error;\n\n    glyph->format        = FT_GLYPH_FORMAT_OUTLINE;\n    glyph->num_subglyphs = 0;\n    glyph->outline.flags = 0;\n\n    /* main loading loop */\n    error = load_truetype_glyph( &loader, glyph_index, 0, FALSE );\n    if ( !error )\n    {\n      if ( glyph->format == FT_GLYPH_FORMAT_COMPOSITE )\n      {\n        glyph->num_subglyphs = loader.gloader->base.num_subglyphs;\n        glyph->subglyphs     = loader.gloader->base.subglyphs;\n      }\n      else\n      {\n        glyph->outline        = loader.gloader->base.outline;\n        glyph->outline.flags &= ~FT_OUTLINE_SINGLE_PASS;\n\n        /* Translate array so that (0,0) is the glyph's origin.  Note  */\n        /* that this behaviour is independent on the value of bit 1 of */\n        /* the `flags' field in the `head' table -- at least major     */\n        /* applications like Acroread indicate that.                   */\n        if ( loader.pp1.x )\n          FT_Outline_Translate( &glyph->outline, -loader.pp1.x, 0 );\n      }\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n      if ( IS_HINTED( load_flags ) )\n      {\n        if ( loader.exec->GS.scan_control )\n        {\n          /* convert scan conversion mode to FT_OUTLINE_XXX flags */\n          switch ( loader.exec->GS.scan_type )\n          {\n          case 0: /* simple drop-outs including stubs */\n            glyph->outline.flags |= FT_OUTLINE_INCLUDE_STUBS;\n            break;\n          case 1: /* simple drop-outs excluding stubs */\n            /* nothing; it's the default rendering mode */\n            break;\n          case 4: /* smart drop-outs including stubs */\n            glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS |\n                                    FT_OUTLINE_INCLUDE_STUBS;\n            break;\n          case 5: /* smart drop-outs excluding stubs  */\n            glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS;\n            break;\n\n          default: /* no drop-out control */\n            glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS;\n            break;\n          }\n        }\n        else\n          glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS;\n      }\n\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n\n      compute_glyph_metrics( &loader, glyph_index );\n    }\n\n    /* Set the `high precision' bit flag.                           */\n    /* This is _critical_ to get correct output for monochrome      */\n    /* TrueType glyphs at all sizes using the bytecode interpreter. */\n    /*                                                              */\n    if ( !( load_flags & FT_LOAD_NO_SCALE ) &&\n         size->root.metrics.y_ppem < 24     )\n      glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgload.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttgload.h                                                              */\n/*                                                                         */\n/*    TrueType Glyph Loader (specification).                               */\n/*                                                                         */\n/*  Copyright 1996-2006, 2008, 2011 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTGLOAD_H__\n#define __TTGLOAD_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"ttobjs.h\"\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n#include \"ttinterp.h\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( void )\n  TT_Init_Glyph_Loading( TT_Face  face );\n\n  FT_LOCAL( void )\n  TT_Get_HMetrics( TT_Face     face,\n                   FT_UInt     idx,\n                   FT_Short*   lsb,\n                   FT_UShort*  aw );\n\n  FT_LOCAL( void )\n  TT_Get_VMetrics( TT_Face     face,\n                   FT_UInt     idx,\n                   FT_Short*   tsb,\n                   FT_UShort*  ah );\n\n  FT_LOCAL( FT_Error )\n  TT_Load_Glyph( TT_Size       size,\n                 TT_GlyphSlot  glyph,\n                 FT_UInt       glyph_index,\n                 FT_Int32      load_flags );\n\n\nFT_END_HEADER\n\n#endif /* __TTGLOAD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgxvar.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttgxvar.c                                                              */\n/*                                                                         */\n/*    TrueType GX Font Variation loader                                    */\n/*                                                                         */\n/*  Copyright 2004-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, Werner Lemberg, and George Williams.     */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Apple documents the `fvar', `gvar', `cvar', and `avar' tables at      */\n  /*                                                                       */\n  /*   http://developer.apple.com/fonts/TTRefMan/RM06/Chap6[fgca]var.html  */\n  /*                                                                       */\n  /* The documentation for `fvar' is inconsistent.  At one point it says   */\n  /* that `countSizePairs' should be 3, at another point 2.  It should     */\n  /* be 2.                                                                 */\n  /*                                                                       */\n  /* The documentation for `gvar' is not intelligible; `cvar' refers you   */\n  /* to `gvar' and is thus also incomprehensible.                          */\n  /*                                                                       */\n  /* The documentation for `avar' appears correct, but Apple has no fonts  */\n  /* with an `avar' table, so it is hard to test.                          */\n  /*                                                                       */\n  /* Many thanks to John Jenkins (at Apple) in figuring this out.          */\n  /*                                                                       */\n  /*                                                                       */\n  /* Apple's `kern' table has some references to tuple indices, but as     */\n  /* there is no indication where these indices are defined, nor how to    */\n  /* interpolate the kerning values (different tuples have different       */\n  /* classes) this issue is ignored.                                       */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/config/ftconfig.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/internal/sfnt.h\"\n#include \"../../include/freetype/tttags.h\"\n#include \"../../include/freetype/ftmm.h\"\n\n#include \"ttpload.h\"\n#include \"ttgxvar.h\"\n\n#include \"tterrors.h\"\n\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n\n\n#define FT_Stream_FTell( stream )  \\\n          (FT_ULong)( (stream)->cursor - (stream)->base )\n#define FT_Stream_SeekSet( stream, off ) \\\n          ( (stream)->cursor = (stream)->base + (off) )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttgxvar\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                       Internal Routines                       *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro ALL_POINTS is used in `ft_var_readpackedpoints'.  It        */\n  /* indicates that there is a delta for every point without needing to    */\n  /* enumerate all of them.                                                */\n  /*                                                                       */\n\n  /* ensure that value `0' has the same width as a pointer */\n#define ALL_POINTS  (FT_UShort*)~(FT_PtrDist)0\n\n\n#define GX_PT_POINTS_ARE_WORDS      0x80\n#define GX_PT_POINT_RUN_COUNT_MASK  0x7F\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    ft_var_readpackedpoints                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Read a set of points to which the following deltas will apply.     */\n  /*    Points are packed with a run length encoding.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream    :: The data stream.                                      */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    point_cnt :: The number of points read.  A zero value means that   */\n  /*                 all points in the glyph will be affected, without     */\n  /*                 enumerating them individually.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    An array of FT_UShort containing the affected points or the        */\n  /*    special value ALL_POINTS.                                          */\n  /*                                                                       */\n  static FT_UShort*\n  ft_var_readpackedpoints( FT_Stream  stream,\n                           FT_UInt   *point_cnt )\n  {\n    FT_UShort *points = NULL;\n    FT_Int     n;\n    FT_Int     runcnt;\n    FT_Int     i;\n    FT_Int     j;\n    FT_Int     first;\n    FT_Memory  memory = stream->memory;\n    FT_Error   error  = FT_Err_Ok;\n\n    FT_UNUSED( error );\n\n\n    *point_cnt = n = FT_GET_BYTE();\n    if ( n == 0 )\n      return ALL_POINTS;\n\n    if ( n & GX_PT_POINTS_ARE_WORDS )\n      n = FT_GET_BYTE() | ( ( n & GX_PT_POINT_RUN_COUNT_MASK ) << 8 );\n\n    if ( FT_NEW_ARRAY( points, n ) )\n      return NULL;\n\n    i = 0;\n    while ( i < n )\n    {\n      runcnt = FT_GET_BYTE();\n      if ( runcnt & GX_PT_POINTS_ARE_WORDS )\n      {\n        runcnt = runcnt & GX_PT_POINT_RUN_COUNT_MASK;\n        first  = points[i++] = FT_GET_USHORT();\n\n        if ( runcnt < 1 || i + runcnt >= n )\n          goto Exit;\n\n        /* first point not included in runcount */\n        for ( j = 0; j < runcnt; ++j )\n          points[i++] = (FT_UShort)( first += FT_GET_USHORT() );\n      }\n      else\n      {\n        first = points[i++] = FT_GET_BYTE();\n\n        if ( runcnt < 1 || i + runcnt >= n )\n          goto Exit;\n\n        for ( j = 0; j < runcnt; ++j )\n          points[i++] = (FT_UShort)( first += FT_GET_BYTE() );\n      }\n    }\n\n  Exit:\n    return points;\n  }\n\n\n  enum\n  {\n    GX_DT_DELTAS_ARE_ZERO      = 0x80,\n    GX_DT_DELTAS_ARE_WORDS     = 0x40,\n    GX_DT_DELTA_RUN_COUNT_MASK = 0x3F\n  };\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    ft_var_readpackeddeltas                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Read a set of deltas.  These are packed slightly differently than  */\n  /*    points.  In particular there is no overall count.                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream    :: The data stream.                                      */\n  /*                                                                       */\n  /*    delta_cnt :: The number of to be read.                             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    An array of FT_Short containing the deltas for the affected        */\n  /*    points.  (This only gets the deltas for one dimension.  It will    */\n  /*    generally be called twice, once for x, once for y.  When used in   */\n  /*    cvt table, it will only be called once.)                           */\n  /*                                                                       */\n  static FT_Short*\n  ft_var_readpackeddeltas( FT_Stream  stream,\n                           FT_Offset  delta_cnt )\n  {\n    FT_Short  *deltas = NULL;\n    FT_UInt    runcnt;\n    FT_Offset  i;\n    FT_UInt    j;\n    FT_Memory  memory = stream->memory;\n    FT_Error   error  = FT_Err_Ok;\n\n    FT_UNUSED( error );\n\n\n    if ( FT_NEW_ARRAY( deltas, delta_cnt ) )\n      return NULL;\n\n    i = 0;\n    while ( i < delta_cnt )\n    {\n      runcnt = FT_GET_BYTE();\n      if ( runcnt & GX_DT_DELTAS_ARE_ZERO )\n      {\n        /* runcnt zeroes get added */\n        for ( j = 0;\n              j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt;\n              ++j )\n          deltas[i++] = 0;\n      }\n      else if ( runcnt & GX_DT_DELTAS_ARE_WORDS )\n      {\n        /* runcnt shorts from the stack */\n        for ( j = 0;\n              j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt;\n              ++j )\n          deltas[i++] = FT_GET_SHORT();\n      }\n      else\n      {\n        /* runcnt signed bytes from the stack */\n        for ( j = 0;\n              j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt;\n              ++j )\n          deltas[i++] = FT_GET_CHAR();\n      }\n\n      if ( j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) )\n      {\n        /* Bad format */\n        FT_FREE( deltas );\n        return NULL;\n      }\n    }\n\n    return deltas;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    ft_var_load_avar                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Parse the `avar' table if present.  It need not be, so we return   */\n  /*    nothing.                                                           */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face :: The font face.                                             */\n  /*                                                                       */\n  static void\n  ft_var_load_avar( TT_Face  face )\n  {\n    FT_Stream       stream = FT_FACE_STREAM(face);\n    FT_Memory       memory = stream->memory;\n    GX_Blend        blend  = face->blend;\n    GX_AVarSegment  segment;\n    FT_Error        error = FT_Err_Ok;\n    FT_ULong        version;\n    FT_Long         axisCount;\n    FT_Int          i, j;\n    FT_ULong        table_len;\n\n    FT_UNUSED( error );\n\n\n    blend->avar_checked = TRUE;\n    if ( (error = face->goto_table( face, TTAG_avar, stream, &table_len )) != 0 )\n      return;\n\n    if ( FT_FRAME_ENTER( table_len ) )\n      return;\n\n    version   = FT_GET_LONG();\n    axisCount = FT_GET_LONG();\n\n    if ( version != 0x00010000L                       ||\n         axisCount != (FT_Long)blend->mmvar->num_axis )\n      goto Exit;\n\n    if ( FT_NEW_ARRAY( blend->avar_segment, axisCount ) )\n      goto Exit;\n\n    segment = &blend->avar_segment[0];\n    for ( i = 0; i < axisCount; ++i, ++segment )\n    {\n      segment->pairCount = FT_GET_USHORT();\n      if ( FT_NEW_ARRAY( segment->correspondence, segment->pairCount ) )\n      {\n        /* Failure.  Free everything we have done so far.  We must do */\n        /* it right now since loading the `avar' table is optional.   */\n\n        for ( j = i - 1; j >= 0; --j )\n          FT_FREE( blend->avar_segment[j].correspondence );\n\n        FT_FREE( blend->avar_segment );\n        blend->avar_segment = NULL;\n        goto Exit;\n      }\n\n      for ( j = 0; j < segment->pairCount; ++j )\n      {\n        segment->correspondence[j].fromCoord =\n          FT_GET_SHORT() << 2;    /* convert to Fixed */\n        segment->correspondence[j].toCoord =\n          FT_GET_SHORT()<<2;    /* convert to Fixed */\n      }\n    }\n\n  Exit:\n    FT_FRAME_EXIT();\n  }\n\n\n  typedef struct  GX_GVar_Head_\n  {\n    FT_Long    version;\n    FT_UShort  axisCount;\n    FT_UShort  globalCoordCount;\n    FT_ULong   offsetToCoord;\n    FT_UShort  glyphCount;\n    FT_UShort  flags;\n    FT_ULong   offsetToData;\n\n  } GX_GVar_Head;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    ft_var_load_gvar                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Parses the `gvar' table if present.  If `fvar' is there, `gvar'    */\n  /*    had better be there too.                                           */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face :: The font face.                                             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  static FT_Error\n  ft_var_load_gvar( TT_Face  face )\n  {\n    FT_Stream     stream = FT_FACE_STREAM(face);\n    FT_Memory     memory = stream->memory;\n    GX_Blend      blend  = face->blend;\n    FT_Error      error;\n    FT_UInt       i, j;\n    FT_ULong      table_len;\n    FT_ULong      gvar_start;\n    FT_ULong      offsetToData;\n    GX_GVar_Head  gvar_head;\n\n    static const FT_Frame_Field  gvar_fields[] =\n    {\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  GX_GVar_Head\n\n      FT_FRAME_START( 20 ),\n        FT_FRAME_LONG  ( version ),\n        FT_FRAME_USHORT( axisCount ),\n        FT_FRAME_USHORT( globalCoordCount ),\n        FT_FRAME_ULONG ( offsetToCoord ),\n        FT_FRAME_USHORT( glyphCount ),\n        FT_FRAME_USHORT( flags ),\n        FT_FRAME_ULONG ( offsetToData ),\n      FT_FRAME_END\n    };\n\n    if ( (error = face->goto_table( face, TTAG_gvar, stream, &table_len )) != 0 )\n      goto Exit;\n\n    gvar_start = FT_STREAM_POS( );\n    if ( FT_STREAM_READ_FIELDS( gvar_fields, &gvar_head ) )\n      goto Exit;\n\n    blend->tuplecount  = gvar_head.globalCoordCount;\n    blend->gv_glyphcnt = gvar_head.glyphCount;\n    offsetToData       = gvar_start + gvar_head.offsetToData;\n\n    if ( gvar_head.version   != (FT_Long)0x00010000L              ||\n         gvar_head.axisCount != (FT_UShort)blend->mmvar->num_axis )\n    {\n      error = FT_THROW( Invalid_Table );\n      goto Exit;\n    }\n\n    if ( FT_NEW_ARRAY( blend->glyphoffsets, blend->gv_glyphcnt + 1 ) )\n      goto Exit;\n\n    if ( gvar_head.flags & 1 )\n    {\n      /* long offsets (one more offset than glyphs, to mark size of last) */\n      if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 4L ) )\n        goto Exit;\n\n      for ( i = 0; i <= blend->gv_glyphcnt; ++i )\n        blend->glyphoffsets[i] = offsetToData + FT_GET_LONG();\n\n      FT_FRAME_EXIT();\n    }\n    else\n    {\n      /* short offsets (one more offset than glyphs, to mark size of last) */\n      if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 2L ) )\n        goto Exit;\n\n      for ( i = 0; i <= blend->gv_glyphcnt; ++i )\n        blend->glyphoffsets[i] = offsetToData + FT_GET_USHORT() * 2;\n                                              /* XXX: Undocumented: `*2'! */\n\n      FT_FRAME_EXIT();\n    }\n\n    if ( blend->tuplecount != 0 )\n    {\n      if ( FT_NEW_ARRAY( blend->tuplecoords,\n                         gvar_head.axisCount * blend->tuplecount ) )\n        goto Exit;\n\n      if ( FT_STREAM_SEEK( gvar_start + gvar_head.offsetToCoord )       ||\n           FT_FRAME_ENTER( blend->tuplecount * gvar_head.axisCount * 2L )                   )\n        goto Exit;\n\n      for ( i = 0; i < blend->tuplecount; ++i )\n        for ( j = 0 ; j < (FT_UInt)gvar_head.axisCount; ++j )\n          blend->tuplecoords[i * gvar_head.axisCount + j] =\n            FT_GET_SHORT() << 2;                /* convert to FT_Fixed */\n\n      FT_FRAME_EXIT();\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    ft_var_apply_tuple                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Figure out whether a given tuple (design) applies to the current   */\n  /*    blend, and if so, what is the scaling factor.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    blend           :: The current blend of the font.                  */\n  /*                                                                       */\n  /*    tupleIndex      :: A flag saying whether this is an intermediate   */\n  /*                       tuple or not.                                   */\n  /*                                                                       */\n  /*    tuple_coords    :: The coordinates of the tuple in normalized axis */\n  /*                       units.                                          */\n  /*                                                                       */\n  /*    im_start_coords :: The initial coordinates where this tuple starts */\n  /*                       to apply (for intermediate coordinates).        */\n  /*                                                                       */\n  /*    im_end_coords   :: The final coordinates after which this tuple no */\n  /*                       longer applies (for intermediate coordinates).  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    An FT_Fixed value containing the scaling factor.                   */\n  /*                                                                       */\n  static FT_Fixed\n  ft_var_apply_tuple( GX_Blend   blend,\n                      FT_UShort  tupleIndex,\n                      FT_Fixed*  tuple_coords,\n                      FT_Fixed*  im_start_coords,\n                      FT_Fixed*  im_end_coords )\n  {\n    FT_UInt   i;\n    FT_Fixed  apply = 0x10000L;\n\n\n    for ( i = 0; i < blend->num_axis; ++i )\n    {\n      if ( tuple_coords[i] == 0 )\n        /* It's not clear why (for intermediate tuples) we don't need     */\n        /* to check against start/end -- the documentation says we don't. */\n        /* Similarly, it's unclear why we don't need to scale along the   */\n        /* axis.                                                          */\n        continue;\n\n      else if ( blend->normalizedcoords[i] == 0                           ||\n                ( blend->normalizedcoords[i] < 0 && tuple_coords[i] > 0 ) ||\n                ( blend->normalizedcoords[i] > 0 && tuple_coords[i] < 0 ) )\n      {\n        apply = 0;\n        break;\n      }\n\n      else if ( !( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) )\n        /* not an intermediate tuple */\n        apply = FT_MulFix( apply,\n                           blend->normalizedcoords[i] > 0\n                             ? blend->normalizedcoords[i]\n                             : -blend->normalizedcoords[i] );\n\n      else if ( blend->normalizedcoords[i] <= im_start_coords[i] ||\n                blend->normalizedcoords[i] >= im_end_coords[i]   )\n      {\n        apply = 0;\n        break;\n      }\n\n      else if ( blend->normalizedcoords[i] < tuple_coords[i] )\n        apply = FT_MulDiv( apply,\n                           blend->normalizedcoords[i] - im_start_coords[i],\n                           tuple_coords[i] - im_start_coords[i] );\n\n      else\n        apply = FT_MulDiv( apply,\n                           im_end_coords[i] - blend->normalizedcoords[i],\n                           im_end_coords[i] - tuple_coords[i] );\n    }\n\n    return apply;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****               MULTIPLE MASTERS SERVICE FUNCTIONS              *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  typedef struct  GX_FVar_Head_\n  {\n    FT_Long    version;\n    FT_UShort  offsetToData;\n    FT_UShort  countSizePairs;\n    FT_UShort  axisCount;\n    FT_UShort  axisSize;\n    FT_UShort  instanceCount;\n    FT_UShort  instanceSize;\n\n  } GX_FVar_Head;\n\n\n  typedef struct  fvar_axis_\n  {\n    FT_ULong   axisTag;\n    FT_ULong   minValue;\n    FT_ULong   defaultValue;\n    FT_ULong   maxValue;\n    FT_UShort  flags;\n    FT_UShort  nameID;\n\n  } GX_FVar_Axis;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Get_MM_Var                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Check that the font's `fvar' table is valid, parse it, and return  */\n  /*    those data.                                                        */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face   :: The font face.                                           */\n  /*              TT_Get_MM_Var initializes the blend structure.           */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    master :: The `fvar' data (must be freed by caller).               */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  TT_Get_MM_Var( TT_Face      face,\n                 FT_MM_Var*  *master )\n  {\n    FT_Stream            stream = face->root.stream;\n    FT_Memory            memory = face->root.memory;\n    FT_ULong             table_len;\n    FT_Error             error  = FT_Err_Ok;\n    FT_ULong             fvar_start;\n    FT_Int               i, j;\n    FT_MM_Var*           mmvar = NULL;\n    FT_Fixed*            next_coords;\n    FT_String*           next_name;\n    FT_Var_Axis*         a;\n    FT_Var_Named_Style*  ns;\n    GX_FVar_Head         fvar_head;\n\n    static const FT_Frame_Field  fvar_fields[] =\n    {\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  GX_FVar_Head\n\n      FT_FRAME_START( 16 ),\n        FT_FRAME_LONG  ( version ),\n        FT_FRAME_USHORT( offsetToData ),\n        FT_FRAME_USHORT( countSizePairs ),\n        FT_FRAME_USHORT( axisCount ),\n        FT_FRAME_USHORT( axisSize ),\n        FT_FRAME_USHORT( instanceCount ),\n        FT_FRAME_USHORT( instanceSize ),\n      FT_FRAME_END\n    };\n\n    static const FT_Frame_Field  fvaraxis_fields[] =\n    {\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  GX_FVar_Axis\n\n      FT_FRAME_START( 20 ),\n        FT_FRAME_ULONG ( axisTag ),\n        FT_FRAME_ULONG ( minValue ),\n        FT_FRAME_ULONG ( defaultValue ),\n        FT_FRAME_ULONG ( maxValue ),\n        FT_FRAME_USHORT( flags ),\n        FT_FRAME_USHORT( nameID ),\n      FT_FRAME_END\n    };\n\n\n    if ( face->blend == NULL )\n    {\n      /* both `fvar' and `gvar' must be present */\n      if ( (error = face->goto_table( face, TTAG_gvar,\n                                      stream, &table_len )) != 0 )\n        goto Exit;\n\n      if ( (error = face->goto_table( face, TTAG_fvar,\n                                      stream, &table_len )) != 0 )\n        goto Exit;\n\n      fvar_start = FT_STREAM_POS( );\n\n      if ( FT_STREAM_READ_FIELDS( fvar_fields, &fvar_head ) )\n        goto Exit;\n\n      if ( fvar_head.version != (FT_Long)0x00010000L                      ||\n           fvar_head.countSizePairs != 2                                  ||\n           fvar_head.axisSize != 20                                       ||\n           /* axisCount limit implied by 16-bit instanceSize */\n           fvar_head.axisCount > 0x3FFE                                   ||\n           fvar_head.instanceSize != 4 + 4 * fvar_head.axisCount          ||\n           /* instanceCount limit implied by limited range of name IDs */\n           fvar_head.instanceCount > 0x7EFF                               ||\n           fvar_head.offsetToData + fvar_head.axisCount * 20U +\n             fvar_head.instanceCount * fvar_head.instanceSize > table_len )\n      {\n        error = FT_THROW( Invalid_Table );\n        goto Exit;\n      }\n\n      if ( FT_NEW( face->blend ) )\n        goto Exit;\n\n      /* cannot overflow 32-bit arithmetic because of limits above */\n      face->blend->mmvar_len =\n        sizeof ( FT_MM_Var ) +\n        fvar_head.axisCount * sizeof ( FT_Var_Axis ) +\n        fvar_head.instanceCount * sizeof ( FT_Var_Named_Style ) +\n        fvar_head.instanceCount * fvar_head.axisCount * sizeof ( FT_Fixed ) +\n        5 * fvar_head.axisCount;\n\n      if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) )\n        goto Exit;\n      face->blend->mmvar = mmvar;\n\n      mmvar->num_axis =\n        fvar_head.axisCount;\n      mmvar->num_designs =\n        ~0U;                   /* meaningless in this context; each glyph */\n                               /* may have a different number of designs  */\n                               /* (or tuples, as called by Apple)         */\n      mmvar->num_namedstyles =\n        fvar_head.instanceCount;\n      mmvar->axis =\n        (FT_Var_Axis*)&(mmvar[1]);\n      mmvar->namedstyle =\n        (FT_Var_Named_Style*)&(mmvar->axis[fvar_head.axisCount]);\n\n      next_coords =\n        (FT_Fixed*)&(mmvar->namedstyle[fvar_head.instanceCount]);\n      for ( i = 0; i < fvar_head.instanceCount; ++i )\n      {\n        mmvar->namedstyle[i].coords  = next_coords;\n        next_coords                 += fvar_head.axisCount;\n      }\n\n      next_name = (FT_String*)next_coords;\n      for ( i = 0; i < fvar_head.axisCount; ++i )\n      {\n        mmvar->axis[i].name  = next_name;\n        next_name           += 5;\n      }\n\n      if ( FT_STREAM_SEEK( fvar_start + fvar_head.offsetToData ) )\n        goto Exit;\n\n      a = mmvar->axis;\n      for ( i = 0; i < fvar_head.axisCount; ++i )\n      {\n        GX_FVar_Axis  axis_rec;\n\n\n        if ( FT_STREAM_READ_FIELDS( fvaraxis_fields, &axis_rec ) )\n          goto Exit;\n        a->tag     = axis_rec.axisTag;\n        a->minimum = axis_rec.minValue;     /* A Fixed */\n        a->def     = axis_rec.defaultValue; /* A Fixed */\n        a->maximum = axis_rec.maxValue;     /* A Fixed */\n        a->strid   = axis_rec.nameID;\n\n        a->name[0] = (FT_String)(   a->tag >> 24 );\n        a->name[1] = (FT_String)( ( a->tag >> 16 ) & 0xFF );\n        a->name[2] = (FT_String)( ( a->tag >>  8 ) & 0xFF );\n        a->name[3] = (FT_String)( ( a->tag       ) & 0xFF );\n        a->name[4] = 0;\n\n        ++a;\n      }\n\n      ns = mmvar->namedstyle;\n      for ( i = 0; i < fvar_head.instanceCount; ++i, ++ns )\n      {\n        if ( FT_FRAME_ENTER( 4L + 4L * fvar_head.axisCount ) )\n          goto Exit;\n\n        ns->strid       =    FT_GET_USHORT();\n        (void) /* flags = */ FT_GET_USHORT();\n\n        for ( j = 0; j < fvar_head.axisCount; ++j )\n          ns->coords[j] = FT_GET_ULONG();     /* A Fixed */\n\n        FT_FRAME_EXIT();\n      }\n    }\n\n    if ( master != NULL )\n    {\n      FT_UInt  n;\n\n\n      if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) )\n        goto Exit;\n      FT_MEM_COPY( mmvar, face->blend->mmvar, face->blend->mmvar_len );\n\n      mmvar->axis =\n        (FT_Var_Axis*)&(mmvar[1]);\n      mmvar->namedstyle =\n        (FT_Var_Named_Style*)&(mmvar->axis[mmvar->num_axis]);\n      next_coords =\n        (FT_Fixed*)&(mmvar->namedstyle[mmvar->num_namedstyles]);\n\n      for ( n = 0; n < mmvar->num_namedstyles; ++n )\n      {\n        mmvar->namedstyle[n].coords  = next_coords;\n        next_coords                 += mmvar->num_axis;\n      }\n\n      a = mmvar->axis;\n      next_name = (FT_String*)next_coords;\n      for ( n = 0; n < mmvar->num_axis; ++n )\n      {\n        a->name = next_name;\n\n        /* standard PostScript names for some standard apple tags */\n        if ( a->tag == TTAG_wght )\n          a->name = (char *)\"Weight\";\n        else if ( a->tag == TTAG_wdth )\n          a->name = (char *)\"Width\";\n        else if ( a->tag == TTAG_opsz )\n          a->name = (char *)\"OpticalSize\";\n        else if ( a->tag == TTAG_slnt )\n          a->name = (char *)\"Slant\";\n\n        next_name += 5;\n        ++a;\n      }\n\n      *master = mmvar;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Set_MM_Blend                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Set the blend (normalized) coordinates for this instance of the    */\n  /*    font.  Check that the `gvar' table is reasonable and does some     */\n  /*    initial preparation.                                               */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face       :: The font.                                            */\n  /*                  Initialize the blend structure with `gvar' data.     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    num_coords :: Must be the axis count of the font.                  */\n  /*                                                                       */\n  /*    coords     :: An array of num_coords, each between [-1,1].         */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  TT_Set_MM_Blend( TT_Face    face,\n                   FT_UInt    num_coords,\n                   FT_Fixed*  coords )\n  {\n    FT_Error    error = FT_Err_Ok;\n    GX_Blend    blend;\n    FT_MM_Var*  mmvar;\n    FT_UInt     i;\n    FT_Memory   memory = face->root.memory;\n\n    enum\n    {\n      mcvt_retain,\n      mcvt_modify,\n      mcvt_load\n\n    } manageCvt;\n\n\n    face->doblend = FALSE;\n\n    if ( face->blend == NULL )\n    {\n      if ( (error = TT_Get_MM_Var( face, NULL)) != 0 )\n        goto Exit;\n    }\n\n    blend = face->blend;\n    mmvar = blend->mmvar;\n\n    if ( num_coords != mmvar->num_axis )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    for ( i = 0; i < num_coords; ++i )\n      if ( coords[i] < -0x00010000L || coords[i] > 0x00010000L )\n      {\n        error = FT_THROW( Invalid_Argument );\n        goto Exit;\n      }\n\n    if ( blend->glyphoffsets == NULL )\n      if ( (error = ft_var_load_gvar( face )) != 0 )\n        goto Exit;\n\n    if ( blend->normalizedcoords == NULL )\n    {\n      if ( FT_NEW_ARRAY( blend->normalizedcoords, num_coords ) )\n        goto Exit;\n\n      manageCvt = mcvt_modify;\n\n      /* If we have not set the blend coordinates before this, then the  */\n      /* cvt table will still be what we read from the `cvt ' table and  */\n      /* we don't need to reload it.  We may need to change it though... */\n    }\n    else\n    {\n      manageCvt = mcvt_retain;\n      for ( i = 0; i < num_coords; ++i )\n      {\n        if ( blend->normalizedcoords[i] != coords[i] )\n        {\n          manageCvt = mcvt_load;\n          break;\n        }\n      }\n\n      /* If we don't change the blend coords then we don't need to do  */\n      /* anything to the cvt table.  It will be correct.  Otherwise we */\n      /* no longer have the original cvt (it was modified when we set  */\n      /* the blend last time), so we must reload and then modify it.   */\n    }\n\n    blend->num_axis = num_coords;\n    FT_MEM_COPY( blend->normalizedcoords,\n                 coords,\n                 num_coords * sizeof ( FT_Fixed ) );\n\n    face->doblend = TRUE;\n\n    if ( face->cvt != NULL )\n    {\n      switch ( manageCvt )\n      {\n      case mcvt_load:\n        /* The cvt table has been loaded already; every time we change the */\n        /* blend we may need to reload and remodify the cvt table.         */\n        FT_FREE( face->cvt );\n        face->cvt = NULL;\n\n        tt_face_load_cvt( face, face->root.stream );\n        break;\n\n      case mcvt_modify:\n        /* The original cvt table is in memory.  All we need to do is */\n        /* apply the `cvar' table (if any).                           */\n        tt_face_vary_cvt( face, face->root.stream );\n        break;\n\n      case mcvt_retain:\n        /* The cvt table is correct for this set of coordinates. */\n        break;\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Set_Var_Design                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Set the coordinates for the instance, measured in the user         */\n  /*    coordinate system.  Parse the `avar' table (if present) to convert */\n  /*    from user to normalized coordinates.                               */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face       :: The font face.                                       */\n  /*                  Initialize the blend struct with `gvar' data.        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    num_coords :: This must be the axis count of the font.             */\n  /*                                                                       */\n  /*    coords     :: A coordinate array with `num_coords' elements.       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  TT_Set_Var_Design( TT_Face    face,\n                     FT_UInt    num_coords,\n                     FT_Fixed*  coords )\n  {\n    FT_Error        error      = FT_Err_Ok;\n    FT_Fixed*       normalized = NULL;\n    GX_Blend        blend;\n    FT_MM_Var*      mmvar;\n    FT_UInt         i, j;\n    FT_Var_Axis*    a;\n    GX_AVarSegment  av;\n    FT_Memory       memory = face->root.memory;\n\n\n    if ( face->blend == NULL )\n    {\n      if ( (error = TT_Get_MM_Var( face, NULL )) != 0 )\n        goto Exit;\n    }\n\n    blend = face->blend;\n    mmvar = blend->mmvar;\n\n    if ( num_coords != mmvar->num_axis )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    /* Axis normalization is a two stage process.  First we normalize */\n    /* based on the [min,def,max] values for the axis to be [-1,0,1]. */\n    /* Then, if there's an `avar' table, we renormalize this range.   */\n\n    if ( FT_NEW_ARRAY( normalized, mmvar->num_axis ) )\n      goto Exit;\n\n    a = mmvar->axis;\n    for ( i = 0; i < mmvar->num_axis; ++i, ++a )\n    {\n      if ( coords[i] > a->maximum || coords[i] < a->minimum )\n      {\n        error = FT_THROW( Invalid_Argument );\n        goto Exit;\n      }\n\n      if ( coords[i] < a->def )\n        normalized[i] = -FT_DivFix( coords[i] - a->def, a->minimum - a->def );\n      else if ( a->maximum == a->def )\n        normalized[i] = 0;\n      else\n        normalized[i] = FT_DivFix( coords[i] - a->def, a->maximum - a->def );\n    }\n\n    if ( !blend->avar_checked )\n      ft_var_load_avar( face );\n\n    if ( blend->avar_segment != NULL )\n    {\n      av = blend->avar_segment;\n      for ( i = 0; i < mmvar->num_axis; ++i, ++av )\n      {\n        for ( j = 1; j < (FT_UInt)av->pairCount; ++j )\n          if ( normalized[i] < av->correspondence[j].fromCoord )\n          {\n            normalized[i] =\n              FT_MulDiv( normalized[i] - av->correspondence[j - 1].fromCoord,\n                         av->correspondence[j].toCoord -\n                           av->correspondence[j - 1].toCoord,\n                         av->correspondence[j].fromCoord -\n                           av->correspondence[j - 1].fromCoord ) +\n              av->correspondence[j - 1].toCoord;\n            break;\n          }\n      }\n    }\n\n    error = TT_Set_MM_Blend( face, num_coords, normalized );\n\n  Exit:\n    FT_FREE( normalized );\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                     GX VAR PARSING ROUTINES                   *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_vary_cvt                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Modify the loaded cvt table according to the `cvar' table and the  */\n  /*    font's blend.                                                      */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream :: A handle to the input stream.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /*    Most errors are ignored.  It is perfectly valid not to have a      */\n  /*    `cvar' table even if there is a `gvar' and `fvar' table.           */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_vary_cvt( TT_Face    face,\n                    FT_Stream  stream )\n  {\n    FT_Error    error;\n    FT_Memory   memory = stream->memory;\n    FT_ULong    table_start;\n    FT_ULong    table_len;\n    FT_UInt     tupleCount;\n    FT_ULong    offsetToData;\n    FT_ULong    here;\n    FT_UInt     i, j;\n    FT_Fixed*   tuple_coords    = NULL;\n    FT_Fixed*   im_start_coords = NULL;\n    FT_Fixed*   im_end_coords   = NULL;\n    GX_Blend    blend           = face->blend;\n    FT_UInt     point_count;\n    FT_UShort*  localpoints;\n    FT_Short*   deltas;\n\n\n    FT_TRACE2(( \"CVAR \" ));\n\n    if ( blend == NULL )\n    {\n      FT_TRACE2(( \"tt_face_vary_cvt: no blend specified\\n\" ));\n\n      error = FT_Err_Ok;\n      goto Exit;\n    }\n\n    if ( face->cvt == NULL )\n    {\n      FT_TRACE2(( \"tt_face_vary_cvt: no `cvt ' table\\n\" ));\n\n      error = FT_Err_Ok;\n      goto Exit;\n    }\n\n    error = face->goto_table( face, TTAG_cvar, stream, &table_len );\n    if ( error )\n    {\n      FT_TRACE2(( \"is missing\\n\" ));\n\n      error = FT_Err_Ok;\n      goto Exit;\n    }\n\n    if ( FT_FRAME_ENTER( table_len ) )\n    {\n      error = FT_Err_Ok;\n      goto Exit;\n    }\n\n    table_start = FT_Stream_FTell( stream );\n    if ( FT_GET_LONG() != 0x00010000L )\n    {\n      FT_TRACE2(( \"bad table version\\n\" ));\n\n      error = FT_Err_Ok;\n      goto FExit;\n    }\n\n    if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis )    ||\n         FT_NEW_ARRAY( im_start_coords, blend->num_axis ) ||\n         FT_NEW_ARRAY( im_end_coords, blend->num_axis )   )\n      goto FExit;\n\n    tupleCount   = FT_GET_USHORT();\n    offsetToData = table_start + FT_GET_USHORT();\n\n    /* The documentation implies there are flags packed into the        */\n    /* tuplecount, but John Jenkins says that shared points don't apply */\n    /* to `cvar', and no other flags are defined.                       */\n\n    for ( i = 0; i < ( tupleCount & 0xFFF ); ++i )\n    {\n      FT_UInt   tupleDataSize;\n      FT_UInt   tupleIndex;\n      FT_Fixed  apply;\n\n\n      tupleDataSize = FT_GET_USHORT();\n      tupleIndex    = FT_GET_USHORT();\n\n      /* There is no provision here for a global tuple coordinate section, */\n      /* so John says.  There are no tuple indices, just embedded tuples.  */\n\n      if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD )\n      {\n        for ( j = 0; j < blend->num_axis; ++j )\n          tuple_coords[j] = FT_GET_SHORT() << 2; /* convert from        */\n                                                 /* short frac to fixed */\n      }\n      else\n      {\n        /* skip this tuple; it makes no sense */\n\n        if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )\n          for ( j = 0; j < 2 * blend->num_axis; ++j )\n            (void)FT_GET_SHORT();\n\n        offsetToData += tupleDataSize;\n        continue;\n      }\n\n      if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )\n      {\n        for ( j = 0; j < blend->num_axis; ++j )\n          im_start_coords[j] = FT_GET_SHORT() << 2;\n        for ( j = 0; j < blend->num_axis; ++j )\n          im_end_coords[j] = FT_GET_SHORT() << 2;\n      }\n\n      apply = ft_var_apply_tuple( blend,\n                                  (FT_UShort)tupleIndex,\n                                  tuple_coords,\n                                  im_start_coords,\n                                  im_end_coords );\n      if ( /* tuple isn't active for our blend */\n           apply == 0                                    ||\n           /* global points not allowed,           */\n           /* if they aren't local, makes no sense */\n           !( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS ) )\n      {\n        offsetToData += tupleDataSize;\n        continue;\n      }\n\n      here = FT_Stream_FTell( stream );\n\n      FT_Stream_SeekSet( stream, offsetToData );\n\n      localpoints = ft_var_readpackedpoints( stream, &point_count );\n      deltas      = ft_var_readpackeddeltas( stream,\n                                             point_count == 0 ? face->cvt_size\n                                                              : point_count );\n      if ( localpoints == NULL || deltas == NULL )\n        /* failure, ignore it */;\n\n      else if ( localpoints == ALL_POINTS )\n      {\n        /* this means that there are deltas for every entry in cvt */\n        for ( j = 0; j < face->cvt_size; ++j )\n          face->cvt[j] = (FT_Short)( face->cvt[j] +\n                                     FT_MulFix( deltas[j], apply ) );\n      }\n\n      else\n      {\n        for ( j = 0; j < point_count; ++j )\n        {\n          int  pindex = localpoints[j];\n\n          face->cvt[pindex] = (FT_Short)( face->cvt[pindex] +\n                                          FT_MulFix( deltas[j], apply ) );\n        }\n      }\n\n      if ( localpoints != ALL_POINTS )\n        FT_FREE( localpoints );\n      FT_FREE( deltas );\n\n      offsetToData += tupleDataSize;\n\n      FT_Stream_SeekSet( stream, here );\n    }\n\n  FExit:\n    FT_FRAME_EXIT();\n\n  Exit:\n    FT_FREE( tuple_coords );\n    FT_FREE( im_start_coords );\n    FT_FREE( im_end_coords );\n\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Vary_Get_Glyph_Deltas                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load the appropriate deltas for the current glyph.                 */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face        :: A handle to the target face object.                 */\n  /*                                                                       */\n  /*    glyph_index :: The index of the glyph being modified.              */\n  /*                                                                       */\n  /*    n_points    :: The number of the points in the glyph, including    */\n  /*                   phantom points.                                     */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    deltas      :: The array of points to change.                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  TT_Vary_Get_Glyph_Deltas( TT_Face      face,\n                            FT_UInt      glyph_index,\n                            FT_Vector*  *deltas,\n                            FT_UInt      n_points )\n  {\n    FT_Stream   stream = face->root.stream;\n    FT_Memory   memory = stream->memory;\n    GX_Blend    blend  = face->blend;\n    FT_Vector*  delta_xy = NULL;\n\n    FT_Error    error;\n    FT_ULong    glyph_start;\n    FT_UInt     tupleCount;\n    FT_ULong    offsetToData;\n    FT_ULong    here;\n    FT_UInt     i, j;\n    FT_Fixed*   tuple_coords    = NULL;\n    FT_Fixed*   im_start_coords = NULL;\n    FT_Fixed*   im_end_coords   = NULL;\n    FT_UInt     point_count, spoint_count = 0;\n    FT_UShort*  sharedpoints = NULL;\n    FT_UShort*  localpoints  = NULL;\n    FT_UShort*  points;\n    FT_Short    *deltas_x, *deltas_y;\n\n\n    if ( !face->doblend || blend == NULL )\n      return FT_THROW( Invalid_Argument );\n\n    /* to be freed by the caller */\n    if ( FT_NEW_ARRAY( delta_xy, n_points ) )\n      goto Exit;\n    *deltas = delta_xy;\n\n    if ( glyph_index >= blend->gv_glyphcnt      ||\n         blend->glyphoffsets[glyph_index] ==\n           blend->glyphoffsets[glyph_index + 1] )\n      return FT_Err_Ok;               /* no variation data for this glyph */\n\n    if ( FT_STREAM_SEEK( blend->glyphoffsets[glyph_index] )   ||\n         FT_FRAME_ENTER( blend->glyphoffsets[glyph_index + 1] -\n                           blend->glyphoffsets[glyph_index] ) )\n      goto Fail1;\n\n    glyph_start = FT_Stream_FTell( stream );\n\n    /* each set of glyph variation data is formatted similarly to `cvar' */\n    /* (except we get shared points and global tuples)                   */\n\n    if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis )    ||\n         FT_NEW_ARRAY( im_start_coords, blend->num_axis ) ||\n         FT_NEW_ARRAY( im_end_coords, blend->num_axis )   )\n      goto Fail2;\n\n    tupleCount   = FT_GET_USHORT();\n    offsetToData = glyph_start + FT_GET_USHORT();\n\n    if ( tupleCount & GX_TC_TUPLES_SHARE_POINT_NUMBERS )\n    {\n      here = FT_Stream_FTell( stream );\n\n      FT_Stream_SeekSet( stream, offsetToData );\n\n      sharedpoints = ft_var_readpackedpoints( stream, &spoint_count );\n      offsetToData = FT_Stream_FTell( stream );\n\n      FT_Stream_SeekSet( stream, here );\n    }\n\n    for ( i = 0; i < ( tupleCount & GX_TC_TUPLE_COUNT_MASK ); ++i )\n    {\n      FT_UInt   tupleDataSize;\n      FT_UInt   tupleIndex;\n      FT_Fixed  apply;\n\n\n      tupleDataSize = FT_GET_USHORT();\n      tupleIndex    = FT_GET_USHORT();\n\n      if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD )\n      {\n        for ( j = 0; j < blend->num_axis; ++j )\n          tuple_coords[j] = FT_GET_SHORT() << 2;  /* convert from        */\n                                                  /* short frac to fixed */\n      }\n      else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) >= blend->tuplecount )\n      {\n        error = FT_THROW( Invalid_Table );\n        goto Fail3;\n      }\n      else\n      {\n        FT_MEM_COPY(\n          tuple_coords,\n          &blend->tuplecoords[(tupleIndex & 0xFFF) * blend->num_axis],\n          blend->num_axis * sizeof ( FT_Fixed ) );\n      }\n\n      if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )\n      {\n        for ( j = 0; j < blend->num_axis; ++j )\n          im_start_coords[j] = FT_GET_SHORT() << 2;\n        for ( j = 0; j < blend->num_axis; ++j )\n          im_end_coords[j] = FT_GET_SHORT() << 2;\n      }\n\n      apply = ft_var_apply_tuple( blend,\n                                  (FT_UShort)tupleIndex,\n                                  tuple_coords,\n                                  im_start_coords,\n                                  im_end_coords );\n\n      if ( apply == 0 )              /* tuple isn't active for our blend */\n      {\n        offsetToData += tupleDataSize;\n        continue;\n      }\n\n      here = FT_Stream_FTell( stream );\n\n      if ( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS )\n      {\n        FT_Stream_SeekSet( stream, offsetToData );\n\n        localpoints = ft_var_readpackedpoints( stream, &point_count );\n        points      = localpoints;\n      }\n      else\n      {\n        points      = sharedpoints;\n        point_count = spoint_count;\n      }\n\n      deltas_x = ft_var_readpackeddeltas( stream,\n                                          point_count == 0 ? n_points\n                                                           : point_count );\n      deltas_y = ft_var_readpackeddeltas( stream,\n                                          point_count == 0 ? n_points\n                                                           : point_count );\n\n      if ( points == NULL || deltas_y == NULL || deltas_x == NULL )\n        ; /* failure, ignore it */\n\n      else if ( points == ALL_POINTS )\n      {\n        /* this means that there are deltas for every point in the glyph */\n        for ( j = 0; j < n_points; ++j )\n        {\n          delta_xy[j].x += FT_MulFix( deltas_x[j], apply );\n          delta_xy[j].y += FT_MulFix( deltas_y[j], apply );\n        }\n      }\n\n      else\n      {\n        for ( j = 0; j < point_count; ++j )\n        {\n          if ( localpoints[j] >= n_points )\n            continue;\n\n          delta_xy[localpoints[j]].x += FT_MulFix( deltas_x[j], apply );\n          delta_xy[localpoints[j]].y += FT_MulFix( deltas_y[j], apply );\n        }\n      }\n\n      if ( localpoints != ALL_POINTS )\n        FT_FREE( localpoints );\n      FT_FREE( deltas_x );\n      FT_FREE( deltas_y );\n\n      offsetToData += tupleDataSize;\n\n      FT_Stream_SeekSet( stream, here );\n    }\n\n  Fail3:\n    FT_FREE( tuple_coords );\n    FT_FREE( im_start_coords );\n    FT_FREE( im_end_coords );\n\n  Fail2:\n    FT_FRAME_EXIT();\n\n  Fail1:\n    if ( error )\n    {\n      FT_FREE( delta_xy );\n      *deltas = NULL;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_done_blend                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Frees the blend internal data structure.                           */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  tt_done_blend( FT_Memory  memory,\n                 GX_Blend   blend )\n  {\n    if ( blend != NULL )\n    {\n      FT_UInt  i;\n\n\n      FT_FREE( blend->normalizedcoords );\n      FT_FREE( blend->mmvar );\n\n      if ( blend->avar_segment != NULL )\n      {\n        for ( i = 0; i < blend->num_axis; ++i )\n          FT_FREE( blend->avar_segment[i].correspondence );\n        FT_FREE( blend->avar_segment );\n      }\n\n      FT_FREE( blend->tuplecoords );\n      FT_FREE( blend->glyphoffsets );\n      FT_FREE( blend );\n    }\n  }\n\n#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgxvar.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttgxvar.h                                                              */\n/*                                                                         */\n/*    TrueType GX Font Variation loader (specification)                    */\n/*                                                                         */\n/*  Copyright 2004 by                                                      */\n/*  David Turner, Robert Wilhelm, Werner Lemberg and George Williams.      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTGXVAR_H__\n#define __TTGXVAR_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"ttobjs.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    GX_AVarCorrespondenceRec                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A data structure representing `shortFracCorrespondence' in `avar'  */\n  /*    table according to the specifications from Apple.                  */\n  /*                                                                       */\n  typedef struct  GX_AVarCorrespondenceRec_\n  {\n    FT_Fixed  fromCoord;\n    FT_Fixed  toCoord;\n\n  } GX_AVarCorrespondenceRec_, *GX_AVarCorrespondence;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    GX_AVarRec                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Data from the segment field of `avar' table.                       */\n  /*    There is one of these for each axis.                               */\n  /*                                                                       */\n  typedef struct  GX_AVarSegmentRec_\n  {\n    FT_UShort              pairCount;\n    GX_AVarCorrespondence  correspondence; /* array with pairCount entries */\n\n  } GX_AVarSegmentRec, *GX_AVarSegment;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    GX_BlendRec                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Data for interpolating a font from a distortable font specified    */\n  /*    by the GX *var tables ([fgca]var).                                 */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    num_axis         :: The number of axes along which interpolation   */\n  /*                         may happen                                    */\n  /*                                                                       */\n  /*    normalizedcoords :: A normalized value (between [-1,1]) indicating */\n  /*                        the contribution along each axis to the final  */\n  /*                        interpolated font.                             */\n  /*                                                                       */\n  typedef struct  GX_BlendRec_\n  {\n    FT_UInt         num_axis;\n    FT_Fixed*       normalizedcoords;\n\n    FT_MM_Var*      mmvar;\n    FT_Offset       mmvar_len;\n\n    FT_Bool         avar_checked;\n    GX_AVarSegment  avar_segment;\n\n    FT_UInt         tuplecount;      /* shared tuples in `gvar'           */\n    FT_Fixed*       tuplecoords;     /* tuplecoords[tuplecount][num_axis] */\n\n    FT_UInt         gv_glyphcnt;\n    FT_ULong*       glyphoffsets;\n\n  } GX_BlendRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <enum>                                                                */\n  /*    GX_TupleCountFlags                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Flags used within the `TupleCount' field of the `gvar' table.      */\n  /*                                                                       */\n  typedef enum  GX_TupleCountFlags_\n  {\n    GX_TC_TUPLES_SHARE_POINT_NUMBERS = 0x8000,\n    GX_TC_RESERVED_TUPLE_FLAGS       = 0x7000,\n    GX_TC_TUPLE_COUNT_MASK           = 0x0FFF\n\n  } GX_TupleCountFlags;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <enum>                                                                */\n  /*    GX_TupleIndexFlags                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Flags used within the `TupleIndex' field of the `gvar' and `cvar'  */\n  /*    tables.                                                            */\n  /*                                                                       */\n  typedef enum  GX_TupleIndexFlags_\n  {\n    GX_TI_EMBEDDED_TUPLE_COORD  = 0x8000,\n    GX_TI_INTERMEDIATE_TUPLE    = 0x4000,\n    GX_TI_PRIVATE_POINT_NUMBERS = 0x2000,\n    GX_TI_RESERVED_TUPLE_FLAG   = 0x1000,\n    GX_TI_TUPLE_INDEX_MASK      = 0x0FFF\n\n  } GX_TupleIndexFlags;\n\n\n#define TTAG_wght  FT_MAKE_TAG( 'w', 'g', 'h', 't' )\n#define TTAG_wdth  FT_MAKE_TAG( 'w', 'd', 't', 'h' )\n#define TTAG_opsz  FT_MAKE_TAG( 'o', 'p', 's', 'z' )\n#define TTAG_slnt  FT_MAKE_TAG( 's', 'l', 'n', 't' )\n\n\n  FT_LOCAL( FT_Error )\n  TT_Set_MM_Blend( TT_Face    face,\n                   FT_UInt    num_coords,\n                   FT_Fixed*  coords );\n\n  FT_LOCAL( FT_Error )\n  TT_Set_Var_Design( TT_Face    face,\n                     FT_UInt    num_coords,\n                     FT_Fixed*  coords );\n\n  FT_LOCAL( FT_Error )\n  TT_Get_MM_Var( TT_Face      face,\n                 FT_MM_Var*  *master );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_vary_cvt( TT_Face    face,\n                    FT_Stream  stream );\n\n\n  FT_LOCAL( FT_Error )\n  TT_Vary_Get_Glyph_Deltas( TT_Face      face,\n                            FT_UInt      glyph_index,\n                            FT_Vector*  *deltas,\n                            FT_UInt      n_points );\n\n\n  FT_LOCAL( void )\n  tt_done_blend( FT_Memory  memory,\n                 GX_Blend   blend );\n\n\nFT_END_HEADER\n\n\n#endif /* __TTGXVAR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttinterp.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttinterp.c                                                             */\n/*                                                                         */\n/*    TrueType bytecode interpreter (body).                                */\n/*                                                                         */\n/*  Copyright 1996-2013                                                    */\n/*  by David Turner, Robert Wilhelm, and Werner Lemberg.                   */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n/* Greg Hitchcock from Microsoft has helped a lot in resolving unclear */\n/* issues; many thanks!                                                */\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftcalc.h\"\n#include \"../../include/freetype/fttrigon.h\"\n#include \"../../include/freetype/ftsystem.h\"\n#include \"../../include/freetype/ftttdrv.h\"\n\n#include \"ttinterp.h\"\n#include \"tterrors.h\"\n#include \"ttsubpix.h\"\n\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttinterp\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* In order to detect infinite loops in the code, we set up a counter    */\n  /* within the run loop.  A single stroke of interpretation is now        */\n  /* limited to a maximum number of opcodes defined below.                 */\n  /*                                                                       */\n#define MAX_RUNNABLE_OPCODES  1000000L\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* There are two kinds of implementations:                               */\n  /*                                                                       */\n  /* a. static implementation                                              */\n  /*                                                                       */\n  /*    The current execution context is a static variable, which fields   */\n  /*    are accessed directly by the interpreter during execution.  The    */\n  /*    context is named `cur'.                                            */\n  /*                                                                       */\n  /*    This version is non-reentrant, of course.                          */\n  /*                                                                       */\n  /* b. indirect implementation                                            */\n  /*                                                                       */\n  /*    The current execution context is passed to _each_ function as its  */\n  /*    first argument, and each field is thus accessed indirectly.        */\n  /*                                                                       */\n  /*    This version is fully re-entrant.                                  */\n  /*                                                                       */\n  /* The idea is that an indirect implementation may be slower to execute  */\n  /* on low-end processors that are used in some systems (like 386s or     */\n  /* even 486s).                                                           */\n  /*                                                                       */\n  /* As a consequence, the indirect implementation is now the default, as  */\n  /* its performance costs can be considered negligible in our context.    */\n  /* Note, however, that we kept the same source with macros because:      */\n  /*                                                                       */\n  /* - The code is kept very close in design to the Pascal code used for   */\n  /*   development.                                                        */\n  /*                                                                       */\n  /* - It's much more readable that way!                                   */\n  /*                                                                       */\n  /* - It's still open to experimentation and tuning.                      */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef TT_CONFIG_OPTION_STATIC_INTERPRETER     /* indirect implementation */\n\n#define CUR  (*exc)                             /* see ttobjs.h */\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This macro is used whenever `exec' is unused in a function, to avoid  */\n  /* stupid warnings from pedantic compilers.                              */\n  /*                                                                       */\n#define FT_UNUSED_EXEC  FT_UNUSED( exc )\n\n#else                                           /* static implementation */\n\n#define CUR  cur\n\n#define FT_UNUSED_EXEC  int  __dummy = __dummy\n\n  static\n  TT_ExecContextRec  cur;   /* static exec. context variable */\n\n  /* apparently, we have a _lot_ of direct indexing when accessing  */\n  /* the static `cur', which makes the code bigger (due to all the  */\n  /* four bytes addresses).                                         */\n\n#endif /* TT_CONFIG_OPTION_STATIC_INTERPRETER */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The instruction argument stack.                                       */\n  /*                                                                       */\n#define INS_ARG  EXEC_OP_ FT_Long*  args    /* see ttobjs.h for EXEC_OP_ */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This macro is used whenever `args' is unused in a function, to avoid  */\n  /* stupid warnings from pedantic compilers.                              */\n  /*                                                                       */\n#define FT_UNUSED_ARG  FT_UNUSED_EXEC; FT_UNUSED( args )\n\n\n#define SUBPIXEL_HINTING                                                    \\\n          ( ((TT_Driver)FT_FACE_DRIVER( CUR.face ))->interpreter_version == \\\n            TT_INTERPRETER_VERSION_38 )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The following macros hide the use of EXEC_ARG and EXEC_ARG_ to        */\n  /* increase readability of the code.                                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#define SKIP_Code() \\\n          SkipCode( EXEC_ARG )\n\n#define GET_ShortIns() \\\n          GetShortIns( EXEC_ARG )\n\n#define NORMalize( x, y, v ) \\\n          Normalize( EXEC_ARG_ x, y, v )\n\n#define SET_SuperRound( scale, flags ) \\\n          SetSuperRound( EXEC_ARG_ scale, flags )\n\n#define ROUND_None( d, c ) \\\n          Round_None( EXEC_ARG_ d, c )\n\n#define INS_Goto_CodeRange( range, ip ) \\\n          Ins_Goto_CodeRange( EXEC_ARG_ range, ip )\n\n#define CUR_Func_move( z, p, d ) \\\n          CUR.func_move( EXEC_ARG_ z, p, d )\n\n#define CUR_Func_move_orig( z, p, d ) \\\n          CUR.func_move_orig( EXEC_ARG_ z, p, d )\n\n#define CUR_Func_round( d, c ) \\\n          CUR.func_round( EXEC_ARG_ d, c )\n\n#define CUR_Func_read_cvt( index ) \\\n          CUR.func_read_cvt( EXEC_ARG_ index )\n\n#define CUR_Func_write_cvt( index, val ) \\\n          CUR.func_write_cvt( EXEC_ARG_ index, val )\n\n#define CUR_Func_move_cvt( index, val ) \\\n          CUR.func_move_cvt( EXEC_ARG_ index, val )\n\n#define CURRENT_Ratio() \\\n          Current_Ratio( EXEC_ARG )\n\n#define CURRENT_Ppem() \\\n          Current_Ppem( EXEC_ARG )\n\n#define CUR_Ppem() \\\n          Cur_PPEM( EXEC_ARG )\n\n#define INS_SxVTL( a, b, c, d ) \\\n          Ins_SxVTL( EXEC_ARG_ a, b, c, d )\n\n#define COMPUTE_Funcs() \\\n          Compute_Funcs( EXEC_ARG )\n\n#define COMPUTE_Round( a ) \\\n          Compute_Round( EXEC_ARG_ a )\n\n#define COMPUTE_Point_Displacement( a, b, c, d ) \\\n          Compute_Point_Displacement( EXEC_ARG_ a, b, c, d )\n\n#define MOVE_Zp2_Point( a, b, c, t ) \\\n          Move_Zp2_Point( EXEC_ARG_ a, b, c, t )\n\n\n#define CUR_Func_project( v1, v2 )  \\\n          CUR.func_project( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y )\n\n#define CUR_Func_dualproj( v1, v2 )  \\\n          CUR.func_dualproj( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y )\n\n#define CUR_fast_project( v ) \\\n          CUR.func_project( EXEC_ARG_ (v)->x, (v)->y )\n\n#define CUR_fast_dualproj( v ) \\\n          CUR.func_dualproj( EXEC_ARG_ (v)->x, (v)->y )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Instruction dispatch function, as used by the interpreter.            */\n  /*                                                                       */\n  typedef void  (*TInstruction_Function)( INS_ARG );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Two simple bounds-checking macros.                                    */\n  /*                                                                       */\n#define BOUNDS( x, n )   ( (FT_UInt)(x)  >= (FT_UInt)(n)  )\n#define BOUNDSL( x, n )  ( (FT_ULong)(x) >= (FT_ULong)(n) )\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This macro computes (a*2^14)/b and complements TT_MulFix14.           */\n  /*                                                                       */\n#define TT_DivFix14( a, b ) \\\n          FT_DivFix( a, (b) << 2 )\n\n\n#undef  SUCCESS\n#define SUCCESS  0\n\n#undef  FAILURE\n#define FAILURE  1\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n#define GUESS_VECTOR( V )                                         \\\n  if ( CUR.face->unpatented_hinting )                             \\\n  {                                                               \\\n    CUR.GS.V.x = (FT_F2Dot14)( CUR.GS.both_x_axis ? 0x4000 : 0 ); \\\n    CUR.GS.V.y = (FT_F2Dot14)( CUR.GS.both_x_axis ? 0 : 0x4000 ); \\\n  }\n#else\n#define GUESS_VECTOR( V )\n#endif\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                        CODERANGE FUNCTIONS                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Goto_CodeRange                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Switches to a new code range (updates the code related elements in */\n  /*    `exec', and `IP').                                                 */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    range :: The new execution code range.                             */\n  /*                                                                       */\n  /*    IP    :: The new IP in the new code range.                         */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    exec  :: The target execution context.                             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  TT_Goto_CodeRange( TT_ExecContext  exec,\n                     FT_Int          range,\n                     FT_Long         IP )\n  {\n    TT_CodeRange*  coderange;\n\n\n    FT_ASSERT( range >= 1 && range <= 3 );\n\n    coderange = &exec->codeRangeTable[range - 1];\n\n    FT_ASSERT( coderange->base != NULL );\n\n    /* NOTE: Because the last instruction of a program may be a CALL */\n    /*       which will return to the first byte *after* the code    */\n    /*       range, we test for IP <= Size instead of IP < Size.     */\n    /*                                                               */\n    FT_ASSERT( (FT_ULong)IP <= coderange->size );\n\n    exec->code     = coderange->base;\n    exec->codeSize = coderange->size;\n    exec->IP       = IP;\n    exec->curRange = range;\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Set_CodeRange                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Sets a code range.                                                 */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    range  :: The code range index.                                    */\n  /*                                                                       */\n  /*    base   :: The new code base.                                       */\n  /*                                                                       */\n  /*    length :: The range size in bytes.                                 */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    exec   :: The target execution context.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  TT_Set_CodeRange( TT_ExecContext  exec,\n                    FT_Int          range,\n                    void*           base,\n                    FT_Long         length )\n  {\n    FT_ASSERT( range >= 1 && range <= 3 );\n\n    exec->codeRangeTable[range - 1].base = (FT_Byte*)base;\n    exec->codeRangeTable[range - 1].size = length;\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Clear_CodeRange                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Clears a code range.                                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    range :: The code range index.                                     */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    exec  :: The target execution context.                             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Does not set the Error variable.                                   */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  TT_Clear_CodeRange( TT_ExecContext  exec,\n                      FT_Int          range )\n  {\n    FT_ASSERT( range >= 1 && range <= 3 );\n\n    exec->codeRangeTable[range - 1].base = NULL;\n    exec->codeRangeTable[range - 1].size = 0;\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                   EXECUTION CONTEXT ROUTINES                          */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Done_Context                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Destroys a given context.                                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    exec   :: A handle to the target execution context.                */\n  /*                                                                       */\n  /*    memory :: A handle to the parent memory object.                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Only the glyph loader and debugger should call this function.      */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  TT_Done_Context( TT_ExecContext  exec )\n  {\n    FT_Memory  memory = exec->memory;\n\n\n    /* points zone */\n    exec->maxPoints   = 0;\n    exec->maxContours = 0;\n\n    /* free stack */\n    FT_FREE( exec->stack );\n    exec->stackSize = 0;\n\n    /* free call stack */\n    FT_FREE( exec->callStack );\n    exec->callSize = 0;\n    exec->callTop  = 0;\n\n    /* free glyph code range */\n    FT_FREE( exec->glyphIns );\n    exec->glyphSize = 0;\n\n    exec->size = NULL;\n    exec->face = NULL;\n\n    FT_FREE( exec );\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Init_Context                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initializes a context object.                                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory :: A handle to the parent memory object.                    */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    exec   :: A handle to the target execution context.                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  static FT_Error\n  Init_Context( TT_ExecContext  exec,\n                FT_Memory       memory )\n  {\n    FT_Error  error;\n\n\n    FT_TRACE1(( \"Init_Context: new object at 0x%08p\\n\", exec ));\n\n    exec->memory   = memory;\n    exec->callSize = 32;\n\n    if ( FT_NEW_ARRAY( exec->callStack, exec->callSize ) )\n      goto Fail_Memory;\n\n    /* all values in the context are set to 0 already, but this is */\n    /* here as a remainder                                         */\n    exec->maxPoints   = 0;\n    exec->maxContours = 0;\n\n    exec->stackSize = 0;\n    exec->glyphSize = 0;\n\n    exec->stack     = NULL;\n    exec->glyphIns  = NULL;\n\n    exec->face = NULL;\n    exec->size = NULL;\n\n    return FT_Err_Ok;\n\n  Fail_Memory:\n    FT_ERROR(( \"Init_Context: not enough memory for %p\\n\", exec ));\n    TT_Done_Context( exec );\n\n    return error;\n }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Update_Max                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Checks the size of a buffer and reallocates it if necessary.       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory     :: A handle to the parent memory object.                */\n  /*                                                                       */\n  /*    multiplier :: The size in bytes of each element in the buffer.     */\n  /*                                                                       */\n  /*    new_max    :: The new capacity (size) of the buffer.               */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    size       :: The address of the buffer's current size expressed   */\n  /*                  in elements.                                         */\n  /*                                                                       */\n  /*    buff       :: The address of the buffer base pointer.              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  Update_Max( FT_Memory  memory,\n              FT_ULong*  size,\n              FT_Long    multiplier,\n              void*      _pbuff,\n              FT_ULong   new_max )\n  {\n    FT_Error  error;\n    void**    pbuff = (void**)_pbuff;\n\n\n    if ( *size < new_max )\n    {\n      if ( FT_REALLOC( *pbuff, *size * multiplier, new_max * multiplier ) )\n        return error;\n      *size = new_max;\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Load_Context                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Prepare an execution context for glyph hinting.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to the source face object.                        */\n  /*                                                                       */\n  /*    size :: A handle to the source size object.                        */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    exec :: A handle to the target execution context.                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Only the glyph loader and debugger should call this function.      */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  TT_Load_Context( TT_ExecContext  exec,\n                   TT_Face         face,\n                   TT_Size         size )\n  {\n    FT_Int          i;\n    FT_ULong        tmp;\n    TT_MaxProfile*  maxp;\n    FT_Error        error;\n\n\n    exec->face = face;\n    maxp       = &face->max_profile;\n    exec->size = size;\n\n    if ( size )\n    {\n      exec->numFDefs   = size->num_function_defs;\n      exec->maxFDefs   = size->max_function_defs;\n      exec->numIDefs   = size->num_instruction_defs;\n      exec->maxIDefs   = size->max_instruction_defs;\n      exec->FDefs      = size->function_defs;\n      exec->IDefs      = size->instruction_defs;\n      exec->tt_metrics = size->ttmetrics;\n      exec->metrics    = size->metrics;\n\n      exec->maxFunc    = size->max_func;\n      exec->maxIns     = size->max_ins;\n\n      for ( i = 0; i < TT_MAX_CODE_RANGES; i++ )\n        exec->codeRangeTable[i] = size->codeRangeTable[i];\n\n      /* set graphics state */\n      exec->GS = size->GS;\n\n      exec->cvtSize = size->cvt_size;\n      exec->cvt     = size->cvt;\n\n      exec->storeSize = size->storage_size;\n      exec->storage   = size->storage;\n\n      exec->twilight  = size->twilight;\n\n      /* In case of multi-threading it can happen that the old size object */\n      /* no longer exists, thus we must clear all glyph zone references.   */\n      ft_memset( &exec->zp0, 0, sizeof ( exec->zp0 ) );\n      exec->zp1 = exec->zp0;\n      exec->zp2 = exec->zp0;\n    }\n\n    /* XXX: We reserve a little more elements on the stack to deal safely */\n    /*      with broken fonts like arialbs, courbs, timesbs, etc.         */\n    tmp = exec->stackSize;\n    error = Update_Max( exec->memory,\n                        &tmp,\n                        sizeof ( FT_F26Dot6 ),\n                        (void*)&exec->stack,\n                        maxp->maxStackElements + 32 );\n    exec->stackSize = (FT_UInt)tmp;\n    if ( error )\n      return error;\n\n    tmp = exec->glyphSize;\n    error = Update_Max( exec->memory,\n                        &tmp,\n                        sizeof ( FT_Byte ),\n                        (void*)&exec->glyphIns,\n                        maxp->maxSizeOfInstructions );\n    exec->glyphSize = (FT_UShort)tmp;\n    if ( error )\n      return error;\n\n    exec->pts.n_points   = 0;\n    exec->pts.n_contours = 0;\n\n    exec->zp1 = exec->pts;\n    exec->zp2 = exec->pts;\n    exec->zp0 = exec->pts;\n\n    exec->instruction_trap = FALSE;\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Save_Context                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Saves the code ranges in a `size' object.                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    exec :: A handle to the source execution context.                  */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    size :: A handle to the target size object.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Only the glyph loader and debugger should call this function.      */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  TT_Save_Context( TT_ExecContext  exec,\n                   TT_Size         size )\n  {\n    FT_Int  i;\n\n\n    /* XXX: Will probably disappear soon with all the code range */\n    /*      management, which is now rather obsolete.            */\n    /*                                                           */\n    size->num_function_defs    = exec->numFDefs;\n    size->num_instruction_defs = exec->numIDefs;\n\n    size->max_func = exec->maxFunc;\n    size->max_ins  = exec->maxIns;\n\n    for ( i = 0; i < TT_MAX_CODE_RANGES; i++ )\n      size->codeRangeTable[i] = exec->codeRangeTable[i];\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Run_Context                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Executes one or more instructions in the execution context.        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    debug :: A Boolean flag.  If set, the function sets some internal  */\n  /*             variables and returns immediately, otherwise TT_RunIns()  */\n  /*             is called.                                                */\n  /*                                                                       */\n  /*             This is commented out currently.                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    exec  :: A handle to the target execution context.                 */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    TrueType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Only the glyph loader and debugger should call this function.      */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  TT_Run_Context( TT_ExecContext  exec,\n                  FT_Bool         debug )\n  {\n    FT_Error  error;\n\n\n    if ( ( error = TT_Goto_CodeRange( exec, tt_coderange_glyph, 0 ) )\n           != FT_Err_Ok )\n      return error;\n\n    exec->zp0 = exec->pts;\n    exec->zp1 = exec->pts;\n    exec->zp2 = exec->pts;\n\n    exec->GS.gep0 = 1;\n    exec->GS.gep1 = 1;\n    exec->GS.gep2 = 1;\n\n    exec->GS.projVector.x = 0x4000;\n    exec->GS.projVector.y = 0x0000;\n\n    exec->GS.freeVector = exec->GS.projVector;\n    exec->GS.dualVector = exec->GS.projVector;\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    exec->GS.both_x_axis = TRUE;\n#endif\n\n    exec->GS.round_state = 1;\n    exec->GS.loop        = 1;\n\n    /* some glyphs leave something on the stack. so we clean it */\n    /* before a new execution.                                  */\n    exec->top     = 0;\n    exec->callTop = 0;\n\n#if 1\n    FT_UNUSED( debug );\n\n    return exec->face->interpreter( exec );\n#else\n    if ( !debug )\n      return TT_RunIns( exec );\n    else\n      return FT_Err_Ok;\n#endif\n  }\n\n\n  /* The default value for `scan_control' is documented as FALSE in the */\n  /* TrueType specification.  This is confusing since it implies a      */\n  /* Boolean value.  However, this is not the case, thus both the       */\n  /* default values of our `scan_type' and `scan_control' fields (which */\n  /* the documentation's `scan_control' variable is split into) are     */\n  /* zero.                                                              */\n\n  const TT_GraphicsState  tt_default_graphics_state =\n  {\n    0, 0, 0,\n    { 0x4000, 0 },\n    { 0x4000, 0 },\n    { 0x4000, 0 },\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    TRUE,\n#endif\n\n    1, 64, 1,\n    TRUE, 68, 0, 0, 9, 3,\n    0, FALSE, 0, 1, 1, 1\n  };\n\n\n  /* documentation is in ttinterp.h */\n\n  FT_EXPORT_DEF( TT_ExecContext )\n  TT_New_Context( TT_Driver  driver )\n  {\n    TT_ExecContext  exec;\n    FT_Memory       memory;\n\n\n    memory = driver->root.root.memory;\n    exec   = driver->context;\n\n    if ( !driver->context )\n    {\n      FT_Error  error;\n\n\n      /* allocate object */\n      if ( FT_NEW( exec ) )\n        goto Fail;\n\n      /* initialize it; in case of error this deallocates `exec' too */\n      error = Init_Context( exec, memory );\n      if ( error )\n        goto Fail;\n\n      /* store it into the driver */\n      driver->context = exec;\n    }\n\n    return driver->context;\n\n  Fail:\n    return NULL;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Before an opcode is executed, the interpreter verifies that there are */\n  /* enough arguments on the stack, with the help of the `Pop_Push_Count'  */\n  /* table.                                                                */\n  /*                                                                       */\n  /* For each opcode, the first column gives the number of arguments that  */\n  /* are popped from the stack; the second one gives the number of those   */\n  /* that are pushed in result.                                            */\n  /*                                                                       */\n  /* Opcodes which have a varying number of parameters in the data stream  */\n  /* (NPUSHB, NPUSHW) are handled specially; they have a negative value in */\n  /* the `opcode_length' table, and the value in `Pop_Push_Count' is set   */\n  /* to zero.                                                              */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#undef  PACK\n#define PACK( x, y )  ( ( x << 4 ) | y )\n\n\n  static\n  const FT_Byte  Pop_Push_Count[256] =\n  {\n    /* opcodes are gathered in groups of 16 */\n    /* please keep the spaces as they are   */\n\n    /*  SVTCA  y  */  PACK( 0, 0 ),\n    /*  SVTCA  x  */  PACK( 0, 0 ),\n    /*  SPvTCA y  */  PACK( 0, 0 ),\n    /*  SPvTCA x  */  PACK( 0, 0 ),\n    /*  SFvTCA y  */  PACK( 0, 0 ),\n    /*  SFvTCA x  */  PACK( 0, 0 ),\n    /*  SPvTL //  */  PACK( 2, 0 ),\n    /*  SPvTL +   */  PACK( 2, 0 ),\n    /*  SFvTL //  */  PACK( 2, 0 ),\n    /*  SFvTL +   */  PACK( 2, 0 ),\n    /*  SPvFS     */  PACK( 2, 0 ),\n    /*  SFvFS     */  PACK( 2, 0 ),\n    /*  GPV       */  PACK( 0, 2 ),\n    /*  GFV       */  PACK( 0, 2 ),\n    /*  SFvTPv    */  PACK( 0, 0 ),\n    /*  ISECT     */  PACK( 5, 0 ),\n\n    /*  SRP0      */  PACK( 1, 0 ),\n    /*  SRP1      */  PACK( 1, 0 ),\n    /*  SRP2      */  PACK( 1, 0 ),\n    /*  SZP0      */  PACK( 1, 0 ),\n    /*  SZP1      */  PACK( 1, 0 ),\n    /*  SZP2      */  PACK( 1, 0 ),\n    /*  SZPS      */  PACK( 1, 0 ),\n    /*  SLOOP     */  PACK( 1, 0 ),\n    /*  RTG       */  PACK( 0, 0 ),\n    /*  RTHG      */  PACK( 0, 0 ),\n    /*  SMD       */  PACK( 1, 0 ),\n    /*  ELSE      */  PACK( 0, 0 ),\n    /*  JMPR      */  PACK( 1, 0 ),\n    /*  SCvTCi    */  PACK( 1, 0 ),\n    /*  SSwCi     */  PACK( 1, 0 ),\n    /*  SSW       */  PACK( 1, 0 ),\n\n    /*  DUP       */  PACK( 1, 2 ),\n    /*  POP       */  PACK( 1, 0 ),\n    /*  CLEAR     */  PACK( 0, 0 ),\n    /*  SWAP      */  PACK( 2, 2 ),\n    /*  DEPTH     */  PACK( 0, 1 ),\n    /*  CINDEX    */  PACK( 1, 1 ),\n    /*  MINDEX    */  PACK( 1, 0 ),\n    /*  AlignPTS  */  PACK( 2, 0 ),\n    /*  INS_$28   */  PACK( 0, 0 ),\n    /*  UTP       */  PACK( 1, 0 ),\n    /*  LOOPCALL  */  PACK( 2, 0 ),\n    /*  CALL      */  PACK( 1, 0 ),\n    /*  FDEF      */  PACK( 1, 0 ),\n    /*  ENDF      */  PACK( 0, 0 ),\n    /*  MDAP[0]   */  PACK( 1, 0 ),\n    /*  MDAP[1]   */  PACK( 1, 0 ),\n\n    /*  IUP[0]    */  PACK( 0, 0 ),\n    /*  IUP[1]    */  PACK( 0, 0 ),\n    /*  SHP[0]    */  PACK( 0, 0 ),\n    /*  SHP[1]    */  PACK( 0, 0 ),\n    /*  SHC[0]    */  PACK( 1, 0 ),\n    /*  SHC[1]    */  PACK( 1, 0 ),\n    /*  SHZ[0]    */  PACK( 1, 0 ),\n    /*  SHZ[1]    */  PACK( 1, 0 ),\n    /*  SHPIX     */  PACK( 1, 0 ),\n    /*  IP        */  PACK( 0, 0 ),\n    /*  MSIRP[0]  */  PACK( 2, 0 ),\n    /*  MSIRP[1]  */  PACK( 2, 0 ),\n    /*  AlignRP   */  PACK( 0, 0 ),\n    /*  RTDG      */  PACK( 0, 0 ),\n    /*  MIAP[0]   */  PACK( 2, 0 ),\n    /*  MIAP[1]   */  PACK( 2, 0 ),\n\n    /*  NPushB    */  PACK( 0, 0 ),\n    /*  NPushW    */  PACK( 0, 0 ),\n    /*  WS        */  PACK( 2, 0 ),\n    /*  RS        */  PACK( 1, 1 ),\n    /*  WCvtP     */  PACK( 2, 0 ),\n    /*  RCvt      */  PACK( 1, 1 ),\n    /*  GC[0]     */  PACK( 1, 1 ),\n    /*  GC[1]     */  PACK( 1, 1 ),\n    /*  SCFS      */  PACK( 2, 0 ),\n    /*  MD[0]     */  PACK( 2, 1 ),\n    /*  MD[1]     */  PACK( 2, 1 ),\n    /*  MPPEM     */  PACK( 0, 1 ),\n    /*  MPS       */  PACK( 0, 1 ),\n    /*  FlipON    */  PACK( 0, 0 ),\n    /*  FlipOFF   */  PACK( 0, 0 ),\n    /*  DEBUG     */  PACK( 1, 0 ),\n\n    /*  LT        */  PACK( 2, 1 ),\n    /*  LTEQ      */  PACK( 2, 1 ),\n    /*  GT        */  PACK( 2, 1 ),\n    /*  GTEQ      */  PACK( 2, 1 ),\n    /*  EQ        */  PACK( 2, 1 ),\n    /*  NEQ       */  PACK( 2, 1 ),\n    /*  ODD       */  PACK( 1, 1 ),\n    /*  EVEN      */  PACK( 1, 1 ),\n    /*  IF        */  PACK( 1, 0 ),\n    /*  EIF       */  PACK( 0, 0 ),\n    /*  AND       */  PACK( 2, 1 ),\n    /*  OR        */  PACK( 2, 1 ),\n    /*  NOT       */  PACK( 1, 1 ),\n    /*  DeltaP1   */  PACK( 1, 0 ),\n    /*  SDB       */  PACK( 1, 0 ),\n    /*  SDS       */  PACK( 1, 0 ),\n\n    /*  ADD       */  PACK( 2, 1 ),\n    /*  SUB       */  PACK( 2, 1 ),\n    /*  DIV       */  PACK( 2, 1 ),\n    /*  MUL       */  PACK( 2, 1 ),\n    /*  ABS       */  PACK( 1, 1 ),\n    /*  NEG       */  PACK( 1, 1 ),\n    /*  FLOOR     */  PACK( 1, 1 ),\n    /*  CEILING   */  PACK( 1, 1 ),\n    /*  ROUND[0]  */  PACK( 1, 1 ),\n    /*  ROUND[1]  */  PACK( 1, 1 ),\n    /*  ROUND[2]  */  PACK( 1, 1 ),\n    /*  ROUND[3]  */  PACK( 1, 1 ),\n    /*  NROUND[0] */  PACK( 1, 1 ),\n    /*  NROUND[1] */  PACK( 1, 1 ),\n    /*  NROUND[2] */  PACK( 1, 1 ),\n    /*  NROUND[3] */  PACK( 1, 1 ),\n\n    /*  WCvtF     */  PACK( 2, 0 ),\n    /*  DeltaP2   */  PACK( 1, 0 ),\n    /*  DeltaP3   */  PACK( 1, 0 ),\n    /*  DeltaCn[0] */ PACK( 1, 0 ),\n    /*  DeltaCn[1] */ PACK( 1, 0 ),\n    /*  DeltaCn[2] */ PACK( 1, 0 ),\n    /*  SROUND    */  PACK( 1, 0 ),\n    /*  S45Round  */  PACK( 1, 0 ),\n    /*  JROT      */  PACK( 2, 0 ),\n    /*  JROF      */  PACK( 2, 0 ),\n    /*  ROFF      */  PACK( 0, 0 ),\n    /*  INS_$7B   */  PACK( 0, 0 ),\n    /*  RUTG      */  PACK( 0, 0 ),\n    /*  RDTG      */  PACK( 0, 0 ),\n    /*  SANGW     */  PACK( 1, 0 ),\n    /*  AA        */  PACK( 1, 0 ),\n\n    /*  FlipPT    */  PACK( 0, 0 ),\n    /*  FlipRgON  */  PACK( 2, 0 ),\n    /*  FlipRgOFF */  PACK( 2, 0 ),\n    /*  INS_$83   */  PACK( 0, 0 ),\n    /*  INS_$84   */  PACK( 0, 0 ),\n    /*  ScanCTRL  */  PACK( 1, 0 ),\n    /*  SDPVTL[0] */  PACK( 2, 0 ),\n    /*  SDPVTL[1] */  PACK( 2, 0 ),\n    /*  GetINFO   */  PACK( 1, 1 ),\n    /*  IDEF      */  PACK( 1, 0 ),\n    /*  ROLL      */  PACK( 3, 3 ),\n    /*  MAX       */  PACK( 2, 1 ),\n    /*  MIN       */  PACK( 2, 1 ),\n    /*  ScanTYPE  */  PACK( 1, 0 ),\n    /*  InstCTRL  */  PACK( 2, 0 ),\n    /*  INS_$8F   */  PACK( 0, 0 ),\n\n    /*  INS_$90  */   PACK( 0, 0 ),\n    /*  INS_$91  */   PACK( 0, 0 ),\n    /*  INS_$92  */   PACK( 0, 0 ),\n    /*  INS_$93  */   PACK( 0, 0 ),\n    /*  INS_$94  */   PACK( 0, 0 ),\n    /*  INS_$95  */   PACK( 0, 0 ),\n    /*  INS_$96  */   PACK( 0, 0 ),\n    /*  INS_$97  */   PACK( 0, 0 ),\n    /*  INS_$98  */   PACK( 0, 0 ),\n    /*  INS_$99  */   PACK( 0, 0 ),\n    /*  INS_$9A  */   PACK( 0, 0 ),\n    /*  INS_$9B  */   PACK( 0, 0 ),\n    /*  INS_$9C  */   PACK( 0, 0 ),\n    /*  INS_$9D  */   PACK( 0, 0 ),\n    /*  INS_$9E  */   PACK( 0, 0 ),\n    /*  INS_$9F  */   PACK( 0, 0 ),\n\n    /*  INS_$A0  */   PACK( 0, 0 ),\n    /*  INS_$A1  */   PACK( 0, 0 ),\n    /*  INS_$A2  */   PACK( 0, 0 ),\n    /*  INS_$A3  */   PACK( 0, 0 ),\n    /*  INS_$A4  */   PACK( 0, 0 ),\n    /*  INS_$A5  */   PACK( 0, 0 ),\n    /*  INS_$A6  */   PACK( 0, 0 ),\n    /*  INS_$A7  */   PACK( 0, 0 ),\n    /*  INS_$A8  */   PACK( 0, 0 ),\n    /*  INS_$A9  */   PACK( 0, 0 ),\n    /*  INS_$AA  */   PACK( 0, 0 ),\n    /*  INS_$AB  */   PACK( 0, 0 ),\n    /*  INS_$AC  */   PACK( 0, 0 ),\n    /*  INS_$AD  */   PACK( 0, 0 ),\n    /*  INS_$AE  */   PACK( 0, 0 ),\n    /*  INS_$AF  */   PACK( 0, 0 ),\n\n    /*  PushB[0]  */  PACK( 0, 1 ),\n    /*  PushB[1]  */  PACK( 0, 2 ),\n    /*  PushB[2]  */  PACK( 0, 3 ),\n    /*  PushB[3]  */  PACK( 0, 4 ),\n    /*  PushB[4]  */  PACK( 0, 5 ),\n    /*  PushB[5]  */  PACK( 0, 6 ),\n    /*  PushB[6]  */  PACK( 0, 7 ),\n    /*  PushB[7]  */  PACK( 0, 8 ),\n    /*  PushW[0]  */  PACK( 0, 1 ),\n    /*  PushW[1]  */  PACK( 0, 2 ),\n    /*  PushW[2]  */  PACK( 0, 3 ),\n    /*  PushW[3]  */  PACK( 0, 4 ),\n    /*  PushW[4]  */  PACK( 0, 5 ),\n    /*  PushW[5]  */  PACK( 0, 6 ),\n    /*  PushW[6]  */  PACK( 0, 7 ),\n    /*  PushW[7]  */  PACK( 0, 8 ),\n\n    /*  MDRP[00]  */  PACK( 1, 0 ),\n    /*  MDRP[01]  */  PACK( 1, 0 ),\n    /*  MDRP[02]  */  PACK( 1, 0 ),\n    /*  MDRP[03]  */  PACK( 1, 0 ),\n    /*  MDRP[04]  */  PACK( 1, 0 ),\n    /*  MDRP[05]  */  PACK( 1, 0 ),\n    /*  MDRP[06]  */  PACK( 1, 0 ),\n    /*  MDRP[07]  */  PACK( 1, 0 ),\n    /*  MDRP[08]  */  PACK( 1, 0 ),\n    /*  MDRP[09]  */  PACK( 1, 0 ),\n    /*  MDRP[10]  */  PACK( 1, 0 ),\n    /*  MDRP[11]  */  PACK( 1, 0 ),\n    /*  MDRP[12]  */  PACK( 1, 0 ),\n    /*  MDRP[13]  */  PACK( 1, 0 ),\n    /*  MDRP[14]  */  PACK( 1, 0 ),\n    /*  MDRP[15]  */  PACK( 1, 0 ),\n\n    /*  MDRP[16]  */  PACK( 1, 0 ),\n    /*  MDRP[17]  */  PACK( 1, 0 ),\n    /*  MDRP[18]  */  PACK( 1, 0 ),\n    /*  MDRP[19]  */  PACK( 1, 0 ),\n    /*  MDRP[20]  */  PACK( 1, 0 ),\n    /*  MDRP[21]  */  PACK( 1, 0 ),\n    /*  MDRP[22]  */  PACK( 1, 0 ),\n    /*  MDRP[23]  */  PACK( 1, 0 ),\n    /*  MDRP[24]  */  PACK( 1, 0 ),\n    /*  MDRP[25]  */  PACK( 1, 0 ),\n    /*  MDRP[26]  */  PACK( 1, 0 ),\n    /*  MDRP[27]  */  PACK( 1, 0 ),\n    /*  MDRP[28]  */  PACK( 1, 0 ),\n    /*  MDRP[29]  */  PACK( 1, 0 ),\n    /*  MDRP[30]  */  PACK( 1, 0 ),\n    /*  MDRP[31]  */  PACK( 1, 0 ),\n\n    /*  MIRP[00]  */  PACK( 2, 0 ),\n    /*  MIRP[01]  */  PACK( 2, 0 ),\n    /*  MIRP[02]  */  PACK( 2, 0 ),\n    /*  MIRP[03]  */  PACK( 2, 0 ),\n    /*  MIRP[04]  */  PACK( 2, 0 ),\n    /*  MIRP[05]  */  PACK( 2, 0 ),\n    /*  MIRP[06]  */  PACK( 2, 0 ),\n    /*  MIRP[07]  */  PACK( 2, 0 ),\n    /*  MIRP[08]  */  PACK( 2, 0 ),\n    /*  MIRP[09]  */  PACK( 2, 0 ),\n    /*  MIRP[10]  */  PACK( 2, 0 ),\n    /*  MIRP[11]  */  PACK( 2, 0 ),\n    /*  MIRP[12]  */  PACK( 2, 0 ),\n    /*  MIRP[13]  */  PACK( 2, 0 ),\n    /*  MIRP[14]  */  PACK( 2, 0 ),\n    /*  MIRP[15]  */  PACK( 2, 0 ),\n\n    /*  MIRP[16]  */  PACK( 2, 0 ),\n    /*  MIRP[17]  */  PACK( 2, 0 ),\n    /*  MIRP[18]  */  PACK( 2, 0 ),\n    /*  MIRP[19]  */  PACK( 2, 0 ),\n    /*  MIRP[20]  */  PACK( 2, 0 ),\n    /*  MIRP[21]  */  PACK( 2, 0 ),\n    /*  MIRP[22]  */  PACK( 2, 0 ),\n    /*  MIRP[23]  */  PACK( 2, 0 ),\n    /*  MIRP[24]  */  PACK( 2, 0 ),\n    /*  MIRP[25]  */  PACK( 2, 0 ),\n    /*  MIRP[26]  */  PACK( 2, 0 ),\n    /*  MIRP[27]  */  PACK( 2, 0 ),\n    /*  MIRP[28]  */  PACK( 2, 0 ),\n    /*  MIRP[29]  */  PACK( 2, 0 ),\n    /*  MIRP[30]  */  PACK( 2, 0 ),\n    /*  MIRP[31]  */  PACK( 2, 0 )\n  };\n\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n  static\n  const char*  const opcode_name[256] =\n  {\n    \"SVTCA y\",\n    \"SVTCA x\",\n    \"SPvTCA y\",\n    \"SPvTCA x\",\n    \"SFvTCA y\",\n    \"SFvTCA x\",\n    \"SPvTL ||\",\n    \"SPvTL +\",\n    \"SFvTL ||\",\n    \"SFvTL +\",\n    \"SPvFS\",\n    \"SFvFS\",\n    \"GPV\",\n    \"GFV\",\n    \"SFvTPv\",\n    \"ISECT\",\n\n    \"SRP0\",\n    \"SRP1\",\n    \"SRP2\",\n    \"SZP0\",\n    \"SZP1\",\n    \"SZP2\",\n    \"SZPS\",\n    \"SLOOP\",\n    \"RTG\",\n    \"RTHG\",\n    \"SMD\",\n    \"ELSE\",\n    \"JMPR\",\n    \"SCvTCi\",\n    \"SSwCi\",\n    \"SSW\",\n\n    \"DUP\",\n    \"POP\",\n    \"CLEAR\",\n    \"SWAP\",\n    \"DEPTH\",\n    \"CINDEX\",\n    \"MINDEX\",\n    \"AlignPTS\",\n    \"INS_$28\",\n    \"UTP\",\n    \"LOOPCALL\",\n    \"CALL\",\n    \"FDEF\",\n    \"ENDF\",\n    \"MDAP[0]\",\n    \"MDAP[1]\",\n\n    \"IUP[0]\",\n    \"IUP[1]\",\n    \"SHP[0]\",\n    \"SHP[1]\",\n    \"SHC[0]\",\n    \"SHC[1]\",\n    \"SHZ[0]\",\n    \"SHZ[1]\",\n    \"SHPIX\",\n    \"IP\",\n    \"MSIRP[0]\",\n    \"MSIRP[1]\",\n    \"AlignRP\",\n    \"RTDG\",\n    \"MIAP[0]\",\n    \"MIAP[1]\",\n\n    \"NPushB\",\n    \"NPushW\",\n    \"WS\",\n    \"RS\",\n    \"WCvtP\",\n    \"RCvt\",\n    \"GC[0]\",\n    \"GC[1]\",\n    \"SCFS\",\n    \"MD[0]\",\n    \"MD[1]\",\n    \"MPPEM\",\n    \"MPS\",\n    \"FlipON\",\n    \"FlipOFF\",\n    \"DEBUG\",\n\n    \"LT\",\n    \"LTEQ\",\n    \"GT\",\n    \"GTEQ\",\n    \"EQ\",\n    \"NEQ\",\n    \"ODD\",\n    \"EVEN\",\n    \"IF\",\n    \"EIF\",\n    \"AND\",\n    \"OR\",\n    \"NOT\",\n    \"DeltaP1\",\n    \"SDB\",\n    \"SDS\",\n\n    \"ADD\",\n    \"SUB\",\n    \"DIV\",\n    \"MUL\",\n    \"ABS\",\n    \"NEG\",\n    \"FLOOR\",\n    \"CEILING\",\n    \"ROUND[0]\",\n    \"ROUND[1]\",\n    \"ROUND[2]\",\n    \"ROUND[3]\",\n    \"NROUND[0]\",\n    \"NROUND[1]\",\n    \"NROUND[2]\",\n    \"NROUND[3]\",\n\n    \"WCvtF\",\n    \"DeltaP2\",\n    \"DeltaP3\",\n    \"DeltaCn[0]\",\n    \"DeltaCn[1]\",\n    \"DeltaCn[2]\",\n    \"SROUND\",\n    \"S45Round\",\n    \"JROT\",\n    \"JROF\",\n    \"ROFF\",\n    \"INS_$7B\",\n    \"RUTG\",\n    \"RDTG\",\n    \"SANGW\",\n    \"AA\",\n\n    \"FlipPT\",\n    \"FlipRgON\",\n    \"FlipRgOFF\",\n    \"INS_$83\",\n    \"INS_$84\",\n    \"ScanCTRL\",\n    \"SDVPTL[0]\",\n    \"SDVPTL[1]\",\n    \"GetINFO\",\n    \"IDEF\",\n    \"ROLL\",\n    \"MAX\",\n    \"MIN\",\n    \"ScanTYPE\",\n    \"InstCTRL\",\n    \"INS_$8F\",\n\n    \"INS_$90\",\n    \"INS_$91\",\n    \"INS_$92\",\n    \"INS_$93\",\n    \"INS_$94\",\n    \"INS_$95\",\n    \"INS_$96\",\n    \"INS_$97\",\n    \"INS_$98\",\n    \"INS_$99\",\n    \"INS_$9A\",\n    \"INS_$9B\",\n    \"INS_$9C\",\n    \"INS_$9D\",\n    \"INS_$9E\",\n    \"INS_$9F\",\n\n    \"INS_$A0\",\n    \"INS_$A1\",\n    \"INS_$A2\",\n    \"INS_$A3\",\n    \"INS_$A4\",\n    \"INS_$A5\",\n    \"INS_$A6\",\n    \"INS_$A7\",\n    \"INS_$A8\",\n    \"INS_$A9\",\n    \"INS_$AA\",\n    \"INS_$AB\",\n    \"INS_$AC\",\n    \"INS_$AD\",\n    \"INS_$AE\",\n    \"INS_$AF\",\n\n    \"PushB[0]\",\n    \"PushB[1]\",\n    \"PushB[2]\",\n    \"PushB[3]\",\n    \"PushB[4]\",\n    \"PushB[5]\",\n    \"PushB[6]\",\n    \"PushB[7]\",\n    \"PushW[0]\",\n    \"PushW[1]\",\n    \"PushW[2]\",\n    \"PushW[3]\",\n    \"PushW[4]\",\n    \"PushW[5]\",\n    \"PushW[6]\",\n    \"PushW[7]\",\n\n    \"MDRP[00]\",\n    \"MDRP[01]\",\n    \"MDRP[02]\",\n    \"MDRP[03]\",\n    \"MDRP[04]\",\n    \"MDRP[05]\",\n    \"MDRP[06]\",\n    \"MDRP[07]\",\n    \"MDRP[08]\",\n    \"MDRP[09]\",\n    \"MDRP[10]\",\n    \"MDRP[11]\",\n    \"MDRP[12]\",\n    \"MDRP[13]\",\n    \"MDRP[14]\",\n    \"MDRP[15]\",\n\n    \"MDRP[16]\",\n    \"MDRP[17]\",\n    \"MDRP[18]\",\n    \"MDRP[19]\",\n    \"MDRP[20]\",\n    \"MDRP[21]\",\n    \"MDRP[22]\",\n    \"MDRP[23]\",\n    \"MDRP[24]\",\n    \"MDRP[25]\",\n    \"MDRP[26]\",\n    \"MDRP[27]\",\n    \"MDRP[28]\",\n    \"MDRP[29]\",\n    \"MDRP[30]\",\n    \"MDRP[31]\",\n\n    \"MIRP[00]\",\n    \"MIRP[01]\",\n    \"MIRP[02]\",\n    \"MIRP[03]\",\n    \"MIRP[04]\",\n    \"MIRP[05]\",\n    \"MIRP[06]\",\n    \"MIRP[07]\",\n    \"MIRP[08]\",\n    \"MIRP[09]\",\n    \"MIRP[10]\",\n    \"MIRP[11]\",\n    \"MIRP[12]\",\n    \"MIRP[13]\",\n    \"MIRP[14]\",\n    \"MIRP[15]\",\n\n    \"MIRP[16]\",\n    \"MIRP[17]\",\n    \"MIRP[18]\",\n    \"MIRP[19]\",\n    \"MIRP[20]\",\n    \"MIRP[21]\",\n    \"MIRP[22]\",\n    \"MIRP[23]\",\n    \"MIRP[24]\",\n    \"MIRP[25]\",\n    \"MIRP[26]\",\n    \"MIRP[27]\",\n    \"MIRP[28]\",\n    \"MIRP[29]\",\n    \"MIRP[30]\",\n    \"MIRP[31]\"\n  };\n\n#endif /* FT_DEBUG_LEVEL_TRACE */\n\n\n  static\n  const FT_Char  opcode_length[256] =\n  {\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n\n   -1,-2, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n    2, 3, 4, 5,  6, 7, 8, 9,  3, 5, 7, 9, 11,13,15,17,\n\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1\n  };\n\n#undef PACK\n\n#if 1\n\n  static FT_Int32\n  TT_MulFix14( FT_Int32  a,\n               FT_Int    b )\n  {\n    FT_Int32   sign;\n    FT_UInt32  ah, al, mid, lo, hi;\n\n\n    sign = a ^ b;\n\n    if ( a < 0 )\n      a = -a;\n    if ( b < 0 )\n      b = -b;\n\n    ah = (FT_UInt32)( ( a >> 16 ) & 0xFFFFU );\n    al = (FT_UInt32)( a & 0xFFFFU );\n\n    lo    = al * b;\n    mid   = ah * b;\n    hi    = mid >> 16;\n    mid   = ( mid << 16 ) + ( 1 << 13 ); /* rounding */\n    lo   += mid;\n    if ( lo < mid )\n      hi += 1;\n\n    mid = ( lo >> 14 ) | ( hi << 18 );\n\n    return sign >= 0 ? (FT_Int32)mid : -(FT_Int32)mid;\n  }\n\n#else\n\n  /* compute (a*b)/2^14 with maximum accuracy and rounding */\n  static FT_Int32\n  TT_MulFix14( FT_Int32  a,\n               FT_Int    b )\n  {\n    FT_Int32   m, s, hi;\n    FT_UInt32  l, lo;\n\n\n    /* compute ax*bx as 64-bit value */\n    l  = (FT_UInt32)( ( a & 0xFFFFU ) * b );\n    m  = ( a >> 16 ) * b;\n\n    lo = l + ( (FT_UInt32)m << 16 );\n    hi = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo < l );\n\n    /* divide the result by 2^14 with rounding */\n    s   = hi >> 31;\n    l   = lo + (FT_UInt32)s;\n    hi += s + ( l < lo );\n    lo  = l;\n\n    l   = lo + 0x2000U;\n    hi += l < lo;\n\n    return (FT_Int32)( ( (FT_UInt32)hi << 18 ) | ( l >> 14 ) );\n  }\n#endif\n\n\n  /* compute (ax*bx+ay*by)/2^14 with maximum accuracy and rounding */\n  static FT_Int32\n  TT_DotFix14( FT_Int32  ax,\n               FT_Int32  ay,\n               FT_Int    bx,\n               FT_Int    by )\n  {\n    FT_Int32   m, s, hi1, hi2, hi;\n    FT_UInt32  l, lo1, lo2, lo;\n\n\n    /* compute ax*bx as 64-bit value */\n    l = (FT_UInt32)( ( ax & 0xFFFFU ) * bx );\n    m = ( ax >> 16 ) * bx;\n\n    lo1 = l + ( (FT_UInt32)m << 16 );\n    hi1 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo1 < l );\n\n    /* compute ay*by as 64-bit value */\n    l = (FT_UInt32)( ( ay & 0xFFFFU ) * by );\n    m = ( ay >> 16 ) * by;\n\n    lo2 = l + ( (FT_UInt32)m << 16 );\n    hi2 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo2 < l );\n\n    /* add them */\n    lo = lo1 + lo2;\n    hi = hi1 + hi2 + ( lo < lo1 );\n\n    /* divide the result by 2^14 with rounding */\n    s   = hi >> 31;\n    l   = lo + (FT_UInt32)s;\n    hi += s + ( l < lo );\n    lo  = l;\n\n    l   = lo + 0x2000U;\n    hi += ( l < lo );\n\n    return (FT_Int32)( ( (FT_UInt32)hi << 18 ) | ( l >> 14 ) );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Current_Ratio                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Returns the current aspect ratio scaling factor depending on the   */\n  /*    projection vector's state and device resolutions.                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The aspect ratio in 16.16 format, always <= 1.0 .                  */\n  /*                                                                       */\n  static FT_Long\n  Current_Ratio( EXEC_OP )\n  {\n    if ( !CUR.tt_metrics.ratio )\n    {\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n      if ( CUR.face->unpatented_hinting )\n      {\n        if ( CUR.GS.both_x_axis )\n          CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio;\n        else\n          CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio;\n      }\n      else\n#endif\n      {\n        if ( CUR.GS.projVector.y == 0 )\n          CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio;\n\n        else if ( CUR.GS.projVector.x == 0 )\n          CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio;\n\n        else\n        {\n          FT_F26Dot6  x, y;\n\n\n          x = TT_MulFix14( CUR.tt_metrics.x_ratio,\n                           CUR.GS.projVector.x );\n          y = TT_MulFix14( CUR.tt_metrics.y_ratio,\n                           CUR.GS.projVector.y );\n          CUR.tt_metrics.ratio = FT_Hypot( x, y );\n        }\n      }\n    }\n    return CUR.tt_metrics.ratio;\n  }\n\n\n  static FT_Long\n  Current_Ppem( EXEC_OP )\n  {\n    return FT_MulFix( CUR.tt_metrics.ppem, CURRENT_Ratio() );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Functions related to the control value table (CVT).                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  FT_CALLBACK_DEF( FT_F26Dot6 )\n  Read_CVT( EXEC_OP_ FT_ULong  idx )\n  {\n    return CUR.cvt[idx];\n  }\n\n\n  FT_CALLBACK_DEF( FT_F26Dot6 )\n  Read_CVT_Stretched( EXEC_OP_ FT_ULong  idx )\n  {\n    return FT_MulFix( CUR.cvt[idx], CURRENT_Ratio() );\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  Write_CVT( EXEC_OP_ FT_ULong    idx,\n                      FT_F26Dot6  value )\n  {\n    CUR.cvt[idx] = value;\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  Write_CVT_Stretched( EXEC_OP_ FT_ULong    idx,\n                                FT_F26Dot6  value )\n  {\n    CUR.cvt[idx] = FT_DivFix( value, CURRENT_Ratio() );\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  Move_CVT( EXEC_OP_ FT_ULong    idx,\n                     FT_F26Dot6  value )\n  {\n    CUR.cvt[idx] += value;\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  Move_CVT_Stretched( EXEC_OP_ FT_ULong    idx,\n                               FT_F26Dot6  value )\n  {\n    CUR.cvt[idx] += FT_DivFix( value, CURRENT_Ratio() );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    GetShortIns                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Returns a short integer taken from the instruction stream at       */\n  /*    address IP.                                                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Short read at code[IP].                                            */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This one could become a macro.                                     */\n  /*                                                                       */\n  static FT_Short\n  GetShortIns( EXEC_OP )\n  {\n    /* Reading a byte stream so there is no endianess (DaveP) */\n    CUR.IP += 2;\n    return (FT_Short)( ( CUR.code[CUR.IP - 2] << 8 ) +\n                         CUR.code[CUR.IP - 1]      );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Ins_Goto_CodeRange                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Goes to a certain code range in the instruction stream.            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    aRange :: The index of the code range.                             */\n  /*                                                                       */\n  /*    aIP    :: The new IP address in the code range.                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    SUCCESS or FAILURE.                                                */\n  /*                                                                       */\n  static FT_Bool\n  Ins_Goto_CodeRange( EXEC_OP_ FT_Int    aRange,\n                               FT_ULong  aIP )\n  {\n    TT_CodeRange*  range;\n\n\n    if ( aRange < 1 || aRange > 3 )\n    {\n      CUR.error = FT_THROW( Bad_Argument );\n      return FAILURE;\n    }\n\n    range = &CUR.codeRangeTable[aRange - 1];\n\n    if ( range->base == NULL )     /* invalid coderange */\n    {\n      CUR.error = FT_THROW( Invalid_CodeRange );\n      return FAILURE;\n    }\n\n    /* NOTE: Because the last instruction of a program may be a CALL */\n    /*       which will return to the first byte *after* the code    */\n    /*       range, we test for aIP <= Size, instead of aIP < Size.  */\n\n    if ( aIP > range->size )\n    {\n      CUR.error = FT_THROW( Code_Overflow );\n      return FAILURE;\n    }\n\n    CUR.code     = range->base;\n    CUR.codeSize = range->size;\n    CUR.IP       = aIP;\n    CUR.curRange = aRange;\n\n    return SUCCESS;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Direct_Move                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Moves a point by a given distance along the freedom vector.  The   */\n  /*    point will be `touched'.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    point    :: The index of the point to move.                        */\n  /*                                                                       */\n  /*    distance :: The distance to apply.                                 */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    zone     :: The affected glyph zone.                               */\n  /*                                                                       */\n  static void\n  Direct_Move( EXEC_OP_ TT_GlyphZone  zone,\n                        FT_UShort     point,\n                        FT_F26Dot6    distance )\n  {\n    FT_F26Dot6  v;\n\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    FT_ASSERT( !CUR.face->unpatented_hinting );\n#endif\n\n    v = CUR.GS.freeVector.x;\n\n    if ( v != 0 )\n    {\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n      if ( !SUBPIXEL_HINTING                                     ||\n           ( !CUR.ignore_x_mode                                ||\n             ( CUR.sph_tweak_flags & SPH_TWEAK_ALLOW_X_DMOVE ) ) )\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n        zone->cur[point].x += FT_MulDiv( distance, v, CUR.F_dot_P );\n\n      zone->tags[point] |= FT_CURVE_TAG_TOUCH_X;\n    }\n\n    v = CUR.GS.freeVector.y;\n\n    if ( v != 0 )\n    {\n      zone->cur[point].y += FT_MulDiv( distance, v, CUR.F_dot_P );\n\n      zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y;\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Direct_Move_Orig                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Moves the *original* position of a point by a given distance along */\n  /*    the freedom vector.  Obviously, the point will not be `touched'.   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    point    :: The index of the point to move.                        */\n  /*                                                                       */\n  /*    distance :: The distance to apply.                                 */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    zone     :: The affected glyph zone.                               */\n  /*                                                                       */\n  static void\n  Direct_Move_Orig( EXEC_OP_ TT_GlyphZone  zone,\n                             FT_UShort     point,\n                             FT_F26Dot6    distance )\n  {\n    FT_F26Dot6  v;\n\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    FT_ASSERT( !CUR.face->unpatented_hinting );\n#endif\n\n    v = CUR.GS.freeVector.x;\n\n    if ( v != 0 )\n      zone->org[point].x += FT_MulDiv( distance, v, CUR.F_dot_P );\n\n    v = CUR.GS.freeVector.y;\n\n    if ( v != 0 )\n      zone->org[point].y += FT_MulDiv( distance, v, CUR.F_dot_P );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Special versions of Direct_Move()                                     */\n  /*                                                                       */\n  /*   The following versions are used whenever both vectors are both      */\n  /*   along one of the coordinate unit vectors, i.e. in 90% of the cases. */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  static void\n  Direct_Move_X( EXEC_OP_ TT_GlyphZone  zone,\n                          FT_UShort     point,\n                          FT_F26Dot6    distance )\n  {\n    FT_UNUSED_EXEC;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    if ( !SUBPIXEL_HINTING  ||\n         !CUR.ignore_x_mode )\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n      zone->cur[point].x += distance;\n\n    zone->tags[point]  |= FT_CURVE_TAG_TOUCH_X;\n  }\n\n\n  static void\n  Direct_Move_Y( EXEC_OP_ TT_GlyphZone  zone,\n                          FT_UShort     point,\n                          FT_F26Dot6    distance )\n  {\n    FT_UNUSED_EXEC;\n\n    zone->cur[point].y += distance;\n    zone->tags[point]  |= FT_CURVE_TAG_TOUCH_Y;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Special versions of Direct_Move_Orig()                                */\n  /*                                                                       */\n  /*   The following versions are used whenever both vectors are both      */\n  /*   along one of the coordinate unit vectors, i.e. in 90% of the cases. */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  static void\n  Direct_Move_Orig_X( EXEC_OP_ TT_GlyphZone  zone,\n                               FT_UShort     point,\n                               FT_F26Dot6    distance )\n  {\n    FT_UNUSED_EXEC;\n\n    zone->org[point].x += distance;\n  }\n\n\n  static void\n  Direct_Move_Orig_Y( EXEC_OP_ TT_GlyphZone  zone,\n                               FT_UShort     point,\n                               FT_F26Dot6    distance )\n  {\n    FT_UNUSED_EXEC;\n\n    zone->org[point].y += distance;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Round_None                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Does not round, but adds engine compensation.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    distance     :: The distance (not) to round.                       */\n  /*                                                                       */\n  /*    compensation :: The engine compensation.                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The compensated distance.                                          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The TrueType specification says very few about the relationship    */\n  /*    between rounding and engine compensation.  However, it seems from  */\n  /*    the description of super round that we should add the compensation */\n  /*    before rounding.                                                   */\n  /*                                                                       */\n  static FT_F26Dot6\n  Round_None( EXEC_OP_ FT_F26Dot6  distance,\n                       FT_F26Dot6  compensation )\n  {\n    FT_F26Dot6  val;\n\n    FT_UNUSED_EXEC;\n\n\n    if ( distance >= 0 )\n    {\n      val = distance + compensation;\n      if ( distance && val < 0 )\n        val = 0;\n    }\n    else\n    {\n      val = distance - compensation;\n      if ( val > 0 )\n        val = 0;\n    }\n    return val;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Round_To_Grid                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Rounds value to grid after adding engine compensation.             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    distance     :: The distance to round.                             */\n  /*                                                                       */\n  /*    compensation :: The engine compensation.                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Rounded distance.                                                  */\n  /*                                                                       */\n  static FT_F26Dot6\n  Round_To_Grid( EXEC_OP_ FT_F26Dot6  distance,\n                          FT_F26Dot6  compensation )\n  {\n    FT_F26Dot6  val;\n\n    FT_UNUSED_EXEC;\n\n\n    if ( distance >= 0 )\n    {\n      val = distance + compensation + 32;\n      if ( distance && val > 0 )\n        val &= ~63;\n      else\n        val = 0;\n    }\n    else\n    {\n      val = -FT_PIX_ROUND( compensation - distance );\n      if ( val > 0 )\n        val = 0;\n    }\n\n    return  val;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Round_To_Half_Grid                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Rounds value to half grid after adding engine compensation.        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    distance     :: The distance to round.                             */\n  /*                                                                       */\n  /*    compensation :: The engine compensation.                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Rounded distance.                                                  */\n  /*                                                                       */\n  static FT_F26Dot6\n  Round_To_Half_Grid( EXEC_OP_ FT_F26Dot6  distance,\n                               FT_F26Dot6  compensation )\n  {\n    FT_F26Dot6  val;\n\n    FT_UNUSED_EXEC;\n\n\n    if ( distance >= 0 )\n    {\n      val = FT_PIX_FLOOR( distance + compensation ) + 32;\n      if ( distance && val < 0 )\n        val = 0;\n    }\n    else\n    {\n      val = -( FT_PIX_FLOOR( compensation - distance ) + 32 );\n      if ( val > 0 )\n        val = 0;\n    }\n\n    return val;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Round_Down_To_Grid                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Rounds value down to grid after adding engine compensation.        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    distance     :: The distance to round.                             */\n  /*                                                                       */\n  /*    compensation :: The engine compensation.                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Rounded distance.                                                  */\n  /*                                                                       */\n  static FT_F26Dot6\n  Round_Down_To_Grid( EXEC_OP_ FT_F26Dot6  distance,\n                               FT_F26Dot6  compensation )\n  {\n    FT_F26Dot6  val;\n\n    FT_UNUSED_EXEC;\n\n\n    if ( distance >= 0 )\n    {\n      val = distance + compensation;\n      if ( distance && val > 0 )\n        val &= ~63;\n      else\n        val = 0;\n    }\n    else\n    {\n      val = -( ( compensation - distance ) & -64 );\n      if ( val > 0 )\n        val = 0;\n    }\n\n    return val;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Round_Up_To_Grid                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Rounds value up to grid after adding engine compensation.          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    distance     :: The distance to round.                             */\n  /*                                                                       */\n  /*    compensation :: The engine compensation.                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Rounded distance.                                                  */\n  /*                                                                       */\n  static FT_F26Dot6\n  Round_Up_To_Grid( EXEC_OP_ FT_F26Dot6  distance,\n                             FT_F26Dot6  compensation )\n  {\n    FT_F26Dot6  val;\n\n    FT_UNUSED_EXEC;\n\n\n    if ( distance >= 0 )\n    {\n      val = distance + compensation + 63;\n      if ( distance && val > 0 )\n        val &= ~63;\n      else\n        val = 0;\n    }\n    else\n    {\n      val = -FT_PIX_CEIL( compensation - distance );\n      if ( val > 0 )\n        val = 0;\n    }\n\n    return val;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Round_To_Double_Grid                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Rounds value to double grid after adding engine compensation.      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    distance     :: The distance to round.                             */\n  /*                                                                       */\n  /*    compensation :: The engine compensation.                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Rounded distance.                                                  */\n  /*                                                                       */\n  static FT_F26Dot6\n  Round_To_Double_Grid( EXEC_OP_ FT_F26Dot6  distance,\n                                 FT_F26Dot6  compensation )\n  {\n    FT_F26Dot6 val;\n\n    FT_UNUSED_EXEC;\n\n\n    if ( distance >= 0 )\n    {\n      val = distance + compensation + 16;\n      if ( distance && val > 0 )\n        val &= ~31;\n      else\n        val = 0;\n    }\n    else\n    {\n      val = -FT_PAD_ROUND( compensation - distance, 32 );\n      if ( val > 0 )\n        val = 0;\n    }\n\n    return val;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Round_Super                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Super-rounds value to grid after adding engine compensation.       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    distance     :: The distance to round.                             */\n  /*                                                                       */\n  /*    compensation :: The engine compensation.                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Rounded distance.                                                  */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The TrueType specification says very few about the relationship    */\n  /*    between rounding and engine compensation.  However, it seems from  */\n  /*    the description of super round that we should add the compensation */\n  /*    before rounding.                                                   */\n  /*                                                                       */\n  static FT_F26Dot6\n  Round_Super( EXEC_OP_ FT_F26Dot6  distance,\n                        FT_F26Dot6  compensation )\n  {\n    FT_F26Dot6  val;\n\n\n    if ( distance >= 0 )\n    {\n      val = ( distance - CUR.phase + CUR.threshold + compensation ) &\n              -CUR.period;\n      if ( distance && val < 0 )\n        val = 0;\n      val += CUR.phase;\n    }\n    else\n    {\n      val = -( ( CUR.threshold - CUR.phase - distance + compensation ) &\n               -CUR.period );\n      if ( val > 0 )\n        val = 0;\n      val -= CUR.phase;\n    }\n\n    return val;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Round_Super_45                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Super-rounds value to grid after adding engine compensation.       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    distance     :: The distance to round.                             */\n  /*                                                                       */\n  /*    compensation :: The engine compensation.                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Rounded distance.                                                  */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    There is a separate function for Round_Super_45() as we may need   */\n  /*    greater precision.                                                 */\n  /*                                                                       */\n  static FT_F26Dot6\n  Round_Super_45( EXEC_OP_ FT_F26Dot6  distance,\n                           FT_F26Dot6  compensation )\n  {\n    FT_F26Dot6  val;\n\n\n    if ( distance >= 0 )\n    {\n      val = ( ( distance - CUR.phase + CUR.threshold + compensation ) /\n                CUR.period ) * CUR.period;\n      if ( distance && val < 0 )\n        val = 0;\n      val += CUR.phase;\n    }\n    else\n    {\n      val = -( ( ( CUR.threshold - CUR.phase - distance + compensation ) /\n                   CUR.period ) * CUR.period );\n      if ( val > 0 )\n        val = 0;\n      val -= CUR.phase;\n    }\n\n    return val;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Compute_Round                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Sets the rounding mode.                                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    round_mode :: The rounding mode to be used.                        */\n  /*                                                                       */\n  static void\n  Compute_Round( EXEC_OP_ FT_Byte  round_mode )\n  {\n    switch ( round_mode )\n    {\n    case TT_Round_Off:\n      CUR.func_round = (TT_Round_Func)Round_None;\n      break;\n\n    case TT_Round_To_Grid:\n      CUR.func_round = (TT_Round_Func)Round_To_Grid;\n      break;\n\n    case TT_Round_Up_To_Grid:\n      CUR.func_round = (TT_Round_Func)Round_Up_To_Grid;\n      break;\n\n    case TT_Round_Down_To_Grid:\n      CUR.func_round = (TT_Round_Func)Round_Down_To_Grid;\n      break;\n\n    case TT_Round_To_Half_Grid:\n      CUR.func_round = (TT_Round_Func)Round_To_Half_Grid;\n      break;\n\n    case TT_Round_To_Double_Grid:\n      CUR.func_round = (TT_Round_Func)Round_To_Double_Grid;\n      break;\n\n    case TT_Round_Super:\n      CUR.func_round = (TT_Round_Func)Round_Super;\n      break;\n\n    case TT_Round_Super_45:\n      CUR.func_round = (TT_Round_Func)Round_Super_45;\n      break;\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    SetSuperRound                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Sets Super Round parameters.                                       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    GridPeriod :: The grid period.                                     */\n  /*                                                                       */\n  /*    selector   :: The SROUND opcode.                                   */\n  /*                                                                       */\n  static void\n  SetSuperRound( EXEC_OP_ FT_F26Dot6  GridPeriod,\n                          FT_Long     selector )\n  {\n    switch ( (FT_Int)( selector & 0xC0 ) )\n    {\n      case 0:\n        CUR.period = GridPeriod / 2;\n        break;\n\n      case 0x40:\n        CUR.period = GridPeriod;\n        break;\n\n      case 0x80:\n        CUR.period = GridPeriod * 2;\n        break;\n\n      /* This opcode is reserved, but... */\n\n      case 0xC0:\n        CUR.period = GridPeriod;\n        break;\n    }\n\n    switch ( (FT_Int)( selector & 0x30 ) )\n    {\n    case 0:\n      CUR.phase = 0;\n      break;\n\n    case 0x10:\n      CUR.phase = CUR.period / 4;\n      break;\n\n    case 0x20:\n      CUR.phase = CUR.period / 2;\n      break;\n\n    case 0x30:\n      CUR.phase = CUR.period * 3 / 4;\n      break;\n    }\n\n    if ( ( selector & 0x0F ) == 0 )\n      CUR.threshold = CUR.period - 1;\n    else\n      CUR.threshold = ( (FT_Int)( selector & 0x0F ) - 4 ) * CUR.period / 8;\n\n    CUR.period    /= 256;\n    CUR.phase     /= 256;\n    CUR.threshold /= 256;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Project                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Computes the projection of vector given by (v2-v1) along the       */\n  /*    current projection vector.                                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    v1 :: First input vector.                                          */\n  /*    v2 :: Second input vector.                                         */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The distance in F26dot6 format.                                    */\n  /*                                                                       */\n  static FT_F26Dot6\n  Project( EXEC_OP_ FT_Pos  dx,\n                    FT_Pos  dy )\n  {\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    FT_ASSERT( !CUR.face->unpatented_hinting );\n#endif\n\n    return TT_DotFix14( (FT_UInt32)dx, (FT_UInt32)dy,\n                        CUR.GS.projVector.x,\n                        CUR.GS.projVector.y );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Dual_Project                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Computes the projection of the vector given by (v2-v1) along the   */\n  /*    current dual vector.                                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    v1 :: First input vector.                                          */\n  /*    v2 :: Second input vector.                                         */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The distance in F26dot6 format.                                    */\n  /*                                                                       */\n  static FT_F26Dot6\n  Dual_Project( EXEC_OP_ FT_Pos  dx,\n                         FT_Pos  dy )\n  {\n    return TT_DotFix14( (FT_UInt32)dx, (FT_UInt32)dy,\n                        CUR.GS.dualVector.x,\n                        CUR.GS.dualVector.y );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Project_x                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Computes the projection of the vector given by (v2-v1) along the   */\n  /*    horizontal axis.                                                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    v1 :: First input vector.                                          */\n  /*    v2 :: Second input vector.                                         */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The distance in F26dot6 format.                                    */\n  /*                                                                       */\n  static FT_F26Dot6\n  Project_x( EXEC_OP_ FT_Pos  dx,\n                      FT_Pos  dy )\n  {\n    FT_UNUSED_EXEC;\n    FT_UNUSED( dy );\n\n    return dx;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Project_y                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Computes the projection of the vector given by (v2-v1) along the   */\n  /*    vertical axis.                                                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    v1 :: First input vector.                                          */\n  /*    v2 :: Second input vector.                                         */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The distance in F26dot6 format.                                    */\n  /*                                                                       */\n  static FT_F26Dot6\n  Project_y( EXEC_OP_ FT_Pos  dx,\n                      FT_Pos  dy )\n  {\n    FT_UNUSED_EXEC;\n    FT_UNUSED( dx );\n\n    return dy;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Compute_Funcs                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Computes the projection and movement function pointers according   */\n  /*    to the current graphics state.                                     */\n  /*                                                                       */\n  static void\n  Compute_Funcs( EXEC_OP )\n  {\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    if ( CUR.face->unpatented_hinting )\n    {\n      /* If both vectors point rightwards along the x axis, set             */\n      /* `both-x-axis' true, otherwise set it false.  The x values only     */\n      /* need be tested because the vector has been normalised to a unit    */\n      /* vector of length 0x4000 = unity.                                   */\n      CUR.GS.both_x_axis = (FT_Bool)( CUR.GS.projVector.x == 0x4000 &&\n                                      CUR.GS.freeVector.x == 0x4000 );\n\n      /* Throw away projection and freedom vector information */\n      /* because the patents don't allow them to be stored.   */\n      /* The relevant US Patents are 5155805 and 5325479.     */\n      CUR.GS.projVector.x = 0;\n      CUR.GS.projVector.y = 0;\n      CUR.GS.freeVector.x = 0;\n      CUR.GS.freeVector.y = 0;\n\n      if ( CUR.GS.both_x_axis )\n      {\n        CUR.func_project   = Project_x;\n        CUR.func_move      = Direct_Move_X;\n        CUR.func_move_orig = Direct_Move_Orig_X;\n      }\n      else\n      {\n        CUR.func_project   = Project_y;\n        CUR.func_move      = Direct_Move_Y;\n        CUR.func_move_orig = Direct_Move_Orig_Y;\n      }\n\n      if ( CUR.GS.dualVector.x == 0x4000 )\n        CUR.func_dualproj = Project_x;\n      else if ( CUR.GS.dualVector.y == 0x4000 )\n        CUR.func_dualproj = Project_y;\n      else\n        CUR.func_dualproj = Dual_Project;\n\n      /* Force recalculation of cached aspect ratio */\n      CUR.tt_metrics.ratio = 0;\n\n      return;\n    }\n#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING */\n\n    if ( CUR.GS.freeVector.x == 0x4000 )\n      CUR.F_dot_P = CUR.GS.projVector.x;\n    else if ( CUR.GS.freeVector.y == 0x4000 )\n      CUR.F_dot_P = CUR.GS.projVector.y;\n    else\n      CUR.F_dot_P = ( (FT_Long)CUR.GS.projVector.x * CUR.GS.freeVector.x +\n                      (FT_Long)CUR.GS.projVector.y * CUR.GS.freeVector.y ) >>\n                    14;\n\n    if ( CUR.GS.projVector.x == 0x4000 )\n      CUR.func_project = (TT_Project_Func)Project_x;\n    else if ( CUR.GS.projVector.y == 0x4000 )\n      CUR.func_project = (TT_Project_Func)Project_y;\n    else\n      CUR.func_project = (TT_Project_Func)Project;\n\n    if ( CUR.GS.dualVector.x == 0x4000 )\n      CUR.func_dualproj = (TT_Project_Func)Project_x;\n    else if ( CUR.GS.dualVector.y == 0x4000 )\n      CUR.func_dualproj = (TT_Project_Func)Project_y;\n    else\n      CUR.func_dualproj = (TT_Project_Func)Dual_Project;\n\n    CUR.func_move      = (TT_Move_Func)Direct_Move;\n    CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig;\n\n    if ( CUR.F_dot_P == 0x4000L )\n    {\n      if ( CUR.GS.freeVector.x == 0x4000 )\n      {\n        CUR.func_move      = (TT_Move_Func)Direct_Move_X;\n        CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_X;\n      }\n      else if ( CUR.GS.freeVector.y == 0x4000 )\n      {\n        CUR.func_move      = (TT_Move_Func)Direct_Move_Y;\n        CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_Y;\n      }\n    }\n\n    /* at small sizes, F_dot_P can become too small, resulting   */\n    /* in overflows and `spikes' in a number of glyphs like `w'. */\n\n    if ( FT_ABS( CUR.F_dot_P ) < 0x400L )\n      CUR.F_dot_P = 0x4000L;\n\n    /* Disable cached aspect ratio */\n    CUR.tt_metrics.ratio = 0;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Normalize                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Norms a vector.                                                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    Vx :: The horizontal input vector coordinate.                      */\n  /*    Vy :: The vertical input vector coordinate.                        */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    R  :: The normed unit vector.                                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Returns FAILURE if a vector parameter is zero.                     */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    In case Vx and Vy are both zero, Normalize() returns SUCCESS, and  */\n  /*    R is undefined.                                                    */\n  /*                                                                       */\n  static FT_Bool\n  Normalize( EXEC_OP_ FT_F26Dot6      Vx,\n                      FT_F26Dot6      Vy,\n                      FT_UnitVector*  R )\n  {\n    FT_F26Dot6  W;\n\n    FT_UNUSED_EXEC;\n\n\n    if ( FT_ABS( Vx ) < 0x4000L && FT_ABS( Vy ) < 0x4000L )\n    {\n      if ( Vx == 0 && Vy == 0 )\n      {\n        /* XXX: UNDOCUMENTED! It seems that it is possible to try   */\n        /*      to normalize the vector (0,0).  Return immediately. */\n        return SUCCESS;\n      }\n\n      Vx *= 0x4000;\n      Vy *= 0x4000;\n    }\n\n    W = FT_Hypot( Vx, Vy );\n\n    R->x = (FT_F2Dot14)TT_DivFix14( Vx, W );\n    R->y = (FT_F2Dot14)TT_DivFix14( Vy, W );\n\n    return SUCCESS;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Here we start with the implementation of the various opcodes.         */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  static FT_Bool\n  Ins_SxVTL( EXEC_OP_ FT_UShort       aIdx1,\n                      FT_UShort       aIdx2,\n                      FT_Int          aOpc,\n                      FT_UnitVector*  Vec )\n  {\n    FT_Long     A, B, C;\n    FT_Vector*  p1;\n    FT_Vector*  p2;\n\n\n    if ( BOUNDS( aIdx1, CUR.zp2.n_points ) ||\n         BOUNDS( aIdx2, CUR.zp1.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return FAILURE;\n    }\n\n    p1 = CUR.zp1.cur + aIdx2;\n    p2 = CUR.zp2.cur + aIdx1;\n\n    A = p1->x - p2->x;\n    B = p1->y - p2->y;\n\n    /* If p1 == p2, SPVTL and SFVTL behave the same as */\n    /* SPVTCA[X] and SFVTCA[X], respectively.          */\n    /*                                                 */\n    /* Confirmed by Greg Hitchcock.                    */\n\n    if ( A == 0 && B == 0 )\n    {\n      A    = 0x4000;\n      aOpc = 0;\n    }\n\n    if ( ( aOpc & 1 ) != 0 )\n    {\n      C =  B;   /* counter clockwise rotation */\n      B =  A;\n      A = -C;\n    }\n\n    NORMalize( A, B, Vec );\n\n    return SUCCESS;\n  }\n\n\n  /* When not using the big switch statements, the interpreter uses a */\n  /* call table defined later below in this source.  Each opcode must */\n  /* thus have a corresponding function, even trivial ones.           */\n  /*                                                                  */\n  /* They are all defined there.                                      */\n\n#define DO_SVTCA                            \\\n  {                                         \\\n    FT_Short  A, B;                         \\\n                                            \\\n                                            \\\n    A = (FT_Short)( CUR.opcode & 1 ) << 14; \\\n    B = A ^ (FT_Short)0x4000;               \\\n                                            \\\n    CUR.GS.freeVector.x = A;                \\\n    CUR.GS.projVector.x = A;                \\\n    CUR.GS.dualVector.x = A;                \\\n                                            \\\n    CUR.GS.freeVector.y = B;                \\\n    CUR.GS.projVector.y = B;                \\\n    CUR.GS.dualVector.y = B;                \\\n                                            \\\n    COMPUTE_Funcs();                        \\\n  }\n\n\n#define DO_SPVTCA                           \\\n  {                                         \\\n    FT_Short  A, B;                         \\\n                                            \\\n                                            \\\n    A = (FT_Short)( CUR.opcode & 1 ) << 14; \\\n    B = A ^ (FT_Short)0x4000;               \\\n                                            \\\n    CUR.GS.projVector.x = A;                \\\n    CUR.GS.dualVector.x = A;                \\\n                                            \\\n    CUR.GS.projVector.y = B;                \\\n    CUR.GS.dualVector.y = B;                \\\n                                            \\\n    GUESS_VECTOR( freeVector );             \\\n                                            \\\n    COMPUTE_Funcs();                        \\\n  }\n\n\n#define DO_SFVTCA                           \\\n  {                                         \\\n    FT_Short  A, B;                         \\\n                                            \\\n                                            \\\n    A = (FT_Short)( CUR.opcode & 1 ) << 14; \\\n    B = A ^ (FT_Short)0x4000;               \\\n                                            \\\n    CUR.GS.freeVector.x = A;                \\\n    CUR.GS.freeVector.y = B;                \\\n                                            \\\n    GUESS_VECTOR( projVector );             \\\n                                            \\\n    COMPUTE_Funcs();                        \\\n  }\n\n\n#define DO_SPVTL                                      \\\n    if ( INS_SxVTL( (FT_UShort)args[1],               \\\n                    (FT_UShort)args[0],               \\\n                    CUR.opcode,                       \\\n                    &CUR.GS.projVector ) == SUCCESS ) \\\n    {                                                 \\\n      CUR.GS.dualVector = CUR.GS.projVector;          \\\n      GUESS_VECTOR( freeVector );                     \\\n      COMPUTE_Funcs();                                \\\n    }\n\n\n#define DO_SFVTL                                      \\\n    if ( INS_SxVTL( (FT_UShort)args[1],               \\\n                    (FT_UShort)args[0],               \\\n                    CUR.opcode,                       \\\n                    &CUR.GS.freeVector ) == SUCCESS ) \\\n    {                                                 \\\n      GUESS_VECTOR( projVector );                     \\\n      COMPUTE_Funcs();                                \\\n    }\n\n\n#define DO_SFVTPV                          \\\n    GUESS_VECTOR( projVector );            \\\n    CUR.GS.freeVector = CUR.GS.projVector; \\\n    COMPUTE_Funcs();\n\n\n#define DO_SPVFS                                \\\n  {                                             \\\n    FT_Short  S;                                \\\n    FT_Long   X, Y;                             \\\n                                                \\\n                                                \\\n    /* Only use low 16bits, then sign extend */ \\\n    S = (FT_Short)args[1];                      \\\n    Y = (FT_Long)S;                             \\\n    S = (FT_Short)args[0];                      \\\n    X = (FT_Long)S;                             \\\n                                                \\\n    NORMalize( X, Y, &CUR.GS.projVector );      \\\n                                                \\\n    CUR.GS.dualVector = CUR.GS.projVector;      \\\n    GUESS_VECTOR( freeVector );                 \\\n    COMPUTE_Funcs();                            \\\n  }\n\n\n#define DO_SFVFS                                \\\n  {                                             \\\n    FT_Short  S;                                \\\n    FT_Long   X, Y;                             \\\n                                                \\\n                                                \\\n    /* Only use low 16bits, then sign extend */ \\\n    S = (FT_Short)args[1];                      \\\n    Y = (FT_Long)S;                             \\\n    S = (FT_Short)args[0];                      \\\n    X = S;                                      \\\n                                                \\\n    NORMalize( X, Y, &CUR.GS.freeVector );      \\\n    GUESS_VECTOR( projVector );                 \\\n    COMPUTE_Funcs();                            \\\n  }\n\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n#define DO_GPV                                   \\\n    if ( CUR.face->unpatented_hinting )          \\\n    {                                            \\\n      args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \\\n      args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \\\n    }                                            \\\n    else                                         \\\n    {                                            \\\n      args[0] = CUR.GS.projVector.x;             \\\n      args[1] = CUR.GS.projVector.y;             \\\n    }\n#else\n#define DO_GPV                                   \\\n    args[0] = CUR.GS.projVector.x;               \\\n    args[1] = CUR.GS.projVector.y;\n#endif\n\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n#define DO_GFV                                   \\\n    if ( CUR.face->unpatented_hinting )          \\\n    {                                            \\\n      args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \\\n      args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \\\n    }                                            \\\n    else                                         \\\n    {                                            \\\n      args[0] = CUR.GS.freeVector.x;             \\\n      args[1] = CUR.GS.freeVector.y;             \\\n    }\n#else\n#define DO_GFV                                   \\\n    args[0] = CUR.GS.freeVector.x;               \\\n    args[1] = CUR.GS.freeVector.y;\n#endif\n\n\n#define DO_SRP0                      \\\n    CUR.GS.rp0 = (FT_UShort)args[0];\n\n\n#define DO_SRP1                      \\\n    CUR.GS.rp1 = (FT_UShort)args[0];\n\n\n#define DO_SRP2                      \\\n    CUR.GS.rp2 = (FT_UShort)args[0];\n\n\n#define DO_RTHG                                         \\\n    CUR.GS.round_state = TT_Round_To_Half_Grid;         \\\n    CUR.func_round = (TT_Round_Func)Round_To_Half_Grid;\n\n\n#define DO_RTG                                     \\\n    CUR.GS.round_state = TT_Round_To_Grid;         \\\n    CUR.func_round = (TT_Round_Func)Round_To_Grid;\n\n\n#define DO_RTDG                                           \\\n    CUR.GS.round_state = TT_Round_To_Double_Grid;         \\\n    CUR.func_round = (TT_Round_Func)Round_To_Double_Grid;\n\n\n#define DO_RUTG                                       \\\n    CUR.GS.round_state = TT_Round_Up_To_Grid;         \\\n    CUR.func_round = (TT_Round_Func)Round_Up_To_Grid;\n\n\n#define DO_RDTG                                         \\\n    CUR.GS.round_state = TT_Round_Down_To_Grid;         \\\n    CUR.func_round = (TT_Round_Func)Round_Down_To_Grid;\n\n\n#define DO_ROFF                                 \\\n    CUR.GS.round_state = TT_Round_Off;          \\\n    CUR.func_round = (TT_Round_Func)Round_None;\n\n\n#define DO_SROUND                                \\\n    SET_SuperRound( 0x4000, args[0] );           \\\n    CUR.GS.round_state = TT_Round_Super;         \\\n    CUR.func_round = (TT_Round_Func)Round_Super;\n\n\n#define DO_S45ROUND                                 \\\n    SET_SuperRound( 0x2D41, args[0] );              \\\n    CUR.GS.round_state = TT_Round_Super_45;         \\\n    CUR.func_round = (TT_Round_Func)Round_Super_45;\n\n\n#define DO_SLOOP                            \\\n    if ( args[0] < 0 )                      \\\n      CUR.error = FT_THROW( Bad_Argument ); \\\n    else                                    \\\n      CUR.GS.loop = args[0];\n\n\n#define DO_SMD                         \\\n    CUR.GS.minimum_distance = args[0];\n\n\n#define DO_SCVTCI                                     \\\n    CUR.GS.control_value_cutin = (FT_F26Dot6)args[0];\n\n\n#define DO_SSWCI                                     \\\n    CUR.GS.single_width_cutin = (FT_F26Dot6)args[0];\n\n\n#define DO_SSW                                                     \\\n    CUR.GS.single_width_value = FT_MulFix( args[0],                \\\n                                           CUR.tt_metrics.scale );\n\n\n#define DO_FLIPON            \\\n    CUR.GS.auto_flip = TRUE;\n\n\n#define DO_FLIPOFF            \\\n    CUR.GS.auto_flip = FALSE;\n\n\n#define DO_SDB                             \\\n    CUR.GS.delta_base = (FT_Short)args[0];\n\n\n#define DO_SDS                              \\\n    CUR.GS.delta_shift = (FT_Short)args[0];\n\n\n#define DO_MD  /* nothing */\n\n\n#define DO_MPPEM              \\\n    args[0] = CURRENT_Ppem();\n\n\n  /* Note: The pointSize should be irrelevant in a given font program; */\n  /*       we thus decide to return only the ppem.                     */\n#if 0\n\n#define DO_MPS                       \\\n    args[0] = CUR.metrics.pointSize;\n\n#else\n\n#define DO_MPS                \\\n    args[0] = CURRENT_Ppem();\n\n#endif /* 0 */\n\n\n#define DO_DUP         \\\n    args[1] = args[0];\n\n\n#define DO_CLEAR     \\\n    CUR.new_top = 0;\n\n\n#define DO_SWAP        \\\n  {                    \\\n    FT_Long  L;        \\\n                       \\\n                       \\\n    L       = args[0]; \\\n    args[0] = args[1]; \\\n    args[1] = L;       \\\n  }\n\n\n#define DO_DEPTH       \\\n    args[0] = CUR.top;\n\n\n#define DO_CINDEX                                  \\\n  {                                                \\\n    FT_Long  L;                                    \\\n                                                   \\\n                                                   \\\n    L = args[0];                                   \\\n                                                   \\\n    if ( L <= 0 || L > CUR.args )                  \\\n    {                                              \\\n      if ( CUR.pedantic_hinting )                  \\\n        CUR.error = FT_THROW( Invalid_Reference ); \\\n      args[0] = 0;                                 \\\n    }                                              \\\n    else                                           \\\n      args[0] = CUR.stack[CUR.args - L];           \\\n  }\n\n\n#define DO_JROT                                                   \\\n    if ( args[1] != 0 )                                           \\\n    {                                                             \\\n      if ( args[0] == 0 && CUR.args == 0 )                        \\\n        CUR.error = FT_THROW( Bad_Argument );                     \\\n      CUR.IP += args[0];                                          \\\n      if ( CUR.IP < 0                                          || \\\n           ( CUR.callTop > 0                                 &&   \\\n             CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) )  \\\n        CUR.error = FT_THROW( Bad_Argument );                     \\\n      CUR.step_ins = FALSE;                                       \\\n    }\n\n\n#define DO_JMPR                                                 \\\n    if ( args[0] == 0 && CUR.args == 0 )                        \\\n      CUR.error = FT_THROW( Bad_Argument );                     \\\n    CUR.IP += args[0];                                          \\\n    if ( CUR.IP < 0                                          || \\\n         ( CUR.callTop > 0                                 &&   \\\n           CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) )  \\\n      CUR.error = FT_THROW( Bad_Argument );                     \\\n    CUR.step_ins = FALSE;\n\n\n#define DO_JROF                                                   \\\n    if ( args[1] == 0 )                                           \\\n    {                                                             \\\n      if ( args[0] == 0 && CUR.args == 0 )                        \\\n        CUR.error = FT_THROW( Bad_Argument );                     \\\n      CUR.IP += args[0];                                          \\\n      if ( CUR.IP < 0                                          || \\\n           ( CUR.callTop > 0                                 &&   \\\n             CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) )  \\\n        CUR.error = FT_THROW( Bad_Argument );                     \\\n      CUR.step_ins = FALSE;                                       \\\n    }\n\n\n#define DO_LT                        \\\n    args[0] = ( args[0] < args[1] );\n\n\n#define DO_LTEQ                       \\\n    args[0] = ( args[0] <= args[1] );\n\n\n#define DO_GT                        \\\n    args[0] = ( args[0] > args[1] );\n\n\n#define DO_GTEQ                       \\\n    args[0] = ( args[0] >= args[1] );\n\n\n#define DO_EQ                         \\\n    args[0] = ( args[0] == args[1] );\n\n\n#define DO_NEQ                        \\\n    args[0] = ( args[0] != args[1] );\n\n\n#define DO_ODD                                                  \\\n    args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 64 );\n\n\n#define DO_EVEN                                                \\\n    args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 0 );\n\n\n#define DO_AND                        \\\n    args[0] = ( args[0] && args[1] );\n\n\n#define DO_OR                         \\\n    args[0] = ( args[0] || args[1] );\n\n\n#define DO_NOT          \\\n    args[0] = !args[0];\n\n\n#define DO_ADD          \\\n    args[0] += args[1];\n\n\n#define DO_SUB          \\\n    args[0] -= args[1];\n\n\n#define DO_DIV                                               \\\n    if ( args[1] == 0 )                                      \\\n      CUR.error = FT_THROW( Divide_By_Zero );                \\\n    else                                                     \\\n      args[0] = FT_MulDiv_No_Round( args[0], 64L, args[1] );\n\n\n#define DO_MUL                                    \\\n    args[0] = FT_MulDiv( args[0], args[1], 64L );\n\n\n#define DO_ABS                   \\\n    args[0] = FT_ABS( args[0] );\n\n\n#define DO_NEG          \\\n    args[0] = -args[0];\n\n\n#define DO_FLOOR    \\\n    args[0] = FT_PIX_FLOOR( args[0] );\n\n\n#define DO_CEILING                    \\\n    args[0] = FT_PIX_CEIL( args[0] );\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n\n#define DO_RS                                             \\\n   {                                                      \\\n     FT_ULong  I = (FT_ULong)args[0];                     \\\n                                                          \\\n                                                          \\\n     if ( BOUNDSL( I, CUR.storeSize ) )                   \\\n     {                                                    \\\n       if ( CUR.pedantic_hinting )                        \\\n         ARRAY_BOUND_ERROR;                               \\\n       else                                               \\\n         args[0] = 0;                                     \\\n     }                                                    \\\n     else                                                 \\\n     {                                                    \\\n       /* subpixel hinting - avoid Typeman Dstroke and */ \\\n       /* IStroke and Vacuform rounds                  */ \\\n                                                          \\\n       if ( SUBPIXEL_HINTING                           && \\\n            CUR.ignore_x_mode                          && \\\n            ( ( I == 24                            &&     \\\n                ( CUR.face->sph_found_func_flags &        \\\n                  ( SPH_FDEF_SPACING_1 |                  \\\n                    SPH_FDEF_SPACING_2 )         ) ) ||   \\\n              ( I == 22                      &&           \\\n                ( CUR.sph_in_func_flags    &              \\\n                  SPH_FDEF_TYPEMAN_STROKES ) )       ||   \\\n              ( I == 8                             &&     \\\n                ( CUR.face->sph_found_func_flags &        \\\n                  SPH_FDEF_VACUFORM_ROUND_1      ) &&     \\\n                  CUR.iup_called                   ) ) )  \\\n         args[0] = 0;                                     \\\n       else                                               \\\n         args[0] = CUR.storage[I];                        \\\n     }                                                    \\\n   }\n\n#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n#define DO_RS                           \\\n   {                                    \\\n     FT_ULong  I = (FT_ULong)args[0];   \\\n                                        \\\n                                        \\\n     if ( BOUNDSL( I, CUR.storeSize ) ) \\\n     {                                  \\\n       if ( CUR.pedantic_hinting )      \\\n       {                                \\\n         ARRAY_BOUND_ERROR;             \\\n       }                                \\\n       else                             \\\n         args[0] = 0;                   \\\n     }                                  \\\n     else                               \\\n       args[0] = CUR.storage[I];        \\\n   }\n\n#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n\n#define DO_WS                           \\\n   {                                    \\\n     FT_ULong  I = (FT_ULong)args[0];   \\\n                                        \\\n                                        \\\n     if ( BOUNDSL( I, CUR.storeSize ) ) \\\n     {                                  \\\n       if ( CUR.pedantic_hinting )      \\\n       {                                \\\n         ARRAY_BOUND_ERROR;             \\\n       }                                \\\n     }                                  \\\n     else                               \\\n       CUR.storage[I] = args[1];        \\\n   }\n\n\n#define DO_RCVT                          \\\n   {                                     \\\n     FT_ULong  I = (FT_ULong)args[0];    \\\n                                         \\\n                                         \\\n     if ( BOUNDSL( I, CUR.cvtSize ) )    \\\n     {                                   \\\n       if ( CUR.pedantic_hinting )       \\\n       {                                 \\\n         ARRAY_BOUND_ERROR;              \\\n       }                                 \\\n       else                              \\\n         args[0] = 0;                    \\\n     }                                   \\\n     else                                \\\n       args[0] = CUR_Func_read_cvt( I ); \\\n   }\n\n\n#define DO_WCVTP                         \\\n   {                                     \\\n     FT_ULong  I = (FT_ULong)args[0];    \\\n                                         \\\n                                         \\\n     if ( BOUNDSL( I, CUR.cvtSize ) )    \\\n     {                                   \\\n       if ( CUR.pedantic_hinting )       \\\n       {                                 \\\n         ARRAY_BOUND_ERROR;              \\\n       }                                 \\\n     }                                   \\\n     else                                \\\n       CUR_Func_write_cvt( I, args[1] ); \\\n   }\n\n\n#define DO_WCVTF                                                \\\n   {                                                            \\\n     FT_ULong  I = (FT_ULong)args[0];                           \\\n                                                                \\\n                                                                \\\n     if ( BOUNDSL( I, CUR.cvtSize ) )                           \\\n     {                                                          \\\n       if ( CUR.pedantic_hinting )                              \\\n       {                                                        \\\n         ARRAY_BOUND_ERROR;                                     \\\n       }                                                        \\\n     }                                                          \\\n     else                                                       \\\n       CUR.cvt[I] = FT_MulFix( args[1], CUR.tt_metrics.scale ); \\\n   }\n\n\n#define DO_DEBUG                          \\\n    CUR.error = FT_THROW( Debug_OpCode );\n\n\n#define DO_ROUND                                                   \\\n    args[0] = CUR_Func_round(                                      \\\n                args[0],                                           \\\n                CUR.tt_metrics.compensations[CUR.opcode - 0x68] );\n\n\n#define DO_NROUND                                                            \\\n    args[0] = ROUND_None( args[0],                                           \\\n                          CUR.tt_metrics.compensations[CUR.opcode - 0x6C] );\n\n\n#define DO_MAX               \\\n    if ( args[1] > args[0] ) \\\n      args[0] = args[1];\n\n\n#define DO_MIN               \\\n    if ( args[1] < args[0] ) \\\n      args[0] = args[1];\n\n\n#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH\n\n\n#undef  ARRAY_BOUND_ERROR\n#define ARRAY_BOUND_ERROR                        \\\n    {                                            \\\n      CUR.error = FT_THROW( Invalid_Reference ); \\\n      return;                                    \\\n    }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SVTCA[a]:     Set (F and P) Vectors to Coordinate Axis                */\n  /* Opcode range: 0x00-0x01                                               */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_SVTCA( INS_ARG )\n  {\n    DO_SVTCA\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SPVTCA[a]:    Set PVector to Coordinate Axis                          */\n  /* Opcode range: 0x02-0x03                                               */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_SPVTCA( INS_ARG )\n  {\n    DO_SPVTCA\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SFVTCA[a]:    Set FVector to Coordinate Axis                          */\n  /* Opcode range: 0x04-0x05                                               */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_SFVTCA( INS_ARG )\n  {\n    DO_SFVTCA\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SPVTL[a]:     Set PVector To Line                                     */\n  /* Opcode range: 0x06-0x07                                               */\n  /* Stack:        uint32 uint32 -->                                       */\n  /*                                                                       */\n  static void\n  Ins_SPVTL( INS_ARG )\n  {\n    DO_SPVTL\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SFVTL[a]:     Set FVector To Line                                     */\n  /* Opcode range: 0x08-0x09                                               */\n  /* Stack:        uint32 uint32 -->                                       */\n  /*                                                                       */\n  static void\n  Ins_SFVTL( INS_ARG )\n  {\n    DO_SFVTL\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SFVTPV[]:     Set FVector To PVector                                  */\n  /* Opcode range: 0x0E                                                    */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_SFVTPV( INS_ARG )\n  {\n    DO_SFVTPV\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SPVFS[]:      Set PVector From Stack                                  */\n  /* Opcode range: 0x0A                                                    */\n  /* Stack:        f2.14 f2.14 -->                                         */\n  /*                                                                       */\n  static void\n  Ins_SPVFS( INS_ARG )\n  {\n    DO_SPVFS\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SFVFS[]:      Set FVector From Stack                                  */\n  /* Opcode range: 0x0B                                                    */\n  /* Stack:        f2.14 f2.14 -->                                         */\n  /*                                                                       */\n  static void\n  Ins_SFVFS( INS_ARG )\n  {\n    DO_SFVFS\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* GPV[]:        Get Projection Vector                                   */\n  /* Opcode range: 0x0C                                                    */\n  /* Stack:        ef2.14 --> ef2.14                                       */\n  /*                                                                       */\n  static void\n  Ins_GPV( INS_ARG )\n  {\n    DO_GPV\n  }\n\n\n  /*************************************************************************/\n  /* GFV[]:        Get Freedom Vector                                      */\n  /* Opcode range: 0x0D                                                    */\n  /* Stack:        ef2.14 --> ef2.14                                       */\n  /*                                                                       */\n  static void\n  Ins_GFV( INS_ARG )\n  {\n    DO_GFV\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SRP0[]:       Set Reference Point 0                                   */\n  /* Opcode range: 0x10                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_SRP0( INS_ARG )\n  {\n    DO_SRP0\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SRP1[]:       Set Reference Point 1                                   */\n  /* Opcode range: 0x11                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_SRP1( INS_ARG )\n  {\n    DO_SRP1\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SRP2[]:       Set Reference Point 2                                   */\n  /* Opcode range: 0x12                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_SRP2( INS_ARG )\n  {\n    DO_SRP2\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* RTHG[]:       Round To Half Grid                                      */\n  /* Opcode range: 0x19                                                    */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_RTHG( INS_ARG )\n  {\n    DO_RTHG\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* RTG[]:        Round To Grid                                           */\n  /* Opcode range: 0x18                                                    */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_RTG( INS_ARG )\n  {\n    DO_RTG\n  }\n\n\n  /*************************************************************************/\n  /* RTDG[]:       Round To Double Grid                                    */\n  /* Opcode range: 0x3D                                                    */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_RTDG( INS_ARG )\n  {\n    DO_RTDG\n  }\n\n\n  /*************************************************************************/\n  /* RUTG[]:       Round Up To Grid                                        */\n  /* Opcode range: 0x7C                                                    */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_RUTG( INS_ARG )\n  {\n    DO_RUTG\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* RDTG[]:       Round Down To Grid                                      */\n  /* Opcode range: 0x7D                                                    */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_RDTG( INS_ARG )\n  {\n    DO_RDTG\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ROFF[]:       Round OFF                                               */\n  /* Opcode range: 0x7A                                                    */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_ROFF( INS_ARG )\n  {\n    DO_ROFF\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SROUND[]:     Super ROUND                                             */\n  /* Opcode range: 0x76                                                    */\n  /* Stack:        Eint8 -->                                               */\n  /*                                                                       */\n  static void\n  Ins_SROUND( INS_ARG )\n  {\n    DO_SROUND\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* S45ROUND[]:   Super ROUND 45 degrees                                  */\n  /* Opcode range: 0x77                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_S45ROUND( INS_ARG )\n  {\n    DO_S45ROUND\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SLOOP[]:      Set LOOP variable                                       */\n  /* Opcode range: 0x17                                                    */\n  /* Stack:        int32? -->                                              */\n  /*                                                                       */\n  static void\n  Ins_SLOOP( INS_ARG )\n  {\n    DO_SLOOP\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SMD[]:        Set Minimum Distance                                    */\n  /* Opcode range: 0x1A                                                    */\n  /* Stack:        f26.6 -->                                               */\n  /*                                                                       */\n  static void\n  Ins_SMD( INS_ARG )\n  {\n    DO_SMD\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SCVTCI[]:     Set Control Value Table Cut In                          */\n  /* Opcode range: 0x1D                                                    */\n  /* Stack:        f26.6 -->                                               */\n  /*                                                                       */\n  static void\n  Ins_SCVTCI( INS_ARG )\n  {\n    DO_SCVTCI\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SSWCI[]:      Set Single Width Cut In                                 */\n  /* Opcode range: 0x1E                                                    */\n  /* Stack:        f26.6 -->                                               */\n  /*                                                                       */\n  static void\n  Ins_SSWCI( INS_ARG )\n  {\n    DO_SSWCI\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SSW[]:        Set Single Width                                        */\n  /* Opcode range: 0x1F                                                    */\n  /* Stack:        int32? -->                                              */\n  /*                                                                       */\n  static void\n  Ins_SSW( INS_ARG )\n  {\n    DO_SSW\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* FLIPON[]:     Set auto-FLIP to ON                                     */\n  /* Opcode range: 0x4D                                                    */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_FLIPON( INS_ARG )\n  {\n    DO_FLIPON\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* FLIPOFF[]:    Set auto-FLIP to OFF                                    */\n  /* Opcode range: 0x4E                                                    */\n  /* Stack: -->                                                            */\n  /*                                                                       */\n  static void\n  Ins_FLIPOFF( INS_ARG )\n  {\n    DO_FLIPOFF\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SANGW[]:      Set ANGle Weight                                        */\n  /* Opcode range: 0x7E                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_SANGW( INS_ARG )\n  {\n    /* instruction not supported anymore */\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SDB[]:        Set Delta Base                                          */\n  /* Opcode range: 0x5E                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_SDB( INS_ARG )\n  {\n    DO_SDB\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SDS[]:        Set Delta Shift                                         */\n  /* Opcode range: 0x5F                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_SDS( INS_ARG )\n  {\n    DO_SDS\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MPPEM[]:      Measure Pixel Per EM                                    */\n  /* Opcode range: 0x4B                                                    */\n  /* Stack:        --> Euint16                                             */\n  /*                                                                       */\n  static void\n  Ins_MPPEM( INS_ARG )\n  {\n    DO_MPPEM\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MPS[]:        Measure Point Size                                      */\n  /* Opcode range: 0x4C                                                    */\n  /* Stack:        --> Euint16                                             */\n  /*                                                                       */\n  static void\n  Ins_MPS( INS_ARG )\n  {\n    DO_MPS\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* DUP[]:        DUPlicate the top stack's element                       */\n  /* Opcode range: 0x20                                                    */\n  /* Stack:        StkElt --> StkElt StkElt                                */\n  /*                                                                       */\n  static void\n  Ins_DUP( INS_ARG )\n  {\n    DO_DUP\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* POP[]:        POP the stack's top element                             */\n  /* Opcode range: 0x21                                                    */\n  /* Stack:        StkElt -->                                              */\n  /*                                                                       */\n  static void\n  Ins_POP( INS_ARG )\n  {\n    /* nothing to do */\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* CLEAR[]:      CLEAR the entire stack                                  */\n  /* Opcode range: 0x22                                                    */\n  /* Stack:        StkElt... -->                                           */\n  /*                                                                       */\n  static void\n  Ins_CLEAR( INS_ARG )\n  {\n    DO_CLEAR\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SWAP[]:       SWAP the stack's top two elements                       */\n  /* Opcode range: 0x23                                                    */\n  /* Stack:        2 * StkElt --> 2 * StkElt                               */\n  /*                                                                       */\n  static void\n  Ins_SWAP( INS_ARG )\n  {\n    DO_SWAP\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* DEPTH[]:      return the stack DEPTH                                  */\n  /* Opcode range: 0x24                                                    */\n  /* Stack:        --> uint32                                              */\n  /*                                                                       */\n  static void\n  Ins_DEPTH( INS_ARG )\n  {\n    DO_DEPTH\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* CINDEX[]:     Copy INDEXed element                                    */\n  /* Opcode range: 0x25                                                    */\n  /* Stack:        int32 --> StkElt                                        */\n  /*                                                                       */\n  static void\n  Ins_CINDEX( INS_ARG )\n  {\n    DO_CINDEX\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* EIF[]:        End IF                                                  */\n  /* Opcode range: 0x59                                                    */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_EIF( INS_ARG )\n  {\n    /* nothing to do */\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* JROT[]:       Jump Relative On True                                   */\n  /* Opcode range: 0x78                                                    */\n  /* Stack:        StkElt int32 -->                                        */\n  /*                                                                       */\n  static void\n  Ins_JROT( INS_ARG )\n  {\n    DO_JROT\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* JMPR[]:       JuMP Relative                                           */\n  /* Opcode range: 0x1C                                                    */\n  /* Stack:        int32 -->                                               */\n  /*                                                                       */\n  static void\n  Ins_JMPR( INS_ARG )\n  {\n    DO_JMPR\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* JROF[]:       Jump Relative On False                                  */\n  /* Opcode range: 0x79                                                    */\n  /* Stack:        StkElt int32 -->                                        */\n  /*                                                                       */\n  static void\n  Ins_JROF( INS_ARG )\n  {\n    DO_JROF\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* LT[]:         Less Than                                               */\n  /* Opcode range: 0x50                                                    */\n  /* Stack:        int32? int32? --> bool                                  */\n  /*                                                                       */\n  static void\n  Ins_LT( INS_ARG )\n  {\n    DO_LT\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* LTEQ[]:       Less Than or EQual                                      */\n  /* Opcode range: 0x51                                                    */\n  /* Stack:        int32? int32? --> bool                                  */\n  /*                                                                       */\n  static void\n  Ins_LTEQ( INS_ARG )\n  {\n    DO_LTEQ\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* GT[]:         Greater Than                                            */\n  /* Opcode range: 0x52                                                    */\n  /* Stack:        int32? int32? --> bool                                  */\n  /*                                                                       */\n  static void\n  Ins_GT( INS_ARG )\n  {\n    DO_GT\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* GTEQ[]:       Greater Than or EQual                                   */\n  /* Opcode range: 0x53                                                    */\n  /* Stack:        int32? int32? --> bool                                  */\n  /*                                                                       */\n  static void\n  Ins_GTEQ( INS_ARG )\n  {\n    DO_GTEQ\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* EQ[]:         EQual                                                   */\n  /* Opcode range: 0x54                                                    */\n  /* Stack:        StkElt StkElt --> bool                                  */\n  /*                                                                       */\n  static void\n  Ins_EQ( INS_ARG )\n  {\n    DO_EQ\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* NEQ[]:        Not EQual                                               */\n  /* Opcode range: 0x55                                                    */\n  /* Stack:        StkElt StkElt --> bool                                  */\n  /*                                                                       */\n  static void\n  Ins_NEQ( INS_ARG )\n  {\n    DO_NEQ\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ODD[]:        Is ODD                                                  */\n  /* Opcode range: 0x56                                                    */\n  /* Stack:        f26.6 --> bool                                          */\n  /*                                                                       */\n  static void\n  Ins_ODD( INS_ARG )\n  {\n    DO_ODD\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* EVEN[]:       Is EVEN                                                 */\n  /* Opcode range: 0x57                                                    */\n  /* Stack:        f26.6 --> bool                                          */\n  /*                                                                       */\n  static void\n  Ins_EVEN( INS_ARG )\n  {\n    DO_EVEN\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* AND[]:        logical AND                                             */\n  /* Opcode range: 0x5A                                                    */\n  /* Stack:        uint32 uint32 --> uint32                                */\n  /*                                                                       */\n  static void\n  Ins_AND( INS_ARG )\n  {\n    DO_AND\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* OR[]:         logical OR                                              */\n  /* Opcode range: 0x5B                                                    */\n  /* Stack:        uint32 uint32 --> uint32                                */\n  /*                                                                       */\n  static void\n  Ins_OR( INS_ARG )\n  {\n    DO_OR\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* NOT[]:        logical NOT                                             */\n  /* Opcode range: 0x5C                                                    */\n  /* Stack:        StkElt --> uint32                                       */\n  /*                                                                       */\n  static void\n  Ins_NOT( INS_ARG )\n  {\n    DO_NOT\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ADD[]:        ADD                                                     */\n  /* Opcode range: 0x60                                                    */\n  /* Stack:        f26.6 f26.6 --> f26.6                                   */\n  /*                                                                       */\n  static void\n  Ins_ADD( INS_ARG )\n  {\n    DO_ADD\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SUB[]:        SUBtract                                                */\n  /* Opcode range: 0x61                                                    */\n  /* Stack:        f26.6 f26.6 --> f26.6                                   */\n  /*                                                                       */\n  static void\n  Ins_SUB( INS_ARG )\n  {\n    DO_SUB\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* DIV[]:        DIVide                                                  */\n  /* Opcode range: 0x62                                                    */\n  /* Stack:        f26.6 f26.6 --> f26.6                                   */\n  /*                                                                       */\n  static void\n  Ins_DIV( INS_ARG )\n  {\n    DO_DIV\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MUL[]:        MULtiply                                                */\n  /* Opcode range: 0x63                                                    */\n  /* Stack:        f26.6 f26.6 --> f26.6                                   */\n  /*                                                                       */\n  static void\n  Ins_MUL( INS_ARG )\n  {\n    DO_MUL\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ABS[]:        ABSolute value                                          */\n  /* Opcode range: 0x64                                                    */\n  /* Stack:        f26.6 --> f26.6                                         */\n  /*                                                                       */\n  static void\n  Ins_ABS( INS_ARG )\n  {\n    DO_ABS\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* NEG[]:        NEGate                                                  */\n  /* Opcode range: 0x65                                                    */\n  /* Stack: f26.6 --> f26.6                                                */\n  /*                                                                       */\n  static void\n  Ins_NEG( INS_ARG )\n  {\n    DO_NEG\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* FLOOR[]:      FLOOR                                                   */\n  /* Opcode range: 0x66                                                    */\n  /* Stack:        f26.6 --> f26.6                                         */\n  /*                                                                       */\n  static void\n  Ins_FLOOR( INS_ARG )\n  {\n    DO_FLOOR\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* CEILING[]:    CEILING                                                 */\n  /* Opcode range: 0x67                                                    */\n  /* Stack:        f26.6 --> f26.6                                         */\n  /*                                                                       */\n  static void\n  Ins_CEILING( INS_ARG )\n  {\n    DO_CEILING\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* RS[]:         Read Store                                              */\n  /* Opcode range: 0x43                                                    */\n  /* Stack:        uint32 --> uint32                                       */\n  /*                                                                       */\n  static void\n  Ins_RS( INS_ARG )\n  {\n    DO_RS\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* WS[]:         Write Store                                             */\n  /* Opcode range: 0x42                                                    */\n  /* Stack:        uint32 uint32 -->                                       */\n  /*                                                                       */\n  static void\n  Ins_WS( INS_ARG )\n  {\n    DO_WS\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* WCVTP[]:      Write CVT in Pixel units                                */\n  /* Opcode range: 0x44                                                    */\n  /* Stack:        f26.6 uint32 -->                                        */\n  /*                                                                       */\n  static void\n  Ins_WCVTP( INS_ARG )\n  {\n    DO_WCVTP\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* WCVTF[]:      Write CVT in Funits                                     */\n  /* Opcode range: 0x70                                                    */\n  /* Stack:        uint32 uint32 -->                                       */\n  /*                                                                       */\n  static void\n  Ins_WCVTF( INS_ARG )\n  {\n    DO_WCVTF\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* RCVT[]:       Read CVT                                                */\n  /* Opcode range: 0x45                                                    */\n  /* Stack:        uint32 --> f26.6                                        */\n  /*                                                                       */\n  static void\n  Ins_RCVT( INS_ARG )\n  {\n    DO_RCVT\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* AA[]:         Adjust Angle                                            */\n  /* Opcode range: 0x7F                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_AA( INS_ARG )\n  {\n    /* intentionally no longer supported */\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* DEBUG[]:      DEBUG.  Unsupported.                                    */\n  /* Opcode range: 0x4F                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  /* Note: The original instruction pops a value from the stack.           */\n  /*                                                                       */\n  static void\n  Ins_DEBUG( INS_ARG )\n  {\n    DO_DEBUG\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ROUND[ab]:    ROUND value                                             */\n  /* Opcode range: 0x68-0x6B                                               */\n  /* Stack:        f26.6 --> f26.6                                         */\n  /*                                                                       */\n  static void\n  Ins_ROUND( INS_ARG )\n  {\n    DO_ROUND\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* NROUND[ab]:   No ROUNDing of value                                    */\n  /* Opcode range: 0x6C-0x6F                                               */\n  /* Stack:        f26.6 --> f26.6                                         */\n  /*                                                                       */\n  static void\n  Ins_NROUND( INS_ARG )\n  {\n    DO_NROUND\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MAX[]:        MAXimum                                                 */\n  /* Opcode range: 0x68                                                    */\n  /* Stack:        int32? int32? --> int32                                 */\n  /*                                                                       */\n  static void\n  Ins_MAX( INS_ARG )\n  {\n    DO_MAX\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MIN[]:        MINimum                                                 */\n  /* Opcode range: 0x69                                                    */\n  /* Stack:        int32? int32? --> int32                                 */\n  /*                                                                       */\n  static void\n  Ins_MIN( INS_ARG )\n  {\n    DO_MIN\n  }\n\n\n#endif  /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The following functions are called as is within the switch statement. */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MINDEX[]:     Move INDEXed element                                    */\n  /* Opcode range: 0x26                                                    */\n  /* Stack:        int32? --> StkElt                                       */\n  /*                                                                       */\n  static void\n  Ins_MINDEX( INS_ARG )\n  {\n    FT_Long  L, K;\n\n\n    L = args[0];\n\n    if ( L <= 0 || L > CUR.args )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n    }\n    else\n    {\n      K = CUR.stack[CUR.args - L];\n\n      FT_ARRAY_MOVE( &CUR.stack[CUR.args - L    ],\n                     &CUR.stack[CUR.args - L + 1],\n                     ( L - 1 ) );\n\n      CUR.stack[CUR.args - 1] = K;\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ROLL[]:       ROLL top three elements                                 */\n  /* Opcode range: 0x8A                                                    */\n  /* Stack:        3 * StkElt --> 3 * StkElt                               */\n  /*                                                                       */\n  static void\n  Ins_ROLL( INS_ARG )\n  {\n    FT_Long  A, B, C;\n\n    FT_UNUSED_EXEC;\n\n\n    A = args[2];\n    B = args[1];\n    C = args[0];\n\n    args[2] = C;\n    args[1] = A;\n    args[0] = B;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MANAGING THE FLOW OF CONTROL                                          */\n  /*                                                                       */\n  /*   Instructions appear in the specification's order.                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  static FT_Bool\n  SkipCode( EXEC_OP )\n  {\n    CUR.IP += CUR.length;\n\n    if ( CUR.IP < CUR.codeSize )\n    {\n      CUR.opcode = CUR.code[CUR.IP];\n\n      CUR.length = opcode_length[CUR.opcode];\n      if ( CUR.length < 0 )\n      {\n        if ( CUR.IP + 1 >= CUR.codeSize )\n          goto Fail_Overflow;\n        CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1];\n      }\n\n      if ( CUR.IP + CUR.length <= CUR.codeSize )\n        return SUCCESS;\n    }\n\n  Fail_Overflow:\n    CUR.error = FT_THROW( Code_Overflow );\n    return FAILURE;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* IF[]:         IF test                                                 */\n  /* Opcode range: 0x58                                                    */\n  /* Stack:        StkElt -->                                              */\n  /*                                                                       */\n  static void\n  Ins_IF( INS_ARG )\n  {\n    FT_Int   nIfs;\n    FT_Bool  Out;\n\n\n    if ( args[0] != 0 )\n      return;\n\n    nIfs = 1;\n    Out = 0;\n\n    do\n    {\n      if ( SKIP_Code() == FAILURE )\n        return;\n\n      switch ( CUR.opcode )\n      {\n      case 0x58:      /* IF */\n        nIfs++;\n        break;\n\n      case 0x1B:      /* ELSE */\n        Out = FT_BOOL( nIfs == 1 );\n        break;\n\n      case 0x59:      /* EIF */\n        nIfs--;\n        Out = FT_BOOL( nIfs == 0 );\n        break;\n      }\n    } while ( Out == 0 );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ELSE[]:       ELSE                                                    */\n  /* Opcode range: 0x1B                                                    */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_ELSE( INS_ARG )\n  {\n    FT_Int  nIfs;\n\n    FT_UNUSED_ARG;\n\n\n    nIfs = 1;\n\n    do\n    {\n      if ( SKIP_Code() == FAILURE )\n        return;\n\n      switch ( CUR.opcode )\n      {\n      case 0x58:    /* IF */\n        nIfs++;\n        break;\n\n      case 0x59:    /* EIF */\n        nIfs--;\n        break;\n      }\n    } while ( nIfs != 0 );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* DEFINING AND USING FUNCTIONS AND INSTRUCTIONS                         */\n  /*                                                                       */\n  /*   Instructions appear in the specification's order.                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* FDEF[]:       Function DEFinition                                     */\n  /* Opcode range: 0x2C                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_FDEF( INS_ARG )\n  {\n    FT_ULong       n;\n    TT_DefRecord*  rec;\n    TT_DefRecord*  limit;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    /* arguments to opcodes are skipped by `SKIP_Code' */\n    FT_Byte    opcode_pattern[9][12] = {\n                 /* #0 inline delta function 1 */\n                 {\n                   0x4B, /* PPEM    */\n                   0x53, /* GTEQ    */\n                   0x23, /* SWAP    */\n                   0x4B, /* PPEM    */\n                   0x51, /* LTEQ    */\n                   0x5A, /* AND     */\n                   0x58, /* IF      */\n                   0x38, /*   SHPIX */\n                   0x1B, /* ELSE    */\n                   0x21, /*   POP   */\n                   0x21, /*   POP   */\n                   0x59  /* EIF     */\n                 },\n                 /* #1 inline delta function 2 */\n                 {\n                   0x4B, /* PPEM    */\n                   0x54, /* EQ      */\n                   0x58, /* IF      */\n                   0x38, /*   SHPIX */\n                   0x1B, /* ELSE    */\n                   0x21, /*   POP   */\n                   0x21, /*   POP   */\n                   0x59  /* EIF     */\n                 },\n                 /* #2 diagonal stroke function */\n                 {\n                   0x20, /* DUP     */\n                   0x20, /* DUP     */\n                   0xB0, /* PUSHB_1 */\n                         /*   1     */\n                   0x60, /* ADD     */\n                   0x46, /* GC_cur  */\n                   0xB0, /* PUSHB_1 */\n                         /*   64    */\n                   0x23, /* SWAP    */\n                   0x42  /* WS      */\n                 },\n                 /* #3 VacuFormRound function */\n                 {\n                   0x45, /* RCVT    */\n                   0x23, /* SWAP    */\n                   0x46, /* GC_cur  */\n                   0x60, /* ADD     */\n                   0x20, /* DUP     */\n                   0xB0  /* PUSHB_1 */\n                         /*   38    */\n                 },\n                 /* #4 TTFautohint bytecode (old) */\n                 {\n                   0x20, /* DUP     */\n                   0x64, /* ABS     */\n                   0xB0, /* PUSHB_1 */\n                         /*   32    */\n                   0x60, /* ADD     */\n                   0x66, /* FLOOR   */\n                   0x23, /* SWAP    */\n                   0xB0  /* PUSHB_1 */\n                 },\n                 /* #5 spacing function 1 */\n                 {\n                   0x01, /* SVTCA_x */\n                   0xB0, /* PUSHB_1 */\n                         /*   24    */\n                   0x43, /* RS      */\n                   0x58  /* IF      */\n                 },\n                 /* #6 spacing function 2 */\n                 {\n                   0x01, /* SVTCA_x */\n                   0x18, /* RTG     */\n                   0xB0, /* PUSHB_1 */\n                         /*   24    */\n                   0x43, /* RS      */\n                   0x58  /* IF      */\n                 },\n                 /* #7 TypeMan Talk DiagEndCtrl function */\n                 {\n                   0x01, /* SVTCA_x */\n                   0x20, /* DUP     */\n                   0xB0, /* PUSHB_1 */\n                         /*   3     */\n                   0x25, /* CINDEX  */\n                 },\n                 /* #8 TypeMan Talk Align */\n                 {\n                   0x06, /* SPVTL   */\n                   0x7D, /* RDTG    */\n                 },\n               };\n    FT_UShort  opcode_patterns   = 9;\n    FT_UShort  opcode_pointer[9] = {  0, 0, 0, 0, 0, 0, 0, 0, 0 };\n    FT_UShort  opcode_size[9]    = { 12, 8, 8, 6, 7, 4, 5, 4, 2 };\n    FT_UShort  i;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n\n    /* some font programs are broken enough to redefine functions! */\n    /* We will then parse the current table.                       */\n\n    rec   = CUR.FDefs;\n    limit = rec + CUR.numFDefs;\n    n     = args[0];\n\n    for ( ; rec < limit; rec++ )\n    {\n      if ( rec->opc == n )\n        break;\n    }\n\n    if ( rec == limit )\n    {\n      /* check that there is enough room for new functions */\n      if ( CUR.numFDefs >= CUR.maxFDefs )\n      {\n        CUR.error = FT_THROW( Too_Many_Function_Defs );\n        return;\n      }\n      CUR.numFDefs++;\n    }\n\n    /* Although FDEF takes unsigned 32-bit integer,  */\n    /* func # must be within unsigned 16-bit integer */\n    if ( n > 0xFFFFU )\n    {\n      CUR.error = FT_THROW( Too_Many_Function_Defs );\n      return;\n    }\n\n    rec->range          = CUR.curRange;\n    rec->opc            = (FT_UInt16)n;\n    rec->start          = CUR.IP + 1;\n    rec->active         = TRUE;\n    rec->inline_delta   = FALSE;\n    rec->sph_fdef_flags = 0x0000;\n\n    if ( n > CUR.maxFunc )\n      CUR.maxFunc = (FT_UInt16)n;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    /* We don't know for sure these are typeman functions, */\n    /* however they are only active when RS 22 is called   */\n    if ( n >= 64 && n <= 66 )\n      rec->sph_fdef_flags |= SPH_FDEF_TYPEMAN_STROKES;\n#endif\n\n    /* Now skip the whole function definition. */\n    /* We don't allow nested IDEFS & FDEFs.    */\n\n    while ( SKIP_Code() == SUCCESS )\n    {\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n\n      if ( SUBPIXEL_HINTING )\n      {\n        for ( i = 0; i < opcode_patterns; i++ )\n        {\n          if ( opcode_pointer[i] < opcode_size[i]                 &&\n               CUR.opcode == opcode_pattern[i][opcode_pointer[i]] )\n          {\n            opcode_pointer[i] += 1;\n\n            if ( opcode_pointer[i] == opcode_size[i] )\n            {\n              FT_TRACE7(( \"sph: Function %d, opcode ptrn: %d, %s %s\\n\",\n                          i, n,\n                          CUR.face->root.family_name,\n                          CUR.face->root.style_name ));\n\n              switch ( i )\n              {\n              case 0:\n                rec->sph_fdef_flags            |= SPH_FDEF_INLINE_DELTA_1;\n                CUR.face->sph_found_func_flags |= SPH_FDEF_INLINE_DELTA_1;\n                break;\n\n              case 1:\n                rec->sph_fdef_flags            |= SPH_FDEF_INLINE_DELTA_2;\n                CUR.face->sph_found_func_flags |= SPH_FDEF_INLINE_DELTA_2;\n                break;\n\n              case 2:\n                switch ( n )\n                {\n                  /* needs to be implemented still */\n                case 58:\n                  rec->sph_fdef_flags            |= SPH_FDEF_DIAGONAL_STROKE;\n                  CUR.face->sph_found_func_flags |= SPH_FDEF_DIAGONAL_STROKE;\n                }\n                break;\n\n              case 3:\n                switch ( n )\n                {\n                case 0:\n                  rec->sph_fdef_flags            |= SPH_FDEF_VACUFORM_ROUND_1;\n                  CUR.face->sph_found_func_flags |= SPH_FDEF_VACUFORM_ROUND_1;\n                }\n                break;\n\n              case 4:\n                /* probably not necessary to detect anymore */\n                rec->sph_fdef_flags            |= SPH_FDEF_TTFAUTOHINT_1;\n                CUR.face->sph_found_func_flags |= SPH_FDEF_TTFAUTOHINT_1;\n                break;\n\n              case 5:\n                switch ( n )\n                {\n                case 0:\n                case 1:\n                case 2:\n                case 4:\n                case 7:\n                case 8:\n                  rec->sph_fdef_flags            |= SPH_FDEF_SPACING_1;\n                  CUR.face->sph_found_func_flags |= SPH_FDEF_SPACING_1;\n                }\n                break;\n\n              case 6:\n                switch ( n )\n                {\n                case 0:\n                case 1:\n                case 2:\n                case 4:\n                case 7:\n                case 8:\n                  rec->sph_fdef_flags            |= SPH_FDEF_SPACING_2;\n                  CUR.face->sph_found_func_flags |= SPH_FDEF_SPACING_2;\n                }\n                break;\n\n               case 7:\n                 rec->sph_fdef_flags            |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;\n                 CUR.face->sph_found_func_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;\n                 break;\n\n               case 8:\n#if 0\n                 rec->sph_fdef_flags            |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;\n                 CUR.face->sph_found_func_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;\n#endif\n                 break;\n              }\n              opcode_pointer[i] = 0;\n            }\n          }\n\n          else\n            opcode_pointer[i] = 0;\n        }\n\n        /* Set sph_compatibility_mode only when deltas are detected */\n        CUR.face->sph_compatibility_mode =\n          ( ( CUR.face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_1 ) |\n            ( CUR.face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_2 ) );\n      }\n\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n      switch ( CUR.opcode )\n      {\n      case 0x89:    /* IDEF */\n      case 0x2C:    /* FDEF */\n        CUR.error = FT_THROW( Nested_DEFS );\n        return;\n\n      case 0x2D:   /* ENDF */\n        rec->end = CUR.IP;\n        return;\n      }\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ENDF[]:       END Function definition                                 */\n  /* Opcode range: 0x2D                                                    */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_ENDF( INS_ARG )\n  {\n    TT_CallRec*  pRec;\n\n    FT_UNUSED_ARG;\n\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    CUR.sph_in_func_flags = 0x0000;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    if ( CUR.callTop <= 0 )     /* We encountered an ENDF without a call */\n    {\n      CUR.error = FT_THROW( ENDF_In_Exec_Stream );\n      return;\n    }\n\n    CUR.callTop--;\n\n    pRec = &CUR.callStack[CUR.callTop];\n\n    pRec->Cur_Count--;\n\n    CUR.step_ins = FALSE;\n\n    if ( pRec->Cur_Count > 0 )\n    {\n      CUR.callTop++;\n      CUR.IP = pRec->Cur_Restart;\n    }\n    else\n      /* Loop through the current function */\n      INS_Goto_CodeRange( pRec->Caller_Range,\n                          pRec->Caller_IP );\n\n    /* Exit the current call frame.                      */\n\n    /* NOTE: If the last instruction of a program is a   */\n    /*       CALL or LOOPCALL, the return address is     */\n    /*       always out of the code range.  This is a    */\n    /*       valid address, and it is why we do not test */\n    /*       the result of Ins_Goto_CodeRange() here!    */\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* CALL[]:       CALL function                                           */\n  /* Opcode range: 0x2B                                                    */\n  /* Stack:        uint32? -->                                             */\n  /*                                                                       */\n  static void\n  Ins_CALL( INS_ARG )\n  {\n    FT_ULong       F;\n    TT_CallRec*    pCrec;\n    TT_DefRecord*  def;\n\n\n    /* first of all, check the index */\n\n    F = args[0];\n    if ( BOUNDSL( F, CUR.maxFunc + 1 ) )\n      goto Fail;\n\n    /* Except for some old Apple fonts, all functions in a TrueType */\n    /* font are defined in increasing order, starting from 0.  This */\n    /* means that we normally have                                  */\n    /*                                                              */\n    /*    CUR.maxFunc+1 == CUR.numFDefs                             */\n    /*    CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc             */\n    /*                                                              */\n    /* If this isn't true, we need to look up the function table.   */\n\n    def = CUR.FDefs + F;\n    if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F )\n    {\n      /* look up the FDefs table */\n      TT_DefRecord*  limit;\n\n\n      def   = CUR.FDefs;\n      limit = def + CUR.numFDefs;\n\n      while ( def < limit && def->opc != F )\n        def++;\n\n      if ( def == limit )\n        goto Fail;\n    }\n\n    /* check that the function is active */\n    if ( !def->active )\n      goto Fail;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    if ( SUBPIXEL_HINTING                                              &&\n         CUR.ignore_x_mode                                             &&\n         ( ( CUR.iup_called                                        &&\n             ( CUR.sph_tweak_flags & SPH_TWEAK_NO_CALL_AFTER_IUP ) ) ||\n           ( def->sph_fdef_flags & SPH_FDEF_VACUFORM_ROUND_1 )       ) )\n      goto Fail;\n    else\n      CUR.sph_in_func_flags = def->sph_fdef_flags;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    /* check the call stack */\n    if ( CUR.callTop >= CUR.callSize )\n    {\n      CUR.error = FT_THROW( Stack_Overflow );\n      return;\n    }\n\n    pCrec = CUR.callStack + CUR.callTop;\n\n    pCrec->Caller_Range = CUR.curRange;\n    pCrec->Caller_IP    = CUR.IP + 1;\n    pCrec->Cur_Count    = 1;\n    pCrec->Cur_Restart  = def->start;\n    pCrec->Cur_End      = def->end;\n\n    CUR.callTop++;\n\n    INS_Goto_CodeRange( def->range,\n                        def->start );\n\n    CUR.step_ins = FALSE;\n\n    return;\n\n  Fail:\n    CUR.error = FT_THROW( Invalid_Reference );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* LOOPCALL[]:   LOOP and CALL function                                  */\n  /* Opcode range: 0x2A                                                    */\n  /* Stack:        uint32? Eint16? -->                                     */\n  /*                                                                       */\n  static void\n  Ins_LOOPCALL( INS_ARG )\n  {\n    FT_ULong       F;\n    TT_CallRec*    pCrec;\n    TT_DefRecord*  def;\n\n\n    /* first of all, check the index */\n    F = args[1];\n    if ( BOUNDSL( F, CUR.maxFunc + 1 ) )\n      goto Fail;\n\n    /* Except for some old Apple fonts, all functions in a TrueType */\n    /* font are defined in increasing order, starting from 0.  This */\n    /* means that we normally have                                  */\n    /*                                                              */\n    /*    CUR.maxFunc+1 == CUR.numFDefs                             */\n    /*    CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc             */\n    /*                                                              */\n    /* If this isn't true, we need to look up the function table.   */\n\n    def = CUR.FDefs + F;\n    if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F )\n    {\n      /* look up the FDefs table */\n      TT_DefRecord*  limit;\n\n\n      def   = CUR.FDefs;\n      limit = def + CUR.numFDefs;\n\n      while ( def < limit && def->opc != F )\n        def++;\n\n      if ( def == limit )\n        goto Fail;\n    }\n\n    /* check that the function is active */\n    if ( !def->active )\n      goto Fail;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    if ( SUBPIXEL_HINTING                                    &&\n         CUR.ignore_x_mode                                   &&\n         ( def->sph_fdef_flags & SPH_FDEF_VACUFORM_ROUND_1 ) )\n      goto Fail;\n    else\n      CUR.sph_in_func_flags = def->sph_fdef_flags;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    /* check stack */\n    if ( CUR.callTop >= CUR.callSize )\n    {\n      CUR.error = FT_THROW( Stack_Overflow );\n      return;\n    }\n\n    if ( args[0] > 0 )\n    {\n      pCrec = CUR.callStack + CUR.callTop;\n\n      pCrec->Caller_Range = CUR.curRange;\n      pCrec->Caller_IP    = CUR.IP + 1;\n      pCrec->Cur_Count    = (FT_Int)args[0];\n      pCrec->Cur_Restart  = def->start;\n      pCrec->Cur_End      = def->end;\n\n      CUR.callTop++;\n\n      INS_Goto_CodeRange( def->range, def->start );\n\n      CUR.step_ins = FALSE;\n    }\n\n    return;\n\n  Fail:\n    CUR.error = FT_THROW( Invalid_Reference );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* IDEF[]:       Instruction DEFinition                                  */\n  /* Opcode range: 0x89                                                    */\n  /* Stack:        Eint8 -->                                               */\n  /*                                                                       */\n  static void\n  Ins_IDEF( INS_ARG )\n  {\n    TT_DefRecord*  def;\n    TT_DefRecord*  limit;\n\n\n    /*  First of all, look for the same function in our table */\n\n    def   = CUR.IDefs;\n    limit = def + CUR.numIDefs;\n\n    for ( ; def < limit; def++ )\n      if ( def->opc == (FT_ULong)args[0] )\n        break;\n\n    if ( def == limit )\n    {\n      /* check that there is enough room for a new instruction */\n      if ( CUR.numIDefs >= CUR.maxIDefs )\n      {\n        CUR.error = FT_THROW( Too_Many_Instruction_Defs );\n        return;\n      }\n      CUR.numIDefs++;\n    }\n\n    /* opcode must be unsigned 8-bit integer */\n    if ( 0 > args[0] || args[0] > 0x00FF )\n    {\n      CUR.error = FT_THROW( Too_Many_Instruction_Defs );\n      return;\n    }\n\n    def->opc    = (FT_Byte)args[0];\n    def->start  = CUR.IP + 1;\n    def->range  = CUR.curRange;\n    def->active = TRUE;\n\n    if ( (FT_ULong)args[0] > CUR.maxIns )\n      CUR.maxIns = (FT_Byte)args[0];\n\n    /* Now skip the whole function definition. */\n    /* We don't allow nested IDEFs & FDEFs.    */\n\n    while ( SKIP_Code() == SUCCESS )\n    {\n      switch ( CUR.opcode )\n      {\n      case 0x89:   /* IDEF */\n      case 0x2C:   /* FDEF */\n        CUR.error = FT_THROW( Nested_DEFS );\n        return;\n      case 0x2D:   /* ENDF */\n        return;\n      }\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* PUSHING DATA ONTO THE INTERPRETER STACK                               */\n  /*                                                                       */\n  /*   Instructions appear in the specification's order.                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* NPUSHB[]:     PUSH N Bytes                                            */\n  /* Opcode range: 0x40                                                    */\n  /* Stack:        --> uint32...                                           */\n  /*                                                                       */\n  static void\n  Ins_NPUSHB( INS_ARG )\n  {\n    FT_UShort  L, K;\n\n\n    L = (FT_UShort)CUR.code[CUR.IP + 1];\n\n    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )\n    {\n      CUR.error = FT_THROW( Stack_Overflow );\n      return;\n    }\n\n    for ( K = 1; K <= L; K++ )\n      args[K - 1] = CUR.code[CUR.IP + K + 1];\n\n    CUR.new_top += L;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* NPUSHW[]:     PUSH N Words                                            */\n  /* Opcode range: 0x41                                                    */\n  /* Stack:        --> int32...                                            */\n  /*                                                                       */\n  static void\n  Ins_NPUSHW( INS_ARG )\n  {\n    FT_UShort  L, K;\n\n\n    L = (FT_UShort)CUR.code[CUR.IP + 1];\n\n    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )\n    {\n      CUR.error = FT_THROW( Stack_Overflow );\n      return;\n    }\n\n    CUR.IP += 2;\n\n    for ( K = 0; K < L; K++ )\n      args[K] = GET_ShortIns();\n\n    CUR.step_ins = FALSE;\n    CUR.new_top += L;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* PUSHB[abc]:   PUSH Bytes                                              */\n  /* Opcode range: 0xB0-0xB7                                               */\n  /* Stack:        --> uint32...                                           */\n  /*                                                                       */\n  static void\n  Ins_PUSHB( INS_ARG )\n  {\n    FT_UShort  L, K;\n\n\n    L = (FT_UShort)( CUR.opcode - 0xB0 + 1 );\n\n    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )\n    {\n      CUR.error = FT_THROW( Stack_Overflow );\n      return;\n    }\n\n    for ( K = 1; K <= L; K++ )\n      args[K - 1] = CUR.code[CUR.IP + K];\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* PUSHW[abc]:   PUSH Words                                              */\n  /* Opcode range: 0xB8-0xBF                                               */\n  /* Stack:        --> int32...                                            */\n  /*                                                                       */\n  static void\n  Ins_PUSHW( INS_ARG )\n  {\n    FT_UShort  L, K;\n\n\n    L = (FT_UShort)( CUR.opcode - 0xB8 + 1 );\n\n    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )\n    {\n      CUR.error = FT_THROW( Stack_Overflow );\n      return;\n    }\n\n    CUR.IP++;\n\n    for ( K = 0; K < L; K++ )\n      args[K] = GET_ShortIns();\n\n    CUR.step_ins = FALSE;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MANAGING THE GRAPHICS STATE                                           */\n  /*                                                                       */\n  /*  Instructions appear in the specs' order.                             */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* GC[a]:        Get Coordinate projected onto                           */\n  /* Opcode range: 0x46-0x47                                               */\n  /* Stack:        uint32 --> f26.6                                        */\n  /*                                                                       */\n  /* XXX: UNDOCUMENTED: Measures from the original glyph must be taken     */\n  /*      along the dual projection vector!                                */\n  /*                                                                       */\n  static void\n  Ins_GC( INS_ARG )\n  {\n    FT_ULong    L;\n    FT_F26Dot6  R;\n\n\n    L = (FT_ULong)args[0];\n\n    if ( BOUNDSL( L, CUR.zp2.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      R = 0;\n    }\n    else\n    {\n      if ( CUR.opcode & 1 )\n        R = CUR_fast_dualproj( &CUR.zp2.org[L] );\n      else\n        R = CUR_fast_project( &CUR.zp2.cur[L] );\n    }\n\n    args[0] = R;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SCFS[]:       Set Coordinate From Stack                               */\n  /* Opcode range: 0x48                                                    */\n  /* Stack:        f26.6 uint32 -->                                        */\n  /*                                                                       */\n  /* Formula:                                                              */\n  /*                                                                       */\n  /*   OA := OA + ( value - OA.p )/( f.p ) * f                             */\n  /*                                                                       */\n  static void\n  Ins_SCFS( INS_ARG )\n  {\n    FT_Long    K;\n    FT_UShort  L;\n\n\n    L = (FT_UShort)args[0];\n\n    if ( BOUNDS( L, CUR.zp2.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    K = CUR_fast_project( &CUR.zp2.cur[L] );\n\n    CUR_Func_move( &CUR.zp2, L, args[1] - K );\n\n    /* UNDOCUMENTED!  The MS rasterizer does that with */\n    /* twilight points (confirmed by Greg Hitchcock)   */\n    if ( CUR.GS.gep2 == 0 )\n      CUR.zp2.org[L] = CUR.zp2.cur[L];\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MD[a]:        Measure Distance                                        */\n  /* Opcode range: 0x49-0x4A                                               */\n  /* Stack:        uint32 uint32 --> f26.6                                 */\n  /*                                                                       */\n  /* XXX: UNDOCUMENTED: Measure taken in the original glyph must be along  */\n  /*                    the dual projection vector.                        */\n  /*                                                                       */\n  /* XXX: UNDOCUMENTED: Flag attributes are inverted!                      */\n  /*                      0 => measure distance in original outline        */\n  /*                      1 => measure distance in grid-fitted outline     */\n  /*                                                                       */\n  /* XXX: UNDOCUMENTED: `zp0 - zp1', and not `zp2 - zp1!                   */\n  /*                                                                       */\n  static void\n  Ins_MD( INS_ARG )\n  {\n    FT_UShort   K, L;\n    FT_F26Dot6  D;\n\n\n    K = (FT_UShort)args[1];\n    L = (FT_UShort)args[0];\n\n    if ( BOUNDS( L, CUR.zp0.n_points ) ||\n         BOUNDS( K, CUR.zp1.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      D = 0;\n    }\n    else\n    {\n      if ( CUR.opcode & 1 )\n        D = CUR_Func_project( CUR.zp0.cur + L, CUR.zp1.cur + K );\n      else\n      {\n        /* XXX: UNDOCUMENTED: twilight zone special case */\n\n        if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 )\n        {\n          FT_Vector*  vec1 = CUR.zp0.org + L;\n          FT_Vector*  vec2 = CUR.zp1.org + K;\n\n\n          D = CUR_Func_dualproj( vec1, vec2 );\n        }\n        else\n        {\n          FT_Vector*  vec1 = CUR.zp0.orus + L;\n          FT_Vector*  vec2 = CUR.zp1.orus + K;\n\n\n          if ( CUR.metrics.x_scale == CUR.metrics.y_scale )\n          {\n            /* this should be faster */\n            D = CUR_Func_dualproj( vec1, vec2 );\n            D = FT_MulFix( D, CUR.metrics.x_scale );\n          }\n          else\n          {\n            FT_Vector  vec;\n\n\n            vec.x = FT_MulFix( vec1->x - vec2->x, CUR.metrics.x_scale );\n            vec.y = FT_MulFix( vec1->y - vec2->y, CUR.metrics.y_scale );\n\n            D = CUR_fast_dualproj( &vec );\n          }\n        }\n      }\n    }\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    /* Disable Type 2 Vacuform Rounds - e.g. Arial Narrow */\n    if ( SUBPIXEL_HINTING                       &&\n         CUR.ignore_x_mode && FT_ABS( D ) == 64 )\n      D += 1;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    args[0] = D;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SDPVTL[a]:    Set Dual PVector to Line                                */\n  /* Opcode range: 0x86-0x87                                               */\n  /* Stack:        uint32 uint32 -->                                       */\n  /*                                                                       */\n  static void\n  Ins_SDPVTL( INS_ARG )\n  {\n    FT_Long    A, B, C;\n    FT_UShort  p1, p2;            /* was FT_Int in pas type ERROR */\n    FT_Int     aOpc = CUR.opcode;\n\n\n    p1 = (FT_UShort)args[1];\n    p2 = (FT_UShort)args[0];\n\n    if ( BOUNDS( p2, CUR.zp1.n_points ) ||\n         BOUNDS( p1, CUR.zp2.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    {\n      FT_Vector* v1 = CUR.zp1.org + p2;\n      FT_Vector* v2 = CUR.zp2.org + p1;\n\n\n      A = v1->x - v2->x;\n      B = v1->y - v2->y;\n\n      /* If v1 == v2, SDPVTL behaves the same as */\n      /* SVTCA[X], respectively.                 */\n      /*                                         */\n      /* Confirmed by Greg Hitchcock.            */\n\n      if ( A == 0 && B == 0 )\n      {\n        A    = 0x4000;\n        aOpc = 0;\n      }\n    }\n\n    if ( ( aOpc & 1 ) != 0 )\n    {\n      C =  B;   /* counter clockwise rotation */\n      B =  A;\n      A = -C;\n    }\n\n    NORMalize( A, B, &CUR.GS.dualVector );\n\n    {\n      FT_Vector*  v1 = CUR.zp1.cur + p2;\n      FT_Vector*  v2 = CUR.zp2.cur + p1;\n\n\n      A = v1->x - v2->x;\n      B = v1->y - v2->y;\n\n      if ( A == 0 && B == 0 )\n      {\n        A    = 0x4000;\n        aOpc = 0;\n      }\n    }\n\n    if ( ( aOpc & 1 ) != 0 )\n    {\n      C =  B;   /* counter clockwise rotation */\n      B =  A;\n      A = -C;\n    }\n\n    NORMalize( A, B, &CUR.GS.projVector );\n\n    GUESS_VECTOR( freeVector );\n\n    COMPUTE_Funcs();\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SZP0[]:       Set Zone Pointer 0                                      */\n  /* Opcode range: 0x13                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_SZP0( INS_ARG )\n  {\n    switch ( (FT_Int)args[0] )\n    {\n    case 0:\n      CUR.zp0 = CUR.twilight;\n      break;\n\n    case 1:\n      CUR.zp0 = CUR.pts;\n      break;\n\n    default:\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    CUR.GS.gep0 = (FT_UShort)args[0];\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SZP1[]:       Set Zone Pointer 1                                      */\n  /* Opcode range: 0x14                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_SZP1( INS_ARG )\n  {\n    switch ( (FT_Int)args[0] )\n    {\n    case 0:\n      CUR.zp1 = CUR.twilight;\n      break;\n\n    case 1:\n      CUR.zp1 = CUR.pts;\n      break;\n\n    default:\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    CUR.GS.gep1 = (FT_UShort)args[0];\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SZP2[]:       Set Zone Pointer 2                                      */\n  /* Opcode range: 0x15                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_SZP2( INS_ARG )\n  {\n    switch ( (FT_Int)args[0] )\n    {\n    case 0:\n      CUR.zp2 = CUR.twilight;\n      break;\n\n    case 1:\n      CUR.zp2 = CUR.pts;\n      break;\n\n    default:\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    CUR.GS.gep2 = (FT_UShort)args[0];\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SZPS[]:       Set Zone PointerS                                       */\n  /* Opcode range: 0x16                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_SZPS( INS_ARG )\n  {\n    switch ( (FT_Int)args[0] )\n    {\n    case 0:\n      CUR.zp0 = CUR.twilight;\n      break;\n\n    case 1:\n      CUR.zp0 = CUR.pts;\n      break;\n\n    default:\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    CUR.zp1 = CUR.zp0;\n    CUR.zp2 = CUR.zp0;\n\n    CUR.GS.gep0 = (FT_UShort)args[0];\n    CUR.GS.gep1 = (FT_UShort)args[0];\n    CUR.GS.gep2 = (FT_UShort)args[0];\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* INSTCTRL[]:   INSTruction ConTRoL                                     */\n  /* Opcode range: 0x8e                                                    */\n  /* Stack:        int32 int32 -->                                         */\n  /*                                                                       */\n  static void\n  Ins_INSTCTRL( INS_ARG )\n  {\n    FT_Long  K, L;\n\n\n    K = args[1];\n    L = args[0];\n\n    if ( K < 1 || K > 2 )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    if ( L != 0 )\n        L = K;\n\n    CUR.GS.instruct_control = FT_BOOL(\n      ( (FT_Byte)CUR.GS.instruct_control & ~(FT_Byte)K ) | (FT_Byte)L );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SCANCTRL[]:   SCAN ConTRoL                                            */\n  /* Opcode range: 0x85                                                    */\n  /* Stack:        uint32? -->                                             */\n  /*                                                                       */\n  static void\n  Ins_SCANCTRL( INS_ARG )\n  {\n    FT_Int  A;\n\n\n    /* Get Threshold */\n    A = (FT_Int)( args[0] & 0xFF );\n\n    if ( A == 0xFF )\n    {\n      CUR.GS.scan_control = TRUE;\n      return;\n    }\n    else if ( A == 0 )\n    {\n      CUR.GS.scan_control = FALSE;\n      return;\n    }\n\n    if ( ( args[0] & 0x100 ) != 0 && CUR.tt_metrics.ppem <= A )\n      CUR.GS.scan_control = TRUE;\n\n    if ( ( args[0] & 0x200 ) != 0 && CUR.tt_metrics.rotated )\n      CUR.GS.scan_control = TRUE;\n\n    if ( ( args[0] & 0x400 ) != 0 && CUR.tt_metrics.stretched )\n      CUR.GS.scan_control = TRUE;\n\n    if ( ( args[0] & 0x800 ) != 0 && CUR.tt_metrics.ppem > A )\n      CUR.GS.scan_control = FALSE;\n\n    if ( ( args[0] & 0x1000 ) != 0 && CUR.tt_metrics.rotated )\n      CUR.GS.scan_control = FALSE;\n\n    if ( ( args[0] & 0x2000 ) != 0 && CUR.tt_metrics.stretched )\n      CUR.GS.scan_control = FALSE;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SCANTYPE[]:   SCAN TYPE                                               */\n  /* Opcode range: 0x8D                                                    */\n  /* Stack:        uint32? -->                                             */\n  /*                                                                       */\n  static void\n  Ins_SCANTYPE( INS_ARG )\n  {\n    if ( args[0] >= 0 )\n      CUR.GS.scan_type = (FT_Int)args[0];\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MANAGING OUTLINES                                                     */\n  /*                                                                       */\n  /*   Instructions appear in the specification's order.                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* FLIPPT[]:     FLIP PoinT                                              */\n  /* Opcode range: 0x80                                                    */\n  /* Stack:        uint32... -->                                           */\n  /*                                                                       */\n  static void\n  Ins_FLIPPT( INS_ARG )\n  {\n    FT_UShort  point;\n\n    FT_UNUSED_ARG;\n\n\n    if ( CUR.top < CUR.GS.loop )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Too_Few_Arguments );\n      goto Fail;\n    }\n\n    while ( CUR.GS.loop > 0 )\n    {\n      CUR.args--;\n\n      point = (FT_UShort)CUR.stack[CUR.args];\n\n      if ( BOUNDS( point, CUR.pts.n_points ) )\n      {\n        if ( CUR.pedantic_hinting )\n        {\n          CUR.error = FT_THROW( Invalid_Reference );\n          return;\n        }\n      }\n      else\n        CUR.pts.tags[point] ^= FT_CURVE_TAG_ON;\n\n      CUR.GS.loop--;\n    }\n\n  Fail:\n    CUR.GS.loop = 1;\n    CUR.new_top = CUR.args;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* FLIPRGON[]:   FLIP RanGe ON                                           */\n  /* Opcode range: 0x81                                                    */\n  /* Stack:        uint32 uint32 -->                                       */\n  /*                                                                       */\n  static void\n  Ins_FLIPRGON( INS_ARG )\n  {\n    FT_UShort  I, K, L;\n\n\n    K = (FT_UShort)args[1];\n    L = (FT_UShort)args[0];\n\n    if ( BOUNDS( K, CUR.pts.n_points ) ||\n         BOUNDS( L, CUR.pts.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    for ( I = L; I <= K; I++ )\n      CUR.pts.tags[I] |= FT_CURVE_TAG_ON;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* FLIPRGOFF:    FLIP RanGe OFF                                          */\n  /* Opcode range: 0x82                                                    */\n  /* Stack:        uint32 uint32 -->                                       */\n  /*                                                                       */\n  static void\n  Ins_FLIPRGOFF( INS_ARG )\n  {\n    FT_UShort  I, K, L;\n\n\n    K = (FT_UShort)args[1];\n    L = (FT_UShort)args[0];\n\n    if ( BOUNDS( K, CUR.pts.n_points ) ||\n         BOUNDS( L, CUR.pts.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    for ( I = L; I <= K; I++ )\n      CUR.pts.tags[I] &= ~FT_CURVE_TAG_ON;\n  }\n\n\n  static FT_Bool\n  Compute_Point_Displacement( EXEC_OP_ FT_F26Dot6*   x,\n                                       FT_F26Dot6*   y,\n                                       TT_GlyphZone  zone,\n                                       FT_UShort*    refp )\n  {\n    TT_GlyphZoneRec  zp;\n    FT_UShort        p;\n    FT_F26Dot6       d;\n\n\n    if ( CUR.opcode & 1 )\n    {\n      zp = CUR.zp0;\n      p  = CUR.GS.rp1;\n    }\n    else\n    {\n      zp = CUR.zp1;\n      p  = CUR.GS.rp2;\n    }\n\n    if ( BOUNDS( p, zp.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      *refp = 0;\n      return FAILURE;\n    }\n\n    *zone = zp;\n    *refp = p;\n\n    d = CUR_Func_project( zp.cur + p, zp.org + p );\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    if ( CUR.face->unpatented_hinting )\n    {\n      if ( CUR.GS.both_x_axis )\n      {\n        *x = d;\n        *y = 0;\n      }\n      else\n      {\n        *x = 0;\n        *y = d;\n      }\n    }\n    else\n#endif\n    {\n      *x = FT_MulDiv( d, (FT_Long)CUR.GS.freeVector.x, CUR.F_dot_P );\n      *y = FT_MulDiv( d, (FT_Long)CUR.GS.freeVector.y, CUR.F_dot_P );\n    }\n\n    return SUCCESS;\n  }\n\n\n  static void\n  Move_Zp2_Point( EXEC_OP_ FT_UShort   point,\n                           FT_F26Dot6  dx,\n                           FT_F26Dot6  dy,\n                           FT_Bool     touch )\n  {\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    if ( CUR.face->unpatented_hinting )\n    {\n      if ( CUR.GS.both_x_axis )\n      {\n        CUR.zp2.cur[point].x += dx;\n        if ( touch )\n          CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X;\n      }\n      else\n      {\n        CUR.zp2.cur[point].y += dy;\n        if ( touch )\n          CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y;\n      }\n      return;\n    }\n#endif\n\n\tif (CUR.zp2.cur == NULL) return; /* Security fix: Google Chris6 ufuzz109.pdf page #1 */\n    if ( CUR.GS.freeVector.x != 0 )\n    {\n      CUR.zp2.cur[point].x += dx;\n      if ( touch )\n        CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X;\n    }\n\n    if ( CUR.GS.freeVector.y != 0 )\n    {\n      CUR.zp2.cur[point].y += dy;\n      if ( touch )\n        CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y;\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SHP[a]:       SHift Point by the last point                           */\n  /* Opcode range: 0x32-0x33                                               */\n  /* Stack:        uint32... -->                                           */\n  /*                                                                       */\n  static void\n  Ins_SHP( INS_ARG )\n  {\n    TT_GlyphZoneRec  zp;\n    FT_UShort        refp;\n\n    FT_F26Dot6       dx,\n                     dy;\n    FT_UShort        point;\n\n    FT_UNUSED_ARG;\n\n\n    if ( CUR.top < CUR.GS.loop )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      goto Fail;\n    }\n\n    if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )\n      return;\n\n    while ( CUR.GS.loop > 0 )\n    {\n      CUR.args--;\n      point = (FT_UShort)CUR.stack[CUR.args];\n\n      if ( BOUNDS( point, CUR.zp2.n_points ) )\n      {\n        if ( CUR.pedantic_hinting )\n        {\n          CUR.error = FT_THROW( Invalid_Reference );\n          return;\n        }\n      }\n      else\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n      /* doesn't follow Cleartype spec but produces better result */\n      if ( SUBPIXEL_HINTING  &&\n           CUR.ignore_x_mode )\n        MOVE_Zp2_Point( point, 0, dy, TRUE );\n      else\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n        MOVE_Zp2_Point( point, dx, dy, TRUE );\n\n      CUR.GS.loop--;\n    }\n\n  Fail:\n    CUR.GS.loop = 1;\n    CUR.new_top = CUR.args;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SHC[a]:       SHift Contour                                           */\n  /* Opcode range: 0x34-35                                                 */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  /* UNDOCUMENTED: According to Greg Hitchcock, there is one (virtual)     */\n  /*               contour in the twilight zone, namely contour number     */\n  /*               zero which includes all points of it.                   */\n  /*                                                                       */\n  static void\n  Ins_SHC( INS_ARG )\n  {\n    TT_GlyphZoneRec  zp;\n    FT_UShort        refp;\n    FT_F26Dot6       dx, dy;\n\n    FT_Short         contour, bounds;\n    FT_UShort        start, limit, i;\n\n\n    contour = (FT_UShort)args[0];\n    bounds  = ( CUR.GS.gep2 == 0 ) ? 1 : CUR.zp2.n_contours;\n\n    if ( BOUNDS( contour, bounds ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )\n      return;\n\n    if ( contour == 0 )\n      start = 0;\n    else\n      start = (FT_UShort)( CUR.zp2.contours[contour - 1] + 1 -\n                           CUR.zp2.first_point );\n\n    /* we use the number of points if in the twilight zone */\n    if ( CUR.GS.gep2 == 0 )\n      limit = CUR.zp2.n_points;\n    else\n      limit = (FT_UShort)( CUR.zp2.contours[contour] -\n                           CUR.zp2.first_point + 1 );\n\n    for ( i = start; i < limit; i++ )\n    {\n      if ( zp.cur != CUR.zp2.cur || refp != i )\n        MOVE_Zp2_Point( i, dx, dy, TRUE );\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SHZ[a]:       SHift Zone                                              */\n  /* Opcode range: 0x36-37                                                 */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_SHZ( INS_ARG )\n  {\n    TT_GlyphZoneRec  zp;\n    FT_UShort        refp;\n    FT_F26Dot6       dx,\n                     dy;\n\n    FT_UShort        limit, i;\n\n\n    if ( BOUNDS( args[0], 2 ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )\n      return;\n\n    /* XXX: UNDOCUMENTED! SHZ doesn't move the phantom points.     */\n    /*      Twilight zone has no real contours, so use `n_points'. */\n    /*      Normal zone's `n_points' includes phantoms, so must    */\n    /*      use end of last contour.                               */\n    if ( CUR.GS.gep2 == 0 )\n      limit = (FT_UShort)CUR.zp2.n_points;\n    else if ( CUR.GS.gep2 == 1 && CUR.zp2.n_contours > 0 ) {\n      limit = (FT_UShort)( CUR.zp2.contours[CUR.zp2.n_contours - 1] + 1 );\n\t  if (limit >= CUR.zp2.n_points)\t\t/* XYQ 2010-10-01: security fix: validate last point index */\n\t\t  limit = CUR.zp2.n_points - 1;\n\t}\n    else\n      limit = 0;\n\n    /* XXX: UNDOCUMENTED! SHZ doesn't touch the points */\n    for ( i = 0; i < limit; i++ )\n    {\n      if ( zp.cur != CUR.zp2.cur || refp != i )\n        MOVE_Zp2_Point( i, dx, dy, FALSE );\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SHPIX[]:      SHift points by a PIXel amount                          */\n  /* Opcode range: 0x38                                                    */\n  /* Stack:        f26.6 uint32... -->                                     */\n  /*                                                                       */\n  static void\n  Ins_SHPIX( INS_ARG )\n  {\n    FT_F26Dot6  dx, dy;\n    FT_UShort   point;\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    FT_Int      B1, B2;\n#endif\n\n\n    if ( CUR.top < CUR.GS.loop + 1 )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      goto Fail;\n    }\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    if ( CUR.face->unpatented_hinting )\n    {\n      if ( CUR.GS.both_x_axis )\n      {\n        dx = (FT_UInt32)args[0];\n        dy = 0;\n      }\n      else\n      {\n        dx = 0;\n        dy = (FT_UInt32)args[0];\n      }\n    }\n    else\n#endif\n    {\n      dx = TT_MulFix14( (FT_UInt32)args[0], CUR.GS.freeVector.x );\n      dy = TT_MulFix14( (FT_UInt32)args[0], CUR.GS.freeVector.y );\n    }\n\n    while ( CUR.GS.loop > 0 )\n    {\n      CUR.args--;\n\n      point = (FT_UShort)CUR.stack[CUR.args];\n\n      if ( BOUNDS( point, CUR.zp2.n_points ) )\n      {\n        if ( CUR.pedantic_hinting )\n        {\n          CUR.error = FT_THROW( Invalid_Reference );\n          return;\n        }\n      }\n      else\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n      {\n        /*  If not using ignore_x_mode rendering, allow ZP2 move.          */\n        /*  If inline deltas aren't allowed, skip ZP2 move.                */\n        /*  If using ignore_x_mode rendering, allow ZP2 point move if:     */\n        /*   - freedom vector is y and sph_compatibility_mode is off       */\n        /*   - the glyph is composite and the move is in the Y direction   */\n        /*   - the glyph is specifically set to allow SHPIX moves          */\n        /*   - the move is on a previously Y-touched point                 */\n\n        if ( SUBPIXEL_HINTING  &&\n             CUR.ignore_x_mode )\n        {\n          /* save point for later comparison */\n          if ( CUR.GS.freeVector.y != 0 )\n            B1 = CUR.zp2.cur[point].y;\n          else\n            B1 = CUR.zp2.cur[point].x;\n\n          if ( !CUR.face->sph_compatibility_mode &&\n               CUR.GS.freeVector.y != 0          )\n          {\n            MOVE_Zp2_Point( point, dx, dy, TRUE );\n\n            /* save new point */\n            if ( CUR.GS.freeVector.y != 0 )\n            {\n              B2 = CUR.zp2.cur[point].y;\n\n              /* reverse any disallowed moves */\n              if ( ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) &&\n                   ( B1 & 63 ) != 0                                          &&\n                   ( B2 & 63 ) != 0                                          &&\n                    B1 != B2                                                 )\n                MOVE_Zp2_Point( point, -dx, -dy, TRUE );\n            }\n          }\n          else if ( CUR.face->sph_compatibility_mode )\n          {\n            if ( CUR.sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES )\n            {\n              dx = FT_PIX_ROUND( B1 + dx ) - B1;\n              dy = FT_PIX_ROUND( B1 + dy ) - B1;\n            }\n\n            /* skip post-iup deltas */\n            if ( CUR.iup_called                                          &&\n                 ( ( CUR.sph_in_func_flags & SPH_FDEF_INLINE_DELTA_1 ) ||\n                   ( CUR.sph_in_func_flags & SPH_FDEF_INLINE_DELTA_2 ) ) )\n              goto Skip;\n\n            if ( !( CUR.sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) &&\n                  ( ( CUR.is_composite && CUR.GS.freeVector.y != 0 ) ||\n                    ( CUR.zp2.tags[point] & FT_CURVE_TAG_TOUCH_Y )   ||\n                    ( CUR.sph_tweak_flags & SPH_TWEAK_DO_SHPIX )     )   )\n              MOVE_Zp2_Point( point, 0, dy, TRUE );\n\n            /* save new point */\n            if ( CUR.GS.freeVector.y != 0 )\n            {\n              B2 = CUR.zp2.cur[point].y;\n\n              /* reverse any disallowed moves */\n              if ( ( B1 & 63 ) == 0 &&\n                   ( B2 & 63 ) != 0 &&\n                   B1 != B2         )\n                MOVE_Zp2_Point( point, 0, -dy, TRUE );\n            }\n          }\n          else if ( CUR.sph_in_func_flags & SPH_FDEF_TYPEMAN_DIAGENDCTRL )\n            MOVE_Zp2_Point( point, dx, dy, TRUE );\n        }\n        else\n          MOVE_Zp2_Point( point, dx, dy, TRUE );\n      }\n\n    Skip:\n\n#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n        MOVE_Zp2_Point( point, dx, dy, TRUE );\n\n#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n      CUR.GS.loop--;\n    }\n\n  Fail:\n    CUR.GS.loop = 1;\n    CUR.new_top = CUR.args;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MSIRP[a]:     Move Stack Indirect Relative Position                   */\n  /* Opcode range: 0x3A-0x3B                                               */\n  /* Stack:        f26.6 uint32 -->                                        */\n  /*                                                                       */\n  static void\n  Ins_MSIRP( INS_ARG )\n  {\n    FT_UShort   point;\n    FT_F26Dot6  distance;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    FT_F26Dot6  control_value_cutin = 0; /* pacify compiler */\n\n\n    if ( SUBPIXEL_HINTING )\n    {\n      control_value_cutin = CUR.GS.control_value_cutin;\n\n      if ( CUR.ignore_x_mode                                 &&\n           CUR.GS.freeVector.x != 0                          &&\n           !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )\n        control_value_cutin = 0;\n    }\n\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    point = (FT_UShort)args[0];\n\n    if ( BOUNDS( point,      CUR.zp1.n_points ) ||\n         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    /* UNDOCUMENTED!  The MS rasterizer does that with */\n    /* twilight points (confirmed by Greg Hitchcock)   */\n    if ( CUR.GS.gep1 == 0 )\n    {\n      CUR.zp1.org[point] = CUR.zp0.org[CUR.GS.rp0];\n      CUR_Func_move_orig( &CUR.zp1, point, args[1] );\n      CUR.zp1.cur[point] = CUR.zp1.org[point];\n    }\n\n    distance = CUR_Func_project( CUR.zp1.cur + point,\n                                 CUR.zp0.cur + CUR.GS.rp0 );\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    /* subpixel hinting - make MSIRP respect CVT cut-in; */\n    if ( SUBPIXEL_HINTING                                    &&\n         CUR.ignore_x_mode                                   &&\n         CUR.GS.freeVector.x != 0                            &&\n         FT_ABS( distance - args[1] ) >= control_value_cutin )\n      distance = args[1];\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    CUR_Func_move( &CUR.zp1, point, args[1] - distance );\n\n    CUR.GS.rp1 = CUR.GS.rp0;\n    CUR.GS.rp2 = point;\n\n    if ( ( CUR.opcode & 1 ) != 0 )\n      CUR.GS.rp0 = point;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MDAP[a]:      Move Direct Absolute Point                              */\n  /* Opcode range: 0x2E-0x2F                                               */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_MDAP( INS_ARG )\n  {\n    FT_UShort   point;\n    FT_F26Dot6  cur_dist;\n    FT_F26Dot6  distance;\n\n\n    point = (FT_UShort)args[0];\n\n    if ( BOUNDS( point, CUR.zp0.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    if ( ( CUR.opcode & 1 ) != 0 )\n    {\n      cur_dist = CUR_fast_project( &CUR.zp0.cur[point] );\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n      if ( SUBPIXEL_HINTING         &&\n           CUR.ignore_x_mode        &&\n           CUR.GS.freeVector.x != 0 )\n        distance = ROUND_None(\n                     cur_dist,\n                     CUR.tt_metrics.compensations[0] ) - cur_dist;\n      else\n#endif\n        distance = CUR_Func_round(\n                     cur_dist,\n                     CUR.tt_metrics.compensations[0] ) - cur_dist;\n    }\n    else\n      distance = 0;\n\n    CUR_Func_move( &CUR.zp0, point, distance );\n\n    CUR.GS.rp0 = point;\n    CUR.GS.rp1 = point;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MIAP[a]:      Move Indirect Absolute Point                            */\n  /* Opcode range: 0x3E-0x3F                                               */\n  /* Stack:        uint32 uint32 -->                                       */\n  /*                                                                       */\n  static void\n  Ins_MIAP( INS_ARG )\n  {\n    FT_ULong    cvtEntry;\n    FT_UShort   point;\n    FT_F26Dot6  distance;\n    FT_F26Dot6  org_dist;\n    FT_F26Dot6  control_value_cutin;\n\n\n    control_value_cutin = CUR.GS.control_value_cutin;\n    cvtEntry            = (FT_ULong)args[1];\n    point               = (FT_UShort)args[0];\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    if ( SUBPIXEL_HINTING                                  &&\n         CUR.ignore_x_mode                                 &&\n         CUR.GS.freeVector.x != 0                          &&\n         CUR.GS.freeVector.y == 0                          &&\n         !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )\n      control_value_cutin = 0;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    if ( BOUNDS( point,     CUR.zp0.n_points ) ||\n         BOUNDSL( cvtEntry, CUR.cvtSize )      )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      goto Fail;\n    }\n\n    /* UNDOCUMENTED!                                                      */\n    /*                                                                    */\n    /* The behaviour of an MIAP instruction is quite different when used  */\n    /* in the twilight zone.                                              */\n    /*                                                                    */\n    /* First, no control value cut-in test is performed as it would fail  */\n    /* anyway.  Second, the original point, i.e. (org_x,org_y) of         */\n    /* zp0.point, is set to the absolute, unrounded distance found in the */\n    /* CVT.                                                               */\n    /*                                                                    */\n    /* This is used in the CVT programs of the Microsoft fonts Arial,     */\n    /* Times, etc., in order to re-adjust some key font heights.  It      */\n    /* allows the use of the IP instruction in the twilight zone, which   */\n    /* otherwise would be invalid according to the specification.         */\n    /*                                                                    */\n    /* We implement it with a special sequence for the twilight zone.     */\n    /* This is a bad hack, but it seems to work.                          */\n    /*                                                                    */\n    /* Confirmed by Greg Hitchcock.                                       */\n\n    distance = CUR_Func_read_cvt( cvtEntry );\n\n    if ( CUR.GS.gep0 == 0 )   /* If in twilight zone */\n    {\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n      /* Only adjust if not in sph_compatibility_mode or ignore_x_mode. */\n      /* Determined via experimentation and may be incorrect...         */\n      if ( !SUBPIXEL_HINTING                     ||\n           ( !CUR.ignore_x_mode                ||\n             !CUR.face->sph_compatibility_mode ) )\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n        CUR.zp0.org[point].x = TT_MulFix14( (FT_UInt32)distance,\n                                            CUR.GS.freeVector.x );\n      CUR.zp0.org[point].y = TT_MulFix14( (FT_UInt32)distance,\n                                          CUR.GS.freeVector.y ),\n      CUR.zp0.cur[point]   = CUR.zp0.org[point];\n    }\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    if ( SUBPIXEL_HINTING                              &&\n         CUR.ignore_x_mode                             &&\n         ( CUR.sph_tweak_flags & SPH_TWEAK_MIAP_HACK ) &&\n         distance > 0                                  &&\n         CUR.GS.freeVector.y != 0                      )\n      distance = 0;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    org_dist = CUR_fast_project( &CUR.zp0.cur[point] );\n\n    if ( ( CUR.opcode & 1 ) != 0 )   /* rounding and control cut-in flag */\n    {\n      if ( FT_ABS( distance - org_dist ) > control_value_cutin )\n        distance = org_dist;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n      if ( SUBPIXEL_HINTING         &&\n           CUR.ignore_x_mode        &&\n           CUR.GS.freeVector.x != 0 )\n        distance = ROUND_None( distance,\n                               CUR.tt_metrics.compensations[0] );\n      else\n#endif\n        distance = CUR_Func_round( distance,\n                                   CUR.tt_metrics.compensations[0] );\n    }\n\n    CUR_Func_move( &CUR.zp0, point, distance - org_dist );\n\n  Fail:\n    CUR.GS.rp0 = point;\n    CUR.GS.rp1 = point;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MDRP[abcde]:  Move Direct Relative Point                              */\n  /* Opcode range: 0xC0-0xDF                                               */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_MDRP( INS_ARG )\n  {\n    FT_UShort   point;\n    FT_F26Dot6  org_dist, distance, minimum_distance;\n\n\n    minimum_distance = CUR.GS.minimum_distance;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    if ( SUBPIXEL_HINTING                                  &&\n         CUR.ignore_x_mode                                 &&\n         CUR.GS.freeVector.x != 0                          &&\n         !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )\n      minimum_distance = 0;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    point = (FT_UShort)args[0];\n\n    if ( BOUNDS( point,      CUR.zp1.n_points ) ||\n         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      goto Fail;\n    }\n\n    /* XXX: Is there some undocumented feature while in the */\n    /*      twilight zone?                                  */\n\n    /* XXX: UNDOCUMENTED: twilight zone special case */\n\n    if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 )\n    {\n      FT_Vector*  vec1 = &CUR.zp1.org[point];\n      FT_Vector*  vec2 = &CUR.zp0.org[CUR.GS.rp0];\n\n\n      org_dist = CUR_Func_dualproj( vec1, vec2 );\n    }\n    else\n    {\n      FT_Vector*  vec1 = &CUR.zp1.orus[point];\n      FT_Vector*  vec2 = &CUR.zp0.orus[CUR.GS.rp0];\n\n\n      if ( CUR.metrics.x_scale == CUR.metrics.y_scale )\n      {\n        /* this should be faster */\n        org_dist = CUR_Func_dualproj( vec1, vec2 );\n        org_dist = FT_MulFix( org_dist, CUR.metrics.x_scale );\n      }\n      else\n      {\n        FT_Vector  vec;\n\n\n        vec.x = FT_MulFix( vec1->x - vec2->x, CUR.metrics.x_scale );\n        vec.y = FT_MulFix( vec1->y - vec2->y, CUR.metrics.y_scale );\n\n        org_dist = CUR_fast_dualproj( &vec );\n      }\n    }\n\n    /* single width cut-in test */\n\n    if ( FT_ABS( org_dist - CUR.GS.single_width_value ) <\n         CUR.GS.single_width_cutin )\n    {\n      if ( org_dist >= 0 )\n        org_dist = CUR.GS.single_width_value;\n      else\n        org_dist = -CUR.GS.single_width_value;\n    }\n\n    /* round flag */\n\n    if ( ( CUR.opcode & 4 ) != 0 )\n    {\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n      if ( SUBPIXEL_HINTING         &&\n           CUR.ignore_x_mode        &&\n           CUR.GS.freeVector.x != 0 )\n        distance = ROUND_None(\n                     org_dist,\n                     CUR.tt_metrics.compensations[CUR.opcode & 3] );\n      else\n#endif\n      distance = CUR_Func_round(\n                   org_dist,\n                   CUR.tt_metrics.compensations[CUR.opcode & 3] );\n    }\n    else\n      distance = ROUND_None(\n                   org_dist,\n                   CUR.tt_metrics.compensations[CUR.opcode & 3] );\n\n    /* minimum distance flag */\n\n    if ( ( CUR.opcode & 8 ) != 0 )\n    {\n      if ( org_dist >= 0 )\n      {\n        if ( distance < minimum_distance )\n          distance = minimum_distance;\n      }\n      else\n      {\n        if ( distance > -minimum_distance )\n          distance = -minimum_distance;\n      }\n    }\n\n    /* now move the point */\n\n    org_dist = CUR_Func_project( CUR.zp1.cur + point,\n                                 CUR.zp0.cur + CUR.GS.rp0 );\n\n    CUR_Func_move( &CUR.zp1, point, distance - org_dist );\n\n  Fail:\n    CUR.GS.rp1 = CUR.GS.rp0;\n    CUR.GS.rp2 = point;\n\n    if ( ( CUR.opcode & 16 ) != 0 )\n      CUR.GS.rp0 = point;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MIRP[abcde]:  Move Indirect Relative Point                            */\n  /* Opcode range: 0xE0-0xFF                                               */\n  /* Stack:        int32? uint32 -->                                       */\n  /*                                                                       */\n  static void\n  Ins_MIRP( INS_ARG )\n  {\n    FT_UShort   point;\n    FT_ULong    cvtEntry;\n\n    FT_F26Dot6  cvt_dist,\n                distance,\n                cur_dist,\n                org_dist,\n                control_value_cutin,\n                minimum_distance;\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    FT_Int      B1           = 0; /* pacify compiler */\n    FT_Int      B2           = 0;\n    FT_Bool     reverse_move = FALSE;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n\n    minimum_distance    = CUR.GS.minimum_distance;\n    control_value_cutin = CUR.GS.control_value_cutin;\n    point               = (FT_UShort)args[0];\n    cvtEntry            = (FT_ULong)( args[1] + 1 );\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    if ( SUBPIXEL_HINTING                                  &&\n         CUR.ignore_x_mode                                 &&\n         CUR.GS.freeVector.x != 0                          &&\n         !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )\n      control_value_cutin = minimum_distance = 0;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    /* XXX: UNDOCUMENTED! cvt[-1] = 0 always */\n\t/* Security fix: Google 07_oobread4.pdf page #1, cvtEntry > CUR.cvtSize + 1 will cause array index oob. */\n    if ( BOUNDS( point,      CUR.zp1.n_points ) ||\n         BOUNDS( cvtEntry,  CUR.cvtSize + 1 )  ||\n         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      goto Fail;\n    }\n\n    if ( !cvtEntry )\n      cvt_dist = 0;\n    else\n      cvt_dist = CUR_Func_read_cvt( cvtEntry - 1 );\n\n    /* single width test */\n\n    if ( FT_ABS( cvt_dist - CUR.GS.single_width_value ) <\n         CUR.GS.single_width_cutin )\n    {\n      if ( cvt_dist >= 0 )\n        cvt_dist =  CUR.GS.single_width_value;\n      else\n        cvt_dist = -CUR.GS.single_width_value;\n    }\n\n    /* UNDOCUMENTED!  The MS rasterizer does that with */\n    /* twilight points (confirmed by Greg Hitchcock)   */\n    if ( CUR.GS.gep1 == 0 )\n    {\n      CUR.zp1.org[point].x = CUR.zp0.org[CUR.GS.rp0].x +\n                             TT_MulFix14( (FT_UInt32)cvt_dist,\n                                          CUR.GS.freeVector.x );\n      CUR.zp1.org[point].y = CUR.zp0.org[CUR.GS.rp0].y +\n                             TT_MulFix14( (FT_UInt32)cvt_dist,\n                                          CUR.GS.freeVector.y );\n      CUR.zp1.cur[point]   = CUR.zp1.org[point];\n    }\n\n    org_dist = CUR_Func_dualproj( &CUR.zp1.org[point],\n                                  &CUR.zp0.org[CUR.GS.rp0] );\n    cur_dist = CUR_Func_project ( &CUR.zp1.cur[point],\n                                  &CUR.zp0.cur[CUR.GS.rp0] );\n\n    /* auto-flip test */\n\n    if ( CUR.GS.auto_flip )\n    {\n      if ( ( org_dist ^ cvt_dist ) < 0 )\n        cvt_dist = -cvt_dist;\n    }\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    if ( SUBPIXEL_HINTING                                         &&\n         CUR.ignore_x_mode                                        &&\n         CUR.GS.freeVector.y != 0                                 &&\n         ( CUR.sph_tweak_flags & SPH_TWEAK_TIMES_NEW_ROMAN_HACK ) )\n    {\n      if ( cur_dist < -64 )\n        cvt_dist -= 16;\n      else if ( cur_dist > 64 && cur_dist < 84 )\n        cvt_dist += 32;\n    }\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    /* control value cut-in and round */\n\n    if ( ( CUR.opcode & 4 ) != 0 )\n    {\n      /* XXX: UNDOCUMENTED!  Only perform cut-in test when both points */\n      /*      refer to the same zone.                                  */\n\n      if ( CUR.GS.gep0 == CUR.GS.gep1 )\n      {\n        /* XXX: According to Greg Hitchcock, the following wording is */\n        /*      the right one:                                        */\n        /*                                                            */\n        /*        When the absolute difference between the value in   */\n        /*        the table [CVT] and the measurement directly from   */\n        /*        the outline is _greater_ than the cut_in value, the */\n        /*        outline measurement is used.                        */\n        /*                                                            */\n        /*      This is from `instgly.doc'.  The description in       */\n        /*      `ttinst2.doc', version 1.66, is thus incorrect since  */\n        /*      it implies `>=' instead of `>'.                       */\n\n        if ( FT_ABS( cvt_dist - org_dist ) > control_value_cutin )\n          cvt_dist = org_dist;\n      }\n\n      distance = CUR_Func_round(\n                   cvt_dist,\n                   CUR.tt_metrics.compensations[CUR.opcode & 3] );\n    }\n    else\n    {\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n      /* do cvt cut-in always in MIRP for sph */\n      if ( SUBPIXEL_HINTING           &&\n           CUR.ignore_x_mode          &&\n           CUR.GS.gep0 == CUR.GS.gep1 )\n      {\n        if ( FT_ABS( cvt_dist - org_dist ) > control_value_cutin )\n          cvt_dist = org_dist;\n      }\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n      distance = ROUND_None(\n                   cvt_dist,\n                   CUR.tt_metrics.compensations[CUR.opcode & 3] );\n    }\n\n    /* minimum distance test */\n\n    if ( ( CUR.opcode & 8 ) != 0 )\n    {\n      if ( org_dist >= 0 )\n      {\n        if ( distance < minimum_distance )\n          distance = minimum_distance;\n      }\n      else\n      {\n        if ( distance > -minimum_distance )\n          distance = -minimum_distance;\n      }\n    }\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    if ( SUBPIXEL_HINTING )\n    {\n      B1 = CUR.zp1.cur[point].y;\n\n      /* Round moves if necessary */\n      if ( CUR.ignore_x_mode                                          &&\n           CUR.GS.freeVector.y != 0                                   &&\n           ( CUR.sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) )\n        distance = FT_PIX_ROUND( B1 + distance - cur_dist ) - B1 + cur_dist;\n\n      if ( CUR.ignore_x_mode                                      &&\n           CUR.GS.freeVector.y != 0                               &&\n           ( CUR.opcode & 16 ) == 0                               &&\n           ( CUR.opcode & 8 ) == 0                                &&\n           ( CUR.sph_tweak_flags & SPH_TWEAK_COURIER_NEW_2_HACK ) )\n        distance += 64;\n    }\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    CUR_Func_move( &CUR.zp1, point, distance - cur_dist );\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    if ( SUBPIXEL_HINTING )\n    {\n      B2 = CUR.zp1.cur[point].y;\n\n      /* Reverse move if necessary */\n      if ( CUR.ignore_x_mode )\n      {\n        if ( CUR.face->sph_compatibility_mode                          &&\n             CUR.GS.freeVector.y != 0                                  &&\n             ( B1 & 63 ) == 0                                          &&\n             ( B2 & 63 ) != 0                                          )\n          reverse_move = TRUE;\n\n        if ( ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) &&\n             CUR.GS.freeVector.y != 0                                  &&\n             ( B2 & 63 ) != 0                                          &&\n             ( B1 & 63 ) != 0                                          )\n          reverse_move = TRUE;\n      }\n\n      if ( reverse_move )\n        CUR_Func_move( &CUR.zp1, point, -( distance - cur_dist ) );\n    }\n\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n  Fail:\n    CUR.GS.rp1 = CUR.GS.rp0;\n\n    if ( ( CUR.opcode & 16 ) != 0 )\n      CUR.GS.rp0 = point;\n\n    CUR.GS.rp2 = point;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ALIGNRP[]:    ALIGN Relative Point                                    */\n  /* Opcode range: 0x3C                                                    */\n  /* Stack:        uint32 uint32... -->                                    */\n  /*                                                                       */\n  static void\n  Ins_ALIGNRP( INS_ARG )\n  {\n    FT_UShort   point;\n    FT_F26Dot6  distance;\n\n    FT_UNUSED_ARG;\n\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    if ( SUBPIXEL_HINTING                                         &&\n         CUR.ignore_x_mode                                        &&\n         CUR.iup_called                                           &&\n         ( CUR.sph_tweak_flags & SPH_TWEAK_NO_ALIGNRP_AFTER_IUP ) )\n    {\n      CUR.error = FT_THROW( Invalid_Reference );\n      goto Fail;\n    }\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    if ( CUR.top < CUR.GS.loop ||\n         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      goto Fail;\n    }\n\n    while ( CUR.GS.loop > 0 )\n    {\n      CUR.args--;\n\n      point = (FT_UShort)CUR.stack[CUR.args];\n\n      if ( BOUNDS( point, CUR.zp1.n_points ) )\n      {\n        if ( CUR.pedantic_hinting )\n        {\n          CUR.error = FT_THROW( Invalid_Reference );\n          return;\n        }\n      }\n      else\n      {\n        distance = CUR_Func_project( CUR.zp1.cur + point,\n                                     CUR.zp0.cur + CUR.GS.rp0 );\n\n        CUR_Func_move( &CUR.zp1, point, -distance );\n      }\n\n      CUR.GS.loop--;\n    }\n\n  Fail:\n    CUR.GS.loop = 1;\n    CUR.new_top = CUR.args;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ISECT[]:      moves point to InterSECTion                             */\n  /* Opcode range: 0x0F                                                    */\n  /* Stack:        5 * uint32 -->                                          */\n  /*                                                                       */\n  static void\n  Ins_ISECT( INS_ARG )\n  {\n    FT_UShort   point,\n                a0, a1,\n                b0, b1;\n\n    FT_F26Dot6  discriminant, dotproduct;\n\n    FT_F26Dot6  dx,  dy,\n                dax, day,\n                dbx, dby;\n\n    FT_F26Dot6  val;\n\n    FT_Vector   R;\n\n\n    point = (FT_UShort)args[0];\n\n    a0 = (FT_UShort)args[1];\n    a1 = (FT_UShort)args[2];\n    b0 = (FT_UShort)args[3];\n    b1 = (FT_UShort)args[4];\n\n    if ( BOUNDS( b0, CUR.zp0.n_points )  ||\n         BOUNDS( b1, CUR.zp0.n_points )  ||\n         BOUNDS( a0, CUR.zp1.n_points )  ||\n         BOUNDS( a1, CUR.zp1.n_points )  ||\n         BOUNDS( point, CUR.zp2.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    /* Cramer's rule */\n\n    dbx = CUR.zp0.cur[b1].x - CUR.zp0.cur[b0].x;\n    dby = CUR.zp0.cur[b1].y - CUR.zp0.cur[b0].y;\n\n    dax = CUR.zp1.cur[a1].x - CUR.zp1.cur[a0].x;\n    day = CUR.zp1.cur[a1].y - CUR.zp1.cur[a0].y;\n\n    dx = CUR.zp0.cur[b0].x - CUR.zp1.cur[a0].x;\n    dy = CUR.zp0.cur[b0].y - CUR.zp1.cur[a0].y;\n\n    CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_BOTH;\n\n    discriminant = FT_MulDiv( dax, -dby, 0x40 ) +\n                   FT_MulDiv( day, dbx, 0x40 );\n    dotproduct   = FT_MulDiv( dax, dbx, 0x40 ) +\n                   FT_MulDiv( day, dby, 0x40 );\n\n    /* The discriminant above is actually a cross product of vectors     */\n    /* da and db. Together with the dot product, they can be used as     */\n    /* surrogates for sine and cosine of the angle between the vectors.  */\n    /* Indeed,                                                           */\n    /*       dotproduct   = |da||db|cos(angle)                           */\n    /*       discriminant = |da||db|sin(angle)     .                     */\n    /* We use these equations to reject grazing intersections by         */\n    /* thresholding abs(tan(angle)) at 1/19, corresponding to 3 degrees. */\n    if ( 19 * FT_ABS( discriminant ) > FT_ABS( dotproduct ) )\n    {\n      val = FT_MulDiv( dx, -dby, 0x40 ) + FT_MulDiv( dy, dbx, 0x40 );\n\n      R.x = FT_MulDiv( val, dax, discriminant );\n      R.y = FT_MulDiv( val, day, discriminant );\n\n      CUR.zp2.cur[point].x = CUR.zp1.cur[a0].x + R.x;\n      CUR.zp2.cur[point].y = CUR.zp1.cur[a0].y + R.y;\n    }\n    else\n    {\n      /* else, take the middle of the middles of A and B */\n\n      CUR.zp2.cur[point].x = ( CUR.zp1.cur[a0].x +\n                               CUR.zp1.cur[a1].x +\n                               CUR.zp0.cur[b0].x +\n                               CUR.zp0.cur[b1].x ) / 4;\n      CUR.zp2.cur[point].y = ( CUR.zp1.cur[a0].y +\n                               CUR.zp1.cur[a1].y +\n                               CUR.zp0.cur[b0].y +\n                               CUR.zp0.cur[b1].y ) / 4;\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ALIGNPTS[]:   ALIGN PoinTS                                            */\n  /* Opcode range: 0x27                                                    */\n  /* Stack:        uint32 uint32 -->                                       */\n  /*                                                                       */\n  static void\n  Ins_ALIGNPTS( INS_ARG )\n  {\n    FT_UShort   p1, p2;\n    FT_F26Dot6  distance;\n\n\n    p1 = (FT_UShort)args[0];\n    p2 = (FT_UShort)args[1];\n\n    if ( BOUNDS( p1, CUR.zp1.n_points ) ||\n         BOUNDS( p2, CUR.zp0.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    distance = CUR_Func_project( CUR.zp0.cur + p2,\n                                 CUR.zp1.cur + p1 ) / 2;\n\n    CUR_Func_move( &CUR.zp1, p1, distance );\n    CUR_Func_move( &CUR.zp0, p2, -distance );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* IP[]:         Interpolate Point                                       */\n  /* Opcode range: 0x39                                                    */\n  /* Stack:        uint32... -->                                           */\n  /*                                                                       */\n\n  /* SOMETIMES, DUMBER CODE IS BETTER CODE */\n\n  static void\n  Ins_IP( INS_ARG )\n  {\n    FT_F26Dot6  old_range, cur_range;\n    FT_Vector*  orus_base;\n    FT_Vector*  cur_base;\n    FT_Int      twilight;\n\n    FT_UNUSED_ARG;\n\n\n    if ( CUR.top < CUR.GS.loop )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      goto Fail;\n    }\n\n    /*\n     * We need to deal in a special way with the twilight zone.\n     * Otherwise, by definition, the value of CUR.twilight.orus[n] is (0,0),\n     * for every n.\n     */\n    twilight = CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 || CUR.GS.gep2 == 0;\n\n    if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      goto Fail;\n    }\n\n    if ( twilight )\n      orus_base = &CUR.zp0.org[CUR.GS.rp1];\n    else\n      orus_base = &CUR.zp0.orus[CUR.GS.rp1];\n\n    cur_base = &CUR.zp0.cur[CUR.GS.rp1];\n\n    /* XXX: There are some glyphs in some braindead but popular */\n    /*      fonts out there (e.g. [aeu]grave in monotype.ttf)   */\n    /*      calling IP[] with bad values of rp[12].             */\n    /*      Do something sane when this odd thing happens.      */\n    if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) ||\n         BOUNDS( CUR.GS.rp2, CUR.zp1.n_points ) )\n    {\n      old_range = 0;\n      cur_range = 0;\n    }\n    else\n    {\n      if ( twilight )\n        old_range = CUR_Func_dualproj( &CUR.zp1.org[CUR.GS.rp2],\n                                       orus_base );\n      else if ( CUR.metrics.x_scale == CUR.metrics.y_scale )\n        old_range = CUR_Func_dualproj( &CUR.zp1.orus[CUR.GS.rp2],\n                                       orus_base );\n      else\n      {\n        FT_Vector  vec;\n\n\n        vec.x = FT_MulFix( CUR.zp1.orus[CUR.GS.rp2].x - orus_base->x,\n                           CUR.metrics.x_scale );\n        vec.y = FT_MulFix( CUR.zp1.orus[CUR.GS.rp2].y - orus_base->y,\n                           CUR.metrics.y_scale );\n\n        old_range = CUR_fast_dualproj( &vec );\n      }\n\n      cur_range = CUR_Func_project ( &CUR.zp1.cur[CUR.GS.rp2], cur_base );\n    }\n\n    for ( ; CUR.GS.loop > 0; --CUR.GS.loop )\n    {\n      FT_UInt     point = (FT_UInt)CUR.stack[--CUR.args];\n      FT_F26Dot6  org_dist, cur_dist, new_dist;\n\n\n      /* check point bounds */\n      if ( BOUNDS( point, CUR.zp2.n_points ) )\n      {\n        if ( CUR.pedantic_hinting )\n        {\n          CUR.error = FT_THROW( Invalid_Reference );\n          return;\n        }\n        continue;\n      }\n\n      if ( twilight )\n        org_dist = CUR_Func_dualproj( &CUR.zp2.org[point], orus_base );\n      else if ( CUR.metrics.x_scale == CUR.metrics.y_scale )\n        org_dist = CUR_Func_dualproj( &CUR.zp2.orus[point], orus_base );\n      else\n      {\n        FT_Vector  vec;\n\n\n        vec.x = FT_MulFix( CUR.zp2.orus[point].x - orus_base->x,\n                           CUR.metrics.x_scale );\n        vec.y = FT_MulFix( CUR.zp2.orus[point].y - orus_base->y,\n                           CUR.metrics.y_scale );\n\n        org_dist = CUR_fast_dualproj( &vec );\n      }\n\n      cur_dist = CUR_Func_project ( &CUR.zp2.cur[point], cur_base );\n\n      if ( org_dist )\n      {\n        if ( old_range )\n          new_dist = FT_MulDiv( org_dist, cur_range, old_range );\n        else\n        {\n          /* This is the same as what MS does for the invalid case:  */\n          /*                                                         */\n          /*   delta = (Original_Pt - Original_RP1) -                */\n          /*           (Current_Pt - Current_RP1)                    */\n          /*                                                         */\n          /* In FreeType speak:                                      */\n          /*                                                         */\n          /*   new_dist = cur_dist -                                 */\n          /*              org_dist - cur_dist;                       */\n\n          new_dist = -org_dist;\n        }\n      }\n      else\n        new_dist = 0;\n\n      CUR_Func_move( &CUR.zp2, (FT_UShort)point, new_dist - cur_dist );\n    }\n\n  Fail:\n    CUR.GS.loop = 1;\n    CUR.new_top = CUR.args;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* UTP[a]:       UnTouch Point                                           */\n  /* Opcode range: 0x29                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_UTP( INS_ARG )\n  {\n    FT_UShort  point;\n    FT_Byte    mask;\n\n\n    point = (FT_UShort)args[0];\n\n    if ( BOUNDS( point, CUR.zp0.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    mask = 0xFF;\n\n    if ( CUR.GS.freeVector.x != 0 )\n      mask &= ~FT_CURVE_TAG_TOUCH_X;\n\n    if ( CUR.GS.freeVector.y != 0 )\n      mask &= ~FT_CURVE_TAG_TOUCH_Y;\n\n    CUR.zp0.tags[point] &= mask;\n  }\n\n\n  /* Local variables for Ins_IUP: */\n  typedef struct  IUP_WorkerRec_\n  {\n    FT_Vector*  orgs;   /* original and current coordinate */\n    FT_Vector*  curs;   /* arrays                          */\n    FT_Vector*  orus;\n    FT_UInt     max_points;\n\n  } IUP_WorkerRec, *IUP_Worker;\n\n\n  static void\n  _iup_worker_shift( IUP_Worker  worker,\n                     FT_UInt     p1,\n                     FT_UInt     p2,\n                     FT_UInt     p )\n  {\n    FT_UInt     i;\n    FT_F26Dot6  dx;\n\n\n    dx = worker->curs[p].x - worker->orgs[p].x;\n    if ( dx != 0 )\n    {\n      for ( i = p1; i < p; i++ )\n        worker->curs[i].x += dx;\n\n      for ( i = p + 1; i <= p2; i++ )\n        worker->curs[i].x += dx;\n    }\n  }\n\n\n  static void\n  _iup_worker_interpolate( IUP_Worker  worker,\n                           FT_UInt     p1,\n                           FT_UInt     p2,\n                           FT_UInt     ref1,\n                           FT_UInt     ref2 )\n  {\n    FT_UInt     i;\n    FT_F26Dot6  orus1, orus2, org1, org2, delta1, delta2;\n\n\n    if ( p1 > p2 )\n      return;\n\n    if ( BOUNDS( ref1, worker->max_points ) ||\n         BOUNDS( ref2, worker->max_points ) )\n      return;\n\n    orus1 = worker->orus[ref1].x;\n    orus2 = worker->orus[ref2].x;\n\n    if ( orus1 > orus2 )\n    {\n      FT_F26Dot6  tmp_o;\n      FT_UInt     tmp_r;\n\n\n      tmp_o = orus1;\n      orus1 = orus2;\n      orus2 = tmp_o;\n\n      tmp_r = ref1;\n      ref1  = ref2;\n      ref2  = tmp_r;\n    }\n\n    org1   = worker->orgs[ref1].x;\n    org2   = worker->orgs[ref2].x;\n    delta1 = worker->curs[ref1].x - org1;\n    delta2 = worker->curs[ref2].x - org2;\n\n    if ( orus1 == orus2 )\n    {\n      /* simple shift of untouched points */\n      for ( i = p1; i <= p2; i++ )\n      {\n        FT_F26Dot6  x = worker->orgs[i].x;\n\n\n        if ( x <= org1 )\n          x += delta1;\n        else\n          x += delta2;\n\n        worker->curs[i].x = x;\n      }\n    }\n    else\n    {\n      FT_Fixed  scale       = 0;\n      FT_Bool   scale_valid = 0;\n\n\n      /* interpolation */\n      for ( i = p1; i <= p2; i++ )\n      {\n        FT_F26Dot6  x = worker->orgs[i].x;\n\n\n        if ( x <= org1 )\n          x += delta1;\n\n        else if ( x >= org2 )\n          x += delta2;\n\n        else\n        {\n          if ( !scale_valid )\n          {\n            scale_valid = 1;\n            scale       = FT_DivFix( org2 + delta2 - ( org1 + delta1 ),\n                                     orus2 - orus1 );\n          }\n\n          x = ( org1 + delta1 ) +\n              FT_MulFix( worker->orus[i].x - orus1, scale );\n        }\n        worker->curs[i].x = x;\n      }\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* IUP[a]:       Interpolate Untouched Points                            */\n  /* Opcode range: 0x30-0x31                                               */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_IUP( INS_ARG )\n  {\n    IUP_WorkerRec  V;\n    FT_Byte        mask;\n\n    FT_UInt   first_point;   /* first point of contour        */\n    FT_UInt   end_point;     /* end point (last+1) of contour */\n\n    FT_UInt   first_touched; /* first touched point in contour   */\n    FT_UInt   cur_touched;   /* current touched point in contour */\n\n    FT_UInt   point;         /* current point   */\n    FT_Short  contour;       /* current contour */\n\n    FT_UNUSED_ARG;\n\n\n    /* ignore empty outlines */\n    if ( CUR.pts.n_contours == 0 )\n      return;\n\n    if ( CUR.opcode & 1 )\n    {\n      mask   = FT_CURVE_TAG_TOUCH_X;\n      V.orgs = CUR.pts.org;\n      V.curs = CUR.pts.cur;\n      V.orus = CUR.pts.orus;\n    }\n    else\n    {\n      mask   = FT_CURVE_TAG_TOUCH_Y;\n      V.orgs = (FT_Vector*)( (FT_Pos*)CUR.pts.org + 1 );\n      V.curs = (FT_Vector*)( (FT_Pos*)CUR.pts.cur + 1 );\n      V.orus = (FT_Vector*)( (FT_Pos*)CUR.pts.orus + 1 );\n    }\n    V.max_points = CUR.pts.n_points;\n\n    contour = 0;\n    point   = 0;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    if ( SUBPIXEL_HINTING  &&\n         CUR.ignore_x_mode )\n    {\n      CUR.iup_called = TRUE;\n      if ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_IUP )\n        return;\n    }\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    do\n    {\n      end_point   = CUR.pts.contours[contour] - CUR.pts.first_point;\n      first_point = point;\n\n      if ( BOUNDS ( end_point, CUR.pts.n_points ) )\n        end_point = CUR.pts.n_points - 1;\n\n      while ( point <= end_point && ( CUR.pts.tags[point] & mask ) == 0 )\n        point++;\n\n      if ( point <= end_point )\n      {\n        first_touched = point;\n        cur_touched   = point;\n\n        point++;\n\n        while ( point <= end_point )\n        {\n          if ( ( CUR.pts.tags[point] & mask ) != 0 )\n          {\n            _iup_worker_interpolate( &V,\n                                     cur_touched + 1,\n                                     point - 1,\n                                     cur_touched,\n                                     point );\n            cur_touched = point;\n          }\n\n          point++;\n        }\n\n        if ( cur_touched == first_touched )\n          _iup_worker_shift( &V, first_point, end_point, cur_touched );\n        else\n        {\n          _iup_worker_interpolate( &V,\n                                   (FT_UShort)( cur_touched + 1 ),\n                                   end_point,\n                                   cur_touched,\n                                   first_touched );\n\n          if ( first_touched > 0 )\n            _iup_worker_interpolate( &V,\n                                     first_point,\n                                     first_touched - 1,\n                                     cur_touched,\n                                     first_touched );\n        }\n      }\n      contour++;\n    } while ( contour < CUR.pts.n_contours );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* DELTAPn[]:    DELTA exceptions P1, P2, P3                             */\n  /* Opcode range: 0x5D,0x71,0x72                                          */\n  /* Stack:        uint32 (2 * uint32)... -->                              */\n  /*                                                                       */\n  static void\n  Ins_DELTAP( INS_ARG )\n  {\n    FT_ULong   k, nump;\n    FT_UShort  A;\n    FT_ULong   C;\n    FT_Long    B;\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    FT_UShort  B1, B2;\n\n\n    if ( SUBPIXEL_HINTING                                        &&\n         CUR.ignore_x_mode                                       &&\n         CUR.iup_called                                          &&\n         ( CUR.sph_tweak_flags & SPH_TWEAK_NO_DELTAP_AFTER_IUP ) )\n      goto Fail;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    /* Delta hinting is covered by US Patent 5159668. */\n    if ( CUR.face->unpatented_hinting )\n    {\n      FT_Long  n = args[0] * 2;\n\n\n      if ( CUR.args < n )\n      {\n        if ( CUR.pedantic_hinting )\n          CUR.error = FT_THROW( Too_Few_Arguments );\n        n = CUR.args;\n      }\n\n      CUR.args -= n;\n      CUR.new_top = CUR.args;\n      return;\n    }\n#endif\n\n    nump = (FT_ULong)args[0];   /* some points theoretically may occur more\n                                   than once, thus UShort isn't enough */\n\n    for ( k = 1; k <= nump; k++ )\n    {\n      if ( CUR.args < 2 )\n      {\n        if ( CUR.pedantic_hinting )\n          CUR.error = FT_THROW( Too_Few_Arguments );\n        CUR.args = 0;\n        goto Fail;\n      }\n\n      CUR.args -= 2;\n\n      A = (FT_UShort)CUR.stack[CUR.args + 1];\n      B = CUR.stack[CUR.args];\n\n      /* XXX: Because some popular fonts contain some invalid DeltaP */\n      /*      instructions, we simply ignore them when the stacked   */\n      /*      point reference is off limit, rather than returning an */\n      /*      error.  As a delta instruction doesn't change a glyph  */\n      /*      in great ways, this shouldn't be a problem.            */\n\n      if ( !BOUNDS( A, CUR.zp0.n_points ) )\n      {\n        C = ( (FT_ULong)B & 0xF0 ) >> 4;\n\n        switch ( CUR.opcode )\n        {\n        case 0x5D:\n          break;\n\n        case 0x71:\n          C += 16;\n          break;\n\n        case 0x72:\n          C += 32;\n          break;\n        }\n\n        C += CUR.GS.delta_base;\n\n        if ( CURRENT_Ppem() == (FT_Long)C )\n        {\n          B = ( (FT_ULong)B & 0xF ) - 8;\n          if ( B >= 0 )\n            B++;\n          B = B * 64 / ( 1L << CUR.GS.delta_shift );\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n\n          if ( SUBPIXEL_HINTING )\n          {\n            /*\n             *  Allow delta move if\n             *\n             *  - not using ignore_x_mode rendering\n             *  - glyph is specifically set to allow it\n             *  - glyph is composite and freedom vector is not subpixel\n             *    vector\n             */\n            if ( !CUR.ignore_x_mode                                   ||\n                 ( CUR.sph_tweak_flags & SPH_TWEAK_ALWAYS_DO_DELTAP ) ||\n                 ( CUR.is_composite && CUR.GS.freeVector.y != 0 )     )\n              CUR_Func_move( &CUR.zp0, A, B );\n\n            /* Otherwise apply subpixel hinting and */\n            /* compatibility mode rules             */\n            else if ( CUR.ignore_x_mode )\n            {\n              if ( CUR.GS.freeVector.y != 0 )\n                B1 = CUR.zp0.cur[A].y;\n              else\n                B1 = CUR.zp0.cur[A].x;\n\n#if 0\n              /* Standard Subpixel Hinting: Allow y move.       */\n              /* This messes up dejavu and may not be needed... */\n              if ( !CUR.face->sph_compatibility_mode &&\n                   CUR.GS.freeVector.y != 0          )\n                CUR_Func_move( &CUR.zp0, A, B );\n              else\n#endif /* 0 */\n\n              /* Compatibility Mode: Allow x or y move if point touched in */\n              /* Y direction.                                              */\n              if ( CUR.face->sph_compatibility_mode                      &&\n                   !( CUR.sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) )\n              {\n                /* save the y value of the point now; compare after move */\n                B1 = CUR.zp0.cur[A].y;\n\n                if ( CUR.sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES )\n                  B = FT_PIX_ROUND( B1 + B ) - B1;\n\n                /* Allow delta move if using sph_compatibility_mode,   */\n                /* IUP has not been called, and point is touched on Y. */\n                if ( !CUR.iup_called                            &&\n                     ( CUR.zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) )\n                  CUR_Func_move( &CUR.zp0, A, B );\n              }\n\n              B2 = CUR.zp0.cur[A].y;\n\n              /* Reverse this move if it results in a disallowed move */\n              if ( CUR.GS.freeVector.y != 0                           &&\n                   ( ( CUR.face->sph_compatibility_mode           &&\n                       ( B1 & 63 ) == 0                           &&\n                       ( B2 & 63 ) != 0                           ) ||\n                     ( ( CUR.sph_tweak_flags                    &\n                         SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP ) &&\n                       ( B1 & 63 ) != 0                           &&\n                       ( B2 & 63 ) != 0                           ) ) )\n                CUR_Func_move( &CUR.zp0, A, -B );\n            }\n          }\n          else\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n            CUR_Func_move( &CUR.zp0, A, B );\n        }\n      }\n      else\n        if ( CUR.pedantic_hinting )\n          CUR.error = FT_THROW( Invalid_Reference );\n    }\n\n  Fail:\n    CUR.new_top = CUR.args;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* DELTACn[]:    DELTA exceptions C1, C2, C3                             */\n  /* Opcode range: 0x73,0x74,0x75                                          */\n  /* Stack:        uint32 (2 * uint32)... -->                              */\n  /*                                                                       */\n  static void\n  Ins_DELTAC( INS_ARG )\n  {\n    FT_ULong  nump, k;\n    FT_ULong  A, C;\n    FT_Long   B;\n\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    /* Delta hinting is covered by US Patent 5159668. */\n    if ( CUR.face->unpatented_hinting )\n    {\n      FT_Long  n = args[0] * 2;\n\n\n      if ( CUR.args < n )\n      {\n        if ( CUR.pedantic_hinting )\n          CUR.error = FT_THROW( Too_Few_Arguments );\n        n = CUR.args;\n      }\n\n      CUR.args -= n;\n      CUR.new_top = CUR.args;\n      return;\n    }\n#endif\n\n    nump = (FT_ULong)args[0];\n\n    for ( k = 1; k <= nump; k++ )\n    {\n      if ( CUR.args < 2 )\n      {\n        if ( CUR.pedantic_hinting )\n          CUR.error = FT_THROW( Too_Few_Arguments );\n        CUR.args = 0;\n        goto Fail;\n      }\n\n      CUR.args -= 2;\n\n      A = (FT_ULong)CUR.stack[CUR.args + 1];\n      B = CUR.stack[CUR.args];\n\n      if ( BOUNDSL( A, CUR.cvtSize ) )\n      {\n        if ( CUR.pedantic_hinting )\n        {\n          CUR.error = FT_THROW( Invalid_Reference );\n          return;\n        }\n      }\n      else\n      {\n        C = ( (FT_ULong)B & 0xF0 ) >> 4;\n\n        switch ( CUR.opcode )\n        {\n        case 0x73:\n          break;\n\n        case 0x74:\n          C += 16;\n          break;\n\n        case 0x75:\n          C += 32;\n          break;\n        }\n\n        C += CUR.GS.delta_base;\n\n        if ( CURRENT_Ppem() == (FT_Long)C )\n        {\n          B = ( (FT_ULong)B & 0xF ) - 8;\n          if ( B >= 0 )\n            B++;\n          B = B * 64 / ( 1L << CUR.GS.delta_shift );\n\n          CUR_Func_move_cvt( A, B );\n        }\n      }\n    }\n\n  Fail:\n    CUR.new_top = CUR.args;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MISC. INSTRUCTIONS                                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* GETINFO[]:    GET INFOrmation                                         */\n  /* Opcode range: 0x88                                                    */\n  /* Stack:        uint32 --> uint32                                       */\n  /*                                                                       */\n  static void\n  Ins_GETINFO( INS_ARG )\n  {\n    FT_Long  K;\n\n\n    K = 0;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    /********************************/\n    /* RASTERIZER VERSION           */\n    /* Selector Bit:  0             */\n    /* Return Bit(s): 0-7           */\n    /*                              */\n    if ( SUBPIXEL_HINTING     &&\n         ( args[0] & 1 ) != 0 &&\n         CUR.ignore_x_mode    )\n    {\n      K = CUR.rasterizer_version;\n      FT_TRACE7(( \"Setting rasterizer version %d\\n\",\n                  CUR.rasterizer_version ));\n    }\n    else\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n      if ( ( args[0] & 1 ) != 0 )\n        K = TT_INTERPRETER_VERSION_35;\n\n    /********************************/\n    /* GLYPH ROTATED                */\n    /* Selector Bit:  1             */\n    /* Return Bit(s): 8             */\n    /*                              */\n    if ( ( args[0] & 2 ) != 0 && CUR.tt_metrics.rotated )\n      K |= 0x80;\n\n    /********************************/\n    /* GLYPH STRETCHED              */\n    /* Selector Bit:  2             */\n    /* Return Bit(s): 9             */\n    /*                              */\n    if ( ( args[0] & 4 ) != 0 && CUR.tt_metrics.stretched )\n      K |= 1 << 8;\n\n    /********************************/\n    /* HINTING FOR GRAYSCALE        */\n    /* Selector Bit:  5             */\n    /* Return Bit(s): 12            */\n    /*                              */\n    if ( ( args[0] & 32 ) != 0 && CUR.grayscale )\n      K |= 1 << 12;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n\n    if ( SUBPIXEL_HINTING                                    &&\n         CUR.ignore_x_mode                                   &&\n         CUR.rasterizer_version >= TT_INTERPRETER_VERSION_35 )\n    {\n      /********************************/\n      /* HINTING FOR GRAYSCALE        */\n      /* Selector Bit:  5             */\n      /* Return Bit(s): 12            */\n      /*                              */\n      if ( ( args[0] & 32 ) != 0 && CUR.grayscale_hinting )\n        K |= 1 << 12;\n\n      /********************************/\n      /* HINTING FOR SUBPIXEL         */\n      /* Selector Bit:  6             */\n      /* Return Bit(s): 13            */\n      /*                              */\n      if ( ( args[0] & 64 ) != 0        &&\n           CUR.subpixel_hinting         &&\n           CUR.rasterizer_version >= 37 )\n      {\n        K |= 1 << 13;\n\n        /* the stuff below is irrelevant if subpixel_hinting is not set */\n\n        /********************************/\n        /* COMPATIBLE WIDTHS ENABLED    */\n        /* Selector Bit:  7             */\n        /* Return Bit(s): 14            */\n        /*                              */\n        /* Functionality still needs to be added */\n        if ( ( args[0] & 128 ) != 0 && CUR.compatible_widths )\n          K |= 1 << 14;\n\n        /********************************/\n        /* SYMMETRICAL SMOOTHING        */\n        /* Selector Bit:  8             */\n        /* Return Bit(s): 15            */\n        /*                              */\n        /* Functionality still needs to be added */\n        if ( ( args[0] & 256 ) != 0 && CUR.symmetrical_smoothing )\n          K |= 1 << 15;\n\n        /********************************/\n        /* HINTING FOR BGR?             */\n        /* Selector Bit:  9             */\n        /* Return Bit(s): 16            */\n        /*                              */\n        /* Functionality still needs to be added */\n        if ( ( args[0] & 512 ) != 0 && CUR.bgr )\n          K |= 1 << 16;\n\n        if ( CUR.rasterizer_version >= 38 )\n        {\n          /********************************/\n          /* SUBPIXEL POSITIONED?         */\n          /* Selector Bit:  10            */\n          /* Return Bit(s): 17            */\n          /*                              */\n          /* Functionality still needs to be added */\n          if ( ( args[0] & 1024 ) != 0 && CUR.subpixel_positioned )\n            K |= 1 << 17;\n        }\n      }\n    }\n\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    args[0] = K;\n  }\n\n\n  static void\n  Ins_UNKNOWN( INS_ARG )\n  {\n    TT_DefRecord*  def   = CUR.IDefs;\n    TT_DefRecord*  limit = def + CUR.numIDefs;\n\n    FT_UNUSED_ARG;\n\n\n    for ( ; def < limit; def++ )\n    {\n      if ( (FT_Byte)def->opc == CUR.opcode && def->active )\n      {\n        TT_CallRec*  call;\n\n\n        if ( CUR.callTop >= CUR.callSize )\n        {\n          CUR.error = FT_THROW( Stack_Overflow );\n          return;\n        }\n\n        call = CUR.callStack + CUR.callTop++;\n\n        call->Caller_Range = CUR.curRange;\n        call->Caller_IP    = CUR.IP + 1;\n        call->Cur_Count    = 1;\n        call->Cur_Restart  = def->start;\n        call->Cur_End      = def->end;\n\n        INS_Goto_CodeRange( def->range, def->start );\n\n        CUR.step_ins = FALSE;\n        return;\n      }\n    }\n\n    CUR.error = FT_THROW( Invalid_Opcode );\n  }\n\n\n#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH\n\n\n  static\n  TInstruction_Function  Instruct_Dispatch[256] =\n  {\n    /* Opcodes are gathered in groups of 16. */\n    /* Please keep the spaces as they are.   */\n\n    /*  SVTCA  y  */  Ins_SVTCA,\n    /*  SVTCA  x  */  Ins_SVTCA,\n    /*  SPvTCA y  */  Ins_SPVTCA,\n    /*  SPvTCA x  */  Ins_SPVTCA,\n    /*  SFvTCA y  */  Ins_SFVTCA,\n    /*  SFvTCA x  */  Ins_SFVTCA,\n    /*  SPvTL //  */  Ins_SPVTL,\n    /*  SPvTL +   */  Ins_SPVTL,\n    /*  SFvTL //  */  Ins_SFVTL,\n    /*  SFvTL +   */  Ins_SFVTL,\n    /*  SPvFS     */  Ins_SPVFS,\n    /*  SFvFS     */  Ins_SFVFS,\n    /*  GPV       */  Ins_GPV,\n    /*  GFV       */  Ins_GFV,\n    /*  SFvTPv    */  Ins_SFVTPV,\n    /*  ISECT     */  Ins_ISECT,\n\n    /*  SRP0      */  Ins_SRP0,\n    /*  SRP1      */  Ins_SRP1,\n    /*  SRP2      */  Ins_SRP2,\n    /*  SZP0      */  Ins_SZP0,\n    /*  SZP1      */  Ins_SZP1,\n    /*  SZP2      */  Ins_SZP2,\n    /*  SZPS      */  Ins_SZPS,\n    /*  SLOOP     */  Ins_SLOOP,\n    /*  RTG       */  Ins_RTG,\n    /*  RTHG      */  Ins_RTHG,\n    /*  SMD       */  Ins_SMD,\n    /*  ELSE      */  Ins_ELSE,\n    /*  JMPR      */  Ins_JMPR,\n    /*  SCvTCi    */  Ins_SCVTCI,\n    /*  SSwCi     */  Ins_SSWCI,\n    /*  SSW       */  Ins_SSW,\n\n    /*  DUP       */  Ins_DUP,\n    /*  POP       */  Ins_POP,\n    /*  CLEAR     */  Ins_CLEAR,\n    /*  SWAP      */  Ins_SWAP,\n    /*  DEPTH     */  Ins_DEPTH,\n    /*  CINDEX    */  Ins_CINDEX,\n    /*  MINDEX    */  Ins_MINDEX,\n    /*  AlignPTS  */  Ins_ALIGNPTS,\n    /*  INS_0x28  */  Ins_UNKNOWN,\n    /*  UTP       */  Ins_UTP,\n    /*  LOOPCALL  */  Ins_LOOPCALL,\n    /*  CALL      */  Ins_CALL,\n    /*  FDEF      */  Ins_FDEF,\n    /*  ENDF      */  Ins_ENDF,\n    /*  MDAP[0]   */  Ins_MDAP,\n    /*  MDAP[1]   */  Ins_MDAP,\n\n    /*  IUP[0]    */  Ins_IUP,\n    /*  IUP[1]    */  Ins_IUP,\n    /*  SHP[0]    */  Ins_SHP,\n    /*  SHP[1]    */  Ins_SHP,\n    /*  SHC[0]    */  Ins_SHC,\n    /*  SHC[1]    */  Ins_SHC,\n    /*  SHZ[0]    */  Ins_SHZ,\n    /*  SHZ[1]    */  Ins_SHZ,\n    /*  SHPIX     */  Ins_SHPIX,\n    /*  IP        */  Ins_IP,\n    /*  MSIRP[0]  */  Ins_MSIRP,\n    /*  MSIRP[1]  */  Ins_MSIRP,\n    /*  AlignRP   */  Ins_ALIGNRP,\n    /*  RTDG      */  Ins_RTDG,\n    /*  MIAP[0]   */  Ins_MIAP,\n    /*  MIAP[1]   */  Ins_MIAP,\n\n    /*  NPushB    */  Ins_NPUSHB,\n    /*  NPushW    */  Ins_NPUSHW,\n    /*  WS        */  Ins_WS,\n    /*  RS        */  Ins_RS,\n    /*  WCvtP     */  Ins_WCVTP,\n    /*  RCvt      */  Ins_RCVT,\n    /*  GC[0]     */  Ins_GC,\n    /*  GC[1]     */  Ins_GC,\n    /*  SCFS      */  Ins_SCFS,\n    /*  MD[0]     */  Ins_MD,\n    /*  MD[1]     */  Ins_MD,\n    /*  MPPEM     */  Ins_MPPEM,\n    /*  MPS       */  Ins_MPS,\n    /*  FlipON    */  Ins_FLIPON,\n    /*  FlipOFF   */  Ins_FLIPOFF,\n    /*  DEBUG     */  Ins_DEBUG,\n\n    /*  LT        */  Ins_LT,\n    /*  LTEQ      */  Ins_LTEQ,\n    /*  GT        */  Ins_GT,\n    /*  GTEQ      */  Ins_GTEQ,\n    /*  EQ        */  Ins_EQ,\n    /*  NEQ       */  Ins_NEQ,\n    /*  ODD       */  Ins_ODD,\n    /*  EVEN      */  Ins_EVEN,\n    /*  IF        */  Ins_IF,\n    /*  EIF       */  Ins_EIF,\n    /*  AND       */  Ins_AND,\n    /*  OR        */  Ins_OR,\n    /*  NOT       */  Ins_NOT,\n    /*  DeltaP1   */  Ins_DELTAP,\n    /*  SDB       */  Ins_SDB,\n    /*  SDS       */  Ins_SDS,\n\n    /*  ADD       */  Ins_ADD,\n    /*  SUB       */  Ins_SUB,\n    /*  DIV       */  Ins_DIV,\n    /*  MUL       */  Ins_MUL,\n    /*  ABS       */  Ins_ABS,\n    /*  NEG       */  Ins_NEG,\n    /*  FLOOR     */  Ins_FLOOR,\n    /*  CEILING   */  Ins_CEILING,\n    /*  ROUND[0]  */  Ins_ROUND,\n    /*  ROUND[1]  */  Ins_ROUND,\n    /*  ROUND[2]  */  Ins_ROUND,\n    /*  ROUND[3]  */  Ins_ROUND,\n    /*  NROUND[0] */  Ins_NROUND,\n    /*  NROUND[1] */  Ins_NROUND,\n    /*  NROUND[2] */  Ins_NROUND,\n    /*  NROUND[3] */  Ins_NROUND,\n\n    /*  WCvtF     */  Ins_WCVTF,\n    /*  DeltaP2   */  Ins_DELTAP,\n    /*  DeltaP3   */  Ins_DELTAP,\n    /*  DeltaCn[0] */ Ins_DELTAC,\n    /*  DeltaCn[1] */ Ins_DELTAC,\n    /*  DeltaCn[2] */ Ins_DELTAC,\n    /*  SROUND    */  Ins_SROUND,\n    /*  S45Round  */  Ins_S45ROUND,\n    /*  JROT      */  Ins_JROT,\n    /*  JROF      */  Ins_JROF,\n    /*  ROFF      */  Ins_ROFF,\n    /*  INS_0x7B  */  Ins_UNKNOWN,\n    /*  RUTG      */  Ins_RUTG,\n    /*  RDTG      */  Ins_RDTG,\n    /*  SANGW     */  Ins_SANGW,\n    /*  AA        */  Ins_AA,\n\n    /*  FlipPT    */  Ins_FLIPPT,\n    /*  FlipRgON  */  Ins_FLIPRGON,\n    /*  FlipRgOFF */  Ins_FLIPRGOFF,\n    /*  INS_0x83  */  Ins_UNKNOWN,\n    /*  INS_0x84  */  Ins_UNKNOWN,\n    /*  ScanCTRL  */  Ins_SCANCTRL,\n    /*  SDPVTL[0] */  Ins_SDPVTL,\n    /*  SDPVTL[1] */  Ins_SDPVTL,\n    /*  GetINFO   */  Ins_GETINFO,\n    /*  IDEF      */  Ins_IDEF,\n    /*  ROLL      */  Ins_ROLL,\n    /*  MAX       */  Ins_MAX,\n    /*  MIN       */  Ins_MIN,\n    /*  ScanTYPE  */  Ins_SCANTYPE,\n    /*  InstCTRL  */  Ins_INSTCTRL,\n    /*  INS_0x8F  */  Ins_UNKNOWN,\n\n    /*  INS_0x90  */   Ins_UNKNOWN,\n    /*  INS_0x91  */   Ins_UNKNOWN,\n    /*  INS_0x92  */   Ins_UNKNOWN,\n    /*  INS_0x93  */   Ins_UNKNOWN,\n    /*  INS_0x94  */   Ins_UNKNOWN,\n    /*  INS_0x95  */   Ins_UNKNOWN,\n    /*  INS_0x96  */   Ins_UNKNOWN,\n    /*  INS_0x97  */   Ins_UNKNOWN,\n    /*  INS_0x98  */   Ins_UNKNOWN,\n    /*  INS_0x99  */   Ins_UNKNOWN,\n    /*  INS_0x9A  */   Ins_UNKNOWN,\n    /*  INS_0x9B  */   Ins_UNKNOWN,\n    /*  INS_0x9C  */   Ins_UNKNOWN,\n    /*  INS_0x9D  */   Ins_UNKNOWN,\n    /*  INS_0x9E  */   Ins_UNKNOWN,\n    /*  INS_0x9F  */   Ins_UNKNOWN,\n\n    /*  INS_0xA0  */   Ins_UNKNOWN,\n    /*  INS_0xA1  */   Ins_UNKNOWN,\n    /*  INS_0xA2  */   Ins_UNKNOWN,\n    /*  INS_0xA3  */   Ins_UNKNOWN,\n    /*  INS_0xA4  */   Ins_UNKNOWN,\n    /*  INS_0xA5  */   Ins_UNKNOWN,\n    /*  INS_0xA6  */   Ins_UNKNOWN,\n    /*  INS_0xA7  */   Ins_UNKNOWN,\n    /*  INS_0xA8  */   Ins_UNKNOWN,\n    /*  INS_0xA9  */   Ins_UNKNOWN,\n    /*  INS_0xAA  */   Ins_UNKNOWN,\n    /*  INS_0xAB  */   Ins_UNKNOWN,\n    /*  INS_0xAC  */   Ins_UNKNOWN,\n    /*  INS_0xAD  */   Ins_UNKNOWN,\n    /*  INS_0xAE  */   Ins_UNKNOWN,\n    /*  INS_0xAF  */   Ins_UNKNOWN,\n\n    /*  PushB[0]  */  Ins_PUSHB,\n    /*  PushB[1]  */  Ins_PUSHB,\n    /*  PushB[2]  */  Ins_PUSHB,\n    /*  PushB[3]  */  Ins_PUSHB,\n    /*  PushB[4]  */  Ins_PUSHB,\n    /*  PushB[5]  */  Ins_PUSHB,\n    /*  PushB[6]  */  Ins_PUSHB,\n    /*  PushB[7]  */  Ins_PUSHB,\n    /*  PushW[0]  */  Ins_PUSHW,\n    /*  PushW[1]  */  Ins_PUSHW,\n    /*  PushW[2]  */  Ins_PUSHW,\n    /*  PushW[3]  */  Ins_PUSHW,\n    /*  PushW[4]  */  Ins_PUSHW,\n    /*  PushW[5]  */  Ins_PUSHW,\n    /*  PushW[6]  */  Ins_PUSHW,\n    /*  PushW[7]  */  Ins_PUSHW,\n\n    /*  MDRP[00]  */  Ins_MDRP,\n    /*  MDRP[01]  */  Ins_MDRP,\n    /*  MDRP[02]  */  Ins_MDRP,\n    /*  MDRP[03]  */  Ins_MDRP,\n    /*  MDRP[04]  */  Ins_MDRP,\n    /*  MDRP[05]  */  Ins_MDRP,\n    /*  MDRP[06]  */  Ins_MDRP,\n    /*  MDRP[07]  */  Ins_MDRP,\n    /*  MDRP[08]  */  Ins_MDRP,\n    /*  MDRP[09]  */  Ins_MDRP,\n    /*  MDRP[10]  */  Ins_MDRP,\n    /*  MDRP[11]  */  Ins_MDRP,\n    /*  MDRP[12]  */  Ins_MDRP,\n    /*  MDRP[13]  */  Ins_MDRP,\n    /*  MDRP[14]  */  Ins_MDRP,\n    /*  MDRP[15]  */  Ins_MDRP,\n\n    /*  MDRP[16]  */  Ins_MDRP,\n    /*  MDRP[17]  */  Ins_MDRP,\n    /*  MDRP[18]  */  Ins_MDRP,\n    /*  MDRP[19]  */  Ins_MDRP,\n    /*  MDRP[20]  */  Ins_MDRP,\n    /*  MDRP[21]  */  Ins_MDRP,\n    /*  MDRP[22]  */  Ins_MDRP,\n    /*  MDRP[23]  */  Ins_MDRP,\n    /*  MDRP[24]  */  Ins_MDRP,\n    /*  MDRP[25]  */  Ins_MDRP,\n    /*  MDRP[26]  */  Ins_MDRP,\n    /*  MDRP[27]  */  Ins_MDRP,\n    /*  MDRP[28]  */  Ins_MDRP,\n    /*  MDRP[29]  */  Ins_MDRP,\n    /*  MDRP[30]  */  Ins_MDRP,\n    /*  MDRP[31]  */  Ins_MDRP,\n\n    /*  MIRP[00]  */  Ins_MIRP,\n    /*  MIRP[01]  */  Ins_MIRP,\n    /*  MIRP[02]  */  Ins_MIRP,\n    /*  MIRP[03]  */  Ins_MIRP,\n    /*  MIRP[04]  */  Ins_MIRP,\n    /*  MIRP[05]  */  Ins_MIRP,\n    /*  MIRP[06]  */  Ins_MIRP,\n    /*  MIRP[07]  */  Ins_MIRP,\n    /*  MIRP[08]  */  Ins_MIRP,\n    /*  MIRP[09]  */  Ins_MIRP,\n    /*  MIRP[10]  */  Ins_MIRP,\n    /*  MIRP[11]  */  Ins_MIRP,\n    /*  MIRP[12]  */  Ins_MIRP,\n    /*  MIRP[13]  */  Ins_MIRP,\n    /*  MIRP[14]  */  Ins_MIRP,\n    /*  MIRP[15]  */  Ins_MIRP,\n\n    /*  MIRP[16]  */  Ins_MIRP,\n    /*  MIRP[17]  */  Ins_MIRP,\n    /*  MIRP[18]  */  Ins_MIRP,\n    /*  MIRP[19]  */  Ins_MIRP,\n    /*  MIRP[20]  */  Ins_MIRP,\n    /*  MIRP[21]  */  Ins_MIRP,\n    /*  MIRP[22]  */  Ins_MIRP,\n    /*  MIRP[23]  */  Ins_MIRP,\n    /*  MIRP[24]  */  Ins_MIRP,\n    /*  MIRP[25]  */  Ins_MIRP,\n    /*  MIRP[26]  */  Ins_MIRP,\n    /*  MIRP[27]  */  Ins_MIRP,\n    /*  MIRP[28]  */  Ins_MIRP,\n    /*  MIRP[29]  */  Ins_MIRP,\n    /*  MIRP[30]  */  Ins_MIRP,\n    /*  MIRP[31]  */  Ins_MIRP\n  };\n\n\n#endif /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* RUN                                                                   */\n  /*                                                                       */\n  /*  This function executes a run of opcodes.  It will exit in the        */\n  /*  following cases:                                                     */\n  /*                                                                       */\n  /*  - Errors (in which case it returns FALSE).                           */\n  /*                                                                       */\n  /*  - Reaching the end of the main code range (returns TRUE).            */\n  /*    Reaching the end of a code range within a function call is an      */\n  /*    error.                                                             */\n  /*                                                                       */\n  /*  - After executing one single opcode, if the flag `Instruction_Trap'  */\n  /*    is set to TRUE (returns TRUE).                                     */\n  /*                                                                       */\n  /*  On exit with TRUE, test IP < CodeSize to know whether it comes from  */\n  /*  an instruction trap or a normal termination.                         */\n  /*                                                                       */\n  /*                                                                       */\n  /*  Note: The documented DEBUG opcode pops a value from the stack.  This */\n  /*        behaviour is unsupported; here a DEBUG opcode is always an     */\n  /*        error.                                                         */\n  /*                                                                       */\n  /*                                                                       */\n  /* THIS IS THE INTERPRETER'S MAIN LOOP.                                  */\n  /*                                                                       */\n  /*  Instructions appear in the specification's order.                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* documentation is in ttinterp.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  TT_RunIns( TT_ExecContext  exc )\n  {\n    FT_Long    ins_counter = 0;  /* executed instructions counter */\n    FT_UShort  i;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    FT_Byte    opcode_pattern[1][2] = {\n                  /* #8 TypeMan Talk Align */\n                  {\n                    0x06, /* SPVTL   */\n                    0x7D, /* RDTG    */\n                  },\n                };\n    FT_UShort  opcode_patterns   = 1;\n    FT_UShort  opcode_pointer[1] = { 0 };\n    FT_UShort  opcode_size[1]    = { 1 };\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n\n#ifdef TT_CONFIG_OPTION_STATIC_RASTER\n    cur = *exc;\n#endif\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    CUR.iup_called = FALSE;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    /* set CVT functions */\n    CUR.tt_metrics.ratio = 0;\n    if ( CUR.metrics.x_ppem != CUR.metrics.y_ppem )\n    {\n      /* non-square pixels, use the stretched routines */\n      CUR.func_read_cvt  = Read_CVT_Stretched;\n      CUR.func_write_cvt = Write_CVT_Stretched;\n      CUR.func_move_cvt  = Move_CVT_Stretched;\n    }\n    else\n    {\n      /* square pixels, use normal routines */\n      CUR.func_read_cvt  = Read_CVT;\n      CUR.func_write_cvt = Write_CVT;\n      CUR.func_move_cvt  = Move_CVT;\n    }\n\n    COMPUTE_Funcs();\n    COMPUTE_Round( (FT_Byte)exc->GS.round_state );\n\n    do\n    {\n      CUR.opcode = CUR.code[CUR.IP];\n\n      FT_TRACE7(( \"  \" ));\n      FT_TRACE7(( opcode_name[CUR.opcode] ));\n      FT_TRACE7(( \"\\n\" ));\n\n      if ( ( CUR.length = opcode_length[CUR.opcode] ) < 0 )\n      {\n        if ( CUR.IP + 1 >= CUR.codeSize )\n          goto LErrorCodeOverflow_;\n\n        CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1];\n      }\n\n      if ( CUR.IP + CUR.length > CUR.codeSize )\n        goto LErrorCodeOverflow_;\n\n      /* First, let's check for empty stack and overflow */\n      CUR.args = CUR.top - ( Pop_Push_Count[CUR.opcode] >> 4 );\n\n      /* `args' is the top of the stack once arguments have been popped. */\n      /* One can also interpret it as the index of the last argument.    */\n      if ( CUR.args < 0 )\n      {\n        if ( CUR.pedantic_hinting )\n        {\n          CUR.error = FT_THROW( Too_Few_Arguments );\n          goto LErrorLabel_;\n        }\n\n        /* push zeroes onto the stack */\n        for ( i = 0; i < Pop_Push_Count[CUR.opcode] >> 4; i++ )\n          CUR.stack[i] = 0;\n        CUR.args = 0;\n      }\n\n      CUR.new_top = CUR.args + ( Pop_Push_Count[CUR.opcode] & 15 );\n\n      /* `new_top' is the new top of the stack, after the instruction's */\n      /* execution.  `top' will be set to `new_top' after the `switch'  */\n      /* statement.                                                     */\n      if ( CUR.new_top > CUR.stackSize )\n      {\n        CUR.error = FT_THROW( Stack_Overflow );\n        goto LErrorLabel_;\n      }\n\n      CUR.step_ins = TRUE;\n      CUR.error    = FT_Err_Ok;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n\n      if ( SUBPIXEL_HINTING )\n      {\n        for ( i = 0; i < opcode_patterns; i++ )\n        {\n          if ( opcode_pointer[i] < opcode_size[i]                 &&\n               CUR.opcode == opcode_pattern[i][opcode_pointer[i]] )\n          {\n            opcode_pointer[i] += 1;\n\n            if ( opcode_pointer[i] == opcode_size[i] )\n            {\n              FT_TRACE7(( \"sph: opcode ptrn: %d, %s %s\\n\",\n                          i,\n                          CUR.face->root.family_name,\n                          CUR.face->root.style_name ));\n\n              switch ( i )\n              {\n              case 0:\n                break;\n              }\n              opcode_pointer[i] = 0;\n            }\n          }\n          else\n            opcode_pointer[i] = 0;\n        }\n      }\n\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n#ifdef TT_CONFIG_OPTION_INTERPRETER_SWITCH\n\n      {\n        FT_Long*  args   = CUR.stack + CUR.args;\n        FT_Byte   opcode = CUR.opcode;\n\n\n#undef  ARRAY_BOUND_ERROR\n#define ARRAY_BOUND_ERROR  goto Set_Invalid_Ref\n\n\n        switch ( opcode )\n        {\n        case 0x00:  /* SVTCA y  */\n        case 0x01:  /* SVTCA x  */\n        case 0x02:  /* SPvTCA y */\n        case 0x03:  /* SPvTCA x */\n        case 0x04:  /* SFvTCA y */\n        case 0x05:  /* SFvTCA x */\n          {\n            FT_Short  AA, BB;\n\n\n            AA = (FT_Short)( ( opcode & 1 ) << 14 );\n            BB = (FT_Short)( AA ^ 0x4000 );\n\n            if ( opcode < 4 )\n            {\n              CUR.GS.projVector.x = AA;\n              CUR.GS.projVector.y = BB;\n\n              CUR.GS.dualVector.x = AA;\n              CUR.GS.dualVector.y = BB;\n            }\n            else\n            {\n              GUESS_VECTOR( projVector );\n            }\n\n            if ( ( opcode & 2 ) == 0 )\n            {\n              CUR.GS.freeVector.x = AA;\n              CUR.GS.freeVector.y = BB;\n            }\n            else\n            {\n              GUESS_VECTOR( freeVector );\n            }\n\n            COMPUTE_Funcs();\n          }\n          break;\n\n        case 0x06:  /* SPvTL // */\n        case 0x07:  /* SPvTL +  */\n          DO_SPVTL\n          break;\n\n        case 0x08:  /* SFvTL // */\n        case 0x09:  /* SFvTL +  */\n          DO_SFVTL\n          break;\n\n        case 0x0A:  /* SPvFS */\n          DO_SPVFS\n          break;\n\n        case 0x0B:  /* SFvFS */\n          DO_SFVFS\n          break;\n\n        case 0x0C:  /* GPV */\n          DO_GPV\n          break;\n\n        case 0x0D:  /* GFV */\n          DO_GFV\n          break;\n\n        case 0x0E:  /* SFvTPv */\n          DO_SFVTPV\n          break;\n\n        case 0x0F:  /* ISECT  */\n          Ins_ISECT( EXEC_ARG_ args );\n          break;\n\n        case 0x10:  /* SRP0 */\n          DO_SRP0\n          break;\n\n        case 0x11:  /* SRP1 */\n          DO_SRP1\n          break;\n\n        case 0x12:  /* SRP2 */\n          DO_SRP2\n          break;\n\n        case 0x13:  /* SZP0 */\n          Ins_SZP0( EXEC_ARG_ args );\n          break;\n\n        case 0x14:  /* SZP1 */\n          Ins_SZP1( EXEC_ARG_ args );\n          break;\n\n        case 0x15:  /* SZP2 */\n          Ins_SZP2( EXEC_ARG_ args );\n          break;\n\n        case 0x16:  /* SZPS */\n          Ins_SZPS( EXEC_ARG_ args );\n          break;\n\n        case 0x17:  /* SLOOP */\n          DO_SLOOP\n          break;\n\n        case 0x18:  /* RTG */\n          DO_RTG\n          break;\n\n        case 0x19:  /* RTHG */\n          DO_RTHG\n          break;\n\n        case 0x1A:  /* SMD */\n          DO_SMD\n          break;\n\n        case 0x1B:  /* ELSE */\n          Ins_ELSE( EXEC_ARG_ args );\n          break;\n\n        case 0x1C:  /* JMPR */\n          DO_JMPR\n          break;\n\n        case 0x1D:  /* SCVTCI */\n          DO_SCVTCI\n          break;\n\n        case 0x1E:  /* SSWCI */\n          DO_SSWCI\n          break;\n\n        case 0x1F:  /* SSW */\n          DO_SSW\n          break;\n\n        case 0x20:  /* DUP */\n          DO_DUP\n          break;\n\n        case 0x21:  /* POP */\n          /* nothing :-) */\n          break;\n\n        case 0x22:  /* CLEAR */\n          DO_CLEAR\n          break;\n\n        case 0x23:  /* SWAP */\n          DO_SWAP\n          break;\n\n        case 0x24:  /* DEPTH */\n          DO_DEPTH\n          break;\n\n        case 0x25:  /* CINDEX */\n          DO_CINDEX\n          break;\n\n        case 0x26:  /* MINDEX */\n          Ins_MINDEX( EXEC_ARG_ args );\n          break;\n\n        case 0x27:  /* ALIGNPTS */\n          Ins_ALIGNPTS( EXEC_ARG_ args );\n          break;\n\n        case 0x28:  /* ???? */\n          Ins_UNKNOWN( EXEC_ARG_ args );\n          break;\n\n        case 0x29:  /* UTP */\n          Ins_UTP( EXEC_ARG_ args );\n          break;\n\n        case 0x2A:  /* LOOPCALL */\n          Ins_LOOPCALL( EXEC_ARG_ args );\n          break;\n\n        case 0x2B:  /* CALL */\n          Ins_CALL( EXEC_ARG_ args );\n          break;\n\n        case 0x2C:  /* FDEF */\n          Ins_FDEF( EXEC_ARG_ args );\n          break;\n\n        case 0x2D:  /* ENDF */\n          Ins_ENDF( EXEC_ARG_ args );\n          break;\n\n        case 0x2E:  /* MDAP */\n        case 0x2F:  /* MDAP */\n          Ins_MDAP( EXEC_ARG_ args );\n          break;\n\n        case 0x30:  /* IUP */\n        case 0x31:  /* IUP */\n          Ins_IUP( EXEC_ARG_ args );\n          break;\n\n        case 0x32:  /* SHP */\n        case 0x33:  /* SHP */\n          Ins_SHP( EXEC_ARG_ args );\n          break;\n\n        case 0x34:  /* SHC */\n        case 0x35:  /* SHC */\n          Ins_SHC( EXEC_ARG_ args );\n          break;\n\n        case 0x36:  /* SHZ */\n        case 0x37:  /* SHZ */\n          Ins_SHZ( EXEC_ARG_ args );\n          break;\n\n        case 0x38:  /* SHPIX */\n          Ins_SHPIX( EXEC_ARG_ args );\n          break;\n\n        case 0x39:  /* IP    */\n          Ins_IP( EXEC_ARG_ args );\n          break;\n\n        case 0x3A:  /* MSIRP */\n        case 0x3B:  /* MSIRP */\n          Ins_MSIRP( EXEC_ARG_ args );\n          break;\n\n        case 0x3C:  /* AlignRP */\n          Ins_ALIGNRP( EXEC_ARG_ args );\n          break;\n\n        case 0x3D:  /* RTDG */\n          DO_RTDG\n          break;\n\n        case 0x3E:  /* MIAP */\n        case 0x3F:  /* MIAP */\n          Ins_MIAP( EXEC_ARG_ args );\n          break;\n\n        case 0x40:  /* NPUSHB */\n          Ins_NPUSHB( EXEC_ARG_ args );\n          break;\n\n        case 0x41:  /* NPUSHW */\n          Ins_NPUSHW( EXEC_ARG_ args );\n          break;\n\n        case 0x42:  /* WS */\n          DO_WS\n          break;\n\n      Set_Invalid_Ref:\n            CUR.error = FT_THROW( Invalid_Reference );\n          break;\n\n        case 0x43:  /* RS */\n          DO_RS\n          break;\n\n        case 0x44:  /* WCVTP */\n          DO_WCVTP\n          break;\n\n        case 0x45:  /* RCVT */\n          DO_RCVT\n          break;\n\n        case 0x46:  /* GC */\n        case 0x47:  /* GC */\n          Ins_GC( EXEC_ARG_ args );\n          break;\n\n        case 0x48:  /* SCFS */\n          Ins_SCFS( EXEC_ARG_ args );\n          break;\n\n        case 0x49:  /* MD */\n        case 0x4A:  /* MD */\n          Ins_MD( EXEC_ARG_ args );\n          break;\n\n        case 0x4B:  /* MPPEM */\n          DO_MPPEM\n          break;\n\n        case 0x4C:  /* MPS */\n          DO_MPS\n          break;\n\n        case 0x4D:  /* FLIPON */\n          DO_FLIPON\n          break;\n\n        case 0x4E:  /* FLIPOFF */\n          DO_FLIPOFF\n          break;\n\n        case 0x4F:  /* DEBUG */\n          DO_DEBUG\n          break;\n\n        case 0x50:  /* LT */\n          DO_LT\n          break;\n\n        case 0x51:  /* LTEQ */\n          DO_LTEQ\n          break;\n\n        case 0x52:  /* GT */\n          DO_GT\n          break;\n\n        case 0x53:  /* GTEQ */\n          DO_GTEQ\n          break;\n\n        case 0x54:  /* EQ */\n          DO_EQ\n          break;\n\n        case 0x55:  /* NEQ */\n          DO_NEQ\n          break;\n\n        case 0x56:  /* ODD */\n          DO_ODD\n          break;\n\n        case 0x57:  /* EVEN */\n          DO_EVEN\n          break;\n\n        case 0x58:  /* IF */\n          Ins_IF( EXEC_ARG_ args );\n          break;\n\n        case 0x59:  /* EIF */\n          /* do nothing */\n          break;\n\n        case 0x5A:  /* AND */\n          DO_AND\n          break;\n\n        case 0x5B:  /* OR */\n          DO_OR\n          break;\n\n        case 0x5C:  /* NOT */\n          DO_NOT\n          break;\n\n        case 0x5D:  /* DELTAP1 */\n          Ins_DELTAP( EXEC_ARG_ args );\n          break;\n\n        case 0x5E:  /* SDB */\n          DO_SDB\n          break;\n\n        case 0x5F:  /* SDS */\n          DO_SDS\n          break;\n\n        case 0x60:  /* ADD */\n          DO_ADD\n          break;\n\n        case 0x61:  /* SUB */\n          DO_SUB\n          break;\n\n        case 0x62:  /* DIV */\n          DO_DIV\n          break;\n\n        case 0x63:  /* MUL */\n          DO_MUL\n          break;\n\n        case 0x64:  /* ABS */\n          DO_ABS\n          break;\n\n        case 0x65:  /* NEG */\n          DO_NEG\n          break;\n\n        case 0x66:  /* FLOOR */\n          DO_FLOOR\n          break;\n\n        case 0x67:  /* CEILING */\n          DO_CEILING\n          break;\n\n        case 0x68:  /* ROUND */\n        case 0x69:  /* ROUND */\n        case 0x6A:  /* ROUND */\n        case 0x6B:  /* ROUND */\n          DO_ROUND\n          break;\n\n        case 0x6C:  /* NROUND */\n        case 0x6D:  /* NROUND */\n        case 0x6E:  /* NRRUND */\n        case 0x6F:  /* NROUND */\n          DO_NROUND\n          break;\n\n        case 0x70:  /* WCVTF */\n          DO_WCVTF\n          break;\n\n        case 0x71:  /* DELTAP2 */\n        case 0x72:  /* DELTAP3 */\n          Ins_DELTAP( EXEC_ARG_ args );\n          break;\n\n        case 0x73:  /* DELTAC0 */\n        case 0x74:  /* DELTAC1 */\n        case 0x75:  /* DELTAC2 */\n          Ins_DELTAC( EXEC_ARG_ args );\n          break;\n\n        case 0x76:  /* SROUND */\n          DO_SROUND\n          break;\n\n        case 0x77:  /* S45Round */\n          DO_S45ROUND\n          break;\n\n        case 0x78:  /* JROT */\n          DO_JROT\n          break;\n\n        case 0x79:  /* JROF */\n          DO_JROF\n          break;\n\n        case 0x7A:  /* ROFF */\n          DO_ROFF\n          break;\n\n        case 0x7B:  /* ???? */\n          Ins_UNKNOWN( EXEC_ARG_ args );\n          break;\n\n        case 0x7C:  /* RUTG */\n          DO_RUTG\n          break;\n\n        case 0x7D:  /* RDTG */\n          DO_RDTG\n          break;\n\n        case 0x7E:  /* SANGW */\n        case 0x7F:  /* AA    */\n          /* nothing - obsolete */\n          break;\n\n        case 0x80:  /* FLIPPT */\n          Ins_FLIPPT( EXEC_ARG_ args );\n          break;\n\n        case 0x81:  /* FLIPRGON */\n          Ins_FLIPRGON( EXEC_ARG_ args );\n          break;\n\n        case 0x82:  /* FLIPRGOFF */\n          Ins_FLIPRGOFF( EXEC_ARG_ args );\n          break;\n\n        case 0x83:  /* UNKNOWN */\n        case 0x84:  /* UNKNOWN */\n          Ins_UNKNOWN( EXEC_ARG_ args );\n          break;\n\n        case 0x85:  /* SCANCTRL */\n          Ins_SCANCTRL( EXEC_ARG_ args );\n          break;\n\n        case 0x86:  /* SDPVTL */\n        case 0x87:  /* SDPVTL */\n          Ins_SDPVTL( EXEC_ARG_ args );\n          break;\n\n        case 0x88:  /* GETINFO */\n          Ins_GETINFO( EXEC_ARG_ args );\n          break;\n\n        case 0x89:  /* IDEF */\n          Ins_IDEF( EXEC_ARG_ args );\n          break;\n\n        case 0x8A:  /* ROLL */\n          Ins_ROLL( EXEC_ARG_ args );\n          break;\n\n        case 0x8B:  /* MAX */\n          DO_MAX\n          break;\n\n        case 0x8C:  /* MIN */\n          DO_MIN\n          break;\n\n        case 0x8D:  /* SCANTYPE */\n          Ins_SCANTYPE( EXEC_ARG_ args );\n          break;\n\n        case 0x8E:  /* INSTCTRL */\n          Ins_INSTCTRL( EXEC_ARG_ args );\n          break;\n\n        case 0x8F:\n          Ins_UNKNOWN( EXEC_ARG_ args );\n          break;\n\n        default:\n          if ( opcode >= 0xE0 )\n            Ins_MIRP( EXEC_ARG_ args );\n          else if ( opcode >= 0xC0 )\n            Ins_MDRP( EXEC_ARG_ args );\n          else if ( opcode >= 0xB8 )\n            Ins_PUSHW( EXEC_ARG_ args );\n          else if ( opcode >= 0xB0 )\n            Ins_PUSHB( EXEC_ARG_ args );\n          else\n            Ins_UNKNOWN( EXEC_ARG_ args );\n        }\n\n      }\n\n#else\n\n      Instruct_Dispatch[CUR.opcode]( EXEC_ARG_ &CUR.stack[CUR.args] );\n\n#endif /* TT_CONFIG_OPTION_INTERPRETER_SWITCH */\n\n      if ( CUR.error )\n      {\n        switch ( CUR.error )\n        {\n          /* looking for redefined instructions */\n        case FT_ERR( Invalid_Opcode ):\n          {\n            TT_DefRecord*  def   = CUR.IDefs;\n            TT_DefRecord*  limit = def + CUR.numIDefs;\n\n\n            for ( ; def < limit; def++ )\n            {\n              if ( def->active && CUR.opcode == (FT_Byte)def->opc )\n              {\n                TT_CallRec*  callrec;\n\n\n                if ( CUR.callTop >= CUR.callSize )\n                {\n                  CUR.error = FT_THROW( Invalid_Reference );\n                  goto LErrorLabel_;\n                }\n\n                callrec = &CUR.callStack[CUR.callTop];\n\n                callrec->Caller_Range = CUR.curRange;\n                callrec->Caller_IP    = CUR.IP + 1;\n                callrec->Cur_Count    = 1;\n                callrec->Cur_Restart  = def->start;\n                callrec->Cur_End      = def->end;\n\n                if ( INS_Goto_CodeRange( def->range, def->start ) == FAILURE )\n                  goto LErrorLabel_;\n\n                goto LSuiteLabel_;\n              }\n            }\n          }\n\n          CUR.error = FT_THROW( Invalid_Opcode );\n          goto LErrorLabel_;\n\n#if 0\n          break;   /* Unreachable code warning suppression.             */\n                   /* Leave to remind in case a later change the editor */\n                   /* to consider break;                                */\n#endif\n\n        default:\n          goto LErrorLabel_;\n\n#if 0\n        break;\n#endif\n        }\n      }\n\n      CUR.top = CUR.new_top;\n\n      if ( CUR.step_ins )\n        CUR.IP += CUR.length;\n\n      /* increment instruction counter and check if we didn't */\n      /* run this program for too long (e.g. infinite loops). */\n      if ( ++ins_counter > MAX_RUNNABLE_OPCODES )\n        return FT_THROW( Execution_Too_Long );\n\n    LSuiteLabel_:\n      if ( CUR.IP >= CUR.codeSize )\n      {\n        if ( CUR.callTop > 0 )\n        {\n          CUR.error = FT_THROW( Code_Overflow );\n          goto LErrorLabel_;\n        }\n        else\n          goto LNo_Error_;\n      }\n    } while ( !CUR.instruction_trap );\n\n  LNo_Error_:\n\n#ifdef TT_CONFIG_OPTION_STATIC_RASTER\n    *exc = cur;\n#endif\n\n    return FT_Err_Ok;\n\n  LErrorCodeOverflow_:\n    CUR.error = FT_THROW( Code_Overflow );\n\n  LErrorLabel_:\n\n#ifdef TT_CONFIG_OPTION_STATIC_RASTER\n    *exc = cur;\n#endif\n\n    /* If any errors have occurred, function tables may be broken. */\n    /* Force a re-execution of `prep' and `fpgm' tables if no      */\n    /* bytecode debugger is run.                                   */\n    if ( CUR.error && !CUR.instruction_trap )\n    {\n      FT_TRACE1(( \"  The interpreter returned error 0x%x\\n\", CUR.error ));\n      exc->size->cvt_ready      = FALSE;\n    }\n\n    return CUR.error;\n  }\n\n\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttinterp.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttinterp.h                                                             */\n/*                                                                         */\n/*    TrueType bytecode interpreter (specification).                       */\n/*                                                                         */\n/*  Copyright 1996-2007, 2010, 2012-2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTINTERP_H__\n#define __TTINTERP_H__\n\n#include \"../../include/ft2build.h\"\n#include \"ttobjs.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#ifndef TT_CONFIG_OPTION_STATIC_INTERPRETER /* indirect implementation */\n\n#define EXEC_OP_   TT_ExecContext  exc,\n#define EXEC_OP    TT_ExecContext  exc\n#define EXEC_ARG_  exc,\n#define EXEC_ARG   exc\n\n#else                                       /* static implementation */\n\n#define EXEC_OP_   /* void */\n#define EXEC_OP    /* void */\n#define EXEC_ARG_  /* void */\n#define EXEC_ARG   /* void */\n\n#endif /* TT_CONFIG_OPTION_STATIC_INTERPRETER */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Rounding mode constants.                                              */\n  /*                                                                       */\n#define TT_Round_Off             5\n#define TT_Round_To_Half_Grid    0\n#define TT_Round_To_Grid         1\n#define TT_Round_To_Double_Grid  2\n#define TT_Round_Up_To_Grid      4\n#define TT_Round_Down_To_Grid    3\n#define TT_Round_Super           6\n#define TT_Round_Super_45        7\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Function types used by the interpreter, depending on various modes    */\n  /* (e.g. the rounding mode, whether to render a vertical or horizontal   */\n  /* line etc).                                                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n  /* Rounding function */\n  typedef FT_F26Dot6\n  (*TT_Round_Func)( EXEC_OP_ FT_F26Dot6  distance,\n                             FT_F26Dot6  compensation );\n\n  /* Point displacement along the freedom vector routine */\n  typedef void\n  (*TT_Move_Func)( EXEC_OP_ TT_GlyphZone  zone,\n                            FT_UShort     point,\n                            FT_F26Dot6    distance );\n\n  /* Distance projection along one of the projection vectors */\n  typedef FT_F26Dot6\n  (*TT_Project_Func)( EXEC_OP_ FT_Pos   dx,\n                               FT_Pos   dy );\n\n  /* reading a cvt value.  Take care of non-square pixels if necessary */\n  typedef FT_F26Dot6\n  (*TT_Get_CVT_Func)( EXEC_OP_ FT_ULong  idx );\n\n  /* setting or moving a cvt value.  Take care of non-square pixels  */\n  /* if necessary                                                    */\n  typedef void\n  (*TT_Set_CVT_Func)( EXEC_OP_ FT_ULong    idx,\n                               FT_F26Dot6  value );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This structure defines a call record, used to manage function calls.  */\n  /*                                                                       */\n  typedef struct  TT_CallRec_\n  {\n    FT_Int   Caller_Range;\n    FT_Long  Caller_IP;\n    FT_Long  Cur_Count;\n    FT_Long  Cur_Restart;\n    FT_Long  Cur_End;\n\n  } TT_CallRec, *TT_CallStack;\n\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* These structures define rules used to tweak subpixel hinting for      */\n  /* various fonts.  \"\", 0, \"\", NULL value indicates to match any value.   */\n  /*                                                                       */\n\n#define SPH_MAX_NAME_SIZE      32\n#define SPH_MAX_CLASS_MEMBERS  100\n\n  typedef struct  SPH_TweakRule_\n  {\n    const char      family[SPH_MAX_NAME_SIZE];\n    const FT_UInt   ppem;\n    const char      style[SPH_MAX_NAME_SIZE];\n    const FT_ULong  glyph;\n\n  } SPH_TweakRule;\n\n\n  typedef struct  SPH_ScaleRule_\n  {\n    const char      family[SPH_MAX_NAME_SIZE];\n    const FT_UInt   ppem;\n    const char      style[SPH_MAX_NAME_SIZE];\n    const FT_ULong  glyph;\n    const FT_ULong  scale;\n\n  } SPH_ScaleRule;\n\n\n  typedef struct  SPH_Font_Class_\n  {\n    const char  name[SPH_MAX_NAME_SIZE];\n    const char  member[SPH_MAX_CLASS_MEMBERS][SPH_MAX_NAME_SIZE];\n\n  } SPH_Font_Class;\n\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The main structure for the interpreter which collects all necessary   */\n  /* variables and states.                                                 */\n  /*                                                                       */\n  typedef struct  TT_ExecContextRec_\n  {\n    TT_Face            face;\n    TT_Size            size;\n    FT_Memory          memory;\n\n    /* instructions state */\n\n    FT_Error           error;      /* last execution error */\n\n    FT_Long            top;        /* top of exec. stack   */\n\n    FT_UInt            stackSize;  /* size of exec. stack  */\n    FT_Long*           stack;      /* current exec. stack  */\n\n    FT_Long            args;\n    FT_UInt            new_top;    /* new top after exec.  */\n\n    TT_GlyphZoneRec    zp0,        /* zone records */\n                       zp1,\n                       zp2,\n                       pts,\n                       twilight;\n\n    FT_Size_Metrics    metrics;\n    TT_Size_Metrics    tt_metrics; /* size metrics */\n\n    TT_GraphicsState   GS;         /* current graphics state */\n\n    FT_Int             curRange;  /* current code range number   */\n    FT_Byte*           code;      /* current code range          */\n    FT_Long            IP;        /* current instruction pointer */\n    FT_Long            codeSize;  /* size of current range       */\n\n    FT_Byte            opcode;    /* current opcode              */\n    FT_Int             length;    /* length of current opcode    */\n\n    FT_Bool            step_ins;  /* true if the interpreter must */\n                                  /* increment IP after ins. exec */\n    FT_ULong           cvtSize;\n    FT_Long*           cvt;\n\n    FT_UInt            glyphSize; /* glyph instructions buffer size */\n    FT_Byte*           glyphIns;  /* glyph instructions buffer */\n\n    FT_UInt            numFDefs;  /* number of function defs         */\n    FT_UInt            maxFDefs;  /* maximum number of function defs */\n    TT_DefArray        FDefs;     /* table of FDefs entries          */\n\n    FT_UInt            numIDefs;  /* number of instruction defs */\n    FT_UInt            maxIDefs;  /* maximum number of ins defs */\n    TT_DefArray        IDefs;     /* table of IDefs entries     */\n\n    FT_UInt            maxFunc;   /* maximum function index     */\n    FT_UInt            maxIns;    /* maximum instruction index  */\n\n    FT_Int             callTop,    /* top of call stack during execution */\n                       callSize;   /* size of call stack */\n    TT_CallStack       callStack;  /* call stack */\n\n    FT_UShort          maxPoints;    /* capacity of this context's `pts' */\n    FT_Short           maxContours;  /* record, expressed in points and  */\n                                     /* contours.                        */\n\n    TT_CodeRangeTable  codeRangeTable;  /* table of valid code ranges */\n                                        /* useful for the debugger   */\n\n    FT_UShort          storeSize;  /* size of current storage */\n    FT_Long*           storage;    /* storage area            */\n\n    FT_F26Dot6         period;     /* values used for the */\n    FT_F26Dot6         phase;      /* `SuperRounding'     */\n    FT_F26Dot6         threshold;\n\n#if 0\n    /* this seems to be unused */\n    FT_Int             cur_ppem;   /* ppem along the current proj vector */\n#endif\n\n    FT_Bool            instruction_trap; /* If `True', the interpreter will */\n                                         /* exit after each instruction     */\n\n    TT_GraphicsState   default_GS;       /* graphics state resulting from   */\n                                         /* the prep program                */\n    FT_Bool            is_composite;     /* true if the glyph is composite  */\n    FT_Bool            pedantic_hinting; /* true if pedantic interpretation */\n\n    /* latest interpreter additions */\n\n    FT_Long            F_dot_P;    /* dot product of freedom and projection */\n                                   /* vectors                               */\n    TT_Round_Func      func_round; /* current rounding function             */\n\n    TT_Project_Func    func_project,   /* current projection function */\n                       func_dualproj,  /* current dual proj. function */\n                       func_freeProj;  /* current freedom proj. func  */\n\n    TT_Move_Func       func_move;      /* current point move function */\n    TT_Move_Func       func_move_orig; /* move original position function */\n\n    TT_Get_CVT_Func    func_read_cvt;  /* read a cvt entry              */\n    TT_Set_CVT_Func    func_write_cvt; /* write a cvt entry (in pixels) */\n    TT_Set_CVT_Func    func_move_cvt;  /* incr a cvt entry (in pixels)  */\n\n    FT_Bool            grayscale;      /* are we hinting for grayscale? */\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    TT_Round_Func      func_round_sphn;   /* subpixel rounding function */\n\n    FT_Bool            grayscale_hinting; /* Using grayscale hinting?      */\n    FT_Bool            subpixel_hinting;  /* Using subpixel hinting?       */\n    FT_Bool            native_hinting;    /* Using native hinting?         */\n    FT_Bool            ignore_x_mode;     /* Standard rendering mode for   */\n                                          /* subpixel hinting.  On if gray */\n                                          /* or subpixel hinting is on )   */\n\n    /* The following 4 aren't fully implemented but here for MS rasterizer */\n    /* compatibility.                                                      */\n    FT_Bool            compatible_widths;     /* compatible widths?        */\n    FT_Bool            symmetrical_smoothing; /* symmetrical_smoothing?    */\n    FT_Bool            bgr;                   /* bgr instead of rgb?       */\n    FT_Bool            subpixel_positioned;   /* subpixel positioned       */\n                                              /* (DirectWrite ClearType)?  */\n\n    FT_Int             rasterizer_version;    /* MS rasterizer version     */\n\n    FT_Bool            iup_called;            /* IUP called for glyph?     */\n\n    FT_ULong           sph_tweak_flags;       /* flags to control          */\n                                              /* hint tweaks               */\n\n    FT_ULong           sph_in_func_flags;     /* flags to indicate if in   */\n                                              /* special functions         */\n\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n  } TT_ExecContextRec;\n\n\n  extern const TT_GraphicsState  tt_default_graphics_state;\n\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n  FT_LOCAL( FT_Error )\n  TT_Goto_CodeRange( TT_ExecContext  exec,\n                     FT_Int          range,\n                     FT_Long         IP );\n\n  FT_LOCAL( FT_Error )\n  TT_Set_CodeRange( TT_ExecContext  exec,\n                    FT_Int          range,\n                    void*           base,\n                    FT_Long         length );\n\n  FT_LOCAL( FT_Error )\n  TT_Clear_CodeRange( TT_ExecContext  exec,\n                      FT_Int          range );\n\n\n  FT_LOCAL( FT_Error )\n  Update_Max( FT_Memory  memory,\n              FT_ULong*  size,\n              FT_Long    multiplier,\n              void*      _pbuff,\n              FT_ULong   new_max );\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_New_Context                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Queries the face context for a given font.  Note that there is     */\n  /*    now a _single_ execution context in the TrueType driver which is   */\n  /*    shared among faces.                                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to the source face object.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A handle to the execution context.  Initialized for `face'.        */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Only the glyph loader and debugger should call this function.      */\n  /*                                                                       */\n  FT_EXPORT( TT_ExecContext )\n  TT_New_Context( TT_Driver  driver );\n\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n  FT_LOCAL( FT_Error )\n  TT_Done_Context( TT_ExecContext  exec );\n\n  FT_LOCAL( FT_Error )\n  TT_Load_Context( TT_ExecContext  exec,\n                   TT_Face         face,\n                   TT_Size         size );\n\n  FT_LOCAL( FT_Error )\n  TT_Save_Context( TT_ExecContext  exec,\n                   TT_Size         ins );\n\n  FT_LOCAL( FT_Error )\n  TT_Run_Context( TT_ExecContext  exec,\n                  FT_Bool         debug );\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_RunIns                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Executes one or more instruction in the execution context.  This   */\n  /*    is the main function of the TrueType opcode interpreter.           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    exec :: A handle to the target execution context.                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Only the object manager and debugger should call this function.    */\n  /*                                                                       */\n  /*    This function is publicly exported because it is directly          */\n  /*    invoked by the TrueType debugger.                                  */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  TT_RunIns( TT_ExecContext  exec );\n\n\nFT_END_HEADER\n\n#endif /* __TTINTERP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttobjs.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttobjs.c                                                               */\n/*                                                                         */\n/*    Objects manager (body).                                              */\n/*                                                                         */\n/*  Copyright 1996-2013                                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/tttags.h\"\n#include \"../../include/freetype/internal/sfnt.h\"\n#include \"../../include/freetype/ftttdrv.h\"\n\n#include \"ttgload.h\"\n#include \"ttpload.h\"\n\n#include \"tterrors.h\"\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n#include \"ttinterp.h\"\n#endif\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n#include \"../../include/freetype/ttunpat.h\"\n#endif\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n#include \"ttgxvar.h\"\n#endif\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttobjs\n\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                       GLYPH ZONE FUNCTIONS                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_glyphzone_done                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Deallocate a glyph zone.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    zone :: A pointer to the target glyph zone.                        */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  tt_glyphzone_done( TT_GlyphZone  zone )\n  {\n    FT_Memory  memory = zone->memory;\n\n\n    if ( memory )\n    {\n      FT_FREE( zone->contours );\n      FT_FREE( zone->tags );\n      FT_FREE( zone->cur );\n      FT_FREE( zone->org );\n      FT_FREE( zone->orus );\n\n      zone->max_points   = zone->n_points   = 0;\n      zone->max_contours = zone->n_contours = 0;\n      zone->memory       = NULL;\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_glyphzone_new                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Allocate a new glyph zone.                                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory      :: A handle to the current memory object.              */\n  /*                                                                       */\n  /*    maxPoints   :: The capacity of glyph zone in points.               */\n  /*                                                                       */\n  /*    maxContours :: The capacity of glyph zone in contours.             */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    zone        :: A pointer to the target glyph zone record.          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_glyphzone_new( FT_Memory     memory,\n                    FT_UShort     maxPoints,\n                    FT_Short      maxContours,\n                    TT_GlyphZone  zone )\n  {\n    FT_Error  error;\n\n\n    FT_MEM_ZERO( zone, sizeof ( *zone ) );\n    zone->memory = memory;\n\n    if ( FT_NEW_ARRAY( zone->org,      maxPoints   ) ||\n         FT_NEW_ARRAY( zone->cur,      maxPoints   ) ||\n         FT_NEW_ARRAY( zone->orus,     maxPoints   ) ||\n         FT_NEW_ARRAY( zone->tags,     maxPoints   ) ||\n         FT_NEW_ARRAY( zone->contours, maxContours ) )\n    {\n      tt_glyphzone_done( zone );\n    }\n    else\n    {\n      zone->max_points   = maxPoints;\n      zone->max_contours = maxContours;\n    }\n\n    return error;\n  }\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n\n\n  /* Compare the face with a list of well-known `tricky' fonts. */\n  /* This list shall be expanded as we find more of them.       */\n\n  static FT_Bool\n  tt_check_trickyness_family( FT_String*  name )\n  {\n\n#define TRICK_NAMES_MAX_CHARACTERS  16\n#define TRICK_NAMES_COUNT            8\n\n    static const char trick_names[TRICK_NAMES_COUNT]\n                                 [TRICK_NAMES_MAX_CHARACTERS + 1] =\n    {\n      \"DFKaiSho-SB\",     /* dfkaisb.ttf */\n      \"DFKaiShu\",\n      \"DFKai-SB\",        /* kaiu.ttf */\n      \"HuaTianKaiTi?\",   /* htkt2.ttf */\n      \"HuaTianSongTi?\",  /* htst3.ttf */\n      \"MingLiU\",         /* mingliu.ttf & mingliu.ttc */\n      \"PMingLiU\",        /* mingliu.ttc */\n      \"MingLi43\",        /* mingli.ttf */\n    };\n\n    int  nn;\n\n\n    for ( nn = 0; nn < TRICK_NAMES_COUNT; nn++ )\n      if ( ft_strstr( name, trick_names[nn] ) )\n        return TRUE;\n\n    return FALSE;\n  }\n\n\n  /* XXX: This function should be in the `sfnt' module. */\n\n  /* Some PDF generators clear the checksums in the TrueType header table. */\n  /* For example, Quartz ContextPDF clears all entries, or Bullzip PDF     */\n  /* Printer clears the entries for subsetted subtables.  We thus have to  */\n  /* recalculate the checksums  where necessary.                           */\n\n  static FT_UInt32\n  tt_synth_sfnt_checksum( FT_Stream  stream,\n                          FT_ULong   length )\n  {\n    FT_Error   error;\n    FT_UInt32  checksum = 0;\n    int        i;\n\n\n    if ( FT_FRAME_ENTER( length ) )\n      return 0;\n\n    for ( ; length > 3; length -= 4 )\n      checksum += (FT_UInt32)FT_GET_ULONG();\n\n    for ( i = 3; length > 0; length --, i-- )\n      checksum += (FT_UInt32)( FT_GET_BYTE() << ( i * 8 ) );\n\n    FT_FRAME_EXIT();\n\n    return checksum;\n  }\n\n\n  /* XXX: This function should be in the `sfnt' module. */\n\n  static FT_ULong\n  tt_get_sfnt_checksum( TT_Face    face,\n                        FT_UShort  i )\n  {\n#if 0 /* if we believe the written value, use following part. */\n    if ( face->dir_tables[i].CheckSum )\n      return face->dir_tables[i].CheckSum;\n#endif\n\n    if ( !face->goto_table )\n      return 0;\n\n    if ( face->goto_table( face,\n                           face->dir_tables[i].Tag,\n                           face->root.stream,\n                           NULL ) )\n      return 0;\n\n    return (FT_ULong)tt_synth_sfnt_checksum( face->root.stream,\n                                             face->dir_tables[i].Length );\n  }\n\n\n  typedef struct tt_sfnt_id_rec_\n  {\n    FT_ULong  CheckSum;\n    FT_ULong  Length;\n\n  } tt_sfnt_id_rec;\n\n\n  static FT_Bool\n  tt_check_trickyness_sfnt_ids( TT_Face  face )\n  {\n#define TRICK_SFNT_IDS_PER_FACE   3\n#define TRICK_SFNT_IDS_NUM_FACES  17\n\n    static const tt_sfnt_id_rec sfnt_id[TRICK_SFNT_IDS_NUM_FACES]\n                                       [TRICK_SFNT_IDS_PER_FACE] = {\n\n#define TRICK_SFNT_ID_cvt   0\n#define TRICK_SFNT_ID_fpgm  1\n#define TRICK_SFNT_ID_prep  2\n\n      { /* MingLiU 1995 */\n        { 0x05bcf058, 0x000002e4 }, /* cvt  */\n        { 0x28233bf1, 0x000087c4 }, /* fpgm */\n        { 0xa344a1ea, 0x000001e1 }  /* prep */\n      },\n      { /* MingLiU 1996- */\n        { 0x05bcf058, 0x000002e4 }, /* cvt  */\n        { 0x28233bf1, 0x000087c4 }, /* fpgm */\n        { 0xa344a1eb, 0x000001e1 }  /* prep */\n      },\n      { /* DFKaiShu */\n        { 0x11e5ead4, 0x00000350 }, /* cvt  */\n        { 0x5a30ca3b, 0x00009063 }, /* fpgm */\n        { 0x13a42602, 0x0000007e }  /* prep */\n      },\n      { /* HuaTianKaiTi */\n        { 0xfffbfffc, 0x00000008 }, /* cvt  */\n        { 0x9c9e48b8, 0x0000bea2 }, /* fpgm */\n        { 0x70020112, 0x00000008 }  /* prep */\n      },\n      { /* HuaTianSongTi */\n        { 0xfffbfffc, 0x00000008 }, /* cvt  */\n        { 0x0a5a0483, 0x00017c39 }, /* fpgm */\n        { 0x70020112, 0x00000008 }  /* prep */\n      },\n      { /* NEC fadpop7.ttf */\n        { 0x00000000, 0x00000000 }, /* cvt  */\n        { 0x40c92555, 0x000000e5 }, /* fpgm */\n        { 0xa39b58e3, 0x0000117c }  /* prep */\n      },\n      { /* NEC fadrei5.ttf */\n        { 0x00000000, 0x00000000 }, /* cvt  */\n        { 0x33c41652, 0x000000e5 }, /* fpgm */\n        { 0x26d6c52a, 0x00000f6a }  /* prep */\n      },\n      { /* NEC fangot7.ttf */\n        { 0x00000000, 0x00000000 }, /* cvt  */\n        { 0x6db1651d, 0x0000019d }, /* fpgm */\n        { 0x6c6e4b03, 0x00002492 }  /* prep */\n      },\n      { /* NEC fangyo5.ttf */\n        { 0x00000000, 0x00000000 }, /* cvt  */\n        { 0x40c92555, 0x000000e5 }, /* fpgm */\n        { 0xde51fad0, 0x0000117c }  /* prep */\n      },\n      { /* NEC fankyo5.ttf */\n        { 0x00000000, 0x00000000 }, /* cvt  */\n        { 0x85e47664, 0x000000e5 }, /* fpgm */\n        { 0xa6c62831, 0x00001caa }  /* prep */\n      },\n      { /* NEC fanrgo5.ttf */\n        { 0x00000000, 0x00000000 }, /* cvt  */\n        { 0x2d891cfd, 0x0000019d }, /* fpgm */\n        { 0xa0604633, 0x00001de8 }  /* prep */\n      },\n      { /* NEC fangot5.ttc */\n        { 0x00000000, 0x00000000 }, /* cvt  */\n        { 0x40aa774c, 0x000001cb }, /* fpgm */\n        { 0x9b5caa96, 0x00001f9a }  /* prep */\n      },\n      { /* NEC fanmin3.ttc */\n        { 0x00000000, 0x00000000 }, /* cvt  */\n        { 0x0d3de9cb, 0x00000141 }, /* fpgm */\n        { 0xd4127766, 0x00002280 }  /* prep */\n      },\n      { /* NEC FA-Gothic, 1996 */\n        { 0x00000000, 0x00000000 }, /* cvt  */\n        { 0x4a692698, 0x000001f0 }, /* fpgm */\n        { 0x340d4346, 0x00001fca }  /* prep */\n      },\n      { /* NEC FA-Minchou, 1996 */\n        { 0x00000000, 0x00000000 }, /* cvt  */\n        { 0xcd34c604, 0x00000166 }, /* fpgm */\n        { 0x6cf31046, 0x000022b0 }  /* prep */\n      },\n      { /* NEC FA-RoundGothicB, 1996 */\n        { 0x00000000, 0x00000000 }, /* cvt  */\n        { 0x5da75315, 0x0000019d }, /* fpgm */\n        { 0x40745a5f, 0x000022e0 }  /* prep */\n      },\n      { /* NEC FA-RoundGothicM, 1996 */\n        { 0x00000000, 0x00000000 }, /* cvt  */\n        { 0xf055fc48, 0x000001c2 }, /* fpgm */\n        { 0x3900ded3, 0x00001e18 }  /* prep */\n      }\n    };\n\n    FT_ULong   checksum;\n    int        num_matched_ids[TRICK_SFNT_IDS_NUM_FACES];\n    FT_Bool    has_cvt, has_fpgm, has_prep;\n    FT_UShort  i;\n    int        j, k;\n\n\n    FT_MEM_SET( num_matched_ids, 0,\n                sizeof ( int ) * TRICK_SFNT_IDS_NUM_FACES );\n    has_cvt  = FALSE;\n    has_fpgm = FALSE;\n    has_prep = FALSE;\n\n    for ( i = 0; i < face->num_tables; i++ )\n    {\n      checksum = 0;\n\n      switch( face->dir_tables[i].Tag )\n      {\n      case TTAG_cvt:\n        k = TRICK_SFNT_ID_cvt;\n        has_cvt  = TRUE;\n        break;\n\n      case TTAG_fpgm:\n        k = TRICK_SFNT_ID_fpgm;\n        has_fpgm = TRUE;\n        break;\n\n      case TTAG_prep:\n        k = TRICK_SFNT_ID_prep;\n        has_prep = TRUE;\n        break;\n\n      default:\n        continue;\n      }\n\n      for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ )\n        if ( face->dir_tables[i].Length == sfnt_id[j][k].Length )\n        {\n          if ( !checksum )\n            checksum = tt_get_sfnt_checksum( face, i );\n\n          if ( sfnt_id[j][k].CheckSum == checksum )\n            num_matched_ids[j]++;\n\n          if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE )\n            return TRUE;\n        }\n    }\n\n    for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ )\n    {\n      if ( !has_cvt  && !sfnt_id[j][TRICK_SFNT_ID_cvt].Length )\n        num_matched_ids[j] ++;\n      if ( !has_fpgm && !sfnt_id[j][TRICK_SFNT_ID_fpgm].Length )\n        num_matched_ids[j] ++;\n      if ( !has_prep && !sfnt_id[j][TRICK_SFNT_ID_prep].Length )\n        num_matched_ids[j] ++;\n      if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE )\n        return TRUE;\n    }\n\n    return FALSE;\n  }\n\n\n  static FT_Bool\n  tt_check_trickyness( FT_Face  face )\n  {\n    if ( !face )\n      return FALSE;\n\n    /* For first, check the face name for quick check. */\n    if ( face->family_name                               &&\n         tt_check_trickyness_family( face->family_name ) )\n      return TRUE;\n\n    /* Type42 fonts may lack `name' tables, we thus try to identify */\n    /* tricky fonts by checking the checksums of Type42-persistent  */\n    /* sfnt tables (`cvt', `fpgm', and `prep').                     */\n    if ( tt_check_trickyness_sfnt_ids( (TT_Face)face ) )\n      return TRUE;\n\n    return FALSE;\n  }\n\n\n  /* Check whether `.notdef' is the only glyph in the `loca' table. */\n  static FT_Bool\n  tt_check_single_notdef( FT_Face  ttface )\n  {\n    FT_Bool   result = FALSE;\n\n    TT_Face   face = (TT_Face)ttface;\n    FT_UInt   asize;\n    FT_ULong  i;\n    FT_ULong  glyph_index = 0;\n    FT_UInt   count       = 0;\n\n\n    for( i = 0; i < face->num_locations; i++ )\n    {\n      tt_face_get_location( face, i, &asize );\n      if ( asize > 0 )\n      {\n        count += 1;\n        if ( count > 1 )\n          break;\n        glyph_index = i;\n      }\n    }\n\n    /* Only have a single outline. */\n    if ( count == 1 )\n    {\n      if ( glyph_index == 0 )\n        result = TRUE;\n      else\n      {\n        /* FIXME: Need to test glyphname == .notdef ? */\n        FT_Error error;\n        char buf[8];\n\n\n        error = FT_Get_Glyph_Name( ttface, glyph_index, buf, 8 );\n        if ( !error                                            &&\n             buf[0] == '.' && !ft_strncmp( buf, \".notdef\", 8 ) )\n          result = TRUE;\n      }\n    }\n\n    return result;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_init                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initialize a given TrueType face object.                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream     :: The source font stream.                              */\n  /*                                                                       */\n  /*    face_index :: The index of the font face in the resource.          */\n  /*                                                                       */\n  /*    num_params :: Number of additional generic parameters.  Ignored.   */\n  /*                                                                       */\n  /*    params     :: Additional generic parameters.  Ignored.             */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face       :: The newly built face object.                         */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_init( FT_Stream      stream,\n                FT_Face        ttface,      /* TT_Face */\n                FT_Int         face_index,\n                FT_Int         num_params,\n                FT_Parameter*  params )\n  {\n    FT_Error      error;\n    FT_Library    library;\n    SFNT_Service  sfnt;\n    TT_Face       face = (TT_Face)ttface;\n\n\n    FT_TRACE2(( \"TTF driver\\n\" ));\n\n    library = ttface->driver->root.library;\n\n    sfnt = (SFNT_Service)FT_Get_Module_Interface( library, \"sfnt\" );\n    if ( !sfnt )\n    {\n      FT_ERROR(( \"tt_face_init: cannot access `sfnt' module\\n\" ));\n      error = FT_THROW( Missing_Module );\n      goto Exit;\n    }\n\n    /* create input stream from resource */\n    if ( FT_STREAM_SEEK( 0 ) )\n      goto Exit;\n\n    /* check that we have a valid TrueType file */\n    error = sfnt->init_face( stream, face, face_index, num_params, params );\n    if ( error )\n      goto Exit;\n\n    /* We must also be able to accept Mac/GX fonts, as well as OT ones. */\n    /* The 0x00020000 tag is completely undocumented; some fonts from   */\n    /* Arphic made for Chinese Windows 3.1 have this.                   */\n    if ( face->format_tag != 0x00010000L &&    /* MS fonts  */\n         face->format_tag != 0x00020000L &&    /* CJK fonts for Win 3.1 */\n         face->format_tag != TTAG_true   )     /* Mac fonts */\n    {\n      FT_TRACE2(( \"  not a TTF font\\n\" ));\n      goto Bad_Format;\n    } \n\telse\n\t{\n\t\tFT_ULong  table_len;\n\t\tif (face->goto_table( face, TTAG_CFF, stream, &table_len) != TT_Err_Table_Missing && \n\t\t\tface->goto_table( face, TTAG_loca, stream, &table_len) == TT_Err_Table_Missing) \n\t\t{\n\t\t\tFT_TRACE2(( \"[not a valid TTF font]\\n\" ));\n\t\t\tgoto Bad_Format;\n\t\t}\n\t}\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n    ttface->face_flags |= FT_FACE_FLAG_HINTER;\n#endif\n\n    /* If we are performing a simple font format check, exit immediately. */\n    if ( face_index < 0 )\n      return FT_Err_Ok;\n\n    /* Load font directory */\n    error = sfnt->load_face( stream, face, face_index, num_params, params );\n    if ( error )\n      goto Exit;\n\n    if ( tt_check_trickyness( ttface ) )\n      ttface->face_flags |= FT_FACE_FLAG_TRICKY;\n\n    error = tt_face_load_hdmx( face, stream );\n    if ( error )\n      goto Exit;\n\n    if ( FT_IS_SCALABLE( ttface ) )\n    {\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n\n      if ( !ttface->internal->incremental_interface )\n        error = tt_face_load_loca( face, stream );\n      if ( !error )\n        error = tt_face_load_cvt( face, stream );\n      if ( !error )\n        error = tt_face_load_fpgm( face, stream );\n      if ( !error )\n        error = tt_face_load_prep( face, stream );\n\n      /* Check the scalable flag based on `loca'. */\n      if ( !ttface->internal->incremental_interface &&\n           ttface->num_fixed_sizes                  &&\n           face->glyph_locations                    &&\n           tt_check_single_notdef( ttface )         )\n      {\n        FT_TRACE5(( \"tt_face_init:\"\n                    \" Only the `.notdef' glyph has an outline.\\n\"\n                    \"             \"\n                    \" Resetting scalable flag to FALSE.\\n\" ));\n\n        ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE;\n      }\n\n#else\n\n      if ( !error )\n        error = tt_face_load_loca( face, stream );\n      if ( !error )\n        error = tt_face_load_cvt( face, stream );\n      if ( !error )\n        error = tt_face_load_fpgm( face, stream );\n      if ( !error )\n        error = tt_face_load_prep( face, stream );\n\n      /* Check the scalable flag based on `loca'. */\n      if ( ttface->num_fixed_sizes          &&\n           face->glyph_locations            &&\n           tt_check_single_notdef( ttface ) )\n      {\n        FT_TRACE5(( \"tt_face_init:\"\n                    \" Only the `.notdef' glyph has an outline.\\n\"\n                    \"             \"\n                    \" Resetting scalable flag to FALSE.\\n\" ));\n\n        ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE;\n      }\n\n#endif\n\n    }\n\n#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING    ) && \\\n    !defined( TT_CONFIG_OPTION_BYTECODE_INTERPRETER )\n\n    {\n      FT_Bool  unpatented_hinting;\n      int      i;\n\n\n      /* Determine whether unpatented hinting is to be used for this face. */\n      unpatented_hinting = FT_BOOL\n        ( library->debug_hooks[FT_DEBUG_HOOK_UNPATENTED_HINTING] != NULL );\n\n      for ( i = 0; i < num_params && !face->unpatented_hinting; i++ )\n        if ( params[i].tag == FT_PARAM_TAG_UNPATENTED_HINTING )\n          unpatented_hinting = TRUE;\n\n      if ( !unpatented_hinting )\n        ttface->internal->ignore_unpatented_hinter = TRUE;\n    }\n\n#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING &&\n          !TT_CONFIG_OPTION_BYTECODE_INTERPRETER */\n\n    /* initialize standard glyph loading routines */\n    TT_Init_Glyph_Loading( face );\n\n  Exit:\n    return error;\n\n  Bad_Format:\n    error = FT_THROW( Unknown_File_Format );\n    goto Exit;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_done                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Finalize a given face object.                                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A pointer to the face object to destroy.                   */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  tt_face_done( FT_Face  ttface )           /* TT_Face */\n  {\n    TT_Face       face = (TT_Face)ttface;\n    FT_Memory     memory;\n    FT_Stream     stream;\n    SFNT_Service  sfnt;\n\n\n    if ( !face )\n      return;\n\n    memory = ttface->memory;\n    stream = ttface->stream;\n    sfnt   = (SFNT_Service)face->sfnt;\n\n    /* for `extended TrueType formats' (i.e. compressed versions) */\n    if ( face->extra.finalizer )\n      face->extra.finalizer( face->extra.data );\n\n    if ( sfnt )\n      sfnt->done_face( face );\n\n    /* freeing the locations table */\n    tt_face_done_loca( face );\n\n    tt_face_free_hdmx( face );\n\n    /* freeing the CVT */\n    FT_FREE( face->cvt );\n    face->cvt_size = 0;\n\n    /* freeing the programs */\n    FT_FRAME_RELEASE( face->font_program );\n    FT_FRAME_RELEASE( face->cvt_program );\n    face->font_program_size = 0;\n    face->cvt_program_size  = 0;\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n    tt_done_blend( memory, face->blend );\n    face->blend = NULL;\n#endif\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                           SIZE  FUNCTIONS                             */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_size_run_fpgm                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Run the font program.                                              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    size     :: A handle to the size object.                           */\n  /*                                                                       */\n  /*    pedantic :: Set if bytecode execution should be pedantic.          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_size_run_fpgm( TT_Size  size,\n                    FT_Bool  pedantic )\n  {\n    TT_Face         face = (TT_Face)size->root.face;\n    TT_ExecContext  exec;\n    FT_Error        error;\n\n\n    /* debugging instances have their own context */\n    if ( size->debug )\n      exec = size->context;\n    else\n      exec = ( (TT_Driver)FT_FACE_DRIVER( face ) )->context;\n\n    if ( !exec )\n      return FT_THROW( Could_Not_Find_Context );\n\n    TT_Load_Context( exec, face, size );\n\n    exec->callTop = 0;\n    exec->top     = 0;\n\n    exec->period    = 64;\n    exec->phase     = 0;\n    exec->threshold = 0;\n\n    exec->instruction_trap = FALSE;\n    exec->F_dot_P          = 0x4000L;\n\n    exec->pedantic_hinting = pedantic;\n\n    {\n      FT_Size_Metrics*  metrics    = &exec->metrics;\n      TT_Size_Metrics*  tt_metrics = &exec->tt_metrics;\n\n\n      metrics->x_ppem   = 0;\n      metrics->y_ppem   = 0;\n      metrics->x_scale  = 0;\n      metrics->y_scale  = 0;\n\n      tt_metrics->ppem  = 0;\n      tt_metrics->scale = 0;\n      tt_metrics->ratio = 0x10000L;\n    }\n\n    /* allow font program execution */\n    TT_Set_CodeRange( exec,\n                      tt_coderange_font,\n                      face->font_program,\n                      face->font_program_size );\n\n    /* disable CVT and glyph programs coderange */\n    TT_Clear_CodeRange( exec, tt_coderange_cvt );\n    TT_Clear_CodeRange( exec, tt_coderange_glyph );\n\n    if ( face->font_program_size > 0 )\n    {\n      error = TT_Goto_CodeRange( exec, tt_coderange_font, 0 );\n\n      if ( !error )\n      {\n        FT_TRACE4(( \"Executing `fpgm' table.\\n\" ));\n\n        error = face->interpreter( exec );\n      }\n    }\n    else\n      error = FT_Err_Ok;\n\n    if ( !error )\n      TT_Save_Context( exec, size );\n\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_size_run_prep                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Run the control value program.                                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    size     :: A handle to the size object.                           */\n  /*                                                                       */\n  /*    pedantic :: Set if bytecode execution should be pedantic.          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_size_run_prep( TT_Size  size,\n                    FT_Bool  pedantic )\n  {\n    TT_Face         face = (TT_Face)size->root.face;\n    TT_ExecContext  exec;\n    FT_Error        error;\n\n\n    /* debugging instances have their own context */\n    if ( size->debug )\n      exec = size->context;\n    else\n      exec = ( (TT_Driver)FT_FACE_DRIVER( face ) )->context;\n\n    if ( !exec )\n      return FT_THROW( Could_Not_Find_Context );\n\n    TT_Load_Context( exec, face, size );\n\n    exec->callTop = 0;\n    exec->top     = 0;\n\n    exec->instruction_trap = FALSE;\n\n    exec->pedantic_hinting = pedantic;\n\n    TT_Set_CodeRange( exec,\n                      tt_coderange_cvt,\n                      face->cvt_program,\n                      face->cvt_program_size );\n\n    TT_Clear_CodeRange( exec, tt_coderange_glyph );\n\n    if ( face->cvt_program_size > 0 )\n    {\n      error = TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 );\n\n      if ( !error && !size->debug )\n      {\n        FT_TRACE4(( \"Executing `prep' table.\\n\" ));\n\n        error = face->interpreter( exec );\n      }\n    }\n    else\n      error = FT_Err_Ok;\n\n    /* UNDOCUMENTED!  The MS rasterizer doesn't allow the following */\n    /* graphics state variables to be modified by the CVT program.  */\n\n    exec->GS.dualVector.x = 0x4000;\n    exec->GS.dualVector.y = 0;\n    exec->GS.projVector.x = 0x4000;\n    exec->GS.projVector.y = 0x0;\n    exec->GS.freeVector.x = 0x4000;\n    exec->GS.freeVector.y = 0x0;\n\n    exec->GS.rp0 = 0;\n    exec->GS.rp1 = 0;\n    exec->GS.rp2 = 0;\n\n    exec->GS.gep0 = 1;\n    exec->GS.gep1 = 1;\n    exec->GS.gep2 = 1;\n\n    exec->GS.loop = 1;\n\n    /* save as default graphics state */\n    size->GS = exec->GS;\n\n    TT_Save_Context( exec, size );\n\n    return error;\n  }\n\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n  static void\n  tt_size_done_bytecode( FT_Size  ftsize )\n  {\n    TT_Size    size   = (TT_Size)ftsize;\n    TT_Face    face   = (TT_Face)ftsize->face;\n    FT_Memory  memory = face->root.memory;\n\n\n    if ( size->debug )\n    {\n      /* the debug context must be deleted by the debugger itself */\n      size->context = NULL;\n      size->debug   = FALSE;\n    }\n\n    FT_FREE( size->cvt );\n    size->cvt_size = 0;\n\n    /* free storage area */\n    FT_FREE( size->storage );\n    size->storage_size = 0;\n\n    /* twilight zone */\n    tt_glyphzone_done( &size->twilight );\n\n    FT_FREE( size->function_defs );\n    FT_FREE( size->instruction_defs );\n\n    size->num_function_defs    = 0;\n    size->max_function_defs    = 0;\n    size->num_instruction_defs = 0;\n    size->max_instruction_defs = 0;\n\n    size->max_func = 0;\n    size->max_ins  = 0;\n\n    size->bytecode_ready = 0;\n    size->cvt_ready      = 0;\n  }\n\n\n  /* Initialize bytecode-related fields in the size object.       */\n  /* We do this only if bytecode interpretation is really needed. */\n  static FT_Error\n  tt_size_init_bytecode( FT_Size  ftsize,\n                         FT_Bool  pedantic )\n  {\n    FT_Error   error;\n    TT_Size    size = (TT_Size)ftsize;\n    TT_Face    face = (TT_Face)ftsize->face;\n    FT_Memory  memory = face->root.memory;\n    FT_Int     i;\n\n    FT_UShort       n_twilight;\n    TT_MaxProfile*  maxp = &face->max_profile;\n\n\n    size->bytecode_ready = 1;\n    size->cvt_ready      = 0;\n\n    size->max_function_defs    = maxp->maxFunctionDefs;\n    size->max_instruction_defs = maxp->maxInstructionDefs;\n\n    size->num_function_defs    = 0;\n    size->num_instruction_defs = 0;\n\n    size->max_func = 0;\n    size->max_ins  = 0;\n\n    size->cvt_size     = face->cvt_size;\n    size->storage_size = maxp->maxStorage;\n\n    /* Set default metrics */\n    {\n      TT_Size_Metrics*  metrics = &size->ttmetrics;\n\n\n      metrics->rotated   = FALSE;\n      metrics->stretched = FALSE;\n\n      /* set default compensation (all 0) */\n      for ( i = 0; i < 4; i++ )\n        metrics->compensations[i] = 0;\n    }\n\n    /* allocate function defs, instruction defs, cvt, and storage area */\n    if ( FT_NEW_ARRAY( size->function_defs,    size->max_function_defs    ) ||\n         FT_NEW_ARRAY( size->instruction_defs, size->max_instruction_defs ) ||\n         FT_NEW_ARRAY( size->cvt,              size->cvt_size             ) ||\n         FT_NEW_ARRAY( size->storage,          size->storage_size         ) )\n      goto Exit;\n\n    /* reserve twilight zone */\n    n_twilight = maxp->maxTwilightPoints;\n\n    /* there are 4 phantom points (do we need this?) */\n    n_twilight += 4;\n\n    error = tt_glyphzone_new( memory, n_twilight, 0, &size->twilight );\n    if ( error )\n      goto Exit;\n\n    size->twilight.n_points = n_twilight;\n\n    size->GS = tt_default_graphics_state;\n\n    /* set `face->interpreter' according to the debug hook present */\n    {\n      FT_Library  library = face->root.driver->root.library;\n\n\n      face->interpreter = (TT_Interpreter)\n                            library->debug_hooks[FT_DEBUG_HOOK_TRUETYPE];\n      if ( !face->interpreter )\n        face->interpreter = (TT_Interpreter)TT_RunIns;\n    }\n\n    /* Fine, now run the font program! */\n    error = tt_size_run_fpgm( size, pedantic );\n\t/* It seems fpgm proc is causing some problem for some font, so we ignore the error. TESTDOC: Bug #12690 - Restaurantkarte_Oktober09+Wild.pdf*/\n\tif ( error )\n      tt_size_done_bytecode( ftsize );\n\treturn TT_Err_Ok;\n\n  Exit:\n    if ( error )\n      tt_size_done_bytecode( ftsize );\n\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  tt_size_ready_bytecode( TT_Size  size,\n                          FT_Bool  pedantic )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    if ( !size->bytecode_ready )\n    {\n      error = tt_size_init_bytecode( (FT_Size)size, pedantic );\n      if ( error )\n        goto Exit;\n    }\n\n    /* rescale CVT when needed */\n    if ( !size->cvt_ready )\n    {\n      FT_UInt  i;\n      TT_Face  face = (TT_Face)size->root.face;\n\n\n      /* Scale the cvt values to the new ppem.          */\n      /* We use by default the y ppem to scale the CVT. */\n      for ( i = 0; i < size->cvt_size; i++ )\n        size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale );\n\n      /* all twilight points are originally zero */\n      for ( i = 0; i < (FT_UInt)size->twilight.n_points; i++ )\n      {\n        size->twilight.org[i].x = 0;\n        size->twilight.org[i].y = 0;\n        size->twilight.cur[i].x = 0;\n        size->twilight.cur[i].y = 0;\n      }\n\n      /* clear storage area */\n      for ( i = 0; i < (FT_UInt)size->storage_size; i++ )\n        size->storage[i] = 0;\n\n      size->GS = tt_default_graphics_state;\n\n      tt_size_run_prep( size, pedantic );/* It seems prep proc is causing some problem for some font, so we ignore the error. TESTDOC: Bug #5025 - naredba-rd-16-296.pdf */\n\t  /* However we can't disable the prep. TESTDOC: Bug #0063 - 050826_differ_table.pdf, page #4 */\n      if ( !error )\n        size->cvt_ready = 1;\n    }\n\n  Exit:\n    return error;\n  }\n\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_size_init                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initialize a new TrueType size object.                             */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    size :: A handle to the size object.                               */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_size_init( FT_Size  ttsize )           /* TT_Size */\n  {\n    TT_Size   size  = (TT_Size)ttsize;\n    FT_Error  error = FT_Err_Ok;\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n    size->bytecode_ready = 0;\n    size->cvt_ready      = 0;\n#endif\n\n    size->ttmetrics.valid = FALSE;\n    size->strike_index    = 0xFFFFFFFFUL;\n\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_size_done                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The TrueType size object finalizer.                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    size :: A handle to the target size object.                        */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  tt_size_done( FT_Size  ttsize )           /* TT_Size */\n  {\n    TT_Size  size = (TT_Size)ttsize;\n\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n    if ( size->bytecode_ready )\n      tt_size_done_bytecode( ttsize );\n#endif\n\n    size->ttmetrics.valid = FALSE;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_size_reset                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Reset a TrueType size when resolutions and character dimensions    */\n  /*    have been changed.                                                 */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    size :: A handle to the target size object.                        */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_size_reset( TT_Size  size )\n  {\n    TT_Face           face;\n    FT_Error          error = FT_Err_Ok;\n    FT_Size_Metrics*  metrics;\n\n\n    size->ttmetrics.valid = FALSE;\n\n    face = (TT_Face)size->root.face;\n\n    metrics = &size->metrics;\n\n    /* copy the result from base layer */\n    *metrics = size->root.metrics;\n\n    if ( metrics->x_ppem < 1 || metrics->y_ppem < 1 )\n      return FT_THROW( Invalid_PPem );\n\n    /* This bit flag, if set, indicates that the ppems must be       */\n    /* rounded to integers.  Nearly all TrueType fonts have this bit */\n    /* set, as hinting won't work really well otherwise.             */\n    /*                                                               */\n    if ( face->header.Flags & 8 )\n    {\n      metrics->x_scale = FT_DivFix( metrics->x_ppem << 6,\n                                    face->root.units_per_EM );\n      metrics->y_scale = FT_DivFix( metrics->y_ppem << 6,\n                                    face->root.units_per_EM );\n\n      metrics->ascender =\n        FT_PIX_ROUND( FT_MulFix( face->root.ascender, metrics->y_scale ) );\n      metrics->descender =\n        FT_PIX_ROUND( FT_MulFix( face->root.descender, metrics->y_scale ) );\n      metrics->height =\n        FT_PIX_ROUND( FT_MulFix( face->root.height, metrics->y_scale ) );\n      metrics->max_advance =\n        FT_PIX_ROUND( FT_MulFix( face->root.max_advance_width,\n                                 metrics->x_scale ) );\n    }\n\n    /* compute new transformation */\n    if ( metrics->x_ppem >= metrics->y_ppem )\n    {\n      size->ttmetrics.scale   = metrics->x_scale;\n      size->ttmetrics.ppem    = metrics->x_ppem;\n      size->ttmetrics.x_ratio = 0x10000L;\n      size->ttmetrics.y_ratio = FT_DivFix( metrics->y_ppem,\n                                           metrics->x_ppem );\n    }\n    else\n    {\n      size->ttmetrics.scale   = metrics->y_scale;\n      size->ttmetrics.ppem    = metrics->y_ppem;\n      size->ttmetrics.x_ratio = FT_DivFix( metrics->x_ppem,\n                                           metrics->y_ppem );\n      size->ttmetrics.y_ratio = 0x10000L;\n    }\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n    size->cvt_ready = 0;\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n\n    if ( !error )\n      size->ttmetrics.valid = TRUE;\n\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_driver_init                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initialize a given TrueType driver object.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    driver :: A handle to the target driver object.                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_driver_init( FT_Module  ttdriver )     /* TT_Driver */\n  {\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n    TT_Driver  driver = (TT_Driver)ttdriver;\n\n\n    if ( !TT_New_Context( driver ) )\n      return FT_THROW( Could_Not_Find_Context );\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    driver->interpreter_version = TT_INTERPRETER_VERSION_38;\n#else\n    driver->interpreter_version = TT_INTERPRETER_VERSION_35;\n#endif\n\n#else /* !TT_USE_BYTECODE_INTERPRETER */\n\n    FT_UNUSED( ttdriver );\n\n#endif /* !TT_USE_BYTECODE_INTERPRETER */\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_driver_done                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Finalize a given TrueType driver.                                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    driver :: A handle to the target TrueType driver.                  */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  tt_driver_done( FT_Module  ttdriver )     /* TT_Driver */\n  {\n#ifdef TT_USE_BYTECODE_INTERPRETER\n    TT_Driver  driver = (TT_Driver)ttdriver;\n\n\n    /* destroy the execution context */\n    if ( driver->context )\n    {\n      TT_Done_Context( driver->context );\n      driver->context = NULL;\n    }\n#else\n    FT_UNUSED( ttdriver );\n#endif\n\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_slot_init                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initialize a new slot object.                                      */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    slot :: A handle to the slot object.                               */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_slot_init( FT_GlyphSlot  slot )\n  {\n    return FT_GlyphLoader_CreateExtra( slot->internal->loader );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttobjs.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttobjs.h                                                               */\n/*                                                                         */\n/*    Objects manager (specification).                                     */\n/*                                                                         */\n/*  Copyright 1996-2009, 2011-2013 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTOBJS_H__\n#define __TTOBJS_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/internal/tttypes.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    TT_Driver                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a TrueType driver object.                              */\n  /*                                                                       */\n  typedef struct TT_DriverRec_*  TT_Driver;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    TT_Instance                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a TrueType size object.                                */\n  /*                                                                       */\n  typedef struct TT_SizeRec_*  TT_Size;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    TT_GlyphSlot                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a TrueType glyph slot object.                          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This is a direct typedef of FT_GlyphSlot, as there is nothing      */\n  /*    specific about the TrueType glyph slot.                            */\n  /*                                                                       */\n  typedef FT_GlyphSlot  TT_GlyphSlot;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_GraphicsState                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The TrueType graphics state used during bytecode interpretation.   */\n  /*                                                                       */\n  typedef struct  TT_GraphicsState_\n  {\n    FT_UShort      rp0;\n    FT_UShort      rp1;\n    FT_UShort      rp2;\n\n    FT_UnitVector  dualVector;\n    FT_UnitVector  projVector;\n    FT_UnitVector  freeVector;\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    FT_Bool        both_x_axis;\n#endif\n\n    FT_Long        loop;\n    FT_F26Dot6     minimum_distance;\n    FT_Int         round_state;\n\n    FT_Bool        auto_flip;\n    FT_F26Dot6     control_value_cutin;\n    FT_F26Dot6     single_width_cutin;\n    FT_F26Dot6     single_width_value;\n    FT_Short       delta_base;\n    FT_Short       delta_shift;\n\n    FT_Byte        instruct_control;\n    /* According to Greg Hitchcock from Microsoft, the `scan_control'     */\n    /* variable as documented in the TrueType specification is a 32-bit   */\n    /* integer; the high-word part holds the SCANTYPE value, the low-word */\n    /* part the SCANCTRL value.  We separate it into two fields.          */\n    FT_Bool        scan_control;\n    FT_Int         scan_type;\n\n    FT_UShort      gep0;\n    FT_UShort      gep1;\n    FT_UShort      gep2;\n\n  } TT_GraphicsState;\n\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n  FT_LOCAL( void )\n  tt_glyphzone_done( TT_GlyphZone  zone );\n\n  FT_LOCAL( FT_Error )\n  tt_glyphzone_new( FT_Memory     memory,\n                    FT_UShort     maxPoints,\n                    FT_Short      maxContours,\n                    TT_GlyphZone  zone );\n\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  EXECUTION SUBTABLES                                                  */\n  /*                                                                       */\n  /*  These sub-tables relate to instruction execution.                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#define TT_MAX_CODE_RANGES  3\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* There can only be 3 active code ranges at once:                       */\n  /*   - the Font Program                                                  */\n  /*   - the CVT Program                                                   */\n  /*   - a glyph's instructions set                                        */\n  /*                                                                       */\n  typedef enum  TT_CodeRange_Tag_\n  {\n    tt_coderange_none = 0,\n    tt_coderange_font,\n    tt_coderange_cvt,\n    tt_coderange_glyph\n\n  } TT_CodeRange_Tag;\n\n\n  typedef struct  TT_CodeRange_\n  {\n    FT_Byte*  base;\n    FT_ULong  size;\n\n  } TT_CodeRange;\n\n  typedef TT_CodeRange  TT_CodeRangeTable[TT_MAX_CODE_RANGES];\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Defines a function/instruction definition record.                     */\n  /*                                                                       */\n  typedef struct  TT_DefRecord_\n  {\n    FT_Int    range;          /* in which code range is it located?     */\n    FT_Long   start;          /* where does it start?                   */\n    FT_Long   end;            /* where does it end?                     */\n    FT_UInt   opc;            /* function #, or instruction code        */\n    FT_Bool   active;         /* is it active?                          */\n    FT_Bool   inline_delta;   /* is function that defines inline delta? */\n    FT_ULong  sph_fdef_flags; /* flags to identify special functions    */\n\n  } TT_DefRecord, *TT_DefArray;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Subglyph transformation record.                                       */\n  /*                                                                       */\n  typedef struct  TT_Transform_\n  {\n    FT_Fixed    xx, xy;     /* transformation matrix coefficients */\n    FT_Fixed    yx, yy;\n    FT_F26Dot6  ox, oy;     /* offsets                            */\n\n  } TT_Transform;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* A note regarding non-squared pixels:                                  */\n  /*                                                                       */\n  /* (This text will probably go into some docs at some time; for now, it  */\n  /* is kept here to explain some definitions in the TT_Size_Metrics       */\n  /* record).                                                              */\n  /*                                                                       */\n  /* The CVT is a one-dimensional array containing values that control     */\n  /* certain important characteristics in a font, like the height of all   */\n  /* capitals, all lowercase letter, default spacing or stem width/height. */\n  /*                                                                       */\n  /* These values are found in FUnits in the font file, and must be scaled */\n  /* to pixel coordinates before being used by the CVT and glyph programs. */\n  /* Unfortunately, when using distinct x and y resolutions (or distinct x */\n  /* and y pointsizes), there are two possible scalings.                   */\n  /*                                                                       */\n  /* A first try was to implement a `lazy' scheme where all values were    */\n  /* scaled when first used.  However, while some values are always used   */\n  /* in the same direction, some others are used under many different      */\n  /* circumstances and orientations.                                       */\n  /*                                                                       */\n  /* I have found a simpler way to do the same, and it even seems to work  */\n  /* in most of the cases:                                                 */\n  /*                                                                       */\n  /* - All CVT values are scaled to the maximum ppem size.                 */\n  /*                                                                       */\n  /* - When performing a read or write in the CVT, a ratio factor is used  */\n  /*   to perform adequate scaling.  Example:                              */\n  /*                                                                       */\n  /*     x_ppem = 14                                                       */\n  /*     y_ppem = 10                                                       */\n  /*                                                                       */\n  /*   We choose ppem = x_ppem = 14 as the CVT scaling size.  All cvt      */\n  /*   entries are scaled to it.                                           */\n  /*                                                                       */\n  /*     x_ratio = 1.0                                                     */\n  /*     y_ratio = y_ppem/ppem (< 1.0)                                     */\n  /*                                                                       */\n  /*   We compute the current ratio like:                                  */\n  /*                                                                       */\n  /*   - If projVector is horizontal,                                      */\n  /*       ratio = x_ratio = 1.0                                           */\n  /*                                                                       */\n  /*   - if projVector is vertical,                                        */\n  /*       ratio = y_ratio                                                 */\n  /*                                                                       */\n  /*   - else,                                                             */\n  /*       ratio = sqrt( (proj.x * x_ratio) ^ 2 + (proj.y * y_ratio) ^ 2 ) */\n  /*                                                                       */\n  /*   Reading a cvt value returns                                         */\n  /*     ratio * cvt[index]                                                */\n  /*                                                                       */\n  /*   Writing a cvt value in pixels:                                      */\n  /*     cvt[index] / ratio                                                */\n  /*                                                                       */\n  /*   The current ppem is simply                                          */\n  /*     ratio * ppem                                                      */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Metrics used by the TrueType size and context objects.                */\n  /*                                                                       */\n  typedef struct  TT_Size_Metrics_\n  {\n    /* for non-square pixels */\n    FT_Long     x_ratio;\n    FT_Long     y_ratio;\n\n    FT_UShort   ppem;               /* maximum ppem size              */\n    FT_Long     ratio;              /* current ratio                  */\n    FT_Fixed    scale;\n\n    FT_F26Dot6  compensations[4];   /* device-specific compensations  */\n\n    FT_Bool     valid;\n\n    FT_Bool     rotated;            /* `is the glyph rotated?'-flag   */\n    FT_Bool     stretched;          /* `is the glyph stretched?'-flag */\n\n  } TT_Size_Metrics;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* TrueType size class.                                                  */\n  /*                                                                       */\n  typedef struct  TT_SizeRec_\n  {\n    FT_SizeRec         root;\n\n    /* we have our own copy of metrics so that we can modify */\n    /* it without affecting auto-hinting (when used)         */\n    FT_Size_Metrics    metrics;\n\n    TT_Size_Metrics    ttmetrics;\n\n    FT_ULong           strike_index;      /* 0xFFFFFFFF to indicate invalid */\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n    FT_UInt            num_function_defs; /* number of function definitions */\n    FT_UInt            max_function_defs;\n    TT_DefArray        function_defs;     /* table of function definitions  */\n\n    FT_UInt            num_instruction_defs;  /* number of ins. definitions */\n    FT_UInt            max_instruction_defs;\n    TT_DefArray        instruction_defs;      /* table of ins. definitions  */\n\n    FT_UInt            max_func;\n    FT_UInt            max_ins;\n\n    TT_CodeRangeTable  codeRangeTable;\n\n    TT_GraphicsState   GS;\n\n    FT_ULong           cvt_size;      /* the scaled control value table */\n    FT_Long*           cvt;\n\n    FT_UShort          storage_size; /* The storage area is now part of */\n    FT_Long*           storage;      /* the instance                    */\n\n    TT_GlyphZoneRec    twilight;     /* The instance's twilight zone    */\n\n    /* debugging variables */\n\n    /* When using the debugger, we must keep the */\n    /* execution context tied to the instance    */\n    /* object rather than asking it on demand.   */\n\n    FT_Bool            debug;\n    TT_ExecContext     context;\n\n    FT_Bool            bytecode_ready;\n    FT_Bool            cvt_ready;\n\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n\n  } TT_SizeRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* TrueType driver class.                                                */\n  /*                                                                       */\n  typedef struct  TT_DriverRec_\n  {\n    FT_DriverRec  root;\n\n    TT_ExecContext   context;  /* execution context        */\n    TT_GlyphZoneRec  zone;     /* glyph loader points zone */\n\n    FT_UInt  interpreter_version;\n\n  } TT_DriverRec;\n\n\n  /* Note: All of the functions below (except tt_size_reset()) are used    */\n  /* as function pointers in a FT_Driver_ClassRec.  Therefore their        */\n  /* parameters are of types FT_Face, FT_Size, etc., rather than TT_Face,  */\n  /* TT_Size, etc., so that the compiler can confirm that the types and    */\n  /* number of parameters are correct.  In all cases the FT_xxx types are  */\n  /* cast to their TT_xxx counterparts inside the functions since FreeType */\n  /* will always use the TT driver to create them.                         */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Face functions                                                        */\n  /*                                                                       */\n  FT_LOCAL( FT_Error )\n  tt_face_init( FT_Stream      stream,\n                FT_Face        ttface,      /* TT_Face */\n                FT_Int         face_index,\n                FT_Int         num_params,\n                FT_Parameter*  params );\n\n  FT_LOCAL( void )\n  tt_face_done( FT_Face  ttface );          /* TT_Face */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Size functions                                                        */\n  /*                                                                       */\n  FT_LOCAL( FT_Error )\n  tt_size_init( FT_Size  ttsize );          /* TT_Size */\n\n  FT_LOCAL( void )\n  tt_size_done( FT_Size  ttsize );          /* TT_Size */\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n  FT_LOCAL( FT_Error )\n  tt_size_run_fpgm( TT_Size  size,\n                    FT_Bool  pedantic );\n\n  FT_LOCAL( FT_Error )\n  tt_size_run_prep( TT_Size  size,\n                    FT_Bool  pedantic );\n\n  FT_LOCAL( FT_Error )\n  tt_size_ready_bytecode( TT_Size  size,\n                          FT_Bool  pedantic );\n\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n\n  FT_LOCAL( FT_Error )\n  tt_size_reset( TT_Size  size );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Driver functions                                                      */\n  /*                                                                       */\n  FT_LOCAL( FT_Error )\n  tt_driver_init( FT_Module  ttdriver );    /* TT_Driver */\n\n  FT_LOCAL( void )\n  tt_driver_done( FT_Module  ttdriver );    /* TT_Driver */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Slot functions                                                        */\n  /*                                                                       */\n  FT_LOCAL( FT_Error )\n  tt_slot_init( FT_GlyphSlot  slot );\n\n\n  /* auxiliary */\n#define IS_HINTED( flags )  ( ( flags & FT_LOAD_NO_HINTING ) == 0 )\n\n\nFT_END_HEADER\n\n#endif /* __TTOBJS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpic.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttpic.c                                                                */\n/*                                                                         */\n/*    The FreeType position independent code services for truetype module. */\n/*                                                                         */\n/*  Copyright 2009, 2010, 2012, 2013 by                                    */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/freetype.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"ttpic.h\"\n#include \"tterrors.h\"\n\n\n#ifdef FT_CONFIG_OPTION_PIC\n\n  /* forward declaration of PIC init functions from ttdriver.c */\n  FT_Error\n  FT_Create_Class_tt_services( FT_Library           library,\n                               FT_ServiceDescRec**  output_class );\n  void\n  FT_Destroy_Class_tt_services( FT_Library          library,\n                                FT_ServiceDescRec*  clazz );\n  void\n  FT_Init_Class_tt_service_gx_multi_masters(\n    FT_Service_MultiMastersRec*  sv_mm );\n  void\n  FT_Init_Class_tt_service_truetype_glyf(\n    FT_Service_TTGlyfRec*  sv_ttglyf );\n\n\n  void\n  tt_driver_class_pic_free( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Memory          memory        = library->memory;\n\n\n    if ( pic_container->truetype )\n    {\n      TTModulePIC*  container = (TTModulePIC*)pic_container->truetype;\n\n\n      if ( container->tt_services )\n        FT_Destroy_Class_tt_services( library, container->tt_services );\n      container->tt_services = NULL;\n      FT_FREE( container );\n      pic_container->truetype = NULL;\n    }\n  }\n\n\n  FT_Error\n  tt_driver_class_pic_init( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Error           error         = FT_Err_Ok;\n    TTModulePIC*       container     = NULL;\n    FT_Memory          memory        = library->memory;\n\n\n    /* allocate pointer, clear and set global container pointer */\n    if ( FT_ALLOC( container, sizeof ( *container ) ) )\n      return error;\n    FT_MEM_SET( container, 0, sizeof ( *container ) );\n    pic_container->truetype = container;\n\n    /* initialize pointer table - this is how the module usually */\n    /* expects this data                                         */\n    error = FT_Create_Class_tt_services( library,\n                                         &container->tt_services );\n    if ( error )\n      goto Exit;\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n    FT_Init_Class_tt_service_gx_multi_masters(\n      &container->tt_service_gx_multi_masters );\n#endif\n    FT_Init_Class_tt_service_truetype_glyf(\n      &container->tt_service_truetype_glyf );\n\n  Exit:\n    if ( error )\n      tt_driver_class_pic_free( library );\n    return error;\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpic.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttpic.h                                                                */\n/*                                                                         */\n/*    The FreeType position independent code services for truetype module. */\n/*                                                                         */\n/*  Copyright 2009, 2012, 2013 by                                          */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTPIC_H__\n#define __TTPIC_H__\n\n\nFT_BEGIN_HEADER\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define TT_SERVICES_GET                  tt_services\n#define TT_SERVICE_GX_MULTI_MASTERS_GET  tt_service_gx_multi_masters\n#define TT_SERVICE_TRUETYPE_GLYF_GET     tt_service_truetype_glyf\n#define TT_SERVICE_PROPERTIES_GET        tt_service_properties\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#include \"../../include/freetype/ftmm.h\"\n#include \"../../include/freetype/internal/services/svmm.h\"\n#include \"../../include/freetype/internal/services/svttglyf.h\"\n#include \"../../include/freetype/internal/services/svprop.h\"\n\n\n  typedef struct  TTModulePIC_\n  {\n    FT_ServiceDescRec*          tt_services;\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n    FT_Service_MultiMastersRec  tt_service_gx_multi_masters;\n#endif\n    FT_Service_TTGlyfRec        tt_service_truetype_glyf;\n    FT_Service_PropertiesRec    tt_service_properties;\n\n  } TTModulePIC;\n\n\n#define GET_PIC( lib )                                      \\\n          ( (TTModulePIC*)((lib)->pic_container.truetype) )\n#define TT_SERVICES_GET                       \\\n          ( GET_PIC( library )->tt_services )\n#define TT_SERVICE_GX_MULTI_MASTERS_GET                       \\\n          ( GET_PIC( library )->tt_service_gx_multi_masters )\n#define TT_SERVICE_TRUETYPE_GLYF_GET                       \\\n          ( GET_PIC( library )->tt_service_truetype_glyf )\n#define TT_SERVICE_PROPERTIES_GET                       \\\n          ( GET_PIC( library )->tt_service_properties )\n\n\n  /* see ttpic.c for the implementation */\n  void\n  tt_driver_class_pic_free( FT_Library  library );\n\n  FT_Error\n  tt_driver_class_pic_init( FT_Library  library );\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __TTPIC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpload.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttpload.c                                                              */\n/*                                                                         */\n/*    TrueType-specific tables loader (body).                              */\n/*                                                                         */\n/*  Copyright 1996-2002, 2004-2013 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/tttags.h\"\n\n#include \"ttpload.h\"\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n#include \"ttgxvar.h\"\n#endif\n\n#include \"tterrors.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttpload\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_loca                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load the locations table.                                          */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream :: The input stream.                                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_loca( TT_Face    face,\n                     FT_Stream  stream )\n  {\n    FT_Error  error;\n    FT_ULong  table_len;\n    FT_Int    shift;\n\n\n    /* we need the size of the `glyf' table for malformed `loca' tables */\n    error = face->goto_table( face, TTAG_glyf, stream, &face->glyf_len );\n\n    /* it is possible that a font doesn't have a glyf table at all */\n    /* or its size is zero                                         */\n    if ( FT_ERR_EQ( error, Table_Missing ) )\n      face->glyf_len = 0;\n    else if ( error )\n      goto Exit;\n\n    FT_TRACE2(( \"Locations \" ));\n    error = face->goto_table( face, TTAG_loca, stream, &table_len );\n    if ( error )\n    {\n      error = FT_THROW( Locations_Missing );\n      goto Exit;\n    }\n\n    if ( face->header.Index_To_Loc_Format != 0 )\n    {\n      shift = 2;\n\n      if ( table_len >= 0x40000L )\n      {\n        FT_TRACE2(( \"table too large\\n\" ));\n        error = FT_THROW( Invalid_Table );\n        goto Exit;\n      }\n      face->num_locations = table_len >> shift;\n    }\n    else\n    {\n      shift = 1;\n\n      if ( table_len >= 0x20000L )\n      {\n        FT_TRACE2(( \"table too large\\n\" ));\n        error = FT_THROW( Invalid_Table );\n        goto Exit;\n      }\n      face->num_locations = table_len >> shift;\n    }\n\t/* Sunliang.Liu 20101013, We ignore the 242 new added code which cause some font load failed. \n\t   TESTDOC: Bug #4502 - PM2-beheerdershandleiding.pdf*/\n    /*if ( face->num_locations != (FT_ULong)face->root.num_glyphs + 1 )\n    {\n      FT_TRACE2(( \"glyph count mismatch!  loca: %d, maxp: %d\\n\",\n                  face->num_locations - 1, face->root.num_glyphs ));\n\n      // we only handle the case where `maxp' gives a larger value \n      if ( face->num_locations <= (FT_ULong)face->root.num_glyphs )\n      {\n        FT_Long   new_loca_len =\n                    ( (FT_Long)( face->root.num_glyphs ) + 1 ) << shift;\n\n        TT_Table  entry = face->dir_tables;\n        TT_Table  limit = entry + face->num_tables;\n\n        FT_Long   pos  = FT_Stream_Pos( stream );\n        FT_Long   dist = 0x7FFFFFFFL;\n\n\n        // compute the distance to next table in font file \n        for ( ; entry < limit; entry++ )\n        {\n          FT_Long  diff = entry->Offset - pos;\n\n\n          if ( diff > 0 && diff < dist )\n            dist = diff;\n        }\n\n        if ( entry == limit )\n        {\n          // `loca' is the last table\n          dist = stream->size - pos;\n        }\n\n        if ( new_loca_len <= dist )\n        {\n          face->num_locations = face->root.num_glyphs + 1;\n          table_len           = new_loca_len;\n\n          FT_TRACE2(( \"adjusting num_locations to %d\\n\",\n                      face->num_locations ));\n        }\n      }\n    }*/\n\n    /*\n     * Extract the frame.  We don't need to decompress it since\n     * we are able to parse it directly.\n     */\n    if ( FT_FRAME_EXTRACT( table_len, face->glyph_locations ) )\n      goto Exit;\n\n    FT_TRACE2(( \"loaded\\n\" ));\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_ULong )\n  tt_face_get_location( TT_Face   face,\n                        FT_UInt   gindex,\n                        FT_UInt  *asize )\n  {\n    FT_ULong  pos1, pos2;\n    FT_Byte*  p;\n    FT_Byte*  p_limit;\n\n\n    pos1 = pos2 = 0;\n\n\n    if (gindex < face->num_locations)/* gindex < face->num_locations */ /* XYQ 2008-11-03 Some ill TT has wrong glyf table size. It seems Adobe ignore the limit. TESTDOC: Bug #6248 - F-2008-18.pdf */\n    {\n      if ( face->header.Index_To_Loc_Format != 0 )\n      {\n        p       = face->glyph_locations + gindex * 4;\n        p_limit = face->glyph_locations + face->num_locations * 4;\n\n        pos1 = FT_NEXT_ULONG( p );\n        pos2 = pos1;\n\n        if (1)/* p + 4 <= p_limit ) */\n          pos2 = FT_NEXT_ULONG( p );\n      }\n      else\n      {\n        p       = face->glyph_locations + gindex * 2;\n        p_limit = face->glyph_locations + face->num_locations * 2;\n\n        pos1 = FT_NEXT_USHORT( p );\n        pos2 = pos1;\n\n        if (1) /* p + 2 <= p_limit ) */\n          pos2 = FT_NEXT_USHORT( p );\n\n        pos1 <<= 1;\n        pos2 <<= 1;\n      }\n    }\n\n    /* Check broken location data */\n    if ( pos1 > face->glyf_len )\n    {\n      FT_TRACE1(( \"tt_face_get_location:\"\n                  \" too large offset=0x%08lx found for gid=0x%04lx,\"\n                  \" exceeding the end of glyf table (0x%08lx)\\n\",\n                  pos1, gindex, face->glyf_len ));\n      *asize = 0;\n      return 0;\n    }\n\n    if ( pos2 > face->glyf_len )\n    {\n      FT_TRACE1(( \"tt_face_get_location:\"\n                  \" too large offset=0x%08lx found for gid=0x%04lx,\"\n                  \" truncate at the end of glyf table (0x%08lx)\\n\",\n                  pos2, gindex + 1, face->glyf_len ));\n      pos2 = face->glyf_len;\n    }\n\n    /* The `loca' table must be ordered; it refers to the length of */\n    /* an entry as the difference between the current and the next  */\n    /* position.  However, there do exist (malformed) fonts which   */\n    /* don't obey this rule, so we are only able to provide an      */\n    /* upper bound for the size.                                    */\n    /*                                                              */\n    /* We get (intentionally) a wrong, non-zero result in case the  */\n    /* `glyf' table is missing.                                     */\n    if ( pos2 >= pos1 )\n      *asize = (FT_UInt)( pos2 - pos1 );\n    else\n      *asize = (FT_UInt)( face->glyf_len - pos1 );\n\n    return pos1;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  tt_face_done_loca( TT_Face  face )\n  {\n    FT_Stream  stream = face->root.stream;\n\n\n    FT_FRAME_RELEASE( face->glyph_locations );\n    face->num_locations = 0;\n  }\n\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_cvt                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load the control value table into a face object.                   */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream :: A handle to the input stream.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_cvt( TT_Face    face,\n                    FT_Stream  stream )\n  {\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n    FT_Error   error;\n    FT_Memory  memory = stream->memory;\n    FT_ULong   table_len;\n\n\n    FT_TRACE2(( \"CVT \" ));\n\n    error = face->goto_table( face, TTAG_cvt, stream, &table_len );\n    if ( error )\n    {\n      FT_TRACE2(( \"is missing\\n\" ));\n\n      face->cvt_size = 0;\n      face->cvt      = NULL;\n      error          = FT_Err_Ok;\n\n      goto Exit;\n    }\n\n    face->cvt_size = table_len / 2;\n\n    if ( FT_NEW_ARRAY( face->cvt, face->cvt_size ) )\n      goto Exit;\n\n    if ( FT_FRAME_ENTER( face->cvt_size * 2L ) )\n      goto Exit;\n\n    {\n      FT_Short*  cur   = face->cvt;\n      FT_Short*  limit = cur + face->cvt_size;\n\n\n      for ( ; cur < limit; cur++ )\n        *cur = FT_GET_SHORT();\n    }\n\n    FT_FRAME_EXIT();\n    FT_TRACE2(( \"loaded\\n\" ));\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n    if ( face->doblend )\n      error = tt_face_vary_cvt( face, stream );\n#endif\n\n  Exit:\n    return error;\n\n#else /* !TT_USE_BYTECODE_INTERPRETER */\n\n    FT_UNUSED( face   );\n    FT_UNUSED( stream );\n\n    return FT_Err_Ok;\n\n#endif\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_fpgm                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load the font program.                                             */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream :: A handle to the input stream.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_fpgm( TT_Face    face,\n                     FT_Stream  stream )\n  {\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n    FT_Error  error;\n    FT_ULong  table_len;\n\n\n    FT_TRACE2(( \"Font program \" ));\n\n    /* The font program is optional */\n    error = face->goto_table( face, TTAG_fpgm, stream, &table_len );\n    if ( error )\n    {\n      face->font_program      = NULL;\n      face->font_program_size = 0;\n      error                   = FT_Err_Ok;\n\n      FT_TRACE2(( \"is missing\\n\" ));\n    }\n    else\n    {\n      face->font_program_size = table_len;\n      if ( FT_FRAME_EXTRACT( table_len, face->font_program ) )\n        goto Exit;\n\n      FT_TRACE2(( \"loaded, %12d bytes\\n\", face->font_program_size ));\n    }\n\n  Exit:\n    return error;\n\n#else /* !TT_USE_BYTECODE_INTERPRETER */\n\n    FT_UNUSED( face   );\n    FT_UNUSED( stream );\n\n    return FT_Err_Ok;\n\n#endif\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_prep                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load the cvt program.                                              */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream :: A handle to the input stream.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_prep( TT_Face    face,\n                     FT_Stream  stream )\n  {\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n    FT_Error  error;\n    FT_ULong  table_len;\n\n\n    FT_TRACE2(( \"Prep program \" ));\n\n    error = face->goto_table( face, TTAG_prep, stream, &table_len );\n    if ( error )\n    {\n      face->cvt_program      = NULL;\n      face->cvt_program_size = 0;\n      error                  = FT_Err_Ok;\n\n      FT_TRACE2(( \"is missing\\n\" ));\n    }\n    else\n    {\n      face->cvt_program_size = table_len;\n      if ( FT_FRAME_EXTRACT( table_len, face->cvt_program ) )\n        goto Exit;\n\n      FT_TRACE2(( \"loaded, %12d bytes\\n\", face->cvt_program_size ));\n    }\n\n  Exit:\n    return error;\n\n#else /* !TT_USE_BYTECODE_INTERPRETER */\n\n    FT_UNUSED( face   );\n    FT_UNUSED( stream );\n\n    return FT_Err_Ok;\n\n#endif\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_hdmx                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load the `hdmx' table into the face object.                        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /*    stream :: A handle to the input stream.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_hdmx( TT_Face    face,\n                     FT_Stream  stream )\n  {\n    FT_Error   error;\n    FT_Memory  memory = stream->memory;\n    FT_UInt    version, nn, num_records;\n    FT_ULong   table_size, record_size;\n    FT_Byte*   p;\n    FT_Byte*   limit;\n\n\n    /* this table is optional */\n    error = face->goto_table( face, TTAG_hdmx, stream, &table_size );\n    if ( error || table_size < 8 )\n      return FT_Err_Ok;\n\n    if ( FT_FRAME_EXTRACT( table_size, face->hdmx_table ) )\n      goto Exit;\n\n    p     = face->hdmx_table;\n    limit = p + table_size;\n\n    version     = FT_NEXT_USHORT( p );\n    num_records = FT_NEXT_USHORT( p );\n    record_size = FT_NEXT_ULONG( p );\n\n    /* The maximum number of bytes in an hdmx device record is the */\n    /* maximum number of glyphs + 2; this is 0xFFFF + 2; this is   */\n    /* the reason why `record_size' is a long (which we read as    */\n    /* unsigned long for convenience).  In practice, two bytes     */\n    /* sufficient to hold the size value.                          */\n    /*                                                             */\n    /* There are at least two fonts, HANNOM-A and HANNOM-B version */\n    /* 2.0 (2005), which get this wrong: The upper two bytes of    */\n    /* the size value are set to 0xFF instead of 0x00.  We catch   */\n    /* and fix this.                                               */\n\n    if ( record_size >= 0xFFFF0000UL )\n      record_size &= 0xFFFFU;\n\n    /* The limit for `num_records' is a heuristic value. */\n\n    if ( version != 0 || num_records > 255 || record_size > 0x10001L )\n    {\n      error = FT_THROW( Invalid_File_Format );\n      goto Fail;\n    }\n\n    if ( FT_NEW_ARRAY( face->hdmx_record_sizes, num_records ) )\n      goto Fail;\n\n    for ( nn = 0; nn < num_records; nn++ )\n    {\n      if ( p + record_size > limit )\n        break;\n\n      face->hdmx_record_sizes[nn] = p[0];\n      p                          += record_size;\n    }\n\n    face->hdmx_record_count = nn;\n    face->hdmx_table_size   = table_size;\n    face->hdmx_record_size  = record_size;\n\n  Exit:\n    return error;\n\n  Fail:\n    FT_FRAME_RELEASE( face->hdmx_table );\n    face->hdmx_table_size = 0;\n    goto Exit;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  tt_face_free_hdmx( TT_Face  face )\n  {\n    FT_Stream  stream = face->root.stream;\n    FT_Memory  memory = stream->memory;\n\n\n    FT_FREE( face->hdmx_record_sizes );\n    FT_FRAME_RELEASE( face->hdmx_table );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Return the advance width table for a given pixel size if it is found  */\n  /* in the font's `hdmx' table (if any).                                  */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Byte* )\n  tt_face_get_device_metrics( TT_Face  face,\n                              FT_UInt  ppem,\n                              FT_UInt  gindex )\n  {\n    FT_UInt   nn;\n    FT_Byte*  result      = NULL;\n    FT_ULong  record_size = face->hdmx_record_size;\n    FT_Byte*  record      = face->hdmx_table + 8;\n\n\n    for ( nn = 0; nn < face->hdmx_record_count; nn++ )\n      if ( face->hdmx_record_sizes[nn] == ppem )\n      {\n        gindex += 2;\n        if ( gindex < record_size )\n          result = record + nn * record_size + gindex;\n        break;\n      }\n\n    return result;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpload.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttpload.h                                                              */\n/*                                                                         */\n/*    TrueType-specific tables loader (specification).                     */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2005, 2006 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTPLOAD_H__\n#define __TTPLOAD_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/tttypes.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_loca( TT_Face    face,\n                     FT_Stream  stream );\n\n  FT_LOCAL( FT_ULong )\n  tt_face_get_location( TT_Face   face,\n                        FT_UInt   gindex,\n                        FT_UInt  *asize );\n\n  FT_LOCAL( void )\n  tt_face_done_loca( TT_Face  face );\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_cvt( TT_Face    face,\n                    FT_Stream  stream );\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_fpgm( TT_Face    face,\n                     FT_Stream  stream );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_prep( TT_Face    face,\n                     FT_Stream  stream );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_hdmx( TT_Face    face,\n                     FT_Stream  stream );\n\n\n  FT_LOCAL( void )\n  tt_face_free_hdmx( TT_Face  face );\n\n\n  FT_LOCAL( FT_Byte* )\n  tt_face_get_device_metrics( TT_Face    face,\n                              FT_UInt    ppem,\n                              FT_UInt    gindex );\n\nFT_END_HEADER\n\n#endif /* __TTPLOAD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttsubpix.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttsubpix.c                                                             */\n/*                                                                         */\n/*    TrueType Subpixel Hinting.                                           */\n/*                                                                         */\n/*  Copyright 2010-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftcalc.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/internal/sfnt.h\"\n#include \"../../include/freetype/tttags.h\"\n#include \"../../include/freetype/ftoutln.h\"\n#include \"../../include/freetype/ftttdrv.h\"\n\n#include \"ttsubpix.h\"\n\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* These rules affect how the TT Interpreter does hinting, with the      */\n  /* goal of doing subpixel hinting by (in general) ignoring x moves.      */\n  /* Some of these rules are fixes that go above and beyond the            */\n  /* stated techniques in the MS whitepaper on Cleartype, due to           */\n  /* artifacts in many glyphs.  So, these rules make some glyphs render    */\n  /* better than they do in the MS rasterizer.                             */\n  /*                                                                       */\n  /* \"\" string or 0 int/char indicates to apply to all glyphs.             */\n  /* \"-\" used as dummy placeholders, but any non-matching string works.    */\n  /*                                                                       */\n  /* Some of this could arguably be implemented in fontconfig, however:    */\n  /*                                                                       */\n  /*  - Fontconfig can't set things on a glyph-by-glyph basis.             */\n  /*  - The tweaks that happen here are very low-level, from an average    */\n  /*    user's point of view and are best implemented in the hinter.       */\n  /*                                                                       */\n  /* The goal is to make the subpixel hinting techniques as generalized    */\n  /* as possible across all fonts to prevent the need for extra rules such */\n  /* as these.                                                             */\n  /*                                                                       */\n  /* The rule structure is designed so that entirely new rules can easily  */\n  /* be added when a new compatibility feature is discovered.              */\n  /*                                                                       */\n  /* The rule structures could also use some enhancement to handle ranges. */\n  /*                                                                       */\n  /*     ****************** WORK IN PROGRESS *******************           */\n  /*                                                                       */\n\n  /* These are `classes' of fonts that can be grouped together and used in */\n  /* rules below.  A blank entry \"\" is required at the end of these!       */\n#define FAMILY_CLASS_RULES_SIZE  7\n\n  static const SPH_Font_Class FAMILY_CLASS_Rules\n                              [FAMILY_CLASS_RULES_SIZE] =\n  {\n    { \"MS Legacy Fonts\",\n      { \"Aharoni\",\n        \"Andale Mono\",\n        \"Andalus\",\n        \"Angsana New\",\n        \"AngsanaUPC\",\n        \"Arabic Transparent\",\n        \"Arial Black\",\n        \"Arial Narrow\",\n        \"Arial Unicode MS\",\n        \"Arial\",\n        \"Batang\",\n        \"Browallia New\",\n        \"BrowalliaUPC\",\n        \"Comic Sans MS\",\n        \"Cordia New\",\n        \"CordiaUPC\",\n        \"Courier New\",\n        \"DFKai-SB\",\n        \"David Transparent\",\n        \"David\",\n        \"DilleniaUPC\",\n        \"Estrangelo Edessa\",\n        \"EucrosiaUPC\",\n        \"FangSong_GB2312\",\n        \"Fixed Miriam Transparent\",\n        \"FrankRuehl\",\n        \"Franklin Gothic Medium\",\n        \"FreesiaUPC\",\n        \"Garamond\",\n        \"Gautami\",\n        \"Georgia\",\n        \"Gulim\",\n        \"Impact\",\n        \"IrisUPC\",\n        \"JasmineUPC\",\n        \"KaiTi_GB2312\",\n        \"KodchiangUPC\",\n        \"Latha\",\n        \"Levenim MT\",\n        \"LilyUPC\",\n        \"Lucida Console\",\n        \"Lucida Sans Unicode\",\n        \"MS Gothic\",\n        \"MS Mincho\",\n        \"MV Boli\",\n        \"Mangal\",\n        \"Marlett\",\n        \"Microsoft Sans Serif\",\n        \"Mingliu\",\n        \"Miriam Fixed\",\n        \"Miriam Transparent\",\n        \"Miriam\",\n        \"Narkisim\",\n        \"Palatino Linotype\",\n        \"Raavi\",\n        \"Rod Transparent\",\n        \"Rod\",\n        \"Shruti\",\n        \"SimHei\",\n        \"Simplified Arabic Fixed\",\n        \"Simplified Arabic\",\n        \"Simsun\",\n        \"Sylfaen\",\n        \"Symbol\",\n        \"Tahoma\",\n        \"Times New Roman\",\n        \"Traditional Arabic\",\n        \"Trebuchet MS\",\n        \"Tunga\",\n        \"Verdana\",\n        \"Webdings\",\n        \"Wingdings\",\n        \"\",\n      },\n    },\n    { \"Core MS Legacy Fonts\",\n      { \"Arial Black\",\n        \"Arial Narrow\",\n        \"Arial Unicode MS\",\n        \"Arial\",\n        \"Comic Sans MS\",\n        \"Courier New\",\n        \"Garamond\",\n        \"Georgia\",\n        \"Impact\",\n        \"Lucida Console\",\n        \"Lucida Sans Unicode\",\n        \"Microsoft Sans Serif\",\n        \"Palatino Linotype\",\n        \"Tahoma\",\n        \"Times New Roman\",\n        \"Trebuchet MS\",\n        \"Verdana\",\n        \"\",\n      },\n    },\n    { \"Apple Legacy Fonts\",\n      { \"Geneva\",\n        \"Times\",\n        \"Monaco\",\n        \"Century\",\n        \"Chalkboard\",\n        \"Lobster\",\n        \"Century Gothic\",\n        \"Optima\",\n        \"Lucida Grande\",\n        \"Gill Sans\",\n        \"Baskerville\",\n        \"Helvetica\",\n        \"Helvetica Neue\",\n        \"\",\n      },\n    },\n    { \"Legacy Sans Fonts\",\n      { \"Andale Mono\",\n        \"Arial Unicode MS\",\n        \"Arial\",\n        \"Century Gothic\",\n        \"Comic Sans MS\",\n        \"Franklin Gothic Medium\",\n        \"Geneva\",\n        \"Lucida Console\",\n        \"Lucida Grande\",\n        \"Lucida Sans Unicode\",\n        \"Lucida Sans Typewriter\",\n        \"Microsoft Sans Serif\",\n        \"Monaco\",\n        \"Tahoma\",\n        \"Trebuchet MS\",\n        \"Verdana\",\n        \"\",\n      },\n    },\n\n    { \"Misc Legacy Fonts\",\n      { \"Dark Courier\", \"\", }, },\n    { \"Verdana Clones\",\n      { \"DejaVu Sans\",\n        \"Bitstream Vera Sans\", \"\", }, },\n    { \"Verdana and Clones\",\n      { \"DejaVu Sans\",\n        \"Bitstream Vera Sans\",\n        \"Verdana\", \"\", }, },\n  };\n\n\n  /* Define this to force natural (i.e. not bitmap-compatible) widths.     */\n  /* The default leans strongly towards natural widths except for a few    */\n  /* legacy fonts where a selective combination produces nicer results.    */\n/* #define FORCE_NATURAL_WIDTHS   */\n\n\n  /* Define `classes' of styles that can be grouped together and used in   */\n  /* rules below.  A blank entry \"\" is required at the end of these!       */\n#define STYLE_CLASS_RULES_SIZE  5\n\n  const SPH_Font_Class STYLE_CLASS_Rules\n                       [STYLE_CLASS_RULES_SIZE] =\n  {\n    { \"Regular Class\",\n      { \"Regular\",\n        \"Book\",\n        \"Medium\",\n        \"Roman\",\n        \"Normal\",\n        \"\",\n      },\n    },\n    { \"Regular/Italic Class\",\n      { \"Regular\",\n        \"Book\",\n        \"Medium\",\n        \"Italic\",\n        \"Oblique\",\n        \"Roman\",\n        \"Normal\",\n        \"\",\n      },\n    },\n    { \"Bold/BoldItalic Class\",\n      { \"Bold\",\n        \"Bold Italic\",\n        \"Black\",\n        \"\",\n      },\n    },\n    { \"Bold/Italic/BoldItalic Class\",\n      { \"Bold\",\n        \"Bold Italic\",\n        \"Black\",\n        \"Italic\",\n        \"Oblique\",\n        \"\",\n      },\n    },\n    { \"Regular/Bold Class\",\n      { \"Regular\",\n        \"Book\",\n        \"Medium\",\n        \"Normal\",\n        \"Roman\",\n        \"Bold\",\n        \"Black\",\n        \"\",\n      },\n    },\n  };\n\n\n  /* Force special legacy fixes for fonts.                                 */\n#define COMPATIBILITY_MODE_RULES_SIZE  1\n\n  const SPH_TweakRule  COMPATIBILITY_MODE_Rules\n                       [COMPATIBILITY_MODE_RULES_SIZE] =\n  {\n    { \"-\", 0, \"\", 0 },\n  };\n\n\n  /* Don't do subpixel (ignore_x_mode) hinting; do normal hinting.         */\n#define PIXEL_HINTING_RULES_SIZE  2\n\n  const SPH_TweakRule  PIXEL_HINTING_Rules\n                       [PIXEL_HINTING_RULES_SIZE] =\n  {\n    /* these characters are almost always safe */\n    { \"Courier New\", 12, \"Italic\", 'z' },\n    { \"Courier New\", 11, \"Italic\", 'z' },\n  };\n\n\n  /* Subpixel hinting ignores SHPIX rules on X.  Force SHPIX for these.    */\n#define DO_SHPIX_RULES_SIZE  1\n\n  const SPH_TweakRule  DO_SHPIX_Rules\n                       [DO_SHPIX_RULES_SIZE] =\n  {\n    { \"-\", 0, \"\", 0 },\n  };\n\n\n  /* Skip Y moves that start with a point that is not on a Y pixel         */\n  /* boundary and don't move that point to a Y pixel boundary.             */\n#define SKIP_NONPIXEL_Y_MOVES_RULES_SIZE  4\n\n  const SPH_TweakRule  SKIP_NONPIXEL_Y_MOVES_Rules\n                       [SKIP_NONPIXEL_Y_MOVES_RULES_SIZE] =\n  {\n    /* fix vwxyz thinness*/\n    { \"Consolas\", 0, \"\", 0 },\n    /* Fix thin middle stems */\n    { \"Core MS Legacy Fonts\", 0, \"Regular\", 0 },\n    /* Cyrillic small letter I */\n    { \"Legacy Sans Fonts\", 0, \"\", 0 },\n    /* Fix artifacts with some Regular & Bold */\n    { \"Verdana Clones\", 0, \"\", 0 },\n  };\n\n\n#define SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE  1\n\n  const SPH_TweakRule  SKIP_NONPIXEL_Y_MOVES_Rules_Exceptions\n                       [SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =\n  {\n    /* Fixes < and > */\n    { \"Courier New\", 0, \"Regular\", 0 },\n  };\n\n\n  /* Skip Y moves that start with a point that is not on a Y pixel         */\n  /* boundary and don't move that point to a Y pixel boundary.             */\n#define SKIP_NONPIXEL_Y_MOVES_DELTAP_RULES_SIZE  2\n\n  const SPH_TweakRule  SKIP_NONPIXEL_Y_MOVES_DELTAP_Rules\n                       [SKIP_NONPIXEL_Y_MOVES_DELTAP_RULES_SIZE] =\n  {\n    /* Maintain thickness of diagonal in 'N' */\n    { \"Times New Roman\", 0, \"Regular/Bold Class\", 'N' },\n    { \"Georgia\", 0, \"Regular/Bold Class\", 'N' },\n  };\n\n\n  /* Skip Y moves that move a point off a Y pixel boundary.                */\n#define SKIP_OFFPIXEL_Y_MOVES_RULES_SIZE  1\n\n  const SPH_TweakRule  SKIP_OFFPIXEL_Y_MOVES_Rules\n                       [SKIP_OFFPIXEL_Y_MOVES_RULES_SIZE] =\n  {\n    { \"-\", 0, \"\", 0 },\n  };\n\n\n#define SKIP_OFFPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE  1\n\n  const SPH_TweakRule  SKIP_OFFPIXEL_Y_MOVES_Rules_Exceptions\n                       [SKIP_OFFPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =\n  {\n    { \"-\", 0, \"\", 0 },\n  };\n\n\n  /* Round moves that don't move a point to a Y pixel boundary.            */\n#define ROUND_NONPIXEL_Y_MOVES_RULES_SIZE  2\n\n  const SPH_TweakRule  ROUND_NONPIXEL_Y_MOVES_Rules\n                       [ROUND_NONPIXEL_Y_MOVES_RULES_SIZE] =\n  {\n    /* Droid font instructions don't snap Y to pixels */\n    { \"Droid Sans\", 0, \"Regular/Italic Class\", 0 },\n    { \"Droid Sans Mono\", 0, \"\", 0 },\n  };\n\n\n#define ROUND_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE  1\n\n  const SPH_TweakRule  ROUND_NONPIXEL_Y_MOVES_Rules_Exceptions\n                       [ROUND_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =\n  {\n    { \"-\", 0, \"\", 0 },\n  };\n\n\n  /* Allow a Direct_Move along X freedom vector if matched.                */\n#define ALLOW_X_DMOVE_RULES_SIZE  1\n\n  const SPH_TweakRule  ALLOW_X_DMOVE_Rules\n                       [ALLOW_X_DMOVE_RULES_SIZE] =\n  {\n    /* Fixes vanishing diagonal in 4 */\n    { \"Verdana\", 0, \"Regular\", '4' },\n  };\n\n\n  /* Return MS rasterizer version 35 if matched.                           */\n#define RASTERIZER_35_RULES_SIZE  8\n\n  const SPH_TweakRule  RASTERIZER_35_Rules\n                       [RASTERIZER_35_RULES_SIZE] =\n  {\n    /* This seems to be the only way to make these look good */\n    { \"Times New Roman\", 0, \"Regular\", 'i' },\n    { \"Times New Roman\", 0, \"Regular\", 'j' },\n    { \"Times New Roman\", 0, \"Regular\", 'm' },\n    { \"Times New Roman\", 0, \"Regular\", 'r' },\n    { \"Times New Roman\", 0, \"Regular\", 'a' },\n    { \"Times New Roman\", 0, \"Regular\", 'n' },\n    { \"Times New Roman\", 0, \"Regular\", 'p' },\n    { \"Times\", 0, \"\", 0 },\n  };\n\n\n  /* Don't round to the subpixel grid.  Round to pixel grid.               */\n#define NORMAL_ROUND_RULES_SIZE  1\n\n  const SPH_TweakRule  NORMAL_ROUND_Rules\n                       [NORMAL_ROUND_RULES_SIZE] =\n  {\n    /* Fix serif thickness for certain ppems */\n    /* Can probably be generalized somehow   */\n    { \"Courier New\", 0, \"\", 0 },\n  };\n\n\n  /* Skip IUP instructions if matched.                                     */\n#define SKIP_IUP_RULES_SIZE  1\n\n  const SPH_TweakRule  SKIP_IUP_Rules\n                       [SKIP_IUP_RULES_SIZE] =\n  {\n    { \"Arial\", 13, \"Regular\", 'a' },\n  };\n\n\n  /* Skip MIAP Twilight hack if matched.                                   */\n#define MIAP_HACK_RULES_SIZE  1\n\n  const SPH_TweakRule  MIAP_HACK_Rules\n                       [MIAP_HACK_RULES_SIZE] =\n  {\n    { \"Geneva\", 12, \"\", 0 },\n  };\n\n\n  /* Skip DELTAP instructions if matched.                                  */\n#define ALWAYS_SKIP_DELTAP_RULES_SIZE  23\n\n  const SPH_TweakRule  ALWAYS_SKIP_DELTAP_Rules\n                       [ALWAYS_SKIP_DELTAP_RULES_SIZE] =\n  {\n    { \"Georgia\", 0, \"Regular\", 'k' },\n    /* fix various problems with e in different versions */\n    { \"Trebuchet MS\", 14, \"Regular\", 'e' },\n    { \"Trebuchet MS\", 13, \"Regular\", 'e' },\n    { \"Trebuchet MS\", 15, \"Regular\", 'e' },\n    { \"Trebuchet MS\", 0, \"Italic\", 'v' },\n    { \"Trebuchet MS\", 0, \"Italic\", 'w' },\n    { \"Trebuchet MS\", 0, \"Regular\", 'Y' },\n    { \"Arial\", 11, \"Regular\", 's' },\n    /* prevent problems with '3' and others */\n    { \"Verdana\", 10, \"Regular\", 0 },\n    { \"Verdana\", 9, \"Regular\", 0 },\n    /* Cyrillic small letter short I */\n    { \"Legacy Sans Fonts\", 0, \"\", 0x438 },\n    { \"Legacy Sans Fonts\", 0, \"\", 0x439 },\n    { \"Arial\", 10, \"Regular\", '6' },\n    { \"Arial\", 0, \"Bold/BoldItalic Class\", 'a' },\n    /* Make horizontal stems consistent with the rest */\n    { \"Arial\", 24, \"Bold\", 'a' },\n    { \"Arial\", 25, \"Bold\", 'a' },\n    { \"Arial\", 24, \"Bold\", 's' },\n    { \"Arial\", 25, \"Bold\", 's' },\n    { \"Arial\", 34, \"Bold\", 's' },\n    { \"Arial\", 35, \"Bold\", 's' },\n    { \"Arial\", 36, \"Bold\", 's' },\n    { \"Arial\", 25, \"Regular\", 's' },\n    { \"Arial\", 26, \"Regular\", 's' },\n  };\n\n\n  /* Always do DELTAP instructions if matched.                             */\n#define ALWAYS_DO_DELTAP_RULES_SIZE  1\n\n  const SPH_TweakRule  ALWAYS_DO_DELTAP_Rules\n                       [ALWAYS_DO_DELTAP_RULES_SIZE] =\n  {\n    { \"-\", 0, \"\", 0 },\n  };\n\n\n  /* Don't allow ALIGNRP after IUP.                                        */\n#define NO_ALIGNRP_AFTER_IUP_RULES_SIZE  1\n\n  static const SPH_TweakRule  NO_ALIGNRP_AFTER_IUP_Rules\n                              [NO_ALIGNRP_AFTER_IUP_RULES_SIZE] =\n  {\n    /* Prevent creation of dents in outline */\n    { \"-\", 0, \"\", 0 },\n  };\n\n\n  /* Don't allow DELTAP after IUP.                                         */\n#define NO_DELTAP_AFTER_IUP_RULES_SIZE  1\n\n  static const SPH_TweakRule  NO_DELTAP_AFTER_IUP_Rules\n                              [NO_DELTAP_AFTER_IUP_RULES_SIZE] =\n  {\n    { \"-\", 0, \"\", 0 },\n  };\n\n\n  /* Don't allow CALL after IUP.                                           */\n#define NO_CALL_AFTER_IUP_RULES_SIZE  1\n\n  static const SPH_TweakRule  NO_CALL_AFTER_IUP_Rules\n                              [NO_CALL_AFTER_IUP_RULES_SIZE] =\n  {\n    /* Prevent creation of dents in outline */\n    { \"-\", 0, \"\", 0 },\n  };\n\n\n  /* De-embolden these glyphs slightly.                                    */\n#define DEEMBOLDEN_RULES_SIZE  9\n\n  static const SPH_TweakRule  DEEMBOLDEN_Rules\n                              [DEEMBOLDEN_RULES_SIZE] =\n  {\n    { \"Courier New\", 0, \"Bold\", 'A' },\n    { \"Courier New\", 0, \"Bold\", 'W' },\n    { \"Courier New\", 0, \"Bold\", 'w' },\n    { \"Courier New\", 0, \"Bold\", 'M' },\n    { \"Courier New\", 0, \"Bold\", 'X' },\n    { \"Courier New\", 0, \"Bold\", 'K' },\n    { \"Courier New\", 0, \"Bold\", 'x' },\n    { \"Courier New\", 0, \"Bold\", 'z' },\n    { \"Courier New\", 0, \"Bold\", 'v' },\n  };\n\n\n  /* Embolden these glyphs slightly.                                       */\n#define EMBOLDEN_RULES_SIZE  2\n\n  static const SPH_TweakRule  EMBOLDEN_Rules\n                              [EMBOLDEN_RULES_SIZE] =\n  {\n    { \"Courier New\", 0, \"Regular\", 0 },\n    { \"Courier New\", 0, \"Italic\", 0 },\n  };\n\n\n  /* This is a CVT hack that makes thick horizontal stems on 2, 5, 7       */\n  /* similar to Windows XP.                                                */\n#define TIMES_NEW_ROMAN_HACK_RULES_SIZE  12\n\n  static const SPH_TweakRule  TIMES_NEW_ROMAN_HACK_Rules\n                              [TIMES_NEW_ROMAN_HACK_RULES_SIZE] =\n  {\n    { \"Times New Roman\", 16, \"Italic\", '2' },\n    { \"Times New Roman\", 16, \"Italic\", '5' },\n    { \"Times New Roman\", 16, \"Italic\", '7' },\n    { \"Times New Roman\", 16, \"Regular\", '2' },\n    { \"Times New Roman\", 16, \"Regular\", '5' },\n    { \"Times New Roman\", 16, \"Regular\", '7' },\n    { \"Times New Roman\", 17, \"Italic\", '2' },\n    { \"Times New Roman\", 17, \"Italic\", '5' },\n    { \"Times New Roman\", 17, \"Italic\", '7' },\n    { \"Times New Roman\", 17, \"Regular\", '2' },\n    { \"Times New Roman\", 17, \"Regular\", '5' },\n    { \"Times New Roman\", 17, \"Regular\", '7' },\n  };\n\n\n  /* This fudges distance on 2 to get rid of the vanishing stem issue.     */\n  /* A real solution to this is certainly welcome.                         */\n#define COURIER_NEW_2_HACK_RULES_SIZE  15\n\n  static const SPH_TweakRule  COURIER_NEW_2_HACK_Rules\n                              [COURIER_NEW_2_HACK_RULES_SIZE] =\n  {\n    { \"Courier New\", 10, \"Regular\", '2' },\n    { \"Courier New\", 11, \"Regular\", '2' },\n    { \"Courier New\", 12, \"Regular\", '2' },\n    { \"Courier New\", 13, \"Regular\", '2' },\n    { \"Courier New\", 14, \"Regular\", '2' },\n    { \"Courier New\", 15, \"Regular\", '2' },\n    { \"Courier New\", 16, \"Regular\", '2' },\n    { \"Courier New\", 17, \"Regular\", '2' },\n    { \"Courier New\", 18, \"Regular\", '2' },\n    { \"Courier New\", 19, \"Regular\", '2' },\n    { \"Courier New\", 20, \"Regular\", '2' },\n    { \"Courier New\", 21, \"Regular\", '2' },\n    { \"Courier New\", 22, \"Regular\", '2' },\n    { \"Courier New\", 23, \"Regular\", '2' },\n    { \"Courier New\", 24, \"Regular\", '2' },\n  };\n\n\n#ifndef FORCE_NATURAL_WIDTHS\n\n  /* Use compatible widths with these glyphs.  Compatible widths is always */\n  /* on when doing B/W TrueType instructing, but is used selectively here, */\n  /* typically on glyphs with 3 or more vertical stems.                    */\n#define COMPATIBLE_WIDTHS_RULES_SIZE  38\n\n  static const SPH_TweakRule  COMPATIBLE_WIDTHS_Rules\n                              [COMPATIBLE_WIDTHS_RULES_SIZE] =\n  {\n    { \"Arial Unicode MS\", 12, \"Regular Class\", 'm' },\n    { \"Arial Unicode MS\", 14, \"Regular Class\", 'm' },\n    /* Cyrillic small letter sha */\n    { \"Arial\", 10, \"Regular Class\", 0x448 },\n    { \"Arial\", 11, \"Regular Class\", 'm' },\n    { \"Arial\", 12, \"Regular Class\", 'm' },\n    /* Cyrillic small letter sha */\n    { \"Arial\", 12, \"Regular Class\", 0x448 },\n    { \"Arial\", 13, \"Regular Class\", 0x448 },\n    { \"Arial\", 14, \"Regular Class\", 'm' },\n    /* Cyrillic small letter sha */\n    { \"Arial\", 14, \"Regular Class\", 0x448 },\n    { \"Arial\", 15, \"Regular Class\", 0x448 },\n    { \"Arial\", 17, \"Regular Class\", 'm' },\n    { \"DejaVu Sans\", 15, \"Regular Class\", 0 },\n    { \"Microsoft Sans Serif\", 11, \"Regular Class\", 0 },\n    { \"Microsoft Sans Serif\", 12, \"Regular Class\", 0 },\n    { \"Segoe UI\", 11, \"Regular Class\", 0 },\n    { \"Monaco\", 0, \"Regular Class\", 0 },\n    { \"Segoe UI\", 12, \"Regular Class\", 'm' },\n    { \"Segoe UI\", 14, \"Regular Class\", 'm' },\n    { \"Tahoma\", 11, \"Regular Class\", 0 },\n    { \"Times New Roman\", 16, \"Regular Class\", 'c' },\n    { \"Times New Roman\", 16, \"Regular Class\", 'm' },\n    { \"Times New Roman\", 16, \"Regular Class\", 'o' },\n    { \"Times New Roman\", 16, \"Regular Class\", 'w' },\n    { \"Trebuchet MS\", 11, \"Regular Class\", 0 },\n    { \"Trebuchet MS\", 12, \"Regular Class\", 0 },\n    { \"Trebuchet MS\", 14, \"Regular Class\", 0 },\n    { \"Trebuchet MS\", 15, \"Regular Class\", 0 },\n    { \"Ubuntu\", 12, \"Regular Class\", 'm' },\n    /* Cyrillic small letter sha */\n    { \"Verdana\", 10, \"Regular Class\", 0x448 },\n    { \"Verdana\", 11, \"Regular Class\", 0x448 },\n    { \"Verdana and Clones\", 12, \"Regular Class\", 'i' },\n    { \"Verdana and Clones\", 12, \"Regular Class\", 'j' },\n    { \"Verdana and Clones\", 12, \"Regular Class\", 'l' },\n    { \"Verdana and Clones\", 12, \"Regular Class\", 'm' },\n    { \"Verdana and Clones\", 13, \"Regular Class\", 'i' },\n    { \"Verdana and Clones\", 13, \"Regular Class\", 'j' },\n    { \"Verdana and Clones\", 13, \"Regular Class\", 'l' },\n    { \"Verdana and Clones\", 14, \"Regular Class\", 'm' },\n  };\n\n\n  /* Scaling slightly in the x-direction prior to hinting results in       */\n  /* more visually pleasing glyphs in certain cases.                       */\n  /* This sometimes needs to be coordinated with compatible width rules.   */\n  /* A value of 1000 corresponds to a scaled value of 1.0.                 */\n\n#define X_SCALING_RULES_SIZE  50\n\n  static const SPH_ScaleRule  X_SCALING_Rules[X_SCALING_RULES_SIZE] =\n  {\n    { \"DejaVu Sans\", 12, \"Regular Class\", 'm', 950 },\n    { \"Verdana and Clones\", 12, \"Regular Class\", 'a', 1100 },\n    { \"Verdana and Clones\", 13, \"Regular Class\", 'a', 1050 },\n    { \"Arial\", 11, \"Regular Class\", 'm', 975 },\n    { \"Arial\", 12, \"Regular Class\", 'm', 1050 },\n    /* Cyrillic small letter el */\n    { \"Arial\", 13, \"Regular Class\", 0x43B, 950 },\n    { \"Arial\", 13, \"Regular Class\", 'o', 950 },\n    { \"Arial\", 13, \"Regular Class\", 'e', 950 },\n    { \"Arial\", 14, \"Regular Class\", 'm', 950 },\n    /* Cyrillic small letter el */\n    { \"Arial\", 15, \"Regular Class\", 0x43B, 925 },\n    { \"Bitstream Vera Sans\", 10, \"Regular/Italic Class\", 0, 1100 },\n    { \"Bitstream Vera Sans\", 12, \"Regular/Italic Class\", 0, 1050 },\n    { \"Bitstream Vera Sans\", 16, \"Regular Class\", 0, 1050 },\n    { \"Bitstream Vera Sans\", 9, \"Regular/Italic Class\", 0, 1050 },\n    { \"DejaVu Sans\", 12, \"Regular Class\", 'l', 975 },\n    { \"DejaVu Sans\", 12, \"Regular Class\", 'i', 975 },\n    { \"DejaVu Sans\", 12, \"Regular Class\", 'j', 975 },\n    { \"DejaVu Sans\", 13, \"Regular Class\", 'l', 950 },\n    { \"DejaVu Sans\", 13, \"Regular Class\", 'i', 950 },\n    { \"DejaVu Sans\", 13, \"Regular Class\", 'j', 950 },\n    { \"DejaVu Sans\", 10, \"Regular/Italic Class\", 0, 1100 },\n    { \"DejaVu Sans\", 12, \"Regular/Italic Class\", 0, 1050 },\n    { \"Georgia\", 10, \"\", 0, 1050 },\n    { \"Georgia\", 11, \"\", 0, 1100 },\n    { \"Georgia\", 12, \"\", 0, 1025 },\n    { \"Georgia\", 13, \"\", 0, 1050 },\n    { \"Georgia\", 16, \"\", 0, 1050 },\n    { \"Georgia\", 17, \"\", 0, 1030 },\n    { \"Liberation Sans\", 12, \"Regular Class\", 'm', 1100 },\n    { \"Lucida Grande\", 11, \"Regular Class\", 'm', 1100 },\n    { \"Microsoft Sans Serif\", 11, \"Regular Class\", 'm', 950 },\n    { \"Microsoft Sans Serif\", 12, \"Regular Class\", 'm', 1050 },\n    { \"Segoe UI\", 12, \"Regular Class\", 'H', 1050 },\n    { \"Segoe UI\", 12, \"Regular Class\", 'm', 1050 },\n    { \"Segoe UI\", 14, \"Regular Class\", 'm', 1050 },\n    { \"Tahoma\", 11, \"Regular Class\", 'i', 975 },\n    { \"Tahoma\", 11, \"Regular Class\", 'l', 975 },\n    { \"Tahoma\", 11, \"Regular Class\", 'j', 900 },\n    { \"Tahoma\", 11, \"Regular Class\", 'm', 918 },\n    { \"Verdana\", 10, \"Regular/Italic Class\", 0, 1100 },\n    { \"Verdana\", 12, \"Regular Class\", 'm', 975 },\n    { \"Verdana\", 12, \"Regular/Italic Class\", 0, 1050 },\n    { \"Verdana\", 13, \"Regular/Italic Class\", 'i', 950 },\n    { \"Verdana\", 13, \"Regular/Italic Class\", 'j', 950 },\n    { \"Verdana\", 13, \"Regular/Italic Class\", 'l', 950 },\n    { \"Verdana\", 16, \"Regular Class\", 0, 1050 },\n    { \"Verdana\", 9, \"Regular/Italic Class\", 0, 1050 },\n    { \"Times New Roman\", 16, \"Regular Class\", 'm', 918 },\n    { \"Trebuchet MS\", 11, \"Regular Class\", 'm', 800 },\n    { \"Trebuchet MS\", 12, \"Regular Class\", 'm', 800 },\n  };\n\n#else\n\n#define COMPATIBLE_WIDTHS_RULES_SIZE  1\n\n  static const SPH_TweakRule  COMPATIBLE_WIDTHS_Rules\n                              [COMPATIBLE_WIDTHS_RULES_SIZE] =\n  {\n    { \"-\", 0, \"\", 0 },\n  };\n\n\n#define X_SCALING_RULES_SIZE  1\n\n  static const SPH_ScaleRule  X_SCALING_Rules\n                              [X_SCALING_RULES_SIZE] =\n  {\n    { \"-\", 0, \"\", 0, 1000 },\n  };\n\n#endif /* FORCE_NATURAL_WIDTHS */\n\n\n  FT_LOCAL_DEF( FT_Bool )\n  is_member_of_family_class( const FT_String*  detected_font_name,\n                             const FT_String*  rule_font_name )\n  {\n    FT_UInt  i, j;\n\n\n    /* Does font name match rule family? */\n    if ( strcmp( detected_font_name, rule_font_name ) == 0 )\n      return TRUE;\n\n    /* Is font name a wildcard \"\"? */\n    if ( strcmp( rule_font_name, \"\" ) == 0 )\n      return TRUE;\n\n    /* Is font name contained in a class list? */\n    for ( i = 0; i < FAMILY_CLASS_RULES_SIZE; i++ )\n    {\n      if ( strcmp( FAMILY_CLASS_Rules[i].name, rule_font_name ) == 0 )\n      {\n        for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ )\n        {\n          if ( strcmp( FAMILY_CLASS_Rules[i].member[j], \"\" ) == 0 )\n            continue;\n          if ( strcmp( FAMILY_CLASS_Rules[i].member[j],\n                       detected_font_name ) == 0 )\n            return TRUE;\n        }\n      }\n    }\n\n    return FALSE;\n  }\n\n\n  FT_LOCAL_DEF( FT_Bool )\n  is_member_of_style_class( const FT_String*  detected_font_style,\n                            const FT_String*  rule_font_style )\n  {\n    FT_UInt  i, j;\n\n\n    /* Does font style match rule style? */\n    if ( strcmp( detected_font_style, rule_font_style ) == 0 )\n      return TRUE;\n\n    /* Is font style a wildcard \"\"? */\n    if ( strcmp( rule_font_style, \"\" ) == 0 )\n      return TRUE;\n\n    /* Is font style contained in a class list? */\n    for ( i = 0; i < STYLE_CLASS_RULES_SIZE; i++ )\n    {\n      if ( strcmp( STYLE_CLASS_Rules[i].name, rule_font_style ) == 0 )\n      {\n        for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ )\n        {\n          if ( strcmp( STYLE_CLASS_Rules[i].member[j], \"\" ) == 0 )\n            continue;\n          if ( strcmp( STYLE_CLASS_Rules[i].member[j],\n                       detected_font_style ) == 0 )\n            return TRUE;\n        }\n      }\n    }\n\n    return FALSE;\n  }\n\n\n  FT_LOCAL_DEF( FT_Bool )\n  sph_test_tweak( TT_Face               face,\n                  const FT_String*      family,\n                  FT_UInt               ppem,\n                  const FT_String*      style,\n                  FT_UInt               glyph_index,\n                  const SPH_TweakRule*  rule,\n                  FT_UInt               num_rules )\n  {\n    FT_UInt  i;\n\n\n    /* rule checks may be able to be optimized further */\n    for ( i = 0; i < num_rules; i++ )\n    {\n      if ( family                                                   &&\n           ( is_member_of_family_class ( family, rule[i].family ) ) )\n        if ( rule[i].ppem == 0    ||\n             rule[i].ppem == ppem )\n          if ( style                                             &&\n               is_member_of_style_class ( style, rule[i].style ) )\n            if ( rule[i].glyph == 0                                ||\n                 FT_Get_Char_Index( (FT_Face)face,\n                                    rule[i].glyph ) == glyph_index )\n        return TRUE;\n    }\n\n    return FALSE;\n  }\n\n\n  static FT_UInt\n  scale_test_tweak( TT_Face               face,\n                    const FT_String*      family,\n                    FT_UInt               ppem,\n                    const FT_String*      style,\n                    FT_UInt               glyph_index,\n                    const SPH_ScaleRule*  rule,\n                    FT_UInt               num_rules )\n  {\n    FT_UInt  i;\n\n\n    /* rule checks may be able to be optimized further */\n    for ( i = 0; i < num_rules; i++ )\n    {\n      if ( family                                                   &&\n           ( is_member_of_family_class ( family, rule[i].family ) ) )\n        if ( rule[i].ppem == 0    ||\n             rule[i].ppem == ppem )\n          if ( style                                            &&\n               is_member_of_style_class( style, rule[i].style ) )\n            if ( rule[i].glyph == 0                                ||\n                 FT_Get_Char_Index( (FT_Face)face,\n                                    rule[i].glyph ) == glyph_index )\n        return rule[i].scale;\n    }\n\n    return 1000;\n  }\n\n\n  FT_LOCAL_DEF( FT_UInt )\n  sph_test_tweak_x_scaling( TT_Face           face,\n                            const FT_String*  family,\n                            FT_UInt           ppem,\n                            const FT_String*  style,\n                            FT_UInt           glyph_index )\n  {\n    return scale_test_tweak( face, family, ppem, style, glyph_index,\n                             X_SCALING_Rules, X_SCALING_RULES_SIZE );\n  }\n\n\n#define TWEAK_RULES( x )                                       \\\n  if ( sph_test_tweak( face, family, ppem, style, glyph_index, \\\n                       x##_Rules, x##_RULES_SIZE ) )           \\\n    loader->exec->sph_tweak_flags |= SPH_TWEAK_##x;\n\n#define TWEAK_RULES_EXCEPTIONS( x )                                        \\\n  if ( sph_test_tweak( face, family, ppem, style, glyph_index,             \\\n                       x##_Rules_Exceptions, x##_RULES_EXCEPTIONS_SIZE ) ) \\\n    loader->exec->sph_tweak_flags &= ~SPH_TWEAK_##x;\n\n\n  FT_LOCAL_DEF( void )\n  sph_set_tweaks( TT_Loader  loader,\n                  FT_UInt    glyph_index )\n  {\n    TT_Face     face   = (TT_Face)loader->face;\n    FT_String*  family = face->root.family_name;\n    int         ppem   = loader->size->metrics.x_ppem;\n    FT_String*  style  = face->root.style_name;\n\n\n    /* don't apply rules if style isn't set */\n    if ( !face->root.style_name )\n      return;\n\n#ifdef SPH_DEBUG_MORE_VERBOSE\n    printf( \"%s,%d,%s,%c=%d \",\n            family, ppem, style, glyph_index, glyph_index );\n#endif\n\n    TWEAK_RULES( PIXEL_HINTING );\n\n    if ( loader->exec->sph_tweak_flags & SPH_TWEAK_PIXEL_HINTING )\n    {\n      loader->exec->ignore_x_mode = FALSE;\n      return;\n    }\n\n    TWEAK_RULES( ALLOW_X_DMOVE );\n    TWEAK_RULES( ALWAYS_DO_DELTAP );\n    TWEAK_RULES( ALWAYS_SKIP_DELTAP );\n    TWEAK_RULES( DEEMBOLDEN );\n    TWEAK_RULES( DO_SHPIX );\n    TWEAK_RULES( EMBOLDEN );\n    TWEAK_RULES( MIAP_HACK );\n    TWEAK_RULES( NORMAL_ROUND );\n    TWEAK_RULES( NO_ALIGNRP_AFTER_IUP );\n    TWEAK_RULES( NO_CALL_AFTER_IUP );\n    TWEAK_RULES( NO_DELTAP_AFTER_IUP );\n    TWEAK_RULES( RASTERIZER_35 );\n    TWEAK_RULES( SKIP_IUP );\n\n    TWEAK_RULES( SKIP_OFFPIXEL_Y_MOVES );\n    TWEAK_RULES_EXCEPTIONS( SKIP_OFFPIXEL_Y_MOVES );\n\n    TWEAK_RULES( SKIP_NONPIXEL_Y_MOVES_DELTAP );\n\n    TWEAK_RULES( SKIP_NONPIXEL_Y_MOVES );\n    TWEAK_RULES_EXCEPTIONS( SKIP_NONPIXEL_Y_MOVES );\n\n    TWEAK_RULES( ROUND_NONPIXEL_Y_MOVES );\n    TWEAK_RULES_EXCEPTIONS( ROUND_NONPIXEL_Y_MOVES );\n\n    if ( loader->exec->sph_tweak_flags & SPH_TWEAK_RASTERIZER_35 )\n    {\n      if ( loader->exec->rasterizer_version != TT_INTERPRETER_VERSION_35 )\n      {\n        loader->exec->rasterizer_version = TT_INTERPRETER_VERSION_35;\n        loader->exec->size->cvt_ready    = FALSE;\n\n        tt_size_ready_bytecode(\n          loader->exec->size,\n          FT_BOOL( loader->load_flags & FT_LOAD_PEDANTIC ) );\n      }\n      else\n        loader->exec->rasterizer_version = TT_INTERPRETER_VERSION_35;\n    }\n    else\n    {\n      if ( loader->exec->rasterizer_version  !=\n           SPH_OPTION_SET_RASTERIZER_VERSION )\n      {\n        loader->exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;\n        loader->exec->size->cvt_ready    = FALSE;\n\n        tt_size_ready_bytecode(\n          loader->exec->size,\n          FT_BOOL( loader->load_flags & FT_LOAD_PEDANTIC ) );\n      }\n      else\n        loader->exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;\n    }\n\n    if ( IS_HINTED( loader->load_flags ) )\n    {\n      TWEAK_RULES( TIMES_NEW_ROMAN_HACK );\n      TWEAK_RULES( COURIER_NEW_2_HACK );\n    }\n\n    if ( sph_test_tweak( face, family, ppem, style, glyph_index,\n           COMPATIBILITY_MODE_Rules, COMPATIBILITY_MODE_RULES_SIZE ) )\n      loader->exec->face->sph_compatibility_mode = TRUE;\n\n\n    if ( IS_HINTED( loader->load_flags ) )\n    {\n      if ( sph_test_tweak( face, family, ppem, style, glyph_index,\n             COMPATIBLE_WIDTHS_Rules, COMPATIBLE_WIDTHS_RULES_SIZE ) )\n        loader->exec->compatible_widths |= TRUE;\n    }\n  }\n\n#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n  /* ANSI C doesn't like empty source files */\n  typedef int  _tt_subpix_dummy;\n\n#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttsubpix.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttsubpix.h                                                             */\n/*                                                                         */\n/*    TrueType Subpixel Hinting.                                           */\n/*                                                                         */\n/*  Copyright 2010-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTSUBPIX_H__\n#define __TTSUBPIX_H__\n\n#include \"../../include/ft2build.h\"\n#include \"ttobjs.h\"\n#include \"ttinterp.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ID flags to identify special functions at FDEF and runtime.           */\n  /*                                                                       */\n  /*                                                                       */\n#define SPH_FDEF_INLINE_DELTA_1       0x0000001\n#define SPH_FDEF_INLINE_DELTA_2       0x0000002\n#define SPH_FDEF_DIAGONAL_STROKE      0x0000004\n#define SPH_FDEF_VACUFORM_ROUND_1     0x0000008\n#define SPH_FDEF_TTFAUTOHINT_1        0x0000010\n#define SPH_FDEF_SPACING_1            0x0000020\n#define SPH_FDEF_SPACING_2            0x0000040\n#define SPH_FDEF_TYPEMAN_STROKES      0x0000080\n#define SPH_FDEF_TYPEMAN_DIAGENDCTRL  0x0000100\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Tweak flags that are set for each glyph by the below rules.           */\n  /*                                                                       */\n  /*                                                                       */\n#define SPH_TWEAK_ALLOW_X_DMOVE                   0x0000001\n#define SPH_TWEAK_ALWAYS_DO_DELTAP                0x0000002\n#define SPH_TWEAK_ALWAYS_SKIP_DELTAP              0x0000004\n#define SPH_TWEAK_COURIER_NEW_2_HACK              0x0000008\n#define SPH_TWEAK_DEEMBOLDEN                      0x0000010\n#define SPH_TWEAK_DO_SHPIX                        0x0000020\n#define SPH_TWEAK_EMBOLDEN                        0x0000040\n#define SPH_TWEAK_MIAP_HACK                       0x0000080\n#define SPH_TWEAK_NORMAL_ROUND                    0x0000100\n#define SPH_TWEAK_NO_ALIGNRP_AFTER_IUP            0x0000200\n#define SPH_TWEAK_NO_CALL_AFTER_IUP               0x0000400\n#define SPH_TWEAK_NO_DELTAP_AFTER_IUP             0x0000800\n#define SPH_TWEAK_PIXEL_HINTING                   0x0001000\n#define SPH_TWEAK_RASTERIZER_35                   0x0002000\n#define SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES          0x0004000\n#define SPH_TWEAK_SKIP_IUP                        0x0008000\n#define SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES           0x0010000\n#define SPH_TWEAK_SKIP_OFFPIXEL_Y_MOVES           0x0020000\n#define SPH_TWEAK_TIMES_NEW_ROMAN_HACK            0x0040000\n#define SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP    0x0080000\n\n\n  FT_LOCAL( FT_Bool )\n  sph_test_tweak( TT_Face               face,\n                  const FT_String*      family,\n                  FT_UInt               ppem,\n                  const FT_String*      style,\n                  FT_UInt               glyph_index,\n                  const SPH_TweakRule*  rule,\n                  FT_UInt               num_rules );\n\n  FT_LOCAL( FT_UInt )\n  sph_test_tweak_x_scaling( TT_Face           face,\n                            const FT_String*  family,\n                            FT_UInt           ppem,\n                            const FT_String*  style,\n                            FT_UInt           glyph_index );\n\n  FT_LOCAL( void )\n  sph_set_tweaks( TT_Loader  loader,\n                  FT_UInt    glyph_index );\n\n\n  /* These macros are defined absent a method for setting them */\n#define SPH_OPTION_BITMAP_WIDTHS           FALSE\n#define SPH_OPTION_SET_SUBPIXEL            TRUE\n#define SPH_OPTION_SET_GRAYSCALE           FALSE\n#define SPH_OPTION_SET_COMPATIBLE_WIDTHS   FALSE\n#define SPH_OPTION_SET_RASTERIZER_VERSION  38\n\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n\nFT_END_HEADER\n\n#endif /* __TTSUBPIX_H__ */\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/type1/Jamfile",
    "content": "# FreeType 2 src/type1 Jamfile\n#\n# Copyright 2001 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) type1 ;\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = t1afm t1driver t1objs t1load t1gload t1parse ;\n  }\n  else\n  {\n    _sources = type1 ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/type1 Jamfile\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/type1/fxft_type1.c",
    "content": "#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501\n/***************************************************************************/\n/*                                                                         */\n/*  type1.c                                                                */\n/*                                                                         */\n/*    FreeType Type 1 driver component (body only).                        */\n/*                                                                         */\n/*  Copyright 1996-2001 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n#define FT2_BUILD_LIBRARY\n\n#include \"../../include/ft2build.h\"\n#include \"t1parse.c\"\n#include \"t1load.c\"\n#include \"t1objs.c\"\n#include \"t1driver.c\"\n#include \"t1gload.c\"\n\n#ifndef T1_CONFIG_OPTION_NO_AFM\n#include \"t1afm.c\"\n#endif\n\n\n/* END */\n#endif\n\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1afm.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1afm.c                                                                */\n/*                                                                         */\n/*    AFM support for Type 1 fonts (body).                                 */\n/*                                                                         */\n/*  Copyright 1996-2011, 2013 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"t1afm.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/internal/psaux.h\"\n#include \"t1errors.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_t1afm\n\n\n  FT_LOCAL_DEF( void )\n  T1_Done_Metrics( FT_Memory     memory,\n                   AFM_FontInfo  fi )\n  {\n    FT_FREE( fi->KernPairs );\n    fi->NumKernPair = 0;\n\n    FT_FREE( fi->TrackKerns );\n    fi->NumTrackKern = 0;\n\n    FT_FREE( fi );\n  }\n\n\n  /* read a glyph name and return the equivalent glyph index */\n  static FT_Int\n  t1_get_index( const char*  name,\n                FT_Offset    len,\n                void*        user_data )\n  {\n    T1_Font  type1 = (T1_Font)user_data;\n    FT_Int   n;\n\n\n    /* PS string/name length must be < 16-bit */\n    if ( len > 0xFFFFU )\n      return 0;\n\n    for ( n = 0; n < type1->num_glyphs; n++ )\n    {\n      char*  gname = (char*)type1->glyph_names[n];\n\n\n      if ( gname && gname[0] == name[0]        &&\n           ft_strlen( gname ) == len           &&\n           ft_strncmp( gname, name, len ) == 0 )\n        return n;\n    }\n\n    return 0;\n  }\n\n\n#undef  KERN_INDEX\n#define KERN_INDEX( g1, g2 )  ( ( (FT_ULong)(g1) << 16 ) | (g2) )\n\n\n  /* compare two kerning pairs */\n  FT_CALLBACK_DEF( int )\n  compare_kern_pairs( const void*  a,\n                      const void*  b )\n  {\n    AFM_KernPair  pair1 = (AFM_KernPair)a;\n    AFM_KernPair  pair2 = (AFM_KernPair)b;\n\n    FT_ULong  index1 = KERN_INDEX( pair1->index1, pair1->index2 );\n    FT_ULong  index2 = KERN_INDEX( pair2->index1, pair2->index2 );\n\n\n    if ( index1 > index2 )\n      return 1;\n    else if ( index1 < index2 )\n      return -1;\n    else\n      return 0;\n  }\n\n\n  /* parse a PFM file -- for now, only read the kerning pairs */\n  static FT_Error\n  T1_Read_PFM( FT_Face       t1_face,\n               FT_Stream     stream,\n               AFM_FontInfo  fi )\n  {\n    FT_Error      error  = FT_Err_Ok;\n    FT_Memory     memory = stream->memory;\n    FT_Byte*      start;\n    FT_Byte*      limit;\n    FT_Byte*      p;\n    AFM_KernPair  kp;\n    FT_Int        width_table_length;\n    FT_CharMap    oldcharmap;\n    FT_CharMap    charmap;\n    FT_Int        n;\n\n\n    start = (FT_Byte*)stream->cursor;\n    limit = (FT_Byte*)stream->limit;\n\n    /* Figure out how long the width table is.          */\n    /* This info is a little-endian short at offset 99. */\n    p = start + 99;\n    if ( p + 2 > limit )\n    {\n      error = FT_THROW( Unknown_File_Format );\n      goto Exit;\n    }\n    width_table_length = FT_PEEK_USHORT_LE( p );\n\n    p += 18 + width_table_length;\n    if ( p + 0x12 > limit || FT_PEEK_USHORT_LE( p ) < 0x12 )\n      /* extension table is probably optional */\n      goto Exit;\n\n    /* Kerning offset is 14 bytes from start of extensions table. */\n    p += 14;\n    p = start + FT_PEEK_ULONG_LE( p );\n\n    if ( p == start )\n      /* zero offset means no table */\n      goto Exit;\n\n    if ( p + 2 > limit )\n    {\n      error = FT_THROW( Unknown_File_Format );\n      goto Exit;\n    }\n\n    fi->NumKernPair = FT_PEEK_USHORT_LE( p );\n    p += 2;\n    if ( p + 4 * fi->NumKernPair > limit )\n    {\n      error = FT_THROW( Unknown_File_Format );\n      goto Exit;\n    }\n\n    /* Actually, kerning pairs are simply optional! */\n    if ( fi->NumKernPair == 0 )\n      goto Exit;\n\n    /* allocate the pairs */\n    if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) )\n      goto Exit;\n\n    /* now, read each kern pair */\n    kp             = fi->KernPairs;\n    limit          = p + 4 * fi->NumKernPair;\n\n    /* PFM kerning data are stored by encoding rather than glyph index, */\n    /* so find the PostScript charmap of this font and install it       */\n    /* temporarily.  If we find no PostScript charmap, then just use    */\n    /* the default and hope it is the right one.                        */\n    oldcharmap = t1_face->charmap;\n    charmap    = NULL;\n\n    for ( n = 0; n < t1_face->num_charmaps; n++ )\n    {\n      charmap = t1_face->charmaps[n];\n      /* check against PostScript pseudo platform */\n      if ( charmap->platform_id == 7 )\n      {\n        error = FT_Set_Charmap( t1_face, charmap );\n        if ( error )\n          goto Exit;\n        break;\n      }\n    }\n\n    /* Kerning info is stored as:             */\n    /*                                        */\n    /*   encoding of first glyph (1 byte)     */\n    /*   encoding of second glyph (1 byte)    */\n    /*   offset (little-endian short)         */\n    for ( ; p < limit ; p += 4 )\n    {\n      kp->index1 = FT_Get_Char_Index( t1_face, p[0] );\n      kp->index2 = FT_Get_Char_Index( t1_face, p[1] );\n\n      kp->x = (FT_Int)FT_PEEK_SHORT_LE(p + 2);\n      kp->y = 0;\n\n      kp++;\n    }\n\n    if ( oldcharmap != NULL )\n      error = FT_Set_Charmap( t1_face, oldcharmap );\n    if ( error )\n      goto Exit;\n\n    /* now, sort the kern pairs according to their glyph indices */\n    ft_qsort( fi->KernPairs, fi->NumKernPair, sizeof ( AFM_KernPairRec ),\n              compare_kern_pairs );\n\n  Exit:\n    if ( error )\n    {\n      FT_FREE( fi->KernPairs );\n      fi->NumKernPair = 0;\n    }\n\n    return error;\n  }\n\n\n  /* parse a metrics file -- either AFM or PFM depending on what */\n  /* it turns out to be                                          */\n  FT_LOCAL_DEF( FT_Error )\n  T1_Read_Metrics( FT_Face    t1_face,\n                   FT_Stream  stream )\n  {\n    PSAux_Service  psaux;\n    FT_Memory      memory  = stream->memory;\n    AFM_ParserRec  parser;\n    AFM_FontInfo   fi      = NULL;\n    FT_Error       error   = FT_ERR( Unknown_File_Format );\n    T1_Font        t1_font = &( (T1_Face)t1_face )->type1;\n\n\n    if ( FT_NEW( fi )                   ||\n         FT_FRAME_ENTER( stream->size ) )\n      goto Exit;\n\n    fi->FontBBox  = t1_font->font_bbox;\n    fi->Ascender  = t1_font->font_bbox.yMax;\n    fi->Descender = t1_font->font_bbox.yMin;\n\n    psaux = (PSAux_Service)( (T1_Face)t1_face )->psaux;\n    if ( psaux->afm_parser_funcs )\n    {\n      error = psaux->afm_parser_funcs->init( &parser,\n                                             stream->memory,\n                                             stream->cursor,\n                                             stream->limit );\n\n      if ( !error )\n      {\n        parser.FontInfo  = fi;\n        parser.get_index = t1_get_index;\n        parser.user_data = t1_font;\n\n        error = psaux->afm_parser_funcs->parse( &parser );\n        psaux->afm_parser_funcs->done( &parser );\n      }\n    }\n\n    if ( FT_ERR_EQ( error, Unknown_File_Format ) )\n    {\n      FT_Byte*  start = stream->cursor;\n\n\n      /* MS Windows allows versions up to 0x3FF without complaining */\n      if ( stream->size > 6                              &&\n           start[1] < 4                                  &&\n           FT_PEEK_ULONG_LE( start + 2 ) == stream->size )\n        error = T1_Read_PFM( t1_face, stream, fi );\n    }\n\n    if ( !error )\n    {\n      t1_font->font_bbox = fi->FontBBox;\n\n      t1_face->bbox.xMin =   fi->FontBBox.xMin            >> 16;\n      t1_face->bbox.yMin =   fi->FontBBox.yMin            >> 16;\n      /* no `U' suffix here to 0xFFFF! */\n      t1_face->bbox.xMax = ( fi->FontBBox.xMax + 0xFFFF ) >> 16;\n      t1_face->bbox.yMax = ( fi->FontBBox.yMax + 0xFFFF ) >> 16;\n\n      /* no `U' suffix here to 0x8000! */\n      t1_face->ascender  = (FT_Short)( ( fi->Ascender  + 0x8000 ) >> 16 );\n      t1_face->descender = (FT_Short)( ( fi->Descender + 0x8000 ) >> 16 );\n\n      if ( fi->NumKernPair )\n      {\n        t1_face->face_flags |= FT_FACE_FLAG_KERNING;\n        ( (T1_Face)t1_face )->afm_data = fi;\n        fi = NULL;\n      }\n    }\n\n    FT_FRAME_EXIT();\n\n  Exit:\n    if ( fi != NULL )\n      T1_Done_Metrics( memory, fi );\n\n    return error;\n  }\n\n\n  /* find the kerning for a given glyph pair */\n  FT_LOCAL_DEF( void )\n  T1_Get_Kerning( AFM_FontInfo  fi,\n                  FT_UInt       glyph1,\n                  FT_UInt       glyph2,\n                  FT_Vector*    kerning )\n  {\n    AFM_KernPair  min, mid, max;\n    FT_ULong      idx = KERN_INDEX( glyph1, glyph2 );\n\n\n    /* simple binary search */\n    min = fi->KernPairs;\n    max = min + fi->NumKernPair - 1;\n\n    while ( min <= max )\n    {\n      FT_ULong  midi;\n\n\n      mid  = min + ( max - min ) / 2;\n      midi = KERN_INDEX( mid->index1, mid->index2 );\n\n      if ( midi == idx )\n      {\n        kerning->x = mid->x;\n        kerning->y = mid->y;\n\n        return;\n      }\n\n      if ( midi < idx )\n        min = mid + 1;\n      else\n        max = mid - 1;\n    }\n\n    kerning->x = 0;\n    kerning->y = 0;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Get_Track_Kerning( FT_Face    face,\n                        FT_Fixed   ptsize,\n                        FT_Int     degree,\n                        FT_Fixed*  kerning )\n  {\n    AFM_FontInfo  fi = (AFM_FontInfo)( (T1_Face)face )->afm_data;\n    FT_Int        i;\n\n\n    if ( !fi )\n      return FT_THROW( Invalid_Argument );\n\n    for ( i = 0; i < fi->NumTrackKern; i++ )\n    {\n      AFM_TrackKern  tk = fi->TrackKerns + i;\n\n\n      if ( tk->degree != degree )\n        continue;\n\n      if ( ptsize < tk->min_ptsize )\n        *kerning = tk->min_kern;\n      else if ( ptsize > tk->max_ptsize )\n        *kerning = tk->max_kern;\n      else\n      {\n        *kerning = FT_MulDiv( ptsize - tk->min_ptsize,\n                              tk->max_kern - tk->min_kern,\n                              tk->max_ptsize - tk->min_ptsize ) +\n                   tk->min_kern;\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1afm.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1afm.h                                                                */\n/*                                                                         */\n/*    AFM support for Type 1 fonts (specification).                        */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2006 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __T1AFM_H__\n#define __T1AFM_H__\n\n#include \"../../include/ft2build.h\"\n#include \"t1objs.h\"\n#include \"../../include/freetype/internal/t1types.h\"\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( FT_Error )\n  T1_Read_Metrics( FT_Face    face,\n                   FT_Stream  stream );\n\n  FT_LOCAL( void )\n  T1_Done_Metrics( FT_Memory     memory,\n                   AFM_FontInfo  fi );\n\n  FT_LOCAL( void )\n  T1_Get_Kerning( AFM_FontInfo  fi,\n                  FT_UInt       glyph1,\n                  FT_UInt       glyph2,\n                  FT_Vector*    kerning );\n\n  FT_LOCAL( FT_Error )\n  T1_Get_Track_Kerning( FT_Face    face,\n                        FT_Fixed   ptsize,\n                        FT_Int     degree,\n                        FT_Fixed*  kerning );\n\nFT_END_HEADER\n\n#endif /* __T1AFM_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1driver.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1driver.c                                                             */\n/*                                                                         */\n/*    Type 1 driver interface (body).                                      */\n/*                                                                         */\n/*  Copyright 1996-2004, 2006, 2007, 2009, 2011, 2013 by                   */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"t1driver.h\"\n#include \"t1gload.h\"\n#include \"t1load.h\"\n\n#include \"t1errors.h\"\n\n#ifndef T1_CONFIG_OPTION_NO_AFM\n#include \"t1afm.h\"\n#endif\n\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n\n#include \"../../include/freetype/internal/services/svmm.h\"\n#include \"../../include/freetype/internal/services/svgldict.h\"\n#include \"../../include/freetype/internal/services/svxf86nm.h\"\n#include \"../../include/freetype/internal/services/svpostnm.h\"\n#include \"../../include/freetype/internal/services/svpscmap.h\"\n#include \"../../include/freetype/internal/services/svpsinfo.h\"\n#include \"../../include/freetype/internal/services/svkern.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_t1driver\n\n /*\n  *  GLYPH DICT SERVICE\n  *\n  */\n\n  static FT_Error\n  t1_get_glyph_name( T1_Face     face,\n                     FT_UInt     glyph_index,\n                     FT_Pointer  buffer,\n                     FT_UInt     buffer_max )\n  {\n    FT_STRCPYN( buffer, face->type1.glyph_names[glyph_index], buffer_max );\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_UInt\n  t1_get_name_index( T1_Face     face,\n                     FT_String*  glyph_name )\n  {\n    FT_Int  i;\n\n\n    for ( i = 0; i < face->type1.num_glyphs; i++ )\n    {\n      FT_String*  gname = face->type1.glyph_names[i];\n\n\n      if ( !ft_strcmp( glyph_name, gname ) )\n        return (FT_UInt)i;\n    }\n\n    return 0;\n  }\n\n\n  static const FT_Service_GlyphDictRec  t1_service_glyph_dict =\n  {\n    (FT_GlyphDict_GetNameFunc)  t1_get_glyph_name,\n    (FT_GlyphDict_NameIndexFunc)t1_get_name_index\n  };\n\n\n  /*\n   *  POSTSCRIPT NAME SERVICE\n   *\n   */\n\n  static const char*\n  t1_get_ps_name( T1_Face  face )\n  {\n    return (const char*) face->type1.font_name;\n  }\n\n\n  static const FT_Service_PsFontNameRec  t1_service_ps_name =\n  {\n    (FT_PsName_GetFunc)t1_get_ps_name\n  };\n\n\n  /*\n   *  MULTIPLE MASTERS SERVICE\n   *\n   */\n\n#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT\n  static const FT_Service_MultiMastersRec  t1_service_multi_masters =\n  {\n    (FT_Get_MM_Func)        T1_Get_Multi_Master,\n    (FT_Set_MM_Design_Func) T1_Set_MM_Design,\n    (FT_Set_MM_Blend_Func)  T1_Set_MM_Blend,\n    (FT_Get_MM_Var_Func)    T1_Get_MM_Var,\n    (FT_Set_Var_Design_Func)T1_Set_Var_Design\n  };\n#endif\n\n\n  /*\n   *  POSTSCRIPT INFO SERVICE\n   *\n   */\n\n  static FT_Error\n  t1_ps_get_font_info( FT_Face          face,\n                       PS_FontInfoRec*  afont_info )\n  {\n    *afont_info = ((T1_Face)face)->type1.font_info;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_Error\n  t1_ps_get_font_extra( FT_Face           face,\n                        PS_FontExtraRec*  afont_extra )\n  {\n    *afont_extra = ((T1_Face)face)->type1.font_extra;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_Int\n  t1_ps_has_glyph_names( FT_Face  face )\n  {\n    FT_UNUSED( face );\n\n    return 1;\n  }\n\n\n  static FT_Error\n  t1_ps_get_font_private( FT_Face         face,\n                          PS_PrivateRec*  afont_private )\n  {\n    *afont_private = ((T1_Face)face)->type1.private_dict;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_Long\n  t1_ps_get_font_value( FT_Face       face,\n                        PS_Dict_Keys  key,\n                        FT_UInt       idx,\n                        void         *value,\n                        FT_Long       value_len )\n  {\n    FT_Long  retval = -1;\n    T1_Face  t1face = (T1_Face)face;\n    T1_Font  type1  = &t1face->type1;\n\n\n    switch ( key )\n    {\n    case PS_DICT_FONT_TYPE:\n      retval = sizeof ( type1->font_type );\n      if ( value && value_len >= retval )\n        *((FT_Byte *)value) = type1->font_type;\n      break;\n\n    case PS_DICT_FONT_MATRIX:\n      if ( idx < sizeof ( type1->font_matrix ) /\n                   sizeof ( type1->font_matrix.xx ) )\n      {\n        FT_Fixed  val = 0;\n\n\n        retval = sizeof ( val );\n        if ( value && value_len >= retval )\n        {\n          switch ( idx )\n          {\n          case 0:\n            val = type1->font_matrix.xx;\n            break;\n          case 1:\n            val = type1->font_matrix.xy;\n            break;\n          case 2:\n            val = type1->font_matrix.yx;\n            break;\n          case 3:\n            val = type1->font_matrix.yy;\n            break;\n          }\n          *((FT_Fixed *)value) = val;\n        }\n      }\n      break;\n\n    case PS_DICT_FONT_BBOX:\n      if ( idx < sizeof ( type1->font_bbox ) /\n                   sizeof ( type1->font_bbox.xMin ) )\n      {\n        FT_Fixed val = 0;\n\n\n        retval = sizeof ( val );\n        if ( value && value_len >= retval )\n        {\n          switch ( idx )\n          {\n          case 0:\n            val = type1->font_bbox.xMin;\n            break;\n          case 1:\n            val = type1->font_bbox.yMin;\n            break;\n          case 2:\n            val = type1->font_bbox.xMax;\n            break;\n          case 3:\n            val = type1->font_bbox.yMax;\n            break;\n          }\n          *((FT_Fixed *)value) = val;\n        }\n      }\n      break;\n\n    case PS_DICT_PAINT_TYPE:\n      retval = sizeof ( type1->paint_type );\n      if ( value && value_len >= retval )\n        *((FT_Byte *)value) = type1->paint_type;\n      break;\n\n    case PS_DICT_FONT_NAME:\n      retval = (FT_Long)( ft_strlen( type1->font_name ) + 1 );\n      if ( value && value_len >= retval )\n        ft_memcpy( value, (void *)( type1->font_name ), retval );\n      break;\n\n    case PS_DICT_UNIQUE_ID:\n      retval = sizeof ( type1->private_dict.unique_id );\n      if ( value && value_len >= retval )\n        *((FT_Int *)value) = type1->private_dict.unique_id;\n      break;\n\n    case PS_DICT_NUM_CHAR_STRINGS:\n      retval = sizeof ( type1->num_glyphs );\n      if ( value && value_len >= retval )\n        *((FT_Int *)value) = type1->num_glyphs;\n      break;\n\n    case PS_DICT_CHAR_STRING_KEY:\n      if ( idx < (FT_UInt)type1->num_glyphs )\n      {\n        retval = (FT_Long)( ft_strlen( type1->glyph_names[idx] ) + 1 );\n        if ( value && value_len >= retval )\n        {\n          ft_memcpy( value, (void *)( type1->glyph_names[idx] ), retval );\n          ((FT_Char *)value)[retval - 1] = (FT_Char)'\\0';\n        }\n      }\n      break;\n\n    case PS_DICT_CHAR_STRING:\n      if ( idx < (FT_UInt)type1->num_glyphs )\n      {\n        retval = (FT_Long)( type1->charstrings_len[idx] + 1 );\n        if ( value && value_len >= retval )\n        {\n          ft_memcpy( value, (void *)( type1->charstrings[idx] ),\n                     retval - 1 );\n          ((FT_Char *)value)[retval - 1] = (FT_Char)'\\0';\n        }\n      }\n      break;\n\n    case PS_DICT_ENCODING_TYPE:\n      retval = sizeof ( type1->encoding_type );\n      if ( value && value_len >= retval )\n        *((T1_EncodingType *)value) = type1->encoding_type;\n      break;\n\n    case PS_DICT_ENCODING_ENTRY:\n      if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY &&\n           idx < (FT_UInt)type1->encoding.num_chars       )\n      {\n        retval = (FT_Long)( ft_strlen( type1->encoding.char_name[idx] ) + 1 );\n        if ( value && value_len >= retval )\n        {\n          ft_memcpy( value, (void *)( type1->encoding.char_name[idx] ),\n                     retval - 1 );\n          ((FT_Char *)value)[retval - 1] = (FT_Char)'\\0';\n        }\n      }\n      break;\n\n    case PS_DICT_NUM_SUBRS:\n      retval = sizeof ( type1->num_subrs );\n      if ( value && value_len >= retval )\n        *((FT_Int *)value) = type1->num_subrs;\n      break;\n\n    case PS_DICT_SUBR:\n      if ( idx < (FT_UInt)type1->num_subrs )\n      {\n        retval = (FT_Long)( type1->subrs_len[idx] + 1 );\n        if ( value && value_len >= retval )\n        {\n          ft_memcpy( value, (void *)( type1->subrs[idx] ), retval - 1 );\n          ((FT_Char *)value)[retval - 1] = (FT_Char)'\\0';\n        }\n      }\n      break;\n\n    case PS_DICT_STD_HW:\n      retval = sizeof ( type1->private_dict.standard_width[0] );\n      if ( value && value_len >= retval )\n        *((FT_UShort *)value) = type1->private_dict.standard_width[0];\n      break;\n\n    case PS_DICT_STD_VW:\n      retval = sizeof ( type1->private_dict.standard_height[0] );\n      if ( value && value_len >= retval )\n        *((FT_UShort *)value) = type1->private_dict.standard_height[0];\n      break;\n\n    case PS_DICT_NUM_BLUE_VALUES:\n      retval = sizeof ( type1->private_dict.num_blue_values );\n      if ( value && value_len >= retval )\n        *((FT_Byte *)value) = type1->private_dict.num_blue_values;\n      break;\n\n    case PS_DICT_BLUE_VALUE:\n      if ( idx < type1->private_dict.num_blue_values )\n      {\n        retval = sizeof ( type1->private_dict.blue_values[idx] );\n        if ( value && value_len >= retval )\n          *((FT_Short *)value) = type1->private_dict.blue_values[idx];\n      }\n      break;\n\n    case PS_DICT_BLUE_SCALE:\n      retval = sizeof ( type1->private_dict.blue_scale );\n      if ( value && value_len >= retval )\n        *((FT_Fixed *)value) = type1->private_dict.blue_scale;\n      break;\n\n    case PS_DICT_BLUE_FUZZ:\n      retval = sizeof ( type1->private_dict.blue_fuzz );\n      if ( value && value_len >= retval )\n        *((FT_Int *)value) = type1->private_dict.blue_fuzz;\n      break;\n\n    case PS_DICT_BLUE_SHIFT:\n      retval = sizeof ( type1->private_dict.blue_shift );\n      if ( value && value_len >= retval )\n        *((FT_Int *)value) = type1->private_dict.blue_shift;\n      break;\n\n    case PS_DICT_NUM_OTHER_BLUES:\n      retval = sizeof ( type1->private_dict.num_other_blues );\n      if ( value && value_len >= retval )\n        *((FT_Byte *)value) = type1->private_dict.num_other_blues;\n      break;\n\n    case PS_DICT_OTHER_BLUE:\n      if ( idx < type1->private_dict.num_other_blues )\n      {\n        retval = sizeof ( type1->private_dict.other_blues[idx] );\n        if ( value && value_len >= retval )\n          *((FT_Short *)value) = type1->private_dict.other_blues[idx];\n      }\n      break;\n\n    case PS_DICT_NUM_FAMILY_BLUES:\n      retval = sizeof ( type1->private_dict.num_family_blues );\n      if ( value && value_len >= retval )\n        *((FT_Byte *)value) = type1->private_dict.num_family_blues;\n      break;\n\n    case PS_DICT_FAMILY_BLUE:\n      if ( idx < type1->private_dict.num_family_blues )\n      {\n        retval = sizeof ( type1->private_dict.family_blues[idx] );\n        if ( value && value_len >= retval )\n          *((FT_Short *)value) = type1->private_dict.family_blues[idx];\n      }\n      break;\n\n    case PS_DICT_NUM_FAMILY_OTHER_BLUES:\n      retval = sizeof ( type1->private_dict.num_family_other_blues );\n      if ( value && value_len >= retval )\n        *((FT_Byte *)value) = type1->private_dict.num_family_other_blues;\n      break;\n\n    case PS_DICT_FAMILY_OTHER_BLUE:\n      if ( idx < type1->private_dict.num_family_other_blues )\n      {\n        retval = sizeof ( type1->private_dict.family_other_blues[idx] );\n        if ( value && value_len >= retval )\n          *((FT_Short *)value) = type1->private_dict.family_other_blues[idx];\n      }\n      break;\n\n    case PS_DICT_NUM_STEM_SNAP_H:\n      retval = sizeof ( type1->private_dict.num_snap_widths );\n      if ( value && value_len >= retval )\n        *((FT_Byte *)value) = type1->private_dict.num_snap_widths;\n      break;\n\n    case PS_DICT_STEM_SNAP_H:\n      if ( idx < type1->private_dict.num_snap_widths )\n      {\n        retval = sizeof ( type1->private_dict.snap_widths[idx] );\n        if ( value && value_len >= retval )\n          *((FT_Short *)value) = type1->private_dict.snap_widths[idx];\n      }\n      break;\n\n    case PS_DICT_NUM_STEM_SNAP_V:\n      retval = sizeof ( type1->private_dict.num_snap_heights );\n      if ( value && value_len >= retval )\n        *((FT_Byte *)value) = type1->private_dict.num_snap_heights;\n      break;\n\n    case PS_DICT_STEM_SNAP_V:\n      if ( idx < type1->private_dict.num_snap_heights )\n      {\n        retval = sizeof ( type1->private_dict.snap_heights[idx] );\n        if ( value && value_len >= retval )\n          *((FT_Short *)value) = type1->private_dict.snap_heights[idx];\n      }\n      break;\n\n    case PS_DICT_RND_STEM_UP:\n      retval = sizeof ( type1->private_dict.round_stem_up );\n      if ( value && value_len >= retval )\n        *((FT_Bool *)value) = type1->private_dict.round_stem_up;\n      break;\n\n    case PS_DICT_FORCE_BOLD:\n      retval = sizeof ( type1->private_dict.force_bold );\n      if ( value && value_len >= retval )\n        *((FT_Bool *)value) = type1->private_dict.force_bold;\n      break;\n\n    case PS_DICT_MIN_FEATURE:\n      if ( idx < sizeof ( type1->private_dict.min_feature ) /\n                   sizeof ( type1->private_dict.min_feature[0] ) )\n      {\n        retval = sizeof ( type1->private_dict.min_feature[idx] );\n        if ( value && value_len >= retval )\n          *((FT_Short *)value) = type1->private_dict.min_feature[idx];\n      }\n      break;\n\n    case PS_DICT_LEN_IV:\n      retval = sizeof ( type1->private_dict.lenIV );\n      if ( value && value_len >= retval )\n        *((FT_Int *)value) = type1->private_dict.lenIV;\n      break;\n\n    case PS_DICT_PASSWORD:\n      retval = sizeof ( type1->private_dict.password );\n      if ( value && value_len >= retval )\n        *((FT_Long *)value) = type1->private_dict.password;\n      break;\n\n    case PS_DICT_LANGUAGE_GROUP:\n      retval = sizeof ( type1->private_dict.language_group );\n      if ( value && value_len >= retval )\n        *((FT_Long *)value) = type1->private_dict.language_group;\n      break;\n\n    case PS_DICT_IS_FIXED_PITCH:\n      retval = sizeof ( type1->font_info.is_fixed_pitch );\n      if ( value && value_len >= retval )\n        *((FT_Bool *)value) = type1->font_info.is_fixed_pitch;\n      break;\n\n    case PS_DICT_UNDERLINE_POSITION:\n      retval = sizeof ( type1->font_info.underline_position );\n      if ( value && value_len >= retval )\n        *((FT_Short *)value) = type1->font_info.underline_position;\n      break;\n\n    case PS_DICT_UNDERLINE_THICKNESS:\n      retval = sizeof ( type1->font_info.underline_thickness );\n      if ( value && value_len >= retval )\n        *((FT_UShort *)value) = type1->font_info.underline_thickness;\n      break;\n\n    case PS_DICT_FS_TYPE:\n      retval = sizeof ( type1->font_extra.fs_type );\n      if ( value && value_len >= retval )\n        *((FT_UShort *)value) = type1->font_extra.fs_type;\n      break;\n\n    case PS_DICT_VERSION:\n      retval = (FT_Long)( ft_strlen( type1->font_info.version ) + 1 );\n      if ( value && value_len >= retval )\n        ft_memcpy( value, (void *)( type1->font_info.version ), retval );\n      break;\n\n    case PS_DICT_NOTICE:\n      retval = (FT_Long)( ft_strlen( type1->font_info.notice ) + 1 );\n      if ( value && value_len >= retval )\n        ft_memcpy( value, (void *)( type1->font_info.notice ), retval );\n      break;\n\n    case PS_DICT_FULL_NAME:\n      retval = (FT_Long)( ft_strlen( type1->font_info.full_name ) + 1 );\n      if ( value && value_len >= retval )\n        ft_memcpy( value, (void *)( type1->font_info.full_name ), retval );\n      break;\n\n    case PS_DICT_FAMILY_NAME:\n      retval = (FT_Long)( ft_strlen( type1->font_info.family_name ) + 1 );\n      if ( value && value_len >= retval )\n        ft_memcpy( value, (void *)( type1->font_info.family_name ), retval );\n      break;\n\n    case PS_DICT_WEIGHT:\n      retval = (FT_Long)( ft_strlen( type1->font_info.weight ) + 1 );\n      if ( value && value_len >= retval )\n        ft_memcpy( value, (void *)( type1->font_info.weight ), retval );\n      break;\n\n    case PS_DICT_ITALIC_ANGLE:\n      retval = sizeof ( type1->font_info.italic_angle );\n      if ( value && value_len >= retval )\n        *((FT_Long *)value) = type1->font_info.italic_angle;\n      break;\n\n    default:\n      break;\n    }\n\n    return retval;\n  }\n\n\n  static const FT_Service_PsInfoRec  t1_service_ps_info =\n  {\n    (PS_GetFontInfoFunc)   t1_ps_get_font_info,\n    (PS_GetFontExtraFunc)  t1_ps_get_font_extra,\n    (PS_HasGlyphNamesFunc) t1_ps_has_glyph_names,\n    (PS_GetFontPrivateFunc)t1_ps_get_font_private,\n    (PS_GetFontValueFunc)  t1_ps_get_font_value,\n  };\n\n\n#ifndef T1_CONFIG_OPTION_NO_AFM\n  static const FT_Service_KerningRec  t1_service_kerning =\n  {\n    T1_Get_Track_Kerning,\n  };\n#endif\n\n\n  /*\n   *  SERVICE LIST\n   *\n   */\n\n  static const FT_ServiceDescRec  t1_services[] =\n  {\n    { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t1_service_ps_name },\n    { FT_SERVICE_ID_GLYPH_DICT,           &t1_service_glyph_dict },\n    { FT_SERVICE_ID_XF86_NAME,            FT_XF86_FORMAT_TYPE_1 },\n    { FT_SERVICE_ID_POSTSCRIPT_INFO,      &t1_service_ps_info },\n\n#ifndef T1_CONFIG_OPTION_NO_AFM\n    { FT_SERVICE_ID_KERNING,              &t1_service_kerning },\n#endif\n\n#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT\n    { FT_SERVICE_ID_MULTI_MASTERS,        &t1_service_multi_masters },\n#endif\n    { NULL, NULL }\n  };\n\n\n  FT_CALLBACK_DEF( FT_Module_Interface )\n  Get_Interface( FT_Module         module,\n                 const FT_String*  t1_interface )\n  {\n    FT_UNUSED( module );\n\n    return ft_service_list_lookup( t1_services, t1_interface );\n  }\n\n\n#ifndef T1_CONFIG_OPTION_NO_AFM\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Get_Kerning                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A driver method used to return the kerning vector between two      */\n  /*    glyphs of the same face.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face        :: A handle to the source face object.                 */\n  /*                                                                       */\n  /*    left_glyph  :: The index of the left glyph in the kern pair.       */\n  /*                                                                       */\n  /*    right_glyph :: The index of the right glyph in the kern pair.      */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    kerning     :: The kerning vector.  This is in font units for      */\n  /*                   scalable formats, and in pixels for fixed-sizes     */\n  /*                   formats.                                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Only horizontal layouts (left-to-right & right-to-left) are        */\n  /*    supported by this function.  Other layouts, or more sophisticated  */\n  /*    kernings are out of scope of this method (the basic driver         */\n  /*    interface is meant to be simple).                                  */\n  /*                                                                       */\n  /*    They can be implemented by format-specific interfaces.             */\n  /*                                                                       */\n  static FT_Error\n  Get_Kerning( FT_Face     t1face,        /* T1_Face */\n               FT_UInt     left_glyph,\n               FT_UInt     right_glyph,\n               FT_Vector*  kerning )\n  {\n    T1_Face  face = (T1_Face)t1face;\n\n\n    kerning->x = 0;\n    kerning->y = 0;\n\n    if ( face->afm_data )\n      T1_Get_Kerning( (AFM_FontInfo)face->afm_data,\n                      left_glyph,\n                      right_glyph,\n                      kerning );\n\n    return FT_Err_Ok;\n  }\n\n\n#endif /* T1_CONFIG_OPTION_NO_AFM */\n\n\n  FT_CALLBACK_TABLE_DEF\n  const FT_Driver_ClassRec  t1_driver_class =\n  {\n    {\n      FT_MODULE_FONT_DRIVER       |\n      FT_MODULE_DRIVER_SCALABLE   |\n      FT_MODULE_DRIVER_HAS_HINTER,\n\n      sizeof ( FT_DriverRec ),\n\n      \"type1\",\n      0x10000L,\n      0x20000L,\n\n      0,   /* format interface */\n\n      T1_Driver_Init,\n      T1_Driver_Done,\n      Get_Interface,\n    },\n\n    sizeof ( T1_FaceRec ),\n    sizeof ( T1_SizeRec ),\n    sizeof ( T1_GlyphSlotRec ),\n\n    T1_Face_Init,\n    T1_Face_Done,\n    T1_Size_Init,\n    T1_Size_Done,\n    T1_GlyphSlot_Init,\n    T1_GlyphSlot_Done,\n\n    T1_Load_Glyph,\n\n#ifdef T1_CONFIG_OPTION_NO_AFM\n    0,                     /* FT_Face_GetKerningFunc */\n    0,                     /* FT_Face_AttachFunc     */\n#else\n    Get_Kerning,\n    T1_Read_Metrics,\n#endif\n    T1_Get_Advances,\n    T1_Size_Request,\n    0                      /* FT_Size_SelectFunc     */\n  };\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1driver.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1driver.h                                                             */\n/*                                                                         */\n/*    High-level Type 1 driver interface (specification).                  */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __T1DRIVER_H__\n#define __T1DRIVER_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdriver.h\"\n\n\nFT_BEGIN_HEADER\n\n#ifdef FT_CONFIG_OPTION_PIC\n#error \"this module does not support PIC yet\"\n#endif\n\n\n  FT_EXPORT_VAR( const FT_Driver_ClassRec )  t1_driver_class;\n\n\nFT_END_HEADER\n\n#endif /* __T1DRIVER_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1errors.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1errors.h                                                             */\n/*                                                                         */\n/*    Type 1 error codes (specification only).                             */\n/*                                                                         */\n/*  Copyright 2001, 2012 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the Type 1 error enumeration constants.   */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __T1ERRORS_H__\n#define __T1ERRORS_H__\n\n#include \"../../include/freetype/ftmoderr.h\"\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  T1_Err_\n#define FT_ERR_BASE    FT_Mod_Err_Type1\n\n#include \"../../include/freetype/fterrors.h\"\n\n#endif /* __T1ERRORS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1gload.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1gload.c                                                              */\n/*                                                                         */\n/*    Type 1 Glyph Loader (body).                                          */\n/*                                                                         */\n/*  Copyright 1996-2006, 2008-2010, 2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"t1gload.h\"\n#include \"../../include/freetype/internal/ftcalc.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/ftoutln.h\"\n#include \"../../include/freetype/internal/psaux.h\"\n\n#include \"t1errors.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_t1gload\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /**********                                                      *********/\n  /**********            COMPUTE THE MAXIMUM ADVANCE WIDTH         *********/\n  /**********                                                      *********/\n  /**********    The following code is in charge of computing      *********/\n  /**********    the maximum advance width of the font.  It        *********/\n  /**********    quickly processes each glyph charstring to        *********/\n  /**********    extract the value from either a `sbw' or `seac'   *********/\n  /**********    operator.                                         *********/\n  /**********                                                      *********/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Parse_Glyph_And_Get_Char_String( T1_Decoder  decoder,\n                                      FT_UInt     glyph_index,\n                                      FT_Data*    char_string )\n  {\n    T1_Face   face  = (T1_Face)decoder->builder.face;\n    T1_Font   type1 = &face->type1;\n    FT_Error  error = FT_Err_Ok;\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    FT_Incremental_InterfaceRec *inc =\n                      face->root.internal->incremental_interface;\n#endif\n\n\n    decoder->font_matrix = type1->font_matrix;\n    decoder->font_offset = type1->font_offset;\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n\n    /* For incremental fonts get the character data using the */\n    /* callback function.                                     */\n    if ( inc )\n      error = inc->funcs->get_glyph_data( inc->object,\n                                          glyph_index, char_string );\n    else\n\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n\n    /* For ordinary fonts get the character data stored in the face record. */\n    {\n      char_string->pointer = type1->charstrings[glyph_index];\n      char_string->length  = (FT_Int)type1->charstrings_len[glyph_index];\n    }\n\n    if ( !error )\n      error = decoder->funcs.parse_charstrings(\n                decoder, (FT_Byte*)char_string->pointer,\n                char_string->length );\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n\n    /* Incremental fonts can optionally override the metrics. */\n    if ( !error && inc && inc->funcs->get_glyph_metrics )\n    {\n      FT_Incremental_MetricsRec  metrics;\n\n\n      metrics.bearing_x = FIXED_TO_INT( decoder->builder.left_bearing.x );\n      metrics.bearing_y = 0;\n      metrics.advance   = FIXED_TO_INT( decoder->builder.advance.x );\n      metrics.advance_v = FIXED_TO_INT( decoder->builder.advance.y );\n\n      error = inc->funcs->get_glyph_metrics( inc->object,\n                                             glyph_index, FALSE, &metrics );\n\n      decoder->builder.left_bearing.x = INT_TO_FIXED( metrics.bearing_x );\n      decoder->builder.advance.x      = INT_TO_FIXED( metrics.advance );\n      decoder->builder.advance.y      = INT_TO_FIXED( metrics.advance_v );\n    }\n\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n\n    return error;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  T1_Parse_Glyph( T1_Decoder  decoder,\n                  FT_UInt     glyph_index )\n  {\n    FT_Data   glyph_data;\n    FT_Error  error = T1_Parse_Glyph_And_Get_Char_String(\n                        decoder, glyph_index, &glyph_data );\n\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n\n    if ( !error )\n    {\n      T1_Face  face = (T1_Face)decoder->builder.face;\n\n\n      if ( face->root.internal->incremental_interface )\n        face->root.internal->incremental_interface->funcs->free_glyph_data(\n          face->root.internal->incremental_interface->object,\n          &glyph_data );\n    }\n\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Compute_Max_Advance( T1_Face  face,\n                          FT_Pos*  max_advance )\n  {\n    FT_Error       error;\n    T1_DecoderRec  decoder;\n    FT_Int         glyph_index;\n    T1_Font        type1 = &face->type1;\n    PSAux_Service  psaux = (PSAux_Service)face->psaux;\n\n\n    FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) );\n\n    *max_advance = 0;\n\n    /* initialize load decoder */\n    error = psaux->t1_decoder_funcs->init( &decoder,\n                                           (FT_Face)face,\n                                           0, /* size       */\n                                           0, /* glyph slot */\n                                           (FT_Byte**)type1->glyph_names,\n                                           face->blend,\n                                           0,\n                                           FT_RENDER_MODE_NORMAL,\n                                           T1_Parse_Glyph );\n    if ( error )\n      return error;\n\n    decoder.builder.metrics_only = 1;\n    decoder.builder.load_points  = 0;\n\n    decoder.num_subrs     = type1->num_subrs;\n    decoder.subrs         = type1->subrs;\n    decoder.subrs_len     = type1->subrs_len;\n\n    decoder.buildchar     = face->buildchar;\n    decoder.len_buildchar = face->len_buildchar;\n\n    *max_advance = 0;\n\n    /* for each glyph, parse the glyph charstring and extract */\n    /* the advance width                                      */\n    for ( glyph_index = 0; glyph_index < type1->num_glyphs; glyph_index++ )\n    {\n      /* now get load the unscaled outline */\n      error = T1_Parse_Glyph( &decoder, glyph_index );\n      if ( glyph_index == 0 || decoder.builder.advance.x > *max_advance )\n        *max_advance = decoder.builder.advance.x;\n\n      /* ignore the error if one occurred - skip to next glyph */\n    }\n\n    psaux->t1_decoder_funcs->done( &decoder );\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Get_Advances( FT_Face    t1face,        /* T1_Face */\n                   FT_UInt    first,\n                   FT_UInt    count,\n                   FT_Int32   load_flags,\n                   FT_Fixed*  advances )\n  {\n    T1_Face        face  = (T1_Face)t1face;\n    T1_DecoderRec  decoder;\n    T1_Font        type1 = &face->type1;\n    PSAux_Service  psaux = (PSAux_Service)face->psaux;\n    FT_UInt        nn;\n    FT_Error       error;\n\n\n    if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )\n    {\n      for ( nn = 0; nn < count; nn++ )\n        advances[nn] = 0;\n\n      return FT_Err_Ok;\n    }\n\n    error = psaux->t1_decoder_funcs->init( &decoder,\n                                           (FT_Face)face,\n                                           0, /* size       */\n                                           0, /* glyph slot */\n                                           (FT_Byte**)type1->glyph_names,\n                                           face->blend,\n                                           0,\n                                           FT_RENDER_MODE_NORMAL,\n                                           T1_Parse_Glyph );\n    if ( error )\n      return error;\n\n    decoder.builder.metrics_only = 1;\n    decoder.builder.load_points  = 0;\n\n    decoder.num_subrs = type1->num_subrs;\n    decoder.subrs     = type1->subrs;\n    decoder.subrs_len = type1->subrs_len;\n\n    decoder.buildchar     = face->buildchar;\n    decoder.len_buildchar = face->len_buildchar;\n\n    for ( nn = 0; nn < count; nn++ )\n    {\n      error = T1_Parse_Glyph( &decoder, first + nn );\n      if ( !error )\n        advances[nn] = FIXED_TO_INT( decoder.builder.advance.x );\n      else\n        advances[nn] = 0;\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Load_Glyph( FT_GlyphSlot  t1glyph,          /* T1_GlyphSlot */\n                 FT_Size       t1size,           /* T1_Size      */\n                 FT_UInt       glyph_index,\n                 FT_Int32      load_flags )\n  {\n    T1_GlyphSlot            glyph = (T1_GlyphSlot)t1glyph;\n    FT_Error                error;\n    T1_DecoderRec           decoder;\n    T1_Face                 face = (T1_Face)t1glyph->face;\n    FT_Bool                 hinting;\n    T1_Font                 type1         = &face->type1;\n    PSAux_Service           psaux         = (PSAux_Service)face->psaux;\n    const T1_Decoder_Funcs  decoder_funcs = psaux->t1_decoder_funcs;\n\n    FT_Matrix               font_matrix;\n    FT_Vector               font_offset = {0, 0};\n    FT_Data                 glyph_data;\n    FT_Bool                 must_finish_decoder = FALSE;\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    FT_Bool                 glyph_data_loaded = 0;\n#endif\n\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    if ( glyph_index >= (FT_UInt)face->root.num_glyphs &&\n         !face->root.internal->incremental_interface   )\n#else\n    if ( glyph_index >= (FT_UInt)face->root.num_glyphs )\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) );\n\n    if ( load_flags & FT_LOAD_NO_RECURSE )\n      load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;\n\n    if ( t1size )\n    {\n      glyph->x_scale = t1size->metrics.x_scale;\n      glyph->y_scale = t1size->metrics.y_scale;\n    }\n    else\n    {\n      glyph->x_scale = 0x10000L;\n      glyph->y_scale = 0x10000L;\n    }\n\n    t1glyph->outline.n_points   = 0;\n    t1glyph->outline.n_contours = 0;\n\n    hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 &&\n                       ( load_flags & FT_LOAD_NO_HINTING ) == 0 );\n\n    t1glyph->format = FT_GLYPH_FORMAT_OUTLINE;\n\n    error = decoder_funcs->init( &decoder,\n                                 t1glyph->face,\n                                 t1size,\n                                 t1glyph,\n                                 (FT_Byte**)type1->glyph_names,\n                                 face->blend,\n                                 FT_BOOL( hinting ),\n                                 FT_LOAD_TARGET_MODE( load_flags ),\n                                 T1_Parse_Glyph );\n    if ( error )\n      goto Exit;\n\n    must_finish_decoder = TRUE;\n\n    decoder.builder.no_recurse = FT_BOOL(\n                                   ( load_flags & FT_LOAD_NO_RECURSE ) != 0 );\n\n    decoder.num_subrs     = type1->num_subrs;\n    decoder.subrs         = type1->subrs;\n    decoder.subrs_len     = type1->subrs_len;\n\n    decoder.buildchar     = face->buildchar;\n    decoder.len_buildchar = face->len_buildchar;\n\n    /* now load the unscaled outline */\n    error = T1_Parse_Glyph_And_Get_Char_String( &decoder, glyph_index,\n                                                &glyph_data );\n    if ( error )\n      goto Exit;\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    glyph_data_loaded = 1;\n#endif\n\n    font_matrix = decoder.font_matrix;\n    font_offset = decoder.font_offset;\n\n    /* save new glyph tables */\n    decoder_funcs->done( &decoder );\n\n    must_finish_decoder = FALSE;\n\n    /* now, set the metrics -- this is rather simple, as   */\n    /* the left side bearing is the xMin, and the top side */\n    /* bearing the yMax                                    */\n    if ( !error )\n    {\n      t1glyph->outline.flags &= FT_OUTLINE_OWNER;\n      t1glyph->outline.flags |= FT_OUTLINE_REVERSE_FILL;\n\n      /* for composite glyphs, return only left side bearing and */\n      /* advance width                                           */\n      if ( load_flags & FT_LOAD_NO_RECURSE )\n      {\n        FT_Slot_Internal  internal = t1glyph->internal;\n\n\n        t1glyph->metrics.horiBearingX =\n          FIXED_TO_INT( decoder.builder.left_bearing.x );\n        t1glyph->metrics.horiAdvance  =\n          FIXED_TO_INT( decoder.builder.advance.x );\n\n        internal->glyph_matrix      = font_matrix;\n        internal->glyph_delta       = font_offset;\n        internal->glyph_transformed = 1;\n      }\n      else\n      {\n        FT_BBox            cbox;\n        FT_Glyph_Metrics*  metrics = &t1glyph->metrics;\n        FT_Vector          advance;\n\n\n        /* copy the _unscaled_ advance width */\n        metrics->horiAdvance =\n          FIXED_TO_INT( decoder.builder.advance.x );\n        t1glyph->linearHoriAdvance =\n          FIXED_TO_INT( decoder.builder.advance.x );\n        t1glyph->internal->glyph_transformed = 0;\n\n        if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )\n        {\n          /* make up vertical ones */\n          metrics->vertAdvance = ( face->type1.font_bbox.yMax -\n                                   face->type1.font_bbox.yMin ) >> 16;\n          t1glyph->linearVertAdvance = metrics->vertAdvance;\n        }\n        else\n        {\n          metrics->vertAdvance =\n            FIXED_TO_INT( decoder.builder.advance.y );\n          t1glyph->linearVertAdvance =\n            FIXED_TO_INT( decoder.builder.advance.y );\n        }\n\n        t1glyph->format = FT_GLYPH_FORMAT_OUTLINE;\n\n        if ( t1size && t1size->metrics.y_ppem < 24 )\n          t1glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;\n\n#if 1\n        /* apply the font matrix, if any */\n        if ( font_matrix.xx != 0x10000L || font_matrix.yy != font_matrix.xx ||\n             font_matrix.xy != 0        || font_matrix.yx != 0              )\n          FT_Outline_Transform( &t1glyph->outline, &font_matrix );\n\n        if ( font_offset.x || font_offset.y )\n          FT_Outline_Translate( &t1glyph->outline,\n                                font_offset.x,\n                                font_offset.y );\n\n        advance.x = metrics->horiAdvance;\n        advance.y = 0;\n        FT_Vector_Transform( &advance, &font_matrix );\n        metrics->horiAdvance = advance.x + font_offset.x;\n        advance.x = 0;\n        advance.y = metrics->vertAdvance;\n        FT_Vector_Transform( &advance, &font_matrix );\n        metrics->vertAdvance = advance.y + font_offset.y;\n#endif\n\n        if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 )\n        {\n          /* scale the outline and the metrics */\n          FT_Int       n;\n          FT_Outline*  cur = decoder.builder.base;\n          FT_Vector*   vec = cur->points;\n          FT_Fixed     x_scale = glyph->x_scale;\n          FT_Fixed     y_scale = glyph->y_scale;\n\n\n          /* First of all, scale the points, if we are not hinting */\n          if ( !hinting || ! decoder.builder.hints_funcs )\n            for ( n = cur->n_points; n > 0; n--, vec++ )\n            {\n              vec->x = FT_MulFix( vec->x, x_scale );\n              vec->y = FT_MulFix( vec->y, y_scale );\n            }\n\n          /* Then scale the metrics */\n          metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );\n          metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );\n        }\n\n        /* compute the other metrics */\n        FT_Outline_Get_CBox( &t1glyph->outline, &cbox );\n\n        metrics->width  = cbox.xMax - cbox.xMin;\n        metrics->height = cbox.yMax - cbox.yMin;\n\n        metrics->horiBearingX = cbox.xMin;\n        metrics->horiBearingY = cbox.yMax;\n\n        if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )\n        {\n          /* make up vertical ones */\n          ft_synthesize_vertical_metrics( metrics,\n                                          metrics->vertAdvance );\n        }\n      }\n\n      /* Set control data to the glyph charstrings.  Note that this is */\n      /* _not_ zero-terminated.                                        */\n      t1glyph->control_data = (FT_Byte*)glyph_data.pointer;\n      t1glyph->control_len  = glyph_data.length;\n    }\n\n\n  Exit:\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    if ( glyph_data_loaded && face->root.internal->incremental_interface )\n    {\n      face->root.internal->incremental_interface->funcs->free_glyph_data(\n        face->root.internal->incremental_interface->object,\n        &glyph_data );\n\n      /* Set the control data to null - it is no longer available if   */\n      /* loaded incrementally.                                         */\n      t1glyph->control_data = 0;\n      t1glyph->control_len  = 0;\n    }\n#endif\n\n    if ( must_finish_decoder )\n      decoder_funcs->done( &decoder );\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1gload.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1gload.h                                                              */\n/*                                                                         */\n/*    Type 1 Glyph Loader (specification).                                 */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2008, 2011 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __T1GLOAD_H__\n#define __T1GLOAD_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"t1objs.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( FT_Error )\n  T1_Compute_Max_Advance( T1_Face  face,\n                          FT_Pos*  max_advance );\n\n  FT_LOCAL( FT_Error )\n  T1_Get_Advances( FT_Face    face,\n                   FT_UInt    first,\n                   FT_UInt    count,\n                   FT_Int32   load_flags,\n                   FT_Fixed*  advances );\n\n  FT_LOCAL( FT_Error )\n  T1_Load_Glyph( FT_GlyphSlot  glyph,\n                 FT_Size       size,\n                 FT_UInt       glyph_index,\n                 FT_Int32      load_flags );\n\n\nFT_END_HEADER\n\n#endif /* __T1GLOAD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1load.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1load.c                                                               */\n/*                                                                         */\n/*    Type 1 font loader (body).                                           */\n/*                                                                         */\n/*  Copyright 1996-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This is the new and improved Type 1 data loader for FreeType 2.  The  */\n  /* old loader has several problems: it is slow, complex, difficult to    */\n  /* maintain, and contains incredible hacks to make it accept some        */\n  /* ill-formed Type 1 fonts without hiccup-ing.  Moreover, about 5% of    */\n  /* the Type 1 fonts on my machine still aren't loaded correctly by it.   */\n  /*                                                                       */\n  /* This version is much simpler, much faster and also easier to read and */\n  /* maintain by a great order of magnitude.  The idea behind it is to     */\n  /* _not_ try to read the Type 1 token stream with a state machine (i.e.  */\n  /* a Postscript-like interpreter) but rather to perform simple pattern   */\n  /* matching.                                                             */\n  /*                                                                       */\n  /* Indeed, nearly all data definitions follow a simple pattern like      */\n  /*                                                                       */\n  /*  ... /Field <data> ...                                                */\n  /*                                                                       */\n  /* where <data> can be a number, a boolean, a string, or an array of     */\n  /* numbers.  There are a few exceptions, namely the encoding, font name, */\n  /* charstrings, and subrs; they are handled with a special pattern       */\n  /* matching routine.                                                     */\n  /*                                                                       */\n  /* All other common cases are handled very simply.  The matching rules   */\n  /* are defined in the file `t1tokens.h' through the use of several       */\n  /* macros calls PARSE_XXX.  This file is included twice here; the first  */\n  /* time to generate parsing callback functions, the second time to       */\n  /* generate a table of keywords (with pointers to the associated         */\n  /* callback functions).                                                  */\n  /*                                                                       */\n  /* The function `parse_dict' simply scans *linearly* a given dictionary  */\n  /* (either the top-level or private one) and calls the appropriate       */\n  /* callback when it encounters an immediate keyword.                     */\n  /*                                                                       */\n  /* This is by far the fastest way one can find to parse and read all     */\n  /* data.                                                                 */\n  /*                                                                       */\n  /* This led to tremendous code size reduction.  Note that later, the     */\n  /* glyph loader will also be _greatly_ simplified, and the automatic     */\n  /* hinter will replace the clumsy `t1hinter'.                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/config/ftconfig.h\"\n#include \"../../include/freetype/ftmm.h\"\n#include \"../../include/freetype/internal/t1types.h\"\n#include \"../../include/freetype/internal/ftcalc.h\"\n\n#include \"t1load.h\"\n#include \"t1errors.h\"\n\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n#define IS_INCREMENTAL  (FT_Bool)( face->root.internal->incremental_interface != 0 )\n#else\n#define IS_INCREMENTAL  0\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_t1load\n\n\n#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    MULTIPLE MASTERS SUPPORT                   *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static FT_Error\n  t1_allocate_blend( T1_Face  face,\n                     FT_UInt  num_designs,\n                     FT_UInt  num_axis )\n  {\n    PS_Blend   blend;\n    FT_Memory  memory = face->root.memory;\n    FT_Error   error  = FT_Err_Ok;\n\n\n    blend = face->blend;\n    if ( !blend )\n    {\n      if ( FT_NEW( blend ) )\n        goto Exit;\n\n      blend->num_default_design_vector = 0;\n\n      face->blend = blend;\n    }\n\n    /* allocate design data if needed */\n    if ( num_designs > 0 )\n    {\n      if ( blend->num_designs == 0 )\n      {\n        FT_UInt  nn;\n\n\n        /* allocate the blend `private' and `font_info' dictionaries */\n        if ( FT_NEW_ARRAY( blend->font_infos[1], num_designs     ) ||\n             FT_NEW_ARRAY( blend->privates  [1], num_designs     ) ||\n             FT_NEW_ARRAY( blend->bboxes    [1], num_designs     ) ||\n             FT_NEW_ARRAY( blend->weight_vector, num_designs * 2 ) )\n          goto Exit;\n\n        blend->default_weight_vector = blend->weight_vector + num_designs;\n\n        blend->font_infos[0] = &face->type1.font_info;\n        blend->privates  [0] = &face->type1.private_dict;\n        blend->bboxes    [0] = &face->type1.font_bbox;\n\n        for ( nn = 2; nn <= num_designs; nn++ )\n        {\n          blend->font_infos[nn] = blend->font_infos[nn - 1] + 1;\n          blend->privates  [nn] = blend->privates  [nn - 1] + 1;\n          blend->bboxes    [nn] = blend->bboxes    [nn - 1] + 1;\n        }\n\n        blend->num_designs = num_designs;\n      }\n      else if ( blend->num_designs != num_designs )\n        goto Fail;\n    }\n\n    /* allocate axis data if needed */\n    if ( num_axis > 0 )\n    {\n      if ( blend->num_axis != 0 && blend->num_axis != num_axis )\n        goto Fail;\n\n      blend->num_axis = num_axis;\n    }\n\n    /* allocate the blend design pos table if needed */\n    num_designs = blend->num_designs;\n    num_axis    = blend->num_axis;\n    if ( num_designs && num_axis && blend->design_pos[0] == 0 )\n    {\n      FT_UInt  n;\n\n\n      if ( FT_NEW_ARRAY( blend->design_pos[0], num_designs * num_axis ) )\n        goto Exit;\n\n      for ( n = 1; n < num_designs; n++ )\n        blend->design_pos[n] = blend->design_pos[0] + num_axis * n;\n    }\n\n  Exit:\n    return error;\n\n  Fail:\n    error = FT_THROW( Invalid_File_Format );\n    goto Exit;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Get_Multi_Master( T1_Face           face,\n                       FT_Multi_Master*  master )\n  {\n    PS_Blend  blend = face->blend;\n    FT_UInt   n;\n    FT_Error  error;\n\n\n    error = FT_THROW( Invalid_Argument );\n\n    if ( blend )\n    {\n      master->num_axis    = blend->num_axis;\n      master->num_designs = blend->num_designs;\n\n      for ( n = 0; n < blend->num_axis; n++ )\n      {\n        FT_MM_Axis*   axis = master->axis + n;\n        PS_DesignMap  map = blend->design_map + n;\n\n\n        axis->name    = blend->axis_names[n];\n        axis->minimum = map->design_points[0];\n        axis->maximum = map->design_points[map->num_points - 1];\n      }\n\n      error = FT_Err_Ok;\n    }\n\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Given a normalized (blend) coordinate, figure out the design          */\n  /* coordinate appropriate for that value.                                */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Fixed )\n  mm_axis_unmap( PS_DesignMap  axismap,\n                 FT_Fixed      ncv )\n  {\n    int  j;\n\n\n    if ( ncv <= axismap->blend_points[0] )\n      return INT_TO_FIXED( axismap->design_points[0] );\n\n    for ( j = 1; j < axismap->num_points; ++j )\n    {\n      if ( ncv <= axismap->blend_points[j] )\n        return INT_TO_FIXED( axismap->design_points[j - 1] ) +\n               ( axismap->design_points[j] - axismap->design_points[j - 1] ) *\n               FT_DivFix( ncv - axismap->blend_points[j - 1],\n                          axismap->blend_points[j] -\n                            axismap->blend_points[j - 1] );\n    }\n\n    return INT_TO_FIXED( axismap->design_points[axismap->num_points - 1] );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Given a vector of weights, one for each design, figure out the        */\n  /* normalized axis coordinates which gave rise to those weights.         */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  mm_weights_unmap( FT_Fixed*  weights,\n                    FT_Fixed*  axiscoords,\n                    FT_UInt    axis_count )\n  {\n    FT_ASSERT( axis_count <= T1_MAX_MM_AXIS );\n\n    if ( axis_count == 1 )\n      axiscoords[0] = weights[1];\n\n    else if ( axis_count == 2 )\n    {\n      axiscoords[0] = weights[3] + weights[1];\n      axiscoords[1] = weights[3] + weights[2];\n    }\n\n    else if ( axis_count == 3 )\n    {\n      axiscoords[0] = weights[7] + weights[5] + weights[3] + weights[1];\n      axiscoords[1] = weights[7] + weights[6] + weights[3] + weights[2];\n      axiscoords[2] = weights[7] + weights[6] + weights[5] + weights[4];\n    }\n\n    else\n    {\n      axiscoords[0] = weights[15] + weights[13] + weights[11] + weights[9] +\n                        weights[7] + weights[5] + weights[3] + weights[1];\n      axiscoords[1] = weights[15] + weights[14] + weights[11] + weights[10] +\n                        weights[7] + weights[6] + weights[3] + weights[2];\n      axiscoords[2] = weights[15] + weights[14] + weights[13] + weights[12] +\n                        weights[7] + weights[6] + weights[5] + weights[4];\n      axiscoords[3] = weights[15] + weights[14] + weights[13] + weights[12] +\n                        weights[11] + weights[10] + weights[9] + weights[8];\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Just a wrapper around T1_Get_Multi_Master to support the different    */\n  /*  arguments needed by the GX var distortable fonts.                    */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  T1_Get_MM_Var( T1_Face      face,\n                 FT_MM_Var*  *master )\n  {\n    FT_Memory        memory = face->root.memory;\n    FT_MM_Var       *mmvar = NULL;\n    FT_Multi_Master  mmaster;\n    FT_Error         error;\n    FT_UInt          i;\n    FT_Fixed         axiscoords[T1_MAX_MM_AXIS];\n    PS_Blend         blend = face->blend;\n\n\n    error = T1_Get_Multi_Master( face, &mmaster );\n    if ( error )\n      goto Exit;\n    if ( FT_ALLOC( mmvar,\n                   sizeof ( FT_MM_Var ) +\n                     mmaster.num_axis * sizeof ( FT_Var_Axis ) ) )\n      goto Exit;\n\n    mmvar->num_axis        = mmaster.num_axis;\n    mmvar->num_designs     = mmaster.num_designs;\n    mmvar->num_namedstyles = ~0U;                        /* Does not apply */\n    mmvar->axis            = (FT_Var_Axis*)&mmvar[1];\n                                      /* Point to axes after MM_Var struct */\n    mmvar->namedstyle      = NULL;\n\n    for ( i = 0 ; i < mmaster.num_axis; ++i )\n    {\n      mmvar->axis[i].name    = mmaster.axis[i].name;\n      mmvar->axis[i].minimum = INT_TO_FIXED( mmaster.axis[i].minimum);\n      mmvar->axis[i].maximum = INT_TO_FIXED( mmaster.axis[i].maximum);\n      mmvar->axis[i].def     = ( mmvar->axis[i].minimum +\n                                   mmvar->axis[i].maximum ) / 2;\n                            /* Does not apply.  But this value is in range */\n      mmvar->axis[i].strid   = ~0U;                      /* Does not apply */\n      mmvar->axis[i].tag     = ~0U;                      /* Does not apply */\n\n      if ( ft_strcmp( mmvar->axis[i].name, \"Weight\" ) == 0 )\n        mmvar->axis[i].tag = FT_MAKE_TAG( 'w', 'g', 'h', 't' );\n      else if ( ft_strcmp( mmvar->axis[i].name, \"Width\" ) == 0 )\n        mmvar->axis[i].tag = FT_MAKE_TAG( 'w', 'd', 't', 'h' );\n      else if ( ft_strcmp( mmvar->axis[i].name, \"OpticalSize\" ) == 0 )\n        mmvar->axis[i].tag = FT_MAKE_TAG( 'o', 'p', 's', 'z' );\n    }\n\n    if ( blend->num_designs == ( 1U << blend->num_axis ) )\n    {\n      mm_weights_unmap( blend->default_weight_vector,\n                        axiscoords,\n                        blend->num_axis );\n\n      for ( i = 0; i < mmaster.num_axis; ++i )\n        mmvar->axis[i].def = mm_axis_unmap( &blend->design_map[i],\n                                            axiscoords[i] );\n    }\n\n    *master = mmvar;\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Set_MM_Blend( T1_Face    face,\n                   FT_UInt    num_coords,\n                   FT_Fixed*  coords )\n  {\n    PS_Blend  blend = face->blend;\n    FT_Error  error;\n    FT_UInt   n, m;\n\n\n    error = FT_ERR( Invalid_Argument );\n\n    if ( blend && blend->num_axis == num_coords )\n    {\n      /* recompute the weight vector from the blend coordinates */\n      error = FT_Err_Ok;\n\n      for ( n = 0; n < blend->num_designs; n++ )\n      {\n        FT_Fixed  result = 0x10000L;  /* 1.0 fixed */\n\n\n        for ( m = 0; m < blend->num_axis; m++ )\n        {\n          FT_Fixed  factor;\n\n\n          /* get current blend axis position */\n          factor = coords[m];\n          if ( factor < 0 )\n            factor = 0;\n          if ( factor > 0x10000L )\n            factor = 0x10000L;\n\n          if ( ( n & ( 1 << m ) ) == 0 )\n            factor = 0x10000L - factor;\n\n          result = FT_MulFix( result, factor );\n        }\n        blend->weight_vector[n] = result;\n      }\n\n      error = FT_Err_Ok;\n    }\n\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Set_MM_Design( T1_Face   face,\n                    FT_UInt   num_coords,\n                    FT_Long*  coords )\n  {\n    PS_Blend  blend = face->blend;\n    FT_Error  error;\n    FT_UInt   n, p;\n\n\n    error = FT_ERR( Invalid_Argument );\n    if ( blend && blend->num_axis == num_coords )\n    {\n      /* compute the blend coordinates through the blend design map */\n      FT_Fixed  final_blends[T1_MAX_MM_DESIGNS];\n\n\n      for ( n = 0; n < blend->num_axis; n++ )\n      {\n        FT_Long       design  = coords[n];\n        FT_Fixed      the_blend;\n        PS_DesignMap  map     = blend->design_map + n;\n        FT_Long*      designs = map->design_points;\n        FT_Fixed*     blends  = map->blend_points;\n        FT_Int        before  = -1, after = -1;\n\n\n        for ( p = 0; p < (FT_UInt)map->num_points; p++ )\n        {\n          FT_Long  p_design = designs[p];\n\n\n          /* exact match? */\n          if ( design == p_design )\n          {\n            the_blend = blends[p];\n            goto Found;\n          }\n\n          if ( design < p_design )\n          {\n            after = p;\n            break;\n          }\n\n          before = p;\n        }\n\n        /* now interpolate if necessary */\n        if ( before < 0 )\n          the_blend = blends[0];\n\n        else if ( after < 0 )\n          the_blend = blends[map->num_points - 1];\n\n        else\n          the_blend = FT_MulDiv( design         - designs[before],\n                                 blends [after] - blends [before],\n                                 designs[after] - designs[before] );\n\n      Found:\n        final_blends[n] = the_blend;\n      }\n\n      error = T1_Set_MM_Blend( face, num_coords, final_blends );\n    }\n\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Just a wrapper around T1_Set_MM_Design to support the different       */\n  /* arguments needed by the GX var distortable fonts.                     */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  T1_Set_Var_Design( T1_Face    face,\n                     FT_UInt    num_coords,\n                     FT_Fixed*  coords )\n  {\n     FT_Long   lcoords[4];          /* maximum axis count is 4 */\n     FT_UInt   i;\n     FT_Error  error;\n\n\n     error = FT_ERR( Invalid_Argument );\n     if ( num_coords <= 4 && num_coords > 0 )\n     {\n       for ( i = 0; i < num_coords; ++i )\n         lcoords[i] = FIXED_TO_INT( coords[i] );\n       error = T1_Set_MM_Design( face, num_coords, lcoords );\n     }\n\n     return error;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  T1_Done_Blend( T1_Face  face )\n  {\n    FT_Memory  memory = face->root.memory;\n    PS_Blend   blend  = face->blend;\n\n\n    if ( blend )\n    {\n      FT_UInt  num_designs = blend->num_designs;\n      FT_UInt  num_axis    = blend->num_axis;\n      FT_UInt  n;\n\n\n      /* release design pos table */\n      FT_FREE( blend->design_pos[0] );\n      for ( n = 1; n < num_designs; n++ )\n        blend->design_pos[n] = NULL;\n\n      /* release blend `private' and `font info' dictionaries */\n      FT_FREE( blend->privates[1] );\n      FT_FREE( blend->font_infos[1] );\n      FT_FREE( blend->bboxes[1] );\n\n      for ( n = 0; n < num_designs; n++ )\n      {\n        blend->privates  [n] = NULL;\n        blend->font_infos[n] = NULL;\n        blend->bboxes    [n] = NULL;\n      }\n\n      /* release weight vectors */\n      FT_FREE( blend->weight_vector );\n      blend->default_weight_vector = NULL;\n\n      /* release axis names */\n      for ( n = 0; n < num_axis; n++ )\n        FT_FREE( blend->axis_names[n] );\n\n      /* release design map */\n      for ( n = 0; n < num_axis; n++ )\n      {\n        PS_DesignMap  dmap = blend->design_map + n;\n\n\n        FT_FREE( dmap->design_points );\n        dmap->num_points = 0;\n      }\n\n      FT_FREE( face->blend );\n    }\n  }\n\n\n  static void\n  parse_blend_axis_types( T1_Face    face,\n                          T1_Loader  loader )\n  {\n    T1_TokenRec  axis_tokens[T1_MAX_MM_AXIS];\n    FT_Int       n, num_axis;\n    FT_Error     error = FT_Err_Ok;\n    PS_Blend     blend;\n    FT_Memory    memory;\n\n\n    /* take an array of objects */\n    T1_ToTokenArray( &loader->parser, axis_tokens,\n                     T1_MAX_MM_AXIS, &num_axis );\n    if ( num_axis < 0 )\n    {\n      error = FT_ERR( Ignore );\n      goto Exit;\n    }\n    if ( num_axis == 0 || num_axis > T1_MAX_MM_AXIS )\n    {\n      FT_ERROR(( \"parse_blend_axis_types: incorrect number of axes: %d\\n\",\n                 num_axis ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    /* allocate blend if necessary */\n    error = t1_allocate_blend( face, 0, (FT_UInt)num_axis );\n    if ( error )\n      goto Exit;\n\n    blend  = face->blend;\n    memory = face->root.memory;\n\n    /* each token is an immediate containing the name of the axis */\n    for ( n = 0; n < num_axis; n++ )\n    {\n      T1_Token    token = axis_tokens + n;\n      FT_Byte*    name;\n      FT_PtrDist  len;\n\n\n      /* skip first slash, if any */\n      if ( token->start[0] == '/' )\n        token->start++;\n\n      len = token->limit - token->start;\n      if ( len == 0 )\n      {\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n\n      if ( FT_ALLOC( blend->axis_names[n], (FT_Long)( len + 1 ) ) )\n        goto Exit;\n\n      name = (FT_Byte*)blend->axis_names[n];\n      FT_MEM_COPY( name, token->start, len );\n      name[len] = '\\0';\n    }\n\n  Exit:\n    loader->parser.root.error = error;\n  }\n\n\n  static void\n  parse_blend_design_positions( T1_Face    face,\n                                T1_Loader  loader )\n  {\n    T1_TokenRec  design_tokens[T1_MAX_MM_DESIGNS];\n    FT_Int       num_designs;\n    FT_Int       num_axis;\n    T1_Parser    parser = &loader->parser;\n\n    FT_Error     error = FT_Err_Ok;\n    PS_Blend     blend;\n\n\n    /* get the array of design tokens -- compute number of designs */\n    T1_ToTokenArray( parser, design_tokens,\n                     T1_MAX_MM_DESIGNS, &num_designs );\n    if ( num_designs < 0 )\n    {\n      error = FT_ERR( Ignore );\n      goto Exit;\n    }\n    if ( num_designs == 0 || num_designs > T1_MAX_MM_DESIGNS )\n    {\n      FT_ERROR(( \"parse_blend_design_positions:\"\n                 \" incorrect number of designs: %d\\n\",\n                 num_designs ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    {\n      FT_Byte*  old_cursor = parser->root.cursor;\n      FT_Byte*  old_limit  = parser->root.limit;\n      FT_Int    n;\n\n\n      blend    = face->blend;\n      num_axis = 0;  /* make compiler happy */\n\n      for ( n = 0; n < num_designs; n++ )\n      {\n        T1_TokenRec  axis_tokens[T1_MAX_MM_AXIS];\n        T1_Token     token;\n        FT_Int       axis, n_axis;\n\n\n        /* read axis/coordinates tokens */\n        token = design_tokens + n;\n        parser->root.cursor = token->start;\n        parser->root.limit  = token->limit;\n        T1_ToTokenArray( parser, axis_tokens, T1_MAX_MM_AXIS, &n_axis );\n\n        if ( n == 0 )\n        {\n          if ( n_axis <= 0 || n_axis > T1_MAX_MM_AXIS )\n          {\n            FT_ERROR(( \"parse_blend_design_positions:\"\n                       \" invalid number of axes: %d\\n\",\n                       n_axis ));\n            error = FT_THROW( Invalid_File_Format );\n            goto Exit;\n          }\n\n          num_axis = n_axis;\n          error = t1_allocate_blend( face, num_designs, num_axis );\n          if ( error )\n            goto Exit;\n          blend = face->blend;\n        }\n        else if ( n_axis != num_axis )\n        {\n          FT_ERROR(( \"parse_blend_design_positions: incorrect table\\n\" ));\n          error = FT_THROW( Invalid_File_Format );\n          goto Exit;\n        }\n\n        /* now read each axis token into the design position */\n        for ( axis = 0; axis < n_axis; axis++ )\n        {\n          T1_Token  token2 = axis_tokens + axis;\n\n\n          parser->root.cursor = token2->start;\n          parser->root.limit  = token2->limit;\n          blend->design_pos[n][axis] = T1_ToFixed( parser, 0 );\n        }\n      }\n\n      loader->parser.root.cursor = old_cursor;\n      loader->parser.root.limit  = old_limit;\n    }\n\n  Exit:\n    loader->parser.root.error = error;\n  }\n\n\n  static void\n  parse_blend_design_map( T1_Face    face,\n                          T1_Loader  loader )\n  {\n    FT_Error     error  = FT_Err_Ok;\n    T1_Parser    parser = &loader->parser;\n    PS_Blend     blend;\n    T1_TokenRec  axis_tokens[T1_MAX_MM_AXIS];\n    FT_Int       n, num_axis;\n    FT_Byte*     old_cursor;\n    FT_Byte*     old_limit;\n    FT_Memory    memory = face->root.memory;\n\n\n    T1_ToTokenArray( parser, axis_tokens,\n                     T1_MAX_MM_AXIS, &num_axis );\n    if ( num_axis < 0 )\n    {\n      error = FT_ERR( Ignore );\n      goto Exit;\n    }\n    if ( num_axis == 0 || num_axis > T1_MAX_MM_AXIS )\n    {\n      FT_ERROR(( \"parse_blend_design_map: incorrect number of axes: %d\\n\",\n                 num_axis ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    old_cursor = parser->root.cursor;\n    old_limit  = parser->root.limit;\n\n    error = t1_allocate_blend( face, 0, num_axis );\n    if ( error )\n      goto Exit;\n    blend = face->blend;\n\n    /* now read each axis design map */\n    for ( n = 0; n < num_axis; n++ )\n    {\n      PS_DesignMap  map = blend->design_map + n;\n      T1_Token      axis_token;\n      T1_TokenRec   point_tokens[T1_MAX_MM_MAP_POINTS];\n      FT_Int        p, num_points;\n\n\n      axis_token = axis_tokens + n;\n\n      parser->root.cursor = axis_token->start;\n      parser->root.limit  = axis_token->limit;\n      T1_ToTokenArray( parser, point_tokens,\n                       T1_MAX_MM_MAP_POINTS, &num_points );\n\n      if ( num_points <= 0 || num_points > T1_MAX_MM_MAP_POINTS )\n      {\n        FT_ERROR(( \"parse_blend_design_map: incorrect table\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n\n      /* allocate design map data */\n      if ( FT_NEW_ARRAY( map->design_points, num_points * 2 ) )\n        goto Exit;\n      map->blend_points = map->design_points + num_points;\n      map->num_points   = (FT_Byte)num_points;\n\n      for ( p = 0; p < num_points; p++ )\n      {\n        T1_Token  point_token;\n\n\n        point_token = point_tokens + p;\n\n        /* don't include delimiting brackets */\n        parser->root.cursor = point_token->start + 1;\n        parser->root.limit  = point_token->limit - 1;\n\n        map->design_points[p] = T1_ToInt( parser );\n        map->blend_points [p] = T1_ToFixed( parser, 0 );\n      }\n    }\n\n    parser->root.cursor = old_cursor;\n    parser->root.limit  = old_limit;\n\n  Exit:\n    parser->root.error = error;\n  }\n\n\n  static void\n  parse_weight_vector( T1_Face    face,\n                       T1_Loader  loader )\n  {\n    T1_TokenRec  design_tokens[T1_MAX_MM_DESIGNS];\n    FT_Int       num_designs;\n    FT_Error     error  = FT_Err_Ok;\n    T1_Parser    parser = &loader->parser;\n    PS_Blend     blend  = face->blend;\n    T1_Token     token;\n    FT_Int       n;\n    FT_Byte*     old_cursor;\n    FT_Byte*     old_limit;\n\n\n    T1_ToTokenArray( parser, design_tokens,\n                     T1_MAX_MM_DESIGNS, &num_designs );\n    if ( num_designs < 0 )\n    {\n      error = FT_ERR( Ignore );\n      goto Exit;\n    }\n    if ( num_designs == 0 || num_designs > T1_MAX_MM_DESIGNS )\n    {\n      FT_ERROR(( \"parse_weight_vector:\"\n                 \" incorrect number of designs: %d\\n\",\n                 num_designs ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    if ( !blend || !blend->num_designs )\n    {\n      error = t1_allocate_blend( face, num_designs, 0 );\n      if ( error )\n        goto Exit;\n      blend = face->blend;\n    }\n    else if ( blend->num_designs != (FT_UInt)num_designs )\n    {\n      FT_ERROR(( \"parse_weight_vector:\"\n                 \" /BlendDesignPosition and /WeightVector have\\n\"\n                 \"                    \"\n                 \" different number of elements\\n\" ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    old_cursor = parser->root.cursor;\n    old_limit  = parser->root.limit;\n\n    for ( n = 0; n < num_designs; n++ )\n    {\n      token = design_tokens + n;\n      parser->root.cursor = token->start;\n      parser->root.limit  = token->limit;\n\n      blend->default_weight_vector[n] =\n      blend->weight_vector[n]         = T1_ToFixed( parser, 0 );\n    }\n\n    parser->root.cursor = old_cursor;\n    parser->root.limit  = old_limit;\n\n  Exit:\n    parser->root.error = error;\n  }\n\n\n  /* e.g., /BuildCharArray [0 0 0 0 0 0 0 0] def           */\n  /* we're only interested in the number of array elements */\n  static void\n  parse_buildchar( T1_Face    face,\n                   T1_Loader  loader )\n  {\n    face->len_buildchar = T1_ToFixedArray( &loader->parser, 0, NULL, 0 );\n\n    return;\n  }\n\n\n#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */\n\n\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      TYPE 1 SYMBOL PARSING                    *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static FT_Error\n  t1_load_keyword( T1_Face         face,\n                   T1_Loader       loader,\n                   const T1_Field  field )\n  {\n    FT_Error  error;\n    void*     dummy_object;\n    void**    objects;\n    FT_UInt   max_objects;\n    PS_Blend  blend = face->blend;\n\n\n    if ( blend && blend->num_designs == 0 )\n      blend = NULL;\n\n    /* if the keyword has a dedicated callback, call it */\n    if ( field->type == T1_FIELD_TYPE_CALLBACK )\n    {\n      field->reader( (FT_Face)face, loader );\n      error = loader->parser.root.error;\n      goto Exit;\n    }\n\n    /* now, the keyword is either a simple field, or a table of fields; */\n    /* we are now going to take care of it                              */\n    switch ( field->location )\n    {\n    case T1_FIELD_LOCATION_FONT_INFO:\n      dummy_object = &face->type1.font_info;\n      objects      = &dummy_object;\n      max_objects  = 0;\n\n      if ( blend )\n      {\n        objects     = (void**)blend->font_infos;\n        max_objects = blend->num_designs;\n      }\n      break;\n\n    case T1_FIELD_LOCATION_FONT_EXTRA:\n      dummy_object = &face->type1.font_extra;\n      objects      = &dummy_object;\n      max_objects  = 0;\n      break;\n\n    case T1_FIELD_LOCATION_PRIVATE:\n      dummy_object = &face->type1.private_dict;\n      objects      = &dummy_object;\n      max_objects  = 0;\n\n      if ( blend )\n      {\n        objects     = (void**)blend->privates;\n        max_objects = blend->num_designs;\n      }\n      break;\n\n    case T1_FIELD_LOCATION_BBOX:\n      dummy_object = &face->type1.font_bbox;\n      objects      = &dummy_object;\n      max_objects  = 0;\n\n      if ( blend )\n      {\n        objects     = (void**)blend->bboxes;\n        max_objects = blend->num_designs;\n      }\n      break;\n\n    case T1_FIELD_LOCATION_LOADER:\n      dummy_object = loader;\n      objects      = &dummy_object;\n      max_objects  = 0;\n      break;\n\n    case T1_FIELD_LOCATION_FACE:\n      dummy_object = face;\n      objects      = &dummy_object;\n      max_objects  = 0;\n      break;\n\n#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT\n    case T1_FIELD_LOCATION_BLEND:\n      dummy_object = face->blend;\n      objects      = &dummy_object;\n      max_objects  = 0;\n      break;\n#endif\n\n    default:\n      dummy_object = &face->type1;\n      objects      = &dummy_object;\n      max_objects  = 0;\n    }\n\n    if ( *objects )\n    {\n      if ( field->type == T1_FIELD_TYPE_INTEGER_ARRAY ||\n           field->type == T1_FIELD_TYPE_FIXED_ARRAY   )\n        error = T1_Load_Field_Table( &loader->parser, field,\n                                     objects, max_objects, 0 );\n      else\n        error = T1_Load_Field( &loader->parser, field,\n                               objects, max_objects, 0 );\n    }\n    else\n    {\n      FT_TRACE1(( \"t1_load_keyword: ignoring keyword `%s'\"\n                  \" which is not valid at this point\\n\"\n                  \"                 (probably due to missing keywords)\\n\",\n                 field->ident ));\n      error = FT_Err_Ok;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  static void\n  parse_private( T1_Face    face,\n                 T1_Loader  loader )\n  {\n    FT_UNUSED( face );\n\n    loader->keywords_encountered |= T1_PRIVATE;\n  }\n\n\n  static int\n  read_binary_data( T1_Parser  parser,\n                    FT_Long*   size,\n                    FT_Byte**  base,\n                    FT_Bool    incremental )\n  {\n    FT_Byte*  cur;\n    FT_Byte*  limit = parser->root.limit;\n\n\n    /* the binary data has one of the following formats */\n    /*                                                  */\n    /*   `size' [white*] RD white ....... ND            */\n    /*   `size' [white*] -| white ....... |-            */\n    /*                                                  */\n\n    T1_Skip_Spaces( parser );\n\n    cur = parser->root.cursor;\n\n    if ( cur < limit && ft_isdigit( *cur ) )\n    {\n      FT_Long  s = T1_ToInt( parser );\n\n\n      T1_Skip_PS_Token( parser );   /* `RD' or `-|' or something else */\n\n      /* there is only one whitespace char after the */\n      /* `RD' or `-|' token                          */\n      *base = parser->root.cursor + 1;\n\n      if ( s >= 0 && s < limit - *base )\n      {\n        parser->root.cursor += s + 1;\n        *size = s;\n        return !parser->root.error;\n      }\n    }\n\n    if( !incremental )\n    {\n      FT_ERROR(( \"read_binary_data: invalid size field\\n\" ));\n      parser->root.error = FT_THROW( Invalid_File_Format );\n    }\n\n    return 0;\n  }\n\n\n  /* We now define the routines to handle the `/Encoding', `/Subrs', */\n  /* and `/CharStrings' dictionaries.                                */\n\n  static void\n  t1_parse_font_matrix( T1_Face    face,\n                        T1_Loader  loader )\n  {\n    T1_Parser   parser = &loader->parser;\n    FT_Matrix*  matrix = &face->type1.font_matrix;\n    FT_Vector*  offset = &face->type1.font_offset;\n    FT_Face     root   = (FT_Face)&face->root;\n    FT_Fixed    temp[6] = {0, 0, 0, 0, 0, 0};\n    FT_Fixed    temp_scale = 0;\n    FT_Int      result;\n\n\n    result = T1_ToFixedArray( parser, 6, temp, 3 );\n\n    if ( result < 0 )\n    {\n      parser->root.error = FT_THROW( Invalid_File_Format );\n      return;\n    }\n\n    temp_scale = FT_ABS( temp[3] );\n\n    if ( temp_scale == 0 )\n    {\n      FT_ERROR(( \"t1_parse_font_matrix: invalid font matrix\\n\" ));\n      parser->root.error = FT_THROW( Invalid_File_Format );\n      return;\n    }\n\n    /* Set Units per EM based on FontMatrix values.  We set the value to */\n    /* 1000 / temp_scale, because temp_scale was already multiplied by   */\n    /* 1000 (in t1_tofixed, from psobjs.c).                              */\n\n    root->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale );\n\n    /* we need to scale the values by 1.0/temp_scale */\n    if ( temp_scale != 0x10000L )\n    {\n      temp[0] = FT_DivFix( temp[0], temp_scale );\n      temp[1] = FT_DivFix( temp[1], temp_scale );\n      temp[2] = FT_DivFix( temp[2], temp_scale );\n      temp[4] = FT_DivFix( temp[4], temp_scale );\n      temp[5] = FT_DivFix( temp[5], temp_scale );\n      temp[3] = temp[3] < 0 ? -0x10000L : 0x10000L;\n    }\n\n    matrix->xx = temp[0];\n    matrix->yx = temp[1];\n    matrix->xy = temp[2];\n    matrix->yy = temp[3];\n\n    /* note that the offsets must be expressed in integer font units */\n    offset->x = temp[4] >> 16;\n    offset->y = temp[5] >> 16;\n  }\n\n\n  static void\n  parse_encoding( T1_Face    face,\n                  T1_Loader  loader )\n  {\n    T1_Parser  parser = &loader->parser;\n    FT_Byte*   cur;\n    FT_Byte*   limit  = parser->root.limit;\n\n    PSAux_Service  psaux = (PSAux_Service)face->psaux;\n\n\n    T1_Skip_Spaces( parser );\n    cur = parser->root.cursor;\n    if ( cur >= limit )\n    {\n      FT_ERROR(( \"parse_encoding: out of bounds\\n\" ));\n      parser->root.error = FT_THROW( Invalid_File_Format );\n      return;\n    }\n\n    /* if we have a number or `[', the encoding is an array, */\n    /* and we must load it now                               */\n    if ( ft_isdigit( *cur ) || *cur == '[' )\n    {\n      T1_Encoding  encode          = &face->type1.encoding;\n      FT_Int       count, n;\n      PS_Table     char_table      = &loader->encoding_table;\n      FT_Memory    memory          = parser->root.memory;\n      FT_Error     error;\n      FT_Bool      only_immediates = 0;\n\n\n      /* read the number of entries in the encoding; should be 256 */\n      if ( *cur == '[' )\n      {\n        count           = 256;\n        only_immediates = 1;\n        parser->root.cursor++;\n      }\n      else\n        count = (FT_Int)T1_ToInt( parser );\n\n      T1_Skip_Spaces( parser );\n      if ( parser->root.cursor >= limit )\n        return;\n\n      /* we use a T1_Table to store our charnames */\n      loader->num_chars = encode->num_chars = count;\n      if ( FT_NEW_ARRAY( encode->char_index, count )     ||\n           FT_NEW_ARRAY( encode->char_name,  count )     ||\n           FT_SET_ERROR( psaux->ps_table_funcs->init(\n                           char_table, count, memory ) ) )\n      {\n        parser->root.error = error;\n        return;\n      }\n\n      /* We need to `zero' out encoding_table.elements */\n      for ( n = 0; n < count; n++ )\n      {\n        char*  notdef = (char *)\".notdef\";\n\n\n        T1_Add_Table( char_table, n, notdef, 8 );\n      }\n\n      /* Now we need to read records of the form                */\n      /*                                                        */\n      /*   ... charcode /charname ...                           */\n      /*                                                        */\n      /* for each entry in our table.                           */\n      /*                                                        */\n      /* We simply look for a number followed by an immediate   */\n      /* name.  Note that this ignores correctly the sequence   */\n      /* that is often seen in type1 fonts:                     */\n      /*                                                        */\n      /*   0 1 255 { 1 index exch /.notdef put } for dup        */\n      /*                                                        */\n      /* used to clean the encoding array before anything else. */\n      /*                                                        */\n      /* Alternatively, if the array is directly given as       */\n      /*                                                        */\n      /*   /Encoding [ ... ]                                    */\n      /*                                                        */\n      /* we only read immediates.                               */\n\n      n = 0;\n      T1_Skip_Spaces( parser );\n\n      while ( parser->root.cursor < limit )\n      {\n        cur = parser->root.cursor;\n\n        /* we stop when we encounter a `def' or `]' */\n        if ( *cur == 'd' && cur + 3 < limit )\n        {\n          if ( cur[1] == 'e'         &&\n               cur[2] == 'f'         &&\n               IS_PS_DELIM( cur[3] ) )\n          {\n            FT_TRACE6(( \"encoding end\\n\" ));\n            cur += 3;\n            break;\n          }\n        }\n        if ( *cur == ']' )\n        {\n          FT_TRACE6(( \"encoding end\\n\" ));\n          cur++;\n          break;\n        }\n\n        /* check whether we've found an entry */\n        if ( ft_isdigit( *cur ) || only_immediates )\n        {\n          FT_Int  charcode;\n\n\n          if ( only_immediates )\n            charcode = n;\n          else\n          {\n            charcode = (FT_Int)T1_ToInt( parser );\n            T1_Skip_Spaces( parser );\n          }\n\n          cur = parser->root.cursor;\n\n          if ( cur + 2 < limit && *cur == '/' && n < count )\n          {\n            FT_PtrDist  len;\n\n\n            cur++;\n\n            parser->root.cursor = cur;\n            T1_Skip_PS_Token( parser );\n            if ( parser->root.cursor >= limit )\n              return;\n            if ( parser->root.error )\n              return;\n\n            len = parser->root.cursor - cur;\n\n            parser->root.error = T1_Add_Table( char_table, charcode,\n                                               cur, len + 1 );\n            if ( parser->root.error )\n              return;\n            char_table->elements[charcode][len] = '\\0';\n\n            n++;\n          }\n          else if ( only_immediates )\n          {\n            /* Since the current position is not updated for           */\n            /* immediates-only mode we would get an infinite loop if   */\n            /* we don't do anything here.                              */\n            /*                                                         */\n            /* This encoding array is not valid according to the type1 */\n            /* specification (it might be an encoding for a CID type1  */\n            /* font, however), so we conclude that this font is NOT a  */\n            /* type1 font.                                             */\n            parser->root.error = FT_THROW( Unknown_File_Format );\n            return;\n          }\n        }\n        else\n        {\n          T1_Skip_PS_Token( parser );\n          if ( parser->root.error )\n            return;\n        }\n\n        T1_Skip_Spaces( parser );\n      }\n\n      face->type1.encoding_type = T1_ENCODING_TYPE_ARRAY;\n      parser->root.cursor       = cur;\n    }\n\n    /* Otherwise, we should have either `StandardEncoding', */\n    /* `ExpertEncoding', or `ISOLatin1Encoding'             */\n    else\n    {\n      if ( cur + 17 < limit                                            &&\n           ft_strncmp( (const char*)cur, \"StandardEncoding\", 16 ) == 0 )\n        face->type1.encoding_type = T1_ENCODING_TYPE_STANDARD;\n\n      else if ( cur + 15 < limit                                          &&\n                ft_strncmp( (const char*)cur, \"ExpertEncoding\", 14 ) == 0 )\n        face->type1.encoding_type = T1_ENCODING_TYPE_EXPERT;\n\n      else if ( cur + 18 < limit                                             &&\n                ft_strncmp( (const char*)cur, \"ISOLatin1Encoding\", 17 ) == 0 )\n        face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1;\n\n      else\n        parser->root.error = FT_ERR( Ignore );\n    }\n  }\n\n\n  static void\n  parse_subrs( T1_Face    face,\n               T1_Loader  loader )\n  {\n    T1_Parser  parser = &loader->parser;\n    PS_Table   table  = &loader->subrs;\n    FT_Memory  memory = parser->root.memory;\n    FT_Error   error;\n    FT_Int     num_subrs;\n\n    PSAux_Service  psaux = (PSAux_Service)face->psaux;\n\n\n    T1_Skip_Spaces( parser );\n\n    /* test for empty array */\n    if ( parser->root.cursor < parser->root.limit &&\n         *parser->root.cursor == '['              )\n    {\n      T1_Skip_PS_Token( parser );\n      T1_Skip_Spaces  ( parser );\n      if ( parser->root.cursor >= parser->root.limit ||\n           *parser->root.cursor != ']'               )\n        parser->root.error = FT_THROW( Invalid_File_Format );\n      return;\n    }\n\n    num_subrs = (FT_Int)T1_ToInt( parser );\n\n    /* position the parser right before the `dup' of the first subr */\n    T1_Skip_PS_Token( parser );         /* `array' */\n    if ( parser->root.error )\n      return;\n    T1_Skip_Spaces( parser );\n\n    /* initialize subrs array -- with synthetic fonts it is possible */\n    /* we get here twice                                             */\n    if ( !loader->num_subrs )\n    {\n      error = psaux->ps_table_funcs->init( table, num_subrs, memory );\n      if ( error )\n        goto Fail;\n    }\n\n    /* the format is simple:   */\n    /*                         */\n    /*   `index' + binary data */\n    /*                         */\n    for (;;)\n    {\n      FT_Long   idx, size;\n      FT_Byte*  base;\n\n\n      /* If we are out of data, or if the next token isn't `dup', */\n      /* we are done.                                             */\n      if ( parser->root.cursor + 4 >= parser->root.limit          ||\n          ft_strncmp( (char*)parser->root.cursor, \"dup\", 3 ) != 0 )\n        break;\n\n      T1_Skip_PS_Token( parser );       /* `dup' */\n\n      idx = T1_ToInt( parser );\n\n      if ( !read_binary_data( parser, &size, &base, IS_INCREMENTAL ) )\n        return;\n\n      /* The binary string is followed by one token, e.g. `NP' */\n      /* (bound to `noaccess put') or by two separate tokens:  */\n      /* `noaccess' & `put'.  We position the parser right     */\n      /* before the next `dup', if any.                        */\n      T1_Skip_PS_Token( parser );   /* `NP' or `|' or `noaccess' */\n      if ( parser->root.error )\n        return;\n      T1_Skip_Spaces  ( parser );\n\n      if ( parser->root.cursor + 4 < parser->root.limit            &&\n           ft_strncmp( (char*)parser->root.cursor, \"put\", 3 ) == 0 )\n      {\n        T1_Skip_PS_Token( parser ); /* skip `put' */\n        T1_Skip_Spaces  ( parser );\n      }\n\n      /* with synthetic fonts it is possible we get here twice */\n      if ( loader->num_subrs )\n        continue;\n\n      /* some fonts use a value of -1 for lenIV to indicate that */\n      /* the charstrings are unencoded                           */\n      /*                                                         */\n      /* thanks to Tom Kacvinsky for pointing this out           */\n      /*                                                         */\n      if ( face->type1.private_dict.lenIV >= 0 )\n      {\n        FT_Byte*  temp;\n\n\n        /* some fonts define empty subr records -- this is not totally */\n        /* compliant to the specification (which says they should at   */\n        /* least contain a `return'), but we support them anyway       */\n        if ( size < face->type1.private_dict.lenIV )\n        {\n          error = FT_THROW( Invalid_File_Format );\n          goto Fail;\n        }\n\n        /* t1_decrypt() shouldn't write to base -- make temporary copy */\n        if ( FT_ALLOC( temp, size ) )\n          goto Fail;\n        FT_MEM_COPY( temp, base, size );\n        psaux->t1_decrypt( temp, size, 4330 );\n        size -= face->type1.private_dict.lenIV;\n        error = T1_Add_Table( table, (FT_Int)idx,\n                              temp + face->type1.private_dict.lenIV, size );\n        FT_FREE( temp );\n      }\n      else\n        error = T1_Add_Table( table, (FT_Int)idx, base, size );\n      if ( error )\n        goto Fail;\n    }\n\n    if ( !loader->num_subrs )\n      loader->num_subrs = num_subrs;\n\n    return;\n\n  Fail:\n    parser->root.error = error;\n  }\n\n\n#define TABLE_EXTEND  5\n\n\n  static void\n  parse_charstrings( T1_Face    face,\n                     T1_Loader  loader )\n  {\n    T1_Parser      parser       = &loader->parser;\n    PS_Table       code_table   = &loader->charstrings;\n    PS_Table       name_table   = &loader->glyph_names;\n    PS_Table       swap_table   = &loader->swap_table;\n    FT_Memory      memory       = parser->root.memory;\n    FT_Error       error;\n\n    PSAux_Service  psaux        = (PSAux_Service)face->psaux;\n\n    FT_Byte*       cur;\n    FT_Byte*       limit        = parser->root.limit;\n    FT_Int         n, num_glyphs;\n    FT_UInt        notdef_index = 0;\n    FT_Byte        notdef_found = 0;\n\n\n    num_glyphs = (FT_Int)T1_ToInt( parser );\n    if ( num_glyphs < 0 )\n    {\n      error = FT_THROW( Invalid_File_Format );\n      goto Fail;\n    }\n\n    /* some fonts like Optima-Oblique not only define the /CharStrings */\n    /* array but access it also                                        */\n    if ( num_glyphs == 0 || parser->root.error )\n      return;\n\n    /* initialize tables, leaving space for addition of .notdef, */\n    /* if necessary, and a few other glyphs to handle buggy      */\n    /* fonts which have more glyphs than specified.              */\n\n    /* for some non-standard fonts like `Optima' which provides  */\n    /* different outlines depending on the resolution it is      */\n    /* possible to get here twice                                */\n    if ( !loader->num_glyphs )\n    {\n      error = psaux->ps_table_funcs->init(\n                code_table, num_glyphs + 1 + TABLE_EXTEND, memory );\n      if ( error )\n        goto Fail;\n\n      error = psaux->ps_table_funcs->init(\n                name_table, num_glyphs + 1 + TABLE_EXTEND, memory );\n      if ( error )\n        goto Fail;\n\n      /* Initialize table for swapping index notdef_index and */\n      /* index 0 names and codes (if necessary).              */\n\n      error = psaux->ps_table_funcs->init( swap_table, 4, memory );\n      if ( error )\n        goto Fail;\n    }\n\n    n = 0;\n\n    for (;;)\n    {\n      FT_Long   size;\n      FT_Byte*  base;\n\n\n      /* the format is simple:        */\n      /*   `/glyphname' + binary data */\n\n      T1_Skip_Spaces( parser );\n\n      cur = parser->root.cursor;\n      if ( cur >= limit )\n        break;\n\n      /* we stop when we find a `def' or `end' keyword */\n      if ( cur + 3 < limit && IS_PS_DELIM( cur[3] ) )\n      {\n        if ( cur[0] == 'd' &&\n             cur[1] == 'e' &&\n             cur[2] == 'f' )\n        {\n          /* There are fonts which have this: */\n          /*                                  */\n          /*   /CharStrings 118 dict def      */\n          /*   Private begin                  */\n          /*   CharStrings begin              */\n          /*   ...                            */\n          /*                                  */\n          /* To catch this we ignore `def' if */\n          /* no charstring has actually been  */\n          /* seen.                            */\n          if ( n )\n            break;\n        }\n\n        if ( cur[0] == 'e' &&\n             cur[1] == 'n' &&\n             cur[2] == 'd' )\n          break;\n      }\n\n      T1_Skip_PS_Token( parser );\n      if ( parser->root.error )\n        return;\n\n      if ( *cur == '/' )\n      {\n        FT_PtrDist  len;\n\n\n        if ( cur + 1 >= limit )\n        {\n          error = FT_THROW( Invalid_File_Format );\n          goto Fail;\n        }\n\n        cur++;                              /* skip `/' */\n        len = parser->root.cursor - cur;\n\n        if ( !read_binary_data( parser, &size, &base, IS_INCREMENTAL ) )\n          return;\n\t\t/* xhl: Add boundary check here. Fix the bug reported by ifilter. */\n\t\t/* TESTDOC: bug# 0018509, 45.pdf. */\n\t\tif (base + size >= limit) {\n\t\t\terror = T1_Err_Invalid_File_Format;\n\t\t\tgoto Fail;\n\t\t}\n        /* for some non-standard fonts like `Optima' which provides */\n        /* different outlines depending on the resolution it is     */\n        /* possible to get here twice                               */\n        if ( loader->num_glyphs )\n          continue;\n\n        error = T1_Add_Table( name_table, n, cur, len + 1 );\n        if ( error )\n          goto Fail;\n\n        /* add a trailing zero to the name table */\n        name_table->elements[n][len] = '\\0';\n\n        /* record index of /.notdef */\n        if ( *cur == '.'                                              &&\n             ft_strcmp( \".notdef\",\n                        (const char*)(name_table->elements[n]) ) == 0 )\n        {\n          notdef_index = n;\n          notdef_found = 1;\n        }\n\n        if ( face->type1.private_dict.lenIV >= 0 &&\n             n < num_glyphs + TABLE_EXTEND       )\n        {\n          FT_Byte*  temp;\n\n\n          if ( size <= face->type1.private_dict.lenIV )\n          {\n            error = FT_THROW( Invalid_File_Format );\n            goto Fail;\n          }\n\n          /* t1_decrypt() shouldn't write to base -- make temporary copy */\n          if ( FT_ALLOC( temp, size ) )\n            goto Fail;\n          FT_MEM_COPY( temp, base, size );\n          psaux->t1_decrypt( temp, size, 4330 );\n          size -= face->type1.private_dict.lenIV;\n          error = T1_Add_Table( code_table, n,\n                                temp + face->type1.private_dict.lenIV, size );\n          FT_FREE( temp );\n        }\n        else\n          error = T1_Add_Table( code_table, n, base, size );\n        if ( error )\n          goto Fail;\n\n        n++;\n      }\n    }\n\n    loader->num_glyphs = n;\n\n    /* if /.notdef is found but does not occupy index 0, do our magic. */\n    if ( notdef_found                                                 &&\n         ft_strcmp( \".notdef\", (const char*)name_table->elements[0] ) )\n    {\n      /* Swap glyph in index 0 with /.notdef glyph.  First, add index 0  */\n      /* name and code entries to swap_table.  Then place notdef_index   */\n      /* name and code entries into swap_table.  Then swap name and code */\n      /* entries at indices notdef_index and 0 using values stored in    */\n      /* swap_table.                                                     */\n\n      /* Index 0 name */\n      error = T1_Add_Table( swap_table, 0,\n                            name_table->elements[0],\n                            name_table->lengths [0] );\n      if ( error )\n        goto Fail;\n\n      /* Index 0 code */\n      error = T1_Add_Table( swap_table, 1,\n                            code_table->elements[0],\n                            code_table->lengths [0] );\n      if ( error )\n        goto Fail;\n\n      /* Index notdef_index name */\n      error = T1_Add_Table( swap_table, 2,\n                            name_table->elements[notdef_index],\n                            name_table->lengths [notdef_index] );\n      if ( error )\n        goto Fail;\n\n      /* Index notdef_index code */\n      error = T1_Add_Table( swap_table, 3,\n                            code_table->elements[notdef_index],\n                            code_table->lengths [notdef_index] );\n      if ( error )\n        goto Fail;\n\n      error = T1_Add_Table( name_table, notdef_index,\n                            swap_table->elements[0],\n                            swap_table->lengths [0] );\n      if ( error )\n        goto Fail;\n\n      error = T1_Add_Table( code_table, notdef_index,\n                            swap_table->elements[1],\n                            swap_table->lengths [1] );\n      if ( error )\n        goto Fail;\n\n      error = T1_Add_Table( name_table, 0,\n                            swap_table->elements[2],\n                            swap_table->lengths [2] );\n      if ( error )\n        goto Fail;\n\n      error = T1_Add_Table( code_table, 0,\n                            swap_table->elements[3],\n                            swap_table->lengths [3] );\n      if ( error )\n        goto Fail;\n\n    }\n    else if ( !notdef_found )\n    {\n      /* notdef_index is already 0, or /.notdef is undefined in   */\n      /* charstrings dictionary.  Worry about /.notdef undefined. */\n      /* We take index 0 and add it to the end of the table(s)    */\n      /* and add our own /.notdef glyph to index 0.               */\n\n      /* 0 333 hsbw endchar */\n      FT_Byte  notdef_glyph[] = { 0x8B, 0xF7, 0xE1, 0x0D, 0x0E };\n      char*    notdef_name    = (char *)\".notdef\";\n\n\n      error = T1_Add_Table( swap_table, 0,\n                            name_table->elements[0],\n                            name_table->lengths [0] );\n      if ( error )\n        goto Fail;\n\n      error = T1_Add_Table( swap_table, 1,\n                            code_table->elements[0],\n                            code_table->lengths [0] );\n      if ( error )\n        goto Fail;\n\n      error = T1_Add_Table( name_table, 0, notdef_name, 8 );\n      if ( error )\n        goto Fail;\n\n      error = T1_Add_Table( code_table, 0, notdef_glyph, 5 );\n\n      if ( error )\n        goto Fail;\n\n      error = T1_Add_Table( name_table, n,\n                            swap_table->elements[0],\n                            swap_table->lengths [0] );\n      if ( error )\n        goto Fail;\n\n      error = T1_Add_Table( code_table, n,\n                            swap_table->elements[1],\n                            swap_table->lengths [1] );\n      if ( error )\n        goto Fail;\n\n      /* we added a glyph. */\n      loader->num_glyphs += 1;\n    }\n\n    return;\n\n  Fail:\n    parser->root.error = error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define the token field static variables.  This is a set of            */\n  /* T1_FieldRec variables.                                                */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  static\n  const T1_FieldRec  t1_keywords[] =\n  {\n\n#include \"t1tokens.h\"\n\n    /* now add the special functions... */\n    T1_FIELD_CALLBACK( \"FontMatrix\",           t1_parse_font_matrix,\n                       T1_FIELD_DICT_FONTDICT )\n    T1_FIELD_CALLBACK( \"Encoding\",             parse_encoding,\n                       T1_FIELD_DICT_FONTDICT )\n    T1_FIELD_CALLBACK( \"Subrs\",                parse_subrs,\n                       T1_FIELD_DICT_PRIVATE )\n    T1_FIELD_CALLBACK( \"CharStrings\",          parse_charstrings,\n                       T1_FIELD_DICT_PRIVATE )\n    T1_FIELD_CALLBACK( \"Private\",              parse_private,\n                       T1_FIELD_DICT_FONTDICT )\n\n#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT\n    T1_FIELD_CALLBACK( \"BlendDesignPositions\", parse_blend_design_positions,\n                       T1_FIELD_DICT_FONTDICT )\n    T1_FIELD_CALLBACK( \"BlendDesignMap\",       parse_blend_design_map,\n                       T1_FIELD_DICT_FONTDICT )\n    T1_FIELD_CALLBACK( \"BlendAxisTypes\",       parse_blend_axis_types,\n                       T1_FIELD_DICT_FONTDICT )\n    T1_FIELD_CALLBACK( \"WeightVector\",         parse_weight_vector,\n                       T1_FIELD_DICT_FONTDICT )\n    T1_FIELD_CALLBACK( \"BuildCharArray\",       parse_buildchar,\n                       T1_FIELD_DICT_PRIVATE )\n#endif\n\n    { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 }\n  };\n\n\n#define T1_FIELD_COUNT                                           \\\n          ( sizeof ( t1_keywords ) / sizeof ( t1_keywords[0] ) )\n\n\n  static FT_Error\n  parse_dict( T1_Face    face,\n              T1_Loader  loader,\n              FT_Byte*   base,\n              FT_Long    size )\n  {\n    T1_Parser  parser = &loader->parser;\n    FT_Byte   *limit, *start_binary = NULL;\n    FT_Bool    have_integer = 0;\n\n\n    parser->root.cursor = base;\n    parser->root.limit  = base + size;\n    parser->root.error  = FT_Err_Ok;\n\n    limit = parser->root.limit;\n\n    T1_Skip_Spaces( parser );\n\n    while ( parser->root.cursor < limit )\n    {\n      FT_Byte*  cur;\n\n\n      cur = parser->root.cursor;\n\n      /* look for `eexec' */\n      if ( IS_PS_TOKEN( cur, limit, \"eexec\" ) )\n        break;\n\n      /* look for `closefile' which ends the eexec section */\n      else if ( IS_PS_TOKEN( cur, limit, \"closefile\" ) )\n        break;\n\n      /* in a synthetic font the base font starts after a           */\n      /* `FontDictionary' token that is placed after a Private dict */\n      else if ( IS_PS_TOKEN( cur, limit, \"FontDirectory\" ) )\n      {\n        if ( loader->keywords_encountered & T1_PRIVATE )\n          loader->keywords_encountered |=\n            T1_FONTDIR_AFTER_PRIVATE;\n        parser->root.cursor += 13;\n      }\n\n      /* check whether we have an integer */\n      else if ( ft_isdigit( *cur ) )\n      {\n        start_binary = cur;\n        T1_Skip_PS_Token( parser );\n        if ( parser->root.error )\n          goto Exit;\n        have_integer = 1;\n      }\n\n      /* in valid Type 1 fonts we don't see `RD' or `-|' directly */\n      /* since those tokens are handled by parse_subrs and        */\n      /* parse_charstrings                                        */\n      else if ( *cur == 'R' && cur + 6 < limit && *(cur + 1) == 'D' &&\n                have_integer )\n      {\n        FT_Long   s;\n        FT_Byte*  b;\n\n\n        parser->root.cursor = start_binary;\n        if ( !read_binary_data( parser, &s, &b, IS_INCREMENTAL ) )\n          return FT_THROW( Invalid_File_Format );\n        have_integer = 0;\n      }\n\n      else if ( *cur == '-' && cur + 6 < limit && *(cur + 1) == '|' &&\n                have_integer )\n      {\n        FT_Long   s;\n        FT_Byte*  b;\n\n\n        parser->root.cursor = start_binary;\n        if ( !read_binary_data( parser, &s, &b, IS_INCREMENTAL ) )\n          return FT_THROW( Invalid_File_Format );\n        have_integer = 0;\n      }\n\n      /* look for immediates */\n      else if ( *cur == '/' && cur + 2 < limit )\n      {\n        FT_PtrDist  len;\n\n\n        cur++;\n\n        parser->root.cursor = cur;\n        T1_Skip_PS_Token( parser );\n        if ( parser->root.error )\n          goto Exit;\n\n        len = parser->root.cursor - cur;\n\n        if ( len > 0 && len < 22 && parser->root.cursor < limit )\n        {\n          /* now compare the immediate name to the keyword table */\n          T1_Field  keyword = (T1_Field)t1_keywords;\n\n\n          for (;;)\n          {\n            FT_Byte*  name;\n\n\n            name = (FT_Byte*)keyword->ident;\n            if ( !name )\n              break;\n\n            if ( cur[0] == name[0]                                  &&\n                 len == (FT_PtrDist)ft_strlen( (const char *)name ) &&\n                 ft_memcmp( cur, name, len ) == 0                   )\n            {\n              /* We found it -- run the parsing callback!     */\n              /* We record every instance of every field      */\n              /* (until we reach the base font of a           */\n              /* synthetic font) to deal adequately with      */\n              /* multiple master fonts; this is also          */\n              /* necessary because later PostScript           */\n              /* definitions override earlier ones.           */\n\n              /* Once we encounter `FontDirectory' after      */\n              /* `/Private', we know that this is a synthetic */\n              /* font; except for `/CharStrings' we are not   */\n              /* interested in anything that follows this     */\n              /* `FontDirectory'.                             */\n\n              /* MM fonts have more than one /Private token at */\n              /* the top level; let's hope that all the junk   */\n              /* that follows the first /Private token is not  */\n              /* interesting to us.                            */\n\n              /* According to Adobe Tech Note #5175 (CID-Keyed */\n              /* Font Installation for ATM Software) a `begin' */\n              /* must be followed by exactly one `end', and    */\n              /* `begin' -- `end' pairs must be accurately     */\n              /* paired.  We could use this to distinguish     */\n              /* between the global Private and the Private    */\n              /* dict that is a member of the Blend dict.      */\n\n              const FT_UInt dict =\n                ( loader->keywords_encountered & T1_PRIVATE )\n                    ? T1_FIELD_DICT_PRIVATE\n                    : T1_FIELD_DICT_FONTDICT;\n\n              if ( !( dict & keyword->dict ) )\n              {\n                FT_TRACE1(( \"parse_dict: found `%s' but ignoring it\"\n                            \" since it is in the wrong dictionary\\n\",\n                            keyword->ident ));\n                break;\n              }\n\n              if ( !( loader->keywords_encountered &\n                      T1_FONTDIR_AFTER_PRIVATE     )                  ||\n                   ft_strcmp( (const char*)name, \"CharStrings\" ) == 0 )\n              {\n                parser->root.error = t1_load_keyword( face,\n                                                      loader,\n                                                      keyword );\n                if ( parser->root.error != FT_Err_Ok )\n                {\n                  if ( FT_ERR_EQ( parser->root.error, Ignore ) )\n                    parser->root.error = FT_Err_Ok;\n                  else\n                    return parser->root.error;\n                }\n              }\n              break;\n            }\n\n            keyword++;\n          }\n        }\n\n        have_integer = 0;\n      }\n      else\n      {\n        T1_Skip_PS_Token( parser );\n        if ( parser->root.error )\n          goto Exit;\n        have_integer = 0;\n      }\n\n      T1_Skip_Spaces( parser );\n    }\n\n  Exit:\n    return parser->root.error;\n  }\n\n\n  static void\n  t1_init_loader( T1_Loader  loader,\n                  T1_Face    face )\n  {\n    FT_UNUSED( face );\n\n    FT_MEM_ZERO( loader, sizeof ( *loader ) );\n    loader->num_glyphs = 0;\n    loader->num_chars  = 0;\n\n    /* initialize the tables -- simply set their `init' field to 0 */\n    loader->encoding_table.init  = 0;\n    loader->charstrings.init     = 0;\n    loader->glyph_names.init     = 0;\n    loader->subrs.init           = 0;\n    loader->swap_table.init      = 0;\n    loader->fontdata             = 0;\n    loader->keywords_encountered = 0;\n  }\n\n\n  static void\n  t1_done_loader( T1_Loader  loader )\n  {\n    T1_Parser  parser = &loader->parser;\n\n\n    /* finalize tables */\n    T1_Release_Table( &loader->encoding_table );\n    T1_Release_Table( &loader->charstrings );\n    T1_Release_Table( &loader->glyph_names );\n    T1_Release_Table( &loader->swap_table );\n    T1_Release_Table( &loader->subrs );\n\n    /* finalize parser */\n    T1_Finalize_Parser( parser );\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Open_Face( T1_Face  face )\n  {\n    T1_LoaderRec   loader;\n    T1_Parser      parser;\n    T1_Font        type1 = &face->type1;\n    PS_Private     priv  = &type1->private_dict;\n    FT_Error       error;\n\n    PSAux_Service  psaux = (PSAux_Service)face->psaux;\n\n\n    t1_init_loader( &loader, face );\n\n    /* default values */\n    face->ndv_idx          = -1;\n    face->cdv_idx          = -1;\n    face->len_buildchar    = 0;\n\n    priv->blue_shift       = 7;\n    priv->blue_fuzz        = 1;\n    priv->lenIV            = 4;\n    priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L );\n    priv->blue_scale       = (FT_Fixed)( 0.039625 * 0x10000L * 1000 );\n\n    parser = &loader.parser;\n    error  = T1_New_Parser( parser,\n                            face->root.stream,\n                            face->root.memory,\n                            psaux );\n    if ( error )\n      goto Exit;\n\n    error = parse_dict( face, &loader,\n                        parser->base_dict, parser->base_len );\n    if ( error )\n      goto Exit;\n\n    error = T1_Get_Private_Dict( parser, psaux );\n    if ( error )\n      goto Exit;\n\n    error = parse_dict( face, &loader,\n                        parser->private_dict, parser->private_len );\n    if ( error )\n      goto Exit;\n\n    /* ensure even-ness of `num_blue_values' */\n    priv->num_blue_values &= ~1;\n\n#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT\n\n    if ( face->blend                                                     &&\n         face->blend->num_default_design_vector != 0                     &&\n         face->blend->num_default_design_vector != face->blend->num_axis )\n    {\n      /* we don't use it currently so just warn, reset, and ignore */\n      FT_ERROR(( \"T1_Open_Face(): /DesignVector contains %u entries \"\n                 \"while there are %u axes.\\n\",\n                 face->blend->num_default_design_vector,\n                 face->blend->num_axis ));\n\n      face->blend->num_default_design_vector = 0;\n    }\n\n    /* the following can happen for MM instances; we then treat the */\n    /* font as a normal PS font                                     */\n    if ( face->blend                                             &&\n         ( !face->blend->num_designs || !face->blend->num_axis ) )\n      T1_Done_Blend( face );\n\n    /* another safety check */\n    if ( face->blend )\n    {\n      FT_UInt  i;\n\n\n      for ( i = 0; i < face->blend->num_axis; i++ )\n        if ( !face->blend->design_map[i].num_points )\n        {\n          T1_Done_Blend( face );\n          break;\n        }\n    }\n\n    if ( face->blend )\n    {\n      if ( face->len_buildchar > 0 )\n      {\n        FT_Memory  memory = face->root.memory;\n\n\n        if ( FT_NEW_ARRAY( face->buildchar, face->len_buildchar ) )\n        {\n          FT_ERROR(( \"T1_Open_Face: cannot allocate BuildCharArray\\n\" ));\n          face->len_buildchar = 0;\n          goto Exit;\n        }\n      }\n    }\n    else\n      face->len_buildchar = 0;\n\n#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */\n\n    /* now, propagate the subrs, charstrings, and glyphnames tables */\n    /* to the Type1 data                                            */\n    type1->num_glyphs = loader.num_glyphs;\n\n    if ( loader.subrs.init )\n    {\n      loader.subrs.init  = 0;\n      type1->num_subrs   = loader.num_subrs;\n      type1->subrs_block = loader.subrs.block;\n      type1->subrs       = loader.subrs.elements;\n      type1->subrs_len   = loader.subrs.lengths;\n    }\n\n    if ( !IS_INCREMENTAL )\n      if ( !loader.charstrings.init )\n      {\n        FT_ERROR(( \"T1_Open_Face: no `/CharStrings' array in face\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n      }\n\n    loader.charstrings.init  = 0;\n    type1->charstrings_block = loader.charstrings.block;\n    type1->charstrings       = loader.charstrings.elements;\n    type1->charstrings_len   = loader.charstrings.lengths;\n\n    /* we copy the glyph names `block' and `elements' fields; */\n    /* the `lengths' field must be released later             */\n    type1->glyph_names_block    = loader.glyph_names.block;\n    type1->glyph_names          = (FT_String**)loader.glyph_names.elements;\n    loader.glyph_names.block    = 0;\n    loader.glyph_names.elements = 0;\n\n    /* we must now build type1.encoding when we have a custom array */\n    if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY )\n    {\n      FT_Int    charcode, idx, min_char, max_char;\n      FT_Byte*  char_name;\n      FT_Byte*  glyph_name;\n\n\n      /* OK, we do the following: for each element in the encoding  */\n      /* table, look up the index of the glyph having the same name */\n      /* the index is then stored in type1.encoding.char_index, and */\n      /* the name to type1.encoding.char_name                       */\n\n      min_char = 0;\n      max_char = 0;\n\n      charcode = 0;\n      for ( ; charcode < loader.encoding_table.max_elems; charcode++ )\n      {\n        type1->encoding.char_index[charcode] = 0;\n        type1->encoding.char_name [charcode] = (char *)\".notdef\";\n\n        char_name = loader.encoding_table.elements[charcode];\n        if ( char_name )\n          for ( idx = 0; idx < type1->num_glyphs; idx++ )\n          {\n            glyph_name = (FT_Byte*)type1->glyph_names[idx];\n            if ( ft_strcmp( (const char*)char_name,\n                            (const char*)glyph_name ) == 0 )\n            {\n              type1->encoding.char_index[charcode] = (FT_UShort)idx;\n              type1->encoding.char_name [charcode] = (char*)glyph_name;\n\n              /* Change min/max encoded char only if glyph name is */\n              /* not /.notdef                                      */\n              if ( ft_strcmp( (const char*)\".notdef\",\n                              (const char*)glyph_name ) != 0 )\n              {\n                if ( charcode < min_char )\n                  min_char = charcode;\n                if ( charcode >= max_char )\n                  max_char = charcode + 1;\n              }\n              break;\n            }\n          }\n      }\n\n      type1->encoding.code_first = min_char;\n      type1->encoding.code_last  = max_char;\n      type1->encoding.num_chars  = loader.num_chars;\n    }\n\n  Exit:\n    t1_done_loader( &loader );\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1load.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1load.h                                                               */\n/*                                                                         */\n/*    Type 1 font loader (specification).                                  */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2004, 2006, 2007 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __T1LOAD_H__\n#define __T1LOAD_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/internal/psaux.h\"\n#include \"../../include/freetype/ftmm.h\"\n\n#include \"t1parse.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  typedef struct  T1_Loader_\n  {\n    T1_ParserRec  parser;          /* parser used to read the stream */\n\n    FT_Int        num_chars;       /* number of characters in encoding */\n    PS_TableRec   encoding_table;  /* PS_Table used to store the       */\n                                   /* encoding character names         */\n\n    FT_Int        num_glyphs;\n    PS_TableRec   glyph_names;\n    PS_TableRec   charstrings;\n    PS_TableRec   swap_table;      /* For moving .notdef glyph to index 0. */\n\n    FT_Int        num_subrs;\n    PS_TableRec   subrs;\n    FT_Bool       fontdata;\n\n    FT_UInt       keywords_encountered; /* T1_LOADER_ENCOUNTERED_XXX */\n\n  } T1_LoaderRec, *T1_Loader;\n\n\n  /* treatment of some keywords differs depending on whether */\n  /* they precede or follow certain other keywords           */\n\n#define T1_PRIVATE                ( 1 << 0 )\n#define T1_FONTDIR_AFTER_PRIVATE  ( 1 << 1 )\n\n\n  FT_LOCAL( FT_Error )\n  T1_Open_Face( T1_Face  face );\n\n#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT\n\n  FT_LOCAL( FT_Error )\n  T1_Get_Multi_Master( T1_Face           face,\n                       FT_Multi_Master*  master );\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Get_MM_Var( T1_Face      face,\n                 FT_MM_Var*  *master );\n\n  FT_LOCAL( FT_Error )\n  T1_Set_MM_Blend( T1_Face    face,\n                   FT_UInt    num_coords,\n                   FT_Fixed*  coords );\n\n  FT_LOCAL( FT_Error )\n  T1_Set_MM_Design( T1_Face   face,\n                    FT_UInt   num_coords,\n                    FT_Long*  coords );\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Set_Var_Design( T1_Face    face,\n                     FT_UInt    num_coords,\n                     FT_Fixed*  coords );\n\n  FT_LOCAL( void )\n  T1_Done_Blend( T1_Face  face );\n\n#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */\n\n\nFT_END_HEADER\n\n#endif /* __T1LOAD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1objs.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1objs.c                                                               */\n/*                                                                         */\n/*    Type 1 objects manager (body).                                       */\n/*                                                                         */\n/*  Copyright 1996-2009, 2011, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftcalc.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/ttnameid.h\"\n\n#include \"t1gload.h\"\n#include \"t1load.h\"\n\n#include \"t1errors.h\"\n\n#ifndef T1_CONFIG_OPTION_NO_AFM\n#include \"t1afm.h\"\n#endif\n\n#include \"../../include/freetype/internal/services/svpscmap.h\"\n#include \"../../include/freetype/internal/psaux.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_t1objs\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                            SIZE FUNCTIONS                             */\n  /*                                                                       */\n  /*  note that we store the global hints in the size's \"internal\" root    */\n  /*  field                                                                */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  static PSH_Globals_Funcs\n  T1_Size_Get_Globals_Funcs( T1_Size  size )\n  {\n    T1_Face           face     = (T1_Face)size->root.face;\n    PSHinter_Service  pshinter = (PSHinter_Service)face->pshinter;\n    FT_Module         module;\n\n\n    module = FT_Get_Module( size->root.face->driver->root.library,\n                            \"pshinter\" );\n    return ( module && pshinter && pshinter->get_globals_funcs )\n           ? pshinter->get_globals_funcs( module )\n           : 0 ;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  T1_Size_Done( FT_Size  t1size )          /* T1_Size */\n  {\n    T1_Size  size = (T1_Size)t1size;\n\n\n    if ( size->root.internal )\n    {\n      PSH_Globals_Funcs  funcs;\n\n\n      funcs = T1_Size_Get_Globals_Funcs( size );\n      if ( funcs )\n        funcs->destroy( (PSH_Globals)size->root.internal );\n\n      size->root.internal = 0;\n    }\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Size_Init( FT_Size  t1size )      /* T1_Size */\n  {\n    T1_Size            size  = (T1_Size)t1size;\n    FT_Error           error = FT_Err_Ok;\n    PSH_Globals_Funcs  funcs = T1_Size_Get_Globals_Funcs( size );\n\n\n    if ( funcs )\n    {\n      PSH_Globals  globals;\n      T1_Face      face = (T1_Face)size->root.face;\n\n\n      error = funcs->create( size->root.face->memory,\n                             &face->type1.private_dict, &globals );\n      if ( !error )\n        size->root.internal = (FT_Size_Internal)(void*)globals;\n    }\n\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Size_Request( FT_Size          t1size,     /* T1_Size */\n                   FT_Size_Request  req )\n  {\n    T1_Size            size  = (T1_Size)t1size;\n    PSH_Globals_Funcs  funcs = T1_Size_Get_Globals_Funcs( size );\n\n\n    FT_Request_Metrics( size->root.face, req );\n\n    if ( funcs )\n      funcs->set_scale( (PSH_Globals)size->root.internal,\n                        size->root.metrics.x_scale,\n                        size->root.metrics.y_scale,\n                        0, 0 );\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                            SLOT  FUNCTIONS                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n  FT_LOCAL_DEF( void )\n  T1_GlyphSlot_Done( FT_GlyphSlot  slot )\n  {\n    slot->internal->glyph_hints = 0;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_GlyphSlot_Init( FT_GlyphSlot  slot )\n  {\n    T1_Face           face;\n    PSHinter_Service  pshinter;\n\n\n    face     = (T1_Face)slot->face;\n    pshinter = (PSHinter_Service)face->pshinter;\n\n    if ( pshinter )\n    {\n      FT_Module  module;\n\n\n      module = FT_Get_Module( slot->face->driver->root.library,\n                              \"pshinter\" );\n      if ( module )\n      {\n        T1_Hints_Funcs  funcs;\n\n\n        funcs = pshinter->get_t1_funcs( module );\n        slot->internal->glyph_hints = (void*)funcs;\n      }\n    }\n\n    return 0;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                            FACE  FUNCTIONS                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    T1_Face_Done                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The face object destructor.                                        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A typeless pointer to the face object to destroy.          */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  T1_Face_Done( FT_Face  t1face )         /* T1_Face */\n  {\n    T1_Face    face = (T1_Face)t1face;\n    FT_Memory  memory;\n    T1_Font    type1;\n\n\n    if ( !face )\n      return;\n\n    memory = face->root.memory;\n    type1  = &face->type1;\n\n#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT\n    /* release multiple masters information */\n    FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) );\n\n    if ( face->buildchar )\n    {\n      FT_FREE( face->buildchar );\n\n      face->buildchar     = NULL;\n      face->len_buildchar = 0;\n    }\n\n    T1_Done_Blend( face );\n    face->blend = 0;\n#endif\n\n    /* release font info strings */\n    {\n      PS_FontInfo  info = &type1->font_info;\n\n\n      FT_FREE( info->version );\n      FT_FREE( info->notice );\n      FT_FREE( info->full_name );\n      FT_FREE( info->family_name );\n      FT_FREE( info->weight );\n    }\n\n    /* release top dictionary */\n    FT_FREE( type1->charstrings_len );\n    FT_FREE( type1->charstrings );\n    FT_FREE( type1->glyph_names );\n\n    FT_FREE( type1->subrs );\n    FT_FREE( type1->subrs_len );\n\n    FT_FREE( type1->subrs_block );\n    FT_FREE( type1->charstrings_block );\n    FT_FREE( type1->glyph_names_block );\n\n    FT_FREE( type1->encoding.char_index );\n    FT_FREE( type1->encoding.char_name );\n    FT_FREE( type1->font_name );\n\n#ifndef T1_CONFIG_OPTION_NO_AFM\n    /* release afm data if present */\n    if ( face->afm_data )\n      T1_Done_Metrics( memory, (AFM_FontInfo)face->afm_data );\n#endif\n\n    /* release unicode map, if any */\n#if 0\n    FT_FREE( face->unicode_map_rec.maps );\n    face->unicode_map_rec.num_maps = 0;\n    face->unicode_map              = NULL;\n#endif\n\n    face->root.family_name = NULL;\n    face->root.style_name  = NULL;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    T1_Face_Init                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The face object constructor.                                       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream     ::  input stream where to load font data.               */\n  /*                                                                       */\n  /*    face_index :: The index of the font face in the resource.          */\n  /*                                                                       */\n  /*    num_params :: Number of additional generic parameters.  Ignored.   */\n  /*                                                                       */\n  /*    params     :: Additional generic parameters.  Ignored.             */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face       :: The face record to build.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  T1_Face_Init( FT_Stream      stream,\n                FT_Face        t1face,          /* T1_Face */\n                FT_Int         face_index,\n                FT_Int         num_params,\n                FT_Parameter*  params )\n  {\n    T1_Face             face = (T1_Face)t1face;\n    FT_Error            error;\n    FT_Service_PsCMaps  psnames;\n    PSAux_Service       psaux;\n    T1_Font             type1 = &face->type1;\n    PS_FontInfo         info = &type1->font_info;\n\n    FT_UNUSED( num_params );\n    FT_UNUSED( params );\n    FT_UNUSED( stream );\n\n\n    face->root.num_faces = 1;\n\n    FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );\n    face->psnames = psnames;\n\n    face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),\n                                           \"psaux\" );\n    psaux = (PSAux_Service)face->psaux;\n    if ( !psaux )\n    {\n      FT_ERROR(( \"T1_Face_Init: cannot access `psaux' module\\n\" ));\n      error = FT_THROW( Missing_Module );\n      goto Exit;\n    }\n\n    face->pshinter = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),\n                                              \"pshinter\" );\n\n    FT_TRACE2(( \"Type 1 driver\\n\" ));\n\n    /* open the tokenizer; this will also check the font format */\n    error = T1_Open_Face( face );\n    if ( error )\n      goto Exit;\n\n    /* if we just wanted to check the format, leave successfully now */\n    if ( face_index < 0 )\n      goto Exit;\n\n    /* check the face index */\n    if ( face_index > 0 )\n    {\n      FT_ERROR(( \"T1_Face_Init: invalid face index\\n\" ));\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    /* now load the font program into the face object */\n\n    /* initialize the face object fields */\n\n    /* set up root face fields */\n    {\n      FT_Face  root = (FT_Face)&face->root;\n\n\n      root->num_glyphs = type1->num_glyphs;\n      root->face_index = 0;\n\n      root->face_flags = FT_FACE_FLAG_SCALABLE    |\n                         FT_FACE_FLAG_HORIZONTAL  |\n                         FT_FACE_FLAG_GLYPH_NAMES |\n                         FT_FACE_FLAG_HINTER;\n\n      if ( info->is_fixed_pitch )\n        root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;\n\n      if ( face->blend )\n        root->face_flags |= FT_FACE_FLAG_MULTIPLE_MASTERS;\n\n      /* XXX: TODO -- add kerning with .afm support */\n\n\n      /* The following code to extract the family and the style is very   */\n      /* simplistic and might get some things wrong.  For a full-featured */\n      /* algorithm you might have a look at the whitepaper given at       */\n      /*                                                                  */\n      /*   http://blogs.msdn.com/text/archive/2007/04/23/wpf-font-selection-model.aspx */\n\n      /* get style name -- be careful, some broken fonts only */\n      /* have a `/FontName' dictionary entry!                 */\n      root->family_name = info->family_name;\n      root->style_name  = NULL;\n\n      if ( root->family_name )\n      {\n        char*  full   = info->full_name;\n        char*  family = root->family_name;\n\n\n        if ( full )\n        {\n          FT_Bool  the_same = TRUE;\n\n\n          while ( *full )\n          {\n            if ( *full == *family )\n            {\n              family++;\n              full++;\n            }\n            else\n            {\n              if ( *full == ' ' || *full == '-' )\n                full++;\n              else if ( *family == ' ' || *family == '-' )\n                family++;\n              else\n              {\n                the_same = FALSE;\n\n                if ( !*family )\n                  root->style_name = full;\n                break;\n              }\n            }\n          }\n\n          if ( the_same )\n            root->style_name = (char *)\"Regular\";\n        }\n      }\n      else\n      {\n        /* do we have a `/FontName'? */\n        if ( type1->font_name )\n          root->family_name = type1->font_name;\n      }\n\n      if ( !root->style_name )\n      {\n        if ( info->weight )\n          root->style_name = info->weight;\n        else\n          /* assume `Regular' style because we don't know better */\n          root->style_name = (char *)\"Regular\";\n      }\n\n      /* compute style flags */\n      root->style_flags = 0;\n      if ( info->italic_angle )\n        root->style_flags |= FT_STYLE_FLAG_ITALIC;\n      if ( info->weight )\n      {\n        if ( !ft_strcmp( info->weight, \"Bold\"  ) ||\n             !ft_strcmp( info->weight, \"Black\" ) )\n          root->style_flags |= FT_STYLE_FLAG_BOLD;\n      }\n\n      /* no embedded bitmap support */\n      root->num_fixed_sizes = 0;\n      root->available_sizes = 0;\n\n      root->bbox.xMin =   type1->font_bbox.xMin            >> 16;\n      root->bbox.yMin =   type1->font_bbox.yMin            >> 16;\n      /* no `U' suffix here to 0xFFFF! */\n      root->bbox.xMax = ( type1->font_bbox.xMax + 0xFFFF ) >> 16;\n      root->bbox.yMax = ( type1->font_bbox.yMax + 0xFFFF ) >> 16;\n\n      /* Set units_per_EM if we didn't set it in t1_parse_font_matrix. */\n      if ( !root->units_per_EM )\n        root->units_per_EM = 1000;\n\n      root->ascender  = (FT_Short)( root->bbox.yMax );\n      root->descender = (FT_Short)( root->bbox.yMin );\n\n      root->height = (FT_Short)( ( root->units_per_EM * 12 ) / 10 );\n      if ( root->height < root->ascender - root->descender )\n        root->height = (FT_Short)( root->ascender - root->descender );\n\n      /* now compute the maximum advance width */\n      root->max_advance_width =\n        (FT_Short)( root->bbox.xMax );\n      {\n        FT_Pos  max_advance;\n\n\n        error = T1_Compute_Max_Advance( face, &max_advance );\n\n        /* in case of error, keep the standard width */\n        if ( !error )\n          root->max_advance_width = (FT_Short)FIXED_TO_INT( max_advance );\n        else\n          error = FT_Err_Ok;   /* clear error */\n      }\n\n      root->max_advance_height = root->height;\n\n      root->underline_position  = (FT_Short)info->underline_position;\n      root->underline_thickness = (FT_Short)info->underline_thickness;\n    }\n\n    {\n      FT_Face  root = &face->root;\n\n\n      if ( psnames )\n      {\n        FT_CharMapRec    charmap;\n        T1_CMap_Classes  cmap_classes = psaux->t1_cmap_classes;\n        FT_CMap_Class    clazz;\n\n\n        charmap.face = root;\n\n        /* first of all, try to synthesize a Unicode charmap */\n        charmap.platform_id = TT_PLATFORM_MICROSOFT;\n        charmap.encoding_id = TT_MS_ID_UNICODE_CS;\n        charmap.encoding    = FT_ENCODING_UNICODE;\n\n        error = FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL );\n        if ( error                                      &&\n             FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) )\n          goto Exit;\n        error = FT_Err_Ok;\n\n        /* now, generate an Adobe Standard encoding when appropriate */\n        charmap.platform_id = TT_PLATFORM_ADOBE;\n        clazz               = NULL;\n\n        switch ( type1->encoding_type )\n        {\n        case T1_ENCODING_TYPE_STANDARD:\n          charmap.encoding    = FT_ENCODING_ADOBE_STANDARD;\n          charmap.encoding_id = TT_ADOBE_ID_STANDARD;\n          clazz               = cmap_classes->standard;\n          break;\n\n        case T1_ENCODING_TYPE_EXPERT:\n          charmap.encoding    = FT_ENCODING_ADOBE_EXPERT;\n          charmap.encoding_id = TT_ADOBE_ID_EXPERT;\n          clazz               = cmap_classes->expert;\n          break;\n\n        case T1_ENCODING_TYPE_ARRAY:\n          charmap.encoding    = FT_ENCODING_ADOBE_CUSTOM;\n          charmap.encoding_id = TT_ADOBE_ID_CUSTOM;\n          clazz               = cmap_classes->custom;\n          break;\n\n        case T1_ENCODING_TYPE_ISOLATIN1:\n          charmap.encoding    = FT_ENCODING_ADOBE_LATIN_1;\n          charmap.encoding_id = TT_ADOBE_ID_LATIN_1;\n          clazz               = cmap_classes->unicode;\n          break;\n\n        default:\n          ;\n        }\n\n        if ( clazz )\n          error = FT_CMap_New( clazz, NULL, &charmap, NULL );\n\n#if 0\n        /* Select default charmap */\n        if (root->num_charmaps)\n          root->charmap = root->charmaps[0];\n#endif\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    T1_Driver_Init                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initializes a given Type 1 driver object.                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    driver :: A handle to the target driver object.                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  T1_Driver_Init( FT_Module  driver )\n  {\n    FT_UNUSED( driver );\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    T1_Driver_Done                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Finalizes a given Type 1 driver.                                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    driver :: A handle to the target Type 1 driver.                    */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  T1_Driver_Done( FT_Module  driver )\n  {\n    FT_UNUSED( driver );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1objs.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1objs.h                                                               */\n/*                                                                         */\n/*    Type 1 objects manager (specification).                              */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2006, 2011 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __T1OBJS_H__\n#define __T1OBJS_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftobjs.h\"\n#include \"../../include/freetype/config/ftconfig.h\"\n#include \"../../include/freetype/internal/t1types.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /* The following structures must be defined by the hinter */\n  typedef struct T1_Size_Hints_   T1_Size_Hints;\n  typedef struct T1_Glyph_Hints_  T1_Glyph_Hints;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    T1_Size                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a Type 1 size object.                                  */\n  /*                                                                       */\n  typedef struct T1_SizeRec_*  T1_Size;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    T1_GlyphSlot                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a Type 1 glyph slot object.                            */\n  /*                                                                       */\n  typedef struct T1_GlyphSlotRec_*  T1_GlyphSlot;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    T1_CharMap                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a Type 1 character mapping object.                     */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The Type 1 format doesn't use a charmap but an encoding table.     */\n  /*    The driver is responsible for making up charmap objects            */\n  /*    corresponding to these tables.                                     */\n  /*                                                                       */\n  typedef struct T1_CharMapRec_*   T1_CharMap;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                  HERE BEGINS THE TYPE1 SPECIFIC STUFF                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    T1_SizeRec                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Type 1 size record.                                                */\n  /*                                                                       */\n  typedef struct  T1_SizeRec_\n  {\n    FT_SizeRec  root;\n\n  } T1_SizeRec;\n\n\n  FT_LOCAL( void )\n  T1_Size_Done( FT_Size  size );\n\n  FT_LOCAL( FT_Error )\n  T1_Size_Request( FT_Size          size,\n                   FT_Size_Request  req );\n\n  FT_LOCAL( FT_Error )\n  T1_Size_Init( FT_Size  size );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    T1_GlyphSlotRec                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Type 1 glyph slot record.                                          */\n  /*                                                                       */\n  typedef struct  T1_GlyphSlotRec_\n  {\n    FT_GlyphSlotRec  root;\n\n    FT_Bool          hint;\n    FT_Bool          scaled;\n\n    FT_Int           max_points;\n    FT_Int           max_contours;\n\n    FT_Fixed         x_scale;\n    FT_Fixed         y_scale;\n\n  } T1_GlyphSlotRec;\n\n\n  FT_LOCAL( FT_Error )\n  T1_Face_Init( FT_Stream      stream,\n                FT_Face        face,\n                FT_Int         face_index,\n                FT_Int         num_params,\n                FT_Parameter*  params );\n\n  FT_LOCAL( void )\n  T1_Face_Done( FT_Face  face );\n\n  FT_LOCAL( FT_Error )\n  T1_GlyphSlot_Init( FT_GlyphSlot  slot );\n\n  FT_LOCAL( void )\n  T1_GlyphSlot_Done( FT_GlyphSlot  slot );\n\n  FT_LOCAL( FT_Error )\n  T1_Driver_Init( FT_Module  driver );\n\n  FT_LOCAL( void )\n  T1_Driver_Done( FT_Module  driver );\n\n\nFT_END_HEADER\n\n#endif /* __T1OBJS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1parse.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1parse.c                                                              */\n/*                                                                         */\n/*    Type 1 parser (body).                                                */\n/*                                                                         */\n/*  Copyright 1996-2005, 2008, 2009, 2012, 2013 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The Type 1 parser is in charge of the following:                      */\n  /*                                                                       */\n  /*  - provide an implementation of a growing sequence of objects called  */\n  /*    a `T1_Table' (used to build various tables needed by the loader).  */\n  /*                                                                       */\n  /*  - opening .pfb and .pfa files to extract their top-level and private */\n  /*    dictionaries.                                                      */\n  /*                                                                       */\n  /*  - read numbers, arrays & strings from any dictionary.                */\n  /*                                                                       */\n  /* See `t1load.c' to see how data is loaded from the font file.          */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/ftdebug.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n#include \"../../include/freetype/internal/psaux.h\"\n\n#include \"t1parse.h\"\n\n#include \"t1errors.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_t1parse\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                   INPUT STREAM PARSER                         *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* see Adobe Technical Note 5040.Download_Fonts.pdf */\n\n  static FT_Error\n  read_pfb_tag( FT_Stream   stream,\n                FT_UShort  *atag,\n                FT_ULong   *asize )\n  {\n    FT_Error   error;\n    FT_UShort  tag;\n    FT_ULong   size;\n\n\n    *atag  = 0;\n    *asize = 0;\n\n    if ( !FT_READ_USHORT( tag ) )\n    {\n      if ( tag == 0x8001U || tag == 0x8002U )\n      {\n        if ( !FT_READ_ULONG_LE( size ) )\n          *asize = size;\n      }\n\n      *atag = tag;\n    }\n\n    return error;\n  }\n\n\n  static FT_Error\n  check_type1_format( FT_Stream    stream,\n                      const char*  header_string,\n                      size_t       header_length )\n  {\n    FT_Error   error;\n    FT_UShort  tag;\n    FT_ULong   dummy;\n\n\n    if ( FT_STREAM_SEEK( 0 ) )\n      goto Exit;\n\n    error = read_pfb_tag( stream, &tag, &dummy );\n    if ( error )\n      goto Exit;\n\n    /* We assume that the first segment in a PFB is always encoded as   */\n    /* text.  This might be wrong (and the specification doesn't insist */\n    /* on that), but we have never seen a counterexample.               */\n    if ( tag != 0x8001U && FT_STREAM_SEEK( 0 ) )\n      goto Exit;\n\n    if ( !FT_FRAME_ENTER( header_length ) )\n    {\n      error = FT_Err_Ok;\n\n      if ( ft_memcmp( stream->cursor, header_string, header_length ) != 0 )\n        error = FT_THROW( Unknown_File_Format );\n\n      FT_FRAME_EXIT();\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_New_Parser( T1_Parser      parser,\n                 FT_Stream      stream,\n                 FT_Memory      memory,\n                 PSAux_Service  psaux )\n  {\n    FT_Error   error;\n    FT_UShort  tag;\n    FT_ULong   size;\n\n\n    psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory );\n\n    parser->stream       = stream;\n    parser->base_len     = 0;\n    parser->base_dict    = 0;\n    parser->private_len  = 0;\n    parser->private_dict = 0;\n    parser->in_pfb       = 0;\n    parser->in_memory    = 0;\n    parser->single_block = 0;\n\n    /* check the header format */\n    error = check_type1_format( stream, \"%!PS-AdobeFont\", 14 );\n    if ( error )\n    {\n      if ( FT_ERR_NEQ( error, Unknown_File_Format ) )\n        goto Exit;\n\n      error = check_type1_format( stream, \"%!FontType\", 10 );\n      if ( error )\n      {\n        FT_TRACE2(( \"  not a Type 1 font\\n\" ));\n        goto Exit;\n      }\n    }\n\n    /******************************************************************/\n    /*                                                                */\n    /* Here a short summary of what is going on:                      */\n    /*                                                                */\n    /*   When creating a new Type 1 parser, we try to locate and load */\n    /*   the base dictionary if this is possible (i.e., for PFB       */\n    /*   files).  Otherwise, we load the whole font into memory.      */\n    /*                                                                */\n    /*   When `loading' the base dictionary, we only setup pointers   */\n    /*   in the case of a memory-based stream.  Otherwise, we         */\n    /*   allocate and load the base dictionary in it.                 */\n    /*                                                                */\n    /*   parser->in_pfb is set if we are in a binary (`.pfb') font.   */\n    /*   parser->in_memory is set if we have a memory stream.         */\n    /*                                                                */\n\n    /* try to compute the size of the base dictionary;     */\n    /* look for a Postscript binary file tag, i.e., 0x8001 */\n    if ( FT_STREAM_SEEK( 0L ) )\n      goto Exit;\n\n    error = read_pfb_tag( stream, &tag, &size );\n    if ( error )\n      goto Exit;\n\n    if ( tag != 0x8001U )\n    {\n      /* assume that this is a PFA file for now; an error will */\n      /* be produced later when more things are checked        */\n      if ( FT_STREAM_SEEK( 0L ) )\n        goto Exit;\n      size = stream->size;\n    }\n    else\n      parser->in_pfb = 1;\n\n    /* now, try to load `size' bytes of the `base' dictionary we */\n    /* found previously                                          */\n\n    /* if it is a memory-based resource, set up pointers */\n    if ( !stream->read )\n    {\n      parser->base_dict = (FT_Byte*)stream->base + stream->pos;\n      parser->base_len  = size;\n      parser->in_memory = 1;\n\n      /* check that the `size' field is valid */\n      if ( FT_STREAM_SKIP( size ) )\n        goto Exit;\n    }\n    else\n    {\n      /* read segment in memory -- this is clumsy, but so does the format */\n      if ( FT_ALLOC( parser->base_dict, size )       ||\n           FT_STREAM_READ( parser->base_dict, size ) )\n        goto Exit;\n      parser->base_len = size;\n    }\n\n    parser->root.base   = parser->base_dict;\n    parser->root.cursor = parser->base_dict;\n    parser->root.limit  = parser->root.cursor + parser->base_len;\n\n  Exit:\n    if ( error && !parser->in_memory )\n      FT_FREE( parser->base_dict );\n\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  T1_Finalize_Parser( T1_Parser  parser )\n  {\n    FT_Memory  memory = parser->root.memory;\n\n\n    /* always free the private dictionary */\n    FT_FREE( parser->private_dict );\n\n    /* free the base dictionary only when we have a disk stream */\n    if ( !parser->in_memory )\n      FT_FREE( parser->base_dict );\n\n    parser->root.funcs.done( &parser->root );\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Get_Private_Dict( T1_Parser      parser,\n                       PSAux_Service  psaux )\n  {\n    FT_Stream  stream = parser->stream;\n    FT_Memory  memory = parser->root.memory;\n    FT_Error   error  = FT_Err_Ok;\n    FT_ULong   size;\n\n\n    if ( parser->in_pfb )\n    {\n      /* in the case of the PFB format, the private dictionary can be  */\n      /* made of several segments.  We thus first read the number of   */\n      /* segments to compute the total size of the private dictionary  */\n      /* then re-read them into memory.                                */\n      FT_Long    start_pos = FT_STREAM_POS();\n      FT_UShort  tag;\n\n\n      parser->private_len = 0;\n      for (;;)\n      {\n        error = read_pfb_tag( stream, &tag, &size );\n        if ( error )\n          goto Fail;\n\n        if ( tag != 0x8002U )\n          break;\n\n        parser->private_len += size;\n\n        if ( FT_STREAM_SKIP( size ) )\n          goto Fail;\n      }\n\n      /* Check that we have a private dictionary there */\n      /* and allocate private dictionary buffer        */\n      if ( parser->private_len == 0 )\n      {\n        FT_ERROR(( \"T1_Get_Private_Dict:\"\n                   \" invalid private dictionary section\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Fail;\n      }\n\n      if ( FT_STREAM_SEEK( start_pos )                           ||\n           FT_ALLOC( parser->private_dict, parser->private_len ) )\n        goto Fail;\n\n      parser->private_len = 0;\n      for (;;)\n      {\n        error = read_pfb_tag( stream, &tag, &size );\n        if ( error || tag != 0x8002U )\n        {\n          error = FT_Err_Ok;\n          break;\n        }\n\n        if ( FT_STREAM_READ( parser->private_dict + parser->private_len,\n                             size ) )\n          goto Fail;\n\n        parser->private_len += size;\n      }\n    }\n    else\n    {\n      /* We have already `loaded' the whole PFA font file into memory; */\n      /* if this is a memory resource, allocate a new block to hold    */\n      /* the private dict.  Otherwise, simply overwrite into the base  */\n      /* dictionary block in the heap.                                 */\n\n      /* first of all, look at the `eexec' keyword */\n      FT_Byte*  cur   = parser->base_dict;\n      FT_Byte*  limit = cur + parser->base_len;\n      FT_Byte   c;\n\n\n    Again:\n      for (;;)\n      {\n        c = cur[0];\n        if ( c == 'e' && cur + 9 < limit )  /* 9 = 5 letters for `eexec' + */\n                                            /* whitespace + 4 chars        */\n        {\n          if ( cur[1] == 'e' &&\n               cur[2] == 'x' &&\n               cur[3] == 'e' &&\n               cur[4] == 'c' )\n            break;\n        }\n        cur++;\n        if ( cur >= limit )\n        {\n          FT_ERROR(( \"T1_Get_Private_Dict:\"\n                     \" could not find `eexec' keyword\\n\" ));\n          error = FT_THROW( Invalid_File_Format );\n          goto Exit;\n        }\n      }\n\n      /* check whether `eexec' was real -- it could be in a comment */\n      /* or string (as e.g. in u003043t.gsf from ghostscript)       */\n\n      parser->root.cursor = parser->base_dict;\n      /* set limit to `eexec' + whitespace + 4 characters */\n      parser->root.limit  = cur + 10;\n\n      cur   = parser->root.cursor;\n      limit = parser->root.limit;\n\n      while ( cur < limit )\n      {\n        if ( *cur == 'e' && ft_strncmp( (char*)cur, \"eexec\", 5 ) == 0 )\n          goto Found;\n\n        T1_Skip_PS_Token( parser );\n        if ( parser->root.error )\n          break;\n        T1_Skip_Spaces  ( parser );\n        cur = parser->root.cursor;\n      }\n\n      /* we haven't found the correct `eexec'; go back and continue */\n      /* searching                                                  */\n\n      cur   = limit;\n      limit = parser->base_dict + parser->base_len;\n      goto Again;\n\n      /* now determine where to write the _encrypted_ binary private  */\n      /* dictionary.  We overwrite the base dictionary for disk-based */\n      /* resources and allocate a new block otherwise                 */\n\n    Found:\n      parser->root.limit = parser->base_dict + parser->base_len;\n\n      T1_Skip_PS_Token( parser );\n      cur   = parser->root.cursor;\n      limit = parser->root.limit;\n\n      /* according to the Type1 spec, the first cipher byte must not be  */\n      /* an ASCII whitespace character code (blank, tab, carriage return */\n      /* or line feed).  We have seen Type 1 fonts with two line feed    */\n      /* characters...  So skip now all whitespace character codes.      */\n      while ( cur < limit       &&\n              ( *cur == ' '  ||\n                *cur == '\\t' ||\n                *cur == '\\r' ||\n                *cur == '\\n' ) )\n        ++cur;\n      if ( cur >= limit )\n      {\n        FT_ERROR(( \"T1_Get_Private_Dict:\"\n                   \" `eexec' not properly terminated\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n\n      size = (FT_ULong)( parser->base_len - ( cur - parser->base_dict ) );\n\n      if ( parser->in_memory )\n      {\n        /* note that we allocate one more byte to put a terminating `0' */\n        if ( FT_ALLOC( parser->private_dict, size + 1 ) )\n          goto Fail;\n        parser->private_len = size;\n      }\n      else\n      {\n        parser->single_block = 1;\n        parser->private_dict = parser->base_dict;\n        parser->private_len  = size;\n        parser->base_dict    = 0;\n        parser->base_len     = 0;\n      }\n\n      /* now determine whether the private dictionary is encoded in binary */\n      /* or hexadecimal ASCII format -- decode it accordingly              */\n\n      /* we need to access the next 4 bytes (after the final whitespace */\n      /* following the `eexec' keyword); if they all are hexadecimal    */\n      /* digits, then we have a case of ASCII storage                   */\n\n      if ( cur + 3 < limit                                &&\n           ft_isxdigit( cur[0] ) && ft_isxdigit( cur[1] ) &&\n           ft_isxdigit( cur[2] ) && ft_isxdigit( cur[3] ) )\n      {\n        /* ASCII hexadecimal encoding */\n        FT_Long  len;\n\n\n        parser->root.cursor = cur;\n        (void)psaux->ps_parser_funcs->to_bytes( &parser->root,\n                                                parser->private_dict,\n                                                parser->private_len,\n                                                &len,\n                                                0 );\n        parser->private_len = len;\n\n        /* put a safeguard */\n        parser->private_dict[len] = '\\0';\n      }\n      else\n        /* binary encoding -- copy the private dict */\n        FT_MEM_MOVE( parser->private_dict, cur, size );\n    }\n\n    /* we now decrypt the encoded binary private dictionary */\n    psaux->t1_decrypt( parser->private_dict, parser->private_len, 55665U );\n\n    if ( parser->private_len < 4 )\n    {\n      FT_ERROR(( \"T1_Get_Private_Dict:\"\n                 \" invalid private dictionary section\\n\" ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Fail;\n    }\n\n    /* replace the four random bytes at the beginning with whitespace */\n    parser->private_dict[0] = ' ';\n    parser->private_dict[1] = ' ';\n    parser->private_dict[2] = ' ';\n    parser->private_dict[3] = ' ';\n\n    parser->root.base   = parser->private_dict;\n    parser->root.cursor = parser->private_dict;\n    parser->root.limit  = parser->root.cursor + parser->private_len;\n\n  Fail:\n  Exit:\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1parse.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1parse.h                                                              */\n/*                                                                         */\n/*    Type 1 parser (specification).                                       */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2008 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __T1PARSE_H__\n#define __T1PARSE_H__\n\n\n#include \"../../include/ft2build.h\"\n#include \"../../include/freetype/internal/t1types.h\"\n#include \"../../include/freetype/internal/ftstream.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    T1_ParserRec                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A PS_ParserRec is an object used to parse a Type 1 fonts very      */\n  /*    quickly.                                                           */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    root         :: The root parser.                                   */\n  /*                                                                       */\n  /*    stream       :: The current input stream.                          */\n  /*                                                                       */\n  /*    base_dict    :: A pointer to the top-level dictionary.             */\n  /*                                                                       */\n  /*    base_len     :: The length in bytes of the top dictionary.         */\n  /*                                                                       */\n  /*    private_dict :: A pointer to the private dictionary.               */\n  /*                                                                       */\n  /*    private_len  :: The length in bytes of the private dictionary.     */\n  /*                                                                       */\n  /*    in_pfb       :: A boolean.  Indicates that we are handling a PFB   */\n  /*                    file.                                              */\n  /*                                                                       */\n  /*    in_memory    :: A boolean.  Indicates a memory-based stream.       */\n  /*                                                                       */\n  /*    single_block :: A boolean.  Indicates that the private dictionary  */\n  /*                    is stored in lieu of the base dictionary.          */\n  /*                                                                       */\n  typedef struct  T1_ParserRec_\n  {\n    PS_ParserRec  root;\n    FT_Stream     stream;\n\n    FT_Byte*      base_dict;\n    FT_ULong      base_len;\n\n    FT_Byte*      private_dict;\n    FT_ULong      private_len;\n\n    FT_Bool       in_pfb;\n    FT_Bool       in_memory;\n    FT_Bool       single_block;\n\n  } T1_ParserRec, *T1_Parser;\n\n\n#define T1_Add_Table( p, i, o, l )  (p)->funcs.add( (p), i, o, l )\n#define T1_Done_Table( p )          \\\n          do                        \\\n          {                         \\\n            if ( (p)->funcs.done )  \\\n              (p)->funcs.done( p ); \\\n          } while ( 0 )\n#define T1_Release_Table( p )          \\\n          do                           \\\n          {                            \\\n            if ( (p)->funcs.release )  \\\n              (p)->funcs.release( p ); \\\n          } while ( 0 )\n\n\n#define T1_Skip_Spaces( p )    (p)->root.funcs.skip_spaces( &(p)->root )\n#define T1_Skip_PS_Token( p )  (p)->root.funcs.skip_PS_token( &(p)->root )\n\n#define T1_ToInt( p )       (p)->root.funcs.to_int( &(p)->root )\n#define T1_ToFixed( p, t )  (p)->root.funcs.to_fixed( &(p)->root, t )\n\n#define T1_ToCoordArray( p, m, c )                           \\\n          (p)->root.funcs.to_coord_array( &(p)->root, m, c )\n#define T1_ToFixedArray( p, m, f, t )                           \\\n          (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t )\n#define T1_ToToken( p, t )                          \\\n          (p)->root.funcs.to_token( &(p)->root, t )\n#define T1_ToTokenArray( p, t, m, c )                           \\\n          (p)->root.funcs.to_token_array( &(p)->root, t, m, c )\n\n#define T1_Load_Field( p, f, o, m, pf )                         \\\n          (p)->root.funcs.load_field( &(p)->root, f, o, m, pf )\n\n#define T1_Load_Field_Table( p, f, o, m, pf )                         \\\n          (p)->root.funcs.load_field_table( &(p)->root, f, o, m, pf )\n\n\n  FT_LOCAL( FT_Error )\n  T1_New_Parser( T1_Parser      parser,\n                 FT_Stream      stream,\n                 FT_Memory      memory,\n                 PSAux_Service  psaux );\n\n  FT_LOCAL( FT_Error )\n  T1_Get_Private_Dict( T1_Parser      parser,\n                       PSAux_Service  psaux );\n\n  FT_LOCAL( void )\n  T1_Finalize_Parser( T1_Parser  parser );\n\n\nFT_END_HEADER\n\n#endif /* __T1PARSE_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1tokens.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1tokens.h                                                             */\n/*                                                                         */\n/*    Type 1 tokenizer (specification).                                    */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2004, 2006, 2008, 2009 by             */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  PS_FontInfoRec\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_FONT_INFO\n\n  T1_FIELD_STRING( \"version\",            version,\n                   T1_FIELD_DICT_FONTDICT )\n  T1_FIELD_STRING( \"Notice\",             notice,\n                   T1_FIELD_DICT_FONTDICT )\n  T1_FIELD_STRING( \"FullName\",           full_name,\n                   T1_FIELD_DICT_FONTDICT )\n  T1_FIELD_STRING( \"FamilyName\",         family_name,\n                   T1_FIELD_DICT_FONTDICT )\n  T1_FIELD_STRING( \"Weight\",             weight,\n                   T1_FIELD_DICT_FONTDICT )\n\n  /* we use pointers to detect modifications made by synthetic fonts */\n  T1_FIELD_NUM   ( \"ItalicAngle\",        italic_angle,\n                   T1_FIELD_DICT_FONTDICT )\n  T1_FIELD_BOOL  ( \"isFixedPitch\",       is_fixed_pitch,\n                   T1_FIELD_DICT_FONTDICT )\n  T1_FIELD_NUM   ( \"UnderlinePosition\",  underline_position,\n                   T1_FIELD_DICT_FONTDICT )\n  T1_FIELD_NUM   ( \"UnderlineThickness\", underline_thickness,\n                   T1_FIELD_DICT_FONTDICT )\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  PS_FontExtraRec\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_FONT_EXTRA\n\n  T1_FIELD_NUM   ( \"FSType\", fs_type,\n                   T1_FIELD_DICT_FONTDICT )\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  PS_PrivateRec\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_PRIVATE\n\n  T1_FIELD_NUM       ( \"UniqueID\",         unique_id,\n                       T1_FIELD_DICT_FONTDICT | T1_FIELD_DICT_PRIVATE )\n  T1_FIELD_NUM       ( \"lenIV\",            lenIV,\n                       T1_FIELD_DICT_PRIVATE )\n  T1_FIELD_NUM       ( \"LanguageGroup\",    language_group,\n                       T1_FIELD_DICT_PRIVATE )\n  T1_FIELD_NUM       ( \"password\",         password,\n                       T1_FIELD_DICT_PRIVATE )\n\n  T1_FIELD_FIXED_1000( \"BlueScale\",        blue_scale,\n                       T1_FIELD_DICT_PRIVATE )\n  T1_FIELD_NUM       ( \"BlueShift\",        blue_shift,\n                       T1_FIELD_DICT_PRIVATE )\n  T1_FIELD_NUM       ( \"BlueFuzz\",         blue_fuzz,\n                       T1_FIELD_DICT_PRIVATE )\n\n  T1_FIELD_NUM_TABLE ( \"BlueValues\",       blue_values,        14,\n                       T1_FIELD_DICT_PRIVATE )\n  T1_FIELD_NUM_TABLE ( \"OtherBlues\",       other_blues,        10,\n                       T1_FIELD_DICT_PRIVATE )\n  T1_FIELD_NUM_TABLE ( \"FamilyBlues\",      family_blues,       14,\n                       T1_FIELD_DICT_PRIVATE )\n  T1_FIELD_NUM_TABLE ( \"FamilyOtherBlues\", family_other_blues, 10,\n                       T1_FIELD_DICT_PRIVATE )\n\n  T1_FIELD_NUM_TABLE2( \"StdHW\",            standard_width,      1,\n                       T1_FIELD_DICT_PRIVATE )\n  T1_FIELD_NUM_TABLE2( \"StdVW\",            standard_height,     1,\n                       T1_FIELD_DICT_PRIVATE )\n  T1_FIELD_NUM_TABLE2( \"MinFeature\",       min_feature,         2,\n                       T1_FIELD_DICT_PRIVATE )\n\n  T1_FIELD_NUM_TABLE ( \"StemSnapH\",        snap_widths,        12,\n                       T1_FIELD_DICT_PRIVATE )\n  T1_FIELD_NUM_TABLE ( \"StemSnapV\",        snap_heights,       12,\n                       T1_FIELD_DICT_PRIVATE )\n\n  T1_FIELD_FIXED     ( \"ExpansionFactor\",  expansion_factor,\n                       T1_FIELD_DICT_PRIVATE )\n  T1_FIELD_BOOL      ( \"ForceBold\",        force_bold,\n                       T1_FIELD_DICT_PRIVATE )\n\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  T1_FontRec\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_FONT_DICT\n\n  T1_FIELD_KEY  ( \"FontName\",    font_name,    T1_FIELD_DICT_FONTDICT )\n  T1_FIELD_NUM  ( \"PaintType\",   paint_type,   T1_FIELD_DICT_FONTDICT )\n  T1_FIELD_NUM  ( \"FontType\",    font_type,    T1_FIELD_DICT_FONTDICT )\n  T1_FIELD_FIXED( \"StrokeWidth\", stroke_width, T1_FIELD_DICT_FONTDICT )\n\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  FT_BBox\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_BBOX\n\n  T1_FIELD_BBOX( \"FontBBox\", xMin, T1_FIELD_DICT_FONTDICT )\n\n\n#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  T1_FaceRec\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_FACE\n\n  T1_FIELD_NUM( \"NDV\", ndv_idx, T1_FIELD_DICT_PRIVATE )\n  T1_FIELD_NUM( \"CDV\", cdv_idx, T1_FIELD_DICT_PRIVATE )\n\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  PS_BlendRec\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_BLEND\n\n  T1_FIELD_NUM_TABLE( \"DesignVector\", default_design_vector,\n                      T1_MAX_MM_DESIGNS, T1_FIELD_DICT_FONTDICT )\n\n\n#endif /* T1_CONFIG_OPTION_NO_MM_SUPPORT */\n\n\n/* END */\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/include/fxft_cffobjs.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXFT_CFFOBJS_H_\n#define _FXFT_CFFOBJS_H_\n#include \"../fxft2.5.01/src/cff/cffobjs.h\"\n#endif\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/include/fxft_cfftypes.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXFT_FREETYPE_H_\n#define _FXFT_FREETYPE_H_\n#include \"../fxft2.5.01/src/cff/cfftypes.h\"\n#endif\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/include/fxft_freetype.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXFT_FREETYPE_H_\n#define _FXFT_FREETYPE_H_\n#include \"../fxft2.5.01/include/freetype/freetype.h\"\n#endif\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/include/fxft_ft2build.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXFT_FT2BUILD_H_\n#define _FXFT_FT2BUILD_H_\n#include \"../fxft2.5.01/include/ft2build.h\"\n#endif\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/include/fxft_ftmm.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXFT_FTMM_H_\n#define _FXFT_FTMM_H_\n#include \"../fxft2.5.01/include/freetype/ftmm.h\"\n#endif\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/include/fxft_ftobjs.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXFT_FTOBJS_H_\n#define _FXFT_FTOBJS_H_\n#include \"../fxft2.5.01/include/freetype/internal/ftobjs.h\"\n#endif\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/include/fxft_ftotval.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXFT_FTOTVAL_H_\n#define _FXFT_FTOTVAL_H_\n#include \"../fxft2.5.01/include/freetype/ftotval.h\"\n#endif\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/include/fxft_ftoutln.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXFT_FTOUTLN_H_\n#define _FXFT_FTOUTLN_H_\n#include \"../fxft2.5.01/include/freetype/ftoutln.h\"\n#endif\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/include/fxft_ftstream.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXFT_FTSTREAM_H_\n#define _FXFT_FTSTREAM_H_\n#include \"../fxft2.5.01/include/freetype/internal/ftstream.h\"\n#endif\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/include/fxft_tttables.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXFT_TTTABLES_H_\n#define _FXFT_TTTABLES_H_\n#include \"../fxft2.5.01/include/freetype/tttables.h\"\n#endif\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/include/fxft_tttypes.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXFT_TTTYPES_H_\n#define _FXFT_TTTYPES_H_\n#include \"../fxft2.5.01/include/freetype/internal/tttypes.h\"\n#endif\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/src/fxft_cff.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../fxft2.5.01/src/cff/fxft_cff.c\"\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/src/fxft_ftbase.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../fxft2.5.01/src/base/fxft_ftbase.c\"\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/src/fxft_ftbitmap.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../fxft2.5.01/src/base/fxft_ftbitmap.c\"\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/src/fxft_ftglyph.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../fxft2.5.01/src/base/fxft_ftglyph.c\"\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/src/fxft_ftinit.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../fxft2.5.01/src/base/fxft_ftinit.c\"\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/src/fxft_ftlcdfil.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../fxft2.5.01/src/base/fxft_ftlcdfil.c\"\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/src/fxft_ftmm.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../fxft2.5.01/src/base/fxft_ftmm.c\"\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/src/fxft_ftsystem.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../fxft2.5.01/src/base/fxft_ftsystem.c\"\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/src/fxft_psaux.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../fxft2.5.01/src/psaux/fxft_psaux.c\"\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/src/fxft_pshinter.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../fxft2.5.01/src/pshinter/fxft_pshinter.c\"\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/src/fxft_psmodule.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../fxft2.5.01/src/psnames/fxft_psmodule.c\"\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/src/fxft_raster.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../fxft2.5.01/src/raster/fxft_raster.c\"\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/src/fxft_sfnt.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../fxft2.5.01/src/sfnt/fxft_sfnt.c\"\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/src/fxft_smooth.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../fxft2.5.01/src/smooth/fxft_smooth.c\"\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/src/fxft_truetype.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../fxft2.5.01/src/truetype/fxft_truetype.c\"\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/src/fxft_type1.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../fxft2.5.01/src/type1/fxft_type1.c\"\n"
  },
  {
    "path": "core/src/fxge/fx_freetype/src/fxft_type1cid.c",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../fxft2.5.01/src/cid/fxft_type1cid.c\"\n"
  },
  {
    "path": "core/src/fxge/ge/fx_ge.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxge/fx_ge.h\"\n#include \"text_int.h\"\nstatic CFX_GEModule* g_pGEModule = NULL;\nCFX_GEModule::CFX_GEModule()\n{\n    m_pFontCache = NULL;\n    m_pFontMgr = NULL;\n    m_FTLibrary = NULL;\n    m_pCodecModule = NULL;\n    m_pPlatformData = NULL;\n}\nCFX_GEModule::~CFX_GEModule()\n{\n    if (m_pFontCache) {\n        delete m_pFontCache;\n    }\n    m_pFontCache = NULL;\n    if (m_pFontMgr) {\n        delete m_pFontMgr;\n    }\n    m_pFontMgr = NULL;\n    DestroyPlatform();\n}\nCFX_GEModule* CFX_GEModule::Get()\n{\n    return g_pGEModule;\n}\nvoid CFX_GEModule::Create()\n{\n    g_pGEModule = FX_NEW CFX_GEModule;\n    if (!g_pGEModule) {\n        return;\n    }\n    g_pGEModule->m_pFontMgr = FX_NEW CFX_FontMgr;\n    g_pGEModule->InitPlatform();\n    g_pGEModule->SetTextGamma(2.2f);\n}\nvoid CFX_GEModule::Use(CFX_GEModule* pModule)\n{\n    g_pGEModule = pModule;\n}\nvoid CFX_GEModule::Destroy()\n{\n    if (g_pGEModule) {\n        delete g_pGEModule;\n    }\n    g_pGEModule = NULL;\n}\nCFX_FontCache* CFX_GEModule::GetFontCache()\n{\n    if (m_pFontCache == NULL) {\n        m_pFontCache = FX_NEW CFX_FontCache();\n    }\n    return m_pFontCache;\n}\nvoid CFX_GEModule::SetTextGamma(FX_FLOAT gammaValue)\n{\n    gammaValue /= 2.2f;\n    int i = 0;\n    while (i < 256) {\n        m_GammaValue[i] = (FX_BYTE)(FXSYS_pow((FX_FLOAT)i / 255, gammaValue) * 255.0f + 0.5f);\n        i++;\n    }\n}\nFX_LPCBYTE CFX_GEModule::GetTextGammaTable()\n{\n    return m_GammaValue;\n}\nvoid CFX_GEModule::SetExtFontMapper(IFX_FontMapper* pFontMapper)\n{\n    GetFontMgr()->m_pExtMapper = pFontMapper;\n    pFontMapper->m_pFontMgr = m_pFontMgr;\n}\n"
  },
  {
    "path": "core/src/fxge/ge/fx_ge_device.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxge/fx_ge.h\"\nCFX_RenderDevice::CFX_RenderDevice()\n{\n    m_pDeviceDriver = NULL;\n    m_pBitmap = NULL;\n}\nCFX_RenderDevice::~CFX_RenderDevice()\n{\n    if (m_pDeviceDriver) {\n        delete m_pDeviceDriver;\n    }\n}\nvoid CFX_RenderDevice::SetDeviceDriver(IFX_RenderDeviceDriver* pDriver)\n{\n    if (m_pDeviceDriver) {\n        delete m_pDeviceDriver;\n    }\n    m_pDeviceDriver = pDriver;\n    InitDeviceInfo();\n}\nvoid CFX_RenderDevice::InitDeviceInfo()\n{\n    ASSERT(m_pDeviceDriver != NULL);\n    m_Width = m_pDeviceDriver->GetDeviceCaps(FXDC_PIXEL_WIDTH);\n    m_Height = m_pDeviceDriver->GetDeviceCaps(FXDC_PIXEL_HEIGHT);\n    m_bpp = m_pDeviceDriver->GetDeviceCaps(FXDC_BITS_PIXEL);\n    m_RenderCaps = m_pDeviceDriver->GetDeviceCaps(FXDC_RENDER_CAPS);\n    m_DeviceClass = m_pDeviceDriver->GetDeviceCaps(FXDC_DEVICE_CLASS);\n    if (!m_pDeviceDriver->GetClipBox(&m_ClipBox)) {\n        m_ClipBox.left = 0;\n        m_ClipBox.top = 0;\n        m_ClipBox.right = m_Width;\n        m_ClipBox.bottom = m_Height;\n    }\n}\nFX_BOOL CFX_RenderDevice::StartRendering()\n{\n    return m_pDeviceDriver->StartRendering();\n}\nvoid CFX_RenderDevice::EndRendering()\n{\n    m_pDeviceDriver->EndRendering();\n}\nvoid CFX_RenderDevice::SaveState()\n{\n    m_pDeviceDriver->SaveState();\n}\nvoid CFX_RenderDevice::RestoreState(FX_BOOL bKeepSaved)\n{\n    m_pDeviceDriver->RestoreState(bKeepSaved);\n    UpdateClipBox();\n}\nint CFX_RenderDevice::GetDeviceCaps(int caps_id) const\n{\n    return m_pDeviceDriver->GetDeviceCaps(caps_id);\n}\nCFX_Matrix CFX_RenderDevice::GetCTM() const\n{\n    return m_pDeviceDriver->GetCTM();\n}\nFX_BOOL CFX_RenderDevice::CreateCompatibleBitmap(CFX_DIBitmap* pDIB, int width, int height) const\n{\n    if (m_RenderCaps & FXRC_CMYK_OUTPUT) {\n        return pDIB->Create(width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Cmyka : FXDIB_Cmyk);\n    } else if (m_RenderCaps & FXRC_BYTEMASK_OUTPUT) {\n        return pDIB->Create(width, height, FXDIB_8bppMask);\n    } else\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n        return pDIB->Create(width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Argb : FXDIB_Rgb32);\n#else\n        return pDIB->Create(width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Argb : FXDIB_Rgb);\n#endif\n}\nFX_BOOL CFX_RenderDevice::SetClip_PathFill(const CFX_PathData* pPathData,\n        const CFX_AffineMatrix* pObject2Device,\n        int fill_mode\n                                          )\n{\n    if (!m_pDeviceDriver->SetClip_PathFill(pPathData, pObject2Device, fill_mode)) {\n        return FALSE;\n    }\n    UpdateClipBox();\n    return TRUE;\n}\nFX_BOOL CFX_RenderDevice::SetClip_PathStroke(const CFX_PathData* pPathData,\n        const CFX_AffineMatrix* pObject2Device,\n        const CFX_GraphStateData* pGraphState\n                                            )\n{\n    if (!m_pDeviceDriver->SetClip_PathStroke(pPathData, pObject2Device, pGraphState)) {\n        return FALSE;\n    }\n    UpdateClipBox();\n    return TRUE;\n}\nFX_BOOL CFX_RenderDevice::SetClip_Rect(const FX_RECT* pRect)\n{\n    CFX_PathData path;\n    path.AppendRect((FX_FLOAT)(pRect->left), (FX_FLOAT)(pRect->bottom), (FX_FLOAT)(pRect->right), (FX_FLOAT)(pRect->top));\n    if (!SetClip_PathFill(&path, NULL, FXFILL_WINDING)) {\n        return FALSE;\n    }\n    UpdateClipBox();\n    return TRUE;\n}\nvoid CFX_RenderDevice::UpdateClipBox()\n{\n    if (m_pDeviceDriver->GetClipBox(&m_ClipBox)) {\n        return;\n    }\n    m_ClipBox.left = 0;\n    m_ClipBox.top = 0;\n    m_ClipBox.right = m_Width;\n    m_ClipBox.bottom = m_Height;\n}\nFX_BOOL CFX_RenderDevice::DrawPath(const CFX_PathData* pPathData,\n                                   const CFX_AffineMatrix* pObject2Device,\n                                   const CFX_GraphStateData* pGraphState,\n                                   FX_DWORD fill_color, FX_DWORD stroke_color, int fill_mode,\n                                   int alpha_flag, void* pIccTransform, int blend_type)\n{\n    FX_BYTE fill_alpha, stroke_alpha;\n    if (FXGETFLAG_COLORTYPE(alpha_flag)) {\n        fill_alpha = FXGETFLAG_ALPHA_FILL(alpha_flag);\n        stroke_alpha = FXGETFLAG_ALPHA_STROKE(alpha_flag);\n    } else {\n        fill_alpha = FXARGB_A(fill_color);\n        stroke_alpha = FXARGB_A(stroke_color);\n    }\n    if ((fill_mode & 3) == 0) {\n        fill_alpha = 0;\n    }\n    if (pGraphState == NULL) {\n        stroke_alpha = 0;\n    }\n    if (stroke_alpha == 0 && pPathData->GetPointCount() == 2) {\n        FX_PATHPOINT* pPoints = pPathData->GetPoints();\n        FX_FLOAT x1, x2, y1, y2;\n        if (pObject2Device) {\n            pObject2Device->Transform(pPoints[0].m_PointX, pPoints[0].m_PointY, x1, y1);\n            pObject2Device->Transform(pPoints[1].m_PointX, pPoints[1].m_PointY, x2, y2);\n        } else {\n            x1 = pPoints[0].m_PointX;\n            y1 = pPoints[0].m_PointY;\n            x2 = pPoints[1].m_PointX;\n            y2 = pPoints[1].m_PointY;\n        }\n        DrawCosmeticLine(x1, y1, x2, y2, fill_color, fill_mode, alpha_flag, pIccTransform, blend_type);\n        return TRUE;\n    }\n    if ((pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) && stroke_alpha == 0) {\n        CFX_FloatRect rect_f;\n        if (!(fill_mode & FXFILL_RECT_AA) && pPathData->IsRect(pObject2Device, &rect_f)) {\n            FX_RECT rect_i = rect_f.GetOutterRect();\n            int width = (int)FXSYS_ceil(rect_f.right - rect_f.left);\n            if (width < 1) {\n                width = 1;\n                if (rect_i.left == rect_i.right) {\n                    rect_i.right ++;\n                }\n            }\n            int height = (int)FXSYS_ceil(rect_f.top - rect_f.bottom);\n            if (height < 1) {\n                height = 1;\n                if (rect_i.bottom == rect_i.top) {\n                    rect_i.bottom ++;\n                }\n            }\n            if (rect_i.Width() >= width + 1) {\n                if (rect_f.left - (FX_FLOAT)(rect_i.left) > (FX_FLOAT)(rect_i.right) - rect_f.right) {\n                    rect_i.left ++;\n                } else {\n                    rect_i.right --;\n                }\n            }\n            if (rect_i.Height() >= height + 1) {\n                if (rect_f.top - (FX_FLOAT)(rect_i.top) > (FX_FLOAT)(rect_i.bottom) - rect_f.bottom) {\n                    rect_i.top ++;\n                } else {\n                    rect_i.bottom --;\n                }\n            }\n            if (FillRect(&rect_i, fill_color, alpha_flag, pIccTransform, blend_type)) {\n                return TRUE;\n            }\n        }\n    }\n    if((fill_mode & 3) && stroke_alpha == 0 && !(fill_mode & FX_FILL_STROKE) && !(fill_mode & FX_FILL_TEXT_MODE)) {\n        CFX_PathData newPath;\n        FX_BOOL bThin = FALSE;\n        if (pPathData->GetZeroAreaPath(newPath, (CFX_Matrix*)pObject2Device, bThin, m_pDeviceDriver->GetDriverType())) {\n            CFX_GraphStateData graphState;\n            graphState.m_LineWidth = 0.0f;\n            FX_DWORD strokecolor = fill_color;\n            if (bThin) {\n                if (FXGETFLAG_COLORTYPE(alpha_flag)) {\n                    FXSETFLAG_ALPHA_STROKE(alpha_flag, fill_alpha >> 2);\n                } else {\n                    strokecolor = (((fill_alpha >> 2) << 24) | (strokecolor & 0x00ffffff));\n                }\n            }\n            CFX_AffineMatrix* pMatrix = NULL;\n            if (pObject2Device && !pObject2Device->IsIdentity()) {\n                pMatrix = (CFX_AffineMatrix*)pObject2Device;\n            }\n            int smooth_path = FX_ZEROAREA_FILL;\n            if (fill_mode & FXFILL_NOPATHSMOOTH) {\n                smooth_path |= FXFILL_NOPATHSMOOTH;\n            }\n            m_pDeviceDriver->DrawPath(&newPath, pMatrix, &graphState, 0, strokecolor, smooth_path, alpha_flag, pIccTransform, blend_type);\n        }\n    }\n    if ((fill_mode & 3) && fill_alpha && stroke_alpha < 0xff && (fill_mode & FX_FILL_STROKE)) {\n        if (!(m_RenderCaps & FXRC_GET_BITS)) {\n            return FALSE;\n        }\n        CFX_FloatRect bbox;\n        if (pGraphState) {\n            bbox = pPathData->GetBoundingBox(pGraphState->m_LineWidth, pGraphState->m_MiterLimit);\n        } else {\n            bbox = pPathData->GetBoundingBox();\n        }\n        if (pObject2Device) {\n            bbox.Transform(pObject2Device);\n        }\n        CFX_Matrix ctm = GetCTM();\n        FX_FLOAT fScaleX = FXSYS_fabs(ctm.a);\n        FX_FLOAT fScaleY = FXSYS_fabs(ctm.d);\n        FX_RECT rect = bbox.GetOutterRect();\n        CFX_DIBitmap bitmap, Backdrop;\n        if (!CreateCompatibleBitmap(&bitmap, FXSYS_round(rect.Width() * fScaleX), FXSYS_round(rect.Height() * fScaleY))) {\n            return FALSE;\n        }\n        if (bitmap.HasAlpha()) {\n            bitmap.Clear(0);\n            Backdrop.Copy(&bitmap);\n        } else {\n            if (!m_pDeviceDriver->GetDIBits(&bitmap, rect.left, rect.top, NULL)) {\n                return FALSE;\n            }\n            Backdrop.Copy(&bitmap);\n        }\n        CFX_FxgeDevice bitmap_device;\n        bitmap_device.Attach(&bitmap, 0, FALSE, &Backdrop, TRUE);\n        CFX_AffineMatrix matrix;\n        if (pObject2Device) {\n            matrix = *pObject2Device;\n        }\n        matrix.TranslateI(-rect.left, -rect.top);\n        matrix.Concat(fScaleX, 0, 0, fScaleY, 0, 0);\n        if (!bitmap_device.GetDeviceDriver()->DrawPath(pPathData, &matrix, pGraphState, fill_color, stroke_color, fill_mode, alpha_flag, pIccTransform, blend_type)) {\n            return FALSE;\n        }\n        FX_RECT src_rect(0, 0, FXSYS_round(rect.Width() * fScaleX), FXSYS_round(rect.Height() * fScaleY));\n        return m_pDeviceDriver->SetDIBits(&bitmap, 0, &src_rect, rect.left, rect.top, FXDIB_BLEND_NORMAL);\n    }\n    return m_pDeviceDriver->DrawPath(pPathData, pObject2Device, pGraphState, fill_color, stroke_color, fill_mode, alpha_flag, pIccTransform, blend_type);\n}\nFX_BOOL CFX_RenderDevice::SetPixel(int x, int y, FX_DWORD color, int alpha_flag, void* pIccTransform)\n{\n    if (m_pDeviceDriver->SetPixel(x, y, color, alpha_flag, pIccTransform)) {\n        return TRUE;\n    }\n    FX_RECT rect(x, y, x + 1, y + 1);\n    return FillRect(&rect, color, alpha_flag, pIccTransform);\n}\nFX_BOOL CFX_RenderDevice::FillRect(const FX_RECT* pRect, FX_DWORD fill_color, int alpha_flag, void* pIccTransform, int blend_type)\n{\n    if (m_pDeviceDriver->FillRect(pRect, fill_color, alpha_flag, pIccTransform, blend_type)) {\n        return TRUE;\n    }\n    if (!(m_RenderCaps & FXRC_GET_BITS)) {\n        return FALSE;\n    }\n    CFX_DIBitmap bitmap;\n    if (!CreateCompatibleBitmap(&bitmap, pRect->Width(), pRect->Height())) {\n        return FALSE;\n    }\n    if (!m_pDeviceDriver->GetDIBits(&bitmap, pRect->left, pRect->top)) {\n        return FALSE;\n    }\n    if (!bitmap.CompositeRect(0, 0, pRect->Width(), pRect->Height(), fill_color, alpha_flag, pIccTransform)) {\n        return FALSE;\n    }\n    FX_RECT src_rect(0, 0, pRect->Width(), pRect->Height());\n    m_pDeviceDriver->SetDIBits(&bitmap, 0, &src_rect, pRect->left, pRect->top, FXDIB_BLEND_NORMAL);\n    return TRUE;\n}\nFX_BOOL CFX_RenderDevice::DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,\n        int fill_mode, int alpha_flag, void* pIccTransform, int blend_type)\n{\n    if (((m_RenderCaps & FXRC_ALPHA_PATH) &&\n            (FXGETFLAG_COLORTYPE(alpha_flag) && FXGETFLAG_ALPHA_FILL(alpha_flag) == 0xff)) ||\n            color >= 0xff000000)\n        if (m_pDeviceDriver->DrawCosmeticLine(x1, y1, x2, y2, color, alpha_flag, pIccTransform, blend_type)) {\n            return TRUE;\n        }\n    CFX_GraphStateData graph_state;\n    CFX_PathData path;\n    path.SetPointCount(2);\n    path.SetPoint(0, x1, y1, FXPT_MOVETO);\n    path.SetPoint(1, x2, y2, FXPT_LINETO);\n    return m_pDeviceDriver->DrawPath(&path, NULL, &graph_state, 0, color, fill_mode, alpha_flag, pIccTransform, blend_type);\n}\nFX_BOOL CFX_RenderDevice::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform)\n{\n    if (!(m_RenderCaps & FXRC_GET_BITS)) {\n        return FALSE;\n    }\n    return m_pDeviceDriver->GetDIBits(pBitmap, left, top, pIccTransform);\n}\nCFX_DIBitmap* CFX_RenderDevice::GetBackDrop()\n{\n    return m_pDeviceDriver->GetBackDrop();\n}\nFX_BOOL CFX_RenderDevice::SetDIBits(const CFX_DIBSource* pBitmap, int left, int top, int blend_mode,\n                                    void* pIccTransform)\n{\n    ASSERT(!pBitmap->IsAlphaMask());\n    CFX_AffineMatrix ctm = GetCTM();\n    FX_FLOAT fScaleX = FXSYS_fabs(ctm.a);\n    FX_FLOAT fScaleY = FXSYS_fabs(ctm.d);\n    FX_RECT dest_rect(left, top, FXSYS_round(left + pBitmap->GetWidth() / fScaleX), FXSYS_round(top + pBitmap->GetHeight() / fScaleY));\n    dest_rect.Intersect(m_ClipBox);\n    if (dest_rect.IsEmpty()) {\n        return TRUE;\n    }\n    FX_RECT src_rect(dest_rect.left - left, dest_rect.top - top,\n                     dest_rect.left - left + dest_rect.Width(), dest_rect.top - top + dest_rect.Height());\n    src_rect.left = FXSYS_round(src_rect.left * fScaleX);\n    src_rect.top = FXSYS_round(src_rect.top * fScaleY);\n    src_rect.right = FXSYS_round(src_rect.right * fScaleX);\n    src_rect.bottom = FXSYS_round(src_rect.bottom * fScaleY);\n    if ((blend_mode != FXDIB_BLEND_NORMAL && !(m_RenderCaps & FXRC_BLEND_MODE)) ||\n            (pBitmap->HasAlpha() && !(m_RenderCaps & FXRC_ALPHA_IMAGE))) {\n        if (!(m_RenderCaps & FXRC_GET_BITS)) {\n            return FALSE;\n        }\n        int bg_pixel_width = FXSYS_round(dest_rect.Width() * fScaleX);\n        int bg_pixel_height = FXSYS_round(dest_rect.Height() * fScaleY);\n        CFX_DIBitmap background;\n        if (!background.Create(bg_pixel_width, bg_pixel_height,\n                               (m_RenderCaps & FXRC_CMYK_OUTPUT) ? FXDIB_Cmyk : FXDIB_Rgb32)) {\n            return FALSE;\n        }\n        if (!m_pDeviceDriver->GetDIBits(&background, dest_rect.left, dest_rect.top)) {\n            return FALSE;\n        }\n        if (!background.CompositeBitmap(0, 0, bg_pixel_width, bg_pixel_height,\n                                        pBitmap, src_rect.left, src_rect.top,\n                                        blend_mode, NULL, FALSE, pIccTransform)) {\n            return FALSE;\n        }\n        FX_RECT src_rect(0, 0, bg_pixel_width, bg_pixel_height);\n        return m_pDeviceDriver->SetDIBits(&background, 0, &src_rect, dest_rect.left, dest_rect.top, FXDIB_BLEND_NORMAL);\n    }\n    return m_pDeviceDriver->SetDIBits(pBitmap, 0, &src_rect, dest_rect.left, dest_rect.top, blend_mode, 0, pIccTransform);\n}\nFX_BOOL CFX_RenderDevice::StretchDIBits(const CFX_DIBSource* pBitmap, int left, int top,\n                                        int dest_width, int dest_height, FX_DWORD flags,\n                                        void* pIccTransform, int blend_mode)\n{\n    FX_RECT dest_rect(left, top, left + dest_width, top + dest_height);\n    FX_RECT clip_box = m_ClipBox;\n    clip_box.Intersect(dest_rect);\n    if (clip_box.IsEmpty()) {\n        return TRUE;\n    }\n    return m_pDeviceDriver->StretchDIBits(pBitmap, 0, left, top, dest_width, dest_height, &clip_box, flags, 0, pIccTransform, blend_mode);\n}\nFX_BOOL CFX_RenderDevice::SetBitMask(const CFX_DIBSource* pBitmap, int left, int top, FX_DWORD argb,\n                                     int alpha_flag, void* pIccTransform)\n{\n    FX_RECT src_rect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight());\n    return m_pDeviceDriver->SetDIBits(pBitmap, argb, &src_rect, left, top, FXDIB_BLEND_NORMAL, alpha_flag, pIccTransform);\n}\nFX_BOOL CFX_RenderDevice::StretchBitMask(const CFX_DIBSource* pBitmap, int left, int top,\n        int dest_width, int dest_height, FX_DWORD argb, FX_DWORD flags,\n        int alpha_flag, void* pIccTransform)\n{\n    FX_RECT dest_rect(left, top, left + dest_width, top + dest_height);\n    FX_RECT clip_box = m_ClipBox;\n    clip_box.Intersect(dest_rect);\n    return m_pDeviceDriver->StretchDIBits(pBitmap, argb, left, top, dest_width, dest_height, &clip_box, flags, alpha_flag, pIccTransform);\n}\nFX_BOOL CFX_RenderDevice::StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD argb,\n                                      const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle,\n                                      int alpha_flag, void* pIccTransform, int blend_mode)\n{\n    return m_pDeviceDriver->StartDIBits(pBitmap, bitmap_alpha, argb, pMatrix, flags, handle, alpha_flag, pIccTransform, blend_mode);\n}\nFX_BOOL CFX_RenderDevice::ContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause)\n{\n    return m_pDeviceDriver->ContinueDIBits(handle, pPause);\n}\nvoid CFX_RenderDevice::CancelDIBits(FX_LPVOID handle)\n{\n    m_pDeviceDriver->CancelDIBits(handle);\n}\n"
  },
  {
    "path": "core/src/fxge/ge/fx_ge_font.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxge/fx_ge.h\"\n#include \"../../../include/fxge/fx_freetype.h\"\n#include \"text_int.h\"\n#define EM_ADJUST(em, a) (em == 0?(a): (a)*1000/em)\nextern void _FPDFAPI_GetInternalFontData(int id1, FX_LPCBYTE& data, FX_DWORD& size);\nCFX_Font::CFX_Font()\n{\n    m_pSubstFont = NULL;\n    m_Face = NULL;\n    m_bEmbedded = FALSE;\n    m_bVertical = FALSE;\n    m_pFontData = NULL;\n    m_pFontDataAllocation = NULL;\n    m_dwSize = 0;\n    m_pOwnedStream = NULL;\n    m_pGsubData = NULL;\n    m_pPlatformFont = NULL;\n    m_pPlatformFontCollection = NULL;\n    m_pDwFont = NULL;\n    m_hHandle = NULL;\n    m_bDwLoaded = FALSE;\n}\nCFX_Font::~CFX_Font()\n{\n    if (m_pSubstFont) {\n        delete m_pSubstFont;\n        m_pSubstFont = NULL;\n    }\n#ifdef FOXIT_CHROME_BUILD\n    if (m_pFontDataAllocation) {\n        FX_Free(m_pFontDataAllocation);\n        m_pFontDataAllocation = NULL;\n    }\n#endif\n    if (m_Face) {\n#ifdef FOXIT_CHROME_BUILD\n        FXFT_Library library = FXFT_Get_Face_FreeType(m_Face);\n        if (FXFT_Get_Face_External_Stream(m_Face)) {\n            FXFT_Clear_Face_External_Stream(m_Face);\n        }\n#endif\n        if(m_bEmbedded) {\n            DeleteFace();\n        } else {\n            CFX_GEModule::Get()->GetFontMgr()->ReleaseFace(m_Face);\n        }\n    }\n    if (m_pOwnedStream) {\n        FX_Free(m_pOwnedStream);\n        m_pOwnedStream = NULL;\n    }\n    if (m_pGsubData) {\n        FX_Free(m_pGsubData);\n        m_pGsubData = NULL;\n    }\n#if (_FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_ && (!defined(_FPDFAPI_MINI_)))\n    ReleasePlatformResource();\n#endif\n}\nvoid CFX_Font::DeleteFace()\n{\n    FXFT_Done_Face(m_Face);\n    m_Face = NULL;\n}\nFX_BOOL CFX_Font::LoadSubst(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,\n                            int weight, int italic_angle, int CharsetCP, FX_BOOL bVertical)\n{\n    m_bEmbedded = FALSE;\n    m_bVertical = bVertical;\n    m_pSubstFont = FX_NEW CFX_SubstFont;\n    if (!m_pSubstFont) {\n        return FALSE;\n    }\n    m_Face = CFX_GEModule::Get()->GetFontMgr()->FindSubstFont(face_name, bTrueType, flags, weight, italic_angle,\n             CharsetCP, m_pSubstFont);\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n    if(m_pSubstFont->m_ExtHandle) {\n        m_pPlatformFont = m_pSubstFont->m_ExtHandle;\n        m_pSubstFont->m_ExtHandle = NULL;\n    }\n#endif\n    if (m_Face) {\n        m_pFontData = FXFT_Get_Face_Stream_Base(m_Face);\n        m_dwSize = FXFT_Get_Face_Stream_Size(m_Face);\n    }\n    return TRUE;\n}\nextern \"C\" {\n    unsigned long _FTStreamRead(FXFT_Stream stream, unsigned long offset,\n                                unsigned char* buffer, unsigned long count)\n    {\n        if (count == 0) {\n            return 0;\n        }\n        IFX_FileRead* pFile = (IFX_FileRead*)stream->descriptor.pointer;\n        int res = pFile->ReadBlock(buffer, offset, count);\n        if (res) {\n            return count;\n        }\n        return 0;\n    }\n    void _FTStreamClose(FXFT_Stream stream)\n    {\n    }\n};\nFX_BOOL _LoadFile(FXFT_Library library, FXFT_Face* Face, IFX_FileRead* pFile, FXFT_Stream* stream)\n{\n    FXFT_Stream stream1 = (FXFT_Stream)FX_Alloc(FX_BYTE, sizeof (FXFT_StreamRec));\n    if (!stream1) {\n        return FALSE;\n    }\n    stream1->base = NULL;\n    stream1->size = (unsigned long)pFile->GetSize();\n    stream1->pos = 0;\n    stream1->descriptor.pointer = pFile;\n    stream1->close = _FTStreamClose;\n    stream1->read = _FTStreamRead;\n    FXFT_Open_Args args;\n    args.flags = FT_OPEN_STREAM;\n    args.stream = stream1;\n    if (FXFT_Open_Face(library, &args, 0, Face)) {\n        FX_Free(stream1);\n        return FALSE;\n    }\n    if (stream) {\n        *stream = stream1;\n    }\n    return TRUE;\n}\nFX_BOOL CFX_Font::LoadFile(IFX_FileRead* pFile)\n{\n    m_bEmbedded = FALSE;\n    FXFT_Library library;\n    if (CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary == NULL) {\n        FXFT_Init_FreeType(&CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary);\n    }\n    library = CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary;\n    FXFT_Stream stream = NULL;\n    if (!_LoadFile(library, &m_Face, pFile, &stream)) {\n        return FALSE;\n    }\n    m_pOwnedStream = stream;\n    FXFT_Set_Pixel_Sizes(m_Face, 0, 64);\n    return TRUE;\n}\nint CFX_Font::GetGlyphWidth(FX_DWORD glyph_index)\n{\n    if (!m_Face) {\n        return 0;\n    }\n    if (m_pSubstFont && (m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM)) {\n        AdjustMMParams(glyph_index, 0, 0);\n    }\n    int err = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);\n    if (err) {\n        return 0;\n    }\n    int width = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriAdvance(m_Face));\n    return width;\n}\nstatic FXFT_Face FT_LoadFont(FX_LPBYTE pData, int size)\n{\n    FXFT_Library library;\n    if (CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary == NULL) {\n        FXFT_Init_FreeType(&CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary);\n    }\n    library = CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary;\n    FXFT_Face face;\n    int error = FXFT_New_Memory_Face(library, pData, size, 0, &face);\n    if (error) {\n        return NULL;\n    }\n    error = FXFT_Set_Pixel_Sizes(face, 64, 64);\n    if (error) {\n        return NULL;\n    }\n    return face;\n}\nFX_BOOL CFX_Font::LoadEmbedded(FX_LPCBYTE data, FX_DWORD size)\n{\n#ifdef FOXIT_CHROME_BUILD\n    m_pFontDataAllocation = FX_Alloc(FX_BYTE, size);\n    if (!m_pFontDataAllocation) {\n        return FALSE;\n    }\n    FXSYS_memcpy32(m_pFontDataAllocation, data, size);\n    m_Face = FT_LoadFont((FX_LPBYTE)m_pFontDataAllocation, size);\n    m_pFontData = (FX_LPBYTE)m_pFontDataAllocation;\n#else\n    m_Face = FT_LoadFont((FX_LPBYTE)data, size);\n    m_pFontData = (FX_LPBYTE)data;\n#endif\n    m_bEmbedded = TRUE;\n    m_dwSize = size;\n    return m_Face != NULL;\n}\nFX_BOOL CFX_Font::IsTTFont()\n{\n    if (m_Face == NULL) {\n        return FALSE;\n    }\n    return FXFT_Is_Face_TT_OT(m_Face) == FXFT_FACE_FLAG_SFNT;\n}\nint CFX_Font::GetAscent() const\n{\n    if (m_Face == NULL) {\n        return 0;\n    }\n    int ascent = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Ascender(m_Face));\n    return ascent;\n}\nint CFX_Font::GetDescent() const\n{\n    if (m_Face == NULL) {\n        return 0;\n    }\n    int descent = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Descender(m_Face));\n    return descent;\n}\nFX_BOOL CFX_Font::GetGlyphBBox(FX_DWORD glyph_index, FX_RECT &bbox)\n{\n    if (m_Face == NULL) {\n        return FALSE;\n    }\n    if (FXFT_Is_Face_Tricky(m_Face)) {\n        int error = FXFT_Set_Char_Size(m_Face, 0, 1000 * 64, 72, 72);\n        if (error) {\n            return FALSE;\n        }\n        error = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);\n        if (error) {\n            return FALSE;\n        }\n        FXFT_BBox cbox;\n        FT_Glyph glyph;\n        error = FXFT_Get_Glyph(((FXFT_Face)m_Face)->glyph, &glyph);\n        if (error) {\n            return FALSE;\n        }\n        FXFT_Glyph_Get_CBox(glyph, FXFT_GLYPH_BBOX_PIXELS, &cbox);\n        int pixel_size_x = ((FXFT_Face)m_Face)->size->metrics.x_ppem,\n            pixel_size_y = ((FXFT_Face)m_Face)->size->metrics.y_ppem;\n        if (pixel_size_x == 0 || pixel_size_y == 0) {\n            bbox.left = cbox.xMin;\n            bbox.right = cbox.xMax;\n            bbox.top = cbox.yMax;\n            bbox.bottom = cbox.yMin;\n        } else {\n            bbox.left = cbox.xMin * 1000 / pixel_size_x;\n            bbox.right = cbox.xMax * 1000 / pixel_size_x;\n            bbox.top = cbox.yMax * 1000 / pixel_size_y;\n            bbox.bottom = cbox.yMin * 1000 / pixel_size_y;\n        }\n        if (bbox.top > FXFT_Get_Face_Ascender(m_Face)) {\n            bbox.top = FXFT_Get_Face_Ascender(m_Face);\n        }\n        if (bbox.bottom < FXFT_Get_Face_Descender(m_Face)) {\n            bbox.bottom = FXFT_Get_Face_Descender(m_Face);\n        }\n        FT_Done_Glyph(glyph);\n        return FXFT_Set_Pixel_Sizes(m_Face, 0, 64) == 0;\n    }\n    if (FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) {\n        return FALSE;\n    }\n    int em = FXFT_Get_Face_UnitsPerEM(m_Face);\n    if (em == 0) {\n        bbox.left = FXFT_Get_Glyph_HoriBearingX(m_Face);\n        bbox.bottom = FXFT_Get_Glyph_HoriBearingY(m_Face);\n        bbox.top = bbox.bottom - FXFT_Get_Glyph_Height(m_Face);\n        bbox.right = bbox.left + FXFT_Get_Glyph_Width(m_Face);\n    } else {\n        bbox.left = FXFT_Get_Glyph_HoriBearingX(m_Face) * 1000 / em;\n        bbox.top = (FXFT_Get_Glyph_HoriBearingY(m_Face) - FXFT_Get_Glyph_Height(m_Face)) * 1000 / em;\n        bbox.right = (FXFT_Get_Glyph_HoriBearingX(m_Face) + FXFT_Get_Glyph_Width(m_Face)) * 1000 / em;\n        bbox.bottom = (FXFT_Get_Glyph_HoriBearingY(m_Face)) * 1000 / em;\n    }\n    return TRUE;\n}\nFX_BOOL CFX_Font::IsItalic()\n{\n    if (m_Face == NULL) {\n        return FALSE;\n    }\n    FX_BOOL ret = FXFT_Is_Face_Italic(m_Face) == FXFT_STYLE_FLAG_ITALIC;\n    if (!ret) {\n        CFX_ByteString str(FXFT_Get_Face_Style_Name(m_Face));\n        str.MakeLower();\n        if (str.Find(\"italic\") != -1) {\n            ret = TRUE;\n        }\n    }\n    return ret;\n}\nFX_BOOL CFX_Font::IsBold()\n{\n    if (m_Face == NULL) {\n        return FALSE;\n    }\n    return FXFT_Is_Face_Bold(m_Face) == FXFT_STYLE_FLAG_BOLD;\n}\nFX_BOOL CFX_Font::IsFixedWidth()\n{\n    if (m_Face == NULL) {\n        return FALSE;\n    }\n    return FXFT_Is_Face_fixedwidth(m_Face);\n}\nCFX_WideString CFX_Font::GetPsName() const\n{\n    if (m_Face == NULL) {\n        return CFX_WideString();\n    }\n    CFX_WideString psName = CFX_WideString::FromLocal(FXFT_Get_Postscript_Name(m_Face));\n    if (psName.IsEmpty()) {\n        psName =  CFX_WideString::FromLocal(\"Untitled\");\n    }\n    return psName;\n}\nCFX_ByteString CFX_Font::GetFamilyName() const\n{\n    if (m_Face == NULL && m_pSubstFont == NULL) {\n        return CFX_ByteString();\n    }\n    if (m_Face) {\n        return CFX_ByteString(FXFT_Get_Face_Family_Name(m_Face));\n    } else {\n        return m_pSubstFont->m_Family;\n    }\n}\nCFX_ByteString CFX_Font::GetFaceName() const\n{\n    if (m_Face == NULL && m_pSubstFont == NULL) {\n        return CFX_ByteString();\n    }\n    if (m_Face) {\n        CFX_ByteString facename;\n        CFX_ByteString style = CFX_ByteString(FXFT_Get_Face_Style_Name(m_Face));\n        facename = GetFamilyName();\n        if (facename.IsEmpty()) {\n            facename = \"Untitled\";\n        }\n        if (!style.IsEmpty() && style != \"Regular\") {\n            facename += \" \" + style;\n        }\n        return facename;\n    } else {\n        return m_pSubstFont->m_Family;\n    }\n}\nFX_BOOL CFX_Font::GetBBox(FX_RECT &bbox)\n{\n    if (m_Face == NULL) {\n        return FALSE;\n    }\n    int em = FXFT_Get_Face_UnitsPerEM(m_Face);\n    if (em == 0) {\n        bbox.left = FXFT_Get_Face_xMin(m_Face);\n        bbox.bottom = FXFT_Get_Face_yMax(m_Face);\n        bbox.top = FXFT_Get_Face_yMin(m_Face);\n        bbox.right = FXFT_Get_Face_xMax(m_Face);\n    } else {\n        bbox.left = FXFT_Get_Face_xMin(m_Face) * 1000 / em;\n        bbox.top = FXFT_Get_Face_yMin(m_Face) * 1000 / em;\n        bbox.right = FXFT_Get_Face_xMax(m_Face) * 1000 / em;\n        bbox.bottom = FXFT_Get_Face_yMax(m_Face) * 1000 / em;\n    }\n    return TRUE;\n}\nint CFX_Font::GetHeight()\n{\n    if (m_Face == NULL) {\n        return 0;\n    }\n    int height = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Height(m_Face));\n    return height;\n}\nint CFX_Font::GetMaxAdvanceWidth()\n{\n    if (m_Face == NULL) {\n        return 0;\n    }\n    int width = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_MaxAdvanceWidth(m_Face));\n    return width;\n}\nint CFX_Font::GetULPos()\n{\n    if (m_Face == NULL) {\n        return 0;\n    }\n    int pos = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_UnderLinePosition(m_Face));\n    return pos;\n}\nint CFX_Font::GetULthickness()\n{\n    if (m_Face == NULL) {\n        return 0;\n    }\n    int thickness = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_UnderLineThickness(m_Face));\n    return thickness;\n}\nCFX_UnicodeEncoding::CFX_UnicodeEncoding(CFX_Font* pFont)\n{\n    m_pFont = pFont;\n}\nFX_DWORD CFX_UnicodeEncoding::GlyphFromCharCode(FX_DWORD charcode)\n{\n    FXFT_Face face =  m_pFont->GetFace();\n    if (!face) {\n        return charcode;\n    }\n    if (FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE) == 0) {\n        return FXFT_Get_Char_Index(face, charcode);\n    }\n    if (m_pFont->m_pSubstFont && m_pFont->m_pSubstFont->m_Charset == 2) {\n        FX_DWORD index = 0;\n        if (FXFT_Select_Charmap(face, FXFT_ENCODING_MS_SYMBOL) == 0) {\n            index = FXFT_Get_Char_Index(face, charcode);\n        }\n        if (!index && !FXFT_Select_Charmap(face, FXFT_ENCODING_APPLE_ROMAN)) {\n            return FXFT_Get_Char_Index(face, charcode);\n        }\n    }\n    return charcode;\n}\nFX_DWORD CFX_UnicodeEncoding::GlyphFromCharCodeEx(FX_DWORD charcode, int encoding)\n{\n    FXFT_Face face =  m_pFont->GetFace();\n    if (!face) {\n        return charcode;\n    }\n    if (encoding == ENCODING_UNICODE) {\n        return\tGlyphFromCharCode(charcode);\n    } else {\n        int nmaps = FXFT_Get_Face_CharmapCount(m_pFont->m_Face);\n        int i = 0;\n        while (i < nmaps) {\n            int encoding = FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[i++]);\n            if (encoding != FXFT_ENCODING_UNICODE) {\n                FXFT_Select_Charmap(face, encoding);\n                break;\n            }\n        }\n    }\n    return FXFT_Get_Char_Index(face, charcode);\n}\nIFX_FontEncoding* FXGE_CreateUnicodeEncoding(CFX_Font* pFont)\n{\n    CFX_UnicodeEncoding* pEncoding = NULL;\n    pEncoding = FX_NEW CFX_UnicodeEncoding(pFont);\n    return pEncoding;\n}\n"
  },
  {
    "path": "core/src/fxge/ge/fx_ge_fontmap.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxge/fx_ge.h\"\n#include \"../../../include/fxge/fx_freetype.h\"\n#include \"text_int.h\"\n#define GET_TT_SHORT(w)  (FX_WORD)(((w)[0] << 8) | (w)[1])\n#define GET_TT_LONG(w) (FX_DWORD)(((w)[0] << 24) | ((w)[1] << 16) | ((w)[2] << 8) | (w)[3])\nCFX_SubstFont::CFX_SubstFont()\n{\n    m_ExtHandle = NULL;\n    m_Charset = 0;\n    m_SubstFlags = 0;\n    m_Weight = 0;\n    m_ItalicAngle = 0;\n    m_bSubstOfCJK = FALSE;\n    m_WeightCJK = 0;\n    m_bItlicCJK = FALSE;\n}\nCTTFontDesc::~CTTFontDesc()\n{\n    if (m_Type == 1) {\n        if (m_SingleFace.m_pFace) {\n            FXFT_Done_Face(m_SingleFace.m_pFace);\n        }\n    } else if (m_Type == 2) {\n        for (int i = 0; i < 16; i ++)\n            if (m_TTCFace.m_pFaces[i]) {\n                FXFT_Done_Face(m_TTCFace.m_pFaces[i]);\n            }\n    }\n    if (m_pFontData) {\n        FX_Free(m_pFontData);\n    }\n}\nFX_BOOL CTTFontDesc::ReleaseFace(FXFT_Face face)\n{\n    if (m_Type == 1) {\n        if (m_SingleFace.m_pFace != face) {\n            return FALSE;\n        }\n    } else if (m_Type == 2) {\n        int i;\n        for (i = 0; i < 16; i ++)\n            if (m_TTCFace.m_pFaces[i] == face) {\n                break;\n            }\n        if (i == 16) {\n            return FALSE;\n        }\n    }\n    m_RefCount --;\n    if (m_RefCount) {\n        return FALSE;\n    }\n    delete this;\n    return TRUE;\n}\nCFX_FontMgr::CFX_FontMgr()\n{\n    m_pBuiltinMapper = FX_NEW CFX_FontMapper;\n    if (!m_pBuiltinMapper) {\n        return;\n    }\n    m_pBuiltinMapper->m_pFontMgr = this;\n    m_pExtMapper = NULL;\n    m_FTLibrary = NULL;\n    FXSYS_memset32(m_ExternalFonts, 0, sizeof m_ExternalFonts);\n}\nCFX_FontMgr::~CFX_FontMgr()\n{\n    if (m_pBuiltinMapper) {\n        delete m_pBuiltinMapper;\n    }\n    FreeCache();\n    if (m_FTLibrary) {\n        FXFT_Done_FreeType(m_FTLibrary);\n    }\n}\nvoid CFX_FontMgr::InitFTLibrary()\n{\n    if (m_FTLibrary == NULL) {\n        FXFT_Init_FreeType(&m_FTLibrary);\n    }\n}\nvoid CFX_FontMgr::FreeCache()\n{\n    FX_POSITION pos = m_FaceMap.GetStartPosition();\n    while(pos) {\n        CFX_ByteString Key;\n        CTTFontDesc* face;\n        m_FaceMap.GetNextAssoc(pos, Key, (void*&)face);\n        delete face;\n    }\n    m_FaceMap.RemoveAll();\n}\nvoid CFX_FontMgr::SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo)\n{\n    m_pBuiltinMapper->SetSystemFontInfo(pFontInfo);\n}\nFXFT_Face CFX_FontMgr::FindSubstFont(const CFX_ByteString& face_name, FX_BOOL bTrueType,\n                                     FX_DWORD flags, int weight, int italic_angle, int CharsetCP, CFX_SubstFont* pSubstFont)\n{\n    if (m_FTLibrary == NULL) {\n        FXFT_Init_FreeType(&m_FTLibrary);\n    }\n    if (m_pExtMapper) {\n        FXFT_Face face = m_pExtMapper->FindSubstFont(face_name, bTrueType, flags, weight, italic_angle,\n                         CharsetCP, pSubstFont);\n        if (face) {\n            return face;\n        }\n    }\n    return m_pBuiltinMapper->FindSubstFont(face_name, bTrueType, flags, weight, italic_angle,\n                                           CharsetCP, pSubstFont);\n}\nFXFT_Face CFX_FontMgr::GetCachedFace(const CFX_ByteString& face_name,\n                                     int weight, FX_BOOL bItalic, FX_LPBYTE& pFontData)\n{\n    CFX_ByteString key(face_name);\n    key += ',';\n    key += CFX_ByteString::FormatInteger(weight);\n    key += bItalic ? 'I' : 'N';\n    CTTFontDesc* pFontDesc = NULL;\n    m_FaceMap.Lookup(key, (void*&)pFontDesc);\n    if(pFontDesc) {\n        pFontData = pFontDesc->m_pFontData;\n        pFontDesc->m_RefCount ++;\n        return pFontDesc->m_SingleFace.m_pFace;\n    }\n    return NULL;\n}\nFXFT_Face CFX_FontMgr::AddCachedFace(const CFX_ByteString& face_name,\n                                     int weight, FX_BOOL bItalic, FX_LPBYTE pData, FX_DWORD size, int face_index)\n{\n    CTTFontDesc* pFontDesc = FX_NEW CTTFontDesc;\n    if (!pFontDesc) {\n        return NULL;\n    }\n    pFontDesc->m_Type = 1;\n    pFontDesc->m_SingleFace.m_pFace = NULL;\n    pFontDesc->m_SingleFace.m_bBold = weight;\n    pFontDesc->m_SingleFace.m_bItalic = bItalic;\n    pFontDesc->m_pFontData = pData;\n    pFontDesc->m_RefCount = 1;\n    FXFT_Library library;\n    if (m_FTLibrary == NULL) {\n        FXFT_Init_FreeType(&m_FTLibrary);\n    }\n    library = m_FTLibrary;\n    int ret = FXFT_New_Memory_Face(library, pData, size, face_index, &pFontDesc->m_SingleFace.m_pFace);\n    if (ret) {\n        delete pFontDesc;\n        return NULL;\n    }\n    ret = FXFT_Set_Pixel_Sizes(pFontDesc->m_SingleFace.m_pFace, 64, 64);\n    if (ret) {\n        delete pFontDesc;\n        return NULL;\n    }\n    CFX_ByteString key(face_name);\n    key += ',';\n    key += CFX_ByteString::FormatInteger(weight);\n    key += bItalic ? 'I' : 'N';\n    m_FaceMap.SetAt(key, pFontDesc);\n    return pFontDesc->m_SingleFace.m_pFace;\n}\nconst FX_LPCSTR g_Base14FontNames[14] = {\n    \"Courier\",\n    \"Courier-Bold\",\n    \"Courier-BoldOblique\",\n    \"Courier-Oblique\",\n    \"Helvetica\",\n    \"Helvetica-Bold\",\n    \"Helvetica-BoldOblique\",\n    \"Helvetica-Oblique\",\n    \"Times-Roman\",\n    \"Times-Bold\",\n    \"Times-BoldItalic\",\n    \"Times-Italic\",\n    \"Symbol\",\n    \"ZapfDingbats\",\n};\nconst struct _AltFontName {\n    const FX_CHAR*\tm_pName;\n    int\t\tm_Index;\n}\ng_AltFontNames[] = {\n    {\"Arial\", 4},\n    {\"Arial,Bold\", 5},\n    {\"Arial,BoldItalic\", 6},\n    {\"Arial,Italic\", 7},\n    {\"Arial-Bold\", 5},\n    {\"Arial-BoldItalic\", 6},\n    {\"Arial-BoldItalicMT\", 6},\n    {\"Arial-BoldMT\", 5},\n    {\"Arial-Italic\", 7},\n    {\"Arial-ItalicMT\", 7},\n    {\"ArialBold\", 5},\n    {\"ArialBoldItalic\", 6},\n    {\"ArialItalic\", 7},\n    {\"ArialMT\", 4},\n    {\"ArialMT,Bold\", 5},\n    {\"ArialMT,BoldItalic\", 6},\n    {\"ArialMT,Italic\", 7},\n    {\"ArialRoundedMTBold\", 5},\n    {\"Courier\", 0},\n    {\"Courier,Bold\", 1},\n    {\"Courier,BoldItalic\", 2},\n    {\"Courier,Italic\", 3},\n    {\"Courier-Bold\", 1},\n    {\"Courier-BoldOblique\", 2},\n    {\"Courier-Oblique\", 3},\n    {\"CourierBold\", 1},\n    {\"CourierBoldItalic\", 2},\n    {\"CourierItalic\", 3},\n    {\"CourierNew\", 0},\n    {\"CourierNew,Bold\", 1},\n    {\"CourierNew,BoldItalic\", 2},\n    {\"CourierNew,Italic\", 3},\n    {\"CourierNew-Bold\", 1},\n    {\"CourierNew-BoldItalic\", 2},\n    {\"CourierNew-Italic\", 3},\n    {\"CourierNewBold\", 1},\n    {\"CourierNewBoldItalic\", 2},\n    {\"CourierNewItalic\", 3},\n    {\"CourierNewPS-BoldItalicMT\", 2},\n    {\"CourierNewPS-BoldMT\", 1},\n    {\"CourierNewPS-ItalicMT\", 3},\n    {\"CourierNewPSMT\", 0},\n    {\"CourierStd\", 0},\n    {\"CourierStd-Bold\", 1},\n    {\"CourierStd-BoldOblique\", 2},\n    {\"CourierStd-Oblique\", 3},\n    {\"Helvetica\", 4},\n    {\"Helvetica,Bold\", 5},\n    {\"Helvetica,BoldItalic\", 6},\n    {\"Helvetica,Italic\", 7},\n    {\"Helvetica-Bold\", 5},\n    {\"Helvetica-BoldItalic\", 6},\n    {\"Helvetica-BoldOblique\", 6},\n    {\"Helvetica-Italic\", 7},\n    {\"Helvetica-Oblique\", 7},\n    {\"HelveticaBold\", 5},\n    {\"HelveticaBoldItalic\", 6},\n    {\"HelveticaItalic\", 7},\n    {\"Symbol\", 12},\n    {\"SymbolMT\", 12},\n    {\"Times-Bold\", 9},\n    {\"Times-BoldItalic\", 10},\n    {\"Times-Italic\", 11},\n    {\"Times-Roman\", 8},\n    {\"TimesBold\", 9},\n    {\"TimesBoldItalic\", 10},\n    {\"TimesItalic\", 11},\n    {\"TimesNewRoman\", 8},\n    {\"TimesNewRoman,Bold\", 9},\n    {\"TimesNewRoman,BoldItalic\", 10},\n    {\"TimesNewRoman,Italic\", 11},\n    {\"TimesNewRoman-Bold\", 9},\n    {\"TimesNewRoman-BoldItalic\", 10},\n    {\"TimesNewRoman-Italic\", 11},\n    {\"TimesNewRomanBold\", 9},\n    {\"TimesNewRomanBoldItalic\", 10},\n    {\"TimesNewRomanItalic\", 11},\n    {\"TimesNewRomanPS\", 8},\n    {\"TimesNewRomanPS-Bold\", 9},\n    {\"TimesNewRomanPS-BoldItalic\", 10},\n    {\"TimesNewRomanPS-BoldItalicMT\", 10},\n    {\"TimesNewRomanPS-BoldMT\", 9},\n    {\"TimesNewRomanPS-Italic\", 11},\n    {\"TimesNewRomanPS-ItalicMT\", 11},\n    {\"TimesNewRomanPSMT\", 8},\n    {\"TimesNewRomanPSMT,Bold\", 9},\n    {\"TimesNewRomanPSMT,BoldItalic\", 10},\n    {\"TimesNewRomanPSMT,Italic\", 11},\n    {\"ZapfDingbats\", 13},\n};\nextern \"C\" {\n    static int compareString(const void* key, const void* element)\n    {\n        return FXSYS_stricmp((FX_LPCSTR)key, ((_AltFontName*)element)->m_pName);\n    }\n}\nint _PDF_GetStandardFontName(CFX_ByteString& name)\n{\n    _AltFontName* found = (_AltFontName*)FXSYS_bsearch((FX_LPCSTR)name, g_AltFontNames,\n                          sizeof g_AltFontNames / sizeof (_AltFontName), sizeof (_AltFontName), compareString);\n    if (found == NULL) {\n        return -1;\n    }\n    name = g_Base14FontNames[found->m_Index];\n    return found->m_Index;\n}\nint GetTTCIndex(FX_LPCBYTE pFontData, FX_DWORD ttc_size, FX_DWORD font_offset)\n{\n    int face_index = 0;\n    FX_LPCBYTE p = pFontData + 8;\n    FX_DWORD nfont = GET_TT_LONG(p);\n    FX_DWORD index;\n    for (index = 0; index < nfont; index ++) {\n        p = pFontData + 12 + index * 4;\n        if (GET_TT_LONG(p) == font_offset) {\n            break;\n        }\n    }\n    if(index >= nfont) {\n        face_index = 0;\n    } else {\n        face_index = index;\n    }\n    return face_index;\n}\nFXFT_Face CFX_FontMgr::GetCachedTTCFace(int ttc_size, FX_DWORD checksum,\n                                        int font_offset, FX_LPBYTE& pFontData)\n{\n    CFX_ByteString key;\n    key.Format(\"%d:%d\", ttc_size, checksum);\n    CTTFontDesc* pFontDesc = NULL;\n    m_FaceMap.Lookup(key, (void*&)pFontDesc);\n    if (pFontDesc == NULL) {\n        return NULL;\n    }\n    pFontData = pFontDesc->m_pFontData;\n    pFontDesc->m_RefCount ++;\n    int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset);\n    if (pFontDesc->m_TTCFace.m_pFaces[face_index] == NULL) {\n        pFontDesc->m_TTCFace.m_pFaces[face_index] = GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index);\n    }\n    return pFontDesc->m_TTCFace.m_pFaces[face_index];\n}\nFXFT_Face CFX_FontMgr::AddCachedTTCFace(int ttc_size, FX_DWORD checksum,\n                                        FX_LPBYTE pData, FX_DWORD size, int font_offset)\n{\n    CFX_ByteString key;\n    key.Format(\"%d:%d\", ttc_size, checksum);\n    CTTFontDesc* pFontDesc = FX_NEW CTTFontDesc;\n    if (!pFontDesc) {\n        return NULL;\n    }\n    pFontDesc->m_Type = 2;\n    pFontDesc->m_pFontData = pData;\n    for (int i = 0; i < 16; i ++) {\n        pFontDesc->m_TTCFace.m_pFaces[i] = NULL;\n    }\n    pFontDesc->m_RefCount ++;\n    key.Format(\"%d:%d\", ttc_size, checksum);\n    m_FaceMap.SetAt(key, pFontDesc);\n    int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset);\n    pFontDesc->m_TTCFace.m_pFaces[face_index] = GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index);\n    return pFontDesc->m_TTCFace.m_pFaces[face_index];\n}\nFXFT_Face CFX_FontMgr::GetFixedFace(FX_LPCBYTE pData, FX_DWORD size, int face_index)\n{\n    FXFT_Library library;\n    if (m_FTLibrary == NULL) {\n        FXFT_Init_FreeType(&m_FTLibrary);\n    }\n    library = m_FTLibrary;\n    FXFT_Face face = NULL;\n    int ret = FXFT_New_Memory_Face(library, pData, size, face_index, &face);\n    if (ret) {\n        return NULL;\n    }\n    ret = FXFT_Set_Pixel_Sizes(face, 64, 64);\n    if (ret) {\n        return NULL;\n    }\n    return face;\n}\nFXFT_Face CFX_FontMgr::GetFileFace(FX_LPCSTR filename, int face_index)\n{\n    FXFT_Library library;\n    if (m_FTLibrary == NULL) {\n        FXFT_Init_FreeType(&m_FTLibrary);\n    }\n    library = m_FTLibrary;\n    FXFT_Face face = NULL;\n    int ret = FXFT_New_Face(library, filename, face_index, &face);\n    if (ret) {\n        return NULL;\n    }\n    ret = FXFT_Set_Pixel_Sizes(face, 64, 64);\n    if (ret) {\n        return NULL;\n    }\n    return face;\n}\nvoid CFX_FontMgr::ReleaseFace(FXFT_Face face)\n{\n    if (face == NULL) {\n        return;\n    }\n    FX_POSITION pos = m_FaceMap.GetStartPosition();\n    while(pos) {\n        CFX_ByteString Key;\n        CTTFontDesc* ttface;\n        m_FaceMap.GetNextAssoc(pos, Key, (void*&)ttface);\n        if (ttface->ReleaseFace(face)) {\n            m_FaceMap.RemoveKey(Key);\n        }\n    }\n}\nextern \"C\" {\n    extern const unsigned char g_FoxitFixedItalicFontData [18746];\n    extern const unsigned char g_FoxitFixedFontData [17597];\n    extern const unsigned char g_FoxitSansItalicFontData [16339];\n    extern const unsigned char g_FoxitSansFontData [15025];\n    extern const unsigned char g_FoxitSerifItalicFontData [21227];\n    extern const unsigned char g_FoxitSerifFontData [19469];\n    extern const unsigned char g_FoxitFixedBoldItalicFontData [19151];\n    extern const unsigned char g_FoxitFixedBoldFontData [18055];\n    extern const unsigned char g_FoxitSansBoldItalicFontData [16418];\n    extern const unsigned char g_FoxitSansBoldFontData [16344];\n    extern const unsigned char g_FoxitSerifBoldItalicFontData [20733];\n    extern const unsigned char g_FoxitSerifBoldFontData [19395];\n    extern const unsigned char g_FoxitSymbolFontData[16729];\n    extern const unsigned char g_FoxitDingbatsFontData[29513];\n    extern const unsigned char g_FoxitSerifMMFontData[113417];\n    extern const unsigned char g_FoxitSansMMFontData[66919];\n};\nconst FoxitFonts g_FoxitFonts[14] = {\n    {g_FoxitFixedFontData, 17597},\n    {g_FoxitFixedBoldFontData, 18055},\n    {g_FoxitFixedBoldItalicFontData, 19151},\n    {g_FoxitFixedItalicFontData, 18746},\n    {g_FoxitSansFontData, 15025},\n    {g_FoxitSansBoldFontData, 16344},\n    {g_FoxitSansBoldItalicFontData, 16418},\n    {g_FoxitSansItalicFontData, 16339},\n    {g_FoxitSerifFontData, 19469},\n    {g_FoxitSerifBoldFontData, 19395},\n    {g_FoxitSerifBoldItalicFontData, 20733},\n    {g_FoxitSerifItalicFontData, 21227},\n    {g_FoxitSymbolFontData, 16729},\n    {g_FoxitDingbatsFontData, 29513},\n};\nvoid _FPDFAPI_GetInternalFontData(int id, FX_LPCBYTE& data, FX_DWORD& size)\n{\n    CFX_GEModule::Get()->GetFontMgr()->GetStandardFont(data, size, id);\n}\nFX_BOOL CFX_FontMgr::GetStandardFont(FX_LPCBYTE& pFontData, FX_DWORD& size, int index)\n{\n    if (index > 15 || index < 0) {\n        return FALSE;\n    }\n    {\n        if (index >= 14) {\n            if (index == 14) {\n                pFontData = g_FoxitSerifMMFontData;\n                size = 113417;\n            } else {\n                pFontData = g_FoxitSansMMFontData;\n                size = 66919;\n            }\n        } else {\n            pFontData = g_FoxitFonts[index].m_pFontData;\n            size = g_FoxitFonts[index].m_dwSize;\n        }\n    }\n    return TRUE;\n}\nCFX_FontMapper::CFX_FontMapper()\n{\n    FXSYS_memset32(m_FoxitFaces, 0, sizeof m_FoxitFaces);\n    m_MMFaces[0] = m_MMFaces[1] = NULL;\n    m_pFontInfo = NULL;\n    m_bListLoaded = FALSE;\n    m_pFontEnumerator = NULL;\n}\nCFX_FontMapper::~CFX_FontMapper()\n{\n    for (int i = 0; i < 14; i ++)\n        if (m_FoxitFaces[i]) {\n            FXFT_Done_Face(m_FoxitFaces[i]);\n        }\n    if (m_MMFaces[0]) {\n        FXFT_Done_Face(m_MMFaces[0]);\n    }\n    if (m_MMFaces[1]) {\n        FXFT_Done_Face(m_MMFaces[1]);\n    }\n    if (m_pFontInfo) {\n        m_pFontInfo->Release();\n    }\n}\nvoid CFX_FontMapper::SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo)\n{\n    if (pFontInfo == NULL) {\n        return;\n    }\n    if (m_pFontInfo) {\n        m_pFontInfo->Release();\n    }\n    m_pFontInfo = pFontInfo;\n}\nstatic CFX_ByteString _TT_NormalizeName(FX_LPCSTR family)\n{\n    CFX_ByteString norm(family, -1);\n    norm.Remove(' ');\n    norm.Remove('-');\n    norm.Remove(',');\n    int pos = norm.Find('+');\n    if (pos > 0) {\n        norm = norm.Left(pos);\n    }\n    norm.MakeLower();\n    return norm;\n}\nCFX_ByteString _FPDF_GetNameFromTT(FX_LPCBYTE name_table, FX_DWORD name_id)\n{\n    FX_LPCBYTE ptr = name_table + 2;\n    int name_count = GET_TT_SHORT(ptr);\n    int string_offset = GET_TT_SHORT(ptr + 2);\n    FX_LPCBYTE string_ptr = name_table + string_offset;\n    ptr += 4;\n    for (int i = 0; i < name_count; i ++) {\n        if (GET_TT_SHORT(ptr + 6) == name_id && GET_TT_SHORT(ptr) == 1 && GET_TT_SHORT(ptr + 2) == 0) {\n            return CFX_ByteStringC(string_ptr + GET_TT_SHORT(ptr + 10), GET_TT_SHORT(ptr + 8));\n        }\n        ptr += 12;\n    }\n    return CFX_ByteString();\n}\nstatic CFX_ByteString _FPDF_ReadStringFromFile(FXSYS_FILE* pFile, FX_DWORD size)\n{\n    CFX_ByteString buffer;\n    if (!FXSYS_fread(buffer.GetBuffer(size), size, 1, pFile)) {\n        return CFX_ByteString();\n    }\n    buffer.ReleaseBuffer(size);\n    return buffer;\n}\nstatic CFX_ByteString _FPDF_ReadStringFromStreamFile(IFX_FileStream* pFile, FX_DWORD size)\n{\n    CFX_ByteString buffer;\n    if (!pFile->ReadBlock(buffer.GetBuffer(size), size)) {\n        return CFX_ByteString();\n    }\n    buffer.ReleaseBuffer(size);\n    return buffer;\n}\nCFX_ByteString _FPDF_LoadTableFromTT(FXSYS_FILE* pFile, FX_LPCBYTE pTables, FX_DWORD nTables, FX_DWORD tag)\n{\n    for (FX_DWORD i = 0; i < nTables; i ++) {\n        FX_LPCBYTE p = pTables + i * 16;\n        if (GET_TT_LONG(p) == tag) {\n            FX_DWORD offset = GET_TT_LONG(p + 8);\n            FX_DWORD size = GET_TT_LONG(p + 12);\n            FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET);\n            return _FPDF_ReadStringFromFile(pFile, size);\n        }\n    }\n    return CFX_ByteString();\n}\nCFX_ByteString _FPDF_LoadTableFromTTStreamFile(IFX_FileStream* pFile, FX_LPCBYTE pTables, FX_DWORD nTables, FX_DWORD tag)\n{\n    for (FX_DWORD i = 0; i < nTables; i ++) {\n        FX_LPCBYTE p = pTables + i * 16;\n        if (GET_TT_LONG(p) == tag) {\n            FX_DWORD offset = GET_TT_LONG(p + 8);\n            FX_DWORD size = GET_TT_LONG(p + 12);\n            CFX_ByteString buffer;\n            if (!pFile->ReadBlock(buffer.GetBuffer(size), offset, size)) {\n                return CFX_ByteString();\n            }\n            buffer.ReleaseBuffer(size);\n            return buffer;\n        }\n    }\n    return CFX_ByteString();\n}\nCFX_ByteString CFX_FontMapper::GetPSNameFromTT(void* hFont)\n{\n    if (m_pFontInfo == NULL) {\n        CFX_ByteString();\n    }\n    CFX_ByteString result;\n    FX_DWORD size = m_pFontInfo->GetFontData(hFont, 0x6e616d65, NULL, 0);\n    if (size) {\n        FX_LPBYTE buffer = FX_Alloc(FX_BYTE, size);\n        if (!buffer) {\n            return result;\n        }\n        m_pFontInfo->GetFontData(hFont, 0x6e616d65, buffer, size);\n        result = _FPDF_GetNameFromTT(buffer, 6);\n        FX_Free(buffer);\n    }\n    return result;\n}\nvoid CFX_FontMapper::AddInstalledFont(const CFX_ByteString& name, int charset)\n{\n    if (m_pFontInfo == NULL) {\n        return;\n    }\n    if (m_CharsetArray.Find((FX_DWORD)charset) == -1) {\n        m_CharsetArray.Add((FX_DWORD)charset);\n        m_FaceArray.Add(name);\n    }\n    if (name == m_LastFamily) {\n        return;\n    }\n    FX_LPCBYTE ptr = name;\n    FX_BOOL bLocalized = FALSE;\n    for (int i = 0; i < name.GetLength(); i ++)\n        if (ptr[i] > 0x80) {\n            bLocalized = TRUE;\n            break;\n        }\n    if (bLocalized) {\n        void* hFont = m_pFontInfo->GetFont(name);\n        if (hFont == NULL) {\n            FX_BOOL bExact;\n            hFont = m_pFontInfo->MapFont(0, 0, FXFONT_DEFAULT_CHARSET, 0, name, bExact);\n            if (hFont == NULL) {\n                return;\n            }\n        }\n        CFX_ByteString new_name = GetPSNameFromTT(hFont);\n        if (!new_name.IsEmpty()) {\n            new_name.Insert(0, ' ');\n            m_InstalledTTFonts.Add(new_name);\n        }\n        m_pFontInfo->DeleteFont(hFont);\n    }\n    m_InstalledTTFonts.Add(name);\n    m_LastFamily = name;\n}\nvoid CFX_FontMapper::LoadInstalledFonts()\n{\n    if (m_pFontInfo == NULL) {\n        return;\n    }\n    if (m_bListLoaded) {\n        return;\n    }\n    if (m_bListLoaded) {\n        return;\n    }\n    m_pFontInfo->EnumFontList(this);\n    m_bListLoaded = TRUE;\n}\nCFX_ByteString CFX_FontMapper::MatchInstalledFonts(const CFX_ByteString& norm_name)\n{\n    LoadInstalledFonts();\n    int i;\n    for (i = m_InstalledTTFonts.GetSize() - 1; i >= 0; i --) {\n        CFX_ByteString norm1 = _TT_NormalizeName(m_InstalledTTFonts[i]);\n        if (norm1 == norm_name) {\n            break;\n        }\n    }\n    if (i < 0) {\n        return CFX_ByteString();\n    }\n    CFX_ByteString match = m_InstalledTTFonts[i];\n    if (match[0] == ' ') {\n        match = m_InstalledTTFonts[i + 1];\n    }\n    return match;\n}\ntypedef struct _CHARSET_MAP_ {\n    FX_BYTE charset;\n    FX_WORD codepage;\n} CHARSET_MAP;\nstatic const CHARSET_MAP g_Codepage2CharsetTable[] = {\n    { 1\t , 0\t},\n    { 2\t , 42\t},\n    { 254, 437\t},\n    { 255, 850\t},\n    { 222, 874\t},\n    { 128, 932\t},\n    { 134, 936\t},\n    { 129, 949\t},\n    { 136, 950\t},\n    { 238, 1250\t},\n    { 204, 1251\t},\n    { 0,   1252\t},\n    { 161, 1253\t},\n    { 162, 1254\t},\n    { 177, 1255\t},\n    { 178, 1256\t},\n    { 186, 1257\t},\n    { 163, 1258 },\n    { 130, 1361 },\n    { 77, 10000 },\n    { 78, 10001 },\n    { 79, 10003 },\n    { 80, 10008 },\n    { 81, 10002 },\n    { 83, 10005 },\n    { 84, 10004 },\n    { 85, 10006 },\n    { 86, 10081 },\n    { 87, 10021 },\n    { 88, 10029 },\n    { 89, 10007 },\n};\nFX_BYTE _GetCharsetFromCodePage(FX_WORD codepage)\n{\n    FX_INT32 iEnd = sizeof(g_Codepage2CharsetTable) / sizeof(CHARSET_MAP) - 1;\n    FXSYS_assert(iEnd >= 0);\n    FX_INT32 iStart = 0, iMid;\n    do {\n        iMid = (iStart + iEnd) / 2;\n        const CHARSET_MAP & cp = g_Codepage2CharsetTable[iMid];\n        if (codepage == cp.codepage) {\n            return cp.charset;\n        } else if (codepage < cp.codepage) {\n            iEnd = iMid - 1;\n        } else {\n            iStart = iMid + 1;\n        }\n    } while (iStart <= iEnd);\n    return 1;\n}\nFX_DWORD _GetCodePageRangeFromCharset(int charset)\n{\n    if (charset == FXFONT_EASTEUROPE_CHARSET) {\n        return 1 << 1;\n    }\n    if (charset == FXFONT_GREEK_CHARSET) {\n        return 1 << 3;\n    }\n    if (charset == FXFONT_TURKISH_CHARSET) {\n        return 1 << 4;\n    }\n    if (charset == FXFONT_HEBREW_CHARSET) {\n        return 1 << 5;\n    }\n    if (charset == FXFONT_ARABIC_CHARSET) {\n        return 1 << 6;\n    }\n    if (charset == FXFONT_BALTIC_CHARSET) {\n        return 1 << 7;\n    }\n    if (charset == FXFONT_THAI_CHARSET) {\n        return 1 << 16;\n    }\n    if (charset == FXFONT_SHIFTJIS_CHARSET) {\n        return 1 << 17;\n    }\n    if (charset == FXFONT_GB2312_CHARSET) {\n        return 1 << 18;\n    }\n    if (charset == FXFONT_CHINESEBIG5_CHARSET) {\n        return 1 << 20;\n    }\n    if (charset == FXFONT_HANGEUL_CHARSET) {\n        return 1 << 19;\n    }\n    if (charset == FXFONT_SYMBOL_CHARSET) {\n        return 1 << 31;\n    }\n    return 1 << 21;\n}\nstatic int CP2CharSet(int cp)\n{\n    if(cp == 932) {\n        return FXFONT_SHIFTJIS_CHARSET;\n    } else if(cp == 936) {\n        return FXFONT_GB2312_CHARSET;\n    } else if(cp == 949) {\n        return FXFONT_HANGEUL_CHARSET;\n    } else if(cp == 950) {\n        return FXFONT_CHINESEBIG5_CHARSET;\n    }\n    return FXFONT_DEFAULT_CHARSET;\n}\nFXFT_Face CFX_FontMapper::UseInternalSubst(CFX_SubstFont* pSubstFont, int iBaseFont, int italic_angle, int weight, int picthfamily)\n{\n    if (iBaseFont < 12) {\n        if (m_FoxitFaces[iBaseFont]) {\n            return m_FoxitFaces[iBaseFont];\n        }\n        FX_LPCBYTE pFontData = NULL;\n        FX_DWORD size = 0;\n        if (m_pFontMgr->GetStandardFont(pFontData, size, iBaseFont)) {\n            m_FoxitFaces[iBaseFont] = m_pFontMgr->GetFixedFace(pFontData, size, 0);\n            return m_FoxitFaces[iBaseFont];\n        }\n    }\n    pSubstFont->m_SubstFlags |= FXFONT_SUBST_MM;\n    pSubstFont->m_ItalicAngle = italic_angle;\n    if (weight) {\n        pSubstFont->m_Weight = weight;\n    }\n    if (picthfamily & FXFONT_FF_ROMAN) {\n        pSubstFont->m_Weight = pSubstFont->m_Weight * 4 / 5;\n        pSubstFont->m_Family = \"Chrome Serif\";\n        if (m_MMFaces[1]) {\n            return m_MMFaces[1];\n        }\n        FX_LPCBYTE pFontData = NULL;\n        FX_DWORD size;\n        m_pFontMgr->GetStandardFont(pFontData, size, 14);\n        m_MMFaces[1] = m_pFontMgr->GetFixedFace(pFontData, size, 0);\n        return m_MMFaces[1];\n    }\n    pSubstFont->m_Family = \"Chrome Sans\";\n    if (m_MMFaces[0]) {\n        return m_MMFaces[0];\n    }\n    FX_LPCBYTE pFontData = NULL;\n    FX_DWORD size = 0;\n    m_pFontMgr->GetStandardFont(pFontData, size, 15);\n    m_MMFaces[0] = m_pFontMgr->GetFixedFace(pFontData, size, 0);\n    return m_MMFaces[0];\n}\nconst struct _AltFontFamily {\n    FX_LPCSTR m_pFontName;\n    FX_LPCSTR m_pFontFamily;\n}\ng_AltFontFamilies[] = {\n    {\"AGaramondPro\", \"Adobe Garamond Pro\"},\n    {\"BankGothicBT-Medium\", \"BankGothic Md BT\"},\n    {\"ForteMT\", \"Forte\"},\n};\nextern \"C\" {\n    static int compareFontFamilyString(const void* key, const void* element)\n    {\n        CFX_ByteString str_key((FX_LPCSTR)key);\n        if (str_key.Find(((_AltFontFamily*)element)->m_pFontName) != -1) {\n            return 0;\n        }\n        return FXSYS_stricmp((FX_LPCSTR)key, ((_AltFontFamily*)element)->m_pFontName);\n    }\n}\n#define FX_FONT_STYLE_None\t\t0x00\n#define FX_FONT_STYLE_Bold\t\t0x01\n#define FX_FONT_STYLE_Italic\t0x02\n#define FX_FONT_STYLE_BoldBold\t0x04\nstatic CFX_ByteString _GetFontFamily(CFX_ByteString fontName, int nStyle)\n{\n    if (fontName.Find(\"Script\") >= 0) {\n        if ((nStyle & FX_FONT_STYLE_Bold) == FX_FONT_STYLE_Bold) {\n            fontName = \"ScriptMTBold\";\n        } else if (fontName.Find(\"Palace\") >= 0) {\n            fontName = \"PalaceScriptMT\";\n        } else if (fontName.Find(\"French\") >= 0) {\n            fontName = \"FrenchScriptMT\";\n        } else if (fontName.Find(\"FreeStyle\") >= 0) {\n            fontName = \"FreeStyleScript\";\n        }\n        return fontName;\n    }\n    _AltFontFamily* found = (_AltFontFamily*)FXSYS_bsearch((FX_LPCSTR)fontName, g_AltFontFamilies,\n                            sizeof g_AltFontFamilies / sizeof (_AltFontFamily), sizeof (_AltFontFamily), compareFontFamilyString);\n    if (found == NULL) {\n        return fontName;\n    }\n    return found->m_pFontFamily;\n};\ntypedef struct _FX_FontStyle {\n    FX_LPCSTR style;\n    FX_INT32 len;\n} FX_FontStyle;\nconst FX_FontStyle g_FontStyles[] = {\n    \"Bold\", 4,\n    \"Italic\", 6,\n    \"BoldItalic\", 10,\n    \"Reg\", 3,\n    \"Regular\", 7,\n};\nCFX_ByteString ParseStyle(FX_LPCSTR pStyle, int iLen, int iIndex)\n{\n    CFX_ByteTextBuf buf;\n    if (!iLen || iLen <= iIndex) {\n        return buf.GetByteString();\n    }\n    while (iIndex < iLen) {\n        if (pStyle[iIndex] == ',') {\n            break;\n        }\n        buf.AppendChar(pStyle[iIndex]);\n        ++iIndex;\n    }\n    return buf.GetByteString();\n}\nFX_INT32 GetStyleType(const CFX_ByteString &bsStyle, FX_BOOL bRevert)\n{\n    FX_INT32 iLen = bsStyle.GetLength();\n    if (!iLen) {\n        return -1;\n    }\n    int iSize = sizeof(g_FontStyles) / sizeof(FX_FontStyle);\n    const FX_FontStyle *pStyle = NULL;\n    for (int i = iSize - 1; i >= 0; --i) {\n        pStyle = g_FontStyles + i;\n        if (!pStyle || pStyle->len > iLen) {\n            continue;\n        }\n        if (!bRevert) {\n            if (bsStyle.Left(pStyle->len).Compare(pStyle->style) == 0) {\n                return i;\n            }\n        } else {\n            if (bsStyle.Right(pStyle->len).Compare(pStyle->style) == 0) {\n                return i;\n            }\n        }\n    }\n    return -1;\n}\nFX_BOOL CheckSupportThirdPartFont(CFX_ByteString name, int &PitchFamily)\n{\n    if (name == FX_BSTRC(\"MyriadPro\")) {\n        PitchFamily &= ~FXFONT_FF_ROMAN;\n        return TRUE;\n    }\n    return FALSE;\n}\nFXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name, FX_BOOL bTrueType, FX_DWORD flags,\n                                        int weight, int italic_angle, int WindowCP, CFX_SubstFont* pSubstFont)\n{\n    if (!(flags & FXFONT_USEEXTERNATTR)) {\n        weight = FXFONT_FW_NORMAL;\n        italic_angle = 0;\n    }\n    CFX_ByteString SubstName = name;\n    SubstName.Remove(0x20);\n    if (bTrueType) {\n        if (name[0] == '@') {\n            SubstName = name.Mid(1);\n        }\n    }\n    _PDF_GetStandardFontName(SubstName);\n    if (SubstName == FX_BSTRC(\"Symbol\") && !bTrueType) {\n        pSubstFont->m_Family = \"Chrome Symbol\";\n        pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET;\n        pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;\n        if (m_FoxitFaces[12]) {\n            return m_FoxitFaces[12];\n        }\n        FX_LPCBYTE pFontData = NULL;\n        FX_DWORD size = 0;\n        m_pFontMgr->GetStandardFont(pFontData, size, 12);\n        m_FoxitFaces[12] = m_pFontMgr->GetFixedFace(pFontData, size, 0);\n        return m_FoxitFaces[12];\n    }\n    if (SubstName == FX_BSTRC(\"ZapfDingbats\")) {\n        pSubstFont->m_Family = \"Chrome Dingbats\";\n        pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET;\n        pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;\n        if (m_FoxitFaces[13]) {\n            return m_FoxitFaces[13];\n        }\n        FX_LPCBYTE pFontData = NULL;\n        FX_DWORD size = 0;\n        m_pFontMgr->GetStandardFont(pFontData, size, 13);\n        m_FoxitFaces[13] = m_pFontMgr->GetFixedFace(pFontData, size, 0);\n        return m_FoxitFaces[13];\n    }\n    int iBaseFont = 0;\n    CFX_ByteString family, style;\n    FX_BOOL\tbHasComma = FALSE;\n    FX_BOOL bHasHypen = FALSE;\n    int find = SubstName.Find(FX_BSTRC(\",\"), 0);\n    if (find >= 0) {\n        family = SubstName.Left(find);\n        _PDF_GetStandardFontName(family);\n        style = SubstName.Mid(find + 1);\n        bHasComma = TRUE;\n    } else {\n        family = SubstName;\n    }\n    for (; iBaseFont < 12; iBaseFont ++)\n        if (family == CFX_ByteStringC(g_Base14FontNames[iBaseFont])) {\n            break;\n        }\n    int PitchFamily = 0;\n    FX_BOOL bItalic = FALSE;\n    FX_DWORD nStyle = 0;\n    FX_BOOL bStyleAvail = FALSE;\n    FX_BOOL bFamilyStyleIsWhole = FALSE;\n    FX_BOOL bNextF = FALSE;\n    if (iBaseFont < 12) {\n        family = g_Base14FontNames[iBaseFont];\n        if ((iBaseFont % 4) == 1 || (iBaseFont % 4) == 2) {\n            nStyle |= FX_FONT_STYLE_Bold;\n        }\n        if ((iBaseFont % 4) / 2) {\n            nStyle |= FX_FONT_STYLE_Italic;\n        }\n        if (iBaseFont < 4) {\n            PitchFamily |= FXFONT_FF_FIXEDPITCH;\n        }\n        if (iBaseFont >= 8) {\n            PitchFamily |= FXFONT_FF_ROMAN;\n        }\n    } else {\n        if (!bHasComma) {\n            find = family.ReverseFind('-');\n            if (find >= 0) {\n                style = family.Mid(find + 1);\n                family = family.Left(find);\n                bHasHypen = TRUE;\n            }\n        }\n        if (!bHasHypen) {\n            int nLen = family.GetLength();\n            FX_INT32 nRet = GetStyleType(family, TRUE);\n            if (nRet > -1) {\n                family = family.Left(nLen - g_FontStyles[nRet].len);\n                if (nRet == 0) {\n                    nStyle |= FX_FONT_STYLE_Bold;\n                }\n                if (nRet == 1) {\n                    nStyle |= FX_FONT_STYLE_Italic;\n                }\n                if (nRet == 2) {\n                    nStyle |= (FX_FONT_STYLE_Bold | FX_FONT_STYLE_Italic);\n                }\n            }\n        }\n        if (flags & FXFONT_SERIF) {\n            PitchFamily |= FXFONT_FF_ROMAN;\n        }\n        if (flags & FXFONT_SCRIPT) {\n            PitchFamily |= FXFONT_FF_SCRIPT;\n        }\n        if (flags & FXFONT_FIXED_PITCH) {\n            PitchFamily |= FXFONT_FF_FIXEDPITCH;\n        }\n    }\n    if (!style.IsEmpty()) {\n        int nLen = style.GetLength();\n        FX_LPCSTR pStyle = style;\n        int i = 0;\n        FX_BOOL bFirstItem = TRUE;\n        CFX_ByteString buf;\n        while (i < nLen) {\n            buf = ParseStyle(pStyle, nLen, i);\n            FX_INT32 nRet = GetStyleType(buf, FALSE);\n            if ((i && !bStyleAvail) || (!i && nRet < 0)) {\n                family = SubstName;\n                iBaseFont = 12;\n                break;\n            } else if (nRet >= 0) {\n                bStyleAvail = TRUE;\n            }\n            if (nRet == 0) {\n                if (nStyle & FX_FONT_STYLE_Bold) {\n                    nStyle |= FX_FONT_STYLE_BoldBold;\n                } else {\n                    nStyle |= FX_FONT_STYLE_Bold;\n                }\n                bFirstItem = FALSE;\n            }\n            if (nRet == 1) {\n                if (bFirstItem) {\n                    nStyle |= FX_FONT_STYLE_Italic;\n                } else {\n                    family = SubstName;\n                    iBaseFont = 12;\n                }\n                break;\n            }\n            if (nRet == 2) {\n                nStyle |= FX_FONT_STYLE_Italic;\n                if (nStyle & FX_FONT_STYLE_Bold) {\n                    nStyle |= FX_FONT_STYLE_BoldBold;\n                } else {\n                    nStyle |= FX_FONT_STYLE_Bold;\n                }\n                bFirstItem = FALSE;\n            }\n            i += buf.GetLength() + 1;\n        }\n    }\n    weight = weight ? weight : FXFONT_FW_NORMAL;\n    int old_weight = weight;\n    if (nStyle) {\n        weight = nStyle & FX_FONT_STYLE_BoldBold ? 900 : (nStyle & FX_FONT_STYLE_Bold ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL);\n    }\n    if (nStyle & FX_FONT_STYLE_Italic) {\n        bItalic = TRUE;\n    }\n    FX_BOOL bCJK = FALSE;\n    FX_BOOL bExact = FALSE;\n    int Charset = FXFONT_ANSI_CHARSET;\n    if (WindowCP) {\n        Charset = _GetCharsetFromCodePage(WindowCP);\n    } else if (iBaseFont == 12 && (flags & FXFONT_SYMBOLIC)) {\n        Charset = FXFONT_SYMBOL_CHARSET;\n    }\n    if (Charset == FXFONT_SHIFTJIS_CHARSET || Charset == FXFONT_GB2312_CHARSET ||\n            Charset == FXFONT_HANGEUL_CHARSET || Charset == FXFONT_CHINESEBIG5_CHARSET) {\n        bCJK = TRUE;\n    }\n    if (m_pFontInfo == NULL) {\n        pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;\n        return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily);\n    }\n    family = _GetFontFamily(family, nStyle);\n    CFX_ByteString match = MatchInstalledFonts(_TT_NormalizeName(family));\n    if (match.IsEmpty() && family != SubstName && (!bHasComma && (!bHasHypen || (bHasHypen && !bStyleAvail)))) {\n        match = MatchInstalledFonts(_TT_NormalizeName(SubstName));\n    }\n    if (match.IsEmpty() && iBaseFont >= 12) {\n        if (!bCJK) {\n            if (!CheckSupportThirdPartFont(family, PitchFamily)) {\n                if (italic_angle != 0) {\n                    bItalic = TRUE;\n                } else {\n                    bItalic = FALSE;\n                }\n                weight = old_weight;\n            }\n        } else {\n            pSubstFont->m_bSubstOfCJK = TRUE;\n            if (nStyle) {\n                pSubstFont->m_WeightCJK = weight;\n            } else {\n                pSubstFont->m_WeightCJK = FXFONT_FW_NORMAL;\n            }\n            if (nStyle & FX_FONT_STYLE_Italic) {\n                pSubstFont->m_bItlicCJK = TRUE;\n            }\n        }\n    } else {\n        italic_angle = 0;\n        weight = nStyle & FX_FONT_STYLE_BoldBold ? 900 : (nStyle & FX_FONT_STYLE_Bold ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL);\n    }\n    if (!match.IsEmpty() || iBaseFont < 12) {\n        pSubstFont->m_SubstFlags |= FXFONT_SUBST_EXACT;\n        if (!match.IsEmpty()) {\n            family = match;\n        }\n        if (iBaseFont < 12) {\n            if (nStyle && !(iBaseFont % 4)) {\n                if ((nStyle & 0x3) == 1) {\n                    iBaseFont += 1;\n                }\n                if ((nStyle & 0x3) == 2) {\n                    iBaseFont += 3;\n                }\n                if ((nStyle & 0x3) == 3) {\n                    iBaseFont += 2;\n                }\n            }\n            if (m_pFontMgr->m_ExternalFonts[iBaseFont].m_pFontData) {\n                if (m_FoxitFaces[iBaseFont]) {\n                    return m_FoxitFaces[iBaseFont];\n                }\n                m_FoxitFaces[iBaseFont] = m_pFontMgr->GetFixedFace(m_pFontMgr->m_ExternalFonts[iBaseFont].m_pFontData,\n                                          m_pFontMgr->m_ExternalFonts[iBaseFont].m_dwSize, 0);\n                if (m_FoxitFaces[iBaseFont]) {\n                    return m_FoxitFaces[iBaseFont];\n                }\n            } else {\n                family = g_Base14FontNames[iBaseFont];\n            }\n            pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;\n        }\n    } else {\n        if (flags & FXFONT_ITALIC) {\n            bItalic = TRUE;\n        }\n    }\n    bExact = !match.IsEmpty();\n    void* hFont = m_pFontInfo->MapFont(weight, bItalic, Charset, PitchFamily, family, bExact);\n    if (bExact) {\n        pSubstFont->m_SubstFlags |= FXFONT_SUBST_EXACT;\n    }\n    if (hFont == NULL) {\n        if (bCJK) {\n            if (italic_angle != 0) {\n                bItalic = TRUE;\n            } else {\n                bItalic = FALSE;\n            }\n            weight = old_weight;\n        }\n        if (!match.IsEmpty()) {\n            hFont = m_pFontInfo->GetFont(match);\n            if (hFont == NULL) {\n                return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily);\n            }\n        } else {\n            if (Charset == FXFONT_SYMBOL_CHARSET) {\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_ || _FXM_PLATFORM_  == _FXM_PLATFORM_ANDROID_\n                if (SubstName == FX_BSTRC(\"Symbol\")) {\n                    pSubstFont->m_Family = \"Chrome Symbol\";\n                    pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;\n                    pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET;\n                    if (m_FoxitFaces[12]) {\n                        return m_FoxitFaces[12];\n                    }\n                    FX_LPCBYTE pFontData = NULL;\n                    FX_DWORD size = 0;\n                    m_pFontMgr->GetStandardFont(pFontData, size, 12);\n                    m_FoxitFaces[12] = m_pFontMgr->GetFixedFace(pFontData, size, 0);\n                    return m_FoxitFaces[12];\n                } else {\n                    pSubstFont->m_SubstFlags |= FXFONT_SUBST_NONSYMBOL;\n                    return FindSubstFont(family, bTrueType, flags & ~FXFONT_SYMBOLIC, weight, italic_angle, 0, pSubstFont);\n                }\n#else\n                pSubstFont->m_SubstFlags |= FXFONT_SUBST_NONSYMBOL;\n                return FindSubstFont(family, bTrueType, flags & ~FXFONT_SYMBOLIC, weight, italic_angle, 0, pSubstFont);\n#endif\n            }\n            if (Charset == FXFONT_ANSI_CHARSET) {\n                pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;\n                return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily);\n            }\n            int index = m_CharsetArray.Find(Charset);\n            if (index < 0) {\n                return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily);\n            } else {\n                hFont = m_pFontInfo->GetFont(m_FaceArray[index]);\n            }\n        }\n    }\n    pSubstFont->m_ExtHandle = m_pFontInfo->RetainFont(hFont);\n    if (hFont == NULL) {\n        return NULL;\n    }\n    m_pFontInfo->GetFaceName(hFont, SubstName);\n    if (Charset == FXFONT_DEFAULT_CHARSET) {\n        m_pFontInfo->GetFontCharset(hFont, Charset);\n    }\n    FX_DWORD ttc_size = m_pFontInfo->GetFontData(hFont, 0x74746366, NULL, 0);\n    FX_DWORD font_size = m_pFontInfo->GetFontData(hFont, 0, NULL, 0);\n    if(font_size == 0 && ttc_size == 0) {\n        m_pFontInfo->DeleteFont(hFont);\n        return NULL;\n    }\n    FXFT_Face face = NULL;\n    if (ttc_size) {\n        FX_BYTE temp[1024];\n        m_pFontInfo->GetFontData(hFont, 0x74746366, temp, 1024);\n        FX_DWORD checksum = 0;\n        for (int i = 0; i < 256; i ++) {\n            checksum += ((FX_DWORD*)temp)[i];\n        }\n        FX_LPBYTE pFontData;\n        face = m_pFontMgr->GetCachedTTCFace(ttc_size, checksum, ttc_size - font_size, pFontData);\n        if (face == NULL) {\n            pFontData = FX_Alloc(FX_BYTE, ttc_size);\n            if (pFontData) {\n                m_pFontInfo->GetFontData(hFont, 0x74746366, pFontData, ttc_size);\n                face = m_pFontMgr->AddCachedTTCFace(ttc_size, checksum, pFontData, ttc_size,\n                                                    ttc_size - font_size);\n            }\n        }\n    } else {\n        FX_LPBYTE pFontData;\n        face = m_pFontMgr->GetCachedFace(SubstName, weight, bItalic, pFontData);\n        if (face == NULL) {\n            pFontData = FX_Alloc(FX_BYTE, font_size);\n            if (!pFontData) {\n                m_pFontInfo->DeleteFont(hFont);\n                return NULL;\n            }\n            m_pFontInfo->GetFontData(hFont, 0, pFontData, font_size);\n            face = m_pFontMgr->AddCachedFace(SubstName, weight, bItalic, pFontData, font_size, m_pFontInfo->GetFaceIndex(hFont));\n        }\n    }\n    if (face == NULL) {\n        m_pFontInfo->DeleteFont(hFont);\n        return NULL;\n    }\n    pSubstFont->m_Family = SubstName;\n    pSubstFont->m_Charset = Charset;\n    FX_BOOL bNeedUpdateWeight = FALSE;\n    if (FXFT_Is_Face_Bold(face)) {\n        if (weight == FXFONT_FW_BOLD) {\n            bNeedUpdateWeight = FALSE;\n        } else {\n            bNeedUpdateWeight = TRUE;\n        }\n    } else {\n        if (weight == FXFONT_FW_NORMAL) {\n            bNeedUpdateWeight = FALSE;\n        } else {\n            bNeedUpdateWeight = TRUE;\n        }\n    }\n    if (bNeedUpdateWeight) {\n        pSubstFont->m_Weight = weight;\n    }\n    if (bItalic && !FXFT_Is_Face_Italic(face)) {\n        if (italic_angle == 0) {\n            italic_angle = -12;\n        } else if (FXSYS_abs(italic_angle) < 5) {\n            italic_angle = 0;\n        }\n        pSubstFont->m_ItalicAngle = italic_angle;\n    }\n    m_pFontInfo->DeleteFont(hFont);\n    return face;\n}\nextern \"C\" {\n    unsigned long _FTStreamRead(FXFT_Stream stream, unsigned long offset,\n                                unsigned char* buffer, unsigned long count);\n    void _FTStreamClose(FXFT_Stream stream);\n};\nCFontFileFaceInfo::CFontFileFaceInfo()\n{\n    m_pFile = NULL;\n    m_Face = NULL;\n    m_Charsets = 0;\n    m_FileSize = 0;\n    m_FontOffset = 0;\n    m_Weight = 0;\n    m_bItalic = FALSE;\n    m_PitchFamily = 0;\n}\nCFontFileFaceInfo::~CFontFileFaceInfo()\n{\n    if (m_Face) {\n        FXFT_Done_Face(m_Face);\n    }\n    m_Face = NULL;\n}\nextern FX_BOOL _LoadFile(FXFT_Library library, FXFT_Face* Face, IFX_FileRead* pFile, FXFT_Stream* stream);\n#if defined(_FPDFAPI_MINI_) || _FX_OS_ == _FX_ANDROID_\nIFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()\n{\n    return NULL;\n}\n#endif\n#if !defined(_FPDFAPI_MINI_)\nCFX_FolderFontInfo::CFX_FolderFontInfo()\n{\n}\nCFX_FolderFontInfo::~CFX_FolderFontInfo()\n{\n    FX_POSITION pos = m_FontList.GetStartPosition();\n    while (pos) {\n        CFX_ByteString key;\n        FX_LPVOID value;\n        m_FontList.GetNextAssoc(pos, key, value);\n        delete (CFontFaceInfo*)value;\n    }\n}\nvoid CFX_FolderFontInfo::AddPath(FX_BSTR path)\n{\n    m_PathList.Add(path);\n}\nvoid CFX_FolderFontInfo::Release()\n{\n    delete this;\n}\nFX_BOOL CFX_FolderFontInfo::EnumFontList(CFX_FontMapper* pMapper)\n{\n    m_pMapper = pMapper;\n    for (int i = 0; i < m_PathList.GetSize(); i ++) {\n        ScanPath(m_PathList[i]);\n    }\n    return TRUE;\n}\nvoid CFX_FolderFontInfo::ScanPath(CFX_ByteString& path)\n{\n    void* handle = FX_OpenFolder(path);\n    if (handle == NULL) {\n        return;\n    }\n    CFX_ByteString filename;\n    FX_BOOL bFolder;\n    while (FX_GetNextFile(handle, filename, bFolder)) {\n        if (bFolder) {\n            if (filename == \".\" || filename == \"..\") {\n                continue;\n            }\n        } else {\n            CFX_ByteString ext = filename.Right(4);\n            ext.MakeUpper();\n            if (ext != \".TTF\" && ext != \".OTF\" && ext != \".TTC\") {\n                continue;\n            }\n        }\n        CFX_ByteString fullpath = path;\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_WINDOWS_\n        fullpath += \"\\\\\";\n#else\n        fullpath += \"/\";\n#endif\n        fullpath += filename;\n        if (bFolder) {\n            ScanPath(fullpath);\n        } else {\n            ScanFile(fullpath);\n        }\n    }\n    FX_CloseFolder(handle);\n}\nvoid CFX_FolderFontInfo::ScanFile(CFX_ByteString& path)\n{\n    FXSYS_FILE* pFile = FXSYS_fopen(path, \"rb\");\n    if (pFile == NULL) {\n        return;\n    }\n    FXSYS_fseek(pFile, 0, FXSYS_SEEK_END);\n    FX_DWORD filesize = FXSYS_ftell(pFile);\n    FX_BYTE buffer[16];\n    FXSYS_fseek(pFile, 0, FXSYS_SEEK_SET);\n    size_t readCnt = FXSYS_fread(buffer, 12, 1, pFile);\n    if (GET_TT_LONG(buffer) == 0x74746366) {\n        FX_DWORD nFaces = GET_TT_LONG(buffer + 8);\n        FX_LPBYTE offsets = FX_Alloc(FX_BYTE, nFaces * 4);\n        if (!offsets) {\n            FXSYS_fclose(pFile);\n            return;\n        }\n        readCnt = FXSYS_fread(offsets, nFaces * 4, 1, pFile);\n        for (FX_DWORD i = 0; i < nFaces; i ++) {\n            FX_LPBYTE p = offsets + i * 4;\n            ReportFace(path, pFile, filesize, GET_TT_LONG(p));\n        }\n        FX_Free(offsets);\n    } else {\n        ReportFace(path, pFile, filesize, 0);\n    }\n    FXSYS_fclose(pFile);\n}\nvoid CFX_FolderFontInfo::ReportFace(CFX_ByteString& path, FXSYS_FILE* pFile, FX_DWORD filesize, FX_DWORD offset)\n{\n    FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET);\n    char buffer[16];\n    if (!FXSYS_fread(buffer, 12, 1, pFile)) {\n        return;\n    }\n    FX_DWORD nTables = GET_TT_SHORT(buffer + 4);\n    CFX_ByteString tables = _FPDF_ReadStringFromFile(pFile, nTables * 16);\n    if (tables.IsEmpty()) {\n        return;\n    }\n    CFX_ByteString names = _FPDF_LoadTableFromTT(pFile, tables, nTables, 0x6e616d65);\n    CFX_ByteString facename = _FPDF_GetNameFromTT(names, 1);\n    CFX_ByteString style = _FPDF_GetNameFromTT(names, 2);\n    if (style != \"Regular\") {\n        facename += \" \" + style;\n    }\n    FX_LPVOID p;\n    if (m_FontList.Lookup(facename, p)) {\n        return;\n    }\n    CFontFaceInfo* pInfo = FX_NEW CFontFaceInfo;\n    if (!pInfo) {\n        return;\n    }\n    pInfo->m_FilePath = path;\n    pInfo->m_FaceName = facename;\n    pInfo->m_FontTables = tables;\n    pInfo->m_FontOffset = offset;\n    pInfo->m_FileSize = filesize;\n    pInfo->m_Charsets = 0;\n    CFX_ByteString os2 = _FPDF_LoadTableFromTT(pFile, tables, nTables, 0x4f532f32);\n    if (os2.GetLength() >= 86) {\n        FX_LPCBYTE p = (FX_LPCBYTE)os2 + 78;\n        FX_DWORD codepages = GET_TT_LONG(p);\n        if (codepages & (1 << 17)) {\n            m_pMapper->AddInstalledFont(facename, FXFONT_SHIFTJIS_CHARSET);\n            pInfo->m_Charsets |= CHARSET_FLAG_SHIFTJIS;\n        }\n        if (codepages & (1 << 18)) {\n            m_pMapper->AddInstalledFont(facename, FXFONT_GB2312_CHARSET);\n            pInfo->m_Charsets |= CHARSET_FLAG_GB;\n        }\n        if (codepages & (1 << 20)) {\n            m_pMapper->AddInstalledFont(facename, FXFONT_CHINESEBIG5_CHARSET);\n            pInfo->m_Charsets |= CHARSET_FLAG_BIG5;\n        }\n        if ((codepages & (1 << 19)) || (codepages & (1 << 21))) {\n            m_pMapper->AddInstalledFont(facename, FXFONT_HANGEUL_CHARSET);\n            pInfo->m_Charsets |= CHARSET_FLAG_KOREAN;\n        }\n        if (codepages & (1 << 31)) {\n            m_pMapper->AddInstalledFont(facename, FXFONT_SYMBOL_CHARSET);\n            pInfo->m_Charsets |= CHARSET_FLAG_SYMBOL;\n        }\n    }\n    m_pMapper->AddInstalledFont(facename, FXFONT_ANSI_CHARSET);\n    pInfo->m_Charsets |= CHARSET_FLAG_ANSI;\n    pInfo->m_Styles = 0;\n    if (style.Find(FX_BSTRC(\"Bold\")) > -1) {\n        pInfo->m_Styles |= FXFONT_BOLD;\n    }\n    if (style.Find(FX_BSTRC(\"Italic\")) > -1 || style.Find(FX_BSTRC(\"Oblique\")) > -1) {\n        pInfo->m_Styles |= FXFONT_ITALIC;\n    }\n    if (facename.Find(FX_BSTRC(\"Serif\")) > -1) {\n        pInfo->m_Styles |= FXFONT_SERIF;\n    }\n    m_FontList.SetAt(facename, pInfo);\n}\nvoid* CFX_FolderFontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL& bExact)\n{\n    return NULL;\n}\nvoid* CFX_FolderFontInfo::GetFont(FX_LPCSTR face)\n{\n    FX_LPVOID p;\n    if (!m_FontList.Lookup(face, p)) {\n        return NULL;\n    }\n    return p;\n}\nFX_DWORD CFX_FolderFontInfo::GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size)\n{\n    if (hFont == NULL) {\n        return 0;\n    }\n    CFontFaceInfo* pFont = (CFontFaceInfo*)hFont;\n    FXSYS_FILE* pFile = NULL;\n    if (size > 0) {\n        pFile = FXSYS_fopen(pFont->m_FilePath, \"rb\");\n        if (pFile == NULL) {\n            return 0;\n        }\n    }\n    FX_DWORD datasize = 0;\n    FX_DWORD offset;\n    if (table == 0)\t{\n        datasize = pFont->m_FontOffset ? 0 : pFont->m_FileSize;\n        offset = 0;\n    } else if (table == 0x74746366)\t{\n        datasize = pFont->m_FontOffset ? pFont->m_FileSize : 0;\n        offset = 0;\n    } else {\n        FX_DWORD nTables = pFont->m_FontTables.GetLength() / 16;\n        for (FX_DWORD i = 0; i < nTables; i ++) {\n            FX_LPCBYTE p = (FX_LPCBYTE)pFont->m_FontTables + i * 16;\n            if (GET_TT_LONG(p) == table) {\n                offset = GET_TT_LONG(p + 8);\n                datasize = GET_TT_LONG(p + 12);\n            }\n        }\n    }\n    if (datasize && size >= datasize && pFile) {\n        FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET);\n        size_t readCnt = FXSYS_fread(buffer, datasize, 1, pFile);\n    }\n    if (pFile) {\n        FXSYS_fclose(pFile);\n    }\n    return datasize;\n}\nvoid CFX_FolderFontInfo::DeleteFont(void* hFont)\n{\n}\nFX_BOOL CFX_FolderFontInfo::GetFaceName(void* hFont, CFX_ByteString& name)\n{\n    if (hFont == NULL) {\n        return FALSE;\n    }\n    CFontFaceInfo* pFont = (CFontFaceInfo*)hFont;\n    name = pFont->m_FaceName;\n    return TRUE;\n}\nFX_BOOL CFX_FolderFontInfo::GetFontCharset(void* hFont, int& charset)\n{\n    return FALSE;\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/ge/fx_ge_linux.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxge/fx_ge.h\"\n#include \"../agg/include/fx_agg_driver.h\"\n#include \"text_int.h\"\n#if !defined(_FPDFAPI_MINI_) &&  _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_\n#if (_FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_ && (!defined(_FPDFAPI_MINI_)))\nvoid CFX_AggDeviceDriver::InitPlatform()\n{\n}\nvoid CFX_AggDeviceDriver::DestroyPlatform()\n{\n}\nvoid CFX_FaceCache::InitPlatform()\n{\n}\nFX_BOOL CFX_AggDeviceDriver::DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,\n        CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device,\n        FX_FLOAT font_size, FX_DWORD argb)\n{\n    return FALSE;\n}\nCFX_GlyphBitmap* CFX_FaceCache::RenderGlyph_Nativetext(CFX_Font* pFont, FX_DWORD glyph_index, const CFX_AffineMatrix* pMatrix,\n        int dest_width, int anti_alias)\n{\n    return NULL;\n}\nvoid CFX_Font::ReleasePlatformResource()\n{\n}\n#endif\nstatic const struct {\n    FX_LPCSTR\tm_pName;\n    FX_LPCSTR\tm_pSubstName;\n}\nBase14Substs[] = {\n    {\"Courier\", \"Courier New\"},\n    {\"Courier-Bold\", \"Courier New Bold\"},\n    {\"Courier-BoldOblique\", \"Courier New Bold Italic\"},\n    {\"Courier-Oblique\", \"Courier New Italic\"},\n    {\"Helvetica\", \"Arial\"},\n    {\"Helvetica-Bold\", \"Arial Bold\"},\n    {\"Helvetica-BoldOblique\", \"Arial Bold Italic\"},\n    {\"Helvetica-Oblique\", \"Arial Italic\"},\n    {\"Times-Roman\", \"Times New Roman\"},\n    {\"Times-Bold\", \"Times New Roman Bold\"},\n    {\"Times-BoldItalic\", \"Times New Roman Bold Italic\"},\n    {\"Times-Italic\", \"Times New Roman Italic\"},\n};\nclass CFX_LinuxFontInfo : public CFX_FolderFontInfo\n{\npublic:\n    virtual void*\t\tMapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL& bExact);\n    FX_BOOL\t\t\t\tParseFontCfg();\n    void*\t\t\t\tFindFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL bMatchName);\n};\n#define LINUX_GPNAMESIZE\t6\nstatic const struct {\n    FX_LPCSTR NameArr[LINUX_GPNAMESIZE];\n}\nLinuxGpFontList[] = {\n    {{\"TakaoPGothic\", \"VL PGothic\", \"IPAPGothic\", \"VL Gothic\", \"Kochi Gothic\", \"VL Gothic regular\"}},\n    {{\"TakaoGothic\", \"VL Gothic\", \"IPAGothic\", \"Kochi Gothic\", NULL, \"VL Gothic regular\"}},\n    {{\"TakaoPMincho\", \"IPAPMincho\", \"VL Gothic\", \"Kochi Mincho\", NULL, \"VL Gothic regular\"}},\n    {{\"TakaoMincho\", \"IPAMincho\", \"VL Gothic\", \"Kochi Mincho\", NULL, \"VL Gothic regular\"}},\n};\nstatic const FX_LPCSTR g_LinuxGbFontList[] = {\n    \"AR PL UMing CN Light\",\n    \"WenQuanYi Micro Hei\",\n    \"AR PL UKai CN\",\n};\nstatic const FX_LPCSTR g_LinuxB5FontList[] = {\n    \"AR PL UMing TW Light\",\n    \"WenQuanYi Micro Hei\",\n    \"AR PL UKai TW\",\n};\nstatic const FX_LPCSTR g_LinuxHGFontList[] = {\n    \"UnDotum\",\n};\nstatic FX_INT32 GetJapanesePreference(FX_LPCSTR facearr, int weight, int picth_family)\n{\n    CFX_ByteString face = facearr;\n    if (face.Find(\"Gothic\") >= 0 || face.Find(\"\\x83\\x53\\x83\\x56\\x83\\x62\\x83\\x4e\") >= 0) {\n        if (face.Find(\"PGothic\") >= 0 || face.Find(\"\\x82\\x6f\\x83\\x53\\x83\\x56\\x83\\x62\\x83\\x4e\") >= 0) {\n            return 0;\n        } else {\n            return 1;\n        }\n    } else if (face.Find(\"Mincho\") >= 0 || face.Find(\"\\x96\\xbe\\x92\\xa9\") >= 0) {\n        if (face.Find(\"PMincho\") >= 0 || face.Find(\"\\x82\\x6f\\x96\\xbe\\x92\\xa9\") >= 0) {\n            return 2;\n        } else {\n            return 3;\n        }\n    }\n    if (!(picth_family & FXFONT_FF_ROMAN) && weight > 400) {\n        return 0;\n    }\n    return 2;\n}\nvoid* CFX_LinuxFontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR cstr_face, FX_BOOL& bExact)\n{\n    CFX_ByteString face = cstr_face;\n    int iBaseFont;\n    for (iBaseFont = 0; iBaseFont < 12; iBaseFont ++)\n        if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) {\n            face = Base14Substs[iBaseFont].m_pSubstName;\n            bExact = TRUE;\n            break;\n        }\n    if (iBaseFont < 12) {\n        return GetFont(face);\n    }\n    FX_LPVOID p = NULL;\n    FX_BOOL bCJK = TRUE;\n    switch (charset) {\n        case FXFONT_SHIFTJIS_CHARSET: {\n                FX_INT32 index = GetJapanesePreference(cstr_face, weight, pitch_family);\n                if (index < 0) {\n                    break;\n                }\n                for (FX_INT32 i = 0; i < LINUX_GPNAMESIZE; i++)\n                    if (m_FontList.Lookup(LinuxGpFontList[index].NameArr[i], p)) {\n                        return p;\n                    }\n            }\n            break;\n        case FXFONT_GB2312_CHARSET: {\n                static FX_INT32 s_gbCount = sizeof(g_LinuxGbFontList) / sizeof(FX_LPCSTR);\n                for (FX_INT32 i = 0; i < s_gbCount; i++)\n                    if (m_FontList.Lookup(g_LinuxGbFontList[i], p)) {\n                        return p;\n                    }\n            }\n            break;\n        case FXFONT_CHINESEBIG5_CHARSET: {\n                static FX_INT32 s_b5Count = sizeof(g_LinuxB5FontList) / sizeof(FX_LPCSTR);\n                for (FX_INT32 i = 0; i < s_b5Count; i++)\n                    if (m_FontList.Lookup(g_LinuxB5FontList[i], p)) {\n                        return p;\n                    }\n            }\n            break;\n        case FXFONT_HANGEUL_CHARSET: {\n                static FX_INT32 s_hgCount = sizeof(g_LinuxHGFontList) / sizeof(FX_LPCSTR);\n                for (FX_INT32 i = 0; i < s_hgCount; i++)\n                    if (m_FontList.Lookup(g_LinuxHGFontList[i], p)) {\n                        return p;\n                    }\n            }\n            break;\n        default:\n            bCJK = FALSE;\n            break;\n    }\n    if (charset == FXFONT_ANSI_CHARSET && (pitch_family & FXFONT_FF_FIXEDPITCH)) {\n        return GetFont(\"Courier New\");\n    }\n    return FindFont(weight, bItalic, charset, pitch_family, cstr_face, !bCJK);\n}\nstatic FX_DWORD _LinuxGetCharset(int charset)\n{\n    switch(charset) {\n        case FXFONT_SHIFTJIS_CHARSET:\n            return CHARSET_FLAG_SHIFTJIS;\n        case FXFONT_GB2312_CHARSET:\n            return CHARSET_FLAG_GB;\n        case FXFONT_CHINESEBIG5_CHARSET:\n            return CHARSET_FLAG_BIG5;\n        case FXFONT_HANGEUL_CHARSET:\n            return CHARSET_FLAG_KOREAN;\n        case FXFONT_SYMBOL_CHARSET:\n            return CHARSET_FLAG_SYMBOL;\n        case FXFONT_ANSI_CHARSET:\n            return CHARSET_FLAG_ANSI;\n        default:\n            break;\n    }\n    return 0;\n}\nstatic FX_INT32 _LinuxGetSimilarValue(int weight, FX_BOOL bItalic, int pitch_family, FX_DWORD style)\n{\n    FX_INT32 iSimilarValue = 0;\n    if ((style & FXFONT_BOLD) == (weight > 400)) {\n        iSimilarValue += 16;\n    }\n    if ((style & FXFONT_ITALIC) == bItalic) {\n        iSimilarValue += 16;\n    }\n    if ((style & FXFONT_SERIF) == (pitch_family & FXFONT_FF_ROMAN)) {\n        iSimilarValue += 16;\n    }\n    if ((style & FXFONT_SCRIPT) == (pitch_family & FXFONT_FF_SCRIPT)) {\n        iSimilarValue += 8;\n    }\n    if ((style & FXFONT_FIXED_PITCH) == (pitch_family & FXFONT_FF_FIXEDPITCH)) {\n        iSimilarValue += 8;\n    }\n    return iSimilarValue;\n}\nvoid* CFX_LinuxFontInfo::FindFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL bMatchName)\n{\n    CFontFaceInfo* pFind = NULL;\n    FX_DWORD charset_flag = _LinuxGetCharset(charset);\n    FX_INT32 iBestSimilar = 0;\n    FX_POSITION pos = m_FontList.GetStartPosition();\n    while (pos) {\n        CFX_ByteString bsName;\n        CFontFaceInfo* pFont = NULL;\n        m_FontList.GetNextAssoc(pos, bsName, (FX_LPVOID&)pFont);\n        if (!(pFont->m_Charsets & charset_flag) && charset != FXFONT_DEFAULT_CHARSET) {\n            continue;\n        }\n        FX_INT32 iSimilarValue = 0;\n        FX_INT32 index = bsName.Find(family);\n        if (bMatchName && index < 0) {\n            continue;\n        }\n        if (!bMatchName && index > 0) {\n            iSimilarValue += 64;\n        }\n        iSimilarValue = _LinuxGetSimilarValue(weight, bItalic, pitch_family, pFont->m_Styles);\n        if (iSimilarValue > iBestSimilar) {\n            iBestSimilar = iSimilarValue;\n            pFind = pFont;\n        }\n    }\n    return pFind;\n}\nIFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()\n{\n    CFX_LinuxFontInfo* pInfo = FX_NEW CFX_LinuxFontInfo;\n    if (!pInfo) {\n        return NULL;\n    }\n    if (!pInfo->ParseFontCfg()) {\n        pInfo->AddPath(\"/usr/share/fonts\");\n        pInfo->AddPath(\"/usr/share/X11/fonts/Type1\");\n        pInfo->AddPath(\"/usr/share/X11/fonts/TTF\");\n        pInfo->AddPath(\"/usr/local/share/fonts\");\n    }\n    return pInfo;\n}\nFX_BOOL CFX_LinuxFontInfo::ParseFontCfg()\n{\n    return FALSE;\n}\nvoid CFX_GEModule::InitPlatform()\n{\n    m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault());\n}\nvoid CFX_GEModule::DestroyPlatform()\n{\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/ge/fx_ge_path.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxcrt/fx_basic.h\"\n#include \"../../../include/fxge/fx_ge.h\"\nCFX_ClipRgn::CFX_ClipRgn(int width, int height)\n{\n    m_Type = RectI;\n    m_Box.left = m_Box.top = 0;\n    m_Box.right = width;\n    m_Box.bottom = height;\n}\nCFX_ClipRgn::CFX_ClipRgn(const FX_RECT& rect)\n{\n    m_Type = RectI;\n    m_Box = rect;\n}\nCFX_ClipRgn::CFX_ClipRgn(const CFX_ClipRgn& src)\n{\n    m_Type = src.m_Type;\n    m_Box = src.m_Box;\n    m_Mask = src.m_Mask;\n}\nCFX_ClipRgn::~CFX_ClipRgn()\n{\n}\nvoid CFX_ClipRgn::Reset(const FX_RECT& rect)\n{\n    m_Type = RectI;\n    m_Box = rect;\n    m_Mask.SetNull();\n}\nvoid CFX_ClipRgn::IntersectRect(const FX_RECT& rect)\n{\n    if (m_Type == RectI) {\n        m_Box.Intersect(rect);\n        return;\n    }\n    if (m_Type == MaskF) {\n        IntersectMaskRect(rect, m_Box, m_Mask);\n        return;\n    }\n}\nvoid CFX_ClipRgn::IntersectMaskRect(FX_RECT rect, FX_RECT mask_rect, CFX_DIBitmapRef Mask)\n{\n    const CFX_DIBitmap* mask_dib = Mask;\n    m_Type = MaskF;\n    m_Box = rect;\n    m_Box.Intersect(mask_rect);\n    if (m_Box.IsEmpty()) {\n        m_Type = RectI;\n        return;\n    } else if (m_Box == mask_rect) {\n        m_Mask = Mask;\n        return;\n    }\n    CFX_DIBitmap* new_dib = m_Mask.New();\n    if (!new_dib) {\n        return;\n    }\n    new_dib->Create(m_Box.Width(), m_Box.Height(), FXDIB_8bppMask);\n    for (int row = m_Box.top; row < m_Box.bottom; row ++) {\n        FX_LPBYTE dest_scan = new_dib->GetBuffer() + new_dib->GetPitch() * (row - m_Box.top);\n        FX_LPBYTE src_scan = mask_dib->GetBuffer() + mask_dib->GetPitch() * (row - mask_rect.top);\n        for (int col = m_Box.left; col < m_Box.right; col ++) {\n            dest_scan[col - m_Box.left] = src_scan[col - mask_rect.left];\n        }\n    }\n}\nvoid CFX_ClipRgn::IntersectMaskF(int left, int top, CFX_DIBitmapRef Mask)\n{\n    const CFX_DIBitmap* mask_dib = Mask;\n    ASSERT(mask_dib->GetFormat() == FXDIB_8bppMask);\n    FX_RECT mask_box(left, top, left + mask_dib->GetWidth(), top + mask_dib->GetHeight());\n    if (m_Type == RectI) {\n        IntersectMaskRect(m_Box, mask_box, Mask);\n        return;\n    }\n    if (m_Type == MaskF) {\n        FX_RECT new_box = m_Box;\n        new_box.Intersect(mask_box);\n        if (new_box.IsEmpty()) {\n            m_Type = RectI;\n            m_Mask.SetNull();\n            m_Box = new_box;\n            return;\n        }\n        CFX_DIBitmapRef new_mask;\n        CFX_DIBitmap* new_dib = new_mask.New();\n        if (!new_dib) {\n            return;\n        }\n        new_dib->Create(new_box.Width(), new_box.Height(), FXDIB_8bppMask);\n        const CFX_DIBitmap* old_dib = m_Mask;\n        for (int row = new_box.top; row < new_box.bottom; row ++) {\n            FX_LPBYTE old_scan = old_dib->GetBuffer() + (row - m_Box.top) * old_dib->GetPitch();\n            FX_LPBYTE mask_scan = mask_dib->GetBuffer() + (row - top) * mask_dib->GetPitch();\n            FX_LPBYTE new_scan = new_dib->GetBuffer() + (row - new_box.top) * new_dib->GetPitch();\n            for (int col = new_box.left; col < new_box.right; col ++) {\n                new_scan[col - new_box.left] = old_scan[col - m_Box.left] * mask_scan[col - left] / 255;\n            }\n        }\n        m_Box = new_box;\n        m_Mask = new_mask;\n        return;\n    }\n    ASSERT(FALSE);\n}\nCFX_PathData::CFX_PathData()\n{\n    m_PointCount = m_AllocCount = 0;\n    m_pPoints = NULL;\n}\nCFX_PathData::~CFX_PathData()\n{\n    if (m_pPoints) {\n        FX_Free(m_pPoints);\n    }\n}\nFX_BOOL CFX_PathData::SetPointCount(int nPoints)\n{\n    m_PointCount = nPoints;\n    if (m_AllocCount < nPoints) {\n        if (m_pPoints) {\n            FX_Free(m_pPoints);\n            m_pPoints = NULL;\n        }\n        m_pPoints = FX_Alloc(FX_PATHPOINT, nPoints);\n        if (!m_pPoints) {\n            return FALSE;\n        }\n        m_AllocCount = nPoints;\n    }\n    return TRUE;\n}\nFX_BOOL CFX_PathData::AllocPointCount(int nPoints)\n{\n    if (m_AllocCount < nPoints) {\n        FX_PATHPOINT* pNewBuf = FX_Alloc(FX_PATHPOINT, nPoints);\n        if (!pNewBuf) {\n            return FALSE;\n        }\n        if (m_PointCount) {\n            FXSYS_memcpy32(pNewBuf, m_pPoints, m_PointCount * sizeof(FX_PATHPOINT));\n        }\n        if (m_pPoints) {\n            FX_Free(m_pPoints);\n        }\n        m_pPoints = pNewBuf;\n        m_AllocCount = nPoints;\n    }\n    return TRUE;\n}\nCFX_PathData::CFX_PathData(const CFX_PathData& src)\n{\n    m_pPoints = NULL;\n    m_PointCount = m_AllocCount = src.m_PointCount;\n    m_pPoints = FX_Alloc(FX_PATHPOINT, src.m_PointCount);\n    if (!m_pPoints) {\n        return;\n    }\n    FXSYS_memcpy32(m_pPoints, src.m_pPoints, sizeof(FX_PATHPOINT) * m_PointCount);\n}\nvoid CFX_PathData::TrimPoints(int nPoints)\n{\n    if (m_PointCount <= nPoints) {\n        return;\n    }\n    SetPointCount(nPoints);\n}\nFX_BOOL CFX_PathData::AddPointCount(int addPoints)\n{\n    int new_count = m_PointCount + addPoints;\n    if (!AllocPointCount(new_count)) {\n        return FALSE;\n    }\n    m_PointCount = new_count;\n    return TRUE;\n}\nFX_BOOL CFX_PathData::Append(const CFX_PathData* pSrc, const CFX_AffineMatrix* pMatrix)\n{\n    int old_count = m_PointCount;\n    if (!AddPointCount(pSrc->m_PointCount)) {\n        return FALSE;\n    }\n    FXSYS_memcpy32(m_pPoints + old_count, pSrc->m_pPoints, pSrc->m_PointCount * sizeof(FX_PATHPOINT));\n    if (pMatrix == NULL) {\n        return TRUE;\n    }\n    for (int i = 0; i < pSrc->m_PointCount; i ++) {\n        pMatrix->Transform(m_pPoints[old_count + i].m_PointX, m_pPoints[old_count + i].m_PointY);\n    }\n    return TRUE;\n}\nvoid CFX_PathData::SetPoint(int index, FX_FLOAT x, FX_FLOAT y, int flag)\n{\n    ASSERT(index < m_PointCount);\n    m_pPoints[index].m_PointX = x;\n    m_pPoints[index].m_PointY = y;\n    m_pPoints[index].m_Flag = flag;\n}\nFX_BOOL CFX_PathData::AppendRect(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top)\n{\n    int old_count = m_PointCount;\n    if (!AddPointCount(5)) {\n        return FALSE;\n    }\n    FX_PATHPOINT* pPoints = m_pPoints + old_count;\n    pPoints[0].m_PointX = pPoints[1].m_PointX = pPoints[4].m_PointX = left;\n    pPoints[2].m_PointX = pPoints[3].m_PointX = right;\n    pPoints[0].m_PointY = pPoints[3].m_PointY = pPoints[4].m_PointY = bottom;\n    pPoints[1].m_PointY = pPoints[2].m_PointY = top;\n    pPoints[0].m_Flag = FXPT_MOVETO;\n    pPoints[1].m_Flag = pPoints[2].m_Flag = pPoints[3].m_Flag = FXPT_LINETO;\n    pPoints[4].m_Flag = FXPT_LINETO | FXPT_CLOSEFIGURE;\n    return TRUE;\n}\nCFX_FloatRect CFX_PathData::GetBoundingBox() const\n{\n    CFX_FloatRect rect;\n    if (m_PointCount) {\n        rect.InitRect(m_pPoints[0].m_PointX, m_pPoints[0].m_PointY);\n        for (int i = 1; i < m_PointCount; i ++) {\n            rect.UpdateRect(m_pPoints[i].m_PointX, m_pPoints[i].m_PointY);\n        }\n    }\n    return rect;\n}\nstatic void _UpdateLineEndPoints(CFX_FloatRect& rect, FX_FLOAT start_x, FX_FLOAT start_y, FX_FLOAT end_x, FX_FLOAT end_y,\n                                 FX_FLOAT hw)\n{\n    if (start_x == end_x) {\n        if (start_y == end_y) {\n            rect.UpdateRect(end_x + hw, end_y + hw);\n            rect.UpdateRect(end_x - hw, end_y - hw);\n            return;\n        }\n        FX_FLOAT point_y;\n        if (end_y < start_y) {\n            point_y = end_y - hw;\n        } else {\n            point_y = end_y + hw;\n        }\n        rect.UpdateRect(end_x + hw, point_y);\n        rect.UpdateRect(end_x - hw, point_y);\n        return;\n    } else if (start_y == end_y) {\n        FX_FLOAT point_x;\n        if (end_x < start_x) {\n            point_x = end_x - hw;\n        } else {\n            point_x = end_x + hw;\n        }\n        rect.UpdateRect(point_x, end_y + hw);\n        rect.UpdateRect(point_x, end_y - hw);\n        return;\n    }\n    FX_FLOAT dx = end_x - start_x;\n    FX_FLOAT dy = end_y - start_y;\n    FX_FLOAT ll = FXSYS_sqrt2(dx, dy);\n    FX_FLOAT mx = end_x + hw * dx / ll;\n    FX_FLOAT my = end_y + hw * dy / ll;\n    FX_FLOAT dx1 = hw * dy / ll;\n    FX_FLOAT dy1 = hw * dx / ll;\n    rect.UpdateRect(mx - dx1, my + dy1);\n    rect.UpdateRect(mx + dx1, my - dy1);\n}\nstatic void _UpdateLineJoinPoints(CFX_FloatRect& rect, FX_FLOAT start_x, FX_FLOAT start_y,\n                                  FX_FLOAT middle_x, FX_FLOAT middle_y, FX_FLOAT end_x, FX_FLOAT end_y,\n                                  FX_FLOAT half_width, FX_FLOAT miter_limit)\n{\n    FX_FLOAT start_k = 0, start_c = 0, end_k = 0, end_c = 0, start_len = 0, start_dc = 0, end_len = 0, end_dc = 0;\n    FX_BOOL bStartVert = FXSYS_fabs(start_x - middle_x) < 1.0f / 20;\n    FX_BOOL bEndVert = FXSYS_fabs(middle_x - end_x) < 1.0f / 20;\n    if (bStartVert && bEndVert) {\n        int start_dir = middle_y > start_y ? 1 : -1;\n        FX_FLOAT point_y = middle_y + half_width * start_dir;\n        rect.UpdateRect(middle_x + half_width, point_y);\n        rect.UpdateRect(middle_x - half_width, point_y);\n        return;\n    }\n    if (!bStartVert) {\n        start_k = FXSYS_Div(middle_y - start_y, middle_x - start_x);\n        start_c = middle_y - FXSYS_Mul(start_k, middle_x);\n        start_len = FXSYS_sqrt2(start_x - middle_x, start_y - middle_y);\n        start_dc = (FX_FLOAT)FXSYS_fabs(FXSYS_MulDiv(half_width, start_len, start_x - middle_x));\n    }\n    if (!bEndVert) {\n        end_k = FXSYS_Div(end_y - middle_y, end_x - middle_x);\n        end_c = middle_y - FXSYS_Mul(end_k, middle_x);\n        end_len = FXSYS_sqrt2(end_x - middle_x, end_y - middle_y);\n        end_dc = (FX_FLOAT)FXSYS_fabs(FXSYS_MulDiv(half_width, end_len, end_x - middle_x));\n    }\n    if (bStartVert) {\n        FX_FLOAT outside_x = start_x;\n        if (end_x < start_x) {\n            outside_x += half_width;\n        } else {\n            outside_x -= half_width;\n        }\n        FX_FLOAT outside_y;\n        if (start_y < FXSYS_Mul(end_k, start_x) + end_c) {\n            outside_y = FXSYS_Mul(end_k, outside_x) + end_c + end_dc;\n        } else {\n            outside_y = FXSYS_Mul(end_k, outside_x) + end_c - end_dc;\n        }\n        rect.UpdateRect(outside_x, outside_y);\n        return;\n    }\n    if (bEndVert) {\n        FX_FLOAT outside_x = end_x;\n        if (start_x < end_x) {\n            outside_x += half_width;\n        } else {\n            outside_x -= half_width;\n        }\n        FX_FLOAT outside_y;\n        if (end_y < FXSYS_Mul(start_k, end_x) + start_c) {\n            outside_y = FXSYS_Mul(start_k, outside_x) + start_c + start_dc;\n        } else {\n            outside_y = FXSYS_Mul(start_k, outside_x) + start_c - start_dc;\n        }\n        rect.UpdateRect(outside_x, outside_y);\n        return;\n    }\n    if (FXSYS_fabs(start_k - end_k) < 1.0f / 20) {\n        int start_dir = middle_x > start_x ? 1 : -1;\n        int end_dir = end_x > middle_x ? 1 : -1;\n        if (start_dir == end_dir) {\n            _UpdateLineEndPoints(rect, middle_x, middle_y, end_x, end_y, half_width);\n        } else {\n            _UpdateLineEndPoints(rect, start_x, start_y, middle_x, middle_y, half_width);\n        }\n        return;\n    }\n    FX_FLOAT start_outside_c = start_c;\n    if (end_y < FXSYS_Mul(start_k, end_x) + start_c) {\n        start_outside_c += start_dc;\n    } else {\n        start_outside_c -= start_dc;\n    }\n    FX_FLOAT end_outside_c = end_c;\n    if (start_y < FXSYS_Mul(end_k, start_x) + end_c) {\n        end_outside_c += end_dc;\n    } else {\n        end_outside_c -= end_dc;\n    }\n    FX_FLOAT join_x = FXSYS_Div(end_outside_c - start_outside_c, start_k - end_k);\n    FX_FLOAT join_y = FXSYS_Mul(start_k, join_x) + start_outside_c;\n    rect.UpdateRect(join_x, join_y);\n}\nCFX_FloatRect CFX_PathData::GetBoundingBox(FX_FLOAT line_width, FX_FLOAT miter_limit) const\n{\n    CFX_FloatRect rect(100000 * 1.0f, 100000 * 1.0f, -100000 * 1.0f, -100000 * 1.0f);\n    int iPoint = 0;\n    FX_FLOAT half_width = line_width;\n    int iStartPoint, iEndPoint, iMiddlePoint;\n    FX_BOOL bJoin;\n    while (iPoint < m_PointCount) {\n        if (m_pPoints[iPoint].m_Flag == FXPT_MOVETO) {\n            iStartPoint = iPoint + 1;\n            iEndPoint = iPoint;\n            bJoin = FALSE;\n        } else {\n            if (m_pPoints[iPoint].m_Flag == FXPT_BEZIERTO) {\n                rect.UpdateRect(m_pPoints[iPoint].m_PointX, m_pPoints[iPoint].m_PointY);\n                rect.UpdateRect(m_pPoints[iPoint + 1].m_PointX, m_pPoints[iPoint + 1].m_PointY);\n                iPoint += 2;\n            }\n            if (iPoint == m_PointCount - 1 || m_pPoints[iPoint + 1].m_Flag == FXPT_MOVETO) {\n                iStartPoint = iPoint - 1;\n                iEndPoint = iPoint;\n                bJoin = FALSE;\n            } else {\n                iStartPoint = iPoint - 1;\n                iMiddlePoint = iPoint;\n                iEndPoint = iPoint + 1;\n                bJoin = TRUE;\n            }\n        }\n        FX_FLOAT start_x = m_pPoints[iStartPoint].m_PointX;\n        FX_FLOAT start_y = m_pPoints[iStartPoint].m_PointY;\n        FX_FLOAT end_x = m_pPoints[iEndPoint].m_PointX;\n        FX_FLOAT end_y = m_pPoints[iEndPoint].m_PointY;\n        if (bJoin) {\n            FX_FLOAT middle_x = m_pPoints[iMiddlePoint].m_PointX;\n            FX_FLOAT middle_y = m_pPoints[iMiddlePoint].m_PointY;\n            _UpdateLineJoinPoints(rect, start_x, start_y, middle_x, middle_y, end_x, end_y, half_width, miter_limit);\n        } else {\n            _UpdateLineEndPoints(rect, start_x, start_y, end_x, end_y, half_width);\n        }\n        iPoint ++;\n    }\n    return rect;\n}\nvoid CFX_PathData::Transform(const CFX_AffineMatrix* pMatrix)\n{\n    if (pMatrix == NULL) {\n        return;\n    }\n    for (int i = 0; i < m_PointCount; i ++) {\n        pMatrix->Transform(m_pPoints[i].m_PointX, m_pPoints[i].m_PointY);\n    }\n}\nconst int g_Distant[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};\nFX_BOOL CFX_PathData::GetZeroAreaPath(CFX_PathData& NewPath, CFX_AffineMatrix* pMatrix, FX_BOOL&bThin, FX_BOOL bAdjust) const\n{\n    if (m_PointCount < 3) {\n        return FALSE;\n    }\n    if (m_PointCount == 3 && (m_pPoints[0].m_Flag & FXPT_TYPE) == FXPT_MOVETO &&\n            (m_pPoints[1].m_Flag & FXPT_TYPE) == FXPT_LINETO && (m_pPoints[2].m_Flag & FXPT_TYPE) == FXPT_LINETO\n            && m_pPoints[0].m_PointX == m_pPoints[2].m_PointX && m_pPoints[0].m_PointY == m_pPoints[2].m_PointY) {\n        NewPath.AddPointCount(2);\n        if (bAdjust) {\n            if (pMatrix) {\n                FX_FLOAT x = m_pPoints[0].m_PointX, y = m_pPoints[0].m_PointY;\n                pMatrix->TransformPoint(x, y);\n                x = (int)x + 0.5f;\n                y = (int)y + 0.5f;\n                NewPath.SetPoint(0, x, y, FXPT_MOVETO);\n                x = m_pPoints[1].m_PointX, y = m_pPoints[1].m_PointY;\n                pMatrix->TransformPoint(x, y);\n                x = (int)x + 0.5f;\n                y = (int)y + 0.5f;\n                NewPath.SetPoint(1, x, y, FXPT_LINETO);\n                pMatrix->SetIdentity();\n            } else {\n                FX_FLOAT x = (int)m_pPoints[0].m_PointX + 0.5f, y = (int)m_pPoints[0].m_PointY + 0.5f;\n                NewPath.SetPoint(0, x, y, FXPT_MOVETO);\n                x = (int)m_pPoints[1].m_PointX + 0.5f, y = (int)m_pPoints[1].m_PointY + 0.5f;\n                NewPath.SetPoint(1, x, y, FXPT_LINETO);\n            }\n        } else {\n            NewPath.SetPoint(0, m_pPoints[0].m_PointX, m_pPoints[0].m_PointY, FXPT_MOVETO);\n            NewPath.SetPoint(1, m_pPoints[1].m_PointX, m_pPoints[1].m_PointY, FXPT_LINETO);\n        }\n        if (m_pPoints[0].m_PointX != m_pPoints[1].m_PointX && m_pPoints[0].m_PointY != m_pPoints[1].m_PointY) {\n            bThin = TRUE;\n        }\n        return TRUE;\n    }\n    if (((m_PointCount > 3) && (m_PointCount % 2))) {\n        int mid = m_PointCount / 2;\n        FX_BOOL bZeroArea = FALSE;\n        CFX_PathData t_path;\n        for (int i = 0; i < mid; i++) {\n            if (!(m_pPoints[mid - i - 1].m_PointX == m_pPoints[mid + i + 1].m_PointX\n                    && m_pPoints[mid - i - 1].m_PointY == m_pPoints[mid + i + 1].m_PointY &&\n                    ((m_pPoints[mid - i - 1].m_Flag & FXPT_TYPE) != FXPT_BEZIERTO && (m_pPoints[mid + i + 1].m_Flag & FXPT_TYPE) != FXPT_BEZIERTO))) {\n                bZeroArea = TRUE;\n                break;\n            }\n            int new_count = t_path.GetPointCount();\n            t_path.AddPointCount(2);\n            t_path.SetPoint(new_count, m_pPoints[mid - i].m_PointX, m_pPoints[mid - i].m_PointY, FXPT_MOVETO);\n            t_path.SetPoint(new_count + 1, m_pPoints[mid - i - 1].m_PointX, m_pPoints[mid - i - 1].m_PointY, FXPT_LINETO);\n        }\n        if (!bZeroArea) {\n            NewPath.Append(&t_path, NULL);\n            bThin = TRUE;\n            return TRUE;\n        }\n    }\n    int stratPoint = 0;\n    int next = 0, i;\n    for (i = 0; i < m_PointCount; i++) {\n        int point_type = m_pPoints[i].m_Flag & FXPT_TYPE;\n        if (point_type == FXPT_MOVETO) {\n            stratPoint = i;\n        } else if (point_type == FXPT_LINETO) {\n            next = (i + 1 - stratPoint) % (m_PointCount - stratPoint) + stratPoint;\n            if ((m_pPoints[next].m_Flag & FXPT_TYPE) != FXPT_BEZIERTO && (m_pPoints[next].m_Flag & FXPT_TYPE) != FXPT_MOVETO) {\n                if((m_pPoints[i - 1].m_PointX == m_pPoints[i].m_PointX && m_pPoints[i].m_PointX == m_pPoints[next].m_PointX)\n                        && ((m_pPoints[i].m_PointY - m_pPoints[i - 1].m_PointY) * (m_pPoints[i].m_PointY - m_pPoints[next].m_PointY) > 0)) {\n                    int pre = i;\n                    if (FXSYS_fabs(m_pPoints[i].m_PointY - m_pPoints[i - 1].m_PointY)\n                            < FXSYS_fabs(m_pPoints[i].m_PointY - m_pPoints[next].m_PointY)) {\n                        pre --;\n                        next--;\n                    }\n                    int new_count = NewPath.GetPointCount();\n                    NewPath.AddPointCount(2);\n                    NewPath.SetPoint(new_count, m_pPoints[pre].m_PointX, m_pPoints[pre].m_PointY, FXPT_MOVETO);\n                    NewPath.SetPoint(new_count + 1, m_pPoints[next].m_PointX, m_pPoints[next].m_PointY, FXPT_LINETO);\n                } else if((m_pPoints[i - 1].m_PointY == m_pPoints[i].m_PointY && m_pPoints[i].m_PointY == m_pPoints[next].m_PointY)\n                          && ((m_pPoints[i].m_PointX - m_pPoints[i - 1].m_PointX) * (m_pPoints[i].m_PointX - m_pPoints[next].m_PointX) > 0)) {\n                    int pre = i;\n                    if (FXSYS_fabs(m_pPoints[i].m_PointX - m_pPoints[i - 1].m_PointX)\n                            < FXSYS_fabs(m_pPoints[i].m_PointX - m_pPoints[next].m_PointX)) {\n                        pre --;\n                        next--;\n                    }\n                    int new_count = NewPath.GetPointCount();\n                    NewPath.AddPointCount(2);\n                    NewPath.SetPoint(new_count, m_pPoints[pre].m_PointX, m_pPoints[pre].m_PointY, FXPT_MOVETO);\n                    NewPath.SetPoint(new_count + 1, m_pPoints[next].m_PointX, m_pPoints[next].m_PointY, FXPT_LINETO);\n                } else if ((m_pPoints[i - 1].m_Flag & FXPT_TYPE) == FXPT_MOVETO && (m_pPoints[next].m_Flag & FXPT_TYPE) == FXPT_LINETO &&\n                           m_pPoints[i - 1].m_PointX == m_pPoints[next].m_PointX && m_pPoints[i - 1].m_PointY == m_pPoints[next].m_PointY\n                           && m_pPoints[next].m_Flag & FXPT_CLOSEFIGURE) {\n                    int new_count = NewPath.GetPointCount();\n                    NewPath.AddPointCount(2);\n                    NewPath.SetPoint(new_count, m_pPoints[i - 1].m_PointX, m_pPoints[i - 1].m_PointY, FXPT_MOVETO);\n                    NewPath.SetPoint(new_count + 1, m_pPoints[i].m_PointX, m_pPoints[i].m_PointY, FXPT_LINETO);\n                    bThin = TRUE;\n                }\n            }\n        } else if (point_type == FXPT_BEZIERTO) {\n            i += 2;\n            continue;\n        }\n    }\n    if (m_PointCount > 3 && NewPath.GetPointCount()) {\n        bThin = TRUE;\n    }\n    if (NewPath.GetPointCount() == 0) {\n        return FALSE;\n    }\n    return TRUE;\n}\nFX_BOOL CFX_PathData::IsRect() const\n{\n    if (m_PointCount != 5 && m_PointCount != 4) {\n        return FALSE;\n    }\n    if ((m_PointCount == 5 && (m_pPoints[0].m_PointX != m_pPoints[4].m_PointX ||\n                               m_pPoints[0].m_PointY != m_pPoints[4].m_PointY)) ||\n            (m_pPoints[0].m_PointX == m_pPoints[2].m_PointX && m_pPoints[0].m_PointY == m_pPoints[2].m_PointY) ||\n            (m_pPoints[1].m_PointX == m_pPoints[3].m_PointX && m_pPoints[1].m_PointY == m_pPoints[3].m_PointY)) {\n        return FALSE;\n    }\n    if (m_pPoints[0].m_PointX != m_pPoints[3].m_PointX && m_pPoints[0].m_PointY != m_pPoints[3].m_PointY) {\n        return FALSE;\n    }\n    for (int i = 1; i < 4; i ++) {\n        if ((m_pPoints[i].m_Flag & FXPT_TYPE) != FXPT_LINETO) {\n            return FALSE;\n        }\n        if (m_pPoints[i].m_PointX != m_pPoints[i - 1].m_PointX && m_pPoints[i].m_PointY != m_pPoints[i - 1].m_PointY) {\n            return FALSE;\n        }\n    }\n    return m_PointCount == 5 || (m_pPoints[3].m_Flag & FXPT_CLOSEFIGURE);\n}\nFX_BOOL CFX_PathData::IsRect(const CFX_AffineMatrix* pMatrix, CFX_FloatRect* pRect) const\n{\n    if (pMatrix == NULL) {\n        if (!IsRect()) {\n            return FALSE;\n        }\n        if (pRect) {\n            pRect->left = m_pPoints[0].m_PointX;\n            pRect->right = m_pPoints[2].m_PointX;\n            pRect->bottom = m_pPoints[0].m_PointY;\n            pRect->top = m_pPoints[2].m_PointY;\n            pRect->Normalize();\n        }\n        return TRUE;\n    }\n    if (m_PointCount != 5 && m_PointCount != 4) {\n        return FALSE;\n    }\n    if ((m_PointCount == 5 && (m_pPoints[0].m_PointX != m_pPoints[4].m_PointX || m_pPoints[0].m_PointY != m_pPoints[4].m_PointY)) ||\n            (m_pPoints[1].m_PointX == m_pPoints[3].m_PointX && m_pPoints[1].m_PointY == m_pPoints[3].m_PointY)) {\n        return FALSE;\n    }\n    if (m_PointCount == 4 && m_pPoints[0].m_PointX != m_pPoints[3].m_PointX && m_pPoints[0].m_PointY != m_pPoints[3].m_PointY) {\n        return FALSE;\n    }\n    FX_FLOAT x[5], y[5];\n    for (int i = 0; i < m_PointCount; i ++) {\n        pMatrix->Transform(m_pPoints[i].m_PointX, m_pPoints[i].m_PointY, x[i], y[i]);\n        if (i) {\n            if ((m_pPoints[i].m_Flag & FXPT_TYPE) != FXPT_LINETO) {\n                return FALSE;\n            }\n            if (x[i] != x[i - 1] && y[i] != y[i - 1]) {\n                return FALSE;\n            }\n        }\n    }\n    if (pRect) {\n        pRect->left = x[0];\n        pRect->right = x[2];\n        pRect->bottom = y[0];\n        pRect->top = y[2];\n        pRect->Normalize();\n    }\n    return TRUE;\n}\nFX_BOOL CFX_PathData::Copy(const CFX_PathData &src)\n{\n    if (!SetPointCount(src.m_PointCount)) {\n        return FALSE;\n    }\n    FXSYS_memcpy32(m_pPoints, src.m_pPoints, sizeof(FX_PATHPOINT) * m_PointCount);\n    return TRUE;\n}\nCFX_GraphStateData::CFX_GraphStateData()\n{\n    m_LineCap = LineCapButt;\n    m_DashCount = 0;\n    m_DashArray = NULL;\n    m_DashPhase = 0;\n    m_LineJoin = LineJoinMiter;\n    m_MiterLimit = 10 * 1.0f;\n    m_LineWidth = 1.0f;\n}\nCFX_GraphStateData::CFX_GraphStateData(const CFX_GraphStateData& src)\n{\n    m_DashArray = NULL;\n    Copy(src);\n}\nvoid CFX_GraphStateData::Copy(const CFX_GraphStateData& src)\n{\n    m_LineCap = src.m_LineCap;\n    m_DashCount = src.m_DashCount;\n    if (m_DashArray) {\n        FX_Free(m_DashArray);\n    }\n    m_DashArray = NULL;\n    m_DashPhase = src.m_DashPhase;\n    m_LineJoin = src.m_LineJoin;\n    m_MiterLimit = src.m_MiterLimit;\n    m_LineWidth = src.m_LineWidth;\n    if (m_DashCount) {\n        m_DashArray = FX_Alloc(FX_FLOAT, m_DashCount);\n        if (!m_DashArray) {\n            return;\n        }\n        FXSYS_memcpy32(m_DashArray, src.m_DashArray, m_DashCount * sizeof(FX_FLOAT));\n    }\n}\nCFX_GraphStateData::~CFX_GraphStateData()\n{\n    if (m_DashArray) {\n        FX_Free(m_DashArray);\n    }\n}\nvoid CFX_GraphStateData::SetDashCount(int count)\n{\n    if (m_DashArray) {\n        FX_Free(m_DashArray);\n    }\n    m_DashArray = NULL;\n    m_DashCount = count;\n    if (count == 0) {\n        return;\n    }\n    m_DashArray = FX_Alloc(FX_FLOAT, count);\n}\n"
  },
  {
    "path": "core/src/fxge/ge/fx_ge_ps.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxge/fx_ge.h\"\n#include \"../../../include/fxcodec/fx_codec.h\"\n#include \"text_int.h\"\nstruct PSGlyph {\n    CFX_Font*\t\tm_pFont;\n    FX_DWORD\t\tm_GlyphIndex;\n    FX_BOOL\t\t\tm_bGlyphAdjust;\n    FX_FLOAT\t\tm_AdjustMatrix[4];\n};\nclass CPSFont : public CFX_Object\n{\npublic:\n    PSGlyph\t\t\tm_Glyphs[256];\n    int\t\t\t\tm_nGlyphs;\n};\nCFX_PSRenderer::CFX_PSRenderer()\n{\n    m_pOutput = NULL;\n    m_bColorSet = m_bGraphStateSet = FALSE;\n    m_bInited = FALSE;\n}\nCFX_PSRenderer::~CFX_PSRenderer()\n{\n    for (int i = 0; i < (int)m_PSFontList.GetSize(); i ++) {\n        CPSFont* pFont = m_PSFontList[i];\n        delete pFont;\n    }\n}\n#define OUTPUT_PS(str) m_pOutput->OutputPS(str, sizeof str-1)\nvoid CFX_PSRenderer::Init(IFX_PSOutput* pOutput, int pslevel, int width, int height, FX_BOOL bCmykOutput)\n{\n    m_PSLevel = pslevel;\n    m_pOutput = pOutput;\n    m_ClipBox.left = m_ClipBox.top = 0;\n    m_ClipBox.right = width;\n    m_ClipBox.bottom = height;\n    m_bCmykOutput = bCmykOutput;\n}\nFX_BOOL CFX_PSRenderer::StartRendering()\n{\n    if (m_bInited) {\n        return TRUE;\n    }\n    static const char init_str[] = \"\\nsave\\n/im/initmatrix load def\\n\"\n                                   \"/n/newpath load def/m/moveto load def/l/lineto load def/c/curveto load def/h/closepath load def\\n\"\n                                   \"/f/fill load def/F/eofill load def/s/stroke load def/W/clip load def/W*/eoclip load def\\n\"\n                                   \"/rg/setrgbcolor load def/k/setcmykcolor load def\\n\"\n                                   \"/J/setlinecap load def/j/setlinejoin load def/w/setlinewidth load def/M/setmiterlimit load def/d/setdash load def\\n\"\n                                   \"/q/gsave load def/Q/grestore load def/iM/imagemask load def\\n\"\n                                   \"/Tj/show load def/Ff/findfont load def/Fs/scalefont load def/Sf/setfont load def\\n\"\n                                   \"/cm/concat load def/Cm/currentmatrix load def/mx/matrix load def/sm/setmatrix load def\\n\"\n                                   ;\n    OUTPUT_PS(init_str);\n    m_bInited = TRUE;\n    return TRUE;\n}\nvoid CFX_PSRenderer::EndRendering()\n{\n    if (m_bInited) {\n        OUTPUT_PS(\"\\nrestore\\n\");\n    }\n    m_bInited = FALSE;\n}\nvoid CFX_PSRenderer::SaveState()\n{\n    StartRendering();\n    OUTPUT_PS(\"q\\n\");\n    m_ClipBoxStack.Add(m_ClipBox);\n}\nvoid CFX_PSRenderer::RestoreState(FX_BOOL bKeepSaved)\n{\n    StartRendering();\n    if (bKeepSaved) {\n        OUTPUT_PS(\"Q\\nq\\n\");\n    } else {\n        OUTPUT_PS(\"Q\\n\");\n    }\n    m_bColorSet = m_bGraphStateSet = FALSE;\n    m_ClipBox = m_ClipBoxStack.GetAt(m_ClipBoxStack.GetSize() - 1);\n    if (!bKeepSaved) {\n        m_ClipBoxStack.RemoveAt(m_ClipBoxStack.GetSize() - 1);\n    }\n}\nvoid CFX_PSRenderer::OutputPath(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device)\n{\n    int nPoints = pPathData->GetPointCount();\n    CFX_ByteTextBuf buf;\n    buf.EstimateSize(nPoints * 10);\n    for (int i = 0; i < nPoints; i ++) {\n        FX_BYTE flag = pPathData->GetFlag(i);\n        FX_FLOAT x = pPathData->GetPointX(i);\n        FX_FLOAT y = pPathData->GetPointY(i);\n        if (pObject2Device) {\n            pObject2Device->Transform(x, y);\n        }\n        buf << x << FX_BSTRC(\" \") << y;\n        switch (flag & FXPT_TYPE) {\n            case FXPT_MOVETO:\n                buf << FX_BSTRC(\" m \");\n                break;\n            case FXPT_LINETO:\n                if (flag & FXPT_CLOSEFIGURE) {\n                    buf << FX_BSTRC(\" l h \");\n                } else {\n                    buf << FX_BSTRC(\" l \");\n                }\n                break;\n            case FXPT_BEZIERTO: {\n                    FX_FLOAT x1 = pPathData->GetPointX(i + 1);\n                    FX_FLOAT x2 = pPathData->GetPointX(i + 2);\n                    FX_FLOAT y1 = pPathData->GetPointY(i + 1);\n                    FX_FLOAT y2 = pPathData->GetPointY(i + 2);\n                    if (pObject2Device) {\n                        pObject2Device->Transform(x1, y1);\n                        pObject2Device->Transform(x2, y2);\n                    }\n                    buf << FX_BSTRC(\" \") << x1 << FX_BSTRC(\" \") << y1 << FX_BSTRC(\" \") << x2 << FX_BSTRC(\" \") << y2;\n                    if (flag & FXPT_CLOSEFIGURE) {\n                        buf << FX_BSTRC(\" c h\\n\");\n                    } else {\n                        buf << FX_BSTRC(\" c\\n\");\n                    }\n                    i += 2;\n                    break;\n                }\n        }\n    }\n    m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());\n}\nvoid CFX_PSRenderer::SetClip_PathFill(const CFX_PathData* pPathData,\n                                      const CFX_AffineMatrix* pObject2Device,\n                                      int fill_mode\n                                     )\n{\n    StartRendering();\n    OutputPath(pPathData, pObject2Device);\n    CFX_FloatRect rect = pPathData->GetBoundingBox();\n    if (pObject2Device) {\n        rect.Transform(pObject2Device);\n    }\n    m_ClipBox.Intersect(rect.GetOutterRect());\n    if ((fill_mode & 3) == FXFILL_WINDING) {\n        OUTPUT_PS(\"W n\\n\");\n    } else {\n        OUTPUT_PS(\"W* n\\n\");\n    }\n}\nvoid CFX_PSRenderer::SetClip_PathStroke(const CFX_PathData* pPathData,\n                                        const CFX_AffineMatrix* pObject2Device,\n                                        const CFX_GraphStateData* pGraphState\n                                       )\n{\n    StartRendering();\n    SetGraphState(pGraphState);\n    if (pObject2Device) {\n        CFX_ByteTextBuf buf;\n        buf << FX_BSTRC(\"mx Cm [\") << pObject2Device->a << FX_BSTRC(\" \") << pObject2Device->b << FX_BSTRC(\" \") <<\n            pObject2Device->c << FX_BSTRC(\" \") << pObject2Device->d << FX_BSTRC(\" \") << pObject2Device->e <<\n            FX_BSTRC(\" \") << pObject2Device->f << FX_BSTRC(\"]cm \");\n        m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());\n    }\n    OutputPath(pPathData, NULL);\n    CFX_FloatRect rect = pPathData->GetBoundingBox(pGraphState->m_LineWidth, pGraphState->m_MiterLimit);\n    rect.Transform(pObject2Device);\n    m_ClipBox.Intersect(rect.GetOutterRect());\n    if (pObject2Device) {\n        OUTPUT_PS(\"strokepath W n sm\\n\");\n    } else {\n        OUTPUT_PS(\"strokepath W n\\n\");\n    }\n}\nFX_BOOL CFX_PSRenderer::DrawPath(const CFX_PathData* pPathData,\n                                 const CFX_AffineMatrix* pObject2Device,\n                                 const CFX_GraphStateData* pGraphState,\n                                 FX_DWORD fill_color,\n                                 FX_DWORD stroke_color,\n                                 int fill_mode,\n                                 int alpha_flag,\n                                 void* pIccTransform\n                                )\n{\n    StartRendering();\n    int fill_alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(fill_color);\n    int stroke_alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_STROKE(alpha_flag) : FXARGB_A(stroke_color);\n    if (fill_alpha && fill_alpha < 255) {\n        return FALSE;\n    }\n    if (stroke_alpha && stroke_alpha < 255) {\n        return FALSE;\n    }\n    if (fill_alpha == 0 && stroke_alpha == 0) {\n        return FALSE;\n    }\n    if (stroke_alpha) {\n        SetGraphState(pGraphState);\n        if (pObject2Device) {\n            CFX_ByteTextBuf buf;\n            buf << FX_BSTRC(\"mx Cm [\") << pObject2Device->a << FX_BSTRC(\" \") << pObject2Device->b << FX_BSTRC(\" \") <<\n                pObject2Device->c << FX_BSTRC(\" \") << pObject2Device->d << FX_BSTRC(\" \") << pObject2Device->e <<\n                FX_BSTRC(\" \") << pObject2Device->f << FX_BSTRC(\"]cm \");\n            m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());\n        }\n    }\n    OutputPath(pPathData, stroke_alpha ? NULL : pObject2Device);\n    if (fill_mode && fill_alpha) {\n        SetColor(fill_color, alpha_flag, pIccTransform);\n        if ((fill_mode & 3) == FXFILL_WINDING) {\n            if (stroke_alpha) {\n                OUTPUT_PS(\"q f Q \");\n            } else {\n                OUTPUT_PS(\"f\");\n            }\n        } else if ((fill_mode & 3) == FXFILL_ALTERNATE) {\n            if (stroke_alpha) {\n                OUTPUT_PS(\"q F Q \");\n            } else {\n                OUTPUT_PS(\"F\");\n            }\n        }\n    }\n    if (stroke_alpha) {\n        SetColor(stroke_color, alpha_flag, pIccTransform);\n        if (pObject2Device) {\n            OUTPUT_PS(\"s sm\");\n        } else {\n            OUTPUT_PS(\"s\");\n        }\n    }\n    OUTPUT_PS(\"\\n\");\n    return TRUE;\n}\nvoid CFX_PSRenderer::SetGraphState(const CFX_GraphStateData* pGraphState)\n{\n    CFX_ByteTextBuf buf;\n    if (!m_bGraphStateSet || m_CurGraphState.m_LineCap != pGraphState->m_LineCap) {\n        buf << pGraphState->m_LineCap << FX_BSTRC(\" J\\n\");\n    }\n    if (!m_bGraphStateSet || m_CurGraphState.m_DashCount != pGraphState->m_DashCount ||\n            FXSYS_memcmp32(m_CurGraphState.m_DashArray, pGraphState->m_DashArray, sizeof(FX_FLOAT)*m_CurGraphState.m_DashCount)) {\n        buf << FX_BSTRC(\"[\");\n        for (int i = 0; i < pGraphState->m_DashCount; i ++) {\n            buf << pGraphState->m_DashArray[i] << FX_BSTRC(\" \");\n        }\n        buf << FX_BSTRC(\"]\") << pGraphState->m_DashPhase << FX_BSTRC(\" d\\n\");\n    }\n    if (!m_bGraphStateSet || m_CurGraphState.m_LineJoin != pGraphState->m_LineJoin) {\n        buf << pGraphState->m_LineJoin << FX_BSTRC(\" j\\n\");\n    }\n    if (!m_bGraphStateSet || m_CurGraphState.m_LineWidth != pGraphState->m_LineWidth) {\n        buf << pGraphState->m_LineWidth << FX_BSTRC(\" w\\n\");\n    }\n    if (!m_bGraphStateSet || m_CurGraphState.m_MiterLimit != pGraphState->m_MiterLimit) {\n        buf << pGraphState->m_MiterLimit << FX_BSTRC(\" M\\n\");\n    }\n    m_CurGraphState.Copy(*pGraphState);\n    m_bGraphStateSet = TRUE;\n    if (buf.GetSize()) {\n        m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());\n    }\n}\nstatic void FaxCompressData(FX_LPBYTE src_buf, int width, int height, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)\n{\n    CCodec_ModuleMgr* pEncoders = CFX_GEModule::Get()->GetCodecModule();\n    if (width * height > 128 && pEncoders && pEncoders->GetFaxModule()->Encode(src_buf, width, height, (width + 7) / 8, dest_buf, dest_size)) {\n        FX_Free(src_buf);\n    } else {\n        dest_buf = src_buf;\n        dest_size = (width + 7) / 8 * height;\n    }\n}\nstatic void PSCompressData(int PSLevel, FX_LPBYTE src_buf, FX_DWORD src_size,\n                           FX_LPBYTE& output_buf, FX_DWORD& output_size, FX_LPCSTR& filter)\n{\n    output_buf = src_buf;\n    output_size = src_size;\n    filter = \"\";\n    if (src_size < 1024) {\n        return;\n    }\n    CCodec_ModuleMgr* pEncoders = CFX_GEModule::Get()->GetCodecModule();\n    FX_LPBYTE dest_buf = NULL;\n    FX_DWORD dest_size = src_size;\n    if (PSLevel >= 3) {\n        if (pEncoders && pEncoders->GetFlateModule()->Encode(src_buf, src_size, dest_buf, dest_size)) {\n            filter = \"/FlateDecode filter \";\n        }\n    } else {\n        if (pEncoders && pEncoders->GetBasicModule()->RunLengthEncode(src_buf, src_size, dest_buf, dest_size)) {\n            filter = \"/RunLengthDecode filter \";\n        }\n    }\n    if (dest_size < src_size) {\n        output_buf = dest_buf;\n        output_size = dest_size;\n    } else {\n        filter = NULL;\n        if (dest_buf) {\n            FX_Free(dest_buf);\n        }\n    }\n}\nFX_BOOL CFX_PSRenderer::SetDIBits(const CFX_DIBSource* pSource, FX_DWORD color, int left, int top,\n                                  int alpha_flag, void* pIccTransform)\n{\n    StartRendering();\n    CFX_AffineMatrix matrix((FX_FLOAT)(pSource->GetWidth()), 0.0f, 0.0f, -(FX_FLOAT)(pSource->GetHeight()),\n                            (FX_FLOAT)(left), (FX_FLOAT)(top + pSource->GetHeight()));\n    return DrawDIBits(pSource, color, &matrix, 0, alpha_flag, pIccTransform);\n}\nFX_BOOL CFX_PSRenderer::StretchDIBits(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,\n                                      int dest_width, int dest_height, FX_DWORD flags,\n                                      int alpha_flag, void* pIccTransform)\n{\n    StartRendering();\n    CFX_AffineMatrix matrix((FX_FLOAT)(dest_width), 0.0f, 0.0f, (FX_FLOAT)(-dest_height),\n                            (FX_FLOAT)(dest_left), (FX_FLOAT)(dest_top + dest_height));\n    return DrawDIBits(pSource, color, &matrix, flags, alpha_flag, pIccTransform);\n}\nFX_BOOL CFX_PSRenderer::DrawDIBits(const CFX_DIBSource* pSource, FX_DWORD color,\n                                   const CFX_AffineMatrix* pMatrix, FX_DWORD flags,\n                                   int alpha_flag, void* pIccTransform)\n{\n    StartRendering();\n    if ((pMatrix->a == 0 && pMatrix->b == 0) || (pMatrix->c == 0 && pMatrix->d == 0)) {\n        return TRUE;\n    }\n    if (pSource->HasAlpha()) {\n        return FALSE;\n    }\n    int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(color) : FXARGB_A(color);\n    if (pSource->IsAlphaMask() && (alpha < 255 || pSource->GetBPP() != 1)) {\n        return FALSE;\n    }\n    OUTPUT_PS(\"q\\n\");\n    CFX_ByteTextBuf buf;\n    buf << FX_BSTRC(\"[\") << pMatrix->a << FX_BSTRC(\" \") << pMatrix->b << FX_BSTRC(\" \") <<\n        pMatrix->c << FX_BSTRC(\" \") << pMatrix->d << FX_BSTRC(\" \") << pMatrix->e <<\n        FX_BSTRC(\" \") << pMatrix->f << FX_BSTRC(\"]cm \");\n    int width = pSource->GetWidth();\n    int height = pSource->GetHeight();\n    buf << width << FX_BSTRC(\" \") << height;\n    if (pSource->GetBPP() == 1 && pSource->GetPalette() == NULL) {\n        int pitch = (width + 7) / 8;\n        FX_DWORD src_size = height * pitch;\n        FX_LPBYTE src_buf = FX_Alloc(FX_BYTE, src_size);\n        if (!src_buf) {\n            return FALSE;\n        }\n        for (int row = 0; row < height; row ++) {\n            FX_LPCBYTE src_scan = pSource->GetScanline(row);\n            FXSYS_memcpy32(src_buf + row * pitch, src_scan, pitch);\n        }\n        FX_LPBYTE output_buf;\n        FX_DWORD output_size;\n        FaxCompressData(src_buf, width, height, output_buf, output_size);\n        if (pSource->IsAlphaMask()) {\n            SetColor(color, alpha_flag, pIccTransform);\n            m_bColorSet = FALSE;\n            buf << FX_BSTRC(\" true[\");\n        } else {\n            buf << FX_BSTRC(\" 1[\");\n        }\n        buf << width << FX_BSTRC(\" 0 0 -\") << height << FX_BSTRC(\" 0 \") << height <<\n            FX_BSTRC(\"]currentfile/ASCII85Decode filter \");\n        if (output_buf != src_buf)\n            buf << FX_BSTRC(\"<</K -1/EndOfBlock false/Columns \") << width << FX_BSTRC(\"/Rows \") << height <<\n                FX_BSTRC(\">>/CCITTFaxDecode filter \");\n        if (pSource->IsAlphaMask()) {\n            buf << FX_BSTRC(\"iM\\n\");\n        } else {\n            buf << FX_BSTRC(\"false 1 colorimage\\n\");\n        }\n        m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());\n        WritePSBinary(output_buf, output_size);\n        FX_Free(output_buf);\n    } else {\n        CFX_DIBSource* pConverted = (CFX_DIBSource*)pSource;\n        if (pIccTransform) {\n            FXDIB_Format format = m_bCmykOutput ? FXDIB_Cmyk : FXDIB_Rgb;\n            pConverted = pSource->CloneConvert(format, NULL, pIccTransform);\n        } else {\n            switch (pSource->GetFormat()) {\n                case FXDIB_1bppRgb:\n                case FXDIB_Rgb32:\n                    pConverted = pSource->CloneConvert(FXDIB_Rgb);\n                    break;\n                case FXDIB_8bppRgb:\n                    if (pSource->GetPalette() != NULL) {\n                        pConverted = pSource->CloneConvert(FXDIB_Rgb);\n                    }\n                    break;\n                case FXDIB_1bppCmyk:\n                    pConverted = pSource->CloneConvert(FXDIB_Cmyk);\n                    break;\n                case FXDIB_8bppCmyk:\n                    if (pSource->GetPalette() != NULL) {\n                        pConverted = pSource->CloneConvert(FXDIB_Cmyk);\n                    }\n                    break;\n                default:\n                    break;\n            }\n        }\n        if (pConverted == NULL) {\n            OUTPUT_PS(\"\\nQ\\n\");\n            return FALSE;\n        }\n        int Bpp = pConverted->GetBPP() / 8;\n        FX_LPBYTE output_buf = NULL;\n        FX_STRSIZE output_size = 0;\n        FX_LPCSTR filter = NULL;\n        if (flags & FXRENDER_IMAGE_LOSSY) {\n            CCodec_ModuleMgr* pEncoders = CFX_GEModule::Get()->GetCodecModule();\n            if (pEncoders && pEncoders->GetJpegModule()->Encode(pConverted, output_buf, output_size)) {\n                filter = \"/DCTDecode filter \";\n            }\n        }\n        if (filter == NULL) {\n            int src_pitch = width * Bpp;\n            output_size = height * src_pitch;\n            output_buf = FX_Alloc(FX_BYTE, output_size);\n            if (!output_buf) {\n                if (pConverted != pSource) {\n                    delete pConverted;\n                    pConverted = NULL;\n                }\n                return FALSE;\n            }\n            for (int row = 0; row < height; row ++) {\n                FX_LPCBYTE src_scan = pConverted->GetScanline(row);\n                FX_LPBYTE dest_scan = output_buf + row * src_pitch;\n                if (Bpp == 3) {\n                    for (int col = 0; col < width; col ++) {\n                        *dest_scan++ = src_scan[2];\n                        *dest_scan++ = src_scan[1];\n                        *dest_scan++ = *src_scan;\n                        src_scan += 3;\n                    }\n                } else {\n                    FXSYS_memcpy32(dest_scan, src_scan, src_pitch);\n                }\n            }\n            FX_LPBYTE compressed_buf;\n            FX_DWORD compressed_size;\n            PSCompressData(m_PSLevel, output_buf, output_size, compressed_buf, compressed_size, filter);\n            if (output_buf != compressed_buf) {\n                FX_Free(output_buf);\n            }\n            output_buf = compressed_buf;\n            output_size = compressed_size;\n        }\n        if (pConverted != pSource) {\n            delete pConverted;\n            pConverted = NULL;\n        }\n        buf << FX_BSTRC(\" 8[\");\n        buf << width << FX_BSTRC(\" 0 0 -\") << height << FX_BSTRC(\" 0 \") << height << FX_BSTRC(\"]\");\n        buf << FX_BSTRC(\"currentfile/ASCII85Decode filter \");\n        if (filter) {\n            buf << filter;\n        }\n        buf << FX_BSTRC(\"false \") << Bpp;\n        buf << FX_BSTRC(\" colorimage\\n\");\n        m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());\n        WritePSBinary(output_buf, output_size);\n        FX_Free(output_buf);\n    }\n    OUTPUT_PS(\"\\nQ\\n\");\n    return TRUE;\n}\nvoid CFX_PSRenderer::SetColor(FX_DWORD color, int alpha_flag, void* pIccTransform)\n{\n    if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {\n        pIccTransform = NULL;\n    }\n    FX_BOOL bCMYK = FALSE;\n    if (pIccTransform) {\n        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n        color = FXGETFLAG_COLORTYPE(alpha_flag) ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);\n        FX_LPBYTE pColor = (FX_LPBYTE)&color;\n        pIccModule->TranslateScanline(pIccTransform, pColor, pColor, 1);\n        color = m_bCmykOutput ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);\n        bCMYK = m_bCmykOutput;\n    } else {\n        bCMYK = FXGETFLAG_COLORTYPE(alpha_flag);\n    }\n    if (bCMYK != m_bCmykOutput || !m_bColorSet || m_LastColor != color) {\n        CFX_ByteTextBuf buf;\n        if (bCMYK) {\n            buf << FXSYS_GetCValue(color) / 255.0 << FX_BSTRC(\" \") << FXSYS_GetMValue(color) / 255.0 << FX_BSTRC(\" \")\n                << FXSYS_GetYValue(color) / 255.0 << FX_BSTRC(\" \") << FXSYS_GetKValue(color) / 255.0 << FX_BSTRC(\" k\\n\");\n        } else {\n            buf << FXARGB_R(color) / 255.0 << FX_BSTRC(\" \") << FXARGB_G(color) / 255.0 << FX_BSTRC(\" \")\n                << FXARGB_B(color) / 255.0 << FX_BSTRC(\" rg\\n\");\n        }\n        if (bCMYK == m_bCmykOutput) {\n            m_bColorSet = TRUE;\n            m_LastColor = color;\n        }\n        m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());\n    }\n}\nvoid CFX_PSRenderer::FindPSFontGlyph(CFX_FaceCache* pFaceCache, CFX_Font* pFont, const FXTEXT_CHARPOS& charpos,\n                                     int& ps_fontnum, int &ps_glyphindex)\n{\n    for (int i = 0; i < (int)m_PSFontList.GetSize(); i ++) {\n        CPSFont* pPSFont = m_PSFontList[i];\n        for (int j = 0; j < pPSFont->m_nGlyphs; j ++)\n            if (pPSFont->m_Glyphs[j].m_pFont == pFont && pPSFont->m_Glyphs[j].m_GlyphIndex == charpos.m_GlyphIndex) {\n                if ((!pPSFont->m_Glyphs[j].m_bGlyphAdjust && !charpos.m_bGlyphAdjust) ||\n                        (pPSFont->m_Glyphs[j].m_bGlyphAdjust && charpos.m_bGlyphAdjust &&\n                         (FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[0] - charpos.m_AdjustMatrix[0]) < 0.01 &&\n                          FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[1] - charpos.m_AdjustMatrix[1]) < 0.01 &&\n                          FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[2] - charpos.m_AdjustMatrix[2]) < 0.01 &&\n                          FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[3] - charpos.m_AdjustMatrix[3]) < 0.01))) {\n                    ps_fontnum = i;\n                    ps_glyphindex = j;\n                    return;\n                }\n            }\n    }\n    if (m_PSFontList.GetSize() == 0 || m_PSFontList[m_PSFontList.GetSize() - 1]->m_nGlyphs == 256) {\n        CPSFont* pPSFont = FX_NEW CPSFont;\n        if (!pPSFont) {\n            return;\n        }\n        pPSFont->m_nGlyphs = 0;\n        m_PSFontList.Add(pPSFont);\n        CFX_ByteTextBuf buf;\n        buf << FX_BSTRC(\"8 dict begin/FontType 3 def/FontMatrix[1 0 0 1 0 0]def\\n\"\n                        \"/FontBBox[0 0 0 0]def/Encoding 256 array def 0 1 255{Encoding exch/.notdef put}for\\n\"\n                        \"/CharProcs 1 dict def CharProcs begin/.notdef {} def end\\n\"\n                        \"/BuildGlyph{1 0 -10 -10 10 10 setcachedevice exch/CharProcs get exch 2 copy known not{pop/.notdef}if get exec}bind def\\n\"\n                        \"/BuildChar{1 index/Encoding get exch get 1 index/BuildGlyph get exec}bind def\\n\"\n                        \"currentdict end\\n\");\n        buf << FX_BSTRC(\"/X\") << m_PSFontList.GetSize() - 1 << FX_BSTRC(\" exch definefont pop\\n\");\n        m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());\n        buf.Clear();\n    }\n    ps_fontnum = m_PSFontList.GetSize() - 1;\n    CPSFont* pPSFont = m_PSFontList[ps_fontnum];\n    ps_glyphindex = pPSFont->m_nGlyphs;\n    pPSFont->m_Glyphs[ps_glyphindex].m_GlyphIndex = charpos.m_GlyphIndex;\n    pPSFont->m_Glyphs[ps_glyphindex].m_pFont = pFont;\n    pPSFont->m_Glyphs[ps_glyphindex].m_bGlyphAdjust = charpos.m_bGlyphAdjust;\n    if (charpos.m_bGlyphAdjust) {\n        pPSFont->m_Glyphs[ps_glyphindex].m_AdjustMatrix[0] = charpos.m_AdjustMatrix[0];\n        pPSFont->m_Glyphs[ps_glyphindex].m_AdjustMatrix[1] = charpos.m_AdjustMatrix[1];\n        pPSFont->m_Glyphs[ps_glyphindex].m_AdjustMatrix[2] = charpos.m_AdjustMatrix[2];\n        pPSFont->m_Glyphs[ps_glyphindex].m_AdjustMatrix[3] = charpos.m_AdjustMatrix[3];\n    }\n    pPSFont->m_nGlyphs ++;\n    CFX_AffineMatrix matrix;\n    if (charpos.m_bGlyphAdjust)\n        matrix.Set(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],\n                   charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);\n    matrix.Concat(1.0f, 0, 0, 1.0f, 0, 0);\n    const CFX_PathData* pPathData = pFaceCache->LoadGlyphPath(pFont, charpos.m_GlyphIndex, charpos.m_FontCharWidth);\n    if (pPathData == NULL) {\n        return;\n    }\n    CFX_PathData TransformedPath(*pPathData);\n    if (charpos.m_bGlyphAdjust) {\n        TransformedPath.Transform(&matrix);\n    }\n    CFX_ByteTextBuf buf;\n    buf << FX_BSTRC(\"/X\") << ps_fontnum << FX_BSTRC(\" Ff/CharProcs get begin/\")\n        << ps_glyphindex << FX_BSTRC(\"{\");\n    buf << FX_BSTRC(\"n \");\n    for (int p = 0; p < TransformedPath.GetPointCount(); p ++) {\n        FX_FLOAT x = TransformedPath.GetPointX(p), y = TransformedPath.GetPointY(p);\n        switch (TransformedPath.GetFlag(p) & FXPT_TYPE) {\n            case FXPT_MOVETO: {\n                    buf << x << FX_BSTRC(\" \") << y << FX_BSTRC(\" m\\n\");\n                    break;\n                }\n            case FXPT_LINETO: {\n                    buf << x << FX_BSTRC(\" \") << y << FX_BSTRC(\" l\\n\");\n                    break;\n                }\n            case FXPT_BEZIERTO: {\n                    buf << x << FX_BSTRC(\" \") << y << FX_BSTRC(\" \")\n                        << TransformedPath.GetPointX(p + 1) << FX_BSTRC(\" \")\n                        << TransformedPath.GetPointY(p + 1) << FX_BSTRC(\" \")\n                        << TransformedPath.GetPointX(p + 2) << FX_BSTRC(\" \")\n                        << TransformedPath.GetPointY(p + 2) << FX_BSTRC(\" c\\n\");\n                    p += 2;\n                    break;\n                }\n        }\n    }\n    buf << FX_BSTRC(\"f\");\n    buf << FX_BSTRC(\"}bind def end\\n\");\n    buf << FX_BSTRC(\"/X\") << ps_fontnum << FX_BSTRC(\" Ff/Encoding get \") << ps_glyphindex\n        << FX_BSTRC(\"/\") << ps_glyphindex << FX_BSTRC(\" put\\n\");\n    m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());\n}\nFX_BOOL CFX_PSRenderer::DrawText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,\n                                 CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device,\n                                 FX_FLOAT font_size, FX_DWORD color,\n                                 int alpha_flag, void* pIccTransform)\n{\n    StartRendering();\n    int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);\n    if (alpha < 255) {\n        return FALSE;\n    }\n    if ((pObject2Device->a == 0 && pObject2Device->b == 0) || (pObject2Device->c == 0 && pObject2Device->d == 0)) {\n        return TRUE;\n    }\n    SetColor(color, alpha_flag, pIccTransform);\n    CFX_ByteTextBuf buf;\n    buf << FX_BSTRC(\"q[\") << pObject2Device->a << FX_BSTRC(\" \") << pObject2Device->b << FX_BSTRC(\" \")\n        << pObject2Device->c << FX_BSTRC(\" \") << pObject2Device->d;\n    buf << FX_BSTRC(\" \") << pObject2Device->e << FX_BSTRC(\" \") << pObject2Device->f << \"]cm\\n\";\n    if (pCache == NULL) {\n        pCache = CFX_GEModule::Get()->GetFontCache();\n    }\n    CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont);\n    FX_FONTCACHE_DEFINE(pCache, pFont);\n    int last_fontnum = -1;\n    for (int i = 0; i < nChars; i ++) {\n        int ps_fontnum, ps_glyphindex;\n        FindPSFontGlyph(pFaceCache, pFont, pCharPos[i], ps_fontnum, ps_glyphindex);\n        if (last_fontnum != ps_fontnum) {\n            buf << FX_BSTRC(\"/X\") << ps_fontnum << FX_BSTRC(\" Ff \") << font_size\n                << FX_BSTRC(\" Fs Sf \");\n            last_fontnum = ps_fontnum;\n        }\n        buf << pCharPos[i].m_OriginX << FX_BSTRC(\" \")\n            << pCharPos[i].m_OriginY << FX_BSTRC(\" m\");\n        CFX_ByteString hex;\n        hex.Format(\"<%02X>\", ps_glyphindex);\n        buf << hex << FX_BSTRC(\"Tj\\n\");\n    }\n    buf << FX_BSTRC(\"Q\\n\");\n    m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());\n    return TRUE;\n}\nvoid CFX_PSRenderer::WritePSBinary(FX_LPCBYTE data, int len)\n{\n    FX_LPBYTE dest_buf;\n    FX_DWORD dest_size;\n    CCodec_ModuleMgr* pEncoders = CFX_GEModule::Get()->GetCodecModule();\n    if (pEncoders && pEncoders->GetBasicModule()->A85Encode(data, len, dest_buf, dest_size)) {\n        m_pOutput->OutputPS((FX_LPCSTR)dest_buf, dest_size);\n        FX_Free(dest_buf);\n    } else {\n        m_pOutput->OutputPS((FX_LPCSTR)data, len);\n    }\n}\n"
  },
  {
    "path": "core/src/fxge/ge/fx_ge_text.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxge/fx_ge.h\"\n#include \"../../../include/fxge/fx_freetype.h\"\n#include \"../../../include/fxcodec/fx_codec.h\"\n#include \"text_int.h\"\n#undef FX_GAMMA\n#undef FX_GAMMA_INVERSE\n#define FX_GAMMA(value)\t\t\t(value)\n#define FX_GAMMA_INVERSE(value)\t(value)\nFX_RECT FXGE_GetGlyphsBBox(FXTEXT_GLYPHPOS* pGlyphAndPos, int nChars, int anti_alias, FX_FLOAT retinaScaleX, FX_FLOAT retinaScaleY)\n{\n    FX_RECT rect(0, 0, 0, 0);\n    FX_BOOL bStarted = FALSE;\n    for (int iChar = 0; iChar < nChars; iChar ++) {\n        FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];\n        const CFX_GlyphBitmap* pGlyph = glyph.m_pGlyph;\n        if (pGlyph == NULL) {\n            continue;\n        }\n        int char_left = glyph.m_OriginX + pGlyph->m_Left;\n        int char_width = (int)(pGlyph->m_Bitmap.GetWidth() / retinaScaleX);\n        if (anti_alias == FXFT_RENDER_MODE_LCD) {\n            char_width /= 3;\n        }\n        int char_right = char_left + char_width;\n        int char_top = glyph.m_OriginY - pGlyph->m_Top;\n        int char_bottom = char_top + (int)(pGlyph->m_Bitmap.GetHeight() / retinaScaleY);\n        if (!bStarted) {\n            rect.left = char_left;\n            rect.right = char_right;\n            rect.top = char_top;\n            rect.bottom = char_bottom;\n            bStarted = TRUE;\n        } else {\n            if (rect.left > char_left) {\n                rect.left = char_left;\n            }\n            if (rect.right < char_right) {\n                rect.right = char_right;\n            }\n            if (rect.top > char_top) {\n                rect.top = char_top;\n            }\n            if (rect.bottom < char_bottom) {\n                rect.bottom = char_bottom;\n            }\n        }\n    }\n    return rect;\n}\nstatic void _AdjustGlyphSpace(FXTEXT_GLYPHPOS* pGlyphAndPos, int nChars)\n{\n    ASSERT(nChars > 1);\n    FX_BOOL bVertical = FALSE;\n    if (pGlyphAndPos[nChars - 1].m_OriginX == pGlyphAndPos[0].m_OriginX) {\n        bVertical = TRUE;\n    } else if (pGlyphAndPos[nChars - 1].m_OriginY != pGlyphAndPos[0].m_OriginY) {\n        return;\n    }\n    int i = nChars - 1;\n    int* next_origin = bVertical ? &pGlyphAndPos[i].m_OriginY : &pGlyphAndPos[i].m_OriginX;\n    FX_FLOAT next_origin_f = bVertical ? pGlyphAndPos[i].m_fOriginY : pGlyphAndPos[i].m_fOriginX;\n    for (i --; i > 0; i --) {\n        int* this_origin = bVertical ? &pGlyphAndPos[i].m_OriginY : &pGlyphAndPos[i].m_OriginX;\n        FX_FLOAT this_origin_f = bVertical ? pGlyphAndPos[i].m_fOriginY : pGlyphAndPos[i].m_fOriginX;\n        int space = (*next_origin) - (*this_origin);\n        FX_FLOAT space_f = next_origin_f - this_origin_f;\n        FX_FLOAT error = (FX_FLOAT)(FXSYS_fabs(space_f) - FXSYS_fabs((FX_FLOAT)(space)));\n        if (error > 0.5f) {\n            *this_origin += space > 0 ? -1 : 1;\n        }\n        next_origin = this_origin;\n        next_origin_f = this_origin_f;\n    }\n}\nstatic const FX_BYTE g_GdipGamma_bgw[9] = {0, 0, 63, 120, 0, 168, 210, 239, 255};\nstatic const FX_BYTE g_GdipGamma_fgw[9] = {0, 0, 16, 45, 0, 87, 135, 192, 255};\nstatic const FX_BYTE g_GdipGammaAdjust_47[48] = {\n    0, 30, 33, 34, 35, 36, 37, 38, 38, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, 42, 43,\n    43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 46,\n    46, 46, 46, 46, 46, 46, 46, 47\n};\nstatic const FX_BYTE g_GdipGammaAdjust_75[76] = {\n    0, 46, 50, 52, 54, 55, 56, 57, 58, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 64, 64, 65,\n    65, 65, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68, 68, 68, 69, 69, 69, 69, 69, 70, 70, 70,\n    70, 70, 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73,\n    73, 74, 74, 74, 74, 74, 74, 74, 74, 75\n};\nstatic const FX_BYTE g_GdipGammaAdjust_81[82] = {\n    0, 49, 53, 56, 58, 59, 60, 61, 62, 63, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 69, 70, 70, 70,\n    71, 71, 71, 72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 76, 76, 76, 76,\n    76, 76, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 80,\n    80, 80, 80, 80, 80, 80, 80, 81\n};\nstatic void _Adjust_alpha(int background, int foreground, int& src_alpha, int text_flags, int a)\n{\n}\nstatic const FX_BYTE g_TextGammaAdjust[256] = {\n    0, 2, 3, 4, 6, 7, 8, 10, 11, 12, 13, 15, 16, 17, 18, 19,\n    21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 38,\n    39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 51, 52, 53, 54, 55,\n    56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 71, 72,\n    73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,\n    89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,\n    105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120,\n    121, 122, 123, 124, 125, 126, 127, 128, 129, 129, 130, 131, 132, 133, 134, 135,\n    136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151,\n    152, 153, 154, 155, 156, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166,\n    167, 168, 169, 170, 171, 172, 173, 174, 174, 175, 176, 177, 178, 179, 180, 181,\n    182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 193, 194, 195, 196,\n    197, 198, 199, 200, 201, 202, 203, 204, 204, 205, 206, 207, 208, 209, 210, 211,\n    212, 213, 214, 215, 216, 217, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226,\n    227, 228, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 239, 240,\n    241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 250, 251, 252, 253, 254, 255,\n};\n#define ADJUST_ALPHA(background, foreground, src_alpha, text_flags, a) \\\n    src_alpha = g_TextGammaAdjust[(FX_BYTE)src_alpha];\nvoid _Color2Argb(FX_ARGB& argb, FX_DWORD color, int alpha_flag, void* pIccTransform)\n{\n    if (pIccTransform == NULL && !FXGETFLAG_COLORTYPE(alpha_flag)) {\n        argb = color;\n        return;\n    }\n    if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {\n        pIccTransform = NULL;\n    }\n    FX_BYTE bgra[4];\n    if (pIccTransform) {\n        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n        color = FXGETFLAG_COLORTYPE(alpha_flag) ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);\n        pIccModule->TranslateScanline(pIccTransform, bgra, (FX_LPCBYTE)&color, 1);\n        bgra[3] = FXGETFLAG_COLORTYPE(alpha_flag) ?\n                  (alpha_flag >> 24) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXGETFLAG_ALPHA_STROKE(alpha_flag) :\n                  FXARGB_A(color);\n        argb = FXARGB_MAKE(bgra[3], bgra[2], bgra[1], bgra[0]);\n        return;\n    }\n    AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color),\n                       FXSYS_GetYValue(color), FXSYS_GetKValue(color),\n                       bgra[2], bgra[1], bgra[0]);\n    bgra[3] = (alpha_flag >> 24) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXGETFLAG_ALPHA_STROKE(alpha_flag);\n    argb = FXARGB_MAKE(bgra[3], bgra[2], bgra[1], bgra[0]);\n}\nFX_BOOL CFX_RenderDevice::DrawNormalText(int nChars, const FXTEXT_CHARPOS* pCharPos,\n        CFX_Font* pFont, CFX_FontCache* pCache,\n        FX_FLOAT font_size, const CFX_AffineMatrix* pText2Device,\n        FX_DWORD fill_color, FX_DWORD text_flags,\n        int alpha_flag, void* pIccTransform)\n{\n    int nativetext_flags = text_flags;\n    if (m_DeviceClass != FXDC_DISPLAY) {\n        if (!(text_flags & FXTEXT_PRINTGRAPHICTEXT)) {\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n            if (!(text_flags & FXFONT_CIDFONT) && pFont->GetPsName().Find(CFX_WideString::FromLocal(\"+ZJHL\")) == -1)\n#ifdef FOXIT_CHROME_BUILD\n                if (pFont->GetPsName() != CFX_WideString::FromLocal(\"CNAAJI+cmex10\"))\n#endif\n#endif\n                    if (m_pDeviceDriver->DrawDeviceText(nChars, pCharPos, pFont, pCache, pText2Device, font_size, fill_color, alpha_flag, pIccTransform)) {\n                        return TRUE;\n                    }\n        }\n        int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(fill_color);\n        if (alpha < 255) {\n            return FALSE;\n        }\n    } else if (!(text_flags & FXTEXT_NO_NATIVETEXT)) {\n#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_\n        if (!(text_flags & FXFONT_CIDFONT))\n#ifdef FOXIT_CHROME_BUILD\n            if (pFont->GetPsName() != CFX_WideString::FromLocal(\"CNAAJI+cmex10\"))\n#endif\n#endif\n                if (m_pDeviceDriver->DrawDeviceText(nChars, pCharPos, pFont, pCache, pText2Device, font_size, fill_color, alpha_flag, pIccTransform)) {\n                    return TRUE;\n                }\n    }\n    CFX_AffineMatrix char2device, deviceCtm, text2Device;\n    if (pText2Device) {\n        char2device = *pText2Device;\n        text2Device = *pText2Device;\n    }\n    char2device.Scale(font_size, -font_size);\n    if (FXSYS_fabs(char2device.a) + FXSYS_fabs(char2device.b) > 50 * 1.0f ||\n            ((m_DeviceClass == FXDC_PRINTER && !m_pDeviceDriver->IsPSPrintDriver())\n             && !(text_flags & FXTEXT_PRINTIMAGETEXT))) {\n        if (pFont->GetFace() != NULL || (pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_GLYPHPATH)) {\n            int nPathFlags = (text_flags & FXTEXT_NOSMOOTH) == 0 ? 0 : FXFILL_NOPATHSMOOTH;\n            return DrawTextPath(nChars, pCharPos, pFont, pCache, font_size, pText2Device, NULL, NULL, fill_color, 0, NULL, nPathFlags, alpha_flag, pIccTransform);\n        }\n    }\n    int anti_alias = FXFT_RENDER_MODE_MONO;\n    FX_BOOL bNormal = FALSE;\n    if ((text_flags & FXTEXT_NOSMOOTH) == 0) {\n        if (m_DeviceClass == FXDC_DISPLAY && m_bpp > 1) {\n            FX_BOOL bClearType;\n            if (pFont->GetFace() == NULL && !(pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_CLEARTYPE)) {\n                bClearType = FALSE;\n            } else {\n                bClearType = text_flags & FXTEXT_CLEARTYPE;\n            }\n            if ((m_RenderCaps & (FXRC_ALPHA_OUTPUT | FXRC_CMYK_OUTPUT))) {\n                anti_alias = FXFT_RENDER_MODE_LCD;\n                bNormal = TRUE;\n            } else if (m_bpp < 16) {\n                anti_alias = FXFT_RENDER_MODE_NORMAL;\n            } else {\n                if (bClearType == FALSE) {\n                    anti_alias = FXFT_RENDER_MODE_LCD;\n                    bNormal = TRUE;\n                } else {\n                    anti_alias = FXFT_RENDER_MODE_LCD;\n                }\n            }\n        }\n    }\n    if (pCache == NULL) {\n        pCache = CFX_GEModule::Get()->GetFontCache();\n    }\n    CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont);\n    FX_FONTCACHE_DEFINE(pCache, pFont);\n    FXTEXT_GLYPHPOS* pGlyphAndPos = FX_Alloc(FXTEXT_GLYPHPOS, nChars);\n    if (!pGlyphAndPos) {\n        return FALSE;\n    }\n    int iChar;\n    deviceCtm = char2device;\n    CFX_AffineMatrix matrixCTM = GetCTM();\n    FX_FLOAT scale_x = FXSYS_fabs(matrixCTM.a);\n    FX_FLOAT scale_y = FXSYS_fabs(matrixCTM.d);\n    deviceCtm.Concat(scale_x, 0, 0, scale_y, 0, 0);\n    text2Device.Concat(scale_x, 0, 0, scale_y, 0, 0);\n    for (iChar = 0; iChar < nChars; iChar ++) {\n        FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];\n        const FXTEXT_CHARPOS& charpos = pCharPos[iChar];\n        glyph.m_fOriginX = charpos.m_OriginX;\n        glyph.m_fOriginY = charpos.m_OriginY;\n        text2Device.Transform(glyph.m_fOriginX, glyph.m_fOriginY);\n        if (anti_alias < FXFT_RENDER_MODE_LCD) {\n            glyph.m_OriginX = FXSYS_round(glyph.m_fOriginX);\n        } else {\n            glyph.m_OriginX = (int)FXSYS_floor(glyph.m_fOriginX);\n        }\n        glyph.m_OriginY = FXSYS_round(glyph.m_fOriginY);\n        if (charpos.m_bGlyphAdjust) {\n            CFX_AffineMatrix new_matrix(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],\n                                        charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);\n            new_matrix.Concat(deviceCtm);\n            glyph.m_pGlyph = pFaceCache->LoadGlyphBitmap(pFont, charpos.m_GlyphIndex, charpos.m_bFontStyle, &new_matrix,\n                             charpos.m_FontCharWidth, anti_alias, nativetext_flags);\n        } else\n            glyph.m_pGlyph = pFaceCache->LoadGlyphBitmap(pFont, charpos.m_GlyphIndex, charpos.m_bFontStyle, &deviceCtm,\n                             charpos.m_FontCharWidth, anti_alias, nativetext_flags);\n    }\n    if (anti_alias < FXFT_RENDER_MODE_LCD && nChars > 1) {\n        _AdjustGlyphSpace(pGlyphAndPos, nChars);\n    }\n    FX_RECT bmp_rect1 = FXGE_GetGlyphsBBox(pGlyphAndPos, nChars, anti_alias);\n    if (scale_x > 1 && scale_y > 1) {\n        bmp_rect1.left--;\n        bmp_rect1.top --;\n        bmp_rect1.right ++;\n        bmp_rect1.bottom ++;\n    }\n    FX_RECT bmp_rect(FXSYS_round((FX_FLOAT)(bmp_rect1.left) / scale_x), FXSYS_round((FX_FLOAT)(bmp_rect1.top) / scale_y),\n                     FXSYS_round((FX_FLOAT)bmp_rect1.right / scale_x), FXSYS_round((FX_FLOAT)bmp_rect1.bottom / scale_y));\n    bmp_rect.Intersect(m_ClipBox);\n    if (bmp_rect.IsEmpty()) {\n        FX_Free(pGlyphAndPos);\n        return TRUE;\n    }\n    int pixel_width = FXSYS_round(bmp_rect.Width() * scale_x);\n    int pixel_height = FXSYS_round(bmp_rect.Height() * scale_y);\n    int pixel_left = FXSYS_round(bmp_rect.left * scale_x);\n    int pixel_top = FXSYS_round(bmp_rect.top * scale_y);\n    if (anti_alias == FXFT_RENDER_MODE_MONO) {\n        CFX_DIBitmap bitmap;\n        if (!bitmap.Create(pixel_width, pixel_height, FXDIB_1bppMask)) {\n            FX_Free(pGlyphAndPos);\n            return FALSE;\n        }\n        bitmap.Clear(0);\n        for (iChar = 0; iChar < nChars; iChar ++) {\n            FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];\n            if (glyph.m_pGlyph == NULL) {\n                continue;\n            }\n            const CFX_DIBitmap* pGlyph = &glyph.m_pGlyph->m_Bitmap;\n            bitmap.TransferBitmap(glyph.m_OriginX + glyph.m_pGlyph->m_Left - pixel_left,\n                                  glyph.m_OriginY - glyph.m_pGlyph->m_Top - pixel_top,\n                                  pGlyph->GetWidth(), pGlyph->GetHeight(), pGlyph, 0, 0);\n        }\n        FX_Free(pGlyphAndPos);\n        return SetBitMask(&bitmap, bmp_rect.left, bmp_rect.top, fill_color);\n    }\n    CFX_DIBitmap bitmap;\n    if (m_bpp == 8) {\n        if (!bitmap.Create(pixel_width, pixel_height, FXDIB_8bppMask)) {\n            FX_Free(pGlyphAndPos);\n            return FALSE;\n        }\n    } else {\n        if (!CreateCompatibleBitmap(&bitmap, pixel_width, pixel_height)) {\n            FX_Free(pGlyphAndPos);\n            return FALSE;\n        }\n    }\n    if (!bitmap.HasAlpha() && !bitmap.IsAlphaMask()) {\n        bitmap.Clear(0xFFFFFFFF);\n        if (!GetDIBits(&bitmap, bmp_rect.left, bmp_rect.top)) {\n            FX_Free(pGlyphAndPos);\n            return FALSE;\n        }\n    } else {\n        bitmap.Clear(0);\n        if (bitmap.m_pAlphaMask) {\n            bitmap.m_pAlphaMask->Clear(0);\n        }\n    }\n    int dest_width = pixel_width;\n    FX_LPBYTE dest_buf = bitmap.GetBuffer();\n    int dest_pitch = bitmap.GetPitch();\n    int Bpp = bitmap.GetBPP() / 8;\n    int a, r, g, b;\n    if (anti_alias == FXFT_RENDER_MODE_LCD) {\n        _Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform);\n        ArgbDecode(fill_color, a, r, g, b);\n        r = FX_GAMMA(r);\n        g = FX_GAMMA(g);\n        b = FX_GAMMA(b);\n    }\n    for (iChar = 0; iChar < nChars; iChar ++) {\n        FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];\n        if (glyph.m_pGlyph == NULL) {\n            continue;\n        }\n        const CFX_DIBitmap* pGlyph = &glyph.m_pGlyph->m_Bitmap;\n        int left = glyph.m_OriginX + glyph.m_pGlyph->m_Left - pixel_left;\n        int top = glyph.m_OriginY - glyph.m_pGlyph->m_Top - pixel_top;\n        int ncols = pGlyph->GetWidth();\n        int nrows = pGlyph->GetHeight();\n        if (anti_alias == FXFT_RENDER_MODE_NORMAL) {\n            if (!bitmap.CompositeMask(left, top, ncols, nrows, pGlyph, fill_color,\n                                      0, 0, FXDIB_BLEND_NORMAL, NULL, FALSE, alpha_flag, pIccTransform)) {\n                FX_Free(pGlyphAndPos);\n                return FALSE;\n            }\n            continue;\n        }\n        FX_BOOL bBGRStripe = text_flags & FXTEXT_BGR_STRIPE;\n        ncols /= 3;\n        int x_subpixel = (int)(glyph.m_fOriginX * 3) % 3;\n        FX_LPBYTE src_buf = pGlyph->GetBuffer();\n        int src_pitch = pGlyph->GetPitch();\n        int start_col = left;\n        if (start_col < 0) {\n            start_col = 0;\n        }\n        int end_col = left + ncols;\n        if (end_col > dest_width) {\n            end_col = dest_width;\n        }\n        if (start_col >= end_col) {\n            continue;\n        }\n        if (bitmap.GetFormat() == FXDIB_Argb) {\n            for (int row = 0; row < nrows; row ++) {\n                int dest_row = row + top;\n                if (dest_row < 0 || dest_row >= bitmap.GetHeight()) {\n                    continue;\n                }\n                FX_LPBYTE src_scan = src_buf + row * src_pitch + (start_col - left) * 3;\n                FX_LPBYTE dest_scan = dest_buf + dest_row * dest_pitch + (start_col << 2);\n                if (bBGRStripe) {\n                    if (x_subpixel == 0) {\n                        for (int col = start_col; col < end_col; col ++) {\n                            int src_alpha = src_scan[2];\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));\n                            src_alpha = src_scan[1];\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));\n                            src_alpha = src_scan[0];\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));\n                            dest_scan[3] = 255;\n                            dest_scan += 4;\n                            src_scan += 3;\n                        }\n                    } else if (x_subpixel == 1) {\n                        int src_alpha = src_scan[1];\n                        ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);\n                        src_alpha = src_alpha * a / 255;\n                        dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));\n                        src_alpha = src_scan[0];\n                        ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);\n                        src_alpha = src_alpha * a / 255;\n                        dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));\n                        if (start_col > left) {\n                            src_alpha = src_scan[-1];\n                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));\n                        }\n                        dest_scan[3] = 255;\n                        dest_scan += 4;\n                        src_scan += 3;\n                        for (int col = start_col + 1; col < end_col - 1; col ++) {\n                            int src_alpha = src_scan[1];\n                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));\n                            src_alpha = src_scan[0];\n                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));\n                            src_alpha = src_scan[-1];\n                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));\n                            dest_scan[3] = 255;\n                            dest_scan += 4;\n                            src_scan += 3;\n                        }\n                    } else {\n                        int src_alpha = src_scan[0];\n                        ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);\n                        src_alpha = src_alpha * a / 255;\n                        dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));\n                        if (start_col > left) {\n                            src_alpha = src_scan[-1];\n                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));\n                            src_alpha = src_scan[-2];\n                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));\n                        }\n                        dest_scan[3] = 255;\n                        dest_scan += 4;\n                        src_scan += 3;\n                        for (int col = start_col + 1; col < end_col - 1; col ++) {\n                            int src_alpha = src_scan[0];\n                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));\n                            src_alpha = src_scan[-1];\n                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));\n                            src_alpha = src_scan[-2];\n                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));\n                            dest_scan[3] = 255;\n                            dest_scan += 4;\n                            src_scan += 3;\n                        }\n                    }\n                } else {\n                    if (x_subpixel == 0) {\n                        for (int col = start_col; col < end_col; col ++) {\n                            if (bNormal) {\n                                int src_alpha1 = (src_scan[0] + src_scan[1] + src_scan[2]) / 3;\n                                ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);\n                                src_alpha1 = src_alpha1 * a / 255;\n                                FX_BYTE back_alpha = dest_scan[3];\n                                if (back_alpha == 0) {\n                                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));\n                                    dest_scan += 4;\n                                    src_scan += 3;\n                                    continue;\n                                }\n                                if (src_alpha1 == 0) {\n                                    dest_scan += 4;\n                                    src_scan += 3;\n                                    continue;\n                                }\n                                FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;\n                                dest_scan[3] = dest_alpha;\n                                int alpha_ratio = src_alpha1 * 255 / dest_alpha;\n                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));\n                                dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));\n                                dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));\n                                dest_scan += 4;\n                                src_scan += 3;\n                                continue;\n                            }\n                            int src_alpha = src_scan[0];\n                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));\n                            src_alpha = src_scan[1];\n                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));\n                            src_alpha = src_scan[2];\n                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));\n                            dest_scan[3] = 255;\n                            dest_scan += 4;\n                            src_scan += 3;\n                        }\n                    } else if (x_subpixel == 1) {\n                        if (bNormal) {\n                            int src_alpha1 = start_col > left ? ((src_scan[-1] + src_scan[0] + src_scan[1]) / 3) : ((src_scan[0] + src_scan[1]) / 3);\n                            ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);\n                            src_alpha1 = src_alpha1 * a / 255;\n                            if (src_alpha1 == 0) {\n                                dest_scan += 4;\n                                src_scan += 3;\n                            } else {\n                                FX_BYTE back_alpha = dest_scan[3];\n                                if (back_alpha == 0) {\n                                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));\n                                } else {\n                                    FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;\n                                    dest_scan[3] = dest_alpha;\n                                    int alpha_ratio = src_alpha1 * 255 / dest_alpha;\n                                    dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));\n                                    dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));\n                                    dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));\n                                }\n                                dest_scan += 4;\n                                src_scan += 3;\n                            }\n                        } else {\n                            if (start_col > left) {\n                                int src_alpha = src_scan[-1];\n                                ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);\n                                src_alpha = src_alpha * a / 255;\n                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));\n                            }\n                            int src_alpha = src_scan[0];\n                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));\n                            src_alpha = src_scan[1];\n                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));\n                            dest_scan[3] = 255;\n                            dest_scan += 4;\n                            src_scan += 3;\n                        }\n                        for (int col = start_col + 1; col < end_col; col ++) {\n                            if (bNormal) {\n                                int src_alpha1 = (src_scan[-1] + src_scan[0] + src_scan[1]) / 3;\n                                ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);\n                                src_alpha1 = src_alpha1 * a / 255;\n                                FX_BYTE back_alpha = dest_scan[3];\n                                if (back_alpha == 0) {\n                                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));\n                                    dest_scan += 4;\n                                    src_scan += 3;\n                                    continue;\n                                }\n                                if (src_alpha1 == 0) {\n                                    dest_scan += 4;\n                                    src_scan += 3;\n                                    continue;\n                                }\n                                FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;\n                                dest_scan[3] = dest_alpha;\n                                int alpha_ratio = src_alpha1 * 255 / dest_alpha;\n                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));\n                                dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));\n                                dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));\n                                dest_scan += 4;\n                                src_scan += 3;\n                                continue;\n                            }\n                            int src_alpha = src_scan[-1];\n                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));\n                            src_alpha = src_scan[0];\n                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));\n                            src_alpha = src_scan[1];\n                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));\n                            dest_scan[3] = 255;\n                            dest_scan += 4;\n                            src_scan += 3;\n                        }\n                    } else {\n                        if (bNormal) {\n                            int src_alpha1 = start_col > left ? ((src_scan[-2] + src_scan[-1] + src_scan[0]) / 3) : ((src_scan[0]) / 3);\n                            ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);\n                            src_alpha1 = src_alpha1 * a / 255;\n                            if (src_alpha1 == 0) {\n                                dest_scan += 4;\n                                src_scan += 3;\n                            } else {\n                                FX_BYTE back_alpha = dest_scan[3];\n                                if (back_alpha == 0) {\n                                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));\n                                } else {\n                                    FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;\n                                    dest_scan[3] = dest_alpha;\n                                    int alpha_ratio = src_alpha1 * 255 / dest_alpha;\n                                    dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));\n                                    dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));\n                                    dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));\n                                }\n                                dest_scan += 4;\n                                src_scan += 3;\n                            }\n                        } else {\n                            if (start_col > left) {\n                                int src_alpha = src_scan[-2];\n                                ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);\n                                src_alpha = src_alpha * a / 255;\n                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));\n                                src_alpha = src_scan[-1];\n                                ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);\n                                src_alpha = src_alpha * a / 255;\n                                dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));\n                            }\n                            int src_alpha = src_scan[0];\n                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));\n                            dest_scan[3] = 255;\n                            dest_scan += 4;\n                            src_scan += 3;\n                        }\n                        for (int col = start_col + 1; col < end_col; col ++) {\n                            if (bNormal) {\n                                int src_alpha1 = (src_scan[-2] + src_scan[-1] + src_scan[0]) / 3;\n                                ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);\n                                src_alpha1 = src_alpha1 * a / 255;\n                                FX_BYTE back_alpha = dest_scan[3];\n                                if (back_alpha == 0) {\n                                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));\n                                    dest_scan += 4;\n                                    src_scan += 3;\n                                    continue;\n                                }\n                                if (src_alpha1 == 0) {\n                                    dest_scan += 4;\n                                    src_scan += 3;\n                                    continue;\n                                }\n                                FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;\n                                dest_scan[3] = dest_alpha;\n                                int alpha_ratio = src_alpha1 * 255 / dest_alpha;\n                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));\n                                dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));\n                                dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));\n                                dest_scan += 4;\n                                src_scan += 3;\n                                continue;\n                            }\n                            int src_alpha = src_scan[-2];\n                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));\n                            src_alpha = src_scan[-1];\n                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));\n                            src_alpha = src_scan[0];\n                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));\n                            dest_scan[3] = 255;\n                            dest_scan += 4;\n                            src_scan += 3;\n                        }\n                    }\n                }\n            }\n        } else {\n            for (int row = 0; row < nrows; row ++) {\n                int dest_row = row + top;\n                if (dest_row < 0 || dest_row >= bitmap.GetHeight()) {\n                    continue;\n                }\n                FX_LPBYTE src_scan = src_buf + row * src_pitch + (start_col - left) * 3;\n                FX_LPBYTE dest_scan = dest_buf + dest_row * dest_pitch + start_col * Bpp;\n                if (bBGRStripe) {\n                    if (x_subpixel == 0) {\n                        for (int col = start_col; col < end_col; col ++) {\n                            int src_alpha = src_scan[2];\n                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));\n                            src_alpha = src_scan[1];\n                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));\n                            src_alpha = src_scan[0];\n                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));\n                            dest_scan += Bpp;\n                            src_scan += 3;\n                        }\n                    } else if (x_subpixel == 1) {\n                        int src_alpha = src_scan[1];\n                        ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);\n                        src_alpha = src_alpha * a / 255;\n                        dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));\n                        src_alpha = src_scan[0];\n                        ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);\n                        src_alpha = src_alpha * a / 255;\n                        dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));\n                        if (start_col > left) {\n                            src_alpha = src_scan[-1];\n                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));\n                        }\n                        dest_scan += Bpp;\n                        src_scan += 3;\n                        for (int col = start_col + 1; col < end_col - 1; col ++) {\n                            int src_alpha = src_scan[1];\n                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));\n                            src_alpha = src_scan[0];\n                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));\n                            src_alpha = src_scan[-1];\n                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));\n                            dest_scan += Bpp;\n                            src_scan += 3;\n                        }\n                    } else {\n                        int src_alpha = src_scan[0];\n                        ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);\n                        src_alpha = src_alpha * a / 255;\n                        dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));\n                        if (start_col > left) {\n                            src_alpha = src_scan[-1];\n                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));\n                            src_alpha = src_scan[-2];\n                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));\n                        }\n                        dest_scan += Bpp;\n                        src_scan += 3;\n                        for (int col = start_col + 1; col < end_col - 1; col ++) {\n                            int src_alpha = src_scan[0];\n                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));\n                            src_alpha = src_scan[-1];\n                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));\n                            src_alpha = src_scan[-2];\n                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));\n                            dest_scan += Bpp;\n                            src_scan += 3;\n                        }\n                    }\n                } else {\n                    if (x_subpixel == 0) {\n                        for (int col = start_col; col < end_col; col ++) {\n                            if (bNormal) {\n                                int src_alpha1 = (src_scan[0] + src_scan[1] + src_scan[2]) / 3;\n                                ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);\n                                src_alpha1 = src_alpha1 * a / 255;\n                                if (src_alpha1 == 0) {\n                                    dest_scan += Bpp;\n                                    src_scan += 3;\n                                    continue;\n                                }\n                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));\n                                dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));\n                                dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));\n                                dest_scan += Bpp;\n                                src_scan += 3;\n                                continue;\n                            }\n                            int src_alpha = src_scan[0];\n                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));\n                            src_alpha = src_scan[1];\n                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));\n                            src_alpha = src_scan[2];\n                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));\n                            dest_scan += Bpp;\n                            src_scan += 3;\n                        }\n                    } else if (x_subpixel == 1) {\n                        if (bNormal) {\n                            int src_alpha1 = start_col > left ? (src_scan[0] + src_scan[1] + src_scan[-1]) / 3 : (src_scan[0] + src_scan[1]) / 3;\n                            ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);\n                            src_alpha1 = src_alpha1 * a / 255;\n                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));\n                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));\n                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));\n                            dest_scan += Bpp;\n                            src_scan += 3;\n                        } else {\n                            if (start_col > left) {\n                                int src_alpha = src_scan[-1];\n                                ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);\n                                src_alpha = src_alpha * a / 255;\n                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));\n                            }\n                            int src_alpha = src_scan[0];\n                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));\n                            src_alpha = src_scan[1];\n                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));\n                            dest_scan += Bpp;\n                            src_scan += 3;\n                        }\n                        for (int col = start_col + 1; col < end_col; col ++) {\n                            if (bNormal) {\n                                int src_alpha1 = (src_scan[0] + src_scan[1] + src_scan[-1]) / 3;\n                                ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);\n                                src_alpha1 = src_alpha1 * a / 255;\n                                if (src_alpha1 == 0) {\n                                    dest_scan += Bpp;\n                                    src_scan += 3;\n                                    continue;\n                                }\n                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));\n                                dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));\n                                dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));\n                                dest_scan += Bpp;\n                                src_scan += 3;\n                                continue;\n                            }\n                            int src_alpha = src_scan[-1];\n                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));\n                            src_alpha = src_scan[0];\n                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));\n                            src_alpha = src_scan[1];\n                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));\n                            dest_scan += Bpp;\n                            src_scan += 3;\n                        }\n                    } else {\n                        if (bNormal) {\n                            int src_alpha1 = start_col > left ? (src_scan[0] + src_scan[-2] + src_scan[-1]) / 3 : src_scan[0] / 3;\n                            ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);\n                            src_alpha1 = src_alpha1 * a / 255;\n                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));\n                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));\n                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));\n                            dest_scan += Bpp;\n                            src_scan += 3;\n                        } else {\n                            if (start_col > left) {\n                                int src_alpha = src_scan[-2];\n                                ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);\n                                src_alpha = src_alpha * a / 255;\n                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));\n                                src_alpha = src_scan[-1];\n                                ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);\n                                src_alpha = src_alpha * a / 255;\n                                dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));\n                            }\n                            int src_alpha = src_scan[0];\n                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));\n                            dest_scan += Bpp;\n                            src_scan += 3;\n                        }\n                        for (int col = start_col + 1; col < end_col; col ++) {\n                            if (bNormal) {\n                                int src_alpha1 = ((int)(src_scan[0]) + (int)(src_scan[-2]) + (int)(src_scan[-1])) / 3;\n                                ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);\n                                src_alpha1 = src_alpha1 * a / 255;\n                                if (src_alpha1 == 0) {\n                                    dest_scan += Bpp;\n                                    src_scan += 3;\n                                    continue;\n                                }\n                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));\n                                dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));\n                                dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));\n                                dest_scan += Bpp;\n                                src_scan += 3;\n                                continue;\n                            }\n                            int src_alpha = src_scan[-2];\n                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));\n                            src_alpha = src_scan[-1];\n                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));\n                            src_alpha = src_scan[0];\n                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);\n                            src_alpha = src_alpha * a / 255;\n                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));\n                            dest_scan += Bpp;\n                            src_scan += 3;\n                        }\n                    }\n                }\n            }\n        }\n    }\n    if (bitmap.IsAlphaMask()) {\n        SetBitMask(&bitmap, bmp_rect.left, bmp_rect.top, fill_color, alpha_flag, pIccTransform);\n    } else {\n        SetDIBits(&bitmap, bmp_rect.left, bmp_rect.top);\n    }\n    FX_Free(pGlyphAndPos);\n    return TRUE;\n}\nFX_BOOL CFX_RenderDevice::DrawTextPath(int nChars, const FXTEXT_CHARPOS* pCharPos,\n                                       CFX_Font* pFont, CFX_FontCache* pCache,\n                                       FX_FLOAT font_size, const CFX_AffineMatrix* pText2User,\n                                       const CFX_AffineMatrix* pUser2Device, const CFX_GraphStateData* pGraphState,\n                                       FX_DWORD fill_color, FX_ARGB stroke_color, CFX_PathData* pClippingPath, int nFlag,\n                                       int alpha_flag, void* pIccTransform, int blend_type)\n{\n    if (pCache == NULL) {\n        pCache = CFX_GEModule::Get()->GetFontCache();\n    }\n    CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont);\n    FX_FONTCACHE_DEFINE(pCache, pFont);\n    for (int iChar = 0; iChar < nChars; iChar ++) {\n        const FXTEXT_CHARPOS& charpos = pCharPos[iChar];\n        CFX_AffineMatrix matrix;\n        if (charpos.m_bGlyphAdjust)\n            matrix.Set(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],\n                       charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);\n        matrix.Concat(font_size, 0, 0, font_size, charpos.m_OriginX, charpos.m_OriginY);\n        const CFX_PathData* pPath = pFaceCache->LoadGlyphPath(pFont, charpos.m_GlyphIndex, charpos.m_FontCharWidth);\n        if (pPath == NULL) {\n            continue;\n        }\n        matrix.Concat(*pText2User);\n        CFX_PathData TransformedPath(*pPath);\n        TransformedPath.Transform(&matrix);\n        FX_BOOL bHasAlpha = FXGETFLAG_COLORTYPE(alpha_flag) ?\n                            (FXGETFLAG_ALPHA_FILL(alpha_flag) || FXGETFLAG_ALPHA_STROKE(alpha_flag)) :\n                            (fill_color || stroke_color);\n        if (bHasAlpha) {\n            int fill_mode = nFlag;\n            if (FXGETFLAG_COLORTYPE(alpha_flag)) {\n                if (FXGETFLAG_ALPHA_FILL(alpha_flag)) {\n                    fill_mode |= FXFILL_WINDING;\n                }\n            } else {\n                if (fill_color) {\n                    fill_mode |= FXFILL_WINDING;\n                }\n            }\n            fill_mode |= FX_FILL_TEXT_MODE;\n            if (!DrawPath(&TransformedPath, pUser2Device, pGraphState, fill_color, stroke_color, fill_mode, alpha_flag, pIccTransform, blend_type)) {\n                return FALSE;\n            }\n        }\n        if (pClippingPath) {\n            pClippingPath->Append(&TransformedPath, pUser2Device);\n        }\n    }\n    return TRUE;\n}\nCFX_FontCache::~CFX_FontCache()\n{\n    FreeCache(TRUE);\n}\nCFX_FaceCache* CFX_FontCache::GetCachedFace(CFX_Font* pFont)\n{\n    FX_BOOL bExternal = pFont->GetFace() == NULL;\n    void* face = bExternal ? pFont->GetSubstFont()->m_ExtHandle : pFont->GetFace();\n    CFX_FTCacheMap& map =  bExternal ? m_ExtFaceMap : m_FTFaceMap;\n    CFX_CountedFaceCache* counted_face_cache = NULL;\n    if (map.Lookup((FXFT_Face)face, counted_face_cache)) {\n        counted_face_cache->m_nCount++;\n        return counted_face_cache->m_Obj;\n    }\n    CFX_FaceCache* face_cache = NULL;\n    face_cache = FX_NEW CFX_FaceCache(bExternal ? NULL : (FXFT_Face)face);\n    if (face_cache == NULL)\t{\n        return NULL;\n    }\n    counted_face_cache = FX_NEW CFX_CountedFaceCache;\n    if (!counted_face_cache) {\n        if (face_cache) {\n            delete face_cache;\n            face_cache = NULL;\n        }\n        return NULL;\n    }\n    counted_face_cache->m_nCount = 2;\n    counted_face_cache->m_Obj = face_cache;\n    map.SetAt((FXFT_Face)face, counted_face_cache);\n    return face_cache;\n}\nvoid CFX_FontCache::ReleaseCachedFace(CFX_Font* pFont)\n{\n    FX_BOOL bExternal = pFont->GetFace() == NULL;\n    void* face = bExternal ? pFont->GetSubstFont()->m_ExtHandle : pFont->GetFace();\n    CFX_FTCacheMap& map =  bExternal ? m_ExtFaceMap : m_FTFaceMap;\n    CFX_CountedFaceCache* counted_face_cache = NULL;\n    if (!map.Lookup((FXFT_Face)face, counted_face_cache)) {\n        return;\n    }\n    if (counted_face_cache->m_nCount > 1) {\n        counted_face_cache->m_nCount--;\n    }\n}\nvoid CFX_FontCache::FreeCache(FX_BOOL bRelease)\n{\n    {\n        FX_POSITION pos;\n        pos = m_FTFaceMap.GetStartPosition();\n        while (pos) {\n            FXFT_Face face;\n            CFX_CountedFaceCache* cache;\n            m_FTFaceMap.GetNextAssoc(pos, face, cache);\n            if (bRelease || cache->m_nCount < 2) {\n                delete cache->m_Obj;\n                delete cache;\n                m_FTFaceMap.RemoveKey(face);\n            }\n        }\n        pos = m_ExtFaceMap.GetStartPosition();\n        while (pos) {\n            FXFT_Face face;\n            CFX_CountedFaceCache* cache;\n            m_ExtFaceMap.GetNextAssoc(pos, face, cache);\n            if (bRelease || cache->m_nCount < 2) {\n                delete cache->m_Obj;\n                delete cache;\n                m_ExtFaceMap.RemoveKey(face);\n            }\n        }\n    }\n}\nCFX_FaceCache::CFX_FaceCache(FXFT_Face face)\n{\n    m_Face = face;\n    m_pBitmap = NULL;\n}\nCFX_FaceCache::~CFX_FaceCache()\n{\n    FX_POSITION pos = m_SizeMap.GetStartPosition();\n    CFX_ByteString Key;\n    CFX_SizeGlyphCache* pSizeCache = NULL;\n    while(pos) {\n        m_SizeMap.GetNextAssoc( pos, Key, (void*&)pSizeCache);\n        delete pSizeCache;\n    }\n    m_SizeMap.RemoveAll();\n    pos = m_PathMap.GetStartPosition();\n    FX_LPVOID key1;\n    CFX_PathData* pPath;\n    while (pos) {\n        m_PathMap.GetNextAssoc(pos, key1, (FX_LPVOID&)pPath);\n        delete pPath;\n    }\n    if (m_pBitmap) {\n        delete m_pBitmap;\n    }\n    m_PathMap.RemoveAll();\n}\n#if ((_FXM_PLATFORM_  != _FXM_PLATFORM_APPLE_)|| defined(_FPDFAPI_MINI_))\nvoid CFX_FaceCache::InitPlatform()\n{\n}\n#endif\nCFX_GlyphBitmap* CFX_FaceCache::LookUpGlyphBitmap(CFX_Font* pFont, const CFX_AffineMatrix* pMatrix,\n        CFX_ByteStringC& FaceGlyphsKey, FX_DWORD glyph_index, FX_BOOL bFontStyle,\n        int dest_width, int anti_alias)\n{\n    CFX_SizeGlyphCache* pSizeCache = NULL;\n    if (!m_SizeMap.Lookup(FaceGlyphsKey, (void*&)pSizeCache)) {\n        pSizeCache = FX_NEW CFX_SizeGlyphCache;\n        if (pSizeCache == NULL)\t{\n            return NULL;\n        }\n        m_SizeMap.SetAt(FaceGlyphsKey, pSizeCache);\n    }\n    CFX_GlyphBitmap* pGlyphBitmap = NULL;\n    if (pSizeCache->m_GlyphMap.Lookup((FX_LPVOID)(FX_UINTPTR)glyph_index, (void*&)pGlyphBitmap)) {\n        return pGlyphBitmap;\n    }\n    pGlyphBitmap = RenderGlyph(pFont, glyph_index, bFontStyle, pMatrix, dest_width, anti_alias);\n    if (pGlyphBitmap == NULL)\t{\n        return NULL;\n    }\n    pSizeCache->m_GlyphMap.SetAt((FX_LPVOID)(FX_UINTPTR)glyph_index, pGlyphBitmap);\n    return pGlyphBitmap;\n}\nconst CFX_GlyphBitmap* CFX_FaceCache::LoadGlyphBitmap(CFX_Font* pFont, FX_DWORD glyph_index, FX_BOOL bFontStyle, const CFX_AffineMatrix* pMatrix,\n        int dest_width, int anti_alias, int& text_flags)\n{\n    if (glyph_index == (FX_DWORD) - 1) {\n        return NULL;\n    }\n    _CFX_UniqueKeyGen keygen;\n#if ((_FXM_PLATFORM_  != _FXM_PLATFORM_APPLE_)|| defined(_FPDFAPI_MINI_))\n    if (pFont->GetSubstFont())\n        keygen.Generate(9, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),\n                        (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,\n                        pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical());\n    else\n        keygen.Generate(6, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),\n                        (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias);\n#else\n    if (text_flags & FXTEXT_NO_NATIVETEXT) {\n        if (pFont->GetSubstFont())\n            keygen.Generate(9, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),\n                            (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,\n                            pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical());\n        else\n            keygen.Generate(6, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),\n                            (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias);\n    } else {\n        if (pFont->GetSubstFont())\n            keygen.Generate(10, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),\n                            (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,\n                            pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical(), 3);\n        else\n            keygen.Generate(7, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),\n                            (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias, 3);\n    }\n#endif\n    CFX_ByteStringC FaceGlyphsKey(keygen.m_Key, keygen.m_KeyLen);\n#if ((_FXM_PLATFORM_  != _FXM_PLATFORM_APPLE_)|| defined(_FPDFAPI_MINI_))\n    return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey, glyph_index, bFontStyle, dest_width, anti_alias);\n#else\n    if (text_flags & FXTEXT_NO_NATIVETEXT) {\n        return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey, glyph_index, bFontStyle, dest_width, anti_alias);\n    } else {\n        CFX_GlyphBitmap* pGlyphBitmap;\n        CFX_SizeGlyphCache* pSizeCache = NULL;\n        if (m_SizeMap.Lookup(FaceGlyphsKey, (void*&)pSizeCache)) {\n            if (pSizeCache->m_GlyphMap.Lookup((FX_LPVOID)(FX_UINTPTR)glyph_index, (void*&)pGlyphBitmap)) {\n                return pGlyphBitmap;\n            }\n            pGlyphBitmap = RenderGlyph_Nativetext(pFont, glyph_index, pMatrix, dest_width, anti_alias);\n            if (pGlyphBitmap) {\n                pSizeCache->m_GlyphMap.SetAt((FX_LPVOID)(FX_UINTPTR)glyph_index, pGlyphBitmap);\n                return pGlyphBitmap;\n            }\n        } else {\n            pGlyphBitmap = RenderGlyph_Nativetext(pFont, glyph_index, pMatrix, dest_width, anti_alias);\n            if (pGlyphBitmap) {\n                pSizeCache = FX_NEW CFX_SizeGlyphCache;\n                if (pSizeCache == NULL)\t{\n                    return NULL;\n                }\n                m_SizeMap.SetAt(FaceGlyphsKey, pSizeCache);\n                pSizeCache->m_GlyphMap.SetAt((FX_LPVOID)(FX_UINTPTR)glyph_index, pGlyphBitmap);\n                return pGlyphBitmap;\n            }\n        }\n        if (pFont->GetSubstFont())\n            keygen.Generate(9, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),\n                            (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,\n                            pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical());\n        else\n            keygen.Generate(6, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),\n                            (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias);\n        CFX_ByteStringC FaceGlyphsKey(keygen.m_Key, keygen.m_KeyLen);\n        text_flags |= FXTEXT_NO_NATIVETEXT;\n        return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey, glyph_index, bFontStyle, dest_width, anti_alias);\n    }\n#endif\n}\nCFX_SizeGlyphCache::~CFX_SizeGlyphCache()\n{\n    FX_POSITION pos = m_GlyphMap.GetStartPosition();\n    FX_LPVOID Key;\n    CFX_GlyphBitmap* pGlyphBitmap = NULL;\n    while(pos) {\n        m_GlyphMap.GetNextAssoc(pos, Key, (void*&)pGlyphBitmap);\n        delete pGlyphBitmap;\n    }\n    m_GlyphMap.RemoveAll();\n}\n#if defined(_FPDFAPI_MINI_)\n#define CONTRAST_RAMP_STEP\t16\n#else\n#define CONTRAST_RAMP_STEP\t1\n#endif\nstatic const FX_BYTE g_adjust_contrast11[256] = {\n    0, 0, 2, 3, 4, 5, 6, 8, 9, 10, 11, 13, 14, 15, 17, 18, 19, 21, 22, 24, 25, 26, 28, 29, 31,\n    32, 33, 35, 36, 38, 39, 40, 42, 43, 45, 46, 48, 49, 51, 52, 54, 55, 56, 58, 59, 61, 62, 64, 65,\n    67, 68, 70, 71, 72, 74, 75, 77, 78, 80, 81, 83, 84, 86, 87, 89, 90, 91, 93, 94, 96, 97, 99, 100,\n    101, 103, 104, 106, 107, 109, 110, 111, 113, 114, 116, 117, 118, 120, 121, 123, 124, 125, 127,\n    128, 130, 131, 132, 134, 135, 136, 138, 139, 140, 142, 143, 144, 146, 147, 148, 149, 151, 152,\n    153, 155, 156, 157, 158, 160, 161, 162, 163, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175,\n    177, 178, 179, 180, 181, 182, 183, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196,\n    197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215,\n    215, 216, 217, 218, 219, 220, 221, 221, 222, 223, 224, 224, 225, 226, 227, 227, 228, 229, 230,\n    230, 231, 232, 232, 233, 234, 234, 235, 236, 236, 237, 237, 238, 239, 239, 240, 240, 241, 241,\n    242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 246, 247, 247, 248, 248, 248, 249, 249, 249,\n    250, 250, 250, 251, 251, 251, 251, 252, 252, 252, 252, 253, 253, 253, 253, 253, 253, 254, 254,\n    254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 255,\n};\nstatic const FX_BYTE g_adjust_contrast15[256] = {\n    0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,\n    22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 40, 41, 42, 43, 45, 46, 47, 48, 50, 51,\n    52, 54, 55, 56, 58, 59, 60, 62, 63, 64, 66, 67, 68, 70, 71, 73, 74, 75, 77, 78, 80, 81, 82, 84, 85, 87,\n    88, 90, 91, 93, 94, 95, 97, 98, 100, 101, 103, 104, 106, 107, 109, 110, 111, 113, 114, 116, 117, 119,\n    120, 122, 123, 125, 126, 128, 129, 130, 132, 133, 135, 136, 138, 139, 141, 142, 143, 145, 146, 148,\n    149, 150, 152, 153, 155, 156, 157, 159, 160, 161, 163, 164, 166, 167, 168, 170, 171, 172, 174, 175,\n    176, 177, 179, 180, 181, 183, 184, 185, 186, 188, 189, 190, 191, 192, 194, 195, 196, 197, 198, 199,\n    201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220,\n    221, 222, 223, 224, 225, 226, 227, 227, 228, 229, 230, 231, 232, 232, 233, 234, 235, 235, 236, 237,\n    237, 238, 239, 239, 240, 241, 241, 242, 242, 243, 244, 244, 245, 245, 246, 246, 247, 247, 248, 248,\n    248, 249, 249, 250, 250, 250, 251, 251, 251, 252, 252, 252, 252, 253, 253, 253, 253, 253, 254, 254,\n    254, 254, 254, 254, 254, 254, 254, 254, 254, 255,\n};\nstatic void _CalcContrastRamp(FX_LPBYTE ramp, int level)\n{\n    int contrast_min = 0, contrast_max = 255 - level, i;\n    for (i = 0; i < contrast_min; i ++) {\n        ramp[i] = 0;\n    }\n    for (i = contrast_min; i < contrast_max; i ++) {\n        ramp[i] = 255 * (i - contrast_min) / (contrast_max - contrast_min);\n    }\n    for (i = contrast_max; i < 256; i ++) {\n        ramp[i] = 255;\n    }\n}\nvoid CFX_Font::AdjustMMParams(int glyph_index, int dest_width, int weight)\n{\n    FXFT_MM_Var pMasters = NULL;\n    FXFT_Get_MM_Var(m_Face, &pMasters);\n    if (pMasters == NULL) {\n        return;\n    }\n    long coords[2];\n    if (weight == 0) {\n        coords[0] = FXFT_Get_MM_Axis_Def(FXFT_Get_MM_Axis(pMasters, 0)) / 65536;\n    } else {\n        coords[0] = weight;\n    }\n    if (dest_width == 0) {\n        coords[1] = FXFT_Get_MM_Axis_Def(FXFT_Get_MM_Axis(pMasters, 1)) / 65536;\n    } else {\n        int min_param = FXFT_Get_MM_Axis_Min(FXFT_Get_MM_Axis(pMasters, 1)) / 65536;\n        int max_param = FXFT_Get_MM_Axis_Max(FXFT_Get_MM_Axis(pMasters, 1)) / 65536;\n        coords[1] = min_param;\n        int error = FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords);\n        error = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);\n        int min_width = FXFT_Get_Glyph_HoriAdvance(m_Face) * 1000 / FXFT_Get_Face_UnitsPerEM(m_Face);\n        coords[1] = max_param;\n        error = FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords);\n        error = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);\n        int max_width = FXFT_Get_Glyph_HoriAdvance(m_Face) * 1000 / FXFT_Get_Face_UnitsPerEM(m_Face);\n        if (max_width == min_width) {\n            return;\n        }\n        int param = min_param + (max_param - min_param) * (dest_width - min_width) / (max_width - min_width);\n        coords[1] = param;\n    }\n    FXFT_Free(m_Face, pMasters);\n    FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords);\n}\nextern const char g_AngleSkew[30] = {\n    0, 2, 3, 5, 7, 9, 11, 12, 14, 16,\n    18, 19, 21, 23, 25, 27, 29, 31, 32, 34,\n    36, 38, 40, 42, 45, 47, 49, 51, 53, 55,\n};\nstatic const FX_BYTE g_WeightPow[100] = {\n    0, 3, 6, 7, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20,\n    21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 35, 36, 36,\n    37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42,\n    42, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47,\n    47, 47, 48, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 50, 51, 51,\n    51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53,\n};\nextern const FX_BYTE g_WeightPow_11[100] = {\n    0, 4, 7, 8, 9, 10, 12, 13, 15, 17, 18, 19, 20, 21, 22,\n    23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 39, 40, 40,\n    41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 46,\n    46, 43, 47, 47, 48, 48, 48, 48, 45, 50, 50, 50, 46, 51, 51, 51, 52, 52,\n    52, 52, 53, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56,\n    56, 56, 56, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58,\n};\nextern const FX_BYTE g_WeightPow_SHIFTJIS[100] = {\n    0, 0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 21, 22, 24, 26, 28,\n    30, 32, 33, 35, 37, 39, 41, 43, 45, 48, 48, 48, 48, 49, 49, 49, 50, 50, 50, 50,\n    51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 55, 55,\n    55, 55, 55, 56, 56, 56, 56, 56 , 56, 57, 57, 57 , 57 , 57, 57, 57, 58, 58, 58, 58, 58,\n    58, 58, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60,\n};\nstatic void _GammaAdjust(FX_LPBYTE pData, int nWid, int nHei, int src_pitch, FX_LPCBYTE gammaTable)\n{\n    int count = nHei * src_pitch;\n    for(int i = 0; i < count; i++) {\n        pData[i] = gammaTable[pData[i]];\n    }\n}\nstatic void _ContrastAdjust(FX_LPBYTE pDataIn, FX_LPBYTE pDataOut, int nWid, int nHei, int nSrcRowBytes, int nDstRowBytes)\n{\n    int col, row, temp;\n    int max = 0, min = 255;\n    FX_FLOAT rate;\n    for (row = 0; row < nHei; row ++) {\n        FX_LPBYTE pRow = pDataIn + row * nSrcRowBytes;\n        for (col = 0; col < nWid; col++) {\n            temp = *pRow ++;\n            if (temp > max) {\n                max = temp;\n            }\n            if (temp < min) {\n                min = temp;\n            }\n        }\n    }\n    temp = max - min;\n    if (0 == temp || 255 == temp) {\n        int rowbytes = FXSYS_abs(nSrcRowBytes) > nDstRowBytes ? nDstRowBytes : FXSYS_abs(nSrcRowBytes);\n        for (row = 0; row < nHei; row ++) {\n            FXSYS_memcpy32(pDataOut + row * nDstRowBytes, pDataIn + row * nSrcRowBytes, rowbytes);\n        }\n        return;\n    }\n    rate = 255.f / temp;\n    for (row = 0; row < nHei; row ++) {\n        FX_LPBYTE pSrcRow = pDataIn + row * nSrcRowBytes;\n        FX_LPBYTE pDstRow = pDataOut + row * nDstRowBytes;\n        for (col = 0; col < nWid; col ++) {\n            temp = (int)((*(pSrcRow++) - min) * rate + 0.5);\n            if (temp > 255)\t{\n                temp = 255;\n            } else if (temp < 0) {\n                temp = 0;\n            }\n            *pDstRow ++ = (FX_BYTE)temp;\n        }\n    }\n}\nCFX_GlyphBitmap* CFX_FaceCache::RenderGlyph(CFX_Font* pFont, FX_DWORD glyph_index, FX_BOOL bFontStyle,\n        const CFX_AffineMatrix* pMatrix, int dest_width, int anti_alias)\n{\n    if (m_Face == NULL) {\n        return NULL;\n    }\n    FXFT_Matrix  ft_matrix;\n    ft_matrix.xx = (signed long)(pMatrix->GetA() / 64 * 65536);\n    ft_matrix.xy = (signed long)(pMatrix->GetC() / 64 * 65536);\n    ft_matrix.yx = (signed long)(pMatrix->GetB() / 64 * 65536);\n    ft_matrix.yy = (signed long)(pMatrix->GetD() / 64 * 65536);\n    FX_BOOL bUseCJKSubFont = FALSE;\n    const CFX_SubstFont* pSubstFont = pFont->GetSubstFont();\n    if (pSubstFont) {\n        bUseCJKSubFont = pSubstFont->m_bSubstOfCJK && bFontStyle;\n        int skew = 0;\n        if (bUseCJKSubFont) {\n            skew = pSubstFont->m_bItlicCJK ? -15 : 0;\n        } else {\n            skew = pSubstFont->m_ItalicAngle;\n        }\n        if (skew) {\n            skew = skew <= -30 ? -58 : -g_AngleSkew[-skew];\n            if (pFont->IsVertical()) {\n                ft_matrix.yx += ft_matrix.yy * skew / 100;\n            } else {\n                ft_matrix.xy += -ft_matrix.xx * skew / 100;\n            }\n        }\n        if (pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) {\n            pFont->AdjustMMParams(glyph_index, dest_width, pFont->GetSubstFont()->m_Weight);\n        }\n    }\n    int transflag = FXFT_Get_Face_Internal_Flag(m_Face);\n    FXFT_Set_Transform(m_Face, &ft_matrix, 0);\n    int load_flags = (m_Face->face_flags & FT_FACE_FLAG_SFNT) ? FXFT_LOAD_NO_BITMAP : (FXFT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING);\n    int error = FXFT_Load_Glyph(m_Face, glyph_index, load_flags);\n    if (error) {\n        FXFT_Set_Face_Internal_Flag(m_Face, transflag);\n        return NULL;\n    }\n    int weight = 0;\n    if (bUseCJKSubFont) {\n        weight = pSubstFont->m_WeightCJK;\n    } else {\n        weight = pSubstFont ? pSubstFont->m_Weight : 0;\n    }\n    if (pSubstFont && !(pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) && weight > 400) {\n        int index = (weight - 400) / 10;\n        if (index >= 100) {\n            FXFT_Set_Face_Internal_Flag(m_Face, transflag);\n            return NULL;\n        }\n        int level = 0;\n        if (pSubstFont->m_Charset == FXFONT_SHIFTJIS_CHARSET) {\n            level = g_WeightPow_SHIFTJIS[index] * 2 * (FXSYS_abs((int)(ft_matrix.xx)) + FXSYS_abs((int)(ft_matrix.xy))) / 36655;\n        } else {\n            level = g_WeightPow_11[index] * (FXSYS_abs((int)(ft_matrix.xx)) + FXSYS_abs((int)(ft_matrix.xy))) / 36655;\n        }\n        FXFT_Outline_Embolden(FXFT_Get_Glyph_Outline(m_Face), level);\n    }\n    FXFT_Library_SetLcdFilter(CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary, FT_LCD_FILTER_DEFAULT);\n    error = FXFT_Render_Glyph(m_Face, anti_alias);\n    if (error) {\n        FXFT_Set_Face_Internal_Flag(m_Face, transflag);\n        return NULL;\n    }\n    int bmwidth = FXFT_Get_Bitmap_Width(FXFT_Get_Glyph_Bitmap(m_Face));\n    int bmheight = FXFT_Get_Bitmap_Rows(FXFT_Get_Glyph_Bitmap(m_Face));\n    if (bmwidth > 2048 || bmheight > 2048) {\n        FXFT_Set_Face_Internal_Flag(m_Face, transflag);\n        return NULL;\n    }\n    int dib_width = bmwidth;\n    CFX_GlyphBitmap* pGlyphBitmap = FX_NEW CFX_GlyphBitmap;\n    if (!pGlyphBitmap) {\n        return NULL;\n    }\n    pGlyphBitmap->m_Bitmap.Create(dib_width, bmheight,\n                                  anti_alias == FXFT_RENDER_MODE_MONO ? FXDIB_1bppMask : FXDIB_8bppMask);\n    pGlyphBitmap->m_Left = FXFT_Get_Glyph_BitmapLeft(m_Face);\n    pGlyphBitmap->m_Top = FXFT_Get_Glyph_BitmapTop(m_Face);\n    int dest_pitch = pGlyphBitmap->m_Bitmap.GetPitch();\n    int src_pitch = FXFT_Get_Bitmap_Pitch(FXFT_Get_Glyph_Bitmap(m_Face));\n    FX_BYTE* pDestBuf = pGlyphBitmap->m_Bitmap.GetBuffer();\n    FX_BYTE* pSrcBuf = (FX_BYTE*)FXFT_Get_Bitmap_Buffer(FXFT_Get_Glyph_Bitmap(m_Face));\n    if (anti_alias != FXFT_RENDER_MODE_MONO && FXFT_Get_Bitmap_PixelMode(FXFT_Get_Glyph_Bitmap(m_Face)) == FXFT_PIXEL_MODE_MONO) {\n        int bytes = anti_alias == FXFT_RENDER_MODE_LCD ? 3 : 1;\n        for(int i = 0; i < bmheight; i++)\n            for(int n = 0; n < bmwidth; n++) {\n                FX_BYTE data = (pSrcBuf[i * src_pitch + n / 8] & (0x80 >> (n % 8))) ? 255 : 0;\n                for (int b = 0; b < bytes; b ++) {\n                    pDestBuf[i * dest_pitch + n * bytes + b] = data;\n                }\n            }\n    } else {\n        FXSYS_memset32(pDestBuf, 0, dest_pitch * bmheight);\n        if (anti_alias == FXFT_RENDER_MODE_MONO && FXFT_Get_Bitmap_PixelMode(FXFT_Get_Glyph_Bitmap(m_Face)) == FXFT_PIXEL_MODE_MONO) {\n            int rowbytes = FXSYS_abs(src_pitch) > dest_pitch ? dest_pitch : FXSYS_abs(src_pitch);\n            for (int row = 0; row < bmheight; row ++) {\n                FXSYS_memcpy32(pDestBuf + row * dest_pitch, pSrcBuf + row * src_pitch, rowbytes);\n            }\n        } else {\n            _ContrastAdjust(pSrcBuf, pDestBuf, bmwidth, bmheight, src_pitch, dest_pitch);\n            _GammaAdjust(pDestBuf, bmwidth, bmheight, dest_pitch, CFX_GEModule::Get()->GetTextGammaTable());\n        }\n    }\n    FXFT_Set_Face_Internal_Flag(m_Face, transflag);\n    return pGlyphBitmap;\n}\nFX_BOOL _OutputGlyph(void* dib, int x, int y, CFX_Font* pFont,\n                     int glyph_index, FX_ARGB argb)\n{\n    CFX_DIBitmap* pDib = (CFX_DIBitmap*)dib;\n    FXFT_Face face = pFont->GetFace();\n    int error = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_NO_BITMAP);\n    if (error) {\n        return FALSE;\n    }\n    error = FXFT_Render_Glyph(face, FXFT_RENDER_MODE_NORMAL);\n    if (error) {\n        return FALSE;\n    }\n    int bmwidth = FXFT_Get_Bitmap_Width(FXFT_Get_Glyph_Bitmap(face));\n    int bmheight = FXFT_Get_Bitmap_Rows(FXFT_Get_Glyph_Bitmap(face));\n    int left = FXFT_Get_Glyph_BitmapLeft(face);\n    int top = FXFT_Get_Glyph_BitmapTop(face);\n    FX_LPCBYTE src_buf = (FX_LPCBYTE)FXFT_Get_Bitmap_Buffer(FXFT_Get_Glyph_Bitmap(face));\n    int src_pitch = FXFT_Get_Bitmap_Pitch(FXFT_Get_Glyph_Bitmap(face));\n    CFX_DIBitmap mask;\n    mask.Create(bmwidth, bmheight, FXDIB_8bppMask);\n    FX_LPBYTE dest_buf = mask.GetBuffer();\n    int dest_pitch = mask.GetPitch();\n    for (int row = 0; row < bmheight; row ++) {\n        FX_LPCBYTE src_scan = src_buf + row * src_pitch;\n        FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;\n        FXSYS_memcpy32(dest_scan, src_scan, dest_pitch);\n    }\n    pDib->CompositeMask(x + left, y - top, bmwidth, bmheight, &mask, argb, 0, 0);\n    return TRUE;\n}\nFX_BOOL OutputText(void* dib, int x, int y, CFX_Font* pFont, double font_size,\n                   CFX_AffineMatrix* pText_matrix, unsigned short const* text, unsigned long argb)\n{\n    if (!pFont) {\n        return FALSE;\n    }\n    FXFT_Face face = pFont->GetFace();\n    FXFT_Select_Charmap(pFont->m_Face, FXFT_ENCODING_UNICODE);\n    int transflag = FXFT_Get_Face_Internal_Flag(pFont->m_Face);\n    if (pText_matrix) {\n        FXFT_Matrix  ft_matrix;\n        ft_matrix.xx = (signed long)(pText_matrix->a / 64 * 65536);\n        ft_matrix.xy = (signed long)(pText_matrix->c / 64 * 65536);\n        ft_matrix.yx = (signed long)(pText_matrix->b / 64 * 65536);\n        ft_matrix.yy = (signed long)(pText_matrix->d / 64 * 65536);\n        FXFT_Set_Transform(face, &ft_matrix, 0);\n    }\n    FX_FLOAT x_pos = 0;\n    for (; *text != 0; text ++) {\n        FX_WCHAR unicode = *text;\n        int glyph_index = FXFT_Get_Char_Index(pFont->m_Face, unicode);\n        if (glyph_index <= 0) {\n            continue;\n        }\n        int err = FXFT_Load_Glyph(pFont->m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);\n        if (err) {\n            continue;\n        }\n        int w = FXFT_Get_Glyph_HoriAdvance(pFont->m_Face);\n        int em = FXFT_Get_Face_UnitsPerEM(pFont->m_Face);\n        FX_FLOAT x1, y1;\n        pText_matrix->Transform(x_pos, 0, x1, y1);\n        _OutputGlyph(dib, (int)x1 + x, (int) - y1 + y, pFont,\n                     glyph_index, argb);\n        x_pos += (FX_FLOAT)w / em;\n    }\n    FXFT_Set_Face_Internal_Flag(pFont->m_Face, transflag);\n    return TRUE;\n}\nFX_BOOL OutputGlyph(void* dib, int x, int y, CFX_Font* pFont, double font_size,\n                    CFX_AffineMatrix* pMatrix, unsigned long glyph_index, unsigned long argb)\n{\n    FXFT_Matrix  ft_matrix;\n    if (pMatrix) {\n        ft_matrix.xx = (signed long)(pMatrix->a * font_size / 64 * 65536);\n        ft_matrix.xy = (signed long)(pMatrix->c * font_size / 64 * 65536);\n        ft_matrix.yx = (signed long)(pMatrix->b * font_size / 64 * 65536);\n        ft_matrix.yy = (signed long)(pMatrix->d * font_size / 64 * 65536);\n    } else {\n        ft_matrix.xx = (signed long)(font_size / 64 * 65536);\n        ft_matrix.xy = ft_matrix.yx = 0;\n        ft_matrix.yy = (signed long)(font_size / 64 * 65536);\n    }\n    int transflag = FXFT_Get_Face_Internal_Flag(pFont->m_Face);\n    FXFT_Set_Transform(pFont->m_Face, &ft_matrix, 0);\n    FX_BOOL ret = _OutputGlyph(dib, x, y, pFont,\n                               glyph_index, argb);\n    FXFT_Set_Face_Internal_Flag(pFont->m_Face, transflag);\n    return ret;\n}\nconst CFX_PathData* CFX_FaceCache::LoadGlyphPath(CFX_Font* pFont, FX_DWORD glyph_index, int dest_width)\n{\n    if (m_Face == NULL || glyph_index == (FX_DWORD) - 1) {\n        return NULL;\n    }\n    CFX_PathData* pGlyphPath = NULL;\n    FX_LPVOID key;\n    if (pFont->GetSubstFont())\n        key = (FX_LPVOID)(FX_UINTPTR)(glyph_index + ((pFont->GetSubstFont()->m_Weight / 16) << 15) +\n                                      ((pFont->GetSubstFont()->m_ItalicAngle / 2) << 21) + ((dest_width / 16) << 25) +\n                                      (pFont->IsVertical() << 31));\n    else {\n        key = (FX_LPVOID)(FX_UINTPTR)glyph_index;\n    }\n    if (m_PathMap.Lookup(key, (FX_LPVOID&)pGlyphPath)) {\n        return pGlyphPath;\n    }\n    pGlyphPath = pFont->LoadGlyphPath(glyph_index, dest_width);\n    m_PathMap.SetAt(key, pGlyphPath);\n    return pGlyphPath;\n}\ntypedef struct {\n    FX_BOOL\t\t\tm_bCount;\n    int\t\t\t\tm_PointCount;\n    FX_PATHPOINT*\tm_pPoints;\n    int\t\t\t\tm_CurX;\n    int\t\t\t\tm_CurY;\n    FX_FLOAT\t\tm_CoordUnit;\n} OUTLINE_PARAMS;\nvoid _Outline_CheckEmptyContour(OUTLINE_PARAMS* param)\n{\n    if (param->m_PointCount >= 2 && param->m_pPoints[param->m_PointCount - 2].m_Flag == FXPT_MOVETO &&\n            param->m_pPoints[param->m_PointCount - 2].m_PointX == param->m_pPoints[param->m_PointCount - 1].m_PointX &&\n            param->m_pPoints[param->m_PointCount - 2].m_PointY == param->m_pPoints[param->m_PointCount - 1].m_PointY) {\n        param->m_PointCount -= 2;\n    }\n    if (param->m_PointCount >= 4 && param->m_pPoints[param->m_PointCount - 4].m_Flag == FXPT_MOVETO &&\n            param->m_pPoints[param->m_PointCount - 3].m_Flag == FXPT_BEZIERTO &&\n            param->m_pPoints[param->m_PointCount - 3].m_PointX == param->m_pPoints[param->m_PointCount - 4].m_PointX &&\n            param->m_pPoints[param->m_PointCount - 3].m_PointY == param->m_pPoints[param->m_PointCount - 4].m_PointY &&\n            param->m_pPoints[param->m_PointCount - 2].m_PointX == param->m_pPoints[param->m_PointCount - 4].m_PointX &&\n            param->m_pPoints[param->m_PointCount - 2].m_PointY == param->m_pPoints[param->m_PointCount - 4].m_PointY &&\n            param->m_pPoints[param->m_PointCount - 1].m_PointX == param->m_pPoints[param->m_PointCount - 4].m_PointX &&\n            param->m_pPoints[param->m_PointCount - 1].m_PointY == param->m_pPoints[param->m_PointCount - 4].m_PointY) {\n        param->m_PointCount -= 4;\n    }\n}\nextern \"C\" {\n    static int _Outline_MoveTo(const FXFT_Vector* to, void* user)\n    {\n        OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;\n        if (!param->m_bCount) {\n            _Outline_CheckEmptyContour(param);\n            param->m_pPoints[param->m_PointCount].m_PointX = to->x / param->m_CoordUnit;\n            param->m_pPoints[param->m_PointCount].m_PointY = to->y / param->m_CoordUnit;\n            param->m_pPoints[param->m_PointCount].m_Flag = FXPT_MOVETO;\n            param->m_CurX = to->x;\n            param->m_CurY = to->y;\n            if (param->m_PointCount) {\n                param->m_pPoints[param->m_PointCount - 1].m_Flag |= FXPT_CLOSEFIGURE;\n            }\n        }\n        param->m_PointCount ++;\n        return 0;\n    }\n};\nextern \"C\" {\n    static int _Outline_LineTo(const FXFT_Vector* to, void* user)\n    {\n        OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;\n        if (!param->m_bCount) {\n            param->m_pPoints[param->m_PointCount].m_PointX = to->x / param->m_CoordUnit;\n            param->m_pPoints[param->m_PointCount].m_PointY = to->y / param->m_CoordUnit;\n            param->m_pPoints[param->m_PointCount].m_Flag = FXPT_LINETO;\n            param->m_CurX = to->x;\n            param->m_CurY = to->y;\n        }\n        param->m_PointCount ++;\n        return 0;\n    }\n};\nextern \"C\" {\n    static int _Outline_ConicTo(const FXFT_Vector* control, const FXFT_Vector* to, void* user)\n    {\n        OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;\n        if (!param->m_bCount) {\n            param->m_pPoints[param->m_PointCount].m_PointX = (param->m_CurX + (control->x - param->m_CurX) * 2 / 3) / param->m_CoordUnit;\n            param->m_pPoints[param->m_PointCount].m_PointY = (param->m_CurY + (control->y - param->m_CurY) * 2 / 3) / param->m_CoordUnit;\n            param->m_pPoints[param->m_PointCount].m_Flag = FXPT_BEZIERTO;\n            param->m_pPoints[param->m_PointCount + 1].m_PointX = (control->x + (to->x - control->x) / 3) / param->m_CoordUnit;\n            param->m_pPoints[param->m_PointCount + 1].m_PointY = (control->y + (to->y - control->y) / 3) / param->m_CoordUnit;\n            param->m_pPoints[param->m_PointCount + 1].m_Flag = FXPT_BEZIERTO;\n            param->m_pPoints[param->m_PointCount + 2].m_PointX = to->x / param->m_CoordUnit;\n            param->m_pPoints[param->m_PointCount + 2].m_PointY = to->y / param->m_CoordUnit;\n            param->m_pPoints[param->m_PointCount + 2].m_Flag = FXPT_BEZIERTO;\n            param->m_CurX = to->x;\n            param->m_CurY = to->y;\n        }\n        param->m_PointCount += 3;\n        return 0;\n    }\n};\nextern \"C\" {\n    static int _Outline_CubicTo(const FXFT_Vector* control1, const FXFT_Vector* control2, const FXFT_Vector* to, void* user)\n    {\n        OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;\n        if (!param->m_bCount) {\n            param->m_pPoints[param->m_PointCount].m_PointX = control1->x / param->m_CoordUnit;\n            param->m_pPoints[param->m_PointCount].m_PointY = control1->y / param->m_CoordUnit;\n            param->m_pPoints[param->m_PointCount].m_Flag = FXPT_BEZIERTO;\n            param->m_pPoints[param->m_PointCount + 1].m_PointX = control2->x / param->m_CoordUnit;\n            param->m_pPoints[param->m_PointCount + 1].m_PointY = control2->y / param->m_CoordUnit;\n            param->m_pPoints[param->m_PointCount + 1].m_Flag = FXPT_BEZIERTO;\n            param->m_pPoints[param->m_PointCount + 2].m_PointX = to->x / param->m_CoordUnit;\n            param->m_pPoints[param->m_PointCount + 2].m_PointY = to->y / param->m_CoordUnit;\n            param->m_pPoints[param->m_PointCount + 2].m_Flag = FXPT_BEZIERTO;\n            param->m_CurX = to->x;\n            param->m_CurY = to->y;\n        }\n        param->m_PointCount += 3;\n        return 0;\n    }\n};\nCFX_PathData* CFX_Font::LoadGlyphPath(FX_DWORD glyph_index, int dest_width)\n{\n    if (m_Face == NULL) {\n        return NULL;\n    }\n    FXFT_Set_Pixel_Sizes(m_Face, 0, 64);\n    FXFT_Matrix  ft_matrix = {65536, 0, 0, 65536};\n    if (m_pSubstFont) {\n        if (m_pSubstFont->m_ItalicAngle) {\n            int skew = m_pSubstFont->m_ItalicAngle;\n            skew = skew <= -30 ? -58 : -g_AngleSkew[-skew];\n            if (m_bVertical) {\n                ft_matrix.yx += ft_matrix.yy * skew / 100;\n            } else {\n                ft_matrix.xy += -ft_matrix.xx * skew / 100;\n            }\n        }\n        if (m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) {\n            AdjustMMParams(glyph_index, dest_width, m_pSubstFont->m_Weight);\n        }\n    }\n    int transflag = FXFT_Get_Face_Internal_Flag(m_Face);\n    FXFT_Set_Transform(m_Face, &ft_matrix, 0);\n    int load_flags = (m_Face->face_flags & FT_FACE_FLAG_SFNT) ? FXFT_LOAD_NO_BITMAP : FXFT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING;\n    int error = FXFT_Load_Glyph(m_Face, glyph_index, load_flags);\n    if (error) {\n        FXFT_Set_Face_Internal_Flag(m_Face, transflag);\n        return NULL;\n    }\n    if (m_pSubstFont && !(m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) && m_pSubstFont->m_Weight > 400) {\n        int level = 0;\n        if (m_pSubstFont->m_Charset == FXFONT_SHIFTJIS_CHARSET) {\n            level = g_WeightPow_SHIFTJIS[(m_pSubstFont->m_Weight - 400) / 10] * 2 * 65536 / 36655;\n        } else {\n            level = g_WeightPow[(m_pSubstFont->m_Weight - 400) / 10] * 2;\n        }\n        FXFT_Outline_Embolden(FXFT_Get_Glyph_Outline(m_Face), level);\n    }\n    FXFT_Outline_Funcs funcs;\n    funcs.move_to = _Outline_MoveTo;\n    funcs.line_to = _Outline_LineTo;\n    funcs.conic_to = _Outline_ConicTo;\n    funcs.cubic_to = _Outline_CubicTo;\n    funcs.shift = 0;\n    funcs.delta = 0;\n    OUTLINE_PARAMS params;\n    params.m_bCount = TRUE;\n    params.m_PointCount = 0;\n    FXFT_Outline_Decompose(FXFT_Get_Glyph_Outline(m_Face), &funcs, &params);\n    if (params.m_PointCount == 0) {\n        FXFT_Set_Face_Internal_Flag(m_Face, transflag);\n        return NULL;\n    }\n    CFX_PathData* pPath = FX_NEW CFX_PathData;\n    if (!pPath) {\n        return NULL;\n    }\n    pPath->SetPointCount(params.m_PointCount);\n    params.m_bCount = FALSE;\n    params.m_PointCount = 0;\n    params.m_pPoints = pPath->GetPoints();\n    params.m_CurX = params.m_CurY = 0;\n    params.m_CoordUnit = 64 * 64.0;\n    FXFT_Outline_Decompose(FXFT_Get_Glyph_Outline(m_Face), &funcs, &params);\n    _Outline_CheckEmptyContour(&params);\n    pPath->TrimPoints(params.m_PointCount);\n    if (params.m_PointCount) {\n        pPath->GetPoints()[params.m_PointCount - 1].m_Flag |= FXPT_CLOSEFIGURE;\n    }\n    FXFT_Set_Face_Internal_Flag(m_Face, transflag);\n    return pPath;\n}\nvoid _CFX_UniqueKeyGen::Generate(int count, ...)\n{\n    va_list argList;\n    va_start(argList, count);\n    for (int i = 0; i < count; i ++) {\n        int p = va_arg(argList, int);\n        ((FX_DWORD*)m_Key)[i] = p;\n    }\n    va_end(argList);\n    m_KeyLen = count * sizeof(FX_DWORD);\n}\n"
  },
  {
    "path": "core/src/fxge/ge/text_int.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nstruct _CFX_UniqueKeyGen {\n    void\t\tGenerate(int count, ...);\n    FX_CHAR\t\tm_Key[128];\n    int\t\t\tm_KeyLen;\n};\nclass CFX_SizeGlyphCache : public CFX_Object\n{\npublic:\n    CFX_SizeGlyphCache()\n    {\n        m_GlyphMap.InitHashTable(253);\n    }\n    ~CFX_SizeGlyphCache();\n    CFX_MapPtrToPtr\t\t\tm_GlyphMap;\n};\nclass CTTFontDesc : public CFX_Object\n{\npublic:\n    CTTFontDesc()\n    {\n        m_Type = 0;\n        m_pFontData = NULL;\n        m_RefCount = 0;\n    }\n    ~CTTFontDesc();\n    FX_BOOL\t\t\tReleaseFace(FXFT_Face face);\n    int\t\t\t\tm_Type;\n    union {\n        struct {\n            FX_BOOL\t\tm_bItalic;\n            FX_BOOL\t\tm_bBold;\n            FXFT_Face\tm_pFace;\n        } m_SingleFace;\n        struct {\n            FXFT_Face\tm_pFaces[16];\n        } m_TTCFace;\n    };\n    FX_BYTE*\t\tm_pFontData;\n    int\t\t\t\tm_RefCount;\n};\nclass CFX_UnicodeEncoding : public IFX_FontEncoding\n{\npublic:\n    CFX_UnicodeEncoding(CFX_Font* pFont);\n    virtual FX_DWORD\t\tGlyphFromCharCodeEx(FX_DWORD charcode, int encoding = ENCODING_UNICODE);\nprivate:\n    CFX_Font*\t\t\tm_pFont;\n    virtual FX_DWORD\t\tGlyphFromCharCode(FX_DWORD charcode);\n    virtual CFX_WideString\tUnicodeFromCharCode(FX_DWORD charcode) const\n    {\n        return CFX_WideString((FX_WCHAR)charcode);\n    }\n    virtual FX_DWORD\t\tCharCodeFromUnicode(FX_WCHAR Unicode) const\n    {\n        return Unicode;\n    }\n    virtual FX_BOOL\t\t\tIsUnicodeCompatible() const\n    {\n        return TRUE;\n    }\n};\n#define CHARSET_FLAG_ANSI\t\t1\n#define CHARSET_FLAG_SYMBOL\t\t2\n#define CHARSET_FLAG_SHIFTJIS\t4\n#define CHARSET_FLAG_BIG5\t\t8\n#define CHARSET_FLAG_GB\t\t\t16\n#define CHARSET_FLAG_KOREAN\t\t32\nclass CFontFaceInfo : public CFX_Object\n{\npublic:\n    CFX_ByteString\t\tm_FilePath;\n    CFX_ByteString\t\tm_FaceName;\n    FX_DWORD\t\t\tm_Styles;\n    FX_DWORD\t\t\tm_Charsets;\n    FX_DWORD\t\t\tm_FontOffset;\n    FX_DWORD\t\t\tm_FileSize;\n    CFX_ByteString\t\tm_FontTables;\n};\nclass CFontFileFaceInfo : public CFX_Object\n{\npublic:\n    CFontFileFaceInfo();\n    ~CFontFileFaceInfo();\n    IFX_FileStream*\t\tm_pFile;\n    FXFT_Face\t\t\tm_Face;\n    CFX_ByteString\t\tm_FaceName;\n    FX_DWORD\t\t\tm_Charsets;\n    FX_DWORD\t\t\tm_FileSize;\n    FX_DWORD\t\t\tm_FontOffset;\n    int\t\t\t\t\tm_Weight;\n    FX_BOOL\t\t\t\tm_bItalic;\n    int\t\t\t\t\tm_PitchFamily;\n    CFX_ByteString\t\tm_FontTables;\n};\n"
  },
  {
    "path": "core/src/fxge/skia/fx_skia_blitter_new.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"../../../include/fxge/fx_ge.h\"\n//#define _SKIA_SUPPORT_\n#if defined(_SKIA_SUPPORT_)\n#include \"../../../include/fxcodec/fx_codec.h\"\n#include \"SkBlitter.h\"\n#include \"fx_skia_blitter_new.h\"\n\t// We use our own renderer here to make it simple\n\tvoid CFX_SkiaRenderer::blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[])\n\t{\n\t\tFXSYS_assert(m_Alpha);\n\t\tif (m_pOriDevice == NULL && composite_span == NULL) return;\n\t\tif (y < m_ClipBox.top || y >= m_ClipBox.bottom) return;\n\t\twhile (1)\n\t\t{\n\t\t\tint width = runs[0];\n\t\t\tSkASSERT(width >= 0);\n\t\t\tif (width <= 0) \n\t\t\t\treturn;\n\t\t\tunsigned aa = antialias[0];\n\t\t\tif (aa)\n\t\t\t\t(this->*composite_span)(m_pDestScan, m_pOriScan, 0, x, width, y, aa, m_ClipBox.top, m_ClipBox.left, m_ClipBox.right, m_pClipScan, m_pDestExtraAlphaScan);\n\t\t\truns += width;\n\t\t\tantialias += width;\n\t\t\tx += width;\n\t\t}\n\t}\n\n\tvoid CFX_SkiaRenderer::blitH(int x, int y, int width)\n\t{\n\t\tFXSYS_assert(m_Alpha && width);\n\t\tif (y < m_ClipBox.top || y >= m_ClipBox.bottom) return;\n\t\t(this->*composite_span)(m_pDestScan, m_pOriScan, 0, x, width, y, 255, m_ClipBox.top, m_ClipBox.left, m_ClipBox.right, m_pClipScan, m_pDestExtraAlphaScan);\n\t}\n\n\tvoid CFX_SkiaRenderer::blitV(int x, int y, int height, SkAlpha alpha)\n\t{\n\t\tFXSYS_assert(m_Alpha && alpha);\n\t\tif (alpha == 255) {\n\t\t\tthis->blitRect(x, y, 1, height);\n\t\t} else {\n\t\t\tint16_t runs[2];\n\t\t\truns[0] = 1;\n\t\t\truns[1] = 0;\n\t\t\twhile (--height >= 0) {\n\t\t\t\tif (y >= m_ClipBox.bottom)\n\t\t\t\t\treturn;\n\t\t\t\tthis->blitAntiH(x, y ++, &alpha, runs);\n\t\t\t}\n\t\t}\n\t}\n\tvoid CFX_SkiaRenderer::blitRect(int x, int y, int width, int height)\n\t{\n\t\tFXSYS_assert(m_Alpha && width);\n\t\twhile (--height >= 0){\n\t\t\tif (y >= m_ClipBox.bottom)\n\t\t\t\treturn;\n\t\t\tblitH(x, y ++, width);\n\t\t}\n\t}\n\n\tvoid CFX_SkiaRenderer::blitAntiRect(int x, int y, int width, int height,\n                             SkAlpha leftAlpha, SkAlpha rightAlpha) \n\t{\n\t\tblitV(x++, y, height, leftAlpha);\n\t\tif (width > 0) {\n\t\t\tblitRect(x, y, width, height);\n\t\t\tx += width;\n\t\t}\n\t\tblitV(x, y, height, rightAlpha);\n\t}\n\t/*---------------------------------------------------------------------------------------------------*/\n\tvoid CFX_SkiaRenderer::CompositeSpan1bpp_0(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan)\n\t{\n\t\tASSERT(!m_bRgbByteOrder);\n\t\tASSERT(!m_pDevice->IsCmykImage());\n\t\tdest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_left/8;\n\t\tint col_start = span_left < clip_left ? clip_left - span_left : 0;\n\t\tint col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n\t\tif (col_end < col_start) return; // do nothing.\n\t\tdest_scan += col_start/8;\n\n\t\tint index = 0;\n\t\tif (m_pDevice->GetPalette() == NULL) \n\t\t\tindex = ((FX_BYTE)m_Color == 0xff) ? 1 : 0;\n\t\telse {\n\t\t\tfor (int i = 0; i < 2; i ++)\n\t\t\t\tif (FXARGB_TODIB(m_pDevice->GetPalette()[i]) == m_Color) \n\t\t\t\t\tindex = i;\n\t\t} \n\t\tFX_LPBYTE dest_scan1 = dest_scan;\n\t\tint src_alpha = m_Alpha * cover_scan / 255;\n\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\tif (src_alpha) {\n\t\t\t\tif (!index)\n\t\t\t\t\t*dest_scan1 &= ~(1 << (7 - (col+span_left)%8));\n\t\t\t\telse\n\t\t\t\t\t*dest_scan1|= 1 << (7 - (col+span_left)%8);\n\t\t\t} \n\t\t\tdest_scan1 = dest_scan+(span_left%8+col-col_start+1)/8;\n\t\t}\n\t}\n\tvoid CFX_SkiaRenderer::CompositeSpan1bpp_4(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan)\n\t{\n\t\tASSERT(!m_bRgbByteOrder);\n\t\tASSERT(!m_pDevice->IsCmykImage());\n\t\tdest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_left/8;\n\t\tclip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top-clip_top) - clip_left + span_left;\n\t\tint col_start = span_left < clip_left ? clip_left - span_left : 0;\n\t\tint col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n\t\tif (col_end < col_start) return; // do nothing.\n\t\tdest_scan += col_start/8;\n\n\t\tint index = 0;\n\t\tif (m_pDevice->GetPalette() == NULL) \n\t\t\tindex = ((FX_BYTE)m_Color == 0xff) ? 1 : 0;\n\t\telse {\n\t\t\tfor (int i = 0; i < 2; i ++)\n\t\t\t\tif (FXARGB_TODIB(m_pDevice->GetPalette()[i]) == m_Color) \n\t\t\t\t\tindex = i;\n\t\t} \n\t\tFX_LPBYTE dest_scan1 = dest_scan;\n\t\tint src_alpha = m_Alpha * cover_scan / 255;\n\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\tint src_alpha1 = src_alpha * clip_scan[col] / 255;\n\t\t\tif (src_alpha1) {\n\t\t\t\tif (!index)\n\t\t\t\t\t*dest_scan1 &= ~(1 << (7 - (col+span_left)%8));\n\t\t\t\telse\n\t\t\t\t\t*dest_scan1|= 1 << (7 - (col+span_left)%8);\n\t\t\t} \n\t\t\tdest_scan1 = dest_scan+(span_left%8+col-col_start+1)/8;\n\t\t}\n\t}\n\t/*-----------------------------------------------------------------------------------------------------*/\n\tvoid CFX_SkiaRenderer::CompositeSpanGray_2(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan)\n\t{\n\t\tASSERT(!m_pDevice->IsCmykImage());\n\t\tASSERT(!m_bRgbByteOrder);\n\t\tdest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_left;\n\t\tint col_start = span_left < clip_left ? clip_left - span_left : 0;\n\t\tint col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n\t\tif (col_end < col_start) return; // do nothing.\n\t\tdest_scan += col_start;\n\t\tif (cover_scan == 255 && m_Alpha == 255) {\n\t\t\tFXSYS_memset32(dest_scan, FXARGB_MAKE(m_Gray, m_Gray, m_Gray, m_Gray), col_end - col_start);\n\t\t\treturn;\n\t\t}\n\t\tint src_alpha = m_Alpha * cover_scan / 255;\n\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, src_alpha);\n\t\t\tdest_scan++;\n\t\t}\n\t}\n\tvoid CFX_SkiaRenderer::CompositeSpanGray_3(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan)\n\t{\n\t\tASSERT(!m_pDevice->IsCmykImage());\n\t\tASSERT(!m_bRgbByteOrder);\n\t\tdest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_left;\n\t\tori_scan  = (FX_BYTE*)m_pOriDevice->GetScanline(span_top) + span_left;\n\t\tint col_start = span_left < clip_left ? clip_left - span_left : 0;\n\t\tint col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n\t\tif (col_end < col_start) return; // do nothing.\n\t\tdest_scan += col_start;\n\t\tori_scan += col_start;\n\t\tif (m_Alpha == 255 && cover_scan == 255) {\n\t\t\tFXSYS_memset32(dest_scan, FXARGB_MAKE(m_Gray, m_Gray, m_Gray, m_Gray), col_end - col_start);\n\t\t} else {\n\t\t\tint src_alpha = m_Alpha;\n#if 1\n\t\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t\tint gray = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray, src_alpha);\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, cover_scan);\n\t\t\t\tdest_scan ++;\n\t\t\t}\n#else\n\t\t\tif (m_bFullCover) {\n\t\t\t\tif (src_alpha == 255) {\n\t\t\t\t\tFXSYS_memset(dest_scan, FXARGB_MAKE(m_Gray, m_Gray, m_Gray, m_Gray), col_end - col_start);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tfor (int col = col_start; col < col_end; col ++)\n\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray, src_alpha);\n\t\t\t} else {\n\t\t\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t\t\tint gray = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray, src_alpha);\n\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, cover_scan);\n\t\t\t\t\tdest_scan++;\n\t\t\t\t}\n\t\t\t}\n#endif\n\t\t}\n\t}\n\n\tvoid CFX_SkiaRenderer::CompositeSpanGray_6(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan)\n\t{\n\t\tASSERT(!m_bRgbByteOrder);\n\t\tdest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_left;\n\t\tclip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top-clip_top) - clip_left + span_left;\n\t\tint col_start = span_left < clip_left ? clip_left - span_left : 0;\n\t\tint col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n\t\tif (col_end < col_start) return; // do nothing.\n\t\tdest_scan += col_start;\n\t\tint src_alpha = m_Alpha * cover_scan / 255;\n\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\tint src_alpha1 = src_alpha * clip_scan[col] / 255;\n\t\t\tif (!src_alpha1) {\n\t\t\t\tdest_scan ++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (src_alpha1 == 255)\n\t\t\t\t*dest_scan++ = m_Gray;\n\t\t\telse {\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, src_alpha1);\n\t\t\t\tdest_scan ++;\n\t\t\t}\n\t\t}\t\n\t}\n\n\tvoid CFX_SkiaRenderer::CompositeSpanGray_7(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan)\n\t{\n\t\tASSERT(!m_pDevice->IsCmykImage());\n\t\tdest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_left;\n\t\tori_scan  = (FX_BYTE*)m_pOriDevice->GetScanline(span_top) + span_left;\n\t\tclip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top-clip_top) - clip_left + span_left;\n\t\tint col_start = span_left < clip_left ? clip_left - span_left : 0;\n\t\tint col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n\t\tif (col_end < col_start) return; // do nothing.\n\t\tdest_scan += col_start;\n\t\tori_scan += col_start;\n#if 1\n\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\tint src_alpha = m_Alpha * clip_scan[col] / 255;\n\t\t\tif (src_alpha == 255 && cover_scan == 255) {\n\t\t\t\t*dest_scan++ = m_Gray;\n\t\t\t\tori_scan++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tint gray = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray, src_alpha);\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, cover_scan);\n\t\t\tdest_scan++;\n\t\t}\n\n#else\n\t\tif (m_bFullCover) {\n\t\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t\tint src_alpha = m_Alpha * clip_scan[col] / 255;\n\t\t\t\tif (!src_alpha) {\n\t\t\t\t\tdest_scan++;\n\t\t\t\t\tori_scan++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (src_alpha == 255){\n\t\t\t\t\t*dest_scan++ = m_Gray;\n\t\t\t\t\tori_scan++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t*dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray, src_alpha);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t\tint src_alpha = m_Alpha * clip_scan[col] / 255;\n\t\t\t\tif (src_alpha == 255 && cover_scan == 255) {\n\t\t\t\t\t*dest_scan++ = m_Gray;\n\t\t\t\t\tori_scan++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tint gray = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray, src_alpha);\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, cover_scan);\n\t\t\t\tdest_scan++;\n\t\t\t}\n\t\t}\n#endif\n\t}\n\t/*--------------------------------------------------------------------------------------------------*/\n\n\tvoid CFX_SkiaRenderer::CompositeSpanARGB_2(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan)\n\t{\n\t\tdest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + (span_left<<2);\n\t\tint col_start = span_left < clip_left ? clip_left - span_left : 0;\n\t\tint col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n\t\tif (col_end < col_start) return; // do nothing.\n\t\tdest_scan += col_start<<2;\n\t\tif (m_Alpha == 255 && cover_scan == 255) {\n\t\t\tFXSYS_memset32(dest_scan, m_Color, (col_end - col_start)<<2);\n\t\t\treturn;\n\t\t}\n\t\tint src_alpha;\n#if 0\n\t\tif (m_bFullCover) {\n\t\t\tif (m_Alpha == 255) {\n\t\t\t\tFXSYS_memset32(dest_scan, m_Color, (col_end - col_start)<<2);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\telse \n#endif\n\t\t\tsrc_alpha = m_Alpha * cover_scan / 255;\n\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t// Dest format: Argb\n\t\t\t// calculate destination alpha (it's union of source and dest alpha)\n\t\t\tif (dest_scan[3] == 0) {\n\t\t\t\tdest_scan[3] = src_alpha;\n\t\t\t\t*dest_scan++ = m_Blue;\n\t\t\t\t*dest_scan++ = m_Green;\n\t\t\t\t*dest_scan = m_Red;\n\t\t\t\tdest_scan += 2; \n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tFX_BYTE dest_alpha = dest_scan[3] + src_alpha - dest_scan[3] * src_alpha / 255;\n\t\t\tdest_scan[3] = dest_alpha;\n\t\t\tint alpha_ratio = src_alpha*255/dest_alpha;\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);\n\t\t\tdest_scan ++;\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);\n\t\t\tdest_scan ++;\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);\n\t\t\tdest_scan += 2;\n\t\t}\n\t}\n\n\tvoid CFX_SkiaRenderer::CompositeSpanARGB_3(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan)\n\t{\n\t\tASSERT(!m_pDevice->IsCmykImage());\n\t\tdest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + (span_left<<2);\n\t\t//ori_scan  = (FX_BYTE*)m_pOriDevice->GetScanline(span_top) + (span_left<<2);\n\t\tint col_start = span_left < clip_left ? clip_left - span_left : 0;\n\t\tint col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n\t\tif (col_end < col_start) return; // do nothing.\n\t\tdest_scan += col_start << 2;\n\t\t//ori_scan += col_start << 2;\n\n\t\tif (m_Alpha == 255 && cover_scan == 255){\n\t\t\tFXSYS_memset32(dest_scan, m_Color, (col_end - col_start)<<2);\n\t\t\treturn;\n\t\t}\t\t\n\t\tif (cover_scan == 255) {\n\t\t\tint dst_color = (0x00ffffff&m_Color)|(m_Alpha<<24);\n\t\t\tFXSYS_memset32(dest_scan, dst_color, (col_end - col_start)<<2);\n\t\t\treturn;\n\t\t}\n\t\t// Do not need origin bitmap, because of merge in pure transparent background\n\t\tint src_alpha_covered = m_Alpha * cover_scan / 255;\n\t\tfor (int col = col_start; col < col_end; col ++) \n\t\t{\n\t\t\t// shortcut\n\t\t\tif (dest_scan[3] == 0) {\n\t\t\t\tdest_scan[3] = src_alpha_covered;\n\t\t\t\t*dest_scan ++ = m_Blue;\n\t\t\t\t*dest_scan ++ = m_Green;\n\t\t\t\t*dest_scan = m_Red;\n\t\t\t\tdest_scan += 2; \n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// We should do alpha transition and color transition\n\t\t\t// alpha fg          color fg\n\t\t\t// alpha bg          color bg\n\t\t\t// alpha cover       color cover\n\t\t\tdest_scan[3] = FXDIB_ALPHA_MERGE(dest_scan[3], m_Alpha, cover_scan);\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, cover_scan);\n\t\t\tdest_scan ++;\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, cover_scan);\n\t\t\tdest_scan ++;\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, cover_scan);\n\t\t\tdest_scan += 2;\n\t\t}\n\t}\n\tvoid CFX_SkiaRenderer::CompositeSpanARGB_6(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan)\n\t{\n\t\tdest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + (span_left<<2);\n\t\tclip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top-clip_top) - clip_left + span_left;\n\t\tint col_start = span_left < clip_left ? clip_left - span_left : 0;\n\t\tint col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n\t\tif (col_end < col_start) return; // do nothing.\n\t\tdest_scan += col_start << 2;\n#if 1\n\t\tint src_alpha = m_Alpha * cover_scan / 255; \n\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\tint src_alpha1 = src_alpha* clip_scan[col] / 255;\n\t\t\tif (!src_alpha1) {\n\t\t\t\tdest_scan += 4;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (src_alpha1 == 255) {\n\t\t\t\t*(FX_DWORD*)dest_scan = m_Color;\n\t\t\t\tdest_scan += 4;\n\t\t\t} else {\n\t\t\t\t// Dest format: Argb\n\t\t\t\t// calculate destination alpha (it's union of source and dest alpha)\n\t\t\t\tif (dest_scan[3] == 0) {\n\t\t\t\t\tdest_scan[3] = src_alpha1;\n\t\t\t\t\t*dest_scan++ = m_Blue;\n\t\t\t\t\t*dest_scan++ = m_Green;\n\t\t\t\t\t*dest_scan = m_Red;\n\t\t\t\t\tdest_scan += 2; \n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tFX_BYTE dest_alpha = dest_scan[3] + src_alpha1 - dest_scan[3] * src_alpha1 / 255;\n\t\t\t\tdest_scan[3] = dest_alpha;\n\t\t\t\tint alpha_ratio = src_alpha1*255/dest_alpha;\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);\n\t\t\t\tdest_scan ++;\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);\n\t\t\t\tdest_scan ++;\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);\n\t\t\t\tdest_scan += 2;\n\t\t\t}\n\t\t}\n#else\n\t\tif (m_bFullCover) {\n\t\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t\tint src_alpha = m_Alpha * clip_scan[col] / 255;\n\t\t\t\tif (!src_alpha) {\n\t\t\t\t\tdest_scan += 4;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (src_alpha == 255){\n\t\t\t\t\t*(FX_DWORD*)dest_scan = m_Color;\n\t\t\t\t\tdest_scan += 4;\n\t\t\t\t\tcontinue;\n\t\t\t\t} else {\n\t\t\t\t\t// Dest format: Argb\n\t\t\t\t\t// calculate destination alpha (it's union of source and dest alpha)\n\t\t\t\t\tif (dest_scan[3] == 0) {\n\t\t\t\t\t\tdest_scan[3] = src_alpha;\n\t\t\t\t\t\t*dest_scan++ = m_Blue;\n\t\t\t\t\t\t*dest_scan++ = m_Green;\n\t\t\t\t\t\t*dest_scan = m_Red;\n\t\t\t\t\t\tdest_scan += 2; \n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tFX_BYTE dest_alpha = dest_scan[3] + src_alpha - dest_scan[3] * src_alpha / 255;\n\t\t\t\t\tdest_scan[3] = dest_alpha;\n\t\t\t\t\tint alpha_ratio = src_alpha*255/dest_alpha;\n\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);\n\t\t\t\t\tdest_scan ++;\n\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);\n\t\t\t\t\tdest_scan ++;\n\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);\n\t\t\t\t\tdest_scan += 2;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tint src_alpha = m_Alpha * cover_scan / 255; \n\t\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t\tint src_alpha1 = src_alpha* clip_scan[col] / 255;\n\t\t\t\tif (!src_alpha1) {\n\t\t\t\t\tdest_scan += 4;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (src_alpha1 == 255) {\n\t\t\t\t\t*(FX_DWORD*)dest_scan = m_Color;\n\t\t\t\t\tdest_scan += 4;\n\t\t\t\t} else {\n\t\t\t\t\t// Dest format: Argb\n\t\t\t\t\t// calculate destination alpha (it's union of source and dest alpha)\n\t\t\t\t\tif (dest_scan[3] == 0) {\n\t\t\t\t\t\tdest_scan[3] = src_alpha1;\n\t\t\t\t\t\t*dest_scan++ = m_Blue;\n\t\t\t\t\t\t*dest_scan++ = m_Green;\n\t\t\t\t\t\t*dest_scan = m_Red;\n\t\t\t\t\t\tdest_scan += 2; \n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tFX_BYTE dest_alpha = dest_scan[3] + src_alpha1 - dest_scan[3] * src_alpha1 / 255;\n\t\t\t\t\tdest_scan[3] = dest_alpha;\n\t\t\t\t\tint alpha_ratio = src_alpha1*255/dest_alpha;\n\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);\n\t\t\t\t\tdest_scan ++;\n\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);\n\t\t\t\t\tdest_scan ++;\n\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);\n\t\t\t\t\tdest_scan += 2;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#endif\n\t}\n\n\tvoid CFX_SkiaRenderer::CompositeSpanARGB_7(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan)\n\t{\n\t\tASSERT(!m_pDevice->IsCmykImage());\n\t\tdest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + (span_left<<2);\n\t\t//ori_scan  = (FX_BYTE*)m_pOriDevice->GetScanline(span_top) + (span_left<<2);\n\t\tclip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top-clip_top) - clip_left + span_left;\n\t\tint col_start = span_left < clip_left ? clip_left - span_left : 0;\n\t\tint col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n\t\tif (col_end < col_start) return; // do nothing.\n\t\tdest_scan += col_start << 2;\n\t\t//ori_scan += col_start << 2;\n\t\t// Do not need origin bitmap, because of merge in pure transparent background\n\t\tfor (int col = col_start; col < col_end; col ++) \n\t\t{\n\t\t\tint src_alpha = m_Alpha * clip_scan[col] / 255;\n\t\t\tint src_alpha_covered = src_alpha * cover_scan / 255;\n\t\t\t// shortcut\n\t\t\tif (src_alpha_covered == 0){\n\t\t\t\tdest_scan += 4;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// shortcut\n\t\t\tif (cover_scan == 255 || dest_scan[3] == 0)\n\t\t\t{\n\t\t\t\t// origin alpha always zero, just get src alpha\n\t\t\t\tdest_scan[3] = src_alpha_covered;\n\t\t\t\t*dest_scan ++ = m_Blue;\n\t\t\t\t*dest_scan ++ = m_Green;\n\t\t\t\t*dest_scan = m_Red;\n\t\t\t\tdest_scan += 2; \n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// We should do alpha transition and color transition\n\t\t\t// alpha fg          color fg\n\t\t\t// alpha bg          color bg\n\t\t\t// alpha cover       color cover\n\t\t\tdest_scan[3] = FXDIB_ALPHA_MERGE(dest_scan[3], src_alpha, cover_scan);\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, cover_scan);\n\t\t\tdest_scan ++;\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, cover_scan);\n\t\t\tdest_scan ++;\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, cover_scan);\n\t\t\tdest_scan += 2;\n\t\t}\n\t}\n\t\n\t/*-----------------------------------------------------------------------------------------------------------*/\n\tvoid CFX_SkiaRenderer::CompositeSpanRGB32_2(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan)\n\t{\n\t\tdest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + (span_left<<2);\n\t\tint col_start = span_left < clip_left ? clip_left - span_left : 0;\n\t\tint col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n\t\tif (col_end < col_start) return; // do nothing.\n\t\tdest_scan += (col_start << 2);\n\t\tif (m_Alpha == 255 && cover_scan == 255) {\n\t\t\tFXSYS_memset32(dest_scan, m_Color, (col_end - col_start)<<2);\n\t\t\treturn;\n\t\t}\n\t\tint src_alpha;\n#if 0\n\t\tif (m_bFullCover)\n\t\t\tsrc_alpha = m_Alpha;\n\t\telse \n#endif\n\t\t\tsrc_alpha = m_Alpha * cover_scan / 255;\n\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t// Dest format:  Rgb32\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha);\n\t\t\tdest_scan ++;\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha);\n\t\t\tdest_scan ++;\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha);\n\t\t\tdest_scan += 2;\n\t\t}\n\t}\n\tvoid CFX_SkiaRenderer::CompositeSpanRGB32_3(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan)\n\t{\n\t\tdest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + (span_left<<2);\n\t\tori_scan  = (FX_BYTE*)m_pOriDevice->GetScanline(span_top) + (span_left<<2);\n\t\tint col_start = span_left < clip_left ? clip_left - span_left : 0;\n\t\tint col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n\t\tif (col_end < col_start) return; // do nothing.\n\t\tdest_scan += col_start << 2;\n\t\tori_scan += col_start << 2;\n\t\tif (m_Alpha == 255 && cover_scan == 255) {\n\t\t\tFXSYS_memset32(dest_scan, m_Color, (col_end - col_start)<<2);\n\t\t\treturn;\n\t\t}\n\t\tint src_alpha = m_Alpha;\n\t\tfor (int col = col_start; col < col_end; col ++) {\n#if 0\n\t\t\tif (m_bFullCover) {\n\t\t\t\t*dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha);\n\t\t\t\t*dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha);\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_alpha);\n\t\t\t\tdest_scan += 2; ori_scan += 2;\n\t\t\t\tcontinue;\n\t\t\t}\n#endif\n\t\t\tint b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha);\n\t\t\tint g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha);\n\t\t\tint r = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_alpha);\n\t\t\tori_scan += 2;\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE( *dest_scan, b, cover_scan);\n \t\t\tdest_scan ++;\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan);\n \t\t\tdest_scan ++;\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan);\n\t\t\tdest_scan += 2;\n\t\t}\n\t}\n\tvoid CFX_SkiaRenderer::CompositeSpanRGB32_6(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan)\n\t{\n\t\tdest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + (span_left<<2);\n\t\tclip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top-clip_top) - clip_left + span_left;\n\t\tint col_start = span_left < clip_left ? clip_left - span_left : 0;\n\t\tint col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n\t\tif (col_end < col_start) return; // do nothing.\n\t\tdest_scan += col_start << 2;\n#if 1\n\t\tint src_alpha = m_Alpha * cover_scan / 255;\n\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\tint src_alpha1 = src_alpha * clip_scan[col] / 255;\n\t\t\tif (!src_alpha1) {\n\t\t\t\tdest_scan += 4;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (src_alpha1 == 255) {\n\t\t\t\t*(FX_DWORD*)dest_scan = m_Color;\n\t\t\t\tdest_scan += 4;\n\t\t\t} else {\n\t\t\t\t// Dest format: Rgb or Rgb32\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha1);\n\t\t\t\tdest_scan ++;\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha1);\n\t\t\t\tdest_scan ++;\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha1);\n\t\t\t\tdest_scan += 2;\n\t\t\t}\t\t\t\t\n\t\t}\n#else\n\t\tif (m_bFullCover) {\n\t\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t\tint src_alpha = m_Alpha * clip_scan[col] / 255;\n\t\t\t\tif (!src_alpha) {\n\t\t\t\t\tdest_scan += 4;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (src_alpha == 255) {\n\t\t\t\t\t*(FX_DWORD*)dest_scan = m_Color;\n\t\t\t\t\tdest_scan += 4;\n\t\t\t\t} else {\n\t\t\t\t\t// Dest format: Rgb or Rgb32\n\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha);\n\t\t\t\t\tdest_scan ++;\n\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha);\n\t\t\t\t\tdest_scan ++;\n\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha);\n\t\t\t\t\tdest_scan += 2;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Rgb32\n\t\t\tint src_alpha = m_Alpha * cover_scan / 255;\n\t\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t\tint src_alpha1 = src_alpha * clip_scan[col] / 255;\n\t\t\t\tif (!src_alpha1) {\n\t\t\t\t\tdest_scan += 4;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (src_alpha1 == 255) {\n\t\t\t\t\t*(FX_DWORD*)dest_scan = m_Color;\n\t\t\t\t\tdest_scan += 4;\n\t\t\t\t} else {\n\t\t\t\t\t// Dest format: Rgb or Rgb32\n\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha1);\n\t\t\t\t\tdest_scan ++;\n\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha1);\n\t\t\t\t\tdest_scan ++;\n\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha1);\n\t\t\t\t\tdest_scan += 2;\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t}\t\t\t\n#endif\n\t}\n\tvoid CFX_SkiaRenderer::CompositeSpanRGB32_7(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan)\n\t{\n\t\tASSERT(!m_pDevice->IsCmykImage());\n\t\tdest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + (span_left<<2);\n\t\tori_scan  = (FX_BYTE*)m_pOriDevice->GetScanline(span_top) + (span_left<<2);\n\t\tclip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top-clip_top) - clip_left + span_left;\n\t\tint col_start = span_left < clip_left ? clip_left - span_left : 0;\n\t\tint col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n\t\tif (col_end < col_start) return; // do nothing.\n\t\tdest_scan += col_start << 2;\n\t\tori_scan += col_start << 2;\n#if 1\n\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\tint src_alpha = m_Alpha * clip_scan[col] / 255;\n\t\t\tif (src_alpha == 255 && cover_scan == 255) {\n\t\t\t\t*(FX_DWORD*)dest_scan = m_Color;\n\t\t\t\tdest_scan += 4;\n\t\t\t\tori_scan += 4;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tint b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha);\n\t\t\tint g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha);\n\t\t\tint r = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_alpha);\n\t\t\tori_scan += 2;\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE( *dest_scan, b, cover_scan);\n \t\t\tdest_scan ++;\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan);\n \t\t\tdest_scan ++;\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan);\n\t\t\tdest_scan += 2;\n\t\t}\n#else\n\t\tif (m_bFullCover) {\n\t\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t\tint src_alpha = m_Alpha * clip_scan[col] / 255;\n\t\t\t\tif (!src_alpha) {\n\t\t\t\t\t*(FX_DWORD*)dest_scan = *(FX_DWORD*)ori_scan;\n\t\t\t\t\tdest_scan += 4;\n\t\t\t\t\tori_scan += 4;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (src_alpha == 255) {\n\t\t\t\t\t*(FX_DWORD*)dest_scan = m_Color;\n\t\t\t\t\tdest_scan += 4;\n\t\t\t\t\tori_scan += 4;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t*dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha);\n\t\t\t\t*dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha);\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_alpha);\n\t\t\t\tdest_scan += 2; ori_scan += 2;\n\t\t\t}\t\t\t\n\t\t} else {\n\t\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t\tint src_alpha = m_Alpha * clip_scan[col] / 255;\n\t\t\t\tif (src_alpha == 255 && cover_scan == 255) {\n\t\t\t\t\t*(FX_DWORD*)dest_scan = m_Color;\n\t\t\t\t\tdest_scan += 4;\n\t\t\t\t\tori_scan += 4;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tint b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha);\n\t\t\t\tint g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha);\n\t\t\t\tint r = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_alpha);\n\t\t\t\tori_scan += 2;\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE( *dest_scan, b, cover_scan);\n \t\t\t\tdest_scan ++;\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan);\n \t\t\t\tdest_scan ++;\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan);\n\t\t\t\tdest_scan += 2;\n\t\t\t}\n\t\t}\n#endif\n\t}\n\t/*-----------------------------------------------------------------------------------------------------*/\n\tvoid CFX_SkiaRenderer::CompositeSpanRGB24_2(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan)\n\t{\n\t\tdest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_left + (span_left<<1);\n\t\tint col_start = span_left < clip_left ? clip_left - span_left : 0;\n\t\tint col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n\t\tif (col_end < col_start) return; // do nothing.\n\t\tdest_scan += (col_start<<1)+col_start;\n\t\tint src_alpha;\n#if 0\n\t\tif (m_bFullCover)\n\t\t\tsrc_alpha = m_Alpha;\n\t\telse \n#endif\n\t\t\tsrc_alpha = m_Alpha * cover_scan / 255;\n\t\tif (src_alpha == 255) {\n\t\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t\t*dest_scan++ = m_Blue;\n\t\t\t\t*dest_scan++ = m_Green;\n\t\t\t\t*dest_scan++ = m_Red;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha);\n\t\t\tdest_scan ++;\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha);\n\t\t\tdest_scan ++;\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha);\n\t\t\tdest_scan ++;\n\t\t}\n\t}\n\tvoid CFX_SkiaRenderer::CompositeSpanRGB24_3(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan)\n\t{\n\t\tASSERT(!m_pDevice->IsCmykImage());\n\t\tdest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_left + (span_left<<1);\n\t\tori_scan  = (FX_BYTE*)m_pOriDevice->GetScanline(span_top) + span_left + (span_left<<1);\n\t\tint col_start = span_left < clip_left ? clip_left - span_left : 0;\n\t\tint col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n\t\tif (col_end < col_start) return; // do nothing.\n\t\tdest_scan += (col_start<<1) + col_start;\n\t\tori_scan += (col_start<<1) + col_start;\n\t\tif (m_Alpha == 255&&cover_scan == 255) {\n\t\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t\t*dest_scan ++ = m_Blue;\n \t\t\t\t*dest_scan ++ = m_Green;\n\t\t\t\t*dest_scan ++ = m_Red;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tfor (int col = col_start; col < col_end; col ++) {\n#if 0\n\t\t\tif (m_bFullCover) {\n\t\t\t\t*dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, m_Alpha);\n\t\t\t\t*dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, m_Alpha);\n\t\t\t\t*dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, m_Alpha);\n\t\t\t\tcontinue;\n\t\t\t}\n#endif\n\t\t\tint b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, m_Alpha);\n\t\t\tint g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, m_Alpha);\n\t\t\tint r = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, m_Alpha);\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE( *dest_scan, b, cover_scan);\n \t\t\tdest_scan ++;\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan);\n \t\t\tdest_scan ++;\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan);\n\t\t\tdest_scan ++;\n\t\t}\n\t}\n\tvoid CFX_SkiaRenderer::CompositeSpanRGB24_6(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan)\n\t{\n\t\tdest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_left+(span_left<<1);\n\t\tclip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top-clip_top) - clip_left + span_left;\n\t\tint col_start = span_left < clip_left ? clip_left - span_left : 0;\n\t\tint col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n\t\tif (col_end < col_start) return; // do nothing.\n\t\tdest_scan += col_start + (col_start << 1);\n#if 1\n\t\tint src_alpha = m_Alpha * cover_scan /255;\n\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\tint src_alpha1 = src_alpha * clip_scan[col] / 255;\t\n\t\t\tif (!src_alpha1) {\n\t\t\t\tdest_scan += 3;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (src_alpha1 == 255) {\n\t\t\t\t*dest_scan++ = m_Blue;\n\t\t\t\t*dest_scan++ = m_Green;\n\t\t\t\t*dest_scan++ = m_Red;\n\t\t\t} else {\n\t\t\t\t// Dest format: Rgb\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha1);\n\t\t\t\tdest_scan ++;\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha1);\n\t\t\t\tdest_scan ++;\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha1);\n\t\t\t\tdest_scan ++;\n\t\t\t}\n\t\t}\n#else\n\t\tif (m_bFullCover) {\n\t\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t\tint src_alpha = m_Alpha * clip_scan[col] / 255;\t\n\t\t\t\tif (!src_alpha) {\n\t\t\t\t\tdest_scan += 3;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (src_alpha == 255) {\n\t\t\t\t\t*dest_scan++ = m_Blue;\n\t\t\t\t\t*dest_scan++ = m_Green;\n\t\t\t\t\t*dest_scan++ = m_Red;\n\t\t\t\t} else {\n\t\t\t\t\t// Dest format: Rgb\n\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha);\n\t\t\t\t\tdest_scan ++;\n\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha);\n\t\t\t\t\tdest_scan ++;\n\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha);\n\t\t\t\t\tdest_scan ++;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tint src_alpha = m_Alpha * cover_scan /255;\n\t\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t\tint src_alpha1 = src_alpha * clip_scan[col] / 255;\t\n\t\t\t\tif (!src_alpha1) {\n\t\t\t\t\tdest_scan += 3;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (src_alpha1 == 255) {\n\t\t\t\t\t*dest_scan++ = m_Blue;\n\t\t\t\t\t*dest_scan++ = m_Green;\n\t\t\t\t\t*dest_scan++ = m_Red;\n\t\t\t\t} else {\n\t\t\t\t\t// Dest format: Rgb\n\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha1);\n\t\t\t\t\tdest_scan ++;\n\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha1);\n\t\t\t\t\tdest_scan ++;\n\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha1);\n\t\t\t\t\tdest_scan ++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#endif\n\t}\n\tvoid CFX_SkiaRenderer::CompositeSpanRGB24_7(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan)\n\t{\n\t\tASSERT(!m_pDevice->IsCmykImage());\n\t\tdest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_left+(span_left<<1);\n\t\tori_scan  = (FX_BYTE*)m_pOriDevice->GetScanline(span_top) + span_left+(span_left<<1);\n\t\tclip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top-clip_top) - clip_left + span_left;\n\t\tint col_start = span_left < clip_left ? clip_left - span_left : 0;\n\t\tint col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n\t\tif (col_end < col_start) return; // do nothing.\n\t\tdest_scan += col_start + (col_start<<1);\n\t\tori_scan += col_start + (col_start<<1);\n#if 1\n\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\tint src_alpha = m_Alpha * clip_scan[col] / 255;\n\t\t\tif (src_alpha == 255 && cover_scan == 255) {\n\t\t\t\t*dest_scan++ = m_Blue;\n\t\t\t\t*dest_scan++ = m_Green;\n\t\t\t\t*dest_scan++ = m_Red;\n\t\t\t\tori_scan += 3;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tint b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha);\n\t\t\tint g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha);\n\t\t\tint r = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, src_alpha);\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE( *dest_scan, b, cover_scan);\n \t\t\tdest_scan ++;\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan);\n \t\t\tdest_scan ++;\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan);\n\t\t\tdest_scan ++;\n\t\t}\n#else\n\t\tif (m_bFullCover) { \n\t\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t\tint src_alpha = m_Alpha * clip_scan[col] / 255;\n\t\t\t\tif (!src_alpha){\n\t\t\t\t\t*dest_scan++ = *ori_scan++;\n\t\t\t\t\t*dest_scan++ = *ori_scan++;\n\t\t\t\t\t*dest_scan++ = *ori_scan++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (src_alpha == 255){\n\t\t\t\t\t*dest_scan++ = m_Blue;\n\t\t\t\t\t*dest_scan++ = m_Green;\n\t\t\t\t\t*dest_scan++ = m_Red;\n\t\t\t\t\tori_scan += 3;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t*dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha);\n\t\t\t\t*dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha);\n\t\t\t\t*dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, src_alpha);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t\tint src_alpha = m_Alpha * clip_scan[col] / 255;\n\t\t\t\tif (src_alpha == 255 && cover_scan == 255) {\n\t\t\t\t\t*dest_scan++ = m_Blue;\n\t\t\t\t\t*dest_scan++ = m_Green;\n\t\t\t\t\t*dest_scan++ = m_Red;\n\t\t\t\t\tori_scan += 3;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tint b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha);\n\t\t\t\tint g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha);\n\t\t\t\tint r = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, src_alpha);\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE( *dest_scan, b, cover_scan);\n \t\t\t\tdest_scan ++;\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan);\n \t\t\t\tdest_scan ++;\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan);\n\t\t\t\tdest_scan ++;\n\t\t\t}\n\t\t}\n#endif\n\t}\n\tvoid CFX_SkiaRenderer::CompositeSpanRGB24_10(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan)\n\t{\n\t\tdest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_left+(span_left<<1);\n\t\tdest_extra_alpha_scan =  (FX_BYTE*)m_pDevice->m_pAlphaMask->GetScanline(span_top)+span_left;\n\t\tint col_start = span_left < clip_left ? clip_left - span_left : 0;\n\t\tint col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n\t\tif (col_end < col_start) return; // do nothing.\n\t\tdest_scan += col_start+(col_start<<1);\n#if 1\n\t\tif (m_Alpha == 255 && cover_scan == 255) {\n\t\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t\t*dest_scan++ = (FX_BYTE)m_Blue;\n\t\t\t\t*dest_scan++ = (FX_BYTE)m_Green;\n\t\t\t\t*dest_scan++ = (FX_BYTE)m_Red;\n\t\t\t\t*dest_extra_alpha_scan++ = 255;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tint src_alpha = m_Alpha * cover_scan / 255;\n\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t// Dest format: Rgba\n\t\t\t// calculate destination alpha (it's union of source and dest alpha)\n\t\t\tFX_BYTE dest_alpha = (*dest_extra_alpha_scan) + src_alpha - \n\t\t\t\t\t\t\t\t(*dest_extra_alpha_scan) * src_alpha / 255;\n\t\t\t*dest_extra_alpha_scan++ = dest_alpha;\n\t\t\tint alpha_ratio = src_alpha*255/dest_alpha;\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);\n\t\t\tdest_scan ++;\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);\n\t\t\tdest_scan ++;\n\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);\n\t\t\tdest_scan ++;\t\t\t\n\t\t}\n#else\n\t\tif (m_bFullCover) {\n\t\t\tif (m_Alpha == 255) {\n\t\t\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t\t\t*dest_scan++ = (FX_BYTE)m_Blue;\n\t\t\t\t\t*dest_scan++ = (FX_BYTE)m_Green;\n\t\t\t\t\t*dest_scan++ = (FX_BYTE)m_Red;\n\t\t\t\t\t*dest_extra_alpha_scan++ = 255;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t\t// Dest format: Rgba\n\t\t\t\t// calculate destination alpha (it's union of source and dest alpha)\n\t\t\t\tFX_BYTE dest_alpha = (*dest_extra_alpha_scan) + m_Alpha - \n\t\t\t\t\t\t\t\t\t(*dest_extra_alpha_scan) * m_Alpha / 255;\n\t\t\t\t*dest_extra_alpha_scan++ = dest_alpha;\n\t\t\t\tint alpha_ratio = m_Alpha*255/dest_alpha;\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);\n\t\t\t\tdest_scan ++;\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);\n\t\t\t\tdest_scan ++;\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);\n\t\t\t\tdest_scan ++;\n\t\t\t}\n\t\t} else {\n\t\t\tif (m_Alpha == 255 && cover_scan == 255) {\n\t\t\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t\t\t*dest_scan++ = (FX_BYTE)m_Blue;\n\t\t\t\t\t*dest_scan++ = (FX_BYTE)m_Green;\n\t\t\t\t\t*dest_scan++ = (FX_BYTE)m_Red;\n\t\t\t\t\t*dest_extra_alpha_scan++ = 255;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tint src_alpha = m_Alpha * cover_scan / 255;\n\t\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t\t// Dest format: Rgba\n\t\t\t\t// calculate destination alpha (it's union of source and dest alpha)\n\t\t\t\tFX_BYTE dest_alpha = (*dest_extra_alpha_scan) + src_alpha - \n\t\t\t\t\t\t\t\t\t(*dest_extra_alpha_scan) * src_alpha / 255;\n\t\t\t\t*dest_extra_alpha_scan++ = dest_alpha;\n\t\t\t\tint alpha_ratio = src_alpha*255/dest_alpha;\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);\n\t\t\t\tdest_scan ++;\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);\n\t\t\t\tdest_scan ++;\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);\n\t\t\t\tdest_scan ++;\t\t\t\n\t\t\t}\n\t\t}\n#endif\n\t}\n\tvoid CFX_SkiaRenderer::CompositeSpanRGB24_14(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan)\n\t{\n\t\tdest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_left+(span_left<<1);\n\t\tdest_extra_alpha_scan =  (FX_BYTE*)m_pDevice->m_pAlphaMask->GetScanline(span_top)+span_left;\n\t\tclip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top-clip_top) - clip_left + span_left;\n\t\tint col_start = span_left < clip_left ? clip_left - span_left : 0;\n\t\tint col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n\t\tif (col_end < col_start) return; // do nothing.\n\t\tdest_scan += col_start + (col_start << 1);\n#if 1\n\t\tint src_alpha = m_Alpha * cover_scan / 255;\n\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\tint src_alpha1 = src_alpha * clip_scan[col] / 255;\n\t\t\tif (!src_alpha1) {\n\t\t\t\tdest_extra_alpha_scan++;\n\t\t\t\tdest_scan += 3;\n\t\t\t\tcontinue;\n\t\t\t}\t\t\t\t\n\t\t\tif (src_alpha1 == 255) {\n\t\t\t\t*dest_scan++ = (FX_BYTE)m_Blue;\n\t\t\t\t*dest_scan++ = (FX_BYTE)m_Green;\n\t\t\t\t*dest_scan++ = (FX_BYTE)m_Red;\n\t\t\t\t*dest_extra_alpha_scan++ = (FX_BYTE)m_Alpha;\n\t\t\t} else {\n\t\t\t\t// Dest format: Rgba\n\t\t\t\t// calculate destination alpha (it's union of source and dest alpha)\n\t\t\t\tFX_BYTE dest_alpha = (*dest_extra_alpha_scan) + src_alpha1 - \n\t\t\t\t\t\t\t\t\t(*dest_extra_alpha_scan) * src_alpha1 / 255;\n\t\t\t\t*dest_extra_alpha_scan++ = dest_alpha;\n\t\t\t\tint alpha_ratio = src_alpha1*255/dest_alpha;\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);\n\t\t\t\tdest_scan ++;\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);\n\t\t\t\tdest_scan ++;\n\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);\n\t\t\t\tdest_scan ++;\n\t\t\t}\n\t\t}\n#else\n\t\tif (m_bFullCover) {\n\t\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t\tint src_alpha = m_Alpha * clip_scan[col] / 255;\n\t\t\t\tif (!src_alpha) {\n\t\t\t\t\tdest_extra_alpha_scan++;\n\t\t\t\t\tdest_scan += 3;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (src_alpha == 255) {\n\t\t\t\t\t*dest_scan++ = (FX_BYTE)m_Blue;\n\t\t\t\t\t*dest_scan++ = (FX_BYTE)m_Green;\n\t\t\t\t\t*dest_scan++ = (FX_BYTE)m_Red;\n\t\t\t\t\t*dest_extra_alpha_scan++ = (FX_BYTE)m_Alpha;\n\t\t\t\t} else {\n\t\t\t\t\t// Dest format: Rgba\n\t\t\t\t\t// calculate destination alpha (it's union of source and dest alpha)\n\t\t\t\t\tFX_BYTE dest_alpha = (*dest_extra_alpha_scan) + src_alpha - \n\t\t\t\t\t\t\t\t\t\t(*dest_extra_alpha_scan) * src_alpha / 255;\n\t\t\t\t\t*dest_extra_alpha_scan++ = dest_alpha;\n\t\t\t\t\tint alpha_ratio = src_alpha*255/dest_alpha;\n\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);\n\t\t\t\t\tdest_scan ++;\n\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);\n\t\t\t\t\tdest_scan ++;\n\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);\n\t\t\t\t\tdest_scan ++;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tint src_alpha = m_Alpha * cover_scan / 255;\n\t\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t\tint src_alpha1 = m_Alpha * cover_scan * clip_scan[col] / 255;\n\t\t\t\tif (!src_alpha1) {\n\t\t\t\t\tdest_extra_alpha_scan++;\n\t\t\t\t\tdest_scan += 3;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\t\t\t\t\n\t\t\t\tif (src_alpha1 == 255) {\n\t\t\t\t\t*dest_scan++ = (FX_BYTE)m_Blue;\n\t\t\t\t\t*dest_scan++ = (FX_BYTE)m_Green;\n\t\t\t\t\t*dest_scan++ = (FX_BYTE)m_Red;\n\t\t\t\t\t*dest_extra_alpha_scan++ = (FX_BYTE)m_Alpha;\n\t\t\t\t} else {\n\t\t\t\t\t// Dest format: Rgba\n\t\t\t\t\t// calculate destination alpha (it's union of source and dest alpha)\n\t\t\t\t\tFX_BYTE dest_alpha = (*dest_extra_alpha_scan) + src_alpha1 - \n\t\t\t\t\t\t\t\t\t\t(*dest_extra_alpha_scan) * src_alpha1 / 255;\n\t\t\t\t\t*dest_extra_alpha_scan++ = dest_alpha;\n\t\t\t\t\tint alpha_ratio = src_alpha1*255/dest_alpha;\n\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);\n\t\t\t\t\tdest_scan ++;\n\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);\n\t\t\t\t\tdest_scan ++;\n\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);\n\t\t\t\t\tdest_scan ++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#endif\n\t}\n\t/*-----------------------------------------------------------------------------------------------------*/\n\n\t// A general alpha merge function (with clipping mask). Cmyka/Cmyk device.\n\tvoid CFX_SkiaRenderer::CompositeSpanCMYK(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan)\n\t{\n\t\tASSERT(!m_bRgbByteOrder);\n\t\t// Cmyk(a)\n\t\tint col_start = span_left < clip_left ? clip_left - span_left : 0;\n\t\tint col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);\n\t\tif (col_end < col_start) return; // do nothing.\n\t\tdest_scan += col_start * 4;\n\t\tBpp; // for avoid compile warning.\n\t\t\n\t\tif (dest_extra_alpha_scan) {\n\t\t\t// CMYKa\n\t\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t\tint src_alpha;\n\t\t\t\tif (m_bFullCover) {\n\t\t\t\t\tif (clip_scan)\n\t\t\t\t\t\tsrc_alpha = m_Alpha * clip_scan[col] / 255;\n\t\t\t\t\telse\n\t\t\t\t\t\tsrc_alpha = m_Alpha;\n\t\t\t\t} else {\n\t\t\t\t\tif (clip_scan)\n\t\t\t\t\t\tsrc_alpha = m_Alpha * cover_scan * clip_scan[col] / 255 / 255;\n\t\t\t\t\telse\n\t\t\t\t\t\tsrc_alpha = m_Alpha * cover_scan / 255;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (src_alpha) {\n\t\t\t\t\tif (src_alpha == 255) {\n\t\t\t\t\t\t*(FX_CMYK*)dest_scan = m_Color;\n\t\t\t\t\t\t*dest_extra_alpha_scan = (FX_BYTE)m_Alpha;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Dest format: Cmyka\n\t\t\t\t\t\t// calculate destination alpha (it's union of source and dest alpha)\n\t\t\t\t\t\tFX_BYTE dest_alpha = (*dest_extra_alpha_scan) + src_alpha - \n\t\t\t\t\t\t\t(*dest_extra_alpha_scan) * src_alpha / 255;\n\t\t\t\t\t\t*dest_extra_alpha_scan++ = dest_alpha;\n\t\t\t\t\t\tint alpha_ratio = src_alpha*255/dest_alpha;\n\t\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);\n\t\t\t\t\t\tdest_scan ++;\n\t\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);\n\t\t\t\t\t\tdest_scan ++;\n\t\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);\n\t\t\t\t\t\tdest_scan ++;\n\t\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, alpha_ratio);\n\t\t\t\t\t\tdest_scan ++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdest_extra_alpha_scan++;\n\t\t\t\tdest_scan += 4;\n\t\t\t}\n\t\t} else {\n\t\t\t// CMYK\n\t\t\tfor (int col = col_start; col < col_end; col ++) {\n\t\t\t\tint src_alpha;\n\t\t\t\tif (clip_scan)\n\t\t\t\t\tsrc_alpha = m_Alpha * cover_scan * clip_scan[col] / 255 / 255;\n\t\t\t\telse\n\t\t\t\t\tsrc_alpha = m_Alpha * cover_scan / 255;\n\t\t\t\t\n\t\t\t\tif (src_alpha) {\n\t\t\t\t\tif (src_alpha == 255) {\n\t\t\t\t\t\t*(FX_CMYK*)dest_scan = m_Color;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Dest format: cmyk\n\t\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha);\n\t\t\t\t\t\tdest_scan ++;\n\t\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha);\n\t\t\t\t\t\tdest_scan ++;\n\t\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha);\n\t\t\t\t\t\tdest_scan ++;\n\t\t\t\t\t\t*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, src_alpha);\n\t\t\t\t\t\tdest_scan ++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdest_scan += 4;\n\t\t\t}\n\t\t}\n\t}\n\n   \n\t\n\t//--------------------------------------------------------------------\n\tFX_BOOL CFX_SkiaRenderer::Init(CFX_DIBitmap* pDevice, CFX_DIBitmap* pOriDevice, const CFX_ClipRgn* pClipRgn, FX_DWORD color, FX_BOOL bFullCover, FX_BOOL bRgbByteOrder, \n\t\tint alpha_flag, void* pIccTransform) //The alpha flag must be fill_flag if exist.\n\t{\n\t\tm_pDevice = pDevice;\n\t\tm_pClipRgn = pClipRgn;\n\t\tm_bRgbByteOrder = bRgbByteOrder;\n\t\tm_pOriDevice = pOriDevice;\n\t\tm_pDestScan = NULL;\n\t\tm_pDestExtraAlphaScan = NULL;\n\t\tm_pOriScan = NULL;\n\t\tm_pClipScan = NULL;\n\t\tcomposite_span = NULL;\n\t\tif (m_pClipRgn)\n\t\t\tm_ClipBox = m_pClipRgn->GetBox();\n\t\telse {\n\t\t\tm_ClipBox.left = m_ClipBox.top = 0;\n\t\t\tm_ClipBox.right = m_pDevice->GetWidth();\n\t\t\tm_ClipBox.bottom = m_pDevice->GetHeight();\n\t\t}\n\t\tm_pClipMask = NULL;\n\t\tif (m_pClipRgn && m_pClipRgn->GetType() == CFX_ClipRgn::MaskF)\n\t\t{\n\t\t\tm_pClipMask = m_pClipRgn->GetMask();\n\t\t\tm_pClipScan = m_pClipMask->GetBuffer();\n\t\t}\n\t\tif (m_pDevice->m_pAlphaMask)\n\t\t\tm_pDestExtraAlphaScan = m_pDevice->m_pAlphaMask->GetBuffer();\n\t\tif (m_pOriDevice)\n\t\t\tm_pOriScan = m_pOriDevice->GetBuffer();\n\t\tm_pDestScan = m_pDevice->GetBuffer();\n\t\t\n\t\tm_bFullCover = bFullCover;\n\t\t\n\t\tFX_BOOL bObjectCMYK = FXGETFLAG_COLORTYPE(alpha_flag);\n\t\tFX_BOOL bDeviceCMYK = pDevice->IsCmykImage();\n\n\t\tm_Alpha = bObjectCMYK ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);\n\n\t\tICodec_IccModule* pIccModule = NULL;\n\t\t// No lcms engine, we skip the transform\n\t\tif (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) \n\t\t\tpIccTransform = NULL;\n\t\telse\n\t\t\tpIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();\n\t\t\n\t\tif (m_pDevice->GetBPP() == 8) { // Gray(a) device\n\t\t\tASSERT(!m_bRgbByteOrder);\n\t\t\tif (m_pDevice->IsAlphaMask()) {\n\t\t\t\t//Alpha Mask\n\t\t\t\tm_Gray = 255;\n\t\t\t} else {\n\t\t\t\t//Gray(a) device\n\t\t\t\tif (pIccTransform) {\n\t\t\t\t\tFX_BYTE gray;\n\t\t\t\t\tcolor = bObjectCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);\n\t\t\t\t\tpIccModule->TranslateScanline(pIccTransform, &gray, (FX_LPCBYTE)&color, 1);\n\t\t\t\t\tm_Gray = gray;\n\t\t\t\t} else {\n\t\t\t\t\tif (bObjectCMYK) {\n\t\t\t\t\t\tFX_BYTE r, g, b;\n\t\t\t\t\t\tAdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), FXSYS_GetYValue(color), FXSYS_GetKValue(color), \n\t\t\t\t\t\t\tr, g, b);\n\t\t\t\t\t\tm_Gray = FXRGB2GRAY(r, g, b);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tm_Gray = FXRGB2GRAY(FXARGB_R(color), FXARGB_G(color), FXARGB_B(color));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (bDeviceCMYK) { // Cmyk(a) Device\n\t\t\t\tASSERT(!m_bRgbByteOrder);\n\t\t\t\t//TODO... opt for cmyk\n\t\t\t\tcomposite_span = &CFX_SkiaRenderer::CompositeSpanCMYK;\n\t\t\t\tif (bObjectCMYK) { \n\t\t\t\t\tm_Color = FXCMYK_TODIB(color);\n\t\t\t\t\tif (pIccTransform)\n\t\t\t\t\t\tpIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&m_Color, (FX_LPCBYTE)&m_Color, 1);\n\t\t\t\t} else { // Object RGB\n\t\t\t\t\tif (!pIccTransform)\n\t\t\t\t\t\treturn FALSE;\n\t\t\t\t\tcolor = FXARGB_TODIB(color);\n\t\t\t\t\tpIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&m_Color, (FX_LPCBYTE)&color, 1);\n\t\t\t\t}\n\t\t\t\tm_Red\t= ((FX_LPBYTE)&m_Color)[0];\n\t\t\t\tm_Green = ((FX_LPBYTE)&m_Color)[1];\n\t\t\t\tm_Blue\t= ((FX_LPBYTE)&m_Color)[2];\n\t\t\t\tm_Gray\t= ((FX_LPBYTE)&m_Color)[3];\n\t\t\t\treturn TRUE;\n\t\t\t} else { \n\t\t\t\tif (pIccTransform) {\n\t\t\t\t\tcolor = bObjectCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);\n\t\t\t\t\tpIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&m_Color, (FX_LPCBYTE)&color, 1);\n\t\t\t\t\t((FX_LPBYTE)&m_Color)[3] = m_Alpha;\n\t\t\t\t\tm_Red = ((FX_LPBYTE)&m_Color)[2];\n\t\t\t\t\tm_Green = ((FX_LPBYTE)&m_Color)[1];\n\t\t\t\t\tm_Blue = ((FX_LPBYTE)&m_Color)[0];\n\t\t\t\t\t// Need Johnson to improvement it.\n\t\t\t\t\tif (m_bRgbByteOrder) {\n\t\t\t\t\t\t// swap\n\t\t\t\t\t\tm_Red = ((FX_LPBYTE)&m_Color)[0];\n\t\t\t\t\t\tm_Blue = ((FX_LPBYTE)&m_Color)[2];\n\t\t\t\t\t\tm_Color = FXARGB_TODIB(m_Color);\n\t\t\t\t\t\tm_Color = FXARGB_TOBGRORDERDIB(m_Color);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (bObjectCMYK) {\n\t\t\t\t\t\tFX_BYTE r, g, b;\n\t\t\t\t\t\tAdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), FXSYS_GetYValue(color), FXSYS_GetKValue(color), \n\t\t\t\t\t\t\tr, g, b);\n\t\t\t\t\t\tm_Color = FXARGB_MAKE(m_Alpha, r, g, b);\n\t\t\t\t\t\tif (m_bRgbByteOrder){\n\t\t\t\t\t\t\tm_Color = FXARGB_TOBGRORDERDIB(m_Color);\n\t\t\t\t\t\t\tm_Red = b; m_Green = g; m_Blue = r;//\n\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\tm_Color = FXARGB_TODIB(m_Color);\n\t\t\t\t\t\t\tm_Red = r; m_Green = g; m_Blue = b;//\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (m_bRgbByteOrder){\n\t\t\t\t\t\t\tm_Color = FXARGB_TOBGRORDERDIB(color);\n\t\t\t\t\t\t\tArgbDecode(color, m_Alpha, m_Blue, m_Green, m_Red); //\n\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\tm_Color = FXARGB_TODIB(color);\n\t\t\t\t\t\t\tArgbDecode(color, m_Alpha, m_Red, m_Green, m_Blue); \n\t\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\t\n\t\t\t}\n\t\t}\n\t\t// Get palette transparency selector\n\t\tm_ProcessFilter = (m_pOriDevice? 1 : 0)\t/* has Ori Device flag */\n\t\t\t\t\t\t+ (m_pDevice->GetBPP() >= 8 ? 2 : 0)\t/* bpp flag */\t\t\t\n\t\t\t\t\t\t+ (m_pClipMask? 4 : 0)\t\t\t\t\t/* has clip region flag */\n\t\t\t\t\t\t+ (m_pDevice->m_pAlphaMask? 8 : 0);\t\t/* has Alpha Mask chanel flag */\n\t\tswitch(m_ProcessFilter) {\n\t\t\tcase 0:\n\t\t\t\tcomposite_span = &CFX_SkiaRenderer::CompositeSpan1bpp_0;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\t{\n\t\t\t\t\tif (m_pDevice->GetBPP() == 8)\n\t\t\t\t\t\tcomposite_span = &CFX_SkiaRenderer::CompositeSpanGray_2;\n\t\t\t\t\telse if (m_pDevice->GetBPP() == 24)\n\t\t\t\t\t\tcomposite_span = &CFX_SkiaRenderer::CompositeSpanRGB24_2;\n\t\t\t\t\telse\n\t\t\t\t\t\tcomposite_span = m_pDevice->HasAlpha()?&CFX_SkiaRenderer::CompositeSpanARGB_2 : &CFX_SkiaRenderer::CompositeSpanRGB32_2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\t{\n\t\t\t\t\tif (m_pDevice->GetBPP() == 8)\n\t\t\t\t\t\tcomposite_span = &CFX_SkiaRenderer::CompositeSpanGray_3;\n\t\t\t\t\telse if (m_pDevice->GetBPP() == 24)\n\t\t\t\t\t\tcomposite_span = &CFX_SkiaRenderer::CompositeSpanRGB24_3;\n\t\t\t\t\telse \n\t\t\t\t\t\tcomposite_span = m_pDevice->HasAlpha()?&CFX_SkiaRenderer::CompositeSpanARGB_3 : &CFX_SkiaRenderer::CompositeSpanRGB32_3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\tcomposite_span = &CFX_SkiaRenderer::CompositeSpan1bpp_4;\n\t\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\t\t{\n\t\t\t\t\tif (m_pDevice->GetBPP() == 8)\n\t\t\t\t\t\tcomposite_span = &CFX_SkiaRenderer::CompositeSpanGray_6;\n\t\t\t\t\telse if (m_pDevice->GetBPP() == 24)\n\t\t\t\t\t\tcomposite_span = &CFX_SkiaRenderer::CompositeSpanRGB24_6;\n\t\t\t\t\telse \n\t\t\t\t\t\tcomposite_span = m_pDevice->HasAlpha()?&CFX_SkiaRenderer::CompositeSpanARGB_6 : &CFX_SkiaRenderer::CompositeSpanRGB32_6;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 7:\n\t\t\t\t{\n\t\t\t\t\tif (m_pDevice->GetBPP() == 8)\n\t\t\t\t\t\tcomposite_span = &CFX_SkiaRenderer::CompositeSpanGray_7;\n\t\t\t\t\telse if (m_pDevice->GetBPP() == 24)\n\t\t\t\t\t\tcomposite_span = &CFX_SkiaRenderer::CompositeSpanRGB24_7;\n\t\t\t\t\telse \n\t\t\t\t\t\tcomposite_span = m_pDevice->HasAlpha()?&CFX_SkiaRenderer::CompositeSpanARGB_7 : &CFX_SkiaRenderer::CompositeSpanRGB32_7;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\tcase 5:\n\t\t\tcase 8:\n\t\t\tcase 9:\n\t\t\tcase 11:\n\t\t\tcase 12:\n\t\t\tcase 13:\n\t\t\tcase 15:\n\t\t\t\t//TODO...\n\t\t\t\tbreak;\n\t\t\tcase 10:\n\t\t\t\tcomposite_span = &CFX_SkiaRenderer::CompositeSpanRGB24_10;\n\t\t\t\tbreak;\n\t\t\tcase 14:\n\t\t\t\tcomposite_span = &CFX_SkiaRenderer::CompositeSpanRGB24_14;\n\t\t\t\tbreak;\n\t\t}\n\t\tif (composite_span == NULL)\n\t\t\treturn FALSE;\n\t\treturn TRUE;\n\t}\n\n\t/*----------------------------------------------------------------------------------------------------*/\n\tvoid CFX_SkiaA8Renderer::blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[])\n\t{\n\t\tFXSYS_assert(m_pDevice);\n\t\tint dst_y = y - m_Top;\n\t\tif (dst_y < 0 || dst_y >=  m_pDevice->GetHeight())\n\t\t\treturn;\n\t\t\n\t\tFX_LPBYTE dest_scan = m_pDevice->GetBuffer() + m_pDevice->GetPitch() * dst_y;\n\t\tFX_LPBYTE dest_pos = dest_scan;\n\t\twhile (1)\n\t\t{\n\t\t\tif (x >= m_dstWidth) \n\t\t\t\treturn;\n\t\t\tint width = runs[0];\n\t\t\tSkASSERT(width >= 0);\n\t\t\tif (width <= 0) \n\t\t\t\treturn;\n\t\t\tunsigned aa = antialias[0];\n\t\t\tif (aa) {\n\t\t\t\tint col_start = x < m_Left ? 0 : x - m_Left;\n\t\t\t\tint col_end = x + width;\n\t\t\t\tcol_end = col_end < m_dstWidth ? col_end - m_Left: m_pDevice->GetWidth();\n\t\t\t\tint result = col_end - col_start;\n\t\t\t\tif (result > 0) {\n\t\t\t\t\tdest_pos = dest_scan + col_start;\n\t\t\t\t\tif (result >= 4)\n\t\t\t\t\t\tFXSYS_memset32(dest_pos, FXARGB_MAKE(aa, aa, aa, aa),result);\n\t\t\t\t\telse\n\t\t\t\t\t\tFXSYS_memset(dest_pos,aa,result);\n\t\t\t\t}\t\t\t\t\n\t\t\t}\t\n\t\t\truns += width;\n\t\t\tantialias += width;\n\t\t\tx += width;\n\t\t}\n\t}\n\tvoid CFX_SkiaA8Renderer::blitH(int x, int y, int width)\n\t{\n\t\tFXSYS_assert(m_pDevice);\n\t\tint dst_y = y - m_Top;\n\t\tif (dst_y < 0 || dst_y >=  m_pDevice->GetHeight())\n\t\t\treturn;\n\t\tif (x >= m_dstWidth) \n\t\t\treturn;\n\t\tFX_LPBYTE dest_scan = m_pDevice->GetBuffer() + m_pDevice->GetPitch() * dst_y;\n\t\tint col_start = x < m_Left ? 0 : x - m_Left;\n\t\tint col_end = x + width;\n\t\tcol_end = col_end < m_dstWidth ? col_end - m_Left: m_pDevice->GetWidth();\n\t\tint result = col_end - col_start;\n\t\tif (result > 0) {\n\t\t\tFX_BYTE* dest_pos = dest_scan + col_start;\n\t\t\tif (result >= 4)\n\t\t\t\tFXSYS_memset32(dest_pos, 0xffffffff,result);\n\t\t\telse\n\t\t\t\tFXSYS_memset(dest_pos,255,result);\n\t\t}\n\t}\n\tvoid CFX_SkiaA8Renderer::blitV(int x, int y, int height, SkAlpha alpha)\n\t{\n\t\tFXSYS_assert(alpha);\n\t\tif (alpha == 255) {\n\t\t\tthis->blitRect(x, y, 1, height);\n\t\t} else {\n\t\t\tint16_t runs[2];\n\t\t\truns[0] = 1;\n\t\t\truns[1] = 0;\n\t\t\twhile (--height >= 0) {\n\t\t\t\tif (y >= m_dstHeight)\n\t\t\t\t\treturn;\n\t\t\t\tthis->blitAntiH(x, y ++, &alpha, runs);\n\t\t\t}\n\t\t}\n\t}\n\tvoid CFX_SkiaA8Renderer::blitRect(int x, int y, int width, int height)\n\t{\n\t\tFXSYS_assert(m_pDevice);\n\t\twhile (--height >= 0) {\n\t\t\tif (y >= m_dstHeight)\n\t\t\t\treturn;\n\t\t\tblitH(x , y ++, width);\n\t\t}\n\t}\n\n\tvoid CFX_SkiaA8Renderer::blitAntiRect(int x, int y, int width, int height,\n                             SkAlpha leftAlpha, SkAlpha rightAlpha) \n\t{\n\t\tblitV(x++, y, height, leftAlpha);\n\t\tif (width > 0) {\n\t\t\tblitRect(x, y, width, height);\n\t\t\tx += width;\n\t\t}\n\t\tblitV(x, y, height, rightAlpha);\n\t}\n\n\tFX_BOOL CFX_SkiaA8Renderer::Init(CFX_DIBitmap* pDevice, int Left, int Top)\n\t{\n\t\tm_pDevice = pDevice;\n\t\tm_Left = Left;\n\t\tm_Top = Top;\n\t\tif (pDevice){\n\t\t\tm_dstWidth = m_Left + pDevice->GetWidth();\n\t\t\tm_dstHeight = m_Top + pDevice->GetHeight();\n\t\t}\n\t\treturn TRUE;\n\t}\n#endif\n"
  },
  {
    "path": "core/src/fxge/skia/fx_skia_blitter_new.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#ifndef _FX_SKIABLITTER_H_\n#define _FX_SKIABLITTER_H_\n//#define _SKIA_SUPPORT_\n#if defined(_SKIA_SUPPORT_)\nclass CFX_SkiaRenderer : public SkBlitter, public CFX_Object\n{\nprotected:\n\tint\t\t\tm_Alpha, \n\t\t\t\tm_Red,\t\t// Or the complementary-color, Cyan\n\t\t\t\tm_Green,\t// Magenta\n\t\t\t\tm_Blue,\t\t// Yellow\n\t\t\t\tm_Gray;\t\t// Black\n\tFX_DWORD\tm_Color;\t// FX_ARGB or FX_CMYK\n\tFX_BOOL\t\tm_bFullCover;\n\tint\t\t\tm_ProcessFilter;\n\tFX_BOOL     m_bRgbByteOrder;\n\t\n\tFX_RECT\t\t\t\tm_ClipBox;\n\tCFX_DIBitmap*\t\tm_pDevice;\n\tCFX_DIBitmap*\t\tm_pOriDevice;\n\tconst CFX_ClipRgn*\tm_pClipRgn;\n\tconst CFX_DIBitmap*\tm_pClipMask;\n\n\tFX_LPBYTE m_pDestScan;\n\tFX_LPBYTE m_pDestExtraAlphaScan;\n\tFX_LPBYTE m_pOriScan;\n\tFX_LPBYTE m_pClipScan;\n\n\tvoid (CFX_SkiaRenderer::*composite_span)(FX_LPBYTE,FX_LPBYTE,int,int,int,int,FX_BYTE,int,int,int,FX_LPBYTE,FX_LPBYTE);\npublic:\n    \n    //--------------------------------------------------------------------\n    virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);\n\tvirtual void blitH(int x, int y, int width); \n\tvirtual void blitV(int x, int y, int height, SkAlpha alpha);\n\tvirtual void blitRect(int x, int y, int width, int height);\n\tvirtual\tvoid blitAntiRect(int x, int y, int width, int height, SkAlpha leftAlpha, SkAlpha rightAlpha);\n    \t\n\t/*------------------------------------------------------------------------------------------------------*/\n\t// A general alpha merge function (with clipping mask). Gray device.\n\tvoid CompositeSpan1bpp_0(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\tvoid CompositeSpan1bpp_1(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\tvoid CompositeSpan1bpp_4(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\tvoid CompositeSpan1bpp_5(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\tvoid CompositeSpan1bpp_8(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\tvoid CompositeSpan1bpp_9(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\tvoid CompositeSpan1bpp_12(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\tvoid CompositeSpan1bpp_13(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\n\t/*--------------------------------------------------------------------------------------------------------*/\n\t\n\t// A general alpha merge function (with clipping mask). Gray device.\n\tvoid CompositeSpanGray_2(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\n\tvoid CompositeSpanGray_3(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\n\tvoid CompositeSpanGray_6(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\n\tvoid CompositeSpanGray_7(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\n\tvoid CompositeSpanGray_10(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\n\n\tvoid CompositeSpanGray_11(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\n\tvoid CompositeSpanGray_14(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\n\tvoid CompositeSpanGray_15(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\n\t/*--------------------------------------------------------------------------------------------------------*/\n\tvoid CompositeSpanARGB_2(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\n\tvoid CompositeSpanARGB_3(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\n\n\tvoid CompositeSpanARGB_6(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\n\n\tvoid CompositeSpanARGB_7(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\t// ...\n\t/*--------------------------------------------------------------------------------------------------------*/\n\tvoid CompositeSpanRGB32_2(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\tvoid CompositeSpanRGB32_3(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\tvoid CompositeSpanRGB32_6(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\tvoid CompositeSpanRGB32_7(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\t\n\t/*---------------------------------------------------------------------------------------------------------*/\n\n\tvoid CompositeSpanRGB24_2(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\tvoid CompositeSpanRGB24_3(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\tvoid CompositeSpanRGB24_6(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\tvoid CompositeSpanRGB24_7(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\tvoid CompositeSpanRGB24_10(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\tvoid CompositeSpanRGB24_11(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\tvoid CompositeSpanRGB24_14(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\tvoid CompositeSpanRGB24_15(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n\n\t/*----------------------------------------------------------------------------------------------------------*/\n\t\n\t// A general alpha merge function (with clipping mask). Cmyka/Cmyk device.\n\tvoid CompositeSpanCMYK(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan,int Bpp,\n\t\t\tint span_left, int span_len, int span_top, FX_BYTE cover_scan, \n\t\t\tint clip_top, int clip_left, int clip_right, FX_LPBYTE clip_scan, \n\t\t\tFX_LPBYTE dest_extra_alpha_scan);\n   \n\t\n\t//--------------------------------------------------------------------\n\tFX_BOOL Init(CFX_DIBitmap* pDevice, CFX_DIBitmap* pOriDevice, const CFX_ClipRgn* pClipRgn, FX_DWORD color, FX_BOOL bFullCover, FX_BOOL bRgbByteOrder, \n\t\tint alpha_flag = 0, void* pIccTransform = NULL); //The alpha flag must be fill_flag if exist.\n};\nclass CFX_SkiaA8Renderer : public SkBlitter, public CFX_Object\n{\npublic:\n    //--------------------------------------------------------------------\n    virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);\n\tvirtual void blitH(int x, int y, int width); \n\tvirtual void blitV(int x, int y, int height, SkAlpha alpha);\n\tvirtual void blitRect(int x, int y, int width, int height);\n\tvirtual\tvoid blitAntiRect(int x, int y, int width, int height, SkAlpha leftAlpha, SkAlpha rightAlpha);\n\t//--------------------------------------------------------------------\n\tFX_BOOL Init(CFX_DIBitmap* pDevice, int Left, int Top);\n\tCFX_DIBitmap* m_pDevice;\n\tint m_Left;\n\tint m_Top;\n\tint m_dstWidth;\n\tint m_dstHeight;\n};\n#endif\n#endif"
  },
  {
    "path": "core/src/fxge/skia/fx_skia_device.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"../../../include/fxge/fx_ge.h\"\n//#define _SKIA_SUPPORT_\n#if defined(_SKIA_SUPPORT_)\n#include \"../../../include/fxcodec/fx_codec.h\"\n\n\n//#define _FOXIT_DEBUG_\n//#define _FOXIT_BENCHMARK_\n\nextern \"C\" {\n\textern void FX_OUTPUT_LOG_FUNC(const char*, ...);\n\textern int FX_GET_TICK_FUNC();\n};\n\n#ifdef _FOXIT_DEBUG_\n#define FOXIT_DEBUG1(msg) FX_OUTPUT_LOG_FUNC(msg)\n#define FOXIT_DEBUG2(msg,para) FX_OUTPUT_LOG_FUNC(msg,para)\n#define FOXIT_DEBUG3(msg,para1,para2) FX_OUTPUT_LOG_FUNC(msg,para1,para2)\n#define FOXIT_DEBUG4(msg,para1,para2,para3) FX_OUTPUT_LOG_FUNC(msg,para1,para2,para3)\n#define FOXIT_DEBUG5(msg,para1,para2,para3,param4) FX_OUTPUT_LOG_FUNC(msg,para1,para2,para3,param4)\n#else\n#define FOXIT_DEBUG1(msg)\n#define FOXIT_DEBUG2(msg,para)\n#define FOXIT_DEBUG3(msg,para1,para2)\n#define FOXIT_DEBUG4(msg,para1,para2,para3)\n#define FOXIT_DEBUG5(msg,para1,para2,para3,param4)\n#endif\n\n#include \"SkDashPathEffect.h\"\n#include \"SkTLazy.h\"\n#include \"SkScan.h\"\n#include \"SkRasterClip.h\"\n#include \"SkStroke.h\"\n\n\n#include \"fx_skia_blitter_new.h\"\n#include \"../agg/fx_agg_driver.h\"\n#include \"fx_skia_device.h\"\n/// Run-length-encoded supersampling antialiased blitter.\nclass SuperBlitter_skia\n{\npublic:\n\tstatic void DrawPath(const SkPath& srcPath, SkBlitter* blitter,  const SkRasterClip& rect, const SkPaint& origPaint);\n};\nFX_BOOL FxSkDrawTreatAsHairline(const SkPaint& paint, SkScalar* coverage) {\n\tif (SkPaint::kStroke_Style != paint.getStyle())\n\t\treturn FALSE;\n\tFXSYS_assert(coverage);\n\tSkScalar strokeWidth = paint.getStrokeWidth();\n\tif (0 == strokeWidth) {\n\t\t*coverage = SK_Scalar1;\n\t\treturn TRUE;\n\t}\n\t// if we get here, we need to try to fake a thick-stroke with a modulated\n\t// hairline\n\tif (!paint.isAntiAlias())\n\t\treturn FALSE;\n\tif (strokeWidth <= SK_Scalar1) {\n\t\t*coverage = strokeWidth;\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}\n\nvoid SuperBlitter_skia::DrawPath(const SkPath& srcPath, SkBlitter* blitter, const SkRasterClip& rect, const SkPaint& origPaint) \n{\n\tSkPath*\t\tpathPtr = (SkPath*)&srcPath;\n\tbool\t\tdoFill = true;\n\tSkPath\t\ttmpPath;\n\tSkTCopyOnFirstWrite<SkPaint> paint(origPaint);\n\t{\n\t\tSkScalar coverage;\n\t\tif (FxSkDrawTreatAsHairline(origPaint, &coverage)) {\n\t\t\tif (SK_Scalar1 == coverage) {\n\t\t\t\tpaint.writable()->setStrokeWidth(0);\n\t\t\t} else if (1) {//xfermodeSupportsCoverageAsAlpha(xfer), we not use blend mode here, xfer aways NULL.\n\t\t\t\tU8CPU newAlpha;\n\t\t\t\t// this is the old technique, which we preserve for now so\n\t\t\t\t// we don't change previous results (testing)\n\t\t\t\t// the new way seems fine, its just (a tiny bit) different\n\t\t\t\tint scale = (int)SkScalarMul(coverage, 256);\n\t\t\t\tnewAlpha = origPaint.getAlpha() * scale >> 8;\n\t\t\t\tSkPaint* writablePaint = paint.writable();\n\t\t\t\twritablePaint->setStrokeWidth(0);\n\t\t\t\twritablePaint->setAlpha(newAlpha);\n\t\t\t}\n\t\t}\n\t}\n\tif (paint->getPathEffect() || paint->getStyle() != SkPaint::kFill_Style) {\n\t\tSkIRect devBounds = rect.getBounds();\n\t\t// outset to have slop for antialasing and hairlines\n\t\tdevBounds.outset(1, 1);\n\t\tSkRect cullRect = SkRect::Make(devBounds);\n\t\tdoFill = paint->getFillPath(*pathPtr, &tmpPath, &cullRect);\n\t\tpathPtr = &tmpPath;\n\t}\n\t// avoid possibly allocating a new path in transform if we can\n\tSkPath* devPathPtr = pathPtr;\n\tvoid (*proc)(const SkPath&, const SkRasterClip&, SkBlitter*);\n\tif (doFill) {\n\t\tif (paint->isAntiAlias()) {\n\t\t\tproc = SkScan::AntiFillPath;\n\t\t} else {\n\t\t\tproc = SkScan::FillPath;\n\t\t}\n\t} else {\t// hairline\n\t\tif (paint->isAntiAlias()) {\n\t\t\tproc = SkScan::AntiHairPath;\n\t\t} else {\n\t\t\tproc = SkScan::HairPath;\n\t\t}\n\t}\n\tproc(*devPathPtr, rect, blitter);\n}\n\nclass CSkia_PathData : public CFX_Object\n{\npublic:\n\tCSkia_PathData() {}\n\t~CSkia_PathData() {}\n\tSkPath\t\t\tm_PathData;\n\n\tvoid\t\t\tBuildPath(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device);\n};\n\nvoid CSkia_PathData::BuildPath(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device)\n{\n\tconst CFX_PathData* pFPath = pPathData;\n\tint nPoints = pFPath->GetPointCount();\n\tFX_PATHPOINT* pPoints = pFPath->GetPoints();\n\tfor (int i = 0; i < nPoints; i ++) {\n\t\tFX_FIXFLOAT x = pPoints[i].m_PointX, y = pPoints[i].m_PointY;\n\t\tif (pObject2Device) pObject2Device->Transform(x, y);\n\t\tint point_type = pPoints[i].m_Flag & FXPT_TYPE;\n\t\tif (point_type == FXPT_MOVETO) {\n\t\t\tm_PathData.moveTo(x, y);\n\t\t} else if (point_type == FXPT_LINETO) {\n\t\t\tif (pPoints[i-1].m_Flag == FXPT_MOVETO && (i == nPoints-1 || pPoints[i+1].m_Flag == FXPT_MOVETO) &&\n\t\t\t\t\tFXSYS_abs(pPoints[i].m_PointX - pPoints[i-1].m_PointX) < 0.4f && FXSYS_abs(pPoints[i].m_PointY - pPoints[i-1].m_PointY)< 0.4f)\n\t\t\t\t// PDF line includes the destination point, unlike Windows line.\n\t\t\t\t// We received some PDF which actually draws zero length lines. TESTDOC: summer cha show.pdf\n\t\t\t\t// Therefore, we have to extend the line by 0.4 pixel here.\n\t\t\t\t// But only for standalone segment. TESTDOC: bug #1434 - maze.pdf; TESTDOC: bug#1508 di704P_QIG_111.pdf \n\t\t\t\tx += 0.4;\n\t\t\t// TODO: we should actually tell skia vertex generator to process zero length stroked line \n\t\t\t// (only butts are drawn)\n\t\t\tm_PathData.lineTo(x, y);\n\t\t} else if (point_type == FXPT_BEZIERTO) {\n\t\t\tFX_FIXFLOAT x2 = pPoints[i+1].m_PointX, y2 = pPoints[i+1].m_PointY;\n\t\t\tFX_FIXFLOAT x3 = pPoints[i+2].m_PointX, y3 = pPoints[i+2].m_PointY;\n\t\t\tif (pObject2Device){\n\t\t\t\tpObject2Device->Transform(x2, y2);\n\t\t\t\tpObject2Device->Transform(x3, y3);\n\t\t\t}\n\t\t\tm_PathData.cubicTo(x, y, x2, y2, x3, y3);\n\t\t\ti += 2;\n\t\t}\n\t\tif (pPoints[i].m_Flag & FXPT_CLOSEFIGURE) m_PathData.close();\n\t}\n}\n\n// convert a stroking path to scanlines\nstatic void SkRasterizeStroke(SkPaint& spaint, SkPath* dstPathData, SkPath& path_data, \n\t\t\t\t\t const CFX_AffineMatrix* pObject2Device,\n\t\t\t\t\t const CFX_GraphStateData* pGraphState, FX_FIXFLOAT scale = FIX8_ONE, \n\t\t\t\t\t FX_BOOL bStrokeAdjust = FALSE, FX_BOOL bTextMode = FALSE)\n{\n\tSkPaint::Cap cap;\n\tswitch (pGraphState->m_LineCap) {\n\t\tcase CFX_GraphStateData::LineCapRound:\n\t\t\tcap = SkPaint::kRound_Cap;\n\t\t\tbreak;\n\t\tcase CFX_GraphStateData::LineCapSquare:\n\t\t\tcap = SkPaint::kSquare_Cap;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tcap = SkPaint::kButt_Cap;\n\t\t\tbreak;\n\t}\n\tSkPaint::Join join;\n\tswitch (pGraphState->m_LineJoin) {\n\t\tcase CFX_GraphStateData::LineJoinRound:\n\t\t\tjoin = SkPaint::kRound_Join;\n\t\t\tbreak;\n\t\tcase CFX_GraphStateData::LineJoinBevel:\n\t\t\tjoin = SkPaint::kBevel_Join;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tjoin = SkPaint::kMiter_Join;\n\t\t\tbreak;\n\t}\n\tFX_FIXFLOAT width = pGraphState->m_LineWidth*scale;\n\tFX_FIXFLOAT unit = fix32_to_8(fixdiv_8_8_to_32(FIX8_ONE, (pObject2Device->GetXUnit() + pObject2Device->GetYUnit()) / 2));\n\tif (width <= unit) width = unit;\n\n\tif (pGraphState->m_DashArray == NULL) {\n\t\tSkStroke stroker;\n\t\tstroker.setCap(cap);\n\t\tstroker.setJoin(join);\n\t\tstroker.setMiterLimit(pGraphState->m_MiterLimit);\n\t\tstroker.setWidth(width);\n\t\tstroker.setDoFill(FALSE);\n\t\tstroker.strokePath(path_data, dstPathData);\n\t\tSkMatrix smatrix; \n\t\tsmatrix.setAll(pObject2Device->a, pObject2Device->c, pObject2Device->e, pObject2Device->b, pObject2Device->d, pObject2Device->f, 0, 0, 1);\n\t\tdstPathData->transform(smatrix);\n\t} else {\n\t\tint count = (pGraphState->m_DashCount+1)/2;\n\t\tSkScalar* intervals = FX_Alloc(SkScalar, count* sizeof (SkScalar));\n\t\t// Set dash pattern\n\t\tfor (int i = 0; i < count; i ++) {\n\t\t\tFX_FIXFLOAT on = pGraphState->m_DashArray[i*2];\n\t\t\tif (on <= 0.000001f) on = FIX8_ONE/10;\n\t\t\tFX_FIXFLOAT off = i*2+1 == pGraphState->m_DashCount ? on :\n\t\t\t\t\tpGraphState->m_DashArray[i*2+1];\n\t\t\tif (off < 0) off = 0;\t\t\n\t\t\tintervals[i*2]=on*scale;\n\t\t\tintervals[i*2+1]=off*scale;\n\t\t}\n\t\tSkDashPathEffect* pEffect = new SkDashPathEffect(intervals,count*2, pGraphState->m_DashPhase*scale);\n\t\tspaint.setPathEffect(pEffect)->unref();\n\t\tspaint.setStrokeWidth(width);\n\t\tspaint.setStrokeMiter(pGraphState->m_MiterLimit);\n\t\tspaint.setStrokeCap(cap);\n\t\tspaint.setStrokeJoin(join);\n\t\tspaint.getFillPath(path_data, dstPathData);\n\t\tSkMatrix smatrix; \n\t\tsmatrix.setAll(pObject2Device->a, pObject2Device->c, pObject2Device->e, pObject2Device->b, pObject2Device->d, pObject2Device->f, 0, 0, 1);\n\t\tdstPathData->transform(smatrix);\n\t\tFX_Free(intervals);\n\t}\n}\n\nCFX_SkiaDeviceDriver::CFX_SkiaDeviceDriver(CFX_DIBitmap* pBitmap, int dither_bits, FX_BOOL bRgbByteOrder, CFX_DIBitmap* pOriDevice, FX_BOOL bGroupKnockout)\n{\n\tm_pAggDriver = FX_NEW CFX_AggDeviceDriver(pBitmap, dither_bits, bRgbByteOrder, pOriDevice, bGroupKnockout);\n}\nCFX_SkiaDeviceDriver::~CFX_SkiaDeviceDriver()\n{\n\tif (m_pAggDriver) delete m_pAggDriver;\n}\nFX_BOOL CFX_SkiaDeviceDriver::DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,\n\t\tCFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FIXFLOAT font_size, FX_DWORD color, \n\t\tint alpha_flag, void* pIccTransform)\n{\n\treturn m_pAggDriver->DrawDeviceText(nChars, pCharPos, pFont,pCache, pObject2Device, font_size, color, \n\t\talpha_flag, pIccTransform);\n}\nint CFX_SkiaDeviceDriver::GetDeviceCaps(int caps_id)\n{\n\treturn m_pAggDriver->GetDeviceCaps(caps_id);\n}\nvoid CFX_SkiaDeviceDriver::SaveState()\n{\n\tm_pAggDriver->SaveState();\t\n}\n\nvoid CFX_SkiaDeviceDriver::RestoreState(FX_BOOL bKeepSaved)\n{\n\tm_pAggDriver->RestoreState(bKeepSaved);\n}\nvoid CFX_SkiaDeviceDriver::SetClipMask(rasterizer_scanline_aa& rasterizer)\n{\n\tm_pAggDriver->SetClipMask(rasterizer);\n}\nvoid CFX_SkiaDeviceDriver::SetClipMask(SkPath& skPath, SkPaint* spaint)\n{\t\n\tSkIRect clip_box;\n\tclip_box.set(0, 0, fix0_to_8(GetDeviceCaps(FXDC_PIXEL_WIDTH)), fix0_to_8(GetDeviceCaps(FXDC_PIXEL_HEIGHT)));\n\tclip_box.intersect(m_pAggDriver->m_pClipRgn->GetBox().left, m_pAggDriver->m_pClipRgn->GetBox().top,\n\t\tm_pAggDriver->m_pClipRgn->GetBox().right, m_pAggDriver->m_pClipRgn->GetBox().bottom);\n\n\tSkPath* pathPtr = &skPath;\n\n\tSkRect path_rect = skPath.getBounds();\n\n\tclip_box.intersect(FXSYS_floor(path_rect.fLeft), FXSYS_floor(path_rect.fTop), FXSYS_floor(path_rect.fRight)+1, FXSYS_floor(path_rect.fBottom)+1);\n\tCFX_DIBitmapRef mask;\n\tCFX_DIBitmap* pThisLayer = mask.New();\n\tpThisLayer->Create(clip_box.width(), clip_box.height(), FXDIB_8bppMask);\n\tpThisLayer->Clear(0);\n\n\tCFX_SkiaA8Renderer render;\n\trender.Init(pThisLayer, clip_box.fLeft, clip_box.fTop);\n\n\tSkRasterClip rasterClip(clip_box);\n\tSuperBlitter_skia::DrawPath(skPath, (SkBlitter*)&render, rasterClip, *spaint);\n\t\n\t// Finally, we have got the mask that we need, intersect with current clip region\n\tm_pAggDriver->m_pClipRgn->IntersectMaskF(clip_box.fLeft, clip_box.fTop, mask);\n\n}\nFX_BOOL CFX_SkiaDeviceDriver::SetClip_PathFill(const CFX_PathData* pPathData,\t// path info\n\t\t\t\t\t\tconst CFX_AffineMatrix* pObject2Device,\t// optional transformation\n\t\t\t\t\t\tint fill_mode\t// fill mode, WINDING or ALTERNATE\n\t\t\t\t\t\t)\n{\n\tif (m_pAggDriver->m_pClipRgn == NULL)\n\t\tm_pAggDriver->m_pClipRgn = FX_NEW CFX_ClipRgn(GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT));\n\n\tif (pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) {\n\t\tCFX_FloatRect rectf;\n\t\tif (pPathData->IsRect(pObject2Device, &rectf)) {\n\t\t\trectf.Intersect(CFX_FloatRect(0, 0, (FX_FIXFLOAT)GetDeviceCaps(FXDC_PIXEL_WIDTH), (FX_FIXFLOAT)GetDeviceCaps(FXDC_PIXEL_HEIGHT)));\n\t\t\tFX_RECT rect = rectf.GetOutterRect();\n\t\t\tm_pAggDriver->m_pClipRgn->IntersectRect(rect);\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\tCSkia_PathData path_data;\n\tpath_data.BuildPath(pPathData, pObject2Device);\n\tpath_data.m_PathData.close();\n\tpath_data.m_PathData.setFillType((fill_mode&3) == FXFILL_WINDING? SkPath::kWinding_FillType:SkPath::kEvenOdd_FillType);\n\n\tSkPaint spaint;\n\tspaint.setColor(0xffffffff);\n\tspaint.setAntiAlias(TRUE);\n\tspaint.setStyle(SkPaint::kFill_Style);\n\n\tSetClipMask(path_data.m_PathData, &spaint);\n\n\treturn TRUE;\n}\n\nFX_BOOL CFX_SkiaDeviceDriver::SetClip_PathStroke(const CFX_PathData* pPathData,\t// path info\n\t\t\t\t\t\tconst CFX_AffineMatrix* pObject2Device,\t// optional transformation\n\t\t\t\t\t\tconst CFX_GraphStateData* pGraphState\t// graphic state, for pen attributes\n\t\t\t\t\t)\n{\n\tif (m_pAggDriver->m_pClipRgn == NULL)\n\t\tm_pAggDriver->m_pClipRgn = FX_NEW CFX_ClipRgn(GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT));\n\n\t// build path data\n\tCSkia_PathData path_data;\n\tpath_data.BuildPath(pPathData, NULL);\n\tpath_data.m_PathData.setFillType(SkPath::kWinding_FillType);\n\n\tSkPaint spaint;\n\tspaint.setColor(0xffffffff);\n\tspaint.setStyle(SkPaint::kStroke_Style);\n\tspaint.setAntiAlias(TRUE);\n\n\tSkPath dst_path;\n\tSkRasterizeStroke(spaint, &dst_path, path_data.m_PathData, pObject2Device, pGraphState, 1, FALSE, 0);\n\tspaint.setStyle(SkPaint::kFill_Style);\n\tSetClipMask(dst_path, &spaint);\n\t\n\treturn TRUE;\n}\nFX_BOOL CFX_SkiaDeviceDriver::RenderRasterizer(rasterizer_scanline_aa& rasterizer, FX_DWORD color, FX_BOOL bFullCover, FX_BOOL bGroupKnockout,\n\t\t\t\t\t\t\t\t\t\t\t  int alpha_flag, void* pIccTransform)\n{\n\treturn m_pAggDriver->RenderRasterizer(rasterizer, color, bFullCover, bGroupKnockout,alpha_flag, pIccTransform);\n}\nFX_BOOL\tCFX_SkiaDeviceDriver::RenderRasterizerSkia(SkPath& skPath, const SkPaint& origPaint, SkIRect& rect, FX_DWORD color, FX_BOOL bFullCover, FX_BOOL bGroupKnockout, \n\t\t\t\t\t\t\tint alpha_flag, void* pIccTransform, FX_BOOL bFill)\n{\n\tCFX_DIBitmap* pt = bGroupKnockout?m_pAggDriver->GetBackDrop():NULL;\n\tCFX_SkiaRenderer render;\n\tif (!render.Init(m_pAggDriver->m_pBitmap, pt, m_pAggDriver->m_pClipRgn, color, bFullCover, m_pAggDriver->m_bRgbByteOrder, alpha_flag, pIccTransform))\n\t\treturn FALSE;\n\t\n\tSkRasterClip rasterClip(rect);\n\tSuperBlitter_skia::DrawPath(skPath, (SkBlitter*)&render,  rasterClip, origPaint);\n\n\treturn TRUE;\n\t\n}\n\nFX_BOOL\tCFX_SkiaDeviceDriver::DrawPath(const CFX_PathData* pPathData,\t// path info\n\t\t\t\t\t\tconst CFX_AffineMatrix* pObject2Device,\t// optional transformation\n\t\t\t\t\t\tconst CFX_GraphStateData* pGraphState,\t// graphic state, for pen attributes\n\t\t\t\t\t\tFX_DWORD fill_color,\t\t\t// fill color\n\t\t\t\t\t\tFX_DWORD stroke_color,\t\t\t// stroke color\n\t\t\t\t\t\tint fill_mode,\t\t\t\t\t// fill mode, WINDING or ALTERNATE. 0 for not filled\n\t\t\t\t\t\tint alpha_flag, \n\t\t\t\t\t\tvoid* pIccTransform\n\t\t\t\t\t\t)\n{\n\tif (GetBuffer() == NULL) return TRUE;\n\tFOXIT_DEBUG1(\"CFX_SkiaDeviceDriver::DrawPath: entering\");\n\tSkIRect rect;\n\trect.set(0, 0, GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT));\n\tif ((fill_mode & 3) && fill_color) {\n\t\t// We have to transform before building path data, otherwise we'll have flatting problem\n\t\t// when we enlarge a small path (flatten before transformed)\n\t\t// TESTDOC: Bug #5115 - DS_S1Dimpact_lr.pdf \n\t\t// build path data\n\t\tCSkia_PathData path_data;\n\t\tpath_data.BuildPath(pPathData, pObject2Device);\n\t\t//path_data.m_PathData.close();\n\t\tpath_data.m_PathData.setFillType((fill_mode&3) == FXFILL_WINDING? SkPath::kWinding_FillType:SkPath::kEvenOdd_FillType);\n\n\t\tSkPaint spaint;\n\t\tspaint.setAntiAlias(TRUE);\n\t\tspaint.setStyle(SkPaint::kFill_Style);\n\t\tspaint.setColor(fill_color);\n\t\tif (!RenderRasterizerSkia(path_data.m_PathData, spaint, rect, fill_color, fill_mode & FXFILL_FULLCOVER, FALSE, alpha_flag, pIccTransform))\n\t\t\treturn FALSE;\t\n\t}\n\n\tint stroke_alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_STROKE(alpha_flag) : FXARGB_A(stroke_color);\n\n\tif (pGraphState && stroke_alpha) {\n\t\t// We split the matrix into two parts: first part doing the scaling, so we won't have the\n\t\t// flatness problem, second part doing the transformation, so we don't have stroking geo problem.\n\t\t// TESTDOC: Bug #5253 - test[1].pdf \n\t\tCFX_AffineMatrix matrix1, matrix2;\n\t\tif (pObject2Device) {\n\t\t\tmatrix1.a = FXSYS_fabs(pObject2Device->a) > FXSYS_fabs(pObject2Device->b) ?\n\t\t\t\t\tFXSYS_fabs(pObject2Device->a) : FXSYS_fabs(pObject2Device->b);\n\t\t\tmatrix1.d = matrix1.a;//FXSYS_fabs(pObject2Device->c) > FXSYS_fabs(pObject2Device->d) ?\n\t\t\t\t\t//pObject2Device->c : pObject2Device->d;\n\t\t\tmatrix2.Set(pObject2Device->a/matrix1.a, pObject2Device->b/matrix1.a, \n\t\t\t\t\tpObject2Device->c/matrix1.d, pObject2Device->d/matrix1.d, \n\t\t\t\t\tpObject2Device->e, pObject2Device->f);\n\t\t}\n\t\t// build path data\n\t\tCSkia_PathData path_data;\n\t\tpath_data.BuildPath(pPathData, &matrix1);\n\t\tpath_data.m_PathData.setFillType(SkPath::kWinding_FillType);\n\n\t\tSkPaint spaint;\n\t\tspaint.setColor(stroke_color);\n\t\tspaint.setStyle(SkPaint::kStroke_Style);\n\t\tspaint.setAntiAlias(TRUE);\n\t\tSkPath dst_path;\n\t\tSkRasterizeStroke(spaint, &dst_path, path_data.m_PathData, &matrix2, pGraphState, matrix1.a, FALSE, 0);\n\t\tspaint.setStyle(SkPaint::kFill_Style);\n\t\tint fill_flag = FXGETFLAG_COLORTYPE(alpha_flag)<<8 | FXGETFLAG_ALPHA_STROKE(alpha_flag);\n\t\t\n\t\tif (!RenderRasterizerSkia(dst_path, spaint, rect, stroke_color, fill_mode & FXFILL_FULLCOVER, FALSE, fill_flag, pIccTransform, FALSE))\n\t\t\treturn FALSE;\n\t\t\t\n\t}\n\t\n\treturn TRUE;\n}\n\nFX_BOOL CFX_SkiaDeviceDriver::SetPixel(int x, int y, FX_DWORD color,\n\t\t\t\t\t\tint alpha_flag, void* pIccTransform)\n{\n\treturn m_pAggDriver->SetPixel(x, y, color, alpha_flag, pIccTransform);\n}\n\nFX_BOOL CFX_SkiaDeviceDriver::FillRect(const FX_RECT* pRect, FX_DWORD fill_color, int alpha_flag, void* pIccTransform)\n{\n\treturn m_pAggDriver->FillRect(pRect, fill_color, alpha_flag, pIccTransform);\n}\n\nFX_BOOL CFX_SkiaDeviceDriver::GetClipBox(FX_RECT* pRect)\n{\n\treturn m_pAggDriver->GetClipBox(pRect);\n}\n\nFX_BOOL\tCFX_SkiaDeviceDriver::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform, FX_BOOL bDEdge)\n{\n\treturn m_pAggDriver->GetDIBits(pBitmap, left, top, pIccTransform, bDEdge);\n}\n\nFX_BOOL\tCFX_SkiaDeviceDriver::SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD argb, const FX_RECT* pSrcRect, int left, int top, int blend_type, \n\t\t\t\t\t\t\t\t\t   int alpha_flag, void* pIccTransform)\n{\n\treturn m_pAggDriver->SetDIBits(pBitmap, argb, pSrcRect, left, top, blend_type, alpha_flag, pIccTransform);\n}\n\nFX_BOOL\tCFX_SkiaDeviceDriver::StretchDIBits(const CFX_DIBSource* pSource, FX_DWORD argb, int dest_left, int dest_top, \n\t\t\t\t\t\t\tint dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags, \n\t\t\t\t\t\t\tint alpha_flag, void* pIccTransform)\n{\n\treturn m_pAggDriver->StretchDIBits(pSource, argb, dest_left, dest_top, \n\t\t\t\t\t\t\tdest_width, dest_height, pClipRect, flags, \n\t\t\t\t\t\t\talpha_flag, pIccTransform);\n}\n\nFX_BOOL\tCFX_SkiaDeviceDriver::StartDIBits(const CFX_DIBSource* pSource, int bitmap_alpha, FX_DWORD argb, \n\t\t\t\t\t\tconst CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle, \n\t\t\t\t\t\tint alpha_flag, void* pIccTransform)\n{\n\treturn m_pAggDriver->StartDIBits(pSource, bitmap_alpha, argb, \n\t\t\t\t\t\tpMatrix, render_flags, handle, alpha_flag, pIccTransform);\n}\n\nFX_BOOL\tCFX_SkiaDeviceDriver::ContinueDIBits(FX_LPVOID pHandle, IFX_Pause* pPause)\n{\n\treturn m_pAggDriver->ContinueDIBits(pHandle, pPause);\n}\n\nvoid CFX_SkiaDeviceDriver::CancelDIBits(FX_LPVOID pHandle)\n{\n\tm_pAggDriver->CancelDIBits(pHandle);\n}\n\nCFX_SkiaDevice::CFX_SkiaDevice()\n{\n\tm_bOwnedBitmap = FALSE;\n}\n\nFX_BOOL CFX_SkiaDevice::Attach(CFX_DIBitmap* pBitmap, int dither_bits, FX_BOOL bRgbByteOrder, CFX_DIBitmap* pOriDevice, FX_BOOL bGroupKnockout)\n{\n\tif (pBitmap == NULL) \n\t\treturn FALSE;\n\tSetBitmap(pBitmap);\n\tCFX_SkiaDeviceDriver* pDriver = FX_NEW CFX_SkiaDeviceDriver(pBitmap, dither_bits, bRgbByteOrder, pOriDevice, bGroupKnockout);\n\tSetDeviceDriver(pDriver);\n\treturn TRUE;\n}\n\nFX_BOOL CFX_SkiaDevice::Create(int width, int height, FXDIB_Format format, int dither_bits, CFX_DIBitmap* pOriDevice)\n{\n\tm_bOwnedBitmap = TRUE;\n\tCFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;\n\tif (!pBitmap->Create(width, height, format)) {\n\t\tdelete pBitmap;\n\t\treturn FALSE;\n\t} \n\tSetBitmap(pBitmap);\n\tCFX_SkiaDeviceDriver* pDriver =  FX_NEW CFX_SkiaDeviceDriver(pBitmap, dither_bits, FALSE, pOriDevice, FALSE);\n\tSetDeviceDriver(pDriver);\n\treturn TRUE;\n}\nCFX_SkiaDevice::~CFX_SkiaDevice()\n{\n\tif (m_bOwnedBitmap && GetBitmap()) delete GetBitmap();\n}\n\n#endif"
  },
  {
    "path": "core/src/fxge/skia/fx_skia_device.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#ifndef _FX_SKIA_DEVICE_DRIVER_\n#define _FX_SKIA_DEVICE_DRIVER_\n//#define _SKIA_SUPPORT_\n#if defined(_SKIA_SUPPORT_)\nclass CFX_SkiaDeviceDriver : public IFX_RenderDeviceDriver\n{\npublic:\n\tCFX_SkiaDeviceDriver(CFX_DIBitmap* pBitmap, int dither_bits, FX_BOOL bRgbByteOrder, CFX_DIBitmap* pOriDevice, FX_BOOL bGroupKnockout);\n\tvirtual ~CFX_SkiaDeviceDriver();\n\n\t/** Options */\n\tvirtual int\t\t\tGetDeviceCaps(int caps_id);\n\t\n\t/** Save and restore all graphic states */\n\tvirtual void\t\tSaveState();\n\tvirtual void\t\tRestoreState(FX_BOOL bKeepSaved);\n\t\n\t/** Set clipping path using filled region */\n\tvirtual FX_BOOL\t\tSetClip_PathFill(const CFX_PathData* pPathData,\t// path info\n\t\t\t\t\t\t\tconst CFX_AffineMatrix* pObject2Device,\t// optional transformation\n\t\t\t\t\t\t\tint fill_mode\t// fill mode, WINDING or ALTERNATE\n\t\t\t\t\t\t\t);\n\t\n\t/** Set clipping path using stroked region */\n\tvirtual FX_BOOL\t\tSetClip_PathStroke(const CFX_PathData* pPathData,\t// path info\n\t\t\t\t\t\t\tconst CFX_AffineMatrix* pObject2Device,\t// optional transformation\n\t\t\t\t\t\t\tconst CFX_GraphStateData* pGraphState\t// graphic state, for pen attributes\n\t\t\t\t\t\t\t);\n\t\n\t/** Draw a path */\n\tvirtual FX_BOOL\t\tDrawPath(const CFX_PathData* pPathData,\n\t\t\t\t\t\tconst CFX_AffineMatrix* pObject2Device,\n\t\t\t\t\t\tconst CFX_GraphStateData* pGraphState,\n\t\t\t\t\t\tFX_DWORD fill_color,\n\t\t\t\t\t\tFX_DWORD stroke_color,\n\t\t\t\t\t\tint fill_mode,\n\t\t\t\t\t\tint alpha_flag = 0, \n\t\t\t\t\t\tvoid* pIccTransform = NULL\n\t\t\t\t\t\t\t);\n\t\n\tvirtual FX_BOOL\t\tSetPixel(int x, int y, FX_DWORD color,\n\t\t\t\t\t\tint alpha_flag = 0, void* pIccTransform = NULL);\n\t\n\tvirtual FX_BOOL\t\tFillRect(const FX_RECT* pRect, FX_DWORD fill_color, \n\t\t\t\t\t\tint alpha_flag = 0, void* pIccTransform = NULL);\n\t\n\t/** Draw a single pixel (device dependant) line */\n\tvirtual FX_BOOL\t\tDrawCosmeticLine(FX_FIXFLOAT x1, FX_FIXFLOAT y1, FX_FIXFLOAT x2, FX_FIXFLOAT y2, FX_DWORD color, \n\t\t\t\t\t\t\tint alpha_flag, void* pIccTransform, int blend_type) { return FALSE; }\n\t\n\tvirtual FX_BOOL\t\tGetClipBox(FX_RECT* pRect);\n\t\n\t/** Load device buffer into a DIB */\n\tvirtual FX_BOOL\t\tGetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL, FX_BOOL bDEdge = FALSE);\n\n\tvirtual CFX_DIBitmap*   GetBackDrop() { return m_pAggDriver->GetBackDrop(); }\n\t\n\tvirtual FX_BOOL\t\tSetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, \n\t\t\t\t\t\tint dest_left, int dest_top, int blend_type, \n\t\t\t\t\t\tint alpha_flag = 0, void* pIccTransform = NULL);\n\tvirtual FX_BOOL\t\tStretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top, \n\t\t\t\tint dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags, \n\t\t\t\tint alpha_flag = 0, void* pIccTransform = NULL);\n\t\n\tvirtual FX_BOOL\t\tStartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color, \n\t\t\t\tconst CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle, \n\t\t\t\tint alpha_flag = 0, void* pIccTransform = NULL);\n\tvirtual FX_BOOL\t\tContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause);\n\tvirtual void\t\tCancelDIBits(FX_LPVOID handle);\n\t\n\tvirtual FX_BOOL     DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,\n\t\t\t\t\t\tCFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FIXFLOAT font_size, FX_DWORD color, \n\t\t\t\t\t\tint alpha_flag = 0, void* pIccTransform = NULL);\n\t\n\tvirtual FX_BOOL\t\tRenderRasterizer(rasterizer_scanline_aa& rasterizer, FX_DWORD color, FX_BOOL bFullCover, FX_BOOL bGroupKnockout, \n\t\t\t\t\t\t\tint alpha_flag, void* pIccTransform);\n\tvirtual FX_BOOL\t\tRenderRasterizerSkia(SkPath& skPath, const SkPaint& origPaint, SkIRect& rect, FX_DWORD color, FX_BOOL bFullCover, FX_BOOL bGroupKnockout, \n\t\t\t\t\t\t\tint alpha_flag, void* pIccTransform, FX_BOOL bFill = TRUE);\n\tvoid\t\t\t\tSetClipMask(rasterizer_scanline_aa& rasterizer);\n\tvoid\t\t\t\tSetClipMask(SkPath& skPath, SkPaint* spaint);\n\tvirtual\tFX_LPBYTE\tGetBuffer() const {return m_pAggDriver->GetBuffer();}\n\n\tCFX_AggDeviceDriver* m_pAggDriver;\n};\n#endif \n#endif// _FX_SKIA_DEVICE_DRIVER_"
  },
  {
    "path": "core/src/fxge/win32/dwrite_int.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_DIRECT_WRITE_\n#define _FX_DIRECT_WRITE_\n#ifndef DECLSPEC_UUID\n#if (_MSC_VER >= 1100) && defined (__cplusplus)\n#define DECLSPEC_UUID(x)    __declspec(uuid(x))\n#else\n#define DECLSPEC_UUID(x)\n#endif\n#endif\n#ifndef DECLSPEC_NOVTABLE\n#if (_MSC_VER >= 1100) && defined(__cplusplus)\n#define DECLSPEC_NOVTABLE   __declspec(novtable)\n#else\n#define DECLSPEC_NOVTABLE\n#endif\n#endif\n#if(WINVER < 0x0500)\n#ifndef _MAC\nDECLARE_HANDLE(HMONITOR);\n#endif\n#endif\nclass CDWriteExt\n{\npublic:\n    CDWriteExt();\n    ~CDWriteExt();\n\n    void\t\t\tLoad();\n    void            Unload();\n\n    FX_BOOL\t\t\tIsAvailable()\n    {\n        return m_pDWriteFactory != NULL;\n    }\n\n    void*\t\t\tDwCreateFontFaceFromStream(FX_LPBYTE pData, FX_DWORD size, int simulation_style);\n    FX_BOOL         DwCreateRenderingTarget(CFX_DIBitmap* pSrc, void** renderTarget);\n    void            DwDeleteRenderingTarget(void* renderTarget);\n    FX_BOOL\t\t\tDwRendingString(void* renderTarget, CFX_ClipRgn* pClipRgn, FX_RECT& stringRect, CFX_AffineMatrix* pMatrix,\n                                    void *font, FX_FLOAT font_size, FX_ARGB text_color,\n                                    int glyph_count, unsigned short* glyph_indices,\n                                    FX_FLOAT baselineOriginX, FX_FLOAT baselineOriginY,\n                                    void* glyph_offsets,\n                                    FX_FLOAT* glyph_advances);\n    void\t\t\tDwDeleteFont(void* pFont);\n\nprotected:\n    void*\t\t\tm_hModule;\n    void*\t\t\tm_pDWriteFactory;\n    void*\t\t    m_pDwFontContext;\n    void*\t        m_pDwTextRenderer;\n};\n#endif\n"
  },
  {
    "path": "core/src/fxge/win32/fx_win32_device.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxge/fx_ge.h\"\n#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_\n#include \"../../../include/fxge/fx_ge_win32.h\"\n#include <crtdbg.h>\n#include \"../agg/include/fxfx_agg_clip_liang_barsky.h\"\n#include \"dwrite_int.h\"\n#include \"win32_int.h\"\n#include \"../ge/text_int.h\"\n#include \"../dib/dib_int.h\"\n#include \"../agg/include/fx_agg_driver.h\"\n#include \"../../../include/fxge/fx_freetype.h\"\n#include \"../../../include/fxcodec/fx_codec.h\"\nclass CWin32FontInfo FX_FINAL : public IFX_SystemFontInfo\n{\npublic:\n    CWin32FontInfo();\n    ~CWin32FontInfo();\n    virtual void\t\tRelease();\n    virtual\tFX_BOOL\t\tEnumFontList(CFX_FontMapper* pMapper);\n    virtual void*\t\tMapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR face, FX_BOOL& bExact);\n    virtual void*\t\tGetFont(FX_LPCSTR face)\n    {\n        return NULL;\n    }\n    virtual FX_DWORD\tGetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size);\n    virtual void\t\tDeleteFont(void* hFont);\n    virtual\tFX_BOOL\t\tGetFaceName(void* hFont, CFX_ByteString& name);\n    virtual FX_BOOL\t\tGetFontCharset(void* hFont, int& charset);\n    FX_BOOL\t\t\t\tIsOpenTypeFromDiv(const LOGFONTA *plf);\n    FX_BOOL\t\t\t\tIsSupportFontFormDiv(const LOGFONTA* plf);\n    void\t\t\t\tAddInstalledFont(const LOGFONTA *plf, FX_DWORD FontType);\n    void\t\t\t\tGetGBPreference(CFX_ByteString& face, int weight, int picth_family);\n    void\t\t\t\tGetJapanesePreference(CFX_ByteString& face, int weight, int picth_family);\n    CFX_ByteString\t\tFindFont(const CFX_ByteString& name);\n    HDC\t\t\t\t\tm_hDC;\n    CFX_FontMapper*\t\tm_pMapper;\n    CFX_ByteString\t\tm_LastFamily;\n    CFX_ByteString\t\tm_KaiTi, m_FangSong;\n};\nCWin32FontInfo::CWin32FontInfo()\n{\n    m_hDC = CreateCompatibleDC(NULL);\n}\nCWin32FontInfo::~CWin32FontInfo()\n{\n    m_pMapper = NULL;\n}\nvoid CWin32FontInfo::Release()\n{\n    DeleteDC(m_hDC);\n    delete this;\n}\n#define TT_MAKE_TAG(x1, x2, x3, x4) (((FX_DWORD)x1<<24)|((FX_DWORD)x2<<16)|((FX_DWORD)x3<<8)|(FX_DWORD)x4)\nFX_BOOL CWin32FontInfo::IsOpenTypeFromDiv(const LOGFONTA *plf)\n{\n    HFONT hFont = CreateFontIndirectA(plf);\n    FX_BOOL ret = FALSE;\n    FX_DWORD font_size  = GetFontData(hFont, 0, NULL, 0);\n    if (font_size != GDI_ERROR && font_size >= sizeof(FX_DWORD)) {\n        FX_DWORD lVersion = 0;\n        GetFontData(hFont, 0, (FX_BYTE*)(&lVersion), sizeof(FX_DWORD));\n        lVersion = (((FX_DWORD)(FX_BYTE)(lVersion)) << 24) | ((FX_DWORD)((FX_BYTE)(lVersion >> 8))) << 16 |\n                   ((FX_DWORD)((FX_BYTE)(lVersion >> 16))) << 8 | ((FX_BYTE)(lVersion >> 24));\n        if (lVersion == TT_MAKE_TAG('O', 'T', 'T', 'O') ||\n                lVersion == 0x00010000 ||\n                lVersion == TT_MAKE_TAG('t', 't', 'c', 'f') ||\n                lVersion == TT_MAKE_TAG('t', 'r', 'u', 'e') ||\n                lVersion == 0x00020000) {\n            ret = TRUE;\n        }\n    }\n    DeleteFont(hFont);\n    return ret;\n}\nFX_BOOL CWin32FontInfo::IsSupportFontFormDiv(const LOGFONTA* plf)\n{\n    HFONT hFont = CreateFontIndirectA(plf);\n    FX_BOOL ret = FALSE;\n    FX_DWORD font_size  = GetFontData(hFont, 0, NULL, 0);\n    if (font_size != GDI_ERROR && font_size >= sizeof(FX_DWORD)) {\n        FX_DWORD lVersion = 0;\n        GetFontData(hFont, 0, (FX_BYTE*)(&lVersion), sizeof(FX_DWORD));\n        lVersion = (((FX_DWORD)(FX_BYTE)(lVersion)) << 24) | ((FX_DWORD)((FX_BYTE)(lVersion >> 8))) << 16 |\n                   ((FX_DWORD)((FX_BYTE)(lVersion >> 16))) << 8 | ((FX_BYTE)(lVersion >> 24));\n        if (lVersion == TT_MAKE_TAG('O', 'T', 'T', 'O') ||\n                lVersion == 0x00010000 ||\n                lVersion == TT_MAKE_TAG('t', 't', 'c', 'f') ||\n                lVersion == TT_MAKE_TAG('t', 'r', 'u', 'e') ||\n                lVersion == 0x00020000) {\n            ret = TRUE;\n        } else if ((lVersion & 0xFFFF0000) == TT_MAKE_TAG(0x80, 0x01, 0x00, 0x00) ||\n                   (lVersion & 0xFFFF0000) == TT_MAKE_TAG('%', '!', 0, 0)) {\n            ret = TRUE;\n        }\n    }\n    DeleteFont(hFont);\n    return ret;\n}\nvoid CWin32FontInfo::AddInstalledFont(const LOGFONTA *plf, FX_DWORD FontType)\n{\n    CFX_ByteString name(plf->lfFaceName, -1);\n    if (name[0] == '@') {\n        return;\n    }\n    if (name == m_LastFamily) {\n        m_pMapper->AddInstalledFont(name, plf->lfCharSet);\n        return;\n    }\n    if (!(FontType & TRUETYPE_FONTTYPE) && !(FontType & DEVICE_FONTTYPE)) {\n        return;\n    }\n    if (!(FontType & TRUETYPE_FONTTYPE)) {\n        if (!IsSupportFontFormDiv(plf)) {\n            return;\n        }\n    }\n    m_pMapper->AddInstalledFont(name, plf->lfCharSet);\n    m_LastFamily = name;\n}\nstatic int CALLBACK FontEnumProc(\n    const LOGFONTA *plf,\n    const TEXTMETRICA *lpntme,\n    FX_DWORD FontType,\n    LPARAM lParam\n)\n{\n    CWin32FontInfo* pFontInfo = (CWin32FontInfo*)lParam;\n    if (pFontInfo->m_pMapper->GetFontEnumerator()) {\n        pFontInfo->m_pMapper->GetFontEnumerator()->HitFont();\n    }\n    pFontInfo->AddInstalledFont(plf, FontType);\n    return 1;\n}\nFX_BOOL CWin32FontInfo::EnumFontList(CFX_FontMapper* pMapper)\n{\n    m_pMapper = pMapper;\n    LOGFONTA lf;\n    FXSYS_memset32(&lf, 0, sizeof(LOGFONTA));\n    lf.lfCharSet = DEFAULT_CHARSET;\n    lf.lfFaceName[0] = 0;\n    lf.lfPitchAndFamily = 0;\n    EnumFontFamiliesExA(m_hDC, &lf, (FONTENUMPROCA)FontEnumProc, (FX_UINTPTR)this, 0);\n    if (pMapper->GetFontEnumerator()) {\n        pMapper->GetFontEnumerator()->Finish();\n    }\n    return TRUE;\n}\nstatic const struct {\n    FX_LPCSTR\tm_pFaceName;\n    FX_LPCSTR\tm_pVariantName;\n}\nVariantNames[] = {\n    {\"DFKai-SB\", \"\\x19\\x6A\\x77\\x69\\xD4\\x9A\"},\n};\nstatic const struct {\n    FX_LPCSTR\tm_pName;\n    FX_LPCSTR\tm_pWinName;\n    FX_BOOL\t\tm_bBold;\n    FX_BOOL\t\tm_bItalic;\n}\nBase14Substs[] = {\n    {\"Courier\", \"Courier New\", FALSE, FALSE},\n    {\"Courier-Bold\", \"Courier New\", TRUE, FALSE},\n    {\"Courier-BoldOblique\", \"Courier New\", TRUE, TRUE},\n    {\"Courier-Oblique\", \"Courier New\", FALSE, TRUE},\n    {\"Helvetica\", \"Arial\", FALSE, FALSE},\n    {\"Helvetica-Bold\", \"Arial\", TRUE, FALSE},\n    {\"Helvetica-BoldOblique\", \"Arial\", TRUE, TRUE},\n    {\"Helvetica-Oblique\", \"Arial\", FALSE, TRUE},\n    {\"Times-Roman\", \"Times New Roman\", FALSE, FALSE},\n    {\"Times-Bold\", \"Times New Roman\", TRUE, FALSE},\n    {\"Times-BoldItalic\", \"Times New Roman\", TRUE, TRUE},\n    {\"Times-Italic\", \"Times New Roman\", FALSE, TRUE},\n};\nCFX_ByteString CWin32FontInfo::FindFont(const CFX_ByteString& name)\n{\n    if (m_pMapper == NULL) {\n        return name;\n    }\n    int nFonts = m_pMapper->m_InstalledTTFonts.GetSize();\n    for (int i = 0; i < nFonts; i ++) {\n        CFX_ByteString thisname = m_pMapper->m_InstalledTTFonts[i];\n        if (thisname[0] == ' ') {\n            if (thisname.Mid(1, name.GetLength()) == name) {\n                return m_pMapper->m_InstalledTTFonts[i + 1];\n            }\n        } else if (thisname.Left(name.GetLength()) == name) {\n            return m_pMapper->m_InstalledTTFonts[i];\n        }\n    }\n    return CFX_ByteString();\n}\nstruct _FontNameMap {\n    FX_LPCSTR\tm_pSubFontName;\n    FX_LPCSTR\tm_pSrcFontName;\n};\nconst _FontNameMap g_JpFontNameMap[] = {\n    {\"MS Mincho\", \"Heiseimin-W3\"},\n    {\"MS Gothic\", \"Jun101-Light\"},\n};\nextern \"C\" {\n    static int compareString(const void* key, const void* element)\n    {\n        return FXSYS_stricmp((FX_LPCSTR)key, ((_FontNameMap*)element)->m_pSrcFontName);\n    }\n}\nFX_BOOL _GetSubFontName(CFX_ByteString& name)\n{\n    int size = sizeof g_JpFontNameMap;\n    void* pFontnameMap = (void*)g_JpFontNameMap;\n    _FontNameMap* found = (_FontNameMap*)FXSYS_bsearch((FX_LPCSTR)name, pFontnameMap,\n                          size / sizeof (_FontNameMap), sizeof (_FontNameMap), compareString);\n    if (found == NULL) {\n        return FALSE;\n    }\n    name = found->m_pSubFontName;\n    return TRUE;\n}\nvoid CWin32FontInfo::GetGBPreference(CFX_ByteString& face, int weight, int picth_family)\n{\n    if (face.Find(\"KaiTi\") >= 0 || face.Find(\"\\xbf\\xac\") >= 0) {\n        if (m_KaiTi.IsEmpty()) {\n            m_KaiTi = FindFont(\"KaiTi\");\n            if (m_KaiTi.IsEmpty()) {\n                m_KaiTi = \"SimSun\";\n            }\n        }\n        face = m_KaiTi;\n    } else if (face.Find(\"FangSong\") >= 0 || face.Find(\"\\xb7\\xc2\\xcb\\xce\") >= 0) {\n        if (m_FangSong.IsEmpty()) {\n            m_FangSong = FindFont(\"FangSong\");\n            if (m_FangSong.IsEmpty()) {\n                m_FangSong = \"SimSun\";\n            }\n        }\n        face = m_FangSong;\n    } else if (face.Find(\"SimSun\") >= 0 || face.Find(\"\\xcb\\xce\") >= 0) {\n        face = \"SimSun\";\n    } else if (face.Find(\"SimHei\") >= 0 || face.Find(\"\\xba\\xda\") >= 0) {\n        face = \"SimHei\";\n    } else if (!(picth_family & FF_ROMAN) && weight > 550) {\n        face = \"SimHei\";\n    } else {\n        face = \"SimSun\";\n    }\n}\nvoid CWin32FontInfo::GetJapanesePreference(CFX_ByteString& face, int weight, int picth_family)\n{\n    if (face.Find(\"Gothic\") >= 0 || face.Find(\"\\x83\\x53\\x83\\x56\\x83\\x62\\x83\\x4e\") >= 0) {\n        if (face.Find(\"PGothic\") >= 0 || face.Find(\"\\x82\\x6f\\x83\\x53\\x83\\x56\\x83\\x62\\x83\\x4e\") >= 0) {\n            face = \"MS PGothic\";\n        } else if (face.Find(\"UI Gothic\") >= 0) {\n            face = \"MS UI Gothic\";\n        } else {\n            if (face.Find(\"HGSGothicM\") >= 0 || face.Find(\"HGMaruGothicMPRO\") >= 0) {\n                face = \"MS PGothic\";\n            } else {\n                face = \"MS Gothic\";\n            }\n        }\n        return;\n    } else if (face.Find(\"Mincho\") >= 0 || face.Find(\"\\x96\\xbe\\x92\\xa9\") >= 0) {\n        if (face.Find(\"PMincho\") >= 0 || face.Find(\"\\x82\\x6f\\x96\\xbe\\x92\\xa9\") >= 0) {\n            face = \"MS PMincho\";\n        } else {\n            face = \"MS Mincho\";\n        }\n        return;\n    }\n    if (_GetSubFontName(face)) {\n        return;\n    }\n    if (!(picth_family & FF_ROMAN) && weight > 400) {\n        face = \"MS PGothic\";\n    } else {\n        face = \"MS PMincho\";\n    }\n}\nvoid* CWin32FontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR cstr_face, FX_BOOL& bExact)\n{\n    CFX_ByteString face = cstr_face;\n    int iBaseFont;\n    for (iBaseFont = 0; iBaseFont < 12; iBaseFont ++)\n        if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) {\n            face = Base14Substs[iBaseFont].m_pWinName;\n            weight = Base14Substs[iBaseFont].m_bBold ? FW_BOLD : FW_NORMAL;\n            bItalic = Base14Substs[iBaseFont].m_bItalic;\n            bExact = TRUE;\n            break;\n        }\n    if (charset == ANSI_CHARSET || charset == SYMBOL_CHARSET) {\n        charset = DEFAULT_CHARSET;\n    }\n    int subst_pitch_family = pitch_family;\n    switch (charset) {\n        case SHIFTJIS_CHARSET:\n            subst_pitch_family = FF_ROMAN;\n            break;\n        case CHINESEBIG5_CHARSET:\n        case HANGUL_CHARSET:\n        case GB2312_CHARSET:\n            subst_pitch_family = 0;\n            break;\n    }\n    HFONT hFont = ::CreateFontA(-10, 0, 0, 0, weight, bItalic, 0, 0, charset, OUT_TT_ONLY_PRECIS,\n                                0, 0, subst_pitch_family, face);\n    char facebuf[100];\n    HFONT hOldFont = (HFONT)::SelectObject(m_hDC, hFont);\n    int ret = ::GetTextFaceA(m_hDC, 100, facebuf);\n    ::SelectObject(m_hDC, hOldFont);\n    if (face.EqualNoCase(facebuf)) {\n        return hFont;\n    }\n    int iCount = sizeof(VariantNames) / sizeof(VariantNames[0]);\n    for (int i = 0; i < iCount; ++i) {\n        if (face == VariantNames[i].m_pFaceName) {\n            CFX_WideString wsFace = CFX_WideString::FromLocal(facebuf);\n            const unsigned short* pName = (const unsigned short*)VariantNames[i].m_pVariantName;\n            FX_STRSIZE len = CFX_WideString::WStringLength(pName);\n            CFX_WideString wsName = CFX_WideString::FromUTF16LE(pName, len);\n            if (wsFace == wsName) {\n                return hFont;\n            }\n        }\n    }\n    ::DeleteObject(hFont);\n    if (charset == DEFAULT_CHARSET) {\n        return NULL;\n    }\n    switch (charset) {\n        case SHIFTJIS_CHARSET:\n            GetJapanesePreference(face, weight, pitch_family);\n            break;\n        case GB2312_CHARSET:\n            GetGBPreference(face, weight, pitch_family);\n            break;\n        case HANGUL_CHARSET:\n            face = \"Gulim\";\n            break;\n        case CHINESEBIG5_CHARSET:\n            if (face.Find(\"MSung\") >= 0) {\n                face = \"MingLiU\";\n            } else {\n                face = \"PMingLiU\";\n            }\n            break;\n    }\n    hFont = ::CreateFontA(-10, 0, 0, 0, weight, bItalic, 0, 0, charset, OUT_TT_ONLY_PRECIS,\n                          0, 0, subst_pitch_family, face);\n    return hFont;\n}\nvoid CWin32FontInfo::DeleteFont(void* hFont)\n{\n    ::DeleteObject(hFont);\n}\nFX_DWORD CWin32FontInfo::GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size)\n{\n    HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont);\n    table = FXDWORD_FROM_MSBFIRST(table);\n    size = ::GetFontData(m_hDC, table, 0, buffer, size);\n    ::SelectObject(m_hDC, hOldFont);\n    if (size == GDI_ERROR) {\n        return 0;\n    }\n    return size;\n}\nFX_BOOL CWin32FontInfo::GetFaceName(void* hFont, CFX_ByteString& name)\n{\n    char facebuf[100];\n    HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont);\n    int ret = ::GetTextFaceA(m_hDC, 100, facebuf);\n    ::SelectObject(m_hDC, hOldFont);\n    if (ret == 0) {\n        return FALSE;\n    }\n    name = facebuf;\n    return TRUE;\n}\nFX_BOOL CWin32FontInfo::GetFontCharset(void* hFont, int& charset)\n{\n    TEXTMETRIC tm;\n    HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont);\n    ::GetTextMetrics(m_hDC, &tm);\n    ::SelectObject(m_hDC, hOldFont);\n    charset = tm.tmCharSet;\n    return TRUE;\n}\n#ifndef _FPDFAPI_MINI_\nIFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()\n{\n    return FX_NEW CWin32FontInfo;\n}\n#endif\nvoid CFX_GEModule::InitPlatform()\n{\n    CWin32Platform* pPlatformData = FX_NEW CWin32Platform;\n    if (!pPlatformData) {\n        return;\n    }\n    OSVERSIONINFO ver;\n    ver.dwOSVersionInfoSize = sizeof(ver);\n    GetVersionEx(&ver);\n    pPlatformData->m_bHalfTone = ver.dwMajorVersion >= 5;\n    pPlatformData->m_GdiplusExt.Load();\n    m_pPlatformData = pPlatformData;\n    m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault());\n}\nvoid CFX_GEModule::DestroyPlatform()\n{\n    if (m_pPlatformData) {\n        delete (CWin32Platform*)m_pPlatformData;\n    }\n    m_pPlatformData = NULL;\n}\nCGdiDeviceDriver::CGdiDeviceDriver(HDC hDC, int device_class)\n{\n    m_hDC = hDC;\n    m_DeviceClass = device_class;\n    CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();\n    SetStretchBltMode(hDC, pPlatform->m_bHalfTone ? HALFTONE : COLORONCOLOR);\n    if (GetObjectType(m_hDC) == OBJ_MEMDC) {\n        HBITMAP hBitmap = CreateBitmap(1, 1, 1, 1, NULL);\n        hBitmap = (HBITMAP)SelectObject(m_hDC, hBitmap);\n        BITMAP bitmap;\n        GetObject(hBitmap, sizeof bitmap, &bitmap);\n        m_nBitsPerPixel = bitmap.bmBitsPixel;\n        m_Width = bitmap.bmWidth;\n        m_Height = abs(bitmap.bmHeight);\n        hBitmap = (HBITMAP)SelectObject(m_hDC, hBitmap);\n        DeleteObject(hBitmap);\n    } else {\n        m_nBitsPerPixel = ::GetDeviceCaps(m_hDC, BITSPIXEL);\n        m_Width = ::GetDeviceCaps(m_hDC, HORZRES);\n        m_Height = ::GetDeviceCaps(m_hDC, VERTRES);\n    }\n    if (m_DeviceClass != FXDC_DISPLAY) {\n        m_RenderCaps = FXRC_BIT_MASK;\n    } else {\n        m_RenderCaps = FXRC_GET_BITS | FXRC_BIT_MASK;\n    }\n}\nint CGdiDeviceDriver::GetDeviceCaps(int caps_id)\n{\n    switch (caps_id) {\n        case FXDC_DEVICE_CLASS:\n            return m_DeviceClass;\n        case FXDC_PIXEL_WIDTH:\n            return m_Width;\n        case FXDC_PIXEL_HEIGHT:\n            return m_Height;\n        case FXDC_BITS_PIXEL:\n            return m_nBitsPerPixel;\n        case FXDC_RENDER_CAPS:\n            return m_RenderCaps;\n    }\n    return 0;\n}\nFX_LPVOID CGdiDeviceDriver::GetClipRgn()\n{\n    HRGN hClipRgn = CreateRectRgn(0, 0, 1, 1);\n    if (::GetClipRgn(m_hDC, hClipRgn) == 0) {\n        DeleteObject(hClipRgn);\n        hClipRgn = NULL;\n    }\n    return (FX_LPVOID)hClipRgn;\n}\nFX_BOOL CGdiDeviceDriver::GDI_SetDIBits(const CFX_DIBitmap* pBitmap1, const FX_RECT* pSrcRect, int left, int top, void* pIccTransform)\n{\n    if (m_DeviceClass == FXDC_PRINTER) {\n        CFX_DIBitmap* pBitmap = pBitmap1->FlipImage(FALSE, TRUE);\n        if (pBitmap == NULL) {\n            return FALSE;\n        }\n        if ((pBitmap->IsCmykImage() || pIccTransform) &&\n                !pBitmap->ConvertFormat(FXDIB_Rgb, pIccTransform)) {\n            return FALSE;\n        }\n        int width = pSrcRect->Width(), height = pSrcRect->Height();\n        int pitch = pBitmap->GetPitch();\n        LPBYTE pBuffer = pBitmap->GetBuffer();\n        CFX_ByteString info = CFX_WindowsDIB::GetBitmapInfo(pBitmap);\n        ((BITMAPINFOHEADER*)(FX_LPCSTR)info)->biHeight *= -1;\n        FX_RECT dst_rect(0, 0, width, height);\n        dst_rect.Intersect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight());\n        int dst_width = dst_rect.Width();\n        int dst_height = dst_rect.Height();\n        ::StretchDIBits(m_hDC, left, top, dst_width, dst_height,\n                        0, 0, dst_width, dst_height, pBuffer, (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS, SRCCOPY);\n        delete pBitmap;\n    } else {\n        CFX_DIBitmap* pBitmap = (CFX_DIBitmap*)pBitmap1;\n        if ((pBitmap->IsCmykImage() || pIccTransform) &&\n                (pBitmap = pBitmap->CloneConvert(FXDIB_Rgb, NULL, pIccTransform)) == NULL) {\n            return FALSE;\n        }\n        int width = pSrcRect->Width(), height = pSrcRect->Height();\n        int pitch = pBitmap->GetPitch();\n        LPBYTE pBuffer = pBitmap->GetBuffer();\n        CFX_ByteString info = CFX_WindowsDIB::GetBitmapInfo(pBitmap);\n        ::SetDIBitsToDevice(m_hDC, left, top, width, height, pSrcRect->left, pBitmap->GetHeight() - pSrcRect->bottom,\n                            0, pBitmap->GetHeight(), pBuffer, (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS);\n        if (pBitmap != pBitmap1) {\n            delete pBitmap;\n        }\n    }\n    return TRUE;\n}\nFX_BOOL CGdiDeviceDriver::GDI_StretchDIBits(const CFX_DIBitmap* pBitmap1, int dest_left, int dest_top,\n        int dest_width, int dest_height, FX_DWORD flags, void* pIccTransform)\n{\n    CFX_DIBitmap* pBitmap = (CFX_DIBitmap*)pBitmap1;\n    if (pBitmap == NULL) {\n        return FALSE;\n    }\n    if ((pBitmap->IsCmykImage() || pIccTransform) &&\n            !pBitmap->ConvertFormat(FXDIB_Rgb, pIccTransform)) {\n        return FALSE;\n    }\n    CFX_ByteString info = CFX_WindowsDIB::GetBitmapInfo(pBitmap);\n    if (abs(dest_width) * abs(dest_height) < pBitmap1->GetWidth() * pBitmap1->GetHeight() * 4 ||\n            (flags & FXDIB_INTERPOL) || (flags & FXDIB_BICUBIC_INTERPOL)) {\n        SetStretchBltMode(m_hDC, HALFTONE);\n    } else {\n        SetStretchBltMode(m_hDC, COLORONCOLOR);\n    }\n    CFX_DIBitmap* pToStrechBitmap = pBitmap;\n    bool del = false;\n    if (m_DeviceClass == FXDC_PRINTER && (pBitmap->GetWidth() * pBitmap->GetHeight() > abs(dest_width) * abs(dest_height))) {\n        pToStrechBitmap = pBitmap->StretchTo(dest_width, dest_height);\n        del = true;\n    }\n    CFX_ByteString toStrechBitmapInfo = CFX_WindowsDIB::GetBitmapInfo(pToStrechBitmap);\n    ::StretchDIBits(m_hDC, dest_left, dest_top, dest_width, dest_height,\n                    0, 0, pToStrechBitmap->GetWidth(), pToStrechBitmap->GetHeight(), pToStrechBitmap->GetBuffer(),\n                    (BITMAPINFO*)(FX_LPCSTR)toStrechBitmapInfo, DIB_RGB_COLORS, SRCCOPY);\n    if (del) {\n        delete pToStrechBitmap;\n    }\n    return TRUE;\n}\nFX_BOOL CGdiDeviceDriver::GDI_StretchBitMask(const CFX_DIBitmap* pBitmap1, int dest_left, int dest_top,\n        int dest_width, int dest_height, FX_DWORD bitmap_color, FX_DWORD flags,\n        int alpha_flag, void* pIccTransform)\n{\n    CFX_DIBitmap* pBitmap = (CFX_DIBitmap*)pBitmap1;\n    if (pBitmap == NULL) {\n        return FALSE;\n    }\n    _Color2Argb(bitmap_color, bitmap_color, alpha_flag | (1 << 24), pIccTransform);\n    int width = pBitmap->GetWidth(), height = pBitmap->GetHeight();\n    struct {\n        BITMAPINFOHEADER\tbmiHeader;\n        FX_DWORD\t\t\tbmiColors[2];\n    } bmi;\n    FXSYS_memset32(&bmi.bmiHeader, 0, sizeof (BITMAPINFOHEADER));\n    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);\n    bmi.bmiHeader.biBitCount = 1;\n    bmi.bmiHeader.biCompression = BI_RGB;\n    bmi.bmiHeader.biHeight = -height;\n    bmi.bmiHeader.biPlanes = 1;\n    bmi.bmiHeader.biWidth = width;\n    if (m_nBitsPerPixel != 1) {\n        SetStretchBltMode(m_hDC, HALFTONE);\n    }\n    bmi.bmiColors[0] = 0xffffff;\n    bmi.bmiColors[1] = 0;\n    ::StretchDIBits(m_hDC, dest_left, dest_top, dest_width, dest_height,\n                    0, 0, width, height, pBitmap->GetBuffer(), (BITMAPINFO*)&bmi, DIB_RGB_COLORS, SRCAND);\n    return TRUE;\n}\nBOOL CGdiDeviceDriver::GetClipBox(FX_RECT* pRect)\n{\n    return ::GetClipBox(m_hDC, (RECT*)pRect);\n}\nFX_BOOL CGdiDeviceDriver::SetClipRgn(FX_LPVOID hRgn)\n{\n    ::SelectClipRgn(m_hDC, (HRGN)hRgn);\n    return TRUE;\n}\nstatic HPEN _CreatePen(const CFX_GraphStateData* pGraphState, const CFX_AffineMatrix* pMatrix, FX_DWORD argb)\n{\n    FX_FLOAT width;\n    FX_FLOAT scale = 1.f;\n    if (pMatrix)\n        scale = FXSYS_fabs(pMatrix->a) > FXSYS_fabs(pMatrix->b) ?\n                FXSYS_fabs(pMatrix->a) : FXSYS_fabs(pMatrix->b);\n    if (pGraphState) {\n        width = scale * pGraphState->m_LineWidth;\n    } else {\n        width = 1.0f;\n    }\n    FX_DWORD PenStyle = PS_GEOMETRIC;\n    if (width < 1) {\n        width = 1;\n    }\n    if(pGraphState->m_DashCount) {\n        PenStyle |= PS_USERSTYLE;\n    } else {\n        PenStyle |= PS_SOLID;\n    }\n    switch(pGraphState->m_LineCap) {\n        case 0:\n            PenStyle |= PS_ENDCAP_FLAT;\n            break;\n        case 1:\n            PenStyle |= PS_ENDCAP_ROUND;\n            break;\n        case 2:\n            PenStyle |= PS_ENDCAP_SQUARE;\n            break;\n    }\n    switch(pGraphState->m_LineJoin) {\n        case 0:\n            PenStyle |= PS_JOIN_MITER;\n            break;\n        case 1:\n            PenStyle |= PS_JOIN_ROUND;\n            break;\n        case 2:\n            PenStyle |= PS_JOIN_BEVEL;\n            break;\n    }\n    int a;\n    FX_COLORREF rgb;\n    ArgbDecode(argb, a, rgb);\n    LOGBRUSH lb;\n    lb.lbColor = rgb;\n    lb.lbStyle = BS_SOLID;\n    lb.lbHatch = 0;\n    FX_DWORD* pDash = NULL;\n    if (pGraphState->m_DashCount) {\n        pDash = FX_Alloc(FX_DWORD, pGraphState->m_DashCount);\n        if (!pDash) {\n            return NULL;\n        }\n        for (int i = 0; i < pGraphState->m_DashCount; i ++) {\n            pDash[i] = FXSYS_round(pMatrix ? pMatrix->TransformDistance(pGraphState->m_DashArray[i]) : pGraphState->m_DashArray[i]);\n            if (pDash[i] < 1) {\n                pDash[i] = 1;\n            }\n        }\n    }\n    HPEN hPen = ExtCreatePen(PenStyle, (DWORD)FXSYS_ceil(width), &lb, pGraphState->m_DashCount, (const DWORD*)pDash);\n    if (pDash) {\n        FX_Free(pDash);\n    }\n    return hPen;\n}\nstatic HBRUSH _CreateBrush(FX_DWORD argb)\n{\n    int a;\n    FX_COLORREF rgb;\n    ArgbDecode(argb, a, rgb);\n    return CreateSolidBrush(rgb);\n}\nstatic void _SetPathToDC(HDC hDC, const CFX_PathData* pPathData, const CFX_AffineMatrix* pMatrix)\n{\n    BeginPath(hDC);\n    int nPoints = pPathData->GetPointCount();\n    FX_PATHPOINT* pPoints = pPathData->GetPoints();\n    for(int i = 0; i < nPoints; i++) {\n        FX_FLOAT posx = pPoints[i].m_PointX, posy = pPoints[i].m_PointY;\n        if (pMatrix) {\n            pMatrix->Transform(posx, posy);\n        }\n        int screen_x = FXSYS_round(posx), screen_y = FXSYS_round(posy);\n        int point_type = pPoints[i].m_Flag & FXPT_TYPE;\n        if(point_type == PT_MOVETO) {\n            MoveToEx(hDC, screen_x, screen_y, NULL);\n        } else if(point_type == PT_LINETO) {\n            if (pPoints[i].m_PointY == pPoints[i - 1].m_PointY && pPoints[i].m_PointX == pPoints[i - 1].m_PointX) {\n                screen_x ++;\n            }\n            LineTo(hDC, screen_x, screen_y);\n        } else if(point_type == PT_BEZIERTO) {\n            POINT lppt[3];\n            lppt[0].x = screen_x;\n            lppt[0].y = screen_y;\n            posx = pPoints[i + 1].m_PointX;\n            posy = pPoints[i + 1].m_PointY;\n            if (pMatrix) {\n                pMatrix->Transform(posx, posy);\n            }\n            lppt[1].x = FXSYS_round(posx);\n            lppt[1].y = FXSYS_round(posy);\n            posx = pPoints[i + 2].m_PointX;\n            posy = pPoints[i + 2].m_PointY;\n            if (pMatrix) {\n                pMatrix->Transform(posx, posy);\n            }\n            lppt[2].x = FXSYS_round(posx);\n            lppt[2].y = FXSYS_round(posy);\n            PolyBezierTo(hDC, lppt, 3);\n            i += 2;\n        }\n        if (pPoints[i].m_Flag & PT_CLOSEFIGURE) {\n            CloseFigure(hDC);\n        }\n    }\n    EndPath(hDC);\n}\nvoid CGdiDeviceDriver::DrawLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2)\n{\n    int flag1 = (x1 < 0) | ((x1 > m_Width) << 1) | ((y1 < 0) << 2) | ((y1 > m_Height) << 3);\n    int flag2 = (x2 < 0) | ((x2 > m_Width) << 1) | ((y2 < 0) << 2) | ((y2 > m_Height) << 3);\n    if (flag1 & flag2) {\n        return;\n    }\n    if (flag1 || flag2) {\n        agg::rect_base<FX_FLOAT> rect(0.0f, 0.0f, (FX_FLOAT)(m_Width), (FX_FLOAT)(m_Height));\n        FX_FLOAT x[2], y[2];\n        int np = agg::clip_liang_barsky<FX_FLOAT>(x1, y1, x2, y2, rect, x, y);\n        if (np == 0) {\n            return;\n        }\n        if (np == 1) {\n            x2 = x[0];\n            y2 = y[0];\n        } else {\n            x1 = x[0];\n            y1 = y[0];\n            x2 = x[np - 1];\n            y2 = y[np - 1];\n        }\n    }\n    MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), NULL);\n    LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2));\n}\nstatic FX_BOOL _MatrixNoScaled(const CFX_AffineMatrix* pMatrix)\n{\n    return pMatrix->GetA() == 1.0f && pMatrix->GetB() == 0 && pMatrix->GetC() == 0 && pMatrix->GetD() == 1.0f;\n}\nFX_BOOL CGdiDeviceDriver::DrawPath(const CFX_PathData* pPathData,\n                                   const CFX_AffineMatrix* pMatrix,\n                                   const CFX_GraphStateData* pGraphState,\n                                   FX_DWORD fill_color,\n                                   FX_DWORD stroke_color,\n                                   int fill_mode,\n                                   int alpha_flag,\n                                   void* pIccTransform,\n                                   int\tblend_type\n                                  )\n{\n    if (blend_type != FXDIB_BLEND_NORMAL) {\n        return FALSE;\n    }\n    _Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform);\n    _Color2Argb(stroke_color, stroke_color, alpha_flag, pIccTransform);\n    CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();\n    if ((pGraphState == NULL || stroke_color == 0) && !pPlatform->m_GdiplusExt.IsAvailable()) {\n        CFX_FloatRect bbox_f = pPathData->GetBoundingBox();\n        if (pMatrix) {\n            bbox_f.Transform(pMatrix);\n        }\n        FX_RECT bbox = bbox_f.GetInnerRect();\n        if (bbox.Width() <= 0) {\n            return DrawCosmeticLine((FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.top), (FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.bottom + 1), fill_color,\n                                    alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL);\n        } else if (bbox.Height() <= 0) {\n            return DrawCosmeticLine((FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.top), (FX_FLOAT)(bbox.right + 1), (FX_FLOAT)(bbox.top), fill_color,\n                                    alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL);\n        }\n    }\n    int fill_alpha = FXARGB_A(fill_color);\n    int stroke_alpha = FXARGB_A(stroke_color);\n    FX_BOOL bDrawAlpha = (fill_alpha > 0 && fill_alpha < 255) || (stroke_alpha > 0 && stroke_alpha < 255 && pGraphState);\n    if (!pPlatform->m_GdiplusExt.IsAvailable() && bDrawAlpha) {\n        return FALSE;\n    }\n    if (pPlatform->m_GdiplusExt.IsAvailable()) {\n        if (bDrawAlpha || ((m_DeviceClass != FXDC_PRINTER && !(fill_mode & FXFILL_FULLCOVER)) || pGraphState && pGraphState->m_DashCount)) {\n            if ( !((NULL == pMatrix || _MatrixNoScaled(pMatrix)) &&\n                    pGraphState && pGraphState->m_LineWidth == 1.f &&\n                    (pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) &&\n                    pPathData->IsRect()) ) {\n                if (pPlatform->m_GdiplusExt.DrawPath(m_hDC, pPathData, pMatrix, pGraphState, fill_color, stroke_color, fill_mode)) {\n                    return TRUE;\n                }\n            }\n        }\n    }\n    int old_fill_mode = fill_mode;\n    fill_mode &= 3;\n    HPEN hPen = NULL;\n    HBRUSH hBrush = NULL;\n    if (pGraphState && stroke_alpha) {\n        SetMiterLimit(m_hDC, pGraphState->m_MiterLimit, NULL);\n        hPen = _CreatePen(pGraphState, pMatrix, stroke_color);\n        hPen = (HPEN)SelectObject(m_hDC, hPen);\n    }\n    if (fill_mode && fill_alpha) {\n        SetPolyFillMode(m_hDC, fill_mode);\n        hBrush = _CreateBrush(fill_color);\n        hBrush = (HBRUSH)SelectObject(m_hDC, hBrush);\n    }\n    if (pPathData->GetPointCount() == 2 && pGraphState && pGraphState->m_DashCount) {\n        FX_FLOAT x1 = pPathData->GetPointX(0), y1 = pPathData->GetPointY(0);\n        if (pMatrix) {\n            pMatrix->Transform(x1, y1);\n        }\n        FX_FLOAT x2 = pPathData->GetPointX(1), y2 = pPathData->GetPointY(1);\n        if (pMatrix) {\n            pMatrix->Transform(x2, y2);\n        }\n        DrawLine(x1, y1, x2, y2);\n    } else {\n        _SetPathToDC(m_hDC, pPathData, pMatrix);\n        if (pGraphState && stroke_alpha) {\n            if (fill_mode && fill_alpha) {\n                if (old_fill_mode & FX_FILL_TEXT_MODE) {\n                    StrokeAndFillPath(m_hDC);\n                } else {\n                    FillPath(m_hDC);\n                    _SetPathToDC(m_hDC, pPathData, pMatrix);\n                    StrokePath(m_hDC);\n                }\n            } else {\n                StrokePath(m_hDC);\n            }\n        } else if (fill_mode && fill_alpha) {\n            FillPath(m_hDC);\n        }\n    }\n    if (hPen) {\n        hPen = (HPEN)SelectObject(m_hDC, hPen);\n        DeleteObject(hPen);\n    }\n    if (hBrush) {\n        hBrush = (HBRUSH)SelectObject(m_hDC, hBrush);\n        DeleteObject(hBrush);\n    }\n    return TRUE;\n}\nFX_BOOL CGdiDeviceDriver::FillRect(const FX_RECT* pRect, FX_DWORD fill_color, int alpha_flag, void* pIccTransform, int blend_type)\n{\n    if (blend_type != FXDIB_BLEND_NORMAL) {\n        return FALSE;\n    }\n    _Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform);\n    int alpha;\n    FX_COLORREF rgb;\n    ArgbDecode(fill_color, alpha, rgb);\n    if (alpha == 0) {\n        return TRUE;\n    }\n    if (alpha < 255) {\n        return FALSE;\n    }\n    HBRUSH hBrush = CreateSolidBrush(rgb);\n    ::FillRect(m_hDC, (RECT*)pRect, hBrush);\n    DeleteObject(hBrush);\n    return TRUE;\n}\nFX_BOOL CGdiDeviceDriver::SetClip_PathFill(const CFX_PathData* pPathData,\n        const CFX_AffineMatrix* pMatrix,\n        int fill_mode\n                                          )\n{\n    if (pPathData->GetPointCount() == 5) {\n        CFX_FloatRect rectf;\n        if (pPathData->IsRect(pMatrix, &rectf)) {\n            FX_RECT rect = rectf.GetOutterRect();\n            IntersectClipRect(m_hDC, rect.left, rect.top, rect.right, rect.bottom);\n            return TRUE;\n        }\n    }\n    _SetPathToDC(m_hDC, pPathData, pMatrix);\n    SetPolyFillMode(m_hDC, fill_mode & 3);\n    SelectClipPath(m_hDC, RGN_AND);\n    return TRUE;\n}\nFX_BOOL CGdiDeviceDriver::SetClip_PathStroke(const CFX_PathData* pPathData,\n        const CFX_AffineMatrix* pMatrix,\n        const CFX_GraphStateData* pGraphState\n                                            )\n{\n    HPEN hPen = _CreatePen(pGraphState, pMatrix, 0xff000000);\n    hPen = (HPEN)SelectObject(m_hDC, hPen);\n    _SetPathToDC(m_hDC, pPathData, pMatrix);\n    WidenPath(m_hDC);\n    SetPolyFillMode(m_hDC, WINDING);\n    FX_BOOL ret = SelectClipPath(m_hDC, RGN_AND);\n    hPen = (HPEN)SelectObject(m_hDC, hPen);\n    DeleteObject(hPen);\n    return ret;\n}\nFX_BOOL CGdiDeviceDriver::DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,\n        int alpha_flag, void* pIccTransform, int\tblend_type)\n{\n    if (blend_type != FXDIB_BLEND_NORMAL) {\n        return FALSE;\n    }\n    _Color2Argb(color, color, alpha_flag | (1 << 24), pIccTransform);\n    int a;\n    FX_COLORREF rgb;\n    ArgbDecode(color, a, rgb);\n    if (a == 0) {\n        return TRUE;\n    }\n    HPEN hPen = CreatePen(PS_SOLID, 1, rgb);\n    hPen = (HPEN)SelectObject(m_hDC, hPen);\n    MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), NULL);\n    LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2));\n    hPen = (HPEN)SelectObject(m_hDC, hPen);\n    DeleteObject(hPen);\n    return TRUE;\n}\nFX_BOOL CGdiDeviceDriver::DeleteDeviceRgn(FX_LPVOID pRgn)\n{\n    DeleteObject((HGDIOBJ)pRgn);\n    return TRUE;\n}\nCGdiDisplayDriver::CGdiDisplayDriver(HDC hDC) : CGdiDeviceDriver(hDC, FXDC_DISPLAY)\n{\n    CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();\n    if (pPlatform->m_GdiplusExt.IsAvailable()) {\n        m_RenderCaps |= FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE;\n    }\n}\nFX_BOOL CGdiDisplayDriver::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform, FX_BOOL bDEdge)\n{\n    FX_BOOL ret = FALSE;\n    int width = pBitmap->GetWidth();\n    int height = pBitmap->GetHeight();\n    HBITMAP hbmp = CreateCompatibleBitmap(m_hDC, width, height);\n    HDC hDCMemory = CreateCompatibleDC(m_hDC);\n    HBITMAP holdbmp  = (HBITMAP)SelectObject(hDCMemory, hbmp);\n    BitBlt(hDCMemory, 0, 0, width, height, m_hDC, left, top, SRCCOPY);\n    SelectObject(hDCMemory, holdbmp);\n    BITMAPINFO bmi;\n    FXSYS_memset32(&bmi, 0, sizeof bmi);\n    bmi.bmiHeader.biSize = sizeof bmi.bmiHeader;\n    bmi.bmiHeader.biBitCount = pBitmap->GetBPP();\n    bmi.bmiHeader.biHeight = -height;\n    bmi.bmiHeader.biPlanes = 1;\n    bmi.bmiHeader.biWidth = width;\n    if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {\n        pIccTransform = NULL;\n    }\n    if (pBitmap->GetBPP() > 8 && !pBitmap->IsCmykImage() && pIccTransform == NULL) {\n        ret = ::GetDIBits(hDCMemory, hbmp, 0, height, pBitmap->GetBuffer(), &bmi, DIB_RGB_COLORS) == height;\n    } else {\n        CFX_DIBitmap bitmap;\n        if (bitmap.Create(width, height, FXDIB_Rgb)) {\n            bmi.bmiHeader.biBitCount = 24;\n            ::GetDIBits(hDCMemory, hbmp, 0, height, bitmap.GetBuffer(), &bmi, DIB_RGB_COLORS);\n            ret = pBitmap->TransferBitmap(0, 0, width, height, &bitmap, 0, 0, pIccTransform);\n        } else {\n            ret = FALSE;\n        }\n    }\n#ifndef _FPDFAPI_MINI_\n    if (pBitmap->HasAlpha() && ret) {\n        pBitmap->LoadChannel(FXDIB_Alpha, 0xff);\n    }\n#endif\n    DeleteObject(hbmp);\n    DeleteObject(hDCMemory);\n    return ret;\n}\nFX_BOOL CGdiDisplayDriver::SetDIBits(const CFX_DIBSource* pSource, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,\n                                     int alpha_flag, void* pIccTransform)\n{\n    ASSERT(blend_type == FXDIB_BLEND_NORMAL);\n    if (pSource->IsAlphaMask()) {\n        int width = pSource->GetWidth(), height = pSource->GetHeight();\n        int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);\n        FX_BOOL bGDI = pSource->GetBPP() == 1 && alpha == 255;\n        if (!bGDI) {\n            CFX_DIBitmap background;\n            if (!background.Create(width, height, FXDIB_Rgb32) ||\n                    !GetDIBits(&background, left, top, NULL) ||\n                    !background.CompositeMask(0, 0, width, height, pSource, color, 0, 0, FXDIB_BLEND_NORMAL, NULL, FALSE, alpha_flag, pIccTransform)) {\n                return FALSE;\n            }\n            FX_RECT src_rect(0, 0, width, height);\n            return SetDIBits(&background, 0, &src_rect, left, top, FXDIB_BLEND_NORMAL, 0, NULL);\n        }\n        FX_RECT clip_rect(left, top, left + pSrcRect->Width(), top + pSrcRect->Height());\n        return StretchDIBits(pSource, color, left - pSrcRect->left, top - pSrcRect->top, width, height,\n                             &clip_rect, 0, alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL);\n    } else {\n        int width = pSrcRect->Width(), height = pSrcRect->Height();\n        if (pSource->HasAlpha()) {\n            CFX_DIBitmap bitmap;\n            if (!bitmap.Create(width, height, FXDIB_Rgb) ||\n                    !GetDIBits(&bitmap, left, top, NULL) ||\n                    !bitmap.CompositeBitmap(0, 0, width, height, pSource, pSrcRect->left, pSrcRect->top, FXDIB_BLEND_NORMAL, NULL, FALSE, pIccTransform)) {\n                return FALSE;\n            }\n            FX_RECT src_rect(0, 0, width, height);\n            return SetDIBits(&bitmap, 0, &src_rect, left, top, FXDIB_BLEND_NORMAL, 0, NULL);\n        }\n        CFX_DIBExtractor temp(pSource);\n        CFX_DIBitmap* pBitmap = temp;\n        if (pBitmap) {\n            return GDI_SetDIBits(pBitmap, pSrcRect, left, top, pIccTransform);\n        }\n    }\n    return FALSE;\n}\nFX_BOOL CGdiDisplayDriver::UseFoxitStretchEngine(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,\n        int dest_width, int dest_height, const FX_RECT* pClipRect, int render_flags,\n        int alpha_flag, void* pIccTransform, int blend_type)\n{\n    FX_RECT bitmap_clip = *pClipRect;\n    if (dest_width < 0) {\n        dest_left += dest_width;\n    }\n    if (dest_height < 0) {\n        dest_top += dest_height;\n    }\n    bitmap_clip.Offset(-dest_left, -dest_top);\n    CFX_DIBitmap* pStretched = pSource->StretchTo(dest_width, dest_height, render_flags, &bitmap_clip);\n    if (pStretched == NULL) {\n        return TRUE;\n    }\n    FX_RECT src_rect(0, 0, pStretched->GetWidth(), pStretched->GetHeight());\n    FX_BOOL ret = SetDIBits(pStretched, color, &src_rect, pClipRect->left, pClipRect->top, FXDIB_BLEND_NORMAL, alpha_flag, pIccTransform);\n    delete pStretched;\n    return ret;\n}\nFX_BOOL CGdiDisplayDriver::StretchDIBits(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,\n        int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,\n        int alpha_flag, void* pIccTransform, int blend_type)\n{\n    ASSERT(pSource != NULL && pClipRect != NULL);\n    if (flags || dest_width > 10000 || dest_width < -10000 || dest_height > 10000 || dest_height < -10000)\n        return UseFoxitStretchEngine(pSource, color, dest_left, dest_top, dest_width, dest_height,\n                                     pClipRect, flags, alpha_flag, pIccTransform, blend_type);\n    if (pSource->IsAlphaMask()) {\n        FX_RECT image_rect;\n        image_rect.left = dest_width > 0 ? dest_left : dest_left + dest_width;\n        image_rect.right = dest_width > 0 ? dest_left + dest_width : dest_left;\n        image_rect.top = dest_height > 0 ? dest_top : dest_top + dest_height;\n        image_rect.bottom = dest_height > 0 ? dest_top + dest_height : dest_top;\n        FX_RECT clip_rect = image_rect;\n        clip_rect.Intersect(*pClipRect);\n        clip_rect.Offset(-image_rect.left, -image_rect.top);\n        int clip_width = clip_rect.Width(), clip_height = clip_rect.Height();\n        CFX_DIBitmap* pStretched = pSource->StretchTo(dest_width, dest_height, flags, &clip_rect);\n        if (pStretched == NULL) {\n            return TRUE;\n        }\n        CFX_DIBitmap background;\n        if (!background.Create(clip_width, clip_height, FXDIB_Rgb32) ||\n                !GetDIBits(&background, image_rect.left + clip_rect.left, image_rect.top + clip_rect.top, NULL) ||\n                !background.CompositeMask(0, 0, clip_width, clip_height, pStretched, color, 0, 0, FXDIB_BLEND_NORMAL, NULL, FALSE, alpha_flag, pIccTransform)) {\n            delete pStretched;\n            return FALSE;\n        }\n        FX_RECT src_rect(0, 0, clip_width, clip_height);\n        FX_BOOL ret = SetDIBits(&background, 0, &src_rect, image_rect.left + clip_rect.left, image_rect.top + clip_rect.top, FXDIB_BLEND_NORMAL, 0, NULL);\n        delete pStretched;\n        return ret;\n    } else {\n        if (pSource->HasAlpha()) {\n            CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();\n            if (pPlatform->m_GdiplusExt.IsAvailable() && pIccTransform == NULL && !pSource->IsCmykImage()) {\n                CFX_DIBExtractor temp(pSource);\n                CFX_DIBitmap* pBitmap = temp;\n                if (pBitmap == NULL) {\n                    return FALSE;\n                }\n                return pPlatform->m_GdiplusExt.StretchDIBits(m_hDC, pBitmap, dest_left, dest_top, dest_width, dest_height, pClipRect, flags);\n            }\n            return UseFoxitStretchEngine(pSource, color, dest_left, dest_top, dest_width, dest_height,\n                                         pClipRect, flags, alpha_flag, pIccTransform, blend_type);\n        }\n        CFX_DIBExtractor temp(pSource);\n        CFX_DIBitmap* pBitmap = temp;\n        if (pBitmap) {\n            return GDI_StretchDIBits(pBitmap, dest_left, dest_top, dest_width, dest_height, flags, pIccTransform);\n        }\n    }\n    return FALSE;\n}\n#define GET_PS_FEATURESETTING        4121\n#define FEATURESETTING_PSLEVEL       2\nint GetPSLevel(HDC hDC)\n{\n    int device_type = ::GetDeviceCaps(hDC, TECHNOLOGY);\n    if (device_type != DT_RASPRINTER) {\n        return 0;\n    }\n    FX_DWORD esc = GET_PS_FEATURESETTING;\n    if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) {\n        int param = FEATURESETTING_PSLEVEL;\n        if (ExtEscape(hDC, GET_PS_FEATURESETTING, sizeof(int), (char*)&param, sizeof(int), (char*)&param) > 0) {\n            return param;\n        }\n    }\n    esc = POSTSCRIPT_IDENTIFY;\n    if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL) == 0) {\n        esc = POSTSCRIPT_DATA;\n        if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) {\n            return 2;\n        }\n        return 0;\n    }\n    esc = PSIDENT_GDICENTRIC;\n    if (ExtEscape(hDC, POSTSCRIPT_IDENTIFY, sizeof(FX_DWORD), (char*)&esc, 0, NULL) <= 0) {\n        return 2;\n    }\n    esc = GET_PS_FEATURESETTING;\n    if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) {\n        int param = FEATURESETTING_PSLEVEL;\n        if (ExtEscape(hDC, GET_PS_FEATURESETTING, sizeof(int), (char*)&param, sizeof(int), (char*)&param) > 0) {\n            return param;\n        }\n    }\n    return 2;\n}\nint CFX_WindowsDevice::m_psLevel = 2;\nCFX_WindowsDevice::CFX_WindowsDevice(HDC hDC, FX_BOOL bCmykOutput, FX_BOOL bForcePSOutput, int psLevel)\n{\n    m_bForcePSOutput = bForcePSOutput;\n    m_psLevel = psLevel;\n    if (bForcePSOutput) {\n        IFX_RenderDeviceDriver* pDriver = FX_NEW CPSPrinterDriver;\n        if (!pDriver) {\n            return;\n        }\n        ((CPSPrinterDriver*)pDriver)->Init(hDC, psLevel, bCmykOutput);\n        SetDeviceDriver(pDriver);\n        return;\n    }\n    SetDeviceDriver(CreateDriver(hDC, bCmykOutput));\n}\nHDC CFX_WindowsDevice::GetDC() const\n{\n    IFX_RenderDeviceDriver *pRDD = GetDeviceDriver();\n    if (!pRDD) {\n        return NULL;\n    }\n    return (HDC)pRDD->GetPlatformSurface();\n}\nIFX_RenderDeviceDriver* CFX_WindowsDevice::CreateDriver(HDC hDC, FX_BOOL bCmykOutput)\n{\n    int device_type = ::GetDeviceCaps(hDC, TECHNOLOGY);\n    int obj_type = ::GetObjectType(hDC);\n    int device_class;\n    if (device_type == DT_RASPRINTER || device_type == DT_PLOTTER || obj_type == OBJ_ENHMETADC) {\n        device_class = FXDC_PRINTER;\n    } else {\n        device_class = FXDC_DISPLAY;\n    }\n#ifndef _FPDFAPI_MINI_\n    if (device_class == FXDC_PRINTER) {\n        return FX_NEW CGdiPrinterDriver(hDC);\n    }\n#endif\n    return FX_NEW CGdiDisplayDriver(hDC);\n}\nCFX_WinBitmapDevice::CFX_WinBitmapDevice(int width, int height, FXDIB_Format format)\n{\n    BITMAPINFOHEADER bmih;\n    FXSYS_memset32(&bmih, 0, sizeof (BITMAPINFOHEADER));\n    bmih.biSize = sizeof(BITMAPINFOHEADER);\n    bmih.biBitCount = format & 0xff;\n    bmih.biHeight = -height;\n    bmih.biPlanes = 1;\n    bmih.biWidth = width;\n    FX_LPBYTE pBuffer;\n    m_hBitmap = CreateDIBSection(NULL, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, (FX_LPVOID*)&pBuffer, NULL, 0);\n    if (m_hBitmap == NULL) {\n        return;\n    }\n    CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;\n    if (!pBitmap) {\n        return;\n    }\n    pBitmap->Create(width, height, format, pBuffer);\n    SetBitmap(pBitmap);\n    m_hDC = ::CreateCompatibleDC(NULL);\n    m_hOldBitmap = (HBITMAP)SelectObject(m_hDC, m_hBitmap);\n    IFX_RenderDeviceDriver* pDriver = FX_NEW CGdiDisplayDriver(m_hDC);\n    if (!pDriver) {\n        return;\n    }\n    SetDeviceDriver(pDriver);\n}\nCFX_WinBitmapDevice::~CFX_WinBitmapDevice()\n{\n    if (m_hDC) {\n        SelectObject(m_hDC, m_hOldBitmap);\n        DeleteDC(m_hDC);\n    }\n    if (m_hBitmap) {\n        DeleteObject(m_hBitmap);\n    }\n    delete GetBitmap();\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/win32/fx_win32_dib.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxge/fx_ge.h\"\n#if _FX_OS_ == _FX_WIN32_DESKTOP_ ||  _FX_OS_ == _FX_WIN64_\n#include <windows.h>\n#include \"../../../include/fxge/fx_ge_win32.h\"\n#include \"win32_int.h\"\nCFX_ByteString CFX_WindowsDIB::GetBitmapInfo(const CFX_DIBitmap* pBitmap)\n{\n    CFX_ByteString result;\n    int len = sizeof (BITMAPINFOHEADER);\n    if (pBitmap->GetBPP() == 1 || pBitmap->GetBPP() == 8) {\n        len += sizeof (DWORD) * (int)(1 << pBitmap->GetBPP());\n    }\n    BITMAPINFOHEADER* pbmih = (BITMAPINFOHEADER*)result.GetBuffer(len);\n    FXSYS_memset32(pbmih, 0, sizeof (BITMAPINFOHEADER));\n    pbmih->biSize = sizeof(BITMAPINFOHEADER);\n    pbmih->biBitCount = pBitmap->GetBPP();\n    pbmih->biCompression = BI_RGB;\n    pbmih->biHeight = -(int)pBitmap->GetHeight();\n    pbmih->biPlanes = 1;\n    pbmih->biWidth = pBitmap->GetWidth();\n    if (pBitmap->GetBPP() == 8) {\n        FX_DWORD* pPalette = (FX_DWORD*)(pbmih + 1);\n        if (pBitmap->GetPalette() == NULL) {\n            for (int i = 0; i < 256; i ++) {\n                pPalette[i] = i * 0x010101;\n            }\n        } else {\n            for (int i = 0; i < 256; i ++) {\n                pPalette[i] = pBitmap->GetPalette()[i];\n            }\n        }\n    }\n    if (pBitmap->GetBPP() == 1) {\n        FX_DWORD* pPalette = (FX_DWORD*)(pbmih + 1);\n        if (pBitmap->GetPalette() == NULL) {\n            pPalette[0] = 0;\n            pPalette[1] = 0xffffff;\n        } else {\n            pPalette[0] = pBitmap->GetPalette()[0];\n            pPalette[1] = pBitmap->GetPalette()[1];\n        }\n    }\n    result.ReleaseBuffer(len);\n    return result;\n}\nCFX_DIBitmap* _FX_WindowsDIB_LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData, FX_BOOL bAlpha)\n{\n    int width = pbmi->bmiHeader.biWidth;\n    int height = pbmi->bmiHeader.biHeight;\n    BOOL bBottomUp = TRUE;\n    if (height < 0) {\n        height = -height;\n        bBottomUp = FALSE;\n    }\n    int pitch = (width * pbmi->bmiHeader.biBitCount + 31) / 32 * 4;\n    CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;\n    if (!pBitmap) {\n        return NULL;\n    }\n    FXDIB_Format format = bAlpha ? (FXDIB_Format)(pbmi->bmiHeader.biBitCount + 0x200) : (FXDIB_Format)pbmi->bmiHeader.biBitCount;\n    FX_BOOL ret = pBitmap->Create(width, height, format);\n    if (!ret) {\n        delete pBitmap;\n        return NULL;\n    }\n    FXSYS_memcpy32(pBitmap->GetBuffer(), pData, pitch * height);\n    if (bBottomUp) {\n        FX_LPBYTE temp_buf = FX_Alloc(FX_BYTE, pitch);\n        if (!temp_buf) {\n            if (pBitmap) {\n                delete pBitmap;\n            }\n            return NULL;\n        }\n        int top = 0, bottom = height - 1;\n        while (top < bottom) {\n            FXSYS_memcpy32(temp_buf, pBitmap->GetBuffer() + top * pitch, pitch);\n            FXSYS_memcpy32(pBitmap->GetBuffer() + top * pitch, pBitmap->GetBuffer() + bottom * pitch, pitch);\n            FXSYS_memcpy32(pBitmap->GetBuffer() + bottom * pitch, temp_buf, pitch);\n            top ++;\n            bottom --;\n        }\n        FX_Free(temp_buf);\n        temp_buf = NULL;\n    }\n    if (pbmi->bmiHeader.biBitCount == 1) {\n        for (int i = 0; i < 2; i ++) {\n            pBitmap->SetPaletteEntry(i, ((FX_DWORD*)pbmi->bmiColors)[i] | 0xff000000);\n        }\n    } else if (pbmi->bmiHeader.biBitCount == 8) {\n        for (int i = 0; i < 256; i ++) {\n            pBitmap->SetPaletteEntry(i, ((FX_DWORD*)pbmi->bmiColors)[i] | 0xff000000);\n        }\n    }\n    return pBitmap;\n}\nCFX_DIBitmap* CFX_WindowsDIB::LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData)\n{\n    return _FX_WindowsDIB_LoadFromBuf(pbmi, pData, FALSE);\n}\nHBITMAP\tCFX_WindowsDIB::GetDDBitmap(const CFX_DIBitmap* pBitmap, HDC hDC)\n{\n    CFX_ByteString info = GetBitmapInfo(pBitmap);\n    HBITMAP hBitmap = NULL;\n    hBitmap = CreateDIBitmap(hDC, (BITMAPINFOHEADER*)(FX_LPCSTR)info, CBM_INIT,\n                             pBitmap->GetBuffer(), (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS);\n    return hBitmap;\n}\nvoid GetBitmapSize(HBITMAP hBitmap, int& w, int& h)\n{\n    BITMAP bmp;\n    GetObject(hBitmap, sizeof bmp, &bmp);\n    w = bmp.bmWidth;\n    h = bmp.bmHeight;\n}\nCFX_DIBitmap* CFX_WindowsDIB::LoadFromFile(FX_LPCWSTR filename)\n{\n    CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();\n    if (pPlatform->m_GdiplusExt.IsAvailable()) {\n        WINDIB_Open_Args_ args;\n        args.flags = WINDIB_OPEN_PATHNAME;\n        args.path_name = filename;\n        return pPlatform->m_GdiplusExt.LoadDIBitmap(args);\n    }\n    HBITMAP hBitmap = (HBITMAP)LoadImageW(NULL, (wchar_t*)filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);\n    if (hBitmap == NULL) {\n        return NULL;\n    }\n    HDC hDC = CreateCompatibleDC(NULL);\n    int width, height;\n    GetBitmapSize(hBitmap, width, height);\n    CFX_DIBitmap* pDIBitmap = FX_NEW CFX_DIBitmap;\n    if (!pDIBitmap) {\n        DeleteDC(hDC);\n        return NULL;\n    }\n    if (!pDIBitmap->Create(width, height, FXDIB_Rgb)) {\n        delete pDIBitmap;\n        DeleteDC(hDC);\n        return NULL;\n    }\n    CFX_ByteString info = GetBitmapInfo(pDIBitmap);\n    int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS);\n    if (!ret) {\n        if (pDIBitmap) {\n            delete pDIBitmap;\n        }\n        pDIBitmap = NULL;\n    }\n    DeleteDC(hDC);\n    return pDIBitmap;\n}\nCFX_DIBitmap* CFX_WindowsDIB::LoadDIBitmap(WINDIB_Open_Args_ args)\n{\n    CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();\n    if (pPlatform->m_GdiplusExt.IsAvailable()) {\n        return pPlatform->m_GdiplusExt.LoadDIBitmap(args);\n    } else if (args.flags == WINDIB_OPEN_MEMORY) {\n        return NULL;\n    }\n    HBITMAP hBitmap = (HBITMAP)LoadImageW(NULL, (wchar_t*)args.path_name, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);\n    if (hBitmap == NULL) {\n        return NULL;\n    }\n    HDC hDC = CreateCompatibleDC(NULL);\n    int width, height;\n    GetBitmapSize(hBitmap, width, height);\n    CFX_DIBitmap* pDIBitmap = FX_NEW CFX_DIBitmap;\n    if (!pDIBitmap) {\n        DeleteDC(hDC);\n        return NULL;\n    }\n    if (!pDIBitmap->Create(width, height, FXDIB_Rgb)) {\n        delete pDIBitmap;\n        DeleteDC(hDC);\n        return NULL;\n    }\n    CFX_ByteString info = GetBitmapInfo(pDIBitmap);\n    int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS);\n    if (!ret) {\n        if (pDIBitmap) {\n            delete pDIBitmap;\n        }\n        pDIBitmap = NULL;\n    }\n    DeleteDC(hDC);\n    return pDIBitmap;\n}\nCFX_DIBitmap* CFX_WindowsDIB::LoadFromDDB(HDC hDC, HBITMAP hBitmap, FX_DWORD* pPalette, FX_DWORD palsize)\n{\n    FX_BOOL bCreatedDC = hDC == NULL;\n    if (hDC == NULL) {\n        hDC = CreateCompatibleDC(NULL);\n    }\n    BITMAPINFOHEADER bmih;\n    FXSYS_memset32(&bmih, 0, sizeof bmih);\n    bmih.biSize = sizeof bmih;\n    GetDIBits(hDC, hBitmap, 0, 0, NULL, (BITMAPINFO*)&bmih, DIB_RGB_COLORS);\n    int width = bmih.biWidth;\n    int height = abs(bmih.biHeight);\n    bmih.biHeight = -height;\n    bmih.biCompression = BI_RGB;\n    CFX_DIBitmap* pDIBitmap = FX_NEW CFX_DIBitmap;\n    if (!pDIBitmap) {\n        return NULL;\n    }\n    int ret = 0;\n    if (bmih.biBitCount == 1 || bmih.biBitCount == 8) {\n        int size = sizeof (BITMAPINFOHEADER) + 8;\n        if (bmih.biBitCount == 8) {\n            size += sizeof (FX_DWORD) * 254;\n        }\n        BITMAPINFO* pbmih = (BITMAPINFO*)FX_Alloc(FX_BYTE, size);\n        if (!pbmih) {\n            delete pDIBitmap;\n            if (bCreatedDC) {\n                DeleteDC(hDC);\n            }\n            return NULL;\n        }\n        pbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);\n        pbmih->bmiHeader.biBitCount = bmih.biBitCount;\n        pbmih->bmiHeader.biCompression = BI_RGB;\n        pbmih->bmiHeader.biHeight = -height;\n        pbmih->bmiHeader.biPlanes = 1;\n        pbmih->bmiHeader.biWidth = bmih.biWidth;\n        if (!pDIBitmap->Create(bmih.biWidth, height, bmih.biBitCount == 1 ? FXDIB_1bppRgb : FXDIB_8bppRgb)) {\n            delete pDIBitmap;\n            FX_Free(pbmih);\n            if (bCreatedDC) {\n                DeleteDC(hDC);\n            }\n            return NULL;\n        }\n        ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)pbmih, DIB_RGB_COLORS);\n        FX_Free(pbmih);\n        pbmih = NULL;\n        pDIBitmap->CopyPalette(pPalette, palsize);\n    } else {\n        if (bmih.biBitCount <= 24) {\n            bmih.biBitCount = 24;\n        } else {\n            bmih.biBitCount = 32;\n        }\n        if (!pDIBitmap->Create(bmih.biWidth, height, bmih.biBitCount == 24 ? FXDIB_Rgb : FXDIB_Rgb32)) {\n            delete pDIBitmap;\n            if (bCreatedDC) {\n                DeleteDC(hDC);\n            }\n            return NULL;\n        }\n        ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)&bmih, DIB_RGB_COLORS);\n        if (ret != 0 && bmih.biBitCount == 32) {\n            int pitch = pDIBitmap->GetPitch();\n            for (int row = 0; row < height; row ++) {\n                FX_BYTE* dest_scan = (FX_BYTE*)(pDIBitmap->GetBuffer() + row * pitch);\n                for (int col = 0; col < width; col++) {\n                    dest_scan[3] = 255;\n                    dest_scan += 4;\n                }\n            }\n        }\n    }\n    if (ret == 0) {\n        if (pDIBitmap) {\n            delete pDIBitmap;\n        }\n        pDIBitmap = NULL;\n    }\n    if (bCreatedDC) {\n        DeleteDC(hDC);\n    }\n    return pDIBitmap;\n}\nCFX_WindowsDIB::CFX_WindowsDIB(HDC hDC, int width, int height)\n{\n    Create(width, height, FXDIB_Rgb, (FX_LPBYTE)1);\n    BITMAPINFOHEADER bmih;\n    FXSYS_memset32(&bmih, 0, sizeof bmih);\n    bmih.biSize = sizeof bmih;\n    bmih.biBitCount = 24;\n    bmih.biHeight = -height;\n    bmih.biPlanes = 1;\n    bmih.biWidth = width;\n    m_hBitmap = CreateDIBSection(hDC, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, (LPVOID*)&m_pBuffer, NULL, 0);\n    m_hMemDC = CreateCompatibleDC(hDC);\n    m_hOldBitmap = (HBITMAP)SelectObject(m_hMemDC, m_hBitmap);\n}\nCFX_WindowsDIB::~CFX_WindowsDIB()\n{\n    SelectObject(m_hMemDC, m_hOldBitmap);\n    DeleteDC(m_hMemDC);\n    DeleteObject(m_hBitmap);\n}\nvoid CFX_WindowsDIB::LoadFromDevice(HDC hDC, int left, int top)\n{\n    ::BitBlt(m_hMemDC, 0, 0, m_Width, m_Height, hDC, left, top, SRCCOPY);\n}\nvoid CFX_WindowsDIB::SetToDevice(HDC hDC, int left, int top)\n{\n    ::BitBlt(hDC, left, top, m_Width, m_Height, m_hMemDC, 0, 0, SRCCOPY);\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/win32/fx_win32_dwrite.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxge/fx_ge.h\"\n#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_\n#include \"../../../include/fxge/fx_ge_win32.h\"\n#include \"dwrite_int.h\"\n#include <dwrite.h>\ntypedef HRESULT  (__stdcall *FuncType_DWriteCreateFactory)(__in DWRITE_FACTORY_TYPE, __in REFIID, __out IUnknown **);\ntemplate <typename InterfaceType>\ninline void SafeRelease(InterfaceType** currentObject)\n{\n    if (*currentObject != NULL) {\n        (*currentObject)->Release();\n        *currentObject = NULL;\n    }\n}\ntemplate <typename InterfaceType>\ninline InterfaceType* SafeAcquire(InterfaceType* newObject)\n{\n    if (newObject != NULL) {\n        newObject->AddRef();\n    }\n    return newObject;\n}\nclass CDwFontFileStream FX_FINAL : public IDWriteFontFileStream, public CFX_Object\n{\npublic:\n    explicit CDwFontFileStream(void const* fontFileReferenceKey, UINT32 fontFileReferenceKeySize);\n    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppvObject);\n    virtual ULONG   STDMETHODCALLTYPE AddRef();\n    virtual ULONG   STDMETHODCALLTYPE Release();\n    virtual HRESULT STDMETHODCALLTYPE ReadFileFragment(void const** fragmentStart, UINT64 fileOffset, UINT64 fragmentSize, OUT void** fragmentContext);\n    virtual void    STDMETHODCALLTYPE ReleaseFileFragment(void* fragmentContext);\n    virtual HRESULT STDMETHODCALLTYPE GetFileSize(OUT UINT64* fileSize);\n    virtual HRESULT STDMETHODCALLTYPE GetLastWriteTime(OUT UINT64* lastWriteTime);\n    bool IsInitialized()\n    {\n        return resourcePtr_ != NULL;\n    }\nprivate:\n    ULONG refCount_;\n    void const* resourcePtr_;\n    DWORD resourceSize_;\n};\nclass CDwFontFileLoader FX_FINAL : public IDWriteFontFileLoader, public CFX_Object\n{\npublic:\n    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppvObject);\n    virtual ULONG STDMETHODCALLTYPE AddRef();\n    virtual ULONG STDMETHODCALLTYPE Release();\n    virtual HRESULT STDMETHODCALLTYPE CreateStreamFromKey(void const* fontFileReferenceKey, UINT32 fontFileReferenceKeySize, OUT IDWriteFontFileStream** fontFileStream);\n\n    static IDWriteFontFileLoader* GetLoader()\n    {\n        if (instance_ == NULL) {\n            instance_ = FX_NEW CDwFontFileLoader();\n            return instance_;\n        }\n        return instance_;\n    }\n    static bool IsLoaderInitialized()\n    {\n        return instance_ != NULL;\n    }\nprivate:\n    CDwFontFileLoader();\n    ULONG refCount_;\n    static IDWriteFontFileLoader* instance_;\n};\nclass CDwFontContext : public CFX_Object\n{\npublic:\n    CDwFontContext(IDWriteFactory* dwriteFactory);\n    ~CDwFontContext();\n    HRESULT Initialize();\nprivate:\n    CDwFontContext(CDwFontContext const&);\n    void operator=(CDwFontContext const&);\n    HRESULT hr_;\n    IDWriteFactory* dwriteFactory_;\n};\nclass CDwGdiTextRenderer : public CFX_Object\n{\npublic:\n    CDwGdiTextRenderer(\n        CFX_DIBitmap* pBitmap,\n        IDWriteBitmapRenderTarget* bitmapRenderTarget,\n        IDWriteRenderingParams* renderingParams\n    );\n    CDwGdiTextRenderer::~CDwGdiTextRenderer();\n    HRESULT STDMETHODCALLTYPE DrawGlyphRun(\n        const FX_RECT& text_bbox,\n        __in_opt CFX_ClipRgn* pClipRgn,\n        __in_opt DWRITE_MATRIX const* pMatrix,\n        FLOAT baselineOriginX,\n        FLOAT baselineOriginY,\n        DWRITE_MEASURING_MODE measuringMode,\n        __in DWRITE_GLYPH_RUN const* glyphRun,\n        const COLORREF& textColor\n    );\nprivate:\n    CFX_DIBitmap* pBitmap_;\n    IDWriteBitmapRenderTarget* pRenderTarget_;\n    IDWriteRenderingParams* pRenderingParams_;\n};\nCDWriteExt::CDWriteExt()\n{\n    m_hModule = NULL;\n    m_pDWriteFactory = NULL;\n    m_pDwFontContext = NULL;\n    m_pDwTextRenderer = NULL;\n}\nvoid CDWriteExt::Load()\n{\n}\nvoid CDWriteExt::Unload()\n{\n    if (m_pDwFontContext) {\n        delete (CDwFontContext*)m_pDwFontContext;\n        m_pDwFontContext = NULL;\n    }\n    SafeRelease((IDWriteFactory**)&m_pDWriteFactory);\n}\nCDWriteExt::~CDWriteExt()\n{\n    Unload();\n}\nLPVOID\tCDWriteExt::DwCreateFontFaceFromStream(FX_LPBYTE pData, FX_DWORD size, int simulation_style)\n{\n    IDWriteFactory* pDwFactory = (IDWriteFactory*)m_pDWriteFactory;\n    IDWriteFontFile* pDwFontFile = NULL;\n    IDWriteFontFace* pDwFontFace = NULL;\n    BOOL isSupportedFontType = FALSE;\n    DWRITE_FONT_FILE_TYPE fontFileType;\n    DWRITE_FONT_FACE_TYPE fontFaceType;\n    UINT32 numberOfFaces;\n    DWRITE_FONT_SIMULATIONS fontStyle = (DWRITE_FONT_SIMULATIONS)(simulation_style & 3);\n    HRESULT hr = S_OK;\n    hr = pDwFactory->CreateCustomFontFileReference(\n             (void const*)pData,\n             (UINT32)size,\n             CDwFontFileLoader::GetLoader(),\n             &pDwFontFile\n         );\n    if (FAILED(hr)) {\n        goto failed;\n    }\n    hr = pDwFontFile->Analyze(\n             &isSupportedFontType,\n             &fontFileType,\n             &fontFaceType,\n             &numberOfFaces\n         );\n    if (FAILED(hr) || !isSupportedFontType || fontFaceType == DWRITE_FONT_FACE_TYPE_UNKNOWN) {\n        goto failed;\n    }\n    hr = pDwFactory->CreateFontFace(\n             fontFaceType,\n             1,\n             &pDwFontFile,\n             0,\n             fontStyle,\n             &pDwFontFace\n         );\n    if (FAILED(hr)) {\n        goto failed;\n    }\n    SafeRelease(&pDwFontFile);\n    return pDwFontFace;\nfailed:\n    SafeRelease(&pDwFontFile);\n    return NULL;\n}\nFX_BOOL CDWriteExt::DwCreateRenderingTarget(CFX_DIBitmap* pBitmap, void** renderTarget)\n{\n    if (pBitmap->GetFormat() > FXDIB_Argb) {\n        return FALSE;\n    }\n    IDWriteFactory* pDwFactory = (IDWriteFactory*)m_pDWriteFactory;\n    IDWriteGdiInterop* pGdiInterop = NULL;\n    IDWriteBitmapRenderTarget* pBitmapRenderTarget = NULL;\n    IDWriteRenderingParams* pRenderingParams = NULL;\n    HRESULT hr = S_OK;\n    hr = pDwFactory->GetGdiInterop(&pGdiInterop);\n    if (FAILED(hr)) {\n        goto failed;\n    }\n    hr = pGdiInterop->CreateBitmapRenderTarget(NULL, pBitmap->GetWidth(), pBitmap->GetHeight(),\n            &pBitmapRenderTarget);\n    if (FAILED(hr)) {\n        goto failed;\n    }\n    hr = pDwFactory->CreateCustomRenderingParams(\n             1.0f,\n             0.0f,\n             1.0f,\n             DWRITE_PIXEL_GEOMETRY_RGB,\n             DWRITE_RENDERING_MODE_DEFAULT,\n             &pRenderingParams\n         );\n    if (FAILED(hr)) {\n        goto failed;\n    }\n    hr = pBitmapRenderTarget->SetPixelsPerDip(1.0f);\n    if (FAILED(hr)) {\n        goto failed;\n    }\n    *(CDwGdiTextRenderer**)renderTarget = FX_NEW CDwGdiTextRenderer(pBitmap, pBitmapRenderTarget, pRenderingParams);\n    if (*(CDwGdiTextRenderer**)renderTarget == NULL) {\n        goto failed;\n    }\n    SafeRelease(&pGdiInterop);\n    SafeRelease(&pBitmapRenderTarget);\n    SafeRelease(&pRenderingParams);\n    return TRUE;\nfailed:\n    SafeRelease(&pGdiInterop);\n    SafeRelease(&pBitmapRenderTarget);\n    SafeRelease(&pRenderingParams);\n    return FALSE;\n}\nFX_BOOL\tCDWriteExt::DwRendingString(void* renderTarget, CFX_ClipRgn* pClipRgn, FX_RECT& stringRect, CFX_AffineMatrix* pMatrix,\n                                    void *font, FX_FLOAT font_size, FX_ARGB text_color,\n                                    int glyph_count, unsigned short* glyph_indices,\n                                    FX_FLOAT baselineOriginX, FX_FLOAT baselineOriginY,\n                                    void* glyph_offsets,\n                                    FX_FLOAT* glyph_advances)\n{\n    if (renderTarget == NULL) {\n        return TRUE;\n    }\n    CDwGdiTextRenderer* pTextRenderer = (CDwGdiTextRenderer*)renderTarget;\n    DWRITE_MATRIX transform;\n    DWRITE_GLYPH_RUN glyphRun;\n    HRESULT hr = S_OK;\n    if (pMatrix) {\n        transform.m11 = pMatrix->a;\n        transform.m12 = pMatrix->b;\n        transform.m21 = pMatrix->c;\n        transform.m22 = pMatrix->d;\n        transform.dx = pMatrix->e;\n        transform.dy = pMatrix->f;\n    }\n    glyphRun.fontFace = (IDWriteFontFace*)font;\n    glyphRun.fontEmSize = font_size;\n    glyphRun.glyphCount = glyph_count;\n    glyphRun.glyphIndices = glyph_indices;\n    glyphRun.glyphAdvances = glyph_advances;\n    glyphRun.glyphOffsets = (DWRITE_GLYPH_OFFSET*)glyph_offsets;\n    glyphRun.isSideways = FALSE;\n    glyphRun.bidiLevel = 0;\n    hr = pTextRenderer->DrawGlyphRun(\n             stringRect,\n             pClipRgn,\n             pMatrix ? &transform : NULL,\n             baselineOriginX, baselineOriginY,\n             DWRITE_MEASURING_MODE_NATURAL,\n             &glyphRun,\n             RGB(FXARGB_R(text_color), FXARGB_G(text_color), FXARGB_B(text_color))\n         );\n    return SUCCEEDED(hr) ? TRUE : FALSE;\n}\nvoid CDWriteExt::DwDeleteRenderingTarget(void* renderTarget)\n{\n    if (renderTarget) {\n        delete (CDwGdiTextRenderer*)renderTarget;\n    }\n}\nvoid CDWriteExt::DwDeleteFont(void* pFont)\n{\n    if (pFont) {\n        SafeRelease((IDWriteFontFace**)&pFont);\n    }\n}\nCDwFontFileStream::CDwFontFileStream(void const* fontFileReferenceKey, UINT32 fontFileReferenceKeySize)\n{\n    refCount_ = 0;\n    resourcePtr_ = fontFileReferenceKey;\n    resourceSize_ = fontFileReferenceKeySize;\n}\nHRESULT STDMETHODCALLTYPE CDwFontFileStream::QueryInterface(REFIID iid, void** ppvObject)\n{\n    if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileStream)) {\n        *ppvObject = this;\n        AddRef();\n        return S_OK;\n    } else {\n        *ppvObject = NULL;\n        return E_NOINTERFACE;\n    }\n}\nULONG STDMETHODCALLTYPE CDwFontFileStream::AddRef()\n{\n    return InterlockedIncrement((long*)(&refCount_));\n}\nULONG STDMETHODCALLTYPE CDwFontFileStream::Release()\n{\n    ULONG newCount = InterlockedDecrement((long*)(&refCount_));\n    if (newCount == 0) {\n        delete this;\n    }\n    return newCount;\n}\nHRESULT STDMETHODCALLTYPE CDwFontFileStream::ReadFileFragment(\n    void const** fragmentStart,\n    UINT64 fileOffset,\n    UINT64 fragmentSize,\n    OUT void** fragmentContext\n)\n{\n    if (fileOffset <= resourceSize_ &&\n            fragmentSize <= resourceSize_ - fileOffset) {\n        *fragmentStart = static_cast<FX_BYTE const*>(resourcePtr_) + static_cast<size_t>(fileOffset);\n        *fragmentContext = NULL;\n        return S_OK;\n    } else {\n        *fragmentStart = NULL;\n        *fragmentContext = NULL;\n        return E_FAIL;\n    }\n}\nvoid STDMETHODCALLTYPE CDwFontFileStream::ReleaseFileFragment(void* fragmentContext)\n{\n}\nHRESULT STDMETHODCALLTYPE CDwFontFileStream::GetFileSize(OUT UINT64* fileSize)\n{\n    *fileSize = resourceSize_;\n    return S_OK;\n}\nHRESULT STDMETHODCALLTYPE CDwFontFileStream::GetLastWriteTime(OUT UINT64* lastWriteTime)\n{\n    *lastWriteTime = 0;\n    return E_NOTIMPL;\n}\nIDWriteFontFileLoader* CDwFontFileLoader::instance_ = NULL;\nCDwFontFileLoader::CDwFontFileLoader() :\n    refCount_(0)\n{\n}\nHRESULT STDMETHODCALLTYPE CDwFontFileLoader::QueryInterface(REFIID iid, void** ppvObject)\n{\n    if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileLoader)) {\n        *ppvObject = this;\n        AddRef();\n        return S_OK;\n    } else {\n        *ppvObject = NULL;\n        return E_NOINTERFACE;\n    }\n}\nULONG STDMETHODCALLTYPE CDwFontFileLoader::AddRef()\n{\n    return InterlockedIncrement((long*)(&refCount_));\n}\nULONG STDMETHODCALLTYPE CDwFontFileLoader::Release()\n{\n    ULONG newCount = InterlockedDecrement((long*)(&refCount_));\n    if (newCount == 0) {\n        instance_ = NULL;\n        delete this;\n    }\n    return newCount;\n}\nHRESULT STDMETHODCALLTYPE CDwFontFileLoader::CreateStreamFromKey(\n    void const* fontFileReferenceKey,\n    UINT32 fontFileReferenceKeySize,\n    OUT IDWriteFontFileStream** fontFileStream\n)\n{\n    *fontFileStream = NULL;\n    CDwFontFileStream* stream = FX_NEW CDwFontFileStream(fontFileReferenceKey, fontFileReferenceKeySize);\n    if (stream == NULL)\t{\n        return E_OUTOFMEMORY;\n    }\n    if (!stream->IsInitialized()) {\n        delete stream;\n        return E_FAIL;\n    }\n    *fontFileStream = SafeAcquire(stream);\n    return S_OK;\n}\nCDwFontContext::CDwFontContext(IDWriteFactory* dwriteFactory) :\n    hr_(S_FALSE),\n    dwriteFactory_(SafeAcquire(dwriteFactory))\n{\n}\nCDwFontContext::~CDwFontContext()\n{\n    if(dwriteFactory_ && hr_ == S_OK) {\n        dwriteFactory_->UnregisterFontFileLoader(CDwFontFileLoader::GetLoader());\n    }\n    SafeRelease(&dwriteFactory_);\n}\nHRESULT CDwFontContext::Initialize()\n{\n    if (hr_ == S_FALSE) {\n        return hr_ = dwriteFactory_->RegisterFontFileLoader(CDwFontFileLoader::GetLoader());\n    }\n    return hr_;\n}\nCDwGdiTextRenderer::CDwGdiTextRenderer(CFX_DIBitmap* pBitmap, IDWriteBitmapRenderTarget* bitmapRenderTarget, IDWriteRenderingParams* renderingParams):\n    pBitmap_(pBitmap),\n    pRenderTarget_(SafeAcquire(bitmapRenderTarget)),\n    pRenderingParams_(SafeAcquire(renderingParams))\n{\n}\nCDwGdiTextRenderer::~CDwGdiTextRenderer()\n{\n    SafeRelease(&pRenderTarget_);\n    SafeRelease(&pRenderingParams_);\n}\nSTDMETHODIMP CDwGdiTextRenderer::DrawGlyphRun(\n    const FX_RECT& text_bbox,\n    __in_opt CFX_ClipRgn* pClipRgn,\n    __in_opt DWRITE_MATRIX const* pMatrix,\n    FLOAT baselineOriginX,\n    FLOAT baselineOriginY,\n    DWRITE_MEASURING_MODE measuringMode,\n    __in DWRITE_GLYPH_RUN const* glyphRun,\n    const COLORREF& textColor\n)\n{\n    HRESULT hr = S_OK;\n    if (pMatrix) {\n        hr = pRenderTarget_->SetCurrentTransform(pMatrix);\n        if (FAILED(hr)) {\n            return hr;\n        }\n    }\n    HDC hDC = pRenderTarget_->GetMemoryDC();\n    HBITMAP hBitmap = (HBITMAP)::GetCurrentObject(hDC, OBJ_BITMAP);\n    BITMAP bitmap;\n    GetObject(hBitmap, sizeof bitmap, &bitmap);\n    CFX_DIBitmap dib;\n    dib.Create(\n        bitmap.bmWidth,\n        bitmap.bmHeight,\n        bitmap.bmBitsPixel == 24 ? FXDIB_Rgb : FXDIB_Rgb32,\n        (FX_LPBYTE)bitmap.bmBits\n    );\n    dib.CompositeBitmap(\n        text_bbox.left,\n        text_bbox.top,\n        text_bbox.Width(),\n        text_bbox.Height(),\n        pBitmap_,\n        text_bbox.left,\n        text_bbox.top,\n        FXDIB_BLEND_NORMAL,\n        NULL\n    );\n    hr = pRenderTarget_->DrawGlyphRun(\n             baselineOriginX,\n             baselineOriginY,\n             measuringMode,\n             glyphRun,\n             pRenderingParams_,\n             textColor\n         );\n    if (FAILED(hr)) {\n        return hr;\n    }\n    pBitmap_->CompositeBitmap(\n        text_bbox.left,\n        text_bbox.top,\n        text_bbox.Width(),\n        text_bbox.Height(),\n        &dib,\n        text_bbox.left,\n        text_bbox.top,\n        FXDIB_BLEND_NORMAL,\n        pClipRgn\n    );\n    return hr;\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/win32/fx_win32_gdipext.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxge/fx_ge.h\"\n#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_\n#include <windows.h>\n#include <gdiplus.h>\n#include \"../../../include/fxge/fx_ge_win32.h\"\n#include \"win32_int.h\"\nusing namespace Gdiplus;\nusing namespace Gdiplus::DllExports;\n#define GdiFillType2Gdip(fill_type) (fill_type == ALTERNATE ? FillModeAlternate : FillModeWinding)\nstatic CombineMode GdiCombineMode2Gdip(int mode)\n{\n    switch (mode) {\n        case RGN_AND:\n            return CombineModeIntersect;\n    }\n    return CombineModeIntersect;\n}\nenum {\n    FuncId_GdipCreatePath2,\n    FuncId_GdipSetPenDashStyle,\n    FuncId_GdipSetPenDashArray,\n    FuncId_GdipSetPenDashCap197819,\n    FuncId_GdipSetPenLineJoin,\n    FuncId_GdipSetPenWidth,\n    FuncId_GdipCreateFromHDC,\n    FuncId_GdipSetPageUnit,\n    FuncId_GdipSetSmoothingMode,\n    FuncId_GdipCreateSolidFill,\n    FuncId_GdipFillPath,\n    FuncId_GdipDeleteBrush,\n    FuncId_GdipCreatePen1,\n    FuncId_GdipSetPenMiterLimit,\n    FuncId_GdipDrawPath,\n    FuncId_GdipDeletePen,\n    FuncId_GdipDeletePath,\n    FuncId_GdipDeleteGraphics,\n    FuncId_GdipCreateBitmapFromFileICM,\n    FuncId_GdipCreateBitmapFromStreamICM,\n    FuncId_GdipGetImageHeight,\n    FuncId_GdipGetImageWidth,\n    FuncId_GdipGetImagePixelFormat,\n    FuncId_GdipBitmapLockBits,\n    FuncId_GdipGetImagePaletteSize,\n    FuncId_GdipGetImagePalette,\n    FuncId_GdipBitmapUnlockBits,\n    FuncId_GdipDisposeImage,\n    FuncId_GdipFillRectangle,\n    FuncId_GdipCreateBitmapFromScan0,\n    FuncId_GdipSetImagePalette,\n    FuncId_GdipSetInterpolationMode,\n    FuncId_GdipDrawImagePointsI,\n    FuncId_GdipCreateBitmapFromGdiDib,\n    FuncId_GdiplusStartup,\n    FuncId_GdipDrawLineI,\n    FuncId_GdipResetClip,\n    FuncId_GdipCreatePath,\n    FuncId_GdipAddPathPath,\n    FuncId_GdipSetPathFillMode,\n    FuncId_GdipSetClipPath,\n    FuncId_GdipGetClip,\n    FuncId_GdipCreateRegion,\n    FuncId_GdipGetClipBoundsI,\n    FuncId_GdipSetClipRegion,\n    FuncId_GdipWidenPath,\n    FuncId_GdipAddPathLine,\n    FuncId_GdipAddPathRectangle,\n    FuncId_GdipDeleteRegion,\n    FuncId_GdipGetDC,\n    FuncId_GdipReleaseDC,\n    FuncId_GdipSetPenLineCap197819,\n    FuncId_GdipSetPenDashOffset,\n    FuncId_GdipResetPath,\n    FuncId_GdipCreateRegionPath,\n    FuncId_GdipCreateFont,\n    FuncId_GdipGetFontSize,\n    FuncId_GdipCreateFontFamilyFromName,\n    FuncId_GdipSetTextRenderingHint,\n    FuncId_GdipDrawDriverString,\n    FuncId_GdipCreateMatrix2,\n    FuncId_GdipDeleteMatrix,\n    FuncId_GdipSetWorldTransform,\n    FuncId_GdipResetWorldTransform,\n    FuncId_GdipDeleteFontFamily,\n    FuncId_GdipDeleteFont,\n    FuncId_GdipNewPrivateFontCollection,\n    FuncId_GdipDeletePrivateFontCollection,\n    FuncId_GdipPrivateAddMemoryFont,\n    FuncId_GdipGetFontCollectionFamilyList,\n    FuncId_GdipGetFontCollectionFamilyCount,\n    FuncId_GdipSetTextContrast,\n    FuncId_GdipSetPixelOffsetMode,\n    FuncId_GdipGetImageGraphicsContext,\n    FuncId_GdipDrawImageI,\n    FuncId_GdipDrawImageRectI,\n    FuncId_GdipDrawString,\n    FuncId_GdipSetPenTransform,\n};\nstatic LPCSTR g_GdipFuncNames[] = {\n    \"GdipCreatePath2\",\n    \"GdipSetPenDashStyle\",\n    \"GdipSetPenDashArray\",\n    \"GdipSetPenDashCap197819\",\n    \"GdipSetPenLineJoin\",\n    \"GdipSetPenWidth\",\n    \"GdipCreateFromHDC\",\n    \"GdipSetPageUnit\",\n    \"GdipSetSmoothingMode\",\n    \"GdipCreateSolidFill\",\n    \"GdipFillPath\",\n    \"GdipDeleteBrush\",\n    \"GdipCreatePen1\",\n    \"GdipSetPenMiterLimit\",\n    \"GdipDrawPath\",\n    \"GdipDeletePen\",\n    \"GdipDeletePath\",\n    \"GdipDeleteGraphics\",\n    \"GdipCreateBitmapFromFileICM\",\n    \"GdipCreateBitmapFromStreamICM\",\n    \"GdipGetImageHeight\",\n    \"GdipGetImageWidth\",\n    \"GdipGetImagePixelFormat\",\n    \"GdipBitmapLockBits\",\n    \"GdipGetImagePaletteSize\",\n    \"GdipGetImagePalette\",\n    \"GdipBitmapUnlockBits\",\n    \"GdipDisposeImage\",\n    \"GdipFillRectangle\",\n    \"GdipCreateBitmapFromScan0\",\n    \"GdipSetImagePalette\",\n    \"GdipSetInterpolationMode\",\n    \"GdipDrawImagePointsI\",\n    \"GdipCreateBitmapFromGdiDib\",\n    \"GdiplusStartup\",\n    \"GdipDrawLineI\",\n    \"GdipResetClip\",\n    \"GdipCreatePath\",\n    \"GdipAddPathPath\",\n    \"GdipSetPathFillMode\",\n    \"GdipSetClipPath\",\n    \"GdipGetClip\",\n    \"GdipCreateRegion\",\n    \"GdipGetClipBoundsI\",\n    \"GdipSetClipRegion\",\n    \"GdipWidenPath\",\n    \"GdipAddPathLine\",\n    \"GdipAddPathRectangle\",\n    \"GdipDeleteRegion\",\n    \"GdipGetDC\",\n    \"GdipReleaseDC\",\n    \"GdipSetPenLineCap197819\",\n    \"GdipSetPenDashOffset\",\n    \"GdipResetPath\",\n    \"GdipCreateRegionPath\",\n    \"GdipCreateFont\",\n    \"GdipGetFontSize\",\n    \"GdipCreateFontFamilyFromName\",\n    \"GdipSetTextRenderingHint\",\n    \"GdipDrawDriverString\",\n    \"GdipCreateMatrix2\",\n    \"GdipDeleteMatrix\",\n    \"GdipSetWorldTransform\",\n    \"GdipResetWorldTransform\",\n    \"GdipDeleteFontFamily\",\n    \"GdipDeleteFont\",\n    \"GdipNewPrivateFontCollection\",\n    \"GdipDeletePrivateFontCollection\",\n    \"GdipPrivateAddMemoryFont\",\n    \"GdipGetFontCollectionFamilyList\",\n    \"GdipGetFontCollectionFamilyCount\",\n    \"GdipSetTextContrast\",\n    \"GdipSetPixelOffsetMode\",\n    \"GdipGetImageGraphicsContext\",\n    \"GdipDrawImageI\",\n    \"GdipDrawImageRectI\",\n    \"GdipDrawString\",\n    \"GdipSetPenTransform\",\n};\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipCreatePath2)(GDIPCONST GpPointF*, GDIPCONST BYTE*, INT, GpFillMode, GpPath **path);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashStyle)(GpPen *pen, GpDashStyle dashstyle);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashArray)(GpPen *pen, GDIPCONST REAL *dash, INT count);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashCap197819)(GpPen *pen, GpDashCap dashCap);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenLineJoin)(GpPen *pen, GpLineJoin lineJoin);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenWidth)(GpPen *pen, REAL width);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipCreateFromHDC)(HDC hdc, GpGraphics **graphics);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipSetPageUnit)(GpGraphics *graphics, GpUnit unit);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipSetSmoothingMode)(GpGraphics *graphics, SmoothingMode smoothingMode);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipCreateSolidFill)(ARGB color, GpSolidFill **brush);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipFillPath)(GpGraphics *graphics, GpBrush *brush, GpPath *path);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteBrush)(GpBrush *brush);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipCreatePen1)(ARGB color, REAL width, GpUnit unit, GpPen **pen);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenMiterLimit)(GpPen *pen, REAL miterLimit);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipDrawPath)(GpGraphics *graphics, GpPen *pen, GpPath *path);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipDeletePen)(GpPen *pen);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipDeletePath)(GpPath* path);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteGraphics)(GpGraphics *graphics);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromFileICM)(GDIPCONST WCHAR* filename, GpBitmap **bitmap);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromStreamICM)(IStream* stream, GpBitmap **bitmap);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipGetImageWidth)(GpImage *image, UINT *width);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipGetImageHeight)(GpImage *image, UINT *height);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipGetImagePixelFormat)(GpImage *image, PixelFormat *format);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipBitmapLockBits)(GpBitmap* bitmap, GDIPCONST GpRect* rect, UINT flags, PixelFormat format, BitmapData* lockedBitmapData);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipGetImagePalette)(GpImage *image, ColorPalette *palette, INT size);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipGetImagePaletteSize)(GpImage *image, INT *size);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipBitmapUnlockBits)(GpBitmap* bitmap, BitmapData* lockedBitmapData);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipDisposeImage)(GpImage *image);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipFillRectangle)(GpGraphics *graphics, GpBrush *brush, REAL x, REAL y, REAL width, REAL height);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromScan0)(INT width, INT height, INT stride, PixelFormat format, BYTE* scan0, GpBitmap** bitmap);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipSetImagePalette)(GpImage *image, GDIPCONST ColorPalette *palette);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipSetInterpolationMode)(GpGraphics *graphics, InterpolationMode interpolationMode);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipDrawImagePointsI)(GpGraphics *graphics, GpImage *image, GDIPCONST GpPoint *dstpoints, INT count);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromGdiDib)(GDIPCONST BITMAPINFO* gdiBitmapInfo, VOID* gdiBitmapData, GpBitmap** bitmap);\ntypedef Status (WINAPI *FuncType_GdiplusStartup)(OUT FX_UINTPTR *token, const GdiplusStartupInput *input, OUT GdiplusStartupOutput *output);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipDrawLineI)(GpGraphics *graphics, GpPen *pen, int x1, int y1, int x2, int y2);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipResetClip)(GpGraphics *graphics);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipCreatePath)(GpFillMode brushMode, GpPath **path);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipAddPathPath)(GpPath *path, GDIPCONST GpPath* addingPath, BOOL connect);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipSetPathFillMode)(GpPath *path, GpFillMode fillmode);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipSetClipPath)(GpGraphics *graphics, GpPath *path, CombineMode combineMode);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipGetClip)(GpGraphics *graphics, GpRegion *region);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipCreateRegion)(GpRegion **region);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipGetClipBoundsI)(GpGraphics *graphics, GpRect *rect);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipSetClipRegion)(GpGraphics *graphics, GpRegion *region, CombineMode combineMode);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipWidenPath)(GpPath *nativePath, GpPen *pen, GpMatrix *matrix, REAL flatness);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipAddPathLine)(GpPath *path, REAL x1, REAL y1, REAL x2, REAL y2);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipAddPathRectangle)(GpPath *path, REAL x, REAL y, REAL width, REAL height);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteRegion)(GpRegion *region);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipGetDC)(GpGraphics* graphics, HDC * hdc);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipReleaseDC)(GpGraphics* graphics, HDC hdc);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenLineCap197819)(GpPen *pen, GpLineCap startCap, GpLineCap endCap, GpDashCap dashCap);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashOffset)(GpPen *pen, REAL offset);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipResetPath)(GpPath *path);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipCreateRegionPath)(GpPath *path, GpRegion **region);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipCreateFont)(GDIPCONST GpFontFamily *fontFamily, REAL emSize, INT style, Unit unit, GpFont **font);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipGetFontSize)(GpFont *font, REAL *size);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipCreateFontFamilyFromName)(GDIPCONST WCHAR *name, GpFontCollection *fontCollection, GpFontFamily **FontFamily);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipSetTextRenderingHint)(GpGraphics *graphics, TextRenderingHint mode);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipDrawDriverString)(GpGraphics *graphics, GDIPCONST UINT16 *text, INT length, GDIPCONST GpFont *font, GDIPCONST GpBrush *brush, GDIPCONST PointF *positions, INT flags, GDIPCONST GpMatrix *matrix);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipCreateMatrix2)(REAL m11, REAL m12, REAL m21, REAL m22, REAL dx, REAL dy, GpMatrix **matrix);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteMatrix)(GpMatrix *matrix);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipSetWorldTransform)(GpGraphics *graphics, GpMatrix *matrix);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipResetWorldTransform)(GpGraphics *graphics);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteFontFamily)(GpFontFamily *FontFamily);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteFont)(GpFont* font);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipNewPrivateFontCollection)(GpFontCollection** fontCollection);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipDeletePrivateFontCollection)(GpFontCollection** fontCollection);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipPrivateAddMemoryFont)(GpFontCollection* fontCollection, GDIPCONST void* memory, INT length);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipGetFontCollectionFamilyList)(GpFontCollection* fontCollection, INT numSought, GpFontFamily* gpfamilies[], INT* numFound);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipGetFontCollectionFamilyCount)(GpFontCollection* fontCollection, INT* numFound);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipSetTextContrast)(GpGraphics *graphics, UINT contrast);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipSetPixelOffsetMode)(GpGraphics* graphics, PixelOffsetMode pixelOffsetMode);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipGetImageGraphicsContext)(GpImage *image, GpGraphics **graphics);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipDrawImageI)(GpGraphics *graphics, GpImage *image, INT x, INT y);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipDrawImageRectI)(GpGraphics *graphics, GpImage *image, INT x, INT y, INT width, INT height);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipDrawString)(GpGraphics *graphics, GDIPCONST WCHAR *string, INT length, GDIPCONST GpFont *font, GDIPCONST RectF *layoutRect, GDIPCONST GpStringFormat *stringFormat, GDIPCONST GpBrush *brush);\ntypedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenTransform)(GpPen *pen, GpMatrix *matrix);\n#define CallFunc(funcname) ((FuncType_##funcname)GdiplusExt.m_Functions[FuncId_##funcname])\ntypedef HANDLE   (__stdcall *FuncType_GdiAddFontMemResourceEx)(PVOID pbFont, DWORD cbFont, PVOID pdv, DWORD *pcFonts);\ntypedef BOOL     (__stdcall *FuncType_GdiRemoveFontMemResourceEx)(HANDLE handle);\nvoid* CGdiplusExt::GdiAddFontMemResourceEx(void *pFontdata, FX_DWORD size, void* pdv, FX_DWORD* num_face)\n{\n    if (m_pGdiAddFontMemResourceEx) {\n        return ((FuncType_GdiAddFontMemResourceEx)m_pGdiAddFontMemResourceEx)((PVOID)pFontdata, (DWORD)size, (PVOID)pdv, (DWORD*)num_face);\n    }\n    return NULL;\n}\nFX_BOOL CGdiplusExt::GdiRemoveFontMemResourceEx(void* handle)\n{\n    if (m_pGdiRemoveFontMemResourseEx) {\n        return ((FuncType_GdiRemoveFontMemResourceEx)m_pGdiRemoveFontMemResourseEx)((HANDLE)handle);\n    }\n    return FALSE;\n}\nstatic GpBrush* _GdipCreateBrush(DWORD argb)\n{\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    GpSolidFill* solidBrush = NULL;\n    CallFunc(GdipCreateSolidFill)((ARGB)argb, &solidBrush);\n    return solidBrush;\n}\nstatic CFX_DIBitmap* _StretchMonoToGray(int dest_width, int dest_height,\n                                        const CFX_DIBitmap* pSource, FX_RECT* pClipRect)\n{\n    FX_BOOL bFlipX = dest_width < 0;\n    if (bFlipX) {\n        dest_width = -dest_width;\n    }\n    FX_BOOL bFlipY = dest_height < 0;\n    if (bFlipY) {\n        dest_height = -dest_height;\n    }\n    int result_width = pClipRect->Width();\n    int result_height = pClipRect->Height();\n    int result_pitch = (result_width + 3) / 4 * 4;\n    CFX_DIBitmap* pStretched = FX_NEW CFX_DIBitmap;\n    if (!pStretched) {\n        return NULL;\n    }\n    if (!pStretched->Create(result_width, result_height, FXDIB_8bppRgb)) {\n        delete pStretched;\n        return NULL;\n    }\n    LPBYTE dest_buf = pStretched->GetBuffer();\n    int src_width = pSource->GetWidth();\n    int src_height = pSource->GetHeight();\n    int src_count = src_width * src_height;\n    int dest_count = dest_width * dest_height;\n    int ratio = 255 * dest_count / src_count;\n    int y_unit = src_height / dest_height;\n    int x_unit = src_width / dest_width;\n    int area_unit = y_unit * x_unit;\n    LPBYTE src_buf = pSource->GetBuffer();\n    int src_pitch = pSource->GetPitch();\n    for (int dest_y = 0; dest_y < result_height; dest_y ++) {\n        LPBYTE dest_scan = dest_buf + dest_y * result_pitch;\n        int src_y_start = bFlipY ? (dest_height - 1 - dest_y - pClipRect->top) : (dest_y + pClipRect->top);\n        src_y_start = src_y_start * src_height / dest_height;\n        LPBYTE src_scan = src_buf + src_y_start * src_pitch;\n        for (int dest_x = 0; dest_x < result_width; dest_x ++) {\n            int sum = 0;\n            int src_x_start = bFlipX ? (dest_width - 1 - dest_x - pClipRect->left) : (dest_x + pClipRect->left);\n            src_x_start = src_x_start * src_width / dest_width;\n            int src_x_end = src_x_start + x_unit;\n            LPBYTE src_line = src_scan;\n            for (int src_y = 0; src_y < y_unit; src_y ++) {\n                for (int src_x = src_x_start; src_x < src_x_end; src_x ++) {\n                    if (!(src_line[src_x / 8] & (1 << (7 - src_x % 8)))) {\n                        sum += 255;\n                    }\n                }\n                src_line += src_pitch;\n            }\n            dest_scan[dest_x] = 255 - sum / area_unit;\n        }\n    }\n    return pStretched;\n}\nstatic void OutputImageMask(GpGraphics* pGraphics, BOOL bMonoDevice, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,\n                            int dest_width, int dest_height, FX_ARGB argb, const FX_RECT* pClipRect)\n{\n    ASSERT(pBitmap->GetBPP() == 1);\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    int src_width = pBitmap->GetWidth(), src_height = pBitmap->GetHeight();\n    int src_pitch = pBitmap->GetPitch();\n    FX_LPBYTE scan0 = pBitmap->GetBuffer();\n    if (src_width == 1 && src_height == 1) {\n        if ((scan0[0] & 0x80) == 0) {\n            return;\n        }\n        GpSolidFill* solidBrush;\n        CallFunc(GdipCreateSolidFill)((ARGB)argb, &solidBrush);\n        if (dest_width < 0) {\n            dest_width = -dest_width;\n            dest_left -= dest_width;\n        }\n        if (dest_height < 0) {\n            dest_height = -dest_height;\n            dest_top -= dest_height;\n        }\n        CallFunc(GdipFillRectangle)(pGraphics, solidBrush, (float)dest_left, (float)dest_top,\n                                    (float)dest_width, (float)dest_height);\n        CallFunc(GdipDeleteBrush)(solidBrush);\n        return;\n    }\n    if (!bMonoDevice && abs(dest_width) < src_width && abs(dest_height) < src_height) {\n        FX_RECT image_rect(dest_left, dest_top, dest_left + dest_width, dest_top + dest_height);\n        image_rect.Normalize();\n        FX_RECT image_clip = image_rect;\n        image_clip.Intersect(*pClipRect);\n        if (image_clip.IsEmpty()) {\n            return;\n        }\n        image_clip.Offset(-image_rect.left, -image_rect.top);\n        CFX_DIBitmap* pStretched = NULL;\n        if (src_width * src_height > 10000) {\n            pStretched = _StretchMonoToGray(dest_width, dest_height, pBitmap, &image_clip);\n        } else {\n            pStretched = pBitmap->StretchTo(dest_width, dest_height, FALSE, &image_clip);\n        }\n        GpBitmap* bitmap;\n        CallFunc(GdipCreateBitmapFromScan0)(image_clip.Width(), image_clip.Height(),\n                                            (image_clip.Width() + 3) / 4 * 4, PixelFormat8bppIndexed, pStretched->GetBuffer(), &bitmap);\n        int a, r, g, b;\n        ArgbDecode(argb, a, r, g, b);\n        UINT pal[258];\n        pal[0] = 0;\n        pal[1] = 256;\n        for (int i = 0; i < 256; i ++) {\n            pal[i + 2] = ArgbEncode(i * a / 255, r, g, b);\n        }\n        CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)pal);\n        CallFunc(GdipDrawImageI)(pGraphics, bitmap, image_rect.left + image_clip.left,\n                                 image_rect.top + image_clip.top);\n        CallFunc(GdipDisposeImage)(bitmap);\n        delete pStretched;\n        return;\n    }\n    GpBitmap* bitmap;\n    CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch, PixelFormat1bppIndexed, scan0, &bitmap);\n    UINT palette[4] = { PaletteFlagsHasAlpha, 2, 0, argb };\n    CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)palette);\n    Point destinationPoints[] = {\n        Point(dest_left, dest_top),\n        Point(dest_left + dest_width, dest_top),\n        Point(dest_left, dest_top + dest_height)\n    };\n    CallFunc(GdipDrawImagePointsI)(pGraphics, bitmap, destinationPoints, 3);\n    CallFunc(GdipDisposeImage)(bitmap);\n}\nstatic void OutputImage(GpGraphics* pGraphics, const CFX_DIBitmap* pBitmap, const FX_RECT* pSrcRect,\n                        int dest_left, int dest_top, int dest_width, int dest_height)\n{\n    int src_width = pSrcRect->Width(), src_height = pSrcRect->Height();\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    if (pBitmap->GetBPP() == 1 && (pSrcRect->left % 8)) {\n        FX_RECT new_rect(0, 0, src_width, src_height);\n        CFX_DIBitmap* pCloned = pBitmap->Clone(pSrcRect);\n        if (!pCloned) {\n            return;\n        }\n        OutputImage(pGraphics, pCloned, &new_rect, dest_left, dest_top, dest_width, dest_height);\n        delete pCloned;\n        return;\n    }\n    int src_pitch = pBitmap->GetPitch();\n    FX_LPBYTE scan0 = pBitmap->GetBuffer() + pSrcRect->top * src_pitch + pBitmap->GetBPP() * pSrcRect->left / 8;\n    GpBitmap* bitmap = NULL;\n    switch (pBitmap->GetFormat()) {\n        case FXDIB_Argb:\n            CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,\n                                                PixelFormat32bppARGB, scan0, &bitmap);\n            break;\n        case FXDIB_Rgb32:\n            CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,\n                                                PixelFormat32bppRGB, scan0, &bitmap);\n            break;\n        case FXDIB_Rgb:\n            CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,\n                                                PixelFormat24bppRGB, scan0, &bitmap);\n            break;\n        case FXDIB_8bppRgb: {\n                CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,\n                                                    PixelFormat8bppIndexed, scan0, &bitmap);\n                UINT pal[258];\n                pal[0] = 0;\n                pal[1] = 256;\n                for (int i = 0; i < 256; i ++) {\n                    pal[i + 2] = pBitmap->GetPaletteEntry(i);\n                }\n                CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)pal);\n                break;\n            }\n        case FXDIB_1bppRgb: {\n                CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,\n                                                    PixelFormat1bppIndexed, scan0, &bitmap);\n                break;\n            }\n    }\n    if (dest_height < 0) {\n        dest_height --;\n    }\n    if (dest_width < 0) {\n        dest_width --;\n    }\n    Point destinationPoints[] = {\n        Point(dest_left, dest_top),\n        Point(dest_left + dest_width, dest_top),\n        Point(dest_left, dest_top + dest_height)\n    };\n    CallFunc(GdipDrawImagePointsI)(pGraphics, bitmap, destinationPoints, 3);\n    CallFunc(GdipDisposeImage)(bitmap);\n}\nCGdiplusExt::CGdiplusExt()\n{\n    m_hModule = NULL;\n    m_GdiModule = NULL;\n    for (int i = 0; i < sizeof g_GdipFuncNames / sizeof(LPCSTR); i ++) {\n        m_Functions[i] = NULL;\n    }\n    m_pGdiAddFontMemResourceEx = NULL;\n    m_pGdiRemoveFontMemResourseEx = NULL;\n}\nvoid CGdiplusExt::Load()\n{\n    CFX_ByteString strPlusPath = \"\";\n    FX_CHAR buf[MAX_PATH];\n    GetSystemDirectoryA(buf, MAX_PATH);\n    strPlusPath += buf;\n    strPlusPath += \"\\\\\";\n    strPlusPath += \"GDIPLUS.DLL\";\n    m_hModule = LoadLibraryA(strPlusPath);\n    if (m_hModule == NULL) {\n        return;\n    }\n    for (int i = 0; i < sizeof g_GdipFuncNames / sizeof(LPCSTR); i ++) {\n        m_Functions[i] = GetProcAddress(m_hModule, g_GdipFuncNames[i]);\n        if (m_Functions[i] == NULL) {\n            m_hModule = NULL;\n            return;\n        }\n    }\n    FX_UINTPTR gdiplusToken;\n    GdiplusStartupInput gdiplusStartupInput;\n    ((FuncType_GdiplusStartup)m_Functions[FuncId_GdiplusStartup])(&gdiplusToken, &gdiplusStartupInput, NULL);\n    m_GdiModule = LoadLibraryA(\"GDI32.DLL\");\n    if (m_GdiModule == NULL) {\n        return;\n    }\n    m_pGdiAddFontMemResourceEx = GetProcAddress(m_GdiModule, \"AddFontMemResourceEx\");\n    m_pGdiRemoveFontMemResourseEx = GetProcAddress(m_GdiModule, \"RemoveFontMemResourceEx\");\n}\nCGdiplusExt::~CGdiplusExt()\n{\n}\nLPVOID CGdiplusExt::LoadMemFont(LPBYTE pData, FX_DWORD size)\n{\n    GpFontCollection* pCollection = NULL;\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    CallFunc(GdipNewPrivateFontCollection)(&pCollection);\n    GpStatus status = CallFunc(GdipPrivateAddMemoryFont)(pCollection, pData, size);\n    if (status == Ok) {\n        return pCollection;\n    }\n    CallFunc(GdipDeletePrivateFontCollection)(&pCollection);\n    return NULL;\n}\nvoid CGdiplusExt::DeleteMemFont(LPVOID pCollection)\n{\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    CallFunc(GdipDeletePrivateFontCollection)((GpFontCollection**)&pCollection);\n}\nFX_BOOL CGdiplusExt::GdipCreateBitmap(CFX_DIBitmap* pBitmap, void**bitmap)\n{\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    PixelFormat format;\n    switch (pBitmap->GetFormat()) {\n        case FXDIB_Rgb:\n            format = PixelFormat24bppRGB;\n            break;\n        case FXDIB_Rgb32:\n            format = PixelFormat32bppRGB;\n            break;\n        case FXDIB_Argb:\n            format = PixelFormat32bppARGB;\n            break;\n        default:\n            return FALSE;\n    }\n    GpStatus status = CallFunc(GdipCreateBitmapFromScan0)(pBitmap->GetWidth(), pBitmap->GetHeight(),\n                      pBitmap->GetPitch(), format, pBitmap->GetBuffer(), (GpBitmap**)bitmap);\n    if (status == Ok) {\n        return TRUE;\n    }\n    return FALSE;\n}\nFX_BOOL CGdiplusExt::GdipCreateFromImage(void* bitmap, void** graphics)\n{\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    GpStatus status = CallFunc(GdipGetImageGraphicsContext)((GpBitmap*)bitmap, (GpGraphics**)graphics);\n    if (status == Ok) {\n        return TRUE;\n    }\n    return FALSE;\n}\nFX_BOOL CGdiplusExt::GdipCreateFontFamilyFromName(FX_LPCWSTR name, void* pFontCollection, void**pFamily)\n{\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    GpStatus status = CallFunc(GdipCreateFontFamilyFromName)((GDIPCONST WCHAR *)name, (GpFontCollection*)pFontCollection, (GpFontFamily**)pFamily);\n    if (status == Ok) {\n        return TRUE;\n    }\n    return FALSE;\n}\nFX_BOOL CGdiplusExt::GdipCreateFontFromFamily(void* pFamily, FX_FLOAT font_size, int fontstyle, int flag, void** pFont)\n{\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    GpStatus status = CallFunc(GdipCreateFont)((GpFontFamily*)pFamily, font_size, fontstyle, Unit(flag), (GpFont**)pFont);\n    if (status == Ok) {\n        return TRUE;\n    }\n    return FALSE;\n}\nvoid CGdiplusExt::GdipGetFontSize(void *pFont, FX_FLOAT *size)\n{\n    REAL get_size;\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    GpStatus status = CallFunc(GdipGetFontSize)((GpFont *)pFont, (REAL*)&get_size);\n    if (status == Ok) {\n        *size = (FX_FLOAT)get_size;\n    } else {\n        *size = 0;\n    }\n}\nvoid CGdiplusExt::GdipSetTextRenderingHint(void* graphics, int mode)\n{\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    CallFunc(GdipSetTextRenderingHint)((GpGraphics*)graphics, (TextRenderingHint)mode);\n}\nvoid CGdiplusExt::GdipSetPageUnit(void* graphics, FX_DWORD unit)\n{\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    CallFunc(GdipSetPageUnit)((GpGraphics*)graphics, (GpUnit)unit);\n}\nFX_BOOL CGdiplusExt::GdipDrawDriverString(void *graphics,  unsigned short *text, int length,\n        void *font, void* brush, void *positions, int flags, const void *matrix)\n{\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    GpStatus status = CallFunc(GdipDrawDriverString)((GpGraphics*)graphics, (GDIPCONST UINT16 *)text, (INT)length, (GDIPCONST GpFont *)font, (GDIPCONST GpBrush*)brush,\n                      (GDIPCONST PointF *)positions, (INT)flags, (GDIPCONST GpMatrix *)matrix);\n    if (status == Ok) {\n        return TRUE;\n    }\n    return FALSE;\n}\nvoid CGdiplusExt::GdipCreateBrush(FX_DWORD fill_argb, void** pBrush)\n{\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    CallFunc(GdipCreateSolidFill)((ARGB)fill_argb, (GpSolidFill**)pBrush);\n}\nvoid CGdiplusExt::GdipDeleteBrush(void* pBrush)\n{\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    CallFunc(GdipDeleteBrush)((GpSolidFill*)pBrush);\n}\nvoid* CGdiplusExt::GdipCreateFontFromCollection(void* pFontCollection, FX_FLOAT font_size, int fontstyle)\n{\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    int numFamilies = 0;\n    GpStatus status = CallFunc(GdipGetFontCollectionFamilyCount)((GpFontCollection*)pFontCollection, &numFamilies);\n    if (status != Ok) {\n        return NULL;\n    }\n    GpFontFamily* family_list[1];\n    status = CallFunc(GdipGetFontCollectionFamilyList)((GpFontCollection*)pFontCollection, 1, family_list, &numFamilies);\n    if (status != Ok) {\n        return NULL;\n    }\n    GpFont* pFont = NULL;\n    status = CallFunc(GdipCreateFont)(family_list[0], font_size, fontstyle, UnitPixel, &pFont);\n    if (status != Ok) {\n        return NULL;\n    }\n    return pFont;\n}\nvoid CGdiplusExt::GdipCreateMatrix(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f, void** matrix)\n{\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    CallFunc(GdipCreateMatrix2)(a, b, c, d, e, f, (GpMatrix**)matrix);\n}\nvoid CGdiplusExt::GdipDeleteMatrix(void* matrix)\n{\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    CallFunc(GdipDeleteMatrix)((GpMatrix*)matrix);\n}\nvoid CGdiplusExt::GdipDeleteFontFamily(void* pFamily)\n{\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    CallFunc(GdipDeleteFontFamily)((GpFontFamily*)pFamily);\n}\nvoid CGdiplusExt::GdipDeleteFont(void* pFont)\n{\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    CallFunc(GdipDeleteFont)((GpFont*)pFont);\n}\nvoid CGdiplusExt::GdipSetWorldTransform(void* graphics, void* pMatrix)\n{\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    CallFunc(GdipSetWorldTransform)((GpGraphics*)graphics, (GpMatrix*)pMatrix);\n}\nvoid CGdiplusExt::GdipDisposeImage(void* bitmap)\n{\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    CallFunc(GdipDisposeImage)((GpBitmap*)bitmap);\n}\nvoid CGdiplusExt::GdipDeleteGraphics(void* graphics)\n{\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    CallFunc(GdipDeleteGraphics)((GpGraphics*)graphics);\n}\nFX_BOOL CGdiplusExt::StretchBitMask(HDC hDC, BOOL bMonoDevice, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,\n                                    int dest_width, int dest_height, FX_DWORD argb, const FX_RECT* pClipRect, int flags)\n{\n    ASSERT(pBitmap->GetBPP() == 1);\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    GpGraphics* pGraphics = NULL;\n    CallFunc(GdipCreateFromHDC)(hDC, &pGraphics);\n    CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel);\n    if (flags & FXDIB_NOSMOOTH) {\n        CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeNearestNeighbor);\n    } else {\n        CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeHighQuality);\n    }\n    OutputImageMask(pGraphics, bMonoDevice, pBitmap, dest_left, dest_top, dest_width, dest_height, argb, pClipRect);\n    CallFunc(GdipDeleteGraphics)(pGraphics);\n    return TRUE;\n}\nFX_BOOL CGdiplusExt::StretchDIBits(HDC hDC, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,\n                                   int dest_width, int dest_height, const FX_RECT* pClipRect, int flags)\n{\n    GpGraphics* pGraphics;\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    CallFunc(GdipCreateFromHDC)(hDC, &pGraphics);\n    CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel);\n    if (flags & FXDIB_NOSMOOTH) {\n        CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeNearestNeighbor);\n    } else if (pBitmap->GetWidth() > abs(dest_width) / 2 || pBitmap->GetHeight() > abs(dest_height) / 2) {\n        CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeHighQuality);\n    } else {\n        CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeBilinear);\n    }\n    FX_RECT src_rect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight());\n    OutputImage(pGraphics, pBitmap, &src_rect, dest_left, dest_top, dest_width, dest_height);\n    CallFunc(GdipDeleteGraphics)(pGraphics);\n    CallFunc(GdipDeleteGraphics)(pGraphics);\n    return TRUE;\n}\nstatic GpPen* _GdipCreatePen(const CFX_GraphStateData* pGraphState, const CFX_AffineMatrix* pMatrix, DWORD argb, FX_BOOL bTextMode = FALSE)\n{\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    FX_FLOAT width = pGraphState ? pGraphState->m_LineWidth : 1.0f;\n    if (!bTextMode) {\n        FX_FLOAT unit = pMatrix == NULL ? 1.0f : FXSYS_Div(1.0f, (pMatrix->GetXUnit() + pMatrix->GetYUnit()) / 2);\n        if (width < unit) {\n            width = unit;\n        }\n    }\n    GpPen* pPen = NULL;\n    CallFunc(GdipCreatePen1)((ARGB)argb, width, UnitWorld, &pPen);\n    LineCap lineCap;\n    DashCap dashCap = DashCapFlat;\n    FX_BOOL bDashExtend = FALSE;\n    switch(pGraphState->m_LineCap) {\n        case CFX_GraphStateData::LineCapButt:\n            lineCap = LineCapFlat;\n            break;\n        case CFX_GraphStateData::LineCapRound:\n            lineCap = LineCapRound;\n            dashCap = DashCapRound;\n            bDashExtend = TRUE;\n            break;\n        case CFX_GraphStateData::LineCapSquare:\n            lineCap = LineCapSquare;\n            bDashExtend = TRUE;\n            break;\n    }\n    CallFunc(GdipSetPenLineCap197819)(pPen, lineCap, lineCap, dashCap);\n    LineJoin lineJoin;\n    switch(pGraphState->m_LineJoin) {\n        case CFX_GraphStateData::LineJoinMiter:\n            lineJoin = LineJoinMiterClipped;\n            break;\n        case CFX_GraphStateData::LineJoinRound:\n            lineJoin = LineJoinRound;\n            break;\n        case CFX_GraphStateData::LineJoinBevel:\n            lineJoin = LineJoinBevel;\n            break;\n    }\n    CallFunc(GdipSetPenLineJoin)(pPen, lineJoin);\n    if(pGraphState->m_DashCount) {\n        FX_FLOAT* pDashArray = FX_Alloc(FX_FLOAT, pGraphState->m_DashCount + pGraphState->m_DashCount % 2);\n        if (!pDashArray) {\n            return NULL;\n        }\n        int nCount = 0;\n        FX_FLOAT on_leftover = 0, off_leftover = 0;\n        for (int i = 0; i < pGraphState->m_DashCount; i += 2) {\n            FX_FLOAT on_phase = pGraphState->m_DashArray[i];\n            FX_FLOAT off_phase;\n            if (i == pGraphState->m_DashCount - 1) {\n                off_phase = on_phase;\n            } else {\n                off_phase = pGraphState->m_DashArray[i + 1];\n            }\n            on_phase /= width;\n            off_phase /= width;\n            if (on_phase + off_phase <= 0.00002f) {\n                on_phase = 1.0f / 10;\n                off_phase = 1.0f / 10;\n            }\n            if (bDashExtend) {\n                if (off_phase < 1) {\n                    off_phase = 0;\n                } else {\n                    off_phase -= 1;\n                }\n                on_phase += 1;\n            }\n            if (on_phase == 0 || off_phase == 0) {\n                if (nCount == 0) {\n                    on_leftover += on_phase;\n                    off_leftover += off_phase;\n                } else {\n                    pDashArray[nCount - 2] += on_phase;\n                    pDashArray[nCount - 1] += off_phase;\n                }\n            } else {\n                pDashArray[nCount++] = on_phase + on_leftover;\n                on_leftover = 0;\n                pDashArray[nCount++] = off_phase + off_leftover;\n                off_leftover = 0;\n            }\n        }\n        CallFunc(GdipSetPenDashArray)(pPen, pDashArray, nCount);\n        FX_FLOAT phase = pGraphState->m_DashPhase;\n        if (bDashExtend)\n            if (phase < 0.5f) {\n                phase = 0;\n            } else {\n                phase -= 0.5f;\n            }\n        CallFunc(GdipSetPenDashOffset)(pPen, phase);\n        FX_Free(pDashArray);\n        pDashArray = NULL;\n    }\n    CallFunc(GdipSetPenMiterLimit)(pPen, pGraphState->m_MiterLimit);\n    return pPen;\n}\nstatic BOOL IsSmallTriangle(PointF* points, const CFX_AffineMatrix* pMatrix, int& v1, int& v2)\n{\n    int pairs[] = {1, 2, 0, 2, 0, 1};\n    for (int i = 0; i < 3; i ++) {\n        int pair1 = pairs[i * 2];\n        int pair2 = pairs[i * 2 + 1];\n        FX_FLOAT x1 = points[pair1].X, x2 = points[pair2].X;\n        FX_FLOAT y1 = points[pair1].Y, y2 = points[pair2].Y;\n        if (pMatrix) {\n            pMatrix->Transform(x1, y1);\n            pMatrix->Transform(x2, y2);\n        }\n        FX_FLOAT dx = x1 - x2;\n        FX_FLOAT dy = y1 - y2;\n        FX_FLOAT distance_square = FXSYS_Mul(dx, dx) + FXSYS_Mul(dy, dy);\n        if (distance_square < (1.0f * 2 + 1.0f / 4)) {\n            v1 = i;\n            v2 = pair1;\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nBOOL CGdiplusExt::DrawPath(HDC hDC, const CFX_PathData* pPathData,\n                           const CFX_AffineMatrix* pObject2Device,\n                           const CFX_GraphStateData* pGraphState,\n                           FX_DWORD fill_argb,\n                           FX_DWORD stroke_argb,\n                           int fill_mode\n                          )\n{\n    int nPoints = pPathData->GetPointCount();\n    if (nPoints == 0) {\n        return TRUE;\n    }\n    FX_PATHPOINT* pPoints = pPathData->GetPoints();\n    GpGraphics* pGraphics = NULL;\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    CallFunc(GdipCreateFromHDC)(hDC, &pGraphics);\n    CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel);\n    CallFunc(GdipSetPixelOffsetMode)(pGraphics, PixelOffsetModeHalf);\n    GpMatrix* pMatrix = NULL;\n    if (pObject2Device) {\n        CallFunc(GdipCreateMatrix2)(pObject2Device->a, pObject2Device->b, pObject2Device->c, pObject2Device->d, pObject2Device->e, pObject2Device->f, &pMatrix);\n        CallFunc(GdipSetWorldTransform)(pGraphics, pMatrix);\n    }\n    PointF *points = FX_Alloc(PointF, nPoints);\n    if (!points) {\n        return FALSE;\n    }\n    BYTE * types  = FX_Alloc(BYTE, nPoints);\n    if (!types) {\n        FX_Free(points);\n        return FALSE;\n    }\n    int nSubPathes = 0;\n    FX_BOOL bSubClose = FALSE;\n    int pos_subclose = 0;\n    FX_BOOL bSmooth = FALSE;\n    int startpoint = 0;\n    for(int i = 0; i < nPoints; i++) {\n        points[i].X = pPoints[i].m_PointX;\n        points[i].Y = pPoints[i].m_PointY;\n        FX_FLOAT x, y;\n        if (pObject2Device) {\n            pObject2Device->Transform(pPoints[i].m_PointX, pPoints[i].m_PointY, x, y);\n        } else {\n            x = pPoints[i].m_PointX;\n            y = pPoints[i].m_PointY;\n        }\n        if (x > 50000 * 1.0f) {\n            points[i].X = 50000 * 1.0f;\n        }\n        if (x < -50000 * 1.0f) {\n            points[i].X = -50000 * 1.0f;\n        }\n        if (y > 50000 * 1.0f) {\n            points[i].Y = 50000 * 1.0f;\n        }\n        if (y < -50000 * 1.0f) {\n            points[i].Y = -50000 * 1.0f;\n        }\n        int point_type = pPoints[i].m_Flag & FXPT_TYPE;\n        if(point_type == FXPT_MOVETO) {\n            types[i] = PathPointTypeStart;\n            nSubPathes ++;\n            bSubClose = FALSE;\n            startpoint = i;\n        } else if (point_type == FXPT_LINETO) {\n            types[i] = PathPointTypeLine;\n            if (pPoints[i - 1].m_Flag == FXPT_MOVETO && (i == nPoints - 1 || pPoints[i + 1].m_Flag == FXPT_MOVETO) &&\n                    points[i].Y == points[i - 1].Y && points[i].X == points[i - 1].X) {\n                points[i].X += 0.01f;\n                continue;\n            }\n            if (!bSmooth && points[i].X != points[i - 1].X && points[i].Y != points[i - 1].Y) {\n                bSmooth = TRUE;\n            }\n        } else if (point_type == FXPT_BEZIERTO)\t{\n            types[i] = PathPointTypeBezier;\n            bSmooth = TRUE;\n        }\n        if (pPoints[i].m_Flag & FXPT_CLOSEFIGURE) {\n            if (bSubClose) {\n                types[pos_subclose] &= ~PathPointTypeCloseSubpath;\n            } else {\n                bSubClose = TRUE;\n            }\n            pos_subclose = i;\n            types[i] |= PathPointTypeCloseSubpath;\n            if (!bSmooth && points[i].X != points[startpoint].X && points[i].Y != points[startpoint].Y) {\n                bSmooth = TRUE;\n            }\n        }\n    }\n    if (fill_mode & FXFILL_NOPATHSMOOTH) {\n        bSmooth = FALSE;\n        CallFunc(GdipSetSmoothingMode)(pGraphics, SmoothingModeNone);\n    } else if (!(fill_mode & FXFILL_FULLCOVER)) {\n        if (!bSmooth && (fill_mode & 3)) {\n            bSmooth = TRUE;\n        }\n        if (bSmooth || pGraphState && pGraphState->m_LineWidth > 2) {\n            CallFunc(GdipSetSmoothingMode)(pGraphics, SmoothingModeAntiAlias);\n        }\n    }\n    int new_fill_mode = fill_mode & 3;\n    if (nPoints == 4 && pGraphState == NULL) {\n        int v1, v2;\n        if (IsSmallTriangle(points, pObject2Device, v1, v2)) {\n            GpPen* pPen = NULL;\n            CallFunc(GdipCreatePen1)(fill_argb, 1.0f, UnitPixel, &pPen);\n            CallFunc(GdipDrawLineI)(pGraphics, pPen, FXSYS_round(points[v1].X), FXSYS_round(points[v1].Y),\n                                    FXSYS_round(points[v2].X), FXSYS_round(points[v2].Y));\n            CallFunc(GdipDeletePen)(pPen);\n            return TRUE;\n        }\n    }\n    GpPath* pGpPath = NULL;\n    CallFunc(GdipCreatePath2)(points, types, nPoints, GdiFillType2Gdip(new_fill_mode), &pGpPath);\n    if (!pGpPath) {\n        if (pMatrix) {\n            CallFunc(GdipDeleteMatrix)(pMatrix);\n        }\n        FX_Free(points);\n        FX_Free(types);\n        CallFunc(GdipDeleteGraphics)(pGraphics);\n        return FALSE;\n    }\n    if (new_fill_mode) {\n        GpBrush* pBrush = _GdipCreateBrush(fill_argb);\n        CallFunc(GdipSetPathFillMode)(pGpPath, GdiFillType2Gdip(new_fill_mode));\n        CallFunc(GdipFillPath)(pGraphics, pBrush, pGpPath);\n        CallFunc(GdipDeleteBrush)(pBrush);\n    }\n    if (pGraphState && stroke_argb) {\n        GpPen* pPen = _GdipCreatePen(pGraphState, pObject2Device, stroke_argb, fill_mode & FX_STROKE_TEXT_MODE);\n        if (nSubPathes == 1) {\n            CallFunc(GdipDrawPath)(pGraphics, pPen, pGpPath);\n        } else {\n            int iStart = 0;\n            for (int i = 0; i < nPoints; i ++) {\n                if (i == nPoints - 1 || types[i + 1] == PathPointTypeStart) {\n                    GpPath* pSubPath;\n                    CallFunc(GdipCreatePath2)(points + iStart, types + iStart, i - iStart + 1, GdiFillType2Gdip(new_fill_mode), &pSubPath);\n                    iStart = i + 1;\n                    CallFunc(GdipDrawPath)(pGraphics, pPen, pSubPath);\n                    CallFunc(GdipDeletePath)(pSubPath);\n                }\n            }\n        }\n        CallFunc(GdipDeletePen)(pPen);\n    }\n    if (pMatrix) {\n        CallFunc(GdipDeleteMatrix)(pMatrix);\n    }\n    FX_Free(points);\n    FX_Free(types);\n    CallFunc(GdipDeletePath)(pGpPath);\n    CallFunc(GdipDeleteGraphics)(pGraphics);\n    return TRUE;\n}\nclass GpStream FX_FINAL : public IStream, public CFX_Object\n{\n    LONG\tm_RefCount;\n    int     m_ReadPos;\n    CFX_ByteTextBuf\tm_InterStream;\npublic:\n    GpStream()\n    {\n        m_RefCount = 1;\n        m_ReadPos = 0;\n    }\n    virtual HRESULT STDMETHODCALLTYPE\n    QueryInterface(REFIID iid, void ** ppvObject)\n    {\n        if (iid == __uuidof(IUnknown) || iid == __uuidof(IStream) ||\n                iid == __uuidof(ISequentialStream))\t{\n            *ppvObject = static_cast<IStream*>(this);\n            AddRef();\n            return S_OK;\n        } else {\n            return E_NOINTERFACE;\n        }\n    }\n    virtual ULONG STDMETHODCALLTYPE AddRef(void)\n    {\n        return (ULONG)InterlockedIncrement(&m_RefCount);\n    }\n    virtual ULONG STDMETHODCALLTYPE Release(void)\n    {\n        ULONG res = (ULONG) InterlockedDecrement(&m_RefCount);\n        if (res == 0) {\n            delete this;\n        }\n        return res;\n    }\npublic:\n    virtual HRESULT STDMETHODCALLTYPE Read(void* Output, ULONG cb, ULONG* pcbRead)\n    {\n        size_t\tbytes_left;\n        size_t\tbytes_out;\n        if (pcbRead != NULL) {\n            *pcbRead = 0;\n        }\n        if (m_ReadPos == m_InterStream.GetLength()) {\n            return HRESULT_FROM_WIN32(ERROR_END_OF_MEDIA);\n        }\n        bytes_left = m_InterStream.GetLength() - m_ReadPos;\n        bytes_out = FX_MIN(cb, bytes_left);\n        FXSYS_memcpy32(Output, m_InterStream.GetBuffer() + m_ReadPos, bytes_out);\n        m_ReadPos += (FX_INT32)bytes_out;\n        if (pcbRead != NULL) {\n            *pcbRead = (ULONG)bytes_out;\n        }\n        return S_OK;\n    }\n    virtual HRESULT STDMETHODCALLTYPE Write(void const* Input, ULONG cb, ULONG* pcbWritten)\n    {\n        if (cb <= 0) {\n            if (pcbWritten != NULL) {\n                *pcbWritten = 0;\n            }\n            return S_OK;\n        }\n        m_InterStream.InsertBlock(m_InterStream.GetLength(), Input, cb);\n        if (pcbWritten != NULL) {\n            *pcbWritten = cb;\n        }\n        return S_OK;\n    }\npublic:\n    virtual HRESULT STDMETHODCALLTYPE SetSize(ULARGE_INTEGER)\n    {\n        return E_NOTIMPL;\n    }\n    virtual HRESULT STDMETHODCALLTYPE CopyTo(IStream*, ULARGE_INTEGER, ULARGE_INTEGER*, ULARGE_INTEGER*)\n    {\n        return E_NOTIMPL;\n    }\n    virtual HRESULT STDMETHODCALLTYPE Commit(DWORD)\n    {\n        return E_NOTIMPL;\n    }\n    virtual HRESULT STDMETHODCALLTYPE Revert(void)\n    {\n        return E_NOTIMPL;\n    }\n    virtual HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD)\n    {\n        return E_NOTIMPL;\n    }\n    virtual HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD)\n    {\n        return E_NOTIMPL;\n    }\n    virtual HRESULT STDMETHODCALLTYPE Clone(IStream **)\n    {\n        return E_NOTIMPL;\n    }\n    virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove, DWORD dwOrigin, ULARGE_INTEGER* lpNewFilePointer)\n    {\n        long\tstart = 0;\n        long\tnew_read_position;\n        switch(dwOrigin) {\n            case STREAM_SEEK_SET:\n                start = 0;\n                break;\n            case STREAM_SEEK_CUR:\n                start = m_ReadPos;\n                break;\n            case STREAM_SEEK_END:\n                start = m_InterStream.GetLength();\n                break;\n            default:\n                return STG_E_INVALIDFUNCTION;\n                break;\n        }\n        new_read_position = start + (long)liDistanceToMove.QuadPart;\n        if (new_read_position < 0 || new_read_position > m_InterStream.GetLength()) {\n            return STG_E_SEEKERROR;\n        }\n        m_ReadPos = new_read_position;\n        if (lpNewFilePointer != NULL) {\n            lpNewFilePointer->QuadPart = m_ReadPos;\n        }\n        return S_OK;\n    }\n    virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg, DWORD grfStatFlag)\n    {\n        if (pStatstg == NULL) {\n            return STG_E_INVALIDFUNCTION;\n        }\n        ZeroMemory(pStatstg, sizeof(STATSTG));\n        pStatstg->cbSize.QuadPart = m_InterStream.GetLength();\n        return S_OK;\n    }\n};\ntypedef struct {\n    BITMAPINFO*\t\tpbmi;\n    int\t\t\t\tStride;\n    LPBYTE\t\t\tpScan0;\n    GpBitmap*\t\tpBitmap;\n    BitmapData*\t\tpBitmapData;\n    GpStream*       pStream;\n} PREVIEW3_DIBITMAP;\nstatic PREVIEW3_DIBITMAP* LoadDIBitmap(WINDIB_Open_Args_ args)\n{\n    GpBitmap* pBitmap;\n    GpStream* pStream = NULL;\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    Status status = Ok;\n    if (args.flags == WINDIB_OPEN_PATHNAME) {\n        status = CallFunc(GdipCreateBitmapFromFileICM)((wchar_t*)args.path_name, &pBitmap);\n    } else {\n        if (args.memory_size == 0 || !args.memory_base) {\n            return NULL;\n        }\n        pStream = FX_NEW GpStream;\n        if (!pStream) {\n            return NULL;\n        }\n        pStream->Write(args.memory_base, (ULONG)args.memory_size, NULL);\n        status = CallFunc(GdipCreateBitmapFromStreamICM)(pStream, &pBitmap);\n    }\n    if (status != Ok) {\n        if (pStream) {\n            pStream->Release();\n        }\n        return NULL;\n    }\n    UINT height, width;\n    CallFunc(GdipGetImageHeight)(pBitmap, &height);\n    CallFunc(GdipGetImageWidth)(pBitmap, &width);\n    PixelFormat pixel_format;\n    CallFunc(GdipGetImagePixelFormat)(pBitmap, &pixel_format);\n    int info_size = sizeof(BITMAPINFOHEADER);\n    int bpp = 24;\n    int dest_pixel_format = PixelFormat24bppRGB;\n    if (pixel_format == PixelFormat1bppIndexed) {\n        info_size += 8;\n        bpp = 1;\n        dest_pixel_format = PixelFormat1bppIndexed;\n    } else if (pixel_format == PixelFormat8bppIndexed) {\n        info_size += 1024;\n        bpp = 8;\n        dest_pixel_format = PixelFormat8bppIndexed;\n    } else if (pixel_format == PixelFormat32bppARGB) {\n        bpp = 32;\n        dest_pixel_format = PixelFormat32bppARGB;\n    }\n    LPBYTE buf = FX_Alloc(BYTE, info_size);\n    if (!buf) {\n        if (pStream) {\n            pStream->Release();\n        }\n        return NULL;\n    }\n    BITMAPINFOHEADER* pbmih = (BITMAPINFOHEADER*)buf;\n    pbmih->biBitCount = bpp;\n    pbmih->biCompression = BI_RGB;\n    pbmih->biHeight = -(int)height;\n    pbmih->biPlanes = 1;\n    pbmih->biWidth = width;\n    Rect rect(0, 0, width, height);\n    BitmapData* pBitmapData = FX_Alloc(BitmapData, 1);\n    if (!pBitmapData) {\n        if (pStream) {\n            pStream->Release();\n        }\n        return NULL;\n    }\n    CallFunc(GdipBitmapLockBits)(pBitmap, &rect, ImageLockModeRead,\n                                 dest_pixel_format, pBitmapData);\n    if (pixel_format == PixelFormat1bppIndexed || pixel_format == PixelFormat8bppIndexed) {\n        DWORD* ppal = (DWORD*)(buf + sizeof(BITMAPINFOHEADER));\n        struct {\n            UINT flags;\n            UINT Count;\n            DWORD Entries[256];\n        } pal;\n        int size = 0;\n        CallFunc(GdipGetImagePaletteSize)(pBitmap, &size);\n        CallFunc(GdipGetImagePalette)(pBitmap, (ColorPalette*)&pal, size);\n        int entries = pixel_format == PixelFormat1bppIndexed ? 2 : 256;\n        for (int i = 0; i < entries; i ++) {\n            ppal[i] = pal.Entries[i] & 0x00ffffff;\n        }\n    }\n    PREVIEW3_DIBITMAP* pInfo = FX_Alloc(PREVIEW3_DIBITMAP, 1);\n    if (!pInfo) {\n        if (pStream) {\n            pStream->Release();\n        }\n        return NULL;\n    }\n    pInfo->pbmi = (BITMAPINFO*)buf;\n    pInfo->pScan0 = (LPBYTE)pBitmapData->Scan0;\n    pInfo->Stride = pBitmapData->Stride;\n    pInfo->pBitmap = pBitmap;\n    pInfo->pBitmapData = pBitmapData;\n    pInfo->pStream = pStream;\n    return pInfo;\n}\nstatic void FreeDIBitmap(PREVIEW3_DIBITMAP* pInfo)\n{\n    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;\n    CallFunc(GdipBitmapUnlockBits)(pInfo->pBitmap, pInfo->pBitmapData);\n    CallFunc(GdipDisposeImage)(pInfo->pBitmap);\n    FX_Free(pInfo->pBitmapData);\n    FX_Free((LPBYTE)pInfo->pbmi);\n    if (pInfo->pStream) {\n        pInfo->pStream->Release();\n    }\n    FX_Free(pInfo);\n}\nCFX_DIBitmap* _FX_WindowsDIB_LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData, FX_BOOL bAlpha);\nCFX_DIBitmap* CGdiplusExt::LoadDIBitmap(WINDIB_Open_Args_ args)\n{\n    PREVIEW3_DIBITMAP* pInfo = ::LoadDIBitmap(args);\n    if (pInfo == NULL) {\n        return NULL;\n    }\n    int height = abs(pInfo->pbmi->bmiHeader.biHeight);\n    int width = pInfo->pbmi->bmiHeader.biWidth;\n    int dest_pitch = (width * pInfo->pbmi->bmiHeader.biBitCount + 31) / 32 * 4;\n    LPBYTE pData = FX_Alloc(BYTE, dest_pitch * height);\n    if (pData == NULL) {\n        FreeDIBitmap(pInfo);\n        return NULL;\n    }\n    if (dest_pitch == pInfo->Stride) {\n        FXSYS_memcpy32(pData, pInfo->pScan0, dest_pitch * height);\n    } else for (int i = 0; i < height; i ++) {\n            FXSYS_memcpy32(pData + dest_pitch * i, pInfo->pScan0 + pInfo->Stride * i, dest_pitch);\n        }\n    CFX_DIBitmap* pDIBitmap = _FX_WindowsDIB_LoadFromBuf(pInfo->pbmi, pData, pInfo->pbmi->bmiHeader.biBitCount == 32);\n    FX_Free(pData);\n    FreeDIBitmap(pInfo);\n    return pDIBitmap;\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/win32/fx_win32_print.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../include/fxge/fx_ge.h\"\n#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_\n#include <windows.h>\n#include \"../../../include/fxge/fx_ge_win32.h\"\n#include \"win32_int.h\"\n#include \"../../../include/fxge/fx_freetype.h\"\n#include \"../ge/text_int.h\"\n#include \"../dib/dib_int.h\"\n#define SIZETHRESHOLD 1000\n#define OUTPUTPSLEN 4096\nCGdiPrinterDriver::CGdiPrinterDriver(HDC hDC) : CGdiDeviceDriver(hDC, FXDC_PRINTER)\n{\n    m_HorzSize = ::GetDeviceCaps(m_hDC, HORZSIZE);\n    m_VertSize = ::GetDeviceCaps(m_hDC, VERTSIZE);\n    m_bSupportROP = TRUE;\n}\nint CGdiPrinterDriver::GetDeviceCaps(int caps_id)\n{\n    if (caps_id == FXDC_HORZ_SIZE) {\n        return m_HorzSize;\n    }\n    if (caps_id == FXDC_VERT_SIZE) {\n        return m_VertSize;\n    }\n    return CGdiDeviceDriver::GetDeviceCaps(caps_id);\n}\nFX_BOOL CGdiPrinterDriver::SetDIBits(const CFX_DIBSource* pSource, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,\n                                     int alpha_flag, void* pIccTransform)\n{\n    if (pSource->IsAlphaMask()) {\n        FX_RECT clip_rect(left, top, left + pSrcRect->Width(), top + pSrcRect->Height());\n        return StretchDIBits(pSource, color, left - pSrcRect->left, top - pSrcRect->top, pSource->GetWidth(), pSource->GetHeight(),\n                             &clip_rect, 0, alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL);\n    }\n    ASSERT(pSource != NULL && !pSource->IsAlphaMask() && pSrcRect != NULL);\n    ASSERT(blend_type == FXDIB_BLEND_NORMAL);\n    if (pSource->HasAlpha()) {\n        return FALSE;\n    }\n    CFX_DIBExtractor temp(pSource);\n    CFX_DIBitmap* pBitmap = temp;\n    if (pBitmap == NULL) {\n        return FALSE;\n    }\n    return GDI_SetDIBits(pBitmap, pSrcRect, left, top, pIccTransform);\n}\nFX_BOOL CGdiPrinterDriver::StretchDIBits(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,\n        int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,\n        int alpha_flag, void* pIccTransform, int blend_type)\n{\n    if (pSource->IsAlphaMask()) {\n        int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);\n        if (pSource->GetBPP() != 1 || alpha != 255 || !m_bSupportROP) {\n            return FALSE;\n        }\n        if (dest_width < 0 || dest_height < 0) {\n            CFX_DIBitmap* pFlipped = pSource->FlipImage(dest_width < 0, dest_height < 0);\n            if (pFlipped == NULL) {\n                return FALSE;\n            }\n            if (dest_width < 0) {\n                dest_left += dest_width;\n            }\n            if (dest_height < 0) {\n                dest_top += dest_height;\n            }\n            FX_BOOL ret = GDI_StretchBitMask(pFlipped, dest_left, dest_top, abs(dest_width), abs(dest_height), color, flags, alpha_flag, pIccTransform);\n            delete pFlipped;\n            return ret;\n        }\n        CFX_DIBExtractor temp(pSource);\n        CFX_DIBitmap* pBitmap = temp;\n        if (pBitmap == NULL) {\n            return FALSE;\n        }\n        return GDI_StretchBitMask(pBitmap, dest_left, dest_top, dest_width, dest_height, color, flags, alpha_flag, pIccTransform);\n    } else {\n        ASSERT(pSource != NULL);\n        if (pSource->HasAlpha()) {\n            return FALSE;\n        }\n        if (dest_width < 0 || dest_height < 0) {\n            CFX_DIBitmap* pFlipped = pSource->FlipImage(dest_width < 0, dest_height < 0);\n            if (pFlipped == NULL) {\n                return FALSE;\n            }\n            if (dest_width < 0) {\n                dest_left += dest_width;\n            }\n            if (dest_height < 0) {\n                dest_top += dest_height;\n            }\n            FX_BOOL ret = GDI_StretchDIBits(pFlipped, dest_left, dest_top, abs(dest_width), abs(dest_height), flags, pIccTransform);\n            delete pFlipped;\n            return ret;\n        }\n        CFX_DIBExtractor temp(pSource);\n        CFX_DIBitmap* pBitmap = temp;\n        if (pBitmap == NULL) {\n            return FALSE;\n        }\n        return GDI_StretchDIBits(pBitmap, dest_left, dest_top, dest_width, dest_height, flags, pIccTransform);\n    }\n}\nstatic CFX_DIBitmap* Transform1bppBitmap(const CFX_DIBSource* pSrc, const CFX_AffineMatrix* pDestMatrix)\n{\n    ASSERT(pSrc->GetFormat() == FXDIB_1bppRgb || pSrc->GetFormat() == FXDIB_1bppMask || pSrc->GetFormat() == FXDIB_1bppCmyk);\n    CFX_FloatRect unit_rect = pDestMatrix->GetUnitRect();\n    FX_RECT full_rect = unit_rect.GetOutterRect();\n    int full_left = full_rect.left;\n    int full_top = full_rect.top;\n    CFX_DIBExtractor src_bitmap(pSrc);\n    CFX_DIBitmap* pSrcBitmap = src_bitmap;\n    if (pSrcBitmap == NULL) {\n        return NULL;\n    }\n    int src_width = pSrcBitmap->GetWidth(), src_height = pSrcBitmap->GetHeight();\n    FX_LPBYTE src_buf = pSrcBitmap->GetBuffer();\n    FX_DWORD src_pitch = pSrcBitmap->GetPitch();\n    FX_FLOAT dest_area = pDestMatrix->GetUnitArea();\n    FX_FLOAT area_scale = FXSYS_Div((FX_FLOAT)(src_width * src_height), dest_area);\n    FX_FLOAT size_scale = FXSYS_sqrt(area_scale);\n    CFX_AffineMatrix adjusted_matrix(*pDestMatrix);\n    adjusted_matrix.Scale(size_scale, size_scale);\n    CFX_FloatRect result_rect_f = adjusted_matrix.GetUnitRect();\n    FX_RECT result_rect = result_rect_f.GetOutterRect();\n    CFX_AffineMatrix src2result;\n    src2result.e = adjusted_matrix.c + adjusted_matrix.e;\n    src2result.f = adjusted_matrix.d + adjusted_matrix.f;\n    src2result.a = adjusted_matrix.a / pSrcBitmap->GetWidth();\n    src2result.b = adjusted_matrix.b / pSrcBitmap->GetWidth();\n    src2result.c = -adjusted_matrix.c / pSrcBitmap->GetHeight();\n    src2result.d = -adjusted_matrix.d / pSrcBitmap->GetHeight();\n    src2result.TranslateI(-result_rect.left, -result_rect.top);\n    CFX_AffineMatrix result2src;\n    result2src.SetReverse(src2result);\n    CPDF_FixedMatrix result2src_fix(result2src, 8);\n    int result_width = result_rect.Width();\n    int result_height = result_rect.Height();\n    CFX_DIBitmap* pTempBitmap = FX_NEW CFX_DIBitmap;\n    if (!pTempBitmap) {\n        if (pSrcBitmap != src_bitmap) {\n            delete pSrcBitmap;\n        }\n        return NULL;\n    }\n    if (!pTempBitmap->Create(result_width, result_height, pSrc->GetFormat())) {\n        delete pTempBitmap;\n        if (pSrcBitmap != src_bitmap) {\n            delete pSrcBitmap;\n        }\n        return NULL;\n    }\n    pTempBitmap->CopyPalette(pSrc->GetPalette());\n    FX_LPBYTE dest_buf = pTempBitmap->GetBuffer();\n    int dest_pitch = pTempBitmap->GetPitch();\n    FXSYS_memset8(dest_buf, pSrc->IsAlphaMask() ? 0 : 0xff, dest_pitch * result_height);\n    if (pSrcBitmap->IsAlphaMask()) {\n        for (int dest_y = 0; dest_y < result_height; dest_y ++) {\n            FX_LPBYTE dest_scan = dest_buf + dest_y * dest_pitch;\n            for (int dest_x = 0; dest_x < result_width; dest_x ++) {\n                int src_x, src_y;\n                result2src_fix.Transform(dest_x, dest_y, src_x, src_y);\n                if (src_x < 0 || src_x >= src_width || src_y < 0 || src_y >= src_height) {\n                    continue;\n                }\n                if (!((src_buf + src_pitch * src_y)[src_x / 8] & (1 << (7 - src_x % 8)))) {\n                    continue;\n                }\n                dest_scan[dest_x / 8] |= 1 << (7 - dest_x % 8);\n            }\n        }\n    } else {\n        for (int dest_y = 0; dest_y < result_height; dest_y ++) {\n            FX_LPBYTE dest_scan = dest_buf + dest_y * dest_pitch;\n            for (int dest_x = 0; dest_x < result_width; dest_x ++) {\n                int src_x, src_y;\n                result2src_fix.Transform(dest_x, dest_y, src_x, src_y);\n                if (src_x < 0 || src_x >= src_width || src_y < 0 || src_y >= src_height) {\n                    continue;\n                }\n                if ((src_buf + src_pitch * src_y)[src_x / 8] & (1 << (7 - src_x % 8))) {\n                    continue;\n                }\n                dest_scan[dest_x / 8] &= ~(1 << (7 - dest_x % 8));\n            }\n        }\n    }\n    if (pSrcBitmap != src_bitmap) {\n        delete pSrcBitmap;\n    }\n    return pTempBitmap;\n}\nFX_BOOL\tCGdiPrinterDriver::StartDIBits(const CFX_DIBSource* pSource, int bitmap_alpha, FX_DWORD color,\n                                       const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,\n                                       int alpha_flag, void* pIccTransform, int blend_type)\n{\n    if (bitmap_alpha < 255 || pSource->HasAlpha() || (pSource->IsAlphaMask() && (pSource->GetBPP() != 1 || !m_bSupportROP))) {\n        return FALSE;\n    }\n    CFX_FloatRect unit_rect = pMatrix->GetUnitRect();\n    FX_RECT full_rect = unit_rect.GetOutterRect();\n    if (FXSYS_fabs(pMatrix->b) < 0.5f && pMatrix->a != 0 && FXSYS_fabs(pMatrix->c) < 0.5f && pMatrix->d != 0) {\n        FX_BOOL bFlipX = pMatrix->a < 0;\n        FX_BOOL bFlipY = pMatrix->d > 0;\n        return StretchDIBits(pSource, color, bFlipX ? full_rect.right : full_rect.left, bFlipY ? full_rect.bottom : full_rect.top,\n                             bFlipX ? -full_rect.Width() : full_rect.Width(), bFlipY ? -full_rect.Height() : full_rect.Height(), NULL, 0,\n                             alpha_flag, pIccTransform, blend_type);\n    }\n    if (FXSYS_fabs(pMatrix->a) < 0.5f && FXSYS_fabs(pMatrix->d) < 0.5f) {\n        CFX_DIBitmap* pTransformed = pSource->SwapXY(pMatrix->c > 0, pMatrix->b < 0);\n        if (pTransformed == NULL) {\n            return FALSE;\n        }\n        FX_BOOL ret = StretchDIBits(pTransformed, color, full_rect.left, full_rect.top, full_rect.Width(), full_rect.Height(), NULL, 0,\n                                    alpha_flag, pIccTransform, blend_type);\n        delete pTransformed;\n        return ret;\n    }\n    if (pSource->GetBPP() == 1) {\n        CFX_DIBitmap* pTransformed = Transform1bppBitmap(pSource, pMatrix);\n        if (pIccTransform == NULL) {\n            return FALSE;\n        }\n        SaveState();\n        CFX_PathData path;\n        path.AppendRect(0, 0, 1.0f, 1.0f);\n        SetClip_PathFill(&path, pMatrix, WINDING);\n        FX_BOOL ret = StretchDIBits(pTransformed, color, full_rect.left, full_rect.top, full_rect.Width(), full_rect.Height(), NULL, 0,\n                                    alpha_flag, pIccTransform, blend_type);\n        RestoreState();\n        delete pTransformed;\n        handle = NULL;\n        return ret;\n    }\n    return FALSE;\n}\nCPSOutput::CPSOutput(HDC hDC)\n{\n    m_hDC = hDC;\n    m_pBuf = NULL;\n}\nCPSOutput::~CPSOutput()\n{\n    if (m_pBuf) {\n        FX_Free(m_pBuf);\n    }\n}\nvoid CPSOutput::Init()\n{\n    m_pBuf = FX_Alloc(FX_CHAR, 1026);\n}\nvoid CPSOutput::OutputPS(FX_LPCSTR string, int len)\n{\n    if (len < 0) {\n        len = (int)FXSYS_strlen(string);\n    }\n    int sent_len = 0;\n    while (len > 0) {\n        int send_len = len > 1024 ? 1024 : len;\n        *(FX_WORD*)m_pBuf = send_len;\n        FXSYS_memcpy(m_pBuf + 2, string + sent_len, send_len);\n        int ret = ExtEscape(m_hDC, PASSTHROUGH, send_len + 2, m_pBuf, 0, NULL);\n        sent_len += send_len;\n        len -= send_len;\n    }\n}\nCPSPrinterDriver::CPSPrinterDriver()\n{\n    m_pPSOutput = NULL;\n    m_bCmykOutput = FALSE;\n}\nCPSPrinterDriver::~CPSPrinterDriver()\n{\n    EndRendering();\n    if (m_pPSOutput) {\n        delete m_pPSOutput;\n    }\n}\nFX_BOOL CPSPrinterDriver::Init(HDC hDC, int pslevel, FX_BOOL bCmykOutput)\n{\n    m_hDC = hDC;\n    m_HorzSize = ::GetDeviceCaps(m_hDC, HORZSIZE);\n    m_VertSize = ::GetDeviceCaps(m_hDC, VERTSIZE);\n    m_Width = ::GetDeviceCaps(m_hDC, HORZRES);\n    m_Height = ::GetDeviceCaps(m_hDC, VERTRES);\n    m_nBitsPerPixel = ::GetDeviceCaps(m_hDC, BITSPIXEL);\n    m_pPSOutput = FX_NEW CPSOutput(hDC);\n    if (!m_pPSOutput) {\n        return FALSE;\n    }\n    ((CPSOutput*)m_pPSOutput)->Init();\n    m_PSRenderer.Init(m_pPSOutput, pslevel, m_Width, m_Height, bCmykOutput);\n    m_bCmykOutput = bCmykOutput;\n    HRGN hRgn = ::CreateRectRgn(0, 0, 1, 1);\n    int ret = ::GetClipRgn(hDC, hRgn);\n    if (ret == 1) {\n        ret = ::GetRegionData(hRgn, 0, NULL);\n        if (ret) {\n            RGNDATA* pData = (RGNDATA*)FX_Alloc(FX_BYTE, ret);\n            if (!pData) {\n                return FALSE;\n            }\n            ret = ::GetRegionData(hRgn, ret, pData);\n            if (ret) {\n                CFX_PathData path;\n                path.AllocPointCount(pData->rdh.nCount * 5);\n                for (FX_DWORD i = 0; i < pData->rdh.nCount; i ++) {\n                    RECT* pRect = (RECT*)(pData->Buffer + pData->rdh.nRgnSize * i);\n                    path.AppendRect((FX_FLOAT)pRect->left, (FX_FLOAT)pRect->bottom, (FX_FLOAT)pRect->right, (FX_FLOAT)pRect->top);\n                }\n                m_PSRenderer.SetClip_PathFill(&path, NULL, FXFILL_WINDING);\n            }\n            FX_Free(pData);\n        }\n    }\n    ::DeleteObject(hRgn);\n    return TRUE;\n}\nint CPSPrinterDriver::GetDeviceCaps(int caps_id)\n{\n    switch (caps_id) {\n        case FXDC_DEVICE_CLASS:\n            return FXDC_PRINTER;\n        case FXDC_PIXEL_WIDTH:\n            return m_Width;\n        case FXDC_PIXEL_HEIGHT:\n            return m_Height;\n        case FXDC_BITS_PIXEL:\n            return m_nBitsPerPixel;\n        case FXDC_RENDER_CAPS:\n            return m_bCmykOutput ? FXRC_BIT_MASK | FXRC_CMYK_OUTPUT : FXRC_BIT_MASK;\n        case FXDC_HORZ_SIZE:\n            return m_HorzSize;\n        case FXDC_VERT_SIZE:\n            return m_VertSize;\n    }\n    return 0;\n}\nFX_BOOL CPSPrinterDriver::StartRendering()\n{\n    return m_PSRenderer.StartRendering();\n}\nvoid CPSPrinterDriver::EndRendering()\n{\n    m_PSRenderer.EndRendering();\n}\nvoid CPSPrinterDriver::SaveState()\n{\n    m_PSRenderer.SaveState();\n}\nvoid CPSPrinterDriver::RestoreState(FX_BOOL bKeepSaved)\n{\n    m_PSRenderer.RestoreState(bKeepSaved);\n}\nFX_BOOL\tCPSPrinterDriver::SetClip_PathFill(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device,\n        int fill_mode)\n{\n    m_PSRenderer.SetClip_PathFill(pPathData, pObject2Device, fill_mode);\n    return TRUE;\n}\nFX_BOOL\tCPSPrinterDriver::SetClip_PathStroke(const CFX_PathData* pPathData,\n        const CFX_AffineMatrix* pObject2Device,\n        const CFX_GraphStateData* pGraphState)\n{\n    m_PSRenderer.SetClip_PathStroke(pPathData, pObject2Device, pGraphState);\n    return TRUE;\n}\nFX_BOOL\tCPSPrinterDriver::DrawPath(const CFX_PathData* pPathData,\n                                   const CFX_AffineMatrix* pObject2Device,\n                                   const CFX_GraphStateData* pGraphState, FX_ARGB fill_color, FX_ARGB stroke_color,\n                                   int fill_mode, int alpha_flag, void* pIccTransform, int blend_type)\n{\n    if (blend_type != FXDIB_BLEND_NORMAL) {\n        return FALSE;\n    }\n    return m_PSRenderer.DrawPath(pPathData, pObject2Device, pGraphState, fill_color, stroke_color, fill_mode & 3, alpha_flag, pIccTransform);\n}\nFX_BOOL CPSPrinterDriver::GetClipBox(FX_RECT* pRect)\n{\n    *pRect = m_PSRenderer.GetClipBox();\n    return TRUE;\n}\nFX_BOOL CPSPrinterDriver::SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,\n                                    int alpha_flag, void* pIccTransform)\n{\n    if (blend_type != FXDIB_BLEND_NORMAL) {\n        return FALSE;\n    }\n    return m_PSRenderer.SetDIBits(pBitmap, color, left, top, alpha_flag, pIccTransform);\n}\nFX_BOOL CPSPrinterDriver::StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,\n                                        int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,\n                                        int alpha_flag, void* pIccTransform, int blend_type)\n{\n    if (blend_type != FXDIB_BLEND_NORMAL) {\n        return FALSE;\n    }\n    return m_PSRenderer.StretchDIBits(pBitmap, color, dest_left, dest_top, dest_width, dest_height, flags, alpha_flag, pIccTransform);\n}\nFX_BOOL\tCPSPrinterDriver::StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,\n                                      const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,\n                                      int alpha_flag, void* pIccTransform, int blend_type)\n{\n    if (blend_type != FXDIB_BLEND_NORMAL) {\n        return FALSE;\n    }\n    if (bitmap_alpha < 255) {\n        return FALSE;\n    }\n    handle = NULL;\n    return m_PSRenderer.DrawDIBits(pBitmap, color, pMatrix, render_flags, alpha_flag, pIccTransform);\n}\nFX_BOOL\tCPSPrinterDriver::DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,\n        CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,\n        int alpha_flag, void* pIccTransform)\n{\n    return m_PSRenderer.DrawText(nChars, pCharPos, pFont, pCache, pObject2Device, font_size, color, alpha_flag, pIccTransform);\n}\n#endif\n"
  },
  {
    "path": "core/src/fxge/win32/win32_int.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\nstruct  WINDIB_Open_Args_;\nclass CGdiplusExt\n{\npublic:\n    CGdiplusExt();\n    ~CGdiplusExt();\n    void\t\t\tLoad();\n    FX_BOOL\t\t\tIsAvailable()\n    {\n        return m_hModule != NULL;\n    }\n    FX_BOOL\t\t\tStretchBitMask(HDC hDC, BOOL bMonoDevice, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,\n                                   int dest_width, int dest_height, FX_DWORD argb, const FX_RECT* pClipRect, int flags);\n    FX_BOOL\t\t\tStretchDIBits(HDC hDC, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,\n                                  int dest_width, int dest_height, const FX_RECT* pClipRect, int flags);\n    FX_BOOL\t\t\tDrawPath(HDC hDC, const CFX_PathData* pPathData,\n                             const CFX_AffineMatrix* pObject2Device,\n                             const CFX_GraphStateData* pGraphState,\n                             FX_DWORD fill_argb,\n                             FX_DWORD stroke_argb,\n                             int fill_mode\n                      );\n\n    void*\t\t\tLoadMemFont(FX_BYTE* pData, FX_DWORD size);\n    void\t\t\tDeleteMemFont(void* pFontCollection);\n    FX_BOOL         GdipCreateFromImage(void* bitmap, void** graphics);\n    void            GdipDeleteGraphics(void* graphics);\n    void            GdipSetTextRenderingHint(void* graphics, int mode);\n    void            GdipSetPageUnit(void* graphics, FX_DWORD unit);\n    void            GdipSetWorldTransform(void* graphics, void* pMatrix);\n    FX_BOOL         GdipDrawDriverString(void *graphics,  unsigned short *text, int length, void *font, void* brush, void *positions, int flags, const void *matrix);\n    void            GdipCreateBrush(FX_DWORD fill_argb, void** pBrush);\n    void            GdipDeleteBrush(void* pBrush);\n    void            GdipCreateMatrix(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f, void** matrix);\n    void            GdipDeleteMatrix(void* matrix);\n    FX_BOOL         GdipCreateFontFamilyFromName(FX_LPCWSTR name, void* pFontCollection, void**pFamily);\n    void            GdipDeleteFontFamily(void* pFamily);\n    FX_BOOL         GdipCreateFontFromFamily(void* pFamily, FX_FLOAT font_size, int fontstyle, int flag, void** pFont);\n    void*           GdipCreateFontFromCollection(void* pFontCollection, FX_FLOAT font_size, int fontstyle);\n    void            GdipDeleteFont(void* pFont);\n    FX_BOOL         GdipCreateBitmap(CFX_DIBitmap* pBitmap, void**bitmap);\n    void            GdipDisposeImage(void* bitmap);\n    void            GdipGetFontSize(void *pFont, FX_FLOAT *size);\n    void*           GdiAddFontMemResourceEx(void *pFontdata, FX_DWORD size, void* pdv, FX_DWORD* num_face);\n    FX_BOOL         GdiRemoveFontMemResourceEx(void* handle);\n    void*\t\t\tm_Functions[100];\n    void*           m_pGdiAddFontMemResourceEx;\n    void*           m_pGdiRemoveFontMemResourseEx;\n    CFX_DIBitmap*\tLoadDIBitmap(WINDIB_Open_Args_ args);\nprotected:\n    HMODULE\t\t\tm_hModule;\n    HMODULE         m_GdiModule;\n};\n#include \"dwrite_int.h\"\nclass CWin32Platform : public CFX_Object\n{\npublic:\n    FX_BOOL\t\t\tm_bHalfTone;\n    CGdiplusExt\t\tm_GdiplusExt;\n    CDWriteExt      m_DWriteExt;\n};\nclass CGdiDeviceDriver : public IFX_RenderDeviceDriver\n{\nprotected:\n    virtual int\t\tGetDeviceCaps(int caps_id);\n    virtual void\tSaveState()\n    {\n        SaveDC(m_hDC);\n    }\n    virtual void\tRestoreState(FX_BOOL bKeepSaved = FALSE)\n    {\n        RestoreDC(m_hDC, -1);\n        if (bKeepSaved) {\n            SaveDC(m_hDC);\n        }\n    }\n    virtual FX_BOOL\tSetClip_PathFill(const CFX_PathData* pPathData,\n                                     const CFX_AffineMatrix* pObject2Device,\n                                     int fill_mode\n                                    );\n    virtual FX_BOOL\tSetClip_PathStroke(const CFX_PathData* pPathData,\n                                       const CFX_AffineMatrix* pObject2Device,\n                                       const CFX_GraphStateData* pGraphState\n                                      );\n    virtual FX_BOOL\tDrawPath(const CFX_PathData* pPathData,\n                             const CFX_AffineMatrix* pObject2Device,\n                             const CFX_GraphStateData* pGraphState,\n                             FX_DWORD fill_color,\n                             FX_DWORD stroke_color,\n                             int fill_mode,\n                             int alpha_flag,\n                             void* pIccTransform,\n                             int\tblend_type\n                            );\n    virtual FX_BOOL FillRect(const FX_RECT* pRect,\n                             FX_DWORD fill_color,\n                             int alpha_flag, void* pIccTransform, int blend_type);\n    virtual FX_BOOL\tDrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,\n                                     int alpha_flag, void* pIccTransform, int blend_type);\n    virtual FX_LPVOID GetClipRgn() ;\n    virtual FX_BOOL SetClipRgn(FX_LPVOID pRgn) ;\n    virtual FX_BOOL GetClipBox(FX_RECT* pRect);\n    virtual FX_BOOL DeleteDeviceRgn(FX_LPVOID pRgn);\n    virtual void\tDrawLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2);\n    virtual void*\tGetPlatformSurface()\n    {\n        return (void*)m_hDC;\n    }\n    FX_BOOL\t\t\tGDI_SetDIBits(const CFX_DIBitmap* pBitmap, const FX_RECT* pSrcRect, int left, int top,\n                                  void* pIccTransform);\n    FX_BOOL\t\t\tGDI_StretchDIBits(const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,\n                                      int dest_width, int dest_height, FX_DWORD flags,\n                                      void* pIccTransform);\n    FX_BOOL\t\t\tGDI_StretchBitMask(const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,\n                                       int dest_width, int dest_height, FX_DWORD bitmap_color, FX_DWORD flags,\n                                       int alpha_flag, void* pIccTransform);\n    HDC\t\t\t\tm_hDC;\n    int\t\t\t\tm_Width, m_Height, m_nBitsPerPixel;\n    int\t\t\t\tm_DeviceClass, m_RenderCaps;\n    CGdiDeviceDriver(HDC hDC, int device_class);\n    ~CGdiDeviceDriver() {}\n};\nclass CGdiDisplayDriver : public CGdiDeviceDriver\n{\npublic:\n    CGdiDisplayDriver(HDC hDC);\nprotected:\n    virtual FX_BOOL GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL, FX_BOOL bDEdge = FALSE);\n    virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,\n                              int alpha_flag, void* pIccTransform);\n    virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,\n                                  int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,\n                                  int alpha_flag, void* pIccTransform, int blend_type);\n    virtual FX_BOOL\tStartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,\n                                const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,\n                                int alpha_flag, void* pIccTransform, int blend_type)\n    {\n        return FALSE;\n    }\n    FX_BOOL\t\t\tUseFoxitStretchEngine(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,\n                                          int dest_width, int dest_height, const FX_RECT* pClipRect, int render_flags,\n                                          int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);\n};\nclass CGdiPrinterDriver : public CGdiDeviceDriver\n{\npublic:\n    CGdiPrinterDriver(HDC hDC);\nprotected:\n    virtual int\t\tGetDeviceCaps(int caps_id);\n    virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,\n                              int alpha_flag, void* pIccTransform);\n    virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,\n                                  int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,\n                                  int alpha_flag, void* pIccTransform, int blend_type);\n    virtual FX_BOOL\tStartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,\n                                const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,\n                                int alpha_flag, void* pIccTransform, int blend_type);\n    int\t\t\t\tm_HorzSize, m_VertSize;\n    FX_BOOL\t\t\tm_bSupportROP;\n};\nclass CPSOutput : public IFX_PSOutput, public CFX_Object\n{\npublic:\n    CPSOutput(HDC hDC);\n    virtual ~CPSOutput();\n    virtual void\t\t\tRelease()\n    {\n        delete this;\n    }\n    void Init();\n    virtual void\tOutputPS(FX_LPCSTR string, int len);\n    HDC\t\t\t\tm_hDC;\n    FX_LPSTR        m_pBuf;\n};\nclass CPSPrinterDriver : public IFX_RenderDeviceDriver\n{\npublic:\n    CPSPrinterDriver();\n    FX_BOOL\t\t\tInit(HDC hDC, int ps_level, FX_BOOL bCmykOutput);\n    ~CPSPrinterDriver();\nprotected:\n    virtual FX_BOOL IsPSPrintDriver()\n    {\n        return TRUE;\n    }\n    virtual int\t\tGetDeviceCaps(int caps_id);\n    virtual FX_BOOL\tStartRendering();\n    virtual void\tEndRendering();\n    virtual void\tSaveState();\n    virtual void\tRestoreState(FX_BOOL bKeepSaved = FALSE);\n    virtual FX_BOOL\tSetClip_PathFill(const CFX_PathData* pPathData,\n                                     const CFX_AffineMatrix* pObject2Device,\n                                     int fill_mode\n                                    );\n    virtual FX_BOOL\tSetClip_PathStroke(const CFX_PathData* pPathData,\n                                       const CFX_AffineMatrix* pObject2Device,\n                                       const CFX_GraphStateData* pGraphState\n                                      );\n    virtual FX_BOOL\tDrawPath(const CFX_PathData* pPathData,\n                             const CFX_AffineMatrix* pObject2Device,\n                             const CFX_GraphStateData* pGraphState,\n                             FX_DWORD fill_color,\n                             FX_DWORD stroke_color,\n                             int fill_mode,\n                             int alpha_flag,\n                             void* pIccTransform,\n                             int blend_type\n                            );\n    virtual FX_BOOL GetClipBox(FX_RECT* pRect);\n    virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,\n                              int alpha_flag, void* pIccTransform);\n    virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,\n                                  int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,\n                                  int alpha_flag, void* pIccTransform, int blend_type);\n    virtual FX_BOOL\tStartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,\n                                const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,\n                                int alpha_flag, void* pIccTransform, int blend_type);\n    virtual FX_BOOL DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,\n                                   CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,\n                                   int alpha_flag, void* pIccTransform);\n    virtual void*\tGetPlatformSurface()\n    {\n        return (void*)m_hDC;\n    }\n    HDC\t\t\t\tm_hDC;\n    FX_BOOL\t\t\tm_bCmykOutput;\n    int\t\t\t\tm_Width, m_Height, m_nBitsPerPixel;\n    int\t\t\t\tm_HorzSize, m_VertSize;\n    CPSOutput*\t\tm_pPSOutput;\n    CFX_PSRenderer\tm_PSRenderer;\n};\nvoid _Color2Argb(FX_ARGB& argb, FX_DWORD color, int alpha_flag, void* pIccTransform);\n"
  },
  {
    "path": "core/src/reflow/autoreflow.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"autoreflow.h\"\n#define approachto(a,b,c) (FXSYS_fabs((float)((a)-(b)))>(c) ? 0 : 1)\nint FPDF_ProcessInterObj(const CPDF_PageObject* pPrevObj, const CPDF_PageObject* pObj)\n{\n    CFX_AffineMatrix matrix;\n    FX_RECT PreRect = pPrevObj->GetBBox(&matrix);\n    FX_RECT rect = pObj->GetBBox(&matrix);\n    int flag = 0;\n    if(PreRect.top > rect.bottom) {\n        flag = 0;\n    } else if(rect.top > PreRect.bottom) {\n        flag = 1;\n    } else if(PreRect.right < rect.left) {\n        flag = 0;\n    } else if(PreRect.left > rect.right) {\n        flag = 1;\n    } else if(pObj->m_Type != PDFPAGE_TEXT) {\n        flag = 1;\n    } else if(pPrevObj->m_Type != PDFPAGE_TEXT) {\n        flag = 0;\n    } else {\n        if((PreRect.top < rect.top && PreRect.bottom > rect.bottom) ||\n                (PreRect.top > rect.top && PreRect.bottom < rect.bottom)) {\n            if(PreRect.left > rect.left) {\n                flag = 1;\n            } else {\n                flag = 0;\n            }\n        } else {\n            CPDF_TextObject* pPrevTextObj = (CPDF_TextObject* )pPrevObj;\n            CPDF_TextObject* pTextObj = (CPDF_TextObject* )pObj;\n            CPDF_TextObjectItem item, prevItem;\n            pPrevTextObj->GetItemInfo(0, &prevItem);\n            pTextObj->GetItemInfo(0, &item);\n            CFX_AffineMatrix TextMatrix;\n            pTextObj->GetTextMatrix(&TextMatrix);\n            FX_FLOAT originX, originY, prevOriginX, preOriginY;\n            TextMatrix.Transform(item.m_OriginX, item.m_OriginY, originX, originY);\n            pPrevTextObj->GetTextMatrix(&TextMatrix);\n            TextMatrix.Transform(prevItem.m_OriginX, prevItem.m_OriginY, prevOriginX, preOriginY);\n            if(preOriginY > originY) {\n                flag = 0;\n            } else {\n                flag = 1;\n            }\n        }\n    }\n    return flag;\n}\nvoid CPDF_AutoReflowLayoutProvider::Conver2AppreceOrder(const CPDF_PageObjects* pStreamOrderObjs, CPDF_PageObjects* pAppraceOrderObjs)\n{\n    FX_POSITION pos = pStreamOrderObjs->GetFirstObjectPosition();\n    CFX_AffineMatrix matrix;\n    while(pos) {\n        CPDF_PageObject* pObj = pStreamOrderObjs->GetNextObject(pos);\n        CFX_AffineMatrix matrix;\n        if(pObj->m_Type != PDFPAGE_TEXT) {\n            continue;\n        }\n        FX_POSITION pos1 = pAppraceOrderObjs->GetLastObjectPosition();\n        while(pos1) {\n            CPDF_PageObject* pTempObj = pAppraceOrderObjs->GetPrevObject(pos1);\n            if(FPDF_ProcessInterObj(pObj, pTempObj) == 1) {\n                if(!pos1) {\n                    pos1 = pAppraceOrderObjs->GetFirstObjectPosition();\n                } else {\n                    pAppraceOrderObjs->GetNextObject(pos1);\n                }\n                break;\n            }\n        }\n        pAppraceOrderObjs->InsertObject(pos1, pObj);\n    }\n    pos = pStreamOrderObjs->GetFirstObjectPosition();\n    while(pos) {\n        CPDF_PageObject* pObj = pStreamOrderObjs->GetNextObject(pos);\n        if(pObj->m_Type != PDFPAGE_IMAGE) {\n            continue;\n        }\n        FX_POSITION pos1 = pAppraceOrderObjs->GetLastObjectPosition();\n        while(pos1) {\n            CPDF_PageObject* pTempObj = pAppraceOrderObjs->GetPrevObject(pos1);\n            if(FPDF_ProcessInterObj(pObj, pTempObj) == 1) {\n                if(!pos1) {\n                    pos1 = pAppraceOrderObjs->GetFirstObjectPosition();\n                } else {\n                    pAppraceOrderObjs->GetNextObject(pos1);\n                }\n                break;\n            }\n        }\n        pAppraceOrderObjs->InsertObject(pos1, pObj);\n    }\n}\nIPDF_LayoutProvider* IPDF_LayoutProvider::Create_LayoutProvider_AutoReflow(CPDF_PageObjects* pPage, FX_BOOL bReadOrder)\n{\n    return FX_NEW CPDF_AutoReflowLayoutProvider(pPage, bReadOrder);\n}\nCPDF_AutoReflowElement::CPDF_AutoReflowElement(LayoutType layoutType , CPDF_AutoReflowElement* pParent)\n{\n    m_ElmType = layoutType;\n    m_pParentElm = pParent;\n    if(pParent) {\n        pParent->m_ChildArray.Add(this);\n    }\n    m_SpaceBefore = 0;\n}\nCPDF_AutoReflowElement::~CPDF_AutoReflowElement()\n{\n    m_ChildArray.RemoveAll();\n    m_ObjArray.RemoveAll();\n}\nint\tCPDF_AutoReflowElement::CountAttrValues(LayoutAttr attr_type)\n{\n    return 1;\n}\nLayoutEnum CPDF_AutoReflowElement::GetEnumAttr(LayoutAttr attr_type, int index )\n{\n    return LayoutInvalid;\n}\nFX_FLOAT\tCPDF_AutoReflowElement::GetNumberAttr(LayoutAttr attr_type, int index )\n{\n    switch (attr_type) {\n        case LayoutSpaceBefore:\n            return m_SpaceBefore;\n        default:\n            return 0;\n    }\n}\nFX_COLORREF\tCPDF_AutoReflowElement::GetColorAttr(LayoutAttr attr_type, int index )\n{\n    return 0;\n}\n#define WritingMode_UNKNOW\t0\n#define WritingMode_LRTB\t1\n#define WritingMode_RLTB\t2\n#define WritingMode_TBRL\t3\nCPDF_AutoReflowLayoutProvider::CPDF_AutoReflowLayoutProvider(CPDF_PageObjects* pPage, FX_BOOL bReadOrder)\n{\n    m_pPDFPage = (CPDF_Page*)pPage;\n    FX_FLOAT width = m_pPDFPage->GetPageWidth();\n    FX_FLOAT height = m_pPDFPage->GetPageHeight();\n    m_pPDFPage->GetDisplayMatrix(m_PDFDisplayMatrix, 0, 0, (int)(m_pPDFPage->GetPageWidth()), (int)(m_pPDFPage->GetPageHeight()), 0);\n    m_bReadOrder = bReadOrder;\n    m_Status = LayoutReady;\n    m_pRoot = NULL;\n    m_pCurrElm = NULL;\n    m_pPreObj = NULL;\n    m_Step = 0;\n    m_WritingMode = WritingMode_UNKNOW;\n}\nCPDF_AutoReflowLayoutProvider::~CPDF_AutoReflowLayoutProvider()\n{\n    m_pPDFPage = NULL;\n    ReleaseElm(m_pRoot);\n}\nvoid CPDF_AutoReflowLayoutProvider::ReleaseElm(CPDF_AutoReflowElement*& pElm, FX_BOOL bReleaseChildren)\n{\n    if(bReleaseChildren) {\n        int count = pElm->CountChildren();\n        for(int i = 0; i < count; i++) {\n            CPDF_AutoReflowElement* pChild = (CPDF_AutoReflowElement*)pElm->GetChild(i);\n            ReleaseElm(pChild);\n        }\n    }\n    delete pElm;\n    pElm = NULL;\n}\nvoid CPDF_AutoReflowLayoutProvider::AddObjectArray(CPDF_AutoReflowElement* pElm, CFX_PtrList& ObjList)\n{\n    if(!pElm) {\n        return;\n    }\n    FX_POSITION pos = ObjList.GetHeadPosition();\n    while (pos) {\n        pElm->m_ObjArray.Add((CPDF_PageObject*)ObjList.GetNext(pos));\n    }\n}\nvoid CPDF_AutoReflowLayoutProvider::GenerateStructTree()\n{\n    if (m_Step < AUTOREFLOW_STEP_GENERATELINE) {\n        GenerateLine(m_cellArray);\n        if(m_cellArray.GetSize() == 0) {\n            m_Status = LayoutError;\n            return;\n        }\n        if(m_pPause && m_pPause->NeedToPauseNow()) {\n            m_Step = AUTOREFLOW_STEP_GENERATELINE;\n            m_Status = LayoutToBeContinued;\n            return;\n        }\n    }\n    if (m_Step < AUTOREFLOW_STEP_GENERATEParagraph) {\n        GenerateParagraph(m_cellArray);\n        if(m_pPause && m_pPause->NeedToPauseNow()) {\n            m_Step = AUTOREFLOW_STEP_GENERATEParagraph;\n            m_Status = LayoutToBeContinued;\n            return;\n        }\n    }\n    if (m_Step < AUTOREFLOW_STEP_CREATEELEMENT) {\n        CreateElement();\n        if(m_pPause && m_pPause->NeedToPauseNow()) {\n            m_Step = AUTOREFLOW_STEP_CREATEELEMENT;\n            m_Status = LayoutToBeContinued;\n            return;\n        }\n    }\n    if (m_Step < AUTOREFLOW_STEP_REMOVEDATA) {\n        int count = m_cellArray.GetSize();\n        for(int i = 0; i < count; i++) {\n            CRF_CELL* pCell = (CRF_CELL*)m_cellArray.GetAt(i);\n            if(pCell) {\n                pCell->m_ObjList.RemoveAll();\n                delete pCell;\n            }\n        }\n        m_cellArray.RemoveAll();\n        if(m_pPause && m_pPause->NeedToPauseNow()) {\n            m_Step = AUTOREFLOW_STEP_REMOVEDATA;\n            m_Status = LayoutToBeContinued;\n            return;\n        }\n    }\n    m_Step = AUTOREFLOW_STEP_REMOVEDATA;\n    m_Status = LayoutFinished;\n    return;\n}\nvoid CPDF_AutoReflowLayoutProvider::CreateElement()\n{\n    int count = m_cellArray.GetSize();\n    CRF_CELL* plastCell = NULL;\n    CRF_CELL* pCell = NULL;\n    CRF_CELL* pNextCell = NULL;\n    CPDF_AutoReflowElement* pParent = m_pRoot;\n    CPDF_AutoReflowElement* pCurrElm = NULL;\n    int i;\n    for(i = 0; i < count; i++) {\n        pCell = (CRF_CELL*)m_cellArray.GetAt(i);\n        if(!pCell) {\n            continue;\n        }\n        if(i < count - 1) {\n            pNextCell = (CRF_CELL*)m_cellArray.GetAt(i + 1);\n        } else {\n            pNextCell = NULL;\n        }\n        pCurrElm = NULL;\n        pCurrElm = FX_NEW CPDF_AutoReflowElement(LayoutParagraph, pParent);\n        if(pCurrElm->GetType() == LayoutParagraph && plastCell) {\n            int SpaceBefore = 0;\n            if(pCell->m_CellWritingMode != plastCell->m_CellWritingMode ) {\n                SpaceBefore = 20;\n            } else if(pCell->m_CellWritingMode == WritingMode_LRTB) {\n                SpaceBefore = plastCell->m_BBox.bottom - pCell->m_BBox.top;\n            } else if(pCell->m_CellWritingMode == WritingMode_TBRL) {\n                SpaceBefore = plastCell->m_BBox.left - pCell->m_BBox.right;\n            }\n            if(SpaceBefore > 0) {\n                pCurrElm->m_SpaceBefore = SpaceBefore > 50 ? 50.0f : SpaceBefore;\n            }\n        }\n        AddObjectArray(pCurrElm, pCell->m_ObjList);\n        plastCell = pCell;\n    }\n}\nvoid CPDF_AutoReflowLayoutProvider::GenerateParagraph(CFX_PtrArray& cellArray)\n{\n    int count = cellArray.GetSize();\n    if(count <= 1) {\n        return;\n    }\n    CRF_CELL* plastCell = (CRF_CELL*)cellArray.GetAt(0);\n    if(plastCell->m_BBox.Height() > plastCell->m_BBox.Width()) {\n        m_WritingMode = WritingMode_TBRL;\n    } else {\n        m_WritingMode = WritingMode_LRTB;\n    }\n    FX_BOOL bEnforce = FALSE;\n    int i = 0;\n    for(i = 1; i < count; i++) {\n        CRF_CELL* pCell = (CRF_CELL*)cellArray.GetAt(i);\n        if(!pCell) {\n            continue;\n        }\n        int c = pCell->m_ObjList.GetCount();\n        FX_BOOL bMerge = FALSE;\n        FX_POSITION pos1 = plastCell->m_ObjList.GetTailPosition();\n        CPDF_PageObject* pLastObj = (CPDF_PageObject*)plastCell->m_ObjList.GetPrev(pos1);\n        pos1 = pCell->m_ObjList.GetHeadPosition();\n        CPDF_PageObject* pCurObj = (CPDF_PageObject*)pCell->m_ObjList.GetNext(pos1);\n        int WritingMode = GetRectEnd(pCell->m_BBox);\n        if(pCell->m_CellWritingMode == WritingMode_UNKNOW) {\n            if(pCell->m_BBox.Height() > pCell->m_BBox.Width()) {\n                pCell->m_CellWritingMode = WritingMode_TBRL;\n            } else {\n                pCell->m_CellWritingMode = WritingMode_LRTB;\n            }\n        }\n        WritingMode = pCell->m_CellWritingMode;\n        if(WritingMode == WritingMode_LRTB && (m_Style.m_Language & LP_Lang_ChinesePRC || m_Style.m_Language & LP_Lang_ChineseTaiwan\n                                               || m_Style.m_Language & LP_Lang_Japanese || m_Style.m_Language & LP_Lang_Korean)) {\n            if(pCurObj->m_Type == PDFPAGE_TEXT) {\n                CPDF_TextObject* pText;\n                pText = (CPDF_TextObject*)pCurObj;\n                if(pText->CountItems()) {\n                    CPDF_TextObjectItem item;\n                    pText->GetItemInfo(0, &item);\n                    CFX_WideString str = pText->GetFont()->UnicodeFromCharCode(item.m_CharCode);\n                    FX_WCHAR unicode = str.GetAt(0);\n                    if(unicode == 32) {\n                        plastCell = pCell;\n                        bMerge = FALSE;\n                        bEnforce = FALSE;\n                        continue;\n                    }\n                }\n            }\n        }\n        if(m_WritingMode == WritingMode) {\n            if(bEnforce) {\n                bMerge = FALSE;\n                bEnforce = FALSE;\n                if(pCurObj->m_Type == PDFPAGE_TEXT) {\n                    CPDF_TextObject* pText;\n                    pText = (CPDF_TextObject*)pCurObj;\n                    if(pText->CountItems()) {\n                        CPDF_TextObjectItem item;\n                        pText->GetItemInfo(0, &item);\n                        CFX_WideString str = pText->GetFont()->UnicodeFromCharCode(item.m_CharCode);\n                        FX_WCHAR unicode = str.GetAt(0);\n                        if(unicode > 96 && unicode < 123) {\n                            bMerge = TRUE;\n                        }\n                    }\n                } else {\n                    CPDF_ImageObject* pImage = (CPDF_ImageObject*)pCurObj;\n                    FX_RECT imageBBox = pImage->GetBBox(&m_PDFDisplayMatrix);\n                    if(GetRectEnd(plastCell->m_BBox) - GetRectEnd(pCell->m_BBox) < GetRectWidth(imageBBox)) {\n                        bMerge = TRUE;\n                    }\n                }\n            } else {\n                if(!approachto(GetRectStart(pCell->m_BBox), GetRectStart(plastCell->m_BBox), GetRectHeight(pCell->m_BBox) / 4)) {\n                    if(approachto(GetRectStart(plastCell->m_BBox), GetRectStart(pCell->m_BBox), GetRectHeight(pCell->m_BBox) * 2.3) &&\n                            GetRectStart(plastCell->m_BBox) - GetRectStart(pCell->m_BBox) > 0) {\n                        if(pCurObj->m_Type == PDFPAGE_TEXT || pLastObj->m_Type == PDFPAGE_TEXT) {\n                            CPDF_TextObject* pText;\n                            if(pCurObj->m_Type == PDFPAGE_TEXT) {\n                                pText = (CPDF_TextObject*)pCurObj;\n                            } else {\n                                pText = (CPDF_TextObject*)pLastObj;\n                            }\n                            CPDF_TextObjectItem item;\n                            pText->GetItemInfo(0, &item);\n                            CFX_WideString str = pText->GetFont()->UnicodeFromCharCode(item.m_CharCode);\n                            FX_WCHAR unicode = str.GetAt(0);\n                            if(unicode > 255) {\n                                bMerge = TRUE;\n                            }\n                        }\n                    }\n                } else if(!approachto(GetRectEnd(pCell->m_BBox), GetRectEnd(plastCell->m_BBox), GetRectHeight(pCell->m_BBox) * 3)) {\n                    FX_RECT rect = pLastObj->GetBBox(&m_PDFDisplayMatrix);\n                    if(approachto(GetRectStart(pCell->m_BBox), GetRectStart(plastCell->m_BBox), GetRectHeight(pCell->m_BBox) / 4)) {\n                        if(GetRectEnd(rect) - GetRectEnd(pCell->m_BBox) > 0) {\n                            bMerge = TRUE;\n                            bEnforce = TRUE;\n                        } else if(GetRectEnd(rect) - GetRectEnd(pCell->m_BBox) <= 0 &&\n                                  GetRectEnd(rect) - GetRectEnd(pCell->m_BBox) > GetRectHeight(pCell->m_BBox) * -3) {\n                            if(pCurObj->m_Type == PDFPAGE_TEXT) {\n                                CPDF_TextObject* pText = (CPDF_TextObject*)pCurObj;\n                                CPDF_TextObjectItem item;\n                                pText->GetItemInfo(0, &item);\n                                CFX_WideString str = pText->GetFont()->UnicodeFromCharCode(item.m_CharCode);\n                                FX_WCHAR unicode = str.GetAt(0);\n                                if(unicode > 96 && unicode < 123) {\n                                    bMerge = TRUE;\n                                }\n                            }\n                        }\n                    }\n                } else {\n                    bMerge = TRUE;\n                }\n            }\n        } else {\n            m_WritingMode = WritingMode;\n            bEnforce = FALSE;\n        }\n        if(bMerge) {\n            if(GetRectEnd(plastCell->m_BBox) - GetRectEnd(pCell->m_BBox) > 30) {\n                bEnforce = TRUE;\n            }\n            FX_POSITION pos = pCell->m_ObjList.GetHeadPosition();\n            while(pos) {\n                plastCell->m_ObjList.AddTail(pCell->m_ObjList.GetNext(pos));\n            }\n            plastCell->m_BBox.Union(pCell->m_BBox);\n            pCell->m_ObjList.RemoveAll();\n            delete pCell;\n            cellArray.RemoveAt(i);\n            i--;\n            count--;\n        } else {\n            plastCell = pCell;\n        }\n    }\n}\nvoid CPDF_AutoReflowLayoutProvider::ProcessObj(CFX_PtrArray& cellArray, CPDF_PageObject* pObj, CFX_AffineMatrix matrix)\n{\n}\nFX_INT32 CPDF_AutoReflowLayoutProvider::LogicPreObj(CPDF_PageObject* pObj)\n{\n    CPDF_PageObject* pPreObj = m_pPreObj;\n    m_pPreObj = pObj;\n    if(!pPreObj) {\n        return 0;\n    }\n    if(pPreObj->m_Type != pObj->m_Type) {\n        return 0;\n    }\n    CFX_FloatRect rcCurObj(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);\n    CFX_FloatRect rcPreObj(pPreObj->m_Left, pPreObj->m_Bottom, pPreObj->m_Right, pPreObj->m_Top);\n    if(pObj->m_Type == PDFPAGE_IMAGE) {\n        if(rcPreObj.Contains(rcCurObj)) {\n            return 2;\n        }\n        if(rcCurObj.Contains(rcPreObj)) {\n            return 2;\n        }\n        return 0;\n    }\n    if(pObj->m_Type == PDFPAGE_TEXT) {\n        if(!((rcPreObj.bottom > rcCurObj.top) || (rcPreObj.top < rcCurObj.bottom))) {\n            FX_FLOAT height = FX_MIN(rcPreObj.Height(), rcCurObj.Height());\n            if((rcCurObj.left - rcPreObj.right) > height / 3) {\n                return 3;\n            }\n        }\n        if(FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) >= 2 || FXSYS_fabs(rcPreObj.Height() - rcCurObj.Height()) >= 2 ) {\n            return 0;\n        }\n        CPDF_TextObject* pPreTextObj = (CPDF_TextObject*)pPreObj;\n        CPDF_TextObject* pCurTextObj = (CPDF_TextObject*)pObj;\n        int nPreCount = pPreTextObj->CountItems();\n        int nCurCount = pCurTextObj->CountItems();\n        if (nPreCount != nCurCount) {\n            return 0;\n        }\n        FX_BOOL bSame = TRUE;\n        for (int i = 0; i < nPreCount; i++) {\n            CPDF_TextObjectItem itemPer, itemCur;\n            pPreTextObj->GetItemInfo(i, &itemPer);\n            pCurTextObj->GetItemInfo(i, &itemCur);\n            if (itemCur.m_CharCode != itemPer.m_CharCode) {\n                return 0;\n            }\n            if (itemCur.m_OriginX != itemPer.m_OriginX) {\n                bSame = FALSE;\n            }\n            if (itemCur.m_OriginY != itemPer.m_OriginY) {\n                bSame = FALSE;\n            }\n        }\n        if(rcPreObj.left == rcCurObj.left && rcPreObj.top == rcCurObj.top) {\n            return 1;\n        }\n        if(FXSYS_fabs(rcPreObj.left - rcCurObj.left) < rcPreObj.Width() / 3\n                && FXSYS_fabs(rcPreObj.top - rcCurObj.top) < rcPreObj.Height() / 3) {\n            return 2;\n        }\n    }\n    return 0;\n}\nvoid CPDF_AutoReflowLayoutProvider::GenerateLine(CFX_PtrArray& cellArray)\n{\n    CRF_CELL* pCell = NULL;\n    CFX_AffineMatrix matrix;\n    FX_POSITION pos = m_pPDFPage->GetFirstObjectPosition();\n    if(!pos) {\n        return;\n    }\n    FX_FLOAT PDFWidth = m_pPDFPage->GetPageWidth();\n    FX_FLOAT PDFHeight = m_pPDFPage->GetPageHeight();\n    m_pPDFPage->GetDisplayMatrix(m_PDFDisplayMatrix, 0, 0, (int)PDFWidth, (int)PDFHeight, 0);\n    CPDF_PageObject* pPerObj = NULL;\n    int a = 0;\n    CFX_FloatRect pageBBox = m_pPDFPage->m_BBox;\n    FX_FLOAT PrevX = 0 , PrevY = 0, PosX, PosY;\n    while(pos) {\n        CPDF_PageObject* pObj = m_pPDFPage->GetNextObject(pos);\n        if(!pObj || pObj->m_Type == PDFPAGE_PATH) {\n            continue;\n        }\n        int logic = LogicPreObj(pObj);\n        if(logic == 2) {\n            if(pCell) {\n                pCell->m_ObjList.SetAt(pCell->m_ObjList.GetTailPosition(), pObj);\n            }\n            continue;\n        }\n        if (pObj->m_Type == PDFPAGE_TEXT) {\n            CPDF_TextObject* pTextObj = (CPDF_TextObject*)pObj;\n            int textmode = pTextObj->m_TextState.GetObject()->m_TextMode;\n            if(m_Style.m_bIgnoreInvisibleText && pTextObj->m_TextState.GetObject()->m_TextMode == 3) {\n                continue;\n            }\n            PosX = pTextObj->GetPosX();\n            PosY = pTextObj->GetPosY();\n            m_PDFDisplayMatrix.Transform(PosX, PosY);\n        } else {\n            PosX = 0;\n            PosY = 0;\n        }\n        FX_BOOL bNewLine = TRUE;\n        FX_RECT ObjBBox = pObj->GetBBox(&m_PDFDisplayMatrix);\n        if(ObjBBox.left > PDFWidth || ObjBBox.right < 0 ||\n                ObjBBox.bottom < 0 || ObjBBox.top > PDFHeight) {\n            continue;\n        }\n        if(ObjBBox.IsEmpty()) {\n            continue;\n        }\n        a++;\n        if(!pCell) {\n            bNewLine = TRUE;\n            m_WritingMode = GetWritingMode(NULL, pObj);\n        } else {\n            int WritingMode = GetWritingMode(pPerObj, pObj);\n            if(m_WritingMode == WritingMode || m_WritingMode == WritingMode_UNKNOW || WritingMode == WritingMode_UNKNOW) {\n                if(WritingMode != WritingMode_UNKNOW) {\n                    m_WritingMode = WritingMode;\n                }\n                if(m_WritingMode == WritingMode_TBRL) {\n                    if(!(GetRectBottom(ObjBBox) > GetRectTop(pCell->m_BBox) ||\n                            GetRectTop(ObjBBox) < GetRectBottom(pCell->m_BBox))) {\n                        bNewLine = FALSE;\n                    }\n                } else {\n                    if(!(GetRectBottom(ObjBBox) < GetRectTop(pCell->m_BBox) ||\n                            GetRectTop(ObjBBox) > GetRectBottom(pCell->m_BBox))) {\n                        bNewLine = FALSE;\n                    }\n                    if (pObj->m_Type == PDFPAGE_TEXT) {\n                        if(FXSYS_fabs(PrevY - PosY) < 1 ) {\n                            bNewLine = FALSE;\n                        }\n                    }\n                }\n            } else {\n                m_WritingMode = WritingMode;\n            }\n        }\n        pPerObj = pObj;\n        if(bNewLine) {\n            int c = pCell ? pCell->m_ObjList.GetCount() : 0;\n            pCell = FX_NEW CRF_CELL;\n            pCell->m_CellWritingMode = m_WritingMode;\n            pCell->m_BBox = ObjBBox;\n            if(pObj->m_Type == PDFPAGE_TEXT) {\n                FX_FLOAT x = ((CPDF_TextObject*)pObj)->GetPosX(), y = ((CPDF_TextObject*)pObj)->GetPosY();\n                m_PDFDisplayMatrix.Transform(x, y);\n                if(x < ObjBBox.left) {\n                    pCell->m_BBox.left = (int)x;\n                }\n            }\n            pCell->m_ObjList.AddTail(pObj);\n            cellArray.Add(pCell);\n        } else {\n            pCell->m_ObjList.AddTail(pObj);\n            pCell->m_BBox.Union(ObjBBox);\n        }\n        PrevX = PosX;\n        PrevY = PosY;\n    }\n}\nFX_FLOAT CPDF_AutoReflowLayoutProvider::GetLayoutOrderHeight(CPDF_PageObject* pCurObj)\n{\n    CFX_FloatRect rcCurObj(pCurObj->m_Left, pCurObj->m_Bottom, pCurObj->m_Right, pCurObj->m_Top);\n    if (m_WritingMode == WritingMode_TBRL) {\n        return rcCurObj.Width();\n    }\n    return rcCurObj.Height();\n}\nFX_FLOAT CPDF_AutoReflowLayoutProvider::GetLayoutOrderWidth(CPDF_PageObject* pCurObj)\n{\n    CFX_FloatRect rcCurObj(pCurObj->m_Left, pCurObj->m_Bottom, pCurObj->m_Right, pCurObj->m_Top);\n    if (m_WritingMode == WritingMode_TBRL) {\n        return rcCurObj.Height();\n    }\n    return rcCurObj.Width();\n}\nint CPDF_AutoReflowLayoutProvider:: GetRectWidth(FX_RECT rect)\n{\n    if(m_WritingMode == WritingMode_TBRL) {\n        return rect.Height();\n    }\n    return rect.Width();\n}\nint CPDF_AutoReflowLayoutProvider:: GetRectHeight(FX_RECT rect)\n{\n    if(m_WritingMode == WritingMode_TBRL) {\n        return rect.Width();\n    }\n    return rect.Height();\n}\nint CPDF_AutoReflowLayoutProvider:: GetRectStart(FX_RECT rect)\n{\n    if(m_WritingMode == WritingMode_TBRL) {\n        return rect.top;\n    }\n    return rect.left;\n}\nint CPDF_AutoReflowLayoutProvider:: GetRectEnd(FX_RECT rect)\n{\n    if(m_WritingMode == WritingMode_TBRL) {\n        return rect.bottom;\n    }\n    return rect.right;\n}\nint CPDF_AutoReflowLayoutProvider:: GetRectTop(FX_RECT rect)\n{\n    if(m_WritingMode == WritingMode_TBRL) {\n        return rect.right;\n    }\n    return rect.top;\n}\nint CPDF_AutoReflowLayoutProvider:: GetRectBottom(FX_RECT rect)\n{\n    if(m_WritingMode == WritingMode_TBRL) {\n        return rect.left;\n    }\n    return rect.bottom;\n}\nint CPDF_AutoReflowLayoutProvider::GetWritingMode(CPDF_PageObject* pPreObj, CPDF_PageObject* pCurObj)\n{\n    CFX_FloatRect rcCurObj(pCurObj->m_Left, pCurObj->m_Bottom, pCurObj->m_Right, pCurObj->m_Top);\n    if(pCurObj->m_Type == PDFPAGE_TEXT) {\n        CPDF_TextObject* ptextObj = (CPDF_TextObject* )pCurObj;\n        int count = ptextObj->CountItems();\n        if(count > 1) {\n            CPDF_TextObjectItem Item1, Item2;\n            ptextObj->GetItemInfo(0, &Item1);\n            ptextObj->GetItemInfo(count - 1, &Item2);\n            if(Item2.m_CharCode == -1 && count > 2) {\n                ptextObj->GetItemInfo(2, &Item2);\n            }\n            CFX_AffineMatrix textMatrix;\n            ptextObj->GetTextMatrix(&textMatrix);\n            textMatrix.Transform(Item1.m_OriginX, Item1.m_OriginY);\n            textMatrix.Transform(Item2.m_OriginX, Item2.m_OriginY);\n            FX_FLOAT dx = FXSYS_fabs(Item1.m_OriginX - Item2.m_OriginX);\n            FX_FLOAT dy = FXSYS_fabs(Item1.m_OriginY - Item2.m_OriginY);\n            return dx >= dy ? WritingMode_LRTB : WritingMode_TBRL;\n        } else {\n            if(m_WritingMode != WritingMode_UNKNOW) {\n                return m_WritingMode;\n            }\n        }\n    }\n    if(pPreObj) {\n        FX_FLOAT threshold = rcCurObj.Width() / 4;\n        if(m_WritingMode == WritingMode_LRTB) {\n            if(FXSYS_fabs(pPreObj->m_Bottom - pCurObj->m_Bottom) < threshold * 2\n                    && FXSYS_fabs(pPreObj->m_Top - pCurObj->m_Top) < threshold * 2) {\n                return m_WritingMode;\n            }\n            FX_FLOAT mid = (pCurObj->m_Bottom + pCurObj->m_Top) / 2;\n            if(mid > pPreObj->m_Bottom && mid < pPreObj->m_Top && pCurObj->m_Right > pPreObj->m_Right) {\n                return m_WritingMode;\n            }\n        } else if(m_WritingMode == WritingMode_TBRL) {\n            if(FXSYS_fabs(pPreObj->m_Left - pCurObj->m_Left) < threshold * 2\n                    && FXSYS_fabs(pPreObj->m_Right - pCurObj->m_Right) < threshold * 2) {\n                return m_WritingMode;\n            }\n            FX_FLOAT mid = (pCurObj->m_Right + pCurObj->m_Left) / 2;\n            if(mid > pPreObj->m_Left && mid < pPreObj->m_Right && pCurObj->m_Bottom < pPreObj->m_Bottom) {\n                return m_WritingMode;\n            }\n        }\n        if(FXSYS_fabs(pPreObj->m_Left - pCurObj->m_Left) < threshold &&\n                FXSYS_fabs(pPreObj->m_Bottom - pCurObj->m_Bottom) > threshold * 2) {\n            return WritingMode_TBRL;\n        }\n        if(FXSYS_fabs(pPreObj->m_Left - pCurObj->m_Left) > threshold &&\n                FXSYS_fabs(pPreObj->m_Bottom - pCurObj->m_Bottom) < threshold * 2) {\n            return WritingMode_LRTB;\n        }\n        int count = 0;\n        if(pPreObj->m_Type == PDFPAGE_TEXT) {\n            CPDF_TextObject* ptextObj = (CPDF_TextObject* )pCurObj;\n            count = ptextObj->CountItems();\n        }\n        if(pPreObj->m_Type != PDFPAGE_TEXT || count == 1) {\n            if(pCurObj->m_Left > pPreObj->m_Right) {\n                FX_FLOAT mid = (pCurObj->m_Top + pCurObj->m_Bottom) / 2;\n                if(mid < pPreObj->m_Top && mid > pPreObj->m_Bottom) {\n                    return WritingMode_LRTB;\n                }\n            }\n            if(pCurObj->m_Top < pPreObj->m_Bottom) {\n                FX_FLOAT mid = (pCurObj->m_Left + pCurObj->m_Right) / 2;\n                if(mid < pPreObj->m_Right && mid > pPreObj->m_Left) {\n                    return WritingMode_TBRL;\n                }\n            }\n        }\n    }\n    return WritingMode_UNKNOW;\n}\nLayoutStatus CPDF_AutoReflowLayoutProvider::StartLoad(IFX_Pause* pPause)\n{\n    m_pPause = pPause;\n    m_pRoot = FX_NEW CPDF_AutoReflowElement(LayoutDocument);\n    if(!m_pRoot) {\n        return LayoutError;\n    }\n    m_Step = 0;\n    return Continue();\n}\nLayoutStatus CPDF_AutoReflowLayoutProvider::Continue()\n{\n    GenerateStructTree();\n    return m_Status;\n}\nint\tCPDF_AutoReflowLayoutProvider::GetPosition()\n{\n    if(m_Step == 0) {\n        return 0;\n    } else {\n        return m_Step * 100 / AUTOREFLOW_STEP_REMOVEDATA;\n    }\n}\nFX_FLOAT CPDF_AutoReflowLayoutProvider::GetObjMinCell(CPDF_PageObject* pObj)\n{\n    if(!pObj) {\n        return 0;\n    }\n    if(pObj->m_Type != PDFPAGE_TEXT) {\n        CFX_AffineMatrix matrix;\n        FX_RECT rect = pObj->GetBBox(&matrix);\n        return (FX_FLOAT)(rect.Width());\n    }\n    CPDF_TextObject* pTextObj = (CPDF_TextObject* )pObj;\n    int count = pTextObj->CountItems();\n    for(int i = 0; i < count; i++) {\n        CPDF_TextObjectItem Item;\n        pTextObj->GetItemInfo(i, &Item);\n        if(Item.m_CharCode == -1) {\n            continue;\n        }\n        if((Item.m_CharCode > 47 && Item.m_CharCode < 58) || (Item.m_CharCode > 64 && Item.m_CharCode < 91)\n                || (Item.m_CharCode > 96 && Item.m_CharCode < 123)) {\n            continue;\n        }\n        if(Item.m_CharCode > 127 || (Item.m_CharCode > 32 && Item.m_CharCode < 35) || Item.m_CharCode == 37 ||\n                (Item.m_CharCode > 38 && Item.m_CharCode < 42) || Item.m_CharCode == 44 || Item.m_CharCode == 46 ||\n                Item.m_CharCode == 58 || Item.m_CharCode == 59 || Item.m_CharCode == 63 || Item.m_CharCode == 93) {\n            if(i == count - 1) {\n                CFX_AffineMatrix matrix;\n                FX_RECT rect = pObj->GetBBox(&matrix);\n                return (FX_FLOAT)(rect.Width());\n            } else {\n                pTextObj->GetItemInfo(i + 1, &Item);\n                return Item.m_OriginX;\n            }\n        }\n        return Item.m_OriginX;\n    }\n    CFX_AffineMatrix matrix;\n    FX_RECT rect = pObj->GetBBox(&matrix);\n    return (FX_FLOAT)(rect.Width());\n}\n"
  },
  {
    "path": "core/src/reflow/autoreflow.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _AUTOREFLOW_H\n#define _AUTOREFLOW_H\n#include \"../../include/reflow/reflowengine.h\"\n#include \"reflowedpage.h\"\nclass CPDF_AutoReflowElement;\nclass CPDF_AutoReflowLayoutProvider;\ntypedef CFX_ArrayTemplate<CPDF_AutoReflowElement*> CAR_ElmPtrArray;\ntypedef CFX_ArrayTemplate<CPDF_PageObject*> CAR_ObjPtrArray;\nclass CRF_CELL : public CFX_Object\n{\npublic:\n    CRF_CELL() { };\n    ~CRF_CELL() { };\n    CFX_PtrList\t\tm_ObjList;\n    int\t\t\tm_CellWritingMode;\n    FX_RECT\t\tm_BBox;\n};\nclass CPDF_AutoReflowElement : public IPDF_LayoutElement, public CFX_Object\n{\npublic:\n    CPDF_AutoReflowElement(LayoutType layoutType = LayoutUnknown , CPDF_AutoReflowElement* pParent = NULL) ;\n    ~CPDF_AutoReflowElement();\n    LayoutType GetType()\n    {\n        return m_ElmType;\n    }\n    void\tGetRect(CFX_FloatRect& rcRect) {};\n\n    int  CountAttrValues(LayoutAttr attr_type);\n    LayoutEnum  GetEnumAttr(LayoutAttr attr_type, int index);\n    FX_FLOAT GetNumberAttr(LayoutAttr attr_type, int index);\n    FX_COLORREF GetColorAttr(LayoutAttr attr_type, int index);\n\n    int  CountChildren()\n    {\n        return m_ChildArray.GetSize();\n    }\n    IPDF_LayoutElement* GetChild(int index)\n    {\n        return m_ChildArray.GetAt(index);\n    }\n\n    IPDF_LayoutElement* GetParent()\n    {\n        return m_pParentElm;\n    }\n    int\t\tCountObjects()\n    {\n        return m_ObjArray.GetSize();\n    }\n    CPDF_PageObject*\tGetObject(int index)\n    {\n        return m_ObjArray.GetAt(index);\n    }\n    CPDF_AutoReflowElement* m_pParentElm;\n    LayoutType\t\tm_ElmType;\n    CAR_ElmPtrArray m_ChildArray;\n    CAR_ObjPtrArray m_ObjArray;\n    FX_FLOAT\t\tm_SpaceBefore;\n};\n#define AUTOREFLOW_STEP_GENERATELINE\t\t1\n#define AUTOREFLOW_STEP_GENERATEParagraph\t2\n#define AUTOREFLOW_STEP_CREATEELEMENT\t\t3\n#define AUTOREFLOW_STEP_REMOVEDATA\t\t\t4\nclass CPDF_AutoReflowLayoutProvider : public IPDF_LayoutProvider, public CFX_Object\n{\npublic:\n    CPDF_AutoReflowLayoutProvider(CPDF_PageObjects* pPage, FX_BOOL bReadOrder);\n    ~CPDF_AutoReflowLayoutProvider();\n    void\tSetLayoutProviderStyle(LAYOUTPROVIDER_STYLE Style)\n    {\n        m_Style = Style;\n    }\n    LayoutStatus StartLoad(IFX_Pause* pPause = NULL);\n    LayoutStatus Continue();\n    int\t \t\tGetPosition();\n    IPDF_LayoutElement* GetRoot()\n    {\n        return m_pRoot;\n    }\n    FX_FLOAT GetObjMinCell(CPDF_PageObject* pObj);\n    void Conver2AppreceOrder(const CPDF_PageObjects* pStreamOrderObjs, CPDF_PageObjects* pAppraceOrderObjs);\n    void\tReleaseElm(CPDF_AutoReflowElement*& pElm, FX_BOOL bReleaseChildren = TRUE);\n    void GenerateCell();\n    void GenerateStructTree();\n    void GenerateLine(CFX_PtrArray& cellArray);\n    void GenerateParagraph(CFX_PtrArray& cellArray);\n    void CreateElement();\n    void AddObjectArray(CPDF_AutoReflowElement* pElm, CFX_PtrList& ObjList);\n    FX_FLOAT GetLayoutOrderHeight(CPDF_PageObject* pCurObj);\n    FX_FLOAT GetLayoutOrderWidth(CPDF_PageObject* pCurObj);\n    int GetWritingMode(CPDF_PageObject* pPreObj, CPDF_PageObject* pCurObj);\n    int GetRectStart(FX_RECT rect);\n    int GetRectEnd(FX_RECT rect);\n    int GetRectTop(FX_RECT rect);\n    int GetRectBottom(FX_RECT rect);\n    int GetRectHeight(FX_RECT rect);\n    int GetRectWidth(FX_RECT rect);\n    void ProcessObj(CFX_PtrArray& cellArray, CPDF_PageObject* pObj, CFX_AffineMatrix matrix);\n    FX_INT32 LogicPreObj(CPDF_PageObject* pObj);\n\n    CPDF_AutoReflowElement* m_pRoot;\n    CPDF_AutoReflowElement* m_pCurrElm;\n    CPDF_Page*\tm_pPDFPage;\n    IFX_Pause*\tm_pPause;\n    CFX_AffineMatrix m_PDFDisplayMatrix;\n    CPDF_PageObject* m_pPreObj;\n    LayoutStatus m_Status;\n    int m_WritingMode;\n    CFX_PtrArray m_CellArray;\n    FX_BOOL\t\t m_bReadOrder;\n    LAYOUTPROVIDER_STYLE m_Style;\n    CFX_PtrArray m_cellArray;\n    int\t\t\tm_Step;\n};\n#endif\n"
  },
  {
    "path": "core/src/reflow/layoutprocessor_reflow.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/reflow/reflowengine.h\"\n#include \"reflowedpage.h\"\n#include \"layoutprovider_taggedpdf.h\"\nIPDF_LayoutProcessor* IPDF_LayoutProcessor::Create_LayoutProcessor_Reflow(FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, void* pReflowedPage, int flags, FX_FLOAT lineSpace )\n{\n    if(pReflowedPage == NULL || fWidth <= 20) {\n        return NULL;\n    }\n    CPDF_LayoutProcessor_Reflow* pReflowEngine = FX_NEW CPDF_LayoutProcessor_Reflow();\n    if (NULL == pReflowEngine) {\n        return NULL;\n    }\n    pReflowEngine->Init(TopIndent, fWidth, fHeight, (CPDF_ReflowedPage*)pReflowedPage, flags, lineSpace);\n    return pReflowEngine;\n}\nCPDF_LayoutProcessor_Reflow::CPDF_LayoutProcessor_Reflow()\n{\n    m_pPause = NULL;\n    m_pLayoutElement = NULL;\n    m_fRefWidth = 0;\n    m_fRefWidth = 0;\n    m_fCurrLineWidth = 0;\n    m_fCurrLineHeight = 0;\n    m_bIllustration = FALSE;\n    m_pPreObj = NULL;\n    m_pCurrLine = FX_NEW CRF_DataPtrArray(50);\n    m_pTempLine = FX_NEW CRF_DataPtrArray(50);\n    m_StartIndent = 0;\n    m_PausePosition = 0;\n}\nCPDF_LayoutProcessor_Reflow::~CPDF_LayoutProcessor_Reflow()\n{\n    if (m_pCurrLine) {\n        m_pCurrLine->RemoveAll();\n        delete m_pCurrLine;\n    }\n    m_pCurrLine = NULL;\n    if (m_pTempLine) {\n        m_pTempLine->RemoveAll();\n        delete m_pTempLine;\n    }\n    m_pTempLine = NULL;\n}\nvoid CPDF_LayoutProcessor_Reflow::Init(FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, CPDF_ReflowedPage* pReflowedPage, int flags, FX_FLOAT lineSpace)\n{\n    m_pLayoutElement = NULL;\n    m_TopIndent = TopIndent;\n    m_Status = LayoutReady;\n    m_flags = flags;\n    m_pReflowedPage = pReflowedPage;\n    m_fScreenHeight = fHeight;\n    m_fRefWidth = fWidth;\n    m_fCurrLineHeight = 0;\n    m_fCurrLineWidth = 0;\n    m_fLineSpace = lineSpace;\n    pReflowedPage->m_PageWidth = fWidth;\n    pReflowedPage->m_PageHeight = TopIndent;\n}\nvoid CPDF_LayoutProcessor_Reflow::FitPageMode()\n{\n    if(m_flags & RF_PARSER_PAGEMODE && m_fScreenHeight > 20) {\n        float fitPageHeight = m_fScreenHeight;\n        CPDF_ReflowedPage* pRFPage = m_pReflowedPage;\n        int count = pRFPage->m_pReflowed->GetSize();\n        CFX_WordArray dy;\n        dy.Add(0);\n        int pos = 0;\n        int screenCount = 1;\n        FX_FLOAT h = pRFPage->GetPageHeight();\n        while (h > screenCount * fitPageHeight) {\n            FX_FLOAT tempPageHeight = screenCount * fitPageHeight;\n            int j = 0;\n            FX_FLOAT tempDy = 0;\n            for(int i = 0; i < count; i++) {\n                CRF_Data* pData = (*pRFPage->m_pReflowed)[i];\n                FX_FLOAT posY;\n                posY = pData->m_PosY;\n                if(FXSYS_fabs(posY) > tempPageHeight &&\n                        FXSYS_fabs(posY + pData->m_Height) < tempPageHeight) {\n                    if(j == 0) {\n                        j = i;\n                    }\n                    if(pData->m_Height > fitPageHeight) {\n                        FX_FLOAT zoom;\n                        FX_FLOAT spaceh = screenCount * fitPageHeight + posY + pData->m_Height;\n                        if(spaceh < fitPageHeight / 3 * 2) {\n                            spaceh = fitPageHeight;\n                        }\n                        zoom = spaceh / pData->m_Height;\n                        tempDy = spaceh - pData->m_Height;\n                        pData->m_Height = spaceh;\n                        pData->m_Width *= zoom;\n                        break;\n                    }\n                    FX_FLOAT dy = pData->m_PosY + pData->m_Height + tempPageHeight;\n                    if(dy > tempDy) {\n                        tempDy = dy;\n                    }\n                } else if(FXSYS_fabs(posY + pData->m_Height) > tempPageHeight) {\n                    break;\n                }\n            }\n            for(; j < count; j++) {\n                CRF_Data* pData = (*pRFPage->m_pReflowed)[j];\n                FX_FLOAT posY;\n                posY = pData->m_PosY;\n                if(FXSYS_fabs(posY) > tempPageHeight ) {\n                    pData->m_PosY -= tempDy;\n                }\n                if(pData->m_Height >= fitPageHeight) {\n                    pData->m_Height = fitPageHeight - 1;\n                    if(pData->GetType() == CRF_Data::Text) {\n                        CRF_CharData* pCharData = (CRF_CharData*)pData;\n                        pCharData->m_pCharState->m_fFontSize = pData->m_Height;\n                    }\n                }\n            }\n            pRFPage->m_PageHeight += tempDy;\n            h += tempDy;\n            screenCount++;\n        }\n    }\n}\nLayoutStatus CPDF_LayoutProcessor_Reflow::StartProcess(IPDF_LayoutElement* pElement, IFX_Pause* pPause, const CFX_AffineMatrix* pPDFMatrix)\n{\n    if(!pElement) {\n        return LayoutError;\n    }\n    m_pPause = pPause;\n    m_PDFMatrix = *pPDFMatrix;\n    m_pRootElement = pElement;\n    ProcessElement(m_pRootElement, m_fRefWidth);\n    if(m_Status == LayoutToBeContinued) {\n        return LayoutToBeContinued;\n    }\n    m_Status = LayoutFinished;\n    FitPageMode();\n    return LayoutFinished;\n}\nLayoutStatus CPDF_LayoutProcessor_Reflow::Continue()\n{\n    int size = m_pReflowedPage->m_pReflowed->GetSize();\n    ProcessElement(m_pRootElement, m_CurrRefWidth);\n    size = m_pReflowedPage->m_pReflowed->GetSize();\n    if(m_Status == LayoutReady) {\n        m_Status = LayoutFinished;\n        FitPageMode();\n    }\n    return m_Status;\n}\nint CPDF_LayoutProcessor_Reflow::GetPosition()\n{\n    return m_PausePosition;\n}\nFX_BOOL\tCPDF_LayoutProcessor_Reflow::IsCanBreakAfter(FX_DWORD unicode)\n{\n    if(unicode == -1) {\n        return FALSE;\n    }\n    switch(unicode) {\n        case 40:\n        case 91:\n        case 123:\n            return FALSE;\n    }\n    if(unicode >= 256) {\n        return TRUE;\n    } else if(unicode >= 48 && unicode <= 57) {\n        return FALSE;\n    } else if(unicode >= 64 && unicode <= 90) {\n        return FALSE;\n    } else if(unicode >= 97 && unicode <= 122) {\n        return FALSE;\n    }\n    return TRUE;\n}\nFX_BOOL\tCPDF_LayoutProcessor_Reflow::IsCanBreakBefore(FX_DWORD unicode)\n{\n    if(unicode == -1) {\n        return FALSE;\n    }\n    switch(unicode) {\n        case 33:\n        case 41:\n        case 44:\n        case 46:\n        case 59:\n        case 63:\n        case 93:\n        case 125:\n            return FALSE;\n    }\n    if(unicode >= 256) {\n        return TRUE;\n    } else if(unicode >= 48 && unicode <= 57) {\n        return FALSE;\n    } else if(unicode >= 64 && unicode <= 90) {\n        return FALSE;\n    } else if(unicode >= 97 && unicode <= 122) {\n        return FALSE;\n    }\n    return TRUE;\n}\nvoid CPDF_LayoutProcessor_Reflow::ProcessTable(FX_FLOAT dx)\n{\n    if(m_pReflowedPage->m_pReflowed->GetSize() == 0) {\n        return;\n    }\n    CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1);\n    int rowCount = pTable->m_nCell.GetSize();\n    int n = 0;\n    FX_FLOAT* dyRow = FX_Alloc(FX_FLOAT, rowCount + 1);\n    FXSYS_memset32(dyRow, 0, sizeof(FX_FLOAT) * (rowCount + 1));\n    dyRow[0] = 0 ;\n    dyRow[0] = - pTable->m_ReflowPageHeight;\n    int tableColCount = 0;\n    int i;\n    for(i = 0; i < rowCount; i++) {\n        int colCount = pTable->m_nCell.GetAt(i);\n        if(colCount > tableColCount) {\n            tableColCount = colCount;\n        }\n    }\n    int cellCount = tableColCount * rowCount;\n    RF_TableCell** pVirtualTable = FX_Alloc(RF_TableCell*, cellCount);\n    FXSYS_memset32(pVirtualTable, 0, sizeof(RF_TableCell*) * cellCount);\n    for(i = 0; i < rowCount; i++) {\n        int colCount = pTable->m_nCell.GetAt(i);\n        FX_FLOAT rowWidth = 0;\n        int j = 0;\n        int s = pTable->m_pCellArray.GetSize();\n        for(j = 0; j < colCount; j++) {\n            RF_TableCell* pCell = (RF_TableCell*)pTable->m_pCellArray.GetAt(n++);\n            if(pCell->m_EndPos < pCell->m_BeginPos) {\n                continue;\n            }\n            int pos = i * tableColCount;\n            while(pos < cellCount && pVirtualTable[pos] != NULL) {\n                pos++;\n            }\n            if(pos >= (i + 1) * tableColCount) {\n                pos = i * tableColCount + j;\n            }\n            int RowSpan = pCell->m_RowSpan;\n            int ColSpan = pCell->m_ColSpan;\n            if(RowSpan + i > rowCount) {\n                RowSpan = rowCount - i;\n            }\n            if(ColSpan + j > colCount) {\n                ColSpan = colCount - j;\n            }\n            for(int m = 0; m < RowSpan; m++) {\n                for(int nn = 0; nn < ColSpan; nn++) {\n                    if(pos + nn >= cellCount) {\n                        break;\n                    }\n                    pVirtualTable[pos + nn] = pCell;\n                }\n                pos += tableColCount;\n            }\n            FX_FLOAT dxCell = dx;\n            for(pos = i * tableColCount; pVirtualTable[pos] != pCell && pos < cellCount; pos++) {\n                dxCell += (pVirtualTable[pos])->m_MaxWidth;\n            }\n            CRF_Data* pData = (*m_pReflowedPage->m_pReflowed)[pCell->m_BeginPos];\n            FX_FLOAT dy = dyRow[i] - pData->m_Height - pData->m_PosY;\n            CFX_AffineMatrix matrix(1, 0, 0, 1, dxCell, dy);\n            Transform(&matrix, m_pReflowedPage->m_pReflowed, pCell->m_BeginPos, pCell->m_EndPos - pCell->m_BeginPos + 1);\n            if(pCell->m_RowSpan + i <= rowCount) {\n                if(FXSYS_fabs(dyRow[pCell->m_RowSpan + i]) < FXSYS_fabs(dyRow[i] - pCell->m_CellHeight)) {\n                    dyRow[pCell->m_RowSpan + i] = dyRow[i] - pCell->m_CellHeight;\n                }\n            }\n        }\n    }\n    n = 0;\n    for(i = 0; i < rowCount; i++) {\n        int colCount = pTable->m_nCell.GetAt(i);\n        for(int j = 0; j < colCount; j++) {\n            RF_TableCell* pCell = (RF_TableCell*)pTable->m_pCellArray.GetAt(n++);\n            switch(pCell->m_BlockAlign) {\n                case LayoutAfter: {\n                        FX_FLOAT dy = dyRow[i + pCell->m_RowSpan] - pCell->m_CellHeight - dyRow[i];\n                        CFX_AffineMatrix matrix(1, 0, 0, 1, 0, dy);\n                        Transform(&matrix, m_pReflowedPage->m_pReflowed, pCell->m_BeginPos, pCell->m_EndPos - pCell->m_BeginPos + 1);\n                    }\n                    break;\n                case LayoutMiddle:\n                case LayoutJustify: {\n                        FX_FLOAT dy = (dyRow[i + pCell->m_RowSpan] + pCell->m_CellHeight - dyRow[i]) / 2;\n                        CFX_AffineMatrix matrix(1, 0, 0, 1, 0, dy);\n                        Transform(&matrix, m_pReflowedPage->m_pReflowed, pCell->m_BeginPos, pCell->m_EndPos - pCell->m_BeginPos + 1);\n                        break;\n                    }\n                default:\n                    break;\n            }\n        }\n    }\n    CRF_Data* pData = (*m_pReflowedPage->m_pReflowed)[m_pReflowedPage->m_pReflowed->GetSize() - 1];\n    m_pReflowedPage->m_PageHeight = - dyRow[rowCount] + pData->m_Height;\n    FX_Free(pVirtualTable);\n    FX_Free(dyRow);\n    int size = pTable->m_pCellArray.GetSize();\n    for(i = 0; i < size; i++) {\n        RF_TableCell* pCell = pTable->m_pCellArray.GetAt(i);\n        FX_Free(pCell);\n    }\n    pTable->m_pCellArray.RemoveAll();\n    pTable->m_nCell.RemoveAll();\n    int s = sizeof(CRF_Table);\n    delete pTable;\n    m_TableArray.RemoveAt(m_TableArray.GetSize() - 1);\n}\nCFX_FloatRect CPDF_LayoutProcessor_Reflow::GetElmBBox(IPDF_LayoutElement* pElement)\n{\n    CFX_FloatRect rect;\n    int objCount = pElement->CountObjects();\n    int count = pElement->CountChildren();\n    if(objCount == 0 && count == 0) {\n        return rect;\n    }\n    CFX_AffineMatrix matrix;\n    int i;\n    for(i = 0; i < objCount; i++) {\n        CPDF_PageObject* pObj = pElement->GetObject(0);\n        if(!pObj) {\n            continue;\n        }\n        if( rect.Height() == 0 ) {\n            rect = pObj->GetBBox(&matrix);\n        } else {\n            rect.Union(pObj->GetBBox(&matrix));\n        }\n    }\n    for(i = 0; i < count; i++) {\n        IPDF_LayoutElement* pChildElement = pElement->GetChild(i);\n        if( rect.Height() == 0 ) {\n            rect = GetElmBBox(pChildElement);\n        } else {\n            rect.Union(GetElmBBox(pChildElement));\n        }\n    }\n    return rect;\n}\nFX_FLOAT CPDF_LayoutProcessor_Reflow::GetElmWidth(IPDF_LayoutElement* pElement)\n{\n    if(!pElement) {\n        return 0;\n    }\n    LayoutType layoutType = pElement->GetType();\n    FX_FLOAT width = 0;\n    if(layoutType == LayoutTable || layoutType == LayoutTableDataCell || layoutType == LayoutTableHeaderCell) {\n        width = pElement->GetNumberAttr(LayoutWidth);\n        if(width > 0) {\n            return width;\n        }\n    } else if( layoutType == LayoutTableRow) {\n        int count = pElement->CountChildren();\n        for(int i = 0; i < count; i++) {\n            IPDF_LayoutElement* pElm = pElement->GetChild(i);\n            width += pElm->GetNumberAttr(LayoutWidth);\n        }\n        if(width > 0) {\n            return width;\n        }\n    }\n    CFX_FloatRect rect = GetElmBBox(pElement);\n    return rect.Width();\n}\nFX_BOOL GetIntersection(FX_FLOAT low1, FX_FLOAT high1, FX_FLOAT low2, FX_FLOAT high2,\n                        FX_FLOAT& interlow, FX_FLOAT& interhigh);\nFX_BOOL IsSameLine(FX_BOOL bHorizontal, CFX_FloatRect Rect1, CFX_FloatRect Rect2)\n{\n    if(bHorizontal) {\n        FX_FLOAT inter_top, inter_bottom;\n        if (!GetIntersection(Rect1.bottom, Rect1.top, Rect2.bottom, Rect2.top,\n                             inter_bottom, inter_top)) {\n            return FALSE;\n        }\n        FX_FLOAT lineHeight = Rect1.top - Rect1.bottom;\n        if(lineHeight > 20 && lineHeight > Rect2.Height() * 2) {\n            return FALSE;\n        }\n        if(lineHeight > 5 && Rect2.Height() / 2 > lineHeight) {\n            return FALSE;\n        }\n        FX_FLOAT inter_h = inter_top - inter_bottom;\n        if (inter_h < (lineHeight) / 2 && inter_h < Rect2.Height() / 2) {\n            return FALSE;\n        }\n    } else {\n        FX_FLOAT inter_left, inter_right;\n        if(!GetIntersection(Rect1.left, Rect1.right, Rect2.left, Rect2.right, inter_left, inter_right)) {\n            return FALSE;\n        }\n        FX_FLOAT inter_w = inter_right - inter_left;\n        if (inter_w < (Rect1.right - Rect1.left) / 2 && inter_w < (Rect2.right - Rect2.left) / 2) {\n            return FALSE;\n        }\n    }\n    return TRUE;\n}\nFX_INT32 IsCanMergeParagraph(IPDF_LayoutElement* pPrevElement, IPDF_LayoutElement* pNextElement)\n{\n    FX_INT32 analogial = 100;\n    FX_INT32 nPrevObj = pPrevElement->CountObjects(), i;\n    CPDF_PageObject* pPrevObj = NULL;\n    CFX_FloatRect prevRect, rect;\n    CFX_PtrArray prevLine, line;\n    FX_BOOL bParagraphStart = FALSE;\n    for(i = 0; i < nPrevObj; i++) {\n        CPDF_PageObject* pObj = pPrevElement->GetObject(i);\n        if(!pPrevObj) {\n            pPrevObj = pObj;\n            rect = CFX_FloatRect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);\n            line.Add(pObj);\n            continue;\n        }\n        CFX_FloatRect objRect = CFX_FloatRect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);\n        if(IsSameLine(TRUE, rect, objRect)) {\n            line.Add(pObj);\n            rect.Union(objRect);\n        } else {\n            prevLine.RemoveAll();\n            prevLine.Append(line);\n            prevRect = rect;\n            line.RemoveAll();\n            line.Add(pObj);\n            rect = objRect;\n            if(!bParagraphStart) {\n                if (prevRect.left > rect.left + rect.Height() * 1.5) {\n                    bParagraphStart = TRUE;\n                }\n            }\n        }\n    }\n    if(prevLine.GetSize()) {\n        if(FXSYS_fabs(rect.right - prevRect.right) > rect.Height()) {\n            analogial -= 50;\n        }\n    }\n    CPDF_PageObject* pObj = pPrevElement->GetObject(nPrevObj - 1);\n    if(pObj->m_Type == PDFPAGE_TEXT) {\n        CPDF_TextObject* pText = (CPDF_TextObject*)pObj;\n        FX_INT32 nItem = pText->CountItems();\n        CPDF_TextObjectItem item;\n        pText->GetItemInfo(nItem - 1, &item);\n        CFX_WideString wStr = pText->GetFont()->UnicodeFromCharCode(item.m_CharCode);\n        if(wStr.IsEmpty()) {\n            wStr = (FX_WCHAR)item.m_CharCode;\n        }\n        FX_WCHAR wch = wStr.GetAt(wStr.GetLength() - 1);\n        switch(wch) {\n            case '.':\n            case 12290:\n            case 65311:\n            case 63:\n            case 33:\n            case 65281:\n                analogial -= 50;\n                break;\n        }\n    }\n    prevLine.RemoveAll();\n    prevLine.Append(line);\n    line.RemoveAll();\n    FX_INT32 nNextObj = pNextElement->CountObjects();\n    pPrevObj = NULL;\n    FX_BOOL bFirst = TRUE;\n    for(i = 0; i < nNextObj; i++) {\n        CPDF_PageObject* pObj = pNextElement->GetObject(i);\n        if(!pPrevObj) {\n            pPrevObj = pObj;\n            rect = CFX_FloatRect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);\n            line.Add(pObj);\n            continue;\n        }\n        CFX_FloatRect objRect = CFX_FloatRect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);\n        if(IsSameLine(TRUE, rect, objRect)) {\n            line.Add(pObj);\n            rect.Union(objRect);\n        } else {\n            if(FXSYS_fabs(rect.right - prevRect.right) < rect.Height() && FXSYS_fabs(rect.left - prevRect.left) < rect.Height()) {\n                analogial += 50;\n            }\n            prevLine.RemoveAll();\n            prevLine.Append(line);\n            prevRect = rect;\n            line.RemoveAll();\n            line.Add(pObj);\n            rect = objRect;\n            if(!bFirst) {\n                break;\n            }\n            bFirst = FALSE;\n        }\n    }\n    if(prevLine.GetSize()) {\n        if(bParagraphStart) {\n            if(prevRect.left - rect.left > rect.Height() && prevRect.left - rect.left < rect.Height() * 3) {\n                analogial -= 50;\n            }\n        } else {\n            if(FXSYS_fabs(prevRect.left - rect.left) < rect.Height()) {\n                analogial -= 50;\n            }\n        }\n    }\n    return analogial;\n}\nvoid CPDF_LayoutProcessor_Reflow::ProcessElement(IPDF_LayoutElement* pElement, FX_FLOAT reflowWidth)\n{\n    if(pElement == NULL) {\n        return;\n    }\n    if(m_Status == LayoutReady) {\n        LayoutType layoutType = pElement->GetType();\n        FX_INT32 ElementType = GetElementTypes(layoutType);\n        switch(ElementType) {\n            case SST_IE:\n                m_bIllustration = TRUE;\n                break;\n            case SST_BLSE:\n                FinishedCurrLine();\n                FX_FLOAT StartIndent = 0;\n                if(IPDF_LayoutElement* pParent = pElement->GetParent()) {\n                    StartIndent = pParent->GetNumberAttr(LayoutStartIndent);\n                }\n                FX_FLOAT currStartIndent = pElement->GetNumberAttr(LayoutStartIndent);\n                m_StartIndent = ConverWidth(currStartIndent);\n                FX_FLOAT width = reflowWidth;\n                if(StartIndent != currStartIndent) {\n                    reflowWidth -= m_StartIndent;\n                }\n                FX_FLOAT spaceBefore = pElement->GetNumberAttr(LayoutSpaceBefore);\n                m_pReflowedPage->m_PageHeight += spaceBefore;\n                m_TextAlign = pElement->GetEnumAttr(LayoutTextAlign);\n                if(IPDF_LayoutElement* pParent = pElement->GetParent()) {\n                    StartIndent = pParent->GetNumberAttr(LayoutEndIndent);\n                    FX_FLOAT currEndIndent = pElement->GetNumberAttr(LayoutEndIndent);\n                    if(StartIndent != currStartIndent) {\n                        reflowWidth -= ConverWidth(currEndIndent);\n                    }\n                }\n                if(reflowWidth * 2 < width) {\n                    reflowWidth = width;\n                    m_StartIndent = 0;\n                }\n                break;\n        }\n        switch(layoutType) {\n            case LayoutTable: {\n                    CRF_Table* pTable = FX_NEW CRF_Table;\n                    if (NULL == pTable) {\n                        break;\n                    }\n                    m_TableArray.Add(pTable);\n                    pTable->m_ReflowPageHeight = m_pReflowedPage->m_PageHeight;\n                    pTable->m_TableWidth = GetElmWidth(pElement);\n                    break;\n                }\n            case LayoutTableRow: {\n                    if(!m_TableArray.GetSize()) {\n                        break;\n                    }\n                    int count = pElement->CountChildren();\n                    CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1);\n                    int f = 0;\n                    for(int i = 0; i < count; i++) {\n                        IPDF_LayoutElement* pChildElement = pElement->GetChild(i);\n                        LayoutType type = pChildElement->GetType();\n                        if(type == LayoutTableDataCell || type == LayoutTableHeaderCell) {\n                            f++;\n                        }\n                    }\n                    pTable->m_nCell.Add(f);\n                    break;\n                }\n            case LayoutTableDataCell:\n            case LayoutTableHeaderCell: {\n                    if(!m_TableArray.GetSize()) {\n                        break;\n                    }\n                    RF_TableCell* pCell = FX_Alloc(RF_TableCell, 1);\n                    FXSYS_memset32(pCell, 0 , sizeof(RF_TableCell));\n                    CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1);\n                    int pos = pTable->m_nCell.GetSize() - 1;\n                    pCell->m_BeginPos = m_pReflowedPage->m_pReflowed->GetSize();\n                    FX_FLOAT cellWidth = pElement->GetNumberAttr(LayoutWidth);\n                    if(cellWidth == 0 || pCell->m_MaxWidth > pTable->m_TableWidth) {\n                        CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1);\n                        pCell->m_MaxWidth = reflowWidth / pTable->m_nCell.GetAt(pTable->m_nCell.GetSize() - 1);\n                    } else {\n                        pCell->m_MaxWidth = pElement->GetNumberAttr(LayoutWidth) * reflowWidth / pTable->m_TableWidth;\n                    }\n                    pCell->m_ColSpan = (int)(pElement->GetNumberAttr(LayoutColSpan));\n                    pCell->m_RowSpan = (int)(pElement->GetNumberAttr(LayoutRowSpan));\n                    if(!pCell->m_ColSpan) {\n                        pCell->m_ColSpan = 1;\n                    }\n                    if(!pCell->m_RowSpan ) {\n                        pCell->m_RowSpan = 1;\n                    }\n                    pCell->m_BlockAlign = pElement->GetEnumAttr(LayoutBlockAlign);\n                    m_TextAlign = pElement->GetEnumAttr(LayoutInlineAlign);\n                    pCell->m_PosX = 0;\n                    pCell->m_PosY = 0;\n                    reflowWidth = pCell->m_MaxWidth;\n                    pTable->m_pCellArray.Add(pCell);\n                    break;\n                }\n            default:\n                break;\n        }\n        m_fLineHeight = pElement->GetNumberAttr(LayoutLineHeight);\n        int ReflowedSize = m_pReflowedPage->m_pReflowed->GetSize();\n        if(pElement->CountObjects()) {\n            ProcessObjs(pElement, reflowWidth);\n        }\n    }\n    int count = pElement->CountChildren();\n    for(int i = 0; i < count; i++) {\n        IPDF_LayoutElement* pChildElement = pElement->GetChild(i);\n        ProcessElement(pChildElement, reflowWidth);\n        if(m_pPause && m_pRootElement == pElement && m_Status != LayoutToBeContinued ) {\n            if(m_pPause->NeedToPauseNow()) {\n                m_pLayoutElement = pChildElement;\n                m_Status = LayoutToBeContinued;\n                m_CurrRefWidth = reflowWidth;\n                m_PausePosition = (i + 1) * 100 / (count + 1);\n                return ;\n            }\n        }\n        if(m_Status == LayoutToBeContinued && m_pLayoutElement == pChildElement) {\n            m_Status = LayoutReady;\n        }\n    }\n    if(m_Status == LayoutReady) {\n        FX_FLOAT dx = 0;\n        LayoutType layoutType = pElement->GetType();\n        FX_INT32 ElementType = GetElementTypes(layoutType);\n        switch(ElementType) {\n            case SST_IE:\n                m_bIllustration = FALSE;\n                FinishedCurrLine();\n                break;\n            case SST_BLSE:\n                FinishedCurrLine();\n                FX_FLOAT StartIndent = 0;\n                if(IPDF_LayoutElement* pParent = pElement->GetParent()) {\n                    StartIndent = pParent->GetNumberAttr(LayoutStartIndent);\n                }\n                FX_FLOAT currStartIndent = pElement->GetNumberAttr(LayoutStartIndent);\n                if(StartIndent != currStartIndent) {\n                    reflowWidth += ConverWidth(currStartIndent);\n                    dx += ConverWidth(currStartIndent);\n                }\n                FX_FLOAT spaceAfter = pElement->GetNumberAttr(LayoutSpaceAfter);\n                m_pReflowedPage->m_PageHeight += spaceAfter;\n                break;\n        }\n        switch(layoutType) {\n            case LayoutTableDataCell:\n            case LayoutTableHeaderCell: {\n                    if(!m_TableArray.GetSize()) {\n                        break;\n                    }\n                    CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1);\n                    RF_TableCell* pCell = pTable->m_pCellArray.GetAt(pTable->m_pCellArray.GetSize() - 1);\n                    pCell->m_EndPos = m_pReflowedPage->m_pReflowed->GetSize() - 1;\n                    if(pCell->m_EndPos < pCell->m_BeginPos) {\n                        pCell->m_CellHeight = 0;\n                    } else {\n                        CRF_Data* pBeginData = (*m_pReflowedPage->m_pReflowed)[pCell->m_BeginPos];\n                        CRF_Data* pEndData = (*m_pReflowedPage->m_pReflowed)[pCell->m_EndPos];\n                        pCell->m_CellHeight = pBeginData->m_Height > pEndData->m_Height ? pBeginData->m_Height : pEndData->m_Height;\n                        pCell->m_CellHeight -= pEndData->m_PosY - pBeginData->m_PosY;\n                    }\n                    break;\n                }\n            case LayoutTableRow: {\n                    if(!m_TableArray.GetSize()) {\n                        break;\n                    }\n                    CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1);\n                    if(pTable->m_nCol == 0) {\n                        pTable->m_nCol = pTable->m_pCellArray.GetSize();\n                    }\n                    break;\n                }\n            case LayoutTable: {\n                    ProcessTable(dx);\n                    break;\n                }\n            default:\n                if(dx) {\n                    CFX_AffineMatrix matrix(1, 0, 0, 1, dx, 0);\n                    int ReflowedSize = m_pReflowedPage->m_pReflowed->GetSize();\n                    Transform(&matrix, m_pReflowedPage->m_pReflowed, ReflowedSize, m_pReflowedPage->m_pReflowed->GetSize() - ReflowedSize);\n                }\n        }\n    }\n    if(m_pRootElement == pElement) {\n        m_PausePosition = 100;\n    }\n}\nFX_INT32 CPDF_LayoutProcessor_Reflow::GetElementTypes(LayoutType layoutType)\n{\n    switch(layoutType) {\n        case LayoutParagraph:\n        case LayoutHeading:\n        case LayoutHeading1:\n        case LayoutHeading2:\n        case LayoutHeading3:\n        case LayoutHeading4:\n        case LayoutHeading5:\n        case LayoutHeading6:\n        case LayoutList:\n        case LayoutListItem:\n        case LayoutListLabel:\n        case LayoutListBody:\n        case LayoutTable:\n        case LayoutTableHeaderCell:\n        case LayoutTableDataCell:\n        case LayoutTableRow:\n        case LayoutTableHeaderGroup:\n        case LayoutTableBodyGroup:\n        case LayoutTableFootGroup:\n        case LayoutTOCI:\n        case LayoutCaption:\n            return SST_BLSE;\n        case LayoutFigure:\n        case LayoutFormula:\n        case LayoutForm:\n            return SST_IE;\n        case LayoutSpan:\n        case LayoutQuote:\n        case LayoutNote:\n        case LayoutReference:\n        case LayoutBibEntry:\n        case LayoutCode:\n        case LayoutLink:\n        case LayoutAnnot:\n        case LayoutRuby:\n        case LayoutWarichu:\n            return SST_ILSE;\n        default:\n            return SST_GE;\n    }\n    return FALSE;\n}\nFX_FLOAT\tCPDF_LayoutProcessor_Reflow::ConverWidth(FX_FLOAT width)\n{\n    return width;\n}\nvoid CPDF_LayoutProcessor_Reflow::ProcessObject(CPDF_PageObject* pObj, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix)\n{\n    if(!pObj) {\n        return;\n    }\n    if(pObj->m_Type == PDFPAGE_TEXT) {\n        ProcessTextObject( (CPDF_TextObject *)pObj, reflowWidth, objMatrix);\n    } else if(pObj->m_Type == PDFPAGE_IMAGE) {\n        if(!(m_flags & RF_PARSER_IMAGE)) {\n            return;\n        }\n        CPDF_PageObjects* pObjs = FX_NEW CPDF_PageObjects(FALSE);\n        if (NULL == pObjs) {\n            return;\n        }\n        FX_POSITION pos = pObjs->GetLastObjectPosition();\n        pos = pObjs->InsertObject(pos, pObj);\n        CFX_AffineMatrix matrix;\n        FX_RECT rect = pObj->GetBBox(&matrix);\n        CPDF_ImageObject* ImageObj = (CPDF_ImageObject*)pObj;\n        ProcessUnitaryObjs(pObjs, reflowWidth, objMatrix);\n        delete pObjs;\n    } else if(pObj->m_Type == PDFPAGE_PATH) {\n    } else if(pObj->m_Type == PDFPAGE_FORM) {\n        CPDF_FormObject* pForm = (CPDF_FormObject*)pObj;\n        FX_POSITION pos = pForm->m_pForm->GetFirstObjectPosition();\n        objMatrix.Concat(pForm->m_FormMatrix);\n        while (pos) {\n            CPDF_PageObject* pObj1 = pForm->m_pForm->GetNextObject(pos);\n            ProcessObject(pObj1, reflowWidth, objMatrix);\n        }\n    }\n}\nvoid CPDF_LayoutProcessor_Reflow::ProcessObjs(IPDF_LayoutElement* pElement, FX_FLOAT reflowWidth)\n{\n    m_fCurrMaxWidth = reflowWidth;\n    int ObjCount = pElement->CountObjects();\n    for(int i = 0; i < ObjCount; i++) {\n        CPDF_PageObject* pObj = pElement->GetObject(i);\n        ProcessObject(pObj, reflowWidth, m_PDFMatrix);\n        continue;\n    }\n}\nvoid CPDF_LayoutProcessor_Reflow::AddTemp2CurrLine(int begin, int count)\n{\n    if(begin < 0 || count <= 0 || !m_pReflowedPage || !m_pReflowedPage->m_pReflowed || !m_pTempLine) {\n        return;\n    } else {\n        count += begin;\n    }\n    int size = m_pReflowedPage->m_pReflowed->GetSize();\n    int temps = m_pTempLine->GetSize();\n    for(int i = begin; i < count; i++) {\n        CRF_Data* pData = (*m_pTempLine)[i];\n        AddData2CurrLine(pData);\n    }\n}\nvoid CPDF_LayoutProcessor_Reflow::AddData2CurrLine(CRF_Data* pData)\n{\n    if(pData == NULL || m_pCurrLine == NULL) {\n        return;\n    }\n    m_pCurrLine->Add(pData);\n    m_fCurrLineWidth = pData->m_PosX + pData->m_Width;\n    if(pData->m_Height > m_fCurrLineHeight) {\n        m_fCurrLineHeight = pData->m_Height;\n    }\n}\nvoid CPDF_LayoutProcessor_Reflow::UpdateCurrLine()\n{\n}\nvoid CPDF_LayoutProcessor_Reflow::Transform(const CFX_AffineMatrix* pMatrix, CRF_DataPtrArray* pDataArray, int beginPos, int count)\n{\n    if (!pDataArray) {\n        return;\n    }\n    if(count == 0) {\n        count = pDataArray->GetSize();\n    } else {\n        count += beginPos;\n    }\n    for(int i = beginPos; i < count; i++) {\n        CRF_Data* pData = (*pDataArray)[i];\n        Transform(pMatrix, pData);\n    }\n}\nvoid CPDF_LayoutProcessor_Reflow::Transform(const CFX_AffineMatrix* pMatrix, CRF_Data* pData)\n{\n    if(pData->GetType() == CRF_Data::Path) {\n        CRF_PathData* pPathData = (CRF_PathData*)pData;\n        pPathData->m_pPath2Device.Concat(*pMatrix);\n    }\n    pMatrix->Transform(pData->m_PosX, pData->m_PosY, pData->m_PosX, pData->m_PosY);\n}\nFX_BOOL CPDF_LayoutProcessor_Reflow::FinishedCurrLine()\n{\n    if (NULL == m_pCurrLine) {\n        return FALSE;\n    }\n    int count = m_pCurrLine->GetSize();\n    if(count == 0) {\n        return FALSE;\n    }\n    if(m_fLineHeight > m_fCurrLineHeight) {\n        m_fCurrLineHeight = m_fLineHeight;\n    } else {\n        m_fCurrLineHeight += 2;\n    }\n    if(m_pReflowedPage->m_pReflowed->GetSize() > 0) {\n        m_fCurrLineHeight += m_fLineSpace;\n    }\n    FX_FLOAT height = m_pReflowedPage->m_PageHeight + m_fCurrLineHeight;\n    FX_FLOAT lineHeight = m_fLineHeight;\n    if(lineHeight == 0) {\n        lineHeight = m_fCurrLineHeight;\n    }\n    FX_FLOAT dx = 0;\n    switch(m_TextAlign) {\n        case LayoutCenter:\n            dx = (m_fCurrMaxWidth - m_fCurrLineWidth) / 2;\n            break;\n        case LayoutEnd:\n            dx = m_fCurrMaxWidth - m_fCurrLineWidth;\n            break;\n        case LayoutJustify:\n            break;\n        default:\n            break;\n    }\n    FX_FLOAT dy = - height;\n    int refedSize = m_pReflowedPage->m_pReflowed->GetSize();\n    if(count == 13) {\n        int a = 0;\n    }\n    for(int i = 0; i < count; i++) {\n        CRF_Data* pData = (*m_pCurrLine)[i];\n        m_pReflowedPage->m_pReflowed->Add(pData);\n        FX_FLOAT x = m_StartIndent + dx * (m_TextAlign == LayoutJustify ? i + 1 : 1);\n        CFX_AffineMatrix matrix(1, 0, 0, 1, x, dy);\n        Transform(&matrix, pData);\n    }\n    m_pCurrLine->RemoveAll();\n    m_fCurrLineWidth = 0;\n    m_pReflowedPage->m_PageHeight += m_fCurrLineHeight;\n    m_fCurrLineHeight = 0;\n    return TRUE;\n}\nCRF_CharState* CPDF_LayoutProcessor_Reflow::GetCharState(CPDF_TextObject* pObj, CPDF_Font* pFont, FX_FLOAT fHeight, FX_ARGB color)\n{\n    if (NULL == m_pReflowedPage->m_pCharState) {\n        return NULL;\n    }\n    int count = m_pReflowedPage->m_pCharState->GetSize();\n    for(int i = count - 1; i >= 0; i--) {\n        CRF_CharState* pState = (CRF_CharState*)m_pReflowedPage->m_pCharState->GetAt(i);\n        if(pState->m_Color == color && pState->m_fFontSize == fHeight && pState->m_pFont == pFont && pState->m_pTextObj == pObj) {\n            return pState;\n        }\n    }\n    CRF_CharState pState;\n    pState.m_pTextObj = pObj;\n    pState.m_Color = color;\n    pState.m_pFont = pFont;\n    pState.m_fFontSize = fHeight;\n    int ascent = pFont->GetTypeAscent();\n    int descent = pFont->GetTypeDescent();\n    pState.m_fAscent = ascent * fHeight / (ascent - descent);\n    if(descent == 0) {\n        pState.m_fDescent = 0;\n    } else {\n        pState.m_fDescent = descent * fHeight / (ascent - descent);\n    }\n    pState.m_bVert = FALSE;\n    CPDF_CIDFont *pCIDFont = pFont->GetCIDFont();\n    if(pCIDFont) {\n        pState.m_bVert = pCIDFont->IsVertWriting();\n    }\n    m_pReflowedPage->m_pCharState->Add(pState);\n    return (CRF_CharState*)m_pReflowedPage->m_pCharState->GetAt(count);\n}\nint CPDF_LayoutProcessor_Reflow::GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const\n{\n    if(charCode == -1) {\n        return 0;\n    }\n    int w = pFont->GetCharWidthF(charCode);\n    if(w == 0) {\n        CFX_ByteString str;\n        pFont->AppendChar(str, charCode);\n        w = pFont->GetStringWidth(str, 1);\n        if(w == 0) {\n            FX_RECT BBox;\n            pFont->GetCharBBox(charCode, BBox);\n            w = BBox.right - BBox.left;\n        }\n    }\n    return w;\n}\nvoid CPDF_LayoutProcessor_Reflow::CreateRFData(CPDF_PageObject* pObj, CFX_AffineMatrix* pObjMatrix)\n{\n    if (NULL == m_pReflowedPage->m_pMemoryPool) {\n        return;\n    }\n    if(pObj->m_Type == PDFPAGE_TEXT) {\n        CPDF_TextObject* pTextObj = (CPDF_TextObject* )pObj;\n        int count = pTextObj->CountItems();\n        if(!count) {\n            return;\n        }\n        if(count == 1) {\n            CPDF_TextObjectItem Item;\n            pTextObj->GetItemInfo(0, &Item);\n            if(Item.m_CharCode == 49) {\n                int a = 0;\n            }\n        }\n        CPDF_Font * pFont = pTextObj->GetFont();\n        FX_FLOAT fs = pTextObj->GetFontSize();\n        FX_FLOAT* pmatrix = pTextObj->m_TextState.GetMatrix();\n        FX_FLOAT matrix1 = pmatrix[1];\n        if(pmatrix[2] == 0) {\n            matrix1 = 0;\n        }\n        CFX_AffineMatrix textMatrix(pmatrix[0], matrix1, pmatrix[2], pmatrix[3], 0, 0);\n        FX_FLOAT height = FXSYS_fabs(textMatrix.TransformDistance(fs));\n        if(pObjMatrix) {\n            height = FXSYS_fabs(pObjMatrix->TransformDistance(height));\n        }\n        int r = 0, g = 0, b = 0;\n        pTextObj->m_ColorState.GetFillColor()->GetRGB(r, g, b);\n        FX_ARGB col = r * 0x10000;\n        col += g * 0x100;\n        col += b;\n        CRF_CharState* pState = GetCharState(pTextObj, pFont, height, col);\n        FX_FLOAT dx = 0, dy = 0;\n        FX_RECT ObjBBox;\n        if(pObjMatrix) {\n            ObjBBox = pTextObj->GetBBox(pObjMatrix);\n            dx = (float)ObjBBox.left;\n            dy = (float)ObjBBox.bottom;\n        } else {\n            CFX_AffineMatrix matrix;\n            ObjBBox = pTextObj->GetBBox(&matrix);\n        }\n        FX_FLOAT objWidth = 0;\n        CFX_ByteString str;\n        FX_BOOL bOrder = TRUE;\n        CFX_PtrArray tempArray;\n        int i = 0;\n        CPDF_TextObjectItem Item;\n        pTextObj->GetItemInfo(i, &Item);\n        dx = Item.m_OriginX;\n        dy = Item.m_OriginY;\n        textMatrix.Transform(Item.m_OriginX, Item.m_OriginY, dx, dy);\n        CRF_CharData* pLastData = NULL;\n        FX_FLOAT horzScale = pTextObj->m_TextState.GetFontSizeV() / pTextObj->m_TextState.GetFontSizeH();\n        while(i < count) {\n            pTextObj->GetItemInfo(i, &Item);\n            if(Item.m_CharCode == -1) {\n                i++;\n                continue;\n            }\n            FX_FLOAT OriginX, OriginY;\n            textMatrix.Transform(Item.m_OriginX, Item.m_OriginY, OriginX, OriginY);\n            CRF_CharData* pData = (CRF_CharData*)m_pReflowedPage->m_pMemoryPool->Alloc(sizeof(CRF_CharData));\n            if (NULL == pData) {\n                continue;\n            }\n            pData->m_Type = CRF_Data::Text;\n            if(FXSYS_fabs(OriginY - dy) > FXSYS_fabs(OriginX - dx)) {\n                pData->m_PosY = dy;\n                pData->m_PosX = pLastData->m_PosX + pLastData->m_Width + textMatrix.TransformDistance(pTextObj->m_TextState.GetObject()->m_CharSpace);\n            } else {\n                pData->m_PosY = OriginY;\n                pData->m_PosX = OriginX;\n            }\n            int size = tempArray.GetSize();\n            if(size && pData->m_PosX < pLastData->m_PosX ) {\n                for (int j = 0; j < size; j++) {\n                    CRF_CharData* pData1 = (CRF_CharData*)tempArray.GetAt(j);\n                    if(pData1->m_PosX > pData->m_PosX) {\n                        tempArray.InsertAt(j, pData);\n                        break;\n                    }\n                }\n            } else {\n                tempArray.Add(pData);\n            }\n            pLastData = pData;\n            pData->m_CharCode = Item.m_CharCode;\n            pData->m_Height = FXSYS_fabs(height);\n            int w = GetCharWidth(Item.m_CharCode, pFont);\n            pData->m_Width = FXSYS_fabs(fs * textMatrix.TransformDistance((FX_FLOAT)w) / 1000);\n            if(horzScale) {\n                pData->m_Width /= horzScale;\n            }\n            pData->m_pCharState = pState;\n            i++;\n        }\n        count = tempArray.GetSize();\n        for (int j = 0; j < count; j++) {\n            CRF_CharData* pData = (CRF_CharData*)tempArray.GetAt(j);\n            if (m_pTempLine) {\n                m_pTempLine->Add(pData);\n            }\n        }\n        tempArray.RemoveAll();\n    } else if(pObj->m_Type == PDFPAGE_IMAGE) {\n        CPDF_ImageObject* pImageObj = (CPDF_ImageObject* )pObj;\n        CRF_ImageData* pRFImage = (CRF_ImageData*)m_pReflowedPage->m_pMemoryPool->Alloc(sizeof(CRF_ImageData));\n        if (NULL == pRFImage) {\n            return;\n        }\n        pRFImage->m_pBitmap = NULL;\n        pRFImage->m_Type = CRF_Data::Image;\n        if (m_pTempLine) {\n            m_pTempLine->Add(pRFImage);\n        }\n        CPDF_Image *pImage = pImageObj->m_pImage;\n        if (!pImage->m_pDIBSource || !pImage->m_pMask) {\n            if(pImage->StartLoadDIBSource(m_pReflowedPage->GetFormResDict(pImageObj), m_pReflowedPage->m_pPDFPage->m_pResources, 0, 0, TRUE)) {\n                pImage->Continue(NULL);\n            }\n        }\n        CFX_DIBSource* pDibSource = pImage->DetachBitmap();\n        if (pDibSource) {\n            pRFImage->m_pBitmap = pDibSource->Clone();\n            delete pDibSource;\n        }\n        CFX_DIBSource* pMask = pImage->DetachMask();\n        if (pMask) {\n            if (!pMask->IsAlphaMask()) {\n                CFX_DIBitmap* pMaskBmp = pMask->Clone();\n                pMaskBmp->ConvertFormat(FXDIB_8bppMask);\n                pRFImage->m_pBitmap->MultiplyAlpha(pMaskBmp);\n                delete pMaskBmp;\n            } else {\n                pRFImage->m_pBitmap->MultiplyAlpha(pMask);\n            }\n            delete pMask;\n        }\n        CFX_FloatRect ObjBBox;\n        if(pObjMatrix) {\n            ObjBBox = pImageObj->GetBBox(pObjMatrix);\n        } else {\n            CFX_AffineMatrix matrix;\n            ObjBBox = pImageObj->GetBBox(&matrix);\n        }\n        pRFImage->m_Width = ObjBBox.Width();\n        pRFImage->m_Height = ObjBBox.Height();\n        pRFImage->m_PosX = 0;\n        pRFImage->m_PosY = 0;\n        CFX_AffineMatrix matrix(1, 0, 0, -1, 0, 0);\n        matrix.Concat(pImageObj->m_Matrix);\n        matrix.Concat(*pObjMatrix);\n        pRFImage->m_Matrix.Set(matrix.a == 0 ? 0 : matrix.a / FXSYS_fabs(matrix.a),\n                               matrix.b == 0 ? 0 : matrix.b / FXSYS_fabs(matrix.b),\n                               matrix.c == 0 ? 0 : matrix.c / FXSYS_fabs(matrix.c),\n                               matrix.d == 0 ? 0 : matrix.d / FXSYS_fabs(matrix.d), 0, 0);\n    } else if(pObj->m_Type == PDFPAGE_PATH) {\n    }\n}\nFX_FLOAT CPDF_LayoutProcessor_Reflow:: GetDatasWidth(int beginPos, int endpos)\n{\n    if(endpos < beginPos || !m_pTempLine) {\n        return 0;\n    }\n    if(endpos > m_pTempLine->GetSize() - 1) {\n        endpos = m_pTempLine->GetSize() - 1;\n    }\n    CRF_Data* pBeginData = (*m_pTempLine)[beginPos];\n    CRF_Data* pEndData = (*m_pTempLine)[endpos];\n    return pEndData->m_PosX - pBeginData->m_PosX + pEndData->m_Width;\n}\nFX_WCHAR CPDF_LayoutProcessor_Reflow::GetPreChar()\n{\n    if (NULL == m_pCurrLine) {\n        return -1;\n    }\n    int index = m_pCurrLine->GetSize() - 1;\n    CRF_CharData* pCharData = NULL;\n    while (index >= 0 && !pCharData) {\n        CRF_Data* pData = (*m_pCurrLine)[index];\n        if(pData->GetType() == CRF_Data::Text) {\n            pCharData = (CRF_CharData*)pData;\n        } else {\n            return -1;\n        }\n        index --;\n    }\n    if(m_pReflowedPage) {\n        index = m_pReflowedPage->m_pReflowed->GetSize() - 1;\n    }\n    while(!pCharData && index >= 0) {\n        CRF_Data* pData = (*m_pReflowedPage->m_pReflowed)[index];\n        if(pData->GetType() == CRF_Data::Text) {\n            pCharData = (CRF_CharData*)pData;\n        } else {\n            return -1;\n        }\n        index --;\n    }\n    if(pCharData) {\n        CFX_WideString str = pCharData->m_pCharState->m_pFont->UnicodeFromCharCode(pCharData->m_CharCode);\n        return str.GetAt(0);\n    }\n    return -1;\n}\nint CPDF_LayoutProcessor_Reflow::ProcessInsertObject(CPDF_TextObject* pObj, CFX_AffineMatrix formMatrix)\n{\n    if(!pObj || !m_pPreObj || !m_pCurrLine) {\n        return 0;\n    }\n    if(m_pCurrLine->GetSize() == 0) {\n        return 0;\n    }\n    CPDF_TextObjectItem item;\n    int nItem = m_pPreObj->CountItems();\n    m_pPreObj->GetItemInfo(nItem - 1, &item);\n    FX_FLOAT last_pos = item.m_OriginX;\n    FX_FLOAT last_width = GetCharWidth(item.m_CharCode, m_pPreObj->GetFont()) * m_pPreObj->GetFontSize() / 1000;\n    last_width = FXSYS_fabs(last_width);\n    pObj->GetItemInfo(0, &item);\n    FX_FLOAT this_width = GetCharWidth(item.m_CharCode, pObj->GetFont()) * pObj->GetFontSize() / 1000;\n    this_width = FXSYS_fabs(this_width);\n    FX_FLOAT threshold = last_width > this_width ? last_width / 4 : this_width / 4;\n    CFX_AffineMatrix prev_matrix, prev_reverse;\n    m_pPreObj->GetTextMatrix(&prev_matrix);\n    prev_matrix.Concat(m_perMatrix);\n    prev_reverse.SetReverse(prev_matrix);\n    FX_FLOAT x = pObj->GetPosX(), y = pObj->GetPosY();\n    formMatrix.Transform(x, y);\n    prev_reverse.Transform(x, y);\n    FX_WCHAR preChar  = GetPreChar();\n    CFX_WideString wstrItem = pObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);\n    FX_WCHAR curChar = wstrItem.GetAt(0);\n    if (FXSYS_fabs(y) > threshold * 2) {\n        if (preChar == L'-') {\n            return 3;\n        }\n        if (preChar != L' ') {\n            return 1;\n        }\n        return 2;\n    }\n    if ((x - last_pos - last_width) > threshold && curChar != L' ' && preChar != L' ') {\n        return 1;\n    }\n    return 0;\n}\nFX_INT32 CPDF_LayoutProcessor_Reflow::LogicPreObj(CPDF_TextObject* pObj)\n{\n    CPDF_TextObject* pPreObj = m_pPreObj;\n    m_pPreObj = pObj;\n    if(!pObj || !pPreObj) {\n        return 0;\n    }\n    CPDF_TextObjectItem item;\n    pPreObj->GetItemInfo(pPreObj->CountItems() - 1, &item);\n    FX_FLOAT last_pos = item.m_OriginX;\n    FX_FLOAT last_width = pPreObj->GetFont()->GetCharWidthF(item.m_CharCode) * pPreObj->GetFontSize() / 1000;\n    last_width = FXSYS_fabs(last_width);\n    pObj->GetItemInfo(0, &item);\n    FX_FLOAT this_width = pObj->GetFont()->GetCharWidthF(item.m_CharCode) * pObj->GetFontSize() / 1000;\n    this_width = FXSYS_fabs(this_width);\n    FX_FLOAT threshold = last_width > this_width ? last_width / 4 : this_width / 4;\n    CFX_AffineMatrix prev_matrix, prev_reverse;\n    pPreObj->GetTextMatrix(&prev_matrix);\n    prev_reverse.SetReverse(prev_matrix);\n    FX_FLOAT x = pObj->GetPosX(), y = pObj->GetPosY();\n    prev_reverse.Transform(x, y);\n    CFX_WideString wstrItem = pObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);\n    FX_WCHAR curChar = wstrItem.GetAt(0);\n    if (FXSYS_fabs(y) > threshold * 2) {\n        return 2;\n    }\n    FX_WCHAR preChar = 0;\n    if (FXSYS_fabs(last_pos + last_width - x) > threshold && curChar != L' ') {\n        return 1;\n    }\n    return 0;\n    m_pPreObj = pObj;\n    if(!pPreObj) {\n        return 0;\n    }\n    if(pPreObj->m_Type != pObj->m_Type) {\n        return 0;\n    }\n    CFX_FloatRect rcCurObj(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);\n    CFX_FloatRect rcPreObj(pPreObj->m_Left, pPreObj->m_Bottom, pPreObj->m_Right, pPreObj->m_Top);\n    if(pObj->m_Type == PDFPAGE_IMAGE) {\n        if(rcPreObj.Contains(rcCurObj)) {\n            return 2;\n        }\n        if(rcCurObj.Contains(rcPreObj)) {\n            return 2;\n        }\n        return 0;\n    }\n    if(pObj->m_Type == PDFPAGE_TEXT) {\n        if(!((rcPreObj.bottom > rcCurObj.top) || (rcPreObj.top < rcCurObj.bottom))) {\n            FX_FLOAT height = FX_MIN(rcPreObj.Height(), rcCurObj.Height());\n            if((rcCurObj.left - rcPreObj.right) > height / 3) {\n                return 3;\n            }\n        }\n        if(FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) >= 2 || FXSYS_fabs(rcPreObj.Height() - rcCurObj.Height()) >= 2 ) {\n            return 0;\n        }\n        CPDF_TextObject* pPreTextObj = (CPDF_TextObject*)pPreObj;\n        CPDF_TextObject* pCurTextObj = (CPDF_TextObject*)pObj;\n        int nPreCount = pPreTextObj->CountItems();\n        int nCurCount = pCurTextObj->CountItems();\n        if (nPreCount != nCurCount) {\n            return 0;\n        }\n        FX_BOOL bSame = TRUE;\n        for (int i = 0; i < nPreCount; i++) {\n            CPDF_TextObjectItem itemPer, itemCur;\n            pPreTextObj->GetItemInfo(i, &itemPer);\n            pCurTextObj->GetItemInfo(i, &itemCur);\n            if (itemCur.m_CharCode != itemPer.m_CharCode) {\n                return 0;\n            }\n            if (itemCur.m_OriginX != itemPer.m_OriginX) {\n                bSame = FALSE;\n            }\n            if (itemCur.m_OriginY != itemPer.m_OriginY) {\n                bSame = FALSE;\n            }\n        }\n        if(rcPreObj.left == rcCurObj.left && rcPreObj.top == rcCurObj.top) {\n            return 1;\n        }\n        if(FXSYS_fabs(rcPreObj.left - rcCurObj.left) < rcPreObj.Width() / 3\n                && FXSYS_fabs(rcPreObj.top - rcCurObj.top) < rcPreObj.Height() / 3) {\n            return 2;\n        }\n    }\n    return 0;\n}\nFX_BOOL CPDF_LayoutProcessor_Reflow::IsSameTextObject(CPDF_TextObject* pTextObj1, CPDF_TextObject* pTextObj2)\n{\n    if (!pTextObj1 || !pTextObj2) {\n        return FALSE;\n    }\n    CFX_FloatRect rcPreObj(pTextObj2->m_Left, pTextObj2->m_Bottom, pTextObj2->m_Right, pTextObj2->m_Top);\n    CFX_FloatRect rcCurObj(pTextObj1->m_Left, pTextObj1->m_Bottom, pTextObj1->m_Right, pTextObj1->m_Top);\n    if (rcPreObj.IsEmpty() && rcCurObj.IsEmpty()) {\n        return FALSE;\n    }\n    if (!rcPreObj.IsEmpty() || !rcCurObj.IsEmpty()) {\n        rcPreObj.Intersect(rcCurObj);\n        if (rcPreObj.IsEmpty()) {\n            return FALSE;\n        }\n        if (FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) > rcCurObj.Width() / 2) {\n            return FALSE;\n        }\n        if (pTextObj2->GetFontSize() != pTextObj1->GetFontSize()) {\n            return FALSE;\n        }\n    }\n    int nPreCount = pTextObj2->CountItems();\n    int nCurCount = pTextObj1->CountItems();\n    if (nPreCount != nCurCount) {\n        return FALSE;\n    }\n    for (int i = 0; i < nPreCount; i++) {\n        CPDF_TextObjectItem itemPer, itemCur;\n        pTextObj2->GetItemInfo(i, &itemPer);\n        pTextObj1->GetItemInfo(i, &itemCur);\n        if (itemCur.m_CharCode != itemPer.m_CharCode) {\n            return FALSE;\n        }\n    }\n    return TRUE;\n}\nvoid CPDF_LayoutProcessor_Reflow::ProcessTextObject(CPDF_TextObject *pTextObj, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix)\n{\n    if(reflowWidth < 0 || !m_pCurrLine || !m_pTempLine) {\n        return;\n    }\n    if(IsSameTextObject(pTextObj, m_pPreObj)) {\n        return;\n    }\n    CPDF_PageObject* pPreObj = m_pPreObj;\n    FX_INT32 logic = ProcessInsertObject(pTextObj, objMatrix);\n    m_pPreObj = pTextObj;\n    m_perMatrix.Copy(objMatrix);\n    int size = m_pTempLine->GetSize();\n    int curs = m_pCurrLine->GetSize();\n    CreateRFData(pTextObj);\n    size = m_pTempLine->GetSize();\n    int reds = m_pReflowedPage->m_pReflowed->GetSize();\n    if(size == 0) {\n        return;\n    }\n    if(logic == 1) {\n        m_fCurrLineWidth += pTextObj->GetBBox(&objMatrix).Height() / 3;\n    } else if(logic == 3 && curs) {\n        m_fCurrLineWidth -= (*m_pCurrLine)[curs - 1]->m_Width;\n        m_pCurrLine->Delete(curs - 1);\n    }\n    int beginPos = 0, endPos = m_pTempLine->GetSize() - 1;\n    while(beginPos <= endPos) {\n        int tempBeginPos = beginPos;\n        int tempEndPos = endPos;\n        FX_FLOAT all_width = GetDatasWidth( beginPos, endPos);\n        if(all_width < reflowWidth - m_fCurrLineWidth) {\n            CRF_CharData* pBeginData = (CRF_CharData*)(*m_pTempLine)[beginPos];\n            CFX_AffineMatrix matrix(1, 0, 0, 1, -pBeginData->m_PosX + m_fCurrLineWidth, -pBeginData->m_PosY);\n            Transform(&matrix, m_pTempLine, beginPos, endPos - beginPos + 1);\n            AddTemp2CurrLine(beginPos, endPos - beginPos + 1);\n            m_pTempLine->RemoveAll();\n            return;\n        }\n        int\tmidPos ;\n        if(tempBeginPos >= tempEndPos && tempEndPos != 0) {\n            midPos = tempEndPos;\n        } else {\n            while (tempBeginPos < tempEndPos ) {\n                midPos = (tempEndPos - tempBeginPos) / 2 + tempBeginPos;\n                if(midPos == tempBeginPos || midPos == tempEndPos) {\n                    break;\n                }\n                FX_FLOAT w = GetDatasWidth( beginPos, midPos);\n                if(w < reflowWidth - m_fCurrLineWidth) {\n                    tempBeginPos = midPos;\n                } else {\n                    tempEndPos = midPos;\n                }\n            }\n            midPos = tempBeginPos;\n            if(midPos == 0) {\n                FX_FLOAT w = GetDatasWidth( beginPos, 1);\n                if(w > reflowWidth - m_fCurrLineWidth) {\n                    midPos = -1;\n                }\n            }\n        }\n        if(midPos == -1) {\n            int count = m_pCurrLine->GetSize();\n            if(count == 0) {\n                midPos = 0;\n            }\n        }\n        int f = -1;\n        int i = 0;\n        for(i = midPos; i >= beginPos; i--) {\n            CRF_CharData* pData = (CRF_CharData*)(*m_pTempLine)[i];\n            CFX_WideString Wstr = pData->m_pCharState->m_pFont->UnicodeFromCharCode(pData->m_CharCode);\n            FX_WCHAR cha = Wstr.GetAt(0);\n            if(i < m_pTempLine->GetSize() - 1) {\n                CRF_CharData* pNextData = (CRF_CharData*)(*m_pTempLine)[i + 1];\n                if(pNextData->m_PosX - (pData->m_PosX + pData->m_Width) >= pData->m_Height / 4) {\n                    f = i;\n                    i++;\n                }\n            }\n            if(f == -1) {\n                if(IsCanBreakAfter((FX_DWORD)cha)) {\n                    f = i;\n                    i++;\n                } else if(IsCanBreakBefore((FX_DWORD)cha)) {\n                    f = i - 1;\n                    if(f < beginPos) {\n                        f = -1;\n                    }\n                }\n            }\n            if(f != -1) {\n                CRF_CharData* pBeginData = (CRF_CharData*)(*m_pTempLine)[beginPos];\n                CFX_AffineMatrix matrix(1, 0, 0, 1, -pBeginData->m_PosX + m_fCurrLineWidth, -pBeginData->m_PosY);\n                Transform(&matrix, m_pTempLine, beginPos, f - beginPos + 1);\n                CRF_Data* pData = (*m_pTempLine)[0];\n                AddTemp2CurrLine(beginPos, f - beginPos + 1);\n                beginPos = i;\n                FinishedCurrLine();\n                f = 1;\n                break;\n            }\n        }\n        if(f == -1 && i < beginPos) {\n            if( m_pCurrLine->GetSize()) {\n                int count = m_pCurrLine->GetSize();\n                f = -1;\n                for(int i = count - 1; i >= 0; i--) {\n                    CRF_Data* pData = (*m_pCurrLine)[i];\n                    if(pData->GetType() != CRF_Data::Text) {\n                        f = i + 1;\n                    } else {\n                        CRF_CharData* pCharData = (CRF_CharData*)pData;\n                        CFX_WideString Wstr = pCharData->m_pCharState->m_pFont->UnicodeFromCharCode(pCharData->m_CharCode);\n                        FX_WCHAR cha = Wstr.GetAt(0);\n                        if(IsCanBreakAfter(cha)) {\n                            f = i + 1;\n                            i++;\n                        } else if(IsCanBreakBefore(cha)) {\n                            f = i;\n                        }\n                        if(f == 0) {\n                            f = -1;\n                        }\n                    }\n                    if(f != -1) {\n                        FinishedCurrLine();\n                        if(f < count) {\n                            int reflowdCount = m_pReflowedPage->m_pReflowed->GetSize();\n                            int pos = reflowdCount + f - count;\n                            CRF_CharData* pData = (CRF_CharData*)(*m_pReflowedPage->m_pReflowed)[pos];\n                            CFX_AffineMatrix matrix(1, 0, 0, 1, -pData->m_PosX + m_fCurrLineWidth, -pData->m_PosY);\n                            Transform(&matrix, m_pReflowedPage->m_pReflowed, pos, reflowdCount - pos);\n                            for(int j = pos; j < reflowdCount; j++) {\n                                AddData2CurrLine((*m_pReflowedPage->m_pReflowed)[j]);\n                            }\n                            m_pReflowedPage->m_pReflowed->Delete(pos, count - f);\n                            if(logic == 3) {\n                                m_fCurrLineWidth += pTextObj->GetBBox(&objMatrix).Height() / 3;\n                            }\n                        }\n                        break;\n                    }\n                }\n            }\n            if(f == -1) {\n                CRF_CharData* pData = (CRF_CharData*)(*m_pTempLine)[beginPos];\n                CFX_AffineMatrix matrix(1, 0, 0, 1, -pData->m_PosX + m_fCurrLineWidth, -pData->m_PosY);\n                if(beginPos == midPos) {\n                    Transform(&matrix, pData);\n                    FX_RECT rect;\n                    pData->m_pCharState->m_pFont->GetFontBBox(rect);\n                    FX_FLOAT* pmatrix = pTextObj->m_TextState.GetMatrix();\n                    CFX_AffineMatrix textMatrix(pmatrix[0], pmatrix[1], pmatrix[2], pmatrix[3], 0, 0);\n                    FX_FLOAT width = pData->m_Height * (rect.right - rect.left) / 1000;\n                    FX_FLOAT f = (reflowWidth - m_fCurrLineWidth) / width;\n                    pData->m_PosY *= f;\n                    pData->m_Width *= f;\n                    pData->m_Height *= f;\n                    pData->m_pCharState = GetCharState(pData->m_pCharState->m_pTextObj, pData->m_pCharState->m_pFont, pData->m_Height, pData->m_pCharState->m_Color);\n                    AddData2CurrLine(pData);\n                } else {\n                    for(int m = beginPos; m <= midPos; m++) {\n                        CRF_CharData* pData = (CRF_CharData*)(*m_pTempLine)[m];\n                        Transform(&matrix, pData);\n                        AddData2CurrLine(pData);\n                    }\n                }\n                FinishedCurrLine();\n                beginPos = midPos + 1;\n            }\n        }\n    }\n    m_pTempLine->RemoveAll();\n    return;\n}\nvoid CPDF_LayoutProcessor_Reflow::ProcessUnitaryObjs(CPDF_PageObjects *pObjs, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix)\n{\n    if(!pObjs) {\n        return;\n    }\n    CFX_FloatRect ObjBBox = pObjs->CalcBoundingBox();\n    objMatrix.TransformRect(ObjBBox);\n    FX_FLOAT ObjWidth = ObjBBox.Width();\n    FX_FLOAT ObjHeight = ObjBBox.Height();\n    CFX_AffineMatrix matrix;\n    if(ObjWidth <= reflowWidth - m_fCurrLineWidth) {\n        matrix.Set(1, 0, 0, 1, m_fCurrLineWidth , 0);\n    } else if(ObjWidth <= reflowWidth) {\n        FinishedCurrLine();\n        matrix.Set(1, 0, 0, 1, 0, 0);\n    } else {\n        FinishedCurrLine();\n        FX_FLOAT f = reflowWidth / ObjWidth ;\n        matrix.Set(f, 0, 0, f, 0, 0);\n    }\n    CFX_AffineMatrix tempMatrix = matrix;\n    matrix.Concat(objMatrix);\n    FX_POSITION pos = pObjs->GetFirstObjectPosition();\n    while(pos) {\n        CPDF_PageObject* pObj = pObjs->GetNextObject(pos);\n        if(pObj->m_Type == PDFPAGE_TEXT) {\n            FX_INT32 ret = LogicPreObj((CPDF_TextObject*)pObj);\n            if(ret == 1 || ret == 2) {\n                continue;\n            }\n        }\n        CreateRFData(pObj, &matrix);\n    }\n    if (m_pTempLine) {\n        Transform(&tempMatrix, m_pTempLine, 0, m_pTempLine->GetSize());\n        AddTemp2CurrLine(0, m_pTempLine->GetSize());\n        m_pTempLine->RemoveAll();\n    }\n}\nvoid CPDF_LayoutProcessor_Reflow::ProcessPathObject(CPDF_PathObject *pObj, FX_FLOAT reflowWidth)\n{\n}\n"
  },
  {
    "path": "core/src/reflow/layoutprovider_taggedpdf.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"layoutprovider_taggedpdf.h\"\nCPDF_LayoutElement::CPDF_LayoutElement()\n{\n    m_pTaggedElement = NULL;\n    m_pParentElement = NULL;\n}\nCPDF_LayoutElement::~CPDF_LayoutElement()\n{\n    m_ObjArray.RemoveAll();\n    int size = m_ChildArray.GetSize();\n    for(int i = 0; i < size; i++) {\n        CPDF_LayoutElement* pChild = (CPDF_LayoutElement*)m_ChildArray.GetAt(i);\n        delete pChild;\n        pChild = NULL;\n    }\n    m_ChildArray.RemoveAll();\n}\nLayoutType CPDF_LayoutElement::ConvertLayoutType(FX_BSTR name)\n{\n    if(name == (const char*)(\"Document\")) {\n        return LayoutDocument;\n    } else if(name == (const char*)(\"Part\")) {\n        return LayoutPart;\n    } else if(name == (const char*)(\"Art\")) {\n        return LayoutArt;\n    } else if(name == (const char*)(\"Sect\")) {\n        return LayoutSect;\n    } else if(name == (const char*)(\"Div\")) {\n        return LayoutDiv;\n    } else if(name == (const char*)(\"BlockQuote\")) {\n        return LayoutBlockQuote;\n    } else if(name == (const char*)(\"Caption\")) {\n        return LayoutCaption;\n    } else if(name == (const char*)(\"TOC\")) {\n        return LayoutTOC;\n    } else if(name == (const char*)(\"TOCI\")) {\n        return LayoutTOCI;\n    } else if(name == (const char*)(\"Index\")) {\n        return LayoutIndex;\n    } else if(name == (const char*)(\"NonStruct\")) {\n        return LayoutNonStruct;\n    } else if(name == (const char*)(\"Private\")) {\n        return LayoutPrivate;\n    } else if(name == (const char*)(\"P\")) {\n        return LayoutParagraph;\n    } else if(name == (const char*)(\"H\")) {\n        return LayoutHeading;\n    } else if(name == (const char*)(\"H1\")) {\n        return LayoutHeading1;\n    } else if(name == (const char*)(\"H2\")) {\n        return LayoutHeading2;\n    } else if(name == (const char*)(\"H3\")) {\n        return LayoutHeading3;\n    } else if(name == (const char*)(\"H4\")) {\n        return LayoutHeading4;\n    } else if(name == (const char*)(\"H5\")) {\n        return LayoutHeading5;\n    } else if(name == (const char*)(\"H6\")) {\n        return LayoutHeading6;\n    } else if(name == (const char*)(\"L\")) {\n        return LayoutList;\n    } else if(name == (const char*)(\"LI\")) {\n        return LayoutListItem;\n    } else if(name == (const char*)(\"Lbl\")) {\n        return LayoutListLabel;\n    } else if(name == (const char*)(\"LBody\")) {\n        return LayoutListBody;\n    } else if(name == (const char*)(\"Table\")) {\n        return LayoutTable;\n    } else if(name == (const char*)(\"TR\")) {\n        return LayoutTableRow;\n    } else if(name == (const char*)(\"TH\")) {\n        return LayoutTableHeaderCell;\n    } else if(name == (const char*)(\"TD\")) {\n        return LayoutTableDataCell;\n    } else if(name == (const char*)(\"THead\")) {\n        return LayoutTableHeaderGroup;\n    } else if(name == (const char*)(\"TBody\")) {\n        return LayoutTableBodyGroup;\n    } else if(name == (const char*)(\"TFoot\")) {\n        return LayoutTableFootGroup;\n    } else if(name == (const char*)(\"Span\")) {\n        return LayoutSpan;\n    } else if(name == (const char*)(\"Quote\")) {\n        return LayoutQuote;\n    } else if(name == (const char*)(\"Note\")) {\n        return LayoutNote;\n    } else if(name == (const char*)(\"Reference\")) {\n        return LayoutReference;\n    } else if(name == (const char*)(\"BibEntry\")) {\n        return LayoutBibEntry;\n    } else if(name == (const char*)(\"Code\")) {\n        return LayoutCode;\n    } else if(name == (const char*)(\"Link\")) {\n        return LayoutLink;\n    } else if(name == (const char*)(\"Annot\")) {\n        return LayoutAnnot;\n    } else if(name == (const char*)(\"Ruby\")) {\n        return LayoutRuby;\n    } else if(name == (const char*)(\"RB\")) {\n        return LayoutRubyBase;\n    } else if(name == (const char*)(\"RT\")) {\n        return LayoutRubyAnnot;\n    } else if(name == (const char*)(\"RP\")) {\n        return LayoutRubyPunc;\n    } else if(name == (const char*)(\"Warichu\")) {\n        return LayoutWarichu;\n    } else if(name == (const char*)(\"WT\")) {\n        return LayoutWarichuText;\n    } else if(name == (const char*)(\"WP\")) {\n        return LayoutWarichuPunc;\n    } else if(name == (const char*)(\"Figure\")) {\n        return LayoutFigure;\n    } else if(name == (const char*)(\"Formula\")) {\n        return LayoutFormula;\n    } else if(name == (const char*)(\"Form\")) {\n        return LayoutForm;\n    } else {\n        return LayoutUnknown;\n    }\n}\nCFX_ByteStringC CPDF_LayoutElement::ConvertLayoutType(LayoutType type)\n{\n    FX_BSTR name = \"\";\n    if(type == LayoutArifact) {\n        return \"Arifact\";\n    } else if( type == LayoutDocument) {\n        return \"Document\";\n    } else if( type == LayoutPart) {\n        return \"Part\";\n    } else if( type == LayoutArt) {\n        return \"Art\";\n    } else if( type == LayoutSect) {\n        return \"Sect\";\n    } else if( type == LayoutDiv) {\n        return \"Div\";\n    } else if( type == LayoutBlockQuote) {\n        return \"BlockQuote\";\n    } else if( type == LayoutCaption) {\n        return \"Caption\";\n    } else if( type == LayoutTOC) {\n        return \"TOC\";\n    } else if( type == LayoutTOCI) {\n        return \"TOCI\";\n    } else if( type == LayoutIndex) {\n        return \"Index\";\n    } else if( type == LayoutNonStruct) {\n        return \"NonStruct\";\n    } else if( type == LayoutPrivate) {\n        return \"Private\";\n    } else if( type == LayoutParagraph) {\n        return \"P\";\n    } else if( type == LayoutHeading) {\n        return \"H\";\n    } else if( type == LayoutHeading1) {\n        return \"H1\";\n    } else if( type == LayoutHeading2) {\n        return \"H2\";\n    } else if( type == LayoutHeading3) {\n        return \"H3\";\n    } else if( type == LayoutHeading4) {\n        return \"H4\";\n    } else if( type == LayoutHeading5) {\n        return \"H5\";\n    } else if( type == LayoutHeading6) {\n        return \"H6\";\n    } else if( type == LayoutList) {\n        return \"L\";\n    } else if( type == LayoutListItem) {\n        return \"LI\";\n    } else if( type == LayoutListLabel) {\n        return \"Lbl\";\n    } else if( type == LayoutListBody) {\n        return \"LBody\";\n    } else if( type == LayoutTable) {\n        return \"Table\";\n    } else if( type == LayoutTableRow) {\n        return \"TR\";\n    } else if( type == LayoutTableHeaderCell) {\n        return \"TH\";\n    } else if( type == LayoutTableDataCell) {\n        return \"TD\";\n    } else if( type == LayoutTableHeaderGroup) {\n        return \"THead\";\n    } else if( type == LayoutTableBodyGroup) {\n        return \"TBody\";\n    } else if( type == LayoutTableFootGroup) {\n        return \"TFoot\";\n    } else if( type == LayoutSpan) {\n        return \"Span\";\n    } else if( type == LayoutQuote) {\n        return \"Quote\";\n    } else if( type == LayoutNote) {\n        return \"Note\";\n    } else if( type == LayoutReference) {\n        return \"Reference\";\n    } else if( type == LayoutBibEntry) {\n        return \"BibEntry\";\n    } else if( type == LayoutCode) {\n        return \"Code\";\n    } else if( type == LayoutLink) {\n        return \"Link\";\n    } else if( type == LayoutAnnot) {\n        return \"Annot\";\n    } else if( type == LayoutRuby) {\n        return \"Ruby\";\n    } else if( type == LayoutRubyBase) {\n        return \"RB\";\n    } else if( type == LayoutRubyAnnot) {\n        return \"RT\";\n    } else if( type == LayoutRubyPunc) {\n        return \"RP\";\n    } else if( type == LayoutWarichu) {\n        return \"Warichu\";\n    } else if( type == LayoutWarichuText) {\n        return \"WT\";\n    } else if( type == LayoutWarichuPunc) {\n        return \"WP\";\n    } else if( type == LayoutFigure) {\n        return \"Figure\";\n    } else if( type == LayoutFormula) {\n        return \"Formula\";\n    } else if( type == LayoutForm) {\n        return \"Form\";\n    }\n    return name;\n}\nCFX_ByteStringC CPDF_LayoutElement::ConvertLayoutAttr(LayoutAttr attr)\n{\n    switch(attr) {\n        case LayoutArtifactType:\n            return \"Type\";\n        case LayoutArtifactAttached:\n            return \"Attached\";\n        case LayoutArtifactSubType:\n            return \"Subtype\";\n        case LayoutPlacement:\n            return \"Placement\";\n        case LayoutWritingMode:\n            return \"WritingMode\";\n        case LayoutBackgroundColor:\n            return \"BackgroundColor\";\n        case LayoutBorderColor:\n            return \"BorderColor\";\n        case LayoutBorderStyle:\n            return \"BorderStyle\";\n        case LayoutBorderThickness:\n            return \"BorderThickness\";\n        case LayoutPadding:\n            return \"Padding\";\n        case LayoutColor:\n            return \"Color\";\n        case LayoutSpaceBefore:\n            return \"SpaceBefore\";\n        case LayoutSpaceAfter:\n            return \"SpaceAfter\";\n        case LayoutStartIndent:\n            return \"StartIndent\";\n        case LayoutEndIndent:\n            return \"EndIndent\";\n        case LayoutTextIndent:\n            return \"TextIndent\";\n        case LayoutTextAlign:\n            return \"TextAlign\";\n        case LayoutBBox:\n            return \"BBox\";\n        case LayoutWidth:\n            return \"Width\";\n        case LayoutHeight:\n            return \"Height\";\n        case LayoutBlockAlign:\n            return \"BlockAlign\";\n        case LayoutInlineAlign:\n            return \"InlineAlign\";\n        case LayoutTBorderStyle:\n            return \"TBorderStyle\";\n        case LayoutTPadding:\n            return \"TPadding\";\n        case LayoutBaselineShift:\n            return \"BaselineShift\";\n        case LayoutLineHeight:\n            return \"LineHeight\";\n        case LayoutTextDecorationColor:\n            return \"TextDecorationColor\";\n        case LayoutTextDecorationThickness:\n            return \"TextDecorationThickness\";\n        case LayoutTextDecorationType:\n            return \"TextDecorationType\";\n        case LayoutRubyAlign:\n            return \"RubyAlign\";\n        case LayoutRubyPosition:\n            return \"RubyPosition\";\n        case LayoutGlyphOrientationVertical:\n            return \"GlyphOrientationVertical\";\n        case LayoutColumnCount:\n            return \"ColumnCount\";\n        case LayoutColumnGap:\n            return \"ColumnGap\";\n        case LayoutColumnWidths:\n            return \"ColumnWidths\";\n        case LayoutListNumbering:\n            return \"ListNumbering\";\n        case LayoutFieldRole:\n            return \"Role\";\n        case LayoutFieldChecked:\n            return \"checked\";\n        case LayoutFieldDesc:\n            return \"Desc\";\n        case LayoutRowSpan:\n            return \"RowSpan\";\n        case LayoutColSpan:\n            return \"ColSpan\";\n        case LayoutTableHeaders:\n            return \"Headers\";\n        case LayoutTableHeaderScope:\n            return \"Scope\";\n        case LayoutTableSummary:\n            return \"Summary\";\n        default:\n            return \"\";\n    }\n}\nLayoutEnum CPDF_LayoutElement::ConvertLayoutEnum(CFX_ByteStringC Enum)\n{\n    if(Enum == \"Block\") {\n        return LayoutBlock;\n    } else if (Enum == \"Inline\") {\n        return LayoutInline;\n    } else if (Enum == \"Before\") {\n        return LayoutBefore;\n    } else if (Enum == \"Start\") {\n        return LayoutStart;\n    } else if (Enum == \"End\") {\n        return LayoutEnd;\n    } else if (Enum == \"LrTb\") {\n        return LayoutLrTb;\n    } else if (Enum == \"RlTb\") {\n        return LayoutRlTb;\n    } else if (Enum == \"TbRl\") {\n        return LayoutTbRl;\n    } else if (Enum == \"None\") {\n        return LayoutNone;\n    } else if (Enum == \"Hidden\") {\n        return LayoutHidden;\n    } else if (Enum == \"Dotted\") {\n        return LayoutDotted;\n    } else if (Enum == \"Dashed\") {\n        return LayoutDashed;\n    } else if (Enum == \"Solid\") {\n        return LayoutSolid;\n    } else if (Enum == \"Double\") {\n        return LayoutDouble;\n    } else if (Enum == \"Groove\") {\n        return LayoutGroove;\n    } else if (Enum == \"Ridge\") {\n        return LayoutRidge;\n    } else if (Enum == \"Inset\") {\n        return LayoutInset;\n    } else if (Enum == \"Outset\") {\n        return LayoutOutset;\n    } else if (Enum == \"Normal\") {\n        return LayoutNormal;\n    } else if (Enum == \"Auto\") {\n        return LayoutAuto;\n    } else if (Enum == \"Center\") {\n        return LayoutCenter;\n    } else if (Enum == \"Justify\") {\n        return LayoutJustify;\n    } else if (Enum == \"Middle\") {\n        return LayoutMiddle;\n    } else if (Enum == \"Underline\") {\n        return LayoutUnderline;\n    } else if (Enum == \"Overline\") {\n        return LayoutOverline;\n    } else if (Enum == \"LineThrough\") {\n        return LayoutLineThrough;\n    } else if (Enum == \"Distribute\") {\n        return LayoutDistribute;\n    } else if (Enum == \"Disc\") {\n        return LayoutDisc;\n    } else if (Enum == \"Circle\") {\n        return LayoutCircle;\n    } else if (Enum == \"Square\") {\n        return LayoutSquare;\n    } else if (Enum == \"Decimal\") {\n        return LayoutDecimal;\n    } else if (Enum == \"UpperRoman\") {\n        return LayoutUpperRoman;\n    } else if (Enum == \"LowerRoman\") {\n        return LayoutLowerRoman;\n    } else if (Enum == \"UpperAlpha\") {\n        return LayoutUpperAlpha;\n    } else if (Enum == \"LowerAlpha\") {\n        return LayoutLowerAlpha;\n    } else if (Enum == \"rb\") {\n        return LayoutRB;\n    } else if (Enum == \"cb\") {\n        return LayoutCB;\n    } else if (Enum == \"pb\") {\n        return LayoutPB;\n    } else if (Enum == \"tv\") {\n        return LayoutTV;\n    } else if (Enum == \"on\") {\n        return LayoutOn;\n    } else if (Enum == \"off\") {\n        return LayoutOff;\n    } else if (Enum == \"neutral\") {\n        return LayoutNeutral;\n    } else if (Enum == \"Row\") {\n        return LayoutRow;\n    } else if (Enum == \"Column\") {\n        return LayoutColumn;\n    } else if (Enum == \"Both\") {\n        return LayoutBoth;\n    } else if (Enum == \"Left\") {\n        return LayoutLeft;\n    } else if (Enum == \"Top\") {\n        return LayoutTop;\n    } else if (Enum == \"Bottom\") {\n        return LayoutBottom;\n    } else if (Enum == \"Right\") {\n        return LayoutRight;\n    } else if (Enum == \"Pagination\") {\n        return LayoutPagination;\n    } else if (Enum == \"Layout\") {\n        return LayoutLayout;\n    } else if (Enum == \"Page\") {\n        return LayoutPage;\n    } else if (Enum == \"Background\") {\n        return LayoutBackground;\n    } else if (Enum == \"Header\") {\n        return LayoutHeader;\n    } else if (Enum == \"Footer\") {\n        return LayoutFooter;\n    } else if (Enum == \"Watermark\") {\n        return LayoutWatermark;\n    } else {\n        return LayoutInvalid;\n    }\n}\nLayoutType CPDF_LayoutElement::GetType()\n{\n    if(!m_pTaggedElement) {\n        return LayoutUnknown;\n    }\n    CFX_ByteString name = m_pTaggedElement->GetType();\n    return this->ConvertLayoutType(name);\n}\nint\tCPDF_LayoutElement::CountAttrValues(LayoutAttr attr_type)\n{\n    if(!m_pTaggedElement) {\n        return 0;\n    }\n    CPDF_Object* pObj = m_pTaggedElement->GetAttr(GetAttrOwner(attr_type), ConvertLayoutAttr(attr_type), IsInheritable(attr_type));\n    if(pObj) {\n        return 1;\n    } else {\n        return 0;\n    }\n}\nLayoutEnum CPDF_LayoutElement::GetEnumAttr(LayoutAttr attr_type, int index)\n{\n    if(!m_pTaggedElement) {\n        return LayoutInvalid;\n    }\n    CFX_ByteStringC owner = GetAttrOwner(attr_type);\n    CFX_ByteStringC default_value = GetDefaultNameValue(attr_type);\n    CFX_ByteStringC AttrName = ConvertLayoutAttr(attr_type);\n    CFX_ByteString\tAttrValue = m_pTaggedElement->GetName(owner, AttrName, default_value, IsInheritable(attr_type), index);\n    return ConvertLayoutEnum(AttrValue);\n}\nCFX_ByteStringC CPDF_LayoutElement::GetAttrOwner(LayoutAttr attr_type)\n{\n    switch(attr_type) {\n        case LayoutListNumbering:\n            return \"List\";\n        case LayoutFieldRole:\n        case LayoutFieldChecked :\n        case LayoutFieldDesc:\n            return \"PrintField\";\n        case LayoutRowSpan:\n        case LayoutColSpan:\n        case LayoutTableHeaders:\n        case LayoutTableHeaderScope:\n        case LayoutTableSummary:\n            return \"Table\";\n        default:\n            return \"Layout\";\n    }\n}\nFX_FLOAT\tCPDF_LayoutElement::GetNumberAttr(LayoutAttr attr_type, int index)\n{\n    if(!m_pTaggedElement) {\n        return 0;\n    }\n    CFX_ByteStringC owner = GetAttrOwner(attr_type);\n    FX_FLOAT default_value = GetDefaultFloatValue(attr_type);\n    CFX_ByteStringC AttrName = ConvertLayoutAttr(attr_type);\n    FX_FLOAT f = m_pTaggedElement->GetNumber(owner, AttrName, default_value, IsInheritable(attr_type), index);\n    if(attr_type == LayoutWidth && !f) {\n        f = m_pTaggedElement->GetNumber(\"Table\", AttrName, default_value, IsInheritable(attr_type), index);\n    }\n    return f;\n}\nFX_COLORREF\tCPDF_LayoutElement::GetColorAttr(LayoutAttr attr_type, int index)\n{\n    if(!m_pTaggedElement) {\n        return 0;\n    }\n    CFX_ByteStringC owner = GetAttrOwner(attr_type);\n    FX_COLORREF default_value = GetDefaultColorValue(attr_type);\n    CFX_ByteStringC AttrName = ConvertLayoutAttr(attr_type);\n    FX_ARGB f = m_pTaggedElement->GetColor(owner, AttrName, default_value, IsInheritable(attr_type), index);\n    return f;\n}\nFX_FLOAT CPDF_LayoutElement::GetDefaultFloatValue(LayoutAttr attr_type)\n{\n    switch(attr_type) {\n        case LayoutColumnCount:\n            return 1;\n        case LayoutRowSpan:\n            return 1;\n        case LayoutColSpan:\n            return 1;\n        default:\n            return 0;\n    }\n}\nFX_COLORREF CPDF_LayoutElement::GetDefaultColorValue(LayoutAttr attr_type)\n{\n    return -1;\n}\nCFX_ByteStringC CPDF_LayoutElement::GetDefaultNameValue(LayoutAttr attr_type)\n{\n    switch(attr_type) {\n        case LayoutPlacement:\n            return \"Inline\";\n        case LayoutWritingMode:\n            return \"LrTb\";\n        case LayoutBorderStyle:\n            return \"None\";\n        case LayoutTextAlign:\n            return \"Start\";\n        case LayoutBlockAlign:\n            return \"Before\";\n        case LayoutInlineAlign:\n            return \"Start\";\n        case LayoutTBorderStyle:\n            return \"None\";\n        case LayoutTextDecorationType:\n            return \"None\";\n        case LayoutRubyAlign:\n            return \"Distribute\";\n        case LayoutRubyPosition:\n            return \"Before\";\n        case LayoutGlyphOrientationVertical:\n            return \"Auto\";\n        case LayoutListNumbering:\n            return \"None\";\n        case LayoutFieldRole:\n            return \"None\";\n        default:\n            return \"\";\n    }\n}\nFX_BOOL\tCPDF_LayoutElement::IsInheritable(LayoutAttr type)\n{\n    switch(type) {\n        case LayoutWritingMode:\n        case LayoutTextAlign:\n        case LayoutBlockAlign:\n        case LayoutInlineAlign:\n        case LayoutLineHeight:\n        case LayoutGlyphOrientationVertical:\n        case LayoutRubyAlign:\n        case LayoutRubyPosition:\n        case LayoutBorderThickness:\n        case LayoutStartIndent:\n        case LayoutEndIndent:\n        case LayoutTextIndent:\n        case LayoutTPadding:\n        case LayoutTextDecorationThickness:\n        case LayoutBorderColor:\n        case LayoutColor:\n        case LayoutTextDecorationColor:\n            return TRUE;\n        default:\n            return FALSE;\n    }\n}\nint\tCPDF_LayoutElement::CountChildren()\n{\n    return m_ChildArray.GetSize();\n}\nIPDF_LayoutElement* CPDF_LayoutElement::GetChild(int index)\n{\n    return (IPDF_LayoutElement*)m_ChildArray.GetAt(index);\n}\nIPDF_LayoutElement* CPDF_LayoutElement::GetParent()\n{\n    return m_pParentElement;\n}\nint\tCPDF_LayoutElement::CountObjects()\n{\n    if(m_pTaggedElement == NULL) {\n        return 0;\n    }\n    CFX_PtrArray* pObj = &m_ObjArray;\n    int size = pObj->GetSize();\n    return size;\n}\nCPDF_PageObject* CPDF_LayoutElement::GetObject(int index)\n{\n    if(m_pTaggedElement == NULL) {\n        return NULL;\n    }\n    CFX_PtrArray *pObj = &m_ObjArray;\n    int size = pObj->GetSize();\n    if(index < size) {\n        return (CPDF_PageObject*)pObj->GetAt(index);\n    }\n    return NULL;\n}\nFX_BOOL CPDF_LayoutElement::AddObject(CPDF_PageObject* pObj)\n{\n    return m_ObjArray.Add(pObj);\n}\nIPDF_LayoutProvider* IPDF_LayoutProvider::Create_LayoutProvider_TaggedPDF(CPDF_PageObjects* pPage)\n{\n    if(pPage == NULL) {\n        return NULL;\n    }\n    CPDF_LayoutProvider_TaggedPDF* pProvider = FX_NEW CPDF_LayoutProvider_TaggedPDF;\n    if (!pProvider) {\n        return NULL;\n    }\n    pProvider->Init(pPage);\n    return pProvider;\n}\nCPDF_LayoutProvider_TaggedPDF::CPDF_LayoutProvider_TaggedPDF()\n{\n    m_pPause = NULL;\n    m_pRoot = NULL;\n    m_pPageTree = NULL;\n    m_pCurTaggedElement = NULL;\n}\nCPDF_LayoutProvider_TaggedPDF::~CPDF_LayoutProvider_TaggedPDF()\n{\n    m_pCurTaggedElement = NULL;\n    m_pPause = NULL;\n    if(m_pRoot) {\n        delete m_pRoot;\n    }\n    m_pRoot = NULL;\n    if(m_pPageTree) {\n        delete m_pPageTree;\n    }\n    m_pPageTree = NULL;\n}\nvoid CPDF_LayoutProvider_TaggedPDF::ProcessElement(CPDF_LayoutElement*pParent, CPDF_StructElement* pTaggedElement)\n{\n    if(!pTaggedElement) {\n        return;\n    }\n    if(!pParent) {\n        m_Status = LayoutError;\n        return;\n    }\n    CPDF_LayoutElement* pElement = FX_NEW CPDF_LayoutElement;\n    if (!pElement) {\n        m_Status = LayoutError;\n        return;\n    }\n    pElement->m_pParentElement = pParent;\n    pElement->m_pTaggedElement = pTaggedElement;\n    pParent->m_ChildArray.Add(pElement);\n    int count = pTaggedElement->CountKids();\n    for(int i = 0; i < count; i++) {\n        CPDF_StructKid Kid = pTaggedElement->GetKid(i);\n        switch(Kid.m_Type) {\n            case CPDF_StructKid::Element: {\n                    ProcessElement(pElement, Kid.m_Element.m_pElement);\n                    if(m_Status != LayoutReady) {\n                        return ;\n                    }\n                }\n                break;\n            case CPDF_StructKid::PageContent: {\n                    int count = m_pPage->CountObjects();\n                    FX_POSITION pos = m_pPage->GetFirstObjectPosition();\n                    if(!pos) {\n                        m_Status = LayoutError;\n                        return ;\n                    }\n                    while (pos) {\n                        CPDF_PageObject* pObj = m_pPage->GetNextObject(pos);\n                        int pbjMCID = pObj->m_ContentMark.GetMCID();\n                        if((FX_DWORD)(pObj->m_ContentMark.GetMCID()) == Kid.m_PageContent.m_ContentId) {\n                            pElement->AddObject(pObj);\n                        }\n                    }\n                }\n                break;\n            case CPDF_StructKid::StreamContent:\n            case CPDF_StructKid::Object:\n            default:\n                break;\n        }\n    }\n}\nLayoutStatus CPDF_LayoutProvider_TaggedPDF::StartLoad(IFX_Pause* pPause)\n{\n    m_pPause = pPause;\n    if(m_pPage->m_pDocument && m_pPage->m_pFormDict) {\n        m_pPageTree = CPDF_StructTree::LoadPage(m_pPage->m_pDocument, m_pPage->m_pFormDict);\n    }\n    if(!m_pPageTree) {\n        m_Status = LayoutError;\n        return LayoutError;\n    }\n    int count = m_pPageTree->CountTopElements();\n    if(count == 0) {\n        m_Status = LayoutError;\n        return LayoutError;\n    }\n    m_pRoot = FX_NEW CPDF_LayoutElement;\n    if (!m_pRoot) {\n        m_Status = LayoutError;\n        return LayoutError;\n    }\n    for(int i = 0; i < count; i++) {\n        CPDF_StructElement* pElement = m_pPageTree->GetTopElement(i);\n        if(pElement) {\n            ProcessElement(m_pRoot, pElement);\n            if(m_Status != LayoutReady) {\n                return m_Status;\n            }\n        }\n    }\n    m_pCurTaggedElement = NULL;\n    m_Status = LayoutFinished;\n    return LayoutFinished;\n}\nLayoutStatus CPDF_LayoutProvider_TaggedPDF::Continue()\n{\n    if(!m_pCurTaggedElement) {\n        return LayoutError;\n    }\n    if(m_Status != LayoutToBeContinued) {\n        return LayoutError;\n    }\n    m_Status = LayoutReady;\n    int count = m_pPageTree->CountTopElements();\n    for(int i = 0; i < count; i++) {\n        CPDF_StructElement* pElement = m_pPageTree->GetTopElement(i);\n        if(pElement) {\n            ProcessElement(m_pRoot, pElement);\n            if(m_Status != LayoutReady) {\n                return m_Status;\n            }\n        }\n    }\n    m_pCurTaggedElement = NULL;\n    m_Status = LayoutFinished;\n    return LayoutFinished;\n}\nint CPDF_LayoutProvider_TaggedPDF::GetPosition()\n{\n    if(m_TopElementIndex == 0) {\n        return 0;\n    }\n    int count = m_pPageTree->CountTopElements();\n    return m_TopElementIndex / count * 100;\n}\n"
  },
  {
    "path": "core/src/reflow/layoutprovider_taggedpdf.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef LayoutProvider_TaggedPDF_H\n#define LayoutProvider_TaggedPDF_H\n#include \"../../include/reflow/reflowengine.h\"\nclass CPDF_LayoutElement : public IPDF_LayoutElement, public CFX_Object\n{\npublic:\n    CPDF_LayoutElement();\n    ~CPDF_LayoutElement();\n\n    LayoutType\tGetType();\n    void\tGetRect(CFX_FloatRect& rcRect) {};\n\n    int\t\tCountAttrValues(LayoutAttr attr_type);\n\n    LayoutEnum\tGetEnumAttr(LayoutAttr attr_type, int index);\n    FX_FLOAT\tGetNumberAttr(LayoutAttr attr_type, int index);\n    FX_COLORREF\tGetColorAttr(LayoutAttr attr_type, int index);\n\n    int\t\tCountChildren();\n\n    IPDF_LayoutElement* GetChild(int index);\n\n    IPDF_LayoutElement* GetParent();\n\n    int\tCountObjects();\n    CPDF_PageObject*\tGetObject(int index);\n    FX_BOOL AddObject(CPDF_PageObject* pObj);\n    CPDF_StructElement* m_pTaggedElement;\n    CPDF_LayoutElement* m_pParentElement;\n    CFX_PtrArray\tm_ChildArray;\n    LayoutType ConvertLayoutType(FX_BSTR name);\n    CFX_ByteStringC ConvertLayoutType(LayoutType type);\n    CFX_ByteStringC ConvertLayoutAttr(LayoutAttr attr);\n    LayoutEnum ConvertLayoutEnum(CFX_ByteStringC Enum);\n\nprotected:\n    FX_BOOL\t\tIsInheritable(LayoutAttr attr_type);\n    CFX_ByteStringC GetAttrOwner(LayoutAttr attr_type);\n    CFX_ByteStringC GetDefaultNameValue(LayoutAttr attr_type);\n    FX_FLOAT\t\tGetDefaultFloatValue(LayoutAttr attr_type);\n    FX_COLORREF\t\tGetDefaultColorValue(LayoutAttr attr_type);\n    CFX_PtrArray\tm_ObjArray;\n};\nclass CPDF_LayoutProvider_TaggedPDF : public IPDF_LayoutProvider, public CFX_Object\n{\npublic:\n    CPDF_LayoutProvider_TaggedPDF();\n    ~CPDF_LayoutProvider_TaggedPDF();\n    void\t\t\tSetLayoutProviderStyle(LAYOUTPROVIDER_STYLE style) {};\n\n    void\tInit(CPDF_PageObjects* pPage)\n    {\n        m_pPage = pPage;\n        m_Status = LayoutReady;\n    };\n\n    LayoutStatus\tStartLoad(IFX_Pause* pPause = NULL);\n    LayoutStatus\tContinue();\n    int\t\t \t\tGetPosition();\n\n    IPDF_LayoutElement* GetRoot()\n    {\n        return m_pRoot;\n    };\n\nprotected:\n    void ProcessElement(CPDF_LayoutElement*pParent, CPDF_StructElement* pTaggedElement);\n    LayoutStatus\tm_Status;\n    CPDF_StructElement* m_pCurTaggedElement;\n    CPDF_LayoutElement* m_pRoot;\n    IFX_Pause*\t\t\tm_pPause;\n    CPDF_PageObjects*\tm_pPage;\n    CPDF_StructTree*\tm_pPageTree;\n    int\t\t\t\t\tm_TopElementIndex;\n};\n#endif\n"
  },
  {
    "path": "core/src/reflow/reflowedpage.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/reflow/reflowengine.h\"\n#include \"reflowedpage.h\"\nCPDF_ProgressiveReflowPageParser::CPDF_ProgressiveReflowPageParser()\n{\n    m_nObjProcessed = 0;\n    m_pReflowEngine = NULL;\n    m_pProvider = NULL;\n}\nCPDF_ProgressiveReflowPageParser::~CPDF_ProgressiveReflowPageParser()\n{\n    if(m_pProvider) {\n        delete m_pProvider;\n    }\n    m_pProvider = NULL;\n    if(m_pReflowEngine) {\n        delete m_pReflowEngine;\n    }\n    m_pReflowEngine = NULL;\n}\nvoid CPDF_ProgressiveReflowPageParser::Init()\n{\n    m_Status = Ready;\n}\nCPDF_ReflowedPage::CPDF_ReflowedPage(CFX_GrowOnlyPool*\tpMemoryPool)\n{\n    m_PageWidth = 0;\n    m_PageHeight = 0;\n    m_bWaiting = TRUE;\n    if(pMemoryPool) {\n        m_pMemoryPool = pMemoryPool;\n        m_bCreateMemoryPool = FALSE;\n    } else {\n        m_pMemoryPool = FX_NEW CFX_GrowOnlyPool;\n        m_bCreateMemoryPool = TRUE;\n    }\n    m_pCharState = FX_NEW CRF_CharStateArray(10);\n    m_pReflowed = FX_NEW CRF_DataPtrArray(500);\n    m_pPageInfos = NULL;\n}\nCPDF_ReflowedPage::~CPDF_ReflowedPage()\n{\n    if (m_pReflowed) {\n        for(int i = 0; i < m_pReflowed->GetSize(); i++) {\n            CRF_Data* pData = (*m_pReflowed)[i];\n            if(pData->m_Type == CRF_Data::Image) {\n                delete ((CRF_ImageData*)pData)->m_pBitmap;\n            }\n        }\n        m_pReflowed->RemoveAll();\n        delete m_pReflowed;\n    }\n    m_pReflowed = NULL;\n    if (m_pCharState) {\n        m_pCharState->RemoveAll();\n        delete m_pCharState;\n    }\n    m_pCharState = NULL;\n    if(m_bCreateMemoryPool && m_pMemoryPool) {\n        m_pMemoryPool->FreeAll();\n    }\n    if (m_pMemoryPool) {\n        delete m_pMemoryPool;\n    }\n    m_pMemoryPool = NULL;\n    m_pPDFPage = NULL;\n    if (m_pPageInfos) {\n        ReleasePageObjsMemberShip();\n    }\n}\nFX_BOOL CPDF_ReflowedPage::RetainPageObjsMemberShip()\n{\n    if (NULL == m_pPDFPage) {\n        return FALSE;\n    }\n    if (NULL == m_pPageInfos) {\n        m_pPageInfos = FX_NEW CFX_MapPtrToPtr();\n    } else {\n        return TRUE;\n    }\n    FX_POSITION\tpos = m_pPDFPage->GetFirstObjectPosition();\n    if (!pos)\t{\n        return FALSE;\n    }\n    CPDF_PageObject* pPageObj = NULL;\n    while (pos) {\n        pPageObj = m_pPDFPage->GetNextObject(pos);\n        MarkPageObjMemberShip(pPageObj, NULL);\n        pPageObj = NULL;\n    }\n    return TRUE;\n}\nvoid CPDF_ReflowedPage::MarkPageObjMemberShip(CPDF_PageObject* pObj, CRF_PageInfo* pParent)\n{\n    if (NULL == m_pPageInfos) {\n        return;\n    }\n    CRF_PageInfo* pPageInfo = FX_NEW CRF_PageInfo(pObj, pParent);\n    if (NULL == pPageInfo) {\n        return;\n    }\n    m_pPageInfos->SetAt(pObj, pPageInfo);\n    if (PDFPAGE_FORM != pObj->m_Type) {\n        return;\n    }\n    CPDF_FormObject* pFormObj = (CPDF_FormObject*)pObj;\n    FX_POSITION\tpos;\n    pos = pFormObj->m_pForm->GetFirstObjectPosition();\n    if (!pos)\t{\n        return;\n    }\n    CPDF_PageObject* pPageObj = NULL;\n    while (pos) {\n        pPageObj = pFormObj->m_pForm->GetNextObject(pos);\n        MarkPageObjMemberShip(pPageObj, pPageInfo);\n        pPageObj = NULL;\n    }\n}\nvoid CPDF_ReflowedPage::ReleasePageObjsMemberShip()\n{\n    if (NULL == m_pPageInfos) {\n        return;\n    }\n    CPDF_PageObject* pPageObj = NULL;\n    CRF_PageInfo* pPageInfo = NULL;\n    FX_POSITION pos = m_pPageInfos->GetStartPosition();\n    while (pos) {\n        m_pPageInfos->GetNextAssoc(pos, (void*&)pPageObj, (void*&)pPageInfo);\n        delete pPageInfo;\n    }\n    m_pPageInfos->RemoveAll();\n    delete m_pPageInfos;\n    m_pPageInfos = NULL;\n}\nCPDF_Dictionary* CPDF_ReflowedPage::GetFormResDict(CPDF_PageObject* pObj)\n{\n    if (NULL == m_pPageInfos) {\n        return NULL;\n    }\n    if (FALSE == RetainPageObjsMemberShip()) {\n        return NULL;\n    }\n    CRF_PageInfo* pPageInfo = (CRF_PageInfo*)m_pPageInfos->GetValueAt(pObj);\n    if (NULL == pPageInfo) {\n        return NULL;\n    }\n    return pPageInfo->GetFormDict();\n}\nvoid CPDF_ReflowedPage::GetDisplayMatrix(CFX_AffineMatrix& matrix, FX_INT32 xPos, FX_INT32 yPos, FX_INT32 xSize, FX_INT32 ySize, FX_INT32 iRotate, const CFX_AffineMatrix* pPageMatrix)\n{\n    CFX_AffineMatrix display_matrix;\n    if(m_PageHeight == 0) {\n        matrix.Set(1, 0, 0, -1, 0, 0);\n        return;\n    }\n    FX_INT32 x0, y0, x1, y1, x2, y2;\n    iRotate %= 4;\n    switch (iRotate) {\n        case 0:\n            x0 = xPos;\n            y0 = yPos;\n            x1 = xPos;\n            y1 = yPos + ySize;\n            x2 = xPos + xSize;\n            y2 = yPos;\n            break;\n        case 3:\n            x0 = xPos;\n            y0 = ySize + yPos;\n            x1 =  xPos + xSize;\n            y1 = yPos + ySize;\n            x2 = xPos;\n            y2 = yPos;\n            break;\n        case 2:\n            x0 = xSize + xPos;\n            y0 = ySize + yPos;\n            x1 = xSize + xPos ;\n            y1 = yPos;\n            x2 = xPos;\n            y2 =  ySize + yPos;\n            break;\n        case 1:\n            x0 = xPos + xSize;\n            y0 = yPos;\n            x1 = xPos;\n            y1 = yPos;\n            x2 = xPos + xSize;\n            y2 = yPos + ySize;\n            break;\n    }\n    display_matrix.Set(FXSYS_Div((FX_FLOAT)(x2 - x0), m_PageWidth),\n                       FXSYS_Div((FX_FLOAT)(y2 - y0), m_PageWidth),\n                       FXSYS_Div((FX_FLOAT)(x1 - x0), m_PageHeight),\n                       FXSYS_Div((FX_FLOAT)(y1 - y0), m_PageHeight),\n                       (FX_FLOAT)(x0), (FX_FLOAT)(y0));\n    matrix.Set(1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);\n    matrix.Concat(display_matrix);\n    return;\n}\nFX_FLOAT CPDF_ReflowedPage::GetPageHeight()\n{\n    return m_PageHeight;\n}\nvoid CPDF_ReflowedPage::FocusGetData(const CFX_AffineMatrix matrix, FX_INT32 x, FX_INT32 y, CFX_ByteString& str)\n{\n    if (NULL == m_pReflowed) {\n        return;\n    }\n    CFX_AffineMatrix revMatrix;\n    revMatrix.SetReverse(matrix);\n    FX_FLOAT x1, y1;\n    revMatrix.Transform((float)x, (float)y, x1, y1);\n    int count = m_pReflowed->GetSize();\n    FX_FLOAT dx = 1000, dy = 1000;\n    FX_INT32 pos = 0;\n    FX_INT32 i;\n    for(i = 0; i < count; i++) {\n        CRF_Data* pData = (*m_pReflowed)[i];\n        FX_FLOAT tempdy = FXSYS_fabs(pData->m_PosY - y1);\n        if(FXSYS_fabs(tempdy - dy) < 1) {\n            continue;\n        }\n        CFX_FloatRect rect (0, pData->m_PosY + pData->m_Height, this->m_PageWidth, pData->m_PosY);\n        if(rect.Contains(x1, y1)) {\n            pos = i;\n            dx = 0;\n            dy = 0;\n            break;\n        } else if(tempdy < dy) {\n            dy = tempdy;\n            dx = FXSYS_fabs(pData->m_PosX - x1);\n            pos = i;\n        } else if (tempdy == dy) {\n            FX_FLOAT tempdx = FXSYS_fabs(pData->m_PosX - x1);\n            if(tempdx < dx) {\n                dx = tempdx;\n                pos = i;\n            }\n        } else if (tempdy > dy) {\n            break;\n        }\n    }\n    if(dx != 0 || dy != 0) {\n        count = count < (pos + 10) ? count : (pos + 10);\n        for(i = 0 > (pos - 10) ? 0 : (pos - 10); i < count; i++) {\n            CRF_Data* pData = (*m_pReflowed)[i];\n            FX_FLOAT tempdy = FXSYS_fabs(pData->m_PosY - y1);\n            if(tempdy < dy) {\n                dy = tempdy;\n                dx = FXSYS_fabs(pData->m_PosX - x1);\n                pos = i;\n            } else if (tempdy == dy) {\n                FX_FLOAT tempdx = FXSYS_fabs(pData->m_PosX - x1);\n                if(tempdx < dx) {\n                    dx = tempdx;\n                    pos = i;\n                }\n            }\n        }\n    }\n    str.Format(\"%d\", pos);\n}\nFX_BOOL CPDF_ReflowedPage::FocusGetPosition(const CFX_AffineMatrix matrix, CFX_ByteString str, FX_INT32& x, FX_INT32& y)\n{\n    if (NULL == m_pReflowed) {\n        return FALSE;\n    }\n    FX_INT32 pos = FXSYS_atoi(str);\n    if(pos < 0 || pos >= m_pReflowed->GetSize()) {\n        return FALSE;\n    }\n    CRF_Data* pData = (*m_pReflowed)[pos];\n    FX_FLOAT x1, y1;\n    matrix.Transform(pData->m_PosX, pData->m_PosY + pData->m_Height, x1, y1);\n    x = (int)x1;\n    y = (int)y1;\n    return TRUE;\n}\nint CPDF_ProgressiveReflowPageParser::GetPosition()\n{\n    if(!m_pProvider) {\n        return 0;\n    }\n    if(!m_pReflowEngine) {\n        return m_pProvider->GetPosition() / 2;\n    }\n    return m_pProvider->GetPosition() / 2 + m_pReflowEngine->GetPosition() / 2;\n}\nvoid CPDF_ProgressiveReflowPageParser::Continue(IFX_Pause* pPause)\n{\n    if (NULL == m_pReflowPage) {\n        return;\n    }\n    if(m_Status != ToBeContinued) {\n        return;\n    }\n    m_pPause = pPause;\n    if(m_pReflowEngine) {\n        if(m_pReflowEngine->Continue() != LayoutToBeContinued) {\n            m_Status = Done;\n        }\n    } else {\n        if(m_pProvider->Continue() == LayoutFinished) {\n            m_pReflowEngine = IPDF_LayoutProcessor::Create_LayoutProcessor_Reflow(m_TopIndent, m_ReflowedWidth, m_fScreenHeight, m_pReflowPage, m_flags, m_ParseStyle.m_LineSpace);\n            CFX_AffineMatrix matrix;\n            m_pPDFPage->GetDisplayMatrix(matrix, 0, 0, (int)(m_pPDFPage->GetPageWidth()), (int)(m_pPDFPage->GetPageHeight()), 0);\n            if(m_pReflowEngine->StartProcess(m_pProvider->GetRoot(), m_pPause, &matrix) != LayoutToBeContinued) {\n                m_Status = Done;\n            }\n        }\n    }\n    if(m_TopIndent && m_Status == Done) {\n        m_pReflowPage->m_PageHeight -= m_TopIndent;\n    }\n}\nvoid CPDF_ProgressiveReflowPageParser::Clear()\n{\n    this->Init();\n    return;\n}\nFX_BOOL IPDF_ProgressiveReflowPageParser::IsTaggedPage(CPDF_PageObjects*pPage)\n{\n    if(!pPage) {\n        return FALSE;\n    }\n    CPDF_StructTree* pPageTree = CPDF_StructTree::LoadPage(pPage->m_pDocument, pPage->m_pFormDict);\n    if(pPageTree) {\n        int count = pPageTree->CountTopElements();\n        if(count) {\n            for(int i = 0; i < count; i++) {\n                CPDF_StructElement* pElm = pPageTree->GetTopElement(i);\n                if(pElm) {\n                    delete pPageTree;\n                    pPageTree = NULL;\n                    return TRUE;\n                }\n            }\n        }\n        delete pPageTree;\n        pPageTree = NULL;\n        return FALSE;\n    }\n    return FALSE;\n}\nvoid CPDF_ProgressiveReflowPageParser::Start(IPDF_ReflowedPage* pReflowPage, CPDF_Page* pPage, FX_FLOAT topIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, IFX_Pause* pPause, int flags)\n{\n    if (NULL == pReflowPage) {\n        m_Status = Failed;\n        return;\n    }\n    m_flags = flags;\n    m_pReflowPage = (CPDF_ReflowedPage*)pReflowPage;\n    m_pReflowPage->m_pPDFPage = pPage;\n    m_pReflowPage->ReleasePageObjsMemberShip();\n    m_pPDFPage = pPage;\n    m_TopIndent = topIndent;\n    m_pPause = pPause;\n    m_fScreenHeight = fHeight;\n    m_ReflowedWidth = fWidth;\n    m_pProvider = IPDF_LayoutProvider::Create_LayoutProvider_TaggedPDF(m_pPDFPage);\n    LayoutStatus status = m_pProvider->StartLoad(pPause);\n    if(status == LayoutError) {\n        delete m_pProvider;\n        m_pProvider = IPDF_LayoutProvider::Create_LayoutProvider_AutoReflow(m_pPDFPage, m_flags & RF_PARSER_READERORDER);\n        if (NULL == m_pProvider) {\n            m_Status = Failed;\n            return;\n        }\n        status = m_pProvider->StartLoad(pPause);\n    }\n    if(status == LayoutError) {\n        delete m_pProvider;\n        m_pProvider = NULL;\n        m_Status = Failed;\n        return;\n    }\n    if(status == LayoutToBeContinued) {\n        m_Status = ToBeContinued;\n    } else if (status == LayoutFinished) {\n        m_pReflowEngine = IPDF_LayoutProcessor::Create_LayoutProcessor_Reflow(topIndent, fWidth, fHeight, pReflowPage, m_flags, m_ParseStyle.m_LineSpace);\n        if(NULL == m_pReflowEngine) {\n            delete m_pProvider;\n            m_pProvider = NULL;\n            m_Status = Failed;\n            return;\n        }\n        CFX_AffineMatrix matrix;\n        pPage->GetDisplayMatrix(matrix, 0, 0, (int)(pPage->GetPageWidth()), (int)(pPage->GetPageHeight()), 0);\n        CFX_AffineMatrix matrix1 = pPage->GetPageMatrix();\n        if((status = m_pReflowEngine->StartProcess(m_pProvider->GetRoot(), pPause, &matrix)) != LayoutToBeContinued) {\n            delete m_pReflowEngine;\n            m_pReflowEngine = NULL;\n            m_Status = Done;\n        } else {\n            m_Status = ToBeContinued;\n        }\n    }\n    if(status != LayoutToBeContinued) {\n        delete m_pProvider;\n        m_pProvider = NULL;\n    }\n    if(m_TopIndent && m_Status == Done) {\n        m_pReflowPage->m_PageHeight -= m_TopIndent;\n    }\n    return;\n}\nCPDF_ProgressiveReflowPageRender::~CPDF_ProgressiveReflowPageRender()\n{\n    if(m_pDisplayMatrix) {\n        delete m_pDisplayMatrix;\n    }\n    m_pDisplayMatrix = NULL;\n}\nCPDF_ProgressiveReflowPageRender::CPDF_ProgressiveReflowPageRender()\n{\n    m_Status = Ready;\n    m_pReflowPage = NULL;\n    m_pDisplayMatrix = NULL;\n    m_CurrNum = 0;\n    m_pFontEncoding = NULL;\n    m_DisplayColor = -1;\n}\nstatic FX_FLOAT _CIDTransformToFloat(FX_BYTE ch)\n{\n    if (ch < 128) {\n        return ch * 1.0f / 127;\n    }\n    return (-255 + ch) * 1.0f / 127;\n}\nint\tCPDF_ProgressiveReflowPageRender::GetPosition()\n{\n    if(m_CurrNum == 0 || NULL == m_pReflowPage) {\n        return 0;\n    }\n    int size = m_pReflowPage->m_pReflowed->GetSize();\n    if(size == 0 || m_CurrNum >= size) {\n        return 100;\n    }\n    return (int)(m_CurrNum * 100 / size);\n}\nvoid CPDF_ProgressiveReflowPageRender::Display(IFX_Pause* pPause)\n{\n    if (NULL == m_pReflowPage) {\n        m_Status = Done;\n        return;\n    }\n    FX_RECT clipBox = m_pFXDevice->GetClipBox();\n    int size = m_pReflowPage->m_pReflowed->GetSize();\n    if (size < 1 || NULL == m_pDisplayMatrix) {\n        m_Status = Done;\n        return;\n    }\n    for(int i = m_CurrNum; i < size; i++) {\n        CRF_Data* pData = (*m_pReflowPage->m_pReflowed)[i];\n        if(!pData) {\n            continue;\n        }\n        CFX_FloatRect rect (pData->m_PosX, pData->m_PosY + pData->m_Height, pData->m_PosX + pData->m_Width, pData->m_PosY);\n        m_pDisplayMatrix->TransformRect(rect);\n        if(rect.left > clipBox.right || rect.right < clipBox.left || rect.bottom > clipBox.bottom || rect.top < clipBox.top) {\n            continue;\n        }\n        if(pData->GetType() == CRF_Data::Text) {\n            CRF_CharData* pCharData = (CRF_CharData*)pData;\n            CPDF_Font* pPDFFont = pCharData->m_pCharState->m_pFont;\n            if(pPDFFont->GetFontType() == PDFFONT_TYPE3) {\n                continue;\n            }\n            FX_FLOAT x = pData->m_PosX, y = pData->m_PosY - pCharData->m_pCharState->m_fDescent;\n            FXTEXT_CHARPOS charpos ;\n            charpos.m_GlyphIndex = pPDFFont->GlyphFromCharCode(pCharData->m_CharCode);\n            charpos.m_FontCharWidth = pPDFFont->m_Font.GetGlyphWidth(charpos.m_GlyphIndex);\n            charpos.m_OriginX       = x;\n            charpos.m_OriginY       = y;\n            FX_FLOAT charW = pData->m_Width * 1000 / pData->m_Height;\n            if(charW != charpos.m_FontCharWidth) {\n                charpos.m_bGlyphAdjust  = TRUE;\n                charpos.m_AdjustMatrix[0] = charW / charpos.m_FontCharWidth;\n                charpos.m_AdjustMatrix[1] = 0;\n                charpos.m_AdjustMatrix[2] = 0;\n                charpos.m_AdjustMatrix[3] = 1;\n            } else {\n                charpos.m_bGlyphAdjust  = FALSE;\n            }\n            FX_BOOL bRet = FALSE;\n            if(m_DisplayColor == -1)\n                bRet = m_pFXDevice->DrawNormalText(1, &charpos, &(pPDFFont->m_Font),\n                                                   NULL, pCharData->m_pCharState->m_fFontSize,\n                                                   m_pDisplayMatrix, pCharData->m_pCharState->m_Color + 0xff000000, FXTEXT_CLEARTYPE);\n            else\n                bRet = m_pFXDevice->DrawNormalText(1, &charpos, &(pPDFFont->m_Font),\n                                                   NULL, pCharData->m_pCharState->m_fFontSize, m_pDisplayMatrix, m_DisplayColor, FXTEXT_CLEARTYPE);\n        } else if(pData->GetType() == CRF_Data::Image) {\n            CRF_ImageData* pImageData = (CRF_ImageData*)pData;\n            if(!pImageData->m_pBitmap) {\n                continue;\n            }\n            int left = 0, top = 0;\n            CFX_DIBitmap* pDiBmp = NULL;\n            CFX_DIBSource* pDispSource = pImageData->m_pBitmap;\n            if(pImageData->m_Matrix.d < 0) {\n                CFX_AffineMatrix matrix(pImageData->m_Matrix.a, 0, 0, -pImageData->m_Matrix.d, 0, 0);\n                int left, top;\n                pDiBmp = pImageData->m_pBitmap->TransformTo(&matrix, left, top);\n                pDispSource = pDiBmp;\n            }\n            if (NULL == pDispSource) {\n                continue;\n            }\n            if (pDispSource->GetFormat() == FXDIB_1bppMask || pDispSource->GetFormat() == FXDIB_8bppMask) {\n                m_pFXDevice->StretchBitMask(pDispSource, (int)(rect.left + 0.5), (int)(rect.bottom + 0.5), (int)(rect.Width() + 0.5), (int)(rect.Height() + 0.5), 0xff000000);\n            } else {\n                m_pFXDevice->StretchDIBits(pDispSource, (int)(rect.left + 0.5), (int)(rect.bottom + 0.5), (int)(rect.Width() + 0.5), (int)(rect.Height() + 0.5));\n            }\n            if(m_pFXDevice->GetBitmap() && m_pFXDevice->GetBitmap()->GetFormat() == FXDIB_8bppRgb &&\n                    m_pFXDevice->GetBitmap()->GetPalette() == NULL) {\n                int nPalette = 0;\n                switch(m_DitherBits) {\n                    case 0:\n                        nPalette = 0;\n                        break;\n                    case 1:\n                        nPalette = 2;\n                        break;\n                    case 2:\n                        nPalette = 4;\n                        break;\n                    case 3:\n                        nPalette = 8;\n                        break;\n                    case 4:\n                        nPalette = 16;\n                        break;\n                    case 5:\n                        nPalette = 32;\n                        break;\n                    case 6:\n                        nPalette = 64;\n                        break;\n                    case 7:\n                        nPalette = 128;\n                        break;\n                    default:\n                        nPalette = 256;\n                        break;\n                }\n                if(nPalette >= 2) {\n                    FX_ARGB * palette = FX_Alloc(FX_ARGB, nPalette);\n                    nPalette --;\n                    palette[0] = 0;\n                    palette[nPalette] = 255;\n                    FX_FLOAT Dither = (FX_FLOAT)255 / (nPalette);\n                    for(int i = 1; i < nPalette; i++) {\n                        palette[i] = (FX_ARGB)(Dither * i + 0.5);\n                    }\n                    FX_RECT tmpRect = rect.GetOutterRect();\n                    m_pFXDevice->GetBitmap()->DitherFS(palette, nPalette + 1, &tmpRect);\n                    FX_Free (palette);\n                }\n            }\n            if(pDiBmp) {\n                delete pDiBmp;\n            }\n        } else if(pData->GetType() == CRF_Data::Path) {\n        }\n        if(!(i % 10)) {\n            if(pPause && pPause->NeedToPauseNow()) {\n                i++;\n                m_CurrNum = i;\n                m_Status = ToBeContinued;\n                return;\n            }\n        }\n    }\n    m_CurrNum = size;\n    m_Status = Done;\n}\nvoid CPDF_ProgressiveReflowPageRender::Start(IPDF_ReflowedPage* pReflowPage, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pMatrix, IFX_Pause* pPause, int DitherBits)\n{\n    if(!pReflowPage || !pDevice || !pMatrix) {\n        m_Status = Failed;\n        return;\n    }\n    m_DitherBits = DitherBits;\n    m_Status = Ready;\n    m_CurrNum = 0;\n    m_pReflowPage = (CPDF_ReflowedPage*)pReflowPage;\n    m_pFXDevice = pDevice;\n    if(NULL == m_pDisplayMatrix) {\n        m_pDisplayMatrix = FX_NEW CFX_AffineMatrix;\n    }\n    if (m_pDisplayMatrix) {\n        m_pDisplayMatrix->Copy(*pMatrix);\n    }\n    m_Status = ToBeContinued;\n    Display(pPause);\n}\nvoid CPDF_ProgressiveReflowPageRender::Continue(IFX_Pause* pPause)\n{\n    Display(pPause);\n}\nvoid CPDF_ProgressiveReflowPageRender::SetDisplayColor(FX_COLORREF color)\n{\n    m_DisplayColor = color;\n}\nvoid CPDF_ProgressiveReflowPageRender::Clear()\n{\n    if (m_pDisplayMatrix) {\n        delete m_pDisplayMatrix;\n    }\n    m_pDisplayMatrix = NULL;\n    m_pReflowPage = NULL;\n    m_pFXDevice = NULL;\n    m_CurrNum = 0;\n    m_Status = Ready;\n}\n"
  },
  {
    "path": "core/src/reflow/reflowedpage.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _REFLOWED_PAGE_H\n#define _REFLOWED_PAGE_H\n#include \"../../include/reflow/reflowengine.h\"\n#define GET_SIGNED(a) ( (a)>0 ? a/a : (a==0 ? 0 : -a/a) )\nclass CRF_Data;\nclass CRF_LineData;\nclass CRF_CharData;\nclass CRF_PathData;\nclass CRF_ImageData;\nclass CRF_Table;\nclass CRF_AttrOperation;\nclass CRF_OperationDate;\nclass CPDF_ReflowedPage;\nclass CPDF_Rect;\nclass CFX_Object;\ntypedef CFX_SegmentedArray<CRF_Data*> CRF_DataPtrArray;\nclass CRF_CharState;\ntypedef CFX_SegmentedArray<CRF_CharState> CRF_CharStateArray;\n#define SST_GE\t\t1\n#define SST_BLSE\t2\n#define SST_ILSE\t3\n#define SST_IE\t\t4\nclass CPDF_LayoutProcessor_Reflow : public IPDF_LayoutProcessor, public CFX_Object\n{\npublic:\n    CPDF_LayoutProcessor_Reflow();\n    ~CPDF_LayoutProcessor_Reflow();\n    void Init(FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, CPDF_ReflowedPage* pReflowedPage, int flags, FX_FLOAT lineSpace);\n\n    LayoutStatus\tStartProcess(IPDF_LayoutElement* pElement, IFX_Pause* pPause, const CFX_AffineMatrix* pPDFMatrix = NULL);\n    LayoutStatus\tContinue();\n    int\t\t\t\tGetPosition();\nprotected:\n    void\tFitPageMode();\n    void\tProcessElement(IPDF_LayoutElement* pElement, FX_FLOAT reflowWidth);\n    FX_FLOAT GetElmWidth(IPDF_LayoutElement* pElement);\n    CFX_FloatRect GetElmBBox(IPDF_LayoutElement* pElement);\n    void\tProcessTable(FX_FLOAT dx);\n    void\tProcessObjs(IPDF_LayoutElement* pElement, FX_FLOAT reflowWidth);\n    void\tProcessObject(CPDF_PageObject* pObj, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix);\n    void\tProcessTextObject(CPDF_TextObject *pObj, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix);\n    void\tProcessPathObject(CPDF_PathObject *pObj, FX_FLOAT reflowWidth);\n    void\tProcessUnitaryObjs(CPDF_PageObjects *pObjs, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix);\n    FX_INT32 LogicPreObj(CPDF_TextObject* pObj);\n    int ProcessInsertObject(CPDF_TextObject* pObj, CFX_AffineMatrix formMatrix);\n    FX_WCHAR GetPreChar();\n    FX_BOOL IsSameTextObject(CPDF_TextObject* pTextObj1, CPDF_TextObject* pTextObj2);\n    int GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const;\n    FX_BOOL\tIsCanBreakAfter(FX_DWORD unicode);\n    FX_BOOL\tIsCanBreakBefore(FX_DWORD unicode);\n    FX_INT32 GetElementTypes(LayoutType layoutType);\n    void\t\t\t\tCreateRFData(CPDF_PageObject* pObj, CFX_AffineMatrix* pMatrix = NULL);\n    CRF_CharState*\t\tGetCharState(CPDF_TextObject* pObj, CPDF_Font* pFont, FX_FLOAT fHeight, FX_ARGB color);\n    FX_FLOAT\t\tConverWidth(FX_FLOAT width);\n    void\tAddData2CurrLine(CRF_Data* pData);\n    void\tAddTemp2CurrLine(int begin, int count );\n    void\tTransform(const CFX_AffineMatrix* pMatrix, CRF_Data* pData);\n    void\tTransform(const CFX_AffineMatrix* pMatrix, CRF_DataPtrArray* pDataArray, int beginPos, int count = 0);\n    FX_FLOAT GetDatasWidth( int beginPos, int endpos);\n    void\tUpdateCurrLine();\n    FX_BOOL\tFinishedCurrLine();\n    int m_flags;\n    CFX_AffineMatrix m_PDFMatrix;\n    LayoutStatus\tm_Status;\n    CPDF_TextObject* m_pPreObj;\n    CFX_AffineMatrix m_perMatrix;\n    IPDF_LayoutElement*\tm_pLayoutElement;\n    IPDF_LayoutElement* m_pRootElement;\n    FX_FLOAT\t\tm_CurrRefWidth;\n    IFX_Pause*\t\tm_pPause;\n    LayoutEnum\t\tm_CurrWritingMode;\n    CPDF_ReflowedPage*\tm_pReflowedPage;\n    FX_FLOAT\t\tm_fRefWidth;\n    FX_FLOAT\t\tm_TopIndent;\n    FX_FLOAT\t\tm_fLineSpace;\n    FX_FLOAT\t\tm_fScreenHeight;\n    FX_FLOAT\t\tm_fCurrMaxWidth;\n    FX_FLOAT\t\tm_fCurrLineWidth;\n    FX_FLOAT\t\tm_fCurrLineHeight;\n    CRF_DataPtrArray*\tm_pCurrLine;\n    CRF_DataPtrArray*\tm_pTempLine;\n    FX_BOOL\t\t\tm_bIllustration;\n    FX_FLOAT\t\tm_fLineHeight;\n    LayoutEnum\t\tm_TextAlign;\n    FX_FLOAT\t\tm_StartIndent;\n    CFX_ArrayTemplate<CRF_Table*> m_TableArray;\n    int\t\t\t\tm_PausePosition;\n};\nstruct RF_TableCell {\n    int\t\t\tm_BeginPos;\n    int\t\t\tm_EndPos;\n    FX_FLOAT m_MaxWidth;\n    FX_FLOAT m_PosX;\n    FX_FLOAT\tm_PosY;\n    FX_FLOAT\tm_CellWidth;\n    FX_FLOAT m_CellHeight;\n    int\t\t\tm_RowSpan;\n    int\t\t\tm_ColSpan;\n    LayoutEnum\tm_BlockAlign;\n    LayoutEnum\tm_InlineAlign;\n};\ntypedef CFX_ArrayTemplate<RF_TableCell*> CRF_TableCellArray;\nclass CRF_Table : public CFX_Object\n{\npublic:\n    CRF_Table()\n    {\n        m_TableWidth = 0;\n        m_nCol = 0;\n    }\n    CRF_TableCellArray  m_pCellArray;\n    CFX_WordArray\t\tm_nCell;\n    int\t\t\t\t\tm_nCol;\n    FX_FLOAT\t\t\tm_TableWidth;\n    FX_FLOAT\t\t\tm_ReflowPageHeight;\n};\nclass CRF_CharState : public CFX_Object\n{\npublic:\n    CPDF_Font*\tm_pFont;\n    FX_ARGB\t\tm_Color;\n    FX_BOOL\t\tm_bVert;\n    FX_FLOAT m_fFontSize;\n    FX_FLOAT m_fAscent;\n    FX_FLOAT m_fDescent;\n\n    CPDF_TextObject*\tm_pTextObj;\n};\nclass CRF_PageInfo : public CFX_Object\n{\npublic:\n    CRF_PageInfo(CPDF_PageObject* pPageObj, CRF_PageInfo* pParent = NULL)\n        : m_pPageObj(pPageObj) , m_pParent(pParent)\n    {\n    }\n    CPDF_PageObject* GetPageObj()\n    {\n        return m_pPageObj;\n    }\n    CPDF_Dictionary* GetFormDict()\n    {\n        if (NULL == m_pParent) {\n            return NULL;\n        }\n        CPDF_PageObject* pParentObj = m_pParent->GetPageObj();\n        if (NULL == pParentObj || PDFPAGE_FORM != pParentObj->m_Type) {\n            return NULL;\n        }\n        return ((CPDF_FormObject*)pParentObj)->m_pForm->m_pResources;\n    }\nprotected:\n    CPDF_PageObject*\t\tm_pPageObj;\n    CRF_PageInfo*\t\t\tm_pParent;\n};\nclass CPDF_ReflowedPage : public IPDF_ReflowedPage, public CFX_PrivateData, public CFX_Object\n{\npublic:\n\n    CPDF_ReflowedPage(CFX_GrowOnlyPool*\tpMemoryPool);\n    ~CPDF_ReflowedPage();\n    CFX_PrivateData*\tGetPrivateDataCtrl()\n    {\n        return this;\n    };\n    void\t\tGetDisplayMatrix(CFX_AffineMatrix& matrix, FX_INT32 xPos, FX_INT32 yPos, FX_INT32 xSize, FX_INT32 ySize, FX_INT32 iRotate, const CFX_AffineMatrix* pPageMatrix);\n\n    FX_FLOAT\tGetPageHeight() ;\n    FX_FLOAT\tGetPageWidth()\n    {\n        return m_PageWidth;\n    };\n    void\t\tFocusGetData(const CFX_AffineMatrix matrix, FX_INT32 x, FX_INT32 y, CFX_ByteString& str);\n    FX_BOOL\t\tFocusGetPosition(const CFX_AffineMatrix matrix, CFX_ByteString str, FX_INT32& x, FX_INT32& y);\n    CRF_DataPtrArray*\tm_pReflowed;\n    FX_FLOAT\t\t\tm_PageWidth;\n    FX_FLOAT\t\t\tm_PageHeight;\n    FX_BOOL\t\t\t\tm_bWaiting;\n    CRF_CharStateArray*\tm_pCharState;\n    CFX_GrowOnlyPool*\tm_pMemoryPool;\n    FX_BOOL\t\t\t\tm_bCreateMemoryPool;\n    CPDF_Page*\t\t\tm_pPDFPage;\n    FX_BOOL\t\t\t\t\tRetainPageObjsMemberShip();\n    void\t\t\t\t\tMarkPageObjMemberShip(CPDF_PageObject* pObj, CRF_PageInfo* pParent);\n    void\t\t\t\t\tReleasePageObjsMemberShip();\n    CPDF_Dictionary*\t\tGetFormResDict(CPDF_PageObject* pObj);\n\n    CFX_MapPtrToPtr*\t\tm_pPageInfos;\n};\nclass CPDF_ProgressiveReflowPageParser : public IPDF_ProgressiveReflowPageParser, public CFX_Object\n{\npublic:\n    CPDF_ProgressiveReflowPageParser();\n    ~CPDF_ProgressiveReflowPageParser() ;\n    void\t\t\tInit();\n\n    ParseStatus\t\tGetStatus()\n    {\n        return m_Status;\n    };\n\n    void\t\t\tSetParserStyle(RF_ParseStyle style)\n    {\n        m_ParseStyle = style;\n    };\n    void\t\t\tStart(IPDF_ReflowedPage* pReflowPage, CPDF_Page* pPage, FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, IFX_Pause* pPause, int flags);\n    void\t\t\tContinue(IFX_Pause* pPause);\n    int\t\t\t\tGetPosition() ;\n\n    void\t\t\tClear();\n    ParseStatus\t\tm_Status;\nprotected:\n    RF_ParseStyle\t\tm_ParseStyle;\n    CPDF_Page*\t\t\tm_pPDFPage;\n    IFX_Pause*\t\t\tm_pPause;\n    CPDF_ReflowedPage*\tm_pReflowPage;\n    FX_FLOAT\t\t\tm_TopIndent;\n    FX_FLOAT\t\t\tm_ReflowedWidth;\n    FX_FLOAT\t\t\tm_fScreenHeight;\n    IPDF_LayoutProvider*\tm_pProvider;\n    IPDF_LayoutProcessor*\tm_pReflowEngine;\n    int\t\t\t\t\tm_nObjProcessed;\n    int m_flags;\n};\nclass CPDF_ProgressiveReflowPageRender : public IPDF_ProgressiveReflowPageRender, public CFX_Object\n{\npublic:\n    CPDF_ProgressiveReflowPageRender();\n    ~CPDF_ProgressiveReflowPageRender() ;\n\n    RenderStatus\t\t\tGetStatus()\n    {\n        return m_Status;\n    };\n\n\n    void\t\tSetDisplayColor(FX_COLORREF color);\n    void\t\tStart(IPDF_ReflowedPage* pReflowPage, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pMatrix, IFX_Pause* pPause, int DitherBits);\n    void\t\tContinue(IFX_Pause* pPause);\n    int\t\t\tGetPosition();\n\n\n    void\t\t\t\tClear();\nprotected:\n    void\t\t\t\tDisplay(IFX_Pause* pPause);\n    RenderStatus m_Status;\n    CPDF_ReflowedPage*\tm_pReflowPage;\n    CFX_AffineMatrix*\tm_pDisplayMatrix;\n    int\t\t\t\t\tm_CurrNum;\n    IFX_FontEncoding*\tm_pFontEncoding;\n    CFX_RenderDevice*\tm_pFXDevice;\n    int\t\t\t\t\tm_DitherBits;\n    FX_COLORREF\t\t\tm_DisplayColor;\n    typedef struct CRF_TextDataAtt {\n        CRF_TextDataAtt()\n        {\n            pFont = NULL;\n            fFontSize = 0.0f;\n            Color = 0;\n        }\n        CRF_TextDataAtt(CPDF_Font* font, FX_FLOAT fontSize, FX_ARGB color)\n        {\n            pFont = font;\n            fFontSize = fontSize;\n            Color = color;\n        }\n        CPDF_Font*  pFont;\n        FX_FLOAT    fFontSize;\n        FX_ARGB\t\tColor;\n    } CRF_TEXTDATAATT;\n    inline bool isTextDataAttSame(CRF_TEXTDATAATT data1, CRF_TEXTDATAATT data2)\n    {\n        if (data1.pFont != data2.pFont) {\n            return false;\n        }\n        if (data1.Color != data2.Color) {\n            return false;\n        }\n        if (fabs(data1.fFontSize - data2.fFontSize) > 0.0f) {\n            return false;\n        }\n        return true;\n    };\n};\n#define TYPE_UNKNOW\t\t0\n#define TYPE_TEXT\t\t1\n#define TYPE_PATH\t\t2\n#define TYPE_IMAGE\t\t3\n#define TYPE_LINE\t\t4\nclass CRF_Data : public CFX_Object\n{\npublic:\n    typedef enum {Unknow, Text, Image, Path, Line, paragraph} RF_DataType;\n    CRF_Data()\n    {\n        m_Type = Unknow;\n        m_Width = 0;\n        m_PosY = 0;\n        m_PosX = 0;\n        m_Height = 0;\n    }\n    RF_DataType\tGetType()\n    {\n        return m_Type;\n    }\n    virtual\t\t~CRF_Data() {}\n    RF_DataType \tm_Type;\n    FX_FLOAT\tm_PosX;\n    FX_FLOAT\tm_PosY;\n    FX_FLOAT\tm_Width;\n    FX_FLOAT\tm_Height;\n};\nclass CRF_LineData : public CRF_Data\n{\npublic:\n    CRF_LineData()\n    {\n        m_Type = Line;\n    }\n};\nclass CRF_CharData : public CRF_Data\n{\npublic:\n    CRF_CharData()\n    {\n        m_Type = Text;\n        m_CharCode = -1;\n    }\n    CRF_CharState*\tm_pCharState;\n    FX_DWORD\t\tm_CharCode;\n};\nclass CRF_ImageData : public CRF_Data\n{\npublic:\n    CRF_ImageData()\n    {\n        m_Type = Image;\n        m_pBitmap = NULL;\n    }\n    ~CRF_ImageData()\n    {\n        if(m_pBitmap) {\n            delete m_pBitmap;\n        }\n        m_pBitmap = NULL;\n    }\n    CFX_AffineMatrix m_Matrix;\n    CFX_DIBitmap*\tm_pBitmap;\n};\nclass CRF_PathData : public CRF_Data\n{\npublic:\n    CRF_PathData()\n    {\n        m_Type = Path;\n        m_bDecoration = FALSE;\n    }\n    ~CRF_PathData() {};\n    FX_BOOL\t\t\tm_bDecoration;\n    CPDF_Path\t\t\tm_pPathData;\n    CFX_AffineMatrix\tm_pPath2Device;\n    CPDF_GraphState\t\tm_pGraphState;\n    FX_ARGB\t\tm_fill_argb;\n    FX_ARGB\t\tm_stroke_argb;\n    int\t\t\tm_fill_mode;\n};\n#endif\n"
  },
  {
    "path": "core/src/reflow/reflowedtextpage.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"reflowedtextpage.h\"\nIPDF_TextPage*\tIPDF_TextPage::CreateReflowTextPage(IPDF_ReflowedPage* pRefPage)\n{\n    return FX_NEW CRF_TextPage(pRefPage);\n}\nCRF_TextPage::CRF_TextPage(IPDF_ReflowedPage* pRefPage)\n{\n    m_pRefPage = (CPDF_ReflowedPage*)(pRefPage);\n    m_pDataList = NULL;\n    m_CountBSArray = NULL;\n}\nCRF_TextPage::~CRF_TextPage()\n{\n    if(m_pDataList) {\n        delete m_pDataList;\n        m_pDataList = NULL;\n    }\n    if(m_CountBSArray) {\n        delete m_CountBSArray;\n        m_CountBSArray = NULL;\n    }\n}\nFX_BOOL CRF_TextPage::ParseTextPage()\n{\n    if(!m_pRefPage) {\n        return FALSE;\n    }\n    int count = m_pRefPage->m_pReflowed->GetSize();\n    if(count < 500) {\n        m_pDataList = FX_NEW CRF_CharDataPtrArray(count);\n    } else {\n        m_pDataList = FX_NEW CRF_CharDataPtrArray(500);\n    }\n    if (NULL == m_pDataList) {\n        return FALSE;\n    }\n    for(int i = 0; i < count; i++) {\n        CRF_Data* pData = (*(m_pRefPage->m_pReflowed))[i];\n        if(pData->GetType() == CRF_Data::Text) {\n            m_pDataList->Add((CRF_CharData*)pData);\n        }\n    }\n    m_CountBSArray = FX_NEW CFX_CountBSINT32Array(20);\n    if(NULL == m_CountBSArray) {\n        return FALSE;\n    }\n    return TRUE;\n}\nFX_BOOL\tCRF_TextPage::IsParsered() const\n{\n    if(m_pDataList) {\n        return TRUE;\n    }\n    return FALSE;\n}\nint CRF_TextPage::CharIndexFromTextIndex(int TextIndex) const\n{\n    return TextIndex;\n}\nint CRF_TextPage::TextIndexFromCharIndex(int CharIndex) const\n{\n    return CharIndex;\n}\n\nint\tCRF_TextPage::CountChars() const\n{\n    if (NULL == m_pDataList) {\n        return -1;\n    }\n    return m_pDataList->GetSize();\n}\nvoid CRF_TextPage::GetCharInfo(int index, FPDF_CHAR_INFO & info) const\n{\n    if(index >= CountChars() || index < 0 || !m_pDataList) {\n        return;\n    }\n    CRF_CharData* pData = (*m_pDataList)[index];\n    FX_FLOAT ReltiveCorddDs = pData->m_pCharState->m_fDescent;\n    FX_FLOAT ReltiveCorddAs = pData->m_pCharState->m_fAscent;\n    info.m_Flag\t\t= CHAR_NORMAL;\n    info.m_pTextObj\t= pData->m_pCharState->m_pTextObj;\n    info.m_OriginX\t= pData->m_PosX;\n    info.m_OriginY\t= pData->m_PosY - ReltiveCorddDs;\n    info.m_FontSize\t= pData->m_pCharState->m_fFontSize;\n    CFX_FloatRect FloatRectTmp(pData->m_PosX, pData->m_PosY, pData->m_PosX + pData->m_Width, pData->m_PosY + ReltiveCorddAs - ReltiveCorddDs);\n    info.m_CharBox\t= FloatRectTmp;\n    CFX_WideString str = pData->m_pCharState->m_pFont->UnicodeFromCharCode(pData->m_CharCode);\n    if(!str.IsEmpty()) {\n        info.m_Unicode\t= str.GetAt(0);\n    } else {\n        info.m_Unicode = -1;\n    }\n    info.m_Charcode = (FX_WCHAR)pData->m_CharCode;\n    info.m_Matrix = CFX_Matrix(1, 0, 0, 1, 0, 0);\n}\nextern FX_BOOL GetIntersection(FX_FLOAT low1, FX_FLOAT high1, FX_FLOAT low2, FX_FLOAT high2, FX_FLOAT& interlow, FX_FLOAT& interhigh);\ninline FX_BOOL _IsInsameline(const CFX_FloatRect& rectA, const CFX_FloatRect& rectB)\n{\n    if((rectA.top >= rectB.bottom && rectB.top >= rectA.bottom)) {\n        return TRUE;\n    } else {\n        return FALSE;\n    }\n}\ninline FX_BOOL _IsIntersect(const CFX_FloatRect& rectA, const CFX_FloatRect& rectB)\n{\n    FX_FLOAT interlow = .0f, interhigh = .0f;\n    if(GetIntersection(rectA.bottom, rectA.top, rectB.bottom, rectB.top, interlow, interhigh)) {\n        if(GetIntersection(rectA.left, rectA.right, rectB.left, rectB.right, interlow, interhigh)) {\n            return TRUE;\n        } else {\n            return FALSE;\n        }\n    }\n    return FALSE;\n}\nvoid CRF_TextPage::GetRectArray(int start, int nCount, CFX_RectArray& rectArray) const\n{\n    int indexlen = start + nCount;\n    FPDF_CHAR_INFO info;\n    FX_BOOL bstart = TRUE;\n    CFX_FloatRect recttmp;\n    int i;\n    for(i = start; i < indexlen; i++) {\n        GetCharInfo(i, info);\n        if(bstart) {\n            recttmp = info.m_CharBox;\n            bstart = FALSE;\n        } else if(_IsInsameline(recttmp, info.m_CharBox)) {\n            recttmp.right = info.m_CharBox.right;\n            if(info.m_CharBox.top > recttmp.top) {\n                recttmp.top = info.m_CharBox.top;\n            }\n            if(info.m_CharBox.bottom < recttmp.bottom) {\n                recttmp.bottom = info.m_CharBox.bottom;\n            }\n        } else {\n            rectArray.Add(recttmp);\n            recttmp = info.m_CharBox;\n        }\n    }\n    rectArray.Add(recttmp);\n}\ninline FX_FLOAT _GetDistance(CFX_FloatRect floatRect, CPDF_Point point)\n{\n    if(floatRect.right < point.x && floatRect.bottom > point.y) {\n        return FXSYS_sqrt(FXSYS_pow(point.x - floatRect.right, 2) + FXSYS_pow(floatRect.bottom - point.y, 2));\n    }\n    if (floatRect.right < point.x && floatRect.top < point.y) {\n        return FXSYS_sqrt(FXSYS_pow(point.x - floatRect.right, 2) + FXSYS_pow(point.y - floatRect.top, 2));\n    }\n    if(floatRect.left > point.x && floatRect.bottom > point.y) {\n        return FXSYS_sqrt(FXSYS_pow(floatRect.bottom - point.y, 2) + FXSYS_pow(floatRect.left - point.x, 2));\n    }\n    if((floatRect.right > point.x || FXSYS_fabs(floatRect.right - point.x) <= 0.0001f) &&\n            (floatRect.left < point.x || FXSYS_fabs(floatRect.left - point.x) <= 0.0001f) && floatRect.bottom > point.y) {\n        return FXSYS_fabs(floatRect.bottom - point.y);\n    }\n    if(floatRect.left > point.x && (floatRect.bottom < point.y || FXSYS_fabs(floatRect.bottom - point.y) <= 0.0001f) &&\n            (floatRect.top > point.y || FXSYS_fabs(floatRect.top - point.y) <= 0.0001f)) {\n        return FXSYS_fabs(floatRect.left - point.x);\n    }\n    if(floatRect.left > point.x && floatRect.top < point.y) {\n        return FXSYS_sqrt(FXSYS_pow(floatRect.left - point.x, 2) + FXSYS_pow(point.y - floatRect.top, 2));\n    }\n    if ((floatRect.left < point.x || FXSYS_fabs(floatRect.left - point.x) <= 0.0001f) &&\n            (floatRect.right > point.x || FXSYS_fabs(floatRect.right - point.x) <= 0.0001f) && floatRect.top < point.y) {\n        return FXSYS_fabs(point.y - floatRect.top);\n    }\n    if(floatRect.right < point.x && (floatRect.top > point.y || FXSYS_fabs(floatRect.top - point.y) <= 0.0001f) &&\n            (floatRect.bottom < point.y || FXSYS_fabs(floatRect.bottom - point.y) <= 0.0001f)) {\n        return point.x - floatRect.right;\n    }\n    return .0f;\n}\nint CRF_TextPage::GetIndexAtPos(CPDF_Point point, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const\n{\n    int index = -1, i = 0, j = 0;\n    FPDF_CHAR_INFO info;\n    CFX_FloatRect rectTmp;\n    FX_FLOAT MinDistance = 1000, DistanceTmp = 0;\n    FX_FLOAT rect_bottom = point.x - xTorelance;\n    CFX_FloatRect TorelanceRect(rect_bottom <= 0 ? 0 : rect_bottom, point.y - yTorelance, point.x + xTorelance, point.y + yTorelance);\n    int count = CountChars();\n    for(i = 0; i < count; i++) {\n        GetCharInfo(i, info);\n        rectTmp = info.m_CharBox;\n        if(rectTmp.Contains(point.x, point.y)) {\n            index = i;\n            break;\n        } else if(_IsIntersect(rectTmp, TorelanceRect)) {\n            DistanceTmp = _GetDistance(rectTmp, point);\n            if(DistanceTmp < MinDistance) {\n                MinDistance = DistanceTmp;\n                index = i;\n            }\n        }\n    }\n    return index;\n}\nint CRF_TextPage::GetIndexAtPos(FX_FLOAT x, FX_FLOAT y, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const\n{\n    int index = 0;\n    CPDF_Point point(x, y);\n    if((index = GetIndexAtPos(point, xTorelance, yTorelance)) < 0) {\n        return -1;\n    } else {\n        return index;\n    }\n}\nint CRF_TextPage::GetOrderByDirection(int index, int direction) const\n{\n    return -1;\n}\nCFX_WideString CRF_TextPage::GetTextByRect(CFX_FloatRect rect) const\n{\n    int count;\n    FPDF_CHAR_INFO info;\n    CFX_WideString str;\n    CFX_FloatRect  Recttmp;\n    FX_BOOL bstart = TRUE;\n    count = CountChars();\n    if(rect.IsEmpty()) {\n        return L\"\";\n    }\n    for(int i = 0; i < count; i++) {\n        GetCharInfo(i, info);\n        if(_IsIntersect(rect, info.m_CharBox)) {\n            if(bstart) {\n                Recttmp = info.m_CharBox;\n                str += info.m_Unicode;\n                bstart = FALSE;\n            } else if(_IsInsameline(Recttmp, info.m_CharBox)) {\n                str += info.m_Unicode;\n            } else {\n                str += L\"\\r\\n\";\n                Recttmp = info.m_CharBox;\n                str += info.m_Unicode;\n            }\n        }\n    }\n    if(str.IsEmpty()) {\n        return L\"\";\n    } else {\n        return str;\n    }\n}\nvoid CRF_TextPage::GetRectsArrayByRect(CFX_FloatRect rect, CFX_RectArray& resRectArray) const\n{\n    int count, i;\n    FX_BOOL bstart = TRUE;\n    FPDF_CHAR_INFO info;\n    CFX_FloatRect recttmp;\n    count = CountChars();\n    for(i = 0; i < count; i++) {\n        GetCharInfo(i, info);\n        if(_IsIntersect(rect, info.m_CharBox)) {\n            if(bstart) {\n                recttmp = info.m_CharBox;\n                bstart = FALSE;\n            } else if(_IsInsameline(recttmp, info.m_CharBox)) {\n                recttmp.right = info.m_CharBox.right;\n                if(info.m_CharBox.top > recttmp.top) {\n                    recttmp.top = info.m_CharBox.top;\n                }\n                if(info.m_CharBox.bottom < recttmp.bottom) {\n                    recttmp.bottom = info.m_CharBox.bottom;\n                }\n            } else {\n                resRectArray.Add(recttmp);\n                recttmp = info.m_CharBox;\n            }\n        }\n    }\n    resRectArray.Add(recttmp);\n}\nint CRF_TextPage::CountRects(int start, int nCount)\n{\n    m_rectArray.RemoveAll();\n    GetRectArray(start, nCount, m_rectArray);\n    return m_rectArray.GetSize();\n}\nvoid CRF_TextPage::GetRect(int rectIndex, FX_FLOAT& left, FX_FLOAT& top, FX_FLOAT& right, FX_FLOAT &bottom) const\n{\n    if(m_rectArray.GetSize() <= rectIndex) {\n        return;\n    }\n    left   = m_rectArray[rectIndex].left;\n    top    = m_rectArray[rectIndex].top;\n    right  = m_rectArray[rectIndex].right;\n    bottom = m_rectArray[rectIndex].bottom;\n}\nFX_BOOL CRF_TextPage::GetBaselineRotate(int rectIndex, int& Rotate)\n{\n    Rotate = 0;\n    return TRUE;\n}\nFX_BOOL CRF_TextPage::GetBaselineRotate(CFX_FloatRect rect, int& Rotate)\n{\n    Rotate = 0;\n    return TRUE;\n}\nint CRF_TextPage::CountBoundedSegments(FX_FLOAT left, FX_FLOAT top, FX_FLOAT right, FX_FLOAT bottom, FX_BOOL bContains)\n{\n    if (!m_CountBSArray) {\n        return -1;\n    }\n    m_CountBSArray->RemoveAll();\n    CFX_FloatRect floatrect(left, bottom, right, top);\n    int totalcount, i, j = 0, counttmp = 0;\n    FX_BOOL bstart = TRUE;\n    FPDF_CHAR_INFO info;\n    CFX_FloatRect recttmp;\n    totalcount = CountChars();\n    for(i = 0; i < totalcount; i++) {\n        GetCharInfo(i, info);\n        if(_IsIntersect(floatrect, info.m_CharBox)) {\n            if(bstart) {\n                m_CountBSArray->Add(i);\n                counttmp = 1;\n                recttmp = info.m_CharBox;\n                bstart = FALSE;\n            } else if(_IsInsameline(recttmp, info.m_CharBox)) {\n                recttmp.right = info.m_CharBox.right;\n                if(info.m_CharBox.top > recttmp.top) {\n                    recttmp.top = info.m_CharBox.top;\n                }\n                if(info.m_CharBox.bottom < recttmp.bottom) {\n                    recttmp.bottom = info.m_CharBox.bottom;\n                }\n                counttmp ++;\n            } else {\n                m_CountBSArray->Add(counttmp);\n                m_CountBSArray->Add(i);\n                counttmp = 1;\n                j++;\n                recttmp = info.m_CharBox;\n            }\n        }\n    }\n    m_CountBSArray->Add(counttmp);\n    j++;\n    return j;\n}\nvoid CRF_TextPage::GetBoundedSegment(int index, int& start, int& count) const\n{\n    if (!m_CountBSArray) {\n        return;\n    }\n    if(m_CountBSArray->GetSize() <= index * 2) {\n        start = 0;\n        count = 0;\n        return;\n    }\n    start = *(int *)m_CountBSArray->GetAt(index * 2);\n    count = *(int *)m_CountBSArray->GetAt(index * 2 + 1);\n}\n\nint CRF_TextPage::GetWordBreak(int index, int direction) const\n{\n    return -1;\n}\nCFX_WideString CRF_TextPage::GetPageText(int start, int nCount ) const\n{\n    if(nCount == -1) {\n        nCount = CountChars();\n        start = 0;\n    } else if(nCount < 1) {\n        return L\"\";\n    } else if(start >= CountChars()) {\n        return L\"\";\n    }\n    int i, index = start + nCount;\n    FPDF_CHAR_INFO info;\n    CFX_WideString str;\n    CFX_FloatRect recttmp;\n    FX_BOOL bstart = TRUE;\n    for(i = start; i < index; i++) {\n        GetCharInfo(i, info);\n        if(bstart) {\n            recttmp = info.m_CharBox;\n            str += info.m_Unicode;\n            bstart = FALSE;\n        } else if (_IsInsameline(recttmp, info.m_CharBox)) {\n            str += info.m_Unicode;\n        } else {\n            str += L\"\\r\\n\";\n            recttmp = info.m_CharBox;\n            str += info.m_Unicode;\n        }\n    }\n    if(str.IsEmpty()) {\n        return L\"\";\n    }\n    return str;\n}\n"
  },
  {
    "path": "core/src/reflow/reflowedtextpage.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _REFLOWED_TEXT_PAGE_H\n#define _REFLOWED_TEXT_PAGE_H\n#include \"../../include/reflow/reflowengine.h\"\n#include \"../../src/reflow/reflowedpage.h\"\ntypedef CFX_SegmentedArray<CRF_CharData*> CRF_CharDataPtrArray;\ntypedef CFX_SegmentedArray<FX_INT32> CFX_CountBSINT32Array;\nclass CRF_TextPage : public IPDF_TextPage\n{\npublic:\n    CRF_TextPage(IPDF_ReflowedPage* pRefPage);\n\n    virtual ~CRF_TextPage() ;\n    FX_BOOL\t\t\tParseTextPage();\n    void\t\t\tNormalizeObjects(FX_BOOL bNormalize)\n    {\n        return;\n    };\n\n    FX_BOOL\t\t\tIsParsered() const;\npublic:\n\n    int CharIndexFromTextIndex(int TextIndex) const;\n\n    int TextIndexFromCharIndex(int CharIndex) const;\n\n\n    int\t\t\t\tCountChars() const;\n\n    virtual\tvoid\tGetCharInfo(int index, FPDF_CHAR_INFO & info) const;\n\n    void\t\t\tGetRectArray(int start, int nCount, CFX_RectArray& rectArray) const;\n\n\n    int\t\t\t\tGetIndexAtPos(CPDF_Point point, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const;\n\n    int\t\t\t\tGetIndexAtPos(FX_FLOAT x, FX_FLOAT y, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const;\n\n    virtual\tint\t\t\t\tGetOrderByDirection(int index, int direction) const;\n\n    CFX_WideString\tGetTextByRect(CFX_FloatRect rect) const;\n\n    void\t\t\tGetRectsArrayByRect(CFX_FloatRect rect, CFX_RectArray& resRectArray) const;\n\n\n    int\t\t\t\tCountRects(int start, int nCount);\n\n    virtual\tvoid\t\t\tGetRect(int rectIndex, FX_FLOAT& left, FX_FLOAT& top, FX_FLOAT& right, FX_FLOAT &bottom) const;\n    virtual\tFX_BOOL\t\t\tGetBaselineRotate(int rectIndex, int& Rotate);\n    virtual FX_BOOL\t\t\tGetBaselineRotate(CFX_FloatRect rect, int& Rotate);\n\n    virtual\tint\t\t\t\tCountBoundedSegments(FX_FLOAT left, FX_FLOAT top, FX_FLOAT right, FX_FLOAT bottom, FX_BOOL bContains = FALSE);\n\n    virtual\tvoid\t\t\tGetBoundedSegment(int index, int& start, int& count) const;\n\n\n    int\t\t\t\tGetWordBreak(int index, int direction) const;\n\n    CFX_WideString\tGetPageText(int start, int nCount = -1 ) const;\nprivate:\n    CPDF_ReflowedPage*\t\tm_pRefPage;\n    CRF_CharDataPtrArray*\tm_pDataList;\n    CFX_RectArray\t\t\tm_rectArray;\n    CFX_CountBSINT32Array*\tm_CountBSArray;\n};\n#endif\n"
  },
  {
    "path": "core/src/reflow/reflowengine.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/reflow/reflowengine.h\"\n#include \"reflowedpage.h\"\nIPDF_ReflowedPage* IPDF_ReflowedPage::Create()\n{\n    CPDF_ReflowedPage* pRefPage = FX_NEW CPDF_ReflowedPage(NULL);\n    return pRefPage;\n}\nIPDF_ReflowedPage* Create_ReflowPage()\n{\n    return IPDF_ReflowedPage::Create();\n}\nIPDF_ProgressiveReflowPageParser* Create_ReflowPageParser()\n{\n    return IPDF_ProgressiveReflowPageParser::Create();\n}\nIPDF_ProgressiveReflowPageParser* IPDF_ProgressiveReflowPageParser::Create()\n{\n    CPDF_ProgressiveReflowPageParser* pParser = FX_NEW CPDF_ProgressiveReflowPageParser;\n    if (NULL == pParser) {\n        return NULL;\n    }\n    pParser->Init();\n    return pParser;\n}\nIPDF_ProgressiveReflowPageRender* Create_ReflowPageRender()\n{\n    return IPDF_ProgressiveReflowPageRender::Create();\n}\nIPDF_ProgressiveReflowPageRender* IPDF_ProgressiveReflowPageRender::Create()\n{\n    return FX_NEW CPDF_ProgressiveReflowPageRender;\n}\n"
  },
  {
    "path": "fpdfsdk/include/formfiller/FFL_CBA_Fontmap.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _RAO_FONTMAP_H_\n#define _RAO_FONTMAP_H_\n\n#if _MSC_VER > 1000\n#pragma once\n#endif // _MSC_VER > 1000\n\nclass CPDFSDK_Annot;\n\nclass CBA_FontMap : public CPWL_FontMap\n{\npublic:\n\tCBA_FontMap(CPDFSDK_Annot* pAnnot, IFX_SystemHandler* pSystemHandler);\n\tCBA_FontMap(CPDF_Document* pDocument, CPDF_Dictionary* pAnnotDict, IFX_SystemHandler* pSystemHandler);\n\n\tvirtual ~CBA_FontMap();\n\n\tvirtual void\t\t\t\tInitial(FX_LPCSTR fontname = NULL);\n\npublic:\n\tvoid\t\t\t\t\t\tSetDefaultFont(CPDF_Font * pFont, const CFX_ByteString & sFontName);\n\n\tvoid\t\t\t\t\t\tReset();\n\tvoid\t\t\t\t\t\tSetAPType(const CFX_ByteString& sAPType);\n\nprotected:\n\tvirtual CPDF_Font*\t\t\tFindFontSameCharset(CFX_ByteString& sFontAlias, FX_INT32 nCharset);\n\tvirtual void\t\t\t\tAddedFont(CPDF_Font* pFont, const CFX_ByteString& sFontAlias);\n\tvirtual CPDF_Document*\t\tGetDocument();\nprivate:\n\tCPDF_Font*\t\t\t\t\tFindResFontSameCharset(CPDF_Dictionary* pResDict, CFX_ByteString& sFontAlias,\n\t\t\t\t\t\t\t\t\tFX_INT32 nCharset);\n\tCPDF_Font*\t\t\t\t\tGetAnnotDefaultFont(CFX_ByteString &csNameTag);\n\tvoid\t\t\t\t\t\tAddFontToAnnotDict(CPDF_Font* pFont, const CFX_ByteString& sAlias);\n\nprivate:\n\tCPDF_Document*\t\t\t\tm_pDocument;\n\tCPDF_Dictionary*\t\t\tm_pAnnotDict;\n\tCPDF_Font*\t\t\t\t\tm_pDefaultFont;\n\tCFX_ByteString\t\t\t\tm_sDefaultFontName;\n\t\n\tCFX_ByteString\t\t\t\tm_sAPType;\n};\n\n#endif // _RAO_FONTMAP_H_\n"
  },
  {
    "path": "fpdfsdk/include/formfiller/FFL_CheckBox.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FFL_CHECKBOX_H_\n#define _FFL_CHECKBOX_H_\n\nclass CFFL_CheckBox : public CFFL_Button\n{\npublic:\n\tCFFL_CheckBox(CPDFDoc_Environment* pApp, CPDFSDK_Widget* pWidget);\n\tvirtual ~CFFL_CheckBox();\n\n\tvirtual CPWL_Wnd*\t\t\tNewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView);\n\n\tvirtual FX_BOOL\t\t\t\tOnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags);\n\tvirtual FX_BOOL\t\t\t\tOnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);\n\tvirtual FX_BOOL\t\t\t\tOnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);\n\n\tvirtual FX_BOOL\t\t\t\tIsDataChanged(CPDFSDK_PageView* pPageView);\n\tvirtual void\t\t\t\tSaveData(CPDFSDK_PageView* pPageView);\n};\n\n#endif //_FFL_CHECKBOX_H_\n\n"
  },
  {
    "path": "fpdfsdk/include/formfiller/FFL_ComboBox.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FFL_COMBOBOX_H_\n #define _FFL_COMBOBOX_H_\n\nstruct FFL_ComboBoxState\n{\n\tint nIndex;\n\tint nStart;\n\tint nEnd;\n\tCFX_WideString sValue;\n};\nclass CBA_FontMap;\n\nclass CFFL_ComboBox : public CFFL_FormFiller, public IPWL_FocusHandler, public IPWL_Edit_Notify\n{\npublic:\n\tCFFL_ComboBox(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget);\n\tvirtual ~CFFL_ComboBox();\n\t\n\tvirtual\tPWL_CREATEPARAM\t\tGetCreateParam();\n\tvirtual CPWL_Wnd*\t\t\tNewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView);\n\n\t\n\tvirtual FX_BOOL\t\t\t\tOnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);\n\t\n\tvirtual FX_BOOL\t\t\t\tIsDataChanged(CPDFSDK_PageView* pPageView);\n\tvirtual void\t\t\t\tSaveData(CPDFSDK_PageView* pPageView);\n\t\n \tvirtual void\t\t\t\tGetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type, PDFSDK_FieldAction& fa);\n \tvirtual void\t\t\t\tSetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type, const PDFSDK_FieldAction& fa);\n \tvirtual FX_BOOL\t\t\t\tIsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld, const PDFSDK_FieldAction& faNew);\n\tvirtual void\t\t\t\tSaveState(CPDFSDK_PageView* pPageView);\n\tvirtual void\t\t\t\tRestoreState(CPDFSDK_PageView* pPageView);\n\t\n\tvirtual CPWL_Wnd*\t\t\tResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue);\n\tvirtual void\t\t\t\tOnKeyStroke(FX_BOOL bKeyDown, FX_UINT nFlag);\n\t\npublic:\n\tvirtual void\t\t\t\tOnSetFocus(CPWL_Wnd* pWnd);\n\tvirtual void\t\t\t\tOnKillFocus(CPWL_Wnd* pWnd);\n\t\npublic:\n\tvirtual void\t\t\t\tOnAddUndo(CPWL_Edit* pEdit);\n\t\npublic:\n\tvirtual FX_BOOL\t\t\t\tCanCopy(CPDFSDK_Document* pDocument); \n\tvirtual FX_BOOL\t\t\t\tCanCut(CPDFSDK_Document* pDocument); \n\tvirtual FX_BOOL\t\t\t\tCanPaste(CPDFSDK_Document* pDocument); \n\t\n\tvirtual void\t\t\t\tDoCopy(CPDFSDK_Document* pDocument); \n\tvirtual void\t\t\t\tDoCut(CPDFSDK_Document* pDocument); \n\tvirtual void\t\t\t\tDoPaste(CPDFSDK_Document* pDocument); \n\t\nprivate:\n\tCFX_WideString\t\t\t\tGetSelectExportText();\n\nprivate:\n\tCBA_FontMap*\t\t\t\tm_pFontMap;\n\tFFL_ComboBoxState\t\t\t\tm_State;\n\t//CFFL_IM_BOX\t\t\t\t\tm_IMBox;\n};\n\n#endif //_FFL_COMBOBOX_H_\n\n"
  },
  {
    "path": "fpdfsdk/include/formfiller/FFL_FormFiller.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FFL_FORMFILLER_H_\n#define _FFL_FORMFILLER_H_\n\n#include \"FFL_IFormFiller.h\"\n#include \"FFL_CBA_Fontmap.h\"\n\nclass CPDFSDK_Annot;\nclass CFFL_FormFiller;\nclass CFFL_Notify;\nclass CPDFDoc_Environment;\nclass CPDFSDK_PageView;\nclass CPDFSDK_Document;\nclass CPDFSDK_Widget;\n\n\n#define CFFL_PageView2PDFWindow\t\tCFX_MapPtrTemplate<CPDFSDK_PageView*, CPWL_Wnd*>\n\nstruct FFL_KeyStrokeData\n{\n\tCFX_WideString\t\tswValue;\n\tFX_BOOL\t\t\t\tbFull;\n\tint\t\t\t\t\tnSelStart;\n\tint\t\t\t\t\tnSelEnd;\n};\n\n\n\nclass CFFL_FormFiller : /*public IBA_AnnotFiller,*/ public IPWL_Provider, public CPWL_TimerHandler\n{\npublic:\n\tCFFL_FormFiller(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot);\n\tvirtual ~CFFL_FormFiller();\n\n\tvirtual FX_RECT\t\t\t\tGetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot);\n\tvirtual void\t\t\t\tOnDraw(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot, \n\t\t\t\t\t\t\t\t\tCFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\t\t\t\t\t\t\t\t/*const CRect& rcWindow, */FX_DWORD dwFlags);\n\tvirtual void\t\t\t\tOnDrawDeactive(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot, \n\t\t\t\t\t\t\t\tCFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\t\t\t\t\t\t\t/*const CRect& rcWindow, */FX_DWORD dwFlags);\n\n\tvirtual void\t\t\t\tOnCreate(CPDFSDK_Annot* pAnnot);\n\tvirtual void\t\t\t\tOnLoad(CPDFSDK_Annot* pAnnot);\n\tvirtual void\t\t\t\tOnDelete(CPDFSDK_Annot* pAnnot);\n\n\tvirtual void\t\t\t\tOnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot);\n\tvirtual void\t\t\t\tOnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot);\n\n\tvirtual FX_BOOL\t\t\t\tOnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);\n\tvirtual FX_BOOL\t\t\t\tOnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);\n\tvirtual FX_BOOL\t\t\t\tOnLButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);\n\tvirtual FX_BOOL\t\t\t\tOnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);\n\tvirtual FX_BOOL\t\t\t\tOnMouseWheel(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, short zDelta, const CPDF_Point& point);\n\tvirtual FX_BOOL\t\t\t\tOnRButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);\n\tvirtual FX_BOOL\t\t\t\tOnRButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);\n\tvirtual FX_BOOL\t\t\t\tOnRButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);\n\n\tvirtual FX_BOOL\t\t\t\tOnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags);\n\tvirtual FX_BOOL\t\t\t\tOnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);\n\n\tvirtual\tvoid\t\t\t\tOnDeSelected(CPDFSDK_Annot* pAnnot);\n\tvirtual\tvoid\t\t\t\tOnSelected(CPDFSDK_Annot* pAnnot);\n\n\tvirtual FX_BOOL\t\t\t\tOnSetFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag);\n\tvirtual FX_BOOL\t\t\t\tOnKillFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag);\n\n\tvirtual FX_BOOL\t\t\t\tCanCopy(CPDFSDK_Document* pDocument); \n\tvirtual FX_BOOL\t\t\t\tCanCut(CPDFSDK_Document* pDocument); \n\tvirtual FX_BOOL\t\t\t\tCanPaste(CPDFSDK_Document* pDocument); \n\n\tvirtual void\t\t\t\tDoCopy(CPDFSDK_Document* pDocument); \n\tvirtual void\t\t\t\tDoCut(CPDFSDK_Document* pDocument); \n\tvirtual void\t\t\t\tDoPaste(CPDFSDK_Document* pDocument); \n\npublic: //CPWL_TimerHandler\n\tvirtual void\t\t\t\tTimerProc();\n\tvirtual IFX_SystemHandler*\tGetSystemHandler() const;\n\npublic:\n\tvirtual CPDF_Matrix\t\t\tGetWindowMatrix(void* pAttachedData);\n\tvirtual CFX_WideString\t\tLoadPopupMenuString(int nIndex);\n\n \tvirtual void\t\t\t\tGetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,\n \t\t\t\t\t\t\t\t\tPDFSDK_FieldAction& fa);\n \tvirtual void\t\t\t\tSetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type, \n \t\t\t\t\t\t\t\t\tconst PDFSDK_FieldAction& fa);\n \tvirtual FX_BOOL\t\t\t\tIsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld, \n \t\t\t\t\t\t\t\t\tconst PDFSDK_FieldAction& faNew);\n\n\tvirtual void\t\t\t\tSaveState(CPDFSDK_PageView* pPageView);\n\tvirtual void\t\t\t\tRestoreState(CPDFSDK_PageView* pPageView);\n\n\tvirtual CPWL_Wnd* \t\t\tResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue);\n\n\tvirtual void\t\t\t\tOnKeyStroke(FX_BOOL bKeyDown);\n\n\tCPDF_Matrix\t\t\t\t\tGetCurMatrix();\n\n\tCPDF_Rect\t\t\t\t\tFFLtoPWL(const CPDF_Rect& rect);\n\tCPDF_Rect\t\t\t\t\tPWLtoFFL(const CPDF_Rect& rect);\n\tCPDF_Point\t\t\t\t\tFFLtoPWL(const CPDF_Point& point);\n\tCPDF_Point\t\t\t\t\tPWLtoFFL(const CPDF_Point& point);\n\n\tCPDF_Point\t\t\t\t\tWndtoPWL(CPDFSDK_PageView* pPageView, const CPDF_Point& pt);\n\tCPDF_Rect\t\t\t\t\tFFLtoWnd(CPDFSDK_PageView* pPageView, const CPDF_Rect& rect);\n\n\tvoid\t\t\t\t\t\tSetWindowRect(CPDFSDK_PageView* pPageView, const CPDF_Rect& rcWindow);\n\tCPDF_Rect\t\t\t\t\tGetWindowRect(CPDFSDK_PageView* pPageView);\n\n\tstatic void\t\t\t\t\tFFL_FreeData(void* pData);\n\n\tFX_BOOL\t\t\t\t\t\tCommitData(CPDFSDK_PageView* pPageView, FX_UINT nFlag);\n\tvirtual FX_BOOL\t\t\t\tIsDataChanged(CPDFSDK_PageView* pPageView);\n\tvirtual void\t\t\t\tSaveData(CPDFSDK_PageView* pPageView);\n\n\tvirtual void\t\t\t\tGetKeyStrokeData(CPDFSDK_PageView* pPageView, FFL_KeyStrokeData& data);\n\npublic:\n\tCPWL_Wnd*\t\t\t\t\tGetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bNew);\n\tvoid\t\t\t\t\t\tDestroyPDFWindow(CPDFSDK_PageView* pPageView);\n\tvoid\t\t\t\t\t\tEscapeFiller(CPDFSDK_PageView* pPageView, FX_BOOL bDestroyPDFWindow);\n\n\tvirtual\tPWL_CREATEPARAM\t\tGetCreateParam();\n\tvirtual CPWL_Wnd*\t\t\tNewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView) = 0;\n\tvirtual CPDF_Rect\t\t\tGetFocusBox(CPDFSDK_PageView* pPageView);\n\npublic:\n\tFX_BOOL\t\t\t\t\t\tIsValid() const;\n\tCPDF_Rect\t\t\t\t\tGetPDFWindowRect() const;\n\n\tCPDFSDK_PageView*\t\t\tGetCurPageView();\n\tvoid\t\t\t\t\t\tSetChangeMark();\n\n\tvirtual void\t\t\t\tInvalidateRect(double left, double top, double right, double bottom);\n\tCPDFDoc_Environment*\t\tGetApp(){return m_pApp;}\n\tCPDFSDK_Annot*\t\t\t\tGetSDKAnnot() {return m_pAnnot;}\t\nprotected:\n\tCPDFDoc_Environment*\t\tm_pApp;\n\tCPDFSDK_Widget*\t\t\t\tm_pWidget;\n\tCPDFSDK_Annot*\t\t\t\tm_pAnnot;\n\n\tFX_BOOL\t\t\t\t\t\tm_bValid;\n\tCFFL_PageView2PDFWindow\t\tm_Maps;\n\tCPDF_Point\t\t\t\t\tm_ptOldPos;\n};\n\nclass CFFL_Button : public CFFL_FormFiller\n{\npublic:\n\tCFFL_Button(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget);\n\tvirtual ~CFFL_Button();\n\n\tvirtual void\t\t\t\tOnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot);\n\tvirtual void\t\t\t\tOnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot);\n\tvirtual FX_BOOL\t\t\t\tOnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);\n\tvirtual FX_BOOL\t\t\t\tOnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);\n\tvirtual FX_BOOL\t\t\t\tOnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);\n\tvirtual void\t\t\t\tOnDraw(CPDFSDK_PageView *pPageView/*, HDC hDC*/, CPDFSDK_Annot* pAnnot, \n\t\t\t\t\t\t\t\tCFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\t\t\t\t\t\t\t/*const CRect& rcWindow,*/ FX_DWORD dwFlags);\n\n\tvirtual\tvoid\t\t\t\tOnDrawDeactive(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot, \n\t\t\t\t\t\t\t\tCFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\t\t\t\t\t\t\t/*const CRect& rcWindow, */FX_DWORD dwFlags);\nprotected:\n\tFX_BOOL\t\t\t\t\t\tm_bMouseIn;\n\tFX_BOOL\t\t\t\t\t\tm_bMouseDown;\n};\n\n//#define CFFL_IM_BOX\t\t\t\tCFX_ArrayTemplate<CBA_EditInput*>\n\n#endif\n"
  },
  {
    "path": "fpdfsdk/include/formfiller/FFL_IFormFiller.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FFL_IFORMFILLER_H_\n#define _FFL_IFORMFILLER_H_\n\n#include \"FormFiller.h\"\nclass CFFL_FormFiller;\nclass CFFL_PrivateData;\n\n#define CFFL_Widget2Filler\t\tCFX_MapPtrTemplate<CPDFSDK_Annot*, CFFL_FormFiller*>\n\n// #define IsALTpressed()\t\t\t(GetKeyState(VK_MENU) < 0)\n// #define IsCTRLpressed()\t\t\t(GetKeyState(VK_CONTROL) < 0)\n// #define IsSHIFTpressed()\t\t(GetKeyState(VK_SHIFT)&0x8000)\n// #define IsINSERTpressed()\t\t(GetKeyState(VK_INSERT) & 0x01)\t\n// #define VK_SHIFT          0x10\n// #define VK_CONTROL        0x11\n// #define VK_MENU           0x12\n// #define VK_RETURN         0x0D\n// #define VK_SPACE          0x20\n// #define VK_ESCAPE         0x1B\n\n\n\nclass CFFL_IFormFiller :/* public IBA_AnnotFiller, */public IPWL_Filler_Notify//, \n//\tpublic IUndo_EventHandler, public IClipboard_Handler\n{\npublic:\n\tCFFL_IFormFiller(CPDFDoc_Environment* pApp);\n\tvirtual ~CFFL_IFormFiller();\n\n\tvirtual FX_BOOL\t\t\t\tAnnot_HitTest(CPDFSDK_PageView* pPageView,CPDFSDK_Annot* pAnnot, CPDF_Point point);\n\tvirtual FX_RECT\t\t\t\tGetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot);\n\tvirtual void\t\t\t\tOnDraw(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot, \n\t\t\t\t\t\t\t\t\tCFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\t\t\t\t\t\t\t\t/*const CRect& rcWindow,*/ FX_DWORD dwFlags);\n\n\n\tvirtual void\t\t\t\tOnCreate(CPDFSDK_Annot* pAnnot);\n\tvirtual void\t\t\t\tOnLoad(CPDFSDK_Annot* pAnnot);\n\tvirtual void\t\t\t\tOnDelete(CPDFSDK_Annot* pAnnot);\n\n\tvirtual void\t\t\t\tOnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlag);\n\tvirtual void\t\t\t\tOnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlag);\n\n\tvirtual FX_BOOL\t\t\t\tOnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);\n\tvirtual FX_BOOL\t\t\t\tOnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);\n\tvirtual FX_BOOL\t\t\t\tOnLButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);\n\tvirtual FX_BOOL\t\t\t\tOnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);\n\tvirtual FX_BOOL\t\t\t\tOnMouseWheel(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, short zDelta, const CPDF_Point& point);\n\tvirtual FX_BOOL\t\t\t\tOnRButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);\n\tvirtual FX_BOOL\t\t\t\tOnRButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);\n\tvirtual FX_BOOL\t\t\t\tOnRButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);\n\n\tvirtual FX_BOOL\t\t\t\tOnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags);\n\tvirtual FX_BOOL\t\t\t\tOnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);\n\n\tvirtual\tvoid\t\t\t\tOnDeSelected(CPDFSDK_Annot* pAnnot);\n\tvirtual\tvoid\t\t\t\tOnSelected(CPDFSDK_Annot* pAnnot);\n\n\tvirtual FX_BOOL\t\t\t\tOnSetFocus(CPDFSDK_Annot* pAnnot,FX_UINT nFlag);\n\tvirtual FX_BOOL\t\t\t\tOnKillFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag);\n\npublic:\n\tvirtual void\t\t\t\tQueryWherePopup(void* pPrivateData, FX_FLOAT fPopupMin,FX_FLOAT fPopupMax, FX_INT32 & nRet, FX_FLOAT & fPopupRet);\n\tvirtual void\t\t\t\tOnBeforeKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_INT32 nKeyCode,\n\t\t\t\t\t\t\t\t\t\tCFX_WideString & strChange, const CFX_WideString& strChangeEx, \n\t\t\t\t\t\t\t\t\t\tint nSelStart, int nSelEnd,\n\t\t\t\t\t\t\t\t\t\tFX_BOOL bKeyDown, FX_BOOL & bRC, FX_BOOL & bExit, FX_DWORD nFlag);\n\tvirtual void\t\t\t\tOnAfterKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_BOOL & bExit, FX_DWORD nFlag) ;\n\n\tvirtual void\t\t\t\tOnSetWindowRect(void* pPrivateData, const CPDF_Rect & rcWindow);\n\tvirtual void\t\t\t\tOnKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_INT32 nKeyCode, CFX_WideString & strChange, \n\t\t\t\t\t\t\t\t\tconst CFX_WideString& strChangeEx, FX_BOOL bKeyDown, FX_BOOL & bRC, FX_BOOL & bExit);\n\npublic:\n\tvirtual void\t\t\t\tBeforeUndo(CPDFSDK_Document* pDocument);\n\tvirtual void\t\t\t\tBeforeRedo(CPDFSDK_Document* pDocument);\n\tvirtual void\t\t\t\tAfterUndo(CPDFSDK_Document* pDocument);\n\tvirtual void\t\t\t\tAfterRedo(CPDFSDK_Document* pDocument);\n\npublic:\n\tvirtual FX_BOOL\t\t\t\tCanCopy(CPDFSDK_Document* pDocument); \n\tvirtual FX_BOOL\t\t\t\tCanCut(CPDFSDK_Document* pDocument); \n\tvirtual FX_BOOL\t\t\t\tCanPaste(CPDFSDK_Document* pDocument); \n\n\tvirtual void\t\t\t\tDoCopy(CPDFSDK_Document* pDocument); \n\tvirtual void\t\t\t\tDoCut(CPDFSDK_Document* pDocument); \n\tvirtual void\t\t\t\tDoPaste(CPDFSDK_Document* pDocument); \n\npublic:\n\tCFFL_FormFiller*\t\t\tGetFormFiller(CPDFSDK_Annot* pAnnot, FX_BOOL bRegister);\n\tvoid\t\t\t\t\t\tRemoveFormFiller(CPDFSDK_Annot* pAnnot);\n\n\tstatic FX_BOOL\t\t\t\tIsVisible(CPDFSDK_Widget* pWidget);\n\tstatic FX_BOOL\t\t\t\tIsReadOnly(CPDFSDK_Widget* pWidget);\n\tstatic FX_BOOL\t\t\t\tIsFillingAllowed(CPDFSDK_Widget* pWidget);\n \tstatic FX_BOOL\t\t\t\tIsValidAnnot(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot);\n\n\tvoid\t\t\t\t\t\tOnKeyStrokeCommit(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bRC, FX_BOOL& bExit, FX_DWORD nFlag);\n\tvoid\t\t\t\t\t\tOnValidate(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bRC, FX_BOOL& bExit, FX_DWORD nFlag);\n\n\tvoid\t\t\t\t\t\tOnCalculate(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bExit, FX_DWORD nFlag);\n\tvoid\t\t\t\t\t\tOnFormat(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bExit, FX_DWORD nFlag);\n\tvoid\t\t\t\t\t\tOnButtonUp(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bReset, FX_BOOL& bExit,FX_UINT nFlag);\n// \tstatic LRESULT CALLBACK\t\tFFL_WndProc(\n// \t\t\t\t\t\t\t\t\t  int code,       // hook code\n// \t\t\t\t\t\t\t\t\t  WPARAM wParam,  // virtual-key code\n// \t\t\t\t\t\t\t\t\t  LPARAM lParam   // keystroke-message information\n// \t\t\t\t\t\t\t\t\t\t);\n// \tstatic MSG\t\t\t\t\tGetLastMessage();\n\tstatic int\t\t\t\t\tGetCommitKey();\n\tstatic FX_BOOL\t\t\t\tGetKeyDown();\n\n\npublic:\n// \tstatic MSG\t\t\t\t\tg_Msg;\n// \tstatic HHOOK\t\t\t\tm_hookSheet;\n\nprivate:\n\tvoid\t\t\t\t\t\tUnRegisterFormFiller(CPDFSDK_Annot* pAnnot);\n\tvoid\t\t\t\t\t\tSetFocusAnnotTab(CPDFSDK_Annot* pWidget, FX_BOOL bSameField, FX_BOOL bNext);\n\nprivate:\n\tCPDFDoc_Environment*\t\t\t\tm_pApp;\n\tCFFL_Widget2Filler\t\t\tm_Maps;\n\tFX_BOOL\t\t\t\t\t\tm_bNotifying;\n};\n\nclass CFFL_PrivateData\n{\npublic:\n\tCPDFSDK_Widget*\t\t\tpWidget;\n\tCPDFSDK_PageView*\tpPageView;\n\tint\t\t\t\t\tnWidgetAge;\n\tint\t\t\t\t\tnValueAge;\n};\n\n#endif //_FFL_IFORMFILLER_H_\n\n"
  },
  {
    "path": "fpdfsdk/include/formfiller/FFL_ListBox.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FFL_LISTBOX_H_\n#define _FFL_LISTBOX_H_\n\nclass  CBA_FontMap;\nclass CFFL_ListBox : public CFFL_FormFiller\n{\npublic:\n\tCFFL_ListBox(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget);\n\tvirtual ~CFFL_ListBox();\n\n\tvirtual\tPWL_CREATEPARAM\t\tGetCreateParam();\n\tvirtual CPWL_Wnd*\t\t\tNewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView);\n\n\tvirtual FX_BOOL\t\t\t\tOnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);\n\n\tvirtual FX_BOOL\t\t\t\tIsDataChanged(CPDFSDK_PageView* pPageView);\n\tvirtual void\t\t\t\tSaveData(CPDFSDK_PageView* pPageView);\n\n \tvirtual void\t\t\t\tGetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,\n \t\t\t\t\t\t\t\t\tPDFSDK_FieldAction& fa);\n \tvirtual void\t\t\t\tSetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type, \n \t\t\t\t\t\t\t\t\tconst PDFSDK_FieldAction& fa);\n\n\tvirtual void\t\t\t\tSaveState(CPDFSDK_PageView* pPageView);\n\tvirtual void\t\t\t\tRestoreState(CPDFSDK_PageView* pPageView);\n\n\tvirtual CPWL_Wnd*\t\t\tResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue);\n\tvirtual void\t\t\t\tOnKeyStroke(FX_BOOL bKeyDown, FX_DWORD nFlag);\n\nprivate:\n\tCBA_FontMap*\t\t\t\t\tm_pFontMap;\n\tCFX_MapPtrTemplate<int, void*>\tm_OriginSelections;\n\tCFX_ArrayTemplate<int>\t\t\tm_State;\n};\n\n\n#endif //_FFL_LISTBOX_H_\n\n"
  },
  {
    "path": "fpdfsdk/include/formfiller/FFL_Notify.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#if !defined(_FFL_NOTIFY_H_)\n#define _FFL_NOTIFY_H_\n\nclass CFFL_FormFiller;\n\nclass CFFL_Notify\n{\npublic:\n\tCFFL_Notify(CFFL_FormFiller * pFormFiller);\t\n\tvirtual ~CFFL_Notify();\n\npublic:\n\tFX_BOOL\t\t\t\t\t\t\t\t\tOnSetFocus(FX_BOOL & bExit);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tOnMouseEnter(FX_BOOL & bExit);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tOnMouseDown(FX_BOOL & bExit);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tOnMouseUp(FX_BOOL & bExit);\t\n\tFX_BOOL\t\t\t\t\t\t\t\t\tOnMouseExit(FX_BOOL & bExit);\t\n\tFX_BOOL\t\t\t\t\t\t\t\t\tOnKillFocus(FX_BOOL & bExit);\n\n\tFX_BOOL\t\t\t\t\t\t\t\t\tOnCalculate();\n\tFX_BOOL\t\t\t\t\t\t\t\t\tOnFormat(int iCommitKey);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tOnValidate(CPDF_FormField* pFormField, CFX_WideString& strValue, CFX_WideString & strChange, \n\t\t\t\t\t\t\t\t\t\t\t   const CFX_WideString& strChangeEx, FX_BOOL bKeyDown, FX_BOOL bModifier,\n\t\t\t\t\t\t\t\t\t\t\t   FX_BOOL bShift, FX_BOOL & bRC);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tOnKeyStroke(CPDF_FormField* pFormField, int nCommitKey, CFX_WideString& strValue, CFX_WideString& strChange, \n\t\t\t\t\t\t\t\t\t\t\t   const CFX_WideString& strChangeEx, FX_BOOL bKeyDown, FX_BOOL bModifier,\n\t\t\t\t\t\t\t\t\t\t\t   FX_BOOL bShift, FX_BOOL bWillCommit, FX_BOOL bFieldFull, \n\t\t\t\t\t\t\t\t\t\t\t   int& nSelStart, int& nSelEnd, FX_BOOL& bRC);\n\n\tvoid\t\t\t\t\t\t\t\t\tBeforeNotify();\n\tvoid\t\t\t\t\t\t\t\t\tAfterNotify();\n\tFX_BOOL\t\t\t\t\t\t\t\t\tIsNotifying() const {return m_nNotifyFlag > 0;}\n\nprivate:\n//\tCReader_InterForm *\t\t\t\t\t\tGetReaderInterForm();\n \tFX_BOOL\t\t\t\t\t\t\t\t\tDoAAction(CPDF_AAction::AActionType eAAT, FX_BOOL & bExit);\n \tFX_BOOL\t\t\t\t\t\t\t\t\tFindAAction(CPDF_AAction::AActionType eAAT,CPDF_Action & action);\n \tFX_BOOL\t\t\t\t\t\t\t\t\tFindAAction(CPDF_AAction aaction,CPDF_AAction::AActionType eAAT,CPDF_Action & action);\n \tFX_BOOL\t\t\t\t\t\t\t\t\tExecuteActionTree(CPDF_AAction::AActionType eAAT, CPDF_Action & action, FX_BOOL& bExit);\n \tFX_BOOL\t\t\t\t\t\t\t\t\tExecuteAction(CPDF_AAction::AActionType eAAT,CPDF_Action & action,FX_BOOL& bExit);\n\n\tCFFL_FormFiller *\t\t\t\t\t\tm_pFormFiller;\n\tFX_BOOL\t\t\t\t\t\t\t\t\tm_bDoActioning;\n\tFX_INT32\t\t\t\t\t\t\t\tm_nNotifyFlag;\n};\n\n#endif\n\n"
  },
  {
    "path": "fpdfsdk/include/formfiller/FFL_PushButton.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FFL_PUSHBUTTON_H_\n#define _FFL_PUSHBUTTON_H_\n\nclass CFFL_PushButton : public CFFL_Button\n{\npublic:\n\tCFFL_PushButton(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot);\n\tvirtual ~CFFL_PushButton();\n\n\tvirtual CPWL_Wnd*\t\t\tNewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView);\n\n\tvirtual FX_BOOL\t\t\t\tOnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);\n\tvirtual void\t\t\t\tOnDraw(CPDFSDK_PageView *pPageView,  CPDFSDK_Annot* pAnnot, \n\t\t\t\t\t\t\t\t\tCFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\t\t\t\t\t\t\t\tFX_DWORD dwFlags);\n};\n\n#endif //_FFL_PUSHBUTTON_H_\n\n"
  },
  {
    "path": "fpdfsdk/include/formfiller/FFL_RadioButton.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FFL_RADIOBUTTON_H_\n#define _FFL_RADIOBUTTON_H_\n\nclass CFFL_RadioButton : public CFFL_Button\n{\npublic:\n\tCFFL_RadioButton(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot);\n\tvirtual ~CFFL_RadioButton();\n\t\n\tvirtual CPWL_Wnd*\t\t\tNewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView);\n  \tvirtual FX_BOOL\t\t\t\tOnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags);\n\tvirtual FX_BOOL\t\t\t\tOnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);\n\tvirtual FX_BOOL\t\t\t\tOnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);\n\tvirtual FX_BOOL\t\t\t\tIsDataChanged(CPDFSDK_PageView* pPageView);\n\tvirtual void\t\t\t\tSaveData(CPDFSDK_PageView* pPageView);\n};\n\n#endif //_FFL_RADIOBUTTON_H_\n\n"
  },
  {
    "path": "fpdfsdk/include/formfiller/FFL_TextField.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#if !defined(AFX_FFL_EDIT_H__8E0C9456_CBA2_4EFB_9F31_53C6D8C1A8AC__INCLUDED_)\n#define AFX_FFL_EDIT_H__8E0C9456_CBA2_4EFB_9F31_53C6D8C1A8AC__INCLUDED_\n\n#include \"FFL_FormFiller.h\"\n\n#define BF_ALIGN_LEFT\t\t\t0\n#define BF_ALIGN_MIDDLE\t\t\t1\n#define BF_ALIGN_RIGHT\t\t\t2\n\nclass CBA_FontMap;\n\nclass CFFL_EditUndoItem //: public IUndoItem\n{\npublic:\n\tCFFL_EditUndoItem(CPWL_Edit* pEdit);\n\tvirtual ~CFFL_EditUndoItem();\n\t\n\tvirtual void\t\t\t\t\tUndo();\n\tvirtual void\t\t\t\t\tRedo();\n\tvirtual CFX_WideString\t\t\tGetDescr();\n\tvirtual void\t\t\t\t\tRelease();\n\t\nprivate:\n\tCPWL_Edit*\t\t\t\t\t\tm_pEdit;\n};\n\nstruct FFL_TextFieldState\n{\n\tint nStart;\n\tint nEnd;\n\tCFX_WideString sValue;\n};\n\nclass CFFL_TextField : public CFFL_FormFiller, public IPWL_FocusHandler, public IPWL_Edit_Notify\n{\npublic:\n\tCFFL_TextField(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot);\n\tvirtual ~CFFL_TextField();\n\t\n\tvirtual\tPWL_CREATEPARAM\t\tGetCreateParam();\n\tvirtual CPWL_Wnd*\t\t\tNewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView);\n\n\t\n\tvirtual FX_BOOL\t\t\t\tOnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);\n\t\n\tvirtual FX_BOOL\t\t\t\tIsDataChanged(CPDFSDK_PageView* pPageView);\n\tvirtual void\t\t\t\tSaveData(CPDFSDK_PageView* pPageView);\n\t\n \tvirtual void\t\t\t\tGetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,\n \t\t\t\t\t\t\t\t\t\t\t\tPDFSDK_FieldAction& fa);\n \tvirtual void\t\t\t\tSetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type, \n\t\t\t\t\t\t\t\t\tconst PDFSDK_FieldAction& fa);\n \tvirtual FX_BOOL\t\t\t\tIsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld, \n \t\t\t\t\t\t\t\t\t\t\t\tconst PDFSDK_FieldAction& faNew);\n\tvirtual void\t\t\t\tSaveState(CPDFSDK_PageView* pPageView);\n\tvirtual void\t\t\t\tRestoreState(CPDFSDK_PageView* pPageView);\n\t\n\tvirtual CPWL_Wnd*\t\t\tResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue);\n\t\npublic:\n\tvirtual void\t\t\t\tOnSetFocus(CPWL_Wnd* pWnd);\n\tvirtual void\t\t\t\tOnKillFocus(CPWL_Wnd* pWnd);\n\t\npublic:\n\tvirtual void\t\t\t\tOnAddUndo(CPWL_Edit* pEdit);\n\t\npublic:\n\tvirtual FX_BOOL\t\t\t\tCanCopy(CPDFSDK_Document* pDocument); \n\tvirtual FX_BOOL\t\t\t\tCanCut(CPDFSDK_Document* pDocument); \n\tvirtual FX_BOOL\t\t\t\tCanPaste(CPDFSDK_Document* pDocument); \n\t\n\tvirtual void\t\t\t\tDoCopy(CPDFSDK_Document* pDocument); \n\tvirtual void\t\t\t\tDoCut(CPDFSDK_Document* pDocument); \n\tvirtual void\t\t\t\tDoPaste(CPDFSDK_Document* pDocument); \n\t\nprivate:\n\tCBA_FontMap*\t\t\t\tm_pFontMap;\n//\tCBA_SpellCheck*\t\t\t\tm_pSpellCheck;\n\tFFL_TextFieldState\t\t\tm_State;\n//\tCFFL_IM_BOX\t\t\t\t\tm_IMBox;\n};\n\n#endif // !defined(AFX_FFL_EDIT_H__8E0C9456_CBA2_4EFB_9F31_53C6D8C1A8AC__INCLUDED_)\n"
  },
  {
    "path": "fpdfsdk/include/formfiller/FFL_Utils.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#define FFL_BASE_USERUNIT\t\t\t1.0f / 72.0f\n\ntemplate<class T> T FFL_MIN (const T & i, const T & j) { return ((i < j) ? i : j); }\ntemplate<class T> T FFL_MAX (const T & i, const T & j) { return ((i > j) ? i : j); }\n\nclass CFFL_Utils\n{\npublic:\n\tstatic CPDF_Rect\t\t\t\tMaxRect(const CPDF_Rect & rect1,const CPDF_Rect & rect2);\n\tstatic CPDF_Rect\t\t\t\tInflateRect(const CPDF_Rect & crRect, const FX_FLOAT & fSize);\n\tstatic CPDF_Rect\t\t\t\tDeflateRect(const CPDF_Rect & crRect, const FX_FLOAT & fSize);\n\tstatic FX_BOOL\t\t\t\t\tTraceObject(CPDF_Object* pObj);\n};\n\n"
  },
  {
    "path": "fpdfsdk/include/formfiller/FormFiller.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FORMFILLER_H_\n#define _FORMFILLER_H_\n\n\n\n#ifndef _INC_PDFAPI\n\t#define _INC_PDFAPI\n\n\t#include \"../../../core/include/fpdfapi/fpdf_module.h\" \n\t#include \"../../../core/include/fpdfdoc/fpdf_doc.h\" \n\t#include \"../../../core/include/fpdfdoc/fpdf_vt.h\" \n\t#include \"../../../core/include/fxcrt/fx_xml.h\" \n\n#endif\n\n#include \"../fsdk_mgr.h\"\n\n#include \"../fxedit/fx_edit.h\"\n#include \"../pdfwindow/IPDFWindow.h\"\n\n\n\n#endif //_FORMFILLER_H_\n\n"
  },
  {
    "path": "fpdfsdk/include/fpdf_dataavail.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDF_DATAAVAIL_H_\n#define _FPDF_DATAAVAIL_H_\n\n#ifndef _FPDFVIEW_H_\n#include \"fpdfview.h\"\n#endif\n\n\n/** The result of the process which check linearized PDF. */\n#define FSDK_IS_LINEARIZED\t\t\t1\n#define FSDK_NOT_LINEARIZED\t\t\t0\n#define FSDK_UNKNOW_LINEARIZED\t\t-1\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * Interface: FX_FILEAVAIL\n *\t\t\tInterface for checking whether the section of the file is available. \n */\ntypedef struct _FX_FILEAVAIL {\n\t/**\n\t * Version number of the interface. Currently must be 1.\n\t */\n\tint version;\n\n\t/**\n\t * Method: IsDataAvail\n\t *\t\tReport whether the specified data section is available. A section is available only if all bytes in the section is available. \n\t * Interface Version:\n\t *\t\t1\n\t * Implementation Required:\n\t *\t\tYes\n\t * Parameters:\n\t *\t\tpThis\t\t-\tPointer to the interface structure itself.\n\t *\t\toffset\t\t-\tThe offset of the data section in the file.\n\t *\t\tsize\t\t-\tThe size of the data section\n\t * Return Value:\n\t *\t\ttrue means the specified data section is available.\n\t * Comments:\n\t *\t\tCalled by Foxit SDK to check whether the data section is ready.\n\t */\n\tbool (*IsDataAvail)(struct _FX_FILEAVAIL* pThis, size_t offset, size_t size);\n} FX_FILEAVAIL;\n\ntypedef void* FPDF_AVAIL;\n\n/**\n* Function: FPDFAvail_Create\n*\t\t\tCreate a document availability provider.\n*\n* Parameters: \n*\t\t\tfile_avail\t-\tPointer to file availability interface to check availability of file data.\n*\t\t\tfile\t\t-\tPointer to a file access interface for reading data from file.\n* Return value:\n*\t\t\tA handle to the document availability provider. NULL for error.\n* Comments:\n*\t\t\tApplication must call FPDFAvail_Destroy when done with the availability provider.\n*/\nDLLEXPORT FPDF_AVAIL STDCALL FPDFAvail_Create(FX_FILEAVAIL* file_avail, FPDF_FILEACCESS* file);\n\n/**\n* Function: FPDFAvail_Destroy\n*\t\t\tDestroy a document availibity provider.\n*\n* Parameters: \n*\t\t\tavail\t\t-\tHandle to document availability provider returned by FPDFAvail_Create\n* Return Value:\n*\t\t\tNone.\n*/\nDLLEXPORT void STDCALL FPDFAvail_Destroy(FPDF_AVAIL avail);\n\n/**\n * Interface: FX_DOWNLOADHINTS\n *\t\t\tDownload hints interface. Used to receive hints for further downloading.\n */\ntypedef struct _FX_DOWNLOADHINTS {\n\t/**\n\t * Version number of the interface. Currently must be 1.\n\t */\n\tint version;\n\n\t/**\n\t * Method: AddSegment\n\t *\t\tAdd a section to be downloaded.\n\t * Interface Version:\n\t *\t\t1\n\t * Implementation Required:\n\t *\t\tYes\n\t * Parameters:\n\t *\t\tpThis\t\t-\tPointer to the interface structure itself.\n\t *\t\toffset\t\t-\tThe offset of the hint reported to be downloaded.\n\t *\t\tsize\t\t-\tThe size of the hint reported to be downloaded.\n\t * Return Value:\n\t *\t\tNone.\n\t * Comments:\n\t *\t\tCalled by Foxit SDK to report some downloading hints for download manager.\n\t *\t\tThe position and size of section may be not accurate, part of the section might be already available. \n\t *\t\tThe download manager must deal with that to maximize download efficiency.\n\t */\n\tvoid (*AddSegment)(struct _FX_DOWNLOADHINTS* pThis, size_t offset, size_t size);\n} FX_DOWNLOADHINTS;\n\n/**\n* Function: FPDFAvail_IsDocAvail\n*\t\t\tCheck whether the document is ready for loading, if not, get download hints.\n*\n* Parameters: \n*\t\t\tavail\t\t-\tHandle to document availability provider returned by FPDFAvail_Create\n*\t\t\thints\t\t-\tPointer to a download hints interface, receiving generated hints\n* Return value:\n*\t\t\tNon-zero for page is fully available, 0 for page not yet available.\n* Comments:\n*\t\t\tThe application should call this function whenever new data arrived, and process all the\n*\t\t\tgenerated download hints if any, until the function returns non-zero value. Then the \n*\t\t\tapplication can call FPDFAvail_GetDocument() to get a document handle.\n*/\nDLLEXPORT int STDCALL FPDFAvail_IsDocAvail(FPDF_AVAIL avail, FX_DOWNLOADHINTS* hints);\n\n/**\n* Function: FPDFAvail_GetDocument\n*\t\t\tGet document from the availability provider.\n*\n* Parameters:\n*\t\t\tavail\t\t-\tHandle to document availability provider returned by FPDFAvail_Create\n*     password\t-\tOptional password for decrypting the PDF file.\n* Return value:\n*\t\t\tHandle to the document.\n* Comments:\n*\t\t\tAfter FPDFAvail_IsDocAvail() returns TRUE, the application should call this function to\n*\t\t\tget the document handle. To close the document, use FPDF_CloseDocument function.\n*/\nDLLEXPORT FPDF_DOCUMENT STDCALL FPDFAvail_GetDocument(FPDF_AVAIL avail,\n                                                      FPDF_BYTESTRING password);\n\n/**\n* Function: FPDFAvail_GetFirstPageNum\n*\t\t\tGet page number for the first available page in a linearized PDF\n*\n* Parameters:\n*\t\t\tdoc\t\t\t-\tA document handle returned by FPDFAvail_GetDocument\n* Return Value:\n*\t\t\tZero-based index for the first available page.\n* Comments:\n*\t\t\tFor most linearized PDFs, the first available page would be just the first page, however,\n*\t\t\tsome PDFs might make other page to be the first available page.\n*\t\t\tFor non-linearized PDF, this function will always return zero.\n*/\nDLLEXPORT int STDCALL FPDFAvail_GetFirstPageNum(FPDF_DOCUMENT doc);\n\n/**\n* Function: FPDFAvail_IsPageAvail\n*\t\t\tCheck whether a page is ready for loading, if not, get download hints.\n*\n* Parameters: \n*\t\t\tavail\t\t-\tHandle to document availability provider returned by FPDFAvail_Create\n*\t\t\tpage_index\t-\tIndex number of the page. 0 for the first page.\n*\t\t\thints\t\t-\tPointer to a download hints interface, receiving generated hints\n* Return value:\n*\t\t\tNon-zero for page is fully available, 0 for page not yet available.\n* Comments:\n*\t\t\tThis function call be called only after FPDFAvail_GetDocument if called.\n*\t\t\tThe application should call this function whenever new data arrived, and process all the\n*\t\t\tgenerated download hints if any, until the function returns non-zero value. Then the \n*\t\t\tapplication can perform page loading.\n*/\nDLLEXPORT int STDCALL FPDFAvail_IsPageAvail(FPDF_AVAIL avail, int page_index, FX_DOWNLOADHINTS* hints);\n\n/**\n* Function: FPDFAvail_ISFormAvail\n*\t\t\tCheck whether Form data is ready for init, if not, get download hints.\n*\n* Parameters: \n*\t\t\tavail\t\t-\tHandle to document availability provider returned by FPDFAvail_Create\n*\t\t\thints\t\t-\tPointer to a download hints interface, receiving generated hints\n* Return value:\n*\t\t\tNon-zero for Form data is fully available, 0 for Form data not yet available.\n*\t\t\tDetails: -1 - error, the input parameter not correct, such as hints is null.\n*\t\t\t\t\t 0  - data not available\n*\t\t\t\t\t 1  - data available\n*\t\t\t\t\t 2  - no form data.\t\t\t\t\n* Comments:\n*\t\t\tThis function call be called only after FPDFAvail_GetDocument if called. \n*\t\t\tThe application should call this function whenever new data arrived, and process all the\n*\t\t\tgenerated download hints if any, until the function returns non-zero value. Then the \n*\t\t\tapplication can perform page loading. Recommend to call FPDFDOC_InitFormFillEnviroument\n*\t\t\tafter the function returns non-zero value.\n*/\nDLLEXPORT int STDCALL FPDFAvail_IsFormAvail(FPDF_AVAIL avail, FX_DOWNLOADHINTS* hints);\n\n/**\n* Function: FPDFAvail_IsLinearized\n*\t\t\tTo check whether a document is Linearized PDF file.\n*\n* Parameters:\n*\t\t\tavail\t\t-\tHandle to document availability provider returned by FPDFAvail_Create\n* Return value:\n*\t\t\treturn TRUE means the document is linearized PDF else not.\n*\t\t\tFSDK_IS_LINEARIZED is a linearize file.\n*\t\t\tFSDK_NOT_LINEARIZED is not a linearize file.\n*\t\t\tFSDK_UNKNOW_LINEARIZED don't know whether the file is a linearize file.\n* Comments:\n*\t\t\tIt return TRUE/FALSE as soon as we have first 1K data. \tIf the file's size less than\n*\t\t\t1K,we don't known whether the PDF is a linearized file.\n*\n*/\nDLLEXPORT FPDF_BOOL STDCALL FPDFAvail_IsLinearized(FPDF_AVAIL avail);\n\n#ifdef __cplusplus\n};\n#endif\n\n#endif\n\n"
  },
  {
    "path": "fpdfsdk/include/fpdf_ext.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDF_EXT_H_\n#define _FPDF_EXT_H_\n\n#ifndef _FPDFVIEW_H_\n#include \"fpdfview.h\"\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//flags for type of unsupport object.\n#define FPDF_UNSP_DOC_XFAFORM\t\t\t\t1\n#define FPDF_UNSP_DOC_PORTABLECOLLECTION\t2\n#define FPDF_UNSP_DOC_ATTACHMENT\t\t\t3\n#define FPDF_UNSP_DOC_SECURITY\t\t\t\t4\n#define FPDF_UNSP_DOC_SHAREDREVIEW\t\t\t5\n#define FPDF_UNSP_DOC_SHAREDFORM_ACROBAT\t6\n#define FPDF_UNSP_DOC_SHAREDFORM_FILESYSTEM\t7\n#define FPDF_UNSP_DOC_SHAREDFORM_EMAIL\t\t8\n#define FPDF_UNSP_ANNOT_3DANNOT\t\t\t\t11\n#define FPDF_UNSP_ANNOT_MOVIE\t\t\t\t12\n#define FPDF_UNSP_ANNOT_SOUND\t\t\t\t13\n#define FPDF_UNSP_ANNOT_SCREEN_MEDIA\t\t14\n#define FPDF_UNSP_ANNOT_SCREEN_RICHMEDIA\t15\n#define FPDF_UNSP_ANNOT_ATTACHMENT\t\t\t16\n#define FPDF_UNSP_ANNOT_SIG\t\t\t\t\t17\n\ntypedef\tstruct _UNSUPPORT_INFO\n{\n\t/**\n\t* Version number of the interface. Currently must be 1.\n\t**/\n\tint version;\n\t\n\t/** \n\t* Method: FSDK_UnSupport_Handler\n\t*\t\t\t UnSupport Object process handling function.\n\t* Interface Version:\n\t*\t\t\t1\n\t* Implementation Required:\n\t*\t\t\tYes\n\t* Parameters:\n\t*\t\tpThis\t\t-\tPointer to the interface structure itself.\n\t*\t\tnType\t\t-\tThe type of unsupportObject\n\t* \tReturn value:\n\t* \t\tNone.\n\t* */\n\n\tvoid(*FSDK_UnSupport_Handler)(_UNSUPPORT_INFO* pThis,int nType);\n}UNSUPPORT_INFO;\n\n\n/**\n * Function: FSDK_SetUnSpObjProcessHandler\n *\t\t\t Setup A UnSupport Object process handler for foxit sdk. \n * Parameters:\n *\t\t\tunsp_info\t\t-\tPointer to a UNSUPPORT_INFO structure.\n * Return Value:\n *\t\t\tTRUE means successful. FALSE means fails. \n **/\n\nDLLEXPORT FPDF_BOOL STDCALL FSDK_SetUnSpObjProcessHandler(UNSUPPORT_INFO* unsp_info);\n\n//flags for page mode. \n\n//Unknown value\n#define PAGEMODE_UNKNOWN\t\t-1\n\n//Neither document outline nor thumbnail images visible\n#define PAGEMODE_USENONE\t\t0\n\n//Document outline visible\n#define PAGEMODE_USEOUTLINES\t1\n\n//Thumbnial images visible\n#define PAGEMODE_USETHUMBS\t\t2\n\n//Full-screen mode, with no menu bar, window controls, or any other window visible\n#define PAGEMODE_FULLSCREEN\t\t3\n\n//Optional content group panel visible\n#define PAGEMODE_USEOC\t\t\t4\n\n//Attachments panel visible\n#define PAGEMODE_USEATTACHMENTS\t5\n\n\n/**\n * Function: FPDFDoc_GetPageMode\n *\t\t\t Get the document's PageMode(How the document should be displayed when opened) \n * Parameters:\n *\t\t\tdoc\t\t-\tHandle to document. Returned by FPDF_LoadDocument function.\n * Return Value:\n *\t\t\tThe flags for page mode.\n **/\nDLLEXPORT int FPDFDoc_GetPageMode(FPDF_DOCUMENT document);\n\n#ifdef __cplusplus\n};\n#endif\n#endif\n"
  },
  {
    "path": "fpdfsdk/include/fpdf_flatten.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDF_FLATTEN_H_\n#define _FPDF_FLATTEN_H_\n\t\n#include \"fpdfview.h\"\n\n#define FLATTEN_FAIL\t\t\t0\t// Flatten operation failed.\n#define FLATTEN_SUCCESS\t\t\t1\t// Flatten operation succeed.\n#define FLATTEN_NOTINGTODO\t\t2\t// There is nothing can be flatten.\n\t\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define FLAT_NORMALDISPLAY     0\n#define FLAT_PRINT             1    \n\t//Function: FPDFPage_Flatten\n\n\t//\t\t\tFlat a pdf page,annotations or form fields will become part of the page contents.\n\t//Parameters:\n\n\t//\t\t\tpage  - Handle to the page. Returned by FPDF_LoadPage function.\n\t//\t\t\tnFlag - the flag for the use of flatten result. Zero for normal display, 1 for print.\n\t//Return value:\n\t//\t\t\tThe result flag of the function, See flags above ( FLATTEN_FAIL, FLATTEN_SUCCESS, FLATTEN_NOTINGTODO ).\n\t//\n\t// Comments: Current version all fails return zero. If necessary we will assign different value\n\t//\t\t\tto indicate different fail reason.\n\t// \n\tDLLEXPORT int STDCALL FPDFPage_Flatten( FPDF_PAGE page, int nFlag);\n\t\t\n\t\t\n#ifdef __cplusplus\n};\n#endif\n\n#endif //_FPDF_FLATTEN_H_\n"
  },
  {
    "path": "fpdfsdk/include/fpdf_fwlevent.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FWL_EVENT_H\n#define _FWL_EVENT_H\n\n#include \"fpdfview.h\"\n\ntypedef int\t\t\tFPDF_INT32;\ntypedef unsigned int FPDF_UINT32;\ntypedef float\t\tFPDF_FLOAT;\n//event type\ntypedef enum\n{\n\tFWL_EVENTTYPE_Mouse = 0\t,\n\tFWL_EVENTTYPE_MouseWheel,\t\n\tFWL_EVENTTYPE_Key\t\t,\n} FWL_EVENTTYPE;\n\n//key flag\ntypedef enum\n{    \n\tFWL_EVENTFLAG_ShiftKey\t\t\t= 1 << 0,    \n\tFWL_EVENTFLAG_ControlKey\t\t= 1 << 1,\n    FWL_EVENTFLAG_AltKey\t\t\t= 1 << 2,\n    FWL_EVENTFLAG_MetaKey\t\t\t= 1 << 3,\n    FWL_EVENTFLAG_KeyPad\t\t\t= 1 << 4,\n    FWL_EVENTFLAG_AutoRepeat\t\t= 1 << 5,\n    FWL_EVENTFLAG_LeftButtonDown\t= 1 << 6,\n    FWL_EVENTFLAG_MiddleButtonDown\t= 1 << 7,\n    FWL_EVENTFLAG_RightButtonDown\t= 1 << 8, \n} FWL_EVENTFLAG;  \n\n// Mouse message command\ntypedef enum\n{\n\tFWL_EVENTMOUSECMD_LButtonDown =\t1\t,\t\n\tFWL_EVENTMOUSECMD_LButtonUp\t\t\t,\n\tFWL_EVENTMOUSECMD_LButtonDblClk\t\t,\n\tFWL_EVENTMOUSECMD_RButtonDown\t\t,\n\tFWL_EVENTMOUSECMD_RButtonUp\t\t\t,\n\tFWL_EVENTMOUSECMD_RButtonDblClk\t\t,\n\tFWL_EVENTMOUSECMD_MButtonDown\t\t,\n\tFWL_EVENTMOUSECMD_MButtonUp\t\t\t,\n\tFWL_EVENTMOUSECMD_MButtonDblClk\t\t,\n\tFWL_EVENTMOUSECMD_MouseMove\t\t\t,\n\tFWL_EVENTMOUSECMD_MouseEnter\t\t,\n\tFWL_EVENTMOUSECMD_MouseHover\t\t,\n\tFWL_EVENTMOUSECMD_MouseLeave\t\t,\n} FWL_EVENT_MOUSECMD;\n\n//mouse event\nstruct FWL_EVENT_MOUSE \n{\n\tFPDF_UINT32 command;\n\tFPDF_DWORD flag;\n\tFPDF_FLOAT x;\n\tFPDF_FLOAT y;\n};\n\n//mouse wheel\nstruct FWL_EVENT_MOUSEWHEEL \n{\t\n\tFPDF_DWORD flag;\n\tFPDF_FLOAT x;\n\tFPDF_FLOAT y;\n\tFPDF_FLOAT deltaX;\n    FPDF_FLOAT deltaY;  \n};\n\n//virtual keycode\ntypedef enum \n{\n  FWL_VKEY_Back\t\t= 0x08,\n  FWL_VKEY_Tab\t\t= 0x09,\n  FWL_VKEY_Clear\t= 0x0C,\n  FWL_VKEY_Return\t= 0x0D,\n  FWL_VKEY_Shift\t= 0x10,\n  FWL_VKEY_Control\t= 0x11,\n  FWL_VKEY_Menu\t\t= 0x12,\n  FWL_VKEY_Pause\t= 0x13,\n  FWL_VKEY_Capital\t= 0x14,\n  FWL_VKEY_Kana\t\t= 0x15,\n  FWL_VKEY_Hangul\t= 0x15,\n  FWL_VKEY_Junja\t= 0x17,\n  FWL_VKEY_Final\t= 0x18,\n  FWL_VKEY_Hanja\t= 0x19,\n  FWL_VKEY_Kanji\t= 0x19,\n  FWL_VKEY_Escape\t= 0x1B,\n  FWL_VKEY_Convert\t= 0x1C,\n  FWL_VKEY_NonConvert = 0x1D,\n  FWL_VKEY_Accept\t = 0x1E,\n  FWL_VKEY_ModeChange = 0x1F,\n  FWL_VKEY_Space = 0x20,\n  FWL_VKEY_Prior = 0x21,\n  FWL_VKEY_Next = 0x22,\n  FWL_VKEY_End = 0x23,\n  FWL_VKEY_Home = 0x24,\n  FWL_VKEY_Left = 0x25,\n  FWL_VKEY_Up = 0x26,\n  FWL_VKEY_Right = 0x27,\n  FWL_VKEY_Down = 0x28,\n  FWL_VKEY_Select = 0x29,\n  FWL_VKEY_Print = 0x2A,\n  FWL_VKEY_Execute = 0x2B,\n  FWL_VKEY_Snapshot = 0x2C,\n  FWL_VKEY_Insert = 0x2D,\n  FWL_VKEY_Delete = 0x2E,\n  FWL_VKEY_Help = 0x2F,\n  FWL_VKEY_0 = 0x30,\n  FWL_VKEY_1 = 0x31,\n  FWL_VKEY_2 = 0x32,\n  FWL_VKEY_3 = 0x33,\n  FWL_VKEY_4 = 0x34,\n  FWL_VKEY_5 = 0x35,\n  FWL_VKEY_6 = 0x36,\n  FWL_VKEY_7 = 0x37,\n  FWL_VKEY_8 = 0x38,\n  FWL_VKEY_9 = 0x39,\n  FWL_VKEY_A = 0x41,\n  FWL_VKEY_B = 0x42,\n  FWL_VKEY_C = 0x43,\n  FWL_VKEY_D = 0x44,\n  FWL_VKEY_E = 0x45,\n  FWL_VKEY_F = 0x46,\n  FWL_VKEY_G = 0x47,\n  FWL_VKEY_H = 0x48,\n  FWL_VKEY_I = 0x49,\n  FWL_VKEY_J = 0x4A,\n  FWL_VKEY_K = 0x4B,\n  FWL_VKEY_L = 0x4C,\n  FWL_VKEY_M = 0x4D,\n  FWL_VKEY_N = 0x4E,\n  FWL_VKEY_O = 0x4F,\n  FWL_VKEY_P = 0x50,\n  FWL_VKEY_Q = 0x51,\n  FWL_VKEY_R = 0x52,\n  FWL_VKEY_S = 0x53,\n  FWL_VKEY_T = 0x54,\n  FWL_VKEY_U = 0x55,\n  FWL_VKEY_V = 0x56,\n  FWL_VKEY_W = 0x57,\n  FWL_VKEY_X = 0x58,\n  FWL_VKEY_Y = 0x59,\n  FWL_VKEY_Z = 0x5A,\n  FWL_VKEY_LWin = 0x5B,\n  FWL_VKEY_Command = 0x5B,\n  FWL_VKEY_RWin = 0x5C,\n  FWL_VKEY_Apps = 0x5D,\n  FWL_VKEY_Sleep = 0x5F,\n  FWL_VKEY_NumPad0 = 0x60,\n  FWL_VKEY_NumPad1 = 0x61,\n  FWL_VKEY_NumPad2 = 0x62,\n  FWL_VKEY_NumPad3 = 0x63,\n  FWL_VKEY_NumPad4 = 0x64,\n  FWL_VKEY_NumPad5 = 0x65,\n  FWL_VKEY_NumPad6 = 0x66,\n  FWL_VKEY_NumPad7 = 0x67,\n  FWL_VKEY_NumPad8 = 0x68,\n  FWL_VKEY_NumPad9 = 0x69,\n  FWL_VKEY_Multiply = 0x6A,\n  FWL_VKEY_Add = 0x6B,\n  FWL_VKEY_Separator = 0x6C,\n  FWL_VKEY_Subtract = 0x6D,\n  FWL_VKEY_Decimal = 0x6E,\n  FWL_VKEY_Divide = 0x6F,\n  FWL_VKEY_F1 = 0x70,\n  FWL_VKEY_F2 = 0x71,\n  FWL_VKEY_F3 = 0x72,\n  FWL_VKEY_F4 = 0x73,\n  FWL_VKEY_F5 = 0x74,\n  FWL_VKEY_F6 = 0x75,\n  FWL_VKEY_F7 = 0x76,\n  FWL_VKEY_F8 = 0x77,\n  FWL_VKEY_F9 = 0x78,\n  FWL_VKEY_F10 = 0x79,\n  FWL_VKEY_F11 = 0x7A,\n  FWL_VKEY_F12 = 0x7B,\n  FWL_VKEY_F13 = 0x7C,\n  FWL_VKEY_F14 = 0x7D,\n  FWL_VKEY_F15 = 0x7E,\n  FWL_VKEY_F16 = 0x7F,\n  FWL_VKEY_F17 = 0x80,\n  FWL_VKEY_F18 = 0x81,\n  FWL_VKEY_F19 = 0x82,\n  FWL_VKEY_F20 = 0x83,\n  FWL_VKEY_F21 = 0x84,\n  FWL_VKEY_F22 = 0x85,\n  FWL_VKEY_F23 = 0x86,\n  FWL_VKEY_F24 = 0x87,\n  FWL_VKEY_NunLock = 0x90,\n  FWL_VKEY_Scroll = 0x91,\n  FWL_VKEY_LShift = 0xA0,\n  FWL_VKEY_RShift = 0xA1,\n  FWL_VKEY_LControl = 0xA2,\n  FWL_VKEY_RControl = 0xA3,\n  FWL_VKEY_LMenu = 0xA4,\n  FWL_VKEY_RMenu = 0xA5,\n  FWL_VKEY_BROWSER_Back = 0xA6,\n  FWL_VKEY_BROWSER_Forward = 0xA7,\n  FWL_VKEY_BROWSER_Refresh = 0xA8,\n  FWL_VKEY_BROWSER_Stop = 0xA9,\n  FWL_VKEY_BROWSER_Search = 0xAA,\n  FWL_VKEY_BROWSER_Favorites = 0xAB,\n  FWL_VKEY_BROWSER_Home = 0xAC,\n  FWL_VKEY_VOLUME_Mute = 0xAD,\n  FWL_VKEY_VOLUME_Down = 0xAE,\n  FWL_VKEY_VOLUME_Up = 0xAF,\n  FWL_VKEY_MEDIA_NEXT_Track = 0xB0,\n  FWL_VKEY_MEDIA_PREV_Track = 0xB1,\n  FWL_VKEY_MEDIA_Stop = 0xB2,\n  FWL_VKEY_MEDIA_PLAY_Pause = 0xB3,\n  FWL_VKEY_MEDIA_LAUNCH_Mail = 0xB4,\n  FWL_VKEY_MEDIA_LAUNCH_MEDIA_Select = 0xB5,\n  FWL_VKEY_MEDIA_LAUNCH_APP1 = 0xB6,\n  FWL_VKEY_MEDIA_LAUNCH_APP2 = 0xB7,\n  FWL_VKEY_OEM_1 = 0xBA,\n  FWL_VKEY_OEM_Plus = 0xBB,\n  FWL_VKEY_OEM_Comma = 0xBC,\n  FWL_VKEY_OEM_Minus = 0xBD,\n  FWL_VKEY_OEM_Period = 0xBE,\n  FWL_VKEY_OEM_2 = 0xBF,\n  FWL_VKEY_OEM_3 = 0xC0,\n  FWL_VKEY_OEM_4 = 0xDB,\n  FWL_VKEY_OEM_5 = 0xDC,\n  FWL_VKEY_OEM_6 = 0xDD,\n  FWL_VKEY_OEM_7 = 0xDE,\n  FWL_VKEY_OEM_8 = 0xDF,\n  FWL_VKEY_OEM_102 = 0xE2,\n  FWL_VKEY_ProcessKey = 0xE5,\n  FWL_VKEY_Packet = 0xE7,\n  FWL_VKEY_Attn = 0xF6,\n  FWL_VKEY_Crsel = 0xF7,\n  FWL_VKEY_Exsel = 0xF8,\n  FWL_VKEY_Ereof = 0xF9,\n  FWL_VKEY_Play = 0xFA,\n  FWL_VKEY_Zoom = 0xFB,\n  FWL_VKEY_NoName = 0xFC,\n  FWL_VKEY_PA1 = 0xFD,\n  FWL_VKEY_OEM_Clear = 0xFE,\n  FWL_VKEY_Unknown = 0,\n} FWL_VKEYCODE;\n\n//key event command\ntypedef enum\n{\n\tFWL_EVENTKEYCMD_KeyDown = 1\t,\n\tFWL_EVENTKEYCMD_KeyUp\t\t,\n\tFWL_EVENTKEYCMD_Char\t\t,\n} FWL_EVENTKEYCMD;\n\n//key event\nstruct FWL_EVENT_KEY\n{\n\tFPDF_UINT32 command;\n\tFPDF_DWORD flag;\n\tunion\n\t{\n\t\t//Virtual key code.\n\t\tFPDF_UINT32 vkcode;\n\t\t//Character code.\n\t\tFPDF_DWORD charcode;\n\t}code;\n};\n\n//event type\nstruct FWL_EVENT \n{\n\t//structure size.\n\tFPDF_UINT32 size;\n\t//FWL_EVENTTYPE.\n    FPDF_UINT32 type;\n\tunion\n\t{\n\t\tstruct FWL_EVENT_MOUSE mouse;\n\t\tstruct FWL_EVENT_MOUSEWHEEL wheel;\n\t\tstruct FWL_EVENT_KEY key;\n\t}s;\n};  \n\n#endif //_FWL_EVENT_H\n\n\n"
  },
  {
    "path": "fpdfsdk/include/fpdf_progressive.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDF_PROGRESSIVE_H_\n#define _FPDF_PROGRESSIVE_H_\n\n#include \"fpdfview.h\"\n\n//Flags for progressive process status.\n#define FPDF_RENDER_READER\t\t\t0\n#define FPDF_RENDER_TOBECOUNTINUED\t1\n#define FPDF_RENDER_DONE\t\t\t2\n#define FPDF_RENDER_FAILED\t\t\t3\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n//IFPDF_RENDERINFO interface.\ntypedef struct _IFSDK_PAUSE\n{\n\t/**\n\t* Version number of the interface. Currently must be 1.\n\t**/\n\tint version;\n\n\t/*\n\t* Method: NeedToPauseNow\n\t*\t\t\tCheck if we need to pause a progressive process now.\n\t* Interface Version:\n\t*\t\t\t1\n\t* Implementation Required:\n\t*\t\t\tyes\n\t* Parameters:\n\t*\t\t\tpThis\t\t-\tPointer to the interface structure itself\n\t* Return Value:\n\t*\t\t\t Non-zero for pause now, 0 for continue.\n\t*\n\t*/\n\tFPDF_BOOL (*NeedToPauseNow) (struct _IFSDK_PAUSE* pThis);\n\t\n\t//A user defined data pointer, used by user's application. Can be NULL.\n\tvoid*\t\tuser;\n} IFSDK_PAUSE;\n\n// Function: FPDF_RenderPageBitmap_Start\n//\t\t\tStart to render page contents to a device independent bitmap progressively.\n// Parameters: \n//\t\t\tbitmap\t\t-\tHandle to the device independent bitmap (as the output buffer).\n//\t\t\t\t\t\t\tBitmap handle can be created by FPDFBitmap_Create function.\n//\t\t\tpage\t\t-\tHandle to the page. Returned by FPDF_LoadPage function.\n//\t\t\tstart_x\t\t-\tLeft pixel position of the display area in the bitmap coordinate.\n//\t\t\tstart_y\t\t-\tTop pixel position of the display area in the bitmap coordinate.\n//\t\t\tsize_x\t\t-\tHorizontal size (in pixels) for displaying the page.\n//\t\t\tsize_y\t\t-\tVertical size (in pixels) for displaying the page.\n//\t\t\trotate\t\t-\tPage orientation: 0 (normal), 1 (rotated 90 degrees clockwise),\n//\t\t\t\t\t\t\t\t2 (rotated 180 degrees), 3 (rotated 90 degrees counter-clockwise).\n//\t\t\tflags\t\t-\t0 for normal display, or combination of flags defined above.\n//\t\t\tpause\t\t-\tThe IFSDK_PAUSE interface.A callback mechanism allowing the page rendering process\n// Return value:\n//\t\t\tRendering Status. See flags for progressive process status for the details.\n//\nDLLEXPORT int STDCALL FPDF_RenderPageBitmap_Start(FPDF_BITMAP bitmap, FPDF_PAGE page, int start_x, int start_y, int size_x,\n\t\t\t\t\t\t\t\t\t\t\t\t   int size_y, int rotate, int flags,IFSDK_PAUSE * pause);\n\n// Function: FPDF_RenderPage_Continue\n//\t\t\tContinue rendering a PDF page.\n// Parameters: \n//\t\t\tpage\t\t-\tHandle to the page. Returned by FPDF_LoadPage function.\n//\t\t\tpause\t\t-\tThe IFSDK_PAUSE interface.A callback mechanism allowing the page rendering process\n//\t\t\t\t\t\t\tto be paused before it's finished. This can be NULL if you don't want to pause.\n// Return value:\n//\t\t\tThe rendering status. See flags for progressive process status for the details.\nDLLEXPORT int STDCALL FPDF_RenderPage_Continue(FPDF_PAGE page,IFSDK_PAUSE * pause);\n\n// Function: FPDF_RenderPage_Close\n//\t\t\tRelease the resource allocate during page rendering. Need to be called after finishing rendering or\n//\t\t\tcancel the rendering.\n// Parameters: \n//\t\t\tpage\t\t-\tHandle to the page. Returned by FPDF_LoadPage function.\n// Return value:\n//\t\t\tNULL\nDLLEXPORT void STDCALL FPDF_RenderPage_Close(FPDF_PAGE page);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\t//_FPDF_PROGRESSIVE_H_\n"
  },
  {
    "path": "fpdfsdk/include/fpdf_searchex.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDF_SEARCH_EX_H\n#define _FPDF_SEARCH_EX_H\n\t\n#ifndef _FPDFVIEW_H_\n#include \"fpdfview.h\"\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// Function: FPDFText_GetCharIndexFromTextIndex\n//\t\tGet the actually char index in text_page's internal char list.\n// Parameters:\n//\t\t\ttext_page\t- \tHandle to a text page information structure. Returned by FPDFText_LoadPage function.\n//\t\t\tnTextIndex\t-\tThe index of the text in the string get from FPDFText_GetText.\n//\tReturn value:\n//\t\t\tThe index of the character in internal charlist. -1 for error.\nDLLEXPORT int STDCALL  FPDFText_GetCharIndexFromTextIndex(FPDF_TEXTPAGE text_page, int nTextIndex);\n\n#ifdef __cplusplus\n};\n#endif\n\n\n#endif\n\n"
  },
  {
    "path": "fpdfsdk/include/fpdf_sysfontinfo.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDF_SYSFONTINFO_H\n#define _FPDF_SYSFONTINFO_H\n\n#include \"fpdfview.h\"\n\n/* Character sets for the font */\n#define FXFONT_ANSI_CHARSET\t\t0\n#define FXFONT_DEFAULT_CHARSET\t1\n#define FXFONT_SYMBOL_CHARSET\t2\n#define FXFONT_SHIFTJIS_CHARSET\t128\n#define FXFONT_HANGEUL_CHARSET\t129\n#define FXFONT_GB2312_CHARSET\t134\n#define FXFONT_CHINESEBIG5_CHARSET\t136\n\n/* Font pitch and family flags */\n#define FXFONT_FF_FIXEDPITCH\t1\n#define FXFONT_FF_ROMAN\t\t\t(1<<4)\n#define FXFONT_FF_SCRIPT\t\t(4<<4)\n\n/* Typical weight values */\n#define FXFONT_FW_NORMAL\t\t400\n#define FXFONT_FW_BOLD\t\t\t700\n\n// Exported Functions\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n/** \n * Interface: FPDF_SYSFONTINFO\n *\t\t\tInterface for getting system font information and font mapping\n */\ntypedef struct _FPDF_SYSFONTINFO {\n\t/**\n\t * Version number of the interface. Currently must be 1.\n\t **/\n\tint\tversion;\n\n\t/** \n\t * Method: Release\n\t *\t\t\tGive implementation a chance to release any data after the interface is no longer used\n\t * Interface Version:\n\t *\t\t\t1\n\t * Implementation Required:\n\t *\t\t\tNo\n\t * Comments:\n\t *\t\t\tCalled by Foxit SDK during the final cleanup process.\n\t * Parameters:\n\t *\t\t\tpThis\t\t-\tPointer to the interface structure itself\n\t * Return Value:\n\t *\t\t\tNone\n\t */\n\tvoid (*Release)(struct _FPDF_SYSFONTINFO* pThis);\n\t\n\t/**\n\t * Method: EnumFonts\n\t *\t\t\tEnumerate all fonts installed on the system\n\t * Interface Version:\n\t *\t\t\t1\n\t * Implementation Required:\n\t *\t\t\tNo\n\t * Comments:\n\t *\t\t\tImplementation should call FPDF_AddIntalledFont() function for each font found.\n\t *\t\t\tOnly TrueType/OpenType and Type1 fonts are accepted by Foxit SDK.\n\t * Parameters:\n\t *\t\t\tpThis\t\t-\tPointer to the interface structure itself\n\t *\t\t\tpMapper\t\t-\tAn opaque pointer to internal font mapper, used when calling FPDF_AddInstalledFont\n\t * Return Value:\n\t *\t\t\tNone\n\t */\n\tvoid (*EnumFonts)(struct _FPDF_SYSFONTINFO* pThis, void* pMapper);\n\n\t/**\n\t * Method: MapFont\n\t *\t\t\tUse the system font mapper to get a font handle from requested parameters\n\t * Interface Version:\n\t *\t\t\t1\n\t * Implementation Required:\n\t *\t\t\tYes only if GetFont method is not implemented.\n\t * Comments:\n\t *\t\t\tIf the system supports native font mapper (like Windows), implementation can implement this method to get a font handle. \n\t *\t\t\tOtherwise, Foxit SDK will do the mapping and then call GetFont method.\n\t *\t\t\tOnly TrueType/OpenType and Type1 fonts are accepted by Foxit SDK.\n\t * Parameters:\n\t *\t\t\tpThis\t\t-\tPointer to the interface structure itself\n\t *\t\t\tweight\t\t-\tWeight of the requested font. 400 is normal and 700 is bold.\n\t *\t\t\tbItalic\t\t-\tItalic option of the requested font, TRUE or FALSE.\n\t *\t\t\tcharset\t\t-\tCharacter set identifier for the requested font. See above defined constants.\n\t *\t\t\tpitch_family -\tA combination of flags. See above defined constants.\n\t *\t\t\tface\t\t-\tTypeface name. Currently use system local encoding only.\n\t *\t\t\tbExact\t\t-\tPointer to an boolean value receiving the indicator whether mapper found the exact match.\n\t *\t\t\t\t\t\t\tIf mapper is not sure whether it's exact match, ignore this paramter.\n\t * Return Value:\n\t *\t\t\tAn opaque pointer for font handle, or NULL if system mapping is not supported.\n\t **/\n\tvoid* (*MapFont)(struct _FPDF_SYSFONTINFO* pThis, int weight, int bItalic, int charset, int pitch_family, \n\t\t\t\t\t\tconst char* face, int* bExact);\n\n\t/**\n\t * Method: GetFont\n\t *\t\t\tGet a handle to a particular font by its internal ID\n\t * Interface Version:\n\t *\t\t\t1\n\t * Implementation Required:\n\t *\t\t\tYes only if MapFont method is not implemented.\n\t * Comments:\n\t *\t\t\tIf the system mapping not supported, Foxit SDK will do the font mapping and use this method to get a font handle.\n\t * Parameters:\n\t *\t\t\tpThis\t\t-\tPointer to the interface structure itself\n\t *\t\t\tface\t\t-\tTypeface name. Currently use system local encoding only.\n\t * Return Value:\n\t *\t\t\tAn opaque pointer for font handle.\n\t **/\n\tvoid* (*GetFont)(struct _FPDF_SYSFONTINFO* pThis, const char* face);\n\n\t/**\n\t * Method: GetFontData\n\t *\t\t\tGet font data from a font\n\t * Interface Version:\n\t *\t\t\t1\n\t * Implementation Required:\n\t *\t\t\tYes\n\t * Comments:\n\t *\t\t\tCan read either full font file, or a particular TrueType/OpenType table\n\t * Parameters:\n\t *\t\t\tpThis\t\t-\tPointer to the interface structure itself\n\t *\t\t\thFont\t\t-\tFont handle returned by MapFont or GetFont method\n\t *\t\t\ttable\t\t-\tTrueType/OpenType table identifier (refer to TrueType specification).\n\t *\t\t\t\t\t\t\t0 for the whole font file.\n\t *\t\t\tbuffer\t\t-\tThe buffer receiving the font data. Can be NULL if not provided\n\t *\t\t\tbuf_size\t-\tBuffer size, can be zero if not provided\n\t * Return Value:\n\t *\t\t\tNumber of bytes needed, if buffer not provided or not large enough,\n\t *\t\t\tor number of bytes written into buffer otherwise.\n\t **/\n\tunsigned long (*GetFontData)(struct _FPDF_SYSFONTINFO* pThis, void* hFont,\n\t\t\tunsigned int table, unsigned char* buffer, unsigned long buf_size);\n\n\t/**\n\t * Method: GetFaceName\n\t *\t\t\tGet face name from a font handle\n\t * Interface Version:\n\t *\t\t\t1\n\t * Implementation Required:\n\t *\t\t\tNo\n\t * Parameters:\n\t *\t\t\tpThis\t\t-\tPointer to the interface structure itself\n\t *\t\t\thFont\t\t-\tFont handle returned by MapFont or GetFont method\n\t *\t\t\tbuffer\t\t-\tThe buffer receiving the face name. Can be NULL if not provided\n\t *\t\t\tbuf_size\t-\tBuffer size, can be zero if not provided\n\t * Return Value:\n\t *\t\t\tNumber of bytes needed, if buffer not provided or not large enough,\n\t *\t\t\tor number of bytes written into buffer otherwise.\n\t **/\n\tunsigned long (*GetFaceName)(struct _FPDF_SYSFONTINFO* pThis, void* hFont, char* buffer, unsigned long buf_size);\n\t\t\t\n\t/**\n\t * Method: GetFontCharset\n\t *\t\t\tGet character set information for a font handle\n\t * Interface Version:\n\t *\t\t\t1\n\t * Implementation Required:\n\t *\t\t\tNo\n\t * Parameters:\n\t *\t\t\tpThis\t\t-\tPointer to the interface structure itself\n\t *\t\t\thFont\t\t-\tFont handle returned by MapFont or GetFont method\n\t * Return Value:\n\t *\t\t\tCharacter set identifier. See defined constants above.\n\t **/\n\tint (*GetFontCharset)(struct _FPDF_SYSFONTINFO* pThis, void* hFont);\n\n\t/**\n\t * Method: DeleteFont\n\t *\t\t\tDelete a font handle\n\t * Interface Version:\n\t *\t\t\t1\n\t * Implementation Required:\n\t *\t\t\tYes\n\t * Parameters:\n\t *\t\t\tpThis\t\t-\tPointer to the interface structure itself\n\t *\t\t\thFont\t\t-\tFont handle returned by MapFont or GetFont method\n\t * Return Value:\n\t *\t\t\tNone\n\t **/\n\tvoid (*DeleteFont)(struct _FPDF_SYSFONTINFO* pThis, void* hFont);\n} FPDF_SYSFONTINFO;\n\n/**\n * Function: FPDF_AddInstalledFont\n *\t\t\tAdd a system font to the list in Foxit SDK.\n * Comments:\n *\t\t\tThis function is only called during the system font list building process.\n * Parameters:\n *\t\t\tmapper\t\t\t-\tOpaque pointer to Foxit font mapper\n *\t\t\tface\t\t\t-\tThe font face name\n *\t\t\tcharset\t\t\t-\tFont character set. See above defined constants.\n * Return Value:\n *\t\t\tNone.\n **/\nDLLEXPORT void STDCALL FPDF_AddInstalledFont(void* mapper, const char* face, int charset);\n\n/**\n * Function: FPDF_SetSystemFontInfo\n *\t\t\tSet the system font info interface into Foxit SDK\n * Comments:\n *\t\t\tPlatform support implementation should implement required methods of FFDF_SYSFONTINFO interface,\n *\t\t\tthen call this function during SDK initialization process.\n * Parameters:\n *\t\t\tpFontInfo\t\t-\tPointer to a FPDF_SYSFONTINFO structure\n * Return Value:\n *\t\t\tNone\n **/\nDLLEXPORT void STDCALL FPDF_SetSystemFontInfo(FPDF_SYSFONTINFO* pFontInfo);\n\n/**\n * Function: FPDF_GetDefaultSystemFontInfo\n *\t\t\tGet default system font info interface for current platform\n * Comments:\n *\t\t\tFor some platforms Foxit SDK implement a default version of system font info interface.\n *\t\t\tThe default implementation can be used in FPDF_SetSystemFontInfo function.\n * Parameters:\n *\t\t\tNone\n * Return Value:\n *\t\t\tPointer to a FPDF_SYSFONTINFO structure describing the default interface.\n *\t\t\tOr NULL if the platform doesn't have a default interface.\n *\t\t\tApplication should call FPDF_FreeMemory to free the returned pointer.\n **/\nDLLEXPORT FPDF_SYSFONTINFO* STDCALL FPDF_GetDefaultSystemFontInfo();\n\n#ifdef __cplusplus\n};\n#endif\n\n#endif // _FPDF_SYSFONTINFO_H\n"
  },
  {
    "path": "fpdfsdk/include/fpdf_transformpage.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _TRANSFORMPAGE_H_\n#define _TRANSFORMPAGE_H_\n\n#ifndef _FPDFVIEW_H_\n#include \"fpdfview.h\"\n#endif\n\ntypedef void* FPDF_PAGEARCSAVER;\ntypedef void* FPDF_PAGEARCLOADER;\n/**\n*  Set \"MediaBox\" entry to the page dictionary.\t\t\t\t\t\t   \n* @param[in] page\t- Handle to a page.\n* @param[in] left\t- The left of the rectangle.\n* @param[in] bottom\t- The bottom of the rectangle.\n* @param[in] right\t- The right of the rectangle.\n* @param[in] top\t- The top of the rectangle.\n* @retval None.\n*/\nDLLEXPORT void STDCALL FPDFPage_SetMediaBox(FPDF_PAGE page, float left, float bottom, float right, float top);\n\n/**\n*  Set \"CropBox\" entry to the page dictionary.\t\t\t\t\t\t   \n* @param[in] page\t- Handle to a page.\n* @param[in] left\t- The left of the rectangle.\n* @param[in] bottom\t- The bottom of the rectangle.\n* @param[in] right\t- The right of the rectangle.\n* @param[in] top\t- The top of the rectangle.\n* @retval None.\n*/\nDLLEXPORT void STDCALL FPDFPage_SetCropBox(FPDF_PAGE page, float left, float bottom, float right, float top);\n\n\n/**  Get \"MediaBox\" entry from the page dictionary.\t\t\t\t\t\t   \n* @param[in] page\t- Handle to a page.\n* @param[in] left\t- Pointer to a double value receiving the left of the rectangle.\n* @param[in] bottom\t- Pointer to a double value receiving the bottom of the rectangle.\n* @param[in] right\t- Pointer to a double value receiving the right of the rectangle.\n* @param[in] top\t- Pointer to a double value receiving the top of the rectangle.\n* @retval True if success,else fail.\n*/\nDLLEXPORT FPDF_BOOL STDCALL FPDFPage_GetMediaBox(FPDF_PAGE page, float* left, float* bottom, float* right, float* top);\n\n/**  Get \"CropBox\" entry from the page dictionary.\t\t\t\t\t\t   \n* @param[in] page\t- Handle to a page.\n* @param[in] left\t- Pointer to a double value receiving the left of the rectangle.\n* @param[in] bottom\t- Pointer to a double value receiving the bottom of the rectangle.\n* @param[in] right\t- Pointer to a double value receiving the right of the rectangle.\n* @param[in] top\t- Pointer to a double value receiving the top of the rectangle.\n* @retval True if success,else fail.\n*/\nDLLEXPORT FPDF_BOOL STDCALL FPDFPage_GetCropBox(FPDF_PAGE page, float* left, float* bottom, float* right, float* top);\n\n/**\n* Transform the whole page with a specified matrix, then clip the page content region.\n*\n* @param[in] page\t\t - A page handle.\n* @param[in] matrix\t\t - The transform matrix.\n* @param[in] clipRect\t - A rectangle page area to be clipped.\n* @Note. This function will transform the whole page, and would take effect to all the objects in the page.\n*/\nDLLEXPORT FPDF_BOOL STDCALL FPDFPage_TransFormWithClip(FPDF_PAGE page, FS_MATRIX* matrix, FS_RECTF* clipRect);\n\n/**\n* Transform (scale, rotate, shear, move) the clip path of page object.\n* @param[in] page_object - Handle to a page object. Returned by FPDFPageObj_NewImageObj.\n* @param[in] a\t- The coefficient \"a\" of the matrix.\n* @param[in] b\t- The coefficient \"b\" of the matrix.\n* @param[in] c\t- The coefficient \"c\" of the matrix.\n* @param[in] d\t- The coefficient \"d\" of the matrix.\n* @param[in] e\t- The coefficient \"e\" of the matrix.\n* @param[in] f\t- The coefficient \"f\" of the matrix.\n* @retval None.\n*/\nDLLEXPORT void STDCALL FPDFPageObj_TransformClipPath(FPDF_PAGEOBJECT page_object,double a, double b, double c, double d, double e, double f);\n\n/**\n* Create a new clip path, with a rectangle inserted.\n* \n* @param[in] left\t- The left of the clip box.\n* @param[in] bottom - The bottom of the clip box.\n* @param[in] right\t- The right of the clip box.\n* @param[in] top\t- The top of the clip box.\n* @retval a handle to the clip path.\n*/\nDLLEXPORT FPDF_CLIPPATH STDCALL FPDF_CreateClipPath(float left, float bottom, float right, float top);\n\n/**\n* Destroy the clip path.\n*\n* @param[in] clipPath - A handle to the clip path.\n* Destroy the clip path.\n* @retval None.\n*/\nDLLEXPORT void STDCALL FPDF_DestroyClipPath(FPDF_CLIPPATH clipPath);\n\n/**\n* Clip the page content, the page content that outside the clipping region become invisible.\n*\n* @param[in] page\t\t - A page handle.\n* @param[in] clipPath\t - A handle to the clip path.\n* @Note. A clip path will be inserted before the page content stream or content array. In this way, the page content will be clipped\n* by this clip path. \n*/\nDLLEXPORT void STDCALL FPDFPage_InsertClipPath(FPDF_PAGE page,FPDF_CLIPPATH clipPath);\n\n#endif\n\n"
  },
  {
    "path": "fpdfsdk/include/fpdfdoc.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDFDOC_H_\n#define _FPDFDOC_H_\n\n#include \"fpdfview.h\"\n\n// Exported Functions\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// Function: FPDFBookmark_Find\n//\t\t\tFind a bookmark in the document, using the bookmark title.\n// Parameters: \n//\t\t\tdocument\t-\tHandle to the document. Returned by FPDF_LoadDocument or FPDF_LoadMemDocument.\n//\t\t\ttitle\t\t-\tThe UTF-16LE encoded Unicode string for the bookmark title to be searched. Can't be NULL.\n// Return value:\n//\t\t\tHandle to the found bookmark item. NULL if the title can't be found.\n// Comments:\n//\t\t\tIt always returns the first found bookmark if more than one bookmarks have the same title.\n//\nDLLEXPORT FPDF_BOOKMARK STDCALL FPDFBookmark_Find(FPDF_DOCUMENT document, FPDF_WIDESTRING title);\n\n// Function: FPDFBookmark_GetDest\n//\t\t\tGet the destination associated with a bookmark item.\n// Parameters:\n//\t\t\tdocument\t-\tHandle to the document.\n//\t\t\tbookmark\t-\tHandle to the bookmark.\n// Return value:\n//\t\t\tHandle to the destination data. NULL if no destination is associated with this bookmark.\n//\nDLLEXPORT FPDF_DEST STDCALL FPDFBookmark_GetDest(FPDF_DOCUMENT document, FPDF_BOOKMARK bookmark);\n\n// Function: FPDFBookmark_GetAction\n//\t\t\tGet the action associated with a bookmark item.\n// Parameters:\n//\t\t\tbookmark\t-\tHandle to the bookmark.\n// Return value:\n//\t\t\tHandle to the action data. NULL if no action is associated with this bookmark. In this case, the \n//\t\t\tapplication should try FPDFBookmark_GetDest.\n//\nDLLEXPORT FPDF_ACTION STDCALL FPDFBookmark_GetAction(FPDF_BOOKMARK bookmark);\n\n#define PDFACTION_UNSUPPORTED\t\t0\t\t// Unsupported action type.\n#define PDFACTION_GOTO\t\t\t\t1\t\t// Go to a destination within current document.\n#define PDFACTION_REMOTEGOTO\t\t2\t\t// Go to a destination within another document.\n#define PDFACTION_URI\t\t\t\t3\t\t// Universal Resource Identifier, including web pages and \n\t\t\t\t\t\t\t\t\t\t\t// other Internet based resources.\n#define PDFACTION_LAUNCH\t\t\t4\t\t// Launch an application or open a file.\n\n// Function: FPDFAction_GetType\n//\t\t\tGet type of an action.\n// Parameters:\n//\t\t\taction\t\t-\tHandle to the action.\n// Return value:\n//\t\t\tA type number as defined above.\n//\nDLLEXPORT unsigned long STDCALL FPDFAction_GetType(FPDF_ACTION action);\n\n// Function: FPDFAction_GetDest\n//\t\t\tGet destination of an action.\n// Parameters:\n//\t\t\tdocument\t-\tHandle to the document.\n//\t\t\taction\t\t-\tHandle to the action. It must be a GOTO or REMOTEGOTO action.\n// Return value:\n//\t\t\tHandle to the destination data.\n// Comments:\n//\t\t\tIn case of remote goto action, the application should first use FPDFAction_GetFilePath to\n//\t\t\tget file path, then load that particular document, and use its document handle to call this\n//\t\t\tfunction.\n//\nDLLEXPORT FPDF_DEST STDCALL FPDFAction_GetDest(FPDF_DOCUMENT document, FPDF_ACTION action);\n\n// Function: FPDFAction_GetURIPath\n//\t\t\tGet URI path of a URI action.\n// Parameters:\n//\t\t\tdocument\t-\tHandle to the document.\n//\t\t\taction\t\t-\tHandle to the action. Must be a URI action.\n//\t\t\tbuffer\t\t-\tA buffer for output the path string. Can be NULL.\n//\t\t\tbuflen\t\t-\tThe length of the buffer, number of bytes. Can be 0.\n// Return value:\n//\t\t\tNumber of bytes the URI path consumes, including trailing zeros.\n// Comments:\n//\t\t\tThe URI path is always encoded in 7-bit ASCII.\n// \n//\t\t\tThe return value always indicated number of bytes required for the buffer, even when there is\n//\t\t\tno buffer specified, or the buffer size is less then required. In this case, the buffer will not\n//\t\t\tbe modified.\n//\nDLLEXPORT unsigned long STDCALL FPDFAction_GetURIPath(FPDF_DOCUMENT document, FPDF_ACTION action, \n\t\t\t\t\t\t\t\t\t\t\t\t\t  void* buffer, unsigned long buflen);\n\n// Function: FPDFDest_GetPageIndex\n//\t\t\tGet page index of a destination.\n// Parameters:\n//\t\t\tdocument\t-\tHandle to the document.\n//\t\t\tdest\t\t-\tHandle to the destination.\n// Return value:\n//\t\t\tThe page index. Starting from 0 for the first page.\n//\nDLLEXPORT unsigned long STDCALL FPDFDest_GetPageIndex(FPDF_DOCUMENT document, FPDF_DEST dest);\n\n// Function: FPDFLink_GetLinkAtPoint\n//\t\t\tFind a link at specified point on a document page.\n// Parameters:\n//\t\t\tpage\t\t-\tHandle to the document page.\n//\t\t\tx\t\t\t-\tThe x coordinate of the point, specified in page coordinate system.\n//\t\t\ty\t\t\t-\tThe y coordinate of the point, specified in page coordinate system.\n// Return value:\n//\t\t\tHandle to the link. NULL if no link found at that point.\n// Comments:\n//\t\t\tThe point coordinates are specified in page coordinate system. You can convert coordinates \n//\t\t\tfrom screen system to page system using FPDF_DeviceToPage functions.\n//\nDLLEXPORT FPDF_LINK STDCALL FPDFLink_GetLinkAtPoint(FPDF_PAGE page, double x, double y);\n\n// Function: FPDFLink_GetDest\n//\t\t\tGet destination info of a link.\n// Parameters:\n//\t\t\tdocument\t-\tHandle to the document.\n//\t\t\tlink\t\t-\tHandle to the link. Returned by FPDFLink_GetLinkAtPoint.\n// Return value:\n//\t\t\tHandle to the destination. NULL if there is no destination associated with the link, in this case\n//\t\t\tthe application should try FPDFLink_GetAction.\n//\nDLLEXPORT FPDF_DEST STDCALL FPDFLink_GetDest(FPDF_DOCUMENT document, FPDF_LINK link);\n\n// Function: FPDFLink_GetAction\n//\t\t\tGet action info of a link.\n// Parameters:\n//\t\t\tlink\t\t-\tHandle to the link.\n// Return value:\n//\t\t\tHandle to the action. NULL if there is no action associated with the link.\n//\nDLLEXPORT FPDF_ACTION STDCALL FPDFLink_GetAction(FPDF_LINK link);\n\n// Function: FPDFLink_Enumerate\n//\t\t\tThis function would enumerate all the link annotations in a single PDF page.\n// Parameters:\n//\t\t\tpage[in]\t\t\t-\tHandle to the page.\n//\t\t\tstartPos[in,out]\t-\tThe start position to enumerate the link annotations, which should be specified to start from \n//\t\t\t\t\t\t\t\t-\t0 for the first call, and would receive the next position for enumerating to start from.\n//\t\t\tlinkAnnot[out]\t\t-\tReceive the link handle.\n// Return value:\n//\t\t\tTRUE if succceed, else False;\n//\nDLLEXPORT FPDF_BOOL STDCALL FPDFLink_Enumerate(FPDF_PAGE page, int* startPos, FPDF_LINK* linkAnnot);\n\n// Function: FPDFLink_GetAnnotRect\n//\t\t\tGet the annotation rectangle. (Specified by the Rect entry of annotation dictionary).\n// Parameters:\n//\t\t\tlinkAnnot[in]\t\t-\tHandle to the link annotation.\n//\t\t\trect[out]\t\t\t-\tThe annotation rect.\n// Return value:\n//\t\t\tTRUE if succceed, else False;\n//\nDLLEXPORT FPDF_BOOL STDCALL FPDFLink_GetAnnotRect(FPDF_LINK linkAnnot, FS_RECTF* rect);\n\n// Function: FPDFLink_CountQuadPoints\n//\t\t\tGet the count of quadrilateral points to the link annotation.\n// Parameters:\n//\t\t\tlinkAnnot[in]\t\t-\tHandle to the link annotation.\n// Return value:\n//\t\t\tThe count of quadrilateral points.\n//\nDLLEXPORT int STDCALL FPDFLink_CountQuadPoints(FPDF_LINK linkAnnot);\n\n/* _FS_DEF_STRUCTURE_QUADPOINTSF_ */\n#ifndef _FS_DEF_STRUCTURE_QUADPOINTSF_\n#define _FS_DEF_STRUCTURE_QUADPOINTSF_\ntypedef struct _FS_QUADPOINTSF\n{\n\tFS_FLOAT  x1;\n\tFS_FLOAT  y1;\n\tFS_FLOAT  x2;\n\tFS_FLOAT  y2;\n\tFS_FLOAT  x3;\n\tFS_FLOAT  y3;\n\tFS_FLOAT  x4;\n\tFS_FLOAT  y4;\n} FS_QUADPOINTSF;\n#endif /* _FS_DEF_STRUCTURE_QUADPOINTSF_ */\n\n// Function: FPDFLink_GetQuadPoints\n//\t\t\tGet the quadrilateral points for the specified index in the link annotation.\n// Parameters:\n//\t\t\tlinkAnnot[in]\t\t-\tHandle to the link annotation.\n//\t\t\tquadIndex[in]\t\t-\tThe specified quad points index.\n//\t\t\tquadPoints[out]\t\t-\tReceive the quadrilateral points.\n// Return value:\n//\t\t\tTrue if succeed, else False.\n//\nDLLEXPORT FPDF_BOOL STDCALL FPDFLink_GetQuadPoints(FPDF_LINK linkAnnot, int quadIndex, FS_QUADPOINTSF* quadPoints);\n\n// Function: FPDF_GetMetaText\n//\t\t\tGet a text from meta data of the document. Result is encoded in UTF-16LE.\n// Parameters:\n//\t\t\tdoc\t\t\t-\tHandle to a document\n//\t\t\ttag\t\t\t-\tThe tag for the meta data. Currently, It can be \"Title\", \"Author\", \n//\t\t\t\t\t\t\t\"Subject\", \"Keywords\", \"Creator\", \"Producer\", \"CreationDate\", or \"ModDate\".\n//\t\t\t\t\t\t\tFor detailed explanation of these tags and their respective values,\n//\t\t\t\t\t\t\tplease refer to PDF Reference 1.6, section 10.2.1, \"Document Information Dictionary\".\n//\t\t\tbuffer\t\t-\tA buffer for output the title. Can be NULL.\n//\t\t\tbuflen\t\t-\tThe length of the buffer, number of bytes. Can be 0.\n// Return value:\n//\t\t\tNumber of bytes the title consumes, including trailing zeros.\n// Comments:\n//\t\t\tNo matter on what platform, the title is always output in UTF-16LE encoding, which means the buffer \n//\t\t\tcan be regarded as an array of WORD (on Intel and compatible CPUs), each WORD represent the Unicode of \n//\t\t\ta character (some special Unicode may take 2 WORDs). The string is followed by two bytes of zero \n//\t\t\tindicating end of the string.\n//\n//\t\t\tThe return value always indicated number of bytes required for the buffer, even when there is\n//\t\t\tno buffer specified, or the buffer size is less then required. In this case, the buffer will not\n//\t\t\tbe modified.\n//\nDLLEXPORT unsigned long STDCALL FPDF_GetMetaText(FPDF_DOCUMENT doc, FPDF_BYTESTRING tag,\n\t\t\t\t\t\t\t\t\t\t\t\t void* buffer, unsigned long buflen);\n\n\n#ifdef __cplusplus\n};\n#endif\n\n#endif\t// _FPDFDOC_H_\n"
  },
  {
    "path": "fpdfsdk/include/fpdfedit.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef\t_FPDFEDIT_H_\n#define\t_FPDFEDIT_H_\n\n#include \"fpdfview.h\"\n\n// Define all types used in the SDK. Note they can be simply regarded as opaque pointers\n// or long integer numbers.\n\n#define FPDF_ARGB(a,r,g,b)\t\t((((FX_DWORD)(((FX_BYTE)(b)|((FX_WORD)((FX_BYTE)(g))<<8))|(((FX_DWORD)(FX_BYTE)(r))<<16)))) | (((FX_DWORD)(FX_BYTE)(a))<<24))\n#define FPDF_GetBValue(argb)    ((FX_BYTE)(argb))\n#define FPDF_GetGValue(argb)    ((FX_BYTE)(((FX_WORD)(argb)) >> 8))\n#define FPDF_GetRValue(argb)    ((FX_BYTE)((argb)>>16))\n#define FPDF_GetAValue(argb)    ((FX_BYTE)((argb)>>24))\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//////////////////////////////////////////////////////////////////////\n//\n// Document functions\n//\n//////////////////////////////////////////////////////////////////////\n\n// Function: FPDF_CreateNewDocument\n//\t\t\tCreate a new PDF document.\n// Parameters:\t\n//\t\t\tNone.\n// Return value:\n//\t\t\tA handle to a document. If failed, NULL is returned.\nDLLEXPORT FPDF_DOCUMENT STDCALL FPDF_CreateNewDocument();\n\n//////////////////////////////////////////////////////////////////////\n//\n// Page functions\n//\n//////////////////////////////////////////////////////////////////////\n\n// Function: FPDFPage_New\n//\t\t\tConstruct an empty page.\n// Parameters:\t\n//\t\t\tdocument\t-\tHandle to document. Returned by FPDF_LoadDocument and FPDF_CreateNewDocument.\n//\t\t\tpage_index\t-\tThe index of a page.\n//\t\t\twidth\t\t-\tThe page width.\n//\t\t\theight\t\t-\tThe page height.\n// Return value:\n//\t\t\tThe handle to the page.\n// Comments:\n//\t\t\tLoaded page can be deleted by FPDFPage_Delete.\nDLLEXPORT FPDF_PAGE STDCALL FPDFPage_New(FPDF_DOCUMENT document, int page_index, double width, double height);\n\n// Function: FPDFPage_Delete\n//\t\t\tDelete a PDF page.\n// Parameters:\t\n//\t\t\tdocument\t-\tHandle to document. Returned by FPDF_LoadDocument and FPDF_CreateNewDocument.\n//\t\t\tpage_index\t-\tThe index of a page.\n// Return value:\n//\t\t\tNone.\nDLLEXPORT void STDCALL FPDFPage_Delete(FPDF_DOCUMENT document, int page_index);\n\n// Function: FPDFPage_GetRotation\n//\t\t\tGet the page rotation. One of following values will be returned: 0(0), 1(90), 2(180), 3(270).\n// Parameters:\t\n//\t\t\tpage\t\t-\tHandle to a page. Returned by FPDFPage_New or FPDF_LoadPage.\n// Return value:\n//\t\t\tThe PDF page rotation.\n// Comment:\n//\t\t\tThe PDF page rotation is rotated clockwise.\nDLLEXPORT int STDCALL FPDFPage_GetRotation(FPDF_PAGE page);\n\n// Function: FPDFPage_SetRotation\n//\t\t\tSet page rotation. One of following values will be set: 0(0), 1(90), 2(180), 3(270).\n// Parameters:\t\n//\t\t\tpage\t\t-\tHandle to a page. Returned by FPDFPage_New or FPDF_LoadPage.\n//\t\t\trotate\t\t-\tThe value of the PDF page rotation.\n// Return value:\n//\t\t\tNone.\n// Comment:\n//\t\t\tThe PDF page rotation is rotated clockwise.\n// \nDLLEXPORT void STDCALL FPDFPage_SetRotation(FPDF_PAGE page, int rotate);\n\n// Function: FPDFPage_InsertObject\n//\t\t\tInsert an object to the page. The page object is automatically freed.\n// Parameters:\t\n//\t\t\tpage\t\t-\tHandle to a page. Returned by FPDFPage_New or FPDF_LoadPage.\n//\t\t\tpage_obj\t-\tHandle to a page object. Returned by FPDFPageObj_NewTextObj,FPDFPageObj_NewTextObjEx and\n//\t\t\t\t\t\t\tFPDFPageObj_NewPathObj.\n// Return value:\n//\t\t\tNone.\nDLLEXPORT void STDCALL FPDFPage_InsertObject(FPDF_PAGE page, FPDF_PAGEOBJECT page_obj);\n\n// Function: FPDFPage_CountObject\n//\t\t\tGet number of page objects inside the page.\n// Parameters:\t\n//\t\t\tpage\t\t-\tHandle to a page. Returned by FPDFPage_New or FPDF_LoadPage.\n// Return value:\n//\t\t\tThe number of the page object.\nDLLEXPORT int STDCALL FPDFPage_CountObject(FPDF_PAGE page);\n\n// Function: FPDFPage_GetObject\n//\t\t\tGet page object by index.\n// Parameters:\t\n//\t\t\tpage\t\t-\tHandle to a page. Returned by FPDFPage_New or FPDF_LoadPage.\n//\t\t\tindex\t\t-\tThe index of a page object.\n// Return value:\n//\t\t\tThe handle of the page object. Null for failed.\nDLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPage_GetObject(FPDF_PAGE page, int index);\n\n// Function: FPDFPage_HasTransparency\n//\t\t\tCheck that whether the content of specified PDF page contains transparency.\n// Parameters:\t\n//\t\t\tpage\t\t-\tHandle to a page. Returned by FPDFPage_New or FPDF_LoadPage.\n// Return value:\n//\t\t\tTRUE means that the PDF page does contains transparency.\n//\t\t\tOtherwise, returns FALSE.\nDLLEXPORT FPDF_BOOL STDCALL FPDFPage_HasTransparency(FPDF_PAGE page);\n\n// Function: FPDFPage_GenerateContent\n//\t\t\tGenerate PDF Page content.\n// Parameters:\t\n//\t\t\tpage\t\t-\tHandle to a page. Returned by FPDFPage_New or FPDF_LoadPage.\n// Return value:\n//\t\t\tTrue if successful, false otherwise.\n// Comment:\n//\t\t\tBefore you save the page to a file, or reload the page, you must call the FPDFPage_GenerateContent function.\n//\t\t\tOr the changed information will be lost.\nDLLEXPORT FPDF_BOOL STDCALL FPDFPage_GenerateContent(FPDF_PAGE page);\n\n//////////////////////////////////////////////////////////////////////\n//\n// Page Object functions\n//\n//////////////////////////////////////////////////////////////////////\n\n// Function: FPDFPageObj_HasTransparency\n//\t\t\tCheck that whether the specified PDF page object contains transparency.\n// Parameters:\t\n//\t\t\tpageObject\t-\tHandle to a page object.\n// Return value:\n//\t\t\tTRUE means that the PDF page object does contains transparency.\n//\t\t\tOtherwise, returns FALSE.\nDLLEXPORT FPDF_BOOL STDCALL FPDFPageObj_HasTransparency(FPDF_PAGEOBJECT pageObject);\n\n// Function: FPDFPageObj_Transform\n//\t\t\tTransform (scale, rotate, shear, move) page object.\n// Parameters:\t\n//\t\t\tpage_object\t-\tHandle to a page object. Returned by FPDFPageObj_NewImageObj.\n//\t\t\ta\t\t\t-\tThe coefficient \"a\" of the matrix.\n//\t\t\tb\t\t\t-\tThe\tcoefficient \"b\" of the matrix.\n//\t\t\tc\t\t\t-\tThe coefficient \"c\" of the matrix.\n//\t\t\td\t\t\t-\tThe coefficient \"d\" of the matrix.\n//\t\t\te\t\t\t-\tThe coefficient \"e\" of the matrix.\n//\t\t\tf\t\t\t-\tThe coefficient \"f\" of the matrix.\n// Return value:\n//\t\t\tNone.\nDLLEXPORT void STDCALL FPDFPageObj_Transform(FPDF_PAGEOBJECT page_object,\n\t\t\t\t\t\t\tdouble a, double b, double c, double d, double e, double f);\n\n// Function: FPDFPage_TransformAnnots\n//\t\t\tTransform (scale, rotate, shear, move) all annots in a page.\n// Parameters:\t\n//\t\t\tpage\t\t-\tHandle to a page.\n//\t\t\ta\t\t\t-\tThe coefficient \"a\" of the matrix.\n//\t\t\tb\t\t\t-\tThe\tcoefficient \"b\" of the matrix.\n//\t\t\tc\t\t\t-\tThe coefficient \"c\" of the matrix.\n//\t\t\td\t\t\t-\tThe coefficient \"d\" of the matrix.\n//\t\t\te\t\t\t-\tThe coefficient \"e\" of the matrix.\n//\t\t\tf\t\t\t-\tThe coefficient \"f\" of the matrix.\n// Return value:\n//\t\t\tNone.\nDLLEXPORT void STDCALL FPDFPage_TransformAnnots(FPDF_PAGE page,\n\t\t\t\t\t\t\t\t\t\t\t double a, double b, double c, double d, double e, double f);\n\n// The page object constants.\n#define FPDF_PAGEOBJ_TEXT\t\t1\n#define FPDF_PAGEOBJ_PATH\t\t2\n#define FPDF_PAGEOBJ_IMAGE\t\t3\n#define FPDF_PAGEOBJ_SHADING\t4\n#define FPDF_PAGEOBJ_FORM\t\t5\n\n//////////////////////////////////////////////////////////////////////\n//\n// Image functions\n//\n//////////////////////////////////////////////////////////////////////\n\n// Function: FPDFPageObj_NewImgeObj\n//\t\t\tCreate a new Image Object.\n// Parameters:\n//\t\t\tdocument\t\t-\tHandle to document. Returned by FPDF_LoadDocument or FPDF_CreateNewDocument function.\n// Return Value:\n//\t\t\tHandle of image object.\nDLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPageObj_NewImgeObj(FPDF_DOCUMENT document);\n\n\n// Function: FPDFImageObj_LoadJpegFile\n//\t\t\tLoad Image from a JPEG image file and then set it to an image object.\n// Parameters:\n//\t\t\tpages\t\t\t-\tPointers to the start of all loaded pages, could be NULL.\n//\t\t\tnCount\t\t\t-\tNumber of pages, could be 0.\n//\t\t\timage_object\t-\tHandle of image object returned by FPDFPageObj_NewImgeObj.\n//\t\t\tfileAccess\t\t-\tThe custom file access handler, which specifies the JPEG image file.\n//\tReturn Value:\n//\t\t\tTRUE if successful, FALSE otherwise.\n//  Note: \n//\t\t\tThe image object might already has an associated image, which is shared and cached by the loaded pages, In this case, we need to clear the cache of image for all the loaded pages.\n//\t\t\tPass pages and count to this API to clear the image cache. \nDLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_LoadJpegFile(FPDF_PAGE* pages, int nCount,FPDF_PAGEOBJECT image_object, FPDF_FILEACCESS* fileAccess);\n\n\n// Function: FPDFImageObj_SetMatrix\n//\t\t\tSet the matrix of an image object.\n// Parameters:\n//\t\t\timage_object\t-\tHandle of image object returned by FPDFPageObj_NewImgeObj.\n//\t\t\ta\t\t\t\t-\tThe coefficient \"a\" of the matrix.\n//\t\t\tb\t\t\t\t-\tThe coefficient \"b\" of the matrix.\n//\t\t\tc\t\t\t\t-\tThe coefficient \"c\" of the matrix.\n//\t\t\td\t\t\t\t-\tThe coefficient \"d\" of the matrix.\n//\t\t\te\t\t\t\t-\tThe coefficient \"e\" of the matrix.\n//\t\t\tf\t\t\t\t-\tThe coefficient \"f\" of the matrix.\n// Return value:\n//\t\t\tTRUE if successful, FALSE otherwise. \nDLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_SetMatrix(FPDF_PAGEOBJECT image_object,\n\t\t\t\t\t\t\t\t\t\t\t double a, double b, double c, double d, double e, double f);\n\n// Function: FPDFImageObj_SetBitmap\n//\t\t\tSet the bitmap to an image object.\n// Parameters:\n//\t\t\tpages\t\t\t-\tPointer's to the start of all loaded pages.\n//\t\t\tnCount\t\t\t-\tNumber of pages.\n//\t\t\timage_object\t-\tHandle of image object returned by FPDFPageObj_NewImgeObj.\n//\t\t\tbitmap\t\t\t-\tThe handle of the bitmap which you want to set it to the image object.\n// Return value:\n//\t\t\tTRUE if successful, FALSE otherwise. \nDLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_SetBitmap(FPDF_PAGE* pages,int nCount,FPDF_PAGEOBJECT image_object, FPDF_BITMAP bitmap);\n\n#ifdef __cplusplus\n}\n#endif\n#endif // _FPDFEDIT_H_\n"
  },
  {
    "path": "fpdfsdk/include/fpdfformfill.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n\n#ifndef _FPDFORMFILL_H\n#define _FPDFORMFILL_H\n#include \"fpdfview.h\"\n\ntypedef void* FPDF_FORMHANDLE;\n\n// Exported Functions\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef struct _IPDF_JsPlatform\n{\n/**\n* Version number of the interface. Currently must be 1.\n\t**/\n\tint version;\n\t\n\t/** \n\t* Method: app_alert\n\t*\t\t\tpop up a dialog to show warning or hint.\n\t* Interface Version:\n\t*\t\t\t1\n\t* Implementation Required:\n\t*\t\t\tyes\n\t* Parameters:\n\t*\t\t\tpThis\t\t-\tPointer to the interface structure itself\n\t*\t\t\tMsg\t\t\t-\tA string containing the message to be displayed.\n\t*\t\t\tTitle\t\t-   The title of the dialog.\n\t*\t\t\tType\t\t-\tThe stype of button group. \n\t*\t\t\t\t\t\t\t0-OK(default);\n\t*\t\t\t\t\t\t\t1-OK,Cancel;\n\t*\t\t\t\t\t\t\t2-Yes,NO; \n\t*\t\t\t\t\t\t\t3-Yes, NO, Cancel.\n\t*           nIcon\t\t-   The Icon type. \n\t*\t\t\t\t\t\t\t0-Error(default);\n\t*\t\t\t\t\t\t\t1-Warning;\n\t*\t\t\t\t\t\t\t2-Question;\n\t*\t\t\t\t\t\t\t3-Status.\n\t* Return Value:\n\t*\t\t\tThe return value could be the folowing type:\n\t*\t\t\t\t\t\t\t1-OK;\n\t*\t\t\t\t\t\t\t2-Cancel; \n\t*\t\t\t\t\t\t\t3-NO;\n\t*\t\t\t\t\t\t\t4-Yes;\n\t*/\n\tint (*app_alert)(struct _IPDF_JsPlatform* pThis, FPDF_WIDESTRING Msg, FPDF_WIDESTRING Title, int Type, int Icon);\n\t\n\t/** \n\t* Method: app_beep\n\t*\t\t\tCauses the system to play a sound. \n\t* Interface Version:\n\t*\t\t\t1\n\t* Implementation Required:\n\t*\t\t\tyes\n\t* Parameters:\n\t*\t\t\tpThis\t\t-\tPointer to the interface structure itself\n\t*\t\t\tnType\t\t-\tThe sound type.\n\t*\t\t\t\t\t\t\t0 - Error\n\t*\t\t\t\t\t\t\t1 - Warning\n\t*\t\t\t\t\t\t\t2 - Question\n\t*\t\t\t\t\t\t\t3 - Status\n\t*\t\t\t\t\t\t\t4 - Default (default value)\n\t* Return Value:\n\t*\t\t\tNone\n\t*/\n\tvoid (*app_beep)(struct _IPDF_JsPlatform* pThis,  int nType);\n\t\n\t\n\t/** \n\t* Method: app_response\n\t*\t\t\tDisplays a dialog box containing a question and an entry field for the user to reply to the question.  \n\t* Interface Version:\n\t*\t\t\t1\n\t* Implementation Required:\n\t*\t\t\tyes\n\t* Parameters:\n\t*\t\t\tpThis\t\t-\tPointer to the interface structure itself\n\t*\t\t\tQuestion\t-\tThe question to be posed to the user.\n\t*\t\t\tTitle\t\t-\tThe title of the dialog box.\n\t*\t\t\tDefault\t\t-\tA default value for the answer to the question. If not specified, no default value is presented.\n\t*\t\t\tcLabel\t\t-\tA short string to appear in front of and on the same line as the edit text field. \n\t*\t\t\tbPassword\t-\tIf true, indicates that the user's response should show as asterisks (*) or bullets (?) to mask the response, which might be sensitive information. The default is false.\t\t\n\t*\t\t\tresponse\t-\tA string buffer allocated by SDK, to receive the user's response. \n\t*\t\t\tlength\t\t-   The length of the buffer, number of bytes. Currently, It's always be 2048.\n\t* Return Value:\n\t*\t\t\tNumber of bytes the user input text consumes, not including trailing zeros. If the text exceed 2048 bytes,\n\t*\t\t\tthe exceeded part will be ignored.\n\t* Comments:\n\t*\t\t\tNo matter on what platform, the response should be always input in UTF-16LE encoding.\n\t*\t\t\tThe return value always indicated number of bytes required for the buffer, even when there is\n\t*\t\t\tno buffer specified, or the buffer size is less then required. In this case, the buffer will not\n\t*\t\t\tbe modified.\n\t*/\n\tint (*app_response)(struct _IPDF_JsPlatform* pThis, FPDF_WIDESTRING Question, FPDF_WIDESTRING Title, FPDF_WIDESTRING Default, FPDF_WIDESTRING cLabel, FPDF_BOOL bPassword, void* response, int length);\n\t\n\t\n\t\n\t/*\n\t* Method: Doc_getFilePath\n\t*\t\t\tGet the file path of the current document. \n\t* Interface Version:\n\t*\t\t\t1\n\t* Implementation Required:\n\t*\t\t\tyes\n\t* Parameters:\n\t*\t\t\tpThis\t\t-\tPointer to the interface structure itself\n\t*\t\t\tfilePath\t-\tThe string buffer to receive the file path. Can be NULL.\n\t*\t\t\tlength\t\t-   The length of the buffer, number of bytes. Can be 0.\n\t* Return Value:\n\t*\t\tNumber of bytes the filePath consumes, including trailing zeros.\n\t* Comments:\n\t*\t\tThe filePath should be always input in local encoding.\n\t*\n\t*\t\tThe return value always indicated number of bytes required for the buffer, even when there is\n\t*\t\tno buffer specified, or the buffer size is less then required. In this case, the buffer will not\n\t*\t\tbe modified.\n\t*/\n\tint (*Doc_getFilePath)(struct _IPDF_JsPlatform* pThis, void* filePath, int length);\n\t\n\t\n\t/*\n\t* Method: Doc_mail\n\t*\t\t\tMails the data buffer as an attachment to all recipients, with or without user interaction. \n\t* Interface Version:\n\t*\t\t\t1\n\t* Implementation Required:\n\t*\t\t\tyes\n\t* Parameters:\n\t*\t\t\tpThis\t\t-\tPointer to the interface structure itself\n\t*\t\t\tmailData\t-\tPointer to the data buffer to be sent.Can be NULL.\n\t*\t\t\tlength\t\t-\tThe size,in bytes, of the buffer pointed by mailData parameter.Can be 0.\n\t*\t\t\tbUI\t\t\t-   If true, the rest of the parameters are used in a compose-new-message window that is displayed to the user. If false, the cTo parameter is required and all others are optional.\n\t*\t\t\tTo\t\t\t-\tA semicolon-delimited list of recipients for the message.\n\t*\t\t\tSubject\t\t-   The subject of the message. The length limit is 64 KB.\n\t*\t\t\tCC\t\t\t-\tA semicolon-delimited list of CC recipients for the message. \n\t*\t\t\tBCC\t\t\t-   A semicolon-delimited list of BCC recipients for the message. \n\t*\t\t\tMsg\t\t\t-   The content of the message. The length limit is 64 KB.\n\t* Return Value:\n\t*\t\t\tNone.\n\t* Comments:\n\t*\t\t\tIf the parameter mailData is NULL or length is 0, the current document will be mailed as an attachment to all recipients.\n\t*/\n\tvoid (*Doc_mail)(struct _IPDF_JsPlatform* pThis,void* mailData, int length,FPDF_BOOL bUI, FPDF_WIDESTRING To, FPDF_WIDESTRING Subject, FPDF_WIDESTRING CC, FPDF_WIDESTRING BCC, FPDF_WIDESTRING Msg); \n\t\n\n\t/*\n\t* Method: Doc_print\n\t*\t\t\tPrints all or a specific number of pages of the document.\n\t* Interface Version:\n\t*\t\t\t1\n\t* Implementation Required:\n\t*\t\t\tyes\n\t* Parameters:\n\t*\t\t\tpThis\t\t-\tPointer to the interface structure itself.\n\t*\t\t\tbUI\t\t\t-\tIf true, will cause a UI to be presented to the user to obtain printing information and confirm the action.\n\t*\t\t\tnStart\t\t-\tA 0-based index that defines the start of an inclusive range of pages.\n\t*\t\t\tnEnd\t\t-   A 0-based index that defines the end of an inclusive page range.\n\t*\t\t\tbSilent\t\t-   If true, suppresses the cancel dialog box while the document is printing. The default is false.\n\t*\t\t\tbShrinkToFit\t-\tIf true, the page is shrunk (if necessary) to fit within the imageable area of the printed page.\n\t*\t\t\tbPrintAsImage\t-\tIf true, print pages as an image.\n\t*\t\t\tbReverse\t-\tIf true, print from nEnd to nStart.\n\t*\t\t\tbAnnotations\t-\tIf true (the default), annotations are printed.\n\t*/\n\tvoid (*Doc_print)(struct _IPDF_JsPlatform* pThis, FPDF_BOOL bUI, int nStart, int nEnd, FPDF_BOOL bSilent ,FPDF_BOOL bShrinkToFit,FPDF_BOOL bPrintAsImage ,FPDF_BOOL bReverse ,FPDF_BOOL bAnnotations);\n\n\t/*\n\t* Method: Doc_submitForm\n\t*\t\t\tSend the form data to a specified URL.\n\t* Interface Version:\n\t*\t\t\t1\n\t* Implementation Required:\n\t*\t\t\tyes\n\t* Parameters:\n\t*\t\t\tpThis\t\t-\tPointer to the interface structure itself\n\t*\t\t\tformData\t-\tPointer to the data buffer to be sent.\n\t*\t\t\tlength\t\t-\tThe size,in bytes, of the buffer pointed by formData parameter.\n\t*\t\t\tURL\t\t\t-\tThe URL to send to.\n\t* Return Value:\n\t*\t\t\tNone.\n\t*\n\t*/\n\tvoid (*Doc_submitForm)(struct _IPDF_JsPlatform* pThis,void* formData, int length, FPDF_WIDESTRING URL);\n\t\n\t/*\n\t* Method: Doc_gotoPage\n\t*\t\t\tJump to a specified page.\n\t* Interface Version:\n\t*\t\t\t1\n\t* Implementation Required:\n\t*\t\t\tyes\n\t* Parameters:\n\t*\t\t\tpThis\t\t-\tPointer to the interface structure itself\n\t*\t\t\tnPageNum\t-\tThe specified page number, zero for the first page.\n\t* Return Value:\n\t*\t\t\tNone.\n\t*\n\t*/\n\tvoid (*Doc_gotoPage)(struct _IPDF_JsPlatform* pThis, int nPageNum);\n\t/*\n\t* Method: Field_browse\n\t*\t\t\tShow a file selection dialog, and return the selected file path.\n\t* Interface Version:\n\t*\t\t\t1\n\t* Implementation Required:\n\t*\t\t\tyes\n\t* Parameters:\n\t*\t\t\tpThis\t\t-\tPointer to the interface structure itself.\n\t*\t\t\tfilePath\t-\tPointer to the data buffer to receive the file path.Can be NULL.\n\t*\t\t\tlength\t\t-   The length of the buffer, number of bytes. Can be 0.\n\t* Return Value:\n\t*\t\tNumber of bytes the filePath consumes, including trailing zeros.\n\t* Comments:\n\t*\t\tThe filePath shoule be always input in local encoding.\n\t*/\n\tint  (*Field_browse)(struct _IPDF_JsPlatform* pThis,void* filePath, int length);\n\n\t/**\n\t*\tpointer to FPDF_FORMFILLINFO interface.\n\t**/\n\tvoid*\tm_pFormfillinfo;\n} IPDF_JSPLATFORM;\n\n// Flags for Cursor type\n#define FXCT_ARROW\t0\n#define FXCT_NESW\t1\t\t\n#define FXCT_NWSE\t2\t\t\n#define FXCT_VBEAM\t3\t\t\n#define FXCT_HBEAM\t4\t\n#define FXCT_HAND\t5\n\n/**\n * Declares of a pointer type to the callback function for the FFI_SetTimer method.\n * Parameters:\n *\t\t\tidEvent\t\t-\tIdentifier of the timer. \n * Return value:\n *\t\t\tNone. \n **/\t\ntypedef void\t(*TimerCallback)(int idEvent);\n\n/**\n * Declares of a struct type to the local system time.\n**/\ntypedef struct _FPDF_SYSTEMTIME \n{\n    unsigned short wYear;\t\t\t/* years since 1900 */\n    unsigned short wMonth;\t\t\t/* months since January - [0,11] */\n    unsigned short wDayOfWeek;\t\t/* days since Sunday - [0,6] */\n    unsigned short wDay;\t\t\t/* day of the month - [1,31] */\n    unsigned short wHour;\t\t\t/* hours since midnight - [0,23] */\n    unsigned short wMinute;\t\t\t/* minutes after the hour - [0,59] */\n    unsigned short wSecond;\t\t\t/* seconds after the minute - [0,59] */\n    unsigned short wMilliseconds;\t/* milliseconds after the second - [0,999] */\n}FPDF_SYSTEMTIME;\n\n\ntypedef struct  _FPDF_FORMFILLINFO\n{\n\t/**\n\t * Version number of the interface. Currently must be 1.\n\t **/\n\tint\tversion;\n\n\t\t/** \n\t * Method: Release\n\t *\t\t\tGive implementation a chance to release any data after the interface is no longer used\n\t * Interface Version:\n\t *\t\t\t1\n\t * Implementation Required:\n\t *\t\t\tNo\n\t * Comments:\n\t *\t\t\tCalled by Foxit SDK during the final cleanup process.\n\t * Parameters:\n\t *\t\t\tpThis\t\t-\tPointer to the interface structure itself\n\t * Return Value:\n\t *\t\t\tNone\n\t */\n\n\tvoid (*Release)(struct _FPDF_FORMFILLINFO* pThis);\n\n\t/** \n\t * Method: FFI_Invalidate\n\t *\t\t\tInvalidate the client area within the specified rectangle.\n\t * Interface Version:\n\t *\t\t\t1\n\t * Implementation Required:\n\t\t*\t\t\tyes\n\t * Parameters:\n\t *\t\t\tpThis\t\t-\tPointer to the interface structure itself.\n\t *\t\t\tpage\t\t-\tHandle to the page. Returned by FPDF_LoadPage function.\n\t *\t\t\tleft\t\t-\tLeft position of the client area in PDF page coordinate.\n\t *\t\t\ttop\t\t\t-\tTop  position of the client area in PDF page coordinate.\n\t *\t\t\tright\t\t-\tRight position of the client area in PDF page  coordinate.\n\t *\t\t\tbottom\t\t-\tBottom position of the client area in PDF page coordinate.\n\t * Return Value:\n\t *\t\t\tNone.\n\t *\n\t *comments:\n\t *\t\t\tAll positions are measured in PDF \"user space\".\n\t *\t\t\tImplementation should call FPDF_RenderPageBitmap() function for repainting a specified page area.\n\t*/\n\tvoid (*FFI_Invalidate)(struct _FPDF_FORMFILLINFO* pThis,FPDF_PAGE page, double left, double top, double right, double bottom);\n\t\n\t/** \n\t * Method: FFI_OutputSelectedRect\n\t *\t\t\tWhen user is taking the mouse to select texts on a form field, this callback function will keep \n\t *\t\t\treturning the selected areas to the implementation.\n\t *\n\t * Interface Version:\n\t *\t\t\t1\n\t * Implementation Required:\n\t *\t\t\tNo\n\t * Parameters:\n\t *\t\t\tpThis\t\t-\tPointer to the interface structure itself.\n\t *\t\t\tpage\t\t-\tHandle to the page. Returned by FPDF_LoadPage function.\n\t *\t\t\tleft\t\t-\tLeft position of the client area in PDF page coordinate.\n\t *\t\t\ttop\t\t\t-\tTop  position of the client area in PDF page coordinate.\n\t *\t\t\tright\t\t-\tRight position of the client area in PDF page  coordinate.\n\t *\t\t\tbottom\t\t-\tBottom position of the client area in PDF page coordinate.\n\t * Return Value:\n\t *\t\t\tNone.\n\t *\n\t * comments:\n\t *\t\t\tThis CALLBACK function is useful for implementing special text selection effect. Implementation should\n\t *\t\t\tfirst records the returned rectangles, then draw them one by one at the painting period, last,remove all \n\t *\t\t\tthe recorded rectangles when finish painting.\n\t*/\n\tvoid (*FFI_OutputSelectedRect)(struct _FPDF_FORMFILLINFO* pThis,FPDF_PAGE page, double left, double top, double right, double bottom);\n\n\t/** \n\t* Method: FFI_SetCursor\n\t*\t\t\tSet the Cursor shape.\n\t* Interface Version:\n\t*\t\t\t1\n\t* Implementation Required:\n\t*\t\t\tyes\n\t* Parameters:\n\t*\t\tpThis\t\t-\tPointer to the interface structure itself.\n\t* \t\tnCursorType\t-\tCursor type. see Flags for Cursor type for the details.\n\t* \tReturn value:\n\t* \t\tNone.\n\t* */\n\tvoid (*FFI_SetCursor)(struct _FPDF_FORMFILLINFO* pThis, int nCursorType);\n\n\t/** \n\t* Method: FFI_SetTimer\n\t*\t\t\tThis method installs a system timer. A time-out value is specified, \n\t*\t\t\tand every time a time-out occurs, the system passes a message to\n\t*\t\t\tthe TimerProc callback function. \n\t* Interface Version:\n\t*\t\t\t1\n\t* Implementation Required:\n\t*\t\t\tyes\n\t* Parameters:\n\t*\t\tpThis\t\t-\tPointer to the interface structure itself.\n\t* \t\tuElapse\t\t-\tSpecifies the time-out value, in milliseconds.\n\t* \t\tlpTimerFunc\t-\tA pointer to the callback function-TimerCallback.\n\t* \tReturn value:\n\t* \t\tThe timer identifier of the new timer if the function is successful.\n\t*\t\tAn application passes this value to the FFI_KillTimer method to kill \n\t*\t\tthe timer. Nonzero if it is successful; otherwise, it is zero.\n\t* */\n\tint  (*FFI_SetTimer)(struct _FPDF_FORMFILLINFO* pThis, int uElapse, TimerCallback lpTimerFunc);\n\n\t/** \n\t* Method: FFI_KillTimer\n\t*\t\t\tThis method kills the timer event identified by nIDEvent, set by an earlier call to FFI_SetTimer. \n\t* Interface Version:\n\t*\t\t\t1\n\t* Implementation Required:\n\t*\t\t\tyes\n\t* Parameters:\n\t*\t\tpThis\t\t-\tPointer to the interface structure itself.\n\t* \t\tnTimerID\t-\tThe timer ID return by FFI_SetTimer function.\n\t* \tReturn value:\n\t* \t\tNone.\n\t* */\n\tvoid (*FFI_KillTimer)(struct _FPDF_FORMFILLINFO* pThis, int nTimerID);\n\n\n\t/** \n\t* Method: FFI_GetLocalTime\n\t*\t\t\tThis method receives the current local time on the system. \n\t* Interface Version:\n\t*\t\t\t1\n\t* Implementation Required:\n\t*\t\t\tyes\n\t* Parameters:\n\t*\t\tpThis\t\t-\tPointer to the interface structure itself.\n\t* \tReturn value:\n\t* \t\tNone.\n\t* */\n\tFPDF_SYSTEMTIME (*FFI_GetLocalTime)(struct _FPDF_FORMFILLINFO* pThis);\n\n\t/** \n\t* Method: FFI_OnChange\n\t*\t\t\tThis method will be invoked to notify implementation when the value of any FormField on the document had been changed.\n\t* Interface Version:\n\t*\t\t\t1\n\t* Implementation Required:\n\t*\t\t\tno\n\t* Parameters:\n\t*\t\tpThis\t\t-\tPointer to the interface structure itself.\n\t* \tReturn value:\n\t* \t\tNone.\n\t* */\n\tvoid (*FFI_OnChange)(struct _FPDF_FORMFILLINFO* pThis);\n\n\t/** \n\t* Method: FFI_GetPage\n\t*\t\t\tThis method receives the page pointer associated with a specified page index.\n\t* Interface Version:\n\t*\t\t\t1\n\t* Implementation Required:\n\t*\t\t\tyes\n\t* Parameters:\n\t*\t\tpThis\t\t-\tPointer to the interface structure itself.\n\t*\t\tdocument\t-\tHandle to document. Returned by FPDF_LoadDocument function.\n\t*\t\tnPageIndex  -\tIndex number of the page. 0 for the first page.\n\t* Return value:\n\t* \t\tHandle to the page. Returned by FPDF_LoadPage function.\n\t* Comments:\n\t*\t\tIn some cases, the document-level JavaScript action may refer to a page which hadn't been loaded yet.\n\t*\t\tTo successfully run the javascript action, implementation need to load the page for SDK.\n\t* */\n\tFPDF_PAGE\t(*FFI_GetPage)(struct _FPDF_FORMFILLINFO* pThis, FPDF_DOCUMENT document, int nPageIndex);\n\n\t/** \n\t* Method: FFI_GetCurrentPage\n\t*\t\tThis method receives the current page pointer.\n\t* Interface Version:\n\t*\t\t\t1\n\t* Implementation Required:\n\t*\t\t\tyes\n\t* Parameters:\n\t*\t\tpThis\t\t-\tPointer to the interface structure itself.\n\t*\t\tdocument\t-\tHandle to document. Returned by FPDF_LoadDocument function.\n\t* Return value:\n\t* \t\tHandle to the page. Returned by FPDF_LoadPage function.\n\t* */\n\tFPDF_PAGE\t(*FFI_GetCurrentPage)(struct _FPDF_FORMFILLINFO* pThis, FPDF_DOCUMENT document);\n\n\t/** \n\t* Method: FFI_GetRotation\n\t*\t\t\tThis method receives currently rotation of the page view.\n\t* Interface Version:\n\t*\t\t\t1\n\t* Implementation Required:\n\t*\t\t\tyes\n\t* Parameters:\n\t*\t\tpThis\t\t-\tPointer to the interface structure itself.\n\t*\t\tpage\t\t-\tHandle to page. Returned by FPDF_LoadPage function.\n\t* Return value:\n\t* \t\tThe page rotation. Should be 0(0 degree),1(90 degree),2(180 degree),3(270 degree), in a clockwise direction.\n\t* */\n\tint \t(*FFI_GetRotation)(struct _FPDF_FORMFILLINFO* pThis, FPDF_PAGE page);\n\n\t/** \n\t* Method: FFI_ExecuteNamedAction\n\t*\t\t\tThis method will execute an named action.\n\t* Interface Version:\n\t*\t\t\t1\n\t* Implementation Required:\n\t*\t\t\tyes\n\t* Parameters:\n\t*\t\tpThis\t\t\t-\tPointer to the interface structure itself.\n\t*\t\tnamedAction\t\t-\tA byte string which indicates the named action, terminated by 0.\n\t* Return value:\n\t* \t\tNone.\n\t* Comments:\n\t*\t\tSee the named actions description of <<PDF Reference, version 1.7>> for more details.  \n\t* */\n\tvoid \t(*FFI_ExecuteNamedAction)(struct _FPDF_FORMFILLINFO* pThis, FPDF_BYTESTRING namedAction);\n\t/** \n\t* @brief This method will be called when a text field is getting or losing a focus.\n\t*\n\t* @param[in] pThis\t\tPointer to the interface structure itself.\n\t* @param[in] value\t\tThe string value of the form field, in UTF-16LE format.\n\t* @param[in] valueLen\tThe length of the string value, number of characters (not bytes).\n\t* @param[in] is_focus\tTrue if the form field is getting a focus, False for losing a focus.\n\t*\n\t* @return None.\n\t*\n\t* @note Currently,only support text field and combobox field.\n\t* */\n\tvoid\t(*FFI_SetTextFieldFocus)(struct _FPDF_FORMFILLINFO* pThis, FPDF_WIDESTRING value, FPDF_DWORD valueLen, FPDF_BOOL is_focus);\n\n\t\n\t/** \n\t* Method: FFI_DoURIAction\n\t*\t\t\tThis action resolves to a uniform resource identifier. \n\t* Interface Version:\n\t*\t\t\t1\n\t* Implementation Required:\n\t*\t\t\tNo\n\t* Parameters:\n\t*\t\tpThis\t\t\t-\tPointer to the interface structure itself.\n\t*\t\tbsURI\t\t\t-\tA byte string which indicates the uniform resource identifier, terminated by 0.\n\t* Return value:\n\t* \t\tNone.\n\t* Comments:\n\t*\t\tSee the URI actions description of <<PDF Reference, version 1.7>> for more details.  \n\t* */\n\tvoid\t(*FFI_DoURIAction)(struct _FPDF_FORMFILLINFO* pThis, FPDF_BYTESTRING bsURI);\n\t\n\t/** \n\t* Method: FFI_DoGoToAction\n\t*\t\t\tThis action changes the view to a specified destination.\n\t* Interface Version:\n\t*\t\t\t1\n\t* Implementation Required:\n\t*\t\t\tNo\n\t* Parameters:\n\t*\t\tpThis\t\t\t-\tPointer to the interface structure itself.\n\t*\t\tnPageIndex\t\t-\tThe index of the PDF page.\n\t*\t\tzoomMode\t\t-\tThe zoom mode for viewing page.See Macros \"PDFZOOM_XXX\" defined in \"fpdfdoc.h\". \n\t*\t\tfPosArray\t\t-\tThe float array which carries the position info.\n\t*\t\tsizeofArray\t\t-\tThe size of float array.\n\t* Return value:\n\t* \t\tNone.\n\t* Comments:\n\t*\t\tSee the Destinations description of <<PDF Reference, version 1.7>> in 8.2.1 for more details.  \n\t**/\n\tvoid\t(*FFI_DoGoToAction)(struct _FPDF_FORMFILLINFO* pThis, int nPageIndex, int zoomMode, float* fPosArray, int sizeofArray);\n\t/**\n\t*\tpointer to IPDF_JSPLATFORM interface\n\t**/\n\tIPDF_JSPLATFORM*\tm_pJsPlatform;\n\n} FPDF_FORMFILLINFO;\n\n\n\n/**\n * Function: FPDFDOC_InitFormFillEnviroument\n *\t\t\tInit form fill environment. \n * Comments:\n *\t\t\tThis function should be called before any form fill operation.\n * Parameters:\n *\t\t\tdocument\t\t-\tHandle to document. Returned by FPDF_LoadDocument function.\n *\t\t\tpFormFillInfo\t-\tPointer to a FPDF_FORMFILLINFO structure.\n * Return Value:\n *\t\t\tReturn handler to the form fill module. NULL means fails. \n **/\nDLLEXPORT FPDF_FORMHANDLE STDCALL FPDFDOC_InitFormFillEnviroument(FPDF_DOCUMENT document, FPDF_FORMFILLINFO* formInfo);\n\n/**\n * Function: FPDFDOC_ExitFormFillEnviroument\n *\t\t\tExit form fill environment. \n * Parameters:\n *\t\t\thHandle\t\t-\tHandle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.\n * Return Value:\n *\t\t\tNULL.\n **/\nDLLEXPORT void STDCALL FPDFDOC_ExitFormFillEnviroument(FPDF_FORMHANDLE hHandle);\n\n/**\n * Function: FORM_OnAfterLoadPage\n *\t\t\tThis method is required for implementing all the form related functions. Should be invoked after user \n *\t\t\tsuccessfully loaded a PDF page, and method FPDFDOC_InitFormFillEnviroument had been invoked.\n * Parameters:\n *\t\t\thHandle\t\t-\tHandle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.\n * Return Value:\n *\t\t\tNONE.\n **/\nDLLEXPORT void STDCALL FORM_OnAfterLoadPage(FPDF_PAGE page, FPDF_FORMHANDLE hHandle);\n\n/**\n * Function: FORM_OnBeforeClosePage\n *\t\t\tThis method is required for implementing all the form related functions. Should be invoked before user \n *\t\t\tclose the PDF page.\n * Parameters:\n *\t\t\tpage\t\t-\tHandle to the page. Returned by FPDF_LoadPage function.\n *\t\t\thHandle\t\t-\tHandle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.\n * Return Value:\n *\t\t\tNONE.\n **/\nDLLEXPORT void STDCALL FORM_OnBeforeClosePage(FPDF_PAGE page, FPDF_FORMHANDLE hHandle);\n\n/**\n* Function: FORM_DoDocumentJSAction\n*\t\t\tThis method is required for performing Document-level JavaScript action. It should be invoked after the PDF document\n*\t\t\thad been loaded.\n* Parameters:\n*\t\t\thHandle\t\t-\tHandle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.\n* Return Value:\n*\t\t\tNONE\n* Comments:\n*\t\t\tIf there is Document-level JavaScript action embedded in the document, this method will execute the javascript action;\n*\t\t\totherwise, the method will do nothing.\n**/\nDLLEXPORT void STDCALL FORM_DoDocumentJSAction(FPDF_FORMHANDLE hHandle);\n\n\n/**\n* Function: FORM_DoDocumentOpenAction\n*\t\t\tThis method is required for performing open-action when the document is opened.\n* Parameters:\n*\t\t\thHandle\t\t-\tHandle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.\n* Return Value:\n*\t\t\tNONE\n* Comments:\n*\t\t\tThis method will do nothing if there is no open-actions embedded in the document. \n**/\nDLLEXPORT void STDCALL FORM_DoDocumentOpenAction(FPDF_FORMHANDLE hHandle);\n\n\n// additional actions type of document.\n#define FPDFDOC_AACTION_WC\t\t0x10\t\t//WC, before closing document, JavaScript action.\n#define FPDFDOC_AACTION_WS\t\t0x11\t\t//WS, before saving document, JavaScript action.\n#define FPDFDOC_AACTION_DS\t\t0x12\t\t//DS, after saving document, JavaScript action.\n#define FPDFDOC_AACTION_WP\t\t0x13\t\t//WP, before printing document, JavaScript action.\n#define FPDFDOC_AACTION_DP\t\t0x14\t\t//DP, after printing document, JavaScript action. \n/**\n* Function: FORM_DoDocumentAAction\n*\t\t\tThis method is required for performing the document's additional-action.\n* Parameters:\n*\t\t\thHandle\t\t-\tHandle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.\n*\t\t\taaType\t    -   The type of the additional-actions which defined above.\n* Return Value:\n*\t\t\tNONE\n* Comments:\n*\t\t\tThis method will do nothing if there is no document additional-action corresponding to the specified aaType.\n**/\n\nDLLEXPORT void STDCALL FORM_DoDocumentAAction(FPDF_FORMHANDLE hHandle, int aaType);\n\n// Additional-action types of page object\n#define FPDFPAGE_AACTION_OPEN\t\t0\t\t// /O -- An action to be performed when the page is opened\n#define FPDFPAGE_AACTION_CLOSE\t\t1\t\t// /C -- An action to be performed when the page is closed\n\n/**\n* Function: FORM_DoPageAAction\n*\t\t\tThis method is required for performing the page object's additional-action when opened or closed.\n* Parameters:\n*\t\t\tpage\t\t-\tHandle to the page. Returned by FPDF_LoadPage function.\n*\t\t\thHandle\t\t-\tHandle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.\n*\t\t\taaType\t    -   The type of the page object's additional-actions which defined above.\n* Return Value:\n*\t\t\tNONE\n* Comments:\n*\t\t\tThis method will do nothing if no additional-action corresponding to the specified aaType exists.\n**/\nDLLEXPORT void STDCALL FORM_DoPageAAction(FPDF_PAGE page, FPDF_FORMHANDLE hHandle, int aaType);\n\n/**\n * Function: FORM_OnMouseMove\n *\t\t\tYou can call this member function when the mouse cursor moves. \n * Parameters:\n *\t\t\thHandle\t\t-\tHandle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.\n *\t\t\tpage\t\t-\tHandle to the page. Returned by FPDF_LoadPage function.\n *\t\t\tmodifier\t\t-\tIndicates whether various virtual keys are down. \n *\t\t\tpage_x\t\t-\tSpecifies the x-coordinate of the cursor in PDF user space. \n *\t\t\tpage_y\t\t-\tSpecifies the y-coordinate of the cursor in PDF user space.\n * Return Value:\n *\t\t\tTRUE indicates success; otherwise false.\n **/\nDLLEXPORT FPDF_BOOL STDCALL FORM_OnMouseMove(FPDF_FORMHANDLE hHandle,FPDF_PAGE page, int modifier, double page_x, double page_y);\n\n/**\n * Function: FORM_OnLButtonDown\n *\t\t\tYou can call this member function when the user presses the left mouse button.\n * Parameters:\n *\t\t\thHandle\t\t-\tHandle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.\n *\t\t\tpage\t\t-\tHandle to the page. Returned by FPDF_LoadPage function.\n *\t\t\tmodifier\t\t-\tIndicates whether various virtual keys are down. \n *\t\t\tpage_x\t\t-\tSpecifies the x-coordinate of the cursor in PDF user space. \n *\t\t\tpage_y\t\t-\tSpecifies the y-coordinate of the cursor in PDF user space.\n * Return Value:\n *\t\t\tTRUE indicates success; otherwise false.\n **/\nDLLEXPORT FPDF_BOOL STDCALL FORM_OnLButtonDown(FPDF_FORMHANDLE hHandle,FPDF_PAGE page, int modifier, double page_x, double page_y);\n\n/**\n * Function: FORM_OnLButtonUp\n *\t\t\tYou can call this member function when the user releases the left mouse button.\n * Parameters:\n *\t\t\thHandle\t\t-\tHandle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.\n *\t\t\tpage\t\t-\tHandle to the page. Returned by FPDF_LoadPage function.\n *\t\t\tmodifier\t-\tIndicates whether various virtual keys are down. \n *\t\t\tpage_x\t\t-\tSpecifies the x-coordinate of the cursor in device. \n *\t\t\tpage_y\t\t-\tSpecifies the y-coordinate of the cursor in device.\n * Return Value:\n *\t\t\tTRUE indicates success; otherwise false.\n **/\nDLLEXPORT FPDF_BOOL STDCALL FORM_OnLButtonUp(FPDF_FORMHANDLE hHandle,FPDF_PAGE page, int modifier, double page_x, double page_y);\n\n/**\n * Function: FORM_OnKeyDown\n *\t\t\tYou can call this member function when a nonsystem key is pressed. \n * Parameters:\n *\t\t\thHandle\t\t-\tHandle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.\n *\t\t\tpage\t\t-\tHandle to the page. Returned by FPDF_LoadPage function.\n *\t\t\tnKeyCode\t-\tIndicates whether various virtual keys are down. \n *\t\t\tmodifier\t-\tContains the scan code, key-transition code, previous key state, and context code.\n * Return Value:\n *\t\t\tTRUE indicates success; otherwise false.\n **/\nDLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyDown(FPDF_FORMHANDLE hHandle,FPDF_PAGE page, int nKeyCode, int modifier);\n\n/**\n * Function: FORM_OnKeyUp\n *\t\t\tYou can call this member function when a nonsystem key is released. \n * Parameters:\n *\t\t\thHandle\t\t-\tHandle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.\n *\t\t\tpage\t\t-\tHandle to the page. Returned by FPDF_LoadPage function.\n *\t\t\tnKeyCode\t-\tThe virtual-key code of the given key.\n *\t\t\tmodifier\t-\tContains the scan code, key-transition code, previous key state, and context code.\n * Return Value:\n *\t\t\tTRUE indicates success; otherwise false.\n **/\nDLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyUp(FPDF_FORMHANDLE hHandle,FPDF_PAGE page, int nKeyCode, int modifier);\n\n/**\n * Function: FORM_OnChar\n *\t\t\tYou can call this member function when a keystroke translates to a nonsystem character.\n * Parameters:\n *\t\t\thHandle\t\t-\tHandle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.\n *\t\t\tpage\t\t-\tHandle to the page. Returned by FPDF_LoadPage function.\n *\t\t\tnChar\t\t-\tThe character code value of the key.  \n *\t\t\tmodifier\t-\tContains the scan code, key-transition code, previous key state, and context code.\n * Return Value:\n *\t\t\tTRUE indicates success; otherwise false.\n **/\nDLLEXPORT FPDF_BOOL STDCALL FORM_OnChar(FPDF_FORMHANDLE hHandle,FPDF_PAGE page, int nChar, int modifier);\n\n/**\n * Function: FORM_ForceToKillFocus.\n *\t\t\tYou can call this member function to force to kill the focus of the form field which got focus.\n *\t\t\tIt would kill the focus on the form field, save the value of form field if it's changed by user.\n * Parameters:\n *\t\t\thHandle\t\t-\tHandle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.\n * Return Value:\n *\t\t\tTRUE indicates success; otherwise false.\n **/\nDLLEXPORT FPDF_BOOL STDCALL FORM_ForceToKillFocus(FPDF_FORMHANDLE hHandle);\n\n// Field Types\n#define FPDF_FORMFIELD_UNKNOWN\t\t0\t\t// Unknown.\n#define FPDF_FORMFIELD_PUSHBUTTON\t1\t\t// push button type.\n#define FPDF_FORMFIELD_CHECKBOX\t\t2\t\t// check box type.\n#define FPDF_FORMFIELD_RADIOBUTTON\t3\t\t// radio button type.\n#define FPDF_FORMFIELD_COMBOBOX\t\t4\t\t// combo box type.\n#define FPDF_FORMFIELD_LISTBOX\t\t5\t\t// list box type.\n#define FPDF_FORMFIELD_TEXTFIELD\t6\t\t// text field type.\n\n/**\n * Function: FPDPage_HasFormFieldAtPoint\n *\t\t\tCheck the form filed position by point.\n * Parameters:\n *\t\t\thHandle\t\t-\tHandle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.\n *\t\t\tpage\t\t-\tHandle to the page. Returned by FPDF_LoadPage function.\n *\t\t\tpage_x\t\t-\tX position in PDF \"user space\".\n *\t\t\tpage_y\t\t-\tY position in PDF \"user space\".\n * Return Value:\n *\t\t\tReturn the type of the formfiled; -1 indicates no fields.\n **/\nDLLEXPORT int STDCALL FPDPage_HasFormFieldAtPoint(FPDF_FORMHANDLE hHandle,FPDF_PAGE page,double page_x, double page_y);\n\n/**\n * Function: FPDF_SetFormFieldHighlightColor\n *\t\t\tSet the highlight color of specified or all the form fields in the document.\n * Parameters:\n *\t\t\thHandle\t\t-\tHandle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.\n *\t\t\tdoc\t\t\t-\tHandle to the document. Returned by FPDF_LoadDocument function.\n *\t\t\tfieldType\t-\tA 32-bit integer indicating the type of a form field(defined above).\n *\t\t\tcolor\t\t-\tThe highlight color of the form field.Constructed by 0xxxrrggbb.\n * Return Value:\n *\t\t\tNONE.\n * Comments:\n *\t\t\tWhen the parameter fieldType is set to zero, the highlight color will be applied to all the form fields in the \n *\t\t\tdocument.\n *\t\t\tPlease refresh the client window to show the highlight immediately if necessary.\n **/\nDLLEXPORT void STDCALL FPDF_SetFormFieldHighlightColor(FPDF_FORMHANDLE hHandle, int fieldType, unsigned long color);\n\n/**\n * Function: FPDF_SetFormFieldHighlightAlpha\n *\t\t\tSet the transparency of the form field highlight color in the document.\n * Parameters:\n *\t\t\thHandle\t\t-\tHandle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.\n *\t\t\tdoc\t\t\t-\tHandle to the document. Returned by FPDF_LoadDocument function.\n *\t\t\talpha\t\t-\tThe transparency of the form field highlight color. between 0-255.\n * Return Value:\n *\t\t\tNONE.\n **/\nDLLEXPORT void STDCALL FPDF_SetFormFieldHighlightAlpha(FPDF_FORMHANDLE hHandle, unsigned char alpha);\n\n\n/**\n * Function: FPDF_RemoveFormFieldHighlight\n *\t\t\tRemove the form field highlight color in the document.\n * Parameters:\n *\t\t\thHandle\t\t-\tHandle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.\n * Return Value:\n *\t\t\tNONE.\n * Comments:\n *\t\t\tPlease refresh the client window to remove the highlight immediately if necessary.\n **/\nDLLEXPORT void STDCALL FPDF_RemoveFormFieldHighlight(FPDF_FORMHANDLE hHandle);\n\n/**\n* Function: FPDF_FFLDraw\n*\t\t\tRender FormFeilds on a page to a device independent bitmap. \t\t\t\n* Parameters:\n*\t\t\thHandle\t\t-\tHandle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.\n*\t\t\tbitmap\t\t-\tHandle to the device independent bitmap (as the output buffer).\n*\t\t\t\t\t\t\tBitmap handle can be created by FPDFBitmap_Create function.\n*\t\t\tpage\t\t-\tHandle to the page. Returned by FPDF_LoadPage function.\n*\t\t\tstart_x\t\t-\tLeft pixel position of the display area in the device coordinate.\n*\t\t\tstart_y\t\t-\tTop pixel position of the display area in the device coordinate.\n*\t\t\tsize_x\t\t-\tHorizontal size (in pixels) for displaying the page.\n*\t\t\tsize_y\t\t-\tVertical size (in pixels) for displaying the page.\n*\t\t\trotate\t\t-\tPage orientation: 0 (normal), 1 (rotated 90 degrees clockwise),\n*\t\t\t\t\t\t\t\t2 (rotated 180 degrees), 3 (rotated 90 degrees counter-clockwise).\n*\t\t\tflags\t\t-\t0 for normal display, or combination of flags defined above. \n* Return Value:\n*\t\t\tNone.\n* Comments: \n*\t\t\tThis method is designed to only render annotations and FormFields on the page. \n*\t\t\tWithout FPDF_ANNOT specified for flags, Rendering functions such as FPDF_RenderPageBitmap or FPDF_RenderPageBitmap_Start will only render page contents(without annotations) to a bitmap.\n*\t\t\tIn order to implement the FormFill functions,Implementation should call this method after rendering functions finish rendering the page contents.\n**/\nDLLEXPORT void STDCALL FPDF_FFLDraw(FPDF_FORMHANDLE hHandle,FPDF_BITMAP bitmap, FPDF_PAGE page, int start_x, int start_y, \n\t\t\t\t\t\tint size_x, int size_y, int rotate, int flags);\n\n\n\n#ifdef __cplusplus\n};\n#endif\n\n#endif //_FPDFORMFILL_H\n\n"
  },
  {
    "path": "fpdfsdk/include/fpdfoom.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDFOOM_H_\n#define _FPDFOOM_H_\n\n#ifndef _FPDFVIEW_H_\n#include \"fpdfview.h\"\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef\tstruct _OOM_INFO\n{\n\t/**\n\t* Version number of the interface. Currently must be 1.\n\t**/\n\tint version;\n\t\n\t/** \n\t* Method: FSDK_OOM_Handler\n\t*\t\t\t Out-Of-Memory handling function.\n\t* Interface Version:\n\t*\t\t\t1\n\t* Implementation Required:\n\t*\t\t\tYes\n\t* Parameters:\n\t*\t\tpThis\t\t-\tPointer to the interface structure itself.\n\t* \tReturn value:\n\t* \t\tNone.\n\t* */\n\n\tvoid(*FSDK_OOM_Handler)(_OOM_INFO* pThis);\n}OOM_INFO;\n\n\n/**\n * Function: FSDK_SetOOMHandler\n *\t\t\t Setup A Out-Of-Memory handler for foxit sdk. \n * Parameters:\n *\t\t\toomInfo\t\t-\tPointer to a OOM_INFO structure.\n * Return Value:\n *\t\t\tTRUE means successful. FALSE means fails. \n **/\n\nDLLEXPORT FPDF_BOOL STDCALL FSDK_SetOOMHandler(OOM_INFO* oomInfo);\n\n\n#ifdef __cplusplus\n};\n#endif\n\n\n\n\n#endif\n"
  },
  {
    "path": "fpdfsdk/include/fpdfppo.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDFPPO_H_\n#define _FPDFPPO_H_\n\n#include \"fpdfview.h\"\n\n// Function: FPDF_ImportPages\n//\t\t\tImport some pages to a PDF document.\n// Parameters:\t\n//\t\t\tdest_doc\t-\tThe destination document which add the pages.\n//\t\t\tsrc_doc\t\t-\tA document to be imported.\n//\t\t\tpagerange\t-\tA page range string, Such as \"1,3,5-7\". \n//\t\t\t\t\t\t\tIf this parameter is NULL, it would import all pages in src_doc.\n//\t\t\tindex\t\t-\tThe page index wanted to insert from.\t\n// Return value:\n//\t\t\tTRUE for succeed, FALSE for Failed.\t\nDLLEXPORT FPDF_BOOL STDCALL FPDF_ImportPages(FPDF_DOCUMENT dest_doc,FPDF_DOCUMENT src_doc, FPDF_BYTESTRING pagerange, int index);\n\n\n// Function: FPDF_CopyViewerPreferences\n//\t\t\tCopy the viewer preferences from one PDF document to another.#endif\n// Parameters:\t\n//\t\t\tdest_doc\t-\tHandle to document to write the viewer preferences to.\n//\t\t\tsrc_doc\t\t-\tHandle to document with the viewer preferences.\n// Return value:\n//\t\t\tTRUE for success, FALSE for failure.\nDLLEXPORT FPDF_BOOL STDCALL FPDF_CopyViewerPreferences(FPDF_DOCUMENT dest_doc, FPDF_DOCUMENT src_doc);\n#endif\n\n"
  },
  {
    "path": "fpdfsdk/include/fpdfsave.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDFSAVE_H_\n#define _FPDFSAVE_H_\n\n#include \"fpdfview.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n// Structure for custom file write\nstruct FPDF_FILEWRITE{\n\n\t//\n\t//Version number of the interface. Currently must be 1.\n\t//\n\tint version;\n\n\t// \n\t// Method: WriteBlock\n\t//\t\t\tOutput a block of data in your custom way.\n\t// Interface Version:\n\t//\t\t\t1\n\t// Implementation Required:\n\t//\t\t\tYes\n\t// Comments:\n\t//\t\t\tCalled by function FPDF_SaveDocument\n\t// Parameters:\n\t//\t\t\tpThis\t\t-\tPointer to the structure itself\n\t//\t\t\tpData\t\t-\tPointer to a buffer to output\n\t//\t\t\tsize\t\t-\tThe size of the buffer.\n\t// Return value:\n\t//\t\t\tShould be non-zero if successful, zero for error.\n\t//\n\tint\t\t(*WriteBlock)( FPDF_FILEWRITE* pThis, const void* pData, unsigned long size);\n\n};\n\n\n/** @brief Incremental. */\n#define FPDF_INCREMENTAL\t\t1\n/** @brief No Incremental. */\n#define FPDF_NO_INCREMENTAL\t\t2\n/** @brief Remove security. */\n#define FPDF_REMOVE_SECURITY\t3\n\n// Function: FPDF_SaveAsCopy\n//\t\t\tSaves the copy of specified document in custom way.\n// Parameters:\t\n//\t\t\tdocument\t\t-\tHandle to document. Returned by FPDF_LoadDocument and FPDF_CreateNewDocument.\n//\t\t\tpFileWrite\t\t-\tA pointer to a custom file write structure.\n//\t\t\tflags\t\t\t-\tThe creating flags.\n// Return value:\n//\t\t\tTRUE for succeed, FALSE for failed.\n//\nDLLEXPORT FPDF_BOOL STDCALL FPDF_SaveAsCopy(\tFPDF_DOCUMENT document,FPDF_FILEWRITE * pFileWrite,\n\t\t\t\t\t\t\t\t\t\t\t\tFPDF_DWORD flags );\n\n// Function: FPDF_SaveWithVersion\n//\t\t\tSame as function ::FPDF_SaveAsCopy, except the file version of the saved document could be specified by user.\n// Parameters:\t\n//\t\t\tdocument\t\t-\tHandle to document.\n//\t\t\tpFileWrite\t\t-\tA pointer to a custom file write structure.\n//\t\t\tflags\t\t\t-\tThe creating flags.\n//\t\t\tfileVersion\t\t-\tThe PDF file version. File version: 14 for 1.4, 15 for 1.5, ...\n// Return value:\n//\t\t\tTRUE if succeed, FALSE if failed.\n//\nDLLEXPORT FPDF_BOOL STDCALL FPDF_SaveWithVersion(FPDF_DOCUMENT document,FPDF_FILEWRITE * pFileWrite,\n\tFPDF_DWORD flags, int fileVersion);\n\n#ifdef __cplusplus\n};\n#endif\n\n#endif //_FPDFSAVE_H_\n"
  },
  {
    "path": "fpdfsdk/include/fpdftext.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDFTEXT_H_\n#define _FPDFTEXT_H_\n\n#include \"fpdfview.h\"\n\n// Exported Functions\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// Function: FPDFText_LoadPage\n//\t\t\tPrepare information about all characters in a page.\n// Parameters: \n//\t\t\tpage\t-\tHandle to the page. Returned by FPDF_LoadPage function (in FPDFVIEW module).\t\n// Return value:\n//\t\t\tA handle to the text page information structure.\n//\t\t\tNULL if something goes wrong.\n// Comments:\n//\t\t\tApplication must call FPDFText_ClosePage to release the text page information.\n//\t\t\tIf you don't purchase Text Module , this function will return NULL.\n//\t\nDLLEXPORT FPDF_TEXTPAGE\tSTDCALL FPDFText_LoadPage(FPDF_PAGE page);\n\n// Function: FPDFText_ClosePage\n//\t\t\tRelease all resources allocated for a text page information structure.\n// Parameters: \n//\t\t\ttext_page\t-\tHandle to a text page information structure. Returned by FPDFText_LoadPage function.\n// Return Value:\n//\t\t\tNone.\n//\nDLLEXPORT void STDCALL FPDFText_ClosePage(FPDF_TEXTPAGE text_page);\n\t\n// Function: FPDFText_CountChars\n//\t\t\tGet number of characters in a page.\n// Parameters: \n//\t\t\ttext_page\t-\tHandle to a text page information structure. Returned by FPDFText_LoadPage function.\n// Return value:\n//\t\t\tNumber of characters in the page. Return -1 for error. \n//\t\t\tGenerated characters, like additional space characters, new line characters, are also counted.\n// Comments:\n//\t\t\tCharacters in a page form a \"stream\", inside the stream, each character has an index.\n//\t\t\tWe will use the index parameters in many of FPDFTEXT functions. The first character in the page\n//\t\t\thas an index value of zero.\n//\nDLLEXPORT int STDCALL FPDFText_CountChars(FPDF_TEXTPAGE text_page);\n\n// Function: FPDFText_GetUnicode\n//\t\t\tGet Unicode of a character in a page.\n// Parameters: \n//\t\t\ttext_page\t-\tHandle to a text page information structure. Returned by FPDFText_LoadPage function.\n//\t\t\tindex\t\t-\tZero-based index of the character.\n// Return value:\n//\t\t\tThe Unicode of the particular character.\n//\t\t\tIf a character is not encoded in Unicode and Foxit engine can't convert to Unicode,\n//\t\t\tthe return value will be zero.\n//\nDLLEXPORT unsigned int STDCALL FPDFText_GetUnicode(FPDF_TEXTPAGE text_page, int index);\n\n// Function: FPDFText_GetFontSize\n//\t\t\tGet the font size of a particular character.\n// Parameters: \n//\t\t\ttext_page\t-\tHandle to a text page information structure. Returned by FPDFText_LoadPage function.\n//\t\t\tindex\t\t-\tZero-based index of the character.\n// Return value:\n//\t\t\tThe font size of the particular character, measured in points (about 1/72 inch).\n//\t\t\tThis is the typographic size of the font (so called \"em size\").\n//\nDLLEXPORT double STDCALL FPDFText_GetFontSize(FPDF_TEXTPAGE text_page, int index);\n\n// Function: FPDFText_GetCharBox\n//\t\t\tGet bounding box of a particular character.\n// Parameters: \n//\t\t\ttext_page\t-\tHandle to a text page information structure. Returned by FPDFText_LoadPage function.\n//\t\t\tindex\t\t-\tZero-based index of the character.\n//\t\t\tleft\t\t-\tPointer to a double number receiving left position of the character box.\n//\t\t\tright\t\t-\tPointer to a double number receiving right position of the character box.\n//\t\t\tbottom\t\t-\tPointer to a double number receiving bottom position of the character box.\n//\t\t\ttop\t\t\t-\tPointer to a double number receiving top position of the character box.\n// Return Value:\n//\t\t\tNone.\n// Comments:\n//\t\t\tAll positions are measured in PDF \"user space\".\n//\nDLLEXPORT void STDCALL FPDFText_GetCharBox(FPDF_TEXTPAGE text_page, int index, double* left,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdouble* right, double* bottom, double* top);\n\n// Function: FPDFText_GetCharIndexAtPos\n//\t\t\tGet the index of a character at or nearby a certain position on the page.\n// Parameters:\n//\t\t\ttext_page\t-\tHandle to a text page information structure. Returned by FPDFText_LoadPage function.\n//\t\t\tx\t\t\t-\tX position in PDF \"user space\".\n//\t\t\ty\t\t\t-\tY position in PDF \"user space\".\n//\t\t\txTolerance\t-\tAn x-axis tolerance value for character hit detection, in point unit.\n//\t\t\tyTolerance\t-\tA y-axis tolerance value for character hit detection, in point unit.\n// Return Value:\n//\t\t\tThe zero-based index of the character at, or nearby the point (x,y).\n//\t\t\tIf there is no character at or nearby the point, return value will be -1.\n//\t\t\tIf an error occurs, -3 will be returned.\n//\nDLLEXPORT int STDCALL FPDFText_GetCharIndexAtPos(FPDF_TEXTPAGE text_page,\n\t\t\t\t\t\t\t\t\t\t\t\t double x, double y, double xTorelance, double yTolerance);\n\n// Function: FPDFText_GetText\n//\t\t\tExtract unicode text string from the page.\n// Parameters:\n//\t\t\ttext_page\t-\tHandle to a text page information structure. Returned by FPDFText_LoadPage function.\n//\t\t\tstart_index\t-\tIndex for the start characters.\n//\t\t\tcount\t\t-\tNumber of characters to be extracted.\n//\t\t\tresult\t\t-\tA buffer (allocated by application) receiving the extracted unicodes.\n//\t\t\t\t\t\t\tThe size of the buffer must be able to hold the number of characters plus a terminator.\n// Return Value:\n//\t\t\tNumber of characters written into the result buffer, including the trailing terminator.\n// Comments:\n//\t\t\tThis function ignores characters without unicode information.\n//\t\t\t\nDLLEXPORT int STDCALL FPDFText_GetText(FPDF_TEXTPAGE text_page, int start_index, int count, unsigned short* result);\n\n// Function: FPDFText_CountRects\n//\t\t\tCount number of rectangular areas occupied by a segment of texts.\n// Parameters:\n//\t\t\ttext_page\t-\tHandle to a text page information structure. Returned by FPDFText_LoadPage function.\n//\t\t\tstart_index\t-\tIndex for the start characters.\n//\t\t\tcount\t\t-\tNumber of characters.\n// Return value:\n//\t\t\tNumber of rectangles. Zero for error.\n// Comments:\n//\t\t\tThis function, along with FPDFText_GetRect can be used by applications to detect the position\n//\t\t\ton the page for a text segment, so proper areas can be highlighted or something.\n//\t\t\tFPDFTEXT will automatically merge small character boxes into bigger one if those characters\n//\t\t\tare on the same line and use same font settings.\n//\nDLLEXPORT int STDCALL FPDFText_CountRects(FPDF_TEXTPAGE text_page, int start_index, int count);\n\n// Function: FPDFText_GetRect\n//\t\t\tGet a rectangular area from the result generated by FPDFText_CountRects.\n// Parameters:\n//\t\t\ttext_page\t-\tHandle to a text page information structure. Returned by FPDFText_LoadPage function.\n//\t\t\trect_index\t-\tZero-based index for the rectangle.\n//\t\t\tleft\t\t-\tPointer to a double value receiving the rectangle left boundary.\n//\t\t\ttop\t\t\t-\tPointer to a double value receiving the rectangle top boundary.\n//\t\t\tright\t\t-\tPointer to a double value receiving the rectangle right boundary.\n//\t\t\tbottom\t\t-\tPointer to a double value receiving the rectangle bottom boundary.\n// Return Value:\n//\t\t\tNone.\n//\nDLLEXPORT void STDCALL FPDFText_GetRect(FPDF_TEXTPAGE text_page, int rect_index, double* left, double* top,\n\t\t\t\t\t\t\t\t\t\t\tdouble* right, double* bottom);\n\n// Function: FPDFText_GetBoundedText\n//\t\t\tExtract unicode text within a rectangular boundary on the page.\n// Parameters:\n//\t\t\ttext_page\t-\tHandle to a text page information structure. Returned by FPDFText_LoadPage function.\n//\t\t\tleft\t\t-\tLeft boundary.\n//\t\t\ttop\t\t\t-\tTop boundary.\n//\t\t\tright\t\t-\tRight boundary.\n//\t\t\tbottom\t\t-\tBottom boundary.\n//\t\t\tbuffer\t\t-\tA unicode buffer.\n//\t\t\tbuflen\t\t-\tNumber of characters (not bytes) for the buffer, excluding an additional terminator.\n// Return Value:\n//\t\t\tIf buffer is NULL or buflen is zero, return number of characters (not bytes) needed,\n//\t\t\totherwise, return number of characters copied into the buffer.\n//\nDLLEXPORT int STDCALL FPDFText_GetBoundedText(FPDF_TEXTPAGE text_page,double left, double top, \n\t\t\t\t\t\t\t\t\t\t\t  double right, double bottom,unsigned short* buffer,int buflen);\n\n\n// Flags used by FPDFText_FindStart function.\n#define FPDF_MATCHCASE      0x00000001\t\t//If not set, it will not match case by default.\n#define FPDF_MATCHWHOLEWORD 0x00000002\t\t//If not set, it will not match the whole word by default.\n\n// Function: FPDFText_FindStart\n//\t\t\tStart a search.\n// Parameters:\n//\t\t\ttext_page\t-\tHandle to a text page information structure. Returned by FPDFText_LoadPage function.\n//\t\t\tfindwhat\t-\tA unicode match pattern.\n//\t\t\tflags\t\t-\tOption flags.\n//\t\t\tstart_index\t-\tStart from this character. -1 for end of the page.\n// Return Value:\n//\t\t\tA handle for the search context. FPDFText_FindClose must be called to release this handle.\n//\nDLLEXPORT FPDF_SCHHANDLE STDCALL FPDFText_FindStart(FPDF_TEXTPAGE text_page, FPDF_WIDESTRING findwhat,\n\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned long flags, int start_index);\n\n// Function: FPDFText_FindNext\n//\t\t\tSearch in the direction from page start to end.\n// Parameters:\n//\t\t\thandle\t\t-\tA search context handle returned by FPDFText_FindStart.\n// Return Value:\n//\t\t\tWhether a match is found.\n//\nDLLEXPORT FPDF_BOOL STDCALL FPDFText_FindNext(FPDF_SCHHANDLE handle);\n\n// Function: FPDFText_FindPrev\n//\t\t\tSearch in the direction from page end to start.\n// Parameters:\n//\t\t\thandle\t\t-\tA search context handle returned by FPDFText_FindStart.\n// Return Value:\n//\t\t\tWhether a match is found.\n//\nDLLEXPORT FPDF_BOOL STDCALL FPDFText_FindPrev(FPDF_SCHHANDLE handle);\n\n// Function: FPDFText_GetSchResultIndex\n//\t\t\tGet the starting character index of the search result.\n// Parameters:\n//\t\t\thandle\t\t-\tA search context handle returned by FPDFText_FindStart.\n// Return Value:\n//\t\t\tIndex for the starting character.\n//\nDLLEXPORT int STDCALL FPDFText_GetSchResultIndex(FPDF_SCHHANDLE handle);\n\n// Function: FPDFText_GetSchCount\n//\t\t\tGet the number of matched characters in the search result.\n// Parameters:\n//\t\t\thandle\t\t-\tA search context handle returned by FPDFText_FindStart.\n// Return Value:\n//\t\t\tNumber of matched characters.\n//\nDLLEXPORT int STDCALL FPDFText_GetSchCount(FPDF_SCHHANDLE handle);\n\n// Function: FPDFText_FindClose\n//\t\t\tRelease a search context.\n// Parameters:\n//\t\t\thandle\t\t-\tA search context handle returned by FPDFText_FindStart.\n// Return Value:\n//\t\t\tNone.\n//\nDLLEXPORT void STDCALL FPDFText_FindClose(FPDF_SCHHANDLE handle);\n\n// Function: FPDFLink_LoadWebLinks\n//\t\t\tPrepare information about weblinks in a page.\n// Parameters:\n//\t\t\ttext_page\t-\tHandle to a text page information structure. Returned by FPDFText_LoadPage function.\n// Return Value:\t\n//\t\t\tA handle to the page's links information structure.\n//\t\t\tNULL if something goes wrong.\n// Comments:\n//\t\t\tWeblinks are those links implicitly embedded in PDF pages. PDF also has a type of\n//\t\t\tannotation called \"link\", FPDFTEXT doesn't deal with that kind of link.\n//\t\t\tFPDFTEXT weblink feature is useful for automatically detecting links in the page\n//\t\t\tcontents. For example, things like \"http://www.foxitsoftware.com\" will be detected,\n//\t\t\tso applications can allow user to click on those characters to activate the link,\n//\t\t\teven the PDF doesn't come with link annotations.\n//\n//\t\t\tFPDFLink_CloseWebLinks must be called to release resources.\n//\nDLLEXPORT FPDF_PAGELINK STDCALL FPDFLink_LoadWebLinks(FPDF_TEXTPAGE text_page);\n\n// Function: FPDFLink_CountWebLinks\n//\t\t\tCount number of detected web links.\n// Parameters:\n//\t\t\tlink_page\t-\tHandle returned by FPDFLink_LoadWebLinks.\n// Return Value:\n//\t\t\tNumber of detected web links.\n//\nDLLEXPORT int STDCALL FPDFLink_CountWebLinks(FPDF_PAGELINK link_page);\n\n// Function: FPDFLink_GetURL\n//\t\t\tFetch the URL information for a detected web link.\n// Parameters:\n//\t\t\tlink_page\t-\tHandle returned by FPDFLink_LoadWebLinks.\n//\t\t\tlink_index\t-\tZero-based index for the link.\n//\t\t\tbuffer\t\t-\tA unicode buffer.\n//\t\t\tbuflen\t\t-\tNumber of characters (not bytes) for the buffer, including an additional terminator.\n// Return Value:\n//\t\t\tIf buffer is NULL or buflen is zero, return number of characters (not bytes and an additional terminator is also counted) needed,\n//\t\t\totherwise, return number of characters copied into the buffer.\n//\nDLLEXPORT int STDCALL FPDFLink_GetURL(FPDF_PAGELINK link_page, int link_index, unsigned short* buffer,int buflen);\n\n// Function: FPDFLink_CountRects\n//\t\t\tCount number of rectangular areas for the link.\n// Parameters:\n//\t\t\tlink_page\t-\tHandle returned by FPDFLink_LoadWebLinks.\n//\t\t\tlink_index\t-\tZero-based index for the link.\n// Return Value:\n//\t\t\tNumber of rectangular areas for the link.\n//\nDLLEXPORT int STDCALL FPDFLink_CountRects(FPDF_PAGELINK link_page, int link_index);\n\n// Function: FPDFLink_GetRect\n//\t\t\tFetch the boundaries of a rectangle for a link.\n// Parameters:\n//\t\t\tlink_page\t-\tHandle returned by FPDFLink_LoadWebLinks.\n//\t\t\tlink_index\t-\tZero-based index for the link.\n//\t\t\trect_index\t-\tZero-based index for a rectangle.\n//\t\t\tleft\t\t-\tPointer to a double value receiving the rectangle left boundary.\n//\t\t\ttop\t\t\t-\tPointer to a double value receiving the rectangle top boundary.\n//\t\t\tright\t\t-\tPointer to a double value receiving the rectangle right boundary.\n//\t\t\tbottom\t\t-\tPointer to a double value receiving the rectangle bottom boundary.\n// Return Value:\n//\t\t\tNone.\n//\nDLLEXPORT void STDCALL FPDFLink_GetRect(FPDF_PAGELINK link_page, int link_index, int rect_index, \n\t\t\t\t\t\t\t\t\t\tdouble* left, double* top,double* right, double* bottom);\n\n// Function: FPDFLink_CloseWebLinks\n//\t\t\tRelease resources used by weblink feature.\n// Parameters:\n//\t\t\tlink_page\t-\tHandle returned by FPDFLink_LoadWebLinks.\n// Return Value:\n//\t\t\tNone.\n//\nDLLEXPORT void STDCALL FPDFLink_CloseWebLinks(FPDF_PAGELINK link_page);\n\n\n#ifdef __cplusplus\n};\n#endif\n\n#endif//_FPDFTEXT_H_\n"
  },
  {
    "path": "fpdfsdk/include/fpdfview.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n\n#ifndef _FPDFVIEW_H_\n#define _FPDFVIEW_H_\n\n#if defined(_WIN32) && !defined(__WINDOWS__)\n#include <windows.h>\n#endif\n\n// Data types\ntypedef void*\tFPDF_MODULEMGR;\n\n// PDF types\ntypedef void*\tFPDF_DOCUMENT;\t\t\ntypedef void*\tFPDF_PAGE;\t\t\t\ntypedef void*\tFPDF_PAGEOBJECT;\t// Page object(text, path, etc)\ntypedef void*\tFPDF_PATH;\ntypedef void*\tFPDF_CLIPPATH;\t\ntypedef void*\tFPDF_BITMAP;\t\ntypedef void*\tFPDF_FONT;\t\t\t\n\ntypedef void*\tFPDF_TEXTPAGE;\ntypedef void*\tFPDF_SCHHANDLE;\ntypedef void*\tFPDF_PAGELINK;\ntypedef void*\tFPDF_HMODULE;\ntypedef void*\tFPDF_DOCSCHHANDLE;\n\ntypedef void*\tFPDF_BOOKMARK;\ntypedef void*\tFPDF_DEST;\ntypedef void*\tFPDF_ACTION;\ntypedef void*\tFPDF_LINK;\ntypedef void*   FPDF_PAGERANGE;\n\n// Basic data types\ntypedef int\t\t\t\tFPDF_BOOL;\ntypedef int\t\t\t\tFPDF_ERROR;\t\ntypedef unsigned long\tFPDF_DWORD;\n\ntypedef\tfloat\t\t\tFS_FLOAT;\n\n// Duplex types\ntypedef enum _FPDF_DUPLEXTYPE_ {\n    DuplexUndefined = 0,\n    Simplex,\n    DuplexFlipShortEdge,\n    DuplexFlipLongEdge\n} FPDF_DUPLEXTYPE;\n\n// String types\ntypedef unsigned short\t\t\tFPDF_WCHAR;\ntypedef unsigned char const*\tFPDF_LPCBYTE;\n\n// FPDFSDK may use three types of strings: byte string, wide string (UTF-16LE encoded), and platform dependent string\ntypedef const char*\t\t\t\tFPDF_BYTESTRING;\n\ntypedef const unsigned short*\tFPDF_WIDESTRING;\t\t// Foxit PDF SDK always use UTF-16LE encoding wide string,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t// each character use 2 bytes (except surrogation), with low byte first.\n\n// For Windows programmers: for most case it's OK to treat FPDF_WIDESTRING as Windows unicode string,\n//\t\t however, special care needs to be taken if you expect to process Unicode larger than 0xffff.\n// For Linux/Unix programmers: most compiler/library environment uses 4 bytes for a Unicode character,\n//\t\tyou have to convert between FPDF_WIDESTRING and system wide string by yourself.\n\n#ifdef _WIN32_WCE\ntypedef const unsigned short* FPDF_STRING;\n#else\ntypedef const char* FPDF_STRING;\n#endif\n\n#ifndef _FS_DEF_MATRIX_\n#define _FS_DEF_MATRIX_\n/** @brief Matrix for transformation. */\ntypedef struct _FS_MATRIX_\n{\n\tfloat\ta;\t/**< @brief Coefficient a.*/\n\tfloat\tb;\t/**< @brief Coefficient b.*/\n\tfloat\tc;\t/**< @brief Coefficient c.*/\n\tfloat\td;\t/**< @brief Coefficient d.*/\n\tfloat\te;\t/**< @brief Coefficient e.*/\n\tfloat\tf;\t/**< @brief Coefficient f.*/\n} FS_MATRIX;\n#endif\n\n#ifndef _FS_DEF_RECTF_\n#define _FS_DEF_RECTF_\n/** @brief Rectangle area(float) in device or page coordination system. */\ntypedef struct _FS_RECTF_\n{\n\t/**@{*/\n\t/** @brief The x-coordinate of the left-top corner. */\n\tfloat\tleft;\n\t/** @brief The y-coordinate of the left-top corner. */\n\tfloat\ttop;\n\t/** @brief The x-coordinate of the right-bottom corner. */\n\tfloat\tright;\n\t/** @brief The y-coordinate of the right-bottom corner. */\n\tfloat\tbottom;\n\t/**@}*/\n}* FS_LPRECTF, FS_RECTF;\n/** @brief Const Pointer to ::FS_RECTF structure.*/\ntypedef const FS_RECTF*\tFS_LPCRECTF;\n#endif\n\n#if defined(_WIN32) && defined(FPDFSDK_EXPORTS)\n// On Windows system, functions are exported in a DLL\n#define DLLEXPORT __declspec( dllexport )\n#define STDCALL __stdcall\n#else\n#define DLLEXPORT\n#define STDCALL\n#endif\n\nextern const char g_ExpireDate[];\nextern const char g_ModuleCodes[];\n\n// Exported Functions\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// Function: FPDF_InitLibrary\n//\t\t\tInitialize the FPDFSDK library \n// Parameters:\n//\t\t\thInstance\t-\tFor WIN32 system only: the instance of the executable or DLL module.\n// Return value:\n//\t\t\tNone.\n// Comments:\n//\t\t\tYou have to call this function before you can call any PDF processing functions.\n\nDLLEXPORT void STDCALL FPDF_InitLibrary(void* hInstance);\n\n\n// Function: FPDF_DestroyLibary\n//\t\t\tRelease all resources allocated by the FPDFSDK library.\n// Parameters:\n//\t\t\tNone.\n// Return value:\n//\t\t\tNone.\n// Comments:\n//\t\t\tYou can call this function to release all memory blocks allocated by the library. \n//\t\t\tAfter this function called, you should not call any PDF processing functions.\nDLLEXPORT void STDCALL FPDF_DestroyLibrary();\n\n//Policy for accessing the local machine time.\n#define FPDF_POLICY_MACHINETIME_ACCESS\t0\n\n// Function: FPDF_SetSandBoxPolicy\n//\t\t\tSet the policy for the sandbox environment.\n// Parameters:\t\n//\t\t\tpolicy\t\t-\tThe specified policy for setting, for example:FPDF_POLICY_MACHINETIME_ACCESS.\n//\t\t\tenable\t\t-\tTrue for enable, False for disable the policy.\n// Return value:\n//\t\t\tNone.\nDLLEXPORT void\tSTDCALL FPDF_SetSandBoxPolicy(FPDF_DWORD policy, FPDF_BOOL enable);\n\n/**\n* Open and load a PDF document.\n* @param[in] file_path\t-\tPath to the PDF file (including extension).\n* @param[in] password\t-\tA string used as the password for PDF file. \n*\t\t\t\t\t\t\tIf no password needed, empty or NULL can be used.\n* @note\t\tLoaded document can be closed by FPDF_CloseDocument.\n*\t\t\tIf this function fails, you can use FPDF_GetLastError() to retrieve\n*\t\t\tthe reason why it fails.\n* @retval\tA handle to the loaded document. If failed, NULL is returned.\n*/\nDLLEXPORT FPDF_DOCUMENT\tSTDCALL FPDF_LoadDocument(FPDF_STRING file_path, \n\tFPDF_BYTESTRING password);\n\n// Function: FPDF_LoadMemDocument\n//\t\t\tOpen and load a PDF document from memory.\n// Parameters: \n//\t\t\tdata_buf\t-\tPointer to a buffer containing the PDF document.\n//\t\t\tsize\t\t-\tNumber of bytes in the PDF document.\n//\t\t\tpassword\t-\tA string used as the password for PDF file. \n//\t\t\t\t\t\t\tIf no password needed, empty or NULL can be used.\n// Return value:\n//\t\t\tA handle to the loaded document. If failed, NULL is returned.\n// Comments:\n//\t\t\tThe memory buffer must remain valid when the document is open.\n//\t\t\tLoaded document can be closed by FPDF_CloseDocument.\n//\t\t\tIf this function fails, you can use FPDF_GetLastError() to retrieve\n//\t\t\tthe reason why it fails.\n//\nDLLEXPORT FPDF_DOCUMENT\tSTDCALL FPDF_LoadMemDocument(const void* data_buf, \n\t\t\t\t\t\t\t\t\t\t\tint size, FPDF_BYTESTRING password);\n\n// Structure for custom file access.\ntypedef struct {\n\t// File length, in bytes.\n\tunsigned long\tm_FileLen;\n\n\t// A function pointer for getting a block of data from specific position.\n\t// Position is specified by byte offset from beginning of the file.\n\t// The position and size will never go out range of file length.\n\t// It may be possible for FPDFSDK to call this function multiple times for same position.\n\t// Return value: should be non-zero if successful, zero for error.\n\tint\t\t\t\t(*m_GetBlock)(void* param, unsigned long position, unsigned char* pBuf, unsigned long size);\n\n\t// A custom pointer for all implementation specific data.\n\t// This pointer will be used as the first parameter to m_GetBlock callback.\n\tvoid*\t\t\tm_Param;\n} FPDF_FILEACCESS;\n\n// Function: FPDF_LoadCustomDocument\n//\t\t\tLoad PDF document from a custom access descriptor.\n// Parameters:\n//\t\t\tpFileAccess\t-\tA structure for access the file.\n//\t\t\tpassword\t-\tOptional password for decrypting the PDF file.\n// Return value:\n//\t\t\tA handle to the loaded document. If failed, NULL is returned.\n// Comments:\n//\t\t\tThe application should maintain the file resources being valid until the PDF document close.\n//\t\t\tLoaded document can be closed by FPDF_CloseDocument.\nDLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadCustomDocument(FPDF_FILEACCESS* pFileAccess, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tFPDF_BYTESTRING password);\n\n// Function: FPDF_GetFileVersion\n//\t\t\tGet the file version of the specific PDF document.\n// Parameters:\n//\t\t\tdoc\t\t\t-\tHandle to document.\n//\t\t\tfileVersion\t-\tThe PDF file version. File version: 14 for 1.4, 15 for 1.5, ...\n// Return value:\n//\t\t\tTRUE if this call succeed, If failed, FALSE is returned.\n// Comments:\n//\t\t\tIf the document is created by function ::FPDF_CreateNewDocument, then this function would always fail.\nDLLEXPORT FPDF_BOOL STDCALL FPDF_GetFileVersion(FPDF_DOCUMENT doc, int* fileVersion);\n\n#define FPDF_ERR_SUCCESS\t\t0\t\t// No error.\n#define FPDF_ERR_UNKNOWN\t\t1\t\t// Unknown error.\n#define FPDF_ERR_FILE\t\t\t2\t\t// File not found or could not be opened.\n#define FPDF_ERR_FORMAT\t\t\t3\t\t// File not in PDF format or corrupted.\n#define FPDF_ERR_PASSWORD\t\t4\t\t// Password required or incorrect password.\n#define FPDF_ERR_SECURITY\t\t5\t\t// Unsupported security scheme.\n#define FPDF_ERR_PAGE\t\t\t6\t\t// Page not found or content error.\n\n// Function: FPDF_GetLastError\n//\t\t\tGet last error code when an SDK function failed.\n// Parameters: \n//\t\t\tNone.\n// Return value:\n//\t\t\tA 32-bit integer indicating error codes (defined above).\n// Comments:\n//\t\t\tIf the previous SDK call succeeded, the return value of this function\n//\t\t\tis not defined.\n//\nDLLEXPORT unsigned long\tSTDCALL FPDF_GetLastError();\n\n// Function: FPDF_GetDocPermission\n//\t\t\tGet file permission flags of the document.\n// Parameters: \n//\t\t\tdocument\t-\tHandle to document. Returned by FPDF_LoadDocument function.\n// Return value:\n//\t\t\tA 32-bit integer indicating permission flags. Please refer to PDF Reference for\n//\t\t\tdetailed description. If the document is not protected, 0xffffffff will be returned.\n//\nDLLEXPORT unsigned long\tSTDCALL FPDF_GetDocPermissions(FPDF_DOCUMENT document);\n\n// Function: FPDF_GetPageCount\n//\t\t\tGet total number of pages in a document.\n// Parameters: \n//\t\t\tdocument\t-\tHandle to document. Returned by FPDF_LoadDocument function.\n// Return value:\n//\t\t\tTotal number of pages in the document.\n//\nDLLEXPORT int STDCALL FPDF_GetPageCount(FPDF_DOCUMENT document);\n\n// Function: FPDF_LoadPage\n//\t\t\tLoad a page inside a document.\n// Parameters: \n//\t\t\tdocument\t-\tHandle to document. Returned by FPDF_LoadDocument function.\n//\t\t\tpage_index\t-\tIndex number of the page. 0 for the first page.\n// Return value:\n//\t\t\tA handle to the loaded page. If failed, NULL is returned.\n// Comments:\n//\t\t\tLoaded page can be rendered to devices using FPDF_RenderPage function.\n//\t\t\tLoaded page can be closed by FPDF_ClosePage.\n//\nDLLEXPORT FPDF_PAGE\tSTDCALL FPDF_LoadPage(FPDF_DOCUMENT document, int page_index);\n\n// Function: FPDF_GetPageWidth\n//\t\t\tGet page width.\n// Parameters:\n//\t\t\tpage\t\t-\tHandle to the page. Returned by FPDF_LoadPage function.\n// Return value:\n//\t\t\tPage width (excluding non-displayable area) measured in points.\n//\t\t\tOne point is 1/72 inch (around 0.3528 mm).\n//\nDLLEXPORT double STDCALL FPDF_GetPageWidth(FPDF_PAGE page);\n\n// Function: FPDF_GetPageHeight\n//\t\t\tGet page height.\n// Parameters:\n//\t\t\tpage\t\t-\tHandle to the page. Returned by FPDF_LoadPage function.\n// Return value:\n//\t\t\tPage height (excluding non-displayable area) measured in points.\n//\t\t\tOne point is 1/72 inch (around 0.3528 mm)\n//\nDLLEXPORT double STDCALL FPDF_GetPageHeight(FPDF_PAGE page);\n\n// Function: FPDF_GetPageSizeByIndex\n//\t\t\tGet the size of a page by index.\n// Parameters:\n//\t\t\tdocument\t-\tHandle to document. Returned by FPDF_LoadDocument function.\n//\t\t\tpage_index\t-\tPage index, zero for the first page.\n//\t\t\twidth\t\t-\tPointer to a double value receiving the page width (in points).\n//\t\t\theight\t\t-\tPointer to a double value receiving the page height (in points).\n// Return value:\n//\t\t\tNon-zero for success. 0 for error (document or page not found).\n//\nDLLEXPORT int STDCALL FPDF_GetPageSizeByIndex(FPDF_DOCUMENT document, int page_index, double* width, double* height);\n\n\n// Page rendering flags. They can be combined with bit OR.\n#define FPDF_ANNOT\t\t\t0x01\t\t// Set if annotations are to be rendered.\n#define FPDF_LCD_TEXT\t\t0x02\t\t// Set if using text rendering optimized for LCD display.\n#define FPDF_NO_NATIVETEXT\t0x04\t\t// Don't use the native text output available on some platforms\n#define FPDF_GRAYSCALE\t\t0x08\t\t// Grayscale output.\n#define FPDF_DEBUG_INFO\t\t0x80\t\t// Set if you want to get some debug info. \n\t\t\t\t\t\t\t\t\t\t// Please discuss with Foxit first if you need to collect debug info.\n#define FPDF_NO_CATCH\t\t0x100\t\t// Set if you don't want to catch exception.\n#define FPDF_RENDER_LIMITEDIMAGECACHE\t0x200\t// Limit image cache size. \n#define FPDF_RENDER_FORCEHALFTONE\t\t0x400\t// Always use halftone for image stretching.\n#define FPDF_PRINTING\t\t0x800\t// Render for printing.\n#define FPDF_REVERSE_BYTE_ORDER\t\t0x10\t\t//set whether render in a reverse Byte order, this flag only \n\t\t\t\t\t\t\t\t\t\t\t\t//enable when render to a bitmap.\n#ifdef _WIN32\n// Function: FPDF_RenderPage\n//\t\t\tRender contents in a page to a device (screen, bitmap, or printer).\n//\t\t\tThis function is only supported on Windows system.\n// Parameters: \n//\t\t\tdc\t\t\t-\tHandle to device context.\n//\t\t\tpage\t\t-\tHandle to the page. Returned by FPDF_LoadPage function.\n//\t\t\tstart_x\t\t-\tLeft pixel position of the display area in the device coordinate.\n//\t\t\tstart_y\t\t-\tTop pixel position of the display area in the device coordinate.\n//\t\t\tsize_x\t\t-\tHorizontal size (in pixels) for displaying the page.\n//\t\t\tsize_y\t\t-\tVertical size (in pixels) for displaying the page.\n//\t\t\trotate\t\t-\tPage orientation: 0 (normal), 1 (rotated 90 degrees clockwise),\n//\t\t\t\t\t\t\t\t2 (rotated 180 degrees), 3 (rotated 90 degrees counter-clockwise).\n//\t\t\tflags\t\t-\t0 for normal display, or combination of flags defined above.\n// Return value:\n//\t\t\tNone.\n//\nDLLEXPORT void STDCALL FPDF_RenderPage(HDC dc, FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,\n\t\t\t\t\t\tint rotate, int flags);\n#endif\n\n// Function: FPDF_RenderPageBitmap\n//\t\t\tRender contents in a page to a device independent bitmap\n// Parameters: \n//\t\t\tbitmap\t\t-\tHandle to the device independent bitmap (as the output buffer).\n//\t\t\t\t\t\t\tBitmap handle can be created by FPDFBitmap_Create function.\n//\t\t\tpage\t\t-\tHandle to the page. Returned by FPDF_LoadPage function.\n//\t\t\tstart_x\t\t-\tLeft pixel position of the display area in the bitmap coordinate.\n//\t\t\tstart_y\t\t-\tTop pixel position of the display area in the bitmap coordinate.\n//\t\t\tsize_x\t\t-\tHorizontal size (in pixels) for displaying the page.\n//\t\t\tsize_y\t\t-\tVertical size (in pixels) for displaying the page.\n//\t\t\trotate\t\t-\tPage orientation: 0 (normal), 1 (rotated 90 degrees clockwise),\n//\t\t\t\t\t\t\t\t2 (rotated 180 degrees), 3 (rotated 90 degrees counter-clockwise).\n//\t\t\tflags\t\t-\t0 for normal display, or combination of flags defined above.\n// Return value:\n//\t\t\tNone.\n//\nDLLEXPORT void STDCALL FPDF_RenderPageBitmap(FPDF_BITMAP bitmap, FPDF_PAGE page, int start_x, int start_y, \n\t\t\t\t\t\tint size_x, int size_y, int rotate, int flags);\n\n// Function: FPDF_ClosePage\n//\t\t\tClose a loaded PDF page.\n// Parameters: \n//\t\t\tpage\t\t-\tHandle to the loaded page.\n// Return value:\n//\t\t\tNone.\n//\nDLLEXPORT void STDCALL FPDF_ClosePage(FPDF_PAGE page);\n\n// Function: FPDF_CloseDocument\n//\t\t\tClose a loaded PDF document.\n// Parameters: \n//\t\t\tdocument\t-\tHandle to the loaded document.\n// Return value:\n//\t\t\tNone.\n//\nDLLEXPORT void STDCALL FPDF_CloseDocument(FPDF_DOCUMENT document);\n\n// Function: FPDF_DeviceToPage\n//\t\t\tConvert the screen coordinate of a point to page coordinate.\n// Parameters:\n//\t\t\tpage\t\t-\tHandle to the page. Returned by FPDF_LoadPage function.\n//\t\t\tstart_x\t\t-\tLeft pixel position of the display area in the device coordinate.\n//\t\t\tstart_y\t\t-\tTop pixel position of the display area in the device coordinate.\n//\t\t\tsize_x\t\t-\tHorizontal size (in pixels) for displaying the page.\n//\t\t\tsize_y\t\t-\tVertical size (in pixels) for displaying the page.\n//\t\t\trotate\t\t-\tPage orientation: 0 (normal), 1 (rotated 90 degrees clockwise),\n//\t\t\t\t\t\t\t\t2 (rotated 180 degrees), 3 (rotated 90 degrees counter-clockwise).\n//\t\t\tdevice_x\t-\tX value in device coordinate, for the point to be converted.\n//\t\t\tdevice_y\t-\tY value in device coordinate, for the point to be converted.\n//\t\t\tpage_x\t\t-\tA Pointer to a double receiving the converted X value in page coordinate.\n//\t\t\tpage_y\t\t-\tA Pointer to a double receiving the converted Y value in page coordinate.\n// Return value:\n//\t\t\tNone.\n// Comments:\n//\t\t\tThe page coordinate system has its origin at left-bottom corner of the page, with X axis goes along\n//\t\t\tthe bottom side to the right, and Y axis goes along the left side upward. NOTE: this coordinate system \n//\t\t\tcan be altered when you zoom, scroll, or rotate a page, however, a point on the page should always have \n//\t\t\tthe same coordinate values in the page coordinate system. \n//\n//\t\t\tThe device coordinate system is device dependent. For screen device, its origin is at left-top\n//\t\t\tcorner of the window. However this origin can be altered by Windows coordinate transformation\n//\t\t\tutilities. You must make sure the start_x, start_y, size_x, size_y and rotate parameters have exactly\n//\t\t\tsame values as you used in FPDF_RenderPage() function call.\n//\nDLLEXPORT void STDCALL FPDF_DeviceToPage(FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,\n\t\t\t\t\t\tint rotate, int device_x, int device_y, double* page_x, double* page_y);\n\n// Function: FPDF_PageToDevice\n//\t\t\tConvert the page coordinate of a point to screen coordinate.\n// Parameters:\n//\t\t\tpage\t\t-\tHandle to the page. Returned by FPDF_LoadPage function.\n//\t\t\tstart_x\t\t-\tLeft pixel position of the display area in the device coordinate.\n//\t\t\tstart_y\t\t-\tTop pixel position of the display area in the device coordinate.\n//\t\t\tsize_x\t\t-\tHorizontal size (in pixels) for displaying the page.\n//\t\t\tsize_y\t\t-\tVertical size (in pixels) for displaying the page.\n//\t\t\trotate\t\t-\tPage orientation: 0 (normal), 1 (rotated 90 degrees clockwise),\n//\t\t\t\t\t\t\t\t2 (rotated 180 degrees), 3 (rotated 90 degrees counter-clockwise).\n//\t\t\tpage_x\t\t-\tX value in page coordinate, for the point to be converted.\n//\t\t\tpage_y\t\t-\tY value in page coordinate, for the point to be converted.\n//\t\t\tdevice_x\t-\tA pointer to an integer receiving the result X value in device coordinate.\n//\t\t\tdevice_y\t-\tA pointer to an integer receiving the result Y value in device coordinate.\n// Return value:\n//\t\t\tNone.\n// Comments:\n//\t\t\tSee comments of FPDF_DeviceToPage() function.\n//\nDLLEXPORT void STDCALL FPDF_PageToDevice(FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,\n\t\t\t\t\t\tint rotate, double page_x, double page_y, int* device_x, int* device_y);\n\n// Function: FPDFBitmap_Create\n//\t\t\tCreate a Foxit Device Independent Bitmap (FXDIB).\n// Parameters:\n//\t\t\twidth\t\t-\tNumber of pixels in a horizontal line of the bitmap. Must be greater than 0.\n//\t\t\theight\t\t-\tNumber of pixels in a vertical line of the bitmap. Must be greater than 0.\n//\t\t\talpha\t\t-\tA flag indicating whether alpha channel is used. Non-zero for using alpha, zero for not using.\n// Return value:\n//\t\t\tThe created bitmap handle, or NULL if parameter error or out of memory.\n// Comments:\n//\t\t\tAn FXDIB always use 4 byte per pixel. The first byte of a pixel is always double word aligned.\n//\t\t\tEach pixel contains red (R), green (G), blue (B) and optionally alpha (A) values.\n//\t\t\tThe byte order is BGRx (the last byte unused if no alpha channel) or BGRA.\n//\t\t\t\n//\t\t\tThe pixels in a horizontal line (also called scan line) are stored side by side, with left most\n//\t\t\tpixel stored first (with lower memory address). Each scan line uses width*4 bytes.\n//\n//\t\t\tScan lines are stored one after another, with top most scan line stored first. There is no gap\n//\t\t\tbetween adjacent scan lines.\n//\n//\t\t\tThis function allocates enough memory for holding all pixels in the bitmap, but it doesn't \n//\t\t\tinitialize the buffer. Applications can use FPDFBitmap_FillRect to fill the bitmap using any color.\nDLLEXPORT FPDF_BITMAP STDCALL FPDFBitmap_Create(int width, int height, int alpha);\n\n// More DIB formats\n#define FPDFBitmap_Gray\t\t1\t\t// Gray scale bitmap, one byte per pixel.\n#define FPDFBitmap_BGR\t\t2\t\t// 3 bytes per pixel, byte order: blue, green, red.\n#define FPDFBitmap_BGRx\t\t3\t\t// 4 bytes per pixel, byte order: blue, green, red, unused.\n#define FPDFBitmap_BGRA\t\t4\t\t// 4 bytes per pixel, byte order: blue, green, red, alpha.\n\n// Function: FPDFBitmap_CreateEx\n//\t\t\tCreate a Foxit Device Independent Bitmap (FXDIB)\n// Parameters:\n//\t\t\twidth\t\t-\tNumber of pixels in a horizontal line of the bitmap. Must be greater than 0.\n//\t\t\theight\t\t-\tNumber of pixels in a vertical line of the bitmap. Must be greater than 0.\n//\t\t\tformat\t\t-\tA number indicating for bitmap format, as defined above.\n//\t\t\tfirst_scan\t-\tA pointer to the first byte of first scan line, for external buffer\n//\t\t\t\t\t\t\tonly. If this parameter is NULL, then the SDK will create its own buffer.\n//\t\t\tstride\t\t-\tNumber of bytes for each scan line, for external buffer only..\n// Return value:\n//\t\t\tThe created bitmap handle, or NULL if parameter error or out of memory.\n// Comments:\n//\t\t\tSimilar to FPDFBitmap_Create function, with more formats and external buffer supported. \n//\t\t\tBitmap created by this function can be used in any place that a FPDF_BITMAP handle is \n//\t\t\trequired. \n//\n//\t\t\tIf external scanline buffer is used, then the application should destroy the buffer\n//\t\t\tby itself. FPDFBitmap_Destroy function will not destroy the buffer.\n//\nDLLEXPORT FPDF_BITMAP STDCALL FPDFBitmap_CreateEx(int width, int height, int format, void* first_scan, int stride);\n\n// Function: FPDFBitmap_FillRect\n//\t\t\tFill a rectangle area in an FXDIB.\n// Parameters:\n//\t\t\tbitmap\t\t-\tThe handle to the bitmap. Returned by FPDFBitmap_Create function.\n//\t\t\tleft\t\t-\tThe left side position. Starting from 0 at the left-most pixel.\n//\t\t\ttop\t\t\t-\tThe top side position. Starting from 0 at the top-most scan line.\n//\t\t\twidth\t\t-\tNumber of pixels to be filled in each scan line.\n//\t\t\theight\t\t-\tNumber of scan lines to be filled.\n//\t\t\tcolor\t\t-\tA 32-bit value specifing the color, in 8888 ARGB format.\n// Return value:\n//\t\t\tNone.\n// Comments:\n//\t\t\tThis function set the color and (optionally) alpha value in specified region of the bitmap.\n//\t\t\tNOTE: If alpha channel is used, this function does NOT composite the background with the source color,\n//\t\t\tinstead the background will be replaced by the source color and alpha.\n//\t\t\tIf alpha channel is not used, the \"alpha\" parameter is ignored.\n//\nDLLEXPORT void STDCALL FPDFBitmap_FillRect(FPDF_BITMAP bitmap, int left, int top, int width, int height, FPDF_DWORD color);\n\n// Function: FPDFBitmap_GetBuffer\n//\t\t\tGet data buffer of an FXDIB\n// Parameters:\n//\t\t\tbitmap\t\t-\tHandle to the bitmap. Returned by FPDFBitmap_Create function.\n// Return value:\n//\t\t\tThe pointer to the first byte of the bitmap buffer.\n// Comments:\n//\t\t\tThe stride may be more than width * number of bytes per pixel\n//\t\t\tApplications can use this function to get the bitmap buffer pointer, then manipulate any color\n//\t\t\tand/or alpha values for any pixels in the bitmap.\nDLLEXPORT void* STDCALL FPDFBitmap_GetBuffer(FPDF_BITMAP bitmap);\n\n// Function: FPDFBitmap_GetWidth\n//\t\t\tGet width of an FXDIB.\n// Parameters:\n//\t\t\tbitmap\t\t-\tHandle to the bitmap. Returned by FPDFBitmap_Create function.\n// Return value:\n//\t\t\tThe number of pixels in a horizontal line of the bitmap.\nDLLEXPORT int STDCALL FPDFBitmap_GetWidth(FPDF_BITMAP bitmap);\n\n// Function: FPDFBitmap_GetHeight\n//\t\t\tGet height of an FXDIB.\n// Parameters:\n//\t\t\tbitmap\t\t-\tHandle to the bitmap. Returned by FPDFBitmap_Create function.\n// Return value:\n//\t\t\tThe number of pixels in a vertical line of the bitmap.\nDLLEXPORT int STDCALL FPDFBitmap_GetHeight(FPDF_BITMAP bitmap);\n\n// Function: FPDFBitmap_GetStride\n//\t\t\tGet number of bytes for each scan line in the bitmap buffer.\n// Parameters:\n//\t\t\tbitmap\t\t-\tHandle to the bitmap. Returned by FPDFBitmap_Create function.\n// Return value:\n//\t\t\tThe number of bytes for each scan line in the bitmap buffer.\n// Comments:\n//\t\t\tThe stride may be more than width * number of bytes per pixel\nDLLEXPORT int STDCALL FPDFBitmap_GetStride(FPDF_BITMAP bitmap);\n\n// Function: FPDFBitmap_Destroy\n//\t\t\tDestroy an FXDIB and release all related buffers. \n// Parameters:\n//\t\t\tbitmap\t\t-\tHandle to the bitmap. Returned by FPDFBitmap_Create function.\n// Return value:\n//\t\t\tNone.\n// Comments:\n//\t\t\tThis function will not destroy any external buffer.\n//\nDLLEXPORT void STDCALL FPDFBitmap_Destroy(FPDF_BITMAP bitmap);\n\n// Function: FPDF_VIEWERREF_GetPrintScaling\n//\t\t\tWhether the PDF document prefers to be scaled or not.\n// Parameters: \n//\t\t\tdocument\t-\tHandle to the loaded document.\n// Return value:\n//\t\t\tNone.\n//\nDLLEXPORT FPDF_BOOL STDCALL FPDF_VIEWERREF_GetPrintScaling(FPDF_DOCUMENT document);\n\n// Function: FPDF_VIEWERREF_GetNumCopies\n//\t\t\tReturns the number of copies to be printed.\n// Parameters:\n//\t\t\tdocument\t-\tHandle to the loaded document.\n// Return value:\n//          The number of copies to be printed.\n//\nDLLEXPORT int STDCALL FPDF_VIEWERREF_GetNumCopies(FPDF_DOCUMENT document);\n\n// Function: FPDF_VIEWERREF_GetPrintPageRange\n//\t\t\tPage numbers to initialize print dialog box when file is printed.\n// Parameters:\n//\t\t\tdocument\t-\tHandle to the loaded document.\n// Return value:\n//          The print page range to be used for printing.\n//\nDLLEXPORT FPDF_PAGERANGE STDCALL FPDF_VIEWERREF_GetPrintPageRange(FPDF_DOCUMENT document);\n\n// Function: FPDF_VIEWERREF_GetDuplex\n//\t\t\tReturns the paper handling option to be used when printing from print dialog.\n// Parameters:\n//\t\t\tdocument\t-\tHandle to the loaded document.\n// Return value:\n//          The paper handling option to be used when printing.\n//\nDLLEXPORT FPDF_DUPLEXTYPE STDCALL FPDF_VIEWERREF_GetDuplex(FPDF_DOCUMENT document);\n\n// Function: FPDF_GetNamedDestByName\n//\t\t\tget a special dest handle by the index.\n// Parameters: \n//\t\t\tdocument\t-\tHandle to the loaded document.\n//\t\t\tname\t\t-\tThe name of a special named dest.\n// Return value:\n//\t\t\tThe handle of the dest.\n//\nDLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDestByName(FPDF_DOCUMENT document,FPDF_BYTESTRING name);\n\n#ifdef __cplusplus\n};\n#endif\n\n#endif // _FPDFVIEW_H_\n"
  },
  {
    "path": "fpdfsdk/include/fsdk_actionhandler.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FSDK_ACTIONHANDLER_H_\n#define _FSDK_ACTIONHANDLER_H_\n\n\nclass CPDFDoc_Environment;\nclass IFXJS_Runtime;\n\nclass CPDFSDK_FormActionHandler\n{\npublic:\n\tFX_BOOL\tDoAction_Hide(const CPDF_Action& action, CPDFSDK_Document* pDocument);\n\tFX_BOOL\tDoAction_SubmitForm(const CPDF_Action& action, CPDFSDK_Document* pDocument);\n\tFX_BOOL\tDoAction_ResetForm(const CPDF_Action& action, CPDFSDK_Document* pDocument);\n\tFX_BOOL\tDoAction_ImportData(const CPDF_Action& action, CPDFSDK_Document* pDocument);\n};\n\nclass CPDFSDK_MediaActionHandler\n{\npublic:\n\tFX_BOOL\tDoAction_Rendition(const CPDF_Action& action, CPDFSDK_Document* pDocument);\n\tFX_BOOL\tDoAction_Sound(const CPDF_Action& action, CPDFSDK_Document* pDocument);\n\tFX_BOOL\tDoAction_Movie(const CPDF_Action& action, CPDFSDK_Document* pDocument);\n};\n\nclass  CPDFSDK_ActionHandler /*: public CReader_ActionHandler*/\n{\npublic:\n\tCPDFSDK_ActionHandler(CPDFDoc_Environment* pEvi);\n\tvirtual ~CPDFSDK_ActionHandler();\n\t\n\tvirtual void\t\tDestroy();\n\tvirtual FX_BOOL\t\tDoAction_DocOpen(const CPDF_Action& action, CPDFSDK_Document* pDocument/*, CPDFSDK_DocView *pDocView*/);\n\tvirtual FX_BOOL\t\tDoAction_JavaScript(const CPDF_Action& JsAction,CFX_WideString csJSName, CPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/);\n\tvirtual FX_BOOL\t\tDoAction_Page(const CPDF_Action& action, enum CPDF_AAction::AActionType eType, CPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/);\n\tvirtual FX_BOOL\t\tDoAction_Document(const CPDF_Action& action, enum CPDF_AAction::AActionType eType, CPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/);\n\tvirtual FX_BOOL\t\tDoAction_BookMark(CPDF_Bookmark *pBookMark, const CPDF_Action& action, CPDF_AAction::AActionType type, CPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/);\t\n\tvirtual FX_BOOL\t\tDoAction_Screen(const CPDF_Action& action, CPDF_AAction::AActionType type, CPDFSDK_Document* pDocument,/* CReader_DocView *pDocView,*/ CPDFSDK_Annot* pScreen);\n\tvirtual FX_BOOL\t\tDoAction_Link(const CPDF_Action& action, CPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/);\n\tvirtual FX_BOOL\t\tDoAction_Field(const CPDF_Action& action, CPDF_AAction::AActionType type, CPDFSDK_Document* pDocument, /*CReader_DocView *pDocView,*/ CPDF_FormField* pFormField, PDFSDK_FieldAction& data);\n\tvirtual FX_BOOL\t\tDoAction_FieldJavaScript(const CPDF_Action& JsAction, CPDF_AAction::AActionType type, CPDFSDK_Document* pDocument, CPDF_FormField* pFormField, PDFSDK_FieldAction& data);\npublic:\n\tvoid\t\t\t\tSetFormActionHandler(CPDFSDK_FormActionHandler* pHandler);\n\tvoid\t\t\t\tSetMediaActionHandler(CPDFSDK_MediaActionHandler* pHandler);\n\t\nprivate:\n\tFX_BOOL\t\t\t\tExecuteDocumentOpenAction(const CPDF_Action& action, CPDFSDK_Document* pDocument, /*CReader_DocView *pDocView,*/ CFX_PtrList& list);\n\tFX_BOOL\t\t\t\tExecuteDocumentPageAction(const CPDF_Action& action, CPDF_AAction::AActionType type, CPDFSDK_Document* pDocument, /*CReader_DocView *pDocView,*/ CFX_PtrList& list);\n\tFX_BOOL\t\t\t\tExecuteFieldAction(const CPDF_Action& action, CPDF_AAction::AActionType type, CPDFSDK_Document* pDocument, /*CReader_DocView* pDocView,*/ CPDF_FormField* pFormField, PDFSDK_FieldAction& data, CFX_PtrList& list);\n\tFX_BOOL\t\t\t\tExecuteScreenAction(const CPDF_Action& action, CPDF_AAction::AActionType type, CPDFSDK_Document* pDocument, /*CReader_DocView* pDocView,*/ CPDFSDK_Annot* pScreen, CFX_PtrList& list);\n\tFX_BOOL\t\t\t\tExecuteBookMark(const CPDF_Action& action, CPDFSDK_Document* pDocument, /*CReader_DocView* pDocView,*/ CPDF_Bookmark* pBookmark, CFX_PtrList& list);\n\tFX_BOOL\t\t\t\tExecuteLinkAction(const CPDF_Action& action, CPDFSDK_Document* pDocument, /*CReader_DocView* pDocView,*/ CFX_PtrList& list);\n\t\n\tvoid\t\t\t\tDoAction_NoJs(const CPDF_Action& action, CPDFSDK_Document* pDocument/*, CReader_DocView* pDocView*/);\n\tvoid\t\t\t\tRunDocumentPageJavaScript(CPDFSDK_Document* pDocument, CPDF_AAction::AActionType type, const CFX_WideString& script);\n\tvoid\t\t\t\tRunDocumentOpenJavaScript(CPDFSDK_Document* pDocument, const CFX_WideString& sScriptName, const CFX_WideString& script);\n\tvoid\t\t\t\tRunFieldJavaScript(CPDFSDK_Document* pDocument, CPDF_FormField* pFormField, CPDF_AAction::AActionType type, PDFSDK_FieldAction& data, const CFX_WideString& script);\n\t\nprivate:\n\tFX_BOOL\t\t\t\tIsValidField(CPDFSDK_Document* pDocument, CPDF_Dictionary* pFieldDict);\n\tFX_BOOL\t\t\t\tIsValidDocView(CPDFSDK_Document* pDocument/*, CReader_DocView* pDocView*/);\n\t\n\tvoid\t\t\t\tDoAction_GoTo(CPDFSDK_Document* pDocument, /*CReader_DocView *pDocView,*/ const CPDF_Action& action);\n\tvoid\t\t\t\tDoAction_GoToR(CPDFSDK_Document* pDocument, const CPDF_Action& action);\n\tvoid\t\t\t\tDoAction_Launch(CPDFSDK_Document* pDocument, const CPDF_Action& action);\n\tvoid\t\t\t\tDoAction_URI(CPDFSDK_Document* pDocument, const CPDF_Action& action);\n\tvoid\t\t\t\tDoAction_Named(CPDFSDK_Document* pDocument, const CPDF_Action& action);\n\tvoid\t\t\t\tDoAction_SetOCGState(CPDFSDK_Document* pDocument, /*CReader_DocView* pDocView,*/ const CPDF_Action& action);\n\t\nprivate:\n\tCPDFDoc_Environment*\t\t\tm_pEvi;\n\tCPDFSDK_FormActionHandler*\t\tm_pFormActionHandler;\n\tCPDFSDK_MediaActionHandler*\t\tm_pMediaActionHandler;\n};\n\n#endif //_BA_ACTIONHANDLER_H_\n\n"
  },
  {
    "path": "fpdfsdk/include/fsdk_annothandler.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FSDK_ANNOTHANDLER_H_\n#define _FSDK_ANNOTHANDLER_H_\n\n\nclass CPDFDoc_Environment;\nclass CFFL_IFormFiller;\nclass CPDFSDK_PageView;\nclass IPDFSDK_AnnotHandler\n{\n\npublic:\n\tvirtual ~IPDFSDK_AnnotHandler() {};\n\n\tvirtual CFX_ByteString\t\tGetType() = 0;\n\n\tvirtual CFX_ByteString\t\tGetName() = 0;\n\n\tvirtual FX_BOOL\t\t\t\tCanAnswer(CPDFSDK_Annot* pAnnot) = 0;\n\t\n\n\tvirtual CPDFSDK_Annot*\t\tNewAnnot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPage) = 0;\n\n\tvirtual void\t\t\t\tReleaseAnnot(CPDFSDK_Annot* pAnnot) = 0;\n\n\tvirtual void\t\t\t\tDeleteAnnot(CPDFSDK_Annot* pAnnot) = 0;\n\t\n\n\tvirtual CPDF_Rect\t\t\t\tGetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot) = 0;\n\t\n\tvirtual FX_BOOL\t\t\t\tHitTest(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, const CPDF_Point& point) = 0;\n\t\n\n\tvirtual void\t\t\t\tOnDraw(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, \n\t\tCFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\tFX_DWORD dwFlags) = 0;\n\t\n\tvirtual void\t\t\t\tOnDrawSleep(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, \n\t\tCFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\tconst CPDF_Rect& rcWindow, FX_DWORD dwFlags) = 0;\n\t\n\n\t\n\n\tvirtual void\t\t\t\tOnCreate(CPDFSDK_Annot* pAnnot) = 0;\n\n\tvirtual void\t\t\t\tOnLoad(CPDFSDK_Annot* pAnnot) = 0;\n\n\tvirtual void\t\t\t\tOnDelete(CPDFSDK_Annot* pAnnot) = 0;\n\n\tvirtual void\t\t\t\tOnRelease(CPDFSDK_Annot* pAnnot) = 0;\n\t\n\n\tvirtual void\t\t\t\tOnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) = 0;\n\tvirtual void\t\t\t\tOnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) = 0;\n\t\n\n\tvirtual FX_BOOL\t\t\t\tOnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;\n\tvirtual FX_BOOL\t\t\t\tOnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;\n\tvirtual FX_BOOL\t\t\t\tOnLButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;\n\tvirtual FX_BOOL\t\t\t\tOnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;\n\tvirtual FX_BOOL\t\t\t\tOnMouseWheel(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, short zDelta, const CPDF_Point& point) = 0;\n\tvirtual FX_BOOL\t\t\t\tOnRButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;\n\tvirtual FX_BOOL\t\t\t\tOnRButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;\n\tvirtual FX_BOOL\t\t\t\tOnRButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;\n//by wjm.\n\tvirtual FX_BOOL\t\t\t\tOnChar(CPDFSDK_Annot* pAnnot, FX_DWORD nChar, FX_DWORD nFlags) = 0;\n\tvirtual FX_BOOL\t\t\t\tOnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag) = 0;\n\tvirtual FX_BOOL\t\t\t\tOnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag) =0 ;\n\n\tvirtual\tvoid\t\t\t\tOnDeSelected(CPDFSDK_Annot* pAnnot) = 0;\n\tvirtual\tvoid\t\t\t\tOnSelected(CPDFSDK_Annot* pAnnot) = 0;\n\n\tvirtual FX_BOOL\t\t\t\tOnSetFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) = 0;\n\tvirtual FX_BOOL\t\t\t\tOnKillFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) = 0;\n\n};\n\n\nclass CPDFSDK_BFAnnotHandler:public IPDFSDK_AnnotHandler\n{\npublic:\n\tCPDFSDK_BFAnnotHandler(CPDFDoc_Environment*\tpApp):m_pFormFiller(NULL),m_pApp(pApp) {}\n\tvirtual\t~CPDFSDK_BFAnnotHandler() {}\npublic:\n\n\tvirtual CFX_ByteString\t\tGetType()  {return CFX_ByteString(\"Widget\");}\n\n\tvirtual CFX_ByteString\t\tGetName()  {return CFX_ByteString(\"WidgetHandler\");}\n\t\n\tvirtual FX_BOOL\t\t\t\tCanAnswer(CPDFSDK_Annot* pAnnot);\n\n\tvirtual CPDFSDK_Annot*\t\tNewAnnot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPage);\n\n\tvirtual void\t\t\t\tReleaseAnnot(CPDFSDK_Annot* pAnnot)  ;\n\n\tvirtual void\t\t\t\tDeleteAnnot(CPDFSDK_Annot* pAnnot) {}\n\t\n\n\tvirtual CPDF_Rect\t\t\t\tGetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot) ;\n\t\n\tvirtual FX_BOOL\t\t\t\tHitTest(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, const CPDF_Point& point);\n\t\n\n\tvirtual void\t\t\t\tOnDraw(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, \n\t\tCFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\t FX_DWORD dwFlags) ;\n\t\n\tvirtual void\t\t\t\tOnDrawSleep(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, \n\t\tCFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\tconst CPDF_Rect& rcWindow, FX_DWORD dwFlags) {}\n\t\n\n\tvirtual void\t\t\t\tOnCreate(CPDFSDK_Annot* pAnnot) ;\n\n\tvirtual void\t\t\t\tOnLoad(CPDFSDK_Annot* pAnnot) ;\n\n\tvirtual void\t\t\t\tOnDelete(CPDFSDK_Annot* pAnnot) {}\n\n\tvirtual void\t\t\t\tOnRelease(CPDFSDK_Annot* pAnnot) {}\n\t\n\n\tvirtual void\t\t\t\tOnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) ;\n\tvirtual void\t\t\t\tOnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) ;\n\t\n\n\tvirtual FX_BOOL\t\t\t\tOnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ;\n\tvirtual FX_BOOL\t\t\t\tOnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ;\n\tvirtual FX_BOOL\t\t\t\tOnLButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ;\n\tvirtual FX_BOOL\t\t\t\tOnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ;\n\tvirtual FX_BOOL\t\t\t\tOnMouseWheel(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, short zDelta, const CPDF_Point& point) ;\n\tvirtual FX_BOOL\t\t\t\tOnRButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ;\n\tvirtual FX_BOOL\t\t\t\tOnRButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ;\n\tvirtual FX_BOOL\t\t\t\tOnRButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) {return FALSE;}\n\t\n//by wjm.\n\tvirtual FX_BOOL\t\t\t\tOnChar(CPDFSDK_Annot* pAnnot, FX_DWORD nChar, FX_DWORD nFlags);\n\tvirtual FX_BOOL\t\t\t\tOnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag);\n\tvirtual FX_BOOL\t\t\t\tOnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag);\n\n\tvirtual\tvoid\t\t\t\tOnDeSelected(CPDFSDK_Annot* pAnnot) {}\n\tvirtual\tvoid\t\t\t\tOnSelected(CPDFSDK_Annot* pAnnot) {}\n\n\tvirtual FX_BOOL\t\t\t\tOnSetFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\tOnKillFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag);\n\n\tvoid\t\t\t\t\t\tSetFormFiller(CFFL_IFormFiller* pFiller){m_pFormFiller = pFiller;}\n\tCFFL_IFormFiller*\t\t\tGetFormFiller() {return m_pFormFiller;}\nprivate:\n\n\tCPDFDoc_Environment*\t\tm_pApp;\n\tCFFL_IFormFiller*\t\t\tm_pFormFiller;\n};\n\n#define CBA_AnnotHandlerArray CFX_ArrayTemplate<IPDFSDK_AnnotHandler*>\nclass CPDFSDK_AnnotHandlerMgr\n{\npublic:\n\t// Destroy the handler\n\tCPDFSDK_AnnotHandlerMgr(CPDFDoc_Environment* pApp);\n\tvirtual ~CPDFSDK_AnnotHandlerMgr() ;\n\npublic:\n\tvoid\t\t\t\t\t\tRegisterAnnotHandler(IPDFSDK_AnnotHandler* pAnnotHandler);\n\tvoid\t\t\t\t\t\tUnRegisterAnnotHandler(IPDFSDK_AnnotHandler* pAnnotHandler);\n\n\tvirtual CPDFSDK_Annot*\t\tNewAnnot(CPDF_Annot * pAnnot, CPDFSDK_PageView *pPageView);\n\tvirtual void\t\t\t\tReleaseAnnot(CPDFSDK_Annot * pAnnot);\n\t\n\tvirtual void\t\t\t\tAnnot_OnCreate(CPDFSDK_Annot* pAnnot);\n\tvirtual void\t\t\t\tAnnot_OnLoad(CPDFSDK_Annot* pAnnot);\npublic:\n\tIPDFSDK_AnnotHandler*\t\tGetAnnotHandler(CPDFSDK_Annot* pAnnot) const;\n\tvirtual void\t\t\t\tAnnot_OnDraw(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot,\n\t\tCFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,FX_DWORD dwFlags);\n\n\tvirtual void\t\t\t\tAnnot_OnMouseEnter(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags);\n\tvirtual void\t\t\t\tAnnot_OnMouseExit(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags);\n\n\tvirtual FX_BOOL\t\t\t\tAnnot_OnLButtonDown(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point);\n\tvirtual FX_BOOL\t\t\t\tAnnot_OnLButtonUp(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point);\n\tvirtual FX_BOOL\t\t\t\tAnnot_OnLButtonDblClk(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point);\n\t\n\tvirtual FX_BOOL\t\t\t\tAnnot_OnMouseMove(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point);\n\tvirtual FX_BOOL\t\t\t\tAnnot_OnMouseWheel(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, short zDelta, const CPDF_Point& point);\n\tvirtual FX_BOOL\t\t\t\tAnnot_OnRButtonDown(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point);\n\tvirtual FX_BOOL\t\t\t\tAnnot_OnRButtonUp(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point);\n\n\n\tvirtual FX_BOOL\t\t\t\tAnnot_OnChar(CPDFSDK_Annot* pAnnot, FX_DWORD nChar, FX_DWORD nFlags);\n\tvirtual FX_BOOL\t\t\t\tAnnot_OnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag);\n\tvirtual FX_BOOL\t\t\t\tAnnot_OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag);\n\n\tvirtual FX_BOOL\t\t\t\tAnnot_OnSetFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\tAnnot_OnKillFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag);\n\n\tvirtual CPDF_Rect\t\t\tAnnot_OnGetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot);\n\tvirtual FX_BOOL\t\t\t\tAnnot_OnHitTest(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, const CPDF_Point& point);\n\nprivate:\n\tIPDFSDK_AnnotHandler*\t\t\tGetAnnotHandler(const CFX_ByteString& sType) const;\n\tCPDFSDK_Annot*\t\t\t\tGetNextAnnot(CPDFSDK_Annot* pSDKAnnot,FX_BOOL bNext);\nprivate:\n\tCBA_AnnotHandlerArray\t\tm_Handlers;\n\tCFX_MapByteStringToPtr\t\tm_mapType2Handler;\n\tCPDFDoc_Environment*\t\tm_pApp;\n};\n\n//#define CBF_Page2Accessible\t CFX_MapPtrTemplate<CPDFSDK_PageView*, IAccessible*>\n\ntypedef int (*AI_COMPARE) (CPDFSDK_Annot* p1, CPDFSDK_Annot* p2);\n\nclass CPDFSDK_AnnotIterator\n{\nprotected:\n\tCPDFSDK_Annot*\tNextAnnot (const CPDFSDK_Annot* pCurrent) ;\n\tCPDFSDK_Annot*\tPrevAnnot (const CPDFSDK_Annot* pCurrent) ;\t\n\tCPDFSDK_Annot*\tNextAnnot(int& index ) ;\n\tCPDFSDK_Annot*\tPrevAnnot(int& index ) ;\npublic:\n    CPDFSDK_AnnotIterator(CPDFSDK_PageView * pPageView, FX_BOOL bReverse,\n\t\tFX_BOOL bIgnoreTopmost=FALSE,FX_BOOL bCircle=FALSE,CFX_PtrArray* pList=NULL);\t\n\tvirtual CPDFSDK_Annot*\tNext (const CPDFSDK_Annot* pCurrent) ;\n\tvirtual CPDFSDK_Annot*\tPrev (const CPDFSDK_Annot* pCurrent) ;\t\n\tvirtual CPDFSDK_Annot*\tNext(int& index ) ;\n\tvirtual CPDFSDK_Annot*\tPrev(int& index ) ;\n\tvirtual int             Count(){return m_pIteratorAnnotList.GetSize();}\n\t\n\tvirtual FX_BOOL         InitIteratorAnnotList(CPDFSDK_PageView * pPageView,CFX_PtrArray* pList=NULL);\n\t\n\tvoid\t\t\t\t\tInsertSort(CFX_PtrArray &arrayList, AI_COMPARE pCompare);\nprotected:\n\t//\tCFX_PtrList\t\t\t m_pIteratorAnnotList; \n\tCFX_PtrArray\t     m_pIteratorAnnotList;\t\n\tFX_BOOL\t\t\t     m_bReverse;\n\tFX_BOOL              m_bIgnoreTopmost;\n\tFX_BOOL              m_bCircle;\n};\n\n\n\n#endif\n\n"
  },
  {
    "path": "fpdfsdk/include/fsdk_baseannot.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FSDK_BASEANNOT_H_\n#define _FSDK_BASEANNOT_H_\n\n#if _FX_OS_ == _FX_ANDROID_\n#include \"time.h\"\n#else\n#include <ctime>\n#endif\n\nclass CPDFSDK_PageView;\n#define CFX_IntArray\t\t\t\tCFX_ArrayTemplate<int>\n\nclass  CPDFSDK_DateTime : public CFX_Object\n{\npublic:\n\tCPDFSDK_DateTime();\n\tCPDFSDK_DateTime(const CFX_ByteString& dtStr);\n\tCPDFSDK_DateTime(const CPDFSDK_DateTime& datetime);\n\tCPDFSDK_DateTime(const FX_SYSTEMTIME& st);\n\t\n\t\n\tCPDFSDK_DateTime&\toperator = (const CPDFSDK_DateTime& datetime);\n\tCPDFSDK_DateTime&\toperator = (const FX_SYSTEMTIME& st);\n\tFX_BOOL\t\t\t\toperator == (CPDFSDK_DateTime& datetime);\n\tFX_BOOL\t\t\t\toperator != (CPDFSDK_DateTime& datetime);\n\tFX_BOOL\t\t\t\toperator > (CPDFSDK_DateTime& datetime);\n\tFX_BOOL\t\t\t\toperator >= (CPDFSDK_DateTime& datetime);\n\tFX_BOOL\t\t\t\toperator < (CPDFSDK_DateTime& datetime);\n\tFX_BOOL\t\t\t\toperator <= (CPDFSDK_DateTime& datetime);\t\n\t\t\t\t\t\toperator time_t();\n\t\n\tCPDFSDK_DateTime&\tFromPDFDateTimeString(const CFX_ByteString& dtStr);\n\tCFX_ByteString\t\tToCommonDateTimeString();\n\tCFX_ByteString\t\tToPDFDateTimeString();\n\tvoid\t\t\t\tToSystemTime(FX_SYSTEMTIME& st);\n\tCPDFSDK_DateTime\tToGMT();\n\tCPDFSDK_DateTime&\tAddDays(short days);\n\tCPDFSDK_DateTime&\tAddSeconds(int seconds);\n\t\n\tvoid\t\t\t\tResetDateTime();\n\t\n\tstruct FX_DATETIME\n\t{\n\t\tFX_SHORT\tyear;\n\t\tFX_BYTE\t\tmonth;\n\t\tFX_BYTE\t\tday;\n\t\tFX_BYTE\t\thour;\n\t\tFX_BYTE\t\tminute;\n\t\tFX_BYTE\t\tsecond;\n\t\tFX_CHAR\t\ttzHour;\n\t\tFX_BYTE\t\ttzMinute;\n\t}dt;\n};\n\nclass CPDFSDK_Annot\n{\npublic:\n\tCPDFSDK_Annot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPageView);\n\tvirtual ~CPDFSDK_Annot();\npublic:\n\tvirtual FX_FLOAT\t\t\tGetMinWidth() const;\n\tvirtual FX_FLOAT\t\t\tGetMinHeight() const;\n\t//define layout order to 5.\n\tvirtual int\t\t\t\t\tGetLayoutOrder() const { return 5; }\n\npublic:\n\tCPDF_Annot*\t\t\t\t\tGetPDFAnnot();\n\t\n\tvoid\t\t\t\t\t\tSetPage(CPDFSDK_PageView* pPageView);\n\tCPDFSDK_PageView*\t\t\tGetPageView();\t\n\tFX_DWORD\t\t\t\t\tGetFlags();\n\t\n\t// Tab Order\t\n\tint\t\t\t\t\t\t\tGetTabOrder();\n\tvoid\t\t\t\t\t\tSetTabOrder(int iTabOrder);\n\t\n\t// Selection\n\tFX_BOOL\t\t\t\t\t\tIsSelected();\n\tvoid\t\t\t\t\t\tSetSelected(FX_BOOL bSelected);\n\t\n\tCFX_ByteString\t\t\t\tGetType() const;\n\tvirtual CFX_ByteString\t\tGetSubType() const;\n\n\tCPDF_Page*\t\t\t\t\tGetPDFPage();\n\npublic:\n\tCPDF_Dictionary*\t\t\tGetAnnotDict() const;\n\t\n\tvoid\t\t\t\t\t\tSetRect(const CPDF_Rect& rect);\n\tCPDF_Rect\t\t\t\t\tGetRect() const;\n\t\n\tvoid\t\t\t\t\t\tSetContents(const CFX_WideString& sContents);\n\tCFX_WideString\t\t\t\tGetContents() const;\n\t\n\tvoid\t\t\t\t\t\tSetAnnotName(const CFX_WideString& sName);\n\tCFX_WideString\t\t\t\tGetAnnotName() const;\n\t\n\tvoid\t\t\t\t\t\tSetModifiedDate(const FX_SYSTEMTIME& st);\n\tFX_SYSTEMTIME\t\t\t\tGetModifiedDate() const;\n\n\tvoid\t\t\t\t\t\tSetFlags(int nFlags);\n\tint\t\t\t\t\t\t\tGetFlags() const;\n\n\tvoid\t\t\t\t\t\tSetAppState(const CFX_ByteString& str);\n\tCFX_ByteString\t\t\t\tGetAppState() const;\n\t\n\tvoid\t\t\t\t\t\tSetStructParent(int key);\n\tint\t\t\t\t\t\t\tGetStructParent() const;\n\t\n\t//border\n\tvoid\t\t\t\t\t\tSetBorderWidth(int nWidth);\n\tint\t\t\t\t\t\t\tGetBorderWidth() const;\n\t\n\t//BBS_SOLID\n\t//BBS_DASH\n\t//BBS_BEVELED\n\t//BBS_INSET\n\t//BBS_UNDERLINE\n\t\n\tvoid\t\t\t\t\t\tSetBorderStyle(int nStyle);\n\tint\t\t\t\t\t\t\tGetBorderStyle() const;\n\t\n\tvoid\t\t\t\t\t\tSetBorderDash(const CFX_IntArray& array);\n\tvoid\t\t\t\t\t\tGetBorderDash(CFX_IntArray& array) const;\n\t\n\t//The background of the annotation's icon when closed\n\t//The title bar of the annotation's pop-up window\n\t//The border of a link annotation\n\t\n\tvoid\t\t\t\t\t\tSetColor(FX_COLORREF color);\n\tvoid\t\t\t\t\t\tRemoveColor();\n\tFX_BOOL\t\t\t\t\t\tGetColor(FX_COLORREF& color) const;\n\t\n\tFX_BOOL\t\t\t\t\t\tIsVisible() const;\n\t//action\n\n\tCPDF_Action\t\t\t\t\tGetAction() const;\n\tvoid\t\t\t\t\t\tSetAction(const CPDF_Action& a);\n\tvoid\t\t\t\t\t\tRemoveAction();\n\t\n\tCPDF_AAction\t\t\t\tGetAAction() const;\n\tvoid\t\t\t\t\t\tSetAAction(const CPDF_AAction& aa);\n\tvoid\t\t\t\t\t\tRemoveAAction();\n\t\n\tvirtual CPDF_Action\t\t\tGetAAction(CPDF_AAction::AActionType eAAT);\n\t\npublic:\n\tFX_BOOL\t\t\t\t\t\tIsAppearanceValid();\n\tFX_BOOL\t\t\t\t\t\tIsAppearanceValid(CPDF_Annot::AppearanceMode mode);\n\tvoid\t\t\t\t\t\tDrawAppearance(CFX_RenderDevice* pDevice, const CPDF_Matrix* pUser2Device,\n\t\tCPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions);\n\tvoid\t\t\t\t\t\tDrawBorder(CFX_RenderDevice* pDevice, const CPDF_Matrix* pUser2Device,\n\t\tconst CPDF_RenderOptions* pOptions);\n\t\n\tvoid\t\t\t\t\t\tClearCachedAP();\n\t\n\tvirtual void\t\t\t\tResetAppearance();\n\tvoid\t\t\t\t\t\tWriteAppearance(const CFX_ByteString& sAPType, const CPDF_Rect& rcBBox, \n\t\tconst CPDF_Matrix& matrix, const CFX_ByteString& sContents,\n\t\tconst CFX_ByteString& sAPState = \"\");\n\npublic:\n\tvirtual void\t\t\tAnnot_OnDraw(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,CPDF_RenderOptions* pOptions);\npublic:\n\n\nprivate:\n\tFX_BOOL CreateFormFiller();\nprotected:\n\tCPDF_Annot*\t\t\tm_pAnnot;\n\tCPDFSDK_PageView*\tm_pPageView;\n\tFX_BOOL\t\t\t\tm_bSelected;\n\tint\t\t\t\t\tm_nTabOrder;\n\t\n};\n\n\n\n#endif\n\n"
  },
  {
    "path": "fpdfsdk/include/fsdk_baseform.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FSDK_BASEFORM_H_\n#define _FSDK_BASEFORM_H_\n\n#if _FX_OS_ == _FX_ANDROID_\n#include \"time.h\"\n#else\n#include <ctime>\n#endif\n\nclass CPDFSDK_Document;\nclass  CPDFSDK_DateTime;\nstruct CPWL_Color;\nclass CFFL_FormFiller;\nclass CPDFSDK_PageView;\nclass CPDFSDK_InterForm;\n\n\ntypedef struct _PDFSDK_FieldAction\n{\n\t_PDFSDK_FieldAction()\n\t{\n\t\tbModifier = FALSE;\n\t\tbShift = FALSE;\n\t\tnCommitKey = 0;\n\t\tbKeyDown = FALSE;\n\t\tnSelEnd = nSelStart = 0;\n\t\tbWillCommit = FALSE;\n\t\tbFieldFull = FALSE;\n\t\tbRC = TRUE;\n\t}\n\t\n\tFX_BOOL\t\t\t\t\tbModifier;\t\t//in\n\tFX_BOOL\t\t\t\t\tbShift;\t\t\t//in\n\tint\t\t\t\t\t\tnCommitKey;\t\t//in\n\tCFX_WideString\t\t\tsChange;\t\t//in[out]\n\tCFX_WideString\t\t\tsChangeEx;\t\t//in\n\tFX_BOOL\t\t\t\t\tbKeyDown;\t\t//in\n\tint\t\t\t\t\t\tnSelEnd;\t\t//in[out]\n\tint\t\t\t\t\t\tnSelStart;\t\t//in[out]\n\tCFX_WideString\t\t\tsValue;\t\t\t//in[out]\n\tFX_BOOL\t\t\t\t\tbWillCommit;\t//in\n\tFX_BOOL\t\t\t\t\tbFieldFull;\t\t//in\n\tFX_BOOL\t\t\t\t\tbRC;\t\t\t//in[out]\n}PDFSDK_FieldAction;\nclass CPDFSDK_Widget:public CPDFSDK_Annot\n{\npublic:\n\tCPDFSDK_Widget(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPageView, CPDFSDK_InterForm* pInterForm);\n\tvirtual ~CPDFSDK_Widget();\n\n\tvirtual CFX_ByteString\t\t\tGetSubType() const;\n\t\n\tvirtual CPDF_Action\t\t\t\tGetAAction(CPDF_AAction::AActionType eAAT);\n\n\tint\t\t\t\t\t\t\t\tGetFieldType() const;\n\t//define layout order to 2.\n\tvirtual int\t\t\t\t\t\tGetLayoutOrder() {return 2;}\n\t/*\n\tFIELDFLAG_READONLY\n\tFIELDFLAG_REQUIRED\n\tFIELDFLAG_NOEXPORT\n\t*/\n\t\n\tint\t\t\t\t\t\t\t\tGetFieldFlags() const;\n\tint\t\t\t\t\t\t\t\tGetRotate() const;\n\n\tFX_BOOL\t\t\t\t\t\t\tGetFillColor(FX_COLORREF& color) const;\n\tFX_BOOL\t\t\t\t\t\t\tGetBorderColor(FX_COLORREF& color) const;\n\tFX_BOOL\t\t\t\t\t\t\tGetTextColor(FX_COLORREF& color) const;\n\tFX_FLOAT\t\t\t\t\t\tGetFontSize() const;\n\n\tint\t\t\t\t\t\t\t\tGetSelectedIndex(int nIndex) const;\n\tCFX_WideString\t\t\t\t\tGetValue() const;\n\tCFX_WideString\t\t\t\t\tGetDefaultValue() const;\n\tCFX_WideString\t\t\t\t\tGetOptionLabel(int nIndex) const;\n\tint\t\t\t\t\t\t\t\tCountOptions() const;\n\tFX_BOOL\t\t\t\t\t\t\tIsOptionSelected(int nIndex) const;\n\tint\t\t\t\t\t\t\t\tGetTopVisibleIndex() const;\n\tFX_BOOL\t\t\t\t\t\t\tIsChecked() const;\n\t/*\n\tBF_ALIGN_LEFT\n\tBF_ALIGN_MIDDL\n\tBF_ALIGN_RIGHT\n\t*/\n\tint\t\t\t\t\t\t\t\tGetAlignment() const;\n\tint\t\t\t\t\t\t\t\tGetMaxLen() const;\n\tCFX_WideString\t\t\t\t\tGetAlternateName() const;\n\n//Set Properties.\n\tvoid\t\t\t\t\t\t\tSetCheck(FX_BOOL bChecked, FX_BOOL bNotify);\n\tvoid\t\t\t\t\t\t\tSetValue(const CFX_WideString& sValue, FX_BOOL bNotify);\n\tvoid\t\t\t\t\t\t\tSetDefaultValue(const CFX_WideString& sValue);\n\tvoid\t\t\t\t\t\t\tSetOptionSelection(int index, FX_BOOL bSelected, FX_BOOL bNotify);\n\tvoid\t\t\t\t\t\t\tClearSelection(FX_BOOL bNotify);\n\tvoid\t\t\t\t\t\t\tSetTopVisibleIndex(int index);\n\n\tvoid\t\t\t\t\t\t\tResetAppearance(FX_LPCWSTR sValue, FX_BOOL bValueChanged);\n\tvoid\t\t\t\t\t\t\tResetFieldAppearance(FX_BOOL bValueChanged);\n\tvoid\t\t\t\t\t\t\tUpdateField();\n\tCFX_WideString\t\t\t\t\tOnFormat(int nCommitKey, FX_BOOL& bFormated);\n\t\n//Message.\n \tFX_BOOL\t\t\t\t\t\t\tOnAAction(CPDF_AAction::AActionType type, PDFSDK_FieldAction& data, \n\t\t\t\t\t\t\t\t\t\t\t\tCPDFSDK_PageView* pPageView);\n\n\tCPDFSDK_InterForm*\t\t\t\tGetInterForm() const {return m_pInterForm;}\n\tCPDF_FormField*\t\t\t\t\tGetFormField() const;\n\tCPDF_FormControl*\t\t\t\tGetFormControl() const;\n\tstatic CPDF_FormControl*\t\tGetFormControl(CPDF_InterForm* pInterForm, CPDF_Dictionary* pAnnotDict);\n\n\tvoid\t\t\t\t\t\t\tDrawShadow(CFX_RenderDevice* pDevice, CPDFSDK_PageView* pPageView);\n\t\n\tvoid\t\t\t\t\t\t\tSetAppModified();\n\tvoid\t\t\t\t\t\t\tClearAppModified();\n\tFX_BOOL\t\t\t\t\t\t\tIsAppModified() const;\n\t\n\tFX_INT32\t\t\t\t\t\tGetAppearanceAge() const;\n\tFX_INT32\t\t\t\t\t\tGetValueAge() const;\n\t\nprivate:\n\tvoid\t\t\t\t\t\t\tResetAppearance_PushButton();\n\tvoid\t\t\t\t\t\t\tResetAppearance_CheckBox();\n\tvoid\t\t\t\t\t\t\tResetAppearance_RadioButton();\n\tvoid\t\t\t\t\t\t\tResetAppearance_ComboBox(FX_LPCWSTR sValue);\n\tvoid\t\t\t\t\t\t\tResetAppearance_ListBox();\n\tvoid\t\t\t\t\t\t\tResetAppearance_TextField(FX_LPCWSTR sValue);\n\t\n\tCPDF_Rect\t\t\t\t\t\tGetClientRect() const;\n\tCPDF_Rect\t\t\t\t\t\tGetRotatedRect() const;\n\t\n\tCFX_ByteString\t\t\t\t\tGetBackgroundAppStream() const;\n\tCFX_ByteString\t\t\t\t\tGetBorderAppStream() const;\n\tCPDF_Matrix\t\t\t\t\t\tGetMatrix() const;\n\t\n\tCPWL_Color\t\t\t\t\t\tGetTextPWLColor() const;\n\tCPWL_Color\t\t\t\t\t\tGetBorderPWLColor() const;\n\tCPWL_Color\t\t\t\t\t\tGetFillPWLColor() const;\n\t\n\tvoid\t\t\t\t\t\t\tAddImageToAppearance(const CFX_ByteString& sAPType, CPDF_Stream* pImage);\n\tvoid\t\t\t\t\t\t\tRemoveAppearance(const CFX_ByteString& sAPType);\npublic:\n\tFX_BOOL\t\t\t\t\t\t\tIsWidgetAppearanceValid(CPDF_Annot::AppearanceMode mode);\n\tvoid\t\t\t\t\t\t\tDrawAppearance(CFX_RenderDevice* pDevice, const CPDF_Matrix* pUser2Device,\n\t\tCPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions);\npublic:\n\tFX_BOOL\t\t\t\t\t\t\tHitTest(FX_FLOAT pageX, FX_FLOAT pageY);\nprivate:\n\tCPDFSDK_InterForm*\t\t\t\tm_pInterForm;\n\tFX_BOOL\t\t\t\t\t\t\tm_bAppModified;\n\tFX_INT32\t\t\t\t\t\tm_nAppAge;\n\tFX_INT32\t\t\t\t\t\tm_nValueAge;\n};\n\n#define CPDFSDK_WidgetMap\t\t\t\tCFX_MapPtrTemplate<CPDF_FormControl*, CPDFSDK_Widget*>\n\nclass CPDFSDK_InterForm : public CPDF_FormNotify\n{\npublic:\n\tCPDFSDK_InterForm(CPDFSDK_Document* pDocument);\n\tvirtual ~CPDFSDK_InterForm();\n\t\npublic:\n\tvirtual void\t\t\t\t\tDestroy();\n\tvirtual CPDF_InterForm*\t\t\tGetInterForm();\n\t\n\tCPDFSDK_Document*\t\t\t\tGetDocument();\n\tFX_BOOL\t\t\t\t\t\t\tHighlightWidgets();\n\t\n\tCPDFSDK_Widget*\t\t\t\t\tGetSibling(CPDFSDK_Widget* pWidget, FX_BOOL bNext) const;\n\tCPDFSDK_Widget*\t\t\t\t\tGetWidget(CPDF_FormControl* pControl) const;\n\tvoid\t\t\t\t\t\t\tGetWidgets(const CFX_WideString& sFieldName, CFX_PtrArray& widgets);\n\tvoid\t\t\t\t\t\t\tGetWidgets(CPDF_FormField* pField, CFX_PtrArray& widgets);\n\t\n\tvoid\t\t\t\t\t\t\tAddMap(CPDF_FormControl* pControl, CPDFSDK_Widget* pWidget);\n\tvoid\t\t\t\t\t\t\tRemoveMap(CPDF_FormControl* pControl);\n\t\n\tvoid\t\t\t\t\t\t\tEnableCalculate(FX_BOOL bEnabled);\n\tFX_BOOL\t\t\t\t\t\t\tIsCalculateEnabled() const;\n\n#ifdef _WIN32\n\tCPDF_Stream*\t\t\t\t\tLoadImageFromFile(const CFX_WideString& sFile);\n#endif\n\n\tvoid\t\t\t\t\t\t\tOnKeyStrokeCommit(CPDF_FormField* pFormField, CFX_WideString& csValue, FX_BOOL& bRC);\n\tvoid\t\t\t\t\t\t\tOnValidate(CPDF_FormField* pFormField, CFX_WideString& csValue, FX_BOOL& bRC);\n\tvoid\t\t\t\t\t\t\tOnCalculate(CPDF_FormField* pFormField = NULL);\n\tCFX_WideString\t\t\t\t\tOnFormat(CPDF_FormField* pFormField, int nCommitKey, FX_BOOL& bFormated);\n\t\n\tvoid\t\t\t\t\t\t\tResetFieldAppearance(CPDF_FormField* pFormField, FX_LPCWSTR sValue, FX_BOOL bValueChanged);\n\tvoid\t\t\t\t\t\t\tUpdateField(CPDF_FormField* pFormField);\n\t\npublic:\n\tFX_BOOL\t\t\t\t\t\t\tDoAction_Hide(const CPDF_Action& action);\n\tFX_BOOL\t\t\t\t\t\t\tDoAction_SubmitForm(const CPDF_Action& action);\n\tFX_BOOL\t\t\t\t\t\t\tDoAction_ResetForm(const CPDF_Action& action);\n\tFX_BOOL\t\t\t\t\t\t\tDoAction_ImportData(const CPDF_Action& action);\n\t\n\tvoid\t\t\t\t\t\t\tGetFieldFromObjects(const CFX_PtrArray& objects, CFX_PtrArray& fields);\n\tFX_BOOL\t\t\t\t\t\t\tIsValidField(CPDF_Dictionary* pFieldDict);\n\tFX_BOOL\t\t\t\t\t\t\tSubmitFields(const CFX_WideString& csDestination, const CFX_PtrArray& fields, \n\t\tFX_BOOL bIncludeOrExclude, FX_BOOL bUrlEncoded);\n\tFX_BOOL\t\t\t\t\t\t\tSubmitForm(const CFX_WideString& sDestination, FX_BOOL bUrlEncoded);\n\tFX_BOOL\t\t\t\t\t\t\tImportFormFromFDFFile(const CFX_WideString& csFDFFileName, FX_BOOL bNotify);\n\tFX_BOOL\t\t\t\t\t\t\tExportFormToFDFFile(const CFX_WideString& sFDFFileName);\n\tFX_BOOL\t\t\t\t\t\t\tExportFormToFDFTextBuf(CFX_ByteTextBuf& textBuf);\n\tFX_BOOL\t\t\t\t\t\t\tExportFieldsToFDFFile(const CFX_WideString& sFDFFileName, const CFX_PtrArray& fields,\n\t\tFX_BOOL bIncludeOrExclude);\n\tFX_BOOL\t\t\t\t\t\t\tExportFieldsToFDFTextBuf(const CFX_PtrArray& fields,FX_BOOL bIncludeOrExclude, CFX_ByteTextBuf& textBuf);\n\tFX_BOOL\t\t\t\t\t\t\tExportFormToTxtFile(const CFX_WideString& sTxtFileName);\n\tFX_BOOL\t\t\t\t\t\t\tImportFormFromTxtFile(const CFX_WideString& sTxtFileName);\n\tCFX_WideString\t\t\t\t\tGetTemporaryFileName(const CFX_WideString& sFileExt);\n\t\nprivate:\n\tvirtual int\t\t\t\t\t\tBeforeValueChange(const CPDF_FormField* pField, CFX_WideString& csValue);\n\tvirtual int\t\t\t\t\t\tAfterValueChange(const CPDF_FormField* pField);\n\tvirtual int\t\t\t\t\t\tBeforeSelectionChange(const CPDF_FormField* pField, CFX_WideString& csValue);\n\tvirtual int\t\t\t\t\t\tAfterSelectionChange(const CPDF_FormField* pField);\n\tvirtual int\t\t\t\t\t\tAfterCheckedStatusChange(const CPDF_FormField* pField, const CFX_ByteArray& statusArray);\n\tvirtual int\t\t\t\t\t\tBeforeFormReset(const CPDF_InterForm* pForm);\n\tvirtual int\t\t\t\t\t\tAfterFormReset(const CPDF_InterForm* pForm);\n\tvirtual int\t\t\t\t\t\tBeforeFormImportData(const CPDF_InterForm* pForm);\n\tvirtual int\t\t\t\t\t\tAfterFormImportData(const CPDF_InterForm* pForm);\n\t\nprivate:\n\tFX_BOOL\t\t\t\t\t\t\tFDFToURLEncodedData(CFX_WideString csFDFFile, CFX_WideString csTxtFile);\n\tFX_BOOL\t\t\t\t\t\t\tFDFToURLEncodedData(FX_LPBYTE& pBuf, FX_STRSIZE& nBufSize);\n\tint\t\t\t\t\t\t\t\tGetPageIndexByAnnotDict(CPDF_Document* pDocument, CPDF_Dictionary* pAnnotDict) const;\n\tvoid\t\t\t\t\t\t\tDoFDFBuffer(CFX_ByteString sBuffer);\n\t\nprivate:\n\tCPDFSDK_Document*\t\t\t\tm_pDocument;\n\tCPDF_InterForm*\t\t\t\t\tm_pInterForm;\n\tCPDFSDK_WidgetMap\t\t\t\tm_Map;\n\tFX_BOOL\t\t\t\t\t\t\tm_bCalculate;\n\tFX_BOOL\t\t\t\t\t\t\tm_bBusy;\n\npublic:\n\tFX_BOOL IsNeedHighLight(int nFieldType);\n\tvoid    RemoveAllHighLight();\n\tvoid    SetHighlightAlpha(FX_BYTE alpha) {m_iHighlightAlpha = alpha;}\n\tFX_BYTE GetHighlightAlpha() {return m_iHighlightAlpha;}\n\tvoid    SetHighlightColor(FX_COLORREF clr, int nFieldType);\n\tFX_COLORREF GetHighlightColor(int nFieldType);\nprivate:\n\tFX_COLORREF m_aHighlightColor[6];\n\tFX_BYTE m_iHighlightAlpha;\n\tFX_BOOL\tm_bNeedHightlight[6];\n};\n\n#define BAI_STRUCTURE\t\t0\n#define BAI_ROW\t\t\t\t1\n#define BAI_COLUMN\t\t\t2\n\n#define CPDFSDK_Annots\t\t\t\tCFX_ArrayTemplate<CPDFSDK_Annot*>\n#define CPDFSDK_SortAnnots\t\t\tCGW_ArrayTemplate<CPDFSDK_Annot*>\nclass CBA_AnnotIterator \n{\npublic:\n\tCBA_AnnotIterator(CPDFSDK_PageView* pPageView, const CFX_ByteString& sType, const CFX_ByteString& sSubType);\n\tvirtual ~CBA_AnnotIterator();\n\t\n\tvirtual CPDFSDK_Annot*\t\t\t\tGetFirstAnnot();\n\tvirtual CPDFSDK_Annot*\t\t\t\tGetLastAnnot();\n\tvirtual CPDFSDK_Annot*\t\t\t\tGetNextAnnot(CPDFSDK_Annot* pAnnot);\n\tvirtual CPDFSDK_Annot*\t\t\t\tGetPrevAnnot(CPDFSDK_Annot* pAnnot);\n\t\n\tvirtual void\t\t\t\t\t\tRelease(){delete this;}\n\t\nprivate:\n\tvoid\t\t\t\t\t\t\t\tGenerateResults();\n\tstatic int\t\t\t\t\t\t\tCompareByLeft(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2);\n\tstatic int\t\t\t\t\t\t\tCompareByTop(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2);\n\t\n\tstatic CPDF_Rect\t\t\t\t\tGetAnnotRect(CPDFSDK_Annot* pAnnot);\n\t\nprivate:\n\tCPDFSDK_PageView*\t\t\t\t\tm_pPageView;\n\tCFX_ByteString\t\t\t\t\t\tm_sType;\n\tCFX_ByteString\t\t\t\t\t\tm_sSubType;\n\tint\t\t\t\t\t\t\t\t\tm_nTabs;\n\t\n\tCPDFSDK_Annots\t\t\t\t\t\tm_Annots;\n};\n\n#endif //#define _FSDK_BASEFORM_H_\n\n"
  },
  {
    "path": "fpdfsdk/include/fsdk_common.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FSDK_COMMON_H_\n#define _FSDK_COMMON_H_\n\n#define BFFT_SIGNATURE\t\t\t\t\"Signature\"\n\n//for all fields\n#define FIELDFLAG_READONLY\t\t\t\t\t1\n#define FIELDFLAG_REQUIRED\t\t\t\t\t2\n#define FIELDFLAG_NOEXPORT\t\t\t\t\t4\n//for text fields\n#define FIELDFLAG_MULTILINE\t\t\t\t\t(1<<12)\n#define FIELDFLAG_PASSWORD\t\t\t\t\t(1<<13)\n#define FIELDFLAG_FILESELECT\t\t\t\t(1<<20)\n#define FIELDFLAG_DONOTSPELLCHECK\t\t\t(1<<22)\n#define FIELDFLAG_DONOTSCROLL\t\t\t\t(1<<23)\n#define FIELDFLAG_COMB\t\t\t\t\t\t(1<<24)\n#define FIELDFLAG_RICHTEXT\t\t\t\t\t(1<<25)\n//for button fileds\n#define FIELDFLAG_NOTOGGLETOOFF\t\t\t\t(1<<14)\n#define FIELDFLAG_RADIO\t\t\t\t\t\t(1<<15)\n#define FIELDFLAG_PUSHBUTTON\t\t\t\t(1<<16)\n#define FIELDFLAG_RADIOSINUNISON\t\t\t(1<<25)\n//for choice fields\n#define FIELDFLAG_COMBO\t\t\t\t\t\t(1<<17)\n#define FIELDFLAG_EDIT\t\t\t\t\t\t(1<<18)\n#define FIELDFLAG_SORT\t\t\t\t\t\t(1<<19)\n#define FIELDFLAG_MULTISELECT\t\t\t\t(1<<21)\n#ifndef FIELDFLAG_DONOTSPELLCHECK\n#define FIELDFLAG_DONOTSPELLCHECK\t\t(1<<22)\n#endif\n#define FIELDFLAG_COMMITONSELCHANGE\t\t\t(1<<26)\n\n#define BBS_SOLID\t\t\t\t\t0\n#define BBS_DASH\t\t\t\t\t1\n#define BBS_BEVELED\t\t\t\t\t2\n#define BBS_INSET\t\t\t\t\t3\n#define BBS_UNDERLINE\t\t\t\t4\n\n\n#endif\n"
  },
  {
    "path": "fpdfsdk/include/fsdk_define.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDFSDK_DEFINE_H\n#define _FPDFSDK_DEFINE_H\n\n#ifdef _WIN32\n#include <tchar.h>\n#include <math.h>\n#endif\n\n//#define API5\n#define API6\n#define  _FPDFAPI_ASYNC_PARSING_\n#define _FXSDK_OPENSOURCE_\n\n#ifdef _FPDFEMB_WCE_\n\t#include \"../../core/include/fpdfapi/fpdfapi.h\" \n\t#include \"../../core/include/fpdfapi/fpdf_parser.h\" \n\t#include \"../../core/include/fpdfapi/fpdf_module.h\" \n\t#include \"../../core/include/fpdfapi/fpdf_render.h\" \n\t#include \"../../core/include/fpdfapi/fpdf_pageobj.h\" \n\t#include \"../../core/include/fpdfapi/fpdf_serial.h\" \n\n\t#include \"../../core/include/fpdftext/fpdf_text.h\"\n\n\t#include \"../../core/include/fxge/fx_ge_win32.h\"\n\t#include \"../../core/include/fxge/fx_ge.h\"\n\n\t#include \"../../core/include/fxcodec/fx_codec.h\"\n\n\t#include \"../../core/include/fpdfdoc/fpdf_doc.h\" \n\t#include \"../../core/include/fpdfdoc/fpdf_vt.h\" \n\n\t#include \"../../core/include/fxcrt/fx_xml.h\" \n\t#include \"../../core/include/fxcrt/fx_crypt.h\"\n\n#else\n\t#ifdef API6\n\t\t#include \"../../core/include/fpdfapi/fpdf_parser.h\" \n\t\t#include \"../../core/include/fpdfapi/fpdfapi.h\" \n\t\t#include \"../../core/include/fpdfapi/fpdf_parser.h\" \n\t\t#include \"../../core/include/fpdfapi/fpdf_module.h\" \n\t\t#include \"../../core/include/fpdfapi/fpdf_render.h\" \n\t\t#include \"../../core/include/fpdfapi/fpdf_pageobj.h\" \n\t\t#include \"../../core/include/fpdfapi/fpdf_serial.h\" \n\n\t\t#include \"../../core/include/fpdftext/fpdf_text.h\"\n\n\t\t#include \"../../core/include/fxge/fx_ge_win32.h\"\n\t\t#include \"../../core/include/fxge/fx_ge.h\"\n\n\t\t#include \"../../core/include/fxcodec/fx_codec.h\"\n\n\t\t#include \"../../core/include/fpdfdoc/fpdf_doc.h\" \n\t\t#include \"../../core/include/fpdfdoc/fpdf_vt.h\" \n\n\t\t#include \"../../core/include/fxcrt/fx_xml.h\" \n\t//\t#include \"../../core/include/fdrm/fx_crypt.h\"\n\t\t#ifdef _LICENSED_BUILD_\n\t\t\t#include \"../../cryptopp/Cryptlib.h\"\n\t\t#endif\n\t#endif\n#endif\n\n\n#ifndef FX_GetAValue\n/** @brief It retrieves an intensity value for the alpha component of a #FX_ARGB value. */\n#define FX_GetAValue(argb)\t\t\t((argb & 0xFF000000) >> 24)\n#endif\n\n#ifndef FX_GetRValue\n/** @brief It retrieves an intensity value for the red component of a #FX_ARGB value. */\n#define FX_GetRValue(argb)\t\t\t((argb & 0x00FF0000) >> 16)\n#endif\n\n#ifndef FX_GetGValue\n/** @brief It retrieves an intensity value for the green component of a #FX_ARGB value. */\n#define FX_GetGValue(argb)\t\t\t((argb & 0x0000FF00) >> 8)\n#endif\n\n#ifndef FX_GetBValue\n/** @brief It retrieves an intensity value for the blue component of a #FX_ARGB value. */\n#define FX_GetBValue(argb)\t\t\t(argb & 0x000000FF)\n#endif\n\n#ifndef FX_ARGBTOCOLORREF\n/** @brief Convert a #FX_ARGB to a #FX_COLORREF. */\n#define FX_ARGBTOCOLORREF(argb)\t\t((((FX_DWORD)argb & 0x00FF0000) >> 16)|((FX_DWORD)argb & 0x0000FF00)|(((FX_DWORD)argb & 0x000000FF) << 16))\n#endif\n\n#ifndef FX_COLORREFTOARGB\n/** @brief Convert a #FX_COLORREF to a #FX_ARGB. */\n#define FX_COLORREFTOARGB(rgb)\t\t((FX_DWORD)0xFF000000|(((FX_DWORD)rgb & 0x000000FF) << 16)|((FX_DWORD)rgb & 0x0000FF00)|(((FX_DWORD)rgb & 0x00FF0000) >> 16))\n#endif\n\ntypedef unsigned int FX_UINT;\t\n\n#include \"fpdfview.h\"\n\nclass CPDF_CustomAccess FX_FINAL : public IFX_FileRead, public CFX_Object\n{\npublic:\n\tCPDF_CustomAccess(FPDF_FILEACCESS* pFileAccess);\n\t~CPDF_CustomAccess() {}\n\n\tvirtual CFX_ByteString GetFullPath() { return \"\"; }\n\tvirtual FX_FILESIZE\tGetSize() { return m_FileAccess.m_FileLen; }\n\n\tvirtual FX_BOOL\t\tGetByte(FX_DWORD pos, FX_BYTE& ch);\n\tvirtual FX_BOOL\t\tGetBlock(FX_DWORD pos, FX_LPBYTE pBuf, FX_DWORD size);\n\tvirtual void\t\tRelease() { delete this; }\n\n\tvirtual FX_BOOL\t\tReadBlock(void* buffer, FX_FILESIZE offset, size_t size);\n\n\tFPDF_FILEACCESS\t\tm_FileAccess;\n\tFX_BYTE\t\t\t\tm_Buffer[512];\n\tFX_DWORD\t\t\tm_BufferOffset;\n};\n\nvoid\t\tFSDK_SetSandBoxPolicy(FPDF_DWORD policy, FPDF_BOOL enable);\nFPDF_BOOL\tFSDK_IsSandBoxPolicyEnabled(FPDF_DWORD policy);\n\n\n#endif//_FPDFSDK_DEFINE_H\n"
  },
  {
    "path": "fpdfsdk/include/fsdk_mgr.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FPDFSDK_MGR_H\n#define _FPDFSDK_MGR_H\n\n#include \"fsdk_common.h\"\n#include \"fsdk_define.h\"\n#include \"fx_systemhandler.h\"\n#include \"fsdk_baseannot.h\"\n#include \"fsdk_baseform.h\"\n#include \"fpdfformfill.h\"\n#include \"fsdk_annothandler.h\"\n#include \"fsdk_actionhandler.h\"\n\n//cross platform keycode and events define.\n#include \"fpdf_fwlevent.h\"\n\n\nclass CPDFSDK_Document;\nclass CPDFSDK_PageView;\nclass CPDFSDK_Annot;\nclass CFFL_IFormFiller;\nclass CPDFSDK_Widget;\nclass IFX_SystemHandler;\nclass CPDFSDK_ActionHandler;\nclass CJS_RuntimeFactory;\n\n//#include \"javascript/IJavaScript.h\"\n\nclass CPDFDoc_Environment FX_FINAL\n{\npublic:\n\tCPDFDoc_Environment(CPDF_Document * pDoc);\n\t~CPDFDoc_Environment();\n\n\tint RegAppHandle(FPDF_FORMFILLINFO* pFFinfo);//{ m_pInfo  = pFFinfo; return TRUE;}\n\n\tvoid FFI_Invalidate(FPDF_PAGE page, double left, double top, double right, double bottom)\n\t{\n\t\tif (m_pInfo && m_pInfo->FFI_Invalidate) \n\t\t{\n\t\t\tm_pInfo->FFI_Invalidate(m_pInfo, page, left, top, right, bottom);\n\t\t}\n\t}\n\tvoid FFI_OutputSelectedRect(FPDF_PAGE page, double left, double top, double right, double bottom)\n\t{\n\t\tif (m_pInfo && m_pInfo->FFI_OutputSelectedRect) \n\t\t{\n\t\t\tm_pInfo->FFI_OutputSelectedRect(m_pInfo, page, left, top, right, bottom);\n\t\t}\n\t}\n\n\tvoid FFI_SetCursor(int nCursorType)\n\t{\n\t\tif (m_pInfo && m_pInfo->FFI_SetCursor) \n\t\t{\n\t\t\tm_pInfo->FFI_SetCursor(m_pInfo, nCursorType);\n\t\t}\n\t}\n\n\tint  FFI_SetTimer(int uElapse, TimerCallback lpTimerFunc)\n\t{\n\t\tif (m_pInfo && m_pInfo->FFI_SetTimer) \n\t\t{\n\t\t\treturn m_pInfo->FFI_SetTimer(m_pInfo, uElapse, lpTimerFunc);\n\t\t}\n\t\treturn -1;\n\t}\n\t\t\n\tvoid FFI_KillTimer(int nTimerID)\n\t{\n\t\tif (m_pInfo && m_pInfo->FFI_KillTimer) \n\t\t{\n\t\t\tm_pInfo->FFI_KillTimer(m_pInfo, nTimerID);\n\t\t}\n\t}\n\tFX_SYSTEMTIME FFI_GetLocalTime()\n\t{\n\t\tFX_SYSTEMTIME fxtime;\n\t\tif(m_pInfo && m_pInfo->FFI_GetLocalTime)\n\t\t{\n\t\t\tFPDF_SYSTEMTIME systime = m_pInfo->FFI_GetLocalTime(m_pInfo);\n\t\t\tfxtime.wDay = systime.wDay;\n\t\t\tfxtime.wDayOfWeek = systime.wDayOfWeek;\n\t\t\tfxtime.wHour = systime.wHour;\n\t\t\tfxtime.wMilliseconds = systime.wMilliseconds;\n\t\t\tfxtime.wMinute = systime.wMinute;\n\t\t\tfxtime.wMonth = systime.wMonth;\n\t\t\tfxtime.wSecond = systime.wSecond;\n\t\t\tfxtime.wYear = systime.wYear;\n\t\t}\n\t\treturn fxtime;\n\t}\n\n\tvoid FFI_OnChange()\n\t{\n\t\tif(m_pInfo && m_pInfo->FFI_OnChange)\n\t\t{\n\t\t\tm_pInfo->FFI_OnChange(m_pInfo);\n\t\t}\n\t}\n\n\tFX_BOOL\tFFI_IsSHIFTKeyDown(FX_DWORD nFlag)\n\t{\n\t\t\n\t\treturn (nFlag & FWL_EVENTFLAG_ShiftKey) != 0;\n\t}\n\tFX_BOOL\tFFI_IsCTRLKeyDown(FX_DWORD nFlag)\n\t{\n\n\t\treturn (nFlag & FWL_EVENTFLAG_ControlKey) != 0;\n\t}\n\tFX_BOOL\tFFI_IsALTKeyDown(FX_DWORD nFlag)\n\t{\n\n\t\treturn (nFlag & FWL_EVENTFLAG_AltKey) != 0;\n\t}\n\tFX_BOOL\tFFI_IsINSERTKeyDown(FX_DWORD nFlag)\n\t{\n\t\treturn FALSE;\n\t}\n\n\tint JS_appAlert(FX_LPCWSTR Msg, FX_LPCWSTR Title, FX_UINT Type, FX_UINT Icon)\n\t{\n\t\tif(m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->app_alert)\n\t\t{\n\t\t\tCFX_ByteString bsMsg = CFX_WideString(Msg).UTF16LE_Encode();\n\t\t\tCFX_ByteString bsTitle = CFX_WideString(Title).UTF16LE_Encode();\n\t\t\tFPDF_WIDESTRING pMsg = (FPDF_WIDESTRING)bsMsg.GetBuffer(bsMsg.GetLength());\n\t\t\tFPDF_WIDESTRING pTitle = (FPDF_WIDESTRING)bsTitle.GetBuffer(bsTitle.GetLength());\n\t\t\tint ret = m_pInfo->m_pJsPlatform->app_alert(m_pInfo->m_pJsPlatform, pMsg, pTitle, Type, Icon);\n\t\t\tbsMsg.ReleaseBuffer();\n\t\t\tbsTitle.ReleaseBuffer();\n\t\t\treturn ret;\n\t\t}\n\t\treturn -1;\n\t}\n\n\tint JS_appResponse(FX_LPCWSTR Question, FX_LPCWSTR Title, FX_LPCWSTR Default, FX_LPCWSTR cLabel, FPDF_BOOL bPassword, void* response, int length)\n\t{\n\t\tif (m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->app_response)\n\t\t{\n\t\t\tCFX_ByteString bsQuestion = CFX_WideString(Question).UTF16LE_Encode();\n\t\t\tCFX_ByteString bsTitle = CFX_WideString(Title).UTF16LE_Encode();\n\t\t\tCFX_ByteString bsDefault = CFX_WideString(Default).UTF16LE_Encode();\n\t\t\tCFX_ByteString bsLabel = CFX_WideString(cLabel).UTF16LE_Encode();\n\t\t\tFPDF_WIDESTRING pQuestion = (FPDF_WIDESTRING)bsQuestion.GetBuffer(bsQuestion.GetLength());\n\t\t\tFPDF_WIDESTRING pTitle = (FPDF_WIDESTRING)bsTitle.GetBuffer(bsTitle.GetLength());\n\t\t\tFPDF_WIDESTRING pDefault = (FPDF_WIDESTRING)bsDefault.GetBuffer(bsDefault.GetLength());\n\t\t\tFPDF_WIDESTRING pLabel = (FPDF_WIDESTRING)bsLabel.GetBuffer(bsLabel.GetLength());\n\t\t\tint ret = m_pInfo->m_pJsPlatform->app_response(m_pInfo->m_pJsPlatform, pQuestion, pTitle, \n\t\t\t\tpDefault, pLabel, bPassword, response, length);\n\t\t\tbsQuestion.ReleaseBuffer();\n\t\t\tbsTitle.ReleaseBuffer();\n\t\t\tbsDefault.ReleaseBuffer();\n\t\t\tbsLabel.ReleaseBuffer();\n\t\t\treturn ret;\n\t\t}\n\t\treturn -1;\n\t}\n\n\tvoid JS_appBeep(int nType)\n\t{\n\t\tif(m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->app_beep)\n\t\t{\n\t\t\tm_pInfo->m_pJsPlatform->app_beep(m_pInfo->m_pJsPlatform, nType);\n\t\t}\n\t}\n\n\tCFX_WideString JS_fieldBrowse()\n\t{\n\t\tif(m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->Field_browse)\n\t\t{\n\t\t\tint nLen = m_pInfo->m_pJsPlatform->Field_browse(m_pInfo->m_pJsPlatform, NULL, 0);\n\t\t\tif(nLen <= 0)\n\t\t\t\treturn L\"\";\n\t\t\tchar* pbuff = new char[nLen];\n\t\t\tif(pbuff)\n\t\t\t\tmemset(pbuff, 0, nLen);\n\t\t\telse\t\n\t\t\t\treturn L\"\";\n\t\t\tnLen = m_pInfo->m_pJsPlatform->Field_browse(m_pInfo->m_pJsPlatform, pbuff, nLen);\n\t\t\tCFX_ByteString bsRet = CFX_ByteString(pbuff, nLen);\n\t\t\tCFX_WideString wsRet = CFX_WideString::FromLocal(bsRet);\n\t\t\tdelete[] pbuff;\n\t\t\treturn wsRet;\n\t\t}\n\t\treturn L\"\";\n\t}\n\n\tCFX_WideString JS_docGetFilePath()\n\t{\t\t\n\t\tif(m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->Doc_getFilePath)\n\t\t{\n\t\t\tint nLen = m_pInfo->m_pJsPlatform->Doc_getFilePath(m_pInfo->m_pJsPlatform, NULL, 0);\n\t\t\tif(nLen <= 0)\n\t\t\t\treturn L\"\";\n\t\t\tchar* pbuff = new char[nLen];\n\t\t\tif(pbuff)\n\t\t\t\tmemset(pbuff, 0, nLen);\n\t\t\telse\n\t\t\t\treturn L\"\";\n\t\t\tnLen = m_pInfo->m_pJsPlatform->Doc_getFilePath(m_pInfo->m_pJsPlatform, pbuff, nLen);\n\t\t\tCFX_ByteString bsRet = CFX_ByteString(pbuff, nLen);\n\t\t\tCFX_WideString wsRet = CFX_WideString::FromLocal(bsRet);\n\t\t\tdelete[] pbuff;\n\t\t\treturn wsRet;\n\t\t}\n\t\treturn L\"\";\n\t}\n\n\tvoid JS_docSubmitForm(void* formData, int length, FX_LPCWSTR URL)\n\t{\n\t\tif(m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->Doc_submitForm)\n\t\t{\n\t\t\tCFX_ByteString bsDestination = CFX_WideString(URL).UTF16LE_Encode();\n\t\t\tFPDF_WIDESTRING pDestination = (FPDF_WIDESTRING)bsDestination.GetBuffer(bsDestination.GetLength());\n\t\t\tm_pInfo->m_pJsPlatform->Doc_submitForm(m_pInfo->m_pJsPlatform, formData, length, pDestination);\n\t\t\tbsDestination.ReleaseBuffer();\n\t\t}\n\t}\n\n\tvoid JS_docmailForm(void* mailData, int length, FPDF_BOOL bUI,FX_LPCWSTR To, FX_LPCWSTR Subject, FX_LPCWSTR CC, FX_LPCWSTR BCC, FX_LPCWSTR Msg)\n\t{\n\t\tif(m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->Doc_mail)\n\t\t{\n\t\t\tCFX_ByteString bsTo = CFX_WideString(To).UTF16LE_Encode();\n\t\t\tCFX_ByteString bsCC = CFX_WideString(Subject).UTF16LE_Encode();\n\t\t\tCFX_ByteString bsBcc = CFX_WideString(BCC).UTF16LE_Encode();\n\t\t\tCFX_ByteString bsSubject = CFX_WideString(Subject).UTF16LE_Encode();\n\t\t\tCFX_ByteString bsMsg = CFX_WideString(Msg).UTF16LE_Encode();\n\t\t\tFPDF_WIDESTRING pTo = (FPDF_WIDESTRING)bsTo.GetBuffer(bsTo.GetLength());\n\t\t\tFPDF_WIDESTRING pCC = (FPDF_WIDESTRING)bsCC.GetBuffer(bsCC.GetLength());\n\t\t\tFPDF_WIDESTRING pBcc = (FPDF_WIDESTRING)bsBcc.GetBuffer(bsBcc.GetLength());\n\t\t\tFPDF_WIDESTRING pSubject = (FPDF_WIDESTRING)bsSubject.GetBuffer(bsSubject.GetLength());\n\t\t\tFPDF_WIDESTRING pMsg = (FPDF_WIDESTRING)bsMsg.GetBuffer(bsMsg.GetLength());\n\t\t\tm_pInfo->m_pJsPlatform->Doc_mail(m_pInfo->m_pJsPlatform, mailData, length, bUI, pTo, pSubject,\n\t\t\t\tpCC, pBcc, pMsg);\n\t\t\tbsTo.ReleaseBuffer();\n\t\t\tbsCC.ReleaseBuffer();\n\t\t\tbsBcc.ReleaseBuffer();\n\t\t\tbsSubject.ReleaseBuffer();\n\t\t\tbsMsg.ReleaseBuffer();\n\t\t}\n\t}\n\tCFX_WideString JS_appbrowseForDoc(FPDF_BOOL bSave, FX_LPCWSTR cFilenameInit)\n\t{\n\t\t//to do....\n\t\treturn L\"\";\n// \t\tif(m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->app_browseForDoc)\n// \t\t{\n// \t\t\tCFX_ByteString bsFilenameInit = CFX_WideString(cFilenameInit).UTF16LE_Encode();\n// \t\t\tFPDF_WIDESTRING pFileNameInit = (FPDF_WIDESTRING)bsFilenameInit.GetBuffer(bsFilenameInit.GetLength());\n// \n// \t\t\tm_pInfo->m_pJsPlatform->app_browseForDoc(m_pInfo->m_pJsPlatform, pFileNameInit);\n// \t\t\tbsFilenameInit.ReleaseBuffer();\n// \t\t}\n\t}\n\n\tvoid JS_docprint(FPDF_BOOL bUI , int nStart, int nEnd, FPDF_BOOL bSilent ,FPDF_BOOL bShrinkToFit,FPDF_BOOL bPrintAsImage ,FPDF_BOOL bReverse ,FPDF_BOOL bAnnotations)\n\t{\n\t\tif(m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->Doc_print)\n\t\t{\n\t\t\tm_pInfo->m_pJsPlatform->Doc_print(m_pInfo->m_pJsPlatform, bUI, nStart, nEnd, bSilent, bShrinkToFit, bPrintAsImage, bReverse, bAnnotations);\n\t\t}\n\t}\n\tvoid JS_docgotoPage(int nPageNum)\n\t{\n\t\tif(m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->Doc_gotoPage)\n\t\t{\n\t\t\tm_pInfo->m_pJsPlatform->Doc_gotoPage(m_pInfo->m_pJsPlatform, nPageNum);\n\t\t}\n\t}\n\n\tFPDF_PAGE\tFFI_GetPage(FPDF_DOCUMENT document,int nPageIndex)\n\t{\n\t\tif(m_pInfo && m_pInfo->FFI_GetPage)\n\t\t{\n\t\t\treturn m_pInfo->FFI_GetPage(m_pInfo, document, nPageIndex);\n\t\t}\n\t\treturn NULL;\n\t}\n\n\tFPDF_PAGE FFI_GetCurrentPage(FPDF_DOCUMENT document)\n\t{\n\t\tif(m_pInfo && m_pInfo->FFI_GetCurrentPage)\n\t\t{\n\t\t\treturn m_pInfo->FFI_GetCurrentPage(m_pInfo, document);\n\t\t}\n\t\treturn NULL;\n\t}\n\n\tint \tFFI_GetRotation(FPDF_PAGE page)\n\t{\n\t\tif(m_pInfo && m_pInfo->FFI_GetRotation)\n\t\t{\n\t\t\treturn m_pInfo->FFI_GetRotation(m_pInfo, page);\n\t\t}\n\t\treturn 0;\n\t}\n\tvoid\tFFI_ExecuteNamedAction(FX_LPCSTR namedAction)\n\t{\n\t\tif(m_pInfo && m_pInfo->FFI_ExecuteNamedAction)\n\t\t{\n\t\t\tm_pInfo->FFI_ExecuteNamedAction(m_pInfo, namedAction);\n\t\t}\n\t}\n\tvoid\tFFI_OnSetFieldInputFocus(void* field,FPDF_WIDESTRING focusText, FPDF_DWORD nTextLen, FX_BOOL bFocus)\n\t{\n\t\tif(m_pInfo && m_pInfo->FFI_SetTextFieldFocus)\n\t\t{\n\t\t\tm_pInfo->FFI_SetTextFieldFocus(m_pInfo, focusText, nTextLen, bFocus);\n\t\t}\n\t}\n\n\tvoid\tFFI_DoURIAction(FX_LPCSTR bsURI)\n\t{\n\t\tif(m_pInfo && m_pInfo->FFI_DoURIAction)\n\t\t{\n\t\t\tm_pInfo->FFI_DoURIAction(m_pInfo, bsURI);\n\t\t}\n\t}\n\n\tvoid\tFFI_DoGoToAction(int nPageIndex, int zoomMode, float* fPosArray, int sizeOfArray)\n\t{\n\t\tif(m_pInfo && m_pInfo->FFI_DoGoToAction)\n\t\t{\n\t\t\tm_pInfo->FFI_DoGoToAction(m_pInfo, nPageIndex, zoomMode, fPosArray, sizeOfArray);\n\t\t}\n\t}\n\npublic:\n\tFX_BOOL\t\t\t\tIsJSInitiated();\n\npublic:\t\n\tvoid\t\t\t\tSetCurrentDoc(CPDFSDK_Document* pFXDoc) {m_pSDKDoc = pFXDoc;}\n\tCPDFSDK_Document*\tGetCurrentDoc();\n\tCPDF_Document*\t\tGetPDFDocument() {return m_pPDFDoc;}\n// \tCPDFSDK_Document*   GetDocument(int nIndex);\n// \tint\t\t\t\t\tCountDocuments() {return m_docMap.GetCount();}\n\n\tCPDFSDK_Document*\t\tOpenDocument(CFX_WideString &fileName);\n\tCPDFSDK_Document*\t\tOpenMemPDFDoc(CPDF_Document* pNewDoc, CFX_WideString &fileName);\n\tFX_BOOL\t\t\t\t\tOpenURL(CFX_WideString &filePath);\n\t\n\n\tCFX_ByteString\t\tGetAppName() {return \"\";}\n\n\tCFFL_IFormFiller*\tGetIFormFiller();\n\tIFX_SystemHandler*\tGetSysHandler() {return m_pSysHandler;}\n\npublic:\n\tCPDFSDK_AnnotHandlerMgr* GetAnnotHandlerMgr();\n\tIFXJS_Runtime*\tGetJSRuntime();\n\tCPDFSDK_ActionHandler* GetActionHander();\nprivate:\n\tCPDFSDK_AnnotHandlerMgr* m_pAnnotHandlerMgr;\n\tCPDFSDK_ActionHandler*\tm_pActionHandler;\n\tIFXJS_Runtime*\tm_pJSRuntime;\npublic:\n\tFPDF_FORMFILLINFO* GetFormFillInfo() {return m_pInfo;}\nprivate:\n\tFPDF_FORMFILLINFO*\tm_pInfo;\n//\tCFX_MapPtrTemplate<CPDF_Document*, CPDFSDK_Document*> m_docMap;\n\tCPDFSDK_Document* m_pSDKDoc;\n\tCPDF_Document* m_pPDFDoc;\n\n\tCFFL_IFormFiller* m_pIFormFiller;\n\tIFX_SystemHandler* m_pSysHandler;\n\npublic:\n\tCJS_RuntimeFactory*  m_pJSRuntimeFactory;\n};\n\n\n\n// class CFX_App\n// {\n// public:\n// \tCFX_App():m_pCurDoc(NULL) {}\n// \tvoid SetAt(CPDF_Document* pPDFDoc, CPDFSDK_Document* pFXDoc);\n// \tCPDFSDK_Document* GetAt(CPDF_Document* pPDFDoc);\n// public:\n// \tvoid SetCurrentDocument(CPDFSDK_Document* pFXDoc) {m_pCurDoc = pFXDoc;}\n// \tCPDFSDK_Document* GetCurrentDocument() {return m_pCurDoc;}\n// private:\n// \tCFX_MapPtrTemplate<CPDF_Document*, CPDFSDK_Document*> m_docArray;\n// \tCPDFSDK_Document* m_pCurDoc;\n// };\nclass CPDFSDK_InterForm;\nclass CPDFSDK_Document\n{\npublic:\n\tCPDFSDK_Document(CPDF_Document* pDoc, CPDFDoc_Environment* pEnv);\n\t~CPDFSDK_Document();\npublic:\n\tCPDFSDK_InterForm*\t\tGetInterForm() ;\n\tCPDF_Document*\t\t\tGetDocument() {return m_pDoc;}\n\npublic:\n\tvoid\t\t\t\t\tInitPageView();\n\tvoid\t\t\t\t\tAddPageView(CPDF_Page* pPDFPage, CPDFSDK_PageView* pPageView);\n\tCPDFSDK_PageView*\t\tGetPageView(CPDF_Page* pPDFPage, FX_BOOL ReNew = TRUE);\n\tCPDFSDK_PageView*\t\tGetPageView(int nIndex);\n\tCPDFSDK_PageView*\t\tGetCurrentView();\n\tvoid\t\t\t\t\tReMovePageView(CPDF_Page* pPDFPage);\n\tvoid\t\t\t\t\tUpdateAllViews(CPDFSDK_PageView* pSender, CPDFSDK_Annot* pAnnot);\n\n\tCPDFSDK_Annot*\t\t\tGetFocusAnnot();//{return NULL;}\n\n\tIFXJS_Runtime *\t\t\tGetJsRuntime();\n\t\n\tFX_BOOL\t\t\t\t\tSetFocusAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag = 0);//{return FALSE;}\n\tFX_BOOL\t\t\t\t\tKillFocusAnnot(FX_UINT nFlag = 0);\n\n\tFX_BOOL\t\t\t\t\tExtractPages(const CFX_WordArray &arrExtraPages, CPDF_Document* pDstDoc);\n\tFX_BOOL\t\t\t\t\tInsertPages(int nInsertAt, const CPDF_Document* pSrcDoc, const CFX_WordArray &arrSrcPages);\n\tFX_BOOL\t\t\t\t\tDeletePages(int nStart, int nCount);\n\tFX_BOOL\t\t\t\t\tReplacePages(int nPage, const CPDF_Document* pSrcDoc, const CFX_WordArray &arrSrcPages);\n\n\tvoid\t\t\t\t\tOnCloseDocument();\n\n\tint\t\t\t\t\t\tGetPageCount() {return m_pDoc->GetPageCount();}\n\tFX_BOOL\t\t\t\t\tGetPermissions(int nFlag);\n\tFX_BOOL\t\t\t\t\tGetChangeMark() {return m_bChangeMask;}\n\tvoid\t\t\t\t\tSetChangeMark() {m_bChangeMask = TRUE;}\n\tvoid\t\t\t\t\tClearChangeMark() {m_bChangeMask= FALSE;}\n//\tFX_BOOL\t\t\t\t\tGetChangeMark(){return FALSE;}//IsAnnotModified()||IsFormModified() || IsWidgetModified()|| m_nChangeMark>0 ;}\t\n//\tvoid                    ClearChangeMark(){}\n\tCFX_WideString\t\t\tGetPath() ;\n\tCPDF_Page*\t\t\t\tGetPage(int nIndex);\n\tCPDFDoc_Environment *\tGetEnv() {return m_pEnv; }\n\tvoid\t\t\t\t    ProcJavascriptFun();\n\tFX_BOOL\t\t\t\t\tProcOpenAction();\n\tCPDF_OCContext*\t\t\tGetOCContext();\nprivate:\n\t//CFX_ArrayTemplate<CPDFSDK_PageView*> m_pageArray;\n\tCFX_MapPtrTemplate<CPDF_Page*, CPDFSDK_PageView*> m_pageMap;\n\tCPDF_Document*\t\t\tm_pDoc;\n\n\tCPDFSDK_InterForm*\t\tm_pInterForm;\n\tCPDFSDK_Annot*\t\t\tm_pFocusAnnot;\n\tCPDFDoc_Environment *\tm_pEnv;\n\tCPDF_OCContext *\t\tm_pOccontent;\n\tFX_BOOL\t\t\t\t\tm_bChangeMask;\n};\n\nclass CPDFSDK_PageView FX_FINAL\n{\npublic:\n\tCPDFSDK_PageView(CPDFSDK_Document* pSDKDoc,CPDF_Page* page);\n\t~CPDFSDK_PageView();\npublic:\n\tvoid PageView_OnDraw(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,CPDF_RenderOptions* pOptions) ;\npublic:\n\tCPDF_Annot*\t\t\t\t\t\tGetPDFAnnotAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);\n\tCPDFSDK_Annot*\t\t\t\t\tGetFXAnnotAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);\n\tCPDF_Annot*\t\t\t\t\t\tGetPDFWidgetAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);\n\tCPDFSDK_Annot*\t\t\t\t\tGetFXWidgetAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);\n\tCPDFSDK_Annot*\t\t\t\t\tGetFocusAnnot() ;\n\tvoid\t\t\t\t\t\t\tSetFocusAnnot(CPDFSDK_Annot* pSDKAnnot,FX_UINT nFlag = 0) {m_pSDKDoc->SetFocusAnnot(pSDKAnnot, nFlag);}\n\tFX_BOOL\t\t\t\t\t\t\tKillFocusAnnot(FX_UINT nFlag = 0) {return m_pSDKDoc->KillFocusAnnot(nFlag);}\n\tFX_BOOL\t\t\t\t\t\t\tAnnot_HasAppearance(CPDF_Annot* pAnnot);\n\n\tCPDFSDK_Annot*\t\t\t\t\tAddAnnot(CPDF_Dictionary * pDict);\n\tCPDFSDK_Annot*\t\t\t\t\tAddAnnot(FX_LPCSTR lpSubType,CPDF_Dictionary * pDict);\n\tCPDFSDK_Annot*\t\t\t\t\tAddAnnot(CPDF_Annot * pPDFAnnot);\n\tFX_BOOL\t\t\t\t\t\t\tDeleteAnnot(CPDFSDK_Annot* pAnnot);\t\t\t\t\t\t\t\n\t\n\tint\t\t\t\t\t\t\t\tCountAnnots();\n\tCPDFSDK_Annot*\t\t\t\t\tGetAnnot(int nIndex);\n\tCPDFSDK_Annot*\t\t\t\t    GetAnnotByDict(CPDF_Dictionary * pDict);\n\tCPDF_Page*\t\t\t\t\t\tGetPDFPage(){return m_page;}\n\tCPDF_Document*\t\t\t\t\tGetPDFDocument();\n\tCPDFSDK_Document*\t\t\t\tGetSDKDocument() {return m_pSDKDoc;}\t\npublic:\n\tFX_BOOL\t\t\t\t\tOnLButtonDown(const CPDF_Point & point, FX_UINT nFlag);\n\tFX_BOOL\t\t\t\t\tOnLButtonUp(const CPDF_Point & point, FX_UINT nFlag);\n\tFX_BOOL\t\t\t\t\tOnChar(int nChar, FX_UINT nFlag);\n\tFX_BOOL\t\t\t\t\tOnKeyDown(int nKeyCode, int nFlag);\n\tFX_BOOL\t\t\t\t\tOnKeyUp(int nKeyCode, int nFlag);\n\n\tFX_BOOL\t\t\t\t\tOnMouseMove(const CPDF_Point & point, int nFlag);\n\tFX_BOOL\t\t\t\t\tOnMouseWheel(double deltaX, double deltaY,const CPDF_Point& point, int nFlag);\n\tFX_BOOL\t\t\t\t\tIsValidAnnot(FX_LPVOID p);\npublic:\n\tvoid\t\t\t\t\tGetCurrentMatrix(CPDF_Matrix& matrix) {matrix = m_curMatrix;}\n\tvoid\t\t\t\t\tUpdateRects(CFX_RectArray& rects);\n\tvoid\t\t\t\t\t\t\tUpdateView(CPDFSDK_Annot* pAnnot);\n\tCFX_PtrArray*\t\t\t\t\tGetAnnotList(){ return &m_fxAnnotArray; }\n\npublic:\n\tint\t\t\t\t\t\tGetPageIndex();\n\tvoid\t\t\t\t\t\t\tLoadFXAnnots();\nprivate:\n\tCPDF_Matrix m_curMatrix;\n\nprivate:\n\tvoid PageView_OnHighlightFormFields(CFX_RenderDevice* pDevice, CPDFSDK_Widget* pWidget);\n\nprivate:\n\tCPDF_Page* m_page;\n\tCPDF_AnnotList* m_pAnnotList;\n\n\t//CPDFSDK_Annot* m_pFocusAnnot;\n\tCFX_PtrArray  m_fxAnnotArray;\n\n\tCPDFSDK_Document* m_pSDKDoc;\nprivate:\n\tCPDFSDK_Widget* m_CaptureWidget;\n\tFX_BOOL m_bEnterWidget;\n\tFX_BOOL m_bExitWidget;\n\tFX_BOOL m_bOnWidget;\npublic:\n\tvoid SetValid(FX_BOOL bValid) {m_bValid = bValid;}\n\tFX_BOOL IsValid() {return m_bValid;}\nprivate:\n\tFX_BOOL m_bValid;\n};\n\n\ntemplate<class TYPE>\nclass CGW_ArrayTemplate : public CFX_ArrayTemplate<TYPE>\n{\npublic: \n\tCGW_ArrayTemplate(){}\n\tvirtual ~CGW_ArrayTemplate(){}\n\t\n\ttypedef int (*LP_COMPARE)(TYPE p1, TYPE p2);\n\t\n\tvoid Sort(LP_COMPARE pCompare, FX_BOOL bAscent = TRUE)\n\t{\n\t\tint nSize = this->GetSize();\n\t\tQuickSort(0, nSize -1, bAscent, pCompare);\n\t}\n\t\nprivate:\n\tvoid QuickSort(FX_UINT nStartPos, FX_UINT nStopPos, FX_BOOL bAscend, LP_COMPARE pCompare)\n\t{\n\t\tif (nStartPos >= nStopPos) return;\n\t\t\n\t\tif ((nStopPos - nStartPos) == 1)\n\t\t{\n\t\t\tTYPE Value1 = this->GetAt(nStartPos);\n\t\t\tTYPE Value2 = this->GetAt(nStopPos);\n\t\t\t\n\t\t\tint iGreate = (*pCompare)(Value1, Value2);\n\t\t\tif ((bAscend && iGreate > 0) || (!bAscend && iGreate < 0))\n\t\t\t{\n\t\t\t\tthis->SetAt(nStartPos, Value2);\n\t\t\t\tthis->SetAt(nStopPos, Value1);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tFX_UINT m = nStartPos + (nStopPos - nStartPos) / 2;\n\t\tFX_UINT i = nStartPos;\n\t\t\n\t\tTYPE Value = this->GetAt(m);\n\t\t\n\t\twhile (i < m)\n\t\t{\n\t\t\tTYPE temp = this->GetAt(i);\n\t\t\t\n\t\t\tint iGreate = (*pCompare)(temp, Value);\n\t\t\tif ((bAscend && iGreate > 0) || (!bAscend && iGreate < 0))\n\t\t\t{\n\t\t\t\tthis->InsertAt(m+1, temp);\n\t\t\t\tthis->RemoveAt(i);\n\t\t\t\tm--;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\t\t\n\t\tFX_UINT j = nStopPos;\n\t\t\n\t\twhile (j > m)\n\t\t{\n\t\t\tTYPE temp = this->GetAt(j);\n\t\t\t\n\t\t\tint iGreate = (*pCompare)(temp, Value);\n\t\t\tif ((bAscend && iGreate < 0) || (!bAscend && iGreate > 0))\n\t\t\t{\n\t\t\t\tthis->RemoveAt(j);\n\t\t\t\tthis->InsertAt(m, temp);\n\t\t\t\tm++;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tj--;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (nStartPos < m) QuickSort(nStartPos, m, bAscend, pCompare);\n\t\tif (nStopPos > m) QuickSort(m, nStopPos, bAscend, pCompare);\n\t}\n};\n\n\n#endif //_FPDFSDK_MGR_H\n\n"
  },
  {
    "path": "fpdfsdk/include/fsdk_rendercontext.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _RENDERCONTENT_H_\n#define _RENDERCONTENT_H_\n#include \"../include/fsdk_define.h\"\n#include \"../include/fpdf_progressive.h\"\n\n// Everything about rendering is put here: for OOM recovery\nclass CRenderContext : public CFX_Object\n{\npublic:\n\tCRenderContext() { Clear(); }\n\t~CRenderContext();\n\t\n\tvoid Clear();\n\t\n\tCFX_RenderDevice*\t\tm_pDevice;\n\tCPDF_RenderContext*\t\tm_pContext;\n\tCPDF_ProgressiveRenderer*\tm_pRenderer;\n\tCPDF_AnnotList*\t\t\tm_pAnnots;\n\tCPDF_RenderOptions*\t\tm_pOptions;\n#ifdef _WIN32_WCE\n\tCFX_DIBitmap*\tm_pBitmap;\n\tHBITMAP\t\t\tm_hBitmap;\n#endif\n};\n\nclass IFSDK_PAUSE_Adapter : public IFX_Pause\n{\npublic:\n\tIFSDK_PAUSE_Adapter(IFSDK_PAUSE* IPause );\n\tFX_BOOL NeedToPauseNow();\n\t\nprivate:\n\tIFSDK_PAUSE* m_IPause;\n};\n#endif\n"
  },
  {
    "path": "fpdfsdk/include/fx_systemhandler.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_SYSTEMHANDLER_H_\n#define _FX_SYSTEMHANDLER_H_\n\ntypedef FX_LPVOID\t\t\t\tFX_HWND;\ntypedef FX_LPVOID\t\t\t\tFX_HMENU;\ntypedef void\t\t\t\t\t(*TimerCallback)(FX_INT32 idEvent);\n\ntypedef struct _FX_SYSTEMTIME \n{\n    FX_WORD wYear;\n    FX_WORD wMonth;\n    FX_WORD wDayOfWeek;\n    FX_WORD wDay;\n    FX_WORD wHour;\n    FX_WORD wMinute;\n    FX_WORD wSecond;\n    FX_WORD wMilliseconds;\n}FX_SYSTEMTIME;\n\n//cursor style\n#define FXCT_ARROW\t\t\t\t0\n#define FXCT_NESW\t\t\t\t1\n#define FXCT_NWSE\t\t\t\t2\n#define FXCT_VBEAM\t\t\t\t3\n#define FXCT_HBEAM\t\t\t\t4\n#define FXCT_HAND\t\t\t\t5\n\nclass IFX_SystemHandler\n{\npublic:\n\tvirtual ~IFX_SystemHandler() {}\n\tvirtual void\t\t\t\tInvalidateRect(FX_HWND hWnd, FX_RECT rect) = 0;\n    virtual void\t\t\t\tOutputSelectedRect(void* pFormFiller, CPDF_Rect&rect) = 0;\n\n\tvirtual FX_BOOL\t\t\t\tIsSelectionImplemented() = 0;\n\n\tvirtual CFX_WideString\t\tGetClipboardText(FX_HWND hWnd) = 0;\n\tvirtual FX_BOOL\t\t\t\tSetClipboardText(FX_HWND hWnd, CFX_WideString string) = 0;\n\t\n\tvirtual void\t\t\t\tClientToScreen(FX_HWND hWnd, FX_INT32& x, FX_INT32& y) = 0;\n\tvirtual void\t\t\t\tScreenToClient(FX_HWND hWnd, FX_INT32& x, FX_INT32& y) = 0;\n\n\t/*cursor style\n\tFXCT_ARROW\t\n\tFXCT_NESW\t\t\n\tFXCT_NWSE\t\t\n\tFXCT_VBEAM\t\t\n\tFXCT_HBEAM\t\t\n\tFXCT_HAND\n\t*/\n\tvirtual void\t\t\t\tSetCursor(FX_INT32 nCursorType) = 0;\n\n\tvirtual FX_HMENU\t\t\tCreatePopupMenu() = 0;\n\tvirtual FX_BOOL\t\t\t\tAppendMenuItem(FX_HMENU hMenu, FX_INT32 nIDNewItem, CFX_WideString string) = 0;\n\tvirtual FX_BOOL\t\t\t\tEnableMenuItem(FX_HMENU hMenu, FX_INT32 nIDItem, FX_BOOL bEnabled) = 0;\n\tvirtual FX_INT32\t\t\tTrackPopupMenu(FX_HMENU hMenu, FX_INT32 x, FX_INT32 y, FX_HWND hParent) = 0;\n\tvirtual void\t\t\t\tDestroyMenu(FX_HMENU hMenu) = 0;\n\n\tvirtual CFX_ByteString\t\tGetNativeTrueTypeFont(FX_INT32 nCharset) = 0;\n\tvirtual FX_BOOL\t\t\t\tFindNativeTrueTypeFont(FX_INT32 nCharset, CFX_ByteString sFontFaceName) = 0;\n\tvirtual CPDF_Font*\t\t\tAddNativeTrueTypeFontToPDF(CPDF_Document* pDoc, CFX_ByteString sFontFaceName, FX_BYTE nCharset) = 0;\n\n\tvirtual FX_INT32\t\t\tSetTimer(FX_INT32 uElapse, TimerCallback lpTimerFunc) = 0;\n\tvirtual void\t\t\t\tKillTimer(FX_INT32 nID) = 0;\n\n\n\tvirtual FX_BOOL\t\t\t\tIsSHIFTKeyDown(FX_DWORD nFlag) = 0;\n\tvirtual FX_BOOL\t\t\t\tIsCTRLKeyDown(FX_DWORD nFlag) = 0;\n\tvirtual FX_BOOL\t\t\t\tIsALTKeyDown(FX_DWORD nFlag) = 0;\n\tvirtual FX_BOOL\t\t\t\tIsINSERTKeyDown(FX_DWORD nFlag) = 0;\n\n\tvirtual\tFX_SYSTEMTIME\t\tGetLocalTime() = 0;\n\n\tvirtual FX_INT32\t\t\tGetCharSet() = 0;\t\n\tvirtual void \t\t\t\tSetCharSet(FX_INT32 nCharSet) = 0;\n};\n\n#endif //_FX_SYSTEMHANDLER_H_\n\n"
  },
  {
    "path": "fpdfsdk/include/fxedit/fx_edit.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FX_EDIT_H_\n#define _FX_EDIT_H_\n\n#define PVTWORD_STYLE_NORMAL\t\t\t\t0x0000L\n#define PVTWORD_STYLE_HIGHLIGHT\t\t\t\t0x0001L\n#define PVTWORD_STYLE_UNDERLINE\t\t\t\t0x0002L\n#define PVTWORD_STYLE_CROSSOUT\t\t\t\t0x0004L\n#define PVTWORD_STYLE_SQUIGGLY\t\t\t\t0x0008L\n#define PVTWORD_STYLE_DUALCROSSOUT\t\t\t0x0010L\n#define PVTWORD_STYLE_BOLD\t\t\t\t\t0x0020L\n#define PVTWORD_STYLE_ITALIC\t\t\t\t0x0040L\n\n#define FX_EDIT_ISLATINWORD(u)\t(u == 0x2D || (u <= 0x005A && u >= 0x0041) || (u <= 0x007A && u >= 0x0061) || (u <= 0x02AF && u >= 0x00C0))\n\n#ifdef FX_READER_DLL\n\t#ifdef FXET_EXPORT\n\t\t#define FXET_CLASS __declspec(dllexport)\n\t#else\n\t\t#define FXET_CLASS\n\t#endif\n#else\n\t#define FXET_CLASS\n#endif\n\n#ifndef DEFAULT_CHARSET\n#define DEFAULT_CHARSET         1\n#endif \n\nclass IFX_Edit_FontMap;\nclass IFX_Edit_Notify;\nclass IFX_Edit_Iterator;\nclass IFX_Edit_UndoItem;\nclass IFX_Edit;\nclass IFX_List_Notify;\nclass IFX_List;\nclass IFX_SystemHandler;\n\nclass IFX_Edit_FontMap\n{\npublic:\n\t//map a fontindex to pdf font.\n\tvirtual CPDF_Font *\t\t\t\t\t\tGetPDFFont(FX_INT32 nFontIndex) = 0;\n\t//get the alias of a pdf font.\n\tvirtual CFX_ByteString\t\t\t\t\tGetPDFFontAlias(FX_INT32 nFontIndex) = 0;\n\t//get the index of a font that can show a word.\n\tvirtual FX_INT32\t\t\t\t\t\tGetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex) = 0;\n\t//get the charcode of word from unicode\n\tvirtual FX_INT32\t\t\t\t\t\tCharCodeFromUnicode(FX_INT32 nFontIndex, FX_WORD word) = 0;\n\t//get the charset of unicode\n\tvirtual FX_INT32\t\t\t\t\t\tCharSetFromUnicode(FX_WORD word, FX_INT32 nOldCharset) = 0;\n};\n\nclass IFX_Edit_Notify\n{\n\t//this class is implemented by user\npublic:\n\t//set the horizontal scrollbar information.\n\tvirtual void\t\t\t\t\t\t\tIOnSetScrollInfoX(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax, \n\t\t\t\t\t\t\t\t\t\t\t\tFX_FLOAT fContentMin, FX_FLOAT fContentMax, \n\t\t\t\t\t\t\t\t\t\t\t\tFX_FLOAT fSmallStep, FX_FLOAT fBigStep) = 0;\n\t//set the vertical scrollbar information.\n\tvirtual void\t\t\t\t\t\t\tIOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax, \n\t\t\t\t\t\t\t\t\t\t\t\tFX_FLOAT fContentMin, FX_FLOAT fContentMax, \n\t\t\t\t\t\t\t\t\t\t\t\tFX_FLOAT fSmallStep, FX_FLOAT fBigStep) = 0;\n\t//set the position of horizontal scrollbar.\n\tvirtual void\t\t\t\t\t\t\tIOnSetScrollPosX(FX_FLOAT fx) = 0;\n\t//set the position of vertical scrollbar.\n\tvirtual void\t\t\t\t\t\t\tIOnSetScrollPosY(FX_FLOAT fy) = 0;\n\t//set the caret information.\n\tvirtual void\t\t\t\t\t\t\tIOnSetCaret(FX_BOOL bVisible,const CPDF_Point & ptHead,const CPDF_Point & ptFoot, const CPVT_WordPlace& place) = 0;\n\t//if the caret position is changed ,send the information of current postion to user.\n\tvirtual void\t\t\t\t\t\t\tIOnCaretChange(const CPVT_SecProps & secProps, const CPVT_WordProps & wordProps) = 0;\n\t//if the text area is changed, send the information to user.\n\tvirtual void\t\t\t\t\t\t\tIOnContentChange(const CPDF_Rect& rcContent) = 0;\n\t//Invalidate the rectangle relative to the bounding box of edit.\n\tvirtual void\t\t\t\t\t\t\tIOnInvalidateRect(CPDF_Rect * pRect) = 0;\n};\n\nclass IFX_Edit_OprNotify\n{\n\t//this class is implemented by user\npublic:\n\t//OprType: 0\n\tvirtual void\t\t\t\t\t\t\tOnInsertWord(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;\n\t//OprType: 1\n\tvirtual void\t\t\t\t\t\t\tOnInsertReturn(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;\n\t//OprType: 2\n\tvirtual void\t\t\t\t\t\t\tOnBackSpace(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;\n\t//OprType: 3\n\tvirtual void\t\t\t\t\t\t\tOnDelete(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;\n\t//OprType: 4\n\tvirtual void\t\t\t\t\t\t\tOnClear(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;\n\t//OprType: 5\n\tvirtual void\t\t\t\t\t\t\tOnInsertText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;\n\t//OprType: 6\n\tvirtual void\t\t\t\t\t\t\tOnSetText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;\n\t//\n\tvirtual void\t\t\t\t\t\t\tOnAddUndo(IFX_Edit_UndoItem* pUndoItem) = 0;\n};\n\nclass IFX_Edit_Iterator\n{\npublic:\n\tvirtual ~IFX_Edit_Iterator()  {}\npublic:\n\t//move the current position to the next word.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tNextWord() = 0;\n\t//move the current position to the next line.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tNextLine() = 0;\n\t//move the current position to the next section. \n\tvirtual FX_BOOL\t\t\t\t\t\t\tNextSection() = 0;\n\n\t//move the current position to the previous word.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tPrevWord() = 0;\n\t//move the current position to the previous line.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tPrevLine() = 0;\n\t//move the current position to the previous section. \n\tvirtual FX_BOOL\t\t\t\t\t\t\tPrevSection() = 0;\n\n\t//get the information of the current word.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tGetWord(CPVT_Word & word) const = 0;\n\t//get the information of the current line.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tGetLine(CPVT_Line & line) const = 0;\n\t//get the information of the current section.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tGetSection(CPVT_Section & section) const = 0;\n\t//set the current position.\n\tvirtual void\t\t\t\t\t\t\tSetAt(FX_INT32 nWordIndex) = 0;\n\t//set the current position.\n\tvirtual void\t\t\t\t\t\t\tSetAt(const CPVT_WordPlace & place) = 0;\n\t//get the current position.\n\tvirtual const CPVT_WordPlace &\t\t\tGetAt() const = 0;\n\n\t//get the edit which this iterator belongs to\n\tvirtual IFX_Edit*\t\t\t\t\t\tGetEdit() const = 0;\n};\n\nclass IFX_Edit_UndoItem\n{\npublic:\n\tvirtual void\t\t\t\t\t\t\tUndo() = 0;\n\tvirtual void\t\t\t\t\t\t\tRedo() = 0;\n\tvirtual CFX_WideString\t\t\t\t\tGetUndoTitle() = 0;\n\tvirtual void\t\t\t\t\t\t\tRelease() = 0;\n};\n\nclass FXET_CLASS IFX_Edit\n{\npublic:\n\tstatic IFX_Edit*\t\t\t\t\t\tNewEdit();\n\tstatic\tvoid\t\t\t\t\t\t\tDelEdit(IFX_Edit* pEdit);\n\npublic:\n\t//set a IFX_Edit_FontMap pointer implemented by user.\n\tvirtual void\t\t\t\t\t\t\tSetFontMap(IFX_Edit_FontMap* pFontMap) = 0;\n\t//if user don't like to use FontMap, implement VTProvider and set it directly.\n\tvirtual void\t\t\t\t\t\t\tSetVTProvider(IPDF_VariableText_Provider* pProvider) = 0;\n\t//set a IFX_Edit_Notify pointer implemented by user.\n\tvirtual void\t\t\t\t\t\t\tSetNotify(IFX_Edit_Notify * pNotify) = 0;\n\tvirtual void\t\t\t\t\t\t\tSetOprNotify(IFX_Edit_OprNotify* pOprNotify) = 0;\n\t//get a pointer allocated by CPDF_Edit, by this pointer, user can iterate the contents of edit, but don't need to release.\n\tvirtual IFX_Edit_Iterator*\t\t\t\tGetIterator() = 0;\n\t//get a VT pointer relative to this edit.\n\tvirtual IPDF_VariableText*\t\t\t\tGetVariableText() = 0;\n\t//get the IFX_Edit_FontMap pointer set by user.\n\tvirtual IFX_Edit_FontMap*\t\t\t\tGetFontMap() = 0;\n\n\t//initialize the edit.\n\tvirtual void\t\t\t\t\t\t\tInitialize() = 0;\n\n\t//set the bounding box of the text area.\n\tvirtual void\t\t\t\t\t\t\tSetPlateRect(const CPDF_Rect & rect, FX_BOOL bPaint = TRUE) = 0;\n\t//set the scroll origin\n\tvirtual void\t\t\t\t\t\t\tSetScrollPos(const CPDF_Point & point) = 0;\n\n\t//set the horizontal text alignment in text box, nFormat (0:left 1:middle 2:right).\n\tvirtual void\t\t\t\t\t\t\tSetAlignmentH(FX_INT32 nFormat = 0, FX_BOOL bPaint = TRUE) = 0;\n\t//set the vertical text alignment in text box, nFormat (0:top 1:center 2:bottom).\n\tvirtual void\t\t\t\t\t\t\tSetAlignmentV(FX_INT32 nFormat = 0, FX_BOOL bPaint = TRUE) = 0;\n\t//if the text is shown in secret , set a character for substitute.\n\tvirtual void\t\t\t\t\t\t\tSetPasswordChar(FX_WORD wSubWord = '*', FX_BOOL bPaint = TRUE) = 0;\n\t//set the maximal count of words of the text.\n\tvirtual void\t\t\t\t\t\t\tSetLimitChar(FX_INT32 nLimitChar = 0, FX_BOOL bPaint = TRUE) = 0;\n\t//if set the count of charArray , then all words is shown in equal space.\n\tvirtual void\t\t\t\t\t\t\tSetCharArray(FX_INT32 nCharArray = 0, FX_BOOL bPaint = TRUE) = 0;\n\t//set the space of two characters.\n\tvirtual void\t\t\t\t\t\t\tSetCharSpace(FX_FLOAT fCharSpace = 0.0f, FX_BOOL bPaint = TRUE) = 0;\n\t//set the horizontal scale of all characters.\n\tvirtual void\t\t\t\t\t\t\tSetHorzScale(FX_INT32 nHorzScale = 100, FX_BOOL bPaint = TRUE) = 0;\n\t//set the leading of all lines\n\tvirtual void\t\t\t\t\t\t\tSetLineLeading(FX_FLOAT fLineLeading, FX_BOOL bPaint = TRUE) = 0;\n\t//if set, CRLF is allowed.\n\tvirtual void\t\t\t\t\t\t\tSetMultiLine(FX_BOOL bMultiLine = TRUE, FX_BOOL bPaint = TRUE) = 0;\n\t//if set, all words auto fit the width of the bounding box.\t\n\tvirtual void\t\t\t\t\t\t\tSetAutoReturn(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE) = 0;\n\t//if set, a font size is calculated to full fit the bounding box.\n\tvirtual void\t\t\t\t\t\t\tSetAutoFontSize(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE) = 0;\n\t//is set, the text is allowed to scroll.\n\tvirtual void\t\t\t\t\t\t\tSetAutoScroll(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE) = 0;\n\t//set the font size of all words.\n\tvirtual void\t\t\t\t\t\t\tSetFontSize(FX_FLOAT fFontSize, FX_BOOL bPaint = TRUE) = 0;\n\t//the text is allowed to auto-scroll, allow the text overflow?\n\tvirtual void\t\t\t\t\t\t\tSetTextOverflow(FX_BOOL bAllowed = FALSE, FX_BOOL bPaint = TRUE) = 0;\n\n\t//query if the edit is richedit.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tIsRichText() const = 0;\n\t//set the edit is richedit.\n\tvirtual void\t\t\t\t\t\t\tSetRichText(FX_BOOL bRichText = TRUE, FX_BOOL bPaint = TRUE) = 0;\n\t//set the fontsize of selected text.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tSetRichFontSize(FX_FLOAT fFontSize) = 0;\t\n\t//set the fontindex of selected text, user can change the font of selected text.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tSetRichFontIndex(FX_INT32 nFontIndex) = 0;\n\t//set the textcolor of selected text.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tSetRichTextColor(FX_COLORREF dwColor) = 0;\n\t//set the text script type of selected text. (0:normal 1:superscript 2:subscript)\n\tvirtual FX_BOOL\t\t\t\t\t\t\tSetRichTextScript(FX_INT32 nScriptType) = 0;\t\n\t//set the bold font style of selected text.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tSetRichTextBold(FX_BOOL bBold = TRUE) = 0;\n\t//set the italic font style of selected text.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tSetRichTextItalic(FX_BOOL bItalic = TRUE) = 0;\n\t//set the underline style of selected text.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tSetRichTextUnderline(FX_BOOL bUnderline = TRUE) = 0;\n\t//set the crossout style of selected text.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tSetRichTextCrossout(FX_BOOL bCrossout = TRUE) = 0;\n\t//set the charspace of selected text, in user coordinate.\n\tvirtual\tFX_BOOL\t\t\t\t\t\t\tSetRichTextCharSpace(FX_FLOAT fCharSpace) = 0;\n\t//set the horizontal scale of selected text, default value is 100.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tSetRichTextHorzScale(FX_INT32 nHorzScale = 100) = 0;\n\t//set the leading of selected section, in user coordinate.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tSetRichTextLineLeading(FX_FLOAT fLineLeading) = 0;\n\t//set the indent of selected section, in user coordinate.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tSetRichTextLineIndent(FX_FLOAT fLineIndent) = 0;\n\t//set the alignment of selected section, nAlignment(0:left 1:middle 2:right)\n\tvirtual FX_BOOL\t\t\t\t\t\t\tSetRichTextAlignment(FX_INT32 nAlignment) = 0;\n\n\t//set the selected range of text.\n\t//if nStartChar == 0 and nEndChar == -1, select all the text.\n\tvirtual void\t\t\t\t\t\t\tSetSel(FX_INT32 nStartChar,FX_INT32 nEndChar) = 0;\n\t//get the selected range of text.\n\tvirtual void\t\t\t\t\t\t\tGetSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar) const = 0;\n\t//select all the text.\n\tvirtual\tvoid\t\t\t\t\t\t\tSelectAll() = 0;\n\t//set text is not selected.\n\tvirtual void\t\t\t\t\t\t\tSelectNone() = 0;\t\t\n\t//get the caret position.\n\tvirtual FX_INT32\t\t\t\t\t\tGetCaret() const = 0;\n\tvirtual CPVT_WordPlace\t\t\t\t\tGetCaretWordPlace() const = 0;\n\t//get the string of selected text.\n\tvirtual CFX_WideString\t\t\t\t\tGetSelText() const = 0;\n\t//get the text conent\n\tvirtual CFX_WideString\t\t\t\t\tGetText() const = 0;\n\t//query if any text is selected.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tIsSelected() const = 0;\t\n\t//get the scroll origin\n\tvirtual CPDF_Point\t\t\t\t\t\tGetScrollPos() const = 0;\n\t//get the bounding box of the text area.\n\tvirtual CPDF_Rect\t\t\t\t\t\tGetPlateRect() const = 0;\n\t//get the fact area of the text.\n\tvirtual CPDF_Rect\t\t\t\t\t\tGetContentRect() const = 0;\n\t//get the visible word range\n\tvirtual CPVT_WordRange\t\t\t\t\tGetVisibleWordRange() const = 0;\n\t//get the whole word range\n\tvirtual CPVT_WordRange\t\t\t\t\tGetWholeWordRange() const = 0;\n\t//get the word range of select text\n\tvirtual CPVT_WordRange\t\t\t\t\tGetSelectWordRange() const = 0;\n\n\t//send the mousedown message to edit for response.\n\t//if Shift key is hold, bShift is TRUE, is Ctrl key is hold, bCtrl is TRUE.\n\tvirtual void\t\t\t\t\t\t\tOnMouseDown(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl) = 0;\n\t//send the mousemove message to edit when mouse down is TRUE.\n\tvirtual void\t\t\t\t\t\t\tOnMouseMove(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl) = 0;\n\t//send the UP key message to edit.\n\tvirtual void\t\t\t\t\t\t\tOnVK_UP(FX_BOOL bShift,FX_BOOL bCtrl) = 0;\n\t//send the DOWN key message to edit.\n\tvirtual void\t\t\t\t\t\t\tOnVK_DOWN(FX_BOOL bShift,FX_BOOL bCtrl) = 0;\n\t//send the LEFT key message to edit.\n\tvirtual void\t\t\t\t\t\t\tOnVK_LEFT(FX_BOOL bShift,FX_BOOL bCtrl) = 0;\n\t//send the RIGHT key message to edit.\n\tvirtual void\t\t\t\t\t\t\tOnVK_RIGHT(FX_BOOL bShift,FX_BOOL bCtrl) = 0;\n\t//send the HOME key message to edit.\n\tvirtual void\t\t\t\t\t\t\tOnVK_HOME(FX_BOOL bShift,FX_BOOL bCtrl) = 0;\n\t//send the END key message to edit.\n\tvirtual void\t\t\t\t\t\t\tOnVK_END(FX_BOOL bShift,FX_BOOL bCtrl) = 0;\n\n\t//put text into edit.\n\tvirtual void\t\t\t\t\t\t\tSetText(FX_LPCWSTR text,FX_INT32 charset = DEFAULT_CHARSET,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst CPVT_SecProps * pSecProps = NULL,const CPVT_WordProps * pWordProps = NULL) = 0;\t\n\t//insert a word into the edit.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tInsertWord(FX_WORD word, FX_INT32 charset = DEFAULT_CHARSET, const CPVT_WordProps * pWordProps = NULL) = 0;\n\t//insert a return into the edit.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tInsertReturn(const CPVT_SecProps * pSecProps = NULL,const CPVT_WordProps * pWordProps = NULL) = 0;\t\n\t//insert text into the edit.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tInsertText(FX_LPCWSTR text, FX_INT32 charset = DEFAULT_CHARSET,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst CPVT_SecProps * pSecProps = NULL,const CPVT_WordProps * pWordProps = NULL) = 0;\n\t//do backspace operation.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tBackspace() = 0;\n\t//do delete operation.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tDelete() = 0;\t\n\t//delete the selected text.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tClear() = 0;\n\n\t//do Redo operation.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tRedo() = 0;\n\t//do Undo operation.\n\tvirtual FX_BOOL\t\t\t\t\t\t\tUndo() = 0;\n\t//move caret\n\tvirtual void\t\t\t\t\t\t\tSetCaret(FX_INT32 nPos) = 0;\n\n\t//arrange all words over again\n\tvirtual void\t\t\t\t\t\t\tPaint() = 0;\n\t\n\t//allow to refresh screen?\n\tvirtual void\t\t\t\t\t\t\tEnableRefresh(FX_BOOL bRefresh) = 0;\n\n\tvirtual void\t\t\t\t\t\t\tRefreshWordRange(const CPVT_WordRange& wr) = 0;\n\n\t//allow undo/redo?\n\tvirtual void\t\t\t\t\t\t\tEnableUndo(FX_BOOL bUndo) = 0;\n\n\t//allow notify?\n\tvirtual void\t\t\t\t\t\t\tEnableNotify(FX_BOOL bNotify) = 0;\n\n\t//allow opr notify?\n\tvirtual void\t\t\t\t\t\t\tEnableOprNotify(FX_BOOL bNotify) = 0;\n\n\t//map word place to word index.\n\tvirtual FX_INT32\t\t\t\t\t\tWordPlaceToWordIndex(const CPVT_WordPlace & place) const = 0;\n\t//map word index to word place.\n\tvirtual CPVT_WordPlace\t\t\t\t\tWordIndexToWordPlace(FX_INT32 index) const = 0;\n\n\t//get the beginning position of a line\n\tvirtual CPVT_WordPlace\t\t\t\t\tGetLineBeginPlace(const CPVT_WordPlace & place) const = 0;\n\n\t//get the ending position of a line\n\tvirtual CPVT_WordPlace\t\t\t\t\tGetLineEndPlace(const CPVT_WordPlace & place) const = 0;\n\n\t//get the beginning position of a section\n\tvirtual CPVT_WordPlace\t\t\t\t\tGetSectionBeginPlace(const CPVT_WordPlace & place) const = 0;\n\n\t//get the ending position of a section\n\tvirtual CPVT_WordPlace\t\t\t\t\tGetSectionEndPlace(const CPVT_WordPlace & place) const = 0;\n\n\t//search a wordplace form point\n\tvirtual CPVT_WordPlace\t\t\t\t\tSearchWordPlace(const CPDF_Point& point) const = 0;\n\n\t//get the font size of non_rich text or default font size of richtext.\n\tvirtual FX_FLOAT\t\t\t\t\t\tGetFontSize() const = 0;\n\t//get the mask character.\n\tvirtual FX_WORD\t\t\t\t\t\t\tGetPasswordChar() const = 0;\n\t//get the count of charArray\n\tvirtual FX_INT32\t\t\t\t\t\tGetCharArray() const = 0;\n\t//get the horizontal scale of all characters\n\tvirtual FX_INT32\t\t\t\t\t\tGetHorzScale() const = 0;\n\t//get the space of two characters\n\tvirtual FX_FLOAT\t\t\t\t\t\tGetCharSpace() const = 0;\n\t//get the latin words of specified range\n\tvirtual CFX_WideString\t\t\t\t\tGetRangeText(const CPVT_WordRange & range) const = 0;\n\t//is the text full in bounding box\n\tvirtual FX_BOOL\t\t\t\t\t\t\tIsTextFull() const = 0;\n\tvirtual FX_BOOL\t\t\t\t\t\t\tCanUndo() const = 0;\n\tvirtual FX_BOOL\t\t\t\t\t\t\tCanRedo() const = 0;\n\t//if the content is changed after settext?\n\tvirtual FX_BOOL\t\t\t\t\t\t\tIsModified() const = 0;\n\t//get the total words in edit\n\tvirtual FX_INT32\t\t\t\t\t\tGetTotalWords() const = 0;\n\n\tvirtual void\t\t\t\t\t\t\tAddUndoItem(IFX_Edit_UndoItem* pUndoItem) = 0;\n\npublic:\n\tstatic CFX_ByteString\t\t\t\t\tGetEditAppearanceStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset, \n\t\t\t\t\t\t\t\t\t\t\t\t\tconst CPVT_WordRange* pRange = NULL, \n\t\t\t\t\t\t\t\t\t\t\t\t\tFX_BOOL bContinuous = TRUE, FX_WORD SubWord = 0);\n\tstatic CFX_ByteString\t\t\t\t\tGetSelectAppearanceStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset, const CPVT_WordRange* pRange = NULL);\n\tstatic void\t\t\t\t\t\t\t\tDrawEdit(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit, FX_COLORREF crTextFill, FX_COLORREF crTextStroke,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, IFX_SystemHandler* pSystemHandler, void* pFFLData);\n\tstatic void\t\t\t\t\t\t\t\tDrawUnderline(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit, FX_COLORREF color,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange);\n\tstatic void\t\t\t\t\t\t\t\tDrawRichEdit(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit,  \n\t\t\t\t\t\t\t\t\t\t\t\t\tconst CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange);\n\tstatic void\t\t\t\t\t\t\t\tGeneratePageObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst CPDF_Point& ptOffset, const CPVT_WordRange* pRange, FX_COLORREF crText, CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray);\n\tstatic void\t\t\t\t\t\t\t\tGenerateRichPageObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst CPDF_Point& ptOffset, const CPVT_WordRange* pRange, CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray);\n\tstatic void\t\t\t\t\t\t\t\tGenerateUnderlineObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst CPDF_Point& ptOffset, const CPVT_WordRange* pRange, FX_COLORREF color);\n};\n\nclass IFX_List_Notify\n{\n\t//this class is implemented by user\npublic:\n\t//set the horizontal scrollbar information.\n\tvirtual void\t\t\t\t\t\t\tIOnSetScrollInfoX(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax, \n\t\t\t\t\t\t\t\t\t\t\t\tFX_FLOAT fContentMin, FX_FLOAT fContentMax, \n\t\t\t\t\t\t\t\t\t\t\t\tFX_FLOAT fSmallStep, FX_FLOAT fBigStep) = 0;\n\t//set the vertical scrollbar information.\n\tvirtual void\t\t\t\t\t\t\tIOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax, \n\t\t\t\t\t\t\t\t\t\t\t\tFX_FLOAT fContentMin, FX_FLOAT fContentMax, \n\t\t\t\t\t\t\t\t\t\t\t\tFX_FLOAT fSmallStep, FX_FLOAT fBigStep) = 0;\n\t//set the position of horizontal scrollbar.\n\tvirtual void\t\t\t\t\t\t\tIOnSetScrollPosX(FX_FLOAT fx) = 0;\n\t//set the position of vertical scrollbar.\n\tvirtual void\t\t\t\t\t\t\tIOnSetScrollPosY(FX_FLOAT fy) = 0;\n\t//Invalidate the rectangle relative to the bounding box of edit.\n\tvirtual void\t\t\t\t\t\t\tIOnInvalidateRect(CPDF_Rect * pRect) = 0;\n};\n\nclass FXET_CLASS IFX_List\n{\npublic:\n\tstatic IFX_List*\t\t\t\t\t\tNewList();\n\tstatic void\t\t\t\t\t\t\t\tDelList(IFX_List* pList);\n\npublic:\n\tvirtual void\t\t\t\t\t\t\tSetFontMap(IFX_Edit_FontMap * pFontMap) = 0;\n\tvirtual void\t\t\t\t\t\t\tSetNotify(IFX_List_Notify * pNotify) = 0;\n\n\tvirtual void\t\t\t\t\t\t\tSetPlateRect(const CPDF_Rect & rect) = 0;\n\tvirtual void\t\t\t\t\t\t\tSetFontSize(FX_FLOAT fFontSize) = 0;\n\n\tvirtual CPDF_Rect\t\t\t\t\t\tGetPlateRect() const = 0;\n\tvirtual CPDF_Rect\t\t\t\t\t\tGetContentRect() const = 0;\n\n\tvirtual FX_FLOAT\t\t\t\t\t\tGetFontSize() const = 0;\n\tvirtual IFX_Edit*\t\t\t\t\t\tGetItemEdit(FX_INT32 nIndex) const = 0;\n\tvirtual FX_INT32\t\t\t\t\t\tGetCount() const = 0;\n\tvirtual FX_BOOL\t\t\t\t\t\t\tIsItemSelected(FX_INT32 nIndex) const = 0;\n\tvirtual FX_FLOAT\t\t\t\t\t\tGetFirstHeight() const = 0;\n\t\n\tvirtual void\t\t\t\t\t\t\tSetMultipleSel(FX_BOOL bMultiple) = 0;\n\tvirtual FX_BOOL\t\t\t\t\t\t\tIsMultipleSel() const = 0;\t\n\tvirtual FX_BOOL\t\t\t\t\t\t\tIsValid(FX_INT32 nItemIndex) const = 0;\n\tvirtual FX_INT32\t\t\t\t\t\tFindNext(FX_INT32 nIndex,FX_WCHAR nChar) const = 0;\t\n\n\tvirtual void\t\t\t\t\t\t\tSetScrollPos(const CPDF_Point & point) = 0;\n\tvirtual void\t\t\t\t\t\t\tScrollToListItem(FX_INT32 nItemIndex) = 0;\n\tvirtual CPDF_Rect\t\t\t\t\t\tGetItemRect(FX_INT32 nIndex) const = 0;\n\tvirtual FX_INT32\t\t\t\t\t\tGetCaret() const = 0;\n\tvirtual FX_INT32\t\t\t\t\t\tGetSelect() const = 0;\t\n\tvirtual FX_INT32\t\t\t\t\t\tGetTopItem() const = 0;\n\tvirtual FX_INT32\t\t\t\t\t\tGetItemIndex(const CPDF_Point & point) const = 0;\n\tvirtual FX_INT32\t\t\t\t\t\tGetFirstSelected() const = 0;\n\n\tvirtual void\t\t\t\t\t\t\tAddString(FX_LPCWSTR string) = 0;\n\tvirtual void\t\t\t\t\t\t\tSetTopItem(FX_INT32 nIndex) = 0;\t\n\tvirtual void\t\t\t\t\t\t\tSelect(FX_INT32 nItemIndex) = 0;\n\tvirtual void\t\t\t\t\t\t\tSetCaret(FX_INT32 nItemIndex) = 0;\n\tvirtual void\t\t\t\t\t\t\tEmpty() = 0;\n\tvirtual void\t\t\t\t\t\t\tCancel() = 0;\n\tvirtual CFX_WideString\t\t\t\t\tGetText() const = 0;\n\n\n\tvirtual void\t\t\t\t\t\t\tOnMouseDown(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl) = 0;\n\tvirtual void\t\t\t\t\t\t\tOnMouseMove(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl) = 0;\n\tvirtual void\t\t\t\t\t\t\tOnVK_UP(FX_BOOL bShift,FX_BOOL bCtrl) = 0;\n\tvirtual void\t\t\t\t\t\t\tOnVK_DOWN(FX_BOOL bShift,FX_BOOL bCtrl) = 0;\n\tvirtual void\t\t\t\t\t\t\tOnVK_LEFT(FX_BOOL bShift,FX_BOOL bCtrl) = 0;\n\tvirtual void\t\t\t\t\t\t\tOnVK_RIGHT(FX_BOOL bShift,FX_BOOL bCtrl) = 0;\n\tvirtual void\t\t\t\t\t\t\tOnVK_HOME(FX_BOOL bShift,FX_BOOL bCtrl) = 0;\n\tvirtual void\t\t\t\t\t\t\tOnVK_END(FX_BOOL bShift,FX_BOOL bCtrl) = 0;\n\tvirtual void\t\t\t\t\t\t\tOnVK(FX_INT32 nItemIndex,FX_BOOL bShift,FX_BOOL bCtrl) = 0;\n\tvirtual FX_BOOL\t\t\t\t\t\t\tOnChar(FX_WORD nChar,FX_BOOL bShift,FX_BOOL bCtrl) = 0;\n};\n\n#endif \n\n"
  },
  {
    "path": "fpdfsdk/include/fxedit/fxet_edit.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXET_EDIT_H_\n#define _FXET_EDIT_H_\n\n#include \"fx_edit.h\"\n\nclass CFX_Edit_Page;\nstruct CFX_Edit_LineRect;\nclass CFX_Edit_LineRectArray;\nclass CFX_Edit_RectArray;\nclass CFX_Edit_Refresh;\nclass CFX_Edit_Select;\nclass CFX_Edit;\nclass CFX_Edit_Iterator;\nclass CFX_Edit_Refresh;\nclass CFX_Edit_UndoItem;\nclass CFX_Edit_Undo;\nclass CFX_Edit_Provider;\n\n#define FX_EDIT_IsFloatZero(f)\t\t\t\t\t\t(f < 0.0001 && f > -0.0001)\n#define FX_EDIT_IsFloatEqual(fa,fb)\t\t\t\t\tFX_EDIT_IsFloatZero(fa - fb)\n#define FX_EDIT_IsFloatBigger(fa,fb)\t\t\t\t(fa > fb && !FX_EDIT_IsFloatEqual(fa,fb))\n#define FX_EDIT_IsFloatSmaller(fa,fb)\t\t\t\t(fa < fb && !FX_EDIT_IsFloatEqual(fa,fb))\n\ntemplate<class T> T FX_EDIT_MIN (const T & i, const T & j) { return ((i < j) ? i : j); }\ntemplate<class T> T FX_EDIT_MAX (const T & i, const T & j) { return ((i > j) ? i : j); }\n\n#define\tFX_EDIT_PI\t\t\t\t\t\t\t\t\t3.14159265358979f\n#define FX_EDIT_ITALIC_ANGEL\t\t\t\t\t\t10 * FX_EDIT_PI / 180.0f\n\n\n/* ------------------------- CFX_Edit_Refresh ---------------------------- */\n\nenum REFRESH_PLAN_E\n{\n\tRP_ANALYSE,\n\tRP_NOANALYSE,\n\tRP_OPTIONAL\n};\n\nenum EDIT_PROPS_E\n{\n\tEP_LINELEADING,\n\tEP_LINEINDENT,\n\tEP_ALIGNMENT,\n\tEP_FONTINDEX,\n\tEP_FONTSIZE,\n\tEP_WORDCOLOR,\n\tEP_SCRIPTTYPE,\n\tEP_UNDERLINE,\n\tEP_CROSSOUT,\n\tEP_CHARSPACE,\n\tEP_HORZSCALE,\n\tEP_BOLD,\n\tEP_ITALIC\n};\n\nstruct CFX_Edit_LineRect\n{\n\tCFX_Edit_LineRect(const CPVT_WordRange & wrLine,const CPDF_Rect & rcLine) :\n\t\tm_wrLine(wrLine), m_rcLine(rcLine)\n\t{\n\t}\n\n\tFX_BOOL operator != (const CFX_Edit_LineRect & linerect) const\n\t{\n\t\treturn FXSYS_memcmp(this, &linerect, sizeof(CFX_Edit_LineRect)) != 0;\n\t}\n\n\tFX_BOOL IsSameHeight(const CFX_Edit_LineRect & linerect) const\n\t{\n\t\treturn FX_EDIT_IsFloatZero((m_rcLine.top - m_rcLine.bottom) - (linerect.m_rcLine.top -linerect.m_rcLine.bottom));\n\t}\n\n\tFX_BOOL IsSameTop(const CFX_Edit_LineRect & linerect) const\n\t{\n\t\treturn FX_EDIT_IsFloatZero(m_rcLine.top - linerect.m_rcLine.top);\n\t}\n\n\tFX_BOOL IsSameLeft(const CFX_Edit_LineRect & linerect) const\n\t{\n\t\treturn FX_EDIT_IsFloatZero(m_rcLine.left - linerect.m_rcLine.left);\n\t}\n\n\tFX_BOOL IsSameRight(const CFX_Edit_LineRect & linerect) const\n\t{\n\t\treturn FX_EDIT_IsFloatZero(m_rcLine.right - linerect.m_rcLine.right);\n\t}\n\n\tCPVT_WordRange\t\t\t\t\t\t\tm_wrLine;\n\tCPDF_Rect\t\t\t\t\t\t\t\tm_rcLine;\n};\n\nclass CFX_Edit_LineRectArray\n{\npublic:\n\tCFX_Edit_LineRectArray()\n\t{\n\t}\n\n\tvirtual ~CFX_Edit_LineRectArray()\n\t{\n\t\tEmpty();\n\t}\n\n\tvoid Empty()\n\t{\n\t\tfor (FX_INT32 i = 0, sz = m_LineRects.GetSize(); i < sz; i++)\n\t\t\tdelete m_LineRects.GetAt(i);\n\n\t\tm_LineRects.RemoveAll();\n\t}\n\n\tvoid RemoveAll()\n\t{\n\t\tm_LineRects.RemoveAll();\n\t}\n\n\tvoid operator = (CFX_Edit_LineRectArray & rects)\n\t{\n\t\tEmpty();\n\t\tfor (FX_INT32 i = 0, sz = rects.GetSize(); i < sz; i++)\n\t\t\tm_LineRects.Add(rects.GetAt(i));\n\n\t\trects.RemoveAll();\n\t}\n\n\tvoid Add(const CPVT_WordRange & wrLine,const CPDF_Rect & rcLine)\n\t{\n\t\tif (CFX_Edit_LineRect * pRect = new CFX_Edit_LineRect(wrLine,rcLine))\n\t\t\tm_LineRects.Add(pRect);\n\t}\n\n\tFX_INT32 GetSize() const\n\t{\n\t\treturn m_LineRects.GetSize();\n\t}\n\n\tCFX_Edit_LineRect * GetAt(FX_INT32 nIndex) const\n\t{\n\t\tif (nIndex < 0 || nIndex >= m_LineRects.GetSize())\n\t\t\treturn NULL;\n\n\t\treturn m_LineRects.GetAt(nIndex);\n\t}\n\n\tCFX_ArrayTemplate<CFX_Edit_LineRect*>\t\tm_LineRects;\n};\n\nclass CFX_Edit_RectArray\n{\npublic:\n\tCFX_Edit_RectArray()\n\t{\n\t}\n\n\tvirtual ~CFX_Edit_RectArray()\n\t{\n\t\tthis->Empty();\n\t}\n\n\tvoid Empty()\n\t{\n\t\tfor (FX_INT32 i = 0, sz = m_Rects.GetSize(); i < sz; i++)\n\t\t\tdelete m_Rects.GetAt(i);\n\n\t\tthis->m_Rects.RemoveAll();\n\t}\n\n\tvoid Add(const CPDF_Rect & rect)\n\t{\n\t\t//check for overlaped area\n\t\tfor (FX_INT32 i = 0, sz = m_Rects.GetSize(); i < sz; i++)\n\t\t\tif (CPDF_Rect * pRect = m_Rects.GetAt(i))\n\t\t\t\tif (pRect->Contains(rect))return;\n\n\t\tif (CPDF_Rect * pNewRect = new CPDF_Rect(rect))\n\t\t\tm_Rects.Add(pNewRect);\n\t}\n\n\tFX_INT32 GetSize() const\n\t{\n\t\treturn m_Rects.GetSize();\n\t}\n\n\tCPDF_Rect * GetAt(FX_INT32 nIndex) const\n\t{\n\t\tif (nIndex < 0 || nIndex >= m_Rects.GetSize())\n\t\t\treturn NULL;\n\n\t\treturn m_Rects.GetAt(nIndex);\n\t}\n\n\tCFX_ArrayTemplate<CPDF_Rect*>\t\t\tm_Rects;\n};\n\nclass CFX_Edit_Refresh\n{\npublic:\n\tCFX_Edit_Refresh();\n\tvirtual ~CFX_Edit_Refresh();\n\n\tvoid\t\t\t\t\t\t\t\t\tBeginRefresh();\n\tvoid\t\t\t\t\t\t\t\t\tPush(const CPVT_WordRange & linerange,const CPDF_Rect & rect);\n\tvoid\t\t\t\t\t\t\t\t\tNoAnalyse();\n\tvoid\t\t\t\t\t\t\t\t\tAnalyse(FX_INT32 nAlignment);\n\tvoid\t\t\t\t\t\t\t\t\tAddRefresh(const CPDF_Rect & rect);\n\tconst CFX_Edit_RectArray *\t\t\t\tGetRefreshRects() const;\n\tvoid\t\t\t\t\t\t\t\t\tEndRefresh();\n\nprivate:\n\tCFX_Edit_LineRectArray\t\t\t\t\tm_NewLineRects;\n\tCFX_Edit_LineRectArray\t\t\t\t\tm_OldLineRects;\n\tCFX_Edit_RectArray\t\t\t\t\t\tm_RefreshRects;\n};\n\n\n/* ------------------------- CFX_Edit_Select ---------------------------- */\n\nclass CFX_Edit_Select\n{\npublic:\n\tCFX_Edit_Select()\n\t{\n\t}\n\n\tCFX_Edit_Select(const CPVT_WordPlace & begin,const CPVT_WordPlace & end)\n\t{\n\t\tSet(begin,end);\n\t}\n\n\tCFX_Edit_Select(const CPVT_WordRange & range)\n\t{\n\t\tSet(range.BeginPos,range.EndPos);\n\t}\n\n\tCPVT_WordRange ConvertToWordRange() const\n\t{\n\t\treturn CPVT_WordRange(this->BeginPos,this->EndPos);\n\t}\n\n\tvoid Default()\n\t{\n\t\tBeginPos.Default();\n\t\tEndPos.Default();\n\t}\n\n\tvoid Set(const CPVT_WordPlace & begin,const CPVT_WordPlace & end)\n\t{\n\t\tthis->BeginPos = begin;\n\t\tthis->EndPos = end;\n\t}\n\n\tvoid SetBeginPos(const CPVT_WordPlace & begin)\n\t{\n\t\tthis->BeginPos = begin;\n\t}\n\n\tvoid SetEndPos(const CPVT_WordPlace & end)\n\t{\n\t\tthis->EndPos = end;\n\t}\n\n\tFX_BOOL IsExist() const\n\t{\n\t\treturn this->BeginPos != this->EndPos;\n\t}\n\n\tFX_BOOL operator != (const CPVT_WordRange & wr) const\n\t{\n\t\treturn wr.BeginPos != this->BeginPos || wr.EndPos != this->EndPos;\n\t}\n\n\tCPVT_WordPlace BeginPos,EndPos;\n};\n\n/* ------------------------- CFX_Edit_Undo ---------------------------- */\n\nclass CFX_Edit_Undo\n{\npublic:\n\tCFX_Edit_Undo(FX_INT32 nBufsize = 10000);\n\tvirtual ~CFX_Edit_Undo();\n\n\tvoid\t\t\t\t\t\t\t\t\tUndo();\n\tvoid\t\t\t\t\t\t\t\t\tRedo();\n\n\tvoid\t\t\t\t\t\t\t\t\tAddItem(IFX_Edit_UndoItem* pItem);\n\n\tFX_BOOL\t\t\t\t\t\t\t\t\tCanUndo() const;\n\tFX_BOOL\t\t\t\t\t\t\t\t\tCanRedo() const;\n\tFX_BOOL\t\t\t\t\t\t\t\t\tIsModified() const;\n\tFX_BOOL\t\t\t\t\t\t\t\t\tIsWorking() const;\n\n\tvoid\t\t\t\t\t\t\t\t\tReset();\n\n\tIFX_Edit_UndoItem*\t\t\t\t\t\tGetItem(FX_INT32 nIndex);\n\tFX_INT32\t\t\t\t\t\t\t\tGetItemCount(){return m_UndoItemStack.GetSize();}\n\tFX_INT32\t\t\t\t\t\t\t\tGetCurUndoPos(){return m_nCurUndoPos;}\n\nprivate:\n\tvoid\t\t\t\t\t\t\t\t\tSetBufSize(FX_INT32 nSize){m_nBufSize = nSize;}\n\tFX_INT32\t\t\t\t\t\t\t\tGetBufSize(){return m_nBufSize;}\n\n\tvoid\t\t\t\t\t\t\t\t\tRemoveHeads();\n\tvoid\t\t\t\t\t\t\t\t\tRemoveTails();\n\nprivate:\n\tCFX_ArrayTemplate<IFX_Edit_UndoItem*>\tm_UndoItemStack;\n\t\n\tFX_INT32\t\t\t\t\t\t\t\tm_nCurUndoPos;\n\tFX_INT32\t\t\t\t\t\t\t\tm_nBufSize;\n\tFX_BOOL\t\t\t\t\t\t\t\t\tm_bModified; \n\tFX_BOOL\t\t\t\t\t\t\t\t\tm_bVirgin;\n\tFX_BOOL\t\t\t\t\t\t\t\t\tm_bWorking;\n};\n\nclass CFX_Edit_UndoItem : public IFX_Edit_UndoItem\n{\npublic:\n\tCFX_Edit_UndoItem() : m_bFirst(TRUE), m_bLast(TRUE) {}\n\tvirtual ~CFX_Edit_UndoItem(){}\n\n\tvirtual CFX_WideString\t\t\t\t\tGetUndoTitle() {return L\"\";}\n\tvirtual void\t\t\t\t\t\t\tRelease(){delete this;}\n\npublic:\n\tvoid\t\t\t\t\t\t\t\t\tSetFirst(FX_BOOL bFirst){m_bFirst = bFirst;}\n\tFX_BOOL\t\t\t\t\t\t\t\t\tIsFirst(){return m_bFirst;}\n\tvoid\t\t\t\t\t\t\t\t\tSetLast(FX_BOOL bLast){m_bLast = bLast;}\n\tFX_BOOL\t\t\t\t\t\t\t\t\tIsLast(){return m_bLast;}\n\nprivate:\n\tFX_BOOL\t\t\t\t\t\t\t\t\tm_bFirst;\n\tFX_BOOL\t\t\t\t\t\t\t\t\tm_bLast;\n};\n\nclass CFX_Edit_GroupUndoItem : public IFX_Edit_UndoItem\n{\npublic:\n\tCFX_Edit_GroupUndoItem(const CFX_WideString& sTitle);\n\tvirtual ~CFX_Edit_GroupUndoItem();\n\n\tvoid\t\t\t\t\t\t\t\t\tAddUndoItem(CFX_Edit_UndoItem* pUndoItem);\n\tvoid\t\t\t\t\t\t\t\t\tUpdateItems();\n\npublic:\n\tvirtual void\t\t\t\t\t\t\tUndo();\n\tvirtual void\t\t\t\t\t\t\tRedo();\n\tvirtual CFX_WideString\t\t\t\t\tGetUndoTitle();\n\tvirtual void\t\t\t\t\t\t\tRelease();\n\nprivate:\n\tCFX_WideString\t\t\t\t\t\t\tm_sTitle;\n\tCFX_ArrayTemplate<CFX_Edit_UndoItem*>\tm_Items;\n};\n\n/* ------------------------- CFX_Edit_UndoItem derived classes ---------------------------- */\n\nclass CFXEU_InsertWord : public CFX_Edit_UndoItem\n{\npublic:\n\tCFXEU_InsertWord(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,\n\t\tFX_WORD word, FX_INT32 charset, const CPVT_WordProps * pWordProps);\n\tvirtual ~CFXEU_InsertWord();\n\n\tvoid\t\t\t\t\t\tRedo();\n\tvoid\t\t\t\t\t\tUndo();\n\nprivate:\n\tCFX_Edit*\t\t\t\t\tm_pEdit;\n\n\tCPVT_WordPlace\t\t\t\tm_wpOld;\n\tCPVT_WordPlace\t\t\t\tm_wpNew;\n\tFX_WORD\t\t\t\t\t\tm_Word;\n\tFX_INT32\t\t\t\t\tm_nCharset;\n\tCPVT_WordProps\t\t\t\tm_WordProps;\n};\n\nclass CFXEU_InsertReturn : public CFX_Edit_UndoItem\n{\npublic:\n\tCFXEU_InsertReturn(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,\n\t\t\t\t\t\t\t const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps);\n\tvirtual ~CFXEU_InsertReturn();\n\n\tvoid\t\t\t\t\t\tRedo();\n\tvoid\t\t\t\t\t\tUndo();\n\nprivate:\n\tCFX_Edit *\t\t\t\t\tm_pEdit;\n\n\tCPVT_WordPlace\t\t\t\tm_wpOld;\n\tCPVT_WordPlace\t\t\t\tm_wpNew;\n\tCPVT_SecProps\t\t\t\tm_SecProps;\n\tCPVT_WordProps\t\t\t\tm_WordProps;\n};\n\nclass CFXEU_Backspace : public CFX_Edit_UndoItem\n{\npublic:\n\tCFXEU_Backspace(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,\n\t\t\t\t\t\tFX_WORD word, FX_INT32 charset,\n\t\t\t\t\t\tconst CPVT_SecProps & SecProps, const CPVT_WordProps & WordProps);\n\tvirtual ~CFXEU_Backspace();\n\n\tvoid\t\t\t\t\t\tRedo();\n\tvoid\t\t\t\t\t\tUndo();\n\nprivate:\n\tCFX_Edit *\t\t\t\t\tm_pEdit;\n\n\tCPVT_WordPlace\t\t\t\tm_wpOld;\n\tCPVT_WordPlace\t\t\t\tm_wpNew;\n\tFX_WORD\t\t\t\t\t\tm_Word;\n\tFX_INT32\t\t\t\t\tm_nCharset;\n\tCPVT_SecProps\t\t\t\tm_SecProps;\n\tCPVT_WordProps\t\t\t\tm_WordProps;\n};\n\nclass CFXEU_Delete : public CFX_Edit_UndoItem\n{\npublic:\n\tCFXEU_Delete(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,\n\t\t\t\t\t\tFX_WORD word, FX_INT32 charset,\n\t\t\t\t\t\tconst CPVT_SecProps & SecProps, const CPVT_WordProps & WordProps, FX_BOOL bSecEnd);\n\tvirtual ~CFXEU_Delete();\n\n\tvoid\t\t\t\t\t\tRedo();\n\tvoid\t\t\t\t\t\tUndo();\n\nprivate:\n\tCFX_Edit *\t\t\t\t\tm_pEdit;\n\n\tCPVT_WordPlace\t\t\t\tm_wpOld;\n\tCPVT_WordPlace\t\t\t\tm_wpNew;\n\tFX_WORD\t\t\t\t\t\tm_Word;\n\tFX_INT32\t\t\t\t\tm_nCharset;\n\tCPVT_SecProps\t\t\t\tm_SecProps;\n\tCPVT_WordProps\t\t\t\tm_WordProps;\n\tFX_BOOL\t\t\t\t\t\tm_bSecEnd;\n};\n\nclass CFXEU_Clear : public CFX_Edit_UndoItem\n{\npublic:\n\tCFXEU_Clear(CFX_Edit * pEdit, const CPVT_WordRange & wrSel, const CFX_WideString & swText);\n\tvirtual ~CFXEU_Clear();\n\n\tvoid\t\t\t\t\t\tRedo();\n\tvoid\t\t\t\t\t\tUndo();\n\nprivate:\n\tCFX_Edit*\t\t\t\t\tm_pEdit;\n\n\tCPVT_WordRange\t\t\t\tm_wrSel;\n\tCFX_WideString\t\t\t\tm_swText;\n};\n\nclass CFXEU_ClearRich : public CFX_Edit_UndoItem\n{\npublic:\n\tCFXEU_ClearRich(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,\n\t\t\t\t\t\tconst CPVT_WordRange & wrSel,\n\t\t\t\t\t   FX_WORD word, FX_INT32 charset,\n\t\t\t\t\t   const CPVT_SecProps & SecProps, const CPVT_WordProps & WordProps);\n\tvirtual ~CFXEU_ClearRich();\n\n\tvoid\t\t\t\t\t\tRedo();\n\tvoid\t\t\t\t\t\tUndo();\n\nprivate:\n\tCFX_Edit *\t\t\t\t\tm_pEdit;\n\n\tCPVT_WordPlace\t\t\t\tm_wpOld;\n\tCPVT_WordPlace\t\t\t\tm_wpNew;\n\tCPVT_WordRange\t\t\t\tm_wrSel;\n\tFX_WORD\t\t\t\t\t\tm_Word;\n\tFX_INT32\t\t\t\t\tm_nCharset;\n\tCPVT_SecProps\t\t\t\tm_SecProps;\n\tCPVT_WordProps\t\t\t\tm_WordProps;\n};\n\nclass CFXEU_InsertText : public CFX_Edit_UndoItem\n{\npublic:\n\tCFXEU_InsertText(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,\n\t\t\t\t\t\t   const CFX_WideString & swText, FX_INT32 charset,\n\t\t\t\t\t\t   const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps);\n\tvirtual ~CFXEU_InsertText();\n\n\tvoid\t\t\t\t\t\tRedo();\n\tvoid\t\t\t\t\t\tUndo();\n\nprivate:\n\tCFX_Edit *\t\t\t\t\tm_pEdit;\n\n\tCPVT_WordPlace\t\t\t\tm_wpOld;\n\tCPVT_WordPlace\t\t\t\tm_wpNew;\n\tCFX_WideString\t\t\t\tm_swText;\n\tFX_INT32\t\t\t\t\tm_nCharset;\n\tCPVT_SecProps\t\t\t\tm_SecProps;\n\tCPVT_WordProps\t\t\t\tm_WordProps;\n};\n\nclass CFXEU_SetSecProps : public CFX_Edit_UndoItem\n{\npublic:\n\tCFXEU_SetSecProps(CFX_Edit * pEdit, const CPVT_WordPlace & place, EDIT_PROPS_E ep, \n\t\tconst CPVT_SecProps & oldsecprops, const CPVT_WordProps & oldwordprops, \n\t\tconst CPVT_SecProps & newsecprops, const CPVT_WordProps & newwordprops, const CPVT_WordRange & range);\n\tvirtual ~CFXEU_SetSecProps();\n\n\tvoid\t\t\t\t\t\tRedo();\n\tvoid\t\t\t\t\t\tUndo();\n\nprivate:\n\tCFX_Edit *\t\t\t\t\tm_pEdit;\n\tCPVT_WordPlace\t\t\t\tm_wpPlace;\n\tCPVT_WordRange\t\t\t\tm_wrPlace;\n\tEDIT_PROPS_E\t\t\t\tm_eProps;\n\n\tCPVT_SecProps\t\t\t\tm_OldSecProps;\n\tCPVT_SecProps\t\t\t\tm_NewSecProps;\n\tCPVT_WordProps\t\t\t\tm_OldWordProps;\n\tCPVT_WordProps\t\t\t\tm_NewWordProps;\t\n};\n\nclass CFXEU_SetWordProps : public CFX_Edit_UndoItem\n{\npublic:\n\tCFXEU_SetWordProps(CFX_Edit * pEdit, const CPVT_WordPlace & place, EDIT_PROPS_E ep, \n\t\tconst CPVT_WordProps & oldprops, const CPVT_WordProps & newprops, const CPVT_WordRange & range);\n\tvirtual ~CFXEU_SetWordProps();\n\n\tvoid\t\t\t\t\t\tRedo();\n\tvoid\t\t\t\t\t\tUndo();\n\nprivate:\n\tCFX_Edit *\t\t\t\t\tm_pEdit;\n\tCPVT_WordPlace\t\t\t\tm_wpPlace;\n\tCPVT_WordRange\t\t\t\tm_wrPlace;\n\tEDIT_PROPS_E\t\t\t\tm_eProps;\n\t\n\tCPVT_WordProps\t\t\t\tm_OldWordProps;\n\tCPVT_WordProps\t\t\t\tm_NewWordProps;\t\n};\n\n/* ------------------------- CFX_Edit ---------------------------- */\n\nclass CFX_Edit : public IFX_Edit\n{\n\tfriend class CFX_Edit_Iterator;\n\tfriend class CFXEU_InsertWord;\n\tfriend class CFXEU_InsertReturn;\n\tfriend class CFXEU_Backspace;\n\tfriend class CFXEU_Delete;\n\tfriend class CFXEU_Clear;\n\tfriend class CFXEU_ClearRich;\n\tfriend class CFXEU_SetSecProps;\n\tfriend class CFXEU_SetWordProps;\t\n\tfriend class CFXEU_InsertText;\n\npublic:\n\tCFX_Edit(IPDF_VariableText * pVT);\n\tvirtual ~CFX_Edit();\n\n\tvoid\t\t\t\t\t\t\t\t\tSetFontMap(IFX_Edit_FontMap * pFontMap);\t\n\tvoid\t\t\t\t\t\t\t\t\tSetVTProvider(IPDF_VariableText_Provider* pProvider);\n\tvoid\t\t\t\t\t\t\t\t\tSetNotify(IFX_Edit_Notify * pNotify);\n\tvoid\t\t\t\t\t\t\t\t\tSetOprNotify(IFX_Edit_OprNotify* pOprNotify);\n\tIFX_Edit_Iterator*\t\t\t\t\t\tGetIterator();\n\tIPDF_VariableText *\t\t\t\t\t\tGetVariableText();\n\tIFX_Edit_FontMap*\t\t\t\t\t\tGetFontMap();\n\n\tvoid\t\t\t\t\t\t\t\t\tInitialize();\n\tvoid\t\t\t\t\t\t\t\t\tSetPlateRect(const CPDF_Rect & rect, FX_BOOL bPaint = TRUE);\n\tvoid\t\t\t\t\t\t\t\t\tSetScrollPos(const CPDF_Point & point);\n\n\tvoid\t\t\t\t\t\t\t\t\tSetAlignmentH(FX_INT32 nFormat = 0, FX_BOOL bPaint = TRUE);\n\tvoid\t\t\t\t\t\t\t\t\tSetAlignmentV(FX_INT32 nFormat = 0, FX_BOOL bPaint = TRUE);\n\tvoid\t\t\t\t\t\t\t\t\tSetPasswordChar(FX_WORD wSubWord = '*', FX_BOOL bPaint = TRUE);\n\tvoid\t\t\t\t\t\t\t\t\tSetLimitChar(FX_INT32 nLimitChar = 0, FX_BOOL bPaint = TRUE);\n\tvoid\t\t\t\t\t\t\t\t\tSetCharArray(FX_INT32 nCharArray = 0, FX_BOOL bPaint = TRUE);\n\tvoid\t\t\t\t\t\t\t\t\tSetCharSpace(FX_FLOAT fCharSpace = 0.0f, FX_BOOL bPaint = TRUE);\n\tvoid\t\t\t\t\t\t\t\t\tSetHorzScale(FX_INT32 nHorzScale = 100, FX_BOOL bPaint = TRUE);\n\tvoid\t\t\t\t\t\t\t\t\tSetLineLeading(FX_FLOAT fLineLeading, FX_BOOL bPaint = TRUE);\n\tvoid\t\t\t\t\t\t\t\t\tSetMultiLine(FX_BOOL bMultiLine = TRUE, FX_BOOL bPaint = TRUE);\n\tvoid\t\t\t\t\t\t\t\t\tSetAutoReturn(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE);\n\tvoid\t\t\t\t\t\t\t\t\tSetAutoFontSize(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE);\t\n\tvoid\t\t\t\t\t\t\t\t\tSetAutoScroll(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE);\t\n\tvoid\t\t\t\t\t\t\t\t\tSetFontSize(FX_FLOAT fFontSize, FX_BOOL bPaint = TRUE);\n\tvoid\t\t\t\t\t\t\t\t\tSetTextOverflow(FX_BOOL bAllowed = FALSE, FX_BOOL bPaint = TRUE);\n\n\tFX_BOOL\t\t\t\t\t\t\t\t\tIsRichText() const;\n\tvoid\t\t\t\t\t\t\t\t\tSetRichText(FX_BOOL bRichText = TRUE, FX_BOOL bPaint = TRUE);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tSetRichFontSize(FX_FLOAT fFontSize);\t\n\tFX_BOOL\t\t\t\t\t\t\t\t\tSetRichFontIndex(FX_INT32 nFontIndex);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tSetRichTextColor(FX_COLORREF dwColor);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tSetRichTextScript(FX_INT32 nScriptType);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tSetRichTextBold(FX_BOOL bBold = TRUE);\t\n\tFX_BOOL\t\t\t\t\t\t\t\t\tSetRichTextItalic(FX_BOOL bItalic = TRUE);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tSetRichTextUnderline(FX_BOOL bUnderline = TRUE);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tSetRichTextCrossout(FX_BOOL bCrossout = TRUE);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tSetRichTextCharSpace(FX_FLOAT fCharSpace);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tSetRichTextHorzScale(FX_INT32 nHorzScale = 100);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tSetRichTextLineLeading(FX_FLOAT fLineLeading);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tSetRichTextLineIndent(FX_FLOAT fLineIndent);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tSetRichTextAlignment(FX_INT32 nAlignment);\n\n\tvoid\t\t\t\t\t\t\t\t\tOnMouseDown(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl);\n\tvoid\t\t\t\t\t\t\t\t\tOnMouseMove(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl);\n\tvoid\t\t\t\t\t\t\t\t\tOnVK_UP(FX_BOOL bShift,FX_BOOL bCtrl);\n\tvoid\t\t\t\t\t\t\t\t\tOnVK_DOWN(FX_BOOL bShift,FX_BOOL bCtrl);\n\tvoid\t\t\t\t\t\t\t\t\tOnVK_LEFT(FX_BOOL bShift,FX_BOOL bCtrl);\n\tvoid\t\t\t\t\t\t\t\t\tOnVK_RIGHT(FX_BOOL bShift,FX_BOOL bCtrl);\n\tvoid\t\t\t\t\t\t\t\t\tOnVK_HOME(FX_BOOL bShift,FX_BOOL bCtrl);\n\tvoid\t\t\t\t\t\t\t\t\tOnVK_END(FX_BOOL bShift,FX_BOOL bCtrl);\n\n\tvoid\t\t\t\t\t\t\t\t\tSetText(FX_LPCWSTR text,FX_INT32 charset = DEFAULT_CHARSET,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst CPVT_SecProps * pSecProps = NULL,const CPVT_WordProps * pWordProps = NULL);\t\n\tFX_BOOL\t\t\t\t\t\t\t\t\tInsertWord(FX_WORD word, FX_INT32 charset = DEFAULT_CHARSET, const CPVT_WordProps * pWordProps = NULL);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tInsertReturn(const CPVT_SecProps * pSecProps = NULL,const CPVT_WordProps * pWordProps = NULL);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tBackspace();\n\tFX_BOOL\t\t\t\t\t\t\t\t\tDelete();\t\t\n\tFX_BOOL\t\t\t\t\t\t\t\t\tClear();\n\tFX_BOOL\t\t\t\t\t\t\t\t\tEmpty();\n\tFX_BOOL\t\t\t\t\t\t\t\t\tInsertText(FX_LPCWSTR text, FX_INT32 charset = DEFAULT_CHARSET,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst CPVT_SecProps * pSecProps = NULL,const CPVT_WordProps * pWordProps = NULL);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tRedo();\n\tFX_BOOL\t\t\t\t\t\t\t\t\tUndo();\t\n\tCPVT_WordPlace\t\t\t\t\t\t\tDoInsertText(const CPVT_WordPlace& place, FX_LPCWSTR text, FX_INT32 charset, \n\t\t\t\t\t\t\t\t\t\t\t\tconst CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps);\n\tFX_INT32\t\t\t\t\t\t\t\tGetCharSetFromUnicode(FX_WORD word, FX_INT32 nOldCharset);\n\n\tFX_INT32\t\t\t\t\t\t\t\tWordPlaceToWordIndex(const CPVT_WordPlace & place) const;\n\tCPVT_WordPlace\t\t\t\t\t\t\tWordIndexToWordPlace(FX_INT32 index) const;\t\n\n\tCPVT_WordPlace\t\t\t\t\t\t\tGetLineBeginPlace(const CPVT_WordPlace & place) const;\n\tCPVT_WordPlace\t\t\t\t\t\t\tGetLineEndPlace(const CPVT_WordPlace & place) const;\n\tCPVT_WordPlace\t\t\t\t\t\t\tGetSectionBeginPlace(const CPVT_WordPlace & place) const;\n\tCPVT_WordPlace\t\t\t\t\t\t\tGetSectionEndPlace(const CPVT_WordPlace & place) const;\n\tCPVT_WordPlace\t\t\t\t\t\t\tSearchWordPlace(const CPDF_Point& point) const;\n\n\tFX_INT32\t\t\t\t\t\t\t\tGetCaret() const;\n\tCPVT_WordPlace\t\t\t\t\t\t\tGetCaretWordPlace() const;\n\tCFX_WideString\t\t\t\t\t\t\tGetSelText() const;\n\tCFX_WideString\t\t\t\t\t\t\tGetText() const;\n\tFX_FLOAT\t\t\t\t\t\t\t\tGetFontSize() const;\n\tFX_WORD\t\t\t\t\t\t\t\t\tGetPasswordChar() const;\n\tCPDF_Point\t\t\t\t\t\t\t\tGetScrollPos() const;\n\tFX_INT32\t\t\t\t\t\t\t\tGetCharArray() const;\n\tCPDF_Rect\t\t\t\t\t\t\t\tGetPlateRect() const;\n\tCPDF_Rect\t\t\t\t\t\t\t\tGetContentRect() const;\n\tCFX_WideString\t\t\t\t\t\t\tGetRangeText(const CPVT_WordRange & range) const;\n\tFX_INT32\t\t\t\t\t\t\t\tGetHorzScale() const;\n\tFX_FLOAT\t\t\t\t\t\t\t\tGetCharSpace() const;\n\tFX_INT32\t\t\t\t\t\t\t\tGetTotalWords() const;\n\tFX_INT32\t\t\t\t\t\t\t\tGetTotalLines() const;\n\n\tvoid\t\t\t\t\t\t\t\t\tSetSel(FX_INT32 nStartChar,FX_INT32 nEndChar);\n\tvoid\t\t\t\t\t\t\t\t\tGetSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar) const;\n\nprivate:\n\tvoid\t\t\t\t\t\t\t\t\tSelectAll();\n\tvoid\t\t\t\t\t\t\t\t\tSelectNone();\n\tvoid\t\t\t\t\t\t\t\t\tSetSel(const CPVT_WordPlace & begin,const CPVT_WordPlace & end);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tIsSelected() const;\n\n\tvoid\t\t\t\t\t\t\t\t\tRearrangeAll();\n\tvoid\t\t\t\t\t\t\t\t\tRearrangePart(const CPVT_WordRange & range);\n\tvoid\t\t\t\t\t\t\t\t\tPaint();\n\tvoid\t\t\t\t\t\t\t\t\tScrollToCaret();\n\tvoid\t\t\t\t\t\t\t\t\tSetScrollInfo();\n\tvoid\t\t\t\t\t\t\t\t\tSetScrollPosX(FX_FLOAT fx);\n\tvoid\t\t\t\t\t\t\t\t\tSetScrollPosY(FX_FLOAT fy);\n\tvoid\t\t\t\t\t\t\t\t\tSetScrollLimit();\n\tvoid\t\t\t\t\t\t\t\t\tSetContentChanged();\n\tvoid\t\t\t\t\t\t\t\t\tEnableNotify(FX_BOOL bNotify);\n\n\tvoid\t\t\t\t\t\t\t\t\tSetText(FX_LPCWSTR text,FX_INT32 charset,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst CPVT_SecProps * pSecProps,const CPVT_WordProps * pWordProps,FX_BOOL bAddUndo, FX_BOOL bPaint);\t\n\tFX_BOOL\t\t\t\t\t\t\t\t\tInsertWord(FX_WORD word, FX_INT32 charset, const CPVT_WordProps * pWordProps,FX_BOOL bAddUndo, FX_BOOL bPaint);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tInsertReturn(const CPVT_SecProps * pSecProps,const CPVT_WordProps * pWordProps,FX_BOOL bAddUndo, FX_BOOL bPaint);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tBackspace(FX_BOOL bAddUndo, FX_BOOL bPaint);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tDelete(FX_BOOL bAddUndo, FX_BOOL bPaint);\t\t\n\tFX_BOOL\t\t\t\t\t\t\t\t\tClear(FX_BOOL bAddUndo, FX_BOOL bPaint);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tInsertText(FX_LPCWSTR text, FX_INT32 charset,\n\t\t\t\t\t\t\t\t\t\t\t\tconst CPVT_SecProps * pSecProps,const CPVT_WordProps * pWordProps,FX_BOOL bAddUndo, FX_BOOL bPaint);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tSetRichTextProps(EDIT_PROPS_E eProps,\n\t\t\t\t\t\t\t\t\t\t\t\tconst CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tSetSecProps(EDIT_PROPS_E eProps, const CPVT_WordPlace & place, \n\t\t\t\t\t\t\t\t\t\t\t\tconst CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps, const CPVT_WordRange & wr, FX_BOOL bAddUndo);\n\tFX_BOOL\t\t\t\t\t\t\t\t\tSetWordProps(EDIT_PROPS_E eProps, const CPVT_WordPlace & place, \n\t\t\t\t\t\t\t\t\t\t\t\tconst CPVT_WordProps * pWordProps, const CPVT_WordRange & wr, FX_BOOL bAddUndo);\n\tvoid\t\t\t\t\t\t\t\t\tPaintSetProps(EDIT_PROPS_E eProps, const CPVT_WordRange & wr);\n\tvoid\t\t\t\t\t\t\t\t\tPaintInsertText(const CPVT_WordPlace & wpOld, const CPVT_WordPlace & wpNew);\n\n\tinline CPDF_Point\t\t\t\t\t\tVTToEdit(const CPDF_Point & point) const;\n\tinline CPDF_Point\t\t\t\t\t\tEditToVT(const CPDF_Point & point) const;\n\tinline CPDF_Rect\t\t\t\t\t\tVTToEdit(const CPDF_Rect & rect) const;\n\tinline CPDF_Rect\t\t\t\t\t\tEditToVT(const CPDF_Rect & rect) const;\n\n\tvoid\t\t\t\t\t\t\t\t\tEnableRefresh(FX_BOOL bRefresh);\n\tvoid\t\t\t\t\t\t\t\t\tRefresh(REFRESH_PLAN_E ePlan,const CPVT_WordRange * pRange1 = NULL,const CPVT_WordRange * pRange2 = NULL);\n\tvoid\t\t\t\t\t\t\t\t\tRefreshPushLineRects(const CPVT_WordRange & wr);\n\tvoid\t\t\t\t\t\t\t\t\tRefreshPushRandomRects(const CPVT_WordRange & wr);\n\tvoid\t\t\t\t\t\t\t\t\tRefreshWordRange(const CPVT_WordRange& wr);\n\n\tvoid\t\t\t\t\t\t\t\t\tSetCaret(FX_INT32 nPos);\n\tvoid\t\t\t\t\t\t\t\t\tSetCaret(const CPVT_WordPlace & place);\n\tvoid\t\t\t\t\t\t\t\t\tSetCaretInfo();\n\tvoid\t\t\t\t\t\t\t\t\tSetCaretOrigin();\n\tvoid\t\t\t\t\t\t\t\t\tSetCaretChange();\n\n\tCPVT_WordRange\t\t\t\t\t\t\tGetWholeWordRange() const;\n\tCPVT_WordRange\t\t\t\t\t\t\tGetVisibleWordRange() const;\n\tCPVT_WordRange\t\t\t\t\t\t\tGetLatinWordsRange(const CPVT_WordPlace & place) const;\n\tCPVT_WordRange\t\t\t\t\t\t\tCombineWordRange(const CPVT_WordRange & wr1, const CPVT_WordRange & wr2);\n\tCPVT_WordRange\t\t\t\t\t\t\tGetSelectWordRange() const;\n\n\tvoid\t\t\t\t\t\t\t\t\tEnableUndo(FX_BOOL bUndo);\n\tvoid\t\t\t\t\t\t\t\t\tEnableOprNotify(FX_BOOL bNotify);\n\n\tFX_BOOL\t\t\t\t\t\t\t\t\tIsTextFull() const;\n\tFX_BOOL\t\t\t\t\t\t\t\t\tIsTextOverflow() const;\n\tFX_BOOL\t\t\t\t\t\t\t\t\tCanUndo() const;\n\tFX_BOOL\t\t\t\t\t\t\t\t\tCanRedo() const;\n\tFX_BOOL\t\t\t\t\t\t\t\t\tIsModified() const;\n\n\tvoid\t\t\t\t\t\t\t\t\tBeginGroupUndo(const CFX_WideString& sTitle);\n\tvoid\t\t\t\t\t\t\t\t\tEndGroupUndo();\n\tvoid\t\t\t\t\t\t\t\t\tAddEditUndoItem(CFX_Edit_UndoItem* pEditUndoItem);\n\tvoid\t\t\t\t\t\t\t\t\tAddUndoItem(IFX_Edit_UndoItem* pUndoItem);\n\n\tvoid\t\t\t\t\t\t\t\t\tSetPageInfo(const CPVT_WordPlace& place);\n\tCPVT_WordPlace\t\t\t\t\t\t\tSearchPageEndPlace(const CPVT_WordPlace& wpPageBegin, const CPDF_Point& point) const;\n\tFX_FLOAT\t\t\t\t\t\t\t\tGetLineTop(const CPVT_WordPlace& place) const;\n\tFX_FLOAT\t\t\t\t\t\t\t\tGetLineBottom(const CPVT_WordPlace& place) const;\n\nprivate:\t\n\tIPDF_VariableText*\t\t\t\t\t\tm_pVT;\n\tIFX_Edit_Notify*\t\t\t\t\t\tm_pNotify;\n\tIFX_Edit_OprNotify*\t\t\t\t\t\tm_pOprNotify;\n\tCFX_Edit_Provider*\t\t\t\t\t\tm_pVTProvide;\n\n\tCPVT_WordPlace\t\t\t\t\t\t\tm_wpCaret;\n\tCPVT_WordPlace\t\t\t\t\t\t\tm_wpOldCaret;\n\tCFX_Edit_Select\t\t\t\t\t\t\tm_SelState;\n\n\tCPDF_Point\t\t\t\t\t\t\t\tm_ptScrollPos;\n\tCPDF_Point\t\t\t\t\t\t\t\tm_ptRefreshScrollPos;\n\tFX_BOOL\t\t\t\t\t\t\t\t\tm_bEnableScroll;\t\n\tIFX_Edit_Iterator *\t\t\t\t\t\tm_pIterator;\t\n\tCFX_Edit_Refresh\t\t\t\t\t\tm_Refresh;\n\tCPDF_Point\t\t\t\t\t\t\t\tm_ptCaret;\n\tCFX_Edit_Undo\t\t\t\t\t\t\tm_Undo;\n\tFX_INT32\t\t\t\t\t\t\t\tm_nAlignment;\n\tFX_BOOL\t\t\t\t\t\t\t\t\tm_bNotifyFlag;\n\tFX_BOOL\t\t\t\t\t\t\t\t\tm_bTextFullFlag;\n\tFX_BOOL\t\t\t\t\t\t\t\t\tm_bEnableOverflow;\n\tFX_BOOL\t\t\t\t\t\t\t\t\tm_bEnableRefresh;\n\tCPDF_Rect\t\t\t\t\t\t\t\tm_rcOldContent;\n\tFX_BOOL\t\t\t\t\t\t\t\t\tm_bEnableUndo;\n\tFX_BOOL\t\t\t\t\t\t\t\t\tm_bNotify;\n\tFX_BOOL\t\t\t\t\t\t\t\t\tm_bOprNotify;\n\tCFX_Edit_GroupUndoItem*\t\t\t\t\tm_pGroupUndoItem;\n};\n\n/* ------------------------- CFX_Edit_Iterator ---------------------------- */\n\nclass CFX_Edit_Iterator : public IFX_Edit_Iterator\n{\npublic:\n\tCFX_Edit_Iterator(CFX_Edit * pEdit,IPDF_VariableText_Iterator * pVTIterator);\n\tvirtual ~CFX_Edit_Iterator();\n\n\tFX_BOOL\t\t\t\t\t\t\t\t\tNextWord();\n\tFX_BOOL\t\t\t\t\t\t\t\t\tNextLine();\n\tFX_BOOL\t\t\t\t\t\t\t\t\tNextSection();\n\tFX_BOOL\t\t\t\t\t\t\t\t\tPrevWord();\n\tFX_BOOL\t\t\t\t\t\t\t\t\tPrevLine();\n\tFX_BOOL\t\t\t\t\t\t\t\t\tPrevSection();\n\n\tFX_BOOL\t\t\t\t\t\t\t\t\tGetWord(CPVT_Word & word) const;\n\tFX_BOOL\t\t\t\t\t\t\t\t\tGetLine(CPVT_Line & line) const;\n\tFX_BOOL\t\t\t\t\t\t\t\t\tGetSection(CPVT_Section & section) const;\n\tvoid\t\t\t\t\t\t\t\t\tSetAt(FX_INT32 nWordIndex);\n\tvoid\t\t\t\t\t\t\t\t\tSetAt(const CPVT_WordPlace & place);\n\tconst CPVT_WordPlace &\t\t\t\t\tGetAt() const;\n\tIFX_Edit*\t\t\t\t\t\t\t\tGetEdit() const;\n\nprivate:\n\tCFX_Edit *\t\t\t\t\t\t\t\tm_pEdit;\n\tIPDF_VariableText_Iterator*\t\t\t\tm_pVTIterator;\n};\n\nclass CFX_Edit_Provider : public IPDF_VariableText_Provider\n{\npublic:\n\tCFX_Edit_Provider(IFX_Edit_FontMap* pFontMap);\n\tvirtual ~CFX_Edit_Provider();\n\n\tIFX_Edit_FontMap*\t\t\tGetFontMap();\n\n\tFX_INT32\t\t\t\t\tGetCharWidth(FX_INT32 nFontIndex, FX_WORD word, FX_INT32 nWordStyle);\n\tFX_INT32\t\t\t\t\tGetTypeAscent(FX_INT32 nFontIndex);\n\tFX_INT32\t\t\t\t\tGetTypeDescent(FX_INT32 nFontIndex);\n\tFX_INT32\t\t\t\t\tGetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex);\n\tFX_INT32\t\t\t\t\tGetDefaultFontIndex();\n\tFX_BOOL\t\t\t\t\t\tIsLatinWord(FX_WORD word);\n\nprivate:\n\tIFX_Edit_FontMap*\t\t\tm_pFontMap;\n};\n\n#endif //_FXET_EDIT_H_\n\n"
  },
  {
    "path": "fpdfsdk/include/fxedit/fxet_list.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXET_LIST_H_\n#define _FXET_LIST_H_\n\n#include \"fx_edit.h\"\n\nclass IFX_Edit;\n\nclass CLST_Size\n{\npublic:\n\tCLST_Size() : x(0.0f), y(0.0f)\n\t{\t\t\n\t}\n\n\tCLST_Size(FX_FLOAT x,FX_FLOAT y)\n\t{ \n\t\tthis->x = x;\n\t\tthis->y = y;\n\t}\n\n\tvoid Default()\n\t{\n\t\tx = 0.0f;\n\t\ty = 0.0f;\n\t}\n\n\tFX_BOOL operator != (const CLST_Size & size) const\n\t{\n\t\treturn FXSYS_memcmp(this, &size, sizeof(CLST_Size)) != 0;\n\t}\n\n\tFX_FLOAT x,y;\n};\n\nclass CLST_Rect : public CPDF_Rect\n{\npublic:\n\tCLST_Rect()\n\t{\t\n\t\tleft = top = right = bottom = 0.0f;\n\t}\n\n\tCLST_Rect(FX_FLOAT left,FX_FLOAT top,\n\t\t\t\t\t\tFX_FLOAT right,FX_FLOAT bottom)\n\t{ \n\t\tthis->left = left; \n\t\tthis->top = top; \n\t\tthis->right = right; \n\t\tthis->bottom = bottom; \n\t}\n\n\tCLST_Rect(const CPDF_Rect & rect)\n\t{ \n\t\tthis->left = rect.left; \n\t\tthis->top = rect.top; \n\t\tthis->right = rect.right; \n\t\tthis->bottom = rect.bottom; \n\t}\n\n\tvoid Default()\n\t{\n\t\tleft = top = right = bottom = 0.0f;\n\t}\n\n\tconst CLST_Rect operator = (const CPDF_Rect & rect)\n\t{\n\t\tthis->left = rect.left;\n\t\tthis->top = rect.top;\n\t\tthis->right = rect.right;\n\t\tthis->bottom = rect.bottom;\n\n\t\treturn *this;\n\t}\n\n\tFX_BOOL operator == (const CLST_Rect & rect) const\n\t{\n\t\treturn FXSYS_memcmp(this, &rect, sizeof(CLST_Rect)) == 0;\n\t}\n\n\tFX_BOOL operator != (const CLST_Rect & rect) const\n\t{\n\t\treturn FXSYS_memcmp(this, &rect, sizeof(CLST_Rect)) != 0;\n\t}\n\n\tFX_FLOAT Width() const\n\t{\n\t\treturn this->right - this->left;\n\t}\n\n\tFX_FLOAT Height() const\n\t{\n\t\tif (this->top > this->bottom)\n\t\t\treturn this->top - this->bottom;\n\t\telse\n\t\t\treturn this->bottom - this->top;\n\t}\n\n\tCPDF_Point LeftTop() const\n\t{\n\t\treturn CPDF_Point(left,top);\n\t}\n\n\tCPDF_Point RightBottom() const\n\t{\n\t\treturn CPDF_Point(right,bottom);\n\t}\n\n\tconst CLST_Rect operator += (const CPDF_Point & point) \n\t{\n\t\tthis->left += point.x;\n\t\tthis->right += point.x;\n\t\tthis->top += point.y;\n\t\tthis->bottom += point.y;\n\n\t\treturn *this;\n\t}\n\n\tconst CLST_Rect operator -= (const CPDF_Point & point) \n\t{\n\t\tthis->left -= point.x;\n\t\tthis->right -= point.x;\n\t\tthis->top -= point.y;\n\t\tthis->bottom -= point.y;\n\n\t\treturn *this;\n\t}\n\n\tCLST_Rect operator + (const CPDF_Point & point) const\n\t{\n\t\treturn CLST_Rect(left + point.x,\n\t\t\t\t\ttop + point.y,\n\t\t\t\t\tright + point.x,\n\t\t\t\t\tbottom + point.y);\n\t}\n\n\tCLST_Rect operator - (const CPDF_Point & point) const\n\t{\n\t\treturn CLST_Rect(left - point.x,\n\t\t\t\t\ttop - point.y,\n\t\t\t\t\tright - point.x,\n\t\t\t\t\tbottom - point.y);\n\t}\n};\n\nclass CFX_ListItem\n{\npublic:\n\tCFX_ListItem();\n\tvirtual ~CFX_ListItem();\n\n\tvoid\t\t\t\t\t\t\tSetFontMap(IFX_Edit_FontMap * pFontMap);\n\tIFX_Edit_Iterator*\t\t\t\tGetIterator() const;\n\tIFX_Edit*\t\t\t\t\t\tGetEdit() const;\n\npublic:\n\tvoid\t\t\t\t\t\t\tSetRect(const CLST_Rect & rect);\t\t\n\tvoid\t\t\t\t\t\t\tSetSelect(FX_BOOL bSelected);\t\n\tvoid\t\t\t\t\t\t\tSetCaret(FX_BOOL bCaret);\n\tvoid\t\t\t\t\t\t\tSetText(FX_LPCWSTR text);\n\tvoid\t\t\t\t\t\t\tSetFontSize(FX_FLOAT fFontSize);\n\tCFX_WideString\t\t\t\t\tGetText() const;\n\n\tCLST_Rect\t\t\t\t\t\tGetRect() const;\n\tFX_BOOL\t\t\t\t\t\t\tIsSelected() const;\n\tFX_BOOL\t\t\t\t\t\t\tIsCaret() const;\n\tFX_FLOAT\t\t\t\t\t\tGetItemHeight() const;\t\n\tFX_WORD\t\t\t\t\t\t\tGetFirstChar() const;\n\nprivate:\n\tIFX_Edit*\t\t\t\t\t\tm_pEdit;\n\tFX_BOOL\t\t\t\t\t\t\tm_bSelected;\t\t//Ƿѡ\n\tFX_BOOL\t\t\t\t\t\t\tm_bCaret;\t\t//ǷΪ㣬ѡʱ\n\tCLST_Rect\t\t\t\t\t\tm_rcListItem;\t//ڲ\n};\n\nclass CFX_ListContainer\n{\npublic:\n\tCFX_ListContainer() : m_rcPlate(0.0f,0.0f,0.0f,0.0f), m_rcContent(0.0f,0.0f,0.0f,0.0f){}\n\tvirtual ~CFX_ListContainer(){}\n\tvirtual void\t\t\t\t\tSetPlateRect(const CPDF_Rect & rect){m_rcPlate = rect;}\n\tCPDF_Rect\t\t\t\t\t\tGetPlateRect() const{return m_rcPlate;}\n\tvoid\t\t\t\t\t\t\tSetContentRect(const CLST_Rect & rect){m_rcContent = rect;}\n\tCLST_Rect\t\t\t\t\t\tGetContentRect() const{return m_rcContent;}\n\tCPDF_Point\t\t\t\t\t\tGetBTPoint() const{return CPDF_Point(m_rcPlate.left,m_rcPlate.top);}\n\tCPDF_Point\t\t\t\t\t\tGetETPoint() const{return CPDF_Point(m_rcPlate.right,m_rcPlate.bottom);}\npublic:\n\tCPDF_Point\t\t\t\t\t\tInnerToOuter(const CPDF_Point & point) const{return CPDF_Point(point.x + GetBTPoint().x,GetBTPoint().y - point.y);}\n\tCPDF_Point\t\t\t\t\t\tOuterToInner(const CPDF_Point & point) const{return CPDF_Point(point.x - GetBTPoint().x,GetBTPoint().y - point.y);}\n\tCPDF_Rect\t\t\t\t\t\tInnerToOuter(const CLST_Rect & rect) const{CPDF_Point ptLeftTop = InnerToOuter(CPDF_Point(rect.left,rect.top));\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tCPDF_Point ptRightBottom = InnerToOuter(CPDF_Point(rect.right,rect.bottom));\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn CPDF_Rect(ptLeftTop.x,ptRightBottom.y,ptRightBottom.x,ptLeftTop.y);}\n\tCLST_Rect\t\t\t\t\t\tOuterToInner(const CPDF_Rect & rect) const{CPDF_Point ptLeftTop = OuterToInner(CPDF_Point(rect.left,rect.top));\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tCPDF_Point ptRightBottom = OuterToInner(CPDF_Point(rect.right,rect.bottom));\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn CLST_Rect(ptLeftTop.x,ptLeftTop.y,ptRightBottom.x,ptRightBottom.y);}\nprivate:\n\tCPDF_Rect\t\t\t\t\t\tm_rcPlate; \t\n\tCLST_Rect\t\t\t\t\t\tm_rcContent;\t\t//positive forever!\n};\n\ntemplate<class TYPE> class CLST_ArrayTemplate : public CFX_ArrayTemplate<TYPE>\n{\npublic:\t\n\tFX_BOOL IsEmpty() { return CFX_ArrayTemplate<TYPE>::GetSize() <= 0; }\n\tTYPE GetAt(FX_INT32 nIndex) const { if (nIndex >= 0 && nIndex < CFX_ArrayTemplate<TYPE>::GetSize()) return CFX_ArrayTemplate<TYPE>::GetAt(nIndex); return NULL;}\n\tvoid RemoveAt(FX_INT32 nIndex){if (nIndex >= 0 && nIndex < CFX_ArrayTemplate<TYPE>::GetSize()) CFX_ArrayTemplate<TYPE>::RemoveAt(nIndex);}\n};\n\nclass CFX_List : protected CFX_ListContainer , public IFX_List\n{\npublic:\n\tCFX_List();\n\tvirtual ~CFX_List();\n\npublic:\n\tvirtual void\t\t\t\t\tSetFontMap(IFX_Edit_FontMap * pFontMap);\n\tvirtual void\t\t\t\t\tSetFontSize(FX_FLOAT fFontSize);\n\n\tvirtual CPDF_Rect\t\t\t\tGetPlateRect() const;\n\tvirtual CPDF_Rect\t\t\t\tGetContentRect() const;\n\n\tvirtual FX_FLOAT\t\t\t\tGetFontSize() const;\n\tvirtual IFX_Edit*\t\t\t\tGetItemEdit(FX_INT32 nIndex) const;\n\tvirtual FX_INT32\t\t\t\tGetCount() const;\n\tvirtual FX_BOOL\t\t\t\t\tIsItemSelected(FX_INT32 nIndex) const;\n\tvirtual FX_FLOAT\t\t\t\tGetFirstHeight() const;\n\t\n\tvirtual void\t\t\t\t\tSetMultipleSel(FX_BOOL bMultiple);\n\tvirtual FX_BOOL\t\t\t\t\tIsMultipleSel() const;\t\n\tvirtual FX_BOOL\t\t\t\t\tIsValid(FX_INT32 nItemIndex) const;\n\tvirtual FX_INT32\t\t\t\tFindNext(FX_INT32 nIndex,FX_WCHAR nChar) const;\t\n\nprotected:\n\tvirtual void\t\t\t\t\tEmpty();\n\n\tvoid\t\t\t\t\t\t\tAddItem(FX_LPCWSTR str);\n\tvirtual void\t\t\t\t\tReArrange(FX_INT32 nItemIndex);\t\n\n\tvirtual CPDF_Rect\t\t\t\tGetItemRect(FX_INT32 nIndex) const;\t\n\tCFX_WideString\t\t\t\t\tGetItemText(FX_INT32 nIndex) const;\n\n\tvoid\t\t\t\t\t\t\tSetItemSelect(FX_INT32 nItemIndex, FX_BOOL bSelected);\n\tvoid\t\t\t\t\t\t\tSetItemCaret(FX_INT32 nItemIndex, FX_BOOL bCaret);\n\n\tvirtual FX_INT32\t\t\t\tGetItemIndex(const CPDF_Point & point) const;\t\t\n\tFX_INT32\t\t\t\t\t\tGetFirstSelected() const;\n\tFX_INT32\t\t\t\t\t\tGetLastSelected() const;\n\tFX_WCHAR\t\t\t\t\t\tToupper(FX_WCHAR c) const;\n\t\t\nprivate:\n\tCLST_ArrayTemplate<CFX_ListItem*>\tm_aListItems;\n\tFX_FLOAT\t\t\t\t\t\t\tm_fFontSize;\n\tIFX_Edit_FontMap*\t\t\t\t\tm_pFontMap;\n\tFX_BOOL\t\t\t\t\t\t\t\tm_bMultiple;\t\n};\n\nstruct CPLST_Select_Item\n{\n\tCPLST_Select_Item(FX_INT32 nItemIndex,FX_INT32 nState)\n\t{\n\t\tthis->nItemIndex = nItemIndex;\n\t\tthis->nState = nState;\n\t}\n\n\tFX_INT32\t\tnItemIndex;\n\tFX_INT32\t\tnState; //0:normal select -1:to deselect 1: to select\n};\n\nclass CPLST_Select\n{\npublic:\n\tCPLST_Select();\n\tvirtual ~CPLST_Select();\n\npublic:\n\tvoid\t\t\t\t\t\t\tAdd(FX_INT32 nItemIndex);\n\tvoid\t\t\t\t\t\t\tAdd(FX_INT32 nBeginIndex, FX_INT32 nEndIndex);\n\tvoid\t\t\t\t\t\t\tSub(FX_INT32 nItemIndex);\n\tvoid\t\t\t\t\t\t\tSub(FX_INT32 nBeginIndex, FX_INT32 nEndIndex);\n\tFX_BOOL\t\t\t\t\t\t\tIsExist(FX_INT32 nItemIndex) const;\n\tFX_INT32\t\t\t\t\t\tFind(FX_INT32 nItemIndex) const;\n\tFX_INT32\t\t\t\t\t\tGetCount() const;\n\tFX_INT32\t\t\t\t\t\tGetItemIndex(FX_INT32 nIndex) const;\n\tFX_INT32\t\t\t\t\t\tGetState(FX_INT32 nIndex) const;\n\tvoid\t\t\t\t\t\t\tDone();\n\tvoid\t\t\t\t\t\t\tDeselectAll();\n\nprivate:\n\tCFX_ArrayTemplate<CPLST_Select_Item*>\tm_aItems;\n};\n\nclass CFX_ListCtrl : public CFX_List\n{\npublic:\n\tCFX_ListCtrl();\n\tvirtual ~CFX_ListCtrl();\n\npublic:\n\tvoid\t\t\t\t\t\t\tSetNotify(IFX_List_Notify * pNotify);\n\n\tvoid\t\t\t\t\t\t\tOnMouseDown(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl);\n\tvoid\t\t\t\t\t\t\tOnMouseMove(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl);\n\tvoid\t\t\t\t\t\t\tOnVK_UP(FX_BOOL bShift,FX_BOOL bCtrl);\n\tvoid\t\t\t\t\t\t\tOnVK_DOWN(FX_BOOL bShift,FX_BOOL bCtrl);\n\tvoid\t\t\t\t\t\t\tOnVK_LEFT(FX_BOOL bShift,FX_BOOL bCtrl);\n\tvoid\t\t\t\t\t\t\tOnVK_RIGHT(FX_BOOL bShift,FX_BOOL bCtrl);\n\tvoid\t\t\t\t\t\t\tOnVK_HOME(FX_BOOL bShift,FX_BOOL bCtrl);\n\tvoid\t\t\t\t\t\t\tOnVK_END(FX_BOOL bShift,FX_BOOL bCtrl);\n\tvoid\t\t\t\t\t\t\tOnVK(FX_INT32 nItemIndex,FX_BOOL bShift,FX_BOOL bCtrl);\n\tFX_BOOL\t\t\t\t\t\t\tOnChar(FX_WORD nChar,FX_BOOL bShift,FX_BOOL bCtrl);\n\n\tvirtual CPDF_Point\t\t\t\tInToOut(const CPDF_Point & point) const;\n\tvirtual CPDF_Point\t\t\t\tOutToIn(const CPDF_Point & point) const;\n\tvirtual CPDF_Rect\t\t\t\tInToOut(const CPDF_Rect & rect) const;\n\tvirtual CPDF_Rect\t\t\t\tOutToIn(const CPDF_Rect & rect) const;\n\n\tvirtual void\t\t\t\t\tSetPlateRect(const CPDF_Rect & rect);\n\tvoid\t\t\t\t\t\t\tSetScrollPos(const CPDF_Point & point);\n\tvoid\t\t\t\t\t\t\tScrollToListItem(FX_INT32 nItemIndex);\n\tvirtual CPDF_Rect\t\t\t\tGetItemRect(FX_INT32 nIndex) const;\n\tFX_INT32\t\t\t\t\t\tGetCaret() const {return m_nCaretIndex;}\n\tFX_INT32\t\t\t\t\t\tGetSelect() const {return m_nSelItem;}\t\n\tFX_INT32\t\t\t\t\t\tGetTopItem() const;\n\tvirtual CPDF_Rect\t\t\t\tGetContentRect() const;\n\tvirtual FX_INT32\t\t\t\tGetItemIndex(const CPDF_Point & point) const;\n\n\tvoid\t\t\t\t\t\t\tAddString(FX_LPCWSTR string);\n\tvoid\t\t\t\t\t\t\tSetTopItem(FX_INT32 nIndex);\t\n\tvoid\t\t\t\t\t\t\tSelect(FX_INT32 nItemIndex);\n\tvirtual void\t\t\t\t\tSetCaret(FX_INT32 nItemIndex);\n\tvirtual void\t\t\t\t\tEmpty();\n\tvirtual void\t\t\t\t\tCancel();\n\tCFX_WideString\t\t\t\t\tGetText() const;\n\nprivate:\n\tvoid\t\t\t\t\t\t\tSetMultipleSelect(FX_INT32 nItemIndex, FX_BOOL bSelected);\n\tvoid\t\t\t\t\t\t\tSetSingleSelect(FX_INT32 nItemIndex);\n\tvoid\t\t\t\t\t\t\tInvalidateItem(FX_INT32 nItemIndex);\n\tvoid\t\t\t\t\t\t\tSelectItems();\n\tFX_BOOL\t\t\t\t\t\t\tIsItemVisible(FX_INT32 nItemIndex) const;\t\t\n\tvoid\t\t\t\t\t\t\tSetScrollInfo();\n\tvoid\t\t\t\t\t\t\tSetScrollPosY(FX_FLOAT fy);\n\tvirtual void\t\t\t\t\tReArrange(FX_INT32 nItemIndex);\t\n\nprivate:\n\tIFX_List_Notify*\t\t\t\tm_pNotify;\n\tFX_BOOL\t\t\t\t\t\t\tm_bNotifyFlag;\n\tCPDF_Point\t\t\t\t\t\tm_ptScrollPos;\n\tCPLST_Select\t\t\t\t\tm_aSelItems;\t//for multiple\n\tFX_INT32\t\t\t\t\t\tm_nSelItem;\t\t//for single\n\tFX_INT32\t\t\t\t\t\tm_nFootIndex;\t//for multiple\n\tFX_BOOL\t\t\t\t\t\t\tm_bCtrlSel;\t\t//for multiple\n\tFX_INT32\t\t\t\t\t\tm_nCaretIndex;\t//for multiple\n};\n\n#endif\n\n"
  },
  {
    "path": "fpdfsdk/include/fxedit/fxet_stub.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FXET_STUB_H_\n#define _FXET_STUB_H_\n\n#include \"../../../core/include/fpdfapi/fpdf_module.h\" \n#include \"../../../core/include/fpdfapi/fpdf_render.h\" \n#include \"../../../core/include/fpdfapi/fpdf_pageobj.h\" \n#include \"../../../core/include/fpdfdoc/fpdf_vt.h\" \n#include \"../fx_systemhandler.h\"\n#ifdef FX_READER_DLL\n\t#ifdef _DEBUG\n\t\t#pragma comment(lib, \"X:/pdf/fxcore/Lib/dbg_w32_vc6/fxcoredll[dbg,w32,vc6].lib\")\n\t\t#pragma comment(lib, \"X:/pdf/fxcore/Lib/dbg_w32_vc6/fpdfdocdll[dbg,w32,vc6].lib\")\n\t#else\n\t\t#pragma comment(lib, \"X:/pdf/fxcore/Lib/rel_w32_vc6/fxcoredll[rel,w32,vc6].lib\")\n\t\t#pragma comment(lib, \"X:/pdf/fxcore/Lib/rel_w32_vc6/fpdfdocdll[rel,w32,vc6].lib\")\n\t#endif\n#endif\n\n#endif \n\n"
  },
  {
    "path": "fpdfsdk/include/javascript/Consts.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _CONSTS_H_\n#define _CONSTS_H_\n\n/* ------------------------------ border ------------------------------ */\n\nclass CJS_Border : public CJS_Object\n{\npublic:\n\tCJS_Border(JSFXObject  pObject) : CJS_Object(pObject) {};\n\tvirtual ~CJS_Border(void){};\n\n\tDECLARE_JS_CLASS_CONST();\n};\n\n/* ------------------------------ display ------------------------------ */\n\nclass CJS_Display : public CJS_Object\n{\npublic:\n\tCJS_Display(JSFXObject  pObject) : CJS_Object(pObject) {};\n\tvirtual ~CJS_Display(void){};\n\n\tDECLARE_JS_CLASS_CONST();\n};\n\n/* ------------------------------ font ------------------------------ */\n\nclass CJS_Font : public CJS_Object\n{\npublic:\n\tCJS_Font(JSFXObject  pObject) : CJS_Object(pObject) {};\n\tvirtual ~CJS_Font(void){};\n\n\tDECLARE_JS_CLASS_CONST();\n};\n\n/* ------------------------------ highlight ------------------------------ */\n\nclass CJS_Highlight : public CJS_Object\n{\npublic:\n\tCJS_Highlight(JSFXObject  pObject) : CJS_Object(pObject) {};\n\tvirtual ~CJS_Highlight(void){};\n\n\tDECLARE_JS_CLASS_CONST();\n};\n\n/* ------------------------------ position ------------------------------ */\n\nclass CJS_Position : public CJS_Object\n{\npublic:\n\tCJS_Position(JSFXObject  pObject) : CJS_Object(pObject) {};\n\tvirtual ~CJS_Position(void){};\n\n\tDECLARE_JS_CLASS_CONST();\n};\n\n/* ------------------------------ scaleHow ------------------------------ */\n\nclass CJS_ScaleHow : public CJS_Object\n{\npublic:\n\tCJS_ScaleHow(JSFXObject  pObject) : CJS_Object(pObject) {};\n\tvirtual ~CJS_ScaleHow(void){};\n\n\tDECLARE_JS_CLASS_CONST();\n};\n\n/* ------------------------------ scaleWhen ------------------------------ */\n\nclass CJS_ScaleWhen : public CJS_Object\n{\npublic:\n\tCJS_ScaleWhen(JSFXObject  pObject) : CJS_Object(pObject) {};\n\tvirtual ~CJS_ScaleWhen(void){};\n\n\tDECLARE_JS_CLASS_CONST();\n};\n\n/* ------------------------------ style ------------------------------ */\n\nclass CJS_Style : public CJS_Object\n{\npublic:\n\tCJS_Style(JSFXObject  pObject) : CJS_Object(pObject) {};\n\tvirtual ~CJS_Style(void){};\n\n\tDECLARE_JS_CLASS_CONST();\n};\n\n/* ------------------------------ zoomtype ------------------------------ */\n\nclass CJS_Zoomtype : public CJS_Object\n{\npublic:\n\tCJS_Zoomtype(JSFXObject  pObject) : CJS_Object(pObject) {};\n\tvirtual ~CJS_Zoomtype(void){};\n\n\tDECLARE_JS_CLASS_CONST();\n};\n\n/* ------------------------------ CJS_GlobalConsts ------------------------------ */\n\nclass CJS_GlobalConsts : public CJS_Object\n{\npublic:\n\tstatic int\t\t\t\tInit(IJS_Runtime* pRuntime);\n};\n\n/* ------------------------------ CJS_GlobalArrays ------------------------------ */\n\nclass CJS_GlobalArrays : public CJS_Object\n{\npublic:\n\tstatic int\t\t\t\tInit(IJS_Runtime* pRuntime);\n};\n\n#endif //_CONSTS_H_\n\n"
  },
  {
    "path": "fpdfsdk/include/javascript/Document.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _DOCUMENT_H_\n#define _DOCUMENT_H_\n\n\n\nclass PrintParamsObj : public CJS_EmbedObj\n{\npublic:\n\tPrintParamsObj(CJS_Object* pJSObject);\n\tvirtual ~PrintParamsObj(){}\n\t\npublic:\n\tFX_BOOL bUI;\n\tint nStart;\n\tint nEnd;\n\tFX_BOOL bSilent;\n\tFX_BOOL bShrinkToFit;\n\tFX_BOOL bPrintAsImage;\n\tFX_BOOL bReverse;\n\tFX_BOOL bAnnotations;\n};\n\nclass CJS_PrintParamsObj : public CJS_Object\n{\npublic:\n\tCJS_PrintParamsObj(JSFXObject pObject) : CJS_Object(pObject) {}\n\tvirtual ~CJS_PrintParamsObj(){}\n\t\n\tDECLARE_JS_CLASS(CJS_PrintParamsObj);\n};\n\n\nclass Icon;\nclass Field;\n\nstruct IconElement\n{\n\tIconElement() : IconName(L\"\"), IconStream(NULL), NextIcon(NULL){}\n\tvirtual ~IconElement()\n\t{\n\t}\n\tCFX_WideString\tIconName;\n\tIconElement*\tNextIcon;\n\tIcon*\t\t\tIconStream;\n};\n\nclass IconTree\n{\npublic:\n\tIconTree():m_pHead(NULL), m_pEnd(NULL), m_iLength(0)\n\t{\n\n\t}\n\n\tvirtual ~IconTree()\n\t{\n\t}\n\npublic:\n\tvoid\t\t\tInsertIconElement(IconElement* pNewIcon);\n\tvoid\t\t\tDeleteIconElement(CFX_WideString swIconName);\n\tvoid\t\t\tDeleteIconTree();\n\tint\t\t\t\tGetLength();\n\tIconElement*\toperator[](int iIndex);\n\nprivate:\n\tIconElement*\tm_pHead;\n\tIconElement*\tm_pEnd;\n\tint\t\t\t\tm_iLength;\n};\n\nstruct CJS_DelayData;\nstruct CJS_DelayAnnot;\nstruct CJS_AnnotObj;\n\nclass Document : public CJS_EmbedObj\n{\npublic:\n\tDocument(CJS_Object* pJSObject);\n\tvirtual ~Document();\n\npublic:\n\tFX_BOOL\tADBE(OBJ_PROP_PARAMS);\n\tFX_BOOL\tauthor(OBJ_PROP_PARAMS);\n\tFX_BOOL\tbaseURL(OBJ_PROP_PARAMS);\n\tFX_BOOL\tbookmarkRoot(OBJ_PROP_PARAMS);\n\tFX_BOOL\tcalculate(OBJ_PROP_PARAMS);\n\tFX_BOOL\tCollab(OBJ_PROP_PARAMS);\n\tFX_BOOL\tcreationDate(OBJ_PROP_PARAMS);\n\tFX_BOOL\tcreator(OBJ_PROP_PARAMS);\n\tFX_BOOL\tdelay(OBJ_PROP_PARAMS);\n\tFX_BOOL\tdirty(OBJ_PROP_PARAMS);\n\tFX_BOOL\tdocumentFileName(OBJ_PROP_PARAMS);\n\tFX_BOOL external(OBJ_PROP_PARAMS);\n\tFX_BOOL\tfilesize(OBJ_PROP_PARAMS);\n\tFX_BOOL\ticons(OBJ_PROP_PARAMS);\n\tFX_BOOL\tinfo(OBJ_PROP_PARAMS);\n\tFX_BOOL\tkeywords(OBJ_PROP_PARAMS);\n\tFX_BOOL\tlayout(OBJ_PROP_PARAMS);\n\tFX_BOOL\tmedia(OBJ_PROP_PARAMS);\n\tFX_BOOL\tmodDate(OBJ_PROP_PARAMS);\n\tFX_BOOL\tmouseX(OBJ_PROP_PARAMS);\n\tFX_BOOL\tmouseY(OBJ_PROP_PARAMS);\n\tFX_BOOL\tnumFields(OBJ_PROP_PARAMS);\n\tFX_BOOL\tnumPages(OBJ_PROP_PARAMS);\n\tFX_BOOL\tpageNum(OBJ_PROP_PARAMS);\n\tFX_BOOL\tpageWindowRect(OBJ_PROP_PARAMS);\n\tFX_BOOL\tpath(OBJ_PROP_PARAMS);\n\tFX_BOOL\tproducer(OBJ_PROP_PARAMS);\n\tFX_BOOL\tsubject(OBJ_PROP_PARAMS);\n\tFX_BOOL\ttitle(OBJ_PROP_PARAMS);\n\tFX_BOOL\tzoom(OBJ_PROP_PARAMS);\n\tFX_BOOL\tzoomType(OBJ_PROP_PARAMS);\n\n\tFX_BOOL addAnnot(OBJ_METHOD_PARAMS);\n\tFX_BOOL\taddField(OBJ_METHOD_PARAMS);\n\tFX_BOOL\taddLink(OBJ_METHOD_PARAMS);\n\tFX_BOOL\taddIcon(OBJ_METHOD_PARAMS);\n\tFX_BOOL\tcalculateNow(OBJ_METHOD_PARAMS);\n\tFX_BOOL\tcloseDoc(OBJ_METHOD_PARAMS);\n\tFX_BOOL\tcreateDataObject(OBJ_METHOD_PARAMS);\n\tFX_BOOL deletePages(OBJ_METHOD_PARAMS);\n\tFX_BOOL\texportAsText(OBJ_METHOD_PARAMS);\n\tFX_BOOL\texportAsFDF(OBJ_METHOD_PARAMS);\n\tFX_BOOL\texportAsXFDF(OBJ_METHOD_PARAMS);\n\tFX_BOOL extractPages(OBJ_METHOD_PARAMS);\n\tFX_BOOL\tgetAnnot(OBJ_METHOD_PARAMS);\n\tFX_BOOL\tgetAnnots(OBJ_METHOD_PARAMS);\n\tFX_BOOL\tgetAnnot3D(OBJ_METHOD_PARAMS);\n\tFX_BOOL\tgetAnnots3D(OBJ_METHOD_PARAMS);\n\tFX_BOOL\tgetField(OBJ_METHOD_PARAMS);\n\tFX_BOOL\tgetIcon(OBJ_METHOD_PARAMS);\n\tFX_BOOL\tgetLinks(OBJ_METHOD_PARAMS);\n\tFX_BOOL\tgetNthFieldName(OBJ_METHOD_PARAMS);\n\tFX_BOOL\tgetOCGs(OBJ_METHOD_PARAMS);\n\tFX_BOOL\tgetPageBox(OBJ_METHOD_PARAMS);\n\tFX_BOOL\tgetPageNthWord(OBJ_METHOD_PARAMS);\n\tFX_BOOL\tgetPageNthWordQuads(OBJ_METHOD_PARAMS);\n\tFX_BOOL\tgetPageNumWords(OBJ_METHOD_PARAMS);\n\tFX_BOOL getPrintParams(OBJ_METHOD_PARAMS);\n\tFX_BOOL getURL(OBJ_METHOD_PARAMS);\n\tFX_BOOL\timportAnFDF(OBJ_METHOD_PARAMS);\n\tFX_BOOL\timportAnXFDF(OBJ_METHOD_PARAMS);\n\tFX_BOOL\timportTextData(OBJ_METHOD_PARAMS);\n\tFX_BOOL insertPages(OBJ_METHOD_PARAMS);\n\tFX_BOOL\tmailForm(OBJ_METHOD_PARAMS);\n\tFX_BOOL\tprint(OBJ_METHOD_PARAMS);\n\tFX_BOOL\tremoveField(OBJ_METHOD_PARAMS);\n\tFX_BOOL replacePages(OBJ_METHOD_PARAMS);\n\tFX_BOOL\tresetForm(OBJ_METHOD_PARAMS);\n\tFX_BOOL\tsaveAs(OBJ_METHOD_PARAMS);\n\tFX_BOOL\tsubmitForm(OBJ_METHOD_PARAMS);\n\tFX_BOOL\tmailDoc(OBJ_METHOD_PARAMS);\n\tFX_BOOL\tremoveIcon(OBJ_METHOD_PARAMS);\n\t\npublic:\n\tvoid AttachDoc(CPDFSDK_Document* pDoc);\n\tCPDFSDK_Document* GetReaderDoc();\n\n\tstatic FX_BOOL\t\t\t\tExtractFileName(CPDFSDK_Document* pDoc, CFX_ByteString& strFileName);\n\tstatic FX_BOOL\t\t\t\tExtractFolderName(CPDFSDK_Document* pDoc, CFX_ByteString& strFolderName);\n\npublic:\n\tvoid\t\t\t\t\t\tAddDelayData(CJS_DelayData* pData);\n\tvoid\t\t\t\t\t\tDoFieldDelay(const CFX_WideString& sFieldName, int nControlIndex);\n\n\tvoid\t\t\t\t\t\tAddDelayAnnotData(CJS_AnnotObj *pData);\n\tvoid\t\t\t\t\t\tDoAnnotDelay();\n\tvoid\t\t\t\t\t\tSetIsolate(v8::Isolate* isolate) {m_isolate = isolate;}\n\nprivate:\n\tCFX_WideString\t\t\t\tReversalStr(CFX_WideString cbFrom);\n\tCFX_WideString\t\t\t\tCutString(CFX_WideString cbFrom);\n\tbool\t\t\t\t\t\tIsEnclosedInRect(CFX_FloatRect rect, CFX_FloatRect LinkRect);\n\tint\t\t\t\t\t\t\tCountWords(CPDF_TextObject* pTextObj);\n\tCFX_WideString\t\t\t\tGetObjWordStr(CPDF_TextObject* pTextObj, int nWordIndex);\n\n\tFX_BOOL\t\t\t\t\t\tParserParams(JSObject *pObj,CJS_AnnotObj& annotobj);\n\nprivate:\n\tv8::Isolate*\t\t\t\t\tm_isolate;\n\tIconTree*\t\t\t\t\tm_pIconTree;\n\tCPDFSDK_Document*\t\t\tm_pDocument;\n\tCFX_WideString\t\t\t\tm_cwBaseURL;\n\n\tFX_BOOL\t\t\t\t\t\t\t\tm_bDelay;\n\tCFX_ArrayTemplate<CJS_DelayData*>\tm_DelayData;\n\tCFX_ArrayTemplate<CJS_AnnotObj*>\tm_DelayAnnotData;\n};\n\nclass CJS_Document : public CJS_Object\n{\npublic:\n\tCJS_Document(JSFXObject pObject) : CJS_Object(pObject) {};\n\tvirtual ~CJS_Document(){};\n\n\tvirtual FX_BOOL\tInitInstance(IFXJS_Context* cc);\t\n\n\tDECLARE_JS_CLASS(CJS_Document);\n\n\tJS_STATIC_PROP(ADBE, Document);\n\tJS_STATIC_PROP(author, Document);\n\tJS_STATIC_PROP(baseURL, Document);\n\tJS_STATIC_PROP(bookmarkRoot, Document);\n\tJS_STATIC_PROP(calculate, Document);\n\tJS_STATIC_PROP(Collab, Document);\n\tJS_STATIC_PROP(creationDate, Document);\n\tJS_STATIC_PROP(creator, Document);\n\tJS_STATIC_PROP(delay, Document);\n\tJS_STATIC_PROP(dirty, Document);\n\tJS_STATIC_PROP(documentFileName, Document);\n\tJS_STATIC_PROP(external, Document);\n\tJS_STATIC_PROP(filesize, Document);\n\tJS_STATIC_PROP(icons, Document);\n\tJS_STATIC_PROP(info, Document);\n\tJS_STATIC_PROP(keywords, Document);\n\tJS_STATIC_PROP(layout, Document);\n\tJS_STATIC_PROP(media, Document);\n\tJS_STATIC_PROP(modDate, Document);\n\tJS_STATIC_PROP(mouseX, Document);\n\tJS_STATIC_PROP(mouseY, Document);\n\tJS_STATIC_PROP(numFields, Document);\n\tJS_STATIC_PROP(numPages, Document);\n\tJS_STATIC_PROP(pageNum, Document);\n\tJS_STATIC_PROP(pageWindowRect, Document);\n\tJS_STATIC_PROP(path, Document);\n\tJS_STATIC_PROP(producer, Document);\n\tJS_STATIC_PROP(subject, Document);\n\tJS_STATIC_PROP(title, Document);\n\tJS_STATIC_PROP(zoom, Document);\n\tJS_STATIC_PROP(zoomType, Document);\n\n\tJS_STATIC_METHOD(addAnnot,Document);\n\tJS_STATIC_METHOD(addField, Document);\n\tJS_STATIC_METHOD(addLink, Document);\n\tJS_STATIC_METHOD(addIcon, Document);\n\tJS_STATIC_METHOD(calculateNow, Document);\n\tJS_STATIC_METHOD(closeDoc, Document);\n\tJS_STATIC_METHOD(createDataObject, Document);\n\tJS_STATIC_METHOD(deletePages, Document);\n\tJS_STATIC_METHOD(exportAsText, Document);\n\tJS_STATIC_METHOD(exportAsFDF, Document);\n\tJS_STATIC_METHOD(exportAsXFDF, Document);\n\tJS_STATIC_METHOD(extractPages, Document);\n\tJS_STATIC_METHOD(getAnnot, Document);\n\tJS_STATIC_METHOD(getAnnots, Document);\n\tJS_STATIC_METHOD(getAnnot3D, Document);\n\tJS_STATIC_METHOD(getAnnots3D, Document);\n\tJS_STATIC_METHOD(getField, Document);\n\tJS_STATIC_METHOD(getIcon, Document);\n\tJS_STATIC_METHOD(getLinks, Document);\n\tJS_STATIC_METHOD(getNthFieldName, Document);\n\tJS_STATIC_METHOD(getOCGs, Document);\n\tJS_STATIC_METHOD(getPageBox, Document);\n\tJS_STATIC_METHOD(getPageNthWord, Document);\n\tJS_STATIC_METHOD(getPageNthWordQuads, Document);\n\tJS_STATIC_METHOD(getPageNumWords, Document);\n\tJS_STATIC_METHOD(getPrintParams, Document);\n\tJS_STATIC_METHOD(getURL, Document);\n\tJS_STATIC_METHOD(importAnFDF, Document);\n\tJS_STATIC_METHOD(importAnXFDF, Document);\n\tJS_STATIC_METHOD(importTextData, Document);\n\tJS_STATIC_METHOD(insertPages, Document);\n\tJS_STATIC_METHOD(mailForm, Document);\n\tJS_STATIC_METHOD(print, Document);\n\tJS_STATIC_METHOD(removeField, Document);\n\tJS_STATIC_METHOD(replacePages, Document);\n\tJS_STATIC_METHOD(removeIcon, Document);\n\tJS_STATIC_METHOD(resetForm, Document);\n\tJS_STATIC_METHOD(saveAs, Document);\n\tJS_STATIC_METHOD(submitForm, Document);\n\tJS_STATIC_METHOD(mailDoc, Document);\n};\n\n#endif//_DOCUMENT_H_\n\n"
  },
  {
    "path": "fpdfsdk/include/javascript/Field.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _FIELD_H_\n#define _FIELD_H_\n\nclass Document;\n\nenum FIELD_PROP\n{\n\tFP_ALIGNMENT,\n\tFP_BORDERSTYLE,\n\tFP_BUTTONALIGNX,\n\tFP_BUTTONALIGNY,\n\tFP_BUTTONFITBOUNDS,\n\tFP_BUTTONPOSITION,\n\tFP_BUTTONSCALEHOW,\n\tFP_BUTTONSCALEWHEN,\n\tFP_CALCORDERINDEX,\n\tFP_CHARLIMIT,\n\tFP_COMB,\n\tFP_COMMITONSELCHANGE,\n\tFP_CURRENTVALUEINDICES,\n\tFP_DEFAULTVALUE,\n\tFP_DONOTSCROLL,\n\tFP_DISPLAY,\n\tFP_FILLCOLOR,\n\tFP_HIDDEN,\n\tFP_HIGHLIGHT,\n\tFP_LINEWIDTH,\n\tFP_MULTILINE,\n\tFP_MULTIPLESELECTION,\n\tFP_PASSWORD,\n\tFP_RECT,\n\tFP_RICHTEXT,\n\tFP_RICHVALUE,\n\tFP_ROTATION,\n\tFP_STROKECOLOR,\n\tFP_STYLE,\n\tFP_TEXTCOLOR,\n\tFP_TEXTFONT,\n\tFP_TEXTSIZE,\n\tFP_USERNAME,\n\tFP_VALUE\n};\n\nclass CJS_WideStringArray\n{\npublic:\n\tCJS_WideStringArray(){}\n\tvirtual ~CJS_WideStringArray()\n\t{\n\t\tfor (int i=0,sz=m_Data.GetSize(); i<sz; i++)\n\t\t\tdelete m_Data.GetAt(i);\n\t\tm_Data.RemoveAll();\n\t}\n\n\tvoid Add(const CFX_WideString& string)\n\t{\n\t\tm_Data.Add(new CFX_WideString(string));\n\t}\n\n\tint GetSize() const\n\t{\n\t\treturn m_Data.GetSize();\n\t}\n\n\tCFX_WideString GetAt(int i) const\n\t{\n\t\treturn *m_Data.GetAt(i);\n\t}\n\nprivate:\n\tCFX_ArrayTemplate<CFX_WideString*>\tm_Data;\n};\n\nstruct CJS_DelayData\n{\n\tCFX_WideString\t\t\tsFieldName;\n\tint\t\t\t\t\t\tnControlIndex;\n\tenum FIELD_PROP\t\t\teProp;\n\tFX_INT32\t\t\t\tnum;\n\tbool\t\t\t\t\tb;\n\tCFX_ByteString\t\t\tstring;\n\tCFX_WideString\t\t\twidestring;\n\tCPDF_Rect\t\t\t\trect;\n\tCPWL_Color\t\t\t\tcolor;\n\tCFX_DWordArray\t\t\twordarray;\n\tCJS_WideStringArray\t\twidestringarray;\n};\n\nclass Field : public CJS_EmbedObj\n{\npublic:\n\tField(CJS_Object* pJSObject);\t\n\tvirtual ~Field(void);\n\n    FX_BOOL alignment(OBJ_PROP_PARAMS);\n    FX_BOOL borderStyle(OBJ_PROP_PARAMS);\n\tFX_BOOL buttonAlignX(OBJ_PROP_PARAMS);\n\tFX_BOOL buttonAlignY(OBJ_PROP_PARAMS);\n\tFX_BOOL buttonFitBounds(OBJ_PROP_PARAMS);\n\tFX_BOOL buttonPosition(OBJ_PROP_PARAMS);\n\tFX_BOOL buttonScaleHow(OBJ_PROP_PARAMS);\n    FX_BOOL buttonScaleWhen(OBJ_PROP_PARAMS);\n\tFX_BOOL calcOrderIndex(OBJ_PROP_PARAMS);\n\tFX_BOOL charLimit(OBJ_PROP_PARAMS);\n\tFX_BOOL comb(OBJ_PROP_PARAMS);\n\tFX_BOOL commitOnSelChange(OBJ_PROP_PARAMS);\n\tFX_BOOL currentValueIndices(OBJ_PROP_PARAMS);\n    FX_BOOL defaultStyle(OBJ_PROP_PARAMS);\n\tFX_BOOL defaultValue(OBJ_PROP_PARAMS);\n\tFX_BOOL doNotScroll(OBJ_PROP_PARAMS);\n\tFX_BOOL doNotSpellCheck(OBJ_PROP_PARAMS);\n\tFX_BOOL delay(OBJ_PROP_PARAMS);\n\tFX_BOOL display(OBJ_PROP_PARAMS);\n    FX_BOOL doc(OBJ_PROP_PARAMS);\n\tFX_BOOL editable(OBJ_PROP_PARAMS);\n\tFX_BOOL exportValues(OBJ_PROP_PARAMS);\n\tFX_BOOL fileSelect(OBJ_PROP_PARAMS);\n\tFX_BOOL fillColor(OBJ_PROP_PARAMS);\n\tFX_BOOL hidden(OBJ_PROP_PARAMS);\n    FX_BOOL highlight(OBJ_PROP_PARAMS);\n\tFX_BOOL lineWidth(OBJ_PROP_PARAMS);\n\tFX_BOOL multiline(OBJ_PROP_PARAMS);\n\tFX_BOOL multipleSelection(OBJ_PROP_PARAMS);\n\tFX_BOOL name(OBJ_PROP_PARAMS);\n\tFX_BOOL numItems(OBJ_PROP_PARAMS);\n    FX_BOOL page(OBJ_PROP_PARAMS);\n\tFX_BOOL password(OBJ_PROP_PARAMS);\n\tFX_BOOL print(OBJ_PROP_PARAMS);\n\tFX_BOOL radiosInUnison(OBJ_PROP_PARAMS);\n\tFX_BOOL readonly(OBJ_PROP_PARAMS);\n\tFX_BOOL rect(OBJ_PROP_PARAMS);\n    FX_BOOL required(OBJ_PROP_PARAMS);\n\tFX_BOOL richText(OBJ_PROP_PARAMS);\n\tFX_BOOL richValue(OBJ_PROP_PARAMS);\n\tFX_BOOL rotation(OBJ_PROP_PARAMS);\n\tFX_BOOL strokeColor(OBJ_PROP_PARAMS);\n\tFX_BOOL style(OBJ_PROP_PARAMS);\n\tFX_BOOL submitName(OBJ_PROP_PARAMS);\n\tFX_BOOL textColor(OBJ_PROP_PARAMS);\n\tFX_BOOL textFont(OBJ_PROP_PARAMS);\n\tFX_BOOL textSize(OBJ_PROP_PARAMS);\n\tFX_BOOL type(OBJ_PROP_PARAMS);\n\tFX_BOOL userName(OBJ_PROP_PARAMS);\n\tFX_BOOL value(OBJ_PROP_PARAMS);\n\tFX_BOOL valueAsString(OBJ_PROP_PARAMS);\n\tFX_BOOL source(OBJ_PROP_PARAMS);\n\n\tFX_BOOL browseForFileToSubmit(OBJ_METHOD_PARAMS);\n\tFX_BOOL buttonGetCaption(OBJ_METHOD_PARAMS);\n\tFX_BOOL buttonGetIcon(OBJ_METHOD_PARAMS);\n\tFX_BOOL buttonImportIcon(OBJ_METHOD_PARAMS);\n\tFX_BOOL buttonSetCaption(OBJ_METHOD_PARAMS);\n\tFX_BOOL buttonSetIcon(OBJ_METHOD_PARAMS);\n\tFX_BOOL checkThisBox(OBJ_METHOD_PARAMS);\n\tFX_BOOL clearItems(OBJ_METHOD_PARAMS);\n\tFX_BOOL defaultIsChecked(OBJ_METHOD_PARAMS);\n\tFX_BOOL deleteItemAt(OBJ_METHOD_PARAMS);\n\tFX_BOOL getArray(OBJ_METHOD_PARAMS);\n\tFX_BOOL getItemAt(OBJ_METHOD_PARAMS);\n\tFX_BOOL getLock(OBJ_METHOD_PARAMS);\n\tFX_BOOL insertItemAt(OBJ_METHOD_PARAMS);\n\tFX_BOOL isBoxChecked(OBJ_METHOD_PARAMS);\n\tFX_BOOL isDefaultChecked(OBJ_METHOD_PARAMS);\n\tFX_BOOL setAction(OBJ_METHOD_PARAMS);\n\tFX_BOOL setFocus(OBJ_METHOD_PARAMS);\n\tFX_BOOL setItems(OBJ_METHOD_PARAMS);\n\tFX_BOOL setLock(OBJ_METHOD_PARAMS);\n\tFX_BOOL signatureGetModifications(OBJ_METHOD_PARAMS);\n\tFX_BOOL signatureGetSeedValue(OBJ_METHOD_PARAMS);\n\tFX_BOOL signatureInfo(OBJ_METHOD_PARAMS);\n\tFX_BOOL signatureSetSeedValue(OBJ_METHOD_PARAMS);\n\tFX_BOOL signatureSign(OBJ_METHOD_PARAMS);\n\tFX_BOOL signatureValidate(OBJ_METHOD_PARAMS);\n\npublic:\n\tstatic void SetAlignment(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_ByteString& string);\n    static void SetBorderStyle(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_ByteString& string);\n\tstatic void SetButtonAlignX(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number);\n\tstatic void SetButtonAlignY(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number);\n\tstatic void SetButtonFitBounds(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b);\n\tstatic void SetButtonPosition(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number);\n\tstatic void SetButtonScaleHow(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number);\n    static void SetButtonScaleWhen(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number);\n\tstatic void SetCalcOrderIndex(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number);\n\tstatic void SetCharLimit(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number);\n\tstatic void SetComb(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b);\n\tstatic void SetCommitOnSelChange(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b);\n\tstatic void SetCurrentValueIndices(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_DWordArray& array);\n    static void SetDefaultStyle(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex);\n\tstatic void SetDefaultValue(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_WideString& string);\n\tstatic void SetDoNotScroll(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b);\n\tstatic void SetDisplay(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number);\n\tstatic void SetFillColor(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CPWL_Color& color);\n\tstatic void SetHidden(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b);\n    static void SetHighlight(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_ByteString& string);\n\tstatic void SetLineWidth(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number);\n\tstatic void SetMultiline(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b);\n\tstatic void SetMultipleSelection(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b);\n\tstatic void SetPassword(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b);\n\tstatic void SetRect(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CPDF_Rect& rect);\n\tstatic void SetRichText(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b);\n\tstatic void SetRichValue(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex);\n\tstatic void SetRotation(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number);\n\tstatic void SetStrokeColor(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CPWL_Color& color);\n\tstatic void SetStyle(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_ByteString& string);\n\tstatic void SetTextColor(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CPWL_Color& color);\n\tstatic void SetTextFont(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_ByteString& string);\n\tstatic void SetTextSize(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number);\n\tstatic void SetUserName(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_WideString& string);\n\tstatic void SetValue(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CJS_WideStringArray& strArray);\n\npublic:\n\tstatic void\t\t\t\t\t\t\tAddField(CPDFSDK_Document* pDocument, int nPageIndex, int nFieldType, \n\t\t\t\t\t\t\t\t\t\t\tconst CFX_WideString& sName, const CPDF_Rect& rcCoords);\npublic:\n\tstatic void\t\t\t\t\t\t\tUpdateFormField(CPDFSDK_Document* pDocument, CPDF_FormField* pFormField, \n\t\t\t\t\t\t\t\t\t\t\tFX_BOOL bChangeMark, FX_BOOL bResetAP, FX_BOOL bRefresh);\n\tstatic void\t\t\t\t\t\t\tUpdateFormControl(CPDFSDK_Document* pDocument, CPDF_FormControl* pFormControl, \n\t\t\t\t\t\t\t\t\t\t\tFX_BOOL bChangeMark, FX_BOOL bResetAP, FX_BOOL bRefresh);\n\n\tstatic CPDFSDK_Widget*\t\t\t\t\tGetWidget(CPDFSDK_Document* pDocument, CPDF_FormControl* pFormControl);\n\tstatic void\t\t\t\t\t\t\tGetFormFields(CPDFSDK_Document* pDocument, const CFX_WideString& csFieldName, CFX_PtrArray& FieldsArray);\n\n\tstatic void\t\t\t\t\t\t\tDoDelay(CPDFSDK_Document* pDocument, CJS_DelayData* pData);\n\npublic:\n\tFX_BOOL\t\t\t\t\t\t\t\tAttachField(Document* pDocument, const CFX_WideString& csFieldName);\n\tvoid\t\t\t\t\t\t\t\tSetDelay(FX_BOOL bDelay);\n\tvoid\t\t\t\t\t\t\t\tSetIsolate(v8::Isolate* isolate) {m_isolate = isolate;}\nprotected:\n\tvoid\t\t\t\t\t\t\t\tParseFieldName(const std::wstring &strFieldNameParsed,std::wstring &strFieldName,int & iControlNo);\n\tvoid\t\t\t\t\t\t\t\tGetFormFields(const CFX_WideString& csFieldName, CFX_PtrArray& FieldsArray);\n\tCPDF_FormControl* \t\t\t\t\tGetSmartFieldControl(CPDF_FormField* pFormField);\n\tFX_BOOL\t\t\t\t\t\t\t\tValueIsOccur(CPDF_FormField* pFormField, CFX_WideString csOptLabel);\n\n\tvoid\t\t\t\t\t\t\t\tAddDelay_Int(enum FIELD_PROP prop, FX_INT32 n);\n\tvoid\t\t\t\t\t\t\t\tAddDelay_Bool(enum FIELD_PROP prop,bool b);\n\tvoid\t\t\t\t\t\t\t\tAddDelay_String(enum FIELD_PROP prop, const CFX_ByteString& string);\n\tvoid\t\t\t\t\t\t\t\tAddDelay_WideString(enum FIELD_PROP prop, const CFX_WideString& string);\n\tvoid\t\t\t\t\t\t\t\tAddDelay_Rect(enum FIELD_PROP prop, const CPDF_Rect& rect);\n\tvoid\t\t\t\t\t\t\t\tAddDelay_Color(enum FIELD_PROP prop, const CPWL_Color& color);\n\tvoid\t\t\t\t\t\t\t\tAddDelay_WordArray(enum FIELD_PROP prop, const CFX_DWordArray& array);\n\tvoid\t\t\t\t\t\t\t\tAddDelay_WideStringArray(enum FIELD_PROP prop, const CJS_WideStringArray& array);\n\n\tvoid\t\t\t\t\t\t\t\tDoDelay();\npublic:\n\tDocument*\t\t\t\t\t\t\tm_pJSDoc;\n\tCPDFSDK_Document*\t\t\t\t\tm_pDocument;\n\tCFX_WideString\t\t\t\t\t\tm_FieldName;\n\tint\t\t\t\t\t\t\t\t\tm_nFormControlIndex;\n\tFX_BOOL\t\t\t\t\t\t\t\tm_bCanSet;\n\n\tFX_BOOL\t\t\t\t\t\t\t\tm_bDelay;\n\tv8::Isolate*\t\t\t\t\t\t\tm_isolate;\n};\n\nclass CJS_Field : public CJS_Object\n{\npublic:\n\tCJS_Field(JSFXObject pObject) : CJS_Object(pObject) {};\n\tvirtual ~CJS_Field(void){};\n\n\tvirtual FX_BOOL\tInitInstance(IFXJS_Context* cc);\n\n\tDECLARE_JS_CLASS(CJS_Field);\n\n    JS_STATIC_PROP(alignment, Field);\n    JS_STATIC_PROP(borderStyle, Field);\n\tJS_STATIC_PROP(buttonAlignX, Field);\n\tJS_STATIC_PROP(buttonAlignY, Field);\n\tJS_STATIC_PROP(buttonFitBounds, Field);\n\tJS_STATIC_PROP(buttonPosition, Field);\n\tJS_STATIC_PROP(buttonScaleHow, Field);\n    JS_STATIC_PROP(buttonScaleWhen, Field);\n\tJS_STATIC_PROP(calcOrderIndex, Field);\n\tJS_STATIC_PROP(charLimit, Field);\n\tJS_STATIC_PROP(comb, Field);\n\tJS_STATIC_PROP(commitOnSelChange, Field);\n\tJS_STATIC_PROP(currentValueIndices, Field);\n    JS_STATIC_PROP(defaultStyle, Field);\n\tJS_STATIC_PROP(defaultValue, Field);\n\tJS_STATIC_PROP(doNotScroll, Field);\n\tJS_STATIC_PROP(doNotSpellCheck, Field);\n\tJS_STATIC_PROP(delay, Field);\n\tJS_STATIC_PROP(display, Field);\n    JS_STATIC_PROP(doc, Field);\n\tJS_STATIC_PROP(editable, Field);\n\tJS_STATIC_PROP(exportValues, Field);\n\tJS_STATIC_PROP(fileSelect, Field);\n\tJS_STATIC_PROP(fillColor, Field);\n\tJS_STATIC_PROP(hidden, Field);\n    JS_STATIC_PROP(highlight, Field);\n\tJS_STATIC_PROP(lineWidth, Field);\n\tJS_STATIC_PROP(multiline, Field);\n\tJS_STATIC_PROP(multipleSelection, Field);\n\tJS_STATIC_PROP(name, Field);\n\tJS_STATIC_PROP(numItems, Field);\n    JS_STATIC_PROP(page, Field);\n\tJS_STATIC_PROP(password, Field);\n\tJS_STATIC_PROP(print, Field);\n\tJS_STATIC_PROP(radiosInUnison, Field);\n\tJS_STATIC_PROP(readonly, Field);\n\tJS_STATIC_PROP(rect, Field);\n    JS_STATIC_PROP(required, Field);\n\tJS_STATIC_PROP(richText, Field);\n\tJS_STATIC_PROP(richValue, Field);\n\tJS_STATIC_PROP(rotation, Field);\n\tJS_STATIC_PROP(strokeColor, Field);\n\tJS_STATIC_PROP(style, Field);\n\tJS_STATIC_PROP(submitName, Field);\n\tJS_STATIC_PROP(textColor, Field);\n\tJS_STATIC_PROP(textFont, Field);\n\tJS_STATIC_PROP(textSize, Field);\n\tJS_STATIC_PROP(type, Field);\n\tJS_STATIC_PROP(userName, Field);\n\tJS_STATIC_PROP(value, Field);\n\tJS_STATIC_PROP(valueAsString, Field);\n\tJS_STATIC_PROP(source, Field);\n\n\tJS_STATIC_METHOD(browseForFileToSubmit, Field);\n\tJS_STATIC_METHOD(buttonGetCaption, Field);\n\tJS_STATIC_METHOD(buttonGetIcon, Field);\n\tJS_STATIC_METHOD(buttonImportIcon, Field);\n\tJS_STATIC_METHOD(buttonSetCaption, Field);\n\tJS_STATIC_METHOD(buttonSetIcon, Field);\n\tJS_STATIC_METHOD(checkThisBox, Field);\n\tJS_STATIC_METHOD(clearItems, Field);\n \tJS_STATIC_METHOD(defaultIsChecked, Field);\n\tJS_STATIC_METHOD(deleteItemAt, Field);\n\tJS_STATIC_METHOD(getArray, Field);\n\tJS_STATIC_METHOD(getItemAt, Field);\n\tJS_STATIC_METHOD(getLock, Field);\n\tJS_STATIC_METHOD(insertItemAt, Field);\n\tJS_STATIC_METHOD(isBoxChecked, Field);\n\tJS_STATIC_METHOD(isDefaultChecked, Field);\n\tJS_STATIC_METHOD(setAction, Field);\n\tJS_STATIC_METHOD(setFocus, Field);\n\tJS_STATIC_METHOD(setItems, Field);\n\tJS_STATIC_METHOD(setLock, Field);\n\tJS_STATIC_METHOD(signatureGetModifications, Field);\n\tJS_STATIC_METHOD(signatureGetSeedValue, Field);\n\tJS_STATIC_METHOD(signatureInfo, Field);\n\tJS_STATIC_METHOD(signatureSetSeedValue, Field);\n\tJS_STATIC_METHOD(signatureSign, Field);\n\tJS_STATIC_METHOD(signatureValidate, Field);\n};\n\n#endif //_FIELD_H_\n\n"
  },
  {
    "path": "fpdfsdk/include/javascript/IJavaScript.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _IJAVASCRIPT_H_\n#define _IJAVASCRIPT_H_\n\nnamespace v8 {\nclass Platform;\n}\n\nclass IFXJS_Context  \n{\npublic:\n\tvirtual FX_BOOL\t\t\t\tCompile(const CFX_WideString& script, CFX_WideString& info) = 0;\n\tvirtual FX_BOOL\t\t\t\tRunScript(const CFX_WideString& script, CFX_WideString& info) = 0;\n\npublic:\n\tvirtual void\t\t\t\tOnApp_Init() = 0;\n\n\tvirtual void\t\t\t\tOnDoc_Open(CPDFSDK_Document* pDoc, const CFX_WideString& strTargetName) = 0;\n\tvirtual void\t\t\t\tOnDoc_WillPrint(CPDFSDK_Document* pDoc) = 0;\n\tvirtual void\t\t\t\tOnDoc_DidPrint(CPDFSDK_Document* pDoc) = 0;\n\tvirtual void\t\t\t\tOnDoc_WillSave(CPDFSDK_Document* pDoc) = 0;\n\tvirtual void\t\t\t\tOnDoc_DidSave(CPDFSDK_Document* pDoc) = 0;\n\tvirtual void\t\t\t\tOnDoc_WillClose(CPDFSDK_Document* pDoc) = 0;\n\n\tvirtual void\t\t\t\tOnPage_Open(CPDFSDK_Document* pTarget) = 0;\n\tvirtual void\t\t\t\tOnPage_Close(CPDFSDK_Document* pTarget) = 0;\n\tvirtual void\t\t\t\tOnPage_InView(CPDFSDK_Document* pTarget) = 0;\n\tvirtual void\t\t\t\tOnPage_OutView(CPDFSDK_Document* pTarget) = 0;\n\t\n\tvirtual void\t\t\t\tOnField_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget) = 0;\n\tvirtual void\t\t\t\tOnField_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget) = 0;\n\tvirtual void\t\t\t\tOnField_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget) = 0;\n\tvirtual void\t\t\t\tOnField_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget) = 0;\n\tvirtual void\t\t\t\tOnField_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, const CFX_WideString& Value) = 0;\n\tvirtual void\t\t\t\tOnField_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, const CFX_WideString& Value) = 0;\n\n\tvirtual void\t\t\t\tOnField_Calculate(CPDF_FormField* pSource, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL& bRc) = 0;\n\tvirtual void\t\t\t\tOnField_Format(int nCommitKey, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL bWillCommit) = 0;\n\tvirtual void\t\t\t\tOnField_Keystroke(int nCommitKey, CFX_WideString& strChange, const CFX_WideString& strChangeEx,\n\t\t\t\t\t\t\t\t\tFX_BOOL KeyDown, FX_BOOL bModifier, int &nSelEnd,int &nSelStart, FX_BOOL bShift,\n\t\t\t\t\t\t\t\t\tCPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL bWillCommit, \n\t\t\t\t\t\t\t\t\tFX_BOOL bFieldFull, FX_BOOL &bRc) = 0;\n\tvirtual void\t\t\t\tOnField_Validate(CFX_WideString& strChange, const CFX_WideString& strChangeEx, FX_BOOL bKeyDown,\n\t\t\t\t\t\t\t\t\tFX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL& bRc) = 0;\n\n\tvirtual void\t\t\t\tOnScreen_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;\n\tvirtual void\t\t\t\tOnScreen_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;\n\tvirtual void\t\t\t\tOnScreen_Open(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;\n\tvirtual void\t\t\t\tOnScreen_Close(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;\n\tvirtual void\t\t\t\tOnScreen_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;\n\tvirtual void\t\t\t\tOnScreen_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;\n\tvirtual void\t\t\t\tOnScreen_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;\n\tvirtual void\t\t\t\tOnScreen_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;\n\tvirtual void\t\t\t\tOnScreen_InView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;\n\tvirtual void\t\t\t\tOnScreen_OutView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;\n\n\tvirtual void\t\t\t\tOnBookmark_MouseUp(CPDF_Bookmark* pBookMark) = 0;\n\tvirtual void\t\t\t\tOnLink_MouseUp(CPDFSDK_Document* pTarget) = 0;\n\n\tvirtual void\t\t\t\tOnMenu_Exec(CPDFSDK_Document* pTarget, const CFX_WideString &) = 0;\n\tvirtual void\t\t\t\tOnBatchExec(CPDFSDK_Document* pTarget) = 0;\n\tvirtual void\t\t\t\tOnConsole_Exec() = 0;\n\tvirtual void\t\t\t\tOnExternal_Exec() = 0;\n\n\tvirtual void\t\t\t\tEnableMessageBox(FX_BOOL bEnable) = 0;\n};\n\nclass IFXJS_Runtime\n{\npublic:\n\tvirtual IFXJS_Context*\t\tNewContext() = 0;\n\tvirtual void\t\t\t\tReleaseContext(IFXJS_Context * pContext) = 0;\n\tvirtual IFXJS_Context*\t\tGetCurrentContext() = 0;\n\n\tvirtual void\t\t\t\tSetReaderDocument(CPDFSDK_Document* pReaderDoc) = 0;\n\tvirtual\tCPDFSDK_Document*\tGetReaderDocument() = 0;\t\n\n\tvirtual void\t\t\t\tGetObjectNames(CFX_WideStringArray& array) = 0;\n\tvirtual void\t\t\t\tGetObjectConsts(const CFX_WideString& swObjName, CFX_WideStringArray& array) = 0;\n\tvirtual void\t\t\t\tGetObjectProps(const CFX_WideString& swObjName, CFX_WideStringArray& array) = 0;\n\tvirtual void\t\t\t\tGetObjectMethods(const CFX_WideString& swObjName, CFX_WideStringArray& array) = 0;\n\n\tvirtual void\t\t\t\tExit() = 0;\n\tvirtual void\t\t\t\tEnter() = 0;\n\tvirtual FX_BOOL\t\t\t\tIsEntered() = 0;\n};\n\nclass CPDFDoc_Environment;\nclass CJS_GlobalData;\n\nclass CJS_RuntimeFactory\n{\npublic:\n\tCJS_RuntimeFactory():m_bInit(FALSE),m_nRef(0),m_pGlobalData(NULL),m_nGlobalDataCount(0),m_platform(NULL) {}\n\t~CJS_RuntimeFactory();\n\tIFXJS_Runtime*\t\t\t\t\tNewJSRuntime(CPDFDoc_Environment* pApp);\n\tvoid\t\t\t\t\t\t\tDeleteJSRuntime(IFXJS_Runtime* pRuntime);\n\tvoid\t\t\t\t\t\t\tAddRef();\n\tvoid\t\t\t\t\t\t\tRelease();\n\n\tCJS_GlobalData*\t\t\t\t\tNewGlobalData(CPDFDoc_Environment* pApp);\n\tvoid\t\t\t\t\t\t\tReleaseGlobalData();\nprivate:\n\tFX_BOOL m_bInit;\n\tint m_nRef;\n\tCJS_GlobalData*\t\t\t\t\tm_pGlobalData;\n\tFX_INT32\t\t\t\t\t\tm_nGlobalDataCount;\n        v8::Platform*\t\t\t\t\t\tm_platform;\n};\n\n#endif //_IJAVASCRIPT_H_\n\n"
  },
  {
    "path": "fpdfsdk/include/javascript/Icon.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _ICON_H_\n#define _ICON_H_\n\nclass Icon : public CJS_EmbedObj\n{\npublic:\n\tIcon(CJS_Object* pJSObject);\n\tvirtual ~Icon();\n\npublic:\n\tFX_BOOL name(OBJ_PROP_PARAMS);\n\t\npublic:\n\tvoid\t\t\t\tSetStream(CPDF_Stream* pIconStream);\n\tCPDF_Stream*\t\tGetStream();\n\tvoid\t\t\t\tSetIconName(CFX_WideString name);\n\tCFX_WideString\t\tGetIconName();\nprivate:\n\tCPDF_Stream*\t\tm_pIconStream;\n\tCFX_WideString\t\tm_swIconName;\n};\n\nclass CJS_Icon : public CJS_Object\n{\npublic:\n\tCJS_Icon(JSFXObject pObject) : CJS_Object(pObject){};\n\tvirtual ~CJS_Icon(){};\n\npublic:\n\tDECLARE_JS_CLASS(CJS_Icon);\n\n\tJS_STATIC_PROP(name, Icon);\n};\n\n#endif //_ICON_H_\n\n"
  },
  {
    "path": "fpdfsdk/include/javascript/JS_Console.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JS_CONSOLE_H_\n#define _JS_CONSOLE_H_\n\n#include \"../res/resource.h\"\n\n#define WST_NONE\t\t0x00\t\t\t\t\t// No size changed\n#define WST_LEFT\t\t0x01\t\t\t\t\t// size to left\n#define WST_TOP\t\t\t0x02\t\t\t\t\t// size to top\n#define WST_RIGHT\t\t0x04\t\t\t\t\t// size to right\n#define WST_BOTTOM\t\t0x08\t\t\t\t\t// size to bottom\n#define WST_TOPLEFT\t\t(WST_TOP|WST_LEFT)\t\t// size to top & left\n#define WST_TOPRIGHT\t(WST_TOP|WST_RIGHT)\t\t// size to top & right\n#define WST_BOTTOMRIGHT\t(WST_BOTTOM|WST_RIGHT)\t// size to bottom & right\n#define WST_BOTTOMLEFT\t(WST_BOTTOM|WST_LEFT)\t// size to bottom & right\n\n#ifndef IDC_DLGSIZEBOX\n#define IDC_DLGSIZEBOX  50\n#endif\t/* IDC_DLGSIZEBOX */\n\nenum { m_idSizeIcon = IDC_DLGSIZEBOX };\nenum {\t\t\t\t// possible Control reSize Type\n\tCST_NONE = 0,\n\tCST_RESIZE,\t\t// NOMOVE + SIZE, add all delta-size of dlg to control\n\tCST_REPOS,\t\t// MOVE(absolutely) + NOSIZE, move control's pos by delta-size\n\tCST_RELATIVE,\t// MOVE(proportional)  + NOSIZE, keep control always at a relative pos\n\tCST_ZOOM,\t\t// MOVE + SIZE (both are automatically proportional)\n\tCST_DELTA_ZOOM\t// MOVE(proportional, set manually) + SIZE(proportional, set manuall)\n};\n\n// contained class to hold item state\n//\nclass CJS_ItemCtrl\n{\npublic:\n\tUINT\tm_nID;\n\tUINT\tm_stxLeft  \t   : 4;\t\t\t// when left resizing ...\n\tUINT\tm_stxRight     : 4;\t\t\t// when right resizing ...\n\tUINT\tm_styTop   \t   : 4;\t\t\t// when top resizing ...\n\tUINT\tm_styBottom    : 4;\t\t\t// when bottom resizing ...\n\tUINT\tm_bFlickerFree : 1;\n\tUINT\tm_bInvalidate  : 1;\t\t\t// Invalidate ctrl's rect(eg. no-automatical update for static when resize+move)\n\tUINT\tm_r0\t\t   : 14;\n\tCRect\tm_wRect;\n\tdouble\tm_xRatio, m_cxRatio;\n\tdouble\tm_yRatio, m_cyRatio;\n\nprotected:\n\tvoid Assign(const CJS_ItemCtrl& src);\n\npublic:\n\tCJS_ItemCtrl();\n\tCJS_ItemCtrl(const CJS_ItemCtrl& src);\n\n\tHDWP OnSize(HDWP hdwp, int sizeType, CRect *pnCltRect, CRect *poCltRect, CRect *pR0, CWnd *pDlg);\n\n\tCJS_ItemCtrl& operator=(const CJS_ItemCtrl& src);\n};\n\nclass CJS_ResizeDlg : public CDialog\n{\n//\tDECLARE_DYNAMIC(CJS_ResizeDlg)\npublic:\n\tCJS_ResizeDlg(UINT nID,CWnd *pParentWnd = NULL);\n\tvirtual ~CJS_ResizeDlg();\n\n\npublic:\n\tstd::vector<CJS_ItemCtrl>\tm_Items;           // array of controlled items\n\tCRect\t\t\t\t\tm_cltRect, m_cltR0;\n\tint\t\t\t\t\t\tm_xMin, m_yMin;\n\tint\t\t\t\t\t\tm_xSt,  m_ySt;\t\t//step?\n\tUINT\t\t\t\t\tm_nDelaySide;\t\t//drag side of window\n\tCStatic\t\t\t\t\tm_wndSizeIcon;     // size icon window\n\nprotected:\n\tvoid \t\t\t\t\tAddControl( UINT nID, int xl, int xr, int yt, int yb, int bFlickerFree = 0, \n\t\t\t\t\t\t\t\t\t    double xRatio = -1.0, double cxRatio = -1.0,\n\t\t\t\t\t\t\t\t\t    double yRatio = -1.0, double cyRatio = -1.0 );\n\tvoid \t\t\t\t\tAllowSizing(int xst, int yst);\n\tvoid \t\t\t\t\tHideSizeIcon(void);\t\n\tvirtual BOOL\t\t\tOnInitDialog();\n\n\tvoid\t\t\t\t\tOnSizing(UINT nSide, LPRECT lpRect);\n\tvoid\t\t\t\t\tOnSize(UINT nType, int cx, int cy);\n\tvoid\t\t\t\t\tOnGetMinMaxInfo(MINMAXINFO *pmmi);\n\tBOOL\t\t\t\t\tOnEraseBkgnd(CDC* pDC);\n\npublic:\n\tint\t\t\t\t\t\tUpdateControlRect(UINT nID, CRect *pnr);\n};\n\n\n//------------------------CIconListBox for CWndElementList-------------------------------------\n\nclass CIconListBox : public CListBox\n{\npublic:\n\tCIconListBox();\n\tvirtual ~CIconListBox();\n\npublic:\n\tint\t\t\t\tInsertString(int nIndex, LPCWSTR lpszItem , int nImage);\n\tvirtual\tvoid\tResetContent();\n\tvirtual void\tGetText(int nIndex, CString& rString);\n\n\tvirtual void\tDrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);\n\tvoid\t\t\tMeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);\n\tint\t\t\t\tCompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct);\n\nprotected:\n\t// Generated message map functions\n\t//{{AFX_MSG(CIconListBox)\n\tafx_msg void OnMouseMove(UINT nFlags, CPoint point);\n\t//}}AFX_MSG\t\n\tDECLARE_MESSAGE_MAP()\n\nprotected:\n\tstruct ItemDatas \n\t{\n\t\tCString\tcsText;\n\t\tint\t\tnImage;\n\t};\n};\n//----------------------------------CWndElementList--------------------------------------------\n#define IDC_LIST_JS_ELEMENT 10070\n\n#define ELEMENT_LIST_WIDTH 140\n#define ELEMENT_LIST_HEIGHT 180\n#define ELEMENT_LIST_TOP_OFFSET 13\n\n#define ELEMENT_TYPE_NAME\t0\n#define ELEMENT_TYPE_CONST\t1\n#define ELEMENT_TYPE_FUN\t2\n#define ELEMENT_TYPE_PRO\t3\n\nclass CWndElementList : public CWnd\n{\npublic:\n\tCWndElementList();\n\tvirtual ~CWndElementList();\n\t\npublic:\n\tvirtual void\tOnSize(UINT nType, int cx, int cy);\n\tvirtual BOOL\tCreate(CWnd* pParentWnd);\n\tvirtual BOOL\tShowWindow(int nCmdShow);\n\tvoid\t\t\tRemoveAllElement();\n\tvoid\t\t\tSetElementList(LPCWSTR* pElement, int* pType ,  int iCount);\n\tvoid\t\t\tAddElement(CFX_WideString csValue , int nType);\n\tBOOL\t\t\tGetElementSel(CString &csElement);\n\tBOOL\t\t\tSelectNext();\n\tBOOL\t\t\tSelectPrevious();\n\tBOOL\t\t\tSelectFirst();\n\tBOOL\t\t\tSelectLast();\n\tBOOL\t\t\tSelectNextPage();\n\tBOOL\t\t\tSelectPreviousPage();\n\tint\t\t\t\tGetListHeight();\n\t\nprotected:\n\t// Generated message map functions\n\t//{{AFX_MSG(CWndElementList)\n\tafx_msg void OnPaint();\n\tafx_msg BOOL OnNcActivate(BOOL bActive);\n\tafx_msg void OnSelJSElement();\n\tafx_msg void OnDblclkJSElement();\n\tafx_msg void OnDestroy();\n\t//}}AFX_MSG\t\n\tDECLARE_MESSAGE_MAP()\nprotected:\n\tCIconListBox\tm_ListBox;\n\tBOOL\t\t\tm_bBlock;\n};\n\n///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// CJS_ConsoleDlg Ի\nclass CJS_ConsoleDlg : public CJS_ResizeDlg\n{\n\tDECLARE_DYNAMIC(CJS_ConsoleDlg)\n\npublic:\n\tCJS_ConsoleDlg(CReader_App* pApp, CWnd* pParent);\t\n\tvirtual ~CJS_ConsoleDlg();\n\n\tenum { IDD = IDD_JS_CONSOLE };\n\n\tvoid\t\t\t\tCreate();\n\n\tvoid\t\t\t\tAppendConsoleText(const CFX_WideString& swText);\n\tvoid\t\t\t\tSetConsoleText(const CFX_WideString& swText);\n\tCFX_WideString\t\tGetConsoleText() const;\n\tCFX_WideString\t\tGetScriptText() const;\n\n\tBOOL\t\t\t\tResetElementList(LPCWSTR lpstrRef);\n\tIFXJS_Runtime*\t\tGetJSRuntime();\n\nprotected:\n\tvirtual void\t\tDoDataExchange(CDataExchange* pDX);\t// DDX/DDV ֧\n\nprotected:\n\tvirtual BOOL\t\tOnInitDialog();\t\n\tvirtual void\t\tOnCancel();\n\n\tvirtual BOOL\t\tPreTranslateMessage(MSG* pMsg);\n\nprotected:\n\t// Generated message map functions\n\t//{{AFX_MSG(CJS_ConsoleDlg)\n\tafx_msg void OnBnClickedClear();\n\tafx_msg void OnBnClickedOk();\n\tafx_msg void OnBnClickTips();\n\tafx_msg void OnSizing(UINT nSide, LPRECT lpRect);\n\tafx_msg void OnSize(UINT nType, int cx, int cy);\n\tafx_msg void OnGetMinMaxInfo(MINMAXINFO *pmmi);\n\tafx_msg BOOL OnEraseBkgnd(CDC* pDC);\n\tafx_msg void OnShowWindow(BOOL bShow, UINT nStatus);\n\n\tafx_msg void OnLButtonDown(UINT nFlags, CPoint point);\n\tafx_msg void OnChangeScriptEdit(WPARAM wParam , LPARAM lParam);\n\tafx_msg void OnMove(int x , int y);\n\tpublic:\n\tvirtual int\tDoModal();\t\n\t//}}AFX_MSG\n\tDECLARE_MESSAGE_MAP()\n\npublic:\n\tCGW_LineNumberEdit\t\t\tm_edtSC;\n\tBOOL\t\t\t\t\t\tm_bTips;\n\tconst UINT\t\t\t\t\tm_uTextlimited;\n\tFX_HGLOBAL\t\t\t\t\tm_hGlobal;\n\tCReader_App *\t\t\t\tm_pApp;\n\tCWndElementList\t\t\t\tm_WndElementList;\n};\n\n#endif //_JS_CONSOLE_H_"
  },
  {
    "path": "fpdfsdk/include/javascript/JS_Context.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JS_CONTEXT_H_\n#define _JS_CONTEXT_H_\n\nclass CJS_EventHandler;\nclass CJS_Runtime;\n\nclass CJS_Context : public IFXJS_Context\n{\npublic:\n\tCJS_Context(CJS_Runtime* pRuntime);\n\tvirtual ~CJS_Context();\n\npublic:\n\tvirtual FX_BOOL\t\t\t\tCompile(const CFX_WideString& script, CFX_WideString& info);\n\tvirtual FX_BOOL\t\t\t\tRunScript(const CFX_WideString& script, CFX_WideString& info);\n\npublic:\n\tvirtual void\t\t\t\tOnApp_Init();\n\n\tvirtual void\t\t\t\tOnDoc_Open(CPDFSDK_Document* pDoc, const CFX_WideString& strTargetName);\n\tvirtual void\t\t\t\tOnDoc_WillPrint(CPDFSDK_Document* pDoc);\n\tvirtual void\t\t\t\tOnDoc_DidPrint(CPDFSDK_Document* pDoc);\n\tvirtual void\t\t\t\tOnDoc_WillSave(CPDFSDK_Document* pDoc);\n\tvirtual void\t\t\t\tOnDoc_DidSave(CPDFSDK_Document* pDoc);\n\tvirtual void\t\t\t\tOnDoc_WillClose(CPDFSDK_Document* pDoc);\n\n\tvirtual void\t\t\t\tOnPage_Open(CPDFSDK_Document* pTarget);\n\tvirtual void\t\t\t\tOnPage_Close(CPDFSDK_Document* pTarget);\n\tvirtual void\t\t\t\tOnPage_InView(CPDFSDK_Document* pTarget);\n\tvirtual void\t\t\t\tOnPage_OutView(CPDFSDK_Document* pTarget);\n\t\n\tvirtual void\t\t\t\tOnField_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget);\n\tvirtual void\t\t\t\tOnField_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget);\n\tvirtual void\t\t\t\tOnField_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget);\n\tvirtual void\t\t\t\tOnField_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget);\n\tvirtual void\t\t\t\tOnField_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, const CFX_WideString& Value);\n\tvirtual void\t\t\t\tOnField_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, const CFX_WideString& Value);\n\n\tvirtual void\t\t\t\tOnField_Calculate(CPDF_FormField* pSource, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL& bRc);\n\tvirtual void\t\t\t\tOnField_Format(int nCommitKey, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL bWillCommit);\n\tvirtual void\t\t\t\tOnField_Keystroke(int nCommitKey, CFX_WideString& strChange, const CFX_WideString& strChangeEx,\n\t\t\t\t\t\t\t\t\tFX_BOOL bKeyDown, FX_BOOL bModifier, int &nSelEnd,int &nSelStart, FX_BOOL bShift,\n\t\t\t\t\t\t\t\t\tCPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL bWillCommit, \n\t\t\t\t\t\t\t\t\tFX_BOOL bFieldFull, FX_BOOL &bRc);\n\tvirtual void\t\t\t\tOnField_Validate(CFX_WideString& strChange, const CFX_WideString& strChangeEx, FX_BOOL bKeyDown,\n\t\t\t\t\t\t\t\t\tFX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL& bRc);\n\n\tvirtual void\t\t\t\tOnScreen_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);\n\tvirtual void\t\t\t\tOnScreen_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);\n\tvirtual void\t\t\t\tOnScreen_Open(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);\n\tvirtual void\t\t\t\tOnScreen_Close(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);\n\tvirtual void\t\t\t\tOnScreen_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);\n\tvirtual void\t\t\t\tOnScreen_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);\n\tvirtual void\t\t\t\tOnScreen_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);\n\tvirtual void\t\t\t\tOnScreen_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);\n\tvirtual void\t\t\t\tOnScreen_InView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);\n\tvirtual void\t\t\t\tOnScreen_OutView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);\n\n\tvirtual void\t\t\t\tOnBookmark_MouseUp(CPDF_Bookmark* pBookMark);\n\tvirtual void\t\t\t\tOnLink_MouseUp(CPDFSDK_Document* pTarget);\n\n\tvirtual void\t\t\t\tOnMenu_Exec(CPDFSDK_Document* pTarget, const CFX_WideString& strTargetName);\n\tvirtual void\t\t\t\tOnBatchExec(CPDFSDK_Document* pTarget);\n\tvirtual void\t\t\t\tOnConsole_Exec();\n\tvirtual void\t\t\t\tOnExternal_Exec();\n\n\tvirtual void\t\t\t\tEnableMessageBox(FX_BOOL bEnable) {m_bMsgBoxEnable = bEnable;}\n\tFX_BOOL\t\t\t\t\t\tIsMsgBoxEnabled() const {return m_bMsgBoxEnable;}\n\npublic:\n\tCPDFDoc_Environment*\t\t\tGetReaderApp();\n\tCJS_Runtime*\t\t\t\tGetJSRuntime(){return m_pRuntime;}\n\n\tFX_BOOL\t\t\t\t\t\tDoJob(int nMode, const CFX_WideString& script, CFX_WideString& info);\n\n\tCJS_EventHandler*\t\t\tGetEventHandler(){return m_pEventHandler;};\t\n\tCPDFSDK_Document*\t\t\tGetReaderDocument();\n\nprivate:\n\tCJS_Runtime*\t\t\t\tm_pRuntime;\t\n\tCJS_EventHandler*\t\t\tm_pEventHandler;\t\n\n\tFX_BOOL\t\t\t\t\t\tm_bBusy;\t\n\tFX_BOOL\t\t\t\t\t\tm_bMsgBoxEnable;\n};\n\n// static CFX_WideString JSGetStringFromID(CJS_Context* pContext, UINT ID)\n// {\n// \tASSERT(pContext != NULL);\n// \n// \treturn JS_LoadString(pContext->GetReaderApp(), ID);\n// }\n\n#endif //_JS_CONTEXT_H_\n\n"
  },
  {
    "path": "fpdfsdk/include/javascript/JS_Define.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JS_DEFINE_H_\n#define _JS_DEFINE_H_\n\ntypedef v8::Value\t\t\tJSValue;\ntypedef v8::Handle<v8::Object>\tJSObject;\ntypedef v8::Handle<v8::Object>\tJSFXObject;\ntypedef unsigned\t\tJSBool;\n\nstruct JSConstSpec\n{\n\tconst wchar_t* pName;\n\tdouble number;\n\tconst wchar_t* string;\n\tFX_BYTE t; //0:double 1:str\n};\n\nstruct JSPropertySpec\n{\n\tconst wchar_t* pName;\n\tv8::AccessorGetterCallback pPropGet;\n\tv8::AccessorSetterCallback pPropPut;\n};\n\nstruct JSMethodSpec\n{\n\tconst wchar_t* pName;\n\tv8::FunctionCallback pMethodCall;\n\tunsigned nParamNum;\n};\n\ntypedef CFX_WideString\tJS_ErrorString;\n\n#define JS_TRUE\t\t\t(unsigned)1\n#define JS_FALSE\t\t(unsigned)0\n\n\n#define CJS_PointsArray\t\tCFX_ArrayTemplate<float>\n#define CJS_IntArray\t\tCFX_ArrayTemplate<int>\n\n/* ====================================== PUBLIC DEFINE SPEC ============================================== */\n#define JS_WIDESTRING(widestring) L###widestring\n\n#define OBJ_PROP_PARAMS\t\t\tIFXJS_Context* cc, CJS_PropValue& vp, JS_ErrorString& sError\n#define OBJ_METHOD_PARAMS\t\tIFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, JS_ErrorString& sError\n#define BEGIN_JS_STATIC_CONST(js_class_name) JSConstSpec js_class_name::JS_Class_Consts[] = {\n#define JS_STATIC_CONST_ENTRY_NUMBER(const_name, pValue) {JS_WIDESTRING(const_name), pValue, L\"\", 0},\n#define JS_STATIC_CONST_ENTRY_STRING(const_name, pValue) {JS_WIDESTRING(const_name), 0, JS_WIDESTRING(pValue), 1},\n#define END_JS_STATIC_CONST() {0, 0, 0, 0}};\n\n#define BEGIN_JS_STATIC_PROP(js_class_name) JSPropertySpec js_class_name::JS_Class_Properties[] = {\n#define JS_STATIC_PROP_ENTRY(prop_name) {JS_WIDESTRING(prop_name), get_##prop_name##_static, set_##prop_name##_static},\n#define END_JS_STATIC_PROP() {0, 0, 0}};\n\n#define BEGIN_JS_STATIC_METHOD(js_class_name) JSMethodSpec js_class_name::JS_Class_Methods[] = {\n#define JS_STATIC_METHOD_ENTRY(method_name, nargs) {JS_WIDESTRING(method_name), method_name##_static, nargs},\n#define END_JS_STATIC_METHOD() {0, 0, 0}};\n#define MEMLEAKCHECK_1() ((void)0)\n#define MEMLEAKCHECK_2(main_name, sub_name) ((void)0)\n\n\n/*\n#ifdef _DEBUG\n#define MEMLEAKCHECK_1() \\\n\t_CrtMemState state1;\\\n\t_CrtMemCheckpoint(&state1);\n\n#define MEMLEAKCHECK_2(main_name,sub_name) \\\n\t_CrtMemState state2;\\\n\t_CrtMemCheckpoint(&state2);\\\n\t_CrtMemState diff;\\\n\t_CrtMemDifference(&diff,&state1,&state2);\\\n\tif (diff.lSizes[_NORMAL_BLOCK] > 0)\\\n\t{\\\n\t\tTRACE(\"Detected normal block memory leaks in JS Module! [%s.%s]\\n\",#main_name,#sub_name);\\\n\t\t_CrtMemDumpStatistics(&diff);\\\n\t}\n#else\n\t#define MEMLEAKCHECK_1() ((void)0)\n\t#define MEMLEAKCHECK_2(main_name,sub_name) ((void)0)\n#endif\n*/\n\n/* ======================================== PROP CALLBACK ============================================ */\n\n#define JS_STATIC_PROP_GET(prop_name, class_name)\\\n\tstatic void get_##prop_name##_static(JS_PROPGET_ARGS)\\\n{\\\n\tv8::Isolate* isolate = info.GetIsolate();\\\n\tv8::Local<v8::Context> context = isolate->GetCurrentContext();\\\n\tv8::Local<v8::Value> v = context->GetEmbedderData(1);\\\n\tASSERT(!v.IsEmpty());\\\n\tif(v.IsEmpty()) return;\\\n\tv8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);\\\n\tIFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\\\n\tIFXJS_Context* cc = pRuntime->GetCurrentContext();\\\n\tCJS_PropValue value(isolate);\\\n\tvalue.StartGetting();\\\n\tCJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\\\n\tASSERT(pJSObj != NULL);\\\n\tclass_name* pObj = (class_name*)pJSObj->GetEmbedObject();\\\n\tASSERT(pObj != NULL);\\\n\tJS_ErrorString sError;\\\n\tFX_BOOL bRet = FALSE;\\\n\ttry\\\n\t{\\\n\t\tMEMLEAKCHECK_1();\\\n\t\tbRet = pObj->prop_name(cc, value, sError);\\\n\t\tMEMLEAKCHECK_2(class_name, prop_name);\\\n\t}\\\n\tcatch (...)\\\n\t{\\\n\t\tCFX_ByteString cbName;\\\n\t\tcbName.Format(\"%s.%s\", #class_name, #prop_name);\\\n\t\tJS_Error(NULL,CFX_WideString::FromLocal(cbName), L\"Unknown error is catched!\");\\\n\t\treturn ;\\\n\t}\\\n\tif (bRet)\\\n\t{\\\n\t\tinfo.GetReturnValue().Set((v8::Handle<v8::Value>)value);\\\n\t\treturn ;\\\n\t}\\\n\telse\\\n\t{\\\n\tCFX_ByteString cbName;\\\n\t\tcbName.Format(\"%s.%s\", #class_name, #prop_name);\\\n\t\tJS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\\\n\t\treturn ;\\\n\t}\\\n}\n\n#define JS_STATIC_PROP_SET(prop_name, class_name)\\\n\tstatic void set_##prop_name##_static(JS_PROPPUT_ARGS)\\\n{\\\n\tv8::Isolate* isolate = info.GetIsolate();\\\n\tv8::Local<v8::Context> context = isolate->GetCurrentContext();\\\n\tv8::Local<v8::Value> v = context->GetEmbedderData(1);\\\n\tASSERT(!v.IsEmpty());\\\n\tif(v.IsEmpty()) return;\\\n\tv8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);\\\n\tIFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\\\n\tIFXJS_Context* cc = pRuntime->GetCurrentContext();\\\n\tCJS_PropValue propValue(CJS_Value(isolate,value,VT_unknown));\\\n\tpropValue.StartSetting();\\\n\tCJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\\\n\tASSERT(pJSObj != NULL);\\\n\tclass_name* pObj = (class_name*)pJSObj->GetEmbedObject();\\\n\tASSERT(pObj != NULL);\\\n\tJS_ErrorString sError;\\\n\tFX_BOOL bRet = FALSE;\\\n\ttry\\\n\t{\\\n\t\tMEMLEAKCHECK_1();\\\n\t\tbRet = pObj->prop_name(cc, propValue, sError);\\\n\t\tMEMLEAKCHECK_2(class_name, prop_name);\\\n\t}\\\n\tcatch (...)\\\n\t{\\\n\t\tCFX_ByteString cbName;\\\n\t\tcbName.Format(\"%s.%s\", #class_name, #prop_name);\\\n\t\tJS_Error(NULL,CFX_WideString::FromLocal(cbName), L\"Unknown error is catched!\");\\\n\t\treturn ;\\\n\t}\\\n\tif (bRet)\\\n\t{\\\n\t\treturn ;\\\n\t}\\\n\telse\\\n\t{\\\n\t\tCFX_ByteString cbName;\\\n\t\tcbName.Format(\"%s.%s\", #class_name, #prop_name);\\\n\t\tJS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\\\n\t\treturn ;\\\n\t}\\\n}\n\n#define JS_STATIC_PROP(prop_name, class_name)\\\nJS_STATIC_PROP_GET(prop_name, class_name);\\\nJS_STATIC_PROP_SET(prop_name, class_name)\n\n/* ========================================= METHOD CALLBACK =========================================== */\n\n#define JS_STATIC_METHOD(method_name, class_name)\\\n\tstatic void method_name##_static(JS_METHOD_ARGS)\\\n{\\\n\tv8::Isolate* isolate = info.GetIsolate();\\\n\tv8::Local<v8::Context> context = isolate->GetCurrentContext();\\\n\tv8::Local<v8::Value> v = context->GetEmbedderData(1);\\\n\tASSERT(!v.IsEmpty());\\\n\tif(v.IsEmpty()) return;\\\n\tv8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);\\\n\tIFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\\\n\tIFXJS_Context* cc = pRuntime->GetCurrentContext();\\\n\tCJS_Parameters parameters;\\\n\tfor (unsigned int i = 0; i<(unsigned int)info.Length(); i++)\\\n    {\\\n\t\tparameters.push_back(CJS_Value(isolate, info[i], VT_unknown));\\\n\t}\\\n\tCJS_Value valueRes(isolate);\\\n\tCJS_Object* pJSObj = (CJS_Object *)JS_GetPrivate(isolate,info.Holder());\\\n\tASSERT(pJSObj != NULL);\\\n\tclass_name* pObj = (class_name*)pJSObj->GetEmbedObject();\\\n\tASSERT(pObj != NULL);\\\n\tJS_ErrorString sError;\\\n\tFX_BOOL bRet = FALSE;\\\n\ttry\\\n\t{\\\n\t\tMEMLEAKCHECK_1();\\\n\t\tbRet = pObj->method_name(cc, parameters, valueRes, sError);\\\n\t\tMEMLEAKCHECK_2(class_name, method_name);\\\n\t}\\\n\tcatch (...)\\\n\t{\\\n\t\tCFX_ByteString cbName;\\\n\t\tcbName.Format(\"%s.%s\", #class_name, #method_name);\\\n\t\tJS_Error(NULL, CFX_WideString::FromLocal(cbName), L\"Unknown error is catched!\");\\\n\t\treturn ;\\\n\t}\\\n\tif (bRet)\\\n\t{\\\n\t\tinfo.GetReturnValue().Set(valueRes.ToJSValue());\\\n\t\treturn ;\\\n\t}\\\n\telse\\\n\t{\\\n\t\tCFX_ByteString cbName;\\\n\t\tcbName.Format(\"%s.%s\", #class_name, #method_name);\\\n\t\tJS_Error(NULL, CFX_WideString::FromLocal(cbName), sError);\\\n\t\treturn ;\\\n\t}\\\n}\n\n/* ===================================== JS CLASS =============================================== */\n\n#define DECLARE_JS_CLASS(js_class_name) \\\n\tstatic JSBool JSConstructor(IFXJS_Context* cc, JSFXObject obj,JSFXObject global);\\\n\tstatic JSBool JSDestructor(JSFXObject obj);\\\n\tstatic int Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType);\\\n\tstatic void GetConsts(JSConstSpec*& pConsts, int& nSize);\\\n\tstatic void GetProperties(JSPropertySpec*& pProperties, int& nSize);\\\n\tstatic void GetMethods(JSMethodSpec*& pMethods, int& nSize);\\\n\tstatic JSConstSpec JS_Class_Consts[];\\\n\tstatic JSPropertySpec JS_Class_Properties[];\\\n\tstatic JSMethodSpec\tJS_Class_Methods[];\\\n\tstatic const wchar_t* m_pClassName\n\n#define IMPLEMENT_JS_CLASS_RICH(js_class_name, class_alternate, class_name) \\\nconst wchar_t* js_class_name::m_pClassName = JS_WIDESTRING(class_name);\\\nJSBool js_class_name::JSConstructor(IFXJS_Context* cc, JSFXObject obj, JSFXObject global)\\\n{\\\n\tCJS_Object* pObj = FX_NEW js_class_name(obj);\\\n\tpObj->SetEmbedObject(FX_NEW class_alternate(pObj));\\\n\tJS_SetPrivate(NULL,obj,(void*)pObj); \\\n\tpObj->InitInstance(cc);\\\n\treturn JS_TRUE;\\\n}\\\n\\\nJSBool js_class_name::JSDestructor(JSFXObject obj) \\\n{\\\n\tjs_class_name* pObj = (js_class_name*)JS_GetPrivate(NULL,obj);\\\n\tASSERT(pObj != NULL);\\\n\tpObj->ExitInstance();\\\n\tdelete pObj;\\\n\treturn JS_TRUE;\\\n}\\\n\\\nint js_class_name::Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType)\\\n{\\\n\tint nObjDefnID = JS_DefineObj(pRuntime, js_class_name::m_pClassName, eObjType, JSConstructor, JSDestructor, 0);\\\n\tif (nObjDefnID >= 0)\\\n\t{\\\n\t\tfor (int j=0, szj=sizeof(JS_Class_Properties)/sizeof(JSPropertySpec)-1; j<szj; j++)\\\n\t\t{\\\n\t\t\tif (JS_DefineObjProperty(pRuntime, nObjDefnID, JS_Class_Properties[j].pName, JS_Class_Properties[j].pPropGet, JS_Class_Properties[j].pPropPut) < 0) return -1;\\\n\t\t}\\\n\t\tfor (int k=0, szk=sizeof(JS_Class_Methods)/sizeof(JSMethodSpec)-1; k<szk; k++)\\\n\t\t{\\\n\t\t\tif (JS_DefineObjMethod(pRuntime, nObjDefnID,JS_Class_Methods[k].pName, JS_Class_Methods[k].pMethodCall, JS_Class_Methods[k].nParamNum) < 0) return -1;\\\n\t\t}\\\n\t\treturn nObjDefnID;\\\n\t}\\\n\treturn -1;\\\n}\\\nvoid js_class_name::GetConsts(JSConstSpec*& pConsts, int& nSize)\\\n{\\\n\tpConsts = JS_Class_Consts;\\\n\tnSize = sizeof(JS_Class_Consts) / sizeof(JSConstSpec) - 1;\\\n}\\\nvoid js_class_name::GetProperties(JSPropertySpec*& pProperties, int& nSize)\\\n{\\\n\tpProperties = JS_Class_Properties;\\\n\tnSize = sizeof(JS_Class_Properties) / sizeof(JSPropertySpec) - 1;\\\n}\\\nvoid js_class_name::GetMethods(JSMethodSpec*& pMethods, int& nSize)\\\n{\\\n\tpMethods = JS_Class_Methods;\\\n\tnSize = sizeof(JS_Class_Methods) / sizeof(JSMethodSpec) - 1;\\\n}\n\n#define IMPLEMENT_JS_CLASS(js_class_name, class_name) IMPLEMENT_JS_CLASS_RICH(js_class_name, class_name, class_name)\n\n/* ======================================== CONST CLASS ============================================ */\n\n#define DECLARE_JS_CLASS_CONST() \\\n\tstatic int Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType);\\\n\tstatic void GetConsts(JSConstSpec*& pConsts, int& nSize);\\\n\tstatic JSConstSpec JS_Class_Consts[];\\\n\tstatic const wchar_t* m_pClassName\n\n#define IMPLEMENT_JS_CLASS_CONST(js_class_name, class_name) \\\nconst wchar_t* js_class_name::m_pClassName = JS_WIDESTRING(class_name);\\\nint js_class_name::Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType)\\\n{\\\n\tint nObjDefnID = JS_DefineObj(pRuntime, js_class_name::m_pClassName, eObjType, NULL, NULL, 0);\\\n\tif (nObjDefnID >=0)\\\n\t{\\\n\t\tfor (int i=0, sz=sizeof(JS_Class_Consts)/sizeof(JSConstSpec)-1; i<sz; i++)\\\n\t\t{\\\n\t\t\tif (JS_Class_Consts[i].t == 0)\\\n\t\t\t{\\\n\t\t\t\tif (JS_DefineObjConst(pRuntime, nObjDefnID, JS_Class_Consts[i].pName, JS_NewNumber(pRuntime,JS_Class_Consts[i].number)) < 0) return -1;\\\n\t\t\t}\\\n\t\t\telse\\\n\t\t\t{\\\n\t\t\tif (JS_DefineObjConst(pRuntime, nObjDefnID, JS_Class_Consts[i].pName, JS_NewString(pRuntime,JS_Class_Consts[i].string)) < 0) return -1;\\\n\t\t\t}\\\n\t\t}\\\n\t\treturn nObjDefnID;\\\n\t}\\\n\treturn -1;\\\n}\\\nvoid js_class_name::GetConsts(JSConstSpec*& pConsts, int& nSize)\\\n{\\\n\tpConsts = JS_Class_Consts;\\\n\tnSize = sizeof(JS_Class_Consts)/sizeof(JSConstSpec)-1;\\\n}\n\n/* ===================================== SPECIAL JS CLASS =============================================== */\n\n#define DECLARE_SPECIAL_JS_CLASS(js_class_name) \\\n\tstatic JSBool JSConstructor(IFXJS_Context* cc, JSFXObject obj, JSFXObject global);\\\n\tstatic JSBool JSDestructor(JSFXObject obj);\\\n\tstatic void GetConsts(JSConstSpec*& pConsts, int& nSize);\\\n\tstatic void GetProperties(JSPropertySpec*& pProperties, int& nSize);\\\n\tstatic void GetMethods(JSMethodSpec*& pMethods, int& nSize);\\\n\tstatic JSConstSpec JS_Class_Consts[];\\\n\tstatic JSPropertySpec JS_Class_Properties[];\\\n\tstatic JSMethodSpec\tJS_Class_Methods[];\\\n\tstatic int Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType);\\\n\tstatic const wchar_t* m_pClassName;\\\n\tstatic void queryprop_##js_class_name##_static(JS_PROPQUERY_ARGS);\\\n\tstatic void getprop_##js_class_name##_static(JS_NAMED_PROPGET_ARGS);\\\n\tstatic void putprop_##js_class_name##_static(JS_NAMED_PROPPUT_ARGS);\\\n\tstatic void delprop_##js_class_name##_static(JS_PROPDEL_ARGS)\n\n#define IMPLEMENT_SPECIAL_JS_CLASS(js_class_name, class_alternate, class_name) \\\nconst wchar_t * js_class_name::m_pClassName = JS_WIDESTRING(class_name);\\\n\tvoid js_class_name::queryprop_##js_class_name##_static(JS_PROPQUERY_ARGS)\\\n{\\\n\tv8::Isolate* isolate = info.GetIsolate();\\\n\tv8::String::Utf8Value utf8_value(property);\\\n\tCFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_value.length());\\\n\tCJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\\\n\tASSERT(pJSObj != NULL);\\\n\tclass_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\\\n\tASSERT(pObj != NULL);\\\n\tFX_BOOL bRet = FALSE;\\\n\ttry\\\n\t{\\\n\t\tMEMLEAKCHECK_1();\\\n\t\tbRet = pObj->QueryProperty((FX_LPCWSTR)propname);\\\n\t\tMEMLEAKCHECK_2(class_name, (FX_LPCWSTR)prop_name);\\\n\t}\\\n\tcatch (...)\\\n\t{\\\n\t\treturn ;\\\n\t}\\\n\tif (bRet)\\\n\t{\\\n\t\tinfo.GetReturnValue().Set(0x004);\\\n\t\treturn ;\\\n\t}\\\n\telse\\\n\t{\\\n\t\tinfo.GetReturnValue().Set(0);\\\n\t\treturn ;\\\n\t}\\\n\treturn ;\\\n}\\\n\tvoid js_class_name::getprop_##js_class_name##_static(JS_NAMED_PROPGET_ARGS)\\\n{\\\n\tv8::Isolate* isolate = info.GetIsolate();\\\n\tv8::Local<v8::Context> context = isolate->GetCurrentContext();\\\n\tv8::Local<v8::Value> v = context->GetEmbedderData(1);\\\n\tASSERT(!v.IsEmpty());\\\n\tif(v.IsEmpty()) return;\\\n\tv8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);\\\n\tIFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\\\n\tIFXJS_Context* cc = pRuntime->GetCurrentContext();\\\n\tv8::String::Utf8Value utf8_value(property);\\\n\tCFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_value.length());\\\n\tCJS_PropValue value(isolate);\\\n\tvalue.StartGetting();\\\n\tCJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\\\n\tASSERT(pJSObj != NULL);\\\n\tclass_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\\\n\tASSERT(pObj != NULL);\\\n\tJS_ErrorString sError;\\\n\tFX_BOOL bRet = FALSE;\\\n\ttry\\\n\t{\\\n\t\tMEMLEAKCHECK_1();\\\n\t\tbRet = pObj->DoProperty(cc, (FX_LPCWSTR)propname, value, sError);\\\n\t\tMEMLEAKCHECK_2(class_name, L\"GetProperty\");\\\n\t}\\\n\tcatch (...)\\\n\t{\\\n\t\tCFX_ByteString cbName;\\\n\t\tcbName.Format(\"%s.%s\", #class_name, L\"GetProperty\");\\\n\t\tJS_Error(NULL,CFX_WideString::FromLocal(cbName), L\"Unknown error is catched!\");\\\n\t\treturn ;\\\n\t}\\\n\tif (bRet)\\\n\t{\\\n\t\tinfo.GetReturnValue().Set((v8::Handle<v8::Value>)value);\\\n\t\treturn ;\\\n\t}\\\n\telse\\\n\t{\\\n\t\tCFX_ByteString cbName;\\\n\t\tcbName.Format(\"%s.%s\", #class_name, L\"GetProperty\");\\\n\t\tJS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\\\n\t\treturn ;\\\n\t}\\\n\tJS_Error(NULL,L\"GetProperty\", L\"Embeded object not found!\");\\\n\treturn ;\\\n}\\\n\tvoid js_class_name::putprop_##js_class_name##_static(JS_NAMED_PROPPUT_ARGS)\\\n{\\\n\tv8::Isolate* isolate = info.GetIsolate();\\\n\tv8::Local<v8::Context> context = isolate->GetCurrentContext();\\\n\tv8::Local<v8::Value> v = context->GetEmbedderData(1);\\\n\tASSERT(!v.IsEmpty());\\\n\tif(v.IsEmpty()) return;\\\n\tv8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);\\\n\tIFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\\\n\tIFXJS_Context* cc = pRuntime->GetCurrentContext();\\\n\tv8::String::Utf8Value utf8_value(property);\\\n\tCFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_value.length());\\\n\tCJS_PropValue PropValue(CJS_Value(isolate,value,VT_unknown));\\\n\tPropValue.StartSetting();\\\n\tCJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\\\n\tif(!pJSObj) return;\\\n\tclass_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\\\n\tASSERT(pObj != NULL);\\\n\tJS_ErrorString sError;\\\n\tFX_BOOL bRet = FALSE;\\\n\ttry\\\n\t{\\\n\t\tMEMLEAKCHECK_1();\\\n\t\tbRet = pObj->DoProperty(cc, (FX_LPCWSTR)propname, PropValue, sError);\\\n\t\tMEMLEAKCHECK_2(class_name,L\"PutProperty\");\\\n\t}\\\n\tcatch (...)\\\n\t{\\\n\t\tCFX_ByteString cbName;\\\n\t\tcbName.Format(\"%s.%s\", #class_name, \"PutProperty\");\\\n\t\tJS_Error(NULL,CFX_WideString::FromLocal(cbName), L\"Unknown error is catched!\");\\\n\t\treturn ;\\\n\t}\\\n\tif (bRet)\\\n\t{\\\n\t\treturn ;\\\n\t}\\\n\telse\\\n\t{\\\n\t\tCFX_ByteString cbName;\\\n\t\tcbName.Format(\"%s.%s\", #class_name, \"PutProperty\");\\\n\t\tJS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\\\n\t\treturn ;\\\n\t}\\\n\tJS_Error(NULL,L\"PutProperty\", L\"Embeded object not found!\");\\\n\treturn ;\\\n}\\\n\tvoid js_class_name::delprop_##js_class_name##_static(JS_PROPDEL_ARGS)\\\n{\\\n\tv8::Isolate* isolate = info.GetIsolate();\\\n\tv8::Local<v8::Context> context = isolate->GetCurrentContext();\\\n\tv8::Local<v8::Value> v = context->GetEmbedderData(1);\\\n\tASSERT(!v.IsEmpty());\\\n\tif(v.IsEmpty()) return;\\\n\tv8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);\\\n\tIFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\\\n\tIFXJS_Context* cc = pRuntime->GetCurrentContext();\\\n\tv8::String::Utf8Value utf8_value(property);\\\n\tCFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_value.length());\\\n\tCJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\\\n\tASSERT(pJSObj != NULL);\\\n\tclass_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\\\n\tASSERT(pObj != NULL);\\\n\tJS_ErrorString sError;\\\n\tFX_BOOL bRet = FALSE;\\\n\ttry\\\n\t{\\\n\t\tMEMLEAKCHECK_1();\\\n\t\tbRet = pObj->DelProperty(cc, (FX_LPCWSTR)propname, sError);\\\n\t\tMEMLEAKCHECK_2(class_name,L\"DelProperty\");\\\n\t}\\\n\tcatch (...)\\\n\t{\\\n\t\tCFX_ByteString cbName;\\\n\t\tcbName.Format(\"%s.%s\", #class_name, \"DelProperty\");\\\n\t\treturn ;\\\n\t}\\\n\tif (bRet)\\\n\t{\\\n\t\treturn ;\\\n\t}\\\n\telse\\\n\t{\\\n\t\tCFX_ByteString cbName;\\\n\t\tcbName.Format(\"%s.%s\", #class_name, \"DelProperty\");\\\n\t\treturn ;\\\n\t}\\\n\treturn ;\\\n}\\\nJSBool js_class_name::JSConstructor(IFXJS_Context* cc, JSFXObject  obj,JSFXObject  global)\\\n{\\\n\tCJS_Object* pObj = FX_NEW js_class_name(obj);\\\n\tpObj->SetEmbedObject(FX_NEW class_alternate(pObj));\\\n\tJS_SetPrivate(NULL,obj, (void*)pObj); \\\n\tpObj->InitInstance(cc);\\\n\treturn JS_TRUE;\\\n}\\\n\\\nJSBool js_class_name::JSDestructor(JSFXObject obj) \\\n{\\\n\tjs_class_name* pObj = (js_class_name*)JS_GetPrivate(NULL,obj);\\\n\tASSERT(pObj != NULL);\\\n\tpObj->ExitInstance();\\\n\tdelete pObj;\\\n\treturn JS_TRUE;\\\n}\\\n\\\nint js_class_name::Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType)\\\n{\\\n\\\n\tint nObjDefnID = JS_DefineObj(pRuntime, js_class_name::m_pClassName, eObjType, JSConstructor, JSDestructor, 0);\\\n\\\n\tif (nObjDefnID >= 0)\\\n\t{\\\n\t\tfor (int j=0, szj=sizeof(JS_Class_Properties)/sizeof(JSPropertySpec)-1; j<szj; j++)\\\n\t\t{\\\n\t\t\tif (JS_DefineObjProperty(pRuntime, nObjDefnID, JS_Class_Properties[j].pName, JS_Class_Properties[j].pPropGet,JS_Class_Properties[j].pPropPut)<0)return -1;\\\n\t\t}\\\n\\\n\t\tfor (int k=0, szk=sizeof(JS_Class_Methods)/sizeof(JSMethodSpec)-1; k<szk; k++)\\\n\t\t{\\\n\t\t\tif (JS_DefineObjMethod(pRuntime, nObjDefnID,JS_Class_Methods[k].pName,JS_Class_Methods[k].pMethodCall,JS_Class_Methods[k].nParamNum)<0)return -1;\\\n\t\t}\\\n\t\tif (JS_DefineObjAllProperties(pRuntime, nObjDefnID, js_class_name::queryprop_##js_class_name##_static, js_class_name::getprop_##js_class_name##_static,js_class_name::putprop_##js_class_name##_static,js_class_name::delprop_##js_class_name##_static)<0) return -1;\\\n\\\n\t\treturn nObjDefnID;\\\n\t}\\\n\\\n\treturn -1;\\\n}\\\nvoid js_class_name::GetConsts(JSConstSpec*& pConsts, int& nSize)\\\n{\\\n\tpConsts = JS_Class_Consts;\\\n\tnSize = sizeof(JS_Class_Consts)/sizeof(JSConstSpec)-1;\\\n}\\\nvoid js_class_name::GetProperties(JSPropertySpec*& pProperties, int& nSize)\\\n{\\\n\tpProperties = JS_Class_Properties;\\\n\tnSize = sizeof(JS_Class_Properties)/sizeof(JSPropertySpec)-1;\\\n}\\\nvoid js_class_name::GetMethods(JSMethodSpec*& pMethods, int& nSize)\\\n{\\\n\tpMethods = JS_Class_Methods;\\\n\tnSize = sizeof(JS_Class_Methods)/sizeof(JSMethodSpec)-1;\\\n}\n\n#define JS_SPECIAL_STATIC_METHOD(method_name, class_alternate, class_name)\\\n\tstatic void method_name##_static(JS_METHOD_ARGS)\\\n{\\\n\tv8::Isolate* isolate = info.GetIsolate();\\\n\tv8::Local<v8::Context> context = isolate->GetCurrentContext();\\\n\tv8::Local<v8::Value> v = context->GetEmbedderData(1);\\\n\tASSERT(!v.IsEmpty());\\\n\tif(v.IsEmpty()) return;\\\n\tv8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);\\\n\tIFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\\\n\tIFXJS_Context* cc = pRuntime->GetCurrentContext();\\\n\tCJS_Parameters parameters;\\\n\tfor (unsigned int i = 0; i<(unsigned int)info.Length(); i++)\\\n\t{\\\n\tparameters.push_back(CJS_Value(isolate, info[i], VT_unknown));\\\n\t}\\\n\tCJS_Value valueRes(isolate);\\\n\tCJS_Object* pJSObj = (CJS_Object *)JS_GetPrivate(isolate, info.Holder());\\\n\tASSERT(pJSObj != NULL);\\\n\tclass_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\\\n\tASSERT(pObj != NULL);\\\n\tJS_ErrorString sError;\\\n\tFX_BOOL bRet = FALSE;\\\n\ttry\\\n\t{\\\n\t\tMEMLEAKCHECK_1();\\\n\t\tbRet = pObj->method_name(cc, parameters, valueRes, sError);\\\n\t\tMEMLEAKCHECK_2(class_name, method_name);\\\n\t}\\\n\tcatch (...)\\\n\t{\\\n\t\tCFX_ByteString cbName;\\\n\t\tcbName.Format(\"%s.%s\", #class_name, #method_name);\\\n\t\tJS_Error(NULL, CFX_WideString::FromLocal(cbName), L\"Unknown error is catched!\");\\\n\t\treturn ;\\\n\t}\\\n\tif (bRet)\\\n\t{\\\n\t\tinfo.GetReturnValue().Set(valueRes.ToJSValue());\\\n\t\treturn ;\\\n\t}\\\n\telse\\\n\t{\\\n\t\tCFX_ByteString cbName;\\\n\t\tcbName.Format(\"%s.%s\", #class_name, #method_name);\\\n\t\tJS_Error(NULL, CFX_WideString::FromLocal(cbName), sError);\\\n\t\treturn ;\\\n\t}\\\n\tJS_Error(NULL,  JS_WIDESTRING(method_name), L\"Embeded object not found!\");\\\n    return ;\\\n}\n\n/* ======================================== GLOBAL METHODS ============================================ */\n#define JS_STATIC_GLOBAL_FUN(fun_name) \\\nstatic void fun_name##_static(JS_METHOD_ARGS)\\\n{\\\n\tv8::Isolate* isolate = info.GetIsolate();\\\n\tv8::Local<v8::Context> context = isolate->GetCurrentContext();\\\n\tv8::Local<v8::Value> v = context->GetEmbedderData(1);\\\n\tASSERT(!v.IsEmpty());\\\n\tif(v.IsEmpty()) return;\\\n\tv8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);\\\n\tIFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\\\n\tIFXJS_Context* cc = pRuntime->GetCurrentContext();\\\n\tCJS_Parameters parameters;\\\n\tfor (unsigned int i = 0; i<(unsigned int)info.Length(); i++)\\\n\t{\\\n\tparameters.push_back(CJS_Value(isolate, info[i], VT_unknown));\\\n\t}\\\n\tCJS_Value valueRes(isolate);\\\n\tJS_ErrorString sError;\\\n\tif (!fun_name(cc, parameters, valueRes, sError))\\\n\t{\\\n\t\tJS_Error(NULL, JS_WIDESTRING(fun_name), sError);\\\n\t\treturn ;\\\n\t}\\\n\tinfo.GetReturnValue().Set(valueRes.ToJSValue());\\\n\treturn ;\\\n}\n\n#define JS_STATIC_DECLARE_GLOBAL_FUN() \\\nstatic JSMethodSpec\tglobal_methods[]; \\\nstatic int Init(IJS_Runtime* pRuntime)\n\n#define BEGIN_JS_STATIC_GLOBAL_FUN(js_class_name) \\\nJSMethodSpec js_class_name::global_methods[] = {\n\n#define JS_STATIC_GLOBAL_FUN_ENTRY(method_name,nargs) JS_STATIC_METHOD_ENTRY(method_name,nargs)\n\n#define END_JS_STATIC_GLOBAL_FUN() END_JS_STATIC_METHOD()\n\n#define IMPLEMENT_JS_STATIC_GLOBAL_FUN(js_class_name) \\\nint js_class_name::Init(IJS_Runtime* pRuntime)\\\n{\\\n\tfor (int i=0, sz=sizeof(js_class_name::global_methods)/sizeof(JSMethodSpec)-1; i<sz; i++)\\\n\t{\\\n\t\tif (JS_DefineGlobalMethod(pRuntime,\\\n\t\t\t\tjs_class_name::global_methods[i].pName,\\\n\t\t\t\tjs_class_name::global_methods[i].pMethodCall,\\\n\t\t\t\tjs_class_name::global_methods[i].nParamNum\\\n\t\t\t\t) < 0\\\n\t\t\t)return -1;\\\n\t}\\\n\treturn 0;\\\n}\n\n/* ======================================== GLOBAL CONSTS ============================================ */\n#define DEFINE_GLOBAL_CONST(pRuntime, const_name , const_value)\\\nif (JS_DefineGlobalConst(pRuntime,JS_WIDESTRING(const_name),JS_NewString(pRuntime,JS_WIDESTRING(const_value)))) return -1\n\n/* ======================================== GLOBAL ARRAYS ============================================ */\n\n#define DEFINE_GLOBAL_ARRAY(pRuntime)\\\nint size = sizeof(ArrayContent) / sizeof(FX_LPCWSTR);\\\n\\\nCJS_Array array(pRuntime);\\\nfor (int i=0; i<size; i++) array.SetElement(i,CJS_Value(pRuntime,(FX_LPCWSTR)ArrayContent[i]));\\\n\\\nCJS_PropValue prop(pRuntime);\\\nprop << array;\\\nif (JS_DefineGlobalConst(pRuntime, (const wchar_t*)ArrayName, prop.ToJSValue()) < 0)\\\n\treturn -1\n\n/* ============================================================ */\n\n#define VALUE_NAME_STRING\t\tL\"string\"\n#define VALUE_NAME_NUMBER\t\tL\"number\"\n#define VALUE_NAME_BOOLEAN\t\tL\"boolean\"\n#define VALUE_NAME_DATE\t\t\tL\"date\"\n#define VALUE_NAME_OBJECT\t\tL\"object\"\n#define VALUE_NAME_FXOBJ\t\tL\"fxobj\"\n#define VALUE_NAME_NULL\t\t\tL\"null\"\n#define VALUE_NAME_UNDEFINED\tL\"undefined\"\n\n#define CLASSNAME_ARRAY\t\t\tL\"Array\"\n#define CLASSNAME_DATE\t\t\tL\"Date\"\n#define CLASSNAME_STRING\t\tL\"v8::String\"\n\nconst unsigned int JSCONST_nStringHash = JS_CalcHash(VALUE_NAME_STRING,wcslen(VALUE_NAME_STRING));\nconst unsigned int JSCONST_nNumberHash = JS_CalcHash(VALUE_NAME_NUMBER,wcslen(VALUE_NAME_NUMBER));\nconst unsigned int JSCONST_nBoolHash = JS_CalcHash(VALUE_NAME_BOOLEAN,wcslen(VALUE_NAME_BOOLEAN));\nconst unsigned int JSCONST_nDateHash = JS_CalcHash(VALUE_NAME_DATE,wcslen(VALUE_NAME_DATE));\nconst unsigned int JSCONST_nObjectHash = JS_CalcHash(VALUE_NAME_OBJECT,wcslen(VALUE_NAME_OBJECT));\nconst unsigned int JSCONST_nFXobjHash = JS_CalcHash(VALUE_NAME_FXOBJ,wcslen(VALUE_NAME_FXOBJ));\nconst unsigned int JSCONST_nNullHash = JS_CalcHash(VALUE_NAME_NULL,wcslen(VALUE_NAME_NULL));\nconst unsigned int JSCONST_nUndefHash = JS_CalcHash(VALUE_NAME_UNDEFINED,wcslen(VALUE_NAME_UNDEFINED));\n\nstatic FXJSVALUETYPE GET_VALUE_TYPE(v8::Handle<v8::Value> p)\n{\n\n\t\tconst unsigned int nHash = JS_CalcHash(JS_GetTypeof(p));\n\n\t\tif (nHash == JSCONST_nUndefHash)\n\t\t\treturn VT_undefined;\n\t\telse if (nHash == JSCONST_nNullHash)\n\t\t\treturn VT_null;\n\t\telse if (nHash == JSCONST_nStringHash)\n\t\t\treturn VT_string;\n\t\telse if (nHash == JSCONST_nNumberHash)\n\t\t\treturn VT_number;\n\t\telse if (nHash == JSCONST_nBoolHash)\n\t\t\treturn VT_boolean;\n\t\telse if (nHash == JSCONST_nDateHash)\n\t\t\treturn VT_date;\n\t\telse if (nHash == JSCONST_nObjectHash)\n\t\t\treturn VT_object;\t\t\n\t\telse if (nHash == JSCONST_nFXobjHash)\n\t\t\treturn VT_fxobject;\n\n\t\t/*\n\t\tconst char * sType = p->getTypeof()->toDchars();\n\t\tif (strcmp(sType,VALUE_NAME_STRING) == 0)\n\t\t\treturn VT_string;\n\t\telse if (strcmp(sType,VALUE_NAME_NUMBER) == 0)\n\t\t\treturn VT_number;\n\t\telse if (strcmp(sType,VALUE_NAME_BOOLEAN) == 0)\n\t\t\treturn VT_boolean;\n\t\telse if (strcmp(sType,VALUE_NAME_DATE) == 0)\n\t\t\treturn VT_date;\n\t\telse if (strcmp(sType,VALUE_NAME_OBJECT) == 0)\n\t\t\treturn VT_object;\n\t\telse if (strcmp(sType,VALUE_NAME_FXOBJ) == 0)\n\t\t\treturn VT_object;\n\t\telse if (strcmp(sType,VALUE_NAME_NULL) == 0)\n\t\t\treturn VT_null;\n\t\telse if (strcmp(sType,VALUE_NAME_UNDEFINED) == 0)\n\t\t\treturn VT_undefined;\n\t\t\t*/\n\n\treturn VT_unknown;\n}\n\n#endif //_JS_DEFINE_H_\n"
  },
  {
    "path": "fpdfsdk/include/javascript/JS_EventHandler.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JS_EVENTHANDLER_H_\n#define _JS_EVENTHANDLER_H_\n\nclass CJS_Context;\nclass Field;\n\nenum JS_EVENT_T\n{\n\tJET_UNKNOWN,\n\tJET_APP_INIT,\n\tJET_DOC_OPEN,\n\tJET_DOC_WILLPRINT,\n\tJET_DOC_DIDPRINT,\n\tJET_DOC_WILLSAVE,\n\tJET_DOC_DIDSAVE,\n\tJET_DOC_WILLCLOSE,\n\tJET_PAGE_OPEN,\n\tJET_PAGE_CLOSE,\n\tJET_PAGE_INVIEW,\n\tJET_PAGE_OUTVIEW,\n\tJET_FIELD_MOUSEDOWN,\n\tJET_FIELD_MOUSEUP,\n\tJET_FIELD_MOUSEENTER,\n\tJET_FIELD_MOUSEEXIT,\n\tJET_FIELD_FOCUS,\n\tJET_FIELD_BLUR,\n\tJET_FIELD_KEYSTROKE,\n\tJET_FIELD_VALIDATE,\n\tJET_FIELD_CALCULATE,\n\tJET_FIELD_FORMAT,\n\tJET_SCREEN_FOCUS,\n\tJET_SCREEN_BLUR,\n\tJET_SCREEN_OPEN,\n\tJET_SCREEN_CLOSE,\n\tJET_SCREEN_MOUSEDOWN,\n\tJET_SCREEN_MOUSEUP,\n\tJET_SCREEN_MOUSEENTER,\n\tJET_SCREEN_MOUSEEXIT,\n\tJET_SCREEN_INVIEW,\n\tJET_SCREEN_OUTVIEW,\n\tJET_BATCH_EXEC,\n\tJET_MENU_EXEC,\n\tJET_CONSOLE_EXEC,\n\tJET_EXTERNAL_EXEC,\n\tJET_BOOKMARK_MOUSEUP,\n\tJET_LINK_MOUSEUP\n};\n\nclass CJS_EventHandler\n{\npublic:\n\tCJS_EventHandler(CJS_Context * pContext);\n\tvirtual ~CJS_EventHandler();\n\n\tvoid\t\t\t\t\tOnApp_Init();\n\n\tvoid\t\t\t\t\tOnDoc_Open(CPDFSDK_Document* pDoc, const CFX_WideString& strTargetName);\n\tvoid\t\t\t\t\tOnDoc_WillPrint(CPDFSDK_Document* pDoc);\n\tvoid\t\t\t\t\tOnDoc_DidPrint(CPDFSDK_Document* pDoc);\n\tvoid\t\t\t\t\tOnDoc_WillSave(CPDFSDK_Document* pDoc);\n\tvoid\t\t\t\t\tOnDoc_DidSave(CPDFSDK_Document* pDoc);\n\tvoid\t\t\t\t\tOnDoc_WillClose(CPDFSDK_Document* pDoc);\n\n\tvoid\t\t\t\t\tOnPage_Open(CPDFSDK_Document* pDoc);\n\tvoid\t\t\t\t\tOnPage_Close(CPDFSDK_Document* pDoc);\n\tvoid\t\t\t\t\tOnPage_InView(CPDFSDK_Document* pTarget);\n\tvoid\t\t\t\t\tOnPage_OutView(CPDFSDK_Document* pTarget);\n\t\n\tvoid\t\t\t\t\tOnField_Calculate(CPDF_FormField* pSource, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL& bRc);\n\tvoid\t\t\t\t\tOnField_Format(int nCommitKey, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL bWillCommit);\n\tvoid\t\t\t\t\tOnField_Keystroke(int nCommitKey, CFX_WideString& strChange, const CFX_WideString& strChangeEx,\n\t\t\t\t\t\t\t\tFX_BOOL KeyDown, FX_BOOL bModifier, int &nSelEnd,int &nSelStart, FX_BOOL bShift,\n\t\t\t\t\t\t\t\tCPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL bWillCommit, \n\t\t\t\t\t\t\t\tFX_BOOL bFieldFull, FX_BOOL &bRc);\n\tvoid\t\t\t\t\tOnField_Validate(CFX_WideString& strChange, const CFX_WideString& strChangeEx, FX_BOOL bKeyDown,\n\t\t\t\t\t\t\t\tFX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL& bRc);\n\n\tvoid\t\t\t\t\tOnField_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget);\n\tvoid\t\t\t\t\tOnField_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget);\n\tvoid\t\t\t\t\tOnField_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget);\n\tvoid\t\t\t\t\tOnField_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget);\n\tvoid\t\t\t\t\tOnField_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, const CFX_WideString& Value);\n\tvoid\t\t\t\t\tOnField_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, const CFX_WideString& Value);\n\n\tvoid\t\t\t\t\tOnScreen_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);\n\tvoid\t\t\t\t\tOnScreen_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);\n\tvoid\t\t\t\t\tOnScreen_Open(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);\n\tvoid\t\t\t\t\tOnScreen_Close(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);\n\tvoid\t\t\t\t\tOnScreen_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);\n\tvoid\t\t\t\t\tOnScreen_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);\n\tvoid\t\t\t\t\tOnScreen_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);\n\tvoid\t\t\t\t\tOnScreen_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);\n\tvoid\t\t\t\t\tOnScreen_InView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);\n\tvoid\t\t\t\t\tOnScreen_OutView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);\n\n\tvoid\t\t\t\t\tOnBookmark_MouseUp(CPDF_Bookmark* pBookMark);\n\tvoid\t\t\t\t\tOnLink_MouseUp(CPDFSDK_Document* pTarget);\n\n\tvoid\t\t\t\t\tOnMenu_Exec(CPDFSDK_Document* pTarget, const CFX_WideString& strTargetName);\n\tvoid\t\t\t\t\tOnBatchExec(CPDFSDK_Document *pTarget);\n\tvoid\t\t\t\t\tOnConsole_Exec();\n\tvoid\t\t\t\t\tOnExternal_Exec();\n\npublic:\n    void\t\t\t\t\tInitial(JS_EVENT_T type);\n\tvoid\t\t\t\t\tDestroy();\n\tFX_BOOL\t\t\t\t\tIsValid();\n\n\t\n\tCFX_WideString&\t\t\tChange();\n\tCFX_WideString\t\t\tChangeEx();\n\tint\t\t\t\t\t\tCommitKey();\n\tFX_BOOL\t\t\t\t\tFieldFull();\n\tFX_BOOL\t\t\t\t\tKeyDown();\n\tFX_BOOL\t\t\t\t\tModifier();\n\tFX_LPCWSTR\t\t\t\tName();\n\tFX_LPCWSTR\t\t\t\tType();\n\tFX_BOOL&\t\t\t\tRc();\n\tint&\t\t\t\t\tSelEnd();\n\tint&\t\t\t\t\tSelStart();\n\tFX_BOOL\t\t\t\t\tShift();\n\tField*\t\t\t\t\tSource();\n\tField*\t\t\t\t\tTarget_Field();\n\tCFX_WideString&\t\t\tValue();\n\tFX_BOOL\t\t\t\t\tWillCommit();\n\tCFX_WideString\t\t\tTargetName();\n\n\tJS_EVENT_T\t\t\t\tEventType() {return m_eEventType;};\t\n\npublic:\n\tCJS_Context*\t\t\tm_pJSContext;\n\tJS_EVENT_T\t\t\t\tm_eEventType;\n\tFX_BOOL\t\t\t\t\tm_bValid;\n\n\tCFX_WideString\t\t\tm_strTargetName;\n\tCFX_WideString\t\t\tm_strSourceName;\n\tCFX_WideString*\t\t\tm_pWideStrChange;\n\tCFX_WideString\t\t\tm_WideStrChangeDu;\n\tCFX_WideString\t\t\tm_WideStrChangeEx;\n\tint\t\t\t\t\t\tm_nCommitKey;\n\tFX_BOOL\t\t\t\t\tm_bKeyDown;\n\tFX_BOOL\t\t\t\t\tm_bModifier;\n\tFX_BOOL\t\t\t\t\tm_bShift;\n\tint*\t\t\t\t\tm_pISelEnd;\n\tint\t\t\t\t\t\tm_nSelEndDu;\n\tint*\t\t\t\t\tm_pISelStart;\n\tint\t\t\t\t\t\tm_nSelStartDu;\n\tFX_BOOL\t\t\t\t\tm_bWillCommit;\n\tCFX_WideString*\t\t\tm_pValue;\n\tFX_BOOL\t\t\t\t\tm_bFieldFull;\n\tFX_BOOL*\t\t\t\tm_pbRc;\n\tFX_BOOL\t\t\t\t\tm_bRcDu;\n\n\tCPDFSDK_Document*\t\tm_pSourceDoc;\n\tCPDF_Bookmark*\t\t\tm_pTargetBookMark;\n\tCPDFSDK_Document*\t\tm_pTargetDoc;\n\tCPDFSDK_Annot*\t\t\tm_pTargetAnnot;\n};\n\n#endif //_JS_EVENTHANDLER_H_\n\n"
  },
  {
    "path": "fpdfsdk/include/javascript/JS_GlobalData.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JS_GLOBALDATA_H_\n#define _JS_GLOBALDATA_H_\n\n#define JS_GLOBALDATA_TYPE_NUMBER\t\t0\n#define JS_GLOBALDATA_TYPE_BOOLEAN\t\t1\n#define JS_GLOBALDATA_TYPE_STRING\t\t2\n#define JS_GLOBALDATA_TYPE_OBJECT\t\t3\n#define JS_GLOBALDATA_TYPE_NULL\t\t\t4\n\nclass CJS_KeyValue;\nclass CJS_GlobalVariableArray;\nclass CJS_GlobalData_Element;\n\nclass CJS_GlobalVariableArray\n{\npublic:\n\tCJS_GlobalVariableArray();\n\tvirtual ~CJS_GlobalVariableArray();\n\n\tvoid\t\t\tAdd(CJS_KeyValue* p);\n\tint\t\t\t\tCount() const;\n\tCJS_KeyValue*\tGetAt(int index) const;\n\tvoid\t\t\tCopy(const CJS_GlobalVariableArray& array);\n\n\tvoid\t\t\tEmpty();\n\nprivate:\n\tCFX_ArrayTemplate<CJS_KeyValue*> array;\n};\n\nclass CJS_KeyValue\n{\npublic:\n\tCJS_KeyValue(){}\n\tvirtual ~CJS_KeyValue(){}\n\n\tCFX_ByteString\t\t\t\t\tsKey;\n\tint\t\t\t\t\t\t\t\tnType; //0:int 1:bool 2:string 3:obj\n\tdouble\t\t\t\t\t\t\tdData;\n\tbool\t\t\t\t\t\t\tbData;\n\tCFX_ByteString\t\t\t\t\tsData;\n\tCJS_GlobalVariableArray\t\t\tobjData;\n};\n\nclass CJS_GlobalData_Element\n{\npublic:\n\tCJS_GlobalData_Element(){}\n\tvirtual ~CJS_GlobalData_Element(){}\n\n\tCJS_KeyValue\t\t\tdata;\n\tFX_BOOL\t\t\t\t\tbPersistent;\n};\n\nclass CJS_GlobalData\n{\npublic:\n\tCJS_GlobalData(CPDFDoc_Environment* pApp);\n\tvirtual ~CJS_GlobalData();\n\npublic:\n\tvoid\t\t\t\t\t\t\t\tSetGlobalVariableNumber(FX_LPCSTR propname, double dData);\n\tvoid\t\t\t\t\t\t\t\tSetGlobalVariableBoolean(FX_LPCSTR propname, bool bData);\n\tvoid\t\t\t\t\t\t\t\tSetGlobalVariableString(FX_LPCSTR propname, const CFX_ByteString& sData);\n\tvoid\t\t\t\t\t\t\t\tSetGlobalVariableObject(FX_LPCSTR propname, const CJS_GlobalVariableArray& array);\n\tvoid\t\t\t\t\t\t\t\tSetGlobalVariableNull(FX_LPCSTR propname);\n\n\tFX_BOOL\t\t\t\t\t\t\t\tSetGlobalVariablePersistent(FX_LPCSTR propname, FX_BOOL bPersistent);\n\tFX_BOOL\t\t\t\t\t\t\t\tDeleteGlobalVariable(FX_LPCSTR propname);\n\t\n\tFX_INT32\t\t\t\t\t\t\tGetSize() const;\n\tCJS_GlobalData_Element*\t\t\t\tGetAt(int index) const;\n\nprivate:\n\tvoid\t\t\t\t\t\t\t\tLoadGlobalPersistentVariables();\n\tvoid\t\t\t\t\t\t\t\tSaveGlobalPersisitentVariables();\n\t\n\tCJS_GlobalData_Element*\t\t\t\tGetGlobalVariable(FX_LPCSTR propname);\t\n\tint\t\t\t\t\t\t\t\t\tFindGlobalVariable(FX_LPCSTR propname);\n\n\tvoid\t\t\t\t\t\t\t\tLoadFileBuffer(FX_LPCWSTR sFilePath, FX_LPBYTE& pBuffer, FX_INT32& nLength);\n\tvoid\t\t\t\t\t\t\t\tWriteFileBuffer(FX_LPCWSTR sFilePath, FX_LPCSTR pBuffer, FX_INT32 nLength);\n\tvoid\t\t\t\t\t\t\t\tMakeByteString(const CFX_ByteString& name, CJS_KeyValue* pData, CFX_BinaryBuf& sData);\n\nprivate:\n\tCFX_ArrayTemplate<CJS_GlobalData_Element*>\tm_arrayGlobalData;\n\tCFX_WideString\t\t\t\t\t\t\t\tm_sFilePath;\n\tCPDFDoc_Environment*\t\t\t\t\t\t\t\tm_pApp;\n};\n\n#endif //_JS_GLOBALDATA_H_\n"
  },
  {
    "path": "fpdfsdk/include/javascript/JS_Module.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JS_MODULE_H_\n#define _JS_MODULE_H_\n\nclass CJS_GlobalData;\nclass CJS_ConsoleDlg;\n\nclass CJS_Module : public IReader_Module\n{\npublic:\n\tCJS_Module(HMODULE hModule, CReader_App* pApp);\n\tvirtual ~CJS_Module();\n\n\tvirtual void\t\t\t\t\tDestroy(){delete this;}\n\tvirtual CFX_ByteString\t\t\tGetModuleName();\n\npublic:\n\tstatic CJS_Module*\t\t\t\tGetModule(CReader_App* pApp);\n\n\tIFXJS_Runtime*\t\t\t\t\tNewJSRuntime();\n\tCJS_GlobalData*\t\t\t\t\tNewGlobalData();\n\tvoid\t\t\t\t\t\t\tReleaseGlobalData();\n\npublic:\n\t//console\n\tvoid\t\t\t\t\t\t\tShowConsole();\n\tvoid\t\t\t\t\t\t\tHideConsole();\n\tvoid\t\t\t\t\t\t\tClearConsole();\n\tvoid\t\t\t\t\t\t\tPrintLineConsole(FX_LPCWSTR string);\n\nprivate:\n\tHMODULE\t\t\t\t\t\t\tm_hModule;\n\tCReader_App*\t\t\t\t\tm_pApp;\n\n\tFX_BOOL\t\t\t\t\t\t\tm_bInitial;\n\tCJS_GlobalData*\t\t\t\t\tm_pGlobalData;\n\tFX_INT32\t\t\t\t\t\tm_nGlobalDataCount;\n\n\tCJS_ConsoleDlg*\t\t\t\t\tm_pConsole;\n};\n\n#endif //_JS_MODULE_H_"
  },
  {
    "path": "fpdfsdk/include/javascript/JS_Object.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JS_OBJECT_H_\n#define _JS_OBJECT_H_\n\nclass CJS_Object;\nclass CJS_Timer;\nclass CJS_Context;\n\nclass CJS_EmbedObj : public CFX_Object\n{\npublic:\n\tCJS_EmbedObj(CJS_Object* pJSObject);\n\tvirtual ~CJS_EmbedObj();\n\n\tvirtual void\t\t\t\tTimerProc(CJS_Timer* pTimer){};\n\n\tCJS_Timer*\t\t\t\t\tBeginTimer(CPDFDoc_Environment * pApp, FX_UINT nElapse);\n\tvoid\t\t\t\t\t\tEndTimer(CJS_Timer* pTimer);\n\n\tCJS_Object*\t\t\t\t\tGetJSObject(){return m_pJSObject;};\n\toperator\t\t\t\t\tCJS_Object* (){return m_pJSObject;};\n\n\tCPDFSDK_PageView *\t\t\tJSGetPageView(IFXJS_Context* cc);\n\tint\t\t\t\t\t\t\tMsgBox(CPDFDoc_Environment* pApp, CPDFSDK_PageView* pPageView, FX_LPCWSTR swMsg, FX_LPCWSTR swTitle = NULL, FX_UINT nType = 0, FX_UINT nIcon = 0);\n\tvoid\t\t\t\t\t\tAlert(CJS_Context* pContext, FX_LPCWSTR swMsg);\n\tFX_BOOL\t\t\t\t\t\tIsSafeMode(IFXJS_Context* cc);\n\nprotected:\n\n\tCJS_Object*\t\t\t\t\tm_pJSObject;\n};\n\nclass CJS_Object : public CFX_Object\n{\npublic:\n\tCJS_Object(JSFXObject pObject);\n\tvirtual ~CJS_Object(void);\n\t\n\tvoid\t\t\t\t\t\tMakeWeak();\n\n\tvirtual FX_BOOL\t\t\t\tIsType(FX_LPCSTR sClassName){return TRUE;};\n\tvirtual CFX_ByteString\t\tGetClassName(){return \"\";};\n\n\tvirtual FX_BOOL\t\t\t\tInitInstance(IFXJS_Context* cc){return TRUE;};\n\tvirtual FX_BOOL\t\t\t\tExitInstance(){return TRUE;};\n\n\toperator\t\t\t\t\tJSFXObject () {return v8::Local<v8::Object>::New(m_pIsolate, m_pObject);}\n\toperator\t\t\t\t\tCJS_EmbedObj* (){return m_pEmbedObj;};\n\n\tvoid\t\t\t\t\t\tSetEmbedObject(CJS_EmbedObj* pObj){m_pEmbedObj = pObj;};\n\tCJS_EmbedObj *\t\t\t\tGetEmbedObject(){return m_pEmbedObj;};\n\n\tstatic CPDFSDK_PageView *\tJSGetPageView(IFXJS_Context* cc);\n\tstatic int\t\t\t\t\tMsgBox(CPDFDoc_Environment* pApp, CPDFSDK_PageView* pPageView, FX_LPCWSTR swMsg, FX_LPCWSTR swTitle = NULL, FX_UINT nType = 0,FX_UINT nIcon = 0);\n\tstatic void\t\t\t\t\tAlert(CJS_Context* pContext, FX_LPCWSTR swMsg);\n\n\tv8::Isolate*\t\t\t\t\tGetIsolate() {return m_pIsolate;}\nprotected:\n\tCJS_EmbedObj *\t\t\t\tm_pEmbedObj;\n\tv8::Persistent<v8::Object>\t\t\tm_pObject;\n\tv8::Isolate*\t\t\t\t\tm_pIsolate;\n};\n\nstruct JS_TIMER_MAP\n{\n\tFX_UINT nID;\n\tCJS_Timer * pTimer;\n};\n\ntypedef CFX_ArrayTemplate<JS_TIMER_MAP*>\tCTimerMapArray;\n\nstruct JS_TIMER_MAPARRAY\n{\npublic:\n\tJS_TIMER_MAPARRAY()\n\t{\n\t}\n\n\t~JS_TIMER_MAPARRAY()\n\t{\n\t\tReset();\n\t}\n\n\tvoid Reset()\n\t{\n\t\tfor (int i=0,sz=m_Array.GetSize(); i<sz; i++)\n\t\t\tdelete m_Array.GetAt(i);\n\n\t\tm_Array.RemoveAll();\n\t}\n\n\tvoid SetAt(FX_UINT nIndex,CJS_Timer * pTimer)\n\t{\n\t\tint i = Find(nIndex);\n\n\t\tif (i>=0)\n\t\t{\n\t\t\tif (JS_TIMER_MAP * pMap = m_Array.GetAt(i))\n\t\t\t\tpMap->pTimer = pTimer;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (JS_TIMER_MAP * pMap = new JS_TIMER_MAP)\n\t\t\t{\n\t\t\t\tpMap->nID = nIndex;\n\t\t\t\tpMap->pTimer = pTimer;\n\t\t\t\tm_Array.Add(pMap);\n\t\t\t}\n\t\t}\n\t}\n\n\tCJS_Timer * GetAt(FX_UINT nIndex)\n\t{\n\t\tint i = Find(nIndex);\n\n\t\tif (i>=0)\n\t\t{\n\t\t\tif (JS_TIMER_MAP * pMap = m_Array.GetAt(i))\n\t\t\t\treturn pMap->pTimer;\n\t\t}\n\t\treturn NULL;\n\t}\n\n\tvoid RemoveAt(FX_UINT nIndex)\n\t{\n\t\tint i = Find(nIndex);\n\n\t\tif (i>=0)\n\t\t{\n\t\t\tdelete m_Array.GetAt(i);\n\t\t\tm_Array.RemoveAt(i);\n\t\t}\n\t\t//To prevent potential fake memory leak reported by vc6.\n\t\tif(m_Array.GetSize() == 0)\n\t\t\tm_Array.RemoveAll();\n\t}\n\n\tint Find(FX_UINT nIndex)\n\t{\t\t\n\t\tfor (int i=0,sz=m_Array.GetSize(); i<sz; i++)\n\t\t{\t\t\t\n\t\t\tif (JS_TIMER_MAP * pMap = m_Array.GetAt(i))\n\t\t\t{\n\t\t\t\tif (pMap->nID == nIndex)\n\t\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t}\n\n\tCTimerMapArray\t\tm_Array;\n};\n\nstatic JS_TIMER_MAPARRAY\tm_sTimeMap;\n\nclass CJS_Runtime;\n\nclass CJS_Timer\n{\npublic:\n\tCJS_Timer(CJS_EmbedObj * pObj,CPDFDoc_Environment* pApp): m_pEmbedObj(pObj), \n\t\tm_nTimerID(0), \n\t\tm_bProcessing(FALSE),\n\t\tm_dwStartTime(0),\n\t\tm_dwTimeOut(0),\n\t\tm_dwElapse(0),\n\t\tm_pRuntime(NULL),\n\t\tm_nType(0),\n\t\tm_pApp(pApp)\n\t{\n\t}\n\t\n\tvirtual ~CJS_Timer()\n\t{\n\t\tKillJSTimer();\n\t}\n\npublic:\n\tFX_UINT SetJSTimer(FX_UINT nElapse)\n\t{\t\n\t\tif (m_nTimerID)KillJSTimer();\n\t\tIFX_SystemHandler* pHandler = m_pApp->GetSysHandler();\n\t\tm_nTimerID = pHandler->SetTimer(nElapse,TimerProc);\n\t\tm_sTimeMap.SetAt(m_nTimerID,this);\n\t\tm_dwElapse = nElapse;\n\t\treturn m_nTimerID;\n\t};\n\n\tvoid KillJSTimer()\n\t{\n\t\tif (m_nTimerID)\n\t\t{\n\t\t\tIFX_SystemHandler* pHandler = m_pApp->GetSysHandler();\n\t\t\tpHandler->KillTimer(m_nTimerID);\n\t\t\tm_sTimeMap.RemoveAt(m_nTimerID);\n\t\t\tm_nTimerID = 0;\n\t\t}\n\t};\n\n\tvoid SetType(int nType)\n\t{\n\t\tm_nType = nType;\n\t}\n\n\tint GetType() const\n\t{\n\t\treturn m_nType;\n\t}\n\n\tvoid SetStartTime(FX_DWORD dwStartTime)\n\t{\n\t\tm_dwStartTime = dwStartTime;\n\t}\n\n\tFX_DWORD GetStartTime() const\n\t{\n\t\treturn m_dwStartTime;\n\t}\n\n\tvoid SetTimeOut(FX_DWORD dwTimeOut)\n\t{\n\t\tm_dwTimeOut = dwTimeOut;\n\t}\n\n\tFX_DWORD GetTimeOut() const\n\t{\n\t\treturn m_dwTimeOut;\n\t}\n\n\tvoid SetRuntime(CJS_Runtime* pRuntime)\n\t{\n\t\tm_pRuntime = pRuntime;\n\t}\n\t\n\tCJS_Runtime* GetRuntime() const\n\t{\n\t\treturn m_pRuntime;\n\t}\n\n\tvoid SetJScript(const CFX_WideString& script)\n\t{\n\t\tm_swJScript = script;\n\t}\n\n\tCFX_WideString GetJScript() const\n\t{\n\t\treturn m_swJScript;\n\t}\n\n\tstatic void TimerProc(int idEvent)\n\t{\n\t\tif (CJS_Timer * pTimer = m_sTimeMap.GetAt(idEvent))\n\t\t{\n\t\t\tif (!pTimer->m_bProcessing)\n\t\t\t{\n\t\t\t\tpTimer->m_bProcessing = TRUE;\n\t\t\t\tif (pTimer->m_pEmbedObj) pTimer->m_pEmbedObj->TimerProc(pTimer);\n\t\t\t\tpTimer->m_bProcessing = FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t//\tTRACE(L\"BUSY!\\n\");\n\t\t\t}\n\t\t}\n\t};\n\nprivate:\n\tFX_UINT\t\t\t\t\t\t\tm_nTimerID;\t\n\tCJS_EmbedObj*\t\t\t\t\tm_pEmbedObj;\n\tFX_BOOL\t\t\t\t\t\t\tm_bProcessing;\n\n\t//data\n\tFX_DWORD\t\t\t\t\t\t\tm_dwStartTime;\n\tFX_DWORD\t\t\t\t\t\t\tm_dwTimeOut;\n\tFX_DWORD\t\t\t\t\t\tm_dwElapse;\n\tCJS_Runtime*\t\t\t\t\tm_pRuntime;\n\tCFX_WideString\t\t\t\t\tm_swJScript;\n\tint\t\t\t\t\t\t\t\tm_nType; //0:Interval; 1:TimeOut\n\n\tCPDFDoc_Environment*\t\t\tm_pApp;\n};\n#endif //_JS_OBJECT_H_\n"
  },
  {
    "path": "fpdfsdk/include/javascript/JS_Runtime.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JS_RUNTIME_H_\n#define _JS_RUNTIME_H_\n\nclass CJS_FieldEvent\n{\npublic:\n\tCFX_WideString\t\tsTargetName;\n\tJS_EVENT_T\t\t\teEventType;\n\tCJS_FieldEvent*\t\tpNext;\n};\n\nclass CJS_Runtime : public IFXJS_Runtime\n{\npublic:\n\tCJS_Runtime(CPDFDoc_Environment * pApp);\n\tvirtual ~CJS_Runtime();\n\n\tvirtual IFXJS_Context *\t\t\t\t\tNewContext();\n\tvirtual void\t\t\t\t\t\t\tReleaseContext(IFXJS_Context * pContext);\n\tvirtual IFXJS_Context*\t\t\t\t\tGetCurrentContext();\n\n\tvirtual void\t\t\t\t\t\t\tSetReaderDocument(CPDFSDK_Document *pReaderDoc);\n\tvirtual CPDFSDK_Document *\t\t\t\tGetReaderDocument(){return m_pDocument;}\n\n\tvirtual void\t\t\t\t\t\t\tGetObjectNames(CFX_WideStringArray& array);\n\tvirtual void\t\t\t\t\t\t\tGetObjectConsts(const CFX_WideString& swObjName, CFX_WideStringArray& array);\n\tvirtual void\t\t\t\t\t\t\tGetObjectProps(const CFX_WideString& swObjName, CFX_WideStringArray& array);\n\tvirtual void\t\t\t\t\t\t\tGetObjectMethods(const CFX_WideString& swObjName, CFX_WideStringArray& array);\n\n\tvirtual void\t\t\t\t\t\t\tExit();\n\tvirtual void\t\t\t\t\t\t\tEnter();\n\tvirtual FX_BOOL\t\t\t\t\t\t\tIsEntered();\n\n\tCPDFDoc_Environment *\t\t\t\t\t\t\tGetReaderApp(){return m_pApp;}\n\n\tFX_BOOL\t\t\t\t\t\t\t\t\tInitJSObjects();\n\n\tFX_BOOL\t\t\t\t\t\t\t\t\tAddEventToLoop(const CFX_WideString& sTargetName, JS_EVENT_T eEventType);\n\tvoid\t\t\t\t\t\t\t\t\tRemoveEventInLoop(const CFX_WideString& sTargetName, JS_EVENT_T eEventType);\n\tvoid\t\t\t\t\t\t\t\t\tRemoveEventsInLoop(CJS_FieldEvent* pStart);\n\n\tvoid\t\t\t\t\t\t\t\t\tBeginBlock(){m_bBlocking = TRUE;}\n\tvoid\t\t\t\t\t\t\t\t\tEndBlock(){m_bBlocking = FALSE;}\n\tFX_BOOL\t\t\t\t\t\t\t\t\tIsBlocking(){return m_bBlocking;}\n\n\toperator\t\t\t\t\t\t\t\tIJS_Runtime*() {return (IJS_Runtime*)m_isolate;}\n\tv8::Isolate*\t\t\t\t\t\t\t\tGetIsolate(){return m_isolate;};\n\tvoid\t\t\t\t\t\t\t\t\tSetIsolate(v8::Isolate* isolate){m_isolate = isolate;}\n\n\tv8::Handle<v8::Context>\t\t\t\t\t\t\tNewJSContext();\nprotected:\n\tCFX_ArrayTemplate<CJS_Context *>\t\tm_ContextArray;\n\tCPDFDoc_Environment *\t\t\t\t\t\t\tm_pApp;\n\tCPDFSDK_Document *\t\t\t\t\t\tm_pDocument;\n\tFX_BOOL\t\t\t\t\t\t\t\t\tm_bBlocking;\n\tCJS_FieldEvent*\t\t\t\t\t\t\tm_pFieldEventPath;\n\n\tv8::Isolate*\t\t\t\t\t\t\t\tm_isolate;\n\tv8::Persistent<v8::Context>\t\t\t\t\t\tm_context;\n\tFX_BOOL\t\t\t\t\t\t\t\t\tm_bRegistered;\n};\n\n#endif //_JS_RUNTIME_H_\n\n"
  },
  {
    "path": "fpdfsdk/include/javascript/JS_Value.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JS_VALUE_H_\n#define _JS_VALUE_H_\n\nclass CJS_Array;\nclass CJS_Date;\n\nclass CJS_Value\n{\npublic:\n\tCJS_Value(v8::Isolate* isolate);\n\tCJS_Value(v8::Isolate* isolate, v8::Handle<v8::Value> pValue,FXJSVALUETYPE t);\n\tCJS_Value(v8::Isolate* isolate, const int &iValue);\n\tCJS_Value(v8::Isolate* isolate, const double &dValue);\n\tCJS_Value(v8::Isolate* isolate, const float &fValue);\t\n\tCJS_Value(v8::Isolate* isolate, const bool &bValue);\n\tCJS_Value(v8::Isolate* isolate, JSFXObject);\n\tCJS_Value(v8::Isolate* isolate, CJS_Object *);\n\tCJS_Value(v8::Isolate* isolate, FX_LPCSTR pStr);\n\tCJS_Value(v8::Isolate* isolate, FX_LPCWSTR pWstr);\n\tCJS_Value(v8::Isolate* isolate, CJS_Array& array);\n\t\n\t~CJS_Value();\n\n\tvoid SetNull();\n    void Attach(v8::Handle<v8::Value> pValue,FXJSVALUETYPE t);\n\tvoid Attach(CJS_Value *pValue);\n\tvoid Detach();\n\n\n\toperator int() const;\n\toperator bool() const;\n\toperator double() const;\n\toperator float() const;\n\toperator CJS_Object *() const;\n\t//operator JSFXObject *() const;\n\toperator v8::Handle<v8::Object>() const;\n\toperator v8::Handle<v8::Array>() const;\n\toperator CFX_WideString() const;\n\t//operator FX_WCHAR *() const;\n\toperator CFX_ByteString() const;\n\tv8::Handle<v8::Value> ToJSValue();\n\n\tvoid operator = (int iValue);\n\tvoid operator = (bool bValue);\t\n\tvoid operator = (double);\t\n\tvoid operator = (float);\t\n\tvoid operator = (CJS_Object *);\t\n\tvoid operator = (v8::Handle<v8::Object>);\n//\tvoid operator = (JSObject *);\n\tvoid operator = (CJS_Array &);\n\tvoid operator = (CJS_Date &);\n\tvoid operator = (FX_LPCWSTR pWstr);\t\n\tvoid operator = (FX_LPCSTR pStr);\t\n\tvoid operator = (CJS_Value value);\n\t\n\tFX_BOOL IsArrayObject() const;\n\tFX_BOOL\tIsDateObject() const;\n\tFXJSVALUETYPE GetType() const;\n\n\tFX_BOOL ConvertToArray(CJS_Array &) const;\n\tFX_BOOL ConvertToDate(CJS_Date &) const;\n\n\tv8::Isolate* GetIsolate() {return m_isolate;}\nprotected:\t\n\tv8::Handle<v8::Value> m_pValue;\n\tFXJSVALUETYPE m_eType;\n\tv8::Isolate* m_isolate;\n};\n\ntemplate<class TYPE> class CJS_ParametersTmpl : public CFX_ArrayTemplate<TYPE>\n{\npublic:\n\tvoid push_back(TYPE newElement){CFX_ArrayTemplate<TYPE>::Add(newElement);}\n\tint size() const{return CFX_ArrayTemplate<TYPE>::GetSize();}\n};\ntypedef CJS_ParametersTmpl<CJS_Value> CJS_Parameters;\n\nclass CJS_PropValue: public CJS_Value\n{\npublic:\n\tCJS_PropValue(const CJS_Value &);\n\tCJS_PropValue(v8::Isolate* isolate);\n\t~CJS_PropValue();\npublic:\n\tFX_BOOL IsSetting();\n\tFX_BOOL IsGetting();\n\tvoid operator<<(int );\n\tvoid operator>>(int &) const;\n\tvoid operator<<(bool);\n\tvoid operator>>(bool &) const;\n\tvoid operator<<(double );\n\tvoid operator>>(double &) const;\n\tvoid operator<<(CJS_Object *pObj);\n\tvoid operator>>(CJS_Object *&ppObj) const;\n\tvoid operator<<(CFX_ByteString);\n\tvoid operator>>(CFX_ByteString &) const;\n\tvoid operator<<(CFX_WideString);\n\tvoid operator>>(CFX_WideString &) const;\n\tvoid operator<<(FX_LPCWSTR c_string);\n\n\tvoid operator<<(JSFXObject);\n\tvoid operator>>(JSFXObject &) const;\n\n\tvoid operator>>(CJS_Array &array) const;\n\tvoid operator<<(CJS_Array &array);\n\n\tvoid operator<<(CJS_Date &date);\n\tvoid operator>>(CJS_Date &date) const;\n\n\toperator v8::Handle<v8::Value>() const;\n\n\tvoid StartSetting();\n\tvoid StartGetting();\nprivate:\n\tFX_BOOL m_bIsSetting;\n};\n\nclass CJS_Array\n{\npublic:\n\tCJS_Array(v8::Isolate* isolate);\n\tvirtual ~CJS_Array();\n\n\tvoid Attach(v8::Handle<v8::Array> pArray);\n\tvoid GetElement(unsigned index,CJS_Value &value);\n\tvoid SetElement(unsigned index,CJS_Value value);\n    int GetLength();\n\tFX_BOOL IsAttached();\n\toperator v8::Handle<v8::Array>();\n\n\tv8::Isolate* GetIsolate() {return m_isolate;}\nprivate:\n\tv8::Handle<v8::Array> m_pArray;\n\tv8::Isolate* m_isolate;\n};\n\nclass CJS_Date\n{\nfriend class CJS_Value;\npublic:\n\tCJS_Date(v8::Isolate* isolate);\n\tCJS_Date(v8::Isolate* isolate,double dMsec_time);\n\tCJS_Date(v8::Isolate* isolate,int year, int mon, int day,int hour, int min, int sec);\n\tvirtual ~CJS_Date();\n\tvoid Attach(v8::Handle<v8::Value> pDate);\n\n\tint     GetYear();\n\tvoid    SetYear(int iYear);\n\n\tint     GetMonth();\n\tvoid    SetMonth(int iMonth);\n\n\tint     GetDay();\n\tvoid    SetDay(int iDay);\n\n\tint     GetHours();\n\tvoid    SetHours(int iHours);\n\n\tint     GetMinutes();\n\tvoid    SetMinutes(int minutes);\n\n\tint     GetSeconds();\n\tvoid    SetSeconds(int seconds);\n\n\toperator v8::Handle<v8::Value>();\n\toperator double() const;\n\n\tCFX_WideString\tToString() const;\n\n\tstatic double\tMakeDate(int year, int mon, int mday,int hour, int min, int sec,int ms);\n\n\tFX_BOOL\tIsValidDate();\n\nprotected:\n\tv8::Handle<v8::Value> m_pDate;\n\tv8::Isolate* m_isolate;\n};\n\n#endif //_JS_VALUE_H_\n\n"
  },
  {
    "path": "fpdfsdk/include/javascript/JavaScript.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _JAVASCRIPT_H_\n#define _JAVASCRIPT_H_\n\n\n#ifndef _INC_PDFAPI\n\t#define _INC_PDFAPI\n\n\t#include \"../../../core/include/fpdfapi/fpdf_module.h\" \n\t#include \"../../../core/include/fpdfdoc/fpdf_doc.h\" \n\t#include \"../../../core/include/fpdfdoc/fpdf_vt.h\" \n\t#include \"../../../core/include/fxcrt/fx_xml.h\" \n\t#include \"../../../core/include/fdrm/fx_crypt.h\" \n\t#include \"../../../core/include/fpdfapi/fpdf_pageobj.h\" \n\t#include \"../../../core/include/fpdfapi/fpdf_serial.h\"\n\n\n\t#include \"../../include/fx_systemhandler.h\"\t\n#endif\n\n\n#include \"../jsapi/fxjs_v8.h\"\n#include \"../fxedit/fx_edit.h\"\n#include \"../pdfwindow/IPDFWindow.h\"\n#include \"../fsdk_mgr.h\"\n\n\n#include <string>\n//#pragma warning( disable : 4786) \n#include <vector>\n\n\n#endif //_JAVASCRIPT_H_\n\n"
  },
  {
    "path": "fpdfsdk/include/javascript/PublicMethods.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _PUBLICMETHODS_H_\n#define _PUBLICMETHODS_H_\n\nclass CJS_PublicMethods : public CJS_Object\n{\npublic:\n\tCJS_PublicMethods(JSFXObject  pObject) : CJS_Object(pObject) {};\n\tvirtual ~CJS_PublicMethods(void){};\n\npublic:\n\tstatic FX_BOOL AFNumber_Format(OBJ_METHOD_PARAMS);\n\tstatic FX_BOOL AFNumber_Keystroke(OBJ_METHOD_PARAMS);\n\tstatic FX_BOOL AFPercent_Format(OBJ_METHOD_PARAMS);\n\tstatic FX_BOOL AFPercent_Keystroke(OBJ_METHOD_PARAMS);\n\tstatic FX_BOOL AFDate_FormatEx(OBJ_METHOD_PARAMS);\n\tstatic FX_BOOL AFDate_KeystrokeEx(OBJ_METHOD_PARAMS);\n\tstatic FX_BOOL AFDate_Format(OBJ_METHOD_PARAMS);\n\tstatic FX_BOOL AFDate_Keystroke(OBJ_METHOD_PARAMS);\n\tstatic FX_BOOL AFTime_FormatEx(OBJ_METHOD_PARAMS); //\n\tstatic FX_BOOL AFTime_KeystrokeEx(OBJ_METHOD_PARAMS);\n\tstatic FX_BOOL AFTime_Format(OBJ_METHOD_PARAMS);\n\tstatic FX_BOOL AFTime_Keystroke(OBJ_METHOD_PARAMS);\n\tstatic FX_BOOL AFSpecial_Format(OBJ_METHOD_PARAMS);\n\tstatic FX_BOOL AFSpecial_Keystroke(OBJ_METHOD_PARAMS);\n\tstatic FX_BOOL AFSpecial_KeystrokeEx(OBJ_METHOD_PARAMS);//\n\tstatic FX_BOOL AFSimple(OBJ_METHOD_PARAMS);\n\tstatic FX_BOOL AFMakeNumber(OBJ_METHOD_PARAMS);\n\tstatic FX_BOOL AFSimple_Calculate(OBJ_METHOD_PARAMS);\n\tstatic FX_BOOL AFRange_Validate(OBJ_METHOD_PARAMS);\n\tstatic FX_BOOL AFMergeChange(OBJ_METHOD_PARAMS); \n\tstatic FX_BOOL AFParseDateEx(OBJ_METHOD_PARAMS);\n\tstatic FX_BOOL AFExtractNums(OBJ_METHOD_PARAMS);\n\npublic:\n\tJS_STATIC_GLOBAL_FUN(AFNumber_Format);\n\tJS_STATIC_GLOBAL_FUN(AFNumber_Keystroke);\n\tJS_STATIC_GLOBAL_FUN(AFPercent_Format);\n\tJS_STATIC_GLOBAL_FUN(AFPercent_Keystroke);\n\tJS_STATIC_GLOBAL_FUN(AFDate_FormatEx);\n\tJS_STATIC_GLOBAL_FUN(AFDate_KeystrokeEx);\n\tJS_STATIC_GLOBAL_FUN(AFDate_Format);\n\tJS_STATIC_GLOBAL_FUN(AFDate_Keystroke);\n\tJS_STATIC_GLOBAL_FUN(AFTime_FormatEx);\n\tJS_STATIC_GLOBAL_FUN(AFTime_KeystrokeEx);\n\tJS_STATIC_GLOBAL_FUN(AFTime_Format);\n\tJS_STATIC_GLOBAL_FUN(AFTime_Keystroke);\n\tJS_STATIC_GLOBAL_FUN(AFSpecial_Format);\n\tJS_STATIC_GLOBAL_FUN(AFSpecial_Keystroke);\n\tJS_STATIC_GLOBAL_FUN(AFSpecial_KeystrokeEx);\n\tJS_STATIC_GLOBAL_FUN(AFSimple);\n\tJS_STATIC_GLOBAL_FUN(AFMakeNumber);\t\n\tJS_STATIC_GLOBAL_FUN(AFSimple_Calculate);\n\tJS_STATIC_GLOBAL_FUN(AFRange_Validate);\n\tJS_STATIC_GLOBAL_FUN(AFMergeChange);\n\tJS_STATIC_GLOBAL_FUN(AFParseDateEx);\n\tJS_STATIC_GLOBAL_FUN(AFExtractNums);\n\n\tJS_STATIC_DECLARE_GLOBAL_FUN();\n\t\npublic:\n\tstatic int\t\t\t\tParseStringInteger(const CFX_WideString & string,int nStart,int & nSkip, int nMaxStep);\n\tstatic CFX_WideString\tParseStringString(const CFX_WideString& string, int nStart, int& nSkip);\n\tstatic double\t\t\tMakeRegularDate(const CFX_WideString & value,const CFX_WideString & format, FX_BOOL& bWrongFormat);\n\tstatic CFX_WideString\tMakeFormatDate(double dDate,const CFX_WideString & format);\n\tstatic FX_BOOL\t\t\tConvertStringToNumber(FX_LPCWSTR swSource, double & dRet, FX_BOOL & bDot);\n\tstatic double\t\t\tParseStringToNumber(FX_LPCWSTR swSource);\n\tstatic double\t\t\tParseNormalDate(const CFX_WideString & value, FX_BOOL& bWrongFormat);\n\tstatic double           MakeInterDate(CFX_WideString strValue);\n\tstatic double\t\t\tParseNumber(FX_LPCWSTR swSource, FX_BOOL& bAllDigits, FX_BOOL& bDot, FX_BOOL& bSign, FX_BOOL& bKXJS);\n\npublic:\n\tstatic CFX_WideString\tStrLTrim(FX_LPCWSTR pStr);\n\tstatic CFX_WideString\tStrRTrim(FX_LPCWSTR pStr);\n\tstatic CFX_WideString\tStrTrim(FX_LPCWSTR pStr);\n\n\tstatic CFX_ByteString\tStrLTrim(FX_LPCSTR pStr);\n\tstatic CFX_ByteString\tStrRTrim(FX_LPCSTR pStr);\n\tstatic CFX_ByteString\tStrTrim(FX_LPCSTR pStr);\n\n\tstatic FX_BOOL\t\t\tIsNumber(FX_LPCSTR string);\n\tstatic FX_BOOL\t\t\tIsNumber(FX_LPCWSTR string);\n\n\tstatic FX_BOOL\t\t\tIsDigit(char ch);\n\tstatic FX_BOOL\t\t\tIsDigit(wchar_t ch);\n\tstatic FX_BOOL\t\t\tIsAlphabetic(wchar_t ch);\n\tstatic FX_BOOL\t\t\tIsAlphaNumeric(wchar_t ch);\n\n\tstatic FX_BOOL\t\t\tmaskSatisfied(wchar_t c_Change,wchar_t c_Mask);\n\tstatic FX_BOOL\t\t\tisReservedMaskChar(wchar_t ch);\n\n\tstatic double\t\t\tAF_Simple(FX_LPCWSTR sFuction, double dValue1, double dValue2);\n\tstatic CJS_Array\t\tAF_MakeArrayFromList(v8::Isolate* isolate, CJS_Value val);\n};\n\n#endif //_PUBLICMETHODS_H_\n"
  },
  {
    "path": "fpdfsdk/include/javascript/app.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _APP_H_\n#define _APP_H_\n\nclass CJS_Runtime;\n\n/* ---------------------------- TimerObj ---------------------------- */\n\nclass CJS_Timer;\n\nclass TimerObj : public CJS_EmbedObj\n{\npublic:\n\tTimerObj(CJS_Object* pJSObject);\n\tvirtual ~TimerObj();\n\t\npublic:\n\tvoid\t\t\tSetTimer(CJS_Timer* pTimer);\n\tCJS_Timer*\t\tGetTimer() const;\n\t\nprivate:\n\tCJS_Timer*\t\tm_pTimer;\n};\n\nclass CJS_TimerObj : public CJS_Object\n{\npublic:\n\tCJS_TimerObj(JSFXObject pObject) : CJS_Object(pObject) {}\n\tvirtual ~CJS_TimerObj(){}\n\t\n\tDECLARE_JS_CLASS(CJS_TimerObj);\n};\n\n\n// struct APP_MENUITEM_ARRAY;\n// \n// struct APP_MENUITEM\n// {\n// \tAPP_MENUITEM() : oSubMenu(NULL), cName(L\"\"), cReturn(L\"\"), bMarked(false), bEnabled(true)\n// \t{\n// \t}\n// \tCFX_WideString cName;\n// \tCFX_WideString cReturn;\n// \tAPP_MENUITEM_ARRAY* oSubMenu;\n// \tbool bMarked;\n// \tbool bEnabled;\n// };\n\n// struct APP_MENUITEM_ARRAY\n// {\n// \tAPP_MENUITEM_ARRAY() : m_hMenu(NULL), pContents(NULL), nSize(0)\n// \t{\n// \n// \t}\n// \tAPP_MENUITEM * pContents;\n// \tHMENU m_hMenu;\n// \tint\tnSize;\n// };\n\n// struct APP_MENU;\n// struct APP_MENU_ARRAY\n// {\n// \tAPP_MENU_ARRAY():\n//     pContent(NULL)\n// \t{\n// \t}\n// \n// \tAPP_MENU* pContent;\n// };\n\n// struct APP_MENU\n// {\n// \tAPP_MENU():bSubMenu(false), \n// \tSubMenuItems(NULL),\n// \tcwMenuItemName(L\"\"),\n// \thMenu(NULL),\n// \tiSize(0)\n// \t{\n// \n// \t}\n// \n// \tAPP_MENU(CFX_WideString &cwName):\n// \tcwMenuItemName(cwName),\n// \tbSubMenu(false),\n// \tSubMenuItems(NULL),\n// \thMenu(NULL),\n// \tiSize(0)\n// \t{\n// \n// \t}\n// \t\n// \tCFX_WideString cwMenuItemName;\n// \tbool bSubMenu;\t\n// \tAPP_MENU_ARRAY* SubMenuItems;\n// \tint iSize;\n// \tHMENU hMenu;\n// };\n\nclass app : public CJS_EmbedObj\n{\npublic:\n\tapp(CJS_Object * pJSObject);\n\tvirtual ~app();\n\npublic:\n\tFX_BOOL\t\t\t\t\t\tactiveDocs(OBJ_PROP_PARAMS);\n\tFX_BOOL\t\t\t\t\t\tcalculate(OBJ_PROP_PARAMS);\n\tFX_BOOL\t\t\t\t\t\tformsVersion(OBJ_PROP_PARAMS);\n\tFX_BOOL\t\t\t\t\t\tfs(OBJ_PROP_PARAMS);\n\tFX_BOOL\t\t\t\t\t\tfullscreen(OBJ_PROP_PARAMS);\n\tFX_BOOL\t\t\t\t\t\tlanguage(OBJ_PROP_PARAMS);\n\tFX_BOOL\t\t\t\t\t\tmedia(OBJ_PROP_PARAMS);\n\tFX_BOOL\t\t\t\t\t\tplatform(OBJ_PROP_PARAMS);\n\tFX_BOOL\t\t\t\t\t\truntimeHighlight(OBJ_PROP_PARAMS);\n\tFX_BOOL\t\t\t\t\t\tviewerType(OBJ_PROP_PARAMS);\n\tFX_BOOL\t\t\t\t\t\tviewerVariation(OBJ_PROP_PARAMS);\n\tFX_BOOL\t\t\t\t\t\tviewerVersion(OBJ_PROP_PARAMS);\t\n\n\n\tFX_BOOL\t\t\t\t\t\talert(OBJ_METHOD_PARAMS);\n\tFX_BOOL\t\t\t\t\t\tbeep(OBJ_METHOD_PARAMS);\n\tFX_BOOL\t\t\t\t\t\tbrowseForDoc(OBJ_METHOD_PARAMS);\n\tFX_BOOL\t\t\t\t\t\tclearInterval(OBJ_METHOD_PARAMS);\n\tFX_BOOL\t\t\t\t\t\tclearTimeOut(OBJ_METHOD_PARAMS);\n\tFX_BOOL\t\t\t\t\t\texecDialog(OBJ_METHOD_PARAMS);\n\tFX_BOOL\t\t\t\t\t\texecMenuItem(OBJ_METHOD_PARAMS);\n\tFX_BOOL\t\t\t\t\t\tfindComponent(OBJ_METHOD_PARAMS);\n\tFX_BOOL\t\t\t\t\t\tgoBack(OBJ_METHOD_PARAMS);\n\tFX_BOOL\t\t\t\t\t\tgoForward(OBJ_METHOD_PARAMS);\n\tFX_BOOL\t\t\t\t\t\tlaunchURL(OBJ_METHOD_PARAMS);\n\tFX_BOOL\t\t\t\t\t\tmailMsg(OBJ_METHOD_PARAMS);\n\tFX_BOOL\t\t\t\t\t\tnewFDF(OBJ_METHOD_PARAMS);\n\tFX_BOOL\t\t\t\t\t\tnewDoc(OBJ_METHOD_PARAMS);\n\tFX_BOOL\t\t\t\t\t\topenDoc(OBJ_METHOD_PARAMS);\n\tFX_BOOL\t\t\t\t\t\topenFDF(OBJ_METHOD_PARAMS);\n\tFX_BOOL\t\t\t\t\t\tpopUpMenuEx(OBJ_METHOD_PARAMS);\n\tFX_BOOL\t\t\t\t\t\tpopUpMenu(OBJ_METHOD_PARAMS);\n\tFX_BOOL\t\t\t\t\t\tresponse(OBJ_METHOD_PARAMS);\n\tFX_BOOL\t\t\t\t\t\tsetInterval(OBJ_METHOD_PARAMS);\n\tFX_BOOL\t\t\t\t\t\tsetTimeOut(OBJ_METHOD_PARAMS);\n\nprivate:\n//\tFX_DWORD\t\t\t\t\tAppGetTickCount(); \n\tvoid\t\t\t\t\t\tTimerProc(CJS_Timer* pTimer);\n\tvoid\t\t\t\t\t\tRunJsScript(CJS_Runtime * pRuntime,const CFX_WideString & wsScript);\n//\tvoid\t\t\t\t\t\tParsePopupMenuObj(APP_MENUITEM * ppMenuItem,JSObject * pObj);\n//\tvoid\t\t\t\t\t\tDeleteMenuItems(APP_MENUITEM_ARRAY * pMenuItems);\n// \tvoid\t\t\t\t\t\tAddMenuItem(APP_MENUITEM_ARRAY * pMenuItems, HMENU hMenu, MENUITEMINFO MenuItemInfo);\n// \tvoid\t\t\t\t\t\tInitMenuItemInfo(MENUITEMINFO& MenuItemInfo);\n// \tvoid\t\t\t\t\t\tDestroyPopUpMenu();\n\n// \tvoid\t\t\t\t\t\tParserMenuItem(APP_MENU* pHead, const CJS_Parameters&params);\n// \tvoid\t\t\t\t\t\tAddItemToMenu(APP_MENU* pHead, HMENU hMenu, MENUITEMINFO MenuItemInfo);\n// \tvoid\t\t\t\t\t\tDestroyMenuItems(APP_MENU* pHead);\n\npublic:\n\tstatic CFX_WideString\t\tSysPathToPDFPath(const CFX_WideString& sOldPath);\n\tstatic CFX_WideString\t\tPDFPathToSysPath(const CFX_WideString& sOldPath);\n\tstatic CFX_WideString\t\tRelativePathToSysPath(const CFX_WideString& sOldPath, const CFX_WideString& sFilePath);\n\n\nprivate:\n\n\tbool\t\t\t\t\t\tm_bCalculate;\t\n\tCJS_Runtime*\t\t\t\tm_pRuntime;\n\tbool\t\t\t\t\t\tm_bRuntimeHighLight;\n\n\tCFX_ArrayTemplate<CJS_Timer*>\tm_aTimer;\n//\tAPP_MENU*\t\t\t\t\tm_pMenuHead;\n\t\npublic:\n//\tstatic CReader_App* s_App;\n};\n\nclass CJS_App : public CJS_Object\n{\npublic:\n\tCJS_App(JSFXObject  pObject) : CJS_Object(pObject) {};\n\tvirtual ~CJS_App(void){};\n\n\tDECLARE_JS_CLASS(CJS_App);\n\n\tJS_STATIC_PROP(activeDocs, app);\n\tJS_STATIC_PROP(calculate, app);\n\tJS_STATIC_PROP(formsVersion, app);\n\tJS_STATIC_PROP(fs, app);\n\tJS_STATIC_PROP(fullscreen, app);\n\tJS_STATIC_PROP(language, app);\n\tJS_STATIC_PROP(media, app);\n\tJS_STATIC_PROP(platform, app);\n\tJS_STATIC_PROP(runtimeHighlight, app);\n\tJS_STATIC_PROP(viewerType, app);\n\tJS_STATIC_PROP(viewerVariation, app);\n\tJS_STATIC_PROP(viewerVersion, app);\t\n\n\tJS_STATIC_METHOD(alert, app);\n\tJS_STATIC_METHOD(beep, app);\n\tJS_STATIC_METHOD(browseForDoc, app);\n\tJS_STATIC_METHOD(clearInterval, app);\n\tJS_STATIC_METHOD(clearTimeOut, app);\n\tJS_STATIC_METHOD(execDialog, app);\n\tJS_STATIC_METHOD(execMenuItem, app);\n\tJS_STATIC_METHOD(findComponent, app);\n\tJS_STATIC_METHOD(goBack, app);\n\tJS_STATIC_METHOD(goForward, app);\n\tJS_STATIC_METHOD(launchURL, app);\n\tJS_STATIC_METHOD(mailMsg, app);\n\tJS_STATIC_METHOD(newFDF, app);\n\tJS_STATIC_METHOD(newDoc, app);\n\tJS_STATIC_METHOD(openDoc, app);\n\tJS_STATIC_METHOD(openFDF, app);\n\tJS_STATIC_METHOD(popUpMenuEx, app);\n\tJS_STATIC_METHOD(popUpMenu, app);\n\tJS_STATIC_METHOD(response, app);\n\tJS_STATIC_METHOD(setInterval, app);\n\tJS_STATIC_METHOD(setTimeOut, app);\n\n};\n\n#endif //_APP_H_\n"
  },
  {
    "path": "fpdfsdk/include/javascript/color.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _COLOR_H_\n#define _COLOR_H_\n\nclass color : public CJS_EmbedObj\n{\npublic:\n\tcolor(CJS_Object* pJSObject);\n\tvirtual ~color(void);\n\n\tFX_BOOL black(OBJ_PROP_PARAMS);\n\tFX_BOOL blue(OBJ_PROP_PARAMS);\n\tFX_BOOL cyan(OBJ_PROP_PARAMS);\t\n\tFX_BOOL dkGray(OBJ_PROP_PARAMS);\n\tFX_BOOL gray(OBJ_PROP_PARAMS);\n\tFX_BOOL green(OBJ_PROP_PARAMS);\n\tFX_BOOL ltGray(OBJ_PROP_PARAMS);\n\tFX_BOOL magenta(OBJ_PROP_PARAMS);\n\tFX_BOOL red(OBJ_PROP_PARAMS);\t\n\tFX_BOOL transparent(OBJ_PROP_PARAMS);\n\tFX_BOOL white(OBJ_PROP_PARAMS);\n\tFX_BOOL yellow(OBJ_PROP_PARAMS);\n\n\tFX_BOOL convert(OBJ_METHOD_PARAMS);\n\tFX_BOOL equal(OBJ_METHOD_PARAMS);\n\npublic:  \n\tstatic void\t\tConvertPWLColorToArray(const CPWL_Color& color, CJS_Array& array);\n\tstatic void\t\tConvertArrayToPWLColor(CJS_Array& array, CPWL_Color& color);\n\nprivate:\n\tCPWL_Color\t\tm_crTransparent;\n\tCPWL_Color\t\tm_crBlack;\n\tCPWL_Color\t\tm_crWhite;\n\tCPWL_Color\t\tm_crRed;\n\tCPWL_Color\t\tm_crGreen;\n\tCPWL_Color\t\tm_crBlue;\n\tCPWL_Color\t\tm_crCyan;\n\tCPWL_Color\t\tm_crMagenta;\n\tCPWL_Color\t\tm_crYellow;\n\tCPWL_Color\t\tm_crDKGray;\n\tCPWL_Color\t\tm_crGray;\n\tCPWL_Color\t\tm_crLTGray;\n};\n\nclass CJS_Color : public CJS_Object\n{\npublic:\n\tCJS_Color(JSFXObject  pObject) : CJS_Object(pObject) {};\n\tvirtual ~CJS_Color(void){};\n\n\tDECLARE_JS_CLASS(CJS_Color);\n\n\tJS_STATIC_PROP(black, color);\n\tJS_STATIC_PROP(blue, color);\n\tJS_STATIC_PROP(cyan, color);\t\n\tJS_STATIC_PROP(dkGray, color);\n\tJS_STATIC_PROP(gray, color);\n\tJS_STATIC_PROP(green, color);\n\tJS_STATIC_PROP(ltGray, color);\n\tJS_STATIC_PROP(magenta, color);\n\tJS_STATIC_PROP(red, color);\t\n\tJS_STATIC_PROP(transparent, color);\n\tJS_STATIC_PROP(white, color);\n\tJS_STATIC_PROP(yellow, color);\n\n\tJS_STATIC_METHOD(convert,color);\n\tJS_STATIC_METHOD(equal,color);\n\n};\n\n#endif //_COLOR_H_\n\n"
  },
  {
    "path": "fpdfsdk/include/javascript/console.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _CONSOLE_H_\n#define _CONSOLE_H_\n\nclass console : public CJS_EmbedObj\n{\npublic:\n\tconsole(CJS_Object* pJSObject);\n\tvirtual ~console(void);\n\npublic:\n\tFX_BOOL clear(OBJ_METHOD_PARAMS);\n\tFX_BOOL hide(OBJ_METHOD_PARAMS);\n\tFX_BOOL println(OBJ_METHOD_PARAMS);\n\tFX_BOOL show(OBJ_METHOD_PARAMS);\n};\n\nclass CJS_Console : public CJS_Object  \n{\npublic:\n\tCJS_Console(JSFXObject pObject) : CJS_Object(pObject) {};\n\tvirtual ~CJS_Console(void){};\n\n\tDECLARE_JS_CLASS(CJS_Console);\n\n\tJS_STATIC_METHOD(clear, console);\n\tJS_STATIC_METHOD(hide, console);\n\tJS_STATIC_METHOD(println, console);\n\tJS_STATIC_METHOD(show, console);\n};\n\n#endif //_CONSOLE_H_\n\n"
  },
  {
    "path": "fpdfsdk/include/javascript/event.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _EVENT_H_\n#define _EVENT_H_\n\nclass event : public CJS_EmbedObj\n{\npublic:\n\tevent(CJS_Object * pJSObject);\n\tvirtual ~event(void);\n\npublic:\n\tFX_BOOL change(OBJ_PROP_PARAMS);\n\tFX_BOOL changeEx(OBJ_PROP_PARAMS);\n\tFX_BOOL commitKey(OBJ_PROP_PARAMS);\n\tFX_BOOL fieldFull(OBJ_PROP_PARAMS);\n\tFX_BOOL keyDown(OBJ_PROP_PARAMS);\n\tFX_BOOL modifier(OBJ_PROP_PARAMS);\n\tFX_BOOL name(OBJ_PROP_PARAMS);\n\tFX_BOOL rc(OBJ_PROP_PARAMS);\n\tFX_BOOL richChange(OBJ_PROP_PARAMS);\n\tFX_BOOL richChangeEx(OBJ_PROP_PARAMS);\n\tFX_BOOL richValue(OBJ_PROP_PARAMS);\n\tFX_BOOL selEnd(OBJ_PROP_PARAMS);\n\tFX_BOOL selStart(OBJ_PROP_PARAMS);\n\tFX_BOOL shift(OBJ_PROP_PARAMS);\n\tFX_BOOL source(OBJ_PROP_PARAMS);\n\tFX_BOOL target(OBJ_PROP_PARAMS);\n\tFX_BOOL targetName(OBJ_PROP_PARAMS);\n\tFX_BOOL type(OBJ_PROP_PARAMS);\n\tFX_BOOL value(OBJ_PROP_PARAMS);\n\tFX_BOOL willCommit(OBJ_PROP_PARAMS);\n\n};\n\nclass CJS_Event : public CJS_Object\n{\npublic:\n\tCJS_Event(JSFXObject  pObject) : CJS_Object(pObject) {};\n\tvirtual ~CJS_Event(void){};\n\n\tDECLARE_JS_CLASS(CJS_Event);\n\n\tJS_STATIC_PROP(change, event);\n\tJS_STATIC_PROP(changeEx, event);\n\tJS_STATIC_PROP(commitKey, event);\n\tJS_STATIC_PROP(fieldFull, event);\n\tJS_STATIC_PROP(keyDown, event);\n\tJS_STATIC_PROP(modifier, event);\n\tJS_STATIC_PROP(name, event);\n\tJS_STATIC_PROP(rc, event);\n\tJS_STATIC_PROP(richChange, event);\n\tJS_STATIC_PROP(richChangeEx, event);\n\tJS_STATIC_PROP(richValue, event);\n\tJS_STATIC_PROP(selEnd, event);\n\tJS_STATIC_PROP(selStart, event);\n\tJS_STATIC_PROP(shift, event);\n\tJS_STATIC_PROP(source, event);\n\tJS_STATIC_PROP(target, event);\n\tJS_STATIC_PROP(targetName, event);\n\tJS_STATIC_PROP(type, event);\n\tJS_STATIC_PROP(value, event);\n\tJS_STATIC_PROP(willCommit, event);\n};\n\n#endif //_EVENT_H_\n"
  },
  {
    "path": "fpdfsdk/include/javascript/global.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _GLOBAL_H_\n#define _GLOBAL_H_\n\nclass CJS_GlobalData;\n\nstruct js_global_data\n{\n\tjs_global_data()\n\t{\n\t\tnType = 0;\n\t\tdData = 0;\n\t\tbData = FALSE;\n\t\tsData = \"\";\n\t\tbPersistent = FALSE;\n\t\tbDeleted = FALSE;\n\t}\n\n\t~js_global_data()\n\t{\n\t\tpData.Reset();\n\t}\n\tint\t\t\t\t\tnType; //0:int 1:bool 2:string 3:obj\n\tdouble\t\t\t\tdData;\n\tbool\t\t\t\tbData;\n\tCFX_ByteString\t\tsData;\n\tv8::Persistent<v8::Object>  pData;\n\tbool\t\t\t\tbPersistent;\n\tbool\t\t\t\tbDeleted;\n};\n\nclass global_alternate : public CJS_EmbedObj\n{\npublic:\n\tglobal_alternate(CJS_Object* pJSObject);\n\tvirtual ~global_alternate();\n\npublic:\n\tFX_BOOL\t\t\t\t\t\tsetPersistent(OBJ_METHOD_PARAMS);\n\npublic:\n\tFX_BOOL\t\t\t\t\t\tQueryProperty(FX_LPCWSTR propname);\n\tFX_BOOL\t\t\t\t\t\tDoProperty(IFXJS_Context* cc, FX_LPCWSTR propname, CJS_PropValue & vp, JS_ErrorString & sError);\n\tFX_BOOL\t\t\t\t\t\tDelProperty(IFXJS_Context* cc, FX_LPCWSTR propname, JS_ErrorString & sError);\n\n\tvoid\t\t\t\t\t\tInitial(CPDFDoc_Environment* pApp);\n\nprivate:\n\tvoid\t\t\t\t\t\tUpdateGlobalPersistentVariables();\n\tvoid\t\t\t\t\t\tCommitGlobalPersisitentVariables();\n\tvoid\t\t\t\t\t\tDestroyGlobalPersisitentVariables();\n\tFX_BOOL\t\t\t\t\t\tSetGlobalVariables(FX_LPCSTR propname, int nType, \n\t\t\t\t\t\t\t\t\tdouble dData, bool bData, const CFX_ByteString& sData, JSObject pData, bool bDefaultPersistent);\n\n\tvoid\t\t\t\t\t\tObjectToArray(v8::Handle<v8::Object> pObj, CJS_GlobalVariableArray& array);\n\tvoid\t\t\t\t\t\tPutObjectProperty(v8::Handle<v8::Object> obj, CJS_KeyValue* pData);\n\nprivate:\n\tCFX_MapByteStringToPtr\t\tm_mapGlobal;\n\tCFX_WideString\t\t\t\tm_sFilePath;\n\tCJS_GlobalData*\t\t\t\tm_pGlobalData;\n\tCPDFDoc_Environment*\t\t\t\tm_pApp;\n};\n\n\nclass CJS_Global : public CJS_Object\n{\npublic:\n\tCJS_Global(JSFXObject pObject) : CJS_Object(pObject) {};\n\tvirtual ~CJS_Global(void){};\n\n\tvirtual FX_BOOL\tInitInstance(IFXJS_Context* cc);\t\n\n\tDECLARE_SPECIAL_JS_CLASS(CJS_Global);\n\n\tJS_SPECIAL_STATIC_METHOD(setPersistent, global_alternate, global);\n\n};\n\n#endif //_GLOBAL_H_\n"
  },
  {
    "path": "fpdfsdk/include/javascript/report.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _REPORT_H_\n#define _REPORT_H_\n\nclass Report : public CJS_EmbedObj\n{\npublic:\n\tReport(CJS_Object * pJSObject);\n\tvirtual ~Report();\n\npublic:\n\tFX_BOOL save(OBJ_METHOD_PARAMS);\n\tFX_BOOL writeText(OBJ_METHOD_PARAMS);\n};\n\nclass CJS_Report : public CJS_Object\n{\npublic:\n\tCJS_Report(JSFXObject  pObject) : CJS_Object(pObject){};\n\tvirtual ~CJS_Report(){};\n\npublic:\n\tDECLARE_JS_CLASS(CJS_Report);\n\n\tJS_STATIC_METHOD(save, Report)\n\tJS_STATIC_METHOD(writeText, Report);\n};\n\n#endif //_REPORT_H_\n\n"
  },
  {
    "path": "fpdfsdk/include/javascript/resource.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#define IDD_JS_MSGBOX                   25600\n#define IDD_RESPONSE                    25601\n#define IDC_JS_MSG_TEXT                 25602\n#define ID_JS_MSG_OK                    25603\n#define ID_JS_MSG_CANCEL                25604\n#define IDC_JS_MSG_ICON                 25605\n#define ID_JS_MSG_YES                   25606\n#define ID_JS_MSG_NO                    25607\n#define IDC_JS_QUESTION                 25608\n#define ID_JS_OK                        25609\n#define ID_JS_CANCEL                    25610\n#define IDC_JS_ANSWER                   25611\n#define IDC_JS_EDIT                     25612\n#define IDS_STRING_JSALERT              25613\n#define IDS_STRING_JSPARAMERROR         25614\n#define IDS_STRING_JSAFNUMBER_KEYSTROKE 25615\n#define IDS_STRING_JSINPUTERROR         25616\n#define IDS_STRING_JSPARAM_TOOLONG      25617\n#define IDS_STRING_JSPARSEDATE          25618\n#define IDS_STRING_JSRANGE1             25619\n#define IDS_STRING_JSRANGE2             25620\n#define IDS_STRING_JSRANGE3             25621\n#define IDS_STRING_JSRANGE4             25622\n#define IDS_STRING_FILEOPENFAIL         25623\n#define IDS_STRING_JSATTENTION          25624\n#define IDS_STRING_JSSUBMITS            25625\n#define IDS_STRING_JSSUBMITF            25626\n#define IDS_STRING_NOTSUPPORT           25627\n#define IDS_STRING_JSBUSY               25628\n#define IDS_STRING_JSEVENT              25629\n#define IDS_STRING_RUN                  25630\n#define IDS_STRING_UNHANDLED            25631\n#define IDS_STRING_JSPRINT1             25632\n#define IDS_STRING_JSPRINT2             25633\n#define IDS_STRING_LAUNCHURL            25634\n#define IDS_JSPARAM_INCORRECT           25635\n#define IDD_JS_CONSOLE                  25636\n#define IDS_STRING_SAFEMODEL            25636\n#define IDC_EDTSCRIPT                   25637\n#define IDC_BTNCLEAR                    25638\n#define IDC_EDTOUTPUT                   25639\n#define IDC_CHECK_TIPS                  25640\n#define IDC_BTNRUN                      25641\n\n\n\nstatic CFX_WideString JSGetStringFromID(CJS_Context* pContext, FX_UINT ID)\n{\n\tswitch(ID)\n\t{                  \n\tcase IDS_STRING_JSALERT:\n\t\treturn L\"Alert\";\n\tcase IDS_STRING_JSPARAMERROR:\n        return L\"The amount of parameters is not correct !\";\t\n\tcase IDS_STRING_JSAFNUMBER_KEYSTROKE:\n\t\treturn L\"The input value is invalid.\";\n\tcase\tIDS_STRING_JSINPUTERROR:\n        return L\"Input error !\";\n\tcase\tIDS_STRING_JSPARAM_TOOLONG:\n\t\treturn L\"The value you are going to input is too long.\";\n\tcase\tIDS_STRING_JSPARSEDATE:\n\t\treturn L\"The input string can't be parsed to a valid date time (%s).\";\n\tcase\tIDS_STRING_JSRANGE1:\n\t\treturn L\"Invalid value: must be greater or equal to %s and less than or equal to %s.\";\t\n\tcase\tIDS_STRING_JSRANGE2:\n\t\treturn L\"Invalid value: must be greater or equal to %s.\";\n\tcase\tIDS_STRING_JSRANGE3:\n\t\treturn L\"Invalid value: must be less than or equal to %s.\";\n\tcase\tIDS_STRING_JSRANGE4:\n\t\treturn L\"Range Error\";\t\n\tcase\tIDS_STRING_FILEOPENFAIL:\n        return L\"Opening file failed.\";\n\tcase\tIDS_STRING_JSATTENTION:\n\t\treturn L\"Attention\";\t\n\tcase\tIDS_STRING_JSSUBMITS:\n\t\treturn L\"Submit form successfully!\";\n\tcase\tIDS_STRING_JSSUBMITF:\n\t\treturn L\"Submit form failed!\";\t\n\tcase\tIDS_STRING_NOTSUPPORT:\n\t\treturn L\"Not supported.\";\n\tcase\tIDS_STRING_JSBUSY:\n\t\treturn L\"System is busy!\";\t\n\tcase\tIDS_STRING_JSEVENT:\n\t\treturn L\"The event of the formfield exists!\";\t\n\tcase\tIDS_STRING_RUN:\n\t\treturn L\"It runs successfully.\";\n\tcase\tIDS_STRING_UNHANDLED:\n\t\treturn L\"An unhandled error!\";\n\tcase\tIDS_STRING_JSPRINT1:\n\t\treturn L\"The second parameter can't convert to Date!\";\n\tcase\tIDS_STRING_JSPRINT2:\n\t\treturn L\"The second parameter isn't a valid Date!\";\n\tcase\tIDS_STRING_LAUNCHURL:\n\t\treturn L\"The Document is trying to connect to \\r\\n%s\\r\\nIf you trust the site, choose OK. If you don't trust the site, choose Cancel.\";\t\n\tcase\tIDS_JSPARAM_INCORRECT:\n\t\treturn L\"The parameter you inputted is incorrect!\";\n\tcase\tIDS_STRING_SAFEMODEL:\n\t\treturn L\"Secure reading mode\";\n\tdefault:\n\t\treturn L\"\";\n\n\t}\n}\n\n"
  },
  {
    "path": "fpdfsdk/include/javascript/util.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _UTIL_H_\n#define _UTIL_H_\n\nclass util : public CJS_EmbedObj\n{\npublic:\n\tutil(CJS_Object * pJSObject);\n\tvirtual ~util(void);\n\npublic:\n\tFX_BOOL printd(OBJ_METHOD_PARAMS);\n\tFX_BOOL printf(OBJ_METHOD_PARAMS);\n\tFX_BOOL printx(OBJ_METHOD_PARAMS);\n\tFX_BOOL scand(OBJ_METHOD_PARAMS);\n\tFX_BOOL byteToChar(OBJ_METHOD_PARAMS);\n\npublic:\n\tstatic void\t\tprintd(const std::wstring &cFormat,CJS_Date Date,bool bXFAPicture, std::wstring &cPurpose);\n\tstatic void\t\tprintx(const std::string &cFormat,const std::string &cSource, std::string &cPurpose);\n\tstatic int\t\tParstDataType(std::wstring* sFormat);\n};\n\nclass CJS_Util : public CJS_Object\n{\npublic:\n\tCJS_Util(JSFXObject  pObject) : CJS_Object(pObject) {};\n\tvirtual ~CJS_Util(void){};\n\n\tDECLARE_JS_CLASS(CJS_Util);\n\n\tJS_STATIC_METHOD(printd, util);\n\tJS_STATIC_METHOD(printf, util);\n\tJS_STATIC_METHOD(printx, util);\n\tJS_STATIC_METHOD(scand, util);\n\tJS_STATIC_METHOD(byteToChar, util);\n};\n\nFX_INT64 FX_atoi64(const char *nptr);\n#endif //_UTIL_H_\n"
  },
  {
    "path": "fpdfsdk/include/jsapi/fxjs_v8.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef FXJSAPI_H\n#define FXJSAPI_H\n\n//#include <v8.h>\n\nenum FXJSOBJTYPE\n{\n\tJS_DYNAMIC = 0,\n\tJS_STATIC = 1,\n};\n\nenum FXJSVALUETYPE\n{\n\tVT_unknown,\n\tVT_string,\n\tVT_number,\n\tVT_boolean,\n\tVT_date,\n\tVT_object,\n\tVT_fxobject,\n\tVT_null,\n\tVT_undefined\n};\n\nstruct FXJSErr\n{\n\tconst wchar_t* message;\t\n    const wchar_t* srcline;\t\n    unsigned linnum;\n};\n\n/* --------------------------------------------- API --------------------------------------------- */\n\ntypedef v8::Isolate IJS_Runtime;\nclass IFXJS_Context;\nclass IFXJS_Runtime;\n\n\n#ifndef JSCRIPT_ARGS\n#define JSCRIPT_ARGS\n\n#define JS_PROPGET_ARGS\t\t\tv8::Local<v8::String> property,const v8::PropertyCallbackInfo<v8::Value>& info\n#define JS_PROPPUT_ARGS\t\t\tv8::Local<v8::String> property,v8::Local<v8::Value> value,const v8::PropertyCallbackInfo<void>& info\n#define JS_METHOD_ARGS\t\t\tconst v8::FunctionCallbackInfo<v8::Value>& info\n#define JS_CONSTRUCTOR_ARGS\t\tIFXJS_Context* cc, v8::Handle<v8::Object> obj, v8::Handle<v8::Object> global\n#define JS_DESTRUCTOR_ARGS\t\tv8::Handle<v8::Object> obj\n\n#define JS_PROPQUERY_ARGS\t\tv8::Local<v8::String> property,const v8::PropertyCallbackInfo<v8::Integer>& info\n#define JS_NAMED_PROPGET_ARGS\tJS_PROPGET_ARGS\t\t\t\t\t\n#define JS_NAMED_PROPPUT_ARGS\tv8::Local<v8::String> property,v8::Local<v8::Value> value,const v8::PropertyCallbackInfo<v8::Value>& info\n#define JS_PROPDEL_ARGS\t\t\tv8::Local<v8::String> property,const v8::PropertyCallbackInfo<v8::Boolean>& info\n\ntypedef unsigned (*LP_CONSTRUCTOR)(JS_CONSTRUCTOR_ARGS);\ntypedef unsigned (*LP_DESTRUCTOR)(JS_DESTRUCTOR_ARGS);\n\n#endif\n\nint\t\t\t\t\t\t\t\tJS_DefineObj(IJS_Runtime* pJSRuntime, const wchar_t* sObjName, FXJSOBJTYPE eObjType, LP_CONSTRUCTOR pConstructor, LP_DESTRUCTOR pDestructor, unsigned bApplyNew);\nint\t\t\t\t\t\t\t\tJS_DefineObjMethod(IJS_Runtime* pJSRuntime, int nObjDefnID, const wchar_t* sMethodName, v8::FunctionCallback pMethodCall, unsigned nParamNum);\nint\t\t\t\t\t\t\t\tJS_DefineObjProperty(IJS_Runtime* pJSRuntime, int nObjDefnID, const wchar_t* sPropName, v8::AccessorGetterCallback pPropGet, v8::AccessorSetterCallback pPropPut);\nint\t\t\t\t\t\t\t\tJS_DefineObjAllProperties(IJS_Runtime* pJSRuntime, int nObjDefnID, v8::NamedPropertyQueryCallback pPropQurey, v8::NamedPropertyGetterCallback pPropGet, v8::NamedPropertySetterCallback pPropPut, v8::NamedPropertyDeleterCallback pPropDel);\nint\t\t\t\t\t\t\t\tJS_DefineObjConst(IJS_Runtime* pJSRuntime, int nObjDefnID, const wchar_t* sConstName, v8::Handle<v8::Value> pDefault);\nint\t\t\t\t\t\t\t\tJS_DefineGlobalMethod(IJS_Runtime* pJSRuntime, const wchar_t* sMethodName, v8::FunctionCallback pMethodCall, unsigned nParamNum);\nint\t\t\t\t\t\t\t\tJS_DefineGlobalConst(IJS_Runtime* pJSRuntime, const wchar_t* sConstName, v8::Handle<v8::Value> pDefault);\n\nvoid\t\t\t\t\t\t\tJS_InitialRuntime(IJS_Runtime* pJSRuntime,IFXJS_Runtime* pFXRuntime, IFXJS_Context* context, v8::Persistent<v8::Context>& v8PersistentContext);\nvoid\t\t\t\t\t\t\tJS_ReleaseRuntime(IJS_Runtime* pJSRuntime, v8::Persistent<v8::Context>& v8PersistentContext);\nvoid\t\t\t\t\t\t\tJS_Initial(); \nvoid\t\t\t\t\t\t\tJS_Release();\nint\t\t\t\t\t\t\t\tJS_Parse(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, const wchar_t* script, long length, FXJSErr* perror);\nint\t\t\t\t\t\t\t\tJS_Execute(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, const wchar_t* script, long length, FXJSErr* perror);\nv8::Handle<v8::Object>\t\t\tJS_NewFxDynamicObj(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, int nObjDefnID);\nv8::Handle<v8::Object>\t\t\tJS_GetStaticObj(IJS_Runtime* pJSRuntime, int nObjDefnID);\nvoid\t\t\t\t\t\t\tJS_SetThisObj(IJS_Runtime* pJSRuntime, int nThisObjID);\nv8::Handle<v8::Object>\t\t\tJS_GetThisObj(IJS_Runtime * pJSRuntime);\nint\t\t\t\t\t\t\t\tJS_GetObjDefnID(v8::Handle<v8::Object> pObj);\nIJS_Runtime*\t\t\t\t\tJS_GetRuntime(v8::Handle<v8::Object> pObj);\nint\t\t\t\t\t\t\t\tJS_GetObjDefnID(IJS_Runtime * pJSRuntime, const wchar_t* pObjName);\nvoid\t\t\t\t\t\t\tJS_Error(v8::Value * pError,const wchar_t * main,const wchar_t * sub);\nunsigned\t\t\t\t\t\tJS_CalcHash(const wchar_t* main, unsigned nLen);\nunsigned\t\t\t\t\t\tJS_CalcHash(const wchar_t* main);\nconst wchar_t*\t\t\t\t\tJS_GetTypeof(v8::Handle<v8::Value> pObj);\nconst wchar_t*\t\t\t\t\tJS_GetClassname(v8::Handle<v8::Object> pObj);\nvoid\t\t\t\t\t\t\tJS_SetPrivate(IJS_Runtime* pJSRuntime, v8::Handle<v8::Object> pObj, void* p);\nvoid*\t\t\t\t\t\t\tJS_GetPrivate(IJS_Runtime* pJSRuntime, v8::Handle<v8::Object> pObj);\nvoid\t\t\t\t\t\t\tJS_SetPrivate(v8::Handle<v8::Object> pObj, void* p);\nvoid*\t\t\t\t\t\t\tJS_GetPrivate(v8::Handle<v8::Object> pObj);\nvoid\t\t\t\t\t\t\tJS_FreePrivate(v8::Handle<v8::Object> pObj);\nv8::Handle<v8::Value>\t\t\tJS_GetObjectValue(v8::Handle<v8::Object> pObj);\nv8::Handle<v8::Value>\t\t\tJS_GetObjectElement(IJS_Runtime* pJSRuntime, v8::Handle<v8::Object> pObj,const wchar_t* PropertyName);\nv8::Handle<v8::Array>\t\t\tJS_GetObjectElementNames(v8::Handle<v8::Object> pObj);\nvoid\t\t\t\t\t\t\tJS_PutObjectString(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, const wchar_t* sValue);\nvoid\t\t\t\t\t\t\tJS_PutObjectNumber(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, int nValue);\nvoid\t\t\t\t\t\t\tJS_PutObjectNumber(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, float fValue);\nvoid\t\t\t\t\t\t\tJS_PutObjectNumber(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, double dValue);\nvoid\t\t\t\t\t\t\tJS_PutObjectBoolean(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, bool bValue);\nvoid\t\t\t\t\t\t\tJS_PutObjectObject(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, v8::Handle<v8::Object> pPut);\nvoid\t\t\t\t\t\t\tJS_PutObjectNull(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName);\nunsigned\t\t\t\t\t\tJS_PutArrayElement(v8::Handle<v8::Array> pArray,unsigned index,v8::Handle<v8::Value> pValue,FXJSVALUETYPE eType);\nv8::Handle<v8::Value>\t\t\tJS_GetArrayElemnet(v8::Handle<v8::Array> pArray,unsigned index);\nunsigned\t\t\t\t\t\tJS_GetArrayLength(v8::Handle<v8::Array> pArray);\nv8::Handle<v8::Value>\t\t\tJS_GetListValue(v8::Handle<v8::Value> pList, int index);\n\n\nv8::Handle<v8::Array>\t\t\tJS_NewArray(IJS_Runtime* pJSRuntime);\nv8::Handle<v8::Value>\t\t\tJS_NewNumber(IJS_Runtime* pJSRuntime,int number);\nv8::Handle<v8::Value>\t\t\tJS_NewNumber(IJS_Runtime* pJSRuntime,double number);\nv8::Handle<v8::Value>\t\t\tJS_NewNumber(IJS_Runtime* pJSRuntime,float number);\nv8::Handle<v8::Value>\t\t\tJS_NewBoolean(IJS_Runtime* pJSRuntime,bool b);\nv8::Handle<v8::Value>\t\t\tJS_NewObject(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj);\nv8::Handle<v8::Value>\t\t\tJS_NewObject2(IJS_Runtime* pJSRuntime,v8::Handle<v8::Array> pObj);\nv8::Handle<v8::Value>\t\t\tJS_NewString(IJS_Runtime* pJSRuntime,const wchar_t* string);\nv8::Handle<v8::Value>\t\t\tJS_NewString(IJS_Runtime* pJSRuntime,const wchar_t* string, unsigned nLen);\nv8::Handle<v8::Value>\t\t\tJS_NewNull();\nv8::Handle<v8::Value>\t\t\tJS_NewDate(IJS_Runtime* pJSRuntime,double d);\nv8::Handle<v8::Value>\t\t\tJS_NewValue(IJS_Runtime* pJSRuntime);\n\n\nint\t\t\t\t\t\t\t\tJS_ToInt32(v8::Handle<v8::Value> pValue);\nbool\t\t\t\t\t\t\tJS_ToBoolean(v8::Handle<v8::Value> pValue);\ndouble\t\t\t\t\t\t\tJS_ToNumber(v8::Handle<v8::Value> pValue);\nv8::Handle<v8::Object>\t\t\tJS_ToObject(v8::Handle<v8::Value> pValue);\nCFX_WideString\t\t\t\t\tJS_ToString(v8::Handle<v8::Value> pValue);\nv8::Handle<v8::Array>\t\t\tJS_ToArray(v8::Handle<v8::Value> pValue);\nvoid\t\t\t\t\t\t\tJS_ValueCopy(v8::Handle<v8::Value>& pTo, v8::Handle<v8::Value> pFrom);\n\ndouble\t\t\t\t\t\t\tJS_GetDateTime();\nint\t\t\t\t\t\t\t\tJS_GetYearFromTime(double dt);\nint\t\t\t\t\t\t\t\tJS_GetMonthFromTime(double dt);\nint\t\t\t\t\t\t\t\tJS_GetDayFromTime(double dt);\nint\t\t\t\t\t\t\t\tJS_GetHourFromTime(double dt);\nint\t\t\t\t\t\t\t\tJS_GetMinFromTime(double dt);\nint\t\t\t\t\t\t\t\tJS_GetSecFromTime(double dt);\ndouble\t\t\t\t\t\t\tJS_DateParse(const wchar_t* string);\ndouble\t\t\t\t\t\t\tJS_MakeDay(int nYear, int nMonth, int nDay);\ndouble\t\t\t\t\t\t\tJS_MakeTime(int nHour, int nMin, int nSec, int nMs);\ndouble\t\t\t\t\t\t\tJS_MakeDate(double day, double time);\nbool\t\t\t\t\t\t\tJS_PortIsNan(double d);\ndouble\t\t\t\t\t\t\tJS_LocalTime(double d);\n\n#endif //FXJSAPI_H\n"
  },
  {
    "path": "fpdfsdk/include/pdfwindow/IPDFWindow.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _IPDFWINDOW_H_\n#define _IPDFWINDOW_H_\n\n#include \"PWL_Wnd.h\"\n#include \"PWL_EditCtrl.h\"\n#include \"PWL_Edit.h\"\n#include \"PWL_ListBox.h\"\n#include \"PWL_ComboBox.h\"\n#include \"PWL_Button.h\"\n#include \"PWL_SpecialButton.h\"\n#include \"PWL_Icon.h\"\n#include \"PWL_Label.h\"\n#include \"PWL_ListCtrl.h\"\n#include \"PWL_Caret.h\"\n#include \"PWL_ScrollBar.h\"\n#include \"PWL_Note.h\"\n#include \"PWL_IconList.h\"\n#include \"PWL_FontMap.h\"\n#include \"PWL_Signature.h\"\n#include \"PWL_Utils.h\"\n\n#endif //_IPDFWINDOW_H_\n"
  },
  {
    "path": "fpdfsdk/include/pdfwindow/PDFWindow.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _PDFWINDOW_H_\n#define _PDFWINDOW_H_\n\n// #define VC_EXTRALEAN\n// #include <afxext.h>\n// #include <afxcmn.h>\n\n#ifndef _INC_PDFAPI\n\t#define _INC_PDFAPI\n \n\t#include \"../../../core/include/fpdfapi/fpdf_module.h\" \n\t#include \"../../../core/include/fpdfdoc/fpdf_doc.h\" \n\t#include \"../../../core/include/fpdfdoc/fpdf_vt.h\" \n\t#include \"../../../core/include/fxcrt/fx_xml.h\" \n\n\t#include \"../fpdf_fwlevent.h\"\n\t#include \"../fx_systemhandler.h\"\n#endif\n\n#include \"../fxedit/fx_edit.h\"\n#endif\n\n"
  },
  {
    "path": "fpdfsdk/include/pdfwindow/PWL_Button.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _PWL_BUTTON_H_\n#define _PWL_BUTTON_H_\n\nclass PWL_CLASS CPWL_Button : public CPWL_Wnd  \n{\npublic:\n\tCPWL_Button();\n\tvirtual ~CPWL_Button();\n\npublic:\n\tvirtual CFX_ByteString\t\tGetClassName() const;\n\tvirtual void\t\t\t\tOnCreate(PWL_CREATEPARAM & cp);\n\n\tvirtual FX_BOOL\t\t\t\tOnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\tOnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);\n\nprotected:\n\tFX_BOOL\t\t\t\t\t\tm_bMouseDown;\t\n};\n\n#endif // !defined(AFX_PWL_BUTTON_H__5A6080AA_33C5_4FC9_91FC_D9644C41120A__INCLUDED_)\n\n"
  },
  {
    "path": "fpdfsdk/include/pdfwindow/PWL_Caret.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _PWL_CARET_H_\n#define _PWL_CARET_H_\n\nstruct PWL_CARET_INFO\n{\npublic:\n\tPWL_CARET_INFO() : bVisible(FALSE), ptHead(0,0), ptFoot(0,0)\n\t{\t\t\n\t}\n\n\tFX_BOOL\t\t\t\t\t\tbVisible;\n\tCPDF_Point\t\t\t\t\tptHead;\n\tCPDF_Point\t\t\t\t\tptFoot;\n};\n\n\nclass CPWL_Caret : public CPWL_Wnd  \n{\npublic:\n\tCPWL_Caret();\n\tvirtual ~CPWL_Caret();\npublic:\n\tvirtual CFX_ByteString\t\tGetClassName() const;\n\tvirtual void\t\t\t\tGetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);\n\tvirtual void\t\t\t\tDrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);\n\tvirtual void\t\t\t\tInvalidateRect(CPDF_Rect * pRect = NULL);\n\n\tvirtual void\t\t\t\tSetVisible(FX_BOOL bVisible) {}\n\n\tvirtual\tvoid\t\t\t\tTimerProc();\n\n\tvoid\t\t\t\t\t\tSetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & ptFoot);\t\n\tCFX_ByteString\t\t\t\tGetCaretAppearanceStream(const CPDF_Point & ptOffset);\n\nprivate:\n\tvoid\t\t\t\t\t\tGetCaretApp(CFX_ByteTextBuf & sAppStream,const CPDF_Point & ptOffset);\n\tCPDF_Rect\t\t\t\t\tGetCaretRect() const;\n\n\tFX_BOOL\t\t\t\t\t\tm_bFlash;\n\tCPDF_Point\t\t\t\t\tm_ptHead;\n\tCPDF_Point\t\t\t\t\tm_ptFoot;\n\tFX_FLOAT\t\t\t\t\tm_fWidth;\n\tFX_INT32\t\t\t\t\t\tm_nDelay;\n\npublic:\n\tvoid\t\t\t\t\t\tSetInvalidRect(CPDF_Rect rc) {m_rcInvalid = rc;}\nprivate:\n\tCPDF_Rect\t\t\t\t\tm_rcInvalid;\n};\n\n#endif // !defined(AFX_PWL_CARET_H__6A729612_4173_4B65_BCAB_7C6C850ECA47__INCLUDED_)\n\n"
  },
  {
    "path": "fpdfsdk/include/pdfwindow/PWL_ComboBox.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _PWL_COMBOBOX_H_\n#define _PWL_COMBOBOX_H_\n\nclass CPWL_CBEdit : public CPWL_Edit\n{\npublic:\n\tCPWL_CBEdit(){};\n\tvirtual ~CPWL_CBEdit(){};\n};\n\nclass PWL_CLASS CPWL_CBListBox : public CPWL_ListBox\n{\npublic:\n\tCPWL_CBListBox(){};\n\tvirtual ~CPWL_CBListBox(){};\n\npublic:\n\tvirtual FX_BOOL\t\t\t\tOnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);\n\n\tvirtual FX_BOOL\t\t\t\tOnKeyDown(FX_WORD nChar, FX_BOOL & bExit, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\tOnChar(FX_WORD nChar, FX_BOOL & bExit, FX_DWORD nFlag);\n};\n\n#define PWL_COMBOBOX_BUTTON_WIDTH\t\t13\n\nclass CPWL_CBButton : public CPWL_Wnd\n{\npublic:\n\tCPWL_CBButton(){};\n\tvirtual ~CPWL_CBButton(){};\n\npublic:\n\tvirtual void\t\t\t\tGetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);\n\tvirtual void\t\t\t\tDrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);\n\n\tvirtual FX_BOOL\t\t\t\tOnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\tOnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);\n\n};\n\nclass PWL_CLASS CPWL_ComboBox : public CPWL_Wnd  \n{\npublic:\n\tCPWL_ComboBox();\n\toperator CPWL_Edit* ()\t\t{return m_pEdit;}\n\npublic:\n\tvirtual CFX_ByteString\t\tGetClassName() const;\n\tvirtual void\t\t\t\tOnCreate(PWL_CREATEPARAM & cp);\n\n\tvirtual FX_BOOL\t\t\t\tOnKeyDown(FX_WORD nChar, FX_DWORD nFlag);\t\n\tvirtual FX_BOOL\t\t\t\tOnChar(FX_WORD nChar, FX_DWORD nFlag);\n\n\tvirtual void\t\t\t\tOnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);\n\n\tvirtual void\t\t\t\tCreateChildWnd(const PWL_CREATEPARAM & cp);\n\tvirtual void\t\t\t\tRePosChildWnd();\n\n\tvirtual CPDF_Rect\t\t\tGetFocusRect() const;\n\t\n\tvirtual void\t\t\t\tSetFocus();\n\tvirtual void\t\t\t\tKillFocus();\n\n\tFX_BOOL\t\t\t\t\t\tIsModified() const;\n\npublic:\t\n\tvoid\t\t\t\t\t\tSetFillerNotify(IPWL_Filler_Notify* pNotify);\n\n\tCFX_WideString\t\t\t\tGetText() const;\n\tvoid\t\t\t\t\t\tSetText(FX_LPCWSTR text);\n\n\tvoid\t\t\t\t\t\tAddString(FX_LPCWSTR string);\n\tFX_INT32\t\t\t\t\tGetSelect() const;\n\tvoid\t\t\t\t\t\tSetSelect(FX_INT32 nItemIndex);\n\n\tvoid\t\t\t\t\t\tSetEditSel(FX_INT32 nStartChar,FX_INT32 nEndChar);\n\tvoid\t\t\t\t\t\tGetEditSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar ) const;\n\tvoid\t\t\t\t\t\tClear();\n\tvoid\t\t\t\t\t\tSelectAll();\n\tFX_BOOL\t\t\t\t\t\tIsPopup() const;\n\n\tvoid\t\t\t\t\t\tSetSelectText();\n\nprivate:\t\n\tvoid\t\t\t\t\t\tCreateEdit(const PWL_CREATEPARAM & cp);\n\tvoid\t\t\t\t\t\tCreateButton(const PWL_CREATEPARAM & cp);\n\tvoid\t\t\t\t\t\tCreateListBox(const PWL_CREATEPARAM & cp);\n\n\tvoid\t\t\t\t\t\tSetPopup(FX_BOOL bPopup);\n\t\nprivate:\n\tCPWL_CBEdit*\t\t\t\tm_pEdit;\n\tCPWL_CBButton*\t\t\t\tm_pButton;\n\tCPWL_CBListBox*\t\t\t\tm_pList;\n\n\tFX_BOOL\t\t\t\t\t\tm_bPopup;\n\tCPDF_Rect\t\t\t\t\tm_rcOldWindow;\n\tFX_INT32\t\t\t\t\tm_nPopupWhere;\n\tFX_INT32\t\t\t\t\tm_nSelectItem;\n\tIPWL_Filler_Notify*\t\t\tm_pFillerNotify;\n\npublic:\n\tvoid\t\t\t\t\t\t\tAttachFFLData(void* pData) {m_pFormFiller = pData;}\nprivate:\n\tvoid*\t\t\t\t\t\t\tm_pFormFiller;\n};\n\n#endif // !defined(AFX_PWL_COMBOBOX_H__9D6645F8_64AA_4806_94E8_95FDEDD39C17__INCLUDED_)\n\n"
  },
  {
    "path": "fpdfsdk/include/pdfwindow/PWL_Edit.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _PWL_EDIT_H_\n#define _PWL_EDIT_H_\n\nclass IPWL_Filler_Notify;\nclass CPWL_Edit;\nclass IPWL_SpellCheck;\n\nclass IPWL_Filler_Notify\n{\npublic:\n\tvirtual void\t\t\t\t\tQueryWherePopup(void* pPrivateData, FX_FLOAT fPopupMin,FX_FLOAT fPopupMax, \n\t\t\t\t\t\t\t\t\t\tFX_INT32 & nRet, FX_FLOAT & fPopupRet) = 0; //nRet: (0:bottom 1:top)\n\tvirtual void\t\t\t\t\tOnBeforeKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_INT32 nKeyCode,\n\t\t\t\t\t\t\t\t\t\tCFX_WideString & strChange, const CFX_WideString& strChangeEx, \n\t\t\t\t\t\t\t\t\t\tint nSelStart, int nSelEnd,\n\t\t\t\t\t\t\t\t\t\tFX_BOOL bKeyDown, FX_BOOL & bRC, FX_BOOL & bExit, FX_DWORD nFlag) = 0;\n\tvirtual void\t\t\t\t\tOnAfterKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_BOOL & bExit, FX_DWORD nFlag) = 0;\n};\n\nclass PWL_CLASS CPWL_Edit : public CPWL_EditCtrl, public IFX_Edit_OprNotify\n{\npublic:\n\tCPWL_Edit();\n\tvirtual ~CPWL_Edit();\n\npublic:\n\tvirtual CFX_ByteString\t\t\tGetClassName() const;\n\tvirtual void\t\t\t\t\tOnDestroy();\n\tvirtual void\t\t\t\t\tOnCreated();\n\tvirtual void\t\t\t\t\tRePosChildWnd();\n\tvirtual CPDF_Rect\t\t\t\tGetClientRect() const;\n\n\tvirtual void\t\t\t\t\tGetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);\n\tvirtual void\t\t\t\t\tDrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);\n\n\tvirtual FX_BOOL\t\t\t\t\tOnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\tOnLButtonDblClk(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\tOnRButtonUp(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\tOnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag);\n\n\tvirtual FX_BOOL\t\t\t\t\tOnKeyDown(FX_WORD nChar, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\tOnChar(FX_WORD nChar, FX_DWORD nFlag);\n\n\tvirtual CPDF_Rect\t\t\t\tGetFocusRect() const;\n\npublic:\t\t\n\tvoid\t\t\t\t\t\t\tSetAlignFormatH(PWL_EDIT_ALIGNFORMAT_H nFormat = PEAH_LEFT, FX_BOOL bPaint = TRUE);\t//0:left 1:right 2:middle \n\tvoid\t\t\t\t\t\t\tSetAlignFormatV(PWL_EDIT_ALIGNFORMAT_V nFormat = PEAV_TOP, FX_BOOL bPaint = TRUE);\t//0:top 1:bottom 2:center\n\n\tvoid\t\t\t\t\t\t\tSetCharArray(FX_INT32 nCharArray);\n\tvoid\t\t\t\t\t\t\tSetLimitChar(FX_INT32 nLimitChar);\n\n\tvoid\t\t\t\t\t\t\tSetHorzScale(FX_INT32 nHorzScale, FX_BOOL bPaint = TRUE);\n\tvoid\t\t\t\t\t\t\tSetCharSpace(FX_FLOAT fCharSpace, FX_BOOL bPaint = TRUE);\n\n\tvoid\t\t\t\t\t\t\tSetLineLeading(FX_FLOAT fLineLeading, FX_BOOL bPaint = TRUE);\n\n\tvoid\t\t\t\t\t\t\tEnableSpellCheck(FX_BOOL bEnabled);\n\n\tFX_BOOL\t\t\t\t\t\t\tCanSelectAll() const;\n\tFX_BOOL\t\t\t\t\t\t\tCanClear() const;\n\tFX_BOOL\t\t\t\t\t\t\tCanCopy() const;\n\tFX_BOOL\t\t\t\t\t\t\tCanCut() const;\n\tFX_BOOL\t\t\t\t\t\t\tCanPaste() const;\n\n\tvirtual void\t\t\t\t\tCopyText();\n\tvirtual void\t\t\t\t\tPasteText();\n\tvirtual void \t\t\t\t\tCutText();\n\n\tvirtual void\t\t\t\t\tSetText(FX_LPCWSTR csText);\n\tvoid\t\t\t\t\t\t\tReplaceSel(FX_LPCWSTR csText);\n\n\tCFX_ByteString\t\t\t\t\tGetTextAppearanceStream(const CPDF_Point & ptOffset) const;\n\tCFX_ByteString\t\t\t\t\tGetCaretAppearanceStream(const CPDF_Point & ptOffset) const;\t\n\tCFX_ByteString\t\t\t\t\tGetSelectAppearanceStream(const CPDF_Point & ptOffset) const;\n\n\tFX_BOOL\t\t\t\t\t\t\tIsTextFull() const;\t\n\n\tstatic FX_FLOAT\t\t\t\t\tGetCharArrayAutoFontSize(CPDF_Font* pFont, const CPDF_Rect& rcPlate, FX_INT32 nCharArray);\n\n\tvoid\t\t\t\t\t\t\tSetFillerNotify(IPWL_Filler_Notify* pNotify) {m_pFillerNotify = pNotify;}\n\n\tvoid\t\t\t\t\t\t\tGeneratePageObjects(CPDF_PageObjects* pPageObjects, \n\t\t\t\t\t\t\t\t\t\tconst CPDF_Point& ptOffset, CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray);\n\tvoid\t\t\t\t\t\t\tGeneratePageObjects(CPDF_PageObjects* pPageObjects, \n\t\t\t\t\t\t\t\t\t\tconst CPDF_Point& ptOffset);\n\nprotected:\n\tvirtual void\t\t\t\t\tOnSetFocus();\n\tvirtual void\t\t\t\t\tOnKillFocus();\n\nprotected:\n\tvirtual void\t\t\t\t\tOnInsertWord(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace);\n\tvirtual void\t\t\t\t\tOnInsertReturn(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace);\n\tvirtual void\t\t\t\t\tOnBackSpace(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace);\n\tvirtual void\t\t\t\t\tOnDelete(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace);\n\tvirtual void\t\t\t\t\tOnClear(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace);\n\tvirtual void\t\t\t\t\tOnSetText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace);\n\tvirtual void\t\t\t\t\tOnInsertText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace);\n\tvirtual void\t\t\t\t\tOnAddUndo(IFX_Edit_UndoItem* pUndoItem);\n\nprivate:\t\n\tCPVT_WordRange\t\t\t\t\tGetSelectWordRange() const;\n\tvirtual void\t\t\t\t\tShowVScrollBar(FX_BOOL bShow);\n\tFX_BOOL\t\t\t\t\t\t\tIsVScrollBarVisible() const;\n\tvoid\t\t\t\t\t\t\tSetParamByFlag();\n\n\tFX_FLOAT\t\t\t\t\t\tGetCharArrayAutoFontSize(FX_INT32 nCharArray);\n\tCPDF_Point\t\t\t\t\t\tGetWordRightBottomPoint(const CPVT_WordPlace& wpWord);\n\n\tCPVT_WordRange\t\t\t\t\tCombineWordRange(const CPVT_WordRange& wr1, const CPVT_WordRange& wr2);\n\tCPVT_WordRange\t\t\t\t\tGetLatinWordsRange(const CPDF_Point & point) const;\n\tCPVT_WordRange\t\t\t\t\tGetLatinWordsRange(const CPVT_WordPlace & place) const;\n\tCPVT_WordRange\t\t\t\t\tGetArabicWordsRange(const CPVT_WordPlace & place) const;\n\tCPVT_WordRange\t\t\t\t\tGetSameWordsRange(const CPVT_WordPlace & place, FX_BOOL bLatin, FX_BOOL bArabic) const;\n\n\tvoid\t\t\t\t\t\t\tAjustArabicWords(const CPVT_WordRange& wr);\npublic:\n\tFX_BOOL\t\t\t\t\t\t\tIsProceedtoOnChar(FX_WORD nKeyCode, FX_DWORD nFlag);\nprivate:\n\tIPWL_Filler_Notify*\t\t\t\tm_pFillerNotify;\n\tIPWL_SpellCheck*\t\t\t\tm_pSpellCheck;\n\tFX_BOOL\t\t\t\t\t\t\tm_bFocus;\n\tCPDF_Rect\t\t\t\t\t\tm_rcOldWindow;\npublic:\n\tvoid\t\t\t\t\t\t\tAttachFFLData(void* pData) {m_pFormFiller = pData;}\nprivate:\n\tvoid*\t\t\t\t\t\t\tm_pFormFiller;\n};\n\n#endif \n\n"
  },
  {
    "path": "fpdfsdk/include/pdfwindow/PWL_EditCtrl.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _PWL_EDITCTRL_H_\n#define _PWL_EDITCTRL_H_\n\nenum PWL_EDIT_ALIGNFORMAT_H\n{\n\tPEAH_LEFT = 0,\n\tPEAH_MIDDLE,\n\tPEAH_RIGHT\n};\n\nenum PWL_EDIT_ALIGNFORMAT_V\n{\n\tPEAV_TOP = 0,\t\n\tPEAV_CENTER,\n\tPEAV_BOTTOM\n};\n\nclass IPWL_Edit_Notify;\nclass CPWL_EditCtrl;\nclass CPWL_Caret;\nclass IFX_Edit;\nclass CPWL_Edit;\n\nclass IPWL_Edit_Notify\n{\npublic:\n\t//when the position of caret is changed in edit\n\tvirtual void\t\t\t\t\tOnCaretMove(FX_INT32 x1, FX_INT32 y1, FX_INT32 x2, FX_INT32 y2) {}\n\tvirtual void\t\t\t\t\tOnContentChange(const CPDF_Rect& rcContent){}\n\t//OprType: 0 InsertWord\n\t//1 InsertReturn\n\t//2 BackSpace\n\t//3 Delete\n\t//4 Clear\n\t//5 InsertText\n\t//6 SetText\n\tvirtual void\t\t\t\t\tOnInsertWord(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}\n\tvirtual void\t\t\t\t\tOnInsertReturn(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}\n\tvirtual void\t\t\t\t\tOnBackSpace(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}\n\tvirtual void\t\t\t\t\tOnDelete(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}\n\tvirtual void\t\t\t\t\tOnClear(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}\n\tvirtual void\t\t\t\t\tOnInsertText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}\n\tvirtual void\t\t\t\t\tOnSetText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}\n\tvirtual void\t\t\t\t\tOnAddUndo(CPWL_Edit* pEdit) {}\n};\n\nclass PWL_CLASS CPWL_EditCtrl : public CPWL_Wnd, public IFX_Edit_Notify\n{\n\tfriend class CPWL_Edit_Notify;\n\npublic:\n\tCPWL_EditCtrl();\n\tvirtual ~CPWL_EditCtrl();\n\npublic:\n\tvirtual void\t\t\t\t\tOnCreate(PWL_CREATEPARAM & cp);\n\tvirtual void\t\t\t\t\tOnCreated();\n\n\tvirtual FX_BOOL\t\t\t\t\tOnKeyDown(FX_WORD nChar, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\tOnChar(FX_WORD nChar, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\tOnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);\t\n\tvirtual FX_BOOL\t\t\t\t\tOnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);\t\n\tvirtual FX_BOOL\t\t\t\t\tOnMouseMove(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual void\t\t\t\t\tOnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);\n\n\tvirtual void\t\t\t\t\tCreateChildWnd(const PWL_CREATEPARAM & cp);\n\tvirtual void\t\t\t\t\tRePosChildWnd();\t\n\tvirtual void\t\t\t\t\tSetFontSize(FX_FLOAT fFontSize);\n\tvirtual FX_FLOAT\t\t\t\tGetFontSize() const;\n\t\npublic:\n\tvirtual void\t\t\t\t\tSetText(FX_LPCWSTR csText);\n\n\tvirtual void\t\t\t\t\tCopyText();\n\tvirtual void\t\t\t\t\tPasteText();\n\tvirtual void \t\t\t\t\tCutText();\n\n\tCPDF_Rect\t\t\t\t\t\tGetContentRect() const;\n\tvoid\t\t\t\t\t\t\tGetCaretPos(FX_INT32& x, FX_INT32& y) const;\n\tFX_BOOL\t\t\t\t\t\t\tIsModified() const;\n\n\tCFX_WideString\t\t\t\t\tGetText() const;\n\tvoid\t\t\t\t\t\t\tSetSel(FX_INT32 nStartChar,FX_INT32 nEndChar);\n\tvoid\t\t\t\t\t\t\tGetSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar ) const;\n\tvoid\t\t\t\t\t\t\tGetTextRange(const CPDF_Rect& rect, FX_INT32 & nStartChar, FX_INT32 & nEndChar) const;\n\tCFX_WideString\t\t\t\t\tGetText(FX_INT32 & nStartChar, FX_INT32 & nEndChar) const;\n\tvoid\t\t\t\t\t\t\tClear();\n\tvoid\t\t\t\t\t\t\tSelectAll();\n\n\tFX_INT32\t\t\t\t\t\tGetCaret() const;\n\tvoid\t\t\t\t\t\t\tSetCaret(FX_INT32 nPos);\n\tFX_INT32\t\t\t\t\t\tGetTotalWords() const;\n\n\tvoid\t\t\t\t\t\t\tPaint();\n\n\tvoid\t\t\t\t\t\t\tEnableRefresh(FX_BOOL bRefresh);\t\n\tCPDF_Point\t\t\t\t\t\tGetScrollPos() const;\n\tvoid\t\t\t\t\t\t\tSetScrollPos(const CPDF_Point& point);\n\n\tvoid\t\t\t\t\t\t\tSetEditNotify(IPWL_Edit_Notify* pNotify) {m_pEditNotify = pNotify;}\t\n\n\tvoid\t\t\t\t\t\t\tSetCharSet(FX_BYTE nCharSet){m_nCharSet = nCharSet;}\n\tFX_INT32\t\t\t\t\t\tGetCharSet() const;\n\n\tvoid\t\t\t\t\t\t\tSetCodePage(FX_INT32 nCodePage){m_nCodePage = nCodePage;}\n\tFX_INT32\t\t\t\t\t\tGetCodePage() const {return m_nCodePage;}\n\n\tCPDF_Font *\t\t\t\t\t\tGetCaretFont() const;\n\tFX_FLOAT\t\t\t\t\t\tGetCaretFontSize() const;\n\n\tFX_BOOL\t\t\t\t\t\t\tCanUndo() const;\n\tFX_BOOL\t\t\t\t\t\t\tCanRedo() const;\n\tvoid\t\t\t\t\t\t\tRedo();\n\tvoid\t\t\t\t\t\t\tUndo();\n\n\tvoid\t\t\t\t\t\t\tSetReadyToInput();\nprotected:\n\tvirtual void\t\t\t\t\tShowVScrollBar(FX_BOOL bShow);\n\n\tvirtual void\t\t\t\t\tInsertWord(FX_WORD word, FX_INT32 nCharset);\n\tvirtual void\t\t\t\t\tInsertReturn();\n\tvirtual void\t\t\t\t\tInsertText(FX_LPCWSTR csText);\n\n\tvirtual void\t\t\t\t\tSetCursor();\n\tFX_BOOL\t\t\t\t\t\t\tIsWndHorV();\n\n\tvoid\t\t\t\t\t\t\tDelete();\n\tvoid\t\t\t\t\t\t\tBackspace();\n\nprotected:\n\tvoid\t\t\t\t\t\t\tGetCaretInfo(CPDF_Point & ptHead, CPDF_Point & ptFoot) const;\n\tvoid\t\t\t\t\t\t\tSetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & ptFoot);\n\t\n\tvoid\t\t\t\t\t\t\tSetEditCaret(FX_BOOL bVisible);\n\nprotected:\n\tvirtual void\t\t\t\t\tIOnSetScrollInfoX(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax, \n\t\t\t\t\t\t\t\t\t\t\t\tFX_FLOAT fContentMin, FX_FLOAT fContentMax, \n\t\t\t\t\t\t\t\t\t\t\t\tFX_FLOAT fSmallStep, FX_FLOAT fBigStep){}\n\tvirtual void\t\t\t\t\tIOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax, \n\t\t\t\t\t\t\t\t\t\t\t\tFX_FLOAT fContentMin, FX_FLOAT fContentMax, \n\t\t\t\t\t\t\t\t\t\t\t\tFX_FLOAT fSmallStep, FX_FLOAT fBigStep);\n\tvirtual void\t\t\t\t\tIOnSetScrollPosX(FX_FLOAT fx){}\n\tvirtual void\t\t\t\t\tIOnSetScrollPosY(FX_FLOAT fy);\n\tvirtual void\t\t\t\t\tIOnSetCaret(FX_BOOL bVisible,const CPDF_Point & ptHead,const CPDF_Point & ptFoot, const CPVT_WordPlace& place);\n\tvirtual void\t\t\t\t\tIOnCaretChange(const CPVT_SecProps & secProps, const CPVT_WordProps & wordProps);\n\tvirtual void\t\t\t\t\tIOnContentChange(const CPDF_Rect& rcContent);\n\tvirtual void\t\t\t\t\tIOnInvalidateRect(CPDF_Rect * pRect);\n\nprivate:\n\tvoid\t\t\t\t\t\t\tCreateEditCaret(const PWL_CREATEPARAM & cp);\n\nprotected:\n\tIFX_Edit*\t\t\t\t\t\tm_pEdit;\n\tCPWL_Caret*\t\t\t\t\t\tm_pEditCaret;\n\tFX_BOOL\t\t\t\t\t\t\tm_bMouseDown;\n\tIPWL_Edit_Notify*\t\t\t\tm_pEditNotify;\t\n\nprivate:\n\tFX_INT32\t\t\t\t\t\tm_nCharSet;\n\tFX_INT32\t\t\t\t\t\tm_nCodePage;\n};\n\n#endif\n\n"
  },
  {
    "path": "fpdfsdk/include/pdfwindow/PWL_FontMap.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _PWL_FONTMAP_H_\n#define _PWL_FONTMAP_H_\n\nstruct CPWL_FontMap_Data\n{\n\tCPDF_Font*\t\t\tpFont;\n\tFX_INT32\t\t\tnCharset;\n\tCFX_ByteString\t\tsFontName;\n};\n\nstruct CPWL_FontMap_Native\n{\n\tFX_INT32\t\t\tnCharset;\n\tCFX_ByteString\t\tsFontName;\n};\n\n#ifndef ANSI_CHARSET\n\n#define ANSI_CHARSET            0\n#define DEFAULT_CHARSET         1\n#define SYMBOL_CHARSET          2\n#define SHIFTJIS_CHARSET        128\n#define HANGEUL_CHARSET         129\n#define HANGUL_CHARSET          129\n#define GB2312_CHARSET          134\n#define CHINESEBIG5_CHARSET     136\n#define OEM_CHARSET             255\n#define JOHAB_CHARSET           130\n#define HEBREW_CHARSET          177\n#define ARABIC_CHARSET          178\n#define GREEK_CHARSET           161\n#define TURKISH_CHARSET         162\n#define VIETNAMESE_CHARSET      163\n#define THAI_CHARSET            222\n#define EASTEUROPE_CHARSET      238\n#define RUSSIAN_CHARSET         204\n#define BALTIC_CHARSET          186\n\n#endif\n\n#ifndef PWL_CLASS\n\n\t#ifdef FX_READER_DLL\n\t\t#define PWL_CLASS\t\t__declspec(dllexport)\n\t#else\n\t\t#define PWL_CLASS\n\t#endif\n#endif\n\nclass IFX_SystemHandler;\nclass PWL_CLASS CPWL_FontMap : public IFX_Edit_FontMap\n{\npublic:\n\tCPWL_FontMap(IFX_SystemHandler* pSystemHandler);\n\tvirtual ~CPWL_FontMap();\n\n\tvirtual CPDF_Font*\t\t\t\t\t\t\tGetPDFFont(FX_INT32 nFontIndex);\n\tvirtual CFX_ByteString\t\t\t\t\t\tGetPDFFontAlias(FX_INT32 nFontIndex);\n\tvirtual FX_INT32\t\t\t\t\t\t\tGetWordFontIndex(FX_WORD word, FX_INT32 nCharset, FX_INT32 nFontIndex);\n\tvirtual FX_INT32\t\t\t\t\t\t\tCharCodeFromUnicode(FX_INT32 nFontIndex, FX_WORD word);\n\tvirtual FX_INT32\t\t\t\t\t\t\tCharSetFromUnicode(FX_WORD word, FX_INT32 nOldCharset);\n\npublic:\n\tvirtual void\t\t\t\t\t\t\t\tInitial(FX_LPCSTR fontname = NULL);\n\tvoid\t\t\t\t\t\t\t\t\t\tSetSystemHandler(IFX_SystemHandler* pSystemHandler);\n\n\tFX_INT32\t\t\t\t\t\t\t\t\tGetFontMapCount() const;\n\tconst CPWL_FontMap_Data*\t\t\t\t\tGetFontMapData(FX_INT32 nIndex) const;\n\npublic:\n\tstatic FX_INT32\t\t\t\t\t\t\t\tGetNativeCharset();\n\tCFX_ByteString\t\t\t\t\t\t\t\tGetNativeFontName(FX_INT32 nCharset);\n\n\tstatic CFX_ByteString\t\t\t\t\t\tGetDefaultFontByCharset(FX_INT32 nCharset);\n\n\tCPDF_Font*\t\t\t\t\t\t\t\t\tAddFontToDocument(CPDF_Document* pDoc, CFX_ByteString& sFontName, FX_BYTE nCharset);\n\tstatic FX_BOOL\t\t\t\t\t\t\t\tIsStandardFont(const CFX_ByteString& sFontName);\t\t\t\t\t\t\t\n\tCPDF_Font*\t\t\t\t\t\t\t\t\tAddStandardFont(CPDF_Document* pDoc, CFX_ByteString& sFontName);\n\tCPDF_Font*\t\t\t\t\t\t\t\t\tAddSystemFont(CPDF_Document* pDoc, CFX_ByteString& sFontName, \n\t\t\t\t\t\t\t\t\t\t\t\t\tFX_BYTE nCharset);\n\nprotected:\n\tvirtual CPDF_Font*\t\t\t\t\t\t\tFindFontSameCharset(CFX_ByteString& sFontAlias, FX_INT32 nCharset);\n\tvirtual void\t\t\t\t\t\t\t\tAddedFont(CPDF_Font* pFont, const CFX_ByteString& sFontAlias);\n\tFX_BOOL\t\t\t\t\t\t\t\t\t\tKnowWord(FX_INT32 nFontIndex, FX_WORD word);\n\n\tvirtual CPDF_Document*\t\t\t\t\t\tGetDocument();\n\n\tvoid\t\t\t\t\t\t\t\t\t\tEmpty();\n\tFX_INT32\t\t\t\t\t\t\t\t\tGetFontIndex(const CFX_ByteString& sFontName, FX_INT32 nCharset, FX_BOOL bFind);\n\tFX_INT32\t\t\t\t\t\t\t\t\tGetPWLFontIndex(FX_WORD word, FX_INT32 nCharset);\n\tFX_INT32\t\t\t\t\t\t\t\t\tAddFontData(CPDF_Font* pFont, const CFX_ByteString& sFontAlias, FX_INT32 nCharset = DEFAULT_CHARSET);\n\n\tCFX_ByteString\t\t\t\t\t\t\t\tEncodeFontAlias(const CFX_ByteString& sFontName, FX_INT32 nCharset);\n\tCFX_ByteString\t\t\t\t\t\t\t\tEncodeFontAlias(const CFX_ByteString& sFontName);\n\nprivate:\n\tCFX_ByteString\t\t\t\t\t\t\t\tGetFontName(FX_INT32 nFontIndex);\n\tFX_INT32\t\t\t\t\t\t\t\t\tFindFont(const CFX_ByteString& sFontName, FX_INT32 nCharset = DEFAULT_CHARSET);\n\n\tCFX_ByteString\t\t\t\t\t\t\t\tGetNativeFont(FX_INT32 nCharset);\n\npublic:\n\tstruct CharsetFontMap {\n\t\tFX_INT32\t\t\t\t\t\t\t\tcharset;\n\t\tconst char*\t\t\t\t\t\t\t\tfontname;\n\t};\n\tstatic const CharsetFontMap\t\t\t\t\tdefaultTTFMap[];\n\nprotected:\n\tCFX_ArrayTemplate<CPWL_FontMap_Data*>\t\tm_aData;\n\tCFX_ArrayTemplate<CPWL_FontMap_Native*>\t\tm_aNativeFont;\n\nprivate:\n\tCPDF_Document*\t\t\t\t\t\t\t\tm_pPDFDoc;\n\tIFX_SystemHandler*\t\t\t\t\t\t\tm_pSystemHandler;\n};\n\nclass PWL_CLASS CPWL_DocFontMap : public CPWL_FontMap\n{\npublic:\n\tCPWL_DocFontMap(IFX_SystemHandler* pSystemHandler, CPDF_Document* pAttachedDoc);\n\tvirtual ~CPWL_DocFontMap();\n\n\tvirtual CPDF_Document*\t\t\t\t\t\tGetDocument();\n\nprivate:\n\tCPDF_Document*\t\t\t\t\t\t\t\tm_pAttachedDoc;\n};\n\n#endif\n"
  },
  {
    "path": "fpdfsdk/include/pdfwindow/PWL_Icon.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _PWL_ICON_H_\n#define _PWL_ICON_H_\n\nclass PWL_CLASS CPWL_Image : public CPWL_Wnd\n{\npublic:\n\tCPWL_Image();\n\tvirtual ~CPWL_Image();\n\n\tvirtual CFX_ByteString\t\t\tGetImageAppStream();\n\n\tvirtual void\t\t\t\t\tGetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale);\n\tvirtual void\t\t\t\t\tGetImageOffset(FX_FLOAT & x,FX_FLOAT & y);\n\tvirtual CPDF_Stream *\t\t\tGetPDFStream();\n\npublic:\n\tvoid\t\t\t\t\t\t\tSetPDFStream(CPDF_Stream* pStream);\t\n\tvoid\t\t\t\t\t\t\tGetImageSize(FX_FLOAT & fWidth,FX_FLOAT & fHeight);\n\tCPDF_Matrix\t\t\t\t\t\tGetImageMatrix();\n\tCFX_ByteString\t\t\t\t\tGetImageAlias();\n\tvoid\t\t\t\t\t\t\tSetImageAlias(FX_LPCSTR sImageAlias);\n\nprotected:\n\tCPDF_Stream*\t\t\t\t\tm_pPDFStream;\n\tCFX_ByteString\t\t\t\t\tm_sImageAlias;\n};\n\nclass PWL_CLASS CPWL_Icon : public CPWL_Image \n{\npublic:\n\tCPWL_Icon();\n\tvirtual ~CPWL_Icon();\n\n\tvirtual CPDF_IconFit *\t\t\tGetIconFit(){return m_pIconFit;};\n\n\tvirtual void\t\t\t\t\tGetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale);\n\tvirtual void\t\t\t\t\tGetImageOffset(FX_FLOAT & x,FX_FLOAT & y);\n\n\tFX_INT32\t\t\t\t\t\tGetScaleMethod();\n\tFX_BOOL\t\t\t\t\t\t\tIsProportionalScale();\n\tvoid\t\t\t\t\t\t\tGetIconPosition(FX_FLOAT & fLeft, FX_FLOAT & fBottom);\n\tFX_BOOL\t\t\t\t\t\t\tGetFittingBounds();\n\n\tvoid\t\t\t\t\t\t\tSetIconFit(CPDF_IconFit * pIconFit){m_pIconFit = pIconFit;};\n\nprivate:\n\tCPDF_IconFit *\t\t\t\t\tm_pIconFit;\n};\n\n\n#endif // !defined(AFX_PWL_BUTTON_H__5A6080AA_33C5_4FC9_91FC_D9644C41120A__INCLUDED_)\n\n\n"
  },
  {
    "path": "fpdfsdk/include/pdfwindow/PWL_IconList.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _PWL_IconList_H_\n#define _PWL_IconList_H_\n\nclass IPWL_IconList_Notify;\nclass CPWL_IconList_Item;\nclass CPWL_IconList_Content;\nclass CPWL_IconList;\nclass CPWL_Label;\n\nclass IPWL_IconList_Notify\n{\npublic:\n\tvirtual void\t\t\t\t\t\tOnNoteListSelChanged(FX_INT32 nItemIndex) = 0;\n};\n\nclass CPWL_IconList_Item : public CPWL_Wnd\n{\npublic:\n\tCPWL_IconList_Item();\n\tvirtual ~CPWL_IconList_Item();\n\n\tvirtual CFX_ByteString\t\t\t\tGetClassName() const;\n\tvirtual void\t\t\t\t\t\tCreateChildWnd(const PWL_CREATEPARAM & cp);\n\tvirtual void\t\t\t\t\t\tRePosChildWnd();\n\n\tvoid\t\t\t\t\t\t\t\tSetSelect(FX_BOOL bSelected);\n\tFX_BOOL\t\t\t\t\t\t\t\tIsSelected() const;\n\tvoid\t\t\t\t\t\t\t\tSetData(void* pData);\n\tvoid\t\t\t\t\t\t\t\tSetIcon(FX_INT32 nIconIndex);\n\tvoid\t\t\t\t\t\t\t\tSetText(const CFX_WideString& str);\n\tvoid\t\t\t\t\t\t\t\tSetIconFillColor(const CPWL_Color& color);\n\tCFX_WideString\t\t\t\t\t\tGetText() const;\n\nprotected:\n\tvirtual FX_FLOAT\t\t\t\t\tGetItemHeight(FX_FLOAT fLimitWidth);\n\tvirtual void\t\t\t\t\t\tDrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);\n\n\tvirtual void\t\t\t\t\t\tOnEnabled();\n\tvirtual void\t\t\t\t\t\tOnDisabled();\n\nprivate:\n\tFX_INT32\t\t\t\t\t\t\tm_nIconIndex;\n\tvoid*\t\t\t\t\t\t\t\tm_pData;\n\tFX_BOOL\t\t\t\t\t\t\t\tm_bSelected;\n\tCPWL_Label*\t\t\t\t\t\t\tm_pText;\n\tCPWL_Color\t\t\t\t\t\t\tm_crIcon;\n};\n\nclass CPWL_IconList_Content : public CPWL_ListCtrl\n{\npublic:\n\tCPWL_IconList_Content(FX_INT32 nListCount);\n\tvirtual ~CPWL_IconList_Content();\n\n\tvoid\t\t\t\t\t\t\t\tSetSelect(FX_INT32 nIndex);\n\tFX_INT32\t\t\t\t\t\t\tGetSelect() const;\n\tvoid\t\t\t\t\t\t\t\tSetNotify(IPWL_IconList_Notify* pNotify);\n\tvoid\t\t\t\t\t\t\t\tEnableNotify(FX_BOOL bNotify);\n\tvoid\t\t\t\t\t\t\t\tSetListData(FX_INT32 nItemIndex, void* pData);\n\tvoid\t\t\t\t\t\t\t\tSetListIcon(FX_INT32 nItemIndex, FX_INT32 nIconIndex);\n\tvoid\t\t\t\t\t\t\t\tSetListString(FX_INT32 nItemIndex, const CFX_WideString& str);\n\tvoid\t\t\t\t\t\t\t\tSetIconFillColor(const CPWL_Color& color);\n\tCFX_WideString\t\t\t\t\t\tGetListString(FX_INT32 nItemIndex) const;\n\tIPWL_IconList_Notify*\t\t\t\tGetNotify() const;\n\tvoid\t\t\t\t\t\t\t\tScrollToItem(FX_INT32 nItemIndex);\n\nprotected:\n\tvirtual void\t\t\t\t\t\tCreateChildWnd(const PWL_CREATEPARAM & cp);\n\tvirtual FX_BOOL\t\t\t\t\t\tOnLButtonDown(const CPDF_Point & point);\n\tvirtual FX_BOOL\t\t\t\t\t\tOnLButtonUp(const CPDF_Point & point);\n\tvirtual FX_BOOL\t\t\t\t\t\tOnMouseMove(const CPDF_Point & point);\n\tvirtual FX_BOOL\t\t\t\t\t\tOnKeyDown(FX_WORD nChar);\n\nprivate:\n\tCPWL_IconList_Item*\t\t\t\t\tGetListItem(FX_INT32 nItemIndex) const;\n\tvoid\t\t\t\t\t\t\t\tSelectItem(FX_INT32 nItemIndex, FX_BOOL bSelect);\n\tFX_INT32\t\t\t\t\t\t\tFindItemIndex(const CPDF_Point& point);\n\t\n\tFX_BOOL\t\t\t\t\t\t\t\tm_nSelectIndex;\n\tIPWL_IconList_Notify*\t\t\t\tm_pNotify;\n\tFX_BOOL\t\t\t\t\t\t\t\tm_bEnableNotify;\n\tFX_BOOL\t\t\t\t\t\t\t\tm_bMouseDown;\n\tFX_INT32\t\t\t\t\t\t\tm_nListCount;\n};\n\nclass PWL_CLASS CPWL_IconList : public CPWL_Wnd\n{\npublic:\n\tCPWL_IconList(FX_INT32 nListCount);\n\tvirtual ~CPWL_IconList();\n\n\tvirtual FX_BOOL\t\t\t\t\t\tOnMouseWheel(short zDelta, const CPDF_Point & point);\n\n\tvoid\t\t\t\t\t\t\t\tSetSelect(FX_INT32 nIndex);\n\tvoid\t\t\t\t\t\t\t\tSetTopItem(FX_INT32 nIndex);\n\tFX_INT32\t\t\t\t\t\t\tGetSelect() const;\n\tvoid\t\t\t\t\t\t\t\tSetNotify(IPWL_IconList_Notify* pNotify);\n\tvoid\t\t\t\t\t\t\t\tEnableNotify(FX_BOOL bNotify);\n\tvoid\t\t\t\t\t\t\t\tSetListData(FX_INT32 nItemIndex, void* pData);\n\tvoid\t\t\t\t\t\t\t\tSetListIcon(FX_INT32 nItemIndex, FX_INT32 nIconIndex);\n\tvoid\t\t\t\t\t\t\t\tSetListString(FX_INT32 nItemIndex, const CFX_WideString& str);\n\tvoid\t\t\t\t\t\t\t\tSetIconFillColor(const CPWL_Color& color);\n\tCFX_WideString\t\t\t\t\t\tGetListString(FX_INT32 nItemIndex) const;\n\nprotected:\n\tvirtual void\t\t\t\t\t\tOnCreated();\n\tvirtual void\t\t\t\t\t\tRePosChildWnd();\n\tvirtual void\t\t\t\t\t\tCreateChildWnd(const PWL_CREATEPARAM & cp);\n\t\n\tvirtual void\t\t\t\t\t\tOnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);\n\nprivate:\n\tCPWL_IconList_Content*\t\t\t\tm_pListContent;\n\tFX_INT32\t\t\t\t\t\t\tm_nListCount;\n};\n \n#endif //_PWL_IconList_H_\n\n\n"
  },
  {
    "path": "fpdfsdk/include/pdfwindow/PWL_Label.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _PWL_LABEL_H_\n#define _PWL_LABEL_H_\n\nclass IFX_Edit;\n\nclass PWL_CLASS CPWL_Label : public CPWL_Wnd\n{\npublic:\n\tCPWL_Label();\n\tvirtual ~CPWL_Label();\n\npublic:\n\tvirtual CFX_ByteString\t\t\tGetClassName() const;\t\n\tvirtual void\t\t\t\t\tSetFontSize(FX_FLOAT fFontSize);\n\tvirtual FX_FLOAT\t\t\t\tGetFontSize() const;\n\npublic:\t\t\n\tvoid\t\t\t\t\t\t\tSetText(FX_LPCWSTR csText);\n\tCFX_WideString\t\t\t\t\tGetText() const;\n\n\tvoid\t\t\t\t\t\t\tSetLimitChar(FX_INT32 nLimitChar);\n\tvoid\t\t\t\t\t\t\tSetHorzScale(FX_INT32 nHorzScale);\n\tvoid\t\t\t\t\t\t\tSetCharSpace(FX_FLOAT fCharSpace);\n\n\tCPDF_Rect\t\t\t\t\t\tGetContentRect() const;\t\n\tFX_INT32\t\t\t\t\t\tGetTotalWords();\n\n\tCFX_ByteString\t\t\t\t\tGetTextAppearanceStream(const CPDF_Point & ptOffset) const;\n\nprotected:\n\tvirtual void\t\t\t\t\tOnCreated();\n\tvirtual void\t\t\t\t\tDrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);\n\tvirtual void\t\t\t\t\tGetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);\n\tvirtual void\t\t\t\t\tRePosChildWnd();\t\n\nprivate:\n\tvoid\t\t\t\t\t\t\tSetParamByFlag();\n\nprivate:\n\tIFX_Edit*\t\t\t\t\t\tm_pEdit;\n};\n\n#endif\n\n\n"
  },
  {
    "path": "fpdfsdk/include/pdfwindow/PWL_ListBox.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _PWL_LISTBOX_H_\n#define _PWL_LISTBOX_H_\n\nclass CPDF_ListCtrl;\nclass CPWL_List_Notify;\nclass CPWL_ListBox;\nclass IPWL_Filler_Notify;\n\nclass CPWL_List_Notify : public IFX_List_Notify\n{\npublic:\n\tCPWL_List_Notify(CPWL_ListBox * pList);\n\tvirtual ~CPWL_List_Notify();\n\n\tvoid\t\t\t\t\t\t\tIOnSetScrollInfoX(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax, \n\t\t\t\t\t\t\t\t\t\t\t\tFX_FLOAT fContentMin, FX_FLOAT fContentMax, \n\t\t\t\t\t\t\t\t\t\t\t\tFX_FLOAT fSmallStep, FX_FLOAT fBigStep){}\n\tvoid\t\t\t\t\t\t\tIOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax, \n\t\t\t\t\t\t\t\t\t\t\t\tFX_FLOAT fContentMin, FX_FLOAT fContentMax, \n\t\t\t\t\t\t\t\t\t\t\t\tFX_FLOAT fSmallStep, FX_FLOAT fBigStep);\n\tvoid\t\t\t\t\t\t\tIOnSetScrollPosX(FX_FLOAT fx){}\n\tvoid\t\t\t\t\t\t\tIOnSetScrollPosY(FX_FLOAT fy);\n\tvoid\t\t\t\t\t\t\tIOnSetCaret(FX_BOOL bVisible,const CPDF_Point & ptHead,const CPDF_Point & ptFoot, const CPVT_WordPlace& place);\n\tvoid\t\t\t\t\t\t\tIOnCaretChange(const CPVT_SecProps & secProps, const CPVT_WordProps & wordProps);\n\tvoid\t\t\t\t\t\t\tIOnInvalidateRect(CPDF_Rect * pRect);\n\nprivate:\n\tCPWL_ListBox*\t\t\t\t\tm_pList;\t\n};\n\nclass PWL_CLASS CPWL_ListBox : public CPWL_Wnd\n{\npublic:\n\tCPWL_ListBox();\n\tvirtual ~CPWL_ListBox();\n\n\tvirtual CFX_ByteString\t\t\tGetClassName() const;\n\tvirtual void\t\t\t\t\tOnCreated();\n\tvirtual void\t\t\t\t\tOnDestroy();\n\tvirtual void\t\t\t\t\tGetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);\n\tvirtual void\t\t\t\t\tDrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);\n\n\tvirtual FX_BOOL\t\t\t\t\tOnKeyDown(FX_WORD nChar, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\tOnChar(FX_WORD nChar, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\tOnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\tOnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\tOnMouseMove(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\tOnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual void\t\t\t\t\tKillFocus();\n\n\tvirtual void\t\t\t\t\tOnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);\n\tvirtual void\t\t\t\t\tRePosChildWnd();\n\tvirtual void\t\t\t\t\tSetText(FX_LPCWSTR csText,FX_BOOL bRefresh = TRUE);\n\tvirtual CFX_WideString\t\t\tGetText() const;\t\n\tvirtual CPDF_Rect\t\t\t\tGetFocusRect() const;\n\tvirtual void\t\t\t\t\tSetFontSize(FX_FLOAT fFontSize);\n\tvirtual FX_FLOAT\t\t\t\tGetFontSize() const;\n\n\tvoid\t\t\t\t\t\t\tOnNotifySelChanged(FX_BOOL bKeyDown, FX_BOOL & bExit , FX_DWORD nFlag);\n\n\tvoid\t\t\t\t\t\t\tAddString(FX_LPCWSTR string);\t\n\tvoid\t\t\t\t\t\t\tSetTopVisibleIndex(FX_INT32 nItemIndex);\n\tvoid\t\t\t\t\t\t\tScrollToListItem(FX_INT32 nItemIndex);\n\tvoid\t\t\t\t\t\t\tResetContent();\n\tvoid\t\t\t\t\t\t\tReset();\n\tvoid\t\t\t\t\t\t\tSelect(FX_INT32 nItemIndex);\n\tvoid\t\t\t\t\t\t\tSetCaret(FX_INT32 nItemIndex);\n\tvoid\t\t\t\t\t\t\tSetHoverSel(FX_BOOL bHoverSel);\n\t\n\tFX_INT32\t\t\t\t\t\tGetCount() const;\n\tFX_BOOL\t\t\t\t\t\t\tIsMultipleSel() const;\n\tFX_INT32\t\t\t\t\t\tGetCaretIndex() const;\n\tFX_INT32\t\t\t\t\t\tGetCurSel() const;\n\tFX_BOOL\t\t\t\t\t\t\tIsItemSelected(FX_INT32 nItemIndex) const;\n\tFX_INT32\t\t\t\t\t\tGetTopVisibleIndex() const;\n\tFX_INT32\t\t\t\t\t\tFindNext(FX_INT32 nIndex,FX_WCHAR nChar) const;\n\tCPDF_Rect\t\t\t\t\t\tGetContentRect() const;\t\n\tFX_FLOAT\t\t\t\t\t\tGetFirstHeight() const;\n\tCPDF_Rect\t\t\t\t\t\tGetListRect() const;\n\n\tvoid\t\t\t\t\t\t\tSetFillerNotify(IPWL_Filler_Notify* pNotify) {m_pFillerNotify = pNotify;}\n\nprotected:\n\tIFX_List*\t\t\t\t\t\tm_pList;\n\tCPWL_List_Notify*\t\t\t\tm_pListNotify;\n\tFX_BOOL\t\t\t\t\t\t\tm_bMouseDown;\n\tFX_BOOL\t\t\t\t\t\t\tm_bHoverSel;\n\tIPWL_Filler_Notify*\t\t\t\tm_pFillerNotify;\npublic:\n\tvoid\t\t\t\t\t\t\tAttachFFLData(void* pData) {m_pFormFiller = pData;}\nprivate:\n\tvoid*\t\t\t\t\t\t\tm_pFormFiller;\n};\n\n#endif // !defined(AFX_PWL_LISTBOX_H__F8C0DD72_CC3C_4806_86FB_E9D02B04A34B__INCLUDED_)\n\n\n"
  },
  {
    "path": "fpdfsdk/include/pdfwindow/PWL_ListCtrl.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _PWL_LISTCTRL_H_\n#define _PWL_LISTCTRL_H_\n\nclass CPWL_ListCtrl;\n\nclass CPWL_ListCtrl : public CPWL_Wnd\n{\npublic:\n\tCPWL_ListCtrl();\n\tvirtual ~CPWL_ListCtrl();\n\npublic:\n\tvoid\t\t\t\t\t\t\t\tSetScrollPos(const CPDF_Point& point);\n\tCPDF_Point\t\t\t\t\t\t\tGetScrollPos() const;\n\tCPDF_Rect\t\t\t\t\t\t\tGetScrollArea() const;\n\t\n\tvoid\t\t\t\t\t\t\t\tSetItemSpace(FX_FLOAT fSpace);\n\tvoid\t\t\t\t\t\t\t\tSetTopSpace(FX_FLOAT fSpace);\n\tvoid\t\t\t\t\t\t\t\tSetBottomSpace(FX_FLOAT fSpace);\n\tvoid\t\t\t\t\t\t\t\tResetFace();\n\tvoid\t\t\t\t\t\t\t\tResetContent(FX_INT32 nStart);\n\tFX_INT32\t\t\t\t\t\t\tGetItemIndex(CPWL_Wnd* pItem);\n\tFX_FLOAT\t\t\t\t\t\t\tGetContentsHeight(FX_FLOAT fLimitWidth);\n\nprotected:\n\tvirtual void\t\t\t\t\t\tRePosChildWnd();\n\tvirtual void\t\t\t\t\t\tDrawChildAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);\n\npublic:\n\tCPDF_Point\t\t\t\t\t\t\tInToOut(const CPDF_Point& point) const;\n\tCPDF_Point\t\t\t\t\t\t\tOutToIn(const CPDF_Point& point) const;\n\tCPDF_Rect\t\t\t\t\t\t\tInToOut(const CPDF_Rect& rect) const;\n\tCPDF_Rect\t\t\t\t\t\t\tOutToIn(const CPDF_Rect& rect) const;\n\nprivate:\n\tvoid\t\t\t\t\t\t\t\tResetAll(FX_BOOL bMove,FX_INT32 nStart);\n\nprivate:\n\tCPDF_Rect\t\t\t\t\t\t\tm_rcContent;\n\tCPDF_Point\t\t\t\t\t\t\tm_ptScroll;\n\tFX_FLOAT\t\t\t\t\t\t\tm_fItemSpace;\n\tFX_FLOAT\t\t\t\t\t\t\tm_fTopSpace;\n\tFX_FLOAT\t\t\t\t\t\t\tm_fBottomSpace;\n};\n\n#endif\n\n"
  },
  {
    "path": "fpdfsdk/include/pdfwindow/PWL_Note.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _PWL_NOTE_H_\n#define _PWL_NOTE_H_\n\nclass IPWL_NoteNotify;\nclass IPWL_NoteHandler;\nclass IPWL_NoteItem;\nclass CPWL_NoteItem;\nclass CPWL_Note;\nclass CPWL_Label;\nclass CPWL_Edit;\nclass CPWL_Note_Icon;\nclass CPWL_Note_CloseBox;\nclass CPWL_Note_LBBox;\nclass CPWL_Note_RBBox;\nclass CPWL_Note_Edit;\nclass CPWL_Note_Options;\nclass CPWL_Note_Contents;\nclass IPopup_Note;\n\n\nclass IPWL_NoteNotify\n{\npublic:\n\tvirtual void\t\t\t\t\t\tOnNoteMove(const FX_RECT& rtWin) = 0;\n\tvirtual void\t\t\t\t\t\tOnNoteShow(FX_BOOL bShow) = 0;\n\tvirtual void\t\t\t\t\t\tOnNoteActivate(FX_BOOL bActive) = 0;\n\tvirtual void\t\t\t\t\t\tOnNoteClose() = 0;\n\tvirtual void\t\t\t\t\t\tOnItemCreate(IPWL_NoteItem* pItem) = 0;\n\tvirtual void\t\t\t\t\t\tOnItemDelete(IPWL_NoteItem* pItem) = 0;\n\tvirtual void\t\t\t\t\t\tOnSetAuthorName(IPWL_NoteItem* pItem) = 0;\n\tvirtual void\t\t\t\t\t\tOnSetBkColor(IPWL_NoteItem* pItem) = 0;\n\tvirtual void\t\t\t\t\t\tOnSetContents(IPWL_NoteItem* pItem) = 0;\n\tvirtual void\t\t\t\t\t\tOnSetDateTime(IPWL_NoteItem* pItem) = 0;\n\tvirtual void\t\t\t\t\t\tOnSetSubjectName(IPWL_NoteItem* pItem) = 0;\n\tvirtual void\t\t\t\t\t\tOnPopupMenu(FX_INT32 x, FX_INT32 y) = 0;\n\tvirtual void\t\t\t\t\t\tOnPopupMenu(IPWL_NoteItem* pItem, FX_INT32 x, FX_INT32 y) = 0;\n};\n\nclass IPWL_NoteHandler\n{\npublic:\n\tvirtual void\t\t\t\t\t\tOnNoteColorChanged(const CPWL_Color& color) = 0;\n};\n\nclass IPWL_NoteItem\n{\npublic:\n\tvirtual void\t\t\t\t\t\tSetPrivateData(void* pData) = 0;\n\tvirtual void\t\t\t\t\t\tSetBkColor(const CPWL_Color& color) = 0;\n\tvirtual void\t\t\t\t\t\tSetSubjectName(const CFX_WideString& sName) = 0;\n\tvirtual void\t\t\t\t\t\tSetAuthorName(const CFX_WideString& sName) = 0;\n\tvirtual void\t\t\t\t\t\tSetDateTime(FX_SYSTEMTIME time) = 0;\n\tvirtual void\t\t\t\t\t\tSetContents(const CFX_WideString& sContents) = 0;\n\n\tvirtual IPWL_NoteItem*\t\t\t\tCreateSubItem() = 0;\n\tvirtual FX_INT32\t\t\t\t\tCountSubItems() const = 0;\n\tvirtual IPWL_NoteItem*\t\t\t\tGetSubItems(FX_INT32 index) const = 0;\n\tvirtual void\t\t\t\t\t\tDeleteSubItem(IPWL_NoteItem* pNoteItem) = 0;\n\tvirtual void\t\t\t\t\t\tSetFocus() = 0;\n\t\n\tvirtual IPWL_NoteItem*\t\t\t\tGetParentItem() const = 0;\n\tvirtual void*\t\t\t\t\t\tGetPrivateData() const = 0;\n\tvirtual CFX_WideString\t\t\t\tGetAuthorName() const = 0;\n\tvirtual CPWL_Color\t\t\t\t\tGetBkColor() const = 0;\n\tvirtual CFX_WideString\t\t\t\tGetContents() const = 0;\n\tvirtual FX_SYSTEMTIME\t\t\t\tGetDateTime() const = 0;\n\tvirtual CFX_WideString\t\t\t\tGetSubjectName() const = 0;\n\n\tvirtual CPWL_Edit*\t\t\t\t\tGetEdit() const = 0;\n};\n\nclass PWL_CLASS CPWL_Note_Icon : public CPWL_Wnd\n{\npublic:\n\tCPWL_Note_Icon();\n\tvirtual ~CPWL_Note_Icon();\n\n\tvoid\t\t\t\t\t\t\t\tSetIconType(FX_INT32 nType);\n\npublic:\n\nprotected:\n\tvirtual void\t\t\t\t\t\tDrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);\n\nprivate:\n\tFX_INT32\t\t\t\t\t\t\tm_nType;\n};\n\nclass CPWL_Note_CloseBox : public CPWL_Button\n{\npublic:\n\tCPWL_Note_CloseBox();\n\tvirtual ~CPWL_Note_CloseBox();\n\nprotected:\n\tvirtual void\t\t\t\t\t\tDrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);\n\tvirtual FX_BOOL\t\t\t\t\t\tOnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\t\tOnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);\n\nprivate:\n\tFX_BOOL\t\t\t\t\t\t\t\tm_bMouseDown;\n};\n\nclass CPWL_Note_LBBox : public CPWL_Wnd\n{\npublic:\n\tCPWL_Note_LBBox();\n\tvirtual ~CPWL_Note_LBBox();\n\nprotected:\n\tvirtual void\t\t\t\t\t\tDrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);\n};\n\nclass CPWL_Note_RBBox : public CPWL_Wnd\n{\npublic:\n\tCPWL_Note_RBBox();\n\tvirtual ~CPWL_Note_RBBox();\n\nprotected:\n\tvirtual void\t\t\t\t\t\tDrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);\n};\n\nclass CPWL_Note_Edit : public CPWL_Edit\n{\npublic:\n\tCPWL_Note_Edit();\n\tvirtual ~CPWL_Note_Edit();\n\n\tvoid\t\t\t\t\t\t\t\tEnableNotify(FX_BOOL bEnable) {m_bEnableNotify = bEnable;}\n\tvirtual FX_FLOAT\t\t\t\t\tGetItemHeight(FX_FLOAT fLimitWidth);\n\tFX_FLOAT\t\t\t\t\t\t\tGetItemLeftMargin();\n\tFX_FLOAT\t\t\t\t\t\t\tGetItemRightMargin();\n\n\tvirtual void\t\t\t\t\t\tSetText(FX_LPCWSTR csText);\n\nprotected:\n\tvirtual void\t\t\t\t\t\tOnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);\n\tvirtual void\t\t\t\t\t\tRePosChildWnd();\n\tvirtual void\t\t\t\t\t\tOnSetFocus();\n\tvirtual void\t\t\t\t\t\tOnKillFocus();\t\n\nprivate:\n\tFX_BOOL\t\t\t\t\t\t\t\tm_bEnableNotify;\n\tFX_FLOAT\t\t\t\t\t\t\tm_fOldItemHeight;\n\tFX_BOOL\t\t\t\t\t\t\t\tm_bSizeChanged;\n\tFX_FLOAT\t\t\t\t\t\t\tm_fOldMin;\n\tFX_FLOAT\t\t\t\t\t\t\tm_fOldMax;\n};\n\nclass CPWL_Note_Options : public CPWL_Wnd\n{\npublic:\n\tCPWL_Note_Options();\n\tvirtual ~CPWL_Note_Options();\n\n\tCPDF_Rect\t\t\t\t\t\t\tGetContentRect() const;\n\tvirtual void\t\t\t\t\t\tSetTextColor(const CPWL_Color & color);\n\tvoid\t\t\t\t\t\t\t\tSetText(const CFX_WideString& sText);\n\nprotected:\n\tvirtual void\t\t\t\t\t\tRePosChildWnd();\n\tvirtual void\t\t\t\t\t\tCreateChildWnd(const PWL_CREATEPARAM & cp);\n\tvirtual void\t\t\t\t\t\tDrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);\n\nprivate:\n\tCPWL_Label*\t\t\t\t\t\t\tm_pText;\n};\n\nclass CPWL_Note_Contents : public CPWL_ListCtrl\n{\npublic:\n\tCPWL_Note_Contents();\n\tvirtual ~CPWL_Note_Contents();\n\n\tvirtual CFX_ByteString\t\t\t\tGetClassName() const;\n\tvirtual void\t\t\t\t\t\tOnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);\n\tvirtual FX_BOOL\t\t\t\t\t\tOnLButtonDown(const CPDF_Point& point, FX_DWORD nFlag);\n\n\tvoid\t\t\t\t\t\t\t\tSetEditFocus(FX_BOOL bLast);\n\tCPWL_Edit*\t\t\t\t\t\t\tGetEdit() const;\n\npublic:\n\tvoid\t\t\t\t\t\t\t\tSetText(const CFX_WideString& sText);\n\tCFX_WideString\t\t\t\t\t\tGetText() const;\n\n\tCPWL_NoteItem*\t\t\t\t\t\tCreateSubItem();\n\tvoid\t\t\t\t\t\t\t\tDeleteSubItem(IPWL_NoteItem* pNoteItem);\n\tFX_INT32\t\t\t\t\t\t\tCountSubItems() const;\n\tIPWL_NoteItem*\t\t\t\t\t\tGetSubItems(FX_INT32 index) const;\n\n\tvirtual IPWL_NoteItem*\t\t\t\tGetHitNoteItem(const CPDF_Point& point);\n\tvoid\t\t\t\t\t\t\t\tEnableRead(FX_BOOL bEnabled);\n\tvoid\t\t\t\t\t\t\t\tEnableModify(FX_BOOL bEnabled);\n\nprotected:\n\tvirtual void\t\t\t\t\t\tCreateChildWnd(const PWL_CREATEPARAM & cp);\n\nprivate:\n\tCPWL_Note_Edit*\t\t\t\t\t\tm_pEdit;\n};\n\nclass PWL_CLASS CPWL_NoteItem : public CPWL_Wnd, public IPWL_NoteItem \n{\npublic:\n\tCPWL_NoteItem();\n\tvirtual ~CPWL_NoteItem();\n\npublic:\n\tvirtual void\t\t\t\t\t\tSetPrivateData(void* pData);\n\tvirtual void\t\t\t\t\t\tSetBkColor(const CPWL_Color& color);\n\tvirtual void\t\t\t\t\t\tSetSubjectName(const CFX_WideString& sName);\n\tvirtual void\t\t\t\t\t\tSetAuthorName(const CFX_WideString& sName);\n\tvirtual void\t\t\t\t\t\tSetDateTime(FX_SYSTEMTIME time);\n\tvirtual void\t\t\t\t\t\tSetContents(const CFX_WideString& sContents);\n\n\tvirtual IPWL_NoteItem*\t\t\t\tCreateSubItem();\n\tvirtual FX_INT32\t\t\t\t\tCountSubItems() const;\n\tvirtual IPWL_NoteItem*\t\t\t\tGetSubItems(FX_INT32 index) const;\n\tvirtual void\t\t\t\t\t\tDeleteSubItem(IPWL_NoteItem* pNoteItem);\n\tvirtual void\t\t\t\t\t\tSetFocus(){SetNoteFocus(FALSE);}\n\n\tvirtual IPWL_NoteItem*\t\t\t\tGetParentItem() const;\n\tvirtual void*\t\t\t\t\t\tGetPrivateData() const;\n\tvirtual CFX_WideString\t\t\t\tGetAuthorName() const;\n\tvirtual CPWL_Color\t\t\t\t\tGetBkColor() const;\n\tvirtual CFX_WideString\t\t\t\tGetContents() const;\n\tvirtual FX_SYSTEMTIME\t\t\t\tGetDateTime() const;\n\tvirtual CFX_WideString\t\t\t\tGetSubjectName() const;\n\tvirtual FX_BOOL\t\t\t\t\t\tIsTopItem() const { return FALSE;}\n\tvirtual CPWL_Edit*\t\t\t\t\tGetEdit() const;\n\npublic:\n\tvirtual FX_BOOL\t\t\t\t\t\tOnLButtonDown(const CPDF_Point& point, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\t\tOnRButtonUp(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual CFX_ByteString\t\t\t\tGetClassName() const;\n\tvirtual IPWL_NoteItem*\t\t\t\tGetHitNoteItem(const CPDF_Point& point);\n\tvirtual IPWL_NoteItem*\t\t\t\tGetFocusedNoteItem() const;\n\n\tvirtual void\t\t\t\t\t\tResetSubjectName(FX_INT32 nItemIndex);\n\tvoid\t\t\t\t\t\t\t\tEnableRead(FX_BOOL bEnabled);\n\tvoid\t\t\t\t\t\t\t\tEnableModify(FX_BOOL bEnabled);\n\nprotected:\n\tvirtual void\t\t\t\t\t\tRePosChildWnd();\n\tvirtual void\t\t\t\t\t\tCreateChildWnd(const PWL_CREATEPARAM & cp);\n\n\tvirtual void\t\t\t\t\t\tOnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);\n\npublic:\n\tvirtual FX_FLOAT\t\t\t\t\tGetItemHeight(FX_FLOAT fLimitWidth);\n\tvirtual FX_FLOAT\t\t\t\t\tGetItemLeftMargin();\n\tvirtual FX_FLOAT\t\t\t\t\tGetItemRightMargin();\n\tCPWL_NoteItem*\t\t\t\t\t\tCreateNoteItem();\n\tCPWL_NoteItem*\t\t\t\t\t\tGetParentNoteItem() const;\n\n\tvoid\t\t\t\t\t\t\t\tSetNoteFocus(FX_BOOL bLast);\n\tvoid\t\t\t\t\t\t\t\tOnContentsValidate();\n\t\n\tvoid\t\t\t\t\t\t\t\tOnCreateNoteItem();\n\nprotected:\n\tvoid\t\t\t\t\t\t\t\tPopupNoteItemMenu(const CPDF_Point& point);\n\n\tvirtual const CPWL_Note*\t\t\tGetNote() const;\n\tvirtual IPWL_NoteNotify*\t\t\tGetNoteNotify() const;\n\nprotected:\n\tCPWL_Label*\t\t\t\t\t\t\tm_pSubject;\n\tCPWL_Label*\t\t\t\t\t\t\tm_pDateTime;\n\tCPWL_Note_Contents*\t\t\t\t\tm_pContents;\n\nprivate:\n\tvoid*\t\t\t\t\t\t\t\tm_pPrivateData;\n\tFX_SYSTEMTIME\t\t\t\t\t\tm_dtNote;\n\tCFX_WideString\t\t\t\t\t\tm_sAuthor;\n\n\tFX_FLOAT\t\t\t\t\t\t\tm_fOldItemHeight;\n\tFX_BOOL\t\t\t\t\t\t\t\tm_bSizeChanged;\n\tFX_BOOL\t\t\t\t\t\t\t\tm_bAllowModify;\n};\n\nclass PWL_CLASS CPWL_Note : public CPWL_NoteItem\n{\npublic:\n\tCPWL_Note(IPopup_Note* pPopupNote, IPWL_NoteNotify* pNoteNotify, IPWL_NoteHandler* pNoteHandler);\n\tvirtual ~CPWL_Note();\n\npublic:\n\tvirtual void\t\t\t\t\t\tSetSubjectName(const CFX_WideString& sName);\n\tvirtual void\t\t\t\t\t\tSetAuthorName(const CFX_WideString& sName);\n\tvirtual CFX_WideString\t\t\t\tGetAuthorName() const;\n\tvirtual void\t\t\t\t\t\tSetBkColor(const CPWL_Color& color);\n\tvirtual void\t\t\t\t\t\tResetSubjectName(FX_INT32 nItemIndex){}\n\tvirtual FX_BOOL\t\t\t\t\t\tIsTopItem() const {return TRUE;}\n\tvirtual const CPWL_Note*\t\t\tGetNote() const;\n\tvirtual IPWL_NoteNotify*\t\t\tGetNoteNotify() const;\n\npublic:\n\tIPWL_NoteItem*\t\t\t\t\t\tReply();\n\tvoid\t\t\t\t\t\t\t\tEnableNotify(FX_BOOL bEnabled);\n\tvoid\t\t\t\t\t\t\t\tSetIconType(FX_INT32 nType);\n\tvoid\t\t\t\t\t\t\t\tSetOptionsText(const CFX_WideString& sText);\n\tvoid\t\t\t\t\t\t\t\tEnableRead(FX_BOOL bEnabled);\n\tvoid\t\t\t\t\t\t\t\tEnableModify(FX_BOOL bEnabled);\n\n\tCFX_WideString\t\t\t\t\t\tGetReplyString() const;\n\tvoid\t\t\t\t\t\t\t\tSetReplyString(const CFX_WideString& string);\n\n\t//0-normal / 1-caption / 2-leftbottom corner / 3-rightbottom corner / 4-close / 5-options \n\tFX_INT32\t\t\t\t\t\t\tNoteHitTest(const CPDF_Point& point) const;\n\tCPDF_Rect\t\t\t\t\t\t\tGetCaptionRect() const {return m_rcCaption;}\n\tIPopup_Note*\t\t\t\t\t\tGetPopupNote() const {return m_pPopupNote;}\n\npublic:\n\tvirtual FX_BOOL\t\t\t\t\t\tOnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\t\tOnRButtonUp(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\t\tOnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag);\n\nprotected:\n\tvirtual void\t\t\t\t\t\tRePosChildWnd();\n\tvirtual void\t\t\t\t\t\tCreateChildWnd(const PWL_CREATEPARAM & cp);\n\n\tvirtual void\t\t\t\t\t\tOnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);\n\n\tFX_BOOL\t\t\t\t\t\t\t\tResetScrollBar();\n\tvoid\t\t\t\t\t\t\t\tRePosNoteChildren();\n\tFX_BOOL\t\t\t\t\t\t\t\tScrollBarShouldVisible();\n\nprivate:\n\tCPWL_Label*\t\t\t\t\t\t\tm_pAuthor;\n\tCPWL_Note_Icon*\t\t\t\t\t\tm_pIcon;\n\tCPWL_Note_CloseBox*\t\t\t\t\tm_pCloseBox;\n\tCPWL_Note_LBBox*\t\t\t\t\tm_pLBBox;\n\tCPWL_Note_RBBox*\t\t\t\t\tm_pRBBox;\n\tCPWL_ScrollBar*\t\t\t\t\t\tm_pContentsBar;\t\n\tCPWL_Note_Options*\t\t\t\t\tm_pOptions;\n\tIPWL_NoteNotify*\t\t\t\t\tm_pNoteNotify;\n\tFX_BOOL\t\t\t\t\t\t\t\tm_bResizing;\n\tPWL_SCROLL_INFO\t\t\t\t\t\tm_OldScrollInfo;\n\tCPDF_Rect\t\t\t\t\t\t\tm_rcCaption;\n\tFX_BOOL\t\t\t\t\t\t\t\tm_bEnalbleNotify;\n\tIPopup_Note*\t\t\t\t\t\tm_pPopupNote;\n\tIPWL_NoteHandler*\t\t\t\t\tm_pNoteHandler;\n\tCFX_WideString\t\t\t\t\t\tm_sReplyString;\n};\n\n#endif\n\n"
  },
  {
    "path": "fpdfsdk/include/pdfwindow/PWL_ScrollBar.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _PWL_SCROLLBAR_H_\n#define _PWL_SCROLLBAR_H_\n\nclass CPWL_SBButton;\nclass CPWL_ScrollBar;\n\nstruct PWL_SCROLL_INFO\n{\npublic:\n\tPWL_SCROLL_INFO() : fContentMin(0.0f), fContentMax(0.0f), fPlateWidth(0.0f), fBigStep(0.0f), fSmallStep(0.0f)\n\t{\n\t}\n\tFX_FLOAT\t\t\t\t\tfContentMin;\n\tFX_FLOAT\t\t\t\t\tfContentMax;\t\n\tFX_FLOAT\t\t\t\t\tfPlateWidth;\t\n\tFX_FLOAT\t\t\t\t\tfBigStep;\n\tFX_FLOAT\t\t\t\t\tfSmallStep;\n};\n\nenum PWL_SCROLLBAR_TYPE\n{\n\tSBT_HSCROLL,\n\tSBT_VSCROLL\n};\n\nenum PWL_SBBUTTON_TYPE\n{\n\tPSBT_MIN,\n\tPSBT_MAX,\n\tPSBT_POS\n};\n\nclass CPWL_SBButton : public CPWL_Wnd  \n{\npublic:\n\tCPWL_SBButton(PWL_SCROLLBAR_TYPE eScrollBarType,PWL_SBBUTTON_TYPE eButtonType);\n\tvirtual ~CPWL_SBButton();\n\npublic:\n\tvirtual CFX_ByteString\t\tGetClassName() const;\n\tvirtual void\t\t\t\tOnCreate(PWL_CREATEPARAM & cp);\n\tvirtual void\t\t\t\tGetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);\n\tvirtual void\t\t\t\tDrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);\n\tvirtual FX_BOOL\t\t\t\tOnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\tOnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\tOnMouseMove(const CPDF_Point & point, FX_DWORD nFlag);\n\nprotected:\n\tPWL_SCROLLBAR_TYPE\t\t\tm_eScrollBarType;\n\tPWL_SBBUTTON_TYPE\t\t\tm_eSBButtonType;\n\n\tFX_BOOL\t\t\t\t\t\tm_bMouseDown;\n};\n\nstruct PWL_FLOATRANGE\n{\npublic:\n\tPWL_FLOATRANGE();\n\tPWL_FLOATRANGE(FX_FLOAT min,FX_FLOAT max);\n\tvoid Default();\n\tvoid Set(FX_FLOAT min,FX_FLOAT max);\n\tFX_BOOL\tIn(FX_FLOAT x) const;\n\tFX_FLOAT GetWidth() const;\n\n\tFX_FLOAT fMin,fMax;\n};\n\nstruct PWL_SCROLL_PRIVATEDATA\n{\npublic:\n\tPWL_SCROLL_PRIVATEDATA();\n\n\tvoid Default();\n\tvoid SetScrollRange(FX_FLOAT min,FX_FLOAT max);\n\tvoid SetClientWidth(FX_FLOAT width);\n\tvoid SetSmallStep(FX_FLOAT step);\n\tvoid SetBigStep(FX_FLOAT step);\n\tFX_BOOL SetPos(FX_FLOAT pos);\n\n\tvoid AddSmall();\n\tvoid SubSmall();\n\tvoid AddBig();\n\tvoid SubBig();\n\n\tPWL_FLOATRANGE\t\t\t\tScrollRange;\n\tFX_FLOAT\t\t\t\t\tfClientWidth;\n\tFX_FLOAT\t\t\t\t\tfScrollPos;\n\tFX_FLOAT\t\t\t\t\tfBigStep;\n\tFX_FLOAT\t\t\t\t\tfSmallStep;\n};\n\nclass CPWL_ScrollBar : public CPWL_Wnd  \n{\npublic:\n\tCPWL_ScrollBar(PWL_SCROLLBAR_TYPE sbType = SBT_HSCROLL);\n\tvirtual ~CPWL_ScrollBar();\n\npublic:\n\tvirtual CFX_ByteString\t\tGetClassName() const;\n\tvirtual void\t\t\t\tOnCreate(PWL_CREATEPARAM & cp);\n\tvirtual void\t\t\t\tRePosChildWnd();\n\tvirtual void\t\t\t\tGetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);\n\tvirtual void\t\t\t\tDrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);\n\n\tvirtual FX_BOOL\t\t\t\tOnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\tOnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual void\t\t\t\tOnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);\n\n\tvirtual void\t\t\t\tCreateChildWnd(const PWL_CREATEPARAM & cp);\n\t\n\tFX_FLOAT\t\t\t\t\tGetScrollBarWidth() const;\t\n\tPWL_SCROLLBAR_TYPE\t\t\tGetScrollBarType() const {return m_sbType;};\n\n\tvoid\t\t\t\t\t\tSetNotifyForever(FX_BOOL bForever) {m_bNotifyForever = bForever;}\n\nprotected:\t\t\t\n\tvoid\t\t\t\t\t\tSetScrollRange(FX_FLOAT fMin,FX_FLOAT fMax,FX_FLOAT fClientWidth);\n\tvoid\t\t\t\t\t\tSetScrollPos(FX_FLOAT fPos);\n\tvoid\t\t\t\t\t\tMovePosButton(FX_BOOL bRefresh);\n\tvoid\t\t\t\t\t\tSetScrollStep(FX_FLOAT fBigStep,FX_FLOAT fSmallStep);\n\tvoid\t\t\t\t\t\tNotifyScrollWindow();\n\tCPDF_Rect\t\t\t\t\tGetScrollArea() const;\n\nprivate:\n\tvoid\t\t\t\t\t\tCreateButtons(const PWL_CREATEPARAM & cp);\n\n\tvoid\t\t\t\t\t\tOnMinButtonLBDown(const CPDF_Point & point);\n\tvoid\t\t\t\t\t\tOnMinButtonLBUp(const CPDF_Point & point);\n\tvoid\t\t\t\t\t\tOnMinButtonMouseMove(const CPDF_Point & point);\n\n\tvoid\t\t\t\t\t\tOnMaxButtonLBDown(const CPDF_Point & point);\n\tvoid\t\t\t\t\t\tOnMaxButtonLBUp(const CPDF_Point & point);\n\tvoid\t\t\t\t\t\tOnMaxButtonMouseMove(const CPDF_Point & point);\n\n\tvoid\t\t\t\t\t\tOnPosButtonLBDown(const CPDF_Point & point);\n\tvoid\t\t\t\t\t\tOnPosButtonLBUp(const CPDF_Point & point);\n\tvoid\t\t\t\t\t\tOnPosButtonMouseMove(const CPDF_Point & point);\n\n\tFX_FLOAT\t\t\t\t\tTrueToFace(FX_FLOAT);\n\tFX_FLOAT\t\t\t\t\tFaceToTrue(FX_FLOAT);\n\n\tvirtual\tvoid\t\t\t\tTimerProc();\n\nprivate:\n\tPWL_SCROLLBAR_TYPE\t\t\tm_sbType;\n\tPWL_SCROLL_INFO\t\t\t\tm_OriginInfo;\n\tCPWL_SBButton*\t\t\t\tm_pMinButton;\n\tCPWL_SBButton*\t\t\t\tm_pMaxButton;\n\tCPWL_SBButton*\t\t\t\tm_pPosButton;\n\tPWL_SCROLL_PRIVATEDATA\t\tm_sData;\n\tFX_BOOL\t\t\t\t\t\tm_bMouseDown;\t\n\tFX_BOOL\t\t\t\t\t\tm_bMinOrMax;\n\tFX_BOOL\t\t\t\t\t\tm_bNotifyForever;\n\tFX_FLOAT\t\t\t\t\tm_nOldPos;\n\tFX_FLOAT\t\t\t\t\tm_fOldPosButton;\n};\n\n#endif // !defined(AFX_PWL_SCROLLBAR_H__DCFEC082_2651_48A4_B8F3_63F1B3CC5E10__INCLUDED_)\n\n\n"
  },
  {
    "path": "fpdfsdk/include/pdfwindow/PWL_Signature.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _PWL_SIGNATURE_H_\n#define _PWL_SIGNATURE_H_\n\nclass CPWL_Signature;\nclass CPWL_Label;\nclass CPWL_Signature_Image;\n\nclass CPWL_Signature_Image : public CPWL_Image\n{\npublic:\n\tCPWL_Signature_Image();\n\tvirtual ~CPWL_Signature_Image();\n\n\tvoid\t\t\t\t\t\t\t\tSetImage(CFX_DIBSource* pImage);\n\tCFX_DIBSource*\t\t\t\t\t\tGetImage();\n\nprotected:\n\tvirtual void\t\t\t\t\t\tDrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);\n\tvirtual void\t\t\t\t\t\tGetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);\n\n\tvirtual void\t\t\t\t\t\tGetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale);\n\nprivate:\n\tCFX_DIBSource*\t\t\t\t\t\tm_pImage;\n};\n\nclass PWL_CLASS CPWL_Signature : public CPWL_Wnd\n{\npublic:\n\tCPWL_Signature();\n\tvirtual ~CPWL_Signature();\n\n\tvoid\t\t\t\t\t\t\t\tSetText(FX_LPCWSTR sText);\n\tvoid\t\t\t\t\t\t\t\tSetDescription(FX_LPCWSTR string);\n\tvoid\t\t\t\t\t\t\t\tSetImage(CFX_DIBSource* pImage);\n\tvoid\t\t\t\t\t\t\t\tSetImageStream(CPDF_Stream * pStream, FX_LPCSTR sImageAlias);\n\n\tvoid\t\t\t\t\t\t\t\tSetTextFlag(FX_BOOL bTextExist);\n\tvoid\t\t\t\t\t\t\t\tSetImageFlag(FX_BOOL bImageExist);\n\tvoid\t\t\t\t\t\t\t\tSetFoxitFlag(FX_BOOL bFlagExist);\n\nprotected:\n\tvirtual void\t\t\t\t\t\tRePosChildWnd();\n\tvirtual void\t\t\t\t\t\tCreateChildWnd(const PWL_CREATEPARAM & cp);\n\n\tvirtual void\t\t\t\t\t\tDrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);\n\tvirtual void\t\t\t\t\t\tGetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);\n\nprivate:\n\tCPWL_Label*\t\t\t\t\t\t\tm_pText;\n\tCPWL_Label*\t\t\t\t\t\t\tm_pDescription;\n\tCPWL_Signature_Image*\t\t\t\tm_pImage;\n\n\tFX_BOOL\t\t\t\t\t\t\t\tm_bTextExist;\n\tFX_BOOL\t\t\t\t\t\t\t\tm_bImageExist;\n\tFX_BOOL\t\t\t\t\t\t\t\tm_bFlagExist;\n};\n\n#endif // _PWL_SIGNATURE_H_\n\n\n"
  },
  {
    "path": "fpdfsdk/include/pdfwindow/PWL_SpecialButton.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _PWL_SPECIALBUTTON_H_\n#define _PWL_SPECIALBUTTON_H_\n\n#if _MSC_VER > 1000\n#pragma once\n#endif // _MSC_VER > 1000\n\nclass PWL_CLASS CPWL_PushButton : public CPWL_Button  \n{\npublic:\n\tCPWL_PushButton();\n\tvirtual ~CPWL_PushButton();\n\npublic:\n\tvirtual CFX_ByteString\t\tGetClassName() const;\n\tvirtual CPDF_Rect\t\t\tGetFocusRect() const;\n};\n\nclass PWL_CLASS CPWL_CheckBox : public CPWL_Button\n{\npublic:\n\tCPWL_CheckBox();\n\tvirtual ~CPWL_CheckBox();\n\npublic:\n\tvirtual CFX_ByteString\t\tGetClassName() const;\n\tvirtual FX_BOOL\t\t\t\tOnLButtonUp(const CPDF_Point & point);\n\tvirtual FX_BOOL\t\t\t\tOnChar(FX_WORD nChar);\n\n\tvoid\t\t\t\t\t\tSetCheck(FX_BOOL bCheck);\n\tFX_BOOL\t\t\t\t\t\tIsChecked() const;\n\nprivate:\n\tFX_BOOL\t\t\t\t\t\tm_bChecked;\n};\n\nclass PWL_CLASS CPWL_RadioButton : public CPWL_Button\n{\npublic:\n\tCPWL_RadioButton();\n\tvirtual ~CPWL_RadioButton();\n\npublic:\n\tvirtual CFX_ByteString\t\tGetClassName() const;\n\tvirtual FX_BOOL\t\t\t\tOnLButtonUp(const CPDF_Point & point);\n\tvirtual FX_BOOL\t\t\t\tOnChar(FX_WORD nChar);\n\n\tvoid\t\t\t\t\t\tSetCheck(FX_BOOL bCheck);\n\tFX_BOOL\t\t\t\t\t\tIsChecked() const;\n\nprivate:\n\tFX_BOOL\t\t\t\t\t\tm_bChecked;\n};\n\n#endif\n\n\n"
  },
  {
    "path": "fpdfsdk/include/pdfwindow/PWL_Utils.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _PWL_UTILS_H_\n#define _PWL_UTILS_H_\n\ntemplate<class T> T PWL_MIN (const T & i, const T & j) { return ((i < j) ? i : j); }\ntemplate<class T> T PWL_MAX (const T & i, const T & j) { return ((i > j) ? i : j); }\n\n#define PWL_PDF2WIN(color)\t\t\t\t\t(FX_BYTE(color*255))\n#define PWL_WIN2PDF(color)\t\t\t\t\t((FX_FLOAT)((FX_FLOAT)color/255.0f))\n\n#define PWL_MAKEDWORD(low,high)\t\t\t\t((FX_DWORD)((FX_WORD)(low) | (FX_DWORD)(((FX_WORD)(high))<<16))) \n#define PWL_GETLOWWORD(dword)\t\t\t\t((FX_WORD)(dword))\n#define PWL_GETHIGHWORD(dword)\t\t\t\t((FX_WORD)(dword>>16))\n\n#define PWL_ICONTYPE_CHECKMARK\t\t\t\t0\n#define PWL_ICONTYPE_CIRCLE\t\t\t\t\t1\n#define PWL_ICONTYPE_COMMENT\t\t\t\t2\n#define PWL_ICONTYPE_CROSS\t\t\t\t\t3\n#define PWL_ICONTYPE_HELP\t\t\t\t\t4\n#define PWL_ICONTYPE_INSERTTEXT\t\t\t\t5\n#define PWL_ICONTYPE_KEY\t\t\t\t\t6\n#define PWL_ICONTYPE_NEWPARAGRAPH\t\t\t7\n#define PWL_ICONTYPE_TEXTNOTE\t\t\t\t8\n#define PWL_ICONTYPE_PARAGRAPH\t\t\t\t9\n#define PWL_ICONTYPE_RIGHTARROW\t\t\t\t10\n#define PWL_ICONTYPE_RIGHTPOINTER\t\t\t11\n#define PWL_ICONTYPE_STAR\t\t\t\t\t12\n#define PWL_ICONTYPE_UPARROW\t\t\t\t13\n#define PWL_ICONTYPE_UPLEFTARROW\t\t\t14\n\n#define PWL_ICONTYPE_GRAPH\t\t\t\t\t15\n#define PWL_ICONTYPE_PAPERCLIP\t\t\t\t16\n#define PWL_ICONTYPE_ATTACHMENT\t\t\t\t17\n#define PWL_ICONTYPE_TAG\t\t\t\t\t18\n\n#define PWL_ICONTYPE_FOXIT\t\t\t\t\t19\n\n#define PWL_ICONTYPE_UNKNOWN\t\t\t\t-1\n\n//checkbox & radiobutton style\n#define PCS_CHECK\t\t\t\t\t\t\t0\n#define PCS_CIRCLE\t\t\t\t\t\t\t1\n#define PCS_CROSS\t\t\t\t\t\t\t2\n#define PCS_DIAMOND\t\t\t\t\t\t\t3\n#define PCS_SQUARE\t\t\t\t\t\t\t4\n#define PCS_STAR\t\t\t\t\t\t\t5\n\n#define\tPWL_PI\t\t\t\t\t\t\t\t3.14159265358979f\n#define PWL_BEZIER\t\t\t\t\t\t\t0.5522847498308f\n\n//pushbutton layout style\n#define PPBL_LABEL\t\t\t\t\t\t\t0\n#define PPBL_ICON\t\t\t\t\t\t\t1\n#define PPBL_ICONTOPLABELBOTTOM\t\t\t\t2\n#define\tPPBL_LABELTOPICONBOTTOM\t\t\t\t3\n#define\tPPBL_ICONLEFTLABELRIGHT\t\t\t\t4\n#define PPBL_LABELLEFTICONRIGHT\t\t\t\t5\n#define PPBL_LABELOVERICON\t\t\t\t\t6\n\nclass CPWL_Point : public CPDF_Point\n{\npublic:\n\tCPWL_Point() : CPDF_Point(0.0f,0.0f){}\n\tCPWL_Point(FX_FLOAT fx, FX_FLOAT fy) : CPDF_Point(fx,fy) {}\n\tCPWL_Point(const CPWL_Point& point) : CPDF_Point(point.x, point.y) {}\n};\n\nenum PWL_PATHDATA_TYPE\n{\n\tPWLPT_MOVETO,\n\tPWLPT_LINETO,\n\tPWLPT_BEZIERTO,\n\tPWLPT_UNKNOWN\n};\n\nenum PWL_PATH_TYPE\n{\n\tPWLPT_PATHDATA,\n\tPWLPT_STREAM\n};\n\nclass CPWL_PathData\n{\npublic:\n\tCPWL_PathData() : point(), type(PWLPT_UNKNOWN){}\n\tCPWL_PathData(const CPWL_Point& pt, PWL_PATHDATA_TYPE tp) : point(pt), type(tp) {}\n\n\tCPWL_Point\t\t\t\t\t\t\t\tpoint;\n\tPWL_PATHDATA_TYPE\t\t\t\t\t\ttype;\n};\n\nclass IPWL_SpellCheck;\n\nclass PWL_CLASS CPWL_Utils\n{\npublic:\n\tstatic CPDF_Rect\t\t\t\t\t\tInflateRect(const CPDF_Rect& rcRect, FX_FLOAT fSize);\n\tstatic CPDF_Rect\t\t\t\t\t\tDeflateRect(const CPDF_Rect& rcRect, FX_FLOAT fSize);\n\tstatic FX_BOOL\t\t\t\t\t\t\tIntersectRect(const CPDF_Rect& rect1, const CPDF_Rect& rect2);\n\tstatic FX_BOOL\t\t\t\t\t\t\tContainsRect(const CPDF_Rect& rcParent, const CPDF_Rect& rcChild);\n\tstatic CPDF_Rect\t\t\t\t\t\tScaleRect(const CPDF_Rect& rcRect,FX_FLOAT fScale);\n\tstatic CPVT_WordRange\t\t\t\t\tOverlapWordRange(const CPVT_WordRange& wr1, const CPVT_WordRange& wr2);\n\tstatic CPDF_Rect\t\t\t\t\t\tGetCenterSquare(const CPDF_Rect & rect);\n\tstatic CPWL_Color\t\t\t\t\t\tSubstractColor(const CPWL_Color & sColor,FX_FLOAT fColorSub);\n\tstatic CPWL_Color\t\t\t\t\t\tDevideColor(const CPWL_Color & sColor,FX_FLOAT fColorDevide);\n\tstatic CPDF_Rect\t\t\t\t\t\tMaxRect(const CPDF_Rect & rect1,const CPDF_Rect & rect2);\n\tstatic CPDF_Rect\t\t\t\t\t\tOffsetRect(const CPDF_Rect & rect,FX_FLOAT x,FX_FLOAT y);\n\tstatic CPDF_Point\t\t\t\t\t\tOffsetPoint(const  CPDF_Point & point,FX_FLOAT x,FX_FLOAT y);\n\tstatic FX_COLORREF\t\t\t\t\t\tPWLColorToFXColor(const CPWL_Color& color, FX_INT32 nTransparancy = 255);\n\tstatic FX_BOOL\t\t\t\t\t\t\tIsBlackOrWhite(const CPWL_Color& color);\n\tstatic CPWL_Color\t\t\t\t\t\tGetReverseColor(const CPWL_Color& color);\n\n\tstatic CFX_ByteString\t\t\t\t\tGetColorAppStream(const CPWL_Color & color,const FX_BOOL & bFillOrStroke = TRUE);\n\tstatic CFX_ByteString\t\t\t\t\tGetBorderAppStream(const CPDF_Rect & rect, FX_FLOAT fWidth,\n\t\t\t\t\t\t\t\t\t\t\t\tconst CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom,\n\t\t\t\t\t\t\t\t\t\t\t\tFX_INT32 nStyle, const CPWL_Dash & dash);\n\tstatic CFX_ByteString\t\t\t\t\tGetCircleBorderAppStream(const CPDF_Rect & rect, FX_FLOAT fWidth,\n\t\t\t\t\t\t\t\t\t\t\t\tconst CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom,\n\t\t\t\t\t\t\t\t\t\t\t\tFX_INT32 nStyle, const CPWL_Dash & dash);\n\tstatic CFX_ByteString\t\t\t\t\tGetRectFillAppStream(const CPDF_Rect & rect,const CPWL_Color & color);\n\tstatic CFX_ByteString\t\t\t\t\tGetCircleFillAppStream(const CPDF_Rect & rect,const CPWL_Color & color);\n\n\tstatic CFX_ByteString\t\t\t\t\tGetPushButtonAppStream(const CPDF_Rect & rcBBox,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tIFX_Edit_FontMap * pFontMap,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tCPDF_Stream * pIconStream,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tCPDF_IconFit & IconFit,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst CFX_WideString & sLabel,\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst CPWL_Color & crText,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tFX_FLOAT fFontSize,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tFX_INT32 nLayOut);\n\tstatic CFX_ByteString\t\t\t\t\tGetCheckBoxAppStream(const CPDF_Rect & rcBBox,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tFX_INT32 nStyle,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst CPWL_Color & crText);\n\tstatic CFX_ByteString\t\t\t\t\tGetRadioButtonAppStream(const CPDF_Rect & rcBBox,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tFX_INT32 nStyle,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst CPWL_Color & crText);\n\n\tstatic CFX_ByteString\t\t\t\t\tGetEditAppStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset, const CPVT_WordRange * pRange = NULL, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tFX_BOOL bContinuous = TRUE, FX_WORD SubWord = 0);\n\tstatic CFX_ByteString\t\t\t\t\tGetEditSelAppStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst CPVT_WordRange * pRange = NULL);\n\tstatic CFX_ByteString\t\t\t\t\tGetSpellCheckAppStream(IFX_Edit* pEdit, IPWL_SpellCheck* pSpellCheck,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst CPDF_Point & ptOffset,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst CPVT_WordRange * pRange = NULL);\n\tstatic CFX_ByteString\t\t\t\t\tGetTextAppStream(const CPDF_Rect & rcBBox,IFX_Edit_FontMap * pFontMap,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst CFX_WideString & sText, FX_INT32 nAlignmentH, FX_INT32 nAlignmentV,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tFX_FLOAT fFontSize, FX_BOOL bMultiLine, FX_BOOL bAutoReturn, const CPWL_Color & crText);\n\tstatic CFX_ByteString\t\t\t\t\tGetDropButtonAppStream(const CPDF_Rect & rcBBox);\n\n\tstatic void\t\t\t\t\t\t\t\tDrawFillRect(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,const CPDF_Rect & rect,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst CPWL_Color & color, FX_INT32 nTransparancy);\n\tstatic void\t\t\t\t\t\t\t\tDrawFillRect(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst CPDF_Rect & rect,const FX_COLORREF & color);\n\tstatic void\t\t\t\t\t\t\t\tDrawStrokeRect(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,const CPDF_Rect & rect,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst FX_COLORREF & color, FX_FLOAT fWidth);\n\tstatic void\t\t\t\t\t\t\t\tDrawStrokeLine(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst CPDF_Point & ptMoveTo, const CPDF_Point & ptLineTo, const FX_COLORREF & color, FX_FLOAT fWidth);\n\tstatic void\t\t\t\t\t\t\t\tDrawBorder(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\t\t\t\t\t\t\t\t\t\t\tconst CPDF_Rect & rect, FX_FLOAT fWidth,\n\t\t\t\t\t\t\t\t\t\t\t\tconst CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom,\n\t\t\t\t\t\t\t\t\t\t\t\tFX_INT32 nStyle, const CPWL_Dash & dash, FX_INT32 nTransparancy);\n\tstatic void\t\t\t\t\t\t\t\tDrawFillArea(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst CPDF_Point* pPts, FX_INT32 nCount, const FX_COLORREF& color);\n\tstatic void\t\t\t\t\t\t\t\tDrawShadow(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tFX_BOOL bVertical, FX_BOOL bHorizontal, CPDF_Rect rect,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tFX_INT32 nTransparancy, FX_INT32 nStartGray, FX_INT32 nEndGray);\n\tstatic void\t\t\t\t\t\t\t\tDrawEditSpellCheck(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tIPWL_SpellCheck* pSpellCheck);\npublic:\n\tstatic void\t\t\t\t\t\t\t\tConvertCMYK2RGB(FX_FLOAT dC,FX_FLOAT dM,FX_FLOAT dY,FX_FLOAT dK,FX_FLOAT &dR,FX_FLOAT &dG,FX_FLOAT &dB);\n\tstatic void\t\t\t\t\t\t\t\tConvertRGB2CMYK(FX_FLOAT dR,FX_FLOAT dG,FX_FLOAT dB,FX_FLOAT &dC,FX_FLOAT &dM,FX_FLOAT &dY,FX_FLOAT &dK);\n\t\n\tstatic void\t\t\t\t\t\t\t\tConvertRGB2GRAY(FX_FLOAT dR,FX_FLOAT dG,FX_FLOAT dB,FX_FLOAT &dGray);\n\tstatic void\t\t\t\t\t\t\t\tConvertGRAY2RGB(FX_FLOAT dGray,FX_FLOAT &dR,FX_FLOAT &dG,FX_FLOAT &dB);\n\n\tstatic void\t\t\t\t\t\t\t\tConvertCMYK2GRAY(FX_FLOAT dC,FX_FLOAT dM,FX_FLOAT dY,FX_FLOAT dK,FX_FLOAT &dGray);\n\tstatic void\t\t\t\t\t\t\t\tConvertGRAY2CMYK(FX_FLOAT dGray,FX_FLOAT &dC,FX_FLOAT &dM,FX_FLOAT &dY,FX_FLOAT &dK);\n\n\tstatic void\t\t\t\t\t\t\t\tPWLColorToARGB(const CPWL_Color& color, FX_INT32& alpha, FX_FLOAT& red, FX_FLOAT& green, FX_FLOAT& blue);\n\npublic:\n\tstatic CFX_ByteString\t\t\t\t\tGetIconAppStream(FX_INT32 nType, const CPDF_Rect& rect, const CPWL_Color& crFill, \n\t\t\t\t\t\t\t\t\t\t\t\tconst CPWL_Color& crStroke = PWL_DEFAULT_BLACKCOLOR);\n\tstatic void\t\t\t\t\t\t\t\tDrawIconAppStream(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\t\t\t\t\t\t\t\t\t\t\tFX_INT32 nType, const CPDF_Rect & rect, const CPWL_Color& crFill, \n\t\t\t\t\t\t\t\t\t\t\t\tconst CPWL_Color& crStroke, const FX_INT32 nTransparancy);\n\nprivate:\n\tstatic CFX_ByteString\t\t\t\t\tGetAppStreamFromArray(const CPWL_PathData* pPathData, FX_INT32 nCount);\n\tstatic void\t\t\t\t\t\t\t\tGetPathDataFromArray(CFX_PathData& path, const CPWL_PathData* pPathData, FX_INT32 nCount);\n\n\tstatic CFX_ByteString\t\t\t\t\tGetAppStream_Check(const CPDF_Rect & rcBBox, const CPWL_Color & crText);\n\tstatic CFX_ByteString\t\t\t\t\tGetAppStream_Circle(const CPDF_Rect & rcBBox, const CPWL_Color & crText);\n\tstatic CFX_ByteString\t\t\t\t\tGetAppStream_Cross(const CPDF_Rect & rcBBox, const CPWL_Color & crText);\n\tstatic CFX_ByteString\t\t\t\t\tGetAppStream_Diamond(const CPDF_Rect & rcBBox, const CPWL_Color & crText);\n\tstatic CFX_ByteString\t\t\t\t\tGetAppStream_Square(const CPDF_Rect & rcBBox, const CPWL_Color & crText);\n\tstatic CFX_ByteString\t\t\t\t\tGetAppStream_Star(const CPDF_Rect & rcBBox, const CPWL_Color & crText);\n\n\tstatic CFX_ByteString\t\t\t\t\tGetAP_Check(const CPDF_Rect & crBBox);\n\tstatic CFX_ByteString\t\t\t\t\tGetAP_Circle(const CPDF_Rect & crBBox);\n\tstatic CFX_ByteString\t\t\t\t\tGetAP_Cross(const CPDF_Rect & crBBox);\n\tstatic CFX_ByteString\t\t\t\t\tGetAP_Diamond(const CPDF_Rect & crBBox);\n\tstatic CFX_ByteString\t\t\t\t\tGetAP_Square(const CPDF_Rect & crBBox);\n\tstatic CFX_ByteString\t\t\t\t\tGetAP_Star(const CPDF_Rect & crBBox);\n\tstatic CFX_ByteString\t\t\t\t\tGetAP_HalfCircle(const CPDF_Rect & crBBox,FX_FLOAT fRotate);\n\n\tstatic void\t\t\t\t\t\t\t\tGetGraphics_Checkmark(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);\n\tstatic void\t\t\t\t\t\t\t\tGetGraphics_Circle(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);\n\tstatic void\t\t\t\t\t\t\t\tGetGraphics_Comment(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);\n\tstatic void\t\t\t\t\t\t\t\tGetGraphics_Cross(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);\n\tstatic void\t\t\t\t\t\t\t\tGetGraphics_Help(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);\n\tstatic void\t\t\t\t\t\t\t\tGetGraphics_InsertText(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);\n\tstatic void\t\t\t\t\t\t\t\tGetGraphics_Key(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);\n\tstatic void\t\t\t\t\t\t\t\tGetGraphics_NewParagraph(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);\n\tstatic void\t\t\t\t\t\t\t\tGetGraphics_TextNote(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);\n\tstatic void\t\t\t\t\t\t\t\tGetGraphics_Paragraph(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);\n\tstatic void\t\t\t\t\t\t\t\tGetGraphics_RightArrow(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);\n\tstatic void\t\t\t\t\t\t\t\tGetGraphics_RightPointer(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);\n\tstatic void\t\t\t\t\t\t\t\tGetGraphics_Star(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);\n\tstatic void\t\t\t\t\t\t\t\tGetGraphics_UpArrow(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);\n\tstatic void\t\t\t\t\t\t\t\tGetGraphics_UpLeftArrow(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);\n\tstatic void\t\t\t\t\t\t\t\tGetGraphics_Graph(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);\n\tstatic void\t\t\t\t\t\t\t\tGetGraphics_Paperclip(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);\n\tstatic void\t\t\t\t\t\t\t\tGetGraphics_Attachment(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);\n\tstatic void\t\t\t\t\t\t\t\tGetGraphics_Tag(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);\n\tstatic void\t\t\t\t\t\t\t\tGetGraphics_Foxit(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);\n};\n\n#endif // !defined(AFX_PWL_UTILS_H__D32812AD_A875_4E08_9D3C_0A57020987C6__INCLUDED_)\n\n\n"
  },
  {
    "path": "fpdfsdk/include/pdfwindow/PWL_Wnd.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#ifndef _PWL_WND_H_\n#define _PWL_WND_H_\n\nclass IPWL_Provider;\nclass CPWL_Wnd;\nclass CPWL_MsgControl;\nclass CPWL_Wnd;\nclass CPWL_ScrollBar;\nclass CPWL_Timer;\nclass CPWL_TimerHandler;\nclass IPWL_SpellCheck;\nclass IFX_SystemHandler;\n\n#ifdef FX_READER_DLL\n\t#ifdef PWL_EXPORT\n\t\t\t#define PWL_CLASS\t\t__declspec(dllexport)\n\t\t\t#define PWL_FUNCTION\tPWL_CLASS\t\n\t\t#else\n\t\t\t#define PWL_CLASS\n\t\t\t#define PWL_FUNCTION\n\t#endif\n#else\n\t#define PWL_CLASS\n\t#define PWL_FUNCTION\n#endif\n\n//window styles\n#define PWS_CHILD\t\t\t\t\t\t\t0x80000000L\n#define PWS_BORDER\t\t\t\t\t\t\t0x40000000L\n#define PWS_BACKGROUND\t\t\t\t\t\t0x20000000L\n#define PWS_HSCROLL\t\t\t\t\t\t\t0x10000000L\n#define PWS_VSCROLL\t\t\t\t\t\t\t0x08000000L\n#define PWS_VISIBLE\t\t\t\t\t\t\t0x04000000L\n#define PWS_DISABLE\t\t\t\t\t\t\t0x02000000L\n#define PWS_READONLY\t\t\t\t\t\t0x01000000L\n#define PWS_AUTOFONTSIZE\t\t\t\t\t0x00800000L\n#define PWS_AUTOTRANSPARENT\t\t\t\t\t0x00400000L\n#define PWS_NOREFRESHCLIP\t\t\t\t\t0x00200000L\n\n//edit and label styles\n#define PES_MULTILINE\t\t\t\t\t\t0x0001L\n#define PES_PASSWORD\t\t\t\t\t\t0x0002L\n#define PES_LEFT\t\t\t\t\t\t\t0x0004L\n#define PES_RIGHT\t\t\t\t\t\t\t0x0008L\n#define PES_MIDDLE\t\t\t\t\t\t\t0x0010L\n#define PES_TOP\t\t\t\t\t\t\t\t0x0020L\n#define PES_BOTTOM\t\t\t\t\t\t\t0x0040L\n#define PES_CENTER\t\t\t\t\t\t\t0x0080L\n#define PES_CHARARRAY\t\t\t\t\t\t0x0100L\n#define PES_AUTOSCROLL\t\t\t\t\t\t0x0200L\n#define PES_AUTORETURN\t\t\t\t\t\t0x0400L\n#define PES_UNDO\t\t\t\t\t\t\t0x0800L\n#define PES_RICH\t\t\t\t\t\t\t0x1000L\n#define PES_SPELLCHECK\t\t\t\t\t\t0x2000L\n#define PES_TEXTOVERFLOW\t\t\t\t\t0x4000L\n#define PES_NOREAD\t\t\t\t\t\t\t0x8000L\n\n//listbox styles\n#define PLBS_MULTIPLESEL\t\t\t\t\t0x0001L\n#define PLBS_HOVERSEL\t\t\t\t\t\t0x0008L\n\n//combobox styles\n#define PCBS_ALLOWCUSTOMTEXT\t\t\t\t0x0001L\n\n//richedit styles\n#define PRES_MULTILINE\t\t\t\t\t\t0x0001L\n#define PRES_AUTORETURN\t\t\t\t\t\t0x0002L\n#define PRES_AUTOSCROLL\t\t\t\t\t\t0x0004L\n#define PRES_SPELLCHECK\t\t\t\t\t\t0x0008L\n#define PRES_UNDO\t\t\t\t\t\t\t0x0100L\n#define PRES_MULTIPAGES\t\t\t\t\t\t0x0200L\n#define PRES_TEXTOVERFLOW\t\t\t\t\t0x0400L\n\n//border style\n#define PBS_SOLID\t\t\t\t\t\t\t0\n#define PBS_DASH\t\t\t\t\t\t\t1\n#define PBS_BEVELED\t\t\t\t\t\t\t2\n#define PBS_INSET\t\t\t\t\t\t\t3\n#define PBS_UNDERLINED\t\t\t\t\t\t4\n#define PBS_SHADOW\t\t\t\t\t\t\t5\n\n//notification messages\n#define PNM_ADDCHILD\t\t\t\t\t\t0x00000000L\n#define PNM_REMOVECHILD\t\t\t\t\t\t0x00000001L\n#define PNM_SETSCROLLINFO\t\t\t\t\t0x00000002L\n#define PNM_SETSCROLLPOS\t\t\t\t\t0x00000003L\n#define PNM_SCROLLWINDOW\t\t\t\t\t0x00000004L\n#define PNM_LBUTTONDOWN\t\t\t\t\t\t0x00000005L\n#define PNM_LBUTTONUP\t\t\t\t\t\t0x00000006L\n#define PNM_MOUSEMOVE\t\t\t\t\t\t0x00000007L\n#define\tPNM_NOTERESET\t\t\t\t\t\t0x00000008L\n#define PNM_SETCARETINFO\t\t\t\t\t0x00000009L\n#define PNM_SELCHANGED\t\t\t\t\t\t0x0000000AL\n#define\tPNM_NOTEEDITCHANGED\t\t\t\t\t0x0000000BL\n\n#define PWL_CLASSNAME_EDIT\t\t\t\t\t\"CPWL_Edit\"\n\nstruct CPWL_Dash\n{\n\tCPWL_Dash(FX_INT32 dash, FX_INT32 gap, FX_INT32 phase) : nDash(dash), nGap(gap), nPhase(phase)\n\t{}\n\n\tFX_INT32\t\t\tnDash;\n\tFX_INT32\t\t\tnGap;\n\tFX_INT32\t\t\tnPhase;\n};\n\nstruct PWL_CLASS CPWL_Color\n{\n\tCPWL_Color(FX_INT32 type = COLORTYPE_TRANSPARENT, FX_FLOAT color1 = 0.0f, FX_FLOAT color2 = 0.0f, FX_FLOAT color3 = 0.0f, FX_FLOAT color4 = 0.0f)\n\t\t: nColorType(type), fColor1(color1), fColor2(color2), fColor3(color3), fColor4(color4)\n\t{}\n\n\tCPWL_Color(FX_INT32 r, FX_INT32 g, FX_INT32 b) :\n\t\tnColorType(COLORTYPE_RGB), fColor1(r/255.0f), fColor2(g/255.0f), fColor3(b/255.0f), fColor4(0)\n\t{}\n\t\n\tvoid ConvertColorType(FX_INT32 nColorType);\n\n\t/*\n\tCOLORTYPE_TRANSPARENT\n\tCOLORTYPE_RGB\n\tCOLORTYPE_CMYK\n\tCOLORTYPE_GRAY\n\t*/\n\tFX_INT32\t\t\t\t\tnColorType; \n\tFX_FLOAT\t\t\t\t\tfColor1,fColor2,fColor3,fColor4;\n};\n\ninline FX_BOOL operator == (const CPWL_Color &c1, const CPWL_Color &c2)\n{\n\treturn c1.nColorType == c2.nColorType && \n\t\tc1.fColor1 - c2.fColor1 < 0.0001 && c1.fColor1 - c2.fColor1 > -0.0001 &&\n\t\tc1.fColor2 - c2.fColor2 < 0.0001 && c1.fColor2 - c2.fColor2 > -0.0001 &&\n\t\tc1.fColor3 - c2.fColor3 < 0.0001 && c1.fColor3 - c2.fColor3 > -0.0001 &&\n\t\tc1.fColor4 - c2.fColor4 < 0.0001 && c1.fColor4 - c2.fColor4 > -0.0001;\n}\n\ninline FX_BOOL operator != (const CPWL_Color &c1, const CPWL_Color &c2)\n{\n\treturn !operator == (c1, c2);\n}\n\n#define PWL_SCROLLBAR_WIDTH\t\t\t\t\t12.0f\n#define PWL_SCROLLBAR_BUTTON_WIDTH\t\t\t9.0f\n#define PWL_SCROLLBAR_POSBUTTON_MINWIDTH\t2.0f\n#define PWL_SCROLLBAR_TRANSPARANCY\t\t\t150\n#define PWL_SCROLLBAR_BKCOLOR\t\t\t\tCPWL_Color(COLORTYPE_RGB,220.0f/255.0f,220.0f/255.0f,220.0f/255.0f)\n#define PWL_DEFAULT_SELTEXTCOLOR\t\t\tCPWL_Color(COLORTYPE_RGB,1,1,1)\n#define PWL_DEFAULT_SELBACKCOLOR\t\t\tCPWL_Color(COLORTYPE_RGB,0,51.0f/255.0f,113.0f/255.0f)\n#define PWL_DEFAULT_BACKCOLOR\t\t\t\tPWL_DEFAULT_SELTEXTCOLOR\n#define PWL_DEFAULT_TEXTCOLOR\t\t\t\tCPWL_Color(COLORTYPE_RGB,0,0,0)\n#define PWL_DEFAULT_FONTSIZE\t\t\t\t9.0f\n#define PWL_DEFAULT_BLACKCOLOR\t\t\t\tCPWL_Color(COLORTYPE_GRAY,0)\n#define PWL_DEFAULT_WHITECOLOR\t\t\t\tCPWL_Color(COLORTYPE_GRAY,1)\n#define PWL_DEFAULT_HEAVYGRAYCOLOR\t\t\tCPWL_Color(COLORTYPE_GRAY,0.50)\n#define PWL_DEFAULT_LIGHTGRAYCOLOR\t\t\tCPWL_Color(COLORTYPE_GRAY,0.75)\n#define PWL_TRIANGLE_HALFLEN\t\t\t\t2.0f\n#define\tPWL_CBBUTTON_TRIANGLE_HALFLEN\t\t3.0f\n#define PWL_INVALIDATE_INFLATE\t\t\t\t2\n\nclass IPWL_SpellCheck\n{\npublic:\n\tvirtual FX_BOOL\t\t\t\t\t\t\tCheckWord(FX_LPCSTR sWord) = 0;\n\tvirtual void\t\t\t\t\t\t\tSuggestWords(FX_LPCSTR sWord, CFX_ByteStringArray & sSuggest) = 0;\t\n};\n\nclass IPWL_Provider\n{\npublic:\n\t//get a matrix which map user space to CWnd client space\n\tvirtual CPDF_Matrix\t\t\t\t\t\tGetWindowMatrix(void* pAttachedData) = 0;\n\n\t/*\n\t0 L\"&Undo\\tCtrl+Z\"\n\t1 L\"&Redo\\tCtrl+Shift+Z\"\n\t2 L\"Cu&t\\tCtrl+X\"\n\t3 L\"&Copy\\tCtrl+C\"\n\t4 L\"&Paste\\tCtrl+V\"\n\t5 L\"&Delete\"\n\t6  L\"&Select All\\tCtrl+A\"\n\t*/\n\tvirtual CFX_WideString\t\t\t\t\tLoadPopupMenuString(FX_INT32 nIndex) = 0;\n};\n\nclass IPWL_FocusHandler\n{\npublic:\n\tvirtual void\t\t\t\t\t\t\tOnSetFocus(CPWL_Wnd* pWnd) = 0;\n\tvirtual void\t\t\t\t\t\t\tOnKillFocus(CPWL_Wnd* pWnd) = 0;\n};\n\nstruct PWL_CREATEPARAM\n{\npublic:\n\tPWL_CREATEPARAM() : rcRectWnd(0,0,0,0),\n\t\tpSystemHandler(NULL),\n\t\tpFontMap(NULL),\n\t\tpProvider(NULL),\n\t\tpFocusHandler(NULL),\n\t\tdwFlags(0),\n\t\tsBackgroundColor(),\n\t\thAttachedWnd(NULL),\n\t\tpSpellCheck(NULL),\n\t\tnBorderStyle(PBS_SOLID),\n\t\tdwBorderWidth(1),\n\t\tsBorderColor(),\n\t\tsTextColor(),\n\t\tsTextStrokeColor(),\n\t\tnTransparency(255),\n\t\tfFontSize(PWL_DEFAULT_FONTSIZE),\n\t\tsDash(3,0,0),\t\n\t\tpAttachedData(NULL),\n\t\tpParentWnd(NULL),\n\t\tpMsgControl(NULL),\n\t\teCursorType(FXCT_ARROW),\n\t\tmtChild(1,0,0,1,0,0)\n\t{\n\t}\n\n\tCPDF_Rect\t\t\t\trcRectWnd;\t\t\t\t//required\t\n\tIFX_SystemHandler*\t\tpSystemHandler;\t\t\t//required\n\tIFX_Edit_FontMap*\t\tpFontMap;\t\t\t\t//required for text window\n\tIPWL_Provider*\t\t\tpProvider;\t\t\t\t//required for self coordinate\n\tIPWL_FocusHandler*\t\tpFocusHandler;\t\t\t//optional\n\tFX_DWORD\t\t\t\tdwFlags;\t\t\t\t//optional\n\tCPWL_Color\t\t\t\tsBackgroundColor;\t\t//optional\n\tFX_HWND\t\t\t\t\thAttachedWnd;\t\t\t//required for no-reader framework\n\tIPWL_SpellCheck*\t\tpSpellCheck;\t\t\t//required for spellchecking\n\tFX_INT32\t\t\t\tnBorderStyle;\t\t\t//optional\n\tFX_INT32\t\t\t\tdwBorderWidth;\t\t\t//optional\n\tCPWL_Color\t\t\t\tsBorderColor;\t\t\t//optional\n\tCPWL_Color\t\t\t\tsTextColor;\t\t\t\t//optional\n\tCPWL_Color\t\t\t\tsTextStrokeColor;\t\t//optional\n\tFX_INT32\t\t\t\tnTransparency;\t\t\t//optional\n\tFX_FLOAT\t\t\t\tfFontSize;\t\t\t\t//optional\n\tCPWL_Dash\t\t\t\tsDash;\t\t\t\t\t//optional\n\tvoid*\t\t\t\t\tpAttachedData;\t\t\t//optional\n\tCPWL_Wnd*\t\t\t\tpParentWnd;\t\t\t\t//ignore\n\tCPWL_MsgControl*\t\tpMsgControl;\t\t\t//ignore\n\tFX_INT32\t\t\t\teCursorType;\t\t\t//ignore\n\tCPDF_Matrix\t\t\t\tmtChild;\t\t\t\t//ignore\n};\n\nclass CPWL_Timer\n{\npublic:\n\tCPWL_Timer(CPWL_TimerHandler* pAttached, IFX_SystemHandler* pSystemHandler);\n\tvirtual ~CPWL_Timer();\n\n\tFX_INT32\t\t\t\t\t\t\tSetPWLTimer(FX_INT32 nElapse);\n\tvoid\t\t\t\t\t\t\t\tKillPWLTimer();\n\tstatic void \t\t\t\t\t\tTimerProc(FX_INT32 idEvent);\n\nprivate:\n\tFX_INT32\t\t\t\t\t\t\tm_nTimerID;\t\n\tCPWL_TimerHandler*\t\t\t\t\tm_pAttached;\n\tIFX_SystemHandler*\t\t\t\t\tm_pSystemHandler;\n};\n\nclass PWL_CLASS CPWL_TimerHandler\n{\npublic:\n\tCPWL_TimerHandler();\n\tvirtual ~CPWL_TimerHandler();\n\n\tvoid\t\t\t\t\t\t\t\tBeginTimer(FX_INT32 nElapse);\n\tvoid\t\t\t\t\t\t\t\tEndTimer();\n\tvirtual void\t\t\t\t\t\tTimerProc();\n\tvirtual IFX_SystemHandler*\t\t\tGetSystemHandler() const = 0;\n\nprivate:\n\tCPWL_Timer*\t\t\t\t\t\t\tm_pTimer;\n};\n\nclass PWL_CLASS CPWL_Wnd : public CPWL_TimerHandler\n{\n\tfriend class CPWL_MsgControl;\npublic:\n\tCPWL_Wnd();\n\tvirtual ~CPWL_Wnd();\n\n\tvoid\t\t\t\t\t\t\tCreate(const PWL_CREATEPARAM & cp);\n\tvirtual CFX_ByteString\t\t\tGetClassName() const;\t\n\tvoid\t\t\t\t\t\t\tDestroy();\n\tvoid\t\t\t\t\t\t\tMove(const CPDF_Rect & rcNew,FX_BOOL bReset,FX_BOOL bRefresh);\n\tvirtual void\t\t\t\t\tInvalidateRect(CPDF_Rect* pRect = NULL);\n\n\tvoid\t\t\t\t\t\t\tGetAppearanceStream(CFX_ByteString & sAppStream);\n\tvoid\t\t\t\t\t\t\tDrawAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);\n\n\tvirtual FX_BOOL\t\t\t\t\tOnKeyDown(FX_WORD nChar, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\tOnKeyUp(FX_WORD nChar, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\tOnChar(FX_WORD nChar, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\tOnLButtonDblClk(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\tOnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\tOnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\tOnMButtonDblClk(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\tOnMButtonDown(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\tOnMButtonUp(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\tOnRButtonDblClk(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\tOnRButtonDown(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\tOnRButtonUp(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\tOnMouseMove(const CPDF_Point & point, FX_DWORD nFlag);\n\tvirtual FX_BOOL\t\t\t\t\tOnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag);\n\n\tvirtual void\t\t\t\t\tSetFocus();\n\tvirtual void\t\t\t\t\tKillFocus();\n\tvoid\t\t\t\t\t\t\tSetCapture();\n\tvoid\t\t\t\t\t\t\tReleaseCapture();\n\n\tvirtual void\t\t\t\t\tOnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);\n\tvirtual void\t\t\t\t\tSetTextColor(const CPWL_Color & color);\n\tvirtual void\t\t\t\t\tSetTextStrokeColor(const CPWL_Color & color);\n\tvirtual void\t\t\t\t\tSetVisible(FX_BOOL bVisible);\n\n\tvirtual CPDF_Rect\t\t\t\tGetFocusRect() const;\n\tvirtual CPWL_Color\t\t\t\tGetBackgroundColor() const;\n\tvirtual CPWL_Color\t\t\t\tGetBorderColor() const;\n\tvirtual CPWL_Color\t\t\t\tGetTextColor() const;\n\tvirtual CPWL_Color\t\t\t\tGetTextStrokeColor() const;\n\tvirtual FX_FLOAT\t\t\t\tGetFontSize() const;\n\tvirtual FX_INT32\t\t\t\tGetInnerBorderWidth() const;\n\tvirtual CPWL_Color\t\t\t\tGetBorderLeftTopColor(FX_INT32 nBorderStyle) const;\n\tvirtual CPWL_Color\t\t\t\tGetBorderRightBottomColor(FX_INT32 nBorderStyle) const;\n\n\tvirtual FX_BOOL\t\t\t\t\tIsModified() const {return FALSE;}\n\n\tvirtual void\t\t\t\t\tSetFontSize(FX_FLOAT fFontSize);\t\n\n\tvoid\t\t\t\t\t\t\tSetBackgroundColor(const CPWL_Color & color);\t\t\n\tvoid\t\t\t\t\t\t\tSetBorderColor(const CPWL_Color & color);\n\tvoid\t\t\t\t\t\t\tSetBorderWidth(FX_INT32 nBorderWidth);\n\tvoid\t\t\t\t\t\t\tSetClipRect(const CPDF_Rect & rect);\n\tvoid\t\t\t\t\t\t\tSetBorderStyle(FX_INT32 eBorderStyle);\t\n\tvoid\t\t\t\t\t\t\tSetBorderDash(const CPWL_Dash & sDash);\n\n\tCPDF_Rect\t\t\t\t\t\tGetOriginWindowRect() const;\n\tvirtual CPDF_Rect\t\t\t\tGetWindowRect() const;\n\tvirtual CPDF_Rect\t\t\t\tGetClientRect() const;\n\tCPDF_Point\t\t\t\t\t\tGetCenterPoint() const;\n\tCPDF_Rect\t\t\t\t\t\tGetClientCenterSquare() const;\n\tCPDF_Rect\t\t\t\t\t\tGetWindowCenterSquare() const;\t\t\n\tFX_INT32\t\t\t\t\t\tGetBorderWidth() const;\t\t\n\tFX_BOOL\t\t\t\t\t\t\tIsVisible() const {return m_bVisible;}\t\n\tFX_BOOL\t\t\t\t\t\t\tHasFlag(FX_DWORD dwFlags) const;\n\tvoid\t\t\t\t\t\t\tAddFlag(FX_DWORD dwFlags);\n\tvoid\t\t\t\t\t\t\tRemoveFlag(FX_DWORD dwFlags);\n\tCPDF_Rect\t\t\t\t\t\tGetClipRect() const;\t\t\n\tCPWL_Wnd*\t\t\t\t\t\tGetParentWindow() const;\t\t\n\tFX_INT32\t\t\t\t\t\tGetBorderStyle() const;\t\n\tCPWL_Dash\t\t\t\t\t\tGetBorderDash() const;\n\tvoid*\t\t\t\t\t\t\tGetAttachedData() const;\n\t\n\tFX_BOOL\t\t\t\t\t\t\tWndHitTest(const CPDF_Point & point) const;\n\tFX_BOOL\t\t\t\t\t\t\tClientHitTest(const CPDF_Point & point) const;\n\tFX_BOOL\t\t\t\t\t\t\tIsCaptureMouse() const;\n\n\tconst CPWL_Wnd*\t\t\t\t\tGetFocused() const;\n\tFX_BOOL\t\t\t\t\t\t\tIsFocused() const;\n\tFX_BOOL\t\t\t\t\t\t\tIsReadOnly() const;\n\tCPWL_ScrollBar*\t\t\t\t\tGetVScrollBar() const;\n\n\tIFX_Edit_FontMap*\t\t\t\tGetFontMap() const;\n\tIPWL_Provider*\t\t\t\t\tGetProvider() const;\n\tvirtual IFX_SystemHandler*\t\tGetSystemHandler() const;\n\tIPWL_FocusHandler*\t\t\t\tGetFocusHandler() const;\n\t\n\tFX_INT32\t\t\t\t\t\tGetTransparency();\n\tvoid\t\t\t\t\t\t\tSetTransparency(FX_INT32 nTransparency);\n\n\tCPDF_Matrix\t\t\t\t\t\tGetChildToRoot() const;\n\tCPDF_Matrix\t\t\t\t\t\tGetChildMatrix() const;\n\tvoid\t\t\t\t\t\t\tSetChildMatrix(const CPDF_Matrix& mt);\n\tCPDF_Matrix\t\t\t\t\t\tGetWindowMatrix() const;\n\n\tvirtual CPDF_Point\t\t\t\tChildToParent(const CPDF_Point& point) const;\n\tvirtual CPDF_Rect\t\t\t\tChildToParent(const CPDF_Rect& rect) const;\n\tvirtual CPDF_Point\t\t\t\tParentToChild(const CPDF_Point& point) const;\n\tvirtual CPDF_Rect\t\t\t\tParentToChild(const CPDF_Rect& rect) const;\n\n\t//those methods only implemented by listctrl item\n\tvirtual FX_FLOAT\t\t\t\tGetItemHeight(FX_FLOAT fLimitWidth) {return 0;} \n\tvirtual FX_FLOAT\t\t\t\tGetItemLeftMargin() {return 0;} \n\tvirtual FX_FLOAT\t\t\t\tGetItemRightMargin() {return 0;} \n\n\tvoid\t\t\t\t\t\t\tEnableWindow(FX_BOOL bEnable);\n\tFX_BOOL\t\t\t\t\t\t\tIsEnabled();\n\tvirtual void\t\t\t\t\tSetCursor();\n\nprotected:\t\n\tvirtual void\t\t\t\t\tCreateChildWnd(const PWL_CREATEPARAM & cp);\n\tvirtual void\t\t\t\t\tRePosChildWnd();\n\tvoid\t\t\t\t\t\t\tGetAppearanceStream(CFX_ByteTextBuf & sAppStream);\n\tvirtual void\t\t\t\t\tGetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);\n\tvirtual void\t\t\t\t\tGetChildAppearanceStream(CFX_ByteTextBuf & sAppStream);\n\n\tvirtual void\t\t\t\t\tDrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);\n\tvirtual void\t\t\t\t\tDrawChildAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);\n\n\tvirtual void\t\t\t\t\tOnCreate(PWL_CREATEPARAM & cp);\n\tvirtual void\t\t\t\t\tOnCreated();\n\tvirtual void\t\t\t\t\tOnDestroy();\n\n\tvirtual void\t\t\t\t\tOnSetFocus();\n\tvirtual void\t\t\t\t\tOnKillFocus();\n\n\tvirtual void\t\t\t\t\tOnEnabled();\n\tvirtual void\t\t\t\t\tOnDisabled();\n\n\tvoid\t\t\t\t\t\t\tSetNotifyFlag(FX_BOOL bNotifying = TRUE){m_bNotifying = bNotifying;};\n \n\tFX_BOOL\t\t\t\t\t\t\tIsValid() const;\n\tPWL_CREATEPARAM\t\t\t\t\tGetCreationParam() const;\t\t\n\tFX_BOOL\t\t\t\t\t\t\tIsNotifying() const {return m_bNotifying;}\t\n\t\n\tvoid\t\t\t\t\t\t\tInvalidateRectMove(const CPDF_Rect & rcOld, const CPDF_Rect & rcNew);\n\n\tvoid\t\t\t\t\t\t\tPWLtoWnd(const CPDF_Point & point, FX_INT32& x, FX_INT32& y) const;\n\tFX_RECT\t\t\t\t\t\t\tPWLtoWnd(const CPDF_Rect & rect) const;\t\n\tFX_HWND\t\t\t\t\t\t\tGetAttachedHWnd() const;\n\t\n\tFX_BOOL\t\t\t\t\t\t\tIsWndCaptureMouse(const CPWL_Wnd * pWnd) const;\n\tFX_BOOL\t\t\t\t\t\t\tIsWndCaptureKeyboard(const CPWL_Wnd * pWnd) const;\t\n\tconst CPWL_Wnd*\t\t\t\t\tGetRootWnd() const;\t\n\n\tFX_BOOL\t\t\t\t\t\t\tIsCTRLpressed(FX_DWORD nFlag) const;\n\tFX_BOOL\t\t\t\t\t\t\tIsSHIFTpressed(FX_DWORD nFlag) const;\n\tFX_BOOL\t\t\t\t\t\t\tIsALTpressed(FX_DWORD nFlag) const;\n\tFX_BOOL\t\t\t\t\t\t\tIsINSERTpressed(FX_DWORD nFlag) const;\n\nprivate:\n\tvoid\t\t\t\t\t\t\tAddChild(CPWL_Wnd * pWnd);\n\tvoid\t\t\t\t\t\t\tRemoveChild(CPWL_Wnd * pWnd);\n\n\tvoid\t\t\t\t\t\t\tCreateScrollBar(const PWL_CREATEPARAM & cp);\n\tvoid\t\t\t\t\t\t\tCreateVScrollBar(const PWL_CREATEPARAM & cp);\t\n\n\tvoid\t\t\t\t\t\t\tAjustStyle();\t\n\tvoid\t\t\t\t\t\t\tCreateMsgControl();\n\tvoid\t\t\t\t\t\t\tDestroyMsgControl();\n\t\n\tCPWL_MsgControl*\t\t\t\tGetMsgControl() const;\t\n\t\nprotected:\n\tCFX_ArrayTemplate<CPWL_Wnd*>\tm_aChildren;\n\nprivate:\n\tPWL_CREATEPARAM\t\t\t\t\tm_sPrivateParam;\n\t\n\tCPWL_ScrollBar*\t\t\t\t\tm_pVScrollBar;\n\n\tCPDF_Rect\t\t\t\t\t\tm_rcWindow;\n\tCPDF_Rect\t\t\t\t\t\tm_rcClip;\n\n\tFX_BOOL\t\t\t\t\t\t\tm_bCreated;\t\t\t\n\tFX_BOOL\t\t\t\t\t\t\tm_bVisible;\n\tFX_BOOL\t\t\t\t\t\t\tm_bNotifying;\t\n\tFX_BOOL\t\t\t\t\t\t\tm_bEnabled;\n};\n\n// #ifndef VK_END\n// \n// #define VK_END            0x23\n// #define VK_HOME           0x24\n// #define VK_LEFT           0x25\n// #define VK_UP             0x26\n// #define VK_RIGHT          0x27\n// #define VK_DOWN           0x28\n// #define VK_INSERT         0x2D\n// #define VK_DELETE         0x2E\n// \n// #define VK_BACK           0x08\n// #define VK_TAB            0x09\n// \n// #define VK_CLEAR          0x0C\n// #define VK_RETURN         0x0D\n// #define VK_ESCAPE         0x1B\n// #define VK_SPACE          0x20\n// #endif\n// \n// #define VK_NONE\t\t\t  0\n\n#endif // !defined(AFX_PWL_WND_H__D32812AD_A875_4E08_9D3C_0A57020987C6__INCLUDED_)\n\n\n"
  },
  {
    "path": "fpdfsdk/src/formfiller/FFL_CBA_Fontmap.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/formfiller/FormFiller.h\"\n#include \"../../include/formfiller/FFL_CBA_Fontmap.h\"\n\nCBA_FontMap::CBA_FontMap(CPDFSDK_Annot* pAnnot, IFX_SystemHandler* pSystemHandler) :\n\tCPWL_FontMap(pSystemHandler),\n\tm_pDocument(NULL),\n\tm_pAnnotDict(NULL),\n\tm_pDefaultFont(NULL),\n\tm_sAPType(\"N\")\n{\n\tASSERT(pAnnot != NULL);\n\n\tCPDF_Page* pPage = pAnnot->GetPDFPage();\n\n\tm_pDocument = pPage->m_pDocument;\n\tm_pAnnotDict = pAnnot->GetPDFAnnot()->m_pAnnotDict;\n}\n\nCBA_FontMap::CBA_FontMap(CPDF_Document* pDocument, CPDF_Dictionary* pAnnotDict, \n\t\t\t\t\t\t IFX_SystemHandler* pSystemHandler) :\n\tCPWL_FontMap(pSystemHandler),\n\tm_pDocument(pDocument),\n\tm_pAnnotDict(pAnnotDict),\n\tm_pDefaultFont(NULL),\n\tm_sAPType(\"N\")\n{\n}\n\nCBA_FontMap::~CBA_FontMap()\n{\n}\n\nvoid CBA_FontMap::Reset()\n{\n\tEmpty();\n\tm_pDefaultFont = NULL;\n\tm_sDefaultFontName = \"\";\n}\n\nvoid CBA_FontMap::Initial(FX_LPCSTR fontname)\n{\n\tFX_INT32 nCharset = DEFAULT_CHARSET;\n\n\tif (!m_pDefaultFont)\n\t{\n\t\tm_pDefaultFont = GetAnnotDefaultFont(m_sDefaultFontName);\t\n\t\tif (m_pDefaultFont)\n\t\t{\n\t\t\tif (const CFX_SubstFont* pSubstFont = m_pDefaultFont->GetSubstFont())\n\t\t\t\tnCharset = pSubstFont->m_Charset;\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (m_sDefaultFontName == \"Wingdings\" || m_sDefaultFontName == \"Wingdings2\" ||\n\t\t\t\t\tm_sDefaultFontName == \"Wingdings3\" || m_sDefaultFontName == \"Webdings\")\n\t\t\t\t\t\tnCharset = SYMBOL_CHARSET;\n\t\t\t\telse\n\t\t\t\t\tnCharset = ANSI_CHARSET;\n\t\t\t}\n\t\t\tAddFontData(m_pDefaultFont, m_sDefaultFontName, nCharset);\n\t\t\tAddFontToAnnotDict(m_pDefaultFont, m_sDefaultFontName);\n\t\t}\n\t}\n\n\tif (nCharset != ANSI_CHARSET)\n\t\tCPWL_FontMap::Initial(fontname);\n}\n\nvoid CBA_FontMap::SetDefaultFont(CPDF_Font * pFont, const CFX_ByteString & sFontName)\n{\n\tASSERT(pFont != NULL);\n\n\tif (m_pDefaultFont) return;\n\n\tm_pDefaultFont = pFont;\n\tm_sDefaultFontName = sFontName;\n\n//\tif (m_sDefaultFontName.IsEmpty())\n//\t\tm_sDefaultFontName = pFont->GetFontTypeName();\n\n\tFX_INT32 nCharset = DEFAULT_CHARSET;\n\tif (const CFX_SubstFont* pSubstFont = m_pDefaultFont->GetSubstFont())\n\t\tnCharset = pSubstFont->m_Charset;\n\tAddFontData(m_pDefaultFont, m_sDefaultFontName, nCharset);\n}\n\nCPDF_Font* CBA_FontMap::FindFontSameCharset(CFX_ByteString& sFontAlias, FX_INT32 nCharset)\n{\n\tASSERT(m_pAnnotDict != NULL);\n\n\tif (m_pAnnotDict->GetString(\"Subtype\") == \"Widget\")\n\t{\n\t\tCPDF_Document* pDocument = GetDocument();\n\t\tASSERT(pDocument != NULL);\n\n\t\tCPDF_Dictionary * pRootDict = pDocument->GetRoot();\n\t\tif (!pRootDict) return NULL;\n\n\t\tCPDF_Dictionary* pAcroFormDict = pRootDict->GetDict(\"AcroForm\");\n\t\tif (!pAcroFormDict) return NULL;\n\n\t\tCPDF_Dictionary * pDRDict = pAcroFormDict->GetDict(\"DR\");\n\t\tif (!pDRDict) return NULL;\n\n\t\treturn FindResFontSameCharset(pDRDict, sFontAlias, nCharset);\n\t}\n\n\treturn NULL;\n}\n\nCPDF_Document* CBA_FontMap::GetDocument()\n{\n\treturn m_pDocument;\n}\n\nCPDF_Font* CBA_FontMap::FindResFontSameCharset(CPDF_Dictionary* pResDict, CFX_ByteString& sFontAlias, \n\t\t\t\t\t\t\t\t\t\t\t\t\tFX_INT32 nCharset)\n{\n\tif (!pResDict) return NULL;\n\n\tCPDF_Document* pDocument = GetDocument();\n\tASSERT(pDocument != NULL);\n\n\tCPDF_Dictionary* pFonts = pResDict->GetDict(\"Font\");\n\tif (pFonts == NULL) return NULL;\n\n\tCPDF_Font* pFind = NULL;\n\n\tFX_POSITION pos = pFonts->GetStartPos();\n\twhile (pos)\n\t{\n\t\tCPDF_Object* pObj = NULL;\n\t\tCFX_ByteString csKey;\n\t\tpObj = pFonts->GetNextElement(pos, csKey);\n\t\tif (pObj == NULL) continue;\n\n\t\tCPDF_Object* pDirect = pObj->GetDirect();\n\t\tif (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) continue;\n\n\t\tCPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;\n\t\tif (pElement->GetString(\"Type\") != \"Font\") continue;\n\n\t\tCPDF_Font* pFont = pDocument->LoadFont(pElement);\n\t\tif (pFont == NULL) continue;\n\t\tconst CFX_SubstFont* pSubst = pFont->GetSubstFont();\n\t\tif (pSubst == NULL) continue;\n\t\tif (pSubst->m_Charset == nCharset)\n\t\t{\n\t\t\tsFontAlias = csKey;\n\t\t\tpFind = pFont;\n\t\t}\n\t}\n\treturn pFind;\n}\n\nvoid CBA_FontMap::AddedFont(CPDF_Font* pFont, const CFX_ByteString& sFontAlias)\n{\n\tAddFontToAnnotDict(pFont, sFontAlias);\n}\n\nvoid CBA_FontMap::AddFontToAnnotDict(CPDF_Font* pFont, const CFX_ByteString& sAlias)\n{\n\tif (!pFont)\treturn;\n\n\tASSERT(m_pAnnotDict != NULL);\n\tASSERT(m_pDocument != NULL);\n\n\tCPDF_Dictionary* pAPDict = m_pAnnotDict->GetDict(\"AP\");\n\n\tif (pAPDict == NULL) \n\t{\n\t\tpAPDict = FX_NEW CPDF_Dictionary;\n\t\tm_pAnnotDict->SetAt(\"AP\", pAPDict);\n\t}\n\n\t//to avoid checkbox and radiobutton\n\tCPDF_Object* pObject = pAPDict->GetElement(m_sAPType);\n\tif (pObject && pObject->GetType() == PDFOBJ_DICTIONARY)\n\t\treturn;\n\n\tCPDF_Stream* pStream = pAPDict->GetStream(m_sAPType);\n\tif (pStream == NULL) \n\t{\n\t\tpStream = FX_NEW CPDF_Stream(NULL, 0, NULL);\n\t\tFX_INT32 objnum = m_pDocument->AddIndirectObject(pStream);\n\t\tpAPDict->SetAtReference(m_sAPType, m_pDocument, objnum);\n\t}\n\n\tCPDF_Dictionary * pStreamDict = pStream->GetDict();\n\n\tif (!pStreamDict)\n\t{\n\t\tpStreamDict = FX_NEW CPDF_Dictionary;\n\t\tpStream->InitStream(NULL, 0, pStreamDict);\n\t}\n\n\tif (pStreamDict)\n\t{\n\t\tCPDF_Dictionary* pStreamResList = pStreamDict->GetDict(\"Resources\");\n\t\tif (!pStreamResList)\n\t\t{\n\t\t\tpStreamResList = FX_NEW CPDF_Dictionary();\n\t\t\tpStreamDict->SetAt(\"Resources\", pStreamResList);\n\t\t}\n\n\t\tif (pStreamResList) \n\t\t{\n\t\t\tCPDF_Dictionary* pStreamResFontList = pStreamResList->GetDict(\"Font\");\n\t\t\tif (!pStreamResFontList) \n\t\t\t{\n\t\t\t\tpStreamResFontList = FX_NEW CPDF_Dictionary;\n\t\t\t\tFX_INT32 objnum = m_pDocument->AddIndirectObject(pStreamResFontList);\n\t\t\t\tpStreamResList->SetAtReference(\"Font\", m_pDocument, objnum);\n\t\t\t}\n\t\t\tif (!pStreamResFontList->KeyExist(sAlias))\n\t\t\t\tpStreamResFontList->SetAtReference(sAlias, m_pDocument, pFont->GetFontDict());\n\t\t}\n\t}\n}\n\nCPDF_Font* CBA_FontMap::GetAnnotDefaultFont(CFX_ByteString &sAlias)\n{\n\tASSERT(m_pAnnotDict != NULL);\n\tASSERT(m_pDocument != NULL);\n\n\tCPDF_Dictionary* pAcroFormDict = NULL;\n\n\tFX_BOOL bWidget = (m_pAnnotDict->GetString(\"Subtype\") == \"Widget\");\n\n\tif (bWidget)\n\t{\n\t\tif (CPDF_Dictionary * pRootDict = m_pDocument->GetRoot())\n\t\t\tpAcroFormDict = pRootDict->GetDict(\"AcroForm\");\n\t}\n\t\n\tCFX_ByteString sDA;\n\tCPDF_Object* pObj;\n\tif ((pObj = FPDF_GetFieldAttr(m_pAnnotDict, \"DA\")))\n\t\tsDA = pObj->GetString();\n\n\tif (bWidget)\n\t{\n\t\tif (sDA.IsEmpty())\n\t\t{\n\t\t\tpObj = FPDF_GetFieldAttr(pAcroFormDict, \"DA\");\n\t\t\tsDA = pObj ? pObj->GetString() : CFX_ByteString();\n\t\t}\n\t}\n\t\n\tCPDF_Dictionary * pFontDict = NULL;\t\n\n\tif (!sDA.IsEmpty())\n\t{\n\t\tCPDF_SimpleParser syntax(sDA);\n\t\tsyntax.FindTagParam(\"Tf\", 2);\n\t\tCFX_ByteString sFontName = syntax.GetWord();\n\t\tsAlias = PDF_NameDecode(sFontName).Mid(1);\n\n\t\tif (CPDF_Dictionary * pDRDict = m_pAnnotDict->GetDict(\"DR\"))\n\t\t\tif (CPDF_Dictionary* pDRFontDict = pDRDict->GetDict(\"Font\"))\n\t\t\t\tpFontDict = pDRFontDict->GetDict(sAlias);\n\n\t\tif (!pFontDict)\n\t\t\tif (CPDF_Dictionary* pAPDict = m_pAnnotDict->GetDict(\"AP\"))\n\t\t\t\tif (CPDF_Dictionary* pNormalDict = pAPDict->GetDict(\"N\"))\n\t\t\t\t\tif (CPDF_Dictionary* pNormalResDict = pNormalDict->GetDict(\"Resources\"))\n\t\t\t\t\t\tif (CPDF_Dictionary* pResFontDict = pNormalResDict->GetDict(\"Font\"))\n\t\t\t\t\t\t\tpFontDict = pResFontDict->GetDict(sAlias);\n\n\t\tif (bWidget)\n\t\t{\t\t\t\n\t\t\tif (!pFontDict)\n\t\t\t{\n\t\t\t\tif (pAcroFormDict)\n\t\t\t\t{\n\t\t\t\t\tif (CPDF_Dictionary * pDRDict = pAcroFormDict->GetDict(\"DR\"))\n\t\t\t\t\t\tif (CPDF_Dictionary* pDRFontDict = pDRDict->GetDict(\"Font\"))\n\t\t\t\t\t\t\tpFontDict = pDRFontDict->GetDict(sAlias);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (pFontDict)\n\t\treturn m_pDocument->LoadFont(pFontDict);\n\telse\n\t\treturn NULL;\n}\n\nvoid CBA_FontMap::SetAPType(const CFX_ByteString& sAPType)\n{\n\tm_sAPType = sAPType;\n\n\tReset();\n\tInitial();\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/formfiller/FFL_CheckBox.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/formfiller/FormFiller.h\"\n#include \"../../include/formfiller/FFL_FormFiller.h\"\n#include \"../../include/formfiller/FFL_CheckBox.h\"\n\n\n/* ------------------------------- CFFL_CheckBox ------------------------------- */\n\nCFFL_CheckBox::CFFL_CheckBox(CPDFDoc_Environment* pApp, CPDFSDK_Widget* pWidget) :\n\tCFFL_Button(pApp, pWidget)\n{\n}\n\nCFFL_CheckBox::~CFFL_CheckBox()\n{\n}\n\nCPWL_Wnd* CFFL_CheckBox::NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView)\n{\n\tCPWL_CheckBox* pWnd = new CPWL_CheckBox();\n\tpWnd->Create(cp);\n\n\tASSERT(m_pWidget != NULL);\n\tpWnd->SetCheck(m_pWidget->IsChecked());\n\t\n\treturn pWnd;\n}\n\nFX_BOOL\tCFFL_CheckBox::OnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags)\n{\n\tswitch (nKeyCode)\n\t{\n\tcase FWL_VKEY_Return:\n\tcase FWL_VKEY_Space:\n\t\treturn TRUE;\n\tdefault:\n\t\treturn CFFL_FormFiller::OnKeyDown(pAnnot, nKeyCode, nFlags);\n\t}\n}\nFX_BOOL\tCFFL_CheckBox::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)\n{\n\tswitch (nChar)\n\t{\n\tcase FWL_VKEY_Return:\t\n\tcase FWL_VKEY_Space:\n\t\t{\n\t\t\tCFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller();\n\t\t\tASSERT(pIFormFiller != NULL);\n\n\t\t\tCPDFSDK_PageView* pPageView = pAnnot->GetPageView();\n\t\t\tASSERT(pPageView != NULL);\n\n\t\t\tFX_BOOL bReset = FALSE;\n\t\t\tFX_BOOL bExit = FALSE;\n\n\t\t\tpIFormFiller->OnButtonUp(m_pWidget, pPageView, bReset, bExit,nFlags);\n\n\t\t\tif (bReset) return TRUE;\n\t\t\tif (bExit) return TRUE;\n\n\t\t\tCFFL_FormFiller::OnChar(pAnnot, nChar, nFlags);\n\n\t\t\tif (CPWL_CheckBox * pWnd = (CPWL_CheckBox*)GetPDFWindow(pPageView, TRUE))\n\t\t\t\tpWnd->SetCheck(!pWnd->IsChecked());\n\n\t\t\tCommitData(pPageView,nFlags);\n\t\t\treturn TRUE;\n\t\t}\n\tdefault:\n\t\treturn CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags);\n\t}\n}\n\nFX_BOOL CFFL_CheckBox::OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)\n{\n\tCFFL_Button::OnLButtonUp(pPageView, pAnnot, nFlags, point);\n\n\tif (IsValid())\n\t{\n\t\tif (CPWL_CheckBox * pWnd = (CPWL_CheckBox*)GetPDFWindow(pPageView, TRUE))\n\t\t{\n\t\t\tCPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;\n\t\t\tpWnd->SetCheck(!pWidget->IsChecked());\n\t\t//\tpWnd->SetCheck(!pWnd->IsChecked());\n\t\t}\n\n\t\tif (!CommitData(pPageView, nFlags)) return FALSE;\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL\tCFFL_CheckBox::IsDataChanged(CPDFSDK_PageView* pPageView)\n{\n\n\tASSERT(m_pWidget != NULL);\n\n\tif (CPWL_CheckBox* pWnd = (CPWL_CheckBox*)GetPDFWindow(pPageView, FALSE))\n\t{\n\t\treturn pWnd->IsChecked() != m_pWidget->IsChecked();\n\t}\n\n\treturn FALSE;\n}\n\nvoid CFFL_CheckBox::SaveData(CPDFSDK_PageView* pPageView)\n{\n\n\tASSERT(m_pWidget != NULL);\n\n\tif (CPWL_CheckBox* pWnd = (CPWL_CheckBox*)GetPDFWindow(pPageView, FALSE))\n\t{\n\t\t\n\t\tFX_BOOL bNewChecked = pWnd->IsChecked();\n\t\t\n\n\t\tif (bNewChecked)\n\t\t{\n\t\t\tCPDF_FormField* pField = m_pWidget->GetFormField();\n\t\t\tASSERT(pField != NULL);\n\n\t\t\tfor (FX_INT32 i=0,sz=pField->CountControls(); i<sz; i++)\n\t\t\t{\n\t\t\t\tif (CPDF_FormControl* pCtrl = pField->GetControl(i))\n\t\t\t\t{\n\t\t\t\t\tif (pCtrl->IsChecked())\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tm_pWidget->SetCheck(bNewChecked, FALSE);\n\t\tm_pWidget->UpdateField();\n\t\tSetChangeMark();\n\t}\n\n}\n"
  },
  {
    "path": "fpdfsdk/src/formfiller/FFL_ComboBox.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/formfiller/FormFiller.h\"\n#include \"../../include/formfiller/FFL_FormFiller.h\"\n#include \"../../include/formfiller/FFL_IFormFiller.h\"\n#include \"../../include/formfiller/FFL_CBA_Fontmap.h\"\n#include \"../../include/formfiller/FFL_ComboBox.h\"\n\n\n/* ------------------------------- CFFL_ComboBox ------------------------------- */\n\nCFFL_ComboBox::CFFL_ComboBox(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot) :\n\tCFFL_FormFiller(pApp, pAnnot), m_pFontMap( NULL )\n{\n\t//m_pFontMap = new CBA_FontMap( pAnnot, GetSystemHandler() );\n        m_State.nIndex = 0;\n        m_State.nStart = 0;\n        m_State.nEnd   = 0;\n}\n\nCFFL_ComboBox::~CFFL_ComboBox()\n{\n\tif (m_pFontMap)\n\t{\n\t\tdelete m_pFontMap;\n\t\tm_pFontMap = NULL;\n\t}\n\n// \tfor (int i=0,sz=m_IMBox.GetSize(); i<sz; i++)\n// \t{\n// \t\tdelete m_IMBox.GetAt(i);\n// \t}\n// \n// \tm_IMBox.RemoveAll();\n}\n\nPWL_CREATEPARAM CFFL_ComboBox::GetCreateParam()\n{\n\tPWL_CREATEPARAM cp = CFFL_FormFiller::GetCreateParam();\n\n\tASSERT(m_pWidget != NULL);\n\n\tint nFlags = m_pWidget->GetFieldFlags();\n\t\n\tif (nFlags & FIELDFLAG_EDIT)\n\t{\t\t\n\t\tcp.dwFlags |= PCBS_ALLOWCUSTOMTEXT;\n\t}\n\n\t/*\n\tif (nFlags & FIELDFLAG_COMMITONSELCHANGE)\n\t{\t\t\n\t\tm_bCommitOnSelectChange = TRUE;\n\t}\n\t*/\n\n\tif (!m_pFontMap)\n\t{\n\t\tASSERT(this->m_pApp != NULL);\n\t\tm_pFontMap = new CBA_FontMap(m_pWidget, GetSystemHandler());\n\t\tm_pFontMap->Initial();\n\t}\n\n\tcp.pFontMap = m_pFontMap;\n\tcp.pFocusHandler = this;\n\n\treturn cp;\n}\n\nCPWL_Wnd* CFFL_ComboBox::NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView)\n{\n\tCPWL_ComboBox * pWnd = new CPWL_ComboBox();\n\tpWnd->AttachFFLData(this);\n\tpWnd->Create(cp);\n\n\tASSERT(m_pApp != NULL);\n\tCFFL_IFormFiller* pFormFiller = m_pApp->GetIFormFiller();\n\tpWnd->SetFillerNotify(pFormFiller);\n\n\tASSERT(m_pWidget != NULL);\n\tFX_INT32 nCurSel = m_pWidget->GetSelectedIndex(0);\n\t\n\tCFX_WideString swText;\n\t\n\tif (nCurSel < 0)\n\t\tswText = m_pWidget->GetValue();\n\telse\n\t\tswText = m_pWidget->GetOptionLabel(nCurSel);\n\t\n\tfor (FX_INT32 i=0,sz=m_pWidget->CountOptions(); i<sz; i++)\n\t{\n\t\tpWnd->AddString(m_pWidget->GetOptionLabel(i));\t\t\t\n\t}\n\t\n\tpWnd->SetSelect(nCurSel);\n\tpWnd->SetText(swText);\n\t\n\treturn pWnd;\n}\n\n\nFX_BOOL\tCFFL_ComboBox::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)\n{\n\treturn CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags);\n}\n\nFX_BOOL\tCFFL_ComboBox::IsDataChanged(CPDFSDK_PageView* pPageView)\n{\n\tif (CPWL_ComboBox * pWnd = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))\n\t{\n\t\tFX_INT32 nCurSel = pWnd->GetSelect();\n\n\t\tASSERT(m_pWidget != NULL);\n\n\t\tif (m_pWidget->GetFieldFlags() & FIELDFLAG_EDIT)\n\t\t{\n\t\t\tif (nCurSel >= 0)\n\t\t\t{\n\t\t\t\treturn nCurSel != m_pWidget->GetSelectedIndex(0);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn pWnd->GetText() != m_pWidget->GetValue();\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn nCurSel != m_pWidget->GetSelectedIndex(0);\n\t\t}\n\t}\n\t\n\treturn FALSE;\n}\n\nvoid CFFL_ComboBox::SaveData(CPDFSDK_PageView* pPageView)\n{\n\tASSERT(m_pWidget != NULL);\n\n\tif (CPWL_ComboBox* pWnd = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))\n\t{\n\t\tCFX_WideString swText = pWnd->GetText();\n\t\tFX_INT32 nCurSel = pWnd->GetSelect();\n\n\t\t//mantis:0004157\n\t\tFX_BOOL bSetValue = TRUE;\n\n\t\tif (m_pWidget->GetFieldFlags() & FIELDFLAG_EDIT)\n\t\t{\n\t\t\tif (nCurSel >= 0)\n\t\t\t{\n\t\t\t\tif (swText != m_pWidget->GetOptionLabel(nCurSel))\n\t\t\t\t\tbSetValue = TRUE;\n\t\t\t\telse\n\t\t\t\t\tbSetValue = FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t\tbSetValue = TRUE;\n\t\t}\n\t\telse\n\t\t\tbSetValue = FALSE;\n\n\t\tCFX_WideString sOldValue;\n\t\t\n\n\t\tif (bSetValue)\n\t\t{\n\t\t\tsOldValue = m_pWidget->GetValue();\n\t\t\tm_pWidget->SetValue(swText, FALSE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_pWidget->GetSelectedIndex(0);\n\t\t\tm_pWidget->SetOptionSelection(nCurSel, TRUE, FALSE);\n\t\t}\n\n\t\tm_pWidget->ResetFieldAppearance(TRUE);\n\t\tm_pWidget->UpdateField();\n\t\tSetChangeMark();\n\n\t\tm_pWidget->GetPDFPage();\n\t\t\n\n\t}\n}\n\n void CFFL_ComboBox::GetActionData( CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type, PDFSDK_FieldAction& fa)\n{\n\tswitch (type)\n\t{\n\tcase CPDF_AAction::KeyStroke:\n\t\tif (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))\n\t\t{\n\t\t\tif (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)\n\t\t\t{\n\t\t\t\tfa.bFieldFull = pEdit->IsTextFull();\t\n\t\t\t\tint nSelStart = 0;\n\t\t\t\tint nSelEnd = 0;\n\t\t\t\tpEdit->GetSel(nSelStart, nSelEnd);\n\t\t\t\tfa.nSelEnd = nSelEnd;\n\t\t\t\tfa.nSelStart = nSelStart;\n\t\t\t\tfa.sValue = pEdit->GetText();\n\t\t\t\tfa.sChangeEx = GetSelectExportText();\n\n\t\t\t\tif (fa.bFieldFull)\n\t\t\t\t{\n\t\t\t\t\tfa.sChange = L\"\";\n\t\t\t\t\tfa.sChangeEx = L\"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tbreak;\n\tcase CPDF_AAction::Validate:\n\t\tif (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))\n\t\t{\n\t\t\tif (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)\n\t\t\t{\n\t\t\t\tfa.sValue = pEdit->GetText();\n\t\t\t}\n\t\t}\n\t\tbreak;\n\tcase CPDF_AAction::LoseFocus:\n\tcase CPDF_AAction::GetFocus:\n\t\tASSERT(m_pWidget != NULL);\n\t\tfa.sValue = m_pWidget->GetValue();\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n}\n\n\n\nvoid CFFL_ComboBox::SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type, \n\t\t\t\t\t\t\t\t\tconst PDFSDK_FieldAction& fa)\n{\n\tswitch (type)\n\t{\n\tcase CPDF_AAction::KeyStroke:\n\t\tif (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))\n\t\t{\n\t\t\tif (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)\n\t\t\t{\n\t\t\t\tpEdit->SetSel(fa.nSelStart, fa.nSelEnd);\n\t\t\t\tpEdit->ReplaceSel(fa.sChange);\n\t\t\t}\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n}\n\nFX_BOOL\tCFFL_ComboBox::IsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld, \n\t\t\t\t\t\t\t\t\tconst PDFSDK_FieldAction& faNew)\n{\n\tswitch (type)\n\t{\n\tcase CPDF_AAction::KeyStroke:\n\t\treturn (!faOld.bFieldFull && faOld.nSelEnd != faNew.nSelEnd) || faOld.nSelStart != faNew.nSelStart ||\n\t\t\tfaOld.sChange != faNew.sChange;\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn FALSE;\n}\n\nvoid CFFL_ComboBox::SaveState(CPDFSDK_PageView* pPageView)\n{\n\tASSERT(pPageView != NULL);\n\n\tif (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))\n\t{\n\t\tm_State.nIndex = pComboBox->GetSelect();\n\n\t\tif (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)\n\t\t{\n\t\t\tpEdit->GetSel(m_State.nStart, m_State.nEnd);\n\t\t\tm_State.sValue = pEdit->GetText();\n\t\t}\n\t}\n}\n\nvoid CFFL_ComboBox::RestoreState(CPDFSDK_PageView* pPageView)\n{\n\tASSERT(pPageView != NULL);\n\n\tif (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, TRUE))\n\t{\n\t\tif (m_State.nIndex >= 0)\n\t\t\tpComboBox->SetSelect(m_State.nIndex);\n\t\telse\n\t\t{\n\t\t\tif (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)\n\t\t\t{\n\t\t\t\tpEdit->SetText(m_State.sValue);\n\t\t\t\tpEdit->SetSel(m_State.nStart, m_State.nEnd);\n\t\t\t}\n\t\t}\n\t}\n}\n\nCPWL_Wnd* CFFL_ComboBox::ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue)\n{\n\tif (bRestoreValue)\n\t\tSaveState(pPageView);\n\t\n\tDestroyPDFWindow(pPageView);\n\t\n\tCPWL_Wnd* pRet = NULL;\n\t\n\tif (bRestoreValue)\n\t{\n\t\tRestoreState(pPageView);\n\t\tpRet = this->GetPDFWindow(pPageView, FALSE);\n\t}\n\telse\n\t\tpRet = this->GetPDFWindow(pPageView, TRUE);\n\t\n\tm_pWidget->UpdateField();\n\t\n\treturn pRet;\n}\n\nvoid CFFL_ComboBox::OnKeyStroke(FX_BOOL bKeyDown, FX_UINT nFlag)\n{\n\tASSERT(m_pWidget != NULL);\n\t\n\tint nFlags = m_pWidget->GetFieldFlags();\n\t\n\tif (nFlags & FIELDFLAG_COMMITONSELCHANGE)\n\t{\n\t\tif (m_bValid)\n\t\t{\n\t\t\tCPDFSDK_PageView* pPageView = this->GetCurPageView();\n\t\t\tASSERT(pPageView != NULL);\n\n\t\t\tif (CommitData(pPageView, nFlag))\n\t\t\t{\n\t\t\t\tDestroyPDFWindow(pPageView);\n\t\t\t\tm_bValid = FALSE;\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid CFFL_ComboBox::OnSetFocus(CPWL_Wnd* pWnd)\n{\n\tASSERT(m_pApp != NULL);\n\n\tASSERT(pWnd != NULL);\n\n\tif (pWnd->GetClassName() == PWL_CLASSNAME_EDIT)\n\t{\n\t\tCPWL_Edit* pEdit = (CPWL_Edit*)pWnd;\n\t\tpEdit->SetCharSet(134);\n\t\tpEdit->SetCodePage(936);\n\n\t\tpEdit->SetReadyToInput();\n\t\tCFX_WideString wsText = pEdit->GetText();\n\t\tint nCharacters = wsText.GetLength();\n\t\tCFX_ByteString bsUTFText = wsText.UTF16LE_Encode();\n\t\tunsigned short* pBuffer = (unsigned short*)(FX_LPCSTR)bsUTFText;\n\t\tm_pApp->FFI_OnSetFieldInputFocus(m_pWidget->GetFormField(), pBuffer, nCharacters, TRUE);\n\n \t\tpEdit->SetEditNotify(this);\n\t}\n}\n\nvoid CFFL_ComboBox::OnKillFocus(CPWL_Wnd* pWnd)\n{\n\tASSERT(m_pApp != NULL);\n}\n\nFX_BOOL\tCFFL_ComboBox::CanCopy(CPDFSDK_Document* pDocument)\n{\n\tASSERT(pDocument != NULL);\n\n\treturn FALSE;\n}\n\nFX_BOOL CFFL_ComboBox::CanCut(CPDFSDK_Document* pDocument)\n{\n\tASSERT(pDocument != NULL);\n\n\treturn FALSE;\n}\n\nFX_BOOL\tCFFL_ComboBox::CanPaste(CPDFSDK_Document* pDocument)\n{\n\tASSERT(pDocument != NULL);\n\n\treturn FALSE;\n}\n\nvoid CFFL_ComboBox::DoCopy(CPDFSDK_Document* pDocument)\n{\n\tASSERT(pDocument != NULL);\n}\n\nvoid CFFL_ComboBox::DoCut(CPDFSDK_Document* pDocument)\n{\n\tASSERT(pDocument != NULL);\n}\n\nvoid CFFL_ComboBox::DoPaste(CPDFSDK_Document* pDocument)\n{\n\tASSERT(pDocument != NULL);\n}\n\nvoid CFFL_ComboBox::OnAddUndo(CPWL_Edit* pEdit)\n{\n\tASSERT(pEdit != NULL);\n}\n\nCFX_WideString CFFL_ComboBox::GetSelectExportText()\n{\n\tCFX_WideString swRet;\n\t\n\tint nExport = -1;\n\tCPDFSDK_PageView *pPageView = GetCurPageView();\n\tif (CPWL_ComboBox * pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))\n\t{\n\t\tnExport = pComboBox->GetSelect();\n\t}\n\t\n\tif (nExport >= 0)\n\t{\n\t\tif (CPDF_FormField * pFormField = m_pWidget->GetFormField())\n\t\t{\n\t\t\tswRet = pFormField->GetOptionValue(nExport);\n\t\t\tif (swRet.IsEmpty())\n\t\t\t\tswRet = pFormField->GetOptionLabel(nExport);\n\t\t}\n\t}\n\t\n\treturn swRet;\n}\n"
  },
  {
    "path": "fpdfsdk/src/formfiller/FFL_FormFiller.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n\n#include \"../../include/formfiller/FFL_FormFiller.h\"\n#include \"../../include/formfiller/FFL_Notify.h\"\n#include \"../../include/formfiller/FFL_CBA_Fontmap.h\"\n\n#define GetRed(rgb)\t\t\t((FX_BYTE)(rgb))\n#define GetGreen(rgb)\t\t((FX_BYTE)(((FX_WORD)(rgb)) >> 8))\n#define GetBlue(rgb)\t\t((FX_BYTE)((rgb)>>16))\n\n#define FFL_HINT_ELAPSE\t\t800\n\n/* ------------------------- CFFL_FormFiller ------------------------- */\n\nCFFL_FormFiller::CFFL_FormFiller(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot)\n\t:m_pApp(pApp),\n\tm_pAnnot(pAnnot),\n\tm_bValid(FALSE),\n\tm_ptOldPos(0,0)\n{ \n\tm_pWidget = (CPDFSDK_Widget*) pAnnot;\n}\n\nCFFL_FormFiller::~CFFL_FormFiller()\n{\n\tFX_POSITION pos = m_Maps.GetStartPosition();\n\twhile (pos)\n\t{\n\t\tCPDFSDK_PageView * pPageView = NULL;\n\t\tCPWL_Wnd* pWnd = NULL;\n\t\tm_Maps.GetNextAssoc(pos, pPageView, pWnd);\n\n\t\tif (pWnd)\n\t\t{\n\t\t\tCFFL_PrivateData* pData = (CFFL_PrivateData*)pWnd->GetAttachedData();\n\t\t\tpWnd->Destroy();\n\t\t\tdelete pWnd;\n\t\t\tdelete pData;\n\t\t}\n\t}\n\tm_Maps.RemoveAll();\n\n}\n\nvoid CFFL_FormFiller::SetWindowRect(CPDFSDK_PageView* pPageView, const CPDF_Rect& rcWindow)\n{\n\tif (CPWL_Wnd* pWnd = this->GetPDFWindow(pPageView, FALSE))\n\t{\n\t\tpWnd->Move(CPDF_Rect(rcWindow), TRUE, FALSE);\n\t}\n}\n\nCPDF_Rect CFFL_FormFiller::GetWindowRect(CPDFSDK_PageView* pPageView)\n{\n\tif (CPWL_Wnd* pWnd = this->GetPDFWindow(pPageView, FALSE))\n\t{\n\t\treturn pWnd->GetWindowRect();\n\t}\n\n\treturn CPDF_Rect(0,0,0,0);\n}\n\nFX_RECT CFFL_FormFiller::GetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)\n{\n\tASSERT(pPageView != NULL);\n\tASSERT(pAnnot != NULL);\n\n\tCPDF_Rect rcAnnot = m_pWidget->GetRect();\n\n\tif (CPWL_Wnd* pWnd = this->GetPDFWindow(pPageView, FALSE))\n\t{\n\t\tCPDF_Rect rcWindow = pWnd->GetWindowRect();\n\t\trcAnnot = PWLtoFFL(rcWindow);\n\t}\n\n\tCPDF_Rect rcWin = rcAnnot;\n//\tpPageView->DocToWindow(rcAnnot, rcWin);\n\n\tCPDF_Rect rcFocus = this->GetFocusBox(pPageView);\n\tif (!rcFocus.IsEmpty())\n\t\trcWin.Union(rcFocus);\n\n\tCPDF_Rect rect = CPWL_Utils::InflateRect(rcWin,1);\n\n\treturn rect.GetOutterRect();\n}\n\nvoid CFFL_FormFiller::OnDraw(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot, \n\t\t\t\t\t\tCFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\t\t\t\t\t/*const CRect& rcWindow,*/ FX_DWORD dwFlags)\n{\n\tASSERT(pAnnot->GetPDFAnnot()->GetSubType() == \"Widget\");\n\n\tif (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))\n\t{\n\t\tCPDF_Matrix mt = this->GetCurMatrix();\n\t\tmt.Concat(*pUser2Device);\n\t\tpWnd->DrawAppearance(pDevice,&mt);\n\t}\n\telse\n\t{\n\t\tCPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;\n\t\tif (CFFL_IFormFiller::IsVisible(pWidget))\n\t\t\tpWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);\n\t}\n}\n\nvoid CFFL_FormFiller::OnDrawDeactive(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot, \n\t\t\t\t\t\tCFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\t\t\t\t\t/*const CRect& rcWindow,*/ FX_DWORD dwFlags)\n{\n\tASSERT(pAnnot != NULL);\n\t\n\tCPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;\n\t\n\tpWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);\n}\n\n\nvoid CFFL_FormFiller::OnCreate(CPDFSDK_Annot* pAnnot)\n{\n}\n\nvoid CFFL_FormFiller::OnLoad(CPDFSDK_Annot* pAnnot)\n{\n}\n\nvoid CFFL_FormFiller::OnDelete(CPDFSDK_Annot* pAnnot)\n{\n}\n\nvoid CFFL_FormFiller::OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)\n{\n}\n\nvoid CFFL_FormFiller::OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)\n{\n\tEndTimer();\n\tASSERT(m_pWidget != NULL);\n}\n\nFX_BOOL CFFL_FormFiller::OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)\n{\n\tif (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, TRUE))\n\t{\t\t\n\t\tm_bValid = TRUE;\n\t\tFX_RECT rect = this->GetViewBBox(pPageView,pAnnot);\n\t\tthis->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);\n\n \t\tif(!rect.Contains((int)point.x, (int)point.y))\n  \t\t\treturn FALSE;\n\n\t\treturn pWnd->OnLButtonDown(WndtoPWL(pPageView, point),nFlags);\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL\tCFFL_FormFiller::OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)\n{\n\tif (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))\n\t{\t\n\t\tFX_RECT rcFFL =  this->GetViewBBox(pPageView, pAnnot);\n\t\tthis->InvalidateRect(rcFFL.left, rcFFL.top, rcFFL.right, rcFFL.bottom);\n\t\tpWnd->OnLButtonUp(WndtoPWL(pPageView, point),nFlags);\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL\tCFFL_FormFiller::OnLButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)\n{\n\tif (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))\n\t{\t\t\t\t\n\t\tpWnd->OnLButtonDblClk(WndtoPWL(pPageView, point),nFlags);\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL CFFL_FormFiller::OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)\n{\n\tif ((m_ptOldPos.x != point.x) || (m_ptOldPos.y != point.y))\n\t{\n\t\tm_ptOldPos = point;\n\t}\n\n\tif (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))\n\t{\t\t\t\t\n\t\tpWnd->OnMouseMove(WndtoPWL(pPageView, point),nFlags);\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL CFFL_FormFiller::OnMouseWheel(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, short zDelta, const CPDF_Point& point)\n{\n\tif (!IsValid()) return FALSE;\n\n\tif (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, TRUE))\n\t{\t\t\t\t\n\t\treturn pWnd->OnMouseWheel(zDelta, WndtoPWL(pPageView, point),nFlags);\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL CFFL_FormFiller::OnRButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)\n{\n\tif (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, TRUE))\n\t{\t\t\t\t\n\t\tpWnd->OnRButtonDown(WndtoPWL(pPageView, point),nFlags);\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL\tCFFL_FormFiller::OnRButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)\n{\n\tif (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))\n\t{\t\t\t\t\n\t\tpWnd->OnRButtonUp(WndtoPWL(pPageView, point),nFlags);\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL\tCFFL_FormFiller::OnRButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)\n{\n\tif (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))\n\t{\t\t\t\t\n\t\tpWnd->OnRButtonDblClk(WndtoPWL(pPageView, point),nFlags);\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL CFFL_FormFiller::OnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags)\n{\n\tif (IsValid())\n\t{\n\t\tCPDFSDK_PageView* pPageView = this->GetCurPageView();\n\t\tASSERT(pPageView != NULL);\n\n\t\tif (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))\n\t\t{\t\t\t\t\n\t\t\treturn pWnd->OnKeyDown(nKeyCode,nFlags);\n\t\t}\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL\tCFFL_FormFiller::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)\n{\n\tif (IsValid())\n\t{\n\t\tCPDFSDK_PageView* pPageView = this->GetCurPageView();\n\t\tASSERT(pPageView != NULL);\n\n\t\tif (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))\n\t\t{\t\t\t\t\n\t\t\treturn pWnd->OnChar(nChar,nFlags);\n\t\t}\n\t}\n\n\treturn FALSE;\n}\n\nvoid CFFL_FormFiller::OnDeSelected(CPDFSDK_Annot* pAnnot)\n{\n\tASSERT(FALSE);\n}\n\nvoid CFFL_FormFiller::OnSelected(CPDFSDK_Annot* pAnnot)\n{\n\tASSERT(FALSE);\n}\n\nFX_BOOL\tCFFL_FormFiller::OnSetFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag)\n{\n\tCPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;\n\n\tCPDF_Page * pPage = pWidget->GetPDFPage();\n \tCPDFSDK_Document * pDoc = m_pApp->GetCurrentDoc();\n\tCPDFSDK_PageView* pPageView = pDoc->GetPageView(pPage);\n \tASSERT(pPageView != NULL);\n\n \t\n\n\tCPWL_Wnd * pWnd = NULL;\n\tif ( (pWnd = GetPDFWindow(pPageView, TRUE)))\n\t{\t\t\t\t\n\t\tpWnd->SetFocus();\n\t}\n\n\tm_bValid = TRUE;\n\t\n\t\n\t\n\n\tm_bValid = TRUE;\n\tFX_RECT rcRect = this->GetViewBBox(pPageView,pAnnot);\n\tthis->InvalidateRect(rcRect.left, rcRect.top, rcRect.right, rcRect.bottom);\n\t\n\treturn TRUE;\n}\n\nFX_BOOL\tCFFL_FormFiller::OnKillFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag)\n{\n\tif (IsValid())\n\t{\n\t\tCPDFSDK_PageView* pPageView = this->GetCurPageView();\n\t\tASSERT(pPageView != NULL);\n\n\t\tCommitData(pPageView, nFlag);\n\n\t\tif (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE))\n\t\t{\t\t\t\t\n\t\t\tpWnd->KillFocus();\n\t\t}\n\t\t\n\t\tswitch (m_pWidget->GetFieldType())\n\t\t{\n\t\tcase FIELDTYPE_PUSHBUTTON:\n\t\tcase FIELDTYPE_CHECKBOX:\n\t\tcase FIELDTYPE_RADIOBUTTON:\n\t\t\tEscapeFiller(pPageView, TRUE);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tEscapeFiller(pPageView, FALSE);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL\tCFFL_FormFiller::IsValid() const\n{\n\treturn m_bValid;\n}\n\nPWL_CREATEPARAM\tCFFL_FormFiller::GetCreateParam()\n{\n\tASSERT(m_pApp != NULL);\n\n\tPWL_CREATEPARAM cp;\n\n\tcp.pParentWnd = NULL;\t\n\tcp.pProvider = this;\n\tcp.rcRectWnd = GetPDFWindowRect();\n\t\n\tFX_DWORD dwCreateFlags = PWS_BORDER | PWS_BACKGROUND | PWS_VISIBLE;\n\n\tASSERT(m_pWidget != NULL);\n\n\n\tFX_DWORD dwFieldFlag = m_pWidget->GetFieldFlags();\n\n\tif (dwFieldFlag & FIELDFLAG_READONLY)\n\t{\t\t\n\t\tdwCreateFlags |= PWS_READONLY;\n\t}\n\n\tFX_COLORREF color;\n\tif (m_pWidget->GetFillColor(color))\n\t{\n\t\tcp.sBackgroundColor = CPWL_Color(GetRed(color), GetGreen(color), GetBlue(color));\n\t}\n\n\tif (m_pWidget->GetBorderColor(color))\n\t{\n\t\tcp.sBorderColor = CPWL_Color(GetRed(color), GetGreen(color), GetBlue(color));\n\t}\n\n\tcp.sTextColor = CPWL_Color(COLORTYPE_GRAY,0);\n\n\tif (m_pWidget->GetTextColor(color))\n\t{\n\t\tcp.sTextColor = CPWL_Color(GetRed(color), GetGreen(color), GetBlue(color));\n\t}\n\n\tcp.fFontSize = m_pWidget->GetFontSize();\n\tcp.dwBorderWidth = m_pWidget->GetBorderWidth();\n\t\n\tint nBorderStyle = m_pWidget->GetBorderStyle();\n\n\tswitch (nBorderStyle)\n\t{\n\tcase BBS_SOLID:\n\t\tcp.nBorderStyle = PBS_SOLID;\n\t\tbreak;\n\tcase BBS_DASH:\n\t\tcp.nBorderStyle = PBS_DASH;\n\t\tcp.sDash = CPWL_Dash(3,3,0);\t\t\t\n\t\tbreak;\n\tcase BBS_BEVELED:\n\t\tcp.nBorderStyle = PBS_BEVELED;\n\t\tcp.dwBorderWidth *= 2;\n\t\tbreak;\n\tcase BBS_INSET:\n\t\tcp.nBorderStyle = PBS_INSET;\n\t\tcp.dwBorderWidth *= 2;\n\t\tbreak;\n\tcase BBS_UNDERLINE:\n\t\tcp.nBorderStyle = PBS_UNDERLINED;\n\t\tbreak;\n\t}\n\n\tif (cp.fFontSize <= 0)\n\t{\n\t\tdwCreateFlags |= PWS_AUTOFONTSIZE;\n\t}\n\n\tcp.dwFlags = dwCreateFlags;\n\tcp.pSystemHandler = m_pApp->GetSysHandler();\n\treturn cp;\n}\n\nCPWL_Wnd* CFFL_FormFiller::GetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bNew)\n{\n\tASSERT(pPageView != NULL);\n\tASSERT(m_pWidget != NULL);\n\n\tCPWL_Wnd* pWnd = NULL;\n\tm_Maps.Lookup(pPageView, pWnd);\n\n\tif (bNew)\n\t{\n\t\tif (pWnd)\n\t\t{\n\t\t\tCFFL_PrivateData* pPrivateData = (CFFL_PrivateData*)pWnd->GetAttachedData();\n\t\t\tASSERT(pPrivateData != NULL);\n\n\t\t\tif (pPrivateData->nWidgetAge != m_pWidget->GetAppearanceAge())\n\t\t\t{\n\t\t\t\treturn this->ResetPDFWindow(pPageView, m_pWidget->GetValueAge() == pPrivateData->nValueAge);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tPWL_CREATEPARAM cp = GetCreateParam();\n\t\t\tcp.hAttachedWnd = (FX_HWND)m_pWidget;\n\n\t\t\tCFFL_PrivateData* pPrivateData = new CFFL_PrivateData;\n\t\t\tpPrivateData->pWidget = m_pWidget;\n\t\t\tpPrivateData->pPageView = pPageView;\n\t\t\tpPrivateData->nWidgetAge = m_pWidget->GetAppearanceAge();\n                        pPrivateData->nValueAge = 0;\n\n\t\t\tcp.pAttachedData = pPrivateData;\n\n\t\t\tpWnd = NewPDFWindow(cp, pPageView);\n\n\t\t\tif (pWnd)\n\t\t\t{\n\t\t\t\tm_Maps.SetAt(pPageView, pWnd);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn pWnd;\n}\n\nvoid CFFL_FormFiller::DestroyPDFWindow(CPDFSDK_PageView* pPageView)\n{\n\tCPWL_Wnd* pWnd = NULL;\n\tm_Maps.Lookup(pPageView, pWnd);\n\n\tif (pWnd)\n\t{\n\t\tCFFL_PrivateData* pData = (CFFL_PrivateData*)pWnd->GetAttachedData();\n\t\tpData->pPageView = NULL;\n\t\tpWnd->Destroy();\n\t\tdelete pWnd;\n\t\tdelete pData;\n\t}\n\n\tm_Maps.RemoveKey(pPageView);\n}\n\nCPDF_Matrix\tCFFL_FormFiller::GetWindowMatrix(void* pAttachedData)\n{\n\tif (CFFL_PrivateData* pPrivateData = (CFFL_PrivateData*)pAttachedData)\n\t{\n\t\tif (pPrivateData->pPageView)\n\t\t{\n\t\t\tCPDF_Matrix mtPageView;\n\t\t\tpPrivateData->pPageView->GetCurrentMatrix(mtPageView);\n\t\t\tCPDF_Matrix mt = GetCurMatrix();\n\t\t\tmt.Concat(mtPageView);\n\t\t\t\n\t\t\treturn mt;\n\t\t}\n\t}\n\treturn CPDF_Matrix(1,0,0,1,0,0);\n}\n\nCPDF_Matrix\tCFFL_FormFiller::GetCurMatrix()\n{\n\tCPDF_Matrix mt;\n\n\tASSERT(m_pWidget != NULL);\n\n\tCPDF_Rect rcDA ;\n\tm_pWidget->GetPDFAnnot()->GetRect(rcDA);\n\n\n\tswitch (m_pWidget->GetRotate())\n\t{\n\tdefault:\n\tcase 0:\t\t\n\t\tmt = CPDF_Matrix(1,0,0,1,0,0);\n\t\tbreak;\n\tcase 90:\n\t\tmt = CPDF_Matrix(0,1,-1,0,rcDA.right - rcDA.left,0);\n\t\tbreak;\n\tcase 180:\n\t\tmt = CPDF_Matrix(-1,0,0,-1,rcDA.right - rcDA.left,rcDA.top - rcDA.bottom);\n\t\tbreak;\n\tcase 270:\n\t\tmt = CPDF_Matrix(0,-1,1,0,0,rcDA.top - rcDA.bottom);\n\t\tbreak;\n\t}\n\tmt.e += rcDA.left;\n\tmt.f += rcDA.bottom;\n\n\treturn mt;\n}\n\nCFX_WideString CFFL_FormFiller::LoadPopupMenuString(int nIndex)\n{\n\tASSERT(m_pApp != NULL);\n\n\treturn L\"\";\n}\n\nCPDF_Rect CFFL_FormFiller::GetPDFWindowRect() const\n{\n\tASSERT(m_pWidget != NULL);\n\n\tCPDF_Rect rectAnnot;\n\tm_pWidget->GetPDFAnnot()->GetRect(rectAnnot);\n\n\tFX_FLOAT fWidth = rectAnnot.right - rectAnnot.left;\n\tFX_FLOAT fHeight = rectAnnot.top - rectAnnot.bottom;\n\n\n\tif ((m_pWidget->GetRotate() / 90) & 0x01)\n\t\treturn CPDF_Rect(0,0,fHeight,fWidth);\n\telse\n\t\treturn CPDF_Rect(0,0,fWidth,fHeight);\n}\n\nCPDFSDK_PageView* CFFL_FormFiller::GetCurPageView()\n{\n\n\tCPDF_Page* pPage = m_pAnnot->GetPDFPage();\n\tCPDFSDK_Document* pSDKDoc = m_pApp->GetCurrentDoc();\n\tif(pSDKDoc)\n\t{\n\t\treturn pSDKDoc->GetPageView(pPage);\n\t}\n\treturn NULL;\n}\n\nCPDF_Rect CFFL_FormFiller::GetFocusBox(CPDFSDK_PageView* pPageView)\n{\n\tif (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))\n\t{\t\t\t\n\t\tCPDF_Rect rcFocus =  FFLtoWnd(pPageView, PWLtoFFL(pWnd->GetFocusRect()));\n\t\tASSERT(pPageView);\n\t\tCPDF_Rect rcPage = pPageView->GetPDFPage()->GetPageBBox();\n\t\tif(rcPage.Contains(rcFocus))\n\t\t\treturn rcFocus;\n\t\telse\n\t\t\treturn CPDF_Rect(0,0,0,0);\n\t}\n\treturn CPDF_Rect(0,0,0,0);\n}\n\nCPDF_Rect CFFL_FormFiller::FFLtoPWL(const CPDF_Rect& rect)\n{\n\tCPDF_Matrix mt;\n\tmt.SetReverse(GetCurMatrix());\n\t\n\tCPDF_Rect temp = rect;\n\tmt.TransformRect(temp);\n\n\treturn temp;\n}\n\nCPDF_Rect CFFL_FormFiller::PWLtoFFL(const CPDF_Rect& rect)\n{\n\tCPDF_Matrix mt = GetCurMatrix();\n\t\n\tCPDF_Rect temp = rect;\n\tmt.TransformRect(temp);\n\n\treturn temp;\n}\n\nCPDF_Point CFFL_FormFiller::FFLtoPWL(const CPDF_Point& point)\n{\n\tCPDF_Matrix mt;\n\tmt.SetReverse(GetCurMatrix());\n\n\tCPDF_Point pt = point;\n\tmt.Transform(pt.x,pt.y);\n\n\treturn pt;\n}\n\nCPDF_Point CFFL_FormFiller::PWLtoFFL(const CPDF_Point & point)\n{\n\tCPDF_Matrix mt = GetCurMatrix();\n\n\tCPDF_Point pt = point;\n\tmt.Transform(pt.x,pt.y);\n\n\treturn pt;\n}\n\nCPDF_Point CFFL_FormFiller::WndtoPWL(CPDFSDK_PageView* pPageView, const CPDF_Point& pt)\n{\n// \tASSERT(pPageView != NULL);\n// \n// \tCPDF_Point point(0.0f, 0.0f);\n// \tpPageView->WindowToDoc(pt.x, pt.y, point.x, point.y);\n// \n \treturn FFLtoPWL(pt);\n//\treturn CPDF_Point(0, 0);\n}\n\nCPDF_Rect CFFL_FormFiller::FFLtoWnd(CPDFSDK_PageView* pPageView, const CPDF_Rect & rect)\n{\n// \tFX_RECT rcRet(0,0,0,0);\n// \n// \tASSERT(pPageView != NULL);\t\n// \tpPageView->DocToWindow(rect, rcRet);\n// \t\n \treturn rect;\n\n}\n\nvoid CFFL_FormFiller::FFL_FreeData(void* pData)\n{\n\tASSERT(pData != NULL);\n\n\tdelete (CFFL_PrivateData*)pData;\n}\n\nFX_BOOL CFFL_FormFiller::CommitData(CPDFSDK_PageView* pPageView, FX_UINT nFlag)\n{\n\tif (IsDataChanged(pPageView))\n\t{\n\t\t//CFFL_IFormFiller* pIFormFiller = CFFL_Module::GetFormFiller(m_pApp);\n\t\tCFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller();//NULL;\n\t\tASSERT(pIFormFiller != NULL);\n\n\t\tFX_BOOL bRC = TRUE;\n\t\tFX_BOOL bExit = FALSE;\n\n\t\tpIFormFiller->OnKeyStrokeCommit(m_pWidget, pPageView, bRC, bExit, nFlag);\n\t\tif (bExit) return TRUE;\n\t\tif (!bRC)\n\t\t{\n\t\t\tthis->ResetPDFWindow(pPageView, FALSE);\n\t\t\treturn TRUE;\n\t\t}\n\n\t\tpIFormFiller->OnValidate(m_pWidget, pPageView, bRC, bExit, nFlag);\n\t\tif (bExit) return TRUE;\n\t\tif (!bRC)\n\t\t{\n\t\t\tthis->ResetPDFWindow(pPageView, FALSE);\n\t\t\treturn TRUE;\n\t\t}\n\n\t\tSaveData(pPageView);\n\n\t\tpIFormFiller->OnCalculate(m_pWidget, pPageView, bExit,nFlag);\n\t\tif (bExit) return TRUE;\n\n\t\tpIFormFiller->OnFormat(m_pWidget, pPageView, bExit,nFlag);\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL\tCFFL_FormFiller::IsDataChanged(CPDFSDK_PageView* pPageView)\n{\n\treturn FALSE;\n}\n\nvoid CFFL_FormFiller::SaveData(CPDFSDK_PageView* pPageView)\n{\n}\n\nvoid CFFL_FormFiller::GetKeyStrokeData(CPDFSDK_PageView* pPageView, FFL_KeyStrokeData& data)\n{\n}\n\nvoid CFFL_FormFiller::SetChangeMark()\n{\n\tm_pApp->FFI_OnChange();\n}\n\nvoid CFFL_FormFiller::GetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,\n\t\t\t\t\t\t\tPDFSDK_FieldAction& fa)\n{\n\tfa.sValue = m_pWidget->GetValue();\n}\n\nvoid CFFL_FormFiller::SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type, \n\t\t\t\t\t\t\t\t\tconst PDFSDK_FieldAction& fa)\n{\n}\n\nFX_BOOL\tCFFL_FormFiller::IsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld, \n\t\t\t\t\t\t\t\t\tconst PDFSDK_FieldAction& faNew)\n{\n\treturn FALSE;\n}\n\nvoid CFFL_FormFiller::SaveState(CPDFSDK_PageView* pPageView)\n{\n}\n\nvoid CFFL_FormFiller::RestoreState(CPDFSDK_PageView* pPageView)\n{\n}\n\nCPWL_Wnd*  CFFL_FormFiller::ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue)\n{\n\treturn GetPDFWindow(pPageView, FALSE); \n}\n\nvoid CFFL_FormFiller::TimerProc()\n{\n\n}\n\nIFX_SystemHandler* CFFL_FormFiller::GetSystemHandler() const\n{\n\treturn m_pApp->GetSysHandler();\n//\treturn NULL;\n}\n\nvoid CFFL_FormFiller::OnKeyStroke(FX_BOOL bKeyDown)\n{\n}\n\nvoid CFFL_FormFiller::EscapeFiller(CPDFSDK_PageView* pPageView, FX_BOOL bDestroyPDFWindow)\n{\n\tm_bValid = FALSE;\n\t\n\tFX_RECT rcRect = this->GetViewBBox(pPageView, m_pWidget);\n\tthis->InvalidateRect(rcRect.left, rcRect.top, rcRect.right, rcRect.bottom);\n\n\tif(bDestroyPDFWindow)\n \t\tDestroyPDFWindow(pPageView);\n}\n\nFX_BOOL CFFL_FormFiller::CanCopy(CPDFSDK_Document* pDocument)\n{\n\treturn FALSE;\n}\n\nFX_BOOL CFFL_FormFiller::CanCut(CPDFSDK_Document* pDocument)\n{\n\treturn FALSE;\n}\n\nFX_BOOL\tCFFL_FormFiller::CanPaste(CPDFSDK_Document* pDocument)\n{\n\treturn FALSE;\n}\n\nvoid CFFL_FormFiller::DoCopy(CPDFSDK_Document* pDocument)\n{\n}\n\nvoid CFFL_FormFiller::DoCut(CPDFSDK_Document* pDocument)\n{\n}\n\nvoid CFFL_FormFiller::DoPaste(CPDFSDK_Document* pDocument)\n{\n}\n\nvoid CFFL_FormFiller::InvalidateRect(double left, double top, double right, double bottom)\n{\n\tCPDF_Page * pPage = m_pWidget->GetPDFPage();\n\tm_pApp->FFI_Invalidate(pPage, left, top, right, bottom);\n}\n\n/* ------------------------- CFFL_Button ------------------------- */\n\nCFFL_Button::CFFL_Button(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget) :\n\tCFFL_FormFiller(pApp, pWidget),\n\tm_bMouseIn(FALSE),\n\tm_bMouseDown(FALSE)\n{\n}\n\nCFFL_Button::~CFFL_Button()\n{\n}\n\nvoid CFFL_Button::OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)\n{\n\tm_bMouseIn = TRUE;\n\tFX_RECT rect = this->GetViewBBox(pPageView,pAnnot);\n\tthis->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);\n//\t::InvalidateRect(pPageView->GetPageViewWnd(), &this->GetViewBBox(pPageView, pAnnot), TRUE);\n}\n\nvoid CFFL_Button::OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)\n{\n\tm_bMouseIn = FALSE;\n\n\tFX_RECT rect = this->GetViewBBox(pPageView,pAnnot);\n\tthis->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);\n//\t::InvalidateRect(pPageView->GetPageViewWnd(), &this->GetViewBBox(pPageView, pAnnot), TRUE);\n\tEndTimer();\n\tASSERT(m_pWidget != NULL);\n//\tm_pWidget->HideHint();\n}\n\nFX_BOOL CFFL_Button::OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)\n{\n\tCPDF_Rect rcAnnot = pAnnot->GetRect();\n\tif(!rcAnnot.Contains(point.x, point.y))\n\t\treturn FALSE;\n\n\tm_bMouseDown = TRUE;\n\tm_bValid = TRUE;\n\tFX_RECT rect = this->GetViewBBox(pPageView, pAnnot);\n\tthis->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);\n//\t::InvalidateRect(pPageView->GetPageViewWnd(), &this->GetViewBBox(pPageView, pAnnot), TRUE);\n\treturn TRUE;\n}\n\nFX_BOOL\tCFFL_Button::OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)\n{\n\tCPDF_Rect rcAnnot = pAnnot->GetRect();\n\tif(!rcAnnot.Contains(point.x, point.y))\n\t\treturn FALSE;\n\n\tm_bMouseDown = FALSE;\n\tm_pWidget->GetPDFPage();\n\t\n\n\tFX_RECT rect = this->GetViewBBox(pPageView, pAnnot);\n\tthis->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);\n// \t::InvalidateRect(pPageView->GetPageViewWnd(), &this->GetViewBBox(pPageView, pAnnot), TRUE);\n\treturn TRUE;\n}\n\nFX_BOOL\tCFFL_Button::OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)\n{\n\tASSERT(m_pApp != NULL);\n\n\treturn TRUE;\n}\n\nvoid CFFL_Button::OnDraw(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot, \n\t\t\t\t\t\t\tCFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\t\t\t\t\t\t/*const CRect& rcWindow,*/ FX_DWORD dwFlags)\n{\n\tASSERT(pPageView != NULL);\n\tASSERT(pAnnot != NULL);\n\n\tCPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;\n\n\tCPDF_FormControl* pCtrl = pWidget->GetFormControl();\n\tASSERT(pCtrl != NULL);\n\n\tCPDF_FormControl::HighlightingMode eHM = pCtrl->GetHighlightingMode();\n\n\tif (eHM == CPDF_FormControl::Push)\n\t{\n\t\tif (m_bMouseDown)\n\t\t{\n\t\t\tif (pWidget->IsWidgetAppearanceValid(CPDF_Annot::Down))\n\t\t\t\tpWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Down, NULL);\n\t\t\telse\n\t\t\t\tpWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);\n\t\t}\n\t\telse if (m_bMouseIn)\n\t\t{\n\t\t\tif (pWidget->IsWidgetAppearanceValid(CPDF_Annot::Rollover))\n\t\t\t\tpWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Rollover, NULL);\n\t\t\telse\n\t\t\t\tpWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);\n\t\t}\n\t}\n\telse\n\t\tpWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);\n}\n\n\nvoid CFFL_Button::OnDrawDeactive(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot, \n\t\t\t\t\t\t\t\t CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\t\t\t\t\t\t\t /*const CRect& rcWindow, */FX_DWORD dwFlags)\n{\n\tOnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);\n}\n"
  },
  {
    "path": "fpdfsdk/src/formfiller/FFL_IFormFiller.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/formfiller/FFL_FormFiller.h\"\n#include \"../../include/formfiller/FFL_IFormFiller.h\"\n#include \"../../include/formfiller/FFL_CheckBox.h\"\n#include \"../../include/formfiller/FFL_ComboBox.h\"\n#include \"../../include/formfiller/FFL_ListBox.h\"\n#include \"../../include/formfiller/FFL_PushButton.h\"\n#include \"../../include/formfiller/FFL_RadioButton.h\"\n#include \"../../include/formfiller/FFL_TextField.h\"\n\n#define FFL_MAXLISTBOXHEIGHT\t\t140.0f\n\n// HHOOK CFFL_IFormFiller::m_hookSheet = NULL;\n// MSG CFFL_IFormFiller::g_Msg;\n\n/* ----------------------------- CFFL_IFormFiller ----------------------------- */\n\nCFFL_IFormFiller::CFFL_IFormFiller(CPDFDoc_Environment* pApp) : \n\tm_pApp(pApp),\n\tm_bNotifying(FALSE)\n{\n}\n\nCFFL_IFormFiller::~CFFL_IFormFiller()\n{\n\tFX_POSITION pos = m_Maps.GetStartPosition();\n\twhile (pos)\n\t{\n\t\tCPDFSDK_Annot * pAnnot = NULL;\n\t\tCFFL_FormFiller * pFormFiller = NULL;\n\t\tm_Maps.GetNextAssoc(pos,pAnnot,pFormFiller);\n\t\tdelete pFormFiller;\n\t}\n\tm_Maps.RemoveAll();\n}\n\nFX_BOOL\tCFFL_IFormFiller::Annot_HitTest(CPDFSDK_PageView* pPageView,CPDFSDK_Annot* pAnnot, CPDF_Point point)\n{\n\tCPDF_Rect rc = pAnnot->GetRect();\n\tif(rc.Contains(point.x, point.y))\n\t\treturn TRUE;\n\treturn FALSE;\n}\n\nFX_RECT CFFL_IFormFiller::GetViewBBox(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot)\n{\n\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))\n\t{\n\t\treturn pFormFiller->GetViewBBox(pPageView, pAnnot);\n\t}\n\telse\n\t{\n\t\tASSERT(pPageView != NULL);\n\t\tASSERT(pAnnot != NULL);\n\n\t\tCPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();\n\t\tASSERT(pPDFAnnot != NULL);\n\n\t\tCPDF_Rect rcAnnot;\n\t\tpPDFAnnot->GetRect(rcAnnot);\n\n// \t\tCRect rcWin;\n// \t\tpPageView->DocToWindow(rcAnnot, rcWin);\n\t\tCPDF_Rect rcWin = CPWL_Utils::InflateRect(rcAnnot,1);\n//\t\trcWin.InflateRect(1, 1);\n\n\t\treturn rcWin.GetOutterRect();\n\t}\n}\n\nvoid CFFL_IFormFiller::OnDraw(CPDFSDK_PageView* pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot, \n\t\t\t\t\t\tCFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\t\t\t\t\t/*const CRect& rcWindow,*/ FX_DWORD dwFlags)\n{\n\tASSERT(pPageView != NULL);\n\tCPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;\n\n\tif (IsVisible(pWidget))\n\t{\n\t\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))\n\t\t{\n \t\t\tif (pFormFiller->IsValid())\n \t\t\t{\n\t\t\t\tpFormFiller->OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);\n\t\t\t\t\n\t\t\t\tpAnnot->GetPDFPage();\n\t\t\t\t\n\n\t\t\t\tCPDFSDK_Document* pDocument = m_pApp->GetCurrentDoc();\n\t\t\t\tASSERT(pDocument != NULL);\n\n\t\t\t\tif (pDocument->GetFocusAnnot() == pAnnot)\n\t\t\t\t{\n\t\t\t\t\tCPDF_Rect rcFocus = pFormFiller->GetFocusBox(pPageView);\n\t\t\t\t\tif (!rcFocus.IsEmpty())\n\t\t\t\t\t{\n\t\t\t\t\t\tCFX_PathData path;\n\t\t\t\t\t\t\n\t\t\t\t\t\tpath.SetPointCount(5);\n\t\t\t\t\t\tpath.SetPoint(0, rcFocus.left,  rcFocus.top, FXPT_MOVETO);\n\t\t\t\t\t\tpath.SetPoint(1, rcFocus.left,  rcFocus.bottom, FXPT_LINETO);\n\t\t\t\t\t\tpath.SetPoint(2, rcFocus.right,  rcFocus.bottom, FXPT_LINETO);\n\t\t\t\t\t\tpath.SetPoint(3, rcFocus.right,  rcFocus.top, FXPT_LINETO);\n\t\t\t\t\t\tpath.SetPoint(4, rcFocus.left,  rcFocus.top, FXPT_LINETO);\n\t\t\t\t\t\t\n\t\t\t\t\t\tCFX_GraphStateData gsd;\n\t\t\t\t\t\tgsd.SetDashCount(1);\t\t\t\t\n\t\t\t\t\t\tgsd.m_DashArray[0] = 1.0f;\n\t\t\t\t\t\tgsd.m_DashPhase = 0;\t\n\t\t\t\t\t\t\n\t\t\t\t\t\tgsd.m_LineWidth = 1.0f;\n\t\t\t\t\t\tpDevice->DrawPath(&path, pUser2Device, &gsd, 0, ArgbEncode(255,0,0,0), FXFILL_ALTERNATE);\n\n\t\t\t\t\t//\t::DrawFocusRect(hDC, &rcFocus);\t\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))\n\t\t\tpFormFiller->OnDrawDeactive(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);\n\t\telse\n\t\t\tpWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);\n\n\t\tif (!IsReadOnly(pWidget) && IsFillingAllowed(pWidget))\n\t\t{\n\t\t\tpWidget->DrawShadow(pDevice, pPageView);\n\t\t}\n\t\n\t}\n}\n\nvoid CFFL_IFormFiller::OnCreate(CPDFSDK_Annot* pAnnot)\n{\n\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))\n\t{\n\t\tpFormFiller->OnCreate(pAnnot);\n\t}\n}\n\nvoid CFFL_IFormFiller::OnLoad(CPDFSDK_Annot* pAnnot)\n{\n\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))\n\t{\n\t\tpFormFiller->OnLoad(pAnnot);\n\t}\n}\n\nvoid CFFL_IFormFiller::OnDelete(CPDFSDK_Annot* pAnnot)\n{\n\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))\n\t{\n\t\tpFormFiller->OnDelete(pAnnot);\n\t}\n\n\tUnRegisterFormFiller(pAnnot);\n}\n\nvoid CFFL_IFormFiller::OnMouseEnter(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlag)\n{\n\tASSERT(pAnnot != NULL);\n\tASSERT(pAnnot->GetPDFAnnot()->GetSubType() == \"Widget\");\n\t\n\tif (!m_bNotifying)\n\t{\n\t\tCPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;\n\t\tif (pWidget->GetAAction(CPDF_AAction::CursorEnter))\n\t\t{\n\t\t\tm_bNotifying = TRUE;\n\t\t\t\n\t\t\tint nValueAge = pWidget->GetValueAge();\n\n\t\t\tpWidget->ClearAppModified();\n\t\t\t\n\t\t\tASSERT(pPageView != NULL);\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\tPDFSDK_FieldAction fa;\n\t\t\tfa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);\n \t\t\tfa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);\n\t\t\tpWidget->OnAAction(CPDF_AAction::CursorEnter, fa, pPageView );\n\t\t\tm_bNotifying = FALSE;\n\t\t\t\n\t\t\t//if ( !IsValidAnnot(pPageView, pAnnot) ) return;\n\t\t\t\n\t\t\tif (pWidget->IsAppModified())\n\t\t\t{\n\t\t\t\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))\n\t\t\t\t{\n\t\t\t\t\tpFormFiller->ResetPDFWindow(pPageView, pWidget->GetValueAge() == nValueAge);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE))\n\t{\n\t\tpFormFiller->OnMouseEnter(pPageView, pAnnot);\n\t}\n}\n\nvoid CFFL_IFormFiller::OnMouseExit(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlag)\n{\n\tASSERT(pAnnot != NULL);\n\tASSERT(pAnnot->GetPDFAnnot()->GetSubType() == \"Widget\");\n\t\n\tif (!m_bNotifying)\n\t{\n\t\tCPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;\n\t\tif (pWidget->GetAAction(CPDF_AAction::CursorExit))\n\t\t{\n\t\t\tm_bNotifying = TRUE;\n\t\t\tpWidget->GetAppearanceAge();\n\t\t\tint nValueAge = pWidget->GetValueAge();\n\t\t\tpWidget->ClearAppModified();\n\t\t\t\n\t\t\tASSERT(pPageView != NULL);\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\tPDFSDK_FieldAction fa;\n\t\t\tfa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);\n \t\t\tfa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);\n\t\t\t\n\t\t\tpWidget->OnAAction(CPDF_AAction::CursorExit, fa, pPageView);\n\t\t\tm_bNotifying = FALSE;\n\t\t\t\n\t\t\t//if (!IsValidAnnot(pPageView, pAnnot)) return;\n\t\t\t\n\t\t\tif (pWidget->IsAppModified())\n\t\t\t{\n\t\t\t\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))\n\t\t\t\t{\n\t\t\t\t\tpFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))\n\t{\n\t\tpFormFiller->OnMouseExit(pPageView, pAnnot);\n\t}\n}\n\nFX_BOOL\tCFFL_IFormFiller::OnLButtonDown(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)\n{\n\tASSERT(pAnnot != NULL);\n\tASSERT(pAnnot->GetPDFAnnot()->GetSubType() == \"Widget\");\n\t\n\tif (!m_bNotifying)\n\t{\n\t\tCPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;\n\t\tif (Annot_HitTest(pPageView, pAnnot, point) && pWidget->GetAAction(CPDF_AAction::ButtonDown))\n\t\t{\n\t\t\tm_bNotifying = TRUE;\n\t\t\tpWidget->GetAppearanceAge();\n\t\t\tint nValueAge = pWidget->GetValueAge();\n\t\t\tpWidget->ClearAppModified();\n\t\t\t\n\t\t\tASSERT(pPageView != NULL);\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\tPDFSDK_FieldAction fa;\n\t\t\tfa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlags);\n \t\t\tfa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlags);\n\t\t\tpWidget->OnAAction(CPDF_AAction::ButtonDown, fa, pPageView);\n\t\t\tm_bNotifying = FALSE;\n\t\t\t\n\t\t\tif (!IsValidAnnot(pPageView, pAnnot)) return TRUE;\n\t\t\t\n\t\t\tif (pWidget->IsAppModified())\n\t\t\t{\n\t\t\t\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))\n\t\t\t\t{\n\t\t\t\t\tpFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))\n\t{\n\t\treturn pFormFiller->OnLButtonDown(pPageView, pAnnot, nFlags, point);\n\t}\n\t\n\treturn FALSE;\n}\n\nFX_BOOL\tCFFL_IFormFiller::OnLButtonUp(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)\n{\n\tASSERT(pAnnot != NULL);\n\tASSERT(pAnnot->GetPDFAnnot()->GetSubType() == \"Widget\");\n\t\n\tCPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;\n\t// \tCReader_Page* pPage = pAnnot->GetPage();\n\t// \tASSERT(pPage != NULL);\n\tCPDFSDK_Document* pDocument = m_pApp->GetCurrentDoc();\n\tASSERT(pDocument != NULL);\t\t\n\t\n\tswitch (pWidget->GetFieldType())\n\t{\n\tcase FIELDTYPE_PUSHBUTTON:\n\tcase FIELDTYPE_CHECKBOX:\n\tcase FIELDTYPE_RADIOBUTTON:\n\t\tif (GetViewBBox(pPageView, pAnnot).Contains((int)point.x, (int)point.y))\n\t\t{\n\t\t\tpDocument->SetFocusAnnot(pAnnot);\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\tpDocument->SetFocusAnnot(pAnnot);\n\t\tbreak;\n\t}\n\t\n\tFX_BOOL bRet = FALSE;\n\t\n\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))\n\t{\n\t\tbRet = pFormFiller->OnLButtonUp(pPageView, pAnnot, nFlags, point);\n\t}\n\n\tif (pDocument->GetFocusAnnot() == pAnnot)\n\t{\n\t\tFX_BOOL bExit = FALSE;\n\t\tFX_BOOL bReset = FALSE;\n\t\tOnButtonUp(pWidget, pPageView, bReset, bExit,nFlags);\n\t\tif (bExit) return TRUE;\n\t}\n\treturn bRet;\n}\n\nvoid CFFL_IFormFiller::OnButtonUp(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bReset, FX_BOOL& bExit,FX_UINT nFlag)\n{\n\tASSERT(pWidget != NULL);\n\t\n\tif (!m_bNotifying)\n\t{\n\t\tif (pWidget->GetAAction(CPDF_AAction::ButtonUp))\n\t\t{\n\t\t\tm_bNotifying = TRUE;\n\t\t\tint nAge = pWidget->GetAppearanceAge();\n\t\t\tint nValueAge = pWidget->GetValueAge();\n\t\t\t\n\t\t\tASSERT(pPageView != NULL);\n// \t\t\tCReader_DocView* pDocView = pPageView->GetDocView();\n// \t\t\tASSERT(pDocView != NULL);\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\tPDFSDK_FieldAction fa;\n\t\t\tfa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);\n \t\t\tfa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);\n\n\t\t\tpWidget->OnAAction(CPDF_AAction::ButtonUp, fa, pPageView);\n\t\t\tm_bNotifying = FALSE;\n\t\t\t\n\t\t\tif (!IsValidAnnot(pPageView, pWidget))\n\t\t\t{\n\t\t\t\tbExit = TRUE;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (nAge != pWidget->GetAppearanceAge())\n\t\t\t{\n\t\t\t\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))\n\t\t\t\t{\n\t\t\t\t\tpFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tbReset = TRUE;\n\t\t\t}\n\t\t}\n\t}\n}\n\nFX_BOOL\tCFFL_IFormFiller::OnLButtonDblClk(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)\n{\n\tASSERT(pAnnot != NULL);\n\tASSERT(pAnnot->GetPDFAnnot()->GetSubType() == \"Widget\");\n\n\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))\n\t{\n\t\treturn pFormFiller->OnLButtonDblClk(pPageView, pAnnot, nFlags, point);\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL\tCFFL_IFormFiller::OnMouseMove(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)\n{\n\tASSERT(pAnnot != NULL);\n\tASSERT(pAnnot->GetPDFAnnot()->GetSubType() == \"Widget\");\n\n\t//change cursor\n\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE))\n\t{\n\t\treturn pFormFiller->OnMouseMove(pPageView, pAnnot, nFlags, point);\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL\tCFFL_IFormFiller::OnMouseWheel(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, short zDelta, const CPDF_Point& point)\n{\n\tASSERT(pAnnot != NULL);\n\tASSERT(pAnnot->GetPDFAnnot()->GetSubType() == \"Widget\");\n\n\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))\n\t{\n\t\treturn pFormFiller->OnMouseWheel(pPageView, pAnnot, nFlags, zDelta, point);\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL\tCFFL_IFormFiller::OnRButtonDown(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)\n{\n\tASSERT(pAnnot != NULL);\n\tASSERT(pAnnot->GetPDFAnnot()->GetSubType() == \"Widget\");\n\n\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))\n\t{\n\t\treturn pFormFiller->OnRButtonDown(pPageView, pAnnot, nFlags, point);\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL\tCFFL_IFormFiller::OnRButtonUp(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)\n{\n\tASSERT(pAnnot != NULL);\n\tASSERT(pAnnot->GetPDFAnnot()->GetSubType() == \"Widget\");\n\n\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))\n\t{\n\t\treturn pFormFiller->OnRButtonUp(pPageView, pAnnot, nFlags, point);\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL\tCFFL_IFormFiller::OnRButtonDblClk(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)\n{\n\tASSERT(pAnnot != NULL);\n\tASSERT(pAnnot->GetPDFAnnot()->GetSubType() == \"Widget\");\n\n\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))\n\t{\n\t\treturn pFormFiller->OnRButtonDblClk(pPageView, pAnnot, nFlags, point);\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL\tCFFL_IFormFiller::OnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags)\n{\n\tASSERT(pAnnot != NULL);\n\tASSERT(pAnnot->GetPDFAnnot()->GetSubType() == \"Widget\");\n\n\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))\n\t{\n\t\treturn pFormFiller->OnKeyDown(pAnnot, nKeyCode, nFlags);\t\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL\tCFFL_IFormFiller::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)\n{\n\tASSERT(pAnnot != NULL);\n\tASSERT(pAnnot->GetPDFAnnot()->GetSubType() == \"Widget\");\n\n\tif (nChar == FWL_VKEY_Tab) return TRUE;\n\n\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))\n\t{\n\t\treturn pFormFiller->OnChar(pAnnot, nChar, nFlags);\n\t}\n\n\treturn FALSE;\n}\n\nvoid CFFL_IFormFiller::OnDeSelected(CPDFSDK_Annot* pAnnot)\n{\n\tASSERT(pAnnot != NULL);\n\tASSERT(pAnnot->GetPDFAnnot()->GetSubType() == \"Widget\");\n\n\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))\n\t{\n\t\tpFormFiller->OnDeSelected(pAnnot);\n\t}\n}\n\nvoid CFFL_IFormFiller::OnSelected(CPDFSDK_Annot* pAnnot)\n{\n\tASSERT(pAnnot != NULL);\n\tASSERT(pAnnot->GetPDFAnnot()->GetSubType() == \"Widget\");\n\n\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))\n\t{\n\t\tpFormFiller->OnSelected(pAnnot);\n\t}\n}\n\nFX_BOOL CFFL_IFormFiller::OnSetFocus(CPDFSDK_Annot* pAnnot,FX_UINT nFlag)\n{\n\tif(!pAnnot) return FALSE;\n\tASSERT(pAnnot->GetPDFAnnot()->GetSubType() == \"Widget\");\n\n\tif (!m_bNotifying)\n\t{\n\t\tCPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;\n \t\tif (pWidget->GetAAction(CPDF_AAction::GetFocus))\n \t\t{\n  \t\t\tm_bNotifying = TRUE;\n\t\t\tpWidget->GetAppearanceAge();\n\t\t\tint nValueAge = pWidget->GetValueAge();\n \t\t\tpWidget->ClearAppModified();\n \n \n \t\t\tCPDFSDK_PageView* pPageView = pAnnot->GetPageView();\n \t\t\tASSERT(pPageView != NULL);\n \t\t\t\n \t\t\tPDFSDK_FieldAction fa;\n\t\t\tfa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);\n \t\t\tfa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);\n\n \n \t\t\tCFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, TRUE);\n \t\t\tif(!pFormFiller) return FALSE;\n \t\t\tpFormFiller->GetActionData(pPageView, CPDF_AAction::GetFocus, fa);\n \n \t\t\tpWidget->OnAAction(CPDF_AAction::GetFocus, fa, pPageView);\n \t\t\tm_bNotifying = FALSE;\n \t\t\t\n //\t\t\tif (!IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pAnnot)) return FALSE;\n \n \t\t\tif (pWidget->IsAppModified())\n \t\t\t{\n \t\t\t\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))\n \t\t\t\t{\n \t\t\t\t\tpFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());\n \t\t\t\t}\n \t\t\t}\n\t\t}\n\t}\n\t\n\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE))\n\t{\n\t\tif (pFormFiller->OnSetFocus(pAnnot, nFlag))\n\t\t{\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t\treturn FALSE;\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL\tCFFL_IFormFiller::OnKillFocus(CPDFSDK_Annot* pAnnot,FX_UINT nFlag)\n{\n\tif(!pAnnot) return FALSE;\n\tASSERT(pAnnot->GetPDFAnnot()->GetSubType() == \"Widget\");\n\n\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))\n\t{\n\t\tif (pFormFiller->OnKillFocus(pAnnot, nFlag))\n\t\t{\n \t\t\tif (!m_bNotifying)\n \t\t\t{\n \t\t\t\tCPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;\n \t\t\t\tif (pWidget->GetAAction(CPDF_AAction::LoseFocus))\n \t\t\t\t{\n \t\t\t\t\tm_bNotifying = TRUE;\n \t\t\t\t\tpWidget->ClearAppModified();\n \n \t\t\t\t\tCPDFSDK_PageView* pPageView = pWidget->GetPageView();\n \t\t\t\t\tASSERT(pPageView != NULL);\n \n \t\t\t\t\tPDFSDK_FieldAction fa;\n\t\t\t\t\tfa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);\n \t\t\t\t\tfa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);\n \n \t\t\t\t\tpFormFiller->GetActionData(pPageView, CPDF_AAction::LoseFocus, fa);\n \n \t\t\t\t\tpWidget->OnAAction(CPDF_AAction::LoseFocus, fa, pPageView);\n \t\t\t\t\tm_bNotifying = FALSE;\n \n \t\t\t\t}\n \t\t\t}\n\t\t}\n\t\telse\n\t\t\treturn FALSE;\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL\tCFFL_IFormFiller::IsVisible(CPDFSDK_Widget* pWidget)\n{\n\treturn pWidget->IsVisible();\n}\n\nFX_BOOL\tCFFL_IFormFiller::IsReadOnly(CPDFSDK_Widget* pWidget)\n{\n\tASSERT(pWidget != NULL);\n\n\tint nFieldFlags = pWidget->GetFieldFlags();\n\n\treturn (nFieldFlags & FIELDFLAG_READONLY) == FIELDFLAG_READONLY;\n}\n\nFX_BOOL\tCFFL_IFormFiller::IsFillingAllowed(CPDFSDK_Widget* pWidget)\n{\n\tASSERT(pWidget != NULL);\n\n\tif (pWidget->GetFieldType() == FIELDTYPE_PUSHBUTTON)\n\t\treturn TRUE;\n \telse\n \t{\n \t\tCPDF_Page* pPage = pWidget->GetPDFPage();\n \t\tASSERT(pPage != NULL);\n \n \t\tCPDF_Document* pDocument = pPage->m_pDocument;\n \t\tASSERT(pDocument != NULL);\n \n\t\tFX_DWORD dwPermissions = pDocument->GetUserPermissions();\n \t\treturn (dwPermissions&FPDFPERM_FILL_FORM) || \n \t\t\t\t(dwPermissions&FPDFPERM_ANNOT_FORM) || \n \t\t\t(dwPermissions&FPDFPERM_MODIFY);\n \t}\n\treturn TRUE;\t\n}\n\nCFFL_FormFiller* CFFL_IFormFiller::GetFormFiller(CPDFSDK_Annot* pAnnot, FX_BOOL bRegister)\n{\n// \tASSERT(pAnnot != NULL);\n// \tASSERT(pAnnot->GetPDFAnnot()->GetSubType() == \"Widget\");\n\n\tCFFL_FormFiller * pFormFiller = NULL;\n\tm_Maps.Lookup(pAnnot, pFormFiller);\n\n\tif (pFormFiller)\n\t\treturn pFormFiller;\n\n\tif (bRegister)\n\t{\n\t\tCPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;\t\t\n\n\t\tint nFieldType = pWidget->GetFieldType();\n\t\tswitch(nFieldType)\n\t\t{\n \t\tcase FIELDTYPE_PUSHBUTTON:\n \t\t\tpFormFiller = new CFFL_PushButton(m_pApp, pWidget);\n \t\t\tbreak;\n\t\tcase FIELDTYPE_CHECKBOX:\n\t\t\tpFormFiller = new CFFL_CheckBox(m_pApp, pWidget);\n\t\t\tbreak;\n \t\tcase FIELDTYPE_RADIOBUTTON:\n \t\t\tpFormFiller = new CFFL_RadioButton(m_pApp, pWidget);\n \t\t\tbreak;\n \t\tcase FIELDTYPE_TEXTFIELD:\n\t\t\tpFormFiller = new CFFL_TextField(m_pApp, pWidget);\n\t\t\tbreak;\n\t\tcase FIELDTYPE_LISTBOX:\n\t\t\tpFormFiller = new CFFL_ListBox(m_pApp, pWidget);\n\t\t\tbreak;\n\t\tcase FIELDTYPE_COMBOBOX:\n\t\t\tpFormFiller = new CFFL_ComboBox(m_pApp, pWidget);\n\t\t\tbreak;\n\t\tcase FIELDTYPE_UNKNOWN:\n\t\tdefault:\n\t\t\tpFormFiller = NULL;\n\t\t\tbreak;\n\t\t}\n\n\t\tif (pFormFiller)\n\t\t{\n\t\t\tm_Maps.SetAt(pAnnot, pFormFiller);\n\t\t}\n\t}\n\n\treturn pFormFiller;\n}\n\nvoid CFFL_IFormFiller::RemoveFormFiller(CPDFSDK_Annot* pAnnot)\n{\n\tif ( pAnnot != NULL )\n\t{\n\t\tUnRegisterFormFiller( pAnnot );\n\t}\n}\n\nvoid CFFL_IFormFiller::UnRegisterFormFiller(CPDFSDK_Annot* pAnnot)\n{\n\tCFFL_FormFiller * pFormFiller = NULL;\n\n\tif (m_Maps.Lookup(pAnnot,pFormFiller))\n\t{\n\t\tif (pFormFiller)\n\t\t\tdelete pFormFiller;\n\t\tm_Maps.RemoveKey(pAnnot);\n\t}\n}\n\nvoid CFFL_IFormFiller::SetFocusAnnotTab(CPDFSDK_Annot* pWidget, FX_BOOL bSameField, FX_BOOL bNext)\n{\n\n}\n\nvoid CFFL_IFormFiller::QueryWherePopup(void* pPrivateData, FX_FLOAT fPopupMin,FX_FLOAT fPopupMax, FX_INT32 & nRet, FX_FLOAT & fPopupRet)\n{\n\tASSERT(pPrivateData != NULL);\n\n\tCFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;\n\n\t\n\n\n\tCPDF_Rect rcPageView(0,0,0,0);\n\trcPageView.right = pData->pWidget->GetPDFPage()->GetPageWidth();\n\trcPageView.bottom = pData->pWidget->GetPDFPage()->GetPageHeight();\n\trcPageView.Normalize();\n\n\n\tASSERT(pData->pWidget != NULL);\n\tCPDF_Rect rcAnnot = pData->pWidget->GetRect();\n\n\tFX_FLOAT fTop = 0.0f;\n\tFX_FLOAT fBottom = 0.0f;\n\n\tCPDFSDK_Widget * pWidget = (CPDFSDK_Widget*)pData->pWidget;\n\tswitch (pWidget->GetRotate() / 90)\n\t{\n\tdefault:\n\tcase 0:\n\t\tfTop = rcPageView.top - rcAnnot.top;\n\t\tfBottom = rcAnnot.bottom - rcPageView.bottom;\n\t\tbreak;\n\tcase 1:\n\t\tfTop = rcAnnot.left - rcPageView.left;\n\t\tfBottom = rcPageView.right - rcAnnot.right;\n\t\tbreak;\n\tcase 2:\n\t\tfTop = rcAnnot.bottom - rcPageView.bottom;\n\t\tfBottom = rcPageView.top - rcAnnot.top;\n\t\tbreak;\n\tcase 3:\n\t\tfTop = rcPageView.right - rcAnnot.right;\n\t\tfBottom = rcAnnot.left - rcPageView.left;\n\t\tbreak;\n\t}\n\n\tFX_FLOAT fFactHeight = 0;\n\tFX_BOOL bBottom = TRUE;\n\tFX_FLOAT fMaxListBoxHeight = 0;\n\tif (fPopupMax > FFL_MAXLISTBOXHEIGHT)\n\t{\n\t\tif (fPopupMin > FFL_MAXLISTBOXHEIGHT)\n\t\t{\n\t\t\tfMaxListBoxHeight = fPopupMin;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfMaxListBoxHeight = FFL_MAXLISTBOXHEIGHT;\n\t\t}\n\t}\n\telse\n\t\tfMaxListBoxHeight = fPopupMax;\n\n\tif (fBottom > fMaxListBoxHeight)\n\t{\n\t\tfFactHeight = fMaxListBoxHeight;\n\t\tbBottom = TRUE;\n\t}\n\telse\n\t{\n\t\tif (fTop > fMaxListBoxHeight)\n\t\t{\n\t\t\tfFactHeight = fMaxListBoxHeight;\n\t\t\tbBottom = FALSE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (fTop > fBottom)\n\t\t\t{\n\t\t\t\tfFactHeight = fTop;\n\t\t\t\tbBottom = FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfFactHeight = fBottom;\n\t\t\t\tbBottom = TRUE;\n\t\t\t}\n\t\t}\n\t}\n\n\tnRet = bBottom ? 0 : 1;\n\tfPopupRet = fFactHeight;\n}\n\nvoid CFFL_IFormFiller::OnSetWindowRect(void* pPrivateData, const CPDF_Rect & rcWindow)\n{\n\tASSERT(pPrivateData != NULL);\n\n\tCFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;\n\n\tif (CFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, TRUE))\n\t{\n\n\t\tCPDF_Rect rcOld = pFormFiller->PWLtoFFL(pFormFiller->GetWindowRect(pData->pPageView));\n\t\tCPDF_Rect rcNew = pFormFiller->PWLtoFFL(rcWindow);\n\t\tpFormFiller->SetWindowRect(pData->pPageView, rcWindow);\n\n\t\tCPDF_Rect unRect = rcOld;\n\t\tunRect.Union(rcNew);\n\t\t//FX_RECT rcRect = unRect.GetOutterRect();\n\t\tunRect.left = (FX_FLOAT)(unRect.left - 0.5);\n\t\tunRect.right = (FX_FLOAT)(unRect.right + 0.5);\n\t\tunRect.top = (FX_FLOAT)(unRect.top + 0.5);\n\t\tunRect.bottom = (FX_FLOAT)(unRect.bottom -0.5);\n\t\tm_pApp->FFI_Invalidate(pData->pWidget->GetPDFPage(), unRect.left, unRect.top, unRect.right, unRect.bottom);\n\t}\n}\n\nvoid CFFL_IFormFiller::OnKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_INT32 nKeyCode, CFX_WideString& strChange, \n\t\t\t\t\t\t\t\t   const CFX_WideString& strChangeEx, FX_BOOL bKeyDown, \n\t\t\t\t\t\t\t\t   FX_BOOL & bRC, FX_BOOL & bExit)\n{\n\tASSERT(pPrivateData != NULL);\n\tCFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;\n\tASSERT(pData->pWidget != NULL);\n\n\tCFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, FALSE);\n\tASSERT(pFormFiller != NULL);\n\n\tpFormFiller->OnKeyStroke(bKeyDown);\n}\n\nvoid CFFL_IFormFiller::OnKeyStrokeCommit(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bRC, FX_BOOL& bExit, FX_DWORD nFlag)\n{\n\tif (!m_bNotifying)\n\t{\n\t\tASSERT(pWidget != NULL);\n\t\tif (pWidget->GetAAction(CPDF_AAction::KeyStroke))\n\t\t{\n\t\t\tm_bNotifying = TRUE;\n\t\t\tpWidget->ClearAppModified();\n\n\t\t\tASSERT(pPageView != NULL);\n// \t\t\tCReader_DocView* pDocView = pPageView->GetDocView();\n// \t\t\tASSERT(pDocView != NULL);\n\t\t\t\n\t\t\n\n\t\t\tPDFSDK_FieldAction fa;\n\t\t\tfa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);\n \t\t\tfa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);\n\t\t\tfa.bWillCommit = TRUE;\n\t\t\tfa.nCommitKey = GetCommitKey();\n\t\t\tfa.bKeyDown = GetKeyDown();\n\t\t\tfa.bRC = TRUE;\n\n\t\t\tCFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE);\n\t\t\tASSERT(pFormFiller != NULL);\n\n\t\t\tpFormFiller->GetActionData(pPageView, CPDF_AAction::KeyStroke, fa);\n\t\t\tpFormFiller->SaveState(pPageView);\n\n\t\t\tPDFSDK_FieldAction faOld = fa;\n\t\t\tpWidget->OnAAction(CPDF_AAction::KeyStroke, fa, pPageView);\n\n\t\t\tbRC = fa.bRC;\n//\t\t\tbExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);\n\n\t\t\tm_bNotifying = FALSE;\n\t\t}\n\t}\n}\n\nvoid CFFL_IFormFiller::OnValidate(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bRC, FX_BOOL& bExit, FX_DWORD nFlag)\n{\n\tif (!m_bNotifying)\n\t{\n\t\tASSERT(pWidget != NULL);\n\t\tif (pWidget->GetAAction(CPDF_AAction::Validate))\n\t\t{\n\t\t\tm_bNotifying = TRUE;\n\t\t\tpWidget->ClearAppModified();\n\n\t\t\tASSERT(pPageView != NULL);\n// \t\t\tCReader_DocView* pDocView = pPageView->GetDocView();\n// \t\t\tASSERT(pDocView != NULL);\n\t\t\t\n\t\t\t\n\n\t\t\tPDFSDK_FieldAction fa;\n\t\t\tfa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);\n \t\t\tfa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);\n\t\t\tfa.bKeyDown = GetKeyDown();\n\t\t\tfa.bRC = TRUE;\n\n\t\t\tCFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE);\n\t\t\tASSERT(pFormFiller != NULL);\n\n\t\t\tpFormFiller->GetActionData(pPageView, CPDF_AAction::Validate, fa);\n\t\t\tpFormFiller->SaveState(pPageView);\n\n\t\t\tPDFSDK_FieldAction faOld = fa;\n\t\t\tpWidget->OnAAction(CPDF_AAction::Validate, fa, pPageView);\n\n\t\t\tbRC = fa.bRC;\n//\t\t\tbExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);\n\n\t\t\tm_bNotifying = FALSE;\n\t\t}\n\t}\n}\n\nvoid CFFL_IFormFiller::OnCalculate(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bExit, FX_DWORD nFlag)\n{\n\tif (!m_bNotifying)\n\t{\n\t\tASSERT(pWidget != NULL);\n\t\tASSERT(pPageView != NULL);\n// \t\tCReader_DocView* pDocView = pPageView->GetDocView();\n// \t\tASSERT(pDocView != NULL);\n\t\tCPDFSDK_Document* pDocument = pPageView->GetSDKDocument();\n\t\tASSERT(pDocument != NULL);\n\n\t\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();\n\t\tASSERT(pInterForm != NULL);\n\n\t\tpInterForm->OnCalculate(pWidget->GetFormField());\n\n//\t\tbExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);\n\n\t\tm_bNotifying = FALSE;\n\t}\n}\n\nvoid CFFL_IFormFiller::OnFormat(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bExit, FX_DWORD nFlag)\n{\n\tif (!m_bNotifying)\n\t{\n\t\tASSERT(pWidget != NULL);\n\t\tASSERT(pPageView != NULL);\n// \t\tCReader_DocView* pDocView = pPageView->GetDocView();\n// \t\tASSERT(pDocView != NULL);\n\t\tCPDFSDK_Document* pDocument = pPageView->GetSDKDocument();\n\t\tASSERT(pDocument != NULL);\n\n\t\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();\n\t\tASSERT(pInterForm != NULL);\n\n\t\tFX_BOOL bFormated = FALSE;\n\t\tCFX_WideString sValue = pInterForm->OnFormat(pWidget->GetFormField(), GetCommitKey(), bFormated);\n\n//\t\tbExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);\n\n\t\tif (bExit) return;\n\n\t\tif (bFormated)\n\t\t{\n\t\t\tpInterForm->ResetFieldAppearance(pWidget->GetFormField(), sValue, TRUE);\n\t\t\tpInterForm->UpdateField(pWidget->GetFormField());\n\t\t}\n\n\t\tm_bNotifying = FALSE;\n\t}\n}\n\n// LRESULT CALLBACK CFFL_IFormFiller::FFL_WndProc(\n// \t\t\t\t\t\t\t\t\t  int code,       // hook code\n// \t\t\t\t\t\t\t\t\t  WPARAM wParam,  // virtual-key code\n// \t\t\t\t\t\t\t\t\t  LPARAM lParam   // keystroke-message information\n// \t\t\t\t\t\t\t\t\t\t)\n// {\n// \tif (code != HC_ACTION)\n// \t{\n// \t\treturn CallNextHookEx (m_hookSheet, code, wParam, lParam);\n// \t}\n// \n// \tFXSYS_memcpy(&g_Msg, (void*)lParam, sizeof(MSG));\t\n// \n// \treturn 0;\n// }\n\n// MSG\tCFFL_IFormFiller::GetLastMessage()\n// {\n// \treturn g_Msg;\n// }\n\nint CFFL_IFormFiller::GetCommitKey()\n{\n//\tMSG msg = CFFL_IFormFiller::GetLastMessage();\n\n\tint nCommitKey = 0;\n// \tswitch (msg.message)\n// \t{\n// \tcase WM_LBUTTONDOWN:\n// \tcase WM_LBUTTONUP:\n// \t\tnCommitKey = 1;\n// \t\tbreak;\n// \tcase WM_KEYDOWN:\n// \t\tswitch (msg.wParam)\n// \t\t{\n// \t\tcase VK_RETURN:\n// \t\t\tnCommitKey = 2;\n// \t\t\tbreak;\n// \t\tcase VK_TAB:\n// \t\t\tnCommitKey = 3;\n// \t\t\tbreak;\n// \t\t}\n// \t\tbreak;\n// \t}\n\n\treturn nCommitKey;\n}\n\nFX_BOOL CFFL_IFormFiller::GetKeyDown()\n{\n\treturn TRUE;\n// \tMSG msg = CFFL_IFormFiller::GetLastMessage();\n// \n// \treturn msg.message == WM_KEYDOWN || msg.message == WM_CHAR;\n}\n\nFX_BOOL\tCFFL_IFormFiller::IsValidAnnot(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot)\n{\n\n\tASSERT(pPageView != NULL);\n\tASSERT(pAnnot != NULL);\n\n\tif(pPageView)\n\t\treturn pPageView->IsValidAnnot(pAnnot->GetPDFAnnot());\n\telse\n\t\treturn FALSE;\n}\n\nvoid CFFL_IFormFiller::BeforeUndo(CPDFSDK_Document* pDocument)\n{\n\n}\n\nvoid CFFL_IFormFiller::BeforeRedo(CPDFSDK_Document* pDocument)\n{\n\tBeforeUndo(pDocument);\n}\n\nvoid CFFL_IFormFiller::AfterUndo(CPDFSDK_Document* pDocument)\n{\n}\n\nvoid CFFL_IFormFiller::AfterRedo(CPDFSDK_Document* pDocument)\n{\n}\n\nFX_BOOL\tCFFL_IFormFiller::CanCopy(CPDFSDK_Document* pDocument)\n{\n\n\treturn FALSE;\n}\n\nFX_BOOL\tCFFL_IFormFiller::CanCut(CPDFSDK_Document* pDocument)\n{\n\n\treturn FALSE;\n}\n\nFX_BOOL\tCFFL_IFormFiller::CanPaste(CPDFSDK_Document* pDocument)\n{\n\n\treturn FALSE;\n}\n\nvoid CFFL_IFormFiller::DoCopy(CPDFSDK_Document* pDocument)\n{\n}\n\nvoid CFFL_IFormFiller::DoCut(CPDFSDK_Document* pDocument)\n{\n}\n\nvoid CFFL_IFormFiller::DoPaste(CPDFSDK_Document* pDocument)\n{\n\n}\nvoid CFFL_IFormFiller::OnBeforeKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_INT32 nKeyCode,\n\t\t\t\t\t\t\t\t\t\t\t  CFX_WideString & strChange, const CFX_WideString& strChangeEx, \n\t\t\t\t\t\t\t\t\t\t\t  int nSelStart, int nSelEnd,\n\t\t\t\t\t\t\t\t\t\tFX_BOOL bKeyDown, FX_BOOL & bRC, FX_BOOL & bExit, FX_DWORD nFlag)\n{\n\tASSERT(pPrivateData != NULL);\n\tCFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;\n\tASSERT(pData->pWidget != NULL);\n\t\n\tCFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, FALSE);\n\tASSERT(pFormFiller != NULL);\n\t\n\tif (!m_bNotifying)\n\t{\n\t\tif (pData->pWidget->GetAAction(CPDF_AAction::KeyStroke))\n\t\t{\n\t\t\tm_bNotifying = TRUE;\n\t\t\tint nAge = pData->pWidget->GetAppearanceAge();\n\t\t\tint nValueAge = pData->pWidget->GetValueAge();\n\n\t\t\tASSERT(pData->pPageView != NULL);\n\t\t\tCPDFSDK_Document* pDocument  = pData->pPageView->GetSDKDocument();\n\t\t\t\n\t\t\tPDFSDK_FieldAction fa;\n \t\t\tfa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);\n \t\t\tfa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);\n\t\t\tfa.sChange = strChange;\n\t\t\tfa.sChangeEx = strChangeEx;\n\t\t\tfa.bKeyDown = bKeyDown;\n\t\t\tfa.bWillCommit = FALSE;\n\t\t\tfa.bRC = TRUE;\n\t\t\tfa.nSelStart = nSelStart;\n\t\t\tfa.nSelEnd = nSelEnd;\n\n\n\t\t\tpFormFiller->GetActionData(pData->pPageView, CPDF_AAction::KeyStroke, fa);\n\t\t\tpFormFiller->SaveState(pData->pPageView);\n\t\t\t\n\t\t\tif (pData->pWidget->OnAAction(CPDF_AAction::KeyStroke, fa, pData->pPageView))\n\t\t\t{\n\t\t\t\tif (!IsValidAnnot(pData->pPageView, pData->pWidget))\n\t\t\t\t{\n\t\t\t\t\tbExit = TRUE;\n\t\t\t\t\tm_bNotifying = FALSE;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (nAge != pData->pWidget->GetAppearanceAge())\n\t\t\t\t{\n\t\t\t\t\tCPWL_Wnd* pWnd = pFormFiller->ResetPDFWindow(pData->pPageView, nValueAge == pData->pWidget->GetValueAge());\n\t\t\t\t\tpData = (CFFL_PrivateData*)pWnd->GetAttachedData();\n\t\t\t\t\tbExit = TRUE;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (fa.bRC)\n\t\t\t\t{\n\t\t\t\t\tpFormFiller->SetActionData(pData->pPageView, CPDF_AAction::KeyStroke, fa);\n\t\t\t\t\tbRC = FALSE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpFormFiller->RestoreState(pData->pPageView);\n\t\t\t\t\tbRC = FALSE;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (pDocument->GetFocusAnnot() != pData->pWidget)\n\t\t\t\t{\n\t\t\t\t\tpFormFiller->CommitData(pData->pPageView,nFlag);\n\t\t\t\t\tbExit = TRUE;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\t\t\t\n\t\t\t\tif (!IsValidAnnot(pData->pPageView, pData->pWidget))\n\t\t\t\t{\n\t\t\t\t\tbExit = TRUE;\n\t\t\t\t\tm_bNotifying = FALSE;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tm_bNotifying = FALSE;\n\t\t}\n\t}\n}\n\nvoid\tCFFL_IFormFiller::OnAfterKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_BOOL & bExit,FX_DWORD nFlag) \n{\n\tASSERT(pPrivateData != NULL);\n\tCFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;\n\tASSERT(pData->pWidget != NULL);\n\t\n\tCFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, FALSE);\n\tASSERT(pFormFiller != NULL);\n\t\n\tif (!bEditOrList)\n\t\tpFormFiller->OnKeyStroke(bExit);\n}\n"
  },
  {
    "path": "fpdfsdk/src/formfiller/FFL_ListBox.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/formfiller/FormFiller.h\"\n#include \"../../include/formfiller/FFL_FormFiller.h\"\n#include \"../../include/formfiller/FFL_ListBox.h\"\n//#include \"../../include/formfiller/FFL_Module.h\"\n#include \"../../include/formfiller/FFL_IFormFiller.h\"\n//#include \"../../include/formfiller/FFL_Undo.h\"\n#include \"../../include/formfiller/FFL_CBA_Fontmap.h\"\n\n\n#define\tFFL_DEFAULTLISTBOXFONTSIZE\t\t12.0f\n\n\n/* ------------------------------- CFFL_ListBox ------------------------------- */\n\nCFFL_ListBox::CFFL_ListBox(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget) :\n\tCFFL_FormFiller(pApp, pWidget),\n\tm_pFontMap(NULL)\n{\n}\n\nCFFL_ListBox::~CFFL_ListBox()\n{\n\tif (m_pFontMap)\n\t{\n\t\tdelete m_pFontMap;\n\t\tm_pFontMap = NULL;\n\t}\n}\n\nPWL_CREATEPARAM\tCFFL_ListBox::GetCreateParam()\n{\n\tPWL_CREATEPARAM cp = CFFL_FormFiller::GetCreateParam();\n\n\tASSERT(m_pWidget != NULL);\n\tFX_DWORD dwFieldFlag = m_pWidget->GetFieldFlags();\n\t\t\n\tif (dwFieldFlag & FIELDFLAG_MULTISELECT)\n\t{\t\t\n\t\tcp.dwFlags |= PLBS_MULTIPLESEL;\n\t}\n\n\tif (dwFieldFlag & FIELDFLAG_COMMITONSELCHANGE)\n\t{\n\t\t//cp.dwFlags |= PLBS_COMMITSELECTEDVALUE;\n\t}\n\n\tcp.dwFlags |= PWS_VSCROLL;\n\n\tif (cp.dwFlags & PWS_AUTOFONTSIZE)\n\t\tcp.fFontSize = FFL_DEFAULTLISTBOXFONTSIZE;\n\n\tif (!m_pFontMap)\n\t{\n\t\tASSERT(this->m_pApp != NULL);\n\t\tm_pFontMap = new CBA_FontMap(m_pWidget,m_pApp->GetSysHandler());//, ISystemHandle::GetSystemHandler(m_pApp));\n\t\tm_pFontMap->Initial();\n\t}\n\tcp.pFontMap = m_pFontMap;\n\n\treturn cp;\n}\n\nCPWL_Wnd* CFFL_ListBox::NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView)\n{\n\tCPWL_ListBox* pWnd = new CPWL_ListBox();\n\tpWnd->AttachFFLData(this);\n\tpWnd->Create(cp);\n\n\tASSERT(m_pApp != NULL);\n\tCFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller();\n\tpWnd->SetFillerNotify(pIFormFiller);\n\n\tASSERT(m_pWidget != NULL);\n\t\n\tfor (FX_INT32 i=0,sz=m_pWidget->CountOptions(); i<sz; i++)\n\t\tpWnd->AddString(m_pWidget->GetOptionLabel(i));\n\t\n\tif (pWnd->HasFlag(PLBS_MULTIPLESEL))\n\t{\n\t\tm_OriginSelections.RemoveAll();\n\t\t\n\t\tFX_BOOL bSetCaret = FALSE;\n\t\tfor (FX_INT32 i=0,sz=m_pWidget->CountOptions(); i<sz; i++)\n\t\t{\n\t\t\tif (m_pWidget->IsOptionSelected(i))\n\t\t\t{\n\t\t\t\tif (!bSetCaret)\n\t\t\t\t{\n\t\t\t\t\tpWnd->SetCaret(i);\n\t\t\t\t\tbSetCaret = TRUE;\n\t\t\t\t}\n\t\t\t\tpWnd->Select(i);\n\t\t\t\tm_OriginSelections.SetAt(i, NULL);\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (int i=0,sz=m_pWidget->CountOptions(); i<sz; i++)\n\t\t{\n\t\t\tif (m_pWidget->IsOptionSelected(i))\n\t\t\t{\n\t\t\t\tpWnd->Select(i);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpWnd->SetTopVisibleIndex(m_pWidget->GetTopVisibleIndex());\n\t\n\treturn pWnd;\n}\n\n\nFX_BOOL\tCFFL_ListBox::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)\n{\n\treturn CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags);\n}\n\nFX_BOOL\tCFFL_ListBox::IsDataChanged(CPDFSDK_PageView* pPageView)\n{\n\tASSERT(m_pWidget != NULL);\n\n\tif (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE))\n\t{\n\t\tif (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT)\n\t\t{\n\t\t\tint nSelCount = 0;\n\t\t\tfor (FX_INT32 i=0,sz=pListBox->GetCount(); i<sz; i++)\n\t\t\t{\n\t\t\t\tif (pListBox->IsItemSelected(i))\n\t\t\t\t{\n\t\t\t\t\tvoid* p = NULL;\n\t\t\t\t\tif (!m_OriginSelections.Lookup(i, p))\n\t\t\t\t\t\treturn TRUE;\n\n\t\t\t\t\tnSelCount++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn nSelCount != m_OriginSelections.GetCount();\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn pListBox->GetCurSel() != m_pWidget->GetSelectedIndex(0);\n\t\t}\n\t}\n\t\n\treturn FALSE;\n}\n\nvoid CFFL_ListBox::SaveData(CPDFSDK_PageView* pPageView)\n{\n\tASSERT(m_pWidget != NULL);\n\n\tif (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE))\n\t{\n\t\tCFX_IntArray aOldSelect, aNewSelect;\n\n\t\t{\n\t\t\tfor (int i=0,sz=m_pWidget->CountOptions(); i<sz; i++)\n\t\t\t{\n\t\t\t\tif (m_pWidget->IsOptionSelected(i))\n\t\t\t\t{\n\t\t\t\t\taOldSelect.Add(i);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t\n\t\tFX_INT32 nNewTopIndex = pListBox->GetTopVisibleIndex();\n\n\t\tm_pWidget->ClearSelection(FALSE);\t\n\n\t\tif (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT)\n\t\t{\n\t\t\tfor (FX_INT32 i=0,sz=pListBox->GetCount(); i<sz; i++)\n\t\t\t{\n\t\t\t\tif (pListBox->IsItemSelected(i))\n\t\t\t\t{\n\t\t\t\t\tm_pWidget->SetOptionSelection(i, TRUE, FALSE);\n\t\t\t\t\taNewSelect.Add(i);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_pWidget->SetOptionSelection(pListBox->GetCurSel(), TRUE, FALSE);\n\t\t\taNewSelect.Add(pListBox->GetCurSel());\n\t\t}\n\n\t\tm_pWidget->SetTopVisibleIndex(nNewTopIndex);\n\t\tm_pWidget->ResetFieldAppearance(TRUE);\n\t\tm_pWidget->UpdateField();\n\t\tSetChangeMark();\n\t}\n}\n\nvoid CFFL_ListBox::GetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,\n\t\t\t\t\t\tPDFSDK_FieldAction& fa)\n{\n\tswitch (type)\n\t{\n\tcase CPDF_AAction::Validate:\n\t\tif (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT)\n\t\t{\n\t\t\tfa.sValue = L\"\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE))\n\t\t\t{\n\t\t\t\tASSERT(m_pWidget != NULL);\n\t\t\t\tFX_INT32 nCurSel = pListBox->GetCurSel();\n\t\t\t\tif (nCurSel >= 0)\n\t\t\t\t\tfa.sValue = m_pWidget->GetOptionLabel(nCurSel);\n\t\t\t}\n\t\t}\n\t\tbreak;\n\tcase CPDF_AAction::LoseFocus:\n\tcase CPDF_AAction::GetFocus:\n\t\tif (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT)\n\t\t{\n\t\t\tfa.sValue = L\"\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\tASSERT(m_pWidget != NULL);\n\t\t\tFX_INT32 nCurSel = m_pWidget->GetSelectedIndex(0);\n\t\t\tif (nCurSel >= 0)\n\t\t\t\tfa.sValue = m_pWidget->GetOptionLabel(nCurSel);\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n}\n\n\nvoid CFFL_ListBox::SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type, \n\t\t\t\t\t\t\t\tconst PDFSDK_FieldAction& fa)\n{\n}\n\nvoid CFFL_ListBox::SaveState(CPDFSDK_PageView* pPageView)\n{\n\tASSERT(pPageView != NULL);\n\n\tif (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE))\n\t{\n\t\tfor (FX_INT32 i=0,sz=pListBox->GetCount(); i<sz; i++)\n\t\t{\n\t\t\tif (pListBox->IsItemSelected(i))\n\t\t\t{\n\t\t\t\tm_State.Add(i);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid CFFL_ListBox::RestoreState(CPDFSDK_PageView* pPageView)\n{\n\tif (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE))\n\t{\n\t\tfor (int i=0,sz=m_State.GetSize(); i<sz; i++)\n\t\t\tpListBox->Select(m_State[i]);\n\t}\n}\n\nCPWL_Wnd* CFFL_ListBox::ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue)\n{\n\tif (bRestoreValue)\n\t\tSaveState(pPageView);\n\t\n\tDestroyPDFWindow(pPageView);\n\t\n\tCPWL_Wnd* pRet = NULL;\n\t\n\tif (bRestoreValue)\n\t{\n\t\tRestoreState(pPageView);\n\t\tpRet = this->GetPDFWindow(pPageView, FALSE);\n\t}\n\telse\n\t\tpRet = this->GetPDFWindow(pPageView, TRUE);\n\t\n\tm_pWidget->UpdateField();\n\t\n\treturn pRet;\n}\n\nvoid CFFL_ListBox::OnKeyStroke(FX_BOOL bKeyDown, FX_DWORD nFlag)\n{\n\tASSERT(m_pWidget != NULL);\n\n\tint nFlags = m_pWidget->GetFieldFlags();\n\t\n\tif (nFlags & FIELDFLAG_COMMITONSELCHANGE)\n\t{\n\t\tif (m_bValid)\n\t\t{\n\t\t\tCPDFSDK_PageView* pPageView = this->GetCurPageView();\n\t\t\tASSERT(pPageView != NULL);\n\n\t\t\tif (CommitData(pPageView, nFlag))\n\t\t\t{\n\t\t\t\tDestroyPDFWindow(pPageView);\n\t\t\t\tm_bValid = FALSE;\n\t\t\t}\n\t\t}\n\t}\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/formfiller/FFL_Notify.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n// #include \"../../include/formfiller/FormFiller.h\"\n#include \"../../include/formfiller/FFL_FormFiller.h\"\n#include \"../../include/formfiller/FFL_Notify.h\"\n// #include \"../../include/formfiller/FFL_ComboBox.h\"\n// #include \"../../include/formfiller/FFL_Module.h\"\n\n/* -------------------------------- CFFL_Notify ------------------------------ */\n\n//#pragma warning(disable: 4800)\n\nCFFL_Notify::CFFL_Notify(CFFL_FormFiller * pFormFiller) : \n\tm_pFormFiller(pFormFiller),\n\tm_bDoActioning(FALSE),\n\tm_nNotifyFlag(0)\n{\n\tASSERT(m_pFormFiller != NULL);\n}\n\nCFFL_Notify::~CFFL_Notify()\n{\n}\n\nvoid CFFL_Notify::BeforeNotify()\n{\n\tm_nNotifyFlag ++;\n}\n\n\nvoid CFFL_Notify::AfterNotify()\n{\n\tm_nNotifyFlag --;\n}\n\nFX_BOOL CFFL_Notify::OnMouseUp(FX_BOOL & bExit)\n{\n\tBeforeNotify();\n\tFX_BOOL bRet = FALSE;//DoAAction(CPDF_AAction::AActionType::ButtonUp, bExit);\n\tAfterNotify();\n\treturn bRet;\n}\n\nFX_BOOL CFFL_Notify::OnMouseDown(FX_BOOL & bExit)\n{\n\tBeforeNotify();\n\tFX_BOOL bRet = FALSE;//DoAAction(CPDF_AAction::AActionType::ButtonDown, bExit);\n\tAfterNotify();\n\treturn bRet;\n}\n\nFX_BOOL CFFL_Notify::OnMouseEnter(FX_BOOL & bExit)\n{\n\tBeforeNotify();\n\tFX_BOOL bRet = FALSE;//DoAAction(CPDF_AAction::AActionType::CursorEnter, bExit);\n\tAfterNotify();\n\treturn bRet;\n}\n\nFX_BOOL CFFL_Notify::OnMouseExit(FX_BOOL & bExit)\n{\n\tBeforeNotify();\n\tFX_BOOL bRet = FALSE;//DoAAction(CPDF_AAction::AActionType::CursorExit, bExit);\n\tAfterNotify();\n\treturn bRet;\n}\n\nFX_BOOL CFFL_Notify::OnSetFocus(FX_BOOL & bExit)\n{\n\tBeforeNotify();\n\tFX_BOOL bRet = FALSE;//DoAAction(CPDF_AAction::AActionType::GetFocus, bExit);\n\tAfterNotify();\n\treturn bRet;\n}\n\nFX_BOOL CFFL_Notify::OnKillFocus(FX_BOOL & bExit)\n{\n\tBeforeNotify();\n\tFX_BOOL bRet = FALSE;//DoAAction(CPDF_AAction::AActionType::LoseFocus, bExit);\n\tAfterNotify();\n\treturn bRet;\n}\n\nFX_BOOL CFFL_Notify::OnCalculate()\n{\n\treturn TRUE;\n}\n\nFX_BOOL CFFL_Notify::OnFormat(int iCommitKey)\n{\n\treturn TRUE;\n}\n\nFX_BOOL CFFL_Notify::OnKeyStroke(CPDF_FormField* pFormField, int nCommitKey, CFX_WideString& strValue, CFX_WideString& strChange, \n\t\t\t\t\t\t\t   const CFX_WideString& strChangeEx, FX_BOOL bKeyDown, FX_BOOL bModifier,\n\t\t\t\t\t\t\t   FX_BOOL bShift, FX_BOOL bWillCommit, FX_BOOL bFieldFull, \n\t\t\t\t\t\t\t   int& nSelStart, int& nSelEnd, FX_BOOL& bRC)\n{\n\treturn TRUE;\n}\n\nFX_BOOL CFFL_Notify::OnValidate(CPDF_FormField* pFormField, CFX_WideString& strValue, CFX_WideString & strChange, \n\t\t\t\t\t\t\t\t\t   const CFX_WideString& strChangeEx, FX_BOOL bKeyDown, FX_BOOL bModifier,\n\t\t\t\t\t\t\t\t\t   FX_BOOL bShift, FX_BOOL & bRC)\n{\n\treturn TRUE;\n}\n\nFX_BOOL\tCFFL_Notify::DoAAction(CPDF_AAction::AActionType eAAT, FX_BOOL & bExit)\n{\n\tif (this->m_bDoActioning) return FALSE;\n\t\n\tCPDF_Action action;\n\tif (!FindAAction(eAAT,action)) return FALSE;\n\n\tthis->m_bDoActioning = TRUE;\t\n\tExecuteActionTree(eAAT,action,bExit);\t\n\tthis->m_bDoActioning = FALSE;\n\treturn TRUE;\n}\n\nFX_BOOL\tCFFL_Notify::ExecuteActionTree(CPDF_AAction::AActionType eAAT,CPDF_Action & action, FX_BOOL& bExit)\n{\n\tif (!ExecuteAction(eAAT,action,bExit)) return FALSE;\n\tif (bExit) return TRUE;\n\n\tfor (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)\n\t{\n\t\tCPDF_Action subaction = action.GetSubAction(i);\n\t\tif (!ExecuteActionTree(eAAT,subaction,bExit)) return FALSE;\n\t\tif (bExit) break;\n\t}\n\n\treturn TRUE;\n}\n\n\nFX_BOOL\tCFFL_Notify::FindAAction(CPDF_AAction::AActionType eAAT,CPDF_Action & action)\n{\n\treturn FALSE;\n}\n\nFX_BOOL CFFL_Notify::FindAAction(CPDF_AAction aaction,CPDF_AAction::AActionType eAAT,CPDF_Action & action)\n{\n\tCPDF_Action MyAction;\n\n\tif (aaction.ActionExist(eAAT))\n\t{\n\t\tMyAction = aaction.GetAction(eAAT);\n\t}\n\telse\n\t\treturn FALSE;\n\n\n\tif (MyAction.GetType() == CPDF_Action::Unknown)\n\t\treturn FALSE;\n\n\taction = MyAction;\n\n\treturn TRUE;\n}\n\nFX_BOOL\tCFFL_Notify::ExecuteAction(CPDF_AAction::AActionType eAAT,CPDF_Action & action,FX_BOOL& bExit)\n{\n\treturn FALSE;\n}\n//#pragma warning(default: 4800)\n\n"
  },
  {
    "path": "fpdfsdk/src/formfiller/FFL_PushButton.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/formfiller/FormFiller.h\"\n#include \"../../include/formfiller/FFL_FormFiller.h\"\n#include \"../../include/formfiller/FFL_PushButton.h\"\n\n/* ------------------------------- CFFL_PushButton ------------------------------- */\n\nCFFL_PushButton::CFFL_PushButton(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot):\n\tCFFL_Button( pApp, pAnnot)\n{\n}\n\nCFFL_PushButton::~CFFL_PushButton()\n{\n}\n\nCPWL_Wnd* CFFL_PushButton::NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView)\n{\n\tCPWL_PushButton* pWnd = new CPWL_PushButton();\n\tpWnd->Create(cp);\n\t\n\treturn pWnd;\n}\n\n\nFX_BOOL\tCFFL_PushButton::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)\n{\n\treturn CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags);\n}\n\nvoid CFFL_PushButton::OnDraw(CPDFSDK_PageView *pPageView,  CPDFSDK_Annot* pAnnot, \n\t\t\t\t\t\t\t CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\t\t\t\t\t\t FX_DWORD dwFlags)\n{\n\tCFFL_Button::OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);\n}\n\n\n"
  },
  {
    "path": "fpdfsdk/src/formfiller/FFL_RadioButton.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/formfiller/FormFiller.h\"\n#include \"../../include/formfiller/FFL_FormFiller.h\"\n#include \"../../include/formfiller/FFL_RadioButton.h\"\n//#include \"../include/FFL_Undo.h\"\n\n/* ------------------------------- CFFL_RadioButton ------------------------------- */\n\nCFFL_RadioButton::CFFL_RadioButton(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget) :\n\tCFFL_Button(pApp, pWidget)\n{\n}\n\nCFFL_RadioButton::~CFFL_RadioButton()\n{\n}\n\nCPWL_Wnd* CFFL_RadioButton::NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView)\n{\n\tCPWL_RadioButton* pWnd = new CPWL_RadioButton();\n\tpWnd->Create(cp);\n\n\tASSERT(m_pWidget != NULL);\n\tpWnd->SetCheck(m_pWidget->IsChecked());\n\t\n\treturn pWnd;\n}\n\nFX_BOOL\tCFFL_RadioButton::OnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags)\n{\n\tswitch (nKeyCode)\n\t{\n\tcase FWL_VKEY_Return:\n\tcase FWL_VKEY_Space:\n\t\treturn TRUE;\n\tdefault:\n\t\treturn CFFL_FormFiller::OnKeyDown(pAnnot, nKeyCode, nFlags);\n\t}\n}\n\nFX_BOOL\tCFFL_RadioButton::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)\n{\n\tswitch (nChar)\n\t{\n\tcase FWL_VKEY_Return:\t\n\tcase FWL_VKEY_Space:\n\t\t{\n\t\t\tCFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller();\n\t\t\tASSERT(pIFormFiller != NULL);\n\n\t\t\tCPDFSDK_PageView* pPageView = pAnnot->GetPageView();\n\t\t\tASSERT(pPageView != NULL);\n\n\t\t\tFX_BOOL bReset = FALSE;\n\t\t\tFX_BOOL bExit = FALSE;\n\n\t\t\tpIFormFiller->OnButtonUp(m_pWidget, pPageView, bReset, bExit,nFlags);\n\n\t\t\tif (bReset) return TRUE;\n\t\t\tif (bExit) return TRUE;\n\n\t\t\tCFFL_FormFiller::OnChar(pAnnot, nChar, nFlags);\n\n\t\t\tif (CPWL_RadioButton * pWnd = (CPWL_RadioButton*)GetPDFWindow(pPageView, TRUE))\n\t\t\t\tpWnd->SetCheck(TRUE);\n\t\t\tCommitData(pPageView,nFlags);\n\t\t\treturn TRUE;\n\t\t}\n\tdefault:\n\t\treturn CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags);\n\t}\n}\n\nFX_BOOL\tCFFL_RadioButton::OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)\n{\n\tCFFL_Button::OnLButtonUp(pPageView, pAnnot, nFlags, point);\n\n\tif (IsValid())\n\t{\n\t\tif (CPWL_RadioButton * pWnd = (CPWL_RadioButton*)GetPDFWindow(pPageView, TRUE))\n\t\t\tpWnd->SetCheck(TRUE);\n\n\t\tif (!CommitData(pPageView,nFlags)) return FALSE;\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL\tCFFL_RadioButton::IsDataChanged(CPDFSDK_PageView* pPageView)\n{\n\tASSERT(m_pWidget != NULL);\n\n\tif (CPWL_RadioButton* pWnd = (CPWL_RadioButton*)GetPDFWindow(pPageView, FALSE))\n\t{\n\t\treturn pWnd->IsChecked() != m_pWidget->IsChecked();\n\t}\n\n\treturn FALSE;\n}\n\nvoid CFFL_RadioButton::SaveData(CPDFSDK_PageView* pPageView)\n{\n\tASSERT(m_pWidget != NULL);\n\n\tif (CPWL_RadioButton* pWnd = (CPWL_RadioButton*)GetPDFWindow(pPageView, FALSE))\n\t{\n\t\t\n\t\tFX_BOOL bNewChecked = pWnd->IsChecked();\n\n\t\tif (bNewChecked)\n\t\t{\n\t\t\tCPDF_FormField* pField = m_pWidget->GetFormField();\n\t\t\tASSERT(pField != NULL);\n\n\t\t\tfor (FX_INT32 i=0,sz=pField->CountControls(); i<sz; i++)\n\t\t\t{\n\t\t\t\tif (CPDF_FormControl* pCtrl = pField->GetControl(i))\n\t\t\t\t{\n\t\t\t\t\tif (pCtrl->IsChecked())\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tm_pWidget->SetCheck(bNewChecked, FALSE);\n\t\tm_pWidget->UpdateField();\n\t\tSetChangeMark();\n\t}\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/formfiller/FFL_TextField.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n//#include \"../include/FormFiller.h\"\n//#include \"../include/FFL_FormFiller.h\"\n#include \"../../include/formfiller/FFL_TextField.h\"\n#include \"../../include/formfiller/FFL_CBA_Fontmap.h\"\n//#include \"../include/FFL_Notify.h\"\n\nCFFL_EditUndoItem::CFFL_EditUndoItem(CPWL_Edit* pEdit) : m_pEdit(pEdit)\n{\n}\n\nCFFL_EditUndoItem::~CFFL_EditUndoItem()\n{\n}\n\nvoid CFFL_EditUndoItem::Undo()\n{\n}\n\nvoid CFFL_EditUndoItem::Redo()\n{\n}\n\nCFX_WideString CFFL_EditUndoItem::GetDescr()\n{\n\treturn L\"Input\";\n}\n\nvoid CFFL_EditUndoItem::Release()\n{\n\tdelete this;\n}\n\n/* ------------------------------- CFFL_TextField ------------------------------- */\n\nCFFL_TextField::CFFL_TextField(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot) :\n\tCFFL_FormFiller(pApp, pAnnot),\n\tm_pFontMap(NULL)//,\n\t//m_pSpellCheck(NULL)\n{\n\tm_State.nStart = m_State.nEnd = 0;\n}\n\nCFFL_TextField::~CFFL_TextField()\n{\n\tif (m_pFontMap)\n\t{\n\t\tdelete m_pFontMap;\n\t\tm_pFontMap = NULL;\n\t}\n\n}\n\nPWL_CREATEPARAM CFFL_TextField::GetCreateParam()\n{\n\tPWL_CREATEPARAM cp = CFFL_FormFiller::GetCreateParam();\n\n\tASSERT(m_pWidget != NULL);\n\tint nFlags = m_pWidget->GetFieldFlags();\n\n\n\tif (nFlags & FIELDFLAG_PASSWORD)\n\t{\t\t\n\t\tcp.dwFlags |= PES_PASSWORD;\n\t}\n\n\tif (!(nFlags & FIELDFLAG_DONOTSPELLCHECK))\n\t{\t\t\n\t}\n\n\tif (nFlags & FIELDFLAG_MULTILINE)\n\t{\t\t\n\t\tcp.dwFlags |= PES_MULTILINE | PES_AUTORETURN | PES_TOP;\n\n\t\tif (!(nFlags & FIELDFLAG_DONOTSCROLL))\n\t\t{\n\t\t\tcp.dwFlags |= PWS_VSCROLL | PES_AUTOSCROLL;\n\t\t}\n\t}\n\telse\n\t{\n\t\tcp.dwFlags |= PES_CENTER;\n\n\t\tif (!(nFlags & FIELDFLAG_DONOTSCROLL))\n\t\t{\n\t\t\tcp.dwFlags |= PES_AUTOSCROLL;\n\t\t}\n\t}\n\n\tif (nFlags & FIELDFLAG_COMB)\n\t{\t\t\n\t\tcp.dwFlags |= PES_CHARARRAY;\n\t}\n\n\tif (nFlags & FIELDFLAG_RICHTEXT)\n\t{\t\t\n\t\tcp.dwFlags |= PES_RICH;\n\t}\n\n\tcp.dwFlags |= PES_UNDO;\n\t\n \tswitch (m_pWidget->GetAlignment())\n \t{\n \tdefault:\n \tcase BF_ALIGN_LEFT:\n \t\tcp.dwFlags |= PES_LEFT;\n \t\tbreak;\n \tcase BF_ALIGN_MIDDLE:\n \t\tcp.dwFlags |= PES_MIDDLE;\n \t\tbreak;\n \tcase BF_ALIGN_RIGHT:\n \t\tcp.dwFlags |= PES_RIGHT;\n \t\tbreak;\n \t}\n\n\tif (!m_pFontMap)\n\t{\n\t\tASSERT(this->m_pApp != NULL);\n\t\tm_pFontMap = new CBA_FontMap(m_pWidget, /*ISystemHandle::GetSystemHandler(m_pApp)*/m_pApp->GetSysHandler());\n\t\tm_pFontMap->Initial();\n\t}\n\tcp.pFontMap = m_pFontMap;\n\tcp.pFocusHandler = this;\n\n\treturn cp;\n}\n\nCPWL_Wnd* CFFL_TextField::NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView)\n{\n\tCPWL_Edit * pWnd = new CPWL_Edit();\n\t\tpWnd->AttachFFLData(this);\n\tpWnd->Create(cp);\n\n\n\n\tASSERT(m_pApp != NULL);\n\tCFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller();\n\tpWnd->SetFillerNotify(pIFormFiller);\n\n\tASSERT(m_pWidget != NULL);\n\tFX_INT32 nMaxLen = m_pWidget->GetMaxLen();\n\tCFX_WideString swValue = m_pWidget->GetValue();\n\t\n\tif (nMaxLen > 0)\n\t{\n\t\tif (pWnd->HasFlag(PES_CHARARRAY))\n\t\t{\n\t\t\tpWnd->SetCharArray(nMaxLen);\n\t\t\tpWnd->SetAlignFormatV(PEAV_CENTER);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpWnd->SetLimitChar(nMaxLen);\n\t\t}\n\t}\n\t\n\tpWnd->SetText(swValue);\n\t\n\treturn pWnd;\n}\n\n\nFX_BOOL\tCFFL_TextField::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)\n{\n\tswitch (nChar)\n\t{\n\tcase FWL_VKEY_Return:\n \t\tif (!(m_pWidget->GetFieldFlags() & FIELDFLAG_MULTILINE))\n \t\t{\n \t\t\tCPDFSDK_PageView* pPageView = this->GetCurPageView();\n \t\t\tASSERT(pPageView != NULL);\n \t\t\tm_bValid = !m_bValid;\n\t\t\tCPDF_Rect rcAnnot = pAnnot->GetRect();\n\t\t\tm_pApp->FFI_Invalidate(pAnnot->GetPDFPage(), rcAnnot.left, rcAnnot.top, rcAnnot.right, rcAnnot.bottom);\n \n \t\t\tif (m_bValid)\n \t\t\t{\n \t\t\t\tif (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, TRUE))\n \t\t\t\t\tpWnd->SetFocus();\n \t\t\t}\n \t\t\telse\n \t\t\t{\n \t\t\t\tif (CommitData(pPageView, nFlags))\n \t\t\t\t{\n \t\t\t\t\tDestroyPDFWindow(pPageView);\n \t\t\t\t\treturn TRUE;\n \t\t\t\t}\n \t\t\t\telse\n \t\t\t\t{\n \t\t\t\t\treturn FALSE;\n \t\t\t\t}\n \t\t\t}\n \t\t}\n\t\tbreak;\n\tcase FWL_VKEY_Escape:\n\t\t{\n\t\t\tCPDFSDK_PageView* pPageView = this->GetCurPageView();\n\t\t\tASSERT(pPageView != NULL);\n\t\t\tEscapeFiller(pPageView,TRUE);\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\treturn CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags);\n}\n\nFX_BOOL\tCFFL_TextField::IsDataChanged(CPDFSDK_PageView* pPageView)\n{\n\tASSERT(m_pWidget != NULL);\n\n \tif (CPWL_Edit * pEdit = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))\n \t\treturn pEdit->GetText() != m_pWidget->GetValue();\n\n\treturn FALSE;\n}\n\nvoid CFFL_TextField::SaveData(CPDFSDK_PageView* pPageView)\n{\n\tASSERT(m_pWidget != NULL);\n\n\tif (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))\n\t{\n\t\tCFX_WideString sOldValue = m_pWidget->GetValue();\n\t\tCFX_WideString sNewValue = pWnd->GetText();\n\n\t\tm_pWidget->SetValue(sNewValue, FALSE);\t\n\t\tm_pWidget->ResetFieldAppearance(TRUE);\n\t\tm_pWidget->UpdateField();\n\t\tSetChangeMark();\n\t}\n}\n\nvoid CFFL_TextField::GetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,\n\t\t\t\t\t\t\t\t\tPDFSDK_FieldAction& fa)\n{\n\tswitch (type)\n\t{\n\tcase CPDF_AAction::KeyStroke:\n\t\tif (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))\n\t\t{\n\t\t\tfa.bFieldFull = pWnd->IsTextFull();\t\n\n\t\t\tfa.sValue = pWnd->GetText();\n\t\t\t\n\t\t\tif (fa.bFieldFull)\n\t\t\t{\n\t\t\t\tfa.sChange = L\"\";\n\t\t\t\tfa.sChangeEx = L\"\";\n\t\t\t}\n\t\t}\n\t\tbreak;\n\tcase CPDF_AAction::Validate:\n\t\tif (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))\n\t\t{\n\t\t\tfa.sValue = pWnd->GetText();\n\t\t}\n\t\tbreak;\n\tcase CPDF_AAction::LoseFocus:\n\tcase CPDF_AAction::GetFocus:\n\t\tASSERT(m_pWidget != NULL);\n\t\tfa.sValue = m_pWidget->GetValue();\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n}\n\nvoid CFFL_TextField::SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type, \n \t\t\t\t\t\t\t\t\tconst PDFSDK_FieldAction& fa)\n{\n\tswitch (type)\n\t{\n\tcase CPDF_AAction::KeyStroke:\n\t\tif (CPWL_Edit * pEdit = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))\n\t\t{\n\t\t\tpEdit->SetFocus();\n\t\t\tpEdit->SetSel(fa.nSelStart, fa.nSelEnd);\n\t\t\tpEdit->ReplaceSel(fa.sChange);\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n}\n\n\nFX_BOOL\tCFFL_TextField::IsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld, \n\t\t\t\t\t\t\t\t\tconst PDFSDK_FieldAction& faNew)\n{\n\tswitch (type)\n\t{\n\tcase CPDF_AAction::KeyStroke:\n\t\treturn (!faOld.bFieldFull && faOld.nSelEnd != faNew.nSelEnd) || faOld.nSelStart != faNew.nSelStart ||\n\t\t\tfaOld.sChange != faNew.sChange;\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn FALSE;\n}\n\nvoid CFFL_TextField::SaveState(CPDFSDK_PageView* pPageView)\n{\n\tASSERT(pPageView != NULL);\n\n\tif (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))\n\t{\n\t\tpWnd->GetSel(m_State.nStart, m_State.nEnd);\n\t\tm_State.sValue = pWnd->GetText();\n\t}\n}\n\nvoid CFFL_TextField::RestoreState(CPDFSDK_PageView* pPageView)\n{\n\tASSERT(pPageView != NULL);\n\n\tif (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, TRUE))\n\t{\n\t\tpWnd->SetText(m_State.sValue);\n\t\tpWnd->SetSel(m_State.nStart, m_State.nEnd);\n\t}\n}\n\nCPWL_Wnd* CFFL_TextField::ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue)\n{\n\tif (bRestoreValue)\n\t\tSaveState(pPageView);\n\n\tDestroyPDFWindow(pPageView);\n\n\tCPWL_Wnd* pRet = NULL;\n\n\tif (bRestoreValue)\n\t{\n\t\tRestoreState(pPageView);\n\t\tpRet = this->GetPDFWindow(pPageView, FALSE);\n\t}\n\telse\n\t\tpRet = this->GetPDFWindow(pPageView, TRUE);\n\n\tm_pWidget->UpdateField();\n\t\n\treturn pRet;\n}\n\nvoid CFFL_TextField::OnSetFocus(CPWL_Wnd* pWnd)\n{\n\tASSERT(m_pApp != NULL);\n\t\n \tASSERT(pWnd != NULL);\n \n \tif (pWnd->GetClassName() == PWL_CLASSNAME_EDIT)\n \t{\n \t\tCPWL_Edit* pEdit = (CPWL_Edit*)pWnd;\n\t\tpEdit->SetCharSet(134);\n\t\tpEdit->SetCodePage(936);\n \n\t\tpEdit->SetReadyToInput();\n\t\tCFX_WideString wsText = pEdit->GetText();\n\t\tint nCharacters = wsText.GetLength();\n\t\tCFX_ByteString bsUTFText = wsText.UTF16LE_Encode();\n\t\tunsigned short* pBuffer = (unsigned short*)(FX_LPCSTR)bsUTFText;\n\t\tm_pApp->FFI_OnSetFieldInputFocus(m_pWidget->GetFormField(), pBuffer, nCharacters, TRUE);\n \n \t\tpEdit->SetEditNotify(this);\n \t\t//pUndo->BeginEdit(pDocument);\n \t}\n}\n\nvoid CFFL_TextField::OnKillFocus(CPWL_Wnd* pWnd)\n{\n\n}\n\nFX_BOOL\tCFFL_TextField::CanCopy(CPDFSDK_Document* pDocument)\n{\n\treturn FALSE;\n}\n\nFX_BOOL CFFL_TextField::CanCut(CPDFSDK_Document* pDocument)\n{\n\treturn FALSE;\n}\n\nFX_BOOL\tCFFL_TextField::CanPaste(CPDFSDK_Document* pDocument)\n{\n\treturn FALSE;\n}\n\nvoid CFFL_TextField::DoCopy(CPDFSDK_Document* pDocument)\n{\n\n}\n\nvoid CFFL_TextField::DoCut(CPDFSDK_Document* pDocument)\n{\n}\n\nvoid CFFL_TextField::DoPaste(CPDFSDK_Document* pDocument)\n{\n\n}\n\nvoid CFFL_TextField::OnAddUndo(CPWL_Edit* pEdit)\n{\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/formfiller/FFL_Utils.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/formfiller/FormFiller.h\"\n#include \"../../include/formfiller/FFL_Utils.h\"\n\nCPDF_Rect CFFL_Utils::MaxRect(const CPDF_Rect & rect1,const CPDF_Rect & rect2)\n{\n\tCPDF_Rect rcRet;\n\n\trcRet.left = FFL_MIN(rect1.left,rect2.left);\n\trcRet.bottom = FFL_MIN(rect1.bottom,rect2.bottom);\n\trcRet.right = FFL_MAX(rect1.right,rect2.right);\n\trcRet.top = FFL_MAX(rect1.top,rect2.top);\n\n\treturn rcRet;\n}\n\nCPDF_Rect CFFL_Utils::InflateRect(const CPDF_Rect & crRect,const FX_FLOAT & fSize)\n{\n\tCPDF_Rect crNew(crRect.left - fSize,\n\t\t\t\t\tcrRect.bottom - fSize,\n\t\t\t\t\tcrRect.right + fSize,\n\t\t\t\t\tcrRect.top + fSize);\n\tcrNew.Normalize();\n\treturn crNew;\n}\n\nCPDF_Rect CFFL_Utils::DeflateRect(const CPDF_Rect & crRect,const FX_FLOAT & fSize)\n{\n\tCPDF_Rect crNew(crRect.left + fSize,\n\t\t\t\t\tcrRect.bottom + fSize,\n\t\t\t\t\tcrRect.right - fSize,\n\t\t\t\t\tcrRect.top - fSize);\n\tcrNew.Normalize();\n\treturn crNew;\n}\n\n/*\nFX_BOOL CFFL_Utils::RectContainsRect(const CPDF_Rect & father,const CPDF_Rect & son)\n{\n\treturn (father.left <= son.left && father.right >= son.right && \n\t\t\t\tfather.bottom <= son.bottom && father.top >= son.top);\n\n}\n\nFX_BOOL CFFL_Utils::RectContainsPoint(const CPDF_Rect & father,const CPDF_Point & son)\n{\n\treturn (father.left <= son.x && father.right >= son.x && \n\t\t\t\tfather.bottom <= son.y && father.top >= son.y);\n}\n\nFX_BOOL CFFL_Utils::RectContainsXY(const CPDF_Rect & father,FX_FLOAT x,FX_FLOAT y)\n{\n\treturn (father.left <= x && father.right >= x && \n\t\t\t\tfather.bottom <= y && father.top >= y);\n}\n*/\n\nFX_BOOL CFFL_Utils::TraceObject(CPDF_Object* pObj)\n{\n\tif (!pObj) return FALSE;\n\n\tFX_DWORD\tdwObjNum = pObj->GetObjNum();\n\tswitch (pObj->GetType())\n\t{\n\tcase PDFOBJ_ARRAY:\n\t\t{\n\t\t\tCPDF_Array* pArray = (CPDF_Array*)pObj;\n\t\t\tfor (FX_DWORD i = 0; i < pArray->GetCount(); i ++)\n\t\t\t{\n\t\t\t\tCPDF_Object* pElement = pArray->GetElementValue(i);\t\t\t\t\n\t\t\t\tTraceObject(pElement);\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase PDFOBJ_DICTIONARY:\n\t\t{\n\t\t\tCPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;\n\n\t\t\tFX_POSITION fPos = pDict->GetStartPos();\n\t\t\tCFX_ByteString csKey;\n\t\t\tdo\n\t\t\t{\n\t\t\t\tCPDF_Object* pElement = pDict->GetNextElement(fPos, csKey);\n \t\t\t\t//TRACE(csKey + \"\\n\");\n\t\t\t\tif (!pElement) break;\n\t\t\t\tTraceObject(pElement);\n\t\t\t}while (TRUE);\n\t\t}\n\t\tbreak;\n\n\tcase PDFOBJ_STREAM:\n\t\t{\n\t\t\tCPDF_Stream* pStream = (CPDF_Stream*)pObj;\n\t\t\tCPDF_Dictionary* pDict = pStream->GetDict();\n\t\t\tTraceObject(pDict);\n\t\t}\n\t\tbreak;\n\n\tcase PDFOBJ_REFERENCE:\n\t\t{\n\t\t\tCPDF_Object* pDirectObj = pObj->GetDirect();\n\t\t\tTraceObject(pDirectObj);\n\t\t}\n\t\tbreak;\n\n\tcase PDFOBJ_BOOLEAN:\n\t\tbreak;\n\tcase PDFOBJ_NUMBER:\n\t\t//TRACE(\"%d\\n\",(FX_INT32)pObj);\n\t\tbreak;\n\tcase PDFOBJ_STRING:\n\t\t//TRACE(((CPDF_String*)pObj)->GetString() + \"\\n\");\n\t\tbreak;\n\tcase PDFOBJ_NAME:\n\t\t//TRACE(((CPDF_Name*)pObj)->GetString() + \"\\n\");\n\t\tbreak;\n\tcase PDFOBJ_NULL:\n//\tcase PDFOBJ_KEYWORD:\n//\tcase PDFOBJ_EOF:\n\tdefault:\n\t\tbreak;\n\t}\n\tif (dwObjNum == 0) return FALSE;\n\n\treturn TRUE;\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/fpdf_dataavail.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../include/fsdk_define.h\"\n#include \"../include/fpdf_dataavail.h\"\n\nextern void ProcessParseError(FX_DWORD err_code);\nclass CFPDF_FileAvailWrap : public IFX_FileAvail\n{\npublic:\n\tCFPDF_FileAvailWrap()\n\t{\n\t\tm_pfileAvail = NULL;\n\t}\n\n\tvoid Set(FX_FILEAVAIL* pfileAvail)\n\t{\n\t\tm_pfileAvail = pfileAvail;\n\t}\n\n\tvirtual FX_BOOL\t\t\tIsDataAvail( FX_FILESIZE offset, FX_DWORD size)\n\t{\n\t\treturn m_pfileAvail->IsDataAvail(m_pfileAvail, offset, size);\n\t}\n\nprivate:\n\tFX_FILEAVAIL* m_pfileAvail;\n};  \n\nclass CFPDF_FileAccessWrap : public IFX_FileRead\n{\npublic:\n\tCFPDF_FileAccessWrap()\n\t{\n\t\tm_pFileAccess = NULL;\n\t}\n\n\tvoid Set(FPDF_FILEACCESS* pFile)\n\t{\n\t\tm_pFileAccess = pFile;\n\t}\n\n\tvirtual FX_FILESIZE\t\tGetSize()\n\t{\n\t\treturn m_pFileAccess->m_FileLen; \n\t}\n\n\tvirtual FX_BOOL\t\t\tReadBlock(void* buffer, FX_FILESIZE offset, size_t size)\n\t{\n\t\treturn m_pFileAccess->m_GetBlock(m_pFileAccess->m_Param, offset, (FX_LPBYTE)buffer, size);\n\t}\n\n\tvirtual void\t\t\tRelease()\n\t{\n\t}\n\nprivate:\n\tFPDF_FILEACCESS*\t\tm_pFileAccess;\n};\n\nclass CFPDF_DownloadHintsWrap : public IFX_DownloadHints\n{\npublic:\n\tCFPDF_DownloadHintsWrap(FX_DOWNLOADHINTS* pDownloadHints)\n\t{\n\t\tm_pDownloadHints = pDownloadHints;\n\t}\npublic:\n\tvirtual void\t\t\tAddSegment(FX_FILESIZE offset, FX_DWORD size) \n\t{\n\t\tm_pDownloadHints->AddSegment(m_pDownloadHints, offset, size);\n\t}\t\nprivate:\n\tFX_DOWNLOADHINTS* m_pDownloadHints;\n};\n\nclass CFPDF_DataAvail : public CFX_Object\n{\npublic:\n\tCFPDF_DataAvail()\n\t{\n\t\tm_pDataAvail = NULL;\n\t}\n\n\t~CFPDF_DataAvail()\n\t{\n\t\tif (m_pDataAvail) delete m_pDataAvail;\n\t}\n\n\tCPDF_DataAvail*\t\t\tm_pDataAvail;\n\tCFPDF_FileAvailWrap\t\tm_FileAvail;\n\tCFPDF_FileAccessWrap\tm_FileRead;\n};\n\nDLLEXPORT FPDF_AVAIL STDCALL FPDFAvail_Create(FX_FILEAVAIL* file_avail, FPDF_FILEACCESS* file)\n{\n\tCFPDF_DataAvail* pAvail = FX_NEW CFPDF_DataAvail;\n\tpAvail->m_FileAvail.Set(file_avail);\n\tpAvail->m_FileRead.Set(file);\n\tpAvail->m_pDataAvail = FX_NEW CPDF_DataAvail(&pAvail->m_FileAvail, &pAvail->m_FileRead);\n\treturn pAvail;\n}\n\nDLLEXPORT void STDCALL FPDFAvail_Destroy(FPDF_AVAIL avail)\n{\n\tif (avail == NULL) return;\n\tdelete (CFPDF_DataAvail*)avail;\n}\n\nDLLEXPORT int STDCALL FPDFAvail_IsDocAvail(FPDF_AVAIL avail, FX_DOWNLOADHINTS* hints)\n{\n\tif (avail == NULL || hints == NULL) return 0;\n\tCFPDF_DownloadHintsWrap hints_wrap(hints);\n\treturn ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsDocAvail(&hints_wrap);\n}\n\nextern void CheckUnSupportError(CPDF_Document * pDoc, FX_DWORD err_code);\n\nDLLEXPORT FPDF_DOCUMENT STDCALL FPDFAvail_GetDocument(FPDF_AVAIL avail,\tFPDF_BYTESTRING password)\n{\n\tif (avail == NULL) return NULL;\n\tCPDF_Parser* pParser = FX_NEW CPDF_Parser;\n\tpParser->SetPassword(password);\n\n\tFX_DWORD err_code = pParser->StartAsynParse(((CFPDF_DataAvail*)avail)->m_pDataAvail->GetFileRead());\n\tif (err_code) {\n\t\tdelete pParser;\n\t\tProcessParseError(err_code);\n\t\treturn NULL;\n\t}\n\t((CFPDF_DataAvail*)avail)->m_pDataAvail->SetDocument(pParser->GetDocument());\n\tCheckUnSupportError(pParser->GetDocument(), FPDF_ERR_SUCCESS);\n\treturn pParser->GetDocument();\n}\n\nDLLEXPORT int STDCALL FPDFAvail_GetFirstPageNum(FPDF_DOCUMENT doc)\n{\n\tif (doc == NULL) return 0;\n\tCPDF_Document* pDoc = (CPDF_Document*)doc;\n\treturn ((CPDF_Parser*)pDoc->GetParser())->GetFirstPageNo();\n}\n\nDLLEXPORT int STDCALL FPDFAvail_IsPageAvail(FPDF_AVAIL avail, int page_index, FX_DOWNLOADHINTS* hints)\n{\n\tif (avail == NULL || hints == NULL) return 0;\n\tCFPDF_DownloadHintsWrap hints_wrap(hints);\n\treturn ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsPageAvail(page_index, &hints_wrap);\n}\n\nDLLEXPORT int STDCALL FPDFAvail_IsFormAvail(FPDF_AVAIL avail, FX_DOWNLOADHINTS* hints)\n{\n\tif (avail == NULL || hints == NULL) return -1;\n\tCFPDF_DownloadHintsWrap hints_wrap(hints);\n\treturn ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsFormAvail(&hints_wrap);\n}\n\nDLLEXPORT FPDF_BOOL STDCALL FPDFAvail_IsLinearized(FPDF_AVAIL avail)\n{\n\t\tif (avail == NULL) return -1;\n\treturn ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsLinearizedPDF();\n\n}\n"
  },
  {
    "path": "fpdfsdk/src/fpdf_ext.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../include/fsdk_define.h\"\n#include \"../include/fpdf_ext.h\"\n\n#define  FPDFSDK_UNSUPPORT_CALL 100\n\nclass CFSDK_UnsupportInfo_Adapter\n{\npublic:\n\tCFSDK_UnsupportInfo_Adapter(UNSUPPORT_INFO* unsp_info){ m_unsp_info = unsp_info;}\n//\tFX_BOOL NeedToPauseNow();\n\tvoid ReportError(int nErrorType);\n\nprivate:\n\tUNSUPPORT_INFO* m_unsp_info;\n};\n\nvoid CFSDK_UnsupportInfo_Adapter::ReportError(int nErrorType)\n{\n\tif(m_unsp_info && m_unsp_info->FSDK_UnSupport_Handler)\n\t{\n\t\tm_unsp_info->FSDK_UnSupport_Handler(m_unsp_info,nErrorType);\n\t}\n}\n\nvoid FreeUnsupportInfo(FX_LPVOID pData)\n{\n\tCFSDK_UnsupportInfo_Adapter * pAdapter = (CFSDK_UnsupportInfo_Adapter *)pData;\n\tdelete pAdapter;\n}\n\nFX_BOOL FPDF_UnSupportError(int nError)\n{\n\tCFSDK_UnsupportInfo_Adapter * pAdapter = (CFSDK_UnsupportInfo_Adapter *)CPDF_ModuleMgr::Get()->GetPrivateData((void *)FPDFSDK_UNSUPPORT_CALL);\n\n\tif(!pAdapter)\n\t\treturn FALSE;\n\tpAdapter->ReportError(nError);\n\treturn TRUE;\n}\t\n\nDLLEXPORT FPDF_BOOL STDCALL FSDK_SetUnSpObjProcessHandler(UNSUPPORT_INFO* unsp_info)\n{\n\tif (!unsp_info || unsp_info->version!=1)\n\t\treturn FALSE;\n\tCFSDK_UnsupportInfo_Adapter * pAdapter = new CFSDK_UnsupportInfo_Adapter(unsp_info);\n\n\tCPDF_ModuleMgr::Get()->SetPrivateData((void *)FPDFSDK_UNSUPPORT_CALL,pAdapter, &FreeUnsupportInfo);\n\n\treturn TRUE;\n}\n\nvoid CheckUnSupportAnnot(CPDF_Document * pDoc, CPDF_Annot* pPDFAnnot)\n{\n\tCFX_ByteString cbSubType = pPDFAnnot->GetSubType();\n\tif(cbSubType.Compare(\"3D\") == 0)\n\t{\n\t\tFPDF_UnSupportError(FPDF_UNSP_ANNOT_3DANNOT);\n\t}\n\telse if(cbSubType.Compare(\"Screen\") ==0)\n\t{\n\t\tCPDF_Dictionary* pAnnotDict = pPDFAnnot->m_pAnnotDict;\n\t\tCFX_ByteString cbString;\n\t\tif(pAnnotDict->KeyExist(\"IT\"))\n\t\t\tcbString = pAnnotDict->GetString(\"IT\");\n\t\tif(cbString.Compare(\"Img\") != 0)\n\t\t\tFPDF_UnSupportError(FPDF_UNSP_ANNOT_SCREEN_MEDIA);\n\t}\n\telse if(cbSubType.Compare(\"Movie\") ==0)\n\t{\n\t\tFPDF_UnSupportError(FPDF_UNSP_ANNOT_MOVIE);\n\t}\n\telse if(cbSubType.Compare(\"Sound\") ==0)\n\t{\n\t\tFPDF_UnSupportError(FPDF_UNSP_ANNOT_SOUND);\n\t}\n\telse if(cbSubType.Compare(\"RichMedia\") ==0)\n\t{\n\t\tFPDF_UnSupportError(FPDF_UNSP_ANNOT_SCREEN_RICHMEDIA);\n\t}\n\telse if(cbSubType.Compare(\"FileAttachment\") ==0)\n\t{\n\t\tFPDF_UnSupportError(FPDF_UNSP_ANNOT_ATTACHMENT);\n\t}\n\telse if(cbSubType.Compare(\"Widget\") ==0)\n\t{\n\t\tCPDF_Dictionary* pAnnotDict = pPDFAnnot->m_pAnnotDict;\n\t\tCFX_ByteString cbString;\n\t\tif(pAnnotDict->KeyExist(\"FT\"))\n\t\t{\n\t\t\tcbString = pAnnotDict->GetString(\"FT\");\n\t\t}\t\n\t\tif(cbString.Compare(\"Sig\") == 0)\n\t\t{\n\t\t\tFPDF_UnSupportError(FPDF_UNSP_ANNOT_SIG);\n\t\t}\n\t}\n\t\n}\n\nFX_BOOL CheckSharedForm(CXML_Element * pElement, CFX_ByteString cbName)\n{\n\tint count = pElement->CountAttrs();\n\tint i=0;\n\tfor (i = 0; i < count; i++) \n\t{\n\t\tCFX_ByteString space, name; \n\t\tCFX_WideString value;\n\t\tpElement->GetAttrByIndex(i, space, name, value);\n\t\tif (space == FX_BSTRC(\"xmlns\") && name == FX_BSTRC(\"adhocwf\") && value ==  L\"http://ns.adobe.com/AcrobatAdhocWorkflow/1.0/\")\n\t\t{\n\t\t\tCXML_Element *pVersion = pElement->GetElement(\"adhocwf\",cbName);\n\t\t\tif (!pVersion)\n\t\t\t\tcontinue;\n\t\t\tCFX_WideString wsContent = pVersion->GetContent(0); // == 1.1\n\t\t\tint nType = wsContent.GetInteger();\n\t\t\tswitch(nType)\n\t\t\t{\n\t\t\tcase 1:\n\t\t\t\tFPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDFORM_ACROBAT);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tFPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDFORM_FILESYSTEM);\n\t\t\t\tbreak;\n\t\t\tcase 0:\n\t\t\t\tFPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDFORM_EMAIL);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tFX_DWORD nCount = pElement->CountChildren();\n\tfor(i=0; i<(int)nCount; i++)\n\t{\n\t\tCXML_Element::ChildType childType = pElement->GetChildType(i);\n\t\tif(childType == CXML_Element::Element)\n\t\t{\n\t\t\tCXML_Element * pChild = pElement->GetElement(i);\n\t\t\tif(CheckSharedForm(pChild, cbName))\n\t\t\t\treturn TRUE;\n\t\t}\n\t}\n\treturn FALSE;\n}\n\nvoid CheckUnSupportError(CPDF_Document * pDoc, FX_DWORD err_code)\n{\n\t// Security\n\tif(err_code == FPDF_ERR_SECURITY)\n\t{\n\t\tFPDF_UnSupportError(FPDF_UNSP_DOC_SECURITY);\n\t\treturn ;\n\t}\n\tif(!pDoc)\n\t\treturn ;\n\n\t// Portfolios and Packages \n\tCPDF_Dictionary * pRootDict = pDoc->GetRoot();\n\tif(pRootDict)\n\t{\n\t\tCFX_ByteString cbString;\n\t\tif(pRootDict->KeyExist(\"Collection\"))\n\t\t{\n\t\t\tFPDF_UnSupportError(FPDF_UNSP_DOC_PORTABLECOLLECTION);\n\t\t\treturn ;\n\t\t}\n\t\tif(pRootDict->KeyExist(\"Names\"))\n\t\t{\n\t\t\tCPDF_Dictionary* pNameDict = pRootDict->GetDict(\"Names\");\n\t\t\tif (pNameDict && pNameDict->KeyExist(\"EmbeddedFiles\"))\n\t\t\t{\n\t\t\t\tFPDF_UnSupportError(FPDF_UNSP_DOC_ATTACHMENT);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse if (pNameDict && pNameDict->KeyExist(\"JavaScript\"))\n\t\t\t{\n\t\t\t\tCPDF_Dictionary* pJSDict = pNameDict->GetDict(\"JavaScript\");\n\t\t\t\tCPDF_Array * pArray = pJSDict ? pJSDict->GetArray(\"Names\") : NULL;\n\t\t\t\tif (pArray) {\n\t\t\t\t\tint nCount = pArray->GetCount();\n\t\t\t\t\tfor(int i=0; i<nCount; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tCFX_ByteString cbStr = pArray->GetString(i);\n\t\t\t\t\t\tif(cbStr.Compare(\"com.adobe.acrobat.SharedReview.Register\") == 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tFPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDREVIEW);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// SharedForm\n\tCPDF_Metadata metaData;\n\tmetaData.LoadDoc(pDoc);\n\tCXML_Element * pElement = metaData.GetRoot();\n\tif(pElement)\n\t\tCheckSharedForm(pElement, \"workflowType\");\n\n\t\n\t// XFA Forms\n\tCPDF_InterForm * pInterForm = FX_NEW CPDF_InterForm(pDoc,FALSE);\n\tif (pInterForm)\n\t{\n\t\tif(pInterForm->HasXFAForm())\n\t\t{\n\t\t\tFPDF_UnSupportError(FPDF_UNSP_DOC_XFAFORM);\n\t\t}\n\t\tdelete pInterForm;\n\t}\n}\n\nDLLEXPORT int FPDFDoc_GetPageMode(FPDF_DOCUMENT document)\n{\n\tif (!document) return PAGEMODE_UNKNOWN;\n\tCPDF_Dictionary *pRoot = ((CPDF_Document*)document)->GetRoot();\n\tif (!pRoot)\n\t\treturn PAGEMODE_UNKNOWN;\n\tCPDF_Object* pName = pRoot->GetElement(\"PageMode\");\n\tif (!pName)\n\t\treturn PAGEMODE_USENONE;\n\tCFX_ByteString strPageMode = pName->GetString();\n\t\n\tif (strPageMode.IsEmpty()||strPageMode.EqualNoCase(FX_BSTR(\"UseNone\")))\n\t\treturn PAGEMODE_USENONE;\n\telse if (strPageMode.EqualNoCase(FX_BSTR(\"UseOutlines\")))\n\t\treturn PAGEMODE_USEOUTLINES;\n\telse if (strPageMode.EqualNoCase(FX_BSTR(\"UseThumbs\")))\n\t\treturn PAGEMODE_USETHUMBS;\n\telse if (strPageMode.EqualNoCase(FX_BSTR(\"FullScreen\")))\n\t\treturn PAGEMODE_FULLSCREEN;\n\telse if (strPageMode.EqualNoCase(FX_BSTR(\"UseOC\")))\n\t\treturn PAGEMODE_USEOC;\n\telse if (strPageMode.EqualNoCase(FX_BSTR(\"UseAttachments\")))\n\t\treturn PAGEMODE_USEATTACHMENTS;\n\n\treturn PAGEMODE_UNKNOWN;\n}\n"
  },
  {
    "path": "fpdfsdk/src/fpdf_flatten.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../include/fsdk_define.h\"\n#include \"../include/fpdf_flatten.h\"\n\ntypedef CFX_ArrayTemplate<CPDF_Dictionary*> CPDF_ObjectArray;\ntypedef CFX_ArrayTemplate<CPDF_Rect> CPDF_RectArray;\n\nenum FPDF_TYPE { MAX, MIN };\nenum FPDF_VALUE { TOP, LEFT, RIGHT, BOTTOM };\n\nFX_BOOL IsValiableRect(CPDF_Rect rect, CPDF_Rect rcPage)\n{\n\tif ( rect.left - rect.right > 0.000001f || \n\t\t rect.bottom - rect.top > 0.000001f)\n\t\treturn FALSE;\n\t\n\tif (rect.left == 0.0f &&\n\t\trect.top == 0.0f &&\n\t\trect.right == 0.0f &&\n\t\trect.bottom == 0.0f)\n\t\treturn FALSE;\n\t\n\tif (!rcPage.IsEmpty())\n\t{\n\t\tif (rect.left - rcPage.left < -10.000001f ||\n\t\t\trect.right - rcPage.right > 10.000001f ||\n\t\t\trect.top - rcPage.top > 10.000001f ||\n\t\t\trect.bottom - rcPage.bottom < -10.000001f)\n\t\t\treturn FALSE;\n\t}\n\t\n\treturn TRUE;\n}\n\n\nFX_BOOL GetContentsRect( CPDF_Document * pDoc, CPDF_Dictionary* pDict, CPDF_RectArray * pRectArray )\n{\n\tCPDF_Page* pPDFPage = FX_NEW CPDF_Page;\n\tpPDFPage->Load( pDoc, pDict, FALSE );\n\tpPDFPage->ParseContent();\n\n\tFX_POSITION pos = pPDFPage->GetFirstObjectPosition();\n\t\n\twhile (pos)\n\t{\n\t\tCPDF_PageObject* pPageObject = pPDFPage->GetNextObject(pos);\n\t\tif (!pPageObject)continue;\n\t\t\n\t\tCPDF_Rect rc;\n\t\trc.left = pPageObject->m_Left;\n\t\trc.right = pPageObject->m_Right;\n\t\trc.bottom = pPageObject->m_Bottom;\n\t\trc.top = pPageObject->m_Top;\n\t\t\n\t\tif (IsValiableRect(rc, pDict->GetRect(\"MediaBox\")))\n\t\t{\n\t\t\tpRectArray->Add(rc);\n\t\t}\n\t}\n\t\n\tdelete pPDFPage;\n\treturn TRUE;\n}\n\n\nvoid ParserStream( CPDF_Dictionary * pPageDic, CPDF_Dictionary* pStream, CPDF_RectArray * pRectArray, CPDF_ObjectArray * pObjectArray )\n{\n\tif (!pStream)return;\n\tCPDF_Rect rect;\n\tif (pStream->KeyExist(\"Rect\"))\n\t\trect = pStream->GetRect(\"Rect\");\n\telse if (pStream->KeyExist(\"BBox\"))\n\t\trect = pStream->GetRect(\"BBox\");\n\t\n\tif (IsValiableRect(rect, pPageDic->GetRect(\"MediaBox\")))\n\t\tpRectArray->Add(rect);\n\t\n\tpObjectArray->Add(pStream);\n}\n\n\nint ParserAnnots( CPDF_Document* pSourceDoc, CPDF_Dictionary * pPageDic, CPDF_RectArray * pRectArray, CPDF_ObjectArray * pObjectArray, int nUsage)\n{\n\tif (!pSourceDoc || !pPageDic) return FLATTEN_FAIL;\n\t\n\tGetContentsRect( pSourceDoc, pPageDic, pRectArray );\n\tCPDF_Array* pAnnots = pPageDic->GetArray(\"Annots\");\n\tif (pAnnots)\n\t{\n\t\tFX_DWORD dwSize = pAnnots->GetCount();\n\t\t\n\t\tfor (int i = 0; i < (int)dwSize; i++)\n\t\t{\n\t\t\tCPDF_Object* pObj = pAnnots->GetElementValue(i);\n\t\t\t\n\t\t\tif (!pObj)continue;\n\t\t\t\n\t\t\tif (pObj->GetType() == PDFOBJ_DICTIONARY)\n\t\t\t{\n\t\t\t\tCPDF_Dictionary* pAnnotDic = (CPDF_Dictionary*)pObj;\n\t\t\t\tCFX_ByteString sSubtype = pAnnotDic->GetString(\"Subtype\");\n\t\t\t\tif (sSubtype == \"Popup\")continue;\n\n\t\t\t\tint nAnnotFlag = pAnnotDic->GetInteger(\"F\");\n\n\t\t\t\tif(nAnnotFlag & ANNOTFLAG_HIDDEN) \n\t\t\t\t\tcontinue;\n\t\t\t\tif(nUsage == FLAT_NORMALDISPLAY)\n\t\t\t\t{\n\t\t\t\t\tif(nAnnotFlag & ANNOTFLAG_INVISIBLE)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tParserStream( pPageDic, pAnnotDic, pRectArray, pObjectArray );\t\t\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(nAnnotFlag & ANNOTFLAG_PRINT)\n\t\t\t\t\t\tParserStream( pPageDic, pAnnotDic, pRectArray, pObjectArray );\n\t\t\t\t}\t\t\t\n\t\t\t}\n\t\t}\n\t\treturn FLATTEN_SUCCESS;\n\t}else{\n\t\treturn FLATTEN_NOTINGTODO;\n\t}\n}\n\n\nFX_FLOAT GetMinMaxValue( CPDF_RectArray& array, FPDF_TYPE type, FPDF_VALUE value)\n{\n\tint nRects = array.GetSize();\n\tFX_FLOAT fRet = 0.0f;\n\t\n\tif (nRects <= 0)return 0.0f;\n\t\n\tFX_FLOAT* pArray = new FX_FLOAT[nRects];\n\tswitch(value)\n\t{\n\tcase LEFT:\n\t\t{\n\t\t\tfor (int i = 0; i < nRects; i++)\n\t\t\t\tpArray[i] = CPDF_Rect(array.GetAt(i)).left;\n\t\t\t\n\t\t\tbreak;\n\t\t}\n\tcase TOP:\n\t\t{\n\t\t\tfor (int i = 0; i < nRects; i++)\n\t\t\t\tpArray[i] = CPDF_Rect(array.GetAt(i)).top;\n\t\t\t\n\t\t\tbreak;\n\t\t}\n\tcase RIGHT:\n\t\t{\n\t\t\tfor (int i = 0; i < nRects; i++)\n\t\t\t\tpArray[i] = CPDF_Rect(array.GetAt(i)).right;\n\t\t\t\n\t\t\tbreak;\n\t\t}\n\tcase BOTTOM:\n\t\t{\n\t\t\tfor (int i = 0; i < nRects; i++)\n\t\t\t\tpArray[i] = CPDF_Rect(array.GetAt(i)).bottom;\n\t\t\t\n\t\t\tbreak;\n\t\t}\n\tdefault:\n\t\tbreak;\n\t}\n\tfRet = pArray[0];\n\tif (type == MAX)\n\t{\n\t\tfor (int i = 1; i < nRects; i++)\n\t\t\tif (fRet <= pArray[i])\n\t\t\t\tfRet = pArray[i];\n\t}\n\telse\n\t{\n\t\tfor (int i = 1; i < nRects; i++)\n\t\t\tif (fRet >= pArray[i])\n\t\t\t\tfRet = pArray[i];\n\t}\n\tdelete[] pArray;\n\treturn fRet;\n}\n\nCPDF_Rect CalculateRect( CPDF_RectArray * pRectArray )\n{\n\n\tCPDF_Rect rcRet;\n\t\n\trcRet.left = GetMinMaxValue(*pRectArray, MIN, LEFT);\n\trcRet.top = GetMinMaxValue(*pRectArray, MAX, TOP);\n\trcRet.right = GetMinMaxValue(*pRectArray, MAX, RIGHT);\n\trcRet.bottom = GetMinMaxValue(*pRectArray, MIN, BOTTOM);\n\t\n\treturn rcRet;\n}\n\n\nvoid SetPageContents(CFX_ByteString key, CPDF_Dictionary* pPage, CPDF_Document* pDocument)\n{\n\tCPDF_Object* pContentsObj = pPage->GetStream(\"Contents\");\n\tif (!pContentsObj)\n\t{\n\t\tpContentsObj = pPage->GetArray(\"Contents\");\n\t}\n\t\n\tif (!pContentsObj)\n\t{\n\t\t//Create a new contents dictionary\n\t\tif (!key.IsEmpty())\n\t\t{\n\t\t\tCPDF_Stream* pNewContents = FX_NEW CPDF_Stream(NULL, 0, FX_NEW CPDF_Dictionary);\n\t\t\tif (!pNewContents)return;\n\t\t\tpPage->SetAtReference(\"Contents\", pDocument, pDocument->AddIndirectObject(pNewContents));\n\t\t\t\n\t\t\tCFX_ByteString sStream;\n\t\t\tsStream.Format(\"q 1 0 0 1 0 0 cm /%s Do Q\", (FX_LPCSTR)key);\n\t\t\tpNewContents->SetData((FX_LPCBYTE)sStream, sStream.GetLength(), FALSE, FALSE);\n\t\t}\n\t\treturn;\n\t}\n\n\tint iType = pContentsObj->GetType();\n\tCPDF_Array* pContentsArray = NULL;\n\t\n\tswitch(iType)\n\t{\n\tcase PDFOBJ_STREAM:\n\t\t{\n\t\t\tpContentsArray = FX_NEW CPDF_Array;\n\t\t\tCPDF_Stream* pContents = (CPDF_Stream*)pContentsObj;\n\t\t\tFX_DWORD dwObjNum = pDocument->AddIndirectObject(pContents);\n\t\t\tCPDF_StreamAcc acc;\n\t\t\tacc.LoadAllData(pContents);\n\t\t\tCFX_ByteString sStream = \"q\\n\";\n\t\t\tCFX_ByteString sBody = CFX_ByteString((FX_LPCSTR)acc.GetData(), acc.GetSize());\n\t\t\tsStream = sStream + sBody + \"\\nQ\";\n\t\t\tpContents->SetData((FX_LPCBYTE)sStream, sStream.GetLength(), FALSE, FALSE);\n\t\t\tpContentsArray->AddReference(pDocument, dwObjNum);\n\t\t\tbreak;\n\t\t}\n\t\t\n\tcase PDFOBJ_ARRAY:\n\t\t{\n\t\t\tpContentsArray = (CPDF_Array*)pContentsObj;\n\t\t\tbreak;\n\t\t}\n\tdefault:\n\t\tbreak;\n\t}\t\n\t\n\tif (!pContentsArray)return;\n\t\n\tFX_DWORD dwObjNum = pDocument->AddIndirectObject(pContentsArray);\n\tpPage->SetAtReference(\"Contents\", pDocument, dwObjNum);\n\t\n\tif (!key.IsEmpty())\n\t{\n\t\tCPDF_Stream* pNewContents = FX_NEW CPDF_Stream(NULL, 0, FX_NEW CPDF_Dictionary);\n\t\tdwObjNum = pDocument->AddIndirectObject(pNewContents);\n\t\tpContentsArray->AddReference(pDocument, dwObjNum);\n\t\t\n\t\tCFX_ByteString sStream;\n\t\tsStream.Format(\"q 1 0 0 1 0 0 cm /%s Do Q\", (FX_LPCSTR)key);\n\t\tpNewContents->SetData((FX_LPCBYTE)sStream, sStream.GetLength(), FALSE, FALSE);\n\t}\n}\n \nCFX_AffineMatrix GetMatrix(CPDF_Rect rcAnnot, CPDF_Rect rcStream, CFX_AffineMatrix matrix)\n{\n\tif(rcStream.IsEmpty())\n\t\treturn CFX_AffineMatrix();\n\t\n\tmatrix.TransformRect(rcStream);\n\trcStream.Normalize();\n\t\n\tFX_FLOAT a = rcAnnot.Width()/rcStream.Width();\n\tFX_FLOAT d = rcAnnot.Height()/rcStream.Height();\n\t\n\tFX_FLOAT e = rcAnnot.left - rcStream.left * a;\n\tFX_FLOAT f = rcAnnot.bottom - rcStream.bottom * d;\n\treturn CFX_AffineMatrix(a, 0, 0, d, e, f);\n}\n\nvoid GetOffset(FX_FLOAT& fa, FX_FLOAT& fd, FX_FLOAT& fe, FX_FLOAT& ff, CPDF_Rect rcAnnot, CPDF_Rect rcStream, CFX_AffineMatrix matrix)\n{\n\tFX_FLOAT fStreamWidth = 0.0f;\n\tFX_FLOAT fStreamHeight = 0.0f;\n\n\n\t\n\tif (matrix.a != 0 && matrix.d != 0)\n\t{\n\t\tfStreamWidth = rcStream.right - rcStream.left;\n\t\tfStreamHeight = rcStream.top - rcStream.bottom;\n\t}\n\telse\n\t{\n\t\tfStreamWidth = rcStream.top - rcStream.bottom;\n\t\tfStreamHeight = rcStream.right - rcStream.left;\n\t}\n\t\n\tFX_FLOAT x1 = matrix.a * rcStream.left + matrix.c * rcStream.bottom + matrix.e;\n\tFX_FLOAT y1 = matrix.b * rcStream.left + matrix.d * rcStream.bottom + matrix.f;\n\tFX_FLOAT x2 = matrix.a * rcStream.left + matrix.c * rcStream.top + matrix.e;\n\tFX_FLOAT y2 = matrix.b * rcStream.left + matrix.d * rcStream.top + matrix.f;\n\tFX_FLOAT x3 = matrix.a * rcStream.right + matrix.c * rcStream.bottom + matrix.e;\n\tFX_FLOAT y3 = matrix.b * rcStream.right + matrix.d * rcStream.bottom + matrix.f;\n\tFX_FLOAT x4 = matrix.a * rcStream.right + matrix.c * rcStream.top + matrix.e;\n\tFX_FLOAT y4 = matrix.b * rcStream.right + matrix.d * rcStream.top + matrix.f;\n\t\n\tFX_FLOAT left = FX_MIN(FX_MIN(x1, x2), FX_MIN(x3, x4));\n\tFX_FLOAT bottom = FX_MIN(FX_MIN(y1, y2), FX_MIN(y3, y4));\n\t\n\tfa = (rcAnnot.right - rcAnnot.left)/fStreamWidth;\n\tfd = (rcAnnot.top - rcAnnot.bottom)/fStreamHeight;\n\tfe = rcAnnot.left - left * fa;\n\tff = rcAnnot.bottom - bottom * fd;\n}\n\n\nDLLEXPORT int STDCALL FPDFPage_Flatten( FPDF_PAGE page, int nFlag)\n{\n\tif (!page)\n\t{\n\t\treturn FLATTEN_FAIL;\n\t}\n\n\tCPDF_Page * pPage = (CPDF_Page*)( page );\n\tCPDF_Document * pDocument = pPage->m_pDocument;\n\tCPDF_Dictionary * pPageDict = pPage->m_pFormDict;\n\t\n\tif ( !pDocument || !pPageDict )\n\t{\n\t\treturn FLATTEN_FAIL;\n\t}\n\n\tCPDF_ObjectArray ObjectArray;\n\tCPDF_RectArray  RectArray;\n\n\tint iRet = FLATTEN_FAIL;\n\tiRet = ParserAnnots( pDocument, pPageDict, &RectArray, &ObjectArray, nFlag);\n\tif (iRet == FLATTEN_NOTINGTODO)\n\t{\n\t\treturn FLATTEN_NOTINGTODO;\n\t}else if (iRet == FLATTEN_FAIL)\n\t{\n\t\treturn FLATTEN_FAIL;\n\t}\n\t\n\tCPDF_Rect rcOriginalCB;\n\tCPDF_Rect rcMerger = CalculateRect( &RectArray );\n\tCPDF_Rect rcOriginalMB = pPageDict->GetRect(\"MediaBox\");\n\n\tif (pPageDict->KeyExist(\"CropBox\"))\n\t\trcOriginalMB = pPageDict->GetRect(\"CropBox\");\n\t\n\tif (rcOriginalMB.IsEmpty()) \t\n\t{\n\t\trcOriginalMB = CPDF_Rect(0.0f, 0.0f, 612.0f, 792.0f);\n\t}\n\t\n\trcMerger.left = rcMerger.left < rcOriginalMB.left? rcOriginalMB.left : rcMerger.left;\n\trcMerger.right = rcMerger.right > rcOriginalMB.right? rcOriginalMB.right : rcMerger.right;\n\trcMerger.top = rcMerger.top > rcOriginalMB.top? rcOriginalMB.top : rcMerger.top;\n\trcMerger.bottom = rcMerger.bottom < rcOriginalMB.bottom? rcOriginalMB.bottom : rcMerger.bottom;\n\t\n\tif (pPageDict->KeyExist(\"ArtBox\"))\n\t\trcOriginalCB = pPageDict->GetRect(\"ArtBox\");\n\telse\n\t\trcOriginalCB = rcOriginalMB;\n\n\tif (!rcOriginalMB.IsEmpty())\n\t{\n\t\tCPDF_Array* pMediaBox = FX_NEW CPDF_Array();\t\n\n\t\tpMediaBox->Add(FX_NEW CPDF_Number(rcOriginalMB.left));\n\t\tpMediaBox->Add(FX_NEW CPDF_Number(rcOriginalMB.bottom));\n\t\tpMediaBox->Add(FX_NEW CPDF_Number(rcOriginalMB.right));\n\t\tpMediaBox->Add(FX_NEW CPDF_Number(rcOriginalMB.top));\n\n\t\tpPageDict->SetAt(\"MediaBox\",pMediaBox);\n\t}\n\t\n\tif (!rcOriginalCB.IsEmpty())\n\t{\n\t\tCPDF_Array* pCropBox = FX_NEW CPDF_Array();\n\t\tpCropBox->Add(FX_NEW CPDF_Number(rcOriginalCB.left));\n\t\tpCropBox->Add(FX_NEW CPDF_Number(rcOriginalCB.bottom));\n\t\tpCropBox->Add(FX_NEW CPDF_Number(rcOriginalCB.right));\n\t\tpCropBox->Add(FX_NEW CPDF_Number(rcOriginalCB.top));\n\t\tpPageDict->SetAt(\"ArtBox\", pCropBox);\n\t}\n\n\tCPDF_Dictionary* pRes = NULL;\n\tpRes = pPageDict->GetDict(\"Resources\");\n\tif (!pRes)\n\t{\n\t\tpRes = FX_NEW CPDF_Dictionary;\n\t\tpPageDict->SetAt( \"Resources\", pRes );\n\t}\n\n\tCPDF_Stream* pNewXObject = FX_NEW CPDF_Stream(NULL, 0, FX_NEW CPDF_Dictionary);\n\tFX_DWORD dwObjNum = pDocument->AddIndirectObject(pNewXObject);\n\tCPDF_Dictionary* pPageXObject = pRes->GetDict(\"XObject\");\n\tif (!pPageXObject)\n\t{\n\t\tpPageXObject = FX_NEW CPDF_Dictionary;\n\t\tpRes->SetAt(\"XObject\", pPageXObject);\n\t}\n\n\tCFX_ByteString key = \"\";\n\tint nStreams = ObjectArray.GetSize();\n\n\tif (nStreams > 0)\n\t{\n\t\tfor (int iKey = 0; /*iKey < 100*/; iKey++)\n\t\t{\n\t\t\tchar sExtend[5] = {0};\n\t\t\tFXSYS_itoa(iKey, sExtend, 10);\n\t\t\tkey = CFX_ByteString(\"FFT\") + CFX_ByteString(sExtend);\n\n\t\t\tif (!pPageXObject->KeyExist(key))\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tSetPageContents(key, pPageDict, pDocument);\n\n\tCPDF_Dictionary* pNewXORes = NULL;\n\n\tif (!key.IsEmpty())\n\t{\n\t\tpPageXObject->SetAtReference(key, pDocument, dwObjNum);\n\t\tCPDF_Dictionary* pNewOXbjectDic = pNewXObject->GetDict();\n\t\tpNewXORes = FX_NEW CPDF_Dictionary;\n\t\tpNewOXbjectDic->SetAt(\"Resources\", pNewXORes);\n\t\tpNewOXbjectDic->SetAtName(\"Type\", \"XObject\");\n\t\tpNewOXbjectDic->SetAtName(\"Subtype\", \"Form\");\n\t\tpNewOXbjectDic->SetAtInteger(\"FormType\", 1);\n\t\tpNewOXbjectDic->SetAtName(\"Name\", \"FRM\");\n\t\tCPDF_Rect rcBBox = pPageDict->GetRect(\"ArtBox\"); \n\t\tpNewOXbjectDic->SetAtRect(\"BBox\", rcBBox);\n\t}\n\t\n\tfor (int i = 0; i < nStreams; i++)\n\t{\n\t\tCPDF_Dictionary* pAnnotDic = ObjectArray.GetAt(i);\n\t\tif (!pAnnotDic)continue;\n\n\t\tCPDF_Rect rcAnnot = pAnnotDic->GetRect(\"Rect\");\n\t\trcAnnot.Normalize();\n\n\t\tCFX_ByteString sAnnotState = pAnnotDic->GetString(\"AS\");\n\t\tCPDF_Dictionary* pAnnotAP = pAnnotDic->GetDict(\"AP\");\n\t\tif (!pAnnotAP)continue;\n\n\t\tCPDF_Stream* pAPStream = pAnnotAP->GetStream(\"N\");\n\t\tif (!pAPStream)\n\t\t{\n\t\t\tCPDF_Dictionary* pAPDic = pAnnotAP->GetDict(\"N\");\n\t\t\tif (!pAPDic)continue;\n\n\t\t\tif (!sAnnotState.IsEmpty())\n\t\t\t{\n\t\t\t\tpAPStream = pAPDic->GetStream(sAnnotState);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tFX_POSITION pos = pAPDic->GetStartPos();\n\t\t\t\tif (pos)\n\t\t\t\t{\n\t\t\t\t\tCFX_ByteString sKey;\n\t\t\t\t\tCPDF_Object* pFirstObj = pAPDic->GetNextElement(pos, sKey);\n\t\t\t\t\tif (pFirstObj)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pFirstObj->GetType() == PDFOBJ_REFERENCE)\n\t\t\t\t\t\t\tpFirstObj = pFirstObj->GetDirect();\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (pFirstObj->GetType() != PDFOBJ_STREAM)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tpAPStream = (CPDF_Stream*)pFirstObj;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!pAPStream)continue;\n\n\t\tCPDF_Dictionary* pAPDic = pAPStream->GetDict();\n\t\tCFX_AffineMatrix matrix = pAPDic->GetMatrix(\"Matrix\");\n\n\t\tCPDF_Rect rcStream;\n\t\tif (pAPDic->KeyExist(\"Rect\"))\n\t\t\trcStream = pAPDic->GetRect(\"Rect\");\n\t\telse if (pAPDic->KeyExist(\"BBox\"))\n\t\t\trcStream = pAPDic->GetRect(\"BBox\");\n\n\t\tif (rcStream.IsEmpty())continue;\n\n\t\tCPDF_Object* pObj = pAPStream;\n\n\t\tif (pObj)\n\t\t{\t\t\n\t\t\tCPDF_Dictionary* pObjDic = pObj->GetDict();\n\t\t\tif (pObjDic)\n\t\t\t{\n\t\t\t\tpObjDic->SetAtName(\"Type\", \"XObject\");\n\t\t\t\tpObjDic->SetAtName(\"Subtype\", \"Form\");\n\t\t\t}\n\t\t}\n\n\t\tCPDF_Dictionary* pXObject = pNewXORes->GetDict(\"XObject\");\n\t\tif (!pXObject)\n\t\t{\n\t\t\tpXObject = FX_NEW CPDF_Dictionary;\n\t\t\tpNewXORes->SetAt(\"XObject\", pXObject);\n\t\t}\n\n\t\tCFX_ByteString sFormName;\n\t\tsFormName.Format(\"F%d\", i);\n\t\tFX_DWORD dwObjNum = pDocument->AddIndirectObject(pObj);\n\t\tpXObject->SetAtReference(sFormName, pDocument, dwObjNum);\n\n\t\tCPDF_StreamAcc acc;\n\t\tacc.LoadAllData(pNewXObject);\n\n\t\tFX_LPCBYTE pData = acc.GetData();\n\t\tCFX_ByteString sStream(pData, acc.GetSize());\n\t\tCFX_ByteString sTemp;\n\n\t\tif (matrix.IsIdentity())\n\t\t{\n\t\t\tmatrix.a = 1.0f;\n\t\t\tmatrix.b = 0.0f;\n\t\t\tmatrix.c = 0.0f;\n\t\t\tmatrix.d = 1.0f;\n\t\t\tmatrix.e = 0.0f;\n\t\t\tmatrix.f = 0.0f;\n\t\t}\n\n\t\tCFX_AffineMatrix m = GetMatrix(rcAnnot, rcStream, matrix);\n\t\tsTemp.Format(\"q %f 0 0 %f %f %f cm /%s Do Q\\n\", m.a, m.d, m.e, m.f, (FX_LPCSTR)sFormName);\n\t\tsStream += sTemp;\n\n\t\tpNewXObject->SetData((FX_LPCBYTE)sStream, sStream.GetLength(), FALSE, FALSE);\n\t}\n\tpPageDict->RemoveAt( \"Annots\" );\n\n\tObjectArray.RemoveAll();\n\tRectArray.RemoveAll();\n\n\treturn FLATTEN_SUCCESS;\n}\n"
  },
  {
    "path": "fpdfsdk/src/fpdf_progressive.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../include/fpdf_progressive.h\"\n#include \"../include/fsdk_define.h\"\n#include \"../include/fpdfview.h\"\n#include \"../include/fsdk_rendercontext.h\"\n\nextern void (*Func_RenderPage)( CRenderContext*, FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,\n\t\t\t\t\t\tint rotate, int flags,FX_BOOL bNeedToRestore, IFSDK_PAUSE_Adapter * pause );\n\nextern void DropContext(void* data);\n\nDLLEXPORT int STDCALL FPDF_RenderPageBitmap_Start( FPDF_BITMAP bitmap, FPDF_PAGE page, \n\t\t\t\t\t\t\t\t\t\t\t\t\tint start_x, int start_y, int size_x,\n\t\t\t\t\t\t\t\t\t\t\t\t    int size_y, int rotate, int flags,\n\t\t\t\t\t\t\t\t\t\t\t\t\tIFSDK_PAUSE * pause )\n{\n\tif (bitmap == NULL || page == NULL)\n\t\treturn FPDF_RENDER_FAILED;\n\n \tif (!pause)\n \t\treturn FPDF_RENDER_FAILED;\n\n\tif (pause->version !=1)\n\t\treturn FPDF_RENDER_FAILED;\n\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\t\n//\tFXMT_CSLOCK_OBJ(&pPage->m_PageLock);\n\t\n\tCRenderContext* pContext = FX_NEW CRenderContext;\n\tpPage->SetPrivateData((void*)1, pContext, DropContext );\n#ifdef _SKIA_SUPPORT_\n\tpContext->m_pDevice = FX_NEW CFX_SkiaDevice;\n\tif (flags & FPDF_REVERSE_BYTE_ORDER)\n\t\t((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap,0,TRUE);\n\telse\n\t\t((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap);\n#else\n\tpContext->m_pDevice = FX_NEW CFX_FxgeDevice;\n\tif (flags & FPDF_REVERSE_BYTE_ORDER)\n\t\t((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap,0,TRUE);\n\telse\n\t\t((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap);\n#endif\n\tIFSDK_PAUSE_Adapter IPauseAdapter(pause);\n\t\n\tif (flags & FPDF_NO_CATCH)\n\t\tFunc_RenderPage(pContext, page, start_x, start_y, size_x, size_y, rotate, flags,FALSE, &IPauseAdapter);\n\telse {\n\t\ttry {\n\t\t\tFunc_RenderPage(pContext, page, start_x, start_y, size_x, size_y, rotate, flags,FALSE, &IPauseAdapter);\n\t\t\t}\n\t\tcatch (...){}\n\t}\n\n\tif ( pContext->m_pRenderer )\n\t{\n\t\tCPDF_ProgressiveRenderer::RenderStatus status = CPDF_ProgressiveRenderer::Failed;\n\t\tstatus = pContext->m_pRenderer->GetStatus();\n\t\treturn status;\n\t}\n\treturn FPDF_RENDER_FAILED;\n}\n\nDLLEXPORT int STDCALL FPDF_RenderPage_Continue(FPDF_PAGE page,IFSDK_PAUSE * pause)\n{\n\tif (page == NULL)\n\t\treturn FPDF_RENDER_FAILED;\n\n \tif (!pause)\n\t\treturn FPDF_RENDER_FAILED;\n\t\n\tif (pause->version !=1)\n\t\treturn FPDF_RENDER_FAILED;\n\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\n//\tFXMT_CSLOCK_OBJ(&pPage->m_PageLock);\n\n\tCRenderContext * pContext = (CRenderContext*)pPage->GetPrivateData((void*)1);\n\tif (pContext && pContext->m_pRenderer)\n\t{\n\t\tIFSDK_PAUSE_Adapter IPauseAdapter(pause);\n\t\tpContext->m_pRenderer->Continue(&IPauseAdapter);\n\n\t\tCPDF_ProgressiveRenderer::RenderStatus status = CPDF_ProgressiveRenderer::Failed;\n\t\tstatus = pContext->m_pRenderer->GetStatus();\n\t\treturn status;\n\t}\n\treturn FPDF_RENDER_FAILED;\n}\n\n\nDLLEXPORT void STDCALL FPDF_RenderPage_Close(FPDF_PAGE page)\n{\n\tif (page == NULL) return;\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\n//\tFXMT_CSLOCK_OBJ(&pPage->m_PageLock);\n\n\tCRenderContext * pContext = (CRenderContext*)pPage->GetPrivateData((void*)1);\n\tif (pContext)\n\t{\n\t\tpContext->m_pDevice->RestoreState();\n\t\tdelete pContext;\n\t\tpPage->RemovePrivateData((void*)1);\n\t}\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/fpdf_searchex.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../include/fsdk_define.h\"\n#include \"../include/fpdf_searchex.h\"\n\n\nDLLEXPORT int STDCALL  FPDFText_GetCharIndexFromTextIndex(FPDF_TEXTPAGE text_page, int nTextIndex)\n{\n\tif(!text_page) return -1;\n\treturn ((IPDF_TextPage*)text_page)->CharIndexFromTextIndex(nTextIndex);\n}\n"
  },
  {
    "path": "fpdfsdk/src/fpdf_sysfontinfo.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../include/fsdk_define.h\"\n#include \"../include/fpdf_sysfontinfo.h\"\n\nclass CSysFontInfo_Ext FX_FINAL : public IFX_SystemFontInfo\n{\npublic:\n\tFPDF_SYSFONTINFO*\tm_pInfo;\n\n\tvirtual void\t\tRelease()\n\t{\n\t\tif (m_pInfo->Release)\n\t\t\tm_pInfo->Release(m_pInfo);\n\t\tdelete this;\n\t}\n\n\tvirtual\tFX_BOOL\t\tEnumFontList(CFX_FontMapper* pMapper)\n\t{\n\t\tif (m_pInfo->EnumFonts) {\n\t\t\tm_pInfo->EnumFonts(m_pInfo, pMapper);\n\t\t\treturn TRUE;\n\t\t}\n\t\treturn FALSE;\n\t}\n\n\tvirtual void*\t\tMapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL& bExact)\n\t{\n\t\tif (m_pInfo->MapFont)\n\t\t\treturn m_pInfo->MapFont(m_pInfo, weight, bItalic, charset, pitch_family, family, &bExact);\n\t\treturn NULL;\n\t}\n\n\tvirtual void*\t\tGetFont(FX_LPCSTR family)\n\t{\n\t\tif (m_pInfo->GetFont)\n\t\t\treturn m_pInfo->GetFont(m_pInfo, family);\n\t\treturn NULL;\n\t}\n\n\tvirtual FX_DWORD\tGetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size)\n\t{\n\t\tif (m_pInfo->GetFontData)\n\t\t\treturn m_pInfo->GetFontData(m_pInfo, hFont, table, buffer, size);\n\t\treturn 0;\n\t}\n\n\tvirtual FX_BOOL\t\tGetFaceName(void* hFont, CFX_ByteString& name)\n\t{\n\t\tif (m_pInfo->GetFaceName == NULL) return FALSE;\n\t\tFX_DWORD size = m_pInfo->GetFaceName(m_pInfo, hFont, NULL, 0);\n\t\tif (size == 0) return FALSE;\n\t\tchar* buffer = FX_Alloc(char, size);\n\t\tsize = m_pInfo->GetFaceName(m_pInfo, hFont, buffer, size);\n\t\tname = CFX_ByteString(buffer, size);\n\t\tFX_Free(buffer);\n\t\treturn TRUE;\n\t}\n\n\tvirtual FX_BOOL\t\tGetFontCharset(void* hFont, int& charset)\n\t{\n\t\tif (m_pInfo->GetFontCharset) {\n\t\t\tcharset = m_pInfo->GetFontCharset(m_pInfo, hFont);\n\t\t\treturn TRUE;\n\t\t}\n\t\treturn FALSE;\n\t}\n\n\tvirtual void\t\tDeleteFont(void* hFont)\n\t{\n\t\tif (m_pInfo->DeleteFont)\n\t\t\tm_pInfo->DeleteFont(m_pInfo, hFont);\n\t}\n};\n\nDLLEXPORT void STDCALL FPDF_AddInstalledFont(void* mapper, const char* name, int charset)\n{\n\t((CFX_FontMapper*)mapper)->AddInstalledFont(name, charset);\n}\n\nDLLEXPORT void STDCALL FPDF_SetSystemFontInfo(FPDF_SYSFONTINFO* pFontInfoExt)\n{\n\tif (pFontInfoExt->version != 1) return;\n\n\tCSysFontInfo_Ext* pFontInfo = FX_NEW CSysFontInfo_Ext;\n\tpFontInfo->m_pInfo = pFontInfoExt;\n\tCFX_GEModule::Get()->GetFontMgr()->SetSystemFontInfo(pFontInfo);\n}\n\nstruct FPDF_SYSFONTINFO_DEFAULT : public FPDF_SYSFONTINFO\n{\n\tIFX_SystemFontInfo*\tm_pFontInfo;\n};\n\nstatic void DefaultRelease(struct _FPDF_SYSFONTINFO* pThis)\n{\n\t((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->Release();\n}\n\nstatic void DefaultEnumFonts(struct _FPDF_SYSFONTINFO* pThis, void* pMapper)\n{\n\t((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->EnumFontList((CFX_FontMapper*)pMapper);\n}\n\nstatic void* DefaultMapFont(struct _FPDF_SYSFONTINFO* pThis, int weight, int bItalic, int charset, int pitch_family, const char* family, int* bExact)\n{\n\treturn ((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->MapFont(weight, bItalic, charset, pitch_family, family, *bExact);\n}\n\nvoid* DefaultGetFont(struct _FPDF_SYSFONTINFO* pThis, const char* family)\n{\n\treturn ((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->GetFont(family);\n}\n\nstatic unsigned long DefaultGetFontData(struct _FPDF_SYSFONTINFO* pThis, void* hFont,\n\t\t\tunsigned int table, unsigned char* buffer, unsigned long buf_size)\n{\n\treturn ((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->GetFontData(hFont, table, buffer, buf_size);\n}\n\nstatic unsigned long DefaultGetFaceName(struct _FPDF_SYSFONTINFO* pThis, void* hFont, char* buffer, unsigned long buf_size)\n{\n\tCFX_ByteString name;\n\tif (!((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->GetFaceName(hFont, name)) return 0;\n\tif (name.GetLength() >= (long)buf_size) return name.GetLength() + 1;\n\tFXSYS_strcpy(buffer, name);\n\treturn name.GetLength() + 1;\n}\n\nstatic int DefaultGetFontCharset(struct _FPDF_SYSFONTINFO* pThis, void* hFont)\n{\n\tint charset;\n\tif (!((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->GetFontCharset(hFont, charset)) return 0;\n\treturn charset;\n}\n\nstatic void DefaultDeleteFont(struct _FPDF_SYSFONTINFO* pThis, void* hFont)\n{\n\t((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->DeleteFont(hFont);\n}\n\nDLLEXPORT FPDF_SYSFONTINFO* STDCALL FPDF_GetDefaultSystemFontInfo()\n{\n\tIFX_SystemFontInfo* pFontInfo = IFX_SystemFontInfo::CreateDefault();\n\tif (pFontInfo == NULL) return NULL;\n\n\tFPDF_SYSFONTINFO_DEFAULT* pFontInfoExt = FX_Alloc(FPDF_SYSFONTINFO_DEFAULT, 1);\n\tpFontInfoExt->DeleteFont = DefaultDeleteFont;\n\tpFontInfoExt->EnumFonts = DefaultEnumFonts;\n\tpFontInfoExt->GetFaceName = DefaultGetFaceName;\n\tpFontInfoExt->GetFont = DefaultGetFont;\n\tpFontInfoExt->GetFontCharset = DefaultGetFontCharset;\n\tpFontInfoExt->GetFontData = DefaultGetFontData;\n\tpFontInfoExt->MapFont = DefaultMapFont;\n\tpFontInfoExt->Release = DefaultRelease;\n\tpFontInfoExt->version = 1;\n\tpFontInfoExt->m_pFontInfo = pFontInfo;\n\treturn pFontInfoExt;\n}\n"
  },
  {
    "path": "fpdfsdk/src/fpdf_transformpage.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../include/fsdk_define.h\"\n#include \"../include/fpdf_transformpage.h\"\n\nDLLEXPORT void STDCALL FPDFPage_SetMediaBox(FPDF_PAGE page, float left, float bottom, float right, float top)\n{\n\tif(!page)\n\t\treturn;\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\tCPDF_Dictionary* pPageDict = pPage->m_pFormDict;\n\tCPDF_Array* pMediaBoxArray = FX_NEW CPDF_Array;\n\tpMediaBoxArray->Add(FX_NEW CPDF_Number(left));\n\tpMediaBoxArray->Add(FX_NEW CPDF_Number(bottom));\n\tpMediaBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(right)));\n\tpMediaBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(top)));\n\t\n\tpPageDict->SetAt(\"MediaBox\", pMediaBoxArray);\n}\n\n\nDLLEXPORT void STDCALL FPDFPage_SetCropBox(FPDF_PAGE page, float left, float bottom, float right, float top)\n{\n\tif(!page)\n\t\treturn;\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\tCPDF_Dictionary* pPageDict = pPage->m_pFormDict;\n\tCPDF_Array* pCropBoxArray = FX_NEW CPDF_Array;\n\tpCropBoxArray->Add(FX_NEW CPDF_Number(left));\n\tpCropBoxArray->Add(FX_NEW CPDF_Number(bottom));\n\tpCropBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(right)));\n\tpCropBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(top)));\n\t\n\t\n\tpPageDict->SetAt(\"CropBox\", pCropBoxArray);\n}\n\n\nDLLEXPORT FX_BOOL STDCALL FPDFPage_GetMediaBox(FPDF_PAGE page, float* left, float* bottom, float* right, float* top)\n{\n\tif(!page)\n\t\treturn FALSE;\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\tCPDF_Dictionary* pPageDict = pPage->m_pFormDict;\n\tCPDF_Array* pArray = pPageDict->GetArray(\"MediaBox\");\n\tif(pArray)\n\t{\n\t\t*left = pArray->GetFloat(0);\n\t\t*bottom = pArray->GetFloat(1);\n\t\t*right = pArray->GetFloat(2);\n\t\t*top = pArray->GetFloat(3);\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}\n\nDLLEXPORT FPDF_BOOL STDCALL FPDFPage_GetCropBox(FPDF_PAGE page, float* left, float* bottom, float* right, float* top)\n{\n\tif(!page)\n\t\treturn FALSE;\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\tCPDF_Dictionary* pPageDict = pPage->m_pFormDict;\n\tCPDF_Array* pArray = pPageDict->GetArray(\"CropBox\");\n\tif(pArray)\n\t{\n\t\t*left = pArray->GetFloat(0);\n\t\t*bottom = pArray->GetFloat(1);\n\t\t*right = pArray->GetFloat(2);\n\t\t*top = pArray->GetFloat(3);\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}\n\nDLLEXPORT FPDF_BOOL STDCALL FPDFPage_TransFormWithClip(FPDF_PAGE page, FS_MATRIX* matrix, FS_RECTF* clipRect)\n{\n\tif(!page)\n\t\treturn FALSE;\n\n\tCFX_ByteTextBuf textBuf;\n\ttextBuf<<\"q \";\n\tCFX_FloatRect rect(clipRect->left, clipRect->bottom, clipRect->right, clipRect->top);\n\trect.Normalize();\n\tCFX_ByteString bsClipping;\n\tbsClipping.Format(\"%f %f %f %f re W* n \", rect.left, rect.bottom, rect.Width(), rect.Height());\n\ttextBuf<<bsClipping;\n\n\tCFX_ByteString bsMatix;\n\tbsMatix.Format(\"%f %f %f %f %f %f cm \", matrix->a, matrix->b,matrix->c,matrix->d,matrix->e,matrix->f);\n\ttextBuf<<bsMatix;\n\t\n\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\tCPDF_Dictionary* pPageDic = pPage->m_pFormDict;\n\tCPDF_Object* pContentObj = pPageDic ? pPageDic->GetElement(\"Contents\") : NULL;\n\tif(!pContentObj)\n\t\tpContentObj = pPageDic ? pPageDic->GetArray(\"Contents\") : NULL;\n\tif(!pContentObj)\n\t\treturn FALSE;\n\t\n\tCPDF_Dictionary* pDic = FX_NEW CPDF_Dictionary;\n\tCPDF_Stream* pStream = FX_NEW CPDF_Stream(NULL,0, pDic);\n\tpStream->SetData(textBuf.GetBuffer(), textBuf.GetSize(), FALSE, FALSE);\n\tCPDF_Document* pDoc = pPage->m_pDocument;\n\tif(!pDoc)\n\t\treturn FALSE;\n\tpDoc->AddIndirectObject(pStream);\n\n\tpDic = FX_NEW CPDF_Dictionary;\n\tCPDF_Stream* pEndStream = FX_NEW CPDF_Stream(NULL,0, pDic);\n\tpEndStream->SetData((FX_LPCBYTE)\" Q\", 2, FALSE, FALSE);\n\tpDoc->AddIndirectObject(pEndStream);\n\t\n\tCPDF_Array* pContentArray = NULL;\n\tif (pContentObj && pContentObj->GetType() == PDFOBJ_ARRAY)\n\t{\n\t\tpContentArray = (CPDF_Array*)pContentObj;\n\t\tCPDF_Reference* pRef = FX_NEW CPDF_Reference(pDoc, pStream->GetObjNum());\n\t\tpContentArray->InsertAt(0, pRef);\n\t\tpContentArray->AddReference(pDoc,pEndStream);\n\t\t\n\t}\n\telse if(pContentObj && pContentObj->GetType() == PDFOBJ_REFERENCE)\n\t{\n\t\tCPDF_Reference* pReference = (CPDF_Reference*)pContentObj;\n\t\tCPDF_Object* pDirectObj = pReference->GetDirect();\n\t\tif(pDirectObj != NULL)\n\t\t{\n\t\t\tif(pDirectObj->GetType() == PDFOBJ_ARRAY)\n\t\t\t{\n\t\t\t\tpContentArray = (CPDF_Array*)pDirectObj;\n\t\t\t\tCPDF_Reference* pRef = FX_NEW CPDF_Reference(pDoc, pStream->GetObjNum());\n\t\t\t\tpContentArray->InsertAt(0, pRef);\n\t\t\t\tpContentArray->AddReference(pDoc,pEndStream);\n\t\t\t\t\n\t\t\t}\n\t\t\telse if(pDirectObj->GetType() == PDFOBJ_STREAM)\n\t\t\t{\n\t\t\t\tpContentArray = FX_NEW CPDF_Array();\n\t\t\t\tpContentArray->AddReference(pDoc,pStream->GetObjNum());\n\t\t\t\tpContentArray->AddReference(pDoc,pDirectObj->GetObjNum());\n\t\t\t\tpContentArray->AddReference(pDoc, pEndStream);\n\t\t\t\tpPageDic->SetAtReference(\"Contents\", pDoc, pDoc->AddIndirectObject(pContentArray));\n\t\t\t}\n\t\t}\n\t}\t\n\n\t//Need to transform the patterns as well.\n\tCPDF_Dictionary* pRes = pPageDic->GetDict(FX_BSTRC(\"Resources\"));\n\tif(pRes)\n\t{\n\t\tCPDF_Dictionary* pPattenDict = pRes->GetDict(FX_BSTRC(\"Pattern\"));\n\t\tif(pPattenDict)\n\t\t{\n\t\t\tFX_POSITION pos = pPattenDict->GetStartPos();\n\t\t\twhile(pos)\n\t\t\t{\n\t\t\t\tCPDF_Dictionary* pDict = NULL;\n\t\t\t\tCFX_ByteString key;\n\t\t\t\tCPDF_Object* pObj = pPattenDict->GetNextElement(pos, key);\n\t\t\t\tif(pObj->GetType() == PDFOBJ_REFERENCE)\n\t\t\t\t\tpObj = pObj->GetDirect();\n\t\t\t\tif(pObj->GetType() == PDFOBJ_DICTIONARY)\n\t\t\t\t{\n\t\t\t\t\tpDict = (CPDF_Dictionary*)pObj;\n\t\t\t\t}\n\t\t\t\telse if(pObj->GetType() == PDFOBJ_STREAM)\n\t\t\t\t{\n\t\t\t\t\tpDict = ((CPDF_Stream*)pObj)->GetDict();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tcontinue;\n\t\t\t\t\n\t\t\t\tCFX_AffineMatrix m = pDict->GetMatrix(FX_BSTRC(\"Matrix\"));\n\t\t\t\tCFX_AffineMatrix t = *(CFX_AffineMatrix*)matrix;\n\t\t\t\tm.Concat(t);\n\t\t\t\tpDict->SetAtMatrix(FX_BSTRC(\"Matrix\"), m);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn TRUE;\n}\n\nDLLEXPORT void STDCALL FPDFPageObj_TransformClipPath(FPDF_PAGEOBJECT page_object,double a, double b, double c, double d, double e, double f)\n{\n\tCPDF_PageObject* pPageObj = (CPDF_PageObject*)page_object;\n\tif(pPageObj == NULL)\n\t\treturn;\n\tCFX_AffineMatrix matrix((FX_FLOAT)a,(FX_FLOAT)b,(FX_FLOAT)c,(FX_FLOAT)d,(FX_FLOAT)e,(FX_FLOAT)f);\n\t\n\t//Special treatment to shading object, because the ClipPath for shading object is already transformed.\n\tif(pPageObj->m_Type != PDFPAGE_SHADING)\n\t\tpPageObj->TransformClipPath(matrix);\n\tpPageObj->TransformGeneralState(matrix);\n}\n\n\nDLLEXPORT FPDF_CLIPPATH STDCALL FPDF_CreateClipPath(float left, float bottom, float right, float top)\n{\n\tCPDF_ClipPath* pNewClipPath =  FX_NEW CPDF_ClipPath();\n\tpNewClipPath->GetModify();\n\tCPDF_Path Path;\n\tPath.GetModify();\n\tPath.AppendRect(left, bottom, right, top);\n\tpNewClipPath->AppendPath(Path, FXFILL_ALTERNATE, FALSE);\n\treturn pNewClipPath;\n}\n\nDLLEXPORT void STDCALL FPDF_DestroyClipPath(FPDF_CLIPPATH clipPath)\n{\n\tif(clipPath)\n\t\tdelete (CPDF_ClipPath*)clipPath;\n}\n\nvoid OutputPath(CFX_ByteTextBuf& buf, CPDF_Path path)\n{\n\tconst CFX_PathData* pPathData = path;\n\tif (pPathData == NULL) return;\n\t\n\tFX_PATHPOINT* pPoints = pPathData->GetPoints();\n\t\n\tif (path.IsRect()) {\n\t\tbuf << (pPoints[0].m_PointX) << \" \" << (pPoints[0].m_PointY) << \" \" \n\t\t\t<< (pPoints[2].m_PointX - pPoints[0].m_PointX) << \" \" \n\t\t\t<< (pPoints[2].m_PointY - pPoints[0].m_PointY) << \" re\\n\";\n\t\treturn;\n\t}\n\t\n\tCFX_ByteString temp;\n\tfor (int i = 0; i < pPathData->GetPointCount(); i ++) {\n\t\tbuf << (pPoints[i].m_PointX) << \" \" << (pPoints[i].m_PointY);\n\t\tint point_type = pPoints[i].m_Flag & FXPT_TYPE;\n\t\tif (point_type == FXPT_MOVETO)\n\t\t\tbuf << \" m\\n\";\n\t\telse if (point_type == FXPT_BEZIERTO) {\n\t\t\tbuf << \" \" << (pPoints[i+1].m_PointX) << \" \" << (pPoints[i+1].m_PointY) << \" \" << \n\t\t\t\t(pPoints[i+2].m_PointX) << \" \" << (pPoints[i+2].m_PointY);\n\t\t\tif (pPoints[i+2].m_Flag & FXPT_CLOSEFIGURE)\n\t\t\t\tbuf << \" c h\\n\";\n\t\t\telse\n\t\t\t\tbuf << \" c\\n\";\n\t\t\ti += 2;\n\t\t} else if (point_type == FXPT_LINETO) {\n\t\t\tif (pPoints[i].m_Flag & FXPT_CLOSEFIGURE)\n\t\t\t\tbuf << \" l h\\n\";\n\t\t\telse\n\t\t\t\tbuf << \" l\\n\";\n\t\t}\n\t}\n}\n\nDLLEXPORT void STDCALL FPDFPage_InsertClipPath(FPDF_PAGE page,FPDF_CLIPPATH clipPath)\n{\n\tif(!page)\n\t\treturn;\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\tCPDF_Dictionary* pPageDic = pPage->m_pFormDict;\n\tCPDF_Object* pContentObj = pPageDic ? pPageDic->GetElement(\"Contents\") : NULL;\n\tif(!pContentObj)\n\t\tpContentObj = pPageDic ? pPageDic->GetArray(\"Contents\") : NULL;\n\tif(!pContentObj)\n\t\treturn;\n\n\tCFX_ByteTextBuf strClip;\n\tCPDF_ClipPath* pClipPath = (CPDF_ClipPath*)clipPath;\n\tFX_DWORD i;\n\tfor (i = 0; i < pClipPath->GetPathCount(); i ++) {\n\t\tCPDF_Path path = pClipPath->GetPath(i);\n\t\tint iClipType = pClipPath->GetClipType(i);\n\t\tif (path.GetPointCount() == 0) {\n\t\t\t// Empty clipping (totally clipped out)\n\t\t\tstrClip << \"0 0 m W n \";\n\t\t} else {\n\t\t\tOutputPath(strClip, path);\n\t\t\tif (iClipType == FXFILL_WINDING)\n\t\t\t\tstrClip << \"W n\\n\";\n\t\t\telse\n\t\t\t\tstrClip << \"W* n\\n\";\n\t\t}\n\t}\n\tCPDF_Dictionary* pDic = FX_NEW CPDF_Dictionary;\n\tCPDF_Stream* pStream = FX_NEW CPDF_Stream(NULL,0, pDic);\n\tpStream->SetData(strClip.GetBuffer(), strClip.GetSize(), FALSE, FALSE);\n\tCPDF_Document* pDoc = pPage->m_pDocument;\n\tif(!pDoc)\n\t\treturn;\n\tpDoc->AddIndirectObject(pStream);\n\t\n\tCPDF_Array* pContentArray = NULL;\n\tif (pContentObj && pContentObj->GetType() == PDFOBJ_ARRAY)\n\t{\n\t\tpContentArray = (CPDF_Array*)pContentObj;\n\t\tCPDF_Reference* pRef = FX_NEW CPDF_Reference(pDoc, pStream->GetObjNum());\n\t\tpContentArray->InsertAt(0, pRef);\n\t\t\n\t}\n\telse if(pContentObj && pContentObj->GetType() == PDFOBJ_REFERENCE)\n\t{\n\t\tCPDF_Reference* pReference = (CPDF_Reference*)pContentObj;\n\t\tCPDF_Object* pDirectObj = pReference->GetDirect();\n\t\tif(pDirectObj != NULL)\n\t\t{\n\t\t\tif(pDirectObj->GetType() == PDFOBJ_ARRAY)\n\t\t\t{\n\t\t\t\tpContentArray = (CPDF_Array*)pDirectObj;\n\t\t\t\tCPDF_Reference* pRef = FX_NEW CPDF_Reference(pDoc, pStream->GetObjNum());\n\t\t\t\tpContentArray->InsertAt(0, pRef);\n\t\t\t\t\n\t\t\t}\n\t\t\telse if(pDirectObj->GetType() == PDFOBJ_STREAM)\n\t\t\t{\n\t\t\t\tpContentArray = FX_NEW CPDF_Array();\n\t\t\t\tpContentArray->AddReference(pDoc,pStream->GetObjNum());\n\t\t\t\tpContentArray->AddReference(pDoc,pDirectObj->GetObjNum());\n\t\t\t\tpPageDic->SetAtReference(\"Contents\", pDoc, pDoc->AddIndirectObject(pContentArray));\n\t\t\t}\n\t\t}\n\t}\t\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/fpdfdoc.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../include/fsdk_define.h\"\n#include \"../include/fpdfdoc.h\"\n\nstatic int this_module = 0;\n\nstatic CPDF_Bookmark FindBookmark(CPDF_BookmarkTree& tree, CPDF_Bookmark This, const CFX_WideString& title)\n{\n\tif (This != NULL) {\n\t\t// First check this item\n\t\tCFX_WideString this_title = This.GetTitle();\n\t\tif (this_title.CompareNoCase(title) == 0)\n\t\t\treturn This;\n\t}\n\t// go into children items\n\tCPDF_Bookmark Child = tree.GetFirstChild(This);\n\twhile (Child != NULL) {\n\t\t// check if this item\n\t\tCPDF_Bookmark Found = FindBookmark(tree, Child, title);\n\t\tif (Found) return Found;\n\t\tChild = tree.GetNextSibling(Child);\n\t}\n\treturn NULL;\n}\n\nDLLEXPORT FPDF_BOOKMARK STDCALL FPDFBookmark_Find(FPDF_DOCUMENT document, FPDF_WIDESTRING title)\n{\n\tif (document == NULL) return NULL;\n\tif (title == NULL || title[0] == 0) return NULL;\n\n\tCPDF_Document* pDoc = (CPDF_Document*)document;\n\tCPDF_BookmarkTree tree(pDoc);\n\n\tFX_STRSIZE len = CFX_WideString::WStringLength(title);\n\tCFX_WideString wstr = CFX_WideString::FromUTF16LE(title, len);\n\treturn FindBookmark(tree, NULL, wstr);\n}\n\nDLLEXPORT FPDF_DEST STDCALL FPDFBookmark_GetDest(FPDF_DOCUMENT document, FPDF_BOOKMARK bookmark)\n{\n\tif (document == NULL) return NULL;\n\tif (bookmark == NULL) return NULL;\n\n\tCPDF_Bookmark Bookmark = (CPDF_Dictionary*)bookmark;\n\tCPDF_Document* pDoc = (CPDF_Document*)document;\n\tCPDF_Dest dest = Bookmark.GetDest(pDoc);\n\tif (dest != NULL) return dest;\n\n\t// If this bookmark is not directly associated with a dest, we try to get action\n\tCPDF_Action Action = Bookmark.GetAction();\n\tif (Action == NULL) return NULL;\n\treturn Action.GetDest(pDoc);\n}\n\nDLLEXPORT FPDF_ACTION STDCALL FPDFBookmark_GetAction(FPDF_BOOKMARK bookmark)\n{\n\tif (bookmark == NULL) return NULL;\n\n\tCPDF_Bookmark Bookmark = (CPDF_Dictionary*)bookmark;\n\treturn Bookmark.GetAction();\n}\n\nDLLEXPORT unsigned long STDCALL FPDFAction_GetType(FPDF_ACTION action)\n{\n\tif (action == NULL) return 0;\n\n\tCPDF_Action Action = (CPDF_Dictionary*)action;\n\tCPDF_Action::ActionType type = Action.GetType();\n\tswitch (type) {\n\tcase CPDF_Action::GoTo:\n\t\treturn PDFACTION_GOTO;\n\tcase CPDF_Action::GoToR:\n\t\treturn PDFACTION_REMOTEGOTO;\n\tcase CPDF_Action::URI:\n\t\treturn PDFACTION_URI;\n\tcase CPDF_Action::Launch:\n\t\treturn PDFACTION_LAUNCH;\n\tdefault:\n\t\treturn PDFACTION_UNSUPPORTED;\n\t}\n\treturn PDFACTION_UNSUPPORTED;\n}\n\nDLLEXPORT FPDF_DEST STDCALL FPDFAction_GetDest(FPDF_DOCUMENT document, FPDF_ACTION action)\n{\n\tif (document == NULL) return NULL;\n\tif (action == NULL) return NULL;\n\tCPDF_Document* pDoc = (CPDF_Document*)document;\n\tCPDF_Action Action = (CPDF_Dictionary*)action;\n\n\treturn Action.GetDest(pDoc);\n}\n\nDLLEXPORT unsigned long STDCALL FPDFAction_GetURIPath(FPDF_DOCUMENT document, FPDF_ACTION action, \n\t\t\t\t\t\t\t\t\t\t\t  void* buffer, unsigned long buflen)\n{\n\tif (document == NULL) return 0;\n\tif (action == NULL) return 0;\n\tCPDF_Document* pDoc = (CPDF_Document*)document;\n\tCPDF_Action Action = (CPDF_Dictionary*)action;\n\n\tCFX_ByteString path = Action.GetURI(pDoc);\n\tunsigned long len = path.GetLength() + 1;\n\tif (buffer != NULL && buflen >= len)\n\t\tFXSYS_memcpy(buffer, (FX_LPCSTR)path, len);\n\treturn len;\n}\n\nDLLEXPORT unsigned long STDCALL FPDFDest_GetPageIndex(FPDF_DOCUMENT document, FPDF_DEST dest)\n{\n\tif (document == NULL) return 0;\n\tif (dest == NULL) return 0;\n\tCPDF_Document* pDoc = (CPDF_Document*)document;\n\tCPDF_Dest Dest = (CPDF_Array*)dest;\n\n\treturn Dest.GetPageIndex(pDoc);\n}\n\nstatic void ReleaseLinkList(FX_LPVOID data)\n{\n\tdelete (CPDF_LinkList*)data;\n}\n\nDLLEXPORT FPDF_LINK STDCALL FPDFLink_GetLinkAtPoint(FPDF_PAGE page, double x, double y)\n{\n\tif (page == NULL) return NULL;\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\n\t// Link list is stored with the document\n\tCPDF_Document* pDoc = pPage->m_pDocument;\n\tCPDF_LinkList* pLinkList = (CPDF_LinkList*)pDoc->GetPrivateData(&this_module);\n\tif (pLinkList == NULL) {\n\t\tpLinkList = FX_NEW CPDF_LinkList(pDoc);\n\t\tpDoc->SetPrivateData(&this_module, pLinkList, ReleaseLinkList);\n\t}\n\n\treturn pLinkList->GetLinkAtPoint(pPage, (FX_FLOAT)x, (FX_FLOAT)y);\n}\n\nDLLEXPORT FPDF_DEST STDCALL FPDFLink_GetDest(FPDF_DOCUMENT document, FPDF_LINK link)\n{\n\tif (document == NULL) return NULL;\n\tCPDF_Document* pDoc = (CPDF_Document*)document;\n\tif (link == NULL) return NULL;\n\tCPDF_Link Link = (CPDF_Dictionary*)link;\n\n\tFPDF_DEST dest = Link.GetDest(pDoc);\n\tif (dest) return dest;\n\n\t// If this link is not directly associated with a dest, we try to get action\n\tCPDF_Action Action = Link.GetAction();\n\tif (Action == NULL) return NULL;\n\treturn Action.GetDest(pDoc);\n}\n\nDLLEXPORT FPDF_ACTION STDCALL FPDFLink_GetAction(FPDF_LINK link)\n{\n\tif (link == NULL) return NULL;\n\tCPDF_Link Link = (CPDF_Dictionary*)link;\n\n\treturn Link.GetAction();\n}\n\nDLLEXPORT FPDF_BOOL STDCALL FPDFLink_Enumerate(FPDF_PAGE page, int* startPos, FPDF_LINK* linkAnnot)\n{\n\tif(!page || !startPos || !linkAnnot)\n\t\treturn FALSE;\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\tif(!pPage->m_pFormDict) return FALSE;\n\tCPDF_Array* pAnnots = pPage->m_pFormDict->GetArray(\"Annots\");\n\tif(!pAnnots) return FALSE;\n\tfor (int i = *startPos; i < (int)pAnnots->GetCount(); i ++) {\n\t\tCPDF_Dictionary* pDict = (CPDF_Dictionary*)pAnnots->GetElementValue(i);\n\t\tif (pDict == NULL || pDict->GetType() != PDFOBJ_DICTIONARY) continue;\n\t\tif(pDict->GetString(FX_BSTRC(\"Subtype\")).Equal(FX_BSTRC(\"Link\")))\n\t\t{\n\t\t\t*startPos = i+1;\n\t\t\t*linkAnnot = (FPDF_LINK)pDict; \n\t\t\treturn TRUE;\n\t\t}\n\t}\n\treturn FALSE;\n}\n\nDLLEXPORT FPDF_BOOL STDCALL FPDFLink_GetAnnotRect(FPDF_LINK linkAnnot, FS_RECTF* rect)\n{\n\tif(!linkAnnot || !rect)\n\t\treturn FALSE;\n\tCPDF_Dictionary* pAnnotDict = (CPDF_Dictionary*)linkAnnot;\n\tCPDF_Rect rt = pAnnotDict->GetRect(FX_BSTRC(\"Rect\"));\n\trect->left = rt.left;\n\trect->bottom = rt.bottom;\n\trect->right = rt.right;\n\trect->top = rt.top;\n\treturn TRUE;\n}\n\nDLLEXPORT int STDCALL FPDFLink_CountQuadPoints(FPDF_LINK linkAnnot)\n{\n\tif(!linkAnnot)\n\t\treturn 0;\n\tCPDF_Dictionary* pAnnotDict = (CPDF_Dictionary*)linkAnnot;\n\tCPDF_Array* pArray = pAnnotDict->GetArray(FX_BSTRC(\"QuadPoints\"));\n\tif (pArray == NULL)\n\t\treturn 0;\n\telse\n\t\treturn pArray->GetCount() / 8;\n}\n\nDLLEXPORT FPDF_BOOL STDCALL FPDFLink_GetQuadPoints(FPDF_LINK linkAnnot, int quadIndex, FS_QUADPOINTSF* quadPoints)\n{\n\tif(!linkAnnot || !quadPoints)\n\t\treturn FALSE;\n\tCPDF_Dictionary* pAnnotDict = (CPDF_Dictionary*)linkAnnot;\n\tCPDF_Array* pArray = pAnnotDict->GetArray(FX_BSTRC(\"QuadPoints\"));\n\tif (pArray) {\n\t\tif (0 > quadIndex || quadIndex >= (int)pArray->GetCount()/8 ||\n\t\t\t((quadIndex*8+7) >= (int)pArray->GetCount())) return FALSE;\n\t\tquadPoints->x1 = pArray->GetNumber(quadIndex*8);\n\t\tquadPoints->y1 = pArray->GetNumber(quadIndex*8+1);\n\t\tquadPoints->x2 = pArray->GetNumber(quadIndex*8+2);\n\t\tquadPoints->y2 = pArray->GetNumber(quadIndex*8+3);\n\t\tquadPoints->x3 = pArray->GetNumber(quadIndex*8+4);\n\t\tquadPoints->y3 = pArray->GetNumber(quadIndex*8+5);\n\t\tquadPoints->x4 = pArray->GetNumber(quadIndex*8+6);\n\t\tquadPoints->y4 = pArray->GetNumber(quadIndex*8+7);\n\t\treturn TRUE;\n\t} \n\treturn FALSE;\n}\n\n\nDLLEXPORT unsigned long STDCALL FPDF_GetMetaText(FPDF_DOCUMENT doc, FPDF_BYTESTRING tag,\n\t\t\t\t\t\t\t\t\t\t\t\t void* buffer, unsigned long buflen)\n{\n\tif (doc == NULL || tag == NULL) return 0;\n\n\tCPDF_Document* pDoc = (CPDF_Document*)doc;\n\t// Get info dictionary\n\tCPDF_Dictionary* pInfo = pDoc->GetInfo();\n\tif (pInfo == NULL) return 0;\n\n\tCFX_WideString text = pInfo->GetUnicodeText(tag);\n\n\t// Use UTF-16LE encoding\n\tCFX_ByteString bstr = text.UTF16LE_Encode();\n\tunsigned long len = bstr.GetLength();\n\tif (buffer != NULL && buflen >= len+2) {\n\t\tFXSYS_memcpy(buffer, (FX_LPCSTR)bstr, len);\n\t\t// use double zero as trailer\n\t\t((FX_BYTE*)buffer)[len] = ((FX_BYTE*)buffer)[len+1] = 0;\n\t}\n\treturn len+2;\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/fpdfeditimg.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../include/fsdk_define.h\"\n#include \"../include/fpdfedit.h\"\n\n\nDLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPageObj_NewImgeObj(FPDF_DOCUMENT document)\n{\n\tif (!document)\n\t\treturn NULL;\n\tCPDF_ImageObject* pImageObj = FX_NEW CPDF_ImageObject;\n\tCPDF_Image* pImg = FX_NEW CPDF_Image((CPDF_Document *)document);\n\tpImageObj->m_pImage = pImg;\n\treturn pImageObj;\n}\n\nDLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_LoadJpegFile(FPDF_PAGE* pages, int nCount,FPDF_PAGEOBJECT image_object, FPDF_FILEACCESS* fileAccess)\n{\n\tif (!image_object || !fileAccess)\n\t\treturn FALSE;\n\n\tIFX_FileRead* pFile = FX_NEW CPDF_CustomAccess(fileAccess);\n\n\tCPDF_ImageObject* pImgObj = (CPDF_ImageObject*)image_object;\n\tpImgObj->m_GeneralState.GetModify();\n\tfor (int index=0;index<nCount;index++)\n\t{\n\t\tCPDF_Page* pPage = (CPDF_Page*)pages[index]; \n\t\tpImgObj->m_pImage->ResetCache(pPage,NULL);\n\t}\n\tpImgObj->m_pImage->SetJpegImage(pFile);\n\n\treturn TRUE;\n}\n\n\nDLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_SetMatrix\t(FPDF_PAGEOBJECT image_object,\n\t\t\t\t\t\t\t\t\t\t\t\t double a, double b, double c, double d, double e, double f)\n{\n\tif (!image_object)\n\t\treturn FALSE;\n\tCPDF_ImageObject* pImgObj = (CPDF_ImageObject*)image_object;\n\tpImgObj->m_Matrix.a = (FX_FLOAT)a;\n\tpImgObj->m_Matrix.b = (FX_FLOAT)b;\n\tpImgObj->m_Matrix.c = (FX_FLOAT)c;\n\tpImgObj->m_Matrix.d = (FX_FLOAT)d;\n\tpImgObj->m_Matrix.e = (FX_FLOAT)e;\n\tpImgObj->m_Matrix.f = (FX_FLOAT)f;\n\tpImgObj->CalcBoundingBox();\n\treturn  TRUE;\n}\n\nDLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_SetBitmap(FPDF_PAGE* pages,int nCount,FPDF_PAGEOBJECT image_object,FPDF_BITMAP bitmap)\n{\n\tif (!image_object || !bitmap)\n\t\treturn FALSE;\n\tCFX_DIBitmap* pBmp = NULL;\n\tpBmp = (CFX_DIBitmap*)bitmap;\n\tCPDF_ImageObject* pImgObj = (CPDF_ImageObject*)image_object;\n\tpImgObj->m_GeneralState.GetModify();\n\tfor (int index=0;index<nCount;index++)\n\t{\n\t\tCPDF_Page* pPage = (CPDF_Page*)pages[index]; \n\t\tpImgObj->m_pImage->ResetCache(pPage,NULL);\n\t}\n\tpImgObj->m_pImage->SetImage(pBmp,FALSE);\n\tpImgObj->CalcBoundingBox();\n\treturn TRUE;\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/fpdfeditpage.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n// #include \"x:/pdf/fpdfapi5/include/fpdfapi.h\"\n#include \"../include/fsdk_define.h\"\n#include \"../include/fpdfedit.h\"\n\n\n#if _FX_OS_ == _FX_ANDROID_\n#include \"time.h\"\n#else\n#include <ctime>\n#endif\n\nDLLEXPORT FPDF_DOCUMENT STDCALL FPDF_CreateNewDocument()\n{\n\tCPDF_Document* pDoc = FX_NEW CPDF_Document;\n\tif (!pDoc)\n\t\treturn NULL;\n\tpDoc->CreateNewDoc();\n\ttime_t currentTime;\n\n\tCFX_ByteString DateStr;\n\n\tif(FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))\n\t{\n\t\tif ( -1 != time( &currentTime ) )\n\t\t{\n\t\t\ttm * pTM = localtime( &currentTime );\n\t\t\tif ( pTM )\n\t\t\t{\n\t\t\t\tDateStr.Format(\t\"D:%04d%02d%02d%02d%02d%02d\", pTM->tm_year+1900, pTM->tm_mon+1,\n\t\t\t\t\tpTM->tm_mday, pTM->tm_hour, pTM->tm_min, pTM->tm_sec );\n\t\t\t}\n\t\t}\n\t}\n\t\n\tCPDF_Dictionary* pInfoDict = NULL;\n\tpInfoDict = pDoc->GetInfo();\n\tif (pInfoDict)\n\t{\n\t\tif(FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))\n\t\t\tpInfoDict->SetAt(\"CreationDate\", new CPDF_String(DateStr));\n#ifdef FOXIT_CHROME_BUILD\n\t\tpInfoDict->SetAt(\"Creator\",FX_NEW CPDF_String(L\"Google\"));\n#else\n\t\tpInfoDict->SetAt(\"Creator\",FX_NEW CPDF_String(L\"Foxit PDF SDK DLL 2.0 - Foxit Software\"));\n#endif\n\t}\n\n\treturn pDoc;\n}\n\nDLLEXPORT void STDCALL FPDFPage_Delete(FPDF_DOCUMENT document, int page_index)\n{\n\tCPDF_Document* pDoc = (CPDF_Document*)document;\n\tif (pDoc == NULL) \n\t\treturn;\n\tif (page_index < 0 || page_index >= pDoc->GetPageCount()) \n\t\treturn;\n\n\tpDoc->DeletePage(page_index);\n}\n\nDLLEXPORT FPDF_PAGE STDCALL FPDFPage_New(FPDF_DOCUMENT document, int page_index, double width, double height)\n{\n\tif (!document)\n\t\treturn NULL;\n\n//\tCPDF_Parser* pParser = (CPDF_Parser*)document;\n\tCPDF_Document* pDoc = (CPDF_Document*)document;\n\tif(page_index < 0)\n\t\tpage_index = 0;\n\tif(pDoc->GetPageCount()<page_index)\n\t\tpage_index = pDoc->GetPageCount();\n//\tif (page_index < 0 || page_index >= pDoc->GetPageCount()) \n//\t\treturn NULL;\n\n\tCPDF_Dictionary* pPageDict = pDoc->CreateNewPage(page_index);\n\tif(!pPageDict)\n\t\treturn NULL;\n\tCPDF_Array* pMediaBoxArray = FX_NEW CPDF_Array;\n\tpMediaBoxArray->Add(FX_NEW CPDF_Number(0));\n\tpMediaBoxArray->Add(FX_NEW CPDF_Number(0));\n\tpMediaBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(width)));\n\tpMediaBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(height)));\n\n\tpPageDict->SetAt(\"MediaBox\", pMediaBoxArray);\n\tpPageDict->SetAt(\"Rotate\", FX_NEW CPDF_Number(0));\n\tpPageDict->SetAt(\"Resources\", FX_NEW CPDF_Dictionary);\n\n\tCPDF_Page* pPage = FX_NEW CPDF_Page;\n\tpPage->Load(pDoc,pPageDict);\n\tpPage->ParseContent();\n\n\treturn pPage;\n}\n\nDLLEXPORT int STDCALL FPDFPage_GetRotation(FPDF_PAGE page)\n{\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\tif (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist(\"Type\") || !pPage->m_pFormDict->GetElement(\"Type\")->GetDirect()\n\t\t|| pPage->m_pFormDict->GetElement(\"Type\")->GetDirect()->GetString().Compare(\"Page\"))\n\t{\n\t\treturn -1;\n\t}\n\tCPDF_Dictionary* pDict = pPage->m_pFormDict;\n\n\tint rotate = 0;\n\tif(pDict != NULL)\n\t{\n\t\tif (pDict->KeyExist(\"Rotate\"))\n\t\t\trotate = pDict->GetElement(\"Rotate\")->GetDirect()? pDict->GetElement(\"Rotate\")->GetDirect()->GetInteger() / 90 : 0;\n\t\telse\n\t\t{\n\t\t\tif(pDict->KeyExist(\"Parent\"))\n\t\t\t{\n\t\t\t\tCPDF_Dictionary* pPages = (CPDF_Dictionary*)pDict->GetElement(\"Parent\")->GetDirect();\n\t\t\t\twhile(pPages)\n\t\t\t\t{\n\t\t\t\t\tif(pPages->KeyExist(\"Rotate\"))\n\t\t\t\t\t{\n\t\t\t\t\t\trotate = pPages->GetElement(\"Rotate\")->GetDirect()? pPages->GetElement(\"Rotate\")->GetDirect()->GetInteger() / 90 : 0;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pPages->KeyExist(\"Parent\"))\n\t\t\t\t\t\tpPages = (CPDF_Dictionary*)pPages->GetElement(\"Parent\")->GetDirect();\n\t\t\t\t\telse break;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\treturn -1;\n\t}\n\t\n\treturn rotate;\n}\n\nDLLEXPORT void STDCALL FPDFPage_InsertObject(FPDF_PAGE page, FPDF_PAGEOBJECT page_obj)\n{\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\tif (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist(\"Type\") || !pPage->m_pFormDict->GetElement(\"Type\")->GetDirect()\n\t\t|| pPage->m_pFormDict->GetElement(\"Type\")->GetDirect()->GetString().Compare(\"Page\"))\n\t{\n\t\treturn;\n\t}\n\tCPDF_PageObject* pPageObj = (CPDF_PageObject*)page_obj;\n\tif(pPageObj == NULL)\n\t\treturn;\n\tFX_POSITION LastPersition = pPage->GetLastObjectPosition();\n\n\tpPage->InsertObject(LastPersition, pPageObj);\n\tswitch(pPageObj->m_Type)\n\t{\n\tcase FPDF_PAGEOBJ_PATH:\n\t\t{\n\t\t\tCPDF_PathObject* pPathObj = (CPDF_PathObject*)pPageObj;\n\t\t\tpPathObj->CalcBoundingBox();\n\t\t\tbreak;\n\t\t}\n\tcase FPDF_PAGEOBJ_TEXT:\n\t\t{\n\t\t\t//\tCPDF_PathObject* pPathObj = (CPDF_PathObject*)pPageObj;\n\t\t\t//\tpPathObj->CalcBoundingBox();\n\t\t\tbreak;\n\t\t}\n\tcase FPDF_PAGEOBJ_IMAGE:\n\t\t{\n\t\t\tCPDF_ImageObject* pImageObj = (CPDF_ImageObject*)pPageObj;\n\t\t\tpImageObj->CalcBoundingBox();\n\t\t\tbreak;\n\t\t}\n\tcase FPDF_PAGEOBJ_SHADING:\n\t\t{\n\t\t\tCPDF_ShadingObject* pShadingObj = (CPDF_ShadingObject*)pPageObj;\n\t\t\tpShadingObj->CalcBoundingBox();\n\t\t\tbreak;\n\t\t}\n\tcase FPDF_PAGEOBJ_FORM:\n\t\t{\n\t\t\tCPDF_FormObject* pFormObj = (CPDF_FormObject*)pPageObj;\n\t\t\tpFormObj->CalcBoundingBox();\n\t\t\tbreak;\n\t\t}\n\tdefault:\n\t\tbreak;\n\t}\n\n\t//\tpPage->ParseContent();\n\t//pPage->GenerateContent();\n\n}\n\nDLLEXPORT int STDCALL FPDFPage_CountObject(FPDF_PAGE page)\n{\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\tif (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist(\"Type\") || !pPage->m_pFormDict->GetElement(\"Type\")->GetDirect()\n\t\t|| pPage->m_pFormDict->GetElement(\"Type\")->GetDirect()->GetString().Compare(\"Page\"))\n\t{\n\t\treturn -1;\n\t}\n\treturn pPage->CountObjects();\n//\treturn 0;\n}\n\nDLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPage_GetObject(FPDF_PAGE page, int index)\n{\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\tif (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist(\"Type\")\n\t\t|| pPage->m_pFormDict->GetElement(\"Type\")->GetDirect()->GetString().Compare(\"Page\"))\n\t{\n\t\treturn NULL;\n\t}\n\treturn pPage->GetObjectByIndex(index);\n//\treturn NULL;\n}\n\nDLLEXPORT FPDF_BOOL STDCALL FPDFPage_HasTransparency(FPDF_PAGE page)\n{\n\tif(!page) return FALSE;\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\n\treturn pPage->BackgroundAlphaNeeded();\n}\n\nDLLEXPORT FPDF_BOOL STDCALL FPDFPageObj_HasTransparency(FPDF_PAGEOBJECT pageObject)\n{\n\tif(!pageObject) return FALSE;\n\tCPDF_PageObject* pPageObj = (CPDF_PageObject*)pageObject;\n\n\tconst CPDF_GeneralStateData* pGeneralState = pPageObj->m_GeneralState;\n\tint blend_type = pGeneralState ? pGeneralState->m_BlendType : FXDIB_BLEND_NORMAL;\n\tif (blend_type != FXDIB_BLEND_NORMAL) return TRUE;\n\n\tCPDF_Dictionary* pSMaskDict = pGeneralState ? (CPDF_Dictionary*)pGeneralState->m_pSoftMask : NULL;\n\tif(pSMaskDict) return TRUE;\n\n\tif(pGeneralState && pGeneralState->m_FillAlpha != 1.0f)\n\t\treturn TRUE;\n\n\tif(pPageObj->m_Type == PDFPAGE_PATH)\n\t{\n\t\tif(pGeneralState && pGeneralState->m_StrokeAlpha != 1.0f)\n\t\t\treturn TRUE;\n\t}\n\n\tif(pPageObj->m_Type == PDFPAGE_FORM)\n\t{\n\t\tCPDF_FormObject* pFormObj = (CPDF_FormObject*)pPageObj;\n\t\tif(pFormObj->m_pForm && (pFormObj->m_pForm->m_Transparency & PDFTRANS_ISOLATED))\n\t\t\treturn TRUE;\n\t\tif(pFormObj->m_pForm && (!(pFormObj->m_pForm->m_Transparency & PDFTRANS_ISOLATED) && (pFormObj->m_pForm->m_Transparency & PDFTRANS_GROUP)))\n\t\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}\n\nDLLEXPORT FPDF_BOOL STDCALL FPDFPage_GenerateContent(FPDF_PAGE page)\n{\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\tif (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist(\"Type\") || !pPage->m_pFormDict->GetElement(\"Type\")->GetDirect()\n\t\t|| pPage->m_pFormDict->GetElement(\"Type\")->GetDirect()->GetString().Compare(\"Page\"))\n\t{\n\t\treturn FALSE;\n\t}\n\tCPDF_PageContentGenerate CG(pPage);\n\tCG.GenerateContent();\n\n\treturn TRUE;\n}\n\nDLLEXPORT void STDCALL FPDFPageObj_Transform(FPDF_PAGEOBJECT page_object,\n\t\t\t double a, double b, double c, double d, double e, double f)  \n{\n\tCPDF_PageObject* pPageObj = (CPDF_PageObject*)page_object;\n\tif(pPageObj == NULL)\n\t\treturn;\n//PDF_ImageObject* pImageObj = FX_NEW CPDF_ImageObject;\n\tCFX_AffineMatrix matrix((FX_FLOAT)a,(FX_FLOAT)b,(FX_FLOAT)c,(FX_FLOAT)d,(FX_FLOAT)e,(FX_FLOAT)f);\n\tpPageObj->Transform(matrix);\n}\nDLLEXPORT void STDCALL FPDFPage_TransformAnnots(FPDF_PAGE page,\n\t\t\t\t\t\t\t\t\t\t\t   double a, double b, double c, double d, double e, double f)\n{\n\tif(page == NULL)\n\t\treturn;\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\tCPDF_AnnotList AnnotList(pPage);\n\tfor (int i=0; i<AnnotList.Count();i++)\n\t{\n\t\tCPDF_Annot* pAnnot = AnnotList.GetAt(i);\n\t\t// transformAnnots Rectangle\n\t\tCPDF_Rect rect;\n\t\tpAnnot->GetRect(rect);\n\t\tCFX_AffineMatrix matrix((FX_FLOAT)a,(FX_FLOAT)b,(FX_FLOAT)c,(FX_FLOAT)d,(FX_FLOAT)e,(FX_FLOAT)f);\n\t\trect.Transform(&matrix);\n\t\tCPDF_Array *pRectArray = NULL;\n\t\tpRectArray = pAnnot->m_pAnnotDict->GetArray(\"Rect\");\n\t\tif (!pRectArray) pRectArray=CPDF_Array::Create();\n\t\tpRectArray->SetAt(0,FX_NEW CPDF_Number(rect.left));\n\t\tpRectArray->SetAt(1,FX_NEW CPDF_Number(rect.bottom));\n\t\tpRectArray->SetAt(2,FX_NEW CPDF_Number(rect.right));\n\t\tpRectArray->SetAt(3,FX_NEW CPDF_Number(rect.top));\n\t\tpAnnot->m_pAnnotDict->SetAt(\"Rect\",pRectArray);\n\n\t\t//Transform AP's rectangle\n\t\t//To Do\n\n\t}\n\n}\n\nDLLEXPORT void STDCALL FPDFPage_SetRotation(FPDF_PAGE page, int rotate)\n{\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\tif (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist(\"Type\") || !pPage->m_pFormDict->GetElement(\"Type\")->GetDirect()\n\t\t|| pPage->m_pFormDict->GetElement(\"Type\")->GetDirect()->GetString().Compare(\"Page\"))\n\t{\n\t\treturn;\n\t}\n\tCPDF_Dictionary* pDict = pPage->m_pFormDict;\n\trotate %=4;\n\n\tpDict->SetAt(\"Rotate\", FX_NEW CPDF_Number(rotate * 90));\n}\n"
  },
  {
    "path": "fpdfsdk/src/fpdfformfill.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../include/fpdfview.h\"\n#include \"../include/fpdfformfill.h\"\n#include \"../include/fsdk_define.h\"\n#include \"../include/fsdk_mgr.h\"\n\n\n//#include \"../include/javascript/IJavaScript.h\"\n\n\nDLLEXPORT int STDCALL FPDPage_HasFormFieldAtPoint(FPDF_FORMHANDLE hHandle, FPDF_PAGE page,double page_x, double page_y)\n{\n\tif(!page || !hHandle)\n\t\treturn -1;\n\tCPDF_Page * pPage = (CPDF_Page*) page;\n\n\tCPDF_InterForm * pInterForm = NULL;\n\tpInterForm = new CPDF_InterForm(pPage->m_pDocument,FALSE);\n\tif (!pInterForm)\n\t\treturn -1;\n\tCPDF_FormControl* pFormCtrl = pInterForm->GetControlAtPoint(pPage, (FX_FLOAT)page_x, (FX_FLOAT)page_y);\n\tif(!pFormCtrl)\n\t{\n\t\tdelete pInterForm;\n\t\treturn -1;\n\t}\n\tCPDF_FormField* pFormField = pFormCtrl->GetField();\n\tif(!pFormField)\n\t{\n\t\tdelete pInterForm;\n\t\treturn -1;\n\t}\n\t\n\tint nType = pFormField->GetFieldType();\n\tdelete pInterForm;\n\treturn nType;\n}\n\nDLLEXPORT FPDF_FORMHANDLE STDCALL FPDFDOC_InitFormFillEnviroument(FPDF_DOCUMENT document, FPDF_FORMFILLINFO* formInfo)\n{\n\tif(!document || !formInfo || formInfo->version!=1)\n\t\treturn NULL;\n\tCPDF_Document * pDocument = (CPDF_Document*) document;\n \tCPDFDoc_Environment * pEnv = NULL;\n\tpEnv = new CPDFDoc_Environment(pDocument);\n\tif (!pEnv)\n\t\treturn NULL;\n\tpEnv->RegAppHandle(formInfo);\n\n\tif(pEnv->GetPDFDocument())\n\t{\n\t\tCPDFSDK_Document* pSDKDoc = new CPDFSDK_Document(pEnv->GetPDFDocument(), pEnv);\n\t\tif(pSDKDoc)\n\t\t\tpEnv->SetCurrentDoc(pSDKDoc);\n\t}\n\treturn pEnv;\n}\n\nDLLEXPORT void STDCALL FPDFDOC_ExitFormFillEnviroument(FPDF_FORMHANDLE hHandle)\n{\n\tif(!hHandle)\n\t\treturn; \n\tCPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();\n\tif(pSDKDoc)\n\t{\n\t\t((CPDFDoc_Environment*)hHandle)->SetCurrentDoc(NULL);\n\t\tdelete pSDKDoc;\n\t}\n\tdelete (CPDFDoc_Environment*)hHandle;\n\thHandle = NULL;\n}\n\nDLLEXPORT FPDF_BOOL STDCALL FORM_OnMouseMove(FPDF_FORMHANDLE hHandle, FPDF_PAGE page, int modifier, double page_x, double page_y)\n{\t\n\tif (!hHandle || !page)\n\t\treturn FALSE;\n// \tCPDF_Page * pPage = (CPDF_Page*) page;\n// \tCPDF_Document * pDoc = pPage->m_pDocument;\n//\tCPDFDoc_Environment* pEnv = (CPDFDoc_Environment*)hHandle;\n\tCPDFSDK_Document* pFXDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();\n\tif(!pFXDoc)\n\t\treturn FALSE;\n\tCPDFSDK_PageView* pPageView = pFXDoc->GetPageView((CPDF_Page*)page);\n\tif(!pPageView)\n\t\treturn FALSE;\n\t\n// \tdouble page_x = 0;\n// \tdouble page_y = 0;\n//\tpEnv->FFI_DeviceToPage(page, point_x, point_y, &page_x, &page_y);\n\tCPDF_Point pt((FX_FLOAT)page_x, (FX_FLOAT)page_y);\n\treturn pPageView->OnMouseMove(pt, modifier);\n}\n\nDLLEXPORT FPDF_BOOL STDCALL FORM_OnLButtonDown(FPDF_FORMHANDLE hHandle, FPDF_PAGE page, int modifier, double page_x, double page_y)\n{\n\tif (!hHandle || !page)\n\t\treturn FALSE;\n\tCPDFSDK_Document* pFXDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();\n\tif(!pFXDoc)\n\t\treturn FALSE;\n\tCPDFSDK_PageView* pPageView = pFXDoc->GetPageView((CPDF_Page*)page);\n\tif(!pPageView)\n\t\treturn FALSE;\n// \tdouble page_x = 0;\n// \tdouble page_y = 0;\n// \tpEnv->FFI_DeviceToPage(page, point_x, point_y, &page_x, &page_y);\n\tCPDF_Point pt((FX_FLOAT)page_x, (FX_FLOAT)page_y);\n \treturn pPageView->OnLButtonDown(pt, modifier);\n}\n\nDLLEXPORT FPDF_BOOL STDCALL FORM_OnLButtonUp(FPDF_FORMHANDLE hHandle, FPDF_PAGE page, int modifier, double page_x, double page_y)\n{\n\tif (!hHandle || !page)\n\t\treturn FALSE;\n\tCPDFSDK_Document* pFXDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();\n\tif(!pFXDoc)\n\t\treturn FALSE;\n\tCPDFSDK_PageView* pPageView = pFXDoc->GetPageView((CPDF_Page*)page);\n\tif(!pPageView)\n\t\treturn FALSE;\n// \tdouble page_x = 0;\n// \tdouble page_y = 0;\n// \tpEnv->FFI_DeviceToPage(page, point_x, point_y, &page_x, &page_y);\n\tCPDF_Point pt((FX_FLOAT)page_x, (FX_FLOAT)page_y);\n\treturn pPageView->OnLButtonUp(pt, modifier);\n}\n\nDLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyDown(FPDF_FORMHANDLE hHandle, FPDF_PAGE page, int nKeyCode, int modifier)\n{\n\tif (!hHandle || !page)\n\t\treturn FALSE;\n\tCPDFSDK_Document* pFXDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();\n\tif(!pFXDoc)\n\t\treturn FALSE;\n\tCPDFSDK_PageView* pPageView = pFXDoc->GetPageView((CPDF_Page*)page);\n\tif(!pPageView)\n\t\treturn FALSE;\n\t\n\t\n\treturn pPageView->OnKeyDown(nKeyCode, modifier);\n}\n\nDLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyUp(FPDF_FORMHANDLE hHandle, FPDF_PAGE page, int nKeyCode, int modifier)\n{\n\tif (!hHandle || !page)\n\t\treturn FALSE;\n\tCPDFSDK_Document* pFXDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();\n\tif(!pFXDoc)\n\t\treturn FALSE;\n\tCPDFSDK_PageView* pPageView = pFXDoc->GetPageView((CPDF_Page*)page);\n\tif(!pPageView)\n\t\treturn FALSE;\n\t\n\t\n\treturn pPageView->OnKeyUp(nKeyCode, modifier);\n}\n\n\nDLLEXPORT FPDF_BOOL STDCALL FORM_OnChar(FPDF_FORMHANDLE hHandle, FPDF_PAGE page, int nChar,  int modifier)\n{\n\tif (!hHandle || !page)\n\t\treturn FALSE;\n\tCPDFSDK_Document* pFXDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();\n\tif(!pFXDoc)\n\t\treturn FALSE;\n\tCPDFSDK_PageView* pPageView = pFXDoc->GetPageView((CPDF_Page*)page);\n\tif(!pPageView)\n\t\treturn FALSE;\n\treturn pPageView->OnChar(nChar, modifier);\n\n}\n\nDLLEXPORT FPDF_BOOL STDCALL FORM_ForceToKillFocus(FPDF_FORMHANDLE hHandle)\n{\n\tif(!hHandle)\n\t\treturn FALSE;\n\tCPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();\n\tif(!pSDKDoc)\n\t\treturn FALSE;\n\t//Kill the current focus. \n\treturn pSDKDoc->KillFocusAnnot(0);\n}\n\nDLLEXPORT void STDCALL FPDF_FFLDraw(FPDF_FORMHANDLE hHandle, FPDF_BITMAP bitmap, FPDF_PAGE page, int start_x, int start_y, \n\t\t\t\t\t\t\t\t\t\t\t\t  int size_x, int size_y, int rotate, int flags)\n{\n\tif (!hHandle || !page)\n\t\treturn ;\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\t\n\tCPDF_RenderOptions options;\n\tif (flags & FPDF_LCD_TEXT)\n\t\toptions.m_Flags |= RENDER_CLEARTYPE;\n\telse\n\t\toptions.m_Flags &= ~RENDER_CLEARTYPE;\n\t\n\t//Grayscale output\n\tif (flags & FPDF_GRAYSCALE)\n\t{\n\t\toptions.m_ColorMode = RENDER_COLOR_GRAY;\n\t\toptions.m_ForeColor = 0;\n\t\toptions.m_BackColor = 0xffffff;\n\t}\n\t\n\toptions.m_AddFlags = flags >> 8;\n\n\toptions.m_pOCContext = FX_NEW CPDF_OCContext(pPage->m_pDocument);\n\n\t//FXMT_CSLOCK_OBJ(&pPage->m_PageLock);\n\t\n\tCFX_AffineMatrix matrix;\n\tpPage->GetDisplayMatrix(matrix, start_x, start_y, size_x, size_y, rotate); \n\t\n\tFX_RECT clip;\n\tclip.left = start_x;\n\tclip.right = start_x + size_x;\n\tclip.top = start_y;\n\tclip.bottom = start_y + size_y;\n\n#ifdef _SKIA_SUPPORT_\n\tCFX_SkiaDevice* pDevice = FX_NEW CFX_SkiaDevice;\n#else\n\tCFX_FxgeDevice* pDevice = NULL;\n\tpDevice = FX_NEW CFX_FxgeDevice;\n#endif\n\n\tif (!pDevice)\n\t\treturn;\n\tpDevice->Attach((CFX_DIBitmap*)bitmap);\n\tpDevice->SaveState();\n\tpDevice->SetClip_Rect(&clip);\n\t\n\n\tCPDF_RenderContext* pContext = NULL;\n\tpContext = FX_NEW CPDF_RenderContext;\n\tif (!pContext)\n\t{\n\t\tdelete pDevice;\n\t\tpDevice = NULL;\n\t\treturn;\n\t}\n\n\n//\tCPDF_Document* pDoc = pPage->m_pDocument;\n\tCPDFDoc_Environment* pEnv = (CPDFDoc_Environment*)hHandle;\n\tCPDFSDK_Document* pFXDoc = pEnv->GetCurrentDoc();\n\tif(!pFXDoc)\n\t{\n\t\tdelete pContext;\n\t\tdelete pDevice;\n\t\tpContext = NULL;\n\t\tpDevice = NULL;\n\t\treturn;\n\t}\n\tif(CPDFSDK_PageView* pPageView = pFXDoc->GetPageView(pPage))\n\t{\n\t\tpPageView->PageView_OnDraw(pDevice, &matrix, &options);\n\t}\n\tpDevice->RestoreState();\n\n\tif(options.m_pOCContext)\n\t{\n\t\tdelete options.m_pOCContext;\n\t\toptions.m_pOCContext = NULL;\n\t}\n\tif(pContext)\n\t{\n\t\tdelete pContext;\n\t\tpContext = NULL;\n\t}\n\tif(pDevice)\n\t{\n\t\tdelete pDevice;\n\t\tpDevice = NULL;\n\t}\n\n}\n\nDLLEXPORT void STDCALL FPDF_SetFormFieldHighlightColor(FPDF_FORMHANDLE hHandle, int fieldType, unsigned long color)\n{\n\tif (!hHandle)\n\t\treturn;\n//\tCPDFDoc_Environment* pEnv = (CPDFDoc_Environment* )hHandle;\n\tCPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();\n\tif(pSDKDoc)\n\t{\n\t\tif(CPDFSDK_InterForm* pInterForm = pSDKDoc->GetInterForm())\n\t\t{\n\t\t\tpInterForm->SetHighlightColor(color, fieldType);\n\t\t}\n\t\n\t}\n\n}\n\nDLLEXPORT void STDCALL FPDF_SetFormFieldHighlightAlpha(FPDF_FORMHANDLE hHandle, unsigned char alpha)\n{\n\tif (!hHandle)\n\t\treturn;\n\tCPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();\n\tif(pSDKDoc)\n\t{\n\t\tif(CPDFSDK_InterForm* pInterForm = pSDKDoc->GetInterForm())\n\t\t\tpInterForm->SetHighlightAlpha(alpha);\n\t}\n}\n\nDLLEXPORT void STDCALL FPDF_RemoveFormFieldHighlight(FPDF_FORMHANDLE hHandle)\n{\n\tif (!hHandle)\n\t\treturn;\n\tCPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();\n\tif(pSDKDoc)\n\t{\n\t\tif(CPDFSDK_InterForm* pInterForm = pSDKDoc->GetInterForm())\n\t\t\tpInterForm->RemoveAllHighLight();\n\t}\n}\n\nDLLEXPORT void STDCALL FORM_OnAfterLoadPage(FPDF_PAGE page, FPDF_FORMHANDLE hHandle)\n{\n\tif(!hHandle || !page)\n\t\treturn;\n\tCPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();\n\tif(!pSDKDoc)\n\t\treturn;\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\tCPDFSDK_PageView* pPageView = pSDKDoc->GetPageView(pPage, TRUE);\n\tif(pPageView)\n\t{\n\t\tpPageView->SetValid(TRUE);\n\t}\t\n}\n\nDLLEXPORT void STDCALL FORM_OnBeforeClosePage(FPDF_PAGE page, FPDF_FORMHANDLE hHandle)\n{\n\tif(!hHandle || !page)\n\t\treturn;\n\tCPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\tCPDFSDK_PageView* pPageView = pSDKDoc->GetPageView(pPage, FALSE);\n\tif(pPageView)\n\t{\n\t\tpPageView->SetValid(FALSE);\n\t\t// ReMovePageView() takes care of the delete for us.\n\t\tpSDKDoc->ReMovePageView(pPage);\n\t}\n}\nDLLEXPORT void STDCALL FORM_DoDocumentJSAction(FPDF_FORMHANDLE hHandle)\n{\n    /*\n\tif(!hHandle)\n\t\treturn;\n\tif( CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc())\n\t{\n\t\tpSDKDoc->InitPageView();\n\t\tif(((CPDFDoc_Environment*)hHandle)->IsJSInitiated())\n\t\t\tpSDKDoc->ProcJavascriptFun();\n\t}\t\n    */\n}\n\nDLLEXPORT void STDCALL FORM_DoDocumentOpenAction(FPDF_FORMHANDLE hHandle)\n{\n    /*\n\tif(!hHandle)\n\t\treturn;\n\tif( CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc())\n\t{\n\t\tif(((CPDFDoc_Environment*)hHandle)->IsJSInitiated())\n\t\t\tpSDKDoc->ProcOpenAction();\n\t}\n    */\n}\nDLLEXPORT void STDCALL FORM_DoDocumentAAction(FPDF_FORMHANDLE hHandle, int aaType)\n{\n\tif(!hHandle)\n\t\treturn;\n\tCPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();\n\tif(pSDKDoc)\n\t{\n\t\tCPDF_Document* pDoc = pSDKDoc->GetDocument();\n\t\tCPDF_Dictionary* pDic = pDoc->GetRoot();\n\t\tif (!pDic)\n\t\t\treturn;\n\t\tCPDF_AAction aa = pDic->GetDict(FX_BSTRC(\"AA\"));\n\t\t\n\t\tif(aa.ActionExist((CPDF_AAction::AActionType)aaType))\n\t\t{\n\t\t\tCPDF_Action action = aa.GetAction((CPDF_AAction::AActionType)aaType);\n\t\t\tCPDFSDK_ActionHandler *pActionHandler = ((CPDFDoc_Environment*)hHandle)->GetActionHander();\n\t\t\tASSERT(pActionHandler != NULL);\n\t\t\tpActionHandler->DoAction_Document(action, (CPDF_AAction::AActionType)aaType, pSDKDoc);\n\t\t}\n\t}\n}\nDLLEXPORT void STDCALL FORM_DoPageAAction(FPDF_PAGE page, FPDF_FORMHANDLE hHandle, int aaType)\n{\n\tif(!hHandle || !page)\n\t\treturn;\n\tCPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\tCPDFSDK_PageView* pPageView = pSDKDoc->GetPageView(pPage, FALSE);\n\tif(pPageView)\n\t{\n\t\tCPDFDoc_Environment *pEnv = pSDKDoc->GetEnv();\n\t\tASSERT(pEnv != NULL);\n\t\t\t\n\t\tCPDFSDK_ActionHandler *pActionHandler = pEnv->GetActionHander();\n\t\tASSERT(pActionHandler != NULL);\n\t\t\n\t\tCPDF_Dictionary *pPageDict = pPage->m_pFormDict;\n\t\tASSERT(pPageDict != NULL);\n\t\t \n\t\tCPDF_AAction aa = pPageDict->GetDict(FX_BSTRC(\"AA\"));\n\n\t\tFX_BOOL bExistOAAction = FALSE;\n\t\tFX_BOOL bExistCAAction = FALSE;\n\t\tif (FPDFPAGE_AACTION_OPEN == aaType)\n\t\t{\n\t\t\tbExistOAAction = aa.ActionExist(CPDF_AAction::OpenPage);\n\t\t\tif (bExistOAAction)\n\t\t\t{\n\t\t\t\tCPDF_Action action = aa.GetAction(CPDF_AAction::OpenPage);\n\t\t\t\tpActionHandler->DoAction_Page(action, CPDF_AAction::OpenPage, pSDKDoc);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbExistCAAction = aa.ActionExist(CPDF_AAction::ClosePage);\n\t\t\tif (bExistCAAction)\n\t\t\t{\n\t\t\t\tCPDF_Action action = aa.GetAction(CPDF_AAction::ClosePage);\n\t\t\t\tpActionHandler->DoAction_Page(action, CPDF_AAction::ClosePage, pSDKDoc);\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n"
  },
  {
    "path": "fpdfsdk/src/fpdfoom.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../include/fsdk_define.h\"\n#include \"../include/fpdfoom.h\"\n\nvoid OOM_Handler(void* param)\n{\n\tif (!param) return;\n\t((OOM_INFO*)param)->FSDK_OOM_Handler((OOM_INFO*)param);\n}\n\n\nDLLEXPORT FX_BOOL STDCALL FSDK_SetOOMHandler(OOM_INFO* oomInfo)\n{\n#ifndef _FXSDK_OPENSOURCE_\n\tif (!oomInfo || oomInfo->version!=1)\n\t\treturn FALSE;\n\tFXMEM_SetOOMHandler(FXMEM_GetDefaultMgr(),OOM_Handler,oomInfo);\n\treturn TRUE;\n#else\n\treturn TRUE;\n#endif\n}\n"
  },
  {
    "path": "fpdfsdk/src/fpdfppo.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../include/fpdfppo.h\"\n#include \"../include/fsdk_define.h\"\n\nclass CPDF_PageOrganizer\n{\npublic:\n\tCPDF_PageOrganizer();\n\t~CPDF_PageOrganizer();\n\t\npublic:\n\tFX_BOOL\t\t\t\tPDFDocInit(CPDF_Document *pDestPDFDoc, CPDF_Document *pSrcPDFDoc);\n\tFX_BOOL\t\t\t\tExportPage(CPDF_Document *pSrcPDFDoc, CFX_WordArray* nPageNum, CPDF_Document *pDestPDFDoc, int nIndex);\n\tCPDF_Object*\t\tPageDictGetInheritableTag(CPDF_Dictionary *pDict, CFX_ByteString nSrctag);\n\tFX_BOOL\t\t\t\tUpdateReference(CPDF_Object *pObj, CPDF_Document *pDoc, CFX_MapPtrToPtr* pMapPtrToPtr);\n\tint\t\t\t\t\tGetNewObjId(CPDF_Document *pDoc, CFX_MapPtrToPtr* pMapPtrToPtr, CPDF_Reference *pRef);\n\t\n};\n\n\nCPDF_PageOrganizer::CPDF_PageOrganizer()\n{\n\n}\n\nCPDF_PageOrganizer::~CPDF_PageOrganizer()\n{\n\n}\n\nFX_BOOL CPDF_PageOrganizer::PDFDocInit(CPDF_Document *pDestPDFDoc, CPDF_Document *pSrcPDFDoc)\n{\n\tif(!pDestPDFDoc || !pSrcPDFDoc)\n\t\treturn false;\n\t\n\tCPDF_Dictionary* pNewRoot = pDestPDFDoc->GetRoot();\n\tif(!pNewRoot)\treturn FALSE;\n\t\n\t//Set the document information////////////////////////////////////////////\n\t\n\tCPDF_Dictionary* DInfoDict = pDestPDFDoc->GetInfo();\n\t\n\tif(!DInfoDict)\n\t\treturn FALSE;\n\t\n\tCFX_ByteString producerstr;\n\t\n#ifdef FOXIT_CHROME_BUILD\n\tproducerstr.Format(\"Google\");\n#else\n\t producerstr.Format(\"Foxit PDF SDK %s - Foxit Corporation\", \"2.0\");\n#endif\n\tDInfoDict->SetAt(\"Producer\", new CPDF_String(producerstr));\n\n\t//Set type////////////////////////////////////////////////////////////////\n\tCFX_ByteString cbRootType = pNewRoot->GetString(\"Type\",\"\");\n\tif( cbRootType.Equal(\"\") )\n\t{\n\t\tpNewRoot->SetAt(\"Type\", new CPDF_Name(\"Catalog\"));\n\t}\n\t\n\tCPDF_Dictionary* pNewPages = (CPDF_Dictionary*)(pNewRoot->GetElement(\"Pages\")? pNewRoot->GetElement(\"Pages\")->GetDirect() : NULL);\n\tif(!pNewPages)\n\t{\n\t\tpNewPages = new CPDF_Dictionary;\n\t\tFX_DWORD NewPagesON = pDestPDFDoc->AddIndirectObject(pNewPages);\n\t\tpNewRoot->SetAt(\"Pages\", new CPDF_Reference(pDestPDFDoc, NewPagesON));\n\t}\n\t\n\tCFX_ByteString cbPageType = pNewPages->GetString(\"Type\",\"\");\n\tif(cbPageType.Equal(\"\"))\n\t{\n\t\tpNewPages->SetAt(\"Type\", new CPDF_Name(\"Pages\"));\n\t}\n\n\tCPDF_Array* pKeysArray = pNewPages->GetArray(\"Kids\");\n\tif(pKeysArray == NULL)\n\t{\n\t\tCPDF_Array* pNewKids = new CPDF_Array;\n\t\tFX_DWORD Kidsobjnum = -1;\n\t\tKidsobjnum = pDestPDFDoc->AddIndirectObject(pNewKids);//, Kidsobjnum, Kidsgennum);\n\t\t\n\t\tpNewPages->SetAt(\"Kids\", new CPDF_Reference(pDestPDFDoc, Kidsobjnum));//, Kidsgennum));\n\t\tpNewPages->SetAt(\"Count\", new CPDF_Number(0));\t\t\n\t}\n\n\treturn true;\n}\n\nFX_BOOL CPDF_PageOrganizer::ExportPage(CPDF_Document *pSrcPDFDoc, CFX_WordArray* nPageNum, \n\t\t\t\t\t\t\t\t\t\t\t\tCPDF_Document *pDestPDFDoc,int nIndex)\n{\n\tint curpage =nIndex;\n\n\tCFX_MapPtrToPtr* pMapPtrToPtr = new CFX_MapPtrToPtr;\n\tpMapPtrToPtr->InitHashTable(1001);\n\n\tfor(int i=0; i<nPageNum->GetSize(); i++)\n\t{\n\t\t\n\t\tCPDF_Dictionary* pCurPageDict = pDestPDFDoc->CreateNewPage(curpage);\n\t\tCPDF_Dictionary* pSrcPageDict = pSrcPDFDoc->GetPage(nPageNum->GetAt(i)-1);\n\t\tif(!pSrcPageDict || !pCurPageDict)\n\t\t{\n\t\t\tdelete pMapPtrToPtr;\n\t\t\treturn FALSE;\n\t\t}\n\t\t\n\t\t// Clone the page dictionary///////////\n\t\tFX_POSITION\tSrcPos = pSrcPageDict->GetStartPos();\n\t\twhile (SrcPos)\n\t\t{\n\t\t\tCFX_ByteString cbSrcKeyStr;\n\t\t\tCPDF_Object* pObj = pSrcPageDict->GetNextElement(SrcPos, cbSrcKeyStr);\n\t\t\tif(cbSrcKeyStr.Compare((\"Type\")) && cbSrcKeyStr.Compare((\"Parent\")))\n\t\t\t{\n\t\t\t\tif(pCurPageDict->KeyExist(cbSrcKeyStr))\n\t\t\t\t\tpCurPageDict->RemoveAt(cbSrcKeyStr);\n\t\t\t\tpCurPageDict->SetAt(cbSrcKeyStr, pObj->Clone());\n\t\t\t}\n\t\t}\n\t\t\n\t\t//inheritable item///////////////////////\n\t\tCPDF_Object* pInheritable = NULL;\n\t\t//1\tMediaBox  //required\n\t\tif(!pCurPageDict->KeyExist(\"MediaBox\"))\n\t\t{\n\t\t\t\n\t\t\tpInheritable = PageDictGetInheritableTag(pSrcPageDict, \"MediaBox\");\n\t\t\tif(!pInheritable) \n\t\t\t{\n\t\t\t\t//Search the \"CropBox\" from source page dictionary, if not exists,we take the letter size.\n\t\t\t\tpInheritable = PageDictGetInheritableTag(pSrcPageDict, \"CropBox\");\n\t\t\t\tif(pInheritable)\n\t\t\t\t\tpCurPageDict->SetAt(\"MediaBox\", pInheritable->Clone());\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t//Make the default size to be letter size (8.5'x11')\n\t\t\t\t\tCPDF_Array* pArray = new CPDF_Array;\n\t\t\t\t\tpArray->AddNumber(0);\n\t\t\t\t\tpArray->AddNumber(0);\n\t\t\t\t\tpArray->AddNumber(612);\n\t\t\t\t\tpArray->AddNumber(792);\n\t\t\t\t\tpCurPageDict->SetAt(\"MediaBox\", pArray);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tpCurPageDict->SetAt(\"MediaBox\", pInheritable->Clone());\n\t\t}\n\t\t//2 Resources //required\n\t\tif(!pCurPageDict->KeyExist(\"Resources\"))\n\t\t{\n\t\t\tpInheritable = PageDictGetInheritableTag(pSrcPageDict, \"Resources\");\n\t\t\tif(!pInheritable) \n\t\t\t{\n\t\t\t\tdelete pMapPtrToPtr;\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\tpCurPageDict->SetAt(\"Resources\", pInheritable->Clone());\n\t\t}\n\t\t//3 CropBox  //Optional\n\t\tif(!pCurPageDict->KeyExist(\"CropBox\"))\n\t\t{\n\t\t\tpInheritable = PageDictGetInheritableTag(pSrcPageDict, \"CropBox\");\n\t\t\tif(pInheritable) \n\t\t\t\tpCurPageDict->SetAt(\"CropBox\", pInheritable->Clone());\n\t\t}\n\t\t//4 Rotate  //Optional\n\t\tif(!pCurPageDict->KeyExist(\"Rotate\"))\n\t\t{\n\t\t\tpInheritable = PageDictGetInheritableTag(pSrcPageDict, \"Rotate\");\n\t\t\tif(pInheritable) \n\t\t\t\tpCurPageDict->SetAt(\"Rotate\", pInheritable->Clone());\n\t\t}\n\n\t\t/////////////////////////////////////////////\n\t\t//Update the reference\n\t\tFX_DWORD dwOldPageObj = pSrcPageDict->GetObjNum();\n\t\tFX_DWORD dwNewPageObj = pCurPageDict->GetObjNum();\n\t\t\n\t\tpMapPtrToPtr->SetAt((FX_LPVOID)(FX_UINTPTR)dwOldPageObj, (FX_LPVOID)(FX_UINTPTR)dwNewPageObj);\n\n\t\tthis->UpdateReference(pCurPageDict, pDestPDFDoc, pMapPtrToPtr);\n\t\tcurpage++;\n\t}\n\n\tdelete pMapPtrToPtr;\n\treturn TRUE;\n}\n\nCPDF_Object* CPDF_PageOrganizer::PageDictGetInheritableTag(CPDF_Dictionary *pDict, CFX_ByteString nSrctag)\n{\n\tif(!pDict || !pDict->KeyExist(\"Type\") || nSrctag.IsEmpty())\t\n\t\treturn NULL;\n\n\tCPDF_Object* pType = pDict->GetElement(\"Type\")->GetDirect();\n\tif(!pType || pType->GetType() != PDFOBJ_NAME)\treturn NULL;\n\n\tif(pType->GetString().Compare(\"Page\"))\treturn NULL;\n\n\tif(!pDict->KeyExist(\"Parent\"))\treturn NULL;\n\tCPDF_Object* pParent = pDict->GetElement(\"Parent\")->GetDirect();\n\tif(!pParent || pParent->GetType() != PDFOBJ_DICTIONARY)\treturn NULL;\n\t\n\tCPDF_Dictionary* pp = (CPDF_Dictionary*)pParent;\n\t\n\tif(pDict->KeyExist((const char*)nSrctag))\t\n\t\treturn pDict->GetElement((const char*)nSrctag);\n\twhile (pp)\n\t{\n\t\tif(pp->KeyExist((const char*)nSrctag))\t\n\t\t\treturn pp->GetElement((const char*)nSrctag);\n\t\telse if(pp->KeyExist(\"Parent\"))\n\t\t\tpp = (CPDF_Dictionary*)pp->GetElement(\"Parent\")->GetDirect();\n\t\telse break;\n\t}\n\t\n\treturn NULL;\n}\n\nFX_BOOL CPDF_PageOrganizer::UpdateReference(CPDF_Object *pObj, CPDF_Document *pDoc, \n\t\t\t\t\t\t\t\t\t\t CFX_MapPtrToPtr* pMapPtrToPtr)\n{\n\tswitch (pObj->GetType())\n\t{\n\tcase PDFOBJ_REFERENCE:\n\t\t{\n\t\t\tCPDF_Reference* pReference = (CPDF_Reference*)pObj;\n\t\t\tint newobjnum = GetNewObjId(pDoc, pMapPtrToPtr, pReference);\n\t\t\tif (newobjnum == 0) return FALSE;\n\t\t\tpReference->SetRef(pDoc, newobjnum);//, 0);\n\t\t\tbreak;\n\t\t}\n\tcase PDFOBJ_DICTIONARY:\n\t\t{\n\t\t\tCPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;\n\t\t\t\n\t\t\tFX_POSITION pos = pDict->GetStartPos();\n\t\t\twhile(pos)\n\t\t\t{\n\t\t\t\tCFX_ByteString key(\"\");\n\t\t\t\tCPDF_Object* pNextObj = pDict->GetNextElement(pos, key);\n\t\t\t\tif (!FXSYS_strcmp(key, \"Parent\") || !FXSYS_strcmp(key, \"Prev\") || !FXSYS_strcmp(key, \"First\"))\n\t\t\t\t\tcontinue;\n\t\t\t\tif(pNextObj)\n\t\t\t\t{\n\t\t\t\t\tif(!UpdateReference(pNextObj, pDoc, pMapPtrToPtr))\n\t\t\t\t\t\tpDict->RemoveAt(key);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\tcase\tPDFOBJ_ARRAY:\n\t\t{\n\t\t\tCPDF_Array* pArray = (CPDF_Array*)pObj;\n\t\t\tFX_DWORD count = pArray->GetCount();\n\t\t\tfor(FX_DWORD i = 0; i < count; i ++)\n\t\t\t{\n\t\t\t\tCPDF_Object* pNextObj = pArray->GetElement(i);\n\t\t\t\tif(pNextObj)\n\t\t\t\t{\n\t\t\t\t\tif(!UpdateReference(pNextObj, pDoc, pMapPtrToPtr))\n\t\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\tcase\tPDFOBJ_STREAM:\n\t\t{\n\t\t\tCPDF_Stream* pStream = (CPDF_Stream*)pObj;\n\t\t\tCPDF_Dictionary* pDict = pStream->GetDict();\n\t\t\tif(pDict)\n\t\t\t{\n\t\t\t\tif(!UpdateReference(pDict, pDoc, pMapPtrToPtr))\n\t\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\t\t}\n\tdefault:\tbreak;\n\t}\n\n\treturn TRUE;\n}\n\nint\tCPDF_PageOrganizer::GetNewObjId(CPDF_Document *pDoc, CFX_MapPtrToPtr* pMapPtrToPtr,\n\t\t\t\t\t\t\t\t\tCPDF_Reference *pRef)\n{\n\tsize_t dwObjnum = 0;\n\tif(!pRef)\n\t\treturn 0;\n\tdwObjnum = pRef->GetRefObjNum();\n\t\n\tsize_t dwNewObjNum = 0;\n\t\n\tpMapPtrToPtr->Lookup((FX_LPVOID)dwObjnum, (FX_LPVOID&)dwNewObjNum);\n\tif(dwNewObjNum)\n\t{\n\t\treturn (int)dwNewObjNum;\n\t}\n\telse\n\t{\n\t\tCPDF_Object* pClone  = pRef->GetDirect()->Clone();\n\t\tif(!pClone)\t\t\t\n\t\t\treturn 0;\n\t\t\n\t\tif(pClone->GetType() == PDFOBJ_DICTIONARY)\n\t\t{\n\t\t\tCPDF_Dictionary* pDictClone = (CPDF_Dictionary*)pClone;\n\t\t\tif(pDictClone->KeyExist(\"Type\"))\n\t\t\t{\n\t\t\t\tCFX_ByteString strType = pDictClone->GetString(\"Type\");\n\t\t\t\tif(!FXSYS_stricmp(strType, \"Pages\"))\n\t\t\t\t{\n\t\t\t\t\tpDictClone->Release();\n\t\t\t\t\treturn 4;\n\t\t\t\t}\n\t\t\t\telse if(!FXSYS_stricmp(strType, \"Page\"))\n\t\t\t\t{\n\t\t\t\t\tpDictClone->Release();\n\t\t\t\t\treturn  0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdwNewObjNum = pDoc->AddIndirectObject(pClone);//, onum, gnum);\n\t\tpMapPtrToPtr->SetAt((FX_LPVOID)dwObjnum, (FX_LPVOID)dwNewObjNum);\n\t\t\n\t\tif(!UpdateReference(pClone, pDoc, pMapPtrToPtr))\n\t\t{\n\t\t\tpClone->Release();\n\t\t\treturn 0;\n\t\t}\n\t\treturn (int)dwNewObjNum;\n\t}\n\treturn 0;\n}\n\nFPDF_BOOL ParserPageRangeString(CFX_ByteString rangstring, CFX_WordArray* pageArray,int nCount)\n{\n\n\tif(rangstring.GetLength() != 0)\n\t{\n\t\trangstring.Remove(' ');\n\t\tint nLength = rangstring.GetLength();\n\t\tCFX_ByteString cbCompareString(\"0123456789-,\");\n\t\tfor(int i=0; i<nLength; i++)\n\t\t{\n\t\t\tif(cbCompareString.Find(rangstring[i]) == -1)\n\t\t\t\treturn FALSE;\n\t\t}\n\t\tCFX_ByteString cbMidRange;\n\t\tint nStringFrom = 0;\n\t\tint nStringTo=0;\n\t\twhile(nStringTo < nLength)\n\t\t{\n\t\t\tnStringTo = rangstring.Find(',',nStringFrom);\n\t\t\tif(nStringTo == -1)\n\t\t\t{\n\t\t\t\tnStringTo = nLength;\n\t\t\t}\n\t\t\tcbMidRange = rangstring.Mid(nStringFrom,nStringTo-nStringFrom);\n\t\t\t\n\t\t\tint nMid = cbMidRange.Find('-');\n\t\t\tif(nMid == -1)\n\t\t\t{\n\t\t\t\tlong lPageNum = atol(cbMidRange);\n\t\t\t\tif(lPageNum <= 0 || lPageNum > nCount)\n\t\t\t\t\treturn FALSE;\n\t\t\t\tpageArray->Add((FX_WORD)lPageNum);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tint nStartPageNum = atol(cbMidRange.Mid(0,nMid));\n\t\t\t\tif (nStartPageNum ==0)\n\t\t\t\t{\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\n\n\t\t\t\tnMid = nMid+1;\n\t\t\t\tint nEnd = cbMidRange.GetLength()-nMid;\n\n\t\t\t\tif(nEnd ==0)return FALSE;\n\t\t\t\t\n\t\t\t\t//\t\t\t\tint nEndPageNum = (nEnd == 0)?nCount:atol(cbMidRange.Mid(nMid,nEnd));\n\t\t\t\tint nEndPageNum = atol(cbMidRange.Mid(nMid,nEnd));\n\t\t\t\t\n\t\t\t\tif(nStartPageNum < 0 ||nStartPageNum >nEndPageNum|| nEndPageNum > nCount)\n\t\t\t\t{\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tfor(int nIndex=nStartPageNum; nIndex <= nEndPageNum; nIndex ++)\n\t\t\t\t\t\tpageArray->Add(nIndex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tnStringFrom = nStringTo +1;\n\t\t}\n\t}\n\treturn TRUE;\n}\n\nDLLEXPORT FPDF_BOOL STDCALL FPDF_ImportPages(FPDF_DOCUMENT dest_doc,FPDF_DOCUMENT src_doc, \n\t\t\t\t\t\t\t\t\t\t\t FPDF_BYTESTRING pagerange, int index)\n{\n\tif(dest_doc == NULL || src_doc == NULL )\n\t\treturn FALSE;\n\tCFX_WordArray pageArray;\n\tCPDF_Document* pSrcDoc = (CPDF_Document*)src_doc;\n\tint nCount = pSrcDoc->GetPageCount();\n\tif(pagerange)\n\t{\n\t\tif(ParserPageRangeString(pagerange,&pageArray,nCount) == FALSE)\n\t\t\treturn FALSE;\n\t}\n\telse\n\t{\n\t\tfor(int i=1; i<=nCount; i++)\n\t\t{\n\t\t\tpageArray.Add(i);\n\t\t}\n\t}\n\t\n\tCPDF_Document* pDestDoc = (CPDF_Document*)dest_doc;\n\tCPDF_PageOrganizer pageOrg;\n\n\tpageOrg.PDFDocInit(pDestDoc,pSrcDoc);\n\n\tif(pageOrg.ExportPage(pSrcDoc,&pageArray,pDestDoc,index))\n\t\treturn TRUE;\n\treturn FALSE;\n}\n\nDLLEXPORT FPDF_BOOL STDCALL FPDF_CopyViewerPreferences(FPDF_DOCUMENT dest_doc, FPDF_DOCUMENT src_doc)\n{\n\tif(src_doc == NULL || dest_doc == NULL)\n\t\treturn false;\n\tCPDF_Document* pSrcDoc = (CPDF_Document*)src_doc;\n\tCPDF_Dictionary* pSrcDict = pSrcDoc->GetRoot();\n\tpSrcDict = pSrcDict->GetDict(FX_BSTRC(\"ViewerPreferences\"));;\n\tif(!pSrcDict)\n\t\treturn FALSE;\n\tCPDF_Document* pDstDoc = (CPDF_Document*)dest_doc;\n\tCPDF_Dictionary* pDstDict = pDstDoc->GetRoot();\n\tif(!pDstDict)\n\t\treturn FALSE;\n\tpDstDict->SetAt(FX_BSTRC(\"ViewerPreferences\"), pSrcDict->Clone(TRUE));\n\treturn TRUE;\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/fpdfsave.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../include/fsdk_define.h\"\n#include \"../include/fpdfsave.h\"\n#include \"../include/fpdfedit.h\"\n#if _FX_OS_ == _FX_ANDROID_\n#include \"time.h\"\n#else\n#include <ctime>\n#endif\n\nclass CFX_IFileWrite FX_FINAL : public IFX_StreamWrite\n{\n\t\npublic:\n\tCFX_IFileWrite();\n\tFX_BOOL\t\t\t\tInit( FPDF_FILEWRITE * pFileWriteStruct );\n\tvirtual\tFX_BOOL\t\tWriteBlock(const void* pData, size_t size);\n\tvirtual void\t\tRelease(){};\n\t\nprotected:\n\tFPDF_FILEWRITE*\t\tm_pFileWriteStruct;\n};\n\nCFX_IFileWrite::CFX_IFileWrite()\n{\n\tm_pFileWriteStruct = NULL;\n}\n\nFX_BOOL CFX_IFileWrite::Init( FPDF_FILEWRITE * pFileWriteStruct )\n{\n\tif (!pFileWriteStruct)\n\t\treturn FALSE;\n\telse\n\t{\n\t\tm_pFileWriteStruct = pFileWriteStruct;\n\t}\n\treturn TRUE;\n}\n\nFX_BOOL CFX_IFileWrite::WriteBlock(const void* pData, size_t size)\n{\n\tif (m_pFileWriteStruct)\n\t{\n\t\tm_pFileWriteStruct->WriteBlock( m_pFileWriteStruct, pData, size );\n\t\treturn TRUE;\n\t}\n\telse \n\t\treturn FALSE;\n}\n\nFPDF_BOOL _FPDF_Doc_Save(FPDF_DOCUMENT document,FPDF_FILEWRITE * pFileWrite,FPDF_DWORD flags, FPDF_BOOL bSetVersion,\n\t\t\t\t\t\t int fileVerion)\n{\n\tCPDF_Document* pDoc = (CPDF_Document*)document;\n\tif (!pDoc) \n\t\treturn 0;\n\t\n\tif ( flags < FPDF_INCREMENTAL || flags > FPDF_REMOVE_SECURITY )\n\t{\n\t\tflags = 0;\n\t}\n\t\n\tCPDF_Creator FileMaker(pDoc);\n\tif(bSetVersion)\n\t\tFileMaker.SetFileVersion(fileVerion);\n\tif(flags == FPDF_REMOVE_SECURITY)\n\t{\n\t\tflags =  0;\n\t\tFileMaker.RemoveSecurity();\n\t}\n\tCFX_IFileWrite* pStreamWrite = NULL;\n\tFX_BOOL bRet;\n\tpStreamWrite = new CFX_IFileWrite;\n\tpStreamWrite->Init( pFileWrite );\n\tbRet = FileMaker.Create(pStreamWrite, flags);\n\tdelete pStreamWrite;\n\treturn bRet;\n}\n\nDLLEXPORT FPDF_BOOL STDCALL FPDF_SaveAsCopy(\tFPDF_DOCUMENT document,FPDF_FILEWRITE * pFileWrite,\n\t\t\t\t\t\t\t\t\t\t\t\tFPDF_DWORD flags )\n{\n\treturn _FPDF_Doc_Save(document, pFileWrite, flags, FALSE , 0);\n}\n\n\nDLLEXPORT FPDF_BOOL STDCALL FPDF_SaveWithVersion(\tFPDF_DOCUMENT document,FPDF_FILEWRITE * pFileWrite,\n\tFPDF_DWORD flags, int fileVersion)\n{\n\treturn _FPDF_Doc_Save(document, pFileWrite, flags, TRUE , fileVersion);\n}\n"
  },
  {
    "path": "fpdfsdk/src/fpdfsdkdll.rc",
    "content": "//Microsoft Developer Studio generated resource script.\n//\n#include \"resource.h\"\n\n#define APSTUDIO_READONLY_SYMBOLS\n/////////////////////////////////////////////////////////////////////////////\n//\n// Generated from the TEXTINCLUDE 2 resource.\n//\n#include \"afxres.h\"\n\n/////////////////////////////////////////////////////////////////////////////\n#undef APSTUDIO_READONLY_SYMBOLS\n\n/////////////////////////////////////////////////////////////////////////////\n// Chinese (P.R.C.) resources\n\n#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)\n#ifdef _WIN32\nLANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED\n#pragma code_page(936)\n#endif //_WIN32\n\n#ifndef _MAC\n/////////////////////////////////////////////////////////////////////////////\n//\n// Version\n//\n\nVS_VERSION_INFO VERSIONINFO\n FILEVERSION 2,0,0,1705\n PRODUCTVERSION 2,0,0,1705\n FILEFLAGSMASK 0x3fL\n#ifdef _DEBUG\n FILEFLAGS 0x1L\n#else\n FILEFLAGS 0x0L\n#endif\n FILEOS 0x40004L\n FILETYPE 0x2L\n FILESUBTYPE 0x0L\nBEGIN\n    BLOCK \"StringFileInfo\"\n    BEGIN\n        BLOCK \"080904b0\"\n        BEGIN\n            VALUE \"Comments\", \"Foxit Corporation\\0\"\n            VALUE \"CompanyName\", \"Foxit Corporation\\0\"\n            VALUE \"FileDescription\", \"fpdfsdk\\0\"\n            VALUE \"FileVersion\", \"2, 0, 0, 1705\\0\"\n            VALUE \"InternalName\", \"fpdfsdk\\0\"\n            VALUE \"LegalCopyright\", \"Copyright (C) 2004-2009 Foxit Corporation\\0\"\n            VALUE \"LegalTrademarks\", \"\\0\"\n            VALUE \"OriginalFilename\", \"fpdfsdk.dll\\0\"\n            VALUE \"PrivateBuild\", \"\\0\"\n            VALUE \"ProductName\", \"Foxit PDF SDK DLL\\0\"\n            VALUE \"ProductVersion\", \"2, 0, 0, 1705\\0\"\n            VALUE \"SpecialBuild\", \"\\0\"\n        END\n    END\n    BLOCK \"VarFileInfo\"\n    BEGIN\n        VALUE \"Translation\", 0x809, 1200\n    END\nEND\n\n#endif    // !_MAC\n\n\n#ifdef APSTUDIO_INVOKED\n/////////////////////////////////////////////////////////////////////////////\n//\n// TEXTINCLUDE\n//\n\n1 TEXTINCLUDE MOVEABLE PURE \nBEGIN\n    \"resource.h\\0\"\nEND\n\n2 TEXTINCLUDE MOVEABLE PURE \nBEGIN\n    \"#include \"\"afxres.h\"\"\\r\\n\"\n    \"\\0\"\nEND\n\n3 TEXTINCLUDE MOVEABLE PURE \nBEGIN\n    \"\\r\\n\"\n    \"\\0\"\nEND\n\n#endif    // APSTUDIO_INVOKED\n\n#endif    // Chinese (P.R.C.) resources\n/////////////////////////////////////////////////////////////////////////////\n\n\n\n#ifndef APSTUDIO_INVOKED\n/////////////////////////////////////////////////////////////////////////////\n//\n// Generated from the TEXTINCLUDE 3 resource.\n//\n\n\n/////////////////////////////////////////////////////////////////////////////\n#endif    // not APSTUDIO_INVOKED\n\n"
  },
  {
    "path": "fpdfsdk/src/fpdftext.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../include/fsdk_define.h\"\n#include \"../include/fpdftext.h\"\n\n#ifdef _WIN32\n#include <tchar.h>\n#endif\n\n\t// jabdelmalek: commented out to build on Linux.  Not used.\n\t// extern HANDLE g_hModule;\n\nDLLEXPORT FPDF_TEXTPAGE STDCALL FPDFText_LoadPage(FPDF_PAGE page)\n{\n\tif (!page) return NULL;\n\tIPDF_TextPage* textpage=NULL;\n\ttry\n\t{\n\t\tCPDF_ViewerPreferences viewRef(((CPDF_Page*)page)->m_pDocument);\n\t\ttextpage=IPDF_TextPage::CreateTextPage((CPDF_Page*)page,viewRef.IsDirectionR2L());\n\t\ttextpage->ParseTextPage();\n\t}\n\tcatch (...)\n\t{\n\t\tif (textpage)\n\t\t\tdelete textpage;\n\t\treturn NULL;\n\t}\n\treturn textpage;\n}\nDLLEXPORT void STDCALL FPDFText_ClosePage(FPDF_TEXTPAGE text_page)\n{\n\tif (text_page){\n\t\tIPDF_TextPage* textpage=(IPDF_TextPage*)text_page;\n\t\tdelete textpage;\n\t\ttext_page=NULL;\n\t}\n}\nDLLEXPORT int STDCALL FPDFText_CountChars(FPDF_TEXTPAGE text_page)\n{\n\tif (!text_page) return\t-1;\n\tIPDF_TextPage* textpage=(IPDF_TextPage*)text_page;\n\treturn  textpage->CountChars();\n}\nDLLEXPORT unsigned int STDCALL FPDFText_GetUnicode(FPDF_TEXTPAGE text_page, int index)\n{\n\tif (!text_page) return -1;\n\tIPDF_TextPage* textpage=(IPDF_TextPage*)text_page;\n\n\tif (index<0 || index>=textpage->CountChars()) return 0;\n\n\tFPDF_CHAR_INFO\tcharinfo;\n\ttextpage->GetCharInfo(index,charinfo);\n\treturn charinfo.m_Unicode;\n}\nDLLEXPORT double STDCALL FPDFText_GetFontSize(FPDF_TEXTPAGE text_page, int index)\n{\n\tif (!text_page) return 0;\n\tIPDF_TextPage* textpage=(IPDF_TextPage*)text_page;\n\n\tif (index<0 || index>=textpage->CountChars()) return 0;\n\n\tFPDF_CHAR_INFO\tcharinfo;\n\ttextpage->GetCharInfo(index,charinfo);\n\treturn charinfo.m_FontSize;\n}\n\nDLLEXPORT void STDCALL FPDFText_GetCharBox(FPDF_TEXTPAGE text_page, int index,double* left,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdouble* right, double* bottom, double* top)\n{\n\tif (!text_page) return;\n\tIPDF_TextPage* textpage=(IPDF_TextPage*)text_page;\n\t\n\tif (index<0 || index>=textpage->CountChars()) return ;\n\tFPDF_CHAR_INFO\tcharinfo;\n\ttextpage->GetCharInfo(index,charinfo);\n\t*left=charinfo.m_CharBox.left;\n\t*right=charinfo.m_CharBox.right;\n\t*bottom=charinfo.m_CharBox.bottom;\n\t*top=charinfo.m_CharBox.top;\n}\n\n//select\nDLLEXPORT int STDCALL FPDFText_GetCharIndexAtPos(FPDF_TEXTPAGE text_page,double x,double y,double xTorelance,double yTorelance)\n{\n\tif (!text_page) return -3;\n\tIPDF_TextPage* textpage=(IPDF_TextPage*)text_page;\n\treturn textpage->GetIndexAtPos((FX_FLOAT)x,(FX_FLOAT)y,(FX_FLOAT)xTorelance,(FX_FLOAT)yTorelance);\n}\n\nDLLEXPORT int STDCALL FPDFText_GetText(FPDF_TEXTPAGE text_page,int start,int count,unsigned short* result)\n{\n\tif (!text_page) return 0;\n\tIPDF_TextPage* textpage=(IPDF_TextPage*)text_page;\n\t\n\tif (start>=textpage->CountChars()) return 0;\n\n\tCFX_WideString str=textpage->GetPageText(start,count);\n\tif(str.GetLength()>count)\n\t\tstr = str.Left(count);\n\n\tCFX_ByteString cbUTF16str = str.UTF16LE_Encode();\n\tFXSYS_memcpy(result,cbUTF16str.GetBuffer(cbUTF16str.GetLength()),cbUTF16str.GetLength());\n\tcbUTF16str.ReleaseBuffer(cbUTF16str.GetLength());\n\n\treturn cbUTF16str.GetLength()/sizeof(unsigned short);\n}\n\nDLLEXPORT int STDCALL FPDFText_CountRects(FPDF_TEXTPAGE text_page,int start,int count)\n{\n\tif (!text_page) return 0;\n\tIPDF_TextPage* textpage=(IPDF_TextPage*)text_page;\n\treturn\ttextpage->CountRects(start,count);\n\n}\nDLLEXPORT void STDCALL FPDFText_GetRect(FPDF_TEXTPAGE text_page,int rect_index, double* left,double*  top,\n\t\t\t\t\t\t\t\t\t\tdouble*  right, double*  bottom)\n{\n\tif (!text_page) return;\n\tIPDF_TextPage* textpage=(IPDF_TextPage*)text_page;\n\tCFX_FloatRect\trect;\n\ttextpage->GetRect(rect_index,rect.left,rect.top,rect.right,rect.bottom);\n\t*left=rect.left;\n\t*top=rect.top;\n\t*right=rect.right;\n\t*bottom=rect.bottom;\n}\n\nDLLEXPORT int STDCALL FPDFText_GetBoundedText(FPDF_TEXTPAGE text_page,double left, double top, \n\t\t\t\t\t\t\t\t\t\t\t  double right, double bottom,unsigned short* buffer,int buflen)\n{\n\tif (!text_page) return 0;\n\tIPDF_TextPage* textpage=(IPDF_TextPage*)text_page;\n\tCFX_FloatRect rect((FX_FLOAT)left,(FX_FLOAT)bottom,(FX_FLOAT)right,(FX_FLOAT)top);\n\tCFX_WideString str=textpage->GetTextByRect(rect);\n\n\tif (buflen<=0 || buffer==NULL)\n\t{\n\t\treturn str.GetLength();\n\t}\n\n\tCFX_ByteString cbUTF16Str = str.UTF16LE_Encode();\n\tint len = cbUTF16Str.GetLength()/sizeof(unsigned short);\n\tint size = buflen > len ? len : buflen;\n\tFXSYS_memcpy(buffer,cbUTF16Str.GetBuffer(size*sizeof(unsigned short)),size*sizeof(unsigned short));\n\tcbUTF16Str.ReleaseBuffer(size*sizeof(unsigned short));\n\n\treturn size;\n\t\t\n}\n\n//Search\n//-1 for end\nDLLEXPORT FPDF_SCHHANDLE STDCALL FPDFText_FindStart(FPDF_TEXTPAGE text_page,FPDF_WIDESTRING findwhat,unsigned long flags,int start_index)\n{\n\tif (!text_page) return NULL;\n\tIPDF_TextPageFind* textpageFind=NULL;\n\ttry\n\t{\n\t\ttextpageFind=IPDF_TextPageFind::CreatePageFind((IPDF_TextPage*)text_page);\n\t\tFX_STRSIZE len = CFX_WideString::WStringLength(findwhat);\n\t\ttextpageFind->FindFirst(CFX_WideString::FromUTF16LE(findwhat, len),flags,start_index);\n\t}\n\tcatch (...)\n\t{\n\t\tif (textpageFind)\n\t\t\tdelete textpageFind;\n\t\treturn NULL;\t\t\n\t}\n\treturn textpageFind;\n}\nDLLEXPORT FPDF_BOOL\tSTDCALL FPDFText_FindNext(FPDF_SCHHANDLE handle)\n{\n\tif (!handle) return FALSE;\n\tIPDF_TextPageFind* textpageFind=(IPDF_TextPageFind*)handle;\n\treturn\ttextpageFind->FindNext();\n}\nDLLEXPORT FPDF_BOOL STDCALL FPDFText_FindPrev(FPDF_SCHHANDLE handle)\n{\n\tif (!handle) return FALSE;\n\tIPDF_TextPageFind* textpageFind=(IPDF_TextPageFind*)handle;\n\treturn\ttextpageFind->FindPrev();\n}\nDLLEXPORT int STDCALL FPDFText_GetSchResultIndex(FPDF_SCHHANDLE handle)\n{\n\tif (!handle) return 0;\n\tIPDF_TextPageFind* textpageFind=(IPDF_TextPageFind*)handle;\n\treturn textpageFind->GetCurOrder();\n}\nDLLEXPORT int STDCALL FPDFText_GetSchCount(FPDF_SCHHANDLE handle)\n{\n\tif (!handle) return 0;\n\tIPDF_TextPageFind* textpageFind=(IPDF_TextPageFind*)handle;\n\treturn textpageFind->GetMatchedCount();\n}\nDLLEXPORT void STDCALL FPDFText_FindClose(FPDF_SCHHANDLE handle)\n{\n\tif (!handle) return;\n\tIPDF_TextPageFind* textpageFind=(IPDF_TextPageFind*)handle;\n\tdelete\ttextpageFind;\n\thandle=NULL;\n}\n\n//web link\nDLLEXPORT FPDF_PAGELINK STDCALL FPDFLink_LoadWebLinks(FPDF_TEXTPAGE text_page)\n{\n\tif (!text_page) return NULL;\n\tIPDF_LinkExtract* pageLink=NULL;\n\ttry\n\t{\n\t\tpageLink=IPDF_LinkExtract::CreateLinkExtract();\n\t\tpageLink->ExtractLinks((IPDF_TextPage*)text_page);\n\t}\n\tcatch (...)\n\t{\n\t\tif (pageLink)\n\t\t\tdelete pageLink;\n\t\treturn NULL;\n\t}\n\treturn pageLink;\n}\nDLLEXPORT int STDCALL FPDFLink_CountWebLinks(FPDF_PAGELINK link_page)\n{\n\tif (!link_page) return 0;\n\tIPDF_LinkExtract* pageLink=(IPDF_LinkExtract*)link_page;\n\treturn\tpageLink->CountLinks();\n}\nDLLEXPORT int STDCALL FPDFLink_GetURL(FPDF_PAGELINK link_page,int link_index, unsigned short* buffer,int buflen)\n{\n\tif (!link_page) return 0;\n\tIPDF_LinkExtract* pageLink=(IPDF_LinkExtract*)link_page;\n\tCFX_WideString url=pageLink->GetURL(link_index);\n\n\tCFX_ByteString cbUTF16URL = url.UTF16LE_Encode();\n\tint len= cbUTF16URL.GetLength()/sizeof(unsigned short);\n\tif (buffer==NULL || buflen<=0)\n\t\treturn len;\n\tint size=len<buflen ? len :buflen;\n\tif (size>0)\n\t{\n\t\tFXSYS_memcpy(buffer,cbUTF16URL.GetBuffer(size*sizeof(unsigned short)),size*sizeof(unsigned short));\n\t\tcbUTF16URL.ReleaseBuffer(size*sizeof(unsigned short));\n\t}\n\treturn size;\n}\nDLLEXPORT int STDCALL FPDFLink_CountRects(FPDF_PAGELINK link_page,int link_index)\n{\n\tif (!link_page) return 0;\n\tIPDF_LinkExtract* pageLink=(IPDF_LinkExtract*)link_page;\n\tCFX_RectArray rectArray;\n\tpageLink->GetRects(link_index,rectArray);\n\treturn rectArray.GetSize();\n}\nDLLEXPORT void STDCALL FPDFLink_GetRect(FPDF_PAGELINK link_page,int link_index,  int rect_index, double* left,\n\t\t\t\t\t\t\t\t\t\tdouble*  top,double*  right, double*  bottom)\n{\n\tif (!link_page) return;\n\tIPDF_LinkExtract* pageLink=(IPDF_LinkExtract*)link_page;\n\tCFX_RectArray rectArray;\n\tpageLink->GetRects(link_index,rectArray);\n\tCFX_FloatRect rect;\n\trect=rectArray.GetAt(rect_index);\n\t*left=rect.left;\n\t*right=rect.right;\n\t*top=rect.top;\n\t*bottom=rect.bottom;\n}\nDLLEXPORT void\tSTDCALL\tFPDFLink_CloseWebLinks(FPDF_PAGELINK link_page)\n{\n\tif (!link_page) return;\n\tIPDF_LinkExtract* pageLink=(IPDF_LinkExtract*)link_page;\n\tdelete pageLink;\n\tpageLink =NULL;\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/fpdfview.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../include/fsdk_define.h\"\n#include \"../include/fpdfview.h\"\n#include \"../include/fsdk_rendercontext.h\"\n#include \"../include/fpdf_progressive.h\"\n#include \"../include/fpdf_ext.h\"\n\n\nCPDF_CustomAccess::CPDF_CustomAccess(FPDF_FILEACCESS* pFileAccess)\n{\n\tm_FileAccess = *pFileAccess;\n\tm_BufferOffset = (FX_DWORD)-1;\n}\n\nFX_BOOL CPDF_CustomAccess::GetByte(FX_DWORD pos, FX_BYTE& ch)\n{\n\tif (pos >= m_FileAccess.m_FileLen) return FALSE;\n\tif (m_BufferOffset == (FX_DWORD)-1 || pos < m_BufferOffset || pos >= m_BufferOffset + 512) {\n\t\t// Need to read from file access\n\t\tm_BufferOffset = pos;\n\t\tint size = 512;\n\t\tif (pos + 512 > m_FileAccess.m_FileLen)\n\t\t\tsize = m_FileAccess.m_FileLen - pos;\n\t\tif (!m_FileAccess.m_GetBlock(m_FileAccess.m_Param, m_BufferOffset, m_Buffer, size))\n\t\t\treturn FALSE;\n\t}\n\tch = m_Buffer[pos - m_BufferOffset];\n\treturn TRUE;\n}\n\nFX_BOOL CPDF_CustomAccess::GetBlock(FX_DWORD pos, FX_LPBYTE pBuf, FX_DWORD size)\n{\n\tif (pos + size > m_FileAccess.m_FileLen) return FALSE;\n\treturn m_FileAccess.m_GetBlock(m_FileAccess.m_Param, pos, pBuf, size);\n}\n\nFX_BOOL CPDF_CustomAccess::ReadBlock(void* buffer, FX_FILESIZE offset, size_t size)\n{\n\t//\tm_FileAccess = *pFileAccess;\n\t//\tm_BufferOffset = (FX_DWORD)-1;\n\tif (offset + size > m_FileAccess.m_FileLen) return FALSE;\n\treturn m_FileAccess.m_GetBlock(m_FileAccess.m_Param, offset,(FX_LPBYTE) buffer, size);\n\n\t//\treturn FALSE;\n}\n\n//0 bit: FPDF_POLICY_MACHINETIME_ACCESS\nstatic FX_DWORD foxit_sandbox_policy = 0xFFFFFFFF;\n\nvoid FSDK_SetSandBoxPolicy(FPDF_DWORD policy, FPDF_BOOL enable)\n{\n\tswitch(policy)\n\t{\n\tcase FPDF_POLICY_MACHINETIME_ACCESS:\n\t\t{\n\t\t\tif(enable)\n\t\t\t\tfoxit_sandbox_policy |= 0x01;\n\t\t\telse\n\t\t\t\tfoxit_sandbox_policy &= 0xFFFFFFFE;\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n}\n\nFPDF_BOOL FSDK_IsSandBoxPolicyEnabled(FPDF_DWORD policy)\n{\n\tswitch(policy)\n\t{\n\tcase FPDF_POLICY_MACHINETIME_ACCESS:\n\t\t{\n\t\t\tif(foxit_sandbox_policy&0x01)\n\t\t\t\treturn TRUE;\n\t\t\telse\n\t\t\t\treturn FALSE;\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\treturn FALSE;\n}\n\n\n#ifndef _T\n#define _T(x) x\n#endif\n\n#ifdef API5\n\tCPDF_ModuleMgr*\tg_pModuleMgr = NULL;\n#else\n\tCCodec_ModuleMgr*\tg_pCodecModule = NULL;\n#endif\n\n//extern CPDFSDK_FormFillApp* g_pFormFillApp;\n\n#if _FX_OS_ == _FX_LINUX_EMBEDDED_\nclass CFontMapper : public IPDF_FontMapper\n{\npublic:\n\tCFontMapper();\n\tvirtual ~CFontMapper();\n\n\tvirtual FT_Face FindSubstFont(\n\t\t\t\t\t\t\tCPDF_Document* pDoc,\t\t\t\t// [IN] The PDF document\n\t\t\t\t\t\t\tconst CFX_ByteString& face_name,\t// [IN] Original name\n\t\t\t\t\t\t\tFX_BOOL bTrueType,\t\t\t\t\t// [IN] TrueType or Type1\n\t\t\t\t\t\t\tFX_DWORD flags,\t\t\t\t\t\t// [IN] PDF font flags (see PDF Reference section 5.7.1)\n\t\t\t\t\t\t\tint font_weight,\t\t\t\t\t// [IN] original font weight. 0 for not specified\n\t\t\t\t\t\t\tint CharsetCP,\t\t\t\t\t\t// [IN] code page for charset (see Win32 GetACP())\n\t\t\t\t\t\t\tFX_BOOL bVertical,\n\t\t\t\t\t\t\tCPDF_SubstFont* pSubstFont\t\t\t// [OUT] Subst font data\n\t\t\t\t\t\t);\n\n\tFT_Face m_SysFace;\n};\n\nCFontMapper* g_pFontMapper = NULL;\n#endif\t\t// #if _FX_OS_ == _FX_LINUX_EMBEDDED_\n\nDLLEXPORT void STDCALL FPDF_InitLibrary(FX_LPVOID hInstance)\n{\n#ifdef API5\n\tCPDF_ModuleMgr::Create();\n\tg_pModuleMgr = CPDF_ModuleMgr::Get();\n\t #if _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_LINUX_EMBEDDED_\n\t \tg_pModuleMgr->InitEmbedded();\n\t #ifdef _GB1_CMAPS_\n\t \tg_pModuleMgr->LoadEmbeddedGB1CMaps();\n\t #endif\n\t #ifdef _GB1_CMAPS_4_\n\t \tg_pModuleMgr->LoadEmbeddedGB1CMaps_4();\n\t #endif\n\t #ifdef _CNS1_CMAPS_\n\t \tg_pModuleMgr->LoadEmbeddedCNS1CMaps();\n\t #endif\n\t #ifdef _JAPAN1_CMAPS_\n\t \tg_pModuleMgr->LoadEmbeddedJapan1CMaps();\n\t #endif\n\t #ifdef _JAPAN1_CMAPS_6_\n\t \tg_pModuleMgr->LoadEmbeddedJapan1CMaps_6();\n\t #endif\n\t #ifdef _KOREA1_CMAPS_\n\t \tg_pModuleMgr->LoadEmbeddedKorea1CMaps();\n\t #endif\n\t #ifdef _JPX_DECODER_\n\t \tg_pModuleMgr->InitJpxModule();\n\t \tg_pModuleMgr->InitJbig2Module();\n\t //\tg_pModuleMgr->InitIccModule();\n\t #endif\n\t #else\n\t \tg_pModuleMgr->InitDesktop();\n\t #endif\n#else\n\tg_pCodecModule = CCodec_ModuleMgr::Create();\n\t\n\tCFX_GEModule::Create();\n\tCFX_GEModule::Get()->SetCodecModule(g_pCodecModule);\n\t\n\tCPDF_ModuleMgr::Create();\n\tCPDF_ModuleMgr::Get()->SetCodecModule(g_pCodecModule);\n\tCPDF_ModuleMgr::Get()->InitPageModule();\n\tCPDF_ModuleMgr::Get()->InitRenderModule();\n#ifdef FOXIT_CHROME_BUILD\n\tCPDF_ModuleMgr * pModuleMgr = CPDF_ModuleMgr::Get();\n\tif ( pModuleMgr )\n\t{\n\t\tpModuleMgr->LoadEmbeddedGB1CMaps();\n\t\tpModuleMgr->LoadEmbeddedJapan1CMaps();\n\t\tpModuleMgr->LoadEmbeddedCNS1CMaps();\n\t\tpModuleMgr->LoadEmbeddedKorea1CMaps();\n\t}\n#endif \n#endif\n\n#ifdef _WIN32\n\t// Get module path\n\tTCHAR app_path[MAX_PATH];\n\t::GetModuleFileName((HINSTANCE)hInstance, app_path, MAX_PATH);\n\tsize_t len = _tcslen(app_path);\n\tfor (size_t i = len; i >= 0; i --)\n\t\tif (app_path[i] == '\\\\') {\n\t\t\tapp_path[i] = 0;\n\t\t\tbreak;\n\t\t}\n\t\t\n#ifdef _UNICODE\n\t\t#ifndef _FXSDK_OPENSOURCE_\n\t\tCPDF_ModuleMgr::Get()->SetModulePath(NULL, CFX_ByteString::FromUnicode(app_path));\n\t\t#endif\n#else\n#ifndef _FXSDK_OPENSOURCE_\n\t\tCPDF_ModuleMgr::Get()->SetModulePath(NULL, app_path);\n#endif\n#endif\n#endif\n}\n\n\nDLLEXPORT void STDCALL FPDF_DestroyLibrary()\n{\n\n#if _FX_OS_ == _FX_LINUX_EMBEDDED_\n\tif (g_pFontMapper) delete g_pFontMapper;\n#endif\n#ifdef API5\n\tg_pModuleMgr->Destroy();\n#else\n\tCPDF_ModuleMgr::Destroy();\n\tCFX_GEModule::Destroy();\n\tg_pCodecModule->Destroy();\n#endif\n#ifndef _FXSDK_OPENSOURCE_\n\tFXMEM_CollectAll(FXMEM_GetDefaultMgr());\n#else\n\n#endif\n}\n\n#ifndef _WIN32\nint g_LastError;\nvoid SetLastError(int err)\n{\n\tg_LastError = err;\n}\n\nint GetLastError()\n{\n\treturn g_LastError;\n}\n#endif\n\nvoid ProcessParseError(FX_DWORD err_code)\n{\n\t// Translate FPDFAPI error code to FPDFVIEW error code\n\tswitch (err_code) {\n\t\tcase PDFPARSE_ERROR_FILE:\n\t\t\terr_code = FPDF_ERR_FILE;\n\t\t\tbreak;\n\t\tcase PDFPARSE_ERROR_FORMAT:\n\t\t\terr_code = FPDF_ERR_FORMAT;\n\t\t\tbreak;\n\t\tcase PDFPARSE_ERROR_PASSWORD:\n\t\t\terr_code = FPDF_ERR_PASSWORD;\n\t\t\tbreak;\n\t\tcase PDFPARSE_ERROR_HANDLER:\n\t\t\terr_code = FPDF_ERR_SECURITY;\n\t\t\tbreak;\n\t}\n\tSetLastError(err_code);\n}\n\nDLLEXPORT void\tSTDCALL FPDF_SetSandBoxPolicy(FPDF_DWORD policy, FPDF_BOOL enable)\n{\n\treturn FSDK_SetSandBoxPolicy(policy, enable);\n}\n\nDLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadDocument(FPDF_STRING file_path, FPDF_BYTESTRING password)\n{\n\tCPDF_Parser* pParser = FX_NEW CPDF_Parser;\n\tpParser->SetPassword(password);\n\ttry {\n\t\tFX_DWORD err_code = pParser->StartParse((FX_LPCSTR)file_path);\n\t\tif (err_code) {\n\t\t\tdelete pParser;\n\t\t\tProcessParseError(err_code);\n\t\t\treturn NULL;\n\t\t}\n\t}\n\tcatch (...) {\n\t\tdelete pParser;\n\t\tSetLastError(FPDF_ERR_UNKNOWN);\n\t\treturn NULL;\n\t}\n\treturn pParser->GetDocument();\n}\n\nextern void CheckUnSupportError(CPDF_Document * pDoc, FX_DWORD err_code);\n\nclass CMemFile FX_FINAL: public IFX_FileRead, public CFX_Object\n{\npublic:\n\tCMemFile(FX_BYTE* pBuf, FX_FILESIZE size):m_pBuf(pBuf),m_size(size) {}\n\n\tvirtual void\t\t\tRelease() {delete this;}\n\tvirtual FX_FILESIZE\t\tGetSize() {return m_size;}\n\tvirtual FX_BOOL\t\t\tReadBlock(void* buffer, FX_FILESIZE offset, size_t size) \n\t{\n\t\tif(offset+size > (FX_DWORD)m_size) return FALSE;\n\t\tFXSYS_memcpy(buffer, m_pBuf+offset, size);\n\t\treturn TRUE;\n\t}\nprivate:\n\tFX_BYTE* m_pBuf;\n\tFX_FILESIZE m_size;\n};\nDLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadMemDocument(const void* data_buf, int size, FPDF_BYTESTRING password)\n{\n\tCPDF_Parser* pParser = FX_NEW CPDF_Parser;\n\tpParser->SetPassword(password);\n\ttry {\n\t\tCMemFile* pMemFile = FX_NEW CMemFile((FX_BYTE*)data_buf, size);\n\t\tFX_DWORD err_code = pParser->StartParse(pMemFile);\n\t\tif (err_code) {\n\t\t\tdelete pParser;\n\t\t\tProcessParseError(err_code);\n\t\t\treturn NULL;\n\t\t}\n\t\tCPDF_Document * pDoc = NULL;\n\t\tpDoc = pParser?pParser->GetDocument():NULL;\n\t\tCheckUnSupportError(pDoc, err_code);\n\t}\n\tcatch (...) {\n\t\tdelete pParser;\n\t\tSetLastError(FPDF_ERR_UNKNOWN);\n\t\treturn NULL;\n\t}\n\treturn pParser->GetDocument();\n}\n\nDLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadCustomDocument(FPDF_FILEACCESS* pFileAccess, FPDF_BYTESTRING password)\n{\n\tCPDF_Parser* pParser = FX_NEW CPDF_Parser;\n\tpParser->SetPassword(password);\n\tCPDF_CustomAccess* pFile = FX_NEW CPDF_CustomAccess(pFileAccess);\n\ttry {\n\t\tFX_DWORD err_code = pParser->StartParse(pFile);\n\t\tif (err_code) {\n\t\t\tdelete pParser;\n\t\t\tProcessParseError(err_code);\n\t\t\treturn NULL;\n\t\t}\n\t\tCPDF_Document * pDoc = NULL;\n\t\tpDoc = pParser?pParser->GetDocument():NULL;\n\t\tCheckUnSupportError(pDoc, err_code);\n\t}\n\tcatch (...) {\n\t\tdelete pParser;\n\t\tSetLastError(FPDF_ERR_UNKNOWN);\n\t\treturn NULL;\n\t}\n\treturn pParser->GetDocument();\n}\n\nDLLEXPORT FPDF_BOOL STDCALL FPDF_GetFileVersion(FPDF_DOCUMENT doc, int* fileVersion)\n{\n\tif(!doc||!fileVersion) return FALSE;\n\t*fileVersion = 0;\n\tCPDF_Document* pDoc = (CPDF_Document*)doc;\n\tCPDF_Parser* pParser = (CPDF_Parser*)pDoc->GetParser();\n\tif(!pParser)\n\t\treturn FALSE;\n\t*fileVersion = pParser->GetFileVersion();\n\treturn TRUE;\n}\n\n// jabdelmalek: changed return type from FX_DWORD to build on Linux (and match header).\nDLLEXPORT unsigned long STDCALL FPDF_GetDocPermissions(FPDF_DOCUMENT document)\n{\n\tif (document == NULL) return 0;\n\tCPDF_Document*pDoc = (CPDF_Document*)document;\n\tCPDF_Parser* pParser = \t(CPDF_Parser*)pDoc->GetParser();\n\tCPDF_Dictionary* pDict = pParser->GetEncryptDict();\n\tif (pDict == NULL) return (FX_DWORD)-1;\n\n\treturn pDict->GetInteger(\"P\");\n}\n\nDLLEXPORT int STDCALL FPDF_GetPageCount(FPDF_DOCUMENT document)\n{\n\tif (document == NULL) return 0;\n\treturn ((CPDF_Document*)document)->GetPageCount();\n}\n\nDLLEXPORT FPDF_PAGE STDCALL FPDF_LoadPage(FPDF_DOCUMENT document, int page_index)\n{\n\tif (document == NULL) return NULL;\n\tif (page_index < 0 || page_index >= FPDF_GetPageCount(document)) return NULL;\n//\tCPDF_Parser* pParser = (CPDF_Parser*)document;\n\tCPDF_Document* pDoc = (CPDF_Document*)document;\n\tif (pDoc == NULL) return NULL;\n\tCPDF_Dictionary* pDict = pDoc->GetPage(page_index);\n\tif (pDict == NULL) return NULL;\n\tCPDF_Page* pPage = FX_NEW CPDF_Page;\n\tpPage->Load(pDoc, pDict);\n\ttry {\n\t\tpPage->ParseContent();\n\t}\n\tcatch (...) {\n\t\tdelete pPage;\n\t\treturn NULL;\n\t}\n\t\n//\tCheckUnSupportError(pDoc, 0);\n\n\treturn pPage;\n}\n\nDLLEXPORT double STDCALL FPDF_GetPageWidth(FPDF_PAGE page)\n{\n\tif (!page)\n\t\treturn 0.0;\n\treturn ((CPDF_Page*)page)->GetPageWidth();\n}\n\nDLLEXPORT double STDCALL FPDF_GetPageHeight(FPDF_PAGE page)\n{\n\tif (!page) return 0.0;\n\treturn ((CPDF_Page*)page)->GetPageHeight();\n}\n\nvoid DropContext(void* data)\n{\n\tdelete (CRenderContext*)data;\n}\n\nvoid FPDF_RenderPage_Retail(CRenderContext* pContext, FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,\n\t\t\t\t\t\tint rotate, int flags,FX_BOOL bNeedToRestore, IFSDK_PAUSE_Adapter * pause  );\nvoid (*Func_RenderPage)(CRenderContext*, FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,\n\t\t\t\t\t\tint rotate, int flags,FX_BOOL bNeedToRestore, IFSDK_PAUSE_Adapter * pause  ) = FPDF_RenderPage_Retail;\n\n#if defined(_DEBUG) || defined(DEBUG)\n#define DEBUG_TRACE\n#endif\n\n#if defined(_WIN32)\nDLLEXPORT void STDCALL FPDF_RenderPage(HDC dc, FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,\n\t\t\t\t\t\tint rotate, int flags)\n{\n\tif (page==NULL) return;\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\n\tCRenderContext* pContext = FX_NEW CRenderContext;\n\tpPage->SetPrivateData((void*)1, pContext, DropContext);\n\n#ifndef _WIN32_WCE\n\tCFX_DIBitmap* pBitmap = NULL;\n\tFX_BOOL bBackgroundAlphaNeeded=FALSE;\n\tbBackgroundAlphaNeeded = pPage->BackgroundAlphaNeeded();\n\tif (bBackgroundAlphaNeeded)\n\t{\n\t\t\n\t\tpBitmap = FX_NEW CFX_DIBitmap;\n\t\tpBitmap->Create(size_x, size_y, FXDIB_Argb);\n\t\tpBitmap->Clear(0x00ffffff);\n#ifdef _SKIA_SUPPORT_\n\t\tpContext->m_pDevice = FX_NEW CFX_SkiaDevice;\n\t\t((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)pBitmap);\n#else\n\t\tpContext->m_pDevice = FX_NEW CFX_FxgeDevice;\n\t\t((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)pBitmap);\n#endif\n\t}\n\telse\n\t    pContext->m_pDevice = FX_NEW CFX_WindowsDevice(dc);\n\tif (flags & FPDF_NO_CATCH)\n\t\tFunc_RenderPage(pContext, page, start_x, start_y, size_x, size_y, rotate, flags,TRUE,NULL);\n\telse {\n\t\ttry {\n\t\t\tFunc_RenderPage(pContext, page, start_x, start_y, size_x, size_y, rotate, flags,TRUE,NULL);\n\t\t} catch (...) {\n\t\t}\n\t}\n\tif (bBackgroundAlphaNeeded) \n\t{\n\t\tif (pBitmap)\n\t\t{\n\t\t\tCFX_WindowsDevice WinDC(dc);\n\t\t\t\n \t\t\tif (WinDC.GetDeviceCaps(FXDC_DEVICE_CLASS) == FXDC_PRINTER)\n \t\t\t{\n\t\t\t\tCFX_DIBitmap* pDst = FX_NEW CFX_DIBitmap;\n\t\t\t\tpDst->Create(pBitmap->GetWidth(), pBitmap->GetHeight(),FXDIB_Rgb32);\n\t\t\t\tFXSYS_memcpy(pDst->GetBuffer(), pBitmap->GetBuffer(), pBitmap->GetPitch()*pBitmap->GetHeight());\n//\t\t\t\tWinDC.SetDIBits(pDst,0,0);\n\t\t\t\tWinDC.StretchDIBits(pDst,0,0,size_x,size_y);\n\t\t\t\tdelete pDst;\n \t\t\t}\n \t\t\telse\n \t\t\t\tWinDC.SetDIBits(pBitmap,0,0);\n\n\t\t}\n\t}\n#else\n\t// get clip region\n\tRECT rect, cliprect;\n\trect.left = start_x;\n\trect.top = start_y;\n\trect.right = start_x + size_x;\n\trect.bottom = start_y + size_y;\n\tGetClipBox(dc, &cliprect);\n\tIntersectRect(&rect, &rect, &cliprect);\n\tint width = rect.right - rect.left;\n\tint height = rect.bottom - rect.top;\n\n#ifdef DEBUG_TRACE\n\t{\n\t\tchar str[128];\n\t\tsprintf(str, \"Rendering DIB %d x %d\", width, height);\n\t\tCPDF_ModuleMgr::Get()->ReportError(999, str);\n\t}\n#endif\n\n\t// Create a DIB section\n\tLPVOID pBuffer;\n\tBITMAPINFOHEADER bmih;\n\tFXSYS_memset(&bmih, 0, sizeof bmih);\n\tbmih.biSize = sizeof bmih;\n\tbmih.biBitCount = 24;\n\tbmih.biHeight = -height;\n\tbmih.biPlanes = 1;\n\tbmih.biWidth = width;\n\tpContext->m_hBitmap = CreateDIBSection(dc, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, &pBuffer, NULL, 0);\n\tif (pContext->m_hBitmap == NULL) {\n#if defined(DEBUG) || defined(_DEBUG)\n\t\tchar str[128];\n\t\tsprintf(str, \"Error CreateDIBSection: %d x %d, error code = %d\", width, height, GetLastError());\n\t\tCPDF_ModuleMgr::Get()->ReportError(FPDFERR_OUT_OF_MEMORY, str);\n#else\n\t\tCPDF_ModuleMgr::Get()->ReportError(FPDFERR_OUT_OF_MEMORY, NULL);\n#endif\n\t}\n\tFXSYS_memset(pBuffer, 0xff, height*((width*3+3)/4*4));\n\n#ifdef DEBUG_TRACE\n\t{\n\t\tCPDF_ModuleMgr::Get()->ReportError(999, \"DIBSection created\");\n\t}\n#endif\n\n\t// Create a device with this external buffer\n\tpContext->m_pBitmap = FX_NEW CFX_DIBitmap;\n\tpContext->m_pBitmap->Create(width, height, FXDIB_Rgb, (FX_LPBYTE)pBuffer);\n\tpContext->m_pDevice = FX_NEW CPDF_FxgeDevice;\n\t((CPDF_FxgeDevice*)pContext->m_pDevice)->Attach(pContext->m_pBitmap);\n\t\n#ifdef DEBUG_TRACE\n\tCPDF_ModuleMgr::Get()->ReportError(999, \"Ready for PDF rendering\");\n#endif\n\n\t// output to bitmap device\n\tif (flags & FPDF_NO_CATCH)\n\t\tFunc_RenderPage(pContext, page, start_x - rect.left, start_y - rect.top, size_x, size_y, rotate, flags);\n\telse {\n\t\ttry {\n\t\t\tFunc_RenderPage(pContext, page, start_x - rect.left, start_y - rect.top, size_x, size_y, rotate, flags);\n\t\t} catch (...) {\n\t\t}\n\t}\n\n#ifdef DEBUG_TRACE\n\tCPDF_ModuleMgr::Get()->ReportError(999, \"Finished PDF rendering\");\n#endif\n\n\t// Now output to real device\n\tHDC hMemDC = CreateCompatibleDC(dc);\n\tif (hMemDC == NULL) {\n#if defined(DEBUG) || defined(_DEBUG)\n\t\tchar str[128];\n\t\tsprintf(str, \"Error CreateCompatibleDC. Error code = %d\", GetLastError());\n\t\tCPDF_ModuleMgr::Get()->ReportError(FPDFERR_OUT_OF_MEMORY, str);\n#else\n\t\tCPDF_ModuleMgr::Get()->ReportError(FPDFERR_OUT_OF_MEMORY, NULL);\n#endif\n\t}\n\n\tHGDIOBJ hOldBitmap = SelectObject(hMemDC, pContext->m_hBitmap);\n\n#ifdef DEBUG_TRACE\n\tCPDF_ModuleMgr::Get()->ReportError(999, \"Ready for screen rendering\");\n#endif\n\n\tBitBlt(dc, rect.left, rect.top, width, height, hMemDC, 0, 0, SRCCOPY);\n\tSelectObject(hMemDC, hOldBitmap);\n\tDeleteDC(hMemDC);\n\n#ifdef DEBUG_TRACE\n\tCPDF_ModuleMgr::Get()->ReportError(999, \"Finished screen rendering\");\n#endif\n\n#endif\n\tif (bBackgroundAlphaNeeded)\n\t{\n\t\tif (pBitmap)\n\t\t\tdelete pBitmap;\n\t\tpBitmap = NULL;\n\t}\n\tdelete pContext;\n\tpPage->RemovePrivateData((void*)1);\n}\n#endif\n\nDLLEXPORT void STDCALL FPDF_RenderPageBitmap(FPDF_BITMAP bitmap, FPDF_PAGE page, int start_x, int start_y, \n\t\t\t\t\t\tint size_x, int size_y, int rotate, int flags)\n{\n\tif (bitmap == NULL || page == NULL) return;\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\n\n\tCRenderContext* pContext = FX_NEW CRenderContext;\n\tpPage->SetPrivateData((void*)1, pContext, DropContext);\n#ifdef _SKIA_SUPPORT_\n\tpContext->m_pDevice = FX_NEW CFX_SkiaDevice;\n\n\tif (flags & FPDF_REVERSE_BYTE_ORDER)\n\t\t((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap,0,TRUE);\n\telse\n\t\t((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap);\n#else\n\tpContext->m_pDevice = FX_NEW CFX_FxgeDevice;\n\n\tif (flags & FPDF_REVERSE_BYTE_ORDER)\n\t\t((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap,0,TRUE);\n\telse\n\t\t((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap);\n#endif\n\tif (flags & FPDF_NO_CATCH)\n\t\tFunc_RenderPage(pContext, page, start_x, start_y, size_x, size_y, rotate, flags,TRUE,NULL);\n\telse {\n\t\ttry {\n\t\t\tFunc_RenderPage(pContext, page, start_x, start_y, size_x, size_y, rotate, flags,TRUE,NULL);\n\t\t} catch (...) {\n\t\t}\n\t}\n\n\tdelete pContext;\n\tpPage->RemovePrivateData((void*)1);\n}\n\nDLLEXPORT void STDCALL FPDF_ClosePage(FPDF_PAGE page)\n{\n\tif (!page) return;\n\tdelete (CPDF_Page*)page;\n\n}\n\nDLLEXPORT void STDCALL FPDF_CloseDocument(FPDF_DOCUMENT document)\n{\n\tif (!document)\n\t\treturn;\n\tCPDF_Document* pDoc = (CPDF_Document*)document;\t\n\tCPDF_Parser* pParser = (CPDF_Parser*)pDoc->GetParser();\n\tif (pParser == NULL) \n\t{\n\t\tdelete pDoc;\n\t\treturn;\n\t}\n\tdelete pParser;\n//\tdelete pDoc;\n}\n\nDLLEXPORT unsigned long STDCALL FPDF_GetLastError()\n{\n\treturn GetLastError();\n}\n\nDLLEXPORT void STDCALL FPDF_DeviceToPage(FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,\n\t\t\t\t\t\tint rotate, int device_x, int device_y, double* page_x, double* page_y)\n{\n\tif (page == NULL || page_x == NULL || page_y == NULL) return;\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\n\tCPDF_Matrix page2device;\n\tpPage->GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, rotate);\n\tCPDF_Matrix device2page;\n\tdevice2page.SetReverse(page2device);\n\n\tFX_FLOAT page_x_f, page_y_f;\n\tdevice2page.Transform((FX_FLOAT)(device_x), (FX_FLOAT)(device_y), page_x_f, page_y_f);\n\n\t*page_x = (page_x_f);\n\t*page_y = (page_y_f);\n}\n\nDLLEXPORT void STDCALL FPDF_PageToDevice(FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,\n\t\t\t\t\t\tint rotate, double page_x, double page_y, int* device_x, int* device_y)\n{\n\tif (page == NULL || device_x == NULL || device_y == NULL) return;\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\n\tCPDF_Matrix page2device;\n\tpPage->GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, rotate);\n\n\tFX_FLOAT device_x_f, device_y_f;\n\tpage2device.Transform(((FX_FLOAT)page_x), ((FX_FLOAT)page_y), device_x_f, device_y_f);\n\n\t*device_x = FXSYS_round(device_x_f);\n\t*device_y = FXSYS_round(device_y_f);\n}\n\nDLLEXPORT FPDF_BITMAP STDCALL FPDFBitmap_Create(int width, int height, int alpha)\n{\n\tCFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;\n\tpBitmap->Create(width, height, alpha ? FXDIB_Argb : FXDIB_Rgb32);\n\treturn pBitmap;\n}\n\nDLLEXPORT FPDF_BITMAP STDCALL FPDFBitmap_CreateEx(int width, int height, int format, void* first_scan, int stride)\n{\n\tFXDIB_Format fx_format;\n\tswitch (format) {\n\t\tcase FPDFBitmap_Gray:\n\t\t\tfx_format = FXDIB_8bppRgb;\n\t\t\tbreak;\n\t\tcase FPDFBitmap_BGR:\n\t\t\tfx_format = FXDIB_Rgb;\n\t\t\tbreak;\n\t\tcase FPDFBitmap_BGRx:\n\t\t\tfx_format = FXDIB_Rgb32;\n\t\t\tbreak;\n\t\tcase FPDFBitmap_BGRA:\n\t\t\tfx_format = FXDIB_Argb;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\treturn NULL;\n\t}\n\tCFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;\n\tpBitmap->Create(width, height, fx_format, (FX_LPBYTE)first_scan, stride);\n\treturn pBitmap;\n}\n\nDLLEXPORT void STDCALL FPDFBitmap_FillRect(FPDF_BITMAP bitmap, int left, int top, int width, int height, FPDF_DWORD color)\n{\n\tif (bitmap == NULL) return;\n#ifdef _SKIA_SUPPORT_\n\tCFX_SkiaDevice device;\n#else\n\tCFX_FxgeDevice device;\n#endif\n\tdevice.Attach((CFX_DIBitmap*)bitmap);\n\tif (!((CFX_DIBitmap*)bitmap)->HasAlpha()) color |= 0xFF000000;\n\tFX_RECT rect(left, top, left+width, top+height);\n\tdevice.FillRect(&rect, color);\n}\n\nDLLEXPORT void* STDCALL FPDFBitmap_GetBuffer(FPDF_BITMAP bitmap)\n{\n\tif (bitmap == NULL) return NULL;\n\treturn ((CFX_DIBitmap*)bitmap)->GetBuffer();\n}\n\nDLLEXPORT int STDCALL FPDFBitmap_GetWidth(FPDF_BITMAP bitmap)\n{\n\tif (bitmap == NULL) return 0;\n\treturn ((CFX_DIBitmap*)bitmap)->GetWidth();\n}\n\nDLLEXPORT int STDCALL FPDFBitmap_GetHeight(FPDF_BITMAP bitmap)\n{\n\tif (bitmap == NULL) return 0;\n\treturn ((CFX_DIBitmap*)bitmap)->GetHeight();\n}\n\nDLLEXPORT int STDCALL FPDFBitmap_GetStride(FPDF_BITMAP bitmap)\n{\n\tif (bitmap == NULL) return 0;\n\treturn ((CFX_DIBitmap*)bitmap)->GetPitch();\n}\n\nDLLEXPORT void STDCALL FPDFBitmap_Destroy(FPDF_BITMAP bitmap)\n{\n\tif (bitmap == NULL) return;\n\tdelete (CFX_DIBitmap*)bitmap;\n}\n\nvoid FPDF_RenderPage_Retail(CRenderContext* pContext, FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,\n\t\t\t\t\t\tint rotate, int flags,FX_BOOL bNeedToRestore, IFSDK_PAUSE_Adapter * pause )\n{\n//#ifdef _LICENSED_BUILD_\n\tCPDF_Page* pPage = (CPDF_Page*)page;\n\tif (pPage == NULL) return;\n\n\tif (!pContext->m_pOptions)\n\t\tpContext->m_pOptions = new CPDF_RenderOptions;\n//\tCPDF_RenderOptions options;\n\tif (flags & FPDF_LCD_TEXT)\n\t\tpContext->m_pOptions->m_Flags |= RENDER_CLEARTYPE;\n\telse\n\t\tpContext->m_pOptions->m_Flags &= ~RENDER_CLEARTYPE;\n\tif (flags & FPDF_NO_NATIVETEXT)\n\t\tpContext->m_pOptions->m_Flags |= RENDER_NO_NATIVETEXT;\n\tif (flags & FPDF_RENDER_LIMITEDIMAGECACHE)\n\t\tpContext->m_pOptions->m_Flags |= RENDER_LIMITEDIMAGECACHE;\n\tif (flags & FPDF_RENDER_FORCEHALFTONE)\n\t\tpContext->m_pOptions->m_Flags |= RENDER_FORCE_HALFTONE;\n\t//Grayscale output\n\tif (flags & FPDF_GRAYSCALE)\n\t{\n\t\tpContext->m_pOptions->m_ColorMode = RENDER_COLOR_GRAY;\n\t\tpContext->m_pOptions->m_ForeColor = 0;\n\t\tpContext->m_pOptions->m_BackColor = 0xffffff;\n\t}\n\tconst CPDF_OCContext::UsageType usage = (flags & FPDF_PRINTING) ? CPDF_OCContext::Print : CPDF_OCContext::View;\n\n\tpContext->m_pOptions->m_AddFlags = flags >> 8;\n\n\tpContext->m_pOptions->m_pOCContext = new CPDF_OCContext(pPage->m_pDocument, usage);\n\n\n\tCFX_AffineMatrix matrix;\n\tpPage->GetDisplayMatrix(matrix, start_x, start_y, size_x, size_y, rotate); \n\n\tFX_RECT clip;\n\tclip.left = start_x;\n\tclip.right = start_x + size_x;\n\tclip.top = start_y;\n\tclip.bottom = start_y + size_y;\n\tpContext->m_pDevice->SaveState();\n\tpContext->m_pDevice->SetClip_Rect(&clip);\n\n\tpContext->m_pContext = FX_NEW CPDF_RenderContext;\n\tpContext->m_pContext->Create(pPage);\n\tpContext->m_pContext->AppendObjectList(pPage, &matrix);\n\n\tif (flags & FPDF_ANNOT) {\n\t\tpContext->m_pAnnots = FX_NEW CPDF_AnnotList(pPage);\n\t\tFX_BOOL bPrinting = pContext->m_pDevice->GetDeviceClass() != FXDC_DISPLAY;\n\t\tpContext->m_pAnnots->DisplayAnnots(pPage, pContext->m_pContext, bPrinting, &matrix, TRUE, NULL);\n\t}\n\n\tpContext->m_pRenderer = FX_NEW CPDF_ProgressiveRenderer;\n\tpContext->m_pRenderer->Start(pContext->m_pContext, pContext->m_pDevice, pContext->m_pOptions, pause);\n\tif (bNeedToRestore)\n\t{\n\t  pContext->m_pDevice->RestoreState();\n\t}\n\t\n//#endif\n}\n\nDLLEXPORT int STDCALL FPDF_GetPageSizeByIndex(FPDF_DOCUMENT document, int page_index, double* width, double* height)\n{\n\tCPDF_Document* pDoc = (CPDF_Document*)document;\n\tif(pDoc == NULL)\n\t\treturn FALSE;\n\n\tCPDF_Dictionary* pDict = pDoc->GetPage(page_index);\n\tif (pDict == NULL) return FALSE;\n\n\tCPDF_Page page;\n\tpage.Load(pDoc, pDict);\n\t*width = page.GetPageWidth();\n\t*height = page.GetPageHeight();\n\n\treturn TRUE;\n}\n\nDLLEXPORT FPDF_BOOL STDCALL FPDF_VIEWERREF_GetPrintScaling(FPDF_DOCUMENT document)\n{\n\tCPDF_Document* pDoc = (CPDF_Document*)document;\n\tif (!pDoc) return TRUE;\n\tCPDF_ViewerPreferences viewRef(pDoc);\n\treturn viewRef.PrintScaling();\n}\n\nDLLEXPORT int STDCALL FPDF_VIEWERREF_GetNumCopies(FPDF_DOCUMENT document)\n{\n    CPDF_Document* pDoc = (CPDF_Document*)document;\n    if (!pDoc) return 1;\n    CPDF_ViewerPreferences viewRef(pDoc);\n    return viewRef.NumCopies();\n}\n\nDLLEXPORT FPDF_PAGERANGE STDCALL FPDF_VIEWERREF_GetPrintPageRange(FPDF_DOCUMENT document)\n{\n    CPDF_Document* pDoc = (CPDF_Document*)document;\n    if (!pDoc) return NULL;\n    CPDF_ViewerPreferences viewRef(pDoc);\n    return viewRef.PrintPageRange();\n}\n\nDLLEXPORT FPDF_DUPLEXTYPE STDCALL FPDF_VIEWERREF_GetDuplex(FPDF_DOCUMENT document)\n{\n    CPDF_Document* pDoc = (CPDF_Document*)document;\n    if (!pDoc) return DuplexUndefined;\n    CPDF_ViewerPreferences viewRef(pDoc);\n    CFX_ByteString duplex = viewRef.Duplex();\n    if (FX_BSTRC(\"Simplex\") == duplex)\n        return Simplex;\n    if (FX_BSTRC(\"DuplexFlipShortEdge\") == duplex)\n        return DuplexFlipShortEdge;\n    if (FX_BSTRC(\"DuplexFlipLongEdge\") == duplex)\n        return DuplexFlipLongEdge;\n    return DuplexUndefined;\n}\n\nDLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDestByName(FPDF_DOCUMENT document,FPDF_BYTESTRING name)\n{\n\tif (document == NULL)\n\t\treturn NULL;\n\tif (name == NULL || name[0] == 0) \n\t\treturn NULL;\n\n\tCPDF_Document* pDoc = (CPDF_Document*)document;\n\tCPDF_NameTree name_tree(pDoc, FX_BSTRC(\"Dests\"));\n\treturn name_tree.LookupNamedDest(pDoc, name);\n}\n"
  },
  {
    "path": "fpdfsdk/src/fsdk_actionhandler.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../include/fsdk_define.h\"\n#include \"../include/fsdk_mgr.h\"\n#include \"../include/fsdk_actionhandler.h\"\n//#include \"../include/javascript/IJavaScript.h\"\n\n/* -------------------------- CBA_ActionHandler -------------------------- */\n\nCPDFSDK_ActionHandler::CPDFSDK_ActionHandler(CPDFDoc_Environment* pEvi) : \n\tm_pEvi(pEvi),\n\tm_pFormActionHandler(NULL),\n\tm_pMediaActionHandler(NULL)\n{\n\t\tm_pFormActionHandler = new CPDFSDK_FormActionHandler;\n}\n\nCPDFSDK_ActionHandler::~CPDFSDK_ActionHandler()\n{\n\tif(m_pFormActionHandler)\n\t{\n\t\tdelete m_pFormActionHandler;\n\t\tm_pFormActionHandler = NULL;\n\t}\n}\n\nvoid CPDFSDK_ActionHandler::SetFormActionHandler(CPDFSDK_FormActionHandler* pHandler)\n{\n\tASSERT(pHandler != NULL);\n\tASSERT(m_pFormActionHandler == NULL);\n\tm_pFormActionHandler = pHandler;\n}\n\nvoid CPDFSDK_ActionHandler::SetMediaActionHandler(CPDFSDK_MediaActionHandler* pHandler)\n{\n\tASSERT(pHandler != NULL);\n\tASSERT(m_pMediaActionHandler == NULL);\n\tm_pMediaActionHandler = pHandler;\n}\n\nvoid CPDFSDK_ActionHandler::Destroy()\n{\n\tdelete this;\n}\n\n//document open\nFX_BOOL\tCPDFSDK_ActionHandler::DoAction_DocOpen(const CPDF_Action& action, CPDFSDK_Document* pDocument\n\t\t\t\t\t\t\t\t\t\t\t\t/*CReader_Document* pDocument, CReader_DocView *pDocView*/)\n{\n\tCFX_PtrList list;\n\treturn ExecuteDocumentOpenAction(action, pDocument, /*pDocView, */list);\n}\n\n//document open\nFX_BOOL\tCPDFSDK_ActionHandler::DoAction_JavaScript(const CPDF_Action& JsAction,CFX_WideString csJSName,\n\t\t\t\t\t\t\tCPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/)\n{\n\tif (JsAction.GetType() == CPDF_Action::JavaScript)\n\t{\n        /*\n\t\tCFX_WideString swJS = JsAction.GetJavaScript();\n\t\tif (!swJS.IsEmpty())\n\t\t{\n\t\t\tRunDocumentOpenJavaScript(pDocument, csJSName, swJS);\n\t\t\treturn TRUE;\n\t\t}\n        */\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL\tCPDFSDK_ActionHandler::DoAction_FieldJavaScript(const CPDF_Action& JsAction, CPDF_AAction::AActionType type, \n\t\t\t\t\t\t\t\t\tCPDFSDK_Document* pDocument, CPDF_FormField* pFormField, \n\t\t\t\t\t\t\t\t\tPDFSDK_FieldAction& data)\n{\n    /*\n\tCPDFDoc_Environment* pEnv = pDocument->GetEnv();\n\tASSERT(pEnv);\n\tif (pEnv->IsJSInitiated() && JsAction.GetType() == CPDF_Action::JavaScript)\n\t{\n\t\tCFX_WideString swJS = JsAction.GetJavaScript();\n\t\tif (!swJS.IsEmpty())\n\t\t{\n\t\t\tRunFieldJavaScript(pDocument, pFormField, type, data, swJS);\n\t\t\treturn TRUE;\n\t\t}\n\t}\n    */\n\treturn FALSE;\n}\n\nFX_BOOL\tCPDFSDK_ActionHandler::DoAction_Page(const CPDF_Action& action, enum CPDF_AAction::AActionType eType,\n\t\t\t\t\t\t\t\t\t\tCPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/)\n{\n\tCFX_PtrList list;\n\treturn ExecuteDocumentPageAction(action, eType, pDocument,/* pDocView,*/ list);\n}\n\nFX_BOOL\tCPDFSDK_ActionHandler::DoAction_Document(const CPDF_Action& action, enum CPDF_AAction::AActionType eType,\n\t\t\t\t\t\t\t\t\t\t\t CPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/)\n{\n\tCFX_PtrList list;\n\treturn ExecuteDocumentPageAction(action, eType, pDocument,/* pDocView,*/ list);\n}\n\nFX_BOOL\tCPDFSDK_ActionHandler::DoAction_BookMark(CPDF_Bookmark *pBookMark, const CPDF_Action& action, CPDF_AAction::AActionType type, \n\t\t\t\t\t\t\tCPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/)\n{\n\tCFX_PtrList list;\n\treturn this->ExecuteBookMark(action, pDocument,/* pDocView,*/ pBookMark, list);\n}\n\nFX_BOOL\tCPDFSDK_ActionHandler::DoAction_Screen(const CPDF_Action& action, CPDF_AAction::AActionType type, \n\t\t\t\t\t\t\t\t\t\tCPDFSDK_Document* pDocument,/* CReader_DocView *pDocView,*/ CPDFSDK_Annot* pScreen)\n{\n\tCFX_PtrList list;\n\treturn this->ExecuteScreenAction(action, type, pDocument,/* pDocView,*/ pScreen, list);\n}\n\nFX_BOOL\tCPDFSDK_ActionHandler::DoAction_Link(const CPDF_Action& action, \n\t\t\t\t\t\t\t\t\t\tCPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/)\n{\n\tCFX_PtrList list;\n\treturn ExecuteLinkAction(action, pDocument,/* pDocView,*/ list);\n}\n\nFX_BOOL\tCPDFSDK_ActionHandler::DoAction_Field(const CPDF_Action& action, CPDF_AAction::AActionType type, \n\t\t\t\t\t\t\t\t\t\tCPDFSDK_Document* pDocument,/* CReader_DocView *pDocView,*/ \n\t\t\t\t\t\t\t\t\t\tCPDF_FormField* pFormField, PDFSDK_FieldAction& data)\n{\n\tCFX_PtrList list;\n\treturn ExecuteFieldAction(action, type, pDocument,/* pDocView,*/ pFormField, data, list);\n}\n\nFX_BOOL\tCPDFSDK_ActionHandler::ExecuteDocumentOpenAction(const CPDF_Action& action, CPDFSDK_Document* pDocument,\n\t\t\t\t\t\t\t\t\t\t\t\t\t /*CReader_DocView *pDocView,*/ CFX_PtrList& list)\n{\n\tASSERT(pDocument != NULL);\n\n\tif (list.Find((CPDF_Dictionary*)action))\n\t\treturn FALSE;\n\tlist.AddTail((CPDF_Dictionary*)action);\n\n\tCPDFDoc_Environment* pEnv = pDocument->GetEnv();\n\tASSERT(pEnv);\n\tif (action.GetType() == CPDF_Action::JavaScript)\n\t{\n        /*\n\t\tif(pEnv->IsJSInitiated())\n\t\t{\n\t\t\tCFX_WideString swJS = action.GetJavaScript();\n\t\t\tif (!swJS.IsEmpty())\n\t\t\t{\n\t\t\t\tRunDocumentOpenJavaScript(pDocument, L\"\", swJS);\n\t\t\t}\n\t\t}\n        */\n\t}\n\telse\n\t{\n\t\tDoAction_NoJs(action, pDocument/*, pDocView*/);\n\t}\n\n// \tif (!IsValidDocView(pDocument, pDocView))\n// \t\treturn FALSE;\n\n\tfor (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)\n\t{\n\t\tCPDF_Action subaction = action.GetSubAction(i);\n\t\tif (!ExecuteDocumentOpenAction(subaction, pDocument,/* pDocView,*/ list)) return FALSE;\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL CPDFSDK_ActionHandler::ExecuteLinkAction(const CPDF_Action& action,\tCPDFSDK_Document* pDocument,\n\t\t\t\t\t\t\t\t\t\t\t\t /*CReader_DocView* pDocView,*/ CFX_PtrList& list)\n{\n\tASSERT(pDocument != NULL);\n\n\tif (list.Find((CPDF_Dictionary*)action))\n\t\treturn FALSE;\n\tlist.AddTail((CPDF_Dictionary*)action);\n\n\tCPDFDoc_Environment* pEnv = pDocument->GetEnv();\n\tASSERT(pEnv);\n\tif (action.GetType() == CPDF_Action::JavaScript)\n\t{\n        /*\n\t\tif(pEnv->IsJSInitiated())\n\t\t{\n\t\t\tCFX_WideString swJS = action.GetJavaScript();\n\t\t\tif (!swJS.IsEmpty())\n\t\t\t{\n\t\t\t\tIFXJS_Runtime* pRuntime = pDocument->GetJsRuntime(); //????\n\t\t\t\tASSERT(pRuntime != NULL);\n\n\t\t\t\tpRuntime->SetReaderDocument(pDocument);\n\n\t\t\t\tIFXJS_Context* pContext = pRuntime->NewContext();\n\t\t\t\tASSERT(pContext != NULL);\n\n\t\t\t\tpContext->OnLink_MouseUp(pDocument);\n\n\t\t\t\tCFX_WideString csInfo;\n\t\t\t\tFX_BOOL bRet = pContext->RunScript(swJS, csInfo);\n\t\t\t\tif (!bRet)\n\t\t\t\t{\n\t\t\t\t\t//CBCL_FormNotify::MsgBoxJSError(pPageView->GetPageViewWnd(), csInfo);\n\t\t\t\t}\n\n\t\t\t\tpRuntime->ReleaseContext(pContext);\n\t\t\t}\n\t\t}\n        */\n\t}\n\telse\n\t{\n\t\tDoAction_NoJs(action, pDocument/*, pDocView*/);\n\t}\n\n// \tif (!IsValidDocView(pDocument, pDocView))\n// \t\treturn FALSE;\n\n\tfor (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)\n\t{\n\t\tCPDF_Action subaction = action.GetSubAction(i);\n\t\tif (!ExecuteLinkAction(subaction, pDocument,/* pDocView,*/ list)) return FALSE;\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL\tCPDFSDK_ActionHandler::ExecuteDocumentPageAction(const CPDF_Action& action, CPDF_AAction::AActionType type,\n\t\t\t\t\t\t\t\t\t\t\t\t CPDFSDK_Document* pDocument,/* CReader_DocView* pDocView,*/ CFX_PtrList& list)\n{\n\tASSERT(pDocument != NULL);\n\n\tif (list.Find((CPDF_Dictionary*)action))\n\t\treturn FALSE;\n\tlist.AddTail((CPDF_Dictionary*)action);\n\n\tCPDFDoc_Environment* pEnv = pDocument->GetEnv();\n\tASSERT(pEnv);\n\tif (action.GetType() == CPDF_Action::JavaScript)\n\t{\n        /*\n\t\tif(pEnv->IsJSInitiated())\n\t\t{\n\t\t\tCFX_WideString swJS = action.GetJavaScript();\n\t\t\tif (!swJS.IsEmpty())\n\t\t\t{\n\t\t\t\tRunDocumentPageJavaScript(pDocument, type, swJS);\n\t\t\t}\n\t\t}\n        */\n\t}\n\telse\n\t{\n\t\tDoAction_NoJs(action, pDocument/*, pDocView*/);\n\t}\n\n\tif (!IsValidDocView(pDocument/*, pDocView*/))\n\t\treturn FALSE;\n\n\tfor (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)\n\t{\n\t\tCPDF_Action subaction = action.GetSubAction(i);\n\t\tif (!ExecuteDocumentPageAction(subaction, type, pDocument,/* pDocView,*/ list)) return FALSE;\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL\tCPDFSDK_ActionHandler::IsValidField(CPDFSDK_Document* pDocument, CPDF_Dictionary* pFieldDict)\n{\n\tASSERT(m_pEvi != NULL);\n\tASSERT(pDocument != NULL);\n\tASSERT(pFieldDict != NULL);\n\n\tif (1/*m_pApp->IsValidDocument(pDocument)*/)\n\t{\n\t\tCPDFSDK_InterForm* pInterForm = pDocument->GetInterForm();\n\t\tASSERT(pInterForm != NULL);\n\n\t\tCPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();\n\t\tASSERT(pPDFInterForm != NULL);\n\n\t\treturn pPDFInterForm->GetFieldByDict(pFieldDict) != NULL;\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL\tCPDFSDK_ActionHandler::ExecuteFieldAction(const CPDF_Action& action, CPDF_AAction::AActionType type, \n\t\t\t\t\t\t\t\t\t\t  CPDFSDK_Document* pDocument,/* CReader_DocView* pDocView,*/ CPDF_FormField* pFormField, \n\t\t\t\t\t\t\t\t\t\t  PDFSDK_FieldAction& data, CFX_PtrList& list)\n{\n\tASSERT(pDocument != NULL);\n\n\tif (list.Find((CPDF_Dictionary*)action))\n\t\treturn FALSE;\n\tlist.AddTail((CPDF_Dictionary*)action);\n\n\tCPDFDoc_Environment* pEnv = pDocument->GetEnv();\n\tASSERT(pEnv);\n\tif (action.GetType() == CPDF_Action::JavaScript)\n\t{\n        /*\n\t\tif(pEnv->IsJSInitiated())\n\t\t{\n\t\t\tCFX_WideString swJS = action.GetJavaScript();\n\t\t\tif (!swJS.IsEmpty())\n\t\t\t{\n\t\t\t\tRunFieldJavaScript(pDocument, pFormField, type, data, swJS);\n\t\t\t\tif (!IsValidField(pDocument, pFormField->GetFieldDict()))\n\t\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n        */\n\t}\n\telse\n\t{\n\t\tDoAction_NoJs(action, pDocument/*, pDocView*/);\n// \t\tif (!IsValidDocView(pDocument, pDocView))\n// \t\t\treturn FALSE;\n\t}\n\n\tfor (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)\n\t{\n\t\tCPDF_Action subaction = action.GetSubAction(i);\n\t\tif (!ExecuteFieldAction(subaction, type, pDocument,/* pDocView,*/ pFormField, data, list)) return FALSE;\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL CPDFSDK_ActionHandler::ExecuteScreenAction(const CPDF_Action& action, CPDF_AAction::AActionType type, \n\t\t\t\t\t\t\t\t\t\tCPDFSDK_Document* pDocument,/* CReader_DocView* pDocView,*/ CPDFSDK_Annot* pScreen, CFX_PtrList& list)\n{\n\tASSERT(pDocument != NULL);\n\n\tif (list.Find((CPDF_Dictionary*)action))\n\t\treturn FALSE;\n\tlist.AddTail((CPDF_Dictionary*)action);\n\n\tCPDFDoc_Environment* pEnv = pDocument->GetEnv();\n\tASSERT(pEnv);\n\tif (action.GetType() == CPDF_Action::JavaScript)\n\t{\n        /*\n\t\tif(pEnv->IsJSInitiated())\n\t\t{\n\t\t\tCFX_WideString swJS = action.GetJavaScript();\n\t\t\tif (!swJS.IsEmpty())\n\t\t\t{\n\t\t\t\tIFXJS_Runtime* pRuntime = pDocument->GetJsRuntime();\n\t\t\t\tASSERT(pRuntime != NULL);\n\n\t\t\t\tpRuntime->SetReaderDocument(pDocument);\n\n\t\t\t\tIFXJS_Context* pContext = pRuntime->NewContext();\n\t\t\t\tASSERT(pContext != NULL);\n\n\t// \t\t\tswitch (type)\n\t// \t\t\t{\n\t// \t\t\tcase CPDF_AAction::CursorEnter:\n\t// \t\t\t\tpContext->OnScreen_MouseEnter(IsCTRLpressed(), IsSHIFTpressed(), pScreen);\n\t// \t\t\t\tbreak;\n\t// \t\t\tcase CPDF_AAction::CursorExit:\n\t// \t\t\t\tpContext->OnScreen_MouseExit(IsCTRLpressed(), IsSHIFTpressed(), pScreen);\n\t// \t\t\t\tbreak;\n\t// \t\t\tcase CPDF_AAction::ButtonDown:\n\t// \t\t\t\tpContext->OnScreen_MouseDown(IsCTRLpressed(), IsSHIFTpressed(), pScreen);\n\t// \t\t\t\tbreak;\n\t// \t\t\tcase CPDF_AAction::ButtonUp:\n\t// \t\t\t\tpContext->OnScreen_MouseUp(IsCTRLpressed(), IsSHIFTpressed(), pScreen);\n\t// \t\t\t\tbreak;\n\t// \t\t\tcase CPDF_AAction::GetFocus:\n\t// \t\t\t\tpContext->OnScreen_Focus(IsCTRLpressed(), IsSHIFTpressed(), pScreen);\n\t// \t\t\t\tbreak;\n\t// \t\t\tcase CPDF_AAction::LoseFocus:\n\t// \t\t\t\tpContext->OnScreen_Blur(IsCTRLpressed(), IsSHIFTpressed(), pScreen);\n\t// \t\t\t\tbreak;\n\t// \t\t\tcase CPDF_AAction::PageOpen:\n\t// \t\t\t\tpContext->OnScreen_Open(IsCTRLpressed(), IsSHIFTpressed(), pScreen);\n\t// \t\t\t\tbreak;\n\t// \t\t\tcase CPDF_AAction::PageClose:\n\t// \t\t\t\tpContext->OnScreen_Close(IsCTRLpressed(), IsSHIFTpressed(), pScreen);\n\t// \t\t\t\tbreak;\n\t// \t\t\tcase CPDF_AAction::PageVisible:\n\t// \t\t\t\tpContext->OnScreen_InView(IsCTRLpressed(), IsSHIFTpressed(), pScreen);\n\t// \t\t\t\tbreak;\n\t// \t\t\tcase CPDF_AAction::PageInvisible:\n\t// \t\t\t\tpContext->OnScreen_OutView(IsCTRLpressed(), IsSHIFTpressed(), pScreen);\n\t// \t\t\t\tbreak;\n\t// \t\t\tdefault:\n\t// \t\t\t\tASSERT(FALSE);\n\t// \t\t\t\tbreak;\n\t// \t\t\t}\n\n\t\t\t\tCFX_WideString csInfo;\n\t\t\t\tFX_BOOL bRet = pContext->RunScript(swJS, csInfo);\n\t\t\t\tif (!bRet)\n\t\t\t\t{\n\t\t\t\t\t//CBCL_FormNotify::MsgBoxJSError(pPageView->GetPageViewWnd(), csInfo);\n\t\t\t\t}\n\n\t\t\t\tpRuntime->ReleaseContext(pContext);\n\t\t\t}\n\t\t}\n        */\n\t}\n\telse\n\t{\n\t\tDoAction_NoJs(action, pDocument/*, pDocView*/);\n\t}\n\n// \tif (!IsValidDocView(pDocument, pDocView))\n// \t\treturn FALSE;\n\n\tfor (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)\n\t{\n\t\tCPDF_Action subaction = action.GetSubAction(i);\n\t\tif (!ExecuteScreenAction(subaction, type, pDocument,/* pDocView,*/ pScreen, list)) return FALSE;\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL\tCPDFSDK_ActionHandler::ExecuteBookMark(const CPDF_Action& action, CPDFSDK_Document* pDocument, \n\t\t\t\t\t\t\t\t\t\t/*CReader_DocView* pDocView,*/ CPDF_Bookmark* pBookmark, CFX_PtrList& list)\n{\n\tASSERT(pDocument != NULL);\n\n\tif (list.Find((CPDF_Dictionary*)action))\n\t\treturn FALSE;\n\tlist.AddTail((CPDF_Dictionary*)action);\n\n\tCPDFDoc_Environment* pEnv = pDocument->GetEnv();\n\tASSERT(pEnv);\n\tif (action.GetType() == CPDF_Action::JavaScript)\n\t{\n        /*\n\t\tif(pEnv->IsJSInitiated())\n\t\t{\n\t\t\tCFX_WideString swJS = action.GetJavaScript();\n\t\t\tif (!swJS.IsEmpty())\n\t\t\t{\n\t\t\t\tIFXJS_Runtime* pRuntime = pDocument->GetJsRuntime();\n\t\t\t\tASSERT(pRuntime != NULL);\n\n\t\t\t\tpRuntime->SetReaderDocument(pDocument);\n\n\t\t\t\tIFXJS_Context* pContext = pRuntime->NewContext();\n\t\t\t\tASSERT(pContext != NULL);\n\n\t\t\t\tpContext->OnBookmark_MouseUp(pBookmark);\n\n\t\t\t\tCFX_WideString csInfo;\n\t\t\t\tFX_BOOL bRet = pContext->RunScript(swJS, csInfo);\n\t\t\t\tif (!bRet)\n\t\t\t\t{\n\t\t\t\t\t//CBCL_FormNotify::MsgBoxJSError(pPageView->GetPageViewWnd(), csInfo);\n\t\t\t\t}\n\n\t\t\t\tpRuntime->ReleaseContext(pContext);\n\t\t\t}\n\t\t}\n        */\n\t}\n\telse\n\t{\n\t\tDoAction_NoJs(action, pDocument/*, pDocView*/);\n\t}\n\n// \tif (!IsValidDocView(pDocument, pDocView))\n// \t\treturn FALSE;\n\n\tfor (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)\n\t{\n\t\tCPDF_Action subaction = action.GetSubAction(i);\n\t\tif (!ExecuteBookMark(subaction, pDocument,/* pDocView,*/ pBookmark, list)) return FALSE;\n\t}\n\n\treturn TRUE;\n}\n\nvoid CPDFSDK_ActionHandler::DoAction_NoJs(const CPDF_Action& action, CPDFSDK_Document* pDocument/*, CReader_DocView* pDocView*/)\n{\n\tASSERT(pDocument != NULL);\n\n\tswitch (action.GetType())\n\t{\n\tcase CPDF_Action::GoTo:\n\t\tDoAction_GoTo(pDocument,/* pDocView,*/ action);\n\t\tbreak;\n\tcase CPDF_Action::GoToR:\n\t\tDoAction_GoToR(pDocument, action);\n\t\tbreak;\n\tcase CPDF_Action::GoToE:\n\t\tbreak;\n\tcase CPDF_Action::Launch:\n\t\tDoAction_Launch(pDocument, action);\n\t\tbreak;\n\tcase CPDF_Action::Thread:\n\t\tbreak;\n\tcase CPDF_Action::URI:\n\t\tDoAction_URI(pDocument, action);\n\t\tbreak;\n\tcase CPDF_Action::Sound:\n\t\tif (m_pMediaActionHandler)\n\t\t{\n\t\t\tm_pMediaActionHandler->DoAction_Sound(action, pDocument/*, pDocView*/);\n\t\t}\n\t\tbreak;\n\tcase CPDF_Action::Movie:\n\t\tif (m_pMediaActionHandler)\n\t\t{\n\t\t\tm_pMediaActionHandler->DoAction_Movie(action, pDocument/*, pDocView*/);\n\t\t}\n\t\tbreak;\n\tcase CPDF_Action::Hide:\n\t\tif (m_pFormActionHandler)\n\t\t{\n\t\t\tm_pFormActionHandler->DoAction_Hide(action, pDocument);\n\t\t}\n\t\tbreak;\n\tcase CPDF_Action::Named:\n\t\tDoAction_Named(pDocument, action);\n\t\tbreak;\n\tcase CPDF_Action::SubmitForm:\n\t\tif (m_pFormActionHandler)\n\t\t{\n\t\t\tm_pFormActionHandler->DoAction_SubmitForm(action, pDocument/*, pDocView*/);\n\t\t}\n\t\tbreak;\n\tcase CPDF_Action::ResetForm:\n\t\tif (m_pFormActionHandler)\n\t\t{\n\t\t\tm_pFormActionHandler->DoAction_ResetForm(action, pDocument);\n\t\t}\n\t\tbreak;\n\tcase CPDF_Action::ImportData:\n\t\tif (m_pFormActionHandler)\n\t\t{\n\t\t\tm_pFormActionHandler->DoAction_ImportData(action, pDocument/*, pDocView*/);\n\t\t}\n\t\tbreak;\n\tcase CPDF_Action::JavaScript:\n\t\tASSERT(FALSE);\n\t\tbreak;\n\tcase CPDF_Action::SetOCGState:\n\t\tDoAction_SetOCGState(pDocument, /*pDocView,*/ action);\n\t\tbreak;\n\tcase CPDF_Action::Rendition:\n\t\tif (m_pMediaActionHandler)\n\t\t{\n\t\t\tm_pMediaActionHandler->DoAction_Rendition(action, pDocument/*, pDocView*/);\n\t\t}\n\t\tbreak;\n\tcase CPDF_Action::Trans:\n\t\tbreak;\n\tcase CPDF_Action::GoTo3DView:\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n}\n\nFX_BOOL\tCPDFSDK_ActionHandler::IsValidDocView(CPDFSDK_Document* pDocument/*, CReader_DocView* pDocView*/)\n{\n\tASSERT(pDocument != NULL);\n\t//ASSERT(pDocView != NULL);\n\n\t//return pDocument->IsValidDocView(pDocView);\n\treturn TRUE;\n}\n\nvoid CPDFSDK_ActionHandler::DoAction_GoTo(CPDFSDK_Document* pDocument, /*CReader_DocView* pDocView,*/\n\t\t\t\t\t\t\t\t  const CPDF_Action& action)\n{\n\tASSERT(pDocument != NULL);\n//\tASSERT(pDocView != NULL);\n\tASSERT(action != NULL);\n\n\tCPDF_Document* pPDFDocument = pDocument->GetDocument();\n\tASSERT(pPDFDocument != NULL);\n\tCPDFDoc_Environment* pApp = pDocument->GetEnv();\n\tASSERT(pApp != NULL);\n\n\tCPDF_Dest MyDest = action.GetDest(pPDFDocument);\n\tint nPageIndex = MyDest.GetPageIndex(pPDFDocument);\n\tint nFitType = MyDest.GetZoomMode();\n\tconst CPDF_Array * pMyArray = (CPDF_Array*)MyDest.m_pObj;\n\tfloat* pPosAry = NULL;\n\tint sizeOfAry = 0;\n\tif (pMyArray != NULL)\n\t{\n\t\tpPosAry = new float[pMyArray->GetCount()];\n\t\tint j = 0;\n\t\tfor (int i = 2; i < (int)pMyArray->GetCount(); i++)\n\t\t{\n\t\t\tpPosAry[j++] = pMyArray->GetFloat(i);\n\t\t}\n\t\tsizeOfAry = j;\n\t}\n\tpApp->FFI_DoGoToAction(nPageIndex, nFitType, pPosAry, sizeOfAry);\n\tif(pPosAry)\n\t\tdelete[] pPosAry;\n}\n\nvoid CPDFSDK_ActionHandler::DoAction_GoToR(CPDFSDK_Document* pDocument, const CPDF_Action& action)\n{\n\n}\n\nvoid CPDFSDK_ActionHandler::DoAction_Launch(CPDFSDK_Document* pDocument, const CPDF_Action& action)\n{\n\n}\n\nvoid CPDFSDK_ActionHandler::DoAction_URI(CPDFSDK_Document* pDocument, const CPDF_Action& action)\n{\n \tASSERT(pDocument != NULL);\n \tASSERT(action != NULL);\n\n \tCPDFDoc_Environment* pApp = pDocument->GetEnv();\n \tASSERT(pApp != NULL);\n \n \tCFX_ByteString sURI = action.GetURI(pDocument->GetDocument());\n \tpApp->FFI_DoURIAction(FX_LPCSTR(sURI));\n}\n\nvoid CPDFSDK_ActionHandler::DoAction_Named(CPDFSDK_Document* pDocument, const CPDF_Action& action)\n{\n \tASSERT(pDocument != NULL);\n \tASSERT(action != NULL);\n \n \tCFX_ByteString csName = action.GetNamedAction();\n \tpDocument->GetEnv()->FFI_ExecuteNamedAction(csName);\n}\n\n\nvoid CPDFSDK_ActionHandler::DoAction_SetOCGState(CPDFSDK_Document* pDocument,/* CReader_DocView* pDocView,*/ const CPDF_Action& action)\n{\n}\n\nvoid CPDFSDK_ActionHandler::RunFieldJavaScript(CPDFSDK_Document* pDocument, CPDF_FormField* pFormField, CPDF_AAction::AActionType type,\n\t\t\t\t\t\t\t\t\t\tPDFSDK_FieldAction& data, const CFX_WideString& script)\n{\n    /*\n\tASSERT(type != CPDF_AAction::Calculate);\n\tASSERT(type != CPDF_AAction::Format);\n\n\tASSERT(pDocument != NULL);\n\n\tIFXJS_Runtime* pRuntime = pDocument->GetJsRuntime();\n\tASSERT(pRuntime != NULL);\n\n\tpRuntime->SetReaderDocument(pDocument);\n\n\tIFXJS_Context* pContext = pRuntime->NewContext();\n\tASSERT(pContext != NULL);\n\n\tswitch (type)\n\t{\n\tcase CPDF_AAction::CursorEnter:\n\t\tpContext->OnField_MouseEnter(data.bModifier, data.bShift, pFormField);\n\t\tbreak;\n\tcase CPDF_AAction::CursorExit:\n\t\tpContext->OnField_MouseExit(data.bModifier, data.bShift, pFormField);\n\t\tbreak;\n\tcase CPDF_AAction::ButtonDown:\n\t\tpContext->OnField_MouseDown(data.bModifier, data.bShift, pFormField);\n\t\tbreak;\n\tcase CPDF_AAction::ButtonUp:\n\t\tpContext->OnField_MouseUp(data.bModifier, data.bShift, pFormField);\n\t\tbreak;\n\tcase CPDF_AAction::GetFocus:\n\t\tpContext->OnField_Focus(data.bModifier, data.bShift, pFormField, data.sValue);\n\t\tbreak;\n\tcase CPDF_AAction::LoseFocus:\n\t\tpContext->OnField_Blur(data.bModifier, data.bShift, pFormField, data.sValue);\n\t\tbreak;\n\tcase CPDF_AAction::KeyStroke:\n\t\tpContext->OnField_Keystroke(data.nCommitKey, data.sChange, data.sChangeEx, data.bKeyDown, \n\t\t\tdata.bModifier, data.nSelEnd, data.nSelStart, data.bShift, pFormField, data.sValue,\n\t\t\tdata.bWillCommit, data.bFieldFull, data.bRC);\n\t\tbreak;\n\tcase CPDF_AAction::Validate:\n\t\tpContext->OnField_Validate(data.sChange, data.sChangeEx, data.bKeyDown, data.bModifier,\n\t\t\tdata.bShift, pFormField, data.sValue, data.bRC);\n\t\tbreak;\n\tdefault:\n\t\tASSERT(FALSE);\n\t\tbreak;\n\t}\n\n\tCFX_WideString csInfo;\n\tFX_BOOL bRet = pContext->RunScript(script, csInfo);\n\tif (!bRet)\n\t{\n\t\t//CBCL_FormNotify::MsgBoxJSError(pPageView->GetPageViewWnd(), csInfo);\n\t}\n\n\tpRuntime->ReleaseContext(pContext);\n    */\n}\n\nvoid CPDFSDK_ActionHandler::RunDocumentOpenJavaScript(CPDFSDK_Document* pDocument, const CFX_WideString& sScriptName, const CFX_WideString& script)\n{\n    /*\n\tASSERT(pDocument != NULL);\n\n\tIFXJS_Runtime* pRuntime = pDocument->GetJsRuntime();\n\tASSERT(pRuntime != NULL);\n\n\tpRuntime->SetReaderDocument(pDocument);\n\n\tIFXJS_Context* pContext = pRuntime->NewContext();\n\tASSERT(pContext != NULL);\n\n\tpContext->OnDoc_Open(pDocument, sScriptName);\n\n\tCFX_WideString csInfo;\n\tFX_BOOL bRet = pContext->RunScript(script, csInfo);\n\tif (!bRet)\n\t{\n\t\t//CBCL_FormNotify::MsgBoxJSError(pPageView->GetPageViewWnd(), csInfo);\n\t}\n\n\tpRuntime->ReleaseContext(pContext);\n    */\n}\n\nvoid CPDFSDK_ActionHandler::RunDocumentPageJavaScript(CPDFSDK_Document* pDocument, CPDF_AAction::AActionType type, const CFX_WideString& script)\n{\n    /*\n\tASSERT(pDocument != NULL);\n\n\tIFXJS_Runtime* pRuntime = pDocument->GetJsRuntime();\n\tASSERT(pRuntime != NULL);\n\n\tpRuntime->SetReaderDocument(pDocument);\n\n\tIFXJS_Context* pContext = pRuntime->NewContext();\n\tASSERT(pContext != NULL);\n\n\tswitch (type)\n\t{\t\n\tcase CPDF_AAction::OpenPage:\n\t\tpContext->OnPage_Open(pDocument);\n\t\tbreak;\n\tcase CPDF_AAction::ClosePage:\n\t\tpContext->OnPage_Close(pDocument);\n\t\tbreak;\n\tcase CPDF_AAction::CloseDocument:\n\t\tpContext->OnDoc_WillClose(pDocument);\n\t\tbreak;\n\tcase CPDF_AAction::SaveDocument:\n\t\tpContext->OnDoc_WillSave(pDocument);\n\t\tbreak;\n\tcase CPDF_AAction::DocumentSaved:\n\t\tpContext->OnDoc_DidSave(pDocument);\n\t\tbreak;\n\tcase CPDF_AAction::PrintDocument:\n\t\tpContext->OnDoc_WillPrint(pDocument);\n\t\tbreak;\n\tcase CPDF_AAction::DocumentPrinted:\n\t\tpContext->OnDoc_DidPrint(pDocument);\n\t\tbreak;\n\tcase CPDF_AAction::PageVisible:\n\t\tpContext->OnPage_InView(pDocument);\n\t\tbreak;\n\tcase CPDF_AAction::PageInvisible:\n\t\tpContext->OnPage_OutView(pDocument);\n\t\tbreak;\n\tdefault:\n\t\tASSERT(FALSE);\n\t\tbreak;\n\t}\n\n\tCFX_WideString csInfo;\n\tFX_BOOL bRet = pContext->RunScript(script, csInfo);\n\tif (!bRet)\n\t{\n\t\t//CBCL_FormNotify::MsgBoxJSError(pPageView->GetPageViewWnd(), csInfo);\n\t}\n\n\tpRuntime->ReleaseContext(pContext);\n    */\n}\n\n\nFX_BOOL\tCPDFSDK_FormActionHandler::DoAction_Hide(const CPDF_Action& action, CPDFSDK_Document* pDocument)\n{\n\tASSERT(pDocument != NULL);\n\t\n\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\t\n\tif (pInterForm->DoAction_Hide(action))\n\t{\n\t\tpDocument->SetChangeMark();\n\t\treturn TRUE;\n\t}\n\t\n\treturn FALSE;\n}\n\nFX_BOOL\tCPDFSDK_FormActionHandler::DoAction_SubmitForm(const CPDF_Action& action, CPDFSDK_Document* pDocument)\n{\n\tASSERT(pDocument != NULL);\n\t\n\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\t\n\treturn pInterForm->DoAction_SubmitForm(action);\n}\n\nFX_BOOL\tCPDFSDK_FormActionHandler::DoAction_ResetForm(const CPDF_Action& action, CPDFSDK_Document* pDocument)\n{\n\tASSERT(pDocument != NULL);\n\t\n\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\t\n\tif (pInterForm->DoAction_ResetForm(action))\n\t{\t\n\t\treturn TRUE;\n\t}\n\t\n\treturn FALSE;\n}\n\nFX_BOOL\tCPDFSDK_FormActionHandler::DoAction_ImportData(const CPDF_Action& action, CPDFSDK_Document* pDocument)\n{\n\tASSERT(pDocument != NULL);\n\t\n\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\t\n\tif (pInterForm->DoAction_ImportData(action))\n\t{\n\t\tpDocument->SetChangeMark();\t\n\t\treturn TRUE;\n\t}\n\t\n\treturn FALSE;\n}\n\nFX_BOOL\tCPDFSDK_MediaActionHandler::DoAction_Rendition(const CPDF_Action& action, CPDFSDK_Document* pDocument)\n{\n\treturn FALSE;\n}\n\nFX_BOOL\tCPDFSDK_MediaActionHandler::DoAction_Sound(const CPDF_Action& action, CPDFSDK_Document* pDocument)\n{\n\treturn FALSE;\n}\n\nFX_BOOL\tCPDFSDK_MediaActionHandler::DoAction_Movie(const CPDF_Action& action, CPDFSDK_Document* pDocument)\n{\n\treturn FALSE;\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/fsdk_annothandler.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../include/fsdk_define.h\"\n#include \"../include/fsdk_mgr.h\"\n#include \"../include/formfiller/FFL_FormFiller.h\"\n#include \"../include/fsdk_annothandler.h\"\n\n\nCPDFSDK_AnnotHandlerMgr::CPDFSDK_AnnotHandlerMgr(CPDFDoc_Environment* pApp)\n{\n\tm_pApp = pApp;\n\n\tCPDFSDK_BFAnnotHandler* pHandler = new CPDFSDK_BFAnnotHandler(m_pApp);\n\tpHandler->SetFormFiller(m_pApp->GetIFormFiller());\n\tRegisterAnnotHandler(pHandler);\n}\n\nCPDFSDK_AnnotHandlerMgr::~CPDFSDK_AnnotHandlerMgr()\n{\n\tfor(int i=0; i<m_Handlers.GetSize(); i++)\n\t{\n\t\tIPDFSDK_AnnotHandler* pHandler = m_Handlers.GetAt(i);\n\t\tdelete pHandler;\n\t}\n\tm_Handlers.RemoveAll();\n\tm_mapType2Handler.RemoveAll();\n}\n\nvoid\tCPDFSDK_AnnotHandlerMgr::RegisterAnnotHandler(IPDFSDK_AnnotHandler* pAnnotHandler)\n{\n\tASSERT(pAnnotHandler != NULL);\n\t\n\tASSERT(GetAnnotHandler(pAnnotHandler->GetType()) == NULL);\n\t\n\tm_Handlers.Add(pAnnotHandler);\n\tm_mapType2Handler.SetAt(pAnnotHandler->GetType(), (void*)pAnnotHandler);\n}\n\nvoid CPDFSDK_AnnotHandlerMgr::UnRegisterAnnotHandler(IPDFSDK_AnnotHandler* pAnnotHandler)\n{\n\tASSERT(pAnnotHandler != NULL);\n\t\n\tm_mapType2Handler.RemoveKey(pAnnotHandler->GetType());\n\t\n\tfor (int i=0, sz=m_Handlers.GetSize(); i<sz; i++)\n\t{\n\t\tif (m_Handlers.GetAt(i) == pAnnotHandler)\n\t\t{\n\t\t\tm_Handlers.RemoveAt(i);\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nCPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::NewAnnot(CPDF_Annot * pAnnot, CPDFSDK_PageView *pPageView)\n{\n\tASSERT(pAnnot != NULL);\n\tASSERT(pPageView != NULL);\n\t\n\tif (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot->GetSubType()))\n\t{\n\t\treturn pAnnotHandler->NewAnnot(pAnnot, pPageView);\n\t}\n\t\n\treturn new CPDFSDK_Annot(pAnnot, pPageView);\n}\n\nvoid CPDFSDK_AnnotHandlerMgr::ReleaseAnnot(CPDFSDK_Annot* pAnnot)\n{\n\tASSERT(pAnnot != NULL);\n\t\n\tpAnnot->GetPDFPage();\n\t\n\tif (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))\n\t{\n\t\tpAnnotHandler->OnRelease(pAnnot);\n\t\tpAnnotHandler->ReleaseAnnot(pAnnot);\n\t}\n\telse\n\t{\n\t\tdelete (CPDFSDK_Annot*)pAnnot;\n\t}\n}\n\nvoid CPDFSDK_AnnotHandlerMgr::Annot_OnCreate(CPDFSDK_Annot* pAnnot)\n{\n\tASSERT(pAnnot != NULL);\n\t\n\tCPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();\n\tASSERT(pPDFAnnot != NULL);\n\tASSERT(pPDFAnnot->m_pAnnotDict != NULL);\n\t\n\tCPDFSDK_DateTime curTime;\n\tpPDFAnnot->m_pAnnotDict->SetAtString(\"M\", curTime.ToPDFDateTimeString());\n\tpPDFAnnot->m_pAnnotDict->SetAtNumber(\"F\", (int)0);\t\n\t\n\tif (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))\n\t{\n\t\tpAnnotHandler->OnCreate(pAnnot);\n\t}\n}\n\nvoid CPDFSDK_AnnotHandlerMgr::Annot_OnLoad(CPDFSDK_Annot* pAnnot)\n{\n\tASSERT(pAnnot != NULL);\n\t\n\tif (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))\n\t{\n\t\tpAnnotHandler->OnLoad(pAnnot);\n\t}\n}\n\nIPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler(CPDFSDK_Annot* pAnnot) const\n{\n\tASSERT(pAnnot != NULL);\n\t\n\tCPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();\n\tASSERT(pPDFAnnot != NULL);\n\t\n\treturn GetAnnotHandler(pPDFAnnot->GetSubType());\n}\n\nIPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler(const CFX_ByteString& sType) const\n{\n\tvoid* pRet = NULL;\n\tm_mapType2Handler.Lookup(sType, pRet);\t\n\treturn (IPDFSDK_AnnotHandler*)pRet;\n}\n\nvoid CPDFSDK_AnnotHandlerMgr::Annot_OnDraw(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,FX_DWORD dwFlags)\n{\n\tASSERT(pAnnot != NULL);\n\t\n\tif (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))\n\t{\n\t\tpAnnotHandler->OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);\n\t}\n\telse\n\t{\n\t\tpAnnot->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);\n\t}\n}\n\n\nFX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonDown(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)\n{\n\tASSERT(pAnnot != NULL);\n\t\n\tif (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))\n\t{\n\t\treturn pAnnotHandler->OnLButtonDown(pPageView, pAnnot, nFlags, point);\n\t}\n\treturn FALSE;\n}\nFX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonUp(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)\n {\n\tASSERT(pAnnot != NULL);\n\n\tif (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))\n\t{\n\t\treturn pAnnotHandler->OnLButtonUp(pPageView, pAnnot, nFlags, point);\n\t}\n\treturn FALSE;\n }\nFX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonDblClk(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)\n{\n\tASSERT(pAnnot != NULL);\n\t\n\tif (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))\n\t{\n\t\treturn pAnnotHandler->OnLButtonDblClk(pPageView, pAnnot, nFlags, point);\n\t}\n\treturn FALSE;\n}\nFX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnMouseMove(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)\n{\n\tASSERT(pAnnot != NULL);\n\t\n\tif (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))\n\t{\n\t\treturn pAnnotHandler->OnMouseMove(pPageView, pAnnot, nFlags, point);\n\t}\n\treturn FALSE;\n}\nFX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnMouseWheel(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, short zDelta, const CPDF_Point& point)\n{\n\tASSERT(pAnnot != NULL);\n\t\n\tif (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))\n\t{\n\t\treturn pAnnotHandler->OnMouseWheel(pPageView, pAnnot,nFlags,zDelta, point);\n\t}\n\treturn FALSE;\n}\nFX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnRButtonDown(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)\n{\n\tASSERT(pAnnot != NULL);\n\t\n\tif (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))\n\t{\n\t\treturn pAnnotHandler->OnRButtonDown(pPageView, pAnnot, nFlags, point);\n\t}\n\treturn FALSE;\n}\nFX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnRButtonUp(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)\n{\n\tASSERT(pAnnot != NULL);\n\t\n\tif (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))\n\t{\n\t\treturn pAnnotHandler->OnRButtonUp(pPageView, pAnnot, nFlags, point);\n\t}\n\treturn FALSE;\n}\n\nvoid CPDFSDK_AnnotHandlerMgr::Annot_OnMouseEnter(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)\n{\n\tASSERT(pAnnot != NULL);\n\t\n\tif (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))\n\t{\n\t\tpAnnotHandler->OnMouseEnter(pPageView, pAnnot, nFlag);\n\t}\n\treturn ;\n}\n\nvoid CPDFSDK_AnnotHandlerMgr::Annot_OnMouseExit(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)\n{\n\tASSERT(pAnnot != NULL);\n\t\n\tif (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))\n\t{\n\t\tpAnnotHandler->OnMouseExit(pPageView, pAnnot, nFlag);\n\t}\n\treturn;\n}\n\nFX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnChar(CPDFSDK_Annot* pAnnot, FX_DWORD nChar, FX_DWORD nFlags)\n{\n\n\tif (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))\n\t{\n\t\treturn pAnnotHandler->OnChar(pAnnot,nChar, nFlags);\n\t}\n\treturn FALSE;\n\n}\n\nFX_BOOL\t\t\tCPDFSDK_AnnotHandlerMgr::Annot_OnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag)\n{\n\n\tif (!m_pApp->FFI_IsCTRLKeyDown(nFlag) && !m_pApp->FFI_IsALTKeyDown(nFlag))\n\t{\n\t\tCPDFSDK_PageView* pPage = pAnnot->GetPageView();\n\t\tCPDFSDK_Annot* pFocusAnnot = pPage->GetFocusAnnot();\n\t\tif (pFocusAnnot && (nKeyCode == FWL_VKEY_Tab))\n\t\t{\n\t\t\tCPDFSDK_Annot* pNext = GetNextAnnot(pFocusAnnot, !m_pApp->FFI_IsSHIFTKeyDown(nFlag));\n\n\t\t\tif(pNext && pNext != pFocusAnnot)\n\t\t\t{\n\t\t\t\tCPDFSDK_Document* pDocument = pPage->GetSDKDocument();\n\t\t\t\tpDocument->SetFocusAnnot(pNext);\n\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))\n\t{\n\t\treturn pAnnotHandler->OnKeyDown(pAnnot,nKeyCode, nFlag);\n\t}\n\treturn FALSE;\n}\nFX_BOOL\t\t\tCPDFSDK_AnnotHandlerMgr::Annot_OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag)\n{\n\treturn FALSE;\n}\n\nFX_BOOL\t\t\tCPDFSDK_AnnotHandlerMgr::Annot_OnSetFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)\n{\n\tASSERT(pAnnot != NULL);\n\n\tif (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))\n\t{\n\t\tif (pAnnotHandler->OnSetFocus(pAnnot, nFlag))\n\t\t{\n\t\t\tCPDFSDK_PageView* pPage = pAnnot->GetPageView();\n\t\t\tASSERT(pPage != NULL);\n\n\t\t\tpPage->GetSDKDocument();\n\t//\t\tpDocument->SetTopmostAnnot(pAnnot);\n\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\t\n\treturn FALSE;\n}\n\nFX_BOOL\t\t\tCPDFSDK_AnnotHandlerMgr::Annot_OnKillFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)\n{\n\tASSERT(pAnnot != NULL);\n\t\n\tif (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))\n\t{\n\t\tif (pAnnotHandler->OnKillFocus(pAnnot, nFlag))\n\t\t{\t\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t\treturn FALSE;\n\t}\n\t\n\treturn FALSE;\n}\n\nCPDF_Rect\tCPDFSDK_AnnotHandlerMgr::Annot_OnGetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)\n{\n\tASSERT(pAnnot);\n\tif (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))\n\t{\n\t\treturn pAnnotHandler->GetViewBBox(pPageView, pAnnot);\n\t}\n\treturn pAnnot->GetRect();\n}\n\nFX_BOOL\tCPDFSDK_AnnotHandlerMgr::Annot_OnHitTest(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, const CPDF_Point& point)\n{\n\tASSERT(pAnnot);\n\tif (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))\n\t{\n\t\tif(pAnnotHandler->CanAnswer(pAnnot))\n\t\t\treturn pAnnotHandler->HitTest(pPageView, pAnnot, point);\n\t}\n\treturn FALSE;\n}\n\nCPDFSDK_Annot*\tCPDFSDK_AnnotHandlerMgr::GetNextAnnot(CPDFSDK_Annot* pSDKAnnot,FX_BOOL bNext)\n{\n\t CBA_AnnotIterator ai(pSDKAnnot->GetPageView(), \"Widget\", \"\");\n\n\t CPDFSDK_Annot* pNext = bNext ? \n\t\t ai.GetNextAnnot(pSDKAnnot) : \n\t\tai.GetPrevAnnot(pSDKAnnot);\n\t\n\t\treturn pNext;\n}\n\nFX_BOOL CPDFSDK_BFAnnotHandler::CanAnswer(CPDFSDK_Annot* pAnnot)\n{\n\tASSERT(pAnnot);\n\tASSERT(pAnnot->GetType() == \"Widget\");\n\tCFX_ByteString sSubType = pAnnot->GetSubType();\n\t\n\tif (sSubType == BFFT_SIGNATURE)\n\t{\n\t}\n\telse\n\t{\n\t\tCPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;\n\t\tif (!pWidget->IsVisible()) return FALSE;\n\n\t\tint nFieldFlags = pWidget->GetFieldFlags();\n\t\tif ((nFieldFlags & FIELDFLAG_READONLY) == FIELDFLAG_READONLY) return FALSE;\n\t\tif (pWidget->GetFieldType() == FIELDTYPE_PUSHBUTTON)\n\t\t\treturn TRUE;\n\t\telse\n\t\t{\n\t\t\tCPDF_Page* pPage = pWidget->GetPDFPage();\n\t\t\tASSERT(pPage != NULL);\n\t\t\t\n\t\t\tCPDF_Document* pDocument = pPage->m_pDocument;\n\t\t\tASSERT(pDocument != NULL);\n\t\t\t\n\t\t\tFX_DWORD dwPermissions = pDocument->GetUserPermissions();\n\t\t\treturn (dwPermissions&FPDFPERM_FILL_FORM) || \n\t\t\t\t(dwPermissions&FPDFPERM_ANNOT_FORM) || \n \t\t\t(dwPermissions&FPDFPERM_ANNOT_FORM);\n\t\t}\n\t}\n\n\treturn FALSE;\n}\n\nCPDFSDK_Annot*\t\tCPDFSDK_BFAnnotHandler::NewAnnot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPage)\n{\n\tASSERT(pPage != NULL);\n\tpPage->GetPDFDocument();\n\t\n\tCPDFSDK_Document* pSDKDoc  = m_pApp->GetCurrentDoc();\n\tASSERT(pSDKDoc);\n\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pSDKDoc->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\t\n\tCPDFSDK_Widget* pWidget = NULL;\n\tif (CPDF_FormControl* pCtrl = CPDFSDK_Widget::GetFormControl(pInterForm->GetInterForm(), pAnnot->m_pAnnotDict))\n\t{\n\t\tpWidget = new CPDFSDK_Widget(pAnnot, pPage, pInterForm);\n\t\tpInterForm->AddMap(pCtrl, pWidget);\n\t\tCPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();\n\t\tif(pPDFInterForm && pPDFInterForm->NeedConstructAP())\n\t\t\tpWidget->ResetAppearance(NULL,FALSE);\n\t}\n\t\n\treturn pWidget;\n}\n\nvoid CPDFSDK_BFAnnotHandler::ReleaseAnnot(CPDFSDK_Annot* pAnnot)\n{\n\tASSERT(pAnnot != NULL);\n\n\tif (m_pFormFiller)\n\t\tm_pFormFiller->OnDelete(pAnnot);\n\t\n\tCPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;\n\tCPDFSDK_InterForm* pInterForm = pWidget->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\t\n\tCPDF_FormControl* pCtrol = pWidget->GetFormControl();\n\tpInterForm->RemoveMap(pCtrol);\n\t\n\n\tdelete pWidget;\n}\n\n\nvoid CPDFSDK_BFAnnotHandler::OnDraw(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,  FX_DWORD dwFlags)\n{\n\tASSERT(pAnnot != NULL);\n\tCFX_ByteString sSubType = pAnnot->GetSubType();\n\t\n\tif (sSubType == BFFT_SIGNATURE)\n\t{\n\t\tpAnnot->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);\n\t}\n\telse\n\t{\n\t\tif (m_pFormFiller)\n\t\t{\n\t\t\tm_pFormFiller->OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);\n\t\t}\n\t}\n}\n\nvoid CPDFSDK_BFAnnotHandler::OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) \n{\n\tASSERT(pAnnot != NULL);\n\tCFX_ByteString sSubType = pAnnot->GetSubType();\n\t\n\tif (sSubType == BFFT_SIGNATURE)\n\t{\n\t}\n\telse\n\t{\n\t\tif (m_pFormFiller)\n\t\t\t m_pFormFiller->OnMouseEnter(pPageView, pAnnot, nFlag);\n\t}\n\t\n\n}\nvoid CPDFSDK_BFAnnotHandler::OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) \n{\n\tASSERT(pAnnot != NULL);\n\tCFX_ByteString sSubType = pAnnot->GetSubType();\n\t\n\tif (sSubType == BFFT_SIGNATURE)\n\t{\n\t}\n\telse\n\t{\n\t\tif (m_pFormFiller)\n\t\t\t m_pFormFiller->OnMouseExit(pPageView, pAnnot, nFlag);\n\t}\n\t\n}\nFX_BOOL CPDFSDK_BFAnnotHandler::OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)\n{\n\tASSERT(pAnnot != NULL);\n\tCFX_ByteString sSubType = pAnnot->GetSubType();\n\t\n\tif (sSubType == BFFT_SIGNATURE)\n\t{\n\t}\n\telse\n\t{\n\t\tif (m_pFormFiller)\n\t\t\treturn m_pFormFiller->OnLButtonDown(pPageView, pAnnot, nFlags, point);\n\t}\n\t\n\treturn FALSE;\n}\n\nFX_BOOL CPDFSDK_BFAnnotHandler::OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)\n{\n\tASSERT(pAnnot != NULL);\n\tCFX_ByteString sSubType = pAnnot->GetSubType();\n\t\n\tif (sSubType == BFFT_SIGNATURE)\n\t{\n\t}\n\telse\n\t{\n\t\tif (m_pFormFiller)\n\t\t\treturn m_pFormFiller->OnLButtonUp(pPageView, pAnnot, nFlags, point);\n\t}\n\t\n\treturn FALSE;\n}\n\nFX_BOOL CPDFSDK_BFAnnotHandler::OnLButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)\n{\n\tASSERT(pAnnot != NULL);\n\tCFX_ByteString sSubType = pAnnot->GetSubType();\n\t\n\tif (sSubType == BFFT_SIGNATURE)\n\t{\n\t}\n\telse\n\t{\n\t\tif (m_pFormFiller)\n\t\t\treturn m_pFormFiller->OnLButtonDblClk(pPageView, pAnnot, nFlags, point);\n\t}\n\t\n\treturn FALSE;\n}\n\nFX_BOOL CPDFSDK_BFAnnotHandler::OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)\n{\t\n\tASSERT(pAnnot != NULL);\n\tCFX_ByteString sSubType = pAnnot->GetSubType();\n\n\tif (sSubType == BFFT_SIGNATURE)\n\t{\n\t}\n\telse\n\t{\n\t\tif (m_pFormFiller)\n\t\t\treturn m_pFormFiller->OnMouseMove(pPageView, pAnnot, nFlags, point);\n\t}\n\n\treturn FALSE;\n\n}\n\n\nFX_BOOL CPDFSDK_BFAnnotHandler::OnMouseWheel(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, short zDelta, const CPDF_Point& point)\n{\n\tASSERT(pAnnot != NULL);\n\tCFX_ByteString sSubType = pAnnot->GetSubType();\n\t\n\tif (sSubType == BFFT_SIGNATURE)\n\t{\n\t}\n\telse\n\t{\n\t\tif (m_pFormFiller)\n\t\t\treturn m_pFormFiller->OnMouseWheel(pPageView, pAnnot, nFlags, zDelta,point);\n\t}\n\t\n\treturn FALSE;\n}\n\nFX_BOOL CPDFSDK_BFAnnotHandler::OnRButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)\n{\n\tASSERT(pAnnot != NULL);\n\tCFX_ByteString sSubType = pAnnot->GetSubType();\n\t\n\tif (sSubType == BFFT_SIGNATURE)\n\t{\n\t}\n\telse\n\t{\n\t\tif (m_pFormFiller)\n\t\t\treturn m_pFormFiller->OnRButtonDown(pPageView, pAnnot, nFlags, point);\n\t}\n\t\n\treturn FALSE;\n}\nFX_BOOL CPDFSDK_BFAnnotHandler::OnRButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)\n{\n\tASSERT(pAnnot != NULL);\n\tCFX_ByteString sSubType = pAnnot->GetSubType();\n\t\n\tif (sSubType == BFFT_SIGNATURE)\n\t{\n\t}\n\telse\n\t{\n\t\tif (m_pFormFiller)\n\t\t\treturn m_pFormFiller->OnRButtonUp(pPageView, pAnnot, nFlags, point);\n\t}\n\t\n\treturn FALSE;\n}\n\nFX_BOOL CPDFSDK_BFAnnotHandler::OnChar(CPDFSDK_Annot* pAnnot, FX_DWORD nChar, FX_DWORD nFlags)\n{\n\tASSERT(pAnnot != NULL);\n\tCFX_ByteString sSubType = pAnnot->GetSubType();\n\t\n\tif (sSubType == BFFT_SIGNATURE)\n\t{\n\t}\n\telse\n\t{\n\t\tif (m_pFormFiller)\n\t\t\treturn m_pFormFiller->OnChar(pAnnot,nChar, nFlags);\n\t}\n\t\n\treturn FALSE;\n}\n\nFX_BOOL CPDFSDK_BFAnnotHandler::OnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag)\n{\n\tASSERT(pAnnot != NULL);\n\tCFX_ByteString sSubType = pAnnot->GetSubType();\n\t\n\tif (sSubType == BFFT_SIGNATURE)\n\t{\n\t}\n\telse\n\t{\n\t\tif (m_pFormFiller)\n\t\t\treturn m_pFormFiller->OnKeyDown(pAnnot,nKeyCode, nFlag);\n\t}\n\t\n\treturn FALSE;\n}\n\nFX_BOOL CPDFSDK_BFAnnotHandler::OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag)\n{\n\n\treturn FALSE;\n}\nvoid\tCPDFSDK_BFAnnotHandler::OnCreate(CPDFSDK_Annot* pAnnot) \n{\n\tASSERT(pAnnot != NULL);\n\tCFX_ByteString sSubType = pAnnot->GetSubType();\n\t\n\tif (sSubType == BFFT_SIGNATURE)\n\t{\n\t}\n\telse\n\t{\n\t\tif (m_pFormFiller)\n\t\t\tm_pFormFiller->OnCreate(pAnnot);\n\t}\n}\n\nvoid CPDFSDK_BFAnnotHandler::OnLoad(CPDFSDK_Annot* pAnnot)\n{\n\tASSERT(pAnnot != NULL);\n\t\n\tCFX_ByteString sSubType = pAnnot->GetSubType();\n\t\n\tif (sSubType == BFFT_SIGNATURE)\n\t{\n\t}\n\telse\n\t{\n\t\tCPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;\n\t\t\n\tif (!pWidget->IsAppearanceValid())\n\t\t\tpWidget->ResetAppearance(NULL, FALSE);\n\t\t\n\t\tint nFieldType = pWidget->GetFieldType();\n\t\t\n\t\tif (nFieldType == FIELDTYPE_TEXTFIELD || nFieldType == FIELDTYPE_COMBOBOX)\n\t\t{\n\t\t\tFX_BOOL bFormated = FALSE;\n\t\t\tCFX_WideString sValue = pWidget->OnFormat(0, bFormated);\n\t\t\t\n\t\t\tif (bFormated && nFieldType == FIELDTYPE_COMBOBOX)\n\t\t\t{\n\t\t\t\tpWidget->ResetAppearance(sValue, FALSE);\n\t\t\t}\n\t\t}\n\t\t\n\n\t\tif (m_pFormFiller)\n\t\t\tm_pFormFiller->OnLoad(pAnnot);\n\n\t}\n}\n\nFX_BOOL\tCPDFSDK_BFAnnotHandler::OnSetFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)\n{\n\tASSERT(pAnnot != NULL);\n\tCFX_ByteString sSubType = pAnnot->GetSubType();\n\t\n\tif (sSubType == BFFT_SIGNATURE)\n\t{\n\t}\n\telse\n\t{\n\t\tif (m_pFormFiller)\n\t\t\treturn m_pFormFiller->OnSetFocus(pAnnot,nFlag);\n\t}\n\t\n\treturn TRUE;\n}\nFX_BOOL\tCPDFSDK_BFAnnotHandler::OnKillFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)\n{\n\tASSERT(pAnnot != NULL);\n\tCFX_ByteString sSubType = pAnnot->GetSubType();\n\t\n\tif (sSubType == BFFT_SIGNATURE)\n\t{\n\t}\n\telse\n\t{\n\t\tif (m_pFormFiller)\n\t\t\treturn m_pFormFiller->OnKillFocus(pAnnot,nFlag);\n\t}\n\t\n\treturn TRUE;\n}\n\nCPDF_Rect CPDFSDK_BFAnnotHandler::GetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)\n{\n\tASSERT(pAnnot != NULL);\n\tCFX_ByteString sSubType = pAnnot->GetSubType();\n\t\n\tif (sSubType == BFFT_SIGNATURE)\n\t{\n\t}\n\telse\n\t{\n\t\tif (m_pFormFiller)\n\t\t\treturn m_pFormFiller->GetViewBBox(pPageView, pAnnot);\n\n\t}\n\t\n\treturn CPDF_Rect(0,0,0,0);\n}\n\nFX_BOOL\tCPDFSDK_BFAnnotHandler::HitTest(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, const CPDF_Point& point)\n{\n\tASSERT(pPageView);\n\tASSERT(pAnnot);\n\n\tCPDF_Rect rect = GetViewBBox(pPageView, pAnnot);\n\treturn rect.Contains(point.x, point.y);\n}\n\n//CReader_AnnotIteratorEx\n\nCPDFSDK_AnnotIterator::CPDFSDK_AnnotIterator(CPDFSDK_PageView * pPageView,FX_BOOL bReverse,\n\t\t\t\t\t\t\t\t\t\t\t\t FX_BOOL bIgnoreTopmost/*=FALSE*/,\n\t\t\t\t\t\t\t\t\t\t\t\t FX_BOOL bCircle/*=FALSE*/,\n\t\t\t\t\t\t\t\t\t\t\t\t CFX_PtrArray *pList/*=NULL*/)\n{\n\tASSERT(pPageView);\n\tm_bReverse=bReverse;\n\tm_bIgnoreTopmost= bIgnoreTopmost;\n\tm_bCircle=bCircle;\n\tm_pIteratorAnnotList.RemoveAll();\n\tInitIteratorAnnotList(pPageView,pList);\n}\n\nCPDFSDK_Annot*\tCPDFSDK_AnnotIterator::NextAnnot (const CPDFSDK_Annot* pCurrent) \n{\n\t\n\tint index=-1;\n\tint nCount=this->m_pIteratorAnnotList.GetSize();\n\tif(pCurrent){\n\t\tfor(int i=0;i<nCount;i++){\n\t\t\tCPDFSDK_Annot * pReaderAnnot= (CPDFSDK_Annot *)m_pIteratorAnnotList.GetAt(i);\n\t\t\tif(pReaderAnnot ==pCurrent){\t\t\t\n\t\t\t\tindex=i;\n\t\t\t\tbreak;\n\t\t\t}\t\t\t\n\t\t}\n\t}\t\n\treturn NextAnnot(index);\n}\nCPDFSDK_Annot*\tCPDFSDK_AnnotIterator::PrevAnnot (const CPDFSDK_Annot*pCurrent)\n{\n\t\n\tint index=-1;\n\tint nCount=this->m_pIteratorAnnotList.GetSize();\n\tif(pCurrent){\n\t\tfor(int i=0;i<nCount;i++){\n\t\t\tCPDFSDK_Annot * pReaderAnnot= (CPDFSDK_Annot*)m_pIteratorAnnotList.GetAt(i);\n\t\t\tif(pReaderAnnot ==pCurrent){\t\t\t\n\t\t\t\tindex=i;\n\t\t\t\tbreak;\n\t\t\t}\t\t\t\n\t\t}\t\n\t}\n\treturn PrevAnnot(index);\t\n}\nCPDFSDK_Annot*\tCPDFSDK_AnnotIterator::NextAnnot (int& index) \n{\t\n\t\n\tint nCount=m_pIteratorAnnotList.GetSize();\n    if(nCount<=0) index=-1;\n    else{\n\t\tif(index<0){\n\t\t\tindex=0;\t\t\n\t\t}\n\t\telse{\t\t\n\t\t\tif(m_bCircle){\t\t\t\n\t\t\t\tindex=( index <nCount-1) ? (index+1) :0;\t\t\n\t\t\t}\n\t\t\telse{\n\t\t\t\tindex=( index <nCount-1) ? (index+1) :-1;\t\t\n\t\t\t}\n\t\t\t\n\t\t}\t\n\t}\n\treturn (index <0) ? NULL : (CPDFSDK_Annot*)m_pIteratorAnnotList.GetAt(index);\t\t\n}\n\n\nCPDFSDK_Annot*\tCPDFSDK_AnnotIterator::PrevAnnot (int& index)\n{\n\t\n\tint nCount=m_pIteratorAnnotList.GetSize();\n    if(nCount<=0) index=-1;\n\telse{\t\n\t\tif(index<0){\n\t\t\tindex=nCount-1;\t\t \n\t\t}\n\t\telse{\t\n\t\t\tif(m_bCircle){\t\t\t\n\t\t\t\tindex = ( index >0) ? (index-1) :nCount-1;\t\t\n\t\t\t}\n\t\t\telse{\n\t\t\t\tindex = ( index >0) ? (index-1) :-1;\t\n\t\t\t}\t\t\t\t\n\t\t}\n\t}\n\treturn (index <0) ? NULL : (CPDFSDK_Annot*)m_pIteratorAnnotList.GetAt(index);\t\t\n}\n\n\nCPDFSDK_Annot*CPDFSDK_AnnotIterator::Next(const CPDFSDK_Annot* pCurrent) \n{\n\n\treturn (m_bReverse) ? PrevAnnot(pCurrent):NextAnnot(pCurrent);\t\t \n\n}\n\nCPDFSDK_Annot*\tCPDFSDK_AnnotIterator::Prev(const CPDFSDK_Annot* pCurrent) \n{\n\n\treturn (m_bReverse) ? NextAnnot(pCurrent):PrevAnnot(pCurrent);\t\t \n}\n\nCPDFSDK_Annot*CPDFSDK_AnnotIterator::Next(int& index )\n{\n\t\n\treturn (m_bReverse) ? PrevAnnot(index):NextAnnot(index);\t\t \n\t\n}\n\nCPDFSDK_Annot*\tCPDFSDK_AnnotIterator::Prev(int& index )\n{\n\t\n\treturn (m_bReverse) ? NextAnnot(index):PrevAnnot(index);\t\t \n}\n\n\nvoid CPDFSDK_AnnotIterator::InsertSort(CFX_PtrArray &arrayList, AI_COMPARE pCompare)\n{\n\tfor (int i = 1; i < arrayList.GetSize(); i++)\n\t{\n\t\tif (pCompare((CPDFSDK_Annot*)(arrayList[i]) , (CPDFSDK_Annot*)(arrayList[i-1])) < 0)\n\t\t{\n\t\t\tint j = i-1;\n\t\t\tCPDFSDK_Annot* pTemp = (CPDFSDK_Annot*)arrayList[i];\n\t\t\t\n\t\t\tdo\n\t\t\t{\n\t\t\t\tarrayList[j + 1] = arrayList[j];\n\t\t\t} while (--j >= 0 && pCompare(pTemp, (CPDFSDK_Annot*)arrayList[j]) < 0);\n\n\t\t\tarrayList[j+1] = pTemp;\n\t\t}\n\t}\n}\n\nint LyOrderCompare(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2)\n{\n\tif(p1->GetLayoutOrder() < p2->GetLayoutOrder())\n\t\treturn -1;\n\telse if (p1->GetLayoutOrder() == p2->GetLayoutOrder())\n\t\treturn 0;\n\telse\n\t\treturn 1;\n}\n\nFX_BOOL CPDFSDK_AnnotIterator::InitIteratorAnnotList(CPDFSDK_PageView* pPageView,CFX_PtrArray * pAnnotList)\n{\n\tASSERT(pPageView);\n\t\n\t\n\n\tif(pAnnotList==NULL){\t\n\t\tpAnnotList=pPageView->GetAnnotList();\n\t}\n\n\tthis->m_pIteratorAnnotList.RemoveAll();\n\tif(!pAnnotList) return FALSE;\n\n\tCPDFSDK_Annot * pTopMostAnnot= (m_bIgnoreTopmost) ? NULL : pPageView->GetFocusAnnot();\n\n\n\tint nCount =pAnnotList->GetSize();\n\n\tfor(int i = nCount- 1 ;i >= 0;i--)\n\t{\n\t\tCPDFSDK_Annot * pReaderAnnot= (CPDFSDK_Annot*)pAnnotList->GetAt(i);\n\t\tm_pIteratorAnnotList.Add(pReaderAnnot);\t\n\t}\n\n\tInsertSort(m_pIteratorAnnotList,&LyOrderCompare);\n\n\tif(pTopMostAnnot)\n\t{\n\t\tfor(int i=0 ;i<nCount;i++)\n\t\t{\n\t\t\tCPDFSDK_Annot * pReaderAnnot = (CPDFSDK_Annot*)m_pIteratorAnnotList.GetAt(i);\n\t\t\tif(pReaderAnnot == pTopMostAnnot)\n\t\t\t{\n\t\t\t\tm_pIteratorAnnotList.RemoveAt(i);\n\t\t\t\tm_pIteratorAnnotList.InsertAt(0, pReaderAnnot);\n\t\t\t\tbreak;\n\t\t\t}\t\n\t\t}\n\t}\n\n\treturn TRUE;\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/fsdk_baseannot.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../include/fsdk_define.h\"\n#include \"../include/fsdk_mgr.h\"\n#include \"../include/fsdk_baseannot.h\"\n\n\n//---------------------------------------------------------------------------\n//\t\t\t\t\t\t\t\tCPDFSDK_DateTime\t\n//---------------------------------------------------------------------------\nint _gAfxGetTimeZoneInSeconds(FX_CHAR tzhour, FX_BYTE tzminute)\n{\n\treturn (int)tzhour * 3600 + (int)tzminute * (tzhour >= 0 ? 60 : -60);\n}\n\nFX_BOOL _gAfxIsLeapYear(FX_SHORT year)\n{\n\treturn ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0)));\n}\n\nFX_WORD _gAfxGetYearDays(FX_SHORT year)\n{\n\treturn (_gAfxIsLeapYear(year) == TRUE ? 366 : 365);\n}\n\nFX_BYTE _gAfxGetMonthDays(FX_SHORT year, FX_BYTE month)\n{\n\tFX_BYTE\tmDays;\n\tswitch (month)\n\t{\n\tcase 1:\n\tcase 3:\n\tcase 5:\n\tcase 7:\n\tcase 8:\n\tcase 10:\n\tcase 12:\n\t\tmDays = 31;\n\t\tbreak;\n\n\tcase 4:\n\tcase 6:\n\tcase 9:\n\tcase 11:\n\t\tmDays = 30;\n\t\tbreak;\n\n\tcase 2:\n\t\tif (_gAfxIsLeapYear(year) == TRUE)\n\t\t\tmDays = 29;\n\t\telse\n\t\t\tmDays = 28;\n\t\tbreak;\n\n\tdefault:\n\t\tmDays = 0;\n\t\tbreak;\n\t}\n\n\treturn mDays;\n}\n\nCPDFSDK_DateTime::CPDFSDK_DateTime()\n{\n\tResetDateTime();\n}\n\nCPDFSDK_DateTime::CPDFSDK_DateTime(const CFX_ByteString& dtStr)\n{\n\tResetDateTime();\n\n\tFromPDFDateTimeString(dtStr);\n}\n\nCPDFSDK_DateTime::CPDFSDK_DateTime(const CPDFSDK_DateTime& datetime)\n{\n\toperator = (datetime);\n}\n\nCPDFSDK_DateTime::CPDFSDK_DateTime(const FX_SYSTEMTIME& st)\n{\n\toperator = (st) ;\n}\n\n\nvoid CPDFSDK_DateTime::ResetDateTime()\n{\n\ttzset();\n\n\ttime_t\tcurTime;\n\ttime(&curTime);\n\tstruct tm* newtime;\n\t//newtime = gmtime(&curTime);\n\tnewtime = localtime(&curTime);\n\n\tdt.year = newtime->tm_year + 1900;\n\tdt.month = newtime->tm_mon + 1;\n\tdt.day = newtime->tm_mday;\n\tdt.hour = newtime->tm_hour;\n\tdt.minute = newtime->tm_min;\n\tdt.second = newtime->tm_sec;\n// \tdt.tzHour = _timezone / 3600 * -1;\n// \tdt.tzMinute = (abs(_timezone) % 3600) / 60;\n}\n\nCPDFSDK_DateTime& CPDFSDK_DateTime::operator = (const CPDFSDK_DateTime& datetime)\n{\n\tFXSYS_memcpy(&dt, &datetime.dt, sizeof(FX_DATETIME));\n\treturn *this;\n}\n\nCPDFSDK_DateTime& CPDFSDK_DateTime::operator = (const FX_SYSTEMTIME& st)\n{\n\ttzset();\n\n\tdt.year = (FX_SHORT)st.wYear;\n\tdt.month = (FX_BYTE)st.wMonth;\n\tdt.day = (FX_BYTE)st.wDay;\n\tdt.hour = (FX_BYTE)st.wHour;\n\tdt.minute = (FX_BYTE)st.wMinute;\n\tdt.second = (FX_BYTE)st.wSecond;\n// \tdt.tzHour = _timezone / 3600 * -1;\n// \tdt.tzMinute = (abs(_timezone) % 3600) / 60;\n\treturn *this;\n}\n\nFX_BOOL CPDFSDK_DateTime::operator == (CPDFSDK_DateTime& datetime)\n{\n\treturn (FXSYS_memcmp(&dt, &datetime.dt, sizeof(FX_DATETIME)) == 0);\n}\n\nFX_BOOL CPDFSDK_DateTime::operator != (CPDFSDK_DateTime& datetime)\n{\n\treturn (FXSYS_memcmp(&dt, &datetime.dt, sizeof(FX_DATETIME)) != 0);\n}\n\nFX_BOOL CPDFSDK_DateTime::operator > (CPDFSDK_DateTime& datetime)\n{\n\tCPDFSDK_DateTime dt1 = ToGMT();\n\tCPDFSDK_DateTime dt2 = datetime.ToGMT();\n\tint d1 = (((int)dt1.dt.year) << 16) | (((int)dt1.dt.month) << 8) | (int)dt1.dt.day;\n\tint d2 = (((int)dt1.dt.hour) << 16) | (((int)dt1.dt.minute) << 8) | (int)dt1.dt.second;\n\tint d3 = (((int)dt2.dt.year) << 16) | (((int)dt2.dt.month) << 8) | (int)dt2.dt.day;\n\tint d4 = (((int)dt2.dt.hour) << 16) | (((int)dt2.dt.minute) << 8) | (int)dt2.dt.second;\n\n\tif (d1 > d3) return TRUE;\n\tif (d2 > d4) return TRUE;\n\treturn FALSE;\n}\n\nFX_BOOL CPDFSDK_DateTime::operator >= (CPDFSDK_DateTime& datetime)\n{\n\tCPDFSDK_DateTime dt1 = ToGMT();\n\tCPDFSDK_DateTime dt2 = datetime.ToGMT();\n\tint d1 = (((int)dt1.dt.year) << 16) | (((int)dt1.dt.month) << 8) | (int)dt1.dt.day;\n\tint d2 = (((int)dt1.dt.hour) << 16) | (((int)dt1.dt.minute) << 8) | (int)dt1.dt.second;\n\tint d3 = (((int)dt2.dt.year) << 16) | (((int)dt2.dt.month) << 8) | (int)dt2.dt.day;\n\tint d4 = (((int)dt2.dt.hour) << 16) | (((int)dt2.dt.minute) << 8) | (int)dt2.dt.second;\n\n\tif (d1 >= d3) return TRUE;\n\tif (d2 >= d4) return TRUE;\n\treturn FALSE;\n}\n\nFX_BOOL CPDFSDK_DateTime::operator < (CPDFSDK_DateTime& datetime)\n{\n\tCPDFSDK_DateTime dt1 = ToGMT();\n\tCPDFSDK_DateTime dt2 = datetime.ToGMT();\n\tint d1 = (((int)dt1.dt.year) << 16) | (((int)dt1.dt.month) << 8) | (int)dt1.dt.day;\n\tint d2 = (((int)dt1.dt.hour) << 16) | (((int)dt1.dt.minute) << 8) | (int)dt1.dt.second;\n\tint d3 = (((int)dt2.dt.year) << 16) | (((int)dt2.dt.month) << 8) | (int)dt2.dt.day;\n\tint d4 = (((int)dt2.dt.hour) << 16) | (((int)dt2.dt.minute) << 8) | (int)dt2.dt.second;\n\n\tif (d1 < d3) return TRUE;\n\tif (d2 < d4) return TRUE;\n\treturn FALSE;\n}\n\nFX_BOOL CPDFSDK_DateTime::operator <= (CPDFSDK_DateTime& datetime)\n{\n\tCPDFSDK_DateTime dt1 = ToGMT();\n\tCPDFSDK_DateTime dt2 = datetime.ToGMT();\n\tint d1 = (((int)dt1.dt.year) << 16) | (((int)dt1.dt.month) << 8) | (int)dt1.dt.day;\n\tint d2 = (((int)dt1.dt.hour) << 16) | (((int)dt1.dt.minute) << 8) | (int)dt1.dt.second;\n\tint d3 = (((int)dt2.dt.year) << 16) | (((int)dt2.dt.month) << 8) | (int)dt2.dt.day;\n\tint d4 = (((int)dt2.dt.hour) << 16) | (((int)dt2.dt.minute) << 8) | (int)dt2.dt.second;\n\n\tif (d1 <= d3) return TRUE;\n\tif (d2 <= d4) return TRUE;\n\treturn FALSE;\n}\n\nCPDFSDK_DateTime::operator time_t()\n{\n\tstruct tm newtime;\n\n\tnewtime.tm_year = dt.year - 1900;\n\tnewtime.tm_mon = dt.month - 1;\n\tnewtime.tm_mday = dt.day;\n\tnewtime.tm_hour = dt.hour;\n\tnewtime.tm_min = dt.minute;\n\tnewtime.tm_sec = dt.second;\n\n\treturn mktime(&newtime);\n}\n\nCPDFSDK_DateTime& CPDFSDK_DateTime::FromPDFDateTimeString(const CFX_ByteString& dtStr)\n{\n\tint strLength = dtStr.GetLength();\n\tif (strLength > 0)\n\t{\n\t\tint i = 0;\n\t\tint j, k;\n\t\tFX_CHAR ch;\n\t\twhile (i < strLength)\n\t\t{\n\t\t\tch = dtStr[i];\n\t\t\tif (ch >= '0' && ch <= '9') break;\n\t\t\ti ++;\n\t\t}\n\t\tif (i >= strLength) return *this;\n\n\t\tj = 0;\n\t\tk = 0;\n\t\twhile (i < strLength && j < 4)\n\t\t{\n\t\t\tch = dtStr[i];\n\t\t\tk = k * 10 + ch - '0';\n\t\t\tj ++;\n\t\t\tif (ch < '0' || ch > '9') break;\n\t\t\ti ++;\n\t\t}\n\t\tdt.year = (FX_SHORT)k;\n\t\tif (i >= strLength || j < 4) return *this;\n\n\t\tj = 0;\n\t\tk = 0;\n\t\twhile (i < strLength && j < 2)\n\t\t{\n\t\t\tch = dtStr[i];\n\t\t\tk = k * 10 + ch - '0';\n\t\t\tj ++;\n\t\t\tif (ch < '0' || ch > '9') break;\n\t\t\ti ++;\n\t\t}\n\t\tdt.month = (FX_BYTE)k;\n\t\tif (i >= strLength || j < 2) return *this;\n\n\t\tj = 0;\n\t\tk = 0;\n\t\twhile (i < strLength && j < 2)\n\t\t{\n\t\t\tch = dtStr[i];\n\t\t\tk = k * 10 + ch - '0';\n\t\t\tj ++;\n\t\t\tif (ch < '0' || ch > '9') break;\n\t\t\ti ++;\n\t\t}\n\t\tdt.day = (FX_BYTE)k;\n\t\tif (i >= strLength || j < 2) return *this;\n\n\t\tj = 0;\n\t\tk = 0;\n\t\twhile (i < strLength && j < 2)\n\t\t{\n\t\t\tch = dtStr[i];\n\t\t\tk = k * 10 + ch - '0';\n\t\t\tj ++;\n\t\t\tif (ch < '0' || ch > '9') break;\n\t\t\ti ++;\n\t\t}\n\t\tdt.hour = (FX_BYTE)k;\n\t\tif (i >= strLength || j < 2) return *this;\n\n\t\tj = 0;\n\t\tk = 0;\n\t\twhile (i < strLength && j < 2)\n\t\t{\n\t\t\tch = dtStr[i];\n\t\t\tk = k * 10 + ch - '0';\n\t\t\tj ++;\n\t\t\tif (ch < '0' || ch > '9') break;\n\t\t\ti ++;\n\t\t}\n\t\tdt.minute = (FX_BYTE)k;\n\t\tif (i >= strLength || j < 2) return *this;\n\n\t\tj = 0;\n\t\tk = 0;\n\t\twhile (i < strLength && j < 2)\n\t\t{\n\t\t\tch = dtStr[i];\n\t\t\tk = k * 10 + ch - '0';\n\t\t\tj ++;\n\t\t\tif (ch < '0' || ch > '9') break;\n\t\t\ti ++;\n\t\t}\n\t\tdt.second = (FX_BYTE)k;\n\t\tif (i >= strLength || j < 2) return *this;\n\n\t\tch = dtStr[i ++];\n\t\tif (ch != '-' && ch != '+') return *this;\n\t\tif (ch == '-')\n\t\t\tdt.tzHour = -1;\n\t\telse\n\t\t\tdt.tzHour = 1;\n\t\tj = 0;\n\t\tk = 0;\n\t\twhile (i < strLength && j < 2)\n\t\t{\n\t\t\tch = dtStr[i];\n\t\t\tk = k * 10 + ch - '0';\n\t\t\tj ++;\n\t\t\tif (ch < '0' || ch > '9') break;\n\t\t\ti ++;\n\t\t}\n\t\tdt.tzHour *= (FX_CHAR)k;\n\t\tif (i >= strLength || j < 2) return *this;\n\n\t\tch = dtStr[i ++];\n\t\tif (ch != '\\'') return *this;\n\t\tj = 0;\n\t\tk = 0;\n\t\twhile (i < strLength && j < 2)\n\t\t{\n\t\t\tch = dtStr[i];\n\t\t\tk = k * 10 + ch - '0';\n\t\t\tj ++;\n\t\t\tif (ch < '0' || ch > '9') break;\n\t\t\ti ++;\n\t\t}\n\t\tdt.tzMinute = (FX_BYTE)k;\n\t\tif (i >= strLength || j < 2) return *this;\n\t}\n\n\treturn  *this;\n}\n\nCFX_ByteString CPDFSDK_DateTime::ToCommonDateTimeString()\n{\n\tCFX_ByteString str1;\n\tstr1.Format(\"%04d-%02d-%02d %02d:%02d:%02d \", dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second);\n\tif (dt.tzHour < 0)\n\t\tstr1 += \"-\";\n\telse\n\t\tstr1 += \"+\";\n\tCFX_ByteString str2;\n\tstr2.Format(\"%02d:%02d\", abs(dt.tzHour), dt.tzMinute);\n\treturn str1 + str2;\n}\n\nCFX_ByteString CPDFSDK_DateTime::ToPDFDateTimeString()\n{\n\tCFX_ByteString dtStr;\n\tchar tempStr[32];\n\tsprintf(tempStr, \"D:%04d%02d%02d%02d%02d%02d\", dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second);\n\tdtStr = CFX_ByteString(tempStr);\n\tif (dt.tzHour < 0)\n\t\tdtStr += CFX_ByteString(\"-\");\n\telse\n\t\tdtStr += CFX_ByteString(\"+\");\n\tsprintf(tempStr, \"%02d'%02d'\", abs(dt.tzHour), dt.tzMinute);\n\tdtStr += CFX_ByteString(tempStr);\n\treturn dtStr;\n}\n\nvoid CPDFSDK_DateTime::ToSystemTime(FX_SYSTEMTIME& st)\n{\n\tCPDFSDK_DateTime dt = *this;\n\ttime_t t = (time_t)dt;\n\tstruct tm* pTime = localtime(&t);\n\tif(pTime){ \n\t\tst.wYear = (FX_WORD)pTime->tm_year + 1900;\n\t\tst.wMonth = (FX_WORD)pTime->tm_mon + 1;\n\t\tst.wDay = (FX_WORD)pTime->tm_mday;\n\t\tst.wDayOfWeek = (FX_WORD)pTime->tm_wday;\n\t\tst.wHour = (FX_WORD)pTime->tm_hour;\n\t\tst.wMinute = (FX_WORD)pTime->tm_min;\n\t\tst.wSecond = (FX_WORD)pTime->tm_sec;\n\t\tst.wMilliseconds = 0;\n\t}\n}\n\nCPDFSDK_DateTime CPDFSDK_DateTime::ToGMT()\n{\n\tCPDFSDK_DateTime dt = *this;\n\tdt.AddSeconds(-_gAfxGetTimeZoneInSeconds(dt.dt.tzHour, dt.dt.tzMinute));\n\tdt.dt.tzHour = 0;\n\tdt.dt.tzMinute = 0;\n\treturn dt;\n}\n\nCPDFSDK_DateTime& CPDFSDK_DateTime::AddDays(short days)\n{\n\tif (days == 0) return *this;\n\n\tFX_SHORT\ty = dt.year, yy;\n\tFX_BYTE\t\tm = dt.month;\n\tFX_BYTE\t\td = dt.day;\n\tint\t\t\tmdays, ydays, ldays;\n\n\tldays = days;\n\tif (ldays > 0)\n\t{\n\t\tyy = y;\n\t\tif (((FX_WORD)m * 100 + d) > 300) yy ++;\n\t\tydays = _gAfxGetYearDays(yy);\n\t\twhile (ldays >= ydays)\n\t\t{\n\t\t\ty ++;\n\t\t\tldays -= ydays;\n\t\t\tyy ++;\n\t\t\tmdays = _gAfxGetMonthDays(y, m);\n\t\t\tif (d > mdays)\n\t\t\t{\n\t\t\t\tm ++;\n\t\t\t\td -= mdays;\n\t\t\t}\n\t\t\tydays = _gAfxGetYearDays(yy);\n\t\t}\n\t\tmdays = _gAfxGetMonthDays(y, m) - d + 1;\n\t\twhile (ldays >= mdays)\n\t\t{\n\t\t\tldays -= mdays;\n\t\t\tm ++;\n\t\t\td = 1;\n\t\t\tmdays = _gAfxGetMonthDays(y, m);\n\t\t}\n\t\td += ldays;\n\t}\n\telse\n\t{\n\t\tldays *= -1;\n\t\tyy = y;\n\t\tif (((FX_WORD)m * 100 + d) < 300) yy --;\n\t\tydays = _gAfxGetYearDays(yy);\n\t\twhile (ldays >= ydays)\n\t\t{\n\t\t\ty --;\n\t\t\tldays -= ydays;\n\t\t\tyy --;\n\t\t\tmdays = _gAfxGetMonthDays(y, m);\n\t\t\tif (d > mdays)\n\t\t\t{\n\t\t\t\tm ++;\n\t\t\t\td -= mdays;\n\t\t\t}\n\t\t\tydays = _gAfxGetYearDays(yy);\n\t\t}\n\t\twhile (ldays >= d)\n\t\t{\n\t\t\tldays -= d;\n\t\t\tm --;\n\t\t\tmdays = _gAfxGetMonthDays(y, m);\n\t\t\td = mdays;\n\t\t}\n\t\td -= ldays;\n\t}\n\n\tdt.year = y;\n\tdt.month = m;\n\tdt.day = d;\n\n\treturn *this;\n}\n\nCPDFSDK_DateTime& CPDFSDK_DateTime::AddSeconds(int seconds)\n{\n\tif (seconds == 0) return *this;\n\n\tint\tn;\n\tint\tdays;\n\n\tn = dt.hour * 3600 + dt.minute * 60 + dt.second + seconds;\n\tif (n < 0)\n\t{\n\t\tdays = (n - 86399) / 86400;\n\t\tn -= days * 86400;\n\t}\n\telse\n\t{\n\t\tdays = n / 86400;\n\t\tn %= 86400;\n\t}\n\tdt.hour = (FX_BYTE)(n / 3600);\n\tdt.hour %= 24;\n\tn %= 3600;\n\tdt.minute = (FX_BYTE)(n / 60);\n\tdt.second = (FX_BYTE)(n % 60);\n\tif (days != 0) AddDays(days);\n\n\treturn *this;\n}\n\n\n//---------------------------------------------------------------------------\n//\t\t\t\t\t\t\t\tCPDFSDK_Annot\t\n//---------------------------------------------------------------------------\nCPDFSDK_Annot::CPDFSDK_Annot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPageView) :\nm_pAnnot(pAnnot),\nm_pPageView(pPageView),\nm_bSelected(FALSE),\nm_nTabOrder(-1)\n{\n}\n\nCPDFSDK_Annot::~CPDFSDK_Annot()\n{\n\tm_pAnnot = NULL;\n\tm_pPageView = NULL;\n}\n\nCPDF_Annot*\tCPDFSDK_Annot::GetPDFAnnot()\n{\n\treturn m_pAnnot;\n}\n\nFX_DWORD CPDFSDK_Annot::GetFlags()\n{\n\tASSERT(m_pAnnot != NULL);\n\t\n\treturn m_pAnnot->GetFlags();\n}\n\nvoid CPDFSDK_Annot::SetPage(CPDFSDK_PageView* pPageView)\n{\n\tm_pPageView = pPageView;\n}\n\nCPDFSDK_PageView* CPDFSDK_Annot::GetPageView()\n{\n\treturn m_pPageView;\n}\n\nFX_BOOL CPDFSDK_Annot::IsSelected()\n{\n\treturn m_bSelected;\n}\n\nvoid CPDFSDK_Annot::SetSelected(FX_BOOL bSelected)\n{\n\tm_bSelected = bSelected;\n}\n\n// Tab Order\t\nint CPDFSDK_Annot::GetTabOrder()\n{\n\treturn m_nTabOrder;\n}\n\nvoid CPDFSDK_Annot::SetTabOrder(int iTabOrder)\n{\n\tm_nTabOrder = iTabOrder;\n}\n\nCPDF_Dictionary* CPDFSDK_Annot::GetAnnotDict() const\n{\n\tASSERT(m_pAnnot != NULL);\n\t\n\treturn m_pAnnot->m_pAnnotDict;\n}\n\nvoid CPDFSDK_Annot::SetRect(const CPDF_Rect& rect)\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\tASSERT(rect.right - rect.left >= GetMinWidth());\n\tASSERT(rect.top - rect.bottom >= GetMinHeight());\n\t\n\tm_pAnnot->m_pAnnotDict->SetAtRect(\"Rect\", rect);\n}\n\nCPDF_Rect CPDFSDK_Annot::GetRect() const\n{\n\tASSERT(m_pAnnot != NULL);\n\t\n\tCPDF_Rect rect;\n\tm_pAnnot->GetRect(rect);\n\t\n\treturn rect;\n}\n\nCFX_ByteString CPDFSDK_Annot::GetType() const\n{\n\tASSERT(m_pAnnot != NULL);\n\t\n\treturn m_pAnnot->GetSubType();\n}\n\nCFX_ByteString CPDFSDK_Annot::GetSubType() const\n{\n\treturn \"\";\n}\n\nvoid CPDFSDK_Annot::ResetAppearance()\n{\n\tASSERT(FALSE);\n}\n\nvoid CPDFSDK_Annot::DrawAppearance(CFX_RenderDevice* pDevice, const CPDF_Matrix* pUser2Device,\n\t\t\t\t\t\t\t\t   CPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions)\t\n{\n\tASSERT(m_pPageView != NULL);\n\tASSERT(m_pAnnot != NULL);\n\t\n\tm_pAnnot->DrawAppearance(m_pPageView->GetPDFPage(), pDevice, pUser2Device, mode, pOptions);\n}\n\nFX_BOOL\tCPDFSDK_Annot::IsAppearanceValid()\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\t\n\treturn m_pAnnot->m_pAnnotDict->GetDict(\"AP\") != NULL;\n}\n\nFX_BOOL\tCPDFSDK_Annot::IsAppearanceValid(CPDF_Annot::AppearanceMode mode)\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\t\n\tCPDF_Dictionary* pAP = m_pAnnot->m_pAnnotDict->GetDict(\"AP\");\n\tif (pAP == NULL) return FALSE;\n\t\n\t// Choose the right sub-ap\n\tconst FX_CHAR* ap_entry = \"N\";\n\tif (mode == CPDF_Annot::Down)\n\t\tap_entry = \"D\";\n\telse if (mode == CPDF_Annot::Rollover)\n\t\tap_entry = \"R\";\n\tif (!pAP->KeyExist(ap_entry))\n\t\tap_entry = \"N\";\n\t\n\t// Get the AP stream or subdirectory\n\tCPDF_Object* psub = pAP->GetElementValue(ap_entry);\n\tif (psub == NULL) return FALSE;\n\t\n\treturn TRUE;\n}\n\nvoid CPDFSDK_Annot::DrawBorder(CFX_RenderDevice* pDevice, const CPDF_Matrix* pUser2Device,\n\t\t\t\t\t\t   const CPDF_RenderOptions* pOptions)\n{\n\tASSERT(m_pAnnot != NULL);\n\tm_pAnnot->DrawBorder(pDevice, pUser2Device, pOptions); \n}\n\nvoid CPDFSDK_Annot::ClearCachedAP()\n{\n\tASSERT(m_pAnnot != NULL);\n\tm_pAnnot->ClearCachedAP();\n}    \n\nvoid CPDFSDK_Annot::SetContents(const CFX_WideString& sContents)\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\t\n\tif (sContents.IsEmpty())\n\t\tm_pAnnot->m_pAnnotDict->RemoveAt(\"Contents\");\n\telse\n\t\tm_pAnnot->m_pAnnotDict->SetAtString(\"Contents\", PDF_EncodeText(sContents));\n}\n\nCFX_WideString CPDFSDK_Annot::GetContents() const\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\t\n\treturn m_pAnnot->m_pAnnotDict->GetUnicodeText(\"Contents\");\n}\n\nvoid CPDFSDK_Annot::SetAnnotName(const CFX_WideString& sName)\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\t\n\tif (sName.IsEmpty())\n\t\tm_pAnnot->m_pAnnotDict->RemoveAt(\"NM\");\n\telse\n\t\tm_pAnnot->m_pAnnotDict->SetAtString(\"NM\", PDF_EncodeText(sName));\n}\n\nCFX_WideString CPDFSDK_Annot::GetAnnotName() const\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\t\n\treturn m_pAnnot->m_pAnnotDict->GetUnicodeText(\"NM\");\n}\n\nvoid CPDFSDK_Annot::SetModifiedDate(const FX_SYSTEMTIME& st)\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\t\n\tCPDFSDK_DateTime dt(st);\n\tCFX_ByteString str = dt.ToPDFDateTimeString();\n\t\n\tif (str.IsEmpty())\n\t\tm_pAnnot->m_pAnnotDict->RemoveAt(\"M\");\n\telse\n\t\tm_pAnnot->m_pAnnotDict->SetAtString(\"M\", str);\n}\n\nFX_SYSTEMTIME CPDFSDK_Annot::GetModifiedDate() const\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\t\n\tFX_SYSTEMTIME systime;\t\n\tCFX_ByteString str = m_pAnnot->m_pAnnotDict->GetString(\"M\");\n\t\n \tCPDFSDK_DateTime dt(str);\n \tdt.ToSystemTime(systime);\n\t\n\treturn systime;\n}\n\nvoid CPDFSDK_Annot::SetFlags(int nFlags)\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\t\n\tm_pAnnot->m_pAnnotDict->SetAtInteger(\"F\", nFlags);\n}\n\nint CPDFSDK_Annot::GetFlags() const\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\t\n\treturn m_pAnnot->m_pAnnotDict->GetInteger(\"F\");\n}\n\nvoid CPDFSDK_Annot::SetAppState(const CFX_ByteString& str)\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\n\tif (str.IsEmpty())\n\t\tm_pAnnot->m_pAnnotDict->RemoveAt(\"AS\");\n\telse\n\t\tm_pAnnot->m_pAnnotDict->SetAtString(\"AS\", str);\n}\n\nCFX_ByteString CPDFSDK_Annot::GetAppState() const\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\n\treturn m_pAnnot->m_pAnnotDict->GetString(\"AS\");\n}\n\nvoid CPDFSDK_Annot::SetStructParent(int key)\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\t\n\tm_pAnnot->m_pAnnotDict->SetAtInteger(\"StructParent\", key);\n}\n\nint\tCPDFSDK_Annot::GetStructParent() const\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\t\n\treturn m_pAnnot->m_pAnnotDict->GetInteger(\"StructParent\");\n}\n\n//border\nvoid CPDFSDK_Annot::SetBorderWidth(int nWidth)\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\n\tCPDF_Array* pBorder = m_pAnnot->m_pAnnotDict->GetArray(\"Border\");\n\n\tif (pBorder)\n\t{\n\t\tpBorder->SetAt(2, FX_NEW CPDF_Number(nWidth));\n\t}\n\telse\n\t{\n\t\tCPDF_Dictionary* pBSDict = m_pAnnot->m_pAnnotDict->GetDict(\"BS\");\n\n\t\tif (!pBSDict)\n\t\t{\n\t\t\tpBSDict = FX_NEW CPDF_Dictionary;\n\t\t\tm_pAnnot->m_pAnnotDict->SetAt(\"BS\", pBSDict);\n\t\t}\n\n\t\tpBSDict->SetAtInteger(\"W\", nWidth);\n\t}\n}\n\nint\tCPDFSDK_Annot::GetBorderWidth() const\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\n\tCPDF_Array* pBorder = m_pAnnot->m_pAnnotDict->GetArray(\"Border\");\n\n\tif (pBorder)\n\t{\n\t\treturn pBorder->GetInteger(2);\n\t}\n\telse\n\t{\n\t\tCPDF_Dictionary* pBSDict = m_pAnnot->m_pAnnotDict->GetDict(\"BS\");\n\n\t\tif (pBSDict)\n\t\t{\n\t\t\treturn pBSDict->GetInteger(\"W\", 1);\n\t\t}\n\t}\n\treturn 1;\n}\n\nvoid CPDFSDK_Annot::SetBorderStyle(int nStyle)\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\n\tCPDF_Dictionary* pBSDict = m_pAnnot->m_pAnnotDict->GetDict(\"BS\");\n\tif (!pBSDict)\n\t{\n\t\tpBSDict = FX_NEW CPDF_Dictionary;\n\t\tm_pAnnot->m_pAnnotDict->SetAt(\"BS\", pBSDict);\n\t}\n\n\tswitch (nStyle)\n\t{\n\tcase BBS_SOLID:\n\t\tpBSDict->SetAtName(\"S\", \"S\");\n\t\tbreak;\n\tcase BBS_DASH:\n\t\tpBSDict->SetAtName(\"S\", \"D\");\n\t\tbreak;\n\tcase BBS_BEVELED:\n\t\tpBSDict->SetAtName(\"S\", \"B\");\n\t\tbreak;\n\tcase BBS_INSET:\n\t\tpBSDict->SetAtName(\"S\", \"I\");\n\t\tbreak;\n\tcase BBS_UNDERLINE:\n\t\tpBSDict->SetAtName(\"S\", \"U\");\n\t\tbreak;\n\t}\n}\n\nint\tCPDFSDK_Annot::GetBorderStyle() const\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\n\tCPDF_Dictionary* pBSDict = m_pAnnot->m_pAnnotDict->GetDict(\"BS\");\n\tif (pBSDict)\n\t{\n\t\tCFX_ByteString sBorderStyle = pBSDict->GetString(\"S\", \"S\");\n\t\tif (sBorderStyle == \"S\") return BBS_SOLID;\n\t\tif (sBorderStyle == \"D\") return BBS_DASH;\n\t\tif (sBorderStyle == \"B\") return BBS_BEVELED;\n\t\tif (sBorderStyle == \"I\") return BBS_INSET;\n\t\tif (sBorderStyle == \"U\") return BBS_UNDERLINE;\n\t}\n\n\tCPDF_Array* pBorder = m_pAnnot->m_pAnnotDict->GetArray(\"Border\");\n\tif (pBorder)\n\t{\n\t\tif (pBorder->GetCount() >= 4) \n\t\t{ \n\t\t\tCPDF_Array *pDP = pBorder->GetArray(3);\n\t\t\tif (pDP && pDP->GetCount() > 0)\n\t\t\t\treturn BBS_DASH;\n\t\t}\n\t}\n\n\treturn BBS_SOLID;\n}\n\nvoid CPDFSDK_Annot::SetBorderDash(const CFX_IntArray& array)\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\n\tCPDF_Dictionary* pBSDict = m_pAnnot->m_pAnnotDict->GetDict(\"BS\");\n\tif (!pBSDict)\n\t{\n\t\tpBSDict = FX_NEW CPDF_Dictionary;\n\t\tm_pAnnot->m_pAnnotDict->SetAt(\"BS\", pBSDict);\n\t}\n\n\tCPDF_Array* pArray = FX_NEW CPDF_Array;\n\tfor (int i=0,sz=array.GetSize(); i<sz; i++)\n\t{\n\t\tpArray->AddInteger(array[i]);\n\t}\n\n\tpBSDict->SetAt(\"D\", pArray);\n}\n\nvoid CPDFSDK_Annot::GetBorderDash(CFX_IntArray& array) const\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\n\tCPDF_Array* pDash = NULL;\n\n\tCPDF_Array* pBorder = m_pAnnot->m_pAnnotDict->GetArray(\"Border\");\n\tif (pBorder)\n\t{\n\t\tpDash = pBorder->GetArray(3);\n\t}\n\telse\n\t{\n\t\tCPDF_Dictionary* pBSDict = m_pAnnot->m_pAnnotDict->GetDict(\"BS\");\n\t\tif (pBSDict)\n\t\t{\n\t\t\tpDash = pBSDict->GetArray(\"D\");\n\t\t}\n\t}\n\n\tif (pDash)\n\t{\n\t\tfor (int i=0,sz=pDash->GetCount(); i<sz; i++)\n\t\t{\n\t\t\tarray.Add(pDash->GetInteger(i));\n\t\t}\n\t}\n}\n\nvoid CPDFSDK_Annot::SetColor(FX_COLORREF color)\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\n\tCPDF_Array* pArray = FX_NEW CPDF_Array;\n\tpArray->AddNumber((FX_FLOAT)FXSYS_GetRValue(color) / 255.0f);\n\tpArray->AddNumber((FX_FLOAT)FXSYS_GetGValue(color) / 255.0f);\n\tpArray->AddNumber((FX_FLOAT)FXSYS_GetBValue(color) / 255.0f);\n\tm_pAnnot->m_pAnnotDict->SetAt(\"C\", pArray);\n}\n\nvoid CPDFSDK_Annot::RemoveColor()\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\n\tm_pAnnot->m_pAnnotDict->RemoveAt(\"C\") ; \n}\n\nFX_BOOL CPDFSDK_Annot::GetColor(FX_COLORREF& color) const\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\n\tif (CPDF_Array* pEntry = m_pAnnot->m_pAnnotDict->GetArray(\"C\"))\t\t\n\t{\n\t\tint nCount = pEntry->GetCount();\n\t\tif (nCount == 1)\n\t\t{\n\t\t\tFX_FLOAT g = pEntry->GetNumber(0) * 255;\n\n\t\t\tcolor = FXSYS_RGB((int)g, (int)g, (int)g);\n\n\t\t\treturn TRUE;\n\t\t}\n\t\telse if (nCount == 3)\n\t\t{\n\t\t\tFX_FLOAT r = pEntry->GetNumber(0) * 255;\n\t\t\tFX_FLOAT g = pEntry->GetNumber(1) * 255;\n\t\t\tFX_FLOAT b = pEntry->GetNumber(2) * 255;\n\n\t\t\tcolor = FXSYS_RGB((int)r, (int)g, (int)b);\n\n\t\t\treturn TRUE;\n\t\t}\n\t\telse if (nCount == 4)\n\t\t{\n\t\t\tFX_FLOAT c = pEntry->GetNumber(0);\n\t\t\tFX_FLOAT m = pEntry->GetNumber(1);\n\t\t\tFX_FLOAT y = pEntry->GetNumber(2);\n\t\t\tFX_FLOAT k = pEntry->GetNumber(3);\n\n\t\t\tFX_FLOAT r = 1.0f - FX_MIN(1.0f, c + k);\n\t\t\tFX_FLOAT g = 1.0f - FX_MIN(1.0f, m + k);\n\t\t\tFX_FLOAT b = 1.0f - FX_MIN(1.0f, y + k);\n\n\t\t\tcolor = FXSYS_RGB((int)(r * 255), (int)(g * 255), (int)(b * 255));\n\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\treturn FALSE;\n}\n\n\nvoid CPDFSDK_Annot::WriteAppearance(const CFX_ByteString& sAPType, const CPDF_Rect& rcBBox, \n\t\t\t\t\t\t\t\tconst CPDF_Matrix& matrix, const CFX_ByteString& sContents,\n\t\t\t\t\t\t\t\tconst CFX_ByteString& sAPState)\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\t\n\tCPDF_Dictionary* pAPDict = m_pAnnot->m_pAnnotDict->GetDict(\"AP\");\n\t\n\tif (!pAPDict) \n\t{\n\t\tpAPDict = FX_NEW CPDF_Dictionary;\n\t\tm_pAnnot->m_pAnnotDict->SetAt(\"AP\", pAPDict);\n\t}\n\t\n\tCPDF_Stream* pStream = NULL;\n\tCPDF_Dictionary* pParentDict = NULL;\n\t\n\tif (sAPState.IsEmpty())\n\t{\n\t\tpParentDict = pAPDict;\n\t\tpStream = pAPDict->GetStream(sAPType);\n\t}\n\telse\n\t{\n\t\tCPDF_Dictionary* pAPTypeDict = pAPDict->GetDict(sAPType);\n\t\tif (!pAPTypeDict)\n\t\t{\n\t\t\tpAPTypeDict = FX_NEW CPDF_Dictionary;\n\t\t\tpAPDict->SetAt(sAPType, pAPTypeDict);\n\t\t}\n\t\t\n\t\tpParentDict = pAPTypeDict;\n\t\tpStream = pAPTypeDict->GetStream(sAPState);\n\t}\n\t\n\tif (!pStream) \n\t{\n\t\tASSERT(m_pPageView != NULL);\n\t\tCPDF_Document* pDoc = m_pPageView->GetPDFDocument();\n\t\tASSERT(pDoc != NULL);\n\t\t\n\t\tpStream = FX_NEW CPDF_Stream(NULL, 0, NULL);\n\t\tFX_INT32 objnum = pDoc->AddIndirectObject(pStream);\n\t\t//pAPDict->SetAtReference(sAPType, pDoc, objnum);\n\t\tASSERT(pParentDict != NULL);\n\t\tpParentDict->SetAtReference(sAPType, pDoc, objnum);\n\t}\n\t\n\tCPDF_Dictionary * pStreamDict = pStream->GetDict();\n\t\n\tif (!pStreamDict)\n\t{\n\t\tpStreamDict = FX_NEW CPDF_Dictionary;\n\t\tpStreamDict->SetAtName(\"Type\", \"XObject\");\n\t\tpStreamDict->SetAtName(\"Subtype\", \"Form\");\n\t\tpStreamDict->SetAtInteger(\"FormType\", 1);\n\t\tpStream->InitStream(NULL,0,pStreamDict);\n\t}\n\t\n\tif (pStreamDict)\n\t{\n\t\tpStreamDict->SetAtMatrix(\"Matrix\",matrix);\t\n\t\tpStreamDict->SetAtRect(\"BBox\", rcBBox);\t\t\n\t}\n\t\n\tpStream->SetData((FX_BYTE*)(FX_LPCSTR)sContents, sContents.GetLength(), FALSE, FALSE);\n}\n\n#define BA_ANNOT_MINWIDTH\t\t\t1\n#define BA_ANNOT_MINHEIGHT\t\t\t1\n\nFX_FLOAT CPDFSDK_Annot::GetMinWidth() const\n{\n\treturn BA_ANNOT_MINWIDTH;\n}\n\nFX_FLOAT CPDFSDK_Annot::GetMinHeight() const\n{\n\treturn BA_ANNOT_MINHEIGHT;\n}\n\nFX_BOOL CPDFSDK_Annot::CreateFormFiller()\n{\n\treturn TRUE;\n}\nFX_BOOL\tCPDFSDK_Annot::IsVisible() const\n{\n\tint nFlags = GetFlags();\n\treturn !((nFlags & ANNOTFLAG_INVISIBLE) || (nFlags & ANNOTFLAG_HIDDEN) || (nFlags & ANNOTFLAG_NOVIEW));\n}\n\nCPDF_Action CPDFSDK_Annot::GetAction() const\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\t\n\treturn m_pAnnot->m_pAnnotDict->GetDict(\"A\");\n}\n\nvoid CPDFSDK_Annot::SetAction(const CPDF_Action& action)\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\t\n\tASSERT(action != NULL);\n\t\n\tif ((CPDF_Action&)action != m_pAnnot->m_pAnnotDict->GetDict(\"A\"))\n\t{\n\t\tCPDF_Document* pDoc = m_pPageView->GetPDFDocument();\n\t\tASSERT(pDoc != NULL);\n\t\t\n\t\tif (action.m_pDict && (action.m_pDict->GetObjNum() == 0))\n\t\t\tpDoc->AddIndirectObject(action.m_pDict); \n\t\tm_pAnnot->m_pAnnotDict->SetAtReference(\"A\", pDoc, action.m_pDict->GetObjNum());\n\t}\n}\n\nvoid CPDFSDK_Annot::RemoveAction()\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\t\n\tm_pAnnot->m_pAnnotDict->RemoveAt(\"A\");\n}\n\nCPDF_AAction CPDFSDK_Annot::GetAAction() const\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\t\n\treturn m_pAnnot->m_pAnnotDict->GetDict(\"AA\");\n}\n\nvoid CPDFSDK_Annot::SetAAction(const CPDF_AAction& aa)\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\tASSERT(aa != NULL);\n\t\n\tif ((CPDF_AAction&)aa != m_pAnnot->m_pAnnotDict->GetDict(\"AA\"))\n\t\tm_pAnnot->m_pAnnotDict->SetAt(\"AA\", (CPDF_AAction&)aa);\n}\n\nvoid CPDFSDK_Annot::RemoveAAction()\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\t\n\tm_pAnnot->m_pAnnotDict->RemoveAt(\"AA\");\n}\n\nCPDF_Action\tCPDFSDK_Annot::GetAAction(CPDF_AAction::AActionType eAAT)\n{\n\tCPDF_AAction AAction = GetAAction();\n\t\n\tif (AAction.ActionExist(eAAT))\n\t{\n\t\treturn AAction.GetAction(eAAT);\n\t}\n\telse if (eAAT == CPDF_AAction::ButtonUp)\n\t{\n\t\treturn GetAction();\n\t}\n\t\n\treturn NULL;\n}\n\nvoid  CPDFSDK_Annot::Annot_OnDraw(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, CPDF_RenderOptions* pOptions)\n{\n\t\n\tm_pAnnot->GetAPForm(m_pPageView->GetPDFPage(), CPDF_Annot::Normal);\n\tm_pAnnot->DrawAppearance(m_pPageView->GetPDFPage(), pDevice, pUser2Device, CPDF_Annot::Normal, NULL);\n\n\treturn ;\n}\n\nCPDF_Page* CPDFSDK_Annot::GetPDFPage()\n{\n\tif(m_pPageView)\n\t\treturn m_pPageView->GetPDFPage();\n\treturn NULL;\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/fsdk_baseform.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../include/fsdk_define.h\"\n#include \"../include/fsdk_mgr.h\"\n#include \"../include/fsdk_baseannot.h\"\n#include \"../include/fsdk_baseform.h\"\n#include \"../include/formfiller/FFL_FormFiller.h\"\n#include \"../include/fsdk_actionhandler.h\"\n\n//#include \"../include/javascript/IJavaScript.h\"\n\n//------------------------------------------------------------------------------------\n//*\t\t\t\t\t\t\t\t\t\tCPDFSDK_Widget \n//------------------------------------------------------------------------------------\n\n#define IsFloatZero(f)\t\t\t\t\t\t((f) < 0.01 && (f) > -0.01)\n#define IsFloatBigger(fa,fb)\t\t\t\t((fa) > (fb) && !IsFloatZero((fa) - (fb)))\n#define IsFloatSmaller(fa,fb)\t\t\t\t((fa) < (fb) && !IsFloatZero((fa) - (fb)))\n#define IsFloatEqual(fa,fb)\t\t\t\t\tIsFloatZero((fa)-(fb))\n\nCPDFSDK_Widget::CPDFSDK_Widget(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPageView, CPDFSDK_InterForm* pInterForm) :\n\t\t\t\t\tCPDFSDK_Annot(pAnnot, pPageView),\n\t\t\t\t\tm_pInterForm(pInterForm),\n\t\t\t\t\tm_nAppAge(0),\n\t\t\t\t\tm_nValueAge(0)\n{\n\tASSERT(m_pInterForm != NULL);\n}\n\nCPDFSDK_Widget::~CPDFSDK_Widget()\n{\n\n}\n\nFX_BOOL\t\tCPDFSDK_Widget::IsWidgetAppearanceValid(CPDF_Annot::AppearanceMode mode)\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\t\n\tCPDF_Dictionary* pAP = m_pAnnot->m_pAnnotDict->GetDict(\"AP\");\n\tif (pAP == NULL) return FALSE;\n\t\n\t// Choose the right sub-ap\n\tconst FX_CHAR* ap_entry = \"N\";\n\tif (mode == CPDF_Annot::Down)\n\t\tap_entry = \"D\";\n\telse if (mode == CPDF_Annot::Rollover)\n\t\tap_entry = \"R\";\n\tif (!pAP->KeyExist(ap_entry))\n\t\tap_entry = \"N\";\n\t\n\t// Get the AP stream or subdirectory\n\tCPDF_Object* psub = pAP->GetElementValue(ap_entry);\n\tif (psub == NULL) return FALSE;\n\t\n\tint nFieldType = GetFieldType();\n\tswitch (nFieldType)\n\t{\n\tcase FIELDTYPE_PUSHBUTTON:\n\tcase FIELDTYPE_COMBOBOX:\n\tcase FIELDTYPE_LISTBOX:\n\tcase FIELDTYPE_TEXTFIELD:\n\tcase FIELDTYPE_SIGNATURE:\n\t\treturn psub->GetType() == PDFOBJ_STREAM;\n\tcase FIELDTYPE_CHECKBOX:\n\tcase FIELDTYPE_RADIOBUTTON:\n\t\tif (psub->GetType() == PDFOBJ_DICTIONARY) \n\t\t{\n\t\t\tCPDF_Dictionary* pSubDict = (CPDF_Dictionary*)psub;\n\t\t\t\n\t\t\treturn pSubDict->GetStream(this->GetAppState()) != NULL;\n\t\t}\n\t\telse\n\t\t\treturn FALSE;\n\t\tbreak;\n\t}\n\t\n\treturn TRUE;\n}\n\nint\tCPDFSDK_Widget::GetFieldType() const\n{\n\tCPDF_FormField* pField = GetFormField();\n\tASSERT(pField != NULL);\n\t\n\treturn pField->GetFieldType();\n}\n\nint CPDFSDK_Widget::GetFieldFlags() const\n{\n\tCPDF_InterForm* pPDFInterForm = m_pInterForm->GetInterForm();\n\tASSERT(pPDFInterForm != NULL);\n\n\tCPDF_FormControl* pFormControl = pPDFInterForm->GetControlByDict(m_pAnnot->m_pAnnotDict);\n\tCPDF_FormField* pFormField = pFormControl->GetField();\n\treturn pFormField->GetFieldFlags();\n}\n\nCFX_ByteString CPDFSDK_Widget::GetSubType() const\n{\n\tint nType = GetFieldType();\n\t\n\tif (nType == FIELDTYPE_SIGNATURE)\n\t\treturn BFFT_SIGNATURE;\n\treturn CPDFSDK_Annot::GetSubType();\n}\n\nCPDF_FormField*\tCPDFSDK_Widget::GetFormField() const\n{\n\tASSERT(m_pInterForm != NULL);\n\t\n\tCPDF_FormControl* pCtrl = GetFormControl();\t\n\tASSERT(pCtrl != NULL);\n\t\n\treturn pCtrl->GetField();\n}\n\nCPDF_FormControl* CPDFSDK_Widget::GetFormControl() const\n{\n\tASSERT(m_pInterForm != NULL);\n\t\n\tCPDF_InterForm* pPDFInterForm = m_pInterForm->GetInterForm();\n\tASSERT(pPDFInterForm != NULL);\n\t\n\treturn pPDFInterForm->GetControlByDict(GetAnnotDict());\n}\nstatic CPDF_Dictionary* BF_GetField(CPDF_Dictionary* pFieldDict, const FX_CHAR* name)\n{\n\tif (pFieldDict == NULL) return NULL;\n\t// First check the dictionary itself\n\tCPDF_Object* pAttr = pFieldDict->GetElementValue(name);\n\tif (pAttr) return pFieldDict;\n\t\n\t// Now we need to search from parents\n\tCPDF_Dictionary* pParent = pFieldDict->GetDict(\"Parent\");\n\tif (pParent == NULL) return NULL;\n\t\n\treturn BF_GetField(pParent, name);\n}\n\nCPDF_FormControl* CPDFSDK_Widget::GetFormControl(CPDF_InterForm* pInterForm, CPDF_Dictionary* pAnnotDict)\n{\n\tASSERT(pInterForm != NULL);\n\tASSERT(pAnnotDict != NULL);\n\t\n\tCPDF_FormControl* pControl = pInterForm->GetControlByDict(pAnnotDict);\n\t\n\treturn pControl;\n}\n\nint CPDFSDK_Widget::GetRotate() const\n{\n\tCPDF_FormControl* pCtrl = this->GetFormControl();\n\tASSERT(pCtrl != NULL);\n\t\n\treturn pCtrl->GetRotation() % 360;\n}\n\nFX_BOOL\tCPDFSDK_Widget::GetFillColor(FX_COLORREF& color) const\n{\n\tCPDF_FormControl* pFormCtrl = GetFormControl();\n\tASSERT(pFormCtrl != NULL);\n\t\n\tint iColorType = 0;\t\n\tcolor = FX_ARGBTOCOLORREF(pFormCtrl->GetBackgroundColor(iColorType));\n\t\n\treturn iColorType != COLORTYPE_TRANSPARENT;\n}\n\nFX_BOOL\tCPDFSDK_Widget::GetBorderColor(FX_COLORREF& color) const\n{\n\tCPDF_FormControl* pFormCtrl = GetFormControl();\n\tASSERT(pFormCtrl != NULL);\n\t\n\tint iColorType = 0;\t\n\tcolor = FX_ARGBTOCOLORREF(pFormCtrl->GetBorderColor(iColorType));\n\t\n\treturn iColorType != COLORTYPE_TRANSPARENT;\n}\n\nFX_BOOL\tCPDFSDK_Widget::GetTextColor(FX_COLORREF& color) const\n{\n\tCPDF_FormControl* pFormCtrl = GetFormControl();\n\tASSERT(pFormCtrl != NULL);\n\t\n\tCPDF_DefaultAppearance da = pFormCtrl->GetDefaultAppearance();\n\tif (da.HasColor())\n\t{\n\t\tFX_ARGB argb;\n\t\tint iColorType = COLORTYPE_TRANSPARENT;\t\n\t\tda.GetColor(argb, iColorType);\n\t\tcolor = FX_ARGBTOCOLORREF(argb);\n\t\t\n\t\treturn iColorType != COLORTYPE_TRANSPARENT;\n\t}\n\t\n\treturn FALSE;\n}\n\nFX_FLOAT CPDFSDK_Widget::GetFontSize() const\n{\n\tCPDF_FormControl* pFormCtrl = GetFormControl();\n\tASSERT(pFormCtrl != NULL);\n\t\n\tCPDF_DefaultAppearance pDa = pFormCtrl->GetDefaultAppearance();\n\tCFX_ByteString csFont = \"\";\n\tFX_FLOAT fFontSize = 0.0f;\n\tpDa.GetFont(csFont, fFontSize);\n\t\n\treturn fFontSize;\n}\n\nint\tCPDFSDK_Widget::GetSelectedIndex(int nIndex) const\n{\n\tCPDF_FormField*\tpFormField = GetFormField();\n\tASSERT(pFormField != NULL);\n\t\n\treturn pFormField->GetSelectedIndex(nIndex);\n}\n\nCFX_WideString CPDFSDK_Widget::GetValue() const\n{\n\tCPDF_FormField*\tpFormField = GetFormField();\n\tASSERT(pFormField != NULL);\n\t\n\treturn pFormField->GetValue();\n}\n\nCFX_WideString CPDFSDK_Widget::GetDefaultValue() const\n{\n\tCPDF_FormField*\tpFormField = GetFormField();\n\tASSERT(pFormField != NULL);\n\t\n\treturn pFormField->GetDefaultValue();\n}\n\nCFX_WideString CPDFSDK_Widget::GetOptionLabel(int nIndex) const\n{\n\tCPDF_FormField*\tpFormField = GetFormField();\n\tASSERT(pFormField != NULL);\n\t\n\treturn pFormField->GetOptionLabel(nIndex);\n}\n\nint\tCPDFSDK_Widget::CountOptions() const\n{\n\tCPDF_FormField*\tpFormField = GetFormField();\n\tASSERT(pFormField != NULL);\n\t\n\treturn pFormField->CountOptions();\n}\n\nFX_BOOL\tCPDFSDK_Widget::IsOptionSelected(int nIndex) const\n{\n\tCPDF_FormField*\tpFormField = GetFormField();\n\tASSERT(pFormField != NULL);\n\t\n\treturn pFormField->IsItemSelected(nIndex);\n}\n\nint\tCPDFSDK_Widget::GetTopVisibleIndex() const\n{\n\tCPDF_FormField*\tpFormField = GetFormField();\n\tASSERT(pFormField != NULL);\n\t\n\treturn pFormField->GetTopVisibleIndex();\n}\n\nFX_BOOL\tCPDFSDK_Widget::IsChecked() const\n{\n\tCPDF_FormControl* pFormCtrl = GetFormControl();\n\tASSERT(pFormCtrl != NULL);\n\t\n\treturn pFormCtrl->IsChecked();\n}\n\nint\tCPDFSDK_Widget::GetAlignment() const\n{\n\tCPDF_FormControl* pFormCtrl = GetFormControl();\n\tASSERT(pFormCtrl != NULL);\n\t\n\treturn pFormCtrl->GetControlAlignment();\n}\n\nint\tCPDFSDK_Widget::GetMaxLen() const\n{\n\tCPDF_FormField*\tpFormField = GetFormField();\n\tASSERT(pFormField != NULL);\n\t\n\treturn pFormField->GetMaxLen();\n}\n\nvoid CPDFSDK_Widget::SetCheck(FX_BOOL bChecked, FX_BOOL bNotify)\n{\n\tCPDF_FormControl* pFormCtrl = GetFormControl();\n\tASSERT(pFormCtrl != NULL);\n\t\n\tCPDF_FormField*\tpFormField = pFormCtrl->GetField();\n\tASSERT(pFormField != NULL);\n\t\n\tpFormField->CheckControl(pFormField->GetControlIndex(pFormCtrl), bChecked, bNotify);\n}\n\nvoid CPDFSDK_Widget::SetValue(const CFX_WideString& sValue, FX_BOOL bNotify)\n{\n\tCPDF_FormField*\tpFormField = GetFormField();\n\tASSERT(pFormField != NULL);\n\t\n\tpFormField->SetValue(sValue, bNotify);\n}\n\nvoid CPDFSDK_Widget::SetDefaultValue(const CFX_WideString& sValue)\n{\n}\nvoid CPDFSDK_Widget::SetOptionSelection(int index, FX_BOOL bSelected, FX_BOOL bNotify)\n{\n\tCPDF_FormField* pFormField = GetFormField();\n\tASSERT(pFormField != NULL);\n\t\n\tpFormField->SetItemSelection(index, bSelected, bNotify);\n}\n\nvoid CPDFSDK_Widget::ClearSelection(FX_BOOL bNotify)\n{\n\tCPDF_FormField* pFormField = GetFormField();\n\tASSERT(pFormField != NULL);\n\t\n\tpFormField->ClearSelection(bNotify);\n}\n\nvoid CPDFSDK_Widget::SetTopVisibleIndex(int index)\n{\n}\n\nvoid CPDFSDK_Widget::SetAppModified()\n{\n\tm_bAppModified = TRUE;\n}\n\nvoid CPDFSDK_Widget::ClearAppModified()\n{\n\tm_bAppModified = FALSE;\n}\n\nFX_BOOL CPDFSDK_Widget::IsAppModified() const\n{\n\treturn m_bAppModified;\n}\n\nvoid CPDFSDK_Widget::ResetAppearance(FX_LPCWSTR sValue, FX_BOOL bValueChanged)\n{\n\tSetAppModified();\n\n\tm_nAppAge++;\n\tif (m_nAppAge > 999999)\n\t\tm_nAppAge = 0;\n\tif (bValueChanged)\n\t\tm_nValueAge++;\n\n\tint nFieldType = GetFieldType();\n\t\n\tswitch (nFieldType)\n\t{\n\tcase FIELDTYPE_PUSHBUTTON:\n\t\tResetAppearance_PushButton();\n\t\tbreak;\n\tcase FIELDTYPE_CHECKBOX:\n\t\tResetAppearance_CheckBox();\n\t\tbreak;\n\tcase FIELDTYPE_RADIOBUTTON:\n\t\tResetAppearance_RadioButton();\n\t\tbreak;\n\tcase FIELDTYPE_COMBOBOX:\n\t\tResetAppearance_ComboBox(sValue);\n\t\tbreak;\n\tcase FIELDTYPE_LISTBOX:\n\t\tResetAppearance_ListBox();\n\t\tbreak;\n\tcase FIELDTYPE_TEXTFIELD:\n\t\tResetAppearance_TextField(sValue);\n\t\tbreak;\n\t}\n\t\n\tASSERT(m_pAnnot != NULL);\n\tm_pAnnot->ClearCachedAP();\n}\n\nCFX_WideString CPDFSDK_Widget::OnFormat(int nCommitKey, FX_BOOL& bFormated)\n{\n \tCPDF_FormField* pFormField = GetFormField();\n \tASSERT(pFormField != NULL);\n \t\n \tASSERT(m_pInterForm != NULL);\n\t\n\treturn m_pInterForm->OnFormat(pFormField, nCommitKey, bFormated);\n\n}\n\nvoid CPDFSDK_Widget::ResetFieldAppearance(FX_BOOL bValueChanged)\n{\n\tCPDF_FormField* pFormField = GetFormField();\n\tASSERT(pFormField != NULL);\n\t\n\tASSERT(m_pInterForm != NULL);\n\n\tm_pInterForm->ResetFieldAppearance(pFormField, NULL, bValueChanged);\n}\n\nvoid\tCPDFSDK_Widget::DrawAppearance(CFX_RenderDevice* pDevice, const CPDF_Matrix* pUser2Device,\n\t\tCPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions)\n{\n\tint nFieldType = GetFieldType();\n\t\n\tif ((nFieldType == FIELDTYPE_CHECKBOX || nFieldType == FIELDTYPE_RADIOBUTTON) &&\n\t\tmode == CPDF_Annot::Normal && \n\t\t!this->IsWidgetAppearanceValid(CPDF_Annot::Normal))\n\t{\n\t\tCFX_PathData pathData;\n\t\t\n\t\tCPDF_Rect rcAnnot = this->GetRect();\n\t\t\n\t\tpathData.AppendRect(rcAnnot.left, rcAnnot.bottom,\n\t\t\trcAnnot.right, rcAnnot.top);\n\t\t\n\t\tCFX_GraphStateData gsd;\n\t\tgsd.m_LineWidth = 0.0f;\n\t\t\n\t\tpDevice->DrawPath(&pathData, pUser2Device, &gsd, 0, 0xFFAAAAAA, FXFILL_ALTERNATE);\n\t}\n\telse\n\t{\n\t\tCPDFSDK_Annot::DrawAppearance(pDevice, pUser2Device, mode, pOptions);\n\t}\n}\n\nvoid CPDFSDK_Widget::UpdateField()\n{\n\tCPDF_FormField* pFormField = GetFormField();\n\tASSERT(pFormField != NULL);\n\t\n\tASSERT(m_pInterForm != NULL);\n\tm_pInterForm->UpdateField(pFormField);\n}\n\nvoid CPDFSDK_Widget::DrawShadow(CFX_RenderDevice* pDevice, CPDFSDK_PageView* pPageView)\n{\n \tASSERT(m_pInterForm != NULL);\n \n\tint nFieldType = GetFieldType();\n \tif (m_pInterForm->IsNeedHighLight(nFieldType))\n \t{\n \n//  \t\tif (nFieldType != FIELDTYPE_PUSHBUTTON)\n//  \t\t{\n\t\t\tCPDF_Rect rc  = GetRect();\n\t\t\tFX_COLORREF color = m_pInterForm->GetHighlightColor(nFieldType);\n\t\t\tFX_BYTE alpha = m_pInterForm->GetHighlightAlpha();\n\n\t\t\tCFX_FloatRect rcDevice;\n\t\t\tASSERT(m_pInterForm->GetDocument());\n\t\t\tCPDFDoc_Environment* pEnv = m_pInterForm->GetDocument()->GetEnv();\n\t\t\tif(!pEnv)\n\t\t\t\treturn;\n\t\t\tCFX_AffineMatrix page2device;\n\t\t\tpPageView->GetCurrentMatrix(page2device);\n\t\t\tpage2device.Transform(((FX_FLOAT)rc.left), ((FX_FLOAT)rc.bottom), rcDevice.left, rcDevice.bottom);\n// \t\t\tpEnv->FFI_PageToDevice(m_pPageView->GetPDFPage(), rc.left, rc.bottom, &rcDevice.left, &rcDevice.bottom);\n// \t\t\tpEnv->FFI_PageToDevice(m_pPageView->GetPDFPage(), rc.right, rc.top, &rcDevice.right, &rcDevice.top);\n\t\t\tpage2device.Transform(((FX_FLOAT)rc.right), ((FX_FLOAT)rc.top), rcDevice.right, rcDevice.top);\n\n\t\t\trcDevice.Normalize();\n\n\t\t\tFX_ARGB argb = ArgbEncode((int)alpha, color);\n\t\t\tFX_RECT rcDev((int)rcDevice.left,(int)rcDevice.top,(int)rcDevice.right,(int)rcDevice.bottom);\n\t\t\tpDevice->FillRect(&rcDev, argb);\t\n\t\t\t/* \t\t}*/\n\t}\n}\n\nvoid CPDFSDK_Widget::ResetAppearance_PushButton()\n{\n\tCPDF_FormControl* pControl = GetFormControl();\n\tASSERT(pControl != NULL);\n\n\n\t\n\tCPDF_Rect rcWindow = GetRotatedRect();\t\n\n\tFX_INT32 nLayout = 0;\n\n\tswitch (pControl->GetTextPosition())\n\t{\n\tcase TEXTPOS_ICON:\n\t\tnLayout = PPBL_ICON;\n\t\tbreak;\n\tcase TEXTPOS_BELOW:\n\t\tnLayout = PPBL_ICONTOPLABELBOTTOM;\n\t\tbreak;\n\tcase TEXTPOS_ABOVE:\n\t\tnLayout = PPBL_LABELTOPICONBOTTOM;\n\t\tbreak;\n\tcase TEXTPOS_RIGHT:\n\t\tnLayout = PPBL_ICONLEFTLABELRIGHT;\n\t\tbreak;\n\tcase TEXTPOS_LEFT:\n\t\tnLayout = PPBL_LABELLEFTICONRIGHT;\n\t\tbreak;\n\tcase TEXTPOS_OVERLAID:\n\t\tnLayout = PPBL_LABELOVERICON;\n\t\tbreak;\n\tdefault:\n\t\tnLayout = PPBL_LABEL;\n\t\tbreak;\n\t}\n\n\tCPWL_Color crBackground, crBorder;\n\n\tint iColorType;\n\tFX_FLOAT fc[4];\n\n\tpControl->GetOriginalBackgroundColor(iColorType, fc);\n\tif (iColorType > 0)\n\t\tcrBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);\n\n\tpControl->GetOriginalBorderColor(iColorType, fc);\n\tif (iColorType > 0)\n\t\tcrBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);\n\n\tFX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();\n\tFX_INT32 nBorderStyle = 0;\n\tCPWL_Dash dsBorder(3,0,0);\n\tCPWL_Color crLeftTop,crRightBottom;\n\n\tswitch (GetBorderStyle())\n\t{\n\tcase BBS_DASH:\n\t\tnBorderStyle = PBS_DASH;\n\t\tdsBorder = CPWL_Dash(3, 3, 0);\n\t\tbreak;\n\tcase BBS_BEVELED:\n\t\tnBorderStyle = PBS_BEVELED;\n\t\tfBorderWidth *= 2;\n\t\tcrLeftTop = CPWL_Color(COLORTYPE_GRAY,1);\n\t\tcrRightBottom = CPWL_Utils::DevideColor(crBackground,2);\n\t\tbreak;\n\tcase BBS_INSET:\n\t\tnBorderStyle = PBS_INSET;\n\t\tfBorderWidth *= 2;\n\t\tcrLeftTop = CPWL_Color(COLORTYPE_GRAY,0.5);\n\t\tcrRightBottom = CPWL_Color(COLORTYPE_GRAY,0.75);\n\t\tbreak;\n\tcase BBS_UNDERLINE:\n\t\tnBorderStyle = PBS_UNDERLINED;\n\t\tbreak;\n\tdefault: \n\t\tnBorderStyle = PBS_SOLID;\n\t\tbreak;\n\t}\n\n\tCPDF_Rect rcClient = CPWL_Utils::DeflateRect(rcWindow,fBorderWidth);\t\n\n\tCPWL_Color crText(COLORTYPE_GRAY,0);\n\n\tFX_FLOAT fFontSize = 12.0f;\n\tCFX_ByteString csNameTag;\n\n\tCPDF_DefaultAppearance da = pControl->GetDefaultAppearance();\n\tif (da.HasColor())\n\t{\n\t\tda.GetColor(iColorType, fc);\n\t\tcrText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);\n\t}\n\n\tif (da.HasFont()) \n\t\tda.GetFont(csNameTag, fFontSize);\n\n\tCFX_WideString csWCaption;\n\tCFX_WideString csNormalCaption, csRolloverCaption, csDownCaption;\n\n\tif (pControl->HasMKEntry(\"CA\"))\n\t{\n\t\tcsNormalCaption = pControl->GetNormalCaption();\n\t}\n\tif (pControl->HasMKEntry(\"RC\"))\n\t{\n\t\tcsRolloverCaption = pControl->GetRolloverCaption();\n\t}\n\tif (pControl->HasMKEntry(\"AC\"))\n\t{\n\t\tcsDownCaption = pControl->GetDownCaption();\n\t}\n\n\tCPDF_Stream* pNormalIcon = NULL;\n\tCPDF_Stream* pRolloverIcon = NULL;\n\tCPDF_Stream* pDownIcon = NULL;\n\n\tif (pControl->HasMKEntry(\"I\"))\n\t{\n\t\tpNormalIcon = pControl->GetNormalIcon();\n\t}\n\tif (pControl->HasMKEntry(\"RI\"))\n\t{\n\t\tpRolloverIcon = pControl->GetRolloverIcon();\n\t}\n\tif (pControl->HasMKEntry(\"IX\"))\n\t{\n\t\tpDownIcon = pControl->GetDownIcon();\n\t}\n\n\tif (pNormalIcon)\n\t{\n\t\tif (CPDF_Dictionary* pImageDict = pNormalIcon->GetDict())\n\t\t{\n\t\t\tif (pImageDict->GetString(\"Name\").IsEmpty())\n\t\t\t\tpImageDict->SetAtString(\"Name\", \"ImgA\");\n\t\t}\n\t}\n\n\tif (pRolloverIcon)\n\t{\n\t\tif (CPDF_Dictionary* pImageDict = pRolloverIcon->GetDict())\n\t\t{\n\t\t\tif (pImageDict->GetString(\"Name\").IsEmpty())\n\t\t\t\tpImageDict->SetAtString(\"Name\", \"ImgB\");\n\t\t}\n\t}\n\n\tif (pDownIcon)\n\t{\n\t\tif (CPDF_Dictionary* pImageDict = pDownIcon->GetDict())\n\t\t{\n\t\t\tif (pImageDict->GetString(\"Name\").IsEmpty())\n\t\t\t\tpImageDict->SetAtString(\"Name\", \"ImgC\");\n\t\t}\n\t}\n\n\tCPDF_IconFit iconFit = pControl->GetIconFit();\n\n// \tASSERT(this->m_pBaseForm != NULL);\n\tASSERT(this->m_pInterForm != NULL);\n\tCPDFSDK_Document* pDoc = m_pInterForm->GetDocument();\n\tASSERT(pDoc != NULL);\n\tCPDFDoc_Environment* pEnv = pDoc->GetEnv();\n\n \tCBA_FontMap FontMap(this,pEnv->GetSysHandler());//, ISystemHandle::GetSystemHandler(m_pBaseForm->GetEnv()));\n\tFontMap.Initial();\n\n\tFontMap.SetAPType(\"N\");\n\n\tCFX_ByteString csAP = CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) + \n\t\tCPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, crLeftTop, crRightBottom, nBorderStyle, dsBorder) +\n\t\tCPWL_Utils::GetPushButtonAppStream(iconFit.GetFittingBounds() ? rcWindow : rcClient, &FontMap, pNormalIcon, iconFit, csNormalCaption, crText, fFontSize, nLayout);\n\n\tWriteAppearance(\"N\", GetRotatedRect(), GetMatrix(), csAP);\n\tif (pNormalIcon)\n\t\tAddImageToAppearance(\"N\", pNormalIcon);\n\n\tCPDF_FormControl::HighlightingMode eHLM = pControl->GetHighlightingMode();\n\tif (eHLM == CPDF_FormControl::Push || eHLM == CPDF_FormControl::Toggle)\n\t{\n\t\tif (csRolloverCaption.IsEmpty() && !pRolloverIcon)\t\t\t\n\t\t{\n\t\t\tcsRolloverCaption = csNormalCaption;\n\t\t\tpRolloverIcon = pNormalIcon;\n\t\t}\n\n\t\tFontMap.SetAPType(\"R\");\n\n\t\tcsAP = CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) + \n\t\t\t\tCPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, crLeftTop, crRightBottom, nBorderStyle, dsBorder) +\n\t\t\t\tCPWL_Utils::GetPushButtonAppStream(iconFit.GetFittingBounds() ? rcWindow : rcClient, &FontMap, pRolloverIcon, iconFit, csRolloverCaption, crText, fFontSize, nLayout);\n\n\t\tWriteAppearance(\"R\", GetRotatedRect(), GetMatrix(), csAP);\n\t\tif (pRolloverIcon)\n\t\t\tAddImageToAppearance(\"R\", pRolloverIcon);\n\n\t\tif (csDownCaption.IsEmpty() && !pDownIcon)\n\t\t{\n\t\t\tcsDownCaption = csNormalCaption;\n\t\t\tpDownIcon = pNormalIcon;\n\t\t}\n\n\t\tswitch (nBorderStyle)\n\t\t{\n\t\tcase PBS_BEVELED:\n\t\t\t{\n\t\t\t\tCPWL_Color crTemp = crLeftTop;\n\t\t\t\tcrLeftTop = crRightBottom;\n\t\t\t\tcrRightBottom = crTemp;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase PBS_INSET:\n\t\t\tcrLeftTop = CPWL_Color(COLORTYPE_GRAY,0);\n\t\t\tcrRightBottom = CPWL_Color(COLORTYPE_GRAY,1);\n\t\t\tbreak;\n\t\t}\n\t\t\n\t\tFontMap.SetAPType(\"D\");\n\n\t\tcsAP = CPWL_Utils::GetRectFillAppStream(rcWindow, CPWL_Utils::SubstractColor(crBackground,0.25f)) + \n\t\t\tCPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, crLeftTop, crRightBottom, nBorderStyle, dsBorder) + \n\t\t\tCPWL_Utils::GetPushButtonAppStream(iconFit.GetFittingBounds() ? rcWindow : rcClient, &FontMap, pDownIcon, iconFit, csDownCaption, crText, fFontSize, nLayout);\n\n\t\tWriteAppearance(\"D\", GetRotatedRect(), GetMatrix(), csAP);\n\t\tif (pDownIcon)\n\t\t\tAddImageToAppearance(\"D\", pDownIcon);\n\t}\n\telse\n\t{\n\t\tRemoveAppearance(\"D\");\n\t\tRemoveAppearance(\"R\");\n\t}\n}\n\nvoid CPDFSDK_Widget::ResetAppearance_CheckBox()\n{\n\tCPDF_FormControl* pControl = GetFormControl();\n\tASSERT(pControl != NULL);\n\n\n\n\tCPWL_Color crBackground, crBorder, crText;\n\t\n\tint iColorType;\n\tFX_FLOAT fc[4];\n\n\tpControl->GetOriginalBackgroundColor(iColorType, fc);\n\tif (iColorType > 0)\n\t\tcrBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);\n\n\tpControl->GetOriginalBorderColor(iColorType, fc);\n\tif (iColorType > 0)\n\t\tcrBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);\n\n\tFX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();\n\tFX_INT32 nBorderStyle = 0;\n\tCPWL_Dash dsBorder(3,0,0);\n\tCPWL_Color crLeftTop,crRightBottom;\n\n\tswitch (GetBorderStyle())\n\t{\n\tcase BBS_DASH:\n\t\tnBorderStyle = PBS_DASH;\n\t\tdsBorder = CPWL_Dash(3, 3, 0);\n\t\tbreak;\n\tcase BBS_BEVELED:\n\t\tnBorderStyle = PBS_BEVELED;\n\t\tfBorderWidth *= 2;\n\t\tcrLeftTop = CPWL_Color(COLORTYPE_GRAY,1);\n\t\tcrRightBottom = CPWL_Utils::DevideColor(crBackground,2);\n\t\tbreak;\n\tcase BBS_INSET:\n\t\tnBorderStyle = PBS_INSET;\n\t\tfBorderWidth *= 2;\n\t\tcrLeftTop = CPWL_Color(COLORTYPE_GRAY,0.5);\n\t\tcrRightBottom = CPWL_Color(COLORTYPE_GRAY,0.75);\n\t\tbreak;\n\tcase BBS_UNDERLINE:\n\t\tnBorderStyle = PBS_UNDERLINED;\n\t\tbreak;\n\tdefault: \n\t\tnBorderStyle = PBS_SOLID;\n\t\tbreak;\n\t}\n\n\tCPDF_Rect rcWindow = GetRotatedRect();\n\tCPDF_Rect rcClient = CPWL_Utils::DeflateRect(rcWindow,fBorderWidth);\n\n\tCPDF_DefaultAppearance da = pControl->GetDefaultAppearance();\n\tif (da.HasColor())\n\t{\n\t\tda.GetColor(iColorType, fc);\n\t\tcrText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);\n\t}\n\n\tFX_INT32 nStyle = 0;\n\n\tCFX_WideString csWCaption = pControl->GetNormalCaption();\n\tif (csWCaption.GetLength() > 0)\n\t{\n\t\tswitch (csWCaption[0])\n\t\t{\n\t\tcase L'l':\n\t\t\tnStyle = PCS_CIRCLE;\t\t\t\n\t\t\tbreak;\n\t\tcase L'8':\n\t\t\tnStyle = PCS_CROSS;\n\t\t\tbreak;\n\t\tcase L'u':\n\t\t\tnStyle = PCS_DIAMOND;\n\t\t\tbreak;\n\t\tcase L'n':\n\t\t\tnStyle = PCS_SQUARE;\n\t\t\tbreak;\n\t\tcase L'H':\n\t\t\tnStyle = PCS_STAR;\n\t\t\tbreak;\n\t\tdefault: //L'4'\n\t\t\tnStyle = PCS_CHECK;\n\t\t\tbreak;\n\t\t}\n\t}\n\telse\n\t{\n\t\tnStyle = PCS_CHECK;\n\t}\n\n\tCFX_ByteString csAP_N_ON = CPWL_Utils::GetRectFillAppStream(rcWindow,crBackground) +\n\t\tCPWL_Utils::GetBorderAppStream(rcWindow,fBorderWidth,crBorder,crLeftTop,crRightBottom,nBorderStyle,dsBorder);\n\n\tCFX_ByteString csAP_N_OFF = csAP_N_ON;\n\n\tswitch (nBorderStyle)\n\t{\n\tcase PBS_BEVELED:\n\t\t{\n\t\t\tCPWL_Color crTemp = crLeftTop;\n\t\t\tcrLeftTop = crRightBottom;\n\t\t\tcrRightBottom = crTemp;\n\t\t}\n\t\tbreak;\n\tcase PBS_INSET:\n\t\tcrLeftTop = CPWL_Color(COLORTYPE_GRAY,0);\n\t\tcrRightBottom = CPWL_Color(COLORTYPE_GRAY,1);\n\t\tbreak;\n\t}\n\n\tCFX_ByteString csAP_D_ON = CPWL_Utils::GetRectFillAppStream(rcWindow,CPWL_Utils::SubstractColor(crBackground,0.25f)) + \n\t\tCPWL_Utils::GetBorderAppStream(rcWindow,fBorderWidth,crBorder,crLeftTop,crRightBottom,nBorderStyle,dsBorder);\n\n\tCFX_ByteString csAP_D_OFF = csAP_D_ON;\n\n\tcsAP_N_ON += CPWL_Utils::GetCheckBoxAppStream(rcClient,nStyle,crText);\n\tcsAP_D_ON += CPWL_Utils::GetCheckBoxAppStream(rcClient,nStyle,crText);\n\n\tWriteAppearance(\"N\", GetRotatedRect(), GetMatrix(), csAP_N_ON, pControl->GetCheckedAPState());\n\tWriteAppearance(\"N\", GetRotatedRect(), GetMatrix(), csAP_N_OFF, \"Off\");\n\n\tWriteAppearance(\"D\", GetRotatedRect(), GetMatrix(), csAP_D_ON, pControl->GetCheckedAPState());\n\tWriteAppearance(\"D\", GetRotatedRect(), GetMatrix(), csAP_D_OFF, \"Off\");\n\n\tCFX_ByteString csAS = GetAppState();\n\tif (csAS.IsEmpty())\n\t\tSetAppState(\"Off\");\n}\n\nvoid CPDFSDK_Widget::ResetAppearance_RadioButton()\n{\n\tCPDF_FormControl* pControl = GetFormControl();\n\tASSERT(pControl != NULL);\n\t\n\n\n\tCPWL_Color crBackground, crBorder, crText;\n\t\n\tint iColorType;\n\tFX_FLOAT fc[4];\n\n\tpControl->GetOriginalBackgroundColor(iColorType, fc);\n\tif (iColorType > 0)\n\t\tcrBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);\n\n\tpControl->GetOriginalBorderColor(iColorType, fc);\n\tif (iColorType > 0)\n\t\tcrBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);\n\n\tFX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();\n\tFX_INT32 nBorderStyle = 0;\n\tCPWL_Dash dsBorder(3,0,0);\n\tCPWL_Color crLeftTop,crRightBottom;\n\n\tswitch (GetBorderStyle())\n\t{\n\tcase BBS_DASH:\n\t\tnBorderStyle = PBS_DASH;\n\t\tdsBorder = CPWL_Dash(3, 3, 0);\n\t\tbreak;\n\tcase BBS_BEVELED:\n\t\tnBorderStyle = PBS_BEVELED;\n\t\tfBorderWidth *= 2;\n\t\tcrLeftTop = CPWL_Color(COLORTYPE_GRAY,1);\n\t\tcrRightBottom = CPWL_Utils::DevideColor(crBackground,2);\n\t\tbreak;\n\tcase BBS_INSET:\n\t\tnBorderStyle = PBS_INSET;\n\t\tfBorderWidth *= 2;\n\t\tcrLeftTop = CPWL_Color(COLORTYPE_GRAY,0.5);\n\t\tcrRightBottom = CPWL_Color(COLORTYPE_GRAY,0.75);\n\t\tbreak;\n\tcase BBS_UNDERLINE:\n\t\tnBorderStyle = PBS_UNDERLINED;\n\t\tbreak;\n\tdefault: \n\t\tnBorderStyle = PBS_SOLID;\n\t\tbreak;\n\t}\n\n\tCPDF_Rect rcWindow = GetRotatedRect();\n\tCPDF_Rect rcClient = CPWL_Utils::DeflateRect(rcWindow, fBorderWidth);\n\n\tCPDF_DefaultAppearance da = pControl->GetDefaultAppearance();\n\tif (da.HasColor())\n\t{\n\t\tda.GetColor(iColorType, fc);\n\t\tcrText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);\n\t}\n\n\tFX_INT32 nStyle = 0;\n\n\tCFX_WideString csWCaption = pControl->GetNormalCaption();\n\tif (csWCaption.GetLength() > 0)\n\t{\n\t\tswitch (csWCaption[0])\n\t\t{\n\t\tdefault: //L'l':\n\t\t\tnStyle = PCS_CIRCLE;\t\t\t\n\t\t\tbreak;\n\t\tcase L'8':\n\t\t\tnStyle = PCS_CROSS;\n\t\t\tbreak;\n\t\tcase L'u':\n\t\t\tnStyle = PCS_DIAMOND;\n\t\t\tbreak;\n\t\tcase L'n':\n\t\t\tnStyle = PCS_SQUARE;\n\t\t\tbreak;\n\t\tcase L'H':\n\t\t\tnStyle = PCS_STAR;\n\t\t\tbreak;\n\t\tcase L'4':\n\t\t\tnStyle = PCS_CHECK;\n\t\t\tbreak;\n\t\t}\n\t}\n\telse\n\t{\n\t\tnStyle = PCS_CIRCLE;\n\t}\n\n\tCFX_ByteString csAP_N_ON;\n\n\tCPDF_Rect rcCenter = CPWL_Utils::DeflateRect(CPWL_Utils::GetCenterSquare(rcWindow), 1.0f);\n\t\n\tif (nStyle == PCS_CIRCLE)\n\t{\n\t\tif (nBorderStyle == PBS_BEVELED)\n\t\t{\n\t\t\tcrLeftTop = CPWL_Color(COLORTYPE_GRAY, 1);\n\t\t\tcrRightBottom = CPWL_Utils::SubstractColor(crBackground,0.25f);\n\t\t}\n\t\telse if (nBorderStyle == PBS_INSET)\n\t\t{\n\t\t\tcrLeftTop = CPWL_Color(COLORTYPE_GRAY,0.5f);\n\t\t\tcrRightBottom = CPWL_Color(COLORTYPE_GRAY,0.75f);\n\t\t}\n\n\t\tcsAP_N_ON = CPWL_Utils::GetCircleFillAppStream(rcCenter,crBackground) + \n\t\t\tCPWL_Utils::GetCircleBorderAppStream(rcCenter,fBorderWidth,crBorder,crLeftTop,crRightBottom,nBorderStyle,dsBorder);\n\t}\n\telse\n\t{\n\t\tcsAP_N_ON = CPWL_Utils::GetRectFillAppStream(rcWindow,crBackground) + \n\t\t\tCPWL_Utils::GetBorderAppStream(rcWindow,fBorderWidth,crBorder,crLeftTop,crRightBottom,nBorderStyle,dsBorder);\n\t}\n\n\tCFX_ByteString csAP_N_OFF = csAP_N_ON;\n\n\tswitch (nBorderStyle)\n\t{\n\tcase PBS_BEVELED:\n\t\t{\n\t\t\tCPWL_Color crTemp = crLeftTop;\n\t\t\tcrLeftTop = crRightBottom;\n\t\t\tcrRightBottom = crTemp;\n\t\t}\n\t\tbreak;\n\tcase PBS_INSET:\n\t\tcrLeftTop = CPWL_Color(COLORTYPE_GRAY,0);\n\t\tcrRightBottom = CPWL_Color(COLORTYPE_GRAY,1);\n\t\tbreak;\n\t}\n\n\tCFX_ByteString csAP_D_ON;\n\n\tif (nStyle == PCS_CIRCLE)\n\t{\n\t\tCPWL_Color crBK = CPWL_Utils::SubstractColor(crBackground,0.25f);\n\t\tif (nBorderStyle == PBS_BEVELED)\n\t\t{\n\t\t\tcrLeftTop = CPWL_Utils::SubstractColor(crBackground,0.25f);\n\t\t\tcrRightBottom = CPWL_Color(COLORTYPE_GRAY, 1);\n\t\t\tcrBK = crBackground;\n\t\t}\n\t\telse if (nBorderStyle == PBS_INSET)\n\t\t{\n\t\t\tcrLeftTop = CPWL_Color(COLORTYPE_GRAY,0);\n\t\t\tcrRightBottom = CPWL_Color(COLORTYPE_GRAY,1);\n\t\t}\n\n\t\tcsAP_D_ON = CPWL_Utils::GetCircleFillAppStream(rcCenter,crBK)\n\t\t\t+ CPWL_Utils::GetCircleBorderAppStream(rcCenter,fBorderWidth,crBorder,crLeftTop,crRightBottom,nBorderStyle,dsBorder);\n\t}\n\telse\n\t{\n\t\tcsAP_D_ON = CPWL_Utils::GetRectFillAppStream(rcWindow,CPWL_Utils::SubstractColor(crBackground,0.25f)) + \n\t\t\tCPWL_Utils::GetBorderAppStream(rcWindow,fBorderWidth,crBorder,crLeftTop,crRightBottom,nBorderStyle,dsBorder);\t\t\n\t}\n\n\tCFX_ByteString csAP_D_OFF = csAP_D_ON;\n\n\tcsAP_N_ON += CPWL_Utils::GetRadioButtonAppStream(rcClient,nStyle,crText);\n\tcsAP_D_ON += CPWL_Utils::GetRadioButtonAppStream(rcClient,nStyle,crText);\n\n\tWriteAppearance(\"N\", GetRotatedRect(), GetMatrix(), csAP_N_ON, pControl->GetCheckedAPState());\n\tWriteAppearance(\"N\", GetRotatedRect(), GetMatrix(), csAP_N_OFF, \"Off\");\n\n\tWriteAppearance(\"D\", GetRotatedRect(), GetMatrix(), csAP_D_ON, pControl->GetCheckedAPState());\n\tWriteAppearance(\"D\", GetRotatedRect(), GetMatrix(), csAP_D_OFF, \"Off\");\n\n\tCFX_ByteString csAS = GetAppState();\n\tif (csAS.IsEmpty())\n\t\tSetAppState(\"Off\");\n}\n\nvoid CPDFSDK_Widget::ResetAppearance_ComboBox(FX_LPCWSTR sValue)\n{\n\tCPDF_FormControl* pControl = GetFormControl();\n\tASSERT(pControl != NULL);\n\tCPDF_FormField* pField = pControl->GetField();\n\tASSERT(pField != NULL);\n\n\tCFX_ByteTextBuf sBody, sLines;\n\n\tCPDF_Rect rcClient = GetClientRect();\n\tCPDF_Rect rcButton = rcClient;\n\trcButton.left = rcButton.right - 13;\n\trcButton.Normalize();\n\n\tif (IFX_Edit * pEdit = IFX_Edit::NewEdit())\n\t{\n\t\tpEdit->EnableRefresh(FALSE);\n\n\t\tASSERT(this->m_pInterForm != NULL);\n\t\tCPDFSDK_Document* pDoc = m_pInterForm->GetDocument();\n\t\tASSERT(pDoc != NULL);\n\t\tCPDFDoc_Environment* pEnv = pDoc->GetEnv();\n\t\tCBA_FontMap FontMap(this,pEnv->GetSysHandler());\n\t\tFontMap.Initial();\n\t\tpEdit->SetFontMap(&FontMap);\n\n\t\tCPDF_Rect rcEdit = rcClient;\n\t\trcEdit.right = rcButton.left;\n\t\trcEdit.Normalize();\n\t\t\n\t\tpEdit->SetPlateRect(rcEdit);\n\t\tpEdit->SetAlignmentV(1);\n\n\t\tFX_FLOAT fFontSize = this->GetFontSize();\n\t\tif (IsFloatZero(fFontSize))\n\t\t\tpEdit->SetAutoFontSize(TRUE);\n\t\telse\n\t\t\tpEdit->SetFontSize(fFontSize);\n\t\t\n\t\tpEdit->Initialize();\n\t\t\n\t\tif (sValue)\n\t\t\tpEdit->SetText(sValue);\n\t\telse\n\t\t{\n\t\t\tFX_INT32 nCurSel = pField->GetSelectedIndex(0);\n\n\t\t\tif (nCurSel < 0)\n\t\t\t\tpEdit->SetText((FX_LPCWSTR)pField->GetValue());\n\t\t\telse\n\t\t\t\tpEdit->SetText((FX_LPCWSTR)pField->GetOptionLabel(nCurSel));\n\t\t}\n\n\t\tCPDF_Rect rcContent = pEdit->GetContentRect();\n\n\t\tCFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(pEdit,CPDF_Point(0.0f,0.0f));\n\t\tif (sEdit.GetLength() > 0)\n\t\t{\n\t\t\tsBody << \"/Tx BMC\\n\" << \"q\\n\";\n\t\t\tif (rcContent.Width() > rcEdit.Width() ||\n\t\t\t\trcContent.Height() > rcEdit.Height())\n\t\t\t{\n\t\t\t\tsBody << rcEdit.left << \" \" << rcEdit.bottom << \" \" \n\t\t\t\t\t<< rcEdit.Width() << \" \" << rcEdit.Height() << \" re\\nW\\nn\\n\";\n\t\t\t}\n\n\t\t\tCPWL_Color crText = GetTextPWLColor();\t\n\t\t\tsBody << \"BT\\n\" << CPWL_Utils::GetColorAppStream(crText) << sEdit << \"ET\\n\" << \"Q\\nEMC\\n\";\n\t\t}\n\n\t\tIFX_Edit::DelEdit(pEdit);\n\t}\n\n\tsBody << CPWL_Utils::GetDropButtonAppStream(rcButton);\n\n\tCFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() + sLines.GetByteString() + sBody.GetByteString();\n\n\tWriteAppearance(\"N\", GetRotatedRect(), GetMatrix(), sAP);\n}\n\nvoid CPDFSDK_Widget::ResetAppearance_ListBox()\n{\n\tCPDF_FormControl* pControl = GetFormControl();\n\tASSERT(pControl != NULL);\n\tCPDF_FormField* pField = pControl->GetField();\n\tASSERT(pField != NULL);\n\n\tCPDF_Rect rcClient = GetClientRect();\n\n\tCFX_ByteTextBuf sBody, sLines;\n\n\tif (IFX_Edit * pEdit = IFX_Edit::NewEdit())\n\t{\n\t\tpEdit->EnableRefresh(FALSE);\n\n//\t\tASSERT(this->m_pBaseForm != NULL);\n\t\tASSERT(this->m_pInterForm != NULL);\n\t\tCPDFSDK_Document* pDoc = m_pInterForm->GetDocument();\n\t\tASSERT(pDoc != NULL);\n\t\tCPDFDoc_Environment* pEnv = pDoc->GetEnv();\n\n\t\tCBA_FontMap FontMap(this,pEnv->GetSysHandler());\n\t\tFontMap.Initial();\n\t\tpEdit->SetFontMap(&FontMap);\n\n\t\tpEdit->SetPlateRect(CPDF_Rect(rcClient.left,0.0f,rcClient.right,0.0f));\t\n\t\t\n\t\tFX_FLOAT fFontSize = GetFontSize();\n\n\t\tif (IsFloatZero(fFontSize))\n\t\t\tpEdit->SetFontSize(12.0f);\n\t\telse\n\t\t\tpEdit->SetFontSize(fFontSize);\n\t\t\n\t\tpEdit->Initialize();\n\n\t\tCFX_ByteTextBuf sList;\n\t\tFX_FLOAT fy = rcClient.top;\n\n\t\tFX_INT32 nTop = pField->GetTopVisibleIndex();\n\t\tFX_INT32 nCount = pField->CountOptions();\n\t\tFX_INT32 nSelCount = pField->CountSelectedItems();\n\n\t\tfor (FX_INT32 i=nTop; i<nCount; i++)\n\t\t{\n\t\t\tFX_BOOL bSelected = FALSE;\t\t\t\t\n\t\t\tfor (FX_INT32 j=0; j<nSelCount; j++)\n\t\t\t{\n\t\t\t\tif (pField->GetSelectedIndex(j) == i)\n\t\t\t\t{\n\t\t\t\t\tbSelected = TRUE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpEdit->SetText((FX_LPCWSTR)pField->GetOptionLabel(i));\n\n\t\t\tCPDF_Rect rcContent = pEdit->GetContentRect();\n\t\t\tFX_FLOAT fItemHeight = rcContent.Height();\n\n\t\t\tif (bSelected)\n\t\t\t{\n\t\t\t\tCPDF_Rect rcItem = CPDF_Rect(rcClient.left,fy-fItemHeight,rcClient.right,fy);\n\t\t\t\tsList << \"q\\n\" << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_RGB,0,51.0f/255.0f,113.0f/255.0f),TRUE)\n\t\t\t\t\t<< rcItem.left << \" \" << rcItem.bottom << \" \" << rcItem.Width() << \" \" << rcItem.Height() << \" re f\\n\" << \"Q\\n\";\n\n\t\t\t\tsList << \"BT\\n\" << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_GRAY,1),TRUE) << \n\t\t\t\t\tCPWL_Utils::GetEditAppStream(pEdit,CPDF_Point(0.0f,fy)) << \"ET\\n\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tCPWL_Color crText = GetTextPWLColor();\n\t\t\t\tsList << \"BT\\n\" << CPWL_Utils::GetColorAppStream(crText,TRUE) << \n\t\t\t\tCPWL_Utils::GetEditAppStream(pEdit,CPDF_Point(0.0f,fy)) << \"ET\\n\";\n\t\t\t}\n\n\t\t\tfy -= fItemHeight;\n\t\t}\n\t\t\t\t\t\n\t\tif (sList.GetSize() > 0)\n\t\t{\n\t\t\tsBody << \"/Tx BMC\\n\" << \"q\\n\" << rcClient.left << \" \" << rcClient.bottom << \" \" \n\t\t\t\t\t<< rcClient.Width() << \" \" << rcClient.Height() << \" re\\nW\\nn\\n\";\n\t\t\tsBody << sList << \"Q\\nEMC\\n\";\n\t\t}\n\n\t\tIFX_Edit::DelEdit(pEdit);\n\t}\n\n\tCFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() + sLines.GetByteString() + sBody.GetByteString();\n\n\tWriteAppearance(\"N\", GetRotatedRect(), GetMatrix(), sAP);\n}\n\nvoid CPDFSDK_Widget::ResetAppearance_TextField(FX_LPCWSTR sValue)\n{\n\tCPDF_FormControl* pControl = GetFormControl();\n\tASSERT(pControl != NULL);\n\tCPDF_FormField* pField = pControl->GetField();\n\tASSERT(pField != NULL);\n\n\tCFX_ByteTextBuf sBody, sLines;\n\t\n\tif (IFX_Edit * pEdit = IFX_Edit::NewEdit())\n\t{\n\t\tpEdit->EnableRefresh(FALSE);\n\n//\t\tASSERT(this->m_pBaseForm != NULL);\n\t\tASSERT(this->m_pInterForm != NULL);\n\t\tCPDFSDK_Document* pDoc = m_pInterForm->GetDocument();\n\t\tASSERT(pDoc != NULL);\n\t\tCPDFDoc_Environment* pEnv = pDoc->GetEnv();\n\n\t\tCBA_FontMap FontMap(this,pEnv->GetSysHandler());//, ISystemHandle::GetSystemHandler(m_pBaseForm->GetEnv()));\n\t\tFontMap.Initial();\n\t\tpEdit->SetFontMap(&FontMap);\n\n\t\tCPDF_Rect rcClient = GetClientRect();\n\t\tpEdit->SetPlateRect(rcClient);\n\t\tpEdit->SetAlignmentH(pControl->GetControlAlignment());\n\t\t\n\t\tFX_DWORD dwFieldFlags = pField->GetFieldFlags();\n\t\tFX_BOOL bMultiLine = (dwFieldFlags >> 12) & 1;\n\n\t\tif (bMultiLine)\n\t\t{\n\t\t\tpEdit->SetMultiLine(TRUE);\n\t\t\tpEdit->SetAutoReturn(TRUE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpEdit->SetAlignmentV(1);\n\t\t}\n\n\t\tFX_WORD subWord = 0;\n\t\tif ((dwFieldFlags >> 13) & 1)\n\t\t{\n\t\t\tsubWord = '*';\n\t\t\tpEdit->SetPasswordChar(subWord);\n\t\t}\n\n\t\tint nMaxLen = pField->GetMaxLen();\n\t\tFX_BOOL bCharArray = (dwFieldFlags >> 24) & 1;\n\t\tFX_FLOAT fFontSize = GetFontSize();\t\n\n\t\tif (nMaxLen > 0)\n\t\t{\n\t\t\tif (bCharArray)\n\t\t\t{\n\t\t\t\tpEdit->SetCharArray(nMaxLen);\n\n\t\t\t\tif (IsFloatZero(fFontSize))\n\t\t\t\t{\n\t\t\t\t\tfFontSize = CPWL_Edit::GetCharArrayAutoFontSize(FontMap.GetPDFFont(0),rcClient,nMaxLen);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (sValue)\n\t\t\t\t\tnMaxLen = wcslen((const wchar_t*)sValue); \n\t\t\t\tpEdit->SetLimitChar(nMaxLen);\n\t\t\t}\n\t\t}\n\n\t\tif (IsFloatZero(fFontSize))\n\t\t\tpEdit->SetAutoFontSize(TRUE);\n\t\telse\n\t\t\tpEdit->SetFontSize(fFontSize);\n\n\t\tpEdit->Initialize();\n\t\t\n\t\tif (sValue)\n\t\t\tpEdit->SetText(sValue);\n\t\telse\n\t\t\tpEdit->SetText((FX_LPCWSTR)pField->GetValue());\n\n\t\tCPDF_Rect rcContent = pEdit->GetContentRect();\n\n\t\tCFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(pEdit,CPDF_Point(0.0f,0.0f),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tNULL,!bCharArray,subWord);\n\n\t\tif (sEdit.GetLength() > 0)\n\t\t{\n\t\t\tsBody << \"/Tx BMC\\n\" << \"q\\n\";\n\t\t\tif (rcContent.Width() > rcClient.Width() ||\n\t\t\t\trcContent.Height() > rcClient.Height())\n\t\t\t{\n\t\t\t\tsBody << rcClient.left << \" \" << rcClient.bottom << \" \" \n\t\t\t\t\t<< rcClient.Width() << \" \" << rcClient.Height() << \" re\\nW\\nn\\n\";\n\t\t\t}\n\t\t\tCPWL_Color crText = GetTextPWLColor();\t\n\t\t\tsBody << \"BT\\n\" << CPWL_Utils::GetColorAppStream(crText) << sEdit << \"ET\\n\" << \"Q\\nEMC\\n\";\n\t\t}\n\n\t\tif (bCharArray)\n\t\t{\n\t\t\tswitch (GetBorderStyle())\n\t\t\t{\n\t\t\tcase BBS_SOLID:\n\t\t\t\t{\n\t\t\t\t\tCFX_ByteString sColor = CPWL_Utils::GetColorAppStream(GetBorderPWLColor(),FALSE);\n\t\t\t\t\tif (sColor.GetLength() > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tsLines << \"q\\n\" << GetBorderWidth() << \" w\\n\" \n\t\t\t\t\t\t\t<< CPWL_Utils::GetColorAppStream(GetBorderPWLColor(),FALSE) << \" 2 J 0 j\\n\";\t\t\t\t\t\n\n\t\t\t\t\t\tfor (FX_INT32 i=1;i<nMaxLen;i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsLines << rcClient.left + ((rcClient.right - rcClient.left)/nMaxLen)*i << \" \"\n\t\t\t\t\t\t\t\t<< rcClient.bottom << \" m\\n\"\n\t\t\t\t\t\t\t\t<< rcClient.left + ((rcClient.right - rcClient.left)/nMaxLen)*i << \" \"\n\t\t\t\t\t\t\t\t<< rcClient.top << \" l S\\n\";\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsLines << \"Q\\n\";\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase BBS_DASH:\n\t\t\t\t{\n\t\t\t\t\tCFX_ByteString sColor = CPWL_Utils::GetColorAppStream(GetBorderPWLColor(),FALSE);\n\t\t\t\t\tif (sColor.GetLength() > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tCPWL_Dash dsBorder = CPWL_Dash(3, 3, 0);\n\n\t\t\t\t\t\tsLines << \"q\\n\" << GetBorderWidth() << \" w\\n\" \n\t\t\t\t\t\t\t<< CPWL_Utils::GetColorAppStream(GetBorderPWLColor(),FALSE)\n\t\t\t\t\t\t\t<< \"[\" << dsBorder.nDash << \" \" \n\t\t\t\t\t\t\t<< dsBorder.nGap << \"] \" \n\t\t\t\t\t\t\t<< dsBorder.nPhase << \" d\\n\";\n\n\t\t\t\t\t\tfor (FX_INT32 i=1;i<nMaxLen;i++)\t\t\t\t\t\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsLines << rcClient.left + ((rcClient.right - rcClient.left)/nMaxLen)*i << \" \"\n\t\t\t\t\t\t\t\t<< rcClient.bottom << \" m\\n\"\n\t\t\t\t\t\t\t\t<< rcClient.left + ((rcClient.right - rcClient.left)/nMaxLen)*i << \" \"\n\t\t\t\t\t\t\t\t<< rcClient.top << \" l S\\n\";\t\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsLines << \"Q\\n\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tIFX_Edit::DelEdit(pEdit);\n\t}\n\n\tCFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() + sLines.GetByteString() + sBody.GetByteString();\n\tWriteAppearance(\"N\", GetRotatedRect(), GetMatrix(), sAP);\n}\n\nCPDF_Rect CPDFSDK_Widget::GetClientRect() const\n{\n\tCPDF_Rect rcWindow = GetRotatedRect();\n\tFX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();\n\tswitch (GetBorderStyle())\n\t{\n\tcase BBS_BEVELED:\n\tcase BBS_INSET:\n\t\tfBorderWidth *= 2.0f;\n\t\tbreak;\n\t}\n\n\treturn CPWL_Utils::DeflateRect(rcWindow, fBorderWidth);\n}\n\nCPDF_Rect CPDFSDK_Widget::GetRotatedRect() const\n{\n\tCPDF_Rect rectAnnot = GetRect();\n\tFX_FLOAT fWidth = rectAnnot.right - rectAnnot.left;\n\tFX_FLOAT fHeight = rectAnnot.top - rectAnnot.bottom;\n\n\tCPDF_FormControl* pControl = GetFormControl();\n\tASSERT(pControl != NULL);\n\n\tCPDF_Rect rcPDFWindow;\n\tswitch(abs(pControl->GetRotation() % 360))\n\t{\n\t\tcase 0:\n\t\tcase 180:\n\t\tdefault:\n\t\t\trcPDFWindow = CPDF_Rect(0, 0, fWidth, fHeight);\t\n\t\t\tbreak;\n\t\tcase 90:\n\t\tcase 270:\n\t\t\trcPDFWindow = CPDF_Rect(0, 0, fHeight, fWidth);\n\t\t\tbreak;\n\t}\n\n\treturn rcPDFWindow;\n}\n\nCFX_ByteString CPDFSDK_Widget::GetBackgroundAppStream() const\n{\n\tCPWL_Color crBackground = GetFillPWLColor();\n\tif (crBackground.nColorType != COLORTYPE_TRANSPARENT)\n\t\treturn CPWL_Utils::GetRectFillAppStream(GetRotatedRect(), crBackground);\n\telse\n\t\treturn \"\";\n}\n\nCFX_ByteString CPDFSDK_Widget::GetBorderAppStream() const\n{\n\tCPDF_Rect rcWindow = GetRotatedRect();\n\tCPWL_Color crBorder = GetBorderPWLColor();\n\tCPWL_Color crBackground = GetFillPWLColor();\n\tCPWL_Color crLeftTop, crRightBottom;\n\n\tFX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();\n\tFX_INT32 nBorderStyle = 0;\n\tCPWL_Dash dsBorder(3,0,0);\n\n\tswitch (GetBorderStyle())\n\t{\n\tcase BBS_DASH:\n\t\tnBorderStyle = PBS_DASH;\n\t\tdsBorder = CPWL_Dash(3, 3, 0);\n\t\tbreak;\n\tcase BBS_BEVELED:\n\t\tnBorderStyle = PBS_BEVELED;\n\t\tfBorderWidth *= 2;\n\t\tcrLeftTop = CPWL_Color(COLORTYPE_GRAY, 1);\n\t\tcrRightBottom = CPWL_Utils::DevideColor(crBackground, 2);\n\t\tbreak;\n\tcase BBS_INSET:\n\t\tnBorderStyle = PBS_INSET;\n\t\tfBorderWidth *= 2;\n\t\tcrLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5);\n\t\tcrRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75);\n\t\tbreak;\n\tcase BBS_UNDERLINE:\n\t\tnBorderStyle = PBS_UNDERLINED;\n\t\tbreak;\n\tdefault: \n\t\tnBorderStyle = PBS_SOLID;\n\t\tbreak;\n\t}\n\n\treturn CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, crLeftTop, \n\t\tcrRightBottom, nBorderStyle, dsBorder);\n}\n\nCPDF_Matrix CPDFSDK_Widget::GetMatrix() const\n{\n\tCPDF_Matrix mt;\n\tCPDF_FormControl* pControl = GetFormControl();\n\tASSERT(pControl != NULL);\n\n\tCPDF_Rect rcAnnot = GetRect();\n\tFX_FLOAT fWidth = rcAnnot.right - rcAnnot.left;\n\tFX_FLOAT fHeight = rcAnnot.top - rcAnnot.bottom;\n\t\n\n\n\tswitch (abs(pControl->GetRotation() % 360))\n\t{\n\t\tcase 0:\n\t\tdefault:\n\t\t\tmt = CPDF_Matrix(1, 0, 0, 1, 0, 0);\n\t\t\tbreak;\n\t\tcase 90:\n\t\t\tmt = CPDF_Matrix(0, 1, -1, 0, fWidth, 0);\n\t\t\tbreak;\n\t\tcase 180:\n\t\t\tmt = CPDF_Matrix(-1, 0, 0, -1, fWidth, fHeight);\n\t\t\tbreak;\n\t\tcase 270:\n\t\t\tmt = CPDF_Matrix(0, -1, 1, 0, 0, fHeight);\n\t\t\tbreak;\n\t}\n\n\treturn mt;\n}\n\nCPWL_Color CPDFSDK_Widget::GetTextPWLColor() const\n{\n\tCPWL_Color crText = CPWL_Color(COLORTYPE_GRAY, 0);\n\n\tCPDF_FormControl* pFormCtrl = GetFormControl();\n\tASSERT(pFormCtrl != NULL);\n\n\tCPDF_DefaultAppearance da = pFormCtrl->GetDefaultAppearance();\n\tif (da.HasColor())\n\t{\n\t\tFX_INT32 iColorType;\n\t\tFX_FLOAT fc[4];\n\t\tda.GetColor(iColorType, fc);\n\t\tcrText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);\n\t}\n\n\treturn crText;\n}\n\nCPWL_Color CPDFSDK_Widget::GetBorderPWLColor() const\n{\n\tCPWL_Color crBorder;\n\n\tCPDF_FormControl* pFormCtrl = GetFormControl();\n\tASSERT(pFormCtrl != NULL);\n\n\tFX_INT32 iColorType;\n\tFX_FLOAT fc[4];\n\tpFormCtrl->GetOriginalBorderColor(iColorType, fc);\n\tif (iColorType > 0)\n\t\tcrBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);\n\n\treturn crBorder;\n}\n\nCPWL_Color CPDFSDK_Widget::GetFillPWLColor() const\n{\n\tCPWL_Color crFill;\n\n\tCPDF_FormControl* pFormCtrl = GetFormControl();\n\tASSERT(pFormCtrl != NULL);\n\n\tFX_INT32 iColorType;\n\tFX_FLOAT fc[4];\n\tpFormCtrl->GetOriginalBackgroundColor(iColorType, fc);\n\tif (iColorType > 0)\n\t\tcrFill = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);\n\n\treturn crFill;\n}\n\nvoid CPDFSDK_Widget::AddImageToAppearance(const CFX_ByteString& sAPType, CPDF_Stream* pImage)\n{\n\tASSERT(pImage != NULL);\n\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\n\tCPDF_Document* pDoc = m_pPageView->GetPDFDocument();//pDocument->GetDocument();\n\tASSERT(pDoc != NULL);\n\n\tCPDF_Dictionary* pAPDict = m_pAnnot->m_pAnnotDict->GetDict(\"AP\");\n\tASSERT(pAPDict != NULL);\n\n\tCPDF_Stream* pStream = pAPDict->GetStream(sAPType);\n\tASSERT(pStream != NULL);\n\n\tCPDF_Dictionary* pStreamDict = pStream->GetDict();\n\tASSERT(pStreamDict != NULL);\n\n\tCFX_ByteString sImageAlias = \"IMG\";\n\n\tif (CPDF_Dictionary* pImageDict = pImage->GetDict())\n\t{\n\t\tsImageAlias = pImageDict->GetString(\"Name\");\n\t\tif (sImageAlias.IsEmpty())\n\t\t\tsImageAlias = \"IMG\";\n\t}\t\n\n\tCPDF_Dictionary* pStreamResList = pStreamDict->GetDict(\"Resources\");\n\tif (!pStreamResList)\n\t{\n\t\tpStreamResList = FX_NEW CPDF_Dictionary();\n\t\tpStreamDict->SetAt(\"Resources\", pStreamResList);\n\t}\n\n\tif (pStreamResList) \n\t{\n\t\tCPDF_Dictionary* pXObject = FX_NEW CPDF_Dictionary;\t\t\t\n\t\tpXObject->SetAtReference(sImageAlias, pDoc, pImage);\n\t\tpStreamResList->SetAt(\"XObject\", pXObject);\n\t}\n}\n\nvoid CPDFSDK_Widget::RemoveAppearance(const CFX_ByteString& sAPType)\n{\n\tASSERT(m_pAnnot != NULL);\n\tASSERT(m_pAnnot->m_pAnnotDict != NULL);\n\n\tif (CPDF_Dictionary* pAPDict = m_pAnnot->m_pAnnotDict->GetDict(\"AP\"))\n\t{\n\t\tpAPDict->RemoveAt(sAPType);\n\t}\n}\n\nFX_BOOL CPDFSDK_Widget::OnAAction(CPDF_AAction::AActionType type, PDFSDK_FieldAction& data, CPDFSDK_PageView* pPageView)\n{\n\tCPDF_Action action = GetAAction(type);\n\n\tif (action && action.GetType() != CPDF_Action::Unknown)\n\t{\n \t\tCPDFSDK_Document* pDocument = pPageView->GetSDKDocument();\n \t\tASSERT(pDocument != NULL);\n \n \t\tCPDFDoc_Environment* pEnv = pDocument->GetEnv();\n \t\tASSERT(pEnv != NULL);\n\n\t\tCPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander();/*(CPDFSDK_ActionHandler*)pApp->GetActionHandler();*/\n \t\tASSERT(pActionHandler != NULL);\n \n \t\treturn pActionHandler->DoAction_Field(action, type, pDocument, GetFormField(), data);\n\t}\n\n\treturn FALSE;\n}\n\nCPDF_Action\tCPDFSDK_Widget::GetAAction(CPDF_AAction::AActionType eAAT)\n{\n\tswitch (eAAT)\n\t{\n\tcase CPDF_AAction::CursorEnter:\n\tcase CPDF_AAction::CursorExit:\n\tcase CPDF_AAction::ButtonDown:\n\tcase CPDF_AAction::ButtonUp:\n\tcase CPDF_AAction::GetFocus:\n\tcase CPDF_AAction::LoseFocus:\n\tcase CPDF_AAction::PageOpen:\n\tcase CPDF_AAction::PageClose:\n\tcase CPDF_AAction::PageVisible:\n\tcase CPDF_AAction::PageInvisible:\n\t\treturn CPDFSDK_Annot::GetAAction(eAAT);\n\tcase CPDF_AAction::KeyStroke:\n\tcase CPDF_AAction::Format:\n\tcase CPDF_AAction::Validate:\n\tcase CPDF_AAction::Calculate:\n\t\t{\n\t\t\tCPDF_FormField* pField = this->GetFormField();\n\t\t\tASSERT(pField != NULL);\n\n\t\t\tif (CPDF_AAction aa = pField->GetAdditionalAction())\n\t\t\t\treturn aa.GetAction(eAAT);\n\t\t\telse \n\t\t\t\treturn CPDFSDK_Annot::GetAAction(eAAT);\n\t\t}\n\tdefault:\n\t\treturn NULL;\n\t}\n\n\treturn NULL;\n}\n\n\nCFX_WideString CPDFSDK_Widget::GetAlternateName() const\n{\n\tCPDF_FormField*\tpFormField = GetFormField();\n\tASSERT(pFormField != NULL);\n\n\treturn pFormField->GetAlternateName();\n}\n\nFX_INT32\tCPDFSDK_Widget::GetAppearanceAge() const\n{\n\treturn m_nAppAge;\n}\n\nFX_INT32 CPDFSDK_Widget::GetValueAge() const\n{\n\treturn m_nValueAge;\n}\n\n\nFX_BOOL\tCPDFSDK_Widget::HitTest(FX_FLOAT pageX, FX_FLOAT pageY)\n{\n\tCPDF_Annot* pAnnot = GetPDFAnnot();\n\tCFX_FloatRect annotRect;\n\tpAnnot->GetRect(annotRect);\n\tif(annotRect.Contains(pageX, pageY))\n\t{\n\t\tif (!IsVisible()) return FALSE;\n\t\t\n\t\tint nFieldFlags = GetFieldFlags();\n\t\tif ((nFieldFlags & FIELDFLAG_READONLY) == FIELDFLAG_READONLY) \n\t\t\treturn FALSE;\n\t\t\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}\n\nCPDFSDK_InterForm::CPDFSDK_InterForm(CPDFSDK_Document* pDocument)\n\t:m_pDocument(pDocument),\n\tm_pInterForm(NULL),\n\tm_bCalculate(TRUE),\n\tm_bBusy(FALSE)\n{\n\tASSERT(m_pDocument != NULL);\n\tm_pInterForm = new CPDF_InterForm(m_pDocument->GetDocument(), FALSE);\n\tASSERT(m_pInterForm != NULL);\n\tm_pInterForm->SetFormNotify(this);\n\n\tfor(int i=0; i<6; i++)\n\t\tm_bNeedHightlight[i] = FALSE;\n\tm_iHighlightAlpha = 0;\n}\n\nCPDFSDK_InterForm::~CPDFSDK_InterForm()\n{\n\tASSERT(m_pInterForm != NULL);\n\tdelete m_pInterForm;\n\tm_pInterForm = NULL;\n\n\tm_Map.RemoveAll();\n}\n\nvoid CPDFSDK_InterForm::Destroy()\n{\n\tdelete this;\n}\n\nCPDF_InterForm* CPDFSDK_InterForm::GetInterForm()\n{\n\treturn m_pInterForm;\n}\n\nCPDFSDK_Document* CPDFSDK_InterForm::GetDocument()\n{\n\treturn m_pDocument;\n}\n\nFX_BOOL CPDFSDK_InterForm::HighlightWidgets()\n{\n\treturn FALSE;\n}\n\nCPDFSDK_Widget* CPDFSDK_InterForm::GetSibling(CPDFSDK_Widget* pWidget, FX_BOOL bNext) const\n{\n\tASSERT(pWidget != NULL);\n\n\tCBA_AnnotIterator* pIterator = new CBA_AnnotIterator(pWidget->GetPageView(), \"Widget\", \"\");\n\tASSERT(pIterator != NULL);\n\n\tCPDFSDK_Widget* pRet = NULL;\n\n\tif (bNext)\n\t\tpRet = (CPDFSDK_Widget*)pIterator->GetNextAnnot(pWidget);\n\telse\n\t\tpRet = (CPDFSDK_Widget*)pIterator->GetPrevAnnot(pWidget);\n\n\tpIterator->Release();\n\t\n\treturn pRet;\n\n}\n\nCPDFSDK_Widget*\tCPDFSDK_InterForm::GetWidget(CPDF_FormControl* pControl) const\n{\n\tif(!pControl || !m_pInterForm) return NULL;\n\t\n\tCPDFSDK_Widget* pWidget = NULL;\n\tm_Map.Lookup(pControl, pWidget);\n\n\tif (pWidget) return pWidget;\n\n\tCPDF_Dictionary* pControlDict = pControl->GetWidget();\n\tASSERT(pControlDict != NULL);\n\n\tASSERT(m_pDocument != NULL);\n\tCPDF_Document* pDocument = m_pDocument->GetDocument();\n\n\tCPDFSDK_PageView* pPage = NULL;\n\n\tif (CPDF_Dictionary* pPageDict = pControlDict->GetDict(\"P\"))\n\t{\n\t\tint nPageIndex = pDocument->GetPageIndex(pPageDict->GetObjNum());\n\t\tif (nPageIndex >= 0)\n\t\t{\n\t\t\tpPage = m_pDocument->GetPageView(nPageIndex);\n\t\t}\n\t}\n\n\tif (!pPage) \n\t{\n\t\tint nPageIndex = GetPageIndexByAnnotDict(pDocument, pControlDict);\n\t\tif (nPageIndex >= 0)\n\t\t{\n\t\t\tpPage = m_pDocument->GetPageView(nPageIndex);\n\t\t}\n\t}\n\n\tif (pPage)\n\t\treturn (CPDFSDK_Widget*)pPage->GetAnnotByDict(pControlDict);\n\n\treturn NULL;\n}\n\nvoid CPDFSDK_InterForm::GetWidgets(const CFX_WideString& sFieldName, CFX_PtrArray& widgets)\n{\n\tASSERT(m_pInterForm != NULL);\n\n\tfor (int i=0,sz=m_pInterForm->CountFields(sFieldName); i<sz; i++)\n\t{\n\t\tCPDF_FormField* pFormField = m_pInterForm->GetField(i, sFieldName);\n\t\tASSERT(pFormField != NULL);\n\n\t\tGetWidgets(pFormField, widgets);\t\n\t}\n}\n\nvoid CPDFSDK_InterForm::GetWidgets(CPDF_FormField* pField, CFX_PtrArray& widgets)\n{\n\tASSERT(pField != NULL);\n\n\tfor (int i=0,isz=pField->CountControls(); i<isz; i++)\n\t{\n\t\tCPDF_FormControl* pFormCtrl = pField->GetControl(i);\n\t\tASSERT(pFormCtrl != NULL);\n\n\t\tCPDFSDK_Widget* pWidget = GetWidget(pFormCtrl);\n\n\t\tif (pWidget)\n\t\t\twidgets.Add(pWidget);\n\t}\n}\n\nint CPDFSDK_InterForm::GetPageIndexByAnnotDict(CPDF_Document* pDocument, CPDF_Dictionary* pAnnotDict) const\n{\n\tASSERT(pDocument != NULL);\n\tASSERT(pAnnotDict != NULL);\n\n\tfor (int i=0,sz=pDocument->GetPageCount(); i<sz; i++)\n\t{\n\t\tif (CPDF_Dictionary* pPageDict = pDocument->GetPage(i))\n\t\t{\t\t\t\n\t\t\tif (CPDF_Array* pAnnots = pPageDict->GetArray(\"Annots\"))\n\t\t\t{\n\t\t\t\tfor (int j=0,jsz=pAnnots->GetCount(); j<jsz; j++)\n\t\t\t\t{\n\t\t\t\t\tCPDF_Object* pDict = pAnnots->GetElementValue(j);\n\t\t\t\t\tif (pAnnotDict == pDict)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn i;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn -1;\n}\n\nvoid CPDFSDK_InterForm::AddMap(CPDF_FormControl* pControl, CPDFSDK_Widget* pWidget)\n{\n\tm_Map.SetAt(pControl, pWidget);\n}\n\nvoid CPDFSDK_InterForm::RemoveMap(CPDF_FormControl* pControl)\n{\n\tm_Map.RemoveKey(pControl);\n}\n\nvoid CPDFSDK_InterForm::EnableCalculate(FX_BOOL bEnabled)\n{\n\tm_bCalculate = bEnabled;\n}\n\nFX_BOOL CPDFSDK_InterForm::IsCalculateEnabled() const\n{\n\treturn m_bCalculate;\n}\n\n#ifdef _WIN32\nCPDF_Stream* CPDFSDK_InterForm::LoadImageFromFile(const CFX_WideString& sFile)\n{\n\tASSERT(m_pDocument != NULL);\n\tCPDF_Document* pDocument = m_pDocument->GetDocument();\n\tASSERT(pDocument != NULL);\n\n\tCPDF_Stream* pRetStream = NULL;\n\n\tif (CFX_DIBitmap* pBmp = CFX_WindowsDIB::LoadFromFile(sFile))\n\t{\n\t\tint nWidth = pBmp->GetWidth();\n\t\tint nHeight = pBmp->GetHeight();\n\n\t\tCPDF_Image Image(pDocument);\n\t\tImage.SetImage(pBmp, FALSE);\n\t\tCPDF_Stream* pImageStream = Image.GetStream();\n\t\tif (pImageStream)\n\t\t{\n\t\t\tif (pImageStream->GetObjNum() == 0)\n\t\t\t\tpDocument->AddIndirectObject(pImageStream);\n\n\t\t\tCPDF_Dictionary* pStreamDict = new CPDF_Dictionary();\n\t\t\tpStreamDict->SetAtName(\"Subtype\", \"Form\");\n\t\t\tpStreamDict->SetAtName(\"Name\", \"IMG\");\n\t\t\tCPDF_Array* pMatrix = new CPDF_Array();\n\t\t\tpStreamDict->SetAt(\"Matrix\", pMatrix);\n\t\t\tpMatrix->AddInteger(1);\n\t\t\tpMatrix->AddInteger(0);\n\t\t\tpMatrix->AddInteger(0);\n\t\t\tpMatrix->AddInteger(1);\n\t\t\tpMatrix->AddInteger(-nWidth / 2);\n\t\t\tpMatrix->AddInteger(-nHeight / 2);\n\t\t\tCPDF_Dictionary* pResource = new CPDF_Dictionary();\n\t\t\tpStreamDict->SetAt(\"Resources\", pResource);\n\t\t\tCPDF_Dictionary* pXObject = new CPDF_Dictionary();\n\t\t\tpResource->SetAt(\"XObject\", pXObject);\n\t\t\tpXObject->SetAtReference(\"Img\", pDocument, pImageStream);\n\t\t\tCPDF_Array* pProcSet = new CPDF_Array();\n\t\t\tpResource->SetAt(\"ProcSet\", pProcSet);\n\t\t\tpProcSet->AddName(\"PDF\");\n\t\t\tpProcSet->AddName(\"ImageC\");\n\t\t\tpStreamDict->SetAtName(\"Type\", \"XObject\");\n\t\t\tCPDF_Array* pBBox = new CPDF_Array();\n\t\t\tpStreamDict->SetAt(\"BBox\", pBBox);\n\t\t\tpBBox->AddInteger(0);\n\t\t\tpBBox->AddInteger(0);\n\t\t\tpBBox->AddInteger(nWidth);\n\t\t\tpBBox->AddInteger(nHeight);\n\t\t\tpStreamDict->SetAtInteger(\"FormType\", 1);\n\n\t\t\tpRetStream = new CPDF_Stream(NULL, 0, NULL);\n\t\t\tCFX_ByteString csStream;\n\t\t\tcsStream.Format(\"q\\n%d 0 0 %d 0 0 cm\\n/Img Do\\nQ\", nWidth, nHeight);\n\t\t\tpRetStream->InitStream((FX_BYTE*)(FX_LPCSTR)csStream, csStream.GetLength(), pStreamDict);\n\t\t\tpDocument->AddIndirectObject(pRetStream);\n\t\t}\n\n\t\tdelete pBmp;\n\t}\n\n\treturn pRetStream;\n}\n#endif\n\nvoid CPDFSDK_InterForm::OnCalculate(CPDF_FormField* pFormField)\n{\n    /*\n\tASSERT(m_pDocument != NULL);\n\tCPDFDoc_Environment* pEnv = m_pDocument->GetEnv();\n\tASSERT(pEnv);\n\tif(!pEnv->IsJSInitiated())\n\t\treturn;\n\n\tif (m_bBusy) return;\n\n\tm_bBusy = TRUE;\n\n\tif (this->IsCalculateEnabled())\n\t{\n\t\tIFXJS_Runtime* pRuntime = m_pDocument->GetJsRuntime();\n\t\tASSERT(pRuntime != NULL);\n\n\t\tpRuntime->SetReaderDocument(m_pDocument);\n\n\t\tint nSize = m_pInterForm->CountFieldsInCalculationOrder();\n\t\tfor (int i=0; i<nSize; i++)\n\t\t{\n\t\t\tif(CPDF_FormField* pField = m_pInterForm->GetFieldInCalculationOrder(i))\n\t\t\t{\n//\t\t\tASSERT(pField != NULL);\n\t\t\t\tint nType = pField->GetFieldType();\n\t\t\t\tif (nType == FIELDTYPE_COMBOBOX || nType == FIELDTYPE_TEXTFIELD)\n\t\t\t\t{\n\t\t\t\t\tCPDF_AAction aAction = pField->GetAdditionalAction();\n\t\t\t\t\tif (aAction && aAction.ActionExist(CPDF_AAction::Calculate))\n\t\t\t\t\t{\n\t\t\t\t\t\tCPDF_Action action = aAction.GetAction(CPDF_AAction::Calculate);\n\t\t\t\t\t\tif (action)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tCFX_WideString csJS = action.GetJavaScript();\n\t\t\t\t\t\t\tif (!csJS.IsEmpty())\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tIFXJS_Context* pContext = pRuntime->NewContext();\n\t\t\t\t\t\t\t\tASSERT(pContext != NULL);\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tCFX_WideString sOldValue = pField->GetValue();\n\t\t\t\t\t\t\t\tCFX_WideString sValue = sOldValue;\n\t\t\t\t\t\t\t\tFX_BOOL bRC = TRUE;\n\t\t\t\t\t\t\t\tpContext->OnField_Calculate(pFormField, pField, sValue, bRC);\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tCFX_WideString sInfo;\n\t\t\t\t\t\t\t\tFX_BOOL bRet = pContext->RunScript(csJS, sInfo);\n\t\t\t\t\t\t\t\tpRuntime->ReleaseContext(pContext);\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tif (bRet)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tif (bRC)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tif (sValue.Compare(sOldValue) != 0)\n\t\t\t\t\t\t\t\t\t\t\tpField->SetValue(sValue, TRUE);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t\n\t}\n\n\tm_bBusy = FALSE;\n    */\n}\n\nCFX_WideString CPDFSDK_InterForm::OnFormat(CPDF_FormField* pFormField, int nCommitKey, FX_BOOL& bFormated)\n{\n    /*\n\tASSERT(m_pDocument != NULL);\n\tASSERT(pFormField != NULL);\n\n\tCFX_WideString sValue = pFormField->GetValue();\n\tCPDFDoc_Environment* pEnv = m_pDocument->GetEnv();\n\tASSERT(pEnv);\n\tif(!pEnv->IsJSInitiated())\n\t{\n\t\tbFormated = FALSE;\n\t\treturn sValue;\n\t} \n\n\tIFXJS_Runtime* pRuntime = m_pDocument->GetJsRuntime();\n\tASSERT(pRuntime != NULL);\n\t\n\tpRuntime->SetReaderDocument(m_pDocument);\n\n\tif (pFormField->GetFieldType() == FIELDTYPE_COMBOBOX)\n\t{\n\t\tif (pFormField->CountSelectedItems() > 0)\n\t\t{\n\t\t\tint index = pFormField->GetSelectedIndex(0);\n\t\t\tif (index >= 0)\n\t\t\t\tsValue = pFormField->GetOptionLabel(index);\n\t\t}\n\t}\n\n\tbFormated = FALSE;\n\n\tCPDF_AAction aAction = pFormField->GetAdditionalAction();\n\tif (aAction != NULL && aAction.ActionExist(CPDF_AAction::Format)) \n\t{\n\t\tCPDF_Action action = aAction.GetAction(CPDF_AAction::Format);\n\t\tif (action)\n\t\t{\t\t\t\n\t\t\tCFX_WideString script = action.GetJavaScript();\n\t\t\tif (!script.IsEmpty())\n\t\t\t{\n\t\t\t\tCFX_WideString Value = sValue;\n\n\t\t\t\tIFXJS_Context* pContext = pRuntime->NewContext();\n\t\t\t\tASSERT(pContext != NULL);\n\n\t\t\t\tpContext->OnField_Format(nCommitKey, pFormField, Value, TRUE);\n\t\t\t\n\t\t\t\tCFX_WideString sInfo;\n \t\t\t\tFX_BOOL bRet = pContext->RunScript(script, sInfo);\n\t\t\t\tpRuntime->ReleaseContext(pContext);\n\n\t\t\t\tif (bRet)\n\t\t\t\t{\n\t\t\t\t\tsValue = Value;\n\t\t\t\t\tbFormated = TRUE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn sValue;\n    */\n}\n\nvoid CPDFSDK_InterForm::ResetFieldAppearance(CPDF_FormField* pFormField, FX_LPCWSTR sValue, FX_BOOL bValueChanged)\n{\n\tASSERT(pFormField != NULL);\n\n\tfor (int i=0,sz=pFormField->CountControls(); i<sz; i++)\n\t{\n\t\tCPDF_FormControl* pFormCtrl = pFormField->GetControl(i);\n\t\tASSERT(pFormCtrl != NULL);\n\n\t\tASSERT(m_pInterForm != NULL);\n\t\tif(CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl))\n\t\t\tpWidget->ResetAppearance(sValue, bValueChanged);\n\t}\n}\n\nvoid CPDFSDK_InterForm::UpdateField(CPDF_FormField* pFormField)\n{\n\tASSERT(pFormField != NULL);\n\n\tfor (int i=0,sz=pFormField->CountControls(); i<sz; i++)\n\t{\n\t\tCPDF_FormControl* pFormCtrl = pFormField->GetControl(i);\n\t\tASSERT(pFormCtrl != NULL);\n\n\t\tif(CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl))\n\t\t{\n\t\t\tCPDFDoc_Environment * pEnv = m_pDocument->GetEnv();\n\t\t\tCFFL_IFormFiller* pIFormFiller = pEnv->GetIFormFiller();\n\t\t\t\n\t\t\tCPDF_Page * pPage = pWidget->GetPDFPage();\n\t\t\tCPDFSDK_PageView * pPageView = m_pDocument->GetPageView(pPage,FALSE);\n\n\t\t\tFX_RECT rcBBox = pIFormFiller->GetViewBBox(pPageView, pWidget);\n\n\t\t\tpEnv->FFI_Invalidate(pPage,rcBBox.left, rcBBox.top, rcBBox.right, rcBBox.bottom);\n\t\t}\n\t}\n}\n\nvoid CPDFSDK_InterForm::OnKeyStrokeCommit(CPDF_FormField* pFormField, CFX_WideString& csValue, FX_BOOL& bRC)\n{\n\tASSERT(pFormField != NULL);\n\n \tCPDF_AAction aAction = pFormField->GetAdditionalAction();\n \tif (aAction != NULL && aAction.ActionExist(CPDF_AAction::KeyStroke)) \n \t{\n \t\tCPDF_Action action = aAction.GetAction(CPDF_AAction::KeyStroke);\n \t\tif (action)\n \t\t{\t\t\t \n \t\t\tASSERT(m_pDocument != NULL);\n \t\t\tCPDFDoc_Environment* pEnv = m_pDocument->GetEnv();\n \t\t\tASSERT(pEnv != NULL);\n\n\t\t\tCPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander();\n\t\t\tASSERT(pActionHandler != NULL);\n\t\n\t\t\tPDFSDK_FieldAction fa;\n\t\t\tfa.bModifier = pEnv->FFI_IsCTRLKeyDown(0);\n \t\t\tfa.bShift = pEnv->FFI_IsSHIFTKeyDown(0);\n\t\t\tfa.sValue = csValue;\n\n   \t\t\tpActionHandler->DoAction_FieldJavaScript(action, CPDF_AAction::KeyStroke, \n   \t\t\t\tm_pDocument, pFormField, fa);\n   \t\t\tbRC = fa.bRC;\n \t\t}\n \t}\n}\n\nvoid CPDFSDK_InterForm::OnValidate(CPDF_FormField* pFormField, CFX_WideString& csValue, FX_BOOL& bRC)\n{\n\tASSERT(pFormField != NULL);\n\n \tCPDF_AAction aAction = pFormField->GetAdditionalAction();\n \tif (aAction != NULL && aAction.ActionExist(CPDF_AAction::Validate)) \n \t{\n \t\tCPDF_Action action = aAction.GetAction(CPDF_AAction::Validate);\n\t\tif (action)\n \t\t{\t\t\n\t\t\tASSERT(m_pDocument != NULL);\n\t\t\tCPDFDoc_Environment* pEnv = m_pDocument->GetEnv();\n\t\t\tASSERT(pEnv != NULL);\n\t\t\t\n\t\t\tCPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander();\n\t\t\tASSERT(pActionHandler != NULL);\n\n\t\t\tPDFSDK_FieldAction fa;\n\t\t\tfa.bModifier = pEnv->FFI_IsCTRLKeyDown(0);\n\t\t\tfa.bShift = pEnv->FFI_IsSHIFTKeyDown(0);\n\t\t\tfa.sValue = csValue;\n\n\t\t\tpActionHandler->DoAction_FieldJavaScript(action, CPDF_AAction::Validate, m_pDocument, pFormField, fa);\n\t\t\tbRC = fa.bRC;\n \t \n\t\t}\n \t}\n}\n\n/* ----------------------------- action ----------------------------- */\n\nFX_BOOL CPDFSDK_InterForm::DoAction_Hide(const CPDF_Action& action)\n{\n\tASSERT(action != NULL);\n\n\tCPDF_ActionFields af = action.GetWidgets();\n\tCFX_PtrArray fieldObjects;\n\taf.GetAllFields(fieldObjects);\n\tCFX_PtrArray widgetArray;\n\tCFX_PtrArray fields;\n\tGetFieldFromObjects(fieldObjects, fields);\n\n\tFX_BOOL bHide = action.GetHideStatus();\n\n\tFX_BOOL bChanged = FALSE;\n\t\n\tfor (int i=0, sz=fields.GetSize(); i<sz; i++)\n\t{\n\t\tCPDF_FormField* pField = (CPDF_FormField*)fields[i];\n\t\tASSERT(pField != NULL);\n\n\t\n\t\tfor (int j=0,jsz=pField->CountControls(); j<jsz; j++)\n\t\t{\n\t\t\tCPDF_FormControl* pControl = pField->GetControl(j);\n\t\t\tASSERT(pControl != NULL);\n\n\t\t\tif (CPDFSDK_Widget* pWidget = GetWidget(pControl))\n\t\t\t{\n\t\t\t\tint nFlags = pWidget->GetFlags();\n\t\t\t\tif (bHide)\n\t\t\t\t{\n\t\t\t\t\tnFlags &= (~ANNOTFLAG_INVISIBLE);\n\t\t\t\t\tnFlags &= (~ANNOTFLAG_NOVIEW);\n\t\t\t\t\tnFlags |= (ANNOTFLAG_HIDDEN);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tnFlags &= (~ANNOTFLAG_INVISIBLE);\n\t\t\t\t\tnFlags &= (~ANNOTFLAG_HIDDEN);\n\t\t\t\t\tnFlags &= (~ANNOTFLAG_NOVIEW);\n\t\t\t\t}\n\t\t\t\tpWidget->SetFlags(nFlags);\n\n \t\t\t\tCPDFSDK_PageView* pPageView = pWidget->GetPageView();\n \t\t\t\tASSERT(pPageView != NULL);\n \n \t\t\t\tpPageView->UpdateView(pWidget);\n\n\t\t\t\tbChanged = TRUE;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn bChanged;\n}\n\nFX_BOOL CPDFSDK_InterForm::DoAction_SubmitForm(const CPDF_Action& action)\n{\n\tASSERT(action != NULL);\n\tASSERT(m_pInterForm != NULL);\n\n\tCFX_WideString sDestination = action.GetFilePath();\n\tif (sDestination.IsEmpty()) return FALSE;\n\n\tCPDF_Dictionary* pActionDict = action;\n\tif (pActionDict->KeyExist(\"Fields\"))\n\t{\n\t\tCPDF_ActionFields af = action.GetWidgets();\n\t\tFX_DWORD dwFlags = action.GetFlags();\n\t\t\n\t\tCFX_PtrArray fieldObjects;\n\t\taf.GetAllFields(fieldObjects);\n\t\tCFX_PtrArray fields;\n\t\tGetFieldFromObjects(fieldObjects, fields);\n\t\t\n\t\tif (fields.GetSize() != 0)\n\t\t{\n\t\t\tFX_BOOL bIncludeOrExclude = !(dwFlags & 0x01);\n\t\t\tif (m_pInterForm->CheckRequiredFields(&fields, bIncludeOrExclude))\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\treturn SubmitFields(sDestination, fields, bIncludeOrExclude, FALSE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif ( m_pInterForm->CheckRequiredFields())\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\treturn SubmitForm(sDestination, FALSE);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif ( m_pInterForm->CheckRequiredFields())\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn SubmitForm(sDestination, FALSE);\n\t}\n}\n\nFX_BOOL CPDFSDK_InterForm::SubmitFields(const CFX_WideString& csDestination, const CFX_PtrArray& fields,\n\t\t\t\t\t\t\t\t\tFX_BOOL bIncludeOrExclude, FX_BOOL bUrlEncoded)\n{\n\tCPDFDoc_Environment* pEnv = m_pDocument->GetEnv();\n\tASSERT(pEnv != NULL);\n\n\tCFX_ByteTextBuf textBuf;\n\tExportFieldsToFDFTextBuf(fields, bIncludeOrExclude, textBuf);\n\n\tFX_LPBYTE pBuffer = textBuf.GetBuffer();\n\tFX_STRSIZE nBufSize = textBuf.GetLength();\n\t\n\tif (bUrlEncoded)\n\t{\n\t\tif(!FDFToURLEncodedData(pBuffer, nBufSize))\n\t\t\treturn FALSE;\n\t}\n\n\tpEnv->JS_docSubmitForm(pBuffer, nBufSize, (FX_LPCWSTR)csDestination);\n\t\n\tif (bUrlEncoded && pBuffer)\n\t{\n\t\tFX_Free(pBuffer);\n\t\tpBuffer = NULL;\t\n\t}\n\n\treturn TRUE;\n}\n\nvoid CPDFSDK_InterForm::DoFDFBuffer(CFX_ByteString sBuffer)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (CFDF_Document *pFDFDocument = CFDF_Document::ParseMemory((const unsigned char *)sBuffer.GetBuffer(sBuffer.GetLength()), sBuffer.GetLength()))\n\t{\t\t\t\t\t\t\n\t\tCPDF_Dictionary* pRootDic = pFDFDocument->GetRoot();\n\t\tif(pRootDic)\n\t\t{\n\t\t\tCPDF_Dictionary * pFDFDict=pRootDic->GetDict(\"FDF\");\n\t\t\tif(pFDFDict)\n\t\t\t{\t\t\n\t\t\t\tCPDF_Dictionary * pJSDict = pFDFDict->GetDict(\"JavaScript\");\n\t\t\t\tif(pJSDict)\n\t\t\t\t{\n\t\t\t\t\tCFX_WideString csJS;\n\t\t\t\t\n\t\t\t\t\tCPDF_Object* pJS = pJSDict->GetElementValue(\"Before\");\n\t\t\t\t\tif (pJS != NULL)\n\t\t\t\t\t{\n\t\t\t\t\t\tint iType = pJS->GetType();\n\t\t\t\t\t\tif (iType == PDFOBJ_STRING)\n\t\t\t\t\t\t\tcsJS = pJSDict->GetUnicodeText(\"Before\");\n\t\t\t\t\t\telse if (iType == PDFOBJ_STREAM)\n\t\t\t\t\t\t\tcsJS = pJS->GetUnicodeText();\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdelete pFDFDocument;\n\t}\n\n\tsBuffer.ReleaseBuffer();\n}\n\nFX_BOOL CPDFSDK_InterForm::FDFToURLEncodedData(CFX_WideString csFDFFile, CFX_WideString csTxtFile)\n{\n\treturn TRUE;\n}\n\nFX_BOOL CPDFSDK_InterForm::FDFToURLEncodedData(FX_LPBYTE& pBuf, FX_STRSIZE& nBufSize)\n{\n \tCFDF_Document* pFDF = CFDF_Document::ParseMemory(pBuf, nBufSize);\n \tif (pFDF)\n \t{\n \t\tCPDF_Dictionary* pMainDict = pFDF->GetRoot()->GetDict(\"FDF\");\n \t\tif (pMainDict == NULL) return FALSE;\n \t\t\n \t\t// Get fields\n \t\tCPDF_Array* pFields = pMainDict->GetArray(\"Fields\");\n \t\tif (pFields == NULL) return FALSE;\n\t\t\n\t\tCFX_ByteTextBuf fdfEncodedData;\n\n \t\tfor (FX_DWORD i = 0; i < pFields->GetCount(); i ++) \n \t\t{\n \t\t\tCPDF_Dictionary* pField = pFields->GetDict(i);\n \t\t\tif (pField == NULL) continue;\n \t\t\tCFX_WideString name;\n \t\t\tname = pField->GetUnicodeText(\"T\");\n \t\t\tCFX_ByteString name_b = CFX_ByteString::FromUnicode(name);\n \t\t\tCFX_ByteString csBValue = pField->GetString(\"V\");\n \t\t\tCFX_WideString csWValue = PDF_DecodeText(csBValue);\n \t\t\tCFX_ByteString csValue_b = CFX_ByteString::FromUnicode(csWValue);\n\n\t\t\tfdfEncodedData = fdfEncodedData<<name_b.GetBuffer(name_b.GetLength());\n  \t\t\tname_b.ReleaseBuffer();\n\t\t\tfdfEncodedData = fdfEncodedData<<\"=\";\n\t\t\tfdfEncodedData = fdfEncodedData<<csValue_b.GetBuffer(csValue_b.GetLength());\n  \t\t\tcsValue_b.ReleaseBuffer();\n  \t\t\tif(i != pFields->GetCount()-1)\n  \t\t\t\tfdfEncodedData = fdfEncodedData<<\"&\";\n \t\t}\n\t\t\n\t\tnBufSize = fdfEncodedData.GetLength();\n\t\tpBuf = FX_Alloc(FX_BYTE, nBufSize);\n\t\tif(!pBuf)\n\t\t\treturn FALSE;\n\t\tFXSYS_memcpy(pBuf, fdfEncodedData.GetBuffer(), nBufSize);\n \t\t\n \t}\n\treturn TRUE;\n}\n\nFX_BOOL CPDFSDK_InterForm::ExportFieldsToFDFFile(const CFX_WideString& sFDFFileName, \n\t\t\t\t\t\t\t\t\t\t\t\t const CFX_PtrArray& fields, FX_BOOL bIncludeOrExclude)\n{\n\tif (sFDFFileName.IsEmpty()) return FALSE;\n\tASSERT(m_pDocument != NULL);\n\tASSERT(m_pInterForm != NULL);\n\n \tCFDF_Document* pFDF = m_pInterForm->ExportToFDF(m_pDocument->GetPath(),(CFX_PtrArray&)fields, bIncludeOrExclude);\n \tif (!pFDF) return FALSE;\n \tFX_BOOL bRet = pFDF->WriteFile(sFDFFileName.UTF8Encode()); // = FALSE;//\n\tdelete pFDF;\n\n\treturn bRet;\n}\nFX_BOOL CPDFSDK_InterForm::ExportFieldsToFDFTextBuf(const CFX_PtrArray& fields,FX_BOOL bIncludeOrExclude, CFX_ByteTextBuf& textBuf)\n{\n\tASSERT(m_pDocument != NULL);\n\tASSERT(m_pInterForm != NULL);\n\t\n\tCFDF_Document* pFDF = m_pInterForm->ExportToFDF(m_pDocument->GetPath(),(CFX_PtrArray&)fields, bIncludeOrExclude);\n\tif (!pFDF) return FALSE;\n\tFX_BOOL bRet = pFDF->WriteBuf(textBuf); // = FALSE;//\n\tdelete pFDF;\n\t\n\treturn bRet;\n}\n\nCFX_WideString CPDFSDK_InterForm::GetTemporaryFileName(const CFX_WideString& sFileExt)\n{\n\tCFX_WideString sFileName;\n\treturn L\"\";\n}\n\nFX_BOOL CPDFSDK_InterForm::SubmitForm(const CFX_WideString& sDestination, FX_BOOL bUrlEncoded)\n{\n \tif (sDestination.IsEmpty()) return FALSE;\n\n\tCPDFDoc_Environment* pEnv = m_pDocument->GetEnv();\n\tASSERT(pEnv != NULL);\n\n\tif(NULL == m_pDocument) return FALSE;\n\tCFX_WideString wsPDFFilePath = m_pDocument->GetPath();\n\t\n\tif(NULL == m_pInterForm) return FALSE;\n\tCFDF_Document* pFDFDoc = m_pInterForm->ExportToFDF(wsPDFFilePath);\n\tif (NULL == pFDFDoc) return FALSE;\n\n\tCFX_ByteTextBuf FdfBuffer;\n\tFX_BOOL bRet = pFDFDoc->WriteBuf(FdfBuffer);\n\tdelete pFDFDoc;\n\tif (!bRet) return FALSE;\n\n\tFX_LPBYTE pBuffer = FdfBuffer.GetBuffer();\n\tFX_STRSIZE nBufSize = FdfBuffer.GetLength();\n\t\n\tif (bUrlEncoded)\n\t{\n\t\tif(!FDFToURLEncodedData(pBuffer, nBufSize))\n\t\t\treturn FALSE;\n\t}\n\n\tpEnv->JS_docSubmitForm(pBuffer, nBufSize, (FX_LPCWSTR)sDestination);\n\t\n\tif (bUrlEncoded && pBuffer)\n\t{\n\t\tFX_Free(pBuffer);\n\t\tpBuffer = NULL;\t\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL\tCPDFSDK_InterForm::ExportFormToFDFFile(const CFX_WideString& sFDFFileName)\n{\n\tif (sFDFFileName.IsEmpty()) return FALSE;\n\n\tASSERT(m_pInterForm != NULL);\n\tASSERT(m_pDocument != NULL);\n\n\tCFDF_Document* pFDF = m_pInterForm->ExportToFDF(m_pDocument->GetPath());\n\tif (!pFDF) return FALSE;\n\n\tFX_BOOL bRet = pFDF->WriteFile(sFDFFileName.UTF8Encode());\n\tdelete pFDF;\n\n\treturn bRet;\n}\n\nFX_BOOL CPDFSDK_InterForm::ExportFormToFDFTextBuf(CFX_ByteTextBuf& textBuf)\n{\n\n\tASSERT(m_pInterForm != NULL);\n\tASSERT(m_pDocument != NULL);\n\t\n\tCFDF_Document* pFDF = m_pInterForm->ExportToFDF(m_pDocument->GetPath());\n\tif (!pFDF) return FALSE;\n\t\n\tFX_BOOL bRet = pFDF->WriteBuf(textBuf);\n\tdelete pFDF;\n\t\n\treturn bRet;\n}\n\nFX_BOOL CPDFSDK_InterForm::ExportFormToTxtFile(const CFX_WideString& sTxtFileName)\n{\n\tASSERT(m_pInterForm != NULL);\n\n\tCFX_WideString sFieldNames;\n\tCFX_WideString sFieldValues;\n\n\tint nSize = m_pInterForm->CountFields();\n\n\tif (nSize > 0)\n\t{\n\t\tfor (int i=0; i<nSize; i++)\n\t\t{\n\t\t\tCPDF_FormField* pField = m_pInterForm->GetField(i);\n\t\t\tASSERT(pField != NULL);\n\n\t\t\tif (i != 0)\n\t\t\t{\n\t\t\t\tsFieldNames += L\"\\t\";\n\t\t\t\tsFieldValues += L\"\\t\";\n\t\t\t}\n\t\t\tsFieldNames += pField->GetFullName();\n\t\t\tsFieldValues += pField->GetValue();\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL\tCPDFSDK_InterForm::ImportFormFromTxtFile(const CFX_WideString& sTxtFileName)\n{\n\tASSERT(m_pInterForm != NULL);\n\n\treturn TRUE;\n}\n\nFX_BOOL CPDFSDK_InterForm::DoAction_ResetForm(const CPDF_Action& action)\n{\n\tASSERT(action != NULL);\n\n\tCPDF_Dictionary* pActionDict = action;\n\n\tif (pActionDict->KeyExist(\"Fields\"))\n\t{\n\t\tCPDF_ActionFields af = action.GetWidgets();\n\t\tFX_DWORD dwFlags = action.GetFlags();\n\t\t\n\t\tCFX_PtrArray fieldObjects;\n\t\taf.GetAllFields(fieldObjects);\n\t\tCFX_PtrArray fields;\n\t\tGetFieldFromObjects(fieldObjects, fields);\n\t\t\n\t\tASSERT(m_pInterForm != NULL);\n\n\t\treturn m_pInterForm->ResetForm(fields, !(dwFlags & 0x01), TRUE);\n\t}\n\telse\n\t{\n\t\tASSERT(m_pInterForm != NULL);\n\t\treturn m_pInterForm->ResetForm(TRUE);\n\t}\n}\n\nFX_BOOL CPDFSDK_InterForm::DoAction_ImportData(const CPDF_Action& action)\n{\n\tASSERT(action != NULL);\n\n\tCFX_WideString sFilePath = action.GetFilePath();\n\tif (sFilePath.IsEmpty())\n\t\treturn FALSE;\n\n\tif (!ImportFormFromFDFFile(sFilePath, TRUE))\n\t{\n\t\treturn FALSE;\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL\tCPDFSDK_InterForm::ImportFormFromFDFFile(const CFX_WideString& csFDFFileName,\n\t\t\t\t\t\t\t\t\t\t\t\t FX_BOOL bNotify)\n{\n\treturn FALSE;\n}\n\nvoid CPDFSDK_InterForm::GetFieldFromObjects(const CFX_PtrArray& objects, CFX_PtrArray& fields)\n{\n\tASSERT(m_pInterForm != NULL);\n\n\tint iCount = objects.GetSize();\n\tfor (int i = 0; i < iCount; i ++)\n\t{\n\t\tCPDF_Object* pObject = (CPDF_Object*)objects[i];\n\t\tif (pObject == NULL) continue;\n\t\t\n\t\tint iType = pObject->GetType();\n\t\tif (iType == PDFOBJ_STRING)\n\t\t{\n\t\t\tCFX_WideString csName = pObject->GetUnicodeText();\n\t\t\tCPDF_FormField* pField = m_pInterForm->GetField(0, csName);\n\t\t\tif (pField != NULL)\n\t\t\t\tfields.Add(pField);\n\t\t}\n\t\telse if (iType == PDFOBJ_DICTIONARY)\n\t\t{\n\t\t\tif (m_pInterForm->IsValidFormField(pObject))\n\t\t\t\tfields.Add(pObject);\n\t\t}\n\t}\n}\n\n/* ----------------------------- CPDF_FormNotify ----------------------------- */\n\nint\tCPDFSDK_InterForm::BeforeValueChange(const CPDF_FormField* pField, CFX_WideString& csValue)\n{\n\tASSERT(pField != NULL);\n\n\tCPDF_FormField* pFormField = (CPDF_FormField*)pField;\n\n\tint nType = pFormField->GetFieldType();\n\tif (nType == FIELDTYPE_COMBOBOX || nType == FIELDTYPE_TEXTFIELD)\n\t{\n\t\tFX_BOOL bRC = TRUE;\n\t\tOnKeyStrokeCommit(pFormField, csValue, bRC);\n\t\tif (bRC) \n\t\t{\n\t\t\tOnValidate(pFormField, csValue, bRC);\n\t\t\tif (bRC)\n\t\t\t\treturn 1;\n\t\t\telse\n\t\t\t\treturn -1;\n\t\t}\n\t\telse\n\t\t\treturn -1;\n\t}\n\telse\n\t\treturn 0;\n}\n\nint\tCPDFSDK_InterForm::AfterValueChange(const CPDF_FormField* pField)\n{\n\tASSERT(pField != NULL);\n\n\tCPDF_FormField* pFormField = (CPDF_FormField*)pField;\n\tint nType = pFormField->GetFieldType();\n\n\tif (nType == FIELDTYPE_COMBOBOX || nType == FIELDTYPE_TEXTFIELD)\n\t{\n\t\tthis->OnCalculate(pFormField);\n\t\tFX_BOOL bFormated = FALSE;\n\t\tCFX_WideString sValue = this->OnFormat(pFormField, 0, bFormated);\n\t\tif (bFormated)\n\t\t\tthis->ResetFieldAppearance(pFormField, sValue, TRUE);\n\t\telse\n\t\t\tthis->ResetFieldAppearance(pFormField, NULL, TRUE);\n\t\tthis->UpdateField(pFormField);\n\t}\n\n\treturn 0;\n}\n\nint\tCPDFSDK_InterForm::BeforeSelectionChange(const CPDF_FormField* pField, CFX_WideString& csValue)\n{\n\tASSERT(pField != NULL);\n\n\tCPDF_FormField* pFormField = (CPDF_FormField*)pField;\n\n\tint nType = pFormField->GetFieldType();\n\tif (nType == FIELDTYPE_LISTBOX)\n\t{\n\t\tFX_BOOL bRC = TRUE;\n\t\tOnKeyStrokeCommit(pFormField, csValue, bRC);\n\t\tif (bRC) \n\t\t{\n\t\t\tOnValidate(pFormField, csValue, bRC);\n\t\t\tif (bRC)\n\t\t\t\treturn 1;\n\t\t\telse\n\t\t\t\treturn -1;\n\t\t}\n\t\telse\n\t\t\treturn -1;\n\t}\n\telse\n\t\treturn 0;\n}\n\nint\tCPDFSDK_InterForm::AfterSelectionChange(const CPDF_FormField* pField)\n{\n\tASSERT(pField != NULL);\n\n\tCPDF_FormField* pFormField = (CPDF_FormField*)pField;\n\tint nType = pFormField->GetFieldType();\n\n\tif (nType == FIELDTYPE_LISTBOX)\n\t{\n\t\tthis->OnCalculate(pFormField);\n\t\tthis->ResetFieldAppearance(pFormField, NULL, TRUE);\n\t\tthis->UpdateField(pFormField);\n\t}\n\n\treturn 0;\n}\n\nint\tCPDFSDK_InterForm::AfterCheckedStatusChange(const CPDF_FormField* pField, const CFX_ByteArray& statusArray)\n{\n\tASSERT(pField != NULL);\n\n\tCPDF_FormField* pFormField = (CPDF_FormField*)pField;\n\tint nType = pFormField->GetFieldType();\n\n\tif (nType == FIELDTYPE_CHECKBOX || nType == FIELDTYPE_RADIOBUTTON)\n\t{\n\t\tthis->OnCalculate(pFormField);\n\t\t//this->ResetFieldAppearance(pFormField, NULL);\n\t\tthis->UpdateField(pFormField);\n\t}\n\n\treturn 0;\n}\n\nint\tCPDFSDK_InterForm::BeforeFormReset(const CPDF_InterForm* pForm)\n{\n\treturn 0;\n}\n\nint\tCPDFSDK_InterForm::AfterFormReset(const CPDF_InterForm* pForm)\n{\n\tthis->OnCalculate(NULL);\n\n\treturn 0;\n}\n\nint\tCPDFSDK_InterForm::BeforeFormImportData(const CPDF_InterForm* pForm)\n{\n\treturn 0;\n}\n\nint\tCPDFSDK_InterForm::AfterFormImportData(const CPDF_InterForm* pForm)\n{\n\tthis->OnCalculate(NULL);\n\n\treturn 0;\n}\n\nFX_BOOL CPDFSDK_InterForm::IsNeedHighLight(int nFieldType)\n{\n\tif(nFieldType <1 || nFieldType > 6)\n\t\treturn FALSE;\n\treturn m_bNeedHightlight[nFieldType-1];\n}\n\nvoid CPDFSDK_InterForm::RemoveAllHighLight()\n{\n\tmemset((void*)m_bNeedHightlight, 0, 6*sizeof(FX_BOOL));\n}\nvoid   CPDFSDK_InterForm::SetHighlightColor(FX_COLORREF clr, int nFieldType)\n{\n\tif(nFieldType <0 || nFieldType > 6) return;\n\tswitch(nFieldType)\n\t{\n\tcase 0:\n\t\t{\n\t\t\tfor(int i=0; i<6; i++)\n\t\t\t{\n\t\t\t\tm_aHighlightColor[i] = clr;\n\t\t\t\tm_bNeedHightlight[i] = TRUE;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\tdefault:\n\t\t{\n\t\t\tm_aHighlightColor[nFieldType-1] = clr;\n\t\t\tm_bNeedHightlight[nFieldType-1] = TRUE;\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n}\n\nFX_COLORREF CPDFSDK_InterForm::GetHighlightColor(int nFieldType)\n{\n\tif(nFieldType <0 || nFieldType >6) return FXSYS_RGB(255,255,255);\n\tif(nFieldType == 0)\n\t\treturn m_aHighlightColor[0];\n\telse\n\t\treturn m_aHighlightColor[nFieldType-1];\n}\n\n/* ------------------------- CBA_AnnotIterator ------------------------- */\n\nCBA_AnnotIterator::CBA_AnnotIterator(CPDFSDK_PageView* pPageView, const CFX_ByteString& sType, const CFX_ByteString& sSubType)\n\t:m_pPageView(pPageView),\n\tm_sType(sType),\n\tm_sSubType(sSubType),\n\tm_nTabs(BAI_STRUCTURE)\n{\n\tASSERT(m_pPageView != NULL);\n\n\tCPDF_Page* pPDFPage = m_pPageView->GetPDFPage();\n\tASSERT(pPDFPage != NULL);\n\tASSERT(pPDFPage->m_pFormDict != NULL);\n\n\tCFX_ByteString sTabs = pPDFPage->m_pFormDict->GetString(\"Tabs\");\n\n\tif (sTabs == \"R\")\n\t{\n\t\tm_nTabs = BAI_ROW;\n\t}\n\telse if (sTabs == \"C\")\n\t{\n\t\tm_nTabs = BAI_COLUMN;\n\t}\n\telse\n\t{\n\t\tm_nTabs = BAI_STRUCTURE;\n\t}\n\n\tGenerateResults();\n}\n\nCBA_AnnotIterator::~CBA_AnnotIterator()\n{\n\tm_Annots.RemoveAll();\n}\n\nCPDFSDK_Annot* CBA_AnnotIterator::GetFirstAnnot()\n{\n\tif (m_Annots.GetSize() > 0)\n\t\treturn m_Annots[0];\n\t\n\treturn NULL;\n}\n\nCPDFSDK_Annot* CBA_AnnotIterator::GetLastAnnot()\n{\n\tif (m_Annots.GetSize() > 0)\n\t\treturn m_Annots[m_Annots.GetSize() - 1];\n\n\treturn NULL;\n}\n\nCPDFSDK_Annot* CBA_AnnotIterator::GetNextAnnot(CPDFSDK_Annot* pAnnot)\n{\n\tfor (int i=0,sz=m_Annots.GetSize(); i<sz; i++)\n\t{\n\t\tif (m_Annots[i] == pAnnot)\n\t\t{\n\t\t\tif (i+1 < sz)\n\t\t\t\treturn m_Annots[i+1];\n\t\t\telse\n\t\t\t\treturn m_Annots[0];\n\t\t}\n\t}\n\n\treturn NULL;\n}\n\nCPDFSDK_Annot* CBA_AnnotIterator::GetPrevAnnot(CPDFSDK_Annot* pAnnot)\n{\n\tfor (int i=0,sz=m_Annots.GetSize(); i<sz; i++)\n\t{\n\t\tif (m_Annots[i] == pAnnot)\n\t\t{\n\t\t\tif (i-1 >= 0)\n\t\t\t\treturn m_Annots[i-1];\n\t\t\telse\n\t\t\t\treturn m_Annots[sz-1];\n\t\t}\n\t}\n\n\treturn NULL;\n}\n\nint CBA_AnnotIterator::CompareByLeft(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2)\n{\n\tASSERT(p1 != NULL);\n\tASSERT(p2 != NULL);\n\n\tCPDF_Rect rcAnnot1 = GetAnnotRect(p1);\n\tCPDF_Rect rcAnnot2 = GetAnnotRect(p2);\n\n\tif (rcAnnot1.left < rcAnnot2.left)\n\t\treturn -1;\n\tif (rcAnnot1.left > rcAnnot2.left)\n\t\treturn 1;\n\treturn 0;\n}\n\n\nint CBA_AnnotIterator::CompareByTop(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2)\n{\n\tASSERT(p1 != NULL);\n\tASSERT(p2 != NULL);\n\n\tCPDF_Rect rcAnnot1 = GetAnnotRect(p1);\n\tCPDF_Rect rcAnnot2 = GetAnnotRect(p2);\n\n\tif (rcAnnot1.top < rcAnnot2.top)\n\t\treturn -1;\n\tif (rcAnnot1.top > rcAnnot2.top)\n\t\treturn 1;\n\treturn 0;\n}\n\nvoid CBA_AnnotIterator::GenerateResults()\n{\n\tASSERT(m_pPageView != NULL);\n\n\tswitch (m_nTabs)\n\t{\n\tcase BAI_STRUCTURE:\n\t\t{\n\t\t\tfor (int i=0,sz=m_pPageView->CountAnnots(); i<sz; i++)\n\t\t\t{\n\t\t\t\tCPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i);\n\t\t\t\tASSERT(pAnnot != NULL);\n\n\t\t\t\tif (pAnnot->GetType() == m_sType \n\t\t\t\t\t&& pAnnot->GetSubType() == m_sSubType)\n\t\t\t\t\tm_Annots.Add(pAnnot);\n\t\t\t}\n\t\t}\n\t\tbreak;\n\tcase BAI_ROW:\n\t\t{\n\t\t\tCPDFSDK_SortAnnots sa;\n\n\t\t\t{\n\t\t\t\t\n\t\t\t\tfor (int i=0,sz=m_pPageView->CountAnnots(); i<sz; i++)\n\t\t\t\t{\n\t\t\t\t\tCPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i);\n\t\t\t\t\tASSERT(pAnnot != NULL);\n\n\t\t\t\t\tif (pAnnot->GetType() == m_sType \n\t\t\t\t\t\t&& pAnnot->GetSubType() == m_sSubType)\n\t\t\t\t\t\tsa.Add(pAnnot);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (sa.GetSize() > 0)\n\t\t\t{\n\t\t\t\tsa.Sort(CBA_AnnotIterator::CompareByLeft);\n\t\t\t}\n\n\t\t\twhile (sa.GetSize() > 0)\n\t\t\t{\n\t\t\t\tint nLeftTopIndex = -1;\n\n\t\t\t\t{\n\t\t\t\t\tFX_FLOAT fTop = 0.0f;\n\n\t\t\t\t\tfor (int i=sa.GetSize()-1; i>=0; i--)\n\t\t\t\t\t{\n\t\t\t\t\t\tCPDFSDK_Annot* pAnnot = sa.GetAt(i);\n\t\t\t\t\t\tASSERT(pAnnot != NULL);\n\n\t\t\t\t\t\tCPDF_Rect rcAnnot = GetAnnotRect(pAnnot);\n\n\t\t\t\t\t\tif (rcAnnot.top > fTop)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnLeftTopIndex = i;\n\t\t\t\t\t\t\tfTop = rcAnnot.top;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (nLeftTopIndex >= 0)\n\t\t\t\t{\n\t\t\t\t\tCPDFSDK_Annot* pLeftTopAnnot = sa.GetAt(nLeftTopIndex);\n\t\t\t\t\tASSERT(pLeftTopAnnot != NULL);\n\n\t\t\t\t\tCPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot);\n\t\t\t\t\t\n\t\t\t\t\tm_Annots.Add(pLeftTopAnnot);\n\t\t\t\t\tsa.RemoveAt(nLeftTopIndex);\n\n\t\t\t\t\tCFX_ArrayTemplate<int> aSelect;\n\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (int i=0,sz=sa.GetSize(); i<sz; i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tCPDFSDK_Annot* pAnnot = sa.GetAt(i);\n\t\t\t\t\t\t\tASSERT(pAnnot != NULL);\n\n\t\t\t\t\t\t\tCPDF_Rect rcAnnot = GetAnnotRect(pAnnot);\n\n\t\t\t\t\t\t\tFX_FLOAT fCenterY = (rcAnnot.top + rcAnnot.bottom) / 2.0f;\n\n\t\t\t\t\t\t\tif (fCenterY > rcLeftTop.bottom && fCenterY < rcLeftTop.top)\n\t\t\t\t\t\t\t\taSelect.Add(i);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (int i=0,sz=aSelect.GetSize(); i<sz; i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tm_Annots.Add(sa[aSelect[i]]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (int i=aSelect.GetSize()-1; i>=0; i--)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsa.RemoveAt(aSelect[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\taSelect.RemoveAll();\n\t\t\t\t}\n\t\t\t}\n\t\t\tsa.RemoveAll();\n\t\t}\n\t\tbreak;\n\tcase BAI_COLUMN:\n\t\t{\n\t\t\tCPDFSDK_SortAnnots sa;\n\n\t\t\t{\n\t\t\t\tfor (int i=0,sz=m_pPageView->CountAnnots(); i<sz; i++)\n\t\t\t\t{\n\t\t\t\t\tCPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i);\n\t\t\t\t\tASSERT(pAnnot != NULL);\n\n\t\t\t\t\tif (pAnnot->GetType() == m_sType \n\t\t\t\t\t\t&& pAnnot->GetSubType() == m_sSubType)\n\t\t\t\t\t\tsa.Add(pAnnot);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (sa.GetSize() > 0)\n\t\t\t{\n\t\t\t\tsa.Sort(CBA_AnnotIterator::CompareByTop, FALSE);\n\t\t\t}\n\n\t\t\twhile (sa.GetSize() > 0)\n\t\t\t{\n\t\t\t\tint nLeftTopIndex = -1;\n\n\t\t\t\t{\n\t\t\t\t\tFX_FLOAT fLeft = -1.0f;\n\n\t\t\t\t\tfor (int i=sa.GetSize()-1; i>=0; i--)\n\t\t\t\t\t{\n\t\t\t\t\t\tCPDFSDK_Annot* pAnnot = sa.GetAt(i);\n\t\t\t\t\t\tASSERT(pAnnot != NULL);\n\n\t\t\t\t\t\tCPDF_Rect rcAnnot = GetAnnotRect(pAnnot);\n\n\t\t\t\t\t\tif (fLeft < 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnLeftTopIndex = 0;\n\t\t\t\t\t\t\tfLeft = rcAnnot.left;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (rcAnnot.left < fLeft)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnLeftTopIndex = i;\n\t\t\t\t\t\t\tfLeft = rcAnnot.left;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (nLeftTopIndex >= 0)\n\t\t\t\t{\n\t\t\t\t\tCPDFSDK_Annot* pLeftTopAnnot = sa.GetAt(nLeftTopIndex);\n\t\t\t\t\tASSERT(pLeftTopAnnot != NULL);\n\n\t\t\t\t\tCPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot);\n\t\t\t\t\t\n\t\t\t\t\tm_Annots.Add(pLeftTopAnnot);\n\t\t\t\t\tsa.RemoveAt(nLeftTopIndex);\n\n\t\t\t\t\tCFX_ArrayTemplate<int> aSelect;\n\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (int i=0,sz=sa.GetSize(); i<sz; i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tCPDFSDK_Annot* pAnnot = sa.GetAt(i);\n\t\t\t\t\t\t\tASSERT(pAnnot != NULL);\n\n\t\t\t\t\t\t\tCPDF_Rect rcAnnot = GetAnnotRect(pAnnot);\n\n\t\t\t\t\t\t\tFX_FLOAT fCenterX = (rcAnnot.left + rcAnnot.right) / 2.0f;\n\n\t\t\t\t\t\t\tif (fCenterX > rcLeftTop.left && fCenterX < rcLeftTop.right)\n\t\t\t\t\t\t\t\taSelect.Add(i);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (int i=0,sz=aSelect.GetSize(); i<sz; i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tm_Annots.Add(sa[aSelect[i]]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (int i=aSelect.GetSize()-1; i>=0; i--)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsa.RemoveAt(aSelect[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\taSelect.RemoveAll();\n\t\t\t\t}\n\t\t\t}\n\t\t\tsa.RemoveAll();\n\t\t}\n\t\tbreak;\n\t}\n}\n\nCPDF_Rect CBA_AnnotIterator::GetAnnotRect(CPDFSDK_Annot* pAnnot)\n{\n\tASSERT(pAnnot != NULL);\n\n\tCPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();\n\tASSERT(pPDFAnnot != NULL);\n\n\tCPDF_Rect rcAnnot;\n\tpPDFAnnot->GetRect(rcAnnot);\n\n\treturn rcAnnot;\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/fsdk_mgr.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../include/fsdk_define.h\"\n#include \"../include/fsdk_mgr.h\"\n#include \"../include/fpdf_ext.h\"\n#include \"../include/formfiller/FFL_FormFiller.h\"\n//#include \"../include/javascript/IJavaScript.h\"\n\n#if _FX_OS_ == _FX_ANDROID_\n#include \"time.h\"\n#else\n#include <ctime>\n#endif\n\n//extern CPDFDoc_Environment* g_pFormFillApp;\nclass CFX_SystemHandler:public IFX_SystemHandler\n{\npublic:\n\tCFX_SystemHandler(CPDFDoc_Environment* pEnv):m_pEnv(pEnv),m_nCharSet(-1) {}\npublic:\n\tvirtual void\t\t\t\tInvalidateRect(FX_HWND hWnd, FX_RECT rect) ;\n\tvirtual void\t\t\t\tOutputSelectedRect(void* pFormFiller, CPDF_Rect& rect);\n\n\tvirtual FX_BOOL\t\t\t\tIsSelectionImplemented();\n\n\tvirtual CFX_WideString\t\tGetClipboardText(FX_HWND hWnd){return L\"\";}\n\tvirtual FX_BOOL\t\t\t\tSetClipboardText(FX_HWND hWnd, CFX_WideString string) {return FALSE;}\n\t\n\tvirtual void\t\t\t\tClientToScreen(FX_HWND hWnd, FX_INT32& x, FX_INT32& y) {}\n\tvirtual void\t\t\t\tScreenToClient(FX_HWND hWnd, FX_INT32& x, FX_INT32& y) {}\n\n\t/*cursor style\n\tFXCT_ARROW\t\n\tFXCT_NESW\t\t\n\tFXCT_NWSE\t\t\n\tFXCT_VBEAM\t\t\n\tFXCT_HBEAM\t\t\n\tFXCT_HAND\n\t*/\n\tvirtual void\t\t\t\tSetCursor(FX_INT32 nCursorType);\n\n\tvirtual FX_HMENU\t\t\tCreatePopupMenu() {return NULL;}\n\tvirtual FX_BOOL\t\t\t\tAppendMenuItem(FX_HMENU hMenu, FX_INT32 nIDNewItem, CFX_WideString string) {return FALSE;}\n\tvirtual FX_BOOL\t\t\t\tEnableMenuItem(FX_HMENU hMenu, FX_INT32 nIDItem, FX_BOOL bEnabled) {return FALSE;}\n\tvirtual FX_INT32\t\t\tTrackPopupMenu(FX_HMENU hMenu, FX_INT32 x, FX_INT32 y, FX_HWND hParent) {return -1;}\n\tvirtual void\t\t\t\tDestroyMenu(FX_HMENU hMenu) {}\n\n\tvirtual CFX_ByteString\t\tGetNativeTrueTypeFont(FX_INT32 nCharset);\n\tvirtual FX_BOOL\t\t\t\tFindNativeTrueTypeFont(FX_INT32 nCharset, CFX_ByteString sFontFaceName);\n\tvirtual CPDF_Font*\t\t\tAddNativeTrueTypeFontToPDF(CPDF_Document* pDoc, CFX_ByteString sFontFaceName, FX_BYTE nCharset);\n\n\tvirtual FX_INT32\t\t\tSetTimer(FX_INT32 uElapse, TimerCallback lpTimerFunc) ;\n\tvirtual void\t\t\t\tKillTimer(FX_INT32 nID) ;\n\n\n\tvirtual FX_BOOL\t\t\t\tIsSHIFTKeyDown(FX_DWORD nFlag) {return m_pEnv->FFI_IsSHIFTKeyDown(nFlag);}\n\tvirtual FX_BOOL\t\t\t\tIsCTRLKeyDown(FX_DWORD nFlag) {return m_pEnv->FFI_IsCTRLKeyDown(nFlag);}\n\tvirtual FX_BOOL\t\t\t\tIsALTKeyDown(FX_DWORD nFlag) {return m_pEnv->FFI_IsALTKeyDown(nFlag);}\n\tvirtual FX_BOOL\t\t\t\tIsINSERTKeyDown(FX_DWORD nFlag) {return m_pEnv->FFI_IsINSERTKeyDown(nFlag);}\n\n\tvirtual\tFX_SYSTEMTIME\t\tGetLocalTime();\n\n\tvirtual FX_INT32\t\t\tGetCharSet() {return m_nCharSet;}\n\tvirtual void \t\t\t\tSetCharSet(FX_INT32 nCharSet) {m_nCharSet = nCharSet;}\nprivate:\n\tCPDFDoc_Environment* m_pEnv;\n\tint\t\tm_nCharSet;\n};\n\nvoid CFX_SystemHandler::SetCursor(FX_INT32 nCursorType)\n{\n\n\tm_pEnv->FFI_SetCursor(nCursorType);\n}\n\nvoid CFX_SystemHandler::InvalidateRect(FX_HWND hWnd, FX_RECT rect)\n{\n\t//g_pFormFillApp->FFI_Invalidate();\n\tCPDFSDK_Annot* pSDKAnnot = (CPDFSDK_Annot*)hWnd;\n\tCPDF_Page* pPage = NULL;\n\tCPDFSDK_PageView* pPageView = NULL;\n\tpPageView = pSDKAnnot->GetPageView();\n\tpPage = pSDKAnnot->GetPDFPage();\n\tif(!pPage || !pPageView)\n\t\treturn;\n\tCPDF_Matrix page2device;\n\tpPageView->GetCurrentMatrix(page2device);\n\tCPDF_Matrix device2page;\n\tdevice2page.SetReverse(page2device);\n\tFX_FLOAT left, top, right,bottom;\n\tdevice2page.Transform((FX_FLOAT)rect.left, (FX_FLOAT)rect.top, left, top);\n\tdevice2page.Transform((FX_FLOAT)rect.right, (FX_FLOAT)rect.bottom, right, bottom);\n// \tm_pEnv->FFI_DeviceToPage(pPage, rect.left, rect.top, (double*)&left, (double*)&top);\n// \tm_pEnv->FFI_DeviceToPage(pPage, rect.right, rect.bottom, (double*)&right, (double*)&bottom);\n\tCPDF_Rect rcPDF(left, bottom, right, top);\n\trcPDF.Normalize();\n\n\tm_pEnv->FFI_Invalidate(pPage, rcPDF.left, rcPDF.top, rcPDF.right, rcPDF.bottom);\n}\nvoid CFX_SystemHandler::OutputSelectedRect(void* pFormFiller, CPDF_Rect& rect)\n{\n\tCFFL_FormFiller* pFFL = (CFFL_FormFiller*)pFormFiller;\n\tif(pFFL)\n\t{\n\t\tCPDF_Point leftbottom = CPDF_Point(rect.left, rect.bottom);\n\t\tCPDF_Point righttop = CPDF_Point(rect.right, rect.top);\n\t\tCPDF_Point ptA = pFFL->PWLtoFFL(leftbottom);\n\t\tCPDF_Point ptB = pFFL->PWLtoFFL(righttop);\t\n\n\n\t\tCPDFSDK_Annot* pAnnot  = pFFL->GetSDKAnnot();\n\t\tASSERT(pAnnot);\n\t\tCPDF_Page* pPage = pAnnot->GetPDFPage();\n\t\tASSERT(pPage);\n\t\tm_pEnv->FFI_OutputSelectedRect(pPage, ptA.x, ptB.y, ptB.x, ptA.y);\n\t}\n\t\n}\n\nFX_BOOL CFX_SystemHandler::IsSelectionImplemented()\n{\n\tif(m_pEnv)\n\t{\n\t\tFPDF_FORMFILLINFO* pInfo = m_pEnv->GetFormFillInfo();\n\t\tif(pInfo && pInfo->FFI_OutputSelectedRect)\n\t\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}\n\nCFX_ByteString CFX_SystemHandler::GetNativeTrueTypeFont(FX_INT32 nCharset)\n{\n\treturn \"\";\n}\n\nFX_BOOL\tCFX_SystemHandler::FindNativeTrueTypeFont(FX_INT32 nCharset, CFX_ByteString sFontFaceName) \n{\n\tCFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr();\n//\tFXFT_Face nFace = pFontMgr->FindSubstFont(sFontFaceName,TRUE,0,0,0,0,NULL);\n//\tFXFT_Face nFace  = pFontMgr->m_pBuiltinMapper->FindSubstFont(sFontFaceName,TRUE,0,0,0,0,NULL);\n\n\tif(pFontMgr)\n\t{\n\t\tCFX_FontMapper*\tpFontMapper = pFontMgr->m_pBuiltinMapper;\n\t\tif(pFontMapper)\n\t\t{\t\n\t\t\tint nSize = pFontMapper->m_InstalledTTFonts.GetSize();\n\t\t\tif(nSize ==0)\n\t\t\t{\n\t\t\t\tpFontMapper->LoadInstalledFonts();\n\t\t\t\tnSize = pFontMapper->m_InstalledTTFonts.GetSize();\n\t\t\t}\n\t\t\t\n\t\t\tfor(int i=0; i<nSize; i++)\n\t\t\t{\n\t\t\t\tif(pFontMapper->m_InstalledTTFonts[i].Compare(sFontFaceName))\n\t\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t}\n\n\t}\n\n\treturn FALSE;\n// \tpFontMgr->m_FaceMap.Lookup(sFontFaceName,pFont);\n// \treturn (pFont!=NULL);\n}\n\nstatic int CharSet2CP(int charset)\n{\n\tif(charset == 128)\n\t\treturn 932;\n\telse if(charset == 134)\n\t\treturn 936;\n\telse if(charset == 129)\n\t\treturn 949;\n\telse if(charset == 136)\n\t\treturn 950;\n\treturn 0;\n}\nCPDF_Font* CFX_SystemHandler::AddNativeTrueTypeFontToPDF(CPDF_Document* pDoc, CFX_ByteString sFontFaceName, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t FX_BYTE nCharset) \n{\n\tif(pDoc)\n\t{\n\t\tCFX_Font* pFXFont = new CFX_Font();\n\t\tpFXFont->LoadSubst(sFontFaceName,TRUE,0,0,0,CharSet2CP(nCharset),FALSE);\n\t\tCPDF_Font* pFont = pDoc->AddFont(pFXFont,nCharset,FALSE);\n\t\tdelete pFXFont;\n\t\treturn pFont;\n\t}\n\n\treturn NULL;\n}\n\n\nFX_INT32 CFX_SystemHandler::SetTimer(FX_INT32 uElapse, TimerCallback lpTimerFunc)\n{\n\treturn m_pEnv->FFI_SetTimer(uElapse, lpTimerFunc);\n}\nvoid CFX_SystemHandler::KillTimer(FX_INT32 nID)\n{\n\tm_pEnv->FFI_KillTimer(nID);\n}\n\nFX_SYSTEMTIME CFX_SystemHandler::GetLocalTime()\n{\n\treturn m_pEnv->FFI_GetLocalTime();\n}\n\n\n/*\nCJS_RuntimeFactory* GetJSRuntimeFactory()\n{\n\tstatic CJS_RuntimeFactory s_JSRuntimeFactory;\n\treturn &s_JSRuntimeFactory;\n}\n*/\n\nCPDFDoc_Environment::CPDFDoc_Environment(CPDF_Document * pDoc):m_pInfo(NULL),m_pIFormFiller(NULL),\n\t\t\t\t\t\t\t\tm_pAnnotHandlerMgr(NULL),m_pActionHandler(NULL),//m_pJSRuntime(NULL),\n\t\t\t\t\t\t\t\tm_pSDKDoc(NULL), m_pPDFDoc(pDoc)\n{\n\n\tm_pSysHandler = NULL;\n\tm_pSysHandler = new CFX_SystemHandler(this);\n\n\t\n    /*\n\tm_pJSRuntimeFactory = NULL;\n\tm_pJSRuntimeFactory = GetJSRuntimeFactory();\n\tm_pJSRuntimeFactory->AddRef();\n    */\n}\n\nCPDFDoc_Environment::~CPDFDoc_Environment()\n{\n\n\tif ( m_pIFormFiller )\n\t{\n\t\tdelete m_pIFormFiller;\n\t\tm_pIFormFiller = NULL;\n\t}\n    /*\n\tif(m_pJSRuntime && m_pJSRuntimeFactory)\n\t\tm_pJSRuntimeFactory->DeleteJSRuntime(m_pJSRuntime);\n\tm_pJSRuntimeFactory->Release();\n    */\n\n\tif(m_pSysHandler)\n\t{\n\t\tdelete m_pSysHandler;\n\t\tm_pSysHandler = NULL;\n\t}\n\n\tif(m_pAnnotHandlerMgr)\n\t{\n\t\tdelete m_pAnnotHandlerMgr;\n\t\tm_pAnnotHandlerMgr = NULL;\n\t}\n\tif(m_pActionHandler)\n\t{\n\t\tdelete m_pActionHandler;\n\t\tm_pActionHandler = NULL;\n\t}\n\n\n}\n\n\n/*\nIFXJS_Runtime* CPDFDoc_Environment::GetJSRuntime()\n{\n\tif(!IsJSInitiated())\n\t\treturn NULL;\n\tassert(m_pJSRuntimeFactory);\n\tif(!m_pJSRuntime)\n\t\tm_pJSRuntime = m_pJSRuntimeFactory->NewJSRuntime(this);\n\treturn m_pJSRuntime;\n}\n*/\n\nCPDFSDK_AnnotHandlerMgr* CPDFDoc_Environment::GetAnnotHandlerMgr()\n{\n\tif(!m_pAnnotHandlerMgr)\n\t\tm_pAnnotHandlerMgr = new CPDFSDK_AnnotHandlerMgr(this);\n\treturn m_pAnnotHandlerMgr;\n}\n\nCPDFSDK_ActionHandler* CPDFDoc_Environment::GetActionHander()\n{\n\tif(!m_pActionHandler)\n\t\tm_pActionHandler = new CPDFSDK_ActionHandler(this);\n\treturn m_pActionHandler;\n}\n\nint CPDFDoc_Environment::RegAppHandle(FPDF_FORMFILLINFO* pFFinfo)\n{\n\tm_pInfo  = pFFinfo; \n\treturn TRUE;\n}\n\nCPDFSDK_Document* CPDFDoc_Environment::GetCurrentDoc()\n{\n\treturn m_pSDKDoc;\n}\n\nCFFL_IFormFiller* CPDFDoc_Environment::GetIFormFiller()\n{\n\tif(!m_pIFormFiller)\n\t\tm_pIFormFiller = new CFFL_IFormFiller(this);\n\treturn m_pIFormFiller;\n}\n\n/*\nFX_BOOL\tCPDFDoc_Environment::IsJSInitiated()\n{\n\tif(m_pInfo)\n\t{\n\t\tif(m_pInfo->m_pJsPlatform)\n\t\t\treturn TRUE;\n\t\telse\n\t\t\treturn FALSE;\n\t}\n\treturn FALSE;\n}\n*/\n\nCPDFSDK_Document::CPDFSDK_Document(CPDF_Document* pDoc,CPDFDoc_Environment* pEnv):m_pDoc(pDoc),\n\t\t\t\t\t\tm_pInterForm(NULL),m_pEnv(pEnv),m_pOccontent(NULL),m_bChangeMask(FALSE)\n{\n\tm_pFocusAnnot = NULL;\n}\n\nCPDFSDK_Document::~CPDFSDK_Document()\n{\n\tm_pageMap.RemoveAll();\n\tif(m_pInterForm)\n\t{\n\t\tm_pInterForm->Destroy();\n\t\tm_pInterForm = NULL;\n\t}\n\tif(m_pOccontent)\n\t{\n\t\tdelete m_pOccontent;\n\t\tm_pOccontent = NULL;\n\t}\n}\n\nvoid CPDFSDK_Document::InitPageView()\n{\n\tint nCount = m_pDoc->GetPageCount();\n\tfor(int i=0; i<nCount; i++)\n\t{\n\t// To do\n//\t\tCPDF_Dictionary* pDic = m_pDoc->GetPage(i);\n//\t\tm_pageMap.SetAt(pDic, pPageView);\n\t}\n}\n\nvoid CPDFSDK_Document::AddPageView(CPDF_Page* pPDFPage, CPDFSDK_PageView* pPageView)\n{\n\tm_pageMap.SetAt(pPDFPage, pPageView);\n}\n\nCPDFSDK_PageView* CPDFSDK_Document::GetPageView(CPDF_Page* pPDFPage, FX_BOOL ReNew)\n{\n\tCPDFSDK_PageView* pPageView = (CPDFSDK_PageView*)m_pageMap.GetValueAt(pPDFPage);\n\tif(pPageView != NULL)\n\t\treturn pPageView;\n\tif(ReNew)\n\t{\n\t\tpPageView = new CPDFSDK_PageView(this,pPDFPage);\n\t\tm_pageMap.SetAt(pPDFPage, pPageView);\n\t\t//Delay to load all the annotations, to avoid endless loop.\n\t\tpPageView->LoadFXAnnots();\n\t}\n\treturn pPageView;\n\n}\n\nCPDFSDK_PageView* CPDFSDK_Document::GetCurrentView()\n{\n\tCPDF_Page * pPage = (CPDF_Page *)m_pEnv->FFI_GetCurrentPage(m_pDoc);\n\tif(pPage)\n\t\treturn this->GetPageView(pPage, TRUE);\n\treturn NULL;\n}\n\nCPDFSDK_PageView* CPDFSDK_Document::GetPageView(int nIndex)\n{\n\tCPDFSDK_PageView * pTempPageView = NULL;\n\tCPDF_Page * pTempPage = (CPDF_Page*)m_pEnv->FFI_GetPage(m_pDoc,nIndex);\n\tif(!pTempPage)\n\t\treturn NULL;\n\n\tm_pageMap.Lookup(pTempPage, pTempPageView);\n\t\n\tASSERT(pTempPageView != NULL);\n\t\n\treturn pTempPageView;\n}\n\n/*\nvoid CPDFSDK_Document:: ProcJavascriptFun()\n{\n\tCPDF_Document* pPDFDoc = this->GetDocument();\n\tCPDF_DocJSActions docJS(pPDFDoc);\n\tint iCount = docJS.CountJSActions();\n\tif (iCount < 1) return;\n\tfor (int i = 0; i < iCount; i ++)\n\t{\n\t\tCFX_ByteString csJSName;\n\t\tCPDF_Action jsAction = docJS.GetJSAction(i, csJSName);\n\t\tif(m_pEnv->GetActionHander())\n\t\t\tm_pEnv->GetActionHander()->DoAction_JavaScript(jsAction,CFX_WideString::FromLocal(csJSName),this);\n\t}\n\t\n}\n*/\n\nFX_BOOL CPDFSDK_Document::ProcOpenAction()\n{\n\tif(!m_pDoc) return FALSE;\n\t\n\tCPDF_Dictionary* pRoot = m_pDoc->GetRoot();\t\n\tif (!pRoot)\treturn FALSE;\n\tCPDF_Object* pOpenAction = pRoot->GetDict(\"OpenAction\");//\n\tif(!pOpenAction) pOpenAction = pRoot->GetArray(\"OpenAction\");//\n\tif(!pOpenAction) return FALSE;\n\t\n\tif(pOpenAction->GetType()==PDFOBJ_ARRAY)\n\t{\t\n\t}\n\telse if(pOpenAction->GetType()==PDFOBJ_DICTIONARY)\n\t{\t\n\t\tCPDF_Dictionary * pDict=(CPDF_Dictionary*)pOpenAction;\t\n\t\tCPDF_Action Action = pDict;\n\t\t\n\t\tif(m_pEnv->GetActionHander())\n\t\t\tm_pEnv->GetActionHander()->DoAction_DocOpen(Action,this);\t\t\n\t}\t\n\telse\n\t{\n\t\treturn FALSE;\t\t\t\n\t}\t\n\treturn TRUE;\n}\n\nCPDF_OCContext*\tCPDFSDK_Document::GetOCContext()\n{\n\tif(!m_pOccontent)\n\t\tm_pOccontent = new CPDF_OCContext(m_pDoc);\n\treturn m_pOccontent;\n}\n\nvoid CPDFSDK_Document::ReMovePageView(CPDF_Page* pPDFPage)\n{\n\tCPDFSDK_PageView* pPageView = (CPDFSDK_PageView*)m_pageMap.GetValueAt(pPDFPage);\n\tif(pPageView)\n\t{\n\t\tdelete pPageView;\n\t\tm_pageMap.RemoveKey(pPDFPage);\n\t}\n}\n\nCPDF_Page * CPDFSDK_Document::GetPage(int nIndex)\n{\n\tCPDF_Page * pTempPage = (CPDF_Page*)m_pEnv->FFI_GetPage(m_pDoc,nIndex);\n\tif(!pTempPage)\n\t\treturn NULL;\n\treturn pTempPage;\n}\n\nCPDFSDK_InterForm* CPDFSDK_Document::GetInterForm()\n{\n\tif(!m_pInterForm)\n\t\tm_pInterForm = new CPDFSDK_InterForm(this);\n\treturn m_pInterForm;\n}\n\nvoid CPDFSDK_Document::UpdateAllViews(CPDFSDK_PageView* pSender, CPDFSDK_Annot* pAnnot)\n{\n\t\n\tFX_POSITION pos = m_pageMap.GetStartPosition();\n\tCPDF_Page * pPage = NULL;\n\tCPDFSDK_PageView * pPageView = NULL;\n\twhile(pos)\n\t{\n\t\tm_pageMap.GetNextAssoc(pos, pPage, pPageView);\n\n\t\tif(pPageView != pSender)\n\t\t{\n\t\t\tpPageView->UpdateView(pAnnot);\n\t\t}\n\t}\n}\n\nCPDFSDK_Annot* CPDFSDK_Document::GetFocusAnnot()\n{\n\treturn this->m_pFocusAnnot;\t\n}\n\nFX_BOOL CPDFSDK_Document::SetFocusAnnot(CPDFSDK_Annot* pAnnot,FX_UINT nFlag)\n{\n\n\tif(m_pFocusAnnot==pAnnot) return TRUE;\n\t\n\tif(m_pFocusAnnot)\n\t{\n\t\tif(!this->KillFocusAnnot(nFlag) ) return FALSE;\t\n\t}\n\tCPDFSDK_PageView* pPageView = pAnnot->GetPageView();\n\tif(pAnnot && pPageView->IsValid())\n\t{\n\t\tCPDFSDK_AnnotHandlerMgr *pAnnotHandler=m_pEnv->GetAnnotHandlerMgr();\n\n\t\tif(pAnnotHandler&&!m_pFocusAnnot)\n\t\t{\n\t\t\tif (!pAnnotHandler->Annot_OnSetFocus(pAnnot,nFlag))\n\t\t\t\treturn FALSE;\n\t\t\tif(!m_pFocusAnnot)\n\t\t\t{\n\t\t\t\tthis->m_pFocusAnnot=pAnnot;\n\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t}\t\t\t\n\t}\n\treturn FALSE;\n}\n\nFX_BOOL CPDFSDK_Document::KillFocusAnnot(FX_UINT nFlag)\n{\n\tif(m_pFocusAnnot)\n\t{\n\t\tCPDFSDK_AnnotHandlerMgr *pAnnotHandler=m_pEnv->GetAnnotHandlerMgr();\n\t\tif(pAnnotHandler)\n\t\t{\n\t\t\tCPDFSDK_Annot* pFocusAnnot = m_pFocusAnnot;\n\t\t\tm_pFocusAnnot = NULL;\n\t\t\tif(pAnnotHandler->Annot_OnKillFocus(pFocusAnnot, nFlag))\n\t\t\t{\n\t\t\t\t\n\t\t\t\tif(pFocusAnnot->GetType() == FX_BSTRC(\"Widget\"))\n\t\t\t\t{\n\t\t\t\t\tCPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pFocusAnnot;\n\t\t\t\t\tint nFieldType = pWidget->GetFieldType();\n\t\t\t\t\tif(FIELDTYPE_TEXTFIELD == nFieldType || FIELDTYPE_COMBOBOX == nFieldType)\n\t\t\t\t\t\tm_pEnv->FFI_OnSetFieldInputFocus(NULL, NULL, 0, FALSE);\n\t\t\t\t}\n\n\t\t\t\tif(!m_pFocusAnnot)\n\t\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_pFocusAnnot = pFocusAnnot;\n\t\t\t}\n\t\t}\n\t}\n\treturn FALSE;\n}\n\nFX_BOOL\tCPDFSDK_Document::DeletePages(int nStart, int  nCount)\n{\n\tif ( nStart < 0 || nStart >= GetPageCount() || nCount <= 0 )\n\t{\n\t\treturn FALSE;\n\t}\n\n\tCPDF_Page * pTempPage = NULL;\n\tfor ( int i = nCount-1; i >= 0; i-- )\n\t{\n\t\tpTempPage = GetPage(nStart+i);\n\t\tif ( pTempPage != NULL )\n\t\t{\n\t\t\tReMovePageView(pTempPage);\n\t\t}\n\t}\n\treturn TRUE;\n}\n\nvoid CPDFSDK_Document::OnCloseDocument()\n{\n\tKillFocusAnnot();\n}\n\nFX_BOOL CPDFSDK_Document::GetPermissions(int nFlag)\n{\n\tFX_DWORD dwPermissions = m_pDoc->GetUserPermissions();\n\treturn dwPermissions&nFlag;\n}\n\n/*\nIFXJS_Runtime * CPDFSDK_Document::GetJsRuntime()\n{\n\tASSERT(m_pEnv!=NULL);\n\treturn m_pEnv->GetJSRuntime();\n}\n*/\n\nCFX_WideString\tCPDFSDK_Document::GetPath() \n{\n\tASSERT(m_pEnv != NULL);\n\treturn m_pEnv->JS_docGetFilePath();\n}\n\n\nCPDFSDK_PageView::CPDFSDK_PageView(CPDFSDK_Document* pSDKDoc,CPDF_Page* page):m_pSDKDoc(pSDKDoc),m_page(page)\n{\n\tCPDFSDK_InterForm* pInterForm = pSDKDoc->GetInterForm();\n\tif(pInterForm)\n\t{\n\t\tCPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();\n\t\tpPDFInterForm->FixPageFields(page);\n\t}\n\n\tm_fxAnnotArray.RemoveAll();\n\n\tm_bEnterWidget = FALSE;\n\tm_bExitWidget = FALSE;\n\tm_bOnWidget = FALSE;\n\tm_CaptureWidget = NULL;\n\tm_bValid = FALSE;\n}\n\nCPDFSDK_PageView::~CPDFSDK_PageView()\n{\n\tCPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();\t\n\tint nAnnotCount = m_fxAnnotArray.GetSize();\n\tfor (int i=0; i<nAnnotCount; i++)\n\t{\n\t\tCPDFSDK_Annot* pAnnot = (CPDFSDK_Annot*)m_fxAnnotArray.GetAt(i);\n\t\t//if there is a focused annot on the page, we should kill the focus first.\n\t\tif(pAnnot == m_pSDKDoc->GetFocusAnnot())\n\t\t\tKillFocusAnnot();\n\t\tCPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();\n\t\tASSERT(pAnnotHandlerMgr);\n\t\tpAnnotHandlerMgr->ReleaseAnnot(pAnnot);\n\t}\n\tm_fxAnnotArray.RemoveAll();\n\tif(m_pAnnotList)\n\t{\n\t\tdelete m_pAnnotList;\n\t\tm_pAnnotList = NULL;\n\t}\n}\n\nvoid CPDFSDK_PageView::PageView_OnDraw(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,CPDF_RenderOptions* pOptions)\n{\n\tm_curMatrix = *pUser2Device;\n\t\n\t//\tm_pAnnotList->DisplayAnnots(m_page, pDevice, pUser2Device, FALSE, pOptions);\n\tCPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();\n\tCPDFSDK_AnnotIterator annotIterator(this, TRUE);\n\tCPDFSDK_Annot * pSDKAnnot=NULL;\n\tint index=-1;\n\twhile((pSDKAnnot = annotIterator.Next(index)))\n\t{\n\t\tCPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();\n\t\tASSERT(pAnnotHandlerMgr);\n\t\tpAnnotHandlerMgr->Annot_OnDraw(this, pSDKAnnot, pDevice, pUser2Device, 0);\n\t}\n\n}\n\nCPDF_Annot* CPDFSDK_PageView::GetPDFAnnotAtPoint(FX_FLOAT pageX, FX_FLOAT pageY)\n{\n\t\n\tint nCount = m_pAnnotList->Count();\n\tfor(int i = 0 ; i<nCount; i++)\n\t{\n\t\tCPDF_Annot* pAnnot = m_pAnnotList->GetAt(i);\n\t\tCFX_FloatRect annotRect;\n\t\tpAnnot->GetRect(annotRect);\n\t\tif(annotRect.Contains(pageX, pageY))\n\t\t\treturn pAnnot;\n\t}\n\treturn NULL;\n}\n\nCPDF_Annot* CPDFSDK_PageView::GetPDFWidgetAtPoint(FX_FLOAT pageX, FX_FLOAT pageY)\n{\n\t\n\tint nCount = m_pAnnotList->Count();\n\tfor(int i = 0 ; i<nCount; i++)\n\t{\n\t\tCPDF_Annot* pAnnot = m_pAnnotList->GetAt(i);\n\t\tif(pAnnot->GetSubType() == \"Widget\")\n\t\t{\n\t\t\tCFX_FloatRect annotRect;\n\t\t\tpAnnot->GetRect(annotRect);\n\t\t\tif(annotRect.Contains(pageX, pageY))\n\t\t\t\treturn pAnnot;\n\t\t}\n\t}\n\treturn NULL;\n}\n\nCPDFSDK_Annot* CPDFSDK_PageView::GetFXAnnotAtPoint(FX_FLOAT pageX, FX_FLOAT pageY)\n{\n\n\tCPDFSDK_AnnotIterator annotIterator(this, FALSE);\n\tCPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();\n\tCPDFSDK_AnnotHandlerMgr* pAnnotMgr = pEnv->GetAnnotHandlerMgr();\n\tCPDFSDK_Annot* pSDKAnnot = NULL;\n\tint index = -1;\n\twhile((pSDKAnnot = annotIterator.Next(index)))\n\t{\n\t\tCPDF_Rect rc = pAnnotMgr->Annot_OnGetViewBBox(this, pSDKAnnot);\n\t\tif(rc.Contains(pageX, pageY))\n\t\t\treturn pSDKAnnot;\n\t}\n\n\treturn NULL;\n}\n\nCPDFSDK_Annot* CPDFSDK_PageView::GetFXWidgetAtPoint(FX_FLOAT pageX, FX_FLOAT pageY)\n{\n\n\tCPDFSDK_AnnotIterator annotIterator(this, FALSE);\n\tCPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();\n\tCPDFSDK_AnnotHandlerMgr* pAnnotMgr = pEnv->GetAnnotHandlerMgr();\n\tCPDFSDK_Annot* pSDKAnnot = NULL;\n\tint index = -1;\n\twhile((pSDKAnnot = annotIterator.Next(index)))\n\t{\n\t\tif(pSDKAnnot->GetType() == \"Widget\")\n\t\t{\t\n\t\t\tpAnnotMgr->Annot_OnGetViewBBox(this, pSDKAnnot);\n\t\t\tCPDF_Point point(pageX, pageY);\n\t\t\tif (pAnnotMgr->Annot_OnHitTest(this, pSDKAnnot, point))\n//\t\t\tif(rc.Contains(pageX, pageY))\n\t\t\t\treturn pSDKAnnot;\n\t\t}\n\t}\n\t\n\treturn NULL;\n}\n\n\nFX_BOOL CPDFSDK_PageView::Annot_HasAppearance(CPDF_Annot* pAnnot)\n{\n\tCPDF_Dictionary* pAnnotDic = pAnnot->m_pAnnotDict;\n\tif(pAnnotDic)\n\t\treturn\tpAnnotDic->KeyExist(\"AS\");\n\treturn FALSE;\n}\n\nCPDFSDK_Annot*\tCPDFSDK_PageView::AddAnnot(CPDF_Annot * pPDFAnnot)\n{\n\tCPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();\n\tASSERT(pEnv);\n\tCPDFSDK_AnnotHandlerMgr * pAnnotHandler= pEnv->GetAnnotHandlerMgr();\t\n\t\n\tCPDFSDK_Annot* pSDKAnnot =NULL;\n\t\n\tif(pAnnotHandler)\n\t{\n\t\tpSDKAnnot = pAnnotHandler->NewAnnot(pPDFAnnot, this);\n\t}\n\tif(!pSDKAnnot)\t \n\t\treturn NULL;\n\n\tm_fxAnnotArray.Add(pSDKAnnot);\t\n\t\t\n\tif(pAnnotHandler)\n\t{\t \t\t \t \n\t\tpAnnotHandler->Annot_OnCreate(pSDKAnnot);\n\t\t\n\t}\n\n\t return pSDKAnnot;\n}\n\nCPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(CPDF_Dictionary * pDict)\n{\n\tif(pDict)  \n\t\treturn this->AddAnnot(pDict->GetString(\"Subtype\"),pDict);\n\t return NULL;\n}\n\nCPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(FX_LPCSTR lpSubType,CPDF_Dictionary * pDict)\n{\n\treturn NULL;\n}\n\nFX_BOOL  CPDFSDK_PageView::DeleteAnnot(CPDFSDK_Annot* pAnnot)\n{\n\treturn FALSE;\n}\n\nCPDF_Document* CPDFSDK_PageView::GetPDFDocument()\n{\n\tif(m_page)\n\t{\n\t\treturn m_page->m_pDocument;\n\t}\n\treturn NULL;\n}\n\nint\tCPDFSDK_PageView::CountAnnots()\n{\n\treturn m_pAnnotList->Count();\n}\n\nCPDFSDK_Annot*\tCPDFSDK_PageView::GetAnnot(int nIndex)\n{\n\tint nCount = m_fxAnnotArray.GetSize();\n\tif ( nIndex < 0 || nIndex >= nCount )\n\t{\n\t\treturn NULL;\n\t}\n\n\treturn (CPDFSDK_Annot*)m_fxAnnotArray.GetAt(nIndex);\n}\n\nCPDFSDK_Annot* CPDFSDK_PageView::GetAnnotByDict(CPDF_Dictionary * pDict)\n{\n\tint nCount = m_fxAnnotArray.GetSize();\n \tfor(int i=0; i<nCount; i++)\n \t{\n\t\tCPDFSDK_Annot* pAnnot = (CPDFSDK_Annot*)m_fxAnnotArray.GetAt(i);\n \t\tif(pDict==pAnnot->GetPDFAnnot()->m_pAnnotDict) \n \t\t\treturn pAnnot;\n \t}\n\treturn NULL;\n}\n\nFX_BOOL CPDFSDK_PageView::OnLButtonDown(const CPDF_Point & point, FX_UINT nFlag)\n{\n\tCPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();\n\tASSERT(pEnv);\n\tCPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);\n\tif(!pFXAnnot)\n\t{\n\t\tKillFocusAnnot(nFlag);\n\t}\n\telse\n\t{\n\t\tCPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();\n\t\tASSERT(pAnnotHandlerMgr);\n\n\t\tFX_BOOL bRet = pAnnotHandlerMgr->Annot_OnLButtonDown(this, pFXAnnot, nFlag,point);\n \t\tif(bRet)\n \t\t{\n \t\t\tSetFocusAnnot(pFXAnnot);\n \t\t}\n\t\treturn bRet;\n\t}\n\treturn FALSE;\n}\n\n\nFX_BOOL CPDFSDK_PageView::OnLButtonUp(const CPDF_Point & point, FX_UINT nFlag)\n{\n\tCPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();\n\tASSERT(pEnv);\n\tCPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();\n\tASSERT(pAnnotHandlerMgr);\n\tCPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);\n\tCPDFSDK_Annot* pFocusAnnot = GetFocusAnnot();\n\tFX_BOOL bRet  = FALSE;\n\tif(pFocusAnnot && pFocusAnnot != pFXAnnot)\n\t{\n\t\t//Last focus Annot gets a chance to handle the event.\n\t\tbRet = pAnnotHandlerMgr->Annot_OnLButtonUp(this, pFocusAnnot, nFlag,point);\n\t}\n\tif(pFXAnnot && !bRet)\n\t{\n\t\tbRet = pAnnotHandlerMgr->Annot_OnLButtonUp(this, pFXAnnot, nFlag,point);\n\t\treturn bRet;\n\t}\n\treturn bRet;\n}\n\nFX_BOOL CPDFSDK_PageView::OnMouseMove(const CPDF_Point & point, int nFlag)\n{\n\n\tCPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();\n\tCPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();\n\tASSERT(pAnnotHandlerMgr);\n\tif(CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y))\n\t{\n\t\tif(m_CaptureWidget && m_CaptureWidget != pFXAnnot)\n\t\t{\n\t\t\tm_bExitWidget = TRUE;\n\t\t\tm_bEnterWidget = FALSE;\n\t\t\tpAnnotHandlerMgr->Annot_OnMouseExit(this, m_CaptureWidget, nFlag);\n\t\t}\n\t\tm_CaptureWidget = (CPDFSDK_Widget*)pFXAnnot;\n\t\tm_bOnWidget = TRUE;\n\t\tif(!m_bEnterWidget)\n\t\t{\n\t\t\tm_bEnterWidget = TRUE;\n\t\t\tm_bExitWidget = FALSE;\n\t\t\tpAnnotHandlerMgr->Annot_OnMouseEnter(this, pFXAnnot,nFlag);\n\t\t}\n\t\tpAnnotHandlerMgr->Annot_OnMouseMove(this, pFXAnnot, nFlag, point);\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\tif(m_bOnWidget)\n\t\t{\t\n\t\t\tm_bOnWidget = FALSE;\n\t\t\tm_bExitWidget = TRUE;\n\t\t\tm_bEnterWidget = FALSE;\n\t\t\tif(m_CaptureWidget)\n\t\t\t{\n\t\t\t\tpAnnotHandlerMgr->Annot_OnMouseExit(this, m_CaptureWidget, nFlag);\n\t\t\t\tm_CaptureWidget = NULL;\n\t\t\t}\n\t\t}\n\t\treturn FALSE;\n\t}\n\t\n\treturn FALSE;;\n}\n\nFX_BOOL CPDFSDK_PageView::OnMouseWheel(double deltaX, double deltaY,const CPDF_Point& point, int nFlag)\n{\n\tif(CPDFSDK_Annot* pAnnot = GetFXWidgetAtPoint(point.x, point.y))\n\t{\n\t\tCPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();\n\t\tCPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();\n\t\tASSERT(pAnnotHandlerMgr);\n\t\treturn pAnnotHandlerMgr->Annot_OnMouseWheel(this, pAnnot, nFlag, (int)deltaY, point);\n\t}\n\treturn FALSE;\n\n}\n\nFX_BOOL CPDFSDK_PageView::OnChar(int nChar, FX_UINT nFlag)\n{\n\tif(CPDFSDK_Annot* pAnnot = GetFocusAnnot())\n\t{\n\t\tCPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();\n\t\tCPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();\n\t\tASSERT(pAnnotHandlerMgr);\n\t\treturn pAnnotHandlerMgr->Annot_OnChar(pAnnot, nChar, nFlag);\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL CPDFSDK_PageView::OnKeyDown(int nKeyCode, int nFlag)\n{\n\tif(CPDFSDK_Annot* pAnnot = GetFocusAnnot())\n\t{\n\t\tCPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();\n\t\tCPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();\n\t\tASSERT(pAnnotHandlerMgr);\n\t\treturn pAnnotHandlerMgr->Annot_OnKeyDown(pAnnot, nKeyCode, nFlag);\n\t}\n\treturn FALSE;\n}\n\nFX_BOOL CPDFSDK_PageView::OnKeyUp(int nKeyCode, int nFlag)\n{\n// \tif(CPDFSDK_Annot* pAnnot = GetFocusAnnot())\n// \t{\n// \t\tCFFL_IFormFiller* pIFormFiller = g_pFormFillApp->GetIFormFiller();\n// \t\treturn pIFormFiller->OnKeyUp(pAnnot, nKeyCode, nFlag);\n// \t}\n\treturn FALSE;\n}\n\nextern void CheckUnSupportAnnot(CPDF_Document * pDoc, CPDF_Annot* pPDFAnnot);\n\nvoid CPDFSDK_PageView::LoadFXAnnots()\n{\n\tCPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();\n\n\tFX_BOOL enableAPUpdate = CPDF_InterForm::UpdatingAPEnabled();\n\t//Disable the default AP construction.\n\tCPDF_InterForm::EnableUpdateAP(FALSE);\n\tm_pAnnotList = new CPDF_AnnotList(m_page);\n\tCPDF_InterForm::EnableUpdateAP(enableAPUpdate);\n\tint nCount = m_pAnnotList->Count();\n\tfor(int i=0; i<nCount; i++)\n\t{\n\t\tCPDF_Annot* pPDFAnnot = m_pAnnotList->GetAt(i);\n\t\tCPDF_Document * pDoc = this->GetPDFDocument();\n\t\t\n\t\tCheckUnSupportAnnot(pDoc, pPDFAnnot);\n\n\t\tCPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();\n\t\tASSERT(pAnnotHandlerMgr != NULL);\n\t\tif(pAnnotHandlerMgr)\n\t\t{\n\t\t\tCPDFSDK_Annot* pAnnot = pAnnotHandlerMgr->NewAnnot(pPDFAnnot, this);\n\t\t\tif(!pAnnot)\n\t\t\t\tcontinue;\n\t\t\tm_fxAnnotArray.Add(pAnnot);\n\n\t\t\tpAnnotHandlerMgr->Annot_OnLoad(pAnnot);\n\t\t}\n\n\t}\n}\n\nvoid\tCPDFSDK_PageView::UpdateRects(CFX_RectArray& rects)\n{\n\tfor(int i=0; i<rects.GetSize(); i++)\n\t{\n\t\tCPDF_Rect rc = rects.GetAt(i);\n\t\tCPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();\n\t\tpEnv->FFI_Invalidate(m_page, rc.left, rc.top, rc.right, rc.bottom);\n\t}\n}\n\nvoid CPDFSDK_PageView::UpdateView(CPDFSDK_Annot* pAnnot)\n{\n\tCPDF_Rect rcWindow;\n\n \tCPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();\t\n// \tCPDFSDK_AnnotHandlerMgr* pAnnotHandler = pEnv->GetAnnotHandlerMgr();\n\t\n\trcWindow = pAnnot->GetRect();//pAnnotHandler->Annot_OnGetViewBBox(this,pAnnot);\t\n\tpEnv->FFI_Invalidate(m_page, rcWindow.left, rcWindow.top, rcWindow.right, rcWindow.bottom);\n\n}\n\nint CPDFSDK_PageView::GetPageIndex()\n{\n\tif(m_page)\n\t{\n\t\tCPDF_Dictionary* pDic = m_page->m_pFormDict;\n\t\tCPDF_Document* pDoc = m_pSDKDoc->GetDocument();\n\t\tif(pDoc && pDic)\n\t\t{\n\t\t\treturn pDoc->GetPageIndex(pDic->GetObjNum());\n\t\t}\n\t}\n\treturn -1;\n}\n\nFX_BOOL\tCPDFSDK_PageView::IsValidAnnot(FX_LPVOID p)\n{\n\tif (p == NULL) return FALSE;\n\tint iCount = m_pAnnotList->Count();\n\tfor (int i = 0; i < iCount; i++)\n\t{\n\t\tif (m_pAnnotList->GetAt(i) == p)\n\t\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}\n\n\nCPDFSDK_Annot* CPDFSDK_PageView::GetFocusAnnot()\n{\n\tCPDFSDK_Annot* pFocusAnnot = m_pSDKDoc->GetFocusAnnot();\n\tif(!pFocusAnnot)\n\t\treturn NULL;\n\t\n\tfor(int i=0; i<m_fxAnnotArray.GetSize(); i++)\n\t{\n\t\tCPDFSDK_Annot* pAnnot = (CPDFSDK_Annot*)m_fxAnnotArray.GetAt(i);\n\t\tif(pAnnot == pFocusAnnot)\n\t\t\treturn pAnnot;\n\t}\n\treturn NULL;\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/fsdk_rendercontext.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../include/fsdk_rendercontext.h\"\n\nvoid CRenderContext::Clear()\n{\n\tm_pDevice = NULL;\n\tm_pContext = NULL;\n\tm_pRenderer = NULL;\n\tm_pAnnots = NULL;\n\tm_pOptions\t= NULL;\n#ifdef _WIN32_WCE\n\tm_pBitmap = NULL;\n\tm_hBitmap = NULL;\n#endif\n}\n\nCRenderContext::~CRenderContext()\n{\n\tif (m_pRenderer) delete m_pRenderer;\n\tif (m_pContext) delete m_pContext;\n\tif (m_pDevice) delete m_pDevice;\n\tif (m_pAnnots) delete m_pAnnots;\n\tif (m_pOptions->m_pOCContext) delete m_pOptions->m_pOCContext;\n\tif (m_pOptions) delete m_pOptions;\n#ifdef _WIN32_WCE\n\tif (m_pBitmap) delete m_pBitmap;\n\tif (m_hBitmap) DeleteObject(m_hBitmap);\n#endif\n}\n\nIFSDK_PAUSE_Adapter::IFSDK_PAUSE_Adapter(IFSDK_PAUSE* IPause )\n{\n\tm_IPause = IPause;\n}\n\nFX_BOOL IFSDK_PAUSE_Adapter::NeedToPauseNow()\n{\n\tif (m_IPause->NeedToPauseNow)\n\t{\n\t\treturn m_IPause->NeedToPauseNow(m_IPause);\n\t}else{\n\t\treturn FALSE;\n\t}\n}\n"
  },
  {
    "path": "fpdfsdk/src/fxedit/fxet_ap.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxedit/fxet_stub.h\"\n#include \"../../include/fxedit/fx_edit.h\"\n#include \"../../include/fxedit/fxet_edit.h\"\n\nCFX_ByteString GetPDFWordString(IFX_Edit_FontMap * pFontMap, FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord) \n{\n\tASSERT (pFontMap != NULL);\n\n\tCFX_ByteString sWord;\n\n\tif (CPDF_Font * pPDFFont = pFontMap->GetPDFFont(nFontIndex))\n\t{\n\t\tif (SubWord > 0)\n\t\t{\n\t\t\tWord = SubWord;\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tFX_DWORD dwCharCode = -1;\n\n\t\t\tif (pPDFFont->IsUnicodeCompatible())\n\t\t\t\tdwCharCode = pPDFFont->CharCodeFromUnicode(Word);\n\t\t\telse\n\t\t\t\tdwCharCode = pFontMap->CharCodeFromUnicode(nFontIndex, Word);\n\n\t\t\tif (dwCharCode > 0 )\n\t\t\t{\n\t\t\t\tpPDFFont->AppendChar(sWord, dwCharCode);\n\t\t\t\treturn sWord;\n\t\t\t}\n\t\t}\n\n\t\tpPDFFont->AppendChar(sWord, Word);\n\t}\n\n\treturn sWord;\n}\n\nstatic CFX_ByteString GetWordRenderString(const CFX_ByteString & strWords)\n{\n\tif (strWords.GetLength() > 0)\n\t\treturn PDF_EncodeString(strWords) + \" Tj\\n\";\n\n\treturn \"\";\n}\n\nstatic CFX_ByteString GetFontSetString(IFX_Edit_FontMap * pFontMap, FX_INT32 nFontIndex, FX_FLOAT fFontSize)\n{\n\tCFX_ByteTextBuf sRet;\n\n\tif (pFontMap)\n\t{\n\t\tCFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex);\n\n\t\tif (sFontAlias.GetLength() > 0 && fFontSize > 0 )\n\t\t\tsRet << \"/\" << sFontAlias << \" \" << fFontSize << \" Tf\\n\";\n\t}\n\n\treturn sRet.GetByteString();\n}\n\nCFX_ByteString IFX_Edit::GetEditAppearanceStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset, \n\t\t\t\t\t\t\t\t\t\t\t\t const CPVT_WordRange * pRange /* = NULL*/, FX_BOOL bContinuous/* = TRUE*/, FX_WORD SubWord/* = 0*/)\n{\n\tCFX_ByteTextBuf sEditStream, sWords;\n\n\tCPDF_Point ptOld(0.0f,0.0f),ptNew(0.0f,0.0f);\n\tFX_INT32 nCurFontIndex = -1;\n\n\tif (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())\n\t{\n\t\tif (pRange)\n\t\t\tpIterator->SetAt(pRange->BeginPos);\n\t\telse\n\t\t\tpIterator->SetAt(0);\n\n\t\tCPVT_WordPlace oldplace;\n\n\t\twhile (pIterator->NextWord())\n\t\t{\n\t\t\tCPVT_WordPlace place = pIterator->GetAt();\n\n\t\t\tif (pRange && place.WordCmp(pRange->EndPos) > 0) break;\n\n\t\t\tif (bContinuous)\t\t\t\n\t\t\t{\n\t\t\t\tif (place.LineCmp(oldplace) != 0)\n\t\t\t\t{\n\t\t\t\t\tif (sWords.GetSize() > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tsEditStream << GetWordRenderString(sWords.GetByteString());\n\t\t\t\t\t\tsWords.Clear();\n\t\t\t\t\t}\n\n\t\t\t\t\tCPVT_Word word;\n\t\t\t\t\tif (pIterator->GetWord(word))\n\t\t\t\t\t{\n\t\t\t\t\t\tptNew = CPDF_Point(word.ptWord.x + ptOffset.x, word.ptWord.y + ptOffset.y);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tCPVT_Line line;\n\t\t\t\t\t\tpIterator->GetLine(line);\n\t\t\t\t\t\tptNew = CPDF_Point(line.ptLine.x + ptOffset.x, line.ptLine.y + ptOffset.y);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (ptNew.x != ptOld.x || ptNew.y != ptOld.y)\n\t\t\t\t\t{\n\t\t\t\t\t\tsEditStream << ptNew.x - ptOld.x << \" \" << ptNew.y - ptOld.y << \" Td\\n\";\n\n\t\t\t\t\t\tptOld = ptNew;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tCPVT_Word word;\n\t\t\t\tif (pIterator->GetWord(word))\n\t\t\t\t{\t\n\t\t\t\t\tif (word.nFontIndex != nCurFontIndex)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (sWords.GetSize() > 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsEditStream << GetWordRenderString(sWords.GetByteString());\n\t\t\t\t\t\t\tsWords.Clear();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsEditStream << GetFontSetString(pEdit->GetFontMap(),word.nFontIndex,word.fFontSize);\n\t\t\t\t\t\tnCurFontIndex = word.nFontIndex;\n\t\t\t\t\t}\n\n\t\t\t\t\tsWords << GetPDFWordString(pEdit->GetFontMap(),nCurFontIndex,word.Word,SubWord);\n\t\t\t\t}\n\n\t\t\t\toldplace = place;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tCPVT_Word word;\n\t\t\t\tif (pIterator->GetWord(word))\n\t\t\t\t{\n\t\t\t\t\tptNew = CPDF_Point(word.ptWord.x + ptOffset.x, word.ptWord.y + ptOffset.y);\n\n\t\t\t\t\tif (ptNew.x != ptOld.x || ptNew.y != ptOld.y)\n\t\t\t\t\t{\n\t\t\t\t\t\tsEditStream << ptNew.x - ptOld.x << \" \" << ptNew.y - ptOld.y << \" Td\\n\";\n\t\t\t\t\t\tptOld = ptNew;\n\t\t\t\t\t}\t\n\n\t\t\t\t\tif (word.nFontIndex != nCurFontIndex)\n\t\t\t\t\t{\n\t\t\t\t\t\tsEditStream << GetFontSetString(pEdit->GetFontMap(),word.nFontIndex,word.fFontSize);\n\t\t\t\t\t\tnCurFontIndex = word.nFontIndex;\n\t\t\t\t\t}\n\n\t\t\t\t\tsEditStream << GetWordRenderString(GetPDFWordString(pEdit->GetFontMap(),nCurFontIndex,word.Word,SubWord));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (sWords.GetSize() > 0)\n\t\t{\n\t\t\tsEditStream << GetWordRenderString(sWords.GetByteString());\n\t\t\tsWords.Clear();\n\t\t}\n\t}\n\n\tCFX_ByteTextBuf sAppStream;\n\tif (sEditStream.GetSize() > 0)\n\t{\n\t\tFX_INT32 nHorzScale = pEdit->GetHorzScale();\n\t\tif (nHorzScale != 100)\n\t\t{\n\t\t\tsAppStream << nHorzScale << \" Tz\\n\";\n\t\t}\n\n\t\tFX_FLOAT fCharSpace = pEdit->GetCharSpace();\n\t\tif (!FX_EDIT_IsFloatZero(fCharSpace))\n\t\t{\n\t\t\tsAppStream << fCharSpace << \" Tc\\n\";\n\t\t}\n\n\t\tsAppStream << sEditStream;\n\t}\t\n\n\treturn sAppStream.GetByteString();\n}\n\nCFX_ByteString IFX_Edit::GetSelectAppearanceStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset, \n\t\t\t\t\t\t\tconst CPVT_WordRange * pRange /*= NULL*/)\n{\n\tCFX_ByteTextBuf sRet;\n\n\tif (pRange && pRange->IsExist())\n\t{\n\t\tif (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())\n\t\t{\n\t\t\tpIterator->SetAt(pRange->BeginPos);\n\t\t\t\n\t\t\twhile (pIterator->NextWord())\n\t\t\t{\n\t\t\t\tCPVT_WordPlace place = pIterator->GetAt();\n\n\t\t\t\tif (pRange && place.WordCmp(pRange->EndPos) > 0) break;\t\t\t\t\n\n\t\t\t\tCPVT_Word word;\n\t\t\t\tCPVT_Line line;\n\t\t\t\tif (pIterator->GetWord(word) && pIterator->GetLine(line))\n\t\t\t\t{\t\t\t\n\t\t\t\t\t//CPDF_Rect rcWordSel = CPDF_Rect(word.ptWord.x,line.ptLine.y + line.fLineDescent,\n\t\t\t\t\t//\t\tword.ptWord.x+word.fWidth,line.ptLine.y + line.fLineAscent);\n\n\t\t\t\t\tsRet << word.ptWord.x + ptOffset.x << \" \" << line.ptLine.y + line.fLineDescent\n\t\t\t\t\t\t<< \" \" << word.fWidth << \" \" << line.fLineAscent - line.fLineDescent << \" re\\nf\\n\";\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn sRet.GetByteString();\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/fxedit/fxet_edit.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxedit/fxet_stub.h\"\n#include \"../../include/fxedit/fxet_edit.h\"\n\n#define FX_EDIT_UNDO_MAXITEM\t\t\t\t10000\n\n/* ---------------------------- CFX_Edit_Iterator ---------------------------- */\n\nCFX_Edit_Iterator::CFX_Edit_Iterator(CFX_Edit * pEdit,IPDF_VariableText_Iterator * pVTIterator) : \n\tm_pEdit(pEdit),\n\tm_pVTIterator(pVTIterator)\n{\n}\n\nCFX_Edit_Iterator::~CFX_Edit_Iterator()\n{\n}\n\nFX_BOOL\tCFX_Edit_Iterator::NextWord()\n{\n\tASSERT(m_pVTIterator != NULL);\n\t\n\treturn m_pVTIterator->NextWord();\n}\n\nFX_BOOL CFX_Edit_Iterator::NextLine()\n{\n\tASSERT(m_pVTIterator != NULL);\n\n\treturn m_pVTIterator->NextLine();\n}\n\nFX_BOOL CFX_Edit_Iterator::NextSection()\n{\n\tASSERT(m_pVTIterator != NULL);\n\n\treturn m_pVTIterator->NextSection();\n}\n\nFX_BOOL\tCFX_Edit_Iterator::PrevWord()\n{\n\tASSERT(m_pVTIterator != NULL);\n\t\n\treturn m_pVTIterator->PrevWord();\n}\n\nFX_BOOL\tCFX_Edit_Iterator::PrevLine()\n{\n\tASSERT(m_pVTIterator != NULL);\n\n\treturn m_pVTIterator->PrevLine();\n}\n\nFX_BOOL\tCFX_Edit_Iterator::PrevSection()\n{\n\tASSERT(m_pVTIterator != NULL);\n\n\treturn m_pVTIterator->PrevSection();\n}\n\nFX_BOOL CFX_Edit_Iterator::GetWord(CPVT_Word & word) const\n{\n\tASSERT(m_pEdit != NULL);\n\tASSERT(m_pVTIterator != NULL);\n\n\tif (m_pVTIterator->GetWord(word))\n\t{\n\t\tword.ptWord = m_pEdit->VTToEdit(word.ptWord);\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL CFX_Edit_Iterator::GetLine(CPVT_Line & line) const\n{\n\tASSERT(m_pEdit != NULL);\n\tASSERT(m_pVTIterator != NULL);\n\n\tif (m_pVTIterator->GetLine(line))\n\t{\t\t\n\t\tline.ptLine = m_pEdit->VTToEdit(line.ptLine);\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL CFX_Edit_Iterator::GetSection(CPVT_Section & section) const\n{\n\tASSERT(m_pEdit != NULL);\n\tASSERT(m_pVTIterator != NULL);\n\n\tif (m_pVTIterator->GetSection(section))\n\t{\n\t\tsection.rcSection = m_pEdit->VTToEdit(section.rcSection);\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\nvoid CFX_Edit_Iterator::SetAt(FX_INT32 nWordIndex)\n{\n\tASSERT(m_pVTIterator != NULL);\n\n\tm_pVTIterator->SetAt(nWordIndex);\n}\n\nvoid CFX_Edit_Iterator::SetAt(const CPVT_WordPlace & place)\n{\n\tASSERT(m_pVTIterator != NULL);\n\n\tm_pVTIterator->SetAt(place);\n}\n\nconst CPVT_WordPlace & CFX_Edit_Iterator::GetAt() const\n{\n\tASSERT(m_pVTIterator != NULL);\n\n\treturn m_pVTIterator->GetAt();\n}\n\nIFX_Edit* CFX_Edit_Iterator::GetEdit() const\n{\n\treturn m_pEdit;\n}\n\n/* --------------------------- CFX_Edit_Provider ------------------------------- */\n\nCFX_Edit_Provider::CFX_Edit_Provider(IFX_Edit_FontMap * pFontMap) : m_pFontMap(pFontMap)\n{\n\tASSERT(m_pFontMap != NULL);\n}\n\nCFX_Edit_Provider::~CFX_Edit_Provider()\n{\n}\n\nIFX_Edit_FontMap* CFX_Edit_Provider::GetFontMap()\n{\n\treturn m_pFontMap;\n}\n\nFX_INT32 CFX_Edit_Provider::GetCharWidth(FX_INT32 nFontIndex, FX_WORD word, FX_INT32 nWordStyle)\n{\n\tif (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex))\n\t{\n\t\tFX_DWORD charcode = word;\n\n\t\tif (pPDFFont->IsUnicodeCompatible())\t\t\n\t\t\tcharcode = pPDFFont->CharCodeFromUnicode(word);\t\n\t\telse\n\t\t\tcharcode = m_pFontMap->CharCodeFromUnicode(nFontIndex, word);\n\n\t\tif (charcode != -1)\t\t\t\n\t\t\treturn pPDFFont->GetCharWidthF(charcode);\n\t}\n\n\treturn 0;\n}\n\nFX_INT32 CFX_Edit_Provider::GetTypeAscent(FX_INT32 nFontIndex)\n{\n\tif (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex))\n\t\treturn pPDFFont->GetTypeAscent();\n\n\treturn 0;\n}\n\nFX_INT32 CFX_Edit_Provider::GetTypeDescent(FX_INT32 nFontIndex)\n{\n\tif (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex))\n\t\treturn pPDFFont->GetTypeDescent();\n\n\treturn 0;\n}\n\nFX_INT32 CFX_Edit_Provider::GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex)\n{\n\treturn m_pFontMap->GetWordFontIndex(word,charset,nFontIndex);\n}\n\nFX_INT32 CFX_Edit_Provider::GetDefaultFontIndex()\n{\n\treturn 0;\n}\n\nFX_BOOL\tCFX_Edit_Provider::IsLatinWord(FX_WORD word)\n{\n\treturn FX_EDIT_ISLATINWORD(word);\n}\n\n/* --------------------------------- CFX_Edit_Refresh --------------------------------- */\n\nCFX_Edit_Refresh::CFX_Edit_Refresh()\n{\n}\n\nCFX_Edit_Refresh::~CFX_Edit_Refresh()\n{\n}\n\nvoid CFX_Edit_Refresh::BeginRefresh()\n{\n\tm_RefreshRects.Empty();\n\tm_OldLineRects = m_NewLineRects;\n}\n\nvoid CFX_Edit_Refresh::Push(const CPVT_WordRange & linerange,const CPDF_Rect & rect)\n{\n\tm_NewLineRects.Add(linerange,rect);\n}\n\nvoid CFX_Edit_Refresh::NoAnalyse()\n{\n\t{\n\t\tfor (FX_INT32 i = 0, sz = m_OldLineRects.GetSize(); i < sz; i++)\n\t\t\tif (CFX_Edit_LineRect * pOldRect = m_OldLineRects.GetAt(i))\n\t\t\t\tm_RefreshRects.Add(pOldRect->m_rcLine);\n\t}\n\n\t{\n\t\tfor (FX_INT32 i = 0, sz = m_NewLineRects.GetSize(); i < sz; i++)\n\t\t\tif (CFX_Edit_LineRect * pNewRect = m_NewLineRects.GetAt(i))\n\t\t\t\tm_RefreshRects.Add(pNewRect->m_rcLine);\n\t}\n}\n\nvoid CFX_Edit_Refresh::Analyse(FX_INT32 nAlignment)\n{\n\tFX_BOOL bLineTopChanged = FALSE;\n\tCPDF_Rect rcResult;\n\tFX_FLOAT fWidthDiff;\n\n\tFX_INT32 szMax = FX_EDIT_MAX(m_OldLineRects.GetSize(),m_NewLineRects.GetSize());\n\tFX_INT32 i = 0;\n\n\twhile (i < szMax)\n\t{\n\t\tCFX_Edit_LineRect * pOldRect = m_OldLineRects.GetAt(i);\n\t\tCFX_Edit_LineRect * pNewRect = m_NewLineRects.GetAt(i);\n\n\t\tif (pOldRect)\n\t\t{\n\t\t\tif (pNewRect)\n\t\t\t{\n\t\t\t\tif (bLineTopChanged)\n\t\t\t\t{\n\t\t\t\t\trcResult = pOldRect->m_rcLine;\n\t\t\t\t\trcResult.Union(pNewRect->m_rcLine);\n\t\t\t\t\tm_RefreshRects.Add(rcResult);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (*pNewRect != *pOldRect)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!pNewRect->IsSameTop(*pOldRect) || !pNewRect->IsSameHeight(*pOldRect))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbLineTopChanged = TRUE;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (nAlignment == 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (pNewRect->m_wrLine.BeginPos != pOldRect->m_wrLine.BeginPos)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\trcResult = pOldRect->m_rcLine;\n\t\t\t\t\t\t\t\trcResult.Union(pNewRect->m_rcLine);\n\t\t\t\t\t\t\t\tm_RefreshRects.Add(rcResult);\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (!pNewRect->IsSameLeft(*pOldRect)) \n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\trcResult = pOldRect->m_rcLine;\n\t\t\t\t\t\t\t\t\trcResult.Union(pNewRect->m_rcLine);\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tfWidthDiff = pNewRect->m_rcLine.Width() - pOldRect->m_rcLine.Width();\n\t\t\t\t\t\t\t\t\trcResult = pNewRect->m_rcLine;\n\t\t\t\t\t\t\t\t\tif (fWidthDiff > 0.0f)\n\t\t\t\t\t\t\t\t\t\trcResult.left = rcResult.right - fWidthDiff;\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\trcResult.left = rcResult.right;\n\t\t\t\t\t\t\t\t\t\trcResult.right += (-fWidthDiff);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tm_RefreshRects.Add(rcResult);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trcResult = pOldRect->m_rcLine;\n\t\t\t\t\t\t\trcResult.Union(pNewRect->m_rcLine);\n\t\t\t\t\t\t\tm_RefreshRects.Add(rcResult);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t//don't need to do anything\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_RefreshRects.Add(pOldRect->m_rcLine);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (pNewRect)\n\t\t\t{\n\t\t\t\tm_RefreshRects.Add(pNewRect->m_rcLine);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t//error\n\t\t\t}\n\t\t}\n\t\ti++;\n\t}\n}\n\nvoid CFX_Edit_Refresh::AddRefresh(const CPDF_Rect & rect)\n{\n\tm_RefreshRects.Add(rect);\n}\n\nconst CFX_Edit_RectArray * CFX_Edit_Refresh::GetRefreshRects() const\n{\n\treturn &m_RefreshRects;\n}\n\nvoid CFX_Edit_Refresh::EndRefresh()\n{\n\tm_RefreshRects.Empty();\n}\n\n/* ------------------------------------- CFX_Edit_Undo ------------------------------------- */\n\nCFX_Edit_Undo::CFX_Edit_Undo(FX_INT32 nBufsize) : m_nCurUndoPos(0),\n\tm_nBufSize(nBufsize),\n\tm_bModified(FALSE),\n\tm_bVirgin(TRUE),\n\tm_bWorking(FALSE)\n{\n}\n\nCFX_Edit_Undo::~CFX_Edit_Undo()\n{\n\tReset();\n}\n\nFX_BOOL CFX_Edit_Undo::CanUndo() const\n{\n\treturn m_nCurUndoPos > 0;\n}\n\nvoid CFX_Edit_Undo::Undo()\n{\n\tm_bWorking = TRUE;\n\n\tif (m_nCurUndoPos > 0)\n\t{\n\t\tIFX_Edit_UndoItem * pItem = m_UndoItemStack.GetAt(m_nCurUndoPos-1);\n\t\tASSERT(pItem != NULL);\n\n\t\tpItem->Undo();\n\t\n\t\tm_nCurUndoPos--;\n\t\tm_bModified = (m_nCurUndoPos != 0);\t\t\n\t}\n\n\tm_bWorking = FALSE;\n}\n\nFX_BOOL\tCFX_Edit_Undo::CanRedo() const\n{\n\treturn m_nCurUndoPos < m_UndoItemStack.GetSize();\n}\n\nvoid CFX_Edit_Undo::Redo()\n{\n\tm_bWorking = TRUE;\n\n\tFX_INT32 nStackSize = m_UndoItemStack.GetSize();\n\n\tif (m_nCurUndoPos < nStackSize)\n\t{\n\t\tIFX_Edit_UndoItem * pItem = m_UndoItemStack.GetAt(m_nCurUndoPos);\n\t\tASSERT(pItem != NULL);\n\n\t\tpItem->Redo();\n\n\t\tm_nCurUndoPos++;\n\t\tm_bModified = (m_nCurUndoPos != 0);\t\t\n\t}\n\n\tm_bWorking = FALSE;\n}\n\nFX_BOOL\tCFX_Edit_Undo::IsWorking() const\n{\n\treturn m_bWorking;\n}\n\nvoid CFX_Edit_Undo::AddItem(IFX_Edit_UndoItem* pItem)\n{\n\tASSERT(!m_bWorking);\n\tASSERT(pItem != NULL);\n\tASSERT(m_nBufSize > 1);\n\t\n\tif (m_nCurUndoPos < m_UndoItemStack.GetSize())\n\t\tRemoveTails();\n\n\tif (m_UndoItemStack.GetSize() >= m_nBufSize)\n\t{\n\t\tRemoveHeads();\t\n\t\tm_bVirgin = FALSE;\n\t}\n\n\tm_UndoItemStack.Add(pItem);\t\n\tm_nCurUndoPos = m_UndoItemStack.GetSize();\n\n\tm_bModified = (m_nCurUndoPos != 0);\n}\n\nFX_BOOL\tCFX_Edit_Undo::IsModified() const\n{\n\tif (m_bVirgin)\n\t\treturn m_bModified;\n\telse\n\t\treturn TRUE;\n}\n\nIFX_Edit_UndoItem* CFX_Edit_Undo::GetItem(FX_INT32 nIndex)\n{\n\tif (nIndex>=0 && nIndex < m_UndoItemStack.GetSize())\n\t\treturn m_UndoItemStack.GetAt(nIndex);\n\n\treturn NULL;\n}\n\nvoid CFX_Edit_Undo::RemoveHeads()\n{\n\tASSERT(m_UndoItemStack.GetSize() > 1);\n\n\tIFX_Edit_UndoItem* pItem = m_UndoItemStack.GetAt(0);\n\tASSERT(pItem != NULL);\n\n\tpItem->Release();\n\tm_UndoItemStack.RemoveAt(0);\n}\n\nvoid CFX_Edit_Undo::RemoveTails()\n{\n\tfor (FX_INT32 i = m_UndoItemStack.GetSize()-1; i >= m_nCurUndoPos; i--)\n\t{\n\t\tIFX_Edit_UndoItem* pItem = m_UndoItemStack.GetAt(i);\n\t\tASSERT(pItem != NULL);\n\n\t\tpItem->Release();\n\t\tm_UndoItemStack.RemoveAt(i);\n\t}\n}\n\nvoid CFX_Edit_Undo::Reset()\n{\n\tfor (FX_INT32 i=0, sz=m_UndoItemStack.GetSize(); i < sz; i++)\n\t{\n\t\tIFX_Edit_UndoItem * pItem = m_UndoItemStack.GetAt(i);\n\t\tASSERT(pItem != NULL);\n\n\t\tpItem->Release();\n\t}\n\tm_nCurUndoPos = 0;\n\tm_UndoItemStack.RemoveAll();\n}\n\n/* -------------------------------- CFX_Edit_GroupUndoItem -------------------------------- */\n\nCFX_Edit_GroupUndoItem::CFX_Edit_GroupUndoItem(const CFX_WideString& sTitle) : m_sTitle(sTitle)\n{\n}\n\nCFX_Edit_GroupUndoItem::~CFX_Edit_GroupUndoItem()\n{\n\tfor (int i=0,sz=m_Items.GetSize(); i<sz; i++)\n\t{\n\t\tCFX_Edit_UndoItem* pUndoItem = m_Items[i];\n\t\tASSERT(pUndoItem != NULL);\n\n\t\tpUndoItem->Release();\n\t}\n\n\tm_Items.RemoveAll();\n}\n\nvoid CFX_Edit_GroupUndoItem::AddUndoItem(CFX_Edit_UndoItem* pUndoItem)\n{\n\tASSERT(pUndoItem != NULL);\n\n\tpUndoItem->SetFirst(FALSE);\n\tpUndoItem->SetLast(FALSE);\n\n\tm_Items.Add(pUndoItem);\n\n\tif (m_sTitle.IsEmpty())\n\t\tm_sTitle = pUndoItem->GetUndoTitle();\n}\n\nvoid CFX_Edit_GroupUndoItem::UpdateItems()\n{\n\tif (m_Items.GetSize() > 0)\n\t{\n\t\tCFX_Edit_UndoItem* pFirstItem = m_Items[0];\n\t\tASSERT(pFirstItem != NULL);\n\t\tpFirstItem->SetFirst(TRUE);\n\n\t\tCFX_Edit_UndoItem* pLastItem = m_Items[m_Items.GetSize() - 1];\n\t\tASSERT(pLastItem != NULL);\n\t\tpLastItem->SetLast(TRUE);\n\t}\n}\n\nvoid CFX_Edit_GroupUndoItem::Undo()\n{\n\tfor (int i=m_Items.GetSize()-1; i>=0; i--)\n\t{\n\t\tCFX_Edit_UndoItem* pUndoItem = m_Items[i];\n\t\tASSERT(pUndoItem != NULL);\n\n\t\tpUndoItem->Undo();\n\t}\n}\n\nvoid CFX_Edit_GroupUndoItem::Redo()\n{\n\tfor (int i=0,sz=m_Items.GetSize(); i<sz; i++)\n\t{\n\t\tCFX_Edit_UndoItem* pUndoItem = m_Items[i];\n\t\tASSERT(pUndoItem != NULL);\n\n\t\tpUndoItem->Redo();\n\t}\n}\n\nCFX_WideString CFX_Edit_GroupUndoItem::GetUndoTitle()\n{\n\treturn m_sTitle;\n}\n\nvoid CFX_Edit_GroupUndoItem::Release()\n{\n\tdelete this;\n}\n\n/* ------------------------------------- CFX_Edit_UndoItem derived classes ------------------------------------- */\n\nCFXEU_InsertWord::CFXEU_InsertWord(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,\n\t\t\t\t\t\t\t\t FX_WORD word, FX_INT32 charset, const CPVT_WordProps * pWordProps) \n\t: m_pEdit(pEdit), m_wpOld(wpOldPlace), m_wpNew(wpNewPlace), m_Word(word), m_nCharset(charset), m_WordProps()\n{\n\tif (pWordProps)\n\t\tm_WordProps = *pWordProps;\n}\n\nCFXEU_InsertWord::~CFXEU_InsertWord()\n{\n}\n\nvoid CFXEU_InsertWord::Redo()\n{\n\tif (m_pEdit)\n\t{\n\t\tm_pEdit->SelectNone();\n\t\tm_pEdit->SetCaret(m_wpOld);\t\t\n\t\tm_pEdit->InsertWord(m_Word,m_nCharset,&m_WordProps,FALSE,TRUE);\n\t}\n}\n\nvoid CFXEU_InsertWord::Undo()\n{\n\tif (m_pEdit)\n\t{\n\t\tm_pEdit->SelectNone();\n\t\tm_pEdit->SetCaret(m_wpNew);\n\t\tm_pEdit->Backspace(FALSE,TRUE);\n\t}\n}\n\n/* -------------------------------------------------------------------------- */\n\nCFXEU_InsertReturn::CFXEU_InsertReturn(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,\n\t\t\t const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps) :\n\t\t\tm_pEdit(pEdit),\n\t\t\tm_wpOld(wpOldPlace),\n\t\t\tm_wpNew(wpNewPlace),\n\t\t\tm_SecProps(),\n\t\t\tm_WordProps()\t\t\t\t\t\t\t\t\t \n{\n\tif (pSecProps)\n\t\tm_SecProps = *pSecProps;\n\tif (pWordProps)\n\t\tm_WordProps = *pWordProps;\n}\n\nCFXEU_InsertReturn::~CFXEU_InsertReturn()\n{\n}\n\nvoid CFXEU_InsertReturn::Redo()\n{\n\tif (m_pEdit)\n\t{\n\t\tm_pEdit->SelectNone();\n\t\tm_pEdit->SetCaret(m_wpOld);\n\t\tm_pEdit->InsertReturn(&m_SecProps,&m_WordProps,FALSE,TRUE);\n\t}\n}\n\nvoid CFXEU_InsertReturn::Undo()\n{\n\tif (m_pEdit)\n\t{\n\t\tm_pEdit->SelectNone();\n\t\tm_pEdit->SetCaret(m_wpNew);\n\t\tm_pEdit->Backspace(FALSE,TRUE);\n\t}\n}\n\n/* -------------------------------------------------------------------------- */\n//CFXEU_Backspace\n\nCFXEU_Backspace::CFXEU_Backspace(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,\n\t\t\t\t\t\t\t   FX_WORD word, FX_INT32 charset,\n\t\t\t\t\t\t\t   const CPVT_SecProps & SecProps, const CPVT_WordProps & WordProps) :\n\t\t\tm_pEdit(pEdit),\n\t\t\tm_wpOld(wpOldPlace),\n\t\t\tm_wpNew(wpNewPlace),\n\t\t\tm_Word(word),\n\t\t\tm_nCharset(charset),\n\t\t\tm_SecProps(SecProps),\n\t\t\tm_WordProps(WordProps)\t\t\t\t\t\t\t\t\t \n{\n}\n\nCFXEU_Backspace::~CFXEU_Backspace()\n{\n}\n\nvoid CFXEU_Backspace::Redo()\n{\n\tif (m_pEdit)\n\t{\n\t\tm_pEdit->SelectNone();\n\t\tm_pEdit->SetCaret(m_wpOld);\n\t\tm_pEdit->Backspace(FALSE,TRUE);\n\t}\n}\n\nvoid CFXEU_Backspace::Undo()\n{\n\tif (m_pEdit)\n\t{\n\t\tm_pEdit->SelectNone();\n\t\tm_pEdit->SetCaret(m_wpNew);\n\t\tif (m_wpNew.SecCmp(m_wpOld) != 0)\n\t\t{\n\t\t\tm_pEdit->InsertReturn(&m_SecProps,&m_WordProps,FALSE,TRUE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_pEdit->InsertWord(m_Word,m_nCharset,&m_WordProps,FALSE,TRUE);\n\t\t}\n\t}\n}\n\n/* -------------------------------------------------------------------------- */\n//CFXEU_Delete\n\nCFXEU_Delete::CFXEU_Delete(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,\n\t\t\t\t\t\t\t   FX_WORD word, FX_INT32 charset,\n\t\t\t\t\t\t\t   const CPVT_SecProps & SecProps, const CPVT_WordProps & WordProps, FX_BOOL bSecEnd) :\n\t\t\tm_pEdit(pEdit),\n\t\t\tm_wpOld(wpOldPlace),\n\t\t\tm_wpNew(wpNewPlace),\n\t\t\tm_Word(word),\n\t\t\tm_nCharset(charset),\n\t\t\tm_SecProps(SecProps),\n\t\t\tm_WordProps(WordProps),\n\t\t\tm_bSecEnd(bSecEnd)\n{\n}\n\nCFXEU_Delete::~CFXEU_Delete()\n{\n}\n\nvoid CFXEU_Delete::Redo()\n{\n\tif (m_pEdit)\n\t{\n\t\tm_pEdit->SelectNone();\n\t\tm_pEdit->SetCaret(m_wpOld);\n\t\tm_pEdit->Delete(FALSE,TRUE);\n\t}\n}\n\nvoid CFXEU_Delete::Undo()\n{\n\tif (m_pEdit)\n\t{\n\t\tm_pEdit->SelectNone();\n\t\tm_pEdit->SetCaret(m_wpNew);\n\t\tif (m_bSecEnd)\n\t\t{\n\t\t\tm_pEdit->InsertReturn(&m_SecProps,&m_WordProps,FALSE,TRUE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_pEdit->InsertWord(m_Word,m_nCharset,&m_WordProps,FALSE,TRUE);\n\t\t}\n\t}\n}\n\n/* -------------------------------------------------------------------------- */\n//CFXEU_Clear\n\nCFXEU_Clear::CFXEU_Clear(CFX_Edit * pEdit,  const CPVT_WordRange & wrSel, const CFX_WideString & swText) :\n\t\t\tm_pEdit(pEdit),\n\t\t\tm_wrSel(wrSel),\n\t\t\tm_swText(swText)\n{\n}\n\nCFXEU_Clear::~CFXEU_Clear()\n{\n}\n\nvoid CFXEU_Clear::Redo()\n{\n\tif (m_pEdit)\n\t{\n\t\tm_pEdit->SelectNone();\n\t\tm_pEdit->SetSel(m_wrSel.BeginPos,m_wrSel.EndPos);\n\t\tm_pEdit->Clear(FALSE,TRUE);\n\t}\n}\n\nvoid CFXEU_Clear::Undo()\n{\n\tif (m_pEdit)\n\t{\n\t\tm_pEdit->SelectNone();\n\t\tm_pEdit->SetCaret(m_wrSel.BeginPos);\n\t\tm_pEdit->InsertText(m_swText, DEFAULT_CHARSET, NULL,NULL,FALSE,TRUE);\n\t\tm_pEdit->SetSel(m_wrSel.BeginPos,m_wrSel.EndPos);\n\t}\n}\n\n/* -------------------------------------------------------------------------- */\n//CFXEU_ClearRich\n\nCFXEU_ClearRich::CFXEU_ClearRich(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,\n\t\t\t\t\t\t\t   const CPVT_WordRange & wrSel, FX_WORD word, FX_INT32 charset,\n\t\t\t\t\t\t\t   const CPVT_SecProps & SecProps, const CPVT_WordProps & WordProps) :\n\t\t\tm_pEdit(pEdit),\n\t\t\tm_wpOld(wpOldPlace),\n\t\t\tm_wpNew(wpNewPlace),\n\t\t\tm_wrSel(wrSel),\n\t\t\tm_Word(word),\n\t\t\tm_nCharset(charset),\n\t\t\tm_SecProps(SecProps),\n\t\t\tm_WordProps(WordProps)\t\t\t\t\t\t\t\t\t \n{\n}\n\nCFXEU_ClearRich::~CFXEU_ClearRich()\n{\n}\n\nvoid CFXEU_ClearRich::Redo()\n{\n\tif (m_pEdit && IsLast())\n\t{\n\t\tm_pEdit->SelectNone();\n\t\tm_pEdit->SetSel(m_wrSel.BeginPos,m_wrSel.EndPos);\n\t\tm_pEdit->Clear(FALSE,TRUE);\n\t}\n}\n\nvoid CFXEU_ClearRich::Undo()\n{\n\tif (m_pEdit)\n\t{\n\t\tm_pEdit->SelectNone();\n\t\tm_pEdit->SetCaret(m_wpOld);\n\t\tif (m_wpNew.SecCmp(m_wpOld) != 0)\n\t\t{\n\t\t\tm_pEdit->InsertReturn(&m_SecProps,&m_WordProps,FALSE,FALSE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_pEdit->InsertWord(m_Word,m_nCharset,&m_WordProps,FALSE,FALSE);\n\t\t}\n\n\t\tif (IsFirst())\n\t\t{\n\t\t\tm_pEdit->PaintInsertText(m_wrSel.BeginPos,m_wrSel.EndPos);\n\t\t\tm_pEdit->SetSel(m_wrSel.BeginPos,m_wrSel.EndPos);\n\t\t}\n\t}\n}\n/* -------------------------------------------------------------------------- */\n//CFXEU_InsertText\n\nCFXEU_InsertText::CFXEU_InsertText(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,\n\t\t\t\t\t\t\t   const CFX_WideString & swText, FX_INT32 charset,\n\t\t\t\t\t\t\t   const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps) :\n\t\t\tm_pEdit(pEdit),\n\t\t\tm_wpOld(wpOldPlace),\n\t\t\tm_wpNew(wpNewPlace),\n\t\t\tm_swText(swText),\n\t\t\tm_nCharset(charset),\n\t\t\tm_SecProps(),\n\t\t\tm_WordProps()\t\t\t\t\t\t\t\t\t \n{\n\tif (pSecProps)\n\t\tm_SecProps = *pSecProps;\n\tif (pWordProps)\n\t\tm_WordProps = *pWordProps;\n}\n\nCFXEU_InsertText::~CFXEU_InsertText()\n{\n}\n\nvoid CFXEU_InsertText::Redo()\n{\n\tif (m_pEdit && IsLast())\n\t{\n\t\tm_pEdit->SelectNone();\n\t\tm_pEdit->SetCaret(m_wpOld);\n\t\tm_pEdit->InsertText(m_swText, m_nCharset,&m_SecProps, &m_WordProps,FALSE,TRUE);\n\t}\n}\n\nvoid CFXEU_InsertText::Undo()\n{\n\tif (m_pEdit)\n\t{\n\t\tm_pEdit->SelectNone();\n\t\tm_pEdit->SetSel(m_wpOld,m_wpNew);\n\t\tm_pEdit->Clear(FALSE,TRUE);\n\t}\n}\n\n/* -------------------------------------------------------------------------- */\n\nCFXEU_SetSecProps::CFXEU_SetSecProps(CFX_Edit * pEdit, const CPVT_WordPlace & place, EDIT_PROPS_E ep, \n\t\tconst CPVT_SecProps & oldsecprops, const CPVT_WordProps & oldwordprops, \n\t\tconst CPVT_SecProps & newsecprops, const CPVT_WordProps & newwordprops, const CPVT_WordRange & range)\n\t\t: m_pEdit(pEdit),\n\t\tm_wpPlace(place),\n\t\tm_eProps(ep),\n\t\tm_OldSecProps(oldsecprops),\n\t\tm_NewSecProps(newsecprops),\n\t\tm_OldWordProps(oldwordprops),\n\t\tm_NewWordProps(newwordprops),\n\t\tm_wrPlace(range)\n{\n}\n\nCFXEU_SetSecProps::~CFXEU_SetSecProps()\n{\n}\n\nvoid CFXEU_SetSecProps::Redo()\n{\n\tif (m_pEdit)\n\t{\n\t\tm_pEdit->SetSecProps(m_eProps,m_wpPlace,&m_NewSecProps,&m_NewWordProps,m_wrPlace,FALSE);\n\t\tif (IsLast())\n\t\t{\n\t\t\tm_pEdit->SelectNone();\n\t\t\tm_pEdit->PaintSetProps(m_eProps,m_wrPlace);\n\t\t\tm_pEdit->SetSel(m_wrPlace.BeginPos,m_wrPlace.EndPos);\n\t\t}\n\t}\n}\n\nvoid CFXEU_SetSecProps::Undo()\n{\n\tif (m_pEdit)\n\t{\n\t\tm_pEdit->SetSecProps(m_eProps,m_wpPlace,&m_OldSecProps,&m_OldWordProps,m_wrPlace,FALSE);\n\t\tif (IsFirst())\n\t\t{\n\t\t\tm_pEdit->SelectNone();\n\t\t\tm_pEdit->PaintSetProps(m_eProps,m_wrPlace);\n\t\t\tm_pEdit->SetSel(m_wrPlace.BeginPos,m_wrPlace.EndPos);\n\t\t}\n\t}\n}\n\n/* -------------------------------------------------------------------------- */\n\nCFXEU_SetWordProps::CFXEU_SetWordProps(CFX_Edit * pEdit, const CPVT_WordPlace & place, EDIT_PROPS_E ep, \n\t\tconst CPVT_WordProps & oldprops, const CPVT_WordProps & newprops, const CPVT_WordRange & range)\n\t\t: m_pEdit(pEdit),\n\t\tm_wpPlace(place),\n\t\tm_eProps(ep),\n\t\tm_OldWordProps(oldprops),\n\t\tm_NewWordProps(newprops),\n\t\tm_wrPlace(range)\n{\n}\n\nCFXEU_SetWordProps::~CFXEU_SetWordProps()\n{\n}\n\nvoid CFXEU_SetWordProps::Redo()\n{\n\tif (m_pEdit)\n\t{\n\t\tm_pEdit->SetWordProps(m_eProps,m_wpPlace,&m_NewWordProps,m_wrPlace,FALSE);\n\t\tif (IsLast())\n\t\t{\n\t\t\tm_pEdit->SelectNone();\n\t\t\tm_pEdit->PaintSetProps(m_eProps,m_wrPlace);\n\t\t\tm_pEdit->SetSel(m_wrPlace.BeginPos,m_wrPlace.EndPos);\n\t\t}\n\t}\n}\n\nvoid CFXEU_SetWordProps::Undo()\n{\n\tif (m_pEdit)\n\t{\n\t\tm_pEdit->SetWordProps(m_eProps,m_wpPlace,&m_OldWordProps,m_wrPlace,FALSE);\n\t\tif (IsFirst())\n\t\t{\n\t\t\tm_pEdit->SelectNone();\n\t\t\tm_pEdit->PaintSetProps(m_eProps,m_wrPlace);\n\t\t\tm_pEdit->SetSel(m_wrPlace.BeginPos,m_wrPlace.EndPos);\n\t\t}\n\t}\n}\n\n/* ------------------------------------- CFX_Edit ------------------------------------- */\n\nCFX_Edit::CFX_Edit(IPDF_VariableText * pVT) :\n\tm_pVT(pVT),\n\tm_pNotify(NULL),\n\tm_pOprNotify(NULL),\n\tm_wpCaret(-1,-1,-1),\n\tm_wpOldCaret(-1,-1,-1),\n\tm_ptScrollPos(0,0),\n\tm_ptRefreshScrollPos(0,0),\n\tm_bEnableScroll(FALSE),\n\tm_bEnableOverflow(FALSE),\n\tm_pVTProvide(NULL),\n\tm_pIterator(NULL),\n\tm_SelState(),\n\tm_ptCaret(0.0f,0.0f),\n\tm_Undo(FX_EDIT_UNDO_MAXITEM),\n\tm_nAlignment(0),\n\tm_bNotifyFlag(FALSE),\n\tm_bEnableRefresh(TRUE),\n\tm_rcOldContent(0.0f,0.0f,0.0f,0.0f),\n\tm_bEnableUndo(TRUE),\n\tm_bNotify(TRUE),\n\tm_bOprNotify(FALSE),\n\tm_pGroupUndoItem(NULL)\n{\t\n\tASSERT(pVT != NULL);\n}\n\nCFX_Edit::~CFX_Edit()\n{\n\tif (m_pVTProvide)\n\t{\n\t\tdelete m_pVTProvide;\n\t\tm_pVTProvide = NULL;\n\t}\n\n\tif (m_pIterator)\n\t{\n\t\tdelete m_pIterator;\n\t\tm_pIterator = NULL;\n\t}\n\n\tASSERT(m_pGroupUndoItem == NULL);\n}\n\n// public methods\n\nvoid CFX_Edit::Initialize()\n{\n\tm_pVT->Initialize();\n\tSetCaret(m_pVT->GetBeginWordPlace());\n\tSetCaretOrigin();\n}\n\nvoid CFX_Edit::SetFontMap(IFX_Edit_FontMap * pFontMap)\n{\n\tif (m_pVTProvide) \n\t\tdelete m_pVTProvide;\n\n\tm_pVT->SetProvider(m_pVTProvide = new CFX_Edit_Provider(pFontMap));\n}\n\nvoid CFX_Edit::SetVTProvider(IPDF_VariableText_Provider* pProvider)\n{\n\tm_pVT->SetProvider(pProvider);\n}\n\nvoid CFX_Edit::SetNotify(IFX_Edit_Notify* pNotify)\n{\n\tm_pNotify = pNotify;\n}\n\nvoid CFX_Edit::SetOprNotify(IFX_Edit_OprNotify* pOprNotify)\n{\n\tm_pOprNotify = pOprNotify;\n}\n\nIFX_Edit_Iterator * CFX_Edit::GetIterator()\n{\n\tif (!m_pIterator)\n\t\tm_pIterator = new CFX_Edit_Iterator(this,m_pVT->GetIterator());\n\n\treturn m_pIterator;\n}\n\nIPDF_VariableText *\tCFX_Edit::GetVariableText()\n{\n\treturn m_pVT;\n}\n\nIFX_Edit_FontMap* CFX_Edit::GetFontMap()\n{\n\tif (m_pVTProvide)\n\t\treturn m_pVTProvide->GetFontMap();\n\n\treturn NULL;\n}\n\nvoid CFX_Edit::SetPlateRect(const CPDF_Rect & rect, FX_BOOL bPaint/* = TRUE*/)\n{\t\n\tm_pVT->SetPlateRect(rect);\n\tm_ptScrollPos = CPDF_Point(rect.left,rect.top);\t\t\t\n\tif (bPaint) Paint();\n}\n\nvoid CFX_Edit::SetAlignmentH(FX_INT32 nFormat/* =0 */, FX_BOOL bPaint/* = TRUE*/)\n{\n\tm_pVT->SetAlignment(nFormat);\n\tif (bPaint) Paint();\n}\n\nvoid CFX_Edit::SetAlignmentV(FX_INT32 nFormat/* =0 */, FX_BOOL bPaint/* = TRUE*/)\n{\n\tm_nAlignment = nFormat;\n\tif (bPaint) Paint();\n}\n\nvoid CFX_Edit::SetPasswordChar(FX_WORD wSubWord/* ='*' */, FX_BOOL bPaint/* = TRUE*/)\n{\n\tm_pVT->SetPasswordChar(wSubWord);\n\tif (bPaint) Paint();\n}\n\nvoid CFX_Edit::SetLimitChar(FX_INT32 nLimitChar/* =0 */, FX_BOOL bPaint/* = TRUE*/)\n{\n\tm_pVT->SetLimitChar(nLimitChar);\n\tif (bPaint) Paint();\n}\n\nvoid CFX_Edit::SetCharArray(FX_INT32 nCharArray/* =0 */, FX_BOOL bPaint/* = TRUE*/)\n{\n\tm_pVT->SetCharArray(nCharArray);\n\tif (bPaint) Paint();\n}\n\nvoid CFX_Edit::SetCharSpace(FX_FLOAT fCharSpace/* =0.0f */, FX_BOOL bPaint/* = TRUE*/)\n{\n\tm_pVT->SetCharSpace(fCharSpace);\n\tif (bPaint) Paint();\n}\n\nvoid CFX_Edit::SetHorzScale(FX_INT32 nHorzScale/* =100 */, FX_BOOL bPaint/* = TRUE*/)\n{\n\tm_pVT->SetHorzScale(nHorzScale);\n\tif (bPaint) Paint();\n}\n\nvoid CFX_Edit::SetMultiLine(FX_BOOL bMultiLine/* =TRUE */, FX_BOOL bPaint/* = TRUE*/)\n{\n\tm_pVT->SetMultiLine(bMultiLine);\n\tif (bPaint) Paint();\n}\n\nvoid CFX_Edit::SetAutoReturn(FX_BOOL bAuto/* =TRUE */, FX_BOOL bPaint/* = TRUE*/)\n{\n\tm_pVT->SetAutoReturn(bAuto);\n\tif (bPaint) Paint();\n}\n\nvoid CFX_Edit::SetLineLeading(FX_FLOAT fLineLeading/* =TRUE */, FX_BOOL bPaint/* = TRUE*/)\n{\n\tm_pVT->SetLineLeading(fLineLeading);\n\tif (bPaint) Paint();\n}\n\nvoid CFX_Edit::SetAutoFontSize(FX_BOOL bAuto/* =TRUE */, FX_BOOL bPaint/* = TRUE*/)\n{\n\tm_pVT->SetAutoFontSize(bAuto);\n\tif (bPaint) Paint();\n}\n\nvoid CFX_Edit::SetFontSize(FX_FLOAT fFontSize, FX_BOOL bPaint/* = TRUE*/)\n{\n\tm_pVT->SetFontSize(fFontSize);\n\tif (bPaint) Paint();\n}\n\nvoid CFX_Edit::SetAutoScroll(FX_BOOL bAuto/* =TRUE */, FX_BOOL bPaint/* = TRUE*/)\n{\n\tm_bEnableScroll = bAuto;\n\tif (bPaint) Paint();\n}\n\nvoid CFX_Edit::SetTextOverflow(FX_BOOL bAllowed /*= FALSE*/, FX_BOOL bPaint/* = TRUE*/)\n{\n\tm_bEnableOverflow = bAllowed;\n\tif (bPaint) Paint();\n}\n\nvoid CFX_Edit::SetSel(FX_INT32 nStartChar,FX_INT32 nEndChar)\n{\n\tif (m_pVT->IsValid())\n\t{\n\t\tif (nStartChar == 0 && nEndChar < 0)\n\t\t{\n\t\t\tSelectAll();\n\t\t}\n\t\telse if (nStartChar < 0)\n\t\t{\t\n\t\t\tthis->SelectNone();\n\t\t}\n\t\telse\n\t\t{\t\t\n\t\t\tif (nStartChar < nEndChar)\n\t\t\t{\n\t\t\t\tSetSel(m_pVT->WordIndexToWordPlace(nStartChar),m_pVT->WordIndexToWordPlace(nEndChar));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tSetSel(m_pVT->WordIndexToWordPlace(nEndChar),m_pVT->WordIndexToWordPlace(nStartChar));\n\t\t\t}\n\t\t}\t\n\t}\n}\n\nvoid CFX_Edit::SetSel(const CPVT_WordPlace & begin,const CPVT_WordPlace & end)\n{\n\tif (m_pVT->IsValid())\n\t{\n\t\tSelectNone();\n\n\t\tm_SelState.Set(begin,end);\n\n\t\tSetCaret(m_SelState.EndPos);\n\n\t\tif (m_SelState.IsExist())\n\t\t{\n\t\t\tScrollToCaret();\n\t\t\tCPVT_WordRange wr(m_SelState.BeginPos,m_SelState.EndPos);\n\t\t\tRefresh(RP_OPTIONAL,&wr);\n\t\t\tSetCaretInfo();\n\t\t}\n\t\telse\n\t\t{\t\t\n\t\t\tScrollToCaret();\n\t\t\tSetCaretInfo();\n\t\t}\n\t}\n}\n\nvoid CFX_Edit::GetSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar) const\n{\n\tnStartChar = -1;\n\tnEndChar = -1;\n\n\tif (m_pVT->IsValid())\n\t{\n\t\tif (m_SelState.IsExist())\n\t\t{\n\t\t\tif (m_SelState.BeginPos.WordCmp(m_SelState.EndPos)<0)\n\t\t\t{\n\t\t\t\tnStartChar = m_pVT->WordPlaceToWordIndex(m_SelState.BeginPos);\n\t\t\t\tnEndChar = m_pVT->WordPlaceToWordIndex(m_SelState.EndPos);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tnStartChar = m_pVT->WordPlaceToWordIndex(m_SelState.EndPos);\n\t\t\t\tnEndChar = m_pVT->WordPlaceToWordIndex(m_SelState.BeginPos);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnStartChar = m_pVT->WordPlaceToWordIndex(m_wpCaret);\n\t\t\tnEndChar = m_pVT->WordPlaceToWordIndex(m_wpCaret);\n\t\t}\n\t}\n}\n\nFX_INT32 CFX_Edit::GetCaret() const\n{\n\tif (m_pVT->IsValid())\n\t\treturn m_pVT->WordPlaceToWordIndex(m_wpCaret);\n\n\treturn -1;\n}\n\nCPVT_WordPlace CFX_Edit::GetCaretWordPlace() const\n{\n\treturn m_wpCaret;\n}\n\nCFX_WideString CFX_Edit::GetText() const\n{\n\tCFX_WideString swRet;\n\n\tif (m_pVT->IsValid())\n\t{\n\t\tif (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())\n\t\t{\n\t\t\tFX_BOOL bRich = m_pVT->IsRichText();\n\n\t\t\tpIterator->SetAt(0);\n\n\t\t\tCPVT_Word wordinfo;\t\n\t\t\tCPVT_WordPlace oldplace = pIterator->GetAt();\n\t\t\twhile (pIterator->NextWord())\n\t\t\t{\n\t\t\t\tCPVT_WordPlace place = pIterator->GetAt();\n\n\t\t\t\tif (pIterator->GetWord(wordinfo))\n\t\t\t\t{\n\t\t\t\t\tif (bRich)\n\t\t\t\t\t{\n\t\t\t\t\t\tswRet += wordinfo.Word;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tswRet += wordinfo.Word;\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\tif (oldplace.SecCmp(place) != 0)\n\t\t\t\t{\n\t\t\t\t\tswRet += 0x0D;\n\t\t\t\t\tswRet += 0x0A;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\toldplace = place;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn swRet;\n}\n\nCFX_WideString CFX_Edit::GetRangeText(const CPVT_WordRange & range) const\n{\n\tCFX_WideString swRet;\n\n\tif (m_pVT->IsValid())\n\t{\n\t\tFX_BOOL bRich = m_pVT->IsRichText();\n\n\t\tif (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())\n\t\t{\t\t\t\n\t\t\tCPVT_WordRange wrTemp = range;\n\t\t\tm_pVT->UpdateWordPlace(wrTemp.BeginPos);\n\t\t\tm_pVT->UpdateWordPlace(wrTemp.EndPos);\n\t\t\tpIterator->SetAt(wrTemp.BeginPos);\n\n\t\t\tCPVT_Word wordinfo;\t\n\t\t\tCPVT_WordPlace oldplace = wrTemp.BeginPos;\n\t\t\twhile (pIterator->NextWord())\n\t\t\t{\n\t\t\t\tCPVT_WordPlace place = pIterator->GetAt();\n\t\t\t\tif (place.WordCmp(wrTemp.EndPos) > 0)break;\n\n\t\t\t\tif (pIterator->GetWord(wordinfo))\n\t\t\t\t{\n\t\t\t\t\tif (bRich)\n\t\t\t\t\t{\n\t\t\t\t\t\tswRet += wordinfo.Word;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tswRet += wordinfo.Word;\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\tif (oldplace.SecCmp(place) != 0)\n\t\t\t\t{\n\t\t\t\t\tswRet += 0x0D;\n\t\t\t\t\tswRet += 0x0A;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\toldplace = place;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn swRet;\n}\n\nCFX_WideString CFX_Edit::GetSelText() const\n{\n\treturn GetRangeText(m_SelState.ConvertToWordRange());\n}\n\nFX_INT32 CFX_Edit::GetTotalWords() const\n{\n\treturn m_pVT->GetTotalWords();\n}\n\nFX_INT32 CFX_Edit::GetTotalLines() const\n{\n\tFX_INT32 nLines = 0;\n\n\tif (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())\n\t{\n\t\tpIterator->SetAt(0);\n\t\twhile (pIterator->NextLine())\n\t\t\tnLines++;\n\t}\n\n\treturn nLines+1;\n}\n\nCPVT_WordRange CFX_Edit::GetSelectWordRange() const\n{\n\treturn m_SelState.ConvertToWordRange();\n}\n\nCPVT_WordRange CFX_Edit::CombineWordRange(const CPVT_WordRange & wr1, const CPVT_WordRange & wr2)\n{\n\tCPVT_WordRange wrRet;\n\n\tif (wr1.BeginPos.WordCmp(wr2.BeginPos) < 0)\n\t{\n\t\twrRet.BeginPos = wr1.BeginPos;\n\t}\n\telse\n\t{\n\t\twrRet.BeginPos = wr2.BeginPos;\n\t}\n\n\tif (wr1.EndPos.WordCmp(wr2.EndPos) < 0)\n\t{\n\t\twrRet.EndPos = wr2.EndPos;\n\t}\n\telse\n\t{\n\t\twrRet.EndPos = wr1.EndPos;\n\t}\n\n\treturn wrRet;\n}\n\nFX_BOOL\tCFX_Edit::IsRichText() const\n{\n\treturn m_pVT->IsRichText();\n}\n\nvoid CFX_Edit::SetRichText(FX_BOOL bRichText/* =TRUE */, FX_BOOL bPaint/* = TRUE*/)\n{\n\tm_pVT->SetRichText(bRichText);\n\tif (bPaint) Paint();\n}\n\nFX_BOOL CFX_Edit::SetRichFontIndex(FX_INT32 nFontIndex)\n{\n\tCPVT_WordProps WordProps;\n\tWordProps.nFontIndex = nFontIndex;\n\treturn SetRichTextProps(EP_FONTINDEX,NULL,&WordProps);\t\n}\n\nFX_BOOL CFX_Edit::SetRichFontSize(FX_FLOAT fFontSize)\n{\t\n\tCPVT_WordProps WordProps;\n\tWordProps.fFontSize = fFontSize;\n\treturn SetRichTextProps(EP_FONTSIZE,NULL,&WordProps);\t\n}\n\nFX_BOOL CFX_Edit::SetRichTextColor(FX_COLORREF dwColor)\n{\n\tCPVT_WordProps WordProps;\n\tWordProps.dwWordColor = dwColor;\n\treturn SetRichTextProps(EP_WORDCOLOR,NULL,&WordProps);\t\n}\n\nFX_BOOL CFX_Edit::SetRichTextScript(FX_INT32 nScriptType)\n{\n\tCPVT_WordProps WordProps;\n\tWordProps.nScriptType = nScriptType;\n\treturn SetRichTextProps(EP_SCRIPTTYPE,NULL,&WordProps);\t\n}\n\nFX_BOOL CFX_Edit::SetRichTextBold(FX_BOOL bBold)\n{\n\tCPVT_WordProps WordProps;\n\tif (bBold)\n\t\tWordProps.nWordStyle |= PVTWORD_STYLE_BOLD;\n\treturn SetRichTextProps(EP_BOLD,NULL,&WordProps);\n}\n\nFX_BOOL CFX_Edit::SetRichTextItalic(FX_BOOL bItalic)\n{\n\tCPVT_WordProps WordProps;\n\tif (bItalic)\n\t\tWordProps.nWordStyle |= PVTWORD_STYLE_ITALIC;\n\treturn SetRichTextProps(EP_ITALIC,NULL,&WordProps);\n}\n\nFX_BOOL CFX_Edit::SetRichTextUnderline(FX_BOOL bUnderline)\n{\n\tCPVT_WordProps WordProps;\n\tif (bUnderline)\n\t\tWordProps.nWordStyle |= PVTWORD_STYLE_UNDERLINE;\n\treturn SetRichTextProps(EP_UNDERLINE,NULL,&WordProps);\n}\n\nFX_BOOL CFX_Edit::SetRichTextCrossout(FX_BOOL bCrossout)\n{\n\tCPVT_WordProps WordProps;\n\tif (bCrossout)\n\t\tWordProps.nWordStyle |= PVTWORD_STYLE_CROSSOUT;\n\treturn SetRichTextProps(EP_CROSSOUT,NULL,&WordProps);\n}\n\nFX_BOOL CFX_Edit::SetRichTextCharSpace(FX_FLOAT fCharSpace)\n{\n\tCPVT_WordProps WordProps;\n\tWordProps.fCharSpace = fCharSpace;\n\treturn SetRichTextProps(EP_CHARSPACE,NULL,&WordProps);\t\n}\n\nFX_BOOL CFX_Edit::SetRichTextHorzScale(FX_INT32 nHorzScale /*= 100*/)\n{\n\tCPVT_WordProps WordProps;\n\tWordProps.nHorzScale = nHorzScale;\n\treturn SetRichTextProps(EP_HORZSCALE,NULL,&WordProps);\t\n}\n\nFX_BOOL CFX_Edit::SetRichTextLineLeading(FX_FLOAT fLineLeading)\n{\n\tCPVT_SecProps SecProps;\n\tSecProps.fLineLeading = fLineLeading;\n\treturn SetRichTextProps(EP_LINELEADING,&SecProps,NULL);\t\n}\n\nFX_BOOL CFX_Edit::SetRichTextLineIndent(FX_FLOAT fLineIndent)\n{\n\tCPVT_SecProps SecProps;\n\tSecProps.fLineIndent = fLineIndent;\n\treturn SetRichTextProps(EP_LINEINDENT,&SecProps,NULL);\n}\n\nFX_BOOL\tCFX_Edit::SetRichTextAlignment(FX_INT32 nAlignment)\n{\n\tCPVT_SecProps SecProps;\n\tSecProps.nAlignment = nAlignment;\n\treturn SetRichTextProps(EP_ALIGNMENT,&SecProps,NULL);\n}\n\nFX_BOOL CFX_Edit::SetRichTextProps(EDIT_PROPS_E eProps, const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps)\n{\n\tFX_BOOL bSet = FALSE;\n\tFX_BOOL bSet1,bSet2;\n\tif (m_pVT->IsValid() && m_pVT->IsRichText())\n\t{\n\t\tif (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())\n\t\t{\n\t\t\tCPVT_WordRange wrTemp = m_SelState.ConvertToWordRange();\n\t\t\t\n\t\t\tm_pVT->UpdateWordPlace(wrTemp.BeginPos);\n\t\t\tm_pVT->UpdateWordPlace(wrTemp.EndPos);\n\t\t\tpIterator->SetAt(wrTemp.BeginPos);\n\n\t\t\tBeginGroupUndo(L\"\");;\n\n\t\t\tbSet = SetSecProps(eProps,wrTemp.BeginPos,pSecProps,pWordProps,wrTemp,TRUE);\n\n\t\t\twhile (pIterator->NextWord())\n\t\t\t{\n\t\t\t\tCPVT_WordPlace place = pIterator->GetAt();\n\t\t\t\tif (place.WordCmp(wrTemp.EndPos) > 0) break;\n\t\t\t\tbSet1 = SetSecProps(eProps,place,pSecProps,pWordProps,wrTemp,TRUE);\n\t\t\t\tbSet2 = SetWordProps(eProps,place,pWordProps,wrTemp,TRUE);\n\t\t\t\t\n\t\t\t\tif (!bSet)\n\t\t\t\t\tbSet = (bSet1 || bSet2);\n\t\t\t}\n\n\t\t\tEndGroupUndo();\n\n\t\t\tif (bSet)\n\t\t\t{\n\t\t\t\tPaintSetProps(eProps,wrTemp);\n\t\t\t}\n\t\t}\n\t}\t\n\n\treturn bSet;\n}\n\nvoid CFX_Edit::PaintSetProps(EDIT_PROPS_E eProps, const CPVT_WordRange & wr)\n{\n\tswitch(eProps)\n\t{\n\tcase EP_LINELEADING:\n\tcase EP_LINEINDENT:\n\tcase EP_ALIGNMENT:\n\t\tRearrangePart(wr);\n\t\tScrollToCaret();\n\t\tRefresh(RP_ANALYSE);\n\t\tSetCaretOrigin();\n\t\tSetCaretInfo();\t\n\t\tbreak;\t\t\t\t\t\n\tcase EP_WORDCOLOR:\n\tcase EP_UNDERLINE:\n\tcase EP_CROSSOUT:\n\t\tRefresh(RP_OPTIONAL,&wr);\n\t\tbreak;\n\tcase EP_FONTINDEX:\n\tcase EP_FONTSIZE:\n\tcase EP_SCRIPTTYPE:\t\t\t\t\t\n\tcase EP_CHARSPACE:\n\tcase EP_HORZSCALE:\n\tcase EP_BOLD:\n\tcase EP_ITALIC:\n\t\tRearrangePart(wr);\n\t\tScrollToCaret();\n\n\t\tCPVT_WordRange wrRefresh(m_pVT->GetSectionBeginPlace(wr.BeginPos),\n\t\t\tm_pVT->GetSectionEndPlace(wr.EndPos));\n\t\tRefresh(RP_ANALYSE,&wrRefresh);\n\n\t\tSetCaretOrigin();\n\t\tSetCaretInfo();\t\n\t\tbreak;\n\t}\t\t\t\t\n}\n\nFX_BOOL CFX_Edit::SetSecProps(EDIT_PROPS_E eProps, const CPVT_WordPlace & place, \n\t\t\t\t\t\t\t   const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps, \n\t\t\t\t\t\t\t   const CPVT_WordRange & wr, FX_BOOL bAddUndo)\n{\n\tif (m_pVT->IsValid() && m_pVT->IsRichText())\n\t{\n\t\tif (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())\n\t\t{\n\t\t\tFX_BOOL bSet = FALSE;\n\t\t\tCPVT_Section secinfo;\n\t\t\tCPVT_Section OldSecinfo;\n\n\t\t\tCPVT_WordPlace oldplace = pIterator->GetAt();\n\n\t\t\tif (eProps == EP_LINELEADING || eProps == EP_LINEINDENT || eProps == EP_ALIGNMENT)\n\t\t\t{\n\t\t\t\tif (pSecProps)\n\t\t\t\t{\n\t\t\t\t\tpIterator->SetAt(place);\n\t\t\t\t\tif (pIterator->GetSection(secinfo))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (bAddUndo) OldSecinfo = secinfo;\n\n\t\t\t\t\t\tswitch(eProps)\n\t\t\t\t\t\t{\n\t\t\t\t\t\tcase EP_LINELEADING:\t\t\t\t\n\t\t\t\t\t\t\tif (!FX_EDIT_IsFloatEqual(secinfo.SecProps.fLineLeading,pSecProps->fLineLeading))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tsecinfo.SecProps.fLineLeading = pSecProps->fLineLeading;\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase EP_LINEINDENT:\n\t\t\t\t\t\t\tif (!FX_EDIT_IsFloatEqual(secinfo.SecProps.fLineIndent,pSecProps->fLineIndent))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tsecinfo.SecProps.fLineIndent = pSecProps->fLineIndent;\n\t\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase EP_ALIGNMENT:\n\t\t\t\t\t\t\tif (secinfo.SecProps.nAlignment != pSecProps->nAlignment)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tsecinfo.SecProps.nAlignment = pSecProps->nAlignment;\n\t\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (pWordProps && place == m_pVT->GetSectionBeginPlace(place))\n\t\t\t\t{\n\t\t\t\t\tpIterator->SetAt(place);\n\t\t\t\t\tif (pIterator->GetSection(secinfo))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (bAddUndo) OldSecinfo = secinfo;\n\n\t\t\t\t\t\tswitch(eProps)\n\t\t\t\t\t\t{\n\t\t\t\t\t\tcase EP_FONTINDEX:\t\t\t\t\n\t\t\t\t\t\t\tif (secinfo.WordProps.nFontIndex != pWordProps->nFontIndex)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tsecinfo.WordProps.nFontIndex = pWordProps->nFontIndex;\n\t\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase EP_FONTSIZE:\n\t\t\t\t\t\t\tif (!FX_EDIT_IsFloatEqual(secinfo.WordProps.fFontSize,pWordProps->fFontSize))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tsecinfo.WordProps.fFontSize = pWordProps->fFontSize;\n\t\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase EP_WORDCOLOR:\n\t\t\t\t\t\t\tif (secinfo.WordProps.dwWordColor != pWordProps->dwWordColor)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tsecinfo.WordProps.dwWordColor = pWordProps->dwWordColor;\n\t\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase EP_SCRIPTTYPE:\t\t\t\t\n\t\t\t\t\t\t\tif (secinfo.WordProps.nScriptType != pWordProps->nScriptType)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tsecinfo.WordProps.nScriptType = pWordProps->nScriptType;\n\t\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase EP_CHARSPACE:\t\t\t\n\t\t\t\t\t\t\tif (!FX_EDIT_IsFloatEqual(secinfo.WordProps.fCharSpace,pWordProps->fCharSpace))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tsecinfo.WordProps.fCharSpace = pWordProps->fCharSpace;\n\t\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase EP_HORZSCALE:\t\t\t\t\n\t\t\t\t\t\t\tif (secinfo.WordProps.nHorzScale != pWordProps->nHorzScale)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tsecinfo.WordProps.nHorzScale = pWordProps->nHorzScale;\n\t\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase EP_UNDERLINE:\n\t\t\t\t\t\t\tif (pWordProps->nWordStyle & PVTWORD_STYLE_UNDERLINE)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) == 0)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tsecinfo.WordProps.nWordStyle |= PVTWORD_STYLE_UNDERLINE; \n\t\t\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) != 0)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tsecinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_UNDERLINE;\n\t\t\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase EP_CROSSOUT:\n\t\t\t\t\t\t\tif (pWordProps->nWordStyle & PVTWORD_STYLE_CROSSOUT)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) == 0)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tsecinfo.WordProps.nWordStyle |= PVTWORD_STYLE_CROSSOUT; \n\t\t\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) != 0)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tsecinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_CROSSOUT;\n\t\t\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase EP_BOLD:\n\t\t\t\t\t\t\tif (pWordProps->nWordStyle & PVTWORD_STYLE_BOLD)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) == 0)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tsecinfo.WordProps.nWordStyle |= PVTWORD_STYLE_BOLD; \n\t\t\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) != 0)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tsecinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_BOLD;\n\t\t\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase EP_ITALIC:\n\t\t\t\t\t\t\tif (pWordProps->nWordStyle & PVTWORD_STYLE_ITALIC)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) == 0)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tsecinfo.WordProps.nWordStyle |= PVTWORD_STYLE_ITALIC; \n\t\t\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) != 0)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tsecinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_ITALIC;\n\t\t\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (bSet)\n\t\t\t{\n\t\t\t\tpIterator->SetSection(secinfo);\n\n\t\t\t\tif (bAddUndo && m_bEnableUndo)\n\t\t\t\t{\n\t\t\t\t\tAddEditUndoItem(new CFXEU_SetSecProps\n\t\t\t\t\t\t(this,place,eProps,OldSecinfo.SecProps,OldSecinfo.WordProps,secinfo.SecProps,secinfo.WordProps,wr));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpIterator->SetAt(oldplace);\n\n\t\t\treturn bSet;\n\t\t}\n\t}\n\t\n\treturn FALSE;\n}\n\nFX_BOOL CFX_Edit::SetWordProps(EDIT_PROPS_E eProps, const CPVT_WordPlace & place, \n\t\t\t\t\t\t\t\tconst CPVT_WordProps * pWordProps, const CPVT_WordRange & wr, FX_BOOL bAddUndo)\n{\n\tif (m_pVT->IsValid() && m_pVT->IsRichText())\n\t{\n\t\tif (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())\n\t\t{\n\t\t\tFX_BOOL bSet = FALSE;\n\t\t\tCPVT_Word wordinfo;\n\t\t\tCPVT_Word OldWordinfo;\n\n\t\t\tCPVT_WordPlace oldplace = pIterator->GetAt();\n\n\t\t\tif (pWordProps)\n\t\t\t{\n\t\t\t\tpIterator->SetAt(place);\n\t\t\t\tif (pIterator->GetWord(wordinfo))\n\t\t\t\t{\n\t\t\t\t\tif (bAddUndo) OldWordinfo = wordinfo;\n\n\t\t\t\t\tswitch(eProps)\n\t\t\t\t\t{\n\t\t\t\t\tcase EP_FONTINDEX:\t\t\t\t\n\t\t\t\t\t\tif (wordinfo.WordProps.nFontIndex != pWordProps->nFontIndex)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (IFX_Edit_FontMap* pFontMap = this->GetFontMap())\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\twordinfo.WordProps.nFontIndex = pFontMap->GetWordFontIndex(wordinfo.Word,wordinfo.nCharset,pWordProps->nFontIndex);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase EP_FONTSIZE:\n\t\t\t\t\t\tif (!FX_EDIT_IsFloatEqual(wordinfo.WordProps.fFontSize,pWordProps->fFontSize))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twordinfo.WordProps.fFontSize = pWordProps->fFontSize;\n\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase EP_WORDCOLOR:\n\t\t\t\t\t\tif (wordinfo.WordProps.dwWordColor != pWordProps->dwWordColor)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twordinfo.WordProps.dwWordColor = pWordProps->dwWordColor;\n\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase EP_SCRIPTTYPE:\n\t\t\t\t\t\tif (wordinfo.WordProps.nScriptType != pWordProps->nScriptType)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twordinfo.WordProps.nScriptType = pWordProps->nScriptType;\n\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase EP_CHARSPACE:\n\t\t\t\t\t\tif (!FX_EDIT_IsFloatEqual(wordinfo.WordProps.fCharSpace,pWordProps->fCharSpace))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twordinfo.WordProps.fCharSpace = pWordProps->fCharSpace;\n\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase EP_HORZSCALE:\n\t\t\t\t\t\tif (wordinfo.WordProps.nHorzScale != pWordProps->nHorzScale)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twordinfo.WordProps.nHorzScale = pWordProps->nHorzScale;\n\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase EP_UNDERLINE:\n\t\t\t\t\t\tif (pWordProps->nWordStyle & PVTWORD_STYLE_UNDERLINE)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) == 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\twordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_UNDERLINE;\n\t\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) != 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\twordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_UNDERLINE;\n\t\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase EP_CROSSOUT:\n\t\t\t\t\t\tif (pWordProps->nWordStyle & PVTWORD_STYLE_CROSSOUT)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) == 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\twordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_CROSSOUT; \n\t\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) != 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\twordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_CROSSOUT;\n\t\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase EP_BOLD:\n\t\t\t\t\t\tif (pWordProps->nWordStyle & PVTWORD_STYLE_BOLD)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) == 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\twordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_BOLD; \n\t\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) != 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\twordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_BOLD;\n\t\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase EP_ITALIC:\n\t\t\t\t\t\tif (pWordProps->nWordStyle & PVTWORD_STYLE_ITALIC)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) == 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\twordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_ITALIC; \n\t\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) != 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\twordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_ITALIC;\n\t\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\t\n\n\t\t\tif (bSet)\n\t\t\t{\n\t\t\t\tpIterator->SetWord(wordinfo);\n\n\t\t\t\tif (bAddUndo && m_bEnableUndo)\n\t\t\t\t{\n\t\t\t\t\tAddEditUndoItem(new CFXEU_SetWordProps\n\t\t\t\t\t\t(this,place,eProps,OldWordinfo.WordProps,wordinfo.WordProps,wr));\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tpIterator->SetAt(oldplace);\n\t\t\treturn bSet;\n\t\t}\n\t}\n\n\treturn FALSE;\n}\n\nvoid CFX_Edit::SetText(FX_LPCWSTR text,FX_INT32 charset /*= DEFAULT_CHARSET*/,\n\t\t\t\t\t\tconst CPVT_SecProps * pSecProps /*= NULL*/,const CPVT_WordProps * pWordProps /*= NULL*/)\n{\n\tSetText(text,charset,pSecProps,pWordProps,TRUE,TRUE);\n}\n\nFX_BOOL CFX_Edit::InsertWord(FX_WORD word, FX_INT32 charset /*= DEFAULT_CHARSET*/, const CPVT_WordProps * pWordProps /*= NULL*/)\n{\n\treturn InsertWord(word,charset,pWordProps,TRUE,TRUE);\n}\n\nFX_BOOL CFX_Edit::InsertReturn(const CPVT_SecProps * pSecProps /*= NULL*/,const CPVT_WordProps * pWordProps /*= NULL*/)\n{\n\treturn InsertReturn(pSecProps,pWordProps,TRUE,TRUE);\n}\n\nFX_BOOL CFX_Edit::Backspace()\n{\n\treturn Backspace(TRUE,TRUE);\n}\n\nFX_BOOL CFX_Edit::Delete()\n{\n\treturn Delete(TRUE,TRUE);\n}\n\nFX_BOOL CFX_Edit::Clear()\n{\n\treturn Clear(TRUE,TRUE);\n}\n\nFX_BOOL CFX_Edit::InsertText(FX_LPCWSTR text, FX_INT32 charset /*= DEFAULT_CHARSET*/,\n\t\t\t\t\t\t\t\tconst CPVT_SecProps * pSecProps /*= NULL*/,const CPVT_WordProps * pWordProps /*= NULL*/)\n{\n\treturn InsertText(text,charset,pSecProps,pWordProps,TRUE,TRUE);\n}\n\nFX_FLOAT CFX_Edit::GetFontSize() const\n{\n\treturn m_pVT->GetFontSize();\n}\n\nFX_WORD CFX_Edit::GetPasswordChar() const\n{\n\treturn m_pVT->GetPasswordChar();\n}\n\nFX_INT32 CFX_Edit::GetCharArray() const\n{\n\treturn m_pVT->GetCharArray();\n}\n\nCPDF_Rect CFX_Edit::GetPlateRect() const\n{\n\treturn m_pVT->GetPlateRect();\n}\n\nCPDF_Rect CFX_Edit::GetContentRect() const\n{\n\treturn VTToEdit(m_pVT->GetContentRect());\n}\n\nFX_INT32 CFX_Edit::GetHorzScale() const\n{\n\treturn m_pVT->GetHorzScale();\n}\n\nFX_FLOAT CFX_Edit::GetCharSpace() const\n{\n\treturn m_pVT->GetCharSpace();\n}\n\n// inner methods\n\nCPVT_WordRange CFX_Edit::GetWholeWordRange() const\n{\n\tif (m_pVT->IsValid())\n\t\treturn CPVT_WordRange(m_pVT->GetBeginWordPlace(),m_pVT->GetEndWordPlace());\n\n\treturn CPVT_WordRange();\n}\n\nCPVT_WordRange CFX_Edit::GetVisibleWordRange() const\n{\n\tif (m_bEnableOverflow) return GetWholeWordRange();\n\n\tif (m_pVT->IsValid())\n\t{\n\t\tCPDF_Rect rcPlate = m_pVT->GetPlateRect();\n\n\t\tCPVT_WordPlace place1 = m_pVT->SearchWordPlace(EditToVT(CPDF_Point(rcPlate.left,rcPlate.top)));\n\t\tCPVT_WordPlace place2 = m_pVT->SearchWordPlace(EditToVT(CPDF_Point(rcPlate.right,rcPlate.bottom)));\n\n\t\treturn CPVT_WordRange(place1,place2);\n\t}\n\n\treturn CPVT_WordRange();\n}\n\nCPVT_WordPlace CFX_Edit::SearchWordPlace(const CPDF_Point& point) const\n{\n\tif (m_pVT->IsValid())\n\t{\n\t\treturn m_pVT->SearchWordPlace(EditToVT(point));\n\t}\n\n\treturn CPVT_WordPlace();\n}\n\nvoid CFX_Edit::Paint()\n{\n\tif (m_pVT->IsValid())\n\t{\n\t\tRearrangeAll();\n\t\tScrollToCaret();\n\t\tRefresh(RP_NOANALYSE);\n\t\tSetCaretOrigin();\n\t\tSetCaretInfo();\n\t}\n}\n\nvoid CFX_Edit::RearrangeAll()\n{\n\tif (m_pVT->IsValid())\n\t{\n\t\tm_pVT->UpdateWordPlace(m_wpCaret);\n\t\tm_pVT->RearrangeAll();\n\t\tm_pVT->UpdateWordPlace(m_wpCaret);\n\t\tSetScrollInfo();\n\t\tSetContentChanged();\n\t}\n}\n\nvoid CFX_Edit::RearrangePart(const CPVT_WordRange & range)\n{\n\tif (m_pVT->IsValid())\n\t{\n\t\tm_pVT->UpdateWordPlace(m_wpCaret);\n\t\tm_pVT->RearrangePart(range);\n\t\tm_pVT->UpdateWordPlace(m_wpCaret);\n\t\tSetScrollInfo();\n\t\tSetContentChanged();\n\t}\n}\n\nvoid CFX_Edit::SetContentChanged()\n{\n\tif (m_bNotify && m_pNotify)\n\t{\n\t\tCPDF_Rect rcContent = m_pVT->GetContentRect();\n\t\tif (rcContent.Width() != m_rcOldContent.Width() ||\n\t\t\trcContent.Height() != m_rcOldContent.Height())\n\t\t{\n\t\t\tif (!m_bNotifyFlag)\n\t\t\t{\n\t\t\t\tm_bNotifyFlag = TRUE;\n\t\t\t\tm_pNotify->IOnContentChange(rcContent);\n\t\t\t\tm_bNotifyFlag = FALSE;\n\t\t\t}\n\t\t\tm_rcOldContent = rcContent;\n\t\t}\n\t}\n}\n\nvoid CFX_Edit::SelectAll()\n{\n\tif (m_pVT->IsValid())\n\t{\n\t\tm_SelState = GetWholeWordRange();\t\t\n\t\tSetCaret(m_SelState.EndPos);\t\t\n\t\t\n\t\tScrollToCaret();\n\t\tCPVT_WordRange wrVisible = GetVisibleWordRange();\n\t\tRefresh(RP_OPTIONAL,&wrVisible);\n\t\tSetCaretInfo();\n\t}\n}\n\nvoid CFX_Edit::SelectNone()\n{\n\tif (m_pVT->IsValid())\n\t{\n\t\tif (m_SelState.IsExist())\n\t\t{\n\t\t\tCPVT_WordRange wrTemp = m_SelState.ConvertToWordRange();\n\t\t\tm_SelState.Default();\n\t\t\tRefresh(RP_OPTIONAL,&wrTemp);\n\t\t}\n\t}\t\n}\n\nFX_BOOL\tCFX_Edit::IsSelected() const\n{\n\treturn m_SelState.IsExist();\n}\n\nCPDF_Point CFX_Edit::VTToEdit(const CPDF_Point & point) const\n{\n\tCPDF_Rect rcContent = m_pVT->GetContentRect();\n\tCPDF_Rect rcPlate = m_pVT->GetPlateRect();\n\n\tFX_FLOAT fPadding = 0.0f;\n\n\tswitch (m_nAlignment)\n\t{\n\tcase 0:\n\t\tfPadding = 0.0f;\n\t\tbreak;\n\tcase 1:\n\t\tfPadding = (rcPlate.Height() - rcContent.Height()) * 0.5f;\n\t\tbreak;\n\tcase 2:\n\t\tfPadding = rcPlate.Height() - rcContent.Height();\n\t\tbreak;\n\t}\n\t\n\treturn CPDF_Point(point.x - (m_ptScrollPos.x - rcPlate.left),\n\t\tpoint.y - (m_ptScrollPos.y + fPadding - rcPlate.top));\n}\n\nCPDF_Point CFX_Edit::EditToVT(const CPDF_Point & point) const\n{\n\tCPDF_Rect rcContent = m_pVT->GetContentRect();\n\tCPDF_Rect rcPlate = m_pVT->GetPlateRect();\n\n\tFX_FLOAT fPadding = 0.0f;\n\n\tswitch (m_nAlignment)\n\t{\n\tcase 0:\n\t\tfPadding = 0.0f;\n\t\tbreak;\n\tcase 1:\n\t\tfPadding = (rcPlate.Height() - rcContent.Height()) * 0.5f;\n\t\tbreak;\n\tcase 2:\n\t\tfPadding = rcPlate.Height() - rcContent.Height();\n\t\tbreak;\n\t}\n\n\treturn CPDF_Point(point.x + (m_ptScrollPos.x - rcPlate.left),\n\t\tpoint.y + (m_ptScrollPos.y + fPadding - rcPlate.top));\n}\n\nCPDF_Rect CFX_Edit::VTToEdit(const CPDF_Rect & rect) const\n{\n\tCPDF_Point ptLeftBottom = VTToEdit(CPDF_Point(rect.left,rect.bottom));\n\tCPDF_Point ptRightTop = VTToEdit(CPDF_Point(rect.right,rect.top));\n\n\treturn CPDF_Rect(ptLeftBottom.x,ptLeftBottom.y,ptRightTop.x,ptRightTop.y);\n}\n\nCPDF_Rect CFX_Edit::EditToVT(const CPDF_Rect & rect) const\n{\n\tCPDF_Point ptLeftBottom = EditToVT(CPDF_Point(rect.left,rect.bottom));\n\tCPDF_Point ptRightTop = EditToVT(CPDF_Point(rect.right,rect.top));\n\n\treturn CPDF_Rect(ptLeftBottom.x,ptLeftBottom.y,ptRightTop.x,ptRightTop.y);\n}\n\nvoid CFX_Edit::SetScrollInfo()\n{\n\tif (m_bNotify && m_pNotify)\n\t{\n\t\tCPDF_Rect rcPlate = m_pVT->GetPlateRect();\n\t\tCPDF_Rect rcContent = m_pVT->GetContentRect();\n\n\t\tif (!m_bNotifyFlag)\n\t\t{\n\t\t\tm_bNotifyFlag = TRUE;\n\t\t\tm_pNotify->IOnSetScrollInfoX(rcPlate.left, rcPlate.right, \n\t\t\t\t\t\t\t\trcContent.left, rcContent.right, rcPlate.Width() / 3, rcPlate.Width());\n\t\t\t\n\t\t\tm_pNotify->IOnSetScrollInfoY(rcPlate.bottom, rcPlate.top, \n\t\t\t\t\trcContent.bottom, rcContent.top, rcPlate.Height() / 3, rcPlate.Height());\n\t\t\tm_bNotifyFlag = FALSE;\n\t\t}\n\t}\n}\n\nvoid CFX_Edit::SetScrollPosX(FX_FLOAT fx)\n{\n\tif (!m_bEnableScroll) return;\n\n\tif (m_pVT->IsValid())\n\t{\n\t\tif (!FX_EDIT_IsFloatEqual(m_ptScrollPos.x,fx))\n\t\t{\n\t\t\tm_ptScrollPos.x = fx;\t\t\t\n\t\t\tRefresh(RP_NOANALYSE);\n\n\t\t\tif (m_bNotify && m_pNotify)\n\t\t\t{\n\t\t\t\tif (!m_bNotifyFlag)\n\t\t\t\t{\n\t\t\t\t\tm_bNotifyFlag = TRUE;\n\t\t\t\t\tm_pNotify->IOnSetScrollPosX(fx);\n\t\t\t\t\tm_bNotifyFlag = FALSE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid CFX_Edit::SetScrollPosY(FX_FLOAT fy)\n{\n\tif (!m_bEnableScroll) return;\n\n\tif (m_pVT->IsValid())\n\t{\n\t\tif (!FX_EDIT_IsFloatEqual(m_ptScrollPos.y,fy))\n\t\t{\t\t\t\t\n\t\t\tm_ptScrollPos.y = fy;\n\t\t\tRefresh(RP_NOANALYSE);\n\n\t\t\tif (m_bNotify && m_pNotify)\n\t\t\t{\n\t\t\t\tif (!m_bNotifyFlag)\n\t\t\t\t{\n\t\t\t\t\tm_bNotifyFlag = TRUE;\n\t\t\t\t\tm_pNotify->IOnSetScrollPosY(fy);\n\t\t\t\t\tm_bNotifyFlag = FALSE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid CFX_Edit::SetScrollPos(const CPDF_Point & point)\n{\n\tSetScrollPosX(point.x);\n\tSetScrollPosY(point.y);\n\tSetScrollLimit();\n\tSetCaretInfo();\n}\n\nCPDF_Point CFX_Edit::GetScrollPos() const\n{\n\treturn m_ptScrollPos;\n}\n\nvoid CFX_Edit::SetScrollLimit()\n{\n\tif (m_pVT->IsValid())\n\t{\n\t\tCPDF_Rect rcContent = m_pVT->GetContentRect();\n\t\tCPDF_Rect rcPlate = m_pVT->GetPlateRect();\n\n\t\tif (rcPlate.Width() > rcContent.Width())\n\t\t{\n\t\t\tSetScrollPosX(rcPlate.left);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (FX_EDIT_IsFloatSmaller(m_ptScrollPos.x, rcContent.left))\n\t\t\t{\n\t\t\t\tSetScrollPosX(rcContent.left);\t\t\t\n\t\t\t}\n\t\t\telse if (FX_EDIT_IsFloatBigger(m_ptScrollPos.x, rcContent.right - rcPlate.Width()))\n\t\t\t{\n\t\t\t\tSetScrollPosX(rcContent.right - rcPlate.Width());\n\t\t\t}\n\t\t}\n\n\t\tif (rcPlate.Height() > rcContent.Height())\n\t\t{\n\t\t\tSetScrollPosY(rcPlate.top);\n\t\t}\n\t\telse\t\t\n\t\t{\n\t\t\tif (FX_EDIT_IsFloatSmaller(m_ptScrollPos.y, rcContent.bottom + rcPlate.Height()))\n\t\t\t{\n\t\t\t\tSetScrollPosY(rcContent.bottom + rcPlate.Height());\n\t\t\t}\n\t\t\telse if (FX_EDIT_IsFloatBigger(m_ptScrollPos.y, rcContent.top))\n\t\t\t{\n\t\t\t\tSetScrollPosY(rcContent.top);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid CFX_Edit::ScrollToCaret()\n{\n\tSetScrollLimit();\n\n\tif (m_pVT->IsValid())\n\t{\n\t\tCPDF_Point ptHead(0,0);\n\t\tCPDF_Point ptFoot(0,0);\n\n\t\tif (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())\n\t\t{\n\t\t\tpIterator->SetAt(m_wpCaret);\n\n\t\t\tCPVT_Word word;\n\t\t\tCPVT_Line line;\n\t\t\tif (pIterator->GetWord(word))\n\t\t\t{\n\t\t\t\tptHead.x = word.ptWord.x + word.fWidth;\n\t\t\t\tptHead.y = word.ptWord.y + word.fAscent;\n\t\t\t\tptFoot.x = word.ptWord.x + word.fWidth;\n\t\t\t\tptFoot.y = word.ptWord.y + word.fDescent;\n\t\t\t}\n\t\t\telse if (pIterator->GetLine(line))\n\t\t\t{\t\t\t\t\n\t\t\t\tptHead.x = line.ptLine.x;\n\t\t\t\tptHead.y = line.ptLine.y + line.fLineAscent;\n\t\t\t\tptFoot.x = line.ptLine.x;\n\t\t\t\tptFoot.y = line.ptLine.y + line.fLineDescent;\n\t\t\t}\n\t\t}\n\n\t\tCPDF_Point ptHeadEdit = VTToEdit(ptHead);\n\t\tCPDF_Point ptFootEdit = VTToEdit(ptFoot);\n\n\t\tCPDF_Rect rcPlate = m_pVT->GetPlateRect();\n\n\t\tif (!FX_EDIT_IsFloatEqual(rcPlate.left,rcPlate.right))\n\t\t{\n\t\t\tif (FX_EDIT_IsFloatSmaller(ptHeadEdit.x, rcPlate.left) ||\n\t\t\t\tFX_EDIT_IsFloatEqual(ptHeadEdit.x, rcPlate.left))\n\t\t\t{\n\t\t\t\tSetScrollPosX(ptHead.x);\n\t\t\t}\n\t\t\telse if (FX_EDIT_IsFloatBigger(ptHeadEdit.x, rcPlate.right))\n\t\t\t{\n\t\t\t\tSetScrollPosX(ptHead.x - rcPlate.Width());\n\t\t\t}\n\t\t}\n\n\t\tif (!FX_EDIT_IsFloatEqual(rcPlate.top,rcPlate.bottom))\n\t\t{\n\t\t\tif (FX_EDIT_IsFloatSmaller(ptFootEdit.y, rcPlate.bottom) ||\n\t\t\t\tFX_EDIT_IsFloatEqual(ptFootEdit.y, rcPlate.bottom))\n\t\t\t{\n\t\t\t\tif (FX_EDIT_IsFloatSmaller(ptHeadEdit.y, rcPlate.top))\n\t\t\t\t{\n\t\t\t\t\tSetScrollPosY(ptFoot.y + rcPlate.Height());\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (FX_EDIT_IsFloatBigger(ptHeadEdit.y, rcPlate.top))\n\t\t\t{\n\t\t\t\tif (FX_EDIT_IsFloatBigger(ptFootEdit.y, rcPlate.bottom))\n\t\t\t\t{\n\t\t\t\t\tSetScrollPosY(ptHead.y);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid CFX_Edit::Refresh(REFRESH_PLAN_E ePlan,const CPVT_WordRange * pRange1,const CPVT_WordRange * pRange2)\n{\n\tif (m_bEnableRefresh && m_pVT->IsValid())\n\t{\n\t\tm_Refresh.BeginRefresh();\n\t\tRefreshPushLineRects(GetVisibleWordRange());\n\n// \t\tif (!FX_EDIT_IsFloatEqual(m_ptRefreshScrollPos.x,m_ptScrollPos.x) || \n// \t\t\t!FX_EDIT_IsFloatEqual(m_ptRefreshScrollPos.y,m_ptScrollPos.y))\n// \t\t{\n\t\t\tm_Refresh.NoAnalyse();\n\t\t\tm_ptRefreshScrollPos = m_ptScrollPos;\n// \t\t}\n// \t\telse\n// \t\t{\n// \t\t\tswitch (ePlan)\n// \t\t\t{\n// \t\t\tcase RP_ANALYSE:\n// \t\t\t\tm_Refresh.Analyse(m_pVT->GetAlignment());\n// \n// \t\t\t\tif (pRange1) RefreshPushRandomRects(*pRange1);\n// \t\t\t\tif (pRange2) RefreshPushRandomRects(*pRange2);\n// \t\t\t\tbreak;\n// \t\t\tcase RP_NOANALYSE:\n// \t\t\t\tm_Refresh.NoAnalyse();\n// \t\t\t\tbreak;\n// \t\t\tcase RP_OPTIONAL:\n// \t\t\t\tif (pRange1) RefreshPushRandomRects(*pRange1);\n// \t\t\t\tif (pRange2) RefreshPushRandomRects(*pRange2);\n// \t\t\t\tbreak;\t\n// \t\t\t}\n// \t\t}\t\t\n\n\t\tif (m_bNotify && m_pNotify)\n\t\t{\n\t\t\tif (!m_bNotifyFlag)\n\t\t\t{\n\t\t\t\tm_bNotifyFlag = TRUE;\n\t\t\t\tif (const CFX_Edit_RectArray * pRects = m_Refresh.GetRefreshRects())\n\t\t\t\t{\n\t\t\t\t\tfor (FX_INT32 i = 0, sz = pRects->GetSize(); i < sz; i++)\n\t\t\t\t\t\tm_pNotify->IOnInvalidateRect(pRects->GetAt(i));\n\t\t\t\t}\n\t\t\t\tm_bNotifyFlag = FALSE;\n\t\t\t}\n\t\t}\n\n\t\tm_Refresh.EndRefresh();\n\t}\n}\n\nvoid CFX_Edit::RefreshPushLineRects(const CPVT_WordRange & wr)\n{\n\tif (m_pVT->IsValid())\n\t{\n\t\tif (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())\n\t\t{\n\t\t\tCPVT_WordPlace wpBegin = wr.BeginPos;\n\t\t\tm_pVT->UpdateWordPlace(wpBegin);\n\t\t\tCPVT_WordPlace wpEnd = wr.EndPos;\n\t\t\tm_pVT->UpdateWordPlace(wpEnd);\n\t\t\tpIterator->SetAt(wpBegin);\n\n\t\t\tCPVT_Line lineinfo;\t\n\t\t\tdo\n\t\t\t{\n\t\t\t\tif (!pIterator->GetLine(lineinfo))break;\n\t\t\t\tif (lineinfo.lineplace.LineCmp(wpEnd) > 0)break;\n\n\t\t\t\tCPDF_Rect rcLine(lineinfo.ptLine.x,\n\t\t\t\t\t\t\t\t\tlineinfo.ptLine.y + lineinfo.fLineDescent,\n\t\t\t\t\t\t\t\t\tlineinfo.ptLine.x + lineinfo.fLineWidth,\n\t\t\t\t\t\t\t\t\tlineinfo.ptLine.y + lineinfo.fLineAscent);\n\n\t\t\t\tm_Refresh.Push(CPVT_WordRange(lineinfo.lineplace,lineinfo.lineEnd),VTToEdit(rcLine));\n\n\t\t\t}while (pIterator->NextLine());\n\t\t}\n\t}\n}\n\nvoid CFX_Edit::RefreshPushRandomRects(const CPVT_WordRange & wr)\n{\n\tif (m_pVT->IsValid())\n\t{\n\t\tif (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())\n\t\t{\n\t\t\tCPVT_WordRange wrTemp = wr;\n\n\t\t\tm_pVT->UpdateWordPlace(wrTemp.BeginPos);\n\t\t\tm_pVT->UpdateWordPlace(wrTemp.EndPos);\n\t\t\tpIterator->SetAt(wrTemp.BeginPos);\n\n\t\t\tCPVT_Word wordinfo;\t\n\t\t\tCPVT_Line lineinfo;\t\n\t\t\tCPVT_WordPlace place;\n\n\t\t\twhile (pIterator->NextWord())\n\t\t\t{\n\t\t\t\tplace = pIterator->GetAt();\n\t\t\t\tif (place.WordCmp(wrTemp.EndPos) > 0) break;\n\t\t\t\t\t\t\n\t\t\t\tpIterator->GetWord(wordinfo);\n\t\t\t\tpIterator->GetLine(lineinfo);\n\n\t\t\t\tif (place.LineCmp(wrTemp.BeginPos) == 0 || place.LineCmp(wrTemp.EndPos) == 0)\n\t\t\t\t{\n\t\t\t\t\tCPDF_Rect rcWord(wordinfo.ptWord.x,\n\t\t\t\t\t\t\t\t\t\tlineinfo.ptLine.y + lineinfo.fLineDescent,\n\t\t\t\t\t\t\t\t\t\twordinfo.ptWord.x + wordinfo.fWidth,\n\t\t\t\t\t\t\t\t\t\tlineinfo.ptLine.y + lineinfo.fLineAscent);\n\n\t\t\t\t\tm_Refresh.AddRefresh(VTToEdit(rcWord));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\t\t\n\t\t\t\t\tCPDF_Rect rcLine(lineinfo.ptLine.x,\n\t\t\t\t\t\t\t\t\t\tlineinfo.ptLine.y + lineinfo.fLineDescent,\n\t\t\t\t\t\t\t\t\t\tlineinfo.ptLine.x + lineinfo.fLineWidth,\n\t\t\t\t\t\t\t\t\t\tlineinfo.ptLine.y + lineinfo.fLineAscent);\n\n\t\t\t\t\tm_Refresh.AddRefresh(VTToEdit(rcLine));\n\n\t\t\t\t\tpIterator->NextLine();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid CFX_Edit::RefreshWordRange(const CPVT_WordRange& wr)\n{\n\tif (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())\n\t{\n\t\tCPVT_WordRange wrTemp = wr;\n\n\t\tm_pVT->UpdateWordPlace(wrTemp.BeginPos);\n\t\tm_pVT->UpdateWordPlace(wrTemp.EndPos);\n\t\tpIterator->SetAt(wrTemp.BeginPos);\n\n\t\tCPVT_Word wordinfo;\t\n\t\tCPVT_Line lineinfo;\t\n\t\tCPVT_WordPlace place;\n\n\t\twhile (pIterator->NextWord())\n\t\t{\n\t\t\tplace = pIterator->GetAt();\n\t\t\tif (place.WordCmp(wrTemp.EndPos) > 0) break;\n\t\t\t\t\t\n\t\t\tpIterator->GetWord(wordinfo);\n\t\t\tpIterator->GetLine(lineinfo);\n\n\t\t\tif (place.LineCmp(wrTemp.BeginPos) == 0 || place.LineCmp(wrTemp.EndPos) == 0)\n\t\t\t{\n\t\t\t\tCPDF_Rect rcWord(wordinfo.ptWord.x,\n\t\t\t\t\t\t\t\t\tlineinfo.ptLine.y + lineinfo.fLineDescent,\n\t\t\t\t\t\t\t\t\twordinfo.ptWord.x + wordinfo.fWidth,\n\t\t\t\t\t\t\t\t\tlineinfo.ptLine.y + lineinfo.fLineAscent);\n\n\t\t\t\tif (m_bNotify && m_pNotify)\n\t\t\t\t{\n\t\t\t\t\tif (!m_bNotifyFlag)\n\t\t\t\t\t{\n\t\t\t\t\t\tm_bNotifyFlag = TRUE;\n\t\t\t\t\t\tCPDF_Rect rcRefresh = VTToEdit(rcWord);\n\t\t\t\t\t\tm_pNotify->IOnInvalidateRect(&rcRefresh);\n\t\t\t\t\t\tm_bNotifyFlag = FALSE;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\t\t\n\t\t\t\tCPDF_Rect rcLine(lineinfo.ptLine.x,\n\t\t\t\t\t\t\t\t\tlineinfo.ptLine.y + lineinfo.fLineDescent,\n\t\t\t\t\t\t\t\t\tlineinfo.ptLine.x + lineinfo.fLineWidth,\n\t\t\t\t\t\t\t\t\tlineinfo.ptLine.y + lineinfo.fLineAscent);\n\n\t\t\t\tif (m_bNotify && m_pNotify)\n\t\t\t\t{\n\t\t\t\t\tif (!m_bNotifyFlag)\n\t\t\t\t\t{\n\t\t\t\t\t\tm_bNotifyFlag = TRUE;\n\t\t\t\t\t\tCPDF_Rect rcRefresh = VTToEdit(rcLine);\n\t\t\t\t\t\tm_pNotify->IOnInvalidateRect(&rcRefresh);\n\t\t\t\t\t\tm_bNotifyFlag = FALSE;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tpIterator->NextLine();\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid CFX_Edit::SetCaret(const CPVT_WordPlace & place)\n{\n\tm_wpOldCaret = m_wpCaret; \n\tm_wpCaret = place;\t\n}\n\nvoid CFX_Edit::SetCaretInfo()\n{\n\tif (m_bNotify && m_pNotify)\n\t{\n\t\tif (!m_bNotifyFlag)\n\t\t{\n\t\t\tCPDF_Point ptHead(0.0f,0.0f),ptFoot(0.0f,0.0f);\n\n\t\t\tif (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())\n\t\t\t{\n\t\t\t\tpIterator->SetAt(m_wpCaret);\n\t\t\t\tCPVT_Word word;\n\t\t\t\tCPVT_Line line;\n\t\t\t\tif (pIterator->GetWord(word))\n\t\t\t\t{\n\t\t\t\t\tptHead.x = word.ptWord.x + word.fWidth;\n\t\t\t\t\tptHead.y = word.ptWord.y + word.fAscent;\n\t\t\t\t\tptFoot.x = word.ptWord.x + word.fWidth;\n\t\t\t\t\tptFoot.y = word.ptWord.y + word.fDescent;\n\t\t\t\t}\n\t\t\t\telse if (pIterator->GetLine(line))\n\t\t\t\t{\t\t\t\t\n\t\t\t\t\tptHead.x = line.ptLine.x;\n\t\t\t\t\tptHead.y = line.ptLine.y + line.fLineAscent;\n\t\t\t\t\tptFoot.x = line.ptLine.x;\n\t\t\t\t\tptFoot.y = line.ptLine.y + line.fLineDescent;\n\t\t\t\t}\n\t\t\t}\t\t\n\n\t\t\tm_bNotifyFlag = TRUE;\n\t\t\tm_pNotify->IOnSetCaret(!m_SelState.IsExist(),VTToEdit(ptHead),VTToEdit(ptFoot), m_wpCaret);\n\t\t\tm_bNotifyFlag = FALSE;\n\t\t}\n\t}\n\n\tSetCaretChange();\n}\n\nvoid CFX_Edit::SetCaretChange()\n{\n\tif (this->m_wpCaret == this->m_wpOldCaret) return;\n\n\tif (m_bNotify && m_pVT->IsRichText() && m_pNotify)\n\t{\n\t\tCPVT_SecProps SecProps;\n\t\tCPVT_WordProps WordProps;\n\n\t\tif (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())\n\t\t{\n\t\t\tpIterator->SetAt(m_wpCaret);\n\t\t\tCPVT_Word word;\n\t\t\tCPVT_Section section;\n\n\t\t\tif (pIterator->GetSection(section))\n\t\t\t{\n\t\t\t\tSecProps = section.SecProps;\n\t\t\t\tWordProps = section.WordProps;\n\t\t\t}\n\t\t\t\n\t\t\tif (pIterator->GetWord(word))\n\t\t\t{\t\t\t\t\n\t\t\t\tWordProps = word.WordProps;\t\t\t\t\n\t\t\t}\n\t\t}\t\t\n\t\t\n\t\tif (!m_bNotifyFlag)\n\t\t{\n\t\t\tm_bNotifyFlag = TRUE;\n\t\t\tm_pNotify->IOnCaretChange(SecProps,WordProps);\n\t\t\tm_bNotifyFlag = FALSE;\n\t\t}\n\t}\t\n}\n\nvoid CFX_Edit::SetCaret(FX_INT32 nPos)\n{\n\tif (m_pVT->IsValid())\n\t{\n\t\tSelectNone();\t\t\n\t\tSetCaret(m_pVT->WordIndexToWordPlace(nPos));\n\t\tm_SelState.Set(m_wpCaret,m_wpCaret);\n\n\t\tScrollToCaret();\n\t\tSetCaretOrigin();\n\t\tSetCaretInfo();\n\t}\n}\n\nvoid CFX_Edit::OnMouseDown(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl)\n{\n\tif (m_pVT->IsValid())\n\t{\n\t\tSelectNone();\t\t\n\t\tSetCaret(m_pVT->SearchWordPlace(EditToVT(point)));\n\t\tm_SelState.Set(m_wpCaret,m_wpCaret);\n\n\t\tScrollToCaret();\n\t\tSetCaretOrigin();\n\t\tSetCaretInfo();\n\t}\n}\n\nvoid CFX_Edit::OnMouseMove(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl)\n{\n\tif (m_pVT->IsValid())\n\t{\n\t\tSetCaret(m_pVT->SearchWordPlace(EditToVT(point)));\n\n\t\tif (m_wpCaret != m_wpOldCaret)\n\t\t{\n\t\t\tm_SelState.SetEndPos(m_wpCaret);\t\t\n\n\t\t\tScrollToCaret();\n\t\t\tCPVT_WordRange wr(m_wpOldCaret,m_wpCaret);\n\t\t\tRefresh(RP_OPTIONAL,&wr);\n\t\t\tSetCaretOrigin();\n\t\t\tSetCaretInfo();\n\t\t}\n\t}\n}\n\nvoid CFX_Edit::OnVK_UP(FX_BOOL bShift,FX_BOOL bCtrl)\n{\t\n\tif (m_pVT->IsValid())\n\t{\n\t\tSetCaret(m_pVT->GetUpWordPlace(m_wpCaret,m_ptCaret));\n\n\t\tif (bShift)\n\t\t{\n\t\t\tif (m_SelState.IsExist())\n\t\t\t\tm_SelState.SetEndPos(m_wpCaret);\n\t\t\telse\n\t\t\t\tm_SelState.Set(m_wpOldCaret,m_wpCaret);\n\n\t\t\tif (m_wpOldCaret != m_wpCaret)\n\t\t\t{\n\t\t\t\tScrollToCaret();\n\t\t\t\tCPVT_WordRange wr(m_wpOldCaret, m_wpCaret);\n\t\t\t\tRefresh(RP_OPTIONAL, &wr);\n\t\t\t\tSetCaretInfo();\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSelectNone();\t\t\n\t\t\t\n\t\t\tScrollToCaret();\t\t\t\n\t\t\tSetCaretInfo();\n\t\t}\n\t}\n}\n\nvoid CFX_Edit::OnVK_DOWN(FX_BOOL bShift,FX_BOOL bCtrl)\n{\n\tif (m_pVT->IsValid())\n\t{\n\t\tSetCaret(m_pVT->GetDownWordPlace(m_wpCaret,m_ptCaret));\n\n\t\tif (bShift)\n\t\t{\n\t\t\tif (m_SelState.IsExist())\n\t\t\t\tm_SelState.SetEndPos(m_wpCaret);\n\t\t\telse\n\t\t\t\tm_SelState.Set(m_wpOldCaret,m_wpCaret);\n\n\t\t\tif (m_wpOldCaret != m_wpCaret)\n\t\t\t{\n\t\t\t\tScrollToCaret();\n\t\t\t\tCPVT_WordRange wr(m_wpOldCaret,m_wpCaret);\n\t\t\t\tRefresh(RP_OPTIONAL, &wr);\n\t\t\t\tSetCaretInfo();\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSelectNone();\n\n\t\t\tScrollToCaret();\t\t\n\t\t\tSetCaretInfo();\n\t\t}\n\t}\n}\n\nvoid CFX_Edit::OnVK_LEFT(FX_BOOL bShift,FX_BOOL bCtrl)\n{\n\tif (m_pVT->IsValid())\n\t{\n\t\tif (bShift)\n\t\t{\n\t\t\tif (m_wpCaret == m_pVT->GetLineBeginPlace(m_wpCaret) &&\n\t\t\t\tm_wpCaret != m_pVT->GetSectionBeginPlace(m_wpCaret))\n\t\t\t\tSetCaret(m_pVT->GetPrevWordPlace(m_wpCaret));\t\n\n\t\t\tSetCaret(m_pVT->GetPrevWordPlace(m_wpCaret));\n\n\t\t\tif (m_SelState.IsExist())\n\t\t\t\tm_SelState.SetEndPos(m_wpCaret);\t\t\t\n\t\t\telse\n\t\t\t\tm_SelState.Set(m_wpOldCaret, m_wpCaret);\n\n\t\t\tif (m_wpOldCaret != m_wpCaret)\n\t\t\t{\n\t\t\t\tScrollToCaret();\n\t\t\t\tCPVT_WordRange wr(m_wpOldCaret,m_wpCaret);\n\t\t\t\tRefresh(RP_OPTIONAL,&wr);\n\t\t\t\tSetCaretInfo();\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (m_SelState.IsExist())\n\t\t\t{\n\t\t\t\tif (m_SelState.BeginPos.WordCmp(m_SelState.EndPos)<0)\n\t\t\t\t\tSetCaret(m_SelState.BeginPos);\n\t\t\t\telse\n\t\t\t\t\tSetCaret(m_SelState.EndPos);\n\n\t\t\t\tSelectNone();\n\t\t\t\tScrollToCaret();\n\t\t\t\tSetCaretInfo();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (m_wpCaret == m_pVT->GetLineBeginPlace(m_wpCaret) &&\n\t\t\t\t\tm_wpCaret != m_pVT->GetSectionBeginPlace(m_wpCaret))\n\t\t\t\t\tSetCaret(m_pVT->GetPrevWordPlace(m_wpCaret));\t\n\n\t\t\t\tSetCaret(m_pVT->GetPrevWordPlace(m_wpCaret));\n\n\t\t\t\tScrollToCaret();\n\t\t\t\tSetCaretOrigin();\n\t\t\t\tSetCaretInfo();\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid CFX_Edit::OnVK_RIGHT(FX_BOOL bShift,FX_BOOL bCtrl)\n{\n\tif (m_pVT->IsValid())\n\t{\n\t\tif (bShift)\n\t\t{\n\t\t\tSetCaret(m_pVT->GetNextWordPlace(m_wpCaret));\n\n\t\t\tif (m_wpCaret == m_pVT->GetLineEndPlace(m_wpCaret) &&\n\t\t\t\tm_wpCaret != m_pVT->GetSectionEndPlace(m_wpCaret))\n\t\t\t\tSetCaret(m_pVT->GetNextWordPlace(m_wpCaret));\n\n\t\t\tif (m_SelState.IsExist())\n\t\t\t\tm_SelState.SetEndPos(m_wpCaret);\t\t\t\n\t\t\telse\n\t\t\t\tm_SelState.Set(m_wpOldCaret,m_wpCaret);\t\t\t\n\n\t\t\tif (m_wpOldCaret != m_wpCaret)\n\t\t\t{\t\t\t\n\t\t\t\tScrollToCaret();\n\t\t\t\tCPVT_WordRange wr(m_wpOldCaret,m_wpCaret);\n\t\t\t\tRefresh(RP_OPTIONAL,&wr);\n\t\t\t\tSetCaretInfo();\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (m_SelState.IsExist())\n\t\t\t{\n\t\t\t\tif (m_SelState.BeginPos.WordCmp(m_SelState.EndPos)>0)\n\t\t\t\t\tSetCaret(m_SelState.BeginPos);\n\t\t\t\telse\n\t\t\t\t\tSetCaret(m_SelState.EndPos);\n\n\t\t\t\tSelectNone();\n\t\t\t\tScrollToCaret();\n\t\t\t\tSetCaretInfo();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tSetCaret(m_pVT->GetNextWordPlace(m_wpCaret));\n\n\t\t\t\tif (m_wpCaret == m_pVT->GetLineEndPlace(m_wpCaret) &&\n\t\t\t\t\tm_wpCaret != m_pVT->GetSectionEndPlace(m_wpCaret))\n\t\t\t\t\tSetCaret(m_pVT->GetNextWordPlace(m_wpCaret));\t\t\t\t\n\n\t\t\t\tScrollToCaret();\n\t\t\t\tSetCaretOrigin();\n\t\t\t\tSetCaretInfo();\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid CFX_Edit::OnVK_HOME(FX_BOOL bShift,FX_BOOL bCtrl)\n{\n\tif (m_pVT->IsValid())\n\t{\n\t\tif (bShift)\n\t\t{\n\t\t\tif (bCtrl)\n\t\t\t\tSetCaret(m_pVT->GetBeginWordPlace());\n\t\t\telse\n\t\t\t\tSetCaret(m_pVT->GetLineBeginPlace(m_wpCaret));\n\n\t\t\tif (m_SelState.IsExist())\n\t\t\t\tm_SelState.SetEndPos(m_wpCaret);\t\t\t\n\t\t\telse\n\t\t\t\tm_SelState.Set(m_wpOldCaret,m_wpCaret);\n\n\t\t\tScrollToCaret();\n\t\t\tCPVT_WordRange wr(m_wpOldCaret, m_wpCaret);\n\t\t\tRefresh(RP_OPTIONAL, &wr);\n\t\t\tSetCaretInfo();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (m_SelState.IsExist())\n\t\t\t{\n\t\t\t\tif (m_SelState.BeginPos.WordCmp(m_SelState.EndPos)<0)\n\t\t\t\t\tSetCaret(m_SelState.BeginPos);\n\t\t\t\telse\n\t\t\t\t\tSetCaret(m_SelState.EndPos);\n\n\t\t\t\tSelectNone();\n\t\t\t\tScrollToCaret();\n\t\t\t\tSetCaretInfo();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (bCtrl)\n\t\t\t\t\tSetCaret(m_pVT->GetBeginWordPlace());\n\t\t\t\telse\n\t\t\t\t\tSetCaret(m_pVT->GetLineBeginPlace(m_wpCaret));\t\n\t\t\t\t\n\t\t\t\tScrollToCaret();\n\t\t\t\tSetCaretOrigin();\n\t\t\t\tSetCaretInfo();\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid CFX_Edit::OnVK_END(FX_BOOL bShift,FX_BOOL bCtrl)\n{\n\tif (m_pVT->IsValid())\n\t{\n\t\tif (bShift)\n\t\t{\n\t\t\tif (bCtrl)\n\t\t\t\tSetCaret(m_pVT->GetEndWordPlace());\n\t\t\telse\n\t\t\t\tSetCaret(m_pVT->GetLineEndPlace(m_wpCaret));\n\n\t\t\tif (m_SelState.IsExist())\n\t\t\t\tm_SelState.SetEndPos(m_wpCaret);\n\t\t\telse\n\t\t\t\tm_SelState.Set(m_wpOldCaret, m_wpCaret);\n\n\t\t\tScrollToCaret();\n\t\t\tCPVT_WordRange wr(m_wpOldCaret, m_wpCaret);\n\t\t\tRefresh(RP_OPTIONAL, &wr);\n\t\t\tSetCaretInfo();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (m_SelState.IsExist())\n\t\t\t{\n\t\t\t\tif (m_SelState.BeginPos.WordCmp(m_SelState.EndPos)>0)\n\t\t\t\t\tSetCaret(m_SelState.BeginPos);\n\t\t\t\telse\n\t\t\t\t\tSetCaret(m_SelState.EndPos);\n\n\t\t\t\tSelectNone();\n\t\t\t\tScrollToCaret();\n\t\t\t\tSetCaretInfo();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (bCtrl)\n\t\t\t\t\tSetCaret(m_pVT->GetEndWordPlace());\n\t\t\t\telse\n\t\t\t\t\tSetCaret(m_pVT->GetLineEndPlace(m_wpCaret));\n\t\t\t\t\t\t\n\t\t\t\tScrollToCaret();\t\t\t\n\t\t\t\tSetCaretOrigin();\n\t\t\t\tSetCaretInfo();\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid CFX_Edit::SetText(FX_LPCWSTR text,FX_INT32 charset,\n\t\t\t\t\t\tconst CPVT_SecProps * pSecProps,const CPVT_WordProps * pWordProps, FX_BOOL bAddUndo, FX_BOOL bPaint)\n{\n\tEmpty();\n\tDoInsertText(CPVT_WordPlace(0,0,-1), text, charset, pSecProps, pWordProps);\n\tif (bPaint) Paint();\n\tif (m_bOprNotify && m_pOprNotify)\n\t\tm_pOprNotify->OnSetText(m_wpCaret, m_wpOldCaret);\n\t//if (bAddUndo)\n}\n\nFX_BOOL CFX_Edit::InsertWord(FX_WORD word, FX_INT32 charset, const CPVT_WordProps * pWordProps, FX_BOOL bAddUndo, FX_BOOL bPaint)\n{\n\tif (IsTextOverflow()) return FALSE;\n\n\tif (m_pVT->IsValid())\n\t{\n\t\tm_pVT->UpdateWordPlace(m_wpCaret);\n\n\t\tSetCaret(m_pVT->InsertWord(m_wpCaret,word,GetCharSetFromUnicode(word, charset),pWordProps));\n\t\tm_SelState.Set(m_wpCaret,m_wpCaret);\n\n\t\tif (m_wpCaret != m_wpOldCaret)\n\t\t{\n\t\t\tif (bAddUndo && m_bEnableUndo)\n\t\t\t{\n\t\t\t\tAddEditUndoItem(new CFXEU_InsertWord(this,m_wpOldCaret,m_wpCaret,word,charset,pWordProps));\n\t\t\t}\n\n\t\t\tif (bPaint)\n\t\t\t\tPaintInsertText(m_wpOldCaret, m_wpCaret);\n\n\t\t\tif (m_bOprNotify && m_pOprNotify)\n\t\t\t\tm_pOprNotify->OnInsertWord(m_wpCaret, m_wpOldCaret);\n\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\t\n\treturn FALSE;\n}\n\nFX_BOOL CFX_Edit::InsertReturn(const CPVT_SecProps * pSecProps,const CPVT_WordProps * pWordProps, \n\t\t\t\t\t\t\t   FX_BOOL bAddUndo, FX_BOOL bPaint)\n{\n\tif (IsTextOverflow()) return FALSE;\n\n\tif (m_pVT->IsValid())\n\t{\n\t\tm_pVT->UpdateWordPlace(m_wpCaret);\n\t\tSetCaret(m_pVT->InsertSection(m_wpCaret,pSecProps,pWordProps));\n\t\tm_SelState.Set(m_wpCaret,m_wpCaret);\n\n\t\tif (m_wpCaret != m_wpOldCaret)\n\t\t{\n\t\t\tif (bAddUndo && m_bEnableUndo)\n\t\t\t{\n\t\t\t\tAddEditUndoItem(new CFXEU_InsertReturn(this,m_wpOldCaret,m_wpCaret,pSecProps,pWordProps));\n\t\t\t}\n\n\t\t\tif (bPaint)\n\t\t\t{\n\t\t\t\tRearrangePart(CPVT_WordRange(m_wpOldCaret, m_wpCaret));\n\t\t\t\tScrollToCaret();\n\t\t\t\tCPVT_WordRange wr(m_wpOldCaret, GetVisibleWordRange().EndPos);\n\t\t\t\tRefresh(RP_ANALYSE, &wr);\t\t\n\t\t\t\tSetCaretOrigin();\n\t\t\t\tSetCaretInfo();\t\t\t\n\t\t\t}\n\n\t\t\tif (m_bOprNotify && m_pOprNotify)\n\t\t\t\tm_pOprNotify->OnInsertReturn(m_wpCaret, m_wpOldCaret);\n\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL CFX_Edit::Backspace(FX_BOOL bAddUndo, FX_BOOL bPaint)\n{\n\tif (m_pVT->IsValid())\n\t{\n\t\tif (m_wpCaret == m_pVT->GetBeginWordPlace()) return FALSE;\n\n\t\tCPVT_Section section;\n\t\tCPVT_Word word;\n\n\t\tif (bAddUndo)\n\t\t{\n\t\t\tif (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())\n\t\t\t{\t\t\t\t\n\t\t\t\tpIterator->SetAt(m_wpCaret);\n\t\t\t\tpIterator->GetSection(section);\n\t\t\t\tpIterator->GetWord(word);\n\t\t\t}\n\t\t}\n\n\t\tm_pVT->UpdateWordPlace(m_wpCaret);\n\t\tSetCaret(m_pVT->BackSpaceWord(m_wpCaret));\n\t\tm_SelState.Set(m_wpCaret,m_wpCaret);\n\n\t\tif (m_wpCaret != m_wpOldCaret)\n\t\t{\n\t\t\tif (bAddUndo && m_bEnableUndo)\n\t\t\t{\n\t\t\t\tif (m_wpCaret.SecCmp(m_wpOldCaret) != 0)\t\t\t\n\t\t\t\t\tAddEditUndoItem(new CFXEU_Backspace(this,m_wpOldCaret,m_wpCaret,word.Word,word.nCharset,\n\t\t\t\t\t\tsection.SecProps,section.WordProps));\n\t\t\t\telse\n\t\t\t\t\tAddEditUndoItem(new CFXEU_Backspace(this,m_wpOldCaret,m_wpCaret,word.Word,word.nCharset,\n\t\t\t\t\t\tsection.SecProps,word.WordProps));\n\t\t\t}\n\n\t\t\tif (bPaint)\n\t\t\t{\n\t\t\t\tRearrangePart(CPVT_WordRange(m_wpCaret,m_wpOldCaret));\n\t\t\t\tScrollToCaret();\n\n\t\t\t\tCPVT_WordRange wr;\n\t\t\t\tif (m_wpCaret.SecCmp(m_wpOldCaret) !=0)\n\t\t\t\t\twr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpCaret),GetVisibleWordRange().EndPos);\t\n\t\t\t\telse if (m_wpCaret.LineCmp(m_wpOldCaret) !=0)\n\t\t\t\t\twr = CPVT_WordRange(m_pVT->GetLineBeginPlace(m_wpCaret),m_pVT->GetSectionEndPlace(m_wpCaret));\n\t\t\t\telse\n\t\t\t\t\twr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpCaret),m_pVT->GetSectionEndPlace(m_wpCaret));\n\n\t\t\t\tRefresh(RP_ANALYSE, &wr);\n\n\t\t\t\tSetCaretOrigin();\n\t\t\t\tSetCaretInfo();\n\t\t\t}\n\n\t\t\tif (m_bOprNotify && m_pOprNotify)\n\t\t\t\tm_pOprNotify->OnBackSpace(m_wpCaret, m_wpOldCaret);\n\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL CFX_Edit::Delete(FX_BOOL bAddUndo, FX_BOOL bPaint)\n{\n\tif (m_pVT->IsValid())\n\t{\n\t\tif (m_wpCaret == m_pVT->GetEndWordPlace()) return FALSE;\n\n\t\tCPVT_Section section;\n\t\tCPVT_Word word;\n\n\t\tif (bAddUndo)\n\t\t{\n\t\t\tif (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())\n\t\t\t{\t\t\t\t\n\t\t\t\tpIterator->SetAt(m_pVT->GetNextWordPlace(m_wpCaret));\n\t\t\t\tpIterator->GetSection(section);\n\t\t\t\tpIterator->GetWord(word);\n\t\t\t}\n\t\t}\n\n\t\tm_pVT->UpdateWordPlace(m_wpCaret);\n\t\tFX_BOOL bSecEnd = (m_wpCaret == m_pVT->GetSectionEndPlace(m_wpCaret));\n\n\t\tSetCaret(m_pVT->DeleteWord(m_wpCaret));\n\t\tm_SelState.Set(m_wpCaret,m_wpCaret);\n\n\t\tif (bAddUndo && m_bEnableUndo)\n\t\t{\n\t\t\tif (bSecEnd)\t\t\n\t\t\t\tAddEditUndoItem(new CFXEU_Delete(this,m_wpOldCaret,m_wpCaret,word.Word,word.nCharset,\n\t\t\t\t\tsection.SecProps,section.WordProps,bSecEnd));\n\t\t\telse\n\t\t\t\tAddEditUndoItem(new CFXEU_Delete(this,m_wpOldCaret,m_wpCaret,word.Word,word.nCharset,\n\t\t\t\t\tsection.SecProps,word.WordProps,bSecEnd));\n\t\t}\n\t\t\n\t\tif (bPaint)\n\t\t{\n\t\t\tRearrangePart(CPVT_WordRange(m_wpOldCaret,m_wpCaret));\n\t\t\tScrollToCaret();\n\n\t\t\tCPVT_WordRange wr;\n\t\t\tif (bSecEnd)\n\t\t\t\twr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpOldCaret),GetVisibleWordRange().EndPos);\n\t\t\telse if (m_wpCaret.LineCmp(m_wpOldCaret) !=0)\n\t\t\t\twr = CPVT_WordRange(m_pVT->GetLineBeginPlace(m_wpCaret),m_pVT->GetSectionEndPlace(m_wpCaret));\n\t\t\telse\n\t\t\t\twr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpOldCaret),m_pVT->GetSectionEndPlace(m_wpCaret));\t\t\t\n\n\t\t\tRefresh(RP_ANALYSE, &wr);\n\t\t\t\n\t\t\tSetCaretOrigin();\n\t\t\tSetCaretInfo();\n\t\t}\n\n\t\tif (m_bOprNotify && m_pOprNotify)\n\t\t\tm_pOprNotify->OnDelete(m_wpCaret, m_wpOldCaret);\n\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL\tCFX_Edit::Empty()\n{\n\tif (m_pVT->IsValid())\n\t{\n\t\tm_pVT->DeleteWords(GetWholeWordRange());\n\t\tSetCaret(m_pVT->GetBeginWordPlace());\n\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL CFX_Edit::Clear(FX_BOOL bAddUndo, FX_BOOL bPaint)\n{\n\tif (m_pVT->IsValid())\n\t{\n\t\tif (m_SelState.IsExist())\n\t\t{\n\t\t\tCPVT_WordRange range = m_SelState.ConvertToWordRange();\n\n\t\t\tif (bAddUndo && m_bEnableUndo)\n\t\t\t{\n\t\t\t\tif (m_pVT->IsRichText())\n\t\t\t\t{\n\t\t\t\t\tBeginGroupUndo(L\"\");\n\n\t\t\t\t\tif (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())\n\t\t\t\t\t{\n\t\t\t\t\t\tpIterator->SetAt(range.EndPos);\n\n\t\t\t\t\t\tCPVT_Word wordinfo;\t\n\t\t\t\t\t\tCPVT_Section secinfo;\t\t\t\t\t\t\n\t\t\t\t\t\tdo\n\t\t\t\t\t\t{\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tCPVT_WordPlace place = pIterator->GetAt();\n\t\t\t\t\t\t\tif (place.WordCmp(range.BeginPos) <= 0)break;\n\n\t\t\t\t\t\t\tCPVT_WordPlace oldplace = m_pVT->GetPrevWordPlace(place);\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\tif (oldplace.SecCmp(place) != 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (pIterator->GetSection(secinfo))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tAddEditUndoItem(new CFXEU_ClearRich(this,oldplace,place,range,wordinfo.Word,\n\t\t\t\t\t\t\t\t\t\twordinfo.nCharset,secinfo.SecProps,secinfo.WordProps));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (pIterator->GetWord(wordinfo))\n\t\t\t\t\t\t\t\t{\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\toldplace = m_pVT->AjustLineHeader(oldplace,TRUE);\n\t\t\t\t\t\t\t\t\tplace = m_pVT->AjustLineHeader(place,TRUE);\n\n\t\t\t\t\t\t\t\t\tAddEditUndoItem(new CFXEU_ClearRich(this,oldplace,place,range,wordinfo.Word,\n\t\t\t\t\t\t\t\t\t\twordinfo.nCharset,secinfo.SecProps,wordinfo.WordProps));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}while (pIterator->PrevWord());\n\t\t\t\t\t}\n\t\t\t\t\tEndGroupUndo();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\tAddEditUndoItem(new CFXEU_Clear(this,range,GetSelText()));\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tSelectNone();\t\t\t\n\t\t\tSetCaret(m_pVT->DeleteWords(range));\t\n\t\t\tm_SelState.Set(m_wpCaret,m_wpCaret);\n\n\t\t\tif (bPaint)\n\t\t\t{\n\t\t\t\tRearrangePart(range);\t\n\t\t\t\tScrollToCaret();\n\n\t\t\t\tCPVT_WordRange wr(m_wpOldCaret, GetVisibleWordRange().EndPos);\n\t\t\t\tRefresh(RP_ANALYSE, &wr);\n\t\t\t\t\n\t\t\t\tSetCaretOrigin();\n\t\t\t\tSetCaretInfo();\n\t\t\t}\n\n\t\t\tif (m_bOprNotify && m_pOprNotify)\n\t\t\t\tm_pOprNotify->OnClear(m_wpCaret, m_wpOldCaret);\n\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL CFX_Edit::InsertText(FX_LPCWSTR text, FX_INT32 charset,\n\t\t\t\t\tconst CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps, FX_BOOL bAddUndo, FX_BOOL bPaint)\n{\n\tif (IsTextOverflow()) return FALSE;\n\n\tm_pVT->UpdateWordPlace(m_wpCaret);\n\tSetCaret(DoInsertText(m_wpCaret, text, charset, pSecProps, pWordProps));\n\tm_SelState.Set(m_wpCaret,m_wpCaret);\n\n\tif (m_wpCaret != m_wpOldCaret)\n\t{\n\t\tif (bAddUndo && m_bEnableUndo)\n\t\t{\n\t\t\tAddEditUndoItem(new CFXEU_InsertText(this,m_wpOldCaret,m_wpCaret,text,charset,pSecProps,pWordProps));\n\t\t}\n\n\t\tif (bPaint)\n\t\t\tPaintInsertText(m_wpOldCaret, m_wpCaret);\n\n\t\tif (m_bOprNotify && m_pOprNotify)\n\t\t\tm_pOprNotify->OnInsertText(m_wpCaret, m_wpOldCaret);\n\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}\n\nvoid CFX_Edit::PaintInsertText(const CPVT_WordPlace & wpOld, const CPVT_WordPlace & wpNew)\n{\n\tif (m_pVT->IsValid())\n\t{\n\t\tRearrangePart(CPVT_WordRange(wpOld,wpNew));\n\t\tScrollToCaret();\n\t\t\n\t\tCPVT_WordRange wr;\n\t\tif (m_wpCaret.LineCmp(wpOld) !=0)\n\t\t\twr = CPVT_WordRange(m_pVT->GetLineBeginPlace(wpOld),m_pVT->GetSectionEndPlace(wpNew));\t\n\t\telse\n\t\t\twr = CPVT_WordRange(wpOld,m_pVT->GetSectionEndPlace(wpNew));\t\n\t\tRefresh(RP_ANALYSE, &wr);\n\t\tSetCaretOrigin();\n\t\tSetCaretInfo();\n\t}\n}\n\nFX_BOOL CFX_Edit::Redo()\n{\n\tif (m_bEnableUndo)\n\t{\n\t\tif (m_Undo.CanRedo())\n\t\t{\n\t\t\tm_Undo.Redo();\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL CFX_Edit::Undo()\n{\n\tif (m_bEnableUndo)\n\t{\n\t\tif (m_Undo.CanUndo())\n\t\t{\n\t\t\tm_Undo.Undo();\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\treturn FALSE;\n}\n\nvoid CFX_Edit::SetCaretOrigin()\n{\n\tif (m_pVT->IsValid())\n\t{\n\t\tif (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())\n\t\t{\n\t\t\tpIterator->SetAt(m_wpCaret);\n\t\t\tCPVT_Word word;\n\t\t\tCPVT_Line line;\n\t\t\tif (pIterator->GetWord(word))\n\t\t\t{\n\t\t\t\tm_ptCaret.x = word.ptWord.x + word.fWidth;\n\t\t\t\tm_ptCaret.y = word.ptWord.y;\n\t\t\t}\n\t\t\telse if (pIterator->GetLine(line))\n\t\t\t{\t\t\t\t\n\t\t\t\tm_ptCaret.x = line.ptLine.x;\n\t\t\t\tm_ptCaret.y = line.ptLine.y;\n\t\t\t}\n\t\t}\t\t\t\t\n\t}\t\n}\n\nFX_INT32 CFX_Edit::WordPlaceToWordIndex(const CPVT_WordPlace & place) const\n{\n\tif (m_pVT->IsValid())\n\t\treturn m_pVT->WordPlaceToWordIndex(place);\n\n\treturn -1;\n}\n\nCPVT_WordPlace CFX_Edit::WordIndexToWordPlace(FX_INT32 index) const\n{\n\tif (m_pVT->IsValid())\n\t\treturn m_pVT->WordIndexToWordPlace(index);\n\n\treturn CPVT_WordPlace();\n}\n\nFX_BOOL\tCFX_Edit::IsTextFull() const\n{\n\tFX_INT32 nTotalWords = m_pVT->GetTotalWords();\n\tFX_INT32 nLimitChar = m_pVT->GetLimitChar();\n\tFX_INT32 nCharArray = m_pVT->GetCharArray();\n\n\treturn IsTextOverflow() || (nLimitChar>0 && nTotalWords >= nLimitChar)\n\t\t|| (nCharArray>0 && nTotalWords >= nCharArray);\n}\n\nFX_BOOL\tCFX_Edit::IsTextOverflow() const\n{\n\tif (!m_bEnableScroll && !m_bEnableOverflow)\n\t{\n\t\tCPDF_Rect rcPlate = m_pVT->GetPlateRect();\n\t\tCPDF_Rect rcContent = m_pVT->GetContentRect();\n\n\t\tif (m_pVT->IsMultiLine() && GetTotalLines() > 1)\n\t\t{\n\t\t\tif (FX_EDIT_IsFloatBigger(rcContent.Height(),rcPlate.Height())) return TRUE;\n\t\t}\n\n\t\tif (FX_EDIT_IsFloatBigger(rcContent.Width(),rcPlate.Width())) return TRUE;\n\t}\n\n\treturn FALSE;\n}\n\nCPVT_WordPlace CFX_Edit::GetLineBeginPlace(const CPVT_WordPlace & place) const\n{\n\treturn m_pVT->GetLineBeginPlace(place);\n}\n\nCPVT_WordPlace CFX_Edit::GetLineEndPlace(const CPVT_WordPlace & place) const\n{\n\treturn m_pVT->GetLineEndPlace(place);\n}\n\nCPVT_WordPlace CFX_Edit::GetSectionBeginPlace(const CPVT_WordPlace & place) const\n{\n\treturn m_pVT->GetSectionBeginPlace(place);\n}\n\nCPVT_WordPlace CFX_Edit::GetSectionEndPlace(const CPVT_WordPlace & place) const\n{\n\treturn m_pVT->GetSectionEndPlace(place);\n}\n\nFX_BOOL\tCFX_Edit::CanUndo() const\n{\n\tif (m_bEnableUndo)\n\t{\n\t\treturn m_Undo.CanUndo();\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL\tCFX_Edit::CanRedo() const\n{\n\tif (m_bEnableUndo)\n\t{\n\t\treturn m_Undo.CanRedo();\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL\tCFX_Edit::IsModified() const\n{\n\tif (m_bEnableUndo)\n\t{\n\t\treturn m_Undo.IsModified();\n\t}\n\n\treturn FALSE;\n}\n\nvoid CFX_Edit::EnableRefresh(FX_BOOL bRefresh)\n{\n\tm_bEnableRefresh = bRefresh;\n}\n\nvoid CFX_Edit::EnableUndo(FX_BOOL bUndo)\n{\n\tthis->m_bEnableUndo = bUndo;\n}\n\nvoid CFX_Edit::EnableNotify(FX_BOOL bNotify)\n{\n\tthis->m_bNotify = bNotify;\n}\n\nvoid CFX_Edit::EnableOprNotify(FX_BOOL bNotify)\n{\n\tthis->m_bOprNotify = bNotify;\n}\n\nFX_FLOAT CFX_Edit::GetLineTop(const CPVT_WordPlace& place) const\n{\n\tif (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator())\n\t{\n\t\tCPVT_WordPlace wpOld = pIterator->GetAt();\n\n\t\tpIterator->SetAt(place);\n\t\tCPVT_Line line;\n\t\tpIterator->GetLine(line);\n\n\t\tpIterator->SetAt(wpOld);\n\n\t\treturn line.ptLine.y + line.fLineAscent;\n\t}\n\n\treturn 0.0f;\n}\n\nFX_FLOAT CFX_Edit::GetLineBottom(const CPVT_WordPlace& place) const\n{\n\tif (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator())\n\t{\n\t\tCPVT_WordPlace wpOld = pIterator->GetAt();\n\n\t\tpIterator->SetAt(place);\n\t\tCPVT_Line line;\n\t\tpIterator->GetLine(line);\n\n\t\tpIterator->SetAt(wpOld);\n\n\t\treturn line.ptLine.y + line.fLineDescent;\n\t}\n\n\treturn 0.0f;\n}\n\nCPVT_WordPlace CFX_Edit::DoInsertText(const CPVT_WordPlace& place, FX_LPCWSTR text, FX_INT32 charset, \n\t\t\t\t\t\t\t\t\t  const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps)\n{\n\tCPVT_WordPlace wp = place;\n\n\tif (m_pVT->IsValid())\n\t{\n\t\tCFX_WideString sText = text;\n\n\t\tfor (FX_INT32 i = 0, sz = sText.GetLength(); i < sz; i++)\n\t\t{\n\t\t\tFX_WORD word = sText[i];\n\t\t\tswitch (word)\n\t\t\t{\n\t\t\tcase 0x0D:\n\t\t\t\twp = m_pVT->InsertSection(wp,pSecProps,pWordProps);\n\t\t\t\tif (sText[i+1] == 0x0A)\n\t\t\t\t\ti++;\n\t\t\t\tbreak;\n\t\t\tcase 0x0A:\t\n\t\t\t\twp = m_pVT->InsertSection(wp,pSecProps,pWordProps);\n\t\t\t\tif (sText[i+1] == 0x0D)\n\t\t\t\t\ti++;\n\t\t\t\tbreak;\n\t\t\tcase 0x09:\n\t\t\t\tword = 0x20;\n\t\t\tdefault:\n\t\t\t\twp = m_pVT->InsertWord(wp,word,GetCharSetFromUnicode(word, charset),pWordProps);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn wp;\n}\n\nFX_INT32 CFX_Edit::GetCharSetFromUnicode(FX_WORD word, FX_INT32 nOldCharset)\n{\n\tif (IFX_Edit_FontMap* pFontMap = this->GetFontMap())\n\t\treturn pFontMap->CharSetFromUnicode(word, nOldCharset);\n\telse\n\t\treturn nOldCharset;\n}\n\nvoid CFX_Edit::BeginGroupUndo(const CFX_WideString& sTitle)\n{\n\tASSERT(m_pGroupUndoItem == NULL);\n\n\tm_pGroupUndoItem = new CFX_Edit_GroupUndoItem(sTitle);\n}\n\nvoid CFX_Edit::EndGroupUndo()\n{\n\tASSERT(m_pGroupUndoItem != NULL);\n\n\tm_pGroupUndoItem->UpdateItems();\n\tm_Undo.AddItem(m_pGroupUndoItem);\n\tif (m_bOprNotify && m_pOprNotify)\n\t\tm_pOprNotify->OnAddUndo(m_pGroupUndoItem);\n\tm_pGroupUndoItem = NULL;\n}\n\nvoid CFX_Edit::AddEditUndoItem(CFX_Edit_UndoItem* pEditUndoItem)\n{\n\tif (m_pGroupUndoItem)\n\t\tm_pGroupUndoItem->AddUndoItem(pEditUndoItem);\n\telse\n\t{\n\t\tm_Undo.AddItem(pEditUndoItem);\n\t\tif (m_bOprNotify && m_pOprNotify)\n\t\t\tm_pOprNotify->OnAddUndo(pEditUndoItem);\n\t}\n}\n\nvoid CFX_Edit::AddUndoItem(IFX_Edit_UndoItem* pUndoItem)\n{\n\tm_Undo.AddItem(pUndoItem);\n\tif (m_bOprNotify && m_pOprNotify)\n\t\tm_pOprNotify->OnAddUndo(pUndoItem);\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/fxedit/fxet_list.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxedit/fxet_stub.h\"\n#include \"../../include/fxedit/fxet_edit.h\"\n#include \"../../include/fxedit/fxet_list.h\"\n\n/* ------------------------------- CFX_ListItem ---------------------------------- */\n\nCFX_ListItem::CFX_ListItem() : m_pEdit(NULL),\n\tm_bSelected(FALSE),\n\tm_bCaret(FALSE),\n\tm_rcListItem(0.0f,0.0f,0.0f,0.0f)\n{\n\tm_pEdit = IFX_Edit::NewEdit();\n\tASSERT(m_pEdit != NULL);\n\n\tm_pEdit->SetAlignmentV(1);\n\tm_pEdit->Initialize();\n}\n\nCFX_ListItem::~CFX_ListItem()\n{\n\tIFX_Edit::DelEdit(m_pEdit);\n}\n\nvoid CFX_ListItem::SetFontMap(IFX_Edit_FontMap * pFontMap)\n{\n\tif (m_pEdit)\n\t\tm_pEdit->SetFontMap(pFontMap);\n}\n\nIFX_Edit* CFX_ListItem::GetEdit() const\n{\n\treturn m_pEdit;\n}\n\nIFX_Edit_Iterator*\tCFX_ListItem::GetIterator() const\n{\n\tif (m_pEdit)\n\t\treturn m_pEdit->GetIterator();\n\n\treturn NULL;\n}\n\nvoid CFX_ListItem::SetRect(const CLST_Rect & rect)\n{\n\tm_rcListItem = rect;\n}\n\nCLST_Rect CFX_ListItem::GetRect() const\n{\n\treturn m_rcListItem;\n}\n\nFX_BOOL CFX_ListItem::IsSelected() const\n{\n\treturn m_bSelected;\n}\n\nvoid CFX_ListItem::SetSelect(FX_BOOL bSelected)\n{\n\tm_bSelected = bSelected;\n}\n\nFX_BOOL CFX_ListItem::IsCaret() const\n{\n\treturn m_bCaret;\n}\n\nvoid CFX_ListItem::SetCaret(FX_BOOL bCaret)\n{\n\tm_bCaret = bCaret;\n}\n\nvoid CFX_ListItem::SetText(FX_LPCWSTR text)\n{\n\tif (m_pEdit)\n\t\tm_pEdit->SetText(text);\n}\n\nvoid CFX_ListItem::SetFontSize(FX_FLOAT fFontSize)\n{\n\tif (m_pEdit)\n\t\tm_pEdit->SetFontSize(fFontSize);\n}\n\nFX_FLOAT CFX_ListItem::GetItemHeight() const\n{\n\tif (m_pEdit)\n\t\treturn m_pEdit->GetContentRect().Height();\n\n\treturn 0.0f;\n}\n\nFX_WORD CFX_ListItem::GetFirstChar() const\n{\n\tCPVT_Word word;\n\n\tif (IFX_Edit_Iterator*\tpIterator = GetIterator())\n\t{\n\t\tpIterator->SetAt(1);\t\t\n\t\tpIterator->GetWord(word);\n\t}\n\n\treturn word.Word;\n}\n\nCFX_WideString CFX_ListItem::GetText() const\n{\n\tif (m_pEdit)\n\t\treturn m_pEdit->GetText();\n\n\treturn L\"\";\n}\n\n/* ------------------------------------ CFX_List --------------------------------- */\n\nCFX_List::CFX_List() : m_pFontMap(NULL), m_fFontSize(0.0f), m_bMultiple(FALSE) \n{\n}\n\nCFX_List::~CFX_List()\n{\n\tEmpty();\n}\n\nvoid CFX_List::Empty()\n{\n\tfor (FX_INT32 i=0,sz=m_aListItems.GetSize(); i<sz; i++)\n\t\tdelete m_aListItems.GetAt(i);\n\n\tm_aListItems.RemoveAll();\n}\n\nvoid CFX_List::SetFontMap(IFX_Edit_FontMap * pFontMap)\n{\n\tm_pFontMap = pFontMap;\n}\n\nvoid CFX_List::SetFontSize(FX_FLOAT fFontSize)\n{\n\tm_fFontSize = fFontSize;\n}\n\nvoid CFX_List::AddItem(FX_LPCWSTR str)\n{\t\n\tif (CFX_ListItem * pListItem = new CFX_ListItem())\n\t{\n\t\tpListItem->SetFontMap(m_pFontMap);\n\t\tpListItem->SetFontSize(m_fFontSize);\n\t\tpListItem->SetText(str);\n\t\tm_aListItems.Add(pListItem);\n\t}\n}\n\nvoid CFX_List::ReArrange(FX_INT32 nItemIndex)\n{\n\tFX_FLOAT fPosY = 0.0f;\n\n\tif (CFX_ListItem * pPrevItem = m_aListItems.GetAt(nItemIndex - 1))\n\t\tfPosY = pPrevItem->GetRect().bottom;\n\t\n\tfor (FX_INT32 i=nItemIndex,sz=m_aListItems.GetSize(); i<sz; i++)\n\t{\n\t\tif (CFX_ListItem * pListItem = m_aListItems.GetAt(i))\n\t\t{\n\t\t\tFX_FLOAT fListItemHeight = pListItem->GetItemHeight();\n\t\t\tpListItem->SetRect(CLST_Rect(0.0f,fPosY,0.0f,fPosY + fListItemHeight));\n\t\t\tfPosY += fListItemHeight;\t\t\t\n\t\t}\n\t}\n\n\tSetContentRect(CLST_Rect(0.0f,0.0f,0.0f,fPosY));\t\n}\n\nIFX_Edit * CFX_List::GetItemEdit(FX_INT32 nIndex) const\n{\n\tif (CFX_ListItem * pListItem = m_aListItems.GetAt(nIndex))\n\t{\n\t\treturn pListItem->GetEdit();\n\t}\n\n\treturn NULL;\n}\n\nFX_INT32 CFX_List::GetCount() const\n{\n\treturn m_aListItems.GetSize();\n}\n\nCPDF_Rect CFX_List::GetPlateRect() const\n{\n\treturn CFX_ListContainer::GetPlateRect();\n}\n\nCPDF_Rect CFX_List::GetContentRect() const\n{\n\treturn InnerToOuter(CFX_ListContainer::GetContentRect());\n}\n\nFX_FLOAT CFX_List::GetFontSize() const\n{\n\treturn m_fFontSize;\n}\n\nFX_INT32 CFX_List::GetItemIndex(const CPDF_Point & point) const\n{\n\tCPDF_Point pt = OuterToInner(point);\n\n\tFX_BOOL bFirst = TRUE;\n\tFX_BOOL bLast = TRUE;\n\n\tfor (FX_INT32 i=0,sz=m_aListItems.GetSize(); i<sz; i++)\n\t{\n\t\tif (CFX_ListItem * pListItem = m_aListItems.GetAt(i))\n\t\t{\n\t\t\tCLST_Rect rcListItem = pListItem->GetRect();\n\n\t\t\tif (FX_EDIT_IsFloatBigger(pt.y, rcListItem.top))\n\t\t\t{\t\t\t\n\t\t\t\tbFirst = FALSE;\n\t\t\t}\n\n\t\t\tif (FX_EDIT_IsFloatSmaller(pt.y, rcListItem.bottom))\n\t\t\t{\n\t\t\t\tbLast = FALSE;\n\t\t\t}\n\n\t\t\tif (pt.y >= rcListItem.top && pt.y < rcListItem.bottom)\n\t\t\t{\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (bFirst) return 0;\n\tif (bLast) return m_aListItems.GetSize()-1;\n\n\treturn -1;\n}\n\nFX_FLOAT CFX_List::GetFirstHeight() const\n{\n\tif (CFX_ListItem * pListItem = m_aListItems.GetAt(0))\n\t{\n\t\treturn pListItem->GetItemHeight();\n\t}\n\n\treturn 1.0f;\n}\n\nFX_INT32 CFX_List::GetFirstSelected() const\n{\n\tfor (FX_INT32 i=0,sz=m_aListItems.GetSize(); i<sz; i++)\n\t{\n\t\tif (CFX_ListItem * pListItem = m_aListItems.GetAt(i))\n\t\t{\n\t\t\tif (pListItem->IsSelected())\n\t\t\t\treturn i;\n\t\t}\n\t}\n\treturn -1;\n}\n\nFX_INT32 CFX_List::GetLastSelected() const\n{\n\tfor (FX_INT32 i=m_aListItems.GetSize()-1; i>=0; i--)\n\t{\n\t\tif (CFX_ListItem * pListItem = m_aListItems.GetAt(i))\n\t\t{\n\t\t\tif (pListItem->IsSelected())\n\t\t\t\treturn i;\n\t\t}\n\t}\n\treturn -1;\n}\n\nFX_WCHAR CFX_List::Toupper(FX_WCHAR c) const\n{\n\tif ( (c >= 'a') && (c <= 'z') )\n\t\tc = c - ('a' - 'A');\n\treturn c;\n}\n\nFX_INT32 CFX_List::FindNext(FX_INT32 nIndex,FX_WCHAR nChar) const\n{\n\tFX_INT32 nCircleIndex = nIndex;\n\n\tfor (FX_INT32 i=0,sz=m_aListItems.GetSize(); i<sz; i++)\n\t{\n\t\tnCircleIndex ++;\n\t\tif (nCircleIndex >= sz) nCircleIndex = 0;\n\n\t\tif (CFX_ListItem * pListItem = m_aListItems.GetAt(nCircleIndex))\n\t\t{\n\t\t\tif (Toupper(pListItem->GetFirstChar()) == Toupper(nChar))\n\t\t\t\treturn nCircleIndex;\n\t\t}\n\t}\n\n\treturn nCircleIndex;\n}\n\nCPDF_Rect CFX_List::GetItemRect(FX_INT32 nIndex) const\n{\n\tif (CFX_ListItem * pListItem = m_aListItems.GetAt(nIndex))\n\t{\n\t\tCPDF_Rect rcItem = pListItem->GetRect();\n\t\trcItem.left = 0.0f;\n\t\trcItem.right = GetPlateRect().Width();\n\t\treturn InnerToOuter(rcItem);\n\t}\n\n\treturn CPDF_Rect();\n}\n\nFX_BOOL CFX_List::IsItemSelected(FX_INT32 nIndex) const\n{\n\tif (CFX_ListItem * pListItem = m_aListItems.GetAt(nIndex))\n\t{\n\t\treturn pListItem->IsSelected();\n\t}\n\n\treturn FALSE;\n}\n\nvoid CFX_List::SetItemSelect(FX_INT32 nItemIndex, FX_BOOL bSelected)\n{\n\tif (CFX_ListItem * pListItem = m_aListItems.GetAt(nItemIndex))\n\t{\n\t\tpListItem->SetSelect(bSelected);\n\t}\n}\n\nvoid CFX_List::SetItemCaret(FX_INT32 nItemIndex, FX_BOOL bCaret)\n{\n\tif (CFX_ListItem * pListItem = m_aListItems.GetAt(nItemIndex))\n\t{\n\t\tpListItem->SetCaret(bCaret);\t\t\n\t}\n}\n\nvoid CFX_List::SetMultipleSel(FX_BOOL bMultiple)\n{\n\tm_bMultiple = bMultiple;\n}\n\nFX_BOOL CFX_List::IsMultipleSel() const\n{\n\treturn m_bMultiple;\n}\n\nFX_BOOL CFX_List::IsValid(FX_INT32 nItemIndex) const\n{\n\treturn nItemIndex >= 0 && nItemIndex < m_aListItems.GetSize();\n}\n\nCFX_WideString CFX_List::GetItemText(FX_INT32 nIndex) const\n{\n\tif (CFX_ListItem * pListItem = m_aListItems.GetAt(nIndex))\n\t{\n\t\treturn pListItem->GetText();\n\t}\n\n\treturn L\"\";\n}\n\n/* ------------------------------------ CPLST_Select ---------------------------------- */\n\nCPLST_Select::CPLST_Select()\n{\n}\n\nCPLST_Select::~CPLST_Select()\n{\n\tfor (FX_INT32 i=0,sz=m_aItems.GetSize(); i<sz; i++)\n\t\tdelete m_aItems.GetAt(i);\n\n\tm_aItems.RemoveAll();\n}\n\nvoid CPLST_Select::Add(FX_INT32 nItemIndex)\n{\n\tFX_INT32 nIndex = Find(nItemIndex);\n\n\tif (nIndex < 0) \n\t\tm_aItems.Add(new CPLST_Select_Item(nItemIndex,1));\n\telse\n\t{\n\t\tif (CPLST_Select_Item * pItem = m_aItems.GetAt(nIndex))\n\t\t{\n\t\t\tpItem->nState = 1;\n\t\t}\n\t}\n}\n\nvoid CPLST_Select::Add(FX_INT32 nBeginIndex, FX_INT32 nEndIndex)\n{\n\tif (nBeginIndex > nEndIndex)\n\t{\n\t\tFX_INT32 nTemp = nEndIndex;\n\t\tnEndIndex = nBeginIndex;\n\t\tnBeginIndex = nTemp;\n\t}\n\n\tfor (FX_INT32 i=nBeginIndex; i<=nEndIndex; i++)\tAdd(i);\n}\n\nvoid CPLST_Select::Sub(FX_INT32 nItemIndex)\n{\n\tfor (FX_INT32 i=m_aItems.GetSize()-1; i>=0; i--)\n\t{\n\t\tif (CPLST_Select_Item * pItem = m_aItems.GetAt(i))\n\t\t\tif (pItem->nItemIndex == nItemIndex)\n\t\t\t\tpItem->nState = -1;\n\t}\n}\n\nvoid CPLST_Select::Sub(FX_INT32 nBeginIndex, FX_INT32 nEndIndex)\n{\n\tif (nBeginIndex > nEndIndex)\n\t{\n\t\tFX_INT32 nTemp = nEndIndex;\n\t\tnEndIndex = nBeginIndex;\n\t\tnBeginIndex = nTemp;\n\t}\n\n\tfor (FX_INT32 i=nBeginIndex; i<=nEndIndex; i++)\tSub(i);\n}\n\nFX_INT32 CPLST_Select::Find(FX_INT32 nItemIndex) const\n{\n\tfor (FX_INT32 i=0,sz=m_aItems.GetSize(); i<sz; i++)\n\t{\n\t\tif (CPLST_Select_Item * pItem = m_aItems.GetAt(i))\n\t\t{\n\t\t\tif (pItem->nItemIndex == nItemIndex)\n\t\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\nFX_BOOL CPLST_Select::IsExist(FX_INT32 nItemIndex) const\n{\n\treturn Find(nItemIndex) >= 0;\n}\n\nFX_INT32 CPLST_Select::GetCount() const\n{\n\treturn m_aItems.GetSize();\n}\n\nFX_INT32 CPLST_Select::GetItemIndex(FX_INT32 nIndex) const\n{\n\tif (nIndex >= 0 && nIndex < m_aItems.GetSize())\n\t\tif (CPLST_Select_Item * pItem = m_aItems.GetAt(nIndex))\n\t\t\treturn pItem->nItemIndex;\n\n\treturn -1;\n}\n\nFX_INT32 CPLST_Select::GetState(FX_INT32 nIndex) const\n{\n\tif (nIndex >= 0 && nIndex < m_aItems.GetSize())\n\t\tif (CPLST_Select_Item * pItem = m_aItems.GetAt(nIndex))\n\t\t\treturn pItem->nState;\n\n\treturn 0;\n}\n\nvoid CPLST_Select::DeselectAll()\n{\n\tfor (FX_INT32 i=0,sz=m_aItems.GetSize(); i<sz; i++)\n\t{\n\t\tif (CPLST_Select_Item * pItem = m_aItems.GetAt(i))\n\t\t{\n\t\t\tpItem->nState = -1;\n\t\t}\n\t}\n}\n\nvoid CPLST_Select::Done()\n{\n\tfor (FX_INT32 i=m_aItems.GetSize()-1; i>=0; i--)\n\t{\t\n\t\tif (CPLST_Select_Item * pItem = m_aItems.GetAt(i))\n\t\t{\n\t\t\tif (pItem->nState == -1)\n\t\t\t{\n\t\t\t\tdelete pItem;\n\t\t\t\tm_aItems.RemoveAt(i);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpItem->nState = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/* ------------------------------------ CFX_ListCtrl --------------------------------- */\n\nCFX_ListCtrl::CFX_ListCtrl() : m_pNotify(NULL),\n\tm_ptScrollPos(0.0f,0.0f),\n\tm_nSelItem(-1),\n\tm_nFootIndex(-1),\n\tm_bCtrlSel(FALSE),\t\n\tm_nCaretIndex(-1),\n\tm_bNotifyFlag(FALSE)\n{\n}\n\nCFX_ListCtrl::~CFX_ListCtrl()\n{\n}\n\nvoid CFX_ListCtrl::SetNotify(IFX_List_Notify * pNotify)\n{\n\tm_pNotify = pNotify;\n}\n\nCPDF_Point CFX_ListCtrl::InToOut(const CPDF_Point & point) const\n{\n\tCPDF_Rect rcPlate = GetPlateRect();\n\n\treturn CPDF_Point(point.x - (m_ptScrollPos.x - rcPlate.left),\n\t\tpoint.y - (m_ptScrollPos.y - rcPlate.top));\n}\n\nCPDF_Point CFX_ListCtrl::OutToIn(const CPDF_Point & point) const\n{\n\tCPDF_Rect rcPlate = GetPlateRect();\n\n\treturn CPDF_Point(point.x + (m_ptScrollPos.x - rcPlate.left),\n\t\tpoint.y + (m_ptScrollPos.y - rcPlate.top));\n}\n\nCPDF_Rect CFX_ListCtrl::InToOut(const CPDF_Rect & rect) const\n{\n\tCPDF_Point ptLeftBottom = InToOut(CPDF_Point(rect.left,rect.bottom));\n\tCPDF_Point ptRightTop = InToOut(CPDF_Point(rect.right,rect.top));\n\n\treturn CPDF_Rect(ptLeftBottom.x,ptLeftBottom.y,ptRightTop.x,ptRightTop.y);\n}\n\nCPDF_Rect CFX_ListCtrl::OutToIn(const CPDF_Rect & rect) const\n{\n\tCPDF_Point ptLeftBottom = OutToIn(CPDF_Point(rect.left,rect.bottom));\n\tCPDF_Point ptRightTop = OutToIn(CPDF_Point(rect.right,rect.top));\n\n\treturn CPDF_Rect(ptLeftBottom.x,ptLeftBottom.y,ptRightTop.x,ptRightTop.y);\n}\n\nvoid CFX_ListCtrl::OnMouseDown(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl)\n{\n\tFX_INT32 nHitIndex = this->GetItemIndex(point);\n\n\tif (IsMultipleSel())\n\t{\n\t\tif (bCtrl)\n\t\t{\n\t\t\tif (IsItemSelected(nHitIndex))\n\t\t\t{\n\t\t\t\tm_aSelItems.Sub(nHitIndex);\n\t\t\t\tSelectItems();\n\t\t\t\tm_bCtrlSel = FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_aSelItems.Add(nHitIndex);\n\t\t\t\tSelectItems();\n\t\t\t\tm_bCtrlSel = TRUE;\n\t\t\t}\t\t\n\t\t\t\n\t\t\tm_nFootIndex = nHitIndex;\n\t\t}\n\t\telse if (bShift)\n\t\t{\n\t\t\tm_aSelItems.DeselectAll();\n\t\t\tm_aSelItems.Add(m_nFootIndex,nHitIndex);\n\t\t\tSelectItems();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_aSelItems.DeselectAll();\n\t\t\tm_aSelItems.Add(nHitIndex);\n\t\t\tSelectItems();\n\n\t\t\tm_nFootIndex = nHitIndex;\n\t\t}\n\n\t\tSetCaret(nHitIndex);\n\t}\n\telse\n\t{\n\t\tSetSingleSelect(nHitIndex);\n\t}\n\n\tif (!this->IsItemVisible(nHitIndex))\n\t\tthis->ScrollToListItem(nHitIndex);\n}\n\nvoid CFX_ListCtrl::OnMouseMove(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl)\n{\n\tFX_INT32 nHitIndex = this->GetItemIndex(point);\n\n\tif (IsMultipleSel())\n\t{\t\t\t\n\t\tif (bCtrl)\n\t\t{\n\t\t\tif (m_bCtrlSel)\n\t\t\t\tm_aSelItems.Add(m_nFootIndex,nHitIndex);\n\t\t\telse\n\t\t\t\tm_aSelItems.Sub(m_nFootIndex,nHitIndex);\t\t\t\n\t\t\t\n\t\t\tSelectItems();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_aSelItems.DeselectAll();\n\t\t\tm_aSelItems.Add(m_nFootIndex,nHitIndex);\n\t\t\tSelectItems();\n\t\t}\n\n\t\tSetCaret(nHitIndex);\n\t}\n\telse\n\t{\n\t\tSetSingleSelect(nHitIndex);\n\t}\n\n\tif (!this->IsItemVisible(nHitIndex))\n\t\tthis->ScrollToListItem(nHitIndex);\n}\n\nvoid CFX_ListCtrl::OnVK(FX_INT32 nItemIndex,FX_BOOL bShift,FX_BOOL bCtrl)\n{\n\tif (IsMultipleSel())\n\t{\n\t\tif (nItemIndex >= 0 && nItemIndex < GetCount())\n\t\t{\n\t\t\tif (bCtrl)\n\t\t\t{\n\t\t\t}\n\t\t\telse if (bShift)\n\t\t\t{\n\t\t\t\tm_aSelItems.DeselectAll();\n\t\t\t\tm_aSelItems.Add(m_nFootIndex,nItemIndex);\n\t\t\t\tSelectItems();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_aSelItems.DeselectAll();\n\t\t\t\tm_aSelItems.Add(nItemIndex);\n\t\t\t\tSelectItems();\n\t\t\t\tm_nFootIndex = nItemIndex;\n\t\t\t}\n\n\t\t\tSetCaret(nItemIndex);\t\n\t\t}\n\t}\n\telse\n\t{\n\t\tSetSingleSelect(nItemIndex);\n\t}\n\n\tif (!this->IsItemVisible(nItemIndex))\n\t\tthis->ScrollToListItem(nItemIndex);\n}\n\nvoid CFX_ListCtrl::OnVK_UP(FX_BOOL bShift,FX_BOOL bCtrl)\n{\n\tOnVK(IsMultipleSel() ? GetCaret()-1 : GetSelect()-1, bShift, bCtrl);\n}\n\nvoid CFX_ListCtrl::OnVK_DOWN(FX_BOOL bShift,FX_BOOL bCtrl)\n{\n\tOnVK(IsMultipleSel() ? GetCaret()+1 : GetSelect()+1, bShift, bCtrl);\n}\n\nvoid CFX_ListCtrl::OnVK_LEFT(FX_BOOL bShift,FX_BOOL bCtrl)\n{\n\tOnVK(0, bShift, bCtrl);\n}\n\nvoid CFX_ListCtrl::OnVK_RIGHT(FX_BOOL bShift,FX_BOOL bCtrl)\n{\n\tOnVK(GetCount()-1, bShift, bCtrl);\n}\n\nvoid CFX_ListCtrl::OnVK_HOME(FX_BOOL bShift,FX_BOOL bCtrl)\n{\n\tOnVK(0, bShift, bCtrl);\n}\n\nvoid CFX_ListCtrl::OnVK_END(FX_BOOL bShift,FX_BOOL bCtrl)\n{\n\tOnVK(GetCount()-1, bShift, bCtrl);\n}\n\nFX_BOOL\tCFX_ListCtrl::OnChar(FX_WORD nChar,FX_BOOL bShift,FX_BOOL bCtrl)\n{\n\tFX_INT32 nIndex = GetLastSelected();\t\n\tFX_INT32 nFindIndex = FindNext(nIndex,nChar);\n\n\tif (nFindIndex != nIndex)\n\t{\n\t\tOnVK(nFindIndex, bShift, bCtrl);\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}\n\n/* -------- inner methods ------- */\n\nvoid CFX_ListCtrl::SetPlateRect(const CPDF_Rect & rect)\n{\n\tCFX_ListContainer::SetPlateRect(rect);\n\tm_ptScrollPos.x = rect.left;\n\tSetScrollPos(CPDF_Point(rect.left,rect.top));\t\n\tReArrange(0);\n\tInvalidateItem(-1);\n}\n\nCPDF_Rect CFX_ListCtrl::GetItemRect(FX_INT32 nIndex) const\n{\n\treturn InToOut(CFX_List::GetItemRect(nIndex));\n}\n\nvoid CFX_ListCtrl::AddString(FX_LPCWSTR string)\n{\n\tAddItem(string);\n\tReArrange(GetCount() - 1);\n}\n\nvoid CFX_ListCtrl::SetMultipleSelect(FX_INT32 nItemIndex, FX_BOOL bSelected)\n{\n\tif (!IsValid(nItemIndex)) return;\n\n\tif (bSelected != this->IsItemSelected(nItemIndex))\n\t{\n\t\tif (bSelected)\n\t\t{\n\t\t\tSetItemSelect(nItemIndex,TRUE);\n\t\t\tInvalidateItem(nItemIndex);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSetItemSelect(nItemIndex,FALSE);\n\t\t\tInvalidateItem(nItemIndex);\n\t\t}\n\t}\n}\n\nvoid CFX_ListCtrl::SetSingleSelect(FX_INT32 nItemIndex)\n{\n\tif (!IsValid(nItemIndex)) return;\n\n\tif (m_nSelItem != nItemIndex)\n\t{\n\t\tif (m_nSelItem >= 0)\n\t\t{\n\t\t\tSetItemSelect(m_nSelItem,FALSE);\n\t\t\tInvalidateItem(m_nSelItem);\n\t\t}\n\t\t\n\t\tSetItemSelect(nItemIndex,TRUE);\n\t\tInvalidateItem(nItemIndex);\n\t\tm_nSelItem = nItemIndex;\t\t\n\t}\n}\n\nvoid CFX_ListCtrl::SetCaret(FX_INT32 nItemIndex)\n{\n\tif (!IsValid(nItemIndex)) return;\n\n\tif (this->IsMultipleSel())\n\t{\t\t\n\t\tFX_INT32 nOldIndex = m_nCaretIndex;\n\n\t\tif (nOldIndex != nItemIndex)\n\t\t{\n\t\t\tm_nCaretIndex = nItemIndex;\n\n\t\t\tSetItemCaret(nOldIndex, FALSE);\n\t\t\tSetItemCaret(nItemIndex,TRUE);\n\n\t\t\tInvalidateItem(nOldIndex);\n\t\t\tInvalidateItem(nItemIndex);\t\t\t\n\t\t}\n\t}\n}\n\nvoid CFX_ListCtrl::InvalidateItem(FX_INT32 nItemIndex)\n{\n\tif (m_pNotify)\n\t{\n\t\tif (nItemIndex == -1)\n\t\t{\n\t\t\tif (!m_bNotifyFlag)\n\t\t\t{\n\t\t\t\tm_bNotifyFlag = TRUE;\n\t\t\t\tCPDF_Rect rcRefresh = GetPlateRect();\n\t\t\t\tm_pNotify->IOnInvalidateRect(&rcRefresh);\n\t\t\t\tm_bNotifyFlag = FALSE;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (!m_bNotifyFlag)\n\t\t\t{\n\t\t\t\tm_bNotifyFlag = TRUE;\n\t\t\t\tCPDF_Rect rcRefresh = GetItemRect(nItemIndex);\n\t\t\t\trcRefresh.left -= 1.0f;\n\t\t\t\trcRefresh.right += 1.0f;\n\t\t\t\trcRefresh.bottom -= 1.0f;\n\t\t\t\trcRefresh.top += 1.0f;\n\n\t\t\t\tm_pNotify->IOnInvalidateRect(&rcRefresh);\n\t\t\t\tm_bNotifyFlag = FALSE;\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid CFX_ListCtrl::SelectItems()\n{\n\tfor (FX_INT32 i=0,sz=m_aSelItems.GetCount(); i<sz; i++)\n\t{\n\t\tFX_INT32 nItemIndex = m_aSelItems.GetItemIndex(i);\n\t\tFX_INT32 nState = m_aSelItems.GetState(i);\n\n\t\tswitch(nState)\n\t\t{\n\t\tcase 1:\n\t\t\tSetMultipleSelect(nItemIndex, TRUE);\t\t\t\n\t\t\tbreak;\n\t\tcase -1:\n\t\t\tSetMultipleSelect(nItemIndex, FALSE);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tm_aSelItems.Done();\n}\n\nvoid CFX_ListCtrl::Select(FX_INT32 nItemIndex)\n{\n\tif (!IsValid(nItemIndex)) return;\n\n\tif (this->IsMultipleSel())\n\t{\n\t\tm_aSelItems.Add(nItemIndex);\n\t\tSelectItems();\n\t}\n\telse\n\t\tSetSingleSelect(nItemIndex);\n}\n\nFX_BOOL\tCFX_ListCtrl::IsItemVisible(FX_INT32 nItemIndex) const\n{\n\tCPDF_Rect rcPlate = this->GetPlateRect();\n\tCPDF_Rect rcItem = this->GetItemRect(nItemIndex);\n\n\treturn rcItem.bottom >= rcPlate.bottom && rcItem.top <= rcPlate.top;\n}\n\nvoid CFX_ListCtrl::ScrollToListItem(FX_INT32 nItemIndex)\n{\n\tif (!IsValid(nItemIndex)) return;\n\n\tCPDF_Rect rcPlate = this->GetPlateRect();\n\tCPDF_Rect rcItem = CFX_List::GetItemRect(nItemIndex);\n\tCPDF_Rect rcItemCtrl = GetItemRect(nItemIndex);\n\n\tif (FX_EDIT_IsFloatSmaller(rcItemCtrl.bottom, rcPlate.bottom))\n\t{\n\t\tif (FX_EDIT_IsFloatSmaller(rcItemCtrl.top, rcPlate.top))\n\t\t{\n\t\t\tSetScrollPosY(rcItem.bottom + rcPlate.Height());\n\t\t}\n\t}\n\telse if (FX_EDIT_IsFloatBigger(rcItemCtrl.top, rcPlate.top))\n\t{\n\t\tif (FX_EDIT_IsFloatBigger(rcItemCtrl.bottom, rcPlate.bottom))\n\t\t{\n\t\t\tSetScrollPosY(rcItem.top);\n\t\t}\n\t}\n}\n\nvoid CFX_ListCtrl::SetScrollInfo()\n{\n\tif (m_pNotify)\n\t{\n\t\tCPDF_Rect rcPlate = GetPlateRect();\n\t\tCPDF_Rect rcContent = CFX_List::GetContentRect();\n\n\t\tif (!m_bNotifyFlag)\n\t\t{\n\t\t\tm_bNotifyFlag = TRUE;\n\t\t\tm_pNotify->IOnSetScrollInfoY(rcPlate.bottom, rcPlate.top, \n\t\t\t\t\trcContent.bottom, rcContent.top, GetFirstHeight(), rcPlate.Height());\n\t\t\tm_bNotifyFlag = FALSE;\n\t\t}\n\t}\n}\n\nvoid CFX_ListCtrl::SetScrollPos(const CPDF_Point & point)\n{\n\tSetScrollPosY(point.y);\n}\n\nvoid CFX_ListCtrl::SetScrollPosY(FX_FLOAT fy)\n{\n\tif (!FX_EDIT_IsFloatEqual(m_ptScrollPos.y,fy))\n\t{\n\t\tCPDF_Rect rcPlate = this->GetPlateRect();\n\t\tCPDF_Rect rcContent = CFX_List::GetContentRect();\n\n\t\tif (rcPlate.Height() > rcContent.Height())\n\t\t{\n\t\t\tfy = rcPlate.top;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (FX_EDIT_IsFloatSmaller(fy - rcPlate.Height(), rcContent.bottom))\n\t\t\t{\n\t\t\t\tfy = rcContent.bottom + rcPlate.Height();\n\t\t\t}\n\t\t\telse if (FX_EDIT_IsFloatBigger(fy, rcContent.top))\n\t\t\t{\n\t\t\t\tfy = rcContent.top;\n\t\t\t}\n\t\t}\n\n\t\tm_ptScrollPos.y = fy;\n\t\tInvalidateItem(-1);\n\n\t\tif (m_pNotify) \n\t\t{\n\t\t\tif (!m_bNotifyFlag)\n\t\t\t{\n\t\t\t\tm_bNotifyFlag = TRUE;\n\t\t\t\tm_pNotify->IOnSetScrollPosY(fy);\n\t\t\t\tm_bNotifyFlag = FALSE;\n\t\t\t}\n\t\t}\n\t}\n}\n\nCPDF_Rect CFX_ListCtrl::GetContentRect() const\n{\n\treturn InToOut(CFX_List::GetContentRect());\n}\n\nvoid CFX_ListCtrl::ReArrange(FX_INT32 nItemIndex)\n{\n\tCFX_List::ReArrange(nItemIndex);\n\tSetScrollInfo();\n}\n\nvoid CFX_ListCtrl::SetTopItem(FX_INT32 nIndex)\n{\n\tif (IsValid(nIndex))\n\t{\n\t\tthis->GetPlateRect();\n\t\tCPDF_Rect rcItem = CFX_List::GetItemRect(nIndex);\n\t\tSetScrollPosY(rcItem.top);\n\t}\n}\n\nFX_INT32 CFX_ListCtrl::GetTopItem() const\n{\n\tFX_INT32 nItemIndex = this->GetItemIndex(this->GetBTPoint());\n\n\tif (!IsItemVisible(nItemIndex) && IsItemVisible(nItemIndex + 1))\n\t\t\tnItemIndex += 1;\n\n\treturn nItemIndex;\n}\n\nvoid CFX_ListCtrl::Empty()\n{\n\tCFX_List::Empty();\n\tInvalidateItem(-1);\n}\n\nvoid CFX_ListCtrl::Cancel()\n{\n\tm_aSelItems.DeselectAll();\n}\n\nFX_INT32 CFX_ListCtrl::GetItemIndex(const CPDF_Point & point) const\n{\n\treturn CFX_List::GetItemIndex(OutToIn(point));\n}\n\nCFX_WideString CFX_ListCtrl::GetText() const\n{\n\tif (this->IsMultipleSel())\n\t\treturn this->GetItemText(this->m_nCaretIndex);\t\n\telse\n\t\treturn this->GetItemText(this->m_nSelItem);\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/fxedit/fxet_module.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxedit/fxet_stub.h\"\n#include \"../../include/fxedit/fxet_edit.h\"\n#include \"../../include/fxedit/fxet_list.h\"\n\n/* ---------------------- IFX_Edit ---------------------- */\n\nIFX_Edit* IFX_Edit::NewEdit()\n{\n\tif (IPDF_VariableText * pVT = IPDF_VariableText::NewVariableText())\n\t{\n\t\treturn new CFX_Edit(pVT);\n\t}\n\n\treturn NULL;\n}\n\nvoid IFX_Edit::DelEdit(IFX_Edit* pEdit)\n{\n\tASSERT(pEdit != NULL);\n\n\tIPDF_VariableText::DelVariableText(pEdit->GetVariableText());\n\n\tdelete (CFX_Edit*)pEdit;\n}\n\n\n/* ---------------------- IFX_List ---------------------- */\n\nIFX_List* IFX_List::NewList()\n{\n\treturn new CFX_ListCtrl();\n}\n\nvoid IFX_List::DelList(IFX_List* pList)\n{\n\tASSERT(pList != NULL);\n\n\tdelete (CFX_ListCtrl*)pList;\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/fxedit/fxet_pageobjs.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/fxedit/fxet_stub.h\"\n#include \"../../include/fxedit/fx_edit.h\"\n#include \"../../include/fxedit/fxet_edit.h\"\n\n#define FX_EDIT_UNDERLINEHALFWIDTH\t\t\t\t0.5f\n#define FX_EDIT_CROSSOUTHALFWIDTH\t\t\t\t0.5f\n\nextern CFX_ByteString GetPDFWordString(IFX_Edit_FontMap * pFontMap, FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord);\n\nCPDF_Rect GetUnderLineRect(const CPVT_Word& word)\n{\n\treturn CPDF_Rect(word.ptWord.x, word.ptWord.y + word.fDescent * 0.5f,\n\t\t\t\t\t\tword.ptWord.x + word.fWidth, word.ptWord.y + word.fDescent * 0.25f);\n}\n\nCPDF_Rect GetCrossoutRect(const CPVT_Word& word)\n{\n\treturn CPDF_Rect(word.ptWord.x, word.ptWord.y + (word.fAscent + word.fDescent) * 0.5f + word.fDescent * 0.25f,\n\t\t\t\t\t\t\tword.ptWord.x + word.fWidth, word.ptWord.y + (word.fAscent + word.fDescent) * 0.5f);\n}\n\nstatic void DrawTextString(CFX_RenderDevice* pDevice, const CPDF_Point& pt, CPDF_Font* pFont, FX_FLOAT fFontSize, CPDF_Matrix* pUser2Device,\n\t\t\t\t\t  const CFX_ByteString& str, FX_ARGB crTextFill, FX_ARGB crTextStroke, FX_INT32 nHorzScale)\n{\n\tFX_FLOAT x = pt.x, y = pt.y;\n\tpUser2Device->Transform(x, y);\n\n\tif (pFont)\n\t{\n\t\tif (nHorzScale != 100)\n\t\t{\n\t\t\tCPDF_Matrix mt(nHorzScale/100.0f,0,0,1,0,0);\n\t\t\tmt.Concat(*pUser2Device);\n\n\t\t\tCPDF_RenderOptions ro;\n\t\t\tro.m_Flags = RENDER_CLEARTYPE;\n\t\t\tro.m_ColorMode = RENDER_COLOR_NORMAL;\n\n\t\t\tif (crTextStroke != 0)\n\t\t\t{\n\t\t\t\tCPDF_Point pt1(0,0), pt2(1,0);\n\t\t\t\tpUser2Device->Transform(pt1.x, pt1.y);\n\t\t\t\tpUser2Device->Transform(pt2.x, pt2.y);\n\t\t\t\tCFX_GraphStateData gsd;\n\t\t\t\tgsd.m_LineWidth = (FX_FLOAT)FXSYS_fabs((pt2.x + pt2.y) - (pt1.x + pt1.y));\n\n\t\t\t\tCPDF_TextRenderer::DrawTextString(pDevice,x, y, pFont, fFontSize, &mt, str, crTextFill, crTextStroke, &gsd, &ro);\n\t\t\t}\n\t\t\telse\n\t\t\t\tCPDF_TextRenderer::DrawTextString(pDevice,x, y, pFont, fFontSize, &mt, str, crTextFill, 0, NULL, &ro);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tCPDF_RenderOptions ro;\n\t\t\tro.m_Flags = RENDER_CLEARTYPE;\n\t\t\tro.m_ColorMode = RENDER_COLOR_NORMAL;\n\n\t\t\tif (crTextStroke != 0)\n\t\t\t{\n\t\t\t\tCPDF_Point pt1(0,0), pt2(1,0);\n\t\t\t\tpUser2Device->Transform(pt1.x, pt1.y);\n\t\t\t\tpUser2Device->Transform(pt2.x, pt2.y);\n\t\t\t\tCFX_GraphStateData gsd;\n\t\t\t\tgsd.m_LineWidth = (FX_FLOAT)FXSYS_fabs((pt2.x + pt2.y) - (pt1.x + pt1.y));\n\n\t\t\t\tCPDF_TextRenderer::DrawTextString(pDevice,x, y, pFont, fFontSize, pUser2Device, str, crTextFill, crTextStroke, &gsd, &ro);\n\t\t\t}\n\t\t\telse\n\t\t\t\tCPDF_TextRenderer::DrawTextString(pDevice,x, y, pFont, fFontSize, pUser2Device, str, crTextFill, 0, NULL, &ro);\n\t\t}\n\t}\n}\n\nvoid IFX_Edit::DrawUnderline(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit, FX_COLORREF color,\n\t\t\t\t\t\t\t\tconst CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange)\n{\n\tpDevice->SaveState();\n\n\tif (!rcClip.IsEmpty())\n\t{\n\t\tCPDF_Rect rcTemp = rcClip;\n\t\tpUser2Device->TransformRect(rcTemp);\n\t\tFX_RECT rcDevClip;\n\t\trcDevClip.left = (FX_INT32)rcTemp.left;\n\t\trcDevClip.right = (FX_INT32)rcTemp.right;\n\t\trcDevClip.top = (FX_INT32)rcTemp.top;\n\t\trcDevClip.bottom = (FX_INT32)rcTemp.bottom;\n\t\tpDevice->SetClip_Rect(&rcDevClip);\n\t}\n\n\tif (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())\n\t{\n\t\tif (pEdit->GetFontMap())\n\t\t{\n\t\t\tif (pRange)\n\t\t\t\tpIterator->SetAt(pRange->BeginPos);\n\t\t\telse\n\t\t\t\tpIterator->SetAt(0);\n\n\t\t\twhile (pIterator->NextWord())\n\t\t\t{\n\t\t\t\tCPVT_WordPlace place = pIterator->GetAt();\n\t\t\t\tif (pRange && place.WordCmp(pRange->EndPos) > 0) break;\n\n\t\t\t\tCPVT_Word word;\t\t\t\t\n\t\t\t\tif (pIterator->GetWord(word))\n\t\t\t\t{\n\t\t\t\t\tCFX_PathData pathUnderline;\n\t\t\t\t\tCPDF_Rect rcUnderline = GetUnderLineRect(word);\n\t\t\t\t\trcUnderline.left += ptOffset.x;\n\t\t\t\t\trcUnderline.right += ptOffset.x;\n\t\t\t\t\trcUnderline.top += ptOffset.y;\n\t\t\t\t\trcUnderline.bottom += ptOffset.y;\n\t\t\t\t\tpathUnderline.AppendRect(rcUnderline.left, rcUnderline.bottom, rcUnderline.right, rcUnderline.top);\n\n\t\t\t\t\tpDevice->DrawPath(&pathUnderline, pUser2Device, NULL, color, 0, FXFILL_WINDING);\n\t\t\t\t}\n\t\t\t}\t\t\t\n\t\t}\n\t}\n\t\n\tpDevice->RestoreState();\n}\n\nvoid IFX_Edit::DrawEdit(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit, FX_COLORREF crTextFill, FX_COLORREF crTextStroke, \n\t\t\t\t\t\tconst CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, IFX_SystemHandler* pSystemHandler, void* pFFLData)\n{\n\t\n\tFX_BOOL bContinuous = pEdit->GetCharArray() == 0;\n\tif (pEdit->GetCharSpace() > 0.0f)\n\t\tbContinuous = FALSE;\n\n\tFX_WORD SubWord = pEdit->GetPasswordChar();\n\tFX_FLOAT fFontSize = pEdit->GetFontSize();\n\tCPVT_WordRange wrSelect = pEdit->GetSelectWordRange();\n\tFX_INT32 nHorzScale = pEdit->GetHorzScale();\n\n\tFX_COLORREF crCurFill = crTextFill;\n\tFX_COLORREF crOldFill = crCurFill;\n\n\tFX_BOOL bSelect = FALSE;\n\tconst FX_COLORREF crWhite = ArgbEncode(255,255,255,255);\n\tconst FX_COLORREF crSelBK = ArgbEncode(255,0,51,113);\n\n\tCFX_ByteTextBuf sTextBuf;\n\tFX_INT32 nFontIndex = -1;\n\tCPDF_Point ptBT(0.0f,0.0f);\n\n\tpDevice->SaveState();\n\n\tif (!rcClip.IsEmpty())\n\t{\n\t\tCPDF_Rect rcTemp = rcClip;\n\t\tpUser2Device->TransformRect(rcTemp);\n\t\tFX_RECT rcDevClip;\n\t\trcDevClip.left = (FX_INT32)rcTemp.left;\n\t\trcDevClip.right = (FX_INT32)rcTemp.right;\n\t\trcDevClip.top = (FX_INT32)rcTemp.top;\n\t\trcDevClip.bottom = (FX_INT32)rcTemp.bottom;\n\t\tpDevice->SetClip_Rect(&rcDevClip);\n\t}\n\n\tif (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())\n\t{\n\t\tif (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap())\n\t\t{\n\t\t\tif (pRange)\n\t\t\t\tpIterator->SetAt(pRange->BeginPos);\n\t\t\telse\n\t\t\t\tpIterator->SetAt(0);\n\n\t\t\tCPVT_WordPlace oldplace;\t\t\t\n\n\t\t\twhile (pIterator->NextWord())\n\t\t\t{\n\t\t\t\tCPVT_WordPlace place = pIterator->GetAt();\n\t\t\t\tif (pRange && place.WordCmp(pRange->EndPos) > 0) break;\n\n\t\t\t\tif (wrSelect.IsExist())\n\t\t\t\t{\n\t\t\t\t\tbSelect = place.WordCmp(wrSelect.BeginPos) > 0 && place.WordCmp(wrSelect.EndPos) <= 0;\n\t\t\t\t\tif (bSelect)\n\t\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\t\tcrCurFill = crWhite;\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tcrCurFill = crTextFill;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(pSystemHandler && pSystemHandler->IsSelectionImplemented())\t\n\t\t\t\t{\n\t\t\t\t\tcrCurFill = crTextFill;\n \t\t\t\t\tcrOldFill = crCurFill;\n\t\t\t\t}\n\t\t\t\tCPVT_Word word;\t\t\t\t\n\t\t\t\tif (pIterator->GetWord(word))\n\t\t\t\t{\n\n\t\t\t\t\tif (bSelect)\n\t\t\t\t\t{\n\t\t\t\t\t\t\n\t\t\t\t\t\tCPVT_Line line;\n\t\t\t\t\t\tpIterator->GetLine(line);\n\n\t\t\t\t\t\tif(pSystemHandler && pSystemHandler->IsSelectionImplemented())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tCPDF_Rect rc(word.ptWord.x,line.ptLine.y + line.fLineDescent,\n\t\t\t\t\t\t\t\tword.ptWord.x+word.fWidth,line.ptLine.y + line.fLineAscent);\n\t\t\t\t\t\t\trc.Intersect(rcClip);\n\t\t\t\t\t\t\t//CFX_Edit* pEt = (CFX_Edit*)pEdit;\n\t\t\t\t\t\t\t//CPDF_Rect rcEdit = pEt->VTToEdit(rc);\n\t\t\t\t\t\t\tpSystemHandler->OutputSelectedRect(pFFLData,rc);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\t\n \t\t\t\t\t\t\tCFX_PathData pathSelBK;\n \t\t\t\t\t\t\tpathSelBK.AppendRect(word.ptWord.x,line.ptLine.y + line.fLineDescent,\n \t\t\t\t\t\t\t\tword.ptWord.x+word.fWidth,line.ptLine.y + line.fLineAscent);\n \t\t\t\t\t\t\t\n \t\t\t\t\t\t\tpDevice->DrawPath(&pathSelBK, pUser2Device, NULL, crSelBK, 0, FXFILL_WINDING);\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (bContinuous)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (place.LineCmp(oldplace) != 0 || word.nFontIndex != nFontIndex || \n\t\t\t\t\t\t\tcrOldFill != crCurFill)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (sTextBuf.GetLength() > 0)\n\t\t\t\t\t\t\t{\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tDrawTextString(pDevice, CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), pFontMap->GetPDFFont(nFontIndex),\n\t\t\t\t\t\t\t\t\tfFontSize, pUser2Device, sTextBuf.GetByteString(), crOldFill, crTextStroke, nHorzScale);\n\n\t\t\t\t\t\t\t\tsTextBuf.Clear();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tnFontIndex = word.nFontIndex;\n\t\t\t\t\t\t\tptBT = word.ptWord;\n\t\t\t\t\t\t\tcrOldFill = crCurFill;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsTextBuf << GetPDFWordString(pFontMap, word.nFontIndex, word.Word, SubWord);\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tDrawTextString(pDevice,CPDF_Point(word.ptWord.x+ptOffset.x, word.ptWord.y+ptOffset.y), pFontMap->GetPDFFont(word.nFontIndex),\n\t\t\t\t\t\t\tfFontSize, pUser2Device, GetPDFWordString(pFontMap, word.nFontIndex, word.Word, SubWord), crCurFill, crTextStroke, nHorzScale);\n\n\t\t\t\t\t}\n\t\t\t\t\toldplace = place;\n\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (sTextBuf.GetLength() > 0)\n\t\t\t{\t\t\t\t\n\t\t\t\tDrawTextString(pDevice, CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), pFontMap->GetPDFFont(nFontIndex),\n\t\t\t\t\tfFontSize, pUser2Device, sTextBuf.GetByteString(), crOldFill, crTextStroke, nHorzScale);\n\t\t\t}\t\t\t\n\t\t}\n\t}\n\t\n\tpDevice->RestoreState();\n}\n\nvoid IFX_Edit::DrawRichEdit(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit,  \n\t\t\t\t\t\tconst CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange)\n{\n\t//FX_FLOAT fFontSize = pEdit->GetFontSize();\n\tCPVT_WordRange wrSelect = pEdit->GetSelectWordRange();\n\n\tFX_COLORREF crCurText = ArgbEncode(255, 0,0,0);\n\tFX_COLORREF crOld = crCurText;\n\tFX_BOOL bSelect = FALSE;\n\tconst FX_COLORREF crWhite = ArgbEncode(255,255,255,255);\n\tconst FX_COLORREF crSelBK = ArgbEncode(255,0,51,113);\n\n\tCFX_ByteTextBuf sTextBuf;\n\tCPVT_WordProps wp;\n\tCPDF_Point ptBT(0.0f,0.0f);\n\n\tpDevice->SaveState();\n\n\tif (!rcClip.IsEmpty())\n\t{\n\t\tCPDF_Rect rcTemp = rcClip;\n\t\tpUser2Device->TransformRect(rcTemp);\n\t\tFX_RECT rcDevClip;\n\t\trcDevClip.left = (FX_INT32)rcTemp.left;\n\t\trcDevClip.right = (FX_INT32)rcTemp.right;\n\t\trcDevClip.top = (FX_INT32)rcTemp.top;\n\t\trcDevClip.bottom = (FX_INT32)rcTemp.bottom;\n\t\tpDevice->SetClip_Rect(&rcDevClip);\n\t}\n\n\tif (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())\n\t{\n\t\tif (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap())\n\t\t{\n\t\t\tif (pRange)\n\t\t\t\tpIterator->SetAt(pRange->BeginPos);\n\t\t\telse\n\t\t\t\tpIterator->SetAt(0);\n\n\t\t\tCPVT_WordPlace oldplace;\t\t\t\n\n\t\t\twhile (pIterator->NextWord())\n\t\t\t{\n\t\t\t\tCPVT_WordPlace place = pIterator->GetAt();\n\t\t\t\tif (pRange && place.WordCmp(pRange->EndPos) > 0) break;\n\t\t\t\t\n\t\t\t\tCPVT_Word word;\t\t\t\t\n\t\t\t\tif (pIterator->GetWord(word))\n\t\t\t\t{\n\t\t\t\t\tword.WordProps.fFontSize = word.fFontSize;\n\n\t\t\t\t\tcrCurText = ArgbEncode(255,word.WordProps.dwWordColor);\n\n\t\t\t\t\tif (wrSelect.IsExist())\n\t\t\t\t\t{\n\t\t\t\t\t\tbSelect = place.WordCmp(wrSelect.BeginPos) > 0 && place.WordCmp(wrSelect.EndPos) <= 0;\n\t\t\t\t\t\tif (bSelect)\n\t\t\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\t\t\tcrCurText = crWhite;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (bSelect)\n\t\t\t\t\t{\n\t\t\t\t\t\tCPVT_Line line;\n\t\t\t\t\t\tpIterator->GetLine(line);\n\n\t\t\t\t\t\tCFX_PathData pathSelBK;\n\t\t\t\t\t\tpathSelBK.AppendRect(word.ptWord.x\t\t+ ptOffset.x,\n\t\t\t\t\t\t\tline.ptLine.y + line.fLineDescent\t+ ptOffset.y,\n\t\t\t\t\t\t\tword.ptWord.x+word.fWidth\t\t\t+ ptOffset.x,\n\t\t\t\t\t\t\tline.ptLine.y + line.fLineAscent\t+ ptOffset.y);\n\n\t\t\t\t\t\tpDevice->DrawPath(&pathSelBK, pUser2Device, NULL, crSelBK, 0, FXFILL_WINDING);\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t}\n\n\t\t\t\t\tif (place.LineCmp(oldplace) != 0 || word.WordProps.fCharSpace > 0.0f || word.WordProps.nHorzScale != 100 || \n\t\t\t\t\t\tFXSYS_memcmp(&word.WordProps, &wp, sizeof(CPVT_WordProps)) != 0 || \n\t\t\t\t\t\tcrOld != crCurText)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (sTextBuf.GetLength() > 0)\n\t\t\t\t\t\t{\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tDrawTextString(pDevice, CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), pFontMap->GetPDFFont(wp.nFontIndex),\n\t\t\t\t\t\t\t\twp.fFontSize, pUser2Device, sTextBuf.GetByteString(), crOld, 0, wp.nHorzScale);\n\n\t\t\t\t\t\t\tsTextBuf.Clear();\n\t\t\t\t\t\t}\n\t\t\t\t\t\twp = word.WordProps;\n\t\t\t\t\t\tptBT = word.ptWord;\n\t\t\t\t\t\tcrOld = crCurText;\n\t\t\t\t\t}\n\n\t\t\t\t\tsTextBuf << GetPDFWordString(pFontMap, word.WordProps.nFontIndex, word.Word, 0);\t\n\t\t\t\t\t\n\t\t\t\t\tif (word.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE)\n\t\t\t\t\t{\n\t\t\t\t\t\tCFX_PathData pathUnderline;\n\t\t\t\t\t\tCPDF_Rect rcUnderline = GetUnderLineRect(word);\n\t\t\t\t\t\tpathUnderline.AppendRect(rcUnderline.left, rcUnderline.bottom, rcUnderline.right, rcUnderline.top);\n\n\t\t\t\t\t\tpDevice->DrawPath(&pathUnderline, pUser2Device, NULL, crCurText, 0, FXFILL_WINDING);\t\n\t\t\t\t\t}\n\n\t\t\t\t\tif (word.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT)\n\t\t\t\t\t{\n\t\t\t\t\t\tCFX_PathData pathCrossout;\n\t\t\t\t\t\tCPDF_Rect rcCrossout = GetCrossoutRect(word);\n\t\t\t\t\t\tpathCrossout.AppendRect(rcCrossout.left, rcCrossout.bottom, rcCrossout.right, rcCrossout.top);\n\n\t\t\t\t\t\tpDevice->DrawPath(&pathCrossout, pUser2Device, NULL, crCurText, 0, FXFILL_WINDING);\n\t\t\t\t\t}\n\n\t\t\t\t\toldplace = place;\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (sTextBuf.GetLength() > 0)\n\t\t\t{\t\t\t\t\n\t\t\t\tDrawTextString(pDevice, CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), pFontMap->GetPDFFont(wp.nFontIndex),\n\t\t\t\t\twp.fFontSize, pUser2Device, sTextBuf.GetByteString(), crOld, 0, wp.nHorzScale);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpDevice->RestoreState();\n}\n\nstatic void AddLineToPageObjects(CPDF_PageObjects* pPageObjs, FX_COLORREF crStroke, \n\t\t\t\t\t\t\t\t const CPDF_Point& pt1, const CPDF_Point& pt2)\n{\n\tCPDF_PathObject* pPathObj = new CPDF_PathObject;\n\tCPDF_PathData* pPathData = pPathObj->m_Path.GetModify();\n\n\tpPathData->SetPointCount(2);\n\tpPathData->SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO);\n\tpPathData->SetPoint(1, pt2.x, pt2.y, FXPT_LINETO);\n\n\tFX_FLOAT rgb[3];\n\trgb[0] = FXARGB_R(crStroke) / 255.0f;\n\trgb[1] = FXARGB_G(crStroke) / 255.0f;\n\trgb[2] = FXARGB_B(crStroke) / 255.0f;\n\tpPathObj->m_ColorState.SetStrokeColor(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb, 3);\n\n\tCFX_GraphStateData* pData = pPathObj->m_GraphState.GetModify();\n\tpData->m_LineWidth = 1;\n\n\tpPageObjs->InsertObject(pPageObjs->GetLastObjectPosition(),pPathObj);\n}\n\nstatic void AddRectToPageObjects(CPDF_PageObjects* pPageObjs, FX_COLORREF crFill, const CPDF_Rect& rcFill)\n{\n\tCPDF_PathObject* pPathObj = new CPDF_PathObject;\n\tCPDF_PathData* pPathData = pPathObj->m_Path.GetModify();\n\tpPathData->AppendRect(rcFill.left,rcFill.bottom,rcFill.right,rcFill.top);\t\n\t\n\tFX_FLOAT rgb[3];\n\trgb[0] = FXARGB_R(crFill) / 255.0f ;\n\trgb[1] = FXARGB_G(crFill) / 255.0f;\n\trgb[2] = FXARGB_B(crFill) / 255.0f;\n\tpPathObj->m_ColorState.SetFillColor(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb, 3);\n\n\tpPathObj->m_FillType = FXFILL_ALTERNATE;\n\tpPathObj->m_bStroke = FALSE;\n\n\tpPageObjs->InsertObject(pPageObjs->GetLastObjectPosition(),pPathObj);\n}\n\nstatic CPDF_TextObject* AddTextObjToPageObjects(CPDF_PageObjects* pPageObjs, FX_COLORREF crText, \n\t\t\t\t\t\t\t CPDF_Font* pFont, FX_FLOAT fFontSize, FX_FLOAT fCharSpace, FX_INT32 nHorzScale, \n\t\t\t\t\t\t\t const CPDF_Point& point, const CFX_ByteString& text)\n{\n\tCPDF_TextObject* pTxtObj = new CPDF_TextObject;\n\t\t\t\n\tCPDF_TextStateData* pTextStateData = pTxtObj->m_TextState.GetModify();\n\tpTextStateData->m_pFont = pFont;\n\tpTextStateData->m_FontSize = fFontSize;\n\tpTextStateData->m_CharSpace = fCharSpace;\n\tpTextStateData->m_WordSpace = 0;\n\tpTextStateData->m_TextMode  = 0;\n\tpTextStateData->m_Matrix[0] = nHorzScale / 100.0f;\n\tpTextStateData->m_Matrix[1] = 0;\n\tpTextStateData->m_Matrix[2] = 0;\n\tpTextStateData->m_Matrix[3] = 1;\n\n\tFX_FLOAT rgb[3];\n\trgb[0] = FXARGB_R(crText) / 255.0f ;\n\trgb[1] = FXARGB_G(crText) / 255.0f;\n\trgb[2] = FXARGB_B(crText) / 255.0f;\n\tpTxtObj->m_ColorState.SetFillColor(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB),rgb, 3);\n\tpTxtObj->m_ColorState.SetStrokeColor(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB),rgb, 3);\n\n\tpTxtObj->SetPosition(point.x,point.y);\n\tpTxtObj->SetText(text);\t\n\n\tpPageObjs->InsertObject(pPageObjs->GetLastObjectPosition(),pTxtObj);\n\n\treturn pTxtObj;\n}\n\n/*\nList of currently supported standard fonts:\nCourier, Courier-Bold, Courier-BoldOblique, Courier-Oblique\nHelvetica, Helvetica-Bold, Helvetica-BoldOblique, Helvetica-Oblique\nTimes-Roman, Times-Bold, Times-Italic, Times-BoldItalic\nSymbol, ZapfDingbats\n*/\n\nconst char* g_sFXEDITStandardFontName[] = {\"Courier\", \"Courier-Bold\", \"Courier-BoldOblique\", \"Courier-Oblique\",\n\t\"Helvetica\", \"Helvetica-Bold\", \"Helvetica-BoldOblique\", \"Helvetica-Oblique\",\n\t\"Times-Roman\", \"Times-Bold\", \"Times-Italic\", \"Times-BoldItalic\",\n\t\"Symbol\", \"ZapfDingbats\"};\n\nstatic FX_BOOL FX_EDIT_IsStandardFont(const CFX_ByteString& sFontName)\n{\n\tfor (FX_INT32 i=0; i<14; i++)\n\t{\n\t\tif (sFontName == g_sFXEDITStandardFontName[i])\n\t\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\nvoid IFX_Edit::GeneratePageObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,\n\t\t\t\t\t\t\t\t   const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, FX_COLORREF crText, CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray)\n{\n\tFX_FLOAT fFontSize = pEdit->GetFontSize();\n\n\tFX_INT32 nOldFontIndex = -1;\n\n\tCFX_ByteTextBuf sTextBuf;\n\tCPDF_Point ptBT(0.0f,0.0f);\n\n\tObjArray.RemoveAll();\n\n\tif (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())\n\t{\n\t\tif (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap())\n\t\t{\n\t\t\tif (pRange)\n\t\t\t\tpIterator->SetAt(pRange->BeginPos);\n\t\t\telse\n\t\t\t\tpIterator->SetAt(0);\n\n\t\t\tCPVT_WordPlace oldplace;\t\t\t\n\n\t\t\twhile (pIterator->NextWord())\n\t\t\t{\n\t\t\t\tCPVT_WordPlace place = pIterator->GetAt();\n\t\t\t\tif (pRange && place.WordCmp(pRange->EndPos) > 0) break;\n\t\t\t\t\n\t\t\t\tCPVT_Word word;\t\t\t\t\n\t\t\t\tif (pIterator->GetWord(word))\n\t\t\t\t{\n\t\t\t\t\tif (place.LineCmp(oldplace) != 0 || nOldFontIndex != word.nFontIndex)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (sTextBuf.GetLength() > 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tObjArray.Add(AddTextObjToPageObjects(pPageObjects, crText, pFontMap->GetPDFFont(nOldFontIndex), fFontSize, 0.0f, 100,\n\t\t\t\t\t\t\t\tCPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), sTextBuf.GetByteString()));\n\n\t\t\t\t\t\t\tsTextBuf.Clear();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tptBT = word.ptWord;\n\t\t\t\t\t\tnOldFontIndex = word.nFontIndex;\n\t\t\t\t\t}\n\n\t\t\t\t\tsTextBuf << GetPDFWordString(pFontMap, word.nFontIndex, word.Word, 0);\n\t\t\t\t\toldplace = place;\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (sTextBuf.GetLength() > 0)\n\t\t\t{\t\t\t\t\n\t\t\t\tObjArray.Add(AddTextObjToPageObjects(pPageObjects, crText, pFontMap->GetPDFFont(nOldFontIndex), fFontSize, 0.0f, 100,\n\t\t\t\t\tCPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), sTextBuf.GetByteString()));\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid IFX_Edit::GenerateRichPageObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,\n\t\t\t\t\t\t\t\t   const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray)\n{\n\n\n\tFX_COLORREF crCurText = ArgbEncode(255, 0, 0, 0);\n\tFX_COLORREF crOld = crCurText;\n\n\n\tCFX_ByteTextBuf sTextBuf;\n\tCPVT_WordProps wp;\n\tCPDF_Point ptBT(0.0f,0.0f);\n\n\tObjArray.RemoveAll();\n\n\tif (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())\n\t{\n\t\tif (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap())\n\t\t{\n\t\t\tif (pRange)\n\t\t\t\tpIterator->SetAt(pRange->BeginPos);\n\t\t\telse\n\t\t\t\tpIterator->SetAt(0);\n\n\t\t\tCPVT_WordPlace oldplace;\t\t\t\n\n\t\t\twhile (pIterator->NextWord())\n\t\t\t{\n\t\t\t\tCPVT_WordPlace place = pIterator->GetAt();\n\t\t\t\tif (pRange && place.WordCmp(pRange->EndPos) > 0) break;\n\t\t\t\t\n\t\t\t\tCPVT_Word word;\t\t\t\t\n\t\t\t\tif (pIterator->GetWord(word))\n\t\t\t\t{\n\t\t\t\t\tword.WordProps.fFontSize = word.fFontSize;\n\n\t\t\t\t\tcrCurText = ArgbEncode(255,word.WordProps.dwWordColor);\n\n\t\t\t\t\tif (place.LineCmp(oldplace) != 0 || word.WordProps.fCharSpace > 0.0f || word.WordProps.nHorzScale != 100 || \n\t\t\t\t\t\tFXSYS_memcmp(&word.WordProps, &wp, sizeof(CPVT_WordProps)) != 0 || \n\t\t\t\t\t\tcrOld != crCurText)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (sTextBuf.GetLength() > 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tObjArray.Add(AddTextObjToPageObjects(pPageObjects, crOld, pFontMap->GetPDFFont(wp.nFontIndex), wp.fFontSize, wp.fCharSpace, wp.nHorzScale,\n\t\t\t\t\t\t\t\tCPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), sTextBuf.GetByteString()));\n\n\t\t\t\t\t\t\tsTextBuf.Clear();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\twp = word.WordProps;\n\t\t\t\t\t\tptBT = word.ptWord;\n\t\t\t\t\t\tcrOld = crCurText;\n\t\n\t\t\t\t\t}\n\n\t\t\t\t\tsTextBuf << GetPDFWordString(pFontMap, word.WordProps.nFontIndex, word.Word, 0);\t\n\t\t\t\t\t\n\t\t\t\t\tif (word.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE)\n\t\t\t\t\t{/*\n\t\t\t\t\t\tAddLineToPageObjects(pPageObjects, crCurText, \n\t\t\t\t\t\t\tCPDF_Point(word.ptWord.x, word.ptWord.y + word.fDescent * 0.4f),\n\t\t\t\t\t\t\tCPDF_Point(word.ptWord.x + word.fWidth, word.ptWord.y + word.fDescent * 0.4f));\t\t\t\t\t\t\t\n*/\n\t\t\t\t\t\tCPDF_Rect rcUnderline = GetUnderLineRect(word);\n\t\t\t\t\t\trcUnderline.left += ptOffset.x;\n\t\t\t\t\t\trcUnderline.right += ptOffset.x;\n\t\t\t\t\t\trcUnderline.top += ptOffset.y;\n\t\t\t\t\t\trcUnderline.bottom += ptOffset.y;\n\t\t\t\t\t\t\n\t\t\t\t\t\tAddRectToPageObjects(pPageObjects, crCurText, rcUnderline);\t\t\t\t\t\t\t\n\t\t\t\t\t}\n\n\t\t\t\t\tif (word.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT)\n\t\t\t\t\t{\n\t\t\t\t\t\tCPDF_Rect rcCrossout = GetCrossoutRect(word);\n\t\t\t\t\t\trcCrossout.left += ptOffset.x;\n\t\t\t\t\t\trcCrossout.right += ptOffset.x;\n\t\t\t\t\t\trcCrossout.top += ptOffset.y;\n\t\t\t\t\t\trcCrossout.bottom += ptOffset.y;\n\n\t\t\t\t\t\tAddRectToPageObjects(pPageObjects, crCurText, rcCrossout);\t\t\t\t\t\t\n\t\t\t\t\t}\n\n\t\t\t\t\toldplace = place;\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (sTextBuf.GetLength() > 0)\n\t\t\t{\t\t\t\t\n\t\t\t\tObjArray.Add(AddTextObjToPageObjects(pPageObjects, crOld, pFontMap->GetPDFFont(wp.nFontIndex), wp.fFontSize, wp.fCharSpace, wp.nHorzScale,\n\t\t\t\t\tCPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), sTextBuf.GetByteString()));\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid IFX_Edit::GenerateUnderlineObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,\n\t\t\t\t\t\t\t\t   const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, FX_COLORREF color)\n{\n\n\n\tif (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())\n\t{\n\t\tif (pEdit->GetFontMap())\n\t\t{\n\t\t\tif (pRange)\n\t\t\t\tpIterator->SetAt(pRange->BeginPos);\n\t\t\telse\n\t\t\t\tpIterator->SetAt(0);\n\n\t\t\tCPVT_WordPlace oldplace;\t\t\t\n\n\t\t\twhile (pIterator->NextWord())\n\t\t\t{\n\t\t\t\tCPVT_WordPlace place = pIterator->GetAt();\n\t\t\t\tif (pRange && place.WordCmp(pRange->EndPos) > 0) break;\n\t\t\t\t\n\t\t\t\tCPVT_Word word;\t\t\t\t\n\t\t\t\tif (pIterator->GetWord(word))\n\t\t\t\t{\n\t\t\t\t\tCPDF_Rect rcUnderline = GetUnderLineRect(word);\n\t\t\t\t\trcUnderline.left += ptOffset.x;\n\t\t\t\t\trcUnderline.right += ptOffset.x;\n\t\t\t\t\trcUnderline.top += ptOffset.y;\n\t\t\t\t\trcUnderline.bottom += ptOffset.y;\n\t\t\t\t\tAddRectToPageObjects(pPageObjects, color, rcUnderline);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/javascript/Consts.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/javascript/JavaScript.h\"\n#include \"../../include/javascript/IJavaScript.h\"\n#include \"../../include/javascript/JS_Define.h\"\n#include \"../../include/javascript/JS_Object.h\"\n#include \"../../include/javascript/JS_Value.h\"\n#include \"../../include/javascript/Consts.h\"\n\n/* ------------------------------ border ------------------------------ */\n\nBEGIN_JS_STATIC_CONST(CJS_Border)\n\tJS_STATIC_CONST_ENTRY_STRING(s,\tsolid)\n\tJS_STATIC_CONST_ENTRY_STRING(b,\tbeveled)\n\tJS_STATIC_CONST_ENTRY_STRING(d,\tdashed)\n\tJS_STATIC_CONST_ENTRY_STRING(i,\tinset)\n\tJS_STATIC_CONST_ENTRY_STRING(u,\tunderline)\nEND_JS_STATIC_CONST()\n\nIMPLEMENT_JS_CLASS_CONST(CJS_Border,border)\n\n/* ------------------------------ display ------------------------------ */\n\nBEGIN_JS_STATIC_CONST(CJS_Display)\n\tJS_STATIC_CONST_ENTRY_NUMBER(visible,\t0)\n\tJS_STATIC_CONST_ENTRY_NUMBER(hidden,\t1)\n\tJS_STATIC_CONST_ENTRY_NUMBER(noPrint,\t2)\n\tJS_STATIC_CONST_ENTRY_NUMBER(noView,\t3)\nEND_JS_STATIC_CONST()\n\nIMPLEMENT_JS_CLASS_CONST(CJS_Display,display)\n\n/* ------------------------------ font ------------------------------ */\n\nBEGIN_JS_STATIC_CONST(CJS_Font)\n\tJS_STATIC_CONST_ENTRY_STRING(Times,\t\tTimes-Roman)\n\tJS_STATIC_CONST_ENTRY_STRING(TimesB,\tTimes-Bold)\n\tJS_STATIC_CONST_ENTRY_STRING(TimesI,\tTimes-Italic)\n\tJS_STATIC_CONST_ENTRY_STRING(TimesBI,\tTimes-BoldItalic)\n\tJS_STATIC_CONST_ENTRY_STRING(Helv,\t\tHelvetica)\n\tJS_STATIC_CONST_ENTRY_STRING(HelvB,\t\tHelvetica-Bold)\n\tJS_STATIC_CONST_ENTRY_STRING(HelvI,\t\tHelvetica-Oblique)\n\tJS_STATIC_CONST_ENTRY_STRING(HelvBI,\tHelvetica-BoldOblique)\n\tJS_STATIC_CONST_ENTRY_STRING(Cour,\t\tCourier)\n\tJS_STATIC_CONST_ENTRY_STRING(CourB,\t\tCourier-Bold)\n\tJS_STATIC_CONST_ENTRY_STRING(CourI,\t\tCourier-Oblique)\n\tJS_STATIC_CONST_ENTRY_STRING(CourBI,\tCourier-BoldOblique)\n\tJS_STATIC_CONST_ENTRY_STRING(Symbol,\tSymbol)\n\tJS_STATIC_CONST_ENTRY_STRING(ZapfD,\t\tZapfDingbats)\nEND_JS_STATIC_CONST()\n\nIMPLEMENT_JS_CLASS_CONST(CJS_Font,font)\n\n/* ------------------------------ highlight ------------------------------ */\n\nBEGIN_JS_STATIC_CONST(CJS_Highlight)\n\tJS_STATIC_CONST_ENTRY_STRING(n,\tnone)\n\tJS_STATIC_CONST_ENTRY_STRING(i,\tinvert)\n\tJS_STATIC_CONST_ENTRY_STRING(p,\tpush)\n\tJS_STATIC_CONST_ENTRY_STRING(o,\toutline)\nEND_JS_STATIC_CONST()\n\nIMPLEMENT_JS_CLASS_CONST(CJS_Highlight,highlight)\n\n/* ------------------------------ position ------------------------------ */\n\nBEGIN_JS_STATIC_CONST(CJS_Position)\n\tJS_STATIC_CONST_ENTRY_NUMBER(textOnly,\t\t0)\n\tJS_STATIC_CONST_ENTRY_NUMBER(iconOnly,\t\t1)\n\tJS_STATIC_CONST_ENTRY_NUMBER(iconTextV,\t\t2)\n\tJS_STATIC_CONST_ENTRY_NUMBER(textIconV,\t\t3)\n\tJS_STATIC_CONST_ENTRY_NUMBER(iconTextH,\t\t4)\n\tJS_STATIC_CONST_ENTRY_NUMBER(textIconH,\t\t5)\n\tJS_STATIC_CONST_ENTRY_NUMBER(overlay,\t\t6)\nEND_JS_STATIC_CONST()\n\nIMPLEMENT_JS_CLASS_CONST(CJS_Position,position)\n\n/* ------------------------------ scaleHow ------------------------------ */\n\nBEGIN_JS_STATIC_CONST(CJS_ScaleHow)\n\tJS_STATIC_CONST_ENTRY_NUMBER(proportional,\t0)\n\tJS_STATIC_CONST_ENTRY_NUMBER(anamorphic,\t1)\nEND_JS_STATIC_CONST()\n\nIMPLEMENT_JS_CLASS_CONST(CJS_ScaleHow,scaleHow)\n\n/* ------------------------------ scaleWhen ------------------------------ */\n\nBEGIN_JS_STATIC_CONST(CJS_ScaleWhen)\n\tJS_STATIC_CONST_ENTRY_NUMBER(always,\t0)\n\tJS_STATIC_CONST_ENTRY_NUMBER(never,\t\t1)\n\tJS_STATIC_CONST_ENTRY_NUMBER(tooBig,\t2)\n\tJS_STATIC_CONST_ENTRY_NUMBER(tooSmall,\t3)\nEND_JS_STATIC_CONST()\n\nIMPLEMENT_JS_CLASS_CONST(CJS_ScaleWhen,scaleWhen)\n\n/* ------------------------------ style ------------------------------ */\n\nBEGIN_JS_STATIC_CONST(CJS_Style)\n\tJS_STATIC_CONST_ENTRY_STRING(ch,\tcheck)\n\tJS_STATIC_CONST_ENTRY_STRING(cr,\tcross)\n\tJS_STATIC_CONST_ENTRY_STRING(di,\tdiamond)\n\tJS_STATIC_CONST_ENTRY_STRING(ci,\tcircle)\n\tJS_STATIC_CONST_ENTRY_STRING(st,\tstar)\n\tJS_STATIC_CONST_ENTRY_STRING(sq,\tsquare)\nEND_JS_STATIC_CONST()\n\nIMPLEMENT_JS_CLASS_CONST(CJS_Style,style)\n\n\n/* ------------------------------ zoomtype ------------------------------ */\n\nBEGIN_JS_STATIC_CONST(CJS_Zoomtype)\n\tJS_STATIC_CONST_ENTRY_STRING(none,\tNoVary)\n\tJS_STATIC_CONST_ENTRY_STRING(fitP,\tFitPage)\n\tJS_STATIC_CONST_ENTRY_STRING(fitW,\tFitWidth)\n\tJS_STATIC_CONST_ENTRY_STRING(fitH,\tFitHeight)\n\tJS_STATIC_CONST_ENTRY_STRING(fitV,\tFitVisibleWidth)\n\tJS_STATIC_CONST_ENTRY_STRING(pref,\tPreferred)\n\tJS_STATIC_CONST_ENTRY_STRING(refW,\tReflowWidth)\nEND_JS_STATIC_CONST()\n\nIMPLEMENT_JS_CLASS_CONST(CJS_Zoomtype,zoomtype)\n\n/* ------------------------------ CJS_GlobalConsts ------------------------------ */\n\nint\tCJS_GlobalConsts::Init(IJS_Runtime* pRuntime)\n{\n\tDEFINE_GLOBAL_CONST(pRuntime, IDS_GREATER_THAN , Invalid value: must be greater than or equal to %s.);\n\tDEFINE_GLOBAL_CONST(pRuntime, IDS_GT_AND_LT,Invalid value: must be greater than or equal to %s and less than or equal to %s.);\n\tDEFINE_GLOBAL_CONST(pRuntime, IDS_LESS_THAN,Invalid value: must be less than or equal to %s.);\n\tDEFINE_GLOBAL_CONST(pRuntime, IDS_INVALID_MONTH,** Invalid **);\n\tDEFINE_GLOBAL_CONST(pRuntime, IDS_INVALID_DATE,Invalid date/time: please ensure that the date/time exists. Field);\n\tDEFINE_GLOBAL_CONST(pRuntime, IDS_INVALID_VALUE,The value entered does not match the format of the field);\n\tDEFINE_GLOBAL_CONST(pRuntime, IDS_AM,am);\n\tDEFINE_GLOBAL_CONST(pRuntime, IDS_PM,pm);\n\tDEFINE_GLOBAL_CONST(pRuntime, IDS_MONTH_INFO,January[1]February[2]March[3]April[4]May[5]June[6]July[7]August[8]September[9]October[10]November[11]December[12]Sept[9]Jan[1]Feb[2]Mar[3]Apr[4]Jun[6]Jul[7]Aug[8]Sep[9]Oct[10]Nov[11]Dec[12]);\n\tDEFINE_GLOBAL_CONST(pRuntime, IDS_STARTUP_CONSOLE_MSG, ** ^_^ **);\n\n\treturn 0;\n}\n\n/* ------------------------------ CJS_GlobalArrays ------------------------------ */\n\nint\tCJS_GlobalArrays::Init(IJS_Runtime* pRuntime)\n{\n\t{\n\t\tFX_LPCWSTR ArrayName = (FX_LPCWSTR)L\"RE_NUMBER_ENTRY_DOT_SEP\";\n\t\tFX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L\"[+-]?\\\\d*\\\\.?\\\\d*\"};\n\t\tDEFINE_GLOBAL_ARRAY(pRuntime);\n\t}\n\n\t{\n\t\tFX_LPCWSTR ArrayName = (FX_LPCWSTR)L\"RE_NUMBER_COMMIT_DOT_SEP\";\n\t\tFX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L\"[+-]?\\\\d+(\\\\.\\\\d+)?\",                /* -1.0 or -1 */\n\t\t\t\t\t\t\t\t\t\t(FX_LPCWSTR)L\"[+-]?\\\\.\\\\d+\",                            /* -.1 */\n\t\t\t\t\t\t\t\t\t\t(FX_LPCWSTR)L\"[+-]?\\\\d+\\\\.\"                             /* -1. */\n\t\t\t\t\t\t\t\t\t\t};\n\t\tDEFINE_GLOBAL_ARRAY(pRuntime);\n\t}\n\n\t{\n\t\tFX_LPCWSTR ArrayName = (FX_LPCWSTR)L\"RE_NUMBER_ENTRY_COMMA_SEP\";\n\t\tFX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L\"[+-]?\\\\d*,?\\\\d*\"};\n\t\t\n\t\tDEFINE_GLOBAL_ARRAY(pRuntime);\n\t}\n\n\t{\n\t\tFX_LPCWSTR ArrayName = (FX_LPCWSTR)L\"RE_NUMBER_COMMIT_COMMA_SEP\";\n\t\tFX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L\"[+-]?\\\\d+([.,]\\\\d+)?\",               /* -1,0 or -1 */\n\t\t\t\t\t\t\t\t\t\t(FX_LPCWSTR)L\"[+-]?[.,]\\\\d+\",                   /* -,1 */\n                                        (FX_LPCWSTR)L\"[+-]?\\\\d+[.,]\"                            /* -1, */\n                                        };\n\t\tDEFINE_GLOBAL_ARRAY(pRuntime);\n\t}\n\n\t{\n\t\tFX_LPCWSTR ArrayName = (FX_LPCWSTR)L\"RE_ZIP_ENTRY\";\n        FX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L\"\\\\d{0,5}\"};\n\t\tDEFINE_GLOBAL_ARRAY(pRuntime);\n\t}\n\n\t{\n\t\tFX_LPCWSTR ArrayName = (FX_LPCWSTR)L\"RE_ZIP_COMMIT\";\n\t\tFX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L\"\\\\d{5}\"};\n\t\tDEFINE_GLOBAL_ARRAY(pRuntime);\n\t}\n\n\t{\n\t\tFX_LPCWSTR ArrayName = (FX_LPCWSTR)L\"RE_ZIP4_ENTRY\";\n\t\tFX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L\"\\\\d{0,5}(\\\\.|[- ])?\\\\d{0,4}\"};\n\t\tDEFINE_GLOBAL_ARRAY(pRuntime);\n\t}\n\n\t{\n\t\tFX_LPCWSTR ArrayName = (FX_LPCWSTR)L\"RE_ZIP4_COMMIT\";\n\t\tFX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L\"\\\\d{5}(\\\\.|[- ])?\\\\d{4}\"};\n\t\tDEFINE_GLOBAL_ARRAY(pRuntime);\n\t}\n\n\t{\n\t\tFX_LPCWSTR ArrayName = (FX_LPCWSTR)L\"RE_PHONE_ENTRY\";\n\t\tFX_LPCWSTR ArrayContent[] = {\n\t\t\t\t(FX_LPCWSTR)L\"\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}\",\t\t/* 555-1234 or 408 555-1234 */\n\t\t\t\t(FX_LPCWSTR)L\"\\\\(\\\\d{0,3}\",\t\t\t\t\t\t\t\t\t\t\t/* (408 */\n\t\t\t\t(FX_LPCWSTR)L\"\\\\(\\\\d{0,3}\\\\)(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}\",\t/* (408) 555-1234 */\n\t\t\t\t\t/* (allow the addition of parens as an afterthought) */\n\t\t\t\t(FX_LPCWSTR)L\"\\\\(\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}\",\t/* (408 555-1234 */\n\t\t\t\t(FX_LPCWSTR)L\"\\\\d{0,3}\\\\)(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}\",\t/* 408) 555-1234 */\n\t\t\t\t(FX_LPCWSTR)L\"011(\\\\.|[- \\\\d])*\"\t\t\t\t\t\t\t\t\t\t/* international */\n\t\t\t};\n\t\tDEFINE_GLOBAL_ARRAY(pRuntime);\n\t}\n\n\t{\n\t\tFX_LPCWSTR ArrayName = (FX_LPCWSTR)L\"RE_PHONE_COMMIT\";\n\t\tFX_LPCWSTR ArrayContent[] = {\n\t\t\t\t\t(FX_LPCWSTR)L\"\\\\d{3}(\\\\.|[- ])?\\\\d{4}\",\t\t\t\t\t\t\t/* 555-1234 */\n\t\t\t\t\t(FX_LPCWSTR)L\"\\\\d{3}(\\\\.|[- ])?\\\\d{3}(\\\\.|[- ])?\\\\d{4}\",\t\t\t/* 408 555-1234 */\n\t\t\t\t\t(FX_LPCWSTR)L\"\\\\(\\\\d{3}\\\\)(\\\\.|[- ])?\\\\d{3}(\\\\.|[- ])?\\\\d{4}\",\t/* (408) 555-1234 */\n\t\t\t\t\t(FX_LPCWSTR)L\"011(\\\\.|[- \\\\d])*\"\t\t\t\t\t\t\t\t\t/* international */\n\t\t\t\t};\n\t\tDEFINE_GLOBAL_ARRAY(pRuntime);\n\t}\n\n\t{\n\t\tFX_LPCWSTR ArrayName = (FX_LPCWSTR)L\"RE_SSN_ENTRY\";\n\t\tFX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L\"\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,2}(\\\\.|[- ])?\\\\d{0,4}\"};\n\t\tDEFINE_GLOBAL_ARRAY(pRuntime);\n\t}\n\n\t{\n\t\tFX_LPCWSTR ArrayName = (FX_LPCWSTR)L\"RE_SSN_COMMIT\";\n\t\tFX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L\"\\\\d{3}(\\\\.|[- ])?\\\\d{2}(\\\\.|[- ])?\\\\d{4}\"};\n\t\tDEFINE_GLOBAL_ARRAY(pRuntime);\n\t}\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/javascript/Document.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/javascript/JavaScript.h\"\n#include \"../../include/javascript/IJavaScript.h\"\n#include \"../../include/javascript/JS_Define.h\"\n#include \"../../include/javascript/JS_Object.h\"\n#include \"../../include/javascript/JS_Value.h\"\n#include \"../../include/javascript/Document.h\"\n#include \"../../include/javascript/JS_EventHandler.h\"\n#include \"../../include/javascript/JS_Context.h\"\n#include \"../../include/javascript/JS_Runtime.h\"\n#include \"../../include/javascript/app.h\"\n#include \"../../include/javascript/Field.h\"\n#include \"../../include/javascript/Icon.h\"\n#include \"../../include/javascript/Field.h\"\n\n#include \"../../../third_party/numerics/safe_math.h\"\n\nstatic v8::Isolate* GetIsolate(IFXJS_Context* cc)\n{\n\tCJS_Context* pContext = (CJS_Context *)cc;\n\tASSERT(pContext != NULL);\n\n\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\tASSERT(pRuntime != NULL);\n\n\treturn pRuntime->GetIsolate();\n}\n\nBEGIN_JS_STATIC_CONST(CJS_PrintParamsObj)\nEND_JS_STATIC_CONST()\n\nBEGIN_JS_STATIC_PROP(CJS_PrintParamsObj)\nEND_JS_STATIC_PROP()\n\nBEGIN_JS_STATIC_METHOD(CJS_PrintParamsObj)\nEND_JS_STATIC_METHOD()\n\nIMPLEMENT_JS_CLASS(CJS_PrintParamsObj, PrintParamsObj)\n\nPrintParamsObj::PrintParamsObj(CJS_Object* pJSObject)\n: CJS_EmbedObj(pJSObject)\n{\n\tbUI = TRUE;\n\tnStart = 0;\n\tnEnd = 0;\n\tbSilent = FALSE;\n\tbShrinkToFit = FALSE;\n\tbPrintAsImage = FALSE;\n\tbReverse = FALSE;\n\tbAnnotations = TRUE;\n}\n\n/* ---------------------- Document ---------------------- */\n\n#define MINWIDTH  5.0f\n#define MINHEIGHT 5.0f\n\nBEGIN_JS_STATIC_CONST(CJS_Document)\nEND_JS_STATIC_CONST()\n\nBEGIN_JS_STATIC_PROP(CJS_Document)\n\tJS_STATIC_PROP_ENTRY(ADBE)\n\tJS_STATIC_PROP_ENTRY(author)\n\tJS_STATIC_PROP_ENTRY(baseURL)\n\tJS_STATIC_PROP_ENTRY(bookmarkRoot)\n\tJS_STATIC_PROP_ENTRY(calculate)\n\tJS_STATIC_PROP_ENTRY(Collab)\n\tJS_STATIC_PROP_ENTRY(creationDate)\n\tJS_STATIC_PROP_ENTRY(creator)\n\tJS_STATIC_PROP_ENTRY(delay)\n\tJS_STATIC_PROP_ENTRY(dirty)\n\tJS_STATIC_PROP_ENTRY(documentFileName)\n\tJS_STATIC_PROP_ENTRY(external)\n\tJS_STATIC_PROP_ENTRY(filesize)\n\tJS_STATIC_PROP_ENTRY(icons)\n\tJS_STATIC_PROP_ENTRY(info)   \n\tJS_STATIC_PROP_ENTRY(keywords)\n\tJS_STATIC_PROP_ENTRY(layout)\n\tJS_STATIC_PROP_ENTRY(media)\n\tJS_STATIC_PROP_ENTRY(modDate)\n\tJS_STATIC_PROP_ENTRY(mouseX)\n\tJS_STATIC_PROP_ENTRY(mouseY)\n\tJS_STATIC_PROP_ENTRY(numFields)\n\tJS_STATIC_PROP_ENTRY(numPages)\n\tJS_STATIC_PROP_ENTRY(pageNum)   \n\tJS_STATIC_PROP_ENTRY(pageWindowRect)\n\tJS_STATIC_PROP_ENTRY(path)\n\tJS_STATIC_PROP_ENTRY(producer)\n\tJS_STATIC_PROP_ENTRY(subject)\n\tJS_STATIC_PROP_ENTRY(title)\n\tJS_STATIC_PROP_ENTRY(zoom)\n\tJS_STATIC_PROP_ENTRY(zoomType)\nEND_JS_STATIC_PROP()\n\nBEGIN_JS_STATIC_METHOD(CJS_Document)\n\tJS_STATIC_METHOD_ENTRY(addAnnot,0)\n\tJS_STATIC_METHOD_ENTRY(addField, 4)\n\tJS_STATIC_METHOD_ENTRY(addLink, 0)\n\tJS_STATIC_METHOD_ENTRY(addIcon, 0)\n\tJS_STATIC_METHOD_ENTRY(calculateNow, 0)\n\tJS_STATIC_METHOD_ENTRY(closeDoc, 0)\n\tJS_STATIC_METHOD_ENTRY(createDataObject, 0)\n\tJS_STATIC_METHOD_ENTRY(deletePages, 2)\n\tJS_STATIC_METHOD_ENTRY(exportAsText, 3)\n\tJS_STATIC_METHOD_ENTRY(exportAsFDF, 6)\n\tJS_STATIC_METHOD_ENTRY(exportAsXFDF, 5)\n\tJS_STATIC_METHOD_ENTRY(extractPages, 3)\n\tJS_STATIC_METHOD_ENTRY(getAnnot, 0)\n\tJS_STATIC_METHOD_ENTRY(getAnnots, 2)\n\tJS_STATIC_METHOD_ENTRY(getAnnot3D, 2)\n\tJS_STATIC_METHOD_ENTRY(getAnnots3D, 1)\n\tJS_STATIC_METHOD_ENTRY(getField, 1)\n\tJS_STATIC_METHOD_ENTRY(getIcon, 0)\n\tJS_STATIC_METHOD_ENTRY(getLinks, 0)\n\tJS_STATIC_METHOD_ENTRY(getNthFieldName, 1)\n\tJS_STATIC_METHOD_ENTRY(getOCGs, 0)\n\tJS_STATIC_METHOD_ENTRY(getPageBox, 0)\n\tJS_STATIC_METHOD_ENTRY(getPageNthWord, 3)\n\tJS_STATIC_METHOD_ENTRY(getPageNthWordQuads, 2)\n\tJS_STATIC_METHOD_ENTRY(getPageNumWords, 1)\n\tJS_STATIC_METHOD_ENTRY(getPrintParams, 0)\n\tJS_STATIC_METHOD_ENTRY(getURL, 2)\n\tJS_STATIC_METHOD_ENTRY(importAnFDF, 1)\n\tJS_STATIC_METHOD_ENTRY(importAnXFDF, 1)\n\tJS_STATIC_METHOD_ENTRY(importTextData, 2)\n\tJS_STATIC_METHOD_ENTRY(insertPages, 4)\n\tJS_STATIC_METHOD_ENTRY(mailForm, 6)\n\tJS_STATIC_METHOD_ENTRY(print, 9)\n\tJS_STATIC_METHOD_ENTRY(removeField, 1)\n\tJS_STATIC_METHOD_ENTRY(replacePages, 4)\n\tJS_STATIC_METHOD_ENTRY(resetForm, 1)\n\tJS_STATIC_METHOD_ENTRY(removeIcon, 0)\n\tJS_STATIC_METHOD_ENTRY(saveAs, 5)\n\tJS_STATIC_METHOD_ENTRY(submitForm, 23)\n\tJS_STATIC_METHOD_ENTRY(mailDoc, 0)\t\t\nEND_JS_STATIC_METHOD()\n\nIMPLEMENT_JS_CLASS(CJS_Document, Document)\n\nFX_BOOL\tCJS_Document::InitInstance(IFXJS_Context* cc)\n{\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\n\tDocument* pDoc = (Document*)GetEmbedObject();\n\tASSERT(pDoc != NULL);\n\t\n\tpDoc->AttachDoc(pContext->GetReaderDocument());\n\tpDoc->SetIsolate(pContext->GetJSRuntime()->GetIsolate());\n\treturn TRUE;\n};\n\n/* --------------------------------- Document --------------------------------- */\n\nDocument::Document(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject),\n\tm_cwBaseURL(L\"\"),\n\tm_pIconTree(NULL),\n\tm_pDocument(NULL),\n\tm_bDelay(FALSE),\n\tm_isolate(NULL)\n{\n}\n\nDocument::~Document()\n{\n\tif (m_pIconTree)\n\t{\n\t\tm_pIconTree->DeleteIconTree();\n\t\tdelete m_pIconTree;\n\t\tm_pIconTree = NULL;\n\t}\n\tfor (int i=0; i<m_DelayData.GetSize(); i++)\n\t{\n\t\tif (CJS_DelayData* pData = m_DelayData.GetAt(i))\n\t\t{\n\t\t\tdelete pData;\n\t\t\tpData = NULL;\n\t\t\tm_DelayData.SetAt(i, NULL);\n\t\t\t\n\t\t}\n\t}\n\n\tm_DelayData.RemoveAll();\n\tm_DelayAnnotData.RemoveAll();\n}\n\n//the total number of fileds in document.\nFX_BOOL Document::numFields(OBJ_PROP_PARAMS)\n{\n\tif (!vp.IsGetting()) return FALSE;\n\n\tASSERT(m_pDocument != NULL);\n\n\tCPDFSDK_InterForm *pInterForm = m_pDocument->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\n\tCPDF_InterForm *pPDFForm = pInterForm->GetInterForm();\n\tASSERT(pPDFForm != NULL);\n\n\tvp << (int)pPDFForm->CountFields();\n\n\treturn TRUE;\n}\n\nFX_BOOL Document::dirty(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsGetting())\n\t{\n\t\tif (m_pDocument->GetChangeMark())\n\t\t\tvp << true;\n\t\telse\n\t\t\tvp << false;\n\t}\n\telse\n\t{\n\t\tbool bChanged = false;\n\n\t\tvp >> bChanged;\n\n\t\tif (bChanged)\n\t\t\tm_pDocument->SetChangeMark();\n\t\telse\n\t\t\tm_pDocument->ClearChangeMark();\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL Document::ADBE(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsGetting())\n\t{\n\t\tvp.SetNull();\n\t}\n\telse\n\t{\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL Document::pageNum(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsGetting())\n\t{\t\t\t\n\t\tif (CPDFSDK_PageView* pPageView = m_pDocument->GetCurrentView())\n\t\t{\n\t\t\tvp << pPageView->GetPageIndex();\n\t\t}\n\t}\n\telse\n\t{\t\t\n\t\tint iPageCount = m_pDocument->GetPageCount();\n\n\t\tint iPageNum = 0;\n\t\tvp >> iPageNum;\n\n\t\tCPDFDoc_Environment* pEnv = m_pDocument->GetEnv();\n\t\tif(!pEnv)\n\t\t\treturn FALSE;\n\n\t\tif (iPageNum >= 0 && iPageNum < iPageCount)\n\t\t{\n\t\t\t pEnv->JS_docgotoPage(iPageNum);\n\t\t}\n\t\telse if (iPageNum >= iPageCount)\n\t\t{\n\t\t\t pEnv->JS_docgotoPage(iPageCount-1);\n\t\t}\n\t\telse if (iPageNum < 0)\n\t\t{\n\t\t\t pEnv->JS_docgotoPage(0);\n\t\t}\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL Document::ParserParams(JSObject* pObj,CJS_AnnotObj& annotobj)\n{\n\treturn TRUE;\n}\n\nFX_BOOL Document::addAnnot(OBJ_METHOD_PARAMS)\n{\n\treturn TRUE;\n}\n\nFX_BOOL Document::addField(OBJ_METHOD_PARAMS)\n{\n\t//Doesn't support.\n\treturn TRUE;\n}\n\n//exports form fields as a tab-delimited text file to a local hard disk.\n//comment: need reader support\n//note : watch the third parameter:cPath, for what case it can be safely saved?\n//int CPDFSDK_InterForm::ExportAsText(FX_BOOL bNoPassword,StringArray aFields,String cPath);\n//return value, int the index of the parameters illegal, the index is based on 1.\n\nFX_BOOL Document::exportAsText(OBJ_METHOD_PARAMS)\n{\n\tif (IsSafeMode(cc)) return TRUE;\n\treturn TRUE;\n}\n\n//exports form fields as a fdf file to the local hard drive\n//comment: need reader supports\n//note:the last parameter hasn't been confirmed.because the previous one blocks the way.\n//int CPDFSDK_Document::ExportAsFDF(FX_BOOL bAllFields,BOOL bNoPassword,StringArray aFields,FX_BOOL bFlags,String cPath,FX_BOOL bAnnotations);\n\nFX_BOOL Document::exportAsFDF(OBJ_METHOD_PARAMS)\n{\n\tv8::Isolate* isolate = GetIsolate(cc);\n\tif (IsSafeMode(cc)) return TRUE;\n\n\tASSERT(m_pDocument != NULL);\n\n\tif (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;\n\n\tFX_BOOL bAllFields = params.size() > 0 ? (FX_BOOL)params[0] : FALSE;\n\tFX_BOOL bNoPassWord = params.size() > 1 ? (FX_BOOL)params[1] : TRUE;\n\tFX_BOOL bWhole = params.size() > 2 ? (params[2].GetType() == VT_null) : TRUE;\n\tCJS_Array arrayFileds(isolate);\n\tif (!bWhole)\n\t\tarrayFileds.Attach(params[2]);\n\t//FX_BOOL bFlags = params.size() > 3 ? (FX_BOOL)params[3] : FALSE;\n\tCFX_WideString swFilePath = params.size() > 4 ? (FX_LPCWSTR)params[4].operator CFX_WideString() : (FX_LPCWSTR)L\"\";\n\n\tif (swFilePath.IsEmpty())\n\t{\n\t\tCPDFDoc_Environment* pEnv = m_pDocument->GetEnv();\n\t\tswFilePath = pEnv->JS_fieldBrowse();\n\t\tif(swFilePath.IsEmpty())\n\t\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\tswFilePath = app::PDFPathToSysPath(swFilePath);\n\t}\n\t\n\tm_pDocument->SetFocusAnnot(NULL);\n   \n\tCPDFSDK_InterForm* pInterForm= (CPDFSDK_InterForm*)m_pDocument->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\n\tCPDF_InterForm* pPDFForm = pInterForm->GetInterForm();\n\tASSERT(pPDFForm != NULL);\n\n\tCFX_PtrArray aFields;\n\n\tif (bWhole)\n\t{\n\t\tfor (int j=0,jsz=pPDFForm->CountFields(); j<jsz; j++)\n\t\t{\n\t\t\taFields.Add(pPDFForm->GetField(j));\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (int i=0,isz=arrayFileds.GetLength(); i<isz; i++)\n\t\t{\n\t\t\tCJS_Value valName(isolate);\n\t\t\tarrayFileds.GetElement(i,valName);\n\t\t\tCFX_WideString swName = valName.operator CFX_WideString();\n\n\t\t\tfor (int j=0, jsz=pPDFForm->CountFields(swName); j<jsz; j++)\n\t\t\t{\n\t\t\t\taFields.Add(pPDFForm->GetField(j, swName));\n\t\t\t}\n\t\t}\n\t}\n\n\tCFX_PtrArray fields;\n\n\tfor (int i=0,sz=aFields.GetSize(); i<sz; i++)\n\t{\n\t\tCPDF_FormField* pField = (CPDF_FormField*)aFields[i];\n\t\t\n\t\tif (!bAllFields)\n\t\t\tif (pField->GetValue() == L\"\")\n\t\t\t\tcontinue;\n\n\t\tif (bNoPassWord)\n\t\t\tif (pField->GetFieldFlags() & 0x2000)\n\t\t\t\tcontinue;\n\n\t\tfields.Add((void*)pField);\n\t}    \n\n\treturn pInterForm->ExportFieldsToFDFFile(swFilePath, fields, TRUE);\n}\n\n//exports form fields an XFDF file to the local hard drive\n//comment: need reder supports\n//note:the last parameter can't be test\n//int CPDFSDK_Document::ExportAsXFDF(FX_BOOL bAllFields,FX_BOOL  bNoPassWord,StringArray aFields,String cPath,FX_BOOL bAnnoatations);\n\nFX_BOOL Document::exportAsXFDF(OBJ_METHOD_PARAMS)\n{\n\tif (IsSafeMode(cc)) return TRUE;\n\tASSERT(m_pDocument != NULL);\n\n\tif (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;\n\n\treturn TRUE;\n}\n\n//Maps a field object in PDF document to a JavaScript variable\n//comment:\n//note: the paremter cName, this is clue how to treat if the cName is not a valiable filed name in this document\n\nFX_BOOL Document::getField(OBJ_METHOD_PARAMS)\n{\n\tv8::Isolate* isolate = GetIsolate(cc);\n\tASSERT(m_pDocument != NULL);\n\n\tif (params.size() < 1) return FALSE;\n\n\tCFX_WideString wideName = params[0].operator CFX_WideString();\n\n\tCPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\n\tCPDF_InterForm* pPDFForm = pInterForm->GetInterForm();\n\tASSERT(pPDFForm != NULL);\n\n\tif (pPDFForm->CountFields(wideName) <= 0) \n\t{\n\t\tvRet.SetNull();\n\t\treturn TRUE;\n\t}\n\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\tASSERT(pRuntime != NULL);\n\n\tJSFXObject  pFieldObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L\"Field\"));\n\n\tCJS_Field * pJSField = (CJS_Field*)JS_GetPrivate(isolate,pFieldObj);\n\tASSERT(pJSField != NULL);\n\n\tField * pField = (Field *)pJSField->GetEmbedObject(); \n\tASSERT(pField != NULL);\n\n\tpField->AttachField(this, wideName);\n\tvRet = pJSField;\n\n\treturn TRUE;\n}\n\n//Gets the name of the nth field in the document \n//comment:\n//note: the parameter nIndex, if it is not available\n\nFX_BOOL Document::getNthFieldName(OBJ_METHOD_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tint nIndex = params.size() > 0 ? (int)params[0] : -1;\n\tif (nIndex == -1) return FALSE;\n\n\tCPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\n\tCPDF_InterForm* pPDFForm = pInterForm->GetInterForm();\n\tASSERT(pPDFForm != NULL);\n\n\tCPDF_FormField* pField = pPDFForm->GetField(nIndex);\n\tif (!pField)\n\t\treturn FALSE;\n\n\tvRet = pField->GetFullName();\n\treturn TRUE;\t\n}\n\n//imports the specified fdf file.\n//comments: need reader suppport\n//note:once the cpath is illigl  then a file dialog box pops up in order to ask user to chooose the file\n//int CPDFSDK_Document::importAnFDF(String cPath);\n\nFX_BOOL Document::importAnFDF(OBJ_METHOD_PARAMS)\n{\n\tif (IsSafeMode(cc)) return TRUE;\n\tASSERT(m_pDocument != NULL);\n\n\tif (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) || \n\t\tm_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||\n\t\tm_pDocument->GetPermissions(FPDFPERM_FILL_FORM))) return FALSE;\n\n\n\tCFX_WideString swPath;\n\t\n\tif (params.size() > 0)\n\t\tswPath = params[0];\n\t\n\tif (swPath.IsEmpty())\n\t{\n\t\tCPDFDoc_Environment* pEnv = m_pDocument->GetEnv();\n\t\tswPath = pEnv->JS_fieldBrowse();\n\t\tif(swPath.IsEmpty())\n\t\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\tswPath = app::PDFPathToSysPath(swPath);\n\t}\n\n\tm_pDocument->SetFocusAnnot(NULL);\n\n\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\n\tif (!pInterForm->ImportFormFromFDFFile(swPath, TRUE))\n\t\treturn FALSE;\n\n\tm_pDocument->SetChangeMark();\n// \tCPDFDoc_Environment* pEnv = m_pDocument->GetEnv();\n// \tASSERT(pEnv != NULL);\n// \tIUndo* pUndo = IUndo::GetUndo(pEnv);\n// \tASSERT(pUndo != NULL);\n// \tpUndo->Reset(m_pDocument);\n\n\treturn TRUE;\n}\n\n//imports and specified XFDF file containing XML form data\n//comment: need reader supports\n//note: same as up\n//int CPDFSDK_Document::importAnFDF(String cPath)\n\nFX_BOOL Document::importAnXFDF(OBJ_METHOD_PARAMS)\n{\n\tif (IsSafeMode(cc)) return TRUE;\n\tASSERT(m_pDocument != NULL);\n\n\tif (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) || \n\t\tm_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||\n\t\tm_pDocument->GetPermissions(FPDFPERM_FILL_FORM))) return FALSE;\n\n\treturn TRUE;\n}\n\n//imports and specified text file \n//commnet: need reader supports\n//note: same as up,when nRow is not rational,adobe is dumb for it.\n//int CPDFSDK_Document::importTextData(String cPath,int nRow);\n\nFX_BOOL Document::importTextData(OBJ_METHOD_PARAMS)\n{\n\tif (IsSafeMode(cc)) return TRUE;\n\tASSERT(m_pDocument != NULL);\n\n\tif (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) || \n\t\tm_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||\n\t\tm_pDocument->GetPermissions(FPDFPERM_FILL_FORM))) return FALSE;\n\n\treturn TRUE;\n}\n\n//exports the form data and mails the resulting fdf file as an attachment to all recipients.\n//comment: need reader supports\n//note:\n//int CPDFSDK_Document::mailForm(FX_BOOL bUI,String cto,string ccc,string cbcc,string cSubject,string cms);\n\nFX_BOOL Document::mailForm(OBJ_METHOD_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;\n\n\tint iLength = params.size();\n\n\tFX_BOOL bUI = iLength > 0 ? (FX_BOOL)params[0] : TRUE;\n\tCFX_WideString cTo = iLength > 1 ? (FX_LPCWSTR)params[1].operator CFX_WideString() : (FX_LPCWSTR)L\"\";\n\tCFX_WideString cCc = iLength > 2 ? (FX_LPCWSTR)params[2].operator CFX_WideString() : (FX_LPCWSTR)L\"\";\n\tCFX_WideString cBcc = iLength > 3 ? (FX_LPCWSTR)params[3].operator CFX_WideString() : (FX_LPCWSTR)L\"\";\n\tCFX_WideString cSubject = iLength > 4 ? (FX_LPCWSTR)params[4].operator CFX_WideString() : (FX_LPCWSTR)L\"\";\n\tCFX_WideString cMsg = iLength > 5 ? (FX_LPCWSTR)params[5].operator CFX_WideString() : (FX_LPCWSTR)L\"\";\n\n\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\n\tCFX_ByteTextBuf textBuf;\n\tif (!pInterForm->ExportFormToFDFTextBuf(textBuf))\n\t\treturn FALSE;\n\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCPDFDoc_Environment* pEnv = pContext->GetReaderApp();\n\tASSERT(pEnv != NULL);\n\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\tASSERT(pRuntime != NULL);\n\n\tpRuntime->BeginBlock();\n\tpEnv->JS_docmailForm(textBuf.GetBuffer(), textBuf.GetLength(), bUI, (FX_LPCWSTR)cTo, (FX_LPCWSTR)cSubject, (FX_LPCWSTR)cCc, (FX_LPCWSTR)cBcc, (FX_LPCWSTR)cMsg);\n\tpRuntime->EndBlock();\n\treturn TRUE;\n}\n\nFX_BOOL Document::print(OBJ_METHOD_PARAMS)\n{\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\tASSERT(pRuntime != NULL);\n\n\tFX_BOOL bUI = TRUE;\n\tint nStart = 0;\n\tint nEnd = 0;\n\tFX_BOOL bSilent = FALSE;\n\tFX_BOOL bShrinkToFit = FALSE;\n\tFX_BOOL bPrintAsImage = FALSE;\n\tFX_BOOL bReverse = FALSE;\n\tFX_BOOL bAnnotations = FALSE;\n\n\tint nlength = params.size();\n\tif(nlength ==9)\n\t{\n\t\tif (params[8].GetType() == VT_fxobject)\n\t\t{\n\t\t\tJSFXObject pObj = (JSFXObject)params[8];\n\t\t\t{\n\t\t\t\tif (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L\"PrintParamsObj\"))\n\t\t\t\t{\n\t\t\t\t\tif (CJS_Object* pJSObj = (CJS_Object*)params[8])\n\t\t\t\t\t{\n\t\t\t\t\t\t\tif (PrintParamsObj* pprintparamsObj = (PrintParamsObj*)pJSObj->GetEmbedObject())\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbUI = pprintparamsObj->bUI;\n\t\t\t\t\t\t\t\tnStart = pprintparamsObj->nStart;\n\t\t\t\t\t\t\t\tnEnd = pprintparamsObj->nEnd;\n\t\t\t\t\t\t\t\tbSilent = pprintparamsObj->bSilent;\n\t\t\t\t\t\t\t\tbShrinkToFit = pprintparamsObj->bShrinkToFit;\n\t\t\t\t\t\t\t\tbPrintAsImage = pprintparamsObj->bPrintAsImage;\n\t\t\t\t\t\t\t\tbReverse = pprintparamsObj->bReverse;\n\t\t\t\t\t\t\t\tbAnnotations = pprintparamsObj->bAnnotations;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\t\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(nlength >= 1)\n\t\t\t bUI = params[0];\n\t\tif(nlength >= 2)\n\t\t\t nStart = (int)params[1];\n\t\tif(nlength >= 3)\n\t\t\tnEnd = (int)params[2];\n\t\tif(nlength >= 4)\n\t\t\tbSilent = params[3];\n\t\tif(nlength >= 5)\n\t\t\tbShrinkToFit = params[4];\n\t\tif(nlength >= 6)\n\t\t\tbPrintAsImage = params[5];\n\t\tif(nlength >= 7)\n\t\t\tbReverse = params[6];\n\t\tif(nlength >= 8)\n\t\t\tbAnnotations = params[7];\n\t}\n\n\tASSERT(m_pDocument != NULL);\n \n\tif (CPDFDoc_Environment* pEnv = m_pDocument->GetEnv())\n\t{\n\t\tpEnv->JS_docprint(bUI, nStart, nEnd, bSilent, bShrinkToFit, bPrintAsImage, bReverse, bAnnotations);\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}\n\n//removes the specified field from the document.\n//comment:\n//note: if the filed name is not retional, adobe is dumb for it.\n\nFX_BOOL Document::removeField(OBJ_METHOD_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) || \n\t\tm_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM))) return FALSE;\n\n\tif (params.size() < 1)\n\t\treturn TRUE;\n\n\tCFX_WideString sFieldName = params[0].operator CFX_WideString();\n\n\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\n\tCFX_PtrArray widgets;\n\tpInterForm->GetWidgets(sFieldName, widgets);\n\n\tint nSize = widgets.GetSize();\n\n\tif (nSize > 0)\n\t{\n\t\tfor (int i=0; i<nSize; i++)\n\t\t{\n\t\t\tCPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgets[i];\n\t\t\tASSERT(pWidget != NULL);\n\n\t\t\tCPDF_Rect rcAnnot = pWidget->GetRect();\n\t\t\trcAnnot.left -= 1;\n\t\t\trcAnnot.bottom -= 1;\n\t\t\trcAnnot.right += 1;\n\t\t\trcAnnot.top += 1;\n\n\t\t\tCFX_RectArray aRefresh;\n\t\t\taRefresh.Add(rcAnnot);\n\n\t\t\tCPDF_Page* pPage = pWidget->GetPDFPage();\n\t\t\tASSERT(pPage != NULL);\n\t\t\t\n\t\t\tCPDFSDK_PageView* pPageView = m_pDocument->GetPageView(pPage);\n\t\t\tpPageView->DeleteAnnot(pWidget);\n\n\t\t\tpPageView->UpdateRects(aRefresh);\n\t\t}\n\t\tm_pDocument->SetChangeMark();\n\t}\n\n\treturn TRUE;\n}\n\n//reset filed values within a document.\n//comment:\n//note: if the fields names r not rational, aodbe is dumb for it.\n\nFX_BOOL Document::resetForm(OBJ_METHOD_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) || \n\t\tm_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||\n\t\tm_pDocument->GetPermissions(FPDFPERM_FILL_FORM))) return FALSE;\n\n\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\n\tCPDF_InterForm* pPDFForm = pInterForm->GetInterForm();\n\tASSERT(pPDFForm != NULL);\n\n\tv8::Isolate* isolate = GetIsolate(cc);\n\tCJS_Array aName(isolate);\n\n\tif (params.size() > 0)\n\t{\n\t\tswitch (params[0].GetType())\n\t\t{\n\t\tdefault:\n\t\t\taName.Attach(params[0]);\n\t\t\tbreak;\n\t\tcase VT_string:\n\t\t\taName.SetElement(0,params[0]);\n\t\t\tbreak;\n\t\t}\n\n\t\tCFX_PtrArray aFields;\n\n\t\tfor (int i=0,isz=aName.GetLength(); i<isz; i++)\n\t\t{\n\t\t\tCJS_Value valElement(isolate);\n\t\t\taName.GetElement(i,valElement);\n\t\t\tCFX_WideString swVal = valElement.operator CFX_WideString();\t\n\t\t\t\n\t\t\tfor (int j=0,jsz=pPDFForm->CountFields(swVal); j<jsz; j++)\n\t\t\t{\n\t\t\t\taFields.Add((void*)pPDFForm->GetField(j,swVal));\n\t\t\t}\t\t\n\t\t}\n\n\t\tif (aFields.GetSize() > 0)\n\t\t{\n\t\t\tpPDFForm->ResetForm(aFields, TRUE, TRUE);\n\t\t\tm_pDocument->SetChangeMark();\n\n\t\t}\n\t}\n\telse\n\t{\n\t\tpPDFForm->ResetForm(TRUE);\n\t\tm_pDocument->SetChangeMark();\n\n\t}\n\n\treturn TRUE;\n}\n\n\nFX_BOOL Document::saveAs(OBJ_METHOD_PARAMS)\n{\n\n\tif (IsSafeMode(cc)) return TRUE;\n\n\tASSERT(m_pDocument != NULL);\n\n//\tm_pDocument->DoSaveAs();\n\n\treturn TRUE;\n}\n\n\nFX_BOOL Document::submitForm(OBJ_METHOD_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n//\tif (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;\n\n\tint nSize = params.size();\n\tif (nSize < 1) return FALSE;\n\n\tCFX_WideString strURL;\n\tFX_BOOL bFDF = TRUE;\n\tFX_BOOL bEmpty = FALSE;\n\tv8::Isolate* isolate = GetIsolate(cc);\n\tCJS_Array aFields(isolate);\n\n\tCJS_Value v = params[0];\n\tif (v.GetType() == VT_string)\n\t{\n\t\tstrURL = params[0].operator CFX_WideString();\n\t\tif (nSize > 1)\n\t\t\tbFDF = params[1];\n\t\tif (nSize > 2)\n\t\t\tbEmpty = params[2];\n\t\tif (nSize > 3)\n\t\t\taFields.Attach(params[3]);\n\t}\n\telse if (v.GetType() == VT_object)\n\t{\n\t\tJSObject pObj = (JSObject)params[0];\n\t\tv8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L\"cURL\");\n\t\tif (!pValue.IsEmpty())\n\t\t\tstrURL = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue));\n\t\tpValue = JS_GetObjectElement(isolate,pObj, L\"bFDF\");\n\t\t\tbFDF = CJS_Value(isolate,pValue, GET_VALUE_TYPE(pValue));\n\t\tpValue = JS_GetObjectElement(isolate,pObj, L\"bEmpty\");\n\t\t\tbEmpty = CJS_Value(isolate,pValue, GET_VALUE_TYPE(pValue));\n\t\tpValue = JS_GetObjectElement(isolate,pObj,L\"aFields\");\n\t\t\taFields.Attach(CJS_Value(isolate,pValue, GET_VALUE_TYPE(pValue)));\n\t}\t\t\n\n\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\tCPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();\n\tASSERT(pPDFInterForm != NULL);\n\n\tFX_BOOL bAll = (aFields.GetLength() == 0);\n\n\tif (bAll && bEmpty)\n\t{\n\t\tCJS_Context* pContext = (CJS_Context*)cc;\n\t\tASSERT(pContext != NULL);\n\t\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\t\tASSERT(pRuntime != NULL);\n\n\t\t\n\t\tif (pPDFInterForm->CheckRequiredFields())\n\t\t{\n\t\t\tpRuntime->BeginBlock();\n\t\t\tpInterForm->SubmitForm(strURL, FALSE);\n\t\t\tpRuntime->EndBlock();\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\telse\n\t{\t\n\t\tCFX_PtrArray fieldObjects;\n\n\t\tfor (int i=0,sz=aFields.GetLength(); i<sz; i++)\n\t\t{\n\t\t\tCJS_Value valName(isolate);\n\t\t\taFields.GetElement(i, valName);\n\t\t\tCFX_WideString sName = valName.operator CFX_WideString();\n\n\t\t\tCPDF_InterForm* pPDFForm = pInterForm->GetInterForm();\n\t\t\tASSERT(pPDFForm != NULL);\n\n\t\t\tfor (int j=0, jsz=pPDFForm->CountFields(sName); j<jsz; j++)\n\t\t\t{\n\t\t\t\tCPDF_FormField* pField = pPDFForm->GetField(j, sName);\n\t\t\t\tif (!bEmpty && pField->GetValue().IsEmpty())\n\t\t\t\t\tcontinue;\n\n\t\t\t\tfieldObjects.Add(pField);\n\t\t\t}\n\t\t}\n\n\t\tCJS_Context* pContext = (CJS_Context*)cc;\n\t\tASSERT(pContext != NULL);\n\t\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\t\tASSERT(pRuntime != NULL);\n\n\t\t\n\t\tif (pPDFInterForm->CheckRequiredFields(&fieldObjects, TRUE))\n\t\t{\n\t\t\tpRuntime->BeginBlock();\n\t\t\tpInterForm->SubmitFields(strURL, fieldObjects, TRUE, !bFDF);\n\t\t\tpRuntime->EndBlock();\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////////\n\nvoid Document::AttachDoc(CPDFSDK_Document *pDoc)\n{\n\tm_pDocument = pDoc;\n}\n\nCPDFSDK_Document * Document::GetReaderDoc()\n{\n\treturn m_pDocument;\n}\n\nFX_BOOL Document::ExtractFileName(CPDFSDK_Document *pDoc,CFX_ByteString &strFileName)\n{\n\treturn FALSE;\n}\n\nFX_BOOL Document::ExtractFolderName(CPDFSDK_Document *pDoc,CFX_ByteString &strFolderName)\n{\n\treturn FALSE;\n}\n\nFX_BOOL Document::bookmarkRoot(OBJ_PROP_PARAMS)\n{\t\n\treturn TRUE;\n}\n\nFX_BOOL Document::mailDoc(OBJ_METHOD_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tFX_BOOL bUI = TRUE;\n\tCFX_WideString cTo = L\"\";\n\tCFX_WideString cCc = L\"\";\n\tCFX_WideString cBcc = L\"\";\n\tCFX_WideString cSubject = L\"\";\n\tCFX_WideString cMsg = L\"\";\n\t\n\n\tbUI = params.size()>=1?static_cast<FX_BOOL>(params[0]):TRUE;\n\tcTo = params.size()>=2?(const wchar_t*)params[1].operator CFX_WideString():L\"\";\n\tcCc = params.size()>=3?(const wchar_t*)params[2].operator CFX_WideString():L\"\";\n\tcBcc = params.size()>=4?(const wchar_t*)params[3].operator CFX_WideString():L\"\";\n\tcSubject = params.size()>=5?(const wchar_t*)params[4].operator CFX_WideString():L\"\";\n\tcMsg = params.size()>=6?(const wchar_t*)params[5].operator CFX_WideString():L\"\";\n\t\n\tv8::Isolate* isolate = GetIsolate(cc);\n\n\tif(params.size()>=1 && params[0].GetType() == VT_object)\n\t{\n\t\tJSObject  pObj = (JSObject )params[0];\n\n\t\tv8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L\"bUI\");\n\t\t\tbUI = (int)CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue));\n\n\t\tpValue = JS_GetObjectElement(isolate,pObj, L\"cTo\");\n\t\t\tcTo = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();\n\n\t\tpValue = JS_GetObjectElement(isolate,pObj, L\"cCc\");\n\t\t\tcCc = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();\n\n\t\tpValue = JS_GetObjectElement(isolate,pObj, L\"cBcc\");\n\t\t\tcBcc = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();\n\n\t\tpValue = JS_GetObjectElement(isolate,pObj, L\"cSubject\");\n\t\t\tcSubject = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();\n\n\t\tpValue = JS_GetObjectElement(isolate,pObj, L\"cMsg\");\n\t\t\tcMsg = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();\n\t\n\t}\n\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\tASSERT(pRuntime != NULL);\n\n\tpRuntime->BeginBlock();\n\tCPDFDoc_Environment* pEnv = pRuntime->GetReaderApp();\n\tpEnv->JS_docmailForm(NULL, 0, bUI, (FX_LPCWSTR)cTo, (FX_LPCWSTR)cSubject, (FX_LPCWSTR)cCc, (FX_LPCWSTR)cBcc, (FX_LPCWSTR)cMsg);\n\tpRuntime->EndBlock();\n\n\treturn TRUE;\n}\n\nFX_BOOL Document::author(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tCPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();\n\tif (!pDictionary)return FALSE;\n\n\tif (vp.IsGetting())\n\t{\n\t\tvp << pDictionary->GetUnicodeText(\"Author\");\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\tif (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;\n\n\t\tCFX_WideString csAuthor;\n\t\tvp >> csAuthor;\n\t\tpDictionary->SetAtString(\"Author\", PDF_EncodeText(csAuthor));\n\t\tm_pDocument->SetChangeMark();\n\t\treturn TRUE;\n\t}\n}\n\nFX_BOOL Document::info(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tCPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();\n\tif (!pDictionary)return FALSE;\n\n\tCFX_WideString cwAuthor\t\t\t= pDictionary->GetUnicodeText(\"Author\");\n\tCFX_WideString cwTitle\t\t\t= pDictionary->GetUnicodeText(\"Title\");\n\tCFX_WideString cwSubject\t\t= pDictionary->GetUnicodeText(\"Subject\");\n\tCFX_WideString cwKeywords\t\t= pDictionary->GetUnicodeText(\"Keywords\");\n\tCFX_WideString cwCreator\t\t= pDictionary->GetUnicodeText(\"Creator\");\n\tCFX_WideString cwProducer\t\t= pDictionary->GetUnicodeText(\"Producer\");\n\tCFX_WideString cwCreationDate\t= pDictionary->GetUnicodeText(\"CreationDate\");\n\tCFX_WideString cwModDate\t\t= pDictionary->GetUnicodeText(\"ModDate\");\n\tCFX_WideString cwTrapped\t\t= pDictionary->GetUnicodeText(\"Trapped\");\n\n\tv8::Isolate* isolate = GetIsolate(cc);\n\tif (!vp.IsSetting())\n\t{\n\t\tCJS_Context* pContext = (CJS_Context *)cc;\n\t\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\n\t\tJSFXObject  pObj = JS_NewFxDynamicObj(*pRuntime, pContext, -1);\n\n\t\tJS_PutObjectString(isolate,pObj, L\"Author\", cwAuthor);\n\t\tJS_PutObjectString(isolate,pObj, L\"Title\", cwTitle);\n\t\tJS_PutObjectString(isolate,pObj, L\"Subject\", cwSubject);\n\t\tJS_PutObjectString(isolate,pObj, L\"Keywords\", cwKeywords);\n\t\tJS_PutObjectString(isolate,pObj, L\"Creator\", cwCreator);\n\t\tJS_PutObjectString(isolate,pObj, L\"Producer\", cwProducer);\n\t\tJS_PutObjectString(isolate,pObj, L\"CreationDate\", cwCreationDate);\n\t\tJS_PutObjectString(isolate,pObj, L\"ModDate\", cwModDate);\n\t\tJS_PutObjectString(isolate,pObj, L\"Trapped\", cwTrapped);\n\n// It's to be compatible to non-standard info dictionary.\t\n\t\tFX_POSITION pos = pDictionary->GetStartPos();\n\t\twhile(pos)\n\t\t{\n\t\t\tCFX_ByteString bsKey;\n\t\t\tCPDF_Object* pValueObj = pDictionary->GetNextElement(pos, bsKey);\n\t\t\tCFX_WideString wsKey  = CFX_WideString::FromUTF8(bsKey, bsKey.GetLength());\n\t\t\tif((pValueObj->GetType()==PDFOBJ_STRING) || (pValueObj->GetType()==PDFOBJ_NAME) )\n\t\t\t\t\tJS_PutObjectString(isolate,pObj, wsKey, pValueObj->GetUnicodeText());\n\t\t\tif(pValueObj->GetType()==PDFOBJ_NUMBER)\n\t\t\t\tJS_PutObjectNumber(isolate,pObj, wsKey, (float)pValueObj->GetNumber());\n\t\t\tif(pValueObj->GetType()==PDFOBJ_BOOLEAN)\n\t\t\t\tJS_PutObjectBoolean(isolate,pObj, wsKey, (bool)pValueObj->GetInteger());\n\t\t}\n\n\t\tvp << pObj;\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\treturn TRUE;\n\t}\n}\n\nFX_BOOL Document::creationDate(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tCPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();\n\tif (!pDictionary)return FALSE;\n\n\tif (vp.IsGetting())\n\t{\n\t\tvp << pDictionary->GetUnicodeText(\"CreationDate\");\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\tif (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;\n\n\t\tCFX_WideString csCreationDate;\n\t\tvp >> csCreationDate;\n\t\tpDictionary->SetAtString(\"CreationDate\", PDF_EncodeText(csCreationDate));\n\t\tm_pDocument->SetChangeMark();\n\n\t\treturn TRUE;\n\t}\n}\n\nFX_BOOL Document::creator(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tCPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();\n\tif (!pDictionary)return FALSE;\n\n\tif (vp.IsGetting())\n\t{\n\t\tvp << pDictionary->GetUnicodeText(\"Creator\");\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\tif (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;\n\n\t\tCFX_WideString csCreator;\n\t\tvp >> csCreator;\n\t\tpDictionary->SetAtString(\"Creator\", PDF_EncodeText(csCreator));\n\t\tm_pDocument->SetChangeMark();\n\t\treturn TRUE;\n\t}\n}\n\nFX_BOOL Document::delay(OBJ_PROP_PARAMS)\n{\n\tif (vp.IsGetting())\n\t{\n\t\tvp << m_bDelay;\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\tASSERT(m_pDocument != NULL);\n\n\t\tif (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;\n\n\t\tbool b;\n\t\tvp >> b;\n\n\t\tm_bDelay = b;\n\n\t\tif (m_bDelay) \n\t\t{\n\t\t\tfor (int i=0,sz=m_DelayData.GetSize(); i<sz; i++)\n\t\t\t\tdelete m_DelayData.GetAt(i);\n\n\t\t\tm_DelayData.RemoveAll();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (int i=0,sz=m_DelayData.GetSize(); i<sz; i++)\n\t\t\t{\n\t\t\t\tif (CJS_DelayData* pData = m_DelayData.GetAt(i))\n\t\t\t\t{\n\t\t\t\t\tField::DoDelay(m_pDocument, pData);\n\t\t\t\t\tdelete m_DelayData.GetAt(i);\n\t\t\t\t}\n\t\t\t}\n\t\t\tm_DelayData.RemoveAll();\n\t\t}\n\n\t\treturn TRUE;\n\t}\n}\n\nFX_BOOL Document::keywords(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tCPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();\n\tif (!pDictionary)return FALSE;\n\n\tif (vp.IsGetting())\n\t{\n\t\tvp << pDictionary->GetUnicodeText(\"Keywords\");\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\tif (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;\n\n\t\tCFX_WideString csKeywords;\n\t\tvp >> csKeywords;\n\t\tpDictionary->SetAtString(\"Keywords\", PDF_EncodeText(csKeywords));\n\t\tm_pDocument->SetChangeMark();\n\t\treturn TRUE;\n\t}\n}\n\nFX_BOOL Document::modDate(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tCPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();\n\tif (!pDictionary)return FALSE;\n\n\tif (vp.IsGetting())\n\t{\n\t\tvp << pDictionary->GetUnicodeText(\"ModDate\");\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\tif (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;\n\n\t\tCFX_WideString csmodDate;\n\t\tvp >> csmodDate;\n\t\tpDictionary->SetAtString(\"ModDate\", PDF_EncodeText(csmodDate));\n\t\tm_pDocument->SetChangeMark();\n\t\treturn TRUE;\n\t}\n}\n\nFX_BOOL Document::producer(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tCPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();\n\tif (!pDictionary)return FALSE;\n\n\tif (vp.IsGetting())\n\t{\n\t\tvp << pDictionary->GetUnicodeText(\"Producer\");\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\tif (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;\n\n\t\tCFX_WideString csproducer;\n\t\tvp >> csproducer;\n\t\tpDictionary->SetAtString(\"Producer\", PDF_EncodeText(csproducer));\n\t\tm_pDocument->SetChangeMark();\n\t\treturn TRUE;\n\t}\n}\n\nFX_BOOL Document::subject(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tCPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();\n\tif (!pDictionary)return FALSE;\n\n\tif (vp.IsGetting())\n\t{\n\t\tvp << pDictionary->GetUnicodeText(\"Subject\");\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\tif (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;\n\n\t\tCFX_WideString cssubject;\n\t\tvp >> cssubject;\n\t\tpDictionary->SetAtString(\"Subject\", PDF_EncodeText(cssubject));\n\t\tm_pDocument->SetChangeMark();\n\t\treturn TRUE;\n\t}\n}\n\nFX_BOOL Document::title(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (m_pDocument == NULL || m_pDocument->GetDocument() == NULL)\n\t\treturn FALSE;\n\n\tCPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();\n\tif (!pDictionary)return FALSE;\n\n\tif (vp.IsGetting())\n\t{\n\t\tvp << pDictionary->GetUnicodeText(\"Title\");\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\tif (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;\n\n\t\tCFX_WideString cstitle;\n\t\tvp >> cstitle;\n\t\tpDictionary->SetAtString(\"Title\", PDF_EncodeText(cstitle));\n\t\tm_pDocument->SetChangeMark();\n\t\treturn TRUE;\n\t}\n}\n\nFX_BOOL Document::numPages(OBJ_PROP_PARAMS)\n{\n\tif (vp.IsGetting())\n\t{\n\t\tASSERT(m_pDocument != NULL);\n\t\tvp << m_pDocument->GetPageCount();\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\treturn FALSE;\n\t}\n}\n\nFX_BOOL Document::external(OBJ_PROP_PARAMS)\n{\n\t//In Chrome case,should always return true.\n\tvp << TRUE;\n\treturn TRUE;\n}\n\nFX_BOOL Document::filesize(OBJ_PROP_PARAMS)\n{\n\tif (!vp.IsGetting())return FALSE;\n\n\tASSERT(m_pDocument != NULL);\n\n// \tCFile file(m_pDocument->GetPath(), CFile::modeRead | CFile::typeBinary | CFile::shareDenyNone);\n// \tvp << (double)file.GetLength();\n// \tfile.Close();\n\n\tif ( m_pDocument->GetPath().IsEmpty() == FALSE)\n\t{\n\t\tCFX_ByteString bsStr = CFX_ByteString::FromUnicode( m_pDocument->GetPath() );\n\t\tFILE * pFile = NULL;\n\t\tpFile = fopen( bsStr.GetBuffer( bsStr.GetLength() ), \"rb\" );\n\t\tif ( pFile )\n\t\t{\n\t\t\tfseek( pFile, 0, SEEK_END );\n\t\t\tlong lSize = ftell( pFile );\n\t\t\tfclose( pFile );\n\t\t\tpFile = NULL;\n\n\t\t\tvp << (FX_INT32)(lSize);\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\tvp << 0;\n\treturn TRUE;\n}\n\nFX_BOOL Document::mouseX(OBJ_PROP_PARAMS)\n{\n\treturn TRUE;\t\n}\n\nFX_BOOL Document::mouseY(OBJ_PROP_PARAMS)\n{\n\treturn TRUE;\n}\n\nFX_BOOL Document::baseURL(OBJ_PROP_PARAMS)\n{\n\tif (vp.IsGetting())\n\t{\n\t\tvp << m_cwBaseURL;\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\tvp >> m_cwBaseURL;\n\t\treturn TRUE;\n\t}\n}\n\nFX_BOOL Document::calculate(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\n\tif (vp.IsGetting())\n\t{\n\t\tif (pInterForm->IsCalculateEnabled())\n\t\t\tvp << true;\n\t\telse\n\t\t\tvp << false;\n\t}\n\telse\n\t{\n\t\tbool bCalculate;\n\t\tvp >> bCalculate;\n\n\t\tpInterForm->EnableCalculate(bCalculate);\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL Document::documentFileName(OBJ_PROP_PARAMS)\n{\n\tif (!vp.IsGetting())\n\t\treturn FALSE;\n\n\tCFX_WideString wsFilePath = m_pDocument->GetPath();\n\n\tFX_INT32 i = wsFilePath.GetLength() - 1;\n\tfor ( ; i >= 0; i-- )\n\t{\n\t\tif ( wsFilePath.GetAt( i ) == L'\\\\' || wsFilePath.GetAt( i ) == L'/' )\n\t\t\tbreak;\n\t}\n\tif ( i >= 0 && i < wsFilePath.GetLength() - 1 )\n\t{\n\t\tvp << ( wsFilePath.GetBuffer( wsFilePath.GetLength() ) + i + 1 );\n\t}else{\n\t\tvp << L\"\";\n\t}\n\treturn TRUE;\n}\n\nCFX_WideString Document::ReversalStr(CFX_WideString cbFrom)\n{\n\tsize_t iLength = cbFrom.GetLength();\n\tbase::CheckedNumeric<size_t> iSize = sizeof(wchar_t);\n\tiSize *= (iLength + 1);\n\twchar_t* pResult = (wchar_t*)malloc(iSize.ValueOrDie());\n\twchar_t* pFrom = (wchar_t*)cbFrom.GetBuffer(iLength);\n\n\tfor (size_t i = 0; i < iLength; i++)\n\t{\n\t\tpResult[i] = *(pFrom + iLength - i - 1);\n\t}\n\tpResult[iLength] = L'\\0';\n\n\tcbFrom.ReleaseBuffer();\n\tCFX_WideString cbRet = CFX_WideString(pResult);\n\tfree(pResult);\n\tpResult = NULL;\n\treturn cbRet;\n}\n\nCFX_WideString Document::CutString(CFX_WideString cbFrom)\n{\n\tsize_t iLength = cbFrom.GetLength();\n\tbase::CheckedNumeric<size_t> iSize = sizeof(wchar_t);\n\tiSize *= (iLength + 1);\n\twchar_t* pResult = (wchar_t*)malloc(iSize.ValueOrDie());\n\twchar_t* pFrom = (wchar_t*)cbFrom.GetBuffer(iLength);\n\n\tfor (int i = 0; i < iLength; i++)\n\t{\n\t\tif (pFrom[i] == L'\\\\' || pFrom[i] == L'/')\n\t\t{\n\t\t\tpResult[i] = L'\\0';\n\t\t\tbreak;\n\t\t}\n\t\tpResult[i] = pFrom[i];\n\t}\n\tpResult[iLength] = L'\\0';\n\n\tcbFrom.ReleaseBuffer();\n\tCFX_WideString cbRet = CFX_WideString(pResult);\n\tfree(pResult);\n\tpResult = NULL;\n\treturn cbRet;\n}\n\nFX_BOOL Document::path(OBJ_PROP_PARAMS)\n{\n\tif (!vp.IsGetting()) return FALSE;\n\n\tvp << app::SysPathToPDFPath(m_pDocument->GetPath());\n\n\treturn TRUE;\n}\n\nFX_BOOL Document::pageWindowRect(OBJ_PROP_PARAMS)\n{\n\treturn TRUE;\n}\n\nFX_BOOL Document::layout(OBJ_PROP_PARAMS)\n{\t\n\treturn TRUE;\n}\n\nFX_BOOL Document::addLink(OBJ_METHOD_PARAMS)\n{\n\treturn TRUE;\n}\n\nFX_BOOL Document::closeDoc(OBJ_METHOD_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\n\t\n\t\n\n\treturn TRUE;\n}\n\nFX_BOOL Document::getPageBox(OBJ_METHOD_PARAMS)\n{\n\treturn TRUE;\n}\n\n\nFX_BOOL Document::getAnnot(OBJ_METHOD_PARAMS)\n{\n\treturn TRUE;\n}\n\nFX_BOOL Document::getAnnots(OBJ_METHOD_PARAMS)\n{\n\tvRet.SetNull();\n\treturn TRUE;\n}\n\nFX_BOOL Document::getAnnot3D(OBJ_METHOD_PARAMS)\n{\n\tvRet.SetNull();\n\treturn TRUE;\n}\n\nFX_BOOL Document::getAnnots3D(OBJ_METHOD_PARAMS)\n{\n\tvRet = VT_undefined;\n\treturn TRUE;\n}\n\nFX_BOOL Document::getOCGs(OBJ_METHOD_PARAMS)\n{\t\n\treturn TRUE;\n}\n\nFX_BOOL Document::getLinks(OBJ_METHOD_PARAMS)\n{\n\treturn TRUE;\n}\n\nbool Document::IsEnclosedInRect(CFX_FloatRect rect, CFX_FloatRect LinkRect)\n{\n\tif (rect.left <= LinkRect.left\n\t  && rect.top <= LinkRect.top\n\t  && rect.right >= LinkRect.right\n\t  && rect.bottom >= LinkRect.bottom)\n\t\treturn true;\n\telse\n\t\treturn false;\n}\n\nvoid IconTree::InsertIconElement(IconElement* pNewIcon)\n{\n\tif (!pNewIcon)return;\n\n\tif (m_pHead == NULL && m_pEnd == NULL)\n\t{\n\t\tm_pHead = m_pEnd = pNewIcon;\n\t\tm_iLength++;\n\t}\n\telse\n\t{\n\t\tm_pEnd->NextIcon = pNewIcon;\n\t\tm_pEnd = pNewIcon;\n\t\tm_iLength++;\n\t}\n}\n\nvoid IconTree::DeleteIconTree()\n{\n\tif (!m_pHead || !m_pEnd)return;\n\t\n\tIconElement* pTemp = NULL;\n\twhile(m_pEnd != m_pHead)\n\t{\n\t\tpTemp = m_pHead;\n\t\tm_pHead = m_pHead->NextIcon;\n\t\tdelete pTemp;\n\t}\n\n\tdelete m_pEnd;\n\tm_pHead = NULL;\n\tm_pEnd = NULL;\n}\n\nint IconTree::GetLength()\n{\n\treturn m_iLength;\n}\n\nIconElement* IconTree::operator [](int iIndex)\n{\n\tif (iIndex >= 0 && iIndex <= m_iLength)\n\t{\n\t\tIconElement* pTemp = m_pHead;\n\t\tfor (int i = 0; i < iIndex; i++)\n\t\t{\n\t\t\tpTemp = pTemp->NextIcon;\n\t\t}\n\t\treturn pTemp;\n\t}\n\telse\n\t\treturn NULL;\n}\n\nvoid IconTree::DeleteIconElement(CFX_WideString swIconName)\n{\n\tIconElement* pTemp = m_pHead;\n\tint iLoopCount = m_iLength; \n\tfor (int i = 0; i < iLoopCount - 1; i++)\n\t{\n\t\tif (pTemp == m_pEnd)\n\t\t\tbreak;\n\t\n\t\tif (m_pHead->IconName == swIconName)\n\t\t{\n\t\t\tm_pHead = m_pHead->NextIcon;\n\t\t\tdelete pTemp;\n\t\t\tm_iLength--;\n\t\t\tpTemp = m_pHead;\n\t\t}\n\t\tif (pTemp->NextIcon->IconName == swIconName)\n\t\t{\n\t\t\tif (pTemp->NextIcon == m_pEnd)\n\t\t\t{\n\t\t\t\tm_pEnd = pTemp;\n\t\t\t\tdelete pTemp->NextIcon;\n\t\t\t\tm_iLength--;\n\t\t\t\tpTemp->NextIcon = NULL;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tIconElement* pElement = pTemp->NextIcon;\n\t\t\t\tpTemp->NextIcon = pTemp->NextIcon->NextIcon;\n\t\t\t\tdelete pElement;\n\t\t\t\tm_iLength--;\n\t\t\t\tpElement = NULL;\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tpTemp = pTemp->NextIcon;\n\t}\n}\n\nFX_BOOL Document::addIcon(OBJ_METHOD_PARAMS)\n{\n\tif (params.size() != 2)return FALSE;\n\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\tASSERT(pRuntime != NULL);\n\n\tCFX_WideString swIconName = params[0].operator CFX_WideString();\n\t\n\tJSFXObject pJSIcon = (JSFXObject)params[1];\n\tif (JS_GetObjDefnID(pJSIcon) != JS_GetObjDefnID(*pRuntime, L\"Icon\")) return FALSE;\n\n\tCJS_EmbedObj* pEmbedObj = ((CJS_Object*)params[1])->GetEmbedObject();\n\tif (!pEmbedObj)return FALSE;\n\tIcon* pIcon = (Icon*)pEmbedObj;\n\n\tif (!m_pIconTree)\n\t\tm_pIconTree = new IconTree();\n\n\tIconElement* pNewIcon = new IconElement();\n\tpNewIcon->IconName = swIconName;\n\tpNewIcon->NextIcon = NULL;\n\tpNewIcon->IconStream = pIcon;\n\tm_pIconTree->InsertIconElement(pNewIcon);\n\treturn TRUE;\n}\n\nFX_BOOL Document::icons(OBJ_PROP_PARAMS)\n{\n\tif (vp.IsSetting())\n\t\treturn FALSE;\n\n\tif (!m_pIconTree)\n\t{\n\t\tvp.SetNull();\n\t\treturn TRUE;\n\t}\n\n\tCJS_Array Icons(m_isolate);\n\tIconElement* pIconElement = NULL;\n\tint iIconTreeLength = m_pIconTree->GetLength();\n\n\tCJS_Context* pContext = (CJS_Context *)cc;\n\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\n\tfor (int i = 0; i < iIconTreeLength; i++)\n\t{\n\t\tpIconElement = (*m_pIconTree)[i];\n\t\t\n\t\tJSFXObject  pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L\"Icon\"));\n\t\tif (pObj.IsEmpty()) return FALSE;\n\t\t\t\t\n\t\tCJS_Icon * pJS_Icon = (CJS_Icon *)JS_GetPrivate(pObj);\n\t\tif (!pJS_Icon) return FALSE;\n\n\t\tIcon* pIcon = (Icon*)pJS_Icon->GetEmbedObject();\n\t\tif (!pIcon)return FALSE;\n\n\t\tpIcon->SetStream(pIconElement->IconStream->GetStream());\n\t\tpIcon->SetIconName(pIconElement->IconName);\n\t\tIcons.SetElement(i, CJS_Value(m_isolate,pJS_Icon));\n\t}\n\n\tvp << Icons;\n\treturn TRUE;\n}\n\nFX_BOOL Document::getIcon(OBJ_METHOD_PARAMS)\n{\n\tif (params.size() != 1)return FALSE;\n\tif(!m_pIconTree)\n\t\treturn FALSE;\n\tCFX_WideString swIconName = params[0].operator CFX_WideString();\n\tint iIconCounts = m_pIconTree->GetLength();\n\n\tCJS_Context* pContext = (CJS_Context *)cc;\n\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\n\tfor (int i = 0; i < iIconCounts; i++)\n\t{\n\t\tif ((*m_pIconTree)[i]->IconName == swIconName)\n\t\t{\n\t\t\tIcon* pRetIcon = (*m_pIconTree)[i]->IconStream;\n\t\t\t\t\n\t\t\tJSFXObject  pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L\"Icon\"));\n\t\t\tif (pObj.IsEmpty()) return FALSE;\n\t\t\t\t\t\n\t\t\tCJS_Icon * pJS_Icon = (CJS_Icon *)JS_GetPrivate(pObj);\n\t\t\tif (!pJS_Icon) return FALSE;\n\n\t\t\tIcon* pIcon = (Icon*)pJS_Icon->GetEmbedObject();\n\t\t\tif (!pIcon)return FALSE;\n\n\t\t\tpIcon->SetIconName(swIconName);\n\t\t\tpIcon->SetStream(pRetIcon->GetStream());\n\t\t\tvRet = pJS_Icon;\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL Document::removeIcon(OBJ_METHOD_PARAMS)\n{\n\tif (params.size() != 1)return FALSE;\n\tif(!m_pIconTree)\n\t\treturn FALSE;\n\tCFX_WideString swIconName = params[0].operator CFX_WideString();\n#ifndef FOXIT_CHROME_BUILD\n\tm_pIconTree->DeleteIconElement(swIconName);\n#endif\n\treturn TRUE;\n}\n\nFX_BOOL Document::createDataObject(OBJ_METHOD_PARAMS)\n{\n\tif (IsSafeMode(cc)) return TRUE;\n\tASSERT(m_pDocument != NULL);\n\n\tCFX_WideString swName = L\"\";\n\tCFX_ByteString sbName = \"\";\n\tCFX_WideString swValue = L\"\";\n\tCFX_WideString swMIMEType = L\"\";\n\tCFX_WideString swCryptFilter = L\"\";\n\tCFX_ByteString sbFileValue = \"\";\n\t\n\tint iParamSize = params.size();\n\tfor (int i = 0; i < iParamSize; i++)\n\t{\n\t\tif (i == 0)\n\t\t\tswName = params[0];\n\t\tif (i == 1)\n\t\t\tswValue = params[1];\n\t\tif (i == 2)\n\t\t\tswMIMEType = params[2];\n\t\tif (i == 3)\n\t\t\tswCryptFilter = params[4];\n\t}\n\n\tFILE* pFile = NULL;\n\n\t//CFileStatus fileStatus;\n\tconst int BUFSIZE = 17;\n\tFX_BYTE buf[BUFSIZE];\n\tFX_BYTE *pBuffer = NULL;\n\tchar* pBuf = NULL;\n\tint nFileSize = 0;\n\tsbFileValue = CFX_ByteString::FromUnicode(swValue);\n\tsbName = CFX_ByteString::FromUnicode(swName);\n\tint iBufLength = sbFileValue.GetLength();\n\tpBuf = (char*)malloc(sizeof(char) * iBufLength);\n\tpBuf = sbFileValue.GetBuffer(iBufLength);\n\n\tif ( NULL == (pFile = FXSYS_fopen( sbName.GetBuffer(sbName.GetLength()), \"wb+\" )) )\n\t{\n\t\treturn FALSE;\n\t}\n\n\tfwrite( pBuf, sizeof(char), iBufLength, pFile );\n\tfclose( pFile );\n\tpFile = NULL;\n\n\tpFile = FXSYS_fopen( sbName.GetBuffer(sbName.GetLength()), \"rb+\" );\n\tfseek( pFile, 0, SEEK_END );\n\tnFileSize = ftell( pFile );\n\n\tpBuffer = new FX_BYTE[nFileSize];\n\tfseek( pFile, 0, SEEK_SET );\n\tsize_t s = fread( pBuffer, sizeof(char), nFileSize, pFile );\n\tif(s == 0)\n\t{\n\t\tdelete[] pBuffer;\n\t\treturn FALSE;\n\t}\n\n\tCRYPT_MD5Generate(pBuffer, nFileSize, buf);\n\tbuf[BUFSIZE - 1] = 0;\n\tCFX_WideString csCheckSum((FX_LPCWSTR)buf, 16);\n\tdelete[] pBuffer;\n\n\treturn TRUE;\n}\n\nFX_BOOL Document::media(OBJ_PROP_PARAMS)\n{\n\treturn TRUE;\n}\n\nFX_BOOL Document::calculateNow(OBJ_METHOD_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) || \n\t\tm_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||\n\t\tm_pDocument->GetPermissions(FPDFPERM_FILL_FORM))) return FALSE;\n\n\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\tpInterForm->OnCalculate();\n\treturn TRUE;\n}\n\nFX_BOOL Document::Collab(OBJ_PROP_PARAMS)\n{\n\treturn TRUE;\n}\n\nFX_BOOL Document::getPageNthWord(OBJ_METHOD_PARAMS)\n{\n\t//if (IsSafeMode(cc)) return TRUE;\n\n\tASSERT(m_pDocument != NULL);\n\n\tif (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;\n\n\tint nPageNo = params.GetSize() > 0 ? (int)params[0] : 0;\n\tint nWordNo = params.GetSize() > 1 ? (int)params[1] : 0;\n\tbool bStrip = params.GetSize() > 2 ? (bool)params[2] : true;\n\n\tCPDF_Document* pDocument = m_pDocument->GetDocument();\n\tif (!pDocument) return FALSE;\n\n\tif (nPageNo < 0 || nPageNo >= pDocument->GetPageCount())\n\t{\n\t\t//sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);\n\t\treturn FALSE;\n\t}\n\n\tCPDF_Dictionary* pPageDict = pDocument->GetPage(nPageNo);\n\tif (!pPageDict) return FALSE;\n\n\tCPDF_Page page;\n\tpage.Load(pDocument, pPageDict);\n\tpage.StartParse();\n\tpage.ParseContent();\n\n\tFX_POSITION pos = page.GetFirstObjectPosition();\n\n\tint nWords = 0;\n\n\tCFX_WideString swRet;\n\n\twhile (pos)\n\t{\n\t\tif (CPDF_PageObject* pPageObj = page.GetNextObject(pos))\n\t\t{\n\t\t\tif (pPageObj->m_Type == PDFPAGE_TEXT)\n\t\t\t{\n\t\t\t\tint nObjWords = CountWords((CPDF_TextObject*)pPageObj);\n\n\t\t\t\tif (nWords + nObjWords >= nWordNo)\n\t\t\t\t{\n\t\t\t\t\tswRet = GetObjWordStr((CPDF_TextObject*)pPageObj, nWordNo - nWords);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tnWords += nObjWords;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (bStrip)\n\t{\n\t\tswRet.TrimLeft();\n\t\tswRet.TrimRight();\n\t}\n\n\tvRet = swRet;\n\treturn TRUE;\n}\n\nFX_BOOL Document::getPageNthWordQuads(OBJ_METHOD_PARAMS)\n{\n\t//if (IsSafeMode(cc)) return TRUE;\n\n\tASSERT(m_pDocument != NULL);\n\n\tif (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;\n\n\treturn FALSE;\n}\n\nFX_BOOL Document::getPageNumWords(OBJ_METHOD_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;\n\n\tint nPageNo = params.GetSize() > 0 ? (int)params[0] : 0;\n\n\tCPDF_Document* pDocument = m_pDocument->GetDocument();\n\tASSERT(pDocument != NULL);\n\n\tif (nPageNo < 0 || nPageNo >= pDocument->GetPageCount())\n\t{\n\t\t//sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);\n\t\treturn FALSE;\n\t}\n\n\tCPDF_Dictionary* pPageDict = pDocument->GetPage(nPageNo);\n\tif (!pPageDict) return FALSE;\n\n\tCPDF_Page page;\n\tpage.Load(pDocument, pPageDict);\n\tpage.StartParse();\n\tpage.ParseContent();\n\n\tFX_POSITION pos = page.GetFirstObjectPosition();\n\n\tint nWords = 0;\n\n\twhile (pos)\n\t{\n\t\tif (CPDF_PageObject* pPageObj = page.GetNextObject(pos))\n\t\t{\n\t\t\tif (pPageObj->m_Type == PDFPAGE_TEXT)\n\t\t\t{\n\t\t\t\tCPDF_TextObject* pTextObj = (CPDF_TextObject*)pPageObj;\n\t\t\t\tnWords += CountWords(pTextObj);\n\t\t\t}\n\t\t}\n\t}\n\n\tvRet = nWords;\n\n\treturn TRUE;\n}\n\nFX_BOOL Document::getPrintParams(OBJ_METHOD_PARAMS)\n{\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\tASSERT(pRuntime != NULL);\n\tJSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L\"PrintParamsObj\"));\n\t//not implemented yet.\n\tvRet = pRetObj;\n\n\treturn TRUE;\n}\n\n#define ISLATINWORD(u)\t(u != 0x20 && u <= 0x28FF)\n\nint\tDocument::CountWords(CPDF_TextObject* pTextObj)\n{\n\tif (!pTextObj) return 0;\n\n\tint nWords = 0;\n\n\tCPDF_Font* pFont = pTextObj->GetFont();\n\tif (!pFont) return 0;\n\n\tFX_BOOL bIsLatin = FALSE;\n\n\tfor (int i=0, sz=pTextObj->CountChars(); i<sz; i++)\n\t{\n\t\tFX_DWORD charcode = -1;\n\t\tFX_FLOAT kerning;\n\n\t\tpTextObj->GetCharInfo(i, charcode, kerning);\n\t\tCFX_WideString swUnicode = pFont->UnicodeFromCharCode(charcode);\n\n\t\tFX_WORD unicode = 0;\n\t\tif (swUnicode.GetLength() > 0)\n\t\t\tunicode = swUnicode[0];\n\n\t\tif (ISLATINWORD(unicode) && bIsLatin)\n\t\t\tcontinue;\n\t\t\n\t\tbIsLatin = ISLATINWORD(unicode);\n\t\tif (unicode != 0x20)\n\t\t\tnWords++;\n\t}\n\n\treturn nWords;\n}\n\nCFX_WideString Document::GetObjWordStr(CPDF_TextObject* pTextObj, int nWordIndex)\n{\n\tASSERT(pTextObj != NULL);\n\n\tCFX_WideString swRet;\n\n\tCPDF_Font* pFont = pTextObj->GetFont();\n\tif (!pFont) return L\"\";\n\n\tint nWords = 0;\n\tFX_BOOL bIsLatin = FALSE;\n\n\tfor (int i=0, sz=pTextObj->CountChars(); i<sz; i++)\n\t{\n\t\tFX_DWORD charcode = -1;\n\t\tFX_FLOAT kerning;\n\n\t\tpTextObj->GetCharInfo(i, charcode, kerning);\n\t\tCFX_WideString swUnicode = pFont->UnicodeFromCharCode(charcode);\n\n\t\tFX_WORD unicode = 0;\n\t\tif (swUnicode.GetLength() > 0)\n\t\t\tunicode = swUnicode[0];\n\n\t\tif (ISLATINWORD(unicode) && bIsLatin)\n\t\t{\n\t\t}\n\t\telse\n\t\t{\t\t\n\t\t\tbIsLatin = ISLATINWORD(unicode);\n\t\t\tif (unicode != 0x20)\n\t\t\t\tnWords++;\t\n\t\t}\n\n\t\tif (nWords-1 == nWordIndex)\n\t\t\tswRet += unicode;\n\t}\n\n\treturn swRet;\n}\n\nFX_BOOL Document::zoom(OBJ_PROP_PARAMS)\n{\n\n\treturn TRUE;\n}\n\n/**\n(none,\tNoVary)\n(fitP,\tFitPage)\n(fitW,\tFitWidth)\n(fitH,\tFitHeight)\n(fitV,\tFitVisibleWidth)\n(pref,\tPreferred)\n(refW,\tReflowWidth)\n*/\n\nFX_BOOL Document::zoomType(OBJ_PROP_PARAMS)\n{\n\treturn TRUE;\n}\n\nFX_BOOL Document::deletePages(OBJ_METHOD_PARAMS)\n{\n\t\n\n\t\n\t\n\n\n\tv8::Isolate* isolate = GetIsolate(cc);\n// \tif (pEnv->GetAppName().Compare(PHANTOM) != 0)\n// \t\treturn TRUE;\n\n\t//if (IsSafeMode(cc)) return TRUE;\n\n\tASSERT(m_pDocument != NULL);\n\n\tif (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) || \n\t\tm_pDocument->GetPermissions(FPDFPERM_ASSEMBLE))) return FALSE;\n\n\tint iSize = params.size();\n\t\n\tint nStart = 0;\n\tint nEnd = 0;\n\t\n\tif (iSize < 1)\n\t{\n\t}\n\telse if (iSize == 1)\n\t{\n\t\tif (params[0].GetType() == VT_object)\n\t\t{\n\t\t\tJSObject  pObj = (JSObject )params[0];\n\t\t\tv8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L\"nStart\");\n\t\t\t\tnStart = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));\n\n\t\t\tpValue = JS_GetObjectElement(isolate,pObj, L\"nEnd\");\n\t\t\t\tnEnd = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnStart = (int)params[0];\n\t\t}\n\t}\n\telse\n\t{\n\t\tnStart = (int)params[0];\n\t\tnEnd = (int)params[1];\n\t}\n\n\tint nTotal = m_pDocument->GetPageCount();\n\n\tif (nStart < 0)\tnStart = 0;\n\tif (nStart >= nTotal) nStart = nTotal - 1;\n\n\tif (nEnd < 0) nEnd = 0;\n\tif (nEnd >= nTotal) nEnd = nTotal - 1;\n\n\tif (nEnd < nStart) nEnd = nStart;\n\n\t\n\n#ifndef FOXIT_CHROME_BUILD\n\treturn m_pDocument->DeletePages(nStart, nEnd - nStart + 1);\n#else\n\treturn TRUE;\n#endif\n}\n\nFX_BOOL Document::extractPages(OBJ_METHOD_PARAMS)\n{\n\t\n\n\t\n\t\n\t\n\n\tv8::Isolate* isolate = GetIsolate(cc);\n\n\tif (IsSafeMode(cc)) return TRUE;\n\n\tASSERT(m_pDocument != NULL);\n\n\tif (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT)) return FALSE;\n\n\tint iSize = params.size();\n\t\n\tint nTotal = m_pDocument->GetPageCount();\n\tint nStart = 0;\n\tint nEnd = nTotal - 1;\n\n\tCFX_WideString swFilePath;\n\t\n\tif (iSize < 1)\n\t{\n\t}\n\telse if (iSize == 1)\n\t{\n\t\tif (params[0].GetType() == VT_object)\n\t\t{\n\t\t\tJSObject  pObj = (JSObject )params[0];\n\t\t\tv8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L\"nStart\");\n\t\t\t\tnStart = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));\n\n\t\t\tpValue = JS_GetObjectElement(isolate,pObj, L\"nEnd\");\n\t\t\t\tnEnd = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));\n\n\t\t\tpValue = JS_GetObjectElement(isolate,pObj, L\"cPath\");\n\t\t\t\tswFilePath = CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnStart = (int)params[0];\n\t\t}\n\t}\n\telse if (iSize == 2)\n\t{\n\t\tnStart = (int)params[0];\n\t\tnEnd = (int)params[1];\n\t}\n\telse\n\t{\n\t\tnStart = (int)params[0];\n\t\tnEnd = (int)params[1];\n\t\tswFilePath = params[2].operator CFX_WideString();\n\t}\n\n\tif (nEnd < nStart)\n\t\tnEnd = nStart;\n\n\tCPDF_Document *pNewDoc = new CPDF_Document;\n\tpNewDoc->CreateNewDoc();\t\n\n\tCFX_WordArray array;\n\tfor (int i=nStart; i<=nEnd; i++)\n\t\tarray.Add(i);\n\n//\tm_pDocument->ExtractPages(array, pNewDoc);\n\n\tif (swFilePath.IsEmpty())\n\t{\n\n\t}\n\telse\n\t{\n\t\tswFilePath = app::PDFPathToSysPath(swFilePath);\n\t\tCPDF_Creator PDFCreater(pNewDoc);\n\t\tPDFCreater.Create(swFilePath);\n\t\tdelete pNewDoc;\n//\t\tpEnv->OpenDocument(swFilePath);\n\t\tvRet.SetNull();\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL Document::insertPages(OBJ_METHOD_PARAMS)\n{\n\n\n\t\n\n\n\n\tv8::Isolate* isolate = GetIsolate(cc);\n\n\tif (IsSafeMode(cc)) return TRUE;\n\n\tASSERT(m_pDocument != NULL);\n\n\tif (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) || \n\t\tm_pDocument->GetPermissions(FPDFPERM_ASSEMBLE))) return FALSE;\n\n\tint iSize = params.size();\n\t\n\tint nStart = 0;\n\tint nEnd = 0;\n\tint nPage = 0;\n\n\tCFX_WideString swFilePath;\n\t\n\tif (iSize < 1)\n\t{\n\t}\n\telse if (iSize == 1)\n\t{\n\t\tif (params[0].GetType() == VT_object)\n\t\t{\n\t\t\tJSObject  pObj = (JSObject )params[0];\n\n\t\t\tv8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L\"nPage\");\n\t\t\t\tnPage = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));\n\n\t\t\tpValue = JS_GetObjectElement(isolate,pObj, L\"cPath\");\n\t\t\t\tswFilePath = CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();\n\n\t\t\tpValue = JS_GetObjectElement(isolate,pObj, L\"nStart\");\n\t\t\t\tnStart = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));\n\n\t\t\tpValue = JS_GetObjectElement(isolate,pObj, L\"nEnd\");\n\t\t\t\tnEnd = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnPage = (int)params[0];\n\t\t}\n\t}\n\telse \n\t{\n\t\tnPage = (int)params[0];\n\n\t\tif (iSize >= 2)\n\t\t\tswFilePath = params[1].operator CFX_WideString();\n\n\t\tif (iSize >= 3)\n\t\t\tnStart = (int)params[2];\n\n\t\tif (iSize >= 4)\n\t\t\tnEnd = (int)params[3];\n\t}\n\n\tnPage++;\n\n\tif (nPage < 0)\n\t\tnPage = 0;\n\n\tif (nPage > m_pDocument->GetPageCount())\n\t\tnPage = m_pDocument->GetPageCount();\n\n\tif (swFilePath.IsEmpty()) return FALSE;\n\n\tswFilePath = app::PDFPathToSysPath(swFilePath);\n\n\tCPDF_Parser pdfParser;\n\tpdfParser.StartParse(swFilePath, FALSE);\n\tCPDF_Document* pSrcDoc = pdfParser.GetDocument();\n\n\tif (!pSrcDoc) \n\t{\n\t\tpdfParser.CloseParser();\n\t\treturn FALSE;\n\t}\n\n\tint nTotal = pSrcDoc->GetPageCount();\n\n\tif (nStart < 0)\tnStart = 0;\n\tif (nStart >= nTotal) nStart = nTotal - 1;\n\n\tif (nEnd < 0) nEnd = 0;\n\tif (nEnd >= nTotal) nEnd = nTotal - 1;\n\n\tif (nEnd < nStart) nEnd = nStart;\n\n\tCFX_WordArray array;\n\tfor (int i=nStart; i<=nEnd; i++)\n\t\tarray.Add(i);\n\n//\tm_pDocument->InsertPages(nPage, pSrcDoc, array);\n\n\tpdfParser.CloseParser();\n\n\treturn TRUE;\n}\n\nFX_BOOL Document::replacePages(OBJ_METHOD_PARAMS)\n{\n\n\n\t\n\n\n\n\tv8::Isolate* isolate = GetIsolate(cc);\n\n\tif (IsSafeMode(cc)) return TRUE;\n\n\tASSERT(m_pDocument != NULL);\n\n\tif (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) || \n\t\tm_pDocument->GetPermissions(FPDFPERM_ASSEMBLE))) return FALSE;\n\n\tint iSize = params.size();\n\t\n\tint nStart = -1;\n\tint nEnd = -1;\n\tint nPage = 0;\n\n\tCFX_WideString swFilePath;\n\t\n\tif (iSize < 1)\n\t{\n\t}\n\telse if (iSize == 1)\n\t{\n\t\tif (params[0].GetType() == VT_object)\n\t\t{\n\t\t\tJSObject  pObj = (JSObject )params[0];\n\n\t\t\tv8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L\"nPage\");\n\t\t\t\tnPage = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));\n\n\t\t\tpValue = JS_GetObjectElement(isolate,pObj, L\"cPath\");\n\t\t\t\tswFilePath = CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();\n\n\t\t\tpValue = JS_GetObjectElement(isolate,pObj, L\"nStart\");\n\t\t\t\tnStart = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));\n\n\t\t\tpValue = JS_GetObjectElement(isolate,pObj, L\"nEnd\");\n\t\t\t\tnEnd = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnPage = (int)params[0];\n\t\t}\n\t}\n\telse \n\t{\n\t\tnPage = (int)params[0];\n\n\t\tif (iSize >= 2)\n\t\t\tswFilePath = params[1].operator CFX_WideString();\n\n\t\tif (iSize >= 3)\n\t\t\tnStart = (int)params[2];\n\n\t\tif (iSize >= 4)\n\t\t\tnEnd = (int)params[3];\n\t}\n\n\tif (nPage < 0)\n\t\tnPage = 0;\n\n\tif (nPage >= m_pDocument->GetPageCount())\n\t\tnPage = m_pDocument->GetPageCount() - 1;\n\n\tif (swFilePath.IsEmpty()) return FALSE;\n\n\tswFilePath = app::PDFPathToSysPath(swFilePath);\n\n\tCPDF_Parser pdfParser;\n\tpdfParser.StartParse(swFilePath, FALSE);\n\tCPDF_Document* pSrcDoc = pdfParser.GetDocument();\n\n\tif (!pSrcDoc) \n\t{\n\t\tpdfParser.CloseParser();\n\t\treturn FALSE;\n\t}\n\n\tint nTotal = pSrcDoc->GetPageCount();\n\n\tif (nStart < 0)\n\t{\n\t\tif (nEnd < 0)\n\t\t{\n\t\t\tnStart = 0;\n\t\t\tnEnd = nTotal - 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnStart = 0;\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (nEnd < 0)\n\t\t{\n\t\t\tnEnd = nStart;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (nStart >= nTotal) nStart = nTotal - 1;\n\t\t\tif (nEnd >= nTotal) nEnd = nTotal - 1;\n\n\t\t\tif (nEnd < nStart) nEnd = nStart;\n\t\t}\n\t}\n\n\tCFX_WordArray array;\n\tfor (int i=nStart; i<=nEnd; i++)\n\t\tarray.Add(i);\n\n//\tm_pDocument->ReplacePages(nPage, pSrcDoc, array);\n\n\tpdfParser.CloseParser();\n\n\treturn TRUE;\n}\n\nFX_BOOL Document::getURL(OBJ_METHOD_PARAMS)\n{\n\tif (IsSafeMode(cc)) return TRUE;\n\n\treturn TRUE;\n}\n\nvoid Document::AddDelayData(CJS_DelayData* pData)\n{\n\tm_DelayData.Add(pData);\n}\n\nvoid Document::DoFieldDelay(const CFX_WideString& sFieldName, int nControlIndex)\n{\n\tCFX_DWordArray DelArray;\n\n\tfor (int i=0,sz=m_DelayData.GetSize(); i<sz; i++)\n\t{\n\t\tif (CJS_DelayData* pData = m_DelayData.GetAt(i))\n\t\t{\n\t\t\tif (pData->sFieldName == sFieldName && pData->nControlIndex == nControlIndex)\n\t\t\t{\n\t\t\t\tField::DoDelay(m_pDocument, pData);\n\t\t\t\tdelete pData;\n\t\t\t\tm_DelayData.SetAt(i, NULL);\n\t\t\t\tDelArray.Add(i);\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (int j=DelArray.GetSize()-1; j>=0; j--)\n\t{\n\t\tm_DelayData.RemoveAt(DelArray[j]);\n\t}\n}\n\nvoid Document::AddDelayAnnotData(CJS_AnnotObj *pData)\n{\n\tm_DelayAnnotData.Add(pData);\n}\n\nvoid Document::DoAnnotDelay()\n{\n\tCFX_DWordArray DelArray;\n\t\n\tfor (int j=DelArray.GetSize()-1; j>=0; j--)\n\t{\n\t\tm_DelayData.RemoveAt(DelArray[j]);\n\t}\n}\n"
  },
  {
    "path": "fpdfsdk/src/javascript/Field.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/javascript/JavaScript.h\"\n#include \"../../include/javascript/IJavaScript.h\"\n#include \"../../include/javascript/JS_Define.h\"\n#include \"../../include/javascript/JS_Object.h\"\n#include \"../../include/javascript/JS_Value.h\"\n#include \"../../include/javascript/Field.h\"\n#include \"../../include/javascript/JS_EventHandler.h\"\n//#include \"../include/JS_ResMgr.h\"\n#include \"../../include/javascript/JS_Context.h\"\n#include \"../../include/javascript/JS_Runtime.h\"\n#include \"../../include/javascript/Document.h\"\n#include \"../../include/javascript/color.h\"\n#include \"../../include/javascript/PublicMethods.h\"\n#include \"../../include/javascript/Icon.h\"\n\n\n/* ---------------------- Field ---------------------- */\n\nBEGIN_JS_STATIC_CONST(CJS_Field)\nEND_JS_STATIC_CONST()\n\nBEGIN_JS_STATIC_PROP(CJS_Field)\n\tJS_STATIC_PROP_ENTRY(alignment)\n\tJS_STATIC_PROP_ENTRY(borderStyle)\n\tJS_STATIC_PROP_ENTRY(buttonAlignX)\n\tJS_STATIC_PROP_ENTRY(buttonAlignY)\n\tJS_STATIC_PROP_ENTRY(buttonFitBounds)\n\tJS_STATIC_PROP_ENTRY(buttonPosition)\n\tJS_STATIC_PROP_ENTRY(buttonScaleHow)\n\tJS_STATIC_PROP_ENTRY(buttonScaleWhen)\n\tJS_STATIC_PROP_ENTRY(calcOrderIndex)\n\tJS_STATIC_PROP_ENTRY(charLimit)\n\tJS_STATIC_PROP_ENTRY(comb)\n\tJS_STATIC_PROP_ENTRY(commitOnSelChange)\n\tJS_STATIC_PROP_ENTRY(currentValueIndices)\n\tJS_STATIC_PROP_ENTRY(defaultStyle)\n\tJS_STATIC_PROP_ENTRY(defaultValue)\n\tJS_STATIC_PROP_ENTRY(doNotScroll)\n\tJS_STATIC_PROP_ENTRY(doNotSpellCheck)\n\tJS_STATIC_PROP_ENTRY(delay)\n\tJS_STATIC_PROP_ENTRY(display)\n\tJS_STATIC_PROP_ENTRY(doc)\n\tJS_STATIC_PROP_ENTRY(editable)\n\tJS_STATIC_PROP_ENTRY(exportValues)\n\tJS_STATIC_PROP_ENTRY(hidden)\n\tJS_STATIC_PROP_ENTRY(fileSelect)\n\tJS_STATIC_PROP_ENTRY(fillColor)\n\tJS_STATIC_PROP_ENTRY(lineWidth)\n\tJS_STATIC_PROP_ENTRY(highlight)\n\tJS_STATIC_PROP_ENTRY(multiline)\n\tJS_STATIC_PROP_ENTRY(multipleSelection)\n\tJS_STATIC_PROP_ENTRY(name)\n\tJS_STATIC_PROP_ENTRY(numItems)\n\tJS_STATIC_PROP_ENTRY(page)\n\tJS_STATIC_PROP_ENTRY(password)\n\tJS_STATIC_PROP_ENTRY(print)\n\tJS_STATIC_PROP_ENTRY(radiosInUnison)\n\tJS_STATIC_PROP_ENTRY(readonly)\n\tJS_STATIC_PROP_ENTRY(rect)\n\tJS_STATIC_PROP_ENTRY(required)\n\tJS_STATIC_PROP_ENTRY(richText)\n\tJS_STATIC_PROP_ENTRY(richValue)\n\tJS_STATIC_PROP_ENTRY(rotation)\n\tJS_STATIC_PROP_ENTRY(strokeColor)\n\tJS_STATIC_PROP_ENTRY(style)\n\tJS_STATIC_PROP_ENTRY(submitName)\n\tJS_STATIC_PROP_ENTRY(textColor)\n\tJS_STATIC_PROP_ENTRY(textFont)\n\tJS_STATIC_PROP_ENTRY(textSize)\n\tJS_STATIC_PROP_ENTRY(type)\n\tJS_STATIC_PROP_ENTRY(userName)\n\tJS_STATIC_PROP_ENTRY(value)\n\tJS_STATIC_PROP_ENTRY(valueAsString)\n\tJS_STATIC_PROP_ENTRY(source)\nEND_JS_STATIC_PROP()\n\nBEGIN_JS_STATIC_METHOD(CJS_Field)\n\tJS_STATIC_METHOD_ENTRY(browseForFileToSubmit,      0)\n\tJS_STATIC_METHOD_ENTRY(buttonGetCaption,           1)\n\tJS_STATIC_METHOD_ENTRY(buttonGetIcon,              1)\n\tJS_STATIC_METHOD_ENTRY(buttonImportIcon,           0)\n\tJS_STATIC_METHOD_ENTRY(buttonSetCaption,           2)\n\tJS_STATIC_METHOD_ENTRY(buttonSetIcon,              2)\n\tJS_STATIC_METHOD_ENTRY(checkThisBox,               2)\n\tJS_STATIC_METHOD_ENTRY(clearItems,                 0)\n\tJS_STATIC_METHOD_ENTRY(defaultIsChecked,           2)\n\tJS_STATIC_METHOD_ENTRY(deleteItemAt,               1)\n\tJS_STATIC_METHOD_ENTRY(getArray ,                  0)\n\tJS_STATIC_METHOD_ENTRY(getItemAt,                  0)\n\tJS_STATIC_METHOD_ENTRY(getLock,                    0)\n\tJS_STATIC_METHOD_ENTRY(insertItemAt,               0)\n\tJS_STATIC_METHOD_ENTRY(isBoxChecked,               1)\n\tJS_STATIC_METHOD_ENTRY(isDefaultChecked,           1)\n\tJS_STATIC_METHOD_ENTRY(setAction,                  2)\n\tJS_STATIC_METHOD_ENTRY(setFocus,                   0)\n\tJS_STATIC_METHOD_ENTRY(setItems,                   1)\n\tJS_STATIC_METHOD_ENTRY(setLock,                    0)\n\tJS_STATIC_METHOD_ENTRY(signatureGetModifications,  0)\n\tJS_STATIC_METHOD_ENTRY(signatureGetSeedValue,      0)\n\tJS_STATIC_METHOD_ENTRY(signatureInfo,              0)\n\tJS_STATIC_METHOD_ENTRY(signatureSetSeedValue,      0)\n\tJS_STATIC_METHOD_ENTRY(signatureSign,              0)\n\tJS_STATIC_METHOD_ENTRY(signatureValidate,          0)\nEND_JS_STATIC_METHOD()\n\nIMPLEMENT_JS_CLASS(CJS_Field, Field)\n\nFX_BOOL\tCJS_Field::InitInstance(IFXJS_Context* cc)\n{\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\n\tField* pField = (Field*)GetEmbedObject();\n\tASSERT(pField != NULL);\n\n\tpField->SetIsolate(pContext->GetJSRuntime()->GetIsolate());\n\n\treturn TRUE;\n};\n\nField::Field(CJS_Object* pJSObject): CJS_EmbedObj(pJSObject),\n\tm_pJSDoc(NULL),\n\tm_pDocument(NULL),\n\tm_nFormControlIndex(-1),\n\tm_bCanSet(FALSE),\n\tm_bDelay(FALSE),\n\tm_isolate(NULL)\n{\n}\n\nField::~Field()\n{\n}\n\n//note: iControlNo = -1, means not a widget.\nvoid Field::ParseFieldName(const std::wstring &strFieldNameParsed,std::wstring &strFieldName,int & iControlNo)\n{\n\tint iStart = strFieldNameParsed.find_last_of(L'.');\n\tif (iStart == -1)\n\t{\n\t\tstrFieldName = strFieldNameParsed;\n\t\tiControlNo = -1;\n\t\treturn;\n\t}\n\tstd::wstring suffixal = strFieldNameParsed.substr(iStart+1);\n\tiControlNo = FXSYS_wtoi((FX_LPCWSTR)suffixal.c_str());\n\tif (iControlNo == 0)\n\t{\n\t\tint iStart;\n\t\twhile((iStart = suffixal.find_last_of(L\" \")) != -1)\n\t\t{\n\t\t\tsuffixal.erase(iStart,1);\n\t\t}\n\n\t\tif (suffixal.compare(L\"0\") != 0)\n\t\t{\n\t\t\tstrFieldName = strFieldNameParsed;\n\t\t\tiControlNo = -1;\n\t\t\treturn;\n\t\t}\n\n\t}\n\tstrFieldName = strFieldNameParsed.substr(0,iStart);    \n}\n\nFX_BOOL Field::AttachField(Document* pDocument, const CFX_WideString& csFieldName)\n{\n\tASSERT(pDocument != NULL);\n\tm_pJSDoc = pDocument;\n\n\tm_pDocument = pDocument->GetReaderDoc();\n\tASSERT(m_pDocument != NULL);\n\n\tm_bCanSet = m_pDocument->GetPermissions(FPDFPERM_FILL_FORM) || \n\t\tm_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) || \n\t\tm_pDocument->GetPermissions(FPDFPERM_MODIFY);\n\n\tCPDFSDK_InterForm* pRDInterForm = m_pDocument->GetInterForm();\n\tASSERT(pRDInterForm != NULL);\n\n\tCPDF_InterForm* pInterForm = pRDInterForm->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\n\tCFX_WideString swFieldNameTemp = csFieldName;\n\tswFieldNameTemp.Replace((FX_LPCWSTR)L\"..\", (FX_LPCWSTR)L\".\");\n\n\tif (pInterForm->CountFields(swFieldNameTemp) <= 0)\n\t{\n\t\tstd::wstring strFieldName;\n\t\tint iControlNo = -1;\n\t\tParseFieldName((wchar_t*)(FX_LPCWSTR)swFieldNameTemp, strFieldName, iControlNo);\n\t\tif (iControlNo == -1) return FALSE;\n\t\t\n\t\tm_FieldName = strFieldName.c_str();\n\t\tm_nFormControlIndex = iControlNo;\n\t\treturn TRUE;\n\t}\n\n\tm_FieldName = swFieldNameTemp;\n\tm_nFormControlIndex = -1;\n\n\treturn TRUE;\n}\n\nvoid Field::GetFormFields(CPDFSDK_Document* pDocument, const CFX_WideString& csFieldName, CFX_PtrArray& FieldArray)\n{\n\tASSERT(pDocument != NULL);\n\n\tCPDFSDK_InterForm* pReaderInterForm = pDocument->GetInterForm();\n\tASSERT(pReaderInterForm != NULL);\n\n\tCPDF_InterForm* pInterForm = pReaderInterForm->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\n\tASSERT(FieldArray.GetSize() == 0);\n\n\tfor (int i=0,sz=pInterForm->CountFields(csFieldName); i<sz; i++)\n\t{\n\t\tif (CPDF_FormField* pFormField = pInterForm->GetField(i, csFieldName))\n\t\t\tFieldArray.Add((void*)pFormField);\n\t}\n}\n\nvoid Field::GetFormFields(const CFX_WideString& csFieldName, CFX_PtrArray& FieldArray)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tField::GetFormFields(m_pDocument, csFieldName, FieldArray);\n}\n\nvoid Field::UpdateFormField(CPDFSDK_Document* pDocument, CPDF_FormField* pFormField, \n\t\t\t\t\t\t\tFX_BOOL bChangeMark, FX_BOOL bResetAP, FX_BOOL bRefresh)\n{\n\tASSERT(pDocument != NULL);\n\tASSERT(pFormField != NULL);\n\n\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\n\tCFX_PtrArray widgets;\n\tpInterForm->GetWidgets(pFormField, widgets);\n\n\tif (bResetAP)\n\t{\n\t\tint nFieldType = pFormField->GetFieldType();\n\t\tif (nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_TEXTFIELD)\n\t\t{\n\t\t\tfor (int i=0,sz=widgets.GetSize(); i<sz; i++)\n\t\t\t{\n\t\t\t\tCPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgets.GetAt(i);\n\t\t\t\tASSERT(pWidget != NULL);\n\n\t\t\t\tFX_BOOL bFormated = FALSE;\n\t\t\t\tCFX_WideString sValue = pWidget->OnFormat(0, bFormated);\n\t\t\t\tif (bFormated)\n\t\t\t\t\tpWidget->ResetAppearance(sValue, FALSE);\n\t\t\t\telse\n\t\t\t\t\tpWidget->ResetAppearance(NULL, FALSE);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (int i=0,sz=widgets.GetSize(); i<sz; i++)\n\t\t\t{\n\t\t\t\tCPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgets.GetAt(i);\n\t\t\t\tASSERT(pWidget != NULL);\n\n\t\t\t\tpWidget->ResetAppearance(NULL, FALSE);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (bRefresh)\n\t{\n\t\tfor (int i=0,sz=widgets.GetSize(); i<sz; i++)\n\t\t{\n\t\t\tCPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgets.GetAt(i);\n\t\t\tASSERT(pWidget != NULL);\n\t\t\t\n\t\t\tCPDFSDK_InterForm * pInterForm = pWidget->GetInterForm();\n\t\t\tCPDFSDK_Document* pDoc = pInterForm->GetDocument();\n// \t\t\tCReader_Page* pPage = pWidget->GetPage();\n \t\t\tASSERT(pDoc != NULL);\n\t\t\tpDoc->UpdateAllViews(NULL, pWidget);\n\t\t}\n\t}\t\t\n\t\n\tif (bChangeMark)\n\t\tpDocument->SetChangeMark();\n}\n\nvoid Field::UpdateFormControl(CPDFSDK_Document* pDocument, CPDF_FormControl* pFormControl, \n\t\t\t\t\t\t\tFX_BOOL bChangeMark, FX_BOOL bResetAP, FX_BOOL bRefresh)\n{\n\tASSERT(pDocument != NULL);\n\tASSERT(pFormControl != NULL);\n\n\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\n\tCPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl);\n\t\n\tif (pWidget)\n\t{\n\t\tif (bResetAP)\n\t\t{\n\t\t\tint nFieldType = pWidget->GetFieldType();\n\t\t\tif (nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_TEXTFIELD)\n\t\t\t{\n\t\t\t\tFX_BOOL bFormated = FALSE;\n\t\t\t\tCFX_WideString sValue = pWidget->OnFormat(0, bFormated);\n\t\t\t\tif (bFormated)\n\t\t\t\t\tpWidget->ResetAppearance(sValue, FALSE);\n\t\t\t\telse\n\t\t\t\t\tpWidget->ResetAppearance(NULL, FALSE);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpWidget->ResetAppearance(NULL, FALSE);\n\t\t\t}\n\t\t}\n\n\t\tif (bRefresh)\n\t\t{\n\t\t\tCPDFSDK_InterForm * pInterForm = pWidget->GetInterForm();\n\t\t\tCPDFSDK_Document* pDoc = pInterForm->GetDocument();\n\t\t\tASSERT(pDoc != NULL);\n\t\t\tpDoc->UpdateAllViews(NULL, pWidget);\n\t\t}\n\n\t}\n\n\tif (bChangeMark)\n\t\tpDocument->SetChangeMark();\n}\n\nCPDFSDK_Widget* Field::GetWidget(CPDFSDK_Document* pDocument, CPDF_FormControl* pFormControl)\n{\n\tASSERT(pDocument != NULL);\n\tASSERT(pFormControl != NULL);\n\n\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\n\treturn pInterForm->GetWidget(pFormControl);\n}\n\nFX_BOOL Field::ValueIsOccur(CPDF_FormField* pFormField, CFX_WideString csOptLabel)\n{\n\tASSERT(pFormField != NULL);\n\n\tfor (int i=0,sz = pFormField->CountOptions(); i < sz; i++)\n\t{\n\t\tif (csOptLabel.Compare(pFormField->GetOptionLabel(i)) == 0)\n\t\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\nCPDF_FormControl* Field::GetSmartFieldControl(CPDF_FormField* pFormField)\n{\n\tASSERT(pFormField != NULL);\n\tif(!pFormField->CountControls() || m_nFormControlIndex>=pFormField->CountControls()) return NULL;\n\n\tif (m_nFormControlIndex<0)\n\t\treturn pFormField->GetControl(0);\n\telse\n\t\treturn pFormField->GetControl(m_nFormControlIndex);\n}\n\n/* ---------------------------------------- property ---------------------------------------- */\n\nFX_BOOL Field::alignment(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tCFX_ByteString alignStr;\n\t\tvp >> alignStr;\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_String(FP_ALIGNMENT, alignStr);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetAlignment(m_pDocument, m_FieldName, m_nFormControlIndex, alignStr);\n\t\t}\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName, FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)\n\t\t\treturn FALSE;\n\n\t\tCPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);\n\t\tif (!pFormControl)return FALSE;\n\n\t\tswitch (pFormControl->GetControlAlignment())\n\t\t{\n\t\t\tcase 1:\n\t\t\t\tvp << (FX_LPCWSTR)L\"center\";\n\t\t\t\tbreak;\n\t\t\tcase 0:\n\t\t\t\tvp << (FX_LPCWSTR)L\"left\";\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tvp << (FX_LPCWSTR)L\"right\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tvp << (FX_LPCWSTR)L\"\";\n\t\t}\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetAlignment(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, \n\t\t\t\t\t\t const CFX_ByteString& string)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::borderStyle(OBJ_PROP_PARAMS)\n{\t\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tCFX_ByteString strType = \"\";\n\t\tvp >> strType;\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_String(FP_BORDERSTYLE, strType);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetBorderStyle(m_pDocument, m_FieldName, m_nFormControlIndex, strType);\n\t\t}\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName, FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tif (!pFormField) return FALSE;\n\n\t\tCPDFSDK_Widget* pWidget = GetWidget(m_pDocument, GetSmartFieldControl(pFormField));\n\t\tif (!pWidget) return FALSE;\n\n\t\tint nBorderstyle = pWidget->GetBorderStyle();\n\n\t\tswitch (nBorderstyle)\n\t\t{\n\t\t\tcase BBS_SOLID:\n\t\t\t\tvp << (FX_LPCWSTR)L\"solid\";\n\t\t\t\tbreak;\n\t\t\tcase BBS_DASH:\n\t\t\t\tvp << (FX_LPCWSTR)L\"dashed\";\n\t\t\t\tbreak;\n\t\t\tcase BBS_BEVELED:\n\t\t\t\tvp << (FX_LPCWSTR)L\"beveled\";\n\t\t\t\tbreak;\n\t\t\tcase BBS_INSET:\n\t\t\t\tvp << (FX_LPCWSTR)L\"inset\";\n\t\t\t\tbreak;\n\t\t\tcase BBS_UNDERLINE:\n\t\t\t\tvp << (FX_LPCWSTR)L\"underline\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tvp << (FX_LPCWSTR)L\"\";\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetBorderStyle(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, \n\t\t\t\t\t\t   const CFX_ByteString& string)\n{\n\tASSERT(pDocument != NULL);\n\n\tint nBorderStyle = 0;\n\n\tif (string == \"solid\")\n\t\tnBorderStyle = BBS_SOLID;\n\telse if (string == \"beveled\")\n\t\tnBorderStyle = BBS_BEVELED;\n\telse if (string == \"dashed\")\n\t\tnBorderStyle = BBS_DASH;\n\telse if (string == \"inset\")\n\t\tnBorderStyle = BBS_INSET;\n\telse if (string == \"underline\")\n\t\tnBorderStyle = BBS_UNDERLINE;\n\telse return;\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(pDocument, swFieldName, FieldArray);\n\n\tfor (int i=0,isz=FieldArray.GetSize(); i<isz; i++)\n\t{\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (nControlIndex < 0)\n\t\t{\n\t\t\tFX_BOOL bSet = FALSE;\n\t\t\tfor (int j=0,jsz = pFormField->CountControls(); j<jsz; j++)\n\t\t\t{\n\t\t\t\tif (CPDFSDK_Widget* pWidget = GetWidget(pDocument, pFormField->GetControl(j)))\n\t\t\t\t{\n\t\t\t\t\tif (pWidget->GetBorderStyle() != nBorderStyle)\n\t\t\t\t\t{\n\t\t\t\t\t\tpWidget->SetBorderStyle(nBorderStyle);\n\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (bSet) UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(nControlIndex >= pFormField->CountControls()) return;\n\t\t\tif (CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex))\n\t\t\t{\n\t\t\t\tif (CPDFSDK_Widget* pWidget = GetWidget(pDocument, pFormControl))\n\t\t\t\t{\n\t\t\t\t\tif (pWidget->GetBorderStyle() != nBorderStyle)\n\t\t\t\t\t{\n\t\t\t\t\t\tpWidget->SetBorderStyle(nBorderStyle);\n\t\t\t\t\t\tUpdateFormControl(pDocument, pFormControl, TRUE, TRUE, TRUE);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nFX_BOOL Field::buttonAlignX(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tint nVP;\n\t\tvp >> nVP;\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_Int(FP_BUTTONALIGNX, nVP);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetButtonAlignX(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);\n\t\t}\n\t}\n\telse\n\t{\t\t\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)\n\t\t\treturn FALSE;\n\n\t\tCPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);\n\t\tif (!pFormControl)return FALSE;\n\n\t\tCPDF_IconFit IconFit = pFormControl->GetIconFit();\n\n\t\tFX_FLOAT fLeft,fBottom;\n\t\tIconFit.GetIconPosition(fLeft,fBottom);\n\n\t\tvp << (FX_INT32)fLeft;\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetButtonAlignX(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::buttonAlignY(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tint nVP;\n\t\tvp >> nVP;\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_Int(FP_BUTTONALIGNY, nVP);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetButtonAlignY(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);\n\t\t}\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)\n\t\t\treturn FALSE;\n\n\t\tCPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);\n\t\tif (!pFormControl)return FALSE;\n\n\t\tCPDF_IconFit IconFit = pFormControl->GetIconFit();\n\n\t\tFX_FLOAT fLeft,fBottom;\n\t\tIconFit.GetIconPosition(fLeft,fBottom);\n\n\t\tvp <<  (FX_INT32)fBottom;\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetButtonAlignY(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::buttonFitBounds(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tbool bVP;\n\t\tvp >> bVP;\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_Bool(FP_BUTTONFITBOUNDS, bVP);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetButtonFitBounds(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);\n\t\t}\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)\n\t\t\treturn FALSE;\n\n\t\tCPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);\n\t\tif (!pFormControl)return FALSE;\n\n\t\tCPDF_IconFit IconFit = pFormControl->GetIconFit();\n\t\tvp << IconFit.GetFittingBounds();\t\t\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetButtonFitBounds(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::buttonPosition(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tint nVP;\n\t\tvp >> nVP;\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_Int(FP_BUTTONPOSITION, nVP);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetButtonPosition(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);\n\t\t}\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)\n\t\t\treturn FALSE;\n\n\t\tCPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);\n\t\tif (!pFormControl)return FALSE;\n\n\t\tvp <<  pFormControl->GetTextPosition();\n\t}\n\treturn TRUE;\n}\n\nvoid Field::SetButtonPosition(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::buttonScaleHow(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tint nVP;\n\t\tvp >> nVP;\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_Int(FP_BUTTONSCALEHOW, nVP);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetButtonScaleHow(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);\n\t\t}\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName, FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)\n\t\t\treturn FALSE;\n\n\t\tCPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);\n\t\tif (!pFormControl)return FALSE;\n\n\t\tCPDF_IconFit IconFit = pFormControl->GetIconFit();\n\t\tif (IconFit.IsProportionalScale())\n\t\t\tvp << (FX_INT32)0;\n\t\telse\n\t\t\tvp << (FX_INT32)1;\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetButtonScaleHow(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::buttonScaleWhen(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tint nVP;\n\t\tvp >> nVP;\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_Int(FP_BUTTONSCALEWHEN, nVP);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetButtonScaleWhen(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);\n\t\t}\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*) FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)\n\t\t\treturn FALSE;\n\n\t\tCPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);\n\t\tif (!pFormControl) return FALSE;\n\n\t\tCPDF_IconFit IconFit = pFormControl->GetIconFit();\n\t\tint ScaleM = IconFit.GetScaleMethod();\n\t\tswitch (ScaleM)\n\t\t{\n\t\t\tcase CPDF_IconFit::Always :\n\t\t\t\tvp <<  (FX_INT32) CPDF_IconFit::Always;\n\t\t\t\tbreak;\n\t\t\tcase CPDF_IconFit::Bigger :\n\t\t\t\tvp <<  (FX_INT32) CPDF_IconFit::Bigger;\n\t\t\t\tbreak;\n\t\t\tcase CPDF_IconFit::Never :\n\t\t\t\tvp <<  (FX_INT32) CPDF_IconFit::Never;\n\t\t\t\tbreak;\n\t\t\tcase CPDF_IconFit::Smaller :\n\t\t\t\tvp <<  (FX_INT32) CPDF_IconFit::Smaller;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetButtonScaleWhen(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::calcOrderIndex(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\t\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tint nVP;\n\t\tvp >> nVP;\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_Int(FP_CALCORDERINDEX, nVP);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetCalcOrderIndex(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);\n\t\t}\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName, FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX && pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)\n\t\t\treturn FALSE;\n\n\t\tCPDFSDK_InterForm* pRDInterForm = m_pDocument->GetInterForm();\n\t\tASSERT(pRDInterForm != NULL);\n\n\t\tCPDF_InterForm* pInterForm = pRDInterForm->GetInterForm();\n\t\tASSERT(pInterForm != NULL);\n\n\t\tvp << (FX_INT32)pInterForm->FindFieldInCalculationOrder(pFormField);\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetCalcOrderIndex(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::charLimit(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tint nVP;\n\t\tvp >> nVP;\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_Int(FP_CHARLIMIT, nVP);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetCharLimit(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);\n\t\t}\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName, FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)\n\t\t\treturn FALSE;\n\n\t\tvp << (FX_INT32)pFormField->GetMaxLen();\n\t}\n\treturn TRUE;\n}\n\nvoid Field::SetCharLimit(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::comb(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tbool bVP;\n\t\tvp >> bVP;\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_Bool(FP_COMB, bVP);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetComb(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);\n\t\t}\n\t}\n\telse\n\t{\t\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)\n\t\t\treturn FALSE;\n\n\t\tif (pFormField->GetFieldFlags() & FIELDFLAG_COMB)\n\t\t\tvp << true;\n\t\telse\n\t\t\tvp << false;\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetComb(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::commitOnSelChange(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tbool bVP;\n\t\tvp >> bVP;\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_Bool(FP_COMMITONSELCHANGE, bVP);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetCommitOnSelChange(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);\n\t\t}\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX && pFormField->GetFieldType() != FIELDTYPE_LISTBOX)\n\t\t\treturn FALSE;\n\n\t\tif (pFormField->GetFieldFlags() & FIELDFLAG_COMMITONSELCHANGE)\n\t\t\tvp << true;\n\t\telse\n\t\t\tvp << false;\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetCommitOnSelChange(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::currentValueIndices(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tCFX_DWordArray array;\n\n\t\tif (vp.GetType() == VT_number)\n\t\t{\n\t\t\tint iSelecting = 0;\n\t\t\tvp >> iSelecting;\n\t\t\tarray.Add(iSelecting);\n\t\t}\n\t\telse if (vp.IsArrayObject())\n\t\t{\n\t\t\tCJS_Array SelArray(m_isolate);\n\t\t\tCJS_Value SelValue(m_isolate);\n\t\t\tint iSelecting;\n\t\t\tvp >> SelArray;\n\t\t\tfor (int i=0,sz=SelArray.GetLength(); i<sz; i++)\n\t\t\t{\n\t\t\t\tSelArray.GetElement(i,SelValue);\n\t\t\t\tiSelecting = (FX_INT32)SelValue;\n\t\t\t\tarray.Add(iSelecting);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_WordArray(FP_CURRENTVALUEINDICES, array);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetCurrentValueIndices(m_pDocument, m_FieldName, m_nFormControlIndex, array);\n\t\t}\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX && pFormField->GetFieldType() != FIELDTYPE_LISTBOX)\n\t\t\treturn FALSE;\n\n\t\tif (pFormField->CountSelectedItems() == 1)\n\t\t\tvp << pFormField->GetSelectedIndex(0);\n\t\telse if (pFormField->CountSelectedItems() > 1)\n\t\t{\n\t\t\tCJS_Array SelArray(m_isolate);\n\t\t\tfor (int i=0,sz=pFormField->CountSelectedItems(); i<sz; i++)\n\t\t\t{\n\t\t\t\tSelArray.SetElement(i, CJS_Value(m_isolate,pFormField->GetSelectedIndex(i)));\n\t\t\t}\n\t\t\tvp << SelArray;\n\t\t}\n\t\telse\n\t\t\tvp << -1;\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetCurrentValueIndices(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, \n\t\t\t\t\t\t\t\t   const CFX_DWordArray& array)\n{\n\tASSERT(pDocument != NULL);\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(pDocument, swFieldName, FieldArray);\n\n\tfor (int i=0,isz=FieldArray.GetSize(); i<isz; i++)\n\t{\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);\n\t\tASSERT(pFormField != NULL);\n\n\t\tint nFieldType = pFormField->GetFieldType();\n\t\tif (nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_LISTBOX)\n\t\t{\n\t\t\tFX_DWORD dwFieldFlags = pFormField->GetFieldFlags();\n\t\t\tpFormField->ClearSelection(TRUE);\n\n\t\t\tfor (int i=0,sz=array.GetSize(); i<sz; i++)\n\t\t\t{\n\t\t\t\tif (i>0 && !(dwFieldFlags & (1<<21)))\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tint iSelecting = (FX_INT32)array.GetAt(i);\n\t\t\t\tif (iSelecting < pFormField->CountOptions() && !pFormField->IsItemSelected(iSelecting))\n\t\t\t\t\tpFormField->SetItemSelection(iSelecting, TRUE);\n\n\t\t\t}\n\t\t\tUpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE);\n\t\t}\n\t}\n}\n\nFX_BOOL Field::defaultStyle(OBJ_PROP_PARAMS)\n{\n\t// MQG sError = JSGetStringFromID(IDS_STRING_NOTSUPPORT);\n\treturn FALSE;\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\t;\t\t\n\t}\n\telse\n\t{\n\t\t;\n\t}\n\treturn TRUE;\n}\n\nvoid Field::SetDefaultStyle(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::defaultValue(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tCFX_WideString WideStr;\n\t\tvp >> WideStr; \n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_WideString(FP_DEFAULTVALUE, WideStr);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetDefaultValue(m_pDocument, m_FieldName, m_nFormControlIndex, WideStr);\n\t\t}\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON || \n\t\t\tpFormField->GetFieldType() == FIELDTYPE_SIGNATURE)\n\t\t\treturn FALSE;\n\n\t\tvp << pFormField->GetDefaultValue();\n\t}\n\treturn TRUE;\n}\n\nvoid Field::SetDefaultValue(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex,\n\t\t\t\t\t\t\tconst CFX_WideString& string)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::doNotScroll(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tbool bVP;\n\t\tvp >> bVP;\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_Bool(FP_DONOTSCROLL, bVP);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetDoNotScroll(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);\n\t\t}\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)\n\t\t\treturn FALSE;\n\n\t\tif (pFormField->GetFieldFlags() & FIELDFLAG_DONOTSCROLL)\n\t\t\tvp << true;\n\t\telse\n\t\t\tvp << false;\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetDoNotScroll(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::doNotSpellCheck(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tbool bVP;\n\t\tvp >> bVP;\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD && \n\t\t\tpFormField->GetFieldType() != FIELDTYPE_COMBOBOX)\n\t\t\treturn FALSE;\n\n\t\tif (pFormField->GetFieldFlags() & FIELDFLAG_DONOTSPELLCHECK)\n\t\t\tvp << true;\n\t\telse\n\t\t\tvp << false;\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetDelay(FX_BOOL bDelay)\n{\n\tm_bDelay = bDelay;\n\n\tif (!m_bDelay)\n\t{\n\t\tif (m_pJSDoc)\n\t\t\tm_pJSDoc->DoFieldDelay(m_FieldName, m_nFormControlIndex);\n\t}\n}\n\nFX_BOOL Field::delay(OBJ_PROP_PARAMS)\n{\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\t\t\n\t\tbool bVP;\n\t\tvp >> bVP;\n\n\t\tSetDelay(bVP);\n\t}\n\telse\n\t{\n\t\tvp << m_bDelay;\n\t}\n\treturn TRUE;\n}\n\nFX_BOOL Field::display(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tint nVP;\n\t\tvp >> nVP;\t\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_Int(FP_DISPLAY, nVP);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetDisplay(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);\n\t\t}\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();\n\t\tASSERT(pInterForm != NULL);\n\n\t\tCPDFSDK_Widget* pWidget = pInterForm->GetWidget(GetSmartFieldControl(pFormField));\n\t\tif (!pWidget)return FALSE;\n\n\t\tFX_DWORD dwFlag = pWidget->GetFlags();\n\n\t\tif (ANNOTFLAG_INVISIBLE & dwFlag || ANNOTFLAG_HIDDEN & dwFlag) \n\t\t{\n\t\t\tvp << (FX_INT32)1;\n\t\t}\n\t\telse \n\t\t{\n\t\t\tif (ANNOTFLAG_PRINT & dwFlag)\n\t\t\t{\n\t\t\t\tif (ANNOTFLAG_NOVIEW & dwFlag)\n\t\t\t\t{\n\t\t\t\t\tvp << (FX_INT32)3;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tvp << (FX_INT32)0;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvp << (FX_INT32)2;\n\t\t\t}\t\t\t\t\n\t\t}\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetDisplay(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)\n{\n\tASSERT(pDocument != NULL);\n\n\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(pDocument, swFieldName, FieldArray);\n\n\tfor (int i=0,isz=FieldArray.GetSize(); i<isz; i++)\n\t{\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (nControlIndex < 0)\n\t\t{\n\t\t\tFX_BOOL bSet = FALSE;\n\t\t\tfor (int j=0,jsz = pFormField->CountControls(); j<jsz; j++)\n\t\t\t{\n\t\t\t\tCPDF_FormControl* pFormControl = pFormField->GetControl(j);\n\t\t\t\tASSERT(pFormControl != NULL);\n\n\t\t\t\tif (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))\n\t\t\t\t{\n\t\t\t\t\tFX_DWORD dwFlag = pWidget->GetFlags();\n\t\t\t\t\tswitch (number)\n\t\t\t\t\t{\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\tdwFlag &= (~ANNOTFLAG_INVISIBLE);\n\t\t\t\t\t\tdwFlag &= (~ANNOTFLAG_HIDDEN);\n\t\t\t\t\t\tdwFlag &= (~ANNOTFLAG_NOVIEW);\n\t\t\t\t\t\tdwFlag |= ANNOTFLAG_PRINT;\t\t\t\t\t\t\t\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tdwFlag &= (~ANNOTFLAG_INVISIBLE);\n\t\t\t\t\t\tdwFlag &= (~ANNOTFLAG_NOVIEW);\n\t\t\t\t\t\tdwFlag |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\tdwFlag &= (~ANNOTFLAG_INVISIBLE);\n\t\t\t\t\t\tdwFlag &= (~ANNOTFLAG_PRINT);\n\t\t\t\t\t\tdwFlag &= (~ANNOTFLAG_HIDDEN);\n\t\t\t\t\t\tdwFlag &= (~ANNOTFLAG_NOVIEW);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 3:\n\t\t\t\t\t\tdwFlag |= ANNOTFLAG_NOVIEW;\n\t\t\t\t\t\tdwFlag |= ANNOTFLAG_PRINT;\n\t\t\t\t\t\tdwFlag &= (~ANNOTFLAG_HIDDEN);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\t\n\n\t\t\t\t\tif (dwFlag != pWidget->GetFlags())\n\t\t\t\t\t{\n\t\t\t\t\t\tpWidget->SetFlags(dwFlag);\n\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\t\t\n\t\t\t\n\t\t\tif (bSet) UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(nControlIndex >= pFormField->CountControls()) return;\n\t\t\tif (CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex))\n\t\t\t{\n\t\t\t\tif (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))\n\t\t\t\t{\n\n\t\t\t\t\tFX_DWORD dwFlag = pWidget->GetFlags();\n\t\t\t\t\tswitch (number)\n\t\t\t\t\t{\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\tdwFlag &= (~ANNOTFLAG_INVISIBLE);\n\t\t\t\t\t\tdwFlag &= (~ANNOTFLAG_HIDDEN);\n\t\t\t\t\t\tdwFlag &= (~ANNOTFLAG_NOVIEW);\n\t\t\t\t\t\tdwFlag |= ANNOTFLAG_PRINT;\t\t\t\t\t\t\t\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tdwFlag &= (~ANNOTFLAG_INVISIBLE);\n\t\t\t\t\t\tdwFlag &= (~ANNOTFLAG_NOVIEW);\n\t\t\t\t\t\tdwFlag |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\tdwFlag &= (~ANNOTFLAG_INVISIBLE);\n\t\t\t\t\t\tdwFlag &= (~ANNOTFLAG_PRINT);\n\t\t\t\t\t\tdwFlag &= (~ANNOTFLAG_HIDDEN);\n\t\t\t\t\t\tdwFlag &= (~ANNOTFLAG_NOVIEW);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 3:\n\t\t\t\t\t\tdwFlag |= ANNOTFLAG_NOVIEW;\n\t\t\t\t\t\tdwFlag |= ANNOTFLAG_PRINT;\n\t\t\t\t\t\tdwFlag &= (~ANNOTFLAG_HIDDEN);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\t\n\t\t\t\t\tif (dwFlag != pWidget->GetFlags())\n\t\t\t\t\t{\n\t\t\t\t\t\tpWidget->SetFlags(dwFlag);\n\t\t\t\t\t\tUpdateFormControl(pDocument, pFormControl, TRUE, FALSE, TRUE);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nFX_BOOL Field::doc(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pJSDoc != NULL);\n\n\tif (!vp.IsGetting())return FALSE;\n\n\tvp << (CJS_Object*)(*m_pJSDoc);\n\n\treturn TRUE;\n}\n\nFX_BOOL Field::editable(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tbool bVP;\n\t\tvp >> bVP;\n\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName, FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX)\n\t\t\treturn FALSE;\n\n\t\tif (pFormField->GetFieldFlags() & FIELDFLAG_EDIT)\n\t\t\tvp << true;\n\t\telse\n\t\t\tvp << false;\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL Field::exportValues(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(m_FieldName,FieldArray);\n\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\tASSERT(pFormField != NULL);\n\n\tif (pFormField->GetFieldType() != FIELDTYPE_CHECKBOX && \n\t\tpFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON)\n\t\treturn FALSE;\n\n\tif (vp.IsSetting())\n\t{\t\n\t\tif (!m_bCanSet) return FALSE;\n\t\tif (!vp.IsArrayObject())return FALSE;\n\t}\n\telse\n\t{\n\t\tCJS_Array ExportValusArray(m_isolate);\n\n\t\tif (m_nFormControlIndex < 0)\n\t\t{\n\t\t\tfor (int i=0,sz=pFormField->CountControls(); i<sz; i++)\n\t\t\t{\n\t\t\t\tCPDF_FormControl* pFormControl = pFormField->GetControl(i);\n\t\t\t\tASSERT(pFormControl != NULL);\n\n\t\t\t\tExportValusArray.SetElement(i, CJS_Value(m_isolate,(FX_LPCWSTR)pFormControl->GetExportValue()));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(m_nFormControlIndex >= pFormField->CountControls()) return FALSE;\n\t\t\tCPDF_FormControl* pFormControl = pFormField->GetControl(m_nFormControlIndex);\n\t\t\tif (!pFormControl) return FALSE;\n\n\t\t\tExportValusArray.SetElement(0, CJS_Value(m_isolate,(FX_LPCWSTR)pFormControl->GetExportValue()));\n\t\t}\n\n\t\tvp << ExportValusArray;\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL Field::fileSelect(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(m_FieldName, FieldArray);\n\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\tASSERT(pFormField != NULL);\n\n\tif (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)\n\t\treturn FALSE;\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tbool bVP;\n\t\tvp >> bVP;\n\n\t}\n\telse\n\t{\n\t\tif (pFormField->GetFieldFlags() & FIELDFLAG_FILESELECT)\n\t\t\tvp << true;\n\t\telse\n\t\t\tvp << false;\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL Field::fillColor(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tCJS_Array crArray(m_isolate);\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(m_FieldName,FieldArray);\n\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\t\tif (!vp.IsArrayObject()) return FALSE;\n\n\t\tvp >> crArray;\n\n\t\tCPWL_Color color;\n\t\tcolor::ConvertArrayToPWLColor(crArray, color);\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_Color(FP_FILLCOLOR, color);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetFillColor(m_pDocument, m_FieldName, m_nFormControlIndex, color);\n\t\t}\n\t}\n\telse\n\t{\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tCPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);\n\t\tif (!pFormControl)return FALSE;\n\n\t\tint iColorType;\n\t\tpFormControl->GetBackgroundColor(iColorType);\n\n\t\tCPWL_Color color;\n\n\t\tif (iColorType == COLORTYPE_TRANSPARENT)\n\t\t{\n\t\t\tcolor = CPWL_Color(COLORTYPE_TRANSPARENT);\n\t\t}\n\t\telse if (iColorType == COLORTYPE_GRAY)\n\t\t{\n\t\t\tcolor = CPWL_Color(COLORTYPE_GRAY, pFormControl->GetOriginalBackgroundColor(0));\n\t\t}\n\t\telse if (iColorType == COLORTYPE_RGB)\n\t\t{\n\t\t\tcolor = CPWL_Color(COLORTYPE_RGB, pFormControl->GetOriginalBackgroundColor(0),\n\t\t\t\tpFormControl->GetOriginalBackgroundColor(1),\n\t\t\t\tpFormControl->GetOriginalBackgroundColor(2));\n\t\t}\n\t\telse if (iColorType == COLORTYPE_CMYK)\n\t\t{\n\t\t\tcolor = CPWL_Color(COLORTYPE_CMYK, pFormControl->GetOriginalBackgroundColor(0),\n\t\t\t\tpFormControl->GetOriginalBackgroundColor(1),\n\t\t\t\tpFormControl->GetOriginalBackgroundColor(2),\n\t\t\t\tpFormControl->GetOriginalBackgroundColor(3));\n\t\t}\n\t\telse\n\t\t\treturn FALSE;\n\n\t\tcolor::ConvertPWLColorToArray(color, crArray);\n        vp  <<  crArray;\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetFillColor(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CPWL_Color& color)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::hidden(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tbool bVP;\n\t\tvp >> bVP;\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_Bool(FP_HIDDEN, bVP);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetHidden(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);\n\t\t}\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();\n\t\tASSERT(pInterForm != NULL);\n\n\t\tCPDFSDK_Widget* pWidget = pInterForm->GetWidget(GetSmartFieldControl(pFormField));\n\t\tif (!pWidget) return FALSE;\n\n\t\tFX_DWORD dwFlags = pWidget->GetFlags();\n\n\t\tif (ANNOTFLAG_INVISIBLE & dwFlags || ANNOTFLAG_HIDDEN & dwFlags) \n\t\t{\n\t\t\tvp << true;\n\t\t}\n\t\telse \n\t\t\tvp << false;\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetHidden(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)\n{\n\tASSERT(pDocument != NULL);\n\n\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(pDocument, swFieldName, FieldArray);\n\n\tfor (int i=0,isz=FieldArray.GetSize(); i<isz; i++)\n\t{\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (nControlIndex < 0)\n\t\t{\n\t\t\tFX_BOOL bSet = FALSE;\n\t\t\tfor (int j=0,jsz = pFormField->CountControls(); j<jsz; j++)\n\t\t\t{\n\t\t\t\tif (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormField->GetControl(j)))\n\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\tFX_DWORD dwFlags = pWidget->GetFlags();\n\t\t\t\t\t\n\t\t\t\t\tif (b)\n\t\t\t\t\t{\n\t\t\t\t\t\tdwFlags &= (~ANNOTFLAG_INVISIBLE);\n\t\t\t\t\t\tdwFlags &= (~ANNOTFLAG_NOVIEW);\n\t\t\t\t\t\tdwFlags |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tdwFlags &= (~ANNOTFLAG_INVISIBLE);\n\t\t\t\t\t\tdwFlags &= (~ANNOTFLAG_HIDDEN);\n\t\t\t\t\t\tdwFlags &= (~ANNOTFLAG_NOVIEW);\n\t\t\t\t\t\tdwFlags |= ANNOTFLAG_PRINT;\t\n\t\t\t\t\t}\n\n\t\t\t\t\tif (dwFlags != pWidget->GetFlags())\n\t\t\t\t\t{\n\t\t\t\t\t\tpWidget->SetFlags(dwFlags);\t\n\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (bSet)\n\t\t\t\tUpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(nControlIndex >= pFormField->CountControls()) return;\n\t\t\tif (CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex))\n\t\t\t{\n\t\t\t\tif (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))\n\t\t\t\t{\n\t\t\t\t\tFX_DWORD dwFlags = pWidget->GetFlags();\n\t\t\t\t\t\n\t\t\t\t\tif (b)\n\t\t\t\t\t{\n\t\t\t\t\t\tdwFlags &= (~ANNOTFLAG_INVISIBLE);\n\t\t\t\t\t\tdwFlags &= (~ANNOTFLAG_NOVIEW);\n\t\t\t\t\t\tdwFlags |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tdwFlags &= (~ANNOTFLAG_INVISIBLE);\n\t\t\t\t\t\tdwFlags &= (~ANNOTFLAG_HIDDEN);\n\t\t\t\t\t\tdwFlags &= (~ANNOTFLAG_NOVIEW);\n\t\t\t\t\t\tdwFlags |= ANNOTFLAG_PRINT;\t\n\t\t\t\t\t}\n\n\t\t\t\t\tif (dwFlags != pWidget->GetFlags())\n\t\t\t\t\t{\n\t\t\t\t\t\tpWidget->SetFlags(dwFlags);\t\n\t\t\t\t\t\tUpdateFormControl(pDocument, pFormControl, TRUE, FALSE, TRUE);\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nFX_BOOL Field::highlight(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tCFX_ByteString strMode;\n\t\tvp >> strMode;\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_String(FP_HIGHLIGHT, strMode);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetHighlight(m_pDocument, m_FieldName, m_nFormControlIndex, strMode);\n\t\t}\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)\n\t\t\treturn FALSE;\n\n\t\tCPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);\n\t\tif (!pFormControl) return FALSE;\n\n\t\tint eHM = pFormControl->GetHighlightingMode();\n\t\tswitch (eHM)\n\t\t{\n\t\tcase CPDF_FormControl::None:\n\t\t\tvp  <<  (FX_LPCWSTR)L\"none\";\n\t\t\tbreak;\n\t\tcase CPDF_FormControl::Push:\n\t\t\tvp  <<  (FX_LPCWSTR)L\"push\";\n\t\t\tbreak;\n\t\tcase CPDF_FormControl::Invert:\n\t\t\tvp  <<  (FX_LPCWSTR)L\"invert\";\n\t\t\tbreak;\n\t\tcase CPDF_FormControl::Outline:\n\t\t\tvp  <<  (FX_LPCWSTR)L\"outline\";\n\t\t\tbreak;\n\t\tcase CPDF_FormControl::Toggle:\n\t\t\t vp  <<  (FX_LPCWSTR)L\"toggle\";\n\t\t\t break;\n\t\t}\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetHighlight(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_ByteString& string)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::lineWidth(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tint iWidth;\n\t\tvp >> iWidth;\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_Int(FP_LINEWIDTH, iWidth);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetLineWidth(m_pDocument, m_FieldName, m_nFormControlIndex, iWidth);\n\t\t}\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tCPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);\n\t\tif (!pFormControl) return FALSE;\n\n\t\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();\n\t\tASSERT(pInterForm != NULL);\n\n\t\tif(!pFormField->CountControls()) return FALSE;\n\n\t\tCPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormField->GetControl(0));\n\t\tif (!pWidget) return FALSE;\n\n\t\tvp << (FX_INT32)pWidget->GetBorderWidth();\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetLineWidth(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)\n{\n\tASSERT(pDocument != NULL);\n\n\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(pDocument, swFieldName, FieldArray);\n\n\tfor (int i=0,isz=FieldArray.GetSize(); i<isz; i++)\n\t{\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (nControlIndex < 0)\n\t\t{\n\t\t\tFX_BOOL bSet = FALSE;\n\t\t\tfor (int j=0,jsz=pFormField->CountControls(); j<jsz; j++)\n\t\t\t{\n\t\t\t\tCPDF_FormControl* pFormControl = pFormField->GetControl(j);\n\t\t\t\tASSERT(pFormControl != NULL);\n\t\t\t\t\n\t\t\t\tif (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))\n\t\t\t\t{\n\t\t\t\t\tif (number != pWidget->GetBorderWidth())\n\t\t\t\t\t{\n\t\t\t\t\t\tpWidget->SetBorderWidth(number);\n\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (bSet) UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(nControlIndex >= pFormField->CountControls()) return;\n\t\t\tif (CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex))\n\t\t\t{\n\t\t\t\tif (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))\n\t\t\t\t{\n\t\t\t\t\tif (number != pWidget->GetBorderWidth())\n\t\t\t\t\t{\n\t\t\t\t\t\tpWidget->SetBorderWidth(number);\n\t\t\t\t\t\tUpdateFormControl(pDocument, pFormControl, TRUE, TRUE, TRUE);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nFX_BOOL Field::multiline(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tbool bVP;\n\t\tvp >> bVP;\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_Bool(FP_MULTILINE, bVP);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetMultiline(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);\n\t\t}\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName, FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)\n\t\t\treturn FALSE;\n\n\t\tif (pFormField->GetFieldFlags() & FIELDFLAG_MULTILINE)\n\t\t\tvp << true;\n\t\telse\n\t\t\tvp << false;\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetMultiline(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::multipleSelection(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tbool bVP;\n\t\tvp >> bVP;\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_Bool(FP_MULTIPLESELECTION, bVP);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetMultipleSelection(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);\n\t\t}\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (pFormField->GetFieldType() != FIELDTYPE_LISTBOX)\n\t\t\treturn FALSE;\n\n\t\tif (pFormField->GetFieldFlags() & FIELDFLAG_MULTISELECT)\n\t\t\tvp << true;\n\t\telse\n\t\t\tvp << false;\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetMultipleSelection(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::name(OBJ_PROP_PARAMS)\n{\n\tif (!vp.IsGetting()) return FALSE;\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(m_FieldName, FieldArray);\n\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n   \tvp << m_FieldName;\n\n\treturn TRUE;\n}\n\nFX_BOOL Field::numItems(OBJ_PROP_PARAMS)\n{\t\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(m_FieldName, FieldArray);\n\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\tASSERT(pFormField != NULL);\n\n\tif (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX &&\n\t\tpFormField->GetFieldType() != FIELDTYPE_LISTBOX)\n\t\treturn FALSE;\n\n\tif (!vp.IsGetting()) return FALSE;\n\n\tvp << (FX_INT32)pFormField->CountOptions();\n\n\treturn TRUE;\n}\n\nFX_BOOL Field::page(OBJ_PROP_PARAMS)\n{\n\tif (!vp.IsGetting()) return FALSE;\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(m_FieldName, FieldArray);\n\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\tif (!pFormField) return FALSE;\n\n\tASSERT(m_pDocument != NULL);\n\n\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\n\tCFX_PtrArray widgetArray;\n\tpInterForm->GetWidgets(pFormField, widgetArray);\n\n\tif (widgetArray.GetSize() > 0)\n\t{\n\t\tCJS_Array PageArray(m_isolate);\n\n\t\tfor (int i=0,sz=widgetArray.GetSize(); i<sz; i++)\n\t\t{\n\t\t\tCPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgetArray.GetAt(i);\n\t\t\tASSERT(pWidget != NULL);\n\n\t\t\tCPDFSDK_PageView* pPageView = pWidget->GetPageView();\n\t\t\tif(!pPageView)\n\t\t\t\treturn FALSE;\n\n\t\t\tPageArray.SetElement(i, CJS_Value(m_isolate,(FX_INT32)pPageView->GetPageIndex()));\n\t\t}\n\n\t\tvp << PageArray;\n\t}\n\telse\n\t{\n\t\tvp << (FX_INT32) -1;\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL Field::password(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tbool bVP;\n\t\tvp >> bVP;\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_Bool(FP_PASSWORD, bVP);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetPassword(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);\n\t\t}\t\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)\n\t\t\treturn FALSE;\n\n\t\tif (pFormField->GetFieldFlags() & FIELDFLAG_PASSWORD)\n\t\t\tvp << true;\n\t\telse\n\t\t\tvp << false;\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetPassword(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::print(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(m_FieldName, FieldArray);\n\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tbool bVP;\n\t\tvp >> bVP;\n\n\t\tfor (int i=0,isz=FieldArray.GetSize(); i<isz; i++)\n\t\t{\n\t\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);\n\t\t\tASSERT(pFormField != NULL);\n\n\t\t\tif (m_nFormControlIndex < 0)\n\t\t\t{\n\t\t\t\tFX_BOOL bSet = FALSE;\n\t\t\t\tfor (int j=0,jsz = pFormField->CountControls(); j<jsz; j++)\n\t\t\t\t{\n\t\t\t\t\tif (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormField->GetControl(j)))\n\t\t\t\t\t{\n\t\t\t\t\t\tFX_DWORD dwFlags = pWidget->GetFlags();\n\t\t\t\t\t\tif (bVP)\n\t\t\t\t\t\t\tdwFlags |= ANNOTFLAG_PRINT;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tdwFlags &= ~ANNOTFLAG_PRINT;\n\n\t\t\t\t\t\tif (dwFlags != pWidget->GetFlags())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpWidget->SetFlags(dwFlags);\n\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (bSet)\n\t\t\t\t\tUpdateFormField(m_pDocument, pFormField, TRUE, FALSE, TRUE);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(m_nFormControlIndex >= pFormField->CountControls()) return FALSE;\n\t\t\t\tif (CPDF_FormControl* pFormControl = pFormField->GetControl(m_nFormControlIndex))\n\t\t\t\t{\n\t\t\t\t\tif (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))\n\t\t\t\t\t{\n\t\t\t\t\t\tFX_DWORD dwFlags = pWidget->GetFlags();\n\t\t\t\t\t\tif (bVP)\n\t\t\t\t\t\t\tdwFlags |= ANNOTFLAG_PRINT;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tdwFlags &= ~ANNOTFLAG_PRINT;\n\n\t\t\t\t\t\tif (dwFlags != pWidget->GetFlags())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpWidget->SetFlags(dwFlags);\n\t\t\t\t\t\t\tUpdateFormControl(m_pDocument, pFormField->GetControl(m_nFormControlIndex), TRUE, FALSE, TRUE);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\t\t\n\t\tCPDFSDK_Widget* pWidget = pInterForm->GetWidget(GetSmartFieldControl(pFormField));\n\t\tif (!pWidget) return FALSE;\n\n\t\tif (pWidget->GetFlags() & ANNOTFLAG_PRINT)\n\t\t\tvp << true;\n\t\telse\n\t\t\tvp << false;\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL Field::radiosInUnison(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(m_FieldName,FieldArray);\n\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tbool bVP;\n\t\tvp >> bVP;\n\n\t}\n\telse\n\t{\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON)\n\t\t\treturn FALSE;\n\n\t\tif (pFormField->GetFieldFlags() & FIELDFLAG_RADIOSINUNISON)\n\t\t\tvp << true;\n\t\telse\n\t\t\tvp << false;\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL Field::readonly(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(m_FieldName,FieldArray);\n\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tbool bVP;\n\t\tvp >> bVP;\n\n\t}\n\telse\n\t{\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (pFormField->GetFieldFlags() & FIELDFLAG_READONLY)\n\t\t\tvp << true;\n\t\telse\n\t\t\tvp << false;\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL Field::rect(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\t\tif (!vp.IsArrayObject())return FALSE;\n\n\t\tCJS_Array rcArray(m_isolate);\n\t\tvp >> rcArray;\n\t\tCJS_Value Upper_Leftx(m_isolate), Upper_Lefty(m_isolate), Lower_Rightx(m_isolate), Lower_Righty(m_isolate);\n\t\trcArray.GetElement(0, Upper_Leftx);\n\t\trcArray.GetElement(1, Upper_Lefty);\n\t\trcArray.GetElement(2, Lower_Rightx);\n\t\trcArray.GetElement(3, Lower_Righty);\n\n\t\tFX_FLOAT pArray[4] = {0.0f,0.0f,0.0f,0.0f};\n\t\tpArray[0] = (FX_FLOAT)(FX_INT32)Upper_Leftx;\n\t\tpArray[1] = (FX_FLOAT)(FX_INT32)Lower_Righty;\n\t\tpArray[2] = (FX_FLOAT)(FX_INT32)Lower_Rightx;\n\t\tpArray[3] = (FX_FLOAT)(FX_INT32)Upper_Lefty;\n\n\t\tCPDF_Rect crRect(pArray);\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_Rect(FP_RECT, crRect);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetRect(m_pDocument, m_FieldName, m_nFormControlIndex, crRect);\n\t\t}\t\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();\n\t\tASSERT(pInterForm != NULL);\n\n\t\tCPDFSDK_Widget* pWidget = pInterForm->GetWidget(GetSmartFieldControl(pFormField));\n\t\tif (!pWidget) return FALSE;\n\n\t\tCFX_FloatRect crRect = pWidget->GetRect();\n\t\tCJS_Value Upper_Leftx(m_isolate),Upper_Lefty(m_isolate),Lower_Rightx(m_isolate),Lower_Righty(m_isolate);\n\t\tUpper_Leftx = (FX_INT32)crRect.left;\n\t\tUpper_Lefty = (FX_INT32)crRect.top;\n\t\tLower_Rightx = (FX_INT32)crRect.right;\n\t\tLower_Righty = (FX_INT32)crRect.bottom;\n\n\t\tCJS_Array rcArray(m_isolate);\n\t\trcArray.SetElement(0,Upper_Leftx);\n\t\trcArray.SetElement(1,Upper_Lefty);\n\t\trcArray.SetElement(2,Lower_Rightx);\n\t\trcArray.SetElement(3,Lower_Righty);\n\n\t\tvp  <<  rcArray;\t\t\t\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetRect(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CPDF_Rect& rect)\n{\n\tASSERT(pDocument != NULL);\n\n\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(pDocument, swFieldName, FieldArray);\n\n\tfor (int i=0,isz=FieldArray.GetSize(); i<isz; i++)\n\t{\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (nControlIndex < 0)\n\t\t{\n\t\t\tFX_BOOL bSet = FALSE;\n\t\t\tfor (int i=0, sz=pFormField->CountControls(); i<sz; i++)\n\t\t\t{\n\t\t\t\tCPDF_FormControl* pFormControl = pFormField->GetControl(i);\n\t\t\t\tASSERT(pFormControl != NULL);\n\n\t\t\t\tif (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))\n\t\t\t\t{\n\t\t\t\t\tCPDF_Rect crRect = rect;\n\n\t\t\t\t\tCPDF_Page* pPDFPage = pWidget->GetPDFPage();\n\t\t\t\t\tASSERT(pPDFPage != NULL);\n\n// \t\t\t\t\tCPDF_Page* pPDFPage = pPage->GetPage();\n// \t\t\t\t\tASSERT(pPDFPage != NULL);\n\n\t\t\t\t\tcrRect.Intersect(pPDFPage->GetPageBBox());\n\n\t\t\t\t\tif (!crRect.IsEmpty())\n\t\t\t\t\t{\n\t\t\t\t\t\tCPDF_Rect rcOld = pWidget->GetRect();\n\t\t\t\t\t\tif (crRect.left != rcOld.left ||\n\t\t\t\t\t\t\tcrRect.right != rcOld.right ||\n\t\t\t\t\t\t\tcrRect.top != rcOld.top ||\n\t\t\t\t\t\t\tcrRect.bottom != rcOld.bottom)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpWidget->SetRect(crRect);\n\t\t\t\t\t\t\tbSet = TRUE;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (bSet) UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(nControlIndex >= pFormField->CountControls()) return;\n\t\t\tif (CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex))\n\t\t\t{\n\t\t\t\tif (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))\n\t\t\t\t{\n\t\t\t\t\tCPDF_Rect crRect = rect;\n\t\t\t\t\t\n\t\t\t\t\tCPDF_Page* pPDFPage = pWidget->GetPDFPage();\n\t\t\t\t\tASSERT(pPDFPage != NULL);\n\n// \t\t\t\t\tCPDF_Page* pPDFPage = pPage->GetPage();\n// \t\t\t\t\tASSERT(pPDFPage != NULL);\n\n\t\t\t\t\tcrRect.Intersect(pPDFPage->GetPageBBox());\n\n\t\t\t\t\tif (!crRect.IsEmpty())\n\t\t\t\t\t{\n\t\t\t\t\t\tCPDF_Rect rcOld = pWidget->GetRect();\n\t\t\t\t\t\tif (crRect.left != rcOld.left ||\n\t\t\t\t\t\t\tcrRect.right != rcOld.right ||\n\t\t\t\t\t\t\tcrRect.top != rcOld.top ||\n\t\t\t\t\t\t\tcrRect.bottom != rcOld.bottom)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpWidget->SetRect(crRect);\n\t\t\t\t\t\t\tUpdateFormControl(pDocument, pFormControl, TRUE, TRUE, TRUE);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nFX_BOOL Field::required(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(m_FieldName,FieldArray);\n\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\n\t\tbool bVP;\n\t\tvp >> bVP;\n\n\t}\n\telse\n\t{\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON)\n\t\t\treturn FALSE;\n\n\t\tif (pFormField->GetFieldFlags() & FIELDFLAG_REQUIRED)\n\t\t\tvp << true;\n\t\telse\n\t\t\tvp << false;\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL Field::richText(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tbool bVP;\n\t\tvp >> bVP;\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_Bool(FP_RICHTEXT, bVP);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetRichText(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);\n\t\t}\t\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)\n\t\t\treturn FALSE;\n\n\t\tif (pFormField->GetFieldFlags() & FIELDFLAG_RICHTEXT)\n\t\t\tvp << true;\n\t\telse\n\t\t\tvp << false;\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetRichText(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::richValue(OBJ_PROP_PARAMS)\n{\n\treturn TRUE;\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\t\t;\n\t}\n\telse\n\t{\n\t\t;\n\t}\n\treturn TRUE;\n}\n\nvoid Field::SetRichValue(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::rotation(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tint nVP;\n\t\tvp >> nVP;\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_Int(FP_ROTATION, nVP);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetRotation(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);\n\t\t}\t\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tCPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);\n\t\tif (!pFormControl)return FALSE;\n\n\t\tvp << (FX_INT32)pFormControl->GetRotation();\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetRotation(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::strokeColor(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tif (!vp.IsArrayObject())return FALSE;\n\n\t\tCJS_Array crArray(m_isolate);\n\t\tvp >> crArray;\n\n\t\tCPWL_Color color;\n\t\tcolor::ConvertArrayToPWLColor(crArray, color);\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_Color(FP_STROKECOLOR, color);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetStrokeColor(m_pDocument, m_FieldName, m_nFormControlIndex, color);\n\t\t}\t\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tCPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);\n\t\tif (!pFormControl)return FALSE;\n\n\t\tint iColorType;\n\t\tpFormControl->GetBorderColor(iColorType);\n\n\t\tCPWL_Color color;\n\n\t\tif (iColorType == COLORTYPE_TRANSPARENT)\n\t\t{\n\t\t\tcolor = CPWL_Color(COLORTYPE_TRANSPARENT);\n\t\t}\n\t\telse if (iColorType == COLORTYPE_GRAY)\n\t\t{\n\t\t\tcolor = CPWL_Color(COLORTYPE_GRAY, pFormControl->GetOriginalBorderColor(0));\n\t\t}\n\t\telse if (iColorType == COLORTYPE_RGB)\n\t\t{\n\t\t\tcolor = CPWL_Color(COLORTYPE_RGB, pFormControl->GetOriginalBorderColor(0),\n\t\t\t\tpFormControl->GetOriginalBorderColor(1),\n\t\t\t\tpFormControl->GetOriginalBorderColor(2));\n\t\t}\n\t\telse if (iColorType == COLORTYPE_CMYK)\n\t\t{\n\t\t\tcolor = CPWL_Color(COLORTYPE_CMYK, pFormControl->GetOriginalBorderColor(0),\n\t\t\t\tpFormControl->GetOriginalBorderColor(1),\n\t\t\t\tpFormControl->GetOriginalBorderColor(2),\n\t\t\t\tpFormControl->GetOriginalBorderColor(3));\n\t\t}\n\t\telse\n\t\t\treturn FALSE;\n\n\t\tCJS_Array crArray(m_isolate);\n\t\tcolor::ConvertPWLColorToArray(color, crArray);\n        vp  <<  crArray;\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetStrokeColor(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CPWL_Color& color)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::style(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tCFX_ByteString csBCaption;\n\t\tvp >> csBCaption;\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_String(FP_STYLE, csBCaption);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetStyle(m_pDocument, m_FieldName, m_nFormControlIndex, csBCaption);\n\t\t}\t\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON && \n\t\t\tpFormField->GetFieldType() != FIELDTYPE_CHECKBOX)\n\t\t\treturn FALSE;\n\n\t\tCPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);\n\t\tif (!pFormControl) return FALSE;\n\n\t\tCFX_WideString csWCaption = pFormControl->GetNormalCaption();\n\t\tCFX_ByteString csBCaption;\n\n\t\tswitch (csWCaption[0])\n\t\t{\n\t\t\tcase L'l':\n\t\t\t\tcsBCaption = \"circle\";\n\t\t\t\tbreak;\n\t\t\tcase L'8':\n\t\t\t\tcsBCaption = \"cross\";\n\t\t\t\tbreak;\n\t\t\tcase L'u':\n\t\t\t\tcsBCaption = \"diamond\";\n\t\t\t\tbreak;\n\t\t\tcase L'n':\n\t\t\t\tcsBCaption = \"square\";\n\t\t\t\tbreak;\n\t\t\tcase L'H':\n\t\t\t\tcsBCaption = \"star\";\n\t\t\t\tbreak;\n\t\t\tdefault: //L'4'\n\t\t\t\tcsBCaption = \"check\";\n\t\t\t\tbreak;\n\t\t}\n\t\tvp << csBCaption;\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetStyle(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, \n\t\t\t\t\t const CFX_ByteString& string)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::submitName(OBJ_PROP_PARAMS)\n{\n\treturn TRUE;\n}\n\nFX_BOOL Field::textColor(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tCJS_Array crArray(m_isolate);\n\t\tif (!vp.IsArrayObject())return FALSE;\n\t\tvp >> crArray;\n\n\t\tCPWL_Color color;\n\t\tcolor::ConvertArrayToPWLColor(crArray, color);\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_Color(FP_TEXTCOLOR, color);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetTextColor(m_pDocument, m_FieldName, m_nFormControlIndex, color);\n\t\t}\t\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tCPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);\n\t\tif (!pFormControl)return FALSE;\n\t\t\n\t\tint iColorType;\n\t\tFX_ARGB color;\n\t\tCPDF_DefaultAppearance FieldAppearance = pFormControl->GetDefaultAppearance();\n\t\tFieldAppearance.GetColor(color, iColorType);\n\t\tFX_INT32 a,r,g,b;\n\t\tArgbDecode(color, a, r, g, b);\n\n\t\tCPWL_Color crRet = CPWL_Color(COLORTYPE_RGB, r / 255.0f,\n\t\t\t\tg / 255.0f,\n\t\t\t\tb / 255.0f);\n\n\t\tif (iColorType == COLORTYPE_TRANSPARENT)\n\t\t\tcrRet = CPWL_Color(COLORTYPE_TRANSPARENT);\n\n\t\tCJS_Array crArray(m_isolate);\n\t\tcolor::ConvertPWLColorToArray(crRet, crArray);\n        vp  <<  crArray;\t\t\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetTextColor(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CPWL_Color& color)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::textFont(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tCFX_ByteString csFontName;\n\t\tvp >> csFontName;\n\t\tif (csFontName.IsEmpty()) return FALSE;\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_String(FP_TEXTFONT, csFontName);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetTextFont(m_pDocument, m_FieldName, m_nFormControlIndex, csFontName);\n\t\t}\t\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tCPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);\n\t\tif (!pFormControl)return FALSE;\n\n\t\tint nFieldType = pFormField->GetFieldType();\n\n\t\tif (nFieldType == FIELDTYPE_PUSHBUTTON || \n\t\t\tnFieldType == FIELDTYPE_COMBOBOX || \n\t\t\tnFieldType == FIELDTYPE_LISTBOX ||\n\t\t\tnFieldType == FIELDTYPE_TEXTFIELD)\n\t\t{\n\t\t\tCPDF_Font * pFont = pFormControl->GetDefaultControlFont();\n\t\t\tif (!pFont) return FALSE;\n\n\t\t\tvp << pFont->GetBaseFont();\n\t\t}\n\t\telse\n\t\t\treturn FALSE;\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetTextFont(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_ByteString& string)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::textSize(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tint nVP;\n\t\tvp >> nVP;\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_Int(FP_TEXTSIZE, nVP);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetTextSize(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);\n\t\t}\t\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tCPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);\n\t\tif (!pFormControl)return FALSE;\n\n\t\tCPDF_DefaultAppearance FieldAppearance = pFormControl->GetDefaultAppearance();\n\n\t\tCFX_ByteString csFontNameTag;\n\t\tFX_FLOAT fFontSize;\n\t\tFieldAppearance.GetFont(csFontNameTag,fFontSize);\n\n\t\tvp << (int)fFontSize;\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetTextSize(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::type(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (!vp.IsGetting()) return FALSE;\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(m_FieldName,FieldArray);\n\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n \tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\tASSERT(pFormField != NULL);\n\n\tswitch (pFormField->GetFieldType())\n\t{\n\t\tcase FIELDTYPE_UNKNOWN:\n\t\t\tvp << (FX_LPCWSTR)L\"unknown\";\n\t\t\tbreak;\n\t\tcase FIELDTYPE_PUSHBUTTON:\n\t\t\tvp << (FX_LPCWSTR)L\"button\";\n\t\t\tbreak;\n\t\tcase FIELDTYPE_CHECKBOX:\n\t\t\tvp << (FX_LPCWSTR)L\"checkbox\";\n\t\t\tbreak;\n\t\tcase FIELDTYPE_RADIOBUTTON:\n\t\t\tvp << (FX_LPCWSTR)L\"radiobutton\";\n\t\t\tbreak;\n\t\tcase FIELDTYPE_COMBOBOX:\n\t\t\tvp << (FX_LPCWSTR)L\"combobox\";\n\t\t\tbreak;\n\t\tcase FIELDTYPE_LISTBOX:\n\t\t\tvp << (FX_LPCWSTR)L\"listbox\";\n\t\t\tbreak;\n\t\tcase FIELDTYPE_TEXTFIELD:\n\t\t\tvp << (FX_LPCWSTR)L\"text\";\n\t\t\tbreak;\n\t\tcase FIELDTYPE_SIGNATURE:\n\t\t\tvp << (FX_LPCWSTR)L\"signature\";\n\t\t\tbreak;\n\t\tdefault :\n\t\t\tvp << (FX_LPCWSTR)L\"unknown\";\n\t\t\tbreak;\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL Field::userName(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n  \tif (vp.IsSetting())\n\t{\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tCFX_WideString swName;\n\t\tvp >> swName;\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_WideString(FP_USERNAME, swName);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetUserName(m_pDocument, m_FieldName, m_nFormControlIndex, swName);\n\t\t}\t\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n \t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\t\tvp << (CFX_WideString)pFormField->GetAlternateName();\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetUserName(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_WideString& string)\n{\n\t//Not supported.\n}\n\nFX_BOOL Field::value(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (vp.IsSetting())\n\t{\t\t\n\t\tif (!m_bCanSet) return FALSE;\n\n\t\tCJS_WideStringArray strArray;\n\n\t\tif (vp.IsArrayObject())\n\t\t{\n\t\t\tCJS_Array ValueArray(m_isolate);\n\t\t\tvp.ConvertToArray(ValueArray);\n\t\t\tfor (int i = 0,sz = ValueArray.GetLength(); i < sz; i++)\n\t\t\t{\n\t\t\t\tCJS_Value ElementValue(m_isolate);\n\t\t\t\tValueArray.GetElement(i, ElementValue);\n\t\t\t\tstrArray.Add(ElementValue.operator CFX_WideString());\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tCFX_WideString swValue;\n\t\t\tvp >> swValue;\n\n\t\t\tstrArray.Add(swValue);\n\t\t}\n\n\t\tif (m_bDelay)\n\t\t{\n\t\t\tAddDelay_WideStringArray(FP_VALUE, strArray);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tField::SetValue(m_pDocument, m_FieldName, m_nFormControlIndex, strArray);\n\t\t}\n\t}\n\telse\n\t{\n\t\tCFX_PtrArray FieldArray;\n\t\tGetFormFields(m_FieldName,FieldArray);\n\t\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n \t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\t\tASSERT(pFormField != NULL);\n\n\n\n\t\tswitch (pFormField->GetFieldType())\n\t\t{\n\t\tcase FIELDTYPE_PUSHBUTTON:\n\t\t\treturn FALSE;\n\t\tcase FIELDTYPE_COMBOBOX:\n\t\tcase FIELDTYPE_TEXTFIELD:\n\t\t\t{\n\t\t\t\tCFX_WideString swValue = pFormField->GetValue();\n\n\t\t\t\tdouble dRet;\n\t\t\t\tFX_BOOL bDot;\n\t\t\t\tif (CJS_PublicMethods::ConvertStringToNumber(swValue,dRet,bDot))\n\t\t\t\t{\n\t\t\t\t\tif (bDot)\n\t\t\t\t\t\tvp << dRet;\n\t\t\t\t\telse\n\t\t\t\t\t\tvp << dRet;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tvp << swValue;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase FIELDTYPE_LISTBOX:\n\t\t\t{\n\t\t\t\tif (pFormField->CountSelectedItems() > 1)\n\t\t\t\t{\n\t\t\t\t\tCJS_Array ValueArray(m_isolate);\n\t\t\t\t\tCJS_Value ElementValue(m_isolate);\n\t\t\t\t\tint iIndex;\n\t\t\t\t\tfor (int i = 0, sz = pFormField->CountSelectedItems(); i < sz; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tiIndex = pFormField->GetSelectedIndex(i);\n\t\t\t\t\t\tElementValue = pFormField->GetOptionValue(iIndex);\n\t\t\t\t\t\tif (FXSYS_wcslen((FX_LPCWSTR)ElementValue.operator CFX_WideString()) == 0)\n\t\t\t\t\t\t\tElementValue = pFormField->GetOptionLabel(iIndex);\n\t\t\t\t\t\tValueArray.SetElement(i, ElementValue);\n\t\t\t\t\t}\n\t\t\t\t\tvp << ValueArray;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tCFX_WideString swValue = pFormField->GetValue();\n\t\t\t\t\n\t\t\t\t\tdouble dRet;\n\t\t\t\t\tFX_BOOL bDot;\n\t\t\t\t\tif (CJS_PublicMethods::ConvertStringToNumber(swValue,dRet,bDot))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (bDot)\n\t\t\t\t\t\t\tvp << dRet;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tvp << dRet;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tvp << swValue;\t\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase FIELDTYPE_CHECKBOX:\n\t\tcase FIELDTYPE_RADIOBUTTON:\n\t\t\t{\n\t\t\t\tFX_BOOL bFind = FALSE;\n\t\t\t\tfor (int i = 0 , sz = pFormField->CountControls(); i < sz; i++)\n\t\t\t\t{\n\t\t\t\t\tif (pFormField->GetControl(i)->IsChecked())\n\t\t\t\t\t{\n\t\t\t\t\t\tCFX_WideString swValue = pFormField->GetControl(i)->GetExportValue();\n\t\t\t\t\t\t\n\t\t\t\t\t\tdouble dRet;\n\t\t\t\t\t\tFX_BOOL bDot;\n\t\t\t\t\t\tif (CJS_PublicMethods::ConvertStringToNumber(swValue,dRet,bDot))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (bDot)\n\t\t\t\t\t\t\t\tvp << dRet;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tvp << dRet;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tvp << swValue;\n\n\t\t\t\t\t\tbFind = TRUE;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (!bFind)\n\t\t\t\t\tvp << (FX_LPCWSTR)L\"Off\";\t\t\t\t\t\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tvp << pFormField->GetValue();\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn TRUE;\n}\n\nvoid Field::SetValue(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, \n\t\t\t\t\t int nControlIndex, const CJS_WideStringArray& strArray)\n{\n\tASSERT(pDocument != NULL);\n\n\tif (strArray.GetSize() < 1) return;\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(pDocument, swFieldName, FieldArray);\n\n\tfor (int i=0,isz=FieldArray.GetSize(); i<isz; i++)\n\t{\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);\n\t\tASSERT(pFormField != NULL);\n\n\t\tif (pFormField->GetFullName().Compare(swFieldName) != 0)\n\t\t\tcontinue;\n\n\t\tswitch (pFormField->GetFieldType())\n\t\t{\n\t\tcase FIELDTYPE_TEXTFIELD:\n\t\tcase FIELDTYPE_COMBOBOX:\n\t\t\tif (pFormField->GetValue() != strArray.GetAt(0))\n\t\t\t{\n\t\t\t\tCFX_WideString WideString = strArray.GetAt(0);\n\t\t\t\tpFormField->SetValue(strArray.GetAt(0), TRUE);\t\n\t\t\t\tUpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase FIELDTYPE_CHECKBOX: //mantis: 0004493\n\t\tcase FIELDTYPE_RADIOBUTTON:\n\t\t\t{\n\t\t\t\tif (pFormField->GetValue() != strArray.GetAt(0))\n\t\t\t\t{\n\t\t\t\t\tpFormField->SetValue(strArray.GetAt(0), TRUE);\t\n\t\t\t\t\tUpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase FIELDTYPE_LISTBOX:\n\t\t\t{\n\t\t\t\tFX_BOOL bModified = FALSE;\n\n\t\t\t\tfor (int i=0,sz=strArray.GetSize(); i<sz; i++)\n\t\t\t\t{\n\t\t\t\t\tint iIndex = pFormField->FindOption(strArray.GetAt(i));\n\n\t\t\t\t\tif (!pFormField->IsItemSelected(iIndex))\n\t\t\t\t\t{\n\t\t\t\t\t\tbModified = TRUE;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (bModified)\n\t\t\t\t{\n\t\t\t\t\tpFormField->ClearSelection(TRUE);\n\t\t\t\t\tfor (int i=0,sz=strArray.GetSize(); i<sz; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tint iIndex = pFormField->FindOption(strArray.GetAt(i));\n\t\t\t\t\t\tpFormField->SetItemSelection(iIndex, TRUE, TRUE);\n\t\t\t\t\t}\n\n\t\t\t\t\tUpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\t\t\t\t\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nFX_BOOL Field::valueAsString(OBJ_PROP_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (!vp.IsGetting()) return FALSE;\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(m_FieldName,FieldArray);\n\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n   \tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\tASSERT(pFormField != NULL);\n\n\tif (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON)\n\t\treturn FALSE;\n\n\tif (pFormField->GetFieldType() == FIELDTYPE_CHECKBOX)\n\t{\n\t\tif(!pFormField->CountControls()) return FALSE;\n\n\t\tif (pFormField->GetControl(0)->IsChecked())\n\t\t\tvp << (FX_LPCWSTR)L\"Yes\";\n\t\telse\n\t\t\tvp << (FX_LPCWSTR)L\"Off\";\n\t}\n\telse if (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON && !(pFormField->GetFieldFlags() & FIELDFLAG_RADIOSINUNISON))\n\t{\n\t\tfor (int i=0, sz=pFormField->CountControls(); i<sz; i++)\n\t\t{\n\t\t\tif (pFormField->GetControl(i)->IsChecked())\n\t\t\t{\n\t\t\t\tvp << (FX_LPCWSTR)pFormField->GetControl(i)->GetExportValue();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse\n\t\t\t\tvp << (FX_LPCWSTR)L\"Off\";\n\t\t}\n\t}\n\telse if (pFormField->GetFieldType() == FIELDTYPE_LISTBOX && (pFormField->CountSelectedItems() > 1))\n\t{\n\t\tvp << (FX_LPCWSTR)L\"\";\n\t}\n\telse\n\t\tvp << (FX_LPCWSTR)pFormField->GetValue();\n\n\treturn TRUE;\n}\n\n/* --------------------------------- methods --------------------------------- */\n\nFX_BOOL Field::browseForFileToSubmit(OBJ_METHOD_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(m_FieldName, FieldArray);\n\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\tASSERT(pFormField != NULL);\n\n \tCPDFDoc_Environment* pApp = m_pDocument->GetEnv();\n \tASSERT(pApp != NULL);\n\n\tif ((pFormField->GetFieldFlags() & FIELDFLAG_FILESELECT) && \n\t\t(pFormField->GetFieldType() == FIELDTYPE_TEXTFIELD))\n\t{\t\t\n\t\tCFX_WideString wsFileName = pApp->JS_fieldBrowse();\n\t\tif(!wsFileName.IsEmpty())\n\t\t{\n \t\t\tpFormField->SetValue(wsFileName);\n \t\t\tUpdateFormField(m_pDocument, pFormField, TRUE, TRUE, TRUE);\n         }\n\t}\n\telse \n\t\treturn FALSE;\n\n\treturn TRUE;\n}\n\n\nFX_BOOL Field::buttonGetCaption(OBJ_METHOD_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tint nface = 0;\n\tint iSize = params.size();\n\tif ( iSize >= 1)\n\t\tnface = (FX_INT32) params[0];\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(m_FieldName,FieldArray);\n\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\tASSERT(pFormField != NULL);\n\t\n\tif (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)\n\t\treturn FALSE;\n\n\tCPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);\n\tif (!pFormControl)return FALSE;\n\t\n\tif (nface == 0)\n\t\tvRet = pFormControl->GetNormalCaption();\n\telse if (nface == 1)\n\t\tvRet = pFormControl->GetDownCaption();\n\telse if (nface == 2)\n\t\tvRet = pFormControl->GetRolloverCaption();\n\telse\n\t\treturn FALSE;\n\n\treturn TRUE;\n}\n\n//#pragma warning(disable: 4800)\n\nFX_BOOL Field::buttonGetIcon(OBJ_METHOD_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tint nface = 0;\n\tint iSize = params.size();\n\tif ( iSize >= 1)\n\t\tnface = (FX_INT32) params[0];\n\t\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(m_FieldName,FieldArray);\n\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\tASSERT(pFormField != NULL);\n\t\n\tif (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)\n\t\treturn FALSE;\n\n\tCPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);\n\tif (!pFormControl)return FALSE;\n\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\n\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\tASSERT(pRuntime != NULL);\n\t\n\tJSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L\"Icon\"));\n\tASSERT(pObj.IsEmpty() == FALSE);\n\t\n\tCJS_Icon* pJS_Icon = (CJS_Icon*)JS_GetPrivate(pObj);\n\tASSERT(pJS_Icon != NULL);\n\n\tIcon* pIcon = (Icon*)pJS_Icon->GetEmbedObject();\n\tASSERT(pIcon != NULL);\n\n\tCPDF_Stream* pIconStream = NULL;\n\tif (nface == 0)\n\t\tpIconStream = pFormControl->GetNormalIcon();\n\telse if (nface == 1)\n\t\tpIconStream = pFormControl->GetDownIcon();\n\telse if (nface == 2)\n\t\tpIconStream = pFormControl->GetRolloverIcon();\n\telse\n\t\treturn FALSE;\n\n\tpIcon->SetStream(pIconStream);\n\tvRet = pJS_Icon;\n\n\treturn TRUE;\n}\n\n//#pragma warning(default: 4800)\n\nFX_BOOL Field::buttonImportIcon(OBJ_METHOD_PARAMS)\n{\n#if 0  \n\tASSERT(m_pDocument != NULL);\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(m_FieldName,FieldArray);\n\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\tif (!pFormField)return FALSE;\n\n\tCPDFDoc_Environment* pEnv = m_pDocument->GetEnv();\n\tASSERT(pEnv);\n\n\tCFX_WideString sIconFileName = pEnv->JS_fieldBrowse();\n\tif (sIconFileName.IsEmpty()) \n\t{\n\t\tvRet = 1;\n\t\treturn TRUE;\n\t}\n\n\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\n\tCPDF_Stream* pStream = pInterForm->LoadImageFromFile(sIconFileName);\n\tif (!pStream) \n\t{\n\t\tvRet = -1;\n\t\treturn TRUE;\n\t}\n\n\tCPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);\n\tif (!pFormControl)return FALSE;\n\n\tpFormControl->SetNormalIcon(pStream);\n\tUpdateFormControl(m_pDocument, pFormControl, TRUE, TRUE, TRUE);\n\n\tvRet = 0;\n#endif // 0\n\treturn TRUE;\n}\n\nFX_BOOL Field::buttonSetCaption(OBJ_METHOD_PARAMS)\n{\n\treturn FALSE;\n}\n\nFX_BOOL Field::buttonSetIcon(OBJ_METHOD_PARAMS)\n{\n\treturn FALSE;\n}\n\nFX_BOOL Field::checkThisBox(OBJ_METHOD_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (!m_bCanSet) return FALSE;\n\n\tint iSize = params.size();\n\tint nWidget = -1;\n\tif ( iSize >= 1)\n\t\tnWidget= (FX_INT32) params[0];\n\telse\n\t\treturn FALSE;\n\tFX_BOOL bCheckit = TRUE;\n\tif ( iSize >= 2)\n\t\tbCheckit = params[1];\n\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(m_FieldName,FieldArray);\n\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\tASSERT(pFormField != NULL);\n\t\n\tif (pFormField->GetFieldType() != FIELDTYPE_CHECKBOX && pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON)\n\t\treturn FALSE;\t\n\tif(nWidget <0 || nWidget >= pFormField->CountControls())\n\t\treturn FALSE;\n\tif (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON)\n\t\tpFormField->CheckControl(nWidget, bCheckit, TRUE);\n\telse\n\t\tpFormField->CheckControl(nWidget, bCheckit, TRUE);\n\n\tUpdateFormField(m_pDocument, pFormField, TRUE, TRUE, TRUE);\n\n\treturn TRUE;\n}\n\nFX_BOOL Field::clearItems(OBJ_METHOD_PARAMS)\n{\n\treturn TRUE;\n}\n\nFX_BOOL Field::defaultIsChecked(OBJ_METHOD_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tif (!m_bCanSet) return FALSE;\n\n\tint iSize = params.size();\n\tint nWidget = -1;\n\tif ( iSize >= 1)\n\t\tnWidget= (FX_INT32) params[0];\n\telse\n\t\treturn FALSE;\n\t//FX_BOOL bIsDefaultChecked = TRUE;\n\t//if ( iSize >= 2)\n\t//\tbIsDefaultChecked =  params[1];\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(m_FieldName,FieldArray);\n\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\tASSERT(pFormField != NULL);\n\n\tif(nWidget <0 || nWidget >= pFormField->CountControls())\n\t{\n\t\tvRet = FALSE;\n\t\treturn FALSE;\n\t}\n\tif ((pFormField->GetFieldType() == FIELDTYPE_CHECKBOX)\n\t\t|| (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON))\n\t{\n\n\t\tvRet = TRUE;\n\t}\n\telse\n\t\tvRet = FALSE;\n\n\treturn TRUE;\n}\n\nFX_BOOL Field::deleteItemAt(OBJ_METHOD_PARAMS)\n{\n\treturn TRUE;\n}\n\nint JS_COMPARESTRING(CFX_WideString* ps1, CFX_WideString* ps2)\n{\n\tASSERT(ps1 != NULL);\n\tASSERT(ps2 != NULL);\n\n\treturn ps1->Compare(*ps2);\n}\n\n\nFX_BOOL Field::getArray(OBJ_METHOD_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(m_FieldName,FieldArray);\n\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\tCGW_ArrayTemplate<CFX_WideString*> swSort;\n\n\tfor (int i=0,sz=FieldArray.GetSize(); i<sz; i++)\n\t{\n\t\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);\n\t\tASSERT(pFormField != NULL);\n\n\t\tswSort.Add(new CFX_WideString(pFormField->GetFullName()));\n\t\t\n\t}\n\tswSort.Sort(JS_COMPARESTRING);\n\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\tASSERT(pRuntime != NULL);\n\n\tCJS_Array FormFieldArray(m_isolate);\n\tfor (int j=0,jsz = swSort.GetSize(); j<jsz; j++)\n\t{\n\t\tCFX_WideString* pStr = swSort.GetAt(j);\n\n\t\tJSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L\"Field\"));\n\t\tASSERT(pObj.IsEmpty() == FALSE);\n\n\t\tCJS_Field* pJSField = (CJS_Field*)JS_GetPrivate(pObj);\n\t\tASSERT(pJSField != NULL);\n\n\t\tField* pField = (Field*)pJSField->GetEmbedObject(); \n\t\tASSERT(pField != NULL);\n\n\t\tpField->AttachField(this->m_pJSDoc, *pStr);\n\t\n\t\tCJS_Value FormFieldValue(m_isolate);\n\t\tFormFieldValue = pJSField;\n\t\tFormFieldArray.SetElement(j, FormFieldValue);\n\n\t\tdelete pStr;\n\t}\n\n\tvRet = FormFieldArray;\n\tswSort.RemoveAll();\n\treturn TRUE;\n}\n\t\nFX_BOOL Field::getItemAt(OBJ_METHOD_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tint nIdx = -1;\n\tif (params.size() >=1)\n\t\tnIdx = (FX_INT32) params[0];\n\tFX_BOOL bExport = TRUE;\n\tint iSize = params.size();\n\tif ( iSize >= 2)\n\t{\n\t\tbExport =(FX_BOOL) params[1];\n\t}\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(m_FieldName,FieldArray);\n\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\tASSERT(pFormField != NULL);\n\n\tif ((pFormField->GetFieldType() == FIELDTYPE_LISTBOX)\n\t\t|| (pFormField->GetFieldType() == FIELDTYPE_COMBOBOX))\n\t{\n\t\tif (nIdx == -1 || nIdx > pFormField->CountOptions())\n\t\t\tnIdx = pFormField->CountOptions() -1;\n\t\tif (bExport)\n\t\t{\n\t\t\tCFX_WideString strval = pFormField->GetOptionValue(nIdx);\n\t\t\tif (strval.IsEmpty())\n\t\t\t\tvRet = pFormField->GetOptionLabel(nIdx);\n\t\t\telse\n\t\t\t\tvRet = strval;\n\t\t}\n\t\telse\n\t\t\tvRet = pFormField->GetOptionLabel(nIdx);\n\t}\n\telse\n\t\treturn FALSE;\n\n\treturn TRUE;\n}\n\nFX_BOOL Field::getLock(OBJ_METHOD_PARAMS)\n{\n\treturn FALSE;\n}\n\nFX_BOOL Field::insertItemAt(OBJ_METHOD_PARAMS)\n{\n\treturn TRUE;\n}\n\nFX_BOOL Field::isBoxChecked(OBJ_METHOD_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tint nIndex = -1;\n\tif (params.size() >=1)\n\t\tnIndex = (FX_INT32) params[0];\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(m_FieldName,FieldArray);\n\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\tASSERT(pFormField != NULL);\n\n\tif(nIndex <0 || nIndex >= pFormField->CountControls())\n\t{\n\t\tvRet = FALSE;\n\t\treturn FALSE;\n\t}\n\n\tif ((pFormField->GetFieldType() == FIELDTYPE_CHECKBOX)\n\t\t|| (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON))\n\t{\n\t\tif (pFormField->GetControl(nIndex)->IsChecked() !=0 )\n\t\t\tvRet = TRUE;\n\t\telse\n\t\t\tvRet = FALSE;\n\t}\n\telse\n\t\tvRet = FALSE;\n\n\treturn TRUE;\n}\n\nFX_BOOL Field::isDefaultChecked(OBJ_METHOD_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tint nIndex = -1;\n\tif (params.size() >=1)\n\t\tnIndex = (FX_INT32) params[0];\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(m_FieldName,FieldArray);\n\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\tASSERT(pFormField != NULL);\n\n\tif(nIndex <0 || nIndex >= pFormField->CountControls())\n\t{\n\t\tvRet = FALSE;\n\t\treturn FALSE;\n\t}\n\tif ((pFormField->GetFieldType() == FIELDTYPE_CHECKBOX)\n\t\t|| (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON))\n\t{\n\t\tif (pFormField->GetControl(nIndex)->IsDefaultChecked() != 0)\n\t\t\tvRet = TRUE;\n\t\telse\n\t\t\tvRet = FALSE;\n\t}\n\telse\n\t\tvRet = FALSE;\n\n\treturn TRUE;\n}\n\nFX_BOOL Field::setAction(OBJ_METHOD_PARAMS)\n{\n\treturn TRUE;\n}\n\nFX_BOOL Field::setFocus(OBJ_METHOD_PARAMS)\n{\n\tASSERT(m_pDocument != NULL);\n\n\tCFX_PtrArray FieldArray;\n\tGetFormFields(m_FieldName,FieldArray);\n\tif (FieldArray.GetSize() <= 0) return FALSE;\n\n\tCPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);\n\tASSERT(pFormField != NULL);\n\n\tFX_INT32 nCount = pFormField->CountControls();\n\n\tif (nCount < 1) return FALSE;\n\n\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\n\tCPDFSDK_Widget* pWidget = NULL;\n\tif (nCount == 1)\n\t{\t\n\t\tpWidget = pInterForm->GetWidget(pFormField->GetControl(0));\n\t}\n\telse\n\t{\n\t\tCPDFDoc_Environment* pEnv = m_pDocument->GetEnv();\n\t\tASSERT(pEnv);\n\t\tCPDF_Page* pPage = (CPDF_Page*)pEnv->FFI_GetCurrentPage(m_pDocument->GetDocument());\n\t\tif(!pPage)\n\t\t\treturn FALSE;\n\t\tif (CPDFSDK_PageView* pCurPageView = m_pDocument->GetPageView(pPage))\n\t\t{\n\t\t\tfor (FX_INT32 i=0; i<nCount; i++)\n\t\t\t{\n\t\t\t\tif (CPDFSDK_Widget* pTempWidget =  pInterForm->GetWidget(pFormField->GetControl(i)))\n\t\t\t\t{\t\t\t\t\n\t\t\t\t\tif (pTempWidget->GetPDFPage() == pCurPageView->GetPDFPage())\n\t\t\t\t\t{\n\t\t\t\t\t\tpWidget = pTempWidget;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (pWidget)\n\t{\n\t\tm_pDocument->SetFocusAnnot(pWidget);\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL Field::setItems(OBJ_METHOD_PARAMS)\n{\n\treturn TRUE;\n}\n\nFX_BOOL Field::setLock(OBJ_METHOD_PARAMS)\n{\n\treturn FALSE;\n}\n\nFX_BOOL Field::signatureGetModifications(OBJ_METHOD_PARAMS)\n{\n\treturn FALSE;\n}\n\nFX_BOOL Field::signatureGetSeedValue(OBJ_METHOD_PARAMS)\n{\n\treturn FALSE;\n}\n\nFX_BOOL Field::signatureInfo(OBJ_METHOD_PARAMS)\n{\n\treturn FALSE;\n}\n\nFX_BOOL Field::signatureSetSeedValue(OBJ_METHOD_PARAMS)\n{\n\treturn FALSE;\n}\n\nFX_BOOL Field::signatureSign(OBJ_METHOD_PARAMS)\n{\n\treturn FALSE;\n}\n\nFX_BOOL Field::signatureValidate(OBJ_METHOD_PARAMS)\n{\n\treturn FALSE;\n}\n\nFX_BOOL Field::source(OBJ_PROP_PARAMS)\n{\n\tif (vp.IsGetting())\n\t{\n\t\tvp << (CJS_Object*)NULL;\n\t}\n\n\treturn TRUE;\n}\n\n/////////////////////////////////////////// delay /////////////////////////////////////////////\n\nvoid Field::AddDelay_Int(enum FIELD_PROP prop, FX_INT32 n)\n{\n\tASSERT(m_pJSDoc != NULL);\n\n\tCJS_DelayData* pNewData = new CJS_DelayData;\n\tpNewData->sFieldName = m_FieldName;\n\tpNewData->nControlIndex = m_nFormControlIndex;\n\tpNewData->eProp = prop;\n\tpNewData->num = n;\n\n\tm_pJSDoc->AddDelayData(pNewData);\n}\n\nvoid Field::AddDelay_Bool(enum FIELD_PROP prop,bool b)\n{\n\tASSERT(m_pJSDoc != NULL);\n\n\tCJS_DelayData* pNewData = new CJS_DelayData;\n\tpNewData->sFieldName = m_FieldName;\n\tpNewData->nControlIndex = m_nFormControlIndex;\n\tpNewData->eProp = prop;\n\tpNewData->b = b;\n\n\tm_pJSDoc->AddDelayData(pNewData);\n}\n\nvoid Field::AddDelay_String(enum FIELD_PROP prop, const CFX_ByteString& string)\n{\n\tASSERT(m_pJSDoc != NULL);\n\n\tCJS_DelayData* pNewData = new CJS_DelayData;\n\tpNewData->sFieldName = m_FieldName;\n\tpNewData->nControlIndex = m_nFormControlIndex;\n\tpNewData->eProp = prop;\n\tpNewData->string = string;\n\n\tm_pJSDoc->AddDelayData(pNewData);\n}\n\nvoid Field::AddDelay_WideString(enum FIELD_PROP prop, const CFX_WideString& string)\n{\n\tASSERT(m_pJSDoc != NULL);\n\n\tCJS_DelayData* pNewData = new CJS_DelayData;\n\tpNewData->sFieldName = m_FieldName;\n\tpNewData->nControlIndex = m_nFormControlIndex;\n\tpNewData->eProp = prop;\n\tpNewData->widestring = string;\n\n\tm_pJSDoc->AddDelayData(pNewData);\n}\n\nvoid Field::AddDelay_Rect(enum FIELD_PROP prop, const CPDF_Rect& rect)\n{\n\tASSERT(m_pJSDoc != NULL);\n\n\tCJS_DelayData* pNewData = new CJS_DelayData;\n\tpNewData->sFieldName = m_FieldName;\n\tpNewData->nControlIndex = m_nFormControlIndex;\n\tpNewData->eProp = prop;\n\tpNewData->rect = rect;\n\n\tm_pJSDoc->AddDelayData(pNewData);\n}\n\nvoid Field::AddDelay_Color(enum FIELD_PROP prop, const CPWL_Color& color)\n{\n\tASSERT(m_pJSDoc != NULL);\n\n\tCJS_DelayData* pNewData = new CJS_DelayData;\n\tpNewData->sFieldName = m_FieldName;\n\tpNewData->nControlIndex = m_nFormControlIndex;\n\tpNewData->eProp = prop;\n\tpNewData->color = color;\n\n\tm_pJSDoc->AddDelayData(pNewData);\n}\n\nvoid Field::AddDelay_WordArray(enum FIELD_PROP prop, const CFX_DWordArray& array)\n{\n\tASSERT(m_pJSDoc != NULL);\n\n\tCJS_DelayData* pNewData = new CJS_DelayData;\n\tpNewData->sFieldName = m_FieldName;\n\tpNewData->nControlIndex = m_nFormControlIndex;\n\tpNewData->eProp = prop;\n\n\tfor (int i=0,sz=array.GetSize(); i<sz; i++)\n\t\tpNewData->wordarray.Add(array.GetAt(i));\n\n\tm_pJSDoc->AddDelayData(pNewData);\n}\n\nvoid Field::AddDelay_WideStringArray(enum FIELD_PROP prop, const CJS_WideStringArray& array)\n{\n\tASSERT(m_pJSDoc != NULL);\n\n\tCJS_DelayData* pNewData = new CJS_DelayData;\n\tpNewData->sFieldName = m_FieldName;\n\tpNewData->nControlIndex = m_nFormControlIndex;\n\tpNewData->eProp = prop;\n\tfor (int i=0,sz=array.GetSize(); i<sz; i++)\n\t\tpNewData->widestringarray.Add(array.GetAt(i));\n\n\tm_pJSDoc->AddDelayData(pNewData);\n}\n\nvoid Field::DoDelay(CPDFSDK_Document* pDocument, CJS_DelayData* pData)\n{\n\tASSERT(pDocument != NULL);\n\tASSERT(pData != NULL);\n\n\tswitch (pData->eProp)\n\t{\n\tcase FP_ALIGNMENT:\n\t\tField::SetAlignment(pDocument, pData->sFieldName, pData->nControlIndex, pData->string);\n\t\tbreak;\n\tcase FP_BORDERSTYLE:\n\t\tField::SetBorderStyle(pDocument, pData->sFieldName, pData->nControlIndex, pData->string);\n\t\tbreak;\n\tcase FP_BUTTONALIGNX:\n\t\tField::SetButtonAlignX(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);\n\t\tbreak;\n\tcase FP_BUTTONALIGNY:\n\t\tField::SetButtonAlignY(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);\n\t\tbreak;\n\tcase FP_BUTTONFITBOUNDS:\n\t\tField::SetButtonFitBounds(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);\n\t\tbreak;\n\tcase FP_BUTTONPOSITION:\n\t\tField::SetButtonPosition(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);\n\t\tbreak;\n\tcase FP_BUTTONSCALEHOW:\n\t\tField::SetButtonScaleHow(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);\n\t\tbreak;\n\tcase FP_BUTTONSCALEWHEN:\n\t\tField::SetButtonScaleWhen(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);\n\t\tbreak;\n\tcase FP_CALCORDERINDEX:\n\t\tField::SetCalcOrderIndex(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);\n\t\tbreak;\n\tcase FP_CHARLIMIT:\n\t\tField::SetCharLimit(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);\n\t\tbreak;\n\tcase FP_COMB:\n\t\tField::SetComb(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);\n\t\tbreak;\n\tcase FP_COMMITONSELCHANGE:\n\t\tField::SetCommitOnSelChange(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);\n\t\tbreak;\n\tcase FP_CURRENTVALUEINDICES:\n\t\tField::SetCurrentValueIndices(pDocument, pData->sFieldName, pData->nControlIndex, pData->wordarray);\n\t\tbreak;\n\tcase FP_DEFAULTVALUE:\n\t\tField::SetDefaultValue(pDocument, pData->sFieldName, pData->nControlIndex, pData->widestring);\n\t\tbreak;\n\tcase FP_DONOTSCROLL:\n\t\tField::SetDoNotScroll(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);\n\t\tbreak;\n\tcase FP_DISPLAY:\n\t\tField::SetDisplay(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);\n\t\tbreak;\n\tcase FP_FILLCOLOR:\n\t\tField::SetFillColor(pDocument, pData->sFieldName, pData->nControlIndex, pData->color);\n\t\tbreak;\n\tcase FP_HIDDEN:\n\t\tField::SetHidden(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);\n\t\tbreak;\n\tcase FP_HIGHLIGHT:\n\t\tField::SetHighlight(pDocument, pData->sFieldName, pData->nControlIndex, pData->string);\n\t\tbreak;\n\tcase FP_LINEWIDTH:\n\t\tField::SetLineWidth(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);\n\t\tbreak;\n\tcase FP_MULTILINE:\n\t\tField::SetMultiline(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);\n\t\tbreak;\n\tcase FP_MULTIPLESELECTION:\n\t\tField::SetMultipleSelection(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);\n\t\tbreak;\n\tcase FP_PASSWORD:\n\t\tField::SetPassword(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);\n\t\tbreak;\n\tcase FP_RECT:\n\t\tField::SetRect(pDocument, pData->sFieldName, pData->nControlIndex, pData->rect);\n\t\tbreak;\n\tcase FP_RICHTEXT:\n\t\tField::SetRichText(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);\n\t\tbreak;\n\tcase FP_RICHVALUE:\n\t\tbreak;\n\tcase FP_ROTATION:\n\t\tField::SetRotation(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);\n\t\tbreak;\n\tcase FP_STROKECOLOR:\n\t\tField::SetStrokeColor(pDocument, pData->sFieldName, pData->nControlIndex, pData->color);\n\t\tbreak;\n\tcase FP_STYLE:\n\t\tField::SetStyle(pDocument, pData->sFieldName, pData->nControlIndex, pData->string);\n\t\tbreak;\n\tcase FP_TEXTCOLOR:\n\t\tField::SetTextColor(pDocument, pData->sFieldName, pData->nControlIndex, pData->color);\n\t\tbreak;\n\tcase FP_TEXTFONT:\n\t\tField::SetTextFont(pDocument, pData->sFieldName, pData->nControlIndex, pData->string);\n\t\tbreak;\n\tcase FP_TEXTSIZE:\n\t\tField::SetTextSize(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);\n\t\tbreak;\n\tcase FP_USERNAME:\n\t\tField::SetUserName(pDocument, pData->sFieldName, pData->nControlIndex, pData->widestring);\n\t\tbreak;\n\tcase FP_VALUE:\n\t\tField::SetValue(pDocument, pData->sFieldName, pData->nControlIndex, pData->widestringarray);\n\t\tbreak;\n\t}\n}\n\n#define JS_FIELD_MINWIDTH\t1\n#define JS_FIELD_MINHEIGHT\t1\n\nvoid Field::AddField(CPDFSDK_Document* pDocument, int nPageIndex, int nFieldType,\n\t\t\t\t\t\t\tconst CFX_WideString& sName, const CPDF_Rect& rcCoords)\n{\n\t//Not supported.\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/javascript/Icon.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/javascript/JavaScript.h\"\n#include \"../../include/javascript/IJavaScript.h\"\n#include \"../../include/javascript/JS_Define.h\"\n#include \"../../include/javascript/JS_Object.h\"\n#include \"../../include/javascript/JS_Value.h\"\n#include \"../../include/javascript/Icon.h\"\n\n/* ---------------------- Icon ---------------------- */\n\nBEGIN_JS_STATIC_CONST(CJS_Icon)\nEND_JS_STATIC_CONST()\n\nBEGIN_JS_STATIC_PROP(CJS_Icon)\n\tJS_STATIC_PROP_ENTRY(name)\nEND_JS_STATIC_PROP()\n\nBEGIN_JS_STATIC_METHOD(CJS_Icon) \nEND_JS_STATIC_METHOD()\n\nIMPLEMENT_JS_CLASS(CJS_Icon,Icon)\n\nIcon::Icon(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject),\n\tm_pIconStream(NULL),\n\tm_swIconName(L\"\")\n{\n}\n\nIcon::~Icon()\n{\n\n}\n\nvoid Icon::SetStream(CPDF_Stream* pIconStream)\n{\n\tif(pIconStream)\n\t\tm_pIconStream = pIconStream;\n}\n\nCPDF_Stream* Icon::GetStream()\n{\n\treturn m_pIconStream;\n}\n\nvoid Icon::SetIconName(CFX_WideString name)\n{\n\tm_swIconName = name;\n}\n\nCFX_WideString Icon::GetIconName()\n{\n\treturn m_swIconName;\n}\n\nFX_BOOL Icon::name(OBJ_PROP_PARAMS)\n{\n\tif(!vp.IsGetting())return FALSE;\n\n\tvp << m_swIconName;\n\treturn TRUE;\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/javascript/JS_Context.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/javascript/JavaScript.h\"\n#include \"../../include/javascript/IJavaScript.h\"\n//#include \"../../include/javascript/JS_ResMgr.h\"\n#include \"../../include/javascript/JS_Context.h\"\n#include \"../../include/javascript/JS_EventHandler.h\"\n#include \"../../include/javascript/JS_Runtime.h\"\n#include \"../../include/javascript/resource.h\"\n\n/* -------------------------- CJS_Context -------------------------- */\n\nCJS_Context::CJS_Context(CJS_Runtime* pRuntime) : \t\n\tm_pRuntime(pRuntime),\n\tm_bBusy(FALSE),\n\tm_bMsgBoxEnable(TRUE)\n{\n\tm_pEventHandler = new CJS_EventHandler(this);\n}\n\nCJS_Context::~CJS_Context(void)\n{\n\tif (m_pEventHandler)\n\t{\n\t\tdelete m_pEventHandler;\n\t\tm_pEventHandler = NULL;\n\t}\n}\n\nCPDFSDK_Document* CJS_Context::GetReaderDocument()\n{\n\tASSERT(m_pRuntime != NULL);\n\n\treturn m_pRuntime->GetReaderDocument();\n}\n\nCPDFDoc_Environment* CJS_Context::GetReaderApp()\n{\n\tASSERT(m_pRuntime != NULL);\n\t\n\treturn m_pRuntime->GetReaderApp();\n}\n\nFX_BOOL CJS_Context::DoJob(int nMode, const CFX_WideString& script, CFX_WideString& info)\n{\n\tif (m_bBusy)\n\t{\t\t\n\t\tinfo = JSGetStringFromID(this, IDS_STRING_JSBUSY);\n\t\treturn FALSE;\n\t}\t\n\n\tm_bBusy = TRUE;\n\n\tASSERT(m_pRuntime != NULL);\n\tASSERT(m_pEventHandler != NULL);\n\tASSERT(m_pEventHandler->IsValid());\n\n\tif (!m_pRuntime->AddEventToLoop(m_pEventHandler->TargetName(), m_pEventHandler->EventType()))\n\t{\n\t\tinfo = JSGetStringFromID(this, IDS_STRING_JSEVENT);\n\t\treturn FALSE;\n\t}\n\n\tFXJSErr error ={NULL,NULL, 0};\n\tint nRet = 0;\t\n\n\ttry\n\t{\t\n\t\tif (script.GetLength() > 0)\n\t\t{\n\t\t\tif (nMode == 0)\n\t\t\t{\t\t\n\t\t\t\tnRet = JS_Execute(*m_pRuntime, this, script, script.GetLength(), &error);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tnRet = JS_Parse(*m_pRuntime, this, script, script.GetLength(), &error);\n\t\t\t}\n\t\t}\n\n\t\tif (nRet < 0)\n\t\t{\n\t\t\tCFX_WideString sLine;\n\t\t\tsLine.Format((FX_LPCWSTR)L\"[ Line: %05d { %s } ] : %s\",error.linnum-1,error.srcline,error.message);\n\n//\t\t\tTRACE(L\"/* -------------- JS Error -------------- */\\n\");\n//\t\t\tTRACE(sLine);\n//\t\t\tTRACE(L\"\\n\");\n\t\t\t//CFX_ByteString sTemp = CFX_ByteString::FromUnicode(error.message);\n\t\t\tinfo += sLine;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tinfo = JSGetStringFromID(this, IDS_STRING_RUN);\n\t\t}\t\t\n\n\t}\n\tcatch (...)\n\t{\n\t\tinfo = JSGetStringFromID(this, IDS_STRING_UNHANDLED);\n\t\tnRet = -1;\n\t}\n\n\tm_pRuntime->RemoveEventInLoop(m_pEventHandler->TargetName(), m_pEventHandler->EventType());\n\n\tm_pEventHandler->Destroy();\n\tm_bBusy = FALSE;\t\n\n\treturn nRet >= 0;\n}\n\nFX_BOOL CJS_Context::RunScript(const CFX_WideString& script, CFX_WideString& info)\n{\n\tv8::Isolate::Scope isolate_scope(m_pRuntime->GetIsolate());\n\tv8::HandleScope handle_scope(m_pRuntime->GetIsolate());\n\tv8::Local<v8::Context> context = m_pRuntime->NewJSContext();\n\tv8::Context::Scope context_scope(context);\n\n\treturn DoJob(0, script, info);\n}\n\nFX_BOOL CJS_Context::Compile(const CFX_WideString& script, CFX_WideString& info)\n{\n\tv8::Isolate::Scope isolate_scope(m_pRuntime->GetIsolate());\n\tv8::HandleScope handle_scope(m_pRuntime->GetIsolate());\n\tv8::Local<v8::Context> context = m_pRuntime->NewJSContext();\n\tv8::Context::Scope context_scope(context);\n\n\treturn DoJob(1, script, info);\n}\n\nvoid CJS_Context::OnApp_Init()\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnApp_Init();\n}\n\nvoid CJS_Context::OnDoc_Open(CPDFSDK_Document* pDoc, const CFX_WideString &strTargetName)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnDoc_Open(pDoc,strTargetName);\n}\n\nvoid CJS_Context::OnDoc_WillPrint(CPDFSDK_Document* pDoc)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnDoc_WillPrint(pDoc);\n}\n\nvoid CJS_Context::OnDoc_DidPrint(CPDFSDK_Document* pDoc)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnDoc_DidPrint(pDoc);\n}\n\nvoid CJS_Context::OnDoc_WillSave(CPDFSDK_Document* pDoc)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnDoc_WillSave(pDoc);\n}\n\nvoid CJS_Context::OnDoc_DidSave(CPDFSDK_Document* pDoc)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnDoc_DidSave(pDoc);\n}\n\nvoid CJS_Context::OnDoc_WillClose(CPDFSDK_Document* pDoc)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnDoc_WillClose(pDoc);\n}\n\nvoid CJS_Context::OnPage_Open(CPDFSDK_Document* pTarget)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnPage_Open(pTarget);\n}\n\nvoid CJS_Context::OnPage_Close(CPDFSDK_Document* pTarget)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnPage_Close(pTarget);\n}\n\nvoid CJS_Context::OnPage_InView(CPDFSDK_Document* pTarget)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnPage_InView(pTarget);\n}\n\nvoid CJS_Context::OnPage_OutView(CPDFSDK_Document* pTarget)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnPage_OutView(pTarget);\n}\n\nvoid CJS_Context::OnField_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnField_MouseDown(bModifier, bShift, pTarget);\n}\n\nvoid CJS_Context::OnField_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnField_MouseEnter(bModifier, bShift, pTarget);\n}\n\nvoid CJS_Context::OnField_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnField_MouseExit(bModifier, bShift, pTarget);\n}\n\nvoid CJS_Context::OnField_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnField_MouseUp(bModifier, bShift, pTarget);\n}\n\nvoid CJS_Context::OnField_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, const CFX_WideString& Value)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnField_Focus(bModifier, bShift, pTarget, Value);\n}\n\nvoid CJS_Context::OnField_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, const CFX_WideString& Value)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnField_Blur(bModifier, bShift, pTarget, Value);\n}\n\nvoid CJS_Context::OnField_Calculate(CPDF_FormField* pSource, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL& bRc)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnField_Calculate(pSource, pTarget, Value, bRc);\n}\n\nvoid CJS_Context::OnField_Format(int nCommitKey, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL bWillCommit)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnField_Format(nCommitKey, pTarget, Value, bWillCommit);\n}\n\n\nvoid CJS_Context::OnField_Keystroke(int nCommitKey, CFX_WideString& strChange, const CFX_WideString& strChangeEx,\n\t\t\t\t\t\t\t\t\tFX_BOOL bKeyDown, FX_BOOL bModifier, int &nSelEnd,int &nSelStart,\n\t\t\t\t\t\t\t\t\tFX_BOOL bShift, CPDF_FormField* pTarget, CFX_WideString& Value,\n\t\t\t\t\t\t\t\t\tFX_BOOL bWillCommit, FX_BOOL bFieldFull, FX_BOOL& bRc)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnField_Keystroke(nCommitKey, strChange, strChangeEx, bKeyDown,\n\t\tbModifier, nSelEnd, nSelStart, bShift, pTarget, Value, bWillCommit, bFieldFull, bRc);\n}\n\nvoid CJS_Context::OnField_Validate(CFX_WideString& strChange,const CFX_WideString& strChangeEx,\n\t\t\t\t\t\t\t\t   FX_BOOL bKeyDown, FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget,\n\t\t\t\t\t\t\t\t   CFX_WideString& Value, FX_BOOL& bRc)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnField_Validate(strChange, strChangeEx, bKeyDown, bModifier, bShift, pTarget, Value, bRc);\n}\n\nvoid CJS_Context::OnScreen_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnScreen_Focus(bModifier, bShift, pScreen);\n}\n\nvoid CJS_Context::OnScreen_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnScreen_Blur(bModifier, bShift, pScreen);\n}\n\nvoid CJS_Context::OnScreen_Open(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnScreen_Open(bModifier, bShift, pScreen);\n}\n\nvoid CJS_Context::OnScreen_Close(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnScreen_Close(bModifier, bShift, pScreen);\n}\n\nvoid CJS_Context::OnScreen_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnScreen_MouseDown(bModifier, bShift, pScreen);\n}\n\nvoid CJS_Context::OnScreen_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnScreen_MouseUp(bModifier, bShift, pScreen);\n}\n\nvoid CJS_Context::OnScreen_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnScreen_MouseEnter(bModifier, bShift, pScreen);\n}\n\nvoid CJS_Context::OnScreen_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnScreen_MouseExit(bModifier, bShift, pScreen);\n}\n\nvoid CJS_Context::OnScreen_InView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnScreen_InView(bModifier, bShift, pScreen);\n}\n\nvoid CJS_Context::OnScreen_OutView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnScreen_OutView(bModifier, bShift, pScreen);\n}\n\nvoid CJS_Context::OnBookmark_MouseUp(CPDF_Bookmark* pBookMark)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnBookmark_MouseUp(pBookMark);\n}\n\nvoid CJS_Context::OnLink_MouseUp(CPDFSDK_Document* pTarget)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnLink_MouseUp(pTarget);\n}\n\nvoid CJS_Context::OnConsole_Exec()\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnConsole_Exec();\n}\n\nvoid CJS_Context::OnExternal_Exec()\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnExternal_Exec();\n}\n\nvoid CJS_Context::OnBatchExec(CPDFSDK_Document* pTarget)\n{\n\tASSERT(m_pEventHandler != NULL);\t\n\tm_pEventHandler->OnBatchExec(pTarget);\n}\n\nvoid CJS_Context::OnMenu_Exec(CPDFSDK_Document* pTarget,const CFX_WideString& strTargetName)\n{\n\tASSERT(m_pEventHandler != NULL);\n\tm_pEventHandler->OnMenu_Exec(pTarget, strTargetName);\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/javascript/JS_EventHandler.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/javascript/JavaScript.h\"\n#include \"../../include/javascript/IJavaScript.h\"\n#include \"../../include/javascript/JS_EventHandler.h\"\n//#include \"../../include/javascript/JS_ResMgr.h\"\n#include \"../../include/javascript/JS_Context.h\"\n#include \"../../include/javascript/JS_Runtime.h\"\n#include \"../../include/javascript/JS_Define.h\"\n#include \"../../include/javascript/JS_Object.h\"\n#include \"../../include/javascript/JS_Value.h\"\n#include \"../../include/javascript/Document.h\"\n#include \"../../include/javascript/Field.h\"\n\n/* ---------------------------- CJS_EventHandler ---------------------------- */\n\nCJS_EventHandler::CJS_EventHandler(CJS_Context * pContext)\t :\n\tm_pJSContext(pContext),\n\tm_eEventType(JET_UNKNOWN),\n\tm_bValid(FALSE),\n\tm_pWideStrChange(NULL),\n\tm_nCommitKey(-1),\n\tm_bKeyDown(FALSE),\n\tm_bModifier(FALSE),\n\tm_bShift(FALSE),\n\tm_pISelEnd(NULL),\n\tm_nSelEndDu(0),\n\tm_pISelStart(NULL),\n\tm_nSelStartDu(0),\n\tm_bWillCommit(FALSE),\n\tm_pValue(NULL),\n\tm_bFieldFull(FALSE),\n\tm_pbRc(NULL),\n\tm_bRcDu(FALSE),\n\tm_pSourceDoc(NULL),\n\tm_pTargetBookMark(NULL),\n\tm_pTargetDoc(NULL),\n\tm_pTargetAnnot(NULL)\n{\n}\n\nCJS_EventHandler::~CJS_EventHandler()\n{\n}\n\nvoid CJS_EventHandler::OnApp_Init()\n{\n\tInitial(JET_APP_INIT);\n}\n\nvoid CJS_EventHandler::OnDoc_Open(CPDFSDK_Document* pDoc, const CFX_WideString& strTargetName)\n{\n\tInitial(JET_DOC_OPEN);\n\n\tm_pTargetDoc = pDoc;\n\tm_strTargetName = strTargetName;\t\n}\n\nvoid CJS_EventHandler::OnDoc_WillPrint(CPDFSDK_Document* pDoc)\n{\n\tInitial(JET_DOC_WILLPRINT);\n\n\tm_pTargetDoc = pDoc;\t\n}\n\nvoid CJS_EventHandler::OnDoc_DidPrint(CPDFSDK_Document* pDoc)\n{\n\tInitial(JET_DOC_DIDPRINT);\n\t\n\tm_pTargetDoc = pDoc;\t\t\n}\n\nvoid CJS_EventHandler::OnDoc_WillSave(CPDFSDK_Document* pDoc)\n{\n\tInitial(JET_DOC_WILLSAVE);\n\tm_pTargetDoc = pDoc;\t\t\n}\n\nvoid CJS_EventHandler::OnDoc_DidSave(CPDFSDK_Document* pDoc)\n{\n\tInitial(JET_DOC_DIDSAVE);\t\n\t\n\tm_pTargetDoc = pDoc;\t\n}\n\nvoid CJS_EventHandler::OnDoc_WillClose(CPDFSDK_Document* pDoc)\n{\n\tInitial(JET_DOC_WILLCLOSE);\n\n\tm_pTargetDoc = pDoc;\t\n}\n\nvoid CJS_EventHandler::OnPage_Open(CPDFSDK_Document* pDoc)\n{\n\tInitial(JET_PAGE_OPEN);\n\n\tm_pTargetDoc = pDoc;\n}\n\nvoid CJS_EventHandler::OnPage_Close(CPDFSDK_Document* pDoc)\n{\n\tInitial(JET_PAGE_CLOSE);\n\t\n\tm_pTargetDoc = pDoc;\n}\n\nvoid CJS_EventHandler::OnPage_InView(CPDFSDK_Document* pDoc)\n{\n\tInitial(JET_PAGE_INVIEW);\n\t\n\tm_pTargetDoc = pDoc;\n}\n\nvoid CJS_EventHandler::OnPage_OutView(CPDFSDK_Document* pDoc)\n{\n\tInitial(JET_PAGE_OUTVIEW);\n\t\n\tm_pTargetDoc = pDoc;\n}\n\nvoid CJS_EventHandler::OnField_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget)\n{\n\tInitial(JET_FIELD_MOUSEENTER);\n\n\tm_bModifier = bModifier;\n\tm_bShift = bShift;\n\n\tASSERT(pTarget != NULL);\n\tm_strTargetName = pTarget->GetFullName();\n}\n\nvoid CJS_EventHandler::OnField_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget)\n{\n\tInitial(JET_FIELD_MOUSEEXIT);\n\n\tm_bModifier = bModifier;\n\tm_bShift = bShift;\n\tASSERT(pTarget != NULL);\n\tm_strTargetName = pTarget->GetFullName();\t\n}\n\nvoid CJS_EventHandler::OnField_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget)\n{\n\tInitial(JET_FIELD_MOUSEDOWN);\n\tm_eEventType = JET_FIELD_MOUSEDOWN;\n\t\n\tm_bModifier = bModifier;\n\tm_bShift = bShift;\t\n\tASSERT(pTarget != NULL);\n\tm_strTargetName = pTarget->GetFullName();\n}\n\nvoid CJS_EventHandler::OnField_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget)\n{\n\tInitial(JET_FIELD_MOUSEUP);\n\n\tm_bModifier = bModifier;\n\tm_bShift = bShift;\n\tASSERT(pTarget != NULL);\n\tm_strTargetName = pTarget->GetFullName();\n}\n\nvoid CJS_EventHandler::OnField_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, \n\t\t\t\t\t\t\t\t\t const CFX_WideString& Value)\n{\n\tInitial(JET_FIELD_FOCUS);\n\n\tm_bModifier = bModifier;\n\tm_bShift = bShift;  \n\tASSERT(pTarget != NULL);\n\tm_strTargetName = pTarget->GetFullName();\n\tm_pValue = (CFX_WideString*)&Value;\n}\n\nvoid CJS_EventHandler::OnField_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget,\n\t\t\t\t\t\t\t\t\tconst CFX_WideString& Value)\n{\n\tInitial(JET_FIELD_BLUR);\n\n\tm_bModifier = bModifier;\n\tm_bShift = bShift;\n\tASSERT(pTarget != NULL);\n\tm_strTargetName = pTarget->GetFullName();\n\tm_pValue = (CFX_WideString*)&Value;\t\n}\n\nvoid CJS_EventHandler::OnField_Keystroke(int nCommitKey, CFX_WideString &strChange,\n\t\t\t\t\t\t\t\t\t\t const CFX_WideString& strChangeEx, FX_BOOL KeyDown,\n\t\t\t\t\t\t\t\t\t\t FX_BOOL bModifier, int& nSelEnd, int& nSelStart,\n\t\t\t\t\t\t\t\t\t\t FX_BOOL bShift, CPDF_FormField* pTarget,\n\t\t\t\t\t\t\t\t\t\t CFX_WideString& Value, FX_BOOL bWillCommit,\n\t\t\t\t\t\t\t\t\t\t  FX_BOOL bFieldFull, FX_BOOL& bRc)\n{\n\tInitial(JET_FIELD_KEYSTROKE);\n\t\n\tm_nCommitKey = nCommitKey;\n\tm_pWideStrChange = &strChange;\n\tm_WideStrChangeEx = strChangeEx;\n\tm_bKeyDown = KeyDown;\n\tm_bModifier = bModifier;\n\tm_pISelEnd = &nSelEnd;\n\tm_pISelStart = &nSelStart;\n\tm_bShift = bShift;\t\n\tASSERT(pTarget != NULL);\n\tm_strTargetName = pTarget->GetFullName();\n\tm_pValue = &Value;\n\tm_bWillCommit = bWillCommit;\t\n\tm_pbRc = &bRc;\n\tm_bFieldFull = bFieldFull;\n}\n\nvoid CJS_EventHandler::OnField_Validate(CFX_WideString& strChange, const CFX_WideString& strChangeEx,\n\t\t\t\t\t\t\t\t\t\tFX_BOOL bKeyDown, FX_BOOL bModifier, FX_BOOL bShift,\n\t\t\t\t\t\t\t\t\t\tCPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL& bRc)\n{\n\tInitial(JET_FIELD_VALIDATE);\n\t\n\tm_pWideStrChange = &strChange;\n\tm_WideStrChangeEx = strChangeEx;\t\n\tm_bKeyDown = bKeyDown;\n\tm_bModifier = bModifier;\n\tm_bShift = bShift;\n\tASSERT(pTarget != NULL);\n\tm_strTargetName = pTarget->GetFullName();\n\tm_pValue = &Value;\t\n\tm_pbRc = &bRc;\t\n}\n\nvoid CJS_EventHandler::OnField_Calculate(CPDF_FormField* pSource, CPDF_FormField* pTarget, \n\t\t\t\t\t\t\t\t\t\t CFX_WideString& Value, FX_BOOL& bRc)\n{\n\tInitial(JET_FIELD_CALCULATE);\n\n\tif (pSource)\n\t\tm_strSourceName = pSource->GetFullName();\n\tASSERT(pTarget != NULL);\n\tm_strTargetName = pTarget->GetFullName();\n    m_pValue = &Value;\n\tm_pbRc = &bRc;\n}\n\nvoid CJS_EventHandler::OnField_Format(int nCommitKey, CPDF_FormField* pTarget,\n\t\t\t\t\t\t\t\t\t  CFX_WideString& Value, FX_BOOL bWillCommit)\n{\n\tInitial(JET_FIELD_FORMAT);\n\t\n\tm_nCommitKey = nCommitKey;\t  \n\tASSERT(pTarget != NULL);\n\tm_strTargetName = pTarget->GetFullName();\n\tm_pValue = &Value;\n\tm_bWillCommit = bWillCommit;\n}\n\nvoid CJS_EventHandler::OnScreen_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)\n{\n\tInitial(JET_SCREEN_FOCUS);\n\n\tm_bModifier = bModifier;\n\tm_bShift = bShift;\n\tm_pTargetAnnot = pScreen;\n}\n\nvoid CJS_EventHandler::OnScreen_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)\n{\n\tInitial(JET_SCREEN_BLUR);\n\n\tm_bModifier = bModifier;\n\tm_bShift = bShift;\n\tm_pTargetAnnot = pScreen;\n}\n\nvoid CJS_EventHandler::OnScreen_Open(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)\n{\n\tInitial(JET_SCREEN_OPEN);\n\n\tm_bModifier = bModifier;\n\tm_bShift = bShift;\n\tm_pTargetAnnot = pScreen;\n}\n\nvoid CJS_EventHandler::OnScreen_Close(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)\n{\n\tInitial(JET_SCREEN_CLOSE);\n\n\tm_bModifier = bModifier;\n\tm_bShift = bShift;\n\tm_pTargetAnnot = pScreen;\n}\n\nvoid CJS_EventHandler::OnScreen_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)\n{\n\tInitial(JET_SCREEN_MOUSEDOWN);\n\n\tm_bModifier = bModifier;\n\tm_bShift = bShift;\n\tm_pTargetAnnot = pScreen;\n}\n\nvoid CJS_EventHandler::OnScreen_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)\n{\n\tInitial(JET_SCREEN_MOUSEUP);\n\n\tm_bModifier = bModifier;\n\tm_bShift = bShift;\n\tm_pTargetAnnot = pScreen;\n}\n\nvoid CJS_EventHandler::OnScreen_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)\n{\n\tInitial(JET_SCREEN_MOUSEENTER);\n\n\tm_bModifier = bModifier;\n\tm_bShift = bShift;\n\tm_pTargetAnnot = pScreen;\n}\n\nvoid CJS_EventHandler::OnScreen_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)\n{\n\tInitial(JET_SCREEN_MOUSEEXIT);\n\n\tm_bModifier = bModifier;\n\tm_bShift = bShift;\n\tm_pTargetAnnot = pScreen;\n}\n\nvoid CJS_EventHandler::OnScreen_InView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)\n{\n\tInitial(JET_SCREEN_INVIEW);\n\n\tm_bModifier = bModifier;\n\tm_bShift = bShift;\n\tm_pTargetAnnot = pScreen;\n}\n\nvoid CJS_EventHandler::OnScreen_OutView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)\n{\n\tInitial(JET_SCREEN_OUTVIEW);\n\n\tm_bModifier = bModifier;\n\tm_bShift = bShift;\n\tm_pTargetAnnot = pScreen;\n}\n\nvoid CJS_EventHandler::OnLink_MouseUp(CPDFSDK_Document* pTarget)\n{\n\tInitial(JET_LINK_MOUSEUP);\n\t\n\tm_pTargetDoc = pTarget;\t\n}\n\nvoid CJS_EventHandler::OnBookmark_MouseUp(CPDF_Bookmark* pBookMark)\n{\n\tInitial(JET_BOOKMARK_MOUSEUP);\n\n\tm_pTargetBookMark = pBookMark;\t\n}\n\nvoid CJS_EventHandler::OnMenu_Exec(CPDFSDK_Document* pTarget, const CFX_WideString& strTargetName)\n{\n\tInitial(JET_MENU_EXEC);\n\n\tm_pTargetDoc = pTarget;\n\tm_strTargetName = strTargetName;\n}\n\nvoid CJS_EventHandler::OnExternal_Exec()\n{\n\tInitial(JET_EXTERNAL_EXEC);\n}\n\nvoid CJS_EventHandler::OnBatchExec(CPDFSDK_Document* pTarget)\n{\n\tInitial(JET_BATCH_EXEC);\n\n\tm_pTargetDoc = pTarget;\t\n}\n\nvoid CJS_EventHandler::OnConsole_Exec()\n{\n\tInitial(JET_CONSOLE_EXEC);\n}\n\n\nvoid CJS_EventHandler::Initial(JS_EVENT_T type)\n{\n\tm_eEventType = type;\n\n\tm_strTargetName = L\"\";\n\tm_strSourceName = L\"\";\n\tm_pWideStrChange = NULL;\n\tm_WideStrChangeDu = L\"\";\n\tm_WideStrChangeEx = L\"\";\n\tm_nCommitKey = -1;\n\tm_bKeyDown = FALSE;\n\tm_bModifier = FALSE;\n\tm_bShift = FALSE;\n\tm_pISelEnd = NULL;\n\tm_nSelEndDu = 0;\n\tm_pISelStart = NULL;\n\tm_nSelStartDu = 0;\n\tm_bWillCommit = FALSE;\n\tm_pValue = NULL;\n\tm_bFieldFull = FALSE;\n\tm_pbRc = NULL;\n\tm_bRcDu = FALSE;\n\n\tm_pSourceDoc = NULL;\n\tm_pTargetBookMark = NULL;\n\tm_pTargetDoc = NULL;\n\tm_pTargetAnnot = NULL;\n\n\tm_bValid = TRUE;\n}\n\nvoid CJS_EventHandler::Destroy()\n{\n\tm_bValid = FALSE;\n}\n\nFX_BOOL CJS_EventHandler::IsValid()\n{\n\treturn m_bValid;\n}\n\nCFX_WideString & CJS_EventHandler::Change()\n{\n\tif (m_pWideStrChange != NULL)\n\t\treturn *m_pWideStrChange;\n\telse\n\t{\n\t\treturn m_WideStrChangeDu;\n\t}\n}\n\nCFX_WideString CJS_EventHandler::ChangeEx()\n{\n\treturn m_WideStrChangeEx;\n}\n\nint CJS_EventHandler::CommitKey()\n{\n\treturn m_nCommitKey;\n}\n\nFX_BOOL CJS_EventHandler::FieldFull()\n{\n\treturn m_bFieldFull;\n}\n\nFX_BOOL CJS_EventHandler::KeyDown()\n{\n\treturn m_bKeyDown;\n}\n\nFX_BOOL CJS_EventHandler::Modifier()\n{\n\treturn m_bModifier;\n}\n\nFX_LPCWSTR CJS_EventHandler::Name()\n{\n\tswitch (m_eEventType)\n\t{\n\tcase JET_APP_INIT:\t\t\treturn (FX_LPCWSTR)L\"Init\";\n\tcase JET_BATCH_EXEC:\t\treturn (FX_LPCWSTR)L\"Exec\";\n\tcase JET_BOOKMARK_MOUSEUP:\treturn (FX_LPCWSTR)L\"Mouse Up\";\n\tcase JET_CONSOLE_EXEC:\t\treturn (FX_LPCWSTR)L\"Exec\";\n\tcase JET_DOC_DIDPRINT:\t\treturn (FX_LPCWSTR)L\"DidPrint\";\n\tcase JET_DOC_DIDSAVE:\t\treturn (FX_LPCWSTR)L\"DidSave\";\n\tcase JET_DOC_OPEN:\t\t\treturn (FX_LPCWSTR)L\"Open\";\n\tcase JET_DOC_WILLCLOSE:\t\treturn (FX_LPCWSTR)L\"WillClose\";\n\tcase JET_DOC_WILLPRINT:\t\treturn (FX_LPCWSTR)L\"WillPrint\";\n\tcase JET_DOC_WILLSAVE:\t\treturn (FX_LPCWSTR)L\"WillSave\";\n\tcase JET_EXTERNAL_EXEC:\t\treturn (FX_LPCWSTR)L\"Exec\";\n\tcase JET_FIELD_FOCUS:\t\t\n\tcase JET_SCREEN_FOCUS:\t\treturn (FX_LPCWSTR)L\"Focus\";\n\tcase JET_FIELD_BLUR:\t\t\n\tcase JET_SCREEN_BLUR:\t\treturn (FX_LPCWSTR)L\"Blur\";\n\tcase JET_FIELD_MOUSEDOWN:\n\tcase JET_SCREEN_MOUSEDOWN:\treturn (FX_LPCWSTR)L\"Mouse Down\";\n\tcase JET_FIELD_MOUSEUP:\t\t\n\tcase JET_SCREEN_MOUSEUP:\treturn (FX_LPCWSTR)L\"Mouse Up\";\n\tcase JET_FIELD_MOUSEENTER:\n\tcase JET_SCREEN_MOUSEENTER:\treturn (FX_LPCWSTR)L\"Mouse Enter\";\n\tcase JET_FIELD_MOUSEEXIT:\n\tcase JET_SCREEN_MOUSEEXIT:\treturn (FX_LPCWSTR)L\"Mouse Exit\";\n\tcase JET_FIELD_CALCULATE:\treturn (FX_LPCWSTR)L\"Calculate\";\n\tcase JET_FIELD_FORMAT:\t\treturn (FX_LPCWSTR)L\"Format\";\n\tcase JET_FIELD_KEYSTROKE:\treturn (FX_LPCWSTR)L\"Keystroke\";\n\tcase JET_FIELD_VALIDATE:\treturn (FX_LPCWSTR)L\"Validate\";\n\tcase JET_LINK_MOUSEUP:\t\treturn (FX_LPCWSTR)L\"Mouse Up\";\n\tcase JET_MENU_EXEC:\t\t\treturn (FX_LPCWSTR)L\"Exec\";\n\tcase JET_PAGE_OPEN:\t\t\n\tcase JET_SCREEN_OPEN:\t\treturn (FX_LPCWSTR)L\"Open\";\n\tcase JET_PAGE_CLOSE:\n\tcase JET_SCREEN_CLOSE:\t\treturn (FX_LPCWSTR)L\"Close\";\n\tcase JET_SCREEN_INVIEW:\t\n\tcase JET_PAGE_INVIEW:\t\treturn (FX_LPCWSTR)L\"InView\";\n\tcase JET_PAGE_OUTVIEW:\n\tcase JET_SCREEN_OUTVIEW:\treturn (FX_LPCWSTR)L\"OutView\";\n\tdefault:\n\t\treturn (FX_LPCWSTR)L\"\";\n\t}\n\n\treturn (FX_LPCWSTR)L\"\";\n}\n\nFX_LPCWSTR CJS_EventHandler::Type()\n{\n\tswitch (m_eEventType)\n\t{\n\tcase JET_APP_INIT:\t\t\treturn (FX_LPCWSTR)L\"App\";\n\tcase JET_BATCH_EXEC:\t\treturn (FX_LPCWSTR)L\"Batch\";\n\tcase JET_BOOKMARK_MOUSEUP:\treturn (FX_LPCWSTR)L\"BookMark\";\t\n\tcase JET_CONSOLE_EXEC:\t\treturn (FX_LPCWSTR)L\"Console\";\n\tcase JET_DOC_DIDPRINT:\n\tcase JET_DOC_DIDSAVE:\n\tcase JET_DOC_OPEN:\n\tcase JET_DOC_WILLCLOSE:\n\tcase JET_DOC_WILLPRINT:\n\tcase JET_DOC_WILLSAVE:\t\treturn (FX_LPCWSTR)L\"Doc\";\n\tcase JET_EXTERNAL_EXEC:\t\treturn (FX_LPCWSTR)L\"External\";\n\tcase JET_FIELD_BLUR:\n\tcase JET_FIELD_FOCUS:\n\tcase JET_FIELD_MOUSEDOWN:\n\tcase JET_FIELD_MOUSEENTER:\n\tcase JET_FIELD_MOUSEEXIT:\n\tcase JET_FIELD_MOUSEUP:\n\tcase JET_FIELD_CALCULATE:\n\tcase JET_FIELD_FORMAT:\n\tcase JET_FIELD_KEYSTROKE:\n\tcase JET_FIELD_VALIDATE:\treturn (FX_LPCWSTR)L\"Field\";\n\tcase JET_SCREEN_FOCUS:\n\tcase JET_SCREEN_BLUR:\n\tcase JET_SCREEN_OPEN:\n\tcase JET_SCREEN_CLOSE:\n\tcase JET_SCREEN_MOUSEDOWN:\n\tcase JET_SCREEN_MOUSEUP:\n\tcase JET_SCREEN_MOUSEENTER:\n\tcase JET_SCREEN_MOUSEEXIT:\n\tcase JET_SCREEN_INVIEW:\n\tcase JET_SCREEN_OUTVIEW:\treturn (FX_LPCWSTR)L\"Screen\";\n\tcase JET_LINK_MOUSEUP:\t\treturn (FX_LPCWSTR)L\"Link\";\t\n\tcase JET_MENU_EXEC:\t\t\treturn (FX_LPCWSTR)L\"Menu\";\n\tcase JET_PAGE_OPEN:\n\tcase JET_PAGE_CLOSE:\n\tcase JET_PAGE_INVIEW:\n\tcase JET_PAGE_OUTVIEW:return (FX_LPCWSTR)L\"Page\";\n\tdefault:\n\t\treturn (FX_LPCWSTR)L\"\";\n\t}\n\n\treturn (FX_LPCWSTR)L\"\";\n}\n\nFX_BOOL& CJS_EventHandler::Rc()\n{\n\tif (m_pbRc != NULL)\n\t\treturn *m_pbRc;\n\telse\n\t{\t    \n\t\treturn m_bRcDu;\n\t}\n}\n\nint & CJS_EventHandler::SelEnd()\n{\n\tif (m_pISelEnd != NULL)\n\t{\n\t\treturn *m_pISelEnd;\n\t}\n\telse\n\t{\n\t\treturn m_nSelEndDu;\n\t}\n}\n\nint & CJS_EventHandler::SelStart()\n{\n\tif (m_pISelStart != NULL)\n\t\treturn * m_pISelStart;\n\telse\n\t{\n\t\treturn m_nSelStartDu;\n\t}\n}\n\nFX_BOOL CJS_EventHandler::Shift()\n{\n\treturn m_bShift;\n}\n\nField* CJS_EventHandler::Source()\n{\n\tASSERT(m_pJSContext != NULL);\n\n\tCJS_Runtime* pRuntime = m_pJSContext->GetJSRuntime();\n\n\tJSFXObject  pDocObj = JS_NewFxDynamicObj(*pRuntime, m_pJSContext, JS_GetObjDefnID(*pRuntime, L\"Document\"));\n\tASSERT(pDocObj.IsEmpty() == FALSE);\n\tJSFXObject  pFieldObj = JS_NewFxDynamicObj(*pRuntime, m_pJSContext, JS_GetObjDefnID(*pRuntime, L\"Field\"));\n\tASSERT(pFieldObj.IsEmpty() == FALSE);\n\n\tCJS_Document* pJSDocument = (CJS_Document*)JS_GetPrivate(pDocObj);\n\tASSERT(pJSDocument != NULL);\n\tDocument* pDocument = (Document*)pJSDocument->GetEmbedObject();\n\tASSERT(pDocument != NULL);\n \tif (m_pTargetDoc != NULL)\n \t\tpDocument->AttachDoc(m_pTargetDoc);\n \telse\n \t\tpDocument->AttachDoc(m_pJSContext->GetReaderDocument());\n\t\n\t//if (m_pSourceField == NULL)\n\t//\treturn NULL;\n\t//CRAO_Widget *pWidget = IBCL_Widget::GetWidget(m_pSourceField);\n\t//CPDF_FormField* pFormField = pWidget->GetFormField();\n\t//ASSERT(pFormField);\n\t//CFX_WideString csFieldName = pFormField->GetFullName();\n\tCJS_Field * pJSField = (CJS_Field*)JS_GetPrivate(pFieldObj);\n\tASSERT(pJSField != NULL);\n\tField * pField = (Field *)pJSField->GetEmbedObject(); \n\tASSERT(pField != NULL);\n\tpField->AttachField(pDocument, m_strSourceName);\n\treturn pField;\t\n}\n\nField* CJS_EventHandler::Target_Field()\n{\n\tASSERT(m_pJSContext != NULL);\n\n\tCJS_Runtime* pRuntime = m_pJSContext->GetJSRuntime();\n\n\tJSFXObject pDocObj = JS_NewFxDynamicObj(*pRuntime, m_pJSContext, JS_GetObjDefnID(*pRuntime, L\"Document\"));\n\tASSERT(pDocObj.IsEmpty() == FALSE);\n\tJSFXObject pFieldObj = JS_NewFxDynamicObj(*pRuntime, m_pJSContext, JS_GetObjDefnID(*pRuntime, L\"Field\"));\n\tASSERT(pFieldObj.IsEmpty() == FALSE);\n\n\tCJS_Document* pJSDocument = (CJS_Document*)JS_GetPrivate(pDocObj);\n\tASSERT(pJSDocument != NULL);\n\tDocument* pDocument = (Document*)pJSDocument->GetEmbedObject();\n \tASSERT(pDocument != NULL);\n \tif (m_pTargetDoc != NULL)\n \t\tpDocument->AttachDoc(m_pTargetDoc);\n \telse\n \t\tpDocument->AttachDoc(m_pJSContext->GetReaderDocument());\n\t\n\tCJS_Field* pJSField = (CJS_Field*)JS_GetPrivate(pFieldObj);\n\tASSERT(pJSField != NULL);\n\n\tField* pField = (Field *)pJSField->GetEmbedObject(); \n\tASSERT(pField != NULL);\n\n\tpField->AttachField(pDocument, m_strTargetName);\n\treturn pField;\t\n}\n\nCFX_WideString& CJS_EventHandler::Value()\n{\n\treturn *m_pValue;\n}\n\nFX_BOOL CJS_EventHandler::WillCommit()\n{\n\treturn m_bWillCommit;\n}\n\nCFX_WideString CJS_EventHandler::TargetName()\n{\n\treturn m_strTargetName;\n}\n\n\n"
  },
  {
    "path": "fpdfsdk/src/javascript/JS_GlobalData.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/javascript/JavaScript.h\"\n#include \"../../include/javascript/IJavaScript.h\"\n#include \"../../include/javascript/JS_GlobalData.h\"\n\n#define JS_MAXGLOBALDATA\t\t\t(1024 * 4 - 8)\n\n/* --------------------- CJS_GlobalVariableArray --------------------- */\n\nCJS_GlobalVariableArray::CJS_GlobalVariableArray()\n{\n}\n\nCJS_GlobalVariableArray::~CJS_GlobalVariableArray()\n{\n\tEmpty();\n}\n\nvoid CJS_GlobalVariableArray::Copy(const CJS_GlobalVariableArray& array)\n{\n\tEmpty();\n\tfor (int i=0,sz=array.Count(); i<sz; i++)\n\t{\n\t\tCJS_KeyValue* pOldObjData = array.GetAt(i);\n\t\tASSERT(pOldObjData != NULL);\n\n\t\tswitch (pOldObjData->nType)\n\t\t{\n\t\tcase JS_GLOBALDATA_TYPE_NUMBER:\n\t\t\t{\n\t\t\t\tCJS_KeyValue* pNewObjData = new CJS_KeyValue;\n\t\t\t\tpNewObjData->sKey = pOldObjData->sKey;\n\t\t\t\tpNewObjData->nType = pOldObjData->nType;\n\t\t\t\tpNewObjData->dData = pOldObjData->dData;\n\t\t\t\tAdd(pNewObjData);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase JS_GLOBALDATA_TYPE_BOOLEAN:\n\t\t\t{\n\t\t\t\tCJS_KeyValue* pNewObjData = new CJS_KeyValue;\n\t\t\t\tpNewObjData->sKey = pOldObjData->sKey;\n\t\t\t\tpNewObjData->nType = pOldObjData->nType;\n\t\t\t\tpNewObjData->bData = pOldObjData->bData;\n\t\t\t\tAdd(pNewObjData);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase JS_GLOBALDATA_TYPE_STRING:\n\t\t\t{\n\t\t\t\tCJS_KeyValue* pNewObjData = new CJS_KeyValue;\n\t\t\t\tpNewObjData->sKey = pOldObjData->sKey;\n\t\t\t\tpNewObjData->nType = pOldObjData->nType;\n\t\t\t\tpNewObjData->sData = pOldObjData->sData;\n\t\t\t\tAdd(pNewObjData);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase JS_GLOBALDATA_TYPE_OBJECT:\n\t\t\t{\n\t\t\t\tCJS_KeyValue* pNewObjData = new CJS_KeyValue;\n\t\t\t\tpNewObjData->sKey = pOldObjData->sKey;\n\t\t\t\tpNewObjData->nType = pOldObjData->nType;\n\t\t\t\tpNewObjData->objData.Copy(pOldObjData->objData);\n\t\t\t\tAdd(pNewObjData);\n\t\t\t}\n\t\tcase JS_GLOBALDATA_TYPE_NULL:\n\t\t\t{\n\t\t\t\tCJS_KeyValue* pNewObjData = new CJS_KeyValue;\n\t\t\t\tpNewObjData->sKey = pOldObjData->sKey;\n\t\t\t\tpNewObjData->nType = pOldObjData->nType;\n\t\t\t\tAdd(pNewObjData);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid CJS_GlobalVariableArray::Add(CJS_KeyValue* p)\n{\n\tarray.Add(p);\n}\n\nint CJS_GlobalVariableArray::Count() const\n{\n\treturn array.GetSize();\n}\n\nCJS_KeyValue* CJS_GlobalVariableArray::GetAt(int index) const\n{\n\treturn array.GetAt(index);\n}\n\nvoid CJS_GlobalVariableArray::Empty()\n{\n\tfor (int i=0,sz=array.GetSize(); i<sz; i++)\n\t\tdelete array.GetAt(i);\n\tarray.RemoveAll();\n}\n\n/* -------------------------- CJS_GlobalData -------------------------- */\n\n#define READER_JS_GLOBALDATA_FILENAME\t\t\t\tL\"Reader_JsGlobal.Data\"\n#define PHANTOM_JS_GLOBALDATA_FILENAME\t\t\t\tL\"Phantom_JsGlobal.Data\"\n#define SDK_JS_GLOBALDATA_FILENAME\t\t\t\t\tL\"SDK_JsGlobal.Data\"\n\nstatic const FX_BYTE JS_RC4KEY[] = {0x19,0xa8,0xe8,0x01,0xf6,0xa8,0xb6,0x4d,0x82,0x04,\n\t\t\t\t\t\t\t0x45,0x6d,0xb4,0xcf,0xd7,0x77,0x67,0xf9,0x75,0x9f,\n\t\t\t\t\t\t\t0xf0,0xe0,0x1e,0x51,0xee,0x46,0xfd,0x0b,0xc9,0x93,\n\t\t\t\t\t\t\t0x25,0x55,0x4a,0xee,0xe0,0x16,0xd0,0xdf,0x8c,0xfa,\n\t\t\t\t\t\t\t0x2a,0xa9,0x49,0xfd,0x97,0x1c,0x0e,0x22,0x13,0x28,\n\t\t\t\t\t\t\t0x7c,0xaf,0xc4,0xfc,0x9c,0x12,0x65,0x8c,0x4e,0x5b,\n\t\t\t\t\t\t\t0x04,0x75,0x89,0xc9,0xb1,0xed,0x50,0xca,0x96,0x6f,\n\t\t\t\t\t\t\t0x1a,0x7a,0xfe,0x58,0x5d,0xec,0x19,0x4a,0xf6,0x35,\n\t\t\t\t\t\t\t0x6a,0x97,0x14,0x00,0x0e,0xd0,0x6b,0xbb,0xd5,0x75,\n\t\t\t\t\t\t\t0x55,0x8b,0x6e,0x6b,0x19,0xa0,0xf8,0x77,0xd5,0xa3\n\t\t\t\t\t\t\t};\n\nCJS_GlobalData::CJS_GlobalData(CPDFDoc_Environment* pApp) : m_pApp(pApp)\n{\n// \tIBaseAnnot* pBaseAnnot = IBaseAnnot::GetBaseAnnot(m_pApp);\n// \tASSERT(pBaseAnnot != NULL);\n// \n// \tm_sFilePath = pBaseAnnot->GetUserPath();\n\tm_sFilePath += SDK_JS_GLOBALDATA_FILENAME;\n\n\tLoadGlobalPersistentVariables();\n}\n\nCJS_GlobalData::~CJS_GlobalData()\n{\n\tSaveGlobalPersisitentVariables();\n\n\tfor (int i=0,sz=m_arrayGlobalData.GetSize(); i<sz; i++)\n\t\tdelete m_arrayGlobalData.GetAt(i);\n\n\tm_arrayGlobalData.RemoveAll();\n}\n\nint\tCJS_GlobalData::FindGlobalVariable(FX_LPCSTR propname)\n{\n\tASSERT(propname != NULL);\n\n\tint nRet = -1;\n\n\tfor (int i=0,sz=m_arrayGlobalData.GetSize(); i<sz; i++)\n\t{\n\t\tCJS_GlobalData_Element* pTemp = m_arrayGlobalData.GetAt(i);\n\t\tif (pTemp->data.sKey[0] == *propname && pTemp->data.sKey == propname)\n\t\t{\n\t\t\tnRet = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn nRet;\n}\n\nCJS_GlobalData_Element* CJS_GlobalData::GetGlobalVariable(FX_LPCSTR propname)\n{\n\tASSERT(propname != NULL);\n\n\tint\tnFind = FindGlobalVariable(propname);\n\n\tif (nFind >= 0)\n\t\treturn m_arrayGlobalData.GetAt(nFind);\n\telse\n\t\treturn NULL;\n}\n\nvoid CJS_GlobalData::SetGlobalVariableNumber(FX_LPCSTR propname, double dData)\n{\n\tASSERT(propname != NULL);\n\tCFX_ByteString sPropName = propname;\n\n\tsPropName.TrimLeft();\n\tsPropName.TrimRight();\n\n\tif (sPropName.GetLength() == 0) return;\n\n\tif (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))\n\t{\n\t\tpData->data.nType = JS_GLOBALDATA_TYPE_NUMBER;\n\t\tpData->data.dData = dData;\n\t}\n\telse\n\t{\n\t\tCJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;\n\t\tpNewData->data.sKey = sPropName;\n\t\tpNewData->data.nType = JS_GLOBALDATA_TYPE_NUMBER;\n\t\tpNewData->data.dData = dData;\n\n\t\tm_arrayGlobalData.Add(pNewData);\n\t}\n}\n\nvoid CJS_GlobalData::SetGlobalVariableBoolean(FX_LPCSTR propname, bool bData)\n{\n\tASSERT(propname != NULL);\n\tCFX_ByteString sPropName = propname;\n\n\tsPropName.TrimLeft();\n\tsPropName.TrimRight();\n\n\tif (sPropName.GetLength() == 0) return;\n\n\tif (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))\n\t{\n\t\tpData->data.nType = JS_GLOBALDATA_TYPE_BOOLEAN;\n\t\tpData->data.bData = bData;\n\t}\n\telse\n\t{\n\t\tCJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;\n\t\tpNewData->data.sKey = sPropName;\n\t\tpNewData->data.nType = JS_GLOBALDATA_TYPE_BOOLEAN;\n\t\tpNewData->data.bData = bData;\n\n\t\tm_arrayGlobalData.Add(pNewData);\n\t}\n}\n\nvoid CJS_GlobalData::SetGlobalVariableString(FX_LPCSTR propname, const CFX_ByteString& sData)\n{\n\tASSERT(propname != NULL);\n\tCFX_ByteString sPropName = propname;\n\n\tsPropName.TrimLeft();\n\tsPropName.TrimRight();\n\n\tif (sPropName.GetLength() == 0) return;\n\n\tif (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))\n\t{\n\t\tpData->data.nType = JS_GLOBALDATA_TYPE_STRING;\n\t\tpData->data.sData = sData;\n\t}\n\telse\n\t{\n\t\tCJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;\n\t\tpNewData->data.sKey = sPropName;\n\t\tpNewData->data.nType = JS_GLOBALDATA_TYPE_STRING;\n\t\tpNewData->data.sData = sData;\n\n\t\tm_arrayGlobalData.Add(pNewData);\n\t}\n}\n\nvoid CJS_GlobalData::SetGlobalVariableObject(FX_LPCSTR propname, const CJS_GlobalVariableArray& array)\n{\n\tASSERT(propname != NULL);\n\tCFX_ByteString sPropName = propname;\n\n\tsPropName.TrimLeft();\n\tsPropName.TrimRight();\n\n\tif (sPropName.GetLength() == 0) return;\n\n\tif (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))\n\t{\n\t\tpData->data.nType = JS_GLOBALDATA_TYPE_OBJECT;\n\t\tpData->data.objData.Copy(array);\n\t}\n\telse\n\t{\n\t\tCJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;\n\t\tpNewData->data.sKey = sPropName;\n\t\tpNewData->data.nType = JS_GLOBALDATA_TYPE_OBJECT;\n\t\tpNewData->data.objData.Copy(array);\n\t\t\n\t\tm_arrayGlobalData.Add(pNewData);\n\t}\n}\n\nvoid CJS_GlobalData::SetGlobalVariableNull(FX_LPCSTR propname)\n{\n\tASSERT(propname != NULL);\n\tCFX_ByteString sPropName = propname;\n\t\n\tsPropName.TrimLeft();\n\tsPropName.TrimRight();\n\t\n\tif (sPropName.GetLength() == 0) return;\n\t\n\tif (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))\n\t{\n\t\tpData->data.nType = JS_GLOBALDATA_TYPE_NULL;\n\t}\n\telse\n\t{\n\t\tCJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;\n\t\tpNewData->data.sKey = sPropName;\n\t\tpNewData->data.nType = JS_GLOBALDATA_TYPE_NULL;\n\t\t\n\t\tm_arrayGlobalData.Add(pNewData);\n\t}\n}\n\nFX_BOOL CJS_GlobalData::SetGlobalVariablePersistent(FX_LPCSTR propname, FX_BOOL bPersistent)\n{\n\tASSERT(propname != NULL);\n\tCFX_ByteString sPropName = propname;\n\n\tsPropName.TrimLeft();\n\tsPropName.TrimRight();\n\n\tif (sPropName.GetLength() == 0) return FALSE;\n\n\tif (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))\n\t{\n\t\tpData->bPersistent = bPersistent;\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL CJS_GlobalData::DeleteGlobalVariable(FX_LPCSTR propname)\n{\n\tASSERT(propname != NULL);\n\tCFX_ByteString sPropName = propname;\n\n\tsPropName.TrimLeft();\n\tsPropName.TrimRight();\n\n\tif (sPropName.GetLength() == 0) return FALSE;\n\n\tint\tnFind = FindGlobalVariable(sPropName);\n\n\tif (nFind >= 0)\n\t{\n\t\tdelete m_arrayGlobalData.GetAt(nFind);\n\t\tm_arrayGlobalData.RemoveAt(nFind);\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\nFX_INT32 CJS_GlobalData::GetSize() const\n{\n\treturn m_arrayGlobalData.GetSize();\n}\n\nCJS_GlobalData_Element* CJS_GlobalData::GetAt(int index) const\n{\n\treturn m_arrayGlobalData.GetAt(index);\n}\n\nvoid CJS_GlobalData::LoadGlobalPersistentVariables()\n{\n\tFX_LPBYTE pBuffer = NULL;\n\tFX_INT32 nLength = 0;\n\n\tLoadFileBuffer(m_sFilePath, pBuffer, nLength);\n\n\tCRYPT_ArcFourCryptBlock(pBuffer, nLength, JS_RC4KEY, sizeof(JS_RC4KEY));\n\n\tif (pBuffer)\n\t{\n\t\tFX_LPBYTE p = pBuffer;\n\t\tFX_WORD wType = *((FX_WORD*)p);\n\t\tp += sizeof(FX_WORD);\n\n\t\t//FX_WORD wTemp = (FX_WORD)(('X' << 8) | 'F');\n\n\t\tif (wType == (FX_WORD)(('X' << 8) | 'F'))\n\t\t{\n\t\t\tFX_WORD wVersion = *((FX_WORD*)p);\n\t\t\tp += sizeof(FX_WORD);\n\n\t\t\tASSERT(wVersion <= 2);\n\n\t\t\tFX_DWORD dwCount = *((FX_DWORD*)p);\n\t\t\tp += sizeof(FX_DWORD);\n\n\t\t\tFX_DWORD dwSize = *((FX_DWORD*)p);\n\t\t\tp += sizeof(FX_DWORD);\n\n\t\t\tif (dwSize == nLength - sizeof(FX_WORD) * 2 - sizeof(FX_DWORD)* 2)\n\t\t\t{\n\t\t\t\tfor (FX_INT32 i=0,sz=dwCount; i<sz; i++)\n\t\t\t\t{\n\t\t\t\t\tif (p > pBuffer + nLength)\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tFX_DWORD dwNameLen = *((FX_DWORD*)p);\n\t\t\t\t\tp += sizeof(FX_DWORD);\n\n\t\t\t\t\tif (p + dwNameLen > pBuffer + nLength)\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tCFX_ByteString sEntry = CFX_ByteString(p, dwNameLen);\n\t\t\t\t\tp += sizeof(char) * dwNameLen;\n\n\t\t\t\t\tFX_WORD wDataType = *((FX_WORD*)p);\n\t\t\t\t\tp += sizeof(FX_WORD);\n\n\t\t\t\t\tswitch (wDataType)\n\t\t\t\t\t{\n\t\t\t\t\tcase JS_GLOBALDATA_TYPE_NUMBER:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdouble dData = 0;\n\t\t\t\t\t\t\tswitch (wVersion)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tFX_DWORD dwData = *((FX_DWORD*)p);\n\t\t\t\t\t\t\t\t\tp += sizeof(FX_DWORD);\n\t\t\t\t\t\t\t\t\tdData = dwData;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tdData = *((double*)p);\n\t\t\t\t\t\t\t\t\tp += sizeof(double);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tSetGlobalVariableNumber(sEntry, dData);\n\t\t\t\t\t\t\tSetGlobalVariablePersistent(sEntry, TRUE);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase JS_GLOBALDATA_TYPE_BOOLEAN:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tFX_WORD wData = *((FX_WORD*)p);\n\t\t\t\t\t\t\tp += sizeof(FX_WORD);\n\t\t\t\t\t\t\tSetGlobalVariableBoolean(sEntry, (bool)(wData == 1));\n\t\t\t\t\t\t\tSetGlobalVariablePersistent(sEntry, TRUE);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase JS_GLOBALDATA_TYPE_STRING:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tFX_DWORD dwLength = *((FX_DWORD*)p);\n\t\t\t\t\t\t\tp += sizeof(FX_DWORD);\n\n\t\t\t\t\t\t\tif (p + dwLength > pBuffer + nLength)\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tSetGlobalVariableString(sEntry, CFX_ByteString(p, dwLength));\n\t\t\t\t\t\t\tSetGlobalVariablePersistent(sEntry, TRUE);\n\t\t\t\t\t\t\tp += sizeof(char) * dwLength;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase JS_GLOBALDATA_TYPE_NULL:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tSetGlobalVariableNull(sEntry);\n\t\t\t\t\t\t\tSetGlobalVariablePersistent(sEntry, TRUE);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tFX_Free(pBuffer);\n\t}\n}\n\n/*\nstruct js_global_datafile_header\n{\n\tFX_WORD type; //FX ('X' << 8) | 'F'\n\tFX_WORD version; //1.0\n\tFX_DWORD datacount;\n};\nstruct js_global_datafile_data\n{\n\tFX_WORD type;\n\tFX_DWORD nData;\n\tFX_WORD bData;\n\tFX_DWORD nStrLen;\n\tchar* pStr;\n};\n*/\n\nvoid CJS_GlobalData::SaveGlobalPersisitentVariables()\n{\n\tFX_DWORD nCount = 0;\n\tCFX_BinaryBuf sData;\n\n\tfor (int i=0,sz=m_arrayGlobalData.GetSize(); i<sz; i++)\n\t{\n\t\tCJS_GlobalData_Element* pElement = m_arrayGlobalData.GetAt(i);\n\t\tASSERT(pElement != NULL);\n\n\t\tif (pElement->bPersistent)\n\t\t{\n\t\t\tCFX_BinaryBuf sElement;\n\t\t\tMakeByteString(pElement->data.sKey, &pElement->data, sElement);\n\n\t\t\tif (sData.GetSize() + sElement.GetSize() > JS_MAXGLOBALDATA)\n\t\t\t\tbreak;\n\n\t\t\tsData.AppendBlock(sElement.GetBuffer(), sElement.GetSize());\n\t\t\tnCount++;\n\t\t}\n\t}\n\n\tCFX_BinaryBuf sFile;\n\n\tFX_WORD wType = (FX_WORD)(('X' << 8) | 'F');\n\tsFile.AppendBlock(&wType, sizeof(FX_WORD));\n\tFX_WORD wVersion = 2;\n\tsFile.AppendBlock(&wVersion, sizeof(FX_WORD));\n\tsFile.AppendBlock(&nCount, sizeof(FX_DWORD));\n\tFX_DWORD dwSize = sData.GetSize();\n\tsFile.AppendBlock(&dwSize, sizeof(FX_DWORD));\n\n\tsFile.AppendBlock(sData.GetBuffer(), sData.GetSize());\n\n\tCRYPT_ArcFourCryptBlock(sFile.GetBuffer(), sFile.GetSize(), JS_RC4KEY, sizeof(JS_RC4KEY));\n\tWriteFileBuffer(m_sFilePath, (FX_LPCSTR)sFile.GetBuffer(), sFile.GetSize());\n}\n\nvoid CJS_GlobalData::LoadFileBuffer(FX_LPCWSTR sFilePath, FX_LPBYTE& pBuffer, FX_INT32& nLength)\n{\n//UnSupport.\n}\n\nvoid CJS_GlobalData::WriteFileBuffer(FX_LPCWSTR sFilePath, FX_LPCSTR pBuffer, FX_INT32 nLength)\n{\n//UnSupport.\n}\n\nvoid CJS_GlobalData::MakeByteString(const CFX_ByteString& name, CJS_KeyValue* pData, CFX_BinaryBuf& sData)\n{\n\tASSERT(pData != NULL);\n\n\tFX_WORD wType = (FX_WORD)pData->nType;\n\n\tswitch (wType)\n\t{\n\tcase JS_GLOBALDATA_TYPE_NUMBER:\n\t\t{\n\t\t\tFX_DWORD dwNameLen = (FX_DWORD)name.GetLength();\n\t\t\tsData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));\n\t\t\tsData.AppendString(name);\n\n\t\t\tsData.AppendBlock(&wType, sizeof(FX_WORD));\n\t\t\tdouble dData = pData->dData;\n\t\t\tsData.AppendBlock(&dData, sizeof(double));\n\t\t}\n\t\tbreak;\n\tcase JS_GLOBALDATA_TYPE_BOOLEAN:\n\t\t{\n\t\t\tFX_DWORD dwNameLen = (FX_DWORD)name.GetLength();\n\t\t\tsData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));\n\t\t\tsData.AppendString(name);\n\n\t\t\tsData.AppendBlock(&wType, sizeof(FX_WORD));\n\t\t\tFX_WORD wData = (FX_WORD)pData->bData;\n\t\t\tsData.AppendBlock(&wData, sizeof(FX_WORD));\n\t\t}\n\t\tbreak;\n\tcase JS_GLOBALDATA_TYPE_STRING:\n\t\t{\n\t\t\tFX_DWORD dwNameLen = (FX_DWORD)name.GetLength();\n\t\t\tsData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));\n\t\t\tsData.AppendString(name);\n\n\t\t\tsData.AppendBlock(&wType, sizeof(FX_WORD));\n\n\t\t\tFX_DWORD dwDataLen = (FX_DWORD)pData->sData.GetLength();\n\t\t\tsData.AppendBlock(&dwDataLen, sizeof(FX_DWORD));\n\t\t\tsData.AppendString(pData->sData);\n\t\t}\n\t\tbreak;\n\tcase JS_GLOBALDATA_TYPE_NULL:\n\t\t{\n\t\t\tFX_DWORD dwNameLen = (FX_DWORD)name.GetLength();\n\t\t\tsData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));\n\t\t\tsData.AppendString(name);\n\n\t\t\tsData.AppendBlock(&wType, sizeof(FX_DWORD));\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/javascript/JS_Object.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/javascript/JavaScript.h\"\n#include \"../../include/javascript/IJavaScript.h\"\n#include \"../../include/javascript/JS_Define.h\"\n#include \"../../include/javascript/JS_Object.h\"\n// #include \"../../include/javascript/JS_MsgBox.h\"\n// #include \"../../include/javascript/JS_ResMgr.h\"\n#include \"../../include/javascript/JS_Context.h\"\n\nint FXJS_MsgBox(CPDFDoc_Environment* pApp, CPDFSDK_PageView* pPageView, FX_LPCWSTR swMsg, FX_LPCWSTR swTitle, FX_UINT nType, FX_UINT nIcon)\n{\n\tint nRet = 0;\n\n\tif(pApp)\n\t{\n\t\tCPDFSDK_Document* pDoc = pApp->GetCurrentDoc();\n\t\tif(pDoc)\n\t\t\tpDoc->KillFocusAnnot();\n\t\tnRet = pApp->JS_appAlert(swMsg, swTitle, nType, nIcon);\n\t}\n\n\treturn nRet;\n}\n\nCPDFSDK_PageView* FXJS_GetPageView(IFXJS_Context* cc)\n{\n\tif (CJS_Context* pContext = (CJS_Context *)cc)\n\t{\n\t\tif (pContext->GetReaderDocument())\n\t\t\treturn NULL;\n\t}\n\treturn NULL;\n}\n\n/* ---------------------------------  CJS_EmbedObj --------------------------------- */\n\nCJS_EmbedObj::CJS_EmbedObj(CJS_Object* pJSObject) : \n\tm_pJSObject(pJSObject)\n{\n}\n\nCJS_EmbedObj::~CJS_EmbedObj()\n{\n\tm_pJSObject = NULL;\n\n}\n\nCPDFSDK_PageView* CJS_EmbedObj::JSGetPageView(IFXJS_Context* cc)\n{\n\treturn FXJS_GetPageView(cc);\n}\n\nint CJS_EmbedObj::MsgBox(CPDFDoc_Environment* pApp, CPDFSDK_PageView* pPageView,FX_LPCWSTR swMsg,FX_LPCWSTR swTitle,FX_UINT nType,FX_UINT nIcon)\n{\n\treturn FXJS_MsgBox(pApp, pPageView, swMsg, swTitle, nType, nIcon);\n}\n\nvoid CJS_EmbedObj::Alert(CJS_Context* pContext, FX_LPCWSTR swMsg)\n{\n\tCJS_Object::Alert(pContext, swMsg);\n}\n\nCJS_Timer* CJS_EmbedObj::BeginTimer(CPDFDoc_Environment * pApp,FX_UINT nElapse)\n{\n\tCJS_Timer* pTimer = new CJS_Timer(this,pApp);\n\tpTimer->SetJSTimer(nElapse);\n\t\n\treturn pTimer;\n}\n\nvoid CJS_EmbedObj::EndTimer(CJS_Timer* pTimer)\n{\n\tASSERT(pTimer != NULL);\n\tpTimer->KillJSTimer();\n\tdelete pTimer;\n}\n\nFX_BOOL\tCJS_EmbedObj::IsSafeMode(IFXJS_Context* cc)\n{\n\tASSERT(cc != NULL);\n\n\treturn TRUE;\n}\n\n/* ---------------------------------  CJS_Object --------------------------------- */\nvoid  FreeObject(const v8::WeakCallbackData<v8::Object, CJS_Object>& data)\n{\n\tCJS_Object* pJSObj  = data.GetParameter();\n\tif(pJSObj)\n\t{\n\t\tpJSObj->ExitInstance();\n\t\tdelete pJSObj;\n\t}\n\tv8::Local<v8::Object> obj = data.GetValue();\n\tJS_FreePrivate(obj);\n}\n\nCJS_Object::CJS_Object(JSFXObject pObject) :m_pEmbedObj(NULL)\n{\n\tv8::Local<v8::Context> context = pObject->CreationContext();\n\tm_pIsolate = context->GetIsolate();\n\tm_pObject.Reset(m_pIsolate, pObject);\n};\n\nCJS_Object::~CJS_Object(void)\n{\n\tdelete m_pEmbedObj;\n\tm_pEmbedObj = NULL;\n\n\tm_pObject.Reset();\n};\n\nvoid\tCJS_Object::MakeWeak()\n{\n\tm_pObject.SetWeak(this, FreeObject);\n}\n\nCPDFSDK_PageView* CJS_Object::JSGetPageView(IFXJS_Context* cc)\n{\n\treturn FXJS_GetPageView(cc);\n}\n\nint CJS_Object::MsgBox(CPDFDoc_Environment* pApp, CPDFSDK_PageView* pPageView, FX_LPCWSTR swMsg, FX_LPCWSTR swTitle, FX_UINT nType, FX_UINT nIcon)\n{\n\treturn FXJS_MsgBox(pApp, pPageView, swMsg, swTitle, nType, nIcon);\n}\n\nvoid CJS_Object::Alert(CJS_Context* pContext, FX_LPCWSTR swMsg)\n{\n\tASSERT(pContext != NULL);\n\n\tif (pContext->IsMsgBoxEnabled())\n\t{\n\t\tCPDFDoc_Environment* pApp = pContext->GetReaderApp();\n\t\tif(pApp)\n\t\t\tpApp->JS_appAlert(swMsg, NULL, 0, 3);\n\t}\n}\n\n\n"
  },
  {
    "path": "fpdfsdk/src/javascript/JS_Runtime.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/javascript/JavaScript.h\"\n#include \"../../include/javascript/IJavaScript.h\"\n#include \"../../include/javascript/JS_EventHandler.h\"\n#include \"../../include/javascript/JS_Runtime.h\"\n#include \"../../include/javascript/JS_Context.h\"\n#include \"../../include/javascript/JS_Define.h\"\n#include \"../../include/javascript/JS_Object.h\"\n#include \"../../include/javascript/JS_Value.h\"\n#include \"../../include/javascript/Document.h\"\n#include \"../../include/javascript/app.h\"\n#include \"../../include/javascript/color.h\"\n#include \"../../include/javascript/Consts.h\"\n#include \"../../include/javascript/Document.h\"\n#include \"../../include/javascript/event.h\"\n#include \"../../include/javascript/Field.h\"\n#include \"../../include/javascript/Icon.h\"\n#include \"../../include/javascript/PublicMethods.h\"\n#include \"../../include/javascript/report.h\"\n#include \"../../include/javascript/util.h\"\n#include \"../../include/javascript/JS_GlobalData.h\"\n#include \"../../include/javascript/global.h\"\n#include \"../../include/javascript/console.h\"\n\n#include <libplatform/libplatform.h>\n\nCJS_RuntimeFactory::~CJS_RuntimeFactory()\n{\n}\n\nIFXJS_Runtime*\t\t\t\t\tCJS_RuntimeFactory::NewJSRuntime(CPDFDoc_Environment* pApp)\n{\n\tif (!m_bInit)\n\t{\n\t\tJS_Initial();\n                m_platform = v8::platform::CreateDefaultPlatform();\n                v8::V8::InitializePlatform(m_platform);\n\t\t\n\t\tm_bInit = TRUE;\n\t}\n\treturn new CJS_Runtime(pApp);\n}\nvoid\t\t\t\t\t\t\tCJS_RuntimeFactory::AddRef()\n{\n\t//to do.Should be implemented as atom manipulation.\n\tm_nRef++;\n}\nvoid\t\t\t\t\t\t\tCJS_RuntimeFactory::Release()\n{\t\n\tif(m_bInit)\n\t{\n\t\t//to do.Should be implemented as atom manipulation.\n\t\tif (--m_nRef == 0)\n\t\t{\n\t\t\tJS_Release();\n\t\t\tReleaseGlobalData();\n                        v8::V8::ShutdownPlatform();\n                        delete m_platform;\n                        m_platform = NULL;\n\t\t\tm_bInit = FALSE;\n\t\t}\n\t}\n}\n\nvoid\t\t\t\t\t\t\tCJS_RuntimeFactory::DeleteJSRuntime(IFXJS_Runtime* pRuntime)\n{\n\tif(pRuntime)\n\t\tdelete (CJS_Runtime*)pRuntime;\n}\n\nCJS_GlobalData*\tCJS_RuntimeFactory::NewGlobalData(CPDFDoc_Environment* pApp)\n{\n\tif (m_pGlobalData)\n\t{\n\t\tm_nGlobalDataCount++;\n\t\treturn m_pGlobalData;\n\t}\n\telse\n\t{\n\t\tm_nGlobalDataCount = 1;\n\t\tm_pGlobalData = new CJS_GlobalData(pApp);\n\t\treturn m_pGlobalData;\n\t}\n}\n\nvoid CJS_RuntimeFactory::ReleaseGlobalData()\n{\n\tm_nGlobalDataCount--;\n\t\n\tif (m_nGlobalDataCount <= 0)\n\t{\n \t\tdelete m_pGlobalData;\n \t\tm_pGlobalData = NULL;\n\t}\n}\n\n/* ------------------------------ CJS_Runtime ------------------------------ */\n\nCJS_Runtime::CJS_Runtime(CPDFDoc_Environment * pApp) : \n\tm_pApp(pApp),\n\tm_pDocument(NULL),\n\tm_pFieldEventPath(NULL),\n\tm_bBlocking(FALSE),\n\tm_bRegistered(FALSE)\n{\n\tm_isolate = v8::Isolate::New();\n\t//m_isolate->Enter();\n\n\tInitJSObjects();\n\n\tCJS_Context * pContext = (CJS_Context*)NewContext();\n\tJS_InitialRuntime(*this, this, pContext, m_context);\n\tReleaseContext(pContext);\n}\n\nCJS_Runtime::~CJS_Runtime()\n{\n\tfor (int i=0, sz=m_ContextArray.GetSize(); i<sz; i++)\n\t\tdelete m_ContextArray.GetAt(i);\n\n\tm_ContextArray.RemoveAll();\n\n\tJS_ReleaseRuntime(*this, m_context);\n\n\tRemoveEventsInLoop(m_pFieldEventPath);\n\n\tm_pApp = NULL;\n\tm_pDocument = NULL;\n\tm_pFieldEventPath = NULL;\n\tm_context.Reset();\n\n\t//m_isolate->Exit();\n\tm_isolate->Dispose();\n}\n\nFX_BOOL CJS_Runtime::InitJSObjects()\n{\n\tv8::Isolate::Scope isolate_scope(GetIsolate());\n\tv8::HandleScope handle_scope(GetIsolate());\n\tv8::Handle<v8::Context> context = v8::Context::New(GetIsolate());\n\tv8::Context::Scope context_scope(context);\n\t//0 - 8\n\tif (CJS_Border::Init(*this, JS_STATIC) < 0) return FALSE;\n\tif (CJS_Display::Init(*this, JS_STATIC) < 0) return FALSE;\n\tif (CJS_Font::Init(*this, JS_STATIC) < 0) return FALSE;\n\tif (CJS_Highlight::Init(*this, JS_STATIC) < 0) return FALSE;\n\tif (CJS_Position::Init(*this, JS_STATIC) < 0) return FALSE;\n\tif (CJS_ScaleHow::Init(*this, JS_STATIC) < 0) return FALSE;\n\tif (CJS_ScaleWhen::Init(*this, JS_STATIC) < 0) return FALSE;\n\tif (CJS_Style::Init(*this, JS_STATIC) < 0) return FALSE;\t\n\tif (CJS_Zoomtype::Init(*this, JS_STATIC) < 0) return FALSE;\t\n\n\t//9 - 11\n\tif (CJS_App::Init(*this, JS_STATIC) < 0) return FALSE;\n\tif (CJS_Color::Init(*this, JS_STATIC) < 0) return FALSE;   \n\tif (CJS_Console::Init(*this, JS_STATIC) < 0) return FALSE;\n\n\t//12 - 14\n\tif (CJS_Document::Init(*this, JS_DYNAMIC) < 0) return FALSE;  \n\tif (CJS_Event::Init(*this, JS_STATIC) < 0) return FALSE;\t\t\n\tif (CJS_Field::Init(*this, JS_DYNAMIC) < 0) return FALSE;    \n\n\t//15 - 17\n\tif (CJS_Global::Init(*this, JS_STATIC) < 0) return FALSE;\t\t\n\tif (CJS_Icon::Init(*this, JS_DYNAMIC) < 0) return FALSE;\n\tif (CJS_Util::Init(*this, JS_STATIC) < 0) return FALSE;\n\n\tif (CJS_PublicMethods::Init(*this) < 0) return FALSE;\n\tif (CJS_GlobalConsts::Init(*this) < 0) return FALSE;\n\tif (CJS_GlobalArrays::Init(*this) < 0) return FALSE;\n\n\tif (CJS_TimerObj::Init(*this, JS_DYNAMIC) < 0) return FALSE;\n\tif (CJS_PrintParamsObj::Init(*this, JS_DYNAMIC) <0) return FALSE;\n\n\treturn TRUE;\n}\n\nIFXJS_Context* CJS_Runtime::NewContext()\n{\n\tCJS_Context * p = new CJS_Context(this);\n\tm_ContextArray.Add(p);\n\treturn p;\n}\n\nvoid CJS_Runtime::ReleaseContext(IFXJS_Context * pContext)\n{\n\tCJS_Context* pJSContext = (CJS_Context*)pContext;\n\n\tfor (int i=0, sz=m_ContextArray.GetSize(); i<sz; i++)\n\t{\n\t\tif (pJSContext == m_ContextArray.GetAt(i))\n\t\t{\n\t\t\tdelete pJSContext;\n\t\t\tm_ContextArray.RemoveAt(i);\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nIFXJS_Context*\tCJS_Runtime::GetCurrentContext()\n{\n\tif(!m_ContextArray.GetSize())\n\t\treturn NULL;\n\treturn m_ContextArray.GetAt(m_ContextArray.GetSize()-1);\n}\n\nvoid CJS_Runtime::SetReaderDocument(CPDFSDK_Document* pReaderDoc)\n{\n\tif (m_pDocument != pReaderDoc)\n\t{\n\t\tv8::Isolate::Scope isolate_scope(m_isolate);\n\t\tv8::HandleScope handle_scope(m_isolate);\n\t\tv8::Local<v8::Context> context =v8::Local<v8::Context>::New(m_isolate, m_context);\n\t\tv8::Context::Scope context_scope(context);\n\n\t\tm_pDocument = pReaderDoc;\n\n\t\tif (pReaderDoc)\n\t\t{\n\t\t\tJSObject pThis = JS_GetThisObj(*this);\n\t\t\tif(!pThis.IsEmpty())\n\t\t\t{\n\t\t\t\tif (JS_GetObjDefnID(pThis) == JS_GetObjDefnID(*this, L\"Document\"))\n\t\t\t\t{\n\t\t\t\t\tif (CJS_Document* pJSDocument = (CJS_Document*)JS_GetPrivate(pThis))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (Document * pDocument = (Document*)pJSDocument->GetEmbedObject())\n\t\t\t\t\t\t\tpDocument->AttachDoc(pReaderDoc);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tJS_SetThisObj(*this, JS_GetObjDefnID(*this, L\"Document\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tJS_SetThisObj(*this, JS_GetObjDefnID(*this, L\"app\"));\n\t\t}\n\t}\n}\n\nFX_BOOL\tCJS_Runtime::AddEventToLoop(const CFX_WideString& sTargetName, JS_EVENT_T eEventType)\n{\n\tif (m_pFieldEventPath == NULL)\n\t{\n\t\tm_pFieldEventPath = new CJS_FieldEvent;\n\t\tm_pFieldEventPath->sTargetName = sTargetName;\n\t\tm_pFieldEventPath->eEventType = eEventType;\n\t\tm_pFieldEventPath->pNext = NULL;\n\n\t\treturn TRUE;\n\t}\n\n\t//to search\n\tCJS_FieldEvent* p = m_pFieldEventPath;\n\tCJS_FieldEvent* pLast = m_pFieldEventPath;\n\twhile (p)\n\t{\n\t\tif (p->eEventType == eEventType && p->sTargetName == sTargetName)\n\t\t\treturn FALSE;\n\n\t\tpLast = p;\n\t\tp = p->pNext;\n\t}\n\n\t//to add\n\tCJS_FieldEvent* pNew = new CJS_FieldEvent;\n\tpNew->sTargetName = sTargetName;\n\tpNew->eEventType = eEventType;\n\tpNew->pNext = NULL;\n\n\tpLast->pNext = pNew;\n\n\treturn TRUE;\n}\n\nvoid CJS_Runtime::RemoveEventInLoop(const CFX_WideString& sTargetName, JS_EVENT_T eEventType)\n{\n\tFX_BOOL bFind = FALSE;\n\n\tCJS_FieldEvent* p = m_pFieldEventPath;\n\tCJS_FieldEvent* pLast = NULL;\n\twhile (p)\n\t{\n\t\tif (p->eEventType == eEventType && p->sTargetName == sTargetName)\n\t\t{\n\t\t\tbFind = TRUE;\n\t\t\tbreak;\n\t\t}\n\n\t\tpLast = p;\n\t\tp = p->pNext;\n\t}\n\n\tif (bFind)\n\t{\n\t\tRemoveEventsInLoop(p);\n\n\t\tif (p == m_pFieldEventPath)\n\t\t\tm_pFieldEventPath = NULL;\n\n\t\tif (pLast)\n\t\t\tpLast->pNext = NULL;\n\t}\n}\n\nvoid CJS_Runtime::RemoveEventsInLoop(CJS_FieldEvent* pStart)\n{\n\tCJS_FieldEvent* p = pStart;\n\n\twhile (p)\n\t{\n\t\tCJS_FieldEvent* pOld = p;\n\t\tp = pOld->pNext;\n\n\t\tdelete pOld;\n\t}\n}\n\nv8::Handle<v8::Context>\tCJS_Runtime::NewJSContext()\n{\n\treturn v8::Local<v8::Context>::New(m_isolate, m_context);\n}\n\nCFX_WideString ChangeObjName(const CFX_WideString& str)\n{\n\tCFX_WideString sRet = str;\n\tsRet.Replace((FX_LPCWSTR)L\"_\", (FX_LPCWSTR)L\".\");\n\treturn sRet;\n}\n\nvoid CJS_Runtime::GetObjectNames(CFX_WideStringArray& array)\n{\n\tarray.RemoveAll();\n\n\tarray.Add(CJS_Border::m_pClassName);\n\tarray.Add(CJS_Display::m_pClassName);\n\tarray.Add(CJS_Font::m_pClassName);\n\tarray.Add(CJS_Highlight::m_pClassName);\n\tarray.Add(CJS_Position::m_pClassName);\n\tarray.Add(CJS_ScaleHow::m_pClassName);\n\tarray.Add(CJS_ScaleWhen::m_pClassName);\n\tarray.Add(CJS_Style::m_pClassName);\n\tarray.Add(CJS_Zoomtype::m_pClassName);\n\n\tarray.Add(CJS_App::m_pClassName);\n\tarray.Add((FX_LPCWSTR)\"this\"); \n\tarray.Add(CJS_Event::m_pClassName);\t\n\n\tarray.Add(CJS_Global::m_pClassName);\t\n\tarray.Add(CJS_Util::m_pClassName);\n}\n\nvoid CJS_Runtime::GetObjectConsts(const CFX_WideString& sObjName, CFX_WideStringArray& array)\n{\n\tJSConstSpec* pConsts = NULL;\n\tint nSize = 0;\n\n\tif (sObjName == CJS_Border::m_pClassName)\n\t\tCJS_Border::GetConsts(pConsts, nSize);\n\telse if (sObjName == CJS_Display::m_pClassName)\n\t\tCJS_Display::GetConsts(pConsts, nSize);\n\telse if (sObjName == CJS_Font::m_pClassName)\n\t\tCJS_Font::GetConsts(pConsts, nSize);\n\telse if (sObjName == CJS_Highlight::m_pClassName)\n\t\tCJS_Highlight::GetConsts(pConsts, nSize);\n\telse if (sObjName == CJS_Position::m_pClassName)\n\t\tCJS_Position::GetConsts(pConsts, nSize);\n\telse if (sObjName == CJS_ScaleHow::m_pClassName)\n\t\tCJS_ScaleHow::GetConsts(pConsts, nSize);\n\telse if (sObjName == CJS_ScaleWhen::m_pClassName)\n\t\tCJS_ScaleWhen::GetConsts(pConsts, nSize);\n\telse if (sObjName == CJS_Style::m_pClassName)\n\t\tCJS_Style::GetConsts(pConsts, nSize);\n\telse if (sObjName == CJS_Zoomtype::m_pClassName)\n\t\tCJS_Zoomtype::GetConsts(pConsts, nSize);\n\n\telse if (sObjName == CJS_App::m_pClassName)\n\t\tCJS_App::GetConsts(pConsts, nSize);\n\telse if (sObjName == CJS_Color::m_pClassName)\n\t\tCJS_Color::GetConsts(pConsts, nSize);\t\n\n\telse if (sObjName == L\"this\") \n\t{\n\t\tif (GetReaderDocument())\n\t\t\tCJS_Document::GetConsts(pConsts, nSize);\n\t\telse \n\t\t\tCJS_App::GetConsts(pConsts, nSize);\n\t}\n\n\tif (sObjName == CJS_Event::m_pClassName)\n\t\tCJS_Event::GetConsts(pConsts, nSize);\t\n\telse if (sObjName == CJS_Field::m_pClassName)\n\t\tCJS_Field::GetConsts(pConsts, nSize);\t\n\telse if (sObjName == CJS_Global::m_pClassName)\n\t\tCJS_Global::GetConsts(pConsts, nSize);\t\n\telse if (sObjName == CJS_Util::m_pClassName)\n\t\tCJS_Util::GetConsts(pConsts, nSize);\n\n\tfor (int i=0; i<nSize; i++)\n\t\tarray.Add(pConsts[i].pName);\n}\n\nvoid CJS_Runtime::GetObjectProps(const CFX_WideString& sObjName, CFX_WideStringArray& array)\n{\n\tJSPropertySpec* pProperties = NULL;\n\tint nSize = 0;\n\n \tif (sObjName == CJS_App::m_pClassName)\n\t\tCJS_App::GetProperties(pProperties, nSize);\n\telse if (sObjName == CJS_Color::m_pClassName)\n\t\tCJS_Color::GetProperties(pProperties, nSize); \n\telse if (sObjName == L\"this\")\n\t{\n\t\tif (GetReaderDocument())\n\t\t\tCJS_Document::GetProperties(pProperties, nSize);\n\t\telse\t\n\t\t\tCJS_App::GetProperties(pProperties, nSize);\n\t}\n\telse if (sObjName == CJS_Event::m_pClassName)\n\t\tCJS_Event::GetProperties(pProperties, nSize);\t\n\telse if (sObjName == CJS_Field::m_pClassName)\n\t\tCJS_Field::GetProperties(pProperties, nSize);\t\n\telse if (sObjName == CJS_Global::m_pClassName)\n\t\tCJS_Global::GetProperties(pProperties, nSize);\t\n\telse if (sObjName == CJS_Util::m_pClassName)\n\t\tCJS_Util::GetProperties(pProperties, nSize);\n\n\tfor (int i=0; i<nSize; i++)\n\t\tarray.Add(pProperties[i].pName);\n}\n\nvoid CJS_Runtime::GetObjectMethods(const CFX_WideString& sObjName, CFX_WideStringArray& array)\n{\n\tJSMethodSpec* pMethods = NULL;\n\tint nSize = 0;\n\n \t if (sObjName == CJS_App::m_pClassName)\n\t\tCJS_App::GetMethods(pMethods, nSize);\n\telse if (sObjName == CJS_Color::m_pClassName)\n\t\tCJS_Color::GetMethods(pMethods, nSize);\t\n\telse if (sObjName == L\"this\") \n\t{\n\t\tif (GetReaderDocument())\n\t\t\tCJS_Document::GetMethods(pMethods, nSize);\n\t\telse\t\n\t\t\tCJS_App::GetMethods(pMethods, nSize);\n\t}\n\telse if (sObjName == CJS_Event::m_pClassName)\n\t\tCJS_Event::GetMethods(pMethods, nSize);\t\n\telse if (sObjName == CJS_Field::m_pClassName)\n\t\tCJS_Field::GetMethods(pMethods, nSize);\t\n\telse if (sObjName == CJS_Global::m_pClassName)\n\t\tCJS_Global::GetMethods(pMethods, nSize);\t\n\telse if (sObjName == CJS_Util::m_pClassName)\n\t\tCJS_Util::GetMethods(pMethods, nSize);\n\n\tfor (int i=0; i<nSize; i++)\n\t\tarray.Add(pMethods[i].pName);\n}\n\nFX_BOOL  CJS_Runtime::IsEntered()\n{\n\treturn v8::Isolate::GetCurrent() == m_isolate;\n}\nvoid\tCJS_Runtime::Exit()\n{\n\tif(m_isolate) m_isolate->Exit();\n}\nvoid\tCJS_Runtime::Enter()\n{\n\tif(m_isolate) m_isolate->Enter();\n}\n"
  },
  {
    "path": "fpdfsdk/src/javascript/JS_Value.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/javascript/JavaScript.h\"\n#include \"../../include/javascript/JS_Define.h\"\n#include \"../../include/javascript/JS_Object.h\"\n#include \"../../include/javascript/JS_Value.h\"\n\n/* ---------------------------- CJS_Value ---------------------------- */\n\nCJS_Value::CJS_Value(v8::Isolate* isolate) : m_isolate(isolate),m_eType(VT_unknown)\n{\n}\nCJS_Value::CJS_Value(v8::Isolate* isolate, v8::Handle<v8::Value> pValue,FXJSVALUETYPE t) :m_isolate(isolate), m_pValue(pValue) , m_eType(t)\n{\n}\n\nCJS_Value::CJS_Value(v8::Isolate* isolate, const int &iValue):m_isolate(isolate)\n{\n\toperator =(iValue);\n}\n\nCJS_Value::CJS_Value(v8::Isolate* isolate, const bool &bValue):m_isolate(isolate)\n{\n\toperator =(bValue);\n}\n\nCJS_Value::CJS_Value(v8::Isolate* isolate, const float &fValue):m_isolate(isolate)\n{\n\toperator =(fValue);\n}\n\nCJS_Value::CJS_Value(v8::Isolate* isolate, const double &dValue):m_isolate(isolate) \n{\n\toperator =(dValue);\n}\n\nCJS_Value::CJS_Value(v8::Isolate* isolate, JSFXObject  pJsObj):m_isolate(isolate) \n{\n\toperator =(pJsObj);\n}\n\nCJS_Value::CJS_Value(v8::Isolate* isolate, CJS_Object * pJsObj):m_isolate(isolate) \n{\n\toperator =(pJsObj);\n}\n\nCJS_Value::CJS_Value(v8::Isolate* isolate, FX_LPCWSTR pWstr):m_isolate(isolate) \n{\n\toperator =(pWstr);\n}\n\nCJS_Value::CJS_Value(v8::Isolate* isolate, FX_LPCSTR pStr):m_isolate(isolate) \n{\n\toperator = (pStr);\n}\n\nCJS_Value::CJS_Value(v8::Isolate* isolate, CJS_Array& array):m_isolate(isolate) \n{\n\toperator = (array);\n}\n\nCJS_Value::~CJS_Value()\n{\n}\n\nvoid CJS_Value::Attach(v8::Handle<v8::Value> pValue,FXJSVALUETYPE t)\n{\n\tm_pValue = pValue;\n\tm_eType = t;\n}\n\nvoid CJS_Value::Attach(CJS_Value *pValue)\n{\n\tif (pValue)\n\t\tAttach(pValue->ToJSValue(),pValue->GetType());\n}\n\nvoid CJS_Value::Detach()\n{\n\tm_pValue = v8::Handle<v8::Value>();\n\tm_eType = VT_unknown;\n}\n\n/* ---------------------------------------------------------------------------------------- */\n\nCJS_Value::operator int() const\n{\n\n\treturn JS_ToInt32(m_pValue);\n\n}\n\nCJS_Value::operator bool() const\n{\n\n\treturn JS_ToBoolean(m_pValue);\n\t\n}\n\nCJS_Value::operator double() const\n{\n\n\treturn JS_ToNumber(m_pValue);\n\t\n}\n\nCJS_Value::operator float() const\n{\n\n\treturn (float)JS_ToNumber(m_pValue);\n\n}\n\nCJS_Value::operator CJS_Object *() const\n{\n\n\tv8::Handle<v8::Object>\tpObj = JS_ToObject(m_pValue);\n\treturn (CJS_Object*)JS_GetPrivate(m_isolate, pObj);\n}\n\nCJS_Value::operator v8::Handle<v8::Object>() const\n{\n\treturn JS_ToObject(m_pValue);\n}\n\nCJS_Value::operator CFX_WideString() const\n{\n\treturn JS_ToString(m_pValue);\n}\n\nCJS_Value::operator CFX_ByteString() const\n{\n\treturn CFX_ByteString::FromUnicode(operator CFX_WideString());\n}\n\nv8::Handle<v8::Value> CJS_Value::ToJSValue()\n{\n\treturn m_pValue;\n}\n\n\nCJS_Value::operator v8::Handle<v8::Array>() const\n{\n\tif (IsArrayObject())\n\t\treturn v8::Handle<v8::Array>::Cast(JS_ToObject(m_pValue));\n\treturn v8::Handle<v8::Array>();\n}\n\n/* ---------------------------------------------------------------------------------------- */\n\nvoid CJS_Value::operator =(int iValue)\n{\n\tm_pValue = JS_NewNumber(m_isolate, iValue);\n\n\tm_eType = VT_number;\n}\n\nvoid CJS_Value::operator =(bool bValue)\n{\n\tm_pValue = JS_NewBoolean(m_isolate, bValue);\n\n\tm_eType = VT_boolean;\n}\n\nvoid CJS_Value::operator =(double dValue)\n{\n\tm_pValue = JS_NewNumber(m_isolate,dValue);\n\n\tm_eType = VT_number;\n}\n\nvoid CJS_Value::operator = (float fValue)\n{\n\tm_pValue = JS_NewNumber(m_isolate,fValue);\n\tm_eType = VT_number;\n}\n\nvoid CJS_Value::operator =(v8::Handle<v8::Object> pObj)\n{\n\n\tm_pValue = JS_NewObject(m_isolate,pObj);\n\n\tm_eType = VT_fxobject;\n}\n\nvoid CJS_Value::operator =(CJS_Object * pObj)\n{\n\tif (pObj)\n\t\toperator = ((JSFXObject)*pObj);\n}\n\nvoid CJS_Value::operator =(FX_LPCWSTR pWstr)\n{\n\tm_pValue = JS_NewString(m_isolate,(wchar_t *)pWstr);\n\n\tm_eType = VT_string;\n}\n\nvoid CJS_Value::SetNull()\n{\n\tm_pValue = JS_NewNull();\n\n\tm_eType = VT_null;\n}\n\nvoid CJS_Value::operator = (FX_LPCSTR pStr)\n{\t\n\toperator = (CFX_WideString::FromLocal(pStr));\n}\n\nvoid CJS_Value::operator = (CJS_Array & array)\n{\n\tm_pValue = JS_NewObject2(m_isolate,(v8::Handle<v8::Array>)array);\n\n\tm_eType = VT_object;\n}\n\nvoid CJS_Value::operator = (CJS_Date & date)\n{\n\tm_pValue = JS_NewDate(m_isolate, (double)date);\n\n\tm_eType = VT_date;\n}\n\nvoid CJS_Value::operator = (CJS_Value value)\n{\n\tm_pValue = value.ToJSValue();\n\n\tm_eType = value.m_eType;\n}\n\n/* ---------------------------------------------------------------------------------------- */\n\nFXJSVALUETYPE CJS_Value::GetType() const\n{\n\tif(m_pValue.IsEmpty()) return VT_unknown;\n\tif(m_pValue->IsString()) return VT_string;\n\tif(m_pValue->IsNumber()) return VT_number;\n\tif(m_pValue->IsBoolean()) return VT_boolean;\n\tif(m_pValue->IsDate()) return VT_date;\n\tif(m_pValue->IsObject()) return VT_object;\n\tif(m_pValue->IsNull()) return VT_null;\n\tif(m_pValue->IsUndefined()) return VT_undefined;\n\treturn VT_unknown;\n}\n\nFX_BOOL CJS_Value::IsArrayObject() const \n{\n\tif(m_pValue.IsEmpty()) return FALSE;\n\treturn m_pValue->IsArray();\n}\n\nFX_BOOL CJS_Value::IsDateObject() const\n{\n\tif(m_pValue.IsEmpty()) return FALSE;\n\treturn m_pValue->IsDate();\n}\n\n//CJS_Value::operator CJS_Array()\nFX_BOOL CJS_Value::ConvertToArray(CJS_Array &array) const\n{\n\tif (IsArrayObject())\n\t{\n\t\tarray.Attach(JS_ToArray(m_pValue));\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL CJS_Value::ConvertToDate(CJS_Date &date) const\n{\n// \tif (GetType() == VT_date)\n// \t{\n// \t\tdate = (double)(*this);\n// \t\treturn TRUE;\n// \t}\n\n\tif (IsDateObject())\n\t{\n\t\tdate.Attach(m_pValue);\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\t\n}\n\n/* ---------------------------- CJS_PropValue ---------------------------- */\n\nCJS_PropValue::CJS_PropValue(const CJS_Value &value) : \n\tCJS_Value(value),\n\tm_bIsSetting(0)\n{\n}\n\nCJS_PropValue::CJS_PropValue(v8::Isolate* isolate) : CJS_Value(isolate),\n                                 m_bIsSetting(0)\n{\n}\n\nCJS_PropValue::~CJS_PropValue()\n{\n}\n\nFX_BOOL CJS_PropValue::IsSetting()\n{\n\treturn m_bIsSetting;\n}\n\nFX_BOOL CJS_PropValue::IsGetting()\n{\n\treturn !m_bIsSetting;\n}\n\nvoid CJS_PropValue::operator <<(int iValue)\n{\n\tASSERT(!m_bIsSetting);\n\tCJS_Value::operator =(iValue);\n}\n\nvoid CJS_PropValue::operator >>(int & iValue) const\n{\n\tASSERT(m_bIsSetting);\n\tiValue = CJS_Value::operator int();\n}\n\n\nvoid CJS_PropValue::operator <<(bool bValue)\n{\n\tASSERT(!m_bIsSetting);\n\tCJS_Value::operator =(bValue);\n}\n\nvoid CJS_PropValue::operator >>(bool &bValue) const\n{\n\tASSERT(m_bIsSetting);\n\tbValue = CJS_Value::operator bool();\n\n}\n\nvoid CJS_PropValue::operator <<(double dValue)\n{\n\tASSERT(!m_bIsSetting);\n\tCJS_Value::operator =(dValue);\n}\n\nvoid CJS_PropValue::operator >>(double &dValue) const\n{\n\tASSERT(m_bIsSetting);\n\tdValue = CJS_Value::operator double();\n}\n\nvoid CJS_PropValue::operator <<(CJS_Object *pObj)\n{\n\tASSERT(!m_bIsSetting);\n\tCJS_Value::operator = (pObj);\n}\n\nvoid CJS_PropValue::operator >>(CJS_Object *&ppObj) const\n{\n\tASSERT(m_bIsSetting);\n\tppObj = CJS_Value::operator CJS_Object *();\n}\n\nvoid CJS_PropValue::operator<<(JSFXObject pObj)\n{\n\tASSERT(!m_bIsSetting);\n\tCJS_Value::operator = (pObj);\n}\n\nvoid CJS_PropValue::operator>>(JSFXObject &ppObj) const\n{\n\tASSERT(m_bIsSetting);\n\tppObj = CJS_Value::operator JSFXObject ();\n}\n\n\nvoid CJS_PropValue::StartSetting()\n{\n\tm_bIsSetting = 1;\n}\n\nvoid CJS_PropValue::StartGetting()\n{\n\tm_bIsSetting = 0;\n}\nvoid CJS_PropValue::operator <<(CFX_ByteString string)\n{\n\tASSERT(!m_bIsSetting);\n\tCJS_Value::operator =((FX_LPCSTR)string);\n}\n\nvoid CJS_PropValue::operator >>(CFX_ByteString &string) const\n{\n\tASSERT(m_bIsSetting);\n\tstring = CJS_Value::operator CFX_ByteString();\n}\n\nvoid CJS_PropValue::operator <<(FX_LPCWSTR c_string)\n{\n\tASSERT(!m_bIsSetting);\n\tCJS_Value::operator =(c_string);\n}\n\nvoid CJS_PropValue::operator >>(CFX_WideString &wide_string) const\n{\n\tASSERT(m_bIsSetting);\n\twide_string = CJS_Value::operator CFX_WideString();\n}\n\nvoid CJS_PropValue::operator <<(CFX_WideString wide_string)\n{\n\tASSERT(!m_bIsSetting);\n\tCJS_Value::operator = (wide_string);\n}\n\nvoid CJS_PropValue::operator >>(CJS_Array &array) const\n{\n\tASSERT(m_bIsSetting);\n\tConvertToArray(array);\n}\n\nvoid CJS_PropValue::operator <<(CJS_Array &array)\n{\n\tASSERT(!m_bIsSetting);\n\tCJS_Value::operator=(array);\n}\n\nvoid CJS_PropValue::operator>>(CJS_Date &date) const\n{\n\tASSERT(m_bIsSetting);\n\tConvertToDate(date);\n}\n\nvoid CJS_PropValue::operator<<(CJS_Date &date)\n{\n\tASSERT(!m_bIsSetting);\n\tCJS_Value::operator=(date);\n}\n\nCJS_PropValue::operator v8::Handle<v8::Value>() const\n{\n\treturn m_pValue;\n}\n\n/* ======================================== CJS_Array ========================================= */\nCJS_Array::CJS_Array(v8::Isolate* isolate):m_isolate(isolate)\n{\n}\n\nCJS_Array::~CJS_Array()\n{\t\t\n}\n\nvoid CJS_Array::Attach(v8::Handle<v8::Array> pArray)\n{\n\tm_pArray = pArray;\n}\n\nFX_BOOL CJS_Array::IsAttached()\n{\n\treturn FALSE;\n}\n\nvoid CJS_Array::GetElement(unsigned index,CJS_Value &value)\n{\n\tif (m_pArray.IsEmpty())\n\t\treturn;\n\tv8::Handle<v8::Value>  p = JS_GetArrayElemnet(m_pArray,index);\n\tvalue.Attach(p,VT_object);\n}\n\nvoid CJS_Array::SetElement(unsigned index,CJS_Value value)\n{\n\tif (m_pArray.IsEmpty())\n\t\tm_pArray = JS_NewArray(m_isolate);\n\n\tJS_PutArrayElement(m_pArray,index,value.ToJSValue(),value.GetType());\n}\n\nint CJS_Array::GetLength()\n{\n\tif (m_pArray.IsEmpty())\n\t\treturn 0;\n\treturn JS_GetArrayLength(m_pArray);\n}\n\nCJS_Array:: operator v8::Handle<v8::Array>()\n{\n\tif (m_pArray.IsEmpty())\n\t\tm_pArray = JS_NewArray(m_isolate);\n\n\treturn m_pArray;\n}\n\n/* ======================================== CJS_Date ========================================= */\n\nCJS_Date::CJS_Date(v8::Isolate* isolate) :m_isolate(isolate)\n{\n}\n\nCJS_Date::CJS_Date(v8::Isolate* isolate,double dMsec_time) \n{\n\tm_isolate = isolate;\n\tm_pDate = JS_NewDate(isolate,dMsec_time);\t\t\n}\n\nCJS_Date::CJS_Date(v8::Isolate* isolate,int year, int mon, int day,int hour, int min, int sec) \n{\n\tm_isolate = isolate;\n\tm_pDate = JS_NewDate(isolate,MakeDate(year,mon,day,hour,min,sec,0));\t\n}\n\ndouble CJS_Date::MakeDate(int year, int mon, int day,int hour, int min, int sec,int ms)\n{\n\treturn JS_MakeDate(JS_MakeDay(year,mon,day), JS_MakeTime(hour,min,sec,ms));\n}\n\nCJS_Date::~CJS_Date()\n{\n}\n\nFX_BOOL\tCJS_Date::IsValidDate()\n{\n\tif(m_pDate.IsEmpty()) return FALSE;\n\treturn !JS_PortIsNan(JS_ToNumber(m_pDate));\n}\n\nvoid CJS_Date::Attach(v8::Handle<v8::Value> pDate)\n{\n\tm_pDate = pDate;\n}\n\nint CJS_Date::GetYear()\n{\n\tif (IsValidDate())\n\t\treturn JS_GetYearFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));\n\n\treturn 0;\n}\n\nvoid CJS_Date::SetYear(int iYear)\n{\n\tdouble date = MakeDate(iYear,GetMonth(),GetDay(),GetHours(),GetMinutes(),GetSeconds(),0);\n\tJS_ValueCopy(m_pDate, JS_NewDate(m_isolate,date));\n}\n\nint CJS_Date::GetMonth()\n{\n\tif (IsValidDate())\n\t\treturn JS_GetMonthFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));\n\n\treturn 0;\n}\n\nvoid CJS_Date::SetMonth(int iMonth)\n{\n\n\tdouble date = MakeDate(GetYear(),iMonth,GetDay(),GetHours(),GetMinutes(),GetSeconds(),0);\n\tJS_ValueCopy(m_pDate, JS_NewDate(m_isolate,date));\n\n}\n\nint CJS_Date::GetDay()\n{\n\tif (IsValidDate())\n\t\treturn JS_GetDayFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));\n\n\treturn 0;\n}\n\nvoid CJS_Date::SetDay(int iDay)\n{\n\n\tdouble date = MakeDate(GetYear(),GetMonth(),iDay,GetHours(),GetMinutes(),GetSeconds(),0);\n\tJS_ValueCopy(m_pDate,JS_NewDate(m_isolate,date));\n\n}\n\nint CJS_Date::GetHours()\n{\n\tif (IsValidDate())\n\t\treturn JS_GetHourFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));\n\n\treturn 0;\n}\n\nvoid CJS_Date::SetHours(int iHours)\n{\n\tdouble date = MakeDate(GetYear(),GetMonth(),GetDay(),iHours,GetMinutes(),GetSeconds(),0);\n\tJS_ValueCopy(m_pDate,JS_NewDate(m_isolate,date));\n}\n\nint CJS_Date::GetMinutes()\n{\n\tif (IsValidDate())\n\t\treturn JS_GetMinFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));\n\n\treturn 0;\n}\n\nvoid CJS_Date::SetMinutes(int minutes)\n{\n\tdouble date = MakeDate(GetYear(),GetMonth(),GetDay(),GetHours(),minutes,GetSeconds(),0);\n\tJS_ValueCopy(m_pDate,JS_NewDate(m_isolate,date));\n}\n\nint CJS_Date::GetSeconds()\n{\n\tif (IsValidDate())\n\t\treturn JS_GetSecFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));\n\n\treturn 0;\n}\n\nvoid CJS_Date::SetSeconds(int seconds)\n{\n\tdouble date = MakeDate(GetYear(),GetMonth(),GetDay(),GetHours(),GetMinutes(),seconds,0);\n\tJS_ValueCopy(m_pDate,JS_NewDate(m_isolate,date));\n}\n\nCJS_Date::operator v8::Handle<v8::Value>()\n{\n\treturn m_pDate;\n}\n\nCJS_Date::operator double() const\n{\n\tif(m_pDate.IsEmpty())\n\t\treturn 0.0;\n\treturn JS_ToNumber(m_pDate);\n}\n\nCFX_WideString CJS_Date::ToString() const\n{\n\tif(m_pDate.IsEmpty())\n\t\treturn L\"\";\n\treturn JS_ToString(m_pDate);\n}\n"
  },
  {
    "path": "fpdfsdk/src/javascript/PublicMethods.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/javascript/JavaScript.h\"\n#include \"../../include/javascript/IJavaScript.h\"\n#include \"../../include/javascript/JS_Define.h\"\n#include \"../../include/javascript/JS_Object.h\"\n#include \"../../include/javascript/JS_Value.h\"\n#include \"../../include/javascript/PublicMethods.h\"\n#include \"../../include/javascript/JS_EventHandler.h\"\n#include \"../../include/javascript/resource.h\"\n#include \"../../include/javascript/JS_Context.h\"\n#include \"../../include/javascript/JS_Value.h\"\n#include \"../../include/javascript/util.h\"\n#include \"../../include/javascript/Field.h\"\n#include \"../../include/javascript/color.h\"\n#include \"../../include/javascript/JS_Runtime.h\"\n\nstatic v8::Isolate* GetIsolate(IFXJS_Context* cc)\n{\n\tCJS_Context* pContext = (CJS_Context *)cc;\n\tASSERT(pContext != NULL);\n\n\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\tASSERT(pRuntime != NULL);\n\n\treturn pRuntime->GetIsolate();\n}\n\n\n/* -------------------------------- CJS_PublicMethods -------------------------------- */\n\n#define DOUBLE_CORRECT\t0.000000000000001\n\nBEGIN_JS_STATIC_GLOBAL_FUN(CJS_PublicMethods)\n\tJS_STATIC_GLOBAL_FUN_ENTRY(AFNumber_Format,6)\n\tJS_STATIC_GLOBAL_FUN_ENTRY(AFNumber_Keystroke,6)\n\tJS_STATIC_GLOBAL_FUN_ENTRY(AFPercent_Format,2)\n\tJS_STATIC_GLOBAL_FUN_ENTRY(AFPercent_Keystroke,2)\n\tJS_STATIC_GLOBAL_FUN_ENTRY(AFDate_FormatEx,1)\n\tJS_STATIC_GLOBAL_FUN_ENTRY(AFDate_KeystrokeEx,1)\n\tJS_STATIC_GLOBAL_FUN_ENTRY(AFDate_Format,1)\n\tJS_STATIC_GLOBAL_FUN_ENTRY(AFDate_Keystroke,1)\n\tJS_STATIC_GLOBAL_FUN_ENTRY(AFTime_FormatEx,1)\n\tJS_STATIC_GLOBAL_FUN_ENTRY(AFTime_KeystrokeEx,1)\n\tJS_STATIC_GLOBAL_FUN_ENTRY(AFTime_Format,1)\n\tJS_STATIC_GLOBAL_FUN_ENTRY(AFTime_Keystroke,1)\n\tJS_STATIC_GLOBAL_FUN_ENTRY(AFSpecial_Format,1)\n\tJS_STATIC_GLOBAL_FUN_ENTRY(AFSpecial_Keystroke,1)\n\tJS_STATIC_GLOBAL_FUN_ENTRY(AFSpecial_KeystrokeEx,1)\n\tJS_STATIC_GLOBAL_FUN_ENTRY(AFSimple,3)\n\tJS_STATIC_GLOBAL_FUN_ENTRY(AFMakeNumber,1)\n\tJS_STATIC_GLOBAL_FUN_ENTRY(AFSimple_Calculate,2)\n\tJS_STATIC_GLOBAL_FUN_ENTRY(AFRange_Validate,4)\n\tJS_STATIC_GLOBAL_FUN_ENTRY(AFMergeChange,1)\n\tJS_STATIC_GLOBAL_FUN_ENTRY(AFParseDateEx,2)\n\tJS_STATIC_GLOBAL_FUN_ENTRY(AFExtractNums,1)\nEND_JS_STATIC_GLOBAL_FUN()\n\nIMPLEMENT_JS_STATIC_GLOBAL_FUN(CJS_PublicMethods)\n\nstruct stru_TbConvert\n{\n\tFX_LPCSTR lpszJSMark;\n\tFX_LPCSTR lpszCppMark;\n};\n\nstatic const stru_TbConvert fcTable[] = {\"mmmm\",\"%B\",\n\t\"mmm\", \"%b\",\n\t\"mm\",  \"%m\",\n\t//\"m\"\n\t\"dddd\",\"%A\",\n\t\"ddd\", \"%a\",\n\t\"dd\",  \"%d\",\n\t//\"d\",   \"%w\",\n\t\"yyyy\",\"%Y\",\n\t\"yy\",  \"%y\",\n\t\"HH\",  \"%H\",\n\t//\"H\"\n\t\"hh\",  \"%I\",\n\t//\"h\"\n\t\"MM\",  \"%M\",\n\t//\"M\"\n\t\"ss\",  \"%S\",\n\t//\"s\n\t\"tt\",  \"%p\"\n\t//\"t\"\n};\n\nstatic FX_LPCWSTR months[] =\n{\n\t(FX_LPCWSTR)L\"Jan\", (FX_LPCWSTR)L\"Feb\", (FX_LPCWSTR)L\"Mar\", (FX_LPCWSTR)L\"Apr\", (FX_LPCWSTR)L\"May\", (FX_LPCWSTR)L\"Jun\", (FX_LPCWSTR)L\"Jul\", (FX_LPCWSTR)L\"Aug\", (FX_LPCWSTR)L\"Sep\", (FX_LPCWSTR)L\"Oct\", (FX_LPCWSTR)L\"Nov\", (FX_LPCWSTR)L\"Dec\"\n};\n\nstatic FX_LPCWSTR fullmonths[] = \n{ \n\t(FX_LPCWSTR)L\"January\", (FX_LPCWSTR)L\"February\", (FX_LPCWSTR)L\"March\", (FX_LPCWSTR)L\"April\", (FX_LPCWSTR)L\"May\", (FX_LPCWSTR)L\"June\", (FX_LPCWSTR)L\"July\", (FX_LPCWSTR)L\"August\", (FX_LPCWSTR)L\"September\", (FX_LPCWSTR)L\"October\", (FX_LPCWSTR)L\"November\", (FX_LPCWSTR)L\"December\" \n};\n\nFX_BOOL CJS_PublicMethods::IsNumber(FX_LPCWSTR string)\n{\n\tCFX_WideString sTrim = StrTrim(string);\n\tFX_LPCWSTR pTrim = sTrim;\n\tFX_LPCWSTR p = pTrim;\n\n\n\tFX_BOOL bDot = FALSE;\n\tFX_BOOL bKXJS = FALSE;\n\n\twchar_t c;\n\twhile ((c = *p))\n\t{\n\t\tif (c == '.' || c == ',')\n\t\t{\n\t\t\tif (bDot) return FALSE;\n\t\t\tbDot = TRUE;\n\t\t}\n\t\telse if (c == '-' || c == '+')\n\t\t{\n\t\t\tif (p != pTrim)\n\t\t\t\treturn FALSE;\n\t\t}\n\t\telse if (c == 'e' || c == 'E')\n\t\t{\n\t\t\tif (bKXJS) return FALSE;\n\n\t\t\tp++;\n\t\t\tc = *p;\n\t\t\tif (c == '+' || c == '-')\n\t\t\t{\n\t\t\t\tbKXJS = TRUE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\t\telse if (!IsDigit(c))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t\tp++;\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL CJS_PublicMethods::IsDigit(wchar_t ch)\n{\n\treturn (ch >= L'0' && ch <= L'9');\n}\n\nFX_BOOL CJS_PublicMethods::IsDigit(char ch)\n{\n\treturn (ch >= '0' && ch <= '9');\n}\n\nFX_BOOL CJS_PublicMethods::IsAlphabetic(wchar_t ch)\n{\n\treturn ((ch >= L'a' && ch <= L'z') || (ch >= L'A' && ch <= L'Z'));\n}\n\nFX_BOOL CJS_PublicMethods::IsAlphaNumeric(wchar_t ch)\n{\n\treturn (IsDigit(ch) || IsAlphabetic(ch));\n}\n\nFX_BOOL CJS_PublicMethods::maskSatisfied(wchar_t c_Change,wchar_t c_Mask)\n{\n\tswitch (c_Mask)\n\t{\n\tcase L'9':\n        return IsDigit(c_Change);\t\t\n    case L'A':\n        return IsAlphabetic(c_Change);\t\t\n    case L'O':\n        return IsAlphaNumeric(c_Change);\t\t\n    case L'X':\n        return TRUE;\t\t\n\tdefault:\n        return (c_Change == c_Mask);\n\t}\n}\n\nFX_BOOL CJS_PublicMethods::isReservedMaskChar(wchar_t ch)\n{\n\treturn ch == L'9' || ch == L'A' || ch == L'O' || ch == L'X';\n}\n\ndouble CJS_PublicMethods::AF_Simple(FX_LPCWSTR sFuction, double dValue1, double dValue2)\n{\n\tif (FXSYS_wcsicmp(sFuction,(FX_LPCWSTR)L\"AVG\") == 0 || FXSYS_wcsicmp(sFuction,(FX_LPCWSTR)L\"SUM\") == 0)\n\t{\n\t\treturn dValue1 + dValue2;\n\t}\n\telse if (FXSYS_wcsicmp(sFuction, (FX_LPCWSTR)L\"PRD\") == 0)\n\t{\n\t\treturn dValue1 * dValue2;\n\t}\n\telse if (FXSYS_wcsicmp(sFuction,(FX_LPCWSTR)L\"MIN\") == 0)\n\t{\n\t\treturn FX_MIN(dValue1, dValue2);\n\t}\n\telse if (FXSYS_wcsicmp(sFuction,(FX_LPCWSTR)L\"MAX\") == 0)\n\t{\n\t\treturn FX_MAX(dValue1, dValue2);\n\t}\n\n\treturn dValue1;\n}\n\nCFX_WideString CJS_PublicMethods::StrLTrim(FX_LPCWSTR pStr)\n{\n\twhile (*pStr && *pStr == L' ') pStr++;\n\n\treturn pStr;\n}\n\nCFX_WideString CJS_PublicMethods::StrRTrim(FX_LPCWSTR pStr)\n{\n\tFX_LPCWSTR p = pStr;\n\twhile (*p) p++;\n\twhile (p > pStr && *(p - 1) == L' ') p--;\n\n\treturn CFX_WideString(pStr, p - pStr);\n}\n\nCFX_WideString CJS_PublicMethods::StrTrim(FX_LPCWSTR pStr)\n{\n\treturn StrRTrim(StrLTrim(pStr));\n}\n\nCFX_ByteString CJS_PublicMethods::StrLTrim(FX_LPCSTR pStr)\n{\n\twhile (*pStr && *pStr == ' ') pStr++;\n\n        return pStr;\n}\n\nCFX_ByteString CJS_PublicMethods::StrRTrim(FX_LPCSTR pStr)\n{\n\tFX_LPCSTR p = pStr;\n\twhile (*p) p++;\n\twhile (p > pStr && *(p - 1) == L' ') p--;\n\n\treturn CFX_ByteString(pStr,p-pStr);\n}\n\nCFX_ByteString CJS_PublicMethods::StrTrim(FX_LPCSTR pStr)\n{\n\treturn StrRTrim(StrLTrim(pStr));\n}\n\ndouble CJS_PublicMethods::ParseNumber(FX_LPCWSTR swSource, FX_BOOL& bAllDigits, FX_BOOL& bDot, FX_BOOL& bSign, FX_BOOL& bKXJS)\n{\n\tbDot = FALSE;\n\tbSign = FALSE;\n\tbKXJS = FALSE;\n\n\tFX_BOOL bDigitExist = FALSE;\n\n\tFX_LPCWSTR p = swSource;\n\twchar_t c;\n\n\tFX_LPCWSTR pStart = NULL;\n\tFX_LPCWSTR pEnd = NULL;\n\n\twhile ((c = *p))\n\t{\n\t\tif (!pStart && c != L' ')\n\t\t{\n\t\t\tpStart = p;\n\t\t}\n\n\t\tpEnd = p;\n\t\tp++;\n\t}\n\n\tif (!pStart)\n\t{\n\t\tbAllDigits = FALSE;\n\t\treturn 0;\n\t}\n\n\twhile (pEnd != pStart)\n\t{\n\t\tif (*pEnd == L' ')\n\t\t\tpEnd --;\n\t\telse\n\t\t\tbreak;\n\t}\n\n\tdouble dRet = 0;\n\tp = pStart;\n\tbAllDigits = TRUE;\n\tCFX_WideString swDigits;\n\n\twhile (p <= pEnd)\n\t{\t\n\t\tc = *p;\n\n\t\tif (IsDigit(c))\n\t\t{\n\t\t\tswDigits += c;\n\t\t\tbDigitExist = TRUE;\n\t\t}\n\t\telse \n\t\t{\n\t\t\tswitch (c)\n\t\t\t{\n\t\t\tcase L' ':\n\t\t\t\tbAllDigits = FALSE;\n\t\t\t\tbreak;\n\t\t\tcase L'.':\n\t\t\tcase L',':\n\t\t\t\tif (!bDot)\n\t\t\t\t{\n\t\t\t\t\tif (bDigitExist)\n\t\t\t\t\t{\n\t\t\t\t\t\tswDigits += L'.';\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tswDigits += L'0';\n\t\t\t\t\t\tswDigits += L'.';\n\t\t\t\t\t\tbDigitExist = TRUE;\n\t\t\t\t\t}\n\n\t\t\t\t\tbDot = TRUE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\tcase 'e':\n\t\t\tcase 'E':\n\t\t\t\tif (!bKXJS)\n\t\t\t\t{\n\t\t\t\t\tp++;\n\t\t\t\t\tc = *p;\n\t\t\t\t\tif (c == '+' || c == '-')\n\t\t\t\t\t{\n\t\t\t\t\t\tbKXJS = TRUE;\n\t\t\t\t\t\tswDigits += 'e';\n\t\t\t\t\t\tswDigits += c;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\tcase L'-':\n\t\t\t\tif (!bDigitExist && !bSign)\n\t\t\t\t{\n\t\t\t\t\tswDigits += c;\n\t\t\t\t\tbSign = TRUE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tbAllDigits = FALSE;\n\n\t\t\t\tif (p != pStart && !bDot && bDigitExist)\n\t\t\t\t{\n\t\t\t\t\tswDigits += L'.';\n\t\t\t\t\tbDot = TRUE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tbDot = FALSE;\n\t\t\t\t\tbDigitExist = FALSE;\n\t\t\t\t\tswDigits = L\"\";\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tp++;\n\t}\n\n\tif (swDigits.GetLength() > 0 && swDigits.GetLength() < 17)\n\t{\n\t\tCFX_ByteString sDigits = swDigits.UTF8Encode();\n\n\t\tif (bKXJS)\n\t\t{\n\t\t\tdRet = atof(sDigits);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (bDot)\n\t\t\t{\n\t\t\t\tchar* pStopString;\n\t\t\t\tdRet = ::strtod(sDigits, &pStopString);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tdRet = atol(sDigits);\n\t\t\t}\n\t\t}\n\n\t}\n\n\treturn dRet;\n}\n\ndouble CJS_PublicMethods::ParseStringToNumber(FX_LPCWSTR swSource)\n{\n\tFX_BOOL bAllDigits = FALSE;\n\tFX_BOOL bDot = FALSE;\n\tFX_BOOL bSign = FALSE;\n\tFX_BOOL bKXJS = FALSE;\n\n\treturn ParseNumber(swSource, bAllDigits, bDot, bSign, bKXJS);\n}\n\nFX_BOOL\tCJS_PublicMethods::ConvertStringToNumber(FX_LPCWSTR swSource, double & dRet, FX_BOOL & bDot)\n{\n\tFX_BOOL bAllDigits = FALSE;\n\tFX_BOOL bSign = FALSE;\n\tFX_BOOL bKXJS = FALSE;\n\n\tdRet = ParseNumber(swSource, bAllDigits, bDot, bSign, bKXJS);\n\n\treturn bAllDigits;\n}\n\nCJS_Array CJS_PublicMethods::AF_MakeArrayFromList(v8::Isolate* isolate, CJS_Value val)\n{\n\tCJS_Array StrArray(isolate);\n\tif(val.IsArrayObject())\n\t{\n\t\tval.ConvertToArray(StrArray);\n\t\treturn StrArray;\n\t}\n\tCFX_WideString wsStr = val.operator CFX_WideString();\n\tCFX_ByteString t = CFX_ByteString::FromUnicode(wsStr);\n\tconst char * p = (const char *)t;\n\n\n\tint ch = ',' ;\n\tint nIndex = 0;\n\n\twhile (*p)\n\t{\n\t\tconst char * pTemp = strchr(p, ch);\n\t\tif (pTemp == NULL)\n\t\t{\n\t\t\tStrArray.SetElement(nIndex, CJS_Value(isolate,(FX_LPCSTR)StrTrim(p)));\n\t\t\tbreak;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tchar * pSub = new char[pTemp - p + 1];\n\t\t\tstrncpy(pSub, p, pTemp - p);\n\t\t\t*(pSub + (pTemp - p)) = '\\0';\n\n\t\t\tStrArray.SetElement(nIndex, CJS_Value(isolate,(FX_LPCSTR)StrTrim(pSub)));\n\t\t\tdelete []pSub;\n\t\t\t\n\t\t\tnIndex ++;\n\t\t\tp = ++pTemp;\n\t\t}\n\t\t\n\t}\n\treturn StrArray;\n}\n\nint CJS_PublicMethods::ParseStringInteger(const CFX_WideString& string,int nStart,int& nSkip, int nMaxStep)\n{\n\tint nRet = 0;\n\tnSkip = 0;\n\tfor (int i=nStart, sz=string.GetLength(); i < sz; i++)\n\t{\n\t\tif (i-nStart > 10)\n\t\t\tbreak;\n\n\t\tFX_WCHAR c = string.GetAt(i);\n\t\tif (IsDigit((wchar_t)c))\n\t\t{\n\t\t\tnRet = nRet * 10 + (c - '0');\n\t\t\tnSkip = i - nStart + 1;\n\t\t\tif (nSkip >= nMaxStep) \n\t\t\t\tbreak;\n\t\t}\n\t\telse\n\t\t\tbreak;\n\t}\n\n\treturn nRet;\n}\n\nCFX_WideString CJS_PublicMethods::ParseStringString(const CFX_WideString& string, int nStart, int& nSkip)\n{\n\tCFX_WideString swRet;\n\tnSkip = 0;\n\tfor (int i=nStart, sz=string.GetLength(); i < sz; i++)\n\t{\n\t\tFX_WCHAR c = string.GetAt(i);\n\t\tif ((c >= L'a' && c <= L'z') || (c >= L'A' && c <= L'Z'))\n\t\t{\n\t\t\tswRet += c;\n\t\t\tnSkip = i - nStart + 1;\n\t\t}\n\t\telse\n\t\t\tbreak;\n\t}\n\n\treturn swRet;\n}\n\ndouble CJS_PublicMethods::ParseNormalDate(const CFX_WideString & value, FX_BOOL& bWrongFormat)\n{\n\tdouble dt = JS_GetDateTime();\n\n\tint nYear = JS_GetYearFromTime(dt);\n\tint nMonth = JS_GetMonthFromTime(dt) + 1;\n\tint nDay = JS_GetDayFromTime(dt);\n\tint nHour = JS_GetHourFromTime(dt);\n\tint nMin = JS_GetMinFromTime(dt);\n\tint nSec = JS_GetSecFromTime(dt);\n\n\tint number[3];\n\n\tint nSkip = 0;\n\tint nLen = value.GetLength();\n\tint nIndex = 0;\n\tint i = 0;\n\twhile (i < nLen)\n\t{\n\t\tif (nIndex > 2) break;\n\n\t\tFX_WCHAR c = value.GetAt(i);\n\t\tif (IsDigit((wchar_t)c))\n\t\t{\n\t\t\tnumber[nIndex++] = ParseStringInteger(value, i, nSkip, 4);\n\t\t\ti += nSkip;\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\ti ++;\n\t\t}\n\t}\n\n\tif (nIndex == 2)\n\t{\n\t\t// case2: month/day\n\t\t// case3: day/month\n\t\tif ((number[0] >= 1 && number[0] <= 12) && (number[1] >= 1 && number[1] <= 31))\n\t\t{\n\t\t\tnMonth = number[0];\n\t\t\tnDay = number[1];\n\t\t}\n\t\telse if ((number[0] >= 1 && number[0] <= 31) && (number[1] >= 1 && number[1] <= 12))\n\t\t{\n\t\t\tnDay = number[0];\n\t\t\tnMonth = number[1];\n\t\t}\n\n\t\tbWrongFormat = FALSE;\n\t}\n\telse if (nIndex == 3)\n\t{\n\t\t// case1: year/month/day\n\t\t// case2: month/day/year\n\t\t// case3: day/month/year\n\n\t\tif (number[0] > 12 && (number[1] >= 1 && number[1] <= 12) && (number[2] >= 1 && number[2] <= 31))\n\t\t{\n\t\t\tnYear = number[0];\n\t\t\tnMonth = number[1];\n\t\t\tnDay = number[2];\n\t\t}\n\t\telse if ((number[0] >= 1 && number[0] <= 12) && (number[1] >= 1 && number[1] <= 31) && number[2] > 31)\n\t\t{\n\t\t\tnMonth = number[0];\n\t\t\tnDay = number[1];\n\t\t\tnYear = number[2];\n\t\t}\n\t\telse if ((number[0] >= 1 && number[0] <= 31) && (number[1] >= 1 && number[1] <= 12) && number[2] > 31)\n\t\t{\n\t\t\tnDay = number[0];\n\t\t\tnMonth = number[1];\n\t\t\tnYear = number[2];\n\t\t}\n\n\t\tbWrongFormat = FALSE;\n\t}\n\telse\n\t{\n\t\tbWrongFormat = TRUE;\n\t\treturn dt;\n\t}\n\n\tCFX_WideString swTemp;\n\tswTemp.Format((FX_LPCWSTR)L\"%d/%d/%d %d:%d:%d\",nMonth,nDay,nYear,nHour,nMin,nSec);\n\treturn JS_DateParse(swTemp);\n}\n\ndouble CJS_PublicMethods::MakeRegularDate(const CFX_WideString & value, const CFX_WideString & format, FX_BOOL& bWrongFormat)\n{\n\tdouble dt = JS_GetDateTime();\n\n\tif (format.IsEmpty() || value.IsEmpty())\n\t\treturn dt;\n\n\tint nYear = JS_GetYearFromTime(dt);\n\tint nMonth = JS_GetMonthFromTime(dt) + 1;\n\tint nDay = JS_GetDayFromTime(dt);\n\tint nHour = JS_GetHourFromTime(dt);\n\tint nMin = JS_GetMinFromTime(dt);\n\tint nSec = JS_GetSecFromTime(dt);\n\n\tint nYearSub = 99; //nYear - 2000;\n\n\tFX_BOOL bPm = FALSE;\n\tFX_BOOL bExit = FALSE;\n\tbWrongFormat = FALSE;\n\n\tint i=0;\n\tint j=0;\n\n\twhile (i < format.GetLength())\n\t{\n\t\tif (bExit) break;\n\n\t\tFX_WCHAR c = format.GetAt(i);\n\t\tswitch (c)\n\t\t{\n\t\t\tcase ':':\n\t\t\tcase '.':\n\t\t\tcase '-':\n\t\t\tcase '\\\\':\n\t\t\tcase '/':\n\t\t\t\ti++;\n\t\t\t\tj++;\n\t\t\t\tbreak;\n\n\t\t\tcase 'y':\n\t\t\tcase 'm':\n\t\t\tcase 'd':\n\t\t\tcase 'H':\n\t\t\tcase 'h':\n\t\t\tcase 'M':\n\t\t\tcase 's':\n\t\t\tcase 't':\n\t\t\t\t{\n\t\t\t\t\tint oldj = j;\n\t\t\t\t\tint nSkip = 0;\n\t\t\t\t\tint remaining = format.GetLength() - i - 1;\n\n\t\t\t\t\tif (remaining == 0 || format.GetAt(i+1) != c)\n\t\t\t\t\t{\n\t\t\t\t\t\tswitch (c)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase 'y':\n\t\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t\t\tj++;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'm':\n\t\t\t\t\t\t\t\tnMonth = ParseStringInteger(value, j, nSkip, 2);\n\t\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t\t\tj += nSkip;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'd':\n\t\t\t\t\t\t\t\tnDay = ParseStringInteger(value, j, nSkip, 2);\n\t\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t\t\tj += nSkip;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'H':\n\t\t\t\t\t\t\t\tnHour = ParseStringInteger(value, j, nSkip, 2);\n\t\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t\t\tj += nSkip;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'h':\n\t\t\t\t\t\t\t\tnHour = ParseStringInteger(value, j, nSkip, 2);\n\t\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t\t\tj += nSkip;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'M':\n\t\t\t\t\t\t\t\tnMin = ParseStringInteger(value, j, nSkip, 2);\n\t\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t\t\tj += nSkip;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 's':\n\t\t\t\t\t\t\t\tnSec = ParseStringInteger(value, j, nSkip, 2);\n\t\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t\t\tj += nSkip;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 't':\n\t\t\t\t\t\t\t\tbPm = (j < value.GetLength() && value.GetAt(j) == 'p');\n\t\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t\t\tj++;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (remaining == 1 || format.GetAt(i+2) != c)\n\t\t\t\t\t{\n\t\t\t\t\t\tswitch (c)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase 'y':\n\t\t\t\t\t\t\t\tnYear = ParseStringInteger(value, j, nSkip, 4);\n\t\t\t\t\t\t\t\ti += 2;\n\t\t\t\t\t\t\t\tj += nSkip;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'm':\n\t\t\t\t\t\t\t\tnMonth = ParseStringInteger(value, j, nSkip, 2);\n\t\t\t\t\t\t\t\ti += 2;\n\t\t\t\t\t\t\t\tj += nSkip;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'd':\n\t\t\t\t\t\t\t\tnDay = ParseStringInteger(value, j, nSkip, 2);\n\t\t\t\t\t\t\t\ti += 2;\n\t\t\t\t\t\t\t\tj += nSkip;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'H':\n\t\t\t\t\t\t\t\tnHour = ParseStringInteger(value, j, nSkip, 2);\n\t\t\t\t\t\t\t\ti += 2;\n\t\t\t\t\t\t\t\tj += nSkip;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'h':\n\t\t\t\t\t\t\t\tnHour = ParseStringInteger(value, j, nSkip, 2);\n\t\t\t\t\t\t\t\ti += 2;\n\t\t\t\t\t\t\t\tj += nSkip;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'M':\n\t\t\t\t\t\t\t\tnMin = ParseStringInteger(value, j, nSkip, 2);\n\t\t\t\t\t\t\t\ti += 2;\n\t\t\t\t\t\t\t\tj += nSkip;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 's':\n\t\t\t\t\t\t\t\tnSec = ParseStringInteger(value, j, nSkip, 2);\n\t\t\t\t\t\t\t\ti += 2;\n\t\t\t\t\t\t\t\tj += nSkip;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 't':\n\t\t\t\t\t\t\t\tbPm = (j + 1 < value.GetLength() && value.GetAt(j) == 'p' && value.GetAt(j+1) == 'm');\n\t\t\t\t\t\t\t\ti += 2;\n\t\t\t\t\t\t\t\tj += 2;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (remaining == 2 || format.GetAt(i+3) != c)\n\t\t\t\t\t{\n\t\t\t\t\t\tswitch (c)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase 'm':\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tCFX_WideString sMonth = ParseStringString(value, j, nSkip);\n\t\t\t\t\t\t\t\t\tFX_BOOL bFind = FALSE;\n\t\t\t\t\t\t\t\t\tfor (int m = 0; m < 12; m++)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tif (sMonth.CompareNoCase(months[m]) == 0)\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tnMonth = m + 1;\n\t\t\t\t\t\t\t\t\t\t\ti+=3;\n\t\t\t\t\t\t\t\t\t\t\tj+=nSkip;\n\t\t\t\t\t\t\t\t\t\t\tbFind = TRUE;\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif (!bFind)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tnMonth = ParseStringInteger(value, j, nSkip, 3);\n\t\t\t\t\t\t\t\t\t\ti+=3;\n\t\t\t\t\t\t\t\t\t\tj += nSkip;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'y':\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\ti+=3;\n\t\t\t\t\t\t\t\tj+=3;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (remaining == 3 || format.GetAt(i+4) != c)\n\t\t\t\t\t{\n\t\t\t\t\t\tswitch (c)\n\t\t\t\t\t\t{\n\n\n\t\t\t\t\t\t\tcase 'y':\n\t\t\t\t\t\t\t\tnYear = ParseStringInteger(value, j, nSkip, 4);\n\t\t\t\t\t\t\t\tj += nSkip;\n\t\t\t\t\t\t\t\ti += 4;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'm':\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tFX_BOOL bFind = FALSE;\n\n\t\t\t\t\t\t\t\t\tCFX_WideString sMonth = ParseStringString(value, j, nSkip);\n\t\t\t\t\t\t\t\t\tsMonth.MakeLower();\n\n\t\t\t\t\t\t\t\t\tfor (int m = 0; m < 12; m++)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tCFX_WideString sFullMonths = fullmonths[m];\n\t\t\t\t\t\t\t\t\t\tsFullMonths.MakeLower();\n\n\t\t\t\t\t\t\t\t\t\tif (sFullMonths.Find(sMonth, 0) != -1)\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tnMonth = m + 1;\n\t\t\t\t\t\t\t\t\t\t\ti += 4;\n\t\t\t\t\t\t\t\t\t\t\tj += nSkip;\n\t\t\t\t\t\t\t\t\t\t\tbFind = TRUE;\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif (!bFind)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tnMonth = ParseStringInteger(value, j, nSkip, 4);\n\t\t\t\t\t\t\t\t\t\ti+=4;\n\t\t\t\t\t\t\t\t\t\tj += nSkip;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\ti += 4;\n\t\t\t\t\t\t\t\tj += 4;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (j >= value.GetLength() || format.GetAt(i) != value.GetAt(j))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbWrongFormat = TRUE;\n\t\t\t\t\t\t\tbExit = TRUE;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tj++;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (oldj == j)\n\t\t\t\t\t{\n\t\t\t\t\t\tbWrongFormat = TRUE;\n\t\t\t\t\t\tbExit = TRUE;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tif (value.GetLength() <= j)\n\t\t\t\t{\n\t\t\t\t\tbExit = TRUE;\n\t\t\t\t}\n\t\t\t\telse if (format.GetAt(i) != value.GetAt(j))\n\t\t\t\t{\n\t\t\t\t\tbWrongFormat = TRUE;\n\t\t\t\t\tbExit = TRUE;\n\t\t\t\t}\n\n\t\t\t\ti++;\n\t\t\t\tj++;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (bPm) nHour += 12;\n\n\tif (nYear >= 0 && nYear <= nYearSub)\n\t\tnYear += 2000;\n\n\tif (nMonth < 1 || nMonth > 12)\n\t\tbWrongFormat = TRUE;\n\n\tif (nDay < 1 || nDay > 31)\n\t\tbWrongFormat = TRUE;\n\n\tif (nHour < 0 || nHour > 24)\n\t\tbWrongFormat = TRUE;\n\n\tif (nMin < 0 || nMin > 60)\n\t\tbWrongFormat = TRUE;\n\n\tif (nSec < 0 || nSec > 60)\n\t\tbWrongFormat = TRUE;\n\n\tdouble dRet = 0;\n\n\tif (bWrongFormat)\n\t{\n\t\tdRet = ParseNormalDate(value, bWrongFormat);\n\t}\n\telse\n\t{\n\t\tdRet = JS_MakeDate(JS_MakeDay(nYear,nMonth - 1,nDay),JS_MakeTime(nHour, nMin, nSec, 0));\n\n\t\tif (JS_PortIsNan(dRet))\n\t\t{\n\t\t\tdRet = JS_DateParse(value);\n\t\t}\n\t}\n\n\tif (JS_PortIsNan(dRet))\n\t{\n\t\tdRet = ParseNormalDate(value, bWrongFormat);\n\t}\n\n\treturn dRet;\n\n}\n\nCFX_WideString CJS_PublicMethods::MakeFormatDate(double dDate, const CFX_WideString & format)\n{\n\tCFX_WideString sRet = L\"\",sPart = L\"\";\n\n\tint nYear = JS_GetYearFromTime(dDate);\n\tint nMonth = JS_GetMonthFromTime(dDate) + 1;\n\tint nDay = JS_GetDayFromTime(dDate);\n\tint nHour = JS_GetHourFromTime(dDate);\n\tint nMin = JS_GetMinFromTime(dDate);\n\tint nSec = JS_GetSecFromTime(dDate);\n\n\tint i = 0;\n\twhile (i < format.GetLength())\n\t{\n\t        FX_WCHAR c = format.GetAt(i);\n                int remaining = format.GetLength() - i - 1;\n\t\tsPart = L\"\";\n\t\tswitch (c)\n\t\t{\n\t\t\tcase 'y':\n\t\t\tcase 'm':\n\t\t\tcase 'd':\n\t\t\tcase 'H':\n\t\t\tcase 'h':\n\t\t\tcase 'M':\n\t\t\tcase 's':\n\t\t\tcase 't':\n\t\t\t\tif (remaining == 0 || format.GetAt(i+1) != c)\n\t\t\t\t{\n\t\t\t\t\tswitch (c)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 'y':\n\t\t\t\t\t\t\tsPart += c;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'm':\n\t\t\t\t\t\t\tsPart.Format((FX_LPCWSTR)L\"%d\",nMonth);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'd':\n\t\t\t\t\t\t\tsPart.Format((FX_LPCWSTR)L\"%d\",nDay);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'H':\n\t\t\t\t\t\t\tsPart.Format((FX_LPCWSTR)L\"%d\",nHour);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'h':\n\t\t\t\t\t\t\tsPart.Format((FX_LPCWSTR)L\"%d\",nHour>12?nHour - 12:nHour);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'M':\n\t\t\t\t\t\t\tsPart.Format((FX_LPCWSTR)L\"%d\",nMin);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 's':\n\t\t\t\t\t\t\tsPart.Format((FX_LPCWSTR)L\"%d\",nSec);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 't':\n\t\t\t\t\t\t\tsPart += nHour>12?'p':'a';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t\telse if (remaining == 1 || format.GetAt(i+2) != c)\n\t\t\t\t{\n\t\t\t\t\tswitch (c)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 'y':\n\t\t\t\t\t\t\tsPart.Format((FX_LPCWSTR)L\"%02d\",nYear - (nYear / 100) * 100);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'm':\n\t\t\t\t\t\t\tsPart.Format((FX_LPCWSTR)L\"%02d\",nMonth);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'd':\n\t\t\t\t\t\t\tsPart.Format((FX_LPCWSTR)L\"%02d\",nDay);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'H':\n\t\t\t\t\t\t\tsPart.Format((FX_LPCWSTR)L\"%02d\",nHour);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'h':\n\t\t\t\t\t\t\tsPart.Format((FX_LPCWSTR)L\"%02d\",nHour>12?nHour - 12:nHour);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'M':\n\t\t\t\t\t\t\tsPart.Format((FX_LPCWSTR)L\"%02d\",nMin);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 's':\n\t\t\t\t\t\t\tsPart.Format((FX_LPCWSTR)L\"%02d\",nSec);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 't':\n\t\t\t\t\t\t\tsPart = nHour>12? (FX_LPCWSTR)L\"pm\": (FX_LPCWSTR)L\"am\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\ti+=2;\n\t\t\t\t}\n\t\t\t\telse if (remaining == 2 || format.GetAt(i+3) != c)\n\t\t\t\t{\n\t\t\t\t\tswitch (c)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 'm':\n\t\t\t\t\t\t\ti+=3;\n\t\t\t\t\t\t\tif (nMonth > 0&&nMonth <= 12)\n\t\t\t\t\t\t\t\tsPart += months[nMonth - 1];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\ti+=3;\n\t\t\t\t\t\t\tsPart += c;\n\t\t\t\t\t\t\tsPart += c;\n\t\t\t\t\t\t\tsPart += c;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (remaining == 3 || format.GetAt(i+4) != c)\n\t\t\t\t{\n\t\t\t\t\tswitch (c)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 'y':\n\t\t\t\t\t\t\tsPart.Format((FX_LPCWSTR)L\"%04d\",nYear);\n\t\t\t\t\t\t\ti += 4;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'm':\n\t\t\t\t\t\t\ti+=4;\n\t\t\t\t\t\t\tif (nMonth > 0&&nMonth <= 12)\n\t\t\t\t\t\t\t\tsPart += fullmonths[nMonth - 1];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\ti += 4;\n\t\t\t\t\t\t\tsPart += c;\n\t\t\t\t\t\t\tsPart += c;\n\t\t\t\t\t\t\tsPart += c;\n\t\t\t\t\t\t\tsPart += c;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ti++;\n\t\t\t\t\tsPart += c;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\ti++;\n\t\t\t\tsPart += c;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tsRet += sPart;\n\t}\n\n\treturn sRet;\n}\n\n/* -------------------------------------------------------------------------- */\n\n//function AFNumber_Format(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend)\nFX_BOOL CJS_PublicMethods::AFNumber_Format(OBJ_METHOD_PARAMS)\n{\n#if _FX_OS_ != _FX_ANDROID_\n\tv8::Isolate* isolate = ::GetIsolate(cc);\n\tCJS_Context* pContext = (CJS_Context *)cc;\n\tASSERT(pContext != NULL);\n\tCJS_EventHandler* pEvent = pContext->GetEventHandler();\n\tASSERT(pEvent != NULL);\n\n\tif (params.size() != 6)\n\t{\n\t\tsError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);\n\t\treturn FALSE;\n\t}\n\tif(!pEvent->m_pValue)\n\t\treturn FALSE;\n\tCFX_WideString& Value = pEvent->Value();\t\n\tCFX_ByteString strValue = StrTrim(CFX_ByteString::FromUnicode(Value));\n\t\n\tif (strValue.IsEmpty()) return TRUE;\n\t\n\tint iDec = params[0];\n\tint iSepStyle = params[1];\n\tint iNegStyle = params[2];\n\tint icurrStyle = params[3]; //it's no use!\n\tstd::wstring wstrCurrency(params[4].operator CFX_WideString());\n\tFX_BOOL bCurrencyPrepend = params[5];\n\t\n\tif (iDec < 0) iDec = -iDec;\n\t\n\tif (iSepStyle < 0 || iSepStyle > 3)\n\t\tiSepStyle = 0;\n\t\n\tif (iNegStyle < 0 || iNegStyle > 3)\n\t\tiNegStyle = 0;\n\t\n\t\n\t//////////////////////////////////////////////////////\n\t//for processing decimal places\n\tstrValue.Replace(\",\", \".\");\n\tdouble dValue = atof(strValue);\n\tif (iDec > 0)\n\t\tdValue += DOUBLE_CORRECT;//\n\t\t    \n\tint iDec2;\n\tFX_BOOL bNagative = FALSE;\n\n\tstrValue = fcvt(dValue,iDec,&iDec2,&bNagative);\n\tif (strValue.IsEmpty())\n\t{\n\t\tdValue = 0;\n\t\tstrValue = fcvt(dValue,iDec,&iDec2,&bNagative);\n\t\tif (strValue.IsEmpty())\n\t\t{\n\t\t\tstrValue = \"0\";\n\t\t\tiDec2 = 1;\n\t\t}\n\n\t}\n\n\tif (iDec2 < 0)\n\t{\n\t\tfor (int iNum = 0;iNum < abs(iDec2);iNum++)\n\t\t{\n\t\t\tstrValue = \"0\" + strValue;\n\t\t}\n\t\tiDec2 = 0;\n\t\t\n\t}\n\tint iMax = strValue.GetLength();\n\tif (iDec2 > iMax)\n\t{\n\t\tfor (int iNum = 0;iNum <= iDec2 - iMax ;iNum++)\n\t\t{\n\t\t\tstrValue += \"0\";\n\t\t}\n\t\tiMax = iDec2+1;\t\t\t\n\t}\n\t///////////////////////////////////////////////////////\n    //for processing seperator style\n\tif (iDec2 < iMax)\n\t{\n\t\tif (iSepStyle == 0 || iSepStyle == 1)\n\t\t{\n\t\t\tstrValue.Insert(iDec2, '.');\n\t\t\tiMax++;\n\t\t}\n\t\telse if (iSepStyle == 2 || iSepStyle == 3)\n\t\t{\n\t\t\tstrValue.Insert(iDec2, ',');\n\t\t\tiMax++;\n\t\t}\n\t\t\n\t\tif (iDec2 == 0)\n\t\t\tstrValue.Insert(iDec2, '0');\n\t}\n\tif (iSepStyle == 0 || iSepStyle == 2)\n\t{\n\t\tchar cSeperator;\n\t\tif (iSepStyle == 0)\n\t\t\tcSeperator = ',';\n\t\telse\n\t\t\tcSeperator = '.';\n\t\t\n\t\tint iDecPositive,iDecNagative;\n\t\tiDecPositive = iDec2;\n\t\tiDecNagative = iDec2;\t\t\n\t\t\n\t\tfor (iDecPositive = iDec2 -3; iDecPositive > 0;iDecPositive -= 3)\n\t\t{\n\t\t\tstrValue.Insert(iDecPositive, cSeperator);\n\t\t\tiMax++;\n\t\t}\n\t}\n\t\n\t//////////////////////////////////////////////////////////////////////\n    //for processing currency string\n\n\tValue = CFX_WideString::FromLocal(strValue);\n\t\n\tstd::wstring strValue2(Value);\n\n\tif (bCurrencyPrepend)\n\t\tstrValue2 = wstrCurrency + strValue2;\n\telse\n\t\tstrValue2 = strValue2 + wstrCurrency;\n\t\n\t\n\t\n\t/////////////////////////////////////////////////////////////////////////\n\t//for processing negative style\n\tif (bNagative)\n\t{\n\t\tif (iNegStyle == 0)\n\t\t{\n\t\t\tstrValue2.insert(0,L\"-\");\n\t\t}\n\t\tif (iNegStyle == 2 || iNegStyle == 3)\n\t\t{\n\t\t\tstrValue2.insert(0,L\"(\");\n\t\t\tstrValue2.insert(strValue2.length(),L\")\");\n\t\t}\n\t\tif (iNegStyle == 1 || iNegStyle == 3)\n\t\t{\n\t\t\tif (Field * fTarget = pEvent->Target_Field())\n\t\t\t{\n\t\t\t\tCJS_Array arColor(isolate);\n\t\t\t\tCJS_Value vColElm(isolate);\n\t\t\t\tvColElm = L\"RGB\";\n\t\t\t\tarColor.SetElement(0,vColElm);\n\t\t\t\tvColElm = 1;\n\t\t\t\tarColor.SetElement(1,vColElm);\n\t\t\t\tvColElm = 0;\n\t\t\t\tarColor.SetElement(2,vColElm);\n\t\t\t\t\n\t\t\t\tarColor.SetElement(3,vColElm);\n\t\t\t\t\n\t\t\t\tCJS_PropValue vProp(isolate);\n\t\t\t\tvProp.StartGetting();\n\t\t\t\tvProp<<arColor;\n\t\t\t\tvProp.StartSetting();\n\t\t\t\tfTarget->textColor(cc,vProp,sError);// red\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (iNegStyle == 1 || iNegStyle == 3)\n\t\t{\n\t\t\tif (Field *fTarget = pEvent->Target_Field())\n\t\t\t{\n\t\t\t\tCJS_Array arColor(isolate);\n\t\t\t\tCJS_Value vColElm(isolate);\n\t\t\t\tvColElm = L\"RGB\";\n\t\t\t\tarColor.SetElement(0,vColElm);\n\t\t\t\tvColElm = 0;\n\t\t\t\tarColor.SetElement(1,vColElm);\n\t\t\t\tarColor.SetElement(2,vColElm);\n\t\t\t\tarColor.SetElement(3,vColElm);\n\t\t\t\t\n\t\t\t\tCJS_PropValue vProp(isolate);\n\t\t\t\tvProp.StartGetting();\n\t\t\t\tfTarget->textColor(cc,vProp,sError);\n\t\t\t\t\n\t\t\t\tCJS_Array aProp(isolate);\n\t\t\t\tvProp.ConvertToArray(aProp);\n\n\t\t\t\tCPWL_Color crProp;\n\t\t\t\tCPWL_Color crColor;\n\t\t\t\tcolor::ConvertArrayToPWLColor(aProp, crProp);\n\t\t\t\tcolor::ConvertArrayToPWLColor(arColor, crColor);\n\n\t\t\t\tif (crColor != crProp)\n\t\t\t\t{\n\t\t\t\t\tCJS_PropValue vProp2(isolate);\n\t\t\t\t\tvProp2.StartGetting();\n\t\t\t\t\tvProp2<<arColor;\n\t\t\t\t\tvProp2.StartSetting();\n     \t\t\t\tfTarget->textColor(cc,vProp2,sError);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tValue = strValue2.c_str();\n#endif\n\treturn TRUE;\n}\n\n//function AFNumber_Keystroke(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend)\nFX_BOOL CJS_PublicMethods::AFNumber_Keystroke(OBJ_METHOD_PARAMS)\n{\n\tCJS_Context* pContext = (CJS_Context *)cc;\n\tASSERT(pContext != NULL);\n\tCJS_EventHandler* pEvent = pContext->GetEventHandler();\n\tASSERT(pEvent != NULL);\n\t\n\tif(params.size() < 2)\n\t\treturn FALSE;\n\tint iSepStyle = params[1];\n\t\n\tif (iSepStyle < 0 || iSepStyle > 3)\n\t\tiSepStyle = 0;\n\tif(!pEvent->m_pValue)\n\t\treturn FALSE;\n\tCFX_WideString & val = pEvent->Value();\t\n\tCFX_WideString & w_strChange = pEvent->Change();\n    CFX_WideString w_strValue = val;\n\n\tif (pEvent->WillCommit())\n\t{\n\t\tCFX_WideString wstrChange = w_strChange;\n\t\tCFX_WideString wstrValue = StrLTrim(w_strValue);\n\t\tif (wstrValue.IsEmpty())\n\t\t\treturn TRUE;\n\t\t\n\t\tCFX_WideString swTemp = wstrValue;\n\t\tswTemp.Replace((FX_LPCWSTR)L\",\", (FX_LPCWSTR)L\".\");\n\t\tif (!IsNumber(swTemp)) //!(IsNumber(wstrChange) && \n\t\t{\n\t\t\tpEvent->Rc() = FALSE;\n\t\t\tsError = JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE);\n\t\t\tAlert(pContext, sError);\n\t\t\treturn TRUE;\n\t\t}\n\t\treturn TRUE; // it happens after the last keystroke and before validating,\n\t}\n\t\n\tstd::wstring w_strValue2 (w_strValue);\n\tstd::wstring w_strChange2(w_strChange);\n\t\n\tstd::wstring w_strSelected;\n\tif(-1 != pEvent->SelStart())\n\t\tw_strSelected = w_strValue2.substr(pEvent->SelStart(),(pEvent->SelEnd() - pEvent->SelStart()));\n\tFX_BOOL bHasSign = (w_strValue2.find('-') != -1) && (w_strSelected.find('-') == -1);\n\tif (bHasSign)\n\t{\n\t\t//can't insert \"change\" in front to sign postion.\n\t\tif (pEvent->SelStart() == 0)\n\t\t{\n            FX_BOOL &bRc = pEvent->Rc();\n\t\t\tbRc = FALSE;\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\tchar cSep = L'.';\n\n\tswitch (iSepStyle)\n\t{\n\tcase 0:\n\tcase 1:\n\t\tcSep = L'.';\n\t\tbreak;\n\tcase 2:\n\tcase 3:\n\t\tcSep = L',';\n\t\tbreak;\n\t}\n\t\n\tFX_BOOL bHasSep = (w_strValue2.find(cSep) != -1);\n\tfor (std::wstring::iterator it = w_strChange2.begin(); it != w_strChange2.end(); it++)\n\t{\n\t\tif (*it == cSep)\n\t\t{\n\t\t\tif (bHasSep)\n\t\t\t{\n\t\t\t\tFX_BOOL &bRc = pEvent->Rc();\n\t\t\t\tbRc = FALSE;\n\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbHasSep = TRUE;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tif (*it == L'-')\n\t\t{\n\t\t\tif (bHasSign)\n\t\t\t{\n\t\t\t\tFX_BOOL &bRc = pEvent->Rc();\n\t\t\t\tbRc = FALSE;\n\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t\telse if (it != w_strChange2.begin()) //sign's position is not correct\n\t\t\t{\n\t\t\t\tFX_BOOL &bRc = pEvent->Rc();\n\t\t\t\tbRc = FALSE;\n\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t\telse if (pEvent->SelStart() != 0)\n\t\t\t{\n\t\t\t\tFX_BOOL &bRc = pEvent->Rc();\n\t\t\t\tbRc = FALSE;\n\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t\tbHasSign = TRUE;\n\t\t\tcontinue;\n\t\t}\n\t\t\n\t\tif (!IsDigit(*it))\n\t\t{\t\t\t\n\t\t\tFX_BOOL &bRc = pEvent->Rc();\n\t\t\tbRc = FALSE;\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\t\n\t\n\tstd::wstring w_prefix = w_strValue2.substr(0,pEvent->SelStart());\n\tstd::wstring w_postfix;\n\tif (pEvent->SelEnd()<(int)w_strValue2.length())\n\t\tw_postfix  = w_strValue2.substr(pEvent->SelEnd());\n\tw_strValue2 = w_prefix + w_strChange2 + w_postfix;\n\tw_strValue = w_strValue2.c_str();\n\tval = w_strValue;\n\treturn TRUE;\t\t\n\t\n}\n\n//function AFPercent_Format(nDec, sepStyle)\nFX_BOOL CJS_PublicMethods::AFPercent_Format(OBJ_METHOD_PARAMS)\n{\n#if _FX_OS_ != _FX_ANDROID_\n\tCJS_Context* pContext = (CJS_Context *)cc;\n\tASSERT(pContext != NULL);\n\tCJS_EventHandler* pEvent = pContext->GetEventHandler();\n\tASSERT(pEvent != NULL);\n\n    if (params.size() != 2)\n\t{\n\t\tsError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);\n\t\treturn FALSE;\n\t}\n\tif(!pEvent->m_pValue)\n\t\treturn FALSE;\n\tCFX_WideString& Value = pEvent->Value();\n\t\n//     HWND hMainFrame = NULL;\n// \t\n// \tCPDFSDK_FormFillApp *pApp = pContext->GetReaderApp();\n// \tASSERT(pApp);\n// \thMainFrame = pApp->GetMainFrameWnd();\n\t\t\n\tCFX_ByteString strValue = StrTrim(CFX_ByteString::FromUnicode(Value));\n\t\n\tif (strValue.IsEmpty())\n\t\treturn TRUE;\n\t\n\tint iDec = params[0];\n\tint iSepStyle = params[1];\n\t\n\t//ASSERT(iDec > 0);\n\tif (iDec < 0)\n\t\tiDec = -iDec;\n\t\n\tif (iSepStyle < 0 || iSepStyle > 3)\n\t\tiSepStyle = 0;\n\t\n\t\n\t//////////////////////////////////////////////////////\n\t//for processing decimal places\n\tdouble dValue = atof(strValue);\n\tdValue *= 100;\n\tif (iDec > 0)\n\t\tdValue += DOUBLE_CORRECT;//У\n\n\tint iDec2;\n\tFX_BOOL bNagative = FALSE;\n\tstrValue = fcvt(dValue,iDec,&iDec2,&bNagative);\n    if (strValue.IsEmpty())\n\t{\n\t\tdValue = 0;\n\t\tstrValue = fcvt(dValue,iDec,&iDec2,&bNagative);\n\t}\n\n\tif (iDec2 < 0)\n\t{\n\t\tfor (int iNum = 0; iNum < abs(iDec2); iNum++)\n\t\t{\n\t\t\tstrValue = \"0\" + strValue;\n\t\t}\n\t\tiDec2 = 0;\n\t\t\n\t}\n\tint iMax = strValue.GetLength();\n\tif (iDec2 > iMax)\n\t{\n\t\tfor (int iNum = 0; iNum <= iDec2 - iMax; iNum++)\n\t\t{\n\t\t\tstrValue += \"0\";\n\t\t}\n\t\tiMax = iDec2+1;\t\t\t\n\t}\n\t///////////////////////////////////////////////////////\n    //for processing seperator style\n\tif (iDec2 < iMax)\n\t{\n\t\tif (iSepStyle == 0 || iSepStyle == 1)\n\t\t{\n\t\t\tstrValue.Insert(iDec2, '.');\n\t\t\tiMax++;\n\t\t}\n\t\telse if (iSepStyle == 2 || iSepStyle == 3)\n\t\t{\n\t\t\tstrValue.Insert(iDec2, ',');\n\t\t\tiMax++;\n\t\t}\n\t\t\n\t\tif (iDec2 == 0)\n\t\t\tstrValue.Insert(iDec2, '0');\n\t}\n\tif (iSepStyle == 0 || iSepStyle == 2)\n\t{\n\t\tchar cSeperator;\n\t\tif (iSepStyle == 0)\n\t\t\tcSeperator = ',';\n\t\telse\n\t\t\tcSeperator = '.';\n\t\t\n\t\tint iDecPositive,iDecNagative;\n\t\tiDecPositive = iDec2;\n\t\tiDecNagative = iDec2;\n\t\t\t\n\t\tfor (iDecPositive = iDec2 -3; iDecPositive > 0; iDecPositive -= 3)\n\t\t{\n\t\t\tstrValue.Insert(iDecPositive,cSeperator);\n\t\t\tiMax++;\n\t\t}\n\t}\n\t////////////////////////////////////////////////////////////////////\n\t//nagative mark\n\tif(bNagative)\n\t\tstrValue = \"-\" + strValue;\n\tstrValue += \"%\";\n\tValue = CFX_WideString::FromLocal(strValue);\n#endif\n\treturn TRUE;\n}\n//AFPercent_Keystroke(nDec, sepStyle)\nFX_BOOL CJS_PublicMethods::AFPercent_Keystroke(OBJ_METHOD_PARAMS)\n{\n\treturn AFNumber_Keystroke(cc,params,vRet,sError);\n}\n\n//function AFDate_FormatEx(cFormat)\nFX_BOOL CJS_PublicMethods::AFDate_FormatEx(OBJ_METHOD_PARAMS)\n{\n\tCJS_Context* pContext = (CJS_Context *)cc;\n\tASSERT(pContext != NULL);\n\tCJS_EventHandler* pEvent = pContext->GetEventHandler();\n\tASSERT(pEvent != NULL);\n\n\tif (params.size() != 1)\n\t{\n\t\tsError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);\n\t\treturn FALSE;\n\t}\t\n\tif(!pEvent->m_pValue)\n\t\treturn FALSE;\n\tCFX_WideString& val = pEvent->Value();\n\t\n\tCFX_WideString strValue = val;\t\n\tif (strValue.IsEmpty()) return TRUE;\t\t\n\n\tCFX_WideString sFormat = params[0].operator CFX_WideString();\n\n\tFX_BOOL bWrongFormat = FALSE;\n\tdouble dDate = 0.0f;\n\n\tif(strValue.Find(L\"GMT\") != -1)\n\t{\n\t\t//for GMT format time\n\t\t//such as \"Tue Aug 11 14:24:16 GMT+08002009\"\n\t\tdDate = MakeInterDate(strValue);\n\t}\n\telse\n\t{\n\t\tdDate = MakeRegularDate(strValue,sFormat,bWrongFormat);\n\t}\n\n\tif (JS_PortIsNan(dDate))\n\t{\n\t\tCFX_WideString swMsg;\n\t\tswMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE), (FX_LPCWSTR)sFormat);\n\t\tAlert(pContext, swMsg);\n\t\treturn FALSE;\n\t}\n\t\n\tval =  MakeFormatDate(dDate,sFormat);\n\n\treturn TRUE;\n}\n\ndouble CJS_PublicMethods::MakeInterDate(CFX_WideString strValue)\n{\n\tint nHour;\n\tint nMin;\n\tint nSec;\n\tint nYear;\n\tint nMonth;\n\tint nDay;\n\n\tCFX_WideStringArray wsArray;\n\tCFX_WideString sMonth = L\"\";\n\tCFX_WideString sTemp = L\"\";\n\tint nSize = strValue.GetLength();\n\n\tfor(int i = 0; i < nSize; i++)\n\t{\n\t\tFX_WCHAR c = strValue.GetAt(i);\n\t\tif(c == L' ' || c == L':')\n\t\t{\t\n\t\t\twsArray.Add(sTemp);\n\t\t\tsTemp = L\"\";\n\t\t\tcontinue;\n\t\t}\n\n\t\tsTemp += c;\n\t}\n\t\n\twsArray.Add(sTemp);\n\tif(wsArray.GetSize() != 8)return 0;\n\n\tsTemp = wsArray[1];\n\tif(sTemp.Compare(L\"Jan\") == 0) nMonth = 1;\n\tif(sTemp.Compare(L\"Feb\") == 0) nMonth = 2;\n\tif(sTemp.Compare(L\"Mar\") == 0) nMonth = 3;\n\tif(sTemp.Compare(L\"Apr\") == 0) nMonth = 4;\n\tif(sTemp.Compare(L\"May\") == 0) nMonth = 5;\n\tif(sTemp.Compare(L\"Jun\") == 0) nMonth = 6;\n\tif(sTemp.Compare(L\"Jul\") == 0) nMonth = 7;\n\tif(sTemp.Compare(L\"Aug\") == 0) nMonth = 8;\n\tif(sTemp.Compare(L\"Sep\") == 0) nMonth = 9;\n\tif(sTemp.Compare(L\"Oct\") == 0) nMonth = 10;\n\tif(sTemp.Compare(L\"Nov\") == 0) nMonth = 11;\n\tif(sTemp.Compare(L\"Dec\") == 0) nMonth = 12;\n\n\tnDay = (int)ParseStringToNumber(wsArray[2]);\n\tnHour = (int)ParseStringToNumber(wsArray[3]);\n\tnMin = (int)ParseStringToNumber(wsArray[4]);\n\tnSec = (int)ParseStringToNumber(wsArray[5]);\n\tnYear = (int)ParseStringToNumber(wsArray[7]);\n\n\tdouble dRet = JS_MakeDate(JS_MakeDay(nYear,nMonth - 1,nDay),JS_MakeTime(nHour, nMin, nSec, 0));\n\n\tif (JS_PortIsNan(dRet))\n\t{\n\t\tdRet = JS_DateParse(strValue);\n\t}\n\t\n\treturn dRet;\n}\n\n//AFDate_KeystrokeEx(cFormat)\nFX_BOOL CJS_PublicMethods::AFDate_KeystrokeEx(OBJ_METHOD_PARAMS)\n{\n\tCJS_Context* pContext = (CJS_Context *)cc;\n\tASSERT(pContext != NULL);\n\tCJS_EventHandler* pEvent = pContext->GetEventHandler();\n\tASSERT(pEvent != NULL);\n\n\tif (params.size() != 1)\n\t{\n\t\tsError = L\"AFDate_KeystrokeEx's parameters' size r not correct\";\n\t\treturn FALSE;\n\t}\t\n\t\n\tif (pEvent->WillCommit())\n\t{\n\t\tif(!pEvent->m_pValue)\n\t\t\treturn FALSE;\n\t\tCFX_WideString strValue = pEvent->Value();\n\t\tif (strValue.IsEmpty()) return TRUE;\n\n\t\tCFX_WideString sFormat = params[0].operator CFX_WideString();\n\n\t\tFX_BOOL bWrongFormat = FALSE;\n\t\tdouble dRet = MakeRegularDate(strValue,sFormat,bWrongFormat);\n\t\tif (bWrongFormat || JS_PortIsNan(dRet))\n\t\t{\n\t\t\tCFX_WideString swMsg;\n\t\t\tswMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE), (FX_LPCWSTR)sFormat);\n\t\t\tAlert(pContext, swMsg);\n\t\t\tpEvent->Rc() = FALSE;\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\treturn TRUE;\n}\n\nFX_BOOL CJS_PublicMethods::AFDate_Format(OBJ_METHOD_PARAMS)\n{\n\tv8::Isolate* isolate = ::GetIsolate(cc);\n\n\tif (params.size() != 1)\n\t{\n\t\tCJS_Context* pContext = (CJS_Context*)cc;\n\t\tASSERT(pContext != NULL);\n\n\t\tsError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);\n\t\treturn FALSE;\n\t}\n\n\tint iIndex = params[0];\n\tFX_LPCWSTR cFormats[] =  {(FX_LPCWSTR)L\"m/d\", (FX_LPCWSTR)L\"m/d/yy\", (FX_LPCWSTR)L\"mm/dd/yy\", (FX_LPCWSTR)L\"mm/yy\", (FX_LPCWSTR)L\"d-mmm\", (FX_LPCWSTR)L\"d-mmm-yy\", (FX_LPCWSTR)L\"dd-mmm-yy\",\n\t\t(FX_LPCWSTR)L\"yy-mm-dd\", (FX_LPCWSTR)L\"mmm-yy\", (FX_LPCWSTR)L\"mmmm-yy\", (FX_LPCWSTR)L\"mmm d, yyyy\", (FX_LPCWSTR)L\"mmmm d, yyyy\",\n\t\t(FX_LPCWSTR)L\"m/d/yy h:MM tt\", (FX_LPCWSTR)L\"m/d/yy HH:MM\" };\n\n\tASSERT(iIndex < sizeof(cFormats)/sizeof(FX_LPCWSTR));\n\n\tif (iIndex < 0)\n\t\tiIndex = 0;\n\tif (iIndex >= sizeof(cFormats)/sizeof(FX_LPCWSTR))\n\t\tiIndex = 0;\n\tCJS_Parameters newParams;\n\tCJS_Value val(isolate,cFormats[iIndex]);\n\tnewParams.push_back(val);\n\treturn AFDate_FormatEx(cc,newParams,vRet,sError);\n}\n\n//AFDate_KeystrokeEx(cFormat)\nFX_BOOL CJS_PublicMethods::AFDate_Keystroke(OBJ_METHOD_PARAMS)\n{\n\tv8::Isolate* isolate = ::GetIsolate(cc);\n\n\tif (params.size() != 1)\n\t{\n\t\tCJS_Context* pContext = (CJS_Context*)cc;\n\t\tASSERT(pContext != NULL);\n\n\t\tsError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);\n\t\treturn FALSE;\n\t}\n\n\tint iIndex = params[0];\n\tFX_LPCWSTR cFormats[] =  {(FX_LPCWSTR)L\"m/d\", (FX_LPCWSTR)L\"m/d/yy\", (FX_LPCWSTR)L\"mm/dd/yy\", (FX_LPCWSTR)L\"mm/yy\", (FX_LPCWSTR)L\"d-mmm\", (FX_LPCWSTR)L\"d-mmm-yy\", (FX_LPCWSTR)L\"dd-mmm-yy\",\n\t\t(FX_LPCWSTR)L\"yy-mm-dd\", (FX_LPCWSTR)L\"mmm-yy\", (FX_LPCWSTR)L\"mmmm-yy\", (FX_LPCWSTR)L\"mmm d, yyyy\", (FX_LPCWSTR)L\"mmmm d, yyyy\",\n\t\t(FX_LPCWSTR)L\"m/d/yy h:MM tt\", (FX_LPCWSTR)L\"m/d/yy HH:MM\" };\n\n\tASSERT(iIndex<sizeof(cFormats)/sizeof(FX_LPCWSTR));\n\n\tif (iIndex < 0)\n\t\tiIndex = 0;\n\tif (iIndex >= sizeof(cFormats)/sizeof(FX_LPCWSTR))\n\t\tiIndex = 0;\n\tCJS_Parameters newParams;\n\tCJS_Value val(isolate,cFormats[iIndex]);\n\tnewParams.push_back(val);\n\treturn AFDate_KeystrokeEx(cc,newParams,vRet,sError);\n}\n\n//function AFTime_Format(ptf)\nFX_BOOL CJS_PublicMethods::AFTime_Format(OBJ_METHOD_PARAMS)\n{\n\tv8::Isolate* isolate = ::GetIsolate(cc);\n\n\tif (params.size() != 1)\n\t{\n\t\tCJS_Context* pContext = (CJS_Context*)cc;\n\t\tASSERT(pContext != NULL);\n\t\tsError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);\n\t\treturn FALSE;\n\t}\n\n\tint iIndex = params[0];\n\tFX_LPCWSTR cFormats[] = {(FX_LPCWSTR)L\"HH:MM\", (FX_LPCWSTR)L\"h:MM tt\", (FX_LPCWSTR)L\"HH:MM:ss\", (FX_LPCWSTR)L\"h:MM:ss tt\"};\n\n\tASSERT(iIndex<sizeof(cFormats)/sizeof(FX_LPCWSTR));\n\n\tif (iIndex < 0)\n\t\tiIndex = 0;\n\tif (iIndex >= sizeof(cFormats)/sizeof(FX_LPCWSTR))\n\t\tiIndex = 0;\n\tCJS_Parameters newParams;\n\tCJS_Value val(isolate,cFormats[iIndex]);\n\tnewParams.push_back(val);\n\treturn AFDate_FormatEx(cc,newParams,vRet,sError);\n}\n\nFX_BOOL CJS_PublicMethods::AFTime_Keystroke(OBJ_METHOD_PARAMS)\n{\n\tv8::Isolate* isolate = ::GetIsolate(cc);\n\tif (params.size() != 1)\n\t{\n\t\tCJS_Context* pContext = (CJS_Context*)cc;\n\t\tASSERT(pContext != NULL);\n\t\tsError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);\n\t\treturn FALSE;\n\t}\n\n\tint iIndex = params[0];\n\tFX_LPCWSTR cFormats[] = {(FX_LPCWSTR)L\"HH:MM\", (FX_LPCWSTR)L\"h:MM tt\", (FX_LPCWSTR)L\"HH:MM:ss\", (FX_LPCWSTR)L\"h:MM:ss tt\"};\n\n\tASSERT(iIndex<sizeof(cFormats)/sizeof(FX_LPCWSTR));\n\n\tif (iIndex < 0)\n\t\tiIndex = 0;\n\tif (iIndex >= sizeof(cFormats)/sizeof(FX_LPCWSTR))\n\t\tiIndex = 0;\n\tCJS_Parameters newParams;\n\tCJS_Value val(isolate,cFormats[iIndex]);\n\tnewParams.push_back(val);\n\treturn AFDate_KeystrokeEx(cc,newParams,vRet,sError);\n}\n\nFX_BOOL CJS_PublicMethods::AFTime_FormatEx(OBJ_METHOD_PARAMS)\n{\n\treturn AFDate_FormatEx(cc,params,vRet,sError);\n}\n\nFX_BOOL CJS_PublicMethods::AFTime_KeystrokeEx(OBJ_METHOD_PARAMS)\n{\n\treturn AFDate_KeystrokeEx(cc,params,vRet,sError);\n}\n\n//function AFSpecial_Format(psf)\nFX_BOOL CJS_PublicMethods::AFSpecial_Format(OBJ_METHOD_PARAMS)\n{\n\tCJS_Context* pContext = (CJS_Context *)cc;\n\tASSERT(pContext != NULL);\n\n\tif (params.size() != 1)\n\t{\n\t\tsError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);\n\t\treturn FALSE;\n\t}\n\n\tstd::string cFormat;\n\tint iIndex = params[0];\n\n\tCJS_EventHandler* pEvent = pContext->GetEventHandler();\n\tASSERT(pEvent != NULL);\n\n\tif(!pEvent->m_pValue)\n\t\treturn FALSE;\n\tCFX_WideString& Value = pEvent->Value();\t\n\tstd::string strSrc = (FX_LPCSTR)CFX_ByteString::FromUnicode(Value);\n\t\n\tswitch (iIndex) \n\t{\n\tcase 0:                         \n\t\tcFormat = \"99999\";\n\t\tbreak;\n\tcase 1:                         \n\t\tcFormat = \"99999-9999\";\n\t\tbreak;\n\tcase 2:                         \n\t\t{\n\t\t\tstd::string NumberStr;\n\t\t\tutil::printx(\"9999999999\", strSrc,NumberStr); \n\t\t\tif (NumberStr.length() >= 10 )\n\t\t\t\tcFormat = \"(999) 999-9999\";\n\t\t\telse \n\t\t\t\tcFormat = \"999-9999\";\n\t\t\tbreak;\n\t\t}\n\tcase 3:\n\t\tcFormat = \"999-99-9999\";\n\t\tbreak;\n\t}\n\t\n\tstd::string strDes;\n\tutil::printx(cFormat,strSrc,strDes);\n\tValue = CFX_WideString::FromLocal(strDes.c_str());\n\treturn TRUE;\n}\n\n\n//function AFSpecial_KeystrokeEx(mask)\nFX_BOOL CJS_PublicMethods::AFSpecial_KeystrokeEx(OBJ_METHOD_PARAMS)\n{\n\tCJS_Context* pContext = (CJS_Context *)cc;\n\tASSERT(pContext != NULL);\n\tCJS_EventHandler* pEvent = pContext->GetEventHandler();\n\n\tASSERT(pEvent != NULL);\n\n\tif (params.size() < 1)\n\t{\n\t\tsError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);\n\t\treturn FALSE;\n\t}\n\n\tif(!pEvent->m_pValue)\n\t\treturn FALSE;\n\tCFX_WideString& valEvent = pEvent->Value();\n\n\tCFX_WideString wstrMask = params[0].operator CFX_WideString();\n\tif (wstrMask.IsEmpty()) return TRUE;\n\t\n\tstd::wstring wstrValue(valEvent);\n\t\n\tif (pEvent->WillCommit())\n\t{\n\t\tif (wstrValue.empty())\n\t\t\treturn TRUE;\n\t\tint iIndexMask = 0;\n\t\tfor (std::wstring::iterator it = wstrValue.begin(); it != wstrValue.end(); it++)\n\t\t{\n\t\t\twchar_t w_Value = *it;\n            if (!maskSatisfied(w_Value,wstrMask[iIndexMask]))\n\t\t\t\tbreak;\n\t\t\tiIndexMask++;\n\t\t}\n\n\t\tif (iIndexMask != wstrMask.GetLength() || (iIndexMask != wstrValue.size() && wstrMask.GetLength() != 0))\n\t\t{\n\t\t\tAlert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE));\n\t\t\tpEvent->Rc() = FALSE;\n\t\t}\n\t\treturn TRUE;\n\t}\n\n\t\n\tCFX_WideString &wideChange = pEvent->Change();\n\tstd::wstring wChange(wideChange);\n\t\n\tif (wChange.empty())\n\t\treturn TRUE;\n    int iIndexMask = pEvent->SelStart();\n\t//iIndexMask++;\n\t\n\t\n\tif (wstrValue.length() - (pEvent->SelEnd()-pEvent->SelStart()) + wChange.length() > (FX_DWORD)wstrMask.GetLength())\n\t{\n\t\tAlert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG));\n\t\tpEvent->Rc() = FALSE;\n\t\treturn TRUE;\n\t}\n\t\n\t\n\tif (iIndexMask >= wstrMask.GetLength() && (!wChange.empty()))\n\t{\n\t\tAlert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG));\n\t\tpEvent->Rc() = FALSE;\n\t\treturn TRUE;\n\t}\n\t\n\tfor (std::wstring::iterator it = wChange.begin(); it != wChange.end(); it++)\n\t{\n\t\tif (iIndexMask >= wstrMask.GetLength())\n\t\t{\n\t\t\tAlert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG));\n\t\t\tpEvent->Rc() = FALSE;\n\t\t\treturn TRUE;\n\t\t}\n\t\twchar_t w_Mask = wstrMask[iIndexMask];\n\t\tif (!isReservedMaskChar(w_Mask))\n\t\t{\n\t\t\t//wChange.insert(it,w_Mask);\t\t\t\t\n\t\t\t*it = w_Mask;\n\t\t}\n\t\twchar_t w_Change = *it;\n\t\t\n        if (!maskSatisfied(w_Change,w_Mask))\n\t\t{\n\t\t\tpEvent->Rc() = FALSE;\n\t\t\treturn TRUE;\n\t\t}\n\t\tiIndexMask++;\n\t}\n\t\n\twideChange = wChange.c_str();\t\n\t\n\treturn TRUE;\n}\n\n\n//function AFSpecial_Keystroke(psf)\nFX_BOOL CJS_PublicMethods::AFSpecial_Keystroke(OBJ_METHOD_PARAMS)\n{\n\tv8::Isolate* isolate = ::GetIsolate(cc);\n\n\tCJS_Context* pContext = (CJS_Context *)cc;\n\tASSERT(pContext != NULL);\n\tCJS_EventHandler* pEvent = pContext->GetEventHandler();\n\tASSERT(pEvent != NULL);\n\n\tif (params.size() != 1)\n\t{\n\t\tsError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);\n\t\treturn FALSE;\n\t}\n\n\tstd::string cFormat;\n\tint iIndex = (int)params[0];\t\n\n\tif(!pEvent->m_pValue)\n\t\treturn FALSE;\n\t//CJS_Value val = pEvent->Value();\n\tCFX_WideString& val = pEvent->Value();\n\tstd::string strSrc = (FX_LPCSTR)CFX_ByteString::FromUnicode(val);\n\tstd::wstring wstrChange(pEvent->Change());\n\t\n\tswitch (iIndex) \n\t{\n\tcase 0:                         \n\t\tcFormat = \"99999\";\n\t\tbreak;\n\tcase 1:                         \n\t\t//cFormat = \"99999-9999\";\n\t\tcFormat = \"999999999\";\n\t\tbreak;\n\tcase 2:                         \n\t\t{\n\t\t\tstd::string NumberStr;\n\t\t\tutil::printx(\"9999999999\", strSrc,NumberStr); \n\t\t\tif (strSrc.length() + wstrChange.length() > 7 )\n\t\t\t\t//cFormat = \"(999) 999-9999\";\n\t\t\t\tcFormat = \"9999999999\";\n\t\t\telse \n\t\t\t\t//cFormat = \"999-9999\";\n\t\t\t\tcFormat = \"9999999\";\n\t\t\tbreak;\n\t\t}\n\tcase 3:\n\t\t//cFormat = \"999-99-9999\";\n\t\tcFormat = \"999999999\";\n\t\tbreak;\n\t}\n    \n\tCJS_Parameters params2;\n\tCJS_Value vMask(isolate, cFormat.c_str());\n\tparams2.push_back(vMask);\n\t\n    return AFSpecial_KeystrokeEx(cc,params2,vRet,sError);\n}\n\nFX_BOOL CJS_PublicMethods::AFMergeChange(OBJ_METHOD_PARAMS)\n{\n\tCJS_Context* pContext = (CJS_Context *)cc;\n\tASSERT(pContext != NULL);\n\tCJS_EventHandler* pEventHandler = pContext->GetEventHandler();\n\tASSERT(pEventHandler != NULL);\n\n\tif (params.size() != 1)\n\t{\n\t\tsError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);\n\t\treturn FALSE;\n\t}\n\n\tCFX_WideString swValue;\n\tif (pEventHandler->m_pValue != NULL)\n\t\tswValue = pEventHandler->Value();\n\n\tif (pEventHandler->WillCommit())\n\t{\n\t\tvRet = swValue;\n\t\treturn TRUE;\n\t}\n\n\tCFX_WideString prefix,postfix;\n\n\tif (pEventHandler->SelStart() >= 0)\n\t\tprefix = swValue.Mid(0,pEventHandler->SelStart());\n\telse\n\t\tprefix = L\"\";\n\n\n\tif (pEventHandler->SelEnd() >= 0 && pEventHandler->SelEnd() <= swValue.GetLength())\n\t\tpostfix = swValue.Mid(pEventHandler->SelEnd(), swValue.GetLength() - pEventHandler->SelEnd());\n\telse postfix = L\"\";\n\n\tvRet = prefix + pEventHandler->Change() + postfix;\n\n\treturn TRUE;\n}\n\nFX_BOOL CJS_PublicMethods::AFParseDateEx(OBJ_METHOD_PARAMS)\n{\n\tCJS_Context* pContext = (CJS_Context *)cc;\n\tASSERT(pContext != NULL);\n\n\tif (params.size() != 2)\n\t{\n\t\tsError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);\n\t\treturn FALSE;\n\t}\n\n\tCFX_WideString sValue = params[0].operator CFX_WideString();\n\tCFX_WideString sFormat = params[1].operator CFX_WideString();\n\n\tFX_BOOL bWrongFormat = FALSE;\n\tdouble dDate = MakeRegularDate(sValue,sFormat,bWrongFormat);\n\n\tif (JS_PortIsNan(dDate))\n\t{\n\t\tCFX_WideString swMsg;\n\t\tswMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE), (FX_LPCWSTR)sFormat);\n\t\tAlert((CJS_Context *)cc, swMsg);\n\t\treturn FALSE;\n\t}\n\t\n\tvRet = dDate;\n\n\treturn TRUE;\n}\n\nFX_BOOL CJS_PublicMethods::AFSimple(OBJ_METHOD_PARAMS)\n{\n\tif (params.size() != 3)\n\t{\n\t\tCJS_Context* pContext = (CJS_Context *)cc;\n\t\tASSERT(pContext != NULL);\n\n\t\tsError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);\n\t\treturn FALSE;\n\t}\n\n\tvRet = (double)AF_Simple(params[0].operator CFX_WideString(), (double)params[1], (double)params[2]);\n\treturn TRUE;\n}\n\nFX_BOOL CJS_PublicMethods::AFMakeNumber(OBJ_METHOD_PARAMS)\n{\n\tif (params.size() != 1)\n\t{\n\t\tCJS_Context* pContext = (CJS_Context *)cc;\n\t\tASSERT(pContext != NULL);\n\n\t\tsError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);\n\t\treturn FALSE;\n\t}\n    vRet = ParseStringToNumber(params[0].operator CFX_WideString());\n\treturn TRUE;\n}\n\nFX_BOOL CJS_PublicMethods::AFSimple_Calculate(OBJ_METHOD_PARAMS)\n{\n\tv8::Isolate* isolate = ::GetIsolate(cc);\n\n\tCJS_Context* pContext = (CJS_Context *)cc;\n\tASSERT(pContext != NULL);\n\n\tif (params.size() != 2)\n\t{\n\t\tsError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);\n\t\treturn FALSE;\n\t}\n\n\tCJS_Value params1 = params[1];\n\n\tif (!params1.IsArrayObject() && params1.GetType() != VT_string)\n\t{\n\t\tsError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);\n\t\treturn FALSE;\n\t}\n\t\n\tCPDFSDK_Document* pReaderDoc = pContext->GetReaderDocument();\n    ASSERT(pReaderDoc != NULL);\n\n\tCPDFSDK_InterForm* pReaderInterForm = pReaderDoc->GetInterForm();\n\tASSERT(pReaderInterForm != NULL);\n\n\tCPDF_InterForm* pInterForm = pReaderInterForm->GetInterForm();\n\tASSERT(pInterForm != NULL);\n\n\tdouble dValue;\n\tCFX_WideString sFunction = params[0].operator CFX_WideString();\n\tif (wcscmp(sFunction, L\"PRD\") == 0)\n    \tdValue = 1.0;\n\telse\n\t\tdValue = 0.0;\n\n\tCJS_Array FieldNameArray = AF_MakeArrayFromList(isolate,params1);\n\n\tint nFieldsCount = 0;\n\n\tfor (int i=0,isz=FieldNameArray.GetLength(); i<isz; i++)\n\t{\n\t\tCJS_Value jsValue(isolate);\n\t\tFieldNameArray.GetElement(i,jsValue);\n        CFX_WideString wsFieldName = jsValue.operator CFX_WideString();\n\n        for (int j=0,jsz=pInterForm->CountFields(wsFieldName); j<jsz; j++)\n\t\t{\n\t\t\tif (CPDF_FormField* pFormField = pInterForm->GetField(j, wsFieldName))\n\t\t\t{\n\t\t\t\tdouble dTemp = 0.0;\n\n\t\t\t\tswitch (pFormField->GetFieldType())\n\t\t\t\t{\n\t\t\t\tcase FIELDTYPE_TEXTFIELD:\n\t\t\t\tcase FIELDTYPE_COMBOBOX:\n\t\t\t\t\t{\n\t\t\t\t\t\tdTemp = ParseStringToNumber(pFormField->GetValue());\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\tcase FIELDTYPE_PUSHBUTTON:\n\t\t\t\t\t{\n\t\t\t\t\t\tdTemp = 0.0;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\tcase FIELDTYPE_CHECKBOX:\n\t\t\t\tcase FIELDTYPE_RADIOBUTTON:\n\t\t\t\t\t{\n\t\t\t\t\t\tdTemp = 0.0;\n\t\t\t\t\t\tfor (int c=0,csz=pFormField->CountControls(); c<csz; c++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (CPDF_FormControl* pFormCtrl = pFormField->GetControl(c))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (pFormCtrl->IsChecked())\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tdTemp += ParseStringToNumber(pFormCtrl->GetExportValue());\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\tcase FIELDTYPE_LISTBOX:\n\t\t\t\t\t{\n\t\t\t\t\t\tdTemp = 0.0;\n\t\t\t\t\t\tif (pFormField->CountSelectedItems() > 1)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdTemp = ParseStringToNumber(pFormField->GetValue());\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (i == 0 && j == 0 && (wcscmp(sFunction,L\"MIN\") == 0 || wcscmp(sFunction, L\"MAX\") == 0))\n\t\t\t\t\tdValue = dTemp;\n\n\t\t\t\tdValue = AF_Simple(sFunction, dValue, dTemp);\n\n\t\t\t\tnFieldsCount++;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (wcscmp(sFunction, L\"AVG\") == 0 && nFieldsCount > 0)\n\t\tdValue /= nFieldsCount;\n\n\tdValue = (double)floor(dValue * FXSYS_pow((double)10,(double)6) + 0.49) / FXSYS_pow((double)10,(double)6);\n\tCJS_Value jsValue(isolate,dValue);\n\tif((CJS_EventHandler*)pContext->GetEventHandler()->m_pValue)\n\t\t((CJS_EventHandler*)pContext->GetEventHandler())->Value() = jsValue;\n\n\treturn TRUE;\n}\n\n/* This function validates the current event to ensure that its value is \n** within the specified range. */\n\nFX_BOOL CJS_PublicMethods::AFRange_Validate(OBJ_METHOD_PARAMS)\n{\n\tCJS_Context* pContext = (CJS_Context *)cc;\n\tASSERT(pContext != NULL);\n\tCJS_EventHandler* pEvent = pContext->GetEventHandler();\n\tASSERT(pEvent != NULL);\n\n\tif (params.size() != 4) \n\t{\n\t\tsError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);\n\t\treturn FALSE;\n\t}\n\n\tif(!pEvent->m_pValue)\n\t\treturn FALSE;\n\tif (pEvent->Value().IsEmpty() )\n\t\treturn TRUE;\n\tdouble dEentValue = atof(CFX_ByteString::FromUnicode(pEvent->Value()));\n\tFX_BOOL bGreaterThan, bLessThan;\n\tdouble  dGreaterThan, dLessThan;\n    bGreaterThan = (FX_BOOL)params[0];\n\tCFX_WideString swMsg;\n\tdGreaterThan = (double)params[1];\n\tbLessThan = (FX_BOOL)params[2];\n\tdLessThan = (double)params[3];\n\n\tif (bGreaterThan && bLessThan)\n\t{\n\t\tif (dEentValue < dGreaterThan || dEentValue > dLessThan)\n\t\t\tswMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE1),(FX_LPCWSTR)params[1].operator CFX_WideString(), (FX_LPCWSTR)params[3].operator CFX_WideString());\n\t}\n\telse if (bGreaterThan)\n\t{\n\t\tif (dEentValue < dGreaterThan)\n\t\t\tswMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE2), (FX_LPCWSTR)params[1].operator CFX_WideString());\n\t}\n\telse if (bLessThan)\n\t{\n\t\tif (dEentValue > dLessThan)\n\t\t\tswMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE3), (FX_LPCWSTR)params[3].operator CFX_WideString());\n\t}\n\n\tif (!swMsg.IsEmpty())\n\t{\n\t\tAlert(pContext, swMsg);\n\t\tpEvent->Rc() = FALSE;\n\t}\n\treturn TRUE;\n}\n\nFX_BOOL CJS_PublicMethods::AFExtractNums(OBJ_METHOD_PARAMS)\n{\n\tv8::Isolate* isolate = ::GetIsolate(cc);\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\n\tif (params.size() != 1) \n\t{\n\t\tsError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);\n\t\treturn FALSE;\n\t}\n\n\tCJS_Array nums(isolate);\n\n\tCFX_WideString str = params[0].operator CFX_WideString();\n\tCFX_WideString sPart;\n\n\tif (str.GetAt(0) == L'.' || str.GetAt(0) == L',')\n\t\tstr = L\"0\" + str;\n\n\tint nIndex = 0;\n\tfor (int i=0, sz=str.GetLength(); i<sz; i++)\n\t{\n\t\tFX_WCHAR wc = str.GetAt(i);\n\t\tif (IsDigit((wchar_t)wc))\n\t\t{\n\t\t\tsPart += wc;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (sPart.GetLength() > 0)\n\t\t\t{\n\t\t\t\tnums.SetElement(nIndex,CJS_Value(isolate,(FX_LPCWSTR)sPart));\n\t\t\t\tsPart = L\"\";\n\t\t\t\tnIndex ++;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (sPart.GetLength() > 0)\n\t{\n\t\tnums.SetElement(nIndex,CJS_Value(isolate,(FX_LPCWSTR)sPart));\t\n\t}\n\n\tif (nums.GetLength() > 0)\n\t\tvRet = nums;\n\telse\n\t\tvRet.SetNull();\n\n\treturn TRUE;\n}\n"
  },
  {
    "path": "fpdfsdk/src/javascript/app.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/javascript/JavaScript.h\"\n#include \"../../include/javascript/IJavaScript.h\"\n#include \"../../include/javascript/JS_Define.h\"\n#include \"../../include/javascript/JS_Object.h\"\n#include \"../../include/javascript/JS_Value.h\"\n#include \"../../include/javascript/app.h\"\n#include \"../../include/javascript/JS_EventHandler.h\"\n#include \"../../include/javascript/resource.h\"\n#include \"../../include/javascript/JS_Context.h\"\n#include \"../../include/javascript/JS_Runtime.h\"\n#include \"../../include/javascript/Document.h\"\n\n\nstatic v8::Isolate* GetIsolate(IFXJS_Context* cc)\n{\n\tCJS_Context* pContext = (CJS_Context *)cc;\n\tASSERT(pContext != NULL);\n\n\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\tASSERT(pRuntime != NULL);\n\n\treturn pRuntime->GetIsolate();\n}\n\n/* ---------------------------- TimerObj ---------------------------- */\n\nBEGIN_JS_STATIC_CONST(CJS_TimerObj)\nEND_JS_STATIC_CONST()\n\nBEGIN_JS_STATIC_PROP(CJS_TimerObj)\nEND_JS_STATIC_PROP()\n\nBEGIN_JS_STATIC_METHOD(CJS_TimerObj)\nEND_JS_STATIC_METHOD()\n\nIMPLEMENT_JS_CLASS(CJS_TimerObj, TimerObj)\n\nTimerObj::TimerObj(CJS_Object* pJSObject)\n: CJS_EmbedObj(pJSObject),\nm_pTimer(NULL)\n{\n\t\n}\n\nTimerObj::~TimerObj()\n{\n}\n\nvoid TimerObj::SetTimer(CJS_Timer* pTimer)\n{\n\tm_pTimer = pTimer;\n}\n\nCJS_Timer* TimerObj::GetTimer() const\n{\n\treturn m_pTimer;\n}\n\n#define JS_STR_VIEWERTYPE_READER\t\tL\"Reader\"\n#define JS_STR_VIEWERTYPE_STANDARD\t\tL\"Exchange\"\n#define JS_STR_VIEWERVARIATION\t\t\tL\"Full\"\n#define JS_STR_PLATFORM\t\t\t\t\tL\"WIN\"\n#define JS_STR_LANGUANGE\t\t\t\tL\"ENU\"\n#define JS_STR_VIEWERVERSION\t\t\t8\n#define JS_NUM_FORMSVERSION\t\t\t\t7\n\n#define JS_FILEPATH_MAXLEN\t\t\t\t2000\n\n/* ---------------------------- app ---------------------------- */\n\nBEGIN_JS_STATIC_CONST(CJS_App)\nEND_JS_STATIC_CONST()\n\nBEGIN_JS_STATIC_PROP(CJS_App)\n\tJS_STATIC_PROP_ENTRY(activeDocs)\n\tJS_STATIC_PROP_ENTRY(calculate)\n\tJS_STATIC_PROP_ENTRY(formsVersion)\n\tJS_STATIC_PROP_ENTRY(fs)\n\tJS_STATIC_PROP_ENTRY(fullscreen)\n\tJS_STATIC_PROP_ENTRY(language)\n\tJS_STATIC_PROP_ENTRY(media)\n\tJS_STATIC_PROP_ENTRY(platform)\n\tJS_STATIC_PROP_ENTRY(runtimeHighlight)\n\tJS_STATIC_PROP_ENTRY(viewerType)\n\tJS_STATIC_PROP_ENTRY(viewerVariation)\n\tJS_STATIC_PROP_ENTRY(viewerVersion)\t\nEND_JS_STATIC_PROP()\n\nBEGIN_JS_STATIC_METHOD(CJS_App)\n\tJS_STATIC_METHOD_ENTRY(alert, 6)\n\tJS_STATIC_METHOD_ENTRY(beep, 1)\n\tJS_STATIC_METHOD_ENTRY(browseForDoc, 0)\n\tJS_STATIC_METHOD_ENTRY(clearInterval, 1)\n\tJS_STATIC_METHOD_ENTRY(clearTimeOut, 1)\n\tJS_STATIC_METHOD_ENTRY(execDialog, 3)\n\tJS_STATIC_METHOD_ENTRY(execMenuItem,  1)\n\tJS_STATIC_METHOD_ENTRY(findComponent, 1)\n\tJS_STATIC_METHOD_ENTRY(goBack, 0)\n\tJS_STATIC_METHOD_ENTRY(goForward, 0)\n\tJS_STATIC_METHOD_ENTRY(launchURL, 0)\n\tJS_STATIC_METHOD_ENTRY(mailMsg, 0)\t\n\tJS_STATIC_METHOD_ENTRY(newFDF, 0)\n\tJS_STATIC_METHOD_ENTRY(newDoc, 0)\n\tJS_STATIC_METHOD_ENTRY(openDoc, 0)\n\tJS_STATIC_METHOD_ENTRY(openFDF, 5)\n\tJS_STATIC_METHOD_ENTRY(popUpMenuEx, 0)\n\tJS_STATIC_METHOD_ENTRY(popUpMenu, 0)\n\tJS_STATIC_METHOD_ENTRY(response, 0)\n\tJS_STATIC_METHOD_ENTRY(setInterval, 2)\n\tJS_STATIC_METHOD_ENTRY(setTimeOut, 2)\nEND_JS_STATIC_METHOD()\n\nIMPLEMENT_JS_CLASS(CJS_App,app)\n\napp::app(CJS_Object * pJSObject) : CJS_EmbedObj(pJSObject) ,\n\tm_bCalculate(true),\n\tm_pRuntime(NULL),\n\tm_bRuntimeHighLight(false)\n//\tm_pMenuHead(NULL)\n{\n}\n\napp::~app(void)\n{\n\tfor (int i=0,sz=m_aTimer.GetSize(); i<sz; i++)\n\t\tdelete m_aTimer[i];\n\n\tm_aTimer.RemoveAll();\n}\n\nFX_BOOL app::activeDocs(OBJ_PROP_PARAMS)\n{\n\tif (vp.IsGetting())\n\t{\n\n\t\tCJS_Context* pContext = (CJS_Context *)cc;\n\t\tASSERT(pContext != NULL);\n\t\t\n\t\tCPDFDoc_Environment* pApp = pContext->GetReaderApp();\n\t\tASSERT(pApp != NULL);\n\n\t\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\t\tASSERT(pRuntime != NULL);\n\t\t\n\t\tCPDFSDK_Document* pCurDoc = pContext->GetReaderDocument();\n\t\t\n\t\tCJS_Array aDocs(pRuntime->GetIsolate());\n//\t\tint iNumDocs = pApp->CountDocuments();\n\t\t\n// \t\tfor(int iIndex = 0; iIndex<iNumDocs; iIndex++)\n// \t\t{\n\t\t\tCPDFSDK_Document* pDoc = pApp->GetCurrentDoc();\n\t\t\tif (pDoc)\n\t\t\t{\n\t\t\t\tCJS_Document * pJSDocument = NULL;\n\t\t\t\t\n\t\t\t\tif (pDoc == pCurDoc)\n\t\t\t\t{\n\t\t\t\t\tJSFXObject pObj = JS_GetThisObj(*pRuntime);\n\t\t\t\t\t\n\t\t\t\t\tif (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L\"Document\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tpJSDocument = (CJS_Document*)JS_GetPrivate(pRuntime->GetIsolate(),pObj);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tJSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime,L\"Document\"));\n\t\t\t\t\tpJSDocument = (CJS_Document*)JS_GetPrivate(pRuntime->GetIsolate(),pObj);\n\t\t\t\t\tASSERT(pJSDocument != NULL);\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t//\t\t\tpDocument->AttachDoc(pDoc);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\taDocs.SetElement(0,CJS_Value(pRuntime->GetIsolate(),pJSDocument));\n\t\t\t}\n\t//\t\t}\n\t\t\n\t\tif (aDocs.GetLength() > 0)\n\t\t\tvp << aDocs;\n\t\telse\n\t\t\tvp.SetNull();\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}\n\nFX_BOOL app::calculate(OBJ_PROP_PARAMS)\n{\n\tif (vp.IsSetting())\n\t{\n\t\tbool bVP;\n\t\tvp >> bVP;\n\t\tm_bCalculate = (FX_BOOL)bVP;\n\n\t\tCJS_Context* pContext = (CJS_Context*)cc;\n\t\tASSERT(pContext != NULL);\n\t\t\n\t\tCPDFDoc_Environment* pApp = pContext->GetReaderApp();\n\t\tASSERT(pApp != NULL);\n\t\t\n\t\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\t\tASSERT(pRuntime != NULL);\n\n\t\tCJS_Array aDocs(pRuntime->GetIsolate());\n// \t\tint iNumDocs = pApp->CountDocuments();\n// \t\t\n// \t\tfor (int iIndex = 0;iIndex < iNumDocs; iIndex++)\n// \t\t{\n\t\t\tif (CPDFSDK_Document* pDoc = pApp->GetCurrentDoc())\n\t\t\t{\n\t\t\t\tCPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDoc->GetInterForm();\n\t\t\t\tASSERT(pInterForm != NULL);\n\t\t\t\tpInterForm->EnableCalculate((FX_BOOL)m_bCalculate);\n\t\t\t}\t\t\t\n//\t\t}\n\t}\n\telse\n\t{\n\t\tvp << (bool)m_bCalculate;\n\t}\n\t\n\treturn TRUE;\n}\n\nFX_BOOL app::formsVersion(OBJ_PROP_PARAMS)\n{\n\tif (vp.IsGetting())\n\t{\n\t\tvp << JS_NUM_FORMSVERSION;\n\t\treturn TRUE;\n\t}\n\t\n\treturn FALSE;\n}\n\nFX_BOOL app::viewerType(OBJ_PROP_PARAMS)\n{\n\n\n\t\n\t\n\t\n\n\tif (vp.IsGetting())\n\t{\n// \t\tif (pApp->GetAppName() == PHANTOM)\n// \t\t\tvp << JS_STR_VIEWERTYPE_STANDARD;\n// \t\telse\n// \t\t\tvp << JS_STR_VIEWERTYPE_READER;\n\t\tvp << L\"unknown\";\n\n\t\t//vp << pApp->GetAppTitle();\n\t\treturn TRUE;\n\t}\n\t\n\treturn FALSE;\n}\n\nFX_BOOL app::viewerVariation(OBJ_PROP_PARAMS)\n{\n\tif (vp.IsGetting())\n\t{\n\t\tvp << JS_STR_VIEWERVARIATION;\n\t\treturn TRUE;\n\t}\n\t\n\treturn FALSE;\n}\n\nFX_BOOL app::viewerVersion(OBJ_PROP_PARAMS)\n{\n\tif (vp.IsGetting())\n\t{\n\t\tvp << JS_STR_VIEWERVERSION;\n\t\treturn TRUE;\n\t}\n\t\n\treturn FALSE;\n}\n\nFX_BOOL app::platform(OBJ_PROP_PARAMS)\n{\n\tif (vp.IsGetting())\n\t{\n\t\tvp << JS_STR_PLATFORM;\n\t\treturn TRUE;\n\t}\n\t\n\treturn FALSE;\n}\n\nFX_BOOL app::language(OBJ_PROP_PARAMS)\n{\n\tif (vp.IsGetting())\n\t{\n\t\tvp << JS_STR_LANGUANGE;\n\t\treturn TRUE;\n\t}\n\t\n\treturn FALSE;\n}\n\n//creates a new fdf object that contains no data\n//comment: need reader support\n//note:\n//CFDF_Document * CPDFDoc_Environment::NewFDF();\nFX_BOOL app::newFDF(OBJ_METHOD_PARAMS)\n{\n\treturn TRUE;\n}\n//opens a specified pdf document and returns its document object\n//comment:need reader support\n//note: as defined in js reference, the proto of this function's fourth parmeters, how old an fdf document while do not show it.\n//CFDF_Document * CPDFDoc_Environment::OpenFDF(string strPath,bool bUserConv);\n\nFX_BOOL app::openFDF(OBJ_METHOD_PARAMS)\n{\n\treturn TRUE;\n}\n\nFX_BOOL app::alert(OBJ_METHOD_PARAMS)\n{\n\tint iSize = params.size();\n\tif (iSize < 1)\n\t\treturn FALSE;\n\n\tCFX_WideString swMsg = L\"\";\n\tCFX_WideString swTitle = L\"\";\n\tint iIcon = 0;\n\tint iType = 0;\n\n\tv8::Isolate* isolate = GetIsolate(cc);\n\n\tif (iSize == 1)\n\t{\n\t\tif (params[0].GetType() == VT_object)\n\t\t{\n\t\t\tJSObject pObj = params[0];\n\t\t\t{\n\t\t\t\tv8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate, pObj, L\"cMsg\");\n\t\t\t\tswMsg = CJS_Value(isolate,pValue,VT_unknown).operator CFX_WideString();\n\n\t\t\t\tpValue = JS_GetObjectElement(isolate,pObj,L\"cTitle\");\n\t\t\t\tswTitle = CJS_Value(isolate, pValue,VT_unknown).operator CFX_WideString();\n\n\t\t\t\tpValue = JS_GetObjectElement(isolate,pObj,L\"nIcon\");\n\t\t\t\tiIcon = (int)CJS_Value(isolate,pValue,VT_unknown);\n\n\t\t\t\tpValue = JS_GetObjectElement(isolate,pObj,L\"nType\");\n\t\t\t\tiType = (int)CJS_Value(isolate,pValue,VT_unknown);\n\t\t\t}\n\n\t\t\tif (swMsg == L\"\")\n\t\t\t{\n\t\t\t\tCJS_Array carray(isolate);\n\t\t\t\tif (params[0].ConvertToArray(carray))\n\t\t\t\t{\n\t\t\t\t\tint iLenth = carray.GetLength();\n\t\t\t\t\tCJS_Value* pValue = new CJS_Value(isolate);\n//\t\t\t\t\tif (iLenth == 1)\n//\t\t\t\t\t\tpValue = new CJS_Value(isolate);\n// \t\t\t\t\telse if (iLenth > 1)\n// \t\t\t\t\t\tpValue = new CJS_Value[iLenth];\n\n\t\t\t\t\tfor(int i = 0; i < iLenth; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tcarray.GetElement(i, *pValue);\n\t\t\t\t\t\tswMsg += (*pValue).operator CFX_WideString();\n\t\t\t\t\t\tif (i < iLenth - 1)\n\t\t\t\t\t\t\tswMsg += L\",  \";\n\t\t\t\t\t}\n\n\t\t\t\t\tif(pValue) delete pValue;\n// \t\t\t\t\tif ((iLenth > 1) && pValue)\n// \t\t\t\t\t{\n// \t\t\t\t\t\tdelete[]pValue;\n// \t\t\t\t\t\tpValue = NULL;\n// \t\t\t\t\t}\n// \t\t\t\t\telse if ((iLenth == 1) && pValue)\n// \t\t\t\t\t{\n// \t\t\t\t\t\tdelete pValue;\n// \t\t\t\t\t\tpValue = NULL;\n// \t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (swTitle == L\"\")\n\t\t\t\tswTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT);\n\t\t}\n\t\telse if (params[0].GetType() == VT_boolean)\n\t\t{\n\t\t\tFX_BOOL bGet = (FX_BOOL)params[0];\n\t\t\tif (bGet)\n\t\t\t\tswMsg = L\"true\";\n\t\t\telse\n\t\t\t\tswMsg = L\"false\";\n\n\t\t\tswTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tswMsg = params[0];\n\t\t\tswTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (params[0].GetType() == VT_boolean)\n\t\t{\n\t\t\tFX_BOOL bGet = (FX_BOOL)params[0];\n\t\t\tif (bGet)\n\t\t\t\tswMsg = L\"true\";\n\t\t\telse\n\t\t\t\tswMsg = L\"false\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\tswMsg = params[0];\n\t\t}\n\t\tswTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT);\n\t\t\n\t\tfor(int i = 1;i<iSize;i++)\n\t\t{\n\t\t\tif (i == 1)\n\t\t\t\tiIcon = int(params[i]);\n\t\t\tif (i == 2)\n\t\t\t\tiType = int(params[i]);\n\t\t\tif (i == 3)\n\t\t\t\tswTitle = params[i];\t\t\t\n\t\t}\n\t}\n\n\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\tASSERT(pRuntime != NULL);\n\tpRuntime->BeginBlock();\n\tvRet = MsgBox(pRuntime->GetReaderApp(), JSGetPageView(cc),swMsg,swTitle,iType,iIcon);\n\tpRuntime->EndBlock();\n\t\n\treturn TRUE;\n}\n\n\nFX_BOOL app::beep(OBJ_METHOD_PARAMS)\n{\n\tif (params.size() == 1)\n\t{\n\t\tCJS_Context* pContext = (CJS_Context*)cc;\n\t\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\t\tCPDFDoc_Environment * pEnv = pRuntime->GetReaderApp();\n\t\tpEnv->JS_appBeep((int)params[0]);\n\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\tsError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);\n\t\treturn FALSE;\n\t}\n}\n\nFX_BOOL app::findComponent(OBJ_METHOD_PARAMS)\n{\n\treturn TRUE;\n}\n\nFX_BOOL app::popUpMenuEx(OBJ_METHOD_PARAMS)\n{\t\n\treturn FALSE;\n}\n\nFX_BOOL app::fs(OBJ_PROP_PARAMS)\n{\n#ifdef FOXIT_CHROME_BUILD\n\treturn FALSE;\n#else\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\tASSERT(pRuntime != NULL);\n\n\tif (vp.IsGetting())\n\t{\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\treturn TRUE;\n\t}\n#endif\n}\n\nFX_BOOL app::setInterval(OBJ_METHOD_PARAMS)\n{\n\tif (params.size() > 2 || params.size() == 0) \n\t{\n\t\tsError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);\t\n\t\treturn FALSE;\n\t}\n\t\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\tASSERT(pRuntime != NULL);\n\n\tCFX_WideString script = params.size() > 0 ?  (FX_LPCWSTR)(params[0].operator CFX_WideString()) : (FX_LPCWSTR)L\"\";\n\tif (script.IsEmpty()) \n\t{\n\t\tsError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSAFNUMBER_KEYSTROKE);\n\t\treturn TRUE;\n\t}\n\n\tFX_DWORD dwInterval = params.size() > 1 ? (int)params[1] : 1000;\n\t\n\tCPDFDoc_Environment* pApp = pRuntime->GetReaderApp();\n\tASSERT(pApp);\n\tCJS_Timer* pTimer = new CJS_Timer(this, pApp);\n\tm_aTimer.Add(pTimer);\n\n\tpTimer->SetType(0);\n\tpTimer->SetRuntime(pRuntime);\n\tpTimer->SetJScript(script);\n\tpTimer->SetTimeOut(0);\n//\tpTimer->SetStartTime(GetTickCount());\n\tpTimer->SetJSTimer(dwInterval);\n\t\n\tJSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L\"TimerObj\"));\n\t\n\tCJS_TimerObj* pJS_TimerObj = (CJS_TimerObj*)JS_GetPrivate(pRuntime->GetIsolate(),pRetObj);\n\tASSERT(pJS_TimerObj != NULL);\n\t\n\tTimerObj* pTimerObj = (TimerObj*)pJS_TimerObj->GetEmbedObject();\n\tASSERT(pTimerObj != NULL);\n\t\n\tpTimerObj->SetTimer(pTimer); \n\t\n\tvRet = pRetObj;\n\t\n\treturn TRUE;\n}\n\nFX_BOOL app::setTimeOut(OBJ_METHOD_PARAMS)\n{\n\tif (params.size() > 2 || params.size() == 0)\n\t{\n\t\tsError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);\t\n\t\treturn FALSE;\n\t}\n\t\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\tASSERT(pRuntime != NULL);\n\t\n\tCFX_WideString script = params.size() > 0 ?  (FX_LPCWSTR)(params[0].operator CFX_WideString()) : (FX_LPCWSTR)L\"\";\n\tif (script.IsEmpty()) \n\t{\n\t\tsError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSAFNUMBER_KEYSTROKE);\n\t\treturn TRUE;\n\t}\n\t\n\tFX_DWORD dwTimeOut = params.size() > 1 ? (int)params[1] : 1000;\n\t\n\tCPDFDoc_Environment* pApp = pRuntime->GetReaderApp();\n\tASSERT(pApp);\n\tCJS_Timer* pTimer = new CJS_Timer(this, pApp);\n\tm_aTimer.Add(pTimer);\n\t\n\tpTimer->SetType(1);\n\tpTimer->SetRuntime(pRuntime);\n\tpTimer->SetJScript(script);\n\tpTimer->SetTimeOut(dwTimeOut);\n//\tpTimer->SetStartTime(GetTickCount());\n//\tpTimer->SetJSTimer(1000);\n\tpTimer->SetJSTimer(dwTimeOut);\n\t\n\tJSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L\"TimerObj\"));\n//\tASSERT(pRetObj != NULL);\n\t\n\tCJS_TimerObj* pJS_TimerObj = (CJS_TimerObj*)JS_GetPrivate(pRuntime->GetIsolate(),pRetObj);\n\tASSERT(pJS_TimerObj != NULL);\n\t\n\tTimerObj* pTimerObj = (TimerObj*)pJS_TimerObj->GetEmbedObject();\n\tASSERT(pTimerObj != NULL);\n\t\n\tpTimerObj->SetTimer(pTimer); \n\t\n\tvRet = pRetObj;\n\t\n\treturn TRUE;\n}\n\nFX_BOOL app::clearTimeOut(OBJ_METHOD_PARAMS)\n{\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\tASSERT(pRuntime != NULL);\n\t\n\tif (params.size() != 1)\n\t{\n\t\tsError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);\t\n\t\treturn FALSE;\n\t}\n\t\n\tif (params[0].GetType() == VT_fxobject)\n\t{\n\t\tJSFXObject pObj = (JSFXObject)params[0];\n\t\t{\n\t\t\tif (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L\"TimerObj\"))\n\t\t\t{\n\t\t\t\tif (CJS_Object* pJSObj = (CJS_Object*)params[0])\n\t\t\t\t{\n\t\t\t\t\tif (TimerObj* pTimerObj = (TimerObj*)pJSObj->GetEmbedObject())\n\t\t\t\t\t{\n\t\t\t\t\t\tif (CJS_Timer* pTimer = pTimerObj->GetTimer())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpTimer->KillJSTimer();\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tfor (int i=0,sz=m_aTimer.GetSize(); i<sz; i++)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (m_aTimer[i] == pTimer)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tm_aTimer.RemoveAt(i);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tdelete pTimer;\n\t\t\t\t\t\t\tpTimerObj->SetTimer(NULL);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn TRUE;\n}\n\nFX_BOOL app::clearInterval(OBJ_METHOD_PARAMS)\n{\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\tASSERT(pRuntime != NULL);\n\n\tif (params.size() != 1)\n\t{\n\t\tsError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);\t\n\t\treturn FALSE;\n\t}\n\t\n\tif (params[0].GetType() == VT_fxobject)\n\t{\n\t\tJSFXObject pObj = (JSFXObject)params[0];\n\t\t{\n\t\t\tif (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L\"TimerObj\"))\n\t\t\t{\n\t\t\t\tif (CJS_Object* pJSObj = (CJS_Object*)params[0])\n\t\t\t\t{\n\t\t\t\t\tif (TimerObj* pTimerObj = (TimerObj*)pJSObj->GetEmbedObject())\n\t\t\t\t\t{\n\t\t\t\t\t\tif (CJS_Timer* pTimer = pTimerObj->GetTimer())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpTimer->KillJSTimer();\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tfor (int i=0,sz=m_aTimer.GetSize(); i<sz; i++)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (m_aTimer[i] == pTimer)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tm_aTimer.RemoveAt(i);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tdelete pTimer;\n\t\t\t\t\t\t\tpTimerObj->SetTimer(NULL);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn TRUE;\n}\n\nFX_BOOL app::execMenuItem(OBJ_METHOD_PARAMS)\n{\t\n\treturn FALSE;\n}\n\nvoid app::TimerProc(CJS_Timer* pTimer)\n{\n\tASSERT(pTimer != NULL);\n\n\tswitch (pTimer->GetType())\n\t{\n\tcase 0: //interval\n\t\tRunJsScript(pTimer->GetRuntime(), pTimer->GetJScript());\n\t\tbreak;\n\tcase 1:\n\t\tif (pTimer->GetTimeOut() > 0)\n\t\t{\n\t\t\tRunJsScript(pTimer->GetRuntime(), pTimer->GetJScript());\n\t\t\tpTimer->KillJSTimer();\n\t\t}\n\t\tbreak;\n\t}\n\t\n}\n\nvoid app::RunJsScript(CJS_Runtime* pRuntime,const CFX_WideString& wsScript)\n{\n\tASSERT(pRuntime != NULL);\n\n\tif (!pRuntime->IsBlocking())\n\t{\n\t\tIFXJS_Context* pContext = pRuntime->NewContext();\n\t\tASSERT(pContext != NULL);\n\t\tpContext->OnExternal_Exec();\n\t\tCFX_WideString wtInfo;\n\t\tpContext->RunScript(wsScript,wtInfo);\n\t\tpRuntime->ReleaseContext(pContext);\n\t}\n}\n\nFX_BOOL app::goBack(OBJ_METHOD_PARAMS)\n{\n\n\n\t\n\t\n\t\n\t\n\treturn TRUE;\n}\n\nFX_BOOL app::goForward(OBJ_METHOD_PARAMS)\n{\t\n\n\n\n\n\n\n\treturn TRUE;\n}\n\nFX_BOOL app::mailMsg(OBJ_METHOD_PARAMS)\n{\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\n\tv8::Isolate* isolate = GetIsolate(cc);\n\n\tFX_BOOL bUI = TRUE;\n\tCFX_WideString cTo = L\"\";\n\tCFX_WideString cCc = L\"\";\n\tCFX_WideString cBcc = L\"\";\n\tCFX_WideString cSubject = L\"\";\n\tCFX_WideString cMsg = L\"\";\n\tif(params.size() < 2)\n\t\treturn FALSE;\n\n\tbUI = params.size()>=1?(int)params[0]:TRUE;\n\tcTo = params.size()>=2?(const wchar_t*)(FX_LPCWSTR)params[1].operator CFX_WideString():L\"\";\n\tcCc = params.size()>=3?(const wchar_t*)(FX_LPCWSTR)params[2].operator CFX_WideString():L\"\";\n\tcBcc = params.size()>=4?(const wchar_t*)(FX_LPCWSTR)params[3].operator CFX_WideString():L\"\";\n\tcSubject = params.size()>=5?(const wchar_t*)(FX_LPCWSTR)params[4].operator CFX_WideString():L\"\";\n\tcMsg = params.size()>=6?(const wchar_t*)(FX_LPCWSTR)params[5].operator CFX_WideString():L\"\";\t\t\n\n\n\tif (params[0].GetType() == VT_object)\n\t{\n\t\tJSObject pObj = (JSObject)params[0];\n\n\t\tv8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L\"bUI\");\n\t\t\tbUI = (int)CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue));\n\n\t\tpValue = JS_GetObjectElement(isolate, pObj, L\"cTo\");\n\t\t\tcTo = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();\n\n\t\tpValue = JS_GetObjectElement(isolate,pObj, L\"cCc\");\n\t\t\tcCc = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();\n\n\t\tpValue = JS_GetObjectElement(isolate,pObj, L\"cBcc\");\n\t\t\tcBcc = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();\n\n\t\tpValue = JS_GetObjectElement(isolate,pObj, L\"cSubject\");\n\t\t\tcSubject = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();\n\n\t\tpValue = JS_GetObjectElement(isolate,pObj, L\"cMsg\");\n\t\t\tcMsg = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();\n\t}\n\t\n\t\n\n\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\tASSERT(pRuntime != NULL);\n\n\tCPDFDoc_Environment* pApp = pContext->GetReaderApp();\n\tASSERT(pApp != NULL);\n\n\tpRuntime->BeginBlock();\n\tpApp->JS_docmailForm(NULL, 0, bUI, (FX_LPCWSTR)cTo, (FX_LPCWSTR)cSubject, (FX_LPCWSTR)cCc, (FX_LPCWSTR)cBcc, (FX_LPCWSTR)cMsg);\n\t///////////////////////////////////////////////////////////////////////////////////////////////\n\tpRuntime->EndBlock();\n\n\t//return bRet;\n\treturn FALSE;\n}\n\nFX_BOOL app::launchURL(OBJ_METHOD_PARAMS)\n{\n\tif (IsSafeMode(cc)) return TRUE;\n\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\n\t\n\n\n\tCFX_WideString swURL = params[0].operator CFX_WideString();\n\n\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\tASSERT(pRuntime != NULL);\n\n\tpRuntime->BeginBlock();\n//\tFX_BOOL bRet = pApp->OpenURL(swURL);\n\tpRuntime->EndBlock();\n\n//\treturn bRet;\n\treturn FALSE;\n}\n\nFX_BOOL app::runtimeHighlight(OBJ_PROP_PARAMS)\n{\n\tif (vp.IsSetting())\n\t{\n\t\tvp>>m_bRuntimeHighLight;\n\t}\n\telse\n\t{\n\t\tvp<<m_bRuntimeHighLight;\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL app::fullscreen(OBJ_PROP_PARAMS)\n{\n\treturn FALSE;\n}\n\nFX_BOOL app::popUpMenu(OBJ_METHOD_PARAMS)\n{\n\treturn FALSE;\n}\n\n\nFX_BOOL app::browseForDoc(OBJ_METHOD_PARAMS)\n{\n\t//This method may trigger a \"file save\" dialog,while enable user to save contents of the document.\n\t//Such action is considered to be unsafe.\n\tif (IsSafeMode(cc)) return TRUE;\n\n\tv8::Isolate* isolate = GetIsolate(cc);\n\n\tbool bSave = false;\n\tCFX_ByteString cFilenameInit = CFX_ByteString();\n\tCFX_ByteString cFSInit = CFX_ByteString();\n\n\tif(params.size()>0 && (params[0].GetType() == VT_object))\n\t{\n\t\tJSObject pObj = (JSObject )params[0];\n\n\t\tv8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj,L\"bSave\");\n\t\t\tbSave = (bool)CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue));\n\t\t\n\t\tpValue = JS_GetObjectElement(isolate, pObj,L\"cFilenameInit\");\n\t\t{\n\t\t\tCJS_Value t = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue));\n\t\t\tcFilenameInit = t.operator CFX_ByteString();\n\t\t}\n\t\t\n\t\tpValue = JS_GetObjectElement(isolate,pObj,L\"cFSInit\");\n\t\t{\n\t\t\tCJS_Value t = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue));\n\t\t\tcFSInit = t.operator CFX_ByteString();\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(params.size() >= 1)\n\t\t{\n\t\t\tbSave = (bool)params[0];\n\t\t}\n\t\tif(params.size() >= 2)\n\t\t{\n\t\t\tCJS_Value t = params[1];\n\t\t\tcFilenameInit = t.operator CFX_ByteString();\n\t\t}\n\t\tif(params.size() >= 3)\n\t\t{\n\t\t\tCJS_Value t = params[2];\n\t\t\tcFSInit = t.operator CFX_ByteString();\n\t\t}\n\t}\n\tCJS_Context* pContext = (CJS_Context *)cc;\n\tASSERT(pContext != NULL);\n\t\n\tCPDFDoc_Environment* pApp = pContext->GetReaderApp();\n\tASSERT(pApp != NULL);\n\n\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\tASSERT(pRuntime != NULL);\n\n\tCFX_WideString wsFileNameInit = CFX_WideString::FromLocal(cFilenameInit);\n\tCFX_WideString wsFSInit = CFX_WideString::FromLocal(cFSInit);\n\tCFX_WideString wsFilePath = pApp->JS_appbrowseForDoc(bSave, wsFileNameInit);\n\tif(wsFilePath.IsEmpty())\n\t\treturn FALSE;\n\n\tJSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, -1);\n\n\tJS_PutObjectString(isolate,pRetObj, L\"cPath\", SysPathToPDFPath(wsFilePath));\t\n\tJS_PutObjectString(isolate,pRetObj, L\"cURL\", SysPathToPDFPath(wsFilePath));\n\n\tif (!cFSInit.IsEmpty())\n\t{\n\t\tJS_PutObjectString(isolate,pRetObj, L\"cFS\", CFX_WideString::FromLocal(cFSInit.GetBuffer(cFSInit.GetLength())));\n\t}\n\telse\n\t{\n\t\tJS_PutObjectString(isolate,pRetObj, L\"cFS\", CFX_WideString::FromLocal(\"DOS\"));\n\t}\n\t\n\tvRet =  pRetObj;\n\n\treturn TRUE;\n}\n\nCFX_WideString app::SysPathToPDFPath(const CFX_WideString& sOldPath)\n{\n\tCFX_WideString sRet = L\"/\";\n\t\n\tfor (int i=0,sz=sOldPath.GetLength(); i<sz; i++)\n\t{\n\t\twchar_t c = sOldPath.GetAt(i);\n\t\tif (c == L':')\n\t\t{\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (c == L'\\\\')\n\t\t\t{\n\t\t\t\tsRet += L\"/\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tsRet += c;\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn sRet;\n}\n\nCFX_WideString app::PDFPathToSysPath(const CFX_WideString& sOldPath)\n{\n\t//strLPath = \"D:\\temporay.fdf\";\n\tCFX_WideString strOPath = sOldPath;\n\tstrOPath.TrimLeft();\n\tstrOPath.TrimRight();\n\t\n\tif (strOPath.GetAt(0) == L'/' && strOPath.GetAt(2) == L'/')\n\t{\n\t\twchar_t c_Drive = strOPath.GetAt(1);\n\t\tif ((c_Drive >= L'a' && c_Drive <= L'z' )||( c_Drive >= L'A' && c_Drive <= L'Z'))\n\t\t{\n\t\t\tstrOPath.Replace((FX_LPCWSTR)L\"/\",(FX_LPCWSTR)L\"\\\\\");\n\t\t\t//strOPath.SetAt(0,'');\n\t\t\tstrOPath.Insert(2,':');\n\t\t\tstrOPath.Delete(0);\n\t\t}\n\t}\n\t\n\treturn strOPath;\n}\n\nCFX_WideString app::RelativePathToSysPath(const CFX_WideString& sOldPath, const CFX_WideString& sFilePath)\n{\n//\tif (!PathIsRelative(sOldPath)) return sOldPath;\n\t\n\tint nSplit = 0;\n\tfor (int i=sFilePath.GetLength()-1; i>=0; i--)\n\t{\n\t\tif (sFilePath[i] == '\\\\' || sFilePath[i] == '/')\n\t\t{\n\t\t\tnSplit = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\treturn sFilePath.Left(nSplit+1) + sOldPath;\n}\n\nFX_BOOL app::newDoc(OBJ_METHOD_PARAMS)\n{\n\treturn FALSE;\n}\n\nFX_BOOL app::openDoc(OBJ_METHOD_PARAMS)\n{\n\treturn FALSE;\n}\n\nFX_BOOL app::response(OBJ_METHOD_PARAMS)\n{\n\tCFX_WideString swQuestion = L\"\";\n\tCFX_WideString swLabel = L\"\";\n#ifndef FOXIT_CHROME_BUILD\n\tCFX_WideString swTitle = L\"Foxit\";\n#else\n\tCFX_WideString swTitle = L\"PDF\";\n#endif\n\tCFX_WideString swDefault = L\"\";\n\tCFX_WideString swResponse = L\"\";\n\tbool bPassWord = false;\n\t\n\tv8::Isolate* isolate = GetIsolate(cc);\n\t\n\tint iLength = params.size();\t\n\tif (iLength > 0 && params[0].GetType() == VT_object)\n\t{\n\t\t\n\t\tJSObject pObj = (JSObject )params[0];\n\t\tv8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj,L\"cQuestion\");\n\t\t\tswQuestion = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();\n\n\t\tpValue = JS_GetObjectElement(isolate,pObj,L\"cTitle\");\n\t\t\tswTitle = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();\n\n\t\tpValue = JS_GetObjectElement(isolate,pObj,L\"cDefault\");\n\t\t\tswDefault = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();\n\n\t\tpValue = JS_GetObjectElement(isolate,pObj,L\"cLabel\");\n\t\t\tswLabel = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();\n\n\t\tpValue = JS_GetObjectElement(isolate,pObj,L\"bPassword\");\n\t\t\tbPassWord = (bool)CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue));\n\t}\n\telse\n\t{\n\t\tswitch(iLength)\n\t\t{\n\t\tcase 1:\n\t\t\tswQuestion = params[0];\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tswQuestion = params[0];\n\t\t\tswTitle = params[1];\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tswQuestion = params[0];\n\t\t\tswTitle = params[1];\n\t\t\tswDefault = params[2];\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tswQuestion = params[0];\n\t\t\tswTitle = params[1];\n\t\t\tswDefault = params[2];\n\t\t\tbPassWord = params[3];\n\t\t\tbreak;\n\t\tcase 5:\n\t\t\tswQuestion = params[0];\n\t\t\tswTitle = params[1];\n\t\t\tswDefault = params[2];\n\t\t\tbPassWord = params[3];\n\t\t\tswLabel = params[4];\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tCJS_Context* pContext = (CJS_Context *)cc;\n\tASSERT(pContext != NULL);\n\n\tCPDFDoc_Environment* pApp = pContext->GetReaderApp();\n\tASSERT(pApp != NULL);\n\tint nLength = 2048;\n\tchar* pBuff = new char[nLength];\n\tnLength = pApp->JS_appResponse(swQuestion, swTitle, swDefault, swLabel, bPassWord, pBuff, nLength);\n\tif(nLength<=0)\n\t{\n\t\tdelete[] pBuff;\n\t\tvRet.SetNull();\n\t\treturn FALSE;\n\t}\n\telse\n\t{\n\t\tnLength = nLength > sizeof(pBuff) ? sizeof(pBuff) : nLength;\n        vRet = swResponse = CFX_WideString::FromUTF16LE((unsigned short*)pBuff, nLength / 2);\n\t}\n\tdelete[] pBuff;\n\n\treturn TRUE;\n}\n\nFX_BOOL app::media(OBJ_PROP_PARAMS)\n{\n\treturn FALSE;\n}\n\nFX_BOOL app::execDialog(OBJ_METHOD_PARAMS)\n{\n\treturn TRUE;\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/javascript/color.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/javascript/JavaScript.h\"\n#include \"../../include/javascript/IJavaScript.h\"\n#include \"../../include/javascript/JS_Define.h\"\n#include \"../../include/javascript/JS_Object.h\"\n#include \"../../include/javascript/JS_Value.h\"\n#include \"../../include/javascript/color.h\"\n#include \"../../include/javascript/JS_EventHandler.h\"\n#include \"../../include/javascript/JS_Context.h\"\n#include \"../../include/javascript/JS_Runtime.h\"\n\nstatic v8::Isolate* GetIsolate(IFXJS_Context* cc)\n{\n\tCJS_Context* pContext = (CJS_Context *)cc;\n\tASSERT(pContext != NULL);\n\n\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\tASSERT(pRuntime != NULL);\n\n\treturn pRuntime->GetIsolate();\n}\n/* -------------------------- color -------------------------- */\n\nBEGIN_JS_STATIC_CONST(CJS_Color)\nEND_JS_STATIC_CONST()\n\nBEGIN_JS_STATIC_PROP(CJS_Color)\n\tJS_STATIC_PROP_ENTRY(black)\n\tJS_STATIC_PROP_ENTRY(blue)\n\tJS_STATIC_PROP_ENTRY(cyan)\t\n\tJS_STATIC_PROP_ENTRY(dkGray)\n\tJS_STATIC_PROP_ENTRY(gray)\n\tJS_STATIC_PROP_ENTRY(green)\n\tJS_STATIC_PROP_ENTRY(ltGray)\n\tJS_STATIC_PROP_ENTRY(magenta)\n\tJS_STATIC_PROP_ENTRY(red)\t\n\tJS_STATIC_PROP_ENTRY(transparent)\n\tJS_STATIC_PROP_ENTRY(white)\n\tJS_STATIC_PROP_ENTRY(yellow)\nEND_JS_STATIC_PROP()\n\nBEGIN_JS_STATIC_METHOD(CJS_Color)\n\tJS_STATIC_METHOD_ENTRY(convert, 2)\n\tJS_STATIC_METHOD_ENTRY(equal, 2)\nEND_JS_STATIC_METHOD()\n\nIMPLEMENT_JS_CLASS(CJS_Color,color)\n\ncolor::color(CJS_Object* pJSObject): CJS_EmbedObj(pJSObject)\n{\n\tm_crTransparent = CPWL_Color(COLORTYPE_TRANSPARENT);\n\tm_crBlack = CPWL_Color(COLORTYPE_GRAY, 0);\n\tm_crWhite = CPWL_Color(COLORTYPE_GRAY, 1);\n\tm_crRed = CPWL_Color(COLORTYPE_RGB, 1, 0 ,0);\n\tm_crGreen = CPWL_Color(COLORTYPE_RGB, 0, 1 ,0);\n\tm_crBlue = CPWL_Color(COLORTYPE_RGB, 0, 0 ,1);\n\tm_crCyan = CPWL_Color(COLORTYPE_CMYK, 1, 0 ,0, 0);\n\tm_crMagenta = CPWL_Color(COLORTYPE_CMYK, 0, 1 ,0, 0);\n\tm_crYellow = CPWL_Color(COLORTYPE_CMYK, 0, 0 ,1, 0);\n\tm_crDKGray = CPWL_Color(COLORTYPE_GRAY, 0.25);\n\tm_crGray = CPWL_Color(COLORTYPE_GRAY, 0.5);\n\tm_crLTGray = CPWL_Color(COLORTYPE_GRAY, 0.75);\n}\n\ncolor::~color(void)\n{\n}\n\nvoid color::ConvertPWLColorToArray(const CPWL_Color& color, CJS_Array& array)\n{\n\tswitch (color.nColorType)\n\t{\n\tcase COLORTYPE_TRANSPARENT:\n\t\tarray.SetElement(0, CJS_Value(array.GetIsolate(), \"T\"));\n\t\tbreak;\n\tcase COLORTYPE_GRAY:\n\t\tarray.SetElement(0, CJS_Value(array.GetIsolate(),\"G\"));\n\t\tarray.SetElement(1, CJS_Value(array.GetIsolate(),color.fColor1));\n\t\tbreak;\n\tcase COLORTYPE_RGB:\n\t\tarray.SetElement(0, CJS_Value(array.GetIsolate(),\"RGB\"));\n\t\tarray.SetElement(1, CJS_Value(array.GetIsolate(),color.fColor1));\n\t\tarray.SetElement(2, CJS_Value(array.GetIsolate(),color.fColor2));\n\t\tarray.SetElement(3, CJS_Value(array.GetIsolate(),color.fColor3));\n\t\tbreak;\n\tcase COLORTYPE_CMYK:\n\t\tarray.SetElement(0, CJS_Value(array.GetIsolate(),\"CMYK\"));\n\t\tarray.SetElement(1, CJS_Value(array.GetIsolate(),color.fColor1));\n\t\tarray.SetElement(2, CJS_Value(array.GetIsolate(),color.fColor2));\n\t\tarray.SetElement(3, CJS_Value(array.GetIsolate(),color.fColor3));\n\t\tarray.SetElement(4, CJS_Value(array.GetIsolate(),color.fColor4));\n\t\tbreak;\n\t}\n}\n\nvoid color::ConvertArrayToPWLColor(CJS_Array& array, CPWL_Color& color)\n{\n\tint nArrayLen = array.GetLength();\n\tif (nArrayLen < 1) return;\n\n\tCJS_Value value(array.GetIsolate());\n\tCFX_ByteString sSpace;\n\tarray.GetElement(0, value);\n\tsSpace = value;\n\n\tdouble d1 = 0;\n\tdouble d2 = 0;\n\tdouble d3 = 0;\n\tdouble d4 = 0;\n\n\tif (nArrayLen > 1)\n\t{\n\t\tarray.GetElement(1, value);\n\t\td1 = value;\n\t}\n\n\tif (nArrayLen > 2)\n\t{\n\t\tarray.GetElement(2, value);\n\t\td2 = value;\n\t}\n\n\tif (nArrayLen > 3)\n\t{\n\t\tarray.GetElement(3, value);\n\t\td3 = value;\n\t}\n\n\tif (nArrayLen > 4)\n\t{\n\t\tarray.GetElement(4, value);\n\t\td4 = value;\n\t}\n\n\tif (sSpace == \"T\")\n\t{\n\t\tcolor = CPWL_Color(COLORTYPE_TRANSPARENT);\n\t}\n\telse if (sSpace == \"G\")\n\t{\n\t\tcolor = CPWL_Color(COLORTYPE_GRAY, (FX_FLOAT)d1);\n\t}\n\telse if (sSpace == \"RGB\")\n\t{\n\t\tcolor = CPWL_Color(COLORTYPE_RGB, (FX_FLOAT)d1, (FX_FLOAT)d2, (FX_FLOAT)d3);\n\t}\n\telse if (sSpace == \"CMYK\")\n\t{\n\t\tcolor = CPWL_Color(COLORTYPE_CMYK, (FX_FLOAT)d1, (FX_FLOAT)d2, (FX_FLOAT)d3, (FX_FLOAT)d4);\n\t}\n}\n\n#define JS_IMPLEMENT_COLORPROP(prop, var)\\\nFX_BOOL color::prop(OBJ_PROP_PARAMS)\\\n{\\\n\tCJS_Context* pContext = (CJS_Context*)cc;\\\n\tv8::Isolate* isolate = pContext->GetJSRuntime()->GetIsolate();\\\n\tif (vp.IsGetting())\\\n\t{\\\n\t\tCJS_Array array(isolate);\\\n\t\tConvertPWLColorToArray(var, array);\\\n\t\tvp << array;\\\n\t}\\\n\telse\\\n\t{\\\n\t\tCJS_Array array(isolate);\\\n\t\tif (!vp.ConvertToArray(array)) return FALSE;\\\n\t\tConvertArrayToPWLColor(array, var);\\\n\t}\\\n\treturn TRUE;\\\n}\n\nJS_IMPLEMENT_COLORPROP(transparent, m_crTransparent)\nJS_IMPLEMENT_COLORPROP(black, m_crBlack)\nJS_IMPLEMENT_COLORPROP(white, m_crWhite)\nJS_IMPLEMENT_COLORPROP(red, m_crRed)\nJS_IMPLEMENT_COLORPROP(green, m_crGreen)\nJS_IMPLEMENT_COLORPROP(blue, m_crBlue)\nJS_IMPLEMENT_COLORPROP(cyan, m_crCyan)\nJS_IMPLEMENT_COLORPROP(magenta, m_crMagenta)\nJS_IMPLEMENT_COLORPROP(yellow, m_crYellow)\nJS_IMPLEMENT_COLORPROP(dkGray, m_crDKGray)\nJS_IMPLEMENT_COLORPROP(gray, m_crGray)\nJS_IMPLEMENT_COLORPROP(ltGray, m_crLTGray)\n\nFX_BOOL color::convert(OBJ_METHOD_PARAMS)\n{\n\tv8::Isolate* isolate = GetIsolate(cc);\n\tint iSize = params.size();\n\tif (iSize < 2) return FALSE;\n\tCJS_Array aSource(isolate);\n\tif (!params[0].ConvertToArray(aSource)) return FALSE;\n\n\tCPWL_Color crSource;\n\tConvertArrayToPWLColor(aSource, crSource);\n\n\tCFX_ByteString sDestSpace = params[1];\n\n\tint nColorType = COLORTYPE_TRANSPARENT;\n\t\n\tif (sDestSpace == \"T\")\n\t{\n\t\tnColorType = COLORTYPE_TRANSPARENT;\n\t}\n\telse if (sDestSpace == \"G\")\n\t{\n\t\tnColorType = COLORTYPE_GRAY;\n\t}\n\telse if (sDestSpace == \"RGB\")\n\t{\n\t\tnColorType = COLORTYPE_RGB;\n\t}\n\telse if (sDestSpace == \"CMYK\")\n\t{\n\t\tnColorType = COLORTYPE_CMYK;\n\t}\n\n\tCJS_Array aDest(isolate);\n\tCPWL_Color crDest = crSource;\n\tcrDest.ConvertColorType(nColorType);\n\tConvertPWLColorToArray(crDest, aDest);\n\tvRet = aDest;\n\n\treturn TRUE;\n}\n\nFX_BOOL color::equal(OBJ_METHOD_PARAMS)\n{\n\tv8::Isolate* isolate = GetIsolate(cc);\n\tif (params.size() < 2) return FALSE;\n\n\tCJS_Array array1(isolate), array2(isolate);\n\n\tif (!params[0].ConvertToArray(array1)) return FALSE;\n\tif (!params[1].ConvertToArray(array2)) return FALSE;\n\n\tCPWL_Color color1;\n\tCPWL_Color color2;\n\n\tConvertArrayToPWLColor(array1, color1);\n\tConvertArrayToPWLColor(array2, color2);\n\n\tcolor1.ConvertColorType(color2.nColorType);\n\n\tvRet = color1 == color2;\n\treturn TRUE;\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/javascript/console.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/javascript/JavaScript.h\"\n#include \"../../include/javascript/IJavaScript.h\"\n#include \"../../include/javascript/JS_Define.h\"\n#include \"../../include/javascript/JS_Object.h\"\n#include \"../../include/javascript/JS_Value.h\"\n#include \"../../include/javascript/console.h\"\n//#include \"../../include/javascript/JS_Module.h\"\n#include \"../../include/javascript/JS_EventHandler.h\"\n//#include \"../../include/javascript/JS_ResMgr.h\"\n#include \"../../include/javascript/JS_Context.h\"\n\n/* ------------------------ console ------------------------ */\n\nBEGIN_JS_STATIC_CONST(CJS_Console)\nEND_JS_STATIC_CONST()\n\nBEGIN_JS_STATIC_PROP(CJS_Console)\nEND_JS_STATIC_PROP()\n\nBEGIN_JS_STATIC_METHOD(CJS_Console)\n\tJS_STATIC_METHOD_ENTRY(clear, 0)\n\tJS_STATIC_METHOD_ENTRY(hide, 0)\n\tJS_STATIC_METHOD_ENTRY(println, 1)\n\tJS_STATIC_METHOD_ENTRY(show, 0)\nEND_JS_STATIC_METHOD()\n\nIMPLEMENT_JS_CLASS(CJS_Console,console)\n\n#define MAXCONSOLECONTENTS\t\t\t10000\n\nconsole::console(CJS_Object* pJSObject): CJS_EmbedObj(pJSObject)\n{\n}\n\nconsole::~console()\n{\n}\n\nFX_BOOL console::clear(OBJ_METHOD_PARAMS)\n{\n\n\n\n\treturn TRUE;\n}\n\nFX_BOOL console::hide(OBJ_METHOD_PARAMS)\n{\n\n\n\t\n\n\treturn TRUE;\n}\n\nFX_BOOL console::println(OBJ_METHOD_PARAMS)\n{\n\tif (params.size() < 1)\n\t{\n\t\treturn FALSE;\n\t}\n  \n\treturn TRUE;\n}\n\nFX_BOOL console::show(OBJ_METHOD_PARAMS)\n{\n\treturn TRUE;\n}\n\n\n\n"
  },
  {
    "path": "fpdfsdk/src/javascript/event.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/javascript/JavaScript.h\"\n#include \"../../include/javascript/IJavaScript.h\"\n#include \"../../include/javascript/JS_Define.h\"\n#include \"../../include/javascript/JS_Object.h\"\n#include \"../../include/javascript/JS_Value.h\"\n#include \"../../include/javascript/JS_EventHandler.h\"\n//#include \"../include/JS_ResMgr.h\"\n#include \"../../include/javascript/JS_Context.h\"\n#include \"../../include/javascript/event.h\"\n#include \"../../include/javascript/Field.h\"\n\n/* -------------------------- event -------------------------- */\n\nBEGIN_JS_STATIC_CONST(CJS_Event)\nEND_JS_STATIC_CONST()\n\nBEGIN_JS_STATIC_PROP(CJS_Event)\n\tJS_STATIC_PROP_ENTRY(change)\n\tJS_STATIC_PROP_ENTRY(changeEx)\n\tJS_STATIC_PROP_ENTRY(commitKey)\n\tJS_STATIC_PROP_ENTRY(fieldFull)\n\tJS_STATIC_PROP_ENTRY(keyDown)\n\tJS_STATIC_PROP_ENTRY(modifier)\n\tJS_STATIC_PROP_ENTRY(name)\n\tJS_STATIC_PROP_ENTRY(rc)\n\tJS_STATIC_PROP_ENTRY(richChange)\n\tJS_STATIC_PROP_ENTRY(richChangeEx)\n\tJS_STATIC_PROP_ENTRY(richValue)\n\tJS_STATIC_PROP_ENTRY(selEnd)\n\tJS_STATIC_PROP_ENTRY(selStart)\n\tJS_STATIC_PROP_ENTRY(shift)\n\tJS_STATIC_PROP_ENTRY(source)\n\tJS_STATIC_PROP_ENTRY(target)\n\tJS_STATIC_PROP_ENTRY(targetName)\n\tJS_STATIC_PROP_ENTRY(type)\n\tJS_STATIC_PROP_ENTRY(value)\n\tJS_STATIC_PROP_ENTRY(willCommit)\nEND_JS_STATIC_PROP()\n\nBEGIN_JS_STATIC_METHOD(CJS_Event)  \nEND_JS_STATIC_METHOD()\n\nIMPLEMENT_JS_CLASS(CJS_Event,event)\n\nevent::event(CJS_Object * pJsObject) : CJS_EmbedObj(pJsObject)                           \n{\n}\n\nevent::~event(void)\n{\n}\n\nFX_BOOL event::change(OBJ_PROP_PARAMS)\n{\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_EventHandler* pEvent = pContext->GetEventHandler();\n\tASSERT(pEvent != NULL);\n\n\tCFX_WideString &wChange = pEvent->Change();\n\tif (vp.IsSetting())\n\t{\n\t\tif (vp.GetType() == VT_string)\n\t\t\tvp >> wChange;\n\t}\n\telse\n\t{\n\t\tvp << wChange;\n\t}\n\treturn TRUE;\n}\n\nFX_BOOL event::changeEx(OBJ_PROP_PARAMS)\n{\n\tif (!vp.IsGetting())return FALSE;\n\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_EventHandler* pEvent = pContext->GetEventHandler();\n\tASSERT(pEvent != NULL);\n\n\tvp << pEvent->ChangeEx();\n\treturn TRUE;\t\n}\n\nFX_BOOL event::commitKey(OBJ_PROP_PARAMS)\n{\n\tif (!vp.IsGetting())return FALSE;\n\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_EventHandler* pEvent = pContext->GetEventHandler();\n\tASSERT(pEvent != NULL);\n\n\tvp << pEvent->CommitKey();\n\treturn TRUE;\n}\n\nFX_BOOL event::fieldFull(OBJ_PROP_PARAMS)\n{\t\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_EventHandler* pEvent = pContext->GetEventHandler();\n\tASSERT(pEvent != NULL);\n\n\tif (!vp.IsGetting() && wcscmp((const wchar_t*)pEvent->Name(),L\"Keystroke\") != 0)\n\t\treturn FALSE;\n\n\tif (pEvent->FieldFull())\n\t\tvp << TRUE;\n\telse\n\t\tvp << FALSE;\n\treturn TRUE;\n}\n\nFX_BOOL event::keyDown(OBJ_PROP_PARAMS)\n{\n\tif (!vp.IsGetting())return FALSE;\n\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_EventHandler* pEvent = pContext->GetEventHandler();\n\tASSERT(pEvent != NULL);\n\n\tif (pEvent->KeyDown())\n\t\tvp << TRUE;\n\telse\n\t\tvp << FALSE;\n\treturn TRUE;\n}\n\nFX_BOOL event::modifier(OBJ_PROP_PARAMS)\n{\n\tif (!vp.IsGetting())return FALSE;\n\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_EventHandler* pEvent = pContext->GetEventHandler();\n\tASSERT(pEvent != NULL);\n\n\tif (pEvent->Modifier())\n\t\tvp << TRUE;\n\telse\n\t\tvp << FALSE;\n\treturn TRUE;\n}\n\nFX_BOOL event::name(OBJ_PROP_PARAMS)\n{\n\tif (!vp.IsGetting())return FALSE;\n\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_EventHandler* pEvent = pContext->GetEventHandler();\n\tASSERT(pEvent != NULL);\n\n\tvp << pEvent->Name();\n\treturn TRUE;\n}\n\nFX_BOOL event::rc(OBJ_PROP_PARAMS)\n{\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_EventHandler* pEvent = pContext->GetEventHandler();\n\tASSERT(pEvent != NULL);\n\n    FX_BOOL &bRc = pEvent->Rc();\n\tif (vp.IsSetting())\n\t{\n\t\tvp>>bRc;\n\t}\n\telse\n\t{\n\t\tvp<<bRc;\n\t}\n\treturn TRUE;\n}\n\nFX_BOOL event::richChange(OBJ_PROP_PARAMS)\n{\n\treturn TRUE;\n\tif (vp.IsSetting())\n\t{\n\t}\n\telse\n\t{\n\t\t;\n\t}\n\treturn TRUE;\n}\n\nFX_BOOL event::richChangeEx(OBJ_PROP_PARAMS)\n{\n\treturn TRUE;\n\tif (vp.IsSetting())\n\t{\n\t}\n\telse\n\t{\n\t\t;\n\t}\n\treturn TRUE;\n}\n\n\nFX_BOOL event::richValue(OBJ_PROP_PARAMS)\n{\n\treturn TRUE;\n\tif (vp.IsSetting())\n\t{\n\t}\n\telse\n\t{\n\t\t;\n\t}\n\treturn TRUE;\n}\n\nFX_BOOL event::selEnd(OBJ_PROP_PARAMS)\n{\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_EventHandler* pEvent = pContext->GetEventHandler();\n\tASSERT(pEvent != NULL);\n\n\tif (wcscmp((const wchar_t*)pEvent->Name(),L\"Keystroke\") != 0)\n\t{\n\t\treturn TRUE;\n\t}\n\n\tint &iSelEnd = pEvent->SelEnd();\n\tif (vp.IsSetting())\n\t{\n\t\tvp >> iSelEnd;\n\t}\n\telse\n\t{\n\t\tvp << iSelEnd;\n\t}\n\treturn TRUE;\n}\n\nFX_BOOL event::selStart(OBJ_PROP_PARAMS)\n{\t\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_EventHandler* pEvent = pContext->GetEventHandler();\n\tASSERT(pEvent != NULL);\n\n\tif (wcscmp((const wchar_t*)pEvent->Name(),L\"Keystroke\") != 0)\n\t{\n\t\treturn TRUE;\n\t}\n\tint &iSelStart = pEvent->SelStart();\n\tif (vp.IsSetting())\n\t{\n\t\tvp >> iSelStart;\n\t}\n\telse\n\t{\n\t\tvp << iSelStart;\n\t}\n\treturn TRUE;\n}\n\nFX_BOOL event::shift(OBJ_PROP_PARAMS)\n{\n\tif (!vp.IsGetting())return FALSE;\n\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_EventHandler* pEvent = pContext->GetEventHandler();\n\tASSERT(pEvent != NULL);\n\n\tif (pEvent->Shift())\n\t\tvp << TRUE;\n\telse\n\t\tvp << FALSE;\n\treturn TRUE;\n}\n\nFX_BOOL event::source(OBJ_PROP_PARAMS)\n{\n\tif (!vp.IsGetting())return FALSE;\t\n\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_EventHandler* pEvent = pContext->GetEventHandler();\n\tASSERT(pEvent != NULL);\n\n\tvp << pEvent->Source()->GetJSObject();\n\treturn TRUE;\n}\n\nFX_BOOL event::target(OBJ_PROP_PARAMS)\n{\n\tif (!vp.IsGetting())return FALSE;\n\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_EventHandler* pEvent = pContext->GetEventHandler();\n\tASSERT(pEvent != NULL);\n\n\tvp<<pEvent->Target_Field()->GetJSObject();\n\treturn TRUE;\n}\n\nFX_BOOL event::targetName(OBJ_PROP_PARAMS)\n{\n\tif (!vp.IsGetting())return FALSE;\n\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_EventHandler* pEvent = pContext->GetEventHandler();\n\tASSERT(pEvent != NULL);\n\n\tvp << pEvent->TargetName();\n\treturn TRUE;\n}\n\nFX_BOOL event::type(OBJ_PROP_PARAMS)\n{\n\tif (!vp.IsGetting())return FALSE;\n\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_EventHandler* pEvent = pContext->GetEventHandler();\n\tASSERT(pEvent != NULL);\n\n\tvp << pEvent->Type();\n\treturn TRUE;\n}\n\nFX_BOOL event::value(OBJ_PROP_PARAMS)\n{\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_EventHandler* pEvent = pContext->GetEventHandler();\n\tASSERT(pEvent != NULL);\n\n\tif (wcscmp((const wchar_t*)pEvent->Type(),L\"Field\") != 0)\n\t\treturn FALSE;\n\tif(!pEvent->m_pValue)\n\t\treturn FALSE;\n\tCFX_WideString & val = pEvent->Value();\n\tif (vp.IsSetting())\n\t{\n\t\tval = vp;\n\t}\n\telse\n\t{\n\t\tvp << val;\n\t}\n\treturn TRUE;\n}\n\nFX_BOOL event::willCommit(OBJ_PROP_PARAMS)\n{\n\tif (!vp.IsGetting())return FALSE;\n\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\tCJS_EventHandler* pEvent = pContext->GetEventHandler();\n\tASSERT(pEvent != NULL);\n\n\tif (pEvent->WillCommit())\n\t\tvp << TRUE;\n\telse\n\t\tvp << FALSE;\n\treturn TRUE;\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/javascript/global.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/javascript/JavaScript.h\"\n#include \"../../include/javascript/IJavaScript.h\"\n#include \"../../include/javascript/JS_Define.h\"\n#include \"../../include/javascript/JS_Object.h\"\n#include \"../../include/javascript/JS_Value.h\"\n#include \"../../include/javascript/JS_GlobalData.h\"\n#include \"../../include/javascript/global.h\"\n#include \"../../include/javascript/JS_EventHandler.h\"\n#include \"../../include/javascript/JS_Context.h\"\n\n/* ---------------------------- global ---------------------------- */\n\nBEGIN_JS_STATIC_CONST(CJS_Global)\nEND_JS_STATIC_CONST()\n\nBEGIN_JS_STATIC_PROP(CJS_Global)\nEND_JS_STATIC_PROP()\n\nBEGIN_JS_STATIC_METHOD(CJS_Global)\n\tJS_STATIC_METHOD_ENTRY(setPersistent, 2)\nEND_JS_STATIC_METHOD()\n\nIMPLEMENT_SPECIAL_JS_CLASS(CJS_Global, global_alternate, global);\n\nFX_BOOL\tCJS_Global::InitInstance(IFXJS_Context* cc)\n{\n\tCJS_Context* pContext = (CJS_Context*)cc;\n\tASSERT(pContext != NULL);\n\n\tglobal_alternate* pGlobal = (global_alternate*)GetEmbedObject();\n\tASSERT(pGlobal != NULL);\n\t\n\tpGlobal->Initial(pContext->GetReaderApp());\n\t\n\treturn TRUE;\n};\n\nglobal_alternate::global_alternate(CJS_Object* pJSObject)\n\t: CJS_EmbedObj(pJSObject),\n\tm_pApp(NULL)\n{\n}\n\nglobal_alternate::~global_alternate(void)\n{\n\tASSERT(m_pApp != NULL);\n\n//\tCommitGlobalPersisitentVariables();\n\tDestroyGlobalPersisitentVariables();\n\n\tCJS_RuntimeFactory* pFactory = m_pApp->m_pJSRuntimeFactory;\n\tASSERT(pFactory);\n\n\tpFactory->ReleaseGlobalData();\n}\n  \nvoid global_alternate::Initial(CPDFDoc_Environment* pApp)\n{\n\tm_pApp = pApp;\n\n\tCJS_RuntimeFactory* pFactory = pApp->m_pJSRuntimeFactory;\n\tASSERT(pFactory);\n\tm_pGlobalData = pFactory->NewGlobalData(pApp);\n\tUpdateGlobalPersistentVariables();\n}\n\nFX_BOOL\tglobal_alternate::QueryProperty(FX_LPCWSTR propname)\n{\n\treturn CFX_WideString(propname) != L\"setPersistent\";\n}\n\nFX_BOOL\tglobal_alternate::DelProperty(IFXJS_Context* cc, FX_LPCWSTR propname, JS_ErrorString& sError)\n{\n\tjs_global_data* pData = NULL;\n\tCFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname);\n\n\tif (m_mapGlobal.Lookup(sPropName, (FX_LPVOID&)pData))\n\t{\n\t\tpData->bDeleted = TRUE;\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL global_alternate::DoProperty(IFXJS_Context* cc, FX_LPCWSTR propname, CJS_PropValue& vp, JS_ErrorString& sError)\n{\n\tif (vp.IsSetting())\n\t{\n\t\tCFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname);\n\t\tswitch (vp.GetType())\n\t\t{\n\t\tcase VT_number:\n\t\t\t{\n\t\t\t\tdouble dData;\n\t\t\t\tvp >> dData;\n\t\t\t\treturn SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_NUMBER, dData, false, \"\", v8::Handle<v8::Object>(), FALSE);\n\t\t\t}\n\t\tcase VT_boolean:\n\t\t\t{\n\t\t\t\tbool bData;\n\t\t\t\tvp >> bData;\n\t\t\t\treturn SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_BOOLEAN, 0, (bool)vp, \"\", v8::Handle<v8::Object>(), FALSE);\n\t\t\t}\n\t\tcase VT_string:\n\t\t\t{\n\t\t\t\tCFX_ByteString sData;\n\t\t\t\tvp >> sData;\n\t\t\t\treturn SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_STRING, 0, false, sData, v8::Handle<v8::Object>(), FALSE);\n\t\t\t}\n\t\tcase VT_object:\n\t\t\t{\n\t\t\t\tJSObject pData = (JSObject)vp;\n\t\t\t\treturn SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_OBJECT, 0, false, \"\", pData, FALSE);\n// \t\t\t\telse\n// \t\t\t\t{\n// \t\t\t\t\tif (vp.IsArrayObject())\n// \t\t\t\t\t{\n// \t\t\t\t\t\tCJS_Array array;\n// \t\t\t\t\t\tvp.ConvertToArray(array);\n// \t\t\t\t\t\treturn SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_OBJECT, 0, false, \"\", \n// \t\t\t\t\t\t\t(Dobject*)(Darray*)array, FALSE);\n// \t\t\t\t\t}\n// \t\t\t\t\telse\n// \t\t\t\t\t\treturn FALSE;\n// \t\t\t\t}\n\t\t\t}\n\t\tcase VT_null:\n\t\t\t{\n\t\t\t\treturn SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_NULL, 0, false, \"\", v8::Handle<v8::Object>(), FALSE);\n\t\t\t}\n\t\tcase VT_undefined:\n\t\t\t{\n\t\t\t\tDelProperty(cc, propname, sError);\n\t\t\t\treturn TRUE;\n\t\t\t}\n\t\tdefault:\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\telse\n\t{\n\t\tjs_global_data* pData = NULL;\n\t\tCFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname);\n\n\t\tif (m_mapGlobal.Lookup(sPropName, (FX_LPVOID&)pData))\n\t\t{\n\t\t\tif (pData)\n\t\t\t{\n\t\t\t\tif (!pData->bDeleted)\n\t\t\t\t{\n\t\t\t\t\tswitch (pData->nType)\n\t\t\t\t\t{\n\t\t\t\t\tcase JS_GLOBALDATA_TYPE_NUMBER:\n\t\t\t\t\t\tvp << pData->dData;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase JS_GLOBALDATA_TYPE_BOOLEAN:\n\t\t\t\t\t\tvp << pData->bData;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase JS_GLOBALDATA_TYPE_STRING:\n\t\t\t\t\t\tvp << pData->sData;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase JS_GLOBALDATA_TYPE_OBJECT:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tv8::Handle<v8::Object> obj = v8::Local<v8::Object>::New(vp.GetIsolate(),pData->pData);\n\t\t\t\t\t\t\tvp << obj;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\tcase JS_GLOBALDATA_TYPE_NULL:\n\t\t\t\t\t\tvp.SetNull();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn FALSE;\n\t\t\t\t\t}\n\t\t\t\t\treturn TRUE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn TRUE;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvp.SetNull();\n\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvp.SetNull();\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL global_alternate::setPersistent(OBJ_METHOD_PARAMS)\n{\n\tif (params.size() != 2)\n\t{\n\t\t//sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);\t\n\t\treturn FALSE;\n\t}\n\n\tCFX_ByteString sName = params[0];\n\n\tjs_global_data* pData = NULL;\n\tif (m_mapGlobal.Lookup(sName, (FX_LPVOID&)pData))\n\t{\n\t\tif (pData && !pData->bDeleted)\n\t\t{\n\t\t\tpData->bPersistent = (bool)params[1];\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\t//sError = JSGetStringFromID(IDS_JSPARAM_INCORRECT);\t\n\treturn FALSE;\n}\n\nvoid global_alternate::UpdateGlobalPersistentVariables()\n{\n\tASSERT(m_pGlobalData != NULL);\n\n\tfor (int i=0,sz=m_pGlobalData->GetSize(); i<sz; i++)\n\t{\n\t\tCJS_GlobalData_Element* pData = m_pGlobalData->GetAt(i);\n\t\tASSERT(pData != NULL);\n\n\t\tswitch (pData->data.nType)\n\t\t{\n\t\tcase JS_GLOBALDATA_TYPE_NUMBER:\n\t\t\tthis->SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_NUMBER, pData->data.dData, false, \"\", v8::Handle<v8::Object>(), pData->bPersistent == 1);\n\t\t\tJS_PutObjectNumber(NULL,(JSFXObject)(*m_pJSObject),\n\t\t\t\tpData->data.sKey.UTF8Decode(), pData->data.dData);\n\t\t\tbreak;\n\t\tcase JS_GLOBALDATA_TYPE_BOOLEAN:\n\t\t\tthis->SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_BOOLEAN, 0, (bool)(pData->data.bData == 1), \"\", v8::Handle<v8::Object>(), pData->bPersistent == 1);\n\t\t\tJS_PutObjectBoolean(NULL,(JSFXObject)(*m_pJSObject),\n\t\t\t\tpData->data.sKey.UTF8Decode(), (bool)(pData->data.bData == 1));\n\t\t\tbreak;\n\t\tcase JS_GLOBALDATA_TYPE_STRING:\n\t\t\tthis->SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_STRING, 0, false, pData->data.sData, v8::Handle<v8::Object>(), pData->bPersistent == 1);\n\t\t\tJS_PutObjectString(NULL,(JSFXObject)(*m_pJSObject),\n\t\t\t\tpData->data.sKey.UTF8Decode(), \n\t\t\t\tpData->data.sData.UTF8Decode());\n\t\t\tbreak;\n\t\tcase JS_GLOBALDATA_TYPE_OBJECT:\n\t\t\t{\n\t\t\t\tIJS_Runtime* pRuntime = JS_GetRuntime((JSFXObject)(*m_pJSObject));\n\t\t\t\tv8::Handle<v8::Object> pObj = JS_NewFxDynamicObj(pRuntime, NULL, -1);\n\n\t\t\t\tPutObjectProperty(pObj, &pData->data);\n\n\t\t\t\tthis->SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_OBJECT, 0, false, \"\", \n\t\t\t\t\t(JSObject)pObj, pData->bPersistent == 1);\n\t\t\t\tJS_PutObjectObject(NULL,(JSFXObject)(*m_pJSObject),\n\t\t\t\t\tpData->data.sKey.UTF8Decode(), (JSObject)pObj);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase JS_GLOBALDATA_TYPE_NULL:\n\t\t\tthis->SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_NULL, 0, false, \"\", v8::Handle<v8::Object>(), pData->bPersistent == 1);\n\t\t\tJS_PutObjectNull(NULL,(JSFXObject)(*m_pJSObject),\n\t\t\t\tpData->data.sKey.UTF8Decode());\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nvoid global_alternate::CommitGlobalPersisitentVariables()\n{\n\tASSERT(m_pGlobalData != NULL);\n\n\tFX_POSITION\t pos = m_mapGlobal.GetStartPosition();\n\twhile (pos)\n\t{\n\t\tCFX_ByteString name; \n\t\tjs_global_data* pData = NULL;\n\t\tm_mapGlobal.GetNextAssoc(pos, name, (FX_LPVOID&)pData);\n\t\t\n\t\tif (pData)\n\t\t{\n\t\t\tif (pData->bDeleted)\n\t\t\t{\n\t\t\t\tm_pGlobalData->DeleteGlobalVariable(name);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tswitch (pData->nType)\n\t\t\t\t{\n\t\t\t\tcase JS_GLOBALDATA_TYPE_NUMBER:\n\t\t\t\t\tm_pGlobalData->SetGlobalVariableNumber(name, pData->dData);\n\t\t\t\t\tm_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);\n\t\t\t\t\tbreak;\n\t\t\t\tcase JS_GLOBALDATA_TYPE_BOOLEAN:\n\t\t\t\t\tm_pGlobalData->SetGlobalVariableBoolean(name, pData->bData);\n\t\t\t\t\tm_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);\n\t\t\t\t\tbreak;\n\t\t\t\tcase JS_GLOBALDATA_TYPE_STRING:\n\t\t\t\t\tm_pGlobalData->SetGlobalVariableString(name, pData->sData);\n\t\t\t\t\tm_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);\n\t\t\t\t\tbreak;\n\t\t\t\tcase JS_GLOBALDATA_TYPE_OBJECT:\n\t\t\t\t\t//if (pData->pData)\n\t\t\t\t\t{\n\t\t\t\t\t\tCJS_GlobalVariableArray array;\n\t\t\t\t\t\tv8::Handle<v8::Object> obj = v8::Local<v8::Object>::New(GetJSObject()->GetIsolate(),pData->pData);\n\t\t\t\t\t\tObjectToArray(obj, array);\n\t\t\t\t\t\tm_pGlobalData->SetGlobalVariableObject(name, array);\n\t\t\t\t\t\tm_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase JS_GLOBALDATA_TYPE_NULL:\n\t\t\t\t\tm_pGlobalData->SetGlobalVariableNull(name);\n\t\t\t\t\tm_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid global_alternate::ObjectToArray(v8::Handle<v8::Object> pObj, CJS_GlobalVariableArray& array)\n{\n\tv8::Handle<v8::Array> pKeyList = JS_GetObjectElementNames(pObj);\n\tint\tnObjElements = pKeyList->Length();\n\n\tv8::Local<v8::Context> context = pObj->CreationContext();\n\tv8::Isolate* isolate = context->GetIsolate();\n\n\tfor (int i=0; i<nObjElements; i++)\n\t{\n\t\t\n\t\tCFX_WideString ws = JS_ToString(JS_GetArrayElemnet(pKeyList, i));\n\t\tCFX_ByteString sKey = ws.UTF8Encode();\n\n\t\tv8::Handle<v8::Value> v = JS_GetObjectElement(isolate, pObj, (const wchar_t*)(FX_LPCWSTR)ws);\n\t\tFXJSVALUETYPE vt = GET_VALUE_TYPE(v);\n\t\tswitch (vt)\n\t\t{\n\t\tcase VT_number:\n\t\t\t{\n\t\t\t\tCJS_KeyValue* pObjElement = new CJS_KeyValue;\n\t\t\t\tpObjElement->nType = JS_GLOBALDATA_TYPE_NUMBER;\n\t\t\t\tpObjElement->sKey = sKey;\n\t\t\t\tpObjElement->dData = JS_ToNumber(v);\n\t\t\t\tarray.Add(pObjElement);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase VT_boolean:\n\t\t\t{\n\t\t\t\tCJS_KeyValue* pObjElement = new CJS_KeyValue;\n\t\t\t\tpObjElement->nType = JS_GLOBALDATA_TYPE_BOOLEAN;\n\t\t\t\tpObjElement->sKey = sKey;\n\t\t\t\tpObjElement->dData = JS_ToBoolean(v);\n\t\t\t\tarray.Add(pObjElement);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase VT_string:\n\t\t\t{\n\t\t\t\tCFX_ByteString sValue = CJS_Value(isolate, v, VT_string);\n\t\t\t\tCJS_KeyValue* pObjElement = new CJS_KeyValue;\n\t\t\t\tpObjElement->nType = JS_GLOBALDATA_TYPE_STRING;\n\t\t\t\tpObjElement->sKey = sKey;\n\t\t\t\tpObjElement->sData = sValue;\n\t\t\t\tarray.Add(pObjElement);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase VT_object:\n\t\t\t{\n\t\t\t\tCJS_KeyValue* pObjElement = new CJS_KeyValue;\n\t\t\t\tpObjElement->nType = JS_GLOBALDATA_TYPE_OBJECT;\n\t\t\t\tpObjElement->sKey = sKey;\n\t\t\t\tObjectToArray(JS_ToObject(v), pObjElement->objData);\n\t\t\t\tarray.Add(pObjElement);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase VT_null:\n\t\t\t{\n\t\t\t\tCJS_KeyValue* pObjElement = new CJS_KeyValue;\n\t\t\t\tpObjElement->nType = JS_GLOBALDATA_TYPE_NULL;\n\t\t\t\tpObjElement->sKey = sKey;\n\t\t\t\tarray.Add(pObjElement);\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nvoid global_alternate::PutObjectProperty(v8::Handle<v8::Object> pObj, CJS_KeyValue* pData)\n{\n\tASSERT(pData != NULL);\n\n\tfor (int i=0,sz=pData->objData.Count(); i<sz; i++)\n\t{\n\t\tCJS_KeyValue* pObjData = pData->objData.GetAt(i);\n\t\tASSERT(pObjData != NULL);\n\n\t\tswitch (pObjData->nType)\n\t\t{\n\t\tcase JS_GLOBALDATA_TYPE_NUMBER:\n\t\t\tJS_PutObjectNumber(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode(), pObjData->dData);\n\t\t\tbreak;\n\t\tcase JS_GLOBALDATA_TYPE_BOOLEAN:\n\t\t\tJS_PutObjectBoolean(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode(), (bool)(pObjData->bData == 1));\n\t\t\tbreak;\n\t\tcase JS_GLOBALDATA_TYPE_STRING:\n\t\t\tJS_PutObjectString(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode(), pObjData->sData.UTF8Decode());\n\t\t\tbreak;\n\t\tcase JS_GLOBALDATA_TYPE_OBJECT:\n\t\t\t{\n\t\t\t\tIJS_Runtime* pRuntime = JS_GetRuntime((JSFXObject)(*m_pJSObject));\n\t\t\t\tv8::Handle<v8::Object> pNewObj = JS_NewFxDynamicObj(pRuntime, NULL, -1);\n\t\t\t\tPutObjectProperty(pNewObj, pObjData);\n\t\t\t\tJS_PutObjectObject(NULL, (JSObject)pObj, pObjData->sKey.UTF8Decode(), (JSObject)pNewObj);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase JS_GLOBALDATA_TYPE_NULL:\n\t\t\tJS_PutObjectNull(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode());\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nvoid global_alternate::DestroyGlobalPersisitentVariables()\n{\n\tFX_POSITION\t pos = m_mapGlobal.GetStartPosition();\n\twhile (pos)\n\t{\n\t\tCFX_ByteString name; \n\t\tjs_global_data* pData = NULL;\n\t\tm_mapGlobal.GetNextAssoc(pos, name, (FX_LPVOID&)pData);\n\t\tdelete pData;\n\t}\n\n\tm_mapGlobal.RemoveAll();\n}\n\n\nFX_BOOL global_alternate::SetGlobalVariables(FX_LPCSTR propname, int nType, \n\t\t\t\tdouble dData, bool bData, const CFX_ByteString& sData, JSObject pData, bool bDefaultPersistent)\n{\n\tif (propname == NULL) return FALSE;\n\n\tjs_global_data* pTemp = NULL;\n\tm_mapGlobal.Lookup(propname, (FX_LPVOID&)pTemp);\n\n\tif (pTemp)\n\t{\n\t\tif (pTemp->bDeleted || pTemp->nType != nType)\n\t\t{\n\t\t\tpTemp->dData = 0;\n\t\t\tpTemp->bData = 0;\n\t\t\tpTemp->sData = \"\";\n\t\t\tpTemp->nType = nType;\n\t\t}\n\n\t\tpTemp->bDeleted = FALSE;\n\n\t\tswitch (nType)\n\t\t{\n\t\tcase JS_GLOBALDATA_TYPE_NUMBER:\n\t\t\t{\n\t\t\t\tpTemp->dData = dData;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase JS_GLOBALDATA_TYPE_BOOLEAN:\n\t\t\t{\n\t\t\t\tpTemp->bData = bData;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase JS_GLOBALDATA_TYPE_STRING:\n\t\t\t{\n\t\t\t\tpTemp->sData = sData;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase JS_GLOBALDATA_TYPE_OBJECT:\n\t\t\t{\n\t\t\t\tpTemp->pData.Reset(JS_GetRuntime(pData), pData);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase JS_GLOBALDATA_TYPE_NULL:\n\t\t\tbreak;\n\t\tdefault:\n\t\t\treturn FALSE;\n\t\t}\t\n\n\t\treturn TRUE;\n\t}\n\n\tjs_global_data* pNewData = NULL;\n\n\tswitch (nType)\n\t{\n\tcase JS_GLOBALDATA_TYPE_NUMBER:\n\t\t{\n\t\t\tpNewData = new js_global_data;\n\t\t\tpNewData->nType = JS_GLOBALDATA_TYPE_NUMBER;\n\t\t\tpNewData->dData = dData;\n\t\t\tpNewData->bPersistent = bDefaultPersistent;\n\t\t}\n\t\tbreak;\n\tcase JS_GLOBALDATA_TYPE_BOOLEAN:\n\t\t{\n\t\t\tpNewData = new js_global_data;\n\t\t\tpNewData->nType = JS_GLOBALDATA_TYPE_BOOLEAN;\n\t\t\tpNewData->bData = bData;\n\t\t\tpNewData->bPersistent = bDefaultPersistent;\n\t\t}\n\t\tbreak;\n\tcase JS_GLOBALDATA_TYPE_STRING:\n\t\t{\n\t\t\tpNewData = new js_global_data;\n\t\t\tpNewData->nType = JS_GLOBALDATA_TYPE_STRING;\n\t\t\tpNewData->sData = sData;\n\t\t\tpNewData->bPersistent = bDefaultPersistent;\n\t\t}\n\t\tbreak;\n\tcase JS_GLOBALDATA_TYPE_OBJECT:\n\t\t{\n\t\t\tpNewData = new js_global_data;\n\t\t\tpNewData->nType = JS_GLOBALDATA_TYPE_OBJECT;\n\t\t\tpNewData->pData.Reset(JS_GetRuntime(pData), pData);\n\t\t\tpNewData->bPersistent = bDefaultPersistent;\n\t\t}\n\t\tbreak;\n\tcase JS_GLOBALDATA_TYPE_NULL:\n\t\t{\n\t\t\tpNewData = new js_global_data;\n\t\t\tpNewData->nType = JS_GLOBALDATA_TYPE_NULL;\n\t\t\tpNewData->bPersistent = bDefaultPersistent;\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\treturn FALSE;\n\t}\t\n\n\tm_mapGlobal.SetAt(propname, (FX_LPVOID)pNewData);\n\n\treturn TRUE;\n}\n"
  },
  {
    "path": "fpdfsdk/src/javascript/report.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/javascript/JavaScript.h\"\n#include \"../../include/javascript/IJavaScript.h\"\n#include \"../../include/javascript/JS_Define.h\"\n#include \"../../include/javascript/JS_Object.h\"\n#include \"../../include/javascript/JS_Value.h\"\n#include \"../../include/javascript/report.h\"\n\n/* ---------------------- report ---------------------- */\n\nBEGIN_JS_STATIC_CONST(CJS_Report)\nEND_JS_STATIC_CONST()\n\nBEGIN_JS_STATIC_PROP(CJS_Report)\nEND_JS_STATIC_PROP()\n\nBEGIN_JS_STATIC_METHOD(CJS_Report) \n\tJS_STATIC_METHOD_ENTRY(save, 1)\n\tJS_STATIC_METHOD_ENTRY(writeText,1)\nEND_JS_STATIC_METHOD()\n\nIMPLEMENT_JS_CLASS(CJS_Report, Report)\n\t\nReport::Report(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject)\n{\n\n}\n\nReport::~Report()\n{\n\t\n}\n\nFX_BOOL Report::writeText(OBJ_METHOD_PARAMS)\n{\n\tif (IsSafeMode(cc)) return TRUE;\n\treturn TRUE;\n}\n\nFX_BOOL Report::save(OBJ_METHOD_PARAMS)\n{\n\tif (IsSafeMode(cc)) return TRUE;\n\treturn TRUE;\t\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/javascript/util.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/javascript/JavaScript.h\"\n#include \"../../include/javascript/IJavaScript.h\"\n#include \"../../include/javascript/JS_Define.h\"\n#include \"../../include/javascript/JS_Object.h\"\n#include \"../../include/javascript/JS_Value.h\"\n#include \"../../include/javascript/util.h\"\n#include \"../../include/javascript/PublicMethods.h\"\n#include \"../../include/javascript/resource.h\"\n#include \"../../include/javascript/JS_Context.h\"\n#include \"../../include/javascript/JS_EventHandler.h\"\n#include \"../../include/javascript/JS_Runtime.h\"\n\n#if _FX_OS_  == _FX_ANDROID_\n#include <ctype.h>\n#endif\n\nstatic v8::Isolate* GetIsolate(IFXJS_Context* cc)\n{\n\tCJS_Context* pContext = (CJS_Context *)cc;\n\tASSERT(pContext != NULL);\n\n\tCJS_Runtime* pRuntime = pContext->GetJSRuntime();\n\tASSERT(pRuntime != NULL);\n\n\treturn pRuntime->GetIsolate();\n}\n\nBEGIN_JS_STATIC_CONST(CJS_Util)\nEND_JS_STATIC_CONST()\n\nBEGIN_JS_STATIC_PROP(CJS_Util)\nEND_JS_STATIC_PROP()\n\nBEGIN_JS_STATIC_METHOD(CJS_Util)\n\tJS_STATIC_METHOD_ENTRY(printd, 3)\n\tJS_STATIC_METHOD_ENTRY(printf, 20)\n\tJS_STATIC_METHOD_ENTRY(printx, 2)\n\tJS_STATIC_METHOD_ENTRY(scand, 2)\n\tJS_STATIC_METHOD_ENTRY(byteToChar, 1)\nEND_JS_STATIC_METHOD()\n\nIMPLEMENT_JS_CLASS(CJS_Util,util)\n\nutil::util(CJS_Object *pJSObject) : CJS_EmbedObj(pJSObject)\n{\n}\n\nutil::~util(void)\n{\n}\n\n\nstruct stru_TbConvert\n{\n\tFX_LPCWSTR lpszJSMark;\n\tFX_LPCWSTR lpszCppMark;\n};\n\nconst stru_TbConvert fcTable[] = {\n\t(FX_LPCWSTR)L\"mmmm\", (FX_LPCWSTR)L\"%B\",\n\t(FX_LPCWSTR)L\"mmm\", (FX_LPCWSTR)L\"%b\",\n\t(FX_LPCWSTR)L\"mm\",  (FX_LPCWSTR)L\"%m\",\n\t//\"m\"\n\t(FX_LPCWSTR)L\"dddd\", (FX_LPCWSTR)L\"%A\",\n\t(FX_LPCWSTR)L\"ddd\", (FX_LPCWSTR)L\"%a\",\n\t(FX_LPCWSTR)L\"dd\",  (FX_LPCWSTR)L\"%d\",\n\t//\"d\",   \"%w\",\n\t(FX_LPCWSTR)L\"yyyy\", (FX_LPCWSTR)L\"%Y\",\n\t(FX_LPCWSTR)L\"yy\",  (FX_LPCWSTR)L\"%y\",\n\t(FX_LPCWSTR)L\"HH\",  (FX_LPCWSTR)L\"%H\",\n\t//\"H\"\n\t(FX_LPCWSTR)L\"hh\",  (FX_LPCWSTR)L\"%I\",\n\t//\"h\"\n\t(FX_LPCWSTR)L\"MM\",  (FX_LPCWSTR)L\"%M\",\n\t//\"M\"\n\t(FX_LPCWSTR)L\"ss\",  (FX_LPCWSTR)L\"%S\",\n\t//\"s\n\t(FX_LPCWSTR)L\"TT\",  (FX_LPCWSTR)L\"%p\",\n\t//\"t\"\n#if defined(_WIN32)\n\t(FX_LPCWSTR)L\"tt\",  (FX_LPCWSTR)L\"%p\",\n\t(FX_LPCWSTR)L\"h\",  (FX_LPCWSTR)L\"%#I\",\n#else\n\t(FX_LPCWSTR)L\"tt\",  (FX_LPCWSTR)L\"%P\",\n\t(FX_LPCWSTR)L\"h\",  (FX_LPCWSTR)L\"%l\",\n#endif\n};\n\n#define UTIL_INT\t\t\t0\n#define UTIL_DOUBLE\t\t\t1\n#define UTIL_STRING\t\t\t2\n\nint util::ParstDataType(std::wstring* sFormat)\n{\n        size_t i = 0;\n\tbool bPercent = FALSE;\n\tfor (i=0; i<sFormat->length(); ++i)\n\t{\n\t\twchar_t c = (*sFormat)[i];\n\t\tif (c == L'%')\n\t\t{\n\t\t\tbPercent = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (bPercent)\n\t\t{\n\t\t\tif (c == L'c' || c == L'C' || c == L'd' || c == L'i' || c == L'o' || c == L'u' || c == L'x' || c == L'X')\n\t\t\t{\n\t\t\t\treturn UTIL_INT;\n\t\t\t}\n\t\t\telse if (c == L'e' || c == L'E' || c == L'f' || c == L'g' || c == L'G')\n\t\t\t{\n\t\t\t\treturn UTIL_DOUBLE;\n\t\t\t}\n\t\t\telse if (c == L's' || c == L'S')\n\t\t\t{\n\t\t\t\t// Map s to S since we always deal internally\n\t\t\t\t// with wchar_t strings.\n\t\t\t\t(*sFormat)[i] = L'S';\n\t\t\t\treturn UTIL_STRING;\n\t\t\t}\n\t\t\telse if (c == L'.' || c == L'+' || c == L'-' || c == L'#' || c == L' ' || CJS_PublicMethods::IsDigit(c))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\telse break;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\nFX_BOOL util::printf(OBJ_METHOD_PARAMS)\n{\n\tint iSize = params.size();\n\tif (iSize < 1)\n\t\treturn FALSE;\n\tstd::wstring  c_ConvChar((const wchar_t*)(FX_LPCWSTR)params[0].operator CFX_WideString());\n\tstd::vector<std::wstring> c_strConvers;\n\tint iOffset = 0;\n\tint iOffend = 0;\n\tc_ConvChar.insert(c_ConvChar.begin(),L'S');\n\twhile(iOffset != -1)\n\t{\n\t\tiOffend = c_ConvChar.find(L\"%\",iOffset+1);\n\t\tstd::wstring strSub;\n\t\tif (iOffend == -1)\n\t\t\tstrSub = c_ConvChar.substr(iOffset);\t\t\t\n\t\telse\n\t\t\tstrSub = c_ConvChar.substr(iOffset ,iOffend - iOffset);\n\t\tc_strConvers.push_back(strSub);\n\t\tiOffset = iOffend ;\n\t}\n\n\tstd::wstring c_strResult;\n\n\t//for(int iIndex = 1;iIndex < params.size();iIndex++)\n\tstd::wstring c_strFormat;\n\tfor(int iIndex = 0;iIndex < (int)c_strConvers.size();iIndex++)\n\t{\n\t\tc_strFormat = c_strConvers[iIndex];\n\t\tif (iIndex == 0)\n\t\t{\n\t\t\tc_strResult = c_strFormat;\n\t\t\tcontinue;\n\t\t}\n\n\n\t\tCFX_WideString strSegment;\n\t\tif (iIndex >= iSize) {\n\t\t\tc_strResult += c_strFormat;\n\t\t\tcontinue;\n\t\t}\n\n\t\tswitch (ParstDataType(&c_strFormat))\n\t\t{\n\t\t\tcase UTIL_INT:\n\t\t\t\tstrSegment.Format((FX_LPCWSTR)c_strFormat.c_str(),(int)params[iIndex]);\n\t\t\t\tbreak;\n\t\t\tcase UTIL_DOUBLE:\n\t\t\t\tstrSegment.Format((FX_LPCWSTR)c_strFormat.c_str(),(double)params[iIndex]);\n\t\t\t\tbreak;\n\t\t\tcase UTIL_STRING:\n\t\t\t\tstrSegment.Format((FX_LPCWSTR)c_strFormat.c_str(),(FX_LPCWSTR)params[iIndex].operator CFX_WideString());\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tstrSegment.Format((FX_LPCWSTR)L\"%S\", (FX_LPCWSTR)c_strFormat.c_str());\n\t\t\t\tbreak;\n\t\t}\n\t\tc_strResult += (wchar_t*)strSegment.GetBuffer(strSegment.GetLength()+1);\n\t}\n\n\tc_strResult.erase(c_strResult.begin());\n\tvRet = (FX_LPCWSTR)c_strResult.c_str();\n\treturn TRUE;\n}\n\nFX_BOOL util::printd(OBJ_METHOD_PARAMS)\n{\n\tv8::Isolate* isolate = GetIsolate(cc);\n\n\tint iSize = params.size();\n\tif (iSize < 2)\n\t\treturn FALSE;\n\n\tCJS_Value p1(isolate);\n\tp1 = params[0];\n\n\tCJS_Value p2 = params[1];\n\tCJS_Date jsDate(isolate);\n\tif (!p2.ConvertToDate(jsDate))\n\t{\n\t\tsError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPRINT1);\n\t\treturn FALSE;\n\t}\n\n\tif (!jsDate.IsValidDate())\n\t{\n\t\tsError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPRINT2);\n\t\treturn FALSE;\n\t}\n\n\tif (p1.GetType() == VT_number)\n\t{\n\t\tint nFormat = p1;\n\n\t\tCFX_WideString swResult;\n\n\t\tswitch (nFormat)\n\t\t{\n\t\tcase 0:\n\t\t\tswResult.Format((FX_LPCWSTR)L\"D:%04d%02d%02d%02d%02d%02d\", \n\t\t\t\tjsDate.GetYear(),\n\t\t\t\tjsDate.GetMonth() + 1,\n\t\t\t\tjsDate.GetDay(),\n\t\t\t\tjsDate.GetHours(),\n\t\t\t\tjsDate.GetMinutes(),\n\t\t\t\tjsDate.GetSeconds());\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tswResult.Format((FX_LPCWSTR)L\"%04d.%02d.%02d %02d:%02d:%02d\", \n\t\t\t\tjsDate.GetYear(),\n\t\t\t\tjsDate.GetMonth() + 1,\n\t\t\t\tjsDate.GetDay(),\n\t\t\t\tjsDate.GetHours(),\n\t\t\t\tjsDate.GetMinutes(),\n\t\t\t\tjsDate.GetSeconds());\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tswResult.Format((FX_LPCWSTR)L\"%04d/%02d/%02d %02d:%02d:%02d\", \n\t\t\t\tjsDate.GetYear(),\n\t\t\t\tjsDate.GetMonth() + 1,\n\t\t\t\tjsDate.GetDay(),\n\t\t\t\tjsDate.GetHours(),\n\t\t\t\tjsDate.GetMinutes(),\n\t\t\t\tjsDate.GetSeconds());\n\t\t\tbreak;\n\t\tdefault:\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tvRet = swResult;\n\t\treturn TRUE;\n\t}\n\telse if (p1.GetType() == VT_string)\n\t{\n\t\tstd::basic_string<wchar_t> cFormat = (wchar_t*)(FX_LPCWSTR)p1.operator CFX_WideString();\t\t\n\n\t\tbool bXFAPicture = false;\n\t\tif (iSize > 2)\n\t\t{\n\t\t\t//CJS_Value value;\n\t\t\tbXFAPicture = params[2];\n\t\t}\n\n\t\tif (bXFAPicture)\n\t\t{\n\t\t\treturn FALSE; //currently, it doesn't support XFAPicture.\n\t\t}\n\n        int iIndex;\n\t\tfor(iIndex = 0;iIndex<sizeof(fcTable)/sizeof(stru_TbConvert);iIndex++)\n\t\t{\n\t\t\tint iStart = 0;\n\t\t\tint iEnd;\n\t\t\twhile((iEnd = cFormat.find((CFX_WideString)fcTable[iIndex].lpszJSMark, iStart)) != -1)\n\t\t\t{\n\t\t\t\tcFormat.replace(iEnd, FXSYS_wcslen(fcTable[iIndex].lpszJSMark), (CFX_WideString)fcTable[iIndex].lpszCppMark);\n\t\t\t\tiStart = iEnd;\n\t\t\t}\n\t\t}\n\n\t\tint iYear,iMonth,iDay,iHour,iMin,iSec;\n\t\tiYear = jsDate.GetYear();\n\t\tiMonth = jsDate.GetMonth();\n\t\tiDay = jsDate.GetDay();\n\t\tiHour = jsDate.GetHours();\n\t\tiMin = jsDate.GetMinutes();\n\t\tiSec = jsDate.GetSeconds();\n\n\t\tstruct tm time = {0};\n\t\ttime.tm_year = iYear-1900;\n\t\ttime.tm_mon = iMonth;\n\t\ttime.tm_mday = iDay;\n\t\ttime.tm_hour = iHour;\n\t\ttime.tm_min = iMin;\n\t\ttime.tm_sec = iSec;\n\t\t//COleDateTime cppTm(iYear,iMonth+1,iDay,iHour,iMin,iSec);\n\t\t//CString strFormat = cppTm.Format(cFormat.c_str());\n\n\t\tstruct stru_TbConvertAd\n\t\t{\n\t\t\tFX_LPCWSTR lpszJSMark;\n\t\t\tint     iValue;\n\t\t};\n\n\t\tstru_TbConvertAd cTableAd[] ={\n\t\t\t(FX_LPCWSTR)L\"m\", iMonth+1,\n\t\t\t\t(FX_LPCWSTR)L\"d\", iDay,\n\t\t\t\t(FX_LPCWSTR)L\"H\", iHour,\n\t\t\t\t(FX_LPCWSTR)L\"h\", iHour>12?iHour-12:iHour,\n\t\t\t\t(FX_LPCWSTR)L\"M\", iMin,\n\t\t\t\t(FX_LPCWSTR)L\"s\", iSec\n\t\t};\n\n\t\t//cFormat = strFormat.GetBuffer(strFormat.GetLength()+1);\n\t\tfor(iIndex = 0;iIndex<sizeof(cTableAd)/sizeof(stru_TbConvertAd);iIndex++)\n\t\t{\n\t\t\twchar_t tszValue[10];\n\t\t\t//_itot(cTableAd[iIndex].iValue,tszValue,10);\n\t\t\tCFX_WideString sValue;\n\t\t\tsValue.Format((FX_LPCWSTR)L\"%d\",cTableAd[iIndex].iValue);\n\t\t\tmemcpy(tszValue, (wchar_t *)sValue.GetBuffer(sValue.GetLength()+1),\n                               (sValue.GetLength()+1)*sizeof(wchar_t));\n\n\t\t\t//strFormat.Replace(cTableAd[iIndex].lpszJSMark,\"%d\");\n\t\t\t//strFormat.Format(strFormat,cTableAd[iIndex].iValue);\n\t\t\tint iStart = 0;\n\t\t\tint iEnd;\n\t\t\twhile((iEnd = cFormat.find((CFX_WideString)cTableAd[iIndex].lpszJSMark,iStart)) != -1)\n\t\t\t{\n\t\t\t\tif (iEnd > 0)\n\t\t\t\t{\n\t\t\t\t\tif (cFormat[iEnd-1] == L'%')\n\t\t\t\t\t{\n\t\t\t\t\t\tiStart = iEnd+1;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcFormat.replace(iEnd, FXSYS_wcslen(cTableAd[iIndex].lpszJSMark), tszValue);\n\t\t\t\tiStart = iEnd;\n\t\t\t}\n\t\t}\n\n\t\tCFX_WideString strFormat;\n//\t\tstrFormat.Format((FX_LPCWSTR)L\"%d,%d,%d,%d,%d,%d\",iYear, iMonth, iDay, iHour, iMin, iSec);\n//\t\tCString strFormat = cppTm.Format(cFormat.c_str());\n\t\twchar_t buf[64] = {0};\n\t\tstrFormat = wcsftime(buf, 64, cFormat.c_str(), &time);\n\t\tcFormat = buf;\n\t\tvRet = (FX_LPCWSTR)cFormat.c_str();\n\t\t//rtRet = strFormat.GetBuffer(strFormat.GetLength()+1);\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}\n\nvoid util::printd(const std::wstring &cFormat2, CJS_Date jsDate, bool bXFAPicture, std::wstring &cPurpose)\n{\n\tstd::wstring cFormat = cFormat2;\n\t    \n\tif (bXFAPicture)\n\t{\n\t\treturn ; //currently, it doesn't support XFAPicture.\n\t}\n\n    int iIndex;\n\tfor(iIndex = 0;iIndex<sizeof(fcTable)/sizeof(stru_TbConvert);iIndex++)\n\t{\n\t\tint iStart = 0;\n\t\tint iEnd;\n\t\twhile((iEnd = cFormat.find((CFX_WideString)fcTable[iIndex].lpszJSMark,iStart)) != -1)\n\t\t{\n\t\t\tcFormat.replace(iEnd,FXSYS_wcslen(fcTable[iIndex].lpszJSMark), (CFX_WideString)fcTable[iIndex].lpszCppMark);\n\t\t\tiStart = iEnd;\n\t\t}\n\t}\n\n\tint iYear,iMonth,iDay,iHour,iMin,iSec;\n\tiYear = jsDate.GetYear();\n\tiMonth = jsDate.GetMonth();\n\tiDay = jsDate.GetDay();\n\tiHour = jsDate.GetHours();\n\tiMin = jsDate.GetMinutes();\n\tiSec = jsDate.GetSeconds();\n\n\tstruct tm time = {0};\n\ttime.tm_year = iYear-1900;\n\ttime.tm_mon = iMonth;\n\ttime.tm_mday = iDay;\n\ttime.tm_hour = iHour;\n\ttime.tm_min = iMin;\n\ttime.tm_sec = iSec;\n//\tCOleDateTime cppTm(iYear,iMonth+1,iDay,iHour,iMin,iSec);\n\t//CString strFormat = cppTm.Format(cFormat.c_str());\n\n\tstruct stru_TbConvertAd\n\t{\n\t\tFX_LPCWSTR lpszJSMark;\n\t\tint     iValue;\n\t};\n\n\tstru_TbConvertAd cTableAd[] ={\n\t\t(FX_LPCWSTR)L\"m\", iMonth+1,\n\t\t\t(FX_LPCWSTR)L\"d\", iDay,\n\t\t\t(FX_LPCWSTR)L\"H\", iHour,\n\t\t\t(FX_LPCWSTR)L\"h\", iHour>12?iHour-12:iHour,\n\t\t\t(FX_LPCWSTR)L\"M\", iMin,\n\t\t\t(FX_LPCWSTR)L\"s\", iSec\n\t};\n\n\t//cFormat = strFormat.GetBuffer(strFormat.GetLength()+1);\n\tfor(iIndex = 0;iIndex<sizeof(cTableAd)/sizeof(stru_TbConvertAd);iIndex++)\n\t{\n\t\twchar_t tszValue[10];\n\t\t//_itot(cTableAd[iIndex].iValue,tszValue,10);\n\t\tCFX_WideString sValue;\n\t\tsValue.Format((FX_LPCWSTR)L\"%d\",cTableAd[iIndex].iValue);\n\t\tmemcpy(tszValue, (wchar_t *)sValue.GetBuffer(sValue.GetLength()+1),sValue.GetLength()*sizeof(wchar_t));\n\n\n\t\t//strFormat.Replace(cTableAd[iIndex].lpszJSMark,\"%d\");\n\t\t//strFormat.Format(strFormat,cTableAd[iIndex].iValue);\n\t\tint iStart = 0;\n\t\tint iEnd;\n\t\twhile((iEnd = cFormat.find((CFX_WideString)cTableAd[iIndex].lpszJSMark,iStart)) != -1)\n\t\t{\n\t\t\tif (iEnd > 0)\n\t\t\t{\n\t\t\t\tif (cFormat[iEnd-1] == L'%')\n\t\t\t\t{\n\t\t\t\t\tiStart = iEnd+1;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcFormat.replace(iEnd,FXSYS_wcslen(cTableAd[iIndex].lpszJSMark),tszValue);\n\t\t\tiStart = iEnd;\n\t\t}\n\t}\n\n\t\tCFX_WideString strFormat;\n//\t\tstrFormat.Format((FX_LPCWSTR)L\"%d,%d,%d,%d,%d,%d\",iYear, iMonth, iDay, iHour, iMin, iSec);\n//\t\tCString strFormat = cppTm.Format(cFormat.c_str());\n\t\twchar_t buf[64] = {0};\n\t\tstrFormat = wcsftime(buf, 64, cFormat.c_str(), &time);\n\t\tcFormat = buf;\n\t\tcPurpose = cFormat;\n}\n\nFX_BOOL util::printx(OBJ_METHOD_PARAMS)\n{\n\tint iSize = params.size();\n\tif (iSize<2)\n\t\treturn FALSE;\n\tCFX_WideString sFormat = params[0].operator CFX_WideString();\n\tCFX_WideString sSource = params[1].operator CFX_WideString();\n\tstd::string cFormat = (FX_LPCSTR)CFX_ByteString::FromUnicode(sFormat);\n\tstd::string cSource = (FX_LPCSTR)CFX_ByteString::FromUnicode(sSource);\n\tstd::string cDest;\n\tprintx(cFormat,cSource,cDest);\n\tvRet = cDest.c_str();\n\treturn TRUE;\n}\n\nvoid util::printx(const std::string &cFormat,const std::string &cSource2,std::string &cPurpose)\n{\n\tstd::string cSource(cSource2);\n\tif (!cPurpose.empty())\n\t\t//cPurpose.clear();\n\t\tcPurpose.erase();\n\tint itSource = 0;\n\tint iSize = cSource.size();\n\tfor(int iIndex = 0; iIndex < (int)cFormat.size() && itSource<iSize; iIndex++)\n\t{\n\t\tchar letter = cFormat[iIndex];\n\t\tswitch(letter)\n\t\t{\n\t\tcase '?':\n\t\t\t//cPurpose.push_back(cSource[itSource]);\n\t\t\tcPurpose += cSource[itSource];\n\t\t\titSource++;\n\t\t\tbreak;\n\t\tcase 'X':\n\t\t\t{\n\t\t\t\twhile(itSource < iSize)\n\t\t\t\t{\n\t\t\t\t\tif ((cSource[itSource]>='0'&&cSource[itSource]<='9') || (cSource[itSource]>='a' && cSource[itSource]<='z') || (cSource[itSource]>='A' && cSource[itSource]<='Z'))\n\t\t\t\t\t{\n\t\t\t\t\t\t//cPurpose.push_back(cSource[itSource]);\n\t\t\t\t\t\tcPurpose += cSource[itSource];\n\t\t\t\t\t\titSource++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\titSource++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'A':\n\t\t\t{\n\t\t\t\twhile(itSource < iSize)\n\t\t\t\t{\n\t\t\t\t\tif ((cSource[itSource]>='a' && cSource[itSource]<='z') || (cSource[itSource]>='A' && cSource[itSource]<='Z'))\n\t\t\t\t\t{\n\t\t\t\t\t\t//cPurpose.push_back(cSource[itSource]);\n\t\t\t\t\t\tcPurpose += cSource[itSource];\n\t\t\t\t\t\titSource++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\titSource++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase '9':\n\t\t\t{\n\t\t\t\twhile(itSource < iSize)\n\t\t\t\t{\n\t\t\t\t\tif (cSource[itSource]>='0'&&cSource[itSource]<='9')\n\t\t\t\t\t{\n\t\t\t\t\t\t//cPurpose.push_back(cSource[itSource]);\n\t\t\t\t\t\tcPurpose += cSource[itSource];\n\t\t\t\t\t\titSource++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\titSource++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\tcase '*':\n\t\t\t{\n\t\t\t\tcPurpose.append(cSource,itSource,iSize-itSource);\n\t\t\t\titSource = iSize-1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\tcase '\\\\':\n\t\t\tbreak;\n\t\tcase '>':\n\t\t\t{\n\t\t\t\tfor(std::string::iterator it = cSource.begin();it != cSource.end(); it++)\n\t\t\t\t{\n\t\t\t\t\t*it = toupper(*it);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\tcase '<':\n\t\t\t{\n\t\t\t\tfor(std::string::iterator it = cSource.begin();it != cSource.end(); it++)\n\t\t\t\t{\n\t\t\t\t\t*it = tolower(*it);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\tcase '=':\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t//cPurpose.push_back(letter);\n\t\t\tcPurpose += letter;\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nFX_BOOL util::scand(OBJ_METHOD_PARAMS)\n{\n\tv8::Isolate* isolate = GetIsolate(cc);\n\tint iSize = params.size();\n\tif (iSize < 2)\n\t\treturn FALSE;\n\tCFX_WideString sFormat = params[0].operator CFX_WideString();\n\tCFX_WideString sDate = params[1].operator CFX_WideString();\n\n\tdouble dDate = JS_GetDateTime();\n\tif (sDate.GetLength() > 0)\n\t{\n\t\tFX_BOOL bWrongFormat = FALSE;\n\t\tdDate = CJS_PublicMethods::MakeRegularDate(sDate,sFormat,bWrongFormat);\n\t}\t\n\t\n\tif (!JS_PortIsNan(dDate))\n\t{\n\t\tCJS_Date date(isolate,dDate);\n\t\tvRet = date;\n\t}\n\telse\n\t{\n\t\tvRet.SetNull();\n\t}\n\n\treturn TRUE;\n}\n\nFX_INT64 FX_atoi64(const char *nptr)\n{\n        int c;              /* current char */\n        FX_INT64 total;      /* current total */\n        int sign;           /* if '-', then negative, otherwise positive */\n\n        /* skip whitespace */\n        while ( isspace((int)(unsigned char)*nptr) )\n            ++nptr;\n\n        c = (int)(unsigned char)*nptr++;\n        sign = c;           /* save sign indication */\n        if (c == '-' || c == '+')\n            c = (int)(unsigned char)*nptr++;    /* skip sign */\n\n        total = 0;\n\n        while (isdigit(c)) {\n            total = 10 * total + (c - '0');     /* accumulate digit */\n            c = (int)(unsigned char)*nptr++;    /* get next char */\n        }\n\n        if (sign == '-')\n            return -total;\n        else\n            return total;   /* return result, negated if necessary */\n}\n\nFX_BOOL util::byteToChar(OBJ_METHOD_PARAMS)\n{\n\tint iSize = params.size();\n\tif (iSize == 0)\n\t\treturn FALSE;\n\tint nByte = (int)params[0];\n\tunsigned char cByte = (unsigned char)nByte;\n\tCFX_WideString csValue;\n\tcsValue.Format((FX_LPCWSTR)L\"%c\", cByte);\n\tvRet = csValue; \n\treturn TRUE;\n}\n"
  },
  {
    "path": "fpdfsdk/src/jsapi/fxjs_v8.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../../core/include/fxcrt/fx_basic.h\"\n#include \"../../../core/include/fxcrt/fx_ext.h\" \n#include \"../../include/jsapi/fxjs_v8.h\"\n#include \"../../include/fsdk_define.h\"\n#include \"time.h\"\n#include <cmath>\n#include <limits>\n\n#define VALUE_NAME_STRING\t\tL\"string\"\n#define VALUE_NAME_NUMBER\t\tL\"number\"\n#define VALUE_NAME_BOOLEAN\t\tL\"boolean\"\n#define VALUE_NAME_DATE\t\t\tL\"date\"\n#define VALUE_NAME_OBJECT\t\tL\"object\"\n#define VALUE_NAME_FXOBJ\t\tL\"fxobj\"\n#define VALUE_NAME_NULL\t\t\tL\"null\"\n#define VALUE_NAME_UNDEFINED\tL\"undefined\"\n\nstatic FX_DWORD g_nan[2] = {0,0x7FF80000 };\ndouble g_NaN = (*(double *)g_nan);\n\n\nclass CJS_PrivateData: public CFX_Object\n{\npublic:\n\tCJS_PrivateData():ObjDefID(-1), pPrivate(NULL) {}\n\tint ObjDefID;\n\tFX_LPVOID\tpPrivate;\n};\n\n\nclass CJS_ObjDefintion: public CFX_Object\n{\npublic:\n\tCJS_ObjDefintion(v8::Isolate* isolate, const wchar_t* sObjName, FXJSOBJTYPE eObjType, LP_CONSTRUCTOR pConstructor, LP_DESTRUCTOR pDestructor, unsigned bApplyNew):\n\t  objName(sObjName), objType(eObjType), m_pConstructor(pConstructor), m_pDestructor(pDestructor),m_bApplyNew(bApplyNew),m_bSetAsGlobalObject(FALSE)\n\t  {\n\t\t  v8::Isolate::Scope isolate_scope(isolate);\n\t\t  v8::HandleScope handle_scope(isolate);\n\n\t\t  v8::Handle<v8::ObjectTemplate> objTemplate = v8::ObjectTemplate::New(isolate);\n\t\t  objTemplate->SetInternalFieldCount(1);\n\t\t  m_objTemplate.Reset(isolate, objTemplate);\n\n\t\t //Document as the global object.\n\t\t  if(FXSYS_wcscmp(sObjName, L\"Document\") == 0)\n\t\t  {\n\t\t\t m_bSetAsGlobalObject = TRUE;\n\t\t  }\n\n\t  }\n\t  ~CJS_ObjDefintion()\n\t  {\n\t\t  m_objTemplate.Reset();\n\t\t  m_StaticObj.Reset();\n\t  }\npublic:\n\tconst wchar_t* objName;\n\tFXJSOBJTYPE objType;\n\tLP_CONSTRUCTOR m_pConstructor;\n\tLP_DESTRUCTOR m_pDestructor;\n\tunsigned m_bApplyNew;\n\tFX_BOOL\tm_bSetAsGlobalObject;\n\n\tv8::Persistent<v8::ObjectTemplate> m_objTemplate;\n\tv8::Persistent<v8::Object> m_StaticObj;\n};\n\nint JS_DefineObj(IJS_Runtime* pJSRuntime, const wchar_t* sObjName, FXJSOBJTYPE eObjType, LP_CONSTRUCTOR pConstructor, LP_DESTRUCTOR pDestructor, unsigned bApplyNew)\n{\n\tv8::Isolate* isolate = (v8::Isolate*)pJSRuntime;\n\tv8::Isolate::Scope isolate_scope(isolate);\n\tv8::HandleScope handle_scope(isolate);\n\tCFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);\n\tif(!pArray) \n\t{\n\t\tpArray = FX_NEW CFX_PtrArray();\n\t\tisolate->SetData(0, pArray);\n\t}\n\tCJS_ObjDefintion* pObjDef = FX_NEW CJS_ObjDefintion(isolate, sObjName, eObjType, pConstructor, pDestructor, bApplyNew);\n\tpArray->Add(pObjDef);\n\treturn pArray->GetSize()-1;\n}\n\nint JS_DefineObjMethod(IJS_Runtime* pJSRuntime, int nObjDefnID, const wchar_t* sMethodName, v8::FunctionCallback pMethodCall, unsigned nParamNum)\n{\n\tv8::Isolate* isolate = (v8::Isolate*)pJSRuntime;\n\tv8::Isolate::Scope isolate_scope(isolate);\n\tv8::HandleScope handle_scope(isolate);\n\n\tCFX_WideString ws = CFX_WideString((FX_LPCWSTR)sMethodName);\n\tCFX_ByteString bsMethodName = ws.UTF8Encode();\n\n\tCFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);\n\tif(!pArray) return 0;\n\n\tif(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0;\n\tCJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID);\n\tv8::Local<v8::ObjectTemplate> objTemp = v8::Local<v8::ObjectTemplate>::New(isolate, pObjDef->m_objTemplate);\n\tobjTemp->Set(v8::String::NewFromUtf8(isolate, FX_LPCSTR(bsMethodName)), v8::FunctionTemplate::New(isolate, pMethodCall), v8::ReadOnly);\n\tpObjDef->m_objTemplate.Reset(isolate,objTemp);\n\treturn 0;\n}\n\nint JS_DefineObjProperty(IJS_Runtime* pJSRuntime, int nObjDefnID, const wchar_t* sPropName, v8::AccessorGetterCallback pPropGet, v8::AccessorSetterCallback pPropPut)\n{\n\tv8::Isolate* isolate = (v8::Isolate*)pJSRuntime;\n\tv8::Isolate::Scope isolate_scope(isolate);\n\tv8::HandleScope handle_scope(isolate);\n\n\tCFX_WideString ws = CFX_WideString((FX_LPCWSTR)sPropName);\n\tCFX_ByteString bsPropertyName = ws.UTF8Encode();\n\n\tCFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);\n\tif(!pArray) return 0;\n\n\tif(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0;\n\tCJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID);\n\tv8::Local<v8::ObjectTemplate> objTemp = v8::Local<v8::ObjectTemplate>::New(isolate, pObjDef->m_objTemplate);\n\tobjTemp->SetAccessor(v8::String::NewFromUtf8(isolate, FX_LPCSTR(bsPropertyName)), pPropGet, pPropPut);\n\tpObjDef->m_objTemplate.Reset(isolate,objTemp);\n\treturn 0;\n}\n\nint\tJS_DefineObjAllProperties(IJS_Runtime* pJSRuntime, int nObjDefnID, v8::NamedPropertyQueryCallback pPropQurey, v8::NamedPropertyGetterCallback pPropGet, v8::NamedPropertySetterCallback pPropPut, v8::NamedPropertyDeleterCallback pPropDel)\n{\n\tv8::Isolate* isolate = (v8::Isolate*)pJSRuntime;\n\tv8::Isolate::Scope isolate_scope(isolate);\n\tv8::HandleScope handle_scope(isolate);\n\n\tCFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);\n\tif(!pArray) return 0;\n\n\tif(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0;\n\tCJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID);\n\tv8::Local<v8::ObjectTemplate> objTemp = v8::Local<v8::ObjectTemplate>::New(isolate, pObjDef->m_objTemplate);\n\tobjTemp->SetNamedPropertyHandler(pPropGet, pPropPut, pPropQurey, pPropDel);\n\tpObjDef->m_objTemplate.Reset(isolate,objTemp);\n\treturn 0;\n}\n\nint JS_DefineObjConst(IJS_Runtime* pJSRuntime, int nObjDefnID, const wchar_t* sConstName, v8::Handle<v8::Value> pDefault)\n{\n\tv8::Isolate* isolate = (v8::Isolate*)pJSRuntime;\n\tv8::Isolate::Scope isolate_scope(isolate);\n\tv8::HandleScope handle_scope(isolate);\n\n\tCFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);\n\tif(!pArray) return 0;\n\n\tCFX_WideString ws = CFX_WideString((FX_LPCWSTR)sConstName);\n\tCFX_ByteString bsConstName = ws.UTF8Encode();\n\n\tif(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0;\n\tCJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID);\n\tv8::Local<v8::ObjectTemplate> objTemp = v8::Local<v8::ObjectTemplate>::New(isolate, pObjDef->m_objTemplate);\n\tobjTemp->Set(isolate, FX_LPCSTR(bsConstName), pDefault);\n\tpObjDef->m_objTemplate.Reset(isolate,objTemp);\n\treturn 0;\n}\n\nstatic v8::Persistent<v8::ObjectTemplate>& _getGlobalObjectTemplate(IJS_Runtime* pJSRuntime)\n{\n\tv8::Isolate* isolate = (v8::Isolate*)pJSRuntime;\n\tv8::Isolate::Scope isolate_scope(isolate);\n\tv8::HandleScope handle_scope(isolate);\n\n\tCFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);\n\tASSERT(pArray != NULL);\n\tfor(int i=0; i<pArray->GetSize(); i++)\n\t{\n\t\tCJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i);\n\t\tif(pObjDef->m_bSetAsGlobalObject)\n\t\t\treturn pObjDef->m_objTemplate;\n\t}\n\tstatic v8::Persistent<v8::ObjectTemplate> gloabalObjectTemplate;\n\treturn gloabalObjectTemplate;\n}\n\nint JS_DefineGlobalMethod(IJS_Runtime* pJSRuntime, const wchar_t* sMethodName, v8::FunctionCallback pMethodCall, unsigned nParamNum)\n{\n\tv8::Isolate* isolate = (v8::Isolate*)pJSRuntime;\n\tv8::Isolate::Scope isolate_scope(isolate);\n\tv8::HandleScope handle_scope(isolate);\n\n\tCFX_WideString ws = CFX_WideString((FX_LPCWSTR)sMethodName);\n\tCFX_ByteString bsMethodName = ws.UTF8Encode();\n\n\tv8::Local<v8::FunctionTemplate> funTempl = v8::FunctionTemplate::New(isolate, pMethodCall);\n\tv8::Local<v8::ObjectTemplate> objTemp;\n\n\tv8::Persistent<v8::ObjectTemplate>& globalObjTemp = _getGlobalObjectTemplate(pJSRuntime);\n\tif(globalObjTemp.IsEmpty())\n\t\tobjTemp = v8::ObjectTemplate::New(isolate);\n\telse\n\t\tobjTemp = v8::Local<v8::ObjectTemplate>::New(isolate, globalObjTemp);\n\tobjTemp->Set(v8::String::NewFromUtf8(isolate, FX_LPCSTR(bsMethodName)), funTempl, v8::ReadOnly);\n\n\tglobalObjTemp.Reset(isolate,objTemp);\n\n\treturn 0;\n}\n\nint JS_DefineGlobalConst(IJS_Runtime* pJSRuntime, const wchar_t* sConstName, v8::Handle<v8::Value> pDefault)\n{\n\tv8::Isolate* isolate = (v8::Isolate*)pJSRuntime;\n\tv8::Isolate::Scope isolate_scope(isolate);\n\tv8::HandleScope handle_scope(isolate);\n\n\tCFX_WideString ws = CFX_WideString((FX_LPCWSTR)sConstName);\n\tCFX_ByteString bsConst= ws.UTF8Encode();\n\n\tv8::Local<v8::ObjectTemplate> objTemp;\n\n\tv8::Persistent<v8::ObjectTemplate>& globalObjTemp = _getGlobalObjectTemplate(pJSRuntime);\n\tif(globalObjTemp.IsEmpty())\n\t\tobjTemp = v8::ObjectTemplate::New(isolate);\n\telse\n\t\tobjTemp = v8::Local<v8::ObjectTemplate>::New(isolate, globalObjTemp);\n\tobjTemp->Set(v8::String::NewFromUtf8(isolate, FX_LPCSTR(bsConst)), pDefault, v8::ReadOnly);\n\n\tglobalObjTemp.Reset(isolate,objTemp);\n\n\treturn 0;\n}\n\n\nvoid JS_InitialRuntime(IJS_Runtime* pJSRuntime,IFXJS_Runtime* pFXRuntime, IFXJS_Context* context, v8::Persistent<v8::Context>& v8PersistentContext)\n{\n\tv8::Isolate* isolate = (v8::Isolate*)pJSRuntime;\n\tv8::Isolate::Scope isolate_scope(isolate);\n\tv8::HandleScope handle_scope(isolate);\n\n\tv8::Persistent<v8::ObjectTemplate>& globalObjTemp = _getGlobalObjectTemplate(pJSRuntime);\n\tv8::Handle<v8::Context> v8Context = v8::Context::New(isolate, NULL, v8::Local<v8::ObjectTemplate>::New(isolate, globalObjTemp));\n\tv8::Context::Scope context_scope(v8Context);\n\n\tv8::Handle<v8::External> ptr = v8::External::New(isolate, pFXRuntime);\n\tv8Context->SetEmbedderData(1, ptr);\n\n\tCFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);\n\tif(!pArray) return;\n\n\tfor(int i=0; i<pArray->GetSize(); i++)\n\t{\n\t\tCJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i);\n\t\tCFX_WideString ws = CFX_WideString(pObjDef->objName);\n\t\tCFX_ByteString bs = ws.UTF8Encode();\n\t\tv8::Handle<v8::String> objName = v8::String::NewFromUtf8(isolate,(FX_LPCSTR)bs, v8::String::kNormalString, bs.GetLength());\n\n\n\t\tif(pObjDef->objType == JS_DYNAMIC)\n\t\t{\n\t\t\t//Document is set as global object, need to construct it first.\n\t\t\tif(ws.Equal(L\"Document\"))\n\t\t\t{\n\n\t\t\t\tCJS_PrivateData* pPrivateData = FX_NEW CJS_PrivateData;\n\t\t\t\tpPrivateData->ObjDefID = i;\n\t\t\t\tv8::Handle<v8::External> ptr = v8::External::New(isolate, pPrivateData);\n\n\t\t\t\tv8Context->Global()->GetPrototype()->ToObject()->SetInternalField(0, ptr); \n\n\t\t\t\tif(pObjDef->m_pConstructor)\n\t\t\t\t\tpObjDef->m_pConstructor(context, v8Context->Global()->GetPrototype()->ToObject(), v8Context->Global()->GetPrototype()->ToObject());\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tv8::Handle<v8::Object> obj = JS_NewFxDynamicObj(pJSRuntime, context, i);\n\t\t\tv8Context->Global()->Set(objName, obj);\n\t\t\tpObjDef->m_StaticObj.Reset(isolate, obj);\n\t\t}\n\t}\n\tv8PersistentContext.Reset(isolate, v8Context);\n}\n\nvoid JS_ReleaseRuntime(IJS_Runtime* pJSRuntime, v8::Persistent<v8::Context>& v8PersistentContext)\n{\n\tv8::Isolate* isolate = (v8::Isolate*)pJSRuntime;\n\tv8::Isolate::Scope isolate_scope(isolate);\n\tv8::HandleScope handle_scope(isolate);\n\tv8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate, v8PersistentContext);\n\tv8::Context::Scope context_scope(context);\n\n\tCFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);\n\tif(!pArray) return ;\n\n\tfor(int i=0; i<pArray->GetSize(); i++)\n\t{\n\t\tCJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i);\n\t\tif(!pObjDef->m_StaticObj.IsEmpty())\n\t\t{\n\t\t\tv8::Local<v8::Object> pObj = v8::Local<v8::Object>::New(isolate, pObjDef->m_StaticObj);\n\t\t\tif(pObjDef->m_pDestructor)\n\t\t\t\tpObjDef->m_pDestructor(pObj);\n\t\t\tJS_FreePrivate(pObj);\n\t\t}\n\t\tdelete pObjDef;\n\t}\n\tdelete pArray;\n\tisolate->SetData(0,NULL);\n}\n\nvoid JS_Initial() \n{\n#ifndef FOXIT_CHROME_BUILD\n\tv8::V8::InitializeICU();\n#endif\n}\nvoid JS_Release()\n{\n\n}\nint JS_Parse(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, const wchar_t* script, long length, FXJSErr* perror)\n{\n\tv8::Isolate* isolate = (v8::Isolate*)pJSRuntime;\n\tv8::Isolate::Scope isolate_scope(isolate);\n\tv8::TryCatch try_catch;\n\n\tCFX_WideString wsScript(script);\n\tCFX_ByteString bsScript = wsScript.UTF8Encode();\n\n\n\tv8::Handle<v8::Script> compiled_script = v8::Script::Compile(v8::String::NewFromUtf8(isolate,(FX_LPCSTR)bsScript,v8::String::kNormalString, bsScript.GetLength()));\n\tif (compiled_script.IsEmpty()) {\n\t\tv8::String::Utf8Value error(try_catch.Exception());\n\t\treturn -1;\n\t}\n\treturn 0;\n}\n\nint JS_Execute(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, const wchar_t* script, long length, FXJSErr* perror)\n{\n\tv8::Isolate* isolate = (v8::Isolate*)pJSRuntime;\n\tv8::Isolate::Scope isolate_scope(isolate);\n\tv8::TryCatch try_catch;\n\n\tCFX_WideString wsScript(script);\n\tCFX_ByteString bsScript = wsScript.UTF8Encode();\n\n\tv8::Handle<v8::Script> compiled_script = v8::Script::Compile(v8::String::NewFromUtf8(isolate,(FX_LPCSTR)bsScript,v8::String::kNormalString, bsScript.GetLength()));\n\tif (compiled_script.IsEmpty()) {\n\t\tv8::String::Utf8Value error(try_catch.Exception());\n\t\treturn -1;\n\t}\n\n\tv8::Handle<v8::Value> result = compiled_script->Run();\n\tif (result.IsEmpty()) {\n\t\tv8::String::Utf8Value error(try_catch.Exception());\n\t\treturn -1;\n\t}\n\treturn 0;\n}\n\nv8::Handle<v8::Object> JS_NewFxDynamicObj(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, int nObjDefnID)\n{\n\tv8::Isolate* isolate = (v8::Isolate*)pJSRuntime;\n\tv8::Isolate::Scope isolate_scope(isolate);\n\tif(-1 == nObjDefnID)\n\t{\n\t\tv8::Local<v8::ObjectTemplate> objTempl = v8::ObjectTemplate::New(isolate);\n\t\treturn objTempl->NewInstance();\n\t}\n\n\tCFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);\n\tif(!pArray) return v8::Handle<v8::Object>();\n\n\n\tif(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return v8::Handle<v8::Object>();\n\tCJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID);\n\n\tv8::Local<v8::Context> context = isolate->GetCurrentContext();\n\tv8::Local<v8::ObjectTemplate> objTemp = v8::Local<v8::ObjectTemplate>::New(isolate, pObjDef->m_objTemplate);\n\n\tv8::Local<v8::Object> obj = objTemp->NewInstance();\n\t\n\tCJS_PrivateData* pPrivateData = FX_NEW CJS_PrivateData;\n\tpPrivateData->ObjDefID = nObjDefnID;\n\tv8::Handle<v8::External> ptr = v8::External::New(isolate, pPrivateData);\n\tobj->SetInternalField(0, ptr); \n\n\tif(pObjDef->m_pConstructor)\n\t\tpObjDef->m_pConstructor(pJSContext, obj, context->Global()->GetPrototype()->ToObject());\n\n\treturn obj;\n}\n\nv8::Handle<v8::Object> JS_GetStaticObj(IJS_Runtime* pJSRuntime, int nObjDefnID)\n{\n\tv8::Isolate* isolate = (v8::Isolate*)pJSRuntime;\n\tv8::Isolate::Scope isolate_scope(isolate);\n\n\tCFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);\n\tif(!pArray) return v8::Handle<v8::Object>();\n\n\tif(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return v8::Handle<v8::Object>();\n\tCJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID);\n\tv8::Local<v8::Object> obj = v8::Local<v8::Object>::New(isolate,pObjDef->m_StaticObj);\n\treturn obj;\n}\n\nvoid JS_SetThisObj(IJS_Runtime* pJSRuntime, int nThisObjID)\n{\n\t//Do nothing.\n}\nv8::Handle<v8::Object>\tJS_GetThisObj(IJS_Runtime * pJSRuntime)\n{\n\t//Return the global object.\n\tv8::Isolate* isolate = (v8::Isolate*)pJSRuntime;\n\tv8::Isolate::Scope isolate_scope(isolate);\n\n\tCFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);\n\tif(!pArray) return v8::Handle<v8::Object>();\n\n\tv8::Local<v8::Context> context = isolate->GetCurrentContext();\n\treturn context->Global()->GetPrototype()->ToObject();\n}\n\nint\tJS_GetObjDefnID(v8::Handle<v8::Object> pObj)\n{\n\tif(pObj.IsEmpty() || !pObj->InternalFieldCount()) return -1;\n\tv8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(pObj->GetInternalField(0));\n\tCJS_PrivateData* pPrivateData = (CJS_PrivateData*)field->Value();\n\tif(pPrivateData)\n\t\treturn pPrivateData->ObjDefID;\n\treturn -1;\n}\n\nIJS_Runtime* JS_GetRuntime(v8::Handle<v8::Object> pObj)\n{\n\tif(pObj.IsEmpty()) return NULL;\n\tv8::Local<v8::Context> context = pObj->CreationContext();\n\tif(context.IsEmpty()) return NULL;\n\treturn context->GetIsolate();\n}\n\nint JS_GetObjDefnID(IJS_Runtime * pJSRuntime, const wchar_t* pObjName)\n{\n\tv8::Isolate* isolate = (v8::Isolate*)pJSRuntime;\n\tv8::Isolate::Scope isolate_scope(isolate);\n\n\tCFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);\n\tif(!pArray) return -1;\n\n\tfor(int i=0; i<pArray->GetSize(); i++)\n\t{\n\t\tCJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i);\n\t\tif(FXSYS_wcscmp(pObjDef->objName, pObjName) == 0)\n\t\t\treturn i;\n\t}\n\treturn -1;\n}\n\nvoid JS_Error(v8::Value * pError,const wchar_t * main,const wchar_t * sub)\n{\n\n}\n\nunsigned JS_CalcHash(const wchar_t* main, unsigned nLen)\n{\n\treturn (unsigned)FX_HashCode_String_GetW(main, nLen);\n}\n\nunsigned JS_CalcHash(const wchar_t* main)\n{\n\treturn (unsigned)FX_HashCode_String_GetW(main, FXSYS_wcslen(main));\n}\nconst wchar_t*\tJS_GetTypeof(v8::Handle<v8::Value> pObj)\n{\n\tif(pObj.IsEmpty()) return NULL;\n\tif(pObj->IsString())\n\t\treturn VALUE_NAME_STRING;\n\tif(pObj->IsNumber())\n\t\treturn VALUE_NAME_NUMBER;\n\tif(pObj->IsBoolean())\n\t\treturn VALUE_NAME_BOOLEAN;\n\tif(pObj->IsDate())\n\t\treturn VALUE_NAME_DATE;\n\tif(pObj->IsObject())\n\t\treturn VALUE_NAME_OBJECT;\n\tif(pObj->IsNull())\n\t\treturn VALUE_NAME_NULL;\n\tif(pObj->IsUndefined())\n\t\treturn VALUE_NAME_UNDEFINED;\n\treturn NULL;\n\n}\nconst wchar_t*\tJS_GetClassname(v8::Handle<v8::Object> pObj)\n{\n\treturn NULL;\n}\n\nvoid JS_SetPrivate(v8::Handle<v8::Object> pObj, void* p)\n{\n\tJS_SetPrivate(NULL, pObj, p);\n}\n\nvoid* JS_GetPrivate(v8::Handle<v8::Object> pObj)\n{\n\treturn JS_GetPrivate(NULL,pObj);\n}\n\nvoid JS_SetPrivate(IJS_Runtime* pJSRuntime, v8::Handle<v8::Object> pObj, void* p)\n{\n\tif(pObj.IsEmpty() || !pObj->InternalFieldCount()) return;\n\tv8::Handle<v8::External> ptr = v8::Handle<v8::External>::Cast(pObj->GetInternalField(0));\n\tCJS_PrivateData* pPrivateData  = (CJS_PrivateData*)ptr->Value();\n\tif(!pPrivateData) return;\n\tpPrivateData->pPrivate = p;\n}\n\nvoid* JS_GetPrivate(IJS_Runtime* pJSRuntime, v8::Handle<v8::Object> pObj)\n{\n\tif(pObj.IsEmpty()) return NULL;\n\tv8::Local<v8::Value> value;\n\tif(pObj->InternalFieldCount())\n\t\tvalue = pObj->GetInternalField(0); \n\telse\n\t{\n\t\t//It could be a global proxy object.\n\t\tv8::Local<v8::Value> v = pObj->GetPrototype();\n\t\tif(v->IsObject())\n\t\t\tvalue = v->ToObject()->GetInternalField(0);\n\t}\n\tif(value.IsEmpty() || value->IsUndefined()) return NULL;\n\tv8::Handle<v8::External> ptr = v8::Handle<v8::External>::Cast(value);\n\tCJS_PrivateData* pPrivateData  = (CJS_PrivateData*)ptr->Value();\n\tif(!pPrivateData) return NULL;\n\treturn pPrivateData->pPrivate;\n}\n\nvoid JS_FreePrivate(v8::Handle<v8::Object> pObj)\n{\n\tif(pObj.IsEmpty() || !pObj->InternalFieldCount()) return;\n\tv8::Handle<v8::External> ptr = v8::Handle<v8::External>::Cast(pObj->GetInternalField(0));\n\tdelete (CJS_PrivateData*)ptr->Value();\n\tv8::Local<v8::Context> context = pObj->CreationContext();\n\n\tpObj->SetInternalField(0, v8::External::New(context->GetIsolate(), NULL));\n}\n\n\nv8::Handle<v8::Value> JS_GetObjectValue(v8::Handle<v8::Object> pObj)\n{\n\treturn pObj;\n}\n\nv8::Handle<v8::String> WSToJSString(IJS_Runtime* pJSRuntime, const wchar_t* PropertyName, int Len = -1)\n{\n\tCFX_WideString ws = CFX_WideString(PropertyName,Len);\n\tCFX_ByteString bs = ws.UTF8Encode();\n\tif(!pJSRuntime) pJSRuntime = v8::Isolate::GetCurrent();\n\treturn v8::String::NewFromUtf8(pJSRuntime, (FX_LPCSTR)bs);\n}\n\nv8::Handle<v8::Value> JS_GetObjectElement(IJS_Runtime* pJSRuntime, v8::Handle<v8::Object> pObj,const wchar_t* PropertyName)\n{\n\tif(pObj.IsEmpty()) return v8::Handle<v8::Value>();\n\treturn pObj->Get(WSToJSString(pJSRuntime,PropertyName));\n}\n\nv8::Handle<v8::Array> JS_GetObjectElementNames(v8::Handle<v8::Object> pObj)\n{\n\tif(pObj.IsEmpty()) return v8::Handle<v8::Array>();\n\treturn pObj->GetPropertyNames();\n}\n\nvoid JS_PutObjectString(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, const wchar_t* sValue) //VT_string\n{\n\tif(pObj.IsEmpty()) return;\n\tpObj->Set(WSToJSString(pJSRuntime, PropertyName), WSToJSString(pJSRuntime, sValue));\n}\n\nvoid JS_PutObjectNumber(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, int nValue)\n{\n\tif(pObj.IsEmpty()) return;\n\tpObj->Set(WSToJSString(pJSRuntime,PropertyName),v8::Int32::New(pJSRuntime, nValue));\n}\n\nvoid JS_PutObjectNumber(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, float fValue)\n{\n\tif(pObj.IsEmpty()) return;\n\tpObj->Set(WSToJSString(pJSRuntime,PropertyName),v8::Number::New(pJSRuntime, (double)fValue));\n}\n\nvoid JS_PutObjectNumber(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, double dValue)\n{\n\tif(pObj.IsEmpty()) return;\n\tpObj->Set(WSToJSString(pJSRuntime,PropertyName),v8::Number::New(pJSRuntime, (double)dValue));\n}\n\nvoid JS_PutObjectBoolean(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, bool bValue)\n{\n\tif(pObj.IsEmpty()) return;\n\tpObj->Set(WSToJSString(pJSRuntime,PropertyName),v8::Boolean::New(pJSRuntime, bValue));\n}\n\nvoid JS_PutObjectObject(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, v8::Handle<v8::Object> pPut)\n{\n\tif(pObj.IsEmpty()) return;\n\tpObj->Set(WSToJSString(pJSRuntime,PropertyName),pPut);\n}\n\nvoid JS_PutObjectNull(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName)\n{\n\tif(pObj.IsEmpty()) return;\n\tpObj->Set(WSToJSString(pJSRuntime,PropertyName),v8::Handle<v8::Object>());\n}\n\nv8::Handle<v8::Array> JS_NewArray(IJS_Runtime* pJSRuntime)\n{\n\treturn v8::Array::New(pJSRuntime);\n}\n\nunsigned JS_PutArrayElement(v8::Handle<v8::Array> pArray,unsigned index,v8::Handle<v8::Value> pValue,FXJSVALUETYPE eType)\n{\t\n\tif(pArray.IsEmpty()) return 0;\n\tpArray->Set(index, pValue);\n\treturn 1;\n}\n\nv8::Handle<v8::Value> JS_GetArrayElemnet(v8::Handle<v8::Array> pArray,unsigned index)\n{\n\tif(pArray.IsEmpty()) return v8::Handle<v8::Value>();\n\treturn pArray->Get(index);\n}\n\nunsigned JS_GetArrayLength(v8::Handle<v8::Array> pArray)\n{\n\tif(pArray.IsEmpty()) return 0;\n\treturn pArray->Length();\n}\n\nv8::Handle<v8::Value> JS_NewNumber(IJS_Runtime* pJSRuntime,int number)\n{\n\treturn v8::Int32::New(pJSRuntime, number);\n}\n\nv8::Handle<v8::Value> JS_NewNumber(IJS_Runtime* pJSRuntime,double number)\n{\n\treturn v8::Number::New(pJSRuntime, number);\n}\n\nv8::Handle<v8::Value> JS_NewNumber(IJS_Runtime* pJSRuntime,float number)\n{\n\treturn v8::Number::New(pJSRuntime, (float)number);\n}\n\nv8::Handle<v8::Value> JS_NewBoolean(IJS_Runtime* pJSRuntime,bool b)\n{\n\treturn v8::Boolean::New(pJSRuntime, b);\n}\n\nv8::Handle<v8::Value> JS_NewObject(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj)\n{\n\tif(pObj.IsEmpty()) return v8::Handle<v8::Value>();\n\treturn pObj->Clone();\n}\n\nv8::Handle<v8::Value> JS_NewObject2(IJS_Runtime* pJSRuntime,v8::Handle<v8::Array> pObj)\n{\n\tif(pObj.IsEmpty()) return v8::Handle<v8::Value>();\n\treturn pObj->Clone();\n}\n\n\nv8::Handle<v8::Value> JS_NewString(IJS_Runtime* pJSRuntime,const wchar_t* string)\n{\n\treturn WSToJSString(pJSRuntime, string);\n}\n\nv8::Handle<v8::Value> JS_NewString(IJS_Runtime* pJSRuntime,const wchar_t* string, unsigned nLen)\n{\n\treturn WSToJSString(pJSRuntime, string, nLen);\n}\n\nv8::Handle<v8::Value> JS_NewNull()\n{\n\treturn v8::Handle<v8::Value>();\n}\n\nv8::Handle<v8::Value> JS_NewDate(IJS_Runtime* pJSRuntime,double d)\n{\n\treturn v8::Date::New(pJSRuntime, d);\n}\n\nv8::Handle<v8::Value> JS_NewValue(IJS_Runtime* pJSRuntime)\n{\n\treturn v8::Handle<v8::Value>();\n}\n\nv8::Handle<v8::Value> JS_GetListValue(v8::Handle<v8::Value> pList, int index)\n{\n\n\tif(!pList.IsEmpty() && pList->IsObject())\n\t{\n\t\tv8::Local<v8::Object> obj = pList->ToObject();\n\t\treturn obj->Get(index);\n\t}\n\treturn v8::Handle<v8::Value>();\n}\n\nint\tJS_ToInt32(v8::Handle<v8::Value> pValue)\n{\n\tif(pValue.IsEmpty()) return 0;\n\treturn pValue->ToInt32()->Value();\n}\n\nbool JS_ToBoolean(v8::Handle<v8::Value> pValue)\n{\n\tif(pValue.IsEmpty()) return false;\n\treturn pValue->ToBoolean()->Value();\n}\n\ndouble JS_ToNumber(v8::Handle<v8::Value> pValue)\n{\n\tif(pValue.IsEmpty()) return 0.0;\n\treturn pValue->ToNumber()->Value();\n}\n\nv8::Handle<v8::Object> JS_ToObject(v8::Handle<v8::Value> pValue)\n{\n\tif(pValue.IsEmpty()) return v8::Handle<v8::Object>();\n\treturn pValue->ToObject();\n}\n\nCFX_WideString\tJS_ToString(v8::Handle<v8::Value> pValue)\n{\n\tif(pValue.IsEmpty()) return L\"\";\n\tv8::String::Utf8Value s(pValue->ToString());\n\treturn CFX_WideString::FromUTF8(*s, s.length());\n}\n\nv8::Handle<v8::Array> JS_ToArray(v8::Handle<v8::Value> pValue)\n{\n\tif(pValue.IsEmpty()) return v8::Handle<v8::Array>();\n\treturn v8::Handle<v8::Array>::Cast(pValue->ToObject());\n}\n\nvoid JS_ValueCopy(v8::Handle<v8::Value>& pTo, v8::Handle<v8::Value> pFrom)\n{\n\tpTo = pFrom;\n}\n\n\n//JavaScript time implement begin.\n\ndouble _getLocalTZA()\n{\n\tif(!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))\n\t\treturn 0;\n\ttime_t t = 0;\n\ttime(&t);\n\tlocaltime(&t);\n\treturn (double)(-(timezone * 1000));\n}\n\nint _getDaylightSavingTA(double d)\n{\n\tif(!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))\n\t\treturn 0;\n\ttime_t t = (time_t)(d/1000);\n\tstruct tm * tmp = localtime(&t);\n\tif (tmp == NULL)\n\t\treturn 0;\n\tif (tmp->tm_isdst > 0)\n\t\t//One hour.\n\t\treturn (int)60*60*1000;\n\treturn 0;\n}\n\ndouble _Mod(double x, double y)\n{   \n\tdouble r = fmod(x, y);\n\tif (r < 0) r += y;\n\treturn r;\n}\n\nint _isfinite(double v)\n{\n#if _MSC_VER\n\treturn ::_finite(v);\n#else\n\treturn std::fabs(v) < std::numeric_limits<double>::max();\n#endif\n}\n\ndouble _toInteger(double n)\n{\n\treturn (n >= 0)? FXSYS_floor(n): -FXSYS_floor(-n);\n}\n\nbool _isLeapYear(int year)\n{\n\treturn (year%4==0)&&((year%100!=0)||(year%400!=0));\n}\n\nint _DayFromYear(int y)\n{\n\treturn (int)(365*(y - 1970.0) + FXSYS_floor((y - 1969.0)/4) - FXSYS_floor((y - 1901.0)/100)+FXSYS_floor((y - 1601.0)/400));\n}\n\ndouble _TimeFromYear(int y)\n{\n\treturn  ((double)86400000) * _DayFromYear(y);\n}\n\ndouble _TimeFromYearMonth(int y, int m)\n{\n\tstatic int daysMonth[12] ={ 0,31,59,90,120,151,181,212,243,273,304,334};\n\tstatic int leapDaysMonth[12] = { 0,31,60,91,121,152,182,213,244,274,305,335};\n\tint* pMonth = daysMonth;\n\tif(_isLeapYear(y))\n\t\tpMonth = leapDaysMonth;\n\treturn _TimeFromYear(y) + ((double)pMonth[m])*86400000;\n}\n\nint _Day(double t)\n{\n\treturn (int)FXSYS_floor(t / 86400000);\n}\n\nint _YearFromTime(double t)\n{\n\t//estimate the time.\n\tint y = 1970 +(int)(t/(365.0*86400000));\n\tif (_TimeFromYear(y) <= t)\n\t{\n\t\twhile(_TimeFromYear(y+1) <= t) y++;\n\t}\n\telse\n\t\twhile(_TimeFromYear(y-1) > t) y--;\n\treturn y;\n}\n\nint _DayWithinYear(double t)\n{\n\tint year = _YearFromTime(t);\n\tint day = _Day(t);\n\treturn day-_DayFromYear(year);\n}\n\nint _MonthFromTime(double t)\n{\n\tint day = _DayWithinYear(t);\n\tint year = _YearFromTime(t);\n\tif(0<=day && day <31)\n\t\treturn 0;\n\tif(31<=day && day< 59+_isLeapYear(year))\n\t\treturn 1;\n\tif((59+_isLeapYear(year))<=day && day<(90+_isLeapYear(year)))\n\t\treturn 2;\n\tif((90+_isLeapYear(year))<=day && day<(120+_isLeapYear(year)))\n\t\treturn 3;\n\tif((120+_isLeapYear(year))<=day && day<(151+_isLeapYear(year)))\n\t\treturn 4;\n\tif((151+_isLeapYear(year))<=day && day<(181+_isLeapYear(year)))\n\t\treturn 5;\n\tif((181+_isLeapYear(year))<=day && day<(212+_isLeapYear(year)))\n\t\treturn 6;\n\tif((212+_isLeapYear(year))<=day && day<(243+_isLeapYear(year)))\n\t\treturn 7;\n\tif((243+_isLeapYear(year))<=day && day<(273+_isLeapYear(year)))\n\t\treturn 8;\n\tif((273+_isLeapYear(year))<=day && day<(304+_isLeapYear(year)))\n\t\treturn 9;\n\tif((304+_isLeapYear(year))<=day && day<(334+_isLeapYear(year)))\n\t\treturn 10;\n\tif((334+_isLeapYear(year))<=day && day<(365+_isLeapYear(year)))\n\t\treturn 11;\n\n\treturn -1;\n}\n\nint _DateFromTime(double t)\n{\n\tint day = _DayWithinYear(t);\n\tint year = _YearFromTime(t);\n\tbool leap = _isLeapYear(year);\n\tint month = _MonthFromTime(t);\n\tswitch (month)\n\t{\n\tcase 0:\t \n\t\treturn day+1;\n\tcase 1:\t \n\t\treturn day-30;\n\tcase 2:\t \n\t\treturn day-58-leap;\n\tcase 3:\t \n\t\treturn day-89-leap;\n\tcase 4:\t \n\t\treturn day-119-leap;\n\tcase 5:\t \n\t\treturn day-150-leap;\n\tcase 6:\t \n\t\treturn day-180-leap;\n\tcase 7:\t \n\t\treturn day-211-leap;\n\tcase 8:\t \n\t\treturn day-242-leap;\n\tcase 9:\t \n\t\treturn day-272-leap;\n\tcase 10: \n\t\treturn day-303-leap;\n\tcase 11: \n\t\treturn day-333-leap;\n\tdefault:\n\t\treturn 0;\n\t}\n}\n\ndouble JS_GetDateTime()\n{\n\tif(!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))\n\t\treturn 0;\n\ttime_t t = time(NULL);\n\tstruct tm* pTm = localtime(&t);\n\n\tint year = pTm->tm_year+1900;\n\tdouble t1 = _TimeFromYear(year);\n\n\treturn t1 + pTm->tm_yday*86400000.0 + pTm->tm_hour*3600000.0+pTm->tm_min*60000.0+pTm->tm_sec*1000.0;\n}\n\nint JS_GetYearFromTime(double dt)\n{\n\treturn _YearFromTime(dt);\n}\n\nint JS_GetMonthFromTime(double dt)\n{\n\treturn _MonthFromTime(dt);\n}\n\nint JS_GetDayFromTime(double dt)\n{\n\treturn _DateFromTime(dt);\n}\n\nint JS_GetHourFromTime(double dt)\n{\n\treturn (int)_Mod(FXSYS_floor((double)(dt/(60*60*1000))), 24);\n}\n\nint JS_GetMinFromTime(double dt)\n{\n\treturn (int)_Mod(FXSYS_floor((double)(dt/(60*1000))), 60);\n}\n\nint JS_GetSecFromTime(double dt)\n{\n\treturn (int)_Mod(FXSYS_floor((double)(dt/1000)), 60);\n}\n\ndouble JS_DateParse(const wchar_t* string)\n{\n\tv8::Isolate* pIsolate = v8::Isolate::GetCurrent();\n\tv8::Isolate::Scope isolate_scope(pIsolate);\n\tv8::HandleScope scope(pIsolate);\n\n\tv8::Local<v8::Context> context = pIsolate->GetCurrentContext();\n\t\n\t//Use the built-in object method.\n\tv8::Local<v8::Value> v = context->Global()->Get(v8::String::NewFromUtf8(pIsolate, \"Date\"));\n\tif(v->IsObject())\n\t{\n\t\tv8::Local<v8::Object> o = v->ToObject();\n\t\tv = o->Get(v8::String::NewFromUtf8(pIsolate, \"parse\"));\n\t\tif(v->IsFunction())\n\t\t{\n\t\t\tv8::Local<v8::Function> funC = v8::Handle<v8::Function>::Cast(v);\n\n\t\t\tconst int argc = 1;\n\t\t\tv8::Local<v8::String> timeStr = WSToJSString(pIsolate, string);\n\t\t\tv8::Handle<v8::Value> argv[argc] = {timeStr};\n\t\t\tv = funC->Call(context->Global(), argc, argv);\n\t\t\tif(v->IsNumber())\n\t\t\t{\n\t\t\t\tdouble date =  v->ToNumber()->Value();\n\t\t\t\tif(!_isfinite(date)) return date;\n\t\t\t\treturn date + _getLocalTZA() + _getDaylightSavingTA(date);\n\t\t\t}\n\n\t\t}\n\t}\n\treturn 0;\n}\n\ndouble JS_MakeDay(int nYear, int nMonth, int nDate)\n{\n\tif (!_isfinite(nYear) || !_isfinite(nMonth) ||!_isfinite(nDate))\n\t\treturn g_NaN;\n\tdouble y = _toInteger(nYear);\n\tdouble m = _toInteger(nMonth);\n\tdouble dt = _toInteger(nDate);\n\tdouble ym = y + FXSYS_floor((double)m/12);\n\tdouble mn = _Mod(m ,12);\n\n\tdouble t = _TimeFromYearMonth((int)ym,(int)mn);\n\n\tif (_YearFromTime(t) != ym || _MonthFromTime(t) != mn ||_DateFromTime(t) != 1)\n\t\treturn g_NaN;\n\treturn _Day(t)+dt-1;\n}\n\ndouble JS_MakeTime(int nHour, int nMin, int nSec, int nMs)\n{\n\tif (!_isfinite(nHour) ||!_isfinite(nMin) ||!_isfinite(nSec) ||!_isfinite(nMs))\n\t\treturn g_NaN;\n\n\tdouble h = _toInteger(nHour);\n\tdouble m = _toInteger(nMin);\n\tdouble s = _toInteger(nSec);\n\tdouble milli = _toInteger(nMs);\n\n\treturn h * 3600000 + m * 60000 + s * 1000 + milli;\n}\n\ndouble JS_MakeDate(double day, double time)\n{\n\tif (!_isfinite(day) ||!_isfinite(time))\n\t\treturn g_NaN;\n\n\treturn day * 86400000 + time;\n}\n\nbool JS_PortIsNan(double d)\n{\n\treturn d != d;\n}\n\ndouble JS_LocalTime(double d)\n{\n\treturn JS_GetDateTime() + _getDaylightSavingTA(d);\n}\n\n//JavaScript time implement End.\n"
  },
  {
    "path": "fpdfsdk/src/pdfwindow/PWL_Button.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/pdfwindow/PDFWindow.h\"\n#include \"../../include/pdfwindow/PWL_Wnd.h\"\n#include \"../../include/pdfwindow/PWL_Button.h\"\n#include \"../../include/pdfwindow/PWL_Utils.h\"\n\n/* ------------------------------- CPWL_Button ---------------------------------- */\n\nCPWL_Button::CPWL_Button() :\n\tm_bMouseDown(FALSE)\n{\n}\n\nCPWL_Button::~CPWL_Button()\n{\n//\tPWL_TRACE(\"~CPWL_Button\\n\");\n}\n\nCFX_ByteString CPWL_Button::GetClassName() const\n{\n\treturn \"CPWL_Button\";\n}\n\nvoid CPWL_Button::OnCreate(PWL_CREATEPARAM & cp)\n{\n\tcp.eCursorType = FXCT_HAND;\n}\n\nFX_BOOL CPWL_Button::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tCPWL_Wnd::OnLButtonDown(point, nFlag);\n\n\tm_bMouseDown = TRUE;\n\tSetCapture();\n\t\n\treturn TRUE;\n}\n\nFX_BOOL CPWL_Button::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tCPWL_Wnd::OnLButtonUp(point, nFlag);\n\n\tReleaseCapture();\n\tm_bMouseDown = FALSE;\n\n\treturn TRUE;\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/pdfwindow/PWL_Caret.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/pdfwindow/PDFWindow.h\"\n#include \"../../include/pdfwindow/PWL_Wnd.h\"\n#include \"../../include/pdfwindow/PWL_Caret.h\"\n#include \"../../include/pdfwindow/PWL_Utils.h\"\n\n#define PWL_CARET_FLASHINTERVAL\t\t500\n\n//////////////////////////////////////////////////////////////////////\n// Construction/Destruction\n//////////////////////////////////////////////////////////////////////\n\nCPWL_Caret::CPWL_Caret() :\n\tm_bFlash(FALSE),\n\tm_ptHead(0,0),\n\tm_ptFoot(0,0),\n\tm_fWidth(0.4f),\n\tm_nDelay(0)\n{\n}\n\nCPWL_Caret::~CPWL_Caret()\n{\n}\n\nCFX_ByteString CPWL_Caret::GetClassName() const\n{\n\treturn \"CPWL_Caret\";\n}\n\nvoid CPWL_Caret::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)\n{\n\tGetCaretApp(sAppStream,CPDF_Point(0.0f,0.0f));\n}\n\nvoid CPWL_Caret::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)\n{\n\tif (IsVisible() && m_bFlash)\n\t{\n\t\tCPDF_Rect rcRect = GetCaretRect();\n\t\tCPDF_Rect rcClip = GetClipRect();\n\n\t\tCFX_PathData path;\n\n\t\tpath.SetPointCount(2);\n\t\t\n\t\tFX_FLOAT fCaretX = rcRect.left + m_fWidth * 0.5f;\n\t\tFX_FLOAT fCaretTop = rcRect.top;\n\t\tFX_FLOAT fCaretBottom = rcRect.bottom;\n\n\t\tif (!rcClip.IsEmpty())\n\t\t{\n\t\t\trcRect.Intersect(rcClip);\n\t\t\tif (!rcRect.IsEmpty())\n\t\t\t{\n\t\t\t\tfCaretTop = rcRect.top;\n\t\t\t\tfCaretBottom = rcRect.bottom;\n\t\t\t\tpath.SetPoint(0, fCaretX, fCaretBottom, FXPT_MOVETO);\n\t\t\t\tpath.SetPoint(1, fCaretX, fCaretTop, FXPT_LINETO);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpath.SetPoint(0, fCaretX, fCaretBottom, FXPT_MOVETO);\n\t\t\tpath.SetPoint(1, fCaretX, fCaretTop, FXPT_LINETO);\n\t\t}\n\n\t\tCFX_GraphStateData gsd;\n\t\tgsd.m_LineWidth = m_fWidth;\n\n\t\tpDevice->DrawPath(&path, pUser2Device, &gsd,0,  ArgbEncode(255,0,0,0), FXFILL_ALTERNATE);\n\t}\n}\n\nvoid CPWL_Caret::GetCaretApp(CFX_ByteTextBuf & sAppStream,const CPDF_Point & ptOffset)\n{\n\tif (IsVisible() && m_bFlash)\n\t{\t\n\t\tCFX_ByteTextBuf sCaret;\n\n\t\tCPDF_Rect rcRect = GetCaretRect();\n\t\tCPDF_Rect rcClip = GetClipRect();\n\n\t\trcRect = CPWL_Utils::OffsetRect(rcRect,ptOffset.x,ptOffset.y);\n\t\trcClip = CPWL_Utils::OffsetRect(rcClip,ptOffset.x,ptOffset.y);\n\n\t\tsCaret << \"q\\n\";\n\t\tif (!rcClip.IsEmpty())\n\t\t{\n\t\t\tsCaret << rcClip.left << \" \" << rcClip.bottom + 2.5f << \" \" \n\t\t\t\t<< rcClip.right - rcClip.left << \" \" << rcClip.top - rcClip.bottom - 4.5f << \" re W n\\n\";\n\t\t}\n\t\tsCaret << m_fWidth << \" w\\n0 G\\n\";\n\t\tsCaret << rcRect.left + m_fWidth/2 << \" \" << rcRect.bottom << \" m\\n\";\n\t\tsCaret << rcRect.left + m_fWidth/2 << \" \" << rcRect.top << \" l S\\nQ\\n\";\t\n\n\t\tsAppStream << sCaret;\t\n\t}\n}\n\nCFX_ByteString CPWL_Caret::GetCaretAppearanceStream(const CPDF_Point & ptOffset)\n{\n\tCFX_ByteTextBuf sCaret;\n\tGetCaretApp(sCaret,ptOffset);\n\treturn sCaret.GetByteString();\n}\n\nvoid CPWL_Caret::TimerProc()\n{\n\tif (m_nDelay > 0)\n\t{\n\t\tm_nDelay--;\t\n\t}\n\telse\n\t{\n\t\tm_bFlash = !m_bFlash;\n\t\tInvalidateRect();\n\t}\n}\n\nCPDF_Rect CPWL_Caret::GetCaretRect() const\n{\n\treturn CPDF_Rect(m_ptFoot.x,\n\t\t\tm_ptFoot.y,\n\t\t\tm_ptHead.x + this->m_fWidth,\n\t\t\tm_ptHead.y);\n}\n\nvoid CPWL_Caret::SetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & ptFoot)\n{\n\tif (bVisible)\n\t{\t\n\t\tif (IsVisible())\n\t\t{\n\t\t\tif (m_ptHead.x != ptHead.x || m_ptHead.y != ptHead.y || \n\t\t\t\t\tm_ptFoot.x != ptFoot.x || m_ptFoot.y != ptFoot.y)\n\t\t\t{\n\t\t\t\tthis->m_ptHead = ptHead;\n\t\t\t\tthis->m_ptFoot = ptFoot;\n\n\t\t\t\tm_bFlash = TRUE;\n\t\t\t\t//Move(GetCaretRect(),FALSE,TRUE);\n\t\t\t\tMove(m_rcInvalid, FALSE, TRUE);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis->m_ptHead = ptHead;\n\t\t\tthis->m_ptFoot = ptFoot;\n\n\t\t\tEndTimer();\n\t\t\tBeginTimer(PWL_CARET_FLASHINTERVAL);\n\t\t\t\n\t\t\tCPWL_Wnd::SetVisible(TRUE);\n\t\t\tm_bFlash = TRUE;\n\n\t\t\t//Move(GetCaretRect(),FALSE,TRUE);\t\n\t\t\tMove(m_rcInvalid, FALSE, TRUE);\n\t\t}\t\t\n\t}\n\telse\n\t{\n\t\tthis->m_ptHead = CPDF_Point(0,0);\n\t\tthis->m_ptFoot = CPDF_Point(0,0);\n\n\t\tm_bFlash = FALSE;\n\t\tif (IsVisible())\n\t\t{\n\t\t\tEndTimer();\n\t\t\tCPWL_Wnd::SetVisible(FALSE);\n\t\t}\t\t\n\t}\n}\n\nvoid CPWL_Caret::InvalidateRect(CPDF_Rect * pRect)\n{\n\tif (pRect)\n\t{\n\t\tCPDF_Rect rcRefresh = CPWL_Utils::InflateRect(*pRect,0.5f);\n\t\trcRefresh.top += 1;\n\t\trcRefresh.bottom -= 1;\t\n\t\t\n\t\tCPWL_Wnd::InvalidateRect(&rcRefresh);\n\t}\n\telse\n\t\tCPWL_Wnd::InvalidateRect(pRect);\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/pdfwindow/PWL_ComboBox.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/pdfwindow/PDFWindow.h\"\n#include \"../../include/pdfwindow/PWL_Wnd.h\"\n#include \"../../include/pdfwindow/PWL_EditCtrl.h\"\n#include \"../../include/pdfwindow/PWL_Edit.h\"\n#include \"../../include/pdfwindow/PWL_ListBox.h\"\n#include \"../../include/pdfwindow/PWL_ComboBox.h\"\n#include \"../../include/pdfwindow/PWL_Utils.h\"\n\n#define PWLCB_DEFAULTFONTSIZE  12.0f\n\n#define IsFloatZero(f)\t\t\t\t\t\t((f) < 0.0001 && (f) > -0.0001)\n#define IsFloatBigger(fa,fb)\t\t\t\t((fa) > (fb) && !IsFloatZero((fa) - (fb)))\n#define IsFloatSmaller(fa,fb)\t\t\t\t((fa) < (fb) && !IsFloatZero((fa) - (fb)))\n#define IsFloatEqual(fa,fb)\t\t\t\t\tIsFloatZero((fa)-(fb))\n\n\n/* ---------------------------- CPWL_CBListBox ---------------------------- */\n\nFX_BOOL\tCPWL_CBListBox::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tCPWL_Wnd::OnLButtonUp(point,nFlag);\n\n\tif (m_bMouseDown)\n\t{\n\t\tReleaseCapture();\n\t\tm_bMouseDown = FALSE;\t\n\n\t\tif (this->ClientHitTest(point))\n\t\t{\n\t\t\tif (CPWL_Wnd * pParent = GetParentWindow())\n\t\t\t{\n\t\t\t\tpParent->OnNotify(this,PNM_LBUTTONUP,0,PWL_MAKEDWORD(point.x,point.y));\t\t\t\n\t\t\t}\n\t\t\n\t\t\tFX_BOOL bExit = FALSE;\n\t\t\tOnNotifySelChanged(FALSE,bExit, nFlag);\n\t\t\tif (bExit) return FALSE;\n\t\t}\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL CPWL_CBListBox::OnKeyDown(FX_WORD nChar, FX_BOOL & bExit, FX_DWORD nFlag)\n{\n\tif (!m_pList) return FALSE;\n\n\tswitch (nChar)\n\t{\n\tdefault:\n\t\treturn FALSE;\n\tcase FWL_VKEY_Up:\n\tcase FWL_VKEY_Down:\n\tcase FWL_VKEY_Home:\n\tcase FWL_VKEY_Left:\n\tcase FWL_VKEY_End:\n\tcase FWL_VKEY_Right:\n\t\tbreak;\t\n\t}\n\n\tswitch (nChar)\n\t{\n\tcase FWL_VKEY_Up:\n\t\tm_pList->OnVK_UP(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));\n\t\tbreak;\n\tcase FWL_VKEY_Down:\n\t\tm_pList->OnVK_DOWN(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));\n\t\tbreak;\n\tcase FWL_VKEY_Home:\n\t\tm_pList->OnVK_HOME(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));\n\t\tbreak;\n\tcase FWL_VKEY_Left:\n\t\tm_pList->OnVK_LEFT(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));\n\t\tbreak;\n\tcase FWL_VKEY_End:\n\t\tm_pList->OnVK_END(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));\n\t\tbreak;\n\tcase FWL_VKEY_Right:\n\t\tm_pList->OnVK_RIGHT(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));\n\t\tbreak;\n\tcase FWL_VKEY_Delete:\n\t\tbreak;\n\t}\n\n\tOnNotifySelChanged(TRUE,bExit, nFlag);\n\n\treturn TRUE;\n}\n\nFX_BOOL\tCPWL_CBListBox::OnChar(FX_WORD nChar, FX_BOOL & bExit, FX_DWORD nFlag)\n{\n\tif (!m_pList) return FALSE;\n\n\tif (!m_pList->OnChar(nChar,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag))) return FALSE;\n\n\tif (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetParentWindow())\n\t{\n\t\tpComboBox->SetSelectText();\n\t}\n\n\tOnNotifySelChanged(TRUE,bExit,nFlag);\n\n\treturn TRUE;\n}\n\n/* ---------------------------- CPWL_CBButton ---------------------------- */\n\nvoid CPWL_CBButton::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)\n{\n\tCPWL_Wnd::GetThisAppearanceStream(sAppStream);\n\t\n\tCPDF_Rect rectWnd = CPWL_Wnd::GetWindowRect();\n\t\n\tif (IsVisible() && !rectWnd.IsEmpty())\n\t{\n\t\tCFX_ByteTextBuf sButton;\t\n\n\t\tCPDF_Point ptCenter = this->GetCenterPoint();\n\n\t\tCPDF_Point pt1(ptCenter.x - PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);\n\t\tCPDF_Point pt2(ptCenter.x + PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);\n\t\tCPDF_Point pt3(ptCenter.x,ptCenter.y - PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);\n\n\t\tif (IsFloatBigger(rectWnd.right - rectWnd.left,PWL_CBBUTTON_TRIANGLE_HALFLEN * 2)\n\t\t\t&&\n\t\t\tIsFloatBigger(rectWnd.top - rectWnd.bottom,PWL_CBBUTTON_TRIANGLE_HALFLEN)\n\t\t\t)\n\t\t{\n\t\t\tsButton << \"0 g\\n\";\n\t\t\tsButton << pt1.x << \" \" << pt1.y << \" m\\n\";\n\t\t\tsButton << pt2.x << \" \" << pt2.y << \" l\\n\";\n\t\t\tsButton << pt3.x << \" \" << pt3.y << \" l\\n\";\n\t\t\tsButton << pt1.x << \" \" << pt1.y << \" l f\\n\";\n\n\t\t\tsAppStream << \"q\\n\" << sButton << \"Q\\n\";\n\t\t}\t\n\t}\n}\n\nvoid CPWL_CBButton::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)\n{\n\tCPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);\n\n\tCPDF_Rect rectWnd = CPWL_Wnd::GetWindowRect();\n\t\n\tif (IsVisible() && !rectWnd.IsEmpty())\n\t{\n\t\tCPDF_Point ptCenter = this->GetCenterPoint();\n\n\t\tCPDF_Point pt1(ptCenter.x - PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);\n\t\tCPDF_Point pt2(ptCenter.x + PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);\n\t\tCPDF_Point pt3(ptCenter.x,ptCenter.y - PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);\n\n\t\tif (IsFloatBigger(rectWnd.right - rectWnd.left,PWL_CBBUTTON_TRIANGLE_HALFLEN * 2)\n\t\t\t&&\n\t\t\tIsFloatBigger(rectWnd.top - rectWnd.bottom,PWL_CBBUTTON_TRIANGLE_HALFLEN)\n\t\t\t)\n\t\t{\n\t\t\tCFX_PathData path;\n\n\t\t\tpath.SetPointCount(4);\n\t\t\tpath.SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO);\n\t\t\tpath.SetPoint(1, pt2.x, pt2.y, FXPT_LINETO);\n\t\t\tpath.SetPoint(2, pt3.x, pt3.y, FXPT_LINETO);\n\t\t\tpath.SetPoint(3, pt1.x, pt1.y, FXPT_LINETO);\n\n\t\t\tpDevice->DrawPath(&path, pUser2Device, NULL, \n\t\t\t\tCPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_BLACKCOLOR,GetTransparency()), \n\t\t\t\t0, FXFILL_ALTERNATE);\n\t\t}\n\t}\n}\n\nFX_BOOL\tCPWL_CBButton::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tCPWL_Wnd::OnLButtonDown(point,nFlag);\n\n\tSetCapture();\n\n\tif (CPWL_Wnd * pParent = GetParentWindow())\n\t{\t\t\n\t\tpParent->OnNotify(this,PNM_LBUTTONDOWN,0,PWL_MAKEDWORD(point.x,point.y));\n\t}\n\t\n\treturn TRUE;\n}\n\nFX_BOOL\tCPWL_CBButton::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tCPWL_Wnd::OnLButtonUp(point, nFlag);\n\n\tReleaseCapture();\n\n\treturn TRUE;\n}\n\n/* ---------------------------- CPWL_ComboBox ---------------------------- */\n\nCPWL_ComboBox::CPWL_ComboBox() : m_pEdit(NULL),\n\tm_pButton(NULL),\n\tm_pList(NULL),\n\tm_bPopup(FALSE),\n\tm_nPopupWhere(0),\n\tm_nSelectItem(-1),\n\tm_pFillerNotify(NULL)\n{\n}\n\nCFX_ByteString CPWL_ComboBox::GetClassName() const\n{\n\treturn \"CPWL_ComboBox\";\n}\n\nvoid CPWL_ComboBox::OnCreate(PWL_CREATEPARAM & cp)\n{\n\tcp.dwFlags &= ~PWS_HSCROLL;\n\tcp.dwFlags &= ~PWS_VSCROLL;\n}\n\nvoid CPWL_ComboBox::SetFocus()\n{\n\tif (m_pEdit)\n\t\tm_pEdit->SetFocus();\n}\n\nvoid CPWL_ComboBox::KillFocus()\n{\n\tSetPopup(FALSE);\n\tCPWL_Wnd::KillFocus();\n}\n\nCFX_WideString CPWL_ComboBox::GetText() const\n{\n\tif (m_pEdit)\n\t{\n\t\treturn m_pEdit->GetText();\n\t}\n\treturn CFX_WideString();\n}\n\nvoid CPWL_ComboBox::SetText(FX_LPCWSTR text)\n{\n\tif (m_pEdit)\n\t\tm_pEdit->SetText(text);\n}\n\nvoid CPWL_ComboBox::AddString(FX_LPCWSTR string)\n{\n\tif (m_pList)\n\t\tm_pList->AddString(string);\n}\n\nFX_INT32 CPWL_ComboBox::GetSelect() const\n{\n\treturn m_nSelectItem;\n}\n\nvoid CPWL_ComboBox::SetSelect(FX_INT32 nItemIndex)\n{\n\tif (m_pList)\n\t\tm_pList->Select(nItemIndex);\n\n\tm_pEdit->SetText(m_pList->GetText());\n\n\tm_nSelectItem = nItemIndex;\n}\n\nvoid CPWL_ComboBox::SetEditSel(FX_INT32 nStartChar,FX_INT32 nEndChar)\n{\n\tif (m_pEdit)\n\t{\n\t\tm_pEdit->SetSel(nStartChar,nEndChar);\n\t}\n}\n\nvoid CPWL_ComboBox::GetEditSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar) const\n{\n\tnStartChar = -1;\n\tnEndChar = -1;\n\n\tif (m_pEdit)\n\t{\n\t\tm_pEdit->GetSel(nStartChar,nEndChar);\n\t}\n}\n\nvoid CPWL_ComboBox::Clear()\n{\n\tif (m_pEdit)\n\t{\n\t\tm_pEdit->Clear();\n\t}\n}\n\nvoid CPWL_ComboBox::CreateChildWnd(const PWL_CREATEPARAM & cp)\n{\n\tCreateEdit(cp);\n\tCreateButton(cp);\n\tCreateListBox(cp);\n}\n\nvoid CPWL_ComboBox::CreateEdit(const PWL_CREATEPARAM & cp)\n{\n\tif (!m_pEdit)\n\t{\n\t\tm_pEdit = new CPWL_CBEdit;\n\t\tm_pEdit->AttachFFLData(m_pFormFiller);\n\n\t\tPWL_CREATEPARAM ecp = cp;\n\t\tecp.pParentWnd = this;\n\t\tecp.dwFlags =  PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PES_CENTER | PES_AUTOSCROLL | PES_UNDO;\n\n\t\tif (HasFlag(PWS_AUTOFONTSIZE))\n\t\t\tecp.dwFlags |= PWS_AUTOFONTSIZE;\n\n\t\tif (!HasFlag(PCBS_ALLOWCUSTOMTEXT))\n\t\t\tecp.dwFlags |= PWS_READONLY;\n\n\t\tecp.rcRectWnd = CPDF_Rect(0,0,0,0);\n\t\tecp.dwBorderWidth = 0;\n\t\tecp.nBorderStyle = PBS_SOLID;\n\n\t\tm_pEdit->Create(ecp);\n\t}\n}\n\nvoid CPWL_ComboBox::CreateButton(const PWL_CREATEPARAM & cp)\n{\n\tif (!m_pButton)\n\t{\n\t\tm_pButton = new CPWL_CBButton;\t\n\n\t\tPWL_CREATEPARAM bcp = cp;\n\t\tbcp.pParentWnd = this;\n\t\tbcp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PWS_BACKGROUND;\t\n\t\tbcp.sBackgroundColor = PWL_SCROLLBAR_BKCOLOR;\n\t\tbcp.sBorderColor = PWL_DEFAULT_BLACKCOLOR;\n\t\tbcp.dwBorderWidth = 2;\n\t\tbcp.nBorderStyle = PBS_BEVELED;\n\t\tbcp.eCursorType = FXCT_ARROW;\n\n\t\tm_pButton->Create(bcp);\n\t}\n}\n\nvoid CPWL_ComboBox::CreateListBox(const PWL_CREATEPARAM & cp)\n{\n\tif (!m_pList)\n\t{\n\t\tm_pList = new CPWL_CBListBox;\n\t\tm_pList->AttachFFLData(m_pFormFiller);\n\t\tPWL_CREATEPARAM lcp = cp;\n\t\tlcp.pParentWnd = this;\n\t\tlcp.dwFlags = PWS_CHILD | PWS_BORDER | PWS_BACKGROUND | PLBS_HOVERSEL | PWS_VSCROLL;\n\t\tlcp.nBorderStyle = PBS_SOLID;\n\t\tlcp.dwBorderWidth = 1;\n\t\tlcp.eCursorType = FXCT_ARROW;\n\t\tlcp.rcRectWnd = CPDF_Rect(0,0,0,0);\n\n\t\tif (cp.dwFlags & PWS_AUTOFONTSIZE)\n\t\t\tlcp.fFontSize = PWLCB_DEFAULTFONTSIZE;\n\t\telse\n\t\t\tlcp.fFontSize = cp.fFontSize;\n\n\t\tif (cp.sBorderColor.nColorType == COLORTYPE_TRANSPARENT)\n\t\t\tlcp.sBorderColor = PWL_DEFAULT_BLACKCOLOR;\n\n\t\tif (cp.sBackgroundColor.nColorType == COLORTYPE_TRANSPARENT)\n\t\t\tlcp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR;\t\t\n\n\t\tm_pList->Create(lcp);\n\t}\n}\n\nvoid CPWL_ComboBox::RePosChildWnd()\n{\n\tCPDF_Rect rcClient = GetClientRect();\n\n\tif (m_bPopup)\n\t{\n\t\tCPDF_Rect rclient = GetClientRect();\n\t\tCPDF_Rect rcButton = rclient;\n\t\tCPDF_Rect rcEdit = rcClient;\n\t\tCPDF_Rect rcList = CPWL_Wnd::GetWindowRect();\n\n\t\tFX_FLOAT fOldWindowHeight = m_rcOldWindow.Height();\n\t\tFX_FLOAT fOldClientHeight = fOldWindowHeight - GetBorderWidth() * 2;\n\t\t\n\t\tswitch (m_nPopupWhere)\n\t\t{\n\t\tcase 0:\n\t\t\trcButton.left = rcButton.right - PWL_COMBOBOX_BUTTON_WIDTH;\n\n\t\t\tif (rcButton.left < rclient.left)\n\t\t\t\trcButton.left = rclient.left;\n\t\t\t\n\t\t\trcButton.bottom = rcButton.top - fOldClientHeight;\n\n\t\t\trcEdit.right = rcButton.left - 1.0f;\n\n\t\t\tif (rcEdit.left < rclient.left)\n\t\t\t\trcEdit.left = rclient.left;\n\n\t\t\tif (rcEdit.right < rcEdit.left)\n\t\t\t\trcEdit.right = rcEdit.left;\n\n\t\t\trcEdit.bottom = rcEdit.top - fOldClientHeight;\n\n\t\t\trcList.top -= fOldWindowHeight;\n\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\trcButton.left = rcButton.right - PWL_COMBOBOX_BUTTON_WIDTH;\n\n\t\t\tif (rcButton.left < rclient.left)\n\t\t\t\trcButton.left = rclient.left;\n\t\t\t\n\t\t\trcButton.top = rcButton.bottom + fOldClientHeight;\n\n\t\t\trcEdit.right = rcButton.left - 1.0f;\n\n\t\t\tif (rcEdit.left < rclient.left)\n\t\t\t\trcEdit.left = rclient.left;\n\n\t\t\tif (rcEdit.right < rcEdit.left)\n\t\t\t\trcEdit.right = rcEdit.left;\n\n\t\t\trcEdit.top = rcEdit.bottom + fOldClientHeight;\n\n\t\t\trcList.bottom += fOldWindowHeight;\n\n\t\t\tbreak;\n\t\t}\t\t\n\n\t\tif (m_pButton)\n\t\t\tm_pButton->Move(rcButton,TRUE,FALSE);\n\n\t\tif (m_pEdit)\n\t\t\tm_pEdit->Move(rcEdit,TRUE,FALSE);\n\n\t\tif (m_pList)\n\t\t{\n\t\t\tm_pList->SetVisible(TRUE);\t\t\t\n\t\t\tm_pList->Move(rcList,TRUE,FALSE);\n\t\t\tm_pList->ScrollToListItem(m_nSelectItem);\n\t\t}\n\t}\n\telse\n\t{\t\t\n\t\tCPDF_Rect rcButton = rcClient;\n\n\t\trcButton.left = rcButton.right - PWL_COMBOBOX_BUTTON_WIDTH;\t\n\t\t\n\t\tif (rcButton.left < rcClient.left)\n\t\t\trcButton.left = rcClient.left;\n\n\t\tif (m_pButton)\n\t\t\tm_pButton->Move(rcButton,TRUE,FALSE);\n\n\t\tCPDF_Rect rcEdit = rcClient;\n\t\trcEdit.right = rcButton.left - 1.0f;\n\n\t\tif (rcEdit.left < rcClient.left)\n\t\t\trcEdit.left = rcClient.left;\n\n\t\tif (rcEdit.right < rcEdit.left)\n\t\t\trcEdit.right = rcEdit.left;\n\n\t\tif (m_pEdit)\n\t\t\tm_pEdit->Move(rcEdit,TRUE,FALSE);\n\n\t\tif (m_pList)\n\t\t\tm_pList->SetVisible(FALSE);\n\t}\n}\n\nvoid CPWL_ComboBox::SelectAll()\n{\n\tif (m_pEdit && HasFlag(PCBS_ALLOWCUSTOMTEXT))\n\t\tm_pEdit->SelectAll();\n}\n\nCPDF_Rect CPWL_ComboBox::GetFocusRect() const\n{\n\treturn CPDF_Rect();\n}\n\nvoid CPWL_ComboBox::SetPopup(FX_BOOL bPopup)\n{\n\tif (!m_pList) return;\n\tif (bPopup == m_bPopup) return;\n\tFX_FLOAT fListHeight = m_pList->GetContentRect().Height();\n\tif (!IsFloatBigger(fListHeight,0.0f)) return;\n\n\tif (bPopup)\n\t{\n\t\tif (m_pFillerNotify)\n\t\t{\n\t\t\tFX_INT32 nWhere = 0;\n\t\t\tFX_FLOAT fPopupRet = 0.0f;\n\t\t\tFX_FLOAT fPopupMin = 0.0f;\n\t\t\tif (m_pList->GetCount() > 3)\n\t\t\t\tfPopupMin = m_pList->GetFirstHeight() * 3 + m_pList->GetBorderWidth() * 2;\n\t\t\tFX_FLOAT fPopupMax = fListHeight + m_pList->GetBorderWidth() * 2;\n\t\t\tm_pFillerNotify->QueryWherePopup(GetAttachedData(), fPopupMin,fPopupMax,nWhere,fPopupRet);\n\n\t\t\tif (IsFloatBigger(fPopupRet,0.0f))\n\t\t\t{\n\t\t\t\tm_bPopup = bPopup;\n\n\t\t\t\tCPDF_Rect rcWindow = CPWL_Wnd::GetWindowRect();\n\t\t\t\tm_rcOldWindow = rcWindow;\n\t\t\t\tswitch (nWhere)\n\t\t\t\t{\n\t\t\t\tdefault:\n\t\t\t\tcase 0:\n\t\t\t\t\trcWindow.bottom -= fPopupRet;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1:\n\t\t\t\t\trcWindow.top += fPopupRet;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tm_nPopupWhere = nWhere;\n\t\t\t\tMove(rcWindow, TRUE, TRUE);\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tm_bPopup = bPopup;\n\t\tMove(m_rcOldWindow, TRUE, TRUE);\n\t}\n}\n\nFX_BOOL CPWL_ComboBox::OnKeyDown(FX_WORD nChar, FX_DWORD nFlag)\n{\n\tif (!m_pList) return FALSE;\n\tif (!m_pEdit) return FALSE;\n\n\tm_nSelectItem = -1;\n\n\tswitch (nChar)\n\t{\n\tcase FWL_VKEY_Up:\n\t\tif (m_pList->GetCurSel() > 0)\n\t\t{\n\t\t\tFX_BOOL bExit = FALSE;\n\t\t\tif (m_pList->OnKeyDown(nChar,bExit,nFlag))\n\t\t\t{\n\t\t\t\tif (bExit) return FALSE;\n\t\t\t\tSetSelectText();\t\t\t\t\n\t\t\t}\n\t\t}\n\t\treturn TRUE;\n\tcase FWL_VKEY_Down:\n\t\tif (m_pList->GetCurSel() < m_pList->GetCount() - 1)\n\t\t{\n\t\t\tFX_BOOL bExit = FALSE;\n\t\t\tif (m_pList->OnKeyDown(nChar,bExit,nFlag))\n\t\t\t{\n\t\t\t\tif (bExit) return FALSE;\n\t\t\t\tSetSelectText();\t\t\t\t\n\t\t\t}\n\t\t}\n\t\treturn TRUE;\n\t}\n\n\tif (HasFlag(PCBS_ALLOWCUSTOMTEXT))\n\t\treturn m_pEdit->OnKeyDown(nChar,nFlag);\n\telse\n\t\treturn FALSE;\n}\n\nFX_BOOL CPWL_ComboBox::OnChar(FX_WORD nChar, FX_DWORD nFlag)\n{\n\tif (!m_pList) return FALSE;\n\tif (!m_pEdit) return FALSE;\n\n\tm_nSelectItem = -1;\n\tFX_BOOL bExit = FALSE;\n\n\tif (HasFlag(PCBS_ALLOWCUSTOMTEXT))\n\t{\n\t\treturn m_pEdit->OnChar(nChar,nFlag);\t\t\t\n\t}\n\telse\n\t{\n\t\tif (m_pList->OnChar(nChar,bExit,nFlag))\n\t\t{\n\t\t\treturn bExit;\n\t\t}\n\t\telse\n\t\t\treturn FALSE;\n\t}\n}\n\nvoid CPWL_ComboBox::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)\n{\n\tswitch (msg)\n\t{\n\tcase PNM_LBUTTONDOWN:\n\t\tif (pWnd == m_pButton)\n\t\t{\n\t\t\tSetPopup(!m_bPopup);\n\t\t\treturn;\n\t\t}\n\t\tbreak;\n\tcase PNM_LBUTTONUP:\n\t\tif (m_pEdit && m_pList)\n\t\t{\n\t\t\tif (pWnd == m_pList)\n\t\t\t{\t\t\t\n\t\t\t\tSetSelectText();\n\t\t\t\tSelectAll();\n\t\t\t\tm_pEdit->SetFocus();\n\t\t\t\tSetPopup(FALSE);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tCPWL_Wnd::OnNotify(pWnd,msg,wParam,lParam);\n}\n\nFX_BOOL CPWL_ComboBox::IsPopup() const\n{\n\treturn m_bPopup;\n}\n\nvoid CPWL_ComboBox::SetSelectText()\n{\n\tCFX_WideString swText = m_pList->GetText();\n\tm_pEdit->SelectAll();\n\tm_pEdit->ReplaceSel(m_pList->GetText());\n\tm_pEdit->SelectAll();\n\n\tm_nSelectItem = m_pList->GetCurSel();\n}\n\nFX_BOOL CPWL_ComboBox::IsModified() const\n{\n\treturn m_pEdit->IsModified();\n}\n\nvoid CPWL_ComboBox::SetFillerNotify(IPWL_Filler_Notify* pNotify)\n{\n\t m_pFillerNotify = pNotify;\n\n\t if (m_pEdit)\n\t\t m_pEdit->SetFillerNotify(pNotify);\n\n\t if (m_pList)\n\t\t m_pList->SetFillerNotify(pNotify);\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/pdfwindow/PWL_Edit.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/pdfwindow/PDFWindow.h\"\n#include \"../../include/pdfwindow/PWL_Wnd.h\"\n#include \"../../include/pdfwindow/PWL_EditCtrl.h\"\n#include \"../../include/pdfwindow/PWL_Edit.h\"\n#include \"../../include/pdfwindow/PWL_ScrollBar.h\"\n#include \"../../include/pdfwindow/PWL_Utils.h\"\n#include \"../../include/pdfwindow/PWL_Caret.h\"\n#include \"../../include/pdfwindow/PWL_FontMap.h\"\n\n/* ---------------------------- CPWL_Edit ------------------------------ */\n\nCPWL_Edit::CPWL_Edit() : m_pFillerNotify(NULL), \n\tm_pSpellCheck(NULL),\n\tm_bFocus(FALSE)\n{\n\tm_pFormFiller = NULL;\n}\n\nCPWL_Edit::~CPWL_Edit()\n{\n\tASSERT(m_bFocus == FALSE);\n}\n\nCFX_ByteString CPWL_Edit::GetClassName() const\n{\n\treturn PWL_CLASSNAME_EDIT;\n}\n\nvoid CPWL_Edit::OnDestroy()\n{\n}\n\nvoid CPWL_Edit::SetText(FX_LPCWSTR csText)\n{\n\tCFX_WideString swText = csText;\n\n\tif (HasFlag(PES_RICH))\n\t{\t\t\n\t\tCFX_ByteString sValue = CFX_ByteString::FromUnicode(swText);\n\t\t\n\t\tif (CXML_Element * pXML = CXML_Element::Parse((FX_LPCSTR)sValue,sValue.GetLength()))\n\t\t{\n\t\t\tFX_INT32 nCount = pXML->CountChildren();\n\t\t\tFX_BOOL bFirst = TRUE;\n\n\t\t\tswText.Empty();\n\n\t\t\tfor (FX_INT32 i=0; i<nCount; i++)\n\t\t\t{\n\t\t\t\tif (CXML_Element * pSubElement = pXML->GetElement(i))\n\t\t\t\t{\n\t\t\t\t\tCFX_ByteString tag=pSubElement->GetTagName();\n\t\t   \t\t\tif (tag.EqualNoCase(\"p\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tint nChild = pSubElement->CountChildren();\n\t\t\t\t\t\tCFX_WideString swSection;\n\t\t\t\t\t\tfor(FX_INT32 j=0; j<nChild; j++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tswSection += pSubElement->GetContent(j);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (bFirst)bFirst = FALSE;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tswText += FWL_VKEY_Return;\n\t\t\t\t\t\tswText += swSection;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdelete pXML;\n\t\t}\n\t}\t\n\n\tm_pEdit->SetText(swText);\n}\n\nvoid CPWL_Edit::RePosChildWnd()\n{\n\tif (CPWL_ScrollBar * pVSB = this->GetVScrollBar())\n\t{\n\t\t//if (pVSB->IsVisible())\n\t\t{\n\t\t\tCPDF_Rect rcWindow = m_rcOldWindow;\t\t\n\t\t\tCPDF_Rect rcVScroll = CPDF_Rect(rcWindow.right,\n\t\t\t\t\t\t\t\trcWindow.bottom,\n\t\t\t\t\t\t\t\trcWindow.right + PWL_SCROLLBAR_WIDTH,\n\t\t\t\t\t\t\t\trcWindow.top);\n\t\t\tpVSB->Move(rcVScroll, TRUE, FALSE);\n\t\t}\n\t}\n\n\tif (m_pEditCaret && !HasFlag(PES_TEXTOVERFLOW))\n\t\tm_pEditCaret->SetClipRect(CPWL_Utils::InflateRect(GetClientRect(),1.0f)); //+1 for caret beside border\n\n\tCPWL_EditCtrl::RePosChildWnd();\n}\n\nCPDF_Rect CPWL_Edit::GetClientRect() const\n{\n\tCPDF_Rect rcClient = CPWL_Utils::DeflateRect(GetWindowRect(),(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));\n\t\n\tif (CPWL_ScrollBar * pVSB = this->GetVScrollBar())\n\t{\n\t\tif (pVSB->IsVisible())\n\t\t{\n\t\t\trcClient.right -= PWL_SCROLLBAR_WIDTH;\n\t\t}\n\t}\n\n\treturn rcClient;\n}\n\nvoid CPWL_Edit::SetAlignFormatH(PWL_EDIT_ALIGNFORMAT_H nFormat, FX_BOOL bPaint/* = TRUE*/)\n{\n\tm_pEdit->SetAlignmentH((FX_INT32)nFormat, bPaint);\n}\n\nvoid CPWL_Edit::SetAlignFormatV(PWL_EDIT_ALIGNFORMAT_V nFormat, FX_BOOL bPaint/* = TRUE*/)\n{\n\tm_pEdit->SetAlignmentV((FX_INT32)nFormat, bPaint);\n}\n\nFX_BOOL\tCPWL_Edit::CanSelectAll() const\n{\n\treturn  GetSelectWordRange() != m_pEdit->GetWholeWordRange();\n}\n\nFX_BOOL\tCPWL_Edit::CanClear() const\n{\n\treturn !IsReadOnly() && m_pEdit->IsSelected();\n}\n\nFX_BOOL\tCPWL_Edit::CanCopy() const\n{\n\treturn \t!HasFlag(PES_PASSWORD) && !HasFlag(PES_NOREAD) && m_pEdit->IsSelected();\n}\n\nFX_BOOL\tCPWL_Edit::CanCut() const\n{\n\treturn \tCanCopy() && !IsReadOnly();\n}\n\nFX_BOOL\tCPWL_Edit::CanPaste() const\n{\n\tif (IsReadOnly()) return FALSE;\n\n\tCFX_WideString swClipboard;\n\tif (IFX_SystemHandler* pSH = GetSystemHandler())\n\t\tswClipboard = pSH->GetClipboardText(GetAttachedHWnd());\n\n\treturn !swClipboard.IsEmpty();\n}\n\nvoid CPWL_Edit::CopyText()\n{\n\tif (!CanCopy()) return;\n\n\tCFX_WideString str = m_pEdit->GetSelText();\n\n\tif (IFX_SystemHandler* pSH = GetSystemHandler())\n\t\tpSH->SetClipboardText(GetAttachedHWnd(), str);\n}\n\nvoid CPWL_Edit::PasteText()\n{\n\tif (!CanPaste()) return;\n\n\tCFX_WideString swClipboard;\n\tif (IFX_SystemHandler* pSH = GetSystemHandler())\n\t\tswClipboard = pSH->GetClipboardText(GetAttachedHWnd());\n\n\tif (m_pFillerNotify)\n\t{\n\t\tFX_BOOL bRC = TRUE;\n\t\tFX_BOOL bExit = FALSE;\n\t\tCFX_WideString strChangeEx;\n\t\tint nSelStart = 0;\n\t\tint nSelEnd = 0;\n\t\tGetSel(nSelStart, nSelEnd);\n\t\tm_pFillerNotify->OnBeforeKeyStroke(TRUE, GetAttachedData(), 0 , swClipboard, strChangeEx, nSelStart, nSelEnd, TRUE, bRC, bExit, 0);\n\t\tif (!bRC) return;\n\t\tif (bExit) return;\n\t}\n\n\tif (swClipboard.GetLength() > 0)\n\t{\n\t\tClear();\n\t\tInsertText(swClipboard);\n\t}\n\n\tif (m_pFillerNotify)\n\t{\n\t\tFX_BOOL bExit = FALSE;\n\t\tm_pFillerNotify->OnAfterKeyStroke(TRUE, GetAttachedData(), bExit,0);\n\t\tif (bExit) return;\n\t}\n}\n\nvoid CPWL_Edit::CutText()\n{\n\tif (!CanCut()) return;\n\n\tCFX_WideString str = m_pEdit->GetSelText();\n\n\tif (IFX_SystemHandler* pSH = GetSystemHandler())\n\t\tpSH->SetClipboardText(GetAttachedHWnd(), str);\n\n\tm_pEdit->Clear();\n}\n\nvoid CPWL_Edit::OnCreated()\n{\n\tCPWL_EditCtrl::OnCreated();\n\n\tif (CPWL_ScrollBar * pScroll = GetVScrollBar())\n\t{\n\t\tpScroll->RemoveFlag(PWS_AUTOTRANSPARENT);\n\t\tpScroll->SetTransparency(255);\n\t}\n\n\tSetParamByFlag();\n\n\tm_rcOldWindow = GetWindowRect();\n\n\tm_pEdit->SetOprNotify(this);\n\tm_pEdit->EnableOprNotify(TRUE);\n}\n\nvoid CPWL_Edit::SetParamByFlag()\n{\t\n\tif (HasFlag(PES_RIGHT))\n\t{\n\t\tm_pEdit->SetAlignmentH(2, FALSE);\n\t}\n\telse if (HasFlag(PES_MIDDLE))\n\t{\n\t\tm_pEdit->SetAlignmentH(1, FALSE);\n\t}\n\telse\n\t{\n\t\tm_pEdit->SetAlignmentH(0, FALSE);\n\t}\n\n\tif (HasFlag(PES_BOTTOM))\n\t{\n\t\tm_pEdit->SetAlignmentV(2, FALSE);\n\t}\n\telse if (HasFlag(PES_CENTER))\n\t{\n\t\tm_pEdit->SetAlignmentV(1, FALSE);\n\t}\n\telse\n\t{\n\t\tm_pEdit->SetAlignmentV(0, FALSE);\n\t}\n\n\tif (HasFlag(PES_PASSWORD))\n\t{\n\t\tm_pEdit->SetPasswordChar('*', FALSE);\n\t}\n\n\tm_pEdit->SetMultiLine(HasFlag(PES_MULTILINE), FALSE);\n\tm_pEdit->SetAutoReturn(HasFlag(PES_AUTORETURN), FALSE);\n\tm_pEdit->SetAutoFontSize(HasFlag(PWS_AUTOFONTSIZE), FALSE);\n\tm_pEdit->SetAutoScroll(HasFlag(PES_AUTOSCROLL), FALSE);\n\tm_pEdit->EnableUndo(HasFlag(PES_UNDO));\n\n\tif (HasFlag(PES_TEXTOVERFLOW))\n\t{\n\t\tSetClipRect(CPDF_Rect(0.0f,0.0f,0.0f,0.0f));\n\t\tm_pEdit->SetTextOverflow(TRUE, FALSE);\n\t}\n\telse\n\t{\n\t\tif (m_pEditCaret)\n\t\t{\n\t\t\tm_pEditCaret->SetClipRect(CPWL_Utils::InflateRect(GetClientRect(),1.0f)); //+1 for caret beside border\n\t\t}\n\t}\n\n\tif (HasFlag(PES_SPELLCHECK))\n\t{\n\t\tm_pSpellCheck = GetCreationParam().pSpellCheck;\n\t}\n}\n\nvoid CPWL_Edit::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)\n{\n\tCPWL_Wnd::GetThisAppearanceStream(sAppStream);\n\n\tCPDF_Rect rcClient = GetClientRect();\n\tCFX_ByteTextBuf sLine;\n\n\tFX_INT32 nCharArray = m_pEdit->GetCharArray();\n\n\tif (nCharArray > 0)\n\t{\n\t\tswitch (GetBorderStyle())\n\t\t{\n\t\tcase PBS_SOLID:\n\t\t\t{\n\t\t\t\tsLine << \"q\\n\" << GetBorderWidth() << \" w\\n\" \n\t\t\t\t\t<< CPWL_Utils::GetColorAppStream(GetBorderColor(),FALSE) << \" 2 J 0 j\\n\";\t\t\t\t\t\n\n\t\t\t\tfor (FX_INT32 i=1;i<nCharArray;i++)\n\t\t\t\t{\n\t\t\t\t\tsLine << rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*i << \" \"\n\t\t\t\t\t\t<< rcClient.bottom << \" m\\n\"\n\t\t\t\t\t\t<< rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*i << \" \"\n\t\t\t\t\t\t<< rcClient.top << \" l S\\n\";\t\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\tsLine << \"Q\\n\";\t\t\t\t\t\n\t\t\t}\n\t\t\tbreak; \n\t\tcase PBS_DASH:\n\t\t\t{\n\t\t\t\tsLine << \"q\\n\" << GetBorderWidth() << \" w\\n\" \n\t\t\t\t\t<< CPWL_Utils::GetColorAppStream(GetBorderColor(),FALSE) << \" 2 J 0 j\\n\"\n\t\t\t\t\t<< \"[\" << GetBorderDash().nDash << \" \" \n\t\t\t\t\t<< GetBorderDash().nGap << \"] \" \n\t\t\t\t\t<< GetBorderDash().nPhase << \" d\\n\";\n\n\t\t\t\tfor (FX_INT32 i=1;i<nCharArray;i++)\t\t\t\t\t\n\t\t\t\t{\n\t\t\t\t\tsLine << rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*i << \" \"\n\t\t\t\t\t\t<< rcClient.bottom << \" m\\n\"\n\t\t\t\t\t\t<< rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*i << \" \"\n\t\t\t\t\t\t<< rcClient.top << \" l S\\n\";\t\n\t\t\t\t}\n\n\t\t\t\tsLine << \"Q\\n\";\n\t\t\t}\n\t\t\tbreak;\n\t\t}\t\t\n\t}\n\n\tsAppStream << sLine;\n\n\tCFX_ByteTextBuf sText;\n\n\tCPDF_Point ptOffset = CPDF_Point(0.0f,0.0f);\n\n\tCPVT_WordRange wrWhole = m_pEdit->GetWholeWordRange();\n\tCPVT_WordRange wrSelect = GetSelectWordRange();\n\tCPVT_WordRange wrVisible = (HasFlag(PES_TEXTOVERFLOW) ? wrWhole : m_pEdit->GetVisibleWordRange());\n\tCPVT_WordRange wrSelBefore(wrWhole.BeginPos,wrSelect.BeginPos);\n\tCPVT_WordRange wrSelAfter(wrSelect.EndPos,wrWhole.EndPos);\n\n\tCPVT_WordRange wrTemp = CPWL_Utils::OverlapWordRange(GetSelectWordRange(),wrVisible);\n\tCFX_ByteString sEditSel = CPWL_Utils::GetEditSelAppStream(m_pEdit, ptOffset,\n\t\t\t&wrTemp);\n\n\tif (sEditSel.GetLength() > 0)\n\t\tsText << CPWL_Utils::GetColorAppStream(PWL_DEFAULT_SELBACKCOLOR) << sEditSel ;\n\n\twrTemp = CPWL_Utils::OverlapWordRange(wrVisible,wrSelBefore);\n\tCFX_ByteString sEditBefore = CPWL_Utils::GetEditAppStream(m_pEdit, ptOffset,  \n\t\t\t&wrTemp, !HasFlag(PES_CHARARRAY), m_pEdit->GetPasswordChar());\t\t\t\n\n\tif (sEditBefore.GetLength() > 0)\n\t\tsText << \"BT\\n\" << CPWL_Utils::GetColorAppStream(GetTextColor()) << sEditBefore << \"ET\\n\";\n\n\twrTemp = CPWL_Utils::OverlapWordRange(wrVisible,wrSelect);\n\tCFX_ByteString sEditMid = CPWL_Utils::GetEditAppStream(m_pEdit, ptOffset, \n\t\t\t&wrTemp, !HasFlag(PES_CHARARRAY), m_pEdit->GetPasswordChar());\t\t\t\n\n\tif (sEditMid.GetLength() > 0)\n\t\tsText << \"BT\\n\" << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_GRAY,1)) << sEditMid << \"ET\\n\";\n\n\twrTemp = CPWL_Utils::OverlapWordRange(wrVisible,wrSelAfter);\n\tCFX_ByteString sEditAfter = CPWL_Utils::GetEditAppStream(m_pEdit, ptOffset, \n\t\t\t&wrTemp, !HasFlag(PES_CHARARRAY), m_pEdit->GetPasswordChar());\t\t\t\n\n\tif (sEditAfter.GetLength() > 0)\n\t\tsText << \"BT\\n\" << CPWL_Utils::GetColorAppStream(GetTextColor()) << sEditAfter<< \"ET\\n\";\n\n\tif (HasFlag(PES_SPELLCHECK))\n\t{\n\t\tCFX_ByteString sSpellCheck = CPWL_Utils::GetSpellCheckAppStream(m_pEdit, m_pSpellCheck, ptOffset, &wrVisible);\n\t\tif (sSpellCheck.GetLength() > 0)\n\t\t\tsText << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_RGB,1,0,0),FALSE) << sSpellCheck;\n\t}\n\n\tif (sText.GetLength() > 0)\n\t{\n\t\tCPDF_Rect rcClient = this->GetClientRect();\n\t\tsAppStream << \"q\\n/Tx BMC\\n\";\n\t\t\n\t\tif (!HasFlag(PES_TEXTOVERFLOW))\n\t\t\tsAppStream << rcClient.left << \" \" << rcClient.bottom << \" \"\n\t\t\t\t<< rcClient.right - rcClient.left << \" \" << rcClient.top - rcClient.bottom << \" re W n\\n\";\n\n\t\tsAppStream << sText;\n\n\t\tsAppStream << \"EMC\\nQ\\n\";\n\t}\n}\n\nvoid CPWL_Edit::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)\n{\n\tCPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);\n\n\tCPDF_Rect rcClient = GetClientRect();\n\tCFX_ByteTextBuf sLine;\n\n\tFX_INT32 nCharArray = m_pEdit->GetCharArray();\n\n\tif (nCharArray > 0)\n\t{\n\t\tswitch (GetBorderStyle())\n\t\t{\n\t\tcase PBS_SOLID:\n\t\t\t{\n\t\t\t\tCFX_GraphStateData gsd;\n\t\t\t\tgsd.m_LineWidth = (FX_FLOAT)GetBorderWidth();\n\n\t\t\t\tCFX_PathData path;\n\t\t\t\tpath.SetPointCount((nCharArray-1)*2);\n\t\t\t\t\n\t\t\t\tfor (FX_INT32 i=0; i<nCharArray-1; i++)\n\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\tpath.SetPoint(i*2, rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*(i+1), \n\t\t\t\t\t\trcClient.bottom, FXPT_MOVETO);\n\t\t\t\t\tpath.SetPoint(i*2+1, rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*(i+1),\n\t\t\t\t\t\trcClient.top, FXPT_LINETO);\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t}\t\t\t\n\t\t\t\tif (path.GetPointCount() > 0)\n\t\t\t\t\tpDevice->DrawPath(&path, pUser2Device, &gsd,0,  \n\t\t\t\t\t\tCPWL_Utils::PWLColorToFXColor(GetBorderColor(),255), FXFILL_ALTERNATE);\n\t\t\t}\n\t\t\tbreak; \n\t\tcase PBS_DASH:\n\t\t\t{\n\t\t\t\tCFX_GraphStateData gsd;\n\t\t\t\tgsd.m_LineWidth = (FX_FLOAT)GetBorderWidth();\n\n\t\t\t\tgsd.SetDashCount(2);\n\t\t\t\tgsd.m_DashArray[0] = (FX_FLOAT)GetBorderDash().nDash;\n\t\t\t\tgsd.m_DashArray[1] = (FX_FLOAT)GetBorderDash().nGap;\n\t\t\t\tgsd.m_DashPhase = (FX_FLOAT)GetBorderDash().nPhase;\n\n\t\t\t\tCFX_PathData path;\n\t\t\t\tpath.SetPointCount((nCharArray-1)*2);\n\t\t\t\t\n\t\t\t\tfor (FX_INT32 i=0; i<nCharArray-1; i++)\n\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\tpath.SetPoint(i*2, rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*(i+1), \n\t\t\t\t\t\trcClient.bottom, FXPT_MOVETO);\n\t\t\t\t\tpath.SetPoint(i*2+1, rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*(i+1),\n\t\t\t\t\t\trcClient.top, FXPT_LINETO);\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t}\t\t\n\t\t\t\tif (path.GetPointCount() > 0)\n\t\t\t\t\tpDevice->DrawPath(&path, pUser2Device, &gsd,0,  \n\t\t\t\t\t\tCPWL_Utils::PWLColorToFXColor(GetBorderColor(),255), FXFILL_ALTERNATE);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\t\t\n\t}\n\n\tCPDF_Rect rcClip;\n\tCPVT_WordRange wrRange = m_pEdit->GetVisibleWordRange();\n\tCPVT_WordRange* pRange = NULL;\n\n\tif (!HasFlag(PES_TEXTOVERFLOW))\n\t{\n\t\trcClip = GetClientRect();\n\t\tpRange = &wrRange;\n\t}\nIFX_SystemHandler* pSysHandler = GetSystemHandler();\n\tIFX_Edit::DrawEdit(pDevice,pUser2Device,m_pEdit,\n\t\tCPWL_Utils::PWLColorToFXColor(GetTextColor(),this->GetTransparency()),\n\t\tCPWL_Utils::PWLColorToFXColor(GetTextStrokeColor(),this->GetTransparency()),\n\t\trcClip,CPDF_Point(0.0f,0.0f),pRange, pSysHandler, m_pFormFiller);\n\n\tif (HasFlag(PES_SPELLCHECK))\n\t{\n\t\tCPWL_Utils::DrawEditSpellCheck(pDevice,pUser2Device,m_pEdit,rcClip,\n\t\t\tCPDF_Point(0.0f,0.0f),pRange, this->GetCreationParam().pSpellCheck);\n\t}\n}\n\nFX_BOOL CPWL_Edit::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tCPWL_Wnd::OnLButtonDown(point,nFlag);\n\n\tif (HasFlag(PES_TEXTOVERFLOW) || ClientHitTest(point))\n\t{\n\t\tif (m_bMouseDown)\n\t\t\tthis->InvalidateRect();\n\n\t\tm_bMouseDown = TRUE;\t\t\n\t\tSetCapture();\n\n\t\tm_pEdit->OnMouseDown(point,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL\tCPWL_Edit::OnLButtonDblClk(const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tCPWL_Wnd::OnLButtonDblClk(point, nFlag);\n\n\tif (HasFlag(PES_TEXTOVERFLOW) || ClientHitTest(point))\n\t{\n\t\tm_pEdit->SelectAll();\n\t}\n\n\treturn TRUE;\n}\n\n#define WM_PWLEDIT_UNDO\t\t\t\t\t0x01\n#define WM_PWLEDIT_REDO\t\t\t\t\t0x02\n#define WM_PWLEDIT_CUT\t\t\t\t\t0x03\n#define WM_PWLEDIT_COPY\t\t\t\t\t0x04\n#define WM_PWLEDIT_PASTE\t\t\t\t0x05\n#define WM_PWLEDIT_DELETE\t\t\t\t0x06\n#define WM_PWLEDIT_SELECTALL\t\t\t0x07\n#define WM_PWLEDIT_SUGGEST\t\t\t\t0x08\n\nFX_BOOL CPWL_Edit::OnRButtonUp(const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tif (m_bMouseDown) return FALSE;\n\n\tCPWL_Wnd::OnRButtonUp(point, nFlag);\n\t\n\tif (!HasFlag(PES_TEXTOVERFLOW) && !ClientHitTest(point)) return TRUE;\n\n\tIFX_SystemHandler* pSH = GetSystemHandler();\n\tif (!pSH) return FALSE;\n\n\tthis->SetFocus();\n\n\tCPVT_WordRange wrLatin = GetLatinWordsRange(point);\n\tCFX_WideString swLatin = m_pEdit->GetRangeText(wrLatin);\n\n\tFX_HMENU hPopup = pSH->CreatePopupMenu();\n\tif (!hPopup) return FALSE;\n\n\tCFX_ByteStringArray sSuggestWords;\n\tCPDF_Point ptPopup = point;\n\n\tif (!IsReadOnly())\n\t{\n\t\tif (HasFlag(PES_SPELLCHECK) && !swLatin.IsEmpty())\n\t\t{\n\t\t\tif (m_pSpellCheck)\n\t\t\t{\n\t\t\t\tCFX_ByteString sLatin = CFX_ByteString::FromUnicode(swLatin);\n\n\t\t\t\tif (!m_pSpellCheck->CheckWord(sLatin))\n\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\tm_pSpellCheck->SuggestWords(sLatin,sSuggestWords);\n\n\t\t\t\t\tFX_INT32 nSuggest = sSuggestWords.GetSize();\n\n\t\t\t\t\tfor (FX_INT32 nWord=0; nWord<nSuggest; nWord++)\n\t\t\t\t\t{\t\n\t\t\t\t\t\tpSH->AppendMenuItem(hPopup, WM_PWLEDIT_SUGGEST+nWord, sSuggestWords[nWord].UTF8Decode());\n\t\t\t\t\t}\n\n\t\t\t\t\tif (nSuggest > 0)\n\t\t\t\t\t\tpSH->AppendMenuItem(hPopup, 0, L\"\");\n\n\t\t\t\t\tptPopup = GetWordRightBottomPoint(wrLatin.EndPos);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tIPWL_Provider* pProvider = this->GetProvider();\n\n\tif (HasFlag(PES_UNDO))\n\t{\n\t\tpSH->AppendMenuItem(hPopup, WM_PWLEDIT_UNDO, \n\t\t\tpProvider ? pProvider->LoadPopupMenuString(0) : L\"&Undo\");\n\t\tpSH->AppendMenuItem(hPopup, WM_PWLEDIT_REDO,\n\t\t\tpProvider ? pProvider->LoadPopupMenuString(1) : L\"&Redo\");\n\t\tpSH->AppendMenuItem(hPopup, 0, L\"\");\n\n\t\tif (!m_pEdit->CanUndo())\n\t\t\tpSH->EnableMenuItem(hPopup, WM_PWLEDIT_UNDO, FALSE);\n\t\tif (!m_pEdit->CanRedo())\n\t\t\tpSH->EnableMenuItem(hPopup, WM_PWLEDIT_REDO, FALSE);\n\t}\n\n\tpSH->AppendMenuItem(hPopup, WM_PWLEDIT_CUT, \n\t\tpProvider ? pProvider->LoadPopupMenuString(2) : L\"Cu&t\");\n\tpSH->AppendMenuItem(hPopup, WM_PWLEDIT_COPY, \n\t\tpProvider ? pProvider->LoadPopupMenuString(3) : L\"&Copy\");\n\tpSH->AppendMenuItem(hPopup, WM_PWLEDIT_PASTE, \n\t\tpProvider ? pProvider->LoadPopupMenuString(4) : L\"&Paste\");\n\tpSH->AppendMenuItem(hPopup, WM_PWLEDIT_DELETE, \n\t\tpProvider ? pProvider->LoadPopupMenuString(5) : L\"&Delete\");\n\n\tCFX_WideString swText = pSH->GetClipboardText(this->GetAttachedHWnd());\n\tif (swText.IsEmpty())\n\t\tpSH->EnableMenuItem(hPopup, WM_PWLEDIT_PASTE, FALSE);\n\n\tif (!m_pEdit->IsSelected())\n\t{\n\t\tpSH->EnableMenuItem(hPopup, WM_PWLEDIT_CUT, FALSE);\n\t\tpSH->EnableMenuItem(hPopup, WM_PWLEDIT_COPY, FALSE);\n\t\tpSH->EnableMenuItem(hPopup, WM_PWLEDIT_DELETE, FALSE);\n\t}\n\n\tif (IsReadOnly())\n\t{\n\t\tpSH->EnableMenuItem(hPopup, WM_PWLEDIT_CUT, FALSE);\n\t\tpSH->EnableMenuItem(hPopup, WM_PWLEDIT_DELETE, FALSE);\n\t\tpSH->EnableMenuItem(hPopup, WM_PWLEDIT_PASTE, FALSE);\t\t\t\n\t}\n\n\tif (HasFlag(PES_PASSWORD))\n\t{\n\t\tpSH->EnableMenuItem(hPopup, WM_PWLEDIT_CUT, FALSE);\n\t\tpSH->EnableMenuItem(hPopup, WM_PWLEDIT_COPY, FALSE);\n\t}\n\n\tif (HasFlag(PES_NOREAD))\n\t{\n\t\tpSH->EnableMenuItem(hPopup, WM_PWLEDIT_CUT, FALSE);\n\t\tpSH->EnableMenuItem(hPopup, WM_PWLEDIT_COPY, FALSE);\n\t}\n\n\tpSH->AppendMenuItem(hPopup, 0, L\"\");\n\tpSH->AppendMenuItem(hPopup, WM_PWLEDIT_SELECTALL,\n\t\tpProvider ? pProvider->LoadPopupMenuString(6) : L\"&Select All\");\n\n\tif (m_pEdit->GetTotalWords() == 0)\n\t{\n\t\tpSH->EnableMenuItem(hPopup, WM_PWLEDIT_SELECTALL, FALSE);\n\t}\n\n\tFX_INT32 x, y;\n\tPWLtoWnd(ptPopup, x, y);\n\tpSH->ClientToScreen(GetAttachedHWnd(), x, y);\n\tpSH->SetCursor(FXCT_ARROW);\n\tFX_INT32 nCmd = pSH->TrackPopupMenu(hPopup,\n\t\t\t\t\t x,\n\t\t\t\t\t y,\n\t\t\t\t\t GetAttachedHWnd());\n\n\n\tswitch (nCmd)\n\t{\n\tcase WM_PWLEDIT_UNDO:\n\t\tUndo();\n\t\tbreak;\n\tcase WM_PWLEDIT_REDO:\n\t\tRedo();\n\t\tbreak;\n\tcase WM_PWLEDIT_CUT:\n\t\tthis->CutText();\n\t\tbreak;\n\tcase WM_PWLEDIT_COPY:\n\t\tthis->CopyText();\n\t\tbreak;\n\tcase WM_PWLEDIT_PASTE:\n\t\tthis->PasteText();\n\t\tbreak;\n\tcase WM_PWLEDIT_DELETE:\n\t\tthis->Clear();\n\t\tbreak;\n\tcase WM_PWLEDIT_SELECTALL:\n\t\tthis->SelectAll();\n\t\tbreak;\n\tcase WM_PWLEDIT_SUGGEST + 0:\n\t\tSetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos),m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos));\n\t\tReplaceSel(sSuggestWords[0].UTF8Decode());\n\t\tbreak;\n\tcase WM_PWLEDIT_SUGGEST + 1:\n\t\tSetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos),m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos));\n\t\tReplaceSel(sSuggestWords[1].UTF8Decode());\n\t\tbreak;\n\tcase WM_PWLEDIT_SUGGEST + 2:\n\t\tSetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos),m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos));\n\t\tReplaceSel(sSuggestWords[2].UTF8Decode());\n\t\tbreak;\n\tcase WM_PWLEDIT_SUGGEST + 3:\n\t\tSetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos),m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos));\n\t\tReplaceSel(sSuggestWords[3].UTF8Decode());\n\t\tbreak;\n\tcase WM_PWLEDIT_SUGGEST + 4:\t\t\n\t\tSetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos),m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos));\n\t\tReplaceSel(sSuggestWords[4].UTF8Decode());\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\n\tpSH->DestroyMenu(hPopup);\n\n\treturn TRUE;\n}\n\nvoid CPWL_Edit::OnSetFocus()\n{\n\tSetEditCaret(TRUE);\n\n\tif (!IsReadOnly())\n\t{\n\t\tif (IPWL_FocusHandler* pFocusHandler = GetFocusHandler())\n\t\t\tpFocusHandler->OnSetFocus(this);\n\t}\n\n\tm_bFocus = TRUE;\n}\n\nvoid CPWL_Edit::OnKillFocus()\n{\n\tShowVScrollBar(FALSE);\n\t\n\tm_pEdit->SelectNone();\n\tSetCaret(FALSE, CPDF_Point(0.0f,0.0f), CPDF_Point(0.0f,0.0f));\n\t\n\tSetCharSet(0);\n\n\tif (!IsReadOnly())\n\t{\n\t\tif (IPWL_FocusHandler* pFocusHandler = GetFocusHandler())\n\t\t\tpFocusHandler->OnKillFocus(this);\n\t}\n\n\tm_bFocus = FALSE;\n}\n\nvoid CPWL_Edit::SetHorzScale(FX_INT32 nHorzScale, FX_BOOL bPaint/* = TRUE*/)\n{\n\tm_pEdit->SetHorzScale(nHorzScale, bPaint);\n}\n\nvoid CPWL_Edit::SetCharSpace(FX_FLOAT fCharSpace, FX_BOOL bPaint/* = TRUE*/)\n{\n\tm_pEdit->SetCharSpace(fCharSpace, bPaint);\n}\n\nvoid CPWL_Edit::SetLineLeading(FX_FLOAT fLineLeading, FX_BOOL bPaint/* = TRUE*/)\n{\n\tm_pEdit->SetLineLeading(fLineLeading, bPaint);\n}\n\nCFX_ByteString CPWL_Edit::GetSelectAppearanceStream(const CPDF_Point & ptOffset) const\n{\n\tCPVT_WordRange wr = GetSelectWordRange();\n\treturn CPWL_Utils::GetEditSelAppStream(m_pEdit,ptOffset,&wr);\n}\n\nCPVT_WordRange CPWL_Edit::GetSelectWordRange() const\n{\n\tif (m_pEdit->IsSelected())\n\t{\n\t\tFX_INT32 nStart = -1;\n\t\tFX_INT32 nEnd = -1;\n\n\t\tm_pEdit->GetSel(nStart, nEnd);\n\n\t\tCPVT_WordPlace wpStart = m_pEdit->WordIndexToWordPlace(nStart);\n\t\tCPVT_WordPlace wpEnd = m_pEdit->WordIndexToWordPlace(nEnd);\n\n\t\treturn CPVT_WordRange(wpStart,wpEnd);\n\t}\n\n\treturn CPVT_WordRange();\n}\n\nCFX_ByteString CPWL_Edit::GetTextAppearanceStream(const CPDF_Point & ptOffset) const\n{\n\tCFX_ByteTextBuf sRet;\n\tCFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(m_pEdit,ptOffset);\n\t\n\tif (sEdit.GetLength() > 0)\n\t{\n\t\tsRet << \"BT\\n\" << CPWL_Utils::GetColorAppStream(GetTextColor()) << sEdit << \"ET\\n\";\n\t}\n\n\treturn sRet.GetByteString();\n}\n\nCFX_ByteString CPWL_Edit::GetCaretAppearanceStream(const CPDF_Point & ptOffset) const\n{\n\tif (m_pEditCaret)\n\t\treturn m_pEditCaret->GetCaretAppearanceStream(ptOffset);\n\n\treturn CFX_ByteString();\n}\n\nCPDF_Point CPWL_Edit::GetWordRightBottomPoint(const CPVT_WordPlace& wpWord)\n{\n\tCPDF_Point pt(0.0f, 0.0f);\n\n\tif (IFX_Edit_Iterator * pIterator = m_pEdit->GetIterator())\n\t{\n\t\tCPVT_WordPlace wpOld = pIterator->GetAt();\n\t\tpIterator->SetAt(wpWord);\n\t\tCPVT_Word word;\n\t\tif (pIterator->GetWord(word))\n\t\t{\n\t\t\tpt = CPDF_Point(word.ptWord.x + word.fWidth, word.ptWord.y + word.fDescent);\n\t\t}\n\n\t\tpIterator->SetAt(wpOld);\n\t}\n\n\treturn pt;\n}\n\nFX_BOOL\tCPWL_Edit::IsTextFull() const\n{\n\treturn m_pEdit->IsTextFull();\n}\n\nFX_FLOAT CPWL_Edit::GetCharArrayAutoFontSize(CPDF_Font* pFont, const CPDF_Rect& rcPlate, FX_INT32 nCharArray)\n{\n\tif (pFont && !pFont->IsStandardFont())\n\t{\n\t\tFX_RECT rcBBox;\n\t\tpFont->GetFontBBox(rcBBox);\n\n\t\tCPDF_Rect rcCell = rcPlate;\n\t\tFX_FLOAT xdiv = rcCell.Width() / nCharArray * 1000.0f / rcBBox.Width();\n\t\tFX_FLOAT ydiv = - rcCell.Height() * 1000.0f / rcBBox.Height();\n\n\t\treturn xdiv < ydiv ? xdiv : ydiv;\n\t}\n\n\treturn 0.0f;\n}\n\nvoid CPWL_Edit::SetCharArray(FX_INT32 nCharArray)\n{\n\tif (HasFlag(PES_CHARARRAY) && nCharArray > 0)\n\t{\n\t\tm_pEdit->SetCharArray(nCharArray);\t\n\t\tm_pEdit->SetTextOverflow(TRUE);\n\n\t\tif (HasFlag(PWS_AUTOFONTSIZE))\n\t\t{\n\t\t\tif (IFX_Edit_FontMap* pFontMap = this->GetFontMap())\n\t\t\t{\n\t\t\t\tFX_FLOAT fFontSize = GetCharArrayAutoFontSize(pFontMap->GetPDFFont(0), GetClientRect(), nCharArray);\n\t\t\t\tif (fFontSize > 0.0f)\n\t\t\t\t{\n\t\t\t\t\tm_pEdit->SetAutoFontSize(FALSE);\n\t\t\t\t\tm_pEdit->SetFontSize(fFontSize);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid CPWL_Edit::SetLimitChar(FX_INT32 nLimitChar)\n{\n\tm_pEdit->SetLimitChar(nLimitChar);\n}\n\nvoid CPWL_Edit::ReplaceSel(FX_LPCWSTR csText)\n{\n\tm_pEdit->Clear();\n\tm_pEdit->InsertText(csText);\n}\n\nCPDF_Rect CPWL_Edit::GetFocusRect() const\n{\n\treturn CPDF_Rect();\n}\n\nvoid CPWL_Edit::ShowVScrollBar(FX_BOOL bShow)\n{\n\tif (CPWL_ScrollBar * pScroll = GetVScrollBar())\n\t{\n\t\tif (bShow)\n\t\t{\n\t\t\tif (!pScroll->IsVisible())\n\t\t\t{\n\t\t\t\tpScroll->SetVisible(TRUE);\n\t\t\t\tCPDF_Rect rcWindow = GetWindowRect();\n\t\t\t\tm_rcOldWindow = rcWindow;\n\t\t\t\trcWindow.right += PWL_SCROLLBAR_WIDTH;\t\t\t\n\t\t\t\tMove(rcWindow, TRUE, TRUE);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (pScroll->IsVisible())\n\t\t\t{\n\t\t\t\tpScroll->SetVisible(FALSE);\n\t\t\t\tMove(m_rcOldWindow, TRUE, TRUE);\n\t\t\t}\t\n\t\t}\n\t}\n}\n\nFX_BOOL\tCPWL_Edit::IsVScrollBarVisible() const\n{\n\tif (CPWL_ScrollBar * pScroll = GetVScrollBar())\n\t{\n\t\treturn pScroll->IsVisible();\n\t}\n\n\treturn FALSE;\n}\n\nvoid CPWL_Edit::EnableSpellCheck(FX_BOOL bEnabled)\n{\n\tif (bEnabled)\n\t\tAddFlag(PES_SPELLCHECK);\n\telse\n\t\tRemoveFlag(PES_SPELLCHECK);\n}\n\nFX_BOOL CPWL_Edit::OnKeyDown(FX_WORD nChar, FX_DWORD nFlag)\n{\n\tif (m_bMouseDown) return TRUE;\n\n\tif (nChar == FWL_VKEY_Delete)\n\t{\n\t\tif (m_pFillerNotify)\n\t\t{\n\t\t\tFX_BOOL bRC = TRUE;\n\t\t\tFX_BOOL bExit = FALSE;\n\t\t\tCFX_WideString strChange;\n\t\t\tCFX_WideString strChangeEx;\n\n\t\t\tint nSelStart = 0;\n\t\t\tint nSelEnd = 0;\n\t\t\tGetSel(nSelStart, nSelEnd);\n\n\t\t\tif (nSelStart == nSelEnd)\n\t\t\t\tnSelEnd = nSelStart + 1;\n\t\t\tm_pFillerNotify->OnBeforeKeyStroke(TRUE, GetAttachedData(), FWL_VKEY_Delete, strChange, strChangeEx, nSelStart, nSelEnd, TRUE, bRC, bExit, nFlag);\n\t\t\tif (!bRC) return FALSE;\t\t\t\t\n\t\t\tif (bExit) return FALSE;\n\t\t}\n\t}\n\n\tFX_BOOL bRet = CPWL_EditCtrl::OnKeyDown(nChar,  nFlag);\n\n\tif (nChar == FWL_VKEY_Delete)\n\t{\n\t\tif (m_pFillerNotify)\n\t\t{\n\t\t\tFX_BOOL bExit = FALSE;\n\t\t\tm_pFillerNotify->OnAfterKeyStroke(TRUE, GetAttachedData(), bExit,nFlag);\n\t\t\tif (bExit) return FALSE;\n\t\t}\n\t}\n\n\t//In case of implementation swallow the OnKeyDown event.\n\tif(IsProceedtoOnChar(nChar, nFlag))\n\t\t\treturn TRUE;\n\n\treturn bRet;\n}\n\n/**\n*In case of implementation swallow the OnKeyDown event. \n*If the event is swallowed, implementation may do other unexpected things, which is not the control means to do.\n*/\nFX_BOOL CPWL_Edit::IsProceedtoOnChar(FX_WORD nKeyCode, FX_DWORD nFlag)\n{\n\n\tFX_BOOL bCtrl = IsCTRLpressed(nFlag);\n\tFX_BOOL bAlt = IsALTpressed(nFlag);\n\tif(bCtrl && !bAlt)\n\t{\n\t//hot keys for edit control.\t\n\t\tswitch(nKeyCode)\n\t\t{\n\t\tcase 'C':\n\t\tcase 'V':\n\t\tcase 'X':\n\t\tcase 'A':\n\t\tcase 'Z':\n\t\t\treturn TRUE;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\t//control characters.\n\tswitch(nKeyCode)\n\t{\n\tcase FWL_VKEY_Escape:\n\tcase FWL_VKEY_Back:\n\tcase FWL_VKEY_Return:\n\tcase FWL_VKEY_Space:\n\t\treturn TRUE;\n\tdefault:\n\t\tbreak;\n\t}\n\treturn FALSE;\n\n}\n\nFX_BOOL CPWL_Edit::OnChar(FX_WORD nChar, FX_DWORD nFlag)\n{\n\tif (m_bMouseDown) return TRUE;\n\n\tFX_BOOL bRC = TRUE;\n\tFX_BOOL bExit = FALSE;\n\n\tFX_BOOL bCtrl = IsCTRLpressed(nFlag);\n\tif (!bCtrl)\n\t{\n\t\tif (m_pFillerNotify)\n\t\t{\n\t\t\tCFX_WideString swChange;\n\t\t\tFX_INT32 nKeyCode;\n\n\t\t\tint nSelStart = 0;\n\t\t\tint nSelEnd = 0;\n\t\t\tGetSel(nSelStart, nSelEnd);\n\n\t\t\tswitch (nChar)\n\t\t\t{\n\t\t\tcase FWL_VKEY_Back:\n\t\t\t\tnKeyCode = nChar;\n\t\t\t\tif (nSelStart == nSelEnd)\n\t\t\t\t\tnSelStart = nSelEnd - 1;\n\t\t\t\tbreak;\n\t\t\tcase FWL_VKEY_Return:\n\t\t\t\tnKeyCode = nChar;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tnKeyCode = 0;\n\t\t\t\tswChange += nChar;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\n\t\t\tCFX_WideString strChangeEx;\n\t\t\tm_pFillerNotify->OnBeforeKeyStroke(TRUE, GetAttachedData(), nKeyCode, swChange, strChangeEx, nSelStart, nSelEnd, TRUE, bRC, bExit, nFlag);\n\t\t}\n\t}\n\n\tif (!bRC) return TRUE;\n\tif (bExit) return FALSE;\n\n\tif (IFX_Edit_FontMap * pFontMap = GetFontMap())\n\t{\n\t\tFX_INT32 nOldCharSet = GetCharSet();\n\t\tFX_INT32 nNewCharSet = pFontMap->CharSetFromUnicode(nChar, DEFAULT_CHARSET);\n\t\tif(nOldCharSet != nNewCharSet)\n\t\t{\n\t\t\tSetCharSet(nNewCharSet);\n\t\t}\n\t}\n\tFX_BOOL bRet = CPWL_EditCtrl::OnChar(nChar,nFlag);\n\n\tif (!bCtrl)\n\t{\n\t\tif (m_pFillerNotify)\n\t\t{\n\t\t\tm_pFillerNotify->OnAfterKeyStroke(TRUE, GetAttachedData(), bExit,nFlag);\n\t\t\tif (bExit) return FALSE;\n\t\t}\n\t}\n\n\treturn bRet;\n}\n\nFX_BOOL\tCPWL_Edit::OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tif (HasFlag(PES_MULTILINE))\n\t{\n\t\tCPDF_Point ptScroll = GetScrollPos();\n\n\t\tif (zDelta > 0)\n\t\t{\n\t\t\tptScroll.y += this->GetFontSize();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tptScroll.y -= this->GetFontSize();\n\t\t}\n\t\tthis->SetScrollPos(ptScroll);\n\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\nvoid CPWL_Edit::OnInsertReturn(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace)\n{\n\tif (HasFlag(PES_SPELLCHECK))\n\t{\n\t\tm_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace),GetLatinWordsRange(place)));\n\t}\n\n\tif (m_pEditNotify)\n\t{\n\t\tm_pEditNotify->OnInsertReturn(place, oldplace);\n\t}\n}\n\nvoid CPWL_Edit::OnBackSpace(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace)\n{\n\tif (HasFlag(PES_SPELLCHECK))\n\t{\n\t\tm_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace),GetLatinWordsRange(place)));\n\t}\n\n\tif (m_pEditNotify)\n\t{\n\t\tm_pEditNotify->OnBackSpace(place, oldplace);\n\t}\n}\n\nvoid CPWL_Edit::OnDelete(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace)\n{\n\tif (HasFlag(PES_SPELLCHECK))\n\t{\n\t\tm_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace),GetLatinWordsRange(place)));\n\t}\n\n\tif (m_pEditNotify)\n\t{\n\t\tm_pEditNotify->OnDelete(place, oldplace);\n\t}\n}\n\nvoid CPWL_Edit::OnClear(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace)\n{\n\tif (HasFlag(PES_SPELLCHECK))\n\t{\n\t\tm_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace),GetLatinWordsRange(place)));\n\t}\n\n\tif (m_pEditNotify)\n\t{\n\t\tm_pEditNotify->OnClear(place, oldplace);\n\t}\n}\n\nvoid CPWL_Edit::OnInsertWord(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace)\n{\n\tif (HasFlag(PES_SPELLCHECK))\n\t{\n\t\tm_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace),GetLatinWordsRange(place)));\n\t}\n\n\tif (m_pEditNotify)\n\t{\n\t\tm_pEditNotify->OnInsertWord(place, oldplace);\n\t}\n}\n\nvoid CPWL_Edit::OnSetText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace)\n{\n}\n\nvoid CPWL_Edit::OnInsertText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace)\n{\n\tif (HasFlag(PES_SPELLCHECK))\n\t{\n\t\tm_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace),GetLatinWordsRange(place)));\n\t}\n\n\tif (m_pEditNotify)\n\t{\n\t\tm_pEditNotify->OnInsertText(place, oldplace);\n\t}\n}\n\nvoid CPWL_Edit::OnAddUndo(IFX_Edit_UndoItem* pUndoItem)\n{\n\tif (m_pEditNotify)\n\t{\n\t\tm_pEditNotify->OnAddUndo(this);\n\t}\n}\n\nCPVT_WordRange CPWL_Edit::CombineWordRange(const CPVT_WordRange& wr1, const CPVT_WordRange& wr2)\n{\n\tCPVT_WordRange wrRet;\n\n\tif (wr1.BeginPos.WordCmp(wr2.BeginPos) < 0)\n\t{\n\t\twrRet.BeginPos = wr1.BeginPos;\n\t}\n\telse\n\t{\n\t\twrRet.BeginPos = wr2.BeginPos;\n\t}\n\n\tif (wr1.EndPos.WordCmp(wr2.EndPos) < 0)\n\t{\n\t\twrRet.EndPos = wr2.EndPos;\n\t}\n\telse\n\t{\n\t\twrRet.EndPos = wr1.EndPos;\n\t}\n\n\treturn wrRet;\n}\n\nCPVT_WordRange CPWL_Edit::GetLatinWordsRange(const CPDF_Point& point) const\n{\n\treturn GetSameWordsRange(m_pEdit->SearchWordPlace(point), TRUE, FALSE);\n}\n\nCPVT_WordRange CPWL_Edit::GetLatinWordsRange(const CPVT_WordPlace & place) const\n{\n\treturn GetSameWordsRange(place, TRUE, FALSE);\n}\n\nCPVT_WordRange CPWL_Edit::GetArabicWordsRange(const CPVT_WordPlace & place) const\n{\n\treturn GetSameWordsRange(place, FALSE, TRUE);\n}\n\n#define PWL_ISARABICWORD(word) ((word >= 0x0600 && word <= 0x06FF) || (word >= 0xFB50 && word <= 0xFEFC))\n\nCPVT_WordRange CPWL_Edit::GetSameWordsRange(const CPVT_WordPlace & place, FX_BOOL bLatin, FX_BOOL bArabic) const\n{\n\tCPVT_WordRange range;\n\n\tif (IFX_Edit_Iterator* pIterator = m_pEdit->GetIterator())\n\t{\n\t\tCPVT_Word wordinfo;\t\n\t\tCPVT_WordPlace wpStart(place),wpEnd(place);\t\t\t\n\t\tpIterator->SetAt(place);\t\t\t\n\t\t\n\t\tif (bLatin)\n\t\t{\n\t\t\twhile (pIterator->NextWord())\n\t\t\t{\n\t\t\t\tif (pIterator->GetWord(wordinfo) && FX_EDIT_ISLATINWORD(wordinfo.Word))\n\t\t\t\t{\n\t\t\t\t\twpEnd = pIterator->GetAt();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\telse \n\t\t\t\t\tbreak;\n\t\t\t};\n\t\t}\n\t\telse if (bArabic)\n\t\t{\n\t\t\twhile (pIterator->NextWord())\n\t\t\t{\n\t\t\t\tif (pIterator->GetWord(wordinfo) && PWL_ISARABICWORD(wordinfo.Word))\n\t\t\t\t{\n\t\t\t\t\twpEnd = pIterator->GetAt();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\telse \n\t\t\t\t\tbreak;\n\t\t\t};\n\t\t}\n\n\t\tpIterator->SetAt(place);\n\n\t\tif (bLatin)\n\t\t{\n\t\t\tdo\n\t\t\t{\n\t\t\t\tif (pIterator->GetWord(wordinfo) && FX_EDIT_ISLATINWORD(wordinfo.Word))\n\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\twpStart = pIterator->GetAt();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\twhile (pIterator->PrevWord());\n\t\t}\n\t\telse if (bArabic)\n\t\t{\n\t\t\tdo\n\t\t\t{\n\t\t\t\tif (pIterator->GetWord(wordinfo) && PWL_ISARABICWORD(wordinfo.Word))\n\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\twpStart = pIterator->GetAt();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\twhile (pIterator->PrevWord());\n\t\t}\n\n\t\trange.Set(wpStart,wpEnd);\n\t}\t\n\n\treturn range;\n}\n\nvoid CPWL_Edit::AjustArabicWords(const CPVT_WordRange& wr)\n{\n}\n\nvoid CPWL_Edit::GeneratePageObjects(CPDF_PageObjects* pPageObjects, \n\t\t\t\t\t\t\t\t\t\tconst CPDF_Point& ptOffset, CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray)\n{\n\tIFX_Edit::GeneratePageObjects(pPageObjects, m_pEdit, ptOffset, NULL, CPWL_Utils::PWLColorToFXColor(GetTextColor(),GetTransparency()), ObjArray);\n}\n\nvoid CPWL_Edit::GeneratePageObjects(CPDF_PageObjects* pPageObjects, \n\t\t\t\t\t\t\t\t\tconst CPDF_Point& ptOffset)\n{\n\tCFX_ArrayTemplate<CPDF_TextObject*> ObjArray;\n\tIFX_Edit::GeneratePageObjects(pPageObjects, m_pEdit, ptOffset, NULL, CPWL_Utils::PWLColorToFXColor(GetTextColor(),GetTransparency()), ObjArray);\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/pdfwindow/PWL_EditCtrl.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/pdfwindow/PDFWindow.h\"\n#include \"../../include/pdfwindow/PWL_Wnd.h\"\n#include \"../../include/pdfwindow/PWL_EditCtrl.h\"\n#include \"../../include/pdfwindow/PWL_ScrollBar.h\"\n#include \"../../include/pdfwindow/PWL_Utils.h\"\n#include \"../../include/pdfwindow/PWL_Caret.h\"\n#include \"../../include/pdfwindow/PWL_FontMap.h\"\n\n#define IsFloatZero(f)\t\t\t\t\t\t((f) < 0.0001 && (f) > -0.0001)\n#define IsFloatBigger(fa,fb)\t\t\t\t((fa) > (fb) && !IsFloatZero((fa) - (fb)))\n#define IsFloatSmaller(fa,fb)\t\t\t\t((fa) < (fb) && !IsFloatZero((fa) - (fb)))\n#define IsFloatEqual(fa,fb)\t\t\t\t\tIsFloatZero((fa)-(fb))\n\n/* ---------------------------- CPWL_EditCtrl ------------------------------ */\n\nCPWL_EditCtrl::CPWL_EditCtrl() :\n\tm_pEdit(NULL),\n\tm_pEditCaret(NULL),\n\tm_bMouseDown(FALSE),\n\tm_pEditNotify(NULL),\n\tm_nCharSet(DEFAULT_CHARSET),\n\tm_nCodePage(0)\n{\n\tm_pEdit = IFX_Edit::NewEdit();\n\tASSERT(m_pEdit != NULL);\n}\n\nCPWL_EditCtrl::~CPWL_EditCtrl()\n{\n\tIFX_Edit::DelEdit(m_pEdit);\n}\n\nvoid CPWL_EditCtrl::OnCreate(PWL_CREATEPARAM & cp)\n{\n\tcp.eCursorType = FXCT_VBEAM;\n}\n\nvoid CPWL_EditCtrl::OnCreated()\n{\n\tSetFontSize(this->GetCreationParam().fFontSize);\n\n\tm_pEdit->SetFontMap(this->GetFontMap());\n\tm_pEdit->SetNotify(this);\n\tm_pEdit->Initialize();\n}\n\nFX_BOOL CPWL_EditCtrl::IsWndHorV()\n{\n\tCPDF_Matrix mt = GetWindowMatrix();\n\tCPDF_Point point1(0,1);\n\tCPDF_Point point2(1,1);\n\n\tmt.Transform(point1.x, point1.y);\n\tmt.Transform(point2.x, point2.y);\n\n\treturn point2.y == point1.y;\n}\n\nvoid CPWL_EditCtrl::SetCursor()\n{\n\tif (IsValid()) \n\t{\n\t\tif (IFX_SystemHandler* pSH = GetSystemHandler())\n\t\t{\n\t\t\tif (IsWndHorV())\n\t\t\t\tpSH->SetCursor(FXCT_VBEAM);\n\t\t\telse\n\t\t\t\tpSH->SetCursor(FXCT_HBEAM);\n\t\t}\n\t}\n}\n\nvoid CPWL_EditCtrl::RePosChildWnd()\n{\n\tm_pEdit->SetPlateRect(GetClientRect());\n}\n\nvoid CPWL_EditCtrl::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)\n{\n\tCPWL_Wnd::OnNotify(pWnd,msg,wParam,lParam);\n\n\tswitch (msg)\n\t{\n\t\tcase PNM_SETSCROLLINFO:\n\t\t\tswitch (wParam)\n\t\t\t{\n\t\t\t\tcase SBT_VSCROLL:\n\t\t\t\t\tif (CPWL_Wnd * pChild = GetVScrollBar())\n\t\t\t\t\t{\n\t\t\t\t\t\tpChild->OnNotify(pWnd,PNM_SETSCROLLINFO,wParam,lParam);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase PNM_SETSCROLLPOS:\t\t\t\n\t\t\tswitch (wParam)\n\t\t\t{\n\t\t\t\tcase SBT_VSCROLL:\n\t\t\t\t\tif (CPWL_Wnd * pChild = GetVScrollBar())\n\t\t\t\t\t{\n\t\t\t\t\t\tpChild->OnNotify(pWnd,PNM_SETSCROLLPOS,wParam,lParam);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase PNM_SCROLLWINDOW:\n\t\t\t{\n\t\t\t\tFX_FLOAT fPos = *(FX_FLOAT*)lParam;\n\t\t\t\tswitch (wParam)\n\t\t\t\t{\n\t\t\t\t\tcase SBT_VSCROLL:\n\t\t\t\t\t\tm_pEdit->SetScrollPos(CPDF_Point(m_pEdit->GetScrollPos().x,fPos));\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase PNM_SETCARETINFO:\n\t\t\t{\n\t\t\t\tif (PWL_CARET_INFO * pCaretInfo = (PWL_CARET_INFO *)wParam)\n\t\t\t\t{\n\t\t\t\t\tthis->SetCaret(pCaretInfo->bVisible,\n\t\t\t\t\t\tpCaretInfo->ptHead,\n\t\t\t\t\t\tpCaretInfo->ptFoot);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t}\n}\n\nvoid CPWL_EditCtrl::CreateChildWnd(const PWL_CREATEPARAM & cp)\n{\n\tif (!IsReadOnly())\n\t\tCreateEditCaret(cp);\n}\n\nvoid CPWL_EditCtrl::CreateEditCaret(const PWL_CREATEPARAM & cp)\n{\n\tif (!m_pEditCaret)\n\t{\n\t\tm_pEditCaret = new CPWL_Caret;\t\n\t\tm_pEditCaret->SetInvalidRect(GetClientRect());\n\n\t\tPWL_CREATEPARAM\tecp = cp;\n\t\tecp.pParentWnd = this;\n\t\tecp.dwFlags = PWS_CHILD | PWS_NOREFRESHCLIP;\n\t\tecp.dwBorderWidth = 0;\n\t\tecp.nBorderStyle = PBS_SOLID;\n\t\tecp.rcRectWnd = CPDF_Rect(0,0,0,0);\n\n\t\tm_pEditCaret->Create(ecp);\n\t}\n}\n\nvoid CPWL_EditCtrl::SetFontSize(FX_FLOAT fFontSize)\n{\n\tm_pEdit->SetFontSize(fFontSize);\n}\n\nFX_FLOAT CPWL_EditCtrl::GetFontSize() const\n{\n\treturn m_pEdit->GetFontSize();\n}\n\nFX_BOOL CPWL_EditCtrl::OnKeyDown(FX_WORD nChar, FX_DWORD nFlag)\n{\n\tif (m_bMouseDown) return TRUE;\n\n\tFX_BOOL bRet = CPWL_Wnd::OnKeyDown(nChar,nFlag);\n\n\t//FILTER\n\tswitch (nChar)\n\t{\n\tdefault:\n\t\treturn FALSE;\n\tcase FWL_VKEY_Delete:\n\tcase FWL_VKEY_Up:\n\tcase FWL_VKEY_Down:\n\tcase FWL_VKEY_Left:\n\tcase FWL_VKEY_Right:\n\tcase FWL_VKEY_Home:\n\tcase FWL_VKEY_End:\n\tcase FWL_VKEY_Insert:\n\tcase 'C':\n\tcase 'V':\n\tcase 'X':\n\tcase 'A':\n\tcase 'Z':\n\tcase 'c':\n\tcase 'v':\n\tcase 'x':\n\tcase 'a':\n\tcase 'z':\n\t\tbreak;\n\t}\n\n\tif (nChar == FWL_VKEY_Delete)\n\t{\n\t\tif (m_pEdit->IsSelected())\n\t\t\tnChar = FWL_VKEY_Unknown;\n\t}\n\n\tswitch (nChar)\n\t{\n\t\tcase FWL_VKEY_Delete:\t\n\t\t\tDelete();\n\t\t\treturn TRUE;\n\t\tcase FWL_VKEY_Insert:\n\t\t\tif (IsSHIFTpressed(nFlag))\n\t\t\t\tPasteText();\n\t\t\treturn TRUE;\n\t\tcase FWL_VKEY_Up:\n\t\t\tm_pEdit->OnVK_UP(IsSHIFTpressed(nFlag),FALSE);\n\t\t\treturn TRUE;\n\t\tcase FWL_VKEY_Down:\n\t\t\tm_pEdit->OnVK_DOWN(IsSHIFTpressed(nFlag),FALSE);\n\t\t\treturn TRUE;\n\t\tcase FWL_VKEY_Left:\n\t\t\tm_pEdit->OnVK_LEFT(IsSHIFTpressed(nFlag),FALSE);\n\t\t\treturn TRUE;\n\t\tcase FWL_VKEY_Right:\n\t\t\tm_pEdit->OnVK_RIGHT(IsSHIFTpressed(nFlag),FALSE);\n\t\t\treturn TRUE;\n\t\tcase FWL_VKEY_Home:\n\t\t\tm_pEdit->OnVK_HOME(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));\n\t\t\treturn TRUE;\n\t\tcase FWL_VKEY_End:\n\t\t\tm_pEdit->OnVK_END(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));\n\t\t\treturn TRUE;\n\t\tcase FWL_VKEY_Unknown:\n\t\t\tif (!IsSHIFTpressed(nFlag))\n\t\t\t\tClear();\n\t\t\telse\n\t\t\t\tCutText();\n\t\t\treturn TRUE;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\t\n\treturn bRet;\n}\n\nFX_BOOL CPWL_EditCtrl::OnChar(FX_WORD nChar, FX_DWORD nFlag)\n{\n\tif (m_bMouseDown) return TRUE;\n\n\tCPWL_Wnd::OnChar(nChar,nFlag);\n\n\t//FILTER\n\tswitch (nChar)\n\t{\n\t\tcase 0x0A:\n\t\tcase 0x1B:\n\t\t\treturn FALSE;\t\t\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tFX_BOOL bCtrl = IsCTRLpressed(nFlag);\n\tFX_BOOL bAlt = IsALTpressed(nFlag);\n\tFX_BOOL bShift = IsSHIFTpressed(nFlag);\n\n\tFX_WORD word = nChar;\n\n\tif (bCtrl && !bAlt)\n\t{\n\t\tswitch (nChar)\n\t\t{\n\t\t\tcase 'C' - 'A' + 1:\n\t\t\t\tthis->CopyText();\n\t\t\t\treturn TRUE;\n\t\t\tcase 'V' - 'A' + 1:\n\t\t\t\tthis->PasteText();\n\t\t\t\treturn TRUE;\n\t\t\tcase 'X' - 'A' + 1:\n\t\t\t\tthis->CutText();\n\t\t\t\treturn TRUE;\n\t\t\tcase 'A' - 'A' + 1:\n\t\t\t\tthis->SelectAll();\n\t\t\t\treturn TRUE;\n\t\t\tcase 'Z' - 'A' + 1:\n\t\t\t\tif (bShift)\n\t\t\t\t\tRedo();\n\t\t\t\telse\n\t\t\t\t\tUndo();\n\t\t\t\treturn TRUE;\n\t\t\tdefault:\n\t\t\t\tif (nChar < 32)\n\t\t\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tif (IsReadOnly()) return TRUE;\n\n\tif (m_pEdit->IsSelected() && word ==  FWL_VKEY_Back)\n\t\tword = FWL_VKEY_Unknown;\n\n\tClear();\n\n\tswitch (word)\n\t{\n\tcase FWL_VKEY_Back:\n\t\tBackspace();\n\t\tbreak;\n\tcase FWL_VKEY_Return:\t\n\t\tInsertReturn();\n\t\tbreak;\n\tcase FWL_VKEY_Unknown:\n\t\tbreak;\n\tdefault:\n\t\tif (IsINSERTpressed(nFlag))\n\t\t\tDelete();\n\t\tInsertWord(word, this->GetCharSet());\n\t\tbreak;\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL CPWL_EditCtrl::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tCPWL_Wnd::OnLButtonDown(point,nFlag);\n\n\tif (ClientHitTest(point))\n\t{\t\t\n\t\tif (m_bMouseDown)\n\t\t\tthis->InvalidateRect();\n\n\t\tm_bMouseDown = TRUE;\t\t\n\t\tSetCapture();\n\n\t\tm_pEdit->OnMouseDown(point,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL CPWL_EditCtrl::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tCPWL_Wnd::OnLButtonUp(point,nFlag);\n\n\tif (m_bMouseDown)\n\t{\n\t\t//can receive keybord message\n\t\tif (ClientHitTest(point) && !this->IsFocused())\n\t\t\tSetFocus();\t\n\n\t\tReleaseCapture();\n\t\tm_bMouseDown = FALSE;\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL CPWL_EditCtrl::OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tCPWL_Wnd::OnMouseMove(point,nFlag);\n\n\tif (m_bMouseDown)\n\t\tm_pEdit->OnMouseMove(point,FALSE,FALSE);\n\n\treturn TRUE;\n}\n\nCPDF_Rect CPWL_EditCtrl::GetContentRect() const\n{\n\treturn m_pEdit->GetContentRect();\n}\n\nvoid CPWL_EditCtrl::SetEditCaret(FX_BOOL bVisible)\n{\n\tCPDF_Point ptHead(0,0),ptFoot(0,0);\n\n\tif (bVisible)\n\t{\n\t\tGetCaretInfo(ptHead,ptFoot);\n\t}\n\n\tCPVT_WordPlace wpTemp = m_pEdit->GetCaretWordPlace();\n\tthis->IOnSetCaret(bVisible,ptHead,ptFoot,wpTemp);\n}\n\nvoid CPWL_EditCtrl::GetCaretInfo(CPDF_Point & ptHead, CPDF_Point & ptFoot) const\n{\n\tif (IFX_Edit_Iterator * pIterator = m_pEdit->GetIterator())\n\t{\n\t\tpIterator->SetAt(m_pEdit->GetCaret());\n\t\tCPVT_Word word;\n\t\tCPVT_Line line;\n\t\tif (pIterator->GetWord(word))\n\t\t{\n\t\t\tptHead.x = word.ptWord.x + word.fWidth;\n\t\t\tptHead.y = word.ptWord.y + word.fAscent;\n\t\t\tptFoot.x = word.ptWord.x + word.fWidth;\n\t\t\tptFoot.y = word.ptWord.y + word.fDescent;\n\t\t}\n\t\telse if (pIterator->GetLine(line))\n\t\t{\t\t\t\t\n\t\t\tptHead.x = line.ptLine.x;\n\t\t\tptHead.y = line.ptLine.y + line.fLineAscent;\n\t\t\tptFoot.x = line.ptLine.x;\n\t\t\tptFoot.y = line.ptLine.y + line.fLineDescent;\n\t\t}\n\t}\n}\n\nvoid CPWL_EditCtrl::GetCaretPos(FX_INT32& x, FX_INT32& y) const\n{\n\tCPDF_Point ptHead(0,0), ptFoot(0,0);\n\n\tGetCaretInfo(ptHead,ptFoot);\n\n\tPWLtoWnd(ptHead, x, y);\n}\n\nvoid CPWL_EditCtrl::SetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & ptFoot)\n{\n\tif (m_pEditCaret)\n\t{\n\t\tif (!IsFocused() || m_pEdit->IsSelected())\n\t\t\tbVisible = FALSE;\n\n\t\tm_pEditCaret->SetCaret(bVisible, ptHead, ptFoot);\n\t}\n}\n\nFX_BOOL\tCPWL_EditCtrl::IsModified() const\n{\n\treturn m_pEdit->IsModified();\n}\n\nCFX_WideString CPWL_EditCtrl::GetText() const\n{\n\treturn m_pEdit->GetText();\n}\n\nvoid CPWL_EditCtrl::SetSel(FX_INT32 nStartChar,FX_INT32 nEndChar)\n{\n\tm_pEdit->SetSel(nStartChar, nEndChar);\n}\n\nvoid CPWL_EditCtrl::GetSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar ) const\n{\n\tm_pEdit->GetSel(nStartChar, nEndChar);\n}\n\nvoid CPWL_EditCtrl::Clear()\n{\n\tif (!IsReadOnly())\n\t\tm_pEdit->Clear();\n}\n\nvoid CPWL_EditCtrl::SelectAll()\n{\n\tm_pEdit->SelectAll();\n}\n\nvoid CPWL_EditCtrl::Paint()\n{\n\tif (m_pEdit)\n\t\tm_pEdit->Paint();\n}\n\nvoid CPWL_EditCtrl::EnableRefresh(FX_BOOL bRefresh)\n{\n\tif (m_pEdit)\n\t\tm_pEdit->EnableRefresh(bRefresh);\n}\n\nFX_INT32 CPWL_EditCtrl::GetCaret() const\n{\n\tif (m_pEdit)\n\t\treturn m_pEdit->GetCaret();\n\n\treturn -1;\n}\n\nvoid CPWL_EditCtrl::SetCaret(FX_INT32 nPos)\n{\n\tif (m_pEdit)\n\t\tm_pEdit->SetCaret(nPos);\n}\n\nFX_INT32 CPWL_EditCtrl::GetTotalWords() const\n{\n\tif (m_pEdit)\n\t\treturn m_pEdit->GetTotalWords();\n\n\treturn 0;\n}\n\nvoid CPWL_EditCtrl::SetScrollPos(const CPDF_Point& point)\n{\n\tif (m_pEdit)\n\t\tm_pEdit->SetScrollPos(point);\n}\n\nCPDF_Point CPWL_EditCtrl::GetScrollPos() const\n{\n\tif (m_pEdit)\n\t\treturn m_pEdit->GetScrollPos();\n\n\treturn CPDF_Point(0.0f, 0.0f);\n}\n\nCPDF_Font * CPWL_EditCtrl::GetCaretFont() const\n{\n\tFX_INT32 nFontIndex = 0;\n\n\tif (IFX_Edit_Iterator * pIterator = m_pEdit->GetIterator())\n\t{\n\t\tpIterator->SetAt(m_pEdit->GetCaret());\n\t\tCPVT_Word word;\n\t\tCPVT_Section section;\n\t\tif (pIterator->GetWord(word))\n\t\t{\n\t\t\tnFontIndex = word.nFontIndex;\n\t\t}\n\t\telse if (HasFlag(PES_RICH))\n\t\t{\n\t\t\tif (pIterator->GetSection(section))\n\t\t\t{\t\t\t\t\n\t\t\t\tnFontIndex = section.WordProps.nFontIndex;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (IFX_Edit_FontMap * pFontMap = GetFontMap())\n\t\treturn pFontMap->GetPDFFont(nFontIndex);\n\telse\n\t\treturn NULL;\n}\n\nFX_FLOAT CPWL_EditCtrl::GetCaretFontSize() const\n{\n\tFX_FLOAT fFontSize = GetFontSize();\n\n\tif (IFX_Edit_Iterator * pIterator = m_pEdit->GetIterator())\n\t{\n\t\tpIterator->SetAt(m_pEdit->GetCaret());\n\t\tCPVT_Word word;\n\t\tCPVT_Section section;\n\t\tif (pIterator->GetWord(word))\n\t\t{\n\t\t\tfFontSize = word.fFontSize;\n\t\t}\n\t\telse if (HasFlag(PES_RICH))\n\t\t{\n\t\t\tif (pIterator->GetSection(section))\n\t\t\t{\t\t\t\t\n\t\t\t\tfFontSize = section.WordProps.fFontSize;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fFontSize;\n}\n\nvoid CPWL_EditCtrl::SetText(FX_LPCWSTR csText)\n{\n\tm_pEdit->SetText(csText);\n}\n\nvoid CPWL_EditCtrl::CopyText()\n{\n}\n\nvoid CPWL_EditCtrl::PasteText()\n{\n}\n\nvoid CPWL_EditCtrl::CutText()\n{\n}\n\nvoid CPWL_EditCtrl::ShowVScrollBar(FX_BOOL bShow)\n{\n}\n\nvoid CPWL_EditCtrl::InsertText(FX_LPCWSTR csText)\n{\n\tif (!IsReadOnly())\n\t\tm_pEdit->InsertText(csText);\n}\n\nvoid CPWL_EditCtrl::InsertWord(FX_WORD word, FX_INT32 nCharset)\n{\n\tif (!IsReadOnly())\n\t\tm_pEdit->InsertWord(word, nCharset);\n}\n\nvoid CPWL_EditCtrl::InsertReturn()\n{\n\tif (!IsReadOnly())\n\t\tm_pEdit->InsertReturn();\n}\n\nvoid CPWL_EditCtrl::Delete()\n{\n\tif (!IsReadOnly())\n\t\tm_pEdit->Delete();\n}\n\nvoid CPWL_EditCtrl::Backspace()\n{\n\tif (!IsReadOnly())\n\t\tm_pEdit->Backspace();\n}\n\nFX_BOOL\tCPWL_EditCtrl::CanUndo() const\n{\n\treturn !IsReadOnly() && m_pEdit->CanUndo();\n}\n\nFX_BOOL\tCPWL_EditCtrl::CanRedo() const\n{\n\treturn !IsReadOnly() && m_pEdit->CanRedo();\n}\n\nvoid CPWL_EditCtrl::Redo()\n{\n\tif (CanRedo())\n\t\tm_pEdit->Redo();\n}\n\nvoid CPWL_EditCtrl::Undo()\n{\n\tif (CanUndo())\n\t\tm_pEdit->Undo();\n}\n\nvoid CPWL_EditCtrl::IOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax, \n\t\t\t\t\t\t\t\t\t\t\t\tFX_FLOAT fContentMin, FX_FLOAT fContentMax, \n\t\t\t\t\t\t\t\t\t\t\t\tFX_FLOAT fSmallStep, FX_FLOAT fBigStep)\n{\n\tPWL_SCROLL_INFO Info;\n\n\tInfo.fPlateWidth = fPlateMax - fPlateMin;\n\tInfo.fContentMin = fContentMin;\n\tInfo.fContentMax = fContentMax;\n\tInfo.fSmallStep = fSmallStep;\n\tInfo.fBigStep = fBigStep;\n\n\tthis->OnNotify(this,PNM_SETSCROLLINFO,SBT_VSCROLL,(FX_INTPTR)&Info);\n\n//\tPWL_TRACE(\"set scroll info:%f\\n\",fContentMax - fContentMin);\n\n\tif (IsFloatBigger(Info.fPlateWidth,Info.fContentMax-Info.fContentMin)\n\t\t|| IsFloatEqual(Info.fPlateWidth,Info.fContentMax-Info.fContentMin))\n\t{\n\t\tthis->ShowVScrollBar(FALSE);\t\t\n\t}\n\telse\n\t{\n\t\tthis->ShowVScrollBar(TRUE);\n\t}\n}\n\nvoid CPWL_EditCtrl::IOnSetScrollPosY(FX_FLOAT fy)\n{\n//\tPWL_TRACE(\"set scroll position:%f\\n\",fy);\n\tthis->OnNotify(this,PNM_SETSCROLLPOS,SBT_VSCROLL,(FX_INTPTR)&fy);\n}\n\nvoid CPWL_EditCtrl::IOnSetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & ptFoot, const CPVT_WordPlace& place)\n{\n\tPWL_CARET_INFO cInfo;\n\tcInfo.bVisible = bVisible;\n\tcInfo.ptHead = ptHead;\n\tcInfo.ptFoot = ptFoot;\n\n\tthis->OnNotify(this,PNM_SETCARETINFO,(FX_INTPTR)&cInfo,(FX_INTPTR)NULL);\n}\n\nvoid CPWL_EditCtrl::IOnCaretChange(const CPVT_SecProps & secProps, const CPVT_WordProps & wordProps)\n{\n}\n\nvoid CPWL_EditCtrl::IOnContentChange(const CPDF_Rect& rcContent)\n{\n\tif (this->IsValid())\n\t{\n\t\tif (m_pEditNotify)\n\t\t{\n\t\t\tm_pEditNotify->OnContentChange(rcContent);\n\t\t}\n\t}\n}\n\nvoid CPWL_EditCtrl::IOnInvalidateRect(CPDF_Rect * pRect)\n{\n\tthis->InvalidateRect(pRect);\n}\n\nFX_INT32 CPWL_EditCtrl::GetCharSet() const\n{\n\tif (m_nCharSet < 0)\n\t\treturn DEFAULT_CHARSET; \n\telse\n\t\treturn m_nCharSet;\n}\n\nvoid CPWL_EditCtrl::GetTextRange(const CPDF_Rect& rect, FX_INT32 & nStartChar, FX_INT32 & nEndChar) const\n{\n\tnStartChar = m_pEdit->WordPlaceToWordIndex(m_pEdit->SearchWordPlace(CPDF_Point(rect.left, rect.top)));\n\tnEndChar = m_pEdit->WordPlaceToWordIndex(m_pEdit->SearchWordPlace(CPDF_Point(rect.right, rect.bottom)));\n}\n\nCFX_WideString CPWL_EditCtrl::GetText(FX_INT32 & nStartChar, FX_INT32 & nEndChar) const\n{\n\tCPVT_WordPlace wpStart = m_pEdit->WordIndexToWordPlace(nStartChar);\n\tCPVT_WordPlace wpEnd = m_pEdit->WordIndexToWordPlace(nEndChar);\n\treturn m_pEdit->GetRangeText(CPVT_WordRange(wpStart, wpEnd));\n}\n\nvoid\tCPWL_EditCtrl::SetReadyToInput()\n{\n\tif (m_bMouseDown)\n\t{\n\t\tReleaseCapture();\n\t\tm_bMouseDown = FALSE;\n\t}\n}\n"
  },
  {
    "path": "fpdfsdk/src/pdfwindow/PWL_FontMap.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/pdfwindow/PDFWindow.h\"\n#include \"../../include/pdfwindow/PWL_Wnd.h\"\n#include \"../../include/pdfwindow/PWL_FontMap.h\"\n\n#define DEFAULT_FONT_NAME\t\t\t\"Helvetica\"\n\n/* ------------------------------ CPWL_FontMap ------------------------------ */\n\nCPWL_FontMap::CPWL_FontMap(IFX_SystemHandler* pSystemHandler) : \t\n\tm_pPDFDoc(NULL),\n\tm_pSystemHandler(pSystemHandler)\n{\n\tASSERT(m_pSystemHandler != NULL);\n}\n\nCPWL_FontMap::~CPWL_FontMap()\n{\n\tif (m_pPDFDoc)\n\t{\n\t\tdelete m_pPDFDoc;\n\t\tm_pPDFDoc = NULL;\n\t}\n\n\tEmpty();\n}\n\nvoid CPWL_FontMap::SetSystemHandler(IFX_SystemHandler* pSystemHandler)\n{\n\tm_pSystemHandler = pSystemHandler;\n}\n\nCPDF_Document* CPWL_FontMap::GetDocument()\n{\n\tif (!m_pPDFDoc)\n\t{\n\t\tif (CPDF_ModuleMgr::Get())\n\t\t{\n\t\t\tm_pPDFDoc = FX_NEW CPDF_Document;\n\t\t\tm_pPDFDoc->CreateNewDoc();\n\t\t}\n\t}\n\n\treturn m_pPDFDoc;\n}\n\nCPDF_Font* CPWL_FontMap::GetPDFFont(FX_INT32 nFontIndex)\n{\n\tif (nFontIndex >=0 && nFontIndex < m_aData.GetSize())\n\t{\n\t\tif (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex))\n\t\t{\n\t\t\treturn pData->pFont;\n\t\t}\n\t}\n\n\treturn NULL;\n}\n\nCFX_ByteString CPWL_FontMap::GetPDFFontAlias(FX_INT32 nFontIndex)\n{\n\tif (nFontIndex >=0 && nFontIndex < m_aData.GetSize())\n\t{\n\t\tif (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex))\n\t\t{\n\t\t\treturn pData->sFontName;\n\t\t}\n\t}\n\n\treturn \"\";\n}\n\nFX_BOOL CPWL_FontMap::KnowWord(FX_INT32 nFontIndex, FX_WORD word)\n{\n\tif (nFontIndex >=0 && nFontIndex < m_aData.GetSize())\n\t{\n\t\tif (m_aData.GetAt(nFontIndex))\n\t\t{\t\n\t\t\treturn CharCodeFromUnicode(nFontIndex, word) >= 0;\n\t\t}\n\t}\n\n\treturn FALSE;\n}\n\nFX_INT32 CPWL_FontMap::GetWordFontIndex(FX_WORD word, FX_INT32 nCharset, FX_INT32 nFontIndex)\n{\n\tif (nFontIndex > 0)\n\t{\n\t\tif (KnowWord(nFontIndex, word))\n\t\t\treturn nFontIndex;\n\t}\n\telse\n\t{\n\t\tif (const CPWL_FontMap_Data* pData = GetFontMapData(0))\n\t\t{\n\t\t\tif (nCharset == DEFAULT_CHARSET || \n\t\t\t\tpData->nCharset == SYMBOL_CHARSET || \n\t\t\t\tnCharset == pData->nCharset)\n\t\t\t{\n\t\t\t\tif (KnowWord(0, word))\n\t\t\t\t{\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tFX_INT32 nNewFontIndex = -1;\n\n\tnNewFontIndex = this->GetFontIndex(GetNativeFontName(nCharset), nCharset, TRUE);\n\tif (nNewFontIndex >= 0)\n\t{\n\t\tif (KnowWord(nNewFontIndex, word))\n\t\t\treturn nNewFontIndex;\n\t}\n\n\tnNewFontIndex = this->GetFontIndex(\"Arial Unicode MS\", DEFAULT_CHARSET, FALSE);\n\tif (nNewFontIndex >= 0)\n\t{\n\t\tif (KnowWord(nNewFontIndex, word))\n\t\treturn nNewFontIndex;\n\t}\n\n\treturn -1;\n}\n\nFX_INT32 CPWL_FontMap::CharCodeFromUnicode(FX_INT32 nFontIndex, FX_WORD word)\n{\n\tif (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex))\n\t{\n\t\tif (pData->pFont)\n\t\t{\n\t\t\tif (pData->pFont->IsUnicodeCompatible())\n\t\t\t{\n\t\t\t\tint nCharCode = pData->pFont->CharCodeFromUnicode(word);\n\t\t\t\tpData->pFont->GlyphFromCharCode(nCharCode);\n\t\t\t\treturn nCharCode;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (word < 0xFF)\n\t\t\t\t\treturn word;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn -1;\n}\n\nCFX_ByteString CPWL_FontMap::GetNativeFontName(FX_INT32 nCharset)\n{\n\t//searching native font is slow, so we must save time\n\tfor (FX_INT32 i=0,sz=m_aNativeFont.GetSize(); i<sz; i++)\n\t{\n\t\tif (CPWL_FontMap_Native* pData = m_aNativeFont.GetAt(i))\n\t\t{\n\t\t\tif (pData->nCharset == nCharset)\n\t\t\t\treturn pData->sFontName;\n\t\t}\n\t}\n\n\tCFX_ByteString sNew = GetNativeFont(nCharset);\n\n\tif (!sNew.IsEmpty())\n\t{\n\t\tCPWL_FontMap_Native* pNewData = new CPWL_FontMap_Native;\n\t\tpNewData->nCharset = nCharset;\n\t\tpNewData->sFontName = sNew;\n\n\t\tm_aNativeFont.Add(pNewData);\n\t}\n\n\treturn sNew;\n}\n\nvoid CPWL_FontMap::Empty()\n{\n\t{\n\t\tfor (FX_INT32 i=0, sz=m_aData.GetSize(); i<sz; i++)\n\t\t\tdelete m_aData.GetAt(i);\n\n\t\tm_aData.RemoveAll();\n\t}\n\t{\n\t\tfor (FX_INT32 i=0, sz=m_aNativeFont.GetSize(); i<sz; i++)\n\t\t\tdelete m_aNativeFont.GetAt(i);\n\n\t\tm_aNativeFont.RemoveAll();\n\t}\n}\n\nvoid CPWL_FontMap::Initial(FX_LPCSTR fontname)\n{\n\tCFX_ByteString sFontName = fontname;\n\n\tif (sFontName.IsEmpty())\n\t\tsFontName = DEFAULT_FONT_NAME;\n\n\tGetFontIndex(sFontName, ANSI_CHARSET, FALSE);\n\n\t//GetFontIndex(this->GetNativeFontName(nCharset), nCharset);\n}\n\t\n\n/*\nList of currently supported standard fonts:\nCourier, Courier-Bold, Courier-BoldOblique, Courier-Oblique\nHelvetica, Helvetica-Bold, Helvetica-BoldOblique, Helvetica-Oblique\nTimes-Roman, Times-Bold, Times-Italic, Times-BoldItalic\nSymbol, ZapfDingbats\n*/\n\nconst char* g_sDEStandardFontName[] = {\"Courier\", \"Courier-Bold\", \"Courier-BoldOblique\", \"Courier-Oblique\",\n\t\"Helvetica\", \"Helvetica-Bold\", \"Helvetica-BoldOblique\", \"Helvetica-Oblique\",\n\t\"Times-Roman\", \"Times-Bold\", \"Times-Italic\", \"Times-BoldItalic\",\n\t\"Symbol\", \"ZapfDingbats\"};\n\nFX_BOOL\tCPWL_FontMap::IsStandardFont(const CFX_ByteString& sFontName)\n{\n\tfor (FX_INT32 i=0; i<14; i++)\n\t{\n\t\tif (sFontName == g_sDEStandardFontName[i])\n\t\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\nFX_INT32 CPWL_FontMap::FindFont(const CFX_ByteString& sFontName, FX_INT32 nCharset)\n{\n\tfor (FX_INT32 i=0,sz=m_aData.GetSize(); i<sz; i++)\n\t{\n\t\tif (CPWL_FontMap_Data* pData = m_aData.GetAt(i))\n\t\t{\n\t\t\tif (nCharset == DEFAULT_CHARSET || nCharset == pData->nCharset)\n\t\t\t{\n\t\t\t\tif (sFontName.IsEmpty() || pData->sFontName == sFontName)\n\t\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn -1;\n}\n\nFX_INT32 CPWL_FontMap::GetFontIndex(const CFX_ByteString& sFontName, FX_INT32 nCharset, FX_BOOL bFind)\n{\n\tFX_INT32 nFontIndex = FindFont(EncodeFontAlias(sFontName, nCharset), nCharset);\n\tif (nFontIndex >= 0) return nFontIndex;\n\n//\tnFontIndex = FindFont(\"\", nCharset);\n//\tif (nFontIndex >= 0) return nFontIndex;\n\n\tCFX_ByteString sAlias;\n\tCPDF_Font* pFont = NULL;\n\n\tif (bFind)\n\t\tpFont = FindFontSameCharset(sAlias, nCharset);\n\n\tif (!pFont)\n\t{\n\t\tCFX_ByteString sTemp = sFontName;\n\t\tpFont = AddFontToDocument(GetDocument(), sTemp, nCharset);\n\n\t\t/*\n\t\tif (FindFont(sAlias))\n\t\t{\n\t\t\tsAlias = EncodeFontAlias(sTemp, nCharset);\n\t\t}\n\t\telse\n\t\t*/\n\t\t{\n\t\t\tsAlias = EncodeFontAlias(sTemp, nCharset);\n\t\t}\t\t\n\t}\n\n\tAddedFont(pFont, sAlias);\n\n\treturn AddFontData(pFont, sAlias, nCharset);\n}\n\nFX_INT32 CPWL_FontMap::GetPWLFontIndex(FX_WORD word, FX_INT32 nCharset)\n{\n\tFX_INT32 nFind = -1;\n\n\tfor (FX_INT32 i=0,sz=m_aData.GetSize(); i<sz; i++)\n\t{\n\t\tif (CPWL_FontMap_Data* pData = m_aData.GetAt(i))\n\t\t{\n\t\t\tif (pData->nCharset == nCharset)\n\t\t\t{\n\t\t\t\tnFind = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tCPDF_Font* pNewFont = GetPDFFont(nFind);\n\n\tif (!pNewFont) return -1;\n\n\t/*\n\tif (CPDF_Font* pFont = GetPDFFont(nFind))\n\t{\n\t\tPWLFont.AddWordToFontDict(pFontDict, word);\n\t}\n\t*/\n\n#ifdef FOXIT_CHROME_BUILD\n  CFX_ByteString sAlias = EncodeFontAlias(\"Arial_Chrome\", nCharset);\n#else\n\tCFX_ByteString sAlias = EncodeFontAlias(\"Arial_Foxit\", nCharset);\n#endif\n\tAddedFont(pNewFont, sAlias);\n\n\treturn AddFontData(pNewFont, sAlias, nCharset);\n}\n\nCPDF_Font* CPWL_FontMap::FindFontSameCharset(CFX_ByteString& sFontAlias, FX_INT32 nCharset)\n{\n\treturn NULL;\n}\n\nFX_INT32 CPWL_FontMap::AddFontData(CPDF_Font* pFont, const CFX_ByteString& sFontAlias, FX_INT32 nCharset)\n{\n\tCPWL_FontMap_Data* pNewData = new CPWL_FontMap_Data;\n\tpNewData->pFont = pFont;\n\tpNewData->sFontName = sFontAlias;\n\tpNewData->nCharset = nCharset;\n\n\tm_aData.Add(pNewData);\n\n\treturn m_aData.GetSize() -1;\n}\n\nvoid CPWL_FontMap::AddedFont(CPDF_Font* pFont, const CFX_ByteString& sFontAlias)\n{\n}\n\nCFX_ByteString CPWL_FontMap::GetFontName(FX_INT32 nFontIndex)\n{\n\tif (nFontIndex >=0 && nFontIndex < m_aData.GetSize())\n\t{\n\t\tif (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex))\n\t\t{\n\t\t\treturn pData->sFontName;\n\t\t}\n\t}\n\n\treturn \"\";\n}\n\nCFX_ByteString CPWL_FontMap::GetNativeFont(FX_INT32 nCharset)\n{\n\tCFX_ByteString sFontName;\n\n\tif (nCharset == DEFAULT_CHARSET)\n\t\tnCharset = GetNativeCharset();\n\n\tsFontName = GetDefaultFontByCharset(nCharset);\n\n\tif (m_pSystemHandler)\n\t{\n\t\tif (m_pSystemHandler->FindNativeTrueTypeFont(nCharset, sFontName))\n\t\t\treturn sFontName;\n\n\t\tsFontName = m_pSystemHandler->GetNativeTrueTypeFont(nCharset);\n\t}\n\n\treturn sFontName;\n}\n\nCPDF_Font* CPWL_FontMap::AddFontToDocument(CPDF_Document* pDoc, CFX_ByteString& sFontName, FX_BYTE nCharset)\n{\n\tif (IsStandardFont(sFontName))\n\t\treturn AddStandardFont(pDoc, sFontName);\n\telse\n\t\treturn AddSystemFont(pDoc, sFontName, nCharset);\n}\n\nCPDF_Font* CPWL_FontMap::AddStandardFont(CPDF_Document* pDoc, CFX_ByteString& sFontName)\n{\n\tif (!pDoc) return NULL;\n\n\tCPDF_Font* pFont = NULL;\n\n\tif (sFontName == \"ZapfDingbats\")\n\t\tpFont = pDoc->AddStandardFont(sFontName, NULL);\n\telse\n\t{\n\t\tCPDF_FontEncoding fe(PDFFONT_ENCODING_WINANSI);\n\t\tpFont = pDoc->AddStandardFont(sFontName, &fe);\n\t}\n\n\treturn pFont;\n}\n\nCPDF_Font* CPWL_FontMap::AddSystemFont(CPDF_Document* pDoc, CFX_ByteString& sFontName, FX_BYTE nCharset)\n{\n\tif (!pDoc) return NULL;\n\n\tif (sFontName.IsEmpty()) sFontName = GetNativeFont(nCharset);\n\tif (nCharset == DEFAULT_CHARSET) nCharset = GetNativeCharset();\n\n\tif (m_pSystemHandler)\n\t\treturn m_pSystemHandler->AddNativeTrueTypeFontToPDF(pDoc, sFontName, nCharset);\n\t\n\treturn NULL;\n}\n\nCFX_ByteString CPWL_FontMap::EncodeFontAlias(const CFX_ByteString& sFontName, FX_INT32 nCharset)\n{\n\tCFX_ByteString sPostfix;\n\tsPostfix.Format(\"_%02X\", nCharset);\n\treturn EncodeFontAlias(sFontName) + sPostfix;\n}\n\nCFX_ByteString CPWL_FontMap::EncodeFontAlias(const CFX_ByteString& sFontName)\n{\n\tCFX_ByteString sRet = sFontName;\n\tsRet.Remove(' ');\n\treturn sRet;\n}\n\nFX_INT32 CPWL_FontMap::GetFontMapCount() const\n{\n\treturn m_aData.GetSize();\n}\n\nconst CPWL_FontMap_Data* CPWL_FontMap::GetFontMapData(FX_INT32 nIndex) const\n{\n\tif (nIndex >=0 && nIndex < m_aData.GetSize())\n\t{\n\t\treturn m_aData.GetAt(nIndex);\n\t}\n\n\treturn NULL;\n}\n\nFX_INT32 CPWL_FontMap::GetNativeCharset()\n{\n\tFX_BYTE nCharset = ANSI_CHARSET;\n\tFX_INT32 iCodePage = FXSYS_GetACP();\n\tswitch (iCodePage)\n\t{\n\tcase 932://Japan\n\t\tnCharset = SHIFTJIS_CHARSET;\n\t\tbreak;\n\tcase 936://Chinese (PRC, Singapore)\n\t\tnCharset = GB2312_CHARSET;\n\t\tbreak;\n\tcase 950://Chinese (Taiwan; Hong Kong SAR, PRC)\n\t\tnCharset = GB2312_CHARSET;\n\t\tbreak;\n\tcase 1252://Windows 3.1 Latin 1 (US, Western Europe)\n\t\tnCharset = ANSI_CHARSET;\n\t\tbreak;\n\tcase 874://Thai\n\t\tnCharset = THAI_CHARSET;\n\t\tbreak;\n\tcase 949://Korean\n\t\tnCharset = HANGUL_CHARSET;\n\t\tbreak;\n\tcase 1200://Unicode (BMP of ISO 10646)\n\t\tnCharset = ANSI_CHARSET;\n\t\tbreak;\n\tcase 1250://Windows 3.1 Eastern European\n\t\tnCharset = EASTEUROPE_CHARSET;\n\t\tbreak;\n\tcase 1251://Windows 3.1 Cyrillic\n\t\tnCharset = RUSSIAN_CHARSET;\n\t\tbreak;\n\tcase 1253://Windows 3.1 Greek\n\t\tnCharset = GREEK_CHARSET;\n\t\tbreak;\n\tcase 1254://Windows 3.1 Turkish\n\t\tnCharset = TURKISH_CHARSET;\n\t\tbreak;\n\tcase 1255://Hebrew\n\t\tnCharset = HEBREW_CHARSET;\n\t\tbreak;\n\tcase 1256://Arabic\n\t\tnCharset = ARABIC_CHARSET;\n\t\tbreak;\n\tcase 1257://Baltic\n\t\tnCharset = BALTIC_CHARSET;\n\t\tbreak;\n\tcase 1258://Vietnamese\n\t\tnCharset = VIETNAMESE_CHARSET;\n\t\tbreak;\n\tcase 1361://Korean(Johab)\n\t\tnCharset = JOHAB_CHARSET;\n\t\tbreak;\n\t}\n\treturn nCharset;\n}\n\nconst CPWL_FontMap::CharsetFontMap CPWL_FontMap::defaultTTFMap[] = {\n\t{ ANSI_CHARSET, \"Helvetica\" },\n\t{ GB2312_CHARSET, \"SimSun\" },\n\t{ CHINESEBIG5_CHARSET, \"MingLiU\" },\n\t{ SHIFTJIS_CHARSET, \"MS Gothic\" },\n\t{ HANGUL_CHARSET, \"Batang\" },\n\t{ RUSSIAN_CHARSET, \"Arial\" },\n#if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_\n\t{ EASTEUROPE_CHARSET, \"Arial\" },\n#else\n\t{ EASTEUROPE_CHARSET, \"Tahoma\" },\n#endif\n\t{ ARABIC_CHARSET, \"Arial\" },\n\t{ -1, NULL }\n};\n\nCFX_ByteString CPWL_FontMap::GetDefaultFontByCharset(FX_INT32 nCharset)\n{\n\tint i = 0;\n\twhile (defaultTTFMap[i].charset != -1) {\n\t\tif (nCharset == defaultTTFMap[i].charset)\n\t\t\treturn defaultTTFMap[i].fontname;\n        ++i;\n\t}\n\treturn \"\";\n}\n\nFX_INT32 CPWL_FontMap::CharSetFromUnicode(FX_WORD word, FX_INT32 nOldCharset)\n{\n\tif(m_pSystemHandler && (-1 != m_pSystemHandler->GetCharSet()))\n\t\treturn m_pSystemHandler->GetCharSet();\n\t//to avoid CJK Font to show ASCII\n\tif (word < 0x7F) return ANSI_CHARSET;\n\t//follow the old charset\n\tif (nOldCharset != DEFAULT_CHARSET) return nOldCharset;\n\n\t//find new charset\n\tif ((word >= 0x4E00 && word <= 0x9FA5) || \n\t\t(word >= 0xE7C7 && word <= 0xE7F3) ||\n\t\t(word >= 0x3000 && word <= 0x303F) || //\"\" \"\" \"\" \"\" \n\t\t(word >= 0x2000 && word <= 0x206F))\n\t{\n\t\treturn GB2312_CHARSET;\n\t}\n\n\tif (((word >= 0x3040) && (word <= 0x309F)) ||\n\t\t((word >= 0x30A0) && (word <= 0x30FF)) ||\n\t\t((word >= 0x31F0) && (word <= 0x31FF)) ||\n\t\t((word >= 0xFF00) && (word <= 0xFFEF)) )\n\t{\n\t\treturn SHIFTJIS_CHARSET;\n\t}\n\n\tif (((word >= 0xAC00) && (word <= 0xD7AF)) ||\n\t\t((word >= 0x1100) && (word <= 0x11FF)) ||\n\t\t((word >= 0x3130) && (word <= 0x318F)))\n\t{\n\t\treturn HANGUL_CHARSET;\n\t}\n\n\tif (word >= 0x0E00 && word <= 0x0E7F)\n\t\treturn THAI_CHARSET;\n\n\tif ((word >= 0x0370 && word <= 0x03FF) ||\n\t\t(word >= 0x1F00 && word <= 0x1FFF))\n\t\treturn GREEK_CHARSET;\n\n\tif ((word >= 0x0600 && word <= 0x06FF) ||\n\t\t(word >= 0xFB50 && word <= 0xFEFC))\n\t\treturn ARABIC_CHARSET;\n\n\tif (word >= 0x0590 && word <= 0x05FF)\n\t\treturn HEBREW_CHARSET;\n\n\tif (word >= 0x0400 && word <= 0x04FF)\n\t\treturn RUSSIAN_CHARSET;\n\n\tif (word >= 0x0100 && word <= 0x024F)\n\t\treturn EASTEUROPE_CHARSET;\n\n\tif (word >= 0x1E00 && word <= 0x1EFF)\n\t\treturn VIETNAMESE_CHARSET;\n\n\treturn ANSI_CHARSET;\n}\n\n/* ------------------------ CPWL_DocFontMap ------------------------ */\n\nCPWL_DocFontMap::CPWL_DocFontMap(IFX_SystemHandler* pSystemHandler, CPDF_Document* pAttachedDoc) \n\t: CPWL_FontMap(pSystemHandler),\n\tm_pAttachedDoc(pAttachedDoc)\n{\n}\n\nCPWL_DocFontMap::~CPWL_DocFontMap()\n{\n}\n\nCPDF_Document* CPWL_DocFontMap::GetDocument()\n{\n\treturn m_pAttachedDoc;\n}\n"
  },
  {
    "path": "fpdfsdk/src/pdfwindow/PWL_Icon.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/pdfwindow/PDFWindow.h\"\n#include \"../../include/pdfwindow/PWL_Wnd.h\"\n#include \"../../include/pdfwindow/PWL_Icon.h\"\n#include \"../../include/pdfwindow/PWL_Utils.h\"\n\n/* ------------------------------- CPWL_Image ---------------------------------- */\n\nCPWL_Image::CPWL_Image() : m_pPDFStream(NULL)\n{\n}\n\nCPWL_Image::~CPWL_Image()\n{\n}\n\nCFX_ByteString CPWL_Image::GetImageAppStream()\n{\n\tCFX_ByteTextBuf sAppStream;\n\n\tCFX_ByteString sAlias = this->GetImageAlias();\n\tCPDF_Rect rcPlate = GetClientRect();\n\tCPDF_Matrix mt;\n\tmt.SetReverse(GetImageMatrix());\n\n\tFX_FLOAT fHScale = 1.0f;\n\tFX_FLOAT fVScale = 1.0f;\n\tGetScale(fHScale,fVScale);\n\n\tFX_FLOAT fx = 0.0f;\n\tFX_FLOAT fy = 0.0f;\n\tGetImageOffset(fx,fy);\n\n\tif (m_pPDFStream && sAlias.GetLength()>0)\n\t{\n\t\tsAppStream << \"q\\n\";\n\t\tsAppStream << rcPlate.left << \" \" << rcPlate.bottom << \" \"\n\t\t\t<< rcPlate.right - rcPlate.left << \" \" << rcPlate.top - rcPlate.bottom << \" re W n\\n\";\n\n\t\tsAppStream << fHScale << \" 0 0 \" << fVScale << \" \" << rcPlate.left + fx << \" \" << rcPlate.bottom + fy << \" cm\\n\";\n\t\tsAppStream << mt.GetA() << \" \" << mt.GetB() << \" \" << mt.GetC() << \" \" << mt.GetD() << \" \" << mt.GetE() << \" \" << mt.GetF() << \" cm\\n\";\n\n\t\tsAppStream << \"0 g 0 G 1 w /\" << sAlias << \" Do\\n\" << \"Q\\n\";\n\t}\n\n\treturn sAppStream.GetByteString();\n}\n\nvoid CPWL_Image::SetPDFStream(CPDF_Stream * pStream)\n{\n\tm_pPDFStream = pStream;\n}\n\nCPDF_Stream * CPWL_Image::GetPDFStream()\n{\n\treturn this->m_pPDFStream;\n}\n\nvoid CPWL_Image::GetImageSize(FX_FLOAT & fWidth,FX_FLOAT & fHeight)\n{\n\tfWidth = 0.0f;\n\tfHeight = 0.0f;\n\n\tif (m_pPDFStream)\n\t{\n\t\tif (CPDF_Dictionary * pDict = m_pPDFStream->GetDict())\n\t\t{\n\t\t\tCPDF_Rect rect = pDict->GetRect(\"BBox\");\n\n\t\t\tfWidth = rect.right - rect.left;\n\t\t\tfHeight = rect.top - rect.bottom;\n\t\t}\n\t}\n}\n\nCPDF_Matrix\tCPWL_Image::GetImageMatrix()\n{\n\tif (m_pPDFStream)\n\t{\n\t\tif (CPDF_Dictionary * pDict = m_pPDFStream->GetDict())\n\t\t{\n\t\t\treturn pDict->GetMatrix(\"Matrix\");\n\t\t}\n\t}\n\n\treturn CPDF_Matrix();\n}\n\nCFX_ByteString CPWL_Image::GetImageAlias()\n{\n\tif (m_sImageAlias.IsEmpty())\n\t{\n\t\tif (m_pPDFStream)\n\t\t{\n\t\t\tif (CPDF_Dictionary * pDict = m_pPDFStream->GetDict())\t\t\n\t\t\t{\n\t\t\t\treturn pDict->GetString(\"Name\");\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t\treturn m_sImageAlias;\n\n\treturn CFX_ByteString();\n}\n\nvoid CPWL_Image::SetImageAlias(FX_LPCSTR sImageAlias)\n{\n\tm_sImageAlias = sImageAlias;\n}\n\nvoid CPWL_Image::GetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale)\n{\n\tfHScale = 1.0f;\n\tfVScale = 1.0f;\n}\n\n\nvoid CPWL_Image::GetImageOffset(FX_FLOAT & x,FX_FLOAT & y)\n{\n\tx = 0.0f;\n\ty = 0.0f;\n}\n\n/* ------------------------------- CPWL_Icon ---------------------------------- */\n\nCPWL_Icon::CPWL_Icon() : m_pIconFit(NULL)\n{\n}\n\nCPWL_Icon::~CPWL_Icon()\n{\n}\n\nFX_INT32 CPWL_Icon::GetScaleMethod()\n{\n\tif (m_pIconFit)\n\t\treturn m_pIconFit->GetScaleMethod();\n\n\treturn 0;\n}\n\nFX_BOOL\tCPWL_Icon::IsProportionalScale()\n{\n\tif (m_pIconFit)\n\t\treturn m_pIconFit->IsProportionalScale();\n\n\treturn FALSE;\n}\n\nvoid CPWL_Icon::GetIconPosition(FX_FLOAT & fLeft, FX_FLOAT & fBottom)\n{\n\tif (m_pIconFit)\n\t{\n\t\t//m_pIconFit->GetIconPosition(fLeft,fBottom);\n\t\tfLeft = 0.0f;\n\t\tfBottom = 0.0f;\n\t\tCPDF_Array* pA = m_pIconFit->m_pDict ? m_pIconFit->m_pDict->GetArray(\"A\") : NULL;\n\t\tif (pA != NULL)\n\t\t{\n\t\t\tFX_DWORD dwCount = pA->GetCount();\n\t\t\tif (dwCount > 0) fLeft = pA->GetNumber(0);\n\t\t\tif (dwCount > 1) fBottom = pA->GetNumber(1);\n\t\t}\n\t}\n\telse\n\t{\n\t\tfLeft = 0.0f;\n\t\tfBottom = 0.0f;\n\t}\n}\n\nFX_BOOL CPWL_Icon::GetFittingBounds()\n{\n\tif (m_pIconFit)\n\t\treturn m_pIconFit->GetFittingBounds();\n\n\treturn FALSE;\n}\n\nvoid CPWL_Icon::GetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale)\n{\n\tfHScale = 1.0f;\n\tfVScale = 1.0f;\n\t\n\tif (m_pPDFStream)\n\t{\n\t\tFX_FLOAT fImageWidth,fImageHeight;\n\t\tFX_FLOAT fPlateWidth,fPlateHeight;\n\n\t\tCPDF_Rect rcPlate = this->GetClientRect();\t\n\t\tfPlateWidth = rcPlate.right - rcPlate.left;\n\t\tfPlateHeight = rcPlate.top - rcPlate.bottom;\n\n\t\tGetImageSize(fImageWidth,fImageHeight);\n\n\t\tFX_INT32 nScaleMethod = this->GetScaleMethod();\n\n\t\t/*\n\t\tenum ScaleMethod\n\t\t{\n\t\t\tAlways = 0,\t//A, Always scale\n\t\t\tBigger,\t\t//B, Scale only when the icon is bigger than the annotation rectangle\n\t\t\tSmaller,\t//S, Scale only when the icon is smaller then the annotation rectangle\n\t\t\tNever\t\t//N, Never scale\n\t\t};\n\t\t*/\n\n\t\tswitch (nScaleMethod)\n\t\t{\n\t\tdefault:\n\t\tcase 0:\n\t\t\tfHScale = fPlateWidth / PWL_MAX(fImageWidth,1.0f);\n\t\t\tfVScale = fPlateHeight / PWL_MAX(fImageHeight,1.0f);\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tif (fPlateWidth < fImageWidth)\n\t\t\t\tfHScale = fPlateWidth / PWL_MAX(fImageWidth,1.0f);\n\t\t\tif (fPlateHeight < fImageHeight)\n\t\t\t\tfVScale = fPlateHeight / PWL_MAX(fImageHeight,1.0f);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tif (fPlateWidth > fImageWidth)\n\t\t\t\tfHScale = fPlateWidth / PWL_MAX(fImageWidth,1.0f);\n\t\t\tif (fPlateHeight > fImageHeight)\n\t\t\t\tfVScale = fPlateHeight / PWL_MAX(fImageHeight,1.0f);\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tbreak;\n\t\t}\n\n\t\tFX_FLOAT fMinScale;\n\t\tif (IsProportionalScale())\n\t\t{\n\t\t\tfMinScale = PWL_MIN(fHScale,fVScale);\n\t\t\tfHScale = fMinScale;\n\t\t\tfVScale = fMinScale;\n\t\t}\n\t}\n}\n\nvoid CPWL_Icon::GetImageOffset(FX_FLOAT & x,FX_FLOAT & y)\n{\n\tFX_FLOAT fLeft,fBottom;\n\n\tthis->GetIconPosition(fLeft,fBottom);\n\tx = 0.0f;\n\ty = 0.0f;\n\n\tFX_FLOAT fImageWidth,fImageHeight;\n\tGetImageSize(fImageWidth,fImageHeight);\n\n\tFX_FLOAT fHScale,fVScale;\n\tGetScale(fHScale,fVScale);\n\n\tFX_FLOAT fImageFactWidth = fImageWidth * fHScale;\n\tFX_FLOAT fImageFactHeight = fImageHeight * fVScale;\n\n\tFX_FLOAT fPlateWidth,fPlateHeight;\n\tCPDF_Rect rcPlate = this->GetClientRect();\t\n\tfPlateWidth = rcPlate.right - rcPlate.left;\n\tfPlateHeight = rcPlate.top - rcPlate.bottom;\n\n\tx = (fPlateWidth - fImageFactWidth) * fLeft;\n\ty = (fPlateHeight - fImageFactHeight)  * fBottom;\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/pdfwindow/PWL_IconList.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/pdfwindow/PDFWindow.h\"\n#include \"../../include/pdfwindow/PWL_Wnd.h\"\n#include \"../../include/pdfwindow/PWL_ListCtrl.h\"\n#include \"../../include/pdfwindow/PWL_IconList.h\"\n#include \"../../include/pdfwindow/PWL_Utils.h\"\n#include \"../../include/pdfwindow/PWL_ScrollBar.h\"\n#include \"../../include/pdfwindow/PWL_Label.h\"\n\n#define PWL_IconList_ITEM_ICON_LEFTMARGIN\t\t10.0f\n#define PWL_IconList_ITEM_WIDTH\t\t\t\t\t20.0f\n#define PWL_IconList_ITEM_HEIGHT\t\t\t\t20.0f\n#define PWL_IconList_ITEM_SPACE\t\t\t\t\t4.0f\n\n/* ------------------ CPWL_IconList_Item ------------------- */\n\nCPWL_IconList_Item::CPWL_IconList_Item() : \n\tm_nIconIndex(-1), \n\tm_pData(NULL),\n\tm_bSelected(FALSE),\n\tm_pText(NULL)\n{\n}\n\nCPWL_IconList_Item::~CPWL_IconList_Item()\n{\n}\n\nCFX_ByteString CPWL_IconList_Item::GetClassName() const\n{\n\treturn \"CPWL_IconList_Item\";\n}\n\nFX_FLOAT CPWL_IconList_Item::GetItemHeight(FX_FLOAT fLimitWidth)\n{\n\treturn PWL_IconList_ITEM_HEIGHT;\n}\n\nvoid CPWL_IconList_Item::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)\n{\n\tCPDF_Rect rcClient = GetClientRect();\n\n\tif (m_bSelected)\n\t{\n\t\tif (this->IsEnabled())\n\t\t{\n\t\t\tCPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcClient, \n\t\t\t\tCPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_SELBACKCOLOR,this->GetTransparency()));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tCPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcClient, \n\t\t\t\tCPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_LIGHTGRAYCOLOR,this->GetTransparency()));\n\t\t}\n\t}\n\n\tCPDF_Rect rcIcon = rcClient;\n\trcIcon.left += PWL_IconList_ITEM_ICON_LEFTMARGIN;\n\trcIcon.right = rcIcon.left + PWL_IconList_ITEM_WIDTH;\n\n\tCPWL_Utils::DrawIconAppStream(pDevice, pUser2Device, m_nIconIndex, rcIcon, \n\t\tm_crIcon, m_pText->GetTextColor(), this->GetTransparency());\n}\n\nvoid CPWL_IconList_Item::SetSelect(FX_BOOL bSelected)\n{\n\tm_bSelected = bSelected;\n\n\tif (bSelected)\n\t\tm_pText->SetTextColor(PWL_DEFAULT_WHITECOLOR);\n\telse\n\t\tm_pText->SetTextColor(PWL_DEFAULT_BLACKCOLOR);\n\n}\n\nFX_BOOL\tCPWL_IconList_Item::IsSelected() const\n{\n\treturn m_bSelected;\n}\n\nvoid CPWL_IconList_Item::CreateChildWnd(const PWL_CREATEPARAM & cp)\n{\n\tm_pText = new CPWL_Label;\n\n\tPWL_CREATEPARAM lcp = cp;\n\tlcp.pParentWnd = this;\n\tlcp.dwFlags = PWS_CHILD | PWS_VISIBLE | PES_LEFT | PES_CENTER;\n\tlcp.sTextColor = PWL_DEFAULT_BLACKCOLOR;\n\tlcp.fFontSize = 12;\n\tm_pText->Create(lcp);\n}\n\nvoid CPWL_IconList_Item::SetData(void* pData)\n{\n\tm_pData = pData;\n}\n\nvoid CPWL_IconList_Item::SetIcon(FX_INT32 nIconIndex)\n{\n\tm_nIconIndex = nIconIndex;\n}\n\nvoid CPWL_IconList_Item::SetText(const CFX_WideString& str)\n{\n\tm_pText->SetText(str);\n}\n\nCFX_WideString CPWL_IconList_Item::GetText() const\n{\n\treturn m_pText->GetText();\n}\n\nvoid CPWL_IconList_Item::RePosChildWnd()\n{\n\tCPDF_Rect rcClient = GetClientRect();\n\n\trcClient.left += (PWL_IconList_ITEM_ICON_LEFTMARGIN + PWL_IconList_ITEM_WIDTH + PWL_IconList_ITEM_ICON_LEFTMARGIN);\n\n\tm_pText->Move(rcClient, TRUE, FALSE);\n}\n\nvoid CPWL_IconList_Item::SetIconFillColor(const CPWL_Color& color)\n{\n\tm_crIcon = color;\n}\n\nvoid CPWL_IconList_Item::OnEnabled()\n{\n\tif (m_bSelected)\n\t\tm_pText->SetTextColor(PWL_DEFAULT_WHITECOLOR);\n\telse\n\t\tm_pText->SetTextColor(PWL_DEFAULT_BLACKCOLOR);\n\n\tthis->InvalidateRect();\n}\n\nvoid CPWL_IconList_Item::OnDisabled()\n{\n\tm_pText->SetTextColor(PWL_DEFAULT_HEAVYGRAYCOLOR);\n\n\tthis->InvalidateRect();\n}\n\n/* ----------------- CPWL_IconList_Content ----------------- */\n\nCPWL_IconList_Content::CPWL_IconList_Content(FX_INT32 nListCount) : \n\tm_nSelectIndex(-1),\n\tm_pNotify(NULL),\n\tm_bEnableNotify(TRUE),\n\tm_bMouseDown(FALSE),\n\tm_nListCount(nListCount)\n{\n}\n\nCPWL_IconList_Content::~CPWL_IconList_Content()\n{\n}\n\nvoid CPWL_IconList_Content::CreateChildWnd(const PWL_CREATEPARAM & cp)\n{\n\tfor (FX_INT32 i=0; i<m_nListCount; i++)\n\t{\n\t\tCPWL_IconList_Item* pNewItem = new CPWL_IconList_Item();\n\n\t\tPWL_CREATEPARAM icp = cp;\n\t\ticp.pParentWnd = this;\n\t\ticp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_NOREFRESHCLIP;\n\t\tpNewItem->Create(icp);\n\t}\n\n\tthis->SetItemSpace(PWL_IconList_ITEM_SPACE);\n\tthis->ResetContent(0);\n\n\tif (CPWL_Wnd * pParent = this->GetParentWindow())\n\t{\n\t\tCPDF_Rect rcScroll = this->GetScrollArea();\n\t\tthis->GetScrollPos();\n\n\t\tPWL_SCROLL_INFO sInfo;\n\t\tsInfo.fContentMin = rcScroll.bottom;\n\t\tsInfo.fContentMax = rcScroll.top;\n\t\tsInfo.fPlateWidth = GetClientRect().Height();\n\t\tsInfo.fSmallStep = 13.0f;\n\t\tsInfo.fBigStep = sInfo.fPlateWidth;\n\n\t\tpParent->OnNotify(this, PNM_SETSCROLLINFO, SBT_VSCROLL, (FX_INTPTR)&sInfo);\n\t}\n}\n\nFX_BOOL\tCPWL_IconList_Content::OnLButtonDown(const CPDF_Point & point)\n{\n\tSetFocus();\n\n\tSetCapture();\n\tm_bMouseDown = TRUE;\n\n\tFX_INT32 nItemIndex = FindItemIndex(point);\n\tSetSelect(nItemIndex);\n\tScrollToItem(nItemIndex);\n\n\treturn TRUE;\n}\n\nFX_BOOL\tCPWL_IconList_Content::OnLButtonUp(const CPDF_Point & point)\n{\n\tm_bMouseDown = FALSE;\n\tReleaseCapture();\n\n\treturn TRUE;\n}\n\nFX_BOOL CPWL_IconList_Content::OnMouseMove(const CPDF_Point & point)\n{\n\tif (m_bMouseDown)\n\t{\n\t\tFX_INT32 nItemIndex = FindItemIndex(point);\n\t\tSetSelect(nItemIndex);\n\t\tScrollToItem(nItemIndex);\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL\tCPWL_IconList_Content::OnKeyDown(FX_WORD nChar)\n{\n\tswitch (nChar)\n\t{\n\tcase FWL_VKEY_Up:\n\t\tif (m_nSelectIndex > 0)\n\t\t{\n\t\t\tFX_INT32 nItemIndex = m_nSelectIndex - 1;\n\t\t\tSetSelect(nItemIndex);\n\t\t\tScrollToItem(nItemIndex);\n\t\t}\n\t\treturn TRUE;\n\tcase FWL_VKEY_Down:\n\t\tif (m_nSelectIndex < m_nListCount-1)\n\t\t{\n\t\t\tFX_INT32 nItemIndex = m_nSelectIndex + 1;\n\t\t\tSetSelect(nItemIndex);\n\t\t\tScrollToItem(nItemIndex);\n\t\t}\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\nFX_INT32 CPWL_IconList_Content::FindItemIndex(const CPDF_Point& point)\n{\n\tFX_INT32 nIndex = 0;\n\tfor (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\n\t{\n\t\tif (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\n\t\t{\n\t\t\tCPDF_Rect rcWnd = pChild->ChildToParent(pChild->GetWindowRect());\n\n\t\t\tif (point.y < rcWnd.top)\n\t\t\t{\n\t\t\t\tnIndex = i;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nIndex;\n}\n\nvoid CPWL_IconList_Content::ScrollToItem(FX_INT32 nItemIndex)\n{\n\tCPDF_Rect rcClient = GetClientRect();\n\n\tif (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))\n\t{\n\t\tCPDF_Rect rcOrigin = pItem->GetWindowRect();\n\t\tCPDF_Rect rcWnd = pItem->ChildToParent(rcOrigin);\n\n\t\tif (!(rcWnd.bottom > rcClient.bottom && rcWnd.top < rcClient.top))\n\t\t{\n\t\t\tCPDF_Point ptScroll = GetScrollPos();\n\n\t\t\tif (rcWnd.top > rcClient.top)\n\t\t\t{\n\t\t\t\tptScroll.y = rcOrigin.top;\n\t\t\t}\n\t\t\telse if (rcWnd.bottom < rcClient.bottom)\n\t\t\t{\n\t\t\t\tptScroll.y = rcOrigin.bottom + rcClient.Height();\t\t\t\t\t\n\t\t\t}\n\n\t\t\tthis->SetScrollPos(ptScroll);\n\t\t\tthis->ResetFace();\n\t\t\tthis->InvalidateRect();\n\t\t\tif (CPWL_Wnd* pParent = this->GetParentWindow())\n\t\t\t{\n\t\t\t\tpParent->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptScroll.y);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid CPWL_IconList_Content::SetSelect(FX_INT32 nIndex)\n{\n\tif (m_nSelectIndex != nIndex)\n\t{\n\t\tSelectItem(m_nSelectIndex, FALSE);\n\t\tSelectItem(nIndex, TRUE);\n\t\tm_nSelectIndex = nIndex;\n\n\t\tif (IPWL_IconList_Notify* pNotify = GetNotify())\n\t\t\tpNotify->OnNoteListSelChanged(nIndex);\n\t}\n}\n\nFX_INT32 CPWL_IconList_Content::GetSelect() const\n{\n\treturn m_nSelectIndex;\n}\n\nIPWL_IconList_Notify* CPWL_IconList_Content::GetNotify() const\n{\n\tif (m_bEnableNotify)\n\t\treturn m_pNotify;\n\treturn NULL;\n}\n\nvoid CPWL_IconList_Content::SetNotify(IPWL_IconList_Notify* pNotify)\n{\n\tm_pNotify = pNotify;\n}\n\nvoid CPWL_IconList_Content::EnableNotify(FX_BOOL bNotify)\n{\n\tm_bEnableNotify = bNotify;\n}\n\nvoid CPWL_IconList_Content::SelectItem(FX_INT32 nItemIndex, FX_BOOL bSelect)\n{\n\tif (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))\n\t{\n\t\tpItem->SetSelect(bSelect);\n\t\tpItem->InvalidateRect();\t\t\n\t}\n}\n\nCPWL_IconList_Item* CPWL_IconList_Content::GetListItem(FX_INT32 nItemIndex) const\n{\n\tif (nItemIndex >= 0 && nItemIndex<m_aChildren.GetSize())\n\t{\n\t\tif (CPWL_Wnd * pChild = m_aChildren.GetAt(nItemIndex))\n\t\t{\n\t\t\tif (pChild->GetClassName() == \"CPWL_IconList_Item\")\n\t\t\t{\n\t\t\t\treturn (CPWL_IconList_Item*)pChild;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn NULL;\n}\n\nvoid CPWL_IconList_Content::SetListData(FX_INT32 nItemIndex, void* pData)\n{\n\tif (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))\n\t\tpItem->SetData(pData);\n}\n\nvoid CPWL_IconList_Content::SetListIcon(FX_INT32 nItemIndex, FX_INT32 nIconIndex)\n{\n\tif (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))\n\t\tpItem->SetIcon(nIconIndex);\n}\n\nvoid CPWL_IconList_Content::SetListString(FX_INT32 nItemIndex, const CFX_WideString& str)\n{\n\tif (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))\n\t\tpItem->SetText(str);\n}\n\nCFX_WideString CPWL_IconList_Content::GetListString(FX_INT32 nItemIndex) const\n{\n\tif (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))\n\t\treturn pItem->GetText();\n\n\treturn L\"\";\n}\n\nvoid CPWL_IconList_Content::SetIconFillColor(const CPWL_Color& color)\n{\n\tfor (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\n\t{\n\t\tif (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\n\t\t{\n\t\t\tif (pChild->GetClassName() == \"CPWL_IconList_Item\")\n\t\t\t{\n\t\t\t\tCPWL_IconList_Item* pItem = (CPWL_IconList_Item*)pChild;\n\t\t\t\tpItem->SetIconFillColor(color);\n\t\t\t\tpItem->InvalidateRect();\n\t\t\t}\n\t\t}\n\t}\n\n}\n\n/* -------------------- CPWL_IconList --------------------- */\n\nCPWL_IconList::CPWL_IconList(FX_INT32 nListCount) : \n\tm_pListContent(NULL),\n\tm_nListCount(nListCount)\n{\n}\n\nCPWL_IconList::~CPWL_IconList()\n{\n}\n\nvoid CPWL_IconList::RePosChildWnd()\n{\n\tCPWL_Wnd::RePosChildWnd();\n\n\tif (m_pListContent)\n\t\tm_pListContent->Move(GetClientRect(), TRUE, FALSE);\n}\n\nvoid CPWL_IconList::CreateChildWnd(const PWL_CREATEPARAM & cp)\n{\n\tm_pListContent = new CPWL_IconList_Content(m_nListCount);\n\n\tPWL_CREATEPARAM ccp = cp;\n\tccp.pParentWnd = this;\n\tccp.dwFlags = PWS_CHILD | PWS_VISIBLE;\n\tm_pListContent->Create(ccp);\n}\n\nvoid CPWL_IconList::OnCreated()\n{\n\tif (CPWL_ScrollBar* pScrollBar = this->GetVScrollBar())\n\t{\n\t\tpScrollBar->RemoveFlag(PWS_AUTOTRANSPARENT);\n\t\tpScrollBar->SetTransparency(255);\n\t\tpScrollBar->SetNotifyForever(TRUE);\n\t}\n}\n\nvoid CPWL_IconList::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)\n{\n\tCPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam);\n\n\tif (wParam == SBT_VSCROLL)\n\t{\t\t\n\t\tswitch (msg)\n\t\t{\n\t\tcase PNM_SETSCROLLINFO:\n\t\t\tif (PWL_SCROLL_INFO* pInfo = (PWL_SCROLL_INFO*)lParam)\n\t\t\t{\n\t\t\t\tif (CPWL_ScrollBar* pScrollBar = this->GetVScrollBar())\n\t\t\t\t{\n\t\t\t\t\tif (pInfo->fContentMax - pInfo->fContentMin > pInfo->fPlateWidth)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!pScrollBar->IsVisible())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpScrollBar->SetVisible(TRUE);\n\t\t\t\t\t\t\tRePosChildWnd();\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pScrollBar->IsVisible())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpScrollBar->SetVisible(FALSE);\n\t\t\t\t\t\t\tRePosChildWnd();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (m_pListContent)\n\t\t\t\t\t\t\tm_pListContent->SetScrollPos(CPDF_Point(0.0f,0.0f));\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tpScrollBar->OnNotify(pWnd,PNM_SETSCROLLINFO,wParam,lParam);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\tcase PNM_SCROLLWINDOW:\n\t\t\tif (m_pListContent)\n\t\t\t{\n\t\t\t\tm_pListContent->SetScrollPos(CPDF_Point(0.0f, *(FX_FLOAT*)lParam));\n\t\t\t\tm_pListContent->ResetFace();\n\t\t\t\tm_pListContent->InvalidateRect(NULL);\n\t\t\t}\n\t\t\treturn;\n\t\tcase PNM_SETSCROLLPOS:\n\t\t\tif (CPWL_ScrollBar* pScrollBar = this->GetVScrollBar())\n\t\t\t\tpScrollBar->OnNotify(pWnd,PNM_SETSCROLLPOS,wParam,lParam);\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nvoid CPWL_IconList::SetSelect(FX_INT32 nIndex)\n{\n\tm_pListContent->SetSelect(nIndex);\n}\n\nvoid CPWL_IconList::SetTopItem(FX_INT32 nIndex)\n{\n\tm_pListContent->ScrollToItem(nIndex);\n}\n\nFX_INT32 CPWL_IconList::GetSelect() const\n{\n\treturn m_pListContent->GetSelect();\n}\n\nvoid CPWL_IconList::SetNotify(IPWL_IconList_Notify* pNotify)\n{\n\tm_pListContent->SetNotify(pNotify);\n}\n\nvoid CPWL_IconList::EnableNotify(FX_BOOL bNotify)\n{\n\tm_pListContent->EnableNotify(bNotify);\n}\n\nvoid CPWL_IconList::SetListData(FX_INT32 nItemIndex, void* pData)\n{\n\tm_pListContent->SetListData(nItemIndex, pData);\n}\n\nvoid CPWL_IconList::SetListIcon(FX_INT32 nItemIndex, FX_INT32 nIconIndex)\n{\n\tm_pListContent->SetListIcon(nItemIndex, nIconIndex);\n}\n\nvoid CPWL_IconList::SetListString(FX_INT32 nItemIndex, const CFX_WideString& str)\n{\n\tm_pListContent->SetListString(nItemIndex, str);\n}\n\nCFX_WideString CPWL_IconList::GetListString(FX_INT32 nItemIndex) const\n{\n\treturn m_pListContent->GetListString(nItemIndex);\n}\n\nvoid CPWL_IconList::SetIconFillColor(const CPWL_Color& color)\n{\n\tm_pListContent->SetIconFillColor(color);\n}\n\nFX_BOOL\tCPWL_IconList::OnMouseWheel(short zDelta, const CPDF_Point & point)\n{\n\tCPDF_Point ptScroll = m_pListContent->GetScrollPos();\n\tCPDF_Rect rcScroll = m_pListContent->GetScrollArea();\n\tCPDF_Rect rcContents = m_pListContent->GetClientRect();\n\n\tif (rcScroll.top - rcScroll.bottom > rcContents.Height())\n\t{\n\t\tCPDF_Point ptNew = ptScroll;\n\n\t\tif (zDelta > 0)\n\t\t\tptNew.y += 30;\n\t\telse\n\t\t\tptNew.y -= 30;\n\n\t\tif (ptNew.y > rcScroll.top)\n\t\t\tptNew.y = rcScroll.top;\n\t\tif (ptNew.y < rcScroll.bottom + rcContents.Height())\n\t\t\tptNew.y = rcScroll.bottom + rcContents.Height();\n\t\tif (ptNew.y < rcScroll.bottom)\n\t\t\tptNew.y = rcScroll.bottom;\n\n\t\tif (ptNew.y != ptScroll.y)\n\t\t{\n\t\t\tm_pListContent->SetScrollPos(ptNew);\n\t\t\tm_pListContent->ResetFace();\n\t\t\tm_pListContent->InvalidateRect(NULL);\n\t\t\t\n\t\t\tif (CPWL_ScrollBar* pScrollBar = this->GetVScrollBar())\n\t\t\t\tpScrollBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptNew.y);\n\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\treturn FALSE;\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/pdfwindow/PWL_Label.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/pdfwindow/PDFWindow.h\"\n#include \"../../include/pdfwindow/PWL_Wnd.h\"\n#include \"../../include/pdfwindow/PWL_Label.h\"\n#include \"../../include/pdfwindow/PWL_Utils.h\"\n\n/* ---------------------------- CPWL_Label ------------------------------ */\n\nCPWL_Label::CPWL_Label() : m_pEdit(NULL)\n{\n\tm_pEdit = IFX_Edit::NewEdit();\n\n\tASSERT(m_pEdit != NULL);\n}\n\nCPWL_Label::~CPWL_Label()\n{\n\tIFX_Edit::DelEdit(m_pEdit);\n}\n\nCFX_ByteString CPWL_Label::GetClassName() const\n{\n\treturn \"CPWL_Label\";\n}\n\nvoid CPWL_Label::OnCreated()\n{\n\tSetParamByFlag();\n\tSetFontSize(this->GetCreationParam().fFontSize);\n\n\tm_pEdit->SetFontMap(this->GetFontMap());\n\tm_pEdit->Initialize();\n\n\tif (HasFlag(PES_TEXTOVERFLOW))\n\t{\n\t\tSetClipRect(CPDF_Rect(0.0f,0.0f,0.0f,0.0f));\n\t\tm_pEdit->SetTextOverflow(TRUE);\n\t}\n}\n\nvoid CPWL_Label::SetText(FX_LPCWSTR csText)\n{\n\tm_pEdit->SetText(csText);\n}\n\nvoid CPWL_Label::RePosChildWnd()\n{\n\tm_pEdit->SetPlateRect(GetClientRect());\n}\n\nvoid CPWL_Label::SetFontSize(FX_FLOAT fFontSize)\n{\n\tm_pEdit->SetFontSize(fFontSize);\n}\n\nFX_FLOAT CPWL_Label::GetFontSize() const\n{\n\treturn m_pEdit->GetFontSize();\n}\n\nvoid CPWL_Label::SetParamByFlag()\n{\t\n\tif (HasFlag(PES_LEFT))\n\t{\n\t\tm_pEdit->SetAlignmentH(0);\n\t}\n\telse if (HasFlag(PES_MIDDLE))\n\t{\n\t\tm_pEdit->SetAlignmentH(1);\n\t}\n\telse if (HasFlag(PES_RIGHT))\n\t{\n\t\tm_pEdit->SetAlignmentH(2);\n\t}\n\telse\n\t{\n\t\tm_pEdit->SetAlignmentH(0);\n\t}\n\n\tif (HasFlag(PES_TOP))\n\t{\n\t\tm_pEdit->SetAlignmentV(0);\n\t}\n\telse if (HasFlag(PES_CENTER))\n\t{\n\t\tm_pEdit->SetAlignmentV(1);\n\t}\n\telse if (HasFlag(PES_BOTTOM))\n\t{\n\t\tm_pEdit->SetAlignmentV(2);\n\t}\n\telse\n\t{\n\t\tm_pEdit->SetAlignmentV(0);\n\t}\n\n\tif (HasFlag(PES_PASSWORD))\n\t{\n\t\tm_pEdit->SetPasswordChar('*');\n\t}\n\n\tm_pEdit->SetMultiLine(HasFlag(PES_MULTILINE));\n\tm_pEdit->SetAutoReturn(HasFlag(PES_AUTORETURN));\n\tm_pEdit->SetAutoFontSize(HasFlag(PWS_AUTOFONTSIZE));\n\tm_pEdit->SetAutoScroll(HasFlag(PES_AUTOSCROLL));\n}\n\nvoid CPWL_Label::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)\n{\n\tCPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);\n\n\tGetClientRect();\n\n\tCPDF_Rect rcClip;\n\tCPVT_WordRange wrRange = m_pEdit->GetVisibleWordRange();\n\tCPVT_WordRange* pRange = NULL;\n\n\tif (!HasFlag(PES_TEXTOVERFLOW))\n\t{\n\t\trcClip = GetClientRect();\n\t\tpRange = &wrRange;\n\t}\nIFX_SystemHandler* pSysHandler = GetSystemHandler();\n\tIFX_Edit::DrawEdit(pDevice, pUser2Device, m_pEdit,\n\t\tCPWL_Utils::PWLColorToFXColor(GetTextColor(), this->GetTransparency()),\n\t\tCPWL_Utils::PWLColorToFXColor(GetTextStrokeColor(), this->GetTransparency()),\n\t\trcClip, CPDF_Point(0.0f,0.0f), pRange,pSysHandler, NULL);\n}\n\nvoid CPWL_Label::SetHorzScale(FX_INT32 nHorzScale)\n{\n\tm_pEdit->SetHorzScale(nHorzScale);\n}\n\nvoid CPWL_Label::SetCharSpace(FX_FLOAT fCharSpace)\n{\n\tm_pEdit->SetCharSpace(fCharSpace);\n}\n\nCPDF_Rect CPWL_Label::GetContentRect() const\n{\n\treturn m_pEdit->GetContentRect();\n}\n\nvoid CPWL_Label::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)\n{\n\tCPWL_Wnd::GetThisAppearanceStream(sAppStream);\n\n\tsAppStream << GetTextAppearanceStream(CPDF_Point(0.0f, 0.0f));\n}\n\nCFX_ByteString CPWL_Label::GetTextAppearanceStream(const CPDF_Point & ptOffset) const\n{\n\tCFX_ByteTextBuf sRet;\n\tCFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(m_pEdit,ptOffset);\n\t\n\tif (sEdit.GetLength() > 0)\n\t{\n\t\tsRet << \"BT\\n\" << CPWL_Utils::GetColorAppStream(GetTextColor()) << sEdit << \"ET\\n\";\n\t}\n\n\treturn sRet.GetByteString();\n}\n\nCFX_WideString CPWL_Label::GetText() const\n{\n\treturn m_pEdit->GetText();\n}\n\nvoid CPWL_Label::SetLimitChar(FX_INT32 nLimitChar)\n{\n\tm_pEdit->SetLimitChar(nLimitChar);\n}\n\nFX_INT32 CPWL_Label::GetTotalWords()\n{\n\tif (m_pEdit)\n\t\treturn m_pEdit->GetTotalWords();\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/pdfwindow/PWL_ListBox.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/pdfwindow/PDFWindow.h\"\n#include \"../../include/pdfwindow/PWL_Wnd.h\"\n#include \"../../include/pdfwindow/PWL_ListBox.h\"\n#include \"../../include/pdfwindow/PWL_Utils.h\"\n#include \"../../include/pdfwindow/PWL_ScrollBar.h\"\n#include \"../../include/pdfwindow/PWL_EditCtrl.h\"\n#include \"../../include/pdfwindow/PWL_Edit.h\"\n\n#define IsFloatZero(f)\t\t\t\t\t\t((f) < 0.0001 && (f) > -0.0001)\n#define IsFloatBigger(fa,fb)\t\t\t\t((fa) > (fb) && !IsFloatZero((fa) - (fb)))\n#define IsFloatSmaller(fa,fb)\t\t\t\t((fa) < (fb) && !IsFloatZero((fa) - (fb)))\n#define IsFloatEqual(fa,fb)\t\t\t\t\tIsFloatZero((fa)-(fb))\n\n/* ------------------------ CPWL_List_Notify ----------------------- */\n\nCPWL_List_Notify::CPWL_List_Notify(CPWL_ListBox* pList) : m_pList(pList)\n{\n\tASSERT(m_pList != NULL);\n}\n\nCPWL_List_Notify::~CPWL_List_Notify()\n{\n}\n\nvoid CPWL_List_Notify::IOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax, \n\t\t\t\t\t\t\t\t\t\t\t\tFX_FLOAT fContentMin, FX_FLOAT fContentMax, \n\t\t\t\t\t\t\t\t\t\t\t\tFX_FLOAT fSmallStep, FX_FLOAT fBigStep)\n{\n\tPWL_SCROLL_INFO Info;\n\n\tInfo.fPlateWidth = fPlateMax - fPlateMin;\n\tInfo.fContentMin = fContentMin;\n\tInfo.fContentMax = fContentMax;\n\tInfo.fSmallStep = fSmallStep;\n\tInfo.fBigStep = fBigStep;\n\n\tm_pList->OnNotify(m_pList,PNM_SETSCROLLINFO,SBT_VSCROLL,(FX_INTPTR)&Info);\n\n\tif (CPWL_ScrollBar * pScroll = m_pList->GetVScrollBar())\n\t{\n\t\tif (IsFloatBigger(Info.fPlateWidth,Info.fContentMax-Info.fContentMin)\n\t\t\t|| IsFloatEqual(Info.fPlateWidth,Info.fContentMax-Info.fContentMin))\n\t\t{\n\t\t\tif (pScroll->IsVisible())\n\t\t\t{\n\t\t\t\tpScroll->SetVisible(FALSE);\n\t\t\t\tm_pList->RePosChildWnd();\n\t\t\t}\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (!pScroll->IsVisible())\n\t\t\t{\n\t\t\t\tpScroll->SetVisible(TRUE);\t\n\t\t\t\tm_pList->RePosChildWnd();\n\t\t\t}\n\t\t}\n\t}\t\n}\n\nvoid CPWL_List_Notify::IOnSetScrollPosY(FX_FLOAT fy)\n{\n\tm_pList->OnNotify(m_pList,PNM_SETSCROLLPOS,SBT_VSCROLL,(FX_INTPTR)&fy);\n}\n\nvoid CPWL_List_Notify::IOnInvalidateRect(CPDF_Rect * pRect)\n{\n\tm_pList->InvalidateRect(pRect);\n}\n\n/* --------------------------- CPWL_ListBox ---------------------------- */\n\nCPWL_ListBox::CPWL_ListBox() :\n\tm_pList(NULL),\n\tm_pListNotify(NULL),\n\tm_bMouseDown(FALSE),\n\tm_bHoverSel(FALSE),\n\tm_pFillerNotify(NULL)\n{\n\tm_pList = IFX_List::NewList();\n\n\tASSERT(m_pList != NULL);\n}\n\nCPWL_ListBox::~CPWL_ListBox()\n{\n\tIFX_List::DelList(m_pList);\n\t\n\tif (m_pListNotify)\n\t{\n\t\tdelete m_pListNotify;\n\t\tm_pListNotify = NULL;\n\t}\n}\n\nCFX_ByteString CPWL_ListBox::GetClassName() const\n{\t\n\treturn \"CPWL_ListBox\";\n}\n\nvoid CPWL_ListBox::OnCreated()\n{\n\tif (m_pList)\n\t{\n\t\tif (m_pListNotify) delete m_pListNotify;\n\n\t\tm_pList->SetFontMap(GetFontMap());\n\t\tm_pList->SetNotify(m_pListNotify = new CPWL_List_Notify(this));\n\t\n\t\tSetHoverSel(HasFlag(PLBS_HOVERSEL));\t\n\t\tm_pList->SetMultipleSel(HasFlag(PLBS_MULTIPLESEL));\n\t\tm_pList->SetFontSize(this->GetCreationParam().fFontSize);\t\n\n\t\tm_bHoverSel = HasFlag(PLBS_HOVERSEL);\n\t}\n}\n\nvoid CPWL_ListBox::OnDestroy()\n{\n\tif (m_pListNotify)\n\t{\n\t\tdelete m_pListNotify;\n\t\tm_pListNotify = NULL;\n\t}\n}\n\nvoid CPWL_ListBox::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)\n{\n\tCPWL_Wnd::GetThisAppearanceStream(sAppStream);\n\n\tCFX_ByteTextBuf sListItems;\n\n\tif (m_pList)\n\t{\n\t\tCPDF_Rect rcPlate = m_pList->GetPlateRect();\n\t\tfor (FX_INT32 i=0,sz=m_pList->GetCount(); i<sz; i++)\n\t\t{\n\t\t\tCPDF_Rect rcItem = m_pList->GetItemRect(i);\n\n\t\t\tif (rcItem.bottom > rcPlate.top || rcItem.top < rcPlate.bottom) continue;\n\t\t\t\n\t\t\tCPDF_Point ptOffset(rcItem.left, (rcItem.top + rcItem.bottom) * 0.5f);\n\t\t\tif (m_pList->IsItemSelected(i))\n\t\t\t{\n\t\t\t\tsListItems << CPWL_Utils::GetRectFillAppStream(rcItem,PWL_DEFAULT_SELBACKCOLOR);\n\t\t\t\tCFX_ByteString sItem = CPWL_Utils::GetEditAppStream(m_pList->GetItemEdit(i), ptOffset);\n\t\t\t\tif (sItem.GetLength() > 0)\n\t\t\t\t{\n\t\t\t\t\tsListItems << \"BT\\n\" << CPWL_Utils::GetColorAppStream(PWL_DEFAULT_SELTEXTCOLOR) << sItem << \"ET\\n\";\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tCFX_ByteString sItem = CPWL_Utils::GetEditAppStream(m_pList->GetItemEdit(i), ptOffset);\n\t\t\t\tif (sItem.GetLength() > 0)\n\t\t\t\t{\n\t\t\t\t\tsListItems << \"BT\\n\" << CPWL_Utils::GetColorAppStream(GetTextColor()) << sItem << \"ET\\n\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (sListItems.GetLength() > 0)\n\t{\n\t\tCFX_ByteTextBuf sClip;\t\t\t\n\t\tCPDF_Rect rcClient = this->GetClientRect();\n\n\t\tsClip << \"q\\n\";\n\t\tsClip << rcClient.left << \" \" << rcClient.bottom << \" \"\n\t\t\t<< rcClient.right - rcClient.left << \" \" <<\trcClient.top - rcClient.bottom << \" re W n\\n\";\n\n\t\tsClip << sListItems << \"Q\\n\";\n\n\t\tsAppStream << \"/Tx BMC\\n\" << sClip << \"EMC\\n\";\n\t}\n}\n\nvoid CPWL_ListBox::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)\n{\n\tCPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);\n\n\tif (m_pList)\n\t{\n\t\tCPDF_Rect rcPlate = m_pList->GetPlateRect();\n\t\tCPDF_Rect rcList = GetListRect();\n\t\tCPDF_Rect rcClient = GetClientRect();\n\n\t\tfor (FX_INT32 i=0,sz=m_pList->GetCount(); i<sz; i++)\n\t\t{\n\t\t\tCPDF_Rect rcItem = m_pList->GetItemRect(i);\n\t\t\tif (rcItem.bottom > rcPlate.top || rcItem.top < rcPlate.bottom) continue;\n\t\t\t\n\t\t\tCPDF_Point ptOffset(rcItem.left, (rcItem.top + rcItem.bottom) * 0.5f);\n\t\t\tif (IFX_Edit* pEdit = m_pList->GetItemEdit(i))\n\t\t\t{\n\t\t\t\tCPDF_Rect rcContent = pEdit->GetContentRect();\n\t\t\t\tif (rcContent.Width() > rcClient.Width())\n\t\t\t\t\trcItem.Intersect(rcList);\n\t\t\t\telse\n\t\t\t\t\trcItem.Intersect(rcClient);\n\t\t\t}\n\n\t\t\tif (m_pList->IsItemSelected(i))\n\t\t\t{\n\t\t\t//\tCPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcItem, ArgbEncode(255,0,51,113));\n\t\t\t\tIFX_SystemHandler* pSysHandler = GetSystemHandler();\n\t\t\t\tif(pSysHandler && pSysHandler->IsSelectionImplemented())\n\t\t\t\t{\n\t\t\t\t\tIFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i), CPWL_Utils::PWLColorToFXColor(GetTextColor()), CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor()),\n\t\t\t\t\t\trcList, ptOffset, NULL,pSysHandler, m_pFormFiller);\n\t\t\t\t\tpSysHandler->OutputSelectedRect(m_pFormFiller, rcItem);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tCPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcItem, ArgbEncode(255,0,51,113));\n\t\t\t\t\tIFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i), ArgbEncode(255,255,255,255), 0,\n\t\t\t\t\t\trcList, ptOffset, NULL, pSysHandler, m_pFormFiller);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tIFX_SystemHandler* pSysHandler = GetSystemHandler();\n\t\t\t\tIFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i), \n\t\t\t\t\t\tCPWL_Utils::PWLColorToFXColor(GetTextColor()),\n\t\t\t\t\t\tCPWL_Utils::PWLColorToFXColor(GetTextStrokeColor()),\n\t\t\t\t\t\trcList, ptOffset, NULL,pSysHandler, NULL);\n\n\t\t\t}\n\t\t}\n\t}\n}\n\nFX_BOOL CPWL_ListBox::OnKeyDown(FX_WORD nChar, FX_DWORD nFlag)\n{\n\tCPWL_Wnd::OnKeyDown(nChar, nFlag);\n\n\tif (!m_pList) return FALSE;\n\n\tswitch (nChar)\n\t{\n\tdefault:\n\t\treturn FALSE;\n\tcase FWL_VKEY_Up:\n\tcase FWL_VKEY_Down:\n\tcase FWL_VKEY_Home:\n\tcase FWL_VKEY_Left:\n\tcase FWL_VKEY_End:\n\tcase FWL_VKEY_Right:\n\t\tbreak;\t\n\t}\n\n\tswitch (nChar)\n\t{\n\tcase FWL_VKEY_Up:\n\t\tm_pList->OnVK_UP(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));\n\t\tbreak;\n\tcase FWL_VKEY_Down:\n\t\tm_pList->OnVK_DOWN(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));\n\t\tbreak;\n\tcase FWL_VKEY_Home:\n\t\tm_pList->OnVK_HOME(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));\n\t\tbreak;\n\tcase FWL_VKEY_Left:\n\t\tm_pList->OnVK_LEFT(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));\n\t\tbreak;\n\tcase FWL_VKEY_End:\n\t\tm_pList->OnVK_END(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));\n\t\tbreak;\n\tcase FWL_VKEY_Right:\n\t\tm_pList->OnVK_RIGHT(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));\n\t\tbreak;\n\tcase FWL_VKEY_Delete:\n\t\tbreak;\n\t}\n\n\tFX_BOOL bExit = FALSE;\n\tOnNotifySelChanged(TRUE,bExit,nFlag);\n\n\treturn TRUE;\n}\n\nFX_BOOL CPWL_ListBox::OnChar(FX_WORD nChar, FX_DWORD nFlag)\n{\n\tCPWL_Wnd::OnChar(nChar,nFlag);\n\n\tif (!m_pList) return FALSE;\n\n\tif (!m_pList->OnChar(nChar,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag))) return FALSE;\n\n\tFX_BOOL bExit = FALSE;\n\tOnNotifySelChanged(TRUE,bExit, nFlag);\n\n\treturn TRUE;\n}\n\nFX_BOOL CPWL_ListBox::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tCPWL_Wnd::OnLButtonDown(point,nFlag);\n\n\tif (ClientHitTest(point))\n\t{\n\t\tm_bMouseDown = TRUE;\n\t\tSetFocus();\n\t\tSetCapture();\n\n\t\tif (m_pList)\n\t\t\tm_pList->OnMouseDown(point,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL CPWL_ListBox::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tCPWL_Wnd::OnLButtonUp(point,nFlag);\n\n\tif (m_bMouseDown)\n\t{\n\t\tReleaseCapture();\n\t\tm_bMouseDown = FALSE;\n\t}\n\n\tFX_BOOL bExit = FALSE;\n\tOnNotifySelChanged(FALSE,bExit,nFlag);\n\n\treturn TRUE;\n}\n\nvoid CPWL_ListBox::SetHoverSel(FX_BOOL bHoverSel)\n{\n\tm_bHoverSel = bHoverSel;\n}\n\nFX_BOOL CPWL_ListBox::OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tCPWL_Wnd::OnMouseMove(point, nFlag);\n\n\tif (m_bHoverSel && !IsCaptureMouse() && ClientHitTest(point))\n\t{\n\t\tif (m_pList)\n\t\t\tm_pList->Select(m_pList->GetItemIndex(point));\n\t}\n\n\tif (m_bMouseDown)\n\t{\n\t\tif (m_pList)\n\t\t\tm_pList->OnMouseMove(point,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));\n\t}\t\n\n\treturn TRUE;\n}\n\nvoid CPWL_ListBox::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)\n{\n\tCPWL_Wnd::OnNotify(pWnd,msg,wParam,lParam);\n\n\tFX_FLOAT fPos;\t\n\t\n\tswitch (msg)\n\t{\n\tcase PNM_SETSCROLLINFO:\n\t\tswitch (wParam)\n\t\t{\n\t\tcase SBT_VSCROLL:\n\t\t\tif (CPWL_Wnd * pChild = GetVScrollBar())\n\t\t\t{\n\t\t\t\tpChild->OnNotify(pWnd,PNM_SETSCROLLINFO,wParam,lParam);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\tcase PNM_SETSCROLLPOS:\t\t\t\n\t\tswitch (wParam)\n\t\t{\n\t\tcase SBT_VSCROLL:\n\t\t\tif (CPWL_Wnd * pChild = GetVScrollBar())\n\t\t\t{\n\t\t\t\tpChild->OnNotify(pWnd,PNM_SETSCROLLPOS,wParam,lParam);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\tcase PNM_SCROLLWINDOW:\n\t\tfPos = *(FX_FLOAT*)lParam;\n\t\tswitch (wParam)\n\t\t{\n\t\tcase SBT_VSCROLL:\n\t\t\tif (m_pList)\n\t\t\t\tm_pList->SetScrollPos(CPDF_Point(0,fPos));\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\t}\n}\n\nvoid CPWL_ListBox::KillFocus()\n{\n\tCPWL_Wnd::KillFocus();\n\n\t/*\n\tif (this->IsMultipleSel())\n\t{\n\t\tfor(FX_INT32 i=0;i<this->GetCount();i++)\n\t\t{\n\t\t\tif (this->IsListItemSelected(i))\n\t\t\t{\n\t\t\t\tif (!IsListItemVisible(i))\n\t\t\t\t\tthis->ScrollToListItem(i);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (!IsListItemVisible(this->GetCurSel()))\n\t\t\tthis->ScrollToListItem(this->GetCurSel());\n\t}\n\n\tSetListItemCaret(m_nCaretIndex,FALSE);\n\t*/\n}\n\nvoid CPWL_ListBox::RePosChildWnd()\n{\n\tCPWL_Wnd::RePosChildWnd();\n\n\tif (m_pList)\n\t\tm_pList->SetPlateRect(GetListRect());\n}\n\nvoid CPWL_ListBox::OnNotifySelChanged(FX_BOOL bKeyDown, FX_BOOL & bExit,  FX_DWORD nFlag)\n{\n\tif (m_pFillerNotify)\n\t{\t\t\n\t\tFX_BOOL bRC = TRUE;\n\t\tCFX_WideString swChange = GetText();\n\t\tCFX_WideString strChangeEx;\n\t\tint nSelStart = 0;\n\t\tint nSelEnd = swChange.GetLength();\n\t\tm_pFillerNotify->OnBeforeKeyStroke(FALSE, GetAttachedData(), 0, swChange, strChangeEx, nSelStart, nSelEnd, bKeyDown, bRC, bExit, nFlag);\n\t\tif (bExit) return;\n\n\t\tm_pFillerNotify->OnAfterKeyStroke(FALSE, GetAttachedData(), bExit,nFlag);\n\t}\n}\n\nCPDF_Rect CPWL_ListBox::GetFocusRect() const\n{\n\tif (m_pList && m_pList->IsMultipleSel())\n\t{\n\t\tCPDF_Rect rcCaret = m_pList->GetItemRect(m_pList->GetCaret());\n\t\trcCaret.Intersect(GetClientRect());\n\t\treturn rcCaret;\n\t}\n\t\n\treturn CPWL_Wnd::GetFocusRect();\n}\n\nvoid CPWL_ListBox::AddString(FX_LPCWSTR string)\n{\n\tif (m_pList)\n\t{\t\t\n\t\tm_pList->AddString(string);\n\t}\n}\n\nvoid CPWL_ListBox::SetText(FX_LPCWSTR csText,FX_BOOL bRefresh)\n{\n\t//return CPDF_List::SetText(csText,bRefresh);\n}\n\nCFX_WideString CPWL_ListBox::GetText() const\n{\n\tif (m_pList)\n\t\treturn m_pList->GetText();\n\n\treturn L\"\";\n}\n\nvoid CPWL_ListBox::SetFontSize(FX_FLOAT fFontSize)\n{\n\tif (m_pList)\n\t\tm_pList->SetFontSize(fFontSize);\n}\n\nFX_FLOAT CPWL_ListBox::GetFontSize() const\n{\n\tif (m_pList)\n\t\treturn m_pList->GetFontSize();\n\treturn 0.0f;\n}\n\nvoid CPWL_ListBox::Select(FX_INT32 nItemIndex)\n{\n\tif (m_pList)\n\t\tm_pList->Select(nItemIndex);\n}\n\nvoid CPWL_ListBox::SetCaret(FX_INT32 nItemIndex)\n{\n\tif (m_pList)\n\t\tm_pList->SetCaret(nItemIndex);\n}\n\nvoid CPWL_ListBox::SetTopVisibleIndex(FX_INT32 nItemIndex)\n{\n\tif (m_pList)\n\t\tm_pList->SetTopItem(nItemIndex);\n}\n\nvoid CPWL_ListBox::ScrollToListItem(FX_INT32 nItemIndex)\n{\n\tif (m_pList)\n\t\tm_pList->ScrollToListItem(nItemIndex);\n}\n\nvoid CPWL_ListBox::ResetContent()\n{\n\tif (m_pList)\n\t\tm_pList->Empty();\n}\n\nvoid CPWL_ListBox::Reset()\n{\n\tif (m_pList)\n\t\tm_pList->Cancel();\n}\n\nFX_BOOL CPWL_ListBox::IsMultipleSel() const\n{\n\tif (m_pList)\n\t\treturn m_pList->IsMultipleSel();\n\n\treturn FALSE;\n}\n\nFX_INT32 CPWL_ListBox::GetCaretIndex() const\n{\n\tif (m_pList)\n\t\treturn m_pList->GetCaret();\n\n\treturn -1;\n}\n\nFX_INT32 CPWL_ListBox::GetCurSel() const\n{\n\tif (m_pList)\n\t\treturn m_pList->GetSelect();\n\n\treturn -1;\n}\n\nFX_BOOL CPWL_ListBox::IsItemSelected(FX_INT32 nItemIndex) const\n{\n\tif (m_pList)\n\t\treturn m_pList->IsItemSelected(nItemIndex);\n\n\treturn FALSE;\n}\n\nFX_INT32 CPWL_ListBox::GetTopVisibleIndex() const\n{\n\tif (m_pList)\n\t{\n\t\tm_pList->ScrollToListItem(m_pList->GetFirstSelected());\n\t\treturn m_pList->GetTopItem();\n\t}\n\n\treturn -1;\n}\n\nFX_INT32 CPWL_ListBox::GetCount() const\n{\n\tif (m_pList)\n\t\treturn m_pList->GetCount();\n\n\treturn 0;\n}\n\nFX_INT32 CPWL_ListBox::FindNext(FX_INT32 nIndex,FX_WCHAR nChar) const\n{\n\tif (m_pList)\n\t\treturn m_pList->FindNext(nIndex,nChar);\n\n\treturn nIndex;\n}\n\nCPDF_Rect CPWL_ListBox::GetContentRect() const\n{\n\tif (m_pList)\n\t\treturn m_pList->GetContentRect();\n\n\treturn CPDF_Rect();\n}\n\nFX_FLOAT CPWL_ListBox::GetFirstHeight() const\n{\n\tif (m_pList)\n\t\treturn m_pList->GetFirstHeight();\n\n\treturn 0.0f;\n}\n\nCPDF_Rect CPWL_ListBox::GetListRect() const\n{\n\treturn CPWL_Utils::DeflateRect(GetWindowRect(),(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));\n}\n\nFX_BOOL\tCPWL_ListBox::OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tif (!m_pList) return FALSE;\n\n\tif (zDelta < 0)\n\t{\n\t\tm_pList->OnVK_DOWN(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));\n\t}\n\telse\n\t{\n\t\tm_pList->OnVK_UP(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));\n\t}\n\n\tFX_BOOL bExit = FALSE;\n\tOnNotifySelChanged(FALSE,bExit, nFlag);\n\treturn TRUE;\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/pdfwindow/PWL_ListCtrl.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/pdfwindow/PDFWindow.h\"\n#include \"../../include/pdfwindow/PWL_Wnd.h\"\n#include \"../../include/pdfwindow/PWL_ListCtrl.h\"\n\n/* ---------------------------- CPWL_ListCtrl ---------------------------- */\n\nCPWL_ListCtrl::CPWL_ListCtrl() : \n\tm_rcContent(0,0,0,0),\n\tm_ptScroll(0,0), \n\tm_fItemSpace(0.0f),\n\tm_fTopSpace(0.0f),\n\tm_fBottomSpace(0.0f)\n{\n}\n\nCPWL_ListCtrl::~CPWL_ListCtrl()\n{\n}\n\nvoid CPWL_ListCtrl::SetScrollPos(const CPDF_Point& point)\n{\n\tm_ptScroll = point;\n\n\tif (m_ptScroll.x < m_rcContent.left)\n\t\tm_ptScroll.x = m_rcContent.left;\n\n\tif (m_ptScroll.x > m_rcContent.right)\n\t\tm_ptScroll.x = m_rcContent.right;\n\n\tif (m_ptScroll.y > m_rcContent.top)\n\t\tm_ptScroll.y = m_rcContent.top;\n\n\tif (m_ptScroll.y < m_rcContent.bottom)\n\t\tm_ptScroll.y = m_rcContent.bottom;\t\n}\n\nCPDF_Point CPWL_ListCtrl::GetScrollPos() const\n{\n\treturn m_ptScroll;\n}\n\nCPDF_Rect CPWL_ListCtrl::GetScrollArea() const\n{\n\treturn m_rcContent;\n}\n\nvoid CPWL_ListCtrl::ResetFace()\n{\n\tResetAll(FALSE, 0);\n}\n\nvoid CPWL_ListCtrl::ResetContent(FX_INT32 nStart)\n{\n\tif (nStart < 0)\n\t\tnStart = 0;\n\tif (nStart >= 0 && nStart < m_aChildren.GetSize())\n\t\tResetAll(TRUE, nStart);\n}\n\nFX_FLOAT CPWL_ListCtrl::GetContentsHeight(FX_FLOAT fLimitWidth)\n{\n\tFX_FLOAT fRet = m_fTopSpace;\n\n\tFX_FLOAT fBorderWidth = (FX_FLOAT)this->GetBorderWidth();\n\n\tif (fLimitWidth > fBorderWidth* 2)\n\t{\n\t\tfor (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\n\t\t{\n\t\t\tif (CPWL_Wnd* pChild = m_aChildren.GetAt(i))\n\t\t\t{\n\t\t\t\tFX_FLOAT fLeft = pChild->GetItemLeftMargin();\n\t\t\t\tFX_FLOAT fRight = pChild->GetItemRightMargin();\n\n\t\t\t\tfRet += pChild->GetItemHeight(fLimitWidth - fBorderWidth* 2 - fLeft - fRight);\n\t\t\t\tfRet += m_fItemSpace;\n\t\t\t}\n\t\t}\n\n\t\tfRet -= m_fItemSpace;\n\t}\n\n\tfRet += m_fBottomSpace;\n\n\treturn fRet;\n}\n\nvoid CPWL_ListCtrl::ResetAll(FX_BOOL bMove, FX_INT32 nStart)\n{\n\tCPDF_Rect rcClient = GetClientRect();\n\n\tFX_FLOAT fWidth = rcClient.Width();\n\n\tFX_FLOAT fy = 0.0f - m_fTopSpace;\n\n\tif (nStart-1 >= 0 && nStart-1 < m_aChildren.GetSize())\n\t\tif (CPWL_Wnd* pChild = m_aChildren.GetAt(nStart-1))\n\t\t\tfy = pChild->GetWindowRect().bottom - m_fItemSpace;\n\n\tfor (FX_INT32 i=nStart,sz=m_aChildren.GetSize(); i<sz; i++)\n\t{\n\t\tif (CPWL_Wnd* pChild = m_aChildren.GetAt(i))\n\t\t{\n\t\t\tFX_FLOAT fLeft = pChild->GetItemLeftMargin();\n\t\t\tFX_FLOAT fRight = pChild->GetItemRightMargin();\n\n\t\t\tpChild->SetChildMatrix(\n\t\t\t\tCPDF_Matrix(1,0,0,1, \n\t\t\t\trcClient.left - m_ptScroll.x, \n\t\t\t\trcClient.top - m_ptScroll.y)\n\t\t\t\t);\n\n\t\t\tif (bMove)\n\t\t\t{\n\t\t\t\tFX_FLOAT fItemHeight = pChild->GetItemHeight(fWidth - fLeft - fRight);\n\t\t\t\tpChild->Move(CPDF_Rect(fLeft, fy-fItemHeight, fWidth - fRight, fy), TRUE, FALSE);\n\t\t\t\tfy -= fItemHeight;\n\t\t\t\tfy -= m_fItemSpace;\n\t\t\t}\n\t\t}\n\t}\n\n\tfy += m_fItemSpace;\n\n\tfy -= m_fBottomSpace;\n\n\tif (bMove)\n\t{\n\t\tm_rcContent.left = 0;\n\t\tm_rcContent.top = 0;\n\t\tm_rcContent.right = fWidth;\n\t\tm_rcContent.bottom = fy;\n\t}\n}\n\nvoid CPWL_ListCtrl::SetItemSpace(FX_FLOAT fSpace)\n{\n\tm_fItemSpace = fSpace;\n}\n\nvoid CPWL_ListCtrl::SetTopSpace(FX_FLOAT fSpace)\n{\n\tm_fTopSpace = fSpace;\n}\n\nvoid CPWL_ListCtrl::SetBottomSpace(FX_FLOAT fSpace)\n{\n\tm_fBottomSpace = fSpace;\n}\n\nvoid CPWL_ListCtrl::RePosChildWnd()\n{\n\tResetFace();\n}\n\nvoid CPWL_ListCtrl::DrawChildAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)\n{\n\tpDevice->SaveState();\n\tCPDF_Rect rcClient = GetClientRect();\n\tCPDF_Rect rcTemp = rcClient;\n\tpUser2Device->TransformRect(rcTemp);\n\tFX_RECT rcClip((FX_INT32)rcTemp.left,\n\t\t(FX_INT32)rcTemp.bottom,\n\t\t(FX_INT32)rcTemp.right,\n\t\t(FX_INT32)rcTemp.top);\n\n\tpDevice->SetClip_Rect(&rcClip);\n\n\tfor (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\n\t{\n\t\tif (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\n\t\t{\n\t\t\tCPDF_Rect rcChild = pChild->ChildToParent(pChild->GetWindowRect());\n\t\t\tif (!(rcChild.top < rcClient.bottom || rcChild.bottom > rcClient.top))\n\t\t\t{\n\t\t\t\tCPDF_Matrix mt = pChild->GetChildMatrix();\n\t\t\t\tif (mt.IsIdentity())\n\t\t\t\t{\n\t\t\t\t\tpChild->DrawAppearance(pDevice,pUser2Device);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tmt.Concat(*pUser2Device);\n\t\t\t\t\tpChild->DrawAppearance(pDevice,&mt);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpDevice->RestoreState();\n}\n\nFX_INT32 CPWL_ListCtrl::GetItemIndex(CPWL_Wnd* pItem)\n{\n\tfor (FX_INT32 i=0, sz=m_aChildren.GetSize(); i<sz; i++)\n\t{\n\t\tif (pItem == m_aChildren.GetAt(i))\n\t\t\treturn i;\n\t}\n\n\treturn -1;\n}\n\nCPDF_Point CPWL_ListCtrl::InToOut(const CPDF_Point& point) const\n{\n\tCPDF_Rect rcClient = GetClientRect();\n\n\treturn CPDF_Point(point.x + rcClient.left - m_ptScroll.x, \n\t\tpoint.y + rcClient.top - m_ptScroll.y);\n}\n\nCPDF_Point CPWL_ListCtrl::OutToIn(const CPDF_Point& point) const\n{\n\tCPDF_Rect rcClient = GetClientRect();\n\n\treturn CPDF_Point(point.x - rcClient.left + m_ptScroll.x, \n\t\tpoint.y - rcClient.top + m_ptScroll.y);\n}\n\nCPDF_Rect CPWL_ListCtrl::InToOut(const CPDF_Rect& rect) const\n{\n\tCPDF_Rect rcClient = GetClientRect();\n\n\treturn CPDF_Rect(rect.left + rcClient.left - m_ptScroll.x,\n\t\trect.bottom + rcClient.top - m_ptScroll.y,\n\t\trect.right + rcClient.left - m_ptScroll.x,\n\t\trect.top + rcClient.top - m_ptScroll.y);\n}\n\nCPDF_Rect CPWL_ListCtrl::OutToIn(const CPDF_Rect& rect) const\n{\n\tCPDF_Rect rcClient = GetClientRect();\n\n\treturn CPDF_Rect(rect.left - rcClient.left + m_ptScroll.x,\n\t\trect.bottom - rcClient.top + m_ptScroll.y,\n\t\trect.right - rcClient.left + m_ptScroll.x,\n\t\trect.top - rcClient.top + m_ptScroll.y);\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/pdfwindow/PWL_Note.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/pdfwindow/PDFWindow.h\"\n#include \"../../include/pdfwindow/PWL_Wnd.h\"\n#include \"../../include/pdfwindow/PWL_Button.h\"\n#include \"../../include/pdfwindow/PWL_EditCtrl.h\"\n#include \"../../include/pdfwindow/PWL_Edit.h\"\n#include \"../../include/pdfwindow/PWL_ListCtrl.h\"\n#include \"../../include/pdfwindow/PWL_ScrollBar.h\"\n#include \"../../include/pdfwindow/PWL_Note.h\"\n#include \"../../include/pdfwindow/PWL_Label.h\"\n#include \"../../include/pdfwindow/PWL_Edit.h\"\n#include \"../../include/pdfwindow/PWL_ScrollBar.h\"\n#include \"../../include/pdfwindow/PWL_Utils.h\"\n#include \"../../include/pdfwindow/PWL_Caret.h\"\n\n#define POPUP_ITEM_HEAD_BOTTOM\t\t\t\t\t3.0f\n#define POPUP_ITEM_BOTTOMWIDTH\t\t\t\t\t1.0f\n#define POPUP_ITEM_SIDEMARGIN\t\t\t\t\t3.0f\n#define POPUP_ITEM_SPACE\t\t\t\t\t\t4.0f\n#define POPUP_ITEM_TEXT_INDENT\t\t\t\t\t2.0f\n#define POPUP_ITEM_BORDERCOLOR\t\t\t\t\tCPWL_Color(COLORTYPE_RGB, 80/255.0f, 80/255.0f, 80/255.0f)\n\n#define IsFloatZero(f)\t\t\t\t\t\t((f) < 0.0001 && (f) > -0.0001)\n#define IsFloatBigger(fa,fb)\t\t\t\t((fa) > (fb) && !IsFloatZero((fa) - (fb)))\n#define IsFloatSmaller(fa,fb)\t\t\t\t((fa) < (fb) && !IsFloatZero((fa) - (fb)))\n#define IsFloatEqual(fa,fb)\t\t\t\t\tIsFloatZero((fa)-(fb))\n\n\n/* ------------------------------- CPWL_Note_Options ------------------------------- */\n\nCPWL_Note_Options::CPWL_Note_Options() : m_pText(NULL)\n{\n}\n\nCPWL_Note_Options::~CPWL_Note_Options()\n{\n}\n\nvoid CPWL_Note_Options::SetTextColor(const CPWL_Color & color)\n{\n\tCPWL_Wnd::SetTextColor(color);\n\n\tif (m_pText)\n\t\tm_pText->SetTextColor(color);\n}\n\nvoid CPWL_Note_Options::RePosChildWnd()\n{\n\tif (this->IsValid())\n\t{\n\t\tASSERT(m_pText != NULL);\n\n\t\tCPDF_Rect rcClient = GetClientRect();\n\n\t\tif (rcClient.Width() > 15.0f)\n\t\t{\n\t\t\trcClient.right -= 15.0f;\n\t\t\tm_pText->Move(rcClient, TRUE, FALSE);\n\t\t\tm_pText->SetVisible(TRUE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_pText->Move(CPDF_Rect(0,0,0,0), TRUE, FALSE);\n\t\t\tm_pText->SetVisible(FALSE);\n\t\t}\n\t}\n}\n\nvoid CPWL_Note_Options::CreateChildWnd(const PWL_CREATEPARAM & cp)\n{\n\tm_pText = new CPWL_Label;\n\tPWL_CREATEPARAM tcp = cp;\n\ttcp.pParentWnd = this;\n\ttcp.dwFlags = PWS_CHILD | PWS_VISIBLE;\n\tm_pText->Create(tcp);\n}\n\nvoid CPWL_Note_Options::SetText(const CFX_WideString& sText)\n{\n\tm_pText->SetText(sText);\n}\n\nvoid CPWL_Note_Options::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)\n{\n\tCPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device);\n\n\tCPDF_Rect rcClient = GetClientRect();\n\trcClient.left = rcClient.right - 15.0f;\n\n\tCPDF_Point ptCenter = CPDF_Point((rcClient.left + rcClient.right) * 0.5f, (rcClient.top + rcClient.bottom) * 0.5f);\n\n\tCPDF_Point pt1(ptCenter.x - 2.0f, ptCenter.y + 2.0f * 0.5f);\n\tCPDF_Point pt2(ptCenter.x + 2.0f, ptCenter.y + 2.0f * 0.5f);\n\tCPDF_Point pt3(ptCenter.x, ptCenter.y - 3.0f * 0.5f);\n\n\tCFX_PathData path;\n\n\tpath.SetPointCount(4);\n\tpath.SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO);\n\tpath.SetPoint(1, pt2.x, pt2.y, FXPT_LINETO);\n\tpath.SetPoint(2, pt3.x, pt3.y, FXPT_LINETO);\n\tpath.SetPoint(3, pt1.x, pt1.y, FXPT_LINETO);\n\n\tpDevice->DrawPath(&path, pUser2Device, NULL, \n\t\tCPWL_Utils::PWLColorToFXColor(GetTextColor(),GetTransparency()), \n\t\t0, FXFILL_ALTERNATE);\n}\n\nCPDF_Rect CPWL_Note_Options::GetContentRect() const\n{\n\tASSERT(m_pText != NULL);\n\n\tCPDF_Rect rcText = m_pText->GetContentRect();\n\trcText.right += 15.0f;\n\treturn rcText;\n}\n\n/* ------------------------------- CPWL_Note_Edit ------------------------------ */\n\nCPWL_Note_Edit::CPWL_Note_Edit() : m_bEnableNotify(TRUE),\n\tm_fOldItemHeight(0.0f),\n\tm_bSizeChanged(FALSE),\n\tm_fOldMin(0.0f),\n\tm_fOldMax(0.0f)\n{\n}\n\nCPWL_Note_Edit::~CPWL_Note_Edit()\n{\n}\n\nvoid CPWL_Note_Edit::RePosChildWnd()\n{\n\tm_bEnableNotify = FALSE;\t\n\tCPWL_Edit::RePosChildWnd();\n\tm_bEnableNotify = TRUE;\n\n\tm_fOldItemHeight = this->GetContentRect().Height();\n}\n\nvoid CPWL_Note_Edit::SetText(FX_LPCWSTR csText)\n{\n\tm_bEnableNotify = FALSE;\n\tCPWL_Edit::SetText(csText);\n\tm_bEnableNotify = TRUE;\t\n\tm_fOldItemHeight = this->GetContentRect().Height();\n}\n\nvoid CPWL_Note_Edit::OnSetFocus()\n{\n\tm_bEnableNotify = FALSE;\t\n\tCPWL_Edit::OnSetFocus();\n\tm_bEnableNotify = TRUE;\t\n\n\tthis->EnableSpellCheck(TRUE);\n}\n\nvoid CPWL_Note_Edit::OnKillFocus()\n{\n\tthis->EnableSpellCheck(FALSE);\n\n\tif (CPWL_Wnd* pParent = this->GetParentWindow())\n\t{\n\t\tif (CPWL_Wnd* pGrand = pParent->GetParentWindow())\n\t\t{\n\t\t\tASSERT(pGrand->GetClassName() == \"CPWL_NoteItem\");\n\n\t\t\tCPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pGrand;\n\n\t\t\tpNoteItem->OnContentsValidate();\n\t\t}\n\t}\n\n\tCPWL_Edit::OnKillFocus();\n}\n\nvoid CPWL_Note_Edit::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)\n{\n\tif (m_bEnableNotify)\n\t{\n\t\tif (wParam == SBT_VSCROLL)\n\t\t{\n\t\t\tswitch (msg)\n\t\t\t{\n\t\t\tcase PNM_SETSCROLLINFO:\t\n\t\t\t\tif (PWL_SCROLL_INFO* pInfo = (PWL_SCROLL_INFO*)lParam)\n\t\t\t\t{\t\n\t\t\t\t\tif (!IsFloatEqual(pInfo->fContentMax, m_fOldMax) || \n\t\t\t\t\t\t!IsFloatEqual(pInfo->fContentMin, m_fOldMin))\n\t\t\t\t\t{\n\t\t\t\t\t\tm_bSizeChanged = TRUE;\t\t\t\t\n\t\t\t\t\t\tif (CPWL_Wnd * pParent = this->GetParentWindow())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpParent->OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tm_fOldMax = pInfo->fContentMax;\n\t\t\t\t\t\tm_fOldMin = pInfo->fContentMin;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\t\t\n\t}\n\n\tCPWL_Edit::OnNotify(pWnd, msg, wParam, lParam);\n\n\tif (m_bEnableNotify)\n\t{\n\t\tswitch (msg)\n\t\t{\n\t\tcase PNM_SETCARETINFO:\n\t\t\tif (PWL_CARET_INFO * pInfo = (PWL_CARET_INFO*)wParam)\n\t\t\t{\n\t\t\t\tPWL_CARET_INFO newInfo = *pInfo;\n\t\t\t\tnewInfo.bVisible = TRUE;\n\t\t\t\tnewInfo.ptHead = this->ChildToParent(pInfo->ptHead);\n\t\t\t\tnewInfo.ptFoot = this->ChildToParent(pInfo->ptFoot);\n\n\t\t\t\tif (CPWL_Wnd * pParent = this->GetParentWindow())\n\t\t\t\t{\n\t\t\t\t\tpParent->OnNotify(this, PNM_SETCARETINFO, (FX_INTPTR)&newInfo, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nFX_FLOAT CPWL_Note_Edit::GetItemHeight(FX_FLOAT fLimitWidth)\n{\n\tif (fLimitWidth > 0)\n\t{\n\t\tif (!m_bSizeChanged)\n\t\t\treturn m_fOldItemHeight;\n\n\t\tm_bSizeChanged = FALSE;\t\n\n\t\tthis->EnableNotify(FALSE);\n\t\tthis->EnableRefresh(FALSE);\n\t\tm_pEdit->EnableNotify(FALSE);\n\n\t\t//CPDF_Rect rcOld = this->GetWindowRect();\n\n\t\tthis->Move(CPDF_Rect(0,0,fLimitWidth,0), TRUE, FALSE);\n\t\tFX_FLOAT fRet = this->GetContentRect().Height();\n\n\t\t//this->Move(rcOld, TRUE, FALSE);\n\n\t\tm_pEdit->EnableNotify(TRUE);\n\t\tthis->EnableNotify(TRUE);\n\t\tthis->EnableRefresh(TRUE);\n\n\t\treturn fRet;\n\t}\n\n\treturn 0;\n}\n\nFX_FLOAT CPWL_Note_Edit::GetItemLeftMargin()\n{\n\treturn POPUP_ITEM_TEXT_INDENT;\n}\n\nFX_FLOAT CPWL_Note_Edit::GetItemRightMargin()\n{\n\treturn POPUP_ITEM_TEXT_INDENT;\n}\n\n/* -------------------------------- CPWL_Note_LBBox --------------------------------*/\n\nCPWL_Note_LBBox::CPWL_Note_LBBox()\n{\n}\n\nCPWL_Note_LBBox::~CPWL_Note_LBBox()\n{\n}\n\nvoid CPWL_Note_LBBox::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)\n{\n\tCPDF_Rect rcClient = this->GetClientRect();\n\n\tCFX_GraphStateData gsd;\n\tgsd.m_LineWidth = 1.0f;\n\n\tCFX_PathData pathCross;\n\n\tpathCross.SetPointCount(4);\n\tpathCross.SetPoint(0, rcClient.left, rcClient.top, FXPT_MOVETO);\n\tpathCross.SetPoint(1, rcClient.right, rcClient.bottom, FXPT_LINETO);\n\tpathCross.SetPoint(2, rcClient.left, rcClient.bottom + rcClient.Height() * 0.5f, FXPT_MOVETO);\n\tpathCross.SetPoint(3, rcClient.left + rcClient.Width() * 0.5f, rcClient.bottom, FXPT_LINETO);\n\t\n\tpDevice->DrawPath(&pathCross, pUser2Device, &gsd, \n\t\t0, CPWL_Utils::PWLColorToFXColor(GetTextColor(),this->GetTransparency()), FXFILL_ALTERNATE);\n}\n\n/* -------------------------------- CPWL_Note_RBBox --------------------------------*/\n\nCPWL_Note_RBBox::CPWL_Note_RBBox()\n{\n}\n\nCPWL_Note_RBBox::~CPWL_Note_RBBox()\n{\n}\n\nvoid CPWL_Note_RBBox::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)\n{\n\tCPDF_Rect rcClient = this->GetClientRect();\n\n\tCFX_GraphStateData gsd;\n\tgsd.m_LineWidth = 1.0f;\n\n\tCFX_PathData pathCross;\n\n\tpathCross.SetPointCount(4);\n\tpathCross.SetPoint(0, rcClient.right, rcClient.top, FXPT_MOVETO);\n\tpathCross.SetPoint(1, rcClient.left, rcClient.bottom, FXPT_LINETO);\n\tpathCross.SetPoint(2, rcClient.right, rcClient.bottom + rcClient.Height() * 0.5f, FXPT_MOVETO);\n\tpathCross.SetPoint(3, rcClient.left + rcClient.Width() * 0.5f, rcClient.bottom, FXPT_LINETO);\n\t\n\tpDevice->DrawPath(&pathCross, pUser2Device, &gsd, \n\t\t0, CPWL_Utils::PWLColorToFXColor(GetTextColor(),this->GetTransparency()), FXFILL_ALTERNATE);\n}\n\n/* --------------------------------- CPWL_Note_Icon ---------------------------------- */\n\nCPWL_Note_Icon::CPWL_Note_Icon() : m_nType(0)\n{\n}\n\nCPWL_Note_Icon::~CPWL_Note_Icon()\n{\n}\n\nvoid CPWL_Note_Icon::SetIconType(FX_INT32 nType)\n{\n\tm_nType = nType;\n}\n\nvoid CPWL_Note_Icon::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)\n{\n\tCPWL_Utils::DrawIconAppStream(pDevice, pUser2Device, m_nType, GetClientRect(), \n\t\tthis->GetBackgroundColor(), PWL_DEFAULT_BLACKCOLOR, this->GetTransparency());\n}\n\n/* --------------------------------- CPWL_Note_CloseBox ---------------------------------- */\n\nCPWL_Note_CloseBox::CPWL_Note_CloseBox() : m_bMouseDown(FALSE)\n{\n}\n\nCPWL_Note_CloseBox::~CPWL_Note_CloseBox()\n{\n}\n\nvoid CPWL_Note_CloseBox::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)\n{\n\tCPWL_Button::DrawThisAppearance(pDevice, pUser2Device);\n\n\tCPDF_Rect rcClient = this->GetClientRect();\n\trcClient = CPWL_Utils::DeflateRect(rcClient, 2.0f);\n\n\tCFX_GraphStateData gsd;\n\tgsd.m_LineWidth = 1.0f;\n\n\tCFX_PathData pathCross;\n\n\tif (m_bMouseDown)\n\t{\n\t\trcClient.left += 0.5f;\n\t\trcClient.right += 0.5f;\n\t\trcClient.top -= 0.5f;\n\t\trcClient.bottom -= 0.5f;\n\t}\n\n\tpathCross.SetPointCount(4);\n\tpathCross.SetPoint(0, rcClient.left, rcClient.bottom, FXPT_MOVETO);\n\tpathCross.SetPoint(1, rcClient.right, rcClient.top, FXPT_LINETO);\n\tpathCross.SetPoint(2, rcClient.left, rcClient.top, FXPT_MOVETO);\n\tpathCross.SetPoint(3, rcClient.right, rcClient.bottom, FXPT_LINETO);\n\t\n\tpDevice->DrawPath(&pathCross, pUser2Device, &gsd, \n\t\t0, CPWL_Utils::PWLColorToFXColor(GetTextColor(),this->GetTransparency()), FXFILL_ALTERNATE);\n}\n\nFX_BOOL CPWL_Note_CloseBox::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tSetBorderStyle(PBS_INSET);\n\tInvalidateRect(NULL);\n\n\tm_bMouseDown = TRUE;\n\n\treturn CPWL_Button::OnLButtonDown(point,nFlag);\n}\n\nFX_BOOL\tCPWL_Note_CloseBox::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tm_bMouseDown = FALSE;\n\n\tSetBorderStyle(PBS_BEVELED);\n\tInvalidateRect(NULL);\n\n\treturn CPWL_Button::OnLButtonUp(point,nFlag);\n}\n\n/* ------------------------------ CPWL_Note_Contents ------------------------------- */\n\nCPWL_Note_Contents::CPWL_Note_Contents() : m_pEdit(NULL)\n{\n}\n\nCPWL_Note_Contents::~CPWL_Note_Contents()\n{\n}\n\nCFX_ByteString CPWL_Note_Contents::GetClassName() const\n{\n\treturn \"CPWL_Note_Contents\";\n}\n\nvoid CPWL_Note_Contents::CreateChildWnd(const PWL_CREATEPARAM & cp)\n{\n\tm_pEdit = new CPWL_Note_Edit;\n\tPWL_CREATEPARAM ecp = cp;\n\tecp.pParentWnd = this;\n\tecp.dwFlags = PWS_VISIBLE | PWS_CHILD | PES_MULTILINE | PES_AUTORETURN | PES_TEXTOVERFLOW | PES_UNDO | PES_SPELLCHECK;\n\n\tm_pEdit->EnableNotify(FALSE);\n\tm_pEdit->Create(ecp);\n\tm_pEdit->EnableNotify(TRUE);\n}\n\nvoid CPWL_Note_Contents::SetText(const CFX_WideString& sText)\n{\n\tif (m_pEdit)\n\t{\n\t\tm_pEdit->EnableNotify(FALSE);\n\t\tm_pEdit->SetText(sText);\n\t\tm_pEdit->EnableNotify(TRUE);\n\t\tOnNotify(m_pEdit, PNM_NOTEEDITCHANGED, 0, 0);\t\t\n\t}\n}\n\nCFX_WideString CPWL_Note_Contents::GetText() const\n{\n\tif (m_pEdit)\n\t\treturn m_pEdit->GetText();\n\n\treturn L\"\";\n}\n\nCPWL_NoteItem* CPWL_Note_Contents::CreateSubItem()\n{\n\tCPWL_NoteItem* pNoteItem = new CPWL_NoteItem;\n\tPWL_CREATEPARAM icp = this->GetCreationParam();\n\ticp.pParentWnd = this;\n\ticp.dwFlags =  PWS_CHILD | PWS_VISIBLE | PWS_BACKGROUND;\n\tpNoteItem->Create(icp);\n\n\tpNoteItem->OnCreateNoteItem();\n\t\n\tpNoteItem->ResetSubjectName(m_aChildren.GetSize() - 1);\n\n\tFX_SYSTEMTIME st;\n\tif (IFX_SystemHandler* pSH = this->GetSystemHandler())\n\t\tst = pSH->GetLocalTime();\n\tpNoteItem->SetDateTime(st);\n\n\tpNoteItem->SetContents(L\"\");\n\n\tthis->OnNotify(pNoteItem, PNM_NOTEEDITCHANGED, 0, 0);\t\n\n\treturn pNoteItem;\n}\n\nFX_INT32 CPWL_Note_Contents::CountSubItems() const\n{\n\treturn m_aChildren.GetSize() - 1;\n}\n\nIPWL_NoteItem* CPWL_Note_Contents::GetSubItems(FX_INT32 index) const\n{\n\tFX_INT32 nIndex = index + 1;\n\n\tif (nIndex > 0 && nIndex < m_aChildren.GetSize())\n\t\tif (CPWL_Wnd* pChild = m_aChildren.GetAt(nIndex))\n\t\t{\n\t\t\tASSERT(pChild->GetClassName() == \"CPWL_NoteItem\");\n\t\t\tCPWL_NoteItem* pItem = (CPWL_NoteItem*)pChild;\n\t\t\treturn pItem;\n\t\t}\n\treturn NULL;\n}\n\nvoid CPWL_Note_Contents::DeleteSubItem(IPWL_NoteItem* pNoteItem)\n{\n\tFX_INT32 nIndex = this->GetItemIndex((CPWL_NoteItem*)pNoteItem);\n\n\tif (nIndex > 0)\n\t{\n\t\tif (CPWL_NoteItem* pPWLNoteItem = (CPWL_NoteItem*)pNoteItem)\n\t\t{\n\t\t\tpPWLNoteItem->KillFocus();\n\t\t\tpPWLNoteItem->Destroy();\n\t\t\tdelete pPWLNoteItem;\n\t\t}\n\n\t\tfor (FX_INT32 i=nIndex,sz=m_aChildren.GetSize(); i<sz; i++)\n\t\t{\n\t\t\tif (CPWL_Wnd* pChild = m_aChildren.GetAt(i))\n\t\t\t{\n\t\t\t\tASSERT(pChild->GetClassName() == \"CPWL_NoteItem\");\n\t\t\t\tCPWL_NoteItem* pItem = (CPWL_NoteItem*)pChild;\n\t\t\t\tpItem->ResetSubjectName(i);\n\t\t\t}\n\t\t}\n\n\t\tthis->OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0);\n\t}\n}\n\nIPWL_NoteItem* CPWL_Note_Contents::GetHitNoteItem(const CPDF_Point& point)\n{\n\tCPDF_Point pt = this->ParentToChild(point);\n\n\tfor (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\n\t{\n\t\tif (CPWL_Wnd* pChild = m_aChildren.GetAt(i))\n\t\t{\n\t\t\tif (pChild->GetClassName() == \"CPWL_NoteItem\")\n\t\t\t{\n\t\t\t\tCPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pChild;\n\t\t\t\tif (IPWL_NoteItem* pRet = pNoteItem->GetHitNoteItem(pt))\n\t\t\t\t\treturn pRet;\n\t\t\t}\n\t\t}\n\t}\n\treturn NULL;\n}\n\nvoid CPWL_Note_Contents::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)\n{\n\tswitch (msg)\n\t{\n\tcase PNM_NOTEEDITCHANGED:\n\t\t{\n\t\t\tFX_INT32 nIndex = this->GetItemIndex(pWnd);\n\t\t\tif (nIndex < 0) nIndex = 0;\n\n\t\t\tm_pEdit->EnableNotify(FALSE);\t\n\t\t\tthis->ResetContent(nIndex);\n\t\t\tm_pEdit->EnableNotify(TRUE);\n\n\t\t\tfor (FX_INT32 i=nIndex+1, sz=m_aChildren.GetSize(); i<sz; i++)\n\t\t\t{\n\t\t\t\tif (CPWL_Wnd* pChild = m_aChildren.GetAt(i))\n\t\t\t\t\tpChild->OnNotify(this, PNM_NOTERESET, 0, 0);\n\t\t\t}\n\n\t\t\tif (CPWL_Wnd * pParent = this->GetParentWindow())\n\t\t\t{\n\t\t\t\tpParent->OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0);\n\t\t\t}\n\t\t}\n\t\treturn;\n\tcase PNM_SCROLLWINDOW:\n\t\tthis->SetScrollPos(CPDF_Point(0.0f, *(FX_FLOAT*)lParam));\n\t\tthis->ResetFace();\n\t\tInvalidateRect(NULL);\n\t\treturn;\t\t\n\tcase PNM_SETCARETINFO:\n\t\tif (PWL_CARET_INFO * pInfo = (PWL_CARET_INFO*)wParam)\n\t\t{\n\t\t\tPWL_CARET_INFO newInfo = *pInfo;\n\t\t\tnewInfo.bVisible = TRUE;\n\t\t\tnewInfo.ptHead = this->ChildToParent(pInfo->ptHead);\n\t\t\tnewInfo.ptFoot = this->ChildToParent(pInfo->ptFoot);\n\n\t\t\tif (CPWL_Wnd * pParent = this->GetParentWindow())\n\t\t\t{\n\t\t\t\tpParent->OnNotify(this, PNM_SETCARETINFO, (FX_INTPTR)&newInfo, 0);\n\t\t\t}\n\t\t}\n\t\treturn;\n\tcase PNM_NOTERESET:\n\t\t{\n\t\t\tm_pEdit->EnableNotify(FALSE);\t\n\t\t\tthis->ResetContent(0);\n\t\t\tm_pEdit->EnableNotify(TRUE);\n\n\t\t\tfor (FX_INT32 i=1, sz=m_aChildren.GetSize(); i<sz; i++)\n\t\t\t{\n\t\t\t\tif (CPWL_Wnd* pChild = m_aChildren.GetAt(i))\n\t\t\t\t\tpChild->OnNotify(this, PNM_NOTERESET, 0, 0);\n\t\t\t}\t\n\n\t\t\tm_pEdit->EnableNotify(FALSE);\t\n\t\t\tthis->ResetContent(0);\n\t\t\tm_pEdit->EnableNotify(TRUE);\n\t\t}\n\t\treturn;\n\t}\n\n\tCPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam);\n}\n\nFX_BOOL\tCPWL_Note_Contents::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tif (CPWL_Wnd::OnLButtonDown(point,nFlag)) return TRUE;\n\n\tif (!m_pEdit->IsFocused())\n\t{\n\t\tm_pEdit->SetFocus();\n\t}\n\n\treturn TRUE;\n}\n\nvoid CPWL_Note_Contents::SetEditFocus(FX_BOOL bLast)\n{\n\tif (!m_pEdit->IsFocused())\n\t{\n\t\tm_pEdit->SetFocus();\n\t\tm_pEdit->SetCaret(bLast ? m_pEdit->GetTotalWords() : 0);\n\t}\n}\n\nCPWL_Edit* CPWL_Note_Contents::GetEdit() const\n{\n\treturn m_pEdit;\n}\n\nvoid CPWL_Note_Contents::EnableModify(FX_BOOL bEnabled)\n{\n\tif (!bEnabled)\n\t\tm_pEdit->AddFlag(PWS_READONLY);\n\telse\n\t\tm_pEdit->RemoveFlag(PWS_READONLY);\n\n\tfor (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\n\t{\n\t\tif (CPWL_Wnd* pChild = m_aChildren.GetAt(i))\n\t\t{\n\t\t\tif (pChild->GetClassName() == \"CPWL_NoteItem\")\n\t\t\t{\n\t\t\t\tCPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pChild;\n\t\t\t\tpNoteItem->EnableModify(bEnabled);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid CPWL_Note_Contents::EnableRead(FX_BOOL bEnabled)\n{\n\tif (!bEnabled)\n\t\tm_pEdit->AddFlag(PES_NOREAD);\n\telse\n\t\tm_pEdit->RemoveFlag(PES_NOREAD);\n\n\tfor (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\n\t{\n\t\tif (CPWL_Wnd* pChild = m_aChildren.GetAt(i))\n\t\t{\n\t\t\tif (pChild->GetClassName() == \"CPWL_NoteItem\")\n\t\t\t{\n\t\t\t\tCPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pChild;\n\t\t\t\tpNoteItem->EnableRead(bEnabled);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/* ---------------------------------- CPWL_NoteItem ---------------------------------- */\n\nCPWL_NoteItem::CPWL_NoteItem() :\n\tm_pPrivateData(NULL),\n\tm_pSubject(NULL),\n\tm_pDateTime(NULL),\n\tm_pContents(NULL),\n\tm_sAuthor(L\"\"),\n\tm_fOldItemHeight(0.0f),\n\tm_bSizeChanged(FALSE),\n\tm_bAllowModify(TRUE)\n{\n}\n\nCPWL_NoteItem::~CPWL_NoteItem()\n{\n}\n\nCFX_ByteString CPWL_NoteItem::GetClassName() const\n{\n\treturn \"CPWL_NoteItem\";\n}\n\nvoid CPWL_NoteItem::CreateChildWnd(const PWL_CREATEPARAM & cp)\n{\n\tCPWL_Color sTextColor;\n\n\tif (CPWL_Utils::IsBlackOrWhite(this->GetBackgroundColor()))\n\t\tsTextColor = PWL_DEFAULT_WHITECOLOR;\n\telse\n\t\tsTextColor = PWL_DEFAULT_BLACKCOLOR;\n\n\tm_pSubject = new CPWL_Label;\n\tPWL_CREATEPARAM scp = cp;\n\tscp.pParentWnd = this;\n\tscp.dwFlags = PWS_VISIBLE | PWS_CHILD | PES_LEFT | PES_TOP;\n\tscp.sTextColor = sTextColor;\n\tm_pSubject->Create(scp);\n\n\tm_pDateTime = new CPWL_Label;\n\tPWL_CREATEPARAM dcp = cp;\n\tdcp.pParentWnd = this;\n\tdcp.dwFlags = PWS_VISIBLE | PWS_CHILD | PES_RIGHT | PES_TOP;\n\tdcp.sTextColor = sTextColor;\n\tm_pDateTime->Create(dcp);\n\n\tm_pContents = new CPWL_Note_Contents;\n\tPWL_CREATEPARAM ccp = cp;\n\tccp.pParentWnd = this;\n\t//ccp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR;\n\tccp.sBackgroundColor = CPWL_Color(COLORTYPE_RGB, 240/255.0f, 240/255.0f, 240/255.0f);\n\tccp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BACKGROUND;\n\tm_pContents->Create(ccp);\n\tm_pContents->SetItemSpace(POPUP_ITEM_SPACE);\n\tm_pContents->SetTopSpace(POPUP_ITEM_SPACE);\n\tm_pContents->SetBottomSpace(POPUP_ITEM_SPACE);\n}\n\nvoid CPWL_NoteItem::RePosChildWnd()\n{\n\tif (this->IsValid())\n\t{\n\t\tASSERT(m_pSubject != NULL);\n\t\tASSERT(m_pDateTime != NULL);\n\t\tASSERT(m_pContents != NULL);\n\n\t\tCPDF_Rect rcClient = GetClientRect();\n\n\t\tCPDF_Rect rcSubject = rcClient;\n\t\trcSubject.left += POPUP_ITEM_TEXT_INDENT;\n\t\trcSubject.top = rcClient.top;\n\t\trcSubject.right = PWL_MIN(rcSubject.left + m_pSubject->GetContentRect().Width() + 1.0f, rcClient.right);\n\t\trcSubject.bottom = rcSubject.top - m_pSubject->GetContentRect().Height();\n\t\trcSubject.Normalize();\n\t\tm_pSubject->Move(rcSubject, TRUE, FALSE);\n\t\tm_pSubject->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcSubject));\n\n\t\tCPDF_Rect rcDate = rcClient;\n\t\trcDate.right -= POPUP_ITEM_TEXT_INDENT;\n\t\trcDate.left = PWL_MAX(rcDate.right - m_pDateTime->GetContentRect().Width() - 1.0f, rcSubject.right);\n\t\trcDate.bottom = rcDate.top - m_pDateTime->GetContentRect().Height();\n\t\trcDate.Normalize();\n\t\tm_pDateTime->Move(rcDate, TRUE, FALSE);\n\t\tm_pDateTime->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcDate));\n\n\t\tCPDF_Rect rcContents = rcClient;\n\t\trcContents.left += 1.0f;\n\t\trcContents.right -= 1.0f;\n\t\trcContents.top = rcDate.bottom - POPUP_ITEM_HEAD_BOTTOM;\n\t\trcContents.bottom += POPUP_ITEM_BOTTOMWIDTH;\n\t\trcContents.Normalize();\n\t\tm_pContents->Move(rcContents, TRUE, FALSE);\n\t\tm_pContents->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcContents));\n\t}\n\n\tSetClipRect(CPWL_Utils::InflateRect(GetWindowRect(),1.0f));\n}\n\nvoid CPWL_NoteItem::SetPrivateData(void* pData)\n{\n\tm_pPrivateData = pData;\n}\n\nvoid CPWL_NoteItem::SetBkColor(const CPWL_Color& color)\n{\n\tCPWL_Color sBK = color;\n\tthis->SetBackgroundColor(sBK);\n\n\tCPWL_Color sTextColor;\n\n\tif (CPWL_Utils::IsBlackOrWhite(sBK))\n\t\tsTextColor = PWL_DEFAULT_WHITECOLOR;\n\telse\n\t\tsTextColor = PWL_DEFAULT_BLACKCOLOR;\n\n\tthis->SetTextColor(sTextColor);\n\tif (m_pSubject)\n\t\tm_pSubject->SetTextColor(sTextColor);\n\tif (m_pDateTime)\n\t\tm_pDateTime->SetTextColor(sTextColor);\n\n\tthis->InvalidateRect(NULL);\n\n\tif (IPWL_NoteNotify* pNotify = GetNoteNotify())\n\t{\n\t\tpNotify->OnSetBkColor(this);\n\t}\n}\n\nvoid CPWL_NoteItem::SetSubjectName(const CFX_WideString& sName)\n{\n\tif (m_pSubject)\n\t{\n\t\tm_pSubject->SetText(sName);\t\n\t}\n\n\tif (IPWL_NoteNotify* pNotify = GetNoteNotify())\n\t{\n\t\tpNotify->OnSetSubjectName(this);\n\t}\n}\n\nvoid CPWL_NoteItem::SetAuthorName(const CFX_WideString& sName)\n{\n\tm_sAuthor = sName;\n\tResetSubjectName(-1);\t\n\n\tif (IPWL_NoteNotify* pNotify = GetNoteNotify())\n\t{\n\t\tpNotify->OnSetAuthorName(this);\n\t}\n}\n\nvoid CPWL_NoteItem::ResetSubjectName(FX_INT32 nItemIndex)\n{\n\tif (nItemIndex < 0)\n\t{\n\t\tif (CPWL_Wnd* pParent = this->GetParentWindow())\n\t\t{\n\t\t\tASSERT(pParent->GetClassName() == \"CPWL_Note_Contents\");\n\n\t\t\tCPWL_Note_Contents* pContents = (CPWL_Note_Contents*)pParent;\n\t\t\tnItemIndex = pContents->GetItemIndex(this);\n\t\t}\n\t}\n\n\tconst CPWL_Note* pNote = GetNote();\n\tASSERT(pNote != NULL);\n\n\tCFX_WideString sSubject;\n\tsSubject.Format(pNote->GetReplyString(), nItemIndex);\n\n\tif (!m_sAuthor.IsEmpty())\n\t{\n\t\t\n\t\tsSubject += L\" - \";\n\t\tsSubject += m_sAuthor;\n\t}\n\tthis->SetSubjectName(sSubject);\n\tthis->RePosChildWnd();\n}\n\nvoid CPWL_NoteItem::SetDateTime(FX_SYSTEMTIME time)\n{\n\tm_dtNote = time;\n\t\n\tCFX_WideString swTime;\n\tswTime.Format((FX_LPCWSTR)L\"%04d-%02d-%02d %02d:%02d:%02d\", time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond);\n\tif (m_pDateTime)\n\t{\n\t\tm_pDateTime->SetText(swTime);\n\t}\n\n\tthis->RePosChildWnd();\n\n\tif (IPWL_NoteNotify* pNotify = GetNoteNotify())\n\t{\n\t\tpNotify->OnSetDateTime(this);\n\t}\n}\n\nvoid CPWL_NoteItem::SetContents(const CFX_WideString& sContents)\n{\n\tif (m_pContents)\n\t{\n\t\tm_pContents->SetText(sContents);\n\t}\n\n\tif (IPWL_NoteNotify* pNotify = GetNoteNotify())\n\t{\n\t\tpNotify->OnSetContents(this);\n\t}\n}\n\nCPWL_NoteItem* CPWL_NoteItem::GetParentNoteItem() const\n{\n\tif (CPWL_Wnd* pParent = this->GetParentWindow())\n\t{\n\t\tif (CPWL_Wnd* pGrand = pParent->GetParentWindow())\n\t\t{\n\t\t\tASSERT(pGrand->GetClassName() == \"CPWL_NoteItem\");\n\t\t\treturn (CPWL_NoteItem*)pGrand;\n\t\t}\n\t}\n\n\treturn NULL;\n}\n\nIPWL_NoteItem* CPWL_NoteItem::GetParentItem() const\n{\n\treturn GetParentNoteItem();\n}\n\nCPWL_Edit* CPWL_NoteItem::GetEdit() const\n{\n\tif (m_pContents)\n\t\treturn m_pContents->GetEdit();\n\treturn NULL;\n}\n\nvoid* CPWL_NoteItem::GetPrivateData() const\n{\n\treturn m_pPrivateData;\n}\n\nCFX_WideString CPWL_NoteItem::GetAuthorName() const\n{\n\treturn m_sAuthor; \n}\n\nCPWL_Color CPWL_NoteItem::GetBkColor() const\n{\n\treturn this->GetBackgroundColor();\n}\n\nCFX_WideString CPWL_NoteItem::GetContents() const\n{\n\tif (m_pContents)\n\t\treturn m_pContents->GetText();\n\n\treturn L\"\";\n}\n\nFX_SYSTEMTIME CPWL_NoteItem::GetDateTime() const\n{\n\treturn m_dtNote;\n}\n\nCFX_WideString CPWL_NoteItem::GetSubjectName() const\n{\n\tif (m_pSubject)\n\t\treturn m_pSubject->GetText();\n\n\treturn L\"\";\n}\n\nCPWL_NoteItem* CPWL_NoteItem::CreateNoteItem()\n{\n\tif (m_pContents)\n\t\treturn m_pContents->CreateSubItem();\n\n\treturn NULL;\n}\n\nIPWL_NoteItem* CPWL_NoteItem::CreateSubItem()\n{\n\treturn CreateNoteItem();\n}\n\nFX_INT32 CPWL_NoteItem::CountSubItems() const\n{\n\tif (m_pContents)\n\t\treturn m_pContents->CountSubItems();\n\n\treturn 0;\n}\n\nIPWL_NoteItem* CPWL_NoteItem::GetSubItems(FX_INT32 index) const\n{\n\tif (m_pContents)\n\t\treturn m_pContents->GetSubItems(index);\n\n\treturn NULL;\n}\n\nvoid CPWL_NoteItem::DeleteSubItem(IPWL_NoteItem* pNoteItem)\n{\n\tthis->KillFocus();\n\n\tif (IPWL_NoteNotify* pNotify = GetNoteNotify())\n\t{\n\t\tpNotify->OnItemDelete(pNoteItem);\n\t}\n\n\tif (m_pContents)\n\t\tm_pContents->DeleteSubItem(pNoteItem);\n}\n\nIPWL_NoteItem* CPWL_NoteItem::GetHitNoteItem(const CPDF_Point& point)\n{\n\tCPDF_Point pt = this->ParentToChild(point);\n\n\tif (this->WndHitTest(pt))\n\t{\n\t\tif (m_pContents)\n\t\t{\n\t\t\tif (IPWL_NoteItem* pNoteItem = m_pContents->GetHitNoteItem(pt))\n\t\t\t\treturn pNoteItem;\n\t\t}\n\n\t\treturn this;\n\t}\n\n\treturn NULL;\n}\n\nIPWL_NoteItem* CPWL_NoteItem::GetFocusedNoteItem() const\n{\n\tif (const CPWL_Wnd* pWnd = this->GetFocused())\n\t{\n\t\tif (pWnd->GetClassName() == \"CPWL_Edit\")\n\t\t{\n\t\t\tif (CPWL_Wnd* pParent = pWnd->GetParentWindow())\n\t\t\t{\n\t\t\t\tASSERT(pParent->GetClassName() == \"CPWL_Note_Contents\");\n\t\t\t\t\n\t\t\t\tif (CPWL_Wnd* pGrand = pParent->GetParentWindow())\n\t\t\t\t{\n\t\t\t\t\tASSERT(pGrand->GetClassName() == \"CPWL_NoteItem\");\t\t\t\t\t\n\t\t\t\t\treturn (CPWL_NoteItem*)pGrand;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn NULL;\n}\n\nFX_FLOAT CPWL_NoteItem::GetItemHeight(FX_FLOAT fLimitWidth)\n{\n\tif (fLimitWidth > 0)\n\t{\n\t\tif (!m_bSizeChanged)\n\t\t\treturn m_fOldItemHeight;\n\n\t\tm_bSizeChanged = FALSE;\n\n\t\tASSERT(m_pSubject != NULL);\n\t\tASSERT(m_pDateTime != NULL);\n\t\tASSERT(m_pContents != NULL);\n\n\t\tFX_FLOAT fRet = m_pDateTime->GetContentRect().Height();\n\t\tFX_FLOAT fBorderWidth = (FX_FLOAT)this->GetBorderWidth();\n\t\tif (fLimitWidth > fBorderWidth * 2)\n\t\t\tfRet += m_pContents->GetContentsHeight(fLimitWidth - fBorderWidth * 2);\n\t\tfRet += POPUP_ITEM_HEAD_BOTTOM + POPUP_ITEM_BOTTOMWIDTH + fBorderWidth * 2;\n\n\t\treturn m_fOldItemHeight = fRet;\n\t}\n\n\treturn 0;\n}\n\nFX_FLOAT CPWL_NoteItem::GetItemLeftMargin()\n{\n\treturn POPUP_ITEM_SIDEMARGIN;\n}\n\nFX_FLOAT CPWL_NoteItem::GetItemRightMargin()\n{\n\treturn POPUP_ITEM_SIDEMARGIN;\n}\n\nFX_BOOL\tCPWL_NoteItem::OnLButtonDown(const CPDF_Point& point, FX_DWORD nFlag)\n{\n\tif (!m_pContents->WndHitTest(m_pContents->ParentToChild(point)))\n\t{\n\t\tSetNoteFocus(FALSE);\n\t}\n\n\tCPWL_Wnd::OnLButtonDown(point,nFlag);\n\n\treturn TRUE;\n}\n\nFX_BOOL\tCPWL_NoteItem::OnRButtonUp(const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tif (!m_pContents->WndHitTest(m_pContents->ParentToChild(point)))\n\t{\n\t\tSetNoteFocus(FALSE);\n\t\tPopupNoteItemMenu(point);\n\n\t\treturn TRUE;\n\t}\n\n\treturn CPWL_Wnd::OnRButtonUp(point,nFlag);\n}\n\nvoid CPWL_NoteItem::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)\n{\n\tswitch (msg)\n\t{\n\tcase PNM_NOTEEDITCHANGED:\t\n\t\tm_bSizeChanged = TRUE;\n\n\t\tif (CPWL_Wnd* pParent = this->GetParentWindow())\n\t\t{\n\t\t\tpParent->OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0);\n\t\t}\n\t\treturn;\t\n\tcase PNM_SETCARETINFO:\n\t\tif (PWL_CARET_INFO * pInfo = (PWL_CARET_INFO*)wParam)\n\t\t{\n\t\t\tPWL_CARET_INFO newInfo = *pInfo;\n\t\t\tnewInfo.bVisible = TRUE;\n\t\t\tnewInfo.ptHead = this->ChildToParent(pInfo->ptHead);\n\t\t\tnewInfo.ptFoot = this->ChildToParent(pInfo->ptFoot);\n\n\t\t\tif (CPWL_Wnd * pParent = this->GetParentWindow())\n\t\t\t{\n\t\t\t\tpParent->OnNotify(this, PNM_SETCARETINFO, (FX_INTPTR)&newInfo, 0);\n\t\t\t}\n\t\t}\n\t\treturn;\n\tcase PNM_NOTERESET:\n\t\tm_bSizeChanged = TRUE;\n\t\tm_pContents->OnNotify(this, PNM_NOTERESET, 0, 0);\n\t\t\n\t\treturn;\n\t}\n\n\tCPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam);\n}\n\nvoid CPWL_NoteItem::PopupNoteItemMenu(const CPDF_Point& point)\n{\n\tif (IPWL_NoteNotify* pNotify = GetNoteNotify())\n\t{\n\t\tFX_INT32 x,y;\n\t\tPWLtoWnd(point, x, y);\n\t\tif (IFX_SystemHandler* pSH = GetSystemHandler())\n\t\t\tpSH->ClientToScreen(GetAttachedHWnd(), x, y);\n\t\tpNotify->OnPopupMenu(this, x, y);\n\t}\n}\n\nconst CPWL_Note* CPWL_NoteItem::GetNote() const\n{\n\tif (const CPWL_Wnd* pRoot = this->GetRootWnd())\n\t{\n\t\tASSERT(pRoot->GetClassName() == \"CPWL_NoteItem\");\n\t\tCPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pRoot;\n\t\tif (pNoteItem->IsTopItem())\n\t\t{\n\t\t\treturn (CPWL_Note*)pNoteItem;\n\t\t}\n\t}\n\n\treturn NULL;\n}\n\nIPWL_NoteNotify* CPWL_NoteItem::GetNoteNotify() const\n{\n\tif (const CPWL_Note* pNote = GetNote())\n\t\treturn pNote->GetNoteNotify();\n\n\treturn NULL;\n}\n\nvoid CPWL_NoteItem::OnCreateNoteItem()\n{\n\tif (IPWL_NoteNotify* pNotify = GetNoteNotify())\n\t{\n\t\tpNotify->OnItemCreate(this);\n\t}\n}\n\nvoid CPWL_NoteItem::OnContentsValidate()\n{\n\tif (IPWL_NoteNotify* pNotify = GetNoteNotify())\n\t{\n\t\tpNotify->OnSetContents(this);\n\t}\n}\n\nvoid CPWL_NoteItem::SetNoteFocus(FX_BOOL bLast)\n{\n\tm_pContents->SetEditFocus(bLast);\n}\n\nvoid CPWL_NoteItem::EnableModify(FX_BOOL bEnabled)\n{\n\tm_pContents->EnableModify(bEnabled);\n\tm_bAllowModify = bEnabled;\n}\n\nvoid CPWL_NoteItem::EnableRead(FX_BOOL bEnabled)\n{\n\tm_pContents->EnableRead(bEnabled);\n}\n\n/* ---------------------------------- CPWL_Note ---------------------------------- */\n\nCPWL_Note::CPWL_Note(IPopup_Note* pPopupNote, IPWL_NoteNotify* pNoteNotify, IPWL_NoteHandler* pNoteHandler) : \n\tm_pAuthor(NULL),\n\tm_pIcon(NULL),\n\tm_pCloseBox(NULL),\n\tm_pContentsBar(NULL),\n\tm_pLBBox(NULL),\n\tm_pRBBox(NULL),\n\tm_pOptions(NULL),\n\tm_bResizing(FALSE),\n\tm_rcCaption(0,0,0,0),\n\tm_pNoteNotify(pNoteNotify),\n\tm_bEnalbleNotify(TRUE),\n\tm_pPopupNote(pPopupNote),\n\tm_pNoteHandler(pNoteHandler)\n{\n}\n\nCPWL_Note::~CPWL_Note()\n{\n}\n\nIPWL_NoteItem* CPWL_Note::Reply()\n{\n\treturn CreateNoteItem();\n}\n\nvoid CPWL_Note::EnableNotify(FX_BOOL bEnabled)\n{\n\tm_bEnalbleNotify = bEnabled;\n}\n\nvoid CPWL_Note::RePosChildWnd()\n{\n\tRePosNoteChildren();\n\tm_pContents->OnNotify(this, PNM_NOTERESET, 0, 0);\n\tResetScrollBar();\n\tm_pContents->OnNotify(this, PNM_NOTERESET, 0, 0);\n\tthis->OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0);\n\t//ͬ\n\tif (const CPWL_Wnd* pWnd = this->GetFocused())\n\t{\n\t\tif (pWnd->GetClassName() == \"CPWL_Edit\")\n\t\t{\n\t\t\tCPWL_Edit* pEdit = (CPWL_Edit*)pWnd;\n\t\t\tpEdit->SetCaret(pEdit->GetCaret());\n\t\t}\n\t}\n\t//CPDF_Point ptNew = m_pContents->GetScrollPos();\n\t//m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptNew.y);\n}\n\nFX_BOOL CPWL_Note::ResetScrollBar()\n{\n\tFX_BOOL bScrollChanged = FALSE;\n\n\tif (ScrollBarShouldVisible())\n\t{\n\t\tif (!m_pContentsBar->IsVisible())\n\t\t{\n\t\t\tm_pContentsBar->SetVisible(TRUE);\n\t\t\tif (m_pContentsBar->IsVisible())\n\t\t\t{\n\t\t\t\tm_pContentsBar->InvalidateRect(NULL);\n\t\t\t\tbScrollChanged = TRUE;\n\t\t\t}\n\t\t}\t\n\t}\n\telse\n\t{\n\t\tif (m_pContentsBar->IsVisible())\n\t\t{\n\t\t\tm_pContentsBar->SetVisible(FALSE);\n\t\t\tm_pContentsBar->InvalidateRect(NULL);\n\n\t\t\tbScrollChanged = TRUE;\n\t\t}\n\t}\n\n\tif (bScrollChanged)\n\t{\n\t\tCPDF_Rect rcNote = this->GetClientRect();\n\t\tCPDF_Rect rcContents = m_pContents->GetWindowRect();\n\t\trcContents.right = rcNote.right - 3.0f;\n\t\tif (m_pContentsBar->IsVisible())\n\t\t\trcContents.right -= PWL_SCROLLBAR_WIDTH;\n\t\tm_pContents->Move(rcContents, TRUE, TRUE);\n\t\tm_pContents->SetScrollPos(CPDF_Point(0.0f,0.0f));\n\t\tm_pContents->InvalidateRect(NULL);\n\t}\n\n\treturn bScrollChanged;\n}\n\nFX_BOOL CPWL_Note::ScrollBarShouldVisible()\n{\n\tCPDF_Rect rcContentsFact = m_pContents->GetScrollArea();\n\tCPDF_Rect rcContentsClient = m_pContents->GetClientRect();\n\n\treturn rcContentsFact.Height() > rcContentsClient.Height();\t\n}\n\nvoid CPWL_Note::SetOptionsText(const CFX_WideString& sText)\n{\n\tif (m_pOptions)\n\t\tm_pOptions->SetText(sText);\n\n\tRePosNoteChildren();\n}\n\nvoid CPWL_Note::RePosNoteChildren()\n{\n\tif (m_bResizing) return;\n\n\tm_bResizing = TRUE;\n\n\tif (this->IsValid())\n\t{\n\t\tASSERT(m_pSubject != NULL);\n\t\tASSERT(m_pDateTime != NULL);\n\t\tASSERT(m_pContents != NULL);\n\t\tASSERT(m_pAuthor != NULL);\n\t\tASSERT(m_pCloseBox != NULL);\n\t\tASSERT(m_pIcon != NULL);\n\t\tASSERT(m_pLBBox != NULL);\n\t\tASSERT(m_pRBBox != NULL);\n\t\tASSERT(m_pContentsBar != NULL);\n\t\tASSERT(m_pOptions != NULL);\n\n\t\tCPDF_Rect rcClient = GetClientRect();\n\n\t\tCPDF_Rect rcIcon = rcClient;\n\t\trcIcon.top -= 2.0f;\n\t\trcIcon.right = rcIcon.left + 14.0f;\n\t\trcIcon.bottom = rcIcon.top - 14.0f;\n\t\trcIcon.Normalize();\n\t\tm_pIcon->Move(rcIcon, TRUE, FALSE);\n\t\tm_pIcon->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcIcon));\n\n\t\tCPDF_Rect rcCloseBox = rcClient;\n\t\trcCloseBox.right -= 1.0f;\n\t\trcCloseBox.top -= 1.0f;\n\t\trcCloseBox.left = rcCloseBox.right - 14.0f;\n\t\trcCloseBox.bottom = rcCloseBox.top - 14.0f;\n\t\trcCloseBox.Normalize();\n\t\tm_pCloseBox->Move(rcCloseBox, TRUE, FALSE);\n\t\tm_pCloseBox->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcCloseBox));\n\n\t\tCPDF_Rect rcDate = rcClient;\n\t\trcDate.right = rcCloseBox.left - POPUP_ITEM_TEXT_INDENT;\n\t\trcDate.left = PWL_MAX(rcDate.right - m_pDateTime->GetContentRect().Width() - 1.0f, rcIcon.right + 1.0f);\n\t\trcDate.top = rcClient.top - 2.0f;\n\t\trcDate.bottom = rcDate.top - m_pDateTime->GetContentRect().Height();\n\t\trcDate.Normalize();\n\t\tm_pDateTime->Move(rcDate, TRUE, FALSE);\n\t\tm_pDateTime->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcDate));\n\n\t\tCPDF_Rect rcSubject = rcClient;\n\t\trcSubject.top = rcClient.top - 2.0f;\n\t\trcSubject.left = rcIcon.right + POPUP_ITEM_TEXT_INDENT;\n\t\trcSubject.right = PWL_MIN(rcSubject.left + m_pSubject->GetContentRect().Width() + 1.0f, rcDate.left - 1.0f);\n\t\trcSubject.bottom = rcSubject.top - m_pSubject->GetContentRect().Height();\n\t\trcSubject.Normalize();\n\t\tm_pSubject->Move(rcSubject, TRUE, FALSE);\t\n\t\tm_pSubject->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcSubject));\n\n\t\tCPDF_Rect rcOptions = rcClient;\n\t\trcOptions.left = PWL_MAX(rcOptions.right - m_pOptions->GetContentRect().Width(), rcIcon.right + 1.0f);\n\t\trcOptions.top = rcSubject.bottom - 4.0f;\n\t\trcOptions.bottom = rcOptions.top - m_pOptions->GetContentRect().Height();\n\t\trcOptions.Normalize();\n\t\tm_pOptions->Move(rcOptions, TRUE, FALSE);\n\t\tm_pOptions->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcOptions));\n\n\t\tCPDF_Rect rcAuthor = rcClient;\n\t\trcAuthor.top = rcSubject.bottom - 4.0f;\n\t\trcAuthor.left = rcSubject.left;\n\t\trcAuthor.right = PWL_MIN(rcSubject.left + m_pAuthor->GetContentRect().Width() + 1.0f, rcOptions.left - 1.0f);\n\t\trcAuthor.bottom = rcAuthor.top - m_pAuthor->GetContentRect().Height();\n\t\trcAuthor.Normalize();\n\t\tm_pAuthor->Move(rcAuthor, TRUE, FALSE);\n\t\tm_pAuthor->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcAuthor));\n\n\t\tCPDF_Rect rcLBBox = rcClient;\n\t\trcLBBox.top = rcLBBox.bottom + 7.0f;\n\t\trcLBBox.right = rcLBBox.left + 7.0f;\n\t\trcLBBox.Normalize();\n\t\tm_pLBBox->Move(rcLBBox, TRUE, FALSE);\n\t\tm_pLBBox->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcLBBox));\n\n\t\tCPDF_Rect rcRBBox = rcClient;\n\t\trcRBBox.top = rcRBBox.bottom + 7.0f;\n\t\trcRBBox.left = rcRBBox.right - 7.0f;\n\t\trcRBBox.Normalize();\n\t\tm_pRBBox->Move(rcRBBox, TRUE, FALSE);\n\t\tm_pRBBox->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcRBBox));\n\n\t\tCPDF_Rect rcContents = rcClient;\n\t\trcContents.top = rcAuthor.bottom - POPUP_ITEM_HEAD_BOTTOM;\n\t\trcContents.left += 3.0f;\n\t\trcContents.right -= 3.0f;\n\t\tif (m_pContentsBar->IsVisible())\n\t\t\trcContents.right -= PWL_SCROLLBAR_WIDTH;\n\t\trcContents.bottom += 14.0f;\n\t\trcContents.Normalize();\n\t\tm_pContents->Move(rcContents, FALSE, FALSE);\n\t\tm_pContents->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcContents));\n\n\t\tCPDF_Rect rcContentsBar = rcContents;\n\t\trcContentsBar.right = rcClient.right - 3.0f;\n\t\trcContentsBar.left = rcContentsBar.right - PWL_SCROLLBAR_WIDTH;\n\t\trcContentsBar.Normalize();\n\t\tm_pContentsBar->Move(rcContentsBar, TRUE, FALSE);\n\t\t\n\t\tm_rcCaption = rcClient;\n\t\tm_rcCaption.bottom = rcContents.top;\n\t}\n\n\tm_bResizing = FALSE;\n}\n\n//0-normal / 1-caption / 2-leftbottom corner / 3-rightbottom corner / 4-close / 5-options \nFX_INT32 CPWL_Note::NoteHitTest(const CPDF_Point& point) const\n{\n\tASSERT(m_pSubject != NULL);\n\tASSERT(m_pDateTime != NULL);\n\tASSERT(m_pContents != NULL);\n\tASSERT(m_pAuthor != NULL);\n\tASSERT(m_pIcon != NULL);\n\tASSERT(m_pContentsBar != NULL);\n\n\tASSERT(m_pCloseBox != NULL);\n\tASSERT(m_pLBBox != NULL);\n\tASSERT(m_pRBBox != NULL);\n\tASSERT(m_pOptions != NULL);\n\n\tGetClientRect();\n\n\tif (m_pSubject->WndHitTest(m_pSubject->ParentToChild(point))) return 1;\n\tif (m_pDateTime->WndHitTest(m_pDateTime->ParentToChild(point))) return 1;\n\tif (m_pAuthor->WndHitTest(m_pAuthor->ParentToChild(point))) return 1;\n\tif (m_pIcon->WndHitTest(m_pIcon->ParentToChild(point))) return 1;\n\n\tif (m_pContents->WndHitTest(m_pContents->ParentToChild(point))) return 0;\n\tif (m_pContentsBar->WndHitTest(m_pContentsBar->ParentToChild(point))) return 0;\n\n\tif (m_pCloseBox->WndHitTest(m_pCloseBox->ParentToChild(point))) return 4;\n\tif (m_pLBBox->WndHitTest(m_pLBBox->ParentToChild(point))) return 2;\n\tif (m_pRBBox->WndHitTest(m_pRBBox->ParentToChild(point))) return 3;\n\tif (m_pOptions->WndHitTest(m_pOptions->ParentToChild(point))) return 5;\n\n\treturn 1;\n}\n\nvoid CPWL_Note::CreateChildWnd(const PWL_CREATEPARAM & cp)\n{\n\tCPWL_NoteItem::CreateChildWnd(cp);\n\n\tCPWL_Color sTextColor;\n\n\tif (CPWL_Utils::IsBlackOrWhite(this->GetBackgroundColor()))\n\t\tsTextColor = PWL_DEFAULT_WHITECOLOR;\n\telse\n\t\tsTextColor = PWL_DEFAULT_BLACKCOLOR;\n\n\tm_pAuthor = new CPWL_Label;\n\tPWL_CREATEPARAM acp = cp;\n\tacp.pParentWnd = this;\n\tacp.dwFlags = PWS_VISIBLE | PWS_CHILD | PES_LEFT | PES_TOP;\n\tacp.sTextColor = sTextColor;\n\tm_pAuthor->Create(acp);\t \n\n\tm_pCloseBox = new CPWL_Note_CloseBox;\n\tPWL_CREATEPARAM ccp = cp;\n\tccp.pParentWnd = this;\n\tccp.dwBorderWidth = 2;\n\tccp.nBorderStyle = PBS_BEVELED;\n\tccp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER;\n\tccp.sTextColor = sTextColor;\n\tm_pCloseBox->Create(ccp);\n\n\tm_pIcon = new CPWL_Note_Icon;\n\tPWL_CREATEPARAM icp = cp;\n\ticp.pParentWnd = this;\n\ticp.dwFlags = PWS_VISIBLE | PWS_CHILD;\n\tm_pIcon->Create(icp);\n\n\tm_pOptions = new CPWL_Note_Options;\n\tPWL_CREATEPARAM ocp = cp;\n\tocp.pParentWnd = this;\n\tocp.dwFlags = PWS_CHILD | PWS_VISIBLE;\n\tocp.sTextColor = sTextColor;\n\tm_pOptions->Create(ocp);\n\n\tm_pLBBox = new CPWL_Note_LBBox;\n\tPWL_CREATEPARAM lcp = cp;\n\tlcp.pParentWnd = this;\n\tlcp.dwFlags = PWS_VISIBLE | PWS_CHILD;\n\tlcp.eCursorType = FXCT_NESW;\n\tlcp.sTextColor = sTextColor;\n\tm_pLBBox->Create(lcp);\n\n\tm_pRBBox = new CPWL_Note_RBBox;\n\tPWL_CREATEPARAM rcp = cp;\n\trcp.pParentWnd = this;\n\trcp.dwFlags = PWS_VISIBLE | PWS_CHILD;\n\trcp.eCursorType = FXCT_NWSE;\n\trcp.sTextColor = sTextColor;\n\tm_pRBBox->Create(rcp);\n\n\tm_pContentsBar = new CPWL_ScrollBar(SBT_VSCROLL);\n\tPWL_CREATEPARAM scp = cp;\n\tscp.pParentWnd = this;\n\tscp.sBackgroundColor = CPWL_Color(COLORTYPE_RGB, 240/255.0f, 240/255.0f, 240/255.0f);\n\tscp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_BACKGROUND;\n\tm_pContentsBar->Create(scp);\n\tm_pContentsBar->SetNotifyForever(TRUE);\n}\n\nvoid CPWL_Note::SetSubjectName(const CFX_WideString& sName)\n{\n\tCPWL_NoteItem::SetSubjectName(sName);\n\tRePosChildWnd();\n}\n\nvoid CPWL_Note::SetAuthorName(const CFX_WideString& sName)\n{\n\tif (m_pAuthor)\n\t{\n\t\tm_pAuthor->SetText(sName);\n\t\tRePosChildWnd();\n\t}\n\n\tif (IPWL_NoteNotify* pNotify = GetNoteNotify())\n\t{\n\t\tpNotify->OnSetAuthorName(this);\n\t}\t\n}\n\nCFX_WideString CPWL_Note::GetAuthorName() const\n{\n\tif (m_pAuthor)\n\t\treturn m_pAuthor->GetText();\n\n\treturn L\"\";\n}\n\nFX_BOOL CPWL_Note::OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tCPDF_Point ptScroll = m_pContents->GetScrollPos();\n\tCPDF_Rect rcScroll = m_pContents->GetScrollArea();\n\tCPDF_Rect rcContents = m_pContents->GetClientRect();\n\n\tif (rcScroll.top - rcScroll.bottom > rcContents.Height())\n\t{\n\t\tCPDF_Point ptNew = ptScroll;\n\n\t\tif (zDelta > 0)\n\t\t\tptNew.y += 30;\n\t\telse\n\t\t\tptNew.y -= 30;\n\n\t\tif (ptNew.y > rcScroll.top)\n\t\t\tptNew.y = rcScroll.top;\n\t\tif (ptNew.y < rcScroll.bottom + rcContents.Height())\n\t\t\tptNew.y = rcScroll.bottom + rcContents.Height();\n\t\tif (ptNew.y < rcScroll.bottom)\n\t\t\tptNew.y = rcScroll.bottom;\n\n\t\tif (ptNew.y != ptScroll.y)\n\t\t{\n\t\t\tm_pContents->OnNotify(this, PNM_NOTERESET, 0, 0);\n\t\t\tm_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, (FX_INTPTR)&ptNew.y);\t\t\t\n\t\t\tm_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptNew.y);\n\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\treturn FALSE;\n}\n\nvoid CPWL_Note::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)\n{\n\tswitch (msg)\n\t{\n\tcase PNM_NOTEEDITCHANGED:\n\t\t{\n\t\t\tCPDF_Rect rcScroll = m_pContents->GetScrollArea();\n\t\t\t\n\n\t\t\tPWL_SCROLL_INFO sInfo;\n\t\t\tsInfo.fContentMin = rcScroll.bottom;\n\t\t\tsInfo.fContentMax = rcScroll.top;\n\t\t\tsInfo.fPlateWidth = m_pContents->GetClientRect().Height();\n\t\t\tsInfo.fSmallStep = 13.0f;\n\t\t\tsInfo.fBigStep = sInfo.fPlateWidth;\n\n\t\t\tif (FXSYS_memcmp(&m_OldScrollInfo, &sInfo, sizeof(PWL_SCROLL_INFO)) != 0)\n\t\t\t{\n\t\t\t\tFX_BOOL bScrollChanged = FALSE;\n\n\t\t\t\tif (lParam < 3) //ֹѭ mantis:15759\n\t\t\t\t{\n\t\t\t\t\tbScrollChanged = ResetScrollBar();\n\t\t\t\t\tif (bScrollChanged)\n\t\t\t\t\t{\n\t\t\t\t\t\tlParam++;\n\t\t\t\t\t\tm_pContents->OnNotify(this, PNM_NOTERESET, 0, 0);\n\t\t\t\t\t\tthis->OnNotify(this, PNM_NOTEEDITCHANGED, 0, lParam);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (!bScrollChanged)\n\t\t\t\t{\n\t\t\t\t\tif (m_pContentsBar->IsVisible())\n\t\t\t\t\t{\n\t\t\t\t\t\tm_pContentsBar->OnNotify(pWnd, PNM_SETSCROLLINFO, SBT_VSCROLL, (FX_INTPTR)&sInfo);\n\t\t\t\t\t\tm_OldScrollInfo = sInfo;\n\n\t\t\t\t\t\tCPDF_Point ptScroll = m_pContents->GetScrollPos();\n\t\t\t\t\t\tCPDF_Point ptOld = ptScroll;\n\n\t\t\t\t\t\tif (ptScroll.y > sInfo.fContentMax)\n\t\t\t\t\t\t\tptScroll.y = sInfo.fContentMax;\n\t\t\t\t\t\tif (ptScroll.y < sInfo.fContentMin + sInfo.fPlateWidth)\n\t\t\t\t\t\t\tptScroll.y = sInfo.fContentMin + sInfo.fPlateWidth;\n\t\t\t\t\t\tif (ptScroll.y < sInfo.fContentMin)\n\t\t\t\t\t\t\tptScroll.y = sInfo.fContentMin;\n\n\t\t\t\t\t\tif (ptOld.y != ptScroll.y)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tm_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptScroll.y);\n\t\t\t\t\t\t\tm_pContentsBar->InvalidateRect(NULL);\n\t\t\t\t\t\t\tm_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, (FX_INTPTR)&ptScroll.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tm_pContents->InvalidateRect(NULL);\n\n\t\treturn;\n\tcase PNM_SCROLLWINDOW:\n\t\tif (m_pContents)\n\t\t\tm_pContents->OnNotify(pWnd, msg, wParam, lParam);\n\t\treturn;\n\tcase PNM_SETSCROLLPOS:\n\t\tif (m_pContentsBar)\n\t\t\tm_pContentsBar->OnNotify(pWnd,PNM_SETSCROLLPOS,wParam,lParam);\n\t\treturn;\n\t}\n\n\tif (msg == PNM_SETCARETINFO && IsValid())\n\t{\n\t\tif (PWL_CARET_INFO * pInfo = (PWL_CARET_INFO*)wParam)\n\t\t{\n\t\t\tif (m_pContents)\n\t\t\t{\n\t\t\t\tCPDF_Rect rcClient = m_pContents->GetClientRect();\n\t\t\t\tif (pInfo->ptHead.y > rcClient.top)\n\t\t\t\t{\n\t\t\t\t\tCPDF_Point pt = m_pContents->OutToIn(pInfo->ptHead);\n\t\t\t\t\tm_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, (FX_INTPTR)&pt.y);\n\n\t\t\t\t\tCPDF_Point ptScroll = m_pContents->GetScrollPos();\n\t\t\t\t\tm_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptScroll.y);\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (pInfo->ptFoot.y < rcClient.bottom)\n\t\t\t\t{\n\t\t\t\t\tCPDF_Point pt = m_pContents->OutToIn(pInfo->ptFoot);\n\t\t\t\t\tpt.y += rcClient.Height();\n\t\t\t\t\tm_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, (FX_INTPTR)&pt.y);\n\n\t\t\t\t\tCPDF_Point ptScroll = m_pContents->GetScrollPos();\n\t\t\t\t\tm_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptScroll.y);\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tCPWL_NoteItem::OnNotify(pWnd, msg, wParam, lParam);\n}\n\nvoid CPWL_Note::SetBkColor(const CPWL_Color& color)\n{\n\tCPWL_NoteItem::SetBkColor(color);\n\n\tCPWL_Color sBK = color;\n\tCPWL_Color sTextColor;\n\tif (CPWL_Utils::IsBlackOrWhite(sBK))\n\t\tsTextColor = PWL_DEFAULT_WHITECOLOR;\n\telse\n\t\tsTextColor = PWL_DEFAULT_BLACKCOLOR;\n\n\tif (m_pCloseBox)\n\t\tm_pCloseBox->SetTextColor(sTextColor);\n\tif (m_pAuthor)\n\t\tm_pAuthor->SetTextColor(sTextColor);\n\tif (m_pOptions)\n\t\tm_pOptions->SetTextColor(sTextColor);\n\tif (m_pLBBox)\n\t\tm_pLBBox->SetTextColor(sTextColor);\n\tif (m_pRBBox)\n\t\tm_pRBBox->SetTextColor(sTextColor);\n}\n\nFX_BOOL\tCPWL_Note::OnLButtonDown(const CPDF_Point& point, FX_DWORD nFlag)\n{\n\tif (m_pOptions->WndHitTest(m_pOptions->ParentToChild(point)))\n\t{\n\t\tif (IPWL_NoteNotify* pNotify = this->GetNoteNotify())\n\t\t{\n\t\t\tFX_INT32 x, y;\n\t\t\tPWLtoWnd(point, x, y);\n\t\t\tif (IFX_SystemHandler* pSH = GetSystemHandler())\n\t\t\t\tpSH->ClientToScreen(GetAttachedHWnd(), x, y);\n\t\t\tthis->KillFocus();\n\t\t\tpNotify->OnPopupMenu(x, y);\n\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\treturn CPWL_Wnd::OnLButtonDown(point,nFlag);\n}\n\nFX_BOOL\tCPWL_Note::OnRButtonUp(const CPDF_Point & point, FX_DWORD nFlag)\n{\n\treturn CPWL_Wnd::OnRButtonUp(point,nFlag);\n}\n\nconst CPWL_Note* CPWL_Note::GetNote() const\n{\n\treturn this;\n}\n\nIPWL_NoteNotify* CPWL_Note::GetNoteNotify() const\n{\n\tif (m_bEnalbleNotify)\n\t\treturn m_pNoteNotify;\n\n\treturn NULL;\n}\n\nvoid CPWL_Note::SetIconType(FX_INT32 nType)\n{\n\tif (m_pIcon)\n\t\tm_pIcon->SetIconType(nType);\n}\n\nvoid CPWL_Note::EnableModify(FX_BOOL bEnabled)\n{\n\tm_pContents->EnableModify(bEnabled);\n}\n\nvoid CPWL_Note::EnableRead(FX_BOOL bEnabled)\n{\n\tm_pContents->EnableRead(bEnabled);\n}\n\nCFX_WideString CPWL_Note::GetReplyString() const\n{\n\treturn m_sReplyString;\n}\n\nvoid CPWL_Note::SetReplyString(const CFX_WideString& string)\n{\n\tm_sReplyString = string;\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/pdfwindow/PWL_ScrollBar.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/pdfwindow/PDFWindow.h\"\n#include \"../../include/pdfwindow/PWL_Wnd.h\"\n#include \"../../include/pdfwindow/PWL_ScrollBar.h\"\n#include \"../../include/pdfwindow/PWL_Utils.h\"\n\n#define IsFloatZero(f)\t\t\t\t\t\t((f) < 0.0001 && (f) > -0.0001)\n#define IsFloatBigger(fa,fb)\t\t\t\t((fa) > (fb) && !IsFloatZero((fa) - (fb)))\n#define IsFloatSmaller(fa,fb)\t\t\t\t((fa) < (fb) && !IsFloatZero((fa) - (fb)))\n#define IsFloatEqual(fa,fb)\t\t\t\t\tIsFloatZero((fa)-(fb))\n\n\n/* ------------------------------- PWL_FLOATRANGE ------------------------------- */\n\nPWL_FLOATRANGE::PWL_FLOATRANGE()\n{\n\tDefault();\n}\n\nPWL_FLOATRANGE::PWL_FLOATRANGE(FX_FLOAT min,FX_FLOAT max)\n{\n\tSet(min,max);\n}\n\nvoid PWL_FLOATRANGE::Default()\n{\n\tfMin = 0;\n\tfMax = 0;\n}\n\nvoid PWL_FLOATRANGE::Set(FX_FLOAT min,FX_FLOAT max)\n{\n\tif (min > max)\n\t{\n\t\tfMin = max;\n\t\tfMax = min;\n\t}\n\telse\n\t{\n\t\tfMin = min;\n\t\tfMax = max;\n\t}\n}\n\nFX_BOOL\tPWL_FLOATRANGE::In(FX_FLOAT x) const\n{\n\treturn (IsFloatBigger(x,fMin) || IsFloatEqual(x, fMin)) && \n\t\t(IsFloatSmaller(x, fMax) || IsFloatEqual(x, fMax));\n}\n\nFX_FLOAT PWL_FLOATRANGE::GetWidth() const\n{\n\treturn fMax - fMin;\n}\n\n/* ------------------------------- PWL_SCROLL_PRIVATEDATA ------------------------------- */\n\nPWL_SCROLL_PRIVATEDATA::PWL_SCROLL_PRIVATEDATA()\n{\n\tDefault();\n}\n\nvoid PWL_SCROLL_PRIVATEDATA::Default()\n{\n\tScrollRange.Default();\n\tfScrollPos = ScrollRange.fMin;\n\tfClientWidth = 0;\n\tfBigStep = 10;\n\tfSmallStep = 1;\n}\n\nvoid PWL_SCROLL_PRIVATEDATA::SetScrollRange(FX_FLOAT min,FX_FLOAT max)\n{\n\tScrollRange.Set(min,max);\n\n\tif (IsFloatSmaller(fScrollPos, ScrollRange.fMin))\n\t\tfScrollPos = ScrollRange.fMin;\n\tif (IsFloatBigger(fScrollPos, ScrollRange.fMax))\n\t\tfScrollPos = ScrollRange.fMax;\t\t\n}\n\nvoid PWL_SCROLL_PRIVATEDATA::SetClientWidth(FX_FLOAT width)\n{\n\tfClientWidth = width;\n}\n\nvoid PWL_SCROLL_PRIVATEDATA::SetSmallStep(FX_FLOAT step)\n{\n\tfSmallStep = step;\n}\n\nvoid PWL_SCROLL_PRIVATEDATA::SetBigStep(FX_FLOAT step)\n{\n\tfBigStep = step;\n}\n\nFX_BOOL PWL_SCROLL_PRIVATEDATA::SetPos(FX_FLOAT pos)\n{\n\tif (ScrollRange.In(pos))\n\t{\n\t\tfScrollPos = pos;\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}\n\nvoid PWL_SCROLL_PRIVATEDATA::AddSmall()\n{\n\tif (!SetPos(fScrollPos + fSmallStep))\n\t\tSetPos(ScrollRange.fMax);\n}\n\nvoid PWL_SCROLL_PRIVATEDATA::SubSmall()\n{\n\tif (!SetPos(fScrollPos - fSmallStep))\n\t\tSetPos(ScrollRange.fMin);\n}\n\nvoid PWL_SCROLL_PRIVATEDATA::AddBig()\n{\n\tif (!SetPos(fScrollPos + fBigStep))\n\t\tSetPos(ScrollRange.fMax);\t\t\n}\n\nvoid PWL_SCROLL_PRIVATEDATA::SubBig()\n{\n\tif (!SetPos(fScrollPos - fBigStep))\n\t\tSetPos(ScrollRange.fMin);\n}\n\n/* ------------------------------- CPWL_SBButton ------------------------------- */\n\nCPWL_SBButton::CPWL_SBButton(PWL_SCROLLBAR_TYPE eScrollBarType,PWL_SBBUTTON_TYPE eButtonType)\n{\n\tm_eScrollBarType = eScrollBarType;\n\tm_eSBButtonType = eButtonType;\n\n\tm_bMouseDown = FALSE;\n}\n\nCPWL_SBButton::~CPWL_SBButton()\n{\n\n}\n\nCFX_ByteString CPWL_SBButton::GetClassName() const\n{\n\treturn \"CPWL_SBButton\";\n}\n\nvoid CPWL_SBButton::OnCreate(PWL_CREATEPARAM & cp)\n{\n\tcp.eCursorType = FXCT_ARROW;\n}\n\nvoid CPWL_SBButton::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)\n{\n\tCPWL_Wnd::GetThisAppearanceStream(sAppStream);\n\n\tif (!IsVisible()) return;\n\n\tCFX_ByteTextBuf sButton;\n\n\tCPDF_Rect rectWnd = GetWindowRect();\n\n\tif (rectWnd.IsEmpty()) return;\n\n\tsAppStream << \"q\\n\";\n\n\tCPDF_Point ptCenter = this->GetCenterPoint();\n\n\tswitch (this->m_eScrollBarType)\n\t{\n\t\tcase SBT_HSCROLL:\n\t\t\tswitch (this->m_eSBButtonType)\n\t\t\t{\n\t\t\t\tcase PSBT_MIN:\n\t\t\t\t\t{\n\t\t\t\t\t\tCPDF_Point pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y);\n\t\t\t\t\t\tCPDF_Point pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y + PWL_TRIANGLE_HALFLEN);\n\t\t\t\t\t\tCPDF_Point pt3(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y - PWL_TRIANGLE_HALFLEN);\n\n\t\t\t\t\t\tif (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&\n\t\t\t\t\t\t\trectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsButton << \"0 g\\n\";\n\t\t\t\t\t\t\tsButton << pt1.x << \" \" << pt1.y << \" m\\n\";\n\t\t\t\t\t\t\tsButton << pt2.x << \" \" << pt2.y << \" l\\n\";\n\t\t\t\t\t\t\tsButton << pt3.x << \" \" << pt3.y << \" l\\n\";\n\t\t\t\t\t\t\tsButton << pt1.x << \" \" << pt1.y << \" l f\\n\";\n\n\t\t\t\t\t\t\tsAppStream << sButton;\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase PSBT_MAX:\n\t\t\t\t\t{\n\t\t\t\t\t\tCPDF_Point pt1(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y);\n\t\t\t\t\t\tCPDF_Point pt2(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y + PWL_TRIANGLE_HALFLEN);\n\t\t\t\t\t\tCPDF_Point pt3(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y - PWL_TRIANGLE_HALFLEN);\n\n\t\t\t\t\t\tif (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&\n\t\t\t\t\t\t\trectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsButton << \"0 g\\n\";\n\t\t\t\t\t\t\tsButton << pt1.x << \" \" << pt1.y << \" m\\n\";\n\t\t\t\t\t\t\tsButton << pt2.x << \" \" << pt2.y << \" l\\n\";\n\t\t\t\t\t\t\tsButton << pt3.x << \" \" << pt3.y << \" l\\n\";\n\t\t\t\t\t\t\tsButton << pt1.x << \" \" << pt1.y << \" l f\\n\";\n\n\t\t\t\t\t\t\tsAppStream << sButton;\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SBT_VSCROLL:\n\t\t\tswitch(this->m_eSBButtonType)\n\t\t\t{\n\t\t\t\tcase PSBT_MIN:\n\t\t\t\t\t{\n\t\t\t\t\t\tCPDF_Point pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN,ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f);\n\t\t\t\t\t\tCPDF_Point pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN,ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f);\n\t\t\t\t\t\tCPDF_Point pt3(ptCenter.x,ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f);\n\n\t\t\t\t\t\tif (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&\n\t\t\t\t\t\t\trectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsButton << \"0 g\\n\";\n\t\t\t\t\t\t\tsButton << pt1.x << \" \" << pt1.y << \" m\\n\";\n\t\t\t\t\t\t\tsButton << pt2.x << \" \" << pt2.y << \" l\\n\";\n\t\t\t\t\t\t\tsButton << pt3.x << \" \" << pt3.y << \" l\\n\";\n\t\t\t\t\t\t\tsButton << pt1.x << \" \" << pt1.y << \" l f\\n\";\n\n\t\t\t\t\t\t\tsAppStream << sButton;\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase PSBT_MAX:\n\t\t\t\t\t{\n\t\t\t\t\t\tCPDF_Point pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN,ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f);\n\t\t\t\t\t\tCPDF_Point pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN,ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f);\n\t\t\t\t\t\tCPDF_Point pt3(ptCenter.x,ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f);\n\n\t\t\t\t\t\tif (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&\n\t\t\t\t\t\t\trectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsButton << \"0 g\\n\";\n\t\t\t\t\t\t\tsButton << pt1.x << \" \" << pt1.y << \" m\\n\";\n\t\t\t\t\t\t\tsButton << pt2.x << \" \" << pt2.y << \" l\\n\";\n\t\t\t\t\t\t\tsButton << pt3.x << \" \" << pt3.y << \" l\\n\";\n\t\t\t\t\t\t\tsButton << pt1.x << \" \" << pt1.y << \" l f\\n\";\n\n\t\t\t\t\t\t\tsAppStream << sButton;\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tsAppStream << \"Q\\n\";\n}\n\nvoid CPWL_SBButton::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)\n{\n\tif (!IsVisible()) return;\n\n\tCPDF_Rect rectWnd = GetWindowRect();\n\tif (rectWnd.IsEmpty()) return;\n\n\tCPDF_Point ptCenter = this->GetCenterPoint();\n\tFX_INT32 nTransparancy = this->GetTransparency();\n\n\tswitch (this->m_eScrollBarType)\n\t{\n\tcase SBT_HSCROLL:\n\t\tCPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);\n\t\tswitch (this->m_eSBButtonType)\n\t\t{\n\t\tcase PSBT_MIN:\n\t\t\t{\n\t\t\t\tCPDF_Point pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y);\n\t\t\t\tCPDF_Point pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y + PWL_TRIANGLE_HALFLEN);\n\t\t\t\tCPDF_Point pt3(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y - PWL_TRIANGLE_HALFLEN);\n\n\t\t\t\tif (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&\n\t\t\t\t\trectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN )\n\t\t\t\t{\n\t\t\t\t\tCFX_PathData path;\n\n\t\t\t\t\tpath.SetPointCount(4);\n\t\t\t\t\tpath.SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO);\n\t\t\t\t\tpath.SetPoint(1, pt2.x, pt2.y, FXPT_LINETO);\n\t\t\t\t\tpath.SetPoint(2, pt3.x, pt3.y, FXPT_LINETO);\n\t\t\t\t\tpath.SetPoint(3, pt1.x, pt1.y, FXPT_LINETO);\n\n\t\t\t\t\tpDevice->DrawPath(&path, pUser2Device, NULL, \n\t\t\t\t\t\tCPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_BLACKCOLOR,nTransparancy), \n\t\t\t\t\t\t0, FXFILL_ALTERNATE);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase PSBT_MAX:\n\t\t\t{\n\t\t\t\tCPDF_Point pt1(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y);\n\t\t\t\tCPDF_Point pt2(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y + PWL_TRIANGLE_HALFLEN);\n\t\t\t\tCPDF_Point pt3(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y - PWL_TRIANGLE_HALFLEN);\n\n\t\t\t\tif (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&\n\t\t\t\t\trectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN )\n\t\t\t\t{\n\t\t\t\t\tCFX_PathData path;\n\n\t\t\t\t\tpath.SetPointCount(4);\n\t\t\t\t\tpath.SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO);\n\t\t\t\t\tpath.SetPoint(1, pt2.x, pt2.y, FXPT_LINETO);\n\t\t\t\t\tpath.SetPoint(2, pt3.x, pt3.y, FXPT_LINETO);\n\t\t\t\t\tpath.SetPoint(3, pt1.x, pt1.y, FXPT_LINETO);\n\n\t\t\t\t\tpDevice->DrawPath(&path, pUser2Device, NULL, \n\t\t\t\t\t\tCPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_BLACKCOLOR,nTransparancy), \n\t\t\t\t\t\t0, FXFILL_ALTERNATE);\t\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\tcase SBT_VSCROLL:\n\t\tswitch(this->m_eSBButtonType)\n\t\t{\n\t\tcase PSBT_MIN:\n\t\t\t{\n\t\t\t\t//draw border\n\t\t\t\tCPDF_Rect rcDraw = rectWnd;\n\t\t\t\tCPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw, \n\t\t\t\t\tArgbEncode(nTransparancy,100,100,100),0.0f);\n\n\t\t\t\t//draw inner border\n\t\t\t\trcDraw = CPWL_Utils::DeflateRect(rectWnd,0.5f);\n\t\t\t\tCPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw, \n\t\t\t\t\tArgbEncode(nTransparancy,255,255,255),1.0f);\n\n\t\t\t\t//draw background\n\n\t\t\t\trcDraw = CPWL_Utils::DeflateRect(rectWnd,1.0f);\n\n\t\t\t\tif (this->IsEnabled())\n\t\t\t\t\tCPWL_Utils::DrawShadow(pDevice, pUser2Device, TRUE, FALSE, rcDraw, nTransparancy, 80, 220);\n\t\t\t\telse\n\t\t\t\t\tCPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw, ArgbEncode(255,255,255,255));\n\n\t\t\t\t//draw arrow\n\n\t\t\t\tif (rectWnd.top - rectWnd.bottom > 6.0f )\n\t\t\t\t{\n\t\t\t\t\tFX_FLOAT fX = rectWnd.left + 1.5f;\n\t\t\t\t\tFX_FLOAT fY = rectWnd.bottom;\n\t\t\t\t\tCPDF_Point pts[7] = {\n\t\t\t\t\t\t\t\tCPDF_Point(fX+2.5f, fY+4.0f),\n\t\t\t\t\t\t\t\tCPDF_Point(fX+2.5f, fY+3.0f),\n\t\t\t\t\t\t\t\tCPDF_Point(fX+4.5f, fY+5.0f),\n\t\t\t\t\t\t\t\tCPDF_Point(fX+6.5f, fY+3.0f),\n\t\t\t\t\t\t\t\tCPDF_Point(fX+6.5f, fY+4.0f),\n\t\t\t\t\t\t\t\tCPDF_Point(fX+4.5f, fY+6.0f),\n\t\t\t\t\t\t\t\tCPDF_Point(fX+2.5f, fY+4.0f)};\n\t\t\t\t\t\n\n\t\t\t\t\tif (this->IsEnabled())\n\t\t\t\t\t\tCPWL_Utils::DrawFillArea(pDevice, pUser2Device, pts, 7, ArgbEncode(nTransparancy,255,255,255));\n\t\t\t\t\telse\n\t\t\t\t\t\tCPWL_Utils::DrawFillArea(pDevice, pUser2Device, pts, 7, \n\t\t\t\t\t\t\tCPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_HEAVYGRAYCOLOR,255));\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase PSBT_MAX:\n\t\t\t{\n\t\t\t\t//draw border\n\t\t\t\tCPDF_Rect rcDraw = rectWnd;\n\t\t\t\tCPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw, \n\t\t\t\t\tArgbEncode(nTransparancy,100,100,100),0.0f);\n\t\t\t\t\n\t\t\t\t//draw inner border\n\t\t\t\trcDraw = CPWL_Utils::DeflateRect(rectWnd,0.5f);\n\t\t\t\tCPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw, \n\t\t\t\t\tArgbEncode(nTransparancy,255,255,255),1.0f);\n\n\t\t\t\t//draw background\n\t\t\t\trcDraw = CPWL_Utils::DeflateRect(rectWnd,1.0f);\n\t\t\t\tif (this->IsEnabled())\n\t\t\t\t\tCPWL_Utils::DrawShadow(pDevice, pUser2Device, TRUE, FALSE, rcDraw, nTransparancy, 80, 220);\n\t\t\t\telse\n\t\t\t\t\tCPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw, ArgbEncode(255,255,255,255));\n\n\t\t\t\t//draw arrow\n\n\t\t\t\tif (rectWnd.top - rectWnd.bottom > 6.0f )\n\t\t\t\t{\n\t\t\t\t\tFX_FLOAT fX = rectWnd.left + 1.5f;\n\t\t\t\t\tFX_FLOAT fY = rectWnd.bottom;\n\n\t\t\t\t\tCPDF_Point pts[7] = {\n\t\t\t\t\t\t\t\tCPDF_Point(fX+2.5f, fY+5.0f),\n\t\t\t\t\t\t\t\tCPDF_Point(fX+2.5f, fY+6.0f),\n\t\t\t\t\t\t\t\tCPDF_Point(fX+4.5f, fY+4.0f),\n\t\t\t\t\t\t\t\tCPDF_Point(fX+6.5f, fY+6.0f),\n\t\t\t\t\t\t\t\tCPDF_Point(fX+6.5f, fY+5.0f),\n\t\t\t\t\t\t\t\tCPDF_Point(fX+4.5f, fY+3.0f),\n\t\t\t\t\t\t\t\tCPDF_Point(fX+2.5f, fY+5.0f)};\n\t\t\t\t\t\n\n\t\t\t\t\tif (this->IsEnabled())\n\t\t\t\t\t\tCPWL_Utils::DrawFillArea(pDevice, pUser2Device, pts, 7, ArgbEncode(nTransparancy,255,255,255));\n\t\t\t\t\telse\n\t\t\t\t\t\tCPWL_Utils::DrawFillArea(pDevice, pUser2Device, pts, 7, \n\t\t\t\t\t\t\tCPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_HEAVYGRAYCOLOR,255));\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase PSBT_POS:\n\t\t\t{\n\t\t\t\t//CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);\n\n\t\t\t\t//draw border\n\t\t\t\tCPDF_Rect rcDraw = rectWnd;\n\t\t\t\tCPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw, \n\t\t\t\t\tArgbEncode(nTransparancy,100,100,100),0.0f);\n\t\t\t\t\n\t\t\t\t//draw inner border\n\t\t\t\trcDraw = CPWL_Utils::DeflateRect(rectWnd,0.5f);\n\t\t\t\tCPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw, \n\t\t\t\t\tArgbEncode(nTransparancy,255,255,255),1.0f);\n\n\t\t\t\tif (this->IsEnabled())\n\t\t\t\t{\n\t\t\t\t\t//draw shadow effect\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tCPDF_Point ptTop = CPDF_Point(rectWnd.left,rectWnd.top-1.0f);\n\t\t\t\t\tCPDF_Point ptBottom = CPDF_Point(rectWnd.left,rectWnd.bottom+1.0f);\n\n\t\t\t\t\tptTop.x += 1.5f;\n\t\t\t\t\tptBottom.x += 1.5f;\n\t\t\t\t\t\n\t\t\t\t\tCPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, \n\t\t\t\t\t\tArgbEncode(nTransparancy,210,210,210),1.0f);\n\n\t\t\t\t\tptTop.x += 1.0f;\n\t\t\t\t\tptBottom.x += 1.0f;\n\t\t\t\t\t\n\t\t\t\t\tCPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, \n\t\t\t\t\t\tArgbEncode(nTransparancy,220,220,220),1.0f);\n\n\t\t\t\t\tptTop.x += 1.0f;\n\t\t\t\t\tptBottom.x += 1.0f;\n\t\t\t\t\t\n\t\t\t\t\tCPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, \n\t\t\t\t\t\tArgbEncode(nTransparancy,240,240,240),1.0f);\n\n\t\t\t\t\tptTop.x += 1.0f;\n\t\t\t\t\tptBottom.x += 1.0f;\n\t\t\t\t\t\n\t\t\t\t\tCPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, \n\t\t\t\t\t\tArgbEncode(nTransparancy,240,240,240),1.0f);\n\n\t\t\t\t\tptTop.x += 1.0f;\n\t\t\t\t\tptBottom.x += 1.0f;\n\t\t\t\t\t\n\t\t\t\t\tCPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, \n\t\t\t\t\t\tArgbEncode(nTransparancy,210,210,210),1.0f);\n\n\t\t\t\t\tptTop.x += 1.0f;\n\t\t\t\t\tptBottom.x += 1.0f;\n\t\t\t\t\t\n\t\t\t\t\tCPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, \n\t\t\t\t\t\tArgbEncode(nTransparancy,180,180,180),1.0f);\n\n\t\t\t\t\tptTop.x += 1.0f;\n\t\t\t\t\tptBottom.x += 1.0f;\n\t\t\t\t\t\n\t\t\t\t\tCPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, \n\t\t\t\t\t\tArgbEncode(nTransparancy,150,150,150),1.0f);\n\n\t\t\t\t\tptTop.x += 1.0f;\n\t\t\t\t\tptBottom.x += 1.0f;\n\t\t\t\t\t\n\t\t\t\t\tCPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, \n\t\t\t\t\t\tArgbEncode(nTransparancy,150,150,150),1.0f);\n\n\t\t\t\t\tptTop.x += 1.0f;\n\t\t\t\t\tptBottom.x += 1.0f;\n\t\t\t\t\t\n\t\t\t\t\tCPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, \n\t\t\t\t\t\tArgbEncode(nTransparancy,180,180,180),1.0f);\n\n\t\t\t\t\tptTop.x += 1.0f;\n\t\t\t\t\tptBottom.x += 1.0f;\n\t\t\t\t\t\n\t\t\t\t\tCPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, \n\t\t\t\t\t\tArgbEncode(nTransparancy,210,210,210),1.0f);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tCPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw, ArgbEncode(255,255,255,255));\n\t\t\t\t}\n\n\t\t\t\t//draw friction\n\n\t\t\t\tif (rectWnd.Height() > 8.0f)\n\t\t\t\t{\n\t\t\t\t\tFX_COLORREF crStroke = ArgbEncode(nTransparancy,120,120,120);\n\t\t\t\t\tif (!this->IsEnabled())\n\t\t\t\t\t\tcrStroke = CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_HEAVYGRAYCOLOR,255);\n\n\t\t\t\t\tFX_FLOAT nFrictionWidth = 5.0f;\n\t\t\t\t\tFX_FLOAT nFrictionHeight = 5.5f;\n\n\t\t\t\t\tCPDF_Point ptLeft = CPDF_Point(ptCenter.x - nFrictionWidth / 2.0f, ptCenter.y - nFrictionHeight / 2.0f + 0.5f);\n\t\t\t\t\tCPDF_Point ptRight = CPDF_Point(ptCenter.x + nFrictionWidth / 2.0f, ptCenter.y - nFrictionHeight / 2.0f + 0.5f);\n\n\t\t\t\t\tCPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight, \n\t\t\t\t\t\tcrStroke,1.0f);\n\n\t\t\t\t\tptLeft.y += 2.0f;\n\t\t\t\t\tptRight.y += 2.0f;\n\n\t\t\t\t\tCPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight, \n\t\t\t\t\t\tcrStroke,1.0f);\n\n\t\t\t\t\tptLeft.y += 2.0f;\n\t\t\t\t\tptRight.y += 2.0f;\n\n\t\t\t\t\tCPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight, \n\t\t\t\t\t\tcrStroke,1.0f);\n\n\t\t\t\t\t/*\n\t\t\t\t\tptLeft.y += 1.5f;\n\t\t\t\t\tptRight.y += 1.5f;\n\n\t\t\t\t\tCPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight, \n\t\t\t\t\t\tArgbEncode(nTransparancy,150,150,150),1.0f);\n\t\t\t\t\t\t*/\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n}\n\nFX_BOOL CPWL_SBButton::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tCPWL_Wnd::OnLButtonDown(point,nFlag);\n\n\tif (CPWL_Wnd * pParent = GetParentWindow())\n\t\tpParent->OnNotify(this,PNM_LBUTTONDOWN,0,(FX_INTPTR)&point);\n\n\tm_bMouseDown = TRUE;\n\tSetCapture();\n\n\treturn TRUE;\n}\n\nFX_BOOL CPWL_SBButton::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tCPWL_Wnd::OnLButtonUp(point,nFlag);\n\n\tif (CPWL_Wnd * pParent = GetParentWindow())\n\t\tpParent->OnNotify(this,PNM_LBUTTONUP,0,(FX_INTPTR)&point);\n\n\tm_bMouseDown = FALSE;\n\tReleaseCapture();\n\n\treturn TRUE;\n}\n\nFX_BOOL CPWL_SBButton::OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tCPWL_Wnd::OnMouseMove(point,nFlag);\n\n\tif (CPWL_Wnd * pParent = GetParentWindow())\n\t{\t\t\n\t\tpParent->OnNotify(this,PNM_MOUSEMOVE,0,(FX_INTPTR)&point);\n\n\t\t/*\n\t\tif (m_bMouseDown && (m_eSBButtonType == PSBT_MIN || m_eSBButtonType == PSBT_MAX))\n\t\t{\n\t\t\tif (!pParent->OnNotify(this,PNM_LBUTTONDOWN,nFlags,(FX_INTPTR)&point))\n\t\t\t\treturn FALSE;\n\t\t}\n\t\t*/\n\t}\n\n\treturn TRUE;\n}\n\n/* ------------------------------- CPWL_ScrollBar ---------------------------------- */\n\nCPWL_ScrollBar::CPWL_ScrollBar(PWL_SCROLLBAR_TYPE sbType):\n\tm_sbType(sbType),\n\tm_pMinButton(NULL),\n\tm_pMaxButton(NULL),\n\tm_pPosButton(NULL),\n\tm_bMouseDown(FALSE),\n\tm_bMinOrMax(FALSE),\n\tm_bNotifyForever(TRUE)\n{\n}\n\nCPWL_ScrollBar::~CPWL_ScrollBar()\n{\n}\n\nCFX_ByteString CPWL_ScrollBar::GetClassName() const\n{\n\treturn \"CPWL_ScrollBar\";\n}\n\nvoid CPWL_ScrollBar::OnCreate(PWL_CREATEPARAM & cp)\n{\n\tcp.eCursorType = FXCT_ARROW;\n}\n\nvoid CPWL_ScrollBar::RePosChildWnd()\n{\n\tCPDF_Rect rcClient = this->GetClientRect();\n\n/*\n\tswitch(m_sbType)\n\t{\n\t\tcase SBT_HSCROLL:\n\t\t\tif (rcClient.right - rcClient.left < PWL_SCROLLBAR_WIDTH ||\n\t\t\t\trcClient.top - rcClient.bottom < PWL_SCROLLBAR_WIDTH)\n\t\t\t{\n\t\t\t\tSetVisible(FALSE);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SBT_VSCROLL:\n\t\t\tif (rcClient.right - rcClient.left < PWL_SCROLLBAR_WIDTH ||\n\t\t\t\trcClient.top - rcClient.bottom < PWL_SCROLLBAR_WIDTH)\n\t\t\t{\n\t\t\t\tSetVisible(FALSE);\n\t\t\t}\n\t\t\tbreak;\n\t}\t\n*/\n\tCPDF_Rect rcMinButton,rcMaxButton;\n\n\tFX_FLOAT fBWidth = 0;\n\n\tswitch (m_sbType)\n\t{\n\tcase SBT_HSCROLL:\n\t\tif (rcClient.right - rcClient.left > PWL_SCROLLBAR_BUTTON_WIDTH * 2 + PWL_SCROLLBAR_POSBUTTON_MINWIDTH + 2)\n\t\t{\n\t\t\trcMinButton = CPDF_Rect(rcClient.left,rcClient.bottom,\n\t\t\t\trcClient.left + PWL_SCROLLBAR_BUTTON_WIDTH,rcClient.top);\n\t\t\trcMaxButton = CPDF_Rect(rcClient.right - PWL_SCROLLBAR_BUTTON_WIDTH,rcClient.bottom,\n\t\t\t\trcClient.right,rcClient.top);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfBWidth = (rcClient.right - rcClient.left - PWL_SCROLLBAR_POSBUTTON_MINWIDTH - 2) / 2;\n\n\t\t\tif (fBWidth > 0)\n\t\t\t{\n\t\t\t\trcMinButton = CPDF_Rect(rcClient.left,rcClient.bottom,\n\t\t\t\t\trcClient.left + fBWidth,rcClient.top);\n\t\t\t\trcMaxButton = CPDF_Rect(rcClient.right - fBWidth,rcClient.bottom,\n\t\t\t\t\trcClient.right,rcClient.top);\n\t\t\t}\n\t\t\telse SetVisible(FALSE);\n\t\t}\n\t\tbreak;\n\tcase SBT_VSCROLL:\n\t\tif (IsFloatBigger(rcClient.top - rcClient.bottom, PWL_SCROLLBAR_BUTTON_WIDTH * 2 + PWL_SCROLLBAR_POSBUTTON_MINWIDTH + 2))\n\t\t{\n\t\t\trcMinButton = CPDF_Rect(rcClient.left,rcClient.top - PWL_SCROLLBAR_BUTTON_WIDTH,\n\t\t\t\trcClient.right,rcClient.top);\n\t\t\trcMaxButton = CPDF_Rect(rcClient.left,rcClient.bottom,\n\t\t\t\trcClient.right,rcClient.bottom + PWL_SCROLLBAR_BUTTON_WIDTH);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfBWidth = (rcClient.top - rcClient.bottom - PWL_SCROLLBAR_POSBUTTON_MINWIDTH - 2) / 2;\n\n\t\t\tif (IsFloatBigger(fBWidth, 0))\n\t\t\t{\n\t\t\t\trcMinButton = CPDF_Rect(rcClient.left,rcClient.top - fBWidth,\n\t\t\t\t\trcClient.right,rcClient.top);\n\t\t\t\trcMaxButton = CPDF_Rect(rcClient.left,rcClient.bottom,\n\t\t\t\t\trcClient.right,rcClient.bottom + fBWidth);\n\t\t\t}\n\t\t\telse SetVisible(FALSE);\n\t\t}\n\t\tbreak;\n\t}\t\n\t\n//\tif (IsVisible())\n\t{\n\t\tif (m_pMinButton)\n\t\t\tm_pMinButton->Move(rcMinButton,TRUE,FALSE);\n\t\t\n\t\tif (m_pMaxButton)\n\t\t\tm_pMaxButton->Move(rcMaxButton,TRUE,FALSE);\n\n\t\tMovePosButton(FALSE);\n\t}\n}\n\nvoid CPWL_ScrollBar::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)\n{\n\tCPDF_Rect rectWnd = GetWindowRect();\n\n\tif (IsVisible() && !rectWnd.IsEmpty())\n\t{\n\t\tCFX_ByteTextBuf sButton;\t\t\n\n\t\tsButton << \"q\\n\";\n\t\tsButton << \"0 w\\n\" << CPWL_Utils::GetColorAppStream(GetBackgroundColor(),TRUE);\n\t\tsButton << rectWnd.left << \" \" << rectWnd.bottom << \" \"\n\t\t\t\t<< rectWnd.right - rectWnd.left << \" \" << rectWnd.top - rectWnd.bottom << \" re b Q\\n\";\t\n\n\t\tsAppStream << sButton;\t\n\t}\n}\n\nvoid CPWL_ScrollBar::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)\n{\n//\tCPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);\n\tCPDF_Rect rectWnd = GetWindowRect();\n\n\tif (IsVisible() && !rectWnd.IsEmpty())\n\t{\n\t\tCPWL_Utils::DrawFillRect(pDevice, pUser2Device, rectWnd, this->GetBackgroundColor(), GetTransparency());\n\n\t\tCPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, \n\t\t\tCPDF_Point(rectWnd.left+2.0f,rectWnd.top-2.0f), CPDF_Point(rectWnd.left+2.0f,rectWnd.bottom+2.0f), \n\t\t\tArgbEncode(this->GetTransparency(),100,100,100),1.0f);\n\n\t\tCPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, \n\t\t\tCPDF_Point(rectWnd.right-2.0f,rectWnd.top-2.0f), CPDF_Point(rectWnd.right-2.0f,rectWnd.bottom+2.0f), \n\t\t\tArgbEncode(this->GetTransparency(),100,100,100),1.0f);\n\t}\n}\n\nFX_BOOL CPWL_ScrollBar::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tCPWL_Wnd::OnLButtonDown(point,nFlag);\n\n\t//SetFocus();\n\n\tif (HasFlag(PWS_AUTOTRANSPARENT))\n\t{\n\t\tif (GetTransparency() != 255)\n\t\t{\n\t\t\tSetTransparency(255);\n\t\t\tInvalidateRect();\n\t\t}\n\t}\n\n\tCPDF_Rect rcMinArea,rcMaxArea;\n\n\tif (m_pPosButton && m_pPosButton->IsVisible())\n\t{\n\t\tCPDF_Rect rcClient = this->GetClientRect();\n\t\tCPDF_Rect rcPosButton = m_pPosButton->GetWindowRect();\n\n\t\tswitch (m_sbType)\n\t\t{\n\t\tcase SBT_HSCROLL:\n\t\t\trcMinArea = CPDF_Rect(rcClient.left + PWL_SCROLLBAR_BUTTON_WIDTH,rcClient.bottom,\n\t\t\t\t\t\t\trcPosButton.left,rcClient.top);\n\t\t\trcMaxArea = CPDF_Rect(rcPosButton.right,rcClient.bottom,\n\t\t\t\t\t\t\trcClient.right - PWL_SCROLLBAR_BUTTON_WIDTH,rcClient.top);\n\n\t\t\tbreak;\n\t\tcase SBT_VSCROLL:\n\t\t\trcMinArea = CPDF_Rect(rcClient.left,rcPosButton.top,\n\t\t\t\t\t\t\trcClient.right,rcClient.top - PWL_SCROLLBAR_BUTTON_WIDTH);\n\t\t\trcMaxArea = CPDF_Rect(rcClient.left,rcClient.bottom + PWL_SCROLLBAR_BUTTON_WIDTH,\n\t\t\t\t\t\t\trcClient.right,rcPosButton.bottom);\n\t\t\tbreak;\n\t\t}\n\n\t\trcMinArea.Normalize();\n\t\trcMaxArea.Normalize();\n\n\t\tif (rcMinArea.Contains(point.x,point.y))\n\t\t{\n\t\t\tm_sData.SubBig();\n\t\t\tMovePosButton(TRUE);\n\t\t\tNotifyScrollWindow();\n\t\t}\n\n\t\tif (rcMaxArea.Contains(point.x,point.y))\n\t\t{\n\t\t\tm_sData.AddBig();\n\t\t\tMovePosButton(TRUE);\n\t\t\tNotifyScrollWindow();\n\t\t}\n\t}\n\n\treturn TRUE;\n}\n\nFX_BOOL CPWL_ScrollBar::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tCPWL_Wnd::OnLButtonUp(point,nFlag);\n\n\tif (HasFlag(PWS_AUTOTRANSPARENT))\n\t{\n\t\tif (GetTransparency() != PWL_SCROLLBAR_TRANSPARANCY)\n\t\t{\n\t\t\tSetTransparency(PWL_SCROLLBAR_TRANSPARANCY);\n\t\t\tInvalidateRect();\n\t\t}\n\t}\n\n\tEndTimer();\n\tm_bMouseDown = FALSE;\n\n\treturn TRUE;\n}\n\nvoid CPWL_ScrollBar::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)\n{\n\tCPWL_Wnd::OnNotify(pWnd,msg,wParam,lParam);\n\n\tswitch (msg)\n\t{\n\tcase PNM_LBUTTONDOWN:\t\t\t\n\t\tif (pWnd == m_pMinButton)\n\t\t{\n\t\t\tOnMinButtonLBDown(*(CPDF_Point*)lParam);\n\t\t}\n\n\t\tif (pWnd == m_pMaxButton)\n\t\t{\n\t\t\tOnMaxButtonLBDown(*(CPDF_Point*)lParam);\n\t\t}\n\n\t\tif (pWnd == m_pPosButton)\n\t\t{\n\t\t\tOnPosButtonLBDown(*(CPDF_Point*)lParam);\t\t\t\t\n\t\t}\n\t\tbreak;\n\tcase PNM_LBUTTONUP:\n\t\tif (pWnd == m_pMinButton)\n\t\t{\n\t\t\tOnMinButtonLBUp(*(CPDF_Point*)lParam);\t\t\n\t\t}\n\n\t\tif (pWnd == m_pMaxButton)\n\t\t{\n\t\t\tOnMaxButtonLBUp(*(CPDF_Point*)lParam);\t\t\t\t\n\t\t}\n\n\t\tif (pWnd == m_pPosButton)\n\t\t{\n\t\t\tOnPosButtonLBUp(*(CPDF_Point*)lParam);\t\t\t\n\t\t}\n\t\tbreak;\n\tcase PNM_MOUSEMOVE:\n\t\tif (pWnd == m_pMinButton)\n\t\t{\n\t\t\tOnMinButtonMouseMove(*(CPDF_Point*)lParam);\n\t\t}\n\n\t\tif (pWnd == m_pMaxButton)\n\t\t{\n\t\t\tOnMaxButtonMouseMove(*(CPDF_Point*)lParam);\t\t\t\t\n\t\t}\n\n\t\tif (pWnd == m_pPosButton)\n\t\t{\n\t\t\tOnPosButtonMouseMove(*(CPDF_Point*)lParam);\t\t\t\t\n\t\t}\n\t\tbreak;\n\tcase PNM_SETSCROLLINFO:\n\t\t{\n\t\t\tif (PWL_SCROLL_INFO * pInfo = (PWL_SCROLL_INFO*)lParam)\n\t\t\t{\n\t\t\t\tif (FXSYS_memcmp(&m_OriginInfo, pInfo, sizeof(PWL_SCROLL_INFO)) != 0)\n\t\t\t\t{\n\t\t\t\t\tm_OriginInfo = *pInfo;\n\t\t\t\t\tFX_FLOAT fMax = pInfo->fContentMax - pInfo->fContentMin - pInfo->fPlateWidth;\n\t\t\t\t\tfMax = fMax > 0.0f ? fMax : 0.0f;\n\t\t\t\t\tthis->SetScrollRange(0,fMax, pInfo->fPlateWidth);\n\t\t\t\t\tthis->SetScrollStep(pInfo->fBigStep,pInfo->fSmallStep);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tbreak;\n\tcase PNM_SETSCROLLPOS:\n\t\t{\n\t\t\tFX_FLOAT fPos = *(FX_FLOAT*)lParam;\n\t\t\tswitch (this->m_sbType)\n\t\t\t{\n\t\t\tcase SBT_HSCROLL:\n\t\t\t\tfPos = fPos - m_OriginInfo.fContentMin;\n\t\t\t\tbreak;\n\t\t\tcase SBT_VSCROLL:\n\t\t\t\tfPos = m_OriginInfo.fContentMax - fPos;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tthis->SetScrollPos(fPos);\n\t\t}\n\t\tbreak;\n\t}\n}\n\nvoid CPWL_ScrollBar::CreateButtons(const PWL_CREATEPARAM & cp)\n{\n\tPWL_CREATEPARAM\tscp = cp;\n\tscp.pParentWnd = this;\n\tscp.dwBorderWidth = 2;\n\tscp.nBorderStyle = PBS_BEVELED;\n\t\n\tscp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PWS_BACKGROUND | PWS_NOREFRESHCLIP;\n\n\tif (!m_pMinButton) \n\t{\n\t\tm_pMinButton = new CPWL_SBButton(m_sbType,PSBT_MIN);\n\t\tm_pMinButton->Create(scp);\n\t}\n\n\tif (!m_pMaxButton)\n\t{\n\t\tm_pMaxButton = new CPWL_SBButton(m_sbType,PSBT_MAX);\n\t\tm_pMaxButton->Create(scp);\n\t}\n\n\tif (!m_pPosButton)\n\t{\n\t\tm_pPosButton = new CPWL_SBButton(m_sbType,PSBT_POS);\n\t\tm_pPosButton->SetVisible(FALSE);\n\t\tm_pPosButton->Create(scp);\n\t}\n}\n\nFX_FLOAT CPWL_ScrollBar::GetScrollBarWidth() const\n{\n\tif (!IsVisible()) return 0;\n\n\treturn PWL_SCROLLBAR_WIDTH;\n}\n\nvoid CPWL_ScrollBar::SetScrollRange(FX_FLOAT fMin,FX_FLOAT fMax,FX_FLOAT fClientWidth)\n{\n\tif (m_pPosButton)\n\t{\n\t\tm_sData.SetScrollRange(fMin,fMax);\n\t\tm_sData.SetClientWidth(fClientWidth);\n\n\t\tif (IsFloatSmaller(m_sData.ScrollRange.GetWidth(), 0.0f))\n\t\t{\n\t\t\tm_pPosButton->SetVisible(FALSE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_pPosButton->SetVisible(TRUE);\t\n\t\t\tMovePosButton(TRUE);\n\t\t}\n\t}\n}\n\nvoid CPWL_ScrollBar::SetScrollPos(FX_FLOAT fPos)\n{\n\tFX_FLOAT fOldPos = m_sData.fScrollPos;\n\n\tm_sData.SetPos(fPos);\n\n\tif (!IsFloatEqual(m_sData.fScrollPos, fOldPos))\n\t\tMovePosButton(TRUE);\n}\n\nvoid CPWL_ScrollBar::SetScrollStep(FX_FLOAT fBigStep,FX_FLOAT fSmallStep)\n{\n\tm_sData.SetBigStep(fBigStep);\n\tm_sData.SetSmallStep(fSmallStep);\n}\n\nvoid CPWL_ScrollBar::MovePosButton(FX_BOOL bRefresh)\n{\n\tASSERT (m_pPosButton != NULL);\n\tASSERT (m_pMinButton != NULL);\n\tASSERT (m_pMaxButton != NULL);\n\n\tif (m_pPosButton->IsVisible())\n\t{\n\n\n\n\n\t\tCPDF_Rect rcClient;\n\t\tCPDF_Rect rcPosArea,rcPosButton;\t\n\n\t\trcClient = this->GetClientRect();\n\t\trcPosArea = GetScrollArea();\n\n\t\tFX_FLOAT fLeft,fRight,fTop,fBottom;\n\n\t\tswitch (m_sbType)\n\t\t{\n\t\tcase SBT_HSCROLL:\n\t\t\tfLeft = TrueToFace(m_sData.fScrollPos);\n\t\t\tfRight = TrueToFace(m_sData.fScrollPos + m_sData.fClientWidth);\n\n\t\t\tif (fRight - fLeft < PWL_SCROLLBAR_POSBUTTON_MINWIDTH)\n\t\t\t\tfRight = fLeft + PWL_SCROLLBAR_POSBUTTON_MINWIDTH;\n\n\t\t\tif (fRight > rcPosArea.right)\n\t\t\t{\n\t\t\t\tfRight = rcPosArea.right;\n\t\t\t\tfLeft = fRight - PWL_SCROLLBAR_POSBUTTON_MINWIDTH;\n\t\t\t}\n\n\t\t\trcPosButton = CPDF_Rect(fLeft ,\n\t\t\t\t\t\t\t\trcPosArea.bottom,\n\t\t\t\t\t\t\t\tfRight ,\n\t\t\t\t\t\t\t\trcPosArea.top);\n\t\t\t\n\t\t\tbreak;\n\t\tcase SBT_VSCROLL:\n\t\t\tfBottom = TrueToFace(m_sData.fScrollPos + m_sData.fClientWidth);\n\t\t\tfTop = TrueToFace(m_sData.fScrollPos);\n\n\t\t\tif (IsFloatSmaller(fTop - fBottom, PWL_SCROLLBAR_POSBUTTON_MINWIDTH))\n\t\t\t\tfBottom = fTop - PWL_SCROLLBAR_POSBUTTON_MINWIDTH;\n\t\t\t\n\t\t\tif (IsFloatSmaller(fBottom, rcPosArea.bottom))\n\t\t\t{\n\t\t\t\tfBottom = rcPosArea.bottom;\n\t\t\t\tfTop = fBottom + PWL_SCROLLBAR_POSBUTTON_MINWIDTH;\n\t\t\t}\n\n\t\t\trcPosButton = CPDF_Rect(rcPosArea.left,\n\t\t\t\t\t\t\t\tfBottom,\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\trcPosArea.right,\n\t\t\t\t\t\t\t\tfTop);\n\t\t\t\n\t\t\tbreak;\n\t\t}\n\n\t\tm_pPosButton->Move(rcPosButton,TRUE,bRefresh);\n\t}\n}\n\nvoid CPWL_ScrollBar::OnMinButtonLBDown(const CPDF_Point & point)\n{\n\tm_sData.SubSmall();\n\tMovePosButton(TRUE);\n\tNotifyScrollWindow();\n\n\tm_bMinOrMax = TRUE;\n\n\tEndTimer();\n\tBeginTimer(100);\n}\n\nvoid CPWL_ScrollBar::OnMinButtonLBUp(const CPDF_Point & point)\n{\n}\n\nvoid CPWL_ScrollBar::OnMinButtonMouseMove(const CPDF_Point & point)\n{\t\n}\n\nvoid CPWL_ScrollBar::OnMaxButtonLBDown(const CPDF_Point & point)\n{\n\tm_sData.AddSmall();\n\tMovePosButton(TRUE);\n\tNotifyScrollWindow();\n\n\tm_bMinOrMax = FALSE;\n\t\n\tEndTimer();\n\tBeginTimer(100);\n}\n\nvoid CPWL_ScrollBar::OnMaxButtonLBUp(const CPDF_Point & point)\n{\n}\n\nvoid CPWL_ScrollBar::OnMaxButtonMouseMove(const CPDF_Point & point)\n{\t\n}\n\nvoid CPWL_ScrollBar::OnPosButtonLBDown(const CPDF_Point & point)\n{\n\tm_bMouseDown = TRUE;\n\n\tif (m_pPosButton)\n\t{\n\t\tCPDF_Rect rcPosButton = m_pPosButton->GetWindowRect();\n\n\t\tswitch(m_sbType)\n\t\t{\n\t\tcase SBT_HSCROLL:\n\t\t\tm_nOldPos = point.x;\n\t\t\tm_fOldPosButton = rcPosButton.left;\n\t\t\tbreak;\n\t\tcase SBT_VSCROLL:\n\t\t\tm_nOldPos = point.y;\n\t\t\tm_fOldPosButton = rcPosButton.top;\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nvoid CPWL_ScrollBar::OnPosButtonLBUp(const CPDF_Point & point)\n{\n\tif (m_bMouseDown)\n\t{\n\t\tif (!m_bNotifyForever)\n\t\t\tNotifyScrollWindow();\n\t}\n\tm_bMouseDown = FALSE;\n}\n\nvoid CPWL_ScrollBar::OnPosButtonMouseMove(const CPDF_Point & point)\n{\n\tFX_FLOAT fOldScrollPos = m_sData.fScrollPos;\n\n\tFX_FLOAT fNewPos = 0;\n\n\tswitch (m_sbType)\n\t{\n\tcase SBT_HSCROLL:\n\t\tif (FXSYS_fabs(point.x - m_nOldPos) < 1) return;\n\t\tfNewPos = FaceToTrue(m_fOldPosButton + point.x - m_nOldPos);\n\t\tbreak;\n\tcase SBT_VSCROLL:\n\t\tif (FXSYS_fabs(point.y - m_nOldPos) < 1) return;\n\t\tfNewPos = FaceToTrue(m_fOldPosButton + point.y - m_nOldPos);\n\t\tbreak;\n\t}\n\n\tif (m_bMouseDown)\n\t{\n\t\tswitch (m_sbType)\n\t\t{\n\t\tcase SBT_HSCROLL:\n\n\t\t\tif (IsFloatSmaller(fNewPos, m_sData.ScrollRange.fMin))\n\t\t\t{\n\t\t\t\tfNewPos = m_sData.ScrollRange.fMin;\n\t\t\t}\n\n\t\t\tif (IsFloatBigger(fNewPos, m_sData.ScrollRange.fMax))\n\t\t\t{\n\t\t\t\tfNewPos = m_sData.ScrollRange.fMax;\n\t\t\t}\n\n\t\t\tm_sData.SetPos(fNewPos);\n\t\t\t\n\t\t\tbreak;\n\t\tcase SBT_VSCROLL:\n\t\t\n\t\t\tif (IsFloatSmaller(fNewPos, m_sData.ScrollRange.fMin))\n\t\t\t{\n\t\t\t\tfNewPos = m_sData.ScrollRange.fMin;\n\t\t\t}\n\n\t\t\tif (IsFloatBigger(fNewPos, m_sData.ScrollRange.fMax))\n\t\t\t{\n\t\t\t\tfNewPos = m_sData.ScrollRange.fMax;\n\t\t\t}\t\n\n\t\t\tm_sData.SetPos(fNewPos);\n\t\t\n\t\t\tbreak;\n\t\t}\t\n\t\t\n\t\tif (!IsFloatEqual(fOldScrollPos, m_sData.fScrollPos))\n\t\t{\t\t\t\n\t\t\tMovePosButton(TRUE);\n\n\t\t\tif (m_bNotifyForever)\n\t\t\t\tNotifyScrollWindow();\n\t\t}\n\t}\n}\n\nvoid CPWL_ScrollBar::NotifyScrollWindow()\n{\n\tif (CPWL_Wnd * pParent = this->GetParentWindow())\n\t{\n\t\tFX_FLOAT fPos;\n\t\tswitch (this->m_sbType)\n\t\t{\n\t\tcase SBT_HSCROLL:\n\t\t\tfPos = m_OriginInfo.fContentMin + m_sData.fScrollPos;\n\t\t\tbreak;\n\t\tcase SBT_VSCROLL:\n\t\t\tfPos = m_OriginInfo.fContentMax - m_sData.fScrollPos;\n\t\t\tbreak;\n\t\t}\t\n\t\tpParent->OnNotify(this,PNM_SCROLLWINDOW,(FX_INTPTR)m_sbType,(FX_INTPTR)&fPos);\n\t}\n}\n\nCPDF_Rect CPWL_ScrollBar::GetScrollArea() const\n{\n\tCPDF_Rect rcClient = GetClientRect();\n\tCPDF_Rect rcArea;\n\n\tif (!m_pMinButton || !m_pMaxButton)return rcClient;\n\n\tCPDF_Rect rcMin = m_pMinButton->GetWindowRect();\n\tCPDF_Rect rcMax = m_pMaxButton->GetWindowRect();\n\n\tFX_FLOAT fMinWidth = rcMin.right - rcMin.left;\n\tFX_FLOAT fMinHeight = rcMin.top - rcMin.bottom;\n\tFX_FLOAT fMaxWidth = rcMax.right - rcMax.left;\n\tFX_FLOAT fMaxHeight = rcMax.top - rcMax.bottom;\n\n\tswitch(m_sbType)\n\t{\n\tcase SBT_HSCROLL:\n\t\tif (rcClient.right - rcClient.left > fMinWidth + fMaxWidth + 2)\n\t\t{\n\t\t\trcArea = CPDF_Rect(rcClient.left + fMinWidth + 1,rcClient.bottom,\n\t\t\t\t\t\trcClient.right - fMaxWidth - 1,rcClient.top);\n\t\t}\n\t\telse\n\t\t{\n\t\t\trcArea = CPDF_Rect(rcClient.left + fMinWidth + 1,rcClient.bottom,\n\t\t\t\t\t\trcClient.left + fMinWidth + 1,rcClient.top);\n\t\t}\n\t\tbreak;\n\tcase SBT_VSCROLL:\n\t\tif (rcClient.top - rcClient.bottom > fMinHeight + fMaxHeight + 2)\n\t\t{\n\t\t\trcArea = CPDF_Rect(rcClient.left,rcClient.bottom + fMinHeight + 1,\n\t\t\t\t\t\trcClient.right,rcClient.top - fMaxHeight - 1);\n\t\t}\n\t\telse\n\t\t{\n\t\t\trcArea = CPDF_Rect(rcClient.left,rcClient.bottom + fMinHeight + 1,\n\t\t\t\t\t\trcClient.right,rcClient.bottom + fMinHeight + 1);\n\t\t}\n\t\tbreak;\n\t}\n\t\n\trcArea.Normalize();\n\n\treturn rcArea;\n}\n\nFX_FLOAT CPWL_ScrollBar::TrueToFace(FX_FLOAT fTrue)\n{\n\tCPDF_Rect rcPosArea;\t\n\trcPosArea = GetScrollArea();\n\n\tFX_FLOAT fFactWidth = m_sData.ScrollRange.GetWidth() + m_sData.fClientWidth;\n\tfFactWidth = fFactWidth == 0 ? 1 : fFactWidth;\n\n\tFX_FLOAT fFace = 0;\n\n\tswitch(m_sbType)\n\t{\n\tcase SBT_HSCROLL:\n\t\tfFace = rcPosArea.left + fTrue * (rcPosArea.right - rcPosArea.left) / fFactWidth;\n\t\tbreak;\n\tcase SBT_VSCROLL:\n\t\tfFace = rcPosArea.top - fTrue * (rcPosArea.top - rcPosArea.bottom) / fFactWidth;\n\t\tbreak;\n\t}\t\n\n\treturn fFace;\n}\n\nFX_FLOAT CPWL_ScrollBar::FaceToTrue(FX_FLOAT fFace)\n{\n\tCPDF_Rect rcPosArea;\t\n\trcPosArea = GetScrollArea();\n\n\tFX_FLOAT fFactWidth = m_sData.ScrollRange.GetWidth() + m_sData.fClientWidth;\n\tfFactWidth = fFactWidth == 0 ? 1 : fFactWidth;\n\n\tFX_FLOAT fTrue = 0;\n\n\tswitch(m_sbType)\n\t{\n\tcase SBT_HSCROLL:\n\t\tfTrue =  (fFace - rcPosArea.left) * fFactWidth / (rcPosArea.right - rcPosArea.left);\n\t\tbreak;\n\tcase SBT_VSCROLL:\n\t\tfTrue = (rcPosArea.top - fFace) * fFactWidth / (rcPosArea.top - rcPosArea.bottom);\n\t\tbreak;\n\t}\t\n\n\treturn fTrue;\n}\n\nvoid CPWL_ScrollBar::CreateChildWnd(const PWL_CREATEPARAM & cp)\n{\n\tCreateButtons(cp);\n}\n\nvoid CPWL_ScrollBar::TimerProc()\n{\n\tPWL_SCROLL_PRIVATEDATA sTemp = m_sData;\n\n\tif (m_bMinOrMax)m_sData.SubSmall();\t\n\telse m_sData.AddSmall();\n\n\tif (FXSYS_memcmp(&m_sData, &sTemp, sizeof(PWL_SCROLL_PRIVATEDATA)) != 0)\n\t{\n\t\tMovePosButton(TRUE);\n\t\tNotifyScrollWindow();\n\t}\n}\n\n/*\nvoid CPWL_ScrollBar::OnSetFocus()\n{\n\tif (GetTransparency() != 255)\n\t{\n\t\tSetTransparency(255);\n\t\tInvalidateRect();\n\t}\n}\n\nvoid CPWL_ScrollBar::OnKillFocus()\n{\n\tif (GetTransparency() != PWL_SCROLLBAR_TRANSPARANCY)\n\t{\n\t\tSetTransparency(PWL_SCROLLBAR_TRANSPARANCY);\n\t\tInvalidateRect();\n\t}\n}\n*/\n\n"
  },
  {
    "path": "fpdfsdk/src/pdfwindow/PWL_Signature.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/pdfwindow/PDFWindow.h\"\n#include \"../../include/pdfwindow/PWL_Wnd.h\"\n#include \"../../include/pdfwindow/PWL_Icon.h\"\n#include \"../../include/pdfwindow/PWL_Signature.h\"\n#include \"../../include/pdfwindow/PWL_Label.h\"\n#include \"../../include/pdfwindow/PWL_Utils.h\"\n\n/* --------------------------------- CPWL_Signature_Image --------------------------------- */\n\nCPWL_Signature_Image::CPWL_Signature_Image() : m_pImage(NULL)\n{\n}\n\nCPWL_Signature_Image::~CPWL_Signature_Image()\n{\n}\n\nvoid CPWL_Signature_Image::SetImage(CFX_DIBSource* pImage)\n{\n\tm_pImage = pImage;\n}\n\nCFX_DIBSource* CPWL_Signature_Image::GetImage()\n{\n\treturn m_pImage;\n}\n\nvoid CPWL_Signature_Image::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)\n{\n\tCPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device);\n\n\tif (m_pImage)\n\t{\n\t\tCPDF_Rect rcClient = GetClientRect();\n\n\t\tFX_FLOAT x, y;\n\t\tpUser2Device->Transform(rcClient.left, rcClient.top, x, y);\n\n\t\tpDevice->StretchDIBits(m_pImage, (FX_INT32)x, (FX_INT32)y, \n\t\t\t(FX_INT32)rcClient.Width(), (FX_INT32)rcClient.Height());\n\t}\n}\n\nvoid CPWL_Signature_Image::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)\n{\n\tsAppStream << CPWL_Image::GetImageAppStream();\n}\n\nvoid CPWL_Signature_Image::GetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale)\n{\n\tFX_FLOAT fImageW, fImageH;\n\n\tGetImageSize(fImageW, fImageH);\n\n\tCPDF_Rect rcClient = GetClientRect();\n\n\tfHScale = rcClient.Width() / fImageW;\n\tfVScale = rcClient.Height() / fImageH;\t\n}\n\n/* --------------------------------- CPWL_Signature --------------------------------- */\n\nCPWL_Signature::CPWL_Signature() : \n\tm_pText(NULL),\n\tm_pDescription(NULL),\n\tm_pImage(NULL),\n\tm_bTextExist(TRUE),\n\tm_bImageExist(FALSE),\n\tm_bFlagExist(TRUE)\n{\n}\n\nCPWL_Signature::~CPWL_Signature()\n{\n}\n\nvoid CPWL_Signature::SetTextFlag(FX_BOOL bTextExist)\n{\n\tm_bTextExist = bTextExist;\n\n\tRePosChildWnd();\n}\n\nvoid CPWL_Signature::SetImageFlag(FX_BOOL bImageExist)\n{\n\tm_bImageExist = bImageExist;\n\n\tRePosChildWnd();\n}\n\nvoid CPWL_Signature::SetFoxitFlag(FX_BOOL bFlagExist)\n{\n\tm_bFlagExist = bFlagExist;\n}\n\nvoid CPWL_Signature::SetText(FX_LPCWSTR sText)\n{\n\tm_pText->SetText(sText);\n\n\tRePosChildWnd();\n}\n\nvoid CPWL_Signature::SetDescription(FX_LPCWSTR string)\n{\n\tm_pDescription->SetText(string);\n\n\tRePosChildWnd();\n}\n\nvoid CPWL_Signature::SetImage(CFX_DIBSource* pImage)\n{\n\tm_pImage->SetImage(pImage);\n\n\tRePosChildWnd();\n}\n\nvoid CPWL_Signature::SetImageStream(CPDF_Stream * pStream, FX_LPCSTR sImageAlias)\n{\n\tm_pImage->SetPDFStream(pStream);\n\tm_pImage->SetImageAlias(sImageAlias);\n\n\tRePosChildWnd();\n}\n\nvoid CPWL_Signature::RePosChildWnd()\n{\n\tCPDF_Rect rcClient = GetClientRect();\n\n\tCPDF_Rect rcText = rcClient;\n\tCPDF_Rect rcDescription = rcClient;\n\n\tFX_BOOL bTextVisible = m_bTextExist && m_pText->GetText().GetLength() > 0;\n\t\n\tif ((bTextVisible || m_bImageExist) &&\n\t\tm_pDescription->GetText().GetLength() > 0)\n\t{\n\t\tif (rcClient.Width() >= rcClient.Height())\n\t\t{\n\t\t\trcText.right = rcText.left + rcClient.Width() / 2.0f;\n\t\t\trcDescription.left = rcDescription.right - rcClient.Width() / 2.0f;\n\t\t}\n\t\telse\n\t\t{\n\t\t\trcText.bottom = rcText.top - rcClient.Height() / 2.0f;\n\t\t\trcDescription.top = rcDescription.bottom + rcClient.Height() / 2.0f;\n\t\t}\n\t}\n\n\tm_pText->SetVisible(bTextVisible);\n\tm_pImage->SetVisible(m_bImageExist);\n\n\tm_pText->Move(rcText, TRUE, FALSE);\n\tm_pImage->Move(rcText, TRUE, FALSE);\n\tm_pDescription->Move(rcDescription, TRUE, FALSE);\n}\n\nvoid CPWL_Signature::CreateChildWnd(const PWL_CREATEPARAM & cp)\n{\n\tm_pImage = new CPWL_Signature_Image;\n\tPWL_CREATEPARAM icp = cp;\n\ticp.pParentWnd = this;\n\ticp.dwFlags = PWS_CHILD | PWS_VISIBLE;\n\ticp.sTextColor = CPWL_Color(COLORTYPE_GRAY, 0);\n\tm_pImage->Create(icp);\n\n\tm_pText = new CPWL_Label;\n\tPWL_CREATEPARAM acp = cp;\n\tacp.pParentWnd = this;\n\tacp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_AUTOFONTSIZE | PES_MULTILINE | PES_AUTORETURN | PES_MIDDLE | PES_CENTER;\n\tacp.sTextColor = CPWL_Color(COLORTYPE_GRAY, 0);\n\tm_pText->Create(acp);\n\n\tm_pDescription = new CPWL_Label;\n\tPWL_CREATEPARAM dcp = cp;\n\tdcp.pParentWnd = this;\n\tdcp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_AUTOFONTSIZE | PES_MULTILINE | PES_AUTORETURN | PES_LEFT | PES_CENTER;\n\tdcp.sTextColor = CPWL_Color(COLORTYPE_GRAY, 0);\n\tm_pDescription->Create(dcp);\n}\n\nvoid CPWL_Signature::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)\n{\n\tCPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device);\n\n\tif (m_bFlagExist)\n\t\tCPWL_Utils::DrawIconAppStream(pDevice, pUser2Device, PWL_ICONTYPE_FOXIT, CPWL_Utils::GetCenterSquare(GetClientRect()),\n\t\t\tCPWL_Color(COLORTYPE_RGB,0.91f,0.855f,0.92f), CPWL_Color(COLORTYPE_TRANSPARENT), 255);\n\n\t/*\n\tCPDF_Rect rcClient = GetClientRect();\n\n\tCFX_PathData path;\n\n\tpath.SetPointCount(2);\n\tpath.SetPoint(0, rcClient.left, (rcClient.top + rcClient.bottom) * 0.5f, FXPT_MOVETO);\n\tpath.SetPoint(1, rcClient.right, (rcClient.top + rcClient.bottom) * 0.5f, FXPT_LINETO);\n\n\tCFX_GraphStateData gsd;\n\tgsd.SetDashCount(2);\t\t\t\t\n\tgsd.m_DashArray[0] = 6.0f;\n\tgsd.m_DashArray[1] = 6.0f;\n\tgsd.m_DashPhase = 0;\t\n\t\n\tgsd.m_LineWidth = 10.0f;\n\tpDevice->DrawPath(&path, pUser2Device, &gsd, 0, ArgbEncode(255,255,0,0), FXFILL_ALTERNATE);\n\t*/\n}\n\nvoid CPWL_Signature::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)\n{\n\tCPWL_Wnd::GetThisAppearanceStream(sAppStream);\n}\n\n\n"
  },
  {
    "path": "fpdfsdk/src/pdfwindow/PWL_SpecialButton.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/pdfwindow/PDFWindow.h\"\n#include \"../../include/pdfwindow/PWL_Wnd.h\"\n#include \"../../include/pdfwindow/PWL_Button.h\"\n#include \"../../include/pdfwindow/PWL_SpecialButton.h\"\n#include \"../../include/pdfwindow/PWL_Utils.h\"\n\n/* --------------------------- CPWL_PushButton ---------------------------- */\n\nCPWL_PushButton::CPWL_PushButton()\n{\n}\n\nCPWL_PushButton::~CPWL_PushButton()\n{\n}\n\nCFX_ByteString CPWL_PushButton::GetClassName() const\n{\n\treturn \"CPWL_PushButton\";\n}\n\nCPDF_Rect CPWL_PushButton::GetFocusRect() const\n{\n\treturn CPWL_Utils::DeflateRect(this->GetWindowRect(),(FX_FLOAT)GetBorderWidth());\n}\n\n/* --------------------------- CPWL_CheckBox ---------------------------- */\n\nCPWL_CheckBox::CPWL_CheckBox() : m_bChecked(FALSE)\n{\n}\n\nCPWL_CheckBox::~CPWL_CheckBox()\n{\n}\n\nCFX_ByteString CPWL_CheckBox::GetClassName() const\n{\n\treturn \"CPWL_CheckBox\";\n}\n\nvoid CPWL_CheckBox::SetCheck(FX_BOOL bCheck)\n{\n\tm_bChecked = bCheck;\n}\n\nFX_BOOL CPWL_CheckBox::IsChecked() const\n{\n\treturn m_bChecked;\n}\n\nFX_BOOL CPWL_CheckBox::OnLButtonUp(const CPDF_Point & point)\n{\n\tif (IsReadOnly()) return FALSE;\n\n\tSetCheck(!IsChecked());\n\treturn TRUE;\n}\n\nFX_BOOL CPWL_CheckBox::OnChar(FX_WORD nChar)\n{\n\tSetCheck(!IsChecked());\n\treturn TRUE;\n}\n\n/* --------------------------- CPWL_RadioButton ---------------------------- */\n\nCPWL_RadioButton::CPWL_RadioButton() : m_bChecked(FALSE)\n{\n}\n\nCPWL_RadioButton::~CPWL_RadioButton()\n{\n}\n\nCFX_ByteString CPWL_RadioButton::GetClassName() const\n{\n\treturn \"CPWL_RadioButton\";\n}\n\nFX_BOOL\tCPWL_RadioButton::OnLButtonUp(const CPDF_Point & point)\n{\n\tif (IsReadOnly()) return FALSE;\n\n\tSetCheck(TRUE);\n\treturn TRUE;\n}\n\nvoid CPWL_RadioButton::SetCheck(FX_BOOL bCheck)\n{\n\tm_bChecked = bCheck;\n}\n\nFX_BOOL CPWL_RadioButton::IsChecked() const\n{\n\treturn m_bChecked;\n}\n\nFX_BOOL CPWL_RadioButton::OnChar(FX_WORD nChar)\n{\n\tSetCheck(TRUE);\n\treturn TRUE;\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/pdfwindow/PWL_Utils.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/pdfwindow/PDFWindow.h\"\n#include \"../../include/pdfwindow/PWL_Wnd.h\"\n#include \"../../include/pdfwindow/PWL_Utils.h\"\n#include \"../../include/pdfwindow/PWL_Icon.h\"\n\n#define IsFloatZero(f)\t\t\t\t\t\t((f) < 0.0001 && (f) > -0.0001)\n#define IsFloatBigger(fa,fb)\t\t\t\t((fa) > (fb) && !IsFloatZero((fa) - (fb)))\n#define IsFloatSmaller(fa,fb)\t\t\t\t((fa) < (fb) && !IsFloatZero((fa) - (fb)))\n#define IsFloatEqual(fa,fb)\t\t\t\t\tIsFloatZero((fa)-(fb))\n\n/* ---------------------------- CPWL_Utils ------------------------------ */\n\nCFX_ByteString CPWL_Utils::GetAppStreamFromArray(const CPWL_PathData* pPathData, FX_INT32 nCount)\n{\n\tCFX_ByteTextBuf csAP;\n\n\tfor (FX_INT32 i=0; i<nCount; i++)\n\t{\n\t\tswitch (pPathData[i].type)\n\t\t{\n\t\tcase PWLPT_MOVETO:\n\t\t\tcsAP << pPathData[i].point.x << \" \" << pPathData[i].point.y << \" m\\n\";\n\t\t\tbreak;\n\t\tcase PWLPT_LINETO:\n\t\t\tcsAP << pPathData[i].point.x << \" \" << pPathData[i].point.y << \" l\\n\";\n\t\t\tbreak;\n\t\tcase PWLPT_BEZIERTO:\n\t\t\tcsAP << pPathData[i].point.x << \" \" << pPathData[i].point.y << \" \"\n\t\t\t\t << pPathData[i+1].point.x << \" \" << pPathData[i+1].point.y << \" \"\n\t\t\t\t << pPathData[i+2].point.x << \" \" << pPathData[i+2].point.y << \" c\\n\";\n\n\t\t\ti += 2;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn csAP.GetByteString();\n}\n\nvoid CPWL_Utils::GetPathDataFromArray(CFX_PathData& path, const CPWL_PathData* pPathData, FX_INT32 nCount)\n{\n\tpath.SetPointCount(nCount);\n\n\tfor (FX_INT32 i=0; i<nCount; i++)\n\t{\n\t\tswitch (pPathData[i].type)\n\t\t{\n\t\tcase PWLPT_MOVETO:\n\t\t\tpath.SetPoint(i, pPathData[i].point.x, pPathData[i].point.y, FXPT_MOVETO);\n\t\t\tbreak;\n\t\tcase PWLPT_LINETO:\n\t\t\tpath.SetPoint(i, pPathData[i].point.x, pPathData[i].point.y, FXPT_LINETO);\n\t\t\tbreak;\n\t\tcase PWLPT_BEZIERTO:\n\t\t\tpath.SetPoint(i, pPathData[i].point.x, pPathData[i].point.y, FXPT_BEZIERTO);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\nCPDF_Rect CPWL_Utils::MaxRect(const CPDF_Rect & rect1,const CPDF_Rect & rect2)\n{\n\tCPDF_Rect rcRet;\n\n\trcRet.left = PWL_MIN(rect1.left,rect2.left);\n\trcRet.bottom = PWL_MIN(rect1.bottom,rect2.bottom);\n\trcRet.right = PWL_MAX(rect1.right,rect2.right);\n\trcRet.top = PWL_MAX(rect1.top,rect2.top);\n\n\treturn rcRet;\n}\n\nCPDF_Rect CPWL_Utils::OffsetRect(const CPDF_Rect & rect,FX_FLOAT x,FX_FLOAT y)\n{\n\treturn CPDF_Rect(rect.left + x,rect.bottom + y,\n\t\trect.right + x,rect.top + y);\n}\n\nFX_BOOL CPWL_Utils::ContainsRect(const CPDF_Rect& rcParent, const CPDF_Rect& rcChild)\n{\n\treturn rcChild.left >= rcParent.left && rcChild.bottom >= rcParent.bottom &&\n\t\t\trcChild.right <= rcParent.right && rcChild.top <= rcParent.top;\n}\n\nFX_BOOL CPWL_Utils::IntersectRect(const CPDF_Rect& rect1, const CPDF_Rect& rect2)\n{\n\tFX_FLOAT left = rect1.left > rect2.left ? rect1.left : rect2.left;\n\tFX_FLOAT right = rect1.right < rect2.right ? rect1.right : rect2.right;\n\tFX_FLOAT bottom = rect1.bottom > rect2.bottom ? rect1.bottom : rect2.bottom;\n\tFX_FLOAT top = rect1.top < rect2.top ? rect1.top : rect2.top;\n\n\treturn left < right && bottom < top;\n}\n\nCPDF_Point CPWL_Utils::OffsetPoint(const CPDF_Point& point,FX_FLOAT x,FX_FLOAT y)\n{\n\treturn CPDF_Point(point.x + x,point.y + y);\n}\n\nCPVT_WordRange CPWL_Utils::OverlapWordRange(const CPVT_WordRange & wr1, const CPVT_WordRange & wr2)\n{\n\tCPVT_WordRange wrRet;\n\n\tif (wr2.EndPos.WordCmp(wr1.BeginPos) < 0 || wr2.BeginPos.WordCmp(wr1.EndPos) > 0) return wrRet;\n\tif (wr1.EndPos.WordCmp(wr2.BeginPos) < 0 || wr1.BeginPos.WordCmp(wr2.EndPos) > 0) return wrRet;\n\n\tif (wr1.BeginPos.WordCmp(wr2.BeginPos) < 0)\n\t{\n\t\twrRet.BeginPos = wr2.BeginPos;\n\t}\n\telse\n\t{\n\t\twrRet.BeginPos = wr1.BeginPos;\n\t}\n\n\tif (wr1.EndPos.WordCmp(wr2.EndPos) < 0)\n\t{\n\t\twrRet.EndPos = wr1.EndPos;\n\t}\n\telse\n\t{\n\t\twrRet.EndPos = wr2.EndPos;\n\t}\n\n\treturn wrRet;\n}\n\nCFX_ByteString CPWL_Utils::GetAP_Check(const CPDF_Rect & crBBox)\n{\n\tCFX_ByteTextBuf csAP;\n\n\tFX_FLOAT fWidth = crBBox.right - crBBox.left;\n\tFX_FLOAT fHeight = crBBox.top - crBBox.bottom;\n\n\tconst FX_INT32 num = 8;\n\n\tCPWL_Point pts[num*3] = \n\t{\n\t\t//1\n\t\tCPWL_Point(0.28f, 0.52f), \n\t\tCPWL_Point(0.27f, 0.48f),\n\t\tCPWL_Point(0.29f, 0.40f),\n\n\t\t//2\n\t\tCPWL_Point(0.30f, 0.33f), \n\t\tCPWL_Point(0.31f, 0.29f),\n\t\tCPWL_Point(0.31f, 0.28f),\n\n\t\t//3\n\t\tCPWL_Point(0.39f, 0.28f), \n\t\tCPWL_Point(0.49f, 0.29f),\n\t\tCPWL_Point(0.77f, 0.67f),\n\n\t\t//4\n\t\tCPWL_Point(0.76f, 0.68f), \n\t\tCPWL_Point(0.78f, 0.69f),\n\t\tCPWL_Point(0.76f, 0.75f),\n\n\t\t//5\n\t\tCPWL_Point(0.76f, 0.75f), \n\t\tCPWL_Point(0.73f, 0.80f),\n\t\tCPWL_Point(0.68f, 0.75f),\n\n\t\t//6\n\t\tCPWL_Point(0.68f, 0.74f), \n\t\tCPWL_Point(0.68f, 0.74f),\n\t\tCPWL_Point(0.44f, 0.47f),\n\n\t\t//7\n\t\tCPWL_Point(0.43f, 0.47f), \n\t\tCPWL_Point(0.40f, 0.47f),\n\t\tCPWL_Point(0.41f, 0.58f),\n\n\t\t//8\n\t\tCPWL_Point(0.40f, 0.60f), \n\t\tCPWL_Point(0.28f, 0.66f),\n\t\tCPWL_Point(0.30f, 0.56f)\n\t};\n\n\tfor (FX_INT32 j=0; j<num*3; j++)\n\t{\n\t\tpts[j].x *= fWidth;\n\t\tpts[j].x += crBBox.left;\n\n\t\tpts[j].y *= fHeight;\n\t\tpts[j].y += crBBox.bottom;\n\t}\n\n\tcsAP << pts[0].x << \" \" << pts[0].y << \" m\\n\";\n\n\tfor (FX_INT32 i=0; i<num; i++)\n\t{\n\t\tFX_INT32 nCur = i*3;\n\t\tFX_INT32 n1 = i*3 + 1;\n\t\tFX_INT32 n2 = i*3 + 2;\n\t\tFX_INT32 nNext = (i < num-1 ? (i+1)*3 : 0);\n\n\t\tFX_FLOAT px1 = pts[n1].x - pts[nCur].x;\n\t\tFX_FLOAT py1 = pts[n1].y - pts[nCur].y;\n\t\tFX_FLOAT px2 = pts[n2].x - pts[nNext].x;\n\t\tFX_FLOAT py2 = pts[n2].y - pts[nNext].y;\n\n\t\tcsAP << pts[nCur].x + px1 * PWL_BEZIER << \" \" << pts[nCur].y + py1 * PWL_BEZIER << \" \" \n\t\t\t<< pts[nNext].x + px2 * PWL_BEZIER << \" \" << pts[nNext].y + py2 * PWL_BEZIER << \" \"\n\t\t\t<< pts[nNext].x << \" \" << pts[nNext].y << \" c\\n\";\n\t}\n\n\treturn csAP.GetByteString();\n}\n\nCFX_ByteString CPWL_Utils::GetAP_Circle(const CPDF_Rect & crBBox)\n{\n\tCFX_ByteTextBuf csAP;\n\n\tFX_FLOAT fWidth = crBBox.right - crBBox.left;\n\tFX_FLOAT fHeight = crBBox.top - crBBox.bottom;\n\n\tCPDF_Point pt1(crBBox.left,crBBox.bottom + fHeight / 2);\n\tCPDF_Point pt2(crBBox.left + fWidth / 2,crBBox.top);\n\tCPDF_Point pt3(crBBox.right,crBBox.bottom + fHeight / 2);\n\tCPDF_Point pt4(crBBox.left + fWidth / 2,crBBox.bottom);\n\n\tcsAP << pt1.x << \" \" << pt1.y << \" m\\n\";\n\n\tFX_FLOAT px = pt2.x - pt1.x;\n\tFX_FLOAT py = pt2.y - pt1.y;\n\n\tcsAP << pt1.x << \" \" << pt1.y + py * PWL_BEZIER << \" \" \n\t\t<< pt2.x - px * PWL_BEZIER << \" \" << pt2.y << \" \"\n\t\t<< pt2.x << \" \" << pt2.y << \" c\\n\";\n\n\tpx = pt3.x - pt2.x;\n\tpy = pt2.y - pt3.y;\n\n\tcsAP << pt2.x + px * PWL_BEZIER << \" \" << pt2.y << \" \" \n\t\t<< pt3.x << \" \" << pt3.y + py * PWL_BEZIER << \" \"\n\t\t<< pt3.x << \" \" << pt3.y << \" c\\n\";\n\n\tpx = pt3.x - pt4.x;\n\tpy = pt3.y - pt4.y;\n\n\tcsAP << pt3.x << \" \" << pt3.y - py * PWL_BEZIER << \" \" \n\t\t<< pt4.x + px * PWL_BEZIER << \" \" << pt4.y << \" \"\n\t\t<< pt4.x << \" \" << pt4.y << \" c\\n\";\n\n\tpx = pt4.x - pt1.x;\n\tpy = pt1.y - pt4.y;\n\n\tcsAP << pt4.x - px * PWL_BEZIER << \" \" << pt4.y << \" \" \n\t\t<< pt1.x << \" \" << pt1.y - py * PWL_BEZIER << \" \"\n\t\t<< pt1.x << \" \" << pt1.y << \" c\\n\";\n\n\treturn csAP.GetByteString();\n}\n\nCFX_ByteString CPWL_Utils::GetAP_Cross(const CPDF_Rect & crBBox)\n{\n\tCFX_ByteTextBuf csAP;\n\n\tcsAP << crBBox.left << \" \" << crBBox.top << \" m\\n\";\n\tcsAP << crBBox.right << \" \" << crBBox.bottom << \" l\\n\";\n\tcsAP << crBBox.left << \" \" << crBBox.bottom << \" m\\n\";\n\tcsAP << crBBox.right << \" \" << crBBox.top << \" l\\n\";\n\n\treturn csAP.GetByteString();\n}\n\nCFX_ByteString CPWL_Utils::GetAP_Diamond(const CPDF_Rect & crBBox)\n{\n\tCFX_ByteTextBuf csAP;\n\n\tFX_FLOAT fWidth = crBBox.right - crBBox.left;\n\tFX_FLOAT fHeight = crBBox.top - crBBox.bottom;\n\n\tCPDF_Point pt1(crBBox.left,crBBox.bottom + fHeight / 2);\n\tCPDF_Point pt2(crBBox.left + fWidth / 2,crBBox.top);\n\tCPDF_Point pt3(crBBox.right,crBBox.bottom + fHeight / 2);\n\tCPDF_Point pt4(crBBox.left + fWidth / 2,crBBox.bottom);\n\t\n\tcsAP << pt1.x << \" \" << pt1.y << \" m\\n\";\n\tcsAP << pt2.x << \" \" << pt2.y << \" l\\n\";\n\tcsAP << pt3.x << \" \" << pt3.y << \" l\\n\";\n\tcsAP << pt4.x << \" \" << pt4.y << \" l\\n\";\n\tcsAP << pt1.x << \" \" << pt1.y << \" l\\n\";\n\n\treturn csAP.GetByteString();\n}\n\nCFX_ByteString CPWL_Utils::GetAP_Square(const CPDF_Rect & crBBox)\n{\n\tCFX_ByteTextBuf csAP;\n\n\tcsAP << crBBox.left << \" \" << crBBox.top << \" m\\n\";\n\tcsAP << crBBox.right << \" \" << crBBox.top << \" l\\n\";\n\tcsAP << crBBox.right << \" \" << crBBox.bottom << \" l\\n\";\n\tcsAP << crBBox.left << \" \" << crBBox.bottom << \" l\\n\";\n\tcsAP << crBBox.left << \" \" << crBBox.top << \" l\\n\";\n\n\treturn csAP.GetByteString();\n}\n\nCFX_ByteString CPWL_Utils::GetAP_Star(const CPDF_Rect & crBBox)\n{\n\tCFX_ByteTextBuf csAP;\n\n\tFX_FLOAT fRadius = (crBBox.top - crBBox.bottom)/(1+(FX_FLOAT)cos(PWL_PI/5.0f));\n\tCPDF_Point ptCenter = CPDF_Point((crBBox.left + crBBox.right) / 2.0f,(crBBox.top + crBBox.bottom) / 2.0f);\n\t\n\tFX_FLOAT px[5],py[5];\n\n\tFX_FLOAT fAngel = PWL_PI/10.0f;\n\n\tfor (FX_INT32 i=0; i<5; i++)\n\t{\n\t\tpx[i] = ptCenter.x + fRadius * (FX_FLOAT)cos(fAngel);\n\t\tpy[i] = ptCenter.y + fRadius * (FX_FLOAT)sin(fAngel);\n\n\t\tfAngel += PWL_PI * 2 / 5.0f;\n\t}\n\n\tcsAP << px[0] << \" \" << py[0] << \" m\\n\";\n\n\tFX_INT32 nNext = 0;\n\tfor (FX_INT32 j=0; j<5; j++)\n\t{\n\t\tnNext += 2;\n\t\tif (nNext >= 5) nNext -= 5;\n\t\tcsAP << px[nNext] << \" \" << py[nNext] << \" l\\n\";\n\t}\n\n\treturn csAP.GetByteString();\n}\n\nCFX_ByteString CPWL_Utils::GetAP_HalfCircle(const CPDF_Rect & crBBox,FX_FLOAT fRotate)\n{\n\tCFX_ByteTextBuf csAP;\n\n\tFX_FLOAT fWidth = crBBox.right - crBBox.left;\n\tFX_FLOAT fHeight = crBBox.top - crBBox.bottom;\n\n\tCPDF_Point pt1(-fWidth/2,0);\n\tCPDF_Point pt2(0,fHeight/2);\n\tCPDF_Point pt3(fWidth/2,0);\n\n\tFX_FLOAT px,py;\n\n\tcsAP << cos(fRotate) << \" \" << sin(fRotate) << \" \" << -sin(fRotate) << \" \" << cos(fRotate) << \" \" \n\t\t<< crBBox.left + fWidth / 2 << \" \" << crBBox.bottom + fHeight / 2 << \" cm\\n\";\n\n\n\tcsAP << pt1.x << \" \" << pt1.y << \" m\\n\";\n\n\tpx = pt2.x - pt1.x;\n\tpy = pt2.y - pt1.y;\n\n\tcsAP << pt1.x << \" \" << pt1.y + py * PWL_BEZIER << \" \" \n\t\t<< pt2.x - px * PWL_BEZIER << \" \" << pt2.y << \" \"\n\t\t<< pt2.x << \" \" << pt2.y << \" c\\n\";\n\n\tpx = pt3.x - pt2.x;\n\tpy = pt2.y - pt3.y;\n\n\tcsAP << pt2.x + px * PWL_BEZIER << \" \" << pt2.y << \" \" \n\t\t<< pt3.x << \" \" << pt3.y + py * PWL_BEZIER << \" \"\n\t\t<< pt3.x << \" \" << pt3.y << \" c\\n\";\n\n\treturn csAP.GetByteString();\n}\n\n\nCPDF_Rect CPWL_Utils::InflateRect(const CPDF_Rect & rcRect, FX_FLOAT fSize)\n{\n\tif (rcRect.IsEmpty()) return rcRect;\n\n\tCPDF_Rect rcNew(rcRect.left - fSize,\n\t\t\t\t\trcRect.bottom - fSize,\n\t\t\t\t\trcRect.right + fSize,\n\t\t\t\t\trcRect.top + fSize);\n\trcNew.Normalize();\n\treturn rcNew;\n}\n\nCPDF_Rect CPWL_Utils::DeflateRect(const CPDF_Rect & rcRect, FX_FLOAT fSize)\n{\n\tif (rcRect.IsEmpty()) return rcRect;\n\n\tCPDF_Rect rcNew(rcRect.left + fSize,\n\t\t\t\t\trcRect.bottom + fSize,\n\t\t\t\t\trcRect.right - fSize,\n\t\t\t\t\trcRect.top - fSize);\n\trcNew.Normalize();\n\treturn rcNew;\n}\n\nCPDF_Rect CPWL_Utils::ScaleRect(const CPDF_Rect & rcRect,FX_FLOAT fScale)\n{\n\tFX_FLOAT fHalfWidth = (rcRect.right - rcRect.left) / 2.0f;\n\tFX_FLOAT fHalfHeight = (rcRect.top - rcRect.bottom) / 2.0f;\n\n\tCPDF_Point ptCenter = CPDF_Point((rcRect.left + rcRect.right) / 2,(rcRect.top + rcRect.bottom) / 2);\n\n\treturn CPDF_Rect(ptCenter.x - fHalfWidth * fScale,\n\t\t\t\tptCenter.y - fHalfHeight * fScale,\n\t\t\t\tptCenter.x + fHalfWidth * fScale,\n\t\t\t\tptCenter.y + fHalfHeight * fScale);\n}\n\nCFX_ByteString CPWL_Utils::GetRectFillAppStream(const CPDF_Rect & rect,const CPWL_Color & color)\n{\n\tCFX_ByteTextBuf sAppStream;\n\n\tCFX_ByteString sColor = GetColorAppStream(color,TRUE);\n\tif (sColor.GetLength() > 0)\n\t{\n\t\tsAppStream << \"q\\n\" << sColor;\n\t\tsAppStream << rect.left << \" \" << rect.bottom << \" \"\n\t\t\t<< rect.right - rect.left << \" \" << rect.top - rect.bottom << \" re f\\nQ\\n\";\t\t\n\t}\n\t\n\treturn sAppStream.GetByteString();\n}\n\nCFX_ByteString CPWL_Utils::GetCircleFillAppStream(const CPDF_Rect & rect,const CPWL_Color & color)\n{\n\tCFX_ByteTextBuf sAppStream;\n\n\tCFX_ByteString sColor = GetColorAppStream(color,TRUE);\n\tif (sColor.GetLength() > 0)\n\t{\n\t\tsAppStream << \"q\\n\" << sColor << CPWL_Utils::GetAP_Circle(rect) << \"f\\nQ\\n\";\t\t\n\t}\n\t\n\treturn sAppStream.GetByteString();\n}\n\nCPDF_Rect CPWL_Utils::GetCenterSquare(const CPDF_Rect & rect)\n{\n\tFX_FLOAT fWidth = rect.right -  rect.left;\n\tFX_FLOAT fHeight = rect.top - rect.bottom;\n\n\tFX_FLOAT fCenterX = (rect.left + rect.right)/2.0f;\n\tFX_FLOAT fCenterY = (rect.top + rect.bottom)/2.0f;\n\n\tFX_FLOAT fRadius = (fWidth > fHeight) ? fHeight / 2 : fWidth / 2;\n\n\treturn CPDF_Rect(fCenterX - fRadius,fCenterY - fRadius,fCenterX + fRadius,fCenterY + fRadius);\n}\n\nCFX_ByteString CPWL_Utils::GetEditAppStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset, const CPVT_WordRange * pRange, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tFX_BOOL bContinuous, FX_WORD SubWord)\n{\n\treturn IFX_Edit::GetEditAppearanceStream(pEdit,ptOffset,pRange,bContinuous,SubWord);\n}\n\nCFX_ByteString CPWL_Utils::GetEditSelAppStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset, \n\t\t\t\t\t\t\t\tconst CPVT_WordRange * pRange)\n{\n\treturn IFX_Edit::GetSelectAppearanceStream(pEdit,ptOffset,pRange);\n}\n\nstatic CFX_ByteString GetSquigglyAppearanceStream(FX_FLOAT fStartX, FX_FLOAT fEndX, FX_FLOAT fY, FX_FLOAT fStep)\n{\n\tCFX_ByteTextBuf sRet;\n\n\tsRet << \"0 w\\n\" << fStartX << \" \" << fY << \" m\\n\";\n\n\tFX_FLOAT fx;\n\tFX_INT32 i;\n\n\tfor (i=1,fx=fStartX+fStep; fx<fEndX; fx+=fStep,i++)\n\t{\n\t\tsRet << fx << \" \" << fY + (i&1)*fStep << \" l\\n\";\n\t}\n\n\tsRet << \"S\\n\";\n\n\treturn sRet.GetByteString();\n}\n\nstatic CFX_ByteString GetWordSpellCheckAppearanceStream(IFX_Edit_Iterator* pIterator, const CPDF_Point & ptOffset,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  const CPVT_WordRange & wrWord)\n{\n\tCFX_ByteTextBuf sRet;\n\n\tFX_FLOAT fStartX = 0.0f;\n\tFX_FLOAT fEndX = 0.0f;\n\tFX_FLOAT fY = 0.0f;\n\tFX_FLOAT fStep = 0.0f; \n\n\tFX_BOOL bBreak = FALSE;\n\n\tif (pIterator)\n\t{\n\t\tpIterator->SetAt(wrWord.BeginPos);\n\n\t\tdo\n\t\t{\n\t\t\tCPVT_WordPlace place = pIterator->GetAt();\n\n\t\t\tCPVT_Line line;\t\t\t\t\n\t\t\tif (pIterator->GetLine(line))\n\t\t\t{\n\t\t\t\tfY = line.ptLine.y;\n\t\t\t\tfStep = (line.fLineAscent - line.fLineDescent) / 16.0f;\n\t\t\t}\n\n\t\t\tif (place.LineCmp(wrWord.BeginPos) == 0)\n\t\t\t{\n\t\t\t\tpIterator->SetAt(wrWord.BeginPos);\n\t\t\t\tCPVT_Word word;\n\t\t\t\tif (pIterator->GetWord(word))\n\t\t\t\t{\n\t\t\t\t\tfStartX = word.ptWord.x;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfStartX = line.ptLine.x;\n\t\t\t}\n\n\t\t\tif (place.LineCmp(wrWord.EndPos) == 0)\n\t\t\t{\n\t\t\t\tpIterator->SetAt(wrWord.EndPos);\n\t\t\t\tCPVT_Word word;\n\t\t\t\tif (pIterator->GetWord(word))\n\t\t\t\t{\n\t\t\t\t\tfEndX = word.ptWord.x + word.fWidth;\n\t\t\t\t}\n\n\t\t\t\tbBreak = TRUE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfEndX = line.ptLine.x + line.fLineWidth;\n\t\t\t}\n\n\t\t\tsRet << GetSquigglyAppearanceStream(fStartX + ptOffset.x, fEndX + ptOffset.x, fY + ptOffset.y,fStep);\n\n\t\t\tif (bBreak) break;\n\t\t}\n\t\twhile (pIterator->NextLine());\n\t}\n\n\treturn sRet.GetByteString();\n}\n\nCFX_ByteString CPWL_Utils::GetSpellCheckAppStream(IFX_Edit* pEdit, IPWL_SpellCheck* pSpellCheck, const CPDF_Point & ptOffset,\n\t\t\t\t\t\t\t\tconst CPVT_WordRange * pRange)\n{\n\tASSERT(pEdit != NULL);\n\tASSERT(pSpellCheck != NULL);\n\n\tCFX_ByteTextBuf sRet;\n\n\tif (pRange && pRange->IsExist())\n\t{\n\t\tif (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())\n\t\t{\n\t\t\tpIterator->SetAt(pRange->BeginPos);\n\n\t\t\tFX_BOOL bLatinWord = FALSE;\n\t\t\tCPVT_WordPlace wpWordStart;\n\t\t\tCFX_ByteString sWord;\n\n\t\t\tCPVT_WordPlace oldplace;\n\t\t\twhile (pIterator->NextWord())\n\t\t\t{\n\t\t\t\tCPVT_WordPlace place = pIterator->GetAt();\n\t\t\t\tif (pRange && place.WordCmp(pRange->EndPos) > 0) break;\t\t\t\t\n\n\t\t\t\tCPVT_Word word;\n\t\t\t\tif (pIterator->GetWord(word))\n\t\t\t\t{\n\t\t\t\t\tif (FX_EDIT_ISLATINWORD(word.Word))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!bLatinWord)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twpWordStart = place;\n\t\t\t\t\t\t\tbLatinWord = TRUE;\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsWord += (char)word.Word;\n\t\t\t\t\t\toldplace = place;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (bLatinWord)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (!pSpellCheck->CheckWord(sWord))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tsRet << GetWordSpellCheckAppearanceStream(pIterator,ptOffset,CPVT_WordRange(wpWordStart,oldplace));\n\t\t\t\t\t\t\t\tpIterator->SetAt(place);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbLatinWord = FALSE;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsWord.Empty();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (bLatinWord)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!pSpellCheck->CheckWord(sWord))\n\t\t\t\t\t\t\tsRet << GetWordSpellCheckAppearanceStream(pIterator,ptOffset,CPVT_WordRange(wpWordStart,oldplace));\n\t\t\t\t\t\tbLatinWord = FALSE;\n\t\t\t\t\t\tsWord.Empty();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (bLatinWord)\n\t\t\t{\n\t\t\t\tif (!pSpellCheck->CheckWord(sWord))\n\t\t\t\t\tsRet << GetWordSpellCheckAppearanceStream(pIterator,ptOffset,CPVT_WordRange(wpWordStart,oldplace));\n\n\t\t\t\tbLatinWord = FALSE;\n\t\t\t\tsWord.Empty();\n\t\t\t}\n\t\t}\n\t}\n\n\treturn sRet.GetByteString();\n}\n\nCFX_ByteString CPWL_Utils::GetTextAppStream(const CPDF_Rect & rcBBox,IFX_Edit_FontMap * pFontMap,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst CFX_WideString & sText, FX_INT32 nAlignmentH, FX_INT32 nAlignmentV,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tFX_FLOAT fFontSize, FX_BOOL bMultiLine, FX_BOOL bAutoReturn, const CPWL_Color & crText)\n{\n\tCFX_ByteTextBuf sRet;\n\n\tif (IFX_Edit * pEdit = IFX_Edit::NewEdit())\n\t{\t\t\t\n\t\tpEdit->SetFontMap(pFontMap);\n\n\t\tpEdit->SetPlateRect(rcBBox);\n\t\tpEdit->SetAlignmentH(nAlignmentH);\n\t\tpEdit->SetAlignmentV(nAlignmentV);\n\t\tpEdit->SetMultiLine(bMultiLine);\n\t\tpEdit->SetAutoReturn(bAutoReturn);\n\t\tif (IsFloatZero(fFontSize))\n\t\t\tpEdit->SetAutoFontSize(TRUE);\n\t\telse\n\t\t\tpEdit->SetFontSize(fFontSize);\n\t\tpEdit->Initialize();\n\n\t\tpEdit->SetText(sText);\n\t\t\n\t\tCFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(pEdit, CPDF_Point(0.0f,0.0f));\n\t\tif (sEdit.GetLength() > 0)\n\t\t{\n\t\t\tsRet << \"BT\\n\" << CPWL_Utils::GetColorAppStream(crText) << sEdit << \"ET\\n\";\n\t\t}\n\t\t\n\t\tIFX_Edit::DelEdit(pEdit);\n\t}\n\n\treturn sRet.GetByteString();\n}\n\nCFX_ByteString CPWL_Utils::GetPushButtonAppStream(const CPDF_Rect & rcBBox,\n\t\t\t\t\t\t\t\t\t\t\tIFX_Edit_FontMap * pFontMap,\n\t\t\t\t\t\t\t\t\t\t\tCPDF_Stream * pIconStream,\n\t\t\t\t\t\t\t\t\t\t\tCPDF_IconFit & IconFit,\n\t\t\t\t\t\t\t\t\t\t\tconst CFX_WideString & sLabel,\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tconst CPWL_Color & crText,\n\t\t\t\t\t\t\t\t\t\t\tFX_FLOAT fFontSize,\n\t\t\t\t\t\t\t\t\t\t\tFX_INT32 nLayOut)\n{\n\tconst FX_FLOAT fAutoFontScale = 1.0f / 3.0f;\t\n\n\tif (IFX_Edit * pEdit = IFX_Edit::NewEdit())\n\t{\t\t\t\n\t\tpEdit->SetFontMap(pFontMap);\n\n\t\tpEdit->SetAlignmentH(1);\n\t\tpEdit->SetAlignmentV(1);\n\t\tpEdit->SetMultiLine(FALSE);\n\t\tpEdit->SetAutoReturn(FALSE);\n\t\tif (IsFloatZero(fFontSize))\n\t\t\tpEdit->SetAutoFontSize(TRUE);\n\t\telse\n\t\t\tpEdit->SetFontSize(fFontSize);\n\t\tpEdit->Initialize();\n\t\tpEdit->SetText(sLabel);\n\n\t\tCPDF_Rect rcLabelContent = pEdit->GetContentRect();\n\t\t\n\t\tCPWL_Icon Icon;\n\t\tPWL_CREATEPARAM cp;\n\t\tcp.dwFlags = PWS_VISIBLE;\n\t\tIcon.Create(cp);\n\t\tIcon.SetIconFit(&IconFit);\n\t\tIcon.SetPDFStream(pIconStream);\n\n\t\tCPDF_Rect rcLabel = CPDF_Rect(0,0,0,0);\n\t\tCPDF_Rect rcIcon = CPDF_Rect(0,0,0,0);\n\t\tFX_FLOAT fWidth = 0.0f;\n\t\tFX_FLOAT fHeight = 0.0f;\n\n\t\tswitch (nLayOut)\n\t\t{\n\t\tcase PPBL_LABEL:\n\t\t\trcLabel = rcBBox;\n\t\t\trcIcon = CPDF_Rect(0,0,0,0);\n\t\t\tbreak;\n\t\tcase PPBL_ICON:\n\t\t\trcIcon = rcBBox;\n\t\t\trcLabel = CPDF_Rect(0,0,0,0);\n\t\t\tbreak;\n\t\tcase PPBL_ICONTOPLABELBOTTOM:\n\n\t\t\tif (pIconStream)\n\t\t\t{\n\t\t\t\tif (IsFloatZero(fFontSize))\n\t\t\t\t{\n\t\t\t\t\tfHeight = rcBBox.top - rcBBox.bottom;\n\t\t\t\t\trcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.right,rcBBox.bottom + fHeight * fAutoFontScale);\n\t\t\t\t\trcIcon = CPDF_Rect(rcBBox.left,rcLabel.top,rcBBox.right,rcBBox.top);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tfHeight = rcLabelContent.Height();\n\n\t\t\t\t\tif (rcBBox.bottom + fHeight > rcBBox.top)\n\t\t\t\t\t{\t\t\t\n\t\t\t\t\t\trcIcon = CPDF_Rect(0,0,0,0);\t\t\t\t\n\t\t\t\t\t\trcLabel = rcBBox;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\trcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.right,rcBBox.bottom + fHeight);\n\t\t\t\t\t\trcIcon = CPDF_Rect(rcBBox.left,rcLabel.top,rcBBox.right,rcBBox.top);\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\trcLabel = rcBBox;\n\t\t\t\trcIcon = CPDF_Rect(0,0,0,0);\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase PPBL_LABELTOPICONBOTTOM:\n\n\t\t\tif (pIconStream)\n\t\t\t{\n\t\t\t\tif (IsFloatZero(fFontSize))\n\t\t\t\t{\n\t\t\t\t\tfHeight = rcBBox.top - rcBBox.bottom;\n\t\t\t\t\trcLabel = CPDF_Rect(rcBBox.left,rcBBox.top - fHeight * fAutoFontScale ,rcBBox.right,rcBBox.top);\n\t\t\t\t\trcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.right,rcLabel.bottom);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tfHeight = rcLabelContent.Height();\n\n\t\t\t\t\tif (rcBBox.bottom + fHeight > rcBBox.top)\n\t\t\t\t\t{\t\t\t\n\t\t\t\t\t\trcIcon = CPDF_Rect(0,0,0,0);\t\t\t\t\n\t\t\t\t\t\trcLabel = rcBBox;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\trcLabel = CPDF_Rect(rcBBox.left,rcBBox.top - fHeight,rcBBox.right,rcBBox.top);\n\t\t\t\t\t\trcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.right,rcLabel.bottom);\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\trcLabel = rcBBox;\n\t\t\t\trcIcon = CPDF_Rect(0,0,0,0);\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase PPBL_ICONLEFTLABELRIGHT:\n\n\t\t\tif (pIconStream)\n\t\t\t{\n\t\t\t\tif (IsFloatZero(fFontSize))\n\t\t\t\t{\n\t\t\t\t\tfWidth = rcBBox.right - rcBBox.left;\n\t\t\t\t\trcLabel = CPDF_Rect(rcBBox.right - fWidth * fAutoFontScale,rcBBox.bottom,rcBBox.right,rcBBox.top);\n\t\t\t\t\trcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcLabel.left,rcBBox.top);\n\n\t\t\t\t\tif (rcLabelContent.Width() < fWidth * fAutoFontScale)\n\t\t\t\t\t{\t\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\telse \n\t\t\t\t\t{\n\t\t\t\t\t\tif (rcLabelContent.Width() < fWidth)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trcLabel = CPDF_Rect(rcBBox.right - rcLabelContent.Width(),rcBBox.bottom,rcBBox.right,rcBBox.top);\n\t\t\t\t\t\t\trcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcLabel.left,rcBBox.top);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trcLabel = rcBBox;\n\t\t\t\t\t\t\trcIcon = CPDF_Rect(0,0,0,0);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tfWidth = rcLabelContent.Width();\n\n\t\t\t\t\tif (rcBBox.left + fWidth > rcBBox.right)\n\t\t\t\t\t{\n\t\t\t\t\t\trcLabel = rcBBox;\n\t\t\t\t\t\trcIcon = CPDF_Rect(0,0,0,0);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\trcLabel = CPDF_Rect(rcBBox.right - fWidth,rcBBox.bottom,rcBBox.right,rcBBox.top);\n\t\t\t\t\t\trcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcLabel.left,rcBBox.top);\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\trcLabel = rcBBox;\n\t\t\t\trcIcon = CPDF_Rect(0,0,0,0);\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase PPBL_LABELLEFTICONRIGHT:\n\n\t\t\tif (pIconStream)\n\t\t\t{\n\t\t\t\tif (IsFloatZero(fFontSize))\n\t\t\t\t{\n\t\t\t\t\tfWidth = rcBBox.right - rcBBox.left;\n\t\t\t\t\trcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.left + fWidth * fAutoFontScale,rcBBox.top);\n\t\t\t\t\trcIcon = CPDF_Rect(rcLabel.right,rcBBox.bottom,rcBBox.right,rcBBox.top);\n\n\t\t\t\t\tif (rcLabelContent.Width() < fWidth * fAutoFontScale)\n\t\t\t\t\t{\t\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\telse \n\t\t\t\t\t{\n\t\t\t\t\t\tif (rcLabelContent.Width() < fWidth)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.left + rcLabelContent.Width(),rcBBox.top);\n\t\t\t\t\t\t\trcIcon = CPDF_Rect(rcLabel.right,rcBBox.bottom,rcBBox.right,rcBBox.top);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trcLabel = rcBBox;\n\t\t\t\t\t\t\trcIcon = CPDF_Rect(0,0,0,0);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tfWidth = rcLabelContent.Width();\n\n\t\t\t\t\tif (rcBBox.left + fWidth > rcBBox.right)\n\t\t\t\t\t{\n\t\t\t\t\t\trcLabel = rcBBox;\n\t\t\t\t\t\trcIcon = CPDF_Rect(0,0,0,0);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\trcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.left + fWidth,rcBBox.top);\n\t\t\t\t\t\trcIcon = CPDF_Rect(rcLabel.right,rcBBox.bottom,rcBBox.right,rcBBox.top);\t\t\n\t\t\t\t\t}\t\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\trcLabel = rcBBox;\n\t\t\t\trcIcon = CPDF_Rect(0,0,0,0);\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase PPBL_LABELOVERICON:\n\t\t\trcLabel = rcBBox;\n\t\t\trcIcon = rcBBox;\n\t\t\tbreak;\n\t\t}\n\n\t\tCFX_ByteTextBuf sAppStream,sTemp;\n\n\t\tif (!rcIcon.IsEmpty())\n\t\t{\n\t\t\tIcon.Move(rcIcon, FALSE, FALSE);\n\t\t\tsTemp << Icon.GetImageAppStream();\n\t\t}\n\n\t\tIcon.Destroy();\n\n\t\tif (!rcLabel.IsEmpty())\n\t\t{\n\t\t\tpEdit->SetPlateRect(rcLabel);\n\t\t\tCFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(pEdit,CPDF_Point(0.0f,0.0f));\n\t\t\tif (sEdit.GetLength() > 0)\n\t\t\t{\n\t\t\t\tsTemp << \"BT\\n\" << CPWL_Utils::GetColorAppStream(crText) << sEdit << \"ET\\n\";\n\t\t\t}\n\t\t}\n\n\t\tIFX_Edit::DelEdit(pEdit);\n\n\t\tif (sTemp.GetSize() > 0)\n\t\t{\n\t\t\tsAppStream << \"q\\n\" << rcBBox.left << \" \" << rcBBox.bottom << \" \"\n\t\t\t\t<< rcBBox.right - rcBBox.left << \" \" << rcBBox.top - rcBBox.bottom << \" re W n\\n\";\n\t\t\tsAppStream << sTemp << \"Q\\n\";\n\t\t}\n\n\t\treturn sAppStream.GetByteString();\n\t}\n\n\treturn \"\";\n}\n\nCFX_ByteString CPWL_Utils::GetColorAppStream(const CPWL_Color & color,const FX_BOOL & bFillOrStroke)\n{\n\tCFX_ByteTextBuf sColorStream;\n\n\tswitch (color.nColorType)\n\t{\t\t\n\tcase COLORTYPE_RGB:\n\t\tsColorStream << color.fColor1 << \" \" << color.fColor2 << \" \" << color.fColor3 << \" \" \n\t\t\t<< (bFillOrStroke ? \"rg\" : \"RG\") << \"\\n\";\n\t\tbreak;\n\tcase COLORTYPE_GRAY:\n\t\tsColorStream << color.fColor1 << \" \" << (bFillOrStroke ? \"g\" : \"G\") << \"\\n\";\n\t\tbreak;\n\tcase COLORTYPE_CMYK:\n\t\tsColorStream << color.fColor1 << \" \" << color.fColor2 << \" \" << color.fColor3 << \" \" << color.fColor4 << \" \" \n\t\t\t<< (bFillOrStroke ? \"k\" : \"K\") << \"\\n\";\n\t\tbreak;\n\t}\n\n\treturn sColorStream.GetByteString();\n}\n\nCFX_ByteString CPWL_Utils::GetBorderAppStream(const CPDF_Rect & rect, FX_FLOAT fWidth,\n\t\t\t\t\t\t\t\t\t\t\t\tconst CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom,\n\t\t\t\t\t\t\t\t\t\t\t\tFX_INT32 nStyle, const CPWL_Dash & dash)\n{\n\tCFX_ByteTextBuf sAppStream;\n\tCFX_ByteString sColor;\n\n\tFX_FLOAT fLeft = rect.left;\n\tFX_FLOAT fRight = rect.right;\n\tFX_FLOAT fTop = rect.top;\n\tFX_FLOAT fBottom = rect.bottom;\n\n\tif (fWidth > 0.0f)\n\t{\n\t\tFX_FLOAT fHalfWidth = fWidth / 2.0f;\n\n\t\tsAppStream << \"q\\n\";\n\n\t\tswitch (nStyle)\n\t\t{\n\t\tdefault:\n\t\tcase PBS_SOLID:\n\t\t\tsColor = CPWL_Utils::GetColorAppStream(color,TRUE);\n\t\t\tif (sColor.GetLength() > 0)\n\t\t\t{\n\t\t\t\tsAppStream << sColor;\n\t\t\t\tsAppStream << fLeft << \" \" << fBottom << \" \" << fRight - fLeft << \" \" << fTop - fBottom << \" re\\n\";\n\t\t\t\tsAppStream << fLeft + fWidth << \" \" << fBottom + fWidth << \" \" \n\t\t\t\t\t<< fRight - fLeft - fWidth * 2 << \" \" << fTop - fBottom - fWidth * 2 << \" re\\n\";\n\t\t\t\tsAppStream << \"f*\\n\";\n\t\t\t}\n\t\t\tbreak;\n\t\tcase PBS_DASH:\n\t\t\tsColor = CPWL_Utils::GetColorAppStream(color,FALSE);\n\t\t\tif (sColor.GetLength() > 0)\n\t\t\t{\n\t\t\t\tsAppStream << sColor;\n\t\t\t\tsAppStream << fWidth << \" w\" << \" [\" << dash.nDash << \" \" << dash.nGap << \"] \" << dash.nPhase << \" d\\n\";\n\t\t\t\tsAppStream << fLeft + fWidth / 2 << \" \" << fBottom + fWidth / 2 << \" m\\n\";\n\t\t\t\tsAppStream << fLeft + fWidth / 2 << \" \" << fTop - fWidth / 2 << \" l\\n\";\n\t\t\t\tsAppStream << fRight - fWidth / 2 << \" \" << fTop - fWidth / 2 << \" l\\n\";\n\t\t\t\tsAppStream << fRight - fWidth / 2 << \" \" << fBottom + fWidth / 2 << \" l\\n\";\n\t\t\t\tsAppStream << fLeft + fWidth / 2 << \" \" << fBottom + fWidth / 2 << \" l S\\n\";\n\t\t\t}\n\t\t\tbreak;\n\t\tcase PBS_BEVELED:\n\t\tcase PBS_INSET:\n\t\t\tsColor = CPWL_Utils::GetColorAppStream(crLeftTop,TRUE);\n\t\t\tif (sColor.GetLength() > 0)\n\t\t\t{\n\t\t\t\tsAppStream << sColor;\n\t\t\t\tsAppStream << fLeft + fHalfWidth << \" \" << fBottom + fHalfWidth << \" m\\n\";\n\t\t\t\tsAppStream << fLeft + fHalfWidth << \" \" << fTop - fHalfWidth << \" l\\n\";\n\t\t\t\tsAppStream << fRight - fHalfWidth << \" \" << fTop - fHalfWidth << \" l\\n\";\n\t\t\t\tsAppStream << fRight - fHalfWidth * 2 << \" \" << fTop - fHalfWidth * 2 << \" l\\n\";\n\t\t\t\tsAppStream << fLeft + fHalfWidth * 2 << \" \" << fTop - fHalfWidth * 2 << \" l\\n\";\n\t\t\t\tsAppStream << fLeft + fHalfWidth * 2 << \" \" << fBottom + fHalfWidth * 2 << \" l f\\n\";\n\t\t\t}\n\n\t\t\tsColor = CPWL_Utils::GetColorAppStream(crRightBottom,TRUE);\n\t\t\tif (sColor.GetLength() > 0)\n\t\t\t{\n\t\t\t\tsAppStream << sColor;\n\t\t\t\tsAppStream << fRight - fHalfWidth << \" \" <<\tfTop - fHalfWidth << \" m\\n\";\n\t\t\t\tsAppStream << fRight - fHalfWidth << \" \" <<\tfBottom + fHalfWidth << \" l\\n\";\n\t\t\t\tsAppStream << fLeft + fHalfWidth << \" \" << \tfBottom + fHalfWidth << \" l\\n\";\n\t\t\t\tsAppStream << fLeft + fHalfWidth * 2 << \" \" << fBottom + fHalfWidth * 2 << \" l\\n\";\n\t\t\t\tsAppStream << fRight - fHalfWidth * 2 << \" \" << fBottom + fHalfWidth * 2 << \" l\\n\";\n\t\t\t\tsAppStream << fRight - fHalfWidth * 2 << \" \" << fTop - fHalfWidth * 2 << \" l f\\n\";\n\t\t\t}\n\n\t\t\tsColor = CPWL_Utils::GetColorAppStream(color,TRUE);\n\t\t\tif (sColor.GetLength() > 0)\n\t\t\t{\n\t\t\t\tsAppStream << sColor;\n\t\t\t\tsAppStream << fLeft << \" \" << fBottom << \" \" <<\tfRight - fLeft << \" \" << fTop - fBottom << \" re\\n\";\n\t\t\t\tsAppStream << fLeft + fHalfWidth << \" \" << fBottom + fHalfWidth << \" \" \n\t\t\t\t\t<< fRight - fLeft - fHalfWidth * 2 << \" \" << fTop - fBottom - fHalfWidth * 2 << \" re f*\\n\";\t\t\t\t\t\t\n\t\t\t}\n\t\t\tbreak;\n\t\tcase PBS_UNDERLINED:\n\t\t\tsColor = CPWL_Utils::GetColorAppStream(color,FALSE);\n\t\t\tif (sColor.GetLength() > 0)\n\t\t\t{\n\t\t\t\tsAppStream << sColor;\n\t\t\t\tsAppStream << fWidth << \" w\\n\";\n\t\t\t\tsAppStream << fLeft << \" \" << fBottom + fWidth / 2 << \" m\\n\";\n\t\t\t\tsAppStream << fRight << \" \" << fBottom + fWidth / 2 << \" l S\\n\";\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\t\n\t\tsAppStream << \"Q\\n\";\n\t}\n\n\treturn sAppStream.GetByteString();\n}\n\nCFX_ByteString CPWL_Utils::GetCircleBorderAppStream(const CPDF_Rect & rect, FX_FLOAT fWidth,\n\t\t\t\t\t\t\t\t\t\t\t\tconst CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom,\n\t\t\t\t\t\t\t\t\t\t\t\tFX_INT32 nStyle, const CPWL_Dash & dash)\n{\n\tCFX_ByteTextBuf sAppStream;\n\tCFX_ByteString sColor;\n\n\t\n\n\n\n\n\tif (fWidth > 0.0f)\n\t{\n\t\tsAppStream << \"q\\n\";\n\n\t\tswitch (nStyle)\n\t\t{\n\t\tdefault:\n\t\tcase PBS_SOLID:\n\t\tcase PBS_UNDERLINED:\n\t\t\t{\n\t\t\t\tsColor = CPWL_Utils::GetColorAppStream(color,FALSE);\n\t\t\t\tif (sColor.GetLength() > 0)\n\t\t\t\t{\n\t\t\t\t\tsAppStream << \"q\\n\" << fWidth << \" w\\n\" << sColor \n\t\t\t\t\t\t<< CPWL_Utils::GetAP_Circle(CPWL_Utils::DeflateRect(rect,fWidth / 2.0f))\n\t\t\t\t\t\t<< \" S\\nQ\\n\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase PBS_DASH:\n\t\t\t{\n\t\t\t\tsColor = CPWL_Utils::GetColorAppStream(color,FALSE);\n\t\t\t\tif (sColor.GetLength() > 0)\n\t\t\t\t{\n\t\t\t\t\tsAppStream << \"q\\n\" << fWidth << \" w\\n\" \n\t\t\t\t\t\t<< \"[\" << dash.nDash << \" \" << dash.nGap << \"] \" << dash.nPhase << \" d\\n\" \n\t\t\t\t\t\t<< sColor << CPWL_Utils::GetAP_Circle(CPWL_Utils::DeflateRect(rect,fWidth / 2.0f))\n\t\t\t\t\t\t<< \" S\\nQ\\n\";\n\t\t\t\t}\t\t\t\t\t\t\n\t\t\t}\n\t\t\tbreak;\n\t\tcase PBS_BEVELED:\n\t\t\t{\n\t\t\t\tFX_FLOAT fHalfWidth = fWidth / 2.0f;\n\n\t\t\t\tsColor = CPWL_Utils::GetColorAppStream(color,FALSE);\n\t\t\t\tif (sColor.GetLength() > 0)\n\t\t\t\t{\n\t\t\t\t\tsAppStream << \"q\\n\" << fHalfWidth << \" w\\n\"\n\t\t\t\t\t\t<< sColor << CPWL_Utils::GetAP_Circle(rect)\n\t\t\t\t\t\t<< \" S\\nQ\\n\";\n\t\t\t\t}\t\t\t\t\t\n\n\t\t\t\tsColor = CPWL_Utils::GetColorAppStream(crLeftTop,FALSE);\n\t\t\t\tif (sColor.GetLength() > 0)\n\t\t\t\t{\n\t\t\t\t\tsAppStream << \"q\\n\" << fHalfWidth << \" w\\n\"\n\t\t\t\t\t\t<< sColor << CPWL_Utils::GetAP_HalfCircle(CPWL_Utils::DeflateRect(rect,fHalfWidth * 0.75f),PWL_PI/4.0f)\n\t\t\t\t\t\t<< \" S\\nQ\\n\";\n\t\t\t\t}\t\n\n\t\t\t\tsColor = CPWL_Utils::GetColorAppStream(crRightBottom,FALSE);\n\t\t\t\tif (sColor.GetLength() > 0)\n\t\t\t\t{\n\t\t\t\t\tsAppStream << \"q\\n\" << fHalfWidth << \" w\\n\"\n\t\t\t\t\t\t<< sColor << CPWL_Utils::GetAP_HalfCircle(CPWL_Utils::DeflateRect(rect,fHalfWidth * 0.75f),PWL_PI*5/4.0f)\n\t\t\t\t\t\t<< \" S\\nQ\\n\";\n\t\t\t\t}\t\n\t\t\t}\n\t\t\tbreak;\n\t\tcase PBS_INSET:\n\t\t\t{\n\t\t\t\tFX_FLOAT fHalfWidth = fWidth / 2.0f;\n\n\t\t\t\tsColor = CPWL_Utils::GetColorAppStream(color,FALSE);\n\t\t\t\tif (sColor.GetLength() > 0)\n\t\t\t\t{\n\t\t\t\t\tsAppStream << \"q\\n\" << fHalfWidth << \" w\\n\"\n\t\t\t\t\t\t<< sColor << CPWL_Utils::GetAP_Circle(rect)\n\t\t\t\t\t\t<< \" S\\nQ\\n\";\n\t\t\t\t}\n\n\t\t\t\tsColor = CPWL_Utils::GetColorAppStream(crLeftTop,FALSE);\n\t\t\t\tif (sColor.GetLength() > 0)\n\t\t\t\t{\n\t\t\t\t\tsAppStream << \"q\\n\" << fHalfWidth << \" w\\n\"\n\t\t\t\t\t\t<< sColor << CPWL_Utils::GetAP_HalfCircle(CPWL_Utils::DeflateRect(rect,fHalfWidth * 0.75f),PWL_PI/4.0f)\n\t\t\t\t\t\t<< \" S\\nQ\\n\";\n\t\t\t\t}\t\n\n\t\t\t\tsColor = CPWL_Utils::GetColorAppStream(crRightBottom,FALSE);\n\t\t\t\tif (sColor.GetLength() > 0)\n\t\t\t\t{\n\t\t\t\t\tsAppStream << \"q\\n\" << fHalfWidth << \" w\\n\"\n\t\t\t\t\t\t<< sColor << CPWL_Utils::GetAP_HalfCircle(CPWL_Utils::DeflateRect(rect,fHalfWidth * 0.75f),PWL_PI*5/4.0f)\n\t\t\t\t\t\t<< \" S\\nQ\\n\";\n\t\t\t\t}\t\t\t\t\t\t\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\t\n\t\tsAppStream << \"Q\\n\";\n\t}\n\n\treturn sAppStream.GetByteString();\n}\n\nCPWL_Color CPWL_Utils::SubstractColor(const CPWL_Color & sColor,FX_FLOAT fColorSub)\n{\n\tCPWL_Color sRet;\n\tsRet.nColorType = sColor.nColorType;\n\n\tswitch (sColor.nColorType)\n\t{\n\tcase COLORTYPE_TRANSPARENT:\n\t\tsRet.nColorType = COLORTYPE_RGB;\n\t\tsRet.fColor1 = PWL_MAX(1 - fColorSub,0.0f);\n\t\tsRet.fColor2 = PWL_MAX(1 - fColorSub,0.0f);\n\t\tsRet.fColor3 = PWL_MAX(1 - fColorSub,0.0f);\n\t\tbreak;\n\tcase COLORTYPE_RGB:\n\tcase COLORTYPE_GRAY:\n\tcase COLORTYPE_CMYK:\n\t\tsRet.fColor1 = PWL_MAX(sColor.fColor1 - fColorSub,0.0f);\n\t\tsRet.fColor2 = PWL_MAX(sColor.fColor2 - fColorSub,0.0f);\n\t\tsRet.fColor3 = PWL_MAX(sColor.fColor3 - fColorSub,0.0f);\n\t\tsRet.fColor4 = PWL_MAX(sColor.fColor4 - fColorSub,0.0f);\n\t\tbreak;\n\t}\t\n\n\treturn sRet;\n}\n\nCPWL_Color CPWL_Utils::DevideColor(const CPWL_Color & sColor,FX_FLOAT fColorDevide)\n{\n\tCPWL_Color sRet;\n\tsRet.nColorType = sColor.nColorType;\n\n\tswitch (sColor.nColorType)\n\t{\n\tcase COLORTYPE_TRANSPARENT:\n\t\tsRet.nColorType = COLORTYPE_RGB;\n\t\tsRet.fColor1 = 1 / fColorDevide;\n\t\tsRet.fColor2 = 1 / fColorDevide;\n\t\tsRet.fColor3 = 1 / fColorDevide;\n\t\tbreak;\n\tcase COLORTYPE_RGB:\n\tcase COLORTYPE_GRAY:\n\tcase COLORTYPE_CMYK:\n\t\tsRet = sColor;\n\t\tsRet.fColor1 /= fColorDevide;\n\t\tsRet.fColor2 /= fColorDevide;\n\t\tsRet.fColor3 /= fColorDevide;\n\t\tsRet.fColor4 /= fColorDevide;\n\t\tbreak;\n\t}\t\n\n\treturn sRet;\n}\n\nCFX_ByteString CPWL_Utils::GetAppStream_Check(const CPDF_Rect & rcBBox, const CPWL_Color & crText)\n{\n\tCFX_ByteTextBuf sAP;\n\tsAP << \"q\\n\" << CPWL_Utils::GetColorAppStream(crText,TRUE) << CPWL_Utils::GetAP_Check(rcBBox) << \"f\\nQ\\n\";\n\treturn sAP.GetByteString();\n}\n\nCFX_ByteString CPWL_Utils::GetAppStream_Circle(const CPDF_Rect & rcBBox, const CPWL_Color & crText)\n{\n\tCFX_ByteTextBuf sAP;\n\tsAP << \"q\\n\" << CPWL_Utils::GetColorAppStream(crText,TRUE) << CPWL_Utils::GetAP_Circle(rcBBox) << \"f\\nQ\\n\";\n\treturn sAP.GetByteString();\n}\n\nCFX_ByteString CPWL_Utils::GetAppStream_Cross(const CPDF_Rect & rcBBox, const CPWL_Color & crText)\n{\n\tCFX_ByteTextBuf sAP;\n\tsAP << \"q\\n\" << CPWL_Utils::GetColorAppStream(crText,FALSE) << CPWL_Utils::GetAP_Cross(rcBBox) << \"S\\nQ\\n\";\n\treturn sAP.GetByteString();\n}\n\nCFX_ByteString CPWL_Utils::GetAppStream_Diamond(const CPDF_Rect & rcBBox, const CPWL_Color & crText)\n{\n\tCFX_ByteTextBuf sAP;\n\tsAP << \"q\\n1 w\\n\" << CPWL_Utils::GetColorAppStream(crText,TRUE) << CPWL_Utils::GetAP_Diamond(rcBBox) << \"f\\nQ\\n\";\n\treturn sAP.GetByteString();\n}\n\nCFX_ByteString CPWL_Utils::GetAppStream_Square(const CPDF_Rect & rcBBox, const CPWL_Color & crText)\n{\n\tCFX_ByteTextBuf sAP;\n\tsAP << \"q\\n\" << CPWL_Utils::GetColorAppStream(crText,TRUE) << CPWL_Utils::GetAP_Square(rcBBox) << \"f\\nQ\\n\";\n\treturn sAP.GetByteString();\n}\n\nCFX_ByteString CPWL_Utils::GetAppStream_Star(const CPDF_Rect & rcBBox, const CPWL_Color & crText)\n{\n\tCFX_ByteTextBuf sAP;\n\tsAP << \"q\\n\" << CPWL_Utils::GetColorAppStream(crText,TRUE) << CPWL_Utils::GetAP_Star(rcBBox) << \"f\\nQ\\n\";\n\treturn sAP.GetByteString();\n}\n\nCFX_ByteString CPWL_Utils::GetCheckBoxAppStream(const CPDF_Rect & rcBBox,\n\t\t\t\t\t\t\t\t\t\t\t\t\tFX_INT32 nStyle,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst CPWL_Color & crText)\n{\n\tCPDF_Rect rcCenter = GetCenterSquare(rcBBox);\n\tswitch (nStyle)\n\t{\n\tdefault:\n\tcase PCS_CHECK:\n\t\treturn GetAppStream_Check(rcCenter,crText);\n\tcase PCS_CIRCLE:\n\t\treturn GetAppStream_Circle(ScaleRect(rcCenter,2.0f/3.0f),crText);\n\tcase PCS_CROSS:\n\t\treturn GetAppStream_Cross(rcCenter,crText);\n\tcase PCS_DIAMOND:\n\t\treturn GetAppStream_Diamond(ScaleRect(rcCenter,2.0f/3.0f),crText);\t\t\n\tcase PCS_SQUARE:\n\t\treturn GetAppStream_Square(ScaleRect(rcCenter,2.0f/3.0f),crText);\n\tcase PCS_STAR:\n\t\treturn GetAppStream_Star(ScaleRect(rcCenter,2.0f/3.0f),crText);\n\t}\n}\n\nCFX_ByteString CPWL_Utils::GetRadioButtonAppStream(const CPDF_Rect & rcBBox,\n\t\t\t\t\t\t\t\t\t\t\t\t\tFX_INT32 nStyle,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst CPWL_Color & crText)\n{\n\tCPDF_Rect rcCenter = GetCenterSquare(rcBBox);\n\tswitch (nStyle)\n\t{\n\tdefault:\n\tcase PCS_CHECK:\n\t\treturn GetAppStream_Check(rcCenter,crText);\n\tcase PCS_CIRCLE:\n\t\treturn GetAppStream_Circle(ScaleRect(rcCenter,1.0f/2.0f),crText);\n\tcase PCS_CROSS:\n\t\treturn GetAppStream_Cross(rcCenter,crText);\n\tcase PCS_DIAMOND:\n\t\treturn GetAppStream_Diamond(ScaleRect(rcCenter,2.0f/3.0f),crText);\t\t\n\tcase PCS_SQUARE:\n\t\treturn GetAppStream_Square(ScaleRect(rcCenter,2.0f/3.0f),crText);\n\tcase PCS_STAR:\n\t\treturn GetAppStream_Star(ScaleRect(rcCenter,2.0f/3.0f),crText);\n\t}\n}\n\nCFX_ByteString CPWL_Utils::GetDropButtonAppStream(const CPDF_Rect & rcBBox)\n{\n\tCFX_ByteTextBuf sAppStream;\n\n\tif (!rcBBox.IsEmpty())\n\t{\n\t\tsAppStream << \"q\\n\" << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_RGB,220.0f/255.0f,220.0f/255.0f,220.0f/255.0f),TRUE);\n\t\tsAppStream << rcBBox.left << \" \" << rcBBox.bottom << \" \" \n\t\t\t\t<< rcBBox.right - rcBBox.left << \" \" << rcBBox.top - rcBBox.bottom << \" re f\\n\";\n\t\tsAppStream << \"Q\\n\";\n\n\t\tsAppStream << \"q\\n\" << \n\t\t\tCPWL_Utils::GetBorderAppStream(rcBBox,2,CPWL_Color(COLORTYPE_GRAY,0),CPWL_Color(COLORTYPE_GRAY,1),CPWL_Color(COLORTYPE_GRAY,0.5),PBS_BEVELED,CPWL_Dash(3,0,0)) \n\t\t\t<< \"Q\\n\";\n\n\t\tCPDF_Point ptCenter = CPDF_Point((rcBBox.left + rcBBox.right)/2,(rcBBox.top + rcBBox.bottom)/2);\n\t\tif (IsFloatBigger(rcBBox.right - rcBBox.left,6) && IsFloatBigger(rcBBox.top - rcBBox.bottom,6))\n\t\t{\n\t\t\tsAppStream << \"q\\n\" << \" 0 g\\n\";\n\t\t\tsAppStream << ptCenter.x - 3 << \" \" << ptCenter.y + 1.5f << \" m\\n\";\n\t\t\tsAppStream << ptCenter.x + 3 << \" \" << ptCenter.y + 1.5f << \" l\\n\";\n\t\t\tsAppStream << ptCenter.x << \" \" << ptCenter.y - 1.5f << \" l\\n\";\n\t\t\tsAppStream << ptCenter.x - 3 << \" \" << ptCenter.y + 1.5f << \" l f\\n\";\n\t\t\tsAppStream << \"Q\\n\";\n\t\t}\n\t}\n\n\treturn sAppStream.GetByteString();\n}\n\nvoid CPWL_Utils::ConvertCMYK2GRAY(FX_FLOAT dC,FX_FLOAT dM,FX_FLOAT dY,FX_FLOAT dK,FX_FLOAT &dGray)\n{\n\tif (dC<0 || dC>1 || dM<0 || dM>1 || dY < 0 || dY >1 || dK < 0 || dK >1)\n\t\treturn;\n\tdGray = 1.0f - FX_MIN(1.0f,0.3f*dC+0.59f * dM + 0.11f*dY+dK);\n}\n\nvoid CPWL_Utils::ConvertGRAY2CMYK(FX_FLOAT dGray,FX_FLOAT  &dC,FX_FLOAT &dM,FX_FLOAT &dY,FX_FLOAT &dK)\n{\n\tif (dGray <0 || dGray >1)\n\t\treturn;\n\tdC = 0.0f;\n\tdM = 0.0f;\n\tdY = 0.0f;\n\tdK = 1.0f-dGray;\n}\n\nvoid CPWL_Utils::ConvertGRAY2RGB(FX_FLOAT dGray,FX_FLOAT &dR,FX_FLOAT &dG,FX_FLOAT &dB)\n{\n\tif (dGray <0 || dGray >1)\n\t\treturn;\n\tdR = dGray;\n\tdG = dGray;\n\tdB = dGray;\n}\n\nvoid CPWL_Utils::ConvertRGB2GRAY(FX_FLOAT dR,FX_FLOAT dG,FX_FLOAT dB,FX_FLOAT &dGray)\n{\n\tif (dR<0 || dR>1 || dG<0 || dG > 0 || dB < 0 || dB >1)\n\t\treturn;\n\tdGray = 0.3f*dR+0.59f*dG+0.11f*dB;\n}\n\nvoid CPWL_Utils::ConvertCMYK2RGB(FX_FLOAT dC,FX_FLOAT dM,FX_FLOAT dY,FX_FLOAT dK,FX_FLOAT &dR,FX_FLOAT &dG,FX_FLOAT &dB)\n{\n\tif (dC <0 || dC>1 || dM < 0 || dM > 1 || dY < 0 || dY > 1 || dK < 0 || dK > 1 )\n\t\treturn;\n\tdR = 1.0f - FX_MIN(1.0f, dC + dK);\n\tdG = 1.0f - FX_MIN(1.0f, dM + dK);\n\tdB = 1.0f - FX_MIN(1.0f, dY + dK);\n}\n\nvoid CPWL_Utils::ConvertRGB2CMYK(FX_FLOAT dR,FX_FLOAT dG,FX_FLOAT dB,FX_FLOAT &dC,FX_FLOAT &dM,FX_FLOAT &dY,FX_FLOAT &dK)\n{\n\tif (dR<0 || dR>1 || dG<0 || dG>1 || dB<0 || dB>1)\n\t\treturn;\n\n\tdC = 1.0f - dR;\n\tdM = 1.0f - dG;\n\tdY = 1.0f - dB;\n\tdK = FX_MIN(dC, FX_MIN(dM, dY));\n}\n\nvoid CPWL_Utils::PWLColorToARGB(const CPWL_Color& color, FX_INT32& alpha, FX_FLOAT& red, FX_FLOAT& green, FX_FLOAT& blue)\n{\n\tswitch (color.nColorType)\n\t{\n\tcase COLORTYPE_TRANSPARENT:\n\t\t{\n\t\t\talpha = 0;\n\t\t}\n\t\tbreak;\n\tcase COLORTYPE_GRAY:\n\t\t{\n\t\t\tConvertGRAY2RGB(color.fColor1, red, green, blue);\n\t\t}\n\t\tbreak;\n\tcase COLORTYPE_RGB:\n\t\t{\n\t\t\tred = color.fColor1;\n\t\t\tgreen = color.fColor2;\n\t\t\tblue = color.fColor3;\n\t\t}\n\t\tbreak;\n\tcase COLORTYPE_CMYK:\n\t\t{\n\t\t\tConvertCMYK2RGB(color.fColor1, color.fColor2, color.fColor3, color.fColor4,\n\t\t\t\tred, green, blue);\n\t\t}\n\t\tbreak;\n\t}\n}\n\nFX_COLORREF CPWL_Utils::PWLColorToFXColor(const CPWL_Color& color, FX_INT32 nTransparancy)\n{\n\tFX_INT32 nAlpha = nTransparancy;\n\tFX_FLOAT dRed = 0;\n\tFX_FLOAT dGreen = 0;\n\tFX_FLOAT dBlue = 0;\n\n\tPWLColorToARGB(color, nAlpha, dRed, dGreen, dBlue);\n\n\treturn ArgbEncode(nAlpha, (FX_INT32)(dRed*255), (FX_INT32)(dGreen*255), (FX_INT32)(dBlue*255));\n}\n\nvoid CPWL_Utils::DrawFillRect(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,const CPDF_Rect & rect,\n\t\t\t\t\t\t\t  const FX_COLORREF & color)\n{\n\tCFX_PathData path;\n\tCPDF_Rect rcTemp(rect);\t\n\tpath.AppendRect(rcTemp.left,rcTemp.bottom,rcTemp.right,rcTemp.top);\n\tpDevice->DrawPath(&path, pUser2Device, NULL, color, 0, FXFILL_WINDING);\n}\n\nvoid CPWL_Utils::DrawFillArea(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\t\t\t\t\t\tconst CPDF_Point* pPts, FX_INT32 nCount, const FX_COLORREF& color)\n{\n\tCFX_PathData path;\n\tpath.SetPointCount(nCount);\n\n\tpath.SetPoint(0, pPts[0].x, pPts[0].y, FXPT_MOVETO);\n\tfor (FX_INT32 i=1; i<nCount; i++)\n\t\tpath.SetPoint(i, pPts[i].x, pPts[i].y, FXPT_LINETO);\n\n\tpDevice->DrawPath(&path, pUser2Device, NULL, color, 0, FXFILL_ALTERNATE);\n}\n\nvoid CPWL_Utils::DrawStrokeRect(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,const CPDF_Rect & rect,\n\t\t\t\t\t\t\t  const FX_COLORREF & color, FX_FLOAT fWidth)\n{\n\tCFX_PathData path;\n\tCPDF_Rect rcTemp(rect);\t\n\tpath.AppendRect(rcTemp.left,rcTemp.bottom,rcTemp.right,rcTemp.top);\n\t\n\tCFX_GraphStateData gsd;\n\tgsd.m_LineWidth = fWidth;\n\n\tpDevice->DrawPath(&path, pUser2Device, &gsd, 0, color, FXFILL_ALTERNATE);\n}\n\nvoid CPWL_Utils::DrawStrokeLine(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\t\t\t\t\t\tconst CPDF_Point & ptMoveTo, const CPDF_Point & ptLineTo, const FX_COLORREF & color, FX_FLOAT fWidth)\n{\n\tCFX_PathData path;\n\tpath.SetPointCount(2);\n\tpath.SetPoint(0, ptMoveTo.x, ptMoveTo.y, FXPT_MOVETO);\n\tpath.SetPoint(1, ptLineTo.x, ptLineTo.y, FXPT_LINETO);\n\n\tCFX_GraphStateData gsd;\n\tgsd.m_LineWidth = fWidth;\n\n\tpDevice->DrawPath(&path, pUser2Device, &gsd, 0, color, FXFILL_ALTERNATE);\n}\n\nvoid CPWL_Utils::DrawFillRect(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,const CPDF_Rect & rect,\n\t\t\t\t\t\t\t  const CPWL_Color & color, FX_INT32 nTransparancy)\n{\n\tCPWL_Utils::DrawFillRect(pDevice,pUser2Device,rect,PWLColorToFXColor(color,nTransparancy));\n}\n\nvoid CPWL_Utils::DrawShadow(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tFX_BOOL bVertical, FX_BOOL bHorizontal, CPDF_Rect rect,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tFX_INT32 nTransparancy, FX_INT32 nStartGray, FX_INT32 nEndGray)\n{\n\tFX_FLOAT fStepGray = 1.0f;\n\n\tif (bVertical)\n\t{\n\t\tfStepGray = (nEndGray - nStartGray) / rect.Height();\n\n\t\tfor (FX_FLOAT fy=rect.bottom+0.5f; fy<=rect.top-0.5f; fy+=1.0f)\n\t\t{\t\t\t\n\t\t\tFX_INT32 nGray = nStartGray + (FX_INT32)(fStepGray * (fy-rect.bottom));\n\t\t\tCPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, CPDF_Point(rect.left, fy),\n\t\t\t\tCPDF_Point(rect.right, fy), ArgbEncode(nTransparancy, nGray, nGray, nGray), 1.5f);\n\t\t}\n\t}\n\n\tif (bHorizontal)\n\t{\n\t\tfStepGray = (nEndGray - nStartGray) / rect.Width();\n\n\t\tfor (FX_FLOAT fx=rect.left+0.5f; fx<=rect.right-0.5f; fx+=1.0f)\n\t\t{\t\t\t\n\t\t\tFX_INT32 nGray = nStartGray + (FX_INT32)(fStepGray * (fx-rect.left));\n\t\t\tCPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, CPDF_Point(fx, rect.bottom),\n\t\t\t\tCPDF_Point(fx, rect.top), ArgbEncode(nTransparancy, nGray, nGray, nGray), 1.5f);\n\t\t}\n\t}\n}\n\nvoid CPWL_Utils::DrawBorder(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\t\t\t\t\t\t\t\t\t\t\tconst CPDF_Rect & rect, FX_FLOAT fWidth,\n\t\t\t\t\t\t\t\t\t\t\t\tconst CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom,\n\t\t\t\t\t\t\t\t\t\t\t\tFX_INT32 nStyle, const CPWL_Dash & dash, FX_INT32 nTransparancy)\n{\n\tFX_FLOAT fLeft = rect.left;\n\tFX_FLOAT fRight = rect.right;\n\tFX_FLOAT fTop = rect.top;\n\tFX_FLOAT fBottom = rect.bottom;\n\n\tif (fWidth > 0.0f)\n\t{\n\t\tFX_FLOAT fHalfWidth = fWidth / 2.0f;\n\n\t\tswitch (nStyle)\n\t\t{\n\t\tdefault:\n\t\tcase PBS_SOLID:\n\t\t\t{\n\t\t\t\tCFX_PathData path;\n\t\t\t\tpath.AppendRect(fLeft, fBottom, fRight, fTop);\n\t\t\t\tpath.AppendRect(fLeft + fWidth, fBottom + fWidth, fRight - fWidth, fTop - fWidth);\n\t\t\t\tpDevice->DrawPath(&path, pUser2Device, NULL, PWLColorToFXColor(color,nTransparancy), 0, FXFILL_ALTERNATE);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase PBS_DASH:\n\t\t\t{\n\t\t\t\tCFX_PathData path;\n\n\t\t\t\tpath.SetPointCount(5);\n\t\t\t\tpath.SetPoint(0, fLeft + fWidth / 2.0f, fBottom + fWidth / 2.0f, FXPT_MOVETO);\n\t\t\t\tpath.SetPoint(1, fLeft + fWidth / 2.0f, fTop - fWidth / 2.0f, FXPT_LINETO);\n\t\t\t\tpath.SetPoint(2, fRight - fWidth / 2.0f, fTop - fWidth / 2.0f, FXPT_LINETO);\n\t\t\t\tpath.SetPoint(3, fRight - fWidth / 2.0f, fBottom + fWidth / 2.0f, FXPT_LINETO);\n\t\t\t\tpath.SetPoint(4, fLeft + fWidth / 2.0f, fBottom + fWidth / 2.0f, FXPT_LINETO);\n\n\t\t\t\tCFX_GraphStateData gsd;\n\t\t\t\tgsd.SetDashCount(2);\t\t\t\t\n\t\t\t\tgsd.m_DashArray[0] = 3.0f;\n\t\t\t\tgsd.m_DashArray[1] = 3.0f;\n\t\t\t\tgsd.m_DashPhase = 0;\t\n\t\t\t\t\n\t\t\t\tgsd.m_LineWidth = fWidth;\n\t\t\t\tpDevice->DrawPath(&path, pUser2Device, &gsd, 0, PWLColorToFXColor(color,nTransparancy), FXFILL_WINDING);\t\t\t\t\n\t\t\t}\t\t\t\n\t\t\tbreak;\n\t\tcase PBS_BEVELED:\n\t\tcase PBS_INSET:\t\n\t\t\t{\n\t\t\t\tCFX_GraphStateData gsd;\n\t\t\t\tgsd.m_LineWidth = fHalfWidth;\n\n\t\t\t\tCFX_PathData pathLT;\n\n\t\t\t\tpathLT.SetPointCount(7);\n\t\t\t\tpathLT.SetPoint(0, fLeft + fHalfWidth, fBottom + fHalfWidth, FXPT_MOVETO);\n\t\t\t\tpathLT.SetPoint(1, fLeft + fHalfWidth, fTop - fHalfWidth, FXPT_LINETO);\n\t\t\t\tpathLT.SetPoint(2, fRight - fHalfWidth, fTop - fHalfWidth, FXPT_LINETO);\n\t\t\t\tpathLT.SetPoint(3, fRight - fHalfWidth * 2, fTop - fHalfWidth * 2, FXPT_LINETO);\n\t\t\t\tpathLT.SetPoint(4, fLeft + fHalfWidth * 2, fTop - fHalfWidth * 2, FXPT_LINETO);\n\t\t\t\tpathLT.SetPoint(5, fLeft + fHalfWidth * 2, fBottom + fHalfWidth * 2, FXPT_LINETO);\n\t\t\t\tpathLT.SetPoint(6, fLeft + fHalfWidth, fBottom + fHalfWidth, FXPT_LINETO);\n\n\t\t\t\tpDevice->DrawPath(&pathLT, pUser2Device, &gsd, PWLColorToFXColor(crLeftTop,nTransparancy), 0, FXFILL_ALTERNATE);\n\n\t\t\t\tCFX_PathData pathRB;\n\n\t\t\t\tpathRB.SetPointCount(7);\n\t\t\t\tpathRB.SetPoint(0, fRight - fHalfWidth, fTop - fHalfWidth, FXPT_MOVETO);\n\t\t\t\tpathRB.SetPoint(1, fRight - fHalfWidth, fBottom + fHalfWidth, FXPT_LINETO);\n\t\t\t\tpathRB.SetPoint(2, fLeft + fHalfWidth, fBottom + fHalfWidth, FXPT_LINETO);\n\t\t\t\tpathRB.SetPoint(3, fLeft + fHalfWidth * 2, fBottom + fHalfWidth * 2, FXPT_LINETO);\n\t\t\t\tpathRB.SetPoint(4, fRight - fHalfWidth * 2, fBottom + fHalfWidth * 2, FXPT_LINETO);\n\t\t\t\tpathRB.SetPoint(5, fRight - fHalfWidth * 2, fTop - fHalfWidth * 2, FXPT_LINETO);\n\t\t\t\tpathRB.SetPoint(6, fRight - fHalfWidth, fTop - fHalfWidth, FXPT_LINETO);\n\n\t\t\t\tpDevice->DrawPath(&pathRB, pUser2Device, &gsd, PWLColorToFXColor(crRightBottom,nTransparancy), 0, FXFILL_ALTERNATE);\n\n\t\t\t\tCFX_PathData path;\n\n\t\t\t\tpath.AppendRect(fLeft, fBottom, fRight, fTop);\n\t\t\t\tpath.AppendRect(fLeft + fHalfWidth, fBottom + fHalfWidth, fRight - fHalfWidth, fTop - fHalfWidth);\n\n\t\t\t\tpDevice->DrawPath(&path, pUser2Device, &gsd, PWLColorToFXColor(color,nTransparancy), 0, FXFILL_ALTERNATE);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase PBS_UNDERLINED:\n\t\t\t{\n\t\t\t\tCFX_PathData path;\n\n\t\t\t\tpath.SetPointCount(2);\n\t\t\t\tpath.SetPoint(0, fLeft, fBottom + fWidth / 2, FXPT_MOVETO);\n\t\t\t\tpath.SetPoint(1, fRight, fBottom + fWidth / 2, FXPT_LINETO);\n\t\t\t\t\n\t\t\t\tCFX_GraphStateData gsd;\n\t\t\t\tgsd.m_LineWidth = fWidth;\n\n\t\t\t\tpDevice->DrawPath(&path, pUser2Device, &gsd,0,  PWLColorToFXColor(color,nTransparancy), FXFILL_ALTERNATE);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase PBS_SHADOW:\n\t\t\t{\n\t\t\t\tCFX_PathData path;\n\t\t\t\tpath.AppendRect(fLeft, fBottom, fRight, fTop);\n\t\t\t\tpath.AppendRect(fLeft + fWidth, fBottom + fWidth, fRight - fWidth, fTop - fWidth);\n\t\t\t\tpDevice->DrawPath(&path, pUser2Device, NULL, PWLColorToFXColor(color,nTransparancy/2), 0, FXFILL_ALTERNATE);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nstatic void AddSquigglyPath(CFX_PathData & PathData, FX_FLOAT fStartX, FX_FLOAT fEndX, FX_FLOAT fY, FX_FLOAT fStep)\n{\n\tPathData.AddPointCount(1);\n\tPathData.SetPoint(PathData.GetPointCount() - 1, fStartX, fY, FXPT_MOVETO);\n\n\tFX_FLOAT fx;\n\tFX_INT32 i;\n\n\tfor (i=1,fx=fStartX+fStep; fx<fEndX; fx+=fStep,i++)\n\t{\n\t\tPathData.AddPointCount(1);\n\t\tPathData.SetPoint(PathData.GetPointCount() - 1, fx, fY + (i&1)*fStep, FXPT_LINETO);\n\t}\n}\n\nstatic void AddSpellCheckObj(CFX_PathData & PathData, IFX_Edit* pEdit, const CPVT_WordRange& wrWord)\n{\n\tFX_FLOAT fStartX = 0.0f;\n\tFX_FLOAT fEndX = 0.0f;\n\tFX_FLOAT fY = 0.0f;\n\tFX_FLOAT fStep = 0.0f; \n\n\tFX_BOOL bBreak = FALSE;\n\n\tif (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())\n\t{\n\t\tpIterator->SetAt(wrWord.BeginPos);\n\n\t\tdo\n\t\t{\n\t\t\tCPVT_WordPlace place = pIterator->GetAt();\n\n\t\t\tCPVT_Line line;\t\t\t\t\n\t\t\tif (pIterator->GetLine(line))\n\t\t\t{\n\t\t\t\tfY = line.ptLine.y;\n\t\t\t\tfStep = (line.fLineAscent - line.fLineDescent) / 16.0f;\n\t\t\t}\n\n\t\t\tif (place.LineCmp(wrWord.BeginPos) == 0)\n\t\t\t{\n\t\t\t\tpIterator->SetAt(wrWord.BeginPos);\n\t\t\t\tCPVT_Word word;\n\t\t\t\tif (pIterator->GetWord(word))\n\t\t\t\t{\n\t\t\t\t\tfStartX = word.ptWord.x;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfStartX = line.ptLine.x;\n\t\t\t}\n\n\t\t\tif (place.LineCmp(wrWord.EndPos) == 0)\n\t\t\t{\n\t\t\t\tpIterator->SetAt(wrWord.EndPos);\n\t\t\t\tCPVT_Word word;\n\t\t\t\tif (pIterator->GetWord(word))\n\t\t\t\t{\n\t\t\t\t\tfEndX = word.ptWord.x + word.fWidth;\n\t\t\t\t}\n\n\t\t\t\tbBreak = TRUE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfEndX = line.ptLine.x + line.fLineWidth;\n\t\t\t}\n\n\t\t\tAddSquigglyPath(PathData, fStartX, fEndX, fY, fStep);\n\n\t\t\tif (bBreak) break;\n\t\t}\n\t\twhile (pIterator->NextLine());\n\t}\n}\n\nvoid CPWL_Utils::DrawEditSpellCheck(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit, \n\t\t\t\t\t\tconst CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, \n\t\t\t\t\t\tIPWL_SpellCheck * pSpellCheck)\n{\n\tconst FX_COLORREF crSpell = ArgbEncode(255,255,0,0);\n\n\t//for spellcheck\n\tFX_BOOL bLatinWord = FALSE;\n\tCPVT_WordPlace wpWordStart;\n\tCFX_ByteString sLatinWord;\n\n\tCFX_PathData pathSpell;\n\n\tpDevice->SaveState();\n\n\tif (!rcClip.IsEmpty())\n\t{\n\t\tCPDF_Rect rcTemp = rcClip;\n\t\tpUser2Device->TransformRect(rcTemp);\n\t\tFX_RECT rcDevClip;\n\t\trcDevClip.left = (FX_INT32)rcTemp.left;\n\t\trcDevClip.right = (FX_INT32)rcTemp.right;\n\t\trcDevClip.top = (FX_INT32)rcTemp.top;\n\t\trcDevClip.bottom = (FX_INT32)rcTemp.bottom;\n\t\tpDevice->SetClip_Rect(&rcDevClip);\n\t}\n\n\tif (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())\n\t{\n\t\tif (pEdit->GetFontMap())\n\t\t{\n\t\t\tif (pRange)\n\t\t\t\tpIterator->SetAt(pRange->BeginPos);\n\t\t\telse\n\t\t\t\tpIterator->SetAt(0);\n\n\t\t\tCPVT_WordPlace oldplace;\t\t\t\n\n\t\t\twhile (pIterator->NextWord())\n\t\t\t{\n\t\t\t\tCPVT_WordPlace place = pIterator->GetAt();\n\t\t\t\tif (pRange && place.WordCmp(pRange->EndPos) > 0) break;\t\t\t\t\n\n\t\t\t\tCPVT_Word word;\t\t\t\t\n\t\t\t\tif (pIterator->GetWord(word))\n\t\t\t\t{\n\t\t\t\t\tif (FX_EDIT_ISLATINWORD(word.Word))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!bLatinWord)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twpWordStart = place;\n\t\t\t\t\t\t\tbLatinWord = TRUE;\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsLatinWord += (char)word.Word;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (bLatinWord)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (!sLatinWord.IsEmpty())\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (pSpellCheck && !pSpellCheck->CheckWord(sLatinWord))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tAddSpellCheckObj(pathSpell,pEdit,CPVT_WordRange(wpWordStart,oldplace));\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tpIterator->SetAt(place);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbLatinWord = FALSE;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsLatinWord.Empty();\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\toldplace = place;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (bLatinWord)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!sLatinWord.IsEmpty())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (pSpellCheck && !pSpellCheck->CheckWord(sLatinWord))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tAddSpellCheckObj(pathSpell,pEdit,CPVT_WordRange(wpWordStart,oldplace));\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tpIterator->SetAt(place);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbLatinWord = FALSE;\n\t\t\t\t\t}\n\n\t\t\t\t\tsLatinWord.Empty();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!sLatinWord.IsEmpty()) \n\t\t\t{\n\t\t\t\tif (pSpellCheck && !pSpellCheck->CheckWord(sLatinWord))\n\t\t\t\t{\n\t\t\t\t\tAddSpellCheckObj(pathSpell,pEdit,CPVT_WordRange(wpWordStart,oldplace));\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tCFX_GraphStateData gsd;\n\tgsd.m_LineWidth = 0;\n\tif (pathSpell.GetPointCount() > 0)\n\t\tpDevice->DrawPath(&pathSpell, pUser2Device, &gsd, 0, crSpell, FXFILL_ALTERNATE);\n\n\tpDevice->RestoreState();\n}\n\nFX_BOOL CPWL_Utils::IsBlackOrWhite(const CPWL_Color& color)\n{\n\tswitch (color.nColorType)\n\t{\n\tcase COLORTYPE_TRANSPARENT:\n\t\treturn FALSE;\n\tcase COLORTYPE_GRAY:\n\t\treturn color.fColor1 < 0.5f;\n\tcase COLORTYPE_RGB:\n\t\treturn color.fColor1 + color.fColor2 + color.fColor3 < 1.5f;\n\tcase COLORTYPE_CMYK:\n\t\treturn color.fColor1 + color.fColor2 + color.fColor3 + color.fColor4 > 2.0f;\n\t}\n\n\treturn TRUE;\n}\n\nCPWL_Color CPWL_Utils::GetReverseColor(const CPWL_Color& color)\n{\n\tCPWL_Color crRet = color;\n\n\tswitch (color.nColorType)\n\t{\n\tcase COLORTYPE_GRAY:\n\t\tcrRet.fColor1 = 1.0f - crRet.fColor1;\n\t\tbreak;\n\tcase COLORTYPE_RGB:\n\t\tcrRet.fColor1 = 1.0f - crRet.fColor1;\n\t\tcrRet.fColor2 = 1.0f - crRet.fColor2;\n\t\tcrRet.fColor3 = 1.0f - crRet.fColor3;\n\t\tbreak;\n\tcase COLORTYPE_CMYK:\n\t\tcrRet.fColor1 = 1.0f - crRet.fColor1;\n\t\tcrRet.fColor2 = 1.0f - crRet.fColor2;\n\t\tcrRet.fColor3 = 1.0f - crRet.fColor3;\n\t\tcrRet.fColor4 = 1.0f - crRet.fColor4;\n\t\tbreak;\n\t}\n\n\treturn crRet;\n}\n\nCFX_ByteString CPWL_Utils::GetIconAppStream(FX_INT32 nType, const CPDF_Rect& rect, const CPWL_Color& crFill, \n\t\t\t\t\t\t\t\t\t\t\t\tconst CPWL_Color& crStroke)\n{\n\tCFX_ByteString sAppStream = CPWL_Utils::GetColorAppStream(crStroke, FALSE);\n\tsAppStream += CPWL_Utils::GetColorAppStream(crFill, TRUE);\n\n\tCFX_ByteString sPath;\n\tCFX_PathData path;\n\n\tswitch (nType)\n\t{\n\tcase PWL_ICONTYPE_CHECKMARK:\n\t\tGetGraphics_Checkmark(sPath, path, rect, PWLPT_STREAM);\t\n\t\tbreak;\n\tcase PWL_ICONTYPE_CIRCLE:\n\t\tGetGraphics_Circle(sPath, path, rect, PWLPT_STREAM);\n\t\tbreak;\n\tcase PWL_ICONTYPE_COMMENT:\n\t\tGetGraphics_Comment(sPath, path, rect, PWLPT_STREAM);\n\t\tbreak;\n\tcase PWL_ICONTYPE_CROSS:\n\t\tGetGraphics_Cross(sPath, path, rect, PWLPT_STREAM);\n\t\tbreak;\n\tcase PWL_ICONTYPE_HELP:\n\t\tGetGraphics_Help(sPath, path, rect, PWLPT_STREAM);\n\t\tbreak;\n\tcase PWL_ICONTYPE_INSERTTEXT:\n\t\tGetGraphics_InsertText(sPath, path, rect, PWLPT_STREAM);\n\t\tbreak;\n\tcase PWL_ICONTYPE_KEY:\n\t\tGetGraphics_Key(sPath, path, rect, PWLPT_STREAM);\n\t\tbreak;\n\tcase PWL_ICONTYPE_NEWPARAGRAPH:\n\t\tGetGraphics_NewParagraph(sPath, path, rect, PWLPT_STREAM);\n\t\tbreak;\n\tcase PWL_ICONTYPE_TEXTNOTE:\n\t\tGetGraphics_TextNote(sPath, path, rect, PWLPT_STREAM);\n\t\tbreak;\n\tcase PWL_ICONTYPE_PARAGRAPH:\n\t\tGetGraphics_Paragraph(sPath, path, rect, PWLPT_STREAM);\n\t\tbreak;\n\tcase PWL_ICONTYPE_RIGHTARROW:\n\t\tGetGraphics_RightArrow(sPath, path, rect, PWLPT_STREAM);\n\t\tbreak;\n\tcase PWL_ICONTYPE_RIGHTPOINTER:\n\t\tGetGraphics_RightPointer(sPath, path, rect, PWLPT_STREAM);\n\t\tbreak;\n\tcase PWL_ICONTYPE_STAR:\n\t\tGetGraphics_Star(sPath, path, rect, PWLPT_STREAM);\n\t\tbreak;\n\tcase PWL_ICONTYPE_UPARROW:\n\t\tGetGraphics_UpArrow(sPath, path, rect, PWLPT_STREAM);\n\t\tbreak;\n\tcase PWL_ICONTYPE_UPLEFTARROW:\n\t\tGetGraphics_UpLeftArrow(sPath, path, rect, PWLPT_STREAM);\n\t\tbreak;\n\tcase PWL_ICONTYPE_GRAPH:\n\t\tGetGraphics_Graph(sPath, path, rect, PWLPT_STREAM);\n\t\tbreak;\n\tcase PWL_ICONTYPE_PAPERCLIP:\n\t\tGetGraphics_Paperclip(sPath, path, rect, PWLPT_STREAM);\n\t\tbreak;\n\tcase PWL_ICONTYPE_ATTACHMENT:\n\t\tGetGraphics_Attachment(sPath, path, rect, PWLPT_STREAM);\n\t\tbreak;\n\tcase PWL_ICONTYPE_TAG:\n\t\tGetGraphics_Tag(sPath, path, rect, PWLPT_STREAM);\n\t\tbreak;\n\tcase PWL_ICONTYPE_FOXIT:\n\t\tGetGraphics_Foxit(sPath, path, rect, PWLPT_STREAM);\n\t\tbreak;\n\t}\n\n\tsAppStream += sPath;\n\tif (crStroke.nColorType != COLORTYPE_TRANSPARENT)\n\t\tsAppStream += \"B*\\n\";\n\telse\n\t\tsAppStream += \"f*\\n\";\n\n\treturn sAppStream;\n}\n\nvoid CPWL_Utils::DrawIconAppStream(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,\n\t\t\t\t\t\tFX_INT32 nType, const CPDF_Rect & rect, const CPWL_Color& crFill, const CPWL_Color& crStroke, const FX_INT32 nTransparancy)\n{\n\tCFX_GraphStateData gsd;\n\tgsd.m_LineWidth = 1.0f;\n\n\tCFX_ByteString sPath;\n\tCFX_PathData path;\n\n\tswitch (nType)\n\t{\n\tcase PWL_ICONTYPE_CHECKMARK:\n\t\tGetGraphics_Checkmark(sPath, path, rect, PWLPT_PATHDATA);\n\t\tbreak;\n\tcase PWL_ICONTYPE_CIRCLE:\n\t\tGetGraphics_Circle(sPath, path, rect, PWLPT_PATHDATA);\n\t\tbreak;\n\tcase PWL_ICONTYPE_COMMENT:\n\t\tGetGraphics_Comment(sPath, path, rect, PWLPT_PATHDATA);\n\t\tbreak;\n\tcase PWL_ICONTYPE_CROSS:\n\t\tGetGraphics_Cross(sPath, path, rect, PWLPT_PATHDATA);\n\t\tbreak;\n\tcase PWL_ICONTYPE_HELP:\n\t\tGetGraphics_Help(sPath, path, rect, PWLPT_PATHDATA);\n\t\tbreak;\n\tcase PWL_ICONTYPE_INSERTTEXT:\n\t\tGetGraphics_InsertText(sPath, path, rect, PWLPT_PATHDATA);\n\t\tbreak;\n\tcase PWL_ICONTYPE_KEY:\n\t\tGetGraphics_Key(sPath, path, rect, PWLPT_PATHDATA);\n\t\tbreak;\n\tcase PWL_ICONTYPE_NEWPARAGRAPH:\n\t\tGetGraphics_NewParagraph(sPath, path, rect, PWLPT_PATHDATA);\n\t\tbreak;\n\tcase PWL_ICONTYPE_TEXTNOTE:\n\t\tGetGraphics_TextNote(sPath, path, rect, PWLPT_PATHDATA);\n\t\tbreak;\n\tcase PWL_ICONTYPE_PARAGRAPH:\n\t\tGetGraphics_Paragraph(sPath, path, rect, PWLPT_PATHDATA);\n\t\tbreak;\n\tcase PWL_ICONTYPE_RIGHTARROW:\n\t\tGetGraphics_RightArrow(sPath, path, rect, PWLPT_PATHDATA);\n\t\tbreak;\n\tcase PWL_ICONTYPE_RIGHTPOINTER:\n\t\tGetGraphics_RightPointer(sPath, path, rect, PWLPT_PATHDATA);\n\t\tbreak;\n\tcase PWL_ICONTYPE_STAR:\n\t\tGetGraphics_Star(sPath, path, rect, PWLPT_PATHDATA);\n\t\tbreak;\n\tcase PWL_ICONTYPE_UPARROW:\n\t\tGetGraphics_UpArrow(sPath, path, rect, PWLPT_PATHDATA);\n\t\tbreak;\n\tcase PWL_ICONTYPE_UPLEFTARROW:\n\t\tGetGraphics_UpLeftArrow(sPath, path, rect, PWLPT_PATHDATA);\n\t\tbreak;\n\tcase PWL_ICONTYPE_GRAPH:\n\t\tGetGraphics_Graph(sPath, path, rect, PWLPT_PATHDATA);\n\t\tbreak;\n\tcase PWL_ICONTYPE_PAPERCLIP:\n\t\tGetGraphics_Paperclip(sPath, path, rect, PWLPT_PATHDATA);\n\t\tbreak;\n\tcase PWL_ICONTYPE_ATTACHMENT:\n\t\tGetGraphics_Attachment(sPath, path, rect, PWLPT_PATHDATA);\n\t\tbreak;\n\tcase PWL_ICONTYPE_TAG:\n\t\tGetGraphics_Tag(sPath, path, rect, PWLPT_PATHDATA);\n\t\tbreak;\n\tcase PWL_ICONTYPE_FOXIT:\n\t\tGetGraphics_Foxit(sPath, path, rect, PWLPT_PATHDATA);\n\t\tbreak;\n\tdefault:\n\t\treturn;\n\t}\n\n\tpDevice->DrawPath(&path, pUser2Device, &gsd, \n\t\tPWLColorToFXColor(crFill,nTransparancy), PWLColorToFXColor(crStroke,nTransparancy), FXFILL_ALTERNATE);\n}\n\nvoid CPWL_Utils::GetGraphics_Checkmark(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)\n{\n\tFX_FLOAT fWidth = crBBox.right - crBBox.left;\n\tFX_FLOAT fHeight = crBBox.top - crBBox.bottom;\n\n\tCPWL_PathData PathArray[] = \n\t{\n\t\tCPWL_PathData(CPWL_Point(crBBox.left  + fWidth / 15.0f, crBBox.bottom + fHeight * 2 / 5.0f),PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left  + fWidth / 15.0f + PWL_BEZIER*(fWidth / 7.0f - fWidth / 15.0f), \n\t\t\t\t\t  crBBox.bottom + fHeight * 2 / 5.0f + PWL_BEZIER*(fHeight * 2 / 7.0f - fHeight * 2 / 5.0f)), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth / 4.5f + PWL_BEZIER*(fWidth / 5.0f - fWidth / 4.5f),\n\t\t\t\t\t  crBBox.bottom + fHeight / 16.0f + PWL_BEZIER*(fHeight / 5.0f - fHeight / 16.0f)), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth / 4.5f, crBBox.bottom + fHeight / 16.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth / 4.5f + PWL_BEZIER*(fWidth / 4.4f - fWidth / 4.5f),\n\t\t              crBBox.bottom + fHeight / 16.0f - PWL_BEZIER*fHeight / 16.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.0f + PWL_BEZIER*(fWidth / 4.0f - fWidth / 3.0f),\n\t\t              crBBox.bottom), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.0f, crBBox.bottom), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.0f + PWL_BEZIER*fWidth*(1/7.0f + 2/15.0f),\n\t\t              crBBox.bottom + PWL_BEZIER*fHeight * 4 / 5.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left  + fWidth * 14 / 15.0f + PWL_BEZIER*fWidth*(1/7.0f - 7/15.0f),\n\t\t              crBBox.bottom + fHeight * 15/16.0f + PWL_BEZIER*(fHeight * 4/5.0f - fHeight * 15/16.0f)), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left  + fWidth * 14 / 15.0f,crBBox.bottom + fHeight * 15 / 16.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left  + fWidth * 14 / 15.0f + PWL_BEZIER*(fWidth * 7 / 15.0f - fWidth * 14 / 15.0f),\n\t\t              crBBox.bottom + fHeight * 15 / 16.0f + PWL_BEZIER*(fHeight * 8 / 7.0f - fHeight * 15 / 16.0f)), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.6f + PWL_BEZIER*(fWidth / 3.4f - fWidth / 3.6f),\n\t\t              crBBox.bottom + fHeight / 3.5f + PWL_BEZIER*(fHeight / 3.5f - fHeight / 3.5f)), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.6f,crBBox.bottom + fHeight / 3.5f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.6f,\n\t\t              crBBox.bottom + fHeight / 3.5f + PWL_BEZIER*(fHeight / 4.0f - fHeight / 3.5f)), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left  + fWidth / 15.0f + PWL_BEZIER*(fWidth / 3.5f - fWidth / 15.0f),\n\t\t              crBBox.bottom + fHeight * 2 / 5.0f + PWL_BEZIER*(fHeight * 3.5f / 5.0f - fHeight * 2 / 5.0f)), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left  + fWidth / 15.0f,crBBox.bottom + fHeight * 2 / 5.0f), PWLPT_BEZIERTO)\n\t};\n\n\tif(type == PWLPT_STREAM)\n\t\tsPathData = GetAppStreamFromArray(PathArray, 16);\n\telse\n\t\tGetPathDataFromArray(path, PathArray, 16);\n}\n\nvoid CPWL_Utils::GetGraphics_Circle(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)\n{\n\tFX_FLOAT fWidth = crBBox.right - crBBox.left;\n\tFX_FLOAT fHeight = crBBox.top - crBBox.bottom;\n\n\tCPWL_PathData PathArray[] =\n\t{\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f,crBBox.bottom + fHeight/2.0f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f,\n\t\t              crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight*14/15.0f - fHeight/2.0f)), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*(fWidth/2.0f - fWidth/15.0f), crBBox.top - fHeight/15.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f,crBBox.top - fHeight/15.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_BEZIER*(fWidth*14/15.0f - fWidth/2.0f), crBBox.top - fHeight/15.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight*14/15.0f - fHeight/2.0f)), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.bottom + fHeight/2.0f - PWL_BEZIER*(fHeight/2.0f - fHeight/15.0f)), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_BEZIER*(fWidth*14/15.0f - fWidth/2.0f), crBBox.bottom + fHeight/15.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.bottom + fHeight/15.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*(fWidth/2.0f - fWidth/15.0f), crBBox.bottom + fHeight/15.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.bottom + fHeight/2.0f - PWL_BEZIER*(fHeight/2.0f - fHeight/15.0f)), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f,crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight*4/5.0f - fHeight/2.0f)), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*(fWidth/2.0f - fWidth*3/15.0f), crBBox.top - fHeight*3/15.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight*3/15.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_BEZIER*(fWidth*4/5.0f - fWidth/2.0f), crBBox.top - fHeight*3/15.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight*4/5.0f - fHeight/2.0f)), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f - PWL_BEZIER*(fHeight*4/5.0f - fHeight/2.0f)), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_BEZIER*(fWidth*4/5.0f - fWidth/2.0f), crBBox.bottom + fHeight*3/15.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.bottom + fHeight*3/15.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*(fWidth*4/5.0f - fWidth/2.0f), crBBox.bottom + fHeight*3/15.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f - PWL_BEZIER*(fHeight*4/5.0f - fHeight/2.0f)), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO)\n\t};\n\n\tif(type == PWLPT_STREAM)\n\t\tsPathData = GetAppStreamFromArray(PathArray, 26);\n\telse\n\t\tGetPathDataFromArray(path, PathArray, 26);\n}\n\nvoid CPWL_Utils::GetGraphics_Comment(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)\n{\n\tFX_FLOAT fWidth = crBBox.right - crBBox.left;\n\tFX_FLOAT fHeight = crBBox.top - crBBox.bottom;\n\n\tCPWL_PathData PathArray[] = \n\t{\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.top - fHeight/6.0f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.top - fHeight/6.0f + PWL_BEZIER*(fHeight/6.0f - fHeight/10.0f)), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f - PWL_BEZIER*fWidth/15.0f, crBBox.top - fHeight/10.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f, crBBox.top - fHeight/10.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f, crBBox.top - fHeight/10.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f + PWL_BEZIER*fWidth/15.0f, crBBox.top - fHeight/10.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.top - fHeight/6 + PWL_BEZIER*(fHeight/6.0f - fHeight/10.0f)), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.top - fHeight/6.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.bottom + fHeight/3.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.bottom + fHeight*4/15.0f + PWL_BEZIER*fHeight/15.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f + PWL_BEZIER*fWidth/15.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*5/15.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*5/15.0f, crBBox.bottom + fHeight*2/15 + PWL_BEZIER*fHeight*2/15.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*5/15.0f - PWL_BEZIER*fWidth*2/15.0f, crBBox.bottom + fHeight*2/15.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*6/30.0f, crBBox.bottom + fHeight*2/15.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*7/30.0f + PWL_BEZIER*fWidth/30.0f, crBBox.bottom + fHeight*2/15.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*7/30.0f, crBBox.bottom + fHeight*2/15.0f + PWL_BEZIER*fHeight*2/15.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*7/30.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f - PWL_BEZIER*fWidth/15.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.bottom + fHeight/3.0f - PWL_BEZIER*fHeight/15.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.bottom + fHeight/3.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.top - fHeight/6.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f, crBBox.top - fHeight*8/30.0f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f, crBBox.top - fHeight*8/30.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15, crBBox.top - fHeight*25/60.0f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f, crBBox.top - fHeight*25/60.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f, crBBox.top - fHeight*17/30.0f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*4/15.0f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO)\n\t};\n\n\tif(type == PWLPT_STREAM)\n\t\tsPathData = GetAppStreamFromArray(PathArray, 30);\n\telse\n\t\tGetPathDataFromArray(path, PathArray, 30);\n}\n\nvoid CPWL_Utils::GetGraphics_Cross(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)\n{\n\tFX_FLOAT fWidth = crBBox.right - crBBox.left;\n\tFX_FLOAT fHeight = crBBox.top - crBBox.bottom;\n\t//FX_FLOAT fcatercorner = (FX_FLOAT)sqrt(fWidth*fWidth + fHeight*fHeight);\n\tCPWL_Point center_point(crBBox.left + fWidth/2, crBBox.bottom + fHeight/2);\n\n\tCPWL_PathData PathArray[] = \n\t{\n\t\tCPWL_PathData(CPWL_Point(center_point.x, center_point.y + fHeight/10.0f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(center_point.x + fWidth*0.3f, center_point.y + fHeight/10.0f + fWidth*0.3f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(center_point.x + fWidth/10.0f + fWidth*0.3f, center_point.y + fHeight*0.3f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(center_point.x + fWidth/10.0f, center_point.y), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(center_point.x + fWidth/10.0f + fWidth*0.3f, center_point.y - fHeight*0.3f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(center_point.x + fWidth*0.3f, center_point.y - fHeight/10.0f - fHeight*0.3f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(center_point.x, center_point.y - fHeight/10.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(center_point.x - fWidth*0.3f, center_point.y - fHeight/10 - fHeight*0.3f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(center_point.x - fWidth/10.0f - fWidth*0.3f, center_point.y - fHeight*0.3f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(center_point.x - fWidth/10, center_point.y), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(center_point.x - fWidth/10 - fWidth*0.3f, center_point.y + fHeight*0.3f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(center_point.x - fWidth*0.3f, center_point.y + fHeight/10.0f + fHeight*0.3f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(center_point.x, center_point.y + fHeight/10.0f), PWLPT_LINETO)\n\t};\n\n\tif(type == PWLPT_STREAM)\n\t\tsPathData = GetAppStreamFromArray(PathArray, 13);\n\telse\n\t\tGetPathDataFromArray(path, PathArray, 13);\n}\n\nvoid CPWL_Utils::GetGraphics_Help(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)\n{\n\tFX_FLOAT fWidth = crBBox.right - crBBox.left;\n\tFX_FLOAT fHeight = crBBox.top - crBBox.bottom;\n\n\tCPWL_PathData PathArray[] = \n\t{\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/60.0f, crBBox.bottom + fHeight/2.0f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/60.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight/60.0f - fHeight/2.0f)), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*(fWidth/2.0f - fWidth/60.0f), crBBox.bottom + fHeight/60.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.bottom + fHeight/60.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_BEZIER*fWidth*29/60.0f, crBBox.bottom + fHeight/60.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/60.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight/60.0f - fHeight/2.0f)), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/60.0f, crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/60.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*fHeight*29/60.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_BEZIER*fWidth*29/60.0f, crBBox.top - fHeight/60.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/60.0f), PWLPT_BEZIERTO),\t\t\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*fWidth*29/60.0f, crBBox.top - fHeight/60.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/60.0f, crBBox.bottom + fHeight/2.0f  + PWL_BEZIER*fHeight*29/60.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/60.0f, crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.27f, crBBox.top - fHeight*0.36f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.27f, crBBox.top - fHeight*0.36f + PWL_BEZIER*fHeight*0.23f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f - PWL_BEZIER*fWidth*0.23f, crBBox.bottom + fHeight*0.87f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.bottom + fHeight*0.87f), PWLPT_BEZIERTO),\t\t\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f + PWL_BEZIER*fWidth*0.23f, crBBox.bottom + fHeight*0.87f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.27f, crBBox.top - fHeight*0.36f + PWL_BEZIER*fHeight*0.23f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.27f, crBBox.top - fHeight*0.36f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.27f - fWidth*0.08f*0.2f, crBBox.top - fHeight*0.36f - fHeight*0.15f*0.7f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.35f + fWidth*0.08f*0.2f, crBBox.top - fHeight*0.51f + fHeight*0.15f*0.2f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.35f, crBBox.top - fHeight*0.51f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.35f - fWidth*0.1f*0.5f, crBBox.top - fHeight*0.51f - fHeight*0.15f*0.3f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f - fWidth*0.1f*0.5f, crBBox.top - fHeight*0.68f + fHeight*0.15f*0.5f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f, crBBox.top - fHeight*0.68f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f, crBBox.bottom + fHeight*0.30f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f, crBBox.bottom + fHeight*0.30f - fWidth*0.1f*0.7f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.55f, crBBox.bottom + fHeight*0.30f - fWidth*0.1f*0.7f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.55f, crBBox.bottom + fHeight*0.30f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.55f, crBBox.top - fHeight*0.66f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.55f - fWidth*0.1f*0.05f, crBBox.top - fHeight*0.66f + fHeight*0.18f*0.5f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f - fWidth*0.1f*0.05f, crBBox.top - fHeight*0.48f - fHeight*0.18f*0.3f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f, crBBox.top - fHeight*0.48f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f + fWidth*0.08f*0.2f, crBBox.top - fHeight*0.48f + fHeight*0.18f*0.2f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.37f - fWidth*0.08f*0.2f, crBBox.top - fHeight*0.36f - fHeight*0.18f*0.7f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.37f, crBBox.top - fHeight*0.36f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.37f, crBBox.top - fHeight*0.36f + PWL_BEZIER*fHeight*0.13f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f + PWL_BEZIER*fWidth*0.13f, crBBox.bottom + fHeight*0.77f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.bottom + fHeight*0.77f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f - PWL_BEZIER*fWidth*0.13f, crBBox.bottom + fHeight*0.77f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.37f, crBBox.top - fHeight*0.36f + PWL_BEZIER*fHeight*0.13f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.37f, crBBox.top - fHeight*0.36f), PWLPT_BEZIERTO),\t\t\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.37f, crBBox.top - fHeight*0.36f - fWidth*0.1f*0.6f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.27f, crBBox.top - fHeight*0.36f - fWidth*0.1f*0.6f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.27f, crBBox.top - fHeight*0.36f), PWLPT_BEZIERTO),\t\t\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.56f, crBBox.bottom + fHeight*0.13f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.56f, crBBox.bottom + fHeight*0.13f + PWL_BEZIER*fHeight*0.055f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f - PWL_BEZIER*fWidth*0.095f, crBBox.bottom + fHeight*0.185f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f, crBBox.bottom + fHeight*0.185f), PWLPT_BEZIERTO),\t\t\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f + PWL_BEZIER*fWidth*0.065f, crBBox.bottom + fHeight*0.185f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.44f, crBBox.bottom + fHeight*0.13f + PWL_BEZIER*fHeight*0.055f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.44f, crBBox.bottom + fHeight*0.13f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.44f, crBBox.bottom + fHeight*0.13f - PWL_BEZIER*fHeight*0.055f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f + PWL_BEZIER*fWidth*0.065f, crBBox.bottom + fHeight*0.075f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f, crBBox.bottom + fHeight*0.075f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f - PWL_BEZIER*fWidth*0.065f, crBBox.bottom + fHeight*0.075f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.56f, crBBox.bottom + fHeight*0.13f - PWL_BEZIER*fHeight*0.055f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.56f, crBBox.bottom + fHeight*0.13f), PWLPT_BEZIERTO)\n\t};\n\n\tif(type == PWLPT_STREAM)\n\t\tsPathData = GetAppStreamFromArray(PathArray, 59);\n\telse\n\t\tGetPathDataFromArray(path, PathArray, 59);\n}\n\nvoid CPWL_Utils::GetGraphics_InsertText(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)\n{\n\tFX_FLOAT fWidth = crBBox.right - crBBox.left;\n\tFX_FLOAT fHeight = crBBox.top - crBBox.bottom;\n\n\tCPWL_PathData PathArray[] = \n\t{\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/10, crBBox.bottom + fHeight/10), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2, crBBox.top - fHeight*2/15), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/10, crBBox.bottom + fHeight/10), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/10, crBBox.bottom + fHeight/10), PWLPT_LINETO)\n\t};\n\n\tif(type == PWLPT_STREAM)\n\t\tsPathData = GetAppStreamFromArray(PathArray, 4);\n\telse\n\t\tGetPathDataFromArray(path, PathArray, 4);\n}\n\nvoid CPWL_Utils::GetGraphics_Key(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)\n{\n\tFX_FLOAT fWidth = crBBox.right - crBBox.left;\n\tFX_FLOAT fHeight = crBBox.top - crBBox.bottom;\n\tFX_FLOAT k = -fHeight/fWidth;\n\tCPWL_Point tail;\n\tCPWL_Point CicleCenter;\n\ttail.x = crBBox.left + fWidth*0.9f;\n\ttail.y = k*(tail.x - crBBox.right) + crBBox.bottom;\n\tCicleCenter.x = crBBox.left + fWidth*0.15f;\n\tCicleCenter.y = k*(CicleCenter.x - crBBox.right) + crBBox.bottom;\n\n\tCPWL_PathData PathArray[] = \n\t{\n\t\tCPWL_PathData(CPWL_Point(tail.x + fWidth/30.0f, -fWidth/30.0f/k + tail.y), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(tail.x + fWidth/30.0f - fWidth*0.18f, -k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f + fWidth*0.07f,\n\t\t              -fWidth*0.07f/k - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20 + fWidth*0.07f,\n\t\t              -fWidth*0.07f/k - k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20,\n\t\t              -k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20 - fWidth/15,\n\t\t              -k*fWidth/15 - k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20 - fWidth/15 + fWidth*0.07f,\n\t\t              -fWidth*0.07f/k - k*fWidth/15 - k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20 - fWidth/15 - fWidth/20 + fWidth*0.07f,\n\t\t              -fWidth*0.07f/k + -k*fWidth/20 + -k*fWidth/15 - k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20 - fWidth/15 - fWidth/20,\n\t\t              -k*fWidth/20 + -k*fWidth/15 - k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.45f, -k*fWidth*0.45f - fWidth/30/k + tail.y), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.45f + fWidth*0.2f,\n\t\t              -fWidth*0.4f/k - k*fWidth*0.45f - fWidth/30/k + tail.y), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.2f, - fWidth*0.1f/k + CicleCenter.y), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(CicleCenter.x, CicleCenter.y), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(CicleCenter.x - fWidth/60.0f, -k*fWidth/60 + CicleCenter.y), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(CicleCenter.x - fWidth/60, -k*fWidth/60 + CicleCenter.y), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(CicleCenter.x, CicleCenter.y), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(CicleCenter.x - fWidth*0.22f, fWidth*0.35f/k + CicleCenter.y - fHeight*0.05f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(tail.x - fWidth/30 - fWidth*0.45f - fWidth*0.18f, fWidth*0.05f/k - k*fWidth*0.45f + fWidth/30/k + tail.y - fHeight*0.05f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(tail.x - fWidth/30.0f - fWidth*0.45f, -k*fWidth*0.45f + fWidth/30.0f/k + tail.y), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(tail.x - fWidth/30.0f, fWidth/30.0f/k + tail.y), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(tail.x + fWidth/30, -fWidth/30/k + tail.y), PWLPT_LINETO),\t\t\n \t\tCPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.08f, k*fWidth*0.08f + CicleCenter.y), PWLPT_MOVETO),\n \t\tCPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.08f + fWidth*0.1f, -fWidth*0.1f/k + k*fWidth*0.08f + CicleCenter.y), PWLPT_BEZIERTO),\n \t\tCPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.22f + fWidth*0.1f, k*fWidth*0.22f + CicleCenter.y - fWidth*0.1f/k), PWLPT_BEZIERTO),\n \t\tCPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.22f, k*fWidth*0.22f + CicleCenter.y), PWLPT_BEZIERTO),\n \t\tCPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.22f - fWidth*0.1f, fWidth*0.1f/k + k*fWidth*0.22f + CicleCenter.y), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.08f - fWidth*0.1f, fWidth*0.1f/k + k*fWidth*0.08f + CicleCenter.y), PWLPT_BEZIERTO),\n \t\tCPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.08f, k*fWidth*0.08f + CicleCenter.y), PWLPT_BEZIERTO)\n\t};\n\n\tif(type == PWLPT_STREAM)\n\t\tsPathData = GetAppStreamFromArray(PathArray, 28);\n\telse\n\t\tGetPathDataFromArray(path, PathArray, 28);\n}\n\nvoid CPWL_Utils::GetGraphics_NewParagraph(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)\n{\n\tFX_FLOAT fWidth = crBBox.right - crBBox.left;\n\tFX_FLOAT fHeight = crBBox.top - crBBox.bottom;\n\n\tCPWL_PathData PathArray[] = \n\t{\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/20.0f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/10.0f, crBBox.top - fHeight/2.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.top - fHeight/2.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/20.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.12f, crBBox.top - fHeight*17/30.0f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.12f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.22f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.22f, crBBox.top - fHeight*17/30.0f - fWidth*0.14f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.38f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.48f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.48f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.38f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.38f, crBBox.bottom + fWidth*0.24f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.22f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.12f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.bottom + fHeight/10.0f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight/10.0f + fHeight/7.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.97f, crBBox.bottom + fHeight/10.0f + fHeight/7.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.97f, crBBox.top - fHeight*17/30.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.top - fHeight*17/30.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight/7 + fHeight*0.18f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.85f, crBBox.bottom + fHeight/7 + fHeight*0.18f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.85f, crBBox.top - fHeight*17/30.0f - fHeight*0.08f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.top - fHeight*17/30.0f - fHeight*0.08f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight/7 + fHeight*0.18f), PWLPT_LINETO)\n\t};\n\n\tif(type == PWLPT_STREAM)\n\t\tsPathData = GetAppStreamFromArray(PathArray, 28);\n\telse\n\t\tGetPathDataFromArray(path, PathArray, 28);\n}\n\nvoid CPWL_Utils::GetGraphics_TextNote(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)\n{\n\tFX_FLOAT fWidth = crBBox.right - crBBox.left;\n\tFX_FLOAT fHeight = crBBox.top - crBBox.bottom;\n\n\tCPWL_PathData PathArray[] = \n\t{\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/10.0f, crBBox.bottom + fHeight/15.0f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*7/10.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.top - fHeight/15.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/10.0f, crBBox.top - fHeight/15.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/10.0f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/10.0f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/10.0f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/10.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/5.0f, crBBox.top - fHeight*4/15.0f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/5.0f, crBBox.top - fHeight*4/15.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/5.0f, crBBox.top - fHeight*7/15.0f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/5.0f, crBBox.top - fHeight*7/15.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/5.0f, crBBox.top - fHeight*10/15.0f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/10.0f, crBBox.top - fHeight*10/15.0f), PWLPT_LINETO)\n\t};\n\n\tif(type == PWLPT_STREAM)\n\t\tsPathData = GetAppStreamFromArray(PathArray, 17);\n\telse\n\t\tGetPathDataFromArray(path, PathArray, 17);\n}\n\nvoid CPWL_Utils::GetGraphics_Paragraph(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)\n{\n\tFX_FLOAT fWidth = crBBox.right - crBBox.left;\n\tFX_FLOAT fHeight = crBBox.top - crBBox.bottom;\n\n\tCPWL_PathData PathArray[] =\n\t{\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/15.0f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.top - fHeight/15.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.634f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.634f, crBBox.top - fHeight*2/15.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.566f, crBBox.top - fHeight*2/15.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.566f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/15.0f - fHeight*0.4f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.2f, crBBox.top - fHeight/15.0f - fHeight*0.4f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.2f, crBBox.top - fHeight/15.0f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/15.0f), PWLPT_BEZIERTO)\n\t};\n\n\tif(type == PWLPT_STREAM)\n\t\tsPathData = GetAppStreamFromArray(PathArray, 12);\n\telse\n\t\tGetPathDataFromArray(path, PathArray, 12);\n}\n\nvoid CPWL_Utils::GetGraphics_RightArrow(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)\n{\n\tFX_FLOAT fWidth = crBBox.right - crBBox.left;\n\tFX_FLOAT fHeight = crBBox.top - crBBox.bottom;\n\n\tCPWL_PathData PathArray[] = \n\t{\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.top - fHeight/2.0f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + fWidth/8.0f, crBBox.bottom + fHeight/5.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.bottom + fHeight/5.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f - fWidth*0.15f, crBBox.top - fHeight/2.0f - fWidth/25.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.1f, crBBox.top - fHeight/2.0f - fWidth/25.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.1f, crBBox.top - fHeight/2.0f + fWidth/25.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f - fWidth*0.15f, crBBox.top - fHeight/2.0f + fWidth/25.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/5.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + fWidth/8.0f, crBBox.top - fHeight/5.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.top - fHeight/2.0f), PWLPT_LINETO)\n\t};\n\n\tif(type == PWLPT_STREAM)\n\t\tsPathData = GetAppStreamFromArray(PathArray, 10);\n\telse\n\t\tGetPathDataFromArray(path, PathArray, 10);\n}\n\nvoid CPWL_Utils::GetGraphics_RightPointer(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)\n{\n\tFX_FLOAT fWidth = crBBox.right - crBBox.left;\n\tFX_FLOAT fHeight = crBBox.top - crBBox.bottom;\n\n\tCPWL_PathData PathArray[] = \n\t{\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/30.0f, crBBox.top - fHeight/2.0f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/30.0f, crBBox.bottom + fHeight/6.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*4/15.0f, crBBox.top - fHeight/2.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/30.0f, crBBox.top - fHeight/6.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/30.0f, crBBox.top - fHeight/2.0f), PWLPT_LINETO)\n\t};\n\n\tif(type == PWLPT_STREAM)\n\t\tsPathData = GetAppStreamFromArray(PathArray, 5);\n\telse\n\t\tGetPathDataFromArray(path, PathArray, 5);\n}\n\nvoid CPWL_Utils::GetGraphics_Star(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)\n{\n\tFX_FLOAT fLongRadius = (crBBox.top - crBBox.bottom)/(1+(FX_FLOAT)cos(PWL_PI/5.0f));\n\tfLongRadius = fLongRadius * 0.7f;\n\tFX_FLOAT fShortRadius = fLongRadius * 0.55f;\n\tCPDF_Point ptCenter = CPDF_Point((crBBox.left + crBBox.right) / 2.0f,(crBBox.top + crBBox.bottom) / 2.0f);\n\t\n\tFX_FLOAT px1[5], py1[5];\n\tFX_FLOAT px2[5], py2[5];\n\n\tFX_FLOAT fAngel = PWL_PI/10.0f;\n\n\tfor (FX_INT32 i=0; i<5; i++)\n\t{\n\t\tpx1[i] = ptCenter.x + fLongRadius * (FX_FLOAT)cos(fAngel);\n\t\tpy1[i] = ptCenter.y + fLongRadius * (FX_FLOAT)sin(fAngel);\n\n\t\tfAngel += PWL_PI * 2 / 5.0f;\n\t}\n\n\tfAngel = PWL_PI/5.0f + PWL_PI/10.0f;\n\n\tfor (FX_INT32 j=0; j<5; j++)\n\t{\n\t\tpx2[j] = ptCenter.x + fShortRadius * (FX_FLOAT)cos(fAngel);\n\t\tpy2[j] = ptCenter.y + fShortRadius * (FX_FLOAT)sin(fAngel);\n\n\t\tfAngel += PWL_PI * 2 / 5.0f;\n\t}\n\n\tCPWL_PathData PathArray[11];\n\tPathArray[0] = CPWL_PathData(CPWL_Point(px1[0], py1[0]), PWLPT_MOVETO);\n\tPathArray[1] = CPWL_PathData(CPWL_Point(px2[0], py2[0]), PWLPT_LINETO);\n\n\tfor(FX_INT32 k = 0; k < 4; k++)\n\t{\n\t\tPathArray[(k+1)*2] = CPWL_PathData(CPWL_Point(px1[k+1], py1[k+1]), PWLPT_LINETO);\n\t\tPathArray[(k+1)*2 + 1] = CPWL_PathData(CPWL_Point(px2[k+1], py2[k+1]), PWLPT_LINETO);\n\t}\n\n\tPathArray[10] = CPWL_PathData(CPWL_Point(px1[0], py1[0]), PWLPT_LINETO);\n\n\tif(type == PWLPT_STREAM)\n\t\tsPathData = GetAppStreamFromArray(PathArray, 11);\n\telse\n\t\tGetPathDataFromArray(path, PathArray, 11);\n}\n\nvoid CPWL_Utils::GetGraphics_UpArrow(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)\n{\n\tFX_FLOAT fWidth = crBBox.right - crBBox.left;\n\tFX_FLOAT fHeight = crBBox.top - crBBox.bottom;\n\n\tCPWL_PathData PathArray[] = \n\t{\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/15.0f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.top - fWidth*3/5.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fWidth*3/5.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fWidth*3/5.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/10, crBBox.top - fWidth*3/5.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/15.0f), PWLPT_LINETO)\n\t};\n\n\tif(type == PWLPT_STREAM)\n\t\tsPathData = GetAppStreamFromArray(PathArray, 8);\n\telse\n\t\tGetPathDataFromArray(path, PathArray, 8);\n}\n\nvoid CPWL_Utils::GetGraphics_UpLeftArrow(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)\n{\n\tFX_FLOAT fWidth = crBBox.right - crBBox.left;\n\tFX_FLOAT fHeight = crBBox.top - crBBox.bottom;\n\tCPWL_Point leftup(crBBox.left, crBBox.top);\n\tCPWL_Point rightdown(crBBox.right, crBBox.bottom);\n\tFX_FLOAT k = -fHeight/fWidth;\n\tCPWL_Point tail;\n\ttail.x = crBBox.left + fWidth*4/5.0f;\n\ttail.y = k*(tail.x - crBBox.right) + rightdown.y;\n\n\tCPWL_PathData PathArray[] = \n\t{\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/20.0f, k*(crBBox.left + fWidth/20.0f - rightdown.x) + rightdown.y), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(fHeight*17/60.0f/k + tail.x + fWidth/10.0f + fWidth/5.0f,\n\t\t              -fWidth/5.0f/k + tail.y - fWidth/10.0f/k + fHeight*17/60.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(fHeight*17/60.0f/k + tail.x + fWidth/10.0f,\n\t\t              tail.y - fWidth/10.0f/k + fHeight*17/60.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(tail.x + fWidth/10.0f, tail.y - fWidth/10.0f/k), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(tail.x - fWidth/10.0f, tail.y + fWidth/10.0f/k), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(fHeight*17/60.0f/k + tail.x - fWidth/10.0f, tail.y + fWidth/10.0f/k + fHeight*17/60.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(fHeight*17/60.0f/k + tail.x - fWidth/10.0f - fWidth/5.0f,\n\t\t              fWidth/5.0f/k + tail.y + fWidth/10.0f/k + fHeight*17/60.0f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/20.0f, k*(crBBox.left + fWidth/20.0f - rightdown.x) + rightdown.y), PWLPT_LINETO)\n\t};\n\n\tif(type == PWLPT_STREAM)\n\t\tsPathData = GetAppStreamFromArray(PathArray, 8);\n\telse\n\t\tGetPathDataFromArray(path, PathArray, 8);\n}\n\nvoid CPWL_Utils::GetGraphics_Graph(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)\n{\n\tFX_FLOAT fWidth = crBBox.right - crBBox.left;\n\tFX_FLOAT fHeight = crBBox.top - crBBox.bottom;\n\n\tCPWL_PathData PathArray[] = \n\t{\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.05f, crBBox.top - fWidth*0.15f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.25f, crBBox.top - fHeight*0.15f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.275f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.05f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.05f, crBBox.top - fWidth*0.15f), PWLPT_LINETO),\n\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.275f, crBBox.top - fWidth*0.45f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.475f, crBBox.top - fWidth*0.45f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.475f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.275f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.275f, crBBox.top - fWidth*0.45f), PWLPT_LINETO),\n\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.top - fHeight*0.05f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.top - fHeight*0.05f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.top - fHeight*0.05f), PWLPT_LINETO),\n\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.725f, crBBox.top - fWidth*0.35f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.925f, crBBox.top - fWidth*0.35f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.925f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.725f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.725f, crBBox.top - fWidth*0.35f), PWLPT_LINETO)\n\t};\n\n\tif(type == PWLPT_STREAM)\n\t\tsPathData = GetAppStreamFromArray(PathArray, 20);\n\telse\n\t\tGetPathDataFromArray(path, PathArray, 20);\n}\n\nvoid CPWL_Utils::GetGraphics_Paperclip(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)\n{\n\tFX_FLOAT fWidth = crBBox.right - crBBox.left;\n\tFX_FLOAT fHeight = crBBox.top - crBBox.bottom;\n\n\tCPWL_PathData PathArray[] = \n\t{\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/60, crBBox.top - fHeight*0.25f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/60, crBBox.bottom + fHeight*0.25f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/60, crBBox.bottom + fHeight*0.25f - fWidth*57/60.0f*0.35f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/30, crBBox.bottom + fHeight*0.25f - fWidth*57/60.0f*0.35f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/30, crBBox.bottom + fHeight*0.25f), PWLPT_BEZIERTO),\n\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/30, crBBox.top - fHeight*0.33f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/30, crBBox.top - fHeight*0.33f + fHeight/15*0.5f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/30 - fWidth*0.12f, crBBox.top - fHeight*0.33f + fHeight/15*0.5f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/30 - fWidth*0.12f, crBBox.top - fHeight*0.33f), PWLPT_BEZIERTO),\n\t\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/30 - fWidth*0.12f, crBBox.bottom + fHeight*0.2f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/30 - fWidth*0.12f, crBBox.bottom + fHeight*0.2f - (fWidth*57/60.0f - fWidth*0.24f)*0.25f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/60 + fWidth*0.12f, crBBox.bottom + fHeight*0.2f - (fWidth*57/60.0f - fWidth*0.24f)*0.25f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/60 + fWidth*0.12f, crBBox.bottom + fHeight*0.2f), PWLPT_BEZIERTO),\n\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/60 + fWidth*0.12f, crBBox.top - fHeight*0.2f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/60 + fWidth*0.12f, crBBox.top - fHeight*0.2f + (fWidth*11/12.0f - fWidth*0.36f)*0.25f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.24f, crBBox.top - fHeight*0.2f + (fWidth*11/12.0f - fWidth*0.36f)*0.25f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.24f, crBBox.top - fHeight*0.2f), PWLPT_BEZIERTO),\n\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.24f, crBBox.bottom + fHeight*0.25f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.24f, crBBox.bottom + fHeight*0.25f - (fWidth*14/15.0f - fWidth*0.53f)*0.25f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.29f, crBBox.bottom + fHeight*0.25f - (fWidth*14/15.0f - fWidth*0.53f)*0.25f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.29f, crBBox.bottom + fHeight*0.25f), PWLPT_BEZIERTO),\n\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.29f, crBBox.top - fHeight*0.33f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.29f, crBBox.top - fHeight*0.33f + fWidth*0.12f*0.35f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.17f, crBBox.top - fHeight*0.33f + fWidth*0.12f*0.35f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.17f, crBBox.top - fHeight*0.33f), PWLPT_BEZIERTO),\n\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.17f, crBBox.bottom + fHeight*0.3f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.17f, crBBox.bottom + fHeight*0.3f - fWidth*(14/15.0f - 0.29f)*0.35f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.12f, crBBox.bottom + fHeight*0.3f - fWidth*(14/15.0f - 0.29f)*0.35f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.12f, crBBox.bottom + fHeight*0.3f), PWLPT_BEZIERTO),\n\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.12f, crBBox.top - fHeight*0.25f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.12f, crBBox.top - fHeight*0.25f + fWidth*0.35f*(11/12.0f - 0.12f)), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/60, crBBox.top - fHeight*0.25f + fWidth*0.35f*(11/12.0f - 0.12f)), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth/60, crBBox.top - fHeight*0.25f), PWLPT_BEZIERTO)\n\t};\n\n\tif(type == PWLPT_STREAM)\n\t\tsPathData = GetAppStreamFromArray(PathArray, 33);\n\telse\n\t\tGetPathDataFromArray(path, PathArray, 33);\t\n}\n\nvoid CPWL_Utils::GetGraphics_Attachment(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)\n{\n\tFX_FLOAT fWidth = crBBox.right - crBBox.left;\n\tFX_FLOAT fHeight = crBBox.top - crBBox.bottom;\n\n\tCPWL_PathData PathArray[] = \n\t{\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.25f, crBBox.top - fHeight*0.1f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.23f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f + fWidth*0.04f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.5f + fWidth*0.04f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.5f), PWLPT_BEZIERTO),\n\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.23f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.25f, crBBox.top - fHeight*0.1f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.25f, crBBox.top - fHeight*0.1f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.23f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.23f), PWLPT_LINETO),\n\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f - fWidth*0.25f*0.4f, crBBox.top - fHeight*0.5f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.15f, crBBox.top - fHeight*0.65f + fHeight*0.15f*0.4f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.15f, crBBox.top - fHeight*0.65f), PWLPT_BEZIERTO),\n\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.15f, crBBox.top - fHeight*0.65f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.15f, crBBox.top - fHeight*0.65f + fHeight*0.15f*0.4f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f + fWidth*0.25f*0.4f, crBBox.top - fHeight*0.5f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.5f), PWLPT_BEZIERTO),\n\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.5f + fWidth*0.04f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f + fWidth*0.04f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f), PWLPT_BEZIERTO),\n\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.top - fHeight*0.65f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.bottom + fHeight*0.1f), PWLPT_LINETO)\n\t};\n\n\tif(type == PWLPT_STREAM)\n\t\tsPathData = GetAppStreamFromArray(PathArray, 24);\n\telse\n\t\tGetPathDataFromArray(path, PathArray, 24);\n}\n\nvoid CPWL_Utils::GetGraphics_Tag(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)\n{\n\tFX_FLOAT fWidth = crBBox.right - crBBox.left;\n\tFX_FLOAT fHeight = crBBox.top - crBBox.bottom;\n\n\tCPWL_PathData PathArray[] = \n\t{\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.1f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.1f, crBBox.top - fHeight*0.5f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.3f, crBBox.bottom + fHeight*0.1f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.1f, crBBox.bottom + fHeight*0.1f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.1f, crBBox.top - fHeight*0.1f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.1f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.3f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.2f, crBBox.top - fHeight*0.3f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.2f, crBBox.top - fHeight*0.5f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.7f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.2f, crBBox.top - fHeight*0.7f), PWLPT_LINETO)\n\t};\n\n\tif(type == PWLPT_STREAM)\n\t\tsPathData = GetAppStreamFromArray(PathArray, 12);\n\telse\n\t\tGetPathDataFromArray(path, PathArray, 12);\n}\n\nvoid CPWL_Utils::GetGraphics_Foxit(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)\n{\n\tFX_FLOAT fOutWidth = crBBox.right - crBBox.left;\n\tFX_FLOAT fOutHeight = crBBox.top - crBBox.bottom;\n\n\tCPDF_Rect crInBox = crBBox;\n\tcrInBox.left = crBBox.left + fOutWidth*0.08f;\n\tcrInBox.right = crBBox.right - fOutWidth*0.08f;\n\tcrInBox.top = crBBox.top - fOutHeight*0.08f;\n\tcrInBox.bottom = crBBox.bottom + fOutHeight*0.08f;\n\n\tFX_FLOAT fWidth = crInBox.right - crInBox.left;\n\tFX_FLOAT fHeight = crInBox.top - crInBox.bottom;\n\n\tCPWL_PathData PathArray[] = \n\t{\n\t\tCPWL_PathData(CPWL_Point(crInBox.left, crInBox.top), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.45f, crInBox.top), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.45f, crInBox.top - PWL_BEZIER * fHeight * 0.4f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.45f  - PWL_BEZIER * fWidth * 0.45f, crInBox.top - fHeight*0.4f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight*0.4f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crInBox.left, crInBox.top), PWLPT_LINETO),\n\n\t\tCPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.60f, crInBox.top), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.75f, crInBox.top), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.75f, crInBox.top - PWL_BEZIER * fHeight * 0.7f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.75f  - PWL_BEZIER * fWidth * 0.75f, crInBox.top - fHeight*0.7f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight*0.7f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight*0.55f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crInBox.left + PWL_BEZIER * fWidth*0.60f, crInBox.top - fHeight*0.55f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.60f, crInBox.top - PWL_BEZIER * fHeight * 0.55f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.60f, crInBox.top), PWLPT_BEZIERTO),\n\n\t\tCPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.90f, crInBox.top), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.90f, crInBox.top - PWL_BEZIER * fHeight * 0.85f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.90f  - PWL_BEZIER * fWidth * 0.90f, crInBox.top - fHeight*0.85f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight*0.85f), PWLPT_BEZIERTO),\n\t\tCPWL_PathData(CPWL_Point(crInBox.left, crInBox.bottom), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crInBox.right, crInBox.bottom), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crInBox.right, crInBox.top), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.90f, crInBox.top), PWLPT_LINETO),\n\n\t\t/*\n\t\tCPWL_PathData(CPWL_Point(crBBox.left, crBBox.top), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right, crBBox.top), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right, crBBox.bottom), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left, crBBox.bottom), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left, crBBox.top), PWLPT_LINETO),\n\n\t\tCPWL_PathData(CPWL_Point(crBBox.left+fOutWidth*0.04f, crBBox.top-fOutHeight*0.04f), PWLPT_MOVETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right-fOutWidth*0.04f, crBBox.top-fOutHeight*0.04f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.right-fOutWidth*0.04f, crBBox.bottom+fOutHeight*0.04f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left+fOutWidth*0.04f, crBBox.bottom+fOutHeight*0.04f), PWLPT_LINETO),\n\t\tCPWL_PathData(CPWL_Point(crBBox.left+fOutWidth*0.04f, crBBox.top-fOutHeight*0.04f), PWLPT_LINETO),\n\t\t*/\n\t};\n\n\tif(type == PWLPT_STREAM)\n\t\tsPathData = GetAppStreamFromArray(PathArray, 23);\n\telse\n\t\tGetPathDataFromArray(path, PathArray, 23);\n}\n\nvoid CPWL_Color::ConvertColorType(FX_INT32 nColorType)\n{\n\tswitch (this->nColorType)\n\t{\n\tcase COLORTYPE_TRANSPARENT:\n\t\tbreak;\n\tcase COLORTYPE_GRAY:\n\t\tswitch (nColorType)\n\t\t{\n\t\tcase COLORTYPE_RGB:\n\t\t\tCPWL_Utils::ConvertGRAY2RGB(this->fColor1, this->fColor1, this->fColor2, this->fColor3);\n\t\t\tbreak;\n\t\tcase COLORTYPE_CMYK:\n\t\t\tCPWL_Utils::ConvertGRAY2CMYK(this->fColor1, this->fColor1, this->fColor2, this->fColor3, this->fColor4);\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\tcase COLORTYPE_RGB:\n\t\tswitch (nColorType)\n\t\t{\n\t\tcase COLORTYPE_GRAY:\n\t\t\tCPWL_Utils::ConvertRGB2GRAY(this->fColor1, this->fColor2, this->fColor3, this->fColor1);\n\t\t\tbreak;\n\t\tcase COLORTYPE_CMYK:\n\t\t\tCPWL_Utils::ConvertRGB2CMYK(this->fColor1, this->fColor2, this->fColor3, this->fColor1, this->fColor2, this->fColor3, this->fColor4);\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\tcase COLORTYPE_CMYK:\n\t\tswitch (nColorType)\n\t\t{\n\t\tcase COLORTYPE_GRAY:\n\t\t\tCPWL_Utils::ConvertCMYK2GRAY(this->fColor1, this->fColor2, this->fColor3, this->fColor4, this->fColor1);\n\t\t\tbreak;\n\t\tcase COLORTYPE_RGB:\n\t\t\tCPWL_Utils::ConvertCMYK2RGB(this->fColor1, this->fColor2, this->fColor3, this->fColor4, this->fColor1, this->fColor2, this->fColor3);\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\t}\n\tthis->nColorType = nColorType;\n}\n\n\n"
  },
  {
    "path": "fpdfsdk/src/pdfwindow/PWL_Wnd.cpp",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n#include \"../../include/pdfwindow/PDFWindow.h\"\n#include \"../../include/pdfwindow/PWL_Wnd.h\"\n#include \"../../include/pdfwindow/PWL_Utils.h\"\n#include \"../../include/pdfwindow/PWL_ScrollBar.h\"\n\n/* -------------------------- CPWL_Timer -------------------------- */\n\nstatic CFX_MapPtrTemplate<FX_INT32, CPWL_Timer*>\tg_TimeMap;\n\nCPWL_Timer::CPWL_Timer(CPWL_TimerHandler* pAttached, IFX_SystemHandler* pSystemHandler) : \n\tm_pAttached(pAttached),\n\tm_nTimerID(0),\n\tm_pSystemHandler(pSystemHandler)\n{\n\tASSERT(m_pAttached != NULL);\n\tASSERT(m_pSystemHandler != NULL);\n}\n\nCPWL_Timer::~CPWL_Timer()\n{\n\tKillPWLTimer();\n}\n\nFX_INT32 CPWL_Timer::SetPWLTimer(FX_INT32 nElapse)\n{\t\n\tif (m_nTimerID != 0) KillPWLTimer();\n\tm_nTimerID = m_pSystemHandler->SetTimer(nElapse, TimerProc);\n\tg_TimeMap.SetAt(m_nTimerID, this);\n\treturn m_nTimerID;\n}\n\nvoid CPWL_Timer::KillPWLTimer()\n{\n\tif (m_nTimerID != 0)\n\t{\n\t\tm_pSystemHandler->KillTimer(m_nTimerID);\n\t\tg_TimeMap.RemoveKey(m_nTimerID);\n\t\tm_nTimerID = 0;\n\t}\n}\n\nvoid CPWL_Timer::TimerProc(FX_INT32 idEvent)\n{\n\tCPWL_Timer* pTimer = NULL;\n\tif (g_TimeMap.Lookup(idEvent, pTimer))\n\t{\n\t\tif (pTimer)\n\t\t{\t\t\t\n\t\t\tif (pTimer->m_pAttached) \n\t\t\t\tpTimer->m_pAttached->TimerProc();\n\t\t}\n\t}\n}\n\n/* -------------------------- CPWL_TimerHandler -------------------------- */\n\nCPWL_TimerHandler::CPWL_TimerHandler() : m_pTimer(NULL)\n{\n}\n\nCPWL_TimerHandler::~CPWL_TimerHandler()\n{\n\tif (m_pTimer) delete m_pTimer;\n}\n\nvoid CPWL_TimerHandler::BeginTimer(FX_INT32 nElapse)\n{\n\tif (!m_pTimer)\n\t\tm_pTimer = new CPWL_Timer(this, GetSystemHandler());\n\n\tif (m_pTimer)\n\t\tm_pTimer->SetPWLTimer(nElapse);\n}\n\nvoid CPWL_TimerHandler::EndTimer()\n{\n\tif (m_pTimer)\n\t\tm_pTimer->KillPWLTimer();\n}\n\nvoid CPWL_TimerHandler::TimerProc()\n{\n}\n\n/* --------------------------- CPWL_MsgControl ---------------------------- */\n\nclass CPWL_MsgControl\n{\n\tfriend class CPWL_Wnd;\n\npublic:\n\tCPWL_MsgControl(CPWL_Wnd * pWnd)\n\t{\n//\t\tPWL_TRACE(\"new CPWL_MsgControl\\n\");\n\t\tm_pCreatedWnd = pWnd;\n\t\tDefault();\n\t}\n\n\t~CPWL_MsgControl()\n\t{\n//\t\tPWL_TRACE(\"~CPWL_MsgControl\\n\");\n\t\tDefault();\n\t}\n\n\tvoid Default()\n\t{\n\t\tm_aMousePath.RemoveAll();\n\t\tm_aKeyboardPath.RemoveAll();\n\t\tm_pMainMouseWnd = NULL;\n\t\tm_pMainKeyboardWnd = NULL;\n\t}\n\n\tFX_BOOL IsWndCreated(const CPWL_Wnd * pWnd) const\n\t{\n\t\treturn m_pCreatedWnd == pWnd;\n\t}\n\n\tFX_BOOL IsMainCaptureMouse(const CPWL_Wnd * pWnd) const\n\t{\n\t\treturn pWnd == m_pMainMouseWnd;\n\t}\n\n\tFX_BOOL IsWndCaptureMouse(const CPWL_Wnd * pWnd) const\n\t{\n\t\tif (pWnd)\n\t\t\tfor( FX_INT32 i=0,sz=m_aMousePath.GetSize(); i<sz; i++)\n\t\t\t\tif (m_aMousePath.GetAt(i) == pWnd)\n\t\t\t\t\treturn TRUE;\n\n\t\treturn FALSE;\n\t}\n\n\tFX_BOOL IsMainCaptureKeyboard(const CPWL_Wnd * pWnd) const\n\t{\n\t\treturn pWnd == m_pMainKeyboardWnd;\n\t}\n\n\n\tFX_BOOL IsWndCaptureKeyboard(const CPWL_Wnd * pWnd) const\n\t{\n\t\tif (pWnd)\n\t\t\tfor( FX_INT32 i=0,sz=m_aKeyboardPath.GetSize(); i<sz; i++)\n\t\t\t\tif (m_aKeyboardPath.GetAt(i) == pWnd)\n\t\t\t\t\treturn TRUE;\n\t\t\n\t\treturn FALSE;\n\t}\n\n\tvoid SetFocus(CPWL_Wnd * pWnd)\n\t{\n\t\tm_aKeyboardPath.RemoveAll();\n\n\t\tif (pWnd)\n\t\t{\n\t\t\tm_pMainKeyboardWnd = pWnd;\n\n\t\t\tCPWL_Wnd * pParent = pWnd;\n\t\t\twhile (pParent)\n\t\t\t{\n\t\t\t\tm_aKeyboardPath.Add(pParent);\n\t\t\t\tpParent = pParent->GetParentWindow();\n\t\t\t}\n\n\t\t\tpWnd->OnSetFocus();\n\t\t}\n\t}\n\n\tvoid KillFocus()\n\t{\n\t\tif (m_aKeyboardPath.GetSize() > 0)\n\t\t\tif (CPWL_Wnd* pWnd = m_aKeyboardPath.GetAt(0))\n\t\t\t\tpWnd->OnKillFocus();\n\n\t\tm_pMainKeyboardWnd = NULL;\n\t\tm_aKeyboardPath.RemoveAll();\n\t}\n\n\tvoid SetCapture(CPWL_Wnd * pWnd)\n\t{\n\t\tm_aMousePath.RemoveAll();\n\n\t\tif (pWnd)\n\t\t{\n\t\t\tm_pMainMouseWnd = pWnd;\n\n\t\t\tCPWL_Wnd * pParent = pWnd;\n\t\t\twhile (pParent)\n\t\t\t{\n\t\t\t\tm_aMousePath.Add(pParent);\n\t\t\t\tpParent = pParent->GetParentWindow();\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid ReleaseCapture()\n\t{\n\t\tm_pMainMouseWnd = NULL;\n\t\tm_aMousePath.RemoveAll();\n\t}\n\nprivate:\n\tCFX_ArrayTemplate<CPWL_Wnd*>\tm_aMousePath;\n\tCFX_ArrayTemplate<CPWL_Wnd*>\tm_aKeyboardPath;\n\tCPWL_Wnd*\t\t\t\t\t\tm_pCreatedWnd;\n\tCPWL_Wnd*\t\t\t\t\t\tm_pMainMouseWnd;\n\tCPWL_Wnd*\t\t\t\t\t\tm_pMainKeyboardWnd;\n};\n\n/* --------------------------- CPWL_Wnd ---------------------------- */\n\nCPWL_Wnd::CPWL_Wnd() :\n\tm_pVScrollBar(NULL),\n\tm_rcWindow(),\n\tm_rcClip(),\n\tm_bCreated(FALSE),\t\t\t\n\tm_bVisible(FALSE),\n\tm_bNotifying(FALSE),\n\tm_bEnabled(TRUE)\n{\n}\n\nCPWL_Wnd::~CPWL_Wnd()\n{\n\tASSERT(m_bCreated == FALSE);\n}\n\nCFX_ByteString CPWL_Wnd::GetClassName() const\n{\n\treturn \"CPWL_Wnd\";\n}\n\nvoid CPWL_Wnd::Create(const PWL_CREATEPARAM & cp)\n{\n\tif (!IsValid())\n\t{\n\t\tm_sPrivateParam = cp;\n\n\t\tOnCreate(m_sPrivateParam);\n\n\t\tm_sPrivateParam.rcRectWnd.Normalize();\n\t\tm_rcWindow = m_sPrivateParam.rcRectWnd;\n\t\tm_rcClip = CPWL_Utils::InflateRect(m_rcWindow,1.0f);\n\n\t\tCreateMsgControl();\n\n\t\tif (m_sPrivateParam.pParentWnd)\n\t\t\tm_sPrivateParam.pParentWnd->OnNotify(this, PNM_ADDCHILD);\n\n\t\tPWL_CREATEPARAM ccp = m_sPrivateParam;\n\n\t\tccp.dwFlags &= 0xFFFF0000L; //remove sub styles\n\t\tccp.mtChild = CPDF_Matrix(1,0,0,1,0,0);\n\t\t\n\t\tCreateScrollBar(ccp);\n\t\tCreateChildWnd(ccp); \n\n\t\tm_bVisible = HasFlag(PWS_VISIBLE);\n\n\t\tOnCreated();\n\n\t\tRePosChildWnd();\n\t\tm_bCreated = TRUE;\n\t}\n}\n\nvoid CPWL_Wnd::OnCreate(PWL_CREATEPARAM & cp)\n{\n}\n\nvoid CPWL_Wnd::OnCreated()\n{\n}\n\nvoid CPWL_Wnd::OnDestroy()\n{\n}\n\nvoid CPWL_Wnd::Destroy()\n{\n\tKillFocus();\n\n\tOnDestroy();\n\n\tif (m_bCreated)\n\t{\n\t\tfor (FX_INT32 i = m_aChildren.GetSize()-1; i >= 0; i --)\n\t\t{\n\t\t\tif (CPWL_Wnd * pChild = m_aChildren[i])\n\t\t\t{\n\t\t\t\tpChild->Destroy();\n\t\t\t\tdelete pChild;\n\t\t\t\tpChild = NULL;\n\t\t\t}\n\t\t}\n\n\t\tif (m_sPrivateParam.pParentWnd)\n\t\t\tm_sPrivateParam.pParentWnd->OnNotify(this, PNM_REMOVECHILD);\n\t\tm_bCreated = FALSE;\n\t}\n\n\tDestroyMsgControl();\n\n\tFXSYS_memset(&m_sPrivateParam, 0, sizeof(PWL_CREATEPARAM));\n\tm_aChildren.RemoveAll();\t\n\tm_pVScrollBar = NULL;\n}\n\nvoid CPWL_Wnd::Move(const CPDF_Rect & rcNew, FX_BOOL bReset,FX_BOOL bRefresh)\n{\n\tif (IsValid())\n\t{\n\t\tCPDF_Rect rcOld = this->GetWindowRect();\n\n\t\tm_rcWindow = rcNew;\n\t\tm_rcWindow.Normalize();\n\t\t//m_rcClip = CPWL_Utils::InflateRect(m_rcWindow,1.0f); //for special caret \n\n\t\tif (rcOld.left != rcNew.left || rcOld.right != rcNew.right ||\n\t\t\trcOld.top != rcNew.top || rcOld.bottom != rcNew.bottom)\n\t\t{\n\t\t\tif (bReset)\n\t\t\t{\n\t\t\t\tRePosChildWnd();\t\n\t\t\t}\t\n\n\t\t}\n\t\tif (bRefresh)\n\t\t{\t\n\t\t\tInvalidateRectMove(rcOld,rcNew);\n\t\t}\n\n\t\tm_sPrivateParam.rcRectWnd = m_rcWindow;\n\t}\n}\n\nvoid  CPWL_Wnd::InvalidateRectMove(const CPDF_Rect & rcOld, const CPDF_Rect & rcNew)\n{\n\tCPDF_Rect rcUnion = rcOld;\n\trcUnion.Union(rcNew);\n\n\tInvalidateRect(&rcUnion);\n\n\t/*\n\tCPDF_Rect SubArray[4]; \n\n\trcOld.Substract4(rcNew,SubArray);\n\tfor (FX_INT32 i=0;i<4;i++)\n\t{\n\t\tif (SubArray[i].left == 0 &&\n\t\t\tSubArray[i].right == 0 &&\n\t\t\tSubArray[i].top == 0 &&\n\t\t\tSubArray[i].bottom == 0)continue;\n\n\t\tInvalidateRect(&CPWL_Utils::InflateRect(SubArray[i],2));\n\t}\n\n\trcNew.Substract4(rcOld,SubArray);\n\tfor (FX_INT32 j=0;j<4;j++)\n\t{\n\t\tif (SubArray[j].left == 0 &&\n\t\t\tSubArray[j].right == 0 &&\n\t\t\tSubArray[j].top == 0 &&\n\t\t\tSubArray[j].bottom == 0)continue;\n\n\t\tInvalidateRect(&CPWL_Utils::InflateRect(SubArray[j],2));\n\t}\n\t*/\n}\n\nvoid CPWL_Wnd::GetAppearanceStream(CFX_ByteString & sAppStream)\n{\n\tif (IsValid())\n\t{\n\t\tCFX_ByteTextBuf sTextBuf;\n\t\tGetAppearanceStream(sTextBuf);\n\t\tsAppStream += sTextBuf.GetByteString();\n\t}\n}\n\nvoid CPWL_Wnd::GetAppearanceStream(CFX_ByteTextBuf & sAppStream)\n{\n\tif (IsValid() && IsVisible())\n\t{\n\t\tGetThisAppearanceStream(sAppStream);\n\t\tGetChildAppearanceStream(sAppStream);\n\t}\n}\n\n//if don't set,Get default apperance stream\nvoid CPWL_Wnd::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)\n{\n\tCPDF_Rect rectWnd = GetWindowRect();\n\tif (!rectWnd.IsEmpty())\n\t{\n\t\tCFX_ByteTextBuf sThis;\n\n\t\tif (HasFlag(PWS_BACKGROUND))\n\t\t\tsThis << CPWL_Utils::GetRectFillAppStream(rectWnd,this->GetBackgroundColor());\n\n\t\tif (HasFlag(PWS_BORDER))\n\t\t\tsThis << CPWL_Utils::GetBorderAppStream(rectWnd,\n\t\t\t\t\t\t\t\t\t(FX_FLOAT)GetBorderWidth(),\n\t\t\t\t\t\t\t\t\tGetBorderColor(),\n\t\t\t\t\t\t\t\t\tthis->GetBorderLeftTopColor(this->GetBorderStyle()),\n\t\t\t\t\t\t\t\t\tthis->GetBorderRightBottomColor(this->GetBorderStyle()),\n\t\t\t\t\t\t\t\t\tthis->GetBorderStyle(),\n\t\t\t\t\t\t\t\t\tthis->GetBorderDash());\n\n\t\tsAppStream << sThis;\n\t}\n}\n\nvoid CPWL_Wnd::GetChildAppearanceStream(CFX_ByteTextBuf & sAppStream)\n{\n\tfor (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\n\t{\n\t\tif (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\n\t\t{\n\t\t\tpChild->GetAppearanceStream(sAppStream);\n\t\t}\n\t}\n}\n\nvoid CPWL_Wnd::DrawAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)\n{\n\tif (IsValid() && IsVisible())\n\t{\n\t\tDrawThisAppearance(pDevice,pUser2Device);\n\t\tDrawChildAppearance(pDevice,pUser2Device);\n\t}\n}\n\nvoid CPWL_Wnd::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)\n{\n\tCPDF_Rect rectWnd = GetWindowRect();\n\tif (!rectWnd.IsEmpty())\n\t{\t\t\n\t\tif (HasFlag(PWS_BACKGROUND))\n\t\t{\n\t\t\tCPDF_Rect rcClient = CPWL_Utils::DeflateRect(rectWnd,(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));\n\t\t\tCPWL_Utils::DrawFillRect(pDevice,pUser2Device,rcClient,this->GetBackgroundColor(),GetTransparency());\n\t\t}\n\n\t\tif (HasFlag(PWS_BORDER))\n\t\t\tCPWL_Utils::DrawBorder(pDevice,\n\t\t\t\t\t\t\t\tpUser2Device,\n\t\t\t\t\t\t\t\trectWnd,\n\t\t\t\t\t\t\t\t(FX_FLOAT)GetBorderWidth(),\n\t\t\t\t\t\t\t\tGetBorderColor(),\n\t\t\t\t\t\t\t\tthis->GetBorderLeftTopColor(this->GetBorderStyle()),\n\t\t\t\t\t\t\t\tthis->GetBorderRightBottomColor(this->GetBorderStyle()),\n\t\t\t\t\t\t\t\tthis->GetBorderStyle(),\n\t\t\t\t\t\t\t\tthis->GetBorderDash(),\n\t\t\t\t\t\t\t\tGetTransparency());\t\t\t\t\t\t\t\t\n\t}\n}\n\nvoid CPWL_Wnd::DrawChildAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)\n{\n\tfor (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\n\t{\n\t\tif (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\n\t\t{\n\t\t\tCPDF_Matrix mt = pChild->GetChildMatrix();\n\t\t\tif (mt.IsIdentity())\n\t\t\t{\n\t\t\t\tpChild->DrawAppearance(pDevice,pUser2Device);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tmt.Concat(*pUser2Device);\n\t\t\t\tpChild->DrawAppearance(pDevice,&mt);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid CPWL_Wnd::InvalidateRect(CPDF_Rect* pRect)\n{\n\tif (IsValid())\n\t{\n\t\tCPDF_Rect rcRefresh = pRect ? *pRect : GetWindowRect();\n\n\t\tif (!HasFlag(PWS_NOREFRESHCLIP))\n\t\t{\n\t\t\tCPDF_Rect rcClip = GetClipRect();\t\t\n\t\t\tif (!rcClip.IsEmpty())\n\t\t\t{\n\t\t\t\trcRefresh.Intersect(rcClip);\n\t\t\t}\n\t\t}\n\n\t\tFX_RECT rcWin = PWLtoWnd(rcRefresh);\n\t\trcWin.left -= PWL_INVALIDATE_INFLATE;\n\t\trcWin.top -= PWL_INVALIDATE_INFLATE;\n\t\trcWin.right += PWL_INVALIDATE_INFLATE;\n\t\trcWin.bottom += PWL_INVALIDATE_INFLATE;\n\n\t\tif (IFX_SystemHandler* pSH = GetSystemHandler())\n\t\t{\n\t\t\tif (FX_HWND hWnd = GetAttachedHWnd())\n\t\t\t{\n\t\t\t\tpSH->InvalidateRect(hWnd, rcWin);\n\t\t\t}\n\t\t}\n\t}\n}\n\n#define PWL_IMPLEMENT_KEY_METHOD(key_method_name)\\\nFX_BOOL CPWL_Wnd::key_method_name(FX_WORD nChar, FX_DWORD nFlag)\\\n{\\\n\tif (IsValid() && IsVisible() && IsEnabled())\\\n\t{\\\n\t\tif (IsWndCaptureKeyboard(this))\\\n\t\t{\\\n\t\t\tfor (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\\\n\t\t\t{\\\n\t\t\t\tif (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\\\n\t\t\t\t{\\\n\t\t\t\t\tif (IsWndCaptureKeyboard(pChild))\\\n\t\t\t\t\t{\\\n\t\t\t\t\t\treturn pChild->key_method_name(nChar,nFlag);\\\n\t\t\t\t\t}\\\n\t\t\t\t}\\\n\t\t\t}\\\n\t\t}\\\n\t}\\\n\treturn FALSE;\\\n}\n\n#define PWL_IMPLEMENT_MOUSE_METHOD(mouse_method_name)\\\nFX_BOOL CPWL_Wnd::mouse_method_name(const CPDF_Point & point, FX_DWORD nFlag)\\\n{\\\n\tif (IsValid() && IsVisible() && IsEnabled())\\\n\t{\\\n\t\tif (IsWndCaptureMouse(this))\\\n\t\t{\\\n\t\t\tfor (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\\\n\t\t\t{\\\n\t\t\t\tif (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\\\n\t\t\t\t{\\\n\t\t\t\t\tif (IsWndCaptureMouse(pChild))\\\n\t\t\t\t\t{\\\n\t\t\t\t\t\treturn pChild->mouse_method_name(pChild->ParentToChild(point),nFlag);\\\n\t\t\t\t\t}\\\n\t\t\t\t}\\\n\t\t\t}\\\n\t\t\tSetCursor();\\\n\t\t}\\\n\t\telse\\\n\t\t{\\\n\t\t\tfor (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\\\n\t\t\t{\\\n\t\t\t\tif (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\\\n\t\t\t\t{\\\n\t\t\t\t\tif (pChild->WndHitTest(pChild->ParentToChild(point)))\\\n\t\t\t\t\t{\\\n\t\t\t\t\t\treturn pChild->mouse_method_name(pChild->ParentToChild(point),nFlag);\\\n\t\t\t\t\t}\\\n\t\t\t\t}\\\n\t\t\t}\\\n\t\t\tif (this->WndHitTest(point))\\\n\t\t\t\tSetCursor();\\\n\t\t}\\\n\t}\\\n\treturn FALSE;\\\n}\n\nPWL_IMPLEMENT_KEY_METHOD(OnKeyDown)\nPWL_IMPLEMENT_KEY_METHOD(OnKeyUp)\nPWL_IMPLEMENT_KEY_METHOD(OnChar)\n\nPWL_IMPLEMENT_MOUSE_METHOD(OnLButtonDblClk)\nPWL_IMPLEMENT_MOUSE_METHOD(OnLButtonDown)\nPWL_IMPLEMENT_MOUSE_METHOD(OnLButtonUp)\nPWL_IMPLEMENT_MOUSE_METHOD(OnMButtonDblClk)\nPWL_IMPLEMENT_MOUSE_METHOD(OnMButtonDown)\nPWL_IMPLEMENT_MOUSE_METHOD(OnMButtonUp)\nPWL_IMPLEMENT_MOUSE_METHOD(OnRButtonDblClk)\nPWL_IMPLEMENT_MOUSE_METHOD(OnRButtonDown)\nPWL_IMPLEMENT_MOUSE_METHOD(OnRButtonUp)\nPWL_IMPLEMENT_MOUSE_METHOD(OnMouseMove)\n\nFX_BOOL\tCPWL_Wnd::OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag)\n{\n\tif (IsValid() && IsVisible() && IsEnabled())\n\t{\n\t\tSetCursor();\n\t\tif (IsWndCaptureKeyboard(this))\n\t\t{\n\t\t\tfor (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\n\t\t\t{\n\t\t\t\tif (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\n\t\t\t\t{\n\t\t\t\t\tif (IsWndCaptureKeyboard(pChild))\n\t\t\t\t\t{\n\t\t\t\t\t\treturn pChild->OnMouseWheel(zDelta,pChild->ParentToChild(point), nFlag);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn FALSE;\n}\n\nvoid CPWL_Wnd::AddChild(CPWL_Wnd * pWnd)\n{\n\tm_aChildren.Add(pWnd);\n}\n\nvoid CPWL_Wnd::RemoveChild(CPWL_Wnd * pWnd)\n{\n\tfor (FX_INT32 i = m_aChildren.GetSize()-1; i >= 0; i --)\n\t{\n\t\tif (CPWL_Wnd* pChild = m_aChildren.GetAt(i))\n\t\t{\n\t\t\tif (pChild == pWnd)\n\t\t\t{\n\t\t\t\tm_aChildren.RemoveAt(i);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid CPWL_Wnd::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)\n{\n\tswitch (msg)\n\t{\n\tcase PNM_ADDCHILD:\n\t\tthis->AddChild(pWnd);\n\t\tbreak;\n\tcase PNM_REMOVECHILD:\n\t\tthis->RemoveChild(pWnd);\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n}\n\nFX_BOOL CPWL_Wnd::IsValid() const\n{\n\treturn m_bCreated;\n}\n\nPWL_CREATEPARAM CPWL_Wnd::GetCreationParam() const\n{\n\treturn m_sPrivateParam;\n}\n\nCPWL_Wnd* CPWL_Wnd::GetParentWindow() const\n{\n\treturn m_sPrivateParam.pParentWnd;\n}\n\nCPDF_Rect CPWL_Wnd::GetOriginWindowRect() const\n{\n\treturn m_sPrivateParam.rcRectWnd;\n}\n\nCPDF_Rect CPWL_Wnd::GetWindowRect() const\n{\n\treturn m_rcWindow;\n}\n\nCPDF_Rect CPWL_Wnd::GetClientRect() const\n{\n\tCPDF_Rect rcWindow = GetWindowRect();\n\tCPDF_Rect rcClient = CPWL_Utils::DeflateRect(rcWindow,(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));\n\n\tif (CPWL_ScrollBar * pVSB = this->GetVScrollBar())\n\t\trcClient.right -= pVSB->GetScrollBarWidth();\n\n\trcClient.Normalize();\n\n\tif (rcWindow.Contains(rcClient))\n\t\treturn rcClient;\n\telse\n\t\treturn CPDF_Rect();\n}\n\nCPDF_Point CPWL_Wnd::GetCenterPoint() const\n{\n\tCPDF_Rect rcClient = GetClientRect();\n\n\treturn CPDF_Point((rcClient.left + rcClient.right) * 0.5f,\n\t\t(rcClient.top + rcClient.bottom) * 0.5f);\n}\n\nCPDF_Rect CPWL_Wnd::GetClientCenterSquare() const\n{\n\treturn CPWL_Utils::GetCenterSquare(GetClientRect());\n}\n\nCPDF_Rect CPWL_Wnd::GetWindowCenterSquare() const\n{\n\treturn CPWL_Utils::GetCenterSquare(CPWL_Utils::DeflateRect(GetWindowRect(),0.1f));\n}\n\nFX_BOOL CPWL_Wnd::HasFlag(FX_DWORD dwFlags) const\n{\n\treturn (m_sPrivateParam.dwFlags & dwFlags) != 0;\n}\n\nvoid CPWL_Wnd::RemoveFlag(FX_DWORD dwFlags)\n{\n\tm_sPrivateParam.dwFlags &= ~dwFlags;\n}\n\nvoid CPWL_Wnd::AddFlag(FX_DWORD dwFlags)\n{\n\tm_sPrivateParam.dwFlags |= dwFlags;\n}\n\nCPWL_Color CPWL_Wnd::GetBackgroundColor() const\n{\n\treturn m_sPrivateParam.sBackgroundColor;\n}\n\nvoid CPWL_Wnd::SetBackgroundColor(const CPWL_Color & color)\n{\n\tm_sPrivateParam.sBackgroundColor = color;\n}\n\nvoid CPWL_Wnd::SetTextColor(const CPWL_Color & color)\n{\n\tm_sPrivateParam.sTextColor = color;\n}\n\nvoid CPWL_Wnd::SetTextStrokeColor(const CPWL_Color & color)\n{\n\tm_sPrivateParam.sTextStrokeColor = color;\n}\n\nCPWL_Color CPWL_Wnd::GetTextColor() const\n{\n\treturn m_sPrivateParam.sTextColor;\n}\n\nCPWL_Color CPWL_Wnd::GetTextStrokeColor() const\n{\n\treturn m_sPrivateParam.sTextStrokeColor;\n}\n\nFX_INT32 CPWL_Wnd::GetBorderStyle() const\n{\n\treturn m_sPrivateParam.nBorderStyle;\n}\n\nvoid CPWL_Wnd::SetBorderStyle(FX_INT32 nBorderStyle)\n{\n\tif (HasFlag(PWS_BORDER))\n\t\tm_sPrivateParam.nBorderStyle = nBorderStyle;\n}\n\nFX_INT32 CPWL_Wnd::GetBorderWidth() const\n{\n\tif (HasFlag(PWS_BORDER))\n\t\treturn m_sPrivateParam.dwBorderWidth;\n\n\treturn 0;\n}\n\nFX_INT32 CPWL_Wnd::GetInnerBorderWidth() const\n{\n\t/*\n\tswitch (GetBorderStyle())\n\t{\n\tcase PBS_BEVELED:\n\tcase PBS_INSET:\n\t\treturn GetBorderWidth() / 2;\n\t}\n\t*/\n\treturn 0;\n}\n\nvoid CPWL_Wnd::SetBorderWidth(FX_INT32 nBorderWidth)\n{\n\tif (HasFlag(PWS_BORDER))\n\t\tm_sPrivateParam.dwBorderWidth = nBorderWidth;\n}\n\nCPWL_Color CPWL_Wnd::GetBorderColor() const\n{\n\tif (HasFlag(PWS_BORDER))\n\t\treturn m_sPrivateParam.sBorderColor;\n\n\treturn CPWL_Color();\n}\n\nvoid CPWL_Wnd::SetBorderColor(const CPWL_Color & color)\n{\n\tif (HasFlag(PWS_BORDER))\n\t\tm_sPrivateParam.sBorderColor = color;\n}\n\nCPWL_Dash CPWL_Wnd::GetBorderDash() const\n{\n\treturn m_sPrivateParam.sDash;\n}\n\nvoid* CPWL_Wnd::GetAttachedData() const\n{\n\treturn m_sPrivateParam.pAttachedData;\n}\n\nvoid CPWL_Wnd::SetBorderDash(const CPWL_Dash & sDash)\n{\n\tif (HasFlag(PWS_BORDER))\n\t\tm_sPrivateParam.sDash = sDash;\n}\n\nCPWL_ScrollBar* CPWL_Wnd::GetVScrollBar() const\n{\n\tif (HasFlag(PWS_VSCROLL))\n\t\treturn m_pVScrollBar;\n\n\treturn NULL;\n}\n\nvoid CPWL_Wnd::CreateScrollBar(const PWL_CREATEPARAM & cp)\n{\n\tCreateVScrollBar(cp);\n}\n\nvoid CPWL_Wnd::CreateVScrollBar(const PWL_CREATEPARAM & cp)\n{\n\tif (!m_pVScrollBar && HasFlag(PWS_VSCROLL))\n\t{\n\t\tPWL_CREATEPARAM scp = cp;\n\n\t\t//flags\n\t\tscp.dwFlags = PWS_CHILD| PWS_BACKGROUND | PWS_AUTOTRANSPARENT | PWS_NOREFRESHCLIP;\n\t\t\n\t\tscp.pParentWnd = this;\n\t\tscp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR;\n\t\tscp.eCursorType = FXCT_ARROW;\n\t\tscp.nTransparency = PWL_SCROLLBAR_TRANSPARANCY;\n\n\t\tif ((m_pVScrollBar = new CPWL_ScrollBar(SBT_VSCROLL)))\n\t\t\tm_pVScrollBar->Create(scp);\n\t}\n}\n\nvoid CPWL_Wnd::SetCapture()\n{\n\tif (CPWL_MsgControl * pMsgCtrl = GetMsgControl())\n\t\tpMsgCtrl->SetCapture(this);\n}\n\nvoid CPWL_Wnd::ReleaseCapture()\n{\n\tfor (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\n\t\tif (CPWL_Wnd* pChild = m_aChildren.GetAt(i))\n\t\t\tpChild->ReleaseCapture();\n\n\tif (CPWL_MsgControl * pMsgCtrl = GetMsgControl())\n\t\tpMsgCtrl->ReleaseCapture();\n}\n\nvoid CPWL_Wnd::SetFocus()\n{\n\tif (CPWL_MsgControl * pMsgCtrl = GetMsgControl())\n\t{\n\t\tif (!pMsgCtrl->IsMainCaptureKeyboard(this))\n\t\t\tpMsgCtrl->KillFocus();\n\t\tpMsgCtrl->SetFocus(this);\n\t}\n}\n\nvoid CPWL_Wnd::KillFocus()\n{\n\tif (CPWL_MsgControl * pMsgCtrl = GetMsgControl())\n\t{\n\t\tif (pMsgCtrl->IsWndCaptureKeyboard(this))\n\t\t\tpMsgCtrl->KillFocus();\n\t}\n}\n\nvoid CPWL_Wnd::OnSetFocus()\n{\n}\n\nvoid CPWL_Wnd::OnKillFocus()\n{\n}\n\nFX_BOOL\tCPWL_Wnd::WndHitTest(const CPDF_Point & point) const\n{\n\treturn IsValid() && IsVisible() && GetWindowRect().Contains(point.x,point.y);\n}\n\nFX_BOOL CPWL_Wnd::ClientHitTest(const CPDF_Point & point) const\n{\n\treturn IsValid() && IsVisible() && GetClientRect().Contains(point.x,point.y);\n}\n\nconst CPWL_Wnd * CPWL_Wnd::GetRootWnd() const\n{\n\tif (m_sPrivateParam.pParentWnd)\n\t\treturn m_sPrivateParam.pParentWnd->GetRootWnd();\n\telse\n\t\treturn this;\n}\n\nvoid CPWL_Wnd::SetVisible(FX_BOOL bVisible)\n{\n\tif (IsValid())\n\t{\n\t\tfor (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\n\t\t{\n\t\t\tif (CPWL_Wnd* pChild = m_aChildren.GetAt(i))\n\t\t\t{\n\t\t\t\tpChild->SetVisible(bVisible);\n\t\t\t}\n\t\t}\n\n\t\tif (bVisible != m_bVisible)\n\t\t{\n\t\t\tm_bVisible = bVisible;\n\t\t\tRePosChildWnd();\t\t\n\t\t\tInvalidateRect();\n\t\t}\t\n\t}\n}\n\nvoid CPWL_Wnd::SetClipRect(const CPDF_Rect & rect)\n{\n\tm_rcClip = rect;\n\tm_rcClip.Normalize();\n}\n\nCPDF_Rect CPWL_Wnd::GetClipRect() const\n{\n\treturn m_rcClip;\n}\n\nFX_BOOL\tCPWL_Wnd::IsReadOnly() const\n{\n\treturn HasFlag(PWS_READONLY);\n}\n\nvoid CPWL_Wnd::RePosChildWnd()\n{\n\tCPDF_Rect rcContent = CPWL_Utils::DeflateRect(GetWindowRect(),(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));\n\n\tCPWL_ScrollBar * pVSB = this->GetVScrollBar();\n\n\tCPDF_Rect rcVScroll = CPDF_Rect(rcContent.right - PWL_SCROLLBAR_WIDTH,\n\t\t\t\t\t\t\trcContent.bottom,\n\t\t\t\t\t\t\trcContent.right-1.0f,\n\t\t\t\t\t\t\trcContent.top);\n\n\tif (pVSB) pVSB->Move(rcVScroll,TRUE,FALSE);\n}\n\nvoid CPWL_Wnd::CreateChildWnd(const PWL_CREATEPARAM & cp)\n{\n}\n\nvoid CPWL_Wnd::SetCursor()\n{\n\tif (IsValid()) \n\t{\n\t\tif (IFX_SystemHandler* pSH = GetSystemHandler())\n\t\t{\n\t\t\tFX_INT32 nCursorType = this->GetCreationParam().eCursorType;\n\t\t\tpSH->SetCursor(nCursorType);\n\t\t}\n\t}\n}\n\nvoid CPWL_Wnd::CreateMsgControl()\n{\n\tif (!m_sPrivateParam.pMsgControl)\n\t\tm_sPrivateParam.pMsgControl = new CPWL_MsgControl(this);\n}\n\nvoid CPWL_Wnd::DestroyMsgControl()\n{\n\tif (CPWL_MsgControl* pMsgControl = GetMsgControl())\n\t\tif (pMsgControl->IsWndCreated(this))\n\t\t\tdelete pMsgControl;\n}\n\nCPWL_MsgControl* CPWL_Wnd::GetMsgControl() const\n{\n\treturn m_sPrivateParam.pMsgControl;\n}\n\nFX_BOOL CPWL_Wnd::IsCaptureMouse() const\n{\n\treturn IsWndCaptureMouse(this);\n}\n\nFX_BOOL CPWL_Wnd::IsWndCaptureMouse(const CPWL_Wnd * pWnd) const\n{\n\tif (CPWL_MsgControl * pCtrl = GetMsgControl())\n\t\treturn pCtrl->IsWndCaptureMouse(pWnd);\n\n\treturn FALSE;\n}\n\nFX_BOOL CPWL_Wnd::IsWndCaptureKeyboard(const CPWL_Wnd * pWnd) const\n{\n\tif (CPWL_MsgControl * pCtrl = GetMsgControl())\n\t\treturn pCtrl->IsWndCaptureKeyboard(pWnd);\n\n\treturn FALSE;\n}\n\nFX_BOOL CPWL_Wnd::IsFocused() const\n{\n\tif (CPWL_MsgControl * pCtrl = GetMsgControl())\n\t\treturn pCtrl->IsMainCaptureKeyboard(this);\n\n\treturn FALSE;\n}\n\nCPDF_Rect CPWL_Wnd::GetFocusRect() const\n{\n\treturn CPWL_Utils::InflateRect(this->GetWindowRect(),1);\n}\n\nFX_FLOAT CPWL_Wnd::GetFontSize() const\n{\n\treturn this->m_sPrivateParam.fFontSize;\n}\n\nvoid CPWL_Wnd::SetFontSize(FX_FLOAT fFontSize)\n{\n\tthis->m_sPrivateParam.fFontSize = fFontSize;\n}\n\nIFX_SystemHandler* CPWL_Wnd::GetSystemHandler() const\n{\n\treturn m_sPrivateParam.pSystemHandler;\n}\n\nIPWL_FocusHandler* CPWL_Wnd::GetFocusHandler() const\n{\n\treturn m_sPrivateParam.pFocusHandler;\n}\n\nIPWL_Provider* CPWL_Wnd::GetProvider() const\n{\n\treturn m_sPrivateParam.pProvider;\n}\n\nIFX_Edit_FontMap* CPWL_Wnd::GetFontMap() const\n{\n\treturn m_sPrivateParam.pFontMap;\n}\n\nCPWL_Color CPWL_Wnd::GetBorderLeftTopColor(FX_INT32 nBorderStyle) const\n{\n\tCPWL_Color color;\n\n\tswitch (nBorderStyle)\n\t{\n\t\tcase PBS_SOLID:\n\t\t\tbreak;\n\t\tcase PBS_DASH:\n\t\t\tbreak;\n\t\tcase PBS_BEVELED:\n\t\t\tcolor = CPWL_Color(COLORTYPE_GRAY,1);\n\t\t\tbreak;\n\t\tcase PBS_INSET:\n\t\t\tcolor = CPWL_Color(COLORTYPE_GRAY,0.5f);\n\t\t\tbreak;\n\t\tcase PBS_UNDERLINED:\n\t\t\tbreak;\n\t}\n\n\treturn color;\n}\n\nCPWL_Color CPWL_Wnd::GetBorderRightBottomColor(FX_INT32 nBorderStyle) const\n{\n\tCPWL_Color color;\n\n\tswitch (nBorderStyle)\n\t{\n\t\tcase PBS_SOLID:\n\t\t\tbreak;\n\t\tcase PBS_DASH:\n\t\t\tbreak;\n\t\tcase PBS_BEVELED:\n\t\t\tcolor = CPWL_Utils::DevideColor(GetBackgroundColor(),2);\n\t\t\tbreak;\n\t\tcase PBS_INSET:\n\t\t\tcolor = CPWL_Color(COLORTYPE_GRAY,0.75f);\n\t\t\tbreak;\n\t\tcase PBS_UNDERLINED:\n\t\t\tbreak;\n\t}\n\n\treturn color;\n}\n\n/* ----------------------------------------------------------------- */\n\nFX_INT32 CPWL_Wnd::GetTransparency()\n{\n\treturn m_sPrivateParam.nTransparency;\n}\n\nvoid CPWL_Wnd::SetTransparency(FX_INT32 nTransparency)\n{\n\tfor (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\n\t{\n\t\tif (CPWL_Wnd* pChild = m_aChildren.GetAt(i))\n\t\t{\n\t\t\tpChild->SetTransparency(nTransparency);\n\t\t}\n\t}\n\n\tm_sPrivateParam.nTransparency = nTransparency;\n}\n\nCPDF_Matrix\tCPWL_Wnd::GetWindowMatrix() const\n{\n\tCPDF_Matrix mt = this->GetChildToRoot();\n\n\tif (IPWL_Provider* pProvider = GetProvider())\n\t{\n\t\tmt.Concat(pProvider->GetWindowMatrix(GetAttachedData()));\n\t\treturn mt;\n\t}\n\n/*\n\tif (CReader_App* pApp = CPWL_Module::GetReaderApp())\n\t\tif (CReader_Document* pDocument = pApp->GetCurrentDocument())\n\t\t\tif (CReader_DocView* pDocView = pDocument->GetCurrentDocView())\n\t\t\t{\n\t\t\t\tCPDF_Matrix mtPageView;\n\t\t\t\tpDocView->GetCurrentMatrix(mtPageView);\n\t\t\t\tmt.Concat(mtPageView);\n\t\t\t\treturn mt;\n\t\t\t}\t\t\n\t\t\t\n*/\n\n\treturn mt;\n}\n\nvoid CPWL_Wnd::PWLtoWnd(const CPDF_Point& point, FX_INT32& x, FX_INT32& y) const\n{\n\tCPDF_Matrix mt = GetWindowMatrix();\n\tCPDF_Point pt = point;\n\tmt.Transform(pt.x,pt.y);\n\tx = (FX_INT32)(pt.x+0.5);\n\ty = (FX_INT32)(pt.y+0.5);\n}\n\nFX_RECT CPWL_Wnd::PWLtoWnd(const CPDF_Rect & rect) const\n{\n\tCPDF_Rect rcTemp = rect;\n\tCPDF_Matrix mt = GetWindowMatrix();\n\tmt.TransformRect(rcTemp);\t\n\treturn FX_RECT((FX_INT32)(rcTemp.left+0.5), (FX_INT32)(rcTemp.bottom+0.5), (FX_INT32)(rcTemp.right+0.5), (FX_INT32)(rcTemp.top+0.5));\n}\n\nFX_HWND CPWL_Wnd::GetAttachedHWnd() const\n{\n\treturn m_sPrivateParam.hAttachedWnd;\n}\n\nCPDF_Point CPWL_Wnd::ChildToParent(const CPDF_Point& point) const\n{\n\tCPDF_Matrix mt = GetChildMatrix();\n\tif (mt.IsIdentity())\n\t\treturn point;\n\telse\n\t{\n\t\tCPDF_Point pt = point;\n\t\tmt.Transform(pt.x,pt.y);\n\t\treturn pt;\n\t}\n}\n\nCPDF_Rect CPWL_Wnd::ChildToParent(const CPDF_Rect& rect) const\n{\n\tCPDF_Matrix mt = GetChildMatrix();\n\tif (mt.IsIdentity())\n\t\treturn rect;\n\telse\n\t{\n\t\tCPDF_Rect rc = rect;\n\t\tmt.TransformRect(rc);\n\t\treturn rc;\n\t}\n}\n\nCPDF_Point CPWL_Wnd::ParentToChild(const CPDF_Point& point) const\n{\n\tCPDF_Matrix mt = GetChildMatrix();\n\tif (mt.IsIdentity())\n\t\treturn point;\n\telse\n\t{\n\t\tmt.SetReverse(mt);\n\t\tCPDF_Point pt = point;\n\t\tmt.Transform(pt.x,pt.y);\n\t\treturn pt;\n\t}\n}\n\nCPDF_Rect CPWL_Wnd::ParentToChild(const CPDF_Rect& rect) const\n{\n\tCPDF_Matrix mt = GetChildMatrix();\n\tif (mt.IsIdentity())\n\t\treturn rect;\n\telse\n\t{\n\t\tmt.SetReverse(mt);\n\t\tCPDF_Rect rc = rect;\n\t\tmt.TransformRect(rc);\n\t\treturn rc;\n\t}\n}\n\nCPDF_Matrix CPWL_Wnd::GetChildToRoot() const\n{\n\tCPDF_Matrix mt(1,0,0,1,0,0);\n\t\n\tif (HasFlag(PWS_CHILD))\n\t{\n\t\tconst CPWL_Wnd* pParent = this;\n\t\twhile (pParent)\n\t\t{\n\t\t\tmt.Concat(pParent->GetChildMatrix());\n\t\t\tpParent = pParent->GetParentWindow();\n\t\t}\n\t}\n\n\treturn mt;\n}\n\nCPDF_Matrix CPWL_Wnd::GetChildMatrix() const\n{\n\tif (HasFlag(PWS_CHILD))\n\t\treturn m_sPrivateParam.mtChild;\n\n\treturn CPDF_Matrix(1,0,0,1,0,0);\n}\n\nvoid CPWL_Wnd::SetChildMatrix(const CPDF_Matrix& mt)\n{\n\tm_sPrivateParam.mtChild = mt;\n}\n\nconst CPWL_Wnd*\tCPWL_Wnd::GetFocused() const\n{\n\tif (CPWL_MsgControl * pMsgCtrl = GetMsgControl())\n\t{\n\t\treturn pMsgCtrl->m_pMainKeyboardWnd;\n\t}\n\n\treturn NULL;\n}\n\nvoid CPWL_Wnd::EnableWindow(FX_BOOL bEnable)\n{\n\tif (m_bEnabled != bEnable)\n\t{\n\t\tfor (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\n\t\t{\n\t\t\tif (CPWL_Wnd* pChild = m_aChildren.GetAt(i))\n\t\t\t{\n\t\t\t\tpChild->EnableWindow(bEnable);\n\t\t\t}\n\t\t}\n\n\t\tthis->m_bEnabled = bEnable;\n\n\t\tif (bEnable)\n\t\t\tthis->OnEnabled();\n\t\telse\n\t\t\tthis->OnDisabled();\n\t}\n}\n\nFX_BOOL CPWL_Wnd::IsEnabled()\n{\n\treturn m_bEnabled;\n}\n\nvoid CPWL_Wnd::OnEnabled()\n{\n}\n\nvoid CPWL_Wnd::OnDisabled()\n{\n}\n\nFX_BOOL CPWL_Wnd::IsCTRLpressed(FX_DWORD nFlag) const\n{\n\tif (IFX_SystemHandler* pSystemHandler = GetSystemHandler())\n\t{\n\t\treturn pSystemHandler->IsCTRLKeyDown(nFlag);\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL\tCPWL_Wnd::IsSHIFTpressed(FX_DWORD nFlag) const\n{\n\tif (IFX_SystemHandler* pSystemHandler = GetSystemHandler())\n\t{\n\t\treturn pSystemHandler->IsSHIFTKeyDown(nFlag);\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL\tCPWL_Wnd::IsALTpressed(FX_DWORD nFlag) const\n{\n\tif (IFX_SystemHandler* pSystemHandler = GetSystemHandler())\n\t{\n\t\treturn pSystemHandler->IsALTKeyDown(nFlag);\n\t}\n\n\treturn FALSE;\n}\n\nFX_BOOL\tCPWL_Wnd::IsINSERTpressed(FX_DWORD nFlag) const\n{\n\tif (IFX_SystemHandler* pSystemHandler = GetSystemHandler())\n\t{\n\t\treturn pSystemHandler->IsINSERTKeyDown(nFlag);\n\t}\n\n\treturn FALSE;\n}\n\n"
  },
  {
    "path": "fpdfsdk/src/resource.h",
    "content": "// Copyright 2014 PDFium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n \n// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\n\n//{{NO_DEPENDENCIES}}\n// Microsoft Developer Studio generated include file.\n// Used by fpdfsdkdll.rc\n//\n\n// Next default values for new objects\n// \n#ifdef APSTUDIO_INVOKED\n#ifndef APSTUDIO_READONLY_SYMBOLS\n#define _APS_NEXT_RESOURCE_VALUE        104\n#define _APS_NEXT_COMMAND_VALUE         40001\n#define _APS_NEXT_CONTROL_VALUE         1000\n#define _APS_NEXT_SYMED_VALUE           101\n#endif\n#endif\n"
  },
  {
    "path": "pdfium.gyp",
    "content": "{\n  'variables': {\n    'pdf_use_skia%': 0,\n  },\n  'target_defaults': {\n    'defines' : [\n      'FOXIT_CHROME_BUILD',\n      '_FXFT_VERSION_=2501',\n      '_FPDFSDK_LIB',\n      '_NO_GDIPLUS_',  # workaround text rendering issues on Windows\n    ],\n    'conditions': [\n      ['pdf_use_skia==1', {\n        'defines': ['_SKIA_SUPPORT_'],\n      }],\n      # pdfium uses exceptions. Override the default exceptions-off setting\n      # from chromium.\n      # TODO: Instead, change pdfium to not use exceptions, and remove this.\n      ['OS==\"mac\"', {\n        'xcode_settings': { 'GCC_ENABLE_CPP_EXCEPTIONS': 'YES', },\n      }],\n      ['OS==\"win\"', {\n        'msvs_settings': { 'VCCLCompilerTool': { 'ExceptionHandling': '1', }, },\n        'defines!': [ '_HAS_EXCEPTIONS=0', ],\n      }],\n      ['OS==\"linux\"', {\n        'cflags!': [ '-fno-exceptions', ],\n        'conditions': [\n          ['target_arch==\"x64\"', {\n            'defines' : [ '_FX_CPU_=_FX_X64_', ],\n            'cflags': [ '-fPIC', ],\n          }],\n          ['target_arch==\"ia32\"', {\n            'defines' : [ '_FX_CPU_=_FX_X86_', ],\n          }],\n        ],\n      }],\n    ],\n    'msvs_disabled_warnings': [\n      4005, 4018, 4146, 4333, 4345, 4267\n    ],\n  },\n  'targets': [\n    {\n      'target_name': 'pdfium',\n      'type': 'static_library',\n      'dependencies': [\n        'safemath',\n        'fdrm',\n        'fpdfdoc',\n        'fpdfapi',\n        'fpdftext',\n        'formfiller',\n        'fxcodec',\n        'fxcrt',\n        'fxedit',\n        'fxge',\n#        'javascript',\n#        'jsapi',\n        'pdfwindow',\n      ],\n      'ldflags': [ '-L<(PRODUCT_DIR)',],\n      'sources': [\n        'fpdfsdk/include/fpdfdoc.h',\n        'fpdfsdk/include/fpdfedit.h',\n        'fpdfsdk/include/fpdfformfill.h',\n        'fpdfsdk/include/fpdfoom.h',\n        'fpdfsdk/include/fpdftext.h',\n        'fpdfsdk/include/fpdfview.h',\n        'fpdfsdk/include/fpdf_dataavail.h',\n        'fpdfsdk/include/fpdf_flatten.h',\n        'fpdfsdk/include/fpdf_progressive.h',\n        'fpdfsdk/include/fpdf_searchex.h',\n        'fpdfsdk/include/fpdf_sysfontinfo.h',\n        'fpdfsdk/include/fpdf_ext.h',\n        'fpdfsdk/include/fpdf_sysfontinfo.h',\n        'fpdfsdk/include/fsdk_actionhandler.h',\n        'fpdfsdk/include/fsdk_annothandler.h',\n        'fpdfsdk/include/fsdk_baseannot.h',\n        'fpdfsdk/include/fsdk_baseform.h',\n        'fpdfsdk/src/fpdfdoc.cpp',\n        'fpdfsdk/src/fpdfeditimg.cpp',\n        'fpdfsdk/src/fpdfeditpage.cpp',\n        'fpdfsdk/src/fpdfformfill.cpp',\n        'fpdfsdk/src/fpdfoom.cpp',\n        'fpdfsdk/src/fpdfppo.cpp',\n        'fpdfsdk/src/fpdfsave.cpp',\n        'fpdfsdk/src/fpdftext.cpp',\n        'fpdfsdk/src/fpdfview.cpp',\n        'fpdfsdk/src/fpdf_dataavail.cpp',\n        'fpdfsdk/src/fpdf_ext.cpp',\n        'fpdfsdk/src/fpdf_flatten.cpp',\n        'fpdfsdk/src/fpdf_progressive.cpp',\n        'fpdfsdk/src/fpdf_searchex.cpp',\n        'fpdfsdk/src/fpdf_sysfontinfo.cpp',\n        'fpdfsdk/src/fsdk_actionhandler.cpp',\n        'fpdfsdk/src/fsdk_annothandler.cpp',\n        'fpdfsdk/src/fsdk_baseannot.cpp',\n        'fpdfsdk/src/fsdk_baseform.cpp',\n        'fpdfsdk/src/fsdk_mgr.cpp',\n        'fpdfsdk/src/fsdk_rendercontext.cpp',\n        'fpdfsdk/src/fpdfsdkdll.rc',\n        'fpdfsdk/src/resource.h',\n        'fpdfsdk/include/fpdf_transformpage.h',\n        'fpdfsdk/src/fpdf_transformpage.cpp',\n      ],\n      'conditions': [\n        ['OS!=\"win\"', {\n          'sources!': [\n            'fpdfsdk/src/fpdfsdkdll.rc',\n          ],\n        }],\n      ],\n      'all_dependent_settings': {\n        'msvs_settings': {\n          'VCLinkerTool': {\n            'AdditionalDependencies': [\n              'advapi32.lib',\n              'gdi32.lib',\n              'user32.lib',\n            ],\n          },\n        },\n        'conditions': [\n          ['OS==\"mac\"', {\n            'link_settings': {\n              'libraries': [\n                '$(SDKROOT)/System/Library/Frameworks/AppKit.framework',\n                '$(SDKROOT)/System/Library/Frameworks/CoreFoundation.framework',\n              ],\n            },\n          }],\n        ],\n      },\n    },\n    {\n      'target_name': 'safemath',\n      'type': 'none',\n      'sources': [\n        'third_party/logging.h',\n        'third_party/macros.h',\n        'third_party/template_util.h',\n        'third_party/numerics/safe_conversions.h',\n        'third_party/numerics/safe_conversions_impl.h',\n        'third_party/numerics/safe_math.h',\n        'third_party/numerics/safe_math_impl.h',\n      ],\n    },\n    {\n      'target_name': 'fdrm',\n      'type': 'static_library',\n      'ldflags': [ '-L<(PRODUCT_DIR)',],\n      'sources': [\n        'core/include/fdrm/fx_crypt.h',\n        'core/src/fdrm/crypto/fx_crypt.cpp',\n        'core/src/fdrm/crypto/fx_crypt_aes.cpp',\n        'core/src/fdrm/crypto/fx_crypt_sha.cpp',\n      ],\n    },\n    {\n      'target_name': 'fpdfdoc',\n      'type': 'static_library',\n      'ldflags': [ '-L<(PRODUCT_DIR)',],\n      'sources': [\n        'core/include/fpdfdoc/fpdf_ap.h',\n        'core/include/fpdfdoc/fpdf_doc.h',\n        'core/include/fpdfdoc/fpdf_tagged.h',\n        'core/include/fpdfdoc/fpdf_vt.h',\n        'core/src/fpdfdoc/doc_action.cpp',\n        'core/src/fpdfdoc/doc_annot.cpp',\n        'core/src/fpdfdoc/doc_ap.cpp',\n        'core/src/fpdfdoc/doc_basic.cpp',\n        'core/src/fpdfdoc/doc_bookmark.cpp',\n        'core/src/fpdfdoc/doc_form.cpp',\n        'core/src/fpdfdoc/doc_formcontrol.cpp',\n        'core/src/fpdfdoc/doc_formfield.cpp',\n        'core/src/fpdfdoc/doc_link.cpp',\n        'core/src/fpdfdoc/doc_metadata.cpp',\n        'core/src/fpdfdoc/doc_ocg.cpp',\n        'core/src/fpdfdoc/doc_tagged.cpp',\n        'core/src/fpdfdoc/doc_utils.cpp',\n        'core/src/fpdfdoc/doc_viewerPreferences.cpp',\n        'core/src/fpdfdoc/doc_vt.cpp',\n        'core/src/fpdfdoc/doc_vtmodule.cpp',\n        'core/src/fpdfdoc/pdf_vt.h',\n        'core/src/fpdfdoc/tagged_int.h',\n      ],\n    },\n    {\n      'target_name': 'fpdfapi',\n      'type': 'static_library',\n      'ldflags': [ '-L<(PRODUCT_DIR)',],\n      'sources': [\n        'core/include/fpdfapi/fpdfapi.h',\n        'core/include/fpdfapi/fpdf_module.h',\n        'core/include/fpdfapi/fpdf_objects.h',\n        'core/include/fpdfapi/fpdf_page.h',\n        'core/include/fpdfapi/fpdf_pageobj.h',\n        'core/include/fpdfapi/fpdf_parser.h',\n        'core/include/fpdfapi/fpdf_render.h',\n        'core/include/fpdfapi/fpdf_resource.h',\n        'core/include/fpdfapi/fpdf_serial.h',\n        'core/src/fpdfapi/fpdf_basic_module.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/cmap_int.h',\n        'core/src/fpdfapi/fpdf_cmaps/CNS1/Adobe-CNS1-UCS2_5.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-H_0.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-V_0.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/CNS1/cmaps_cns1.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-H_0.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-V_0.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-H_0.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-V_0.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-H_0.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-V_0.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/CNS1/HKscs-B5-H_5.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/CNS1/HKscs-B5-V_5.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UCS2-H_3.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UCS2-V_3.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UTF16-H_0.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/fpdf_cmaps.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/GB1/Adobe-GB1-UCS2_5.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/GB1/cmaps_gb1.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-H_0.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-V_0.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-H_2.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-V_2.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/GB1/GBK2K-H_5.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/GB1/GBK2K-V_5.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-H_2.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-V_2.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-H_0.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-V_0.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-H_4.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-V_4.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Japan1/83pv-RKSJ-H_1.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-H_2.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-V_2.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-H_2.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-V_2.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Japan1/90pv-RKSJ-H_1.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-H_1.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-V_1.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Japan1/Adobe-Japan1-UCS2_4.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Japan1/cmaps_japan1.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-H_1.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-V_1.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Japan1/Ext-RKSJ-H_2.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Japan1/Ext-RKSJ-V_2.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Japan1/H_1.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-H_4.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-V_4.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-H_4.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-V_4.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-H_5.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-V_5.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Japan1/V_1.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Korea1/Adobe-Korea1-UCS2_2.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Korea1/cmaps_korea1.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-H_0.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-V_0.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-H_1.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-V_1.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-H_1.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-V_1.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Korea1/KSCpc-EUC-H_0.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-H_1.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-V_1.cpp',\n        'core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UTF16-H_0.cpp',\n        'core/src/fpdfapi/fpdf_edit/editint.h',\n        'core/src/fpdfapi/fpdf_edit/fpdf_edit_content.cpp',\n        'core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp',\n        'core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp',\n        'core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp',\n        'core/src/fpdfapi/fpdf_font/common.h',\n        'core/src/fpdfapi/fpdf_font/font_int.h',\n        'core/src/fpdfapi/fpdf_font/fpdf_font.cpp',\n        'core/src/fpdfapi/fpdf_font/fpdf_font_charset.cpp',\n        'core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp',\n        'core/src/fpdfapi/fpdf_font/fpdf_font_utility.cpp',\n        'core/src/fpdfapi/fpdf_font/ttgsubtable.cpp',\n        'core/src/fpdfapi/fpdf_font/ttgsubtable.h',\n        'core/src/fpdfapi/fpdf_page/fpdf_page.cpp',\n        'core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp',\n        'core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp',\n        'core/src/fpdfapi/fpdf_page/fpdf_page_func.cpp',\n        'core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp',\n        'core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp',\n        'core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp',\n        'core/src/fpdfapi/fpdf_page/fpdf_page_parser_new.cpp',\n        'core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp',\n        'core/src/fpdfapi/fpdf_page/fpdf_page_path.cpp',\n        'core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp',\n        'core/src/fpdfapi/fpdf_page/pageint.h',\n        'core/src/fpdfapi/fpdf_parser/filters_int.h',\n        'core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp',\n        'core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp',\n        'core/src/fpdfapi/fpdf_parser/fpdf_parser_encrypt.cpp',\n        'core/src/fpdfapi/fpdf_parser/fpdf_parser_fdf.cpp',\n        'core/src/fpdfapi/fpdf_parser/fpdf_parser_filters.cpp',\n        'core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp',\n        'core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp',\n        'core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp',\n        'core/src/fpdfapi/fpdf_render/fpdf_render.cpp',\n        'core/src/fpdfapi/fpdf_render/fpdf_render_cache.cpp',\n        'core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp',\n        'core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp',\n        'core/src/fpdfapi/fpdf_render/fpdf_render_pattern.cpp',\n        'core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp',\n        'core/src/fpdfapi/fpdf_render/render_int.h',\n      ],\n    },\n    {\n      'target_name': 'fpdftext',\n      'type': 'static_library',\n      'ldflags': [ '-L<(PRODUCT_DIR)',],\n      'sources': [\n        'core/include/fpdftext/fpdf_text.h',\n        'core/src/fpdftext/fpdf_text.cpp',\n        'core/src/fpdftext/fpdf_text_int.cpp',\n        'core/src/fpdftext/fpdf_text_search.cpp',\n        'core/src/fpdftext/text_int.h',\n        'core/src/fpdftext/txtproc.h',\n        'core/src/fpdftext/unicodenormalization.cpp',\n        'core/src/fpdftext/unicodenormalizationdata.cpp',\n      ],\n    },\n    {\n      'target_name': 'fxcodec',\n      'type': 'static_library',\n      'include_dirs': [\n      ],\n      'ldflags': [ '-L<(PRODUCT_DIR)',],\n      'sources': [\n        'core/include/fxcodec/fx_codec.h',\n        'core/include/fxcodec/fx_codec_def.h',\n        'core/include/fxcodec/fx_codec_provider.h',\n        'core/src/fxcodec/codec/codec_int.h',\n        'core/src/fxcodec/codec/fx_codec.cpp',\n        'core/src/fxcodec/codec/fx_codec_fax.cpp',\n        'core/src/fxcodec/codec/fx_codec_flate.cpp',\n        'core/src/fxcodec/codec/fx_codec_icc.cpp',\n        'core/src/fxcodec/codec/fx_codec_jbig.cpp',\n        'core/src/fxcodec/codec/fx_codec_jbig_enc.cpp',\n        'core/src/fxcodec/codec/fx_codec_jpeg.cpp',\n        'core/src/fxcodec/codec/fx_codec_jpx_opj.cpp',\n        'core/src/fxcodec/fx_libopenjpeg/include/fx_openjpeg.h',\n        'core/src/fxcodec/fx_libopenjpeg/src/fx_bio.c',\n        'core/src/fxcodec/fx_libopenjpeg/src/fx_cio.c',\n        'core/src/fxcodec/fx_libopenjpeg/src/fx_dwt.c',\n        'core/src/fxcodec/fx_libopenjpeg/src/fx_event.c',\n        'core/src/fxcodec/fx_libopenjpeg/src/fx_function_list.c',\n        'core/src/fxcodec/fx_libopenjpeg/src/fx_image.c',\n        'core/src/fxcodec/fx_libopenjpeg/src/fx_invert.c',\n        'core/src/fxcodec/fx_libopenjpeg/src/fx_j2k.c',\n        'core/src/fxcodec/fx_libopenjpeg/src/fx_j2k_lib.c',\n        'core/src/fxcodec/fx_libopenjpeg/src/fx_jpt.c',\n        'core/src/fxcodec/fx_libopenjpeg/src/fx_mct.c',\n        'core/src/fxcodec/fx_libopenjpeg/src/fx_mqc.c',\n        'core/src/fxcodec/fx_libopenjpeg/src/fx_openjpeg.c',\n        'core/src/fxcodec/fx_libopenjpeg/src/fx_openjpeg_jp2.c',\n        'core/src/fxcodec/fx_libopenjpeg/src/fx_opj_clock.c',\n        'core/src/fxcodec/fx_libopenjpeg/src/fx_pi.c',\n        'core/src/fxcodec/fx_libopenjpeg/src/fx_raw.c',\n        'core/src/fxcodec/fx_libopenjpeg/src/fx_t1.c',\n        'core/src/fxcodec/fx_libopenjpeg/src/fx_t1_generate_luts.c',\n        'core/src/fxcodec/fx_libopenjpeg/src/fx_t2.c',\n        'core/src/fxcodec/fx_libopenjpeg/src/fx_tcd.c',\n        'core/src/fxcodec/fx_libopenjpeg/src/fx_tgt.c',\n        'core/src/fxcodec/fx_zlib/include/fx_zlib.h',\n        'core/src/fxcodec/fx_zlib/src/fx_zlib_adler32.c',\n        'core/src/fxcodec/fx_zlib/src/fx_zlib_compress.c',\n        'core/src/fxcodec/fx_zlib/src/fx_zlib_crc32.c',\n        'core/src/fxcodec/fx_zlib/src/fx_zlib_deflate.c',\n        'core/src/fxcodec/fx_zlib/src/fx_zlib_gzclose.c',\n        'core/src/fxcodec/fx_zlib/src/fx_zlib_gzlib.c',\n        'core/src/fxcodec/fx_zlib/src/fx_zlib_gzread.c',\n        'core/src/fxcodec/fx_zlib/src/fx_zlib_gzwrite.c',\n        'core/src/fxcodec/fx_zlib/src/fx_zlib_infback.c',\n        'core/src/fxcodec/fx_zlib/src/fx_zlib_inffast.c',\n        'core/src/fxcodec/fx_zlib/src/fx_zlib_inflate.c',\n        'core/src/fxcodec/fx_zlib/src/fx_zlib_inftrees.c',\n        'core/src/fxcodec/fx_zlib/src/fx_zlib_trees.c',\n        'core/src/fxcodec/fx_zlib/src/fx_zlib_uncompr.c',\n        'core/src/fxcodec/fx_zlib/src/fx_zlib_zutil.c',\n        'core/src/fxcodec/jbig2/JBig2_ArithDecoder.h',\n        'core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp',\n        'core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.h',\n        'core/src/fxcodec/jbig2/JBig2_ArithQe.h',\n        'core/src/fxcodec/jbig2/JBig2_BitStream.h',\n        'core/src/fxcodec/jbig2/JBig2_Context.cpp',\n        'core/src/fxcodec/jbig2/JBig2_Context.h',\n        'core/src/fxcodec/jbig2/JBig2_Define.h',\n        'core/src/fxcodec/jbig2/JBig2_GeneralDecoder.cpp',\n        'core/src/fxcodec/jbig2/JBig2_GeneralDecoder.h',\n        'core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp',\n        'core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.h',\n        'core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp',\n        'core/src/fxcodec/jbig2/JBig2_HuffmanTable.h',\n        'core/src/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h',\n        'core/src/fxcodec/jbig2/JBig2_Image.cpp',\n        'core/src/fxcodec/jbig2/JBig2_Image.h',\n        'core/src/fxcodec/jbig2/JBig2_List.h',\n        'core/src/fxcodec/jbig2/JBig2_Module.h',\n        'core/src/fxcodec/jbig2/JBig2_Object.cpp',\n        'core/src/fxcodec/jbig2/JBig2_Object.h',\n        'core/src/fxcodec/jbig2/JBig2_Page.h',\n        'core/src/fxcodec/jbig2/JBig2_PatternDict.cpp',\n        'core/src/fxcodec/jbig2/JBig2_PatternDict.h',\n        'core/src/fxcodec/jbig2/JBig2_Segment.cpp',\n        'core/src/fxcodec/jbig2/JBig2_Segment.h',\n        'core/src/fxcodec/jbig2/JBig2_SymbolDict.cpp',\n        'core/src/fxcodec/jbig2/JBig2_SymbolDict.h',\n        'core/src/fxcodec/lcms2/src/fx_cmscam02.c',\n        'core/src/fxcodec/lcms2/src/fx_cmscgats.c',\n        'core/src/fxcodec/lcms2/src/fx_cmscnvrt.c',\n        'core/src/fxcodec/lcms2/src/fx_cmserr.c',\n        'core/src/fxcodec/lcms2/src/fx_cmsgamma.c',\n        'core/src/fxcodec/lcms2/src/fx_cmsgmt.c',\n        'core/src/fxcodec/lcms2/src/fx_cmshalf.c',\n        'core/src/fxcodec/lcms2/src/fx_cmsintrp.c',\n        'core/src/fxcodec/lcms2/src/fx_cmsio0.c',\n        'core/src/fxcodec/lcms2/src/fx_cmsio1.c',\n        'core/src/fxcodec/lcms2/src/fx_cmslut.c',\n        'core/src/fxcodec/lcms2/src/fx_cmsmd5.c',\n        'core/src/fxcodec/lcms2/src/fx_cmsmtrx.c',\n        'core/src/fxcodec/lcms2/src/fx_cmsnamed.c',\n        'core/src/fxcodec/lcms2/src/fx_cmsopt.c',\n        'core/src/fxcodec/lcms2/src/fx_cmspack.c',\n        'core/src/fxcodec/lcms2/src/fx_cmspcs.c',\n        'core/src/fxcodec/lcms2/src/fx_cmsplugin.c',\n        'core/src/fxcodec/lcms2/src/fx_cmsps2.c',\n        'core/src/fxcodec/lcms2/src/fx_cmssamp.c',\n        'core/src/fxcodec/lcms2/src/fx_cmssm.c',\n        'core/src/fxcodec/lcms2/src/fx_cmstypes.c',\n        'core/src/fxcodec/lcms2/src/fx_cmsvirt.c',\n        'core/src/fxcodec/lcms2/src/fx_cmswtpnt.c',\n        'core/src/fxcodec/lcms2/src/fx_cmsxform.c',\n        'core/src/fxcodec/libjpeg/cderror.h',\n        'core/src/fxcodec/libjpeg/cdjpeg.h',\n        'core/src/fxcodec/libjpeg/fpdfapi_jcapimin.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jcapistd.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jccoefct.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jccolor.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jcdctmgr.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jchuff.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jcinit.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jcmainct.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jcmarker.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jcmaster.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jcomapi.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jcparam.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jcphuff.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jcprepct.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jcsample.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jctrans.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jdapimin.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jdapistd.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jdcoefct.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jdcolor.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jddctmgr.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jdhuff.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jdinput.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jdmainct.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jdmarker.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jdmaster.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jdmerge.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jdphuff.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jdpostct.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jdsample.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jdtrans.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jerror.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jfdctfst.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jfdctint.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jidctfst.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jidctint.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jidctred.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jmemmgr.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jmemnobs.c',\n        'core/src/fxcodec/libjpeg/fpdfapi_jutils.c',\n        'core/src/fxcodec/libjpeg/jchuff.h',\n        'core/src/fxcodec/libjpeg/jconfig.h',\n        'core/src/fxcodec/libjpeg/jdct.h',\n        'core/src/fxcodec/libjpeg/jdhuff.h',\n        'core/src/fxcodec/libjpeg/jerror.h',\n        'core/src/fxcodec/libjpeg/jinclude.h',\n        'core/src/fxcodec/libjpeg/jmemsys.h',\n        'core/src/fxcodec/libjpeg/jmorecfg.h',\n        'core/src/fxcodec/libjpeg/jpegint.h',\n        'core/src/fxcodec/libjpeg/jpeglib.h',\n        'core/src/fxcodec/libjpeg/jversion.h',\n        'core/src/fxcodec/libjpeg/makefile',\n        'core/src/fxcodec/libjpeg/transupp.h',\n      ],\n      'conditions': [\n        ['os_posix==1', {\n          # core/src/fxcodec/fx_libopenjpeg/src/fx_mct.c does an pointer-to-int\n          # conversion to check that an address is 16-bit aligned (benign).\n          'cflags_c': [ '-Wno-pointer-to-int-cast' ],\n        }],\n      ],\n    },\n    {\n      'target_name': 'fxcrt',\n      'type': 'static_library',\n      'ldflags': [ '-L<(PRODUCT_DIR)',],\n      'sources': [\n        'core/include/fxcrt/fx_arb.h',\n        'core/include/fxcrt/fx_basic.h',\n        'core/include/fxcrt/fx_coordinates.h',\n        'core/include/fxcrt/fx_ext.h',\n        'core/include/fxcrt/fx_memory.h',\n        'core/include/fxcrt/fx_stream.h',\n        'core/include/fxcrt/fx_string.h',\n        'core/include/fxcrt/fx_system.h',\n        'core/include/fxcrt/fx_ucd.h',\n        'core/include/fxcrt/fx_xml.h',\n        'core/src/fxcrt/extension.h',\n        'core/src/fxcrt/fxcrt_platforms.cpp',\n        'core/src/fxcrt/fxcrt_platforms.h',\n        'core/src/fxcrt/fxcrt_posix.cpp',\n        'core/src/fxcrt/fxcrt_posix.h',\n        'core/src/fxcrt/fxcrt_windows.cpp',\n        'core/src/fxcrt/fxcrt_windows.h',\n        'core/src/fxcrt/fx_arabic.cpp',\n        'core/src/fxcrt/fx_arabic.h',\n        'core/src/fxcrt/fx_basic_array.cpp',\n        'core/src/fxcrt/fx_basic_bstring.cpp',\n        'core/src/fxcrt/fx_basic_buffer.cpp',\n        'core/src/fxcrt/fx_basic_coords.cpp',\n        'core/src/fxcrt/fx_basic_gcc.cpp',\n        'core/src/fxcrt/fx_basic_list.cpp',\n        'core/src/fxcrt/fx_basic_maps.cpp',\n        'core/src/fxcrt/fx_basic_memmgr.cpp',\n        'core/src/fxcrt/fx_basic_plex.cpp',\n        'core/src/fxcrt/fx_basic_utf.cpp',\n        'core/src/fxcrt/fx_basic_util.cpp',\n        'core/src/fxcrt/fx_basic_wstring.cpp',\n        'core/src/fxcrt/fx_extension.cpp',\n        'core/src/fxcrt/fx_ucddata.cpp',\n        'core/src/fxcrt/fx_unicode.cpp',\n        'core/src/fxcrt/fx_xml_composer.cpp',\n        'core/src/fxcrt/fx_xml_parser.cpp',\n        'core/src/fxcrt/plex.h',\n        'core/src/fxcrt/xml_int.h',\n      ],\n    },\n    {\n      'target_name': 'fxge',\n      'type': 'static_library',\n      'ldflags': [ '-L<(PRODUCT_DIR)',],\n      'sources': [\n        'core/include/fxge/fpf.h',\n        'core/include/fxge/fx_dib.h',\n        'core/include/fxge/fx_font.h',\n        'core/include/fxge/fx_freetype.h',\n        'core/include/fxge/fx_ge.h',\n        'core/include/fxge/fx_ge_apple.h',\n        'core/include/fxge/fx_ge_win32.h',\n        'core/src/fxge/agg/include/fxfx_agg_basics.h',\n        'core/src/fxge/agg/include/fxfx_agg_clip_liang_barsky.h',\n        'core/src/fxge/agg/include/fxfx_agg_conv_dash.h',\n        'core/src/fxge/agg/include/fxfx_agg_conv_stroke.h',\n        'core/src/fxge/agg/include/fxfx_agg_curves.h',\n        'core/src/fxge/agg/include/fxfx_agg_path_storage.h',\n        'core/src/fxge/agg/include/fxfx_agg_rasterizer_scanline_aa.h',\n        'core/src/fxge/agg/include/fxfx_agg_renderer_scanline.h',\n        'core/src/fxge/agg/include/fxfx_agg_rendering_buffer.h',\n        'core/src/fxge/agg/include/fxfx_agg_scanline_u.h',\n        'core/src/fxge/agg/include/fx_agg_driver.h',\n        'core/src/fxge/agg/src/fxfx_agg_curves.cpp',\n        'core/src/fxge/agg/src/fxfx_agg_driver.cpp',\n        'core/src/fxge/agg/src/fxfx_agg_path_storage.cpp',\n        'core/src/fxge/agg/src/fxfx_agg_rasterizer_scanline_aa.cpp',\n        'core/src/fxge/agg/src/fxfx_agg_vcgen_dash.cpp',\n        'core/src/fxge/agg/src/fxfx_agg_vcgen_stroke.cpp',\n        'core/src/fxge/android/fpf_skiafont.cpp',\n        'core/src/fxge/android/fpf_skiafont.h',\n        'core/src/fxge/android/fpf_skiafontmgr.cpp',\n        'core/src/fxge/android/fpf_skiafontmgr.h',\n        'core/src/fxge/android/fpf_skiamodule.cpp',\n        'core/src/fxge/android/fpf_skiamodule.h',\n        'core/src/fxge/android/fx_android_font.cpp',\n        'core/src/fxge/android/fx_android_font.h',\n        'core/src/fxge/android/fx_android_imp.cpp',\n        'core/src/fxge/android/fx_fpf.h',\n        'core/src/fxge/apple/apple_int.h',\n        'core/src/fxge/apple/fx_apple_platform.cpp',\n        'core/src/fxge/apple/fx_mac_imp.cpp',\n        'core/src/fxge/apple/fx_quartz_device.cpp',\n        'core/src/fxge/dib/dib_int.h',\n        'core/src/fxge/dib/fx_dib_composite.cpp',\n        'core/src/fxge/dib/fx_dib_convert.cpp',\n        'core/src/fxge/dib/fx_dib_engine.cpp',\n        'core/src/fxge/dib/fx_dib_main.cpp',\n        'core/src/fxge/dib/fx_dib_transform.cpp',\n        'core/src/fxge/fontdata/chromefontdata/FoxitDingbats.c',\n        'core/src/fxge/fontdata/chromefontdata/FoxitFixed.c',\n        'core/src/fxge/fontdata/chromefontdata/FoxitFixedBold.c',\n        'core/src/fxge/fontdata/chromefontdata/FoxitFixedBoldItalic.c',\n        'core/src/fxge/fontdata/chromefontdata/FoxitFixedItalic.c',\n        'core/src/fxge/fontdata/chromefontdata/FoxitSans.c',\n        'core/src/fxge/fontdata/chromefontdata/FoxitSansBold.c',\n        'core/src/fxge/fontdata/chromefontdata/FoxitSansBoldItalic.c',\n        'core/src/fxge/fontdata/chromefontdata/FoxitSansItalic.c',\n        'core/src/fxge/fontdata/chromefontdata/FoxitSansMM.c',\n        'core/src/fxge/fontdata/chromefontdata/FoxitSerif.c',\n        'core/src/fxge/fontdata/chromefontdata/FoxitSerifBold.c',\n        'core/src/fxge/fontdata/chromefontdata/FoxitSerifBoldItalic.c',\n        'core/src/fxge/fontdata/chromefontdata/FoxitSerifItalic.c',\n        'core/src/fxge/fontdata/chromefontdata/FoxitSerifMM.c',\n        'core/src/fxge/fontdata/chromefontdata/FoxitSymbol.c',\n        'core/src/fxge/fx_freetype/include/fxft_cffobjs.h',\n        'core/src/fxge/fx_freetype/include/fxft_cfftypes.h',\n        'core/src/fxge/fx_freetype/include/fxft_freetype.h',\n        'core/src/fxge/fx_freetype/include/fxft_ft2build.h',\n        'core/src/fxge/fx_freetype/include/fxft_ftmm.h',\n        'core/src/fxge/fx_freetype/include/fxft_ftobjs.h',\n        'core/src/fxge/fx_freetype/include/fxft_ftotval.h',\n        'core/src/fxge/fx_freetype/include/fxft_ftoutln.h',\n        'core/src/fxge/fx_freetype/include/fxft_ftstream.h',\n        'core/src/fxge/fx_freetype/include/fxft_tttables.h',\n        'core/src/fxge/fx_freetype/include/fxft_tttypes.h',\n        'core/src/fxge/fx_freetype/src/fxft_cff.c',\n        'core/src/fxge/fx_freetype/src/fxft_ftbase.c',\n        'core/src/fxge/fx_freetype/src/fxft_ftbitmap.c',\n        'core/src/fxge/fx_freetype/src/fxft_ftglyph.c',\n        'core/src/fxge/fx_freetype/src/fxft_ftinit.c',\n        'core/src/fxge/fx_freetype/src/fxft_ftlcdfil.c',\n        'core/src/fxge/fx_freetype/src/fxft_ftmm.c',\n        'core/src/fxge/fx_freetype/src/fxft_ftsystem.c',\n        'core/src/fxge/fx_freetype/src/fxft_psaux.c',\n        'core/src/fxge/fx_freetype/src/fxft_pshinter.c',\n        'core/src/fxge/fx_freetype/src/fxft_psmodule.c',\n        'core/src/fxge/fx_freetype/src/fxft_raster.c',\n        'core/src/fxge/fx_freetype/src/fxft_sfnt.c',\n        'core/src/fxge/fx_freetype/src/fxft_smooth.c',\n        'core/src/fxge/fx_freetype/src/fxft_truetype.c',\n        'core/src/fxge/fx_freetype/src/fxft_type1.c',\n        'core/src/fxge/fx_freetype/src/fxft_type1cid.c',\n        'core/src/fxge/ge/fx_ge.cpp',\n        'core/src/fxge/ge/fx_ge_device.cpp',\n        'core/src/fxge/ge/fx_ge_font.cpp',\n        'core/src/fxge/ge/fx_ge_fontmap.cpp',\n        'core/src/fxge/ge/fx_ge_linux.cpp',\n        'core/src/fxge/ge/fx_ge_path.cpp',\n        'core/src/fxge/ge/fx_ge_ps.cpp',\n        'core/src/fxge/ge/fx_ge_text.cpp',\n        'core/src/fxge/ge/text_int.h',\n      ],\n      'conditions': [\n        ['pdf_use_skia==1', {\n          'sources': [\n            'core/src/fxge/skia/fx_skia_blitter_new.cpp',\n            'core/src/fxge/skia/fx_skia_device.cpp',\n          ],\n          'dependencies': [\n            '<(DEPTH)/skia/skia.gyp:skia',\n          ],\n          'include_dirs': [\n            '<(DEPTH)/third_party/skia/include/config',\n            '<(DEPTH)/third_party/skia/include/core',\n            '<(DEPTH)/third_party/skia/include/effects',\n            '<(DEPTH)/third_party/skia/include/images',\n            '<(DEPTH)/third_party/skia/include/lazy',\n            '<(DEPTH)/third_party/skia/include/pathops',\n            '<(DEPTH)/third_party/skia/include/utils',\n            '<(DEPTH)/third_party/skia/src/core',\n          ],\n        }],\n        ['OS==\"win\"', {\n          'defines!': [\n            'NOMINMAX',\n            'WIN32_LEAN_AND_MEAN'\n          ],\n          'sources': [\n            'core/src/fxge/win32/dwrite_int.h',\n            'core/src/fxge/win32/fx_win32_device.cpp',\n            'core/src/fxge/win32/fx_win32_dib.cpp',\n            'core/src/fxge/win32/fx_win32_dwrite.cpp',\n            'core/src/fxge/win32/fx_win32_gdipext.cpp',\n            'core/src/fxge/win32/fx_win32_print.cpp',\n            'core/src/fxge/win32/win32_int.h',\n          ],\n        }],\n      ],\n    },\n    {\n      'target_name': 'fxedit',\n      'type': 'static_library',\n      'ldflags': [ '-L<(PRODUCT_DIR)',],\n      'sources': [\n        'fpdfsdk/include/fxedit/fx_edit.h',\n        'fpdfsdk/include/fxedit/fxet_edit.h',\n        'fpdfsdk/include/fxedit/fxet_list.h',\n        'fpdfsdk/include/fxedit/fxet_stub.h',\n        'fpdfsdk/src/fxedit/fxet_ap.cpp',\n        'fpdfsdk/src/fxedit/fxet_edit.cpp',\n        'fpdfsdk/src/fxedit/fxet_list.cpp',\n        'fpdfsdk/src/fxedit/fxet_module.cpp',\n        'fpdfsdk/src/fxedit/fxet_pageobjs.cpp',\n      ],\n    },\n    {\n      'target_name': 'pdfwindow',\n      'type': 'static_library',\n      'ldflags': [ '-L<(PRODUCT_DIR)',],\n      'sources': [\n        'fpdfsdk/include/pdfwindow/IPDFWindow.h',\n        'fpdfsdk/include/pdfwindow/PDFWindow.h',\n        'fpdfsdk/include/pdfwindow/PWL_Button.h',\n        'fpdfsdk/include/pdfwindow/PWL_Caret.h',\n        'fpdfsdk/include/pdfwindow/PWL_ComboBox.h',\n        'fpdfsdk/include/pdfwindow/PWL_Edit.h',\n        'fpdfsdk/include/pdfwindow/PWL_EditCtrl.h',\n        'fpdfsdk/include/pdfwindow/PWL_FontMap.h',\n        'fpdfsdk/include/pdfwindow/PWL_Icon.h',\n        'fpdfsdk/include/pdfwindow/PWL_IconList.h',\n        'fpdfsdk/include/pdfwindow/PWL_Label.h',\n        'fpdfsdk/include/pdfwindow/PWL_ListBox.h',\n        'fpdfsdk/include/pdfwindow/PWL_ListCtrl.h',\n        'fpdfsdk/include/pdfwindow/PWL_Note.h',\n        'fpdfsdk/include/pdfwindow/PWL_ScrollBar.h',\n        'fpdfsdk/include/pdfwindow/PWL_Signature.h',\n        'fpdfsdk/include/pdfwindow/PWL_SpecialButton.h',\n        'fpdfsdk/include/pdfwindow/PWL_Utils.h',\n        'fpdfsdk/include/pdfwindow/PWL_Wnd.h',\n        'fpdfsdk/src/pdfwindow/PWL_Button.cpp',\n        'fpdfsdk/src/pdfwindow/PWL_Caret.cpp',\n        'fpdfsdk/src/pdfwindow/PWL_ComboBox.cpp',\n        'fpdfsdk/src/pdfwindow/PWL_Edit.cpp',\n        'fpdfsdk/src/pdfwindow/PWL_EditCtrl.cpp',\n        'fpdfsdk/src/pdfwindow/PWL_FontMap.cpp',\n        'fpdfsdk/src/pdfwindow/PWL_Icon.cpp',\n        'fpdfsdk/src/pdfwindow/PWL_IconList.cpp',\n        'fpdfsdk/src/pdfwindow/PWL_Label.cpp',\n        'fpdfsdk/src/pdfwindow/PWL_ListBox.cpp',\n        'fpdfsdk/src/pdfwindow/PWL_ListCtrl.cpp',\n        'fpdfsdk/src/pdfwindow/PWL_Note.cpp',\n        'fpdfsdk/src/pdfwindow/PWL_ScrollBar.cpp',\n        'fpdfsdk/src/pdfwindow/PWL_Signature.cpp',\n        'fpdfsdk/src/pdfwindow/PWL_SpecialButton.cpp',\n        'fpdfsdk/src/pdfwindow/PWL_Utils.cpp',\n        'fpdfsdk/src/pdfwindow/PWL_Wnd.cpp',\n      ],\n    },\n#    {\n#      'target_name': 'javascript',\n#      'type': 'static_library',\n#        'include_dirs': [\n#          '<(DEPTH)/v8',\n#          '<(DEPTH)/v8/include',\n#        ],\n#      'dependencies': [\n#        '<(DEPTH)/v8/tools/gyp/v8.gyp:v8',\n#        '<(DEPTH)/v8/tools/gyp/v8.gyp:v8_libplatform',\n#      ],\n#      'export_dependent_settings': [\n#        '<(DEPTH)/v8/tools/gyp/v8.gyp:v8',\n#      ],\n#      'ldflags': [ '-L<(PRODUCT_DIR)',],\n#      'sources': [\n#        'fpdfsdk/include/javascript/app.h',\n#        'fpdfsdk/include/javascript/color.h',\n#        'fpdfsdk/include/javascript/console.h',\n#        'fpdfsdk/include/javascript/Consts.h',\n#        'fpdfsdk/include/javascript/Document.h',\n#        'fpdfsdk/include/javascript/event.h',\n#        'fpdfsdk/include/javascript/Field.h',\n#        'fpdfsdk/include/javascript/global.h',\n#        'fpdfsdk/include/javascript/Icon.h',\n#        'fpdfsdk/include/javascript/IJavaScript.h',\n#        'fpdfsdk/include/javascript/JavaScript.h',\n#        'fpdfsdk/include/javascript/JS_Console.h',\n#        'fpdfsdk/include/javascript/JS_Context.h',\n#        'fpdfsdk/include/javascript/JS_Define.h',\n#        'fpdfsdk/include/javascript/JS_EventHandler.h',\n#        'fpdfsdk/include/javascript/JS_GlobalData.h',\n#        'fpdfsdk/include/javascript/JS_Module.h',\n#        'fpdfsdk/include/javascript/JS_Object.h',\n#        'fpdfsdk/include/javascript/JS_Runtime.h',\n#        'fpdfsdk/include/javascript/JS_Value.h',\n#        'fpdfsdk/include/javascript/PublicMethods.h',\n#        'fpdfsdk/include/javascript/report.h',\n#        'fpdfsdk/include/javascript/resource.h',\n#        'fpdfsdk/include/javascript/util.h',\n#        'fpdfsdk/src/javascript/app.cpp',\n#        'fpdfsdk/src/javascript/color.cpp',\n#        'fpdfsdk/src/javascript/console.cpp',\n#        'fpdfsdk/src/javascript/Consts.cpp',\n#        'fpdfsdk/src/javascript/Document.cpp',\n#        'fpdfsdk/src/javascript/event.cpp',\n#        'fpdfsdk/src/javascript/Field.cpp',\n#        'fpdfsdk/src/javascript/global.cpp',\n#        'fpdfsdk/src/javascript/Icon.cpp',\n#        'fpdfsdk/src/javascript/JS_Context.cpp',\n#        'fpdfsdk/src/javascript/JS_EventHandler.cpp',\n#        'fpdfsdk/src/javascript/JS_GlobalData.cpp',\n#        'fpdfsdk/src/javascript/JS_Object.cpp',\n#        'fpdfsdk/src/javascript/JS_Runtime.cpp',\n#        'fpdfsdk/src/javascript/JS_Value.cpp',\n#        'fpdfsdk/src/javascript/PublicMethods.cpp',\n#        'fpdfsdk/src/javascript/report.cpp',\n#        'fpdfsdk/src/javascript/util.cpp',\n#      ],\n#    },\n#    {\n#      'target_name': 'jsapi',\n#      'type': 'static_library',\n#      'dependencies': [\n#        '<(DEPTH)/v8/tools/gyp/v8.gyp:v8',\n#      ],\n#      'export_dependent_settings': [\n#        '<(DEPTH)/v8/tools/gyp/v8.gyp:v8',\n#      ],\n#      'include_dirs': [\n#        '<(DEPTH)/v8',\n#        '<(DEPTH)/v8/include',\n#      ],\n#      'ldflags': [ '-L<(PRODUCT_DIR)',],\n#      'sources': [\n#        'fpdfsdk/include/jsapi/fxjs_v8.h',\n#        'fpdfsdk/src/jsapi/fxjs_v8.cpp',\n#      ],\n#    },\n    {\n      'target_name': 'formfiller',\n      'type': 'static_library',\n      'ldflags': [ '-L<(PRODUCT_DIR)',],\n      'sources': [\n        'fpdfsdk/include/formfiller/FFL_CBA_Fontmap.h',\n        'fpdfsdk/include/formfiller/FFL_CheckBox.h',\n        'fpdfsdk/include/formfiller/FFL_ComboBox.h',\n        'fpdfsdk/include/formfiller/FFL_FormFiller.h',\n        'fpdfsdk/include/formfiller/FFL_IFormFiller.h',\n        'fpdfsdk/include/formfiller/FFL_ListBox.h',\n        'fpdfsdk/include/formfiller/FFL_Notify.h',\n        'fpdfsdk/include/formfiller/FFL_PushButton.h',\n        'fpdfsdk/include/formfiller/FFL_RadioButton.h',\n        'fpdfsdk/include/formfiller/FFL_TextField.h',\n        'fpdfsdk/include/formfiller/FFL_Utils.h',\n        'fpdfsdk/include/formfiller/FormFiller.h',\n        'fpdfsdk/src/formfiller/FFL_CBA_Fontmap.cpp',\n        'fpdfsdk/src/formfiller/FFL_CheckBox.cpp',\n        'fpdfsdk/src/formfiller/FFL_ComboBox.cpp',\n        'fpdfsdk/src/formfiller/FFL_FormFiller.cpp',\n        'fpdfsdk/src/formfiller/FFL_IFormFiller.cpp',\n        'fpdfsdk/src/formfiller/FFL_ListBox.cpp',\n        'fpdfsdk/src/formfiller/FFL_Notify.cpp',\n        'fpdfsdk/src/formfiller/FFL_PushButton.cpp',\n        'fpdfsdk/src/formfiller/FFL_RadioButton.cpp',\n        'fpdfsdk/src/formfiller/FFL_TextField.cpp',\n        'fpdfsdk/src/formfiller/FFL_Utils.cpp',\n      ],\n    },\n  ],\n}\n"
  },
  {
    "path": "pdfium.js/pdfium.js.cc",
    "content": "// Copyright (c) 2010 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Copyright (c) 2014 Lu Wang <coolwanglu@gmail.com>\n\n#include <limits.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include <utility>\n\n#include \"../fpdfsdk/include/fpdf_dataavail.h\"\n#include \"../fpdfsdk/include/fpdf_ext.h\"\n#include \"../fpdfsdk/include/fpdfformfill.h\"\n#include \"../fpdfsdk/include/fpdftext.h\"\n#include \"../fpdfsdk/include/fpdfview.h\"\n\nstruct {\n    UNSUPPORT_INFO unsuppored_info;\n} global;\n\nextern \"C\"\nint PDFiumJS_read_file(void *file_id, unsigned long pos, unsigned char *pBuf, unsigned long size);\n\nstruct PDFiumJS_Doc {\n    PDFiumJS_Doc(void *file_id, size_t len) {\n        memset(&platform_callbacks, '\\0', sizeof(platform_callbacks));\n        platform_callbacks.version = 1;\n        platform_callbacks.app_alert = Form_Alert;\n\n        memset(&form_callbacks, '\\0', sizeof(form_callbacks));\n        form_callbacks.version = 1;\n        form_callbacks.m_pJsPlatform = &platform_callbacks;\n\n        memset(&file_access, '\\0', sizeof(file_access));\n        file_access.m_FileLen = static_cast<unsigned long>(len);\n        file_access.m_GetBlock = PDFiumJS_read_file;\n        file_access.m_Param = file_id;\n\n        memset(&file_avail, '\\0', sizeof(file_avail));\n        file_avail.version = 1;\n        file_avail.IsDataAvail = Is_Data_Avail;\n\n        memset(&hints, '\\0', sizeof(hints));\n        hints.version = 1;\n        hints.AddSegment = Add_Segment;\n\n        pdf_avail = FPDFAvail_Create(&file_avail, &file_access);\n\n        (void) FPDFAvail_IsDocAvail(pdf_avail, &hints);\n\n        if (!FPDFAvail_IsLinearized(pdf_avail)) {\n            doc = FPDF_LoadCustomDocument(&file_access, NULL);\n        } else {\n            doc = FPDFAvail_GetDocument(pdf_avail, NULL);\n        }\n\n        (void) FPDF_GetDocPermissions(doc);\n        (void) FPDFAvail_IsFormAvail(pdf_avail, &hints);\n\n        form = FPDFDOC_InitFormFillEnviroument(doc, &form_callbacks);\n        FPDF_SetFormFieldHighlightColor(form, 0, 0xFFE4DD);\n        FPDF_SetFormFieldHighlightAlpha(form, 100);\n\n        /*\n        int first_page = FPDFAvail_GetFirstPageNum(doc);\n        (void) FPDFAvail_IsPageAvail(pdf_avail, first_page, &hints);\n        */\n\n        page_count = FPDF_GetPageCount(doc);\n        printf(\"%d\\n\", page_count);\n        for (int i = 0; i < page_count; ++i) {\n            (void) FPDFAvail_IsPageAvail(pdf_avail, i, &hints);\n        }\n\n        FORM_DoDocumentJSAction(form);\n        FORM_DoDocumentOpenAction(form);\n    }\n\n    ~PDFiumJS_Doc() {\n        FORM_DoDocumentAAction(form, FPDFDOC_AACTION_WC);\n        FPDFDOC_ExitFormFillEnviroument(form);\n        FPDF_CloseDocument(doc);\n        FPDFAvail_Destroy(pdf_avail);\n    }\n\n    static\n    int Form_Alert(IPDF_JSPLATFORM*, FPDF_WIDESTRING, FPDF_WIDESTRING, int, int) {\n      printf(\"Form_Alert called.\\n\");\n      return 0;\n    }\n\n    static\n    bool Is_Data_Avail(FX_FILEAVAIL *pThis, size_t offset, size_t size) {\n      return true;\n    }\n\n    static\n    void Add_Segment(FX_DOWNLOADHINTS *pThis, size_t offset, size_t size) {\n    }\n\n    IPDF_JSPLATFORM platform_callbacks;\n    FPDF_FORMFILLINFO form_callbacks;\n    FPDF_FILEACCESS file_access;\n    FX_FILEAVAIL file_avail;\n    FX_DOWNLOADHINTS hints;\n    FPDF_AVAIL pdf_avail;\n    FPDF_DOCUMENT doc;\n    FPDF_FORMHANDLE form;\n    int page_count;\n};\n\nstruct PDFiumJS_Page {\n    PDFiumJS_Page(FPDF_PAGE page, PDFiumJS_Doc *doc) \n        : page(page), doc(doc) \n    { }\n    FPDF_PAGE page;\n    PDFiumJS_Doc *doc;\n};\n\nstatic\nvoid Unsupported_Handler(UNSUPPORT_INFO*, int type) {\n  const char *feature = \"Unknown\";\n  switch (type) {\n    case FPDF_UNSP_DOC_XFAFORM:\n      feature = \"XFA\";\n      break;\n    case FPDF_UNSP_DOC_PORTABLECOLLECTION:\n      feature = \"Portfolios_Packages\";\n      break;\n    case FPDF_UNSP_DOC_ATTACHMENT:\n    case FPDF_UNSP_ANNOT_ATTACHMENT:\n      feature = \"Attachment\";\n      break;\n    case FPDF_UNSP_DOC_SECURITY:\n      feature = \"Rights_Management\";\n      break;\n    case FPDF_UNSP_DOC_SHAREDREVIEW:\n      feature = \"Shared_Review\";\n      break;\n    case FPDF_UNSP_DOC_SHAREDFORM_ACROBAT:\n    case FPDF_UNSP_DOC_SHAREDFORM_FILESYSTEM:\n    case FPDF_UNSP_DOC_SHAREDFORM_EMAIL:\n      feature = \"Shared_Form\";\n      break;\n    case FPDF_UNSP_ANNOT_3DANNOT:\n      feature = \"3D\";\n      break;\n    case FPDF_UNSP_ANNOT_MOVIE:\n      feature = \"Movie\";\n      break;\n    case FPDF_UNSP_ANNOT_SOUND:\n      feature = \"Sound\";\n      break;\n    case FPDF_UNSP_ANNOT_SCREEN_MEDIA:\n    case FPDF_UNSP_ANNOT_SCREEN_RICHMEDIA:\n      feature = \"Screen\";\n      break;\n    case FPDF_UNSP_ANNOT_SIG:\n      feature = \"Digital_Signature\";\n      break;\n  }\n  printf(\"Unsupported feature: %s.\\n\", feature);\n}\n\nextern \"C\"\nvoid PDFiumJS_init() {\n    FPDF_InitLibrary(NULL);\n\n    UNSUPPORT_INFO& unsuppored_info = global.unsuppored_info;\n    memset(&unsuppored_info, '\\0', sizeof(unsuppored_info));\n    unsuppored_info.version = 1;\n    unsuppored_info.FSDK_UnSupport_Handler = Unsupported_Handler;\n    FSDK_SetUnSpObjProcessHandler(&unsuppored_info);\n}\n\nextern \"C\"\nPDFiumJS_Doc *PDFiumJS_Doc_new(void *file_id, size_t len) {\n    return new PDFiumJS_Doc(file_id, len);\n}\n\nextern \"C\"\nvoid PDFiumJS_Doc_delete(PDFiumJS_Doc *doc) {\n    delete doc;\n}\n\nextern \"C\"\nint PDFiumJS_Doc_get_page_count(PDFiumJS_Doc *doc) {\n    return doc->page_count;\n}\n\nextern \"C\"\nPDFiumJS_Page *PDFiumJS_Doc_get_page(PDFiumJS_Doc *doc, int page_no) {\n    FPDF_PAGE page = FPDF_LoadPage(doc->doc, page_no);\n    FORM_OnAfterLoadPage(page, doc->form);\n    FORM_DoPageAAction(page, doc->form, FPDFPAGE_AACTION_OPEN);\n    return new PDFiumJS_Page(page, doc);\n}\n\nextern \"C\"\nint PDFiumJS_Page_get_width(PDFiumJS_Page *page) {\n    return static_cast<int>(FPDF_GetPageWidth(page->page));\n}\n\nextern \"C\"\nint PDFiumJS_Page_get_height(PDFiumJS_Page *page) {\n    return static_cast<int>(FPDF_GetPageHeight(page->page));\n}\n\nextern \"C\"\nFPDF_BITMAP PDFiumJS_Page_get_bitmap(PDFiumJS_Page *page, int width, int height) {\n    FPDF_BITMAP bitmap = FPDFBitmap_Create(width, height, 0);\n    FPDFBitmap_FillRect(bitmap, 0, 0, width, height, 0xFFFFFFFF);\n\n    FPDF_RenderPageBitmap(bitmap, page->page, 0, 0, width, height, 0, 0);\n    FPDF_FFLDraw(page->doc->form, bitmap, page->page, 0, 0, width, height, 0, 0);\n\n    return bitmap;\n}\n\nextern \"C\"\nconst char *PDFiumJS_Bitmap_get_buffer(FPDF_BITMAP bitmap) {\n    return reinterpret_cast<const char*>(FPDFBitmap_GetBuffer(bitmap));\n}\n\nextern \"C\"\nint PDFiumJS_Bitmap_get_stride(FPDF_BITMAP bitmap) {\n    return FPDFBitmap_GetStride(bitmap);\n}\n\nextern \"C\"\nvoid PDFiumJS_Bitmap_destroy(FPDF_BITMAP bitmap) {\n    FPDFBitmap_Destroy(bitmap);\n}\n\nextern \"C\"\nvoid PDFiumJS_Page_destroy(PDFiumJS_Page *page) {\n    FORM_DoPageAAction(page->page, page->doc->form, FPDFPAGE_AACTION_CLOSE);\n    FORM_OnBeforeClosePage(page->page, page->doc->form);\n    //FPDFText_ClosePage(text_page);\n    FPDF_ClosePage(page->page);\n    delete page;\n}\n\n"
  },
  {
    "path": "pdfium.js/pdfium.js.gyp",
    "content": "# Copyright 2014 PDFium Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\n{\n  'target_defaults': {\n    'type': 'executable',\n    'dependencies': [\n      '../pdfium.gyp:pdfium',\n    ],\n    'include_dirs': ['<(DEPTH)'],\n  },\n  'targets': [\n    {\n      'target_name': 'pdfium_js',\n      'sources': [\n        'pdfium.js.cc',\n      ],\n    },\n  ],\n}\n"
  },
  {
    "path": "pdfium.js/pdfium.js.lib.js",
    "content": "mergeInto(LibraryManager.library, {\n  PDFiumJS_read_file: function(file_id, pos, pBuf, size) {\n    var input = PDFiumJS.opened_files[file_id];\n    if(!input) return 0;\n    if(pos + size < pos ||pos + size > input.length) return 0;\n    HEAPU8.set(input.subarray(pos, pos+size), pBuf);\n    return 1;\n  },\n});\n"
  },
  {
    "path": "samples/pdfium_test.cc",
    "content": "// Copyright (c) 2010 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include <limits.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include <list>\n#include <string>\n#include <utility>\n\n#include \"../fpdfsdk/include/fpdf_dataavail.h\"\n#include \"../fpdfsdk/include/fpdf_ext.h\"\n#include \"../fpdfsdk/include/fpdfformfill.h\"\n#include \"../fpdfsdk/include/fpdftext.h\"\n#include \"../fpdfsdk/include/fpdfview.h\"\n//#include \"v8/include/v8.h\"\n\n#ifdef _WIN32\n  #define snprintf _snprintf\n#endif\n\nenum OutputFormat {\n  OUTPUT_NONE,\n  OUTPUT_PPM,\n#ifdef _WIN32\n  OUTPUT_BMP,\n  OUTPUT_EMF,\n#endif\n};\n\nstatic void WritePpm(const char* pdf_name, int num, const void* buffer_void,\n                     int stride, int width, int height) {\n  const char* buffer = reinterpret_cast<const char*>(buffer_void);\n\n  if (stride < 0 || width < 0 || height < 0)\n    return;\n  if (height > 0 && width > INT_MAX / height)\n    return;\n  int out_len = width * height;\n  if (out_len > INT_MAX / 3)\n    return;\n  out_len *= 3;\n\n  char filename[256];\n  snprintf(filename, sizeof(filename), \"%s.%d.ppm\", pdf_name, num);\n  FILE* fp = fopen(filename, \"wb\");\n  if (!fp)\n    return;\n  fprintf(fp, \"P6\\n# PDF test render\\n%d %d\\n255\\n\", width, height);\n  // Source data is B, G, R, unused.\n  // Dest data is R, G, B.\n  char* result = new char[out_len];\n  if (result) {\n    for (int h = 0; h < height; ++h) {\n      const char* src_line = buffer + (stride * h);\n      char* dest_line = result + (width * h * 3);\n      for (int w = 0; w < width; ++w) {\n        // R\n        dest_line[w * 3] = src_line[(w * 4) + 2];\n        // G\n        dest_line[(w * 3) + 1] = src_line[(w * 4) + 1];\n        // B\n        dest_line[(w * 3) + 2] = src_line[w * 4];\n      }\n    }\n    fwrite(result, out_len, 1, fp);\n    delete [] result;\n  }\n  fclose(fp);\n}\n\n#ifdef _WIN32\nstatic void WriteBmp(const char* pdf_name, int num, const void* buffer,\n                     int stride, int width, int height) {\n  if (stride < 0 || width < 0 || height < 0)\n    return;\n  if (height > 0 && width > INT_MAX / height)\n    return;\n  int out_len = stride * height;\n  if (out_len > INT_MAX / 3)\n    return;\n\n  char filename[256];\n  snprintf(filename, sizeof(filename), \"%s.%d.bmp\", pdf_name, num);\n  FILE* fp = fopen(filename, \"wb\");\n  if (!fp)\n    return;\n\n  BITMAPINFO bmi = {0};\n  bmi.bmiHeader.biSize = sizeof(bmi) - sizeof(RGBQUAD);\n  bmi.bmiHeader.biWidth = width;\n  bmi.bmiHeader.biHeight = -height;  // top-down image\n  bmi.bmiHeader.biPlanes = 1;\n  bmi.bmiHeader.biBitCount = 32;\n  bmi.bmiHeader.biCompression = BI_RGB;\n  bmi.bmiHeader.biSizeImage = 0;\n\n  BITMAPFILEHEADER file_header = {0};\n  file_header.bfType = 0x4d42;\n  file_header.bfSize = sizeof(file_header) + bmi.bmiHeader.biSize + out_len;\n  file_header.bfOffBits = file_header.bfSize - out_len;\n\n  fwrite(&file_header, sizeof(file_header), 1, fp);\n  fwrite(&bmi, bmi.bmiHeader.biSize, 1, fp);\n  fwrite(buffer, out_len, 1, fp);\n  fclose(fp);\n}\n\nvoid WriteEmf(FPDF_PAGE page, const char* pdf_name, int num) {\n  int width = static_cast<int>(FPDF_GetPageWidth(page));\n  int height = static_cast<int>(FPDF_GetPageHeight(page));\n\n  char filename[256];\n  snprintf(filename, sizeof(filename), \"%s.%d.emf\", pdf_name, num);\n\n  HDC dc = CreateEnhMetaFileA(NULL, filename, NULL, NULL);\n  \n  HRGN rgn = CreateRectRgn(0, 0, width, height); \n  SelectClipRgn(dc, rgn); \n  DeleteObject(rgn);\n\n  SelectObject(dc, GetStockObject(NULL_PEN));\n  SelectObject(dc, GetStockObject(WHITE_BRUSH));\n  // If a PS_NULL pen is used, the dimensions of the rectangle are 1 pixel less.\n  Rectangle(dc, 0, 0, width + 1, height + 1);\n\n  FPDF_RenderPage(dc, page, 0, 0, width, height, 0,\n                  FPDF_ANNOT | FPDF_PRINTING | FPDF_NO_CATCH);\n\n  DeleteEnhMetaFile(CloseEnhMetaFile(dc));\n}\n#endif\n\nint Form_Alert(IPDF_JSPLATFORM*, FPDF_WIDESTRING, FPDF_WIDESTRING, int, int) {\n  printf(\"Form_Alert called.\\n\");\n  return 0;\n}\n\nvoid Unsupported_Handler(UNSUPPORT_INFO*, int type) {\n  std::string feature = \"Unknown\";\n  switch (type) {\n    case FPDF_UNSP_DOC_XFAFORM:\n      feature = \"XFA\";\n      break;\n    case FPDF_UNSP_DOC_PORTABLECOLLECTION:\n      feature = \"Portfolios_Packages\";\n      break;\n    case FPDF_UNSP_DOC_ATTACHMENT:\n    case FPDF_UNSP_ANNOT_ATTACHMENT:\n      feature = \"Attachment\";\n      break;\n    case FPDF_UNSP_DOC_SECURITY:\n      feature = \"Rights_Management\";\n      break;\n    case FPDF_UNSP_DOC_SHAREDREVIEW:\n      feature = \"Shared_Review\";\n      break;\n    case FPDF_UNSP_DOC_SHAREDFORM_ACROBAT:\n    case FPDF_UNSP_DOC_SHAREDFORM_FILESYSTEM:\n    case FPDF_UNSP_DOC_SHAREDFORM_EMAIL:\n      feature = \"Shared_Form\";\n      break;\n    case FPDF_UNSP_ANNOT_3DANNOT:\n      feature = \"3D\";\n      break;\n    case FPDF_UNSP_ANNOT_MOVIE:\n      feature = \"Movie\";\n      break;\n    case FPDF_UNSP_ANNOT_SOUND:\n      feature = \"Sound\";\n      break;\n    case FPDF_UNSP_ANNOT_SCREEN_MEDIA:\n    case FPDF_UNSP_ANNOT_SCREEN_RICHMEDIA:\n      feature = \"Screen\";\n      break;\n    case FPDF_UNSP_ANNOT_SIG:\n      feature = \"Digital_Signature\";\n      break;\n  }\n  printf(\"Unsupported feature: %s.\\n\", feature.c_str());\n}\n\nbool ParseCommandLine(int argc, const char* argv[], OutputFormat* output_format,\n                      std::list<const char*>* files) {\n  *output_format = OUTPUT_NONE;\n  files->clear();\n\n  int cur_arg = 1;\n  if (cur_arg < argc) {\n    if (strcmp(argv[cur_arg], \"--ppm\") == 0)\n      *output_format = OUTPUT_PPM;\n#ifdef _WIN32\n    if (strcmp(argv[cur_arg], \"--emf\") == 0)\n      *output_format = OUTPUT_EMF;\n    if (strcmp(argv[cur_arg], \"--bmp\") == 0)\n      *output_format = OUTPUT_BMP;\n#endif\n    cur_arg++;\n  }\n\n  if (cur_arg >= argc)\n    return false;\n\n  for (int i = cur_arg; i < argc; i++)\n    files->push_back(argv[i]);\n\n  return true;\n}\n\nclass TestLoader {\n public:\n  TestLoader(const char* pBuf, size_t len);\n\n  const char* m_pBuf;\n  size_t m_Len;\n};\n\nTestLoader::TestLoader(const char* pBuf, size_t len)\n    : m_pBuf(pBuf), m_Len(len) {\n}\n\nint Get_Block(void* param, unsigned long pos, unsigned char* pBuf,\n              unsigned long size) {\n  TestLoader* pLoader = (TestLoader*) param;\n  if (pos + size < pos || pos + size > pLoader->m_Len) return 0;\n  memcpy(pBuf, pLoader->m_pBuf + pos, size);\n  return 1;\n}\n\nbool Is_Data_Avail(FX_FILEAVAIL* pThis, size_t offset, size_t size) {\n  return true;\n}\n\nvoid Add_Segment(FX_DOWNLOADHINTS* pThis, size_t offset, size_t size) {\n}\n\nvoid RenderPdf(const char* name, const char* pBuf, size_t len,\n               OutputFormat format) {\n  printf(\"Rendering PDF file %s.\\n\", name);\n\n  IPDF_JSPLATFORM platform_callbacks;\n  memset(&platform_callbacks, '\\0', sizeof(platform_callbacks));\n  platform_callbacks.version = 1;\n  platform_callbacks.app_alert = Form_Alert;\n\n  FPDF_FORMFILLINFO form_callbacks;\n  memset(&form_callbacks, '\\0', sizeof(form_callbacks));\n  form_callbacks.version = 1;\n  form_callbacks.m_pJsPlatform = &platform_callbacks;\n\n  TestLoader loader(pBuf, len);\n\n  FPDF_FILEACCESS file_access;\n  memset(&file_access, '\\0', sizeof(file_access));\n  file_access.m_FileLen = static_cast<unsigned long>(len);\n  file_access.m_GetBlock = Get_Block;\n  file_access.m_Param = &loader;\n\n  FX_FILEAVAIL file_avail;\n  memset(&file_avail, '\\0', sizeof(file_avail));\n  file_avail.version = 1;\n  file_avail.IsDataAvail = Is_Data_Avail;\n\n  FX_DOWNLOADHINTS hints;\n  memset(&hints, '\\0', sizeof(hints));\n  hints.version = 1;\n  hints.AddSegment = Add_Segment;\n\n  FPDF_DOCUMENT doc;\n  FPDF_AVAIL pdf_avail = FPDFAvail_Create(&file_avail, &file_access);\n\n  (void) FPDFAvail_IsDocAvail(pdf_avail, &hints);\n\n  if (!FPDFAvail_IsLinearized(pdf_avail)) {\n    printf(\"Non-linearized path...\\n\");\n    doc = FPDF_LoadCustomDocument(&file_access, NULL);\n  } else {\n    printf(\"Linearized path...\\n\");\n    doc = FPDFAvail_GetDocument(pdf_avail, NULL);\n  }\n\n  (void) FPDF_GetDocPermissions(doc);\n  (void) FPDFAvail_IsFormAvail(pdf_avail, &hints);\n\n  FPDF_FORMHANDLE form = FPDFDOC_InitFormFillEnviroument(doc, &form_callbacks);\n  FPDF_SetFormFieldHighlightColor(form, 0, 0xFFE4DD);\n  FPDF_SetFormFieldHighlightAlpha(form, 100);\n\n  int first_page = FPDFAvail_GetFirstPageNum(doc);\n  (void) FPDFAvail_IsPageAvail(pdf_avail, first_page, &hints);\n\n  int page_count = FPDF_GetPageCount(doc);\n  for (int i = 0; i < page_count; ++i) {\n    (void) FPDFAvail_IsPageAvail(pdf_avail, i, &hints);\n  }\n\n  FORM_DoDocumentJSAction(form);\n  FORM_DoDocumentOpenAction(form);\n\n  for (int i = 0; i < page_count; ++i) {\n    FPDF_PAGE page = FPDF_LoadPage(doc, i);\n    FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page);\n    FORM_OnAfterLoadPage(page, form);\n    FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_OPEN);\n\n    int width = static_cast<int>(FPDF_GetPageWidth(page));\n    int height = static_cast<int>(FPDF_GetPageHeight(page));\n    FPDF_BITMAP bitmap = FPDFBitmap_Create(width, height, 0);\n    FPDFBitmap_FillRect(bitmap, 0, 0, width, height, 0xFFFFFFFF);\n\n    FPDF_RenderPageBitmap(bitmap, page, 0, 0, width, height, 0, 0);\n    FPDF_FFLDraw(form, bitmap, page, 0, 0, width, height, 0, 0);\n    int stride = FPDFBitmap_GetStride(bitmap);\n    const char* buffer =\n        reinterpret_cast<const char*>(FPDFBitmap_GetBuffer(bitmap));\n\n    switch (format) {\n#ifdef _WIN32\n      case OUTPUT_BMP:\n        WriteBmp(name, i, buffer, stride, width, height);\n        break;\n\n      case OUTPUT_EMF:\n        WriteEmf(page, name, i);\n        break;\n#endif\n      case OUTPUT_PPM:\n        WritePpm(name, i, buffer, stride, width, height);\n        break;\n      default:\n        break;\n    }\n\n    FPDFBitmap_Destroy(bitmap);\n\n    FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_CLOSE);\n    FORM_OnBeforeClosePage(page, form);\n    FPDFText_ClosePage(text_page);\n    FPDF_ClosePage(page);\n  }\n\n  FORM_DoDocumentAAction(form, FPDFDOC_AACTION_WC);\n  FPDFDOC_ExitFormFillEnviroument(form);\n  FPDF_CloseDocument(doc);\n  FPDFAvail_Destroy(pdf_avail);\n\n  printf(\"Loaded, parsed and rendered %d pages.\\n\", page_count);\n}\n\nint main(int argc, const char* argv[]) {\n  //v8::V8::InitializeICU();\n  OutputFormat format = OUTPUT_NONE;\n  std::list<const char*> files;\n  if (!ParseCommandLine(argc, argv, &format, &files)) {\n    printf(\"Usage: pdfium_test [OPTIONS] [FILE]\\n\");\n    printf(\"--ppm    write page images <pdf-name>.<page-number>.ppm\\n\");\n#ifdef _WIN32\n    printf(\"--bmp    write page images <pdf-name>.<page-number>.bmp\\n\");\n    printf(\"--emf    write page meta files <pdf-name>.<page-number>.emf\\n\");\n#endif\n    return 1;\n  }\n\n  FPDF_InitLibrary(NULL);\n\n  UNSUPPORT_INFO unsuppored_info;\n  memset(&unsuppored_info, '\\0', sizeof(unsuppored_info));\n  unsuppored_info.version = 1;\n  unsuppored_info.FSDK_UnSupport_Handler = Unsupported_Handler;\n\n  FSDK_SetUnSpObjProcessHandler(&unsuppored_info);\n\n  while (!files.empty()) {\n    const char* filename = files.front();\n    files.pop_front();\n    FILE* file = fopen(filename, \"rb\");\n    if (!file) {\n      fprintf(stderr, \"Failed to open: %s\\n\", filename);\n      continue;\n    }\n    (void) fseek(file, 0, SEEK_END);\n    size_t len = ftell(file);\n    (void) fseek(file, 0, SEEK_SET);\n    char* pBuf = (char*) malloc(len);\n    size_t ret = fread(pBuf, 1, len, file);\n    (void) fclose(file);\n    if (ret != len) {\n      fprintf(stderr, \"Failed to read: %s\\n\", filename);\n    } else {\n      RenderPdf(filename, pBuf, len, format);\n    }\n    free(pBuf);\n  }\n\n  FPDF_DestroyLibrary();\n\n  return 0;\n}\n"
  },
  {
    "path": "samples/samples.gyp",
    "content": "# Copyright 2014 PDFium Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\n{\n  'target_defaults': {\n    'type': 'executable',\n    'dependencies': [\n      '../pdfium.gyp:pdfium',\n    ],\n    'include_dirs': ['<(DEPTH)'],\n  },\n  'targets': [\n    {\n      'target_name': 'pdfium_test',\n      'sources': [\n        'pdfium_test.cc',\n      ],\n    },\n  ],\n}\n"
  },
  {
    "path": "third_party/logging.h",
    "content": "// Copyright (c) 2014 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#ifndef BASE_LOGGING_H_\n#define BASE_LOGGING_H_\n\n#include <stdlib.h>\n\n#define CHECK(condition)                                                \\\n  if (!(condition)) {                                                   \\\n    abort();                                                            \\\n    *(reinterpret_cast<volatile char*>(NULL) + 42) = 0x42;              \\\n  }\n\n#define NOTREACHED() abort()\n\n#endif  // BASE_LOGGING_H_\n"
  },
  {
    "path": "third_party/macros.h",
    "content": "// Copyright 2014 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// This file contains macros and macro-like constructs (e.g., templates) that\n// are commonly used throughout Chromium source. (It may also contain things\n// that are closely related to things that are commonly used that belong in this\n// file.)\n\n#ifndef BASE_MACROS_H_\n#define BASE_MACROS_H_\n\n// The COMPILE_ASSERT macro can be used to verify that a compile time\n// expression is true. For example, you could use it to verify the\n// size of a static array:\n//\n//   COMPILE_ASSERT(ARRAYSIZE_UNSAFE(content_type_names) == CONTENT_NUM_TYPES,\n//                  content_type_names_incorrect_size);\n//\n// or to make sure a struct is smaller than a certain size:\n//\n//   COMPILE_ASSERT(sizeof(foo) < 128, foo_too_large);\n//\n// The second argument to the macro is the name of the variable. If\n// the expression is false, most compilers will issue a warning/error\n// containing the name of the variable.\n\n#undef COMPILE_ASSERT\n\n#if __cplusplus >= 201103L\n\n// Under C++11, just use static_assert.\n#define COMPILE_ASSERT(expr, msg) static_assert(expr, #msg)\n\n#else\n\ntemplate <bool>\nstruct CompileAssert {\n};\n\n// Annotate a variable indicating it's ok if the variable is not used.\n// (Typically used to silence a compiler warning when the assignment\n// is important for some other reason.)\n// Use like:\n//   int x ALLOW_UNUSED = ...;\n#if defined(COMPILER_GCC)\n#define ALLOW_UNUSED __attribute__((unused))\n#else\n#define ALLOW_UNUSED\n#endif\n\n#define COMPILE_ASSERT(expr, msg) \\\n  typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1] ALLOW_UNUSED\n\n// Implementation details of COMPILE_ASSERT:\n//\n// - COMPILE_ASSERT works by defining an array type that has -1\n//   elements (and thus is invalid) when the expression is false.\n//\n// - The simpler definition\n//\n//     #define COMPILE_ASSERT(expr, msg) typedef char msg[(expr) ? 1 : -1]\n//\n//   does not work, as gcc supports variable-length arrays whose sizes\n//   are determined at run-time (this is gcc's extension and not part\n//   of the C++ standard).  As a result, gcc fails to reject the\n//   following code with the simple definition:\n//\n//     int foo;\n//     COMPILE_ASSERT(foo, msg); // not supposed to compile as foo is\n//                               // not a compile-time constant.\n//\n// - By using the type CompileAssert<(bool(expr))>, we ensures that\n//   expr is a compile-time constant.  (Template arguments must be\n//   determined at compile-time.)\n//\n// - The outer parentheses in CompileAssert<(bool(expr))> are necessary\n//   to work around a bug in gcc 3.4.4 and 4.0.1.  If we had written\n//\n//     CompileAssert<bool(expr)>\n//\n//   instead, these compilers will refuse to compile\n//\n//     COMPILE_ASSERT(5 > 0, some_message);\n//\n//   (They seem to think the \">\" in \"5 > 0\" marks the end of the\n//   template argument list.)\n//\n// - The array size is (bool(expr) ? 1 : -1), instead of simply\n//\n//     ((expr) ? 1 : -1).\n//\n//   This is to avoid running into a bug in MS VC 7.1, which\n//   causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.\n\n#endif\n\n#endif  // BASE_MACROS_H_\n"
  },
  {
    "path": "third_party/numerics/OWNERS",
    "content": "jschuh@chromium.org\ntsepez@chromium.org\npalmer@chromium.org\n"
  },
  {
    "path": "third_party/numerics/safe_conversions.h",
    "content": "// Copyright 2014 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#ifndef BASE_SAFE_CONVERSIONS_H_\n#define BASE_SAFE_CONVERSIONS_H_\n\n#include <limits>\n\n#include \"../logging.h\"\n#include \"safe_conversions_impl.h\"\n\nnamespace base {\n\n// Convenience function that returns true if the supplied value is in range\n// for the destination type.\ntemplate <typename Dst, typename Src>\ninline bool IsValueInRangeForNumericType(Src value) {\n  return internal::DstRangeRelationToSrcRange<Dst>(value) ==\n         internal::RANGE_VALID;\n}\n\n// checked_cast<> is analogous to static_cast<> for numeric types,\n// except that it CHECKs that the specified numeric conversion will not\n// overflow or underflow. NaN source will always trigger a CHECK.\ntemplate <typename Dst, typename Src>\ninline Dst checked_cast(Src value) {\n  CHECK(IsValueInRangeForNumericType<Dst>(value));\n  return static_cast<Dst>(value);\n}\n\n// saturated_cast<> is analogous to static_cast<> for numeric types, except\n// that the specified numeric conversion will saturate rather than overflow or\n// underflow. NaN assignment to an integral will trigger a CHECK condition.\ntemplate <typename Dst, typename Src>\ninline Dst saturated_cast(Src value) {\n  // Optimization for floating point values, which already saturate.\n  if (std::numeric_limits<Dst>::is_iec559)\n    return static_cast<Dst>(value);\n\n  switch (internal::DstRangeRelationToSrcRange<Dst>(value)) {\n    case internal::RANGE_VALID:\n      return static_cast<Dst>(value);\n\n    case internal::RANGE_UNDERFLOW:\n      return std::numeric_limits<Dst>::min();\n\n    case internal::RANGE_OVERFLOW:\n      return std::numeric_limits<Dst>::max();\n\n    // Should fail only on attempting to assign NaN to a saturated integer.\n    case internal::RANGE_INVALID:\n      CHECK(false);\n      return std::numeric_limits<Dst>::max();\n  }\n\n  NOTREACHED();\n  return static_cast<Dst>(value);\n}\n\n}  // namespace base\n\n#endif  // BASE_SAFE_CONVERSIONS_H_\n\n"
  },
  {
    "path": "third_party/numerics/safe_conversions_impl.h",
    "content": "// Copyright 2014 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#ifndef BASE_SAFE_CONVERSIONS_IMPL_H_\n#define BASE_SAFE_CONVERSIONS_IMPL_H_\n\n#include <limits>\n\n#include \"../macros.h\"\n#include \"../template_util.h\"\n\nnamespace base {\nnamespace internal {\n\n// The std library doesn't provide a binary max_exponent for integers, however\n// we can compute one by adding one to the number of non-sign bits. This allows\n// for accurate range comparisons between floating point and integer types.\ntemplate <typename NumericType>\nstruct MaxExponent {\n  static const int value = std::numeric_limits<NumericType>::is_iec559\n                               ? std::numeric_limits<NumericType>::max_exponent\n                               : (sizeof(NumericType) * 8 + 1 -\n                                  std::numeric_limits<NumericType>::is_signed);\n};\n\nenum IntegerRepresentation {\n  INTEGER_REPRESENTATION_UNSIGNED,\n  INTEGER_REPRESENTATION_SIGNED\n};\n\n// A range for a given nunmeric Src type is contained for a given numeric Dst\n// type if both numeric_limits<Src>::max() <= numeric_limits<Dst>::max() and\n// numeric_limits<Src>::min() >= numeric_limits<Dst>::min() are true.\n// We implement this as template specializations rather than simple static\n// comparisons to ensure type correctness in our comparisons.\nenum NumericRangeRepresentation {\n  NUMERIC_RANGE_NOT_CONTAINED,\n  NUMERIC_RANGE_CONTAINED\n};\n\n// Helper templates to statically determine if our destination type can contain\n// maximum and minimum values represented by the source type.\n\ntemplate <\n    typename Dst,\n    typename Src,\n    IntegerRepresentation DstSign = std::numeric_limits<Dst>::is_signed\n                                            ? INTEGER_REPRESENTATION_SIGNED\n                                            : INTEGER_REPRESENTATION_UNSIGNED,\n    IntegerRepresentation SrcSign =\n        std::numeric_limits<Src>::is_signed\n            ? INTEGER_REPRESENTATION_SIGNED\n            : INTEGER_REPRESENTATION_UNSIGNED >\nstruct StaticDstRangeRelationToSrcRange;\n\n// Same sign: Dst is guaranteed to contain Src only if its range is equal or\n// larger.\ntemplate <typename Dst, typename Src, IntegerRepresentation Sign>\nstruct StaticDstRangeRelationToSrcRange<Dst, Src, Sign, Sign> {\n  static const NumericRangeRepresentation value =\n      MaxExponent<Dst>::value >= MaxExponent<Src>::value\n          ? NUMERIC_RANGE_CONTAINED\n          : NUMERIC_RANGE_NOT_CONTAINED;\n};\n\n// Unsigned to signed: Dst is guaranteed to contain source only if its range is\n// larger.\ntemplate <typename Dst, typename Src>\nstruct StaticDstRangeRelationToSrcRange<Dst,\n                                        Src,\n                                        INTEGER_REPRESENTATION_SIGNED,\n                                        INTEGER_REPRESENTATION_UNSIGNED> {\n  static const NumericRangeRepresentation value =\n      MaxExponent<Dst>::value > MaxExponent<Src>::value\n          ? NUMERIC_RANGE_CONTAINED\n          : NUMERIC_RANGE_NOT_CONTAINED;\n};\n\n// Signed to unsigned: Dst cannot be statically determined to contain Src.\ntemplate <typename Dst, typename Src>\nstruct StaticDstRangeRelationToSrcRange<Dst,\n                                        Src,\n                                        INTEGER_REPRESENTATION_UNSIGNED,\n                                        INTEGER_REPRESENTATION_SIGNED> {\n  static const NumericRangeRepresentation value = NUMERIC_RANGE_NOT_CONTAINED;\n};\n\nenum RangeConstraint {\n  RANGE_VALID = 0x0,  // Value can be represented by the destination type.\n  RANGE_UNDERFLOW = 0x1,  // Value would overflow.\n  RANGE_OVERFLOW = 0x2,  // Value would underflow.\n  RANGE_INVALID = RANGE_UNDERFLOW | RANGE_OVERFLOW  // Invalid (i.e. NaN).\n};\n\n// Helper function for coercing an int back to a RangeContraint.\ninline RangeConstraint GetRangeConstraint(int integer_range_constraint) {\n  assert(integer_range_constraint >= RANGE_VALID &&\n         integer_range_constraint <= RANGE_INVALID);\n  return static_cast<RangeConstraint>(integer_range_constraint);\n}\n\n// This function creates a RangeConstraint from an upper and lower bound\n// check by taking advantage of the fact that only NaN can be out of range in\n// both directions at once.\ninline RangeConstraint GetRangeConstraint(bool is_in_upper_bound,\n                                   bool is_in_lower_bound) {\n  return GetRangeConstraint((is_in_upper_bound ? 0 : RANGE_OVERFLOW) |\n                            (is_in_lower_bound ? 0 : RANGE_UNDERFLOW));\n}\n\ntemplate <\n    typename Dst,\n    typename Src,\n    IntegerRepresentation DstSign = std::numeric_limits<Dst>::is_signed\n                                            ? INTEGER_REPRESENTATION_SIGNED\n                                            : INTEGER_REPRESENTATION_UNSIGNED,\n    IntegerRepresentation SrcSign = std::numeric_limits<Src>::is_signed\n                                            ? INTEGER_REPRESENTATION_SIGNED\n                                            : INTEGER_REPRESENTATION_UNSIGNED,\n    NumericRangeRepresentation DstRange =\n        StaticDstRangeRelationToSrcRange<Dst, Src>::value >\nstruct DstRangeRelationToSrcRangeImpl;\n\n// The following templates are for ranges that must be verified at runtime. We\n// split it into checks based on signedness to avoid confusing casts and\n// compiler warnings on signed an unsigned comparisons.\n\n// Dst range is statically determined to contain Src: Nothing to check.\ntemplate <typename Dst,\n          typename Src,\n          IntegerRepresentation DstSign,\n          IntegerRepresentation SrcSign>\nstruct DstRangeRelationToSrcRangeImpl<Dst,\n                                      Src,\n                                      DstSign,\n                                      SrcSign,\n                                      NUMERIC_RANGE_CONTAINED> {\n  static RangeConstraint Check(Src value) { return RANGE_VALID; }\n};\n\n// Signed to signed narrowing: Both the upper and lower boundaries may be\n// exceeded.\ntemplate <typename Dst, typename Src>\nstruct DstRangeRelationToSrcRangeImpl<Dst,\n                                      Src,\n                                      INTEGER_REPRESENTATION_SIGNED,\n                                      INTEGER_REPRESENTATION_SIGNED,\n                                      NUMERIC_RANGE_NOT_CONTAINED> {\n  static RangeConstraint Check(Src value) {\n    return std::numeric_limits<Dst>::is_iec559\n               ? GetRangeConstraint(value <= std::numeric_limits<Dst>::max(),\n                                    value >= -std::numeric_limits<Dst>::max())\n               : GetRangeConstraint(value <= std::numeric_limits<Dst>::max(),\n                                    value >= std::numeric_limits<Dst>::min());\n  }\n};\n\n// Unsigned to unsigned narrowing: Only the upper boundary can be exceeded.\ntemplate <typename Dst, typename Src>\nstruct DstRangeRelationToSrcRangeImpl<Dst,\n                                      Src,\n                                      INTEGER_REPRESENTATION_UNSIGNED,\n                                      INTEGER_REPRESENTATION_UNSIGNED,\n                                      NUMERIC_RANGE_NOT_CONTAINED> {\n  static RangeConstraint Check(Src value) {\n    return GetRangeConstraint(value <= std::numeric_limits<Dst>::max(), true);\n  }\n};\n\n// Unsigned to signed: The upper boundary may be exceeded.\ntemplate <typename Dst, typename Src>\nstruct DstRangeRelationToSrcRangeImpl<Dst,\n                                      Src,\n                                      INTEGER_REPRESENTATION_SIGNED,\n                                      INTEGER_REPRESENTATION_UNSIGNED,\n                                      NUMERIC_RANGE_NOT_CONTAINED> {\n  static RangeConstraint Check(Src value) {\n    return sizeof(Dst) > sizeof(Src)\n               ? RANGE_VALID\n               : GetRangeConstraint(\n                     value <= static_cast<Src>(std::numeric_limits<Dst>::max()),\n                     true);\n  }\n};\n\n// Signed to unsigned: The upper boundary may be exceeded for a narrower Dst,\n// and any negative value exceeds the lower boundary.\ntemplate <typename Dst, typename Src>\nstruct DstRangeRelationToSrcRangeImpl<Dst,\n                                      Src,\n                                      INTEGER_REPRESENTATION_UNSIGNED,\n                                      INTEGER_REPRESENTATION_SIGNED,\n                                      NUMERIC_RANGE_NOT_CONTAINED> {\n  static RangeConstraint Check(Src value) {\n    return (MaxExponent<Dst>::value >= MaxExponent<Src>::value)\n               ? GetRangeConstraint(true, value >= static_cast<Src>(0))\n               : GetRangeConstraint(\n                     value <= static_cast<Src>(std::numeric_limits<Dst>::max()),\n                     value >= static_cast<Src>(0));\n  }\n};\n\ntemplate <typename Dst, typename Src>\ninline RangeConstraint DstRangeRelationToSrcRange(Src value) {\n  COMPILE_ASSERT(std::numeric_limits<Src>::is_specialized,\n                 argument_must_be_numeric);\n  COMPILE_ASSERT(std::numeric_limits<Dst>::is_specialized,\n                 result_must_be_numeric);\n  return DstRangeRelationToSrcRangeImpl<Dst, Src>::Check(value);\n}\n\n}  // namespace internal\n}  // namespace base\n\n#endif  // BASE_SAFE_CONVERSIONS_IMPL_H_\n\n"
  },
  {
    "path": "third_party/numerics/safe_math.h",
    "content": "// Copyright 2014 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#ifndef BASE_SAFE_MATH_H_\n#define BASE_SAFE_MATH_H_\n\n#include \"safe_math_impl.h\"\n\nnamespace base {\n\nnamespace internal {\n\n// CheckedNumeric implements all the logic and operators for detecting integer\n// boundary conditions such as overflow, underflow, and invalid conversions.\n// The CheckedNumeric type implicitly converts from floating point and integer\n// data types, and contains overloads for basic arithmetic operations (i.e.: +,\n// -, *, /, %).\n//\n// The following methods convert from CheckedNumeric to standard numeric values:\n// IsValid() - Returns true if the underlying numeric value is valid (i.e. has\n//             has not wrapped and is not the result of an invalid conversion).\n// ValueOrDie() - Returns the underlying value. If the state is not valid this\n//                call will crash on a CHECK.\n// ValueOrDefault() - Returns the current value, or the supplied default if the\n//                    state is not valid.\n// ValueFloating() - Returns the underlying floating point value (valid only\n//                   only for floating point CheckedNumeric types).\n//\n// Bitwise operations are explicitly not supported, because correct\n// handling of some cases (e.g. sign manipulation) is ambiguous. Comparison\n// operations are explicitly not supported because they could result in a crash\n// on a CHECK condition. You should use patterns like the following for these\n// operations:\n// Bitwise operation:\n//     CheckedNumeric<int> checked_int = untrusted_input_value;\n//     int x = checked_int.ValueOrDefault(0) | kFlagValues;\n// Comparison:\n//   CheckedNumeric<size_t> checked_size;\n//   CheckedNumeric<int> checked_size = untrusted_input_value;\n//   checked_size = checked_size + HEADER LENGTH;\n//   if (checked_size.IsValid() && checked_size.ValueOrDie() < buffer_size)\n//     Do stuff...\ntemplate <typename T>\nclass CheckedNumeric {\n public:\n  typedef T type;\n\n  CheckedNumeric() {}\n\n  // Copy constructor.\n  template <typename Src>\n  CheckedNumeric(const CheckedNumeric<Src>& rhs)\n      : state_(rhs.ValueUnsafe(), rhs.validity()) {}\n\n  template <typename Src>\n  CheckedNumeric(Src value, RangeConstraint validity)\n      : state_(value, validity) {}\n\n  // This is not an explicit constructor because we implicitly upgrade regular\n  // numerics to CheckedNumerics to make them easier to use.\n  template <typename Src>\n  CheckedNumeric(Src value)\n      : state_(value) {\n    COMPILE_ASSERT(std::numeric_limits<Src>::is_specialized,\n                   argument_must_be_numeric);\n  }\n\n  // IsValid() is the public API to test if a CheckedNumeric is currently valid.\n  bool IsValid() const { return validity() == RANGE_VALID; }\n\n  // ValueOrDie() The primary accessor for the underlying value. If the current\n  // state is not valid it will CHECK and crash.\n  T ValueOrDie() const {\n    CHECK(IsValid());\n    return state_.value();\n  }\n\n  // ValueOrDefault(T default_value) A convenience method that returns the\n  // current value if the state is valid, and the supplied default_value for\n  // any other state.\n  T ValueOrDefault(T default_value) const {\n    return IsValid() ? state_.value() : default_value;\n  }\n\n  // ValueFloating() - Since floating point values include their validity state,\n  // we provide an easy method for extracting them directly, without a risk of\n  // crashing on a CHECK.\n  T ValueFloating() const {\n    COMPILE_ASSERT(std::numeric_limits<T>::is_iec559, argument_must_be_float);\n    return CheckedNumeric<T>::cast(*this).ValueUnsafe();\n  }\n\n  // validity() - DO NOT USE THIS IN EXTERNAL CODE - It is public right now for\n  // tests and to avoid a big matrix of friend operator overloads. But the\n  // values it returns are likely to change in the future.\n  // Returns: current validity state (i.e. valid, overflow, underflow, nan).\n  // TODO(jschuh): crbug.com/332611 Figure out and implement semantics for\n  // saturation/wrapping so we can expose this state consistently and implement\n  // saturated arithmetic.\n  RangeConstraint validity() const { return state_.validity(); }\n\n  // ValueUnsafe() - DO NOT USE THIS IN EXTERNAL CODE - It is public right now\n  // for tests and to avoid a big matrix of friend operator overloads. But the\n  // values it returns are likely to change in the future.\n  // Returns: the raw numeric value, regardless of the current state.\n  // TODO(jschuh): crbug.com/332611 Figure out and implement semantics for\n  // saturation/wrapping so we can expose this state consistently and implement\n  // saturated arithmetic.\n  T ValueUnsafe() const { return state_.value(); }\n\n  // Prototypes for the supported arithmetic operator overloads.\n  template <typename Src> CheckedNumeric& operator+=(Src rhs);\n  template <typename Src> CheckedNumeric& operator-=(Src rhs);\n  template <typename Src> CheckedNumeric& operator*=(Src rhs);\n  template <typename Src> CheckedNumeric& operator/=(Src rhs);\n  template <typename Src> CheckedNumeric& operator%=(Src rhs);\n\n  CheckedNumeric operator-() const {\n    RangeConstraint validity;\n    T value = CheckedNeg(state_.value(), &validity);\n    // Negation is always valid for floating point.\n    if (std::numeric_limits<T>::is_iec559)\n      return CheckedNumeric<T>(value);\n\n    validity = GetRangeConstraint(state_.validity() | validity);\n    return CheckedNumeric<T>(value, validity);\n  }\n\n  CheckedNumeric Abs() const {\n    RangeConstraint validity;\n    T value = CheckedAbs(state_.value(), &validity);\n    // Absolute value is always valid for floating point.\n    if (std::numeric_limits<T>::is_iec559)\n      return CheckedNumeric<T>(value);\n\n    validity = GetRangeConstraint(state_.validity() | validity);\n    return CheckedNumeric<T>(value, validity);\n  }\n\n  CheckedNumeric& operator++() {\n    *this += 1;\n    return *this;\n  }\n\n  CheckedNumeric operator++(int) {\n    CheckedNumeric value = *this;\n    *this += 1;\n    return value;\n  }\n\n  CheckedNumeric& operator--() {\n    *this -= 1;\n    return *this;\n  }\n\n  CheckedNumeric operator--(int) {\n    CheckedNumeric value = *this;\n    *this -= 1;\n    return value;\n  }\n\n  // These static methods behave like a convenience cast operator targeting\n  // the desired CheckedNumeric type. As an optimization, a reference is\n  // returned when Src is the same type as T.\n  template <typename Src>\n  static CheckedNumeric<T> cast(\n      Src u,\n      typename enable_if<std::numeric_limits<Src>::is_specialized, int>::type =\n          0) {\n    return u;\n  }\n\n  template <typename Src>\n  static CheckedNumeric<T> cast(\n      const CheckedNumeric<Src>& u,\n      typename enable_if<!is_same<Src, T>::value, int>::type = 0) {\n    return u;\n  }\n\n  static const CheckedNumeric<T>& cast(const CheckedNumeric<T>& u) { return u; }\n\n private:\n  CheckedNumericState<T> state_;\n};\n\n// This is the boilerplate for the standard arithmetic operator overloads. A\n// macro isn't the prettiest solution, but it beats rewriting these five times.\n// Some details worth noting are:\n//  * We apply the standard arithmetic promotions.\n//  * We skip range checks for floating points.\n//  * We skip range checks for destination integers with sufficient range.\n// TODO(jschuh): extract these out into templates.\n#define BASE_NUMERIC_ARITHMETIC_OPERATORS(NAME, OP, COMPOUND_OP)              \\\n  /* Binary arithmetic operator for CheckedNumerics of the same type. */      \\\n  template <typename T>                                                       \\\n  CheckedNumeric<typename ArithmeticPromotion<T>::type> operator OP(          \\\n      const CheckedNumeric<T>& lhs, const CheckedNumeric<T>& rhs) {           \\\n    typedef typename ArithmeticPromotion<T>::type Promotion;                  \\\n    /* Floating point always takes the fast path */                           \\\n    if (std::numeric_limits<T>::is_iec559)                                    \\\n      return CheckedNumeric<T>(lhs.ValueUnsafe() OP rhs.ValueUnsafe());       \\\n    if (IsIntegerArithmeticSafe<Promotion, T, T>::value)                      \\\n      return CheckedNumeric<Promotion>(                                       \\\n          lhs.ValueUnsafe() OP rhs.ValueUnsafe(),                             \\\n          GetRangeConstraint(rhs.validity() | lhs.validity()));               \\\n    RangeConstraint validity = RANGE_VALID;                                   \\\n    T result = Checked##NAME(static_cast<Promotion>(lhs.ValueUnsafe()),       \\\n                             static_cast<Promotion>(rhs.ValueUnsafe()),       \\\n                             &validity);                                      \\\n    return CheckedNumeric<Promotion>(                                         \\\n        result,                                                               \\\n        GetRangeConstraint(validity | lhs.validity() | rhs.validity()));      \\\n  }                                                                           \\\n  /* Assignment arithmetic operator implementation from CheckedNumeric. */    \\\n  template <typename T>                                                       \\\n  template <typename Src>                                                     \\\n  CheckedNumeric<T>& CheckedNumeric<T>::operator COMPOUND_OP(Src rhs) {       \\\n    *this = CheckedNumeric<T>::cast(*this) OP CheckedNumeric<Src>::cast(rhs); \\\n    return *this;                                                             \\\n  }                                                                           \\\n  /* Binary arithmetic operator for CheckedNumeric of different type. */      \\\n  template <typename T, typename Src>                                         \\\n  CheckedNumeric<typename ArithmeticPromotion<T, Src>::type> operator OP(     \\\n      const CheckedNumeric<Src>& lhs, const CheckedNumeric<T>& rhs) {         \\\n    typedef typename ArithmeticPromotion<T, Src>::type Promotion;             \\\n    if (IsIntegerArithmeticSafe<Promotion, T, Src>::value)                    \\\n      return CheckedNumeric<Promotion>(                                       \\\n          lhs.ValueUnsafe() OP rhs.ValueUnsafe(),                             \\\n          GetRangeConstraint(rhs.validity() | lhs.validity()));               \\\n    return CheckedNumeric<Promotion>::cast(lhs)                               \\\n        OP CheckedNumeric<Promotion>::cast(rhs);                              \\\n  }                                                                           \\\n  /* Binary arithmetic operator for left CheckedNumeric and right numeric. */ \\\n  template <typename T, typename Src>                                         \\\n  CheckedNumeric<typename ArithmeticPromotion<T, Src>::type> operator OP(     \\\n      const CheckedNumeric<T>& lhs, Src rhs) {                                \\\n    typedef typename ArithmeticPromotion<T, Src>::type Promotion;             \\\n    if (IsIntegerArithmeticSafe<Promotion, T, Src>::value)                    \\\n      return CheckedNumeric<Promotion>(lhs.ValueUnsafe() OP rhs,              \\\n                                       lhs.validity());                       \\\n    return CheckedNumeric<Promotion>::cast(lhs)                               \\\n        OP CheckedNumeric<Promotion>::cast(rhs);                              \\\n  }                                                                           \\\n  /* Binary arithmetic operator for right numeric and left CheckedNumeric. */ \\\n  template <typename T, typename Src>                                         \\\n  CheckedNumeric<typename ArithmeticPromotion<T, Src>::type> operator OP(     \\\n      Src lhs, const CheckedNumeric<T>& rhs) {                                \\\n    typedef typename ArithmeticPromotion<T, Src>::type Promotion;             \\\n    if (IsIntegerArithmeticSafe<Promotion, T, Src>::value)                    \\\n      return CheckedNumeric<Promotion>(lhs OP rhs.ValueUnsafe(),              \\\n                                       rhs.validity());                       \\\n    return CheckedNumeric<Promotion>::cast(lhs)                               \\\n        OP CheckedNumeric<Promotion>::cast(rhs);                              \\\n  }\n\nBASE_NUMERIC_ARITHMETIC_OPERATORS(Add, +, += )\nBASE_NUMERIC_ARITHMETIC_OPERATORS(Sub, -, -= )\nBASE_NUMERIC_ARITHMETIC_OPERATORS(Mul, *, *= )\nBASE_NUMERIC_ARITHMETIC_OPERATORS(Div, /, /= )\nBASE_NUMERIC_ARITHMETIC_OPERATORS(Mod, %, %= )\n\n#undef BASE_NUMERIC_ARITHMETIC_OPERATORS\n\n}  // namespace internal\n\nusing internal::CheckedNumeric;\n\n}  // namespace base\n\n#endif  // BASE_SAFE_MATH_H_\n"
  },
  {
    "path": "third_party/numerics/safe_math_impl.h",
    "content": "// Copyright 2014 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#ifndef SAFE_MATH_IMPL_H_\n#define SAFE_MATH_IMPL_H_\n\n#include <stdint.h>\n\n#include <cmath>\n#include <cstdlib>\n#include <limits>\n\n#include \"../macros.h\"\n#include \"../template_util.h\"\n#include \"safe_conversions.h\"\n\nnamespace base {\nnamespace internal {\n\n// Everything from here up to the floating point operations is portable C++,\n// but it may not be fast. This code could be split based on\n// platform/architecture and replaced with potentially faster implementations.\n\n// Integer promotion templates used by the portable checked integer arithmetic.\ntemplate <size_t Size, bool IsSigned>\nstruct IntegerForSizeAndSign;\ntemplate <>\nstruct IntegerForSizeAndSign<1, true> {\n  typedef int8_t type;\n};\ntemplate <>\nstruct IntegerForSizeAndSign<1, false> {\n  typedef uint8_t type;\n};\ntemplate <>\nstruct IntegerForSizeAndSign<2, true> {\n  typedef int16_t type;\n};\ntemplate <>\nstruct IntegerForSizeAndSign<2, false> {\n  typedef uint16_t type;\n};\ntemplate <>\nstruct IntegerForSizeAndSign<4, true> {\n  typedef int32_t type;\n};\ntemplate <>\nstruct IntegerForSizeAndSign<4, false> {\n  typedef uint32_t type;\n};\ntemplate <>\nstruct IntegerForSizeAndSign<8, true> {\n  typedef int64_t type;\n};\ntemplate <>\nstruct IntegerForSizeAndSign<8, false> {\n  typedef uint64_t type;\n};\n\n// WARNING: We have no IntegerForSizeAndSign<16, *>. If we ever add one to\n// support 128-bit math, then the ArithmeticPromotion template below will need\n// to be updated (or more likely replaced with a decltype expression).\n\ntemplate <typename Integer>\nstruct UnsignedIntegerForSize {\n  typedef typename enable_if<\n      std::numeric_limits<Integer>::is_integer,\n      typename IntegerForSizeAndSign<sizeof(Integer), false>::type>::type type;\n};\n\ntemplate <typename Integer>\nstruct SignedIntegerForSize {\n  typedef typename enable_if<\n      std::numeric_limits<Integer>::is_integer,\n      typename IntegerForSizeAndSign<sizeof(Integer), true>::type>::type type;\n};\n\ntemplate <typename Integer>\nstruct TwiceWiderInteger {\n  typedef typename enable_if<\n      std::numeric_limits<Integer>::is_integer,\n      typename IntegerForSizeAndSign<\n          sizeof(Integer) * 2,\n          std::numeric_limits<Integer>::is_signed>::type>::type type;\n};\n\ntemplate <typename Integer>\nstruct PositionOfSignBit {\n  static const typename enable_if<std::numeric_limits<Integer>::is_integer,\n                                  size_t>::type value = 8 * sizeof(Integer) - 1;\n};\n\n// Helper templates for integer manipulations.\n\ntemplate <typename T>\nbool HasSignBit(T x) {\n  // Cast to unsigned since right shift on signed is undefined.\n  return !!(static_cast<typename UnsignedIntegerForSize<T>::type>(x) >>\n            PositionOfSignBit<T>::value);\n}\n\n// This wrapper undoes the standard integer promotions.\ntemplate <typename T>\nT BinaryComplement(T x) {\n  return ~x;\n}\n\n// Here are the actual portable checked integer math implementations.\n// TODO(jschuh): Break this code out from the enable_if pattern and find a clean\n// way to coalesce things into the CheckedNumericState specializations below.\n\ntemplate <typename T>\ntypename enable_if<std::numeric_limits<T>::is_integer, T>::type\nCheckedAdd(T x, T y, RangeConstraint* validity) {\n  // Since the value of x+y is undefined if we have a signed type, we compute\n  // it using the unsigned type of the same size.\n  typedef typename UnsignedIntegerForSize<T>::type UnsignedDst;\n  UnsignedDst ux = static_cast<UnsignedDst>(x);\n  UnsignedDst uy = static_cast<UnsignedDst>(y);\n  UnsignedDst uresult = ux + uy;\n  // Addition is valid if the sign of (x + y) is equal to either that of x or\n  // that of y.\n  if (std::numeric_limits<T>::is_signed) {\n    if (HasSignBit(BinaryComplement((uresult ^ ux) & (uresult ^ uy))))\n      *validity = RANGE_VALID;\n    else  // Direction of wrap is inverse of result sign.\n      *validity = HasSignBit(uresult) ? RANGE_OVERFLOW : RANGE_UNDERFLOW;\n\n  } else {  // Unsigned is either valid or overflow.\n    *validity = BinaryComplement(x) >= y ? RANGE_VALID : RANGE_OVERFLOW;\n  }\n  return static_cast<T>(uresult);\n}\n\ntemplate <typename T>\ntypename enable_if<std::numeric_limits<T>::is_integer, T>::type\nCheckedSub(T x, T y, RangeConstraint* validity) {\n  // Since the value of x+y is undefined if we have a signed type, we compute\n  // it using the unsigned type of the same size.\n  typedef typename UnsignedIntegerForSize<T>::type UnsignedDst;\n  UnsignedDst ux = static_cast<UnsignedDst>(x);\n  UnsignedDst uy = static_cast<UnsignedDst>(y);\n  UnsignedDst uresult = ux - uy;\n  // Subtraction is valid if either x and y have same sign, or (x-y) and x have\n  // the same sign.\n  if (std::numeric_limits<T>::is_signed) {\n    if (HasSignBit(BinaryComplement((uresult ^ ux) & (ux ^ uy))))\n      *validity = RANGE_VALID;\n    else  // Direction of wrap is inverse of result sign.\n      *validity = HasSignBit(uresult) ? RANGE_OVERFLOW : RANGE_UNDERFLOW;\n\n  } else {  // Unsigned is either valid or underflow.\n    *validity = x >= y ? RANGE_VALID : RANGE_UNDERFLOW;\n  }\n  return static_cast<T>(uresult);\n}\n\n// Integer multiplication is a bit complicated. In the fast case we just\n// we just promote to a twice wider type, and range check the result. In the\n// slow case we need to manually check that the result won't be truncated by\n// checking with division against the appropriate bound.\ntemplate <typename T>\ntypename enable_if<\n    std::numeric_limits<T>::is_integer && sizeof(T) * 2 <= sizeof(uintmax_t),\n    T>::type\nCheckedMul(T x, T y, RangeConstraint* validity) {\n  typedef typename TwiceWiderInteger<T>::type IntermediateType;\n  IntermediateType tmp =\n      static_cast<IntermediateType>(x) * static_cast<IntermediateType>(y);\n  *validity = DstRangeRelationToSrcRange<T>(tmp);\n  return static_cast<T>(tmp);\n}\n\ntemplate <typename T>\ntypename enable_if<std::numeric_limits<T>::is_integer&& std::numeric_limits<\n                       T>::is_signed&&(sizeof(T) * 2 > sizeof(uintmax_t)),\n                   T>::type\nCheckedMul(T x, T y, RangeConstraint* validity) {\n  // if either side is zero then the result will be zero.\n  if (!(x || y)) {\n    return RANGE_VALID;\n\n  } else if (x > 0) {\n    if (y > 0)\n      *validity =\n          x <= std::numeric_limits<T>::max() / y ? RANGE_VALID : RANGE_OVERFLOW;\n    else\n      *validity = y >= std::numeric_limits<T>::min() / x ? RANGE_VALID\n                                                         : RANGE_UNDERFLOW;\n\n  } else {\n    if (y > 0)\n      *validity = x >= std::numeric_limits<T>::min() / y ? RANGE_VALID\n                                                         : RANGE_UNDERFLOW;\n    else\n      *validity =\n          y >= std::numeric_limits<T>::max() / x ? RANGE_VALID : RANGE_OVERFLOW;\n  }\n\n  return x * y;\n}\n\ntemplate <typename T>\ntypename enable_if<std::numeric_limits<T>::is_integer &&\n                       !std::numeric_limits<T>::is_signed &&\n                       (sizeof(T) * 2 > sizeof(uintmax_t)),\n                   T>::type\nCheckedMul(T x, T y, RangeConstraint* validity) {\n  *validity = (y == 0 || x <= std::numeric_limits<T>::max() / y)\n                  ? RANGE_VALID\n                  : RANGE_OVERFLOW;\n  return x * y;\n}\n\n// Division just requires a check for an invalid negation on signed min/-1.\ntemplate <typename T>\nT CheckedDiv(\n    T x,\n    T y,\n    RangeConstraint* validity,\n    typename enable_if<std::numeric_limits<T>::is_integer, int>::type = 0) {\n  if (std::numeric_limits<T>::is_signed && x == std::numeric_limits<T>::min() &&\n      y == static_cast<T>(-1)) {\n    *validity = RANGE_OVERFLOW;\n    return std::numeric_limits<T>::min();\n  }\n\n  *validity = RANGE_VALID;\n  return x / y;\n}\n\ntemplate <typename T>\ntypename enable_if<\n    std::numeric_limits<T>::is_integer&& std::numeric_limits<T>::is_signed,\n    T>::type\nCheckedMod(T x, T y, RangeConstraint* validity) {\n  *validity = y > 0 ? RANGE_VALID : RANGE_INVALID;\n  return x % y;\n}\n\ntemplate <typename T>\ntypename enable_if<\n    std::numeric_limits<T>::is_integer && !std::numeric_limits<T>::is_signed,\n    T>::type\nCheckedMod(T x, T y, RangeConstraint* validity) {\n  *validity = RANGE_VALID;\n  return x % y;\n}\n\ntemplate <typename T>\ntypename enable_if<\n    std::numeric_limits<T>::is_integer&& std::numeric_limits<T>::is_signed,\n    T>::type\nCheckedNeg(T value, RangeConstraint* validity) {\n  *validity =\n      value != std::numeric_limits<T>::min() ? RANGE_VALID : RANGE_OVERFLOW;\n  // The negation of signed min is min, so catch that one.\n  return -value;\n}\n\ntemplate <typename T>\ntypename enable_if<\n    std::numeric_limits<T>::is_integer && !std::numeric_limits<T>::is_signed,\n    T>::type\nCheckedNeg(T value, RangeConstraint* validity) {\n  // The only legal unsigned negation is zero.\n  *validity = value ? RANGE_UNDERFLOW : RANGE_VALID;\n  return static_cast<T>(\n      -static_cast<typename SignedIntegerForSize<T>::type>(value));\n}\n\ntemplate <typename T>\ntypename enable_if<\n    std::numeric_limits<T>::is_integer&& std::numeric_limits<T>::is_signed,\n    T>::type\nCheckedAbs(T value, RangeConstraint* validity) {\n  *validity =\n      value != std::numeric_limits<T>::min() ? RANGE_VALID : RANGE_OVERFLOW;\n  return std::abs(value);\n}\n\ntemplate <typename T>\ntypename enable_if<\n    std::numeric_limits<T>::is_integer && !std::numeric_limits<T>::is_signed,\n    T>::type\nCheckedAbs(T value, RangeConstraint* validity) {\n  // Absolute value of a positive is just its identiy.\n  *validity = RANGE_VALID;\n  return value;\n}\n\n// These are the floating point stubs that the compiler needs to see. Only the\n// negation operation is ever called.\n#define BASE_FLOAT_ARITHMETIC_STUBS(NAME)                        \\\n  template <typename T>                                          \\\n  typename enable_if<std::numeric_limits<T>::is_iec559, T>::type \\\n  Checked##NAME(T, T, RangeConstraint*) {                        \\\n    NOTREACHED();                                                \\\n    return 0;                                                    \\\n  }\n\nBASE_FLOAT_ARITHMETIC_STUBS(Add)\nBASE_FLOAT_ARITHMETIC_STUBS(Sub)\nBASE_FLOAT_ARITHMETIC_STUBS(Mul)\nBASE_FLOAT_ARITHMETIC_STUBS(Div)\nBASE_FLOAT_ARITHMETIC_STUBS(Mod)\n\n#undef BASE_FLOAT_ARITHMETIC_STUBS\n\ntemplate <typename T>\ntypename enable_if<std::numeric_limits<T>::is_iec559, T>::type CheckedNeg(\n    T value,\n    RangeConstraint*) {\n  return -value;\n}\n\ntemplate <typename T>\ntypename enable_if<std::numeric_limits<T>::is_iec559, T>::type CheckedAbs(\n    T value,\n    RangeConstraint*) {\n  return std::abs(value);\n}\n\n// Floats carry around their validity state with them, but integers do not. So,\n// we wrap the underlying value in a specialization in order to hide that detail\n// and expose an interface via accessors.\nenum NumericRepresentation {\n  NUMERIC_INTEGER,\n  NUMERIC_FLOATING,\n  NUMERIC_UNKNOWN\n};\n\ntemplate <typename NumericType>\nstruct GetNumericRepresentation {\n  static const NumericRepresentation value =\n      std::numeric_limits<NumericType>::is_integer\n          ? NUMERIC_INTEGER\n          : (std::numeric_limits<NumericType>::is_iec559 ? NUMERIC_FLOATING\n                                                         : NUMERIC_UNKNOWN);\n};\n\ntemplate <typename T, NumericRepresentation type =\n                          GetNumericRepresentation<T>::value>\nclass CheckedNumericState {};\n\n// Integrals require quite a bit of additional housekeeping to manage state.\ntemplate <typename T>\nclass CheckedNumericState<T, NUMERIC_INTEGER> {\n private:\n  T value_;\n  RangeConstraint validity_;\n\n public:\n  template <typename Src, NumericRepresentation type>\n  friend class CheckedNumericState;\n\n  CheckedNumericState() : value_(0), validity_(RANGE_VALID) {}\n\n  template <typename Src>\n  CheckedNumericState(Src value, RangeConstraint validity)\n      : value_(value),\n        validity_(GetRangeConstraint(validity |\n                                     DstRangeRelationToSrcRange<T>(value))) {\n    COMPILE_ASSERT(std::numeric_limits<Src>::is_specialized,\n                   argument_must_be_numeric);\n  }\n\n  // Copy constructor.\n  template <typename Src>\n  CheckedNumericState(const CheckedNumericState<Src>& rhs)\n      : value_(static_cast<T>(rhs.value())),\n        validity_(GetRangeConstraint(\n            rhs.validity() | DstRangeRelationToSrcRange<T>(rhs.value()))) {}\n\n  template <typename Src>\n  explicit CheckedNumericState(\n      Src value,\n      typename enable_if<std::numeric_limits<Src>::is_specialized, int>::type =\n          0)\n      : value_(static_cast<T>(value)),\n        validity_(DstRangeRelationToSrcRange<T>(value)) {}\n\n  RangeConstraint validity() const { return validity_; }\n  T value() const { return value_; }\n};\n\n// Floating points maintain their own validity, but need translation wrappers.\ntemplate <typename T>\nclass CheckedNumericState<T, NUMERIC_FLOATING> {\n private:\n  T value_;\n\n public:\n  template <typename Src, NumericRepresentation type>\n  friend class CheckedNumericState;\n\n  CheckedNumericState() : value_(0.0) {}\n\n  template <typename Src>\n  CheckedNumericState(\n      Src value,\n      RangeConstraint validity,\n      typename enable_if<std::numeric_limits<Src>::is_integer, int>::type = 0) {\n    switch (DstRangeRelationToSrcRange<T>(value)) {\n      case RANGE_VALID:\n        value_ = static_cast<T>(value);\n        break;\n\n      case RANGE_UNDERFLOW:\n        value_ = -std::numeric_limits<T>::infinity();\n        break;\n\n      case RANGE_OVERFLOW:\n        value_ = std::numeric_limits<T>::infinity();\n        break;\n\n      case RANGE_INVALID:\n        value_ = std::numeric_limits<T>::quiet_NaN();\n        break;\n\n      default:\n        NOTREACHED();\n    }\n  }\n\n  template <typename Src>\n  explicit CheckedNumericState(\n      Src value,\n      typename enable_if<std::numeric_limits<Src>::is_specialized, int>::type =\n          0)\n      : value_(static_cast<T>(value)) {}\n\n  // Copy constructor.\n  template <typename Src>\n  CheckedNumericState(const CheckedNumericState<Src>& rhs)\n      : value_(static_cast<T>(rhs.value())) {}\n\n  RangeConstraint validity() const {\n    return GetRangeConstraint(value_ <= std::numeric_limits<T>::max(),\n                              value_ >= -std::numeric_limits<T>::max());\n  }\n  T value() const { return value_; }\n};\n\n// For integers less than 128-bit and floats 32-bit or larger, we can distil\n// C/C++ arithmetic promotions down to two simple rules:\n// 1. The type with the larger maximum exponent always takes precedence.\n// 2. The resulting type must be promoted to at least an int.\n// The following template specializations implement that promotion logic.\nenum ArithmeticPromotionCategory {\n  LEFT_PROMOTION,\n  RIGHT_PROMOTION,\n  DEFAULT_PROMOTION\n};\n\ntemplate <typename Lhs,\n          typename Rhs = Lhs,\n          ArithmeticPromotionCategory Promotion =\n              (MaxExponent<Lhs>::value > MaxExponent<Rhs>::value)\n                  ? (MaxExponent<Lhs>::value > MaxExponent<int>::value\n                         ? LEFT_PROMOTION\n                         : DEFAULT_PROMOTION)\n                  : (MaxExponent<Rhs>::value > MaxExponent<int>::value\n                         ? RIGHT_PROMOTION\n                         : DEFAULT_PROMOTION) >\nstruct ArithmeticPromotion;\n\ntemplate <typename Lhs, typename Rhs>\nstruct ArithmeticPromotion<Lhs, Rhs, LEFT_PROMOTION> {\n  typedef Lhs type;\n};\n\ntemplate <typename Lhs, typename Rhs>\nstruct ArithmeticPromotion<Lhs, Rhs, RIGHT_PROMOTION> {\n  typedef Rhs type;\n};\n\ntemplate <typename Lhs, typename Rhs>\nstruct ArithmeticPromotion<Lhs, Rhs, DEFAULT_PROMOTION> {\n  typedef int type;\n};\n\n// We can statically check if operations on the provided types can wrap, so we\n// can skip the checked operations if they're not needed. So, for an integer we\n// care if the destination type preserves the sign and is twice the width of\n// the source.\ntemplate <typename T, typename Lhs, typename Rhs>\nstruct IsIntegerArithmeticSafe {\n  static const bool value = !std::numeric_limits<T>::is_iec559 &&\n                            StaticDstRangeRelationToSrcRange<T, Lhs>::value ==\n                                NUMERIC_RANGE_CONTAINED &&\n                            sizeof(T) >= (2 * sizeof(Lhs)) &&\n                            StaticDstRangeRelationToSrcRange<T, Rhs>::value !=\n                                NUMERIC_RANGE_CONTAINED &&\n                            sizeof(T) >= (2 * sizeof(Rhs));\n};\n\n}  // namespace internal\n}  // namespace base\n\n#endif  // SAFE_MATH_IMPL_H_\n"
  },
  {
    "path": "third_party/template_util.h",
    "content": "// Copyright (c) 2011 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#ifndef BASE_TEMPLATE_UTIL_H_\n#define BASE_TEMPLATE_UTIL_H_\n\n#include <cstddef>  // For size_t.\n\nnamespace base {\n\ntemplate<class T, T v>\nstruct integral_constant {\n  static const T value = v;\n  typedef T value_type;\n  typedef integral_constant<T, v> type;\n};\n\ntypedef integral_constant<bool, true> true_type;\ntypedef integral_constant<bool, false> false_type;\n\ntemplate <class T, class U> struct is_same : public false_type {};\ntemplate <class T> struct is_same<T,T> : true_type {};\n\ntemplate<bool B, class T = void>\nstruct enable_if {};\n\ntemplate<class T>\nstruct enable_if<true, T> { typedef T type; };\n\n}  // namespace base\n\n#endif  // BASE_TEMPLATE_UTIL_H_\n"
  },
  {
    "path": "web/index.html",
    "content": "<!doctype html>\n<!--  vim: set sw=2 ts=2 et : --> \n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n    <title></title>\n    <link rel=\"stylesheet\" href=\"//netdna.bootstrapcdn.com/bootstrap/3.0.2/css/bootstrap.min.css\">\n    <link rel=\"stylesheet\" href=\"//netdna.bootstrapcdn.com/bootstrap/3.0.2/css/bootstrap-theme.min.css\">\n    <link rel=\"stylesheet\" href=\"pdfium.css\">\n  </head>\n  <body>\n    <div id=\"header\" class=\"container\">\n    <a href=\"https://github.com/coolwanglu/PDFium.js\"><img style=\"position: absolute; top: 0; right: 0; border: 0;\" src=\"https://s3.amazonaws.com/github/ribbons/forkme_right_orange_ff7600.png\" alt=\"Fork me on GitHub\"></a>\n      <div class=\"jumbotron\">\n        <h3>PDFium.js</h3>\n        <h6>by <a target=\"_blank\" href=\"http://coolwanglu.github.io/\">Lu Wang</a> 2014</h6>\n      </div>\n      <input id=\"input-pdf\" type=\"file\" class=\"small\">\n      <p id=\"loading-msg\">Loading...</p>\n      <p id=\"memory-msg\"></p>\n    </div>\n    <div id=\"main\" class=\"container\">\n      <div id=\"render\" class=\"container\">\n      </div>\n    </div>\n    <script>\n      var hashParams = (function() {\n        var search = document.location.search.substring(1);\n        var parts = search.split('&');\n        var params = {};\n        for(var i = 0, l = parts.length; i < l; ++i) {\n          var param = parts[i].split('=');\n          var key = param[0];\n          var value = param.length > 1 ? param[1] : null;\n          params[decodeURIComponent(key)] = decodeURIComponent(value);\n        }\n        return params;\n      })();\n      var total_memory = ('total_memory' in hashParams) ? parseInt(hashParams['total_memory']) : 1024*1024*100;\n      var Module = {\n        TOTAL_MEMORY: total_memory,\n        noExitRuntime: true,\n        print: function() { \n            console.group.apply(console, arguments); \n            console.groupEnd();\n        },\n        printErr: function() { \n            console.group.apply(console, arguments); \n            console.groupEnd();\n        },\n        _main: function () {\n          var canvas_list = [];\n          var devicePixelRatio = window.devicePixelRatio;\n          var timer = null;\n\n          var loading_msg = document.getElementById('loading-msg');\n          loading_msg.parentNode.removeChild(loading_msg);\n          enlargeMemory = function() {\n            document.getElementById('memory-msg').innerHTML = 'Input file is too large, try to allocate more memory like <a href=\"?total_memory=' + total_memory * 2 +'\">this</a>.';\n            abort();\n          };\n\nif (typeof PDFiumJS === 'undefined') {\n  (typeof window !== 'undefined' ? window : this).PDFiumJS = {};\n}\n\nvar crawp = Module['crap'];\nPDFiumJS.C = {\n  init: cwrap('PDFiumJS_init', null, []),\n  Doc_new: cwrap('PDFiumJS_Doc_new', 'number', ['number', 'number']),\n  Doc_delete: cwrap('PDFiumJS_Doc_delete', null, ['number']),\n  Doc_get_page_count: cwrap('PDFiumJS_Doc_get_page_count', 'number', ['number']),\n  Doc_get_page: cwrap('PDFiumJS_Doc_get_page', 'number', ['number', 'number']),\n  Page_get_width: cwrap('PDFiumJS_Page_get_width', 'number', ['number']),\n  Page_get_height: cwrap('PDFiumJS_Page_get_height', 'number', ['number']),\n  Page_get_bitmap: cwrap('PDFiumJS_Page_get_bitmap', 'number', ['number']),\n  Bitmap_get_buffer: cwrap('PDFiumJS_Bitmap_get_buffer', 'number', ['number']),\n  Bitmap_get_stride: cwrap('PDFiumJS_Bitmap_get_stride', 'number', ['number']),\n  Bitmap_destroy: cwrap('PDFiumJS_Bitmap_destroy', null, ['number']),\n  Page_destroy: cwrap('PDFiumJS_Page_destroy', null, ['number']),\n};\n          PDFiumJS.C.init();\n\n          PDFiumJS.opened_files = [];\n          var cur_doc = null;\n          var cur_file_id = 0;\n\n          var inputE = document.getElementById('input-pdf');\n          inputE.style.display = 'block';\n          inputE.addEventListener('change', function(e) {\n            var files = e.target.files;\n            if(files.length == 0)\n              return;\n            var reader = new FileReader();\n            reader.onload = function(e) {\n              var buf = new Uint8Array(e.target.result); \n              if(cur_doc) {\n                PDFiumJS.C.Doc_delete(cur_doc);\n                PDFiumJS.opened_files[cur_file_id] = null;\n              }\n              cur_file_id = PDFiumJS.opened_files.length;\n              PDFiumJS.opened_files[cur_file_id] = buf;\n              cur_doc = PDFiumJS.C.Doc_new(cur_file_id, buf.length);\n              var page_count = PDFiumJS.C.Doc_get_page_count(cur_doc);\n              canvas_list.length = 0;\n              var renderE = document.getElementById('render');\n              renderE.innerHTML='';\n              for(var i = 0; i < page_count; ++i) {\n                var e = document.createElement('canvas');\n                canvas_list.push(e);\n                renderE.appendChild(e);\n              }\n\n              var cur_page = 0;\n              function render_next_page() {\n                if(cur_page == page_count) return;\n                try {\n                  var start_time = Date.now();\n\n                  var canvas = canvas_list[cur_page];\n                  var page = PDFiumJS.C.Doc_get_page(cur_doc, cur_page);\n                  var width = PDFiumJS.C.Page_get_width(page);\n                  var height = PDFiumJS.C.Page_get_height(page);\n                  canvas.style.width = width + 'px';\n                  canvas.style.height = height + 'px';\n\n                  width *= devicePixelRatio;\n                  height *= devicePixelRatio;\n\n                  canvas.width = width;\n                  canvas.height = height;\n                    \n                  var bitmap = PDFiumJS.C.Page_get_bitmap(page, width, height);\n                  PDFiumJS.C.Page_destroy(page);\n\n                  var buf = PDFiumJS.C.Bitmap_get_buffer(bitmap);\n                  var stride = PDFiumJS.C.Bitmap_get_stride(bitmap);\n                  \n                  var ctx = canvas.getContext('2d');\n                  var img = ctx.createImageData(width, height);\n                  var data = img.data;\n\n                  var off = 0;\n                  for(var h = 0; h < height; ++h) {\n                    var ptr = buf + stride * h;\n                    for(var w = 0; w < width; ++w) {\n                      data[off++] = HEAPU8[ptr+2];\n                      data[off++] = HEAPU8[ptr+1];\n                      data[off++] = HEAPU8[ptr];\n                      data[off++] = 255;\n                      ptr += 4;\n                    }\n                  }\n\n                  PDFiumJS.C.Bitmap_destroy(bitmap);\n                  ctx.putImageData(img, 0, 0);\n\n\n                  var end_time = Date.now();\n                  console.log('Page', cur_page+1, end_time - start_time, 'ms');\n                } catch(e) {\n                  console.log('Cannot render page', cur_page, e);\n                }\n                ++cur_page;\n                timer = setTimeout(render_next_page, 1);\n              }\n              clearTimeout(timer);\n              timer = setTimeout(render_next_page, 1);\n            };\n            reader.readAsArrayBuffer(files[0]);\n          });\n        }\n      };\n    </script>\n    <script src=\"pdfium.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "web/pdfium.css",
    "content": "/*  vim: set sw=2 ts=2 et : */\n/*\n * Copyright (c) 2014 Lu Wang <coolwanglu@gmail.com>\n */\n\nbody {\n  background-color: #f5f0eb;\n}\n\ncanvas {\n  margin: 13px auto;\n  box-shadow: 1px 1px 3px 1px #333;\n  display:block;\n}\n\n#header {\n  position:fixed;\n  top:0;\n  left:0;\n  right:0;\n  width:auto;\n  background-color: #f5f0eb;\n  box-shadow: 0px 0px 10px 1px rgba(0, 0, 0, 0.3);\n  text-align: center;\n}\n\n#input-pdf {\n  margin: 0 auto;\n  margin-bottom: 24px;\n  display: none;\n}\n\n\n#main {\n  margin-top: 200px;\n}\n\n/* overrides some bootstrap styles */\n.jumbotron { \n  padding-top: 32px;\n  padding-bottom: 32px;\n  margin-bottom: 0px;\n  background-color: transparent;\n  text-align: center;\n}\n.jumbotron code {\n  color: inherit;\n  margin-top: 0px;\n}\n.modal-dialog {\n  display:block;\n}\n"
  },
  {
    "path": "web/pdfium.js",
    "content": "var Module;if(!Module)Module=(typeof Module!==\"undefined\"?Module:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_NODE=typeof process===\"object\"&&typeof require===\"function\";var ENVIRONMENT_IS_WEB=typeof window===\"object\";var ENVIRONMENT_IS_WORKER=typeof importScripts===\"function\";var ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){if(!Module[\"print\"])Module[\"print\"]=function print(x){process[\"stdout\"].write(x+\"\\n\")};if(!Module[\"printErr\"])Module[\"printErr\"]=function printErr(x){process[\"stderr\"].write(x+\"\\n\")};var nodeFS=require(\"fs\");var nodePath=require(\"path\");Module[\"read\"]=function read(filename,binary){filename=nodePath[\"normalize\"](filename);var ret=nodeFS[\"readFileSync\"](filename);if(!ret&&filename!=nodePath[\"resolve\"](filename)){filename=path.join(__dirname,\"..\",\"src\",filename);ret=nodeFS[\"readFileSync\"](filename)}if(ret&&!binary)ret=ret.toString();return ret};Module[\"readBinary\"]=function readBinary(filename){return Module[\"read\"](filename,true)};Module[\"load\"]=function load(f){globalEval(read(f))};Module[\"thisProgram\"]=process[\"argv\"][1];Module[\"arguments\"]=process[\"argv\"].slice(2);module[\"exports\"]=Module}else if(ENVIRONMENT_IS_SHELL){if(!Module[\"print\"])Module[\"print\"]=print;if(typeof printErr!=\"undefined\")Module[\"printErr\"]=printErr;if(typeof read!=\"undefined\"){Module[\"read\"]=read}else{Module[\"read\"]=function read(){throw\"no read() available (jsc?)\"}}Module[\"readBinary\"]=function readBinary(f){return read(f,\"binary\")};if(typeof scriptArgs!=\"undefined\"){Module[\"arguments\"]=scriptArgs}else if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}this[\"Module\"]=Module}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module[\"read\"]=function read(url){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText};if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof console!==\"undefined\"){if(!Module[\"print\"])Module[\"print\"]=function print(x){console.log(x)};if(!Module[\"printErr\"])Module[\"printErr\"]=function printErr(x){console.log(x)}}else{var TRY_USE_DUMP=false;if(!Module[\"print\"])Module[\"print\"]=TRY_USE_DUMP&&typeof dump!==\"undefined\"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WEB){window[\"Module\"]=Module}else{Module[\"load\"]=importScripts}}else{throw\"Unknown runtime environment. Where are we?\"}function globalEval(x){eval.call(null,x)}if(!Module[\"load\"]==\"undefined\"&&Module[\"read\"]){Module[\"load\"]=function load(f){globalEval(Module[\"read\"](f))}}if(!Module[\"print\"]){Module[\"print\"]=(function(){})}if(!Module[\"printErr\"]){Module[\"printErr\"]=Module[\"print\"]}if(!Module[\"arguments\"]){Module[\"arguments\"]=[]}if(!Module[\"thisProgram\"]){Module[\"thisProgram\"]=\"./this.program\"}Module.print=Module[\"print\"];Module.printErr=Module[\"printErr\"];Module[\"preRun\"]=[];Module[\"postRun\"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}var Runtime={setTempRet0:(function(value){tempRet0=value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),forceAlign:(function(target,quantum){quantum=quantum||4;if(quantum==1)return target;if(isNumber(target)&&isNumber(quantum)){return Math.ceil(target/quantum)*quantum}else if(isNumber(quantum)&&isPowerOfTwo(quantum)){return\"(((\"+target+\")+\"+(quantum-1)+\")&\"+ -quantum+\")\"}return\"Math.ceil((\"+target+\")/\"+quantum+\")*\"+quantum}),isNumberType:(function(type){return type in Runtime.INT_TYPES||type in Runtime.FLOAT_TYPES}),isPointerType:function isPointerType(type){return type[type.length-1]==\"*\"},isStructType:function isStructType(type){if(isPointerType(type))return false;if(isArrayType(type))return true;if(/<?\\{ ?[^}]* ?\\}>?/.test(type))return true;return type[0]==\"%\"},INT_TYPES:{\"i1\":0,\"i8\":0,\"i16\":0,\"i32\":0,\"i64\":0},FLOAT_TYPES:{\"float\":0,\"double\":0},or64:(function(x,y){var l=x|0|(y|0);var h=(Math.round(x/4294967296)|Math.round(y/4294967296))*4294967296;return l+h}),and64:(function(x,y){var l=(x|0)&(y|0);var h=(Math.round(x/4294967296)&Math.round(y/4294967296))*4294967296;return l+h}),xor64:(function(x,y){var l=(x|0)^(y|0);var h=(Math.round(x/4294967296)^Math.round(y/4294967296))*4294967296;return l+h}),getNativeTypeSize:(function(type){switch(type){case\"i1\":case\"i8\":return 1;case\"i16\":return 2;case\"i32\":return 4;case\"i64\":return 8;case\"float\":return 4;case\"double\":return 8;default:{if(type[type.length-1]===\"*\"){return Runtime.QUANTUM_SIZE}else if(type[0]===\"i\"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),dedup:function dedup(items,ident){var seen={};if(ident){return items.filter((function(item){if(seen[item[ident]])return false;seen[item[ident]]=true;return true}))}else{return items.filter((function(item){if(seen[item])return false;seen[item]=true;return true}))}},set:function set(){var args=typeof arguments[0]===\"object\"?arguments[0]:arguments;var ret={};for(var i=0;i<args.length;i++){ret[args[i]]=0}return ret},STACK_ALIGN:8,getAlignSize:(function(type,size,vararg){if(!vararg&&(type==\"i64\"||type==\"double\"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),calculateStructAlignment:function calculateStructAlignment(type){type.flatSize=0;type.alignSize=0;var diffs=[];var prev=-1;var index=0;type.flatIndexes=type.fields.map((function(field){index++;var size,alignSize;if(Runtime.isNumberType(field)||Runtime.isPointerType(field)){size=Runtime.getNativeTypeSize(field);alignSize=Runtime.getAlignSize(field,size)}else if(Runtime.isStructType(field)){if(field[1]===\"0\"){size=0;if(Types.types[field]){alignSize=Runtime.getAlignSize(null,Types.types[field].alignSize)}else{alignSize=type.alignSize||QUANTUM_SIZE}}else{size=Types.types[field].flatSize;alignSize=Runtime.getAlignSize(null,Types.types[field].alignSize)}}else if(field[0]==\"b\"){size=field.substr(1)|0;alignSize=1}else if(field[0]===\"<\"){size=alignSize=Types.types[field].flatSize}else if(field[0]===\"i\"){size=alignSize=parseInt(field.substr(1))/8;assert(size%1===0,\"cannot handle non-byte-size field \"+field)}else{assert(false,\"invalid type for calculateStructAlignment\")}if(type.packed)alignSize=1;type.alignSize=Math.max(type.alignSize,alignSize);var curr=Runtime.alignMemory(type.flatSize,alignSize);type.flatSize=curr+size;if(prev>=0){diffs.push(curr-prev)}prev=curr;return curr}));if(type.name_&&type.name_[0]===\"[\"){type.flatSize=parseInt(type.name_.substr(1))*type.flatSize/2}type.flatSize=Runtime.alignMemory(type.flatSize,type.alignSize);if(diffs.length==0){type.flatFactor=type.flatSize}else if(Runtime.dedup(diffs).length==1){type.flatFactor=diffs[0]}type.needsFlattening=type.flatFactor!=1;return type.flatIndexes},generateStructInfo:(function(struct,typeName,offset){var type,alignment;if(typeName){offset=offset||0;type=(typeof Types===\"undefined\"?Runtime.typeInfo:Types.types)[typeName];if(!type)return null;if(type.fields.length!=struct.length){printErr(\"Number of named fields must match the type for \"+typeName+\": possibly duplicate struct names. Cannot return structInfo\");return null}alignment=type.flatIndexes}else{var type={fields:struct.map((function(item){return item[0]}))};alignment=Runtime.calculateStructAlignment(type)}var ret={__size__:type.flatSize};if(typeName){struct.forEach((function(item,i){if(typeof item===\"string\"){ret[item]=alignment[i]+offset}else{var key;for(var k in item)key=k;ret[key]=Runtime.generateStructInfo(item[key],type.fields[i],alignment[i])}}))}else{struct.forEach((function(item,i){ret[item[1]]=alignment[i]}))}return ret}),dynCall:(function(sig,ptr,args){if(args&&args.length){if(!args.splice)args=Array.prototype.slice.call(args);args.splice(0,0,ptr);return Module[\"dynCall_\"+sig].apply(null,args)}else{return Module[\"dynCall_\"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i<Runtime.functionPointers.length;i++){if(!Runtime.functionPointers[i]){Runtime.functionPointers[i]=func;return 2*(1+i)}}throw\"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.\"}),removeFunction:(function(index){Runtime.functionPointers[(index-2)/2]=null}),getAsmConst:(function(code,numArgs){if(!Runtime.asmConstCache)Runtime.asmConstCache={};var func=Runtime.asmConstCache[code];if(func)return func;var args=[];for(var i=0;i<numArgs;i++){args.push(String.fromCharCode(36)+i)}var source=Pointer_stringify(code);if(source[0]==='\"'){if(source.indexOf('\"',1)===source.length-1){source=source.substr(1,source.length-2)}else{abort(\"invalid EM_ASM input |\"+source+\"|. Please use EM_ASM(..code..) (no quotes) or EM_ASM({ ..code($0).. }, input) (to input values)\")}}try{var evalled=eval(\"(function(\"+args.join(\",\")+\"){ \"+source+\" })\")}catch(e){Module.printErr(\"error in executing inline EM_ASM code: \"+e+\" on: \\n\\n\"+source+\"\\n\\nwith args |\"+args+\"| (make sure to use the right one out of EM_ASM, EM_ASM_ARGS, etc.)\");throw e}return Runtime.asmConstCache[code]=evalled}),warnOnce:(function(text){if(!Runtime.warnOnce.shown)Runtime.warnOnce.shown={};if(!Runtime.warnOnce.shown[text]){Runtime.warnOnce.shown[text]=1;Module.printErr(text)}}),funcWrappers:{},getFuncWrapper:(function(func,sig){assert(sig);if(!Runtime.funcWrappers[sig]){Runtime.funcWrappers[sig]={}}var sigCache=Runtime.funcWrappers[sig];if(!sigCache[func]){sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func,arguments)}}return sigCache[func]}),UTF8Processor:(function(){var buffer=[];var needed=0;this.processCChar=(function(code){code=code&255;if(buffer.length==0){if((code&128)==0){return String.fromCharCode(code)}buffer.push(code);if((code&224)==192){needed=1}else if((code&240)==224){needed=2}else{needed=3}return\"\"}if(needed){buffer.push(code);needed--;if(needed>0)return\"\"}var c1=buffer[0];var c2=buffer[1];var c3=buffer[2];var c4=buffer[3];var ret;if(buffer.length==2){ret=String.fromCharCode((c1&31)<<6|c2&63)}else if(buffer.length==3){ret=String.fromCharCode((c1&15)<<12|(c2&63)<<6|c3&63)}else{var codePoint=(c1&7)<<18|(c2&63)<<12|(c3&63)<<6|c4&63;ret=String.fromCharCode(Math.floor((codePoint-65536)/1024)+55296,(codePoint-65536)%1024+56320)}buffer.length=0;return ret});this.processJSString=function processJSString(string){string=unescape(encodeURIComponent(string));var ret=[];for(var i=0;i<string.length;i++){ret.push(string.charCodeAt(i))}return ret}}),getCompilerSetting:(function(name){throw\"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work\"}),stackAlloc:(function(size){var ret=STACKTOP;STACKTOP=STACKTOP+size|0;STACKTOP=STACKTOP+7&-8;return ret}),staticAlloc:(function(size){var ret=STATICTOP;STATICTOP=STATICTOP+size|0;STATICTOP=STATICTOP+7&-8;return ret}),dynamicAlloc:(function(size){var ret=DYNAMICTOP;DYNAMICTOP=DYNAMICTOP+size|0;DYNAMICTOP=DYNAMICTOP+7&-8;if(DYNAMICTOP>=TOTAL_MEMORY)enlargeMemory();return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:8))*(quantum?quantum:8);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*+4294967296:+(low>>>0)+ +(high|0)*+4294967296;return ret}),GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module[\"Runtime\"]=Runtime;var __THREW__=0;var ABORT=false;var EXITSTATUS=0;var undef=0;var tempValue,tempInt,tempBigInt,tempInt2,tempBigInt2,tempPair,tempBigIntI,tempBigIntR,tempBigIntS,tempBigIntP,tempBigIntD,tempDouble,tempFloat;var tempI64,tempI64b;var tempRet0,tempRet1,tempRet2,tempRet3,tempRet4,tempRet5,tempRet6,tempRet7,tempRet8,tempRet9;function assert(condition,text){if(!condition){abort(\"Assertion failed: \"+text)}}var globalScope=this;function getCFunc(ident){var func=Module[\"_\"+ident];if(!func){try{func=eval(\"_\"+ident)}catch(e){}}assert(func,\"Cannot call unknown function \"+ident+\" (perhaps LLVM optimizations or closure removed it?)\");return func}var cwrap,ccall;((function(){var stack=0;var JSfuncs={\"stackSave\":(function(){stack=Runtime.stackSave()}),\"stackRestore\":(function(){Runtime.stackRestore(stack)}),\"arrayToC\":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),\"stringToC\":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=Runtime.stackAlloc(str.length+1);writeStringToMemory(str,ret)}return ret})};var toC={\"string\":JSfuncs[\"stringToC\"],\"array\":JSfuncs[\"arrayToC\"]};ccall=function ccallFunc(ident,returnType,argTypes,args){var func=getCFunc(ident);var cArgs=[];if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=Runtime.stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);if(returnType===\"string\")ret=Pointer_stringify(ret);if(stack!==0)JSfuncs[\"stackRestore\"]();return ret};var sourceRegex=/^function\\s*\\(([^)]*)\\)\\s*{\\s*([^*]*?)[\\s;]*(?:return\\s*(.*?)[;\\s]*)?}$/;function parseJSFunc(jsfunc){var parsed=jsfunc.toString().match(sourceRegex).slice(1);return{arguments:parsed[0],body:parsed[1],returnValue:parsed[2]}}var JSsource={};for(var fun in JSfuncs){if(JSfuncs.hasOwnProperty(fun)){JSsource[fun]=parseJSFunc(JSfuncs[fun])}}cwrap=function cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var cfunc=getCFunc(ident);var numericArgs=argTypes.every((function(type){return type===\"number\"}));var numericRet=returnType!==\"string\";if(numericRet&&numericArgs){return cfunc}var argNames=argTypes.map((function(x,i){return\"$\"+i}));var funcstr=\"(function(\"+argNames.join(\",\")+\") {\";var nargs=argTypes.length;if(!numericArgs){funcstr+=JSsource[\"stackSave\"].body+\";\";for(var i=0;i<nargs;i++){var arg=argNames[i],type=argTypes[i];if(type===\"number\")continue;var convertCode=JSsource[type+\"ToC\"];funcstr+=\"var \"+convertCode.arguments+\" = \"+arg+\";\";funcstr+=convertCode.body+\";\";funcstr+=arg+\"=\"+convertCode.returnValue+\";\"}}var cfuncname=parseJSFunc((function(){return cfunc})).returnValue;funcstr+=\"var ret = \"+cfuncname+\"(\"+argNames.join(\",\")+\");\";if(!numericRet){var strgfy=parseJSFunc((function(){return Pointer_stringify})).returnValue;funcstr+=\"ret = \"+strgfy+\"(ret);\"}if(!numericArgs){funcstr+=JSsource[\"stackRestore\"].body+\";\"}funcstr+=\"return ret})\";return eval(funcstr)}}))();Module[\"cwrap\"]=cwrap;Module[\"ccall\"]=ccall;function setValue(ptr,value,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":HEAP8[ptr>>0]=value;break;case\"i8\":HEAP8[ptr>>0]=value;break;case\"i16\":HEAP16[ptr>>1]=value;break;case\"i32\":HEAP32[ptr>>2]=value;break;case\"i64\":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case\"float\":HEAPF32[ptr>>2]=value;break;case\"double\":HEAPF64[ptr>>3]=value;break;default:abort(\"invalid type for setValue: \"+type)}}Module[\"setValue\"]=setValue;function getValue(ptr,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":return HEAP8[ptr>>0];case\"i8\":return HEAP8[ptr>>0];case\"i16\":return HEAP16[ptr>>1];case\"i32\":return HEAP32[ptr>>2];case\"i64\":return HEAP32[ptr>>2];case\"float\":return HEAPF32[ptr>>2];case\"double\":return HEAPF64[ptr>>3];default:abort(\"invalid type for setValue: \"+type)}return null}Module[\"getValue\"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module[\"ALLOC_NORMAL\"]=ALLOC_NORMAL;Module[\"ALLOC_STACK\"]=ALLOC_STACK;Module[\"ALLOC_STATIC\"]=ALLOC_STATIC;Module[\"ALLOC_DYNAMIC\"]=ALLOC_DYNAMIC;Module[\"ALLOC_NONE\"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab===\"number\"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types===\"string\"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[_malloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType===\"i8\"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];if(typeof curr===\"function\"){curr=Runtime.getFunctionIndex(curr)}type=singleType||types[i];if(type===0){i++;continue}if(type==\"i64\")type=\"i32\";setValue(ret+i,curr,type);if(previousType!==type){typeSize=Runtime.getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}Module[\"allocate\"]=allocate;function Pointer_stringify(ptr,length){var hasUtf=false;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];if(t>=128)hasUtf=true;else if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret=\"\";if(!hasUtf){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}var utf8=new Runtime.UTF8Processor;for(i=0;i<length;i++){t=HEAPU8[ptr+i>>0];ret+=utf8.processCChar(t)}return ret}Module[\"Pointer_stringify\"]=Pointer_stringify;function UTF16ToString(ptr){var i=0;var str=\"\";while(1){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)return str;++i;str+=String.fromCharCode(codeUnit)}}Module[\"UTF16ToString\"]=UTF16ToString;function stringToUTF16(str,outPtr){for(var i=0;i<str.length;++i){var codeUnit=str.charCodeAt(i);HEAP16[outPtr+i*2>>1]=codeUnit}HEAP16[outPtr+str.length*2>>1]=0}Module[\"stringToUTF16\"]=stringToUTF16;function UTF32ToString(ptr){var i=0;var str=\"\";while(1){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)return str;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}}Module[\"UTF32ToString\"]=UTF32ToString;function stringToUTF32(str,outPtr){var iChar=0;for(var iCodeUnit=0;iCodeUnit<str.length;++iCodeUnit){var codeUnit=str.charCodeAt(iCodeUnit);if(codeUnit>=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++iCodeUnit);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr+iChar*4>>2]=codeUnit;++iChar}HEAP32[outPtr+iChar*4>>2]=0}Module[\"stringToUTF32\"]=stringToUTF32;function demangle(func){var hasLibcxxabi=!!Module[\"___cxa_demangle\"];if(hasLibcxxabi){try{var buf=_malloc(func.length);writeStringToMemory(func.substr(1),buf);var status=_malloc(4);var ret=Module[\"___cxa_demangle\"](buf,0,0,status);if(getValue(status,\"i32\")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}}var i=3;var basicTypes={\"v\":\"void\",\"b\":\"bool\",\"c\":\"char\",\"s\":\"short\",\"i\":\"int\",\"l\":\"long\",\"f\":\"float\",\"d\":\"double\",\"w\":\"wchar_t\",\"a\":\"signed char\",\"h\":\"unsigned char\",\"t\":\"unsigned short\",\"j\":\"unsigned int\",\"m\":\"unsigned long\",\"x\":\"long long\",\"y\":\"unsigned long long\",\"z\":\"...\"};var subs=[];var first=true;function dump(x){if(x)Module.print(x);Module.print(func);var pre=\"\";for(var a=0;a<i;a++)pre+=\" \";Module.print(pre+\"^\")}function parseNested(){i++;if(func[i]===\"K\")i++;var parts=[];while(func[i]!==\"E\"){if(func[i]===\"S\"){i++;var next=func.indexOf(\"_\",i);var num=func.substring(i,next)||0;parts.push(subs[num]||\"?\");i=next+1;continue}if(func[i]===\"C\"){parts.push(parts[parts.length-1]);i+=2;continue}var size=parseInt(func.substr(i));var pre=size.toString().length;if(!size||!pre){i--;break}var curr=func.substr(i+pre,size);parts.push(curr);subs.push(curr);i+=pre+size}i++;return parts}function parse(rawList,limit,allowVoid){limit=limit||Infinity;var ret=\"\",list=[];function flushList(){return\"(\"+list.join(\", \")+\")\"}var name;if(func[i]===\"N\"){name=parseNested().join(\"::\");limit--;if(limit===0)return rawList?[name]:name}else{if(func[i]===\"K\"||first&&func[i]===\"L\")i++;var size=parseInt(func.substr(i));if(size){var pre=size.toString().length;name=func.substr(i+pre,size);i+=pre+size}}first=false;if(func[i]===\"I\"){i++;var iList=parse(true);var iRet=parse(true,1,true);ret+=iRet[0]+\" \"+name+\"<\"+iList.join(\", \")+\">\"}else{ret=name}paramLoop:while(i<func.length&&limit-->0){var c=func[i++];if(c in basicTypes){list.push(basicTypes[c])}else{switch(c){case\"P\":list.push(parse(true,1,true)[0]+\"*\");break;case\"R\":list.push(parse(true,1,true)[0]+\"&\");break;case\"L\":{i++;var end=func.indexOf(\"E\",i);var size=end-i;list.push(func.substr(i,size));i+=size+2;break};case\"A\":{var size=parseInt(func.substr(i));i+=size.toString().length;if(func[i]!==\"_\")throw\"?\";i++;list.push(parse(true,1,true)[0]+\" [\"+size+\"]\");break};case\"E\":break paramLoop;default:ret+=\"?\"+c;break paramLoop}}}if(!allowVoid&&list.length===1&&list[0]===\"void\")list=[];if(rawList){if(ret){list.push(ret+\"?\")}return list}else{return ret+flushList()}}var final=func;try{if(func==\"Object._main\"||func==\"_main\"){return\"main()\"}if(typeof func===\"number\")func=Pointer_stringify(func);if(func[0]!==\"_\")return func;if(func[1]!==\"_\")return func;if(func[2]!==\"Z\")return func;switch(func[3]){case\"n\":return\"operator new()\";case\"d\":return\"operator delete()\"}final=parse()}catch(e){final+=\"?\"}if(final.indexOf(\"?\")>=0&&!hasLibcxxabi){Runtime.warnOnce(\"warning: a problem occurred in builtin C++ name demangling; build with  -s DEMANGLE_SUPPORT=1  to link in libcxxabi demangling\")}return final}function demangleAll(text){return text.replace(/__Z[\\w\\d_]+/g,(function(x){var y=demangle(x);return x===y?x:x+\" [\"+y+\"]\"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return\"(no stack trace available)\"}}return err.stack.toString()}function stackTrace(){return demangleAll(jsStackTrace())}Module[\"stackTrace\"]=stackTrace;var PAGE_SIZE=4096;function alignMemoryPage(x){return x+4095&-4096}var HEAP;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var STATIC_BASE=0,STATICTOP=0,staticSealed=false;var STACK_BASE=0,STACKTOP=0,STACK_MAX=0;var DYNAMIC_BASE=0,DYNAMICTOP=0;function enlargeMemory(){abort(\"Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value \"+TOTAL_MEMORY+\", (2) compile with ALLOW_MEMORY_GROWTH which adjusts the size at runtime but prevents some optimizations, or (3) set Module.TOTAL_MEMORY before the program runs.\")}var TOTAL_STACK=Module[\"TOTAL_STACK\"]||5242880;var TOTAL_MEMORY=Module[\"TOTAL_MEMORY\"]||16777216;var FAST_MEMORY=Module[\"FAST_MEMORY\"]||2097152;var totalMemory=4096;while(totalMemory<TOTAL_MEMORY||totalMemory<2*TOTAL_STACK){if(totalMemory<16*1024*1024){totalMemory*=2}else{totalMemory+=16*1024*1024}}if(totalMemory!==TOTAL_MEMORY){Module.printErr(\"increasing TOTAL_MEMORY to \"+totalMemory+\" to be more reasonable\");TOTAL_MEMORY=totalMemory}assert(typeof Int32Array!==\"undefined\"&&typeof Float64Array!==\"undefined\"&&!!(new Int32Array(1))[\"subarray\"]&&!!(new Int32Array(1))[\"set\"],\"JS engine does not provide full typed array support\");var buffer=new ArrayBuffer(TOTAL_MEMORY);HEAP8=new Int8Array(buffer);HEAP16=new Int16Array(buffer);HEAP32=new Int32Array(buffer);HEAPU8=new Uint8Array(buffer);HEAPU16=new Uint16Array(buffer);HEAPU32=new Uint32Array(buffer);HEAPF32=new Float32Array(buffer);HEAPF64=new Float64Array(buffer);HEAP32[0]=255;assert(HEAPU8[0]===255&&HEAPU8[3]===0,\"Typed arrays 2 must be run on a little-endian system\");Module[\"HEAP\"]=HEAP;Module[\"HEAP8\"]=HEAP8;Module[\"HEAP16\"]=HEAP16;Module[\"HEAP32\"]=HEAP32;Module[\"HEAPU8\"]=HEAPU8;Module[\"HEAPU16\"]=HEAPU16;Module[\"HEAPU32\"]=HEAPU32;Module[\"HEAPF32\"]=HEAPF32;Module[\"HEAPF64\"]=HEAPF64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback==\"function\"){callback();continue}var func=callback.func;if(typeof func===\"number\"){if(callback.arg===undefined){Runtime.dynCall(\"v\",func)}else{Runtime.dynCall(\"vi\",func,[callback.arg])}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module[\"addOnPreRun\"]=Module.addOnPreRun=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module[\"addOnInit\"]=Module.addOnInit=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module[\"addOnPreMain\"]=Module.addOnPreMain=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module[\"addOnExit\"]=Module.addOnExit=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module[\"addOnPostRun\"]=Module.addOnPostRun=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var ret=(new Runtime.UTF8Processor).processJSString(stringy);if(length){ret.length=length}if(!dontAddNull){ret.push(0)}return ret}Module[\"intArrayFromString\"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join(\"\")}Module[\"intArrayToString\"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){var array=intArrayFromString(string,dontAddNull);var i=0;while(i<array.length){var chr=array[i];HEAP8[buffer+i>>0]=chr;i=i+1}}Module[\"writeStringToMemory\"]=writeStringToMemory;function writeArrayToMemory(array,buffer){for(var i=0;i<array.length;i++){HEAP8[buffer+i>>0]=array[i]}}Module[\"writeArrayToMemory\"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;i++){HEAP8[buffer+i>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer+str.length>>0]=0}Module[\"writeAsciiToMemory\"]=writeAsciiToMemory;function unSign(value,bits,ignore){if(value>=0){return value}return bits<=32?2*Math.abs(1<<bits-1)+value:Math.pow(2,bits)+value}function reSign(value,bits,ignore){if(value<=0){return value}var half=bits<=32?Math.abs(1<<bits-1):Math.pow(2,bits-1);if(value>=half&&(bits<=32||value>half)){value=-2*half+value}return value}if(!Math[\"imul\"]||Math[\"imul\"](4294967295,5)!==-5)Math[\"imul\"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math[\"imul\"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_min=Math.min;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}Module[\"addRunDependency\"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module[\"removeRunDependency\"]=removeRunDependency;Module[\"preloadedImages\"]={};Module[\"preloadedAudios\"]={};var memoryInitializer=null;var __ZTVN10__cxxabiv117__class_type_infoE=1306632;var __ZTVN10__cxxabiv120__si_class_type_infoE=1306672;STATIC_BASE=8;STATICTOP=STATIC_BASE+Runtime.alignMemory(1307939);__ATINIT__.push({func:(function(){__GLOBAL__I_a()})});var memoryInitializer=\"pdfium.js.mem\";var tempDoublePtr=Runtime.alignMemory(allocate(12,\"i8\",ALLOC_STATIC),8);assert(tempDoublePtr%8==0);function copyTempFloat(ptr){HEAP8[tempDoublePtr]=HEAP8[ptr];HEAP8[tempDoublePtr+1]=HEAP8[ptr+1];HEAP8[tempDoublePtr+2]=HEAP8[ptr+2];HEAP8[tempDoublePtr+3]=HEAP8[ptr+3]}function copyTempDouble(ptr){HEAP8[tempDoublePtr]=HEAP8[ptr];HEAP8[tempDoublePtr+1]=HEAP8[ptr+1];HEAP8[tempDoublePtr+2]=HEAP8[ptr+2];HEAP8[tempDoublePtr+3]=HEAP8[ptr+3];HEAP8[tempDoublePtr+4]=HEAP8[ptr+4];HEAP8[tempDoublePtr+5]=HEAP8[ptr+5];HEAP8[tempDoublePtr+6]=HEAP8[ptr+6];HEAP8[tempDoublePtr+7]=HEAP8[ptr+7]}function _atexit(func,arg){__ATEXIT__.unshift({func:func,arg:arg})}function ___cxa_atexit(){return _atexit.apply(null,arguments)}Module[\"_rand_r\"]=_rand_r;var ___rand_seed=allocate([41108891,0,0,0],\"i32\",ALLOC_STATIC);Module[\"_rand\"]=_rand;Module[\"_i64Add\"]=_i64Add;var _tzname=allocate(8,\"i32*\",ALLOC_STATIC);var _daylight=allocate(1,\"i32*\",ALLOC_STATIC);var _timezone=allocate(1,\"i32*\",ALLOC_STATIC);function _tzset(){if(_tzset.called)return;_tzset.called=true;HEAP32[_timezone>>2]=-(new Date).getTimezoneOffset()*60;var winter=new Date(2e3,0,1);var summer=new Date(2e3,6,1);HEAP32[_daylight>>2]=Number(winter.getTimezoneOffset()!=summer.getTimezoneOffset());var winterName=\"GMT\";var summerName=\"GMT\";var winterNamePtr=allocate(intArrayFromString(winterName),\"i8\",ALLOC_NORMAL);var summerNamePtr=allocate(intArrayFromString(summerName),\"i8\",ALLOC_NORMAL);HEAP32[_tzname>>2]=winterNamePtr;HEAP32[_tzname+4>>2]=summerNamePtr}Module[\"_i64Subtract\"]=_i64Subtract;var _fabsf=Math_abs;var ___errno_state=0;function ___setErrNo(value){HEAP32[___errno_state>>2]=value;return value}var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _sysconf(name){switch(name){case 30:return PAGE_SIZE;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 80:case 81:case 79:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:{if(typeof navigator===\"object\")return navigator[\"hardwareConcurrency\"]||1;return 1}}___setErrNo(ERRNO_CODES.EINVAL);return-1}function __ZSt18uncaught_exceptionv(){return!!__ZSt18uncaught_exceptionv.uncaught_exception}function ___cxa_is_number_type(type){var isNumber=false;try{if(type==__ZTIi)isNumber=true}catch(e){}try{if(type==__ZTIj)isNumber=true}catch(e){}try{if(type==__ZTIl)isNumber=true}catch(e){}try{if(type==__ZTIm)isNumber=true}catch(e){}try{if(type==__ZTIx)isNumber=true}catch(e){}try{if(type==__ZTIy)isNumber=true}catch(e){}try{if(type==__ZTIf)isNumber=true}catch(e){}try{if(type==__ZTId)isNumber=true}catch(e){}try{if(type==__ZTIe)isNumber=true}catch(e){}try{if(type==__ZTIc)isNumber=true}catch(e){}try{if(type==__ZTIa)isNumber=true}catch(e){}try{if(type==__ZTIh)isNumber=true}catch(e){}try{if(type==__ZTIs)isNumber=true}catch(e){}try{if(type==__ZTIt)isNumber=true}catch(e){}return isNumber}function ___cxa_does_inherit(definiteType,possibilityType,possibility){if(possibility==0)return false;if(possibilityType==0||possibilityType==definiteType)return true;var possibility_type_info;if(___cxa_is_number_type(possibilityType)){possibility_type_info=possibilityType}else{var possibility_type_infoAddr=HEAP32[possibilityType>>2]-8;possibility_type_info=HEAP32[possibility_type_infoAddr>>2]}switch(possibility_type_info){case 0:var definite_type_infoAddr=HEAP32[definiteType>>2]-8;var definite_type_info=HEAP32[definite_type_infoAddr>>2];if(definite_type_info==0){var defPointerBaseAddr=definiteType+8;var defPointerBaseType=HEAP32[defPointerBaseAddr>>2];var possPointerBaseAddr=possibilityType+8;var possPointerBaseType=HEAP32[possPointerBaseAddr>>2];return ___cxa_does_inherit(defPointerBaseType,possPointerBaseType,possibility)}else return false;case 1:return false;case 2:var parentTypeAddr=possibilityType+8;var parentType=HEAP32[parentTypeAddr>>2];return ___cxa_does_inherit(definiteType,parentType,possibility);default:return false}}var ___cxa_last_thrown_exception=0;function ___resumeException(ptr){if(!___cxa_last_thrown_exception){___cxa_last_thrown_exception=ptr}throw ptr+\" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.\"}var ___cxa_exception_header_size=8;function ___cxa_find_matching_catch(thrown,throwntype){if(thrown==-1)thrown=___cxa_last_thrown_exception;header=thrown-___cxa_exception_header_size;if(throwntype==-1)throwntype=HEAP32[header>>2];var typeArray=Array.prototype.slice.call(arguments,2);if(throwntype!=0&&!___cxa_is_number_type(throwntype)){var throwntypeInfoAddr=HEAP32[throwntype>>2]-8;var throwntypeInfo=HEAP32[throwntypeInfoAddr>>2];if(throwntypeInfo==0)thrown=HEAP32[thrown>>2]}for(var i=0;i<typeArray.length;i++){if(___cxa_does_inherit(typeArray[i],throwntype,thrown))return(asm[\"setTempRet0\"](typeArray[i]),thrown)|0}return(asm[\"setTempRet0\"](throwntype),thrown)|0}function ___cxa_throw(ptr,type,destructor){if(!___cxa_throw.initialized){try{HEAP32[__ZTVN10__cxxabiv119__pointer_type_infoE>>2]=0}catch(e){}try{HEAP32[__ZTVN10__cxxabiv117__class_type_infoE>>2]=1}catch(e){}try{HEAP32[__ZTVN10__cxxabiv120__si_class_type_infoE>>2]=2}catch(e){}___cxa_throw.initialized=true}var header=ptr-___cxa_exception_header_size;HEAP32[header>>2]=type;HEAP32[header+4>>2]=destructor;___cxa_last_thrown_exception=ptr;if(!(\"uncaught_exception\"in __ZSt18uncaught_exceptionv)){__ZSt18uncaught_exceptionv.uncaught_exception=1}else{__ZSt18uncaught_exceptionv.uncaught_exception++}throw ptr+\" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.\"}var ERRNO_MESSAGES={0:\"Success\",1:\"Not super-user\",2:\"No such file or directory\",3:\"No such process\",4:\"Interrupted system call\",5:\"I/O error\",6:\"No such device or address\",7:\"Arg list too long\",8:\"Exec format error\",9:\"Bad file number\",10:\"No children\",11:\"No more processes\",12:\"Not enough core\",13:\"Permission denied\",14:\"Bad address\",15:\"Block device required\",16:\"Mount device busy\",17:\"File exists\",18:\"Cross-device link\",19:\"No such device\",20:\"Not a directory\",21:\"Is a directory\",22:\"Invalid argument\",23:\"Too many open files in system\",24:\"Too many open files\",25:\"Not a typewriter\",26:\"Text file busy\",27:\"File too large\",28:\"No space left on device\",29:\"Illegal seek\",30:\"Read only file system\",31:\"Too many links\",32:\"Broken pipe\",33:\"Math arg out of domain of func\",34:\"Math result not representable\",35:\"File locking deadlock error\",36:\"File or path name too long\",37:\"No record locks available\",38:\"Function not implemented\",39:\"Directory not empty\",40:\"Too many symbolic links\",42:\"No message of desired type\",43:\"Identifier removed\",44:\"Channel number out of range\",45:\"Level 2 not synchronized\",46:\"Level 3 halted\",47:\"Level 3 reset\",48:\"Link number out of range\",49:\"Protocol driver not attached\",50:\"No CSI structure available\",51:\"Level 2 halted\",52:\"Invalid exchange\",53:\"Invalid request descriptor\",54:\"Exchange full\",55:\"No anode\",56:\"Invalid request code\",57:\"Invalid slot\",59:\"Bad font file fmt\",60:\"Device not a stream\",61:\"No data (for no delay io)\",62:\"Timer expired\",63:\"Out of streams resources\",64:\"Machine is not on the network\",65:\"Package not installed\",66:\"The object is remote\",67:\"The link has been severed\",68:\"Advertise error\",69:\"Srmount error\",70:\"Communication error on send\",71:\"Protocol error\",72:\"Multihop attempted\",73:\"Cross mount point (not really error)\",74:\"Trying to read unreadable message\",75:\"Value too large for defined data type\",76:\"Given log. name not unique\",77:\"f.d. invalid for this operation\",78:\"Remote address changed\",79:\"Can   access a needed shared lib\",80:\"Accessing a corrupted shared lib\",81:\".lib section in a.out corrupted\",82:\"Attempting to link in too many libs\",83:\"Attempting to exec a shared library\",84:\"Illegal byte sequence\",86:\"Streams pipe error\",87:\"Too many users\",88:\"Socket operation on non-socket\",89:\"Destination address required\",90:\"Message too long\",91:\"Protocol wrong type for socket\",92:\"Protocol not available\",93:\"Unknown protocol\",94:\"Socket type not supported\",95:\"Not supported\",96:\"Protocol family not supported\",97:\"Address family not supported by protocol family\",98:\"Address already in use\",99:\"Address not available\",100:\"Network interface is not configured\",101:\"Network is unreachable\",102:\"Connection reset by network\",103:\"Connection aborted\",104:\"Connection reset by peer\",105:\"No buffer space available\",106:\"Socket is already connected\",107:\"Socket is not connected\",108:\"Can't send after socket shutdown\",109:\"Too many references\",110:\"Connection timed out\",111:\"Connection refused\",112:\"Host is down\",113:\"Host is unreachable\",114:\"Socket already connected\",115:\"Connection already in progress\",116:\"Stale file handle\",122:\"Quota exceeded\",123:\"No medium (in tape drive)\",125:\"Operation canceled\",130:\"Previous owner died\",131:\"State not recoverable\"};var PATH={splitPath:(function(filename){var splitPathRe=/^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;return splitPathRe.exec(filename).slice(1)}),normalizeArray:(function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last===\".\"){parts.splice(i,1)}else if(last===\"..\"){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up--;up){parts.unshift(\"..\")}}return parts}),normalize:(function(path){var isAbsolute=path.charAt(0)===\"/\",trailingSlash=path.substr(-1)===\"/\";path=PATH.normalizeArray(path.split(\"/\").filter((function(p){return!!p})),!isAbsolute).join(\"/\");if(!path&&!isAbsolute){path=\".\"}if(path&&trailingSlash){path+=\"/\"}return(isAbsolute?\"/\":\"\")+path}),dirname:(function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return\".\"}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir}),basename:(function(path){if(path===\"/\")return\"/\";var lastSlash=path.lastIndexOf(\"/\");if(lastSlash===-1)return path;return path.substr(lastSlash+1)}),extname:(function(path){return PATH.splitPath(path)[3]}),join:(function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join(\"/\"))}),join2:(function(l,r){return PATH.normalize(l+\"/\"+r)}),resolve:(function(){var resolvedPath=\"\",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!==\"string\"){throw new TypeError(\"Arguments to path.resolve must be strings\")}else if(!path){return\"\"}resolvedPath=path+\"/\"+resolvedPath;resolvedAbsolute=path.charAt(0)===\"/\"}resolvedPath=PATH.normalizeArray(resolvedPath.split(\"/\").filter((function(p){return!!p})),!resolvedAbsolute).join(\"/\");return(resolvedAbsolute?\"/\":\"\")+resolvedPath||\".\"}),relative:(function(from,to){from=PATH.resolve(from).substr(1);to=PATH.resolve(to).substr(1);function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[start]!==\"\")break}var end=arr.length-1;for(;end>=0;end--){if(arr[end]!==\"\")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split(\"/\"));var toParts=trim(to.split(\"/\"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i<length;i++){if(fromParts[i]!==toParts[i]){samePartsLength=i;break}}var outputParts=[];for(var i=samePartsLength;i<fromParts.length;i++){outputParts.push(\"..\")}outputParts=outputParts.concat(toParts.slice(samePartsLength));return outputParts.join(\"/\")})};var TTY={ttys:[],init:(function(){}),shutdown:(function(){}),register:(function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)}),stream_ops:{open:(function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}stream.tty=tty;stream.seekable=false}),close:(function(stream){if(stream.tty.output.length){stream.tty.ops.put_char(stream.tty,10)}}),read:(function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(ERRNO_CODES.ENXIO)}var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=stream.tty.ops.get_char(stream.tty)}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead}),write:(function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.put_char){throw new FS.ErrnoError(ERRNO_CODES.ENXIO)}for(var i=0;i<length;i++){try{stream.tty.ops.put_char(stream.tty,buffer[offset+i])}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}}if(length){stream.node.timestamp=Date.now()}return i})},default_tty_ops:{get_char:(function(tty){if(!tty.input.length){var result=null;if(ENVIRONMENT_IS_NODE){result=process[\"stdin\"][\"read\"]();if(!result){if(process[\"stdin\"][\"_readableState\"]&&process[\"stdin\"][\"_readableState\"][\"ended\"]){return null}return undefined}}else if(typeof window!=\"undefined\"&&typeof window.prompt==\"function\"){result=window.prompt(\"Input: \");if(result!==null){result+=\"\\n\"}}else if(typeof readline==\"function\"){result=readline();if(result!==null){result+=\"\\n\"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()}),put_char:(function(tty,val){if(val===null||val===10){Module[\"print\"](tty.output.join(\"\"));tty.output=[]}else{tty.output.push(TTY.utf8.processCChar(val))}})},default_tty1_ops:{put_char:(function(tty,val){if(val===null||val===10){Module[\"printErr\"](tty.output.join(\"\"));tty.output=[]}else{tty.output.push(TTY.utf8.processCChar(val))}})}};var MEMFS={ops_table:null,mount:(function(mount){return MEMFS.createNode(null,\"/\",16384|511,0)}),createNode:(function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node}return node}),getFileDataAsRegularArray:(function(node){if(node.contents&&node.contents.subarray){var arr=[];for(var i=0;i<node.usedBytes;++i)arr.push(node.contents[i]);return arr}return node.contents}),getFileDataAsTypedArray:(function(node){if(node.contents&&node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)}),expandFileStorage:(function(node,newCapacity){if(node.contents&&node.contents.subarray&&newCapacity>node.contents.length){node.contents=MEMFS.getFileDataAsRegularArray(node);node.usedBytes=node.contents.length}if(!node.contents||node.contents.subarray){var prevCapacity=node.contents?node.contents.buffer.byteLength:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity<CAPACITY_DOUBLING_MAX?2:1.125)|0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return}if(!node.contents&&newCapacity>0)node.contents=[];while(node.contents.length<newCapacity)node.contents.push(0)}),resizeFileStorage:(function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0;return}if(!node.contents||node.contents.subarray){var oldContents=node.contents;node.contents=new Uint8Array(new ArrayBuffer(newSize));if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize;return}if(!node.contents)node.contents=[];if(node.contents.length>newSize)node.contents.length=newSize;else while(node.contents.length<newSize)node.contents.push(0);node.usedBytes=newSize}),node_ops:{getattr:(function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr}),setattr:(function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}}),lookup:(function(parent,name){throw FS.genericErrors[ERRNO_CODES.ENOENT]}),mknod:(function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)}),rename:(function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}}}delete old_node.parent.contents[old_node.name];old_node.name=new_name;new_dir.contents[new_name]=old_node;old_node.parent=new_dir}),unlink:(function(parent,name){delete parent.contents[name]}),rmdir:(function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}delete parent.contents[name]}),readdir:(function(node){var entries=[\".\",\"..\"];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries}),symlink:(function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node}),readlink:(function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return node.link})},stream_ops:{read:(function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);assert(size>=0);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i<size;i++)buffer[offset+i]=contents[position+i]}return size}),write:(function(stream,buffer,offset,length,position,canOwn){if(!length)return 0;var node=stream.node;node.timestamp=Date.now();if(buffer.subarray&&(!node.contents||node.contents.subarray)){if(canOwn){node.contents=buffer.subarray(offset,offset+length);node.usedBytes=length;return length}else if(node.usedBytes===0&&position===0){node.contents=new Uint8Array(buffer.subarray(offset,offset+length));node.usedBytes=length;return length}else if(position+length<=node.usedBytes){node.contents.set(buffer.subarray(offset,offset+length),position);return length}}MEMFS.expandFileStorage(node,position+length);if(node.contents.subarray&&buffer.subarray)node.contents.set(buffer.subarray(offset,offset+length),position);else for(var i=0;i<length;i++){node.contents[position+i]=buffer[offset+i]}node.usedBytes=Math.max(node.usedBytes,position+length);return length}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.usedBytes}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}stream.ungotten=[];stream.position=position;return position}),allocate:(function(stream,offset,length){MEMFS.expandFileStorage(stream.node,offset+length);stream.node.usedBytes=Math.max(stream.node.usedBytes,offset+length)}),mmap:(function(stream,buffer,offset,length,position,prot,flags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}var ptr;var allocated;var contents=stream.node.contents;if(!(flags&2)&&(contents.buffer===buffer||contents.buffer===buffer.buffer)){allocated=false;ptr=contents.byteOffset}else{if(position>0||position+length<stream.node.usedBytes){if(contents.subarray){contents=contents.subarray(position,position+length)}else{contents=Array.prototype.slice.call(contents,position,position+length)}}allocated=true;ptr=_malloc(length);if(!ptr){throw new FS.ErrnoError(ERRNO_CODES.ENOMEM)}buffer.set(contents,ptr)}return{ptr:ptr,allocated:allocated}})}};var IDBFS={dbs:{},indexedDB:(function(){if(typeof indexedDB!==\"undefined\")return indexedDB;var ret=null;if(typeof window===\"object\")ret=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB;assert(ret,\"IDBFS used, but indexedDB not supported\");return ret}),DB_VERSION:21,DB_STORE_NAME:\"FILE_DATA\",mount:(function(mount){return MEMFS.mount.apply(null,arguments)}),syncfs:(function(mount,populate,callback){IDBFS.getLocalSet(mount,(function(err,local){if(err)return callback(err);IDBFS.getRemoteSet(mount,(function(err,remote){if(err)return callback(err);var src=populate?remote:local;var dst=populate?local:remote;IDBFS.reconcile(src,dst,callback)}))}))}),getDB:(function(name,callback){var db=IDBFS.dbs[name];if(db){return callback(null,db)}var req;try{req=IDBFS.indexedDB().open(name,IDBFS.DB_VERSION)}catch(e){return callback(e)}req.onupgradeneeded=(function(e){var db=e.target.result;var transaction=e.target.transaction;var fileStore;if(db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)){fileStore=transaction.objectStore(IDBFS.DB_STORE_NAME)}else{fileStore=db.createObjectStore(IDBFS.DB_STORE_NAME)}fileStore.createIndex(\"timestamp\",\"timestamp\",{unique:false})});req.onsuccess=(function(){db=req.result;IDBFS.dbs[name]=db;callback(null,db)});req.onerror=(function(){callback(this.error)})}),getLocalSet:(function(mount,callback){var entries={};function isRealDir(p){return p!==\".\"&&p!==\"..\"}function toAbsolute(root){return(function(p){return PATH.join2(root,p)})}var check=FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));while(check.length){var path=check.pop();var stat;try{stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){check.push.apply(check,FS.readdir(path).filter(isRealDir).map(toAbsolute(path)))}entries[path]={timestamp:stat.mtime}}return callback(null,{type:\"local\",entries:entries})}),getRemoteSet:(function(mount,callback){var entries={};IDBFS.getDB(mount.mountpoint,(function(err,db){if(err)return callback(err);var transaction=db.transaction([IDBFS.DB_STORE_NAME],\"readonly\");transaction.onerror=(function(){callback(this.error)});var store=transaction.objectStore(IDBFS.DB_STORE_NAME);var index=store.index(\"timestamp\");index.openKeyCursor().onsuccess=(function(event){var cursor=event.target.result;if(!cursor){return callback(null,{type:\"remote\",db:db,entries:entries})}entries[cursor.primaryKey]={timestamp:cursor.key};cursor.continue()})}))}),loadLocalEntry:(function(path,callback){var stat,node;try{var lookup=FS.lookupPath(path);node=lookup.node;stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){return callback(null,{timestamp:stat.mtime,mode:stat.mode})}else if(FS.isFile(stat.mode)){node.contents=MEMFS.getFileDataAsTypedArray(node);return callback(null,{timestamp:stat.mtime,mode:stat.mode,contents:node.contents})}else{return callback(new Error(\"node type not supported\"))}}),storeLocalEntry:(function(path,entry,callback){try{if(FS.isDir(entry.mode)){FS.mkdir(path,entry.mode)}else if(FS.isFile(entry.mode)){FS.writeFile(path,entry.contents,{encoding:\"binary\",canOwn:true})}else{return callback(new Error(\"node type not supported\"))}FS.utime(path,entry.timestamp,entry.timestamp)}catch(e){return callback(e)}callback(null)}),removeLocalEntry:(function(path,callback){try{var lookup=FS.lookupPath(path);var stat=FS.stat(path);if(FS.isDir(stat.mode)){FS.rmdir(path)}else if(FS.isFile(stat.mode)){FS.unlink(path)}}catch(e){return callback(e)}callback(null)}),loadRemoteEntry:(function(store,path,callback){var req=store.get(path);req.onsuccess=(function(event){callback(null,event.target.result)});req.onerror=(function(){callback(this.error)})}),storeRemoteEntry:(function(store,path,entry,callback){var req=store.put(entry,path);req.onsuccess=(function(){callback(null)});req.onerror=(function(){callback(this.error)})}),removeRemoteEntry:(function(store,path,callback){var req=store.delete(path);req.onsuccess=(function(){callback(null)});req.onerror=(function(){callback(this.error)})}),reconcile:(function(src,dst,callback){var total=0;var create=[];Object.keys(src.entries).forEach((function(key){var e=src.entries[key];var e2=dst.entries[key];if(!e2||e.timestamp>e2.timestamp){create.push(key);total++}}));var remove=[];Object.keys(dst.entries).forEach((function(key){var e=dst.entries[key];var e2=src.entries[key];if(!e2){remove.push(key);total++}}));if(!total){return callback(null)}var errored=false;var completed=0;var db=src.type===\"remote\"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],\"readwrite\");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err){if(!done.errored){done.errored=true;return callback(err)}return}if(++completed>=total){return callback(null)}}transaction.onerror=(function(){done(this.error)});create.sort().forEach((function(path){if(dst.type===\"local\"){IDBFS.loadRemoteEntry(store,path,(function(err,entry){if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)}))}else{IDBFS.loadLocalEntry(path,(function(err,entry){if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)}))}}));remove.sort().reverse().forEach((function(path){if(dst.type===\"local\"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}}))})};var NODEFS={isWindows:false,staticInit:(function(){NODEFS.isWindows=!!process.platform.match(/^win/)}),mount:(function(mount){assert(ENVIRONMENT_IS_NODE);return NODEFS.createNode(null,\"/\",NODEFS.getMode(mount.opts.root),0)}),createNode:(function(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node}),getMode:(function(path){var stat;try{stat=fs.lstatSync(path);if(NODEFS.isWindows){stat.mode=stat.mode|(stat.mode&146)>>1}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return stat.mode}),realPath:(function(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join.apply(null,parts)}),flagsToPermissionStringMap:{0:\"r\",1:\"r+\",2:\"r+\",64:\"r\",65:\"r+\",66:\"r+\",129:\"rx+\",193:\"rx+\",514:\"w+\",577:\"w\",578:\"w+\",705:\"wx\",706:\"wx+\",1024:\"a\",1025:\"a\",1026:\"a+\",1089:\"a\",1090:\"a+\",1153:\"ax\",1154:\"ax+\",1217:\"ax\",1218:\"ax+\",4096:\"rs\",4098:\"rs+\"},flagsToPermissionString:(function(flags){if(flags in NODEFS.flagsToPermissionStringMap){return NODEFS.flagsToPermissionStringMap[flags]}else{return flags}}),node_ops:{getattr:(function(node){var path=NODEFS.realPath(node);var stat;try{stat=fs.lstatSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(NODEFS.isWindows&&!stat.blksize){stat.blksize=4096}if(NODEFS.isWindows&&!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}}),setattr:(function(node,attr){var path=NODEFS.realPath(node);try{if(attr.mode!==undefined){fs.chmodSync(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);fs.utimesSync(path,date,date)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),lookup:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)}),mknod:(function(parent,name,mode,dev){var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);try{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,\"\",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return node}),rename:(function(oldNode,newDir,newName){var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{fs.renameSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),unlink:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.unlinkSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),rmdir:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.rmdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readdir:(function(node){var path=NODEFS.realPath(node);try{return fs.readdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),symlink:(function(parent,newName,oldPath){var newPath=PATH.join2(NODEFS.realPath(parent),newName);try{fs.symlinkSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readlink:(function(node){var path=NODEFS.realPath(node);try{return fs.readlinkSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}})},stream_ops:{open:(function(stream){var path=NODEFS.realPath(stream.node);try{if(FS.isFile(stream.node.mode)){stream.nfd=fs.openSync(path,NODEFS.flagsToPermissionString(stream.flags))}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),close:(function(stream){try{if(FS.isFile(stream.node.mode)&&stream.nfd){fs.closeSync(stream.nfd)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),read:(function(stream,buffer,offset,length,position){var nbuffer=new Buffer(length);var res;try{res=fs.readSync(stream.nfd,nbuffer,0,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(res>0){for(var i=0;i<res;i++){buffer[offset+i]=nbuffer[i]}}return res}),write:(function(stream,buffer,offset,length,position){var nbuffer=new Buffer(buffer.subarray(offset,offset+length));var res;try{res=fs.writeSync(stream.nfd,nbuffer,0,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}return res}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){try{var stat=fs.fstatSync(stream.nfd);position+=stat.size}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}stream.position=position;return position})}};var _stdin=allocate(1,\"i32*\",ALLOC_STATIC);var _stdout=allocate(1,\"i32*\",ALLOC_STATIC);var _stderr=allocate(1,\"i32*\",ALLOC_STATIC);function _fflush(stream){}var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:\"/\",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},handleFSError:(function(e){if(!(e instanceof FS.ErrnoError))throw e+\" : \"+stackTrace();return ___setErrNo(e.errno)}),lookupPath:(function(path,opts){path=PATH.resolve(FS.cwd(),path);opts=opts||{};if(!path)return{path:\"\",node:null};var defaults={follow_mount:true,recurse_count:0};for(var key in defaults){if(opts[key]===undefined){opts[key]=defaults[key]}}if(opts.recurse_count>8){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}var parts=PATH.normalizeArray(path.split(\"/\").filter((function(p){return!!p})),false);var current=FS.root;var current_path=\"/\";for(var i=0;i<parts.length;i++){var islast=i===parts.length-1;if(islast&&opts.parent){break}current=FS.lookupNode(current,parts[i]);current_path=PATH.join2(current_path,parts[i]);if(FS.isMountpoint(current)){if(!islast||islast&&opts.follow_mount){current=current.mounted.root}}if(!islast||opts.follow){var count=0;while(FS.isLink(current.mode)){var link=FS.readlink(current_path);current_path=PATH.resolve(PATH.dirname(current_path),link);var lookup=FS.lookupPath(current_path,{recurse_count:opts.recurse_count});current=lookup.node;if(count++>40){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}}}}return{path:current_path,node:current}}),getPath:(function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!==\"/\"?mount+\"/\"+path:mount+path}path=path?node.name+\"/\"+path:node.name;node=node.parent}}),hashName:(function(parentid,name){var hash=0;for(var i=0;i<name.length;i++){hash=(hash<<5)-hash+name.charCodeAt(i)|0}return(parentid+hash>>>0)%FS.nameTable.length}),hashAddNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node}),hashRemoveNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}}),lookupNode:(function(parent,name){var err=FS.mayLookup(parent);if(err){throw new FS.ErrnoError(err)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)}),createNode:(function(parent,name,mode,rdev){if(!FS.FSNode){FS.FSNode=(function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev});FS.FSNode.prototype={};var readMode=292|73;var writeMode=146;Object.defineProperties(FS.FSNode.prototype,{read:{get:(function(){return(this.mode&readMode)===readMode}),set:(function(val){val?this.mode|=readMode:this.mode&=~readMode})},write:{get:(function(){return(this.mode&writeMode)===writeMode}),set:(function(val){val?this.mode|=writeMode:this.mode&=~writeMode})},isFolder:{get:(function(){return FS.isDir(this.mode)})},isDevice:{get:(function(){return FS.isChrdev(this.mode)})}})}var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node}),destroyNode:(function(node){FS.hashRemoveNode(node)}),isRoot:(function(node){return node===node.parent}),isMountpoint:(function(node){return!!node.mounted}),isFile:(function(mode){return(mode&61440)===32768}),isDir:(function(mode){return(mode&61440)===16384}),isLink:(function(mode){return(mode&61440)===40960}),isChrdev:(function(mode){return(mode&61440)===8192}),isBlkdev:(function(mode){return(mode&61440)===24576}),isFIFO:(function(mode){return(mode&61440)===4096}),isSocket:(function(mode){return(mode&49152)===49152}),flagModes:{\"r\":0,\"rs\":1052672,\"r+\":2,\"w\":577,\"wx\":705,\"xw\":705,\"w+\":578,\"wx+\":706,\"xw+\":706,\"a\":1089,\"ax\":1217,\"xa\":1217,\"a+\":1090,\"ax+\":1218,\"xa+\":1218},modeStringToFlags:(function(str){var flags=FS.flagModes[str];if(typeof flags===\"undefined\"){throw new Error(\"Unknown file open mode: \"+str)}return flags}),flagsToPermissionString:(function(flag){var accmode=flag&2097155;var perms=[\"r\",\"w\",\"rw\"][accmode];if(flag&512){perms+=\"w\"}return perms}),nodePermissions:(function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf(\"r\")!==-1&&!(node.mode&292)){return ERRNO_CODES.EACCES}else if(perms.indexOf(\"w\")!==-1&&!(node.mode&146)){return ERRNO_CODES.EACCES}else if(perms.indexOf(\"x\")!==-1&&!(node.mode&73)){return ERRNO_CODES.EACCES}return 0}),mayLookup:(function(dir){var err=FS.nodePermissions(dir,\"x\");if(err)return err;if(!dir.node_ops.lookup)return ERRNO_CODES.EACCES;return 0}),mayCreate:(function(dir,name){try{var node=FS.lookupNode(dir,name);return ERRNO_CODES.EEXIST}catch(e){}return FS.nodePermissions(dir,\"wx\")}),mayDelete:(function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var err=FS.nodePermissions(dir,\"wx\");if(err){return err}if(isdir){if(!FS.isDir(node.mode)){return ERRNO_CODES.ENOTDIR}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return ERRNO_CODES.EBUSY}}else{if(FS.isDir(node.mode)){return ERRNO_CODES.EISDIR}}return 0}),mayOpen:(function(node,flags){if(!node){return ERRNO_CODES.ENOENT}if(FS.isLink(node.mode)){return ERRNO_CODES.ELOOP}else if(FS.isDir(node.mode)){if((flags&2097155)!==0||flags&512){return ERRNO_CODES.EISDIR}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))}),MAX_OPEN_FDS:4096,nextfd:(function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(ERRNO_CODES.EMFILE)}),getStream:(function(fd){return FS.streams[fd]}),createStream:(function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=(function(){});FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:(function(){return this.node}),set:(function(val){this.node=val})},isRead:{get:(function(){return(this.flags&2097155)!==1})},isWrite:{get:(function(){return(this.flags&2097155)!==0})},isAppend:{get:(function(){return this.flags&1024})}})}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream}),closeStream:(function(fd){FS.streams[fd]=null}),getStreamFromPtr:(function(ptr){return FS.streams[ptr-1]}),getPtrForStream:(function(stream){return stream?stream.fd+1:0}),chrdev_stream_ops:{open:(function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}}),llseek:(function(){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)})},major:(function(dev){return dev>>8}),minor:(function(dev){return dev&255}),makedev:(function(ma,mi){return ma<<8|mi}),registerDevice:(function(dev,ops){FS.devices[dev]={stream_ops:ops}}),getDevice:(function(dev){return FS.devices[dev]}),getMounts:(function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts}),syncfs:(function(populate,callback){if(typeof populate===\"function\"){callback=populate;populate=false}var mounts=FS.getMounts(FS.root.mount);var completed=0;function done(err){if(err){if(!done.errored){done.errored=true;return callback(err)}return}if(++completed>=mounts.length){callback(null)}}mounts.forEach((function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)}))}),mount:(function(type,opts,mountpoint){var root=mountpoint===\"/\";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot}),unmount:(function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach((function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}}));node.mounted=null;var idx=node.mount.mounts.indexOf(mount);assert(idx!==-1);node.mount.mounts.splice(idx,1)}),lookup:(function(parent,name){return parent.node_ops.lookup(parent,name)}),mknod:(function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name===\".\"||name===\"..\"){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var err=FS.mayCreate(parent,name);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return parent.node_ops.mknod(parent,name,mode,dev)}),create:(function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)}),mkdir:(function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)}),mkdev:(function(path,mode,dev){if(typeof dev===\"undefined\"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)}),symlink:(function(oldpath,newpath){if(!PATH.resolve(oldpath)){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}var newname=PATH.basename(newpath);var err=FS.mayCreate(parent,newname);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return parent.node_ops.symlink(parent,newname,oldpath)}),rename:(function(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;try{lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!old_dir||!new_dir)throw new FS.ErrnoError(ERRNO_CODES.ENOENT);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(ERRNO_CODES.EXDEV)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH.relative(old_path,new_dirname);if(relative.charAt(0)!==\".\"){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}relative=PATH.relative(new_path,old_dirname);if(relative.charAt(0)!==\".\"){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var err=FS.mayDelete(old_dir,old_name,isdir);if(err){throw new FS.ErrnoError(err)}err=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(err){throw new FS.ErrnoError(err)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(new_dir!==old_dir){err=FS.nodePermissions(old_dir,\"w\");if(err){throw new FS.ErrnoError(err)}}try{if(FS.trackingDelegate[\"willMovePath\"]){FS.trackingDelegate[\"willMovePath\"](old_path,new_path)}}catch(e){console.log(\"FS.trackingDelegate['willMovePath']('\"+old_path+\"', '\"+new_path+\"') threw an exception: \"+e.message)}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}try{if(FS.trackingDelegate[\"onMovePath\"])FS.trackingDelegate[\"onMovePath\"](old_path,new_path)}catch(e){console.log(\"FS.trackingDelegate['onMovePath']('\"+old_path+\"', '\"+new_path+\"') threw an exception: \"+e.message)}}),rmdir:(function(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var err=FS.mayDelete(parent,name,true);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}try{if(FS.trackingDelegate[\"willDeletePath\"]){FS.trackingDelegate[\"willDeletePath\"](path)}}catch(e){console.log(\"FS.trackingDelegate['willDeletePath']('\"+path+\"') threw an exception: \"+e.message)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate[\"onDeletePath\"])FS.trackingDelegate[\"onDeletePath\"](path)}catch(e){console.log(\"FS.trackingDelegate['onDeletePath']('\"+path+\"') threw an exception: \"+e.message)}}),readdir:(function(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}return node.node_ops.readdir(node)}),unlink:(function(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var err=FS.mayDelete(parent,name,false);if(err){if(err===ERRNO_CODES.EISDIR)err=ERRNO_CODES.EPERM;throw new FS.ErrnoError(err)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}try{if(FS.trackingDelegate[\"willDeletePath\"]){FS.trackingDelegate[\"willDeletePath\"](path)}}catch(e){console.log(\"FS.trackingDelegate['willDeletePath']('\"+path+\"') threw an exception: \"+e.message)}parent.node_ops.unlink(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate[\"onDeletePath\"])FS.trackingDelegate[\"onDeletePath\"](path)}catch(e){console.log(\"FS.trackingDelegate['onDeletePath']('\"+path+\"') threw an exception: \"+e.message)}}),readlink:(function(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link.node_ops.readlink){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return link.node_ops.readlink(link)}),stat:(function(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!node.node_ops.getattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return node.node_ops.getattr(node)}),lstat:(function(path){return FS.stat(path,true)}),chmod:(function(path,mode,dontFollow){var node;if(typeof path===\"string\"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})}),lchmod:(function(path,mode){FS.chmod(path,mode,true)}),fchmod:(function(fd,mode){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}FS.chmod(stream.node,mode)}),chown:(function(path,uid,gid,dontFollow){var node;if(typeof path===\"string\"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}node.node_ops.setattr(node,{timestamp:Date.now()})}),lchown:(function(path,uid,gid){FS.chown(path,uid,gid,true)}),fchown:(function(fd,uid,gid){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}FS.chown(stream.node,uid,gid)}),truncate:(function(path,len){if(len<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node;if(typeof path===\"string\"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var err=FS.nodePermissions(node,\"w\");if(err){throw new FS.ErrnoError(err)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})}),ftruncate:(function(fd,len){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}FS.truncate(stream.node,len)}),utime:(function(path,atime,mtime){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})}),open:(function(path,flags,mode,fd_start,fd_end){if(path===\"\"){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}flags=typeof flags===\"string\"?FS.modeStringToFlags(flags):flags;mode=typeof mode===\"undefined\"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path===\"object\"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(ERRNO_CODES.EEXIST)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(FS.isChrdev(node.mode)){flags&=~512}if(!created){var err=FS.mayOpen(node,flags);if(err){throw new FS.ErrnoError(err)}}if(flags&512){FS.truncate(node,0)}flags&=~(128|512);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false},fd_start,fd_end);if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module[\"logReadFiles\"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1;Module[\"printErr\"](\"read file: \"+path)}}try{if(FS.trackingDelegate[\"onOpenFile\"]){var trackingFlags=0;if((flags&2097155)!==1){trackingFlags|=FS.tracking.openFlags.READ}if((flags&2097155)!==0){trackingFlags|=FS.tracking.openFlags.WRITE}FS.trackingDelegate[\"onOpenFile\"](path,trackingFlags)}}catch(e){console.log(\"FS.trackingDelegate['onOpenFile']('\"+path+\"', flags) threw an exception: \"+e.message)}return stream}),close:(function(stream){try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}}),llseek:(function(stream,offset,whence){if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}return stream.stream_ops.llseek(stream,offset,whence)}),read:(function(stream,buffer,offset,length,position){if(length<0||position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!stream.stream_ops.read){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var seeking=true;if(typeof position===\"undefined\"){position=stream.position;seeking=false}else if(!stream.seekable){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead}),write:(function(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!stream.stream_ops.write){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if(stream.flags&1024){FS.llseek(stream,0,2)}var seeking=true;if(typeof position===\"undefined\"){position=stream.position;seeking=false}else if(!stream.seekable){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;try{if(stream.path&&FS.trackingDelegate[\"onWriteToFile\"])FS.trackingDelegate[\"onWriteToFile\"](stream.path)}catch(e){console.log(\"FS.trackingDelegate['onWriteToFile']('\"+path+\"') threw an exception: \"+e.message)}return bytesWritten}),allocate:(function(stream,offset,length){if(offset<0||length<=0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP)}stream.stream_ops.allocate(stream,offset,length)}),mmap:(function(stream,buffer,offset,length,position,prot,flags){if((stream.flags&2097155)===1){throw new FS.ErrnoError(ERRNO_CODES.EACCES)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}return stream.stream_ops.mmap(stream,buffer,offset,length,position,prot,flags)}),ioctl:(function(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(ERRNO_CODES.ENOTTY)}return stream.stream_ops.ioctl(stream,cmd,arg)}),readFile:(function(path,opts){opts=opts||{};opts.flags=opts.flags||\"r\";opts.encoding=opts.encoding||\"binary\";if(opts.encoding!==\"utf8\"&&opts.encoding!==\"binary\"){throw new Error('Invalid encoding type \"'+opts.encoding+'\"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding===\"utf8\"){ret=\"\";var utf8=new Runtime.UTF8Processor;for(var i=0;i<length;i++){ret+=utf8.processCChar(buf[i])}}else if(opts.encoding===\"binary\"){ret=buf}FS.close(stream);return ret}),writeFile:(function(path,data,opts){opts=opts||{};opts.flags=opts.flags||\"w\";opts.encoding=opts.encoding||\"utf8\";if(opts.encoding!==\"utf8\"&&opts.encoding!==\"binary\"){throw new Error('Invalid encoding type \"'+opts.encoding+'\"')}var stream=FS.open(path,opts.flags,opts.mode);if(opts.encoding===\"utf8\"){var utf8=new Runtime.UTF8Processor;var buf=new Uint8Array(utf8.processJSString(data));FS.write(stream,buf,0,buf.length,0,opts.canOwn)}else if(opts.encoding===\"binary\"){FS.write(stream,data,0,data.length,0,opts.canOwn)}FS.close(stream)}),cwd:(function(){return FS.currentPath}),chdir:(function(path){var lookup=FS.lookupPath(path,{follow:true});if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}var err=FS.nodePermissions(lookup.node,\"x\");if(err){throw new FS.ErrnoError(err)}FS.currentPath=lookup.path}),createDefaultDirectories:(function(){FS.mkdir(\"/tmp\");FS.mkdir(\"/home\");FS.mkdir(\"/home/web_user\")}),createDefaultDevices:(function(){FS.mkdir(\"/dev\");FS.registerDevice(FS.makedev(1,3),{read:(function(){return 0}),write:(function(){return 0})});FS.mkdev(\"/dev/null\",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev(\"/dev/tty\",FS.makedev(5,0));FS.mkdev(\"/dev/tty1\",FS.makedev(6,0));var random_device;if(typeof crypto!==\"undefined\"){var randomBuffer=new Uint8Array(1);random_device=(function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]})}else if(ENVIRONMENT_IS_NODE){random_device=(function(){return require(\"crypto\").randomBytes(1)[0]})}else{random_device=(function(){return Math.floor(Math.random()*256)})}FS.createDevice(\"/dev\",\"random\",random_device);FS.createDevice(\"/dev\",\"urandom\",random_device);FS.mkdir(\"/dev/shm\");FS.mkdir(\"/dev/shm/tmp\")}),createStandardStreams:(function(){if(Module[\"stdin\"]){FS.createDevice(\"/dev\",\"stdin\",Module[\"stdin\"])}else{FS.symlink(\"/dev/tty\",\"/dev/stdin\")}if(Module[\"stdout\"]){FS.createDevice(\"/dev\",\"stdout\",null,Module[\"stdout\"])}else{FS.symlink(\"/dev/tty\",\"/dev/stdout\")}if(Module[\"stderr\"]){FS.createDevice(\"/dev\",\"stderr\",null,Module[\"stderr\"])}else{FS.symlink(\"/dev/tty1\",\"/dev/stderr\")}var stdin=FS.open(\"/dev/stdin\",\"r\");HEAP32[_stdin>>2]=FS.getPtrForStream(stdin);assert(stdin.fd===0,\"invalid handle for stdin (\"+stdin.fd+\")\");var stdout=FS.open(\"/dev/stdout\",\"w\");HEAP32[_stdout>>2]=FS.getPtrForStream(stdout);assert(stdout.fd===1,\"invalid handle for stdout (\"+stdout.fd+\")\");var stderr=FS.open(\"/dev/stderr\",\"w\");HEAP32[_stderr>>2]=FS.getPtrForStream(stderr);assert(stderr.fd===2,\"invalid handle for stderr (\"+stderr.fd+\")\")}),ensureErrnoError:(function(){if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno){this.errno=errno;for(var key in ERRNO_CODES){if(ERRNO_CODES[key]===errno){this.code=key;break}}this.message=ERRNO_MESSAGES[errno]};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[ERRNO_CODES.ENOENT].forEach((function(code){FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=\"<generic error, no stack>\"}))}),staticInit:(function(){FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},\"/\");FS.createDefaultDirectories();FS.createDefaultDevices()}),init:(function(input,output,error){assert(!FS.init.initialized,\"FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)\");FS.init.initialized=true;FS.ensureErrnoError();Module[\"stdin\"]=input||Module[\"stdin\"];Module[\"stdout\"]=output||Module[\"stdout\"];Module[\"stderr\"]=error||Module[\"stderr\"];FS.createStandardStreams()}),quit:(function(){FS.init.initialized=false;for(var i=0;i<FS.streams.length;i++){var stream=FS.streams[i];if(!stream){continue}FS.close(stream)}}),getMode:(function(canRead,canWrite){var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode}),joinPath:(function(parts,forceRelative){var path=PATH.join.apply(null,parts);if(forceRelative&&path[0]==\"/\")path=path.substr(1);return path}),absolutePath:(function(relative,base){return PATH.resolve(base,relative)}),standardizePath:(function(path){return PATH.normalize(path)}),findObject:(function(path,dontResolveLastLink){var ret=FS.analyzePath(path,dontResolveLastLink);if(ret.exists){return ret.object}else{___setErrNo(ret.error);return null}}),analyzePath:(function(path,dontResolveLastLink){try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path===\"/\"}catch(e){ret.error=e.errno}return ret}),createFolder:(function(parent,name,canRead,canWrite){var path=PATH.join2(typeof parent===\"string\"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.mkdir(path,mode)}),createPath:(function(parent,path,canRead,canWrite){parent=typeof parent===\"string\"?parent:FS.getPath(parent);var parts=path.split(\"/\").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current}),createFile:(function(parent,name,properties,canRead,canWrite){var path=PATH.join2(typeof parent===\"string\"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)}),createDataFile:(function(parent,name,data,canRead,canWrite,canOwn){var path=name?PATH.join2(typeof parent===\"string\"?parent:FS.getPath(parent),name):parent;var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data===\"string\"){var arr=new Array(data.length);for(var i=0,len=data.length;i<len;++i)arr[i]=data.charCodeAt(i);data=arr}FS.chmod(node,mode|146);var stream=FS.open(node,\"w\");FS.write(stream,data,0,data.length,0,canOwn);FS.close(stream);FS.chmod(node,mode)}return node}),createDevice:(function(parent,name,input,output){var path=PATH.join2(typeof parent===\"string\"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:(function(stream){stream.seekable=false}),close:(function(stream){if(output&&output.buffer&&output.buffer.length){output(10)}}),read:(function(stream,buffer,offset,length,pos){var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=input()}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead}),write:(function(stream,buffer,offset,length,pos){for(var i=0;i<length;i++){try{output(buffer[offset+i])}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}}if(length){stream.node.timestamp=Date.now()}return i})});return FS.mkdev(path,mode,dev)}),createLink:(function(parent,name,target,canRead,canWrite){var path=PATH.join2(typeof parent===\"string\"?parent:FS.getPath(parent),name);return FS.symlink(target,path)}),forceLoadFile:(function(obj){if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;var success=true;if(typeof XMLHttpRequest!==\"undefined\"){throw new Error(\"Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.\")}else if(Module[\"read\"]){try{obj.contents=intArrayFromString(Module[\"read\"](obj.url),true);obj.usedBytes=obj.contents.length}catch(e){success=false}}else{throw new Error(\"Cannot load without read() or XMLHttpRequest.\")}if(!success)___setErrNo(ERRNO_CODES.EIO);return success}),createLazyFile:(function(parent,name,url,canRead,canWrite){function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=Math.floor(idx/this.chunkSize);return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open(\"HEAD\",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error(\"Couldn't load \"+url+\". Status: \"+xhr.status);var datalength=Number(xhr.getResponseHeader(\"Content-length\"));var header;var hasByteServing=(header=xhr.getResponseHeader(\"Accept-Ranges\"))&&header===\"bytes\";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(function(from,to){if(from>to)throw new Error(\"invalid range (\"+from+\", \"+to+\") or no bytes requested!\");if(to>datalength-1)throw new Error(\"only \"+datalength+\" bytes available! programmer error!\");var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);if(datalength!==chunkSize)xhr.setRequestHeader(\"Range\",\"bytes=\"+from+\"-\"+to);if(typeof Uint8Array!=\"undefined\")xhr.responseType=\"arraybuffer\";if(xhr.overrideMimeType){xhr.overrideMimeType(\"text/plain; charset=x-user-defined\")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error(\"Couldn't load \"+url+\". Status: \"+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||\"\",true)}});var lazyArray=this;lazyArray.setDataGetter((function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]===\"undefined\"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]===\"undefined\")throw new Error(\"doXHR failed!\");return lazyArray.chunks[chunkNum]}));this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!==\"undefined\"){if(!ENVIRONMENT_IS_WORKER)throw\"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc\";var lazyArray=new LazyUint8Array;Object.defineProperty(lazyArray,\"length\",{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._length})});Object.defineProperty(lazyArray,\"chunkSize\",{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize})});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperty(node,\"usedBytes\",{get:(function(){return this.contents.length})});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach((function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}return fn.apply(null,arguments)}}));stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);assert(size>=0);if(contents.slice){for(var i=0;i<size;i++){buffer[offset+i]=contents[position+i]}}else{for(var i=0;i<size;i++){buffer[offset+i]=contents.get(position+i)}}return size};node.stream_ops=stream_ops;return node}),createPreloadedFile:(function(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn){Browser.init();var fullname=name?PATH.resolve(PATH.join2(parent,name)):parent;function processData(byteArray){function finish(byteArray){if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(\"cp \"+fullname)}var handled=false;Module[\"preloadPlugins\"].forEach((function(plugin){if(handled)return;if(plugin[\"canHandle\"](fullname)){plugin[\"handle\"](byteArray,fullname,finish,(function(){if(onerror)onerror();removeRunDependency(\"cp \"+fullname)}));handled=true}}));if(!handled)finish(byteArray)}addRunDependency(\"cp \"+fullname);if(typeof url==\"string\"){Browser.asyncLoad(url,(function(byteArray){processData(byteArray)}),onerror)}else{processData(url)}}),indexedDB:(function(){return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB}),DB_NAME:(function(){return\"EM_FS_\"+window.location.pathname}),DB_VERSION:20,DB_STORE_NAME:\"FILE_DATA\",saveFilesToDB:(function(paths,onload,onerror){onload=onload||(function(){});onerror=onerror||(function(){});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=function openRequest_onupgradeneeded(){console.log(\"creating db\");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=function openRequest_onsuccess(){var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],\"readwrite\");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach((function(path){var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=function putRequest_onsuccess(){ok++;if(ok+fail==total)finish()};putRequest.onerror=function putRequest_onerror(){fail++;if(ok+fail==total)finish()}}));transaction.onerror=onerror};openRequest.onerror=onerror}),loadFilesFromDB:(function(paths,onload,onerror){onload=onload||(function(){});onerror=onerror||(function(){});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=function openRequest_onsuccess(){var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],\"readonly\")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach((function(path){var getRequest=files.get(path);getRequest.onsuccess=function getRequest_onsuccess(){if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=function getRequest_onerror(){fail++;if(ok+fail==total)finish()}}));transaction.onerror=onerror};openRequest.onerror=onerror})};function _close(fildes){var stream=FS.getStream(fildes);if(!stream){___setErrNo(ERRNO_CODES.EBADF);return-1}try{FS.close(stream);return 0}catch(e){FS.handleFSError(e);return-1}}function _fsync(fildes){var stream=FS.getStream(fildes);if(stream){return 0}else{___setErrNo(ERRNO_CODES.EBADF);return-1}}function _fileno(stream){stream=FS.getStreamFromPtr(stream);if(!stream)return-1;return stream.fd}function _fclose(stream){var fd=_fileno(stream);_fsync(fd);return _close(fd)}function _pthread_mutex_lock(){}function _mkport(){throw\"TODO\"}var SOCKFS={mount:(function(mount){Module[\"websocket\"]=Module[\"websocket\"]&&\"object\"===typeof Module[\"websocket\"]?Module[\"websocket\"]:{};Module[\"websocket\"]._callbacks={};Module[\"websocket\"][\"on\"]=(function(event,callback){if(\"function\"===typeof callback){this._callbacks[event]=callback}return this});Module[\"websocket\"].emit=(function(event,param){if(\"function\"===typeof this._callbacks[event]){this._callbacks[event].call(this,param)}});return FS.createNode(null,\"/\",16384|511,0)}),createSocket:(function(family,type,protocol){var streaming=type==1;if(protocol){assert(streaming==(protocol==6))}var sock={family:family,type:type,protocol:protocol,server:null,error:null,peers:{},pending:[],recv_queue:[],sock_ops:SOCKFS.websocket_sock_ops};var name=SOCKFS.nextname();var node=FS.createNode(SOCKFS.root,name,49152,0);node.sock=sock;var stream=FS.createStream({path:name,node:node,flags:FS.modeStringToFlags(\"r+\"),seekable:false,stream_ops:SOCKFS.stream_ops});sock.stream=stream;return sock}),getSocket:(function(fd){var stream=FS.getStream(fd);if(!stream||!FS.isSocket(stream.node.mode)){return null}return stream.node.sock}),stream_ops:{poll:(function(stream){var sock=stream.node.sock;return sock.sock_ops.poll(sock)}),ioctl:(function(stream,request,varargs){var sock=stream.node.sock;return sock.sock_ops.ioctl(sock,request,varargs)}),read:(function(stream,buffer,offset,length,position){var sock=stream.node.sock;var msg=sock.sock_ops.recvmsg(sock,length);if(!msg){return 0}buffer.set(msg.buffer,offset);return msg.buffer.length}),write:(function(stream,buffer,offset,length,position){var sock=stream.node.sock;return sock.sock_ops.sendmsg(sock,buffer,offset,length)}),close:(function(stream){var sock=stream.node.sock;sock.sock_ops.close(sock)})},nextname:(function(){if(!SOCKFS.nextname.current){SOCKFS.nextname.current=0}return\"socket[\"+SOCKFS.nextname.current++ +\"]\"}),websocket_sock_ops:{createPeer:(function(sock,addr,port){var ws;if(typeof addr===\"object\"){ws=addr;addr=null;port=null}if(ws){if(ws._socket){addr=ws._socket.remoteAddress;port=ws._socket.remotePort}else{var result=/ws[s]?:\\/\\/([^:]+):(\\d+)/.exec(ws.url);if(!result){throw new Error(\"WebSocket URL must be in the format ws(s)://address:port\")}addr=result[1];port=parseInt(result[2],10)}}else{try{var runtimeConfig=Module[\"websocket\"]&&\"object\"===typeof Module[\"websocket\"];var url=\"ws:#\".replace(\"#\",\"//\");if(runtimeConfig){if(\"string\"===typeof Module[\"websocket\"][\"url\"]){url=Module[\"websocket\"][\"url\"]}}if(url===\"ws://\"||url===\"wss://\"){url=url+addr+\":\"+port}var subProtocols=\"binary\";if(runtimeConfig){if(\"string\"===typeof Module[\"websocket\"][\"subprotocol\"]){subProtocols=Module[\"websocket\"][\"subprotocol\"]}}subProtocols=subProtocols.replace(/^ +| +$/g,\"\").split(/ *, */);var opts=ENVIRONMENT_IS_NODE?{\"protocol\":subProtocols.toString()}:subProtocols;var WebSocket=ENVIRONMENT_IS_NODE?require(\"ws\"):window[\"WebSocket\"];ws=new WebSocket(url,opts);ws.binaryType=\"arraybuffer\"}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EHOSTUNREACH)}}var peer={addr:addr,port:port,socket:ws,dgram_send_queue:[]};SOCKFS.websocket_sock_ops.addPeer(sock,peer);SOCKFS.websocket_sock_ops.handlePeerEvents(sock,peer);if(sock.type===2&&typeof sock.sport!==\"undefined\"){peer.dgram_send_queue.push(new Uint8Array([255,255,255,255,\"p\".charCodeAt(0),\"o\".charCodeAt(0),\"r\".charCodeAt(0),\"t\".charCodeAt(0),(sock.sport&65280)>>8,sock.sport&255]))}return peer}),getPeer:(function(sock,addr,port){return sock.peers[addr+\":\"+port]}),addPeer:(function(sock,peer){sock.peers[peer.addr+\":\"+peer.port]=peer}),removePeer:(function(sock,peer){delete sock.peers[peer.addr+\":\"+peer.port]}),handlePeerEvents:(function(sock,peer){var first=true;var handleOpen=(function(){Module[\"websocket\"].emit(\"open\",sock.stream.fd);try{var queued=peer.dgram_send_queue.shift();while(queued){peer.socket.send(queued);queued=peer.dgram_send_queue.shift()}}catch(e){peer.socket.close()}});function handleMessage(data){assert(typeof data!==\"string\"&&data.byteLength!==undefined);data=new Uint8Array(data);var wasfirst=first;first=false;if(wasfirst&&data.length===10&&data[0]===255&&data[1]===255&&data[2]===255&&data[3]===255&&data[4]===\"p\".charCodeAt(0)&&data[5]===\"o\".charCodeAt(0)&&data[6]===\"r\".charCodeAt(0)&&data[7]===\"t\".charCodeAt(0)){var newport=data[8]<<8|data[9];SOCKFS.websocket_sock_ops.removePeer(sock,peer);peer.port=newport;SOCKFS.websocket_sock_ops.addPeer(sock,peer);return}sock.recv_queue.push({addr:peer.addr,port:peer.port,data:data});Module[\"websocket\"].emit(\"message\",sock.stream.fd)}if(ENVIRONMENT_IS_NODE){peer.socket.on(\"open\",handleOpen);peer.socket.on(\"message\",(function(data,flags){if(!flags.binary){return}handleMessage((new Uint8Array(data)).buffer)}));peer.socket.on(\"close\",(function(){Module[\"websocket\"].emit(\"close\",sock.stream.fd)}));peer.socket.on(\"error\",(function(error){sock.error=ERRNO_CODES.ECONNREFUSED;Module[\"websocket\"].emit(\"error\",[sock.stream.fd,sock.error,\"ECONNREFUSED: Connection refused\"])}))}else{peer.socket.onopen=handleOpen;peer.socket.onclose=(function(){Module[\"websocket\"].emit(\"close\",sock.stream.fd)});peer.socket.onmessage=function peer_socket_onmessage(event){handleMessage(event.data)};peer.socket.onerror=(function(error){sock.error=ERRNO_CODES.ECONNREFUSED;Module[\"websocket\"].emit(\"error\",[sock.stream.fd,sock.error,\"ECONNREFUSED: Connection refused\"])})}}),poll:(function(sock){if(sock.type===1&&sock.server){return sock.pending.length?64|1:0}var mask=0;var dest=sock.type===1?SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport):null;if(sock.recv_queue.length||!dest||dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=64|1}if(!dest||dest&&dest.socket.readyState===dest.socket.OPEN){mask|=4}if(dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=16}return mask}),ioctl:(function(sock,request,arg){switch(request){case 21531:var bytes=0;if(sock.recv_queue.length){bytes=sock.recv_queue[0].data.length}HEAP32[arg>>2]=bytes;return 0;default:return ERRNO_CODES.EINVAL}}),close:(function(sock){if(sock.server){try{sock.server.close()}catch(e){}sock.server=null}var peers=Object.keys(sock.peers);for(var i=0;i<peers.length;i++){var peer=sock.peers[peers[i]];try{peer.socket.close()}catch(e){}SOCKFS.websocket_sock_ops.removePeer(sock,peer)}return 0}),bind:(function(sock,addr,port){if(typeof sock.saddr!==\"undefined\"||typeof sock.sport!==\"undefined\"){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}sock.saddr=addr;sock.sport=port||_mkport();if(sock.type===2){if(sock.server){sock.server.close();sock.server=null}try{sock.sock_ops.listen(sock,0)}catch(e){if(!(e instanceof FS.ErrnoError))throw e;if(e.errno!==ERRNO_CODES.EOPNOTSUPP)throw e}}}),connect:(function(sock,addr,port){if(sock.server){throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP)}if(typeof sock.daddr!==\"undefined\"&&typeof sock.dport!==\"undefined\"){var dest=SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport);if(dest){if(dest.socket.readyState===dest.socket.CONNECTING){throw new FS.ErrnoError(ERRNO_CODES.EALREADY)}else{throw new FS.ErrnoError(ERRNO_CODES.EISCONN)}}}var peer=SOCKFS.websocket_sock_ops.createPeer(sock,addr,port);sock.daddr=peer.addr;sock.dport=peer.port;throw new FS.ErrnoError(ERRNO_CODES.EINPROGRESS)}),listen:(function(sock,backlog){if(!ENVIRONMENT_IS_NODE){throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP)}if(sock.server){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var WebSocketServer=require(\"ws\").Server;var host=sock.saddr;sock.server=new WebSocketServer({host:host,port:sock.sport});Module[\"websocket\"].emit(\"listen\",sock.stream.fd);sock.server.on(\"connection\",(function(ws){if(sock.type===1){var newsock=SOCKFS.createSocket(sock.family,sock.type,sock.protocol);var peer=SOCKFS.websocket_sock_ops.createPeer(newsock,ws);newsock.daddr=peer.addr;newsock.dport=peer.port;sock.pending.push(newsock);Module[\"websocket\"].emit(\"connection\",newsock.stream.fd)}else{SOCKFS.websocket_sock_ops.createPeer(sock,ws);Module[\"websocket\"].emit(\"connection\",sock.stream.fd)}}));sock.server.on(\"closed\",(function(){Module[\"websocket\"].emit(\"close\",sock.stream.fd);sock.server=null}));sock.server.on(\"error\",(function(error){sock.error=ERRNO_CODES.EHOSTUNREACH;Module[\"websocket\"].emit(\"error\",[sock.stream.fd,sock.error,\"EHOSTUNREACH: Host is unreachable\"])}))}),accept:(function(listensock){if(!listensock.server){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var newsock=listensock.pending.shift();newsock.stream.flags=listensock.stream.flags;return newsock}),getname:(function(sock,peer){var addr,port;if(peer){if(sock.daddr===undefined||sock.dport===undefined){throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN)}addr=sock.daddr;port=sock.dport}else{addr=sock.saddr||0;port=sock.sport||0}return{addr:addr,port:port}}),sendmsg:(function(sock,buffer,offset,length,addr,port){if(sock.type===2){if(addr===undefined||port===undefined){addr=sock.daddr;port=sock.dport}if(addr===undefined||port===undefined){throw new FS.ErrnoError(ERRNO_CODES.EDESTADDRREQ)}}else{addr=sock.daddr;port=sock.dport}var dest=SOCKFS.websocket_sock_ops.getPeer(sock,addr,port);if(sock.type===1){if(!dest||dest.socket.readyState===dest.socket.CLOSING||dest.socket.readyState===dest.socket.CLOSED){throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN)}else if(dest.socket.readyState===dest.socket.CONNECTING){throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)}}var data;if(buffer instanceof Array||buffer instanceof ArrayBuffer){data=buffer.slice(offset,offset+length)}else{data=buffer.buffer.slice(buffer.byteOffset+offset,buffer.byteOffset+offset+length)}if(sock.type===2){if(!dest||dest.socket.readyState!==dest.socket.OPEN){if(!dest||dest.socket.readyState===dest.socket.CLOSING||dest.socket.readyState===dest.socket.CLOSED){dest=SOCKFS.websocket_sock_ops.createPeer(sock,addr,port)}dest.dgram_send_queue.push(data);return length}}try{dest.socket.send(data);return length}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}}),recvmsg:(function(sock,length){if(sock.type===1&&sock.server){throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN)}var queued=sock.recv_queue.shift();if(!queued){if(sock.type===1){var dest=SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport);if(!dest){throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN)}else if(dest.socket.readyState===dest.socket.CLOSING||dest.socket.readyState===dest.socket.CLOSED){return null}else{throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)}}else{throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)}}var queuedLength=queued.data.byteLength||queued.data.length;var queuedOffset=queued.data.byteOffset||0;var queuedBuffer=queued.data.buffer||queued.data;var bytesRead=Math.min(length,queuedLength);var res={buffer:new Uint8Array(queuedBuffer,queuedOffset,bytesRead),addr:queued.addr,port:queued.port};if(sock.type===1&&bytesRead<queuedLength){var bytesRemaining=queuedLength-bytesRead;queued.data=new Uint8Array(queuedBuffer,queuedOffset+bytesRead,bytesRemaining);sock.recv_queue.unshift(queued)}return res})}};function _send(fd,buf,len,flags){var sock=SOCKFS.getSocket(fd);if(!sock){___setErrNo(ERRNO_CODES.EBADF);return-1}return _write(fd,buf,len)}function _pwrite(fildes,buf,nbyte,offset){var stream=FS.getStream(fildes);if(!stream){___setErrNo(ERRNO_CODES.EBADF);return-1}try{var slab=HEAP8;return FS.write(stream,slab,buf,nbyte,offset)}catch(e){FS.handleFSError(e);return-1}}function _write(fildes,buf,nbyte){var stream=FS.getStream(fildes);if(!stream){___setErrNo(ERRNO_CODES.EBADF);return-1}try{var slab=HEAP8;return FS.write(stream,slab,buf,nbyte)}catch(e){FS.handleFSError(e);return-1}}function _fwrite(ptr,size,nitems,stream){var bytesToWrite=nitems*size;if(bytesToWrite==0)return 0;var fd=_fileno(stream);var bytesWritten=_write(fd,ptr,bytesToWrite);if(bytesWritten==-1){var streamObj=FS.getStreamFromPtr(stream);if(streamObj)streamObj.error=true;return 0}else{return Math.floor(bytesWritten/size)}}Module[\"_strlen\"]=_strlen;function __reallyNegative(x){return x<0||x===0&&1/x===-Infinity}function __formatString(format,varargs){var textIndex=format;var argIndex=0;function getNextArg(type){var ret;if(type===\"double\"){ret=(HEAP32[tempDoublePtr>>2]=HEAP32[varargs+argIndex>>2],HEAP32[tempDoublePtr+4>>2]=HEAP32[varargs+(argIndex+4)>>2],+HEAPF64[tempDoublePtr>>3])}else if(type==\"i64\"){ret=[HEAP32[varargs+argIndex>>2],HEAP32[varargs+(argIndex+4)>>2]]}else{type=\"i32\";ret=HEAP32[varargs+argIndex>>2]}argIndex+=Runtime.getNativeFieldSize(type);return ret}var ret=[];var curr,next,currArg;while(1){var startTextIndex=textIndex;curr=HEAP8[textIndex>>0];if(curr===0)break;next=HEAP8[textIndex+1>>0];if(curr==37){var flagAlwaysSigned=false;var flagLeftAlign=false;var flagAlternative=false;var flagZeroPad=false;var flagPadSign=false;flagsLoop:while(1){switch(next){case 43:flagAlwaysSigned=true;break;case 45:flagLeftAlign=true;break;case 35:flagAlternative=true;break;case 48:if(flagZeroPad){break flagsLoop}else{flagZeroPad=true;break};case 32:flagPadSign=true;break;default:break flagsLoop}textIndex++;next=HEAP8[textIndex+1>>0]}var width=0;if(next==42){width=getNextArg(\"i32\");textIndex++;next=HEAP8[textIndex+1>>0]}else{while(next>=48&&next<=57){width=width*10+(next-48);textIndex++;next=HEAP8[textIndex+1>>0]}}var precisionSet=false,precision=-1;if(next==46){precision=0;precisionSet=true;textIndex++;next=HEAP8[textIndex+1>>0];if(next==42){precision=getNextArg(\"i32\");textIndex++}else{while(1){var precisionChr=HEAP8[textIndex+1>>0];if(precisionChr<48||precisionChr>57)break;precision=precision*10+(precisionChr-48);textIndex++}}next=HEAP8[textIndex+1>>0]}if(precision<0){precision=6;precisionSet=false}var argSize;switch(String.fromCharCode(next)){case\"h\":var nextNext=HEAP8[textIndex+2>>0];if(nextNext==104){textIndex++;argSize=1}else{argSize=2}break;case\"l\":var nextNext=HEAP8[textIndex+2>>0];if(nextNext==108){textIndex++;argSize=8}else{argSize=4}break;case\"L\":case\"q\":case\"j\":argSize=8;break;case\"z\":case\"t\":case\"I\":argSize=4;break;default:argSize=null}if(argSize)textIndex++;next=HEAP8[textIndex+1>>0];switch(String.fromCharCode(next)){case\"d\":case\"i\":case\"u\":case\"o\":case\"x\":case\"X\":case\"p\":{var signed=next==100||next==105;argSize=argSize||4;var currArg=getNextArg(\"i\"+argSize*8);var origArg=currArg;var argText;if(argSize==8){currArg=Runtime.makeBigInt(currArg[0],currArg[1],next==117)}if(argSize<=4){var limit=Math.pow(256,argSize)-1;currArg=(signed?reSign:unSign)(currArg&limit,argSize*8)}var currAbsArg=Math.abs(currArg);var prefix=\"\";if(next==100||next==105){if(argSize==8&&i64Math)argText=i64Math.stringify(origArg[0],origArg[1],null);else argText=reSign(currArg,8*argSize,1).toString(10)}else if(next==117){if(argSize==8&&i64Math)argText=i64Math.stringify(origArg[0],origArg[1],true);else argText=unSign(currArg,8*argSize,1).toString(10);currArg=Math.abs(currArg)}else if(next==111){argText=(flagAlternative?\"0\":\"\")+currAbsArg.toString(8)}else if(next==120||next==88){prefix=flagAlternative&&currArg!=0?\"0x\":\"\";if(argSize==8&&i64Math){if(origArg[1]){argText=(origArg[1]>>>0).toString(16);var lower=(origArg[0]>>>0).toString(16);while(lower.length<8)lower=\"0\"+lower;argText+=lower}else{argText=(origArg[0]>>>0).toString(16)}}else if(currArg<0){currArg=-currArg;argText=(currAbsArg-1).toString(16);var buffer=[];for(var i=0;i<argText.length;i++){buffer.push((15-parseInt(argText[i],16)).toString(16))}argText=buffer.join(\"\");while(argText.length<argSize*2)argText=\"f\"+argText}else{argText=currAbsArg.toString(16)}if(next==88){prefix=prefix.toUpperCase();argText=argText.toUpperCase()}}else if(next==112){if(currAbsArg===0){argText=\"(nil)\"}else{prefix=\"0x\";argText=currAbsArg.toString(16)}}if(precisionSet){while(argText.length<precision){argText=\"0\"+argText}}if(currArg>=0){if(flagAlwaysSigned){prefix=\"+\"+prefix}else if(flagPadSign){prefix=\" \"+prefix}}if(argText.charAt(0)==\"-\"){prefix=\"-\"+prefix;argText=argText.substr(1)}while(prefix.length+argText.length<width){if(flagLeftAlign){argText+=\" \"}else{if(flagZeroPad){argText=\"0\"+argText}else{prefix=\" \"+prefix}}}argText=prefix+argText;argText.split(\"\").forEach((function(chr){ret.push(chr.charCodeAt(0))}));break};case\"f\":case\"F\":case\"e\":case\"E\":case\"g\":case\"G\":{var currArg=getNextArg(\"double\");var argText;if(isNaN(currArg)){argText=\"nan\";flagZeroPad=false}else if(!isFinite(currArg)){argText=(currArg<0?\"-\":\"\")+\"inf\";flagZeroPad=false}else{var isGeneral=false;var effectivePrecision=Math.min(precision,20);if(next==103||next==71){isGeneral=true;precision=precision||1;var exponent=parseInt(currArg.toExponential(effectivePrecision).split(\"e\")[1],10);if(precision>exponent&&exponent>=-4){next=(next==103?\"f\":\"F\").charCodeAt(0);precision-=exponent+1}else{next=(next==103?\"e\":\"E\").charCodeAt(0);precision--}effectivePrecision=Math.min(precision,20)}if(next==101||next==69){argText=currArg.toExponential(effectivePrecision);if(/[eE][-+]\\d$/.test(argText)){argText=argText.slice(0,-1)+\"0\"+argText.slice(-1)}}else if(next==102||next==70){argText=currArg.toFixed(effectivePrecision);if(currArg===0&&__reallyNegative(currArg)){argText=\"-\"+argText}}var parts=argText.split(\"e\");if(isGeneral&&!flagAlternative){while(parts[0].length>1&&parts[0].indexOf(\".\")!=-1&&(parts[0].slice(-1)==\"0\"||parts[0].slice(-1)==\".\")){parts[0]=parts[0].slice(0,-1)}}else{if(flagAlternative&&argText.indexOf(\".\")==-1)parts[0]+=\".\";while(precision>effectivePrecision++)parts[0]+=\"0\"}argText=parts[0]+(parts.length>1?\"e\"+parts[1]:\"\");if(next==69)argText=argText.toUpperCase();if(currArg>=0){if(flagAlwaysSigned){argText=\"+\"+argText}else if(flagPadSign){argText=\" \"+argText}}}while(argText.length<width){if(flagLeftAlign){argText+=\" \"}else{if(flagZeroPad&&(argText[0]==\"-\"||argText[0]==\"+\")){argText=argText[0]+\"0\"+argText.slice(1)}else{argText=(flagZeroPad?\"0\":\" \")+argText}}}if(next<97)argText=argText.toUpperCase();argText.split(\"\").forEach((function(chr){ret.push(chr.charCodeAt(0))}));break};case\"s\":{var arg=getNextArg(\"i8*\");var argLength=arg?_strlen(arg):\"(null)\".length;if(precisionSet)argLength=Math.min(argLength,precision);if(!flagLeftAlign){while(argLength<width--){ret.push(32)}}if(arg){for(var i=0;i<argLength;i++){ret.push(HEAPU8[arg++>>0])}}else{ret=ret.concat(intArrayFromString(\"(null)\".substr(0,argLength),true))}if(flagLeftAlign){while(argLength<width--){ret.push(32)}}break};case\"c\":{if(flagLeftAlign)ret.push(getNextArg(\"i8\"));while(--width>0){ret.push(32)}if(!flagLeftAlign)ret.push(getNextArg(\"i8\"));break};case\"n\":{var ptr=getNextArg(\"i32*\");HEAP32[ptr>>2]=ret.length;break};case\"%\":{ret.push(curr);break};default:{for(var i=startTextIndex;i<textIndex+2;i++){ret.push(HEAP8[i>>0])}}}textIndex+=2}else{ret.push(curr);textIndex+=1}}return ret}function _fprintf(stream,format,varargs){var result=__formatString(format,varargs);var stack=Runtime.stackSave();var ret=_fwrite(allocate(result,\"i8\",ALLOC_STACK),1,result.length,stream);Runtime.stackRestore(stack);return ret}function _printf(format,varargs){var stdout=HEAP32[_stdout>>2];return _fprintf(stdout,format,varargs)}function _open(path,oflag,varargs){var mode=HEAP32[varargs>>2];path=Pointer_stringify(path);try{var stream=FS.open(path,oflag,mode);return stream.fd}catch(e){FS.handleFSError(e);return-1}}function _fopen(filename,mode){var flags;mode=Pointer_stringify(mode);if(mode[0]==\"r\"){if(mode.indexOf(\"+\")!=-1){flags=2}else{flags=0}}else if(mode[0]==\"w\"){if(mode.indexOf(\"+\")!=-1){flags=2}else{flags=1}flags|=64;flags|=512}else if(mode[0]==\"a\"){if(mode.indexOf(\"+\")!=-1){flags=2}else{flags=1}flags|=64;flags|=1024}else{___setErrNo(ERRNO_CODES.EINVAL);return 0}var fd=_open(filename,flags,allocate([511,0,0,0],\"i32\",ALLOC_STACK));return fd===-1?0:FS.getPtrForStream(FS.getStream(fd))}var _sqrtf=Math_sqrt;Module[\"_strncpy\"]=_strncpy;function _fputc(c,stream){var chr=unSign(c&255);HEAP8[_fputc.ret>>0]=chr;var fd=_fileno(stream);var ret=_write(fd,_fputc.ret,1);if(ret==-1){var streamObj=FS.getStreamFromPtr(stream);if(streamObj)streamObj.error=true;return-1}else{return chr}}var _log=Math_log;var _emscripten_postinvoke=true;function _rint(x){if(Math.abs(x%1)!==.5)return Math.round(x);return x+x%2+(x<0?1:-1)}function _lrintf(){return _rint.apply(null,arguments)}function _PDFiumJS_read_file(file_id,pos,pBuf,size){var input=PDFiumJS.opened_files[file_id];if(!input)return 0;if(pos+size<pos||pos+size>input.length)return 0;HEAPU8.set(input.subarray(pos,pos+size),pBuf);return 1}function _pthread_mutex_init(){}function _putchar(c){return _fputc(c,HEAP32[_stdout>>2])}Module[\"_saveSetjmp\"]=_saveSetjmp;function _log10(x){return Math.log(x)/Math.LN10}var ___tm_current=allocate(44,\"i8\",ALLOC_STATIC);var ___tm_timezone=allocate(intArrayFromString(\"GMT\"),\"i8\",ALLOC_STATIC);function _localtime_r(time,tmPtr){_tzset();var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=Math.floor((date.getTime()-start.getTime())/(1e3*60*60*24));HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=start.getTimezoneOffset()*60;var dst=Number(start.getTimezoneOffset()!=date.getTimezoneOffset());HEAP32[tmPtr+32>>2]=dst;HEAP32[tmPtr+40>>2]=___tm_timezone;return tmPtr}function _localtime(time){return _localtime_r(time,___tm_current)}Module[\"_bitshift64Ashr\"]=_bitshift64Ashr;Module[\"_bitshift64Lshr\"]=_bitshift64Lshr;function _recv(fd,buf,len,flags){var sock=SOCKFS.getSocket(fd);if(!sock){___setErrNo(ERRNO_CODES.EBADF);return-1}return _read(fd,buf,len)}function _pread(fildes,buf,nbyte,offset){var stream=FS.getStream(fildes);if(!stream){___setErrNo(ERRNO_CODES.EBADF);return-1}try{var slab=HEAP8;return FS.read(stream,slab,buf,nbyte,offset)}catch(e){FS.handleFSError(e);return-1}}function _read(fildes,buf,nbyte){var stream=FS.getStream(fildes);if(!stream){___setErrNo(ERRNO_CODES.EBADF);return-1}try{var slab=HEAP8;return FS.read(stream,slab,buf,nbyte)}catch(e){FS.handleFSError(e);return-1}}function _fread(ptr,size,nitems,stream){var bytesToRead=nitems*size;if(bytesToRead==0){return 0}var bytesRead=0;var streamObj=FS.getStreamFromPtr(stream);if(!streamObj){___setErrNo(ERRNO_CODES.EBADF);return 0}while(streamObj.ungotten.length&&bytesToRead>0){HEAP8[ptr++>>0]=streamObj.ungotten.pop();bytesToRead--;bytesRead++}var err=_read(streamObj.fd,ptr,bytesToRead);if(err==-1){if(streamObj)streamObj.error=true;return 0}bytesRead+=err;if(bytesRead<bytesToRead)streamObj.eof=true;return Math.floor(bytesRead/size)}var _emscripten_prep_setjmp=true;var _emscripten_get_longjmp_result=true;var _BDtoIHigh=true;Module[\"_testSetjmp\"]=_testSetjmp;function _longjmp(env,value){asm[\"setThrew\"](env,value||1);throw\"longjmp\"}function _emscripten_longjmp(env,value){_longjmp(env,value)}function _vfprintf(s,f,va_arg){return _fprintf(s,f,HEAP32[va_arg>>2])}function _pthread_mutex_unlock(){}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module[\"_memcpy\"]=_memcpy;var _llvm_pow_f64=Math_pow;function _sbrk(bytes){var self=_sbrk;if(!self.called){DYNAMICTOP=alignMemoryPage(DYNAMICTOP);self.called=true;assert(Runtime.dynamicAlloc);self.alloc=Runtime.dynamicAlloc;Runtime.dynamicAlloc=(function(){abort(\"cannot dynamically allocate, sbrk now has control\")})}var ret=DYNAMICTOP;if(bytes!=0)self.alloc(bytes);return ret}Module[\"_memmove\"]=_memmove;var _emscripten_preinvoke=true;var _BItoD=true;function _pthread_mutex_destroy(){}function _opendir(dirname){var path=Pointer_stringify(dirname);if(!path){___setErrNo(ERRNO_CODES.ENOENT);return 0}var node;try{var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}catch(e){FS.handleFSError(e);return 0}if(!FS.isDir(node.mode)){___setErrNo(ERRNO_CODES.ENOTDIR);return 0}var fd=_open(dirname,0,allocate([0,0,0,0],\"i32\",ALLOC_STACK));return fd===-1?0:FS.getPtrForStream(FS.getStream(fd))}Module[\"_llvm_bswap_i32\"]=_llvm_bswap_i32;function ___assert_fail(condition,filename,line,func){ABORT=true;throw\"Assertion failed: \"+Pointer_stringify(condition)+\", at: \"+[filename?Pointer_stringify(filename):\"unknown filename\",line,func?Pointer_stringify(func):\"unknown function\"]+\" at \"+stackTrace()}function ___errno_location(){return ___errno_state}Module[\"_memset\"]=_memset;var _BDtoILow=true;function _readdir_r(dirp,entry,result){var stream=FS.getStreamFromPtr(dirp);if(!stream){return ___setErrNo(ERRNO_CODES.EBADF)}if(!stream.currReading){try{stream.currReading=FS.readdir(stream.path)}catch(e){return FS.handleFSError(e)}}if(stream.position<0||stream.position>=stream.currReading.length){HEAP32[result>>2]=0;return 0}var id;var type;var name=stream.currReading[stream.position++];if(!name.indexOf(\".\")){id=1;type=4}else{try{var child=FS.lookupNode(stream.node,name)}catch(e){return _readdir_r(dirp,entry,result)}id=child.id;type=FS.isChrdev(child.mode)?2:FS.isDir(child.mode)?4:FS.isLink(child.mode)?10:8}HEAP32[entry>>2]=id;HEAP32[entry+4>>2]=stream.position;HEAP32[entry+8>>2]=name.length+1;for(var i=0;i<name.length;i++){HEAP8[entry+11+i>>0]=name.charCodeAt(i)}HEAP8[entry+11+i>>0]=0;HEAP8[entry+10>>0]=type;HEAP32[result>>2]=entry;return 0}function _readdir(dirp){var stream=FS.getStreamFromPtr(dirp);if(!stream){___setErrNo(ERRNO_CODES.EBADF);return 0}if(!_readdir.entry)_readdir.entry=_malloc(268);if(!_readdir.result)_readdir.result=_malloc(4);var err=_readdir_r(dirp,_readdir.entry,_readdir.result);if(err){___setErrNo(err);return 0}return HEAP32[_readdir.result>>2]}function _strerror_r(errnum,strerrbuf,buflen){if(errnum in ERRNO_MESSAGES){if(ERRNO_MESSAGES[errnum].length>buflen-1){return ___setErrNo(ERRNO_CODES.ERANGE)}else{var msg=ERRNO_MESSAGES[errnum];writeAsciiToMemory(msg,strerrbuf);return 0}}else{return ___setErrNo(ERRNO_CODES.EINVAL)}}function _strerror(errnum){if(!_strerror.buffer)_strerror.buffer=_malloc(256);_strerror_r(errnum,_strerror.buffer,256);return _strerror.buffer}Module[\"_bitshift64Shl\"]=_bitshift64Shl;function _abort(){Module[\"abort\"]()}function _unlink(path){path=Pointer_stringify(path);try{FS.unlink(path);return 0}catch(e){FS.handleFSError(e);return-1}}function _rmdir(path){path=Pointer_stringify(path);try{FS.rmdir(path);return 0}catch(e){FS.handleFSError(e);return-1}}function _remove(path){var ret=_unlink(path);if(ret==-1)ret=_rmdir(path);return ret}function _pthread_once(ptr,func){if(!_pthread_once.seen)_pthread_once.seen={};if(ptr in _pthread_once.seen)return;Runtime.dynCall(\"v\",func);_pthread_once.seen[ptr]=1}var PTHREAD_SPECIFIC={};function _pthread_getspecific(key){return PTHREAD_SPECIFIC[key]||0}var _fabs=Math_abs;var _floor=Math_floor;function _lseek(fildes,offset,whence){var stream=FS.getStream(fildes);if(!stream){___setErrNo(ERRNO_CODES.EBADF);return-1}try{return FS.llseek(stream,offset,whence)}catch(e){FS.handleFSError(e);return-1}}function _fseek(stream,offset,whence){var fd=_fileno(stream);var ret=_lseek(fd,offset,whence);if(ret==-1){return-1}stream=FS.getStreamFromPtr(stream);stream.eof=false;return 0}var _sqrt=Math_sqrt;var _emscripten_check_longjmp=true;function _ftell(stream){stream=FS.getStreamFromPtr(stream);if(!stream){___setErrNo(ERRNO_CODES.EBADF);return-1}if(FS.isChrdev(stream.node.mode)){___setErrNo(ERRNO_CODES.ESPIPE);return-1}else{return stream.position}}var _abs=Math_abs;var Browser={mainLoop:{scheduler:null,method:\"\",shouldPause:false,paused:false,queue:[],pause:(function(){Browser.mainLoop.shouldPause=true}),resume:(function(){if(Browser.mainLoop.paused){Browser.mainLoop.paused=false;Browser.mainLoop.scheduler()}Browser.mainLoop.shouldPause=false}),updateStatus:(function(){if(Module[\"setStatus\"]){var message=Module[\"statusMessage\"]||\"Please wait...\";var remaining=Browser.mainLoop.remainingBlockers;var expected=Browser.mainLoop.expectedBlockers;if(remaining){if(remaining<expected){Module[\"setStatus\"](message+\" (\"+(expected-remaining)+\"/\"+expected+\")\")}else{Module[\"setStatus\"](message)}}else{Module[\"setStatus\"](\"\")}}}),runIter:(function(func){if(ABORT)return;if(Module[\"preMainLoop\"]){var preRet=Module[\"preMainLoop\"]();if(preRet===false){return}}try{func()}catch(e){if(e instanceof ExitStatus){return}else{if(e&&typeof e===\"object\"&&e.stack)Module.printErr(\"exception thrown: \"+[e,e.stack]);throw e}}if(Module[\"postMainLoop\"])Module[\"postMainLoop\"]()})},isFullScreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:(function(){if(!Module[\"preloadPlugins\"])Module[\"preloadPlugins\"]=[];if(Browser.initted)return;Browser.initted=true;try{new Blob;Browser.hasBlobConstructor=true}catch(e){Browser.hasBlobConstructor=false;console.log(\"warning: no blob constructor, cannot create blobs with mimetypes\")}Browser.BlobBuilder=typeof MozBlobBuilder!=\"undefined\"?MozBlobBuilder:typeof WebKitBlobBuilder!=\"undefined\"?WebKitBlobBuilder:!Browser.hasBlobConstructor?console.log(\"warning: no BlobBuilder\"):null;Browser.URLObject=typeof window!=\"undefined\"?window.URL?window.URL:window.webkitURL:undefined;if(!Module.noImageDecoding&&typeof Browser.URLObject===\"undefined\"){console.log(\"warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.\");Module.noImageDecoding=true}var imagePlugin={};imagePlugin[\"canHandle\"]=function imagePlugin_canHandle(name){return!Module.noImageDecoding&&/\\.(jpg|jpeg|png|bmp)$/i.test(name)};imagePlugin[\"handle\"]=function imagePlugin_handle(byteArray,name,onload,onerror){var b=null;if(Browser.hasBlobConstructor){try{b=new Blob([byteArray],{type:Browser.getMimetype(name)});if(b.size!==byteArray.length){b=new Blob([(new Uint8Array(byteArray)).buffer],{type:Browser.getMimetype(name)})}}catch(e){Runtime.warnOnce(\"Blob constructor present but fails: \"+e+\"; falling back to blob builder\")}}if(!b){var bb=new Browser.BlobBuilder;bb.append((new Uint8Array(byteArray)).buffer);b=bb.getBlob()}var url=Browser.URLObject.createObjectURL(b);var img=new Image;img.onload=function img_onload(){assert(img.complete,\"Image \"+name+\" could not be decoded\");var canvas=document.createElement(\"canvas\");canvas.width=img.width;canvas.height=img.height;var ctx=canvas.getContext(\"2d\");ctx.drawImage(img,0,0);Module[\"preloadedImages\"][name]=canvas;Browser.URLObject.revokeObjectURL(url);if(onload)onload(byteArray)};img.onerror=function img_onerror(event){console.log(\"Image \"+url+\" could not be decoded\");if(onerror)onerror()};img.src=url};Module[\"preloadPlugins\"].push(imagePlugin);var audioPlugin={};audioPlugin[\"canHandle\"]=function audioPlugin_canHandle(name){return!Module.noAudioDecoding&&name.substr(-4)in{\".ogg\":1,\".wav\":1,\".mp3\":1}};audioPlugin[\"handle\"]=function audioPlugin_handle(byteArray,name,onload,onerror){var done=false;function finish(audio){if(done)return;done=true;Module[\"preloadedAudios\"][name]=audio;if(onload)onload(byteArray)}function fail(){if(done)return;done=true;Module[\"preloadedAudios\"][name]=new Audio;if(onerror)onerror()}if(Browser.hasBlobConstructor){try{var b=new Blob([byteArray],{type:Browser.getMimetype(name)})}catch(e){return fail()}var url=Browser.URLObject.createObjectURL(b);var audio=new Audio;audio.addEventListener(\"canplaythrough\",(function(){finish(audio)}),false);audio.onerror=function audio_onerror(event){if(done)return;console.log(\"warning: browser could not fully decode audio \"+name+\", trying slower base64 approach\");function encode64(data){var BASE=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";var PAD=\"=\";var ret=\"\";var leftchar=0;var leftbits=0;for(var i=0;i<data.length;i++){leftchar=leftchar<<8|data[i];leftbits+=8;while(leftbits>=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src=\"data:audio/x-\"+name.substr(-3)+\";base64,\"+encode64(byteArray);finish(audio)};audio.src=url;Browser.safeSetTimeout((function(){finish(audio)}),1e4)}else{return fail()}};Module[\"preloadPlugins\"].push(audioPlugin);var canvas=Module[\"canvas\"];function pointerLockChange(){Browser.pointerLock=document[\"pointerLockElement\"]===canvas||document[\"mozPointerLockElement\"]===canvas||document[\"webkitPointerLockElement\"]===canvas||document[\"msPointerLockElement\"]===canvas}if(canvas){canvas.requestPointerLock=canvas[\"requestPointerLock\"]||canvas[\"mozRequestPointerLock\"]||canvas[\"webkitRequestPointerLock\"]||canvas[\"msRequestPointerLock\"]||(function(){});canvas.exitPointerLock=document[\"exitPointerLock\"]||document[\"mozExitPointerLock\"]||document[\"webkitExitPointerLock\"]||document[\"msExitPointerLock\"]||(function(){});canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener(\"pointerlockchange\",pointerLockChange,false);document.addEventListener(\"mozpointerlockchange\",pointerLockChange,false);document.addEventListener(\"webkitpointerlockchange\",pointerLockChange,false);document.addEventListener(\"mspointerlockchange\",pointerLockChange,false);if(Module[\"elementPointerLock\"]){canvas.addEventListener(\"click\",(function(ev){if(!Browser.pointerLock&&canvas.requestPointerLock){canvas.requestPointerLock();ev.preventDefault()}}),false)}}}),createContext:(function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx)return Module.ctx;var ctx;var errorInfo=\"?\";function onContextCreationError(event){errorInfo=event.statusMessage||errorInfo}try{if(useWebGL){var contextAttributes={antialias:false,alpha:false};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}canvas.addEventListener(\"webglcontextcreationerror\",onContextCreationError,false);try{[\"experimental-webgl\",\"webgl\"].some((function(webglId){return ctx=canvas.getContext(webglId,contextAttributes)}))}finally{canvas.removeEventListener(\"webglcontextcreationerror\",onContextCreationError,false)}}else{ctx=canvas.getContext(\"2d\")}if(!ctx)throw\":(\"}catch(e){Module.print(\"Could not create canvas: \"+[errorInfo,e]);return null}if(useWebGL){canvas.style.backgroundColor=\"black\"}if(setInModule){if(!useWebGL)assert(typeof GLctx===\"undefined\",\"cannot set in module if GLctx is used, but we are a non-GL context that would replace it\");Module.ctx=ctx;if(useWebGL)GLctx=ctx;Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach((function(callback){callback()}));Browser.init()}return ctx}),destroyContext:(function(canvas,useWebGL,setInModule){}),fullScreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullScreen:(function(lockPointer,resizeCanvas){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;if(typeof Browser.lockPointer===\"undefined\")Browser.lockPointer=true;if(typeof Browser.resizeCanvas===\"undefined\")Browser.resizeCanvas=false;var canvas=Module[\"canvas\"];function fullScreenChange(){Browser.isFullScreen=false;var canvasContainer=canvas.parentNode;if((document[\"webkitFullScreenElement\"]||document[\"webkitFullscreenElement\"]||document[\"mozFullScreenElement\"]||document[\"mozFullscreenElement\"]||document[\"fullScreenElement\"]||document[\"fullscreenElement\"]||document[\"msFullScreenElement\"]||document[\"msFullscreenElement\"]||document[\"webkitCurrentFullScreenElement\"])===canvasContainer){canvas.cancelFullScreen=document[\"cancelFullScreen\"]||document[\"mozCancelFullScreen\"]||document[\"webkitCancelFullScreen\"]||document[\"msExitFullscreen\"]||document[\"exitFullscreen\"]||(function(){});canvas.cancelFullScreen=canvas.cancelFullScreen.bind(document);if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullScreen=true;if(Browser.resizeCanvas)Browser.setFullScreenCanvasSize()}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas)Browser.setWindowedCanvasSize()}if(Module[\"onFullScreen\"])Module[\"onFullScreen\"](Browser.isFullScreen);Browser.updateCanvasDimensions(canvas)}if(!Browser.fullScreenHandlersInstalled){Browser.fullScreenHandlersInstalled=true;document.addEventListener(\"fullscreenchange\",fullScreenChange,false);document.addEventListener(\"mozfullscreenchange\",fullScreenChange,false);document.addEventListener(\"webkitfullscreenchange\",fullScreenChange,false);document.addEventListener(\"MSFullscreenChange\",fullScreenChange,false)}var canvasContainer=document.createElement(\"div\");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullScreen=canvasContainer[\"requestFullScreen\"]||canvasContainer[\"mozRequestFullScreen\"]||canvasContainer[\"msRequestFullscreen\"]||(canvasContainer[\"webkitRequestFullScreen\"]?(function(){canvasContainer[\"webkitRequestFullScreen\"](Element[\"ALLOW_KEYBOARD_INPUT\"])}):null);canvasContainer.requestFullScreen()}),nextRAF:0,fakeRequestAnimationFrame:(function(func){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)}),requestAnimationFrame:function requestAnimationFrame(func){if(typeof window===\"undefined\"){Browser.fakeRequestAnimationFrame(func)}else{if(!window.requestAnimationFrame){window.requestAnimationFrame=window[\"requestAnimationFrame\"]||window[\"mozRequestAnimationFrame\"]||window[\"webkitRequestAnimationFrame\"]||window[\"msRequestAnimationFrame\"]||window[\"oRequestAnimationFrame\"]||Browser.fakeRequestAnimationFrame}window.requestAnimationFrame(func)}},safeCallback:(function(func){return(function(){if(!ABORT)return func.apply(null,arguments)})}),safeRequestAnimationFrame:(function(func){return Browser.requestAnimationFrame((function(){if(!ABORT)func()}))}),safeSetTimeout:(function(func,timeout){Module[\"noExitRuntime\"]=true;return setTimeout((function(){if(!ABORT)func()}),timeout)}),safeSetInterval:(function(func,timeout){Module[\"noExitRuntime\"]=true;return setInterval((function(){if(!ABORT)func()}),timeout)}),getMimetype:(function(name){return{\"jpg\":\"image/jpeg\",\"jpeg\":\"image/jpeg\",\"png\":\"image/png\",\"bmp\":\"image/bmp\",\"ogg\":\"audio/ogg\",\"wav\":\"audio/wav\",\"mp3\":\"audio/mpeg\"}[name.substr(name.lastIndexOf(\".\")+1)]}),getUserMedia:(function(func){if(!window.getUserMedia){window.getUserMedia=navigator[\"getUserMedia\"]||navigator[\"mozGetUserMedia\"]}window.getUserMedia(func)}),getMovementX:(function(event){return event[\"movementX\"]||event[\"mozMovementX\"]||event[\"webkitMovementX\"]||0}),getMovementY:(function(event){return event[\"movementY\"]||event[\"mozMovementY\"]||event[\"webkitMovementY\"]||0}),getMouseWheelDelta:(function(event){var delta=0;switch(event.type){case\"DOMMouseScroll\":delta=event.detail;break;case\"mousewheel\":delta=-event.wheelDelta;break;case\"wheel\":delta=event.deltaY;break;default:throw\"unrecognized mouse wheel event: \"+event.type}return Math.max(-1,Math.min(1,delta))}),mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:(function(event){if(Browser.pointerLock){if(event.type!=\"mousemove\"&&\"mozMovementX\"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!=\"undefined\"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module[\"canvas\"].getBoundingClientRect();var cw=Module[\"canvas\"].width;var ch=Module[\"canvas\"].height;var scrollX=typeof window.scrollX!==\"undefined\"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!==\"undefined\"?window.scrollY:window.pageYOffset;if(event.type===\"touchstart\"||event.type===\"touchend\"||event.type===\"touchmove\"){var touch=event.touch;if(touch===undefined){return}var adjustedX=touch.pageX-(scrollX+rect.left);var adjustedY=touch.pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);var coords={x:adjustedX,y:adjustedY};if(event.type===\"touchstart\"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type===\"touchend\"||event.type===\"touchmove\"){Browser.lastTouches[touch.identifier]=Browser.touches[touch.identifier];Browser.touches[touch.identifier]={x:adjustedX,y:adjustedY}}return}var x=event.pageX-(scrollX+rect.left);var y=event.pageY-(scrollY+rect.top);x=x*(cw/rect.width);y=y*(ch/rect.height);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y}}),xhrLoad:(function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)}),asyncLoad:(function(url,onload,onerror,noRunDep){Browser.xhrLoad(url,(function(arrayBuffer){assert(arrayBuffer,'Loading data file \"'+url+'\" failed (no arrayBuffer).');onload(new Uint8Array(arrayBuffer));if(!noRunDep)removeRunDependency(\"al \"+url)}),(function(event){if(onerror){onerror()}else{throw'Loading data file \"'+url+'\" failed.'}}));if(!noRunDep)addRunDependency(\"al \"+url)}),resizeListeners:[],updateResizeListeners:(function(){var canvas=Module[\"canvas\"];Browser.resizeListeners.forEach((function(listener){listener(canvas.width,canvas.height)}))}),setCanvasSize:(function(width,height,noUpdates){var canvas=Module[\"canvas\"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()}),windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:(function(){if(typeof SDL!=\"undefined\"){var flags=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];flags=flags|8388608;HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=flags}Browser.updateResizeListeners()}),setWindowedCanvasSize:(function(){if(typeof SDL!=\"undefined\"){var flags=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];flags=flags&~8388608;HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=flags}Browser.updateResizeListeners()}),updateCanvasDimensions:(function(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module[\"forcedAspectRatio\"]&&Module[\"forcedAspectRatio\"]>0){if(w/h<Module[\"forcedAspectRatio\"]){w=Math.round(h*Module[\"forcedAspectRatio\"])}else{h=Math.round(w/Module[\"forcedAspectRatio\"])}}if((document[\"webkitFullScreenElement\"]||document[\"webkitFullscreenElement\"]||document[\"mozFullScreenElement\"]||document[\"mozFullscreenElement\"]||document[\"fullScreenElement\"]||document[\"fullscreenElement\"]||document[\"msFullScreenElement\"]||document[\"msFullscreenElement\"]||document[\"webkitCurrentFullScreenElement\"])===canvas.parentNode&&typeof screen!=\"undefined\"){var factor=Math.min(screen.width/w,screen.height/h);w=Math.round(w*factor);h=Math.round(h*factor)}if(Browser.resizeCanvas){if(canvas.width!=w)canvas.width=w;if(canvas.height!=h)canvas.height=h;if(typeof canvas.style!=\"undefined\"){canvas.style.removeProperty(\"width\");canvas.style.removeProperty(\"height\")}}else{if(canvas.width!=wNative)canvas.width=wNative;if(canvas.height!=hNative)canvas.height=hNative;if(typeof canvas.style!=\"undefined\"){if(w!=wNative||h!=hNative){canvas.style.setProperty(\"width\",w+\"px\",\"important\");canvas.style.setProperty(\"height\",h+\"px\",\"important\")}else{canvas.style.removeProperty(\"width\");canvas.style.removeProperty(\"height\")}}}})};function _pthread_setspecific(key,value){if(!(key in PTHREAD_SPECIFIC)){return ERRNO_CODES.EINVAL}PTHREAD_SPECIFIC[key]=value;return 0}function _malloc(bytes){var ptr=Runtime.dynamicAlloc(bytes+8);return ptr+8&4294967288}Module[\"_malloc\"]=_malloc;function ___cxa_allocate_exception(size){var ptr=_malloc(size+___cxa_exception_header_size);return ptr+___cxa_exception_header_size}var _sin=Math_sin;var _ceilf=Math_ceil;function ___cxa_pure_virtual(){ABORT=true;throw\"Pure virtual function called!\"}function _time(ptr){var ret=Math.floor(Date.now()/1e3);if(ptr){HEAP32[ptr>>2]=ret}return ret}function _gmtime_r(time,tmPtr){var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();HEAP32[tmPtr+36>>2]=0;HEAP32[tmPtr+32>>2]=0;var start=new Date(date);start.setUTCDate(1);start.setUTCMonth(0);start.setUTCHours(0);start.setUTCMinutes(0);start.setUTCSeconds(0);start.setUTCMilliseconds(0);var yday=Math.floor((date.getTime()-start.getTime())/(1e3*60*60*24));HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+40>>2]=___tm_timezone;return tmPtr}function _gmtime(time){return _gmtime_r(time,___tm_current)}function _closedir(dirp){var fd=_fileno(dirp);var stream=FS.getStream(fd);if(stream.currReading)stream.currReading=null;return _close(fd)}var _floorf=Math_floor;var ___cxa_caught_exceptions=[];function ___cxa_begin_catch(ptr){__ZSt18uncaught_exceptionv.uncaught_exception--;___cxa_caught_exceptions.push(___cxa_last_thrown_exception);return ptr}var _emscripten_setjmp=true;var _cos=Math_cos;function _fputs(s,stream){var fd=_fileno(stream);return _write(fd,s,_strlen(s))}function _puts(s){var stdout=HEAP32[_stdout>>2];var ret=_fputs(s,stdout);if(ret<0){return ret}else{var newlineRet=_fputc(10,stdout);return newlineRet<0?-1:ret+1}}var _atan2=Math_atan2;Module[\"_strcpy\"]=_strcpy;Module[\"_llvm_bswap_i16\"]=_llvm_bswap_i16;var PTHREAD_SPECIFIC_NEXT_KEY=1;function _pthread_key_create(key,destructor){if(key==0){return ERRNO_CODES.EINVAL}HEAP32[key>>2]=PTHREAD_SPECIFIC_NEXT_KEY;PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY]=0;PTHREAD_SPECIFIC_NEXT_KEY++;return 0}var _acos=Math_acos;var ___dso_handle=allocate(1,\"i32*\",ALLOC_STATIC);___errno_state=Runtime.staticAlloc(4);HEAP32[___errno_state>>2]=0;FS.staticInit();__ATINIT__.unshift({func:(function(){if(!Module[\"noFSInit\"]&&!FS.init.initialized)FS.init()})});__ATMAIN__.push({func:(function(){FS.ignorePermissions=false})});__ATEXIT__.push({func:(function(){FS.quit()})});Module[\"FS_createFolder\"]=FS.createFolder;Module[\"FS_createPath\"]=FS.createPath;Module[\"FS_createDataFile\"]=FS.createDataFile;Module[\"FS_createPreloadedFile\"]=FS.createPreloadedFile;Module[\"FS_createLazyFile\"]=FS.createLazyFile;Module[\"FS_createLink\"]=FS.createLink;Module[\"FS_createDevice\"]=FS.createDevice;__ATINIT__.unshift({func:(function(){TTY.init()})});__ATEXIT__.push({func:(function(){TTY.shutdown()})});TTY.utf8=new Runtime.UTF8Processor;if(ENVIRONMENT_IS_NODE){var fs=require(\"fs\");NODEFS.staticInit()}__ATINIT__.push({func:(function(){SOCKFS.root=FS.mount(SOCKFS,{},null)})});_fputc.ret=allocate([0],\"i8\",ALLOC_STATIC);Module[\"requestFullScreen\"]=function Module_requestFullScreen(lockPointer,resizeCanvas){Browser.requestFullScreen(lockPointer,resizeCanvas)};Module[\"requestAnimationFrame\"]=function Module_requestAnimationFrame(func){Browser.requestAnimationFrame(func)};Module[\"setCanvasSize\"]=function Module_setCanvasSize(width,height,noUpdates){Browser.setCanvasSize(width,height,noUpdates)};Module[\"pauseMainLoop\"]=function Module_pauseMainLoop(){Browser.mainLoop.pause()};Module[\"resumeMainLoop\"]=function Module_resumeMainLoop(){Browser.mainLoop.resume()};Module[\"getUserMedia\"]=function Module_getUserMedia(){Browser.getUserMedia()};STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);staticSealed=true;STACK_MAX=STACK_BASE+5242880;DYNAMIC_BASE=DYNAMICTOP=Runtime.alignMemory(STACK_MAX);assert(DYNAMIC_BASE<TOTAL_MEMORY,\"TOTAL_MEMORY not big enough for stack\");var ctlz_i8=allocate([8,7,6,6,5,5,5,5,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"i8\",ALLOC_DYNAMIC);var cttz_i8=allocate([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0],\"i8\",ALLOC_DYNAMIC);var Math_min=Math.min;function invoke_iiiiiiii(index,a1,a2,a3,a4,a5,a6,a7){try{return Module[\"dynCall_iiiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){try{Module[\"dynCall_viiiii\"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_vid(index,a1,a2){try{Module[\"dynCall_vid\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_iiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9){try{return Module[\"dynCall_iiiiiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_vii(index,a1,a2){try{Module[\"dynCall_vii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_iiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10){try{return Module[\"dynCall_iiiiiiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_iiiddd(index,a1,a2,a3,a4,a5){try{return Module[\"dynCall_iiiddd\"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_ii(index,a1){try{return Module[\"dynCall_ii\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_viidddd(index,a1,a2,a3,a4,a5,a6){try{Module[\"dynCall_viidddd\"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_iiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11){try{return Module[\"dynCall_iiiiiiiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_vidi(index,a1,a2,a3){try{Module[\"dynCall_vidi\"](index,a1,a2,a3)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_viiddii(index,a1,a2,a3,a4,a5,a6){try{Module[\"dynCall_viiddii\"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_iiii(index,a1,a2,a3){try{return Module[\"dynCall_iiii\"](index,a1,a2,a3)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_vi(index,a1){try{Module[\"dynCall_vi\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_iiidddd(index,a1,a2,a3,a4,a5,a6){try{return Module[\"dynCall_iiidddd\"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){try{Module[\"dynCall_viiiiii\"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_viiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8){try{Module[\"dynCall_viiiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7,a8)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_di(index,a1){try{return Module[\"dynCall_di\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){try{return Module[\"dynCall_iiiiiii\"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_v(index){try{Module[\"dynCall_v\"](index)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_vidddd(index,a1,a2,a3,a4,a5){try{Module[\"dynCall_vidddd\"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_iiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12){try{return Module[\"dynCall_iiiiiiiiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_iid(index,a1,a2){try{return Module[\"dynCall_iid\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_diid(index,a1,a2,a3){try{return Module[\"dynCall_diid\"](index,a1,a2,a3)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7){try{Module[\"dynCall_viiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_viiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9){try{Module[\"dynCall_viiiiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_viiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10){try{Module[\"dynCall_viiiiiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_iii(index,a1,a2){try{return Module[\"dynCall_iii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){try{return Module[\"dynCall_iiiiii\"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_vidddddd(index,a1,a2,a3,a4,a5,a6,a7){try{Module[\"dynCall_vidddddd\"](index,a1,a2,a3,a4,a5,a6,a7)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_did(index,a1,a2){try{return Module[\"dynCall_did\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_viiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12){try{Module[\"dynCall_viiiiiiiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){try{return Module[\"dynCall_iiiii\"](index,a1,a2,a3,a4)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_i(index){try{return Module[\"dynCall_i\"](index)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_iiiiiiidiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10){try{return Module[\"dynCall_iiiiiiidiii\"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_viii(index,a1,a2,a3){try{Module[\"dynCall_viii\"](index,a1,a2,a3)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_idi(index,a1,a2){try{return Module[\"dynCall_idi\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_iiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8){try{return Module[\"dynCall_iiiiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7,a8)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_iiddddiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9){try{return Module[\"dynCall_iiddddiiii\"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){try{Module[\"dynCall_viiii\"](index,a1,a2,a3,a4)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;asm[\"setThrew\"](1,0)}}function asmPrintInt(x,y){Module.print(\"int \"+x+\",\"+y)}function asmPrintFloat(x,y){Module.print(\"float \"+x+\",\"+y)}var asm=(function(global,env,buffer) {\n// EMSCRIPTEN_START_ASM\n\"use asm\";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.STACKTOP|0;var j=env.STACK_MAX|0;var k=env.tempDoublePtr|0;var l=env.ABORT|0;var m=env.cttz_i8|0;var n=env.ctlz_i8|0;var o=env.___rand_seed|0;var p=env.___dso_handle|0;var q=env._stderr|0;var r=0;var s=0;var t=0;var u=0;var v=+env.NaN,w=+env.Infinity;var x=0,y=0,z=0,A=0,B=0.0,C=0,D=0,E=0,F=0.0;var G=0;var H=0;var I=0;var J=0;var K=0;var L=0;var M=0;var N=0;var O=0;var P=0;var Q=global.Math.floor;var R=global.Math.abs;var S=global.Math.sqrt;var T=global.Math.pow;var U=global.Math.cos;var V=global.Math.sin;var W=global.Math.tan;var X=global.Math.acos;var Y=global.Math.asin;var Z=global.Math.atan;var _=global.Math.atan2;var $=global.Math.exp;var aa=global.Math.log;var ba=global.Math.ceil;var ca=global.Math.imul;var da=env.abort;var ea=env.assert;var fa=env.asmPrintInt;var ga=env.asmPrintFloat;var ha=env.min;var ia=env.invoke_iiiiiiii;var ja=env.invoke_viiiii;var ka=env.invoke_vid;var la=env.invoke_iiiiiiiiii;var ma=env.invoke_vii;var na=env.invoke_iiiiiiiiiii;var oa=env.invoke_iiiddd;var pa=env.invoke_ii;var qa=env.invoke_viidddd;var ra=env.invoke_iiiiiiiiiiii;var sa=env.invoke_vidi;var ta=env.invoke_viiddii;var ua=env.invoke_iiii;var va=env.invoke_vi;var wa=env.invoke_iiidddd;var xa=env.invoke_viiiiii;var ya=env.invoke_viiiiiiii;var za=env.invoke_di;var Aa=env.invoke_iiiiiii;var Ba=env.invoke_v;var Ca=env.invoke_vidddd;var Da=env.invoke_iiiiiiiiiiiii;var Ea=env.invoke_iid;var Fa=env.invoke_diid;var Ga=env.invoke_viiiiiii;var Ha=env.invoke_viiiiiiiii;var Ia=env.invoke_viiiiiiiiii;var Ja=env.invoke_iii;var Ka=env.invoke_iiiiii;var La=env.invoke_vidddddd;var Ma=env.invoke_did;var Na=env.invoke_viiiiiiiiiiii;var Oa=env.invoke_iiiii;var Pa=env.invoke_i;var Qa=env.invoke_iiiiiiidiii;var Ra=env.invoke_viii;var Sa=env.invoke_idi;var Ta=env.invoke_iiiiiiiii;var Ua=env.invoke_iiddddiiii;var Va=env.invoke_viiii;var Wa=env._fabs;var Xa=env._sqrtf;var Ya=env._fread;var Za=env.__reallyNegative;var _a=env.___assert_fail;var $a=env._floor;var ab=env.__ZSt18uncaught_exceptionv;var bb=env._longjmp;var cb=env._fsync;var db=env._sbrk;var eb=env.___cxa_begin_catch;var fb=env._emscripten_memcpy_big;var gb=env._rint;var hb=env._sysconf;var ib=env._close;var jb=env._cos;var kb=env._readdir;var lb=env._puts;var mb=env._unlink;var nb=env._write;var ob=env._ftell;var pb=env._log;var qb=env.___cxa_atexit;var rb=env._gmtime_r;var sb=env.___cxa_does_inherit;var tb=env._closedir;var ub=env._send;var vb=env._atan2;var wb=env.___cxa_is_number_type;var xb=env.___cxa_find_matching_catch;var yb=env._opendir;var zb=env._strerror_r;var Ab=env.___setErrNo;var Bb=env.___resumeException;var Cb=env._putchar;var Db=env._gmtime;var Eb=env._lrintf;var Fb=env._pthread_once;var Gb=env._printf;var Hb=env._localtime;var Ib=env._read;var Jb=env._fwrite;var Kb=env._time;var Lb=env._pthread_mutex_lock;var Mb=env._readdir_r;var Nb=env._llvm_pow_f64;var Ob=env._lseek;var Pb=env._vfprintf;var Qb=env._rmdir;var Rb=env.___cxa_allocate_exception;var Sb=env._ceilf;var Tb=env._pwrite;var Ub=env._localtime_r;var Vb=env._tzset;var Wb=env._open;var Xb=env._fabsf;var Yb=env._remove;var Zb=env._pthread_getspecific;var _b=env._fseek;var $b=env._pthread_mutex_destroy;var ac=env._fclose;var bc=env._floorf;var cc=env._pthread_key_create;var dc=env._recv;var ec=env._abort;var fc=env._abs;var gc=env._fopen;var hc=env.___cxa_pure_virtual;var ic=env._sin;var jc=env._acos;var kc=env._fflush;var lc=env._fprintf;var mc=env._log10;var nc=env._fileno;var oc=env._fputs;var pc=env._pthread_mutex_unlock;var qc=env._pread;var rc=env._PDFiumJS_read_file;var sc=env._mkport;var tc=env.___errno_location;var uc=env._pthread_setspecific;var vc=env._fputc;var wc=env.___cxa_throw;var xc=env._strerror;var yc=env._emscripten_longjmp;var zc=env.__formatString;var Ac=env._atexit;var Bc=env._sqrt;var Cc=env._pthread_mutex_init;var Dc=0.0;\n// EMSCRIPTEN_START_FUNCS\nfunction ws(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=gr((c[a+16>>2]|0)+40|0,c[a+4>>2]|0)|0;if((e|0)==0){f=0;i=d;return f|0}g=fq(e+72|0,c[a+12>>2]|0)|0;if((g|0)==0){f=0;i=d;return f|0}a=c[g+28>>2]|0;if((a|0)==0){f=1;i=d;return f|0}g=b+48|0;c[a+0>>2]=c[g+0>>2];c[a+4>>2]=c[g+4>>2];c[a+8>>2]=c[g+8>>2];c[a+12>>2]=c[g+12>>2];c[a+16>>2]=c[g+16>>2];c[a+20>>2]=c[g+20>>2];c[a+24>>2]=c[g+24>>2];f=1;i=d;return f|0}function xs(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0.0,l=0.0;d=i;e=a+4|0;f=a+8|0;h=c[f>>2]|0;c[b>>2]=c[e>>2];c[b+4>>2]=h;c[b+8>>2]=-1;h=a+16|0;a=gr((c[h>>2]|0)+40|0,c[e>>2]|0)|0;if((a|0)==0){j=0;i=d;return j|0}e=qt(a+52|0,c[f>>2]|0)|0;if((e|0)==0){j=0;i=d;return j|0}f=c[h>>2]|0;k=+(+g[e+28>>2]+ +g[a+20>>2]+ +g[f+8>>2]);l=+(+g[f+20>>2]-(+g[e+32>>2]+ +g[a+32>>2]));a=b+24|0;g[a>>2]=k;g[a+4>>2]=l;g[b+32>>2]=+g[e+36>>2];g[b+36>>2]=+g[e+40>>2];g[b+40>>2]=+g[e+44>>2];a=c[e+8>>2]|0;f=c[e+24>>2]|0;c[b+12>>2]=c[e+4>>2];c[b+16>>2]=a;c[b+20>>2]=f;j=1;i=d;return j|0}function ys(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0;d=i;i=i+16|0;e=d;f=a+4|0;c[b>>2]=c[f>>2];c[b+4>>2]=0;c[b+8>>2]=-1;h=a+16|0;a=gr((c[h>>2]|0)+40|0,c[f>>2]|0)|0;if((a|0)==0){j=0;i=d;return j|0}f=b+12|0;k=c[h>>2]|0;Sr(e,+g[k+8>>2],+g[k+20>>2],a+20|0);c[f+0>>2]=c[e+0>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];c[f+12>>2]=c[e+12>>2];e=c[a+40>>2]|0;if((e|0)!=0){f=b+28|0;c[f+0>>2]=c[e+0>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2]}e=c[a+44>>2]|0;if((e|0)==0){j=1;i=d;return j|0}a=b+40|0;c[a+0>>2]=c[e+0>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];c[a+16>>2]=c[e+16>>2];c[a+20>>2]=c[e+20>>2];c[a+24>>2]=c[e+24>>2];j=1;i=d;return j|0}function zs(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=gr((c[a+16>>2]|0)+40|0,c[a+4>>2]|0)|0;if((e|0)==0){f=0;i=d;return f|0}a=c[e+40>>2]|0;if((a|0)!=0){g=b+28|0;c[a+0>>2]=c[g+0>>2];c[a+4>>2]=c[g+4>>2];c[a+8>>2]=c[g+8>>2]}g=c[e+44>>2]|0;if((g|0)==0){f=1;i=d;return f|0}e=b+40|0;c[g+0>>2]=c[e+0>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];c[g+12>>2]=c[e+12>>2];c[g+16>>2]=c[e+16>>2];c[g+20>>2]=c[e+20>>2];c[g+24>>2]=c[e+24>>2];f=1;i=d;return f|0}function As(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+8|0;c[e+0>>2]=c[b+0>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];i=d;return}function Bs(a,b){a=a|0;b=b|0;c[a+76>>2]=b;return}function Cs(a,c){a=a|0;c=c|0;b[a+92>>1]=c;return}function Ds(a,b){a=a|0;b=b|0;c[a+56>>2]=b;return}function Es(a,b){a=a|0;b=b|0;c[a+60>>2]=b;return}function Fs(a,b){a=a|0;b=+b;g[a+84>>2]=b;return}function Gs(a,b){a=a|0;b=b|0;c[a+88>>2]=b;return}function Hs(a,b){a=a|0;b=b|0;c[a+64>>2]=b;return}function Is(a,b){a=a|0;b=b|0;c[a+68>>2]=b;return}function Js(a,b){a=a|0;b=b|0;c[a+72>>2]=b;return}function Ks(a,b){a=a|0;b=+b;g[a+100>>2]=b;return}function Ls(a,b){a=a|0;b=+b;g[a+80>>2]=b;return}function Ms(a,b){a=a|0;b=b|0;c[a+108>>2]=b;return}function Ns(a){a=a|0;return c[a+104>>2]|0}function Os(a){a=a|0;return c[a+108>>2]|0}function Ps(a){a=a|0;return a+8|0}function Qs(a){a=a|0;return+(+g[a+100>>2])}function Rs(a){a=a|0;return c[a+76>>2]|0}function Ss(a){a=a|0;return b[a+92>>1]|0}function Ts(a){a=a|0;return c[a+60>>2]|0}function Us(a){a=a|0;return c[a+56>>2]|0}function Vs(a){a=a|0;return c[a+64>>2]|0}function Ws(a){a=a|0;return c[a+88>>2]|0}function Xs(a){a=a|0;return+(+g[a+84>>2])}function Ys(a,b){a=a|0;b=b|0;var d=0;d=i;if((c[b+104>>2]|0)==0){c[a>>2]=-1;c[a+4>>2]=-1;c[a+8>>2]=-1;i=d;return}else{c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=-1;i=d;return}}function Zs(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=gr(b+40|0,(c[b+44>>2]|0)+ -1|0)|0;if((e|0)==0){c[a>>2]=-1;c[a+4>>2]=-1;c[a+8>>2]=-1;i=d;return}else{sq(a,e);i=d;return}}function _s(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+ -4+8|0;c[e+0>>2]=c[b+0>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];i=d;return}function $s(a){a=a|0;return a+ -4+8|0}function at(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+20|0;c[e+0>>2]=c[b+0>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];i=d;return}function bt(a){a=a|0;return a+4|0}function ct(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)>=0?(c[a+4>>2]|0)>(b|0):0){e=c[(c[a>>2]|0)+(b<<2)>>2]|0;i=d;return e|0}b=c[0]|0;da();e=b;i=d;return e|0}function dt(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)>=0?(c[a+4>>2]|0)>(b|0):0){e=c[(c[a>>2]|0)+(b<<2)>>2]|0;i=d;return e|0}b=c[0]|0;da();e=b;i=d;return e|0}function et(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=3952;d=c[a+28>>2]|0;if((d|0)==0){i=b;return}v2a(d);i=b;return}function ft(a){a=a|0;var b=0;b=i;et(a);v2a(a);i=b;return}function gt(a,b){a=a|0;b=b|0;c[a>>2]=c[b>>2];g[a+4>>2]=+g[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];c[a+16>>2]=c[b+16>>2];g[a+20>>2]=+g[b+20>>2];c[a+24>>2]=c[b+24>>2];return}function ht(a){a=a|0;var b=0;b=i;if((a&65535)<128?(c[3960+((a&65535)<<2)>>2]&1|0)!=0:0){i=b;return 1}if((a+ -192<<16>>16&65535)<64|(a+ -256<<16>>16&65535)<336|(a+ -7680<<16>>16&65535)<256|(a+ -11360<<16>>16&65535)<32|(a+22752<<16>>16&65535)<224|(a+223<<16>>16&65535)<26){i=b;return 1}else{i=b;return(a+191<<16>>16&65535)<26|0}return 0}function it(a){a=a|0;var b=0,d=0,e=0;b=i;do{if(a>>>0<128){if((c[3960+(a<<2)>>2]&8|0)!=0){d=1;i=b;return d|0}}else{if((a+ -128|0)>>>0<128){if(a>>>0<149){d=1;i=b;return d|0}if((a|0)==150|(a|0)==180|(a|0)==184){d=1}else{break}i=b;return d|0}if((a+ -8192|0)>>>0<112){if((a&-2|0)==8208|(a|0)==8210|(a|0)==8211|(a|0)==8216|(a|0)==8217|(a|0)==8218|(a|0)==8219|(a|0)==8220|(a|0)==8221|(a|0)==8222|(a|0)==8223|(a|0)==8242|(a|0)==8243|(a|0)==8244|(a|0)==8245|(a|0)==8246|(a|0)==8247|(a|0)==8252|(a|0)==8253|(a|0)==8254|(a|0)==8260){d=1}else{break}i=b;return d|0}if((a+ -12288|0)>>>0<64){if((a+ -12289|0)>>>0<3|(a|0)==12293|(a|0)==12297|(a|0)==12298|(a|0)==12299|(a|0)==12300|(a|0)==12301|(a|0)==12303|(a|0)==12302|(a|0)==12304|(a|0)==12305|(a|0)==12308|(a|0)==12309|(a|0)==12310|(a|0)==12311|(a|0)==12312|(a|0)==12313|(a|0)==12314|(a|0)==12315|(a|0)==12317|(a|0)==12318|(a|0)==12319){d=1}else{break}i=b;return d|0}e=a+ -65104|0;if(e>>>0<32){if(e>>>0<15|(a|0)==65123){d=1}else{break}i=b;return d|0}if((a+ -65280|0)>>>0<240?(a+ -65281|0)>>>0<2|(a|0)==65287|(a|0)==65288|(a|0)==65289|(a|0)==65292|(a|0)==65294|(a|0)==65295|(a|0)==65306|(a|0)==65307|(a|0)==65311|(a|0)==65339|(a|0)==65341|(a|0)==65344|(a|0)==65371|(a|0)==65372|(a|0)==65373|(a|0)==65377|(a|0)==65378|(a|0)==65379|(a|0)==65380|(a|0)==65381|(a|0)==65438|(a|0)==65439:0){d=1;i=b;return d|0}}}while(0);d=0;i=b;return d|0}function jt(a){a=a|0;var b=0,d=0;b=i;if(a>>>0<128?(c[3960+(a<<2)>>2]&32|0)!=0:0){d=1}else{d=0}i=b;return d|0}function kt(a){a=a|0;var b=0;a:do{switch(a<<16>>16){case 165:case 164:case 163:case 162:case 128:case 36:{b=1;break};default:{if((a+ -8352<<16>>16&65535)<48){b=1}else{switch(a<<16>>16){case-407:case-252:case-32:case-31:case-27:case-26:{b=1;break a;break};default:{}}b=a<<16>>16==8470&1}}}}while(0);return b|0}function lt(a){a=a|0;var b=0,c=0;b=i;if((a+ -4352|0)>>>0<256|(a+ -11904|0)>>>0<384|(a+ -12352|0)>>>0<28544|(a+ -44032|0)>>>0<11184|(a+ -63744|0)>>>0<512|(a+ -65072|0)>>>0<32|(a+ -131072|0)>>>0<42720|(a+ -194560|0)>>>0<544){c=1;i=b;return c|0}if((a+ -12288|0)>>>0<64){c=((a+ -12293|0)>>>0<2|(a|0)==12321|(a|0)==12322|(a|0)==12323|(a|0)==12324|(a|0)==12325|(a|0)==12326|(a|0)==12327|(a|0)==12328|(a|0)==12329|(a|0)==12337|(a|0)==12338|(a|0)==12339|(a|0)==12340|(a|0)==12341)&1;i=b;return c|0}else{c=(a+ -65382|0)>>>0<56&1;i=b;return c|0}return 0}function mt(a,b){a=a|0;b=b|0;var d=0;d=i;if((b|0)>-1?(c[a+4>>2]|0)>(b|0):0){Oja(a,b)}i=d;return}function nt(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b;e=a+12|0;if((Nm(a,e)|0)<=0){i=b;return}c[d+0>>2]=c[e+0>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[e+0>>2]=c[a+0>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];i=b;return}function ot(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+4|0;f=c[e>>2]|0;g=f+1|0;do{if((f|0)>=(c[a+8>>2]|0)){if((Kja(a,g)|0)==0){i=d;return}else{h=c[e>>2]|0;break}}else{c[e>>2]=g;h=g}}while(0);c[(c[a>>2]|0)+(h+ -1<<2)>>2]=b;i=d;return}function pt(a,d){a=a|0;d=d|0;var e=0,f=0,g=0;e=i;c[a>>2]=3952;b[a+4>>1]=0;f=a+8|0;g=a+24|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[g>>2]=-1;c[a+28>>2]=0;Qr(a,d);i=e;return}function qt(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)>-1?(c[a+4>>2]|0)>(b|0):0){e=rt(a,b)|0}else{e=0}i=d;return e|0}function rt(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)>=0?(c[a+4>>2]|0)>(b|0):0){e=c[(c[a>>2]|0)+(b<<2)>>2]|0;i=d;return e|0}b=c[0]|0;da();e=b;i=d;return e|0}function st(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=4480;d=c[a+24>>2]|0;if((d|0)!=0){v2a(d)}d=c[a+28>>2]|0;if((d|0)==0){i=b;return}v2a(d);i=b;return}function tt(a){a=a|0;var b=0;b=i;st(a);$1a(a);i=b;return}function ut(a){a=a|0;var b=0;b=i;c[a>>2]=4496;eq(a);Jja(c[a+4>>2]|0);i=b;return}function vt(a){a=a|0;var b=0;b=i;ut(a);$1a(a);i=b;return}function wt(a){a=a|0;var b=0;b=i;c[a>>2]=4496;Ija(a+4|0,4);c[a+20>>2]=0;i=b;return}function xt(){return c[1126]|0}function yt(){var a=0,b=0;a=i;b=u2a(84)|0;zt(b);c[1126]=b;At(b);c[b>>2]=512;i=a;return}function zt(a){a=a|0;var b=0;b=i;c[a+20>>2]=0;Yma(a+24|0);Lma(a+44|0,10);Ija(a+68|0,16);c[a+4>>2]=0;c[a+12>>2]=0;c[a+8>>2]=0;c[a>>2]=512;i=b;return}function At(a){a=a|0;var b=0,d=0;b=i;c[a+4>>2]=0;d=u2a(4)|0;c[d>>2]=4568;c[a+12>>2]=d;d=u2a(4)|0;c[d>>2]=4520;c[a+8>>2]=d;i=b;return}function Bt(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;i=i+16|0;e=d;pe(e,c);lka(a,b,e);i=d;return}function Ct(a,b){a=a|0;b=b|0;var c=0;c=i;Dna(a+68|0,100,b,518);i=c;return}function Dt(a){a=a|0;var b=0,c=0;b=i;c=Fna(a+68|0)|0;i=b;return c|0}function Et(a){a=a|0;var b=0;if((a|0)==0){b=0}else{b=c[a+4>>2]|0}return b|0}function Ft(a){a=a|0;var b=0;if((a|0)==0){b=0}else{b=c[a+8>>2]|0}return b|0}function Gt(a){a=a|0;var b=0;if((a|0)==0){b=0}else{b=c[a+12>>2]|0}return b|0}function Ht(a){a=a|0;var b=0;if((a|0)==0){b=0}else{b=c[a+16>>2]|0}return b|0}function It(a){a=a|0;var b=0;if((a|0)==0){b=0}else{b=c[a+20>>2]|0}return b|0}function Jt(a){a=a|0;var b=0;if((a|0)==0){b=0}else{b=c[a+24>>2]|0}return b|0}function Kt(a){a=a|0;return}function Lt(a){a=a|0;var b=0;b=i;v2a(a);i=b;return}function Mt(a,b){a=a|0;b=b|0;return 0}function Nt(a,b){a=a|0;b=b|0;return}function Ot(a,b){a=a|0;b=b|0;return}function Pt(a){a=a|0;return 0}function Qt(a,b){a=a|0;b=b|0;return 0}function Rt(a,b){a=a|0;b=b|0;return}function St(a){a=a|0;return}function Tt(a){a=a|0;return 0}function Ut(a){a=a|0;return}function Vt(a){a=a|0;var b=0;b=i;v2a(a);i=b;return}function Wt(a,b){a=a|0;b=b|0;return 0}function Xt(a,b){a=a|0;b=b|0;return}function Yt(a,b){a=a|0;b=b|0;return}function Zt(a){a=a|0;return 0}function _t(a,b){a=a|0;b=b|0;return}function $t(a){a=a|0;return}function au(a,b){a=a|0;b=b|0;return 0}function bu(){var a=0,b=0,d=0;a=i;b=c[(xt()|0)+12>>2]|0;d=Lc[c[(c[b>>2]|0)+20>>2]&255](b)|0;c[d+100>>2]=4608;c[d+104>>2]=14;c[d+140>>2]=40088;c[d+144>>2]=19088;i=a;return}function cu(){var a=0,b=0,d=0;a=i;b=c[(xt()|0)+12>>2]|0;d=Lc[c[(c[b>>2]|0)+20>>2]&255](b)|0;c[d+92>>2]=5248;c[d+96>>2]=14;c[d+132>>2]=251736;c[d+136>>2]=30284;i=a;return}function du(){var a=0,b=0,d=0;a=i;b=c[(xt()|0)+12>>2]|0;d=Lc[c[(c[b>>2]|0)+20>>2]&255](b)|0;c[d+108>>2]=5888;c[d+112>>2]=20;c[d+148>>2]=488728;c[d+152>>2]=15444;i=a;return}function eu(){var a=0,b=0,d=0;a=i;b=c[(xt()|0)+12>>2]|0;d=Lc[c[(c[b>>2]|0)+20>>2]&255](b)|0;c[d+116>>2]=6800;c[d+120>>2]=11;c[d+156>>2]=566936;c[d+160>>2]=18352;i=a;return}function fu(a){a=a|0;var b=0,d=0;b=i;Ija(a,16);GI(a+16|0,0);c[a+60>>2]=0;c[a+64>>2]=0;Ija(a+80|0,4);c[a+52>>2]=0;c[a+56>>2]=0;c[a+68>>2]=0;c[a+72>>2]=0;c[a+76>>2]=0;d=c[(xt()|0)+12>>2]|0;c[a+96>>2]=dd[c[(c[d>>2]|0)+8>>2]&511](d,a)|0;d=c[(xt()|0)+8>>2]|0;c[a+100>>2]=dd[c[(c[d>>2]|0)+8>>2]&511](d,a)|0;i=b;return}function gu(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;i=i+64|0;d=b+48|0;e=b+40|0;f=b+32|0;g=b+24|0;h=b+16|0;j=b+8|0;k=b;l=u2a(32)|0;Dh(l);m=a+52|0;c[m>>2]=l;pe(d,669480);eka(e,7312,-1);tI(l,d,e);dka(e);e=a+16|0;II(e,c[m>>2]|0)|0;d=u2a(32)|0;Dh(d);pe(f,669480);eka(g,38568,-1);tI(d,f,g);dka(g);pe(h,38848);wI(d,h,0.0);pe(j,38832);h=u2a(28)|0;wl(h);oI(d,j,h,0);h=II(e,d)|0;d=c[m>>2]|0;pe(k,38568);vI(d,k,e,h);h=u2a(32)|0;Dh(h);c[a+56>>2]=h;II(e,h)|0;i=b;return}function hu(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0;g=i;i=i+384|0;h=g+376|0;j=g+368|0;k=g+360|0;l=g+352|0;m=g+344|0;n=g+336|0;o=g+328|0;p=g+320|0;q=g+312|0;r=g+308|0;s=g+304|0;t=g+296|0;u=g+288|0;v=g+280|0;w=g+272|0;x=g+264|0;y=g+256|0;z=g+248|0;A=g+240|0;B=g+232|0;C=g+228|0;D=g+224|0;E=g+216|0;F=g+208|0;G=g+200|0;H=g+192|0;I=g+184|0;J=g+176|0;K=g+168|0;L=g+160|0;M=g+152|0;N=g+144|0;O=g+136|0;P=g+128|0;Q=g+120|0;R=g+112|0;S=g+104|0;T=g+96|0;U=g+88|0;V=g+80|0;W=g+72|0;X=g+64|0;Y=g+56|0;Z=g+48|0;_=g+40|0;$=g+24|0;aa=g+16|0;ba=g+8|0;ca=g;if((e|0)==0){da=0;i=g;return da|0}ea=f+ -128|0;if(ea>>>0<9){fa=(323>>>(ea&511)&1)!=0}else{fa=0}qHa(h,e);pe(j,1305864);pe(k,1305928);Uka(h,j,k);k=c[e>>2]|0;j=(oHa(k)|0)==0;ea=j?0:262144;j=nHa(k)|0;k=pHa(c[e>>2]|0)|0;ga=(k|0)!=0|((j|0)==0?ea:ea|64);ea=u2a(32)|0;Dh(ea);pe(l,669480);eka(m,669472,-1);tI(ea,l,m);dka(m);m=uHa(e)|0;if(fa){fa=ga|32;l=u2a(32)|0;Dh(l);c[C>>2]=0;c[D>>2]=0;j=u2a(28)|0;wl(j);if((f|0)==129){mka(C,7432);mka(D,33216);UH(j,1);iu(e,m,32,126,j);ha=2}else if((f|0)==136){mka(C,7416);mka(D,33200);UH(j,1);iu(e,m,32,126,j);ha=4}else if((f|0)==134){mka(C,31504);mka(D,33192);UH(j,7716);iu(e,m,32,32,j);UH(j,814);iu(e,m,33,126,j);ha=2}else if((f|0)==128){mka(C,7448);mka(D,33208);UH(j,231);iu(e,m,32,125,j);UH(j,326);iu(e,m,160,160,j);UH(j,327);iu(e,m,161,223,j);UH(j,631);iu(e,m,126,126,j);ha=5}else{ha=0}pe(E,669432);eka(F,11672,-1);tI(ea,E,F);dka(F);pe(G,34552);tI(ea,G,h);pe(H,1280496);tI(ea,H,C);pe(I,1274880);oI(l,I,j,0);pe(J,669480);eka(K,669472,-1);tI(l,J,K);dka(K);pe(L,669432);eka(M,7464,-1);tI(l,L,M);dka(M);pe(N,34552);tI(l,N,h);N=u2a(32)|0;Dh(N);pe(O,1282944);eka(P,7480,-1);uI(N,O,P);dka(P);pe(Q,1282960);uI(N,Q,D);pe(R,1282976);sI(N,R,ha);pe(S,31416);oI(l,S,N,0);N=u2a(28)|0;wl(N);pe(T,31368);oI(ea,T,N,0);T=b+16|0;II(T,l)|0;WH(N,T,c[l+4>>2]|0);dka(D);dka(C);ia=T;ja=fa;ka=l}else{l=u2a(28)|0;wl(l);fa=32;do{UH(l,iHa(e,dd[c[(c[m>>2]|0)+8>>2]&511](m,fa)|0)|0);fa=fa+1|0}while((fa|0)<128);a:do{if(f>>>0<3){fa=ga|((f|0)==2?4:32);c[n>>2]=1280496;c[n+4>>2]=8;eka(o,11776,-1);tI(ea,n,o);dka(o);T=128;do{UH(l,iHa(e,dd[c[(c[m>>2]|0)+8>>2]&511](m,T)|0)|0);T=T+1|0}while((T|0)<256);la=fa}else{fa=ga|32;T=0;while(1){C=T+1|0;if((d[7320+(T<<3)>>0]|0)==(f|0)){break}if(C>>>0<8){T=C}else{la=fa;break a}}C=u2a(32)|0;Dh(C);c[p>>2]=12008;c[p+4>>2]=12;eka(q,11776,-1);tI(C,p,q);dka(q);D=u2a(28)|0;wl(D);UH(D,128);N=c[7324+(T<<3)>>2]|0;S=t+4|0;ha=0;do{R=N+(ha<<2)|0;Yv(r,c[R>>2]|0);Q=c[r>>2]|0;if((Q|0)!=0?(c[Q+4>>2]|0)!=0:0){SH(D,r)}else{c[t>>2]=1278688;c[S>>2]=7;jka(s,t);SH(D,s);dka(s)}UH(l,iHa(e,dd[c[(c[m>>2]|0)+8>>2]&511](m,c[R>>2]|0)|0)|0);dka(r);ha=ha+1|0}while((ha|0)<128);c[u>>2]=12024;c[u+4>>2]=11;oI(C,u,D,0);ha=b+16|0;II(ha,C)|0;c[v>>2]=1280496;c[v+4>>2]=8;vI(ea,v,ha,c[C+4>>2]|0);la=fa}}while(0);v=c[e>>2]|0;do{if((oHa(v)|0)!=0){if((nHa(v)|0)==0){ma=c[e>>2]|0;na=24;break}else{rka(h,7384);break}}else{ma=v;na=24}}while(0);do{if((na|0)==24){if((oHa(ma)|0)!=0){rka(h,7400);break}if((nHa(ma)|0)!=0){rka(h,7408)}}}while(0);pe(w,669432);eka(x,1278496,-1);tI(ea,w,x);dka(x);pe(y,34552);tI(ea,y,h);pe(z,12136);wI(ea,z,32.0);pe(A,12152);wI(ea,A,255.0);pe(B,34536);oI(ea,B,l,0);ia=b+16|0;ja=la;ka=ea}II(ia,ea)|0;la=u2a(32)|0;Dh(la);pe(U,669480);eka(V,31384,-1);tI(la,U,V);dka(V);pe(W,1280448);tI(la,W,h);pe(X,11680);sI(la,X,ja);pe(Y,1283104);ja=e+4|0;X=c[ja>>2]|0;if((X|0)==0){oa=0}else{oa=c[X+20>>2]|0}sI(la,Y,oa);pe(Z,11696);sI(la,Z,lHa(c[e>>2]|0)|0);pe(_,11704);sI(la,_,mHa(c[e>>2]|0)|0);rHa(e,$);_=u2a(28)|0;wl(_);UH(_,c[$>>2]|0);UH(_,c[$+12>>2]|0);UH(_,c[$+8>>2]|0);UH(_,c[$+4>>2]|0);pe(aa,1283584);oI(la,aa,_,0);_=c[ja>>2]|0;if((_|0)==0){ja=1;aa=iHa(e,dd[c[(c[m>>2]|0)+8>>2]&511](m,105)|0)|0;while(1){$=iHa(e,dd[c[(c[m>>2]|0)+8>>2]&511](m,a[7488+ja>>0]|0)|0)|0;Z=($|0)>0&($|0)<(aa|0)?$:aa;ja=ja+1|0;if(!(ja>>>0<4)){pa=Z;break}else{aa=Z}}}else{pa=(c[_+16>>2]|0)/5|0}if((m|0)!=0){Rc[c[(c[m>>2]|0)+4>>2]&1023](m)}pe(ba,11688);sI(la,ba,pa);II(ia,la)|0;pe(ca,31384);vI(ka,ca,ia,c[la+4>>2]|0);la=RA(b,ea)|0;dka(h);da=la;i=g;return da|0}function iu(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;h=e-d|0;e=h+1|0;j=w2a(e,4)|0;k=(h|0)>-1;a:do{if(k){l=0;do{c[j+(l<<2)>>2]=iHa(a,dd[c[(c[b>>2]|0)+8>>2]&511](b,l+d|0)|0)|0;l=l+1|0}while((l|0)<(e|0));if((h|0)>0){l=c[j>>2]|0;m=1;while(1){n=m+1|0;if((c[j+(m<<2)>>2]|0)!=(l|0)){o=m;break a}if((n|0)<(e|0)){m=n}else{o=n;break}}}else{o=1}}else{o=1}}while(0);if((o|0)==(e|0)){UH(f,(JH(f,(c[f+16>>2]|0)+ -1|0)|0)+h|0);UH(f,c[j>>2]|0);v2a(j);i=g;return}h=u2a(28)|0;wl(h);RH(f,h);if(k){p=0}else{v2a(j);i=g;return}do{UH(h,c[j+(p<<2)>>2]|0);p=p+1|0}while((p|0)<(e|0));v2a(j);i=g;return}function ju(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d+8|0;f=d;eka(e,b,-1);if((JHa(e)|0)<0){g=0;dka(e);i=d;return g|0}b=IG(a)|0;oe(f,e);g=lB(b,f,c)|0;dka(e);i=d;return g|0}function ku(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;if((Nja(a,b)|0)==0){i=e;return}c[(c[a>>2]|0)+(b<<2)>>2]=d;i=e;return}function lu(a,b,d){a=a|0;b=b|0;d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;g=c[a+36>>2]|0;if((g|0)<=0){h=0;i=f;return h|0}j=c[a+40>>2]|0;k=0;while(1){l=c[j+(k<<2)>>2]|0;if((e[l+8>>1]|0|0)==(b|0)?(e[l+10>>1]|0|0)==(d|0):0){break}k=k+1|0;if((k|0)>=(g|0)){h=0;m=7;break}}if((m|0)==7){i=f;return h|0}VEa(a,l)|0;h=1;i=f;return h|0}function mu(a){a=a|0;var b=0,d=0;b=i;zma(a+4|0,10);Zv(a+28|0);d=a+84|0;a=d+84|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(a|0));i=b;return}function nu(a){a=a|0;var b=0;b=i;ou(a);v2a(c[a+164>>2]|0);_v(a+28|0);Bma(a+4|0);i=b;return}function ou(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;i=i+16|0;d=b+8|0;e=b+4|0;f=b;g=a+4|0;h=(c[a+12>>2]|0)==0;c[d>>2]=h?0:-1;if(h){i=b;return}do{c[e>>2]=0;c[f>>2]=0;Cma(g,d,e,f);h=c[f>>2]|0;if((h|0)!=0){a=0;do{j=h+(a<<2)|0;k=c[j>>2]|0;do{if((k|0)!=0){l=c[k+96>>2]|0;if((l|0)!=0){bH(l);l=c[j>>2]|0;if((l|0)==0){break}else{m=l}}else{m=k}Rc[c[(c[m>>2]|0)+4>>2]&1023](m)}}while(0);a=a+1|0}while((a|0)!=14);v2a(h)}Jma(g,c[e>>2]|0)}while((c[d>>2]|0)!=0);i=b;return}function pu(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;c[f>>2]=0;if((Dma(a+4|0,b,f)|0)!=0?(b=c[f>>2]|0,(b|0)!=0):0){g=c[b+(d<<2)>>2]|0}else{g=0}i=e;return g|0}function qu(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;i=i+16|0;g=f;c[g>>2]=0;h=a+4|0;if((Dma(h,b,g)|0)!=0){c[(c[g>>2]|0)+(d<<2)>>2]=e;i=f;return}g=u2a(56)|0;a=g+0|0;j=a+56|0;do{c[a>>2]=0;a=a+4|0}while((a|0)<(j|0));if((g|0)!=0){c[g+(d<<2)>>2]=e}c[(Gma(h,b)|0)>>2]=g;i=f;return}function ru(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+16|0;e=d;c[e>>2]=0;f=a+4|0;if((Dma(f,b,e)|0)==0){i=d;return}a=c[e>>2]|0;if((a|0)!=0){e=0;do{g=a+(e<<2)|0;h=c[g>>2]|0;do{if((h|0)!=0){j=c[h+96>>2]|0;if((j|0)!=0){bH(j);j=c[g>>2]|0;if((j|0)==0){break}else{k=j}}else{k=h}Rc[c[(c[k>>2]|0)+4>>2]&1023](k)}}while(0);e=e+1|0}while((e|0)!=14);v2a(a)}Jma(f,b);i=d;return}function su(a){a=a|0;var b=0,d=0,e=0;b=i;c[a>>2]=11600;eHa(a+8|0);d=a+100|0;e=a+80|0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;e=d+0|0;d=e+44|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(d|0));i=b;return}function tu(a){a=a|0;var b=0,d=0;b=i;d=u2a(16)|0;c[d+4>>2]=158;c[d>>2]=159;c[d+12>>2]=a;c[a+80>>2]=d;i=b;return}function uu(a){a=a|0;var b=0;b=i;vu(a);v2a(a);i=b;return}function vu(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;c[a>>2]=11600;d=a+80|0;e=c[d>>2]|0;if((e|0)!=0){v2a(e);c[d>>2]=0}d=a+100|0;e=c[d>>2]|0;if((e|0)!=0){Rv(e);v2a(e);c[d>>2]=0}d=a+92|0;if((c[d>>2]|0)==0){f=a+88|0;dka(f);g=a+8|0;fHa(g);i=b;return}e=IG(c[a+4>>2]|0)|0;yB(e,c[(c[d>>2]|0)+20>>2]|0);f=a+88|0;dka(f);g=a+8|0;fHa(g);i=b;return}function wu(a){a=a|0;var b=0,d=0;b=i;if((a|0)==0?1:(c[a+84>>2]|0)!=4){d=c[a+72>>2]|0;i=b;return d|0}else{d=Lc[c[(c[a>>2]|0)+8>>2]&255](a)|0;i=b;return d|0}return 0}function xu(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;i=i+16|0;g=f+4|0;h=f;j=Qc[c[(c[b>>2]|0)+24>>2]&255](b,g,e)|0;if((j|0)==1){tka(d,a[g>>0]|0);i=f;return}else{eka(h,g,j);uka(d,c[h>>2]|0);dka(h);i=f;return}}function yu(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;if((c[b+104>>2]|0)==0){zu(b)}g=c[b+100>>2]|0;do{if((g|0)!=0){Au(f,g,d);if((dg(c[f>>2]|0)|0)!=0){Lna(f);break}Ona(a,f);Lna(f);i=e;return}}while(0);f=dd[c[(c[b>>2]|0)+56>>2]&511](b,d)|0;if((f|0)==0){c[a>>2]=0;i=e;return}else{Qna(a,f);i=e;return}}function zu(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;i=i+16|0;d=b;c[a+104>>2]=1;e=c[a+96>>2]|0;c[d>>2]=11760;c[d+4>>2]=9;f=kI(e,d)|0;if((f|0)==0){i=b;return}d=u2a(44)|0;Qv(d);c[a+100>>2]=d;Iu(d,f);i=b;return}function Au(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e;if((kna(c[b+12>>2]|0,c[b+16>>2]|0,d,f)|0)==0){g=c[b+24>>2]|0;if((g|0)==0){c[a>>2]=0;i=e;return}else{Qna(a,Cw(g,d&65535)|0);i=e;return}}d=c[f>>2]|0;f=d&65535;if((f|0)!=65535){Qna(a,f);i=e;return}f=c[b+32>>2]|0;g=(c[b+36>>2]|0)>>>2;if((f|0)==0|(g|0)==0){c[a>>2]=0;i=e;return}b=d>>>16;if(!(b>>>0<g>>>0)){c[a>>2]=0;i=e;return}d=c[f+(b<<2)>>2]|0;h=d+b|0;if(h>>>0>=b>>>0&h>>>0<g>>>0){Mna(a,f+(b+1<<2)|0,d);i=e;return}else{c[a>>2]=0;i=e;return}}function Bu(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;if((c[a+104>>2]|0)==0){zu(a)}e=c[a+100>>2]|0;if((e|0)!=0?(f=Cu(e,b)|0,(f|0)!=0):0){g=f;i=d;return g|0}g=dd[c[(c[a>>2]|0)+60>>2]&511](a,b)|0;i=d;return g|0}function Cu(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+16|0;e=d+8|0;f=d+4|0;g=d;h=a+4|0;j=mna(c[a+16>>2]|0)|0;c[e>>2]=j;if((j|0)==0){k=0;i=d;return k|0}while(1){nna(h,e,f,g);if((c[g>>2]|0)==(b|0)){break}if((c[e>>2]|0)==0){k=0;l=5;break}}if((l|0)==5){i=d;return k|0}k=c[f>>2]|0;i=d;return k|0}function Du(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+16|0;f=e+4|0;g=e;c[a>>2]=0;h=c[d>>2]|0;if((h|0)==0){j=0}else{j=c[h+4>>2]|0}koa(a,j);h=c[d>>2]|0;d=(h|0)==0?1305928:h+12|0;c[f>>2]=0;h=0;while(1){if((h|0)>=(j|0)){break}k=Qc[c[(c[b>>2]|0)+16>>2]&255](b,d,f)|0;yu(g,b,k);l=c[g>>2]|0;if((dg(l)|0)==0){$na(a,l)}else{Zna(a,k)}Lna(g);h=c[f>>2]|0}i=e;return}function Eu(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;c[a>>2]=0;f=c[d>>2]|0;if((f|0)==0){g=0}else{g=c[f+4>>2]|0}f=Bka(a,g<<1)|0;h=c[d>>2]|0;d=(h|0)==0?1292088:h+12|0;if((g|0)<=0){j=0;Aka(a,j);i=e;return}h=0;k=0;while(1){l=Bu(b,c[d+(k<<2)>>2]|0)|0;m=(Qc[c[(c[b>>2]|0)+24>>2]&255](b,f+h|0,l)|0)+h|0;k=k+1|0;if((k|0)>=(g|0)){j=m;break}else{h=m}}Aka(a,j);i=e;return}function Fu(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;d=i;i=i+112|0;e=d+104|0;f=d+96|0;g=d+88|0;h=d+80|0;j=d+72|0;k=d+64|0;l=d+56|0;m=d+48|0;n=d+40|0;o=d+32|0;p=d+24|0;q=d+16|0;r=d+8|0;s=d;c[e>>2]=11680;c[e+4>>2]=5;t=a+108|0;c[t>>2]=fI(b,e,32)|0;c[f>>2]=1283104;c[f+4>>2]=11;if((nI(b,f)|0)!=0){c[g>>2]=1283104;c[g+4>>2]=11;f=eI(b,g)|0;if((f|0)<0){c[t>>2]=c[t>>2]|64;c[a+140>>2]=f;u=1}else{u=1}}else{u=0}c[h>>2]=11688;c[h+4>>2]=5;if((nI(b,h)|0)==0){v=0}else{c[j>>2]=11688;c[j+4>>2]=5;c[a+128>>2]=eI(b,j)|0;v=1}c[k>>2]=11696;c[k+4>>2]=6;if((nI(b,k)|0)==0){w=0}else{c[l>>2]=11696;c[l+4>>2]=6;c[a+132>>2]=eI(b,l)|0;w=1}c[m>>2]=11704;c[m+4>>2]=7;if((nI(b,m)|0)==0){x=1}else{c[n>>2]=11704;c[n+4>>2]=7;c[a+136>>2]=eI(b,n)|0;x=0}c[o>>2]=1274312;c[o+4>>2]=9;if(!((u|0)==0|(w|0)==0|(nI(b,o)|0)==0|x|(v|0)==0)){c[t>>2]=c[t>>2]|524288}t=a+136|0;v=c[t>>2]|0;if((v|0)>10){c[t>>2]=0-v}c[p>>2]=1283584;c[p+4>>2]=8;v=jI(b,p)|0;if((v|0)!=0){c[a+112>>2]=JH(v,0)|0;c[a+124>>2]=JH(v,1)|0;c[a+120>>2]=JH(v,2)|0;c[a+116>>2]=JH(v,3)|0}c[q>>2]=11712;c[q+4>>2]=8;v=kI(b,q)|0;if((v|0)==0){c[r>>2]=11728;c[r+4>>2]=9;q=kI(b,r)|0;if((q|0)==0){c[s>>2]=11744;c[s+4>>2]=9;r=kI(b,s)|0;if((r|0)==0){i=d;return}else{y=r}}else{y=q}}else{y=v}v=TA(c[a+4>>2]|0,y)|0;y=a+92|0;c[y>>2]=v;if((v|0)==0){i=d;return}q=vH(v)|0;r=a+8|0;jHa(r,q,sH(v)|0);if((c[r>>2]|0)!=0){i=d;return}c[y>>2]=0;i=d;return}function Gu(a,b){a=a|0;b=b|0;var c=0,d=0;c=b&65535;if(b<<16>>16==0){d=a}else{d=((c>>>1)+(a*1e3|0)|0)/(c|0)|0}return d&65535|0}function Hu(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=i;i=i+32|0;e=d+16|0;f=d;g=a+112|0;h=a+116|0;do{if((((c[h>>2]|0)==0?(j=a+124|0,(c[j>>2]|0)==0):0)?(c[g>>2]|0)==0:0)?(k=a+120|0,(c[k>>2]|0)==0):0){l=c[a+8>>2]|0;if((l|0)!=0){m=l+68|0;c[g>>2]=(Gu(c[l+52>>2]|0,b[m>>1]|0)|0)<<16>>16;c[j>>2]=(Gu(c[l+56>>2]|0,b[m>>1]|0)|0)<<16>>16;c[k>>2]=(Gu(c[l+60>>2]|0,b[m>>1]|0)|0)<<16>>16;c[h>>2]=(Gu(c[l+64>>2]|0,b[m>>1]|0)|0)<<16>>16;c[a+132>>2]=(Gu(b[l+70>>1]|0,b[m>>1]|0)|0)<<16>>16;c[a+136>>2]=(Gu(b[l+72>>1]|0,b[m>>1]|0)|0)<<16>>16;break}m=e+8|0;l=e+4|0;n=e+12|0;o=1;p=0;while(1){pd[c[(c[a>>2]|0)+48>>2]&127](a,p,e,0);q=c[e>>2]|0;r=c[m>>2]|0;do{if((q|0)!=(r|0)){if((o|0)!=0){c[g+0>>2]=c[e+0>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];c[g+12>>2]=c[e+12>>2];s=0;break}t=c[l>>2]|0;if((c[h>>2]|0)<(t|0)){c[h>>2]=t}if((c[k>>2]|0)<(r|0)){c[k>>2]=r}if((c[g>>2]|0)>(q|0)){c[g>>2]=q}t=c[n>>2]|0;if((c[j>>2]|0)>(t|0)){c[j>>2]=t;s=0}else{s=0}}else{s=o}}while(0);p=p+1|0;if((p|0)==256){break}else{o=s}}}}while(0);s=a+132|0;if((c[s>>2]|0)!=0){i=d;return}g=a+136|0;if((c[g>>2]|0)!=0){i=d;return}pd[c[(c[a>>2]|0)+48>>2]&127](a,65,f,0);e=f+12|0;o=f+4|0;p=c[o>>2]|0;if((c[e>>2]|0)==(p|0)){u=c[h>>2]|0}else{u=p}c[s>>2]=u;pd[c[(c[a>>2]|0)+48>>2]&127](a,103,f,0);f=c[e>>2]|0;if((f|0)==(c[o>>2]|0)){c[g>>2]=c[a+124>>2];i=d;return}else{c[g>>2]=f;i=d;return}}function Iu(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0;d=i;i=i+288|0;e=d+252|0;f=d+240|0;g=d+232|0;h=d+224|0;j=d+216|0;k=d+208|0;l=d+200|0;m=d+192|0;n=d+184|0;o=d+180|0;p=d+176|0;q=d+168|0;r=d+160|0;s=d+152|0;t=d+144|0;u=d+136|0;v=d+128|0;w=d+120|0;x=d+112|0;y=d+104|0;z=d+96|0;A=d+88|0;B=d+80|0;C=d+72|0;D=d+64|0;E=d+56|0;F=d+48|0;G=d+40|0;H=d+36|0;I=d+32|0;J=d+24|0;K=d+16|0;L=d+8|0;M=d;EI(e);rH(e,b,0,0,0);b=vH(e)|0;nL(f,b,sH(e)|0);b=a+4|0;pna(b,(sH(e)|0)>>>3);N=g+4|0;O=h+4|0;P=n+4|0;Q=r+4|0;R=x+4|0;S=a+28|0;T=a+36|0;U=j+4|0;V=k+4|0;W=l+4|0;X=J+4|0;Y=K+4|0;Z=L+4|0;_=M+4|0;$=t+4|0;aa=u+4|0;ba=B+4|0;ca=E+4|0;da=F+4|0;ea=0;a:while(1){b:while(1){qL(g,f);if((c[N>>2]|0)==0){break a}c[h>>2]=11832;c[O>>2]=11;if(Ue(g,h)|0){while(1){qL(j,f);fa=c[j>>2]|0;c[g>>2]=fa;ga=c[U>>2]|0;c[N>>2]=ga;if((ga|0)==0){continue b}c[k>>2]=11848;c[V>>2]=9;if(Ue(g,k)|0){continue b}ha=Pu(fa,ga)|0;qL(l,f);ga=c[l>>2]|0;c[g>>2]=ga;fa=c[W>>2]|0;c[N>>2]=fa;Qu(m,ga,fa);fa=c[m>>2]|0;do{if((fa|0)!=0){ga=fa+4|0;ia=c[ga>>2]|0;if((ia|0)==0){break}else if((ia|0)==1){ona(b,ha,c[fa+12>>2]|0);break}else{ona(b,ha,c[T>>2]<<14|65535);vla(S,c[ga>>2]|0);xla(S,fa);break}}}while(0);Lna(m)}}c[n>>2]=11864;c[P>>2]=12;if(!(Ue(g,n)|0)){break}while(1){c[o>>2]=0;c[p>>2]=0;qL(q,f);kka(o,q);fa=c[o>>2]|0;if((fa|0)==0){ja=49;break}if((c[fa+4>>2]|0)==0){ja=3;break}c[r>>2]=11880;c[Q>>2]=10;if(vka(fa,r)|0){ja=2;break}qL(s,f);kka(p,s);oe(t,o);fa=Pu(c[t>>2]|0,c[$>>2]|0)|0;oe(u,p);ha=(Pu(c[u>>2]|0,c[aa>>2]|0)|0)&255|fa&-256;if((ha|0)==-1){ja=4;break}qL(w,f);jka(v,w);c[x>>2]=1292048;c[R>>2]=1;if(vka(c[v>>2]|0,x)|0){if(!(fa>>>0>ha>>>0)){ga=fa;do{qL(z,f);jka(y,z);oe(B,y);Qu(A,c[B>>2]|0,c[ba>>2]|0);ia=c[A>>2]|0;do{if((ia|0)!=0){ka=ia+4|0;la=c[ka>>2]|0;if((la|0)==1){ona(b,ga,c[ia+12>>2]|0);break}else if((la|0)==0){break}else{ona(b,ga,c[T>>2]<<14|65535);vla(S,c[ka>>2]|0);xla(S,ia);break}}}while(0);Lna(A);dka(y);ga=ga+1|0}while(!(ga>>>0>ha>>>0))}qL(C,f)}else{oe(E,v);Qu(D,c[E>>2]|0,c[ca>>2]|0);ga=c[D>>2]|0;if((ga|0)!=0?(c[ga+4>>2]|0)==1:0){oe(F,v);if(!(fa>>>0>ha>>>0)){ga=fa;ia=Pu(c[F>>2]|0,c[da>>2]|0)|0;while(1){ona(b,ga,ia);ga=ga+1|0;if(ga>>>0>ha>>>0){break}else{ia=ia+1|0}}}}else{ja=28}if((ja|0)==28?(ja=0,!(fa>>>0>ha>>>0)):0){ia=fa;do{c[G>>2]=0;if((ia|0)==(fa|0)){Pna(G,D)}else{Ona(I,D);c[H>>2]=0;ga=c[I>>2]|0;ka=(ga|0)==0;if(ka){ma=0;na=1}else{ma=c[ga+4>>2]|0;na=1}while(1){la=ma+ -1|0;if((ma|0)<=0){break}if(ka){oa=na}else{oa=(c[ga+(la<<2)+12>>2]|0)+na|0}ooa(H,oa);ma=la;na=0}if((na|0)!=0){ooa(H,na)}Pna(G,H);Lna(H);Lna(I)}ona(b,ia,c[T>>2]<<14|65535);ga=c[G>>2]|0;if((ga|0)==0){pa=0}else{pa=c[ga+4>>2]|0}vla(S,pa);xla(S,ga);Pna(D,G);Lna(G);ia=ia+1|0}while(!(ia>>>0>ha>>>0))}Lna(D)}dka(v);dka(p);dka(o)}if((ja|0)==2){ja=0;dka(p);dka(o);continue}else if((ja|0)==3){ja=0;dka(p);dka(o);continue}else if((ja|0)==4){ja=0;dka(p);dka(o);continue}else if((ja|0)==49){ja=0;dka(p);dka(o);continue}}c[J>>2]=11896;c[X>>2]=18;if(Ue(g,J)|0){ea=4;continue}c[K>>2]=11920;c[Y>>2]=18;if(Ue(g,K)|0){ea=3;continue}c[L>>2]=11944;c[Z>>2]=16;if(Ue(g,L)|0){ea=2;continue}c[M>>2]=11968;c[_>>2]=15;ha=Ue(g,M)|0;ea=ha?1:ea}if((ea|0)==0){c[a+24>>2]=0;FI(e);i=d;return}else{M=c[(xt()|0)+12>>2]|0;c[a+24>>2]=gw((Lc[c[(c[M>>2]|0)+20>>2]&255](M)|0)+28|0,ea)|0;FI(e);i=d;return}}function Ju(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=a+8|0;if((c[e>>2]|0)!=0?(f=Qc[c[(c[a>>2]|0)+32>>2]&255](a,b,0)|0,(f|0)!=65535):0){g=iHa(e,f)|0}else{g=0}i=d;return g|0}function Ku(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=i;i=i+96|0;e=d+80|0;f=d+72|0;g=d+64|0;h=d+56|0;j=d+48|0;k=d+40|0;l=d+32|0;m=d+24|0;n=d+16|0;o=d+8|0;p=d;jka(e,b);b=JHa(e)|0;if((b|0)<0){q=0;dka(e);i=d;return q|0}r=c[(xt()|0)+12>>2]|0;s=Lc[c[(c[r>>2]|0)+20>>2]&255](r)|0;r=pu(s,a,b)|0;if((r|0)!=0){q=r;dka(e);i=d;return q|0}r=Wm()|0;c[f>>2]=669480;c[f+4>>2]=4;c[h>>2]=669472;c[h+4>>2]=4;jka(g,h);tI(r,f,g);dka(g);c[j>>2]=669432;c[j+4>>2]=7;c[l>>2]=34544;c[l+4>>2]=5;jka(k,l);tI(r,j,k);dka(k);c[m>>2]=34552;c[m+4>>2]=8;tI(r,m,e);c[n>>2]=1280496;c[n+4>>2]=8;c[p>>2]=11776;c[p+4>>2]=15;jka(o,p);tI(r,n,o);dka(o);o=Lu(0,r)|0;qu(s,a,b,o);q=o;dka(e);i=d;return q|0}function Lu(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;d=i;i=i+80|0;e=d+72|0;f=d+64|0;g=d+56|0;h=d+48|0;j=d+40|0;k=d+36|0;l=d+32|0;m=d+24|0;n=d+16|0;o=d+8|0;p=d;c[f>>2]=669432;c[f+4>>2]=7;aI(e,b,f);c[g>>2]=1278496;c[g+4>>2]=8;f=c[e>>2]|0;do{if(vka(f,g)|0){c[j>>2]=34552;c[j+4>>2]=8;aI(h,b,j);Mka(k,h,4);q=c[k>>2]|0;r=0;while(1){eka(l,11792+(r*5|0)|0,-1);s=wka(q,l)|0;dka(l);r=r+1|0;if(s){t=5;break}if((r|0)>=5){u=1;v=0;break}}do{if((t|0)==5){c[m>>2]=31384;c[m+4>>2]=14;r=iI(b,m)|0;if((r|0)!=0?(c[n>>2]=11728,c[n+4>>2]=9,(nI(r,n)|0)!=0):0){u=1;v=0;break}r=u2a(2272)|0;Dw(r);tu(r);c[r+84>>2]=4;c[r+96>>2]=b;c[r+4>>2]=a;if((Mu(r)|0)==0){if((r|0)==0){u=0;v=0}else{Rc[c[(c[r>>2]|0)+4>>2]&1023](r);u=0;v=0}}else{u=0;v=r}}}while(0);dka(k);dka(h);if(u){r=u2a(4764)|0;Uu(r);c[r>>2]=12288;tu(r);c[r+84>>2]=2;w=r;break}else{x=v;dka(e);i=d;return x|0}}else{c[o>>2]=11664;c[o+4>>2]=5;if(vka(f,o)|0){r=u2a(5872)|0;qv(r);tu(r);c[r+84>>2]=3;w=r;break}c[p>>2]=11672;c[p+4>>2]=5;if(vka(f,p)|0){r=u2a(2272)|0;Dw(r);tu(r);c[r+84>>2]=4;w=r;break}else{r=u2a(4768)|0;ev(r);tu(r);c[r+84>>2]=1;w=r;break}}}while(0);c[w+96>>2]=b;c[w+4>>2]=a;if((Mu(w)|0)!=0){x=w;dka(e);i=d;return x|0}if((w|0)==0){x=0;dka(e);i=d;return x|0}Rc[c[(c[w>>2]|0)+4>>2]&1023](w);x=0;dka(e);i=d;return x|0}function Mu(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;i=i+48|0;d=b+40|0;e=b+32|0;f=b+24|0;g=b+16|0;h=b+8|0;j=b;k=a+96|0;l=c[k>>2]|0;if((l|0)==0){m=0;i=b;return m|0}c[e>>2]=669432;c[e+4>>2]=7;aI(d,l,e);e=c[k>>2]|0;c[g>>2]=34552;c[g+4>>2]=8;aI(f,e,g);ika(a+88|0,f);dka(f);c[h>>2]=11824;c[h+4>>2]=7;if(vka(c[d>>2]|0,h)|0){c[j>>2]=34544;c[j+4>>2]=5;kka(d,j)}j=Lc[c[(c[a>>2]|0)+52>>2]&255](a)|0;dka(d);m=j;i=b;return m|0}function Nu(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;Eu(a,c[b+12>>2]|0,d);i=e;return}function Ou(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;Du(a,c[b+12>>2]|0,d);i=e;return}function Pu(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;a:do{if((c|0)!=0){e=a[b>>0]|0;if(!(e<<24>>24==60)){if((c|0)>0){f=e;g=1;h=0}else{j=0;break}while(1){if((f+ -48<<24>>24&255)>9){j=h;break a}e=(h*10|0)+ -48+(f<<24>>24)|0;if((g|0)>=(c|0)){j=e;break a}f=a[b+g>>0]|0;g=g+1|0;h=e}}if((c|0)>1){e=1;k=0;while(1){l=a[b+e>>0]|0;m=l<<24>>24;do{if((l+ -48<<24>>24&255)<10){n=m+ -48|0}else{if((l+ -97<<24>>24&255)<6){n=m+ -87|0;break}if(!((l+ -65<<24>>24&255)<6)){j=k;break a}n=m+ -55|0}}while(0);m=n+(k<<4)|0;e=e+1|0;if((e|0)>=(c|0)){j=m;break}else{k=m}}}else{j=0}}else{j=0}}while(0);i=d;return j|0}function Qu(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=i;i=i+16|0;g=f;if((e|0)==0){c[b>>2]=0;i=f;return}c[g>>2]=0;if((a[d>>0]|0)==60){a:do{if((e|0)>1){h=0;j=0;k=1;while(1){l=a[d+k>>0]|0;m=l<<24>>24;do{if((l+ -48<<24>>24&255)<10){n=m+ -48|0}else{if((l+ -97<<24>>24&255)<6){n=m+ -87|0;break}if(!((l+ -65<<24>>24&255)<6)){break a}n=m+ -55|0}}while(0);m=n+(j<<4)|0;l=h+1|0;if((l|0)==4){Zna(g,m);o=0;p=0}else{o=l;p=m}k=k+1|0;if((k|0)>=(e|0)){break}else{h=o;j=p}}}}while(0);Ona(b,g)}else{Ona(b,g)}Lna(g);i=f;return}function Ru(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;h=i;i=i+64|0;j=h+56|0;k=h+48|0;l=h+40|0;m=h+32|0;n=h+24|0;o=h+16|0;p=h+8|0;q=h;if((b|0)==0){c[j>>2]=1290504;c[j+4>>2]=6;if(vka(c[a+88>>2]|0,j)|0){c[d>>2]=(g|0)!=0?8:5;i=h;return}if((f|0)!=0){i=h;return}if((c[d>>2]|0)!=0){i=h;return}c[d>>2]=1;i=h;return}j=c[b>>2]|0;if((j|0)==6){if(!(((c[d>>2]|0)+ -5|0)>>>0<2)){c[o>>2]=12008;c[o+4>>2]=12;aI(n,b,o);o=c[n>>2]|0;if((Zka(o,11984,17)|0)!=0|(g|0)==0){r=o}else{c[p>>2]=11776;c[p+4>>2]=15;kka(n,p);r=c[n>>2]|0}Su(d,r);dka(n)}if(!((f|0)!=0&(g|0)==0)?(c[d>>2]|0)==0:0){c[d>>2]=4}c[q>>2]=12024;c[q+4>>2]=11;f=jI(b,q)|0;if((f|0)==0){i=h;return}q=w2a(256,4)|0;c[e>>2]=q;a:do{if((q|0)!=0){n=q;r=0;while(1){c[n+(r<<2)>>2]=0;p=r+1|0;if((p|0)==256){break a}n=c[e>>2]|0;r=p}}}while(0);q=f+16|0;if((c[q>>2]|0)==0){i=h;return}else{s=0;t=0}while(1){r=GH(f,t)|0;do{if((r|0)==0){u=s}else{if((c[r>>2]|0)!=4){u=jH(r)|0;break}if(s>>>0<256){ika((c[e>>2]|0)+(s<<2)|0,r+12|0)}u=s+1|0}}while(0);t=t+1|0;if(!(t>>>0<(c[q>>2]|0)>>>0)){break}else{s=u}}i=h;return}else if((j|0)==4){if(((c[d>>2]|0)+ -5|0)>>>0<2){i=h;return}if((c[a+108>>2]&4|0)!=0?(c[k>>2]=1290504,c[k+4>>2]=6,vka(c[a+88>>2]|0,k)|0):0){if((g|0)!=0){i=h;return}c[d>>2]=5;i=h;return}dH(l,b);b=c[l>>2]|0;if((Zka(b,11984,17)|0)==0){c[m>>2]=11776;c[m+4>>2]=15;kka(l,m);v=c[l>>2]|0}else{v=b}Su(d,v);dka(l);i=h;return}else{i=h;return}}function Su(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+32|0;e=d+24|0;f=d+16|0;g=d+8|0;h=d;c[e>>2]=11776;c[e+4>>2]=15;if(vka(b,e)|0){c[a>>2]=1;i=d;return}c[f>>2]=12256;c[f+4>>2]=16;if(vka(b,f)|0){c[a>>2]=2;i=d;return}c[g>>2]=11984;c[g+4>>2]=17;if(vka(b,g)|0){c[a>>2]=3;i=d;return}c[h>>2]=12464;c[h+4>>2]=14;if(!(vka(b,h)|0)){i=d;return}c[a>>2]=7;i=d;return}function Tu(a){a=a|0;var b=0,d=0;b=i;if((c[a+84>>2]|0)==1?(c[a+92>>2]|0)==0:0){d=(c[a+4764>>2]|0)>>>31^1}else{d=0}i=b;return d|0}function Uu(a){a=a|0;var b=0;b=i;su(a);c[a>>2]=12048;f3a(a+144|0,0,1024)|0;f3a(a+1168|0,-1,1024)|0;f3a(a+2200|0,-1,2560)|0;c[a+2192>>2]=0;c[a+2196>>2]=0;i=b;return}function Vu(a){a=a|0;var b=0;b=i;Wu(a);v2a(a);i=b;return}function Wu(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;c[a>>2]=12048;d=a+2192|0;e=c[d>>2]|0;if((e|0)==0){vu(a);i=b;return}else{f=e;g=0}do{dka(f+(g<<2)|0);g=g+1|0;f=c[d>>2]|0}while((g|0)<256);v2a(f);vu(a);i=b;return}function Xu(a,d,e){a=a|0;d=d|0;e=e|0;var f=0;f=i;if((e|0)!=0){c[e>>2]=0}if(d>>>0>255){i=f;return-1}else{e=b[a+((d&255)<<1)+1168>>1]|0;i=f;return(e<<16>>16==-1?-1:e&65535)|0}return 0}function Yu(a,d){a=a|0;d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;g=a+8|0;h=c[g>>2]|0;if((h|0)==0|d>>>0>255){i=f;return}j=b[a+(d<<1)+1168>>1]|0;if(j<<16>>16==-1){if((c[a+92>>2]|0)!=0|(d|0)==32){i=f;return}Yu(a,32);k=a+2968|0;l=k;m=e[l>>1]|e[l+2>>1]<<16;l=k+4|0;k=e[l>>1]|e[l+2>>1]<<16;l=a+(d<<3)+2712|0;n=l;b[n>>1]=m;b[n+2>>1]=m>>>16;m=l+4|0;b[m>>1]=k;b[m+2>>1]=k>>>16;if((c[a+4760>>2]|0)==0){i=f;return}b[a+(d<<1)+2200>>1]=b[a+2264>>1]|0;i=f;return}if((JDa(h,j&65535,513)|0)!=0){i=f;return}j=c[g>>2]|0;h=Gu(c[(c[j+84>>2]|0)+32>>2]|0,b[j+68>>1]|0)|0;j=a+(d<<3)+2712|0;b[j>>1]=h;k=c[g>>2]|0;m=k+84|0;l=c[m>>2]|0;n=k+68|0;k=Gu((c[l+24>>2]|0)+(c[l+32>>2]|0)|0,b[n>>1]|0)|0;l=a+(d<<3)+2716|0;b[l>>1]=k;b[a+(d<<3)+2714>>1]=Gu(c[(c[m>>2]|0)+36>>2]|0,b[n>>1]|0)|0;n=c[g>>2]|0;g=n+84|0;m=c[g>>2]|0;o=n+68|0;b[a+(d<<3)+2718>>1]=Gu((c[m+36>>2]|0)-(c[m+28>>2]|0)|0,b[o>>1]|0)|0;if((c[a+4760>>2]|0)==0){i=f;return}m=Gu(c[(c[g>>2]|0)+40>>2]|0,b[o>>1]|0)|0;o=m<<16>>16;g=a+(d<<1)+2200|0;d=b[g>>1]|0;if(d<<16>>16==-1){b[g>>1]=m;i=f;return}if(m<<16>>16==0){i=f;return}if((Zu(a)|0)!=0){i=f;return}b[l>>1]=(ca(k<<16>>16,d&65535)|0)/(o|0)|0;b[j>>1]=(ca(e[g>>1]|0,h<<16>>16)|0)/(o|0)|0;i=f;return}function Zu(a){a=a|0;var b=0;if((c[a+84>>2]|0)==3){b=1}else{b=(c[a+92>>2]|0)!=0}return b&1|0}function _u(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0;d=i;e=c>>>0>255?0:c;c=a+(e<<1)+2200|0;f=b[c>>1]|0;if(f<<16>>16==-1){Yu(a,e);e=b[c>>1]|0;if(e<<16>>16==-1){b[c>>1]=0;g=0}else{g=e}}else{g=f}i=d;return g<<16>>16|0}function $u(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;f=i;g=d>>>0>255?0:d;d=a+(g<<3)+2712|0;h=b[d>>1]|0;if(h<<16>>16==-1){Yu(a,g);j=b[d>>1]|0}else{j=h}c[e>>2]=j<<16>>16;c[e+8>>2]=b[a+(g<<3)+2716>>1]|0;c[e+12>>2]=b[a+(g<<3)+2718>>1]|0;c[e+4>>2]=b[a+(g<<3)+2714>>1]|0;i=f;return}function av(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;if(e>>>0>255){i=f;return 0}if((d|0)==0){if((b|0)==0){i=f;return 0}}else{g=c[d+(e<<2)>>2]|0;d=(g|0)==0?1305928:g+12|0;g=a[d>>0]|0;if(g<<24>>24!=0|(b|0)==0){h=g;j=d;k=h<<24>>24==0;l=k?0:j;i=f;return l|0}}d=Sv(b,e&255)|0;if((d|0)==0){i=f;return 0}h=a[d>>0]|0;j=d;k=h<<24>>24==0;l=k?0:j;i=f;return l|0}function bv(d){d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=i;i=i+64|0;g=f+56|0;h=f+48|0;j=f+40|0;k=f+32|0;l=f+24|0;m=f+16|0;n=f+8|0;o=f;p=d+96|0;q=c[p>>2]|0;c[g>>2]=31384;c[g+4>>2]=14;r=iI(q,g)|0;g=(r|0)!=0;if(g){Fu(d,r)}q=c[p>>2]|0;c[h>>2]=34536;c[h+4>>2]=6;s=jI(q,h)|0;h=d+4760|0;c[h>>2]=1;if((s|0)!=0){c[h>>2]=0;if(g?(c[j>>2]=12120,c[j+4>>2]=12,(nI(r,j)|0)!=0):0){c[k>>2]=12120;c[k+4>>2]=12;j=(eI(r,k)|0)&65535;k=0;do{b[d+(k<<1)+2200>>1]=j;k=k+1|0}while((k|0)!=256)}k=c[p>>2]|0;c[l>>2]=12136;c[l+4>>2]=9;j=fI(k,l,0)|0;l=c[p>>2]|0;c[m>>2]=12152;c[m+4>>2]=8;k=fI(l,m,0)|0;if(j>>>0<256){m=c[s+16>>2]|0;if((k|0)>=1?(k|0)<(m+j|0):0){t=k}else{t=j+ -1+m|0}m=(t|0)>255?255:t;if((j|0)<=(m|0)){t=j;while(1){b[d+(t<<1)+2200>>1]=JH(s,t-j|0)|0;if((t|0)<(m|0)){t=t+1|0}else{break}}}}}t=d+92|0;if((c[t>>2]|0)!=0){m=d+88|0;j=c[m>>2]|0;if(((j|0)!=0?(c[j+4>>2]|0)>8:0)?(a[j+19>>0]|0)==43:0){Fka(n,m,8);ika(m,n);dka(n)}}else{cv(d)}n=d+108|0;m=d+2196|0;if((c[n>>2]&4|0)==0){c[m>>2]=4}j=c[p>>2]|0;c[o>>2]=1280496;c[o+4>>2]=8;p=$H(j,o)|0;o=d+2192|0;j=(c[t>>2]|0)!=0&1;s=d+8|0;Ru(d,p,m,o,j,kHa(c[s>>2]|0)|0);Rc[c[(c[d>>2]|0)+64>>2]&1023](d);j=c[o>>2]|0;if((j|0)!=0){m=j;j=0;do{dka(m+(j<<2)|0);j=j+1|0;m=c[o>>2]|0}while((j|0)!=256);v2a(m);c[o>>2]=0}if((c[s>>2]|0)==0){i=f;return}if((c[n>>2]&65536|0)!=0){n=0;do{s=n<<1;o=a[12168+s>>0]|0;m=a[12168+(s|1)>>0]|0;if(!((o&255)>(m&255))){s=m&255;m=o&255;while(1){o=d+(m<<1)+1168|0;if(!(!((b[o>>1]|0)==-1)?(c[t>>2]|0)!=0:0)){u=31}if((u|0)==31?(u=0,j=m+ -32|0,b[o>>1]=b[d+(j<<1)+1168>>1]|0,o=b[d+(j<<1)+2200>>1]|0,!(o<<16>>16==0)):0){b[d+(m<<1)+2200>>1]=o;o=d+(j<<3)+2712|0;j=o;p=e[j>>1]|e[j+2>>1]<<16;j=o+4|0;o=e[j>>1]|e[j+2>>1]<<16;j=d+(m<<3)+2712|0;k=j;b[k>>1]=p;b[k+2>>1]=p>>>16;p=j+4|0;b[p>>1]=o;b[p+2>>1]=o>>>16}if((m|0)<(s|0)){m=m+1|0}else{break}}}n=n+1|0}while((n|0)!=3)}Hu(d);i=f;return}function cv(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;if((c[a+4760>>2]|0)==0?(e=a+108|0,f=c[e>>2]|0,(f&1|0)==0):0){g=0;h=0;while(1){j=b[a+(g<<1)+2200>>1]|0;k=j&65535;if(!(j<<16>>16==-1|j<<16>>16==0)){if((h|0)!=0){if((h|0)==(k|0)){l=h}else{m=g;n=h;break}}else{l=k}}else{l=h}k=g+1|0;if((k|0)<256){g=k;h=l}else{m=k;n=l;break}}if(!((m|0)!=256|(n|0)==0)){c[e>>2]=f|1}}f=c[a+128>>2]|0;if((f|0)<140){o=f*5|0}else{o=(f<<2)+140|0}hHa(a+8|0,a+88|0,(c[a+84>>2]|0)==2&1,c[a+108>>2]|0,o,c[a+140>>2]|0,0,0);i=d;return}function dv(a){a=a|0;var b=0,d=0;b=c[a+2196>>2]|0;if((b|0)==6|(b|0)==5|(b|0)==0){d=0}else{d=1}return d|0}function ev(a){a=a|0;var b=0;b=i;Uu(a);c[a>>2]=12184;c[a+4764>>2]=-1;i=b;return}function fv(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;i=i+32|0;e=d+16|0;f=d+8|0;g=d;h=JHa(a+88|0)|0;j=a+4764|0;c[j>>2]=h;do{if((h|0)>-1){k=c[a+96>>2]|0;c[e>>2]=31384;c[e+4>>2]=14;l=iI(k,e)|0;if((l|0)!=0?(c[f>>2]=11680,c[f+4>>2]=5,(nI(l,f)|0)!=0):0){c[g>>2]=11680;c[g+4>>2]=5;c[a+108>>2]=eI(l,g)|0;m=c[j>>2]|0}else{l=c[j>>2]|0;c[a+108>>2]=(l|0)>11?4:32;m=l}if((m|0)<4){l=0;do{b[a+(l<<1)+2200>>1]=600;l=l+1|0}while((l|0)!=256);n=c[j>>2]|0}else{n=m}if((n|0)==12){c[a+2196>>2]=5;break}else if((n|0)==13){c[a+2196>>2]=6;break}else{if((c[a+108>>2]&32|0)==0){break}c[a+2196>>2]=4;break}}}while(0);bv(a);i=d;return 1}function gv(a,c){a=a|0;c=c|0;var d=0,e=0;d=i;if(c>>>0>255){i=d;return-1}else{e=b[a+((c&255)<<1)+1680>>1]|0;i=d;return(e<<16>>16==-1?-1:e&65535)|0}return 0}function hv(e){e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;f=i;i=i+256|0;g=f;h=e+8|0;j=c[h>>2]|0;if((j|0)==0){i=f;return}if(((Zu(e)|0)==0?(c[e+4764>>2]|0)<12:0)?(kHa(j)|0)!=0:0){if((lu(j,3,0)|0)!=0){k=0;l=0;while(1){m=e+(l<<1)+1168|0;n=0;while(1){o=(AEa(c[h>>2]|0,(d[12360+n>>0]<<8)+l&65535)|0)&65535;b[m>>1]=o;n=n+1|0;if(!(o<<16>>16==0)){p=1;break}if((n|0)>=4){p=k;break}}l=l+1|0;if((l|0)==256){break}else{k=p}}if((p|0)!=0){i=f;return}}TEa(c[h>>2]|0,1970170211)|0;p=e+2196|0;k=c[p>>2]|0;if((k|0)==0){c[p>>2]=4;q=4}else{q=k}k=e+2192|0;l=q;q=0;while(1){n=av(l,c[k>>2]|0,q)|0;if(((n|0)!=0?(m=Xv(n)|0,o=e+(q<<2)+144|0,c[o>>2]=m,r=AEa(c[h>>2]|0,m)|0,m=e+(q<<1)+1168|0,b[m>>1]=r,(r&65535|0)==0):0)?(R2a(n,1278688)|0)==0:0){c[o>>2]=32;b[m>>1]=AEa(c[h>>2]|0,32)|0}m=q+1|0;if((m|0)==256){break}l=c[p>>2]|0;q=m}i=f;return}q=c[j+36>>2]|0;if((q|0)==1){p=c[c[j+40>>2]>>2]|0;if((c[p+4>>2]|0)!=1970170211){s=p;t=24}}else if((q|0)!=0){q=c[j+40>>2]|0;p=c[q>>2]|0;if((c[p+4>>2]|0)==1970170211){VEa(j,c[q+4>>2]|0)|0}else{s=p;t=24}}if((t|0)==24){VEa(j,s)|0}if((c[e+108>>2]&4|0)!=0){s=e+2196|0;j=e+2192|0;t=g+255|0;p=0;do{q=av(c[s>>2]|0,c[j>>2]|0,p)|0;if((q|0)==0){l=AEa(c[h>>2]|0,p)|0;k=l&65535;b[e+(p<<1)+1168>>1]=k;if(!(k<<16>>16==0)){k=Tv(4,p)|0;if((k|0)==0){f3a(g|0,0,256)|0;_Ea(c[h>>2]|0,l&65535,g,256)|0;a[t>>0]=0;if((a[g>>0]|0)==0){u=0}else{u=Xv(g)|0}}else{u=k}c[e+(p<<2)+144>>2]=u}}else{c[e+(p<<2)+144>>2]=Xv(q)|0;b[e+(p<<1)+1168>>1]=ZEa(c[h>>2]|0,q)|0}p=p+1|0}while((p|0)!=256);i=f;return}p=(TEa(c[h>>2]|0,1970170211)|0)==0;u=e+2196|0;g=e+2192|0;t=0;do{j=av(c[u>>2]|0,c[g>>2]|0,t)|0;do{if((j|0)!=0?(s=e+(t<<2)+144|0,c[s>>2]=Xv(j)|0,q=ZEa(c[h>>2]|0,j)|0,k=e+(t<<1)+1168|0,b[k>>1]=q,(q&65535|0)==0):0){if((R2a(j,1278688)|0)!=0?(R2a(j,22456)|0)!=0:0){if(p){v=c[s>>2]|0}else{v=t}b[k>>1]=AEa(c[h>>2]|0,v)|0;break}c[s>>2]=32;b[k>>1]=-1}}while(0);t=t+1|0}while((t|0)!=256);i=f;return}function iv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=0;while(1){if((c[a+(e<<2)>>2]|0)==(b|0)){f=e;g=4;break}e=e+1|0;if((e|0)>=256){f=-1;g=4;break}}if((g|0)==4){i=d;return f|0}return 0}function jv(a,b){a=a|0;b=b|0;var d=0,f=0;d=i;f=Wv(b)|0;if((f|0)==0){f3a(a|0,0,1024)|0;i=d;return}else{b=0;do{c[a+(b<<2)>>2]=e[f+(b<<1)>>1]|0;b=b+1|0}while((b|0)!=256);i=d;return}}function kv(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=(Q2a(a,b,1024)|0)==0&1;i=c;return d|0}function lv(a){a=a|0;var b=0,d=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;b=i;i=i+48|0;d=b+32|0;f=b+24|0;g=b+16|0;h=b+8|0;j=b;k=1;a:while(1){l=Wv(k)|0;m=0;while(1){if((c[a+(m<<2)>>2]|0)!=(e[l+(m<<1)>>1]|0|0)){break}m=m+1|0;if((m|0)>=256){n=6;break a}}m=k+1|0;if((m|0)<6){k=m}else{break}}do{if((n|0)==6){if((k|0)==0){break}else if((k|0)==1){o=mv(11776)|0;i=b;return o|0}else if((k|0)==3){o=mv(11984)|0;i=b;return o|0}else if((k|0)==2){o=mv(12256)|0;i=b;return o|0}else{o=0;i=b;return o|0}}}while(0);k=Wm()|0;c[d>>2]=12008;c[d+4>>2]=12;c[g>>2]=11776;c[g+4>>2]=15;jka(f,g);tI(k,d,f);dka(f);f=Wv(1)|0;d=Sn()|0;g=0;do{n=a+(g<<2)|0;if((e[f+(g<<1)>>1]|0|0)!=(c[n>>2]|0)){RH(d,jp(g)|0);Yv(h,c[n>>2]|0);RH(d,nv(h)|0);dka(h)}g=g+1|0}while((g|0)<256);c[j>>2]=12024;c[j+4>>2]=11;oI(k,j,d,0);o=k;i=b;return o|0}function mv(a){a=a|0;var b=0,c=0;b=i;c=u2a(16)|0;Pv(c,a);i=b;return c|0}function nv(a){a=a|0;var b=0,c=0;b=i;c=u2a(16)|0;Ov(c,a);i=b;return c|0}function ov(a){a=a|0;var b=0;b=i;bv(a);i=b;return 1}function pv(f){f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;g=i;i=i+32|0;h=g+16|0;j=g+8|0;k=g;l=f+8|0;m=c[l>>2]|0;if((m|0)==0){i=g;return}n=c[f+2196>>2]|0;o=f+92|0;do{if((((c[o>>2]|0)!=0?(p=c[m+36>>2]|0,(p|0)>0):0)?(q=(n|0)==2,r=(n|0)==1,(n+ -1|0)>>>0<2):0)?(c[f+108>>2]&4|0)!=0:0){s=c[m+40>>2]|0;t=0;u=0;v=0;while(1){w=b[(c[s+(v<<2)>>2]|0)+8>>1]|0;if(w<<16>>16==0|w<<16>>16==3){x=t;y=1}else{x=(w&65535)<2?1:t;y=u}v=v+1|0;if((v|0)>=(p|0)){break}else{t=x;u=y}}if(r&(y|0)==0){z=(x|0)!=0?2:0;break}if(q&(x|0)==0){z=(y|0)!=0&1}else{z=n}}else{z=n}}while(0);if(!((z+ -1|0)>>>0<2?(c[f+2192>>2]|0)==0:0)){A=16}if((A|0)==16?(c[f+108>>2]&32|0)==0:0){if((lu(m,3,0)|0)!=0){A=0;n=0;while(1){y=f+(n<<1)+1168|0;x=0;while(1){u=(AEa(c[l>>2]|0,(d[12360+x>>0]<<8)+n&65535)|0)&65535;b[y>>1]=u;x=x+1|0;if(!(u<<16>>16==0)){B=1;break}if((x|0)>=4){B=A;break}}n=n+1|0;if((n|0)==256){break}else{A=B}}if((B|0)!=0){if((z|0)==0){if((lu(c[l>>2]|0,1,0)|0)==0){i=g;return}else{C=0}do{c[f+(C<<2)+144>>2]=Tv(1634889070,C)|0;C=C+1|0}while((C|0)!=256);i=g;return}C=f+2192|0;B=0;do{A=av(z,c[C>>2]|0,B)|0;if((A|0)!=0){c[f+(B<<2)+144>>2]=Xv(A)|0}B=B+1|0}while((B|0)!=256);i=g;return}}if((lu(c[l>>2]|0,1,0)|0)!=0){B=0;C=0;do{A=f+(C<<1)+1168|0;b[A>>1]=AEa(c[l>>2]|0,C)|0;c[f+(C<<2)+144>>2]=Tv(1634889070,C)|0;B=(b[A>>1]|0)==0?B:1;C=C+1|0}while((C|0)!=256);if(!((c[o>>2]|0)==0&(B|0)==0)){i=g;return}}if((TEa(c[l>>2]|0,1970170211)|0)==0){B=Wv(z)|0;C=f+2192|0;A=(B|0)==0;n=0;x=0;do{do{if((c[o>>2]|0)==0){y=av(0,c[C>>2]|0,x)|0;if((y|0)!=0){q=Xv(y)|0;c[f+(x<<2)+144>>2]=q;D=q;break}if(A){D=c[f+(x<<2)+144>>2]|0;break}else{q=e[B+(x<<1)>>1]|0;c[f+(x<<2)+144>>2]=q;D=q;break}}else{c[f+(x<<2)+144>>2]=x;D=x}}while(0);q=(AEa(c[l>>2]|0,D)|0)&65535;b[f+(x<<1)+1168>>1]=q;n=q<<16>>16==0?n:1;x=x+1|0}while((x|0)!=256);if((n|0)!=0){i=g;return}else{E=0}}else{E=0}do{b[f+(E<<1)+1168>>1]=E;E=E+1|0}while((E|0)!=256);i=g;return}do{if((c[m+8>>2]&512|0)==0){if((c[m+36>>2]|0)!=0?(c[m+40>>2]|0)!=0:0){break}E=c[f+96>>2]|0;c[h>>2]=12136;c[h+4>>2]=9;n=eI(E,h)|0;if(n>>>0>255){i=g;return}if((n|0)>0){f3a(f+1168|0,0,n<<1|0)|0;F=n}else{F=0}E=F;x=3-n+F&65535;while(1){b[f+(E<<1)+1168>>1]=x;E=E+1|0;if((E|0)==256){break}else{x=x+1<<16>>16}}i=g;return}}while(0);F=(lu(m,3,1)|0)!=0;do{if(!F){m=c[l>>2]|0;if((c[f+108>>2]&32|0)==0){h=lu(m,3,0)|0;if((h|0)==0){G=(lu(c[l>>2]|0,1,0)|0)!=0}else{G=0}H=h;I=G&1;break}else{h=lu(m,1,0)|0;if((h|0)==0){J=(lu(c[l>>2]|0,3,0)|0)!=0}else{J=0}H=J&1;I=h;break}}else{H=0;I=0}}while(0);J=c[f+96>>2]|0;c[j>>2]=11760;c[j+4>>2]=9;G=f+2192|0;h=(H|0)==0;H=(I|0)==0;I=(nI(J,j)|0)==0;j=0;do{J=av(z,c[G>>2]|0,j)|0;do{if((J|0)!=0){m=Xv(J)|0;x=f+(j<<2)+144|0;c[x>>2]=m;do{if(h){if((m|0)!=0){if(F){b[f+(j<<1)+1168>>1]=AEa(c[l>>2]|0,m)|0;break}if(!H){E=Uv(1634889070,m)|0;n=c[l>>2]|0;if((E|0)==0){b[f+(j<<1)+1168>>1]=ZEa(n,J)|0;break}else{b[f+(j<<1)+1168>>1]=AEa(n,E)|0;break}}}}else{E=f+(j<<1)+1168|0;n=0;do{D=(AEa(c[l>>2]|0,(d[12360+n>>0]<<8)+j&65535)|0)&65535;b[E>>1]=D;n=n+1|0}while(D<<16>>16==0&(n|0)<4)}}while(0);m=f+(j<<1)+1168|0;n=b[m>>1]|0;if(n<<16>>16==-1|n<<16>>16==0){if((a[J>>0]|0)==46?(R2a(J,1278688)|0)==0:0){b[m>>1]=AEa(c[l>>2]|0,32)|0;break}n=ZEa(c[l>>2]|0,J)|0;E=n&65535;b[m>>1]=E;if((n&65535|0)==0){if(I){K=E}else{yu(k,f,j);E=c[k>>2]|0;if((dg(E)|0)==0){n=c[l>>2]|0;if((E|0)==0){b[m>>1]=AEa(n,0)|0;L=0}else{b[m>>1]=AEa(n,c[E+12>>2]|0)|0;L=c[E+12>>2]|0}c[x>>2]=L}Lna(k);K=b[m>>1]|0}if(K<<16>>16==0){b[m>>1]=AEa(c[l>>2]|0,j)|0}}}}else{if((c[o>>2]|0)==0){M=-1}else{M=(AEa(c[l>>2]|0,j)|0)&65535}b[f+(j<<1)+1168>>1]=M}}while(0);j=j+1|0}while((j|0)<256);i=g;return}function qv(a){a=a|0;var b=0;b=i;Uu(a);c[a>>2]=12376;zma(a+5800|0,10);zma(a+5824|0,10);g[a+5860>>2]=1.0;g[a+5848>>2]=1.0;g[a+5868>>2]=0.0;g[a+5864>>2]=0.0;g[a+5856>>2]=0.0;g[a+5852>>2]=0.0;c[a+5792>>2]=0;f3a(a+4764|0,0,1024)|0;i=b;return}function rv(a){a=a|0;var b=0;b=i;sv(a);v2a(a);i=b;return}function sv(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;i=i+32|0;d=b+16|0;e=b+12|0;f=b+8|0;g=b+4|0;h=b;c[a>>2]=12376;j=a+5800|0;k=(c[a+5808>>2]|0)==0;c[d>>2]=k?0:-1;if(!k){do{Cma(j,d,e,f);k=c[f>>2]|0;if((k|0)!=0){zv(k);v2a(k)}}while((c[d>>2]|0)!=0)}Ama(j);f=a+5824|0;e=(c[a+5832>>2]|0)==0;c[d>>2]=e?0:-1;if(e){Bma(f);Bma(j);Wu(a);i=b;return}do{Cma(f,d,g,h);e=c[g>>2]|0;if((e|0)!=0){zv(e);v2a(e)}}while((c[d>>2]|0)!=0);Bma(f);Bma(j);Wu(a);i=b;return}function tv(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0,s=0;b=i;i=i+80|0;d=b+72|0;e=b+64|0;f=b+40|0;h=b+32|0;j=b+24|0;k=b+16|0;l=b+8|0;m=b;n=a+96|0;o=c[n>>2]|0;c[d>>2]=669496;c[d+4>>2]=9;c[a+5796>>2]=iI(o,d)|0;d=c[n>>2]|0;c[e>>2]=1283608;c[e+4>>2]=10;o=jI(d,e)|0;if((o|0)==0){p=1.0;q=1.0}else{e=a+5848|0;EH(f,o);c[e+0>>2]=c[f+0>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];c[e+16>>2]=c[f+16>>2];c[e+20>>2]=c[f+20>>2];p=+g[e>>2];q=+g[a+5860>>2]}e=c[n>>2]|0;c[h>>2]=1283584;c[h+4>>2]=8;f=jI(e,h)|0;if((f|0)!=0){c[a+112>>2]=~~(p*+DH(f,0)*1.0e3);c[a+124>>2]=~~(q*+DH(f,1)*1.0e3);c[a+120>>2]=~~(p*+DH(f,2)*1.0e3);c[a+116>>2]=~~(q*+DH(f,3)*1.0e3)}f=c[n>>2]|0;c[j>>2]=12136;c[j+4>>2]=9;h=eI(f,j)|0;j=c[n>>2]|0;c[k>>2]=34536;c[k+4>>2]=6;f=jI(j,k)|0;if((f|0)!=0&h>>>0<256?(k=c[f+16>>2]|0,j=k>>>0>256?256:k,(((j+h|0)>>>0>256?256-h|0:j)|0)!=0):0){j=~k;k=(j>>>0>4294967039?j:-257)-h|0;j=~h-(k>>>0>4294967039?k:-257)|0;k=0;do{c[a+(k+h<<2)+4764>>2]=Fla(p*+DH(f,k)*1.0e3)|0;k=k+1|0}while((k|0)!=(j|0))}j=c[n>>2]|0;c[l>>2]=12448;c[l+4>>2]=9;c[a+5788>>2]=iI(j,l)|0;l=c[n>>2]|0;c[m>>2]=1280496;c[m+4>>2]=8;n=$H(l,m)|0;if((n|0)==0){i=b;return 1}m=a+2192|0;Ru(a,n,a+2196|0,m,0,0);n=c[m>>2]|0;if((n|0)==0){i=b;return 1}else{r=n;s=0}while(1){n=c[r+(s<<2)>>2]|0;l=Xv((n|0)==0?1305928:n+12|0)|0;c[a+(s<<2)+144>>2]=(l|0)==0?s:l;l=s+1|0;if((l|0)==256){break}r=c[m>>2]|0;s=l}i=b;return 1}function uv(a){a=a|0;var b=0;b=i;Hu(a);i=b;return}function vv(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;e=i;i=i+32|0;f=e+24|0;h=e+16|0;j=e;if((d|0)>3){k=0;i=e;return k|0}c[f>>2]=0;l=a+5800|0;m=b;if((Dma(l,m,f)|0)!=0){n=c[f>>2]|0;if((c[n+4>>2]|0)==0){k=n;i=e;return k|0}if((c[a+5792>>2]|0)==0){k=n;i=e;return k|0}if((n|0)!=0){zv(n);v2a(n)}Jma(l,m);k=vv(a,b,d+1|0)|0;i=e;return k|0}n=av(c[a+2196>>2]|0,c[a+2192>>2]|0,b)|0;if((n|0)==0){k=0;i=e;return k|0}b=c[a+5788>>2]|0;if((b|0)==0){k=0;i=e;return k|0}pe(h,n);n=$H(b,h)|0;if((n|0)==0){k=0;i=e;return k|0}if((c[n>>2]|0)!=7){k=0;i=e;return k|0}h=u2a(60)|0;yv(h);c[f>>2]=h;f=u2a(80)|0;b=c[a+5796>>2]|0;if((b|0)==0){o=c[a+5792>>2]|0}else{o=b}Sy(f,c[a+4>>2]|0,o,n,0);n=h+8|0;c[n>>2]=f;Uy(f,0,0,h,0,d+1|0);d=a+5848|0;p=+cma(+g[d>>2],+g[a+5852>>2]);a=h+40|0;c[a>>2]=~~(p*+(c[a>>2]|0)+.5);a=h+44|0;f=c[a>>2]|0;o=h+56|0;b=c[o>>2]|0;q=h+52|0;r=c[q>>2]|0;s=h+48|0;t=c[s>>2]|0;g[j>>2]=+(f|0)/1.0e3;u=j+8|0;g[u>>2]=+(b|0)/1.0e3;v=j+4|0;g[v>>2]=+(r|0)/1.0e3;w=j+12|0;g[w>>2]=+(t|0)/1.0e3;if(!((r|0)>(f|0)&(b|0)<(t|0))){Gy(j,c[n>>2]|0)}Kla(j,d);c[a>>2]=Fla(+g[j>>2]*1.0e3)|0;c[q>>2]=Fla(+g[v>>2]*1.0e3)|0;c[s>>2]=Fla(+g[w>>2]*1.0e3)|0;c[o>>2]=Fla(+g[u>>2]*1.0e3)|0;c[(Gma(l,m)|0)>>2]=h;m=c[n>>2]|0;if((c[m+48>>2]|0)!=0){k=h;i=e;return k|0}if((m|0)!=0){Iy(m);v2a(m)}c[n>>2]=0;k=h;i=e;return k|0}function wv(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=b>>>0>255?0:b;b=c[a+(f<<2)+4764>>2]|0;if((b|0)!=0){g=b;i=e;return g|0}b=vv(a,f,d)|0;if((b|0)==0){g=0;i=e;return g|0}g=c[b+40>>2]|0;i=e;return g|0}function xv(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;g=vv(a,b,e)|0;if((g|0)==0){c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;i=f;return}else{e=g+44|0;c[d+0>>2]=c[e+0>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[d+12>>2]=c[e+12>>2];i=f;return}}function yv(a){a=a|0;g[a+24>>2]=1.0;g[a+12>>2]=1.0;g[a+32>>2]=0.0;g[a+28>>2]=0.0;g[a+20>>2]=0.0;g[a+16>>2]=0.0;c[a+8>>2]=0;c[a+36>>2]=0;c[a+4>>2]=0;c[a>>2]=0;return}function zv(a){a=a|0;var b=0,d=0;b=i;d=c[a+8>>2]|0;if((d|0)!=0){Iy(d);v2a(d)}d=c[a+36>>2]|0;if((d|0)==0){i=b;return}Rc[c[(c[d>>2]|0)+4>>2]&1023](d);i=b;return}function Av(a,b,e){a=a|0;b=b|0;e=e|0;a=c[e>>2]|0;c[e>>2]=a+1;return d[b+a>>0]|0|0}function Bv(a,b,c){a=a|0;b=b|0;c=c|0;return c|0}function Cv(b,c,d){b=b|0;c=c|0;d=d|0;a[c>>0]=d;return 1}function Dv(a,b){a=a|0;b=b|0;return 1}function Ev(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=Qc[c[(c[a>>2]|0)+32>>2]&255](a,b,0)|0;i=d;return e|0}function Fv(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=Qc[c[(c[a>>2]|0)+40>>2]&255](a,b,0)|0;i=d;return e|0}function Gv(a,b){a=a|0;b=b|0;return c[a+((b&255)<<2)+144>>2]|0}function Hv(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=iv(a+144|0,b)|0;i=c;return d|0}function Iv(a){a=a|0;return}function Jv(a){a=a|0;return 0}function Kv(a){a=a|0;var b=0;b=i;Wu(a);i=b;return}function Lv(a){a=a|0;var b=0;b=i;Wu(a);v2a(a);i=b;return}function Mv(a){a=a|0;var b=0;b=i;Wu(a);i=b;return}function Nv(a){a=a|0;var b=0;b=i;Wu(a);v2a(a);i=b;return}function Ov(a,b){a=a|0;b=b|0;var d=0;d=i;c[a+4>>2]=0;c[a+8>>2]=0;hka(a+12|0,b);c[a>>2]=4;i=d;return}function Pv(a,b){a=a|0;b=b|0;var d=0;d=i;c[a+4>>2]=0;c[a+8>>2]=0;eka(a+12|0,b,-1);c[a>>2]=4;i=d;return}function Qv(a){a=a|0;var b=0;b=i;gla(a+8|0);gla(a+28|0);i=b;return}function Rv(a){a=a|0;var b=0;b=i;ila(c[a+32>>2]|0);ila(c[a+12>>2]|0);i=b;return}function Sv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=b&255;if((a|0)==7){if((b&255)<24){f=0}else{g=e+ -24|0;h=6}}else{if((b&255)<32){f=0}else{g=e+224|0;h=6}}a:do{if((h|0)==6){switch(a|0){case 4:{f=c[15168+((g&255)<<2)>>2]|0;break a;break};case 6:{f=c[16960+((g&255)<<2)>>2]|0;break a;break};case 7:{f=c[17856+((g&255)<<2)>>2]|0;break a;break};case 3:{f=c[14272+((g&255)<<2)>>2]|0;break a;break};case 1:{f=c[12480+((g&255)<<2)>>2]|0;break a;break};case 5:{f=c[16064+((g&255)<<2)>>2]|0;break a;break};case 2:{f=c[13376+((g&255)<<2)>>2]|0;break a;break};default:{f=0;break a}}}}while(0);i=d;return f|0}function Tv(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;if((a|0)==1818326065){d=e[19808+((b&255)<<1)>>1]|0}else if((a|0)==1094995778){d=e[18784+((b&255)<<1)>>1]|0}else if((a|0)==1970170211){d=b&65535}else if((a|0)==1094992453){d=e[19296+((b&255)<<1)>>1]|0}else if((a|0)==1634889070){d=e[20320+((b&255)<<1)>>1]|0}else if((a|0)==7){d=e[37752+((b&255)<<1)>>1]|0}else{d=0}i=c;return d|0}function Uv(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;if((a|0)==1970170211){d=b}else if((a|0)==1634889070){d=Vv(20320,b&65535)|0}else if((a|0)==1937337698){d=Vv(20832,b&65535)|0}else if((a|0)==1094995778){d=Vv(18784,b&65535)|0}else if((a|0)==1094992451){d=Vv(37752,b&65535)|0}else if((a|0)==1818326065){d=Vv(19808,b&65535)|0}else if((a|0)==1094992453){d=Vv(19296,b&65535)|0}else{d=0}i=c;return d|0}function Vv(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0;d=i;e=0;while(1){if((b[a+(e<<1)>>1]|0)==c<<16>>16){f=e;g=4;break}e=e+1|0;if(!(e>>>0<256)){f=0;g=4;break}}if((g|0)==4){i=d;return f|0}return 0}function Wv(a){a=a|0;var b=0;switch(a|0){case 6:{b=21856;break};case 2:{b=20320;break};case 4:{b=18784;break};case 3:{b=19296;break};case 5:{b=21344;break};case 7:{b=37752;break};case 1:{b=19808;break};case 8:{b=20832;break};default:{b=0}}return b|0}function Xv(a){a=a|0;var b=0,c=0;b=i;c=(qGa(a)|0)&2147483647;i=b;return c|0}function Yv(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;i=i+64|0;d=c;sGa(d,b);eka(a,d,-1);i=c;return}function Zv(a){a=a|0;var b=0,d=0;b=i;Lma(a+8|0,10);c[a>>2]=0;c[a+4>>2]=0;d=a+32|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;i=b;return}function _v(a){a=a|0;var b=0,d=0;b=i;$v(a,0);d=c[a+4>>2]|0;if((d|0)!=0){px(d)}Nma(a+8|0);i=b;return}function $v(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+16|0;e=d+8|0;f=d+4|0;g=d;h=a+8|0;j=(c[a+16>>2]|0)==0;c[e>>2]=j?0:-1;if(!j){j=(b|0)==0;do{c[f>>2]=0;Oma(h,e,f,g);k=c[g>>2]|0;do{if((k|0)!=0){if(j){qw(k);v2a(k);break}else{l=c[f>>2]|0;cw(k,a,(l|0)==0?1305928:l+12|0);break}}}while(0);dka(f)}while((c[e>>2]|0)!=0)}e=(b|0)==0;b=0;do{f=c[a+(b<<2)+32>>2]|0;do{if((f|0)!=0){if(e){Aw(c[f+12>>2]|0);v2a(f);break}else{fw(f,a,b);break}}}while(0);b=b+1|0}while(b>>>0<6);i=d;return}function aw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+32|0;e=d+16|0;f=d+8|0;g=d;h=a+8|0;oe(f,b);if((Wma(h,f,e)|0)!=0){j=c[e>>2]|0;i=d;return j|0}f=bw(a,b)|0;c[e>>2]=f;if(gl(c[b>>2]|0)|0){j=f;i=d;return j|0}oe(g,b);c[(Qma(h,g)|0)>>2]=f;j=f;i=d;return j|0}function bw(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=u2a(52)|0;c[f+4>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=1;c[f+8>>2]=0;g=f+24|0;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;c[g+20>>2]=0;c[g+24>>2]=0;g=c[d>>2]|0;d=(g|0)==0?1305928:g+12|0;cw(f,b,(a[d>>0]|0)==47?d+1|0:d);i=e;return f|0}function cw(d,f,g){d=d|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;h=i;i=i+64|0;j=h+56|0;k=h+48|0;l=h+44|0;m=h+40|0;n=h+32|0;o=h+24|0;p=h+16|0;q=h+8|0;r=h+4|0;s=h;t=d+4|0;mka(t,g);c[j>>2]=30448;c[j+4>>2]=10;u=c[t>>2]|0;if(!(vka(u,j)|0)?(c[k>>2]=30464,c[k+4>>2]=10,!(vka(u,k)|0)):0){hka(l,t);Lka(m,l,1);c[n>>2]=669136;c[n+4>>2]=1;c[d+8>>2]=(vka(c[m>>2]|0,n)|0)&1;dka(m);m=c[l>>2]|0;if((m|0)!=0){n=c[m+4>>2]|0;if((n|0)>2){Mka(o,l,n+ -2|0);ika(l,o);dka(o);v=c[l>>2]|0}else{v=m}}else{v=0}m=0;while(1){pe(p,c[30480+(m*24|0)>>2]|0);o=m+1|0;if(vka(v,p)|0){w=10;break}if((o|0)==32){break}else{m=o}}do{if((w|0)==10){p=c[30484+(m*24|0)>>2]|0;v=d+12|0;c[v>>2]=p;c[d+16>>2]=c[30488+(m*24|0)>>2];o=c[30492+(m*24|0)>>2]|0;c[d+20>>2]=o;if((o|0)==2?(o=d+28|0,c[o>>2]=w2a(256,1)|0,n=c[30496+(m*24|0)>>2]|0,(n|0)!=0):0){k=0;do{u=k<<1;j=a[30480+(m*24|0)+u+20>>0]|0;x=a[(u|1)+(30480+(m*24|0))+20>>0]|0;a:do{if(!((j&255)>(x&255))){u=x&255;y=j&255;while(1){a[(c[o>>2]|0)+y>>0]=1;if((y|0)>=(u|0)){break a}y=y+1|0}}}while(0);k=k+1|0}while(k>>>0<n>>>0);z=c[v>>2]|0}else{z=p}n=d+44|0;oP(g,z,n);if((c[n>>2]|0)!=0){c[d+40>>2]=1;break}n=c[f+4>>2]|0;if((n|0)!=0?(k=c[t>>2]|0,(qx(n,(k|0)==0?1305928:k+12|0,q,r)|0)!=0):0){k=w2a(65536,2)|0;n=d+32|0;c[n>>2]=k;o=c[q>>2]|0;j=a[o+5>>0]|0;b:do{if(j<<24>>24==2){x=c[o+16>>2]|0;y=c[o+20>>2]|0;u=y+(x*6|0)|0;if((x|0)==0){A=u}else{B=o;C=0;while(1){D=(C*6|0)+y|0;E=b[B+(D+2)>>1]|0;F=e[B+D>>1]|0;G=E&65535;if(!((G+F|0)>65535|E<<16>>16==0)){E=e[B+(D+4)>>1]|0;D=0;do{b[(c[n>>2]|0)+(D+F<<1)>>1]=D+E;D=D+1|0}while((D|0)!=(G|0))}G=C+1|0;if((G|0)==(x|0)){A=u;break b}B=c[q>>2]|0;C=G}}}else if(j<<24>>24==0){C=c[o+20>>2]|0;B=c[o+16>>2]<<1;u=c[o+8>>2]<<1;if((B+u|0)>>>0<65536){c3a(k+(u<<1)|0,o+C|0,B|0)|0}A=C+B|0}else{A=0}}while(0);if(A>>>0<(c[r>>2]|0)>>>0?(o=c[q>>2]|0,k=c[o+A>>2]|0,(k|0)!=0):0){j=u2a(52)|0;c[j+4>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;c[j+20>>2]=1;c[j+8>>2]=0;n=j+24|0;c[n+0>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;c[n+16>>2]=0;c[n+20>>2]=0;c[n+24>>2]=0;n=d+48|0;c[n>>2]=j;gka(s,o+(A+4)|0,k);k=c[n>>2]|0;if((k|0)!=0){n=c[s>>2]|0;cw(k,f,(n|0)==0?1305928:n+12|0)}dka(s)}v2a(c[q>>2]|0);c[d+40>>2]=1}}}while(0);dka(l);i=h;return}c[d+16>>2]=6;c[d+8>>2]=(a[g+9>>0]|0)==86&1;c[d+40>>2]=1;i=h;return}function dw(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;i=i+16|0;d=b;e=1;while(1){if((e|0)==0|(e|0)==6){f=0;break}pe(d,c[30240+(e<<2)>>2]|0);if(vka(c[a>>2]|0,d)|0){g=4;break}else{e=e+1|0}}if((g|0)==4){if((e|0)==0|(e|0)==6){f=0}else{f=e}}i=b;return f|0}function ew(a){a=a|0;var b=0;b=i;$v(a,1);i=b;return}function fw(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e+8|0;g=e;c[a>>2]=d;h=a+8|0;vP(d,a+4|0,h);if((c[h>>2]|0)!=0){i=e;return}h=c[b+4>>2]|0;if((h|0)==0){i=e;return}b=c[a+12>>2]|0;c[g>>2]=31272;c[g+4>>2]=8;Bt(f,g,c[30240+(d<<2)>>2]|0);d=c[f>>2]|0;rx(b,h,(d|0)==0?1305928:d+12|0);dka(f);i=e;return}function gw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=a+(b<<2)+32|0;f=c[e>>2]|0;if((f|0)!=0){g=f;i=d;return g|0}f=hw(a,b)|0;c[e>>2]=f;g=f;i=d;return g|0}function hw(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=u2a(16)|0;c[e+8>>2]=0;c[e+12>>2]=0;iw(e);fw(e,a,b);i=d;return e|0}function iw(a){a=a|0;var b=0,d=0;b=i;d=u2a(8)|0;c[d>>2]=0;c[d+4>>2]=0;c[a+12>>2]=d;i=b;return}function jw(a){a=a|0;var b=0,d=0;b=i;gla(a+4|0);Ija(a+48|0,12);d=a+64|0;c[a+20>>2]=0;c[a+24>>2]=0;c[a+28>>2]=0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;i=b;return}function kw(a,b){a=a|0;b=b|0;var d=0;d=i;c[a+20>>2]=b;c[a+24>>2]=0;c[a+28>>2]=0;lla(a+4|0,0,10240);i=d;return}function lw(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0;f=i;i=i+144|0;g=f+128|0;h=f+120|0;j=f+112|0;k=f+104|0;l=f+96|0;m=f+88|0;n=f+80|0;o=f+72|0;p=f+64|0;q=f+56|0;r=f+48|0;s=f+40|0;t=f+36|0;u=f+32|0;v=f+24|0;w=f+8|0;x=f;y=e+4|0;z=c[y>>2]|0;if((z|0)==0){i=f;return}c[h>>2]=30272;c[h+4>>2]=12;a:do{if(Ue(e,h)|0){c[d+24>>2]=1;c[d+28>>2]=0}else{c[j>>2]=30288;c[j+4>>2]=13;if(Ue(e,j)|0){c[d+24>>2]=2;c[d+28>>2]=0;break}c[k>>2]=30304;c[k+4>>2]=11;if(!(Ue(e,k)|0)?(c[l>>2]=30320,c[l+4>>2]=10,!(Ue(e,l)|0)):0){c[m>>2]=30336;c[m+4>>2]=6;if(Ue(e,m)|0){c[d+24>>2]=6;break}c[n>>2]=30344;c[n+4>>2]=9;if(Ue(e,n)|0){c[d+24>>2]=3;break}c[o>>2]=30360;c[o+4>>2]=9;if(Ue(e,o)|0){c[d+24>>2]=4;break}c[p>>2]=30376;c[p+4>>2]=11;if(Ue(e,p)|0){c[d+24>>2]=5;break}c[q>>2]=30392;c[q+4>>2]=19;if(Ue(e,q)|0){c[d+24>>2]=7;c[d+28>>2]=0;break}c[r>>2]=30416;c[r+4>>2]=7;if(Ue(e,r)|0){break}A=d+24|0;switch(c[A>>2]|0){case 6:{B=mw(c[e>>2]|0,z)|0;c[(c[d+20>>2]|0)+8>>2]=B;c[A>>2]=0;break a;break};case 7:{c[v>>2]=30424;c[v+4>>2]=17;if(Ue(e,v)|0){B=d+48|0;C=c[d+52>>2]|0;if((C|0)<=1){if((C|0)==1){D=(c[(ow(B)|0)>>2]|0)==2&1;c[(c[d+20>>2]|0)+20>>2]=D}}else{D=d+20|0;c[(c[D>>2]|0)+20>>2]=3;c[(c[D>>2]|0)+24>>2]=C;E=C*12|0;C=w2a(E,1)|0;c[(c[D>>2]|0)+28>>2]=C;c3a(c[(c[D>>2]|0)+28>>2]|0,c[B>>2]|0,E|0)|0}c[A>>2]=0;break a}if((a[c[e>>2]>>0]|0)!=60){i=f;return}E=d+28|0;b:do{if(((c[E>>2]&1|0)!=0?(oe(x,d+76|0),B=c[x+4>>2]|0,(B|0)!=0):0)?(D=c[x>>2]|0,(a[D>>0]|0)==60):0){do{if((B|0)>1){C=1;while(1){F=C+1|0;if((a[D+C>>0]|0)==62){G=C;break}if((F|0)<(B|0)){C=F}else{G=F;break}}C=G+ -1|0;F=(C|0)/2|0;c[w>>2]=F;if((C|0)>9){break b}if((C|0)>1){C=0;do{H=C<<1;I=a[D+(H|1)>>0]|0;J=a[D+(H+2)>>0]|0;H=I&255;if((I+ -48<<24>>24&255)<10){K=H+ -48|0}else{K=(H&223)+ -55|0}H=J&255;if((J+ -48<<24>>24&255)<10){L=H+ -48|0}else{L=(H&223)+ -55|0}a[w+C+4>>0]=L+(K<<4);C=C+1|0;H=c[w>>2]|0}while((C|0)<(H|0));M=H}else{M=F}C=c[y>>2]|0;if((M|0)>0){N=0}else{break}do{H=N<<1;J=H|1;if(J>>>0<C>>>0){O=a[(c[e>>2]|0)+J>>0]|0}else{O=0}J=H+2|0;if(J>>>0<C>>>0){P=a[(c[e>>2]|0)+J>>0]|0}else{P=0}J=O&255;if((O+ -48<<24>>24&255)<10){Q=J+ -48|0}else{Q=(J&223)+ -55|0}J=P&255;if((P+ -48<<24>>24&255)<10){R=J+ -48|0}else{R=(J&223)+ -55|0}a[w+N+8>>0]=R+(Q<<4);N=N+1|0}while((N|0)<(c[w>>2]|0))}else{c[w>>2]=0}}while(0);D=d+48|0;c[g+0>>2]=c[w+0>>2];c[g+4>>2]=c[w+4>>2];c[g+8>>2]=c[w+8>>2];pw(D,g)}}while(0);c[E>>2]=(c[E>>2]|0)+1;break a;break};case 2:case 1:{D=mw(c[e>>2]|0,z)|0;B=d+28|0;C=d+32|0;c[d+(c[B>>2]<<2)+32>>2]=D;D=(c[B>>2]|0)+1|0;c[B>>2]=D;do{if((c[A>>2]|0)==1){if((D|0)<2){i=f;return}else{F=c[C>>2]|0;S=F;T=d+36|0;U=F;break}}else{if((D|0)<3){i=f;return}else{S=c[d+36>>2]|0;T=d+40|0;U=c[C>>2]|0;break}}}while(0);C=c[T>>2]|0;if(S>>>0<65536){if(!(U>>>0>S>>>0)){D=C-U|0;E=d+20|0;F=U;do{b[(c[(c[E>>2]|0)+32>>2]|0)+(F<<1)>>1]=D+F;F=F+1|0}while(!(F>>>0>S>>>0))}}else{c[s>>2]=U;c[s+4>>2]=S-U<<16|C&65535;nla(d+4|0,s,8)}c[B>>2]=0;break a;break};case 3:{nw(t,e);dka(t);c[A>>2]=0;break a;break};case 5:{c[A>>2]=0;break a;break};case 4:{nw(u,e);F=dw(u)|0;c[(c[d+20>>2]|0)+12>>2]=F;dka(u);c[A>>2]=0;break a;break};default:{break a}}}c[d+24>>2]=0}}while(0);kka(d+76|0,e);i=f;return}function mw(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;e=a[b>>0]|0;if(!(e<<24>>24==60)){if((c|0)>0){f=e;g=1;h=0}else{j=0;i=d;return j|0}while(1){if((f+ -48<<24>>24&255)>9){j=h;k=14;break}e=(h*10|0)+ -48+(f&255)|0;if((g|0)>=(c|0)){j=e;k=14;break}f=a[b+g>>0]|0;g=g+1|0;h=e}if((k|0)==14){i=d;return j|0}}if((c|0)>1){l=1;m=0}else{j=0;i=d;return j|0}a:while(1){h=a[b+l>>0]|0;g=h&255;do{if((h+ -48<<24>>24&255)<10){n=g+ -48|0}else{if((h+ -97<<24>>24&255)<6){n=g+ -87|0;break}if(!((h+ -65<<24>>24&255)<6)){j=m;k=14;break a}n=g+201|0}}while(0);g=(n&255)+(m<<4)|0;l=l+1|0;if((l|0)>=(c|0)){j=g;k=14;break}else{m=g}}if((k|0)==14){i=d;return j|0}return 0}function nw(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;ox(e,b,(c[b+4>>2]|0)+ -2|0);jka(a,e);i=d;return}function ow(b){b=b|0;var d=0;d=i;if((c[b+4>>2]|0)<=0){a[0]=0;da()}i=d;return c[b>>2]|0}function pw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+4|0;f=c[e>>2]|0;g=f+1|0;do{if((f|0)>=(c[a+8>>2]|0)){if((Kja(a,g)|0)==0){i=d;return}else{h=c[e>>2]|0;break}}else{c[e>>2]=g;h=g}}while(0);g=(c[a>>2]|0)+((h+ -1|0)*12|0)|0;c[g+0>>2]=c[b+0>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];i=d;return}function qw(a){a=a|0;var b=0,d=0;b=i;d=c[a+32>>2]|0;if((d|0)!=0){v2a(d)}v2a(c[a+36>>2]|0);v2a(c[a+28>>2]|0);d=c[a+48>>2]|0;if((d|0)!=0){qw(d);v2a(d)}dka(a+4|0);i=b;return}function rw(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+112|0;f=e+24|0;g=e+8|0;h=e;c[a+32>>2]=w2a(65536,2)|0;jw(f);kw(f,a);nL(g,b,d);d=h+4|0;while(1){qL(h,g);if((c[d>>2]|0)==0){break}lw(f,h)}if((c[a+20>>2]|0)!=3){nx(f);i=e;return}h=c[f+12>>2]|0;if((h|0)==0){nx(f);i=e;return}d=w2a(h+4|0,1)|0;c[a+36>>2]=d;a=(h|0)/8|0;c[d>>2]=a;g=d+4|0;c3a(g|0,c[f+8>>2]|0,h|0)|0;N1a(g,a,8,244);nx(f);i=e;return}function sw(a,b){a=a|0;b=b|0;return(c[a>>2]|0)-(c[b>>2]|0)|0}function tw(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+16|0;f=e;c[f>>2]=d;do{if((c[a+16>>2]|0)!=6){g=c[a+44>>2]|0;if((g|0)!=0){h=pP(g,d)|0;break}g=c[a+32>>2]|0;if((g|0)==0){h=d&65535;break}if(!(d>>>0>65535)){j=b[g+(d<<1)>>1]|0;if(!(j<<16>>16==0)){h=j;break}j=c[a+48>>2]|0;if((j|0)==0){h=0;break}h=tw(j,d)|0;break}j=c[a+36>>2]|0;if((j|0)==0){g=c[a+48>>2]|0;if((g|0)==0){h=0;break}h=tw(g,d)|0;break}g=M1a(f,j+4|0,c[j>>2]|0,8,245)|0;if((g|0)!=0){h=(c[f>>2]|0)+(c[g+4>>2]|0)-(c[g>>2]|0)&65535;break}g=c[a+48>>2]|0;if((g|0)==0){h=0}else{h=tw(g,c[f>>2]|0)|0}}else{h=d&65535}}while(0);i=e;return h|0}function uw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[a>>2]|0;a=c[b>>2]|0;if(e>>>0<a>>>0){f=-1;i=d;return f|0}f=e>>>0>(((c[b+4>>2]|0)>>>16)+a|0)>>>0&1;i=d;return f|0}function vw(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;g=i;i=i+16|0;h=g;j=c[b+20>>2]|0;if((j|0)==0){k=c[f>>2]|0;c[f>>2]=k+1;l=d[e+k>>0]|0;i=g;return l|0}else if((j|0)==2){k=c[f>>2]|0;m=k+1|0;c[f>>2]=m;n=d[e+k>>0]|0;if((a[(c[b+28>>2]|0)+n>>0]|0)==0){l=n;i=g;return l|0}c[f>>2]=k+2;l=d[e+m>>0]|n<<8;i=g;return l|0}else if((j|0)==3){n=c[f>>2]|0;m=n+1|0;c[f>>2]=m;a[h>>0]=a[e+n>>0]|0;n=c[b+28>>2]|0;k=b+24|0;b=c[k>>2]|0;if((b|0)>0){o=m;p=b;q=1}else{l=0;i=g;return l|0}a:while(1){r=(q|0)>0;b=p;while(1){b=b+ -1|0;s=c[n+(b*12|0)>>2]|0;if((s|0)>=(q|0)){b:do{if(r){m=0;while(1){t=a[h+m>>0]|0;if((t&255)<(d[n+(b*12|0)+m+4>>0]|0)){u=m;break b}v=m+1|0;if((t&255)>(d[n+(b*12|0)+m+8>>0]|0)){u=m;break b}if((v|0)<(q|0)){m=v}else{u=v;break}}}else{u=0}}while(0);if((u|0)==(s|0)){w=17;break a}if((u|0)!=0){break}}if((b|0)<=0){l=0;w=22;break a}}if((s|0)==(q|0)){w=17;break}if((q|0)==4){l=0;w=22;break}b=o;o=o+1|0;c[f>>2]=o;a[h+q>>0]=a[e+b>>0]|0;p=c[k>>2]|0;if((p|0)<=0){l=0;w=22;break}else{q=q+1|0}}if((w|0)==17){if(r){x=0;y=0}else{l=0;i=g;return l|0}while(1){r=d[h+y>>0]|x;p=y+1|0;if((p|0)==(q|0)){l=r;break}x=r<<8;y=p}i=g;return l|0}else if((w|0)==22){i=g;return l|0}}else if((j|0)==1){j=c[f>>2]|0;c[f>>2]=j+2;l=d[e+j>>0]<<8|d[e+(j+1)>>0];i=g;return l|0}else{l=0;i=g;return l|0}return 0}function ww(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;if((a|0)==1){d=2}else if((a|0)==2|(a|0)==3?!(b>>>0<256):0){if(b>>>0<65536){d=2}else{d=b>>>0<16777216?3:4}}else{d=1}i=c;return d|0}function xw(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;i=i+16|0;h=g;j=c[b+20>>2]|0;if((j|0)==3){c[h>>2]=0;if((f|0)>0){k=0;while(1){vw(b,e,h)|0;l=k+1|0;if((c[h>>2]|0)<(f|0)){k=l}else{m=l;break}}}else{m=0}}else if((j|0)==2){if((f|0)>0){k=c[b+28>>2]|0;b=0;h=0;while(1){l=b+1|0;h=h+1+((a[k+(d[e+h>>0]|0)>>0]|0)!=0&1)|0;if((h|0)>=(f|0)){m=l;break}else{b=l}}}else{m=0}}else if((j|0)==1){m=(f+1|0)/2|0}else{m=f}i=g;return m|0}function yw(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;g=i;i=i+16|0;h=g;if((f|0)==0){j=1;i=g;return j|0}a[h+1>>0]=0;a[h>>0]=0;a[h+2>>0]=b>>>8;a[h+3>>0]=b;b=(f|0)>0;k=0;l=4;a:while(1){if(b){m=f;do{m=m+ -1|0;n=c[e+(m*12|0)>>2]|0;if((n|0)>=(l|0)){o=0;while(1){p=a[h+(o+k)>>0]|0;if((p&255)<(d[e+(m*12|0)+o+4>>0]|0)){q=o;break}r=o+1|0;if((p&255)>(d[e+(m*12|0)+o+8>>0]|0)){q=o;break}if((r|0)<(l|0)){o=r}else{q=r;break}}if((q|0)==(n|0)){j=l;s=11;break a}}}while((m|0)>0)}k=k+1|0;if((k|0)>=4){j=1;s=11;break}else{l=l+ -1|0}}if((s|0)==11){i=g;return j|0}return 0}function zw(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;g=c[b+20>>2]|0;if((g|0)==3|(g|0)==2){if(e>>>0<256){h=yw(e,c[b+28>>2]|0,c[b+24>>2]|0)|0;b=(h|0)==0?1:h;if((b|0)>1){f3a(d|0,0,b|0)|0}a[d+(b+ -1)>>0]=e;j=b;i=f;return j|0}if(e>>>0<65536){a[d>>0]=e>>>8;a[d+1>>0]=e;j=2;i=f;return j|0}if(e>>>0<16777216){a[d>>0]=e>>>16;a[d+1>>0]=e>>>8;a[d+2>>0]=e;j=3;i=f;return j|0}else{a[d>>0]=e>>>24;a[d+1>>0]=e>>>16;a[d+2>>0]=e>>>8;a[d+3>>0]=e;j=4;i=f;return j|0}}else if((g|0)==0){a[d>>0]=e;j=1;i=f;return j|0}else if((g|0)==1){a[d>>0]=e>>>8;a[d+1>>0]=e;j=2;i=f;return j|0}else{j=0;i=f;return j|0}return 0}function Aw(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}mx(c[a>>2]|0);v2a(a);i=b;return}function Bw(a){a=a|0;var b=0,d=0,e=0;b=i;if((c[a+8>>2]|0)==0){d=c[a+12>>2]|0;if((d|0)==0){e=0}else{e=(c[d+4>>2]|0)!=0}}else{e=1}i=b;return e&1|0}function Cw(a,b){a=a|0;b=b|0;var d=0,f=0,g=0;d=i;f=b&65535;do{if((c[a>>2]|0)!=5){if(f>>>0<(c[a+8>>2]|0)>>>0){g=e[(c[a+4>>2]|0)+(f<<1)>>1]|0;break}b=sx(c[a+12>>2]|0,f)|0;if((b|0)==0){g=0}else{g=e[b>>1]|0}}else{g=f}}while(0);i=d;return g|0}function Dw(a){a=a|0;var b=0;b=i;su(a);c[a>>2]=31296;Ija(a+2228|0,4);Ija(a+2248|0,4);c[a+144>>2]=0;c[a+148>>2]=0;c[a+152>>2]=0;c[a+176>>2]=0;c[a+164>>2]=0;c[a+168>>2]=0;c[a+2264>>2]=0;c[a+2268>>2]=0;f3a(a+180|0,-1,2048)|0;i=b;return}function Ew(a){a=a|0;var b=0;b=i;Fw(a);v2a(a);i=b;return}function Fw(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=31296;d=c[a+176>>2]|0;if((d|0)!=0){v2a(d)}d=c[a+148>>2]|0;if((d|0)!=0){qw(d);v2a(d)}d=c[a+164>>2]|0;if((d|0)!=0){FI(d);v2a(d)}d=c[a+2268>>2]|0;if((d|0)!=0){Rc[c[(c[d>>2]|0)+4>>2]&1023](d)}Jja(c[a+2248>>2]|0);Jja(c[a+2228>>2]|0);vu(a);i=b;return}function Gw(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;if((a|0)==0){d=b&65535;i=c;return d|0}else{d=tw(a,b)|0;i=c;return d|0}return 0}function Hw(a){a=a|0;var b=0,d=0;b=c[a+144>>2]|0;if((b|0)==0){d=0}else{d=c[b+8>>2]|0}return d|0}function Iw(a,b){a=a|0;b=b|0;var d=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;f=c[a+144>>2]|0;g=c[f+16>>2]|0;do{if((g|0)==7|(g|0)==5){h=b}else if((g|0)==6){j=c[a+152>>2]|0;if((j|0)!=0?(Bw(j)|0)!=0:0){h=Cw(j,b&65535)|0}else{h=0}}else{if(((c[f+40>>2]|0)!=0?(j=c[a+152>>2]|0,(j|0)!=0):0)?(Bw(j)|0)!=0:0){h=Cw(j,Gw(f,b)|0)|0;break}j=c[f+44>>2]|0;if(((((j|0)!=0?(k=c[f+12>>2]|0,!((k+ -1|0)>>>0>3)):0)?(l=pP(j,b)|0,j=l&65535,!(l<<16>>16==0)):0)?(l=c[(xt()|0)+12>>2]|0,m=Lc[c[(c[l>>2]|0)+20>>2]&255](l)|0,l=c[m+(k<<3)+124>>2]|0,(l|0)!=0):0)?(j|0)<(c[m+(k<<3)+128>>2]|0):0){h=e[l+(j<<1)>>1]|0}else{h=0}}}while(0);i=d;return h|0}function Jw(a,b){a=a|0;b=b|0;var d=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;f=c[a+144>>2]|0;g=c[f+16>>2]|0;a:do{if((g|0)==6){h=c[a+152>>2]|0;if((h|0)!=0?(Bw(h)|0)!=0:0){j=0;while(1){if((Cw(h,j&65535)|0)==(b|0)){k=j;break a}j=j+1|0;if(!(j>>>0<65536)){l=7;break}}}else{k=0}}else if((g|0)==0){k=0}else if((g|0)==7|(g|0)==5){k=b}else{l=7}}while(0);b:do{if((l|0)==7){if((b|0)>=128){g=c[f+44>>2]|0;if((((g|0)!=0?(a=c[f+12>>2]|0,!((a+ -1|0)>>>0>3)):0)?(j=c[(xt()|0)+12>>2]|0,h=Lc[c[(c[j>>2]|0)+20>>2]&255](j)|0,j=c[h+(a<<3)+124>>2]|0,(j|0)!=0):0)?(m=c[h+(a<<3)+128>>2]|0,(m|0)>0):0){a=0;while(1){if((e[j+(a<<1)>>1]|0|0)==(b|0)?(h=uP(g,a&65535)|0,(h|0)!=0):0){k=h;break b}a=a+1|0;if((a|0)>=(m|0)){k=0;break}}}else{k=0}}else{k=b}}}while(0);i=d;return k|0}function Kw(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;d=i;i=i+240|0;e=d+232|0;f=d+224|0;g=d+216|0;h=d+208|0;j=d+200|0;k=d+192|0;l=d+184|0;m=d+176|0;n=d+168|0;o=d+160|0;p=d+152|0;q=d+144|0;r=d+136|0;s=d+128|0;t=d+120|0;u=d+116|0;v=d+88|0;w=d+80|0;x=d+72|0;y=d+64|0;z=d+56|0;A=d+48|0;B=d+40|0;C=d+32|0;D=d+24|0;E=d+16|0;F=d+8|0;G=d;H=a+96|0;I=c[H>>2]|0;c[f>>2]=669432;c[f+4>>2]=7;aI(e,I,f);c[g>>2]=1278496;c[g+4>>2]=8;f=vka(c[e>>2]|0,g)|0;dka(e);if(f){Lw(a);J=1;i=d;return J|0}f=c[H>>2]|0;c[h>>2]=31368;c[h+4>>2]=15;e=jI(f,h)|0;if((e|0)==0){J=0;i=d;return J|0}if((c[e+16>>2]|0)!=1){J=0;i=d;return J|0}h=KH(e,0)|0;if((h|0)==0){J=0;i=d;return J|0}e=a+88|0;c[k>>2]=34552;c[k+4>>2]=8;aI(j,h,k);ika(e,j);dka(j);pe(l,825672);if(!((((Zka(c[e>>2]|0,c[l>>2]|0,c[l+4>>2]|0)|0)!=0?(pe(m,825688),(Zka(c[e>>2]|0,c[m>>2]|0,c[m+4>>2]|0)|0)!=0):0)?(pe(n,825704),(Zka(c[e>>2]|0,c[n>>2]|0,c[n+4>>2]|0)|0)!=0):0)?(pe(o,825728),(Zka(c[e>>2]|0,c[o>>2]|0,c[o+4>>2]|0)|0)!=0):0)){K=10}if((K|0)==10?(Zu(a)|0)==0:0){c[a+2264>>2]=1}c[p>>2]=31384;c[p+4>>2]=14;o=iI(h,p)|0;if((o|0)!=0){Fu(a,o)}o=c[H>>2]|0;c[q>>2]=1280496;c[q+4>>2]=8;H=$H(o,q)|0;if((H|0)==0){J=0;i=d;return J|0}c[s>>2]=669432;c[s+4>>2]=7;aI(r,h,s);s=a+160|0;c[s>>2]=0;c[t>>2]=31400;c[t+4>>2]=12;if(vka(c[r>>2]|0,t)|0){c[s>>2]=1}t=c[H>>2]|0;if((t|0)==4){dH(u,H);q=c[(xt()|0)+12>>2]|0;c[a+144>>2]=aw((Lc[c[(c[q>>2]|0)+20>>2]&255](q)|0)+28|0,u)|0;dka(u);K=20}else if((t|0)==7){t=u2a(52)|0;c[t+4>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;c[t+20>>2]=1;c[t+8>>2]=0;u=t+24|0;c[u+0>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;c[u+12>>2]=0;c[u+16>>2]=0;c[u+20>>2]=0;c[u+24>>2]=0;u=a+144|0;c[u>>2]=t;c[a+148>>2]=t;EI(v);rH(v,H,0,0,0);H=c[u>>2]|0;u=vH(v)|0;rw(H,u,sH(v)|0);FI(v);K=20}else{L=0}do{if((K|0)==20){v=a+144|0;u=c[v>>2]|0;if((u|0)!=0){H=c[u+12>>2]|0;u=a+156|0;c[u>>2]=H;if((H|0)==0){c[w>>2]=31416;c[w+4>>2]=13;H=iI(h,w)|0;if((H|0)!=0){c[y>>2]=1282960;c[y+4>>2]=8;aI(x,H,y);c[u>>2]=dw(x)|0;dka(x)}if((c[u>>2]|0)!=0){K=25}}else{K=25}if((K|0)==25){H=c[(xt()|0)+12>>2]|0;t=(Lc[c[(c[H>>2]|0)+20>>2]&255](H)|0)+28|0;H=c[u>>2]|0;if((c[a+92>>2]|0)==0?(c[(c[v>>2]|0)+16>>2]|0)!=6:0){c[z>>2]=1274880;c[z+4>>2]=1;nI(h,z)|0}c[a+152>>2]=gw(t,H)|0}H=c[a+8>>2]|0;do{if((H|0)!=0){if((c[s>>2]|0)!=0){TEa(H,1970170211)|0;break}t=c[(c[v>>2]|0)+16>>2]|0;if((t|0)==4){M=1785686113}else if((t|0)==1){M=1734484e3}else if((t|0)==2){M=1651074869}else if((t|0)==3){M=1936353651}else{M=1970170211}if(((TEa(H,M)|0)!=0?(TEa(H,1970170211)|0)!=0:0)?(t=c[H+40>>2]|0,(t|0)!=0):0){VEa(H,c[t>>2]|0)|0}}}while(0);c[A>>2]=31432;c[A+4>>2]=2;b[a+172>>1]=fI(h,A,1e3)|0;c[B>>2]=1274880;c[B+4>>2]=1;H=jI(h,B)|0;if((H|0)!=0){Mw(H,a+2228|0,1)}if((Zu(a)|0)==0){Nw(a)}if(!((c[a+92>>2]|0)==0?(c[(c[a+12>>2]|0)+12>>2]&64|0)==0:0)){K=47}do{if((K|0)==47?(c[C>>2]=31440,c[C+4>>2]=11,H=$H(h,C)|0,(H|0)!=0):0){if((c[H>>2]|0)==7){v=u2a(28)|0;EI(v);c[a+164>>2]=v;rH(v,H,0,0,0);break}dH(D,H);c[E>>2]=669264;c[E+4>>2]=8;H=vka(c[D>>2]|0,E)|0;dka(D);if(H){c[a+168>>2]=1}}}while(0);Hu(a);if((Lc[c[(c[a>>2]|0)+8>>2]&255](a)|0)!=0){c[F>>2]=31456;c[F+4>>2]=2;H=jI(h,F)|0;if((H|0)!=0){Mw(H,a+2248|0,3)}c[G>>2]=31464;c[G+4>>2]=3;H=jI(h,G)|0;if((H|0)==0){b[a+2244>>1]=880;b[a+2246>>1]=-1e3;L=1;break}else{b[a+2244>>1]=JH(H,0)|0;b[a+2246>>1]=JH(H,1)|0;L=1;break}}else{L=1}}else{L=0}}}while(0);dka(r);J=L;i=d;return J|0}function Lw(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+48|0;e=d+32|0;f=d+24|0;g=d+16|0;h=d+8|0;j=d;k=a+96|0;l=c[k>>2]|0;c[f>>2]=34552;c[f+4>>2]=8;aI(e,l,f);ika(a+88|0,e);dka(e);e=c[k>>2]|0;c[g>>2]=31384;c[g+4>>2]=14;k=iI(e,g)|0;if((k|0)!=0){Fu(a,k)}k=a+156|0;c[k>>2]=1;c[a+160>>2]=0;g=c[(xt()|0)+12>>2]|0;e=(Lc[c[(c[g>>2]|0)+20>>2]&255](g)|0)+28|0;c[j>>2]=31504;c[j+4>>2]=9;jka(h,j);c[a+144>>2]=aw(e,h)|0;dka(h);h=c[(xt()|0)+12>>2]|0;e=(Lc[c[(c[h>>2]|0)+20>>2]&255](h)|0)+28|0;c[a+152>>2]=gw(e,c[k>>2]|0)|0;if((Zu(a)|0)==0){Nw(a)}Hu(a);b[a+172>>1]=1e3;k=w2a(128,2)|0;e=a+176|0;c[e>>2]=k;a=k;k=32;while(1){b[a+(k<<1)>>1]=500;h=k+1|0;if((h|0)==127){break}a=c[e>>2]|0;k=h}i=d;return}function Mw(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;e=i;f=c[a+16>>2]|0;if((f|0)==0){i=e;return}g=(d|0)>0;h=0;j=0;k=0;l=0;m=0;a:while(1){n=GH(a,j)|0;b:do{if((n|0)!=0){if((c[n>>2]|0)==5){if((m|0)!=1){o=17;break a}p=c[n+16>>2]|0;if((p|0)==0){q=h;r=k;s=l;t=0;break}else{u=h;v=0}while(1){ax(b,u);ax(b,u);if(g){w=0;do{ax(b,JH(n,w+v|0)|0);w=w+1|0}while((w|0)!=(d|0))}w=u+1|0;v=v+d|0;if(!(v>>>0<p>>>0)){q=w;r=k;s=l;t=0;break b}else{u=w}}}if((m|0)==0){q=jH(n)|0;r=k;s=l;t=1;break}else if((m|0)==1){q=h;r=0;s=jH(n)|0;t=2;break}else{if((k|0)==0){ax(b,h);ax(b,l)}ax(b,jH(n)|0);p=k+1|0;q=h;r=p;s=l;t=(p|0)==(d|0)?0:m;break}}else{q=h;r=k;s=l;t=m}}while(0);j=j+1|0;if(!(j>>>0<f>>>0)){o=17;break}else{h=q;k=r;l=s;m=t}}if((o|0)==17){i=e;return}}function Nw(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=(c[a+160>>2]|0)==0&1;e=c[a+108>>2]|0;f=(c[a+128>>2]|0)*5|0;g=c[a+140>>2]|0;h=c[31472+(c[a+156>>2]<<2)>>2]|0;hHa(a+8|0,a+88|0,d,e,f,g,h,Lc[c[(c[a>>2]|0)+8>>2]&255](a)|0);i=b;return}function Ow(a){a=a|0;var b=0;b=a&255;return+(+((a<<24>>24>-1?b:b+ -255|0)|0)/127.0)}function Pw(d,e,f,h){d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;h=i;i=i+96|0;j=h+80|0;k=h+64|0;l=h+56|0;m=h+32|0;n=h+16|0;o=h;p=e>>>0<256;if(p?(q=d+(e<<3)+184|0,!((b[q>>1]|0)==-1)):0){c[f+12>>2]=b[d+(e<<3)+186>>1]|0;c[f>>2]=b[d+(e<<3)+180>>1]|0;c[f+8>>2]=b[q>>1]|0;c[f+4>>2]=b[d+(e<<3)+182>>1]|0;i=h;return}c[j>>2]=0;q=Qc[c[(c[d>>2]|0)+32>>2]&255](d,e,j)|0;r=d+8|0;do{if((c[r>>2]|0)!=0){s=f+4|0;t=f+8|0;u=f+12|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;v=c[r>>2]|0;if((c[v+8>>2]&8192|0)==0){if((JDa(v,q,1)|0)!=0){break}w=v+84|0;x=v+68|0;c[f>>2]=(Gu(c[(c[w>>2]|0)+32>>2]|0,b[x>>1]|0)|0)<<16>>16;y=c[w>>2]|0;c[t>>2]=(Gu((c[y+24>>2]|0)+(c[y+32>>2]|0)|0,b[x>>1]|0)|0)<<16>>16;y=(Gu(c[(c[w>>2]|0)+36>>2]|0,b[x>>1]|0)|0)<<16>>16;c[s>>2]=y+((y|0)/64|0);y=c[w>>2]|0;c[u>>2]=(Gu((c[y+36>>2]|0)-(c[y+28>>2]|0)|0,b[x>>1]|0)|0)<<16>>16;break}if((JDa(v,q,512)|0)==0?(gGa(c[v+84>>2]|0,l)|0)==0:0){hGa(c[l>>2]|0,3,k);x=c[v+88>>2]|0;y=b[x+12>>1]|0;w=y&65535;z=b[x+14>>1]|0;x=z&65535;A=c[k>>2]|0;if(y<<16>>16==0|z<<16>>16==0){c[f>>2]=A;c[t>>2]=c[k+8>>2];z=c[k+12>>2]|0;c[s>>2]=z;B=c[k+4>>2]|0;C=z}else{c[f>>2]=(A*1e3|0)/(w|0)|0;c[t>>2]=((c[k+8>>2]|0)*1e3|0)/(w|0)|0;w=((c[k+12>>2]|0)*1e3|0)/(x|0)|0;c[s>>2]=w;B=((c[k+4>>2]|0)*1e3|0)/(x|0)|0;C=w}c[u>>2]=B;w=b[v+70>>1]|0;if((C|0)>(w|0)){c[s>>2]=w}w=b[v+72>>1]|0;if((B|0)<(w|0)){c[u>>2]=w}fGa(c[l>>2]|0)}}else{c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0}}while(0);if((((c[d+92>>2]|0)==0?(c[d+156>>2]|0)==3:0)?(l=Qw(d,Gw(c[d+144>>2]|0,e)|0)|0,(l|0)!=0):0)?(c[j>>2]|0)==0:0){j=a[l>>0]|0;B=j&255;C=a[l+1>>0]|0;k=C&255;q=a[l+2>>0]|0;r=q&255;w=a[l+3>>0]|0;u=w&255;v=a[l+4>>0]|0;s=v&255;x=a[l+5>>0]|0;l=x&255;g[m>>2]=+((j<<24>>24>-1?B:B+ -255|0)|0)/127.0;g[m+4>>2]=+((C<<24>>24>-1?k:k+ -255|0)|0)/127.0;g[m+8>>2]=+((q<<24>>24>-1?r:r+ -255|0)|0)/127.0;g[m+12>>2]=+((w<<24>>24>-1?u:u+ -255|0)|0)/127.0;g[m+16>>2]=+((v<<24>>24>-1?s:s+ -255|0)|0)/127.0*1.0e3;g[m+20>>2]=+((x<<24>>24>-1?l:l+ -255|0)|0)/127.0*1.0e3;Gla(n,f);Kla(n,m);Mla(o,n);c[f+0>>2]=c[o+0>>2];c[f+4>>2]=c[o+4>>2];c[f+8>>2]=c[o+8>>2];c[f+12>>2]=c[o+12>>2]}if(!p){i=h;return}b[d+(e<<3)+186>>1]=c[f+12>>2];b[d+(e<<3)+180>>1]=c[f>>2];b[d+(e<<3)+184>>1]=c[f+8>>2];b[d+(e<<3)+182>>1]=c[f+4>>2];i=h;return}function Qw(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;a:do{if((c[a+156>>2]|0)==3?(c[a+92>>2]|0)==0:0){f=0;g=153;b:while(1){h=f;while(1){j=(h+g|0)/2|0;k=b[31520+(j<<3)>>1]|0;if((k&65535)>(d&65535)){break}if(!((k&65535)<(d&65535))){break b}if((j|0)<(g|0)){h=j+1|0}else{l=0;break a}}g=j+ -1|0;if((h|0)>(g|0)){l=0;break a}else{f=h}}l=31522+(j<<3)|0}else{l=0}}while(0);i=e;return l|0}function Rw(a,b,d){a=a|0;b=b|0;d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0;d=i;f=c[a+176>>2]|0;if((f|0)!=0&b>>>0<128){g=e[f+(b<<1)>>1]|0;i=d;return g|0}f=Gw(c[a+144>>2]|0,b)|0;b=c[a+2232>>2]|0;h=c[a+2228>>2]|0;a:do{if((b|0)>0){j=f&65535;k=0;while(1){if(!(j>>>0<(c[h+(k<<2)>>2]|0)>>>0)?!(j>>>0>(c[h+(k+1<<2)>>2]|0)>>>0):0){break}l=k+3|0;if((l|0)<(b|0)){k=l}else{break a}}g=c[h+(k+2<<2)>>2]|0;i=d;return g|0}}while(0);g=e[a+172>>1]|0;i=d;return g|0}function Sw(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;f=c[a+2252>>2]|0;g=(f|0)/5|0;if((f+4|0)>>>0<9){h=b[a+2246>>1]|0;i=e;return h|0}f=c[a+2248>>2]|0;j=d&65535;d=0;while(1){k=d*5|0;if(!((c[f+(k<<2)>>2]|0)>>>0>j>>>0)?!((c[f+(k+1<<2)>>2]|0)>>>0<j>>>0):0){l=6;break}d=d+1|0;if(!(d>>>0<g>>>0)){l=8;break}}if((l|0)==6){h=c[f+(k+2<<2)>>2]&65535;i=e;return h|0}else if((l|0)==8){h=b[a+2246>>1]|0;i=e;return h|0}return 0}function Tw(a,d,f,g){a=a|0;d=d|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;h=i;j=c[a+2252>>2]|0;k=(j|0)/5|0;a:do{if((j+4|0)>>>0>8){l=c[a+2248>>2]|0;m=d&65535;n=0;while(1){o=n*5|0;if(!((c[l+(o<<2)>>2]|0)>>>0>m>>>0)?!((c[l+(o+1<<2)>>2]|0)>>>0<m>>>0):0){break}n=n+1|0;if(!(n>>>0<k>>>0)){break a}}b[f>>1]=c[l+(o+3<<2)>>2];p=c[l+(o+4<<2)>>2]&65535;b[g>>1]=p;i=h;return}}while(0);o=e[a+172>>1]|0;k=c[a+2232>>2]|0;j=c[a+2228>>2]|0;b:do{if((k|0)>0){n=d&65535;m=0;while(1){if(!(n>>>0<(c[j+(m<<2)>>2]|0)>>>0)?!(n>>>0>(c[j+(m+1<<2)>>2]|0)>>>0):0){break}q=m+3|0;if((q|0)<(k|0)){m=q}else{r=o;break b}}r=c[j+(m+2<<2)>>2]&65535}else{r=o}}while(0);b[f>>1]=(r<<16>>16|0)/2|0;p=b[a+2244>>1]|0;b[g>>1]=p;i=h;return}function Uw(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;i=i+16|0;f=e+8|0;g=e+4|0;h=e;j=(d|0)!=0;if(j){c[d>>2]=0}k=a+8|0;l=AEa(c[k>>2]|0,b)|0;if((b|0)==9474){m=l;i=e;return m|0}if((l|0)!=0?(Lc[c[(c[a>>2]|0)+8>>2]&255](a)|0)!=0:0){b=a+2268|0;n=c[b>>2]|0;if((n|0)!=0){c[f>>2]=0;vx(n,l,f)|0;n=c[f>>2]|0;f=(n|0)==0;if(f|j^1){m=f?l:n;i=e;return m|0}c[d>>2]=1;m=n;i=e;return m|0}n=a+24|0;a=c[n>>2]|0;do{if((a|0)==0){c[g>>2]=0;if(($Ea(c[k>>2]|0,0,g)|0)==0){f=w2a(c[g>>2]|0,1)|0;c[n>>2]=f;o=f;break}else{o=c[n>>2]|0;break}}else{o=a}}while(0);if(($Ea(c[k>>2]|0,o,0)|0)!=0){m=l;i=e;return m|0}if((c[n>>2]|0)==0){m=l;i=e;return m|0}o=u2a(68)|0;bx(o);c[b>>2]=o;tx(o,c[n>>2]|0);c[h>>2]=0;vx(c[b>>2]|0,l,h)|0;b=c[h>>2]|0;h=(b|0)==0;if(h|j^1){m=h?l:b;i=e;return m|0}c[d>>2]=1;m=b;i=e;return m|0}if(!j){m=l;i=e;return m|0}c[d>>2]=0;m=l;i=e;return m|0}function Vw(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;f=i;i=i+16|0;g=f+4|0;h=f;if((e|0)!=0){c[e>>2]=0}j=a+92|0;if((c[j>>2]|0)==0?(c[a+164>>2]|0)==0:0){k=Gw(c[a+144>>2]|0,b)|0;if((c[a+168>>2]|0)!=0){l=k&65535;i=f;return l|0}if(((!(k<<16>>16==0)?(m=c[a+152>>2]|0,(m|0)!=0):0)?(Bw(m)|0)!=0:0)?(n=Cw(m,k)|0,(n|0)!=0):0){o=n}else{p=11}a:do{if((p|0)==11){n=dd[c[(c[a>>2]|0)+56>>2]&511](a,b)|0;if((n|0)==0){do{if((c[a+108>>2]&4|0)==0){yu(g,a,b);k=c[g>>2]|0;if((k|0)!=0){m=c[k+12>>2]|0;Lna(g);if((m|0)==0){break}else{o=m;break a}}else{Lna(g);break}}}while(0);if((c[a+2264>>2]|0)==0){l=(b|0)==0?-1:b;i=f;return l|0}m=b+31|0;k=a+8|0;q=(lu(c[k>>2]|0,3,1)|0)!=0;if(q){r=0;s=1}else{t=lu(c[k>>2]|0,1,0)|0;r=t;s=(t|0)==0?4:2}t=av(s,0,m)|0;if((t|0)==0){l=(m|0)==0?-1:m;i=f;return l|0}u=Xv(t)|0;if((u&65535)<<16>>16==0){l=(m|0)==0?-1:m;i=f;return l|0}do{if(!q){if((r|0)==0){l=AEa(c[k>>2]|0,u&65535)|0;i=f;return l|0}v=Uv(1634889070,u&65535)|0;w=c[k>>2]|0;if((v|0)==0){x=ZEa(w,t)|0;break}else{x=AEa(w,v)|0;break}}else{x=AEa(c[k>>2]|0,u&65535)|0}}while(0);if(!((x|0)==0|(x|0)==65535)){l=x;i=f;return l|0}l=(m|0)==0?-1:m;i=f;return l|0}else{o=n}}}while(0);if((c[a+156>>2]|0)==3){if((o|0)==92){y=47}else{y=(o|0)==165?92:o}}else{y=o}o=a+8|0;x=c[o>>2]|0;if((x|0)==0){l=y;i=f;return l|0}if((TEa(x,1970170211)|0)!=0?(x=c[o>>2]|0,r=c[x+36>>2]|0,(r|0)>0):0){s=c[x+40>>2]|0;g=0;while(1){z=c[s+(g<<2)>>2]|0;A=Uv(c[z+4>>2]|0,b)|0;u=g+1|0;if((A|0)!=0){p=42;break}if((u|0)<(r|0)){g=u}else{B=r;C=x;D=u;E=y;break}}if((p|0)==42){VEa(x,z)|0;z=c[o>>2]|0;B=c[z+36>>2]|0;C=z;D=g;E=A}if((D|0)==(B|0)&(D|0)!=0){VEa(C,c[c[C+40>>2]>>2]|0)|0;F=b}else{F=E}}else{F=y}if((c[(c[o>>2]|0)+92>>2]|0)==0){l=F;i=f;return l|0}o=Uw(a,F,e)|0;l=(o|0)==0?-1:o;i=f;return l|0}o=a+8|0;if((c[o>>2]|0)==0){l=-1;i=f;return l|0}F=a+144|0;y=Gw(c[F>>2]|0,b)|0;E=c[a+164>>2]|0;C=(E|0)==0;if((c[a+160>>2]|0)==0){if(C){D=c[F>>2]|0;if((c[j>>2]|0)!=0?(c[D+32>>2]|0)==0:0){l=y&65535;i=f;return l|0}if((c[D+16>>2]|0)!=0?(D=c[(c[o>>2]|0)+92>>2]|0,(D|0)!=0):0){if((c[D+4>>2]|0)==1970170211){yu(h,a,b);D=c[h>>2]|0;if((dg(D)|0)!=0){Lna(h);l=-1;i=f;return l|0}if((D|0)==0){G=0}else{G=c[D+12>>2]|0}Lna(h);H=G}else{H=b}l=Uw(a,H,e)|0;i=f;return l|0}l=y&65535;i=f;return l|0}}else{if(C){l=y&65535;i=f;return l|0}}C=(y&65535)<<1;if((C+2|0)>>>0>(sH(E)|0)>>>0){l=-1;i=f;return l|0}y=vH(E)|0;l=(d[y+C>>0]|0)<<8|(d[y+(C|1)>>0]|0);i=f;return l|0}function Ww(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=vw(c[a+144>>2]|0,b,d)|0;i=e;return f|0}function Xw(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=ww(c[(c[a+144>>2]|0)+20>>2]|0,b)|0;i=d;return e|0}function Yw(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=xw(c[a+144>>2]|0,b,d)|0;i=e;return f|0}function Zw(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=zw(c[a+144>>2]|0,b,d)|0;i=e;return f|0}function _w(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a+144>>2]|0;if(((c[d+40>>2]|0)!=0?(e=c[a+152>>2]|0,(e|0)!=0):0)?(Bw(e)|0)!=0:0){f=1;i=b;return f|0}f=(c[d+16>>2]|0)!=0&1;i=b;return f|0}function $w(a,b){a=a|0;b=b|0;return 1}function ax(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+4|0;f=c[e>>2]|0;g=f+1|0;do{if((f|0)>=(c[a+8>>2]|0)){if((Kja(a,g)|0)==0){i=d;return}else{h=c[e>>2]|0;break}}else{c[e>>2]=g;h=g}}while(0);c[(c[a>>2]|0)+(h+ -1<<2)>>2]=b;i=d;return}function bx(d){d=d|0;var e=0,f=0;e=i;c[d>>2]=32760;gla(d+8|0);c[d+24>>2]=0;a[d+28>>0]=0;b[d+44>>1]=0;f=d+48|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;i=e;return}function cx(a){a=a|0;var b=0;b=i;ex(a);i=b;return}function dx(a){a=a|0;var b=0;b=i;ex(a);v2a(a);i=b;return}function ex(a){a=a|0;var b=0;b=i;c[a>>2]=32760;fx(c[a+64>>2]|0);kx(c[a+56>>2]|0);hx(c[a+48>>2]|0);ila(c[a+12>>2]|0);i=b;return}function fx(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((a|0)==0){i=b;return}d=a+ -4|0;e=c[d>>2]|0;if((e|0)!=0){f=a+(e*12|0)|0;do{f=f+ -12|0;gx(f)}while((f|0)!=(a|0))}a2a(d);i=b;return}function gx(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;e=a+4|0;f=b[e>>1]|0;if(f<<16>>16==0){i=d;return}g=a+8|0;a=c[g>>2]|0;if((a|0)==0){i=d;return}else{h=f;j=a;k=0}while(1){a=c[j+(k<<2)>>2]|0;if((a|0)==0){l=j;m=h}else{Rc[c[(c[a>>2]|0)+4>>2]&1023](a);l=c[g>>2]|0;m=b[e>>1]|0}k=k+1|0;if((k|0)>=(m&65535|0)){break}else{h=m;j=l}}if((l|0)==0){i=d;return}a2a(l);i=d;return}function hx(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((a|0)==0){i=b;return}d=a+ -4|0;e=c[d>>2]|0;if((e|0)!=0){f=a+(e*12|0)|0;do{ix(c[f+ -4>>2]|0);f=f+ -12|0}while((f|0)!=(a|0))}a2a(d);i=b;return}function ix(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((a|0)==0){i=b;return}d=a+ -4|0;e=c[d>>2]|0;if((e|0)!=0){f=a+(e<<4)|0;do{jx(c[f+ -4>>2]|0);f=f+ -16|0}while((f|0)!=(a|0))}a2a(d);i=b;return}function jx(a){a=a|0;var b=0;b=i;if((a|0)!=0){a2a(a)}i=b;return}function kx(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((a|0)==0){i=b;return}d=a+ -4|0;e=c[d>>2]|0;if((e|0)!=0){f=a+(e<<4)|0;do{lx(c[f+ -4>>2]|0);f=f+ -16|0}while((f|0)!=(a|0))}a2a(d);i=b;return}function lx(a){a=a|0;var b=0;b=i;if((a|0)!=0){a2a(a)}i=b;return}function mx(a){a=a|0;var b=0;b=i;if((a|0)!=0){v2a(a)}i=b;return}function nx(a){a=a|0;var b=0;b=i;dka(a+76|0);dka(a+72|0);dka(a+68|0);dka(a+64|0);Jja(c[a+48>>2]|0);ila(c[a+8>>2]|0);i=b;return}function ox(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=c[b+4>>2]|0;if((f|0)<1){c[a>>2]=0;c[a+4>>2]=0;i=e;return}else{c[a>>2]=(c[b>>2]|0)+1;c[a+4>>2]=(d|0)<0|(f|0)<=(d|0)?f+ -1|0:d;i=e;return}}function px(a){a=a|0;var b=0;b=i;ac(c[a>>2]|0)|0;v2a(a);i=b;return}function qx(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;g=i;i=i+144|0;h=g+8|0;j=g;_b(c[b>>2]|0,c[b+12>>2]|0,0)|0;k=b+4|0;if((c[k>>2]|0)<=0){l=0;i=g;return l|0}m=b+8|0;n=0;while(1){Ya(h|0,c[m>>2]|0,1,c[b>>2]|0)|0;n=n+1|0;if((oma(h,d)|0)==0){break}if((n|0)>=(c[k>>2]|0)){l=0;o=7;break}}if((o|0)==7){i=g;return l|0}o=c[h+64>>2]|0;k=c[h+68>>2]|0;c[f>>2]=k;c[e>>2]=w2a(k,1)|0;_b(c[b>>2]|0,o|0,0)|0;Ya(c[e>>2]|0,c[f>>2]|0,1,c[b>>2]|0)|0;if((a[h+72>>0]|0)==0){l=1;i=g;return l|0}h=c[e>>2]|0;b=Jt(c[(xt()|0)+4>>2]|0)|0;Zc[c[(c[b>>2]|0)+12>>2]&3](b,0,h,c[f>>2]|0,0,0,0,0,0,0,e,j)|0;v2a(h);c[f>>2]=c[j>>2];l=1;i=g;return l|0}function rx(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=c[a>>2]|0;if((f|0)!=0){v2a(f);c[a>>2]=0}f=a+4|0;c[f>>2]=0;if((qx(b,d,a,e)|0)==0){i=e;return}d=c[a>>2]|0;if((Q2a(d,33232,4)|0)!=0){i=e;return}c[f>>2]=d+(c[d+20>>2]|0);i=e;return}function sx(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=c[a+4>>2]|0;if(((e|0)!=0?(f=c[a>>2]|0,a=c[f+8>>2]|0,(a|0)<=(b|0)):0)?!((c[f+12>>2]|0)>>>0<b>>>0):0){g=e+(ca(c[f+24>>2]|0,b-a|0)|0)|0}else{g=0}i=d;return g|0}function tx(a,e){a=a|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;g=(d[e+1>>0]|0)<<16|(d[e>>0]|0)<<24|(d[e+2>>0]|0)<<8|(d[e+3>>0]|0);c[a+32>>2]=g;if((g|0)!=65536){i=f;return}g=(d[e+4>>0]|0)<<8|(d[e+5>>0]|0);b[a+36>>1]=g;h=(d[e+6>>0]|0)<<8|(d[e+7>>0]|0);b[a+38>>1]=h;j=(d[e+8>>0]|0)<<8|(d[e+9>>0]|0);b[a+40>>1]=j;ux(a,e+g|0,e+h|0,e+j|0);i=f;return}function ux(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=i;zx(b,a+44|0);Ax(c,a+52|0);Bx(d,a+60|0);i=e;return}function vx(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;g=i;i=i+32|0;h=g+16|0;j=g+12|0;k=g+8|0;l=g+4|0;m=g;n=a+24|0;if((c[n>>2]|0)==0){o=a+44|0;p=b[o>>1]|0;if(p<<16>>16==0){q=a+4|0}else{r=a+48|0;s=a+56|0;t=a+4|0;u=a+12|0;v=a+16|0;w=c[r>>2]|0;x=p;p=0;while(1){if((b[w+(p*12|0)+6>>1]|0)==0){y=x;z=w}else{A=w;B=0;while(1){C=c[A+(p*12|0)+8>>2]|0;if((b[C+(B<<4)+8>>1]|0)==0){D=A}else{E=C;C=0;do{F=e[(c[E+(B<<4)+12>>2]|0)+(C<<1)>>1]|0;G=c[(c[s>>2]|0)+(F<<4)>>2]|0;if((G|0)==1986359924|(G|0)==1987212338?(kna(c[u>>2]|0,c[v>>2]|0,F,h)|0)==0:0){ona(t,F,F)}C=C+1|0;F=c[r>>2]|0;E=c[F+(p*12|0)+8>>2]|0}while((C|0)<(e[E+(B<<4)+8>>1]|0));D=F}B=B+1|0;if((B|0)>=(e[D+(p*12|0)+6>>1]|0)){break}else{A=D}}y=b[o>>1]|0;z=D}p=p+1|0;if((p|0)>=(y&65535|0)){q=t;break}else{w=z;x=y}}}y=q+12|0;if((mna(c[y>>2]|0)|0)==0?(x=a+52|0,(c[x>>2]|0)>0):0){z=a+56|0;w=q+8|0;t=0;do{p=c[(c[z>>2]|0)+(t<<4)>>2]|0;if((p|0)==1986359924|(p|0)==1987212338?(kna(c[w>>2]|0,c[y>>2]|0,t,j)|0)==0:0){ona(q,t,t)}t=t+1|0}while((t|0)<(c[x>>2]|0))}c[n>>2]=1;H=q}else{H=a+4|0}q=mna(c[H+12>>2]|0)|0;c[k>>2]=q;if((q|0)==0){I=0;i=g;return I|0}q=a+56|0;while(1){nna(H,k,l,m);if(wx(a,d,f,(c[q>>2]|0)+(c[m>>2]<<4)+4|0)|0){I=1;J=27;break}if((c[k>>2]|0)==0){I=0;J=27;break}}if((J|0)==27){i=g;return I|0}return 0}function wx(a,d,f,g){a=a|0;d=d|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;h=i;j=g+4|0;k=c[j>>2]|0;if((k|0)<=0){l=0;i=h;return l|0}m=g+8|0;g=a+60|0;n=a+64|0;a=k;k=0;while(1){o=e[(c[m>>2]|0)+(k<<1)>>1]|0;if((c[g>>2]|0)>=(o|0)?(p=(c[n>>2]|0)+(o*12|0)|0,(b[p>>1]|0)==1):0){if(xx(d,f,p)|0){l=1;q=8;break}r=c[j>>2]|0}else{r=a}k=k+1|0;if((k|0)>=(r|0)){l=0;q=8;break}else{a=r}}if((q|0)==8){i=h;return l|0}return 0}function xx(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;g=i;h=b[f+4>>1]|0;if(h<<16>>16==0){j=0;i=g;return j|0}k=c[f+8>>2]|0;f=h&65535;h=0;while(1){l=c[k+(h<<2)>>2]|0;m=e[l+4>>1]|0;if((m|0)==2){n=yx(c[l+8>>2]|0,a)|0;if((n|0)>-1?(n|0)<(e[l+12>>1]|0):0){o=8;break}}else if((m|0)==1?(yx(c[l+8>>2]|0,a)|0)>-1:0){o=5;break}h=h+1|0;if((h|0)>=(f|0)){j=0;o=10;break}}if((o|0)==5){c[d>>2]=(b[l+12>>1]|0)+a;j=1;i=g;return j|0}else if((o|0)==8){c[d>>2]=e[(c[l+16>>2]|0)+(n<<1)>>1]|0;j=1;i=g;return j|0}else if((o|0)==10){i=g;return j|0}return 0}function yx(a,d){a=a|0;d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;a:do{if((a|0)!=0){g=e[a+4>>1]|0;if((g|0)==1){h=b[a+24>>1]|0;if(h<<16>>16==0){j=-1;break}k=c[a+28>>2]|0;l=h&65535;h=0;while(1){if((e[k+(h<<1)>>1]|0|0)==(d|0)){j=h;break a}h=h+1|0;if((h|0)>=(l|0)){j=-1;break a}}}else if((g|0)!=2){j=-1;break}l=b[a+24>>1]|0;if(!(l<<16>>16==0)){h=c[a+28>>2]|0;k=l&65535;l=0;while(1){m=e[h+(l*6|0)>>1]|0;if(!(m>>>0>d>>>0)?!((e[h+(l*6|0)+2>>1]|0)>>>0<d>>>0):0){break}n=l+1|0;if((n|0)<(k|0)){l=n}else{j=-1;break a}}j=d-m+(e[h+(l*6|0)+4>>1]|0)|0}else{j=-1}}else{j=-1}}while(0);i=f;return j|0}function zx(a,f){a=a|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;g=i;i=i+16|0;h=g;j=d[a>>0]<<8|d[a+1>>0];k=j&65535;c[h>>2]=a+2;b[f>>1]=k;if(k<<16>>16==0){i=g;return}k=_1a((j*12|0)+4|0)|0;c[k>>2]=j;l=k+4|0;k=l+(j*12|0)|0;j=l;do{c[j>>2]=0;m=j+4|0;n=m;b[n>>1]=0;b[n+2>>1]=0>>>16;n=m+4|0;b[n>>1]=0;b[n+2>>1]=0>>>16;j=j+12|0}while((j|0)!=(k|0));k=f+4|0;c[k>>2]=l;if((b[f>>1]|0)==0){i=g;return}else{o=0}do{l=Cx(h)|0;c[(c[k>>2]|0)+(o*12|0)>>2]=l;l=c[h>>2]|0;j=d[l>>0]<<8|d[l+1>>0];c[h>>2]=l+2;Dx(a+j|0,(c[k>>2]|0)+(o*12|0)+4|0);o=o+1|0}while((o|0)<(e[f>>1]|0));i=g;return}function Ax(a,e){a=a|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;g=f;h=(d[a>>0]|0)<<8|(d[a+1>>0]|0);c[g>>2]=a+2;c[e>>2]=h;if((h|0)==0){i=f;return}j=_1a(h<<4|4)|0;c[j>>2]=h;k=j+4|0;j=k+(h<<4)|0;h=k;do{c[h>>2]=0;b[h+4>>1]=0;c[h+8>>2]=0;c[h+12>>2]=0;h=h+16|0}while((h|0)!=(j|0));j=e+4|0;c[j>>2]=k;if((c[e>>2]|0)>0){l=0}else{i=f;return}do{k=Cx(g)|0;c[(c[j>>2]|0)+(l<<4)>>2]=k;k=c[g>>2]|0;h=(d[k>>0]|0)<<8|(d[k+1>>0]|0);c[g>>2]=k+2;Fx(a+h|0,(c[j>>2]|0)+(l<<4)+4|0);l=l+1|0}while((l|0)<(c[e>>2]|0));i=f;return}function Bx(a,e){a=a|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;g=(d[a>>0]|0)<<8|(d[a+1>>0]|0);c[e>>2]=g;if((g|0)==0){i=f;return}h=_1a((g*12|0)+4|0)|0;c[h>>2]=g;j=h+4|0;h=j+(g*12|0)|0;g=j;do{b[g>>1]=0;b[g+2>>1]=0;b[g+4>>1]=0;c[g+8>>2]=0;g=g+12|0}while((g|0)!=(h|0));h=e+4|0;c[h>>2]=j;if((c[e>>2]|0)>0){k=j;l=0;m=a}else{i=f;return}while(1){j=m+2|0;Gx(a+((d[j>>0]|0)<<8|(d[m+3>>0]|0))|0,k+(l*12|0)|0);g=l+1|0;if((g|0)>=(c[e>>2]|0)){break}k=c[h>>2]|0;l=g;m=j}i=f;return}function Cx(a){a=a|0;var b=0,e=0;b=c[a>>2]|0;e=(d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(d[b+2>>0]|0)<<8|(d[b+3>>0]|0);c[a>>2]=b+4;return e|0}function Dx(a,f){a=a|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0;g=i;i=i+16|0;h=g;b[f>>1]=d[a>>0]<<8|d[a+1>>0];j=d[a+2>>0]<<8|d[a+3>>0];k=j&65535;c[h>>2]=a+4;l=f+2|0;b[l>>1]=k;if(k<<16>>16==0){i=g;return}k=_1a(j<<4|4)|0;c[k>>2]=j;m=k+4|0;k=m+(j<<4)|0;j=m;do{c[j+12>>2]=0;c[j+0>>2]=0;c[j+4>>2]=0;b[j+8>>1]=0;j=j+16|0}while((j|0)!=(k|0));k=f+4|0;c[k>>2]=m;if((b[l>>1]|0)==0){i=g;return}else{n=0}do{m=Cx(h)|0;c[(c[k>>2]|0)+(n<<4)>>2]=m;m=c[h>>2]|0;f=d[m>>0]<<8|d[m+1>>0];c[h>>2]=m+2;Ex(a+f|0,(c[k>>2]|0)+(n<<4)+4|0);n=n+1|0}while((n|0)<(e[l>>1]|0));i=g;return}function Ex(a,f){a=a|0;f=f|0;var g=0,h=0,j=0,k=0,l=0;g=i;b[f>>1]=(d[a>>0]|0)<<8|(d[a+1>>0]|0);b[f+2>>1]=(d[a+2>>0]|0)<<8|(d[a+3>>0]|0);h=(d[a+4>>0]|0)<<8|(d[a+5>>0]|0);j=h&65535;k=f+4|0;b[k>>1]=j;if(j<<16>>16==0){i=g;return}j=h<<1;h=_1a(j)|0;l=f+8|0;c[l>>2]=h;f3a(h|0,0,j|0)|0;j=a+6|0;a=h;h=0;while(1){b[a+(h<<1)>>1]=(d[j>>0]|0)<<8|(d[j+1>>0]|0);f=h+1|0;if((f|0)>=(e[k>>1]|0|0)){break}j=j+2|0;a=c[l>>2]|0;h=f}i=g;return}function Fx(a,e){a=a|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;b[e>>1]=(d[a>>0]|0)<<8|(d[a+1>>0]|0);g=(d[a+2>>0]|0)<<8|(d[a+3>>0]|0);h=e+4|0;c[h>>2]=g;if((g|0)==0){i=f;return}j=_1a(g<<1)|0;g=e+8|0;c[g>>2]=j;e=a+4|0;a=j;j=0;while(1){b[a+(j<<1)>>1]=(d[e>>0]|0)<<8|(d[e+1>>0]|0);k=j+1|0;if((k|0)>=(c[h>>2]|0)){break}e=e+2|0;a=c[g>>2]|0;j=k}i=f;return}function Gx(a,f){a=a|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;g=i;b[f>>1]=d[a>>0]<<8|d[a+1>>0];b[f+2>>1]=d[a+2>>0]<<8|d[a+3>>0];h=d[a+4>>0]<<8|d[a+5>>0];j=h&65535;k=a+6|0;l=f+4|0;b[l>>1]=j;if(j<<16>>16==0){i=g;return}j=_1a(h<<2)|0;h=f+8|0;c[h>>2]=j;m=j;j=0;while(1){c[m+(j<<2)>>2]=0;n=j+1|0;o=b[l>>1]|0;if((n|0)>=(o&65535|0)){break}m=c[h>>2]|0;j=n}if((b[f>>1]|0)!=1|o<<16>>16==0){i=g;return}else{p=k;q=0}while(1){Hx(a+(d[p>>0]<<8|d[p+1>>0])|0,(c[h>>2]|0)+(q<<2)|0);k=q+1|0;if((k|0)>=(e[l>>1]|0)){break}p=p+2|0;q=k}i=g;return}function Hx(a,e){a=a|0;e=e|0;var f=0,g=0,h=0;f=i;g=(d[a>>0]|0)<<8|(d[a+1>>0]|0);if((g|0)==2){h=Z1a(20)|0;c[h>>2]=33248;c[h+8>>2]=0;b[h+12>>1]=0;c[h+16>>2]=0;b[h+4>>1]=2;c[e>>2]=h;Mx(a,h);i=f;return}else if((g|0)==1){g=Z1a(16)|0;c[g>>2]=33264;c[g+8>>2]=0;b[g+12>>1]=0;b[g+4>>1]=1;c[e>>2]=g;Lx(a,g);i=f;return}else{i=f;return}}function Ix(a,b){a=a|0;b=b|0;var e=0,f=0,g=0;e=i;f=(d[a>>0]|0)<<8|(d[a+1>>0]|0);if((f|0)==1){g=Z1a(32)|0;$x(g);c[b>>2]=g;Jx(a,g);i=e;return}else if((f|0)==2){f=Z1a(32)|0;Tx(f);c[b>>2]=f;Kx(a,f);i=e;return}else{i=e;return}}function Jx(a,f){a=a|0;f=f|0;var g=0,h=0,j=0,k=0,l=0;g=i;h=(d[a+2>>0]|0)<<8|(d[a+3>>0]|0);j=h&65535;k=f+24|0;b[k>>1]=j;if(j<<16>>16==0){i=g;return}j=_1a(h<<1)|0;h=f+28|0;c[h>>2]=j;f=a+4|0;a=j;j=0;while(1){b[a+(j<<1)>>1]=(d[f>>0]|0)<<8|(d[f+1>>0]|0);l=j+1|0;if((l|0)>=(e[k>>1]|0|0)){break}f=f+2|0;a=c[h>>2]|0;j=l}i=g;return}function Kx(a,f){a=a|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;g=i;h=d[a+2>>0]<<8|d[a+3>>0];j=h&65535;k=a+4|0;a=f+24|0;b[a>>1]=j;if(j<<16>>16==0){i=g;return}j=_1a(h*6|0)|0;l=j+(h*6|0)|0;h=j;do{b[h>>1]=0;b[h+2>>1]=0;b[h+4>>1]=0;h=h+6|0}while((h|0)!=(l|0));l=f+28|0;c[l>>2]=j;if((b[a>>1]|0)==0){i=g;return}else{m=k;n=j;o=0}while(1){b[n+(o*6|0)>>1]=d[m>>0]<<8|d[m+1>>0];b[(c[l>>2]|0)+(o*6|0)+2>>1]=d[m+2>>0]<<8|d[m+3>>0];b[(c[l>>2]|0)+(o*6|0)+4>>1]=d[m+4>>0]<<8|d[m+5>>0];j=o+1|0;if((j|0)>=(e[a>>1]|0)){break}m=m+6|0;n=c[l>>2]|0;o=j}i=g;return}function Lx(a,c){a=a|0;c=c|0;var e=0;e=i;Ix(a+((d[a+2>>0]|0)<<8|(d[a+3>>0]|0))|0,c+8|0);b[c+12>>1]=(d[a+4>>0]|0)<<8|(d[a+5>>0]|0);i=e;return}function Mx(a,f){a=a|0;f=f|0;var g=0,h=0,j=0,k=0,l=0;g=i;Ix(a+((d[a+2>>0]|0)<<8|(d[a+3>>0]|0))|0,f+8|0);h=(d[a+4>>0]|0)<<8|(d[a+5>>0]|0);j=h&65535;k=f+12|0;b[k>>1]=j;if(j<<16>>16==0){i=g;return}j=_1a(h<<1)|0;h=f+16|0;c[h>>2]=j;f=a+6|0;a=j;j=0;while(1){b[a+(j<<1)>>1]=(d[f>>0]|0)<<8|(d[f+1>>0]|0);l=j+1|0;if((l|0)>=(e[k>>1]|0|0)){break}f=f+2|0;a=c[h>>2]|0;j=l}i=g;return}function Nx(a){a=a|0;var b=0;b=i;Px(a);i=b;return}function Ox(a){a=a|0;var b=0;b=i;Px(a);$1a(a);i=b;return}function Px(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=33248;d=c[a+8>>2]|0;if((d|0)!=0){Rc[c[(c[d>>2]|0)+4>>2]&1023](d)}d=c[a+16>>2]|0;if((d|0)==0){i=b;return}a2a(d);i=b;return}function Qx(a){a=a|0;var b=0;b=i;Sx(a);i=b;return}function Rx(a){a=a|0;var b=0;b=i;Sx(a);$1a(a);i=b;return}function Sx(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=33264;d=c[a+8>>2]|0;if((d|0)==0){i=b;return}Rc[c[(c[d>>2]|0)+4>>2]&1023](d);i=b;return}function Tx(a){a=a|0;var d=0;d=i;Ux(a);c[a>>2]=33280;b[a+24>>1]=0;c[a+28>>2]=0;b[a+4>>1]=2;i=d;return}function Ux(a){a=a|0;var d=0;d=i;c[a>>2]=33296;b[a+4>>1]=0;gla(a+8|0);i=d;return}function Vx(a){a=a|0;var b=0;b=i;Xx(a);i=b;return}function Wx(a){a=a|0;var b=0;b=i;Xx(a);$1a(a);i=b;return}function Xx(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=33280;d=c[a+28>>2]|0;if((d|0)!=0){a2a(d)}c[a>>2]=33296;ila(c[a+12>>2]|0);i=b;return}function Yx(a){a=a|0;var b=0;b=i;c[a>>2]=33296;ila(c[a+12>>2]|0);i=b;return}function Zx(a){a=a|0;var b=0;b=i;Yx(a);i=b;return}function _x(a){a=a|0;var b=0;b=i;c[a>>2]=33296;ila(c[a+12>>2]|0);$1a(a);i=b;return}function $x(a){a=a|0;var d=0;d=i;Ux(a);c[a>>2]=33312;b[a+24>>1]=0;c[a+28>>2]=0;b[a+4>>1]=1;i=d;return}function ay(a){a=a|0;var b=0;b=i;cy(a);i=b;return}function by(a){a=a|0;var b=0;b=i;cy(a);$1a(a);i=b;return}function cy(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=33312;d=c[a+28>>2]|0;if((d|0)!=0){a2a(d)}c[a>>2]=33296;ila(c[a+12>>2]|0);i=b;return}function dy(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}Rc[c[(c[a>>2]|0)+12>>2]&1023](a);i=b;return}function ey(a){a=a|0;var b=0,d=0,e=0;b=i;switch(a|0){case 5:{a=u2a(80)|0;_y(a);d=a;break};case 3:{a=u2a(80)|0;jD(a);d=a;break};case 1:{a=u2a(72)|0;e=a+8|0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[a+48>>2]=0;c[a>>2]=33328;c[a+28>>2]=1;e=a+52|0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;d=a;break};case 2:{a=u2a(88)|0;_l(a);d=a;break};case 4:{a=u2a(84)|0;vy(a);d=a;break};default:{d=0}}i=b;return d|0}function fy(a){a=a|0;var b=0,d=0;b=i;d=ey(c[a+28>>2]|0)|0;gy(d,a);i=b;return d|0}function gy(a,b){a=a|0;b=b|0;var d=0;d=i;if((c[a+28>>2]|0)!=(c[b+28>>2]|0)){i=d;return}Ic[c[(c[a>>2]|0)+4>>2]&511](a,b);sC(a+4|0,b+4|0);g[a+32>>2]=+g[b+32>>2];g[a+36>>2]=+g[b+36>>2];g[a+40>>2]=+g[b+40>>2];g[a+44>>2]=+g[b+44>>2];i=d;return}function hy(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;if((d|0)==0){i=b;return}e=d+20|0;c[e>>2]=(c[e>>2]|0)+ -1;e=c[a>>2]|0;if(!((c[e+20>>2]|0)>0|(e|0)==0)){uC(e);v2a(e)}c[a>>2]=0;i=b;return}function iy(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b;e=a+8|0;if((c[e>>2]|0)==0){i=b;return}wC(d,e);g[a+32>>2]=+g[d>>2];g[a+44>>2]=+g[d+8>>2];g[a+36>>2]=+g[d+4>>2];g[a+40>>2]=+g[d+12>>2];i=b;return}function jy(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=c[a>>2]|0;if((d|0)==0){e=u2a(24)|0;tC(e);c[a>>2]=e;if((e|0)==0){f=e}else{c[e+20>>2]=1;f=e}}else{e=d+20|0;g=c[e>>2]|0;if((g|0)>1){c[e>>2]=g+ -1;g=c[a>>2]|0;c[a>>2]=0;e=u2a(24)|0;vC(e,g);c[a>>2]=e;if((e|0)==0){f=e}else{c[e+20>>2]=1;f=e}}else{f=d}}i=b;return f|0}function ky(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=c[a>>2]|0;if((d|0)==0){e=u2a(140)|0;NC(e);c[a>>2]=e;if((e|0)==0){f=e}else{c[e+136>>2]=1;f=e}}else{e=d+136|0;g=c[e>>2]|0;if((g|0)>1){c[e>>2]=g+ -1;g=c[a>>2]|0;c[a>>2]=0;e=u2a(140)|0;OC(e,g);c[a>>2]=e;if((e|0)==0){f=e}else{c[e+136>>2]=1;f=e}}else{f=d}}i=b;return f|0}function ly(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0.0,h=0.0,j=0.0;d=i;i=i+16|0;e=d;f=+g[b+44>>2];h=+g[b+36>>2];j=+g[b+40>>2];g[e>>2]=+g[b+32>>2];g[e+8>>2]=f;g[e+4>>2]=h;g[e+12>>2]=j;if((c|0)==0){Mla(a,e);i=d;return}rm(c,e);Mla(a,e);i=d;return}function my(a){a=a|0;var b=0,d=0;b=i;d=a+8|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[a+48>>2]=0;c[a>>2]=33328;c[a+28>>2]=1;d=a+52|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;i=b;return}function ny(a){a=a|0;var b=0;b=i;oy(a);v2a(a);i=b;return}function oy(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=33328;if((c[a+60>>2]|0)>1?(d=c[a+64>>2]|0,(d|0)!=0):0){v2a(d)}d=c[a+68>>2]|0;if((d|0)==0){$l(a);i=b;return}v2a(d);$l(a);i=b;return}function py(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;e=a+60|0;if((c[e>>2]|0)>1?(f=a+64|0,h=c[f>>2]|0,(h|0)!=0):0){v2a(h);c[f>>2]=0}f=a+68|0;h=c[f>>2]|0;if((h|0)!=0){v2a(h);c[f>>2]=0}h=c[b+60>>2]|0;c[e>>2]=h;if((h|0)>1){j=w2a(h,4)|0;k=a+64|0;c[k>>2]=j;c[f>>2]=w2a(h+ -1|0,4)|0;h=b+64|0;l=j;j=0;while(1){c[l+(j<<2)>>2]=c[(c[h>>2]|0)+(j<<2)>>2];m=j+1|0;n=c[e>>2]|0;if((m|0)>=(n|0)){break}l=c[k>>2]|0;j=m}if((n+ -1|0)>0){n=b+68|0;j=0;do{g[(c[f>>2]|0)+(j<<2)>>2]=+g[(c[n>>2]|0)+(j<<2)>>2];j=j+1|0}while((j|0)<((c[e>>2]|0)+ -1|0))}}else{c[a+64>>2]=c[b+64>>2]}g[a+52>>2]=+g[b+52>>2];g[a+56>>2]=+g[b+56>>2];i=d;return}function qy(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[a+20>>2]|0;Tla(b,+g[e+16>>2],+g[e+24>>2],+g[e+20>>2],+g[e+28>>2],+g[a+52>>2],+g[a+56>>2]);i=d;return}function ry(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;f=i;i=i+16|0;h=f+4|0;j=f;k=a+60|0;if((c[k>>2]|0)>1?(l=a+64|0,m=c[l>>2]|0,(m|0)!=0):0){v2a(m);c[l>>2]=0}l=a+68|0;m=c[l>>2]|0;if((m|0)!=0){v2a(m);c[l>>2]=0}m=c[c[a+20>>2]>>2]|0;c[k>>2]=0;n=(e|0)>0;if(n){o=0;do{p=c[b+(o<<2)>>2]|0;q=(p|0)==0;if(q){r=0}else{r=c[p+4>>2]|0}s=Qc[c[(c[m>>2]|0)+20>>2]&255](m,q?1305928:p+12|0,r)|0;p=(c[k>>2]|0)+s|0;c[k>>2]=p;o=o+1|0}while((o|0)!=(e|0));t=p}else{t=0}o=e+ -1|0;r=t+o|0;c[k>>2]=r;if((r|0)<=1){c[j>>2]=0;k=c[b>>2]|0;c[a+64>>2]=Qc[c[(c[m>>2]|0)+16>>2]&255](m,(k|0)==0?1305928:k+12|0,j)|0;i=f;return}j=a+64|0;c[j>>2]=w2a(r,4)|0;c[l>>2]=w2a(r+ -1|0,4)|0;if(!n){i=f;return}n=0;r=0;while(1){a=c[b+(n<<2)>>2]|0;k=(a|0)==0;t=k?1305928:a+12|0;c[h>>2]=0;if(!k?(k=c[a+4>>2]|0,(k|0)>0):0){a=r;while(1){p=Qc[c[(c[m>>2]|0)+16>>2]&255](m,t,h)|0;s=a+1|0;c[(c[j>>2]|0)+(a<<2)>>2]=p;if((c[h>>2]|0)<(k|0)){a=s}else{u=s;break}}}else{u=r}if((n|0)==(o|0)){v=u}else{g[(c[l>>2]|0)+(u+ -1<<2)>>2]=+g[d+(n<<2)>>2];c[(c[j>>2]|0)+(u<<2)>>2]=-1;v=u+1|0}n=n+1|0;if((n|0)==(e|0)){break}else{r=v}}i=f;return}function sy(a,d,e,f,h){a=a|0;d=d|0;e=e|0;f=+f;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0,K=0,L=0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0.0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0,pa=0.0;j=i;i=i+48|0;k=j+24|0;l=j+42|0;m=j+40|0;n=j;o=a+20|0;p=c[o>>2]|0;q=c[p>>2]|0;if((c[q+84>>2]|0)==4?(q|0)!=0:0){r=Lc[c[(c[q>>2]|0)+8>>2]&255](q)|0;s=c[o>>2]|0;t=0;u=q;v=r}else{s=p;t=1;u=0;v=0}w=+g[s+4>>2];s=a+60|0;p=c[s>>2]|0;if((p|0)>0){r=a+64|0;x=a+68|0;y=(v|0)==0;z=k+4|0;A=k+12|0;B=k+8|0;C=u+144|0;D=p;E=0.0;p=0;F=-1.0e4;G=-1.0e4;H=1.0e4;I=1.0e4;while(1){J=c[r>>2]|0;if((D|0)==1){K=J}else{K=c[J+(p<<2)>>2]|0}if((K|0)==-1){L=D;M=E-w*+g[(c[x>>2]|0)+(p+ -1<<2)>>2]/1.0e3;N=F;O=G;P=H;Q=I}else{if((p|0)!=0){g[(c[x>>2]|0)+(p+ -1<<2)>>2]=E}pd[c[(c[q>>2]|0)+48>>2]&127](q,K,k,h);if(y){R=+(c[z>>2]|0);S=I>R?R:I;T=G<R?R:G;R=+(c[A>>2]|0);U=E+w*+(c[k>>2]|0)/1.0e3;V=E+w*+(c[B>>2]|0)/1.0e3;W=H>U?U:H;X=F<U?U:F;Y=+(Qc[c[(c[q>>2]|0)+40>>2]&255](q,K,h)|0);Z=X<V?V:X;_=T<R?R:T;$=W>V?V:W;aa=S>R?R:S}else{J=Gw(c[C>>2]|0,K)|0;Tw(u,J,l,m);ba=b[l>>1]|0;ca=(c[k>>2]|0)-ba|0;c[k>>2]=ca;da=(c[B>>2]|0)-ba|0;c[B>>2]=da;ba=b[m>>1]|0;ea=(c[z>>2]|0)-ba|0;c[z>>2]=ea;fa=(c[A>>2]|0)-ba|0;c[A>>2]=fa;S=+(ca|0);R=H>S?S:H;W=F<S?S:F;S=+(da|0);V=E+w*+(ea|0)/1.0e3;T=E+w*+(fa|0)/1.0e3;X=I>V?V:I;U=G<V?V:G;Y=+((Sw(u,J)|0)<<16>>16);Z=W<S?S:W;_=U<T?T:U;$=R>S?S:R;aa=X>T?T:X}X=E+w*Y/1.0e3;do{if((K|0)==32){if(!t?(dd[c[(c[u>>2]|0)+28>>2]&511](u,32)|0)!=1:0){ga=X;break}ga=X+ +g[(c[o>>2]|0)+12>>2]}else{ga=X}}while(0);L=c[s>>2]|0;M=ga+ +g[(c[o>>2]|0)+8>>2];N=Z;O=_;P=$;Q=aa}p=p+1|0;if((p|0)>=(L|0)){ha=M;ia=N;ja=O;ka=P;la=Q;break}else{D=L;E=M;F=N;G=O;H=P;I=Q}}}else{ha=0.0;ia=-1.0e4;ja=-1.0e4;ka=1.0e4;la=1.0e4}L=(d|0)!=0;if((v|0)==0){if(L){g[d>>2]=ha*f}if((e|0)!=0){g[e>>2]=0.0}ma=ia;na=w*ja/1.0e3;oa=ka;pa=w*la/1.0e3}else{if(L){g[d>>2]=0.0}if((e|0)!=0){g[e>>2]=ha}ma=w*ia/1.0e3;na=ja;oa=w*ka/1.0e3;pa=la}g[n+12>>2]=1.0;g[n>>2]=1.0;g[n+20>>2]=0.0;g[n+16>>2]=0.0;g[n+8>>2]=0.0;g[n+4>>2]=0.0;qy(a,n);e=a+32|0;g[e>>2]=oa;d=a+36|0;g[d>>2]=ma;L=a+44|0;g[L>>2]=pa;v=a+40|0;g[v>>2]=na;Lla(n,e,d,v,L);n=c[(c[o>>2]|0)+32>>2]|0;if(!((n+ -1|0)>>>0<2|(n|0)==5|(n|0)==6)){i=j;return}na=+g[(c[a+12>>2]|0)+24>>2]*.5;g[e>>2]=+g[e>>2]-na;g[d>>2]=na+ +g[d>>2];g[v>>2]=na+ +g[v>>2];g[L>>2]=+g[L>>2]-na;i=j;return}function ty(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0;d=i;i=i+32|0;e=d;f=a+20|0;uy(f)|0;h=e+12|0;g[h>>2]=1.0;g[e>>2]=1.0;j=e+20|0;g[j>>2]=0.0;k=e+16|0;g[k>>2]=0.0;l=e+8|0;g[l>>2]=0.0;m=e+4|0;g[m>>2]=0.0;qy(a,e);Wla(e,b);b=c[f>>2]|0;g[b+16>>2]=+g[e>>2];g[b+20>>2]=+g[l>>2];g[b+24>>2]=+g[m>>2];g[b+28>>2]=+g[h>>2];g[a+52>>2]=+g[k>>2];g[a+56>>2]=+g[j>>2];sy(a,0,0,0.0,0);i=d;return}function uy(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=c[a>>2]|0;if((d|0)==0){e=u2a(56)|0;JC(e);c[a>>2]=e;if((e|0)==0){f=e}else{c[e+52>>2]=1;f=e}}else{e=d+52|0;g=c[e>>2]|0;if((g|0)>1){c[e>>2]=g+ -1;g=c[a>>2]|0;c[a>>2]=0;e=u2a(56)|0;KC(e,g);c[a>>2]=e;if((e|0)==0){f=e}else{c[e+52>>2]=1;f=e}}else{f=d}}i=b;return f|0}function vy(a){a=a|0;var b=0,d=0;b=i;d=a+8|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[a+48>>2]=0;c[a>>2]=33352;g[a+68>>2]=1.0;g[a+56>>2]=1.0;g[a+76>>2]=0.0;g[a+72>>2]=0.0;g[a+64>>2]=0.0;g[a+60>>2]=0.0;c[a+52>>2]=0;c[a+28>>2]=4;i=b;return}function wy(a){a=a|0;var b=0;b=i;xy(a);v2a(a);i=b;return}function xy(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;c[a>>2]=33352;d=c[a+52>>2]|0;if((d|0)!=0?(e=c[d+60>>2]|0,(e|0)!=0):0){f=IG(e)|0;qB(f,c[d+64>>2]|0)}$l(a);i=b;return}function yy(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=c[b+52>>2]|0;f=a+52|0;c[f>>2]=e;if((e|0)!=0?(g=c[e+60>>2]|0,(g|0)!=0):0){e=IG(g)|0;g=c[f>>2]|0;c[f>>2]=YA(e,c[g+64>>2]|0,c[g+68>>2]|0,g+36|0)|0}g=a+56|0;a=b+56|0;c[g+0>>2]=c[a+0>>2];c[g+4>>2]=c[a+4>>2];c[g+8>>2]=c[a+8>>2];c[g+12>>2]=c[a+12>>2];c[g+16>>2]=c[a+16>>2];c[g+20>>2]=c[a+20>>2];i=d;return}function zy(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+8|0;if((c[e>>2]|0)!=0){jy(e)|0;BC(e,b)}Wla(a+56|0,b);if((c[e>>2]|0)==0){Lla(b,a+32|0,a+36|0,a+40|0,a+44|0);i=d;return}else{iy(a);i=d;return}}function Ay(a){a=a|0;var b=0;b=i;By(a);v2a(a);i=b;return}function By(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=33376;d=c[a+52>>2]|0;if((d|0)!=0){Iy(d);v2a(d)}$l(a);i=b;return}function Cy(a,b){a=a|0;b=b|0;var c=0;c=i;Wla(a+56|0,b);Dy(a);i=c;return}function Dy(a){a=a|0;var b=0,d=0;b=i;i=i+16|0;d=b;Gy(d,c[a+52>>2]|0);Kla(d,a+56|0);g[a+32>>2]=+g[d>>2];g[a+44>>2]=+g[d+8>>2];g[a+36>>2]=+g[d+4>>2];g[a+40>>2]=+g[d+12>>2];i=b;return}function Ey(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=a+52|0;f=c[e>>2]|0;if((f|0)!=0){Iy(f);v2a(f)}c[e>>2]=Fy(c[b+52>>2]|0)|0;e=a+56|0;a=b+56|0;c[e+0>>2]=c[a+0>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[e+12>>2]=c[a+12>>2];c[e+16>>2]=c[a+16>>2];c[e+20>>2]=c[a+20>>2];i=d;return}function Fy(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=u2a(80)|0;Sy(d,c[a+8>>2]|0,c[a+12>>2]|0,c[a+4>>2]|0,c[a+16>>2]|0);e=c[a+40>>2]|0;if((e|0)==0){i=b;return d|0}a=d+40|0;f=e;do{e=f;f=c[f>>2]|0;uma(a,fy(c[e+8>>2]|0)|0)}while((f|0)!=0);i=b;return d|0}function Gy(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,h=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0;d=i;if((c[b+48>>2]|0)==0){c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;i=d;return}e=c[b+40>>2]|0;f=1.0e6;h=1.0e6;j=-1.0e6;k=-1.0e6;a:while(1){b=e;l=h;m=j;n=k;while(1){if((b|0)==0){break a}o=c[b>>2]|0;p=c[b+8>>2]|0;q=+g[p+32>>2];r=l>q?q:l;q=+g[p+36>>2];s=m<q?q:m;q=+g[p+40>>2];t=n<q?q:n;q=+g[p+44>>2];if(f>q){e=o;f=q;h=r;j=s;k=t;continue a}else{b=o;l=r;m=s;n=t}}}g[a>>2]=l;g[a+8>>2]=f;g[a+4>>2]=m;g[a+12>>2]=n;i=d;return}function Hy(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+20|0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;tma(a+40|0,128);c[a+64>>2]=0;c[a+68>>2]=b;c[a+76>>2]=0;c[a+72>>2]=0;c[a+4>>2]=0;c[a+16>>2]=0;i=d;return}function Iy(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a+72>>2]|0;if((d|0)!=0){SF(d);v2a(d)}if((c[a+68>>2]|0)!=0?(d=c[a+40>>2]|0,(d|0)!=0):0){e=d;do{d=e;e=c[e>>2]|0;f=c[d+8>>2]|0;if((f|0)!=0){dy(f)}}while((e|0)!=0)}xma(a+40|0);i=b;return}function Jy(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=a+72|0;f=c[e>>2]|0;if((f|0)==0){i=d;return}WF(f,b);b=c[e>>2]|0;if((c[b>>2]|0)!=2){i=d;return}c[a+76>>2]=2;if((b|0)!=0){SF(b);v2a(b)}c[e>>2]=0;i=d;return}function Ky(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;i=i+48|0;d=b+40|0;e=b+32|0;f=b+24|0;g=b+16|0;h=b+8|0;j=b;k=c[a>>2]|0;if((k|0)==0){i=b;return}c[d>>2]=39680;c[d+4>>2]=5;l=iI(k,d)|0;if((l|0)==0){i=b;return}c[f>>2]=39648;c[f+4>>2]=1;aI(e,l,f);c[g>>2]=33392;c[g+4>>2]=12;f=vka(c[e>>2]|0,g)|0;dka(e);if(!f){i=b;return}f=a+36|0;c[f>>2]=c[f>>2]|256;c[h>>2]=37016;c[h+4>>2]=1;if((eI(l,h)|0)!=0){c[f>>2]=c[f>>2]|512}c[j>>2]=1291960;c[j+4>>2]=1;if((eI(l,j)|0)==0){i=b;return}c[f>>2]=c[f>>2]|1024;i=b;return}function Ly(a){a=a|0;var b=0;b=i;Hy(a,1);Ija(a+80|0,16);g[a+116>>2]=1.0;g[a+104>>2]=1.0;g[a+124>>2]=0.0;g[a+120>>2]=0.0;g[a+112>>2]=0.0;g[a+108>>2]=0.0;c[a+128>>2]=0;i=b;return}function My(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0;e=i;i=i+64|0;f=e+56|0;h=e+48|0;j=e+40|0;k=e+24|0;l=e+16|0;m=e;c[a+8>>2]=b;c[a>>2]=d;b=c[(xt()|0)+8>>2]|0;c[a+128>>2]=dd[c[(c[b>>2]|0)+24>>2]&511](b,a)|0;if((d|0)==0){g[a+100>>2]=100.0;g[a+96>>2]=100.0;c[a+16>>2]=0;c[a+12>>2]=0;i=e;return}c[f>>2]=669496;c[f+4>>2]=9;d=Ry(c[a>>2]|0,f)|0;if((d|0)==0){n=0}else{n=lH(d)|0}c[a+16>>2]=n;c[a+12>>2]=n;c[h>>2]=33408;c[h+4>>2]=6;n=Ry(c[a>>2]|0,h)|0;if((n|0)==0){o=0}else{o=((jH(n)|0)/90|0|0)%4|0}n=(o|0)<0?o+4|0:o;c[j>>2]=33416;c[j+4>>2]=8;o=Ry(c[a>>2]|0,j)|0;c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;if((o|0)!=0){CH(k,o);Hla(k);o=k+4|0;if(!(+g[k>>2]>=+g[o>>2])){j=k+8|0;h=k+12|0;if(+g[j>>2]>=+g[h>>2]){p=j;q=h;r=k;s=o;t=12}}else{u=k;v=o;t=10}}else{u=k;v=k+4|0;t=10}if((t|0)==10){p=k+8|0;q=k+12|0;r=u;s=v;t=12}if((t|0)==12){g[r>>2]=0.0;g[s>>2]=612.0;g[p>>2]=0.0;g[q>>2]=792.0}c[l>>2]=33432;c[l+4>>2]=7;q=Ry(c[a>>2]|0,l)|0;if((q|0)==0){w=a+20|0}else{l=a+20|0;CH(m,q);c[l+0>>2]=c[m+0>>2];c[l+4>>2]=c[m+4>>2];c[l+8>>2]=c[m+8>>2];c[l+12>>2]=c[m+12>>2];Hla(l);w=l}if((Ny(w)|0)==0){Ila(w,k)}else{c[w+0>>2]=c[k+0>>2];c[w+4>>2]=c[k+4>>2];c[w+8>>2]=c[k+8>>2];c[w+12>>2]=c[k+12>>2]}x=+g[a+24>>2];y=+g[w>>2];z=x-y;if((n&1|0)==0){g[a+96>>2]=z;A=+g[a+32>>2];B=+g[a+28>>2];g[a+100>>2]=A-B;C=B;D=A}else{g[a+100>>2]=z;z=+g[a+32>>2];A=+g[a+28>>2];g[a+96>>2]=z-A;C=A;D=z}if((n|0)==1){Tla(a+104|0,0.0,-1.0,1.0,0.0,-C,x)}else if((n|0)==2){Tla(a+104|0,-1.0,0.0,0.0,-1.0,x,D)}else if((n|0)==0){Tla(a+104|0,1.0,0.0,0.0,1.0,-y,-C)}else if((n|0)==3){Tla(a+104|0,0.0,1.0,-1.0,0.0,D,-y)}c[a+36>>2]=512;Ky(a);i=e;return}function Ny(a){a=a|0;var b=0,c=0,d=0;b=i;if(+g[a>>2]>=+g[a+4>>2]){c=1;d=c&1;i=b;return d|0}c=+g[a+8>>2]>=+g[a+12>>2];d=c&1;i=b;return d|0}function Oy(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+76|0;if(((c[d>>2]|0)+ -1|0)>>>0<2){i=b;return}e=u2a(68)|0;RF(e);c[a+72>>2]=e;UF(e,a);c[d>>2]=1;i=b;return}function Py(a){a=a|0;var b=0;b=i;Oy(a);Jy(a,0);i=b;return}function Qy(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+128>>2]|0;if((d|0)!=0){e=c[(xt()|0)+8>>2]|0;Ic[c[(c[e>>2]|0)+28>>2]&511](e,d)}yna(a+80|0);Iy(a);i=b;return}function Ry(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+16|0;e=d;f=e+4|0;g=a;a=0;while(1){h=$H(g,b)|0;if((h|0)!=0){j=h;k=5;break}c[e>>2]=38824;c[f>>2]=6;h=g;g=iI(g,e)|0;if((g|0)==0|(g|0)==(h|0)){j=0;k=5;break}a=a+1|0;if((a|0)==1e3){j=0;k=5;break}}if((k|0)==5){i=d;return j|0}return 0}function Sy(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;i=i+16|0;h=g;Hy(a,1);c[a+8>>2]=b;c[a+4>>2]=e;if((e|0)==0){j=0}else{j=c[e+12>>2]|0}c[a>>2]=j;c[h>>2]=669496;c[h+4>>2]=9;e=iI(j,h)|0;h=a+16|0;c[h>>2]=e;c[a+12>>2]=d;if((e|0)!=0){k=a+36|0;c[k>>2]=0;Ky(a);i=g;return}c[h>>2]=(f|0)==0?d:f;k=a+36|0;c[k>>2]=0;Ky(a);i=g;return}function Ty(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0;h=i;j=a+76|0;if(((c[j>>2]|0)+ -1|0)>>>0<2){i=h;return}k=u2a(68)|0;RF(k);c[a+72>>2]=k;VF(k,a,b,d,e,f,g);c[j>>2]=1;i=h;return}function Uy(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0;g=i;Ty(a,b,c,d,e,f);Jy(a,0);i=g;return}function Vy(a,b,d,e,f,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;k=i;i=i+32|0;l=k;m=+g[a+96>>2];if(m==0.0){i=k;return}n=+g[a+100>>2];if(n==0.0){i=k;return}g[l+12>>2]=1.0;g[l>>2]=1.0;g[l+20>>2]=0.0;g[l+16>>2]=0.0;g[l+8>>2]=0.0;g[l+4>>2]=0.0;o=(j|0)%4|0;if((o|0)==0){j=h+e|0;p=d;q=d;r=f+d|0;s=j;t=e;u=j}else if((o|0)==1){p=d;q=f+d|0;r=d;s=e;t=e;u=h+e|0}else if((o|0)==3){j=f+d|0;v=h+e|0;p=j;q=d;r=j;s=v;t=v;u=e}else if((o|0)==2){o=f+d|0;p=o;q=o;r=d;s=e;t=h+e|0;u=e}else{p=0;q=0;r=0;s=0;t=0;u=0}Tla(l,+(r-p|0)/m,+(u-s|0)/m,+(q-p|0)/n,+(t-s|0)/n,+(p|0),+(s|0));s=a+104|0;c[b+0>>2]=c[s+0>>2];c[b+4>>2]=c[s+4>>2];c[b+8>>2]=c[s+8>>2];c[b+12>>2]=c[s+12>>2];c[b+16>>2]=c[s+16>>2];c[b+20>>2]=c[s+20>>2];Wla(b,l);i=k;return}function Wy(a){a=a|0;c[a>>2]=0;c[a+4>>2]=1;c[a+8>>2]=1;c[a+12>>2]=0;return}function Xy(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[b>>2]|0;if((e|0)!=0){f=e+52|0;c[f>>2]=(c[f>>2]|0)+1}f=c[a>>2]|0;if((f|0)!=0?(e=f+52|0,c[e>>2]=(c[e>>2]|0)+ -1,e=c[a>>2]|0,!((c[e+52>>2]|0)>0|(e|0)==0)):0){LC(c[e>>2]|0);v2a(e)}c[a>>2]=c[b>>2];i=d;return}function Yy(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[b>>2]|0;if((e|0)!=0){f=e+20|0;c[f>>2]=(c[f>>2]|0)+1}f=c[a>>2]|0;if((f|0)!=0?(e=f+20|0,c[e>>2]=(c[e>>2]|0)+ -1,e=c[a>>2]|0,!((c[e+20>>2]|0)>0|(e|0)==0)):0){uC(e);v2a(e)}c[a>>2]=c[b>>2];i=d;return}function Zy(a,b){a=a|0;b=b|0;var d=0;d=i;c[a>>2]=b;if((b|0)==0){i=d;return}a=b+12|0;c[a>>2]=(c[a>>2]|0)+1;i=d;return}function _y(a){a=a|0;var b=0,d=0;b=i;d=a+8|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[a+48>>2]=0;c[a>>2]=33376;g[a+68>>2]=1.0;g[a+56>>2]=1.0;g[a+76>>2]=0.0;g[a+72>>2]=0.0;g[a+64>>2]=0.0;g[a+60>>2]=0.0;c[a+28>>2]=5;c[a+52>>2]=0;i=b;return}function $y(a,b,c,d,e,f,h){a=+a;b=+b;c=+c;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0.0;j=i;g[d>>2]=1.0-a;g[e>>2]=1.0-b;g[f>>2]=1.0-c;c=+g[d>>2];g[h>>2]=c;b=+g[e>>2];if(b<c){g[h>>2]=b;k=b}else{k=c}c=+g[f>>2];if(!(c<k)){i=j;return}g[h>>2]=c;i=j;return}function az(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;c[a+16>>2]=0;c[a+20>>2]=0;c[a+4>>2]=0;c[a>>2]=33448;c[a+8>>2]=b;if((b|0)==2){c[a+12>>2]=3;i=d;return}e=a+12|0;if((b|0)==1){c[e>>2]=1;i=d;return}else{c[e>>2]=4;i=d;return}}function bz(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0.0,l=0,m=0.0;h=i;j=c[a+8>>2]|0;if((j|0)==2){k=+g[b>>2];g[d>>2]=k;if(!(k<0.0)){if(k>1.0){g[d>>2]=1.0}}else{g[d>>2]=0.0}k=+g[b+4>>2];g[e>>2]=k;if(!(k<0.0)){if(k>1.0){g[e>>2]=1.0}}else{g[e>>2]=0.0}k=+g[b+8>>2];g[f>>2]=k;if(k<0.0){g[f>>2]=0.0;l=1;i=h;return l|0}if(!(k>1.0)){l=1;i=h;return l|0}g[f>>2]=1.0;l=1;i=h;return l|0}else if((j|0)==1){k=+g[b>>2];g[d>>2]=k;if(!(k<0.0)){if(k>1.0){g[d>>2]=1.0;m=1.0}else{m=k}}else{g[d>>2]=0.0;m=0.0}g[f>>2]=m;g[e>>2]=m;l=1;i=h;return l|0}else if((j|0)==3){if((c[a+20>>2]|0)==0){eX(+g[b>>2],+g[b+4>>2],+g[b+8>>2],+g[b+12>>2],d,e,f);l=1;i=h;return l|0}else{m=+g[b+12>>2];k=m+ +g[b>>2];g[d>>2]=1.0-(k>1.0?1.0:k);k=m+ +g[b+4>>2];g[e>>2]=1.0-(k>1.0?1.0:k);k=m+ +g[b+8>>2];g[f>>2]=1.0-(k>1.0?1.0:k);l=1;i=h;return l|0}}else{g[f>>2]=0.0;g[e>>2]=0.0;g[d>>2]=0.0;l=0;i=h;return l|0}return 0}function cz(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0;j=i;if((c[a+8>>2]|0)!=3){k=0;i=j;return k|0}g[d>>2]=+g[b>>2];g[e>>2]=+g[b+4>>2];g[f>>2]=+g[b+8>>2];g[h>>2]=+g[b+12>>2];k=1;i=j;return k|0}function dz(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=+e;f=+f;var h=0,j=0,k=0;h=i;j=c[a+8>>2]|0;if((j|0)==1){if(d==e&d==f){g[b>>2]=d;k=1}else{k=0}}else if((j|0)==3){$y(d,e,f,b,b+4|0,b+8|0,b+12|0);k=1}else if((j|0)==2){g[b>>2]=d;g[b+4>>2]=e;g[b+8>>2]=f;k=1}else{k=0}i=h;return k|0}function ez(a,b,d,e,f,h){a=a|0;b=b|0;d=+d;e=+e;f=+f;h=+h;var j=0,k=0,l=0;j=i;k=c[a+8>>2]|0;if((k|0)==3){g[b>>2]=d;g[b+4>>2]=e;g[b+8>>2]=f;g[b+12>>2]=h;l=1;i=j;return l|0}else if((k|0)==2){eX(d,e,f,h,b,b+4|0,b+8|0);l=1;i=j;return l|0}else{l=0;i=j;return l|0}return 0}function fz(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0;j=i;h=c[b+8>>2]|0;if((k|0)!=0&(h|0)==3){if((g|0)>0){l=f;m=e;n=0}else{i=j;return}while(1){k=(d[l+3>>0]|0)^255;a[m>>0]=((ca((d[l>>0]|0)^255,k)|0)>>>0)/255|0;a[m+1>>0]=((ca((d[l+1>>0]|0)^255,k)|0)>>>0)/255|0;a[m+2>>0]=((ca((d[l+2>>0]|0)^255,k)|0)>>>0)/255|0;n=n+1|0;if((n|0)==(g|0)){break}else{l=l+4|0;m=m+3|0}}i=j;return}if((h|0)==2){gz(e,f,g);i=j;return}else if((h|0)==1){if((g|0)>0){o=e;p=0}else{i=j;return}while(1){h=f+p|0;a[o>>0]=a[h>>0]|0;a[o+1>>0]=a[h>>0]|0;a[o+2>>0]=a[h>>0]|0;p=p+1|0;if((p|0)==(g|0)){break}else{o=o+3|0}}i=j;return}else{if((g|0)<=0){i=j;return}o=b+20|0;b=f;f=e;e=0;while(1){if((c[o>>2]|0)==0){dX(a[b>>0]|0,a[b+1>>0]|0,a[b+2>>0]|0,a[b+3>>0]|0,f+2|0,f+1|0,f)}else{p=d[b+3>>0]|0;h=(d[b>>0]|0)+p|0;a[f+2>>0]=(h|0)>255?0:255-h&255;h=(d[b+1>>0]|0)+p|0;a[f+1>>0]=(h|0)>255?0:255-h&255;h=(d[b+2>>0]|0)+p|0;a[f>>0]=(h|0)>255?0:255-h&255}e=e+1|0;if((e|0)==(g|0)){break}else{b=b+4|0;f=f+3|0}}i=j;return}}function gz(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;f=(d|0)>0;if((b|0)==(c|0)){if(f){g=b;h=0}else{i=e;return}while(1){j=g+2|0;k=a[j>>0]|0;a[j>>0]=a[g>>0]|0;a[g>>0]=k;h=h+1|0;if((h|0)==(d|0)){break}else{g=g+3|0}}i=e;return}else{if(f){l=c;m=b;n=0}else{i=e;return}while(1){a[m>>0]=a[l+2>>0]|0;a[m+1>>0]=a[l+1>>0]|0;a[m+2>>0]=a[l>>0]|0;n=n+1|0;if((n|0)==(d|0)){break}else{l=l+3|0;m=m+3|0}}i=e;return}}function hz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0.0,l=0.0;b=i;i=i+32|0;e=b+16|0;f=b+8|0;h=b;j=KH(d,1)|0;c[e>>2]=33552;c[e+4>>2]=10;d=jI(j,e)|0;if((d|0)==0){g[a+24>>2]=0.0;g[a+28>>2]=0.0;k=0.0}else{g[a+24>>2]=+DH(d,0);g[a+28>>2]=+DH(d,1);k=+DH(d,2)}g[a+32>>2]=k;c[f>>2]=33568;c[f+4>>2]=10;d=jI(j,f)|0;if((d|0)==0){g[a+36>>2]=0.0;g[a+40>>2]=0.0;l=0.0}else{g[a+36>>2]=+DH(d,0);g[a+40>>2]=+DH(d,1);l=+DH(d,2)}g[a+44>>2]=l;c[h>>2]=33584;c[h+4>>2]=5;l=+gI(j,h);g[a+48>>2]=l==0.0?1.0:l;i=b;return 1}function iz(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0.0;f=+g[b>>2];g[e>>2]=f;g[d>>2]=f;g[c>>2]=f;return 1}function jz(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=+d;e=+e;var f=0;if(c==d&c==e){g[b>>2]=c;f=1}else{f=0}return f|0}function kz(b,c,d,e,f,g,h){b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0;h=i;if((e|0)>0){j=c;k=0}else{i=h;return}while(1){c=d+k|0;a[j>>0]=a[c>>0]|0;a[j+1>>0]=a[c>>0]|0;a[j+2>>0]=a[c>>0]|0;k=k+1|0;if((k|0)==(e|0)){break}else{j=j+3|0}}i=h;return}function lz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0.0,m=0.0;b=i;i=i+32|0;e=b+24|0;f=b+16|0;h=b+8|0;j=b;k=KH(d,1)|0;c[e>>2]=33552;c[e+4>>2]=10;d=jI(k,e)|0;if((d|0)==0){g[a+24>>2]=0.0;g[a+28>>2]=0.0;l=0.0}else{g[a+24>>2]=+DH(d,0);g[a+28>>2]=+DH(d,1);l=+DH(d,2)}g[a+32>>2]=l;c[f>>2]=33568;c[f+4>>2]=10;d=jI(k,f)|0;if((d|0)==0){g[a+36>>2]=0.0;g[a+40>>2]=0.0;m=0.0}else{g[a+36>>2]=+DH(d,0);g[a+40>>2]=+DH(d,1);m=+DH(d,2)}g[a+44>>2]=m;c[h>>2]=33584;c[h+4>>2]=5;d=jI(k,h)|0;h=a+96|0;if((d|0)==0){c[h>>2]=0}else{c[h>>2]=1;g[a+48>>2]=+DH(d,0);g[a+52>>2]=+DH(d,1);g[a+56>>2]=+DH(d,2)}c[j>>2]=1293304;c[j+4>>2]=6;d=jI(k,j)|0;j=a+100|0;if((d|0)==0){c[j>>2]=0;i=b;return 1}c[j>>2]=1;j=0;do{g[a+(j<<2)+60>>2]=+DH(d,j);j=j+1|0}while((j|0)!=9);i=b;return 1}function mz(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0;h=i;j=+g[b>>2];k=+g[b+4>>2];l=+g[b+8>>2];if((c[a+96>>2]|0)==0){m=j;n=k;o=l}else{p=+T(+j,+(+g[a+48>>2]));j=+T(+k,+(+g[a+52>>2]));m=p;n=j;o=+T(+l,+(+g[a+56>>2]))}if((c[a+100>>2]|0)==0){q=m;r=n;s=o;nz(q,r,s,d,e,f);i=h;return 1}q=m*+g[a+60>>2]+n*+g[a+72>>2]+o*+g[a+84>>2];r=m*+g[a+64>>2]+n*+g[a+76>>2]+o*+g[a+88>>2];s=m*+g[a+68>>2]+n*+g[a+80>>2]+o*+g[a+92>>2];nz(q,r,s,d,e,f);i=h;return 1}function nz(b,c,e,f,h,j){b=+b;c=+c;e=+e;f=f|0;h=h|0;j=j|0;var k=0,l=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0;k=i;l=b*3.240999937057495-c*1.5374000072479248-e*.4986000061035156;m=b*-.9692000150680542+c*1.8760000467300415+e*.041600000113248825;n=b*.05559999868273735-c*.20399999618530273+e*1.0570000410079956;e=l>1.0?1.0:l;l=m>1.0?1.0:m;m=n>1.0?1.0:n;o=e<0.0?0:~~(e*1023.0);p=(o|0)<0?0:o;if((p|0)<192){q=34048+p|0}else{q=34240+(((p|0)/4|0)+ -48)|0}g[f>>2]=+(d[q>>0]|0|0)/255.0;q=l<0.0?0:~~(l*1023.0);f=(q|0)<0?0:q;if((f|0)<192){r=34048+f|0}else{r=34240+(((f|0)/4|0)+ -48)|0}g[h>>2]=+(d[r>>0]|0|0)/255.0;r=m<0.0?0:~~(m*1023.0);h=(r|0)<0?0:r;if((h|0)<192){s=34048+h|0;t=a[s>>0]|0;u=t&255;v=+(u|0);w=v/255.0;g[j>>2]=w;i=k;return}else{s=34240+(((h|0)/4|0)+ -48)|0;t=a[s>>0]|0;u=t&255;v=+(u|0);w=v/255.0;g[j>>2]=w;i=k;return}}function oz(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=+d;e=+e;g[b>>2]=c;g[b+4>>2]=d;g[b+8>>2]=e;return 1}function pz(b,e,f,h,j,k,l){b=b|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;k=i;i=i+32|0;j=k+12|0;m=k+8|0;n=k+4|0;o=k;if(!((l|0)!=0&(h|0)>0)){p=e;q=f;gz(p,q,h);i=k;return}l=j+4|0;r=j+8|0;s=h*3|0;t=e+s|0;u=f;v=e;e=0;while(1){g[j>>2]=+(d[u+2>>0]|0)/255.0;g[l>>2]=+(d[u+1>>0]|0)/255.0;g[r>>2]=+(d[u>>0]|0)/255.0;ed[c[(c[b>>2]|0)+4>>2]&127](b,j,m,n,o)|0;a[v>>0]=Fla(+g[o>>2]*255.0)|0;a[v+1>>0]=Fla(+g[n>>2]*255.0)|0;a[v+2>>0]=Fla(+g[m>>2]*255.0)|0;e=e+1|0;if((e|0)==(h|0)){break}else{u=u+3|0;v=v+3|0}}p=t;q=f+s|0;gz(p,q,h);i=k;return}function qz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0.0,l=0.0,m=0.0;b=i;i=i+32|0;e=b+16|0;f=b+8|0;h=b;j=KH(d,1)|0;c[e>>2]=33552;c[e+4>>2]=10;d=jI(j,e)|0;if((d|0)==0){g[a+24>>2]=0.0;g[a+28>>2]=0.0;k=0.0}else{g[a+24>>2]=+DH(d,0);g[a+28>>2]=+DH(d,1);k=+DH(d,2)}g[a+32>>2]=k;c[f>>2]=33568;c[f+4>>2]=10;d=jI(j,f)|0;if((d|0)==0){g[a+36>>2]=0.0;g[a+40>>2]=0.0;l=0.0}else{g[a+36>>2]=+DH(d,0);g[a+40>>2]=+DH(d,1);l=+DH(d,2)}g[a+44>>2]=l;c[h>>2]=35240;c[h+4>>2]=5;d=jI(j,h)|0;h=(d|0)==0;j=0;do{if(h){m=+g[33648+(j<<2)>>2]}else{m=+DH(d,j)}g[a+(j<<2)+48>>2]=m;j=j+1|0}while((j|0)!=4);i=b;return 1}function rz(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,h=0,j=0.0,k=0.0,l=0.0;f=i;g[c>>2]=0.0;if((b|0)==0){g[d>>2]=0.0;g[e>>2]=100.0;i=f;return}h=b<<1;g[d>>2]=+g[a+(h+ -2<<2)+48>>2];j=+g[a+(h+ -1<<2)+48>>2];g[e>>2]=j;k=+g[c>>2];l=+g[d>>2];if(k<l){g[c>>2]=l;i=f;return}if(!(k>j)){i=f;return}g[c>>2]=j;i=f;return}function sz(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0.0,h=0.0,j=0.0,k=0.0,l=0.0,m=0.0;a=i;f=(+g[b>>2]+16.0)/116.0;h=f+ +g[b+4>>2]/500.0;j=f- +g[b+8>>2]/200.0;if(h<.2069000005722046){k=(h+-.1378999948501587)*.12289793789386749}else{k=h*h*h*.9570000171661377}if(f<.2069000005722046){l=(f+-.1378999948501587)*.12841999530792236}else{l=f*f*f}if(j<.2069000005722046){m=(j+-.1378999948501587)*.13983653485774994;nz(k,l,m,c,d,e);i=a;return 1}else{m=j*j*j*1.0888999700546265;nz(k,l,m,c,d,e);i=a;return 1}return 0}function tz(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=+d;e=+e;return 0}function uz(b,e,f,h,j,k,l){b=b|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0;l=i;i=i+32|0;k=l+12|0;j=l+8|0;m=l+4|0;n=l;if((h|0)<=0){i=l;return}o=k+4|0;p=k+8|0;q=f;f=e;e=0;while(1){g[k>>2]=+((d[q>>0]|0)*100|0)/255.0;g[o>>2]=+((d[q+1>>0]|0)+ -128|0);g[p>>2]=+((d[q+2>>0]|0)+ -128|0);ed[c[(c[b>>2]|0)+4>>2]&127](b,k,j,m,n)|0;a[f>>0]=~~(+g[n>>2]*255.0);a[f+1>>0]=~~(+g[m>>2]*255.0);a[f+2>>0]=~~(+g[j>>2]*255.0);e=e+1|0;if((e|0)==(h|0)){break}else{q=q+3|0;f=f+3|0}}i=l;return}function vz(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;if((e|0)==3&(d|0)==3144){g=(Q2a(b+400|0,33664,17)|0)==0;c[a>>2]=g&1;h=a+4|0;c[h>>2]=0;if(g){i=f;return}else{j=h}}else{c[a>>2]=0;h=a+4|0;c[h>>2]=0;j=h}if((It(c[(xt()|0)+4>>2]|0)|0)==0){i=f;return}h=It(c[(xt()|0)+4>>2]|0)|0;c[j>>2]=Wc[c[(c[h>>2]|0)+20>>2]&31](h,b,d,e,0,0)|0;i=f;return}function wz(a){a=a|0;var b=0,d=0;b=i;if((a|0)==0){i=b;return}d=It(c[(xt()|0)+4>>2]|0)|0;Ic[c[(c[d>>2]|0)+28>>2]&511](d,a);i=b;return}function xz(a){a=a|0;c[a+16>>2]=0;c[a+20>>2]=0;c[a+4>>2]=0;c[a>>2]=33696;c[a+32>>2]=0;c[a+28>>2]=0;c[a+8>>2]=7;c[a+36>>2]=0;c[a+24>>2]=0;c[a+40>>2]=0;return}function yz(a){a=a|0;var b=0;b=i;zz(a);v2a(a);i=b;return}function zz(a){a=a|0;var b=0,d=0,e=0;b=i;c[a>>2]=33696;v2a(c[a+36>>2]|0);d=c[a+24>>2]|0;if((d|0)!=0){v2a(d)}d=c[a+32>>2]|0;if((d|0)!=0?(c[a+40>>2]|0)!=0:0){Az(d)}d=a+28|0;if((c[d>>2]|0)==0){i=b;return}e=c[a+4>>2]|0;if((e|0)==0){i=b;return}a=IG(e)|0;vB(a,c[d>>2]|0);i=b;return}function Az(a){a=a|0;var b=0;b=i;if((Dz(2)|0)==(a|0)){i=b;return}if((Dz(1)|0)==(a|0)){i=b;return}if((Dz(3)|0)==(a|0)){i=b;return}if((Dz(11)|0)==(a|0)|(a|0)==0){i=b;return}Rc[c[(c[a>>2]|0)+28>>2]&1023](a);i=b;return}function Bz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0;e=i;i=i+32|0;f=e+16|0;h=e+8|0;j=e;k=LH(d)|0;if((k|0)==0){l=0;i=e;return l|0}d=c[k+12>>2]|0;if((d|0)==0){c[a+12>>2]=0;l=0;i=e;return l|0}c[f>>2]=1274672;c[f+4>>2]=1;m=eI(d,f)|0;f=a+12|0;c[f>>2]=m;if((m+ -1|0)>>>0>65535){l=0;i=e;return l|0}c[h>>2]=35240;c[h+4>>2]=5;m=jI(d,h)|0;h=c[f>>2]|0;n=a+24|0;c[n>>2]=w2a(h<<1,4)|0;if((h|0)>0){o=(m|0)==0;p=0;do{do{if(o){q=(c[n>>2]|0)+(p<<2)|0;if((p&1|0)==0){g[q>>2]=0.0;break}else{g[q>>2]=1.0;break}}else{r=+DH(m,p);g[(c[n>>2]|0)+(p<<2)>>2]=r}}while(0);p=p+1|0;q=c[f>>2]|0}while((p|0)<(q<<1|0));s=q}else{s=h}h=ZA(b,k,s)|0;c[a+28>>2]=h;if((h|0)==0){l=0;i=e;return l|0}if((c[h+4>>2]|0)!=0){l=1;i=e;return l|0}c[j>>2]=33744;c[j+4>>2]=9;h=$H(d,j)|0;do{if((h|0)!=0?(j=Cz(b,h)|0,(j|0)!=0):0){if((c[j+12>>2]|0)>(c[f>>2]|0)){Az(j);break}else{c[a+32>>2]=j;c[a+40>>2]=1;break}}}while(0);h=a+32|0;if((c[h>>2]|0)!=0){l=1;i=e;return l|0}a=c[f>>2]|0;if((a|0)==3){c[h>>2]=Dz(2)|0;l=1;i=e;return l|0}else if((a|0)==4){c[h>>2]=Dz(3)|0;l=1;i=e;return l|0}else{c[h>>2]=Dz(1)|0;l=1;i=e;return l|0}return 0}function Cz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=i;i=i+32|0;e=d+16|0;f=d+12|0;g=d+8|0;h=d+4|0;j=d;if((b|0)==0){k=0;i=d;return k|0}l=c[b>>2]|0;if((l|0)==7){m=c[b+12>>2]|0;if((m|0)==0){k=0;i=d;return k|0}n=YH(m)|0;c[f>>2]=n;if((n|0)==0){k=0;i=d;return k|0}n=0;while(1){c[g>>2]=0;o=ZH(m,f,g)|0;if((o|0)!=0?(c[o>>2]|0)==4:0){dH(h,o);o=dA(c[h>>2]|0)|0;dka(h);p=(o|0)==0;q=p?n:o;dka(g);if(p){r=q}else{k=q;s=27;break}}else{dka(g);r=n}if((c[f>>2]|0)==0){k=0;s=27;break}else{n=r}}if((s|0)==27){i=d;return k|0}}else if((l|0)==4){dH(e,b);s=dA(c[e>>2]|0)|0;dka(e);k=s;i=d;return k|0}else if((l|0)==5){l=b+16|0;if((c[l>>2]|0)==0){k=0;i=d;return k|0}dH(j,GH(b,0)|0);do{if((c[l>>2]|0)!=1){s=_ka(j)|0;if((s|0)==1229144898){e=u2a(44)|0;xz(e);t=e}else if((s|0)==1224736768|(s|0)==1231971429){e=u2a(44)|0;Kz(e);t=e}else if((s|0)==1348564084){e=u2a(28)|0;c[e+16>>2]=0;c[e+20>>2]=0;c[e+4>>2]=0;c[e>>2]=33824;c[e+8>>2]=11;c[e+24>>2]=0;c[e+12>>2]=1;t=e}else if((s|0)==1130458183){e=u2a(52)|0;c[e+16>>2]=0;c[e+20>>2]=0;c[e+4>>2]=0;c[e>>2]=33504;c[e+8>>2]=4;c[e+12>>2]=1;t=e}else if((s|0)==1130458194){e=u2a(104)|0;c[e+16>>2]=0;c[e+20>>2]=0;c[e+4>>2]=0;c[e>>2]=33600;c[e+8>>2]=5;c[e+12>>2]=3;t=e}else if((s|0)==1147500137){e=u2a(32)|0;c[e+16>>2]=0;c[e+20>>2]=0;c[e+4>>2]=0;c[e>>2]=33944;c[e+8>>2]=9;c[e+24>>2]=0;c[e+28>>2]=0;t=e}else if((s|0)==1399156833){e=u2a(36)|0;c[e+16>>2]=0;c[e+20>>2]=0;c[e+4>>2]=0;c[e>>2]=33880;c[e+8>>2]=8;c[e+24>>2]=0;c[e+28>>2]=0;c[e+12>>2]=1;t=e}else if((s|0)==1281450496){s=u2a(64)|0;c[s+16>>2]=0;c[s+20>>2]=0;c[s+4>>2]=0;c[s>>2]=34e3;c[s+8>>2]=6;c[s+12>>2]=3;t=s}else{u=0;break}c[t+4>>2]=a;c[t+16>>2]=b;if((Qc[c[(c[t>>2]|0)+32>>2]&255](t,a,b)|0)==0){Az(t);u=0}else{u=t}}else{u=dA(c[j>>2]|0)|0}}while(0);dka(j);k=u;i=d;return k|0}else{k=0;i=d;return k|0}return 0}function Dz(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[(xt()|0)+12>>2]|0;e=dd[c[(c[d>>2]|0)+32>>2]&511](d,a)|0;i=b;return e|0}function Ez(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0;h=i;i=i+16|0;j=h;k=a+28|0;l=c[k>>2]|0;if((l|0)!=0?(c[l>>2]|0)!=0:0){g[d>>2]=+g[b>>2];g[e>>2]=+g[b+4>>2];g[f>>2]=+g[b+8>>2];i=h;return 1}m=It(c[(xt()|0)+4>>2]|0)|0;if(!((c[l+4>>2]|0)==0|(m|0)==0)){Ic[c[(c[m>>2]|0)+40>>2]&511](m,c[a+12>>2]|0);pd[c[(c[m>>2]|0)+32>>2]&127](m,c[(c[k>>2]|0)+4>>2]|0,b,j);g[d>>2]=+g[j>>2];g[e>>2]=+g[j+4>>2];g[f>>2]=+g[j+8>>2];i=h;return 1}j=c[a+32>>2]|0;if((j|0)==0){g[f>>2]=0.0;g[e>>2]=0.0;g[d>>2]=0.0;i=h;return 1}else{ed[c[(c[j>>2]|0)+4>>2]&127](j,b,d,e,f)|0;i=h;return 1}return 0}function Fz(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0;j=i;if((c[a+12>>2]|0)!=4){k=0;i=j;return k|0}g[d>>2]=+g[b>>2];g[e>>2]=+g[b+4>>2];g[f>>2]=+g[b+8>>2];g[h>>2]=+g[b+12>>2];k=1;i=j;return k|0}function Gz(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=+d;e=+e;return 0}function Hz(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;Iz(a,b);e=c[a+32>>2]|0;if((e|0)==0){i=d;return}Ic[c[(c[e>>2]|0)+20>>2]&511](e,b);i=d;return}function Iz(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+20|0;a=c[e>>2]|0;if((b|0)==0){if((a|0)!=0){c[e>>2]=a+ -1}}else{c[e>>2]=a+1}i=d;return}function Jz(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;k=i;l=b+28|0;m=c[l>>2]|0;if((c[m>>2]|0)!=0){gz(e,f,g);i=k;return}n=c[m+4>>2]|0;if((n|0)==0){m=c[b+32>>2]|0;if((m|0)==0){i=k;return}ad[c[(c[m>>2]|0)+12>>2]&15](m,e,f,g,h,j,0);i=k;return}m=b+12|0;o=c[m>>2]|0;if((o|0)>0){p=0;q=1;do{q=q*52|0;p=p+1|0}while((p|0)<(o|0));if((o|0)<=3){r=q;s=7}}else{r=1;s=7}if((s|0)==7?(s=r*3|0,(ca(j,h)|0)>=((s|0)/2|0|0)):0){h=b+36|0;if((c[h>>2]|0)==0){c[h>>2]=w2a(s,1)|0;s=w2a(ca(o,r)|0,1)|0;if((r|0)>0){b=(r|0)/52|0;j=o;o=0;q=s;while(1){if((j|0)>0){p=0;t=o;u=b;v=q;while(1){w=v+1|0;a[v>>0]=((t>>>0)/(u>>>0)|0)*5;p=p+1|0;x=c[m>>2]|0;if((p|0)>=(x|0)){y=x;z=w;break}else{t=(t>>>0)%(u>>>0)|0;u=(u>>>0)/52|0;v=w}}}else{y=j;z=q}o=o+1|0;if((o|0)==(r|0)){break}else{j=y;q=z}}}z=It(c[(xt()|0)+4>>2]|0)|0;Fc[c[(c[z>>2]|0)+36>>2]&63](z,c[(c[l>>2]|0)+4>>2]|0,c[h>>2]|0,s,r);v2a(s)}if((g|0)>0){A=f;B=e;C=1}else{i=k;return}while(1){s=c[m>>2]|0;if((s|0)>0){r=(s|0)>1?s:1;l=A;z=0;q=0;while(1){q=(((d[l>>0]|0)/5|0)&255)+(q*52|0)|0;z=z+1|0;if((z|0)>=(s|0)){break}else{l=l+1|0}}D=A+r|0;E=q*3|0}else{D=A;E=0}a[B>>0]=a[(c[h>>2]|0)+E>>0]|0;a[B+1>>0]=a[(c[h>>2]|0)+(E+1)>>0]|0;a[B+2>>0]=a[(c[h>>2]|0)+(E+2)>>0]|0;if((C|0)==(g|0)){break}A=D;B=B+3|0;C=C+1|0}i=k;return}C=It(c[(xt()|0)+4>>2]|0)|0;Fc[c[(c[C>>2]|0)+36>>2]&63](C,n,e,f,g);i=k;return}function Kz(a){a=a|0;c[a+16>>2]=0;c[a+20>>2]=0;c[a+4>>2]=0;c[a>>2]=33768;c[a+36>>2]=0;c[a+24>>2]=0;c[a+8>>2]=10;c[a+12>>2]=1;c[a+40>>2]=0;return}function Lz(a){a=a|0;var b=0;b=i;Mz(a);v2a(a);i=b;return}function Mz(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;c[a>>2]=33768;d=c[a+40>>2]|0;if((d|0)!=0){v2a(d)}d=c[a+24>>2]|0;if((d|0)!=0?(e=c[a+4>>2]|0,(e|0)!=0):0){f=IG(e)|0;bB(f,c[d+16>>2]|0)}dka(a+36|0);i=b;return}function Nz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;e=i;i=i+48|0;f=e+36|0;h=e+8|0;j=e;if((c[d+16>>2]|0)>>>0<4){k=0;i=e;return k|0}l=GH(d,1)|0;if((l|0)==(c[a+16>>2]|0)){k=0;i=e;return k|0}m=WA(IG(b)|0,l,0)|0;l=a+24|0;c[l>>2]=m;if((m|0)==0){k=0;i=e;return k|0}b=c[m+12>>2]|0;n=a+28|0;c[n>>2]=b;o=w2a(b<<1,4)|0;p=a+40|0;c[p>>2]=o;a:do{if((b|0)>0){q=m;r=o;s=0;while(1){t=s<<1;u=t|1;Fc[c[c[q>>2]>>2]&63](q,s,f,r+(t<<2)|0,r+(u<<2)|0);v=c[p>>2]|0;w=v+(u<<2)|0;g[w>>2]=+g[w>>2]- +g[v+(t<<2)>>2];t=s+1|0;if((t|0)>=(c[n>>2]|0)){break a}q=c[l>>2]|0;r=c[p>>2]|0;s=t}}}while(0);c[a+32>>2]=JH(d,2)|0;p=GH(d,3)|0;if((p|0)==0){k=0;i=e;return k|0}d=c[p>>2]|0;if((d|0)==3){ika(a+36|0,p+12|0);k=1;i=e;return k|0}else if((d|0)==7){EI(h);rH(h,p,0,0,0);p=vH(h)|0;d=sH(h)|0;c[j>>2]=p;c[j+4>>2]=d;kka(a+36|0,j);FI(h);k=1;i=e;return k|0}else{k=1;i=e;return k|0}return 0}function Oz(a,b,e,f,h){a=a|0;b=b|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;j=i;i=i+80|0;k=j;l=~~+g[b>>2];if((l|0)<0){m=0;i=j;return m|0}if((l|0)>(c[a+32>>2]|0)){m=0;i=j;return m|0}b=a+28|0;n=c[b>>2]|0;do{if((n|0)==0){o=a+36|0}else{if((l|0)!=2147483647?(l|0)<(2147483647/(n|0)|0|0):0){p=ca(n,l+1|0)|0;q=a+36|0;r=c[q>>2]|0;if((r|0)==0){s=0}else{s=c[r+4>>2]|0}if((p|0)<=(s|0)){o=q;break}}g[h>>2]=0.0;g[f>>2]=0.0;g[e>>2]=0.0;m=0;i=j;return m|0}}while(0);KA(k,n);n=k+64|0;s=c[n>>2]|0;q=(s|0)==0?k:s;s=c[o>>2]|0;o=(s|0)==0?0:s+12|0;s=c[b>>2]|0;if((s|0)>0){k=a+40|0;p=s;s=0;do{r=s<<1;t=c[k>>2]|0;g[q+(s<<2)>>2]=+g[t+(r<<2)>>2]+ +g[t+((r|1)<<2)>>2]*+(d[o+((ca(p,l)|0)+s)>>0]|0|0)/255.0;s=s+1|0;p=c[b>>2]|0}while((s|0)<(p|0))}p=c[a+24>>2]|0;ed[c[(c[p>>2]|0)+4>>2]&127](p,q,e,f,h)|0;JA(c[n>>2]|0);m=1;i=j;return m|0}function Pz(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;Iz(a,b);e=c[a+24>>2]|0;if((e|0)==0){i=d;return}Ic[c[(c[e>>2]|0)+20>>2]&511](e,b);i=d;return}function Qz(a){a=a|0;c[a+16>>2]=0;c[a+20>>2]=0;c[a+4>>2]=0;c[a>>2]=33824;c[a+8>>2]=11;c[a+24>>2]=0;c[a+12>>2]=1;return}function Rz(a){a=a|0;var b=0;b=i;Sz(a);v2a(a);i=b;return}function Sz(a){a=a|0;var b=0,d=0,e=0;b=i;c[a>>2]=33824;d=c[a+24>>2]|0;if((d|0)==0){i=b;return}e=c[a+4>>2]|0;if((e|0)==0){i=b;return}a=IG(e)|0;bB(a,c[d+16>>2]|0);i=b;return}function Tz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=GH(d,1)|0;if((f|0)==(c[a+16>>2]|0)){g=0;i=e;return g|0}d=WA(IG(b)|0,f,0)|0;c[a+24>>2]=d;if((d|0)!=0){f=d+12|0;c[a+12>>2]=(c[f>>2]|0)+1;if((c[f>>2]|0)>16){g=0;i=e;return g|0}}else{c[a+12>>2]=1}g=1;i=e;return g|0}function Uz(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0;h=i;j=c[a+24>>2]|0;if((j|0)==0){g[f>>2]=.75;g[e>>2]=.75;g[d>>2]=.75;k=0;i=h;return k|0}else{ed[c[(c[j>>2]|0)+4>>2]&127](j,b+8|0,d,e,f)|0;k=1;i=h;return k|0}return 0}function Vz(a){a=a|0;var b=0;b=i;Wz(a);v2a(a);i=b;return}function Wz(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=33880;d=c[a+24>>2]|0;if((d|0)!=0){Az(d)}d=c[a+28>>2]|0;if((d|0)==0){i=b;return}Rc[c[(c[d>>2]|0)+4>>2]&1023](d);i=b;return}function Xz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+16|0;f=e+8|0;g=e;HH(f,d,1);c[g>>2]=33928;c[g+4>>2]=4;h=a+32|0;if(!(vka(c[f>>2]|0,g)|0)){c[h>>2]=2;g=GH(d,2)|0;if((g|0)!=(c[a+16>>2]|0)){j=a+24|0;c[j>>2]=Cz(b,g)|0;g=GH(d,3)|0;if((g|0)!=0?(c[g>>2]|0)!=4:0){c[a+28>>2]=eC(g)|0}g=a+28|0;a=c[g>>2]|0;if(((a|0)!=0?(d=c[j>>2]|0,(d|0)!=0):0)?(c[a+8>>2]|0)<(c[d+12>>2]|0):0){Rc[c[(c[a>>2]|0)+4>>2]&1023](a);c[g>>2]=0;k=1}else{k=1}}else{k=0}}else{c[h>>2]=0;k=1}dka(f);i=e;return k|0}function Yz(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;h=i;i=i+80|0;j=h+4|0;k=h;if((c[a+32>>2]|0)==0){l=0;i=h;return l|0}m=a+28|0;n=c[m>>2]|0;if((n|0)==0){o=a+24|0;p=c[o>>2]|0;if((p|0)==0){l=0;i=h;return l|0}q=c[p+12>>2]|0;KA(j,q);p=j+64|0;if((q|0)>0){r=0;do{s=c[p>>2]|0;g[((s|0)==0?j:s)+(r<<2)>>2]=+g[b>>2];r=r+1|0}while((r|0)!=(q|0))}q=c[o>>2]|0;o=c[p>>2]|0;ed[c[(c[q>>2]|0)+4>>2]&127](q,(o|0)==0?j:o,d,e,f)|0;JA(c[p>>2]|0);l=1;i=h;return l|0}else{KA(j,c[n+8>>2]|0);c[k>>2]=0;n=j+64|0;p=c[n>>2]|0;gC(c[m>>2]|0,b,1,(p|0)==0?j:p,k)|0;do{if((c[k>>2]|0)!=0){p=c[a+24>>2]|0;if((p|0)==0){g[f>>2]=0.0;g[e>>2]=0.0;g[d>>2]=0.0;t=0;break}else{b=c[n>>2]|0;ed[c[(c[p>>2]|0)+4>>2]&127](p,(b|0)==0?j:b,d,e,f)|0;t=1;break}}else{t=0}}while(0);JA(c[n>>2]|0);l=t;i=h;return l|0}return 0}function Zz(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;Iz(a,b);e=c[a+24>>2]|0;if((e|0)==0){i=d;return}Ic[c[(c[e>>2]|0)+20>>2]&511](e,b);i=d;return}function _z(a){a=a|0;var b=0;b=i;$z(a);v2a(a);i=b;return}function $z(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=33944;d=c[a+28>>2]|0;if((d|0)!=0){Rc[c[(c[d>>2]|0)+4>>2]&1023](d)}d=c[a+24>>2]|0;if((d|0)==0){i=b;return}Az(d);i=b;return}function aA(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=GH(d,1)|0;if((f|0)==0){g=0;i=e;return g|0}if((c[f>>2]|0)!=5){g=0;i=e;return g|0}c[a+12>>2]=c[f+16>>2];f=GH(d,2)|0;if((f|0)==0){g=0;i=e;return g|0}if((f|0)==(c[a+16>>2]|0)){g=0;i=e;return g|0}h=a+24|0;c[h>>2]=Cz(b,f)|0;f=eC(GH(d,3)|0)|0;c[a+28>>2]=f;a=c[h>>2]|0;if((a|0)==0|(f|0)==0){g=0;i=e;return g|0}g=(c[f+8>>2]|0)>=(c[a+12>>2]|0)&1;i=e;return g|0}function bA(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;g=i;i=i+80|0;h=g+4|0;j=g;k=a+28|0;l=c[k>>2]|0;if((l|0)==0){m=0;i=g;return m|0}KA(h,c[l+8>>2]|0);c[j>>2]=0;l=h+64|0;n=c[l>>2]|0;gC(c[k>>2]|0,b,c[a+12>>2]|0,(n|0)==0?h:n,j)|0;if((c[j>>2]|0)==0){o=0}else{j=c[a+24>>2]|0;a=c[l>>2]|0;ed[c[(c[j>>2]|0)+4>>2]&127](j,(a|0)==0?h:a,d,e,f)|0;o=1}JA(c[l>>2]|0);m=o;i=g;return m|0}function cA(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;Iz(a,b);e=c[a+24>>2]|0;if((e|0)==0){i=d;return}Ic[c[(c[e>>2]|0)+20>>2]&511](e,b);i=d;return}function dA(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;i=i+64|0;d=b+48|0;e=b+40|0;f=b+32|0;g=b+24|0;h=b+16|0;j=b+8|0;k=b;c[d>>2]=39880;c[d+4>>2]=9;if(!(vka(a,d)|0)?(c[e>>2]=36992,c[e+4>>2]=3,!(vka(a,e)|0)):0){c[f>>2]=39864;c[f+4>>2]=10;if(!(vka(a,f)|0)?(c[g>>2]=1291944,c[g+4>>2]=1,!(vka(a,g)|0)):0){c[h>>2]=39896;c[h+4>>2]=10;if(!(vka(a,h)|0)?(c[j>>2]=37e3,c[j+4>>2]=4,!(vka(a,j)|0)):0){c[k>>2]=36976;c[k+4>>2]=7;if(!(vka(a,k)|0)){l=0;i=b;return l|0}l=Dz(11)|0;i=b;return l|0}l=Dz(3)|0;i=b;return l|0}l=Dz(1)|0;i=b;return l|0}l=Dz(2)|0;i=b;return l|0}function eA(a){a=a|0;var b=0,d=0;b=i;if((c[a+8>>2]|0)==11){d=72;i=b;return d|0}d=c[a+12>>2]<<2;i=b;return d|0}function fA(a){a=a|0;var b=0,c=0;b=i;c=w2a(eA(a)|0,1)|0;i=b;return c|0}function gA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;e=d+4|0;f=d;if((b|0)==0){i=d;return}if((c[a+8>>2]|0)==11){i=d;return}g=a+12|0;if((c[g>>2]|0)<=0){i=d;return}h=0;do{Fc[c[c[a>>2]>>2]&63](a,h,b+(h<<2)|0,e,f);h=h+1|0}while((h|0)<(c[g>>2]|0));i=d;return}function hA(b,e,f,h,j,k,l){b=b|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0;l=i;i=i+80|0;k=l+12|0;j=l+8|0;m=l+4|0;n=l;o=b+12|0;KA(k,c[o>>2]|0);p=k+64|0;q=c[p>>2]|0;r=(q|0)==0?k:q;if((h|0)<=0){s=q;JA(s);i=l;return}q=b+8|0;k=f;f=e;e=0;while(1){if((c[o>>2]|0)>0){t=k;u=0;while(1){v=t+1|0;w=+(d[t>>0]|0);if((c[q>>2]|0)==10){g[r+(u<<2)>>2]=w}else{g[r+(u<<2)>>2]=w/255.0}u=u+1|0;if((u|0)>=(c[o>>2]|0)){x=v;break}else{t=v}}}else{x=k}ed[c[(c[b>>2]|0)+4>>2]&127](b,r,j,m,n)|0;a[f>>0]=~~(+g[n>>2]*255.0);a[f+1>>0]=~~(+g[m>>2]*255.0);a[f+2>>0]=~~(+g[j>>2]*255.0);e=e+1|0;if((e|0)>=(h|0)){break}else{k=x;f=f+3|0}}s=c[p>>2]|0;JA(s);i=l;return}function iA(a){a=a|0;var b=0;b=i;jA(a);kA(a);i=b;return}function jA(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=a+4|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}if(((c[(c[a>>2]|0)+8>>2]|0)==11?(a=c[e>>2]|0,(a|0)!=0):0)?(f=c[a+60>>2]|0,(f|0)!=0):0){g=IG(f)|0;qB(g,c[a+4>>2]|0);h=c[d>>2]|0}else{h=e}v2a(h);c[d>>2]=0;i=b;return}function kA(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;if((d|0)==0){i=b;return}e=c[d+4>>2]|0;if((e|0)==0){i=b;return}if((c[d+16>>2]|0)==0){i=b;return}d=IG(e)|0;bB(d,c[(c[a>>2]|0)+16>>2]|0);c[a>>2]=0;i=b;return}function lA(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((c[a>>2]|0)==(b|0)){e=a+4|0;if((c[e>>2]|0)==0){c[e>>2]=fA(b)|0}kA(a);c[a>>2]=b;i=d;return}else{jA(a);kA(a);c[a>>2]=b;if((b|0)==0){i=d;return}e=fA(b)|0;c[a+4>>2]=e;gA(b,e);i=d;return}}function mA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[a+4>>2]|0;if((e|0)==0){i=d;return}f=c[a>>2]|0;if((c[f+8>>2]|0)==11){i=d;return}c3a(e|0,b|0,c[f+12>>2]<<2|0)|0;i=d;return}function nA(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;if((e|0)>16){i=f;return}g=c[a>>2]|0;if((g|0)!=0?(c[g+8>>2]|0)==11:0){h=c[a+4>>2]|0}else{g=a+4|0;j=c[g>>2]|0;if((j|0)!=0){v2a(j)}j=Dz(11)|0;c[a>>2]=j;a=fA(j)|0;c[g>>2]=a;h=a}a=c[h>>2]|0;if((a|0)!=0?(g=c[a+60>>2]|0,(g|0)!=0):0){a=IG(g)|0;qB(a,c[(c[h>>2]|0)+4>>2]|0)}c[h+4>>2]=e;c[h>>2]=b;if((e|0)==0){i=f;return}c3a(h+8|0,d|0,e<<2|0)|0;i=f;return}function oA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;jA(a);kA(a);e=c[b>>2]|0;c[a>>2]=e;if((e|0)==0){i=d;return}f=c[e+4>>2]|0;if((f|0)!=0?(g=c[e+16>>2]|0,(g|0)!=0):0){h=oB(IG(f)|0,g)|0;c[a>>2]=h;if((h|0)==0){i=d;return}else{j=h}}else{j=e}e=fA(j)|0;c[a+4>>2]=e;j=c[b+4>>2]|0;b=c[a>>2]|0;c3a(e|0,j|0,eA(b)|0)|0;if((c[b+8>>2]|0)!=11){i=d;return}b=c[e>>2]|0;if((b|0)==0){i=d;return}j=c[b+60>>2]|0;if((j|0)==0){i=d;return}b=IG(j)|0;j=c[e>>2]|0;c[e>>2]=YA(b,c[j+4>>2]|0,0,j+36|0)|0;i=d;return}function pA(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;i=i+16|0;h=f+8|0;j=f+4|0;k=f;l=c[a>>2]|0;if((l|0)==0){m=0;i=f;return m|0}n=c[a+4>>2]|0;if((n|0)==0){m=0;i=f;return m|0}g[h>>2]=0.0;g[j>>2]=0.0;g[k>>2]=0.0;if((ed[c[(c[l>>2]|0)+4>>2]&127](l,n,h,j,k)|0)==0){m=0;i=f;return m|0}c[b>>2]=~~(+g[h>>2]*255.0+.5);c[d>>2]=~~(+g[j>>2]*255.0+.5);c[e>>2]=~~(+g[k>>2]*255.0+.5);m=1;i=f;return m|0}function qA(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+4>>2]|0;if((d|0)!=0?(c[(c[a>>2]|0)+8>>2]|0)==11:0){e=c[d>>2]|0}else{e=0}i=b;return e|0}function rA(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g[c>>2]=0.0;g[d>>2]=0.0;g[e>>2]=1.0;return}function sA(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=+d;e=+e;return 0}function tA(a){a=a|0;return 0}function uA(a,b,c){a=a|0;b=b|0;c=c|0;return 1}function vA(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return 0}function wA(a,b,c,d,e,f){a=a|0;b=b|0;c=+c;d=+d;e=+e;f=+f;return 0}function xA(a){a=a|0;return}function yA(a){a=a|0;var b=0;b=i;v2a(a);i=b;return}function zA(a){a=a|0;return}function AA(a){a=a|0;var b=0;b=i;v2a(a);i=b;return}function BA(a){a=a|0;return}function CA(a){a=a|0;var b=0;b=i;v2a(a);i=b;return}function DA(a){a=a|0;return}function EA(a){a=a|0;var b=0;b=i;v2a(a);i=b;return}function FA(a){a=a|0;return c[a+24>>2]|0}function GA(a){a=a|0;return c[a+24>>2]|0}function HA(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g[c>>2]=1.0;g[d>>2]=0.0;g[e>>2]=1.0;return}function IA(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g[c>>2]=1.0;g[d>>2]=0.0;g[e>>2]=1.0;return}function JA(a){a=a|0;var b=0;b=i;if((a|0)!=0){v2a(a)}i=b;return}function KA(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+64|0;c[e>>2]=0;if((b|0)>16){c[e>>2]=w2a(b,4)|0;i=d;return}else{b=a+0|0;a=b+64|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(a|0));i=d;return}}function LA(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;if((b|0)==1){d=a+172|0}else if((b|0)==2){d=a+196|0}else if((b|0)==3){d=a+220|0}else if((b|0)==11){d=a+244|0}else{d=0}i=c;return d|0}function MA(a){a=a|0;var b=0,d=0;b=i;d=a+12|0;a=c[d>>2]|0;if((a|0)!=0){Rc[c[(c[a>>2]|0)+4>>2]&1023](a)}a=u2a(272)|0;IB(a);c[d>>2]=a;i=b;return}function NA(a,b){a=a|0;b=b|0;var c=0;a=i;c=IG(b)|0;if((c|0)==0){i=a;return}dB(c);v2a(c);i=a;return}function OA(a,b){a=a|0;b=b|0;a=i;PA(IG(b)|0,0);i=a;return}function PA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;d=i;i=i+80|0;e=d+68|0;f=d+64|0;g=d+60|0;h=d+56|0;j=d+52|0;k=d+48|0;l=d+44|0;m=d+40|0;n=d+36|0;o=d+32|0;p=d+28|0;q=d+24|0;r=d+20|0;s=d+16|0;t=d+8|0;u=d+4|0;v=d;w=a+52|0;x=(c[a+60>>2]|0)==0;c[e>>2]=x?0:-1;if(!x){x=(b|0)==0;do{eB(w,e,f,g);y=c[g>>2]|0;if(!(x?!((c[y+4>>2]|0)>>>0<2):0)){z=c[y>>2]|0;if((z|0)!=0){Rc[c[(c[z>>2]|0)+4>>2]&1023](z)}c[y>>2]=0}}while((c[e>>2]|0)!=0)}x=a+4|0;g=(c[a+12>>2]|0)==0;c[e>>2]=g?0:-1;if(!g){g=(b|0)==0;do{fB(x,e,h,j);f=c[j>>2]|0;if(!(g?!((c[f+4>>2]|0)>>>0<2):0)){w=c[f>>2]|0;if((w|0)!=0){Rc[c[(c[w>>2]|0)+4>>2]&1023](w)}c[f>>2]=0}}while((c[e>>2]|0)!=0)}g=a+76|0;j=(c[a+84>>2]|0)==0;c[e>>2]=j?0:-1;if(!j){j=(b|0)==0;do{gB(g,e,k,l);h=c[l>>2]|0;if(!(j?!((c[h+4>>2]|0)>>>0<2):0)){x=c[h>>2]|0;if((x|0)!=0){tD(x);v2a(x)}if((h|0)!=0){v2a(h)}Jma(g,c[k>>2]|0)}}while((c[e>>2]|0)!=0)}k=a+28|0;g=(c[a+36>>2]|0)==0;c[e>>2]=g?0:-1;if(!g){g=(b|0)==0;do{hB(k,e,m,n);j=c[n>>2]|0;if(!(g?!((c[j+4>>2]|0)>>>0<2):0)){Az(c[j>>2]|0);c[j>>2]=0}}while((c[e>>2]|0)!=0)}g=a+100|0;n=(c[a+108>>2]|0)==0;c[e>>2]=n?0:-1;if(!n){n=(b|0)==0;m=a+124|0;k=a+132|0;do{iB(g,e,o,p);if(!(n?!((c[(c[p>>2]|0)+4>>2]|0)>>>0<2):0)){j=(c[k>>2]|0)==0;c[q>>2]=j?0:-1;a:do{if(!j){l=c[o>>2]|0;while(1){c[r>>2]=0;c[s>>2]=0;Oma(m,q,r,s);if((l|0)==(c[s>>2]|0)){break}dka(r);if((c[q>>2]|0)==0){break a}}oe(t,r);Xma(m,t);dka(r)}}while(0);j=c[p>>2]|0;l=c[j>>2]|0;if((l|0)!=0){wz(c[l+4>>2]|0);v2a(l)}if((j|0)!=0){v2a(j)}Jma(g,c[o>>2]|0)}}while((c[e>>2]|0)!=0)}o=a+148|0;g=(c[a+156>>2]|0)==0;c[e>>2]=g?0:-1;if(g){i=d;return}g=(b|0)==0;do{jB(o,e,u,v);b=c[v>>2]|0;if(!(g?!((c[b+4>>2]|0)>>>0<2):0)){a=c[b>>2]|0;if((a|0)!=0){FI(a);v2a(a)}if((b|0)!=0){v2a(b)}Jma(o,c[u>>2]|0)}}while((c[e>>2]|0)!=0);i=d;return}function QA(a){a=a|0;var b=0;b=i;ew(a+32|0);i=b;return}function RA(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;if((b|0)==0){d=0;i=c;return d|0}d=SA(IG(a)|0,b)|0;i=c;return d|0}function SA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+16|0;e=d;if((b|0)==0){f=0;i=d;return f|0}c[e>>2]=0;g=a+4|0;h=(kB(g,b,e)|0)==0;j=c[e>>2]|0;if(h){if((j|0)==0){h=u2a(8)|0;c[e>>2]=h;if((h|0)==0){f=0;i=d;return f|0}else{k=h;l=1}}else{k=j;l=0}}else{h=c[j>>2]|0;if((h|0)==0){k=j;l=0}else{e=j+4|0;c[e>>2]=(c[e>>2]|0)+1;f=h;i=d;return f|0}}h=Lu(c[a>>2]|0,b)|0;if((h|0)!=0){c[k+4>>2]=2;c[k>>2]=h;c[(Gma(g,b)|0)>>2]=k;f=h;i=d;return f|0}if((l|0)==0|(k|0)==0){f=0;i=d;return f|0}v2a(k);f=0;i=d;return f|0}function TA(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;if((b|0)==0){d=0;i=c;return d|0}d=UA(IG(a)|0,b)|0;i=c;return d|0}function UA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;i=i+32|0;e=d+24|0;f=d+16|0;g=d+8|0;h=d;if((b|0)==0){j=0;i=d;return j|0}k=a+148|0;if((xB(k,b,e)|0)!=0){a=c[e>>2]|0;l=a+4|0;c[l>>2]=(c[l>>2]|0)+1;j=c[a>>2]|0;i=d;return j|0}a=u2a(8)|0;c[e>>2]=a;if((a|0)==0){j=0;i=d;return j|0}e=u2a(28)|0;EI(e);if((e|0)==0){v2a(a);j=0;i=d;return j|0}else{l=c[b+12>>2]|0;c[f>>2]=34632;c[f+4>>2]=7;m=eI(l,f)|0;c[g>>2]=34640;c[g+4>>2]=7;f=(eI(l,g)|0)+m|0;c[h>>2]=34648;c[h+4>>2]=7;m=f+(eI(l,h)|0)|0;rH(e,b,0,(m|0)<0?0:m,0);c[a+4>>2]=2;c[a>>2]=e;c[(Gma(k,b)|0)>>2]=a;j=e;i=d;return j|0}return 0}function VA(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;e=WA(IG(a)|0,b,c)|0;i=d;return e|0}function WA(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;e=i;i=i+80|0;f=e+64|0;g=e+56|0;h=e+48|0;j=e+40|0;k=e+32|0;l=e+24|0;m=e+16|0;n=e+8|0;o=e;if((b|0)==0){p=0;i=e;return p|0}q=c[b>>2]|0;if((q|0)==4){gH(g,b);jka(f,g);g=dA(c[f>>2]|0)|0;r=(d|0)==0;if(!((g|0)!=0|r)?(c[h>>2]=39808,c[h+4>>2]=10,s=iI(d,h)|0,(s|0)!=0):0){oe(j,f);t=WA(a,$H(s,j)|0,0)|0}else{u=6}do{if((u|0)==6){if(!((g|0)==0|r)?(c[k>>2]=39808,c[k+4>>2]=10,j=iI(d,k)|0,(j|0)!=0):0){s=c[g+8>>2]|0;if((s|0)==3){c[n>>2]=34600;c[n+4>>2]=11;v=$H(j,n)|0}else if((s|0)==2){c[l>>2]=34568;c[l+4>>2]=10;v=$H(j,l)|0}else if((s|0)==1){c[m>>2]=34584;c[m+4>>2]=11;v=$H(j,m)|0}else{t=g;break}if((v|0)!=0){t=WA(a,v,0)|0}else{t=g}}else{t=g}}}while(0);dka(f);p=t;i=e;return p|0}else if((q|0)==5){q=c[b+16>>2]|0;if((q|0)==1){p=WA(a,GH(b,0)|0,d)|0;i=e;return p|0}else if((q|0)==0){p=0;i=e;return p|0}else{c[o>>2]=0;q=a+28|0;d=(nB(q,b,o)|0)==0;t=c[o>>2]|0;if(d){if((t|0)==0){d=u2a(8)|0;c[o>>2]=d;if((d|0)==0){p=0;i=e;return p|0}else{w=d;x=1}}else{w=t;x=0}}else{d=c[t>>2]|0;if((d|0)==0){w=t;x=0}else{o=t+4|0;c[o>>2]=(c[o>>2]|0)+1;p=d;i=e;return p|0}}d=Cz(c[a>>2]|0,b)|0;if((d|0)!=0){c[w+4>>2]=2;c[w>>2]=d;c[(Gma(q,b)|0)>>2]=w;p=d;i=e;return p|0}if((x|0)==0|(w|0)==0){p=0;i=e;return p|0}v2a(w);p=0;i=e;return p|0}}else{p=0;i=e;return p|0}return 0}function XA(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=i;f=YA(IG(a)|0,b,c,d)|0;i=e;return f|0}function YA(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f=i;i=i+16|0;g=f+8|0;h=f;if((b|0)==0){j=0;i=f;return j|0}c[g>>2]=0;k=a+52|0;l=(pB(k,b,g)|0)==0;m=c[g>>2]|0;if(l){if((m|0)==0){l=u2a(8)|0;c[g>>2]=l;if((l|0)==0){j=0;i=f;return j|0}else{n=l;o=1}}else{n=m;o=0}}else{l=c[m>>2]|0;if((l|0)==0){n=m;o=0}else{g=m+4|0;c[g>>2]=(c[g>>2]|0)+1;j=l;i=f;return j|0}}do{if((d|0)==0){l=lH(b)|0;if((l|0)!=0){c[h>>2]=34616;c[h+4>>2]=11;g=eI(l,h)|0;if((g|0)==2){l=u2a(100)|0;eG(l,c[a>>2]|0,b,0,e);p=l;q=13;break}else if((g|0)==1){g=u2a(96)|0;$F(g,c[a>>2]|0,b,e);p=g;q=13;break}else{break}}}else{g=u2a(100)|0;eG(g,c[a>>2]|0,b,d,e);p=g;q=13}}while(0);if((q|0)==13?(p|0)!=0:0){c[n+4>>2]=2;c[n>>2]=p;c[(Gma(k,b)|0)>>2]=n;j=p;i=f;return j|0}if((o|0)==0|(n|0)==0){j=0;i=f;return j|0}v2a(n);j=0;i=f;return j|0}function ZA(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;e=_A(IG(a)|0,b,c)|0;i=d;return e|0}function _A(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;i=i+80|0;f=e+48|0;g=e+20|0;h=e+52|0;j=e+16|0;k=e+8|0;l=e;if((b|0)==0){m=0;i=e;return m|0}c[f>>2]=0;n=a+100|0;if((uB(n,b,f)|0)!=0){o=c[f>>2]|0;p=o+4|0;c[p>>2]=(c[p>>2]|0)+1;m=c[o>>2]|0;i=e;return m|0}EI(g);rH(g,b,0,0,0);c[j>>2]=0;o=vH(g)|0;n1a(o,sH(g)|0,h);o=a+124|0;c[k>>2]=h;c[k+4>>2]=20;do{if((Wma(o,k,j)|0)==0){a=u2a(8)|0;p=vH(g)|0;vz(a,p,sH(g)|0,d);if((a|0)!=0){p=u2a(8)|0;c[f>>2]=p;if((p|0)==0){wz(c[a+4>>2]|0);v2a(a);q=0;break}else{c[p+4>>2]=2;c[p>>2]=a;c[(Gma(n,b)|0)>>2]=p;c[l>>2]=h;c[l+4>>2]=20;c[(Qma(o,l)|0)>>2]=b;q=a;break}}else{q=0}}else{uB(n,c[j>>2]|0,f)|0;a=c[f>>2]|0;p=a+4|0;c[p>>2]=(c[p>>2]|0)+1;q=c[a>>2]|0}}while(0);FI(g);m=q;i=e;return m|0}function $A(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)==0){e=0;i=d;return e|0}if((c[b+4>>2]|0)==0){_a(34448,34472,119,34520)}e=aB(IG(a)|0,b)|0;i=d;return e|0}function aB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+16|0;e=d;if((b|0)==0){f=0;i=d;return f|0}g=c[b+4>>2]|0;h=a+76|0;if((rB(h,g,e)|0)!=0){j=c[e>>2]|0;k=j+4|0;c[k>>2]=(c[k>>2]|0)+1;f=c[j>>2]|0;i=d;return f|0}j=u2a(8)|0;c[e>>2]=j;if((j|0)==0){f=0;i=d;return f|0}e=u2a(48)|0;sD(e,c[a>>2]|0);if((e|0)==0){v2a(j);f=0;i=d;return f|0}else{rD(e,b,0);c[j+4>>2]=2;c[j>>2]=e;c[(Gma(h,g)|0)>>2]=j;f=e;i=d;return f|0}return 0}function bB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;if((b|0)==0){i=d;return}if((nB(a+28|0,b,e)|0)==0){i=d;return}b=c[e>>2]|0;e=c[b>>2]|0;if((e|0)==0){i=d;return}a=b+4|0;f=(c[a>>2]|0)+ -1|0;c[a>>2]=f;if((f|0)!=0){i=d;return}Az(e);c[b>>2]=0;i=d;return}function cB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;c[a>>2]=b;b=a+4|0;zma(b,10);e=a+28|0;zma(e,10);f=a+52|0;zma(f,10);g=a+76|0;zma(g,10);h=a+100|0;zma(h,10);Lma(a+124|0,10);j=a+148|0;zma(j,10);Hma(b,64,1);Hma(e,32,1);Hma(f,16,1);Hma(g,64,1);Hma(h,16,1);Hma(j,32,1);i=d;return}function dB(a){a=a|0;var b=0;b=i;PA(a,0);PA(a,1);Bma(a+148|0);Nma(a+124|0);Bma(a+100|0);Bma(a+76|0);Bma(a+52|0);Bma(a+28|0);Bma(a+4|0);i=b;return}function eB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;i=i+16|0;g=f+4|0;h=f;c[g>>2]=0;c[h>>2]=0;Cma(a,b,g,h);c[d>>2]=c[g>>2];c[e>>2]=c[h>>2];i=f;return}function fB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;i=i+16|0;g=f+4|0;h=f;c[g>>2]=0;c[h>>2]=0;Cma(a,b,g,h);c[d>>2]=c[g>>2];c[e>>2]=c[h>>2];i=f;return}function gB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;i=i+16|0;g=f+4|0;h=f;c[g>>2]=0;c[h>>2]=0;Cma(a,b,g,h);c[d>>2]=c[g>>2];c[e>>2]=c[h>>2];i=f;return}function hB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;i=i+16|0;g=f+4|0;h=f;c[g>>2]=0;c[h>>2]=0;Cma(a,b,g,h);c[d>>2]=c[g>>2];c[e>>2]=c[h>>2];i=f;return}function iB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;i=i+16|0;g=f+4|0;h=f;c[g>>2]=0;c[h>>2]=0;Cma(a,b,g,h);c[d>>2]=c[g>>2];c[e>>2]=c[h>>2];i=f;return}function jB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;i=i+16|0;g=f+4|0;h=f;c[g>>2]=0;c[h>>2]=0;Cma(a,b,g,h);c[d>>2]=c[g>>2];c[e>>2]=c[h>>2];i=f;return}function kB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;c[f>>2]=0;if((Dma(a,b,f)|0)==0){g=0;i=e;return g|0}c[d>>2]=c[f>>2];g=1;i=e;return g|0}function lB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;e=i;i=i+96|0;f=e+88|0;g=e+84|0;h=e+80|0;j=e+72|0;k=e+64|0;l=e+56|0;m=e+48|0;n=e+40|0;o=e+32|0;p=e+24|0;q=e+16|0;r=e+8|0;s=e;if((c[b+4>>2]|0)==0){t=0;i=e;return t|0}u=a+4|0;v=(c[a+12>>2]|0)==0;c[f>>2]=v?0:-1;a:do{if(!v){w=j+4|0;x=(d|0)==0;while(1){fB(u,f,g,h);y=c[h>>2]|0;z=c[y>>2]|0;if(((((z|0)!=0?vka(c[z+88>>2]|0,b)|0:0)?(Zu(z)|0)==0:0)?(A=z+84|0,(c[A>>2]|0)==1):0)?(B=c[z+96>>2]|0,c[j>>2]=34536,c[w>>2]=6,(nI(B,j)|0)==0):0){if((c[A>>2]|0)==1){C=z}else{C=0}if(x){break}if((kv(C+144|0,d)|0)!=0){break}}if((c[f>>2]|0)==0){break a}}x=y+4|0;c[x>>2]=(c[x>>2]|0)+1;t=z;i=e;return t|0}}while(0);z=u2a(32)|0;Dh(z);c[k>>2]=669480;c[k+4>>2]=4;c[m>>2]=669472;c[m+4>>2]=4;jka(l,m);tI(z,k,l);dka(l);c[n>>2]=669432;c[n+4>>2]=7;c[p>>2]=34544;c[p+4>>2]=5;jka(o,p);tI(z,n,o);dka(o);c[q>>2]=34552;c[q+4>>2]=8;jka(r,b);tI(z,q,r);dka(r);if((d|0)!=0){c[s>>2]=1280496;c[s+4>>2]=8;oI(z,s,lv(d)|0,0)}II((c[a>>2]|0)+16|0,z)|0;d=u2a(8)|0;if((d|0)==0){t=0;i=e;return t|0}s=Lu(c[a>>2]|0,z)|0;if((s|0)==0){v2a(d);t=0;i=e;return t|0}else{c[d+4>>2]=2;c[d>>2]=s;c[(Gma(u,z)|0)>>2]=d;t=s;i=e;return t|0}return 0}function mB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;if((b|0)==0){i=d;return}if((kB(a+4|0,b,e)|0)==0){i=d;return}b=c[e>>2]|0;e=c[b>>2]|0;if((e|0)==0){i=d;return}a=b+4|0;f=(c[a>>2]|0)+ -1|0;c[a>>2]=f;if((f|0)!=0){i=d;return}Rc[c[(c[e>>2]|0)+4>>2]&1023](e);c[b>>2]=0;i=d;return}function nB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;c[f>>2]=0;if((Dma(a,b,f)|0)==0){g=0;i=e;return g|0}c[d>>2]=c[f>>2];g=1;i=e;return g|0}function oB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;if(((b|0)!=0?(nB(a+28|0,b,e)|0)!=0:0)?(b=c[e>>2]|0,e=c[b>>2]|0,(e|0)!=0):0){a=b+4|0;c[a>>2]=(c[a>>2]|0)+1;f=e}else{f=0}i=d;return f|0}function pB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;c[f>>2]=0;if((Dma(a,b,f)|0)==0){g=0;i=e;return g|0}c[d>>2]=c[f>>2];g=1;i=e;return g|0}function qB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;if((b|0)==0){i=d;return}if((pB(a+52|0,b,e)|0)==0){i=d;return}b=c[e>>2]|0;e=c[b>>2]|0;if((e|0)==0){i=d;return}a=b+4|0;f=(c[a>>2]|0)+ -1|0;c[a>>2]=f;if((f|0)!=0){i=d;return}Rc[c[(c[e>>2]|0)+4>>2]&1023](e);c[b>>2]=0;i=d;return}function rB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;c[f>>2]=0;if((Dma(a,b,f)|0)==0){g=0;i=e;return g|0}c[d>>2]=c[f>>2];g=1;i=e;return g|0}function sB(a,b){a=a|0;b=b|0;var d=0;d=i;if((b|0)==0){i=d;return}tB(a+76|0,c[b+4>>2]|0);i=d;return}function tB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d;if((b|0)==0){i=d;return}c[e>>2]=0;if((rB(a,b,e)|0)==0){i=d;return}f=c[e>>2]|0;if((f|0)==0){i=d;return}e=f+4|0;g=(c[e>>2]|0)+ -1|0;c[e>>2]=g;if((g|0)!=0){i=d;return}g=c[f>>2]|0;if((g|0)!=0){tD(g);v2a(g)}v2a(f);Jma(a,b);i=d;return}function uB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;c[f>>2]=0;if((Dma(a,b,f)|0)==0){g=0;i=e;return g|0}c[d>>2]=c[f>>2];g=1;i=e;return g|0}function vB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;i=i+32|0;e=d+20|0;f=d+16|0;g=d+12|0;h=d+8|0;j=d;if((b|0)==0){i=d;return}c[e>>2]=0;k=a+100|0;a:do{if(((uB(k,0,e)|0)!=0?(c[(c[e>>2]|0)+4>>2]|0)>>>0<2:0)?(l=a+124|0,m=(c[a+132>>2]|0)==0,c[f>>2]=m?0:-1,!m):0){while(1){c[g>>2]=0;c[h>>2]=0;Oma(l,f,g,h);if((c[h>>2]|0)==0){break}dka(g);if((c[f>>2]|0)==0){break a}}oe(j,g);Xma(l,j);dka(g)}}while(0);wB(k,b);i=d;return}function wB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d;if((b|0)==0){i=d;return}c[e>>2]=0;f=GB(a,b,e)|0;b=c[e>>2]|0;if((b|0)==0){i=d;return}e=b+4|0;g=(c[e>>2]|0)+ -1|0;c[e>>2]=g;if((g|0)!=0){i=d;return}g=c[b>>2]|0;if((g|0)!=0){wz(c[g+4>>2]|0);v2a(g)}v2a(b);Jma(a,f);i=d;return}function xB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;c[f>>2]=0;if((Dma(a,b,f)|0)==0){g=0;i=e;return g|0}c[d>>2]=c[f>>2];g=1;i=e;return g|0}function yB(a,b){a=a|0;b=b|0;var c=0;c=i;if((b|0)==0){i=c;return}zB(a+148|0,b);i=c;return}function zB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d;if((b|0)==0){i=d;return}c[e>>2]=0;if((xB(a,b,e)|0)==0){i=d;return}f=c[e>>2]|0;if((f|0)==0){i=d;return}e=f+4|0;g=(c[e>>2]|0)+ -1|0;c[e>>2]=g;if((g|0)!=0){i=d;return}g=c[f>>2]|0;if((g|0)!=0){FI(g);v2a(g)}v2a(f);Jma(a,b);i=d;return}function AB(a){a=a|0;var b=0;b=i;HB(a);i=b;return}function BB(a){a=a|0;var b=0;b=i;HB(a);v2a(a);i=b;return}function CB(a,b){a=a|0;b=b|0;var c=0;a=i;c=u2a(172)|0;cB(c,b);i=a;return c|0}function DB(a){a=a|0;return a+4|0}function EB(a,b){a=a|0;b=b|0;var c=0;c=i;ru(a+4|0,b);i=c;return}function FB(a){a=a|0;return 1}function GB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+16|0;f=e+4|0;g=e;h=(c[a+8>>2]|0)==0;c[f>>2]=h?0:-1;a:do{if(!h){while(1){iB(a,f,g,d);if((c[c[d>>2]>>2]|0)==(b|0)){break}if((c[f>>2]|0)==0){break a}}j=c[g>>2]|0;i=e;return j|0}}while(0);c[d>>2]=0;j=0;i=e;return j|0}function HB(a){a=a|0;var b=0;b=i;c[a>>2]=34664;Sz(a+244|0);nu(a+4|0);i=b;return}function IB(a){a=a|0;var b=0;b=i;c[a>>2]=34664;mu(a+4|0);az(a+172|0,1);az(a+196|0,2);az(a+220|0,3);Qz(a+244|0);i=b;return}function JB(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;d=a+4|0;e=c[a+8>>2]|0;if((e|0)>0){f=0}else{g=c[d>>2]|0;Jja(g);i=b;return}do{if((c[(Hg(d,f)|0)>>2]|0)==42){a=f+1|0;h=c[(Hg(d,a)|0)>>2]|0;if((h|0)==0){j=a}else{JB(h);v2a(h);j=a}}else{if((c[(Hg(d,f)|0)>>2]|0)==43){a=f+1|0;v2a(c[(Hg(d,a)|0)>>2]|0);j=a}else{j=f}}f=j+1|0}while((f|0)<(e|0));g=c[d>>2]|0;Jja(g);i=b;return}function KB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0;d=i;e=a+4|0;f=c[a+8>>2]|0;if((f|0)>0){h=0}else{i=d;return}a:while(1){a=c[(Hg(e,h)|0)>>2]|0;do{if((a|0)==42){j=h+1|0}else if((a|0)==43){k=h+1|0;LB(b,+g[c[(Hg(e,k)|0)>>2]>>2]);j=k}else if((a|0)==35){if((h|0)<4){l=17;break a}if((c[(Hg(e,h+ -2|0)|0)>>2]|0)!=42){l=17;break a}if((c[(Hg(e,h+ -4|0)|0)>>2]|0)!=42){l=17;break a}if((~~+MB(b)|0)==0){KB(c[(Hg(e,h+ -1|0)|0)>>2]|0,b);j=h;break}else{KB(c[(Hg(e,h+ -3|0)|0)>>2]|0,b);j=h;break}}else if((a|0)==34){if((h|0)<2){l=17;break a}if((c[(Hg(e,h+ -2|0)|0)>>2]|0)!=42){l=17;break a}if((~~+MB(b)|0)==0){j=h}else{KB(c[(Hg(e,h+ -1|0)|0)>>2]|0,b);j=h}}else{NB(b,a);j=h}}while(0);h=j+1|0;if((h|0)>=(f|0)){l=17;break}}if((l|0)==17){i=d;return}}function LB(a,b){a=a|0;b=+b;var d=0,e=0,f=0;d=i;e=a+400|0;f=c[e>>2]|0;if((f|0)==100){i=d;return}c[e>>2]=f+1;g[a+(f<<2)>>2]=b;i=d;return}function MB(a){a=a|0;var b=0,d=0,e=0,f=0.0,h=0;b=i;d=a+400|0;e=c[d>>2]|0;if((e|0)==0){f=0.0;i=b;return+f}h=e+ -1|0;c[d>>2]=h;f=+g[a+(h<<2)>>2];i=b;return+f}function NB(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;d=i;do{switch(b|0){case 21:{e=+MB(a);LB(a,+(+MB(a)==e|0));i=d;return};case 16:{e=+MB(a);LB(a,+T(+(+MB(a)),+e));i=d;return};case 17:{LB(a,+aa(+(+MB(a))));i=d;return};case 8:{LB(a,+ba(+(+MB(a))));i=d;return};case 13:{LB(a,+V(+(+MB(a)*3.1415927410125732/180.0)));i=d;return};case 12:{LB(a,+S(+(+MB(a))));i=d;return};case 30:{LB(a,+((~~+MB(a)|0)==0|0));i=d;return};case 5:{f=~~+MB(a);LB(a,+((~~+MB(a)|0)%(f|0)|0|0));i=d;return};case 38:{e=+MB(a);LB(a,e);LB(a,e);i=d;return};case 39:{f=~~+MB(a);if(f>>>0>100){i=d;return}h=a+400|0;j=c[h>>2]|0;if((j+f|0)>100|(f|0)>(j|0)){i=d;return}if((f|0)>0){k=j;l=0;while(1){m=k+l|0;g[a+(m<<2)>>2]=+g[a+(m-f<<2)>>2];l=l+1|0;m=c[h>>2]|0;if((l|0)==(f|0)){n=m;break}else{k=m}}}else{n=j}c[h>>2]=n+f;i=d;return};case 40:{k=~~+MB(a);if((k|0)<0){i=d;return}l=c[a+400>>2]|0;if((k|0)>=(l|0)){i=d;return}LB(a,+g[a+(l+~k<<2)>>2]);i=d;return};case 28:{k=~~+MB(a);LB(a,+(~~+MB(a)|k|0));i=d;return};case 29:{k=~~+MB(a);LB(a,+(~~+MB(a)^k|0));i=d;return};case 25:{e=+MB(a);LB(a,+(+MB(a)<e|0));i=d;return};case 15:{e=+MB(a);o=+_(+(+MB(a)),+e)*180.0/3.1415927410125732;if(o<0.0){p=o+360.0}else{p=o}LB(a,p);i=d;return};case 31:{k=~~+MB(a);l=~~+MB(a);if((k|0)>0){LB(a,+(l<<k|0));i=d;return}else{LB(a,+(l>>0-k|0));i=d;return}break};case 36:{+MB(a);i=d;return};case 32:{LB(a,1.0);i=d;return};case 33:{LB(a,0.0);i=d;return};case 37:{o=+MB(a);e=+MB(a);LB(a,o);LB(a,e);i=d;return};case 22:{e=+MB(a);LB(a,+(+MB(a)!=e|0));i=d;return};case 9:{LB(a,+Q(+(+MB(a))));i=d;return};case 27:{k=~~+MB(a);LB(a,+(~~+MB(a)&k|0));i=d;return};case 41:{k=~~+MB(a);l=~~+MB(a);m=a+400|0;q=c[m>>2]|0;if((q|0)==0|(l|0)<0|(l|0)>(q|0)){i=d;return}if((k|0)<0){r=0-k|0;s=l+ -1|0;t=(s|0)>0;u=q;v=1;while(1){e=+g[a+(u-l<<2)>>2];if(t){w=u;x=0;while(1){y=w-l+x|0;g[a+(y<<2)>>2]=+g[a+(y+1<<2)>>2];x=x+1|0;y=c[m>>2]|0;if((x|0)==(s|0)){z=y;break}else{w=y}}}else{z=u}g[a+(z+ -1<<2)>>2]=e;if((v|0)>=(r|0)){break}u=c[m>>2]|0;v=v+1|0}i=d;return}if((k|0)<=0){i=d;return}v=l+ -1|0;u=(v|0)>0;r=q;s=1;while(1){o=+g[a+(r+ -1<<2)>>2];if(u){t=r;f=0;while(1){g[a+(t+ -1<<2)>>2]=+g[a+(t+ -2<<2)>>2];f=f+1|0;h=(c[m>>2]|0)-f|0;if((f|0)==(v|0)){A=h;break}else{t=h}}}else{A=r}g[a+(A+ -1<<2)>>2]=o;if((s|0)==(k|0)){break}r=c[m>>2]|0;s=s+1|0}i=d;return};case 10:{LB(a,+(Fla(+MB(a))|0));i=d;return};case 6:{LB(a,-+MB(a));i=d;return};case 11:{LB(a,+(~~+MB(a)|0));i=d;return};case 2:{e=+MB(a);LB(a,e*+MB(a));i=d;return};case 14:{LB(a,+U(+(+MB(a)*3.1415927410125732/180.0)));i=d;return};case 26:{e=+MB(a);LB(a,+(+MB(a)<=e|0));i=d;return};case 1:{e=+MB(a);LB(a,+MB(a)-e);i=d;return};case 18:{LB(a,+mc(+(+MB(a))));i=d;return};case 24:{e=+MB(a);LB(a,+(+MB(a)>=e|0));i=d;return};case 19:{LB(a,+(~~+MB(a)|0));i=d;return};case 23:{e=+MB(a);LB(a,+(+MB(a)>e|0));i=d;return};case 4:{s=~~+MB(a);LB(a,+((~~+MB(a)|0)/(s|0)|0|0));i=d;return};case 3:{e=+MB(a);LB(a,+MB(a)/e);i=d;return};case 0:{e=+MB(a);LB(a,e+ +MB(a));i=d;return};case 7:{LB(a,+R(+(+MB(a))));i=d;return};default:{i=d;return}}}while(0)}function OB(a){a=a|0;var b=0;b=i;Ija(a+408|0,4);c[a+400>>2]=0;i=b;return}function PB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+32|0;f=e+8|0;g=e;nL(f,b,d);qL(g,f);if(tm(c[g>>2]|0,c[g+4>>2]|0,34704,1)|0){h=0;i=e;return h|0}h=QB(a+404|0,f)|0;i=e;return h|0}function QB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=i;i=i+32|0;e=d+24|0;f=d+16|0;h=d+8|0;j=d;qL(e,b);k=e+4|0;if((c[k>>2]|0)==0){l=0;i=d;return l|0}m=f+4|0;n=h+4|0;o=a+4|0;a:while(1){c[f>>2]=34712;c[m>>2]=1;if(Ue(e,f)|0){l=1;p=11;break}c[h>>2]=34704;c[n>>2]=1;do{if(Ue(e,h)|0){a=u2a(20)|0;Ija(a+4|0,4);yg(o,42);yg(o,a);if((QB(a,b)|0)==0){l=0;p=11;break a}}else{a=0;while(1){pe(j,c[34720+(a<<3)>>2]|0);q=a+1|0;if(Ue(e,j)|0){p=8;break}if((q|0)==42){p=10;break}else{a=q}}if((p|0)==8){p=0;yg(o,c[34724+(a<<3)>>2]|0);break}else if((p|0)==10){p=0;q=w2a(1,4)|0;g[q>>2]=+Hna(e);yg(o,43);yg(o,q);break}}}while(0);qL(e,b);if((c[k>>2]|0)==0){l=0;p=11;break}}if((p|0)==11){i=d;return l|0}return 0}function RB(a){a=a|0;var b=0;b=i;SB(a);v2a(a);i=b;return}function SB(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=35072;d=c[a+36>>2]|0;if((d|0)!=0){FI(d);v2a(d)}d=c[a+20>>2]|0;if((d|0)!=0){v2a(d)}d=c[a+24>>2]|0;if((d|0)==0){TB(a);i=b;return}v2a(d);TB(a);i=b;return}function TB(a){a=a|0;var b=0,d=0,e=0;b=i;c[a>>2]=35224;d=a+12|0;e=c[d>>2]|0;if((e|0)!=0){v2a(e);c[d>>2]=0}d=a+16|0;a=c[d>>2]|0;if((a|0)==0){i=b;return}v2a(a);c[d>>2]=0;i=b;return}function UB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0,C=0,D=0;d=i;i=i+48|0;e=d+32|0;f=d+24|0;h=d+16|0;j=d+8|0;k=d;if((c[b>>2]|0)!=7){l=0;i=d;return l|0}m=c[b+12>>2]|0;c[e>>2]=38520;c[e+4>>2]=4;n=jI(m,e)|0;c[f>>2]=35088;c[f+4>>2]=6;e=jI(m,f)|0;c[h>>2]=39832;c[h+4>>2]=6;f=jI(m,h)|0;c[j>>2]=35096;c[j+4>>2]=13;h=eI(m,j)|0;j=a+28|0;c[j>>2]=h;c[a+32>>2]=-1>>>(32-h|0);h=u2a(28)|0;EI(h);o=a+36|0;c[o>>2]=h;rH(h,b,0,0,0);b=a+4|0;h=c[b>>2]|0;p=a+20|0;c[p>>2]=w2a(h,12)|0;if((h|0)>0){h=(n|0)!=0;q=h^1;r=k+4|0;s=(e|0)==0;t=0;u=1;do{if(h){v=JH(n,t)|0;c[(c[p>>2]|0)+(t*12|0)+8>>2]=v;if((t|0)==0&q){w=7}}else{c[(c[p>>2]|0)+(t*12|0)+8>>2]=0;if((t|0)==0){w=7}}if((w|0)==7){w=0;c[k>>2]=38520;c[r>>2]=4;v=eI(m,k)|0;c[(c[p>>2]|0)+(t*12|0)+8>>2]=v}v=c[p>>2]|0;x=c[v+(t*12|0)+8>>2]|0;if((u|0)!=0?x>>>0>(4294967295/(u>>>0)|0)>>>0:0){l=0;w=29;break}u=ca(x,u)|0;do{if(s){g[v+(t*12|0)+4>>2]=0.0;x=c[p>>2]|0;y=x+(t*12|0)|0;z=c[x+(t*12|0)+8>>2]|0;if((z|0)==1){g[y>>2]=1.0;break}else{g[y>>2]=+(z|0)+-1.0;break}}else{z=t<<1;A=+DH(e,z);g[(c[p>>2]|0)+(t*12|0)+4>>2]=A;A=+DH(e,z|1);g[(c[p>>2]|0)+(t*12|0)>>2]=A}}while(0);t=t+1|0}while((t|0)<(c[b>>2]|0));if((w|0)==29){i=d;return l|0}if((u|0)==0){B=c[j>>2]|0;C=0}else{D=u;w=18}}else{D=1;w=18}if((w|0)==18){w=c[j>>2]|0;if(w>>>0>(4294967295/(D>>>0)|0)>>>0){l=0;i=d;return l|0}else{B=w;C=D}}D=ca(B,C)|0;C=a+8|0;B=c[C>>2]|0;if((D|0)!=0?B>>>0>(4294967295/(D>>>0)|0)>>>0:0){l=0;i=d;return l|0}w=ca(B,D)|0;if((w|0)==0){l=0;i=d;return l|0}if((sH(c[o>>2]|0)|0)<<3>>>0<w>>>0){l=0;i=d;return l|0}w=a+24|0;c[w>>2]=w2a(B,8)|0;if((B|0)<=0){l=1;i=d;return l|0}B=(f|0)==0;o=a+16|0;a=0;do{D=a<<1;if(B){g[(c[w>>2]|0)+(a<<3)+4>>2]=+g[(c[o>>2]|0)+(D<<2)>>2];g[(c[w>>2]|0)+(a<<3)>>2]=+g[(c[o>>2]|0)+((D|1)<<2)>>2]}else{A=+DH(f,D);g[(c[w>>2]|0)+(a<<3)+4>>2]=A;A=+DH(f,D|1);g[(c[w>>2]|0)+(a<<3)>>2]=A}a=a+1|0}while((a|0)<(c[C>>2]|0));l=1;i=d;return l|0}function VB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0,w=0.0,x=0.0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0.0,G=0,H=0.0;e=i;i=i+208|0;f=e+132|0;h=e;j=a+4|0;KA(f,c[j>>2]|0);k=f+64|0;l=c[k>>2]|0;m=(l|0)==0?f:l;mC(h,c[j>>2]<<1);l=h+128|0;f=c[l>>2]|0;n=(f|0)==0?h:f;f=c[j>>2]|0;if((f|0)>0){h=a+12|0;o=a+20|0;p=n+(f<<2)|0;q=0;r=0;while(1){if((q|0)==0){c[p>>2]=1}else{s=q+ -1|0;c[n+(q+f<<2)>>2]=ca(c[(c[o>>2]|0)+(s*12|0)+8>>2]|0,c[n+(s+f<<2)>>2]|0)|0}s=q<<1;t=c[h>>2]|0;u=+g[t+(s<<2)>>2];v=c[o>>2]|0;w=+g[v+(q*12|0)+4>>2];x=w+(+g[b+(q<<2)>>2]-u)*(+g[v+(q*12|0)>>2]-w)/(+g[t+((s|1)<<2)>>2]-u);g[m+(q<<2)>>2]=x;s=~~x;t=n+(q<<2)|0;c[t>>2]=s;if((s|0)>=0){v=(c[(c[o>>2]|0)+(q*12|0)+8>>2]|0)+ -1|0;if((s|0)>(v|0)){c[t>>2]=v;y=v}else{y=s}}else{c[t>>2]=0;y=0}t=(ca(c[n+(q+f<<2)>>2]|0,y)|0)+r|0;q=q+1|0;s=c[j>>2]|0;if((q|0)>=(s|0)){z=s;A=t;break}else{r=t}}}else{z=f;A=0}r=a+28|0;q=c[r>>2]|0;y=ca(q,A)|0;A=a+8|0;o=c[A>>2]|0;b=ca(y,o)|0;y=vH(c[a+36>>2]|0)|0;if((y|0)==0){B=0;C=c[l>>2]|0;lC(C);D=c[k>>2]|0;JA(D);i=e;return B|0}if((o|0)<=0){B=1;C=c[l>>2]|0;lC(C);D=c[k>>2]|0;JA(D);i=e;return B|0}h=a+32|0;p=a+24|0;t=a+20|0;a=q;q=z;z=o;o=0;while(1){x=+((WB(y,(ca(a,o)|0)+b|0,a)|0)>>>0);if((q|0)>0){s=c[t>>2]|0;u=x;v=0;while(1){E=c[n+(v<<2)>>2]|0;if((E|0)==((c[s+(v*12|0)+8>>2]|0)+ -1|0)){if((E|0)==0){F=x*+g[m+(v<<2)>>2]}else{F=u}}else{G=WB(y,(ca((ca(c[n+(v+f<<2)>>2]|0,z)|0)+o|0,a)|0)+b|0,a)|0;F=u+(+g[m+(v<<2)>>2]- +(E|0))*(+(G>>>0)-x)}v=v+1|0;if((v|0)>=(q|0)){H=F;break}else{u=F}}}else{H=x}v=c[p>>2]|0;u=+g[v+(o<<3)+4>>2];g[d+(o<<2)>>2]=u+H*(+g[v+(o<<3)>>2]-u)/+((c[h>>2]|0)>>>0);v=o+1|0;s=c[A>>2]|0;if((v|0)>=(s|0)){B=1;break}a=c[r>>2]|0;q=c[j>>2]|0;z=s;o=v}C=c[l>>2]|0;lC(C);D=c[k>>2]|0;JA(D);i=e;return B|0}function WB(a,b,c){a=a|0;b=b|0;c=c|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;if((c|0)<=0){f=0;i=e;return f|0}g=c+ -1|0;h=0;j=0;while(1){k=h+b|0;if((1<<7-((k|0)%8|0)&(d[a+((k|0)/8|0)>>0]|0)|0)==0){l=j}else{l=1<<g-h|j}h=h+1|0;if((h|0)==(c|0)){f=l;break}else{j=l}}i=e;return f|0}function XB(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=i;i=i+32|0;d=c;EI(d);rH(d,b,0,0,0);b=vH(d)|0;e=PB(a+20|0,b,sH(d)|0)|0;FI(d);i=c;return e|0}function YB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0.0;e=i;f=a+20|0;h=a+420|0;c[h>>2]=0;j=a+4|0;if((c[j>>2]|0)>0){k=0;do{LB(f,+g[b+(k<<2)>>2]);k=k+1|0}while((k|0)<(c[j>>2]|0))}KB(a+424|0,f);j=a+8|0;a=c[j>>2]|0;if((c[h>>2]|0)<(a|0)){l=0;i=e;return l|0}if((a|0)>0){m=0}else{l=1;i=e;return l|0}do{n=+MB(f);g[d+((c[j>>2]|0)+~m<<2)>>2]=n;m=m+1|0}while((m|0)<(c[j>>2]|0));l=1;i=e;return l|0}function ZB(a){a=a|0;var b=0;b=i;_B(a);v2a(a);i=b;return}function _B(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=35120;d=c[a+24>>2]|0;if((d|0)!=0){v2a(d)}d=c[a+28>>2]|0;if((d|0)!=0){v2a(d)}TB(a);i=b;return}function $B(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0;d=i;i=i+32|0;e=d+16|0;f=d+8|0;h=d;j=lH(b)|0;if((j|0)==0){k=0;i=d;return k|0}c[e>>2]=35136;c[e+4>>2]=2;b=jI(j,e)|0;e=a+8|0;if((c[e>>2]|0)==0?(c[e>>2]=1,(b|0)!=0):0){c[e>>2]=c[b+16>>2]}c[f>>2]=35144;c[f+4>>2]=2;l=jI(j,f)|0;f=c[e>>2]|0;m=f<<1;n=a+24|0;c[n>>2]=w2a(m,4)|0;o=a+28|0;c[o>>2]=w2a(m,4)|0;if((f|0)>0){f=(b|0)==0;m=(l|0)==0;p=0;do{if(f){q=0.0}else{q=+DH(b,p)}g[(c[n>>2]|0)+(p<<2)>>2]=q;if(m){r=1.0}else{r=+DH(l,p)}g[(c[o>>2]|0)+(p<<2)>>2]=r;p=p+1|0}while((p|0)<(c[e>>2]|0))}c[h>>2]=1274672;c[h+4>>2]=1;g[a+20>>2]=+gI(j,h);h=c[e>>2]|0;c[a+32>>2]=h;j=c[a+4>>2]|0;if((h|0)!=0?(j|0)>(2147483647/(h|0)|0|0):0){k=0;i=d;return k|0}c[e>>2]=ca(h,j)|0;k=1;i=d;return k|0}function aC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0,u=0;e=i;f=a+4|0;h=c[f>>2]|0;if((h|0)<=0){i=e;return 1}j=a+32|0;k=a+24|0;l=a+20|0;m=a+28|0;a=h;h=c[j>>2]|0;n=0;while(1){if((h|0)>0){o=b+(n<<2)|0;p=h;q=0;do{r=+g[(c[k>>2]|0)+(q<<2)>>2];s=+T(+(+g[o>>2]),+(+g[l>>2]));g[d+((ca(p,n)|0)+q<<2)>>2]=r+s*(+g[(c[m>>2]|0)+(q<<2)>>2]-r);q=q+1|0;p=c[j>>2]|0}while((q|0)<(p|0));t=c[f>>2]|0;u=p}else{t=a;u=h}n=n+1|0;if((n|0)>=(t|0)){break}else{a=t;h=u}}i=e;return 1}function bC(a){a=a|0;var b=0;b=i;cC(a);v2a(a);i=b;return}function cC(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;b=i;c[a>>2]=35160;d=a+20|0;e=c[d>>2]|0;f=a+24|0;g=c[f>>2]|0;if((e|0)>0){h=e;e=g;j=0;while(1){k=c[e+(j<<2)>>2]|0;if((k|0)==0){l=h;m=e}else{Rc[c[(c[k>>2]|0)+4>>2]&1023](k);l=c[d>>2]|0;m=c[f>>2]|0}j=j+1|0;if((j|0)>=(l|0)){n=m;break}else{h=l;e=m}}}else{n=g}if((n|0)!=0){v2a(n)}n=c[a+28>>2]|0;if((n|0)!=0){v2a(n)}n=c[a+32>>2]|0;if((n|0)==0){TB(a);i=b;return}v2a(n);TB(a);i=b;return}function dC(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0,w=0;d=i;i=i+32|0;e=d+16|0;f=d+8|0;h=d;j=lH(b)|0;if((j|0)==0){k=0;i=d;return k|0}c[e>>2]=35176;c[e+4>>2]=9;l=jI(j,e)|0;if((l|0)==0){k=0;i=d;return k|0}e=c[l+16>>2]|0;m=a+20|0;c[m>>2]=e;if((e|0)==0){k=0;i=d;return k|0}n=a+24|0;c[n>>2]=w2a(e,4)|0;o=a+8|0;c[o>>2]=0;a:do{if((e|0)>0){p=0;while(1){q=GH(l,p)|0;if((q|0)==(b|0)){k=0;r=16;break}s=eC(q)|0;c[(c[n>>2]|0)+(p<<2)>>2]=s;s=c[(c[n>>2]|0)+(p<<2)>>2]|0;if((s|0)==0){k=0;r=16;break}q=c[s+8>>2]|0;if((q|0)>(c[o>>2]|0)){c[o>>2]=q}p=p+1|0;q=c[m>>2]|0;if((p|0)>=(q|0)){t=q;break a}}if((r|0)==16){i=d;return k|0}}else{t=e}}while(0);e=w2a(t+1|0,4)|0;t=a+28|0;c[t>>2]=e;r=a+12|0;g[e>>2]=+g[c[r>>2]>>2];c[f>>2]=35192;c[f+4>>2]=6;e=jI(j,f)|0;if((e|0)==0){k=0;i=d;return k|0}f=c[m>>2]|0;if((f+ -1|0)>0){o=0;do{u=+DH(e,o);o=o+1|0;g[(c[t>>2]|0)+(o<<2)>>2]=u;n=c[m>>2]|0}while((o|0)<(n+ -1|0));v=n}else{v=f}g[(c[t>>2]|0)+(v<<2)>>2]=+g[(c[r>>2]|0)+4>>2];r=a+32|0;c[r>>2]=w2a(c[m>>2]<<1,4)|0;c[h>>2]=35088;c[h+4>>2]=6;a=jI(j,h)|0;if((a|0)==0){k=0;i=d;return k|0}if((c[m>>2]|0)>0){w=0}else{k=1;i=d;return k|0}do{u=+DH(a,w);g[(c[r>>2]|0)+(w<<2)>>2]=u;w=w+1|0}while((w|0)<(c[m>>2]<<1|0));k=1;i=d;return k|0}function eC(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;i=i+16|0;d=b+8|0;e=b;if((a|0)==0){f=0;i=b;return f|0}g=c[a>>2]|0;if((g|0)==6){c[e>>2]=35200;c[e+4>>2]=12;h=eI(a,e)|0}else if((g|0)==7){g=c[a+12>>2]|0;c[d>>2]=35200;c[d+4>>2]=12;h=eI(g,d)|0}else{f=0;i=b;return f|0}if((h|0)==2){d=u2a(36)|0;c[d+12>>2]=0;c[d+16>>2]=0;c[d>>2]=35120;c[d+24>>2]=0;c[d+28>>2]=0;j=d}else if((h|0)==3){d=u2a(36)|0;c[d+12>>2]=0;c[d+16>>2]=0;c[d>>2]=35160;g=d+20|0;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;j=d}else if((h|0)==0){d=u2a(40)|0;c[d+12>>2]=0;c[d+16>>2]=0;c[d>>2]=35072;c[d+36>>2]=0;c[d+20>>2]=0;c[d+24>>2]=0;j=d}else if((h|0)==4){h=u2a(444)|0;oC(h);j=h}else{f=0;i=b;return f|0}if((hC(j,a)|0)!=0){f=j;i=b;return f|0}if((j|0)==0){f=0;i=b;return f|0}Rc[c[(c[j>>2]|0)+4>>2]&1023](j);f=0;i=b;return f|0}function fC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0.0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0.0;e=i;i=i+16|0;f=e+4|0;h=e;j=+g[b>>2];g[f>>2]=j;b=(c[a+20>>2]|0)+ -1|0;k=a+28|0;l=0;while(1){if((l|0)>=(b|0)){break}m=l+1|0;if(j<+g[(c[k>>2]|0)+(m<<2)>>2]){break}else{l=m}}b=(c[a+24>>2]|0)+(l<<2)|0;if((c[b>>2]|0)==0){n=0;i=e;return n|0}m=c[k>>2]|0;o=+g[m+(l<<2)>>2];k=l<<1;p=c[a+32>>2]|0;q=+g[p+(k<<2)>>2];g[f>>2]=q+(j-o)*(+g[p+((k|1)<<2)>>2]-q)/(+g[m+(l+1<<2)>>2]-o);gC(c[b>>2]|0,f,c[a+4>>2]|0,d,h)|0;n=1;i=e;return n|0}function gC(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0.0,r=0,s=0,t=0.0;h=i;j=a+4|0;if((c[j>>2]|0)!=(d|0)){k=0;i=h;return k|0}d=a+8|0;c[f>>2]=c[d>>2];if((c[j>>2]|0)>0){f=a+12|0;l=0;do{m=b+(l<<2)|0;n=+g[m>>2];o=l<<1;p=c[f>>2]|0;q=+g[p+(o<<2)>>2];if(!(n<q)){if(n>+g[p+((o|1)<<2)>>2]){g[m>>2]=q+1.0}}else{g[m>>2]=q}l=l+1|0}while((l|0)<(c[j>>2]|0))}Qc[c[(c[a>>2]|0)+12>>2]&255](a,b,e)|0;b=a+16|0;a=c[b>>2]|0;if((a|0)==0){k=1;i=h;return k|0}if((c[d>>2]|0)>0){r=a;s=0}else{k=1;i=h;return k|0}while(1){a=e+(s<<2)|0;q=+g[a>>2];j=s<<1;n=+g[r+(j<<2)>>2];if(!(q<n)){t=+g[r+((j|1)<<2)>>2];if(q>t){g[a>>2]=t}}else{g[a>>2]=n}a=s+1|0;if((a|0)>=(c[d>>2]|0)){k=1;break}r=c[b>>2]|0;s=a}i=h;return k|0}function hC(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0;d=i;i=i+16|0;e=d+8|0;f=d;if((c[b>>2]|0)==7){h=c[b+12>>2]|0}else{h=b}c[e>>2]=40072;c[e+4>>2]=6;j=jI(h,e)|0;if((j|0)==0){k=0;i=d;return k|0}e=(c[j+16>>2]|0)>>>1;l=a+4|0;c[l>>2]=e;if((e|0)==0){k=0;i=d;return k|0}m=a+12|0;c[m>>2]=w2a(e<<1,4)|0;e=0;do{n=+DH(j,e);g[(c[m>>2]|0)+(e<<2)>>2]=n;e=e+1|0}while((e|0)<(c[l>>2]<<1|0));c[f>>2]=35240;c[f+4>>2]=5;l=jI(h,f)|0;f=a+8|0;c[f>>2]=0;if((l|0)!=0){h=(c[l+16>>2]|0)>>>1;c[f>>2]=h;e=a+16|0;c[e>>2]=w2a(h<<1,4)|0;if((h|0)==0){o=e;p=0}else{h=0;do{n=+DH(l,h);g[(c[e>>2]|0)+(h<<2)>>2]=n;h=h+1|0;m=c[f>>2]|0}while((h|0)<(m<<1|0));o=e;p=m}}else{o=a+16|0;p=0}e=dd[c[(c[a>>2]|0)+8>>2]&511](a,b)|0;b=c[o>>2]|0;if((b|0)==0){k=e;i=d;return k|0}a=c[f>>2]|0;if((a|0)<=(p|0)){k=e;i=d;return k|0}h=x2a(b,a<<3)|0;c[o>>2]=h;if((h|0)==0){k=e;i=d;return k|0}f3a(h+(p<<1<<2)|0,0,(c[f>>2]|0)-p<<3|0)|0;k=e;i=d;return k|0}function iC(a){a=a|0;var b=0;b=i;TB(a);v2a(a);i=b;return}function jC(a){a=a|0;var b=0;b=i;nC(a);i=b;return}function kC(a){a=a|0;var b=0;b=i;nC(a);v2a(a);i=b;return}function lC(a){a=a|0;var b=0;b=i;if((a|0)!=0){v2a(a)}i=b;return}function mC(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+128|0;c[e>>2]=0;if((b|0)>32){c[e>>2]=w2a(b,4)|0;i=d;return}else{b=a+0|0;a=b+128|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(a|0));i=d;return}}function nC(a){a=a|0;var b=0;b=i;c[a>>2]=35256;JB(a+424|0);TB(a);i=b;return}function oC(a){a=a|0;var b=0;b=i;c[a+12>>2]=0;c[a+16>>2]=0;c[a>>2]=35256;OB(a+20|0);i=b;return}function pC(a){a=a|0;var b=0;b=i;rC(qC(a+12|0)|0);i=b;return}function qC(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a>>2]|0;if((d|0)!=0){e=d+28|0;c[e>>2]=(c[e>>2]|0)+ -1;e=c[a>>2]|0;if(!((c[e+28>>2]|0)>0|(e|0)==0)){km(e);v2a(e)}c[a>>2]=0}e=u2a(32)|0;c[e+8>>2]=0;c[e+4>>2]=0;c[e+20>>2]=0;c[e+16>>2]=0;c[a>>2]=e;if((e|0)==0){f=0;i=b;return f|0}c[e+28>>2]=1;f=e;i=b;return f|0}function rC(a){a=a|0;var b=0;b=i;c[a+24>>2]=0;c[a+12>>2]=0;lA(a+4|0,Dz(1)|0);lA(a+16|0,Dz(1)|0);i=b;return}function sC(a,b){a=a|0;b=b|0;var c=0;c=i;Yy(a+4|0,b+4|0);iD(a+8|0,b+8|0);hD(a+12|0,b+12|0);Xy(a+16|0,b+16|0);gD(a+20|0,b+20|0);i=c;return}function tC(a){a=a|0;var b=0;b=i;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;i=b;return}function uC(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;d=a+4|0;e=c[d>>2]|0;if((e|0)!=0){if((c[a>>2]|0)>0){f=e;g=0;while(1){qm(f+(g<<2)|0);g=g+1|0;h=c[d>>2]|0;if((g|0)>=(c[a>>2]|0)){j=h;break}else{f=h}}}else{j=e}v2a(j)}v2a(c[a+8>>2]|0);j=c[a+12>>2]|0;e=a+16|0;a=c[e>>2]|0;if((j|0)>0){f=a;g=j;while(1){g=g+ -1|0;j=c[f+(g<<2)>>2]|0;if((j|0)==0){k=f}else{Rc[c[(c[j>>2]|0)+12>>2]&1023](j);k=c[e>>2]|0}if((g|0)<=0){l=k;break}else{f=k}}}else{l=a}if((l|0)==0){i=b;return}v2a(l);i=b;return}function vC(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;e=a+4|0;c[e>>2]=0;f=a+16|0;c[f>>2]=0;g=c[b>>2]|0;c[a>>2]=g;if((g|0)==0){c[e>>2]=0;c[a+8>>2]=0}else{h=(g|0)%8|0;if((h|0)==0){j=g}else{j=g+8-h|0}h=w2a(j,4)|0;c[e>>2]=h;if((h|0)!=0&(j|0)>0){k=h;h=0;while(1){c[k+(h<<2)>>2]=0;l=h+1|0;if((l|0)==(j|0)){break}k=c[e>>2]|0;h=l}m=c[a>>2]|0}else{m=g}if((m|0)>0){g=b+4|0;h=0;do{fD((c[e>>2]|0)+(h<<2)|0,(c[g>>2]|0)+(h<<2)|0);h=h+1|0;k=c[a>>2]|0}while((h|0)<(k|0));n=k}else{n=m}m=w2a(j,1)|0;c[a+8>>2]=m;c3a(m|0,c[b+8>>2]|0,n|0)|0}n=c[b+12>>2]|0;m=a+12|0;c[m>>2]=n;if((n|0)==0){c[f>>2]=0;i=d;return}c[f>>2]=w2a(n,4)|0;if((n|0)<=0){i=d;return}n=b+16|0;b=0;do{if((c[(c[n>>2]|0)+(b<<2)>>2]|0)==0){c[(c[f>>2]|0)+(b<<2)>>2]=0}else{a=u2a(72)|0;my(a);c[(c[f>>2]|0)+(b<<2)>>2]=a;gy(c[(c[f>>2]|0)+(b<<2)>>2]|0,c[(c[n>>2]|0)+(b<<2)>>2]|0)}b=b+1|0}while((b|0)<(c[m>>2]|0));i=d;return}function wC(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;d=i;i=i+96|0;e=d+88|0;f=d+72|0;g=d+64|0;h=d+48|0;j=d+32|0;k=d+16|0;l=d;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;m=c[b>>2]|0;n=c[m>>2]|0;if((n|0)==0){o=m;p=0}else{Zy(e,c[c[m+4>>2]>>2]|0);YIa(a,c[e>>2]|0);qm(e);if((n|0)>1){e=1;do{xC(g,c[(c[b>>2]|0)+4>>2]|0,e);YIa(f,c[g>>2]|0);qm(g);Ila(a,f);e=e+1|0}while((e|0)<(n|0))}o=c[b>>2]|0;p=1}n=c[o+12>>2]|0;if((n|0)==0){i=d;return}c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;if((n|0)>0){q=o;r=0;s=p;t=0}else{i=d;return}while(1){p=c[(c[q+16>>2]|0)+(t<<2)>>2]|0;do{if((p|0)==0){if((s|0)==0){c[a+0>>2]=c[h+0>>2];c[a+4>>2]=c[h+4>>2];c[a+8>>2]=c[h+8>>2];c[a+12>>2]=c[h+12>>2];u=0;v=1;break}else{Ila(a,h);u=0;v=s;break}}else{if((r|0)==0){ly(j,p,0);Gla(h,j);u=1;v=s;break}else{ly(l,p,0);Gla(k,l);Jla(h,k);u=r;v=s;break}}}while(0);p=t+1|0;if((p|0)==(n|0)){break}q=c[b>>2]|0;r=u;s=v;t=p}i=d;return}function xC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;Zy(a,c[b+(d<<2)>>2]|0);i=e;return}function yC(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;f=i;i=i+48|0;h=f+32|0;j=f+16|0;k=f;l=jy(b)|0;b=c[l>>2]|0;if((b|0)!=0){m=l+4|0;Zy(h,c[(c[m>>2]|0)+(b+ -1<<2)>>2]|0);b=c[h>>2]|0;if((bJa(b)|0)!=0?(n=c[b+4>>2]|0,o=+g[n+4>>2],p=+g[n+24>>2],q=+g[n+28>>2],g[j>>2]=+g[n>>2],g[j+8>>2]=o,g[j+4>>2]=p,g[j+12>>2]=q,YIa(k,c[d>>2]|0),(Pla(j,k)|0)!=0):0){k=(c[l>>2]|0)+ -1|0;c[l>>2]=k;zC((c[m>>2]|0)+(k<<2)|0)}qm(h);h=c[l>>2]|0;if((h&7|0)==0){r=h}else{s=l+8|0;t=c[m>>2]|0;u=h;v=t+(u<<2)|0;fD(v,d);w=e&255;x=c[l>>2]|0;y=c[s>>2]|0;z=y+x|0;a[z>>0]=w;A=c[l>>2]|0;B=A+1|0;c[l>>2]=B;i=f;return}}else{r=0}h=w2a(r+8|0,4)|0;r=c[l>>2]|0;if((h|0)!=0?(r+8|0)>0:0){m=0;while(1){c[h+(m<<2)>>2]=0;k=c[l>>2]|0;if((m|0)<(k+7|0)){m=m+1|0}else{C=k;break}}}else{C=r}r=l+4|0;m=c[r>>2]|0;if((C|0)>0){k=m;j=0;while(1){fD(h+(j<<2)|0,k+(j<<2)|0);j=j+1|0;n=c[l>>2]|0;b=c[r>>2]|0;if((j|0)>=(n|0)){D=b;E=n;break}else{k=b}}}else{D=m;E=C}if((D|0)==0){F=E}else{if((E|0)>0){E=D;C=0;while(1){qm(E+(C<<2)|0);C=C+1|0;m=c[r>>2]|0;if((C|0)>=(c[l>>2]|0)){G=m;break}else{E=m}}}else{G=D}v2a(G);F=c[l>>2]|0}G=w2a(F+8|0,1)|0;F=l+8|0;c3a(G|0,c[F>>2]|0,c[l>>2]|0)|0;v2a(c[F>>2]|0);c[r>>2]=h;c[F>>2]=G;s=F;t=h;u=c[l>>2]|0;v=t+(u<<2)|0;fD(v,d);w=e&255;x=c[l>>2]|0;y=c[s>>2]|0;z=y+x|0;a[z>>0]=w;A=c[l>>2]|0;B=A+1|0;c[l>>2]=B;i=f;return}function zC(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;if((d|0)==0){i=b;return}e=d+12|0;c[e>>2]=(c[e>>2]|0)+ -1;e=c[a>>2]|0;if(!((c[e+12>>2]|0)>0|(e|0)==0)){PIa(c[e+4>>2]|0);v2a(e)}c[a>>2]=0;i=b;return}function AC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;f=jy(a)|0;a=f+12|0;g=(c[a>>2]|0)+d|0;if((g|0)>1024){if((d|0)>0){h=0}else{i=e;return}do{j=c[b+(h<<2)>>2]|0;if((j|0)!=0){dy(j)}h=h+1|0}while((h|0)!=(d|0));i=e;return}else{h=w2a(g+1|0,4)|0;g=f+16|0;f=c[g>>2]|0;if((f|0)!=0){c3a(h|0,f|0,c[a>>2]<<2|0)|0;v2a(c[g>>2]|0)}c[g>>2]=h;if((d|0)>0){f=h;j=0;while(1){c[f+((c[a>>2]|0)+j<<2)>>2]=c[b+(j<<2)>>2];j=j+1|0;k=c[g>>2]|0;if((j|0)==(d|0)){l=k;break}else{f=k}}}else{l=h}c[l+((c[a>>2]|0)+d<<2)>>2]=0;c[a>>2]=d+1+(c[a>>2]|0);i=e;return}}function BC(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=jy(a)|0;if((c[e>>2]|0)>0){a=e+4|0;f=0;do{CC((c[a>>2]|0)+(f<<2)|0,b);f=f+1|0}while((f|0)<(c[e>>2]|0))}f=e+12|0;a=c[f>>2]|0;if((a|0)<=0){i=d;return}g=e+16|0;e=a;a=0;while(1){h=c[(c[g>>2]|0)+(a<<2)>>2]|0;if((h|0)==0){j=e}else{Ic[c[c[h>>2]>>2]&511](h,b);j=c[f>>2]|0}a=a+1|0;if((a|0)>=(j|0)){break}else{e=j}}i=d;return}function CC(a,b){a=a|0;b=b|0;var c=0;c=i;$Ia(Zl(a)|0,b);i=c;return}function DC(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=a+4|0;c[a+8>>2]=0;c[e>>2]=0;f=a+16|0;c[a+20>>2]=0;c[f>>2]=0;oA(e,b+4|0);c[a+12>>2]=c[b+12>>2];oA(f,b+16|0);c[a+24>>2]=c[b+24>>2];i=d;return}function EC(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=i;f=Yl(a)|0;FC(f+4|0,f+12|0,b,c,d);i=e;return}function FC(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0;g=i;i=i+16|0;h=g+8|0;j=g+4|0;k=g;if((d|0)==0){if((c[a+4>>2]|0)==0){lA(a,Dz(1)|0)}}else{lA(a,d)}if((c[(c[a>>2]|0)+12>>2]|0)>(f|0)){i=g;return}mA(a,e);if((pA(a,h,j,k)|0)==0){l=-1}else{l=c[j>>2]<<8|c[h>>2]|c[k>>2]<<16}c[b>>2]=l;i=g;return}function GC(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=i;f=Yl(a)|0;FC(f+16|0,f+24|0,b,c,d);i=e;return}function HC(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;g=f+8|0;h=f+4|0;j=f;k=Yl(a)|0;a=k+4|0;nA(a,b,d,e);e=pA(a,g,h,j)|0;if((c[b+8>>2]|0)==1?(c[b+64>>2]|0)!=0&(e|0)==0:0){c[k+12>>2]=12566463;i=f;return}if((e|0)==0){l=-1}else{l=c[h>>2]<<8|c[g>>2]|c[j>>2]<<16}c[k+12>>2]=l;i=f;return}function IC(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;g=f+8|0;h=f+4|0;j=f;k=Yl(a)|0;a=k+16|0;nA(a,b,d,e);e=pA(a,g,h,j)|0;if((c[b+8>>2]|0)==1?(c[b+64>>2]|0)!=0&(e|0)==0:0){c[k+24>>2]=12566463;i=f;return}if((pA(a,g,h,j)|0)==0){l=-1}else{l=c[h>>2]<<8|c[g>>2]|c[j>>2]<<16}c[k+24>>2]=l;i=f;return}function JC(a){a=a|0;c[a>>2]=0;g[a+4>>2]=1.0;g[a+12>>2]=0.0;g[a+8>>2]=0.0;c[a+32>>2]=0;g[a+28>>2]=1.0;g[a+16>>2]=1.0;g[a+24>>2]=0.0;g[a+20>>2]=0.0;g[a+48>>2]=1.0;g[a+36>>2]=1.0;g[a+44>>2]=0.0;g[a+40>>2]=0.0;return}function KC(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=a+0|0;f=b+0|0;b=e+52|0;do{c[e>>2]=c[f>>2];e=e+4|0;f=f+4|0}while((e|0)<(b|0));f=c[a>>2]|0;if((f|0)==0){i=d;return}e=c[f+4>>2]|0;if((e|0)==0){i=d;return}f=IG(e)|0;c[a>>2]=SA(f,c[(c[a>>2]|0)+96>>2]|0)|0;i=d;return}function LC(a){a=a|0;var b=0,d=0,e=0;b=i;if((a|0)==0){i=b;return}d=c[a+4>>2]|0;if((d|0)==0){i=b;return}e=IG(d)|0;mB(e,c[a+96>>2]|0);i=b;return}function MC(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=uy(a)|0;a=c[e>>2]|0;if((a|0)!=0?(f=c[a+4>>2]|0,(f|0)!=0):0){a=IG(f)|0;mB(a,c[(c[e>>2]|0)+96>>2]|0)}c[e>>2]=b;i=d;return}function NC(b){b=b|0;var c=0,d=0,e=0,f=0,h=0,j=0,k=0;c=i;d=b+76|0;e=b+64|0;f=b+84|0;h=b+80|0;j=b+72|0;k=b+68|0;f3a(b|0,0,136)|0;a[b+0>>0]=a[35584>>0]|0;a[b+1>>0]=a[35585>>0]|0;a[b+2>>0]=a[35586>>0]|0;a[b+3>>0]=a[35587>>0]|0;a[b+4>>0]=a[35588>>0]|0;a[b+5>>0]=a[35589>>0]|0;a[b+6>>0]=a[35590>>0]|0;g[b+48>>2]=1.0;g[b+52>>2]=1.0;g[b+128>>2]=1.0;g[d>>2]=1.0;g[e>>2]=1.0;g[f>>2]=0.0;g[h>>2]=0.0;g[j>>2]=0.0;g[k>>2]=0.0;i=c;return}function OC(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;g[a+76>>2]=1.0;g[a+64>>2]=1.0;g[a+84>>2]=0.0;g[a+80>>2]=0.0;g[a+72>>2]=0.0;g[a+68>>2]=0.0;c3a(a|0,b|0,136)|0;e=c[b+60>>2]|0;if((e|0)==0){i=d;return}b=c[e>>2]|0;if((b|0)==0){i=d;return}e=JG(b)|0;if((e|0)==0){i=d;return}c[a+60>>2]=kM(e,c[a+56>>2]|0)|0;i=d;return}function PC(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+60>>2]|0;if(((d|0)!=0?(e=c[d>>2]|0,(e|0)!=0):0)?(d=JG(e)|0,(d|0)!=0):0){EM(d,c[a+56>>2]|0)}i=b;return}function QC(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=d+4|0;g=c[f>>2]|0;if((g|0)>15){i=e;return}c3a(b|0,c[d>>2]|0,g|0)|0;a[b+(c[f>>2]|0)>>0]=0;g=$ka(d)|0;do{if((g|0)==1215653120){h=21}else if((g|0)==1147236971){h=4}else if((g|0)==1281976168){h=5}else if((g|0)==1399026277){h=2}else if((g|0)==1333159282){h=3}else if((g|0)==1131375727){d=c[f>>2]|0;if((d|0)==10){h=6}else{h=(d|0)==9?7:23}}else if((g|0)==1399809652){h=9}else if((g|0)==1299541108){h=1}else if((g|0)==1282764137){h=24}else if((g|0)==1398895733){h=22}else if((g|0)==1147758182){h=10}else if((g|0)==1165517676){h=11}else if((g|0)==1214345828){h=8}else{h=0}}while(0);c[b+16>>2]=h;i=e;return}function RC(a){a=a|0;var b=0,c=0,d=0;b=i;c=_ka(a)|0;if((c|0)==1398895733){d=2}else if((c|0)==1096971119){d=1}else if((c|0)==1348825699){d=3}else{d=0}i=b;return d|0}function SC(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=RC(b)|0;c[(ky(a)|0)+88>>2]=e;i=d;return}function TC(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+4|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;g[a+36>>2]=1.0;g[a+24>>2]=1.0;g[a+44>>2]=0.0;g[a+40>>2]=0.0;g[a+32>>2]=0.0;g[a+28>>2]=0.0;g[a+60>>2]=1.0;g[a+48>>2]=1.0;g[a+68>>2]=0.0;g[a+64>>2]=0.0;g[a+56>>2]=0.0;g[a+52>>2]=0.0;g[a+84>>2]=1.0;g[a+72>>2]=1.0;d=a+88|0;g[a+80>>2]=0.0;g[a+76>>2]=0.0;e=a+120|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;c[d+24>>2]=0;c[d+28>>2]=0;g[e>>2]=1.0;i=b;return}function UC(a){a=a|0;var b=0;b=i;dm(a);i=b;return}function VC(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;sC(a,b);e=a+24|0;f=b+24|0;c[e+0>>2]=c[f+0>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];c[e+16>>2]=c[f+16>>2];c[e+20>>2]=c[f+20>>2];f=a+72|0;e=b+72|0;c[f+0>>2]=c[e+0>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];c[f+12>>2]=c[e+12>>2];c[f+16>>2]=c[e+16>>2];c[f+20>>2]=c[e+20>>2];e=a+48|0;f=b+48|0;c[e+0>>2]=c[f+0>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];c[e+16>>2]=c[f+16>>2];c[e+20>>2]=c[f+20>>2];g[a+96>>2]=+g[b+96>>2];g[a+100>>2]=+g[b+100>>2];g[a+104>>2]=+g[b+104>>2];g[a+108>>2]=+g[b+108>>2];g[a+112>>2]=+g[b+112>>2];g[a+116>>2]=+g[b+116>>2];g[a+120>>2]=+g[b+120>>2];i=d;return}function WC(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,h=0;e=i;f=Xl(a+8|0)|0;g[f+12>>2]=d;a=b+16|0;hJa(f,c[a>>2]|0);if((c[a>>2]|0)==0){i=e;return}h=f+8|0;f=0;do{d=+DH(b,f);g[(c[h>>2]|0)+(f<<2)>>2]=d;f=f+1|0}while(f>>>0<(c[a>>2]|0)>>>0);i=e;return}function XC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0.0;e=i;i=i+80|0;f=e+68|0;h=e+64|0;j=e+60|0;k=e+56|0;l=e+48|0;m=e+40|0;n=e+36|0;o=e+32|0;p=e+24|0;q=e+16|0;r=e+8|0;s=e;t=a+20|0;u=ky(t)|0;v=YH(b)|0;c[f>>2]=v;if((v|0)==0){w=u+64|0;x=a+48|0;c[w+0>>2]=c[x+0>>2];c[w+4>>2]=c[x+4>>2];c[w+8>>2]=c[x+8>>2];c[w+12>>2]=c[x+12>>2];c[w+16>>2]=c[x+16>>2];c[w+20>>2]=c[x+20>>2];i=e;return}v=a+8|0;y=a+16|0;z=l+4|0;A=u+56|0;B=u+16|0;C=d+12|0;D=u+20|0;E=u+24|0;F=d+736|0;G=u+48|0;H=u+52|0;I=u+104|0;J=q+4|0;K=u+108|0;L=u+112|0;M=r+4|0;N=u+116|0;O=s+4|0;P=u+120|0;Q=u+124|0;R=u+128|0;S=u+132|0;T=u+92|0;U=u+96|0;V=u+100|0;do{c[h>>2]=0;W=ZH(b,f,h)|0;a:do{if((W|0)!=0?(X=oH(W)|0,(X|0)!=0):0){Y=_ka(h)|0;do{if((Y|0)==1414672896){Z=17}else if((Y|0)==1330642944){c[I>>2]=jH(X)|0;c[q>>2]=35600;c[J>>2]=2;if((nI(b,q)|0)!=0){break a}c[K>>2]=jH(X)|0;break a}else if((Y|0)==1330662656){c[L>>2]=jH(X)|0;break a}else if((Y|0)==1111962112){Z=36}else if((Y|0)==1111949312){c[r>>2]=35608;c[M>>2]=3;if((nI(b,r)|0)==0){Z=36}else{break a}}else if((Y|0)==1140850688){if((c[X>>2]|0)!=5){break a}_=MH(X,0)|0;if((_|0)==0){break a}WC(a,_,+DH(X,1));break a}else if((Y|0)==1280770048){$=+hH(X);g[(Xl(v)|0)+24>>2]=$;break a}else if((Y|0)==1430475264){c[s>>2]=35616;c[O>>2]=4;if((nI(b,s)|0)==0){Z=38}else{break a}}else if((Y|0)==1279459328){_=jH(X)|0;c[(Xl(v)|0)>>2]=_;break a}else if((Y|0)==1128333312){g[G>>2]=+xL(+hH(X));break a}else if((Y|0)==1397555200){g[S>>2]=+hH(X);break a}else if((Y|0)==1396768768){c[T>>2]=jH(X)|0;break a}else if((Y|0)==1095324416){c[U>>2]=jH(X)|0;break a}else if((Y|0)==1869611008){c[K>>2]=jH(X)|0;break a}else if((Y|0)==1667301376){g[H>>2]=+xL(+hH(X));break a}else if((Y|0)==1296826368){$=+hH(X);g[(Xl(v)|0)+20>>2]=$;break a}else if((Y|0)==1380515840){dH(j,X);SC(t,j);dka(j);break a}else if((Y|0)==1414201344){c[V>>2]=jH(X)|0;break a}else if((Y|0)==1181707892){if((c[X>>2]|0)!=5){break a}$=+DH(X,1);g[(uy(y)|0)+4>>2]=$;HH(k,X,0);MC(y,aF(d,k)|0);dka(k);break a}else if((Y|0)==1112342528){c[m>>2]=0;if((c[X>>2]|0)==5){HH(n,X,0);ika(m,n);dka(n)}else{dH(o,X);ika(m,o);dka(o)}oe(p,m);QC(u,p);if((c[B>>2]|0)>1){c[(c[C>>2]|0)+64>>2]=1}dka(m);break a}else if((Y|0)==1414660096){c[l>>2]=35592;c[z>>2]=3;if((nI(b,l)|0)==0){Z=17}else{break a}}else if((Y|0)==1430475314){Z=38}else if((Y|0)==1213464576){c[Q>>2]=X;break a}else if((Y|0)==1179385856){g[R>>2]=+hH(X);break a}else if((Y|0)==1397580147){if((c[X>>2]|0)==6){c[D>>2]=X;_=(c[F>>2]|0)+48|0;c[E+0>>2]=c[_+0>>2];c[E+4>>2]=c[_+4>>2];c[E+8>>2]=c[_+8>>2];c[E+12>>2]=c[_+12>>2];c[E+16>>2]=c[_+16>>2];c[E+20>>2]=c[_+20>>2];break a}else{c[D>>2]=0;break a}}else if((Y|0)==1279918080){_=jH(X)|0;c[(Xl(v)|0)+16>>2]=_;break a}else{break a}}while(0);if((Z|0)==17){Z=0;if((c[X>>2]|0)==4){c[A>>2]=0;break}else{c[A>>2]=X;break}}else if((Z|0)==36){Z=0;c[N>>2]=X;break}else if((Z|0)==38){Z=0;c[P>>2]=X;break}}}while(0);dka(h)}while((c[f>>2]|0)!=0);w=u+64|0;x=a+48|0;c[w+0>>2]=c[x+0>>2];c[w+4>>2]=c[x+4>>2];c[w+8>>2]=c[x+8>>2];c[w+12>>2]=c[x+12>>2];c[w+16>>2]=c[x+16>>2];c[w+20>>2]=c[x+20>>2];i=e;return}function YC(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=a+4|0;c[e>>2]=0;ika(e,b+4|0);e=c[b+8>>2]|0;c[a+8>>2]=e;f=c[b+12>>2]|0;if((e|0)==2){c[a+12>>2]=pH(f,0)|0;i=d;return}else{c[a+12>>2]=f;i=d;return}}function ZC(a){a=a|0;var b=0,d=0;b=i;if((c[a+8>>2]|0)==2?(d=c[a+12>>2]|0,(d|0)!=0):0){bH(d)}dka(a+4|0);i=b;return}function _C(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=a+4|0;Ija(e,16);a=b+8|0;if((c[a>>2]|0)<=0){i=d;return}f=b+4|0;b=0;do{$C(e,aD(f,b)|0);b=b+1|0}while((b|0)<(c[a>>2]|0));i=d;return}function $C(a,b){a=a|0;b=b|0;var d=0;d=i;YC(Nja(a,c[a+4>>2]|0)|0,b);i=d;return}function aD(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((c[a+4>>2]|0)>(b|0)){e=Pja(a,b)|0;i=d;return e|0}else{_a(756992,35624,633,757056)}return 0}function bD(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;g=cD(a+4|0)|0;ika(g+4|0,b);if((d|0)==0){i=f;return}b=(e|0)!=0;if(b){h=pH(d,0)|0}else{h=d}c[g+8>>2]=b?2:1;c[g+12>>2]=h;i=f;return}function cD(a){a=a|0;var b=0,d=0;b=i;d=Nja(a,c[a+4>>2]|0)|0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return d|0}function dD(a){a=a|0;var b=0,d=0;b=i;d=c[a+8>>2]|0;if((d|0)==0){i=b;return}eD(a+4|0,d+ -1|0);i=b;return}function eD(a,b){a=a|0;b=b|0;var d=0;d=i;if((c[a+4>>2]|0)>(b|0)){ZC(Pja(a,b)|0);Oja(a,b);i=d;return}else{_a(756992,35624,644,35696)}}function fD(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[b>>2]|0;if((e|0)!=0){f=e+12|0;c[f>>2]=(c[f>>2]|0)+1}f=c[a>>2]|0;if((f|0)!=0?(e=f+12|0,c[e>>2]=(c[e>>2]|0)+ -1,e=c[a>>2]|0,!((c[e+12>>2]|0)>0|(e|0)==0)):0){PIa(c[e+4>>2]|0);v2a(e)}c[a>>2]=c[b>>2];i=d;return}function gD(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[b>>2]|0;if((e|0)!=0){f=e+136|0;c[f>>2]=(c[f>>2]|0)+1}f=c[a>>2]|0;if((f|0)!=0?(e=f+136|0,c[e>>2]=(c[e>>2]|0)+ -1,e=c[a>>2]|0,!((c[e+136>>2]|0)>0|(e|0)==0)):0){PC(e);v2a(e)}c[a>>2]=c[b>>2];i=d;return}function hD(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[b>>2]|0;if((e|0)!=0){f=e+28|0;c[f>>2]=(c[f>>2]|0)+1}f=c[a>>2]|0;if((f|0)!=0?(e=f+28|0,c[e>>2]=(c[e>>2]|0)+ -1,e=c[a>>2]|0,!((c[e+28>>2]|0)>0|(e|0)==0)):0){km(e);v2a(e)}c[a>>2]=c[b>>2];i=d;return}function iD(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[b>>2]|0;if((e|0)!=0){f=e+28|0;c[f>>2]=(c[f>>2]|0)+1}f=c[a>>2]|0;if((f|0)!=0?(e=f+28|0,c[e>>2]=(c[e>>2]|0)+ -1,e=c[a>>2]|0,!((c[e+28>>2]|0)>0|(e|0)==0)):0){gJa(c[e+8>>2]|0);v2a(e)}c[a>>2]=c[b>>2];i=d;return}function jD(a){a=a|0;var b=0,d=0;b=i;d=a+8|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[a+48>>2]=0;c[a>>2]=35720;g[a+68>>2]=1.0;g[a+56>>2]=1.0;g[a+76>>2]=0.0;g[a+72>>2]=0.0;g[a+64>>2]=0.0;g[a+60>>2]=0.0;c[a+52>>2]=0;c[a+28>>2]=3;i=b;return}function kD(a){a=a|0;var b=0;b=i;lD(a);v2a(a);i=b;return}function lD(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;c[a>>2]=35720;d=a+52|0;e=c[d>>2]|0;if((e|0)==0){$l(a);i=b;return}do{if((c[e+16>>2]|0)==0){f=c[e+12>>2]|0;if((f|0)!=0?(c[f+4>>2]|0)==0:0){break}f=IG(c[e+40>>2]|0)|0;sB(f,c[(c[d>>2]|0)+12>>2]|0);$l(a);i=b;return}}while(0);tD(e);v2a(e);$l(a);i=b;return}function mD(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=a+52|0;f=c[e>>2]|0;if((f|0)!=0){nD(f)}c[e>>2]=oD(c[b+52>>2]|0)|0;e=a+56|0;a=b+56|0;c[e+0>>2]=c[a+0>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[e+12>>2]=c[a+12>>2];c[e+16>>2]=c[a+16>>2];c[e+20>>2]=c[a+20>>2];i=d;return}function nD(a){a=a|0;var b=0,d=0;b=i;if((c[a+16>>2]|0)==0){d=c[a+12>>2]|0;if((d|0)==0){i=b;return}if((c[d+4>>2]|0)!=0|(a|0)==0){i=b;return}}tD(a);v2a(a);i=b;return}function oD(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+12|0;e=c[d>>2]|0;if((c[e+4>>2]|0)!=0){f=IG(c[a+40>>2]|0)|0;g=aB(f,c[d>>2]|0)|0;i=b;return g|0}d=u2a(48)|0;c[d+40>>2]=c[a+40>>2];c[d+44>>2]=0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;f=pH(e,0)|0;e=a+16|0;rD(d,f,c[e>>2]|0);if((c[e>>2]|0)==0){g=d;i=b;return g|0}c[d+20>>2]=pH(c[a+20>>2]|0,1)|0;g=d;i=b;return g|0}function pD(a,b){a=a|0;b=b|0;var c=0;c=i;Wla(a+56|0,b);qD(a);i=c;return}function qD(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;b=i;c=a+44|0;g[c>>2]=0.0;d=a+32|0;g[d>>2]=0.0;e=a+40|0;g[e>>2]=1.0;f=a+36|0;g[f>>2]=1.0;Lla(a+56|0,d,f,e,c);i=b;return}function rD(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;i=i+48|0;f=e+40|0;g=e+32|0;h=e+24|0;j=e+16|0;k=e+8|0;l=e;c[a+12>>2]=b;m=a+16|0;if((c[m>>2]|0)!=0?(n=a+20|0,o=c[n>>2]|0,(o|0)!=0):0){bH(o);c[n>>2]=0}c[m>>2]=d;m=c[b+12>>2]|0;if((d|0)!=0){c[a+20>>2]=pH(m,0)|0}c[f>>2]=39424;c[f+4>>2]=2;c[a+44>>2]=iI(m,f)|0;c[g>>2]=39808;c[g+4>>2]=10;if((nI(m,g)|0)==0){p=1}else{c[h>>2]=39792;c[h+4>>2]=9;p=(eI(m,h)|0)!=0}c[a+32>>2]=p&1;c[j>>2]=37072;c[j+4>>2]=11;c[a+36>>2]=eI(m,j)|0;c[k>>2]=39736;c[k+4>>2]=6;c[a+24>>2]=eI(m,k)|0;c[l>>2]=1280896;c[l+4>>2]=5;c[a+28>>2]=eI(m,l)|0;i=e;return}function sD(a,b){a=a|0;b=b|0;var d=0;d=i;c[a+40>>2]=b;c[a+44>>2]=0;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;i=d;return}function tD(a){a=a|0;var b=0,d=0;b=i;if((c[a+16>>2]|0)==0){i=b;return}d=c[a+12>>2]|0;if((d|0)!=0){bH(d)}d=c[a+20>>2]|0;if((d|0)==0){i=b;return}bH(d);i=b;return}function uD(a){a=a|0;var b=0,d=0,e=0;b=i;g[a+36>>2]=1.0;g[a+24>>2]=1.0;d=a+40|0;g[a+32>>2]=0.0;g[a+28>>2]=0.0;e=a+64|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;Wy(e);c[a+740>>2]=0;Ija(a+744|0,4);c[a+804>>2]=0;gla(a+812|0);gla(a+828|0);Ija(a+892|0,4);g[a+764>>2]=0.0;c[a+736>>2]=0;c[a+760>>2]=0;c[a+772>>2]=0;c[a+800>>2]=0;c[a+780>>2]=0;c[a+776>>2]=0;g[a+796>>2]=0.0;g[a+792>>2]=0.0;e=a+860|0;c[a+724>>2]=0;c[a+720>>2]=0;c[a+728>>2]=0;c[a+844>>2]=0;c[a+848>>2]=0;c[a+808>>2]=0;d=a+852|0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+20>>2]=0;c[e+24>>2]=0;c[e+28>>2]=0;c[d>>2]=1;c[a+8>>2]=0;i=b;return}function vD(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;wD(a);d=a+892|0;e=a+896|0;if((c[e>>2]|0)>0){f=0;do{g=c[(Hg(d,f)|0)>>2]|0;if((g|0)!=0){UC(g);v2a(g)}f=f+1|0}while((f|0)<(c[e>>2]|0))}e=c[a+772>>2]|0;if((e|0)!=0){v2a(e)}e=c[a+736>>2]|0;if((e|0)!=0){UC(e);v2a(e)}e=c[a+844>>2]|0;if((e|0)!=0){bH(e)}e=c[a+848>>2]|0;if((e|0)!=0){bH(e)}Jja(c[d>>2]|0);ila(c[a+832>>2]|0);ila(c[a+816>>2]|0);dka(a+804|0);Jja(c[a+744>>2]|0);nm(a+740|0);i=b;return}function wD(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;d=a+720|0;e=a+724|0;f=c[e>>2]|0;if((f|0)==0){c[d>>2]=0;c[e>>2]=0;i=b;return}g=f;f=0;h=c[d>>2]|0;while(1){if((c[a+(h*40|0)+80>>2]|0)==0?(j=c[a+(h*40|0)+84>>2]|0,(j|0)!=0):0){bH(j);k=c[e>>2]|0}else{k=g}j=h+1|0;f=f+1|0;if(!(f>>>0<k>>>0)){break}else{g=k;h=(j|0)==16?0:j}}c[d>>2]=0;c[e>>2]=0;i=b;return}function xD(a,b,d,e,f,g,h,j,k,l,m){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0;n=i;o=a+864|0;c[o+0>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[o+16>>2]=0;c[o+20>>2]=0;c[a>>2]=b;c[a+4>>2]=d;c[a+8>>2]=e;if((f|0)!=0){b=a+24|0;c[b+0>>2]=c[f+0>>2];c[b+4>>2]=c[f+4>>2];c[b+8>>2]=c[f+8>>2];c[b+12>>2]=c[f+12>>2];c[b+16>>2]=c[f+16>>2];c[b+20>>2]=c[f+20>>2]}if((k|0)!=0){f=a+64|0;c[f+0>>2]=c[k+0>>2];c[f+4>>2]=c[k+4>>2];c[f+8>>2]=c[k+8>>2];c[f+12>>2]=c[k+12>>2]}c[a+12>>2]=g;if((h|0)==0){p=(e|0)==0?d:e}else{p=h}c[a+16>>2]=p;if((j|0)!=0){p=a+48|0;c[p+0>>2]=c[j+0>>2];c[p+4>>2]=c[j+4>>2];c[p+8>>2]=c[j+8>>2];c[p+12>>2]=c[j+12>>2]}c[a+20>>2]=m;m=u2a(124)|0;TC(m);j=a+736|0;c[j>>2]=m;if((l|0)==0){yD(m+20|0);zD((c[j>>2]|0)+8|0);AD((c[j>>2]|0)+16|0);qC((c[j>>2]|0)+12|0)|0;i=n;return}else{VC(m,l);i=n;return}}function yD(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;if((d|0)!=0){e=d+136|0;c[e>>2]=(c[e>>2]|0)+ -1;e=c[a>>2]|0;if(!((c[e+136>>2]|0)>0|(e|0)==0)){PC(e);v2a(e)}c[a>>2]=0}e=u2a(140)|0;NC(e);c[a>>2]=e;if((e|0)==0){i=b;return}c[e+136>>2]=1;i=b;return}function zD(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;if((d|0)!=0){e=d+28|0;c[e>>2]=(c[e>>2]|0)+ -1;e=c[a>>2]|0;if(!((c[e+28>>2]|0)>0|(e|0)==0)){gJa(c[e+8>>2]|0);v2a(e)}c[a>>2]=0}e=u2a(32)|0;dJa(e);c[a>>2]=e;if((e|0)==0){i=b;return}c[e+28>>2]=1;i=b;return}function AD(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;if((d|0)!=0){e=d+52|0;c[e>>2]=(c[e>>2]|0)+ -1;e=c[a>>2]|0;if(!((c[e+52>>2]|0)>0|(e|0)==0)){LC(c[e>>2]|0);v2a(e)}c[a>>2]=0}e=u2a(56)|0;JC(e);c[a>>2]=e;if((e|0)==0){i=b;return}c[e+52>>2]=1;i=b;return}function BD(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;d=a+724|0;e=c[d>>2]|0;f=a+720|0;g=c[f>>2]|0;if((e|0)!=16){h=g+e|0;c[d>>2]=e+1;j=(h|0)>15?h+ -16|0:h;i=b;return j|0}h=g+1|0;g=(h|0)==16?0:h;c[f>>2]=g;if((c[a+(g*40|0)+80>>2]|0)!=0){j=g;i=b;return j|0}h=c[a+(g*40|0)+84>>2]|0;if((h|0)==0){j=g;i=b;return j|0}bH(h);j=c[f>>2]|0;i=b;return j|0}function CD(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;i=i+32|0;f=e+24|0;g=e+16|0;h=e+8|0;j=e;k=BD(a)|0;l=a+(k*40|0)+80|0;if((d|0)>32){c[l>>2]=0;yF(g,b,d);sL(f,g);c[a+(k*40|0)+84>>2]=nv(f)|0;dka(f);i=e;return}c[l>>2]=4;if((P2a(b,35,d)|0)==0){c3a(a+(k*40|0)+88|0,b|0,d|0)|0;c[a+(k*40|0)+84>>2]=d;i=e;return}yF(j,b,d);sL(h,j);j=c[h>>2]|0;if((j|0)==0){m=0}else{d=j+4|0;c3a(a+(k*40|0)+88|0,j+12|0,c[d>>2]|0)|0;m=c[d>>2]|0}c[a+(k*40|0)+84>>2]=m;dka(h);i=e;return}function DD(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;g=BD(a)|0;c[a+(g*40|0)+80>>2]=2;yF(f,b,d);Gna(f,a+(g*40|0)+84|0,a+(g*40|0)+88|0);i=e;return}function ED(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=BD(a)|0;c[a+(e*40|0)+80>>2]=0;c[a+(e*40|0)+84>>2]=b;i=d;return}function FD(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+16|0;e=d;f=c[a+724>>2]|0;if(!(f>>>0>b>>>0)){g=0;i=d;return g|0}h=f-b+(c[a+720>>2]|0)|0;b=h+ -1|0;f=(b|0)>15?h+ -17|0:b;b=a+(f*40|0)+80|0;h=c[b>>2]|0;if((h|0)==0){g=c[a+(f*40|0)+84>>2]|0;i=d;return g|0}else if((h|0)==2){j=a+(f*40|0)+84|0;k=GD(c[j>>2]|0,a+(f*40|0)+88|0)|0;c[b>>2]=0;c[j>>2]=k;g=k;i=d;return g|0}else if((h|0)==4){h=a+(f*40|0)+84|0;eka(e,a+(f*40|0)+88|0,c[h>>2]|0);f=nv(e)|0;dka(e);c[b>>2]=0;c[h>>2]=f;g=f;i=d;return g|0}else{g=0;i=d;return g|0}return 0}function GD(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=u2a(20)|0;yH(d,a,b);i=c;return d|0}function HD(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=c[b+724>>2]|0;if(!(f>>>0>d>>>0)){c[a>>2]=0;i=e;return}g=f-d+(c[b+720>>2]|0)|0;d=g+ -1|0;f=(d|0)>15?g+ -17|0:d;d=c[b+(f*40|0)+80>>2]|0;if((d|0)==4){eka(a,b+(f*40|0)+88|0,c[b+(f*40|0)+84>>2]|0);i=e;return}else if((d|0)==0){h=5}if((h|0)==5?(h=c[b+(f*40|0)+84>>2]|0,(h|0)!=0):0){dH(a,h);i=e;return}c[a>>2]=0;i=e;return}function ID(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0.0;d=i;e=c[a+724>>2]|0;do{if(e>>>0>b>>>0){f=e-b+(c[a+720>>2]|0)|0;h=f+ -1|0;j=(h|0)>15?f+ -17|0:h;h=c[a+(j*40|0)+80>>2]|0;if((h|0)==0){f=c[a+(j*40|0)+84>>2]|0;if((f|0)==0){k=0.0;break}k=+hH(f);break}else if((h|0)!=2){k=0.0;break}h=a+(j*40|0)+88|0;if((c[a+(j*40|0)+84>>2]|0)==0){k=+g[h>>2];break}else{k=+(c[h>>2]|0);break}}else{k=0.0}}while(0);i=d;return+k}function JD(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=i;h=a+736|0;gD(b+24|0,(c[h>>2]|0)+20|0);Yy(b+8|0,(c[h>>2]|0)+4|0);xF(b+48|0,a+740|0);if((d|0)!=0){hD(b+16|0,(c[h>>2]|0)+12|0)}if((f|0)!=0){iD(b+12|0,(c[h>>2]|0)+8|0)}if((e|0)==0){i=g;return}Xy(b+20|0,(c[h>>2]|0)+16|0);i=g;return}function KD(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=i;g=0;h=0;while(1){j=a[e+g>>0]|0;if(j<<24>>24==0){k=g;l=h;m=5;break}n=(j<<24>>24)+(h<<8)|0;g=g+1|0;if((g|0)>=4){o=n;break}else{h=n}}if((m|0)==5){while(1){m=0;h=l<<8;k=k+1|0;if((k|0)==4){o=h;break}else{l=h;m=5}}}l=72;k=0;a:while(1){h=l;while(1){p=(h+k|0)/2|0;g=c[35736+(p*12|0)>>2]|0;if((o|0)==(g|0)){break a}e=p+ -1|0;if((o-g|0)>=0){break}if((k|0)>(e|0)){m=15;break a}else{h=e}}if((p|0)<(h|0)){l=h;k=p+1|0}else{m=15;break}}if((m|0)==15){q=(c[b+768>>2]|0)!=0&1;i=f;return q|0}m=35740+(p*12|0)|0;p=d[m>>0]|d[m+1>>0]<<8|d[m+2>>0]<<16|d[m+3>>0]<<24;k=m+4|0;m=d[k>>0]|d[k+1>>0]<<8|d[k+2>>0]<<16|d[k+3>>0]<<24;k=b+(m>>1)|0;if((m&1|0)==0){r=p}else{r=c[(c[k>>2]|0)+p>>2]|0}Rc[r&1023](k);q=1;i=f;return q|0}function LD(a){a=a|0;var b=0;b=i;if((c[a+64>>2]|0)!=0){i=b;return}MD(a);ND(a,2,1);i=b;return}function MD(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,h=0;b=i;if((c[a+64>>2]|0)!=0){i=b;return}d=c[a+776>>2]|0;if((d|0)==0){i=b;return}e=+g[a+784>>2];f=+g[a+788>>2];if(!(e!=+g[a+792>>2])?!(f!=+g[a+796>>2]):0){h=(c[a+772>>2]|0)+((d+ -1|0)*12|0)+8|0;d=c[h>>2]|0;if((d|0)==6){i=b;return}c[h>>2]=d|1;i=b;return}QD(a,e,f,3);i=b;return}function ND(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;i=i+48|0;f=e+40|0;h=e+36|0;j=e+32|0;k=e+8|0;l=e;m=a+776|0;n=c[m>>2]|0;o=a+800|0;p=c[o>>2]|0;c[m>>2]=0;c[o>>2]=0;if((n|0)<2){if((n|0)==0|(p|0)==0){i=e;return}c[f>>2]=0;XIa(lE(f)|0,0.0,0.0,0.0,0.0);o=c[a+736>>2]|0;Zy(h,c[f>>2]|0);yC(o+4|0,h,2);qm(h);qm(f);i=e;return}f=n+ -1|0;h=a+772|0;o=(c[(c[h>>2]|0)+(f*12|0)+8>>2]|0)==6?f:n;c[j>>2]=0;n=lE(j)|0;QIa(n,o);c3a(c[n+4>>2]|0,c[h>>2]|0,o*12|0)|0;o=a+736|0;h=(c[o>>2]|0)+48|0;c[k+0>>2]=c[h+0>>2];c[k+4>>2]=c[h+4>>2];c[k+8>>2]=c[h+8>>2];c[k+12>>2]=c[h+12>>2];c[k+16>>2]=c[h+16>>2];c[k+20>>2]=c[h+20>>2];Wla(k,a+24|0);if((d|b|0)!=0){h=u2a(88)|0;_l(h);c[h+60>>2]=d;c[h+56>>2]=b;fD(h+52|0,j);b=h+64|0;c[b+0>>2]=c[k+0>>2];c[b+4>>2]=c[k+4>>2];c[b+8>>2]=c[k+8>>2];c[b+12>>2]=c[k+12>>2];c[b+16>>2]=c[k+16>>2];c[b+20>>2]=c[k+20>>2];JD(a,h,1,0,1);_F(h);uma((c[a+12>>2]|0)+40|0,h)}if((p|0)!=0){if((uF(k)|0)==0){CC(j,k);g[k+12>>2]=1.0;g[k>>2]=1.0;g[k+20>>2]=0.0;g[k+16>>2]=0.0;g[k+8>>2]=0.0;g[k+4>>2]=0.0}k=c[o>>2]|0;Zy(l,c[j>>2]|0);yC(k+4|0,l,p);qm(l)}qm(j);i=e;return}function OD(a){a=a|0;var b=0;b=i;if((c[a+64>>2]|0)!=0){i=b;return}ND(a,2,1);i=b;return}function PD(a){a=a|0;var b=0;b=i;if((c[a+64>>2]|0)!=0){i=b;return}QD(a,+g[a+784>>2],+g[a+788>>2],3);ND(a,1,1);i=b;return}function QD(a,b,d,e){a=a|0;b=+b;d=+d;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=i;g[a+792>>2]=b;g[a+796>>2]=d;if((e|0)==6){g[a+784>>2]=b;g[a+788>>2]=d;h=a+776|0;j=c[h>>2]|0;if((j|0)!=0){k=j+ -1|0;l=a+772|0;m=c[l>>2]|0;if((c[m+(k*12|0)+8>>2]|0)==6){g[m+(k*12|0)>>2]=b;g[(c[l>>2]|0)+(((c[h>>2]|0)+ -1|0)*12|0)+4>>2]=d;i=f;return}else{n=j}}else{n=0}}else{j=c[a+776>>2]|0;if((j|0)==0){i=f;return}else{n=j}}j=a+776|0;h=n+1|0;c[j>>2]=h;l=a+780|0;k=c[l>>2]|0;if((n|0)<(k|0)){o=h;p=c[a+772>>2]|0}else{m=n+257|0;n=w2a(m,12)|0;q=a+772|0;if((k|0)==0){r=h}else{h=c[q>>2]|0;c3a(n|0,h|0,k*12|0)|0;v2a(h);r=c[j>>2]|0}c[q>>2]=n;c[l>>2]=m;o=r;p=n}n=a+772|0;c[p+((o+ -1|0)*12|0)+8>>2]=e;g[(c[n>>2]|0)+(((c[j>>2]|0)+ -1|0)*12|0)>>2]=b;g[(c[n>>2]|0)+(((c[j>>2]|0)+ -1|0)*12|0)+4>>2]=d;i=f;return}function RD(a){a=a|0;var b=0;b=i;if((c[a+64>>2]|0)!=0){i=b;return}ND(a,1,1);i=b;return}function SD(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;i=i+32|0;d=b+16|0;e=b+8|0;f=b;if((c[a+68>>2]|0)==0){i=b;return}HD(d,a,1);g=FD(a,0)|0;do{if((g|0)!=0){h=c[g>>2]|0;if((h|0)==4){c[e>>2]=36616;c[e+4>>2]=10;dH(f,g);j=TD(a,e,f)|0;dka(f);if((j|0)==0){break}k=c[j>>2]|0;l=0;m=j}else{k=h;l=1;m=g}if((k|0)==6){bD(UD(a+740|0)|0,d,m,l)}}}while(0);dka(d);i=b;return}function TD(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;i=i+32|0;f=e+16|0;g=e+8|0;h=e;j=c[a+16>>2]|0;do{if((j|0)!=0){k=a+4|0;l=(j|0)==(c[k>>2]|0);m=iI(j,b)|0;n=(m|0)==0;if(l){if(n){o=0;break}oe(f,d);o=$H(m,f)|0;break}if(!n){oe(h,d);o=$H(m,h)|0;break}m=c[k>>2]|0;if((m|0)!=0?(k=iI(m,b)|0,(k|0)!=0):0){oe(g,d);o=$H(k,g)|0}else{o=0}}else{o=0}}while(0);i=e;return o|0}function UD(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=c[a>>2]|0;if((d|0)==0){e=u2a(24)|0;Ija(e+4|0,16);c[a>>2]=e;if((e|0)==0){f=e}else{c[e+20>>2]=1;f=e}}else{e=d+20|0;g=c[e>>2]|0;if((g|0)>1){c[e>>2]=g+ -1;g=c[a>>2]|0;c[a>>2]=0;e=u2a(24)|0;_C(e,g);c[a>>2]=e;if((e|0)==0){f=e}else{c[e+20>>2]=1;f=e}}else{f=d}}i=b;return f|0}function VD(a){a=a|0;var b=0,d=0;b=i;i=i+16|0;d=b;if((c[a+68>>2]|0)==0){i=b;return}HD(d,a,0);bD(UD(a+740|0)|0,d,0,0);dka(d);i=b;return}function WD(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;b=i;i=i+96|0;d=b+84|0;e=b+80|0;f=b+72|0;g=b+64|0;h=b+56|0;j=b+48|0;k=b+40|0;l=b+32|0;m=b+24|0;n=b+20|0;o=b+16|0;p=b+8|0;q=b;r=c[a>>2]|0;if((r|0)==5){s=a+16|0;if((c[s>>2]|0)==0){i=b;return}t=p+4|0;u=q+4|0;v=0;do{w=FH(a,v)|0;if((c[w>>2]|0)==4){dH(o,w);oe(q,o);XD(p,36776,22,c[q>>2]|0,c[u>>2]|0);if((c[t>>2]|0)!=0){OH(a,v,YD(p)|0)}dka(o)}else{WD(w)}v=v+1|0}while(v>>>0<(c[s>>2]|0)>>>0);i=b;return}else if((r|0)==6){r=YH(a)|0;c[d>>2]=r;if((r|0)==0){i=b;return}r=f+4|0;s=k+4|0;v=g+4|0;o=l+4|0;do{c[e>>2]=0;p=ZH(a,d,e)|0;oe(g,e);XD(f,36632,18,c[g>>2]|0,c[v>>2]|0);if((c[r>>2]|0)!=0){oe(h,e);rI(a,h,f);kka(e,f)}if((c[p>>2]|0)==4){dH(j,p);oe(l,j);XD(k,36776,22,c[l>>2]|0,c[o>>2]|0);c[f>>2]=c[k>>2];t=c[s>>2]|0;c[r>>2]=t;if((t|0)!=0){oe(m,e);jka(n,f);tI(a,m,n);dka(n)}dka(j)}else{WD(p)}dka(e)}while((c[d>>2]|0)!=0);i=b;return}else{i=b;return}}function XD(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;a:do{if((d|0)>0){h=0;while(1){j=h|1;if((c[b+(j<<3)+4>>2]|0)==(f|0)?(Q2a(e,c[b+(j<<3)>>2]|0,f)|0)==0:0){break}j=h+2|0;if((j|0)<(d|0)){h=j}else{break a}}yF(a,c[b+(h<<3)>>2]|0,c[b+(h<<3)+4>>2]|0);i=g;return}}while(0);c[a>>2]=0;c[a+4>>2]=0;i=g;return}function YD(a){a=a|0;var b=0,c=0;b=i;c=u2a(16)|0;wF(c,a);i=b;return c|0}function ZD(a){a=a|0;var b=0,d=0;b=i;d=a+736|0;Tla((c[d>>2]|0)+24|0,1.0,0.0,0.0,1.0,0.0,0.0);_D(a);g[(c[d>>2]|0)+96>>2]=0.0;g[(c[d>>2]|0)+100>>2]=0.0;g[(c[d>>2]|0)+104>>2]=0.0;g[(c[d>>2]|0)+108>>2]=0.0;i=b;return}function _D(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0;b=i;i=i+32|0;d=b;e=a+736|0;f=c[e>>2]|0;g[d>>2]=+g[f+120>>2];h=d+4|0;g[h>>2]=0.0;j=d+8|0;g[j>>2]=0.0;k=d+12|0;g[k>>2]=1.0;g[d+16>>2]=0.0;g[d+20>>2]=0.0;Wla(d,f+24|0);Wla(d,(c[e>>2]|0)+48|0);Wla(d,a+24|0);a=uy((c[e>>2]|0)+16|0)|0;g[a+16>>2]=+g[d>>2];g[a+20>>2]=+g[j>>2];g[a+24>>2]=+g[h>>2];g[a+28>>2]=+g[k>>2];i=b;return}function $D(a){a=a|0;var b=0;b=a+768|0;c[b>>2]=(c[b>>2]|0)+1;return}function aE(a){a=a|0;var b=0,d=0.0;b=i;if((c[a+64>>2]|0)!=0){i=b;return}d=+ID(a,5);QD(a,d,+ID(a,4),4);d=+ID(a,3);QD(a,d,+ID(a,2),4);d=+ID(a,1);QD(a,d,+ID(a,0),4);i=b;return}function bE(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,h=0.0,j=0.0,k=0.0,l=0.0,m=0,n=0;b=i;i=i+32|0;d=b;e=+ID(a,5);f=+ID(a,4);h=+ID(a,3);j=+ID(a,2);k=+ID(a,1);l=+ID(a,0);m=a+736|0;g[d>>2]=e;g[d+4>>2]=f;g[d+8>>2]=h;g[d+12>>2]=j;g[d+16>>2]=k;g[d+20>>2]=l;Wla(d,(c[m>>2]|0)+48|0);n=(c[m>>2]|0)+48|0;c[n+0>>2]=c[d+0>>2];c[n+4>>2]=c[d+4>>2];c[n+8>>2]=c[d+8>>2];c[n+12>>2]=c[d+12>>2];c[n+16>>2]=c[d+16>>2];c[n+20>>2]=c[d+20>>2];_D(a);i=b;return}function cE(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b;if((c[a+64>>2]|0)!=0){i=b;return}HD(d,a,0);e=dE(a,d)|0;if((e|0)!=0){lA((Yl((c[a+736>>2]|0)+12|0)|0)+4|0,e)}dka(d);i=b;return}function dE(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;i=i+80|0;e=d+64|0;f=d+56|0;g=d+48|0;h=d+40|0;j=d+36|0;k=d+32|0;l=d+24|0;m=d+16|0;n=d+8|0;o=d;c[e>>2]=36976;c[e+4>>2]=7;p=c[b>>2]|0;if(vka(p,e)|0){q=Dz(11)|0;i=d;return q|0}c[f>>2]=39864;c[f+4>>2]=10;if((!(vka(p,f)|0)?(c[g>>2]=39896,c[g+4>>2]=10,!(vka(p,g)|0)):0)?(c[h>>2]=39880,c[h+4>>2]=9,!(vka(p,h)|0)):0){c[o>>2]=39808;c[o+4>>2]=10;h=TD(a,o,b)|0;if((h|0)==0){c[a+888>>2]=1;q=0;i=d;return q|0}else{q=VA(c[a>>2]|0,h,0)|0;i=d;return q|0}}eka(j,36984,-1);Fka(k,b,7);uka(j,c[k>>2]|0);dka(k);c[l>>2]=39808;c[l+4>>2]=10;k=TD(a,l,j)|0;do{if((k|0)==0){c[m>>2]=39864;c[m+4>>2]=10;l=c[b>>2]|0;if(vka(l,m)|0){r=Dz(1)|0;break}c[n>>2]=39880;c[n+4>>2]=9;if(vka(l,n)|0){r=Dz(2)|0;break}else{r=Dz(3)|0;break}}else{r=VA(c[a>>2]|0,k,0)|0}}while(0);dka(j);q=r;i=d;return q|0}function eE(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b;if((c[a+64>>2]|0)!=0){i=b;return}HD(d,a,0);e=dE(a,d)|0;if((e|0)!=0){lA((Yl((c[a+736>>2]|0)+12|0)|0)+16|0,e)}dka(d);i=b;return}function fE(a){a=a|0;var b=0,d=0,e=0;b=i;if((c[a+64>>2]|0)!=0){i=b;return}if((FD(a,1)|0)==0){i=b;return}d=mH(FD(a,1)|0)|0;if((d|0)==0){i=b;return}e=c[a+736>>2]|0;WC(e,d,+ID(a,0));i=b;return}function gE(a){a=a|0;var b=0;b=i;g[a+864>>2]=+ID(a,1);g[a+868>>2]=+ID(a,0);c[a+860>>2]=1;i=b;return}function hE(a){a=a|0;var b=0,d=0;b=i;d=0;do{g[a+(d<<2)+864>>2]=+ID(a,5-d|0);d=d+1|0}while((d|0)!=6);c[a+860>>2]=0;i=b;return}function iE(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;b=i;i=i+112|0;d=b+96|0;e=b+88|0;f=b+80|0;g=b+72|0;h=b+64|0;j=b+56|0;k=b+48|0;l=b+40|0;m=b+32|0;n=b+24|0;o=b+16|0;p=b+8|0;q=b;HD(d,a,0);r=a+804|0;if(((wka(c[d>>2]|0,r)|0?(s=c[a+808>>2]|0,(s|0)!=0):0)?(t=c[s+12>>2]|0,(t|0)!=0):0)?(c[t+4>>2]|0)!=0:0){jE(a,0,s,0)|0}else{u=6}a:do{if((u|0)==6){s=a+64|0;if((c[s>>2]|0)!=0){t=c[a+16>>2]|0;if((t|0)==0){break}v=a+4|0;do{if((t|0)==(c[v>>2]|0)){c[e>>2]=36952;c[e+4>>2]=7;w=iI(t,e)|0;if((w|0)==0){break a}oe(f,d);x=_H(w,f)|0;if((x|0)==0){break a}if((c[x>>2]|0)==9){y=x}else{break a}}else{c[g>>2]=36952;c[g+4>>2]=7;x=iI(t,g)|0;if((x|0)!=0){oe(k,d);w=_H(x,k)|0;if((w|0)==0){break a}if((c[w>>2]|0)==9){y=w;break}else{break a}}w=c[v>>2]|0;if((w|0)==0){break a}c[h>>2]=36952;c[h+4>>2]=7;x=iI(w,h)|0;if((x|0)==0){break a}oe(j,d);w=_H(x,j)|0;if((w|0)==0){break a}if((c[w>>2]|0)==9){y=w}else{break a}}}while(0);v=(YG(c[a>>2]|0,c[y+16>>2]|0,l)|0)==0;if(!(v|(c[l>>2]|0)!=0)){break}}c[m>>2]=36952;c[m+4>>2]=7;v=TD(a,m,d)|0;if((v|0)!=0?(c[v>>2]|0)==7:0){t=c[v+12>>2]|0;if((t|0)==0){c[n>>2]=0;c[n+4>>2]=0}else{c[o>>2]=669432;c[o+4>>2]=7;bI(n,t,o)}c[p>>2]=37352;c[p+4>>2]=5;if(Ue(n,p)|0){if((c[s>>2]|0)!=0){break}t=jE(a,v,0,0)|0;ika(r,d);c[a+808>>2]=c[t+52>>2];break}else{c[q>>2]=38280;c[q+4>>2]=4;if(!(Ue(n,q)|0)){break}kE(a,v);break}}c[a+888>>2]=1}}while(0);dka(d);i=b;return}function jE(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;i=i+32|0;h=f;j=(d|0)==0;if((b|0)==0&j){k=0;i=f;return k|0}g[h+12>>2]=1.0;g[h>>2]=1.0;g[h+20>>2]=0.0;g[h+16>>2]=0.0;g[h+8>>2]=0.0;g[h+4>>2]=0.0;l=(c[a+736>>2]|0)+48|0;c[h+0>>2]=c[l+0>>2];c[h+4>>2]=c[l+4>>2];c[h+8>>2]=c[l+8>>2];c[h+12>>2]=c[l+12>>2];c[h+16>>2]=c[l+16>>2];c[h+20>>2]=c[l+20>>2];Wla(h,a+24|0);l=u2a(80)|0;jD(l);do{if(j){if((c[b+4>>2]|0)==0){m=u2a(48)|0;sD(m,c[a>>2]|0);n=l+52|0;c[n>>2]=m;rD(m,b,e);o=c[n>>2]|0;break}else{n=$A(c[a>>2]|0,b)|0;c[l+52>>2]=n;o=n;break}}else{n=IG(c[a>>2]|0)|0;m=aB(n,c[d+12>>2]|0)|0;c[l+52>>2]=m;o=m}}while(0);JD(a,l,c[o+32>>2]|0,0,0);o=l+56|0;c[o+0>>2]=c[h+0>>2];c[o+4>>2]=c[h+4>>2];c[o+8>>2]=c[h+8>>2];c[o+12>>2]=c[h+12>>2];c[o+16>>2]=c[h+16>>2];c[o+20>>2]=c[h+20>>2];qD(l);uma((c[a+12>>2]|0)+40|0,l);k=l;i=f;return k|0}function kE(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;d=i;i=i+1040|0;e=d+1032|0;f=d+1008|0;h=d+1e3|0;j=d+992|0;k=d+976|0;l=d+968|0;m=d+952|0;n=d+944|0;o=d+32|0;p=d+28|0;q=d;r=a+64|0;if((c[a+72>>2]|0)!=0){s=u2a(80)|0;_y(s);t=u2a(80)|0;Sy(t,c[a>>2]|0,c[a+4>>2]|0,b,c[a+16>>2]|0);u=s+52|0;c[u>>2]=t;t=s+56|0;v=a+736|0;w=(c[v>>2]|0)+48|0;c[t+0>>2]=c[w+0>>2];c[t+4>>2]=c[w+4>>2];c[t+8>>2]=c[w+8>>2];c[t+12>>2]=c[w+12>>2];c[t+16>>2]=c[w+16>>2];c[t+20>>2]=c[w+20>>2];Wla(t,a+24|0);TC(o);gD(o+20|0,(c[v>>2]|0)+20|0);iD(o+8|0,(c[v>>2]|0)+8|0);hD(o+12|0,(c[v>>2]|0)+12|0);Xy(o+16|0,(c[v>>2]|0)+16|0);Uy(c[u>>2]|0,o,0,0,r,(c[a+20>>2]|0)+1|0);v=a+12|0;t=(c[v>>2]|0)+64|0;if((c[t>>2]|0)==0?(c[(c[u>>2]|0)+64>>2]|0)!=0:0){c[t>>2]=1}Dy(s);JD(a,s,1,1,1);uma((c[v>>2]|0)+40|0,s);UC(o);i=d;return}s=b+12|0;v=c[s>>2]|0;c[e>>2]=669496;c[e+4>>2]=9;t=iI(v,e)|0;e=c[s>>2]|0;c[h>>2]=1293304;c[h+4>>2]=6;mI(f,e,h);h=a+736|0;Wla(f,(c[h>>2]|0)+48|0);e=c[s>>2]|0;c[j>>2]=1293296;c[j+4>>2]=4;v=jI(e,j)|0;c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[l>>2]=0;if((v|0)!=0){v=c[s>>2]|0;c[n>>2]=1293296;c[n+4>>2]=4;lI(m,v,n);c[k+0>>2]=c[m+0>>2];c[k+4>>2]=c[m+4>>2];c[k+8>>2]=c[m+8>>2];c[k+12>>2]=c[m+12>>2];lE(l)|0;XIa(c[l>>2]|0,+g[k>>2],+g[k+8>>2],+g[k+4>>2],+g[k+12>>2]);CC(l,f);Kla(k,f)}uD(o);xD(o,c[a>>2]|0,c[a+4>>2]|0,c[a+16>>2]|0,a+24|0,c[a+12>>2]|0,t,k,r,c[h>>2]|0,(c[a+20>>2]|0)+1|0);a=o+736|0;h=(c[a>>2]|0)+48|0;c[h+0>>2]=c[f+0>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[h+12>>2]=c[f+12>>2];c[h+16>>2]=c[f+16>>2];c[h+20>>2]=c[f+20>>2];f=c[l>>2]|0;if((f|0)!=0){h=c[a>>2]|0;Zy(p,f);yC(h+4|0,p,2);qm(p)}EI(q);rH(q,b,0,0,0);b=sH(q)|0;if((b|0)!=0){AF(o,vH(q)|0,b,0)|0}FI(q);vD(o);qm(l);i=d;return}function lE(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a>>2]|0;if((d|0)!=0){e=d+12|0;c[e>>2]=(c[e>>2]|0)+ -1;e=c[a>>2]|0;if(!((c[e+12>>2]|0)>0|(e|0)==0)){PIa(c[e+4>>2]|0);v2a(e)}c[a>>2]=0}e=u2a(16)|0;OIa(e);c[a>>2]=e;if((e|0)==0){f=0;i=b;return f|0}c[e+12>>2]=1;f=e;i=b;return f|0}function mE(a){a=a|0;return}function nE(a){a=a|0;return}function oE(a){a=a|0;var b=0,d=0;b=i;if((c[a+68>>2]|0)==0){i=b;return}d=a+740|0;a=c[d>>2]|0;if((a|0)==0){i=b;return}if((c[a+8>>2]|0)==1){pE(d);i=b;return}else{dD(UD(d)|0);i=b;return}}function pE(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;if((d|0)==0){i=b;return}e=d+20|0;c[e>>2]=(c[e>>2]|0)+ -1;e=c[a>>2]|0;if(!((c[e+20>>2]|0)>0|(e|0)==0)){om(e+4|0);v2a(e)}c[a>>2]=0;i=b;return}function qE(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+744|0;e=c[a+748>>2]|0;if((e|0)==0){i=b;return}f=c[a+736>>2]|0;if((c[(c[f+16>>2]|0)+32>>2]|0)<4){if((e|0)>0){a=0;do{g=Ch(d,a)|0;if((g|0)!=0){Rc[c[(c[g>>2]|0)+12>>2]&1023](g)}a=a+1|0}while((a|0)!=(e|0))}}else{AC(f+4|0,c[d>>2]|0,e)}Kja(d,0)|0;i=b;return}function rE(a){a=a|0;var b=0,d=0;b=i;d=a+768|0;a=c[d>>2]|0;if((a|0)==0){i=b;return}c[d>>2]=a+ -1;i=b;return}function sE(a){a=a|0;var b=0;b=i;if((c[a+64>>2]|0)!=0){i=b;return}ND(a,2,0);i=b;return}function tE(a){a=a|0;var b=0;b=i;if((c[a+64>>2]|0)!=0){i=b;return}ND(a,2,0);i=b;return}function uE(a){a=a|0;var b=0;b=i;if((c[a+64>>2]|0)!=0){i=b;return}ND(a,1,0);i=b;return}function vE(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b;g[d>>2]=+ID(a,0);e=Dz(1)|0;EC((c[a+736>>2]|0)+12|0,e,d,1);i=b;return}function wE(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b;g[d>>2]=+ID(a,0);e=Dz(1)|0;GC((c[a+736>>2]|0)+12|0,e,d,1);i=b;return}function xE(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;i=i+16|0;d=b+8|0;e=b;HD(d,a,0);c[e>>2]=36960;c[e+4>>2]=9;f=TD(a,e,d)|0;if((f|0)!=0?(c[f>>2]|0)==6:0){XC(c[a+736>>2]|0,f,a);dka(d);i=b;return}c[a+888>>2]=1;dka(d);i=b;return}function yE(a){a=a|0;var b=0,d=0.0;b=i;d=+ID(a,0);g[(ky((c[a+736>>2]|0)+20|0)|0)+128>>2]=d;i=b;return}function zE(a){a=a|0;return}function AE(a){a=a|0;var b=0,d=0;b=i;d=~~+ID(a,0);c[(Xl((c[a+736>>2]|0)+8|0)|0)+16>>2]=d;i=b;return}function BE(a){a=a|0;var b=0,d=0;b=i;d=~~+ID(a,0);c[(Xl((c[a+736>>2]|0)+8|0)|0)>>2]=d;i=b;return}function CE(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b;if((c[a+724>>2]|0)==4){g[d>>2]=+ID(a,3);g[d+4>>2]=+ID(a,2);g[d+8>>2]=+ID(a,1);g[d+12>>2]=+ID(a,0);e=Dz(3)|0;EC((c[a+736>>2]|0)+12|0,e,d,4);i=b;return}else{c[a+728>>2]=1;i=b;return}}function DE(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b;if((c[a+724>>2]|0)==4){g[d>>2]=+ID(a,3);g[d+4>>2]=+ID(a,2);g[d+8>>2]=+ID(a,1);g[d+12>>2]=+ID(a,0);e=Dz(3)|0;GC((c[a+736>>2]|0)+12|0,e,d,4);i=b;return}else{c[a+728>>2]=1;i=b;return}}function EE(a){a=a|0;var b=0,d=0.0;b=i;if((c[a+724>>2]|0)!=2){c[a+728>>2]=1;i=b;return}if((c[a+64>>2]|0)!=0){i=b;return}d=+ID(a,1);QD(a,d,+ID(a,0),2);i=b;return}function FE(a){a=a|0;var b=0,d=0.0;b=i;if((c[a+724>>2]|0)!=2){c[a+728>>2]=1;i=b;return}if((c[a+64>>2]|0)==0){d=+ID(a,1);QD(a,d,+ID(a,0),6);FF(a);i=b;return}else{LF(c[a+732>>2]|0);i=b;return}}function GE(a){a=a|0;var b=0,d=0.0;b=i;d=+ID(a,0);g[(Xl((c[a+736>>2]|0)+8|0)|0)+20>>2]=d;i=b;return}function HE(a){a=a|0;return}function IE(a){a=a|0;var b=0;b=i;if((c[a+64>>2]|0)!=0){i=b;return}ND(a,0,0);i=b;return}function JE(a){a=a|0;var b=0,d=0;b=i;d=u2a(124)|0;TC(d);VC(d,c[a+736>>2]|0);yg(a+892|0,d);i=b;return}function KE(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+892|0;e=c[a+896>>2]|0;if((e|0)==0){i=b;return}f=e+ -1|0;e=Ch(d,f)|0;VC(c[a+736>>2]|0,e);if((e|0)!=0){UC(e);v2a(e)}Oja(d,f);i=b;return}function LE(a){a=a|0;var b=0,d=0.0,e=0.0,f=0.0;b=i;if((c[a+64>>2]|0)!=0){i=b;return}d=+ID(a,3);e=+ID(a,2);f=+ID(a,1);ME(a,d,e,f,+ID(a,0));i=b;return}function ME(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;var f=0,g=0.0;f=i;QD(a,b,c,6);g=b+d;QD(a,g,c,2);d=c+e;QD(a,g,d,2);QD(a,b,d,2);QD(a,b,c,3);i=f;return}function NE(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b;if((c[a+724>>2]|0)==3){g[d>>2]=+ID(a,2);g[d+4>>2]=+ID(a,1);g[d+8>>2]=+ID(a,0);e=Dz(2)|0;EC((c[a+736>>2]|0)+12|0,e,d,3);i=b;return}else{c[a+728>>2]=1;i=b;return}}function OE(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b;if((c[a+724>>2]|0)==3){g[d>>2]=+ID(a,2);g[d+4>>2]=+ID(a,1);g[d+8>>2]=+ID(a,0);e=Dz(2)|0;GC((c[a+736>>2]|0)+12|0,e,d,3);i=b;return}else{c[a+728>>2]=1;i=b;return}}function PE(a){a=a|0;return}function QE(a){a=a|0;var b=0;b=i;if((c[a+64>>2]|0)!=0){i=b;return}MD(a);ND(a,0,1);i=b;return}function RE(a){a=a|0;var b=0;b=i;if((c[a+64>>2]|0)!=0){i=b;return}ND(a,0,1);i=b;return}function SE(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0;b=i;i=i+16|0;d=b;if((c[a+64>>2]|0)!=0){i=b;return}e=c[a+724>>2]|0;f=(e|0)>4?4:e;if((f|0)>0){h=f+ -1|0;j=(e|0)<4?e:4;e=0;do{g[d+(e<<2)>>2]=+ID(a,h-e|0);e=e+1|0}while((e|0)!=(j|0))}EC((c[a+736>>2]|0)+12|0,0,d,f);i=b;return}function TE(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0;b=i;i=i+16|0;d=b;if((c[a+64>>2]|0)!=0){i=b;return}e=c[a+724>>2]|0;f=(e|0)>4?4:e;if((f|0)>0){h=f+ -1|0;j=(e|0)<4?e:4;e=0;do{g[d+(e<<2)>>2]=+ID(a,h-e|0);e=e+1|0}while((e|0)!=(j|0))}GC((c[a+736>>2]|0)+12|0,0,d,f);i=b;return}function UE(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0;b=i;i=i+16|0;d=b;if((c[a+64>>2]|0)!=0){i=b;return}e=FD(a,0)|0;if((e|0)==0){i=b;return}f=c[a+724>>2]|0;h=(c[e>>2]|0)==4;e=(h<<31>>31)+f|0;if((e|0)!=0){j=w2a(e,4)|0;if((e|0)>0){k=f+ -1|0;f=0;do{g[j+(f<<2)>>2]=+ID(a,k-f|0);f=f+1|0}while((f|0)!=(e|0));l=j}else{l=j}}else{l=0}if(h){HD(d,a,0);h=VE(a,d,0)|0;dka(d);if((h|0)!=0){HC((c[a+736>>2]|0)+12|0,h,l,e)}}else{EC((c[a+736>>2]|0)+12|0,0,l,e)}if((l|0)==0){i=b;return}v2a(l);i=b;return}function VE(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e;if((d|0)==0){c[f>>2]=36976;c[f+4>>2]=7}else{c[f>>2]=37432;c[f+4>>2]=7}g=TD(a,f,b)|0;if((g|0)!=0?((c[g>>2]|0)+ -6|0)>>>0<2:0){h=XA(c[a>>2]|0,g,d,(c[a+736>>2]|0)+72|0)|0;i=e;return h|0}c[a+888>>2]=1;h=0;i=e;return h|0}function WE(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0;b=i;i=i+16|0;d=b;if((c[a+64>>2]|0)!=0){i=b;return}e=FD(a,0)|0;if((e|0)==0){i=b;return}f=c[a+724>>2]|0;h=(c[e>>2]|0)==4;e=(h<<31>>31)+f|0;if((e|0)!=0){j=w2a(e,4)|0;if((e|0)>0){k=f+ -1|0;f=0;do{g[j+(f<<2)>>2]=+ID(a,k-f|0);f=f+1|0}while((f|0)!=(e|0));l=j}else{l=j}}else{l=0}if(h){HD(d,a,0);h=VE(a,d,0)|0;dka(d);if((h|0)!=0){IC((c[a+736>>2]|0)+12|0,h,l,e)}}else{GC((c[a+736>>2]|0)+12|0,0,l,e)}if((l|0)==0){i=b;return}v2a(l);i=b;return}function XE(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0;b=i;i=i+48|0;d=b+32|0;e=b+16|0;f=b;if((c[a+64>>2]|0)!=0){i=b;return}HD(d,a,0);h=VE(a,d,1)|0;dka(d);if((h|0)==0){i=b;return}if((c[h+8>>2]|0)!=2){i=b;return}if((c[h+68>>2]|0)==0){i=b;return}if((iG(h)|0)==0){i=b;return}d=u2a(84)|0;vy(d);c[d+52>>2]=h;JD(a,d,0,0,0);j=d+56|0;k=(c[a+736>>2]|0)+48|0;c[j+0>>2]=c[k+0>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];c[j+16>>2]=c[k+16>>2];c[j+20>>2]=c[k+20>>2];Wla(j,a+24|0);c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;k=d+8|0;if((c[k>>2]|0)==0){l=a+48|0;c[e+0>>2]=c[l+0>>2];c[e+4>>2]=c[l+4>>2];c[e+8>>2]=c[l+8>>2];c[e+12>>2]=c[l+12>>2]}else{wC(e,k)}k=c[h+72>>2]|0;if((k|0)>3){pG(f,c[h+64>>2]|0,k,j,h+80|0,c[h+96>>2]|0,c[h+76>>2]|0);Ila(e,f)}g[d+32>>2]=+g[e>>2];g[d+36>>2]=+g[e+4>>2];g[d+40>>2]=+g[e+12>>2];g[d+44>>2]=+g[e+8>>2];uma((c[a+12>>2]|0)+40|0,d);i=b;return}function YE(a){a=a|0;var b=0,d=0.0;b=i;d=+ID(a,0);g[(uy((c[a+736>>2]|0)+16|0)|0)+8>>2]=d;i=b;return}function ZE(a){a=a|0;var b=0,d=0.0,e=0,f=0;b=i;d=+ID(a,1);e=a+736|0;f=(c[e>>2]|0)+104|0;g[f>>2]=d+ +g[f>>2];d=+ID(a,0);a=(c[e>>2]|0)+108|0;g[a>>2]=d+ +g[a>>2];a=c[e>>2]|0;g[a+96>>2]=+g[a+104>>2];a=c[e>>2]|0;g[a+100>>2]=+g[a+108>>2];i=b;return}function _E(a){a=a|0;var b=0,d=0.0;b=i;ZE(a);d=-+ID(a,0);g[(c[a+736>>2]|0)+112>>2]=d;i=b;return}function $E(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,h=0,j=0;b=i;i=i+16|0;d=b;e=+ID(a,0);if(e==0.0){f=+g[a+764>>2]}else{f=e}h=a+736|0;g[(uy((c[h>>2]|0)+16|0)|0)+4>>2]=f;HD(d,a,1);j=aF(a,d)|0;dka(d);if((j|0)==0){i=b;return}MC((c[h>>2]|0)+16|0,j);i=b;return}function aF(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;e=d+8|0;f=d;c[e>>2]=669472;c[e+4>>2]=4;g=TD(a,e,b)|0;if((g|0)!=0?(c[g>>2]|0)==6:0){b=RA(c[a>>2]|0,g)|0;if((b|0)==0){h=0;i=d;return h|0}if((c[b+84>>2]|0)!=3){h=b;i=d;return h|0}c[b+5792>>2]=c[a+16>>2];uv(b);h=b;i=d;return h|0}c[a+888>>2]=1;b=c[a>>2]|0;c[f>>2]=1290288;c[f+4>>2]=9;h=Ku(b,f)|0;i=d;return h|0}function bF(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0.0;e=i;f=(c[a+736>>2]|0)+24|0;h=+g[d>>2];g[b>>2]=+g[b>>2];g[d>>2]=h;fma(f,b,d);cF(a,b,d);i=e;return}function cF(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0.0;e=i;f=(c[a+736>>2]|0)+48|0;h=+g[d>>2];g[b>>2]=+g[b>>2];g[d>>2]=h;fma(f,b,d);h=+g[d>>2];g[b>>2]=+g[b>>2];g[d>>2]=h;fma(a+24|0,b,d);i=e;return}function dF(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0,r=0;h=i;i=i+16|0;j=h+4|0;k=h;l=a+736|0;m=c[c[(c[l>>2]|0)+16>>2]>>2]|0;if((m|0)==0){i=h;return}do{if(d!=0.0){n=(Lc[c[(c[m>>2]|0)+8>>2]&255](m)|0)==0;o=c[l>>2]|0;p=+g[(c[o+16>>2]|0)+4>>2]*d/1.0e3;if(n){n=o+96|0;g[n>>2]=+g[n>>2]-p;break}else{n=o+100|0;g[n>>2]=+g[n>>2]-p;break}}}while(0);if((f|0)==0){i=h;return}if((c[m+84>>2]|0)==3){q=0}else{q=c[(c[(c[l>>2]|0)+16>>2]|0)+32>>2]|0}n=u2a(72)|0;my(n);c[a+760>>2]=n;JD(a,n,1,1,1);if(!((q|0)==0|(q|0)==3|(q|0)==4|(q|0)==7)){o=uy(n+20|0)|0;g[o+36>>2]=+g[(c[l>>2]|0)+48>>2];g[o+40>>2]=+g[(c[l>>2]|0)+56>>2];g[o+44>>2]=+g[(c[l>>2]|0)+52>>2];g[o+48>>2]=+g[(c[l>>2]|0)+60>>2]}ry(n,b,e,f);b=c[l>>2]|0;o=n+52|0;g[o>>2]=+g[b+96>>2];r=n+56|0;g[r>>2]=+g[b+100>>2]+ +g[b+116>>2];bF(a,o,r);sy(n,j,k,+g[(c[l>>2]|0)+120>>2],c[a+20>>2]|0);r=(c[l>>2]|0)+96|0;g[r>>2]=+g[j>>2]+ +g[r>>2];r=(c[l>>2]|0)+100|0;g[r>>2]=+g[k>>2]+ +g[r>>2];if((q|0)>3){q=u2a(72)|0;my(q);gy(q,n);yg(a+744|0,q)}uma((c[a+12>>2]|0)+40|0,n);if((e|0)==0){i=h;return}n=e+(f+ -1<<2)|0;if(!(+g[n>>2]!=0.0)){i=h;return}f=(Lc[c[(c[m>>2]|0)+8>>2]&255](m)|0)==0;m=c[l>>2]|0;d=+g[n>>2]*+g[(c[m+16>>2]|0)+4>>2]/1.0e3;if(f){f=m+96|0;g[f>>2]=+g[f>>2]-d;i=h;return}else{f=m+100|0;g[f>>2]=+g[f>>2]-d;i=h;return}}function eF(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b;HD(d,a,0);e=c[d>>2]|0;if((e|0)!=0?(c[e+4>>2]|0)!=0:0){dF(a,d,0.0,0,1)}dka(d);i=b;return}function fF(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0,t=0,u=0;b=i;i=i+16|0;d=b;if((FD(a,0)|0)==0){i=b;return}e=mH(FD(a,0)|0)|0;if((e|0)==0){i=b;return}f=c[e+16>>2]|0;if((f|0)>0){h=0;j=0}else{i=b;return}do{j=((c[(GH(e,h)|0)>>2]|0)==3&1)+j|0;h=h+1|0}while((h|0)!=(f|0));if((j|0)==0){h=a+736|0;k=0;do{l=+DH(e,k);m=c[h>>2]|0;n=m+96|0;g[n>>2]=+g[n>>2]-l*+g[(c[m+16>>2]|0)+4>>2]/1.0e3;k=k+1|0}while((k|0)!=(f|0));i=b;return}k=w2a(j,4)|0;h=(j|0)>0;if((k|0)!=0&h){f3a(k|0,0,j<<2|0)|0}m=w2a(j,4)|0;l=0.0;n=0;o=0;while(1){p=GH(e,n)|0;do{if((c[p>>2]|0)!=3){if((p|0)==0){q=0.0}else{q=+hH(p)}if((o|0)==0){r=l+q;s=0;break}else{t=m+(o+ -1<<2)|0;g[t>>2]=q+ +g[t>>2];r=l;s=o;break}}else{dH(d,p);t=c[d>>2]|0;if((t|0)!=0?(c[t+4>>2]|0)!=0:0){ika(k+(o<<2)|0,d);g[m+(o<<2)>>2]=0.0;u=o+1|0}else{u=o}dka(d);r=l;s=u}}while(0);n=n+1|0;if((n|0)>=(f|0)){break}else{l=r;o=s}}dF(a,k,r,m,s);if(h){h=0;do{dka(k+(h<<2)|0);h=h+1|0}while((h|0)!=(j|0))}v2a(k);v2a(m);i=b;return}function gF(a){a=a|0;var b=0,d=0.0;b=i;d=+ID(a,0);g[(c[a+736>>2]|0)+112>>2]=d;i=b;return}function hF(a){a=a|0;var b=0,d=0,e=0,f=0.0,h=0.0,j=0.0,k=0.0,l=0.0;b=i;d=a+736|0;e=(c[d>>2]|0)+24|0;f=+ID(a,5);h=+ID(a,4);j=+ID(a,3);k=+ID(a,2);l=+ID(a,1);Tla(e,f,h,j,k,l,+ID(a,0));_D(a);g[(c[d>>2]|0)+96>>2]=0.0;g[(c[d>>2]|0)+100>>2]=0.0;g[(c[d>>2]|0)+104>>2]=0.0;g[(c[d>>2]|0)+108>>2]=0.0;i=b;return}function iF(a){a=a|0;var b=0,d=0;b=i;d=~~+ID(a,0);if(d>>>0>7){i=b;return}c[(uy((c[a+736>>2]|0)+16|0)|0)+32>>2]=d;i=b;return}function jF(a){a=a|0;var b=0,d=0.0;b=i;d=+ID(a,0);g[(c[a+736>>2]|0)+116>>2]=d;i=b;return}function kF(a){a=a|0;var b=0,d=0.0;b=i;d=+ID(a,0);g[(uy((c[a+736>>2]|0)+16|0)|0)+12>>2]=d;i=b;return}function lF(a){a=a|0;var b=0,d=0.0;b=i;if((c[a+724>>2]|0)!=1){i=b;return}d=+ID(a,0)/100.0;g[(c[a+736>>2]|0)+120>>2]=d;_D(a);i=b;return}function mF(a){a=a|0;var b=0,d=0;b=a+736|0;a=c[b>>2]|0;d=a+108|0;g[d>>2]=+g[d>>2]- +g[a+112>>2];a=c[b>>2]|0;g[a+96>>2]=+g[a+104>>2];a=c[b>>2]|0;g[a+100>>2]=+g[a+108>>2];return}function nF(a){a=a|0;var b=0,d=0.0;b=i;if((c[a+64>>2]|0)!=0){i=b;return}QD(a,+g[a+792>>2],+g[a+796>>2],4);d=+ID(a,3);QD(a,d,+ID(a,2),4);d=+ID(a,1);QD(a,d,+ID(a,0),4);i=b;return}function oF(a){a=a|0;var b=0,d=0.0;b=i;d=+ID(a,0);g[(Xl((c[a+736>>2]|0)+8|0)|0)+24>>2]=d;i=b;return}function pF(a){a=a|0;c[a+800>>2]=2;return}function qF(a){a=a|0;c[a+800>>2]=1;return}function rF(a){a=a|0;var b=0,d=0.0;b=i;if((c[a+64>>2]|0)!=0){i=b;return}d=+ID(a,3);QD(a,d,+ID(a,2),4);d=+ID(a,1);QD(a,d,+ID(a,0),4);d=+ID(a,1);QD(a,d,+ID(a,0),4);i=b;return}function sF(a){a=a|0;var b=0;b=i;mF(a);eF(a);i=b;return}function tF(a){a=a|0;var b=0,d=0.0,e=0;b=i;d=+ID(a,2);e=a+736|0;g[(uy((c[e>>2]|0)+16|0)|0)+12>>2]=d;d=+ID(a,1);g[(uy((c[e>>2]|0)+16|0)|0)+8>>2]=d;sF(a);i=b;return}function uF(a){a=a|0;var b=0,c=0;b=i;if((((+g[a>>2]==1.0?+g[a+4>>2]==0.0:0)?+g[a+8>>2]==0.0:0)?+g[a+12>>2]==1.0:0)?+g[a+16>>2]==0.0:0){c=+g[a+20>>2]==0.0}else{c=0}i=b;return c&1|0}function vF(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=b+8|0;g=c[f>>2]|0;if((c[b+12>>2]|0)>(g|0)){h=g}else{mla(b,1);h=c[f>>2]|0}c[f>>2]=h+1;a[(c[b+4>>2]|0)+h>>0]=d;i=e;return}function wF(a,b){a=a|0;b=b|0;var d=0;d=i;c[a+4>>2]=0;c[a+8>>2]=0;jka(a+12|0,b);c[a>>2]=4;i=d;return}function xF(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[b>>2]|0;if((e|0)!=0){f=e+20|0;c[f>>2]=(c[f>>2]|0)+1}f=c[a>>2]|0;if((f|0)!=0?(e=f+20|0,c[e>>2]=(c[e>>2]|0)+ -1,e=c[a>>2]|0,!((c[e+20>>2]|0)>0|(e|0)==0)):0){om(e+4|0);v2a(e)}c[a>>2]=c[b>>2];i=d;return}function yF(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;c[a>>2]=b;if((d|0)==-1){c[a+4>>2]=Y2a(b|0)|0;i=e;return}else{c[a+4>>2]=d;i=e;return}}function zF(b){b=b|0;var c=0,d=0,e=0,f=0;c=i;a:do{if((b|0)==0){d=0}else{e=b;while(1){f=a[e>>0]|0;if(f<<24>>24==0){d=0;break a}if((a[37088+(f&255)>>0]|0)==73){d=1;break}else{e=e+1|0}}}}while(0);i=c;return d|0}function AF(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=i;i=i+288|0;g=f;if((c[a+20>>2]|0)>30){h=d;i=f;return h|0}j=a+12|0;k=c[(c[j>>2]|0)+48>>2]|0;c[g>>2]=b;c[g+4>>2]=d;c[g+8>>2]=0;d=g+272|0;c[d>>2]=0;b=a+732|0;c[b>>2]=g;c[a+768>>2]=0;l=(e|0)==0;m=g+12|0;n=a+728|0;o=g+268|0;p=g+13|0;while(1){if(!l?!(((c[(c[j>>2]|0)+48>>2]|0)-k|0)>>>0<e>>>0):0){q=16;break}r=BF(g)|0;if((r|0)==1){DD(a,m,c[o>>2]|0);continue}else if((r|0)==2){if((KD(a,m)|0)==0?(zF(m)|0)!=0:0){q=9;break}if((c[n>>2]|0)!=0){q=11;break}wD(a);continue}else if((r|0)==3){CD(a,p,(c[o>>2]|0)+ -1|0);continue}else if((r|0)==0){q=6;break}else{r=c[d>>2]|0;c[d>>2]=0;ED(a,r);continue}}if((q|0)==6){s=(c[b>>2]|0)+8|0}else if((q|0)==9){c[n>>2]=1;q=11}else if((q|0)==16){s=(c[b>>2]|0)+8|0}if((q|0)==11){s=(c[b>>2]|0)+8|0}b=c[s>>2]|0;GF(c[d>>2]|0);h=b;i=f;return h|0}function BF(b){b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;e=i;f=b+272|0;g=c[f>>2]|0;if((g|0)!=0){bH(g);c[f>>2]=0}g=b+268|0;c[g>>2]=0;h=b+8|0;j=c[h>>2]|0;k=b+4|0;l=c[k>>2]|0;if(!(j>>>0<l>>>0)){m=0;i=e;return m|0}n=j+1|0;c[h>>2]=n;o=c[b>>2]|0;p=d[o+j>>0]|0;j=n;n=p;q=a[39080+p>>0]|0;a:while(1){if((q|0)==87){if(!(l>>>0>j>>>0)){m=0;r=29;break}p=j+1|0;c[h>>2]=p;s=d[o+j>>0]|0;j=p;n=s;q=a[39080+s>>0]|0;continue}if((n|0)==37){t=j}else{r=12;break}do{if(!(l>>>0>t>>>0)){m=0;r=29;break a}s=t;t=t+1|0;c[h>>2]=t;u=a[o+s>>0]|0}while(!(u<<24>>24==10|u<<24>>24==13));s=u&255;j=t;n=s;q=a[39080+s>>0]|0}if((r|0)==12){if((q|0)!=68|(n|0)==47){v=0;w=j;x=l;y=1;z=n;A=q}else{c[h>>2]=j+ -1;c[f>>2]=DF(b,0,0)|0;m=4;i=e;return m|0}while(1){if(v>>>0<256){c[g>>2]=v+1;a[b+v+12>>0]=z;B=c[k>>2]|0;C=c[h>>2]|0}else{B=x;C=w}D=(A|0)==78?y:0;if(!(B>>>0>C>>>0)){break}j=C+1|0;c[h>>2]=j;q=d[(c[b>>2]|0)+C>>0]|0;n=a[39080+q>>0]|0;if(n<<24>>24==68|n<<24>>24==87){r=19;break}v=c[g>>2]|0;w=j;x=B;y=D;z=q;A=n<<24>>24}if((r|0)==19){c[h>>2]=C}C=b+12|0;a[b+(c[g>>2]|0)+12>>0]=0;if((D|0)!=0){m=1;i=e;return m|0}if((a[C>>0]|0)==47){m=3;i=e;return m|0}D=c[g>>2]|0;if((D|0)==5){if((c[C>>2]|0)!=1936482662){m=2;i=e;return m|0}if((a[b+16>>0]|0)!=101){m=2;i=e;return m|0}c[f>>2]=JF(0)|0;m=4;i=e;return m|0}else if((D|0)==4){D=c[C>>2]|0;if((D|0)==1702195828){c[f>>2]=JF(1)|0;m=4;i=e;return m|0}else if((D|0)==1819047278){c[f>>2]=KF()|0;m=4;i=e;return m|0}else{m=2;i=e;return m|0}}else{m=2;i=e;return m|0}}else if((r|0)==29){i=e;return m|0}return 0}function CF(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;d=i;i=i+128|0;e=d+112|0;f=d+104|0;g=d+96|0;h=d+88|0;j=d+80|0;k=d+72|0;l=d+64|0;m=d+56|0;n=d+48|0;o=d+40|0;p=d+32|0;q=d+24|0;r=d+16|0;s=d+8|0;t=d;u=b+732|0;v=c[(c[u>>2]|0)+8>>2]|0;w=Wm()|0;x=f+4|0;while(1){y=BF(c[u>>2]|0)|0;if((y|0)==2){z=3;break}else if((y|0)!=3){break}y=c[u>>2]|0;eka(g,y+13|0,(c[y+268>>2]|0)+ -1|0);y=DF(c[u>>2]|0,0,0)|0;A=c[g>>2]|0;if((A|0)!=0?(c[A+4>>2]|0)!=0:0){oe(h,g);A=c[b>>2]|0;if((A|0)==0){B=0}else{B=A+16|0}oI(w,h,y,B)}else{z=11}if((z|0)==11?(z=0,(y|0)!=0):0){bH(y)}dka(g)}do{if((z|0)==3){g=c[u>>2]|0;gka(e,g+12|0,c[g+268>>2]|0);c[f>>2]=38608;c[x>>2]=2;if(vka(c[e>>2]|0,f)|0){dka(e);break}c[(c[u>>2]|0)+8>>2]=v;bH(w);dka(e);i=d;return}}while(0);WD(w);c[j>>2]=39808;c[j+4>>2]=10;if((nI(w,j)|0)!=0){c[k>>2]=39808;c[k+4>>2]=10;j=$H(w,k)|0;if((c[j>>2]|0)==4){dH(l,j);c[m>>2]=39880;c[m+4>>2]=9;k=c[l>>2]|0;if((!(vka(k,m)|0)?(c[n>>2]=39864,c[n+4>>2]=10,!(vka(k,n)|0)):0)?(c[o>>2]=39896,c[o+4>>2]=10,!(vka(k,o)|0)):0){c[p>>2]=39808;c[p+4>>2]=10;o=TD(b,p,l)|0;if((o|0)!=0){if((c[o+4>>2]|0)==0){p=pH(o,0)|0;c[q>>2]=39808;c[q+4>>2]=10;k=c[b>>2]|0;if((k|0)==0){C=0}else{C=k+16|0}oI(w,q,p,C);D=p}else{D=o}}else{D=0}}else{D=j}dka(l);E=D}else{E=j}}else{E=0}j=EF(c[u>>2]|0,c[b>>2]|0,w,E,c[b+76>>2]|0)|0;while(1){E=BF(c[u>>2]|0)|0;if((E|0)==0){break}else if((E|0)!=2){continue}E=c[u>>2]|0;if((c[E+268>>2]|0)!=2){continue}if((a[E+12>>0]|0)!=69){continue}if((a[E+13>>0]|0)==73){break}}if((c[b+64>>2]|0)!=0){if((j|0)==0){bH(w);i=d;return}else{bH(j);i=d;return}}c[r>>2]=669432;c[r+4>>2]=7;c[t>>2]=37352;c[t+4>>2]=5;jka(s,t);tI(w,r,s);dka(s);if((jE(b,j,0,1)|0)!=0){i=d;return}if((j|0)==0){bH(w);i=d;return}else{bH(j);i=d;return}}function DF(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;f=i;i=i+64|0;g=f+56|0;h=f+48|0;j=f+40|0;k=f+32|0;l=f+24|0;m=f+20|0;n=f+16|0;o=f+8|0;p=f;MF(b,g);q=b+268|0;r=c[q>>2]|0;if((r|0)==0){s=0;i=f;return s|0}if((c[g>>2]|0)!=0){a[b+r+12>>0]=0;t=c[q>>2]|0;c[h>>2]=b+12;c[h+4>>2]=t;s=NF(h)|0;i=f;return s|0}h=b+12|0;t=a[h>>0]|0;if(t<<24>>24==91){if(!((d|0)!=0|(e|0)==0)){s=0;i=f;return s|0}e=Sn()|0;while(1){u=DF(b,d,1)|0;if((u|0)!=0){RH(e,u);continue}if((c[q>>2]|0)==0){break}if((a[h>>0]|0)==93){break}}s=e;i=f;return s|0}else if(t<<24>>24==60){if((r|0)==1){QF(m,b);e=OF(m,1)|0;dka(m);s=e;i=f;return s|0}e=Wm()|0;m=b+13|0;d=o+4|0;while(1){MF(b,g);u=c[q>>2]|0;if((u|0)==2){v=a[h>>0]|0;if(v<<24>>24==62){w=24;break}else{x=v}}else if((u|0)==0){w=11;break}else{x=a[h>>0]|0}if(!(x<<24>>24==47)){w=15;break}c[o>>2]=m;c[d>>2]=u+ -1;sL(n,o);u=DF(b,1,0)|0;if((u|0)==0){w=17;break}v=c[n>>2]|0;if((v|0)!=0?(c[v+4>>2]|0)!=0:0){oe(p,n);oI(e,p,u,0)}else{bH(u)}dka(n)}if((w|0)==11){bH(e);s=0;i=f;return s|0}else if((w|0)==15){bH(e);s=0;i=f;return s|0}else if((w|0)==17){if((e|0)==0){dka(n);s=0;i=f;return s|0}else{bH(e);dka(n);s=0;i=f;return s|0}}else if((w|0)==24){s=e;i=f;return s|0}}else if(t<<24>>24==40){PF(l,b);e=OF(l,0)|0;dka(l);s=e;i=f;return s|0}else if(!(t<<24>>24==47)){if((r|0)==5){if((c[h>>2]|0)!=1936482662){s=0;i=f;return s|0}if((a[b+16>>0]|0)!=101){s=0;i=f;return s|0}s=JF(0)|0;i=f;return s|0}else if((r|0)==4){t=c[h>>2]|0;if((t|0)==1702195828){s=JF(1)|0;i=f;return s|0}else if((t|0)==1819047278){s=KF()|0;i=f;return s|0}else{s=0;i=f;return s|0}}else{s=0;i=f;return s|0}}else{c[k>>2]=b+13;c[k+4>>2]=r+ -1;sL(j,k);k=nv(j)|0;dka(j);s=k;i=f;return s|0}return 0}function EF(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;j=i;i=i+112|0;k=j+104|0;l=j+96|0;m=j+88|0;n=j+80|0;o=j+72|0;p=j+64|0;q=j+56|0;r=j+48|0;s=j+40|0;t=j+36|0;u=j+32|0;v=j+24|0;w=j+16|0;x=j+8|0;y=j;z=b+8|0;A=c[z>>2]|0;B=b+4|0;if((A|0)==(c[B>>2]|0)){C=0;i=j;return C|0}if((a[39080+(d[(c[b>>2]|0)+A>>0]|0)>>0]|0)==87){c[z>>2]=A+1}c[k>>2]=0;c[l>>2]=39824;c[l+4>>2]=6;A=$H(f,l)|0;do{if((A|0)!=0){if((c[A>>2]|0)!=5){dH(o,A);ika(k,o);dka(o);c[p>>2]=38384;c[p+4>>2]=11;D=iI(f,p)|0;break}HH(m,A,0);ika(k,m);dka(m);c[n>>2]=38384;c[n+4>>2]=11;l=jI(f,n)|0;if((l|0)!=0){D=KH(l,0)|0}else{D=0}}else{D=0}}while(0);c[q>>2]=1280896;c[q+4>>2]=5;n=eI(f,q)|0;c[r>>2]=39736;c[r+4>>2]=6;q=eI(f,r)|0;do{if((g|0)==0){if(n>>>0>2147483640){E=0}else{F=n;G=18}}else{c[s>>2]=39840;c[s+4>>2]=16;r=eI(f,s)|0;m=VA(e,g,0)|0;if((m|0)==0){H=3}else{p=c[m+12>>2]|0;bB(IG(e)|0,g);H=p}if((r|0)!=0?n>>>0>(2147483647/(r>>>0)|0)>>>0:0){E=0;break}p=ca(r,n)|0;if((H|0)!=0?p>>>0>(2147483647/(H>>>0)|0)>>>0:0){E=0;break}r=ca(H,p)|0;if(r>>>0>2147483640){E=0}else{F=r;G=18}}}while(0);a:do{if((G|0)==18){H=(F+7|0)>>>3;if((q|0)!=0?H>>>0>(2147483647/(q>>>0)|0)>>>0:0){E=0;break}g=ca(H,q)|0;c[t>>2]=0;H=c[k>>2]|0;do{if((H|0)!=0?(c[H+4>>2]|0)!=0:0){c[u>>2]=g;e=c[z>>2]|0;s=IF((c[b>>2]|0)+e|0,(c[B>>2]|0)-e|0,n,q,H,D,t,u)|0;if((s|0)<0){E=0;break a}if((h|0)!=0){c[z>>2]=(c[z>>2]|0)+s;e=c[u>>2]|0;if((c[A>>2]|0)!=5){c[w>>2]=39824;c[w+4>>2]=6;qI(f,w);c[x>>2]=38384;c[x+4>>2]=11;qI(f,x);I=e;break}NH(A,0);c[v>>2]=38384;c[v+4>>2]=11;r=jI(f,v)|0;if((r|0)==0){I=e;break}NH(r,0);I=e;break}v2a(c[t>>2]|0);e=c[z>>2]|0;r=e+s|0;c[z>>2]=r;p=b+268|0;m=b+12|0;o=b+13|0;l=r;r=s;while(1){s=BF(b)|0;if((s|0)==0){break}else if((s|0)!=2){s=c[z>>2]|0;J=r-l+s|0;l=s;r=J;continue}if(((c[p>>2]|0)==2?(a[m>>0]|0)==69:0)?(a[o>>0]|0)==73:0){G=35;break}J=c[z>>2]|0;s=r-l+J|0;l=J;r=s}if((G|0)==35){c[z>>2]=l}c[z>>2]=e;o=w2a(r,1)|0;c[t>>2]=o;c3a(o|0,(c[b>>2]|0)+e|0,r|0)|0;c[z>>2]=e+r;I=r}else{G=22}}while(0);if((G|0)==22){H=c[z>>2]|0;o=(c[B>>2]|0)-H|0;m=g>>>0>o>>>0?o:g;o=w2a(m,1)|0;c[t>>2]=o;c3a(o|0,(c[b>>2]|0)+H|0,m|0)|0;c[z>>2]=H+m;I=m}c[y>>2]=669280;c[y+4>>2]=6;sI(f,y,I);E=Ym(c[t>>2]|0,I,f)|0}}while(0);dka(k);C=E;i=j;return C|0}function FF(b){b=b|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0,D=0.0,E=0.0;e=i;i=i+48|0;f=e+16|0;h=e+12|0;j=e+8|0;k=e;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;l=b+732|0;m=k+4|0;n=f+4|0;o=f+8|0;p=f+12|0;q=f+16|0;r=f+20|0;s=b+792|0;t=b+796|0;a:while(1){u=c[l>>2]|0;v=c[u+8>>2]|0;w=u;u=0;while(1){x=BF(w)|0;if((x|0)==2){break}else if((x|0)==0){y=23;break a}else if((x|0)!=1){y=21;break a}if((u|0)==6){z=6}else{x=c[l>>2]|0;A=c[x+268>>2]|0;c[k>>2]=x+12;c[m>>2]=A;Gna(k,h,j);if((c[h>>2]|0)==0){B=+g[j>>2]}else{B=+(c[j>>2]|0)}g[f+(u<<2)>>2]=B;z=u+1|0}w=c[l>>2]|0;u=z}u=c[l>>2]|0;w=c[u+268>>2]|0;if((w|0)==2){if((a[u+12>>0]|0)!=114){C=u;break}if((a[u+13>>0]|0)!=101){C=u;break}ME(b,+g[f>>2],+g[n>>2],+g[o>>2],+g[p>>2]);continue}else if((w|0)!=1){C=u;break}switch(d[u+12>>0]|0){case 118:{QD(b,+g[s>>2],+g[t>>2],4);QD(b,+g[f>>2],+g[n>>2],4);QD(b,+g[o>>2],+g[p>>2],4);continue a;break};case 109:{QD(b,+g[f>>2],+g[n>>2],6);continue a;break};case 104:{MD(b);continue a;break};case 121:{QD(b,+g[f>>2],+g[n>>2],4);D=+g[o>>2];E=+g[p>>2];QD(b,D,E,4);QD(b,D,E,4);continue a;break};case 99:{QD(b,+g[f>>2],+g[n>>2],4);QD(b,+g[o>>2],+g[p>>2],4);QD(b,+g[q>>2],+g[r>>2],4);continue a;break};case 108:{QD(b,+g[f>>2],+g[n>>2],2);continue a;break};default:{C=u;break a}}}if((y|0)==21){C=c[l>>2]|0}else if((y|0)==23){i=e;return}c[C+8>>2]=v;i=e;return}function GF(a){a=a|0;var b=0;b=i;if((a|0)!=0){bH(a)}i=b;return}function HF(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;if((a|0)==0){f=-1;i=e;return f|0}g=Lc[c[(c[a>>2]|0)+32>>2]&255](a)|0;h=Lc[c[(c[a>>2]|0)+36>>2]&255](a)|0;j=Lc[c[(c[a>>2]|0)+24>>2]&255](a)|0;k=Lc[c[(c[a>>2]|0)+28>>2]&255](a)|0;l=((ca(ca(h,g)|0,j)|0)+7|0)/8|0;if((k|0)!=0?(l|0)<=(1073741824/(k|0)|0|0):0){j=ca(l,k)|0;c[d>>2]=j;c[b>>2]=w2a(j,1)|0;a:do{if((k|0)>0){j=0;do{d=dd[c[(c[a>>2]|0)+16>>2]&511](a,j)|0;if((d|0)==0){break a}c3a((c[b>>2]|0)+(ca(j,l)|0)|0,d|0,l|0)|0;j=j+1|0}while((j|0)<(k|0))}}while(0);k=Lc[c[(c[a>>2]|0)+8>>2]&255](a)|0;Rc[c[(c[a>>2]|0)+4>>2]&1023](a);f=k;i=e;return f|0}Rc[c[(c[a>>2]|0)+4>>2]&1023](a);f=-1;i=e;return f|0}function IF(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;k=i;i=i+128|0;l=k+112|0;m=k+104|0;n=k+96|0;o=k+88|0;p=k+80|0;q=k+72|0;r=k+64|0;s=k+56|0;t=k+48|0;u=k+40|0;v=k+32|0;w=k+24|0;x=k+16|0;y=k+8|0;z=k;c[l>>2]=39744;c[l+4>>2]=14;if(!(vka(f,l)|0)?(c[m>>2]=37736,c[m+4>>2]=3,!(vka(f,m)|0)):0){c[n>>2]=37672;c[n+4>>2]=13;if(!(vka(f,n)|0)?(c[o>>2]=37688,c[o+4>>2]=3,!(vka(f,o)|0)):0){c[p>>2]=37696;c[p+4>>2]=14;if(!(vka(f,p)|0)?(c[q>>2]=37712,c[q+4>>2]=3,!(vka(f,q)|0)):0){c[r>>2]=39960;c[r+4>>2]=11;if(!(vka(f,r)|0)?(c[s>>2]=37640,c[s+4>>2]=2,!(vka(f,s)|0)):0){c[t>>2]=37648;c[t+4>>2]=9;if(!(vka(f,t)|0)?(c[u>>2]=37664,c[u+4>>2]=3,!(vka(f,u)|0)):0){c[v>>2]=39928;c[v+4>>2]=9;if(!(vka(f,v)|0)?(c[w>>2]=37728,c[w+4>>2]=3,!(vka(f,w)|0)):0){c[y>>2]=39992;c[y+4>>2]=15;do{if(!(vka(f,y)|0)){c[z>>2]=37720;c[z+4>>2]=2;if(vka(f,z)|0){break}c[j>>2]=0;c[h>>2]=0;A=-1;i=k;return A|0}}while(0);A=uG(a,b,h,j)|0;i=k;return A|0}z=Ft(c[(xt()|0)+4>>2]|0)|0;f=c[(c[z>>2]|0)+12>>2]|0;if((g|0)==0){B=1}else{c[x>>2]=39944;c[x+4>>2]=14;B=fI(g,x,1)|0}A=HF(Ec[f&15](z,a,b,d,e,0,B)|0,h,j)|0;i=k;return A|0}A=yG(1,a,b,g,0,h,j)|0;i=k;return A|0}A=yG(0,a,b,g,c[j>>2]|0,h,j)|0;i=k;return A|0}A=tG(a,b,h,j)|0;i=k;return A|0}A=sG(a,b,h,j)|0;i=k;return A|0}A=HF(vG(a,b,d,e,g)|0,h,j)|0;i=k;return A|0}function JF(a){a=a|0;var b=0,d=0;b=i;d=u2a(16)|0;c[d+4>>2]=0;c[d+8>>2]=0;c[d>>2]=1;c[d+12>>2]=a;i=b;return d|0}function KF(){var a=0,b=0;a=i;b=u2a(12)|0;c[b+4>>2]=0;c[b+8>>2]=0;c[b>>2]=8;i=a;return b|0}function LF(b){b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;e=i;f=b+8|0;g=c[f>>2]|0;h=c[b+4>>2]|0;if(!(g>>>0<h>>>0)){i=e;return}j=g+1|0;c[f>>2]=j;k=c[b>>2]|0;b=j;j=g;l=a[39080+(d[k+g>>0]|0)>>0]|0;a:while(1){g=b;m=l;while(1){if((m|0)==78){break}else if((m|0)!=87){n=8;break a}if(!(g>>>0<h>>>0)){n=23;break a}o=g+1|0;c[f>>2]=o;p=a[39080+(d[k+g>>0]|0)>>0]|0;g=o;m=p}if(g>>>0<h>>>0){q=g}else{n=23;break}b:while(1){m=q+1|0;c[f>>2]=m;c:do{if((a[39080+(d[k+q>>0]|0)>>0]|0)==87){r=m;s=87;while(1){if((s|0)==78){t=r;break c}else if((s|0)!=87){break b}if(!(r>>>0<h>>>0)){n=23;break a}p=r+1|0;c[f>>2]=p;o=a[39080+(d[k+r>>0]|0)>>0]|0;r=p;s=o}}else{t=m}}while(0);if(t>>>0<h>>>0){q=t}else{n=23;break a}}g=r+ -1|0;m=r;o=s;while(1){if((o|0)==68|(o|0)==87){break}if(!(m>>>0<h>>>0)){n=23;break a}p=m+1|0;c[f>>2]=p;u=a[39080+(d[k+m>>0]|0)>>0]|0;m=p;o=u}u=m-g|0;if((u|0)==2){p=a[k+g>>0]|0;if((p&-2)<<24>>24==108|p<<24>>24==99|p<<24>>24==118|p<<24>>24==121){b=m;j=m;l=o;continue}else{n=22;break}}else if((u|0)!=3){n=22;break}if((a[k+g>>0]|0)!=114){n=22;break}if((a[k+r>>0]|0)==101){b=m;j=m;l=o}else{n=22;break}}if((n|0)==8){c[f>>2]=j;i=e;return}else if((n|0)==22){c[f>>2]=j;i=e;return}else if((n|0)==23){i=e;return}}function MF(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;f=i;g=b+268|0;c[g>>2]=0;c[e>>2]=1;h=b+4|0;j=c[h>>2]|0;k=b+8|0;l=c[k>>2]|0;if(!(j>>>0>l>>>0)){i=f;return}m=l+1|0;c[k>>2]=m;n=c[b>>2]|0;o=d[n+l>>0]|0;l=m;m=o;p=a[39080+o>>0]|0;a:while(1){if((p|0)==87){if(!(j>>>0>l>>>0)){q=34;break}o=l+1|0;c[k>>2]=o;r=d[n+l>>0]|0;l=o;m=r;p=a[39080+r>>0]|0;continue}if((m|0)==37){s=l}else{q=10;break}do{if(!(j>>>0>s>>>0)){q=34;break a}r=s;s=s+1|0;c[k>>2]=s;t=a[n+r>>0]|0}while(!(t<<24>>24==10|t<<24>>24==13));r=t&255;l=s;m=r;p=a[39080+r>>0]|0}if((q|0)==10){if((p|0)!=68){s=m;l=p;while(1){p=c[g>>2]|0;if(p>>>0<256){c[g>>2]=p+1;a[b+p+12>>0]=s}if((l|0)!=78){c[e>>2]=0}u=c[k>>2]|0;if(!((c[h>>2]|0)>>>0>u>>>0)){q=34;break}c[k>>2]=u+1;p=d[(c[b>>2]|0)+u>>0]|0;t=a[39080+p>>0]|0;if(t<<24>>24==68|t<<24>>24==87){break}s=p;l=t<<24>>24}if((q|0)==34){i=f;return}c[k>>2]=u;i=f;return}c[e>>2]=0;e=c[g>>2]|0;c[g>>2]=e+1;a[b+e+12>>0]=m;if((m|0)==60){e=c[k>>2]|0;if(!((c[h>>2]|0)>>>0>e>>>0)){i=f;return}c[k>>2]=e+1;if((a[(c[b>>2]|0)+e>>0]|0)==60){u=c[g>>2]|0;c[g>>2]=u+1;a[b+u+12>>0]=60;i=f;return}else{c[k>>2]=e;i=f;return}}else if((m|0)==62){e=c[k>>2]|0;if(!((c[h>>2]|0)>>>0>e>>>0)){i=f;return}c[k>>2]=e+1;if((a[(c[b>>2]|0)+e>>0]|0)==62){u=c[g>>2]|0;c[g>>2]=u+1;a[b+u+12>>0]=62;i=f;return}else{c[k>>2]=e;i=f;return}}else if((m|0)==47){m=c[h>>2]|0;e=c[k>>2]|0;if(m>>>0>e>>>0){v=e;w=m}else{i=f;return}while(1){m=v+1|0;c[k>>2]=m;e=a[(c[b>>2]|0)+v>>0]|0;u=a[39080+(e&255)>>0]|0;if(!(u<<24>>24==78|u<<24>>24==82)){break}u=c[g>>2]|0;if(u>>>0<256){c[g>>2]=u+1;a[b+u+12>>0]=e;x=c[h>>2]|0;y=c[k>>2]|0}else{x=w;y=m}if(x>>>0>y>>>0){v=y;w=x}else{q=34;break}}if((q|0)==34){i=f;return}c[k>>2]=v;i=f;return}else{i=f;return}}else if((q|0)==34){i=f;return}}function NF(a){a=a|0;var b=0,c=0;b=i;c=u2a(20)|0;zH(c,a);i=b;return c|0}function OF(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=u2a(20)|0;XF(d,a,b);i=c;return d|0}function PF(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;e=i;i=i+32|0;f=e+16|0;g=e+8|0;h=e;j=b+4|0;k=b+8|0;l=c[k>>2]|0;if(!((c[j>>2]|0)>>>0>l>>>0)){c[a>>2]=0;i=e;return}c[k>>2]=l+1;m=d[(c[b>>2]|0)+l>>0]|0;gla(f);l=m;m=0;n=0;o=0;a:while(1){p=l+ -48|0;q=p>>>0<8;r=m&255;s=(l|0)==10;t=o;b:while(1){switch(t|0){case 4:{if(s){u=m;v=n;w=0;break b}else{t=0;continue b}break};case 1:{x=14;break b;break};case 3:{if(q){x=27;break b}vF(f,r);t=0;continue b;break};case 2:{if(q){x=24;break b}vF(f,r);t=0;continue b;break};case 0:{x=6;break b;break};default:{u=m;v=n;w=t;break b}}}c:do{if((x|0)==6){x=0;if((l|0)==40){vF(f,40);u=m;v=n+1|0;w=0;break}else if((l|0)==92){u=m;v=n;w=1;break}else if((l|0)==41){if((n|0)==0){x=8;break a}vF(f,41);u=m;v=n+ -1|0;w=0;break}else{vF(f,l&255);u=m;v=n;w=0;break}}else if((x|0)==14){x=0;if(q){u=p;v=n;w=2}else{switch(l|0){case 10:{break};case 114:{vF(f,13);break};case 13:{u=m;v=n;w=4;break c;break};case 110:{vF(f,10);break};case 116:{vF(f,9);break};case 98:{vF(f,8);break};case 102:{vF(f,12);break};default:{vF(f,l&255)}}u=m;v=n;w=0}}else if((x|0)==24){x=0;u=(m<<3)+ -48+l|0;v=n;w=3}else if((x|0)==27){x=0;t=(m<<3)+ -48+l|0;vF(f,t&255);u=t;v=n;w=0}}while(0);p=c[k>>2]|0;if(!((c[j>>2]|0)>>>0>p>>>0)){x=32;break}c[k>>2]=p+1;l=d[(c[b>>2]|0)+p>>0]|0;m=u;n=v;o=w}do{if((x|0)==8){w=c[f+8>>2]|0;o=c[f+4>>2]|0;if((w|0)>32767){gka(a,o,32767);y=o;break}else{pla(g,o,w);jka(a,g);y=o;break}}else if((x|0)==32){o=c[f+8>>2]|0;w=c[f+4>>2]|0;if((o|0)>32767){gka(a,w,32767);y=w;break}else{pla(h,w,o);jka(a,h);y=w;break}}}while(0);ila(y);i=e;return}function QF(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;e=i;i=i+32|0;f=e+8|0;g=e;h=d+4|0;j=d+8|0;k=c[j>>2]|0;if(!((c[h>>2]|0)>>>0>k>>>0)){c[b>>2]=0;i=e;return}c[j>>2]=k+1;l=a[(c[d>>2]|0)+k>>0]|0;gla(f);if(!(l<<24>>24==62)){k=1;m=l&255;l=0;while(1){n=m+ -48|0;do{if(!(n>>>0<10)){if((m+ -65|0)>>>0<6){o=(k|0)!=0;p=m+ -55|0;if(o){q=p<<4}else{r=p+l|0;vF(f,r&255);q=r}s=o&1^1;t=q;break}if((m+ -97|0)>>>0<6){o=(k|0)!=0;r=m+ -87|0;if(o){u=r<<4}else{p=r+l|0;vF(f,p&255);u=p}s=o&1^1;t=u}else{s=k;t=l}}else{o=(k|0)!=0;if(o){v=n<<4}else{p=n+l|0;vF(f,p&255);v=p}s=o&1^1;t=v}}while(0);n=c[j>>2]|0;if(!((c[h>>2]|0)>>>0>n>>>0)){break}c[j>>2]=n+1;o=a[(c[d>>2]|0)+n>>0]|0;if(o<<24>>24==62){break}else{k=s;m=o&255;l=t}}if((s|0)==0){vF(f,t&255)}}t=c[f+8>>2]|0;s=c[f+4>>2]|0;if((t|0)>32767){gka(b,s,32767)}else{pla(g,s,t);jka(b,g)}ila(s);i=e;return}function RF(a){a=a|0;var b=0;b=i;Wy(a+12|0);c[a+56>>2]=0;c[a+40>>2]=0;c[a+36>>2]=0;c[a+48>>2]=0;c[a>>2]=0;c[a+28>>2]=0;i=b;return}function SF(a){a=a|0;var b=0;b=i;TF(a);i=b;return}function TF(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;b=i;d=a+56|0;e=c[d>>2]|0;if((e|0)!=0){vD(e);v2a(e)}e=a+36|0;f=c[e>>2]|0;if((f|0)!=0){FI(f);v2a(f)}f=a+40|0;g=c[f>>2]|0;if((g|0)!=0){h=a+44|0;j=c[h>>2]|0;if((j|0)==0){k=g}else{l=g;g=j;j=0;while(1){m=c[l+(j<<2)>>2]|0;if((m|0)==0){n=g;o=l}else{FI(m);v2a(m);n=c[h>>2]|0;o=c[f>>2]|0}j=j+1|0;if(!(j>>>0<n>>>0)){k=o;break}else{l=o;g=n}}}v2a(k)}k=a+48|0;n=c[k>>2]|0;if((n|0)!=0?(c[e>>2]|0)==0:0){v2a(n)}c[d>>2]=0;c[f>>2]=0;c[e>>2]=0;c[k>>2]=0;c[a>>2]=0;i=b;return}function UF(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;if((!((c[a>>2]|0)!=0|(b|0)==0)?(c[b+8>>2]|0)!=0:0)?(c[b>>2]|0)!=0:0){c[a+4>>2]=b;c[a+8>>2]=0;c[a>>2]=1;c[a+32>>2]=1;c[a+60>>2]=0;f=c[b>>2]|0;c[e>>2]=38736;c[e+4>>2]=8;b=$H(f,e)|0;if((b|0)==0){c[a>>2]=2;i=d;return}e=c[b>>2]|0;if((e|0)==5){f=c[b+16>>2]|0;c[a+44>>2]=f;if((f|0)==0){c[a>>2]=2;i=d;return}else{c[a+40>>2]=w2a(f,4)|0;i=d;return}}else if((e|0)==7){c[a+44>>2]=0;e=u2a(28)|0;EI(e);c[a+36>>2]=e;rH(e,b,0,0,0);i=d;return}else{c[a>>2]=2;i=d;return}}c[a>>2]=2;i=d;return}function VF(a,b,d,e,f,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;k=i;i=i+96|0;l=k+72|0;m=k+64|0;n=k+56|0;o=k+40|0;p=k+32|0;q=k+16|0;r=k+8|0;s=k;c[a+28>>2]=f;c[a+4>>2]=b;c[a+8>>2]=1;f=c[b>>2]|0;c[m>>2]=1293304;c[m+4>>2]=6;mI(l,f,m);if((d|0)!=0){Wla(l,d+48|0)}m=c[b>>2]|0;c[n>>2]=1293296;c[n+4>>2]=4;f=jI(m,n)|0;c[o+0>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[p>>2]=0;do{if((f|0)!=0){CH(q,f);c[o+0>>2]=c[q+0>>2];c[o+4>>2]=c[q+4>>2];c[o+8>>2]=c[q+8>>2];c[o+12>>2]=c[q+12>>2];lE(p)|0;XIa(c[p>>2]|0,+g[o>>2],+g[o+8>>2],+g[o+4>>2],+g[o+12>>2]);CC(p,l);if((e|0)==0){Kla(o,l);break}else{CC(p,e);Kla(o,l);Kla(o,e);break}}}while(0);q=c[b>>2]|0;c[r>>2]=669496;c[r+4>>2]=9;f=iI(q,r)|0;r=u2a(908)|0;uD(r);q=a+56|0;c[q>>2]=r;xD(r,c[b+8>>2]|0,c[b+12>>2]|0,c[b+16>>2]|0,e,b,f,o,h,d,j);j=(c[(c[q>>2]|0)+736>>2]|0)+48|0;c[j+0>>2]=c[l+0>>2];c[j+4>>2]=c[l+4>>2];c[j+8>>2]=c[l+8>>2];c[j+12>>2]=c[l+12>>2];c[j+16>>2]=c[l+16>>2];c[j+20>>2]=c[l+20>>2];j=(c[(c[q>>2]|0)+736>>2]|0)+72|0;c[j+0>>2]=c[l+0>>2];c[j+4>>2]=c[l+4>>2];c[j+8>>2]=c[l+8>>2];c[j+12>>2]=c[l+12>>2];c[j+16>>2]=c[l+16>>2];c[j+20>>2]=c[l+20>>2];l=c[p>>2]|0;if((l|0)!=0){j=c[(c[q>>2]|0)+736>>2]|0;Zy(s,l);yC(j+4|0,s,2);qm(s)}if((c[b+36>>2]&256|0)==0){t=a+44|0;c[t>>2]=0;u=u2a(28)|0;EI(u);v=a+36|0;c[v>>2]=u;w=b+4|0;x=c[w>>2]|0;rH(u,x,0,0,0);y=c[v>>2]|0;z=vH(y)|0;A=a+48|0;c[A>>2]=z;B=sH(y)|0;C=a+52|0;c[C>>2]=B;c[a>>2]=1;D=a+32|0;c[D>>2]=2;E=a+60|0;c[E>>2]=0;qm(p);i=k;return}s=ky((c[(c[q>>2]|0)+736>>2]|0)+20|0)|0;c[s+16>>2]=0;g[s+48>>2]=1.0;g[s+52>>2]=1.0;c[s+20>>2]=0;t=a+44|0;c[t>>2]=0;u=u2a(28)|0;EI(u);v=a+36|0;c[v>>2]=u;w=b+4|0;x=c[w>>2]|0;rH(u,x,0,0,0);y=c[v>>2]|0;z=vH(y)|0;A=a+48|0;c[A>>2]=z;B=sH(y)|0;C=a+52|0;c[C>>2]=B;c[a>>2]=1;D=a+32|0;c[D>>2]=2;E=a+60|0;c[E>>2]=0;qm(p);i=k;return}function WF(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0,N=0.0,O=0.0;e=i;i=i+48|0;f=e+40|0;h=e+32|0;j=e+16|0;k=e;if((c[b>>2]|0)!=1){i=e;return}l=b+32|0;m=b+60|0;n=b+44|0;o=b+40|0;p=b+36|0;q=b+48|0;r=b+52|0;s=b+4|0;t=f+4|0;u=b+56|0;v=b+12|0;w=(d|0)==0;a:while(1){x=c[l>>2]|0;while(1){if((x|0)==1){y=c[m>>2]|0;if((y|0)==(c[n>>2]|0)){z=c[o>>2]|0;if((z|0)==0){A=c[p>>2]|0;c[q>>2]=vH(A)|0;c[r>>2]=sH(A)|0}else{c[r>>2]=0;if((y|0)==0){B=0;C=0}else{A=0;D=0;while(1){E=(sH(c[z+(D<<2)>>2]|0)|0)+1+A|0;if(!(E>>>0>A>>>0)){F=9;break a}c[r>>2]=E;D=D+1|0;if(!(D>>>0<y>>>0)){B=E;C=y;break}else{A=E}}}A=w2a(B,1)|0;c[q>>2]=A;if((A|0)==0){F=13;break a}b:do{if((C|0)!=0){y=A;D=0;z=0;while(1){E=c[(c[o>>2]|0)+(D<<2)>>2]|0;G=vH(E)|0;c3a(y+z|0,G|0,sH(E)|0)|0;E=sH(c[(c[o>>2]|0)+(D<<2)>>2]|0)|0;a[(c[q>>2]|0)+(E+z)>>0]=32;G=c[(c[o>>2]|0)+(D<<2)>>2]|0;if((G|0)!=0){FI(G);v2a(G)}G=D+1|0;if(!(G>>>0<(c[n>>2]|0)>>>0)){break b}y=c[q>>2]|0;D=G;z=z+1+E|0}}}while(0);v2a(c[o>>2]|0);c[o>>2]=0}c[l>>2]=2;H=2;I=0}else{A=c[c[s>>2]>>2]|0;c[f>>2]=38736;c[t>>2]=8;z=jI(A,f)|0;A=u2a(28)|0;EI(A);c[(c[o>>2]|0)+(c[m>>2]<<2)>>2]=A;if((z|0)==0){J=0}else{J=GH(z,c[m>>2]|0)|0}rH(c[(c[o>>2]|0)+(c[m>>2]<<2)>>2]|0,J,0,0,0);H=c[l>>2]|0;I=(c[m>>2]|0)+1|0}c[m>>2]=I;K=H}else{K=x}if((K|0)!=2){L=K;break}if((c[u>>2]|0)==0){z=u2a(908)|0;uD(z);c[u>>2]=z;A=c[s>>2]|0;xD(z,c[A+8>>2]|0,c[A+12>>2]|0,0,0,A,c[A+16>>2]|0,A+20|0,v,0,0);rC(Yl((c[(c[u>>2]|0)+736>>2]|0)+12|0)|0)}A=c[m>>2]|0;z=c[r>>2]|0;if(!(A>>>0<z>>>0)){F=29;break a}D=AF(c[u>>2]|0,(c[q>>2]|0)+A|0,z-A|0,100)|0;c[m>>2]=(c[m>>2]|0)+D;if((c[(c[u>>2]|0)+728>>2]|0)==0){F=31;break}c[l>>2]=3;if((c[b>>2]|0)==1){x=3}else{F=51;break a}}if((F|0)==31){F=0;L=c[l>>2]|0}if((L|0)==3){break}if(!w?(Lc[c[c[d>>2]>>2]&255](d)|0)!=0:0){F=51;break}if((c[b>>2]|0)!=1){F=51;break}}if((F|0)==9){c[b>>2]=2;i=e;return}else if((F|0)==13){c[b>>2]=2;i=e;return}else if((F|0)==29){c[l>>2]=3}else if((F|0)==51){i=e;return}F=b+28|0;l=c[F>>2]|0;if((l|0)!=0){c[l>>2]=c[(c[u>>2]|0)+860>>2];l=Fla(+g[(c[u>>2]|0)+864>>2]*1.0e3)|0;c[(c[F>>2]|0)+40>>2]=l;l=Fla(+g[(c[u>>2]|0)+872>>2]*1.0e3)|0;c[(c[F>>2]|0)+44>>2]=l;l=Fla(+g[(c[u>>2]|0)+876>>2]*1.0e3)|0;c[(c[F>>2]|0)+56>>2]=l;l=Fla(+g[(c[u>>2]|0)+880>>2]*1.0e3)|0;c[(c[F>>2]|0)+52>>2]=l;l=Fla(+g[(c[u>>2]|0)+884>>2]*1.0e3)|0;c[(c[F>>2]|0)+48>>2]=l}l=c[(c[s>>2]|0)+40>>2]|0;if((l|0)!=0){s=j+8|0;F=j+4|0;u=j+12|0;d=k+8|0;w=k+4|0;L=k+12|0;m=l;do{l=m;m=c[m>>2]|0;q=c[l+8>>2]|0;l=q+8|0;r=c[l>>2]|0;if(((r|0)!=0?(c[r>>2]|0)==1:0)?(c[r+12>>2]|0)==0:0){Zy(h,c[c[r+4>>2]>>2]|0);r=c[h>>2]|0;if(((bJa(r)|0)!=0?(c[q+28>>2]|0)!=4:0)?(v=c[r+4>>2]|0,M=+g[v+4>>2],N=+g[v+24>>2],O=+g[v+28>>2],g[j>>2]=+g[v>>2],g[s>>2]=M,g[F>>2]=N,g[u>>2]=O,O=+g[q+44>>2],N=+g[q+36>>2],M=+g[q+40>>2],g[k>>2]=+g[q+32>>2],g[d>>2]=O,g[w>>2]=N,g[L>>2]=M,(Pla(j,k)|0)!=0):0){hy(l)}qm(h)}}while((m|0)!=0)}c[b>>2]=2;i=e;return}function XF(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;c[a+4>>2]=0;c[a+8>>2]=0;hka(a+12|0,b);c[a>>2]=3;c[a+16>>2]=d;i=e;return}function YF(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;fD(a+52|0,b+52|0);c[a+56>>2]=c[b+56>>2];c[a+60>>2]=c[b+60>>2];e=a+64|0;a=b+64|0;c[e+0>>2]=c[a+0>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[e+12>>2]=c[a+12>>2];c[e+16>>2]=c[a+16>>2];c[e+20>>2]=c[a+20>>2];i=d;return}function ZF(a,b){a=a|0;b=b|0;var c=0;c=i;Wla(a+64|0,b);_F(a);i=c;return}function _F(a){a=a|0;var b=0,d=0,e=0,f=0.0,h=0;b=i;i=i+16|0;d=b;e=c[a+52>>2]|0;if((e|0)==0){i=b;return}c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;f=+g[(c[a+12>>2]|0)+24>>2];h=a+60|0;if((c[h>>2]|0)!=0&f!=0.0){ZIa(d,e,f)}else{YIa(d,e)}Kla(d,a+64|0);if(f==0.0?(c[h>>2]|0)!=0:0){g[d>>2]=+g[d>>2]+-.5;h=d+4|0;g[h>>2]=+g[h>>2]+.5;h=d+8|0;g[h>>2]=+g[h>>2]+-.5;h=d+12|0;g[h>>2]=+g[h>>2]+.5}g[a+32>>2]=+g[d>>2];g[a+36>>2]=+g[d+4>>2];g[a+40>>2]=+g[d+12>>2];g[a+44>>2]=+g[d+8>>2];i=b;return}function $F(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+48|0;g=f+16|0;h=f+8|0;j=f;aG(a,e);c[a>>2]=37392;k=a+68|0;c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[a+8>>2]=1;c[a+4>>2]=d;c[a+60>>2]=b;b=lH(d)|0;d=a+12|0;c[h>>2]=1293304;c[h+4>>2]=6;mI(g,b,h);c[d+0>>2]=c[g+0>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];c[d+16>>2]=c[g+16>>2];c[d+20>>2]=c[g+20>>2];c[j>>2]=1283192;c[j+4>>2]=9;c[a+64>>2]=(eI(b,j)|0)==1&1;if((e|0)==0){l=a+92|0;c[l>>2]=0;i=f;return}Wla(d,e);l=a+92|0;c[l>>2]=0;i=f;return}function aG(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;c[a>>2]=37520;g[a+24>>2]=1.0;g[a+12>>2]=1.0;g[a+32>>2]=0.0;g[a+28>>2]=0.0;g[a+20>>2]=0.0;g[a+16>>2]=0.0;e=a+36|0;g[a+48>>2]=1.0;g[e>>2]=1.0;g[a+56>>2]=0.0;g[a+52>>2]=0.0;g[a+44>>2]=0.0;g[a+40>>2]=0.0;if((b|0)==0){i=d;return}c[e+0>>2]=c[b+0>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];c[e+16>>2]=c[b+16>>2];c[e+20>>2]=c[b+20>>2];i=d;return}function bG(a){a=a|0;var b=0;b=i;cG(a);v2a(a);i=b;return}function cG(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=37392;d=c[a+92>>2]|0;if((d|0)==0){i=b;return}Iy(d);v2a(d);i=b;return}function dG(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0;b=i;i=i+48|0;d=b+40|0;e=b+32|0;f=b+24|0;h=b+8|0;j=b;k=a+92|0;if((c[k>>2]|0)!=0){l=1;i=b;return l|0}m=a+4|0;n=lH(c[m>>2]|0)|0;if((n|0)==0){l=0;i=b;return l|0}c[d>>2]=1283192;c[d+4>>2]=9;c[a+64>>2]=(eI(n,d)|0)==1&1;c[e>>2]=37400;c[e+4>>2]=5;g[a+84>>2]=+R(+(+gI(n,e)));c[f>>2]=37408;c[f+4>>2]=5;g[a+88>>2]=+R(+(+gI(n,f)));f=c[m>>2]|0;if((c[f>>2]|0)!=7){l=0;i=b;return l|0}m=u2a(80)|0;Sy(m,c[a+60>>2]|0,0,f,0);c[k>>2]=m;Uy(m,0,a+36|0,0,0,0);m=a+68|0;c[j>>2]=1293296;c[j+4>>2]=4;lI(h,n,j);c[m+0>>2]=c[h+0>>2];c[m+4>>2]=c[h+4>>2];c[m+8>>2]=c[h+8>>2];c[m+12>>2]=c[h+12>>2];l=1;i=b;return l|0}function eG(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;i=i+48|0;h=g+16|0;j=g+8|0;k=g;aG(a,f);c[a>>2]=37424;c[a+8>>2]=2;l=(e|0)!=0;m=l?0:d;c[a+4>>2]=m;c[a+60>>2]=b;c[a+68>>2]=e;if(!l){l=lH(m)|0;m=a+12|0;c[j>>2]=1293304;c[j+4>>2]=6;mI(h,l,j);c[m+0>>2]=c[h+0>>2];c[m+4>>2]=c[h+4>>2];c[m+8>>2]=c[h+8>>2];c[m+12>>2]=c[h+12>>2];c[m+16>>2]=c[h+16>>2];c[m+20>>2]=c[h+20>>2];c[k>>2]=37432;c[k+4>>2]=7;c[a+64>>2]=$H(l,k)|0;if((f|0)!=0){Wla(m,f)}}else{c[a+64>>2]=d}d=a+72|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;c[d+24>>2]=0;i=g;return}function fG(a){a=a|0;var b=0;b=i;c[a>>2]=37424;hG(a);v2a(a);i=b;return}function gG(a){a=a|0;var b=0;b=i;c[a>>2]=37424;hG(a);i=b;return}function hG(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=a+96|0;if((c[d>>2]|0)>0){e=0;do{f=a+(e<<2)+80|0;g=c[f>>2]|0;if((g|0)!=0){Rc[c[(c[g>>2]|0)+4>>2]&1023](g)}c[f>>2]=0;e=e+1|0}while((e|0)<(c[d>>2]|0))}e=a+76|0;f=c[e>>2]|0;if((f|0)!=0?(g=c[a+60>>2]|0,(g|0)!=0):0){h=IG(g)|0;bB(h,c[f+16>>2]|0)}c[a+72>>2]=0;c[e>>2]=0;c[d>>2]=0;i=b;return}function iG(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;b=i;i=i+32|0;d=b+16|0;e=b+8|0;f=b;g=a+72|0;if((c[g>>2]|0)!=0){h=1;i=b;return h|0}j=c[a+64>>2]|0;if((j|0)==0){h=0;i=b;return h|0}k=lH(j)|0;if((k|0)==0){h=0;i=b;return h|0}j=a+96|0;l=c[j>>2]|0;if((l|0)!=0){if((l|0)>0){m=l;l=0;while(1){n=c[a+(l<<2)+80>>2]|0;if((n|0)==0){o=m}else{Rc[c[(c[n>>2]|0)+4>>2]&1023](n);o=c[j>>2]|0}l=l+1|0;if((l|0)>=(o|0)){break}else{m=o}}}c[j>>2]=0}c[d>>2]=37440;c[d+4>>2]=8;o=$H(k,d)|0;do{if((o|0)!=0){if((c[o>>2]|0)!=5){c[a+80>>2]=eC(o)|0;c[j>>2]=1;break}d=c[o+16>>2]|0;m=(d|0)>4?4:d;c[j>>2]=m;if((m|0)>0){m=0;do{c[a+(m<<2)+80>>2]=eC(GH(o,m)|0)|0;m=m+1|0}while((m|0)<(c[j>>2]|0))}}}while(0);c[e>>2]=39808;c[e+4>>2]=10;j=$H(k,e)|0;if((j|0)==0){h=0;i=b;return h|0}c[a+76>>2]=WA(IG(c[a+60>>2]|0)|0,j,0)|0;c[f>>2]=37456;c[f+4>>2]=11;c[g>>2]=eI(k,f)|0;h=1;i=b;return h|0}function jG(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;h=i;i=i+32|0;j=h+24|0;k=h+16|0;l=h+8|0;m=h;n=a+116|0;rH(n,b,0,0,0);o=vH(n)|0;zla(a+144|0,o,sH(n)|0);c[a>>2]=d;c[a+8>>2]=e;c[a+4>>2]=f;d=c[b+12>>2]|0;c[j>>2]=37472;c[j+4>>2]=17;b=a+12|0;c[b>>2]=eI(d,j)|0;c[k>>2]=39840;c[k+4>>2]=16;j=a+16|0;c[j>>2]=eI(d,k)|0;c[l>>2]=37496;c[l+4>>2]=11;c[a+20>>2]=eI(d,l)|0;l=c[b>>2]|0;if((l|0)==0){p=0;i=h;return p|0}b=c[j>>2]|0;if((b|0)==0){p=0;i=h;return p|0}j=c[f+12>>2]|0;if((j|0)>8){p=0;i=h;return p|0}f=(e|0)!=0?1:j;j=a+24|0;c[j>>2]=f;if((f|0)<0|f>>>0>8){p=0;i=h;return p|0}if((l|0)==32){q=-1}else{q=(1<<l)+ -1|0}c[a+28>>2]=q;c[a+32>>2]=(1<<b)+ -1;c[m>>2]=39832;c[m+4>>2]=6;b=jI(d,m)|0;if((b|0)==0){p=0;i=h;return p|0}if((c[b+16>>2]|0)!=((c[j>>2]<<1)+4|0)){p=0;i=h;return p|0}g[a+36>>2]=+DH(b,0);g[a+40>>2]=+DH(b,1);g[a+44>>2]=+DH(b,2);g[a+48>>2]=+DH(b,3);if((c[j>>2]|0)==0){p=1;i=h;return p|0}else{r=0}do{m=r<<1;g[a+(r<<2)+52>>2]=+DH(b,m+4|0);g[a+(r<<2)+84>>2]=+DH(b,m+5|0);r=r+1|0}while(r>>>0<(c[j>>2]|0)>>>0);p=1;i=h;return p|0}function kG(a){a=a|0;var b=0,d=0;b=i;d=(Bla(a+144|0,c[a+20>>2]|0)|0)&3;i=b;return d|0}function lG(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0.0,l=0,m=0.0,n=0.0,o=0.0,p=0.0;e=i;f=a+12|0;h=c[f>>2]|0;j=a+36|0;k=+g[j>>2];l=a+144|0;m=+((Bla(l,h)|0)>>>0);n=m*(+g[a+40>>2]- +g[j>>2]);if((h|0)==32){h=a+28|0;g[b>>2]=k+n/+((c[h>>2]|0)>>>0);j=a+44|0;m=+g[j>>2];o=+((Bla(l,c[f>>2]|0)|0)>>>0);p=m+o*(+g[a+48>>2]- +g[j>>2])/+((c[h>>2]|0)>>>0);g[d>>2]=p;i=e;return}else{h=a+28|0;g[b>>2]=k+n/+((c[h>>2]|0)>>>0);b=a+44|0;n=+g[b>>2];k=+((Bla(l,c[f>>2]|0)|0)>>>0);p=n+k*(+g[a+48>>2]- +g[b>>2])/+((c[h>>2]|0)>>>0);g[d>>2]=p;i=e;return}}function mG(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0;f=i;i=i+80|0;h=f+40|0;j=f+8|0;k=f;l=a+24|0;if((c[l>>2]|0)!=0){m=a+144|0;n=a+16|0;o=a+32|0;p=0;do{q=a+(p<<2)+52|0;r=+g[q>>2];s=+((Bla(m,c[n>>2]|0)|0)>>>0);g[h+(p<<2)>>2]=r+s*(+g[a+(p<<2)+84>>2]- +g[q>>2])/+((c[o>>2]|0)>>>0);p=p+1|0}while(p>>>0<(c[l>>2]|0)>>>0)}l=a+8|0;p=c[l>>2]|0;if((p|0)==0){o=c[a+4>>2]|0;ed[c[(c[o>>2]|0)+4>>2]&127](o,h,b,d,e)|0;i=f;return}c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;c[j+20>>2]=0;c[j+24>>2]=0;c[j+28>>2]=0;o=p;p=0;while(1){n=c[(c[a>>2]|0)+(p<<2)>>2]|0;if((n|0)!=0?(c[n+8>>2]|0)<9:0){gC(n,h,1,j,k)|0;t=c[l>>2]|0}else{t=o}p=p+1|0;if(!(p>>>0<t>>>0)){break}else{o=t}}t=c[a+4>>2]|0;ed[c[(c[t>>2]|0)+4>>2]&127](t,j,b,d,e)|0;i=f;return}function nG(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=i;e=kG(a)|0;f=b+4|0;lG(a,b,f);fma(c,b,f);mG(a,b+8|0,b+12|0,b+16|0);Ala(a+144|0);i=d;return e|0}function oG(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;g=a+144|0;if((d|0)<=0){h=1;i=f;return h|0}j=a+148|0;k=0;while(1){if(!((c[g>>2]|0)>>>0<(c[j>>2]|0)>>>0)){h=0;l=5;break}m=b+(k*20|0)|0;n=b+(k*20|0)+4|0;lG(a,m,n);fma(e,m,n);mG(a,b+(k*20|0)+8|0,b+(k*20|0)+12|0,b+(k*20|0)+16|0);Ala(g);k=k+1|0;if((k|0)>=(d|0)){h=1;l=5;break}}if((l|0)==5){i=f;return h|0}return 0}function pG(a,b,d,e,f,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0.0,I=0,J=0,K=0,L=0;k=i;i=i+192|0;l=k+24|0;m=k+8|0;n=k+4|0;o=k;if((b|0)!=0?!((c[b>>2]|0)!=7|(f|0)==0|(j|0)==0):0){p=l+116|0;EI(p);if((jG(l,b,f,h,j)|0)==0){c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0}else{c[m+0>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;j=(d|0)==5;h=(d&-2|0)==4;f=(d|0)==7;if(!f){b=(d|0)==6;d=b?12:1;if(b){q=d;r=4}else{s=d;t=8}}else{s=16;t=8}if((t|0)==8){q=s;r=f?4:1}f=l+144|0;s=l+148|0;if((c[f>>2]|0)>>>0<(c[s>>2]|0)>>>0){t=l+24|0;d=l+16|0;b=m+4|0;u=m+12|0;v=m+8|0;w=q+ -4|0;x=r+ -2|0;y=(w|0)>0;z=0;A=0;while(1){if(j){B=A}else{B=kG(l)|0}C=h|(B|0)==0;D=C?r:x;E=C?q:w;if(C|y){C=z;F=0;while(1){lG(l,n,o);G=+g[n>>2];H=+g[o>>2];if((C|0)==0){g[b>>2]=G;g[m>>2]=G;g[u>>2]=H;g[v>>2]=H;I=1}else{Rla(m,G,H);I=C}F=F+1|0;if((F|0)>=(E|0)){J=I;K=D;break}else{C=I}}}else{J=z;K=x}C=ca(ca(c[t>>2]|0,K)|0,c[d>>2]|0)|0;D=(c[f>>2]|0)+C|0;c[f>>2]=D;if(h){Ala(f);L=c[f>>2]|0}else{L=D}if(L>>>0<(c[s>>2]|0)>>>0){z=J;A=B}else{break}}}Kla(m,e);c[a+0>>2]=c[m+0>>2];c[a+4>>2]=c[m+4>>2];c[a+8>>2]=c[m+8>>2];c[a+12>>2]=c[m+12>>2]}FI(p);i=k;return}c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;i=k;return}function qG(a){a=a|0;return}function rG(a){a=a|0;var b=0;b=i;v2a(a);i=b;return}function sG(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;g=i;c[f>>2]=0;c[e>>2]=0;if((d|0)==0){h=0;i=g;return h|0}else{j=0;k=0}a:while(1){l=a[b+j>>0]|0;do{if((l&255)>32){if(!(l<<24>>24==122)){if((l&255)>117){m=j;n=k;break a}else{o=k;break}}else{o=k+1|0;break}}else{if(l<<24>>24==32|l<<24>>24==13|l<<24>>24==10|l<<24>>24==9){o=k}else{m=j;n=k;break a}}}while(0);l=j+1|0;if(l>>>0<d>>>0){j=l;k=o}else{m=l;n=o;break}}if((m|0)==0){h=0;i=g;return h|0}if(n>>>0>1073741823){h=-1;i=g;return h|0}o=n<<2;k=m-n|0;if(o>>>0>~k>>>0){h=-1;i=g;return h|0}n=w2a(o+k|0,1)|0;c[e>>2]=n;if((n|0)==0){h=-1;i=g;return h|0}c[f>>2]=0;n=0;k=0;o=0;b:while(1){p=n;c:while(1){m=p;p=p+1|0;q=a[b+m>>0]|0;switch(q<<24>>24){case 122:{r=16;break c;break};case 9:case 32:case 13:case 10:{break};default:{r=18;break c}}if(!(p>>>0<d>>>0)){s=k;t=o;break b}}if((r|0)==16){r=0;m=(c[e>>2]|0)+(c[f>>2]|0)|0;a[m>>0]=0;a[m+1>>0]=0;a[m+2>>0]=0;a[m+3>>0]=0;c[f>>2]=(c[f>>2]|0)+4;u=0;v=0}else if((r|0)==18){r=0;if((q+ -33<<24>>24&255)>84){s=k;t=o;break}m=(k*85|0)+ -33+(q&255)|0;j=o+1|0;if((j|0)==5){l=0;do{w=c[f>>2]|0;c[f>>2]=w+1;a[(c[e>>2]|0)+w>>0]=m>>>(3-l<<3);l=l+1|0}while((l|0)!=4);u=0;v=0}else{u=m;v=j}}if(p>>>0<d>>>0){n=p;k=u;o=v}else{s=u;t=v;break}}if((t|0)!=0){if((t|0)<5){v=t;u=s;while(1){o=(u*85|0)+84|0;v=v+1|0;if((v|0)==5){x=o;break}else{u=o}}}else{x=s}s=t+ -1|0;if((s|0)>0){t=0;do{u=c[f>>2]|0;c[f>>2]=u+1;a[(c[e>>2]|0)+u>>0]=x>>>(3-t<<3);t=t+1|0}while((t|0)!=(s|0))}}if(p>>>0<d>>>0){i=g;return((a[b+p>>0]|0)==62&1)+p|0}else{h=p;i=g;return h|0}return 0}function tG(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;h=i;if((e|0)==0){c[f>>2]=w2a(1,1)|0;c[g>>2]=0;j=0;i=h;return j|0}else{k=0}while(1){l=k+1|0;if((a[b+k>>0]|0)==62){m=k;break}if(l>>>0<e>>>0){k=l}else{m=l;break}}c[f>>2]=w2a((m>>>1)+1|0,1)|0;c[g>>2]=0;m=1;k=0;a:while(1){l=a[b+k>>0]|0;n=l&255;b:do{if(l<<24>>24==13|l<<24>>24==9|l<<24>>24==10|l<<24>>24==32){o=m}else{do{if(!((l+ -48<<24>>24&255)<10)){if((l+ -97<<24>>24&255)<6){p=n+ -87|0;break}if(!((l+ -65<<24>>24&255)<6)){if(l<<24>>24==62){q=13;break a}else{o=m;break b}}else{p=n+ -55|0;break}}else{p=n+ -48|0}}while(0);r=(m|0)!=0;if(r){a[(c[f>>2]|0)+(c[g>>2]|0)>>0]=p<<4}else{s=c[g>>2]|0;c[g>>2]=s+1;t=(c[f>>2]|0)+s|0;a[t>>0]=(d[t>>0]|0)+p}o=r&1^1}}while(0);n=k+1|0;if(n>>>0<e>>>0){m=o;k=n}else{u=o;v=n;break}}if((q|0)==13){u=m;v=k+1|0}if((u|0)!=0){j=v;i=h;return j|0}c[g>>2]=(c[g>>2]|0)+1;j=v;i=h;return j|0}function uG(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;h=i;c[g>>2]=0;j=(e|0)==0;do{if(!j){k=0;l=0;while(1){m=b+l|0;n=a[m>>0]|0;o=n&255;if(n<<24>>24>-1){p=o+1+k|0;c[g>>2]=p;if(p>>>0<k>>>0){q=-1;r=23;break}s=p;t=l+2+(d[m>>0]|0)|0}else{if(!((n&255)>128)){u=k;r=9;break}n=k+(257-o)|0;c[g>>2]=n;if(n>>>0<k>>>0){q=-1;r=23;break}s=n;t=l+2|0}if(t>>>0<e>>>0){k=s;l=t}else{u=s;r=9;break}}if((r|0)==9){if(u>>>0>20971519){q=-1}else{v=u;break}i=h;return q|0}else if((r|0)==23){i=h;return q|0}}else{v=0}}while(0);r=w2a(v,1)|0;c[f>>2]=r;if((r|0)==0){q=-1;i=h;return q|0}a:do{if(j){w=0}else{r=e+ -1|0;v=0;u=0;while(1){s=b+u|0;t=a[s>>0]|0;if(t<<24>>24>-1){g=(t&255)+1|0;l=e-u+ -1|0;if(l>>>0<g>>>0){f3a((c[f>>2]|0)+(l+v)|0,0,g-l|0)|0;x=l}else{x=g}c3a((c[f>>2]|0)+v|0,b+(u+1)|0,x|0)|0;g=d[s>>0]|0;y=v+1+g|0;z=u+2+g|0}else{if(!((t&255)>128)){w=u;break a}if(u>>>0<r>>>0){A=a[b+(u+1)>>0]|0}else{A=0}f3a((c[f>>2]|0)+v|0,A|0,257-(t&255)|0)|0;y=v+257-(d[s>>0]|0)|0;z=u+2|0}if(z>>>0<e>>>0){v=y;u=z}else{w=z;break}}}}while(0);z=w+1|0;q=z>>>0>e>>>0?e:z;i=h;return q|0}function vG(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;g=i;i=i+48|0;h=g+40|0;j=g+32|0;k=g+24|0;l=g+16|0;m=g+8|0;n=g;if((f|0)!=0){c[h>>2]=1291960;c[h+4>>2]=1;o=eI(f,h)|0;c[j>>2]=37528;c[j+4>>2]=9;h=eI(f,j)|0;c[k>>2]=37544;c[k+4>>2]=16;j=eI(f,k)|0;c[l>>2]=37568;c[l+4>>2]=8;k=eI(f,l)|0;c[m>>2]=37584;c[m+4>>2]=7;l=fI(f,m,1728)|0;c[n>>2]=37592;c[n+4>>2]=4;m=eI(f,n)|0;n=(m|0)>65535?0:m;if((l|0)<1|(n|0)<0|(l|0)>65535){p=0;i=g;return p|0}else{q=k;r=j;s=l;t=h;u=o;v=n}}else{q=0;r=0;s=1728;t=0;u=0;v=0}n=Et(c[(xt()|0)+4>>2]|0)|0;p=Nc[c[(c[n>>2]|0)+8>>2]&7](n,a,b,d,e,u,t,r,q,s,v)|0;i=g;return p|0}function wG(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;j=i;i=i+48|0;k=j+32|0;l=j+24|0;m=j+16|0;n=j+8|0;o=j;if((h|0)!=0){c[k>>2]=37600;c[k+4>>2]=9;p=eI(h,k)|0;c[l>>2]=37616;c[l+4>>2]=11;fI(h,l,1)|0;c[m>>2]=37632;c[m+4>>2]=6;l=fI(h,m,1)|0;c[n>>2]=39840;c[n+4>>2]=16;m=fI(h,n,8)|0;c[o>>2]=37584;c[o+4>>2]=7;n=fI(h,o,1)|0;if((xG(l,m,n)|0)==0){q=0;i=j;return q|0}else{r=m;s=l;t=n;u=p}}else{r=0;s=0;t=0;u=0}p=Jt(c[(xt()|0)+4>>2]|0)|0;q=Nc[c[(c[p>>2]|0)+8>>2]&7](p,a,b,d,e,f,g,u,s,r,t)|0;i=j;return q|0}function xG(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=i;do{if((c|a|0)>=0){if((c|0)>0?(2147483647/(c|0)|0|0)<(a|0):0){e=0;break}f=ca(c,a)|0;if((b|0)>=0){if((f|0)>0?(2147483647/(f|0)|0|0)<(b|0):0){e=0;break}e=(ca(f,b)|0)<2147483641&1}else{e=0}}else{e=0}}while(0);i=d;return e|0}function yG(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;j=i;i=i+48|0;k=j+32|0;l=j+24|0;m=j+16|0;n=j+8|0;o=j;if((e|0)!=0){c[k>>2]=37600;c[k+4>>2]=9;p=eI(e,k)|0;c[l>>2]=37616;c[l+4>>2]=11;k=fI(e,l,1)|0;c[m>>2]=37632;c[m+4>>2]=6;l=fI(e,m,1)|0;c[n>>2]=39840;c[n+4>>2]=16;m=fI(e,n,8)|0;c[o>>2]=37584;c[o+4>>2]=7;n=fI(e,o,1)|0;if((xG(l,m,n)|0)==0){q=-1;i=j;return q|0}else{r=m;s=l;t=n;u=k;v=p}}else{r=0;s=0;t=0;u=1;v=0}p=Jt(c[(xt()|0)+4>>2]|0)|0;q=Zc[c[(c[p>>2]|0)+12>>2]&3](p,a,b,d,u,v,s,r,t,f,g,h)|0;i=j;return q|0}function zG(a,b,d,e,f,g,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0;l=i;i=i+208|0;m=l+200|0;n=l+192|0;o=l+176|0;p=l+160|0;q=l+152|0;r=l+148|0;s=l+144|0;t=l+136|0;u=l+128|0;v=l+124|0;w=l+120|0;x=l+112|0;y=l+104|0;z=l+96|0;A=l+88|0;B=l+80|0;C=l+72|0;D=l+64|0;E=l+56|0;F=l+48|0;G=l+40|0;H=l+32|0;I=l+24|0;J=l+16|0;K=l+8|0;L=l;if((d|0)==0){M=0;i=l;return M|0}c[m>>2]=39824;c[m+4>>2]=6;N=$H(d,m)|0;if((N|0)==0){M=0;i=l;return M|0}if(!(((c[N>>2]|0)+ -4|0)>>>0<2)){M=0;i=l;return M|0}c[n>>2]=38384;c[n+4>>2]=11;m=$H(d,n)|0;Ija(o,4);Ija(p,4);if((c[N>>2]|0)==5){if((m|0)==0){O=0}else{O=(c[m>>2]|0)==5?m:0}n=N+16|0;if((c[n>>2]|0)!=0){d=(O|0)==0;P=0;do{IH(q,N,P);jka(r,q);AG(o,r);dka(r);if(d){yg(p,0)}else{yg(p,KH(O,P)|0)}P=P+1|0}while(P>>>0<(c[n>>2]|0)>>>0)}}else{gH(t,N);jka(s,t);AG(o,s);dka(s);if((m|0)==0){Q=0}else{Q=lH(m)|0}yg(p,Q)}Q=o+4|0;m=c[Q>>2]|0;a:do{if((m|0)>0){s=x+4|0;t=(k|0)==0;N=z+4|0;n=y+4|0;P=A+4|0;O=B+4|0;d=C+4|0;r=D+4|0;q=E+4|0;R=F+4|0;S=G+4|0;T=I+4|0;U=H+4|0;V=J+4|0;W=K+4|0;X=L+4|0;Y=m;Z=0;_=a;$=b;b:while(1){aa=(Z|0)==(Y+ -1|0)?j:0;hka(u,Mh(o,Z)|0);ba=c[(Hg(p,Z)|0)>>2]|0;c[v>>2]=0;c[w>>2]=-1;c[x>>2]=39960;c[s>>2]=11;ca=c[u>>2]|0;c:do{if(!(vka(ca,x)|0)?(c[y>>2]=37640,c[n>>2]=2,!(vka(ca,y)|0)):0){c[A>>2]=37648;c[P>>2]=9;if(!(vka(ca,A)|0)?(c[B>>2]=37664,c[O>>2]=3,!(vka(ca,B)|0)):0){c[C>>2]=37672;c[d>>2]=13;if(!(vka(ca,C)|0)?(c[D>>2]=37688,c[r>>2]=3,!(vka(ca,D)|0)):0){c[E>>2]=37696;c[q>>2]=14;if(!(vka(ca,E)|0)?(c[F>>2]=37712,c[R>>2]=3,!(vka(ca,F)|0)):0){c[G>>2]=39992;c[S>>2]=15;do{if(!(vka(ca,G)|0)){c[H>>2]=37720;c[U>>2]=2;if(vka(ca,H)|0){break}c[J>>2]=37728;c[V>>2]=3;if(vka(ca,J)|0){da=40;break b}c[K>>2]=37736;c[W>>2]=3;if(vka(ca,K)|0){da=42;break b}c[L>>2]=37744;c[X>>2]=5;if(vka(ca,L)|0){ea=_;fa=$;break c}else{da=44;break b}}}while(0);if(!t?(Z|0)==((c[Q>>2]|0)+ -1|0):0){da=37;break b}ga=uG(_,$,v,w)|0;da=45;break}ga=tG(_,$,v,w)|0;da=45;break}ga=sG(_,$,v,w)|0;da=45;break}ga=yG(1,_,$,ba,aa,v,w)|0;da=45}else{da=20}}while(0);if((da|0)==20){da=0;if(!t?(Z|0)==((c[Q>>2]|0)+ -1|0):0){da=22;break}ga=yG(0,_,$,ba,aa,v,w)|0;da=45}if((da|0)==45){da=0;if((_|0)!=(a|0)){v2a(_)}if((ga|0)==-1){ha=0;break}ea=c[v>>2]|0;fa=c[w>>2]|0}dka(u);Z=Z+1|0;Y=c[Q>>2]|0;if((Z|0)>=(Y|0)){ia=ea;ja=fa;da=51;break a}else{_=ea;$=fa}}if((da|0)==22){c[z>>2]=39960;c[N>>2]=11;kka(g,z);c[e>>2]=_;c[f>>2]=$;c[h>>2]=ba;ha=1}else if((da|0)==37){c[I>>2]=39992;c[T>>2]=15;kka(g,I);c[e>>2]=_;c[f>>2]=$;c[h>>2]=ba;ha=1}else if((da|0)==40){mka(u,39928);da=44}else if((da|0)==42){mka(u,39744);da=44}if((da|0)==44){ika(g,u);c[h>>2]=ba;c[e>>2]=_;c[f>>2]=$;ha=1}dka(u);ka=ha}else{ia=a;ja=b;da=51}}while(0);if((da|0)==51){mka(g,1305928);c[h>>2]=0;c[e>>2]=ia;c[f>>2]=ja;ka=1}Jja(c[p>>2]|0);FG(o);M=ka;i=l;return M|0}function AG(a,b){a=a|0;b=b|0;var d=0;d=i;hka(Nja(a,c[a+4>>2]|0)|0,b);i=d;return}function BG(b,f,g){b=b|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;h=i;i=i+16|0;j=h;c[j>>2]=0;do{if(g>>>0>1){k=a[f>>0]|0;l=k<<24>>24==-2;if(l){if(!((a[f+1>>0]|0)==-1)){m=24;break}}else{if(!(k<<24>>24==-1)){m=24;break}if(!((a[f+1>>0]|0)==-2)){m=24;break}}n=(g+ -2|0)>>>1;if((n|0)==0){Ona(b,j);Lna(j);i=h;return}if(k<<24>>24==-1){o=(a[f+2>>0]|0)==0&1}else{o=l&1}l=loa(j,n)|0;k=n<<1;n=(o|0)!=0;p=0;q=0;while(1){if(n){r=d[f+(q+2)>>0]<<8|d[f+(q+3)>>0]}else{r=d[f+(q+3)>>0]<<8|d[f+(q+2)>>0]}s=r&65535;a:do{if((s|0)==27){t=q+2|0;while(1){if(!(t>>>0<k>>>0)){u=p;v=t;break a}if(n){w=d[f+(t+2)>>0]<<8|d[f+(t+3)>>0]}else{w=d[f+(t+3)>>0]<<8|d[f+(t+2)>>0]}x=t+2|0;if((w&65535|0)==27){u=p;v=x;break}else{t=x}}}else{c[l+(p<<2)>>2]=s;u=p+1|0;v=q}}while(0);q=v+2|0;if(!(q>>>0<k>>>0)){break}else{p=u}}Tna(j,u)}else{m=24}}while(0);if((m|0)==24){m=loa(j,g)|0;if((g|0)!=0){u=0;do{c[m+(u<<2)>>2]=e[37752+(d[f+u>>0]<<1)>>1]|0;u=u+1|0}while((u|0)!=(g|0))}Tna(j,g)}Ona(b,j);Lna(j);i=h;return}function CG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=(b|0)==0;if(e){f=0}else{f=c[b+4>>2]|0}BG(a,e?1305928:b+12|0,f);i=d;return}function DG(b,d,f){b=b|0;d=d|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;if((f|0)==-1){h=T1a(d)|0}else{h=f}c[b>>2]=0;f=Bka(b,h)|0;j=(h|0)>0;a:do{if(j){k=0;while(1){l=c[d+(k<<2)>>2]|0;m=0;while(1){n=m+1|0;if((e[37752+(m<<1)>>1]|0|0)==(l|0)){o=m;break}if((n|0)<256){m=n}else{o=n;break}}if((o|0)==256){p=k;break a}a[f+k>>0]=o;m=k+1|0;if((m|0)<(h|0)){k=m}else{p=m;break}}}else{p=0}}while(0);Aka(b,p);if((p|0)==(h|0)){i=g;return}if((h|0)>1073741822){Aka(b,0);i=g;return}p=(h<<1)+2|0;o=Bka(b,p)|0;a[o>>0]=-2;a[o+1>>0]=-1;if(j){j=o;o=0;do{f=j;j=j+2|0;k=d+(o<<2)|0;a[j>>0]=(c[k>>2]|0)>>>8;a[f+3>>0]=c[k>>2];o=o+1|0}while((o|0)!=(h|0))}Aka(b,p);i=g;return}function EG(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=i;i=i+32|0;g=f+16|0;h=f+8|0;j=f;gla(g);k=c[d>>2]|0;if((k|0)==0){l=0}else{l=c[k+4>>2]|0}if((e|0)!=0){vF(g,60);if((l|0)>0){e=0;do{k=c[d>>2]|0;if((k|0)==0){m=0}else{m=a[k+e+12>>0]|0}vF(g,a[756320+((m&255)>>>4)>>0]|0);k=c[d>>2]|0;if((k|0)==0){n=0}else{n=a[k+e+12>>0]|0}vF(g,a[756320+(n&15)>>0]|0);e=e+1|0}while((e|0)<(l|0))}vF(g,62);pla(h,c[g+4>>2]|0,c[g+8>>2]|0);jka(b,h);o=g+4|0;p=c[o>>2]|0;ila(p);i=f;return}vF(g,40);if((l|0)>0){h=0;do{e=c[d>>2]|0;a:do{if((e|0)==0){q=0;r=17}else{n=a[e+h+12>>0]|0;m=n&255;switch(n<<24>>24){case 10:{qla(g,38264,2)|0;break a;break};case 13:{qla(g,38272,2)|0;break a;break};case 40:case 92:case 41:{vF(g,92);q=m;r=17;break a;break};default:{q=m;r=17;break a}}}}while(0);if((r|0)==17){r=0;vF(g,q&255)}h=h+1|0}while((h|0)<(l|0))}vF(g,41);pla(j,c[g+4>>2]|0,c[g+8>>2]|0);jka(b,j);o=g+4|0;p=c[o>>2]|0;ila(p);i=f;return}function FG(a){a=a|0;var b=0;b=i;GG(a);Jja(c[a>>2]|0);i=b;return}function GG(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+4|0;if((c[d>>2]|0)>0){e=0;do{dka(Pja(a,e)|0);e=e+1|0}while((e|0)<(c[d>>2]|0))}Kja(a,0)|0;i=b;return}function HG(a,b){a=a|0;b=b|0;var d=0;d=i;Ija(a,16);GI(a+16|0,b);c[a+60>>2]=0;c[a+64>>2]=0;Ija(a+80|0,4);c[a+52>>2]=0;c[a+56>>2]=0;c[a+68>>2]=0;c[a+72>>2]=0;c[a+76>>2]=0;b=c[(xt()|0)+12>>2]|0;c[a+96>>2]=dd[c[(c[b>>2]|0)+8>>2]&511](b,a)|0;b=c[(xt()|0)+8>>2]|0;c[a+100>>2]=dd[c[(c[b>>2]|0)+8>>2]&511](b,a)|0;i=d;return}function IG(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+96|0;e=c[d>>2]|0;if((e|0)!=0){f=e;i=b;return f|0}e=c[(xt()|0)+12>>2]|0;g=dd[c[(c[e>>2]|0)+8>>2]&511](e,a)|0;c[d>>2]=g;f=g;i=b;return f|0}function JG(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+100|0;e=c[d>>2]|0;if((e|0)!=0){f=e;i=b;return f|0}e=c[(xt()|0)+8>>2]|0;g=dd[c[(c[e>>2]|0)+8>>2]&511](e,a)|0;c[d>>2]=g;f=g;i=b;return f|0}function KG(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;i=i+16|0;d=b+4|0;e=b;f=a+16|0;g=a+44|0;h=c[g>>2]|0;c[a+48>>2]=Lc[c[(c[h>>2]|0)+12>>2]&255](h)|0;h=c[g>>2]|0;j=fH(f,Lc[c[c[h>>2]>>2]&255](h)|0,0)|0;if((j|0)==0){i=b;return}h=lH(j)|0;j=a+52|0;c[j>>2]=h;if((h|0)==0){i=b;return}h=c[g>>2]|0;k=fH(f,Lc[c[(c[h>>2]|0)+4>>2]&255](h)|0,0)|0;if((k|0)!=0){c[a+56>>2]=lH(k)|0}k=c[g>>2]|0;g=Lc[c[(c[k>>2]|0)+16>>2]&255](k)|0;if((g|0)!=0){HH(d,g,0);ika(a+60|0,d);dka(d);HH(e,g,1);ika(a+64|0,e);dka(e)}Kja(a+80|0,LG(c[j>>2]|0)|0)|0;i=b;return}function LG(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;i=i+16|0;d=b+8|0;e=b;if((a|0)!=0?(c[d>>2]=38568,c[d+4>>2]=5,f=iI(a,d)|0,(f|0)!=0):0){c[e>>2]=38832;c[e+4>>2]=4;if((nI(f,e)|0)==0){g=1}else{g=WG(f,0)|0}}else{g=0}i=b;return g|0}function MG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;i=i+32|0;e=d+28|0;f=d+24|0;g=d+16|0;h=d+8|0;j=d;c[a+68>>2]=1;k=a+16|0;l=a+44|0;m=c[l>>2]|0;c[a+48>>2]=Lc[c[(c[m>>2]|0)+12>>2]&255](m)|0;m=c[l>>2]|0;n=fH(k,Lc[c[c[m>>2]>>2]&255](m)|0,0)|0;if((n|0)==0){c[a+52>>2]=0;i=d;return}m=lH(n)|0;c[a+52>>2]=m;if((m|0)==0){i=d;return}m=c[l>>2]|0;n=fH(k,Lc[c[(c[m>>2]|0)+4>>2]&255](m)|0,0)|0;if((n|0)==0){o=0}else{o=lH(n)|0}c[a+56>>2]=o;o=c[l>>2]|0;l=Lc[c[(c[o>>2]|0)+16>>2]&255](o)|0;if((l|0)!=0){HH(e,l,0);ika(a+60|0,e);dka(e);HH(f,l,1);ika(a+64|0,f);dka(f)}c[g>>2]=1274672;c[g+4>>2]=1;f=_H(b,g)|0;if((f|0)!=0?(c[f>>2]|0)==2:0){p=jH(f)|0}else{p=0}Kja(a+80|0,p)|0;c[h>>2]=669064;c[h+4>>2]=1;p=_H(b,h)|0;if((p|0)!=0?(c[p>>2]|0)==2:0){c[a+72>>2]=jH(p)|0}c[j>>2]=669056;c[j+4>>2]=1;p=_H(b,j)|0;if((p|0)==0){i=d;return}if((c[p>>2]|0)!=2){i=d;return}c[a+76>>2]=jH(p)|0;i=d;return}function NG(a){a=a|0;var b=0;b=i;Kja(a+80|0,LG(c[a+52>>2]|0)|0)|0;i=b;return}function OG(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+100>>2]|0;if((d|0)!=0){e=c[(xt()|0)+8>>2]|0;Ic[c[(c[e>>2]|0)+12>>2]&511](e,d)}if((c[a+96>>2]|0)!=0){d=c[(xt()|0)+12>>2]|0;Ic[c[(c[d>>2]|0)+12>>2]&511](d,a);d=c[(xt()|0)+12>>2]|0;Ic[c[(c[d>>2]|0)+24>>2]&511](d,a)}Jja(c[a+80>>2]|0);dka(a+64|0);dka(a+60|0);HI(a+16|0);yna(a);i=b;return}function PG(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;g=i;i=i+32|0;h=g+16|0;j=g+8|0;k=g;c[h>>2]=38832;c[h+4>>2]=4;l=jI(b,h)|0;if((l|0)==0){m=(e|0)==0?b:0;i=g;return m|0}if((f|0)>1023){m=0;i=g;return m|0}h=c[l+16>>2]|0;if((h|0)<=0){m=0;i=g;return m|0}n=j+4|0;o=a+80|0;p=k+4|0;q=e;e=0;a:while(1){r=KH(l,e)|0;do{if((r|0)!=0){if((r|0)!=(b|0)){c[j>>2]=38832;c[n>>2]=4;if((nI(r,j)|0)==0){if((q|0)==0){m=r;s=16;break a}QG(o,d-q|0,c[r+4>>2]|0);t=q+ -1|0;break}else{c[k>>2]=38848;c[p>>2]=5;u=eI(r,k)|0;if((q|0)<(u|0)){s=13;break a}t=q-u|0;break}}else{t=q}}else{t=q+ -1|0}}while(0);e=e+1|0;if((e|0)>=(h|0)){m=0;s=16;break}else{q=t}}if((s|0)==13){m=PG(a,r,d,q,f+1|0)|0;i=g;return m|0}else if((s|0)==16){i=g;return m|0}return 0}function QG(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;if((b|0)>=0?(c[a+4>>2]|0)>(b|0):0){c[(c[a>>2]|0)+(b<<2)>>2]=d}i=e;return}function RG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+16|0;e=d;if((b|0)<0){f=0;i=d;return f|0}g=a+80|0;if((c[a+84>>2]|0)<=(b|0)){f=0;i=d;return f|0}if((((c[a+68>>2]|0)!=0?(c[a+72>>2]|0)==(b|0):0)?(h=fH(a+16|0,c[a+76>>2]|0,0)|0,(h|0)!=0):0)?(c[h>>2]|0)==6:0){f=h;i=d;return f|0}h=SG(g,b)|0;if((h|0)!=0){f=fH(a+16|0,h,0)|0;i=d;return f|0}h=c[a+52>>2]|0;if((h|0)==0){f=0;i=d;return f|0}c[e>>2]=38568;c[e+4>>2]=5;j=iI(h,e)|0;if((j|0)==0){f=0;i=d;return f|0}e=PG(a,j,b,b,0)|0;if((e|0)==0){f=0;i=d;return f|0}QG(g,b,c[e+4>>2]|0);f=e;i=d;return f|0}function SG(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)>=0?(c[a+4>>2]|0)>(b|0):0){e=c[(c[a>>2]|0)+(b<<2)>>2]|0;i=d;return e|0}b=c[0]|0;da();e=b;i=d;return e|0}function TG(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;h=i;i=i+32|0;j=h+16|0;k=h+8|0;l=h;c[j>>2]=38832;c[j+4>>2]=4;if((nI(b,j)|0)==0){if((c[b+4>>2]|0)==(e|0)){m=c[f>>2]|0;i=h;return m|0}j=c[d>>2]|0;if((j|0)!=0){c[d>>2]=j+ -1}c[f>>2]=(c[f>>2]|0)+1;m=-1;i=h;return m|0}c[k>>2]=38832;c[k+4>>2]=4;j=jI(b,k)|0;if((j|0)==0|(g|0)>1023){m=-1;i=h;return m|0}c[l>>2]=38848;c[l+4>>2]=5;k=eI(b,l)|0;l=c[d>>2]|0;if(!(k>>>0>l>>>0)){c[d>>2]=l-k;c[f>>2]=(c[f>>2]|0)+k;m=-1;i=h;return m|0}l=j+16|0;a:do{if((k|0)!=0){n=c[l>>2]|0;if((k|0)==(n|0)){o=0;while(1){p=FH(j,o)|0;if(((p|0)!=0?(c[p>>2]|0)==9:0)?(c[p+16>>2]|0)==(e|0):0){break}p=o+1|0;if(p>>>0<k>>>0){o=p}else{q=7;break a}}QG(a+80|0,(c[f>>2]|0)+o|0,e);m=(c[f>>2]|0)+o|0;i=h;return m|0}else{r=n}}else{q=7}}while(0);if((q|0)==7){r=c[l>>2]|0}k=g+1|0;if((r|0)==0){m=-1;i=h;return m|0}else{s=0}while(1){r=KH(j,s)|0;if(!((r|0)==0|(r|0)==(b|0))?(g=TG(a,r,d,e,f,k)|0,(g|0)>-1):0){m=g;q=22;break}s=s+1|0;if(!(s>>>0<(c[l>>2]|0)>>>0)){m=-1;q=22;break}}if((q|0)==22){i=h;return m|0}return 0}function UG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;i=i+32|0;e=d+16|0;f=d+8|0;g=d;h=a+80|0;j=c[a+84>>2]|0;c[e>>2]=0;a:do{if((j|0)!=0){k=0;l=0;while(1){m=SG(h,l)|0;if((m|0)==(b|0)){n=l;break}if((m|k|0)==0){c[e>>2]=l;o=1}else{o=k}l=l+1|0;if(!(l>>>0<j>>>0)){break a}else{k=o}}i=d;return n|0}}while(0);o=c[a+52>>2]|0;if((o|0)==0){n=-1;i=d;return n|0}c[f>>2]=38568;c[f+4>>2]=5;j=iI(o,f)|0;if((j|0)==0){n=-1;i=d;return n|0}c[g>>2]=0;n=TG(a,j,e,b,g,0)|0;i=d;return n|0}function VG(a){a=a|0;return a|0}function WG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;i=i+32|0;e=d+24|0;f=d+16|0;g=d+8|0;h=d;if((b|0)>128){j=0;i=d;return j|0}c[e>>2]=38848;c[e+4>>2]=5;k=eI(a,e)|0;if((k+ -1|0)>>>0<1048574){j=k;i=d;return j|0}c[f>>2]=38832;c[f+4>>2]=4;k=jI(a,f)|0;if((k|0)==0){j=0;i=d;return j|0}f=k+16|0;if((c[f>>2]|0)==0){l=0}else{e=g+4|0;m=b+1|0;b=0;n=0;while(1){o=KH(k,n)|0;do{if((o|0)!=0){c[g>>2]=38832;c[e>>2]=4;if((nI(o,g)|0)==0){p=b+1|0;break}else{p=(WG(o,m)|0)+b|0;break}}else{p=b}}while(0);n=n+1|0;if(!(n>>>0<(c[f>>2]|0)>>>0)){l=p;break}else{b=p}}}c[h>>2]=38848;c[h+4>>2]=5;sI(a,h,l);j=l;i=d;return j|0}function XG(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+44>>2]|0;if((d|0)==0){e=-1;i=b;return e|0}e=dd[c[(c[d>>2]|0)+24>>2]&511](d,0)|0;i=b;return e|0}function YG(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+32|0;f=e+20|0;g=e+16|0;h=e+8|0;j=e;if((Dma(a+20|0,b,f)|0)==0){k=c[a+44>>2]|0;if((k|0)==0){c[d>>2]=0;l=1;i=e;return l|0}else{l=Qc[c[(c[k>>2]|0)+32>>2]&255](k,b,d)|0;i=e;return l|0}}else{b=c[f>>2]|0;if((c[b>>2]|0)==7){f=c[b+12>>2]|0;c[h>>2]=669432;c[h+4>>2]=7;aI(g,f,h);c[j>>2]=38280;c[j+4>>2]=4;c[d>>2]=(vka(c[g>>2]|0,j)|0)&1;dka(g);l=1;i=e;return l|0}else{c[d>>2]=0;l=1;i=e;return l|0}}return 0}function ZG(a){a=a|0;var b=0;b=i;GI(a,0);c[a+36>>2]=0;c[a+40>>2]=0;c[a+44>>2]=0;i=b;return}function _G(a){a=a|0;var b=0,d=0;b=i;if((c[a+44>>2]|0)!=0?(d=c[a+40>>2]|0,(d|0)!=0):0){Rc[c[c[d>>2]>>2]&1023](d)}HI(a);i=b;return}function $G(){var a=0,b=0,d=0,e=0,f=0,g=0;a=i;i=i+16|0;b=a;d=u2a(48)|0;ZG(d);e=u2a(32)|0;Dh(e);f=d+36|0;c[f>>2]=e;II(d,e)|0;e=u2a(32)|0;Dh(e);g=c[f>>2]|0;c[b>>2]=38288;c[b+4>>2]=3;oI(g,b,e,0);i=a;return d|0}function aH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+16|0;e=d+8|0;f=d+4|0;g=d;h=a+36|0;if((c[h>>2]|0)==0){j=0;i=d;return j|0}qla(b,38296,10)|0;k=a+4|0;l=(c[a+12>>2]|0)==0;c[e>>2]=l?0:-1;if(!l){do{Cma(k,e,f,g);l=qla(sla(b,c[f>>2]|0)|0,38312,8)|0;qla(wL(l,c[g>>2]|0)|0,38328,12)|0}while((c[e>>2]|0)!=0)}e=qla(b,38344,17)|0;qla(sla(e,c[(c[h>>2]|0)+4>>2]|0)|0,38368,15)|0;j=1;i=d;return j|0}function bH(a){a=a|0;var b=0;b=i;if((c[a+4>>2]|0)!=0){i=b;return}cH(a);i=b;return}function cH(a){a=a|0;var b=0;b=i;switch(c[a>>2]|0){case 7:{AI(a);v2a(a);break};case 4:{dka(a+12|0);v2a(a);break};case 3:{dka(a+12|0);v2a(a);break};case 6:{XH(a);v2a(a);break};case 5:{BH(a);v2a(a);break};default:{v2a(a)}}i=b;return}function dH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=b;a:while(1){switch(c[e>>2]|0){case 4:{f=6;break a;break};case 1:{f=3;break a;break};case 3:{f=5;break a;break};case 9:{break};case 2:{f=4;break a;break};default:{f=10;break a}}b=c[e+12>>2]|0;if((b|0)==0){f=10;break}g=fH(b,c[e+16>>2]|0,0)|0;if((g|0)==0){f=9;break}else{e=g}}if((f|0)==3){eka(a,(c[e+12>>2]|0)!=0?1273800:38688,-1);i=d;return}else if((f|0)==4){eH(a,e);i=d;return}else if((f|0)==5){hka(a,e+12|0);i=d;return}else if((f|0)==6){hka(a,e+12|0);i=d;return}else if((f|0)==9){c[a>>2]=0;i=d;return}else if((f|0)==10){c[a>>2]=0;i=d;return}}function eH(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=b+16|0;if((c[b+12>>2]|0)==0){bla(a,+g[e>>2]);i=d;return}else{bka(a,c[e>>2]|0,1);i=d;return}}function fH(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+16|0;f=e;if((b|0)==0){g=0;i=e;return g|0}h=a+4|0;j=b;if((Dma(h,j,f)|0)!=0){k=c[f>>2]|0;i=e;return((c[k+4>>2]|0)==-1?0:k)|0}k=c[a+28>>2]|0;if((k|0)==0){g=0;i=e;return g|0}l=id[c[(c[k>>2]|0)+8>>2]&511](k,a,b,d)|0;if((l|0)==0){g=0;i=e;return g|0}c[l+4>>2]=b;d=a+32|0;if((c[d>>2]|0)>>>0<b>>>0){c[d>>2]=b}b=(Dma(h,j,f)|0)!=0;d=c[f>>2]|0;if(b&(d|0)!=0){cH(d)}c[(Gma(h,j)|0)>>2]=l;g=l;i=e;return g|0}function gH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=b;while(1){b=c[e>>2]|0;if((b|0)==3){f=3;break}else if((b|0)==4){f=6;break}else if((b|0)!=9){f=12;break}b=c[e+12>>2]|0;if((b|0)==0){f=12;break}g=fH(b,c[e+16>>2]|0,0)|0;if((g|0)==0){f=11;break}else{e=g}}if((f|0)==3){g=c[e+12>>2]|0;b=(g|0)==0;if(b){h=0}else{h=c[g+4>>2]|0}c[a>>2]=b?0:g+12|0;c[a+4>>2]=h;i=d;return}else if((f|0)==6){h=c[e+12>>2]|0;e=(h|0)==0;if(e){j=0}else{j=c[h+4>>2]|0}c[a>>2]=e?0:h+12|0;c[a+4>>2]=j;i=d;return}else if((f|0)==11){c[a>>2]=0;c[a+4>>2]=0;i=d;return}else if((f|0)==12){c[a>>2]=0;c[a+4>>2]=0;i=d;return}}function hH(a){a=a|0;var b=0,d=0,e=0,f=0.0,g=0;b=i;d=a;while(1){a=c[d>>2]|0;if((a|0)==2){e=3;break}else if((a|0)!=9){f=0.0;break}a=c[d+12>>2]|0;if((a|0)==0){f=0.0;break}g=fH(a,c[d+16>>2]|0,0)|0;if((g|0)==0){f=0.0;break}else{d=g}}if((e|0)==3){f=+iH(d)}i=b;return+f}function iH(a){a=a|0;var b=0,d=0,e=0.0;b=i;d=a+16|0;if((c[a+12>>2]|0)==0){e=+g[d>>2];i=b;return+e}else{e=+(c[d>>2]|0);i=b;return+e}return 0.0}function jH(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+32|0;d=b;e=c[a>>2]|0;if((e|0)==2){f=kH(a)|0}else if((e|0)==9){c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;g=c[a+12>>2]|0;if((g|0)!=0?(h=fH(g,c[a+16>>2]|0,d)|0,(h|0)!=0):0){f=jH(h)|0}else{f=0}}else if((e|0)==1){f=c[a+12>>2]|0}else{f=0}i=b;return f|0}function kH(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+16|0;if((c[a+12>>2]|0)==0){e=~~+g[d>>2];i=b;return e|0}else{e=c[d>>2]|0;i=b;return e|0}return 0}function lH(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a;while(1){a=c[d>>2]|0;if((a|0)==7){e=4;break}else if((a|0)==6){e=3;break}else if((a|0)!=9){f=0;break}a=c[d+12>>2]|0;if((a|0)==0){f=0;break}g=fH(a,c[d+16>>2]|0,0)|0;if((g|0)==0){f=0;break}else{d=g}}if((e|0)==3){f=d}else if((e|0)==4){f=c[d+12>>2]|0}i=b;return f|0}function mH(a){a=a|0;var b=0;if((c[a>>2]|0)==5){b=a}else{b=0}return b|0}function nH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d+8|0;f=d;g=c[a>>2]|0;if((g|0)==1){c[e>>2]=1273800;c[e+4>>2]=4;c[a+12>>2]=(vka(c[b>>2]|0,e)|0)&1;i=d;return}else if((g|0)==2){oe(f,b);Gna(f,a+12|0,a+16|0);i=d;return}else if((g|0)==4){ika(a+12|0,b);i=d;return}else if((g|0)==3){ika(a+12|0,b);i=d;return}else{i=d;return}}function oH(a){a=a|0;var b=0,d=0,e=0;b=i;if((c[a>>2]|0)==9){d=c[a+12>>2]|0;if((d|0)==0){e=0}else{e=fH(d,c[a+16>>2]|0,0)|0}}else{e=a}i=b;return e|0}function pH(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=i;i=i+32|0;d=c;zma(d,10);e=qH(a,b,d)|0;Bma(d);i=c;return e|0}function qH(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+64|0;f=e+48|0;g=e+44|0;h=e+40|0;j=e+32|0;k=e;do{switch(c[a>>2]|0){case 1:{l=u2a(16)|0;m=c[a+12>>2]|0;c[l+4>>2]=0;c[l+8>>2]=0;c[l>>2]=1;c[l+12>>2]=m;n=l;i=e;return n|0};case 2:{l=u2a(20)|0;m=c[a+12>>2]|0;c[l+4>>2]=0;c[l+8>>2]=0;c[l>>2]=2;c[l+12>>2]=m;c[l+16>>2]=c[a+16>>2];n=l;i=e;return n|0};case 3:{l=u2a(20)|0;XF(l,a+12|0,c[a+16>>2]|0);n=l;i=e;return n|0};case 4:{l=u2a(16)|0;Ov(l,a+12|0);n=l;i=e;return n|0};case 5:{l=u2a(28)|0;wl(l);m=c[a+16>>2]|0;if((m|0)>0){o=a+12|0;p=l+12|0;q=0;do{yg(p,qH(Ch(o,q)|0,b,d)|0);q=q+1|0}while((q|0)!=(m|0))}n=l;i=e;return n|0};case 7:{c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;c[k+20>>2]=0;c[k+24>>2]=0;rH(k,a,1,0,0);m=sH(k)|0;q=a+12|0;o=(c[q>>2]|0)==0;p=u2a(36)|0;r=tH(k)|0;if(o){c[p+4>>2]=0;c[p+8>>2]=0;c[p>>2]=7;c[p+12>>2]=0;c[p+16>>2]=m;c[p+20>>2]=-1;c[p+24>>2]=r;c[p+32>>2]=0}else{o=qH(c[q>>2]|0,b,d)|0;c[p+4>>2]=0;c[p+8>>2]=0;c[p>>2]=7;c[p+12>>2]=o;c[p+16>>2]=m;c[p+20>>2]=-1;c[p+24>>2]=r;c[p+32>>2]=0}FI(k);n=p;i=e;return n|0};case 9:{p=c[a+16>>2]|0;if((b|0)!=0?(r=p,(Fma(d,r)|0)==0):0){c[(Gma(d,r)|0)>>2]=1;if((oH(a)|0)==0){n=0;i=e;return n|0}n=qH(oH(a)|0,1,d)|0;i=e;return n|0}r=u2a(20)|0;m=c[a+12>>2]|0;c[r+4>>2]=0;c[r+8>>2]=0;c[r>>2]=9;c[r+12>>2]=m;c[r+16>>2]=p;n=r;i=e;return n|0};case 8:{r=u2a(12)|0;c[r+4>>2]=0;c[r+8>>2]=0;c[r>>2]=8;n=r;i=e;return n|0};case 6:{r=u2a(32)|0;Dh(r);p=a+12|0;m=ana(p)|0;c[f>>2]=m;if((m|0)!=0){m=r+12|0;do{c[g>>2]=0;bna(p,f,g,h);oe(j,g);gna(m,j,qH(c[h>>2]|0,b,d)|0);dka(g)}while((c[f>>2]|0)!=0)}n=r;i=e;return n|0};default:{n=0;i=e;return n|0}}}while(0);return 0}\n\n\n\nfunction Tqa(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=a+12|0;f=c[e>>2]|0;if((f|0)==0){i=d;return}Rc[c[(c[f>>2]|0)+168>>2]&1023](f);f=c[e>>2]|0;g=a+16|0;h=f+32|0;j=f+20|0;c[h+0>>2]=c[j+0>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];c[j+0>>2]=c[g+0>>2];c[j+4>>2]=c[g+4>>2];c[j+8>>2]=c[g+8>>2];Uqa(c[e>>2]|0,b[a+40>>1]|0,c[a+44>>2]|0,a+48|0,0,1)|0;i=d;return}function Uqa(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0;h=i;i=i+16|0;j=h;if((Rta(a)|0)!=0){k=0;i=h;return k|0}l=a+4|0;m=c[l>>2]|0;if((Lc[c[(c[m>>2]|0)+64>>2]&255](m)|0)==0){k=0;i=h;return k|0}m=c[l>>2]|0;n=a+20|0;Ic[c[(c[m>>2]|0)+200>>2]&511](m,n);m=c[l>>2]|0;l=c[(c[m>>2]|0)+88>>2]|0;o=Sta(a,b,d)|0;Tc[l&31](j,m,n,b,o,e);o=a+32|0;c[o+0>>2]=c[n+0>>2];c[o+4>>2]=c[n+4>>2];c[o+8>>2]=c[n+8>>2];c[n+0>>2]=c[j+0>>2];c[n+4>>2]=c[j+4>>2];c[n+8>>2]=c[j+8>>2];m=a+44|0;c[m+0>>2]=c[j+0>>2];c[m+4>>2]=c[j+4>>2];c[m+8>>2]=c[j+8>>2];j=a+56|0;c[j+0>>2]=c[n+0>>2];c[j+4>>2]=c[n+4>>2];c[j+8>>2]=c[n+8>>2];if((cs(n,o)|0)==0){k=0;i=h;return k|0}if((f|0)!=0?(c[a+240>>2]|0)!=0:0){f=Z1a(76)|0;Qqa(f,a,o,n,b,d,e);Ysa(a,f)}if((g|0)!=0){zra(a,o,n)}if((c[a+248>>2]|0)==0){k=1;i=h;return k|0}g=c[a+12>>2]|0;if((g|0)==0){k=1;i=h;return k|0}ld[c[c[g>>2]>>2]&255](g,n,o);k=1;i=h;return k|0}function Vqa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+12|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}Rc[c[(c[e>>2]|0)+168>>2]&1023](e);e=c[d>>2]|0;f=a+28|0;a=e+32|0;g=e+20|0;c[a+0>>2]=c[g+0>>2];c[a+4>>2]=c[g+4>>2];c[a+8>>2]=c[g+8>>2];c[g+0>>2]=c[f+0>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];Wqa(c[d>>2]|0,0)|0;i=b;return}function Wqa(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;e=i;i=i+352|0;f=e+340|0;g=e+272|0;h=e+196|0;j=e+184|0;k=e+160|0;l=e+136|0;m=e+120|0;n=e+96|0;o=e+72|0;p=e+60|0;q=e+48|0;r=e+24|0;s=e+12|0;t=e;u=a+4|0;v=c[u>>2]|0;if((Lc[c[(c[v>>2]|0)+64>>2]&255](v)|0)==0){w=0;i=e;return w|0}v=a+20|0;x=c[u>>2]|0;Ic[c[(c[x>>2]|0)+156>>2]&511](f,x);if((qr(v,f)|0)!=0){w=0;i=e;return w|0}c[g>>2]=-1;c[g+4>>2]=-1;c[g+8>>2]=-1;f=g+12|0;x=g+40|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;c[f+24>>2]=0;c[x>>2]=-1;x=g+44|0;c[x+0>>2]=0;c[x+4>>2]=0;c[x+8>>2]=0;c[x+12>>2]=0;c[x+16>>2]=0;c[x+20>>2]=0;Um(h);x=(d|0)!=0;if(x?(d=c[u>>2]|0,f=Lc[c[(c[d>>2]|0)+4>>2]&255](d)|0,(f|0)!=0):0){Ic[c[(c[f>>2]|0)+48>>2]&511](f,v);dd[c[(c[f>>2]|0)+36>>2]&511](f,g)|0;dd[c[(c[f>>2]|0)+24>>2]&511](f,h)|0}f=c[u>>2]|0;Ic[c[(c[f>>2]|0)+200>>2]&511](f,v);f=c[u>>2]|0;ld[c[(c[f>>2]|0)+108>>2]&255](j,f,v);f=a+32|0;c[f+0>>2]=c[v+0>>2];c[f+4>>2]=c[v+4>>2];c[f+8>>2]=c[v+8>>2];c[v+0>>2]=c[j+0>>2];c[v+4>>2]=c[j+4>>2];c[v+8>>2]=c[j+8>>2];d=a+44|0;c[d+0>>2]=c[j+0>>2];c[d+4>>2]=c[j+4>>2];c[d+8>>2]=c[j+8>>2];j=a+56|0;c[j+0>>2]=c[v+0>>2];c[j+4>>2]=c[v+4>>2];c[j+8>>2]=c[v+8>>2];if((cs(v,f)|0)==0){w=0;i=e;return w|0}do{if(x?(c[a+240>>2]|0)!=0:0){j=(c[v>>2]|0)==(c[f>>2]|0);d=Z1a(88)|0;y=b[h>>1]|0;z=c[h+4>>2]|0;A=g+28|0;if(j){bra(d,a,f,v,y,z,A,h+48|0);Ysa(a,d);break}else{bra(d,a,f,v,y,z,A,g+40|0);Ysa(a,d);break}}}while(0);g=k+12|0;c[k+0>>2]=c[v+0>>2];c[k+4>>2]=c[v+4>>2];c[k+8>>2]=c[v+8>>2];c[g+0>>2]=c[f+0>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];nt(k);Xsa(a,k);ssa(a);do{if((c[v>>2]|0)==(c[f>>2]|0)){k=(Om(v,f)|0)==0;g=c[u>>2]|0;h=c[g>>2]|0;if(k){ld[c[h+164>>2]&255](s,g,v);k=c[u>>2]|0;ld[c[(c[k>>2]|0)+196>>2]&255](t,k,v);k=r+12|0;c[r+0>>2]=c[s+0>>2];c[r+4>>2]=c[s+4>>2];c[r+8>>2]=c[s+8>>2];c[k+0>>2]=c[t+0>>2];c[k+4>>2]=c[t+4>>2];c[k+8>>2]=c[t+8>>2];nt(r);break}else{ld[c[h+184>>2]&255](p,g,v);g=c[u>>2]|0;ld[c[(c[g>>2]|0)+196>>2]&255](q,g,v);g=o+12|0;c[o+0>>2]=c[p+0>>2];c[o+4>>2]=c[p+4>>2];c[o+8>>2]=c[p+8>>2];c[g+0>>2]=c[q+0>>2];c[g+4>>2]=c[q+4>>2];c[g+8>>2]=c[q+8>>2];nt(o);break}}else{g=c[u>>2]|0;ld[c[(c[g>>2]|0)+164>>2]&255](m,g,v);Ic[c[(c[a>>2]|0)+204>>2]&511](n,a);g=n+12|0;h=l+12|0;c[l+0>>2]=c[m+0>>2];c[l+4>>2]=c[m+4>>2];c[l+8>>2]=c[m+8>>2];c[h+0>>2]=c[g+0>>2];c[h+4>>2]=c[g+4>>2];c[h+8>>2]=c[g+8>>2];nt(l)}}while(0);tsa(a);Wra(a);usa(a);if((c[a+248>>2]|0)==0){w=1;i=e;return w|0}l=c[a+12>>2]|0;if((l|0)==0){w=1;i=e;return w|0}ld[c[(c[l>>2]|0)+8>>2]&255](l,v,f);w=1;i=e;return w|0}function Xqa(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0;j=i;c[a+4>>2]=1;c[a+8>>2]=1;c[a>>2]=757336;c[a+12>>2]=b;b=a+16|0;c[b+0>>2]=c[d+0>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];d=a+28|0;c[d+0>>2]=c[e+0>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];e=a+40|0;g[e>>2]=0.0;g[a+44>>2]=0.0;c[a+48>>2]=0;d=a+52|0;c[d>>2]=-1;b=a+56|0;c[b+0>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b+16>>2]=0;c[b+20>>2]=0;if((f|0)!=0){c[e+0>>2]=c[f+0>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2]}if((h|0)==0){i=j;return}c[d+0>>2]=c[h+0>>2];c[d+4>>2]=c[h+4>>2];c[d+8>>2]=c[h+8>>2];c[d+12>>2]=c[h+12>>2];c[d+16>>2]=c[h+16>>2];c[d+20>>2]=c[h+20>>2];c[d+24>>2]=c[h+24>>2];i=j;return}function Yqa(a){a=a|0;var b=0;b=i;$1a(a);i=b;return}function Zqa(a){a=a|0;return}function _qa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=a+12|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}Rc[c[(c[e>>2]|0)+168>>2]&1023](e);e=c[d>>2]|0;f=a+16|0;g=e+32|0;h=e+20|0;c[g+0>>2]=c[h+0>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];c[h+0>>2]=c[f+0>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];$qa(c[d>>2]|0,a+40|0,a+52|0,0,1)|0;i=b;return}function $qa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;i=i+96|0;h=g+72|0;j=g+48|0;k=g+24|0;l=g;if((Rta(a)|0)!=0){m=0;i=g;return m|0}n=a+4|0;o=c[n>>2]|0;if((Lc[c[(c[o>>2]|0)+64>>2]&255](o)|0)==0){m=0;i=g;return m|0}o=c[n>>2]|0;p=a+20|0;Ic[c[(c[o>>2]|0)+200>>2]&511](o,p);o=c[n>>2]|0;Fc[c[(c[o>>2]|0)+92>>2]&63](h,o,p,b,d);o=a+32|0;c[o+0>>2]=c[p+0>>2];c[o+4>>2]=c[p+4>>2];c[o+8>>2]=c[p+8>>2];c[p+0>>2]=c[h+0>>2];c[p+4>>2]=c[h+4>>2];c[p+8>>2]=c[h+8>>2];n=a+44|0;c[n+0>>2]=c[h+0>>2];c[n+4>>2]=c[h+4>>2];c[n+8>>2]=c[h+8>>2];h=a+56|0;c[h+0>>2]=c[p+0>>2];c[h+4>>2]=c[p+4>>2];c[h+8>>2]=c[p+8>>2];if((cs(p,o)|0)==0){m=0;i=g;return m|0}if((e|0)!=0?(c[a+240>>2]|0)!=0:0){e=Z1a(80)|0;Xqa(e,a,o,p,b,d);Ysa(a,e)}if((f|0)!=0){f=j+12|0;c[j+0>>2]=c[o+0>>2];c[j+4>>2]=c[o+4>>2];c[j+8>>2]=c[o+8>>2];c[f+0>>2]=c[p+0>>2];c[f+4>>2]=c[p+4>>2];c[f+8>>2]=c[p+8>>2];nt(j);Xsa(a,j);ssa(a);Ic[c[(c[a>>2]|0)+204>>2]&511](l,a);j=l+12|0;l=k+12|0;c[k+0>>2]=c[o+0>>2];c[k+4>>2]=c[o+4>>2];c[k+8>>2]=c[o+8>>2];c[l+0>>2]=c[j+0>>2];c[l+4>>2]=c[j+4>>2];c[l+8>>2]=c[j+8>>2];nt(k);tsa(a);Wra(a);usa(a)}if((c[a+248>>2]|0)==0){m=1;i=g;return m|0}k=c[a+12>>2]|0;if((k|0)==0){m=1;i=g;return m|0}ld[c[(c[k>>2]|0)+4>>2]&255](k,p,o);m=1;i=g;return m|0}function ara(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+12|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}Rc[c[(c[e>>2]|0)+168>>2]&1023](e);e=c[d>>2]|0;f=a+28|0;a=e+32|0;g=e+20|0;c[a+0>>2]=c[g+0>>2];c[a+4>>2]=c[g+4>>2];c[a+8>>2]=c[g+8>>2];c[g+0>>2]=c[f+0>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];Wqa(c[d>>2]|0,0)|0;i=b;return}function bra(a,d,e,f,h,j,k,l){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0;m=i;c[a+4>>2]=1;c[a+8>>2]=1;c[a>>2]=757368;c[a+12>>2]=d;d=a+16|0;c[d+0>>2]=c[e+0>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];e=a+28|0;c[e+0>>2]=c[f+0>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];b[a+40>>1]=h;c[a+44>>2]=j;g[a+48>>2]=+g[k>>2];g[a+52>>2]=+g[k+4>>2];c[a+56>>2]=c[k+8>>2];gt(a+60|0,l);i=m;return}function cra(a){a=a|0;var b=0;b=i;$1a(a);i=b;return}function dra(a){a=a|0;return}function era(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+12|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}Rc[c[(c[e>>2]|0)+168>>2]&1023](e);e=c[d>>2]|0;f=a+16|0;a=e+32|0;g=e+20|0;c[a+0>>2]=c[g+0>>2];c[a+4>>2]=c[g+4>>2];c[a+8>>2]=c[g+8>>2];c[g+0>>2]=c[f+0>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];Wqa(c[d>>2]|0,0)|0;i=b;return}function fra(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=a+12|0;f=c[e>>2]|0;if((f|0)==0){i=d;return}Rc[c[(c[f>>2]|0)+168>>2]&1023](f);f=c[e>>2]|0;g=a+28|0;h=f+32|0;j=f+20|0;c[h+0>>2]=c[j+0>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];c[j+0>>2]=c[g+0>>2];c[j+4>>2]=c[g+4>>2];c[j+8>>2]=c[g+8>>2];j=c[g>>2]|0;g=c[a+16>>2]|0;if((j|0)<=(g|0)){h=c[e>>2]|0;if((j|0)<(g|0)){k=h}else{Uqa(h,b[a+40>>1]|0,c[a+44>>2]|0,a+60|0,0,1)|0;i=d;return}}else{k=c[e>>2]|0}$qa(k,a+48|0,a+60|0,0,1)|0;i=d;return}function gra(a,d,e,f,h,j,k,l,m){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0;n=i;c[a+4>>2]=1;c[a+8>>2]=1;c[a>>2]=757400;c[a+12>>2]=d;d=a+16|0;c[d+0>>2]=c[e+0>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];e=a+28|0;c[e+0>>2]=c[f+0>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];b[a+40>>1]=h;c[a+44>>2]=j;g[a+48>>2]=+g[k>>2];g[a+52>>2]=+g[k+4>>2];c[a+56>>2]=c[k+8>>2];gt(a+60|0,l);c[a+88>>2]=m;i=n;return}function hra(a){a=a|0;var b=0;b=i;$1a(a);i=b;return}function ira(a){a=a|0;return}function jra(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+12|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}Rc[c[(c[e>>2]|0)+168>>2]&1023](e);e=c[d>>2]|0;f=a+16|0;a=e+32|0;g=e+20|0;c[a+0>>2]=c[g+0>>2];c[a+4>>2]=c[g+4>>2];c[a+8>>2]=c[g+8>>2];c[g+0>>2]=c[f+0>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];kra(c[d>>2]|0,0)|0;i=b;return}function kra(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;e=i;i=i+384|0;f=e+364|0;g=e+296|0;h=e+220|0;j=e+208|0;k=e+196|0;l=e+184|0;m=e+160|0;n=e+136|0;o=e+120|0;p=e+96|0;q=e+72|0;r=e+60|0;s=e+48|0;t=e+24|0;u=e+12|0;v=e;w=a+4|0;x=c[w>>2]|0;if((Lc[c[(c[x>>2]|0)+64>>2]&255](x)|0)==0){y=0;i=e;return y|0}x=a+20|0;z=c[w>>2]|0;Ic[c[(c[z>>2]|0)+160>>2]&511](f,z);if((qr(x,f)|0)!=0){y=0;i=e;return y|0}c[g>>2]=-1;c[g+4>>2]=-1;c[g+8>>2]=-1;f=g+12|0;z=g+40|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;c[f+24>>2]=0;c[z>>2]=-1;z=g+44|0;c[z+0>>2]=0;c[z+4>>2]=0;c[z+8>>2]=0;c[z+12>>2]=0;c[z+16>>2]=0;c[z+20>>2]=0;Um(h);z=(d|0)!=0;if(z?(d=c[w>>2]|0,f=Lc[c[(c[d>>2]|0)+4>>2]&255](d)|0,(f|0)!=0):0){d=c[(c[f>>2]|0)+48>>2]|0;A=c[w>>2]|0;ld[c[(c[A>>2]|0)+168>>2]&255](j,A,x);Ic[d&511](f,j);dd[c[(c[f>>2]|0)+36>>2]&511](f,g)|0;dd[c[(c[f>>2]|0)+24>>2]&511](f,h)|0}f=c[w>>2]|0;Ic[c[(c[f>>2]|0)+200>>2]&511](f,x);f=c[w>>2]|0;ld[c[(c[f>>2]|0)+196>>2]&255](k,f,x);f=qr(x,k)|0;k=c[w>>2]|0;ld[c[(c[k>>2]|0)+104>>2]&255](l,k,x);k=a+32|0;c[k+0>>2]=c[x+0>>2];c[k+4>>2]=c[x+4>>2];c[k+8>>2]=c[x+8>>2];c[x+0>>2]=c[l+0>>2];c[x+4>>2]=c[l+4>>2];c[x+8>>2]=c[l+8>>2];j=a+44|0;c[j+0>>2]=c[l+0>>2];c[j+4>>2]=c[l+4>>2];c[j+8>>2]=c[l+8>>2];l=a+56|0;c[l+0>>2]=c[x+0>>2];c[l+4>>2]=c[x+4>>2];c[l+8>>2]=c[x+8>>2];do{if(z?(c[a+240>>2]|0)!=0:0){l=Z1a(92)|0;j=b[h>>1]|0;d=c[h+4>>2]|0;A=g+28|0;if((f|0)==0){gra(l,a,k,x,j,d,A,h+48|0,0);Ysa(a,l);break}else{gra(l,a,k,x,j,d,A,g+40|0,f);Ysa(a,l);break}}}while(0);g=m+12|0;c[m+0>>2]=c[k+0>>2];c[m+4>>2]=c[k+4>>2];c[m+8>>2]=c[k+8>>2];c[g+0>>2]=c[x+0>>2];c[g+4>>2]=c[x+4>>2];c[g+8>>2]=c[x+8>>2];nt(m);Xsa(a,m);ssa(a);do{if((f|0)==0){m=(Om(x,k)|0)==0;g=c[w>>2]|0;h=c[g>>2]|0;if(m){ld[c[h+164>>2]&255](u,g,k);m=c[w>>2]|0;ld[c[(c[m>>2]|0)+196>>2]&255](v,m,x);m=t+12|0;c[t+0>>2]=c[u+0>>2];c[t+4>>2]=c[u+4>>2];c[t+8>>2]=c[u+8>>2];c[m+0>>2]=c[v+0>>2];c[m+4>>2]=c[v+4>>2];c[m+8>>2]=c[v+8>>2];nt(t);break}else{ld[c[h+184>>2]&255](r,g,x);g=c[w>>2]|0;ld[c[(c[g>>2]|0)+196>>2]&255](s,g,x);g=q+12|0;c[q+0>>2]=c[r+0>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[g+0>>2]=c[s+0>>2];c[g+4>>2]=c[s+4>>2];c[g+8>>2]=c[s+8>>2];nt(q);break}}else{g=c[w>>2]|0;ld[c[(c[g>>2]|0)+164>>2]&255](o,g,k);Ic[c[(c[a>>2]|0)+204>>2]&511](p,a);g=p+12|0;h=n+12|0;c[n+0>>2]=c[o+0>>2];c[n+4>>2]=c[o+4>>2];c[n+8>>2]=c[o+8>>2];c[h+0>>2]=c[g+0>>2];c[h+4>>2]=c[g+4>>2];c[h+8>>2]=c[g+8>>2];nt(n)}}while(0);tsa(a);Wra(a);usa(a);if((c[a+248>>2]|0)==0){y=1;i=e;return y|0}n=c[a+12>>2]|0;if((n|0)==0){y=1;i=e;return y|0}ld[c[(c[n>>2]|0)+12>>2]&255](n,x,k);y=1;i=e;return y|0}function lra(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=a+12|0;f=c[e>>2]|0;if((f|0)==0){i=d;return}Rc[c[(c[f>>2]|0)+168>>2]&1023](f);f=c[e>>2]|0;g=a+28|0;h=f+32|0;j=f+20|0;c[h+0>>2]=c[j+0>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];c[j+0>>2]=c[g+0>>2];c[j+4>>2]=c[g+4>>2];c[j+8>>2]=c[g+8>>2];g=c[e>>2]|0;if((c[a+88>>2]|0)==0){Uqa(g,b[a+40>>1]|0,c[a+44>>2]|0,a+60|0,0,1)|0;i=d;return}else{$qa(g,a+48|0,a+60|0,0,1)|0;i=d;return}}function mra(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=i;c[a+4>>2]=1;c[a+8>>2]=1;c[a>>2]=757432;c[a+12>>2]=b;b=a+16|0;c[b+0>>2]=c[d+0>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];Ona(a+40|0,e);i=f;return}function nra(a){a=a|0;var b=0;b=i;c[a>>2]=757432;Lna(a+40|0);$1a(a);i=b;return}function ora(a){a=a|0;var b=0;b=i;c[a>>2]=757432;Lna(a+40|0);i=b;return}function pra(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+12|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}Rc[c[(c[e>>2]|0)+168>>2]&1023](e);qra(c[d>>2]|0,a+16|0,a+28|0);rra(c[d>>2]|0,0)|0;i=b;return}function qra(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+32|0;f=e;g=c[a+4>>2]|0;if((Lc[c[(c[g>>2]|0)+64>>2]&255](g)|0)==0){i=e;return}Rc[c[(c[a>>2]|0)+168>>2]&1023](a);g=a+44|0;c[g+0>>2]=c[b+0>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];b=a+56|0;c[b+0>>2]=c[d+0>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];d=a+32|0;h=a+20|0;c[d+0>>2]=c[h+0>>2];c[d+4>>2]=c[h+4>>2];c[d+8>>2]=c[h+8>>2];c[h+0>>2]=c[b+0>>2];c[h+4>>2]=c[b+4>>2];c[h+8>>2]=c[b+8>>2];h=(cs(g,b)|0)==0;ssa(a);if(h){usa(a);i=e;return}else{h=f+12|0;c[f+0>>2]=c[g+0>>2];c[f+4>>2]=c[g+4>>2];c[f+8>>2]=c[g+8>>2];c[h+0>>2]=c[b+0>>2];c[h+4>>2]=c[b+4>>2];c[h+8>>2]=c[b+8>>2];nt(f);tsa(a);usa(a);i=e;return}}function rra(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;e=i;i=i+288|0;f=e+264|0;g=e+256|0;h=e+180|0;j=e+112|0;k=e+100|0;l=e+88|0;m=e+76|0;n=e+64|0;o=e+60|0;p=e+48|0;q=e+24|0;r=e;s=a+4|0;t=c[s>>2]|0;if((Lc[c[(c[t>>2]|0)+64>>2]&255](t)|0)==0){u=0;i=e;return u|0}t=a+44|0;v=a+56|0;if((cs(t,v)|0)==0){u=0;i=e;return u|0}Bsa(f,t);do{if((d|0)!=0?(c[a+240>>2]|0)!=0:0){w=c[s>>2]|0;if((Lc[c[(c[w>>2]|0)+68>>2]&255](w)|0)==0){w=Z1a(44)|0;Ic[c[(c[a>>2]|0)+180>>2]&511](o,a);mra(w,a,f,o);Ysa(a,w);Lna(o);break}Mna(g,1292088,-1);Vsa(a,g);Lna(g);w=c[s>>2]|0;x=Lc[c[(c[w>>2]|0)+4>>2]&255](w)|0;a:do{if((x|0)!=0){Ic[c[(c[x>>2]|0)+48>>2]&511](x,f+12|0);Um(h);c[j>>2]=-1;c[j+4>>2]=-1;c[j+8>>2]=-1;w=j+12|0;y=j+40|0;c[w+0>>2]=0;c[w+4>>2]=0;c[w+8>>2]=0;c[w+12>>2]=0;c[w+16>>2]=0;c[w+20>>2]=0;c[w+24>>2]=0;c[y>>2]=-1;y=j+44|0;c[y+0>>2]=0;c[y+4>>2]=0;c[y+8>>2]=0;c[y+12>>2]=0;c[y+16>>2]=0;c[y+20>>2]=0;y=h+4|0;w=j+28|0;z=j+40|0;A=h+48|0;do{B=Lc[c[(c[x>>2]|0)+52>>2]&255](x)|0;c[k+0>>2]=c[B+0>>2];c[k+4>>2]=c[B+4>>2];c[k+8>>2]=c[B+8>>2];if((Nm(k,f)|0)<1){break a}B=c[s>>2]|0;ld[c[(c[B>>2]|0)+164>>2]&255](l,B,k);if((c[l>>2]|0)==(c[k>>2]|0)){if((dd[c[(c[x>>2]|0)+24>>2]&511](x,h)|0)!=0){B=c[s>>2]|0;pd[c[(c[B>>2]|0)+204>>2]&127](m,B,l,1);c[l+0>>2]=c[m+0>>2];c[l+4>>2]=c[m+4>>2];c[l+8>>2]=c[m+8>>2];B=c[s>>2]|0;pd[c[(c[B>>2]|0)+204>>2]&127](n,B,k,1);c[k+0>>2]=c[n+0>>2];c[k+4>>2]=c[n+4>>2];c[k+8>>2]=c[n+8>>2];B=Z1a(112)|0;ura(B,a,l,k,f,b[h>>1]|0,c[y>>2]|0,w,A);Ysa(a,B)}}else{if((dd[c[(c[x>>2]|0)+36>>2]&511](x,j)|0)!=0){B=Z1a(112)|0;ura(B,a,l,k,f,b[h>>1]|0,c[y>>2]|0,w,z);Ysa(a,B)}}}while((Lc[c[(c[x>>2]|0)+4>>2]&255](x)|0)!=0)}}while(0);Wsa(a)}}while(0);Rc[c[(c[a>>2]|0)+168>>2]&1023](a);h=c[s>>2]|0;ld[c[(c[h>>2]|0)+100>>2]&255](p,h,f);h=a+32|0;s=a+20|0;c[h+0>>2]=c[s+0>>2];c[h+4>>2]=c[s+4>>2];c[h+8>>2]=c[s+8>>2];c[s+0>>2]=c[p+0>>2];c[s+4>>2]=c[p+4>>2];c[s+8>>2]=c[p+8>>2];c[t+0>>2]=c[p+0>>2];c[t+4>>2]=c[p+4>>2];c[t+8>>2]=c[p+8>>2];c[v+0>>2]=c[s+0>>2];c[v+4>>2]=c[s+4>>2];c[v+8>>2]=c[s+8>>2];Xsa(a,f);ssa(a);Ic[c[(c[a>>2]|0)+204>>2]&511](r,a);f=r+12|0;r=q+12|0;c[q+0>>2]=c[h+0>>2];c[q+4>>2]=c[h+4>>2];c[q+8>>2]=c[h+8>>2];c[r+0>>2]=c[f+0>>2];c[r+4>>2]=c[f+4>>2];c[r+8>>2]=c[f+8>>2];nt(q);tsa(a);Wra(a);usa(a);if((c[a+248>>2]|0)==0){u=1;i=e;return u|0}q=c[a+12>>2]|0;if((q|0)==0){u=1;i=e;return u|0}ld[c[(c[q>>2]|0)+16>>2]&255](q,s,h);u=1;i=e;return u|0}function sra(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=a+12|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}Rc[c[(c[e>>2]|0)+168>>2]&1023](e);e=c[d>>2]|0;f=a+16|0;g=e+32|0;h=e+20|0;c[g+0>>2]=c[h+0>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];c[h+0>>2]=c[f+0>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];h=c[a+40>>2]|0;tra(c[d>>2]|0,(h|0)==0?1292088:h+12|0,1,0,0,0)|0;qra(c[d>>2]|0,f,a+28|0);i=b;return}function tra(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0;h=i;i=i+16|0;j=h+4|0;k=h;if((Rta(a)|0)!=0){l=0;i=h;return l|0}m=c[a+4>>2]|0;n=a+20|0;Ic[c[(c[m>>2]|0)+200>>2]&511](m,n);Qta(j,a,n,b,d,e,f);m=a+32|0;c[m+0>>2]=c[n+0>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[n+0>>2]=c[j+0>>2];c[n+4>>2]=c[j+4>>2];c[n+8>>2]=c[j+8>>2];o=a+44|0;c[o+0>>2]=c[j+0>>2];c[o+4>>2]=c[j+4>>2];c[o+8>>2]=c[j+8>>2];j=a+56|0;c[j+0>>2]=c[n+0>>2];c[j+4>>2]=c[n+4>>2];c[j+8>>2]=c[n+8>>2];if((cs(n,m)|0)==0){l=0;i=h;return l|0}if((g|0)!=0?(c[a+240>>2]|0)!=0:0){g=Z1a(88)|0;Mna(k,b,-1);Ara(g,a,m,n,k,d,e,f);Ysa(a,g);Lna(k)}zra(a,m,n);if((c[a+248>>2]|0)==0){l=1;i=h;return l|0}k=c[a+12>>2]|0;if((k|0)==0){l=1;i=h;return l|0}ld[c[(c[k>>2]|0)+20>>2]&255](k,n,m);l=1;i=h;return l|0}function ura(a,d,e,f,h,j,k,l,m){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0;n=i;c[a+4>>2]=1;c[a+8>>2]=1;c[a>>2]=757464;c[a+12>>2]=d;d=a+16|0;c[d+0>>2]=c[e+0>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];e=a+28|0;c[e+0>>2]=c[f+0>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];f=a+40|0;c[f+0>>2]=c[h+0>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];c[f+16>>2]=c[h+16>>2];c[f+20>>2]=c[h+20>>2];b[a+64>>1]=j;c[a+68>>2]=k;g[a+72>>2]=+g[l>>2];g[a+76>>2]=+g[l+4>>2];c[a+80>>2]=c[l+8>>2];gt(a+84|0,m);i=n;return}function vra(a){a=a|0;var b=0;b=i;$1a(a);i=b;return}function wra(a){a=a|0;return}function xra(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+12|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}if((c[a+8>>2]|0)==0){i=b;return}Rc[c[(c[e>>2]|0)+168>>2]&1023](e);qra(c[d>>2]|0,a+40|0,a+52|0);rra(c[d>>2]|0,0)|0;i=b;return}function yra(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;e=a+12|0;f=c[e>>2]|0;if((f|0)==0){i=d;return}Rc[c[(c[f>>2]|0)+168>>2]&1023](f);f=c[e>>2]|0;g=a+16|0;h=f+32|0;j=f+20|0;c[h+0>>2]=c[j+0>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];c[j+0>>2]=c[g+0>>2];c[j+4>>2]=c[g+4>>2];c[j+8>>2]=c[g+8>>2];j=c[a+28>>2]|0;h=c[g>>2]|0;if((j|0)<=(h|0)){g=c[e>>2]|0;if((j|0)<(h|0)){k=g;l=5}else{Uqa(g,b[a+64>>1]|0,c[a+68>>2]|0,a+84|0,0,0)|0}}else{k=c[e>>2]|0;l=5}if((l|0)==5){$qa(k,a+72|0,a+84|0,0,0)|0}if((c[a+4>>2]|0)==0){i=d;return}k=a+40|0;l=a+52|0;zra(c[e>>2]|0,k,l);qra(c[e>>2]|0,k,l);i=d;return}function zra(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;i=i+112|0;f=e+88|0;g=e+64|0;h=e+52|0;j=e+40|0;k=e+16|0;l=e;m=a+4|0;n=c[m>>2]|0;if((Lc[c[(c[n>>2]|0)+64>>2]&255](n)|0)==0){i=e;return}n=f+12|0;c[f+0>>2]=c[b+0>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[n+0>>2]=c[d+0>>2];c[n+4>>2]=c[d+4>>2];c[n+8>>2]=c[d+8>>2];nt(f);Xsa(a,f);ssa(a);f=(Om(a+20|0,b)|0)==0;n=c[m>>2]|0;o=c[n>>2]|0;if(f){ld[c[o+196>>2]&255](l,n,d);f=k+12|0;c[k+0>>2]=c[b+0>>2];c[k+4>>2]=c[b+4>>2];c[k+8>>2]=c[b+8>>2];c[f+0>>2]=c[l+0>>2];c[f+4>>2]=c[l+4>>2];c[f+8>>2]=c[l+8>>2];nt(k)}else{ld[c[o+184>>2]&255](h,n,b);b=c[m>>2]|0;ld[c[(c[b>>2]|0)+196>>2]&255](j,b,d);d=g+12|0;c[g+0>>2]=c[h+0>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];c[d+0>>2]=c[j+0>>2];c[d+4>>2]=c[j+4>>2];c[d+8>>2]=c[j+8>>2];nt(g)}tsa(a);Wra(a);usa(a);i=e;return}function Ara(a,b,d,e,f,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;var l=0;l=i;c[a+4>>2]=1;c[a+8>>2]=1;c[a>>2]=757496;c[a+12>>2]=b;b=a+16|0;c[b+0>>2]=c[d+0>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];d=a+28|0;c[d+0>>2]=c[e+0>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];Ona(a+40|0,f);c[a+44>>2]=h;h=a+48|0;g[h>>2]=0.0;g[a+52>>2]=0.0;c[a+56>>2]=0;f=a+60|0;c[f>>2]=-1;e=a+64|0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+20>>2]=0;if((j|0)!=0){c[h+0>>2]=c[j+0>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2]}if((k|0)==0){i=l;return}c[f+0>>2]=c[k+0>>2];c[f+4>>2]=c[k+4>>2];c[f+8>>2]=c[k+8>>2];c[f+12>>2]=c[k+12>>2];c[f+16>>2]=c[k+16>>2];c[f+20>>2]=c[k+20>>2];c[f+24>>2]=c[k+24>>2];i=l;return}function Bra(a){a=a|0;var b=0;b=i;c[a>>2]=757496;Lna(a+40|0);$1a(a);i=b;return}function Cra(a){a=a|0;var b=0;b=i;c[a>>2]=757496;Lna(a+40|0);i=b;return}function Dra(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=a+12|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}if((c[a+8>>2]|0)==0){i=b;return}Rc[c[(c[e>>2]|0)+168>>2]&1023](e);e=c[d>>2]|0;f=a+16|0;g=e+32|0;h=e+20|0;c[g+0>>2]=c[h+0>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];c[h+0>>2]=c[f+0>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];f=c[a+40>>2]|0;tra(c[d>>2]|0,(f|0)==0?1292088:f+12|0,c[a+44>>2]|0,a+48|0,a+60|0,0)|0;i=b;return}function Era(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+12|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}Rc[c[(c[e>>2]|0)+168>>2]&1023](e);qra(c[d>>2]|0,a+16|0,a+28|0);rra(c[d>>2]|0,0)|0;i=b;return}function Fra(a,b,d,e,f,h,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0;m=i;c[a+4>>2]=1;c[a+8>>2]=1;c[a>>2]=757528;c[a+12>>2]=b;b=a+16|0;c[b+0>>2]=c[d+0>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];d=a+28|0;c[d+0>>2]=c[l+0>>2];c[d+4>>2]=c[l+4>>2];c[d+8>>2]=c[l+8>>2];c[d+12>>2]=c[l+12>>2];c[d+16>>2]=c[l+16>>2];c[d+20>>2]=c[l+20>>2];c[a+52>>2]=e;g[a+56>>2]=+g[f>>2];g[a+60>>2]=+g[f+4>>2];c[a+64>>2]=c[f+8>>2];g[a+68>>2]=+g[j>>2];g[a+72>>2]=+g[j+4>>2];c[a+76>>2]=c[j+8>>2];gt(a+80|0,h);gt(a+108|0,k);i=m;return}function Gra(a){a=a|0;var b=0;b=i;$1a(a);i=b;return}function Hra(a){a=a|0;return}function Ira(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+12|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}f=a+52|0;g=a+28|0;Jra(e,c[f>>2]|0,a+16|0,a+68|0,a+108|0,g,0)|0;if((c[a+8>>2]|0)==0){i=b;return}e=c[d>>2]|0;Rc[c[(c[e>>2]|0)+168>>2]&1023](e);Kra(c[d>>2]|0,c[f>>2]|0,g);qra(c[d>>2]|0,g,a+40|0);i=b;return}function Jra(a,b,d,e,f,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,D=0;k=i;i=i+160|0;l=k+92|0;m=k+24|0;n=k+12|0;o=k;p=a+4|0;q=c[p>>2]|0;if((Lc[c[(c[q>>2]|0)+64>>2]&255](q)|0)==0){r=0;i=k;return r|0}q=c[p>>2]|0;if((Lc[c[(c[q>>2]|0)+68>>2]&255](q)|0)==0){r=0;i=k;return r|0}q=c[p>>2]|0;s=Lc[c[(c[q>>2]|0)+4>>2]&255](q)|0;if((s|0)==0){r=0;i=k;return r|0}c[l>>2]=-1;c[l+4>>2]=-1;c[l+8>>2]=-1;q=l+12|0;t=l+40|0;c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[q+16>>2]=0;c[q+20>>2]=0;c[q+24>>2]=0;c[t>>2]=-1;q=l+44|0;c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[q+16>>2]=0;c[q+20>>2]=0;c[m>>2]=-1;c[m+4>>2]=-1;c[m+8>>2]=-1;u=m+12|0;v=m+40|0;c[u+0>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;c[u+12>>2]=0;c[u+16>>2]=0;c[u+20>>2]=0;c[u+24>>2]=0;c[v>>2]=-1;v=m+44|0;c[v+0>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;c[v+16>>2]=0;c[v+20>>2]=0;v=Lc[c[(c[s>>2]|0)+52>>2]&255](s)|0;c[n+0>>2]=c[v+0>>2];c[n+4>>2]=c[v+4>>2];c[n+8>>2]=c[v+8>>2];a:do{if(b>>>0<3){if((e|0)!=0?(Ic[c[(c[s>>2]|0)+48>>2]&511](s,d),(dd[c[(c[s>>2]|0)+36>>2]&511](s,l)|0)!=0):0){if((j|0)!=0){w=m+0|0;x=l+0|0;y=w+68|0;do{c[w>>2]=c[x>>2];w=w+4|0;x=x+4|0}while((w|0)<(y|0))}if((b|0)==2){v=l+36|0;u=c[e+8>>2]|0;if((c[v>>2]|0)==(u|0)){z=0;break}c[v>>2]=u;A=54;break}else if((b|0)==1){u=l+32|0;B=+g[e+4>>2];C=+g[u>>2]-B;if(C<1.0e-4&C>-1.0e-4){z=0;break}g[u>>2]=B;A=54;break}else if((b|0)==0){u=l+28|0;B=+g[e>>2];C=+g[u>>2]-B;if(C<1.0e-4&C>-1.0e-4){z=0;break}g[u>>2]=B;A=54;break}else{z=0;break}}else{z=0}}else{if(((f|0)!=0?(u=c[p>>2]|0,ld[c[(c[u>>2]|0)+192>>2]&255](o,u,d),(qr(d,o)|0)!=0):0)?(Ic[c[(c[s>>2]|0)+48>>2]&511](s,d),(dd[c[(c[s>>2]|0)+36>>2]&511](s,l)|0)!=0):0){if((j|0)!=0){w=m+0|0;x=l+0|0;y=w+68|0;do{c[w>>2]=c[x>>2];w=w+4|0;x=x+4|0}while((w|0)<(y|0))}do{switch(b|0){case 5:{u=l+48|0;v=c[f+8>>2]|0;if((c[u>>2]|0)==(v|0)){z=0;break a}c[u>>2]=v;A=54;break a;break};case 7:{v=l+56|0;u=c[v>>2]|0;D=(u&2|0)==0;if((c[f+16>>2]&2|0)==0){if(D){z=0;break a}c[v>>2]=u&-3;A=54;break a}else{if(!D){z=0;break a}c[v>>2]=u|2;A=54;break a}break};case 10:{u=l+64|0;v=c[f+24>>2]|0;if((c[u>>2]|0)==(v|0)){z=0;break a}c[u>>2]=v;A=54;break a;break};case 12:{v=l+56|0;u=c[v>>2]|0;D=(u&64|0)==0;if((c[f+16>>2]&64|0)==0){if(D){z=0;break a}c[v>>2]=u&-65;A=54;break a}else{if(!D){z=0;break a}c[v>>2]=u|64;A=54;break a}break};case 8:{u=l+56|0;v=c[u>>2]|0;D=(v&4|0)==0;if((c[f+16>>2]&4|0)==0){if(D){z=0;break a}c[u>>2]=v&-5;A=54;break a}else{if(!D){z=0;break a}c[u>>2]=v|4;A=54;break a}break};case 9:{v=l+60|0;B=+g[f+20>>2];C=+g[v>>2]-B;if(C<1.0e-4&C>-1.0e-4){z=0;break a}g[v>>2]=B;A=54;break a;break};case 3:{v=c[f>>2]|0;if((c[t>>2]|0)==(v|0)){z=0;break a}c[t>>2]=v;A=54;break a;break};case 6:{v=l+52|0;u=c[f+12>>2]|0;if((c[v>>2]|0)==(u|0)){z=0;break a}c[v>>2]=u;A=54;break a;break};case 4:{B=+g[f+4>>2];C=+g[q>>2]-B;if(C<1.0e-4&C>-1.0e-4){z=0;break a}g[q>>2]=B;A=54;break a;break};case 11:{u=l+56|0;v=c[u>>2]|0;D=(v&32|0)==0;if((c[f+16>>2]&32|0)==0){if(D){z=0;break a}c[u>>2]=v&-33;A=54;break a}else{if(!D){z=0;break a}c[u>>2]=v|32;A=54;break a}break};default:{z=0;break a}}}while(0)}else{z=0}}}while(0);if((A|0)==54){dd[c[(c[s>>2]|0)+40>>2]&511](s,l)|0;if((j|0)!=0?(c[a+240>>2]|0)!=0:0){j=Z1a(136)|0;Fra(j,a,d,b,m+28|0,m+40|0,l+28|0,l+40|0,h);Ysa(a,j);z=1}else{z=1}}Ic[c[(c[s>>2]|0)+48>>2]&511](s,n);r=z;i=k;return r|0}function Kra(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+48|0;f=e+24|0;g=e+12|0;h=e;switch(b|0){case 2:case 1:case 0:{Xsa(a,d);ssa(a);tsa(a);Wra(a);usa(a);i=e;return};case 8:case 7:case 5:{tsa(a);i=e;return};case 12:case 11:case 10:case 9:case 6:case 4:case 3:{Xsa(a,d);ssa(a);b=a+4|0;j=c[b>>2]|0;ld[c[(c[j>>2]|0)+192>>2]&255](g,j,d);j=c[b>>2]|0;ld[c[(c[j>>2]|0)+196>>2]&255](h,j,d+12|0);d=f+12|0;c[f+0>>2]=c[g+0>>2];c[f+4>>2]=c[g+4>>2];c[f+8>>2]=c[g+8>>2];c[d+0>>2]=c[h+0>>2];c[d+4>>2]=c[h+4>>2];c[d+8>>2]=c[h+8>>2];nt(f);tsa(a);Wra(a);usa(a);i=e;return};default:{i=e;return}}}function Lra(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+12|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}f=a+52|0;g=a+28|0;Jra(e,c[f>>2]|0,a+16|0,a+56|0,a+80|0,g,0)|0;if((c[a+4>>2]|0)==0){i=b;return}e=c[d>>2]|0;Rc[c[(c[e>>2]|0)+168>>2]&1023](e);Kra(c[d>>2]|0,c[f>>2]|0,g);qra(c[d>>2]|0,g,a+40|0);i=b;return}function Mra(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0;j=i;c[a+4>>2]=1;c[a+8>>2]=1;c[a>>2]=757560;c[a+12>>2]=b;b=a+16|0;c[b+0>>2]=c[d+0>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];d=a+28|0;c[d+0>>2]=c[h+0>>2];c[d+4>>2]=c[h+4>>2];c[d+8>>2]=c[h+8>>2];c[d+12>>2]=c[h+12>>2];c[d+16>>2]=c[h+16>>2];c[d+20>>2]=c[h+20>>2];c[a+52>>2]=e;gt(a+56|0,f);gt(a+84|0,g);i=j;return}function Nra(a){a=a|0;var b=0;b=i;$1a(a);i=b;return}function Ora(a){a=a|0;return}function Pra(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+12|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}f=a+52|0;g=a+28|0;Qra(e,c[f>>2]|0,a+16|0,a+84|0,g,0)|0;if((c[a+8>>2]|0)==0){i=b;return}e=c[d>>2]|0;Rc[c[(c[e>>2]|0)+168>>2]&1023](e);Kra(c[d>>2]|0,c[f>>2]|0,g);qra(c[d>>2]|0,g,a+40|0);i=b;return}function Qra(a,d,e,f,h,j){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0;k=i;i=i+176|0;l=k+88|0;m=k+12|0;n=k;o=a+4|0;p=c[o>>2]|0;if((Lc[c[(c[p>>2]|0)+64>>2]&255](p)|0)==0){q=0;i=k;return q|0}p=c[o>>2]|0;if((Lc[c[(c[p>>2]|0)+68>>2]&255](p)|0)==0){q=0;i=k;return q|0}p=c[o>>2]|0;o=Lc[c[(c[p>>2]|0)+4>>2]&255](p)|0;if((o|0)==0){q=0;i=k;return q|0}Um(l);Um(m);p=Lc[c[(c[o>>2]|0)+52>>2]&255](o)|0;c[n+0>>2]=c[p+0>>2];c[n+4>>2]=c[p+4>>2];c[n+8>>2]=c[p+8>>2];a:do{if((f|0)!=0?(Ic[c[(c[o>>2]|0)+48>>2]&511](o,e),(dd[c[(c[o>>2]|0)+24>>2]&511](o,l)|0)!=0):0){p=(j|0)==0;if(!p){r=m+0|0;s=l+0|0;t=r+76|0;do{c[r>>2]=c[s>>2];r=r+4|0;s=s+4|0}while((r|0)<(t|0))}b:do{switch(d|0){case 6:{s=l+60|0;r=c[f+12>>2]|0;if((c[s>>2]|0)==(r|0)){u=0;break a}c[s>>2]=r;break};case 8:{r=l+64|0;s=c[r>>2]|0;t=(s&4|0)==0;if((c[f+16>>2]&4|0)==0){if(t){u=0;break a}c[r>>2]=s&-5;break b}else{if(!t){u=0;break a}c[r>>2]=s|4;break b}break};case 12:{s=l+64|0;r=c[s>>2]|0;t=(r&64|0)==0;if((c[f+16>>2]&64|0)==0){if(t){u=0;break a}c[s>>2]=r&-65;break b}else{if(!t){u=0;break a}c[s>>2]=r|64;break b}break};case 11:{r=l+64|0;s=c[r>>2]|0;t=(s&32|0)==0;if((c[f+16>>2]&32|0)==0){if(t){u=0;break a}c[r>>2]=s&-33;break b}else{if(!t){u=0;break a}c[r>>2]=s|32;break b}break};case 9:{s=l+68|0;v=+g[f+20>>2];w=+g[s>>2]-v;if(w<1.0e-4&w>-1.0e-4){u=0;break a}g[s>>2]=v;break};case 10:{s=l+72|0;r=c[f+24>>2]|0;if((c[s>>2]|0)==(r|0)){u=0;break a}c[s>>2]=r;break};case 5:{r=l+56|0;s=c[f+8>>2]|0;if((c[r>>2]|0)==(s|0)){u=0;break a}c[r>>2]=s;break};case 4:{s=l+52|0;v=+g[f+4>>2];w=+g[s>>2]-v;if(w<1.0e-4&w>-1.0e-4){u=0;break a}g[s>>2]=v;break};case 7:{s=l+64|0;r=c[s>>2]|0;t=(r&2|0)==0;if((c[f+16>>2]&2|0)==0){if(t){u=0;break a}c[s>>2]=r&-3;break b}else{if(!t){u=0;break a}c[s>>2]=r|2;break b}break};case 3:{r=l+48|0;if((c[r>>2]|0)==(c[f>>2]|0)){u=0;break a}s=Lc[c[(c[a>>2]|0)+24>>2]&255](a)|0;if((s|0)!=0){c[r>>2]=id[c[(c[s>>2]|0)+8>>2]&511](s,b[l>>1]|0,c[l+4>>2]|0,c[f>>2]|0)|0}break};default:{u=0;break a}}}while(0);dd[c[(c[o>>2]|0)+28>>2]&511](o,l)|0;if(!p?(c[a+240>>2]|0)!=0:0){s=Z1a(112)|0;Mra(s,a,e,d,m+48|0,l+48|0,h);Ysa(a,s);u=1}else{u=1}}else{u=0}}while(0);Ic[c[(c[o>>2]|0)+48>>2]&511](o,n);q=u;i=k;return q|0}function Rra(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+12|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}f=a+52|0;g=a+28|0;Qra(e,c[f>>2]|0,a+16|0,a+56|0,g,0)|0;if((c[a+4>>2]|0)==0){i=b;return}e=c[d>>2]|0;Rc[c[(c[e>>2]|0)+168>>2]&1023](e);Kra(c[d>>2]|0,c[f>>2]|0,g);qra(c[d>>2]|0,g,a+40|0);i=b;return}function Sra(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;c[a>>2]=757592;c[a+4>>2]=b;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;b=a+68|0;e=a+20|0;f=e+48|0;do{c[e>>2]=-1;e=e+4|0}while((e|0)<(f|0));e=a+92|0;c[b+0>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b+16>>2]=0;c[b+20>>2]=0;iqa(e);g[a+156>>2]=0.0;g[a+160>>2]=0.0;uqa(a+164|0,1e4);c[a+204>>2]=0;c[a+208>>2]=0;c[a+216>>2]=0;c[a+220>>2]=1;e=a+224|0;b=a+240|0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[b>>2]=1;c[a+244>>2]=1;c[a+248>>2]=0;c[a+252>>2]=0;i=d;return}function Tra(a){a=a|0;var b=0;b=i;Ura(a);$1a(a);i=b;return}function Ura(a){a=a|0;var b=0,d=0,e=0;b=i;c[a>>2]=757592;d=a+16|0;e=c[d>>2]|0;if((e|0)!=0){Rc[c[(c[e>>2]|0)+28>>2]&1023](e);c[d>>2]=0}d=a+88|0;e=c[d>>2]|0;if((e|0)!=0){Rc[c[(c[e>>2]|0)+4>>2]&1023](e);c[d>>2]=0}wqa(a+164|0);lqa(a+92|0);i=b;return}function Vra(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;i=i+16|0;d=b;e=a+4|0;f=c[e>>2]|0;Rc[c[(c[f>>2]|0)+60>>2]&1023](f);f=c[e>>2]|0;Ic[c[(c[f>>2]|0)+156>>2]&511](d,f);f=a+32|0;e=a+20|0;c[f+0>>2]=c[e+0>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];c[e+0>>2]=c[d+0>>2];c[e+4>>2]=c[d+4>>2];c[e+8>>2]=c[d+8>>2];Wra(a);i=b;return}function Wra(a){a=a|0;var b=0,d=0,e=0,f=0,h=0;b=i;i=i+128|0;d=b+44|0;e=b;f=a+4|0;h=c[f>>2]|0;if((Lc[c[(c[h>>2]|0)+64>>2]&255](h)|0)==0){i=b;return}h=c[f>>2]|0;f=Lc[c[(c[h>>2]|0)+4>>2]&255](h)|0;if((f|0)==0){i=b;return}Ic[c[(c[f>>2]|0)+48>>2]&511](f,a+20|0);Um(d);h=e+24|0;c[e+0>>2]=-1;c[e+4>>2]=-1;c[e+8>>2]=-1;c[e+12>>2]=-1;c[e+16>>2]=-1;c[e+20>>2]=-1;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;c[h+16>>2]=0;if((dd[c[(c[f>>2]|0)+24>>2]&511](f,d)|0)!=0){g[a+156>>2]=+g[d+20>>2]+ +g[d+36>>2];g[a+160>>2]=+g[d+24>>2];i=b;return}if((dd[c[(c[f>>2]|0)+32>>2]&511](f,e)|0)==0){i=b;return}g[a+156>>2]=+g[h>>2];g[a+160>>2]=+g[e+28>>2];i=b;return}function Xra(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=a+16|0;f=c[e>>2]|0;if((f|0)!=0){Rc[c[(c[f>>2]|0)+28>>2]&1023](f)}f=c[a+4>>2]|0;a=c[c[f>>2]>>2]|0;g=Z1a(8)|0;c[g>>2]=757200;c[g+4>>2]=b;c[e>>2]=g;dd[a&511](f,g)|0;i=d;return}function Yra(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[a+4>>2]|0;dd[c[c[e>>2]>>2]&511](e,b)|0;i=d;return}function Zra(a,b){a=a|0;b=b|0;c[a+8>>2]=b;return}function _ra(a,b){a=a|0;b=b|0;c[a+12>>2]=b;return}function $ra(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=a+88|0;e=c[d>>2]|0;if((e|0)!=0){f=e;i=b;return f|0}e=Z1a(12)|0;g=c[a+4>>2]|0;h=Lc[c[(c[g>>2]|0)+4>>2]&255](g)|0;c[e>>2]=757128;c[e+4>>2]=a;c[e+8>>2]=h;c[d>>2]=e;f=e;i=b;return f|0}function asa(a){a=a|0;return c[a+4>>2]|0}function bsa(a){a=a|0;var b=0,d=0;b=c[a+16>>2]|0;if((b|0)==0){d=0}else{d=c[b+4>>2]|0}return d|0}function csa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0.0,j=0.0;e=i;f=c[a+4>>2]|0;Ic[c[(c[f>>2]|0)+8>>2]&511](f,b);h=+(+g[b>>2]);j=+(+g[b+12>>2]);b=a+68|0;g[b>>2]=h;g[b+4>>2]=j;if((d|0)==0){i=e;return}Rc[c[(c[a>>2]|0)+288>>2]&1023](a);i=e;return}function dsa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=c[a+4>>2]|0;Ic[c[(c[f>>2]|0)+12>>2]&511](f,b);if((d|0)==0){i=e;return}Rc[c[(c[a>>2]|0)+288>>2]&1023](a);i=e;return}function esa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;c[a+204>>2]=b;if((d|0)==0){i=e;return}Rc[c[(c[a>>2]|0)+288>>2]&1023](a);i=e;return}function fsa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=c[a+4>>2]|0;Ic[c[(c[f>>2]|0)+16>>2]&511](f,b);if((d|0)==0){i=e;return}Rc[c[(c[a>>2]|0)+288>>2]&1023](a);i=e;return}function gsa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=c[a+4>>2]|0;Ic[c[(c[f>>2]|0)+20>>2]&511](f,b);if((d|0)==0){i=e;return}Rc[c[(c[a>>2]|0)+288>>2]&1023](a);i=e;return}function hsa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=c[a+4>>2]|0;Ic[c[(c[f>>2]|0)+24>>2]&511](f,b);if((d|0)==0){i=e;return}Rc[c[(c[a>>2]|0)+288>>2]&1023](a);i=e;return}function isa(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0;e=i;f=c[a+4>>2]|0;Gc[c[(c[f>>2]|0)+28>>2]&15](f,b);if((d|0)==0){i=e;return}Rc[c[(c[a>>2]|0)+288>>2]&1023](a);i=e;return}function jsa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=c[a+4>>2]|0;Ic[c[(c[f>>2]|0)+32>>2]&511](f,b);if((d|0)==0){i=e;return}Rc[c[(c[a>>2]|0)+288>>2]&1023](a);i=e;return}function ksa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=c[a+4>>2]|0;Ic[c[(c[f>>2]|0)+36>>2]&511](f,b);if((d|0)==0){i=e;return}Rc[c[(c[a>>2]|0)+288>>2]&1023](a);i=e;return}function lsa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=c[a+4>>2]|0;Ic[c[(c[f>>2]|0)+40>>2]&511](f,b);if((d|0)==0){i=e;return}Rc[c[(c[a>>2]|0)+288>>2]&1023](a);i=e;return}function msa(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0;e=i;f=c[a+4>>2]|0;Gc[c[(c[f>>2]|0)+52>>2]&15](f,b);if((d|0)==0){i=e;return}Rc[c[(c[a>>2]|0)+288>>2]&1023](a);i=e;return}function nsa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=c[a+4>>2]|0;Ic[c[(c[f>>2]|0)+44>>2]&511](f,b);if((d|0)==0){i=e;return}Rc[c[(c[a>>2]|0)+288>>2]&1023](a);i=e;return}function osa(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0;e=i;f=c[a+4>>2]|0;Gc[c[(c[f>>2]|0)+48>>2]&15](f,b);if((d|0)==0){i=e;return}Rc[c[(c[a>>2]|0)+288>>2]&1023](a);i=e;return}function psa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;c[a+84>>2]=b;if((d|0)==0){i=e;return}Rc[c[(c[a>>2]|0)+288>>2]&1023](a);i=e;return}function qsa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;c[a+216>>2]=b;if((d|0)==0){i=e;return}Rc[c[(c[a>>2]|0)+288>>2]&1023](a);i=e;return}function rsa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;i=i+48|0;f=e+36|0;g=e+24|0;h=e+12|0;j=e;k=a+4|0;l=c[k>>2]|0;if((Lc[c[(c[l>>2]|0)+64>>2]&255](l)|0)==0){i=e;return}if((b|0)==0&(d|0)<0){Rc[c[(c[a>>2]|0)+164>>2]&1023](a);i=e;return}if((b|0)<0){Rc[c[(c[a>>2]|0)+168>>2]&1023](a);i=e;return}l=c[k>>2]|0;m=c[(c[l>>2]|0)+212>>2]|0;if((b|0)<(d|0)){ld[m&255](f,l,b);n=c[k>>2]|0;ld[c[(c[n>>2]|0)+212>>2]&255](g,n,d);qra(a,f,g);i=e;return}else{ld[m&255](h,l,d);d=c[k>>2]|0;ld[c[(c[d>>2]|0)+212>>2]&255](j,d,b);qra(a,h,j);i=e;return}}function ssa(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0;b=i;i=i+160|0;d=b+144|0;e=b+136|0;f=b+60|0;h=b+16|0;j=b+8|0;k=b;Ata(a);l=a+4|0;m=c[l>>2]|0;if((Lc[c[(c[m>>2]|0)+64>>2]&255](m)|0)==0){i=b;return}g[d>>2]=0.0;m=d+4|0;g[m>>2]=0.0;g[e>>2]=0.0;n=e+4|0;g[n>>2]=0.0;o=c[l>>2]|0;p=Lc[c[(c[o>>2]|0)+4>>2]&255](o)|0;do{if((p|0)!=0){Ic[c[(c[p>>2]|0)+48>>2]&511](p,a+20|0);Um(f);o=h+24|0;c[h+0>>2]=-1;c[h+4>>2]=-1;c[h+8>>2]=-1;c[h+12>>2]=-1;c[h+16>>2]=-1;c[h+20>>2]=-1;c[o+0>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[o+16>>2]=0;if((dd[c[(c[p>>2]|0)+24>>2]&511](p,f)|0)!=0){q=+g[f+20>>2]+ +g[f+36>>2];g[d>>2]=q;r=+g[f+24>>2];g[m>>2]=r+ +g[f+28>>2];g[e>>2]=q;g[n>>2]=r+ +g[f+32>>2];break}if((dd[c[(c[p>>2]|0)+32>>2]&511](p,h)|0)!=0){r=+g[o>>2];g[d>>2]=r;q=+g[h+28>>2];g[m>>2]=q+ +g[h+36>>2];g[e>>2]=r;g[n>>2]=q+ +g[h+40>>2]}}}while(0);Upa(j,a,d);Upa(k,a,e);e=c[l>>2]|0;l=Lc[c[(c[e>>2]|0)+112>>2]&255](e)|0;q=+g[l>>2];r=+g[l+4>>2];s=+g[l+8>>2];t=+g[l+12>>2];u=q-r;do{if(!(u<1.0e-4&u>-1.0e-4)){v=+g[j>>2];w=v-q;if(!(v<q?!(w<1.0e-4&w>-1.0e-4):0)){x=10}if((x|0)==10?!(w<1.0e-4&w>-1.0e-4):0){if(!(v>r)){break}w=v-r;if(w<1.0e-4&w>-1.0e-4){break}xta(a,+g[d>>2]-(r-q));break}xta(a,+g[d>>2])}}while(0);q=t-s;r=q;if(r<1.0e-4&r>-1.0e-4){i=b;return}r=+g[k+4>>2];u=r-s;if(!(r<s?!(u<1.0e-4&u>-1.0e-4):0)){x=18}if((x|0)==18?!(u<1.0e-4&u>-1.0e-4):0){u=+g[j+4>>2];if(!(u>t)){i=b;return}w=u-t;if(!((!(w>-1.0e-4)|!(w<1.0e-4))&r>s)){i=b;return}yta(a,+g[m>>2]);i=b;return}s=+g[j+4>>2];if(!(s<t)){i=b;return}r=s-t;if(r<1.0e-4&r>-1.0e-4){i=b;return}yta(a,q+ +g[n>>2]);i=b;return}function tsa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;i=i+32|0;d=b;if((c[a+220>>2]|0)==0){i=b;return}e=c[a+4>>2]|0;if((Lc[c[(c[e>>2]|0)+64>>2]&255](e)|0)==0){i=b;return}e=a+92|0;nqa(e);Ic[c[(c[a>>2]|0)+204>>2]&511](d,a);Cta(a,d);rqa(e);e=a+68|0;d=c[e+4>>2]|0;f=a+76|0;c[f>>2]=c[e>>2];c[f+4>>2]=d;if(((c[a+244>>2]|0)!=0?(d=a+8|0,f=c[d>>2]|0,(f|0)!=0):0)?(e=a+208|0,(c[e>>2]|0)==0):0){c[e>>2]=1;g=a+136|0;h=c[a+144>>2]|0;a:do{if((h|0)>0){j=f;k=0;while(1){l=c[(c[j>>2]|0)+28>>2]|0;m=Dta(g,k)|0;Ic[l&511](j,m);m=k+1|0;if((m|0)==(h|0)){break a}j=c[d>>2]|0;k=m}}}while(0);c[e>>2]=0}oqa(a+136|0);i=b;return}function usa(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0;b=i;i=i+160|0;d=b+144|0;e=b+136|0;f=b+60|0;h=b+16|0;j=b+8|0;k=b;if((c[a+244>>2]|0)==0){Fta(a);i=b;return}l=a+8|0;if((c[l>>2]|0)==0){Fta(a);i=b;return}m=a+208|0;if((c[m>>2]|0)!=0){Fta(a);i=b;return}g[d>>2]=0.0;n=d+4|0;g[n>>2]=0.0;g[e>>2]=0.0;o=e+4|0;g[o>>2]=0.0;p=c[a+4>>2]|0;q=Lc[c[(c[p>>2]|0)+4>>2]&255](p)|0;do{if((q|0)!=0){p=a+20|0;Ic[c[(c[q>>2]|0)+48>>2]&511](q,p);Um(f);r=h+24|0;c[h+0>>2]=-1;c[h+4>>2]=-1;c[h+8>>2]=-1;c[h+12>>2]=-1;c[h+16>>2]=-1;c[h+20>>2]=-1;c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[r+16>>2]=0;if((dd[c[(c[q>>2]|0)+24>>2]&511](q,f)|0)!=0){s=+g[f+20>>2]+ +g[f+36>>2];g[d>>2]=s;t=+g[f+24>>2];g[n>>2]=t+ +g[f+28>>2];g[e>>2]=s;g[o>>2]=t+ +g[f+32>>2];u=p;break}if((dd[c[(c[q>>2]|0)+32>>2]&511](q,h)|0)==0){u=p}else{t=+g[r>>2];g[d>>2]=t;s=+g[h+28>>2];g[n>>2]=s+ +g[h+36>>2];g[e>>2]=t;g[o>>2]=s+ +g[h+40>>2];u=p}}else{u=a+20|0}}while(0);c[m>>2]=1;h=c[l>>2]|0;l=c[(c[h>>2]|0)+16>>2]|0;o=(cs(a+44|0,a+56|0)|0)==0&1;Upa(j,a,d);Upa(k,a,e);Fc[l&63](h,o,j,k,u);c[m>>2]=0;Fta(a);i=b;return}function vsa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;c[b>>2]=-1;c[d>>2]=-1;f=a+4|0;g=c[f>>2]|0;if((Lc[c[(c[g>>2]|0)+64>>2]&255](g)|0)==0){i=e;return}g=a+44|0;h=a+56|0;if((cs(g,h)|0)==0){j=c[f>>2]|0;k=a+20|0;c[b>>2]=dd[c[(c[j>>2]|0)+208>>2]&511](j,k)|0;j=c[f>>2]|0;c[d>>2]=dd[c[(c[j>>2]|0)+208>>2]&511](j,k)|0;i=e;return}k=(Nm(g,h)|0)<0;j=c[f>>2]|0;a=c[(c[j>>2]|0)+208>>2]|0;if(k){c[b>>2]=dd[a&511](j,g)|0;k=c[f>>2]|0;c[d>>2]=dd[c[(c[k>>2]|0)+208>>2]&511](k,h)|0;i=e;return}else{c[b>>2]=dd[a&511](j,h)|0;h=c[f>>2]|0;c[d>>2]=dd[c[(c[h>>2]|0)+208>>2]&511](h,g)|0;i=e;return}}function wsa(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+4|0;e=c[d>>2]|0;if((Lc[c[(c[e>>2]|0)+64>>2]&255](e)|0)==0){f=-1;i=b;return f|0}e=c[d>>2]|0;f=dd[c[(c[e>>2]|0)+208>>2]&511](e,a+20|0)|0;i=b;return f|0}function xsa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=b+20|0;c[a+0>>2]=c[e+0>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];i=d;return}function ysa(a,b){a=a|0;b=b|0;var d=0,f=0,g=0,h=0;d=i;i=i+80|0;f=d;c[a>>2]=0;g=b+4|0;b=c[g>>2]|0;if((Lc[c[(c[b>>2]|0)+64>>2]&255](b)|0)==0){i=d;return}b=c[g>>2]|0;h=Lc[c[(c[b>>2]|0)+4>>2]&255](b)|0;if((h|0)==0){i=d;return}b=c[g>>2]|0;Lc[c[(c[b>>2]|0)+68>>2]&255](b)|0;Ic[c[(c[h>>2]|0)+44>>2]&511](h,0);Um(f);b=c[(Lc[c[(c[h>>2]|0)+52>>2]&255](h)|0)>>2]|0;while(1){if((Lc[c[c[h>>2]>>2]&255](h)|0)==0){break}g=c[(Lc[c[(c[h>>2]|0)+52>>2]&255](h)|0)>>2]|0;if((dd[c[(c[h>>2]|0)+24>>2]&511](h,f)|0)!=0){Zna(a,e[f>>1]|0)}if((b|0)==(g|0)){b=g;continue}Zna(a,13);Zna(a,10);b=g}i=d;return}function zsa(a,b,d){a=a|0;b=b|0;d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;i=i+112|0;g=f+88|0;h=f+12|0;j=f;c[a>>2]=0;k=b+4|0;b=c[k>>2]|0;if((Lc[c[(c[b>>2]|0)+64>>2]&255](b)|0)==0){i=f;return}b=c[k>>2]|0;Lc[c[(c[b>>2]|0)+68>>2]&255](b)|0;b=c[k>>2]|0;l=Lc[c[(c[b>>2]|0)+4>>2]&255](b)|0;if((l|0)==0){i=f;return}c[g+0>>2]=c[d+0>>2];c[g+4>>2]=c[d+4>>2];c[g+8>>2]=c[d+8>>2];c[g+12>>2]=c[d+12>>2];c[g+16>>2]=c[d+16>>2];c[g+20>>2]=c[d+20>>2];d=c[k>>2]|0;Ic[c[(c[d>>2]|0)+200>>2]&511](d,g);d=c[k>>2]|0;k=g+12|0;Ic[c[(c[d>>2]|0)+200>>2]&511](d,k);Ic[c[(c[l>>2]|0)+48>>2]&511](l,g);Um(h);d=c[g>>2]|0;while(1){if((Lc[c[c[l>>2]>>2]&255](l)|0)==0){m=10;break}g=Lc[c[(c[l>>2]|0)+52>>2]&255](l)|0;c[j+0>>2]=c[g+0>>2];c[j+4>>2]=c[g+4>>2];c[j+8>>2]=c[g+8>>2];if((Nm(j,k)|0)>0){m=10;break}if((dd[c[(c[l>>2]|0)+24>>2]&511](l,h)|0)!=0){Zna(a,e[h>>1]|0)}g=c[j>>2]|0;if((d|0)==(g|0)){d=g;continue}Zna(a,13);Zna(a,10);d=g}if((m|0)==10){i=f;return}}function Asa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+32|0;e=d;f=c[(c[b>>2]|0)+360>>2]|0;Bsa(e,b+44|0);ld[f&255](a,b,e);i=d;return}function Bsa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=b+12|0;f=a+12|0;c[a+0>>2]=c[b+0>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[f+0>>2]=c[e+0>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];nt(a);i=d;return}function Csa(a){a=a|0;var b=0,d=0;b=i;d=c[a+4>>2]|0;a=Lc[c[(c[d>>2]|0)+120>>2]&255](d)|0;i=b;return a|0}function Dsa(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=Lc[c[(c[a>>2]|0)+4>>2]&255](a)|0;if((d|0)==0){e=0;f=e+1|0;i=b;return f|0}Ic[c[(c[d>>2]|0)+44>>2]&511](d,0);a=0;while(1){if((Lc[c[(c[d>>2]|0)+8>>2]&255](d)|0)==0){e=a;break}else{a=a+1|0}}f=e+1|0;i=b;return f|0}function Esa(a,b){a=a|0;b=b|0;var c=0;c=i;Bsa(a,b+44|0);i=c;return}function Fsa(a){a=a|0;var b=0,d=0;b=i;d=c[a+4>>2]|0;a=Lc[c[(c[d>>2]|0)+68>>2]&255](d)|0;i=b;return a|0}function Gsa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=c[a+4>>2]|0;Ic[c[(c[f>>2]|0)+56>>2]&511](f,b);if((d|0)==0){i=e;return}Rc[c[(c[a>>2]|0)+288>>2]&1023](a);i=e;return}function Hsa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+32|0;e=d;f=e+4|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;c[e>>2]=b;b=Isa(a,3,0,e)|0;i=d;return b|0}function Isa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f=i;i=i+48|0;g=f+16|0;h=f+12|0;j=f;k=a+4|0;l=c[k>>2]|0;if((Lc[c[(c[l>>2]|0)+64>>2]&255](l)|0)==0){m=0;i=f;return m|0}l=c[k>>2]|0;if((Lc[c[(c[l>>2]|0)+68>>2]&255](l)|0)==0){m=0;i=f;return m|0}l=c[k>>2]|0;n=Lc[c[(c[l>>2]|0)+4>>2]&255](l)|0;if((n|0)==0){m=0;i=f;return m|0}Bsa(g,a+44|0);l=c[k>>2]|0;Ic[c[(c[l>>2]|0)+200>>2]&511](l,g);l=c[k>>2]|0;k=g+12|0;Ic[c[(c[l>>2]|0)+200>>2]&511](l,k);Ic[c[(c[n>>2]|0)+48>>2]&511](n,g);Mna(h,1292088,-1);Vsa(a,h);Lna(h);h=Jra(a,b,g,d,e,g,1)|0;a:while(1){o=(h|0)==0;do{if((Lc[c[c[n>>2]>>2]&255](n)|0)==0){break a}l=Lc[c[(c[n>>2]|0)+52>>2]&255](n)|0;c[j+0>>2]=c[l+0>>2];c[j+4>>2]=c[l+4>>2];c[j+8>>2]=c[l+8>>2];if((Nm(j,k)|0)>0){break a}p=Jra(a,b,j,d,e,g,1)|0;q=Qra(a,b,j,e,g,1)|0}while(!o);h=(q|p|0)!=0&1}Wsa(a);if(o){m=0;i=f;return m|0}Kra(a,b,g);m=h;i=f;return m|0}function Jsa(a,b){a=a|0;b=+b;var d=0,e=0,f=0;d=i;i=i+32|0;e=d;c[e>>2]=-1;f=e+4|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;g[f>>2]=b;f=Isa(a,4,0,e)|0;i=d;return f|0}function Ksa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+32|0;e=d;c[e>>2]=-1;f=e+4|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;c[e+8>>2]=b;b=Isa(a,5,0,e)|0;i=d;return b|0}function Lsa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+32|0;e=d;c[e>>2]=-1;f=e+4|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;c[e+12>>2]=b;b=Isa(a,6,0,e)|0;i=d;return b|0}function Msa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+32|0;e=d;c[e>>2]=-1;f=e+4|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;if((b|0)!=0){c[e+16>>2]=32}b=Isa(a,11,0,e)|0;i=d;return b|0}function Nsa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+32|0;e=d;c[e>>2]=-1;f=e+4|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;if((b|0)!=0){c[e+16>>2]=64}b=Isa(a,12,0,e)|0;i=d;return b|0}function Osa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+32|0;e=d;c[e>>2]=-1;f=e+4|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;if((b|0)!=0){c[e+16>>2]=2}b=Isa(a,7,0,e)|0;i=d;return b|0}function Psa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+32|0;e=d;c[e>>2]=-1;f=e+4|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;if((b|0)!=0){c[e+16>>2]=4}b=Isa(a,8,0,e)|0;i=d;return b|0}function Qsa(a,b){a=a|0;b=+b;var d=0,e=0,f=0;d=i;i=i+32|0;e=d;c[e>>2]=-1;f=e+4|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;g[e+20>>2]=b;f=Isa(a,9,0,e)|0;i=d;return f|0}function Rsa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+32|0;e=d;c[e>>2]=-1;f=e+4|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[e+24>>2]=b;b=Isa(a,10,0,e)|0;i=d;return b|0}function Ssa(a,b){a=a|0;b=+b;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;g[e+4>>2]=0.0;c[e+8>>2]=0;g[e>>2]=b;f=Isa(a,0,e,0)|0;i=d;return f|0}function Tsa(a,b){a=a|0;b=+b;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;g[e>>2]=0.0;c[e+8>>2]=0;g[e+4>>2]=b;f=Isa(a,1,e,0)|0;i=d;return f|0}function Usa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;g[e>>2]=0.0;g[e+4>>2]=0.0;c[e+8>>2]=b;b=Isa(a,2,e,0)|0;i=d;return b|0}function Vsa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=Z1a(24)|0;Fqa(e,b);c[a+252>>2]=e;i=d;return}function Wsa(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+252|0;Lqa(c[d>>2]|0);Bqa(a+164|0,c[d>>2]|0);if((c[a+248>>2]|0)==0){c[d>>2]=0;i=b;return}e=c[a+12>>2]|0;if((e|0)==0){c[d>>2]=0;i=b;return}Ic[c[(c[e>>2]|0)+28>>2]&511](e,c[d>>2]|0);c[d>>2]=0;i=b;return}function Xsa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=a+4|0;f=c[e>>2]|0;if((Lc[c[(c[f>>2]|0)+64>>2]&255](f)|0)==0){i=d;return}f=c[e>>2]|0;g=a+20|0;Ic[c[(c[f>>2]|0)+200>>2]&511](f,g);f=c[e>>2]|0;Ic[c[(c[f>>2]|0)+76>>2]&511](f,b);b=c[e>>2]|0;Ic[c[(c[b>>2]|0)+200>>2]&511](b,g);sta(a);tta(a);i=d;return}function Ysa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[a+252>>2]|0;if((e|0)!=0){Jqa(e,b);i=d;return}Bqa(a+164|0,b);if((c[a+248>>2]|0)==0){i=d;return}e=c[a+12>>2]|0;if((e|0)==0){i=d;return}Ic[c[(c[e>>2]|0)+28>>2]&511](e,b);i=d;return}function Zsa(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=i;_sa(a,b,c,d,e);i=f;return}function _sa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=i;i=i+32|0;h=g+12|0;Pta(a);c[h>>2]=0;c[h+4>>2]=0;c[h+8>>2]=-1;Qta(g,a,h,b,d,e,f);Rc[c[(c[a>>2]|0)+288>>2]&1023](a);if((c[a+248>>2]|0)==0){i=g;return}f=c[a+12>>2]|0;if((f|0)==0){i=g;return}ld[c[(c[f>>2]|0)+24>>2]&255](f,a+20|0,a+32|0);i=g;return}function $sa(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=i;f=Uqa(a,b,c,d,1,1)|0;i=e;return f|0}function ata(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;e=$qa(a,b,c,1,1)|0;i=d;return e|0}function bta(a){a=a|0;var b=0,c=0;b=i;c=Wqa(a,1)|0;i=b;return c|0}function cta(a){a=a|0;var b=0,c=0;b=i;c=kra(a,1)|0;i=b;return c|0}function dta(a){a=a|0;var b=0,c=0;b=i;c=rra(a,1)|0;i=b;return c|0}function eta(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;f=i;g=tra(a,b,c,d,e,1)|0;i=f;return g|0}function fta(a){a=a|0;var b=0,d=0,e=0.0;b=i;d=c[a+4>>2]|0;e=+Vc[c[(c[d>>2]|0)+124>>2]&15](d);i=b;return+e}function gta(a){a=a|0;var b=0,d=0;b=i;d=c[a+4>>2]|0;a=Lc[c[(c[d>>2]|0)+132>>2]&255](d)|0;i=b;return a|0}function hta(a){a=a|0;var b=0,d=0;b=i;d=c[a+4>>2]|0;a=Lc[c[(c[d>>2]|0)+136>>2]&255](d)|0;i=b;return a|0}function ita(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[b+4>>2]|0;b=Lc[c[(c[e>>2]|0)+112>>2]&255](e)|0;c[a+0>>2]=c[b+0>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];i=d;return}function jta(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;f=c[b+4>>2]|0;Ic[c[(c[f>>2]|0)+116>>2]&511](e,f);Xpa(a,b,e);i=d;return}function kta(a){a=a|0;var b=0,d=0;b=i;d=c[a+4>>2]|0;a=Lc[c[(c[d>>2]|0)+148>>2]&255](d)|0;i=b;return a|0}function lta(a){a=a|0;var b=0,d=0,e=0.0;b=i;d=c[a+4>>2]|0;e=+Vc[c[(c[d>>2]|0)+152>>2]&15](d);i=b;return+e}function mta(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+32|0;e=d+12|0;f=d;g=b+4|0;b=c[g>>2]|0;if((Lc[c[(c[b>>2]|0)+64>>2]&255](b)|0)==0){c[a+0>>2]=-1;c[a+4>>2]=-1;c[a+8>>2]=-1;c[a+12>>2]=-1;c[a+16>>2]=-1;c[a+20>>2]=-1;i=d;return}else{b=c[g>>2]|0;Ic[c[(c[b>>2]|0)+156>>2]&511](e,b);b=c[g>>2]|0;Ic[c[(c[b>>2]|0)+160>>2]&511](f,b);b=a+12|0;c[a+0>>2]=c[e+0>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[b+0>>2]=c[f+0>>2];c[b+4>>2]=c[f+4>>2];c[b+8>>2]=c[f+8>>2];nt(a);i=d;return}}function nta(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0;d=i;i=i+64|0;e=d+48|0;f=d+40|0;h=d+32|0;j=d+16|0;k=d+8|0;l=d;if((c[b+216>>2]|0)!=0){Ic[c[(c[b>>2]|0)+208>>2]&511](a,b);i=d;return}m=b+4|0;n=c[m>>2]|0;if((Lc[c[(c[n>>2]|0)+64>>2]&255](n)|0)==0){c[a+0>>2]=-1;c[a+4>>2]=-1;c[a+8>>2]=-1;c[a+12>>2]=-1;c[a+16>>2]=-1;c[a+20>>2]=-1;i=d;return}else{n=c[m>>2]|0;o=Lc[c[(c[n>>2]|0)+112>>2]&255](n)|0;p=+g[o+4>>2];q=+g[o+8>>2];r=+g[o+12>>2];n=c[m>>2]|0;s=c[(c[n>>2]|0)+172>>2]|0;g[h>>2]=+g[o>>2];g[h+4>>2]=r;ota(f,b,h);ld[s&255](e,n,f);f=c[m>>2]|0;m=c[(c[f>>2]|0)+172>>2]|0;g[l>>2]=p;g[l+4>>2]=q;ota(k,b,l);ld[m&255](j,f,k);k=a+12|0;c[a+0>>2]=c[e+0>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[k+0>>2]=c[j+0>>2];c[k+4>>2]=c[j+4>>2];c[k+8>>2]=c[j+8>>2];nt(a);i=d;return}}function ota(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0;e=i;i=i+16|0;f=e;h=b+4|0;j=c[h>>2]|0;Ic[c[(c[j>>2]|0)+116>>2]&511](f,j);j=c[h>>2]|0;h=Lc[c[(c[j>>2]|0)+112>>2]&255](j)|0;k=+g[h>>2];l=+g[h+8>>2];m=+g[h+12>>2];h=c[b+204>>2]|0;if((h|0)==2){n=m-l-(+g[f+12>>2]- +g[f+8>>2])}else if((h|0)==1){n=(m-l-(+g[f+12>>2]- +g[f+8>>2]))*.5}else{n=0.0}l=+g[d+4>>2]+(n+ +g[b+72>>2]-m);g[a>>2]=+g[d>>2]+(+g[b+68>>2]-k);g[a+4>>2]=l;i=e;return}function pta(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e;g=b+4|0;h=c[g>>2]|0;if((Lc[c[(c[h>>2]|0)+64>>2]&255](h)|0)==0){c[a>>2]=-1;c[a+4>>2]=-1;c[a+8>>2]=-1;i=e;return}else{h=c[g>>2]|0;g=c[(c[h>>2]|0)+172>>2]|0;ota(f,b,d);ld[g&255](a,h,f);i=e;return}}function qta(a){a=a|0;var b=0,d=0;b=i;d=c[a+4>>2]|0;if((Lc[c[(c[d>>2]|0)+64>>2]&255](d)|0)==0){i=b;return}rta(a);ssa(a);tsa(a);Wra(a);usa(a);i=b;return}function rta(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+4|0;e=c[d>>2]|0;if((Lc[c[(c[e>>2]|0)+64>>2]&255](e)|0)==0){i=b;return}e=c[d>>2]|0;f=a+20|0;Ic[c[(c[e>>2]|0)+200>>2]&511](e,f);e=c[d>>2]|0;Rc[c[(c[e>>2]|0)+72>>2]&1023](e);e=c[d>>2]|0;Ic[c[(c[e>>2]|0)+200>>2]&511](e,f);sta(a);tta(a);i=b;return}function sta(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0;b=i;i=i+16|0;d=b;if((c[a+244>>2]|0)==0){i=b;return}e=a+8|0;if((c[e>>2]|0)==0){i=b;return}f=a+4|0;h=c[f>>2]|0;j=Lc[c[(c[h>>2]|0)+112>>2]&255](h)|0;k=+g[j>>2];l=+g[j+4>>2];m=+g[j+8>>2];n=+g[j+12>>2];j=c[f>>2]|0;Ic[c[(c[j>>2]|0)+116>>2]&511](d,j);j=a+208|0;if((c[j>>2]|0)!=0){i=b;return}c[j>>2]=1;a=c[e>>2]|0;o=l-k;fd[c[c[a>>2]>>2]&7](a,k,l,+g[d>>2],+g[d+4>>2],o/3.0,o);a=c[e>>2]|0;o=n-m;fd[c[(c[a>>2]|0)+4>>2]&7](a,m,n,+g[d+8>>2],+g[d+12>>2],o/3.0,o);c[j>>2]=0;i=b;return}function tta(a){a=a|0;var b=0,d=0,e=0,f=0,h=0;b=i;i=i+16|0;d=b;if((c[a+244>>2]|0)==0){i=b;return}e=a+8|0;if((c[e>>2]|0)==0){i=b;return}f=c[a+4>>2]|0;Ic[c[(c[f>>2]|0)+116>>2]&511](d,f);f=a+224|0;if(!(+g[d+4>>2]- +g[d>>2]!=+g[a+228>>2]- +g[f>>2])?!(+g[d+12>>2]- +g[d+8>>2]!=+g[a+236>>2]- +g[a+232>>2]):0){i=b;return}h=a+208|0;if((c[h>>2]|0)==0){c[h>>2]=1;a=c[e>>2]|0;Ic[c[(c[a>>2]|0)+24>>2]&511](a,d);c[h>>2]=0}c[f+0>>2]=c[d+0>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];i=b;return}function uta(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;i=i+80|0;d=b+48|0;e=b+24|0;f=b;g=c[a+4>>2]|0;if((Lc[c[(c[g>>2]|0)+64>>2]&255](g)|0)==0){i=b;return}g=a+44|0;Ic[c[(c[a>>2]|0)+208>>2]&511](e,a);h=d+12|0;j=e+12|0;c[d+0>>2]=c[e+0>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[h+0>>2]=c[j+0>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];c[g+0>>2]=c[d+0>>2];c[g+4>>2]=c[d+4>>2];c[g+8>>2]=c[d+8>>2];c[g+12>>2]=c[d+12>>2];c[g+16>>2]=c[d+16>>2];c[g+20>>2]=c[d+20>>2];d=a+56|0;g=a+32|0;j=a+20|0;c[g+0>>2]=c[j+0>>2];c[g+4>>2]=c[j+4>>2];c[g+8>>2]=c[j+8>>2];c[j+0>>2]=c[d+0>>2];c[j+4>>2]=c[d+4>>2];c[j+8>>2]=c[d+8>>2];ssa(a);Ic[c[(c[a>>2]|0)+204>>2]&511](f,a);tsa(a);usa(a);i=b;return}function vta(a){a=a|0;var b=0,d=0;b=i;i=i+32|0;d=c[a+4>>2]|0;if((Lc[c[(c[d>>2]|0)+64>>2]&255](d)|0)==0){i=b;return}d=a+44|0;if((cs(d,a+56|0)|0)==0){i=b;return}Bsa(b,d);c[d+0>>2]=-1;c[d+4>>2]=-1;c[d+8>>2]=-1;c[d+12>>2]=-1;c[d+16>>2]=-1;c[d+20>>2]=-1;tsa(a);i=b;return}function wta(a){a=a|0;var b=0,c=0;b=i;c=cs(a+44|0,a+56|0)|0;i=b;return c|0}function xta(a,b){a=a|0;b=+b;var d=0,e=0,f=0.0,h=0;d=i;if((c[a+84>>2]|0)==0){i=d;return}e=c[a+4>>2]|0;if((Lc[c[(c[e>>2]|0)+64>>2]&255](e)|0)==0){i=d;return}e=a+68|0;f=+g[e>>2]-b;if(f<1.0e-4&f>-1.0e-4){i=d;return}g[e>>2]=b;tsa(a);if((c[a+244>>2]|0)==0){i=d;return}e=c[a+8>>2]|0;if((e|0)==0){i=d;return}h=a+208|0;if((c[h>>2]|0)!=0){i=d;return}c[h>>2]=1;Gc[c[(c[e>>2]|0)+8>>2]&15](e,b);c[h>>2]=0;i=d;return}function yta(a,b){a=a|0;b=+b;var d=0,e=0,f=0.0,h=0;d=i;if((c[a+84>>2]|0)==0){i=d;return}e=c[a+4>>2]|0;if((Lc[c[(c[e>>2]|0)+64>>2]&255](e)|0)==0){i=d;return}e=a+72|0;f=+g[e>>2]-b;if(f<1.0e-4&f>-1.0e-4){i=d;return}g[e>>2]=b;tsa(a);if((c[a+244>>2]|0)==0){i=d;return}e=c[a+8>>2]|0;if((e|0)==0){i=d;return}h=a+208|0;if((c[h>>2]|0)!=0){i=d;return}c[h>>2]=1;Gc[c[(c[e>>2]|0)+12>>2]&15](e,b);c[h>>2]=0;i=d;return}function zta(a,b){a=a|0;b=b|0;var c=0;c=i;xta(a,+g[b>>2]);yta(a,+g[b+4>>2]);Ata(a);usa(a);i=c;return}function Ata(a){a=a|0;var b=0,d=0,e=0,f=0,h=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0;b=i;i=i+16|0;d=b;e=a+4|0;f=c[e>>2]|0;if((Lc[c[(c[f>>2]|0)+64>>2]&255](f)|0)==0){i=b;return}f=c[e>>2]|0;Ic[c[(c[f>>2]|0)+116>>2]&511](d,f);f=c[e>>2]|0;e=Lc[c[(c[f>>2]|0)+112>>2]&255](f)|0;h=+g[e>>2];j=+g[e+8>>2];k=+g[e+12>>2];l=+g[e+4>>2]-h;m=+g[d+4>>2];n=+g[d>>2];do{if(!(l>m-n)){o=+g[a+68>>2];if(o<n?(p=o-n,!(p<1.0e-4&p>-1.0e-4)):0){xta(a,n);break}p=m-l;if(o>p?(q=o-m-l,!(q<1.0e-4&q>-1.0e-4)):0){xta(a,p)}}else{xta(a,h)}}while(0);h=k-j;j=+g[d+12>>2];l=+g[d+8>>2];if(h>j-l){yta(a,k);i=b;return}k=+g[a+72>>2];m=h+l;if(k<m?(n=h+(k-l),!(n<1.0e-4&n>-1.0e-4)):0){yta(a,m);i=b;return}if(!(k>j)){i=b;return}m=k-j;if(m<1.0e-4&m>-1.0e-4){i=b;return}yta(a,j);i=b;return}function Bta(a,b){a=a|0;b=b|0;var d=0,e=0;d=b+68|0;b=c[d+4>>2]|0;e=a;c[e>>2]=c[d>>2];c[e+4>>2]=b;return}function Cta(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0;d=i;i=i+128|0;e=d+112|0;f=d+100|0;h=d+56|0;j=d+40|0;k=d+16|0;l=d;m=a+4|0;n=c[m>>2]|0;if((Lc[c[(c[n>>2]|0)+64>>2]&255](n)|0)==0){i=d;return}n=c[m>>2]|0;o=Lc[c[(c[n>>2]|0)+4>>2]&255](n)|0;if((o|0)==0){i=d;return}c[e+0>>2]=c[b+0>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];n=c[m>>2]|0;Ic[c[(c[n>>2]|0)+200>>2]&511](n,e);n=b+12|0;c[f+0>>2]=c[n+0>>2];c[f+4>>2]=c[n+4>>2];c[f+8>>2]=c[n+8>>2];n=c[m>>2]|0;Ic[c[(c[n>>2]|0)+200>>2]&511](n,f);Ic[c[(c[o>>2]|0)+48>>2]&511](o,e);e=h+24|0;c[h+0>>2]=-1;c[h+4>>2]=-1;c[h+8>>2]=-1;c[h+12>>2]=-1;c[h+16>>2]=-1;c[h+20>>2]=-1;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;n=h+28|0;m=h+40|0;b=h+32|0;p=h+36|0;q=j+8|0;r=j+4|0;s=j+12|0;t=h+12|0;u=k+12|0;v=a+96|0;while(1){if((dd[c[(c[o>>2]|0)+32>>2]&511](o,h)|0)==0){w=7;break}if((Om(h,f)|0)>0){w=7;break}x=+g[e>>2];y=+g[n>>2];z=y+ +g[m>>2];A=x+ +g[b>>2];B=y+ +g[p>>2];g[j>>2]=x;g[q>>2]=z;g[r>>2]=A;g[s>>2]=B;c[k+0>>2]=c[h+0>>2];c[k+4>>2]=c[h+4>>2];c[k+8>>2]=c[h+8>>2];c[u+0>>2]=c[t+0>>2];c[u+4>>2]=c[t+4>>2];c[u+8>>2]=c[t+8>>2];nt(k);Xpa(l,a,j);qqa(v,k,l);if((Lc[c[(c[o>>2]|0)+8>>2]&255](o)|0)==0){w=7;break}}if((w|0)==7){i=d;return}}function Dta(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)>=0?(c[a+8>>2]|0)>(b|0):0){e=kua(a+4|0,b)|0}else{e=0}i=d;return e|0}function Eta(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0;d=i;i=i+224|0;e=d+200|0;f=d+120|0;h=d+76|0;j=d+64|0;k=d+48|0;l=d+32|0;m=d+16|0;n=d;o=a+4|0;p=c[o>>2]|0;q=Lc[c[(c[p>>2]|0)+4>>2]&255](p)|0;if((q|0)==0){i=d;return}c[e+0>>2]=c[b+0>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];c[e+16>>2]=c[b+16>>2];c[e+20>>2]=c[b+20>>2];b=c[o>>2]|0;Ic[c[(c[b>>2]|0)+200>>2]&511](b,e);b=c[o>>2]|0;o=e+12|0;Ic[c[(c[b>>2]|0)+200>>2]&511](b,o);Ic[c[(c[q>>2]|0)+48>>2]&511](q,e);Um(f);b=h+24|0;c[h+0>>2]=-1;c[h+4>>2]=-1;c[h+8>>2]=-1;c[h+12>>2]=-1;c[h+16>>2]=-1;c[h+20>>2]=-1;c[b+0>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b+16>>2]=0;c[j>>2]=-1;c[j+4>>2]=-1;c[j+8>>2]=-1;if((Lc[c[c[q>>2]>>2]&255](q)|0)==0){i=d;return}p=f+20|0;r=h+28|0;s=h+40|0;t=f+36|0;u=h+36|0;v=k+8|0;w=k+4|0;x=k+12|0;y=a+244|0;z=a+8|0;A=a+208|0;B=h+32|0;C=m+8|0;D=m+4|0;E=m+12|0;while(1){F=Lc[c[(c[q>>2]|0)+52>>2]&255](q)|0;c[j+0>>2]=c[F+0>>2];c[j+4>>2]=c[F+4>>2];c[j+8>>2]=c[F+8>>2];if((Nm(j,o)|0)>0){G=17;break}dd[c[(c[q>>2]|0)+24>>2]&511](q,f)|0;dd[c[(c[q>>2]|0)+32>>2]&511](q,h)|0;if((Om(j,e)|0)!=0?(Om(j,o)|0)!=0:0){H=+g[b>>2];I=+g[r>>2];J=I+ +g[s>>2];K=H+ +g[B>>2];L=I+ +g[u>>2];g[m>>2]=H;g[C>>2]=J;g[D>>2]=K;g[E>>2]=L;if(((c[y>>2]|0)!=0?(c[z>>2]|0)!=0:0)?(c[A>>2]|0)==0:0){c[A>>2]=1;Xpa(n,a,m);F=c[z>>2]|0;Ic[c[(c[F>>2]|0)+28>>2]&511](F,n);c[A>>2]=0}Lc[c[(c[q>>2]|0)+8>>2]&255](q)|0}else{G=7}if((((G|0)==7?(G=0,L=+g[p>>2],K=+g[r>>2],J=K+ +g[s>>2],H=L+ +g[t>>2],I=K+ +g[u>>2],g[k>>2]=L,g[v>>2]=J,g[w>>2]=H,g[x>>2]=I,(c[y>>2]|0)!=0):0)?(c[z>>2]|0)!=0:0)?(c[A>>2]|0)==0:0){c[A>>2]=1;Xpa(l,a,k);F=c[z>>2]|0;Ic[c[(c[F>>2]|0)+28>>2]&511](F,l);c[A>>2]=0}if((Lc[c[c[q>>2]>>2]&255](q)|0)==0){G=17;break}}if((G|0)==17){i=d;return}}function Fta(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0;b=i;i=i+192|0;d=b+172|0;e=b+144|0;f=b+68|0;h=b;j=a+20|0;if((qr(j,a+32|0)|0)!=0){i=b;return}if((c[a+244>>2]|0)==0){i=b;return}k=a+4|0;l=c[k>>2]|0;if((Lc[c[(c[l>>2]|0)+68>>2]&255](l)|0)==0){i=b;return}l=a+8|0;if((c[l>>2]|0)==0){i=b;return}g[d>>2]=0.0;g[d+4>>2]=0.0;c[d+8>>2]=0;c[e>>2]=-1;m=e+4|0;c[m+0>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;c[m+20>>2]=0;m=c[k>>2]|0;k=Lc[c[(c[m>>2]|0)+4>>2]&255](m)|0;if((k|0)!=0){Ic[c[(c[k>>2]|0)+48>>2]&511](k,j);Um(f);c[h>>2]=-1;c[h+4>>2]=-1;c[h+8>>2]=-1;j=h+12|0;m=h+40|0;c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;c[j+20>>2]=0;c[j+24>>2]=0;c[m>>2]=-1;m=h+44|0;c[m+0>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;c[m+20>>2]=0;if((dd[c[(c[k>>2]|0)+36>>2]&511](k,h)|0)!=0){m=h+28|0;c[d+0>>2]=c[m+0>>2];c[d+4>>2]=c[m+4>>2];c[d+8>>2]=c[m+8>>2];m=h+40|0;c[e+0>>2]=c[m+0>>2];c[e+4>>2]=c[m+4>>2];c[e+8>>2]=c[m+8>>2];c[e+12>>2]=c[m+12>>2];c[e+16>>2]=c[m+16>>2];c[e+20>>2]=c[m+20>>2];c[e+24>>2]=c[m+24>>2]}if((dd[c[(c[k>>2]|0)+24>>2]&511](k,f)|0)!=0){k=f+48|0;c[e+0>>2]=c[k+0>>2];c[e+4>>2]=c[k+4>>2];c[e+8>>2]=c[k+8>>2];c[e+12>>2]=c[k+12>>2];c[e+16>>2]=c[k+16>>2];c[e+20>>2]=c[k+20>>2];c[e+24>>2]=c[k+24>>2]}}k=a+208|0;if((c[k>>2]|0)!=0){i=b;return}c[k>>2]=1;a=c[l>>2]|0;ld[c[(c[a>>2]|0)+20>>2]&255](a,d,e);c[k>>2]=0;i=b;return}function Gta(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d;f=a+4|0;g=c[f>>2]|0;if((Lc[c[(c[g>>2]|0)+64>>2]&255](g)|0)==0){i=d;return}Rc[c[(c[a>>2]|0)+168>>2]&1023](a);g=c[f>>2]|0;ld[c[(c[g>>2]|0)+212>>2]&255](e,g,b);b=a+32|0;g=a+20|0;c[b+0>>2]=c[g+0>>2];c[b+4>>2]=c[g+4>>2];c[b+8>>2]=c[g+8>>2];c[g+0>>2]=c[e+0>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];b=a+44|0;c[b+0>>2]=c[e+0>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];e=a+56|0;c[e+0>>2]=c[g+0>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2];ssa(a);Wra(a);usa(a);i=d;return}function Hta(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;e=i;i=i+32|0;d=e+8|0;f=e;g=a+4|0;h=c[g>>2]|0;if((Lc[c[(c[h>>2]|0)+64>>2]&255](h)|0)==0){i=e;return}Rc[c[(c[a>>2]|0)+168>>2]&1023](a);h=c[g>>2]|0;g=c[(c[h>>2]|0)+172>>2]|0;ota(f,a,b);ld[g&255](d,h,f);f=a+32|0;h=a+20|0;c[f+0>>2]=c[h+0>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[h+0>>2]=c[d+0>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];f=a+44|0;c[f+0>>2]=c[d+0>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];d=a+56|0;c[d+0>>2]=c[h+0>>2];c[d+4>>2]=c[h+4>>2];c[d+8>>2]=c[h+8>>2];ssa(a);Wra(a);usa(a);i=e;return}function Ita(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;e=i;i=i+48|0;d=e+32|0;f=e+24|0;g=e;h=a+4|0;j=c[h>>2]|0;if((Lc[c[(c[j>>2]|0)+64>>2]&255](j)|0)==0){i=e;return}j=c[h>>2]|0;h=c[(c[j>>2]|0)+172>>2]|0;ota(f,a,b);ld[h&255](d,j,f);f=a+32|0;j=a+20|0;c[f+0>>2]=c[j+0>>2];c[f+4>>2]=c[j+4>>2];c[f+8>>2]=c[j+8>>2];c[j+0>>2]=c[d+0>>2];c[j+4>>2]=c[d+4>>2];c[j+8>>2]=c[d+8>>2];if((cs(j,f)|0)==0){i=e;return}d=a+56|0;c[d+0>>2]=c[j+0>>2];c[d+4>>2]=c[j+4>>2];c[d+8>>2]=c[j+8>>2];ssa(a);d=g+12|0;c[g+0>>2]=c[f+0>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];c[d+0>>2]=c[j+0>>2];c[d+4>>2]=c[j+4>>2];c[d+8>>2]=c[j+8>>2];nt(g);tsa(a);Wra(a);usa(a);i=e;return}function Jta(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;d=i;i=i+48|0;e=d+24|0;f=d;g=a+4|0;h=c[g>>2]|0;if((Lc[c[(c[h>>2]|0)+64>>2]&255](h)|0)==0){i=d;return}h=c[g>>2]|0;g=a+20|0;pd[c[(c[h>>2]|0)+176>>2]&127](e,h,g,a+156|0);h=a+32|0;c[h+0>>2]=c[g+0>>2];c[h+4>>2]=c[g+4>>2];c[h+8>>2]=c[g+8>>2];c[g+0>>2]=c[e+0>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];if((b|0)==0){Rc[c[(c[a>>2]|0)+168>>2]&1023](a);ssa(a);usa(a);i=d;return}b=a+44|0;e=a+56|0;if((cs(b,e)|0)==0){c[b+0>>2]=c[h+0>>2];c[b+4>>2]=c[h+4>>2];c[b+8>>2]=c[h+8>>2];c[e+0>>2]=c[g+0>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2]}else{c[e+0>>2]=c[g+0>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2]}if((cs(h,g)|0)==0){i=d;return}ssa(a);e=f+12|0;c[f+0>>2]=c[h+0>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[e+0>>2]=c[g+0>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2];nt(f);tsa(a);usa(a);i=d;return}function Kta(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;d=i;i=i+48|0;e=d+24|0;f=d;g=a+4|0;h=c[g>>2]|0;if((Lc[c[(c[h>>2]|0)+64>>2]&255](h)|0)==0){i=d;return}h=c[g>>2]|0;g=a+20|0;pd[c[(c[h>>2]|0)+180>>2]&127](e,h,g,a+156|0);h=a+32|0;c[h+0>>2]=c[g+0>>2];c[h+4>>2]=c[g+4>>2];c[h+8>>2]=c[g+8>>2];c[g+0>>2]=c[e+0>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];if((b|0)==0){Rc[c[(c[a>>2]|0)+168>>2]&1023](a);ssa(a);usa(a);i=d;return}b=a+44|0;e=a+56|0;if((cs(b,e)|0)==0){c[b+0>>2]=c[h+0>>2];c[b+4>>2]=c[h+4>>2];c[b+8>>2]=c[h+8>>2];c[e+0>>2]=c[g+0>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2]}else{c[e+0>>2]=c[g+0>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2]}if((cs(h,g)|0)==0){i=d;return}ssa(a);e=f+12|0;c[f+0>>2]=c[h+0>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[e+0>>2]=c[g+0>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2];nt(f);tsa(a);usa(a);i=d;return}function Lta(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;i=i+128|0;e=d+108|0;f=d+96|0;g=d+84|0;h=d+72|0;j=d+48|0;k=d+36|0;l=d+24|0;m=d+12|0;n=d;o=a+4|0;p=c[o>>2]|0;if((Lc[c[(c[p>>2]|0)+64>>2]&255](p)|0)==0){i=d;return}if((b|0)!=0){b=a+20|0;p=c[o>>2]|0;ld[c[(c[p>>2]|0)+184>>2]&255](e,p,b);if((qr(b,e)|0)!=0?(e=c[o>>2]|0,ld[c[(c[e>>2]|0)+192>>2]&255](f,e,b),(cs(b,f)|0)!=0):0){f=c[o>>2]|0;ld[c[(c[f>>2]|0)+164>>2]&255](g,f,b);f=a+32|0;c[f+0>>2]=c[b+0>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[b+0>>2]=c[g+0>>2];c[b+4>>2]=c[g+4>>2];c[b+8>>2]=c[g+8>>2]}g=c[o>>2]|0;ld[c[(c[g>>2]|0)+164>>2]&255](h,g,b);g=a+32|0;c[g+0>>2]=c[b+0>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[b+0>>2]=c[h+0>>2];c[b+4>>2]=c[h+4>>2];c[b+8>>2]=c[h+8>>2];h=a+44|0;f=a+56|0;if((cs(h,f)|0)==0){c[h+0>>2]=c[g+0>>2];c[h+4>>2]=c[g+4>>2];c[h+8>>2]=c[g+8>>2];c[f+0>>2]=c[b+0>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2]}else{c[f+0>>2]=c[b+0>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2]}if((cs(g,b)|0)==0){i=d;return}ssa(a);f=j+12|0;c[j+0>>2]=c[g+0>>2];c[j+4>>2]=c[g+4>>2];c[j+8>>2]=c[g+8>>2];c[f+0>>2]=c[b+0>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];nt(j);tsa(a);usa(a);i=d;return}j=a+44|0;b=a+56|0;if((cs(j,b)|0)==0){f=a+20|0;g=c[o>>2]|0;ld[c[(c[g>>2]|0)+184>>2]&255](k,g,f);if((qr(f,k)|0)!=0?(k=c[o>>2]|0,ld[c[(c[k>>2]|0)+192>>2]&255](l,k,f),(cs(f,l)|0)!=0):0){l=c[o>>2]|0;ld[c[(c[l>>2]|0)+164>>2]&255](m,l,f);l=a+32|0;c[l+0>>2]=c[f+0>>2];c[l+4>>2]=c[f+4>>2];c[l+8>>2]=c[f+8>>2];c[f+0>>2]=c[m+0>>2];c[f+4>>2]=c[m+4>>2];c[f+8>>2]=c[m+8>>2]}m=c[o>>2]|0;ld[c[(c[m>>2]|0)+164>>2]&255](n,m,f);m=a+32|0;c[m+0>>2]=c[f+0>>2];c[m+4>>2]=c[f+4>>2];c[m+8>>2]=c[f+8>>2];c[f+0>>2]=c[n+0>>2];c[f+4>>2]=c[n+4>>2];c[f+8>>2]=c[n+8>>2];ssa(a);Wra(a);usa(a);i=d;return}else{n=(Nm(j,b)|0)<0;f=a+32|0;m=a+20|0;c[f+0>>2]=c[m+0>>2];c[f+4>>2]=c[m+4>>2];c[f+8>>2]=c[m+8>>2];if(n){c[m+0>>2]=c[j+0>>2];c[m+4>>2]=c[j+4>>2];c[m+8>>2]=c[j+8>>2]}else{c[m+0>>2]=c[b+0>>2];c[m+4>>2]=c[b+4>>2];c[m+8>>2]=c[b+8>>2]}Rc[c[(c[a>>2]|0)+168>>2]&1023](a);ssa(a);usa(a);i=d;return}}function Mta(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;i=i+128|0;e=d+108|0;f=d+96|0;g=d+84|0;h=d+72|0;j=d+48|0;k=d+36|0;l=d+24|0;m=d+12|0;n=d;o=a+4|0;p=c[o>>2]|0;if((Lc[c[(c[p>>2]|0)+64>>2]&255](p)|0)==0){i=d;return}if((b|0)!=0){b=c[o>>2]|0;p=a+20|0;ld[c[(c[b>>2]|0)+168>>2]&255](e,b,p);b=a+32|0;c[b+0>>2]=c[p+0>>2];c[b+4>>2]=c[p+4>>2];c[b+8>>2]=c[p+8>>2];c[p+0>>2]=c[e+0>>2];c[p+4>>2]=c[e+4>>2];c[p+8>>2]=c[e+8>>2];e=c[o>>2]|0;ld[c[(c[e>>2]|0)+188>>2]&255](f,e,p);if((qr(p,f)|0)!=0?(f=c[o>>2]|0,ld[c[(c[f>>2]|0)+196>>2]&255](g,f,p),(cs(p,g)|0)!=0):0){g=c[o>>2]|0;ld[c[(c[g>>2]|0)+168>>2]&255](h,g,p);c[b+0>>2]=c[p+0>>2];c[b+4>>2]=c[p+4>>2];c[b+8>>2]=c[p+8>>2];c[p+0>>2]=c[h+0>>2];c[p+4>>2]=c[h+4>>2];c[p+8>>2]=c[h+8>>2]}h=a+44|0;g=a+56|0;if((cs(h,g)|0)==0){c[h+0>>2]=c[b+0>>2];c[h+4>>2]=c[b+4>>2];c[h+8>>2]=c[b+8>>2];c[g+0>>2]=c[p+0>>2];c[g+4>>2]=c[p+4>>2];c[g+8>>2]=c[p+8>>2]}else{c[g+0>>2]=c[p+0>>2];c[g+4>>2]=c[p+4>>2];c[g+8>>2]=c[p+8>>2]}if((cs(b,p)|0)==0){i=d;return}ssa(a);g=j+12|0;c[j+0>>2]=c[b+0>>2];c[j+4>>2]=c[b+4>>2];c[j+8>>2]=c[b+8>>2];c[g+0>>2]=c[p+0>>2];c[g+4>>2]=c[p+4>>2];c[g+8>>2]=c[p+8>>2];nt(j);tsa(a);usa(a);i=d;return}j=a+44|0;p=a+56|0;if((cs(j,p)|0)==0){g=c[o>>2]|0;b=a+20|0;ld[c[(c[g>>2]|0)+168>>2]&255](k,g,b);g=a+32|0;c[g+0>>2]=c[b+0>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[b+0>>2]=c[k+0>>2];c[b+4>>2]=c[k+4>>2];c[b+8>>2]=c[k+8>>2];k=c[o>>2]|0;ld[c[(c[k>>2]|0)+188>>2]&255](l,k,b);if((qr(b,l)|0)!=0?(l=c[o>>2]|0,ld[c[(c[l>>2]|0)+196>>2]&255](m,l,b),(cs(b,m)|0)!=0):0){m=c[o>>2]|0;ld[c[(c[m>>2]|0)+168>>2]&255](n,m,b);c[g+0>>2]=c[b+0>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[b+0>>2]=c[n+0>>2];c[b+4>>2]=c[n+4>>2];c[b+8>>2]=c[n+8>>2]}ssa(a);Wra(a);usa(a);i=d;return}else{n=(Nm(j,p)|0)>0;b=a+32|0;g=a+20|0;c[b+0>>2]=c[g+0>>2];c[b+4>>2]=c[g+4>>2];c[b+8>>2]=c[g+8>>2];if(n){c[g+0>>2]=c[j+0>>2];c[g+4>>2]=c[j+4>>2];c[g+8>>2]=c[j+8>>2]}else{c[g+0>>2]=c[p+0>>2];c[g+4>>2]=c[p+4>>2];c[g+8>>2]=c[p+8>>2]}Rc[c[(c[a>>2]|0)+168>>2]&1023](a);ssa(a);usa(a);i=d;return}}function Nta(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;i=i+80|0;f=e+60|0;g=e+48|0;h=e+24|0;j=e+12|0;k=e;l=a+4|0;m=c[l>>2]|0;if((Lc[c[(c[m>>2]|0)+64>>2]&255](m)|0)==0){i=e;return}if((b|0)!=0){b=c[l>>2]|0;if((d|0)==0){m=a+20|0;ld[c[(c[b>>2]|0)+184>>2]&255](g,b,m);n=a+32|0;c[n+0>>2]=c[m+0>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[m+0>>2]=c[g+0>>2];c[m+4>>2]=c[g+4>>2];c[m+8>>2]=c[g+8>>2]}else{Ic[c[(c[b>>2]|0)+156>>2]&511](f,b);b=a+32|0;g=a+20|0;c[b+0>>2]=c[g+0>>2];c[b+4>>2]=c[g+4>>2];c[b+8>>2]=c[g+8>>2];c[g+0>>2]=c[f+0>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2]}f=a+44|0;g=a+56|0;if((cs(f,g)|0)==0){b=a+32|0;m=a+20|0;c[f+0>>2]=c[b+0>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[g+0>>2]=c[m+0>>2];c[g+4>>2]=c[m+4>>2];c[g+8>>2]=c[m+8>>2];o=b}else{b=a+20|0;c[g+0>>2]=c[b+0>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];o=a+32|0}ssa(a);b=a+20|0;g=h+12|0;c[h+0>>2]=c[o+0>>2];c[h+4>>2]=c[o+4>>2];c[h+8>>2]=c[o+8>>2];c[g+0>>2]=c[b+0>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];nt(h);tsa(a);usa(a);i=e;return}h=a+44|0;b=a+56|0;if((cs(h,b)|0)==0){g=c[l>>2]|0;if((d|0)==0){d=a+20|0;ld[c[(c[g>>2]|0)+184>>2]&255](k,g,d);l=a+32|0;c[l+0>>2]=c[d+0>>2];c[l+4>>2]=c[d+4>>2];c[l+8>>2]=c[d+8>>2];c[d+0>>2]=c[k+0>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2]}else{Ic[c[(c[g>>2]|0)+156>>2]&511](j,g);g=a+32|0;k=a+20|0;c[g+0>>2]=c[k+0>>2];c[g+4>>2]=c[k+4>>2];c[g+8>>2]=c[k+8>>2];c[k+0>>2]=c[j+0>>2];c[k+4>>2]=c[j+4>>2];c[k+8>>2]=c[j+8>>2]}ssa(a);Wra(a);usa(a);i=e;return}else{j=(Nm(h,b)|0)<0;k=a+32|0;g=a+20|0;c[k+0>>2]=c[g+0>>2];c[k+4>>2]=c[g+4>>2];c[k+8>>2]=c[g+8>>2];if(j){c[g+0>>2]=c[h+0>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2]}else{c[g+0>>2]=c[b+0>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2]}Rc[c[(c[a>>2]|0)+168>>2]&1023](a);ssa(a);usa(a);i=e;return}}function Ota(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;i=i+80|0;f=e+60|0;g=e+48|0;h=e+24|0;j=e+12|0;k=e;l=a+4|0;m=c[l>>2]|0;if((Lc[c[(c[m>>2]|0)+64>>2]&255](m)|0)==0){i=e;return}if((b|0)!=0){b=c[l>>2]|0;if((d|0)==0){m=a+20|0;ld[c[(c[b>>2]|0)+188>>2]&255](g,b,m);n=a+32|0;c[n+0>>2]=c[m+0>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[m+0>>2]=c[g+0>>2];c[m+4>>2]=c[g+4>>2];c[m+8>>2]=c[g+8>>2]}else{Ic[c[(c[b>>2]|0)+160>>2]&511](f,b);b=a+32|0;g=a+20|0;c[b+0>>2]=c[g+0>>2];c[b+4>>2]=c[g+4>>2];c[b+8>>2]=c[g+8>>2];c[g+0>>2]=c[f+0>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2]}f=a+44|0;g=a+56|0;if((cs(f,g)|0)==0){b=a+32|0;m=a+20|0;c[f+0>>2]=c[b+0>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[g+0>>2]=c[m+0>>2];c[g+4>>2]=c[m+4>>2];c[g+8>>2]=c[m+8>>2];o=b}else{b=a+20|0;c[g+0>>2]=c[b+0>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];o=a+32|0}ssa(a);b=a+20|0;g=h+12|0;c[h+0>>2]=c[o+0>>2];c[h+4>>2]=c[o+4>>2];c[h+8>>2]=c[o+8>>2];c[g+0>>2]=c[b+0>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];nt(h);tsa(a);usa(a);i=e;return}h=a+44|0;b=a+56|0;if((cs(h,b)|0)==0){g=c[l>>2]|0;if((d|0)==0){d=a+20|0;ld[c[(c[g>>2]|0)+188>>2]&255](k,g,d);l=a+32|0;c[l+0>>2]=c[d+0>>2];c[l+4>>2]=c[d+4>>2];c[l+8>>2]=c[d+8>>2];c[d+0>>2]=c[k+0>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2]}else{Ic[c[(c[g>>2]|0)+160>>2]&511](j,g);g=a+32|0;k=a+20|0;c[g+0>>2]=c[k+0>>2];c[g+4>>2]=c[k+4>>2];c[g+8>>2]=c[k+8>>2];c[k+0>>2]=c[j+0>>2];c[k+4>>2]=c[j+4>>2];c[k+8>>2]=c[j+8>>2]}ssa(a);Wra(a);usa(a);i=e;return}else{j=(Nm(h,b)|0)>0;k=a+32|0;g=a+20|0;c[k+0>>2]=c[g+0>>2];c[k+4>>2]=c[g+4>>2];c[k+8>>2]=c[g+8>>2];if(j){c[g+0>>2]=c[h+0>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2]}else{c[g+0>>2]=c[b+0>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2]}Rc[c[(c[a>>2]|0)+168>>2]&1023](a);ssa(a);usa(a);i=e;return}}function Pta(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+48|0;d=b+24|0;e=b;f=a+4|0;g=c[f>>2]|0;if((Lc[c[(c[g>>2]|0)+64>>2]&255](g)|0)==0){i=b;return}g=c[f>>2]|0;h=c[(c[g>>2]|0)+100>>2]|0;Ic[c[(c[a>>2]|0)+208>>2]&511](d,a);ld[h&255](b+12|0,g,d);d=c[f>>2]|0;Ic[c[(c[d>>2]|0)+156>>2]&511](e,d);d=a+32|0;f=a+20|0;c[d+0>>2]=c[f+0>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[f+0>>2]=c[e+0>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];i=b;return}function Qta(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;j=i;i=i+48|0;k=j+36|0;l=j+24|0;m=j+12|0;n=j;c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];d=b+4|0;o=c[d>>2]|0;if((Lc[c[(c[o>>2]|0)+64>>2]&255](o)|0)==0){i=j;return}Mna(k,e,-1);e=c[k>>2]|0;if((e|0)!=0?(o=c[e+4>>2]|0,(o|0)>0):0){p=0;do{q=c[e+(p<<2)+12>>2]|0;r=q&65535;s=q&65535;if((s|0)==9){t=32;u=9}else if((s|0)==13){q=c[d>>2]|0;Fc[c[(c[q>>2]|0)+92>>2]&63](l,q,a,g,h);c[a+0>>2]=c[l+0>>2];c[a+4>>2]=c[l+4>>2];c[a+8>>2]=c[l+8>>2];q=p+1|0;v=(c[e+(q<<2)+12>>2]|0)==10?q:p}else if((s|0)==10){s=c[d>>2]|0;Fc[c[(c[s>>2]|0)+92>>2]&63](m,s,a,g,h);c[a+0>>2]=c[m+0>>2];c[a+4>>2]=c[m+4>>2];c[a+8>>2]=c[m+8>>2];s=p+1|0;v=(c[e+(s<<2)+12>>2]|0)==13?s:p}else{t=r;u=9}if((u|0)==9){u=0;r=c[d>>2]|0;s=c[(c[r>>2]|0)+88>>2]|0;q=Sta(b,t,f)|0;Tc[s&31](n,r,a,t,q,h);c[a+0>>2]=c[n+0>>2];c[a+4>>2]=c[n+4>>2];c[a+8>>2]=c[n+8>>2];v=p}p=v+1|0}while((p|0)<(o|0))}Lna(k);i=j;return}function Rta(a){a=a|0;var b=0,d=0,e=0,f=0,h=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0;b=i;i=i+16|0;d=b;if((c[a+84>>2]|0)==0?(c[a+216>>2]|0)==0:0){e=a+4|0;a=c[e>>2]|0;f=Lc[c[(c[a>>2]|0)+112>>2]&255](a)|0;h=+g[f>>2];j=+g[f+4>>2];k=+g[f+8>>2];l=+g[f+12>>2];f=c[e>>2]|0;Ic[c[(c[f>>2]|0)+116>>2]&511](d,f);f=c[e>>2]|0;if((((Lc[c[(c[f>>2]|0)+144>>2]&255](f)|0)!=0?(Dsa(c[e>>2]|0)|0)>1:0)?(m=+g[d+12>>2]- +g[d+8>>2],n=l-k,m>n):0)?(k=m-n,!(k<1.0e-4&k>-1.0e-4)):0){o=1;i=b;return o|0}k=+g[d+4>>2]- +g[d>>2];n=j-h;if(k>n?(h=k-n,!(h<1.0e-4&h>-1.0e-4)):0){o=1;i=b;return o|0}}o=0;i=b;return o|0}function Sta(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=Lc[c[(c[a>>2]|0)+24>>2]&255](a)|0;if((f|0)==0){g=d;i=e;return g|0}g=Qc[c[(c[f>>2]|0)+16>>2]&255](f,b,d)|0;i=e;return g|0}function Tta(a){a=a|0;var b=0,d=0;b=i;if((c[a+240>>2]|0)!=0?(c[a+184>>2]|0)<(c[a+172>>2]|0):0){Aqa(a+164|0);d=1}else{d=0}i=b;return d|0}function Uta(a){a=a|0;var b=0,d=0;b=i;if((c[a+240>>2]|0)!=0?(c[a+184>>2]|0)>0:0){yqa(a+164|0);d=1}else{d=0}i=b;return d|0}function Vta(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=a+4|0;a=c[e>>2]|0;if((Lc[c[(c[a>>2]|0)+64>>2]&255](a)|0)==0){f=-1;i=d;return f|0}a=c[e>>2]|0;f=dd[c[(c[a>>2]|0)+208>>2]&511](a,b)|0;i=d;return f|0}function Wta(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=b+4|0;b=c[f>>2]|0;if((Lc[c[(c[b>>2]|0)+64>>2]&255](b)|0)==0){c[a>>2]=-1;c[a+4>>2]=-1;c[a+8>>2]=-1;i=e;return}else{b=c[f>>2]|0;ld[c[(c[b>>2]|0)+212>>2]&255](a,b,d);i=e;return}}function Xta(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;d=a+4|0;e=c[d>>2]|0;f=Lc[c[(c[e>>2]|0)+120>>2]&255](e)|0;e=c[d>>2]|0;g=Lc[c[(c[e>>2]|0)+140>>2]&255](e)|0;e=c[d>>2]|0;d=Lc[c[(c[e>>2]|0)+136>>2]&255](e)|0;if((Rta(a)|0)!=0){h=1;j=h&1;i=b;return j|0}if(!((g|0)<1|(f|0)<(g|0))){h=1;j=h&1;i=b;return j|0}h=(d|0)>0&(f|0)>=(d|0);j=h&1;i=b;return j|0}function Yta(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=c[b+4>>2]|0;ld[c[(c[f>>2]|0)+184>>2]&255](a,f,d);i=e;return}function Zta(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=c[b+4>>2]|0;ld[c[(c[f>>2]|0)+188>>2]&255](a,f,d);i=e;return}function _ta(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=c[b+4>>2]|0;ld[c[(c[f>>2]|0)+192>>2]&255](a,f,d);i=e;return}function $ta(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=c[b+4>>2]|0;ld[c[(c[f>>2]|0)+196>>2]&255](a,f,d);i=e;return}function aua(a){a=a|0;var b=0,d=0;b=i;if((c[a+240>>2]|0)==0){d=0;i=b;return d|0}d=(c[a+184>>2]|0)>0&1;i=b;return d|0}function bua(a){a=a|0;var b=0,d=0;b=i;if((c[a+240>>2]|0)==0){d=0;i=b;return d|0}d=(c[a+184>>2]|0)<(c[a+172>>2]|0)&1;i=b;return d|0}function cua(a){a=a|0;var b=0,d=0;b=i;if((c[a+240>>2]|0)!=0){if((c[a+196>>2]|0)==0){d=1}else{d=c[a+192>>2]|0}}else{d=0}i=b;return d|0}function dua(a,b){a=a|0;b=b|0;c[a+220>>2]=b;return}function eua(a,b){a=a|0;b=b|0;c[a+240>>2]=b;return}function fua(a,b){a=a|0;b=b|0;c[a+244>>2]=b;return}function gua(a,b){a=a|0;b=b|0;c[a+248>>2]=b;return}function hua(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;Bqa(a+164|0,b);if((c[a+248>>2]|0)==0){i=d;return}e=c[a+12>>2]|0;if((e|0)==0){i=d;return}Ic[c[(c[e>>2]|0)+28>>2]&511](e,b);i=d;return}function iua(a,b){a=a|0;b=b|0;b=i;Mna(a,1292088,-1);i=b;return}function jua(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}Rc[c[(c[a>>2]|0)+20>>2]&1023](a);i=b;return}function kua(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)>=0?(c[a+4>>2]|0)>(b|0):0){e=c[(c[a>>2]|0)+(b<<2)>>2]|0;i=d;return e|0}b=c[0]|0;da();e=b;i=d;return e|0}function lua(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+4|0;f=c[e>>2]|0;g=f+1|0;do{if((f|0)>=(c[a+8>>2]|0)){if((Kja(a,g)|0)==0){i=d;return}else{h=c[e>>2]|0;break}}else{c[e>>2]=g;h=g}}while(0);c[(c[a>>2]|0)+(h+ -1<<2)>>2]=b;i=d;return}function mua(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)>=0?(c[a+4>>2]|0)>(b|0):0){e=c[(c[a>>2]|0)+(b<<2)>>2]|0;i=d;return e|0}b=c[0]|0;da();e=b;i=d;return e|0}function nua(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+4|0;f=c[e>>2]|0;g=f+1|0;do{if((f|0)>=(c[a+8>>2]|0)){if((Kja(a,g)|0)==0){i=d;return}else{h=c[e>>2]|0;break}}else{c[e>>2]=g;h=g}}while(0);c[(c[a>>2]|0)+(h+ -1<<2)>>2]=b;i=d;return}function oua(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+4|0;e=c[a+8>>2]|0;if((e|0)>0){a=0;do{f=mua(d,a)|0;if((f|0)!=0){$1a(f)}a=a+1|0}while((a|0)!=(e|0))}Kja(d,0)|0;i=b;return}function pua(a){a=a|0;var b=0;b=i;c[a>>2]=758e3;oqa(a);Jja(c[a+4>>2]|0);i=b;return}function qua(a){a=a|0;var b=0;b=i;pua(a);$1a(a);i=b;return}function rua(a){a=a|0;var b=0;b=i;c[a>>2]=758016;oua(a);Jja(c[a+4>>2]|0);i=b;return}function sua(a){a=a|0;var b=0;b=i;rua(a);$1a(a);i=b;return}function tua(a){a=a|0;var b=0;b=i;c[a>>2]=758e3;Ija(a+4|0,4);i=b;return}function uua(a){a=a|0;var b=0;b=i;c[a>>2]=758016;Ija(a+4|0,4);i=b;return}function vua(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=758032;d=a+4|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;c[d+24>>2]=0;a=Hpa()|0;c[d>>2]=a;ld[c[(c[a>>2]|0)+44>>2]&255](a,1,1);a=c[d>>2]|0;Rc[c[(c[a>>2]|0)+28>>2]&1023](a);i=b;return}function wua(a){a=a|0;var b=0;b=i;xua(a);$1a(a);i=b;return}function xua(a){a=a|0;var b=0;b=i;c[a>>2]=758032;Ipa(c[a+4>>2]|0);i=b;return}function yua(a,b){a=a|0;b=b|0;var d=0;d=i;if((a|0)==0){i=d;return}Ic[c[c[a>>2]>>2]&511](a,b);i=d;return}function zua(a){a=a|0;var b=0,d=0;b=i;if((a|0)==0){d=0;i=b;return d|0}d=Lc[c[(c[a>>2]|0)+16>>2]&255](a)|0;i=b;return d|0}function Aua(a,b){a=a|0;b=b|0;var d=0;d=i;if((a|0)==0){i=d;return}Fc[c[(c[a>>2]|0)+248>>2]&63](a,b,1,0,0);i=d;return}function Bua(a,b){a=a|0;b=+b;var d=0;d=i;if((a|0)==0){i=d;return}Oc[c[(c[a>>2]|0)+88>>2]&3](a,b,1);i=d;return}function Cua(a){a=a|0;var b=0,d=0,e=0.0;b=i;i=i+16|0;d=b;if((a|0)==0){e=0.0;i=b;return+e}Ic[c[(c[a>>2]|0)+200>>2]&511](d,a);e=+g[d+12>>2]- +g[d+8>>2];i=b;return+e}function Dua(a){a=a|0;var d=0,e=0,f=0,g=0;d=i;i=i+80|0;e=d;Um(e);f=zua(c[a+4>>2]|0)|0;if((f|0)==0){g=b[e>>1]|0;i=d;return g|0}Ic[c[(c[f>>2]|0)+44>>2]&511](f,1);dd[c[(c[f>>2]|0)+32>>2]&511](f,e)|0;g=b[e>>1]|0;i=d;return g|0}function Eua(a,b){a=a|0;b=b|0;var d=0;d=i;if((b|0)==0){Mna(a,1292088,-1);i=d;return}else{Ic[c[(c[b>>2]|0)+184>>2]&511](a,b);i=d;return}}function Fua(a){a=a|0;var b=0,d=0;b=i;d=a+4|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;c[d+24>>2]=0;c[d+28>>2]=0;c[a>>2]=758048;c[a+36>>2]=758140;Ija(a+40|0,4);g[a+56>>2]=0.0;c[a+60>>2]=0;c[a+64>>2]=0;i=b;return}function Gua(a){a=a|0;var b=0;b=i;Hua(a);$1a(a);i=b;return}function Hua(a){a=a|0;var b=0;b=i;c[a>>2]=758048;c[a+36>>2]=758140;Iua(a);Jja(c[a+40>>2]|0);i=b;return}function Iua(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+40|0;e=c[a+44>>2]|0;if((e|0)>0){f=0}else{Kja(d,0)|0;i=b;return}do{a=Jua(d,f)|0;if((a|0)!=0){Rc[c[(c[a>>2]|0)+4>>2]&1023](a)}f=f+1|0}while((f|0)!=(e|0));Kja(d,0)|0;i=b;return}function Jua(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)>-1?(c[a+4>>2]|0)>(b|0):0){e=_wa(a,b)|0}else{e=0}i=d;return e|0}function Kua(a){a=a|0;var b=0;b=i;Iua(a+ -36|0);i=b;return}function Lua(a,b){a=a|0;b=b|0;c[a+60>>2]=b;return}function Mua(a,b){a=a|0;b=b|0;c[a+ -36+60>>2]=b;return}function Nua(a,b){a=a|0;b=+b;g[a+56>>2]=b;return}function Oua(a,b){a=a|0;b=+b;g[a+ -36+56>>2]=b;return}function Pua(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=Z1a(32)|0;vua(e);if((e|0)==0){i=d;return}f=e+4|0;yua(c[f>>2]|0,c[a+60>>2]|0);Bua(c[f>>2]|0,+g[a+56>>2]);Aua(c[f>>2]|0,b);Qua(a+40|0,e);i=d;return}function Qua(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+4|0;f=c[e>>2]|0;g=f+1|0;do{if((f|0)>=(c[a+8>>2]|0)){if((Kja(a,g)|0)==0){i=d;return}else{h=c[e>>2]|0;break}}else{c[e>>2]=g;h=g}}while(0);c[(c[a>>2]|0)+(h+ -1<<2)>>2]=b;i=d;return}function Rua(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0.0,j=0.0,k=0,l=0.0,m=0.0,n=0,o=0.0;d=i;e=a+40|0;f=Jua(e,b+ -1|0)|0;if((f|0)==0){h=0.0}else{h=+g[f+24>>2]}f=c[a+44>>2]|0;if((f|0)>(b|0)){j=h;k=b;while(1){b=Jua(e,k)|0;if((b|0)==0){l=j}else{m=j+ +Cua(c[b+4>>2]|0);n=b+16|0;c[n>>2]=0;c[n+4>>2]=0;g[b+24>>2]=m;g[b+28>>2]=j;l=m}k=k+1|0;if((k|0)==(f|0)){o=l;break}else{j=l}}}else{o=h}f=a+20|0;c[f>>2]=0;c[f+4>>2]=0;g[a+28>>2]=o;g[a+32>>2]=0.0;i=d;return}function Sua(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=Jua(a+40|0,b)|0;if((e|0)==0){f=0;i=d;return f|0}f=c[e+4>>2]|0;i=d;return f|0}function Tua(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=Sua(a+ -36|0,b)|0;i=c;return d|0}function Uua(a){a=a|0;return c[a+44>>2]|0}function Vua(a){a=a|0;return c[a+ -36+44>>2]|0}function Wua(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=b+4|0;c[a+0>>2]=c[e+0>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];i=d;return}function Xua(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=b+ -36+4|0;c[a+0>>2]=c[e+0>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];i=d;return}function Yua(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0.0,h=0.0;c=+g[b+4>>2];d=+g[b+16>>2];e=d- +g[b+32>>2];f=+g[b+24>>2]+c;h=d- +g[b+28>>2];g[a>>2]=+g[b+20>>2]+c;g[a+8>>2]=h;g[a+4>>2]=f;g[a+12>>2]=e;return}function Zua(a,b){a=a|0;b=b|0;var c=0;c=i;Yua(a,b+ -36|0);i=c;return}function _ua(a){a=a|0;return+(+g[a+56>>2])}function $ua(a){a=a|0;return+(+g[a+ -36+56>>2])}function ava(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0,h=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0;d=i;e=+g[a+16>>2]- +g[b+4>>2];b=a+40|0;f=a+44|0;a=c[f>>2]|0;if((a|0)>0){h=1;j=1;k=0}else{l=0;i=d;return l|0}while(1){m=Jua(b,k)|0;if((m|0)!=0){n=+g[m+24>>2];o=+g[m+28>>2];if(e>o){p=e-o;q=p<1.0e-4&p>-1.0e-4?h:0}else{q=h}if(e<n){p=e-n;if(!(e>=o)){r=q;s=p<1.0e-4&p>-1.0e-4?j:0}else{l=k;t=11;break}}else{r=q;s=j}}else{r=h;s=j}k=k+1|0;if((k|0)>=(a|0)){break}else{h=r;j=s}}if((t|0)==11){i=d;return l|0}if((r|0)!=0){l=0;i=d;return l|0}if((s|0)==0){l=-1;i=d;return l|0}l=(c[f>>2]|0)+ -1|0;i=d;return l|0}function bva(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=ava(a+ -36|0,b)|0;i=c;return d|0}function cva(a){a=a|0;var b=0,d=0,e=0.0;b=i;d=Jua(a+40|0,0)|0;if((d|0)==0){e=1.0;i=b;return+e}e=+Cua(c[d+4>>2]|0);i=b;return+e}function dva(a){a=a|0;var b=0,c=0.0;b=i;c=+cva(a+ -36|0);i=b;return+c}function eva(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=a+40|0;e=c[a+44>>2]|0;if((e|0)>0){f=0}else{g=-1;i=b;return g|0}while(1){a=Jua(d,f)|0;if((a|0)!=0?(c[a+8>>2]|0)!=0:0){g=f;h=5;break}f=f+1|0;if((f|0)>=(e|0)){g=-1;h=5;break}}if((h|0)==5){i=b;return g|0}return 0}function fva(a){a=a|0;var b=0,c=0;b=i;c=eva(a+ -36|0)|0;i=b;return c|0}function gva(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=a+40|0;e=c[a+44>>2]|0;if((e|0)>0){f=e}else{g=-1;i=b;return g|0}while(1){f=f+ -1|0;e=Jua(d,f)|0;if((e|0)!=0?(c[e+8>>2]|0)!=0:0){g=f;h=5;break}if((f|0)<=0){g=-1;h=5;break}}if((h|0)==5){i=b;return g|0}return 0}function hva(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;f=a+40|0;g=c[a+44>>2]|0;if((g|0)<=0){h=b;i=e;return h|0}a=(d+ -97|0)>>>0<26?d+ -32|0:d;d=0;j=b;while(1){b=j+1|0;k=(b|0)>=(g|0)?0:b;b=Jua(f,k)|0;if((b|0)!=0?(l=(Dua(b)|0)&65535,(((l+ -97|0)>>>0<26?l+ -32|0:l)|0)==(a|0)):0){h=k;m=6;break}d=d+1|0;if((d|0)>=(g|0)){h=k;m=6;break}else{j=k}}if((m|0)==6){i=e;return h|0}return 0}function iva(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;e=hva(a+ -36|0,b,c)|0;i=d;return e|0}function jva(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0;e=i;i=i+16|0;f=e;h=Jua(b+40|0,d)|0;if((h|0)==0){c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;i=e;return}else{j=+g[h+24>>2];k=+g[h+28>>2];Ic[c[(c[b>>2]|0)+20>>2]&511](f,b);l=+g[b+4>>2];m=+g[b+16>>2];n=l+(+g[f+4>>2]- +g[f>>2]);g[a>>2]=l+0.0;g[a+8>>2]=m-j;g[a+4>>2]=n;g[a+12>>2]=m-k;i=e;return}}function kva(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;jva(a,b+ -36|0,c);i=d;return}function lva(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=Jua(a+40|0,b)|0;if((e|0)==0){f=0;i=d;return f|0}f=c[e+8>>2]|0;i=d;return f|0}function mva(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=lva(a+ -36|0,b)|0;i=c;return d|0}function nva(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=Jua(a+40|0,b)|0;if((f|0)==0){i=e;return}c[f+8>>2]=d;i=e;return}function ova(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=Jua(a+40|0,b)|0;if((f|0)==0){i=e;return}c[f+12>>2]=d;i=e;return}function pva(a,b){a=a|0;b=b|0;c[a+64>>2]=b;return}function qva(a,b){a=a|0;b=b|0;c[a+ -36+64>>2]=b;return}function rva(a){a=a|0;return c[a+64>>2]|0}function sva(a){a=a|0;return c[a+ -36+64>>2]|0}function tva(a,b){a=a|0;b=b|0;var d=0;if((b|0)>-1){d=(c[a+44>>2]|0)>(b|0)}else{d=0}return d&1|0}function uva(a,b){a=a|0;b=b|0;var d=0;if((b|0)>-1){d=(c[a+ -36+44>>2]|0)>(b|0)}else{d=0}return d&1|0}function vva(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=Jua(b+40|0,d)|0;if((f|0)==0){Mna(a,1292088,-1);i=e;return}else{Eua(a,c[f+4>>2]|0);i=e;return}}function wva(a){a=a|0;var b=0;b=i;c[a>>2]=758312;Ija(a+4|0,4);i=b;return}function xva(a){a=a|0;var b=0;b=i;yva(a);$1a(a);i=b;return}function yva(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;c[a>>2]=758312;d=a+4|0;e=c[a+8>>2]|0;if((e|0)>0){a=0;do{f=zva(d,a)|0;if((f|0)!=0){$1a(f)}a=a+1|0}while((a|0)!=(e|0))}Kja(d,0)|0;Jja(c[d>>2]|0);i=b;return}function zva(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)>=0?(c[a+4>>2]|0)>(b|0):0){e=c[(c[a>>2]|0)+(b<<2)>>2]|0;i=d;return e|0}b=c[0]|0;da();e=b;i=d;return e|0}function Ava(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=Bva(a,b)|0;f=a+4|0;if((e|0)<0){a=Z1a(8)|0;c[a>>2]=b;c[a+4>>2]=1;Cva(f,a);i=d;return}a=zva(f,e)|0;if((a|0)==0){i=d;return}c[a+4>>2]=1;i=d;return}function Bva(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=a+4|0;f=c[a+8>>2]|0;if((f|0)>0){g=0}else{h=-1;i=d;return h|0}while(1){a=zva(e,g)|0;if((a|0)!=0?(c[a>>2]|0)==(b|0):0){h=g;j=5;break}g=g+1|0;if((g|0)>=(f|0)){h=-1;j=5;break}}if((j|0)==5){i=d;return h|0}return 0}function Cva(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+4|0;f=c[e>>2]|0;g=f+1|0;do{if((f|0)>=(c[a+8>>2]|0)){if((Kja(a,g)|0)==0){i=d;return}else{h=c[e>>2]|0;break}}else{c[e>>2]=g;h=g}}while(0);c[(c[a>>2]|0)+(h+ -1<<2)>>2]=b;i=d;return}function Dva(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=i;e=(b|0)>(c|0);f=e?b:c;g=e?c:b;while(1){Ava(a,g);if((g|0)<(f|0)){g=g+1|0}else{break}}i=d;return}function Eva(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=a+4|0;f=c[a+8>>2]|0;if((f|0)>0){g=f}else{i=d;return}do{g=g+ -1|0;f=zva(e,g)|0;if((f|0)!=0?(c[f>>2]|0)==(b|0):0){c[f+4>>2]=-1}}while((g|0)>0);i=d;return}function Fva(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=i;e=(b|0)>(c|0);f=e?b:c;g=e?c:b;while(1){Eva(a,g);if((g|0)<(f|0)){g=g+1|0}else{break}}i=d;return}function Gva(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;if(((b|0)>-1?(c[a+8>>2]|0)>(b|0):0)?(e=zva(a+4|0,b)|0,(e|0)!=0):0){f=c[e>>2]|0}else{f=-1}i=d;return f|0}function Hva(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;if(((b|0)>-1?(c[a+8>>2]|0)>(b|0):0)?(e=zva(a+4|0,b)|0,(e|0)!=0):0){f=c[e+4>>2]|0}else{f=0}i=d;return f|0}function Iva(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+4|0;e=c[a+8>>2]|0;if((e|0)>0){f=0}else{i=b;return}do{a=zva(d,f)|0;if((a|0)!=0){c[a+4>>2]=-1}f=f+1|0}while((f|0)!=(e|0));i=b;return}function Jva(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+4|0;e=c[a+8>>2]|0;if((e|0)<=0){i=b;return}a=e;do{a=a+ -1|0;e=zva(d,a)|0;do{if((e|0)!=0){f=e+4|0;if((c[f>>2]|0)==-1){$1a(e);Oja(d,a);break}else{c[f>>2]=0;break}}}while(0)}while((a|0)>0);i=b;return}function Kva(a){a=a|0;var b=0,d=0,e=0;b=i;Fua(a);c[a>>2]=758328;c[a+36>>2]=758524;d=a+68|0;e=a+84|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;wva(e);c[a+104>>2]=-1;c[a+108>>2]=-1;c[a+112>>2]=0;c[a+116>>2]=-1;i=b;return}function Lva(a){a=a|0;var b=0;b=i;Mva(a);$1a(a);i=b;return}function Mva(a){a=a|0;var b=0;b=i;c[a>>2]=758328;c[a+36>>2]=758524;yva(a+84|0);Hua(a);i=b;return}function Nva(a,b){a=a|0;b=b|0;c[a+68>>2]=b;return}function Ova(a,b){a=a|0;b=b|0;c[a+ -36+68>>2]=b;return}function Pva(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0.0;e=i;i=i+16|0;f=e;Ic[c[(c[b>>2]|0)+20>>2]&511](f,b);h=+g[d+4>>2]-(+g[b+80>>2]- +g[f+12>>2]);g[a>>2]=+g[d>>2]-(+g[b+76>>2]- +g[f>>2]);g[a+4>>2]=h;i=e;return}function Qva(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0.0;e=i;i=i+16|0;f=e;Ic[c[(c[b>>2]|0)+20>>2]&511](f,b);h=+g[d+4>>2]+(+g[b+80>>2]- +g[f+12>>2]);g[a>>2]=+g[d>>2]+(+g[b+76>>2]- +g[f>>2]);g[a+4>>2]=h;i=e;return}function Rva(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0;e=i;i=i+32|0;f=e+24|0;h=e+16|0;j=e+8|0;k=e;l=c[(c[b>>2]|0)+128>>2]|0;m=+g[d+8>>2];g[h>>2]=+g[d>>2];g[h+4>>2]=m;ld[l&255](f,b,h);h=c[(c[b>>2]|0)+128>>2]|0;m=+g[d+12>>2];g[k>>2]=+g[d+4>>2];g[k+4>>2]=m;ld[h&255](j,b,k);m=+g[f+4>>2];n=+g[j>>2];o=+g[j+4>>2];g[a>>2]=+g[f>>2];g[a+8>>2]=m;g[a+4>>2]=n;g[a+12>>2]=o;i=e;return}function Sva(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0;e=i;i=i+32|0;f=e+24|0;h=e+16|0;j=e+8|0;k=e;l=c[(c[b>>2]|0)+132>>2]|0;m=+g[d+8>>2];g[h>>2]=+g[d>>2];g[h+4>>2]=m;ld[l&255](f,b,h);h=c[(c[b>>2]|0)+132>>2]|0;m=+g[d+12>>2];g[k>>2]=+g[d+4>>2];g[k+4>>2]=m;ld[h&255](j,b,k);m=+g[f+4>>2];n=+g[j>>2];o=+g[j+4>>2];g[a>>2]=+g[f>>2];g[a+8>>2]=m;g[a+4>>2]=n;g[a+12>>2]=o;i=e;return}function Tva(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;g=dd[c[(c[a>>2]|0)+76>>2]&511](a,b)|0;if((Lc[c[(c[a>>2]|0)+52>>2]&255](a)|0)==0){Vva(a,g)}else{do{if((e|0)==0){b=a+84|0;Iva(b);if((d|0)==0){Ava(b,g);Uva(a);c[a+108>>2]=g;break}else{Dva(b,c[a+108>>2]|0,g);Uva(a);break}}else{b=a+84|0;if((dd[c[(c[a>>2]|0)+40>>2]&511](a,g)|0)==0){Ava(b,g);Uva(a);c[a+112>>2]=1}else{Eva(b,g);Uva(a);c[a+112>>2]=0}c[a+108>>2]=g}}while(0);Ic[c[(c[a>>2]|0)+176>>2]&511](a,g)}if((Wva(a,g)|0)!=0){i=f;return}Ic[c[(c[a>>2]|0)+148>>2]&511](a,g);i=f;return}function Uva(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=a+84|0;e=c[a+92>>2]|0;if((e|0)>0){f=0}else{Jva(d);i=b;return}do{g=Gva(d,f)|0;h=Hva(d,f)|0;if((h|0)==1){wwa(a,g,1)}else if((h|0)==-1){wwa(a,g,0)}f=f+1|0}while((f|0)!=(e|0));Jva(d);i=b;return}function Vva(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;if((dd[c[(c[a>>2]|0)+56>>2]&511](a,b)|0)==0){i=d;return}e=a+104|0;f=c[e>>2]|0;if((f|0)==(b|0)){i=d;return}if((f|0)>-1){nva(a,f,0);qwa(a,c[e>>2]|0)}nva(a,b,1);qwa(a,b);c[e>>2]=b;i=d;return}function Wva(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0;d=i;i=i+32|0;e=d+16|0;f=d;Ic[c[(c[a>>2]|0)+20>>2]&511](e,a);ld[c[(c[a>>2]|0)+72>>2]&255](f,a,b);if(!(+g[f+8>>2]>=+g[e+8>>2])){h=0;j=h&1;i=d;return j|0}h=+g[f+12>>2]<=+g[e+12>>2];j=h&1;i=d;return j|0}function Xva(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=i;Tva(a+ -36|0,b,c,d);i=e;return}function Yva(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;d=i;f=dd[c[(c[a>>2]|0)+76>>2]&511](a,b)|0;if((Lc[c[(c[a>>2]|0)+52>>2]&255](a)|0)==0){Vva(a,f)}else{if((e|0)==0){e=a+84|0;Iva(e);Dva(e,c[a+108>>2]|0,f);Uva(a)}else{e=a+84|0;b=c[a+108>>2]|0;if((c[a+112>>2]|0)==0){Fva(e,b,f)}else{Dva(e,b,f)}Uva(a)}Ic[c[(c[a>>2]|0)+176>>2]&511](a,f)}if((Wva(a,f)|0)!=0){i=d;return}Ic[c[(c[a>>2]|0)+148>>2]&511](a,f);i=d;return}function Zva(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=i;Yva(a+ -36|0,b,0,d);i=c;return}function _va(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;if((Lc[c[(c[a>>2]|0)+52>>2]&255](a)|0)!=0){if((b|0)>-1?(Lc[c[(c[a>>2]|0)+36>>2]&255](a)|0)>(b|0):0){do{if((e|0)==0){g=a+84|0;Iva(g);if((d|0)==0){Ava(g,b);Uva(a);c[a+108>>2]=b;break}else{Dva(g,c[a+108>>2]|0,b);Uva(a);break}}}while(0);Ic[c[(c[a>>2]|0)+176>>2]&511](a,b)}}else{Vva(a,b)}if((Wva(a,b)|0)!=0){i=f;return}Ic[c[(c[a>>2]|0)+148>>2]&511](a,b);i=f;return}function $va(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=i;_va(a+ -36|0,b,c,d);i=e;return}function awa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=c[a>>2]|0;g=c[f+120>>2]|0;h=(Lc[c[f+52>>2]&255](a)|0)==0;f=c[a>>2]|0;if(h){j=Lc[c[f+156>>2]&255](a)|0}else{j=Lc[c[f+152>>2]&255](a)|0}pd[g&127](a,j+ -1|0,b,d);i=e;return}function bwa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;awa(a+ -36|0,b,c);i=d;return}function cwa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=c[a>>2]|0;g=c[f+120>>2]|0;h=(Lc[c[f+52>>2]&255](a)|0)==0;f=c[a>>2]|0;if(h){j=Lc[c[f+156>>2]&255](a)|0}else{j=Lc[c[f+152>>2]&255](a)|0}pd[g&127](a,j+1|0,b,d);i=e;return}function dwa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;cwa(a+ -36|0,b,c);i=d;return}function ewa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;pd[c[(c[a>>2]|0)+120>>2]&127](a,0,b,d);i=e;return}function fwa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=a+ -36|0;pd[c[(c[f>>2]|0)+120>>2]&127](f,0,b,d);i=e;return}function gwa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=c[a>>2]|0;g=c[f+120>>2]|0;h=(Lc[c[f+36>>2]&255](a)|0)+ -1|0;pd[g&127](a,h,b,d);i=e;return}function hwa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;gwa(a+ -36|0,b,c);i=d;return}function iwa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;pd[c[(c[a>>2]|0)+120>>2]&127](a,0,b,d);i=e;return}function jwa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=a+ -36|0;pd[c[(c[f>>2]|0)+120>>2]&127](f,0,b,d);i=e;return}function kwa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=c[a>>2]|0;g=c[f+120>>2]|0;h=(Lc[c[f+36>>2]&255](a)|0)+ -1|0;pd[g&127](a,h,b,d);i=e;return}function lwa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;kwa(a+ -36|0,b,c);i=d;return}function mwa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;g=gva(a)|0;h=Qc[c[(c[a>>2]|0)+60>>2]&255](a,g,b&65535)|0;if((h|0)==(g|0)){j=0;i=f;return j|0}pd[c[(c[a>>2]|0)+120>>2]&127](a,h,d,e);j=1;i=f;return j|0}function nwa(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=i;f=mwa(a+ -36|0,b,c,d)|0;i=e;return f|0}function owa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0.0;d=i;i=i+16|0;e=d;f=a+4|0;c[f+0>>2]=c[b+0>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];g[a+76>>2]=+g[b>>2];f=c[(c[a>>2]|0)+144>>2]|0;h=+g[b+12>>2];g[e>>2]=+g[b>>2];g[e+4>>2]=h;Ic[f&511](a,e);Ic[c[(c[a>>2]|0)+68>>2]&511](a,0);qwa(a,-1);i=d;return}function pwa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+4|0;c[e+0>>2]=c[b+0>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];i=d;return}function qwa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0;d=i;i=i+32|0;e=d+16|0;f=d;h=a+68|0;if((c[h>>2]|0)==0){i=d;return}j=a+72|0;k=(c[j>>2]|0)!=0;if((b|0)==-1){if(k){i=d;return}c[j>>2]=1;Ic[c[(c[a>>2]|0)+20>>2]&511](e,a);l=c[h>>2]|0;Ic[c[(c[l>>2]|0)+16>>2]&511](l,e);c[j>>2]=0;i=d;return}else{if(k){i=d;return}c[j>>2]=1;ld[c[(c[a>>2]|0)+72>>2]&255](f,a,b);g[f>>2]=+g[f>>2]+-1.0;b=f+4|0;g[b>>2]=+g[b>>2]+1.0;b=f+8|0;g[b>>2]=+g[b>>2]+-1.0;b=f+12|0;g[b>>2]=+g[b>>2]+1.0;b=c[h>>2]|0;Ic[c[(c[b>>2]|0)+16>>2]&511](b,f);c[j>>2]=0;i=d;return}}function rwa(a,b){a=a|0;b=b|0;var c=0;c=i;owa(a+ -36|0,b);i=c;return}function swa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;g=c[(c[b>>2]|0)+136>>2]|0;jva(f,b,d);ld[g&255](a,b,f);i=e;return}function twa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;swa(a,b+ -36|0,c);i=d;return}function uwa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;Pua(a,b);b=c[a>>2]|0;e=c[b+68>>2]|0;f=(Lc[c[b+36>>2]&255](a)|0)+ -1|0;Ic[e&511](a,f);i=d;return}function vwa(a,b){a=a|0;b=b|0;var c=0;c=i;uwa(a+ -36|0,b);i=c;return}function wwa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;if((dd[c[(c[a>>2]|0)+56>>2]&511](a,b)|0)==0){i=e;return}if((dd[c[(c[a>>2]|0)+40>>2]&511](a,b)|0)==(d|0)){i=e;return}if((d|0)==0){nva(a,b,0);qwa(a,b);i=e;return}else{nva(a,b,1);qwa(a,b);i=e;return}}function xwa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;if((dd[c[(c[a>>2]|0)+56>>2]&511](a,b)|0)==0){i=d;return}if((Lc[c[(c[a>>2]|0)+52>>2]&255](a)|0)==0){i=d;return}e=a+116|0;f=c[e>>2]|0;if((f|0)==(b|0)){i=d;return}c[e>>2]=b;ova(a,f,0);ova(a,b,1);qwa(a,f);qwa(a,b);i=d;return}function ywa(a,b){a=a|0;b=b|0;var c=0;c=i;xwa(a+ -36|0,b);i=c;return}function zwa(a,b){a=a|0;b=b|0;var d=0;d=i;if((dd[c[(c[a>>2]|0)+56>>2]&511](a,b)|0)==0){i=d;return}if((Lc[c[(c[a>>2]|0)+52>>2]&255](a)|0)==0){Vva(a,b);i=d;return}else{Ava(a+84|0,b);Uva(a);i=d;return}}function Awa(a,b){a=a|0;b=b|0;var c=0;c=i;zwa(a+ -36|0,b);i=c;return}function Bwa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0;d=i;i=i+48|0;e=d+32|0;f=d+16|0;h=d;if((dd[c[(c[a>>2]|0)+56>>2]&511](a,b)|0)==0){i=d;return}Ic[c[(c[a>>2]|0)+20>>2]&511](e,a);jva(f,a,b);ld[c[(c[a>>2]|0)+72>>2]&255](h,a,b);j=+g[h+8>>2];k=+g[e+8>>2];if(j<k?(l=j-k,!(l<1.0e-4&l>-1.0e-4)):0){l=+g[h+12>>2];m=+g[e+12>>2];if(!(l<m)){i=d;return}n=l-m;if(n<1.0e-4&n>-1.0e-4){i=d;return}Cwa(a,m-k+ +g[f+8>>2]);i=d;return}m=+g[h+12>>2];n=+g[e+12>>2];if(!(m>n)){i=d;return}l=m-n;if(!((!(l>-1.0e-4)|!(l<1.0e-4))&j>k)){i=d;return}l=j-k;if(l<1.0e-4&l>-1.0e-4){i=d;return}Cwa(a,+g[f+12>>2]);i=d;return}function Cwa(a,b){a=a|0;b=+b;var d=0,e=0,f=0,h=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0;d=i;i=i+32|0;e=d+16|0;f=d;h=a+80|0;j=+g[h>>2]-b;if(j<1.0e-4&j>-1.0e-4){i=d;return}Ic[c[(c[a>>2]|0)+20>>2]&511](e,a);Yua(f,a);j=+g[e+12>>2];k=j- +g[e+8>>2];l=+g[f+12>>2];m=+g[f+8>>2];do{if(!(k>l-m)){n=b-k;if(n<m?(o=n-m,!(o<1.0e-4&o>-1.0e-4)):0){p=m+k;break}if(l<b){o=b-l;p=o<1.0e-4&o>-1.0e-4?b:l}else{p=b}}else{p=j}}while(0);g[h>>2]=p;qwa(a,-1);h=c[a+68>>2]|0;if((h|0)==0){i=d;return}f=a+72|0;if((c[f>>2]|0)!=0){i=d;return}c[f>>2]=1;Gc[c[(c[h>>2]|0)+12>>2]&15](h,p);c[f>>2]=0;i=d;return}function Dwa(a,b){a=a|0;b=b|0;var c=0;c=i;Bwa(a+ -36|0,b);i=c;return}function Ewa(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0.0;b=i;i=i+32|0;d=b+16|0;e=b;f=a+68|0;if((c[f>>2]|0)==0){i=b;return}Ic[c[(c[a>>2]|0)+20>>2]&511](d,a);Yua(e,a);h=a+72|0;if((c[h>>2]|0)!=0){i=b;return}c[h>>2]=1;j=c[f>>2]|0;f=c[(c[j>>2]|0)+4>>2]|0;k=d+8|0;l=+g[k>>2];m=d+12|0;n=+g[m>>2];o=+g[e+8>>2];p=+g[e+12>>2];q=+Vc[c[(c[a>>2]|0)+44>>2]&15](a);fd[f&7](j,l,n,o,p,q,+g[m>>2]- +g[k>>2]);c[h>>2]=0;i=b;return}function Fwa(a,b){a=a|0;b=b|0;var c=0;c=i;Cwa(a,+g[b+4>>2]);i=c;return}function Gwa(a,b){a=a|0;b=b|0;var c=0;c=i;Cwa(a+ -36|0,+g[b+4>>2]);i=c;return}function Hwa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;f=c[(c[b>>2]|0)+136>>2]|0;Yua(e,b);ld[f&255](a,b,e);i=d;return}function Iwa(a,b){a=a|0;b=b|0;var c=0;c=i;Hwa(a,b+ -36|0);i=c;return}function Jwa(a,b){a=a|0;b=b|0;var c=0;c=i;Rua(a,b);Ewa(a);i=c;return}function Kwa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+32|0;e=d;if((dd[c[(c[a>>2]|0)+56>>2]&511](a,b)|0)==0){i=d;return}Ic[c[(c[a>>2]|0)+20>>2]&511](d+16|0,a);jva(e,a,b);Cwa(a,+g[e+12>>2]);i=d;return}function Lwa(a,b){a=a|0;b=b|0;var c=0;c=i;Kwa(a+ -36|0,b);i=c;return}function Mwa(a){a=a|0;var b=0,d=0,e=0,f=0.0,h=0;b=i;i=i+16|0;d=b;e=c[(c[a>>2]|0)+76>>2]|0;f=+g[a+16>>2];g[d>>2]=+g[a+4>>2];g[d+4>>2]=f;h=dd[e&511](a,d)|0;if((Wva(a,h)|0)==0){d=h+1|0;e=(Wva(a,d)|0)==0;i=b;return(e?h:d)|0}else{i=b;return h|0}return 0}function Nwa(a){a=a|0;var b=0,c=0;b=i;c=Mwa(a+ -36|0)|0;i=b;return c|0}function Owa(a){a=a|0;var b=0;b=i;Iua(a);qwa(a,-1);i=b;return}function Pwa(a){a=a|0;var b=0;b=i;Owa(a+ -36|0);i=b;return}function Qwa(a){a=a|0;var b=0;b=i;Iva(a+84|0);i=b;return}function Rwa(a){a=a|0;var b=0;b=i;Iva(a+ -36+84|0);i=b;return}function Swa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;ld[c[(c[a>>2]|0)+132>>2]&255](e,a,b);b=ava(a,e)|0;i=d;return b|0}function Twa(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=Swa(a+ -36|0,b)|0;i=c;return d|0}function Uwa(a,b){a=a|0;b=b|0;var d=0;d=i;if((Lc[c[(c[b>>2]|0)+52>>2]&255](b)|0)==0){vva(a,b,c[b+104>>2]|0);i=d;return}else{vva(a,b,c[b+116>>2]|0);i=d;return}}function Vwa(a,b){a=a|0;b=b|0;var c=0;c=i;Uwa(a,b+ -36|0);i=c;return}function Wwa(a){a=a|0;return c[a+116>>2]|0}function Xwa(a){a=a|0;return c[a+104>>2]|0}function Ywa(a){a=a|0;return c[a+ -36+116>>2]|0}function Zwa(a){a=a|0;return c[a+ -36+104>>2]|0}function _wa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)>=0?(c[a+4>>2]|0)>(b|0):0){e=c[(c[a>>2]|0)+(b<<2)>>2]|0;i=d;return e|0}b=c[0]|0;da();e=b;i=d;return e|0}function $wa(a,b){a=a|0;b=b|0;var c=0,d=0.0;c=i;d=+g[a>>2];if(!(d>5.0e4)){if(d<-5.0e4){g[a>>2]=-5.0e4}}else{g[a>>2]=5.0e4}d=+g[b>>2];if(d>5.0e4){g[b>>2]=5.0e4;i=c;return}if(!(d<-5.0e4)){i=c;return}g[b>>2]=-5.0e4;i=c;return}function axa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0;f=i;i=i+80|0;h=f+68|0;j=f+64|0;k=f+60|0;l=f+56|0;m=f+52|0;n=f+48|0;o=f+44|0;p=f+40|0;q=f;if((b|0)<=0){i=f;return}r=(e|0)!=0;s=a+4|0;a=b+ -1|0;t=q+4|0;u=q+12|0;v=q+36|0;w=q+20|0;x=0;do{y=d+(x*12|0)|0;g[h>>2]=+g[y>>2];z=d+(x*12|0)+4|0;g[j>>2]=+g[z>>2];if(r){fma(e,h,j)}$wa(h,j);A=c[d+(x*12|0)+8>>2]&6;if((A|0)==2){B=x+ -1|0;do{if((c[d+(B*12|0)+8>>2]|0)==6){if((x|0)!=(a|0)?(c[d+((x+1|0)*12|0)+8>>2]|0)!=6:0){break}if(+g[y>>2]==+g[d+(B*12|0)>>2]?+g[z>>2]==+g[d+(B*12|0)+4>>2]:0){g[h>>2]=+g[h>>2]+1.0}}}while(0);Gya(s,+g[h>>2],+g[j>>2],2);C=x}else if((A|0)==4){B=x+ -1|0;D=+g[d+(B*12|0)>>2];g[k>>2]=D;E=+g[d+(B*12|0)+4>>2];g[l>>2]=E;B=x+1|0;F=+g[d+(B*12|0)>>2];g[m>>2]=F;G=+g[d+(B*12|0)+4>>2];g[n>>2]=G;B=x+2|0;H=+g[d+(B*12|0)>>2];g[o>>2]=H;I=+g[d+(B*12|0)+4>>2];g[p>>2]=I;if(r){fma(e,k,l);fma(e,m,n);fma(e,o,p);J=+g[k>>2];K=+g[l>>2];L=+g[m>>2];M=+g[n>>2];N=+g[o>>2];O=+g[p>>2]}else{J=D;K=E;L=F;M=G;N=H;O=I}I=+g[h>>2];H=+g[j>>2];c[u+0>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;c[u+12>>2]=0;c[u+16>>2]=0;c[u+20>>2]=0;c[v>>2]=64;IJa(t,J,K,I,H,L,M,N,O);bxa(s,q);Uya(w);C=B}else if((A|0)==6){Gya(s,+g[h>>2],+g[j>>2],1);C=x}else{C=x}if((c[d+(C*12|0)+8>>2]&1|0)!=0){gza(s)}x=C+1|0}while((x|0)<(b|0));i=f;return}function bxa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0;d=i;i=i+16|0;e=d+8|0;f=d+4|0;h=d;c[b+16>>2]=0;j=b+4|0;b=Iya(j,e,f,h)|0;k=b&-129;if((k|0)==0){i=d;return}l=b;b=k;do{if((b|0)==1?(c[a>>2]|0)!=0:0){m=c[h>>2]|2}else{m=l}Gya(a,+g[e>>2],+g[f>>2],c[h>>2]|m);l=Iya(j,e,f,h)|0;b=l&-129}while((b|0)!=0);i=d;return}function cxa(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=i;c[a>>2]=758696;Ija(a+12|0,4);c[a+4>>2]=b;c[a+44>>2]=d;c[a+8>>2]=0;c[a+32>>2]=0;c[a+28>>2]=0;c[a+36>>2]=0;c[a+48>>2]=e;c[a+52>>2]=f;c[a+56>>2]=g;c[a+40>>2]=0;i=h;return}function dxa(a){a=a|0;var b=0;b=i;exa(a);v2a(a);i=b;return}function exa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;c[a>>2]=758696;d=c[a+8>>2]|0;if((d|0)!=0){JIa(d);v2a(d)}d=a+12|0;e=a+16|0;if((c[e>>2]|0)>0){f=0}else{g=c[d>>2]|0;Jja(g);i=b;return}do{if((c[(Hg(d,f)|0)>>2]|0)!=0?(a=c[(Hg(d,f)|0)>>2]|0,(a|0)!=0):0){JIa(a);v2a(a)}f=f+1|0}while((f|0)<(c[e>>2]|0));g=c[d>>2]|0;Jja(g);i=b;return}function fxa(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=+g;h=h|0;i=i|0;j=j|0;return 0}function gxa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;switch(b|0){case 4:{e=c[(c[a+4>>2]|0)+16>>2]|0;break};case 6:case 5:{e=0;break};case 2:{e=c[(c[a+4>>2]|0)+8>>2]|0;break};case 8:{e=c[a+44>>2]|0;break};case 1:{e=1;break};case 7:{b=c[a+4>>2]|0;f=c[b+20>>2]|0;if((f&2|0)==0){if((f|0)==1){g=(c[b+16>>2]|0)==1?1457:2481}else{g=433}}else{g=497}e=f<<7&512|g;break};case 3:{e=c[(c[a+4>>2]|0)+12>>2]|0;break};default:{e=0}}i=d;return e|0}function hxa(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a+8>>2]|0;if((d|0)!=0){e=u2a(24)|0;HIa(e,d);if((e|0)==0){i=b;return}else{f=e}}else{f=0}yg(a+12|0,f);i=b;return}function ixa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=a+12|0;f=a+16|0;g=c[f>>2]|0;if((g|0)==0){h=a+8|0;j=c[h>>2]|0;if((j|0)==0){i=d;return}JIa(j);v2a(j);c[h>>2]=0;i=d;return}h=c[(Hg(e,g+ -1|0)|0)>>2]|0;g=a+8|0;a=c[g>>2]|0;if((a|0)!=0){JIa(a);v2a(a);c[g>>2]=0}if((b|0)==0){Oja(e,(c[f>>2]|0)+ -1|0);c[g>>2]=h;i=d;return}if((h|0)==0){i=d;return}f=u2a(24)|0;HIa(f,h);c[g>>2]=f;i=d;return}function jxa(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;e=i;i=i+128|0;f=e+104|0;g=e+96|0;h=e+72|0;j=e+68|0;k=e+48|0;l=e+32|0;m=e+4|0;n=e;o=c[d+80>>2]|0;p=(c[d+84>>2]|0)+1|0;q=(c[d+88>>2]|0)+1|0;c[f>>2]=c[d+76>>2];r=f+4|0;c[r>>2]=o;o=f+8|0;c[o>>2]=p;p=f+12|0;c[p>>2]=q;q=a+8|0;Ela(f,(c[q>>2]|0)+4|0);c[g>>2]=0;s=kxa(g)|0;if((s|0)==0){Fya(g);i=e;return}t=c[f>>2]|0;f=c[r>>2]|0;JCa(s,(c[o>>2]|0)-t|0,(c[p>>2]|0)-f|0,264,0)|0;WCa(s,0);p=Lc[c[(c[s>>2]|0)+8>>2]&255](s)|0;o=c[s+8>>2]|0;r=c[s+12>>2]|0;u=c[s+24>>2]|0;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;c[h+16>>2]=0;c[h+20>>2]=0;bza(h,p,o,r,u);c[j>>2]=h;c[k>>2]=j;j=(c[h+8>>2]|0)+ -1|0;u=(c[h+12>>2]|0)+ -1|0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=j;c[k+16>>2]=u;c[l>>2]=k;c[l+8>>2]=t;c[l+12>>2]=f;b[l+4>>1]=-1;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=2147483632;c[m+16>>2]=0;c[m+20>>2]=0;c[m+24>>2]=0;lxa(d,m,l,(c[a+40>>2]&512|0)!=0);a=c[q>>2]|0;Jya(n,c[g>>2]|0);NIa(a,t,f,c[n>>2]|0);Fya(n);Aya(m);v2a(c[h+4>>2]|0);Fya(g);i=e;return}function kxa(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a>>2]|0;if((d|0)!=0){e=d+40|0;c[e>>2]=(c[e>>2]|0)+ -1;e=c[a>>2]|0;if(!((c[e+40>>2]|0)>0|(e|0)==0)){Rc[c[(c[e>>2]|0)+4>>2]&1023](e)}c[a>>2]=0}e=u2a(44)|0;ICa(e);c[e>>2]=758856;c[a>>2]=e;if((e|0)==0){f=0;i=b;return f|0}c[e+40>>2]=1;f=e;i=b;return f|0}function lxa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;if(!(bya(a)|0)){i=f;return}cya(b,c[a+76>>2]|0,c[a+84>>2]|0);if(!(dya(a,b,e)|0)){i=f;return}g=b+12|0;h=b+20|0;j=b+24|0;do{vya(d,c[g>>2]|0,c[h>>2]|0,c[j>>2]|0)}while(dya(a,b,e)|0);i=f;return}function mxa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0;f=i;i=i+240|0;h=f+216|0;j=f+200|0;k=f+184|0;l=f+156|0;m=f;c[a+40>>2]=e;n=a+8|0;if((c[n>>2]|0)==0?(o=u2a(24)|0,p=dd[c[(c[a>>2]|0)+16>>2]&511](a,2)|0,GIa(o,p,dd[c[(c[a>>2]|0)+16>>2]&511](a,3)|0),c[n>>2]=o,(o|0)==0):0){q=0;i=f;return q|0}if(((c[b>>2]|0)+ -4|0)>>>0<2){c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;if((cJa(b,d,h)|0)!=0){r=+(dd[c[(c[a>>2]|0)+16>>2]&511](a,2)|0);s=+(dd[c[(c[a>>2]|0)+16>>2]&511](a,3)|0);g[j>>2]=0.0;g[j+8>>2]=0.0;g[j+4>>2]=r;g[j+12>>2]=s;Ila(h,j);Mla(k,h);LIa(c[n>>2]|0,k);q=1;i=f;return q|0}}k=l+4|0;dza(k);axa(l,c[b>>2]|0,c[b+4>>2]|0,d);gza(k);aza(m);d=dd[c[(c[a>>2]|0)+16>>2]&511](a,2)|0;nxa(m,+(d|0),+(dd[c[(c[a>>2]|0)+16>>2]&511](a,3)|0));oxa(m,k);c[m+96>>2]=(e&3|0)!=2&1;jxa(a,m);hza(m+4|0);cza(k);q=1;i=f;return q|0}function nxa(b,d,e){b=b|0;d=+d;e=+e;var f=0;f=i;c[b+132>>2]=0;c[b+136>>2]=0;c[b+140>>2]=~~(d*256.0);c[b+144>>2]=~~(e*256.0);$ya(b+132|0);a[b+148>>0]=1;i=f;return}function oxa(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,h=0;c=i;i=i+16|0;d=c+4|0;e=c;fza(b);f=qya(b,d,e)|0;if((f&-129|0)==0){i=c;return}else{h=f}do{rya(a,+g[d>>2],+g[e>>2],h);h=qya(b,d,e)|0}while((h&-129|0)!=0);i=c;return}function pxa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;i=i+192|0;g=f+156|0;h=f;j=a+8|0;if((c[j>>2]|0)==0?(k=u2a(24)|0,l=dd[c[(c[a>>2]|0)+16>>2]&511](a,2)|0,GIa(k,l,dd[c[(c[a>>2]|0)+16>>2]&511](a,3)|0),c[j>>2]=k,(k|0)==0):0){m=0;i=f;return m|0}else{n=a}k=g+4|0;dza(k);axa(g,c[b>>2]|0,c[b+4>>2]|0,0);aza(h);b=dd[c[(c[n>>2]|0)+16>>2]&511](a,2)|0;nxa(h,+(b|0),+(dd[c[(c[n>>2]|0)+16>>2]&511](a,3)|0));qxa(h,k,d,e,1.0);c[h+96>>2]=0;jxa(a,h);hza(h+4|0);cza(k);m=1;i=f;return m|0}function qxa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;var h=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0;h=i;i=i+336|0;j=h+116|0;k=h;l=c[e>>2]|0;if((l|0)==1){m=2}else if((l|0)==2){m=1}else{m=0}l=c[e+16>>2]|0;if((l|0)==1){n=2}else if((l|0)==2){n=3}else{n=1}o=+g[e+24>>2]*f;if((d|0)==0){p=1.0}else{q=+cma(+g[d>>2],+g[d+4>>2]);p=1.0/((q+ +dma(+g[d+8>>2],+g[d+12>>2]))*.5)}q=o<p?p:o;l=e+8|0;if((c[l>>2]|0)==0){c[j>>2]=b;r=j+4|0;Lza(r);c[j+100>>2]=0;c[j+68>>2]=n;c[j+64>>2]=m;g[j+52>>2]=+g[e+20>>2];g[j+48>>2]=q*.5;Pya(a,j,d);Sya(r);i=h;return}c[j>>2]=b;b=j+4|0;uza(b);c[j+204>>2]=0;r=e+4|0;s=c[r>>2]|0;if((s|0)>0){t=s;s=0;do{u=s<<1;v=c[l>>2]|0;o=+g[v+(u<<2)>>2];p=!(o<=9.999999974752427e-7)?o:.10000000149011612;w=u|1;if((w|0)==(t|0)){x=p}else{x=+g[v+(w<<2)>>2]}vza(b,p*f,(x<0.0?0.0:x)*f);s=s+1|0;t=c[r>>2]|0}while((s|0)<((t+1|0)/2|0|0))}wza(b,+g[e+12>>2]*f);c[k>>2]=j;b=k+4|0;Lza(b);c[k+100>>2]=0;c[k+68>>2]=n;c[k+64>>2]=m;g[k+52>>2]=+g[e+20>>2];g[k+48>>2]=q*.5;Qya(a,k,d);Sya(b);Rya(j+168|0);i=h;return}function rxa(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0;j=i;i=i+112|0;k=j+32|0;l=j;if((f|0)==0){m=0}else{m=c[a+52>>2]|0}if((sxa(k,c[a+4>>2]|0,m,c[a+8>>2]|0,d,e,c[a+48>>2]|0,g,h)|0)==0){n=0;i=j;return n|0}c[l>>2]=0;c[l+4>>2]=0;c[l+8>>2]=2147483632;c[l+16>>2]=0;c[l+20>>2]=0;c[l+24>>2]=0;txa(b,l,k,(c[a+40>>2]&512|0)!=0);Aya(l);n=1;i=j;return n|0}function sxa(b,e,f,g,h,j,k,l,m){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;n=i;i=i+16|0;o=n+4|0;p=n;q=n+14|0;r=n+13|0;s=n+12|0;t=n+11|0;u=n+10|0;v=n+9|0;w=n+8|0;c[o>>2]=h;h=b+56|0;c[h>>2]=e;c[b+60>>2]=g;x=b+64|0;a[x>>0]=0;a[x+1>>0]=0;a[x+2>>0]=0;a[x+3>>0]=0;y=x+4|0;a[y>>0]=0;a[y+1>>0]=0;a[y+2>>0]=0;a[y+3>>0]=0;y=b+28|0;c[y>>2]=k;c[b+32>>2]=f;f=b+36|0;if((g|0)!=0){k=g+4|0;c[f+0>>2]=c[k+0>>2];c[f+4>>2]=c[k+4>>2];c[f+8>>2]=c[k+8>>2];c[f+12>>2]=c[k+12>>2];k=b+52|0;c[k>>2]=0;if((c[g>>2]|0)==1){Jya(p,c[g+20>>2]|0);c[k>>2]=c[p>>2];Fya(p)}}else{c[b+40>>2]=0;c[f>>2]=0;c[b+44>>2]=c[e+8>>2];c[b+48>>2]=c[e+12>>2];c[b+52>>2]=0}c[b+24>>2]=j;j=e+20|0;f=c[j>>2]&4;p=(l&65280|0)!=0;if(p){z=l}else{z=(c[o>>2]|0)>>>24}c[b>>2]=z&255;if((c[(BGa()|0)+268>>2]|0)!=0?(c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0)!=0:0){A=m;B=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0}else{A=0;B=0}m=c[h>>2]|0;if((c[m+16>>2]|0)==8){a[x>>0]=1;a[x+1>>0]=0;a[x+2>>0]=0;a[x+3>>0]=0;z=x+4|0;a[z>>0]=0;a[z+1>>0]=0;a[z+2>>0]=0;a[z+3>>0]=0;if((c[m+20>>2]|0)==1){c[b+16>>2]=255;C=1;i=n;return C|0}m=c[o>>2]|0;if((A|0)!=0){if(p){D=e3a(m|0)|0}else{D=m}c[o>>2]=D;Fc[c[(c[B>>2]|0)+36>>2]&63](B,A,q,o,1);c[b+16>>2]=d[q>>0]|0;C=1;i=n;return C|0}if(p){dX(m>>>24&255,m>>>16&255,m>>>8&255,m&255,r,s,t);c[b+16>>2]=((((d[s>>0]|0)*59|0)+((d[t>>0]|0)*11|0)+((d[r>>0]|0)*30|0)|0)>>>0)/100|0;C=1;i=n;return C|0}else{c[b+16>>2]=((((m>>>8&255)*59|0)+((m&255)*11|0)+((m>>>16&255)*30|0)|0)>>>0)/100|0;C=1;i=n;return C|0}}do{if((f|0)==0){m=((c[j>>2]<<8)+(c[e+16>>2]|0)|0)==544;r=m?4:3;t=m?0:0;a[x>>0]=r;a[x+1>>0]=r>>8;a[x+2>>0]=r>>16;a[x+3>>0]=r>>24;r=x+4|0;a[r>>0]=t;a[r+1>>0]=t>>8;a[r+2>>0]=t>>16;a[r+3>>0]=t>>24;if((A|0)!=0){t=c[o>>2]|0;if(p){E=e3a(t|0)|0}else{E=t}c[o>>2]=E;t=b+20|0;Fc[c[(c[B>>2]|0)+36>>2]&63](B,A,t,o,1);a[t+3>>0]=c[b>>2];c[b+4>>2]=d[t+2>>0]|0;c[b+8>>2]=d[t+1>>0]|0;c[b+12>>2]=d[t>>0]|0;if((c[y>>2]|0)==0){break}r=c[t>>2]|0;c[t>>2]=r&-16711936|r>>>16&255|r<<16&16711680;break}if(p){r=c[o>>2]|0;dX(r>>>24&255,r>>>16&255,r>>>8&255,r&255,u,v,w);r=c[b>>2]<<24;t=d[u>>0]|0;m=d[v>>0]|0;s=m<<8;q=d[w>>0]|0;D=t<<16|r|s|q;z=b+20|0;c[z>>2]=D;if((c[y>>2]|0)==0){F=D}else{F=t|r|s|q<<16}c[z>>2]=F;c[b+4>>2]=t;c[b+8>>2]=m;c[b+12>>2]=q;break}q=c[o>>2]|0;if((c[y>>2]|0)==0){c[b+20>>2]=q}else{c[b+20>>2]=q&-16711936|q>>>16&255|q<<16&16711680}DCa(q,b,b+4|0,b+8|0,b+12|0)}else{a[x>>0]=2;a[x+1>>0]=0;a[x+2>>0]=0;a[x+3>>0]=0;q=x+4|0;a[q>>0]=0;a[q+1>>0]=0;a[q+2>>0]=0;a[q+3>>0]=0;do{if(p){q=b+20|0;c[q>>2]=e3a(c[o>>2]|0)|0;if((A|0)==0){G=q;break}else{Fc[c[(c[B>>2]|0)+36>>2]&63](B,A,q,q,1);G=q;break}}else{if((A|0)==0){C=0;i=n;return C|0}else{q=b+20|0;Fc[c[(c[B>>2]|0)+36>>2]&63](B,A,q,o,1);G=q;break}}}while(0);c[b+4>>2]=d[G>>0]|0;c[b+8>>2]=d[G+1>>0]|0;c[b+12>>2]=d[G+2>>0]|0;c[b+16>>2]=d[G+3>>0]|0}}while(0);if((c[(c[h>>2]|0)+16>>2]|0)!=1){C=1;i=n;return C|0}a[x>>0]=5;a[x+1>>0]=0;a[x+2>>0]=0;a[x+3>>0]=0;h=x+4|0;a[h>>0]=0;a[h+1>>0]=0;a[h+2>>0]=0;a[h+3>>0]=0;C=1;i=n;return C|0}function txa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=i;if(!(bya(a)|0)){i=f;return}cya(b,c[a+76>>2]|0,c[a+84>>2]|0);if(!(dya(a,b,e)|0)){i=f;return}do{eya(d,b)}while(dya(a,b,e)|0);i=f;return}function uxa(a,b,d,e,f,h,j,k,l,m){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0;n=i;i=i+320|0;o=n+288|0;p=n+132|0;q=n+104|0;r=n+80|0;s=n+56|0;t=n+32|0;u=n;if((m|0)!=0){v=0;i=n;return v|0}if((Lc[c[(c[a>>2]|0)+120>>2]&255](a)|0)==0){v=1;i=n;return v|0}c[a+40>>2]=j;m=j&3;if(!((m|0)==0|(f|0)==0)?(w=o+4|0,dza(w),axa(o,c[b>>2]|0,c[b+4>>2]|0,d),aza(p),o=dd[c[(c[a>>2]|0)+16>>2]&511](a,2)|0,nxa(p,+(o|0),+(dd[c[(c[a>>2]|0)+16>>2]&511](a,3)|0)),oxa(p,w),c[p+96>>2]=(m|0)!=2&1,m=Ec[c[(c[a>>2]|0)+116>>2]&15](a,p,f,j&4,0,k,l)|0,hza(p+4|0),cza(w),(m|0)==0):0){v=0;i=n;return v|0}m=k&65280;if((e|0)!=0?(w=k>>>16,(((m|0)==0?h>>>24:w)&255|0)!=0):0){if((j&256|0)!=0){k=q+4|0;dza(k);axa(q,c[b>>2]|0,c[b+4>>2]|0,d);aza(p);q=dd[c[(c[a>>2]|0)+16>>2]&511](a,2)|0;nxa(p,+(q|0),+(dd[c[(c[a>>2]|0)+16>>2]&511](a,3)|0));qxa(p,k,0,e,1.0);q=Ec[c[(c[a>>2]|0)+116>>2]&15](a,p,h,j&4,c[a+56>>2]|0,w&255|m,l)|0;hza(p+4|0);cza(k);v=(q|0)!=0&1;i=n;return v|0}q=r+12|0;g[q>>2]=1.0;g[r>>2]=1.0;g[r+20>>2]=0.0;g[r+16>>2]=0.0;g[r+8>>2]=0.0;g[r+4>>2]=0.0;g[s+12>>2]=1.0;g[s>>2]=1.0;g[s+20>>2]=0.0;g[s+16>>2]=0.0;g[s+8>>2]=0.0;g[s+4>>2]=0.0;if((d|0)!=0){x=+g[d>>2];y=+R(+x);z=+g[d+4>>2];k=y>+R(+z);y=+R(+(k?x:z));g[r>>2]=y;g[q>>2]=y;Tla(s,x/y,z/y,+g[d+8>>2]/y,+g[d+12>>2]/y,0.0,0.0);g[t+12>>2]=1.0;g[t>>2]=1.0;g[t+20>>2]=0.0;g[t+16>>2]=0.0;g[t+8>>2]=0.0;g[t+4>>2]=0.0;Ula(t,s);c[r+0>>2]=c[d+0>>2];c[r+4>>2]=c[d+4>>2];c[r+8>>2]=c[d+8>>2];c[r+12>>2]=c[d+12>>2];c[r+16>>2]=c[d+16>>2];c[r+20>>2]=c[d+20>>2];Wla(r,t)}t=u+4|0;dza(t);axa(u,c[b>>2]|0,c[b+4>>2]|0,r);aza(p);b=dd[c[(c[a>>2]|0)+16>>2]&511](a,2)|0;nxa(p,+(b|0),+(dd[c[(c[a>>2]|0)+16>>2]&511](a,3)|0));qxa(p,t,s,e,+g[r>>2]);r=Ec[c[(c[a>>2]|0)+116>>2]&15](a,p,h,j&4,c[a+56>>2]|0,w&255|m,l)|0;hza(p+4|0);cza(t);if((r|0)==0){v=0;i=n;return v|0}}v=1;i=n;return v|0}function vxa(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0;h=i;if((e|0)<0){i=h;return}if((f|0)<0?1:(c[b+8>>2]|0)<=(e|0)){i=h;return}if((c[b+12>>2]|0)<=(f|0)){i=h;return}j=Lc[c[(c[b>>2]|0)+8>>2]&255](b)|0;k=ca(c[b+24>>2]|0,f)|0;f=c[b+16>>2]|0;l=((ca(f,e)|0)/8|0)+k|0;k=j+l|0;e=g>>>24;if(((c[b+20>>2]<<8)+f|0)==544){a[j+(l+3)>>0]=e;a[k>>0]=g>>>16;a[j+(l+1)>>0]=g>>>8;a[j+(l+2)>>0]=g;i=h;return}else{f=ca(g>>>16&255,e)|0;b=e^255;a[k>>0]=(((ca(d[k>>0]|0,b)|0)+f|0)>>>0)/255|0;f=ca(g>>>8&255,e)|0;k=j+(l+1)|0;a[k>>0]=(((ca(d[k>>0]|0,b)|0)+f|0)>>>0)/255|0;f=ca(g&255,e)|0;e=j+(l+2)|0;a[e>>0]=(((ca(d[e>>0]|0,b)|0)+f|0)>>>0)/255|0;i=h;return}}function wxa(b,e,f,g,h,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;k=i;i=i+16|0;l=k;m=j>>>24;if((m|0)==0){i=k;return}c[l>>2]=e;n=l+4|0;c[n>>2]=f;o=l+8|0;c[o>>2]=g+e;e=l+12|0;c[e>>2]=h+f;xxa(l,c[b+8>>2]|0,c[b+12>>2]|0);f=c[l>>2]|0;h=(c[o>>2]|0)-f|0;o=j>>>16;g=o&255;p=j>>>8;q=p&255;r=j&255;s=c[b+16>>2]|0;t=(s|0)/8|0;u=c[b+20>>2]&2;v=r<<16|g|m<<24|q<<8;w=Lc[c[(c[b>>2]|0)+8>>2]&255](b)|0;x=c[n>>2]|0;n=(x|0)<(c[e>>2]|0);if((m|0)==255){if(!n){i=k;return}y=b+24|0;z=(s+ -32|0)>>>0<8;A=(h|0)>0;B=o&255;C=p&255;D=j&255;E=f;F=x;while(1){G=w+((ca(E,t)|0)+(ca(c[y>>2]|0,F)|0))|0;if(z){if(A){H=0;I=G;while(1){c[I>>2]=v;H=H+1|0;if((H|0)==(h|0)){break}else{I=I+4|0}}}}else{if(A){I=0;H=G;while(1){a[H>>0]=B;a[H+1>>0]=C;a[H+2>>0]=D;I=I+1|0;if((I|0)==(h|0)){break}else{H=H+3|0}}}}H=F+1|0;if((H|0)>=(c[e>>2]|0)){break}E=c[l>>2]|0;F=H}i=k;return}if(!n){i=k;return}n=b+24|0;b=(u|0)==0;u=(h|0)>0;F=m&255;E=o&255;o=p&255;p=j&255;j=m*255|0;D=m^255;C=ca(g,m)|0;B=ca(q,m)|0;A=ca(r,m)|0;v=(s+ -32|0)>>>0<8;s=f;f=x;while(1){x=w+((ca(s,t)|0)+(ca(c[n>>2]|0,f)|0))|0;if(b){if(u){z=0;y=x;while(1){a[y>>0]=(((ca(d[y>>0]|0,D)|0)+C|0)>>>0)/255|0;H=y+1|0;a[H>>0]=(((ca(d[H>>0]|0,D)|0)+B|0)>>>0)/255|0;H=y+2|0;a[H>>0]=(((ca(d[H>>0]|0,D)|0)+A|0)>>>0)/255|0;z=z+1|0;if((z|0)==(h|0)){break}else{y=v?y+4|0:y+3|0}}}}else{if(u){y=0;z=x;while(1){H=z+3|0;I=a[H>>0]|0;G=I&255;if(I<<24>>24==0){a[H>>0]=F;a[z>>0]=E;a[z+1>>0]=o;a[z+2>>0]=p}else{I=G+m-(((ca(G,m)|0)>>>0)/255|0)|0;a[H>>0]=I;H=(j>>>0)/((I&255)>>>0)|0;I=255-H|0;a[z>>0]=((ca(d[z>>0]|0,I)|0)+(ca(H,g)|0)|0)/255|0;G=z+1|0;a[G>>0]=((ca(d[G>>0]|0,I)|0)+(ca(H,q)|0)|0)/255|0;G=z+2|0;a[G>>0]=((ca(d[G>>0]|0,I)|0)+(ca(H,r)|0)|0)/255|0}y=y+1|0;if((y|0)==(h|0)){break}else{z=z+4|0}}}}z=f+1|0;if((z|0)>=(c[e>>2]|0)){break}s=c[l>>2]|0;f=z}i=k;return}function xxa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=b;c[f+12>>2]=d;Ela(a,f);i=e;return}function yxa(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;j=i;i=i+32|0;k=j+20|0;l=j+16|0;m=j+12|0;n=j+8|0;o=j+4|0;p=j;c[k>>2]=0;c[l>>2]=0;c[m>>2]=d;c[n>>2]=e;c[o>>2]=g;c[p>>2]=h;if((b|0)==0){i=j;return}XCa(b,k,l,m,n,c[f+8>>2]|0,c[f+12>>2]|0,o,p,0);h=c[m>>2]|0;if((h|0)==0){i=j;return}g=c[n>>2]|0;if((g|0)==0){i=j;return}e=c[b+16>>2]|0;d=(e|0)/8|0;q=(c[b+20>>2]<<8)+e|0;r=(c[f+20>>2]<<8)+(c[f+16>>2]|0)|0;s=c[b+24>>2]|0;t=Lc[c[(c[b>>2]|0)+8>>2]&255](b)|0;if((q|0)==(r|0)){if((g|0)<=0){i=j;return}b=(e+ -32|0)>>>0<8;e=h;u=0;while(1){v=ca((c[l>>2]|0)+u|0,s)|0;w=t+(v+(ca(c[k>>2]|0,d)|0))|0;v=dd[c[(c[f>>2]|0)+12>>2]&511](f,(c[p>>2]|0)+u|0)|0;x=v+(ca(c[o>>2]|0,d)|0)|0;v=(e|0)>0;if(b){if(v){y=0;z=w;A=x;while(1){a[z>>0]=a[A+2>>0]|0;a[z+1>>0]=a[A+1>>0]|0;a[z+2>>0]=a[A>>0]|0;a[z+3>>0]=a[A+3>>0]|0;y=y+1|0;B=c[m>>2]|0;if((y|0)>=(B|0)){C=B;break}else{z=z+4|0;A=A+4|0}}}else{C=e}}else{if(v){A=0;z=w;y=x;while(1){a[z>>0]=a[y+2>>0]|0;a[z+1>>0]=a[y+1>>0]|0;a[z+2>>0]=a[y>>0]|0;A=A+1|0;B=c[m>>2]|0;if((A|0)>=(B|0)){C=B;break}else{z=z+3|0;y=y+3|0}}}else{C=e}}u=u+1|0;if((u|0)>=(c[n>>2]|0)){break}else{e=C}}i=j;return}C=ca(c[l>>2]|0,s)|0;l=(ca(c[k>>2]|0,d)|0)+C|0;if((q|0)==24){if(!((r|0)==32&(g|0)>0)){i=j;return}C=g;d=h;k=0;while(1){e=dd[c[(c[f>>2]|0)+12>>2]&511](f,(c[p>>2]|0)+k|0)|0;if((d|0)>0){u=0;b=t+((ca(k,s)|0)+l)|0;y=e+(c[o>>2]<<2)|0;while(1){a[b>>0]=a[y+2>>0]|0;a[b+1>>0]=a[y+1>>0]|0;a[b+2>>0]=a[y>>0]|0;u=u+1|0;D=c[m>>2]|0;if((u|0)>=(D|0)){break}else{b=b+3|0;y=y+4|0}}E=c[n>>2]|0;F=D}else{E=C;F=d}k=k+1|0;if((k|0)>=(E|0)){break}else{C=E;d=F}}i=j;return}if((q&-513|0)!=32){i=j;return}if((r|0)==32){if((g|0)<=0){i=j;return}q=h;F=g;d=0;while(1){E=dd[c[(c[f>>2]|0)+12>>2]&511](f,(c[p>>2]|0)+d|0)|0;if((q|0)>0){C=0;k=t+((ca(d,s)|0)+l)|0;D=E+(c[o>>2]<<2)|0;while(1){a[k>>0]=a[D+2>>0]|0;a[k+1>>0]=a[D+1>>0]|0;a[k+2>>0]=a[D>>0]|0;a[k+3>>0]=-1;C=C+1|0;G=c[m>>2]|0;if((C|0)>=(G|0)){break}else{k=k+4|0;D=D+4|0}}H=c[n>>2]|0;I=G}else{H=F;I=q}d=d+1|0;if((d|0)>=(H|0)){break}else{q=I;F=H}}i=j;return}else if((r|0)==24){if((g|0)<=0){i=j;return}r=h;h=g;g=0;while(1){H=dd[c[(c[f>>2]|0)+12>>2]&511](f,(c[p>>2]|0)+g|0)|0;if((r|0)>0){F=0;I=t+((ca(g,s)|0)+l)|0;q=H+((c[o>>2]|0)*3|0)|0;while(1){a[I>>0]=a[q+2>>0]|0;a[I+1>>0]=a[q+1>>0]|0;a[I+2>>0]=a[q>>0]|0;a[I+3>>0]=-1;F=F+1|0;J=c[m>>2]|0;if((F|0)>=(J|0)){break}else{I=I+4|0;q=q+3|0}}K=c[n>>2]|0;L=J}else{K=h;L=r}g=g+1|0;if((g|0)>=(K|0)){break}else{r=L;h=K}}i=j;return}else{i=j;return}}function zxa(a,b){a=a|0;b=b|0;var c=0,e=0,f=0,g=0;c=i;i=i+16|0;e=c+2|0;f=c+1|0;g=c;dX(a>>>24&255,a>>>16&255,a>>>8&255,a&255,e,f,g);i=c;return(d[e>>0]|0)<<16|(b&255)<<24|(d[f>>0]|0)<<8|(d[g>>0]|0)|0}function Axa(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;h=i;i=i+16|0;j=h;c[j>>2]=e;k=(f&65280|0)!=0;l=k?f:e>>>24;do{if((g|0)==0){if((c[a+20>>2]&4|0)==0){if(!k){m=e;break}f=zxa(e,l&255)|0;c[j>>2]=f;m=f;break}else{if(k){m=e;break}else{n=0}i=h;return n|0}}else{f=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;if(k){o=e3a(e|0)|0}else{o=e}c[j>>2]=o;Fc[c[(c[f>>2]|0)+36>>2]&63](f,g,j,j,1);f=c[j>>2]|0;if(k){p=e3a(f|0)|0}else{p=f}c[j>>2]=p;if((c[a+20>>2]&4|0)==0){f=p&16777215|l<<24;c[j>>2]=f;m=f}else{m=p}}}while(0);bDa(a,b,d,m);m=c[a+4>>2]|0;if((m|0)==0){n=1;i=h;return n|0}bDa(m,b,d,l<<24);n=1;i=h;return n|0}function Bxa(a,b,e,f,g,h){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;j=i;i=i+16|0;k=j;l=a+4|0;m=c[l>>2]|0;if((Lc[c[(c[m>>2]|0)+8>>2]&255](m)|0)==0){n=1;i=j;return n|0}if((c[(BGa()|0)+268>>2]|0)!=0?(c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0)!=0:0){o=h}else{o=0}h=c[a+8>>2]|0;if((h|0)==0){m=c[l>>2]|0;if((c[a+48>>2]|0)==0){n=Axa(m,b,e,f,g,o)|0;i=j;return n|0}else{vxa(m,b,e,f);n=1;i=j;return n|0}}if((JQ(h+4|0,b,e)|0)==0){n=1;i=j;return n|0}m=c[h>>2]|0;if((m|0)==0){p=c[l>>2]|0;if((c[a+48>>2]|0)==0){n=Axa(p,b,e,f,g,o)|0;i=j;return n|0}else{vxa(p,b,e,f);n=1;i=j;return n|0}}else if((m|0)==1){Jya(k,c[h+20>>2]|0);h=c[k>>2]|0;Fya(k);k=(g&65280|0)!=0;m=((ca(d[(dd[c[(c[h>>2]|0)+12>>2]&511](h,e)|0)+b>>0]|0,(k?g:f>>>24)&255)|0)>>>0)/255|0;if((c[a+48>>2]|0)!=0){vxa(c[l>>2]|0,b,e,m<<24|f&16777215);n=1;i=j;return n|0}if(k){q=f;r=m|g&-256}else{q=m<<24|f&16777215;r=g}n=Axa(c[l>>2]|0,b,e,q,r,o)|0;i=j;return n|0}else{n=1;i=j;return n|0}return 0}function Cxa(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=i;i=i+48|0;j=h+24|0;k=h+8|0;l=h;if((g|0)!=0){m=0;i=h;return m|0}g=a+4|0;n=c[g>>2]|0;if((Lc[c[(c[n>>2]|0)+8>>2]&255](n)|0)==0){m=1;i=h;return m|0}dd[c[(c[a>>2]|0)+68>>2]&511](a,j)|0;c[k+0>>2]=c[j+0>>2];c[k+4>>2]=c[j+4>>2];c[k+8>>2]=c[j+8>>2];c[k+12>>2]=c[j+12>>2];if((b|0)!=0){Ela(k,b)}b=c[k+8>>2]|0;n=c[k>>2]|0;if((b|0)<=(n|0)){m=1;i=h;return m|0}o=c[k+12>>2]|0;p=c[k+4>>2]|0;if((o|0)<=(p|0)){m=1;i=h;return m|0}k=c[a+8>>2]|0;if((k|0)!=0?(c[k>>2]|0)!=0:0){q=c[g>>2]|0;Jya(l,c[k+20>>2]|0);FBa(q,n,p,b-n|0,o-p|0,c[l>>2]|0,d,n-(c[j>>2]|0)|0,p-(c[j+4>>2]|0)|0,0,0,c[a+48>>2]|0,e,f)|0;Fya(l);m=1;i=h;return m|0}l=c[g>>2]|0;g=b-n|0;b=o-p|0;if((c[a+48>>2]|0)==0){GBa(l,n,p,g,b,d,e,f)|0;m=1;i=h;return m|0}else{wxa(l,n,p,g,b,d);m=1;i=h;return m|0}return 0}function Dxa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[a+8>>2]|0;if((e|0)==0){c[b+4>>2]=0;c[b>>2]=0;c[b+8>>2]=dd[c[(c[a>>2]|0)+16>>2]&511](a,2)|0;c[b+12>>2]=dd[c[(c[a>>2]|0)+16>>2]&511](a,3)|0;i=d;return 1}else{a=e+4|0;c[b+0>>2]=c[a+0>>2];c[b+4>>2]=c[a+4>>2];c[b+8>>2]=c[a+8>>2];c[b+12>>2]=c[a+12>>2];i=d;return 1}return 0}function Exa(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;h=i;i=i+16|0;j=h;k=a+4|0;l=c[k>>2]|0;if((Lc[c[(c[l>>2]|0)+8>>2]&255](l)|0)==0){m=1;i=h;return m|0}if((g|0)!=0){g=c[b+8>>2]|0;l=c[b+12>>2]|0;n=c[k>>2]|0;if((c[a+48>>2]|0)==0){m=YCa(b,0,0,g,l,n,d,e,f)|0;i=h;return m|0}else{yxa(b,g,l,n,d,e);m=1;i=h;return m|0}}n=(c[b+8>>2]|0)+d|0;l=(c[b+12>>2]|0)+e|0;c[j>>2]=d;g=j+4|0;c[g>>2]=e;o=j+8|0;c[o>>2]=n;n=j+12|0;c[n>>2]=l;l=c[a+52>>2]|0;do{if((l|0)==0){p=RCa(c[k>>2]|0,j)|0;if((p|0)==0){m=1;i=h;return m|0}else{q=p}}else{p=RCa(l,j)|0;if((p|0)==0){m=1;i=h;return m|0}else{EBa(p,0,0,c[p+8>>2]|0,c[p+12>>2]|0,c[k>>2]|0,0,0,0,0,0,0)|0;q=p;break}}}while(0);k=(d|0)<0?d:0;d=(e|0)<0?e:0;e=(c[o>>2]|0)-(c[j>>2]|0)|0;j=(c[n>>2]|0)-(c[g>>2]|0)|0;if((c[a+48>>2]|0)==0){r=YCa(b,0,0,e,j,q,k,d,f)|0}else{yxa(b,e,j,q,k,d);r=1}Rc[c[(c[q>>2]|0)+4>>2]&1023](q);m=r;i=h;return m|0}function Fxa(a,b,d,e,f,g,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;l=i;m=a+4|0;n=c[m>>2]|0;if((Lc[c[(c[n>>2]|0)+8>>2]&255](n)|0)==0){o=1;i=l;return o|0}n=c[m>>2]|0;m=c[e>>2]|0;p=(c[e+8>>2]|0)-m|0;q=c[e+4>>2]|0;r=(c[e+12>>2]|0)-q|0;e=c[a+8>>2]|0;s=c[a+48>>2]|0;if((c[b+20>>2]|0)==1){o=FBa(n,f,g,p,r,b,d,m,q,h,e,s,j,k)|0;i=l;return o|0}else{o=EBa(n,f,g,p,r,b,m,q,h,e,s,k)|0;i=l;return o|0}return 0}function Gxa(a,b,d,e,f,g,h,j,k,l,m,n){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;o=i;i=i+272|0;p=o+248|0;q=o+232|0;r=o+216|0;s=o+72|0;t=o;u=a+4|0;v=c[u>>2]|0;if((Lc[c[(c[v>>2]|0)+8>>2]&255](v)|0)==0){w=1;i=o;return w|0}if((c[b+8>>2]|0)==(g|0)?(c[b+12>>2]|0)==(h|0):0){c[p>>2]=0;c[p+4>>2]=0;c[p+8>>2]=g;c[p+12>>2]=h;w=Hc[c[(c[a>>2]|0)+80>>2]&7](a,b,d,p,e,f,n,l,m)|0;i=o;return w|0}c[q>>2]=e;p=q+4|0;c[p>>2]=f;c[q+8>>2]=g+e;c[q+12>>2]=h+f;Dla(q);c[r+0>>2]=c[q+0>>2];c[r+4>>2]=c[q+4>>2];c[r+8>>2]=c[q+8>>2];c[r+12>>2]=c[q+12>>2];Ela(r,j);HBa(s);JBa(s,c[u>>2]|0,c[a+8>>2]|0,255,d,r,0,0,0,c[a+48>>2]|0,l,m,n);n=c[q>>2]|0;q=c[p>>2]|0;c[r>>2]=(c[r>>2]|0)-n;p=r+8|0;c[p>>2]=(c[p>>2]|0)-n;n=r+4|0;c[n>>2]=(c[n>>2]|0)-q;n=r+12|0;c[n>>2]=(c[n>>2]|0)-q;sCa(t);if((vCa(t,s,b,g,h,r,k)|0)!=0){yCa(t,0)|0}tCa(t);IBa(s);w=1;i=o;return w|0}function Hxa(a,b,d,e,f,g,h,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0;l=i;m=a+4|0;n=c[m>>2]|0;if((Lc[c[(c[n>>2]|0)+8>>2]&255](n)|0)==0){o=1;i=l;return o|0}n=u2a(308)|0;kDa(n);if((n|0)==0){o=0;i=l;return o|0}mDa(n,c[m>>2]|0,c[a+8>>2]|0,b,d,e,f,g,c[a+48>>2]|0,j,k);c[h>>2]=n;o=1;i=l;return o|0}function Ixa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=c[a+4>>2]|0;if((Lc[c[(c[f>>2]|0)+8>>2]&255](f)|0)==0){g=1;i=e;return g|0}g=nDa(b,d)|0;i=e;return g|0}function Jxa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[a+4>>2]|0;if((Lc[c[(c[e>>2]|0)+8>>2]&255](e)|0)==0|(b|0)==0){i=d;return}lDa(b);v2a(b);i=d;return}function Kxa(a){a=a|0;var b=0;b=i;GGa(a);c[a>>2]=758832;c[a+48>>2]=0;i=b;return}function Lxa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;if((b|0)==0){i=f;return}c[a+4>>2]=b;g=u2a(60)|0;cxa(g,b,0,0,d,e);if((g|0)==0){i=f;return}JGa(a,g);i=f;return}function Mxa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;c[a+48>>2]=1;h=u2a(40)|0;ICa(h);if((h|0)==0){j=0;i=g;return j|0}if((JCa(h,b,d,e,0)|0)==0){Rc[c[(c[h>>2]|0)+4>>2]&1023](h);j=0;i=g;return j|0}c[a+4>>2]=h;e=u2a(60)|0;cxa(e,h,0,0,f,0);if((e|0)==0){j=0;i=g;return j|0}JGa(a,e);j=1;i=g;return j|0}function Nxa(a){a=a|0;var b=0;b=i;Oxa(a);v2a(a);i=b;return}function Oxa(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=758832;if((c[a+48>>2]|0)!=0?(d=c[a+4>>2]|0,(d|0)!=0):0){Rc[c[(c[d>>2]|0)+4>>2]&1023](d)}IGa(a);i=b;return}function Pxa(a){a=a|0;return}function Qxa(a){a=a|0;return}function Rxa(a,b){a=a|0;b=b|0;g[a+12>>2]=1.0;g[a>>2]=1.0;g[a+20>>2]=0.0;g[a+16>>2]=0.0;g[a+8>>2]=0.0;g[a+4>>2]=0.0;return}function Sxa(a){a=a|0;return 0}function Txa(a){a=a|0;return 1}function Uxa(a){a=a|0;return}function Vxa(a,b,c,d,e,f,g,h,i){a=a|0;b=+b;c=+c;d=+d;e=+e;f=f|0;g=g|0;h=h|0;i=i|0;return 0}function Wxa(a){a=a|0;return c[a+52>>2]|0}function Xxa(a){a=a|0;return 0}function Yxa(a){a=a|0;return 1}function Zxa(a){a=a|0;return}function _xa(a){a=a|0;var b=0,d=0;b=i;d=c[a+4>>2]|0;a=Lc[c[(c[d>>2]|0)+8>>2]&255](d)|0;i=b;return a|0}function $xa(a){a=a|0;return}function aya(a){a=a|0;return}function bya(a){a=a|0;var b=0,d=0;b=i;jya(a);qza(a+4|0);if((c[a+16>>2]|0)==0){d=0;i=b;return d|0}c[a+152>>2]=c[a+80>>2];d=1;i=b;return d|0}function cya(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;f=d-b+2|0;d=a+4|0;g=a+20|0;h=c[g>>2]|0;if(f>>>0>(c[d>>2]|0)>>>0){v2a(h);j=a+16|0;v2a(c[j>>2]|0);c[j>>2]=w2a(f,1)|0;j=w2a(f,8)|0;c[g>>2]=j;c[d>>2]=f;k=j}else{k=h}c[a+8>>2]=2147483632;c[a>>2]=b;c[a+24>>2]=k;i=e;return}function dya(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0;e=i;f=a+152|0;g=a+88|0;if((c[f>>2]|0)>(c[g>>2]|0)){h=0;i=e;return h|0}j=b+8|0;k=b+20|0;l=b+24|0;m=a+80|0;n=a+48|0;o=a+36|0;p=a+96|0;while(1){c[j>>2]=2147483632;c[l>>2]=c[k>>2];a=c[f>>2]|0;q=a-(c[m>>2]|0)|0;r=c[n>>2]|0;s=c[r+(q<<3)+4>>2]|0;if((s|0)!=0){t=(c[o>>2]|0)+(c[r+(q<<3)>>2]<<2)|0;q=0;r=s;while(1){s=c[t>>2]|0;u=c[s>>2]|0;v=c[s+12>>2]|0;w=(c[s+8>>2]|0)+q|0;x=r+ -1|0;a:do{if((x|0)==0){y=0;z=0;A=v;B=t;C=w;D=s}else{E=x;F=v;G=t;H=w;while(1){I=G+4|0;J=c[I>>2]|0;if((c[J>>2]|0)!=(u|0)){y=E;z=1;A=F;B=I;C=H;D=J;break a}K=(c[J+12>>2]|0)+F|0;L=(c[J+8>>2]|0)+H|0;E=E+ -1|0;if((E|0)==0){y=0;z=0;A=K;B=I;C=L;D=J;break}else{F=K;G=I;H=L}}}}while(0);if((A|0)==0){M=u}else{w=gya(c[p>>2]|0,(C<<9)-A|0,d)|0;if((w|0)!=0){hya(b,u,w)}M=u+1|0}if(!z){break}w=c[D>>2]|0;if((w|0)>(M|0)?(v=gya(c[p>>2]|0,C<<9,d)|0,(v|0)!=0):0){iya(b,M,w-M|0,v)}if((y|0)==0){break}else{t=B;q=C;r=y}}N=c[f>>2]|0;if((c[l>>2]|0)==(c[k>>2]|0)){O=N}else{break}}else{O=a}c[f>>2]=O+1;if((O|0)>=(c[g>>2]|0)){h=0;P=20;break}}if((P|0)==20){i=e;return h|0}c[b+12>>2]=N;c[f>>2]=(c[f>>2]|0)+1;h=1;i=e;return h|0}function eya(a,e){a=a|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;f=i;g=a+32|0;if((c[g>>2]|0)==0?(h=a+64|0,j=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24,k=h+4|0,h=d[k>>0]|d[k+1>>0]<<8|d[k+2>>0]<<16|d[k+3>>0]<<24,(j|0)==0&((h&1|j|0)==0|(h|0)==0)):0){i=f;return}h=c[e+12>>2]|0;j=a+40|0;if((h|0)<(c[j>>2]|0)){i=f;return}if((h|0)>=(c[a+48>>2]|0)){i=f;return}k=a+56|0;l=c[k>>2]|0;m=Lc[c[(c[l>>2]|0)+8>>2]&255](l)|0;l=c[k>>2]|0;n=ca(c[l+24>>2]|0,h)|0;o=c[l+4>>2]|0;if((o|0)==0){p=0}else{l=Lc[c[(c[o>>2]|0)+8>>2]&255](o)|0;p=l+(ca(c[o+24>>2]|0,h)|0)|0}o=c[g>>2]|0;if((o|0)==0){q=0}else{l=Lc[c[(c[o>>2]|0)+8>>2]&255](o)|0;q=l+(ca(c[(c[g>>2]|0)+24>>2]|0,h)|0)|0}g=c[k>>2]|0;k=c[g+16>>2]|0;l=(k|0)/8|0;o=c[g+20>>2]|0;g=(o|0)==1|o>>>1&1;o=c[e+20>>2]|0;r=(k+7|0)>>>0>14;k=(q|0)==0;s=(p|0)==0;t=a+52|0;u=a+64|0;v=a+36|0;w=a+44|0;x=o;y=(c[e+24>>2]|0)-o>>3;do{o=x;x=x+8|0;e=b[x>>1]|0;if(r){z=ca(e,l)|0;if(k){A=0}else{A=q+z|0}if(s){B=z;C=0;D=A}else{B=z;C=p+e|0;D=A}}else{z=(e|0)/8|0;if(k){B=z;C=0;D=0}else{B=z;C=0;D=q+z|0}}z=m+(B+n)|0;E=c[t>>2]|0;if((E|0)==0){F=0}else{G=Lc[c[(c[E>>2]|0)+8>>2]&255](E)|0;E=(ca(c[(c[t>>2]|0)+24>>2]|0,h-(c[j>>2]|0)|0)|0)+e|0;F=G+(E-(c[v>>2]|0))|0}if((D|0)==0){E=d[u>>0]|d[u+1>>0]<<8|d[u+2>>0]<<16|d[u+3>>0]<<24;G=u+4|0;H=d[G>>0]|d[G+1>>0]<<8|d[G+2>>0]<<16|d[G+3>>0]<<24;G=a+(H>>1)|0;if((H&1|0)==0){I=E}else{I=c[(c[G>>2]|0)+E>>2]|0}cd[I&7](G,z,l,e,b[o+10>>1]|0,c[o+12>>2]|0,c[v>>2]|0,c[w>>2]|0,F,C)}else{fya(a,z,D,l,g,e,b[o+10>>1]|0,c[o+12>>2]|0,c[v>>2]|0,c[w>>2]|0,F)}y=y+ -1|0}while((y|0)!=0);i=f;return}function fya(b,e,f,g,h,j,k,l,m,n,o){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;var p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;p=i;q=(j|0)<(m|0)?m-j|0:0;m=k+j|0;r=(m|0)<(n|0)?k:n-j|0;if((g|0)==0){s=(q|0)/8|0}else{s=ca(q,g)|0}k=e+s|0;t=f+s|0;f=(g|0)!=4|(h|0)==0;if((c[b+28>>2]|0)!=0){if(f){if(!((g+ -3|0)>>>0<2&(q|0)<(r|0))){i=p;return}h=(o|0)==0;u=b+4|0;v=b+8|0;w=b+12|0;x=~n;y=~m;z=~(((x|0)>(y|0)?x:y)+j);y=k;x=t;A=q;while(1){B=c[b>>2]|0;if(h){C=B}else{C=(ca(d[o+A>>0]|0,B)|0)/255|0}B=255-C|0;D=ca(d[x>>0]|0,B)|0;E=(D+(ca(c[u>>2]|0,C)|0)|0)/255|0;D=ca(d[x+1>>0]|0,B)|0;F=(D+(ca(c[v>>2]|0,C)|0)|0)/255|0;D=ca(d[x+2>>0]|0,B)|0;B=(D+(ca(c[w>>2]|0,C)|0)|0)/255|0;D=l+A|0;G=d[D>>0]|0;a[y>>0]=((ca(G^255,d[y>>0]|0)|0)+(ca(G,E)|0)|0)/255|0;E=y+1|0;G=d[D>>0]|0;a[E>>0]=((ca(G^255,d[E>>0]|0)|0)+(ca(G,F)|0)|0)/255|0;F=y+2|0;G=d[D>>0]|0;a[F>>0]=((ca(G^255,d[F>>0]|0)|0)+(ca(G,B)|0)|0)/255|0;A=A+1|0;if((A|0)==(z|0)){break}else{y=y+g|0;x=x+g|0}}i=p;return}if((q|0)>=(r|0)){i=p;return}x=(o|0)==0;y=b+24|0;z=b+4|0;A=b+8|0;C=b+12|0;w=~n;v=~m;u=~(((w|0)>(v|0)?w:v)+j);v=k;w=t;h=q;while(1){B=c[b>>2]|0;if(x){H=B}else{H=(ca(d[o+h>>0]|0,B)|0)/255|0}B=d[w+3>>0]|0;G=B+H+((ca(B,H)|0)/-255|0)|0;a[v+3>>0]=G;B=(H*255|0)/(G&255|0)|0;G=w+1|0;F=255-B|0;D=ca(d[w>>0]|0,F)|0;E=(D+(ca(c[z>>2]|0,B)|0)|0)/255|0;if((c[y>>2]|0)==0){D=ca(d[G>>0]|0,F)|0;I=(D+(ca(c[A>>2]|0,B)|0)|0)/255|0;D=ca(d[w+2>>0]|0,F)|0;J=(D+(ca(c[C>>2]|0,B)|0)|0)/255|0;D=l+h|0;K=d[D>>0]|0;a[v>>0]=((ca(K^255,d[v>>0]|0)|0)+(ca(K,E)|0)|0)/255|0;K=v+1|0;L=d[D>>0]|0;a[K>>0]=((ca(L^255,d[K>>0]|0)|0)+(ca(L,I)|0)|0)/255|0;I=v+2|0;L=d[D>>0]|0;a[I>>0]=((ca(L^255,d[I>>0]|0)|0)+(ca(L,J)|0)|0)/255|0}else{a[v>>0]=E;E=ca(d[G>>0]|0,F)|0;a[v+1>>0]=(E+(ca(c[A>>2]|0,B)|0)|0)/255|0;E=ca(d[w+2>>0]|0,F)|0;a[v+2>>0]=(E+(ca(c[C>>2]|0,B)|0)|0)/255|0}h=h+1|0;if((h|0)==(u|0)){break}else{v=v+4|0;w=w+4|0}}i=p;return}if(!f){if((q|0)>=(r|0)){i=p;return}f=(o|0)==0;w=b+12|0;v=b+8|0;u=b+4|0;h=~n;C=~m;A=~(((h|0)>(C|0)?h:C)+j);C=k;h=q;while(1){y=c[b>>2]|0;if(f){M=y}else{M=(ca(d[o+h>>0]|0,y)|0)/255|0}y=a[l+h>>0]|0;z=y&255;H=ca(z,M)|0;x=(H|0)/255|0;do{if(!((H+254|0)>>>0<509)){if(y<<24>>24==-1){a[C+3>>0]=x;a[C>>0]=c[w>>2];a[C+1>>0]=c[v>>2];a[C+2>>0]=c[u>>2];break}B=C+3|0;E=a[B>>0]|0;if(E<<24>>24==0){a[B>>0]=x;a[C>>0]=c[w>>2];a[C+1>>0]=c[v>>2];a[C+2>>0]=c[u>>2];break}else{F=z^255;a[B>>0]=((ca(E&255,F)|0)+H|0)/255|0;E=ca(d[C>>0]|0,F)|0;a[C>>0]=(E+(ca(c[w>>2]|0,z)|0)|0)/255|0;E=C+1|0;B=ca(d[E>>0]|0,F)|0;a[E>>0]=(B+(ca(c[v>>2]|0,z)|0)|0)/255|0;B=C+2|0;E=ca(d[B>>0]|0,F)|0;a[B>>0]=(E+(ca(c[u>>2]|0,z)|0)|0)/255|0;break}}}while(0);z=h+1|0;if((z|0)==(A|0)){break}C=C+4|0;h=z}i=p;return}if((g+ -3|0)>>>0<2){if((q|0)>=(r|0)){i=p;return}h=(o|0)==0;C=b+24|0;A=b+12|0;u=b+8|0;v=b+4|0;w=~n;M=~m;f=~(((w|0)>(M|0)?w:M)+j);M=t;w=k;z=q;while(1){H=c[b>>2]|0;if(h){N=H}else{N=(ca(d[o+z>>0]|0,H)|0)/255|0}H=M+1|0;x=255-N|0;y=ca(d[M>>0]|0,x)|0;E=(y+(ca(c[A>>2]|0,N)|0)|0)/255|0;if((c[C>>2]|0)==0){y=ca(d[H>>0]|0,x)|0;B=(y+(ca(c[u>>2]|0,N)|0)|0)/255|0;y=ca(d[M+2>>0]|0,x)|0;F=(y+(ca(c[v>>2]|0,N)|0)|0)/255|0;y=l+z|0;G=d[y>>0]|0;a[w>>0]=((ca(G^255,d[w>>0]|0)|0)+(ca(G,E)|0)|0)/255|0;G=w+1|0;J=d[y>>0]|0;a[G>>0]=((ca(J^255,d[G>>0]|0)|0)+(ca(J,B)|0)|0)/255|0;B=w+2|0;J=d[y>>0]|0;a[B>>0]=((ca(J^255,d[B>>0]|0)|0)+(ca(J,F)|0)|0)/255|0}else{a[w>>0]=E;E=ca(d[H>>0]|0,x)|0;a[w+1>>0]=(E+(ca(c[u>>2]|0,N)|0)|0)/255|0;E=ca(d[M+2>>0]|0,x)|0;a[w+2>>0]=(E+(ca(c[v>>2]|0,N)|0)|0)/255|0}z=z+1|0;if((z|0)==(f|0)){break}else{M=M+g|0;w=w+g|0}}i=p;return}if((g|0)==1){if((q|0)>=(r|0)){i=p;return}g=(o|0)==0;w=b+24|0;M=b+16|0;f=~n;z=~m;N=~(((f|0)>(z|0)?f:z)+j);z=t;t=k;f=q;while(1){v=c[b>>2]|0;if(g){O=v}else{O=(ca(d[o+f>>0]|0,v)|0)/255|0}v=ca(d[z>>0]|0,255-O|0)|0;u=(v+(ca(c[M>>2]|0,O)|0)|0)/255|0;if((c[w>>2]|0)==0){v=d[l+f>>0]|0;a[t>>0]=((ca(v^255,d[t>>0]|0)|0)+(ca(v,u)|0)|0)/255|0;P=t+1|0}else{a[t>>0]=u;P=t}f=f+1|0;if((f|0)==(N|0)){break}else{z=z+1|0;t=P}}i=p;return}P=c[(c[b+56>>2]|0)+28>>2]|0;t=c[b+20>>2]|0;if((P|0)==0){Q=(t&255|0)==255}else{Q=(c[P+4>>2]|0)==(t|0)}if((q|0)>=(r|0)){i=p;return}r=(o|0)==0;t=(j|0)%8|0;P=1-q|0;z=~n;n=~m;m=~(((z|0)>(n|0)?z:n)+j);n=q;q=k;while(1){k=ca(d[l+n>>0]|0,c[b>>2]|0)|0;if(r){R=k}else{R=(ca(d[o+n>>0]|0,k)|0)/255|0}do{if((R+254|0)>>>0>508){k=1<<7-((n+j|0)%8|0);if(Q){a[q>>0]=d[q>>0]|0|k;break}else{a[q>>0]=(d[q>>0]|0)&(k^255);break}}}while(0);k=n+1|0;if((k|0)==(m|0)){break}z=e+(((P+n+t|0)/8|0)+s)|0;n=k;q=z}i=p;return}function gya(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=b>>9;b=(d|0)<0?0-d|0:d;if((a|0)==1){a=b&511;e=a>>>0>256?512-a|0:a}else{e=b}if(c){f=(e|0)>127?255:0}else{f=e}return((f|0)>255?255:f)|0}function hya(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0;g=i;h=e-(c[d>>2]|0)|0;e=d+16|0;a[(c[e>>2]|0)+h>>0]=f;f=d+8|0;j=d+24|0;k=c[j>>2]|0;if((h|0)==((c[f>>2]|0)+1|0)){l=k+2|0;b[l>>1]=(b[l>>1]|0)+1<<16>>16;c[f>>2]=h;i=g;return}else{l=k+8|0;c[j>>2]=l;b[l>>1]=(c[d>>2]|0)+h;b[(c[j>>2]|0)+2>>1]=1;c[(c[j>>2]|0)+4>>2]=(c[e>>2]|0)+h;c[f>>2]=h;i=g;return}}function iya(a,d,f,g){a=a|0;d=d|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0;h=i;j=d-(c[a>>2]|0)|0;d=a+16|0;f3a((c[d>>2]|0)+j|0,g&255|0,f|0)|0;g=a+8|0;k=a+24|0;l=c[k>>2]|0;if((j|0)==((c[g>>2]|0)+1|0)){m=l+2|0;b[m>>1]=(e[m>>1]|0)+f;n=f+ -1|0;o=n+j|0;c[g>>2]=o;i=h;return}else{m=l+8|0;c[k>>2]=m;b[m>>1]=(c[a>>2]|0)+j;b[(c[k>>2]|0)+2>>1]=f;c[(c[k>>2]|0)+4>>2]=(c[d>>2]|0)+j;n=f+ -1|0;o=n+j|0;c[g>>2]=o;i=h;return}}function jya(b){b=b|0;var d=0;d=i;if((c[b+128>>2]|0)!=1){i=d;return}if((a[b+148>>0]|0)!=0){kya(b,c[b+108>>2]|0,c[b+112>>2]|0)}lya(b);i=d;return}function kya(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;i=i+32|0;f=e+16|0;g=e;h=a+132|0;j=mya(b,d,h)|0;k=a+124|0;do{if((c[k>>2]|0)==(j|0)){if((j|0)==0){if((c[a+128>>2]|0)==0){nya(a,b,d);break}else{oya(a,b,d);break}}}else{l=pya(c[a+116>>2]|0,c[a+120>>2]|0,b,d,h,f,g)|0;if((l|0)!=0){m=a+128|0;n=l;l=f;o=g;while(1){n=n+ -1|0;p=c[l>>2]|0;q=c[o>>2]|0;if((c[m>>2]|0)==0){nya(a,p,q)}else{oya(a,p,q)}if((n|0)==0){break}else{l=l+4|0;o=o+4|0}}}}}while(0);c[k>>2]=j;c[a+116>>2]=b;c[a+120>>2]=d;i=e;return}function lya(a){a=a|0;var b=0,d=0;b=i;d=a+128|0;if((c[d>>2]|0)!=1){i=b;return}pza(a+4|0,c[a+100>>2]|0,c[a+104>>2]|0);c[d>>2]=2;i=b;return}function mya(a,b,d){a=a|0;b=b|0;d=d|0;return((c[d+12>>2]|0)<(b|0)&1)<<1|(c[d+8>>2]|0)<(a|0)|((c[d>>2]|0)>(a|0)&1)<<2|((c[d+4>>2]|0)>(b|0)&1)<<3|0}function nya(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=a+128|0;if((c[f>>2]|0)==1){lya(a)}oza(a+4|0,b,d);c[a+100>>2]=b;c[a+104>>2]=d;c[f>>2]=1;i=e;return}function oya(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=a+128|0;if((c[f>>2]|0)==0){i=e;return}pza(a+4|0,b,d);c[f>>2]=1;i=e;return}function pya(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0.0,l=0.0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0,I=0,J=0;j=i;k=+(d-a|0);l=+(e-b|0);if(k==0.0){m=(c[f>>2]|0)<(a|0)?-1.0000000031710769e-30:1.0000000031710769e-30}else{m=k}if(m>0.0){n=f;o=f+8|0}else{n=f+8|0;o=f}k=+(c[o>>2]|0);p=+(c[n>>2]|0);q=+(a|0);r=(p-q)/m;if(l==0.0){s=(c[f+4>>2]|0)<(b|0)?-1.0000000031710769e-30:1.0000000031710769e-30}else{s=l}if(s>0.0){t=f+4|0;u=f+12|0}else{t=f+12|0;u=f+4|0}l=+(c[u>>2]|0);v=+(c[t>>2]|0);w=+(b|0);x=(v-w)/s;b=r<x;y=b?r:x;z=b?x:r;if(!(y<=1.0)){A=0;i=j;return A|0}if(y>0.0){c[g>>2]=~~p;c[h>>2]=~~v;B=g+4|0;C=h+4|0;D=1}else{B=g;C=h;D=0}if(!(z<=1.0)){A=D;i=j;return A|0}y=(k-q)/m;E=(l-w)/s;h=y<E;F=h?y:E;g=z>0.0;if(!(g|F>0.0)){A=D;i=j;return A|0}if(!(z<=F)){b=r>x;c[B>>2]=~~(b?p:k);c[C>>2]=~~(b?l:v);A=D+1|0;i=j;return A|0}if(g){if(r>x){c[B>>2]=~~p;G=w+r*s}else{c[B>>2]=~~(q+m*x);G=v}c[C>>2]=~~G;H=B+4|0;I=C+4|0;J=D+1|0}else{H=B;I=C;J=D}do{if(F<1.0){if(h){c[H>>2]=~~k;c[I>>2]=~~(w+s*y);break}else{c[H>>2]=~~(q+m*E);c[I>>2]=~~l;break}}else{c[H>>2]=d;c[I>>2]=e}}while(0);A=J+1|0;i=j;return A|0}function qya(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=a+20|0;g=c[f>>2]|0;if(!(g>>>0<(c[a>>2]|0)>>>0)){h=0;i=e;return h|0}c[f>>2]=g+1;h=uya(a,g,b,d)|0;i=e;return h|0}function rya(a,b,c,d){a=a|0;b=+b;c=+c;d=d|0;var e=0,f=0;e=i;if((d&-177|0)==79){jya(a);i=e;return}f=d&-129;if((f|0)==1){sya(a,~~(b*256.0),~~(c*256.0));i=e;return}if(!(f>>>0<15&(f|0)!=0)){i=e;return}tya(a,~~(b*256.0),~~(c*256.0));i=e;return}function sya(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;if((a[b+148>>0]|0)==0){nya(b,d,e);i=f;return}if((a[b+92>>0]|0)==0){g=b+128|0;if((c[g>>2]|0)==1){jya(b);h=g}else{h=g}}else{jza(b+4|0);g=b+128|0;c[g>>2]=0;h=g}c[b+108>>2]=d;c[b+116>>2]=d;c[b+112>>2]=e;c[b+120>>2]=e;c[h>>2]=0;h=mya(d,e,b+132|0)|0;c[b+124>>2]=h;if((h|0)!=0){i=f;return}nya(b,d,e);i=f;return}function tya(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;e=i;if((a[b+148>>0]|0)==0){oya(b,c,d);i=e;return}else{kya(b,c,d);i=e;return}}function uya(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var h=0,i=0,j=0;h=b>>>8;i=c[(c[a+12>>2]|0)+(h<<2)>>2]|0;j=b&255;b=j<<1;g[e>>2]=+g[i+(b<<2)>>2];g[f>>2]=+g[i+((b|1)<<2)>>2];return d[(c[(c[a+16>>2]|0)+(h<<2)>>2]|0)+j>>0]|0|0}function vya(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;h=i;j=d+8|0;k=d+12|0;l=d+4|0;m=f;n=g-f>>3;do{f=m;m=m+8|0;g=b[m>>1]|0;o=b[f+10>>1]|0;p=o<<16>>16;q=c[d>>2]|0;r=g-(c[j>>2]|0)|0;s=e-(c[k>>2]|0)|0;if(o<<16>>16>0){wya(q,r,s,p,l,c[f+12>>2]|0)}else{xya(q,r,s,g+ -1-p|0,l,a[c[f+12>>2]>>0]|0)}n=n+ -1|0}while((n|0)!=0);i=h;return}function wya(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0;h=i;if((c[a+16>>2]|0)<(d|0)){i=h;return}if((c[a+8>>2]|0)>(d|0)){i=h;return}j=c[a+4>>2]|0;do{if((j|0)>(b|0)){k=b-j+e|0;if((k|0)<1){i=h;return}else{l=g+(j-b)|0;m=j;n=k;break}}else{l=g;m=b;n=e}}while(0);e=c[a+12>>2]|0;if((m+n|0)>(e|0)){b=e-m|0;if((b|0)<0){i=h;return}else{o=b+1|0}}else{o=n}zya(c[a>>2]|0,m,d,o,f,l);i=h;return}function xya(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0;h=i;j=(b|0)>(e|0);k=j?b:e;l=j?e:b;if((c[a+16>>2]|0)<(d|0)){i=h;return}if((c[a+8>>2]|0)>(d|0)){i=h;return}b=c[a+12>>2]|0;if((l|0)>(b|0)){i=h;return}e=c[a+4>>2]|0;if((k|0)<(e|0)){i=h;return}j=(l|0)<(e|0)?e:l;yya(c[a>>2]|0,j,d,1-j+((k|0)>(b|0)?b:k)|0,f,g);i=h;return}function yya(b,e,f,g,h,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0;k=i;l=a[h+1>>0]|0;if(l<<24>>24==0){i=k;return}m=(c[(c[(c[b>>2]|0)+4>>2]|0)+(f<<2)>>2]|0)+e|0;e=(ca(l&255,(j&255)+1|0)|0)>>>8;if((e|0)==255){j=g;l=m;while(1){a[l>>0]=a[h>>0]|0;j=j+ -1|0;if((j|0)==0){break}else{l=l+1|0}}i=k;return}else{l=g;g=m;while(1){m=d[g>>0]|0;a[g>>0]=((ca((d[h>>0]|0)-m|0,e)|0)+(m<<8)|0)>>>8;l=l+ -1|0;if((l|0)==0){break}else{g=g+1|0}}i=k;return}}function zya(b,e,f,g,h,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0;k=i;l=h+1|0;m=a[l>>0]|0;if(m<<24>>24==0){i=k;return}n=g;g=j;j=m;m=(c[(c[(c[b>>2]|0)+4>>2]|0)+(f<<2)>>2]|0)+e|0;while(1){e=(ca((d[g>>0]|0)+1|0,j&255)|0)>>>8;f=a[h>>0]|0;if((e|0)==255){o=f}else{b=d[m>>0]|0;o=((ca((f&255)-b|0,e)|0)+(b<<8)|0)>>>8&255}a[m>>0]=o;b=n+ -1|0;if((b|0)==0){break}n=b;g=g+1|0;j=a[l>>0]|0;m=m+1|0}i=k;return}function Aya(a){a=a|0;var b=0;b=i;v2a(c[a+20>>2]|0);v2a(c[a+16>>2]|0);i=b;return}function Bya(a){a=a|0;var b=0;b=i;PCa(a);i=b;return}function Cya(a){a=a|0;var b=0;b=i;PCa(a);v2a(a);i=b;return}function Dya(a){a=a|0;return c[a+32>>2]|0}function Eya(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[a+32>>2]|0;if((e|0)==0){f=0;i=d;return f|0}f=e+(ca(c[a+24>>2]|0,b)|0)|0;i=d;return f|0}function Fya(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;if((d|0)==0){i=b;return}e=d+40|0;c[e>>2]=(c[e>>2]|0)+ -1;e=c[a>>2]|0;if((c[e+40>>2]|0)>0|(e|0)==0){i=b;return}Rc[c[(c[e>>2]|0)+4>>2]&1023](e);i=b;return}function Gya(b,d,e,f){b=b|0;d=+d;e=+e;f=f|0;var h=0,j=0;h=i;i=i+16|0;j=h;c[j>>2]=0;a[(Hya(b,j)|0)>>0]=f;f=c[j>>2]|0;g[f>>2]=d;g[f+4>>2]=e;c[b>>2]=(c[b>>2]|0)+1;i=h;return}function Hya(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=c[a>>2]|0;f=e>>>8;if(f>>>0<(c[a+4>>2]|0)>>>0){g=e}else{eza(a,f);g=c[a>>2]|0}c[b>>2]=(c[(c[a+12>>2]|0)+(f<<2)>>2]|0)+((g<<1&510)<<2);i=d;return(c[(c[a+16>>2]|0)+(f<<2)>>2]|0)+(c[a>>2]&255)|0}function Iya(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0;f=i;h=a+12|0;j=c[h>>2]|0;if(!(j>>>0<(c[a+16>>2]|0)>>>0)){k=0;i=f;return k|0}c[h>>2]=j+1;l=j&63;m=c[(c[a+28>>2]|0)+(j>>>6<<2)>>2]|0;g[b>>2]=+g[m+(l*12|0)>>2];g[d>>2]=+g[m+(l*12|0)+4>>2];c[e>>2]=c[m+(l*12|0)+8>>2];k=(c[h>>2]|0)==1?1:2;i=f;return k|0}function Jya(a,b){a=a|0;b=b|0;var d=0;d=i;c[a>>2]=b;if((b|0)==0){i=d;return}a=b+40|0;c[a>>2]=(c[a>>2]|0)+1;i=d;return}function Kya(b,e,f,g,h,j,k,l,m,n){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;f=i;o=(g|0)<(k|0)?k-g|0:0;k=h+g|0;p=e+o|0;e=(o|0)<(((k|0)<(l|0)?h:l-g|0)|0);if((n|0)==0){if(!e){i=f;return}h=(m|0)==0;q=b+16|0;r=~l;s=~k;t=~(((r|0)>(s|0)?r:s)+g);s=p;r=o;while(1){u=ca(d[j+r>>0]|0,c[b>>2]|0)|0;if(h){v=u}else{v=(ca(d[m+r>>0]|0,u)|0)/255|0}u=(v|0)/255|0;do{if((v+254|0)>>>0>508){if((v+ -65025|0)>>>0<255){a[s>>0]=c[q>>2];break}else{w=ca(d[s>>0]|0,255-u|0)|0;a[s>>0]=(w+(ca(c[q>>2]|0,u)|0)|0)/255|0;break}}}while(0);u=r+1|0;if((u|0)==(t|0)){break}s=s+1|0;r=u}i=f;return}if(!e){i=f;return}e=b+24|0;r=(m|0)!=0;s=b+16|0;t=~l;l=~k;k=~(((t|0)>(l|0)?t:l)+g);g=p;p=n;n=o;while(1){o=c[b>>2]|0;do{if((c[e>>2]|0)==0){l=ca(d[j+n>>0]|0,o)|0;if(r){x=(ca(d[m+n>>0]|0,l)|0)/65025|0;break}else{x=(l|0)/255|0;break}}else{if(r){x=(ca(d[m+n>>0]|0,o)|0)/255|0}else{x=o}}}while(0);if((x|0)==255){a[g>>0]=c[s>>2];a[p>>0]=c[b>>2]}else if((x|0)!=0){o=d[p>>0]|0;l=o+x+((ca(o,x)|0)/-255|0)|0;a[p>>0]=l;o=(x*255|0)/(l&255|0)|0;l=ca(d[g>>0]|0,255-o|0)|0;a[g>>0]=(l+(ca(c[s>>2]|0,o)|0)|0)/255|0}o=n+1|0;if((o|0)==(k|0)){break}g=g+1|0;p=p+1|0;n=o}i=f;return}function Lya(b,e,f,g,h,j,k,l,m,n){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;f=i;o=(g|0)<(k|0)?k-g|0:0;k=h+g|0;p=e+(o<<2)|0;e=(o|0)<(((k|0)<(l|0)?h:l-g|0)|0);if((n|0)==0){if(!e){i=f;return}h=(m|0)==0;q=b+20|0;r=b+4|0;s=b+8|0;t=b+12|0;u=b+16|0;v=~l;w=~k;x=~(((v|0)>(w|0)?v:w)+g);w=p;v=o;while(1){y=ca(d[j+v>>0]|0,c[b>>2]|0)|0;if(h){z=y}else{z=(ca(d[m+v>>0]|0,y)|0)/255|0}y=(z|0)/255|0;do{if((z+254|0)>>>0>508){if((z+ -65025|0)>>>0<255){c[w>>2]=c[q>>2];break}else{A=255-y|0;B=ca(d[w>>0]|0,A)|0;a[w>>0]=(B+(ca(c[r>>2]|0,y)|0)|0)/255|0;B=w+1|0;C=ca(d[B>>0]|0,A)|0;a[B>>0]=(C+(ca(c[s>>2]|0,y)|0)|0)/255|0;C=w+2|0;B=ca(d[C>>0]|0,A)|0;a[C>>0]=(B+(ca(c[t>>2]|0,y)|0)|0)/255|0;B=w+3|0;C=ca(d[B>>0]|0,A)|0;a[B>>0]=(C+(ca(c[u>>2]|0,y)|0)|0)/255|0;break}}}while(0);y=v+1|0;if((y|0)==(x|0)){break}w=w+4|0;v=y}i=f;return}if(!e){i=f;return}e=b+24|0;v=(m|0)!=0;w=b+4|0;x=b+8|0;u=b+12|0;t=b+16|0;s=b+20|0;r=~l;l=~k;k=~(((r|0)>(l|0)?r:l)+g);g=p;p=n;n=o;while(1){o=c[b>>2]|0;do{if((c[e>>2]|0)==0){l=ca(d[j+n>>0]|0,o)|0;if(v){D=(ca(d[m+n>>0]|0,l)|0)/65025|0;break}else{D=(l|0)/255|0;break}}else{if(v){D=(ca(d[m+n>>0]|0,o)|0)/255|0}else{D=o}}}while(0);if((D|0)==255){c[g>>2]=c[s>>2];a[p>>0]=c[b>>2]}else if((D|0)!=0){o=d[p>>0]|0;l=o+D+((ca(o,D)|0)/-255|0)|0;a[p>>0]=l;o=(D*255|0)/(l&255|0)|0;l=255-o|0;r=ca(d[g>>0]|0,l)|0;a[g>>0]=(r+(ca(c[w>>2]|0,o)|0)|0)/255|0;r=g+1|0;q=ca(d[r>>0]|0,l)|0;a[r>>0]=(q+(ca(c[x>>2]|0,o)|0)|0)/255|0;q=g+2|0;r=ca(d[q>>0]|0,l)|0;a[q>>0]=(r+(ca(c[u>>2]|0,o)|0)|0)/255|0;r=g+3|0;q=ca(d[r>>0]|0,l)|0;a[r>>0]=(q+(ca(c[t>>2]|0,o)|0)|0)/255|0}o=n+1|0;if((o|0)==(k|0)){break}g=g+4|0;p=p+1|0;n=o}i=f;return}function Mya(b,e,f,g,h,j,k,l,m,n){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;n=i;o=(g|0)<(k|0)?k-g|0:0;k=h+g|0;p=e+(ca(o,f)|0)|0;e=(o|0)<(((k|0)<(l|0)?h:l-g|0)|0);if((c[b+28>>2]|0)!=0){if(!e){i=n;return}h=b+24|0;q=(m|0)!=0;r=b+4|0;s=b+8|0;t=b+12|0;u=b+20|0;v=~l;w=~k;x=~(((v|0)>(w|0)?v:w)+g);w=p;v=o;while(1){y=c[b>>2]|0;do{if((c[h>>2]|0)==0){z=ca(d[j+v>>0]|0,y)|0;if(q){A=(ca(d[m+v>>0]|0,z)|0)/65025|0;break}else{A=(z|0)/255|0;break}}else{if(q){A=(ca(d[m+v>>0]|0,y)|0)/255|0}else{A=y}}}while(0);if((A|0)==255){c[w>>2]=c[u>>2]}else if((A|0)!=0){y=w+3|0;z=d[y>>0]|0;B=z+A+((ca(z,A)|0)/-255|0)|0;a[y>>0]=B;y=(A*255|0)/(B&255|0)|0;B=255-y|0;z=ca(d[w>>0]|0,B)|0;a[w>>0]=(z+(ca(c[r>>2]|0,y)|0)|0)/255|0;z=w+1|0;C=ca(d[z>>0]|0,B)|0;a[z>>0]=(C+(ca(c[s>>2]|0,y)|0)|0)/255|0;C=w+2|0;z=ca(d[C>>0]|0,B)|0;a[C>>0]=(z+(ca(c[t>>2]|0,y)|0)|0)/255|0}y=v+1|0;if((y|0)==(x|0)){break}w=w+4|0;v=y}i=n;return}if(!e){i=n;return}e=b+24|0;v=(m|0)!=0;w=b+12|0;x=b+8|0;t=b+4|0;s=b+20|0;r=~l;l=~k;k=~(((r|0)>(l|0)?r:l)+g);g=p;p=o;while(1){o=c[b>>2]|0;do{if((c[e>>2]|0)==0){l=ca(d[j+p>>0]|0,o)|0;if(v){D=(ca(d[m+p>>0]|0,l)|0)/65025|0;break}else{D=(l|0)/255|0;break}}else{if(v){D=(ca(d[m+p>>0]|0,o)|0)/255|0}else{D=o}}}while(0);do{if((D|0)==0){E=28}else if((D|0)!=255){o=g+3|0;l=a[o>>0]|0;r=l&255;if(l<<24>>24==0){a[o>>0]=D;a[g>>0]=c[w>>2];a[g+1>>0]=c[x>>2];a[g+2>>0]=c[t>>2];F=g+4|0;break}else{l=r+D+((ca(r,D)|0)/-255|0)|0;a[o>>0]=l;o=(D*255|0)/(l&255|0)|0;l=255-o|0;r=ca(d[g>>0]|0,l)|0;a[g>>0]=(r+(ca(c[w>>2]|0,o)|0)|0)/255|0;r=g+1|0;A=ca(d[r>>0]|0,l)|0;a[r>>0]=(A+(ca(c[x>>2]|0,o)|0)|0)/255|0;A=g+2|0;r=ca(d[A>>0]|0,l)|0;a[A>>0]=(r+(ca(c[t>>2]|0,o)|0)|0)/255|0;F=g+4|0;break}}else{c[g>>2]=c[s>>2];E=28}}while(0);if((E|0)==28){E=0;F=g+f|0}p=p+1|0;if((p|0)==(k|0)){break}else{g=F}}i=n;return}function Nya(b,e,f,g,h,j,k,l,m,n){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;o=i;p=(g|0)<(k|0)?k-g|0:0;k=h+g|0;q=(k|0)<(l|0)?h:l-g|0;h=e+(ca(p,f)|0)|0;if((c[b+28>>2]|0)!=0){if((p|0)>=(q|0)){i=o;return}e=(m|0)==0;r=b+20|0;s=b+4|0;t=b+8|0;u=b+12|0;v=~l;w=~k;x=~(((v|0)>(w|0)?v:w)+g);w=h;v=p;while(1){y=ca(d[j+v>>0]|0,c[b>>2]|0)|0;if(e){z=y}else{z=(ca(d[m+v>>0]|0,y)|0)/255|0}y=(z|0)/255|0;do{if((z+254|0)>>>0>508){if(!((z+ -65025|0)>>>0<255)){A=255-y|0;B=ca(d[w>>0]|0,A)|0;a[w>>0]=(B+(ca(c[s>>2]|0,y)|0)|0)/255|0;B=w+1|0;C=ca(d[B>>0]|0,A)|0;a[B>>0]=(C+(ca(c[t>>2]|0,y)|0)|0)/255|0;C=w+2|0;B=ca(d[C>>0]|0,A)|0;a[C>>0]=(B+(ca(c[u>>2]|0,y)|0)|0)/255|0;D=w+f|0;break}if((f|0)==3){a[w>>0]=c[s>>2];a[w+1>>0]=c[t>>2];a[w+2>>0]=c[u>>2];D=w+3|0;break}else if((f|0)==4){c[w>>2]=c[r>>2];E=12;break}else{E=12;break}}else{E=12}}while(0);if((E|0)==12){E=0;D=w+f|0}v=v+1|0;if((v|0)==(x|0)){break}else{w=D}}i=o;return}D=(f|0)==3;w=(p|0)<(q|0);if(!((n|0)==0|D^1)){if(!w){i=o;return}q=b+24|0;x=(m|0)!=0;v=b+12|0;r=b+8|0;u=b+4|0;t=~l;s=~k;z=~(((t|0)>(s|0)?t:s)+g);s=n;n=h;t=p;while(1){e=c[b>>2]|0;do{if((c[q>>2]|0)==0){y=ca(d[j+t>>0]|0,e)|0;if(x){F=(ca(d[m+t>>0]|0,y)|0)/65025|0;break}else{F=(y|0)/255|0;break}}else{if(x){F=(ca(d[m+t>>0]|0,e)|0)/255|0}else{F=e}}}while(0);if((F|0)==0){G=n+f|0}else if((F|0)==255){a[n>>0]=c[v>>2];a[n+1>>0]=c[r>>2];a[n+2>>0]=c[u>>2];a[s>>0]=c[b>>2];G=n+3|0}else{e=d[s>>0]|0;y=e+F+((ca(e,F)|0)/-255|0)|0;a[s>>0]=y;e=(F*255|0)/(y&255|0)|0;y=255-e|0;B=ca(d[n>>0]|0,y)|0;a[n>>0]=(B+(ca(c[v>>2]|0,e)|0)|0)/255|0;B=n+1|0;C=ca(d[B>>0]|0,y)|0;a[B>>0]=(C+(ca(c[r>>2]|0,e)|0)|0)/255|0;C=n+2|0;B=ca(d[C>>0]|0,y)|0;a[C>>0]=(B+(ca(c[u>>2]|0,e)|0)|0)/255|0;G=n+3|0}e=t+1|0;if((e|0)==(z|0)){break}s=s+1|0;n=G;t=e}i=o;return}if(!w){i=o;return}w=b+24|0;t=(m|0)!=0;G=b+12|0;n=b+8|0;s=b+4|0;z=(f|0)==4;u=b+20|0;r=~l;l=~k;k=~(((r|0)>(l|0)?r:l)+g);g=h;h=p;while(1){p=c[b>>2]|0;do{if((c[w>>2]|0)==0){l=ca(d[j+h>>0]|0,p)|0;if(t){H=(ca(d[m+h>>0]|0,l)|0)/65025|0;break}else{H=(l|0)/255|0;break}}else{if(t){H=(ca(d[m+h>>0]|0,p)|0)/255|0}else{H=p}}}while(0);do{if((H|0)==255){if(z){c[g>>2]=c[u>>2];E=43;break}if(D){a[g>>0]=c[G>>2];a[g+1>>0]=c[n>>2];a[g+2>>0]=c[s>>2];I=g+3|0}else{E=43}}else if((H|0)==0){E=43}else{p=255-H|0;l=ca(d[g>>0]|0,p)|0;a[g>>0]=(l+(ca(c[G>>2]|0,H)|0)|0)/255|0;l=g+1|0;r=ca(d[l>>0]|0,p)|0;a[l>>0]=(r+(ca(c[n>>2]|0,H)|0)|0)/255|0;r=g+2|0;l=ca(d[r>>0]|0,p)|0;a[r>>0]=(l+(ca(c[s>>2]|0,H)|0)|0)/255|0;I=g+f|0}}while(0);if((E|0)==43){E=0;I=g+f|0}h=h+1|0;if((h|0)==(k|0)){break}else{g=I}}i=o;return}function Oya(b,e,f,g,h,j,k,l,m,n){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0;n=i;f=(g|0)<(k|0)?k-g|0:0;k=h+g|0;o=(f|0)/8|0;p=c[(c[b+56>>2]|0)+28>>2]|0;q=c[b+20>>2]|0;if((p|0)==0){r=(q&255|0)==255}else{r=(c[p+4>>2]|0)==(q|0)}if((f|0)>=(((k|0)<(l|0)?h:l-g|0)|0)){i=n;return}h=(m|0)==0;q=(g|0)%8|0;p=1-f|0;s=~l;l=~k;k=~(((s|0)>(l|0)?s:l)+g);l=o;s=f;while(1){f=e+l|0;t=ca(d[j+s>>0]|0,c[b>>2]|0)|0;if(h){u=t}else{u=(ca(d[m+s>>0]|0,t)|0)/255|0}do{if((u+254|0)>>>0>508){t=1<<7-((s+g|0)%8|0);if(r){a[f>>0]=d[f>>0]|0|t;break}else{a[f>>0]=(d[f>>0]|0)&(t^255);break}}}while(0);f=s+1|0;if((f|0)==(k|0)){break}l=((p+s+q|0)/8|0)+o|0;s=f}i=n;return}function Pya(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,h=0,j=0,k=0;d=i;i=i+16|0;e=d+4|0;f=d;Zya(b);h=_ya(b,e,f)|0;if((h&-129|0)==0){i=d;return}j=(c|0)==0;k=h;do{if(!j){fma(c,e,f)}rya(a,+g[e>>2],+g[f>>2],k);k=_ya(b,e,f)|0}while((k&-129|0)!=0);i=d;return}function Qya(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,h=0,j=0,k=0;d=i;i=i+16|0;e=d+4|0;f=d;Vya(b);h=Wya(b,e,f)|0;if((h&-129|0)==0){i=d;return}j=(c|0)==0;k=h;do{if(!j){fma(c,e,f)}rya(a,+g[e>>2],+g[f>>2],k);k=Wya(b,e,f)|0}while((k&-129|0)!=0);i=d;return}function Rya(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+4|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}f=a+12|0;a=c[f>>2]|0;g=e+ -1|0;c[d>>2]=g;e=a+(g<<2)|0;while(1){v2a(c[e>>2]|0);g=c[d>>2]|0;c[d>>2]=g+ -1;if((g|0)==0){break}else{e=e+ -4|0}}v2a(c[f>>2]|0);i=b;return}function Sya(a){a=a|0;var b=0;b=i;Uya(a+24|0);Tya(a+4|0);i=b;return}function Tya(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+4|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}f=a+12|0;a=c[f>>2]|0;g=e+ -1|0;c[d>>2]=g;e=a+(g<<2)|0;while(1){v2a(c[e>>2]|0);g=c[d>>2]|0;c[d>>2]=g+ -1;if((g|0)==0){break}else{e=e+ -4|0}}v2a(c[f>>2]|0);i=b;return}function Uya(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+4|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}f=a+12|0;a=c[f>>2]|0;g=e+ -1|0;c[d>>2]=g;e=a+(g<<2)|0;while(1){v2a(c[e>>2]|0);g=c[d>>2]|0;c[d>>2]=g+ -1;if((g|0)==0){break}else{e=e+ -4|0}}v2a(c[f>>2]|0);i=b;return}function Vya(a){a=a|0;var b=0;b=i;Yya(c[a>>2]|0);c[a+100>>2]=0;i=b;return}function Wya(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0;e=i;f=a+100|0;h=a+108|0;j=a+112|0;k=a+104|0;l=a+4|0;m=0;n=0;while(1){if(n){o=m;p=20;break}q=c[f>>2]|0;while(1){if((q|0)==1){p=6;break}else if((q|0)==0){p=5;break}else if((q|0)==2){break}}if((p|0)==5){p=0;q=Xya(c[a>>2]|0,h,j)|0;c[k>>2]=q;c[f>>2]=1;r=q;p=7}else if((p|0)==6){p=0;r=c[k>>2]|0;p=7}if((p|0)==7){p=0;if((r&-129|0)==0){o=0;p=20;break}Mza(l);Nza(l,+g[h>>2],+g[j>>2],1);while(1){s=Xya(c[a>>2]|0,b,d)|0;q=s&-129;if(!(q>>>0<15&(q|0)!=0)){if((q|0)==0){p=14;break}if((s&15|0)==15){p=16;break}else{continue}}else{c[k>>2]=s;t=+g[b>>2];if((q|0)==1){p=11;break}Nza(l,t,+g[d>>2],s);continue}}if((p|0)==11){p=0;g[h>>2]=t;g[j>>2]=+g[d>>2]}else if((p|0)==14){p=0;c[k>>2]=0}else if((p|0)==16){p=0;Nza(l,+g[b>>2],+g[d>>2],s)}Qza(l);c[f>>2]=2}q=Sza(l,b,d)|0;if((q&-129|0)!=0){m=q;n=1;continue}c[f>>2]=1;m=q;n=0}if((p|0)==20){i=e;return o|0}return 0}function Xya(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0;e=i;f=a+204|0;h=a+212|0;j=a+216|0;k=a+208|0;l=a+4|0;m=0;n=0;while(1){if(n){o=m;p=20;break}q=c[f>>2]|0;while(1){if((q|0)==1){p=6;break}else if((q|0)==0){p=5;break}else if((q|0)==2){break}}if((p|0)==5){p=0;q=qya(c[a>>2]|0,h,j)|0;c[k>>2]=q;c[f>>2]=1;r=q;p=7}else if((p|0)==6){p=0;r=c[k>>2]|0;p=7}if((p|0)==7){p=0;if((r&-129|0)==0){o=0;p=20;break}yza(l);zza(l,+g[h>>2],+g[j>>2],1);while(1){s=qya(c[a>>2]|0,b,d)|0;q=s&-129;if(!(q>>>0<15&(q|0)!=0)){if((q|0)==0){p=14;break}if((s&15|0)==15){p=16;break}else{continue}}else{c[k>>2]=s;t=+g[b>>2];if((q|0)==1){p=11;break}zza(l,t,+g[d>>2],s);continue}}if((p|0)==11){p=0;g[h>>2]=t;g[j>>2]=+g[d>>2]}else if((p|0)==14){p=0;c[k>>2]=0}else if((p|0)==16){p=0;zza(l,+g[b>>2],+g[d>>2],s)}Cza(l);c[f>>2]=2}q=Fza(l,b,d)|0;if((q&-129|0)!=0){m=q;n=1;continue}c[f>>2]=1;m=q;n=0}if((p|0)==20){i=e;return o|0}return 0}function Yya(a){a=a|0;var b=0;b=i;fza(c[a>>2]|0);c[a+204>>2]=0;i=b;return}function Zya(a){a=a|0;var b=0;b=i;fza(c[a>>2]|0);c[a+100>>2]=0;i=b;return}function _ya(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0;e=i;f=a+100|0;h=a+108|0;j=a+112|0;k=a+104|0;l=a+4|0;m=0;n=0;while(1){if(n){o=m;p=20;break}q=c[f>>2]|0;while(1){if((q|0)==0){p=5;break}else if((q|0)==1){p=6;break}else if((q|0)==2){break}}if((p|0)==5){p=0;q=qya(c[a>>2]|0,h,j)|0;c[k>>2]=q;c[f>>2]=1;r=q;p=7}else if((p|0)==6){p=0;r=c[k>>2]|0;p=7}if((p|0)==7){p=0;if((r&-129|0)==0){o=0;p=20;break}Mza(l);Nza(l,+g[h>>2],+g[j>>2],1);while(1){s=qya(c[a>>2]|0,b,d)|0;q=s&-129;if(!(q>>>0<15&(q|0)!=0)){if((q|0)==0){p=14;break}if((s&15|0)==15){p=16;break}else{continue}}else{c[k>>2]=s;t=+g[b>>2];if((q|0)==1){p=11;break}Nza(l,t,+g[d>>2],s);continue}}if((p|0)==11){p=0;g[h>>2]=t;g[j>>2]=+g[d>>2]}else if((p|0)==14){p=0;c[k>>2]=0}else if((p|0)==16){p=0;Nza(l,+g[b>>2],+g[d>>2],s)}Qza(l);c[f>>2]=2}q=Sza(l,b,d)|0;if((q&-129|0)!=0){m=q;n=1;continue}c[f>>2]=1;m=q;n=0}if((p|0)==20){i=e;return o|0}return 0}function $ya(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a>>2]|0;e=a+8|0;f=c[e>>2]|0;if((d|0)>(f|0)){c[a>>2]=f;c[e>>2]=d}d=a+4|0;e=c[d>>2]|0;f=a+12|0;a=c[f>>2]|0;if((e|0)<=(a|0)){i=b;return}c[d>>2]=a;c[f>>2]=e;i=b;return}function aza(b){b=b|0;var d=0;d=i;iza(b+4|0);c[b+96>>2]=0;c[b+100>>2]=0;c[b+104>>2]=0;c[b+128>>2]=0;a[b+148>>0]=0;i=d;return}function bza(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;c[a>>2]=b;c[a+8>>2]=d;c[a+12>>2]=e;c[a+16>>2]=f;d=a+20|0;if((c[d>>2]|0)>>>0<e>>>0){h=a+4|0;v2a(c[h>>2]|0);c[d>>2]=e;c[h>>2]=w2a(e,4)|0;j=c[a>>2]|0}else{j=b}if((f|0)<0){k=j+(ca(e+ -1|0,0-f|0)|0)|0}else{k=j}if((e|0)==0){i=g;return}j=e;e=k;k=c[a+4>>2]|0;while(1){j=j+ -1|0;c[k>>2]=e;if((j|0)==0){break}else{e=e+f|0;k=k+4|0}}i=g;return}function cza(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+4|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}f=a+12|0;a=c[f>>2]|0;g=e+ -1|0;c[d>>2]=g;e=a+(g<<2)|0;while(1){v2a(c[e>>2]|0);g=c[d>>2]|0;c[d>>2]=g+ -1;if((g|0)==0){break}else{e=e+ -4|0}}v2a(c[f>>2]|0);i=b;return}function dza(a){a=a|0;var b=0;b=i;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;i=b;return}function eza(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;e=a+8|0;f=c[e>>2]|0;if(f>>>0>b>>>0){g=c[a+12>>2]|0}else{h=w2a((f<<1)+512|0,4)|0;if((h|0)==0){i=d;return}j=h+(f+256<<2)|0;k=a+12|0;l=c[k>>2]|0;if((l|0)==0){m=a+16|0;n=f}else{o=f<<2;c3a(h|0,l|0,o|0)|0;f=a+16|0;c3a(j|0,c[f>>2]|0,o|0)|0;v2a(l);m=f;n=c[e>>2]|0}c[k>>2]=h;c[m>>2]=j;c[e>>2]=n+256;g=h}c[g+(b<<2)>>2]=w2a(576,4)|0;g=c[(c[a+12>>2]|0)+(b<<2)>>2]|0;if((g|0)==0){i=d;return}c[(c[a+16>>2]|0)+(b<<2)>>2]=g+2048;g=a+4|0;c[g>>2]=(c[g>>2]|0)+1;i=d;return}function fza(a){a=a|0;c[a+20>>2]=0;return}function gza(b){b=b|0;var d=0,e=0,f=0;d=i;e=c[b>>2]|0;if((e|0)==0){i=d;return}f=e+ -1|0;e=a[(c[(c[b+16>>2]|0)+(f>>>8<<2)>>2]|0)+(f&255)>>0]&127;if(!(e>>>0<15&(e|0)!=0)){i=d;return}Gya(b,0.0,0.0,79);i=d;return}function hza(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=c[a>>2]|0;if((d|0)!=0){e=a+16|0;f=c[e>>2]|0;g=d+ -1|0;c[a>>2]=g;d=f+(g<<2)|0;while(1){v2a(c[d>>2]|0);g=c[a>>2]|0;c[a>>2]=g+ -1;if((g|0)==0){break}else{d=d+ -4|0}}v2a(c[e>>2]|0)}v2a(c[a+44>>2]|0);v2a(c[a+32>>2]|0);i=b;return}function iza(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;c[b+64>>2]=0;c[b+68>>2]=0;e=b+72|0;f=b+0|0;g=f+48|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));c[e>>2]=2147483647;c[b+76>>2]=2147483647;c[b+80>>2]=-2147483647;c[b+84>>2]=-2147483647;a[b+88>>0]=0;c[b+48>>2]=32767;c[b+52>>2]=32767;c[b+56>>2]=0;c[b+60>>2]=0;i=d;return}function jza(b){b=b|0;c[b+12>>2]=0;c[b+8>>2]=0;c[b+48>>2]=32767;c[b+52>>2]=32767;c[b+56>>2]=0;c[b+60>>2]=0;a[b+88>>0]=0;c[b+72>>2]=2147483647;c[b+76>>2]=2147483647;c[b+80>>2]=-2147483647;c[b+84>>2]=-2147483647;return}function kza(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;b=i;d=a+8|0;e=c[d>>2]|0;f=c[a>>2]|0;do{if(!(e>>>0<f>>>0)){g=a+4|0;h=c[g>>2]|0;if(f>>>0<h>>>0){j=f;k=c[a+16>>2]|0}else{l=w2a(h+256|0,4)|0;if((l|0)==0){i=b;return}m=a+16|0;n=c[m>>2]|0;if((n|0)==0){o=f;p=h}else{c3a(l|0,n|0,h<<2|0)|0;v2a(n);o=c[a>>2]|0;p=c[g>>2]|0}c[m>>2]=l;c[g>>2]=p+256;j=o;k=l}l=w2a(4096,16)|0;c[a>>2]=j+1;c[k+(j<<2)>>2]=l;l=c[a+16>>2]|0;if((c[l+((c[a>>2]|0)+ -1<<2)>>2]|0)==0){i=b;return}else{q=c[d>>2]|0;r=l;break}}else{q=e;r=c[a+16>>2]|0}}while(0);c[d>>2]=q+1;c[a+20>>2]=c[r+(q<<2)>>2];i=b;return}function lza(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;g=i;h=e-b|0;if((h+4194303|0)>>>0>8388606){j=e+b>>1;k=f+d>>1;lza(a,b,d,j,k);lza(a,j,k,e,f)}k=f-d|0;j=d>>8;l=f>>8;m=d&255;d=f&255;if((j|0)==(l|0)){mza(a,j,b,m,e,d);i=g;return}if((e|0)==(b|0)){n=e>>8;o=e-(n<<8)<<1;p=k>>31;q=p+256&-256;r=p|1;p=q-m|0;s=ca(p,o)|0;t=a+56|0;c[t>>2]=(c[t>>2]|0)+p;p=a+60|0;c[p>>2]=(c[p>>2]|0)+s;s=r+j|0;nza(a,n,s);u=(q<<1)+ -256|0;v=ca(u,o)|0;if((s|0)!=(l|0)){w=s;do{c[t>>2]=u;c[p>>2]=v;w=w+r|0;nza(a,n,w)}while((w|0)!=(l|0))}w=q+(f|-256)|0;f=ca(w,o)|0;c[t>>2]=(c[t>>2]|0)+w;c[p>>2]=(c[p>>2]|0)+f;i=g;return}f=(k|0)<0;p=k>>31;w=p+256&-256;t=p|1;p=f?0-k|0:k;k=ca(f?m:256-m|0,h)|0;f=(k|0)/(p|0)|0;o=(k|0)%(p|0)|0;if((o|0)<0){x=f+ -1|0;y=o+p|0}else{x=f;y=o}o=x+b|0;mza(a,j,b,m,o,w);m=t+j|0;nza(a,o>>8,m);if((m|0)==(l|0)){z=256-w|0;A=o}else{j=h<<8;h=(j|0)/(p|0)|0;b=(j|0)%(p|0)|0;if((b|0)<0){B=h+ -1|0;C=b+p|0}else{B=h;C=b}b=256-w|0;h=m;m=y-p|0;y=o;while(1){o=m+C|0;j=B+(o>>>31^1)+y|0;mza(a,h,y,b,j,w);h=h+t|0;nza(a,j>>8,h);if((h|0)==(l|0)){z=b;A=j;break}else{m=o-((o|0)>-1?p:0)|0;y=j}}}mza(a,l,A,z,e,d);i=g;return}function mza(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;h=i;j=d>>8;k=f>>8;l=d&255;m=f&255;if((e|0)==(g|0)){nza(a,k,b);i=h;return}if((j|0)==(k|0)){n=g-e|0;o=ca(m+l|0,n)|0;p=a+56|0;c[p>>2]=(c[p>>2]|0)+n;n=a+60|0;c[n>>2]=(c[n>>2]|0)+o;i=h;return}o=f-d|0;d=(o|0)<0;f=o>>31;n=f+256&-256;p=d?0-o|0:o;o=f|1;f=ca(d?l:256-l|0,g-e|0)|0;d=(f|0)/(p|0)|0;q=(f|0)%(p|0)|0;if((q|0)<0){r=d+ -1|0;s=q+p|0}else{r=d;s=q}q=ca(r,n|l)|0;l=a+56|0;c[l>>2]=(c[l>>2]|0)+r;d=a+60|0;c[d>>2]=(c[d>>2]|0)+q;q=o+j|0;nza(a,q,b);j=r+e|0;if((q|0)==(k|0)){t=j}else{e=r+g-j<<8;r=(e|0)/(p|0)|0;f=(e|0)%(p|0)|0;if((f|0)<0){u=r+ -1|0;v=f+p|0}else{u=r;v=f}f=j;j=q;q=s-p|0;while(1){s=q+v|0;r=u+(s>>>31^1)|0;c[l>>2]=(c[l>>2]|0)+r;c[d>>2]=(c[d>>2]|0)+(r<<8);e=r+f|0;j=j+o|0;nza(a,j,b);if((j|0)==(k|0)){t=e;break}else{f=e;q=s-((s|0)>-1?p:0)|0}}}p=g-t|0;t=ca(p,(m|256)-n|0)|0;c[l>>2]=(c[l>>2]|0)+p;c[d>>2]=(c[d>>2]|0)+t;i=h;return}function nza(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=a+48|0;g=a+52|0;if((c[f>>2]|0)==(b|0)?(c[g>>2]|0)==(d|0):0){i=e;return}rza(a);c[f>>2]=b;c[g>>2]=d;c[a+56>>2]=0;c[a+60>>2]=0;g=a+72|0;if((c[g>>2]|0)>(b|0)){c[g>>2]=b}g=a+80|0;if((c[g>>2]|0)<(b|0)){c[g>>2]=b}b=a+76|0;if((c[b>>2]|0)>(d|0)){c[b>>2]=d}b=a+84|0;if((c[b>>2]|0)>=(d|0)){i=e;return}c[b>>2]=d;i=e;return}function oza(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=i;if((a[b+88>>0]|0)!=0){jza(b)}nza(b,d>>8,e>>8);c[b+64>>2]=d;c[b+68>>2]=e;i=f;return}function pza(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;g=b+64|0;h=b+68|0;lza(b,c[g>>2]|0,c[h>>2]|0,d,e);c[g>>2]=d;c[h>>2]=e;a[b+88>>0]=0;i=f;return}function qza(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;d=i;i=i+320|0;e=d;f=b+88|0;if((a[f>>0]|0)!=0){i=d;return}rza(b);g=b+12|0;h=c[g>>2]|0;if((h|0)==0){i=d;return}j=b+24|0;tza(j,h);c[j>>2]=h;h=c[b+84>>2]|0;j=b+76|0;k=c[j>>2]|0;if((h|0)>0&(k|0)<0?(2147483647-h|0)<(0-k|0):0){i=d;return}l=h-k|0;if((l|0)==-1){i=d;return}k=l+1|0;l=b+36|0;sza(l,k);c[l>>2]=k;h=b+44|0;f3a(c[h>>2]|0,0,k<<3|0)|0;k=b+16|0;m=c[k>>2]|0;n=c[g>>2]|0;o=n>>>12;if((o|0)==0){p=n;q=m}else{n=o;r=m;while(1){n=n+ -1|0;s=c[r>>2]|0;t=4096;while(1){t=t+ -1|0;u=(c[h>>2]|0)+((c[s+4>>2]|0)-(c[j>>2]|0)<<3)|0;c[u>>2]=(c[u>>2]|0)+1;if((t|0)==0){break}else{s=s+16|0}}if((n|0)==0){break}else{r=r+4|0}}p=c[g>>2]|0;q=m+(o<<2)|0}o=p&4095;if((o|0)!=0){p=c[q>>2]|0;q=o;while(1){q=q+ -1|0;o=(c[h>>2]|0)+((c[p+4>>2]|0)-(c[j>>2]|0)<<3)|0;c[o>>2]=(c[o>>2]|0)+1;if((q|0)==0){break}else{p=p+16|0}}}if((c[l>>2]|0)!=0){p=0;q=0;while(1){o=(c[h>>2]|0)+(p<<3)|0;m=c[o>>2]|0;c[o>>2]=q;p=p+1|0;if(!(p>>>0<(c[l>>2]|0)>>>0)){break}else{q=m+q|0}}}q=c[k>>2]|0;k=c[g>>2]|0;p=k>>>12;if((p|0)==0){v=k;w=q}else{k=b+32|0;m=p;o=q;while(1){m=m+ -1|0;r=c[o>>2]|0;n=4096;while(1){n=n+ -1|0;s=(c[r+4>>2]|0)-(c[j>>2]|0)|0;t=c[h>>2]|0;u=t+(s<<3)+4|0;c[(c[k>>2]|0)+((c[u>>2]|0)+(c[t+(s<<3)>>2]|0)<<2)>>2]=r;c[u>>2]=(c[u>>2]|0)+1;if((n|0)==0){break}else{r=r+16|0}}if((m|0)==0){break}else{o=o+4|0}}v=c[g>>2]|0;w=q+(p<<2)|0}p=v&4095;if((p|0)!=0){v=b+32|0;q=c[w>>2]|0;w=p;while(1){w=w+ -1|0;p=(c[q+4>>2]|0)-(c[j>>2]|0)|0;g=c[h>>2]|0;o=g+(p<<3)+4|0;c[(c[v>>2]|0)+((c[o>>2]|0)+(c[g+(p<<3)>>2]|0)<<2)>>2]=q;c[o>>2]=(c[o>>2]|0)+1;if((w|0)==0){break}else{q=q+16|0}}}q=c[l>>2]|0;if((q|0)!=0){w=b+32|0;b=q;q=0;while(1){v=c[h>>2]|0;j=c[v+(q<<3)+4>>2]|0;if((j|0)==0){x=b}else{o=c[w>>2]|0;p=c[v+(q<<3)>>2]|0;v=o+(p<<2)|0;g=o+(p+j<<2)|0;j=e;while(1){p=g;o=v;m=p-o|0;if((m|0)<=36){k=v+4|0;if(k>>>0<g>>>0){r=v;n=k;while(1){k=r+4|0;u=c[k>>2]|0;s=c[r>>2]|0;a:do{if((c[u>>2]|0)<(c[s>>2]|0)){t=s;y=k;z=r;while(1){c[y>>2]=t;c[z>>2]=u;A=z+ -4|0;if((z|0)==(v|0)){break a}t=c[A>>2]|0;if((c[u>>2]|0)>=(c[t>>2]|0)){break}else{B=z;z=A;y=B}}}}while(0);u=n+4|0;if(u>>>0<g>>>0){k=n;n=u;r=k}else{break}}}if(!(j>>>0>e>>>0)){break}r=j+ -8|0;v=c[r>>2]|0;g=c[j+ -4>>2]|0;j=r;continue}r=v+(((m>>2|0)/2|0)<<2)|0;n=c[v>>2]|0;c[v>>2]=c[r>>2];c[r>>2]=n;n=v+4|0;r=g+ -4|0;k=c[r>>2]|0;u=c[n>>2]|0;s=c[u>>2]|0;if((c[k>>2]|0)<(s|0)){c[n>>2]=k;c[r>>2]=u;y=c[n>>2]|0;C=c[y>>2]|0;D=y;E=u}else{C=s;D=u;E=k}k=c[v>>2]|0;u=c[k>>2]|0;if((u|0)<(C|0)){c[v>>2]=D;c[n>>2]=k;F=c[r>>2]|0;G=c[D>>2]|0;H=D}else{F=E;G=u;H=k}if((c[F>>2]|0)<(G|0)){c[v>>2]=F;c[r>>2]=H;I=n;J=r}else{I=n;J=r}while(1){K=c[v>>2]|0;r=c[K>>2]|0;L=I;do{L=L+4|0;M=c[L>>2]|0}while((c[M>>2]|0)<(r|0));N=J;do{N=N+ -4|0;O=c[N>>2]|0}while((r|0)<(c[O>>2]|0));if(L>>>0>N>>>0){break}c[L>>2]=O;c[N>>2]=M;I=L;J=N}c[v>>2]=O;c[N>>2]=K;if((N-o|0)>(p-L|0)){c[j>>2]=v;c[j+4>>2]=N;P=L;Q=g}else{c[j>>2]=L;c[j+4>>2]=g;P=v;Q=N}v=P;g=Q;j=j+8|0}x=c[l>>2]|0}q=q+1|0;if(!(q>>>0<x>>>0)){break}else{b=x}}}a[f>>0]=1;i=d;return}function rza(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+48|0;if((c[a+56>>2]|c[a+60>>2]|0)==0){i=b;return}e=a+12|0;do{if((c[e>>2]&4095|0)==0){if((c[a>>2]|0)>>>0>1023){i=b;return}else{kza(a);break}}}while(0);f=a+20|0;a=c[f>>2]|0;c[f>>2]=a+16;c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];c[e>>2]=(c[e>>2]|0)+1;i=b;return}function sza(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;c[a>>2]=0;e=b+16|0;if(b>>>0>4294967279){b=a+8|0;v2a(c[b>>2]|0);c[b>>2]=0;c[a+4>>2]=0;i=d;return}b=a+4|0;if(!(e>>>0>(c[b>>2]|0)>>>0)){i=d;return}f=a+8|0;v2a(c[f>>2]|0);c[b>>2]=0;a=w2a(e,8)|0;c[f>>2]=a;if((a|0)==0){i=d;return}c[b>>2]=e;i=d;return}function tza(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;c[a>>2]=0;e=b+16|0;if(b>>>0>4294967279){b=a+8|0;v2a(c[b>>2]|0);c[b>>2]=0;c[a+4>>2]=0;i=d;return}b=a+4|0;if(!(e>>>0>(c[b>>2]|0)>>>0)){i=d;return}f=a+8|0;v2a(c[f>>2]|0);c[b>>2]=0;a=w2a(e,4)|0;c[f>>2]=a;if((a|0)==0){i=d;return}c[b>>2]=e;i=d;return}function uza(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+128|0;e=a+164|0;f=a+180|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[f>>2]=64;c[a+184>>2]=0;c[a+188>>2]=0;c[a+192>>2]=0;i=b;return}function vza(a,b,d){a=a|0;b=+b;d=+d;var e=0,f=0,h=0,j=0;e=i;f=a+132|0;h=c[f>>2]|0;if(!(h>>>0<32)){i=e;return}j=a+128|0;g[j>>2]=b+d+ +g[j>>2];c[f>>2]=h+1;g[a+(h<<2)>>2]=b;h=c[f>>2]|0;c[f>>2]=h+1;g[a+(h<<2)>>2]=d;i=e;return}function wza(a,b){a=a|0;b=+b;var c=0;c=i;g[a+136>>2]=b;xza(a,+R(+b));i=c;return}function xza(a,b){a=a|0;b=+b;var d=0,e=0,f=0,h=0,j=0.0,k=0,l=0.0,m=0,n=0,o=0;d=i;e=a+148|0;c[e>>2]=0;f=a+144|0;g[f>>2]=0.0;if(!(b>0.0)){i=d;return}h=a+132|0;j=b;k=0;while(1){b=+g[a+(k<<2)>>2];if(!(j>b)){break}l=j-b;m=k+1|0;c[e>>2]=m;g[f>>2]=0.0;if(m>>>0<(c[h>>2]|0)>>>0){n=m}else{c[e>>2]=0;n=0}if(l>0.0){j=l;k=n}else{o=8;break}}if((o|0)==8){i=d;return}g[f>>2]=j;i=d;return}function yza(a){a=a|0;c[a+188>>2]=0;c[a+164>>2]=0;c[a+184>>2]=0;return}function zza(a,b,d,e){a=a|0;b=+b;d=+d;e=e|0;var f=0,h=0,j=0,k=0;f=i;i=i+32|0;h=f+12|0;j=f;c[a+188>>2]=0;k=e&-129;if((k|0)==1){g[h>>2]=b;g[h+4>>2]=d;g[h+8>>2]=0.0;Aza(a+164|0,h);i=f;return}if(k>>>0<15&(k|0)!=0){g[j>>2]=b;g[j+4>>2]=d;g[j+8>>2]=0.0;Bza(a+164|0,j);i=f;return}else{c[a+184>>2]=e&64;i=f;return}}function Aza(a,b){a=a|0;b=b|0;var c=0;c=i;Gza(a);Bza(a,b);i=c;return}function Bza(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0;d=i;e=c[a>>2]|0;if(e>>>0>1?(f=e+ -2|0,h=c[a+12>>2]|0,j=e+ -1|0,e=j&63,k=c[h+(j>>>6<<2)>>2]|0,!(Hza((c[h+(f>>>6<<2)>>2]|0)+((f&63)*12|0)|0,+g[k+(e*12|0)>>2],+g[k+(e*12|0)+4>>2])|0)):0){Gza(a)}Iza(a,b);i=d;return}function Cza(a){a=a|0;var b=0,d=0,e=0,f=0,h=0;b=i;d=a+188|0;if((c[d>>2]|0)!=0){c[d>>2]=1;e=a+192|0;c[e>>2]=0;i=b;return}f=a+164|0;h=a+184|0;Dza(f,(c[h>>2]|0)!=0);Eza(f,+g[a+140>>2],c[h>>2]|0);c[d>>2]=1;e=a+192|0;c[e>>2]=0;i=b;return}function Dza(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;i=i+16|0;e=d;f=c[a>>2]|0;a:do{if(f>>>0>1){h=a+12|0;j=f;do{k=j+ -2|0;l=c[h>>2]|0;m=j+ -1|0;n=m&63;o=c[l+(m>>>6<<2)>>2]|0;if(Hza((c[l+(k>>>6<<2)>>2]|0)+((k&63)*12|0)|0,+g[o+(n*12|0)>>2],+g[o+(n*12|0)+4>>2])|0){break a}n=(c[a>>2]|0)+ -1|0;o=(c[(c[h>>2]|0)+(n>>>6<<2)>>2]|0)+((n&63)*12|0)|0;c[e+0>>2]=c[o+0>>2];c[e+4>>2]=c[o+4>>2];c[e+8>>2]=c[o+8>>2];Gza(a);Aza(a,e);j=c[a>>2]|0}while(j>>>0>1)}}while(0);if(!b){i=d;return}b=c[a>>2]|0;if(!(b>>>0>1)){i=d;return}e=a+12|0;f=b;while(1){b=f+ -1|0;j=c[e>>2]|0;h=c[j>>2]|0;if(Hza((c[j+(b>>>6<<2)>>2]|0)+((b&63)*12|0)|0,+g[h>>2],+g[h+4>>2])|0){p=10;break}Gza(a);f=c[a>>2]|0;if(!(f>>>0>1)){p=10;break}}if((p|0)==10){i=d;return}}function Eza(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0,h=0,j=0,k=0.0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0;e=i;if(!(b>0.0)){i=e;return}f=c[a>>2]|0;if(!(f>>>0>1)){i=e;return}h=f+ -2|0;if((h|0)!=0){j=a+12|0;k=b;l=h;while(1){m=+g[(c[(c[j>>2]|0)+(l>>>6<<2)>>2]|0)+((l&63)*12|0)+8>>2];if(m>k){n=k;break}Gza(a);o=k-m;l=l+ -1|0;if((l|0)==0){n=o;break}else{k=o}}l=c[a>>2]|0;if(l>>>0<2){c[a>>2]=0;i=e;return}else{p=n;q=l}}else{p=b;q=f}f=q+ -1|0;l=q+ -2|0;q=l&63;j=c[a+12>>2]|0;h=c[j+(l>>>6<<2)>>2]|0;l=h+(q*12|0)|0;r=f&63;s=c[j+(f>>>6<<2)>>2]|0;b=+g[h+(q*12|0)+8>>2];n=(b-p)/b;b=+g[l>>2];f=s+(r*12|0)|0;p=b+n*(+g[f>>2]-b);b=+g[h+(q*12|0)+4>>2];q=s+(r*12|0)+4|0;k=b+n*(+g[q>>2]-b);g[f>>2]=p;g[q>>2]=k;if(!(Hza(l,p,k)|0)){Gza(a)}Dza(a,(d|0)!=0);i=e;return}function Fza(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0,s=0,t=0.0,u=0.0,v=0;e=i;f=a+188|0;h=a+132|0;j=a+164|0;k=c[f>>2]|0;while(1){if((k|0)==2){l=8;break}else if((k|0)==3){m=0;l=17;break}else if((k|0)==0){l=3;break}else if((k|0)==1){break}}if((l|0)==3){Cza(a)}else if((l|0)==8){k=a+148|0;n=c[k>>2]|0;o=a+144|0;p=+g[o>>2];q=+g[a+(n<<2)>>2]-p;r=2-(n&1)|0;s=a+152|0;t=+g[s>>2];if(t>q){u=t-q;g[s>>2]=u;v=n+1|0;c[k>>2]=v>>>0<(c[h>>2]|0)>>>0?v:0;g[o>>2]=0.0;v=a+160|0;q=+g[c[v>>2]>>2];k=a+156|0;n=c[k>>2]|0;g[b>>2]=q-(q- +g[n>>2])*u/+g[n+8>>2];u=+g[(c[v>>2]|0)+4>>2];v=c[k>>2]|0;g[d>>2]=u-(u- +g[v+4>>2])*+g[s>>2]/+g[v+8>>2];m=r;i=e;return m|0}g[o>>2]=p+t;o=a+160|0;g[b>>2]=+g[c[o>>2]>>2];g[d>>2]=+g[(c[o>>2]|0)+4>>2];v=a+192|0;k=(c[v>>2]|0)+1|0;c[v>>2]=k;v=c[o>>2]|0;c[a+156>>2]=v;g[s>>2]=+g[v+8>>2];v=c[j>>2]|0;if((c[a+184>>2]|0)==0){if(k>>>0<v>>>0){c[o>>2]=(c[(c[a+176>>2]|0)+(k>>>6<<2)>>2]|0)+((k&63)*12|0);m=r;i=e;return m|0}else{c[f>>2]=3;m=r;i=e;return m|0}}else{if(k>>>0>v>>>0){c[f>>2]=3;m=r;i=e;return m|0}else{s=k>>>0<v>>>0?k:0;c[o>>2]=(c[(c[a+176>>2]|0)+(s>>>6<<2)>>2]|0)+((s&63)*12|0);m=r;i=e;return m|0}}}else if((l|0)==17){i=e;return m|0}if((c[h>>2]|0)>>>0<2){m=0;i=e;return m|0}if((c[j>>2]|0)>>>0<2){m=0;i=e;return m|0}c[f>>2]=2;c[a+192>>2]=1;f=c[a+176>>2]|0;j=c[f>>2]|0;h=a+156|0;c[h>>2]=j;c[a+160>>2]=(c[f>>2]|0)+12;g[a+152>>2]=+g[j+8>>2];g[b>>2]=+g[j>>2];g[d>>2]=+g[(c[h>>2]|0)+4>>2];t=+g[a+136>>2];if(!(t>=0.0)){m=1;i=e;return m|0}xza(a,t);m=1;i=e;return m|0}function Gza(a){a=a|0;var b=0;b=c[a>>2]|0;if((b|0)!=0){c[a>>2]=b+ -1}return}function Hza(a,b,c){a=a|0;b=+b;c=+c;var d=0.0;d=b- +g[a>>2];b=c- +g[a+4>>2];c=+S(+(d*d+b*b));g[a+8>>2]=c;return c>9.9999998245167e-15|0}function Iza(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=Jza(a)|0;c[e+0>>2]=c[b+0>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[a>>2]=(c[a>>2]|0)+1;i=d;return}function Jza(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a>>2]|0;e=d>>>6;if(e>>>0<(c[a+4>>2]|0)>>>0){f=d}else{Kza(a,e);f=c[a>>2]|0}i=b;return(c[(c[a+12>>2]|0)+(e<<2)>>2]|0)+((f&63)*12|0)|0}function Kza(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;e=a+8|0;f=c[e>>2]|0;if(f>>>0>b>>>0){g=c[a+12>>2]|0}else{h=a+16|0;j=c[h>>2]|0;k=w2a(j+f|0,4)|0;l=a+12|0;m=c[l>>2]|0;if((m|0)==0){n=j;o=f}else{c3a(k|0,m|0,c[a+4>>2]<<2|0)|0;v2a(m);n=c[h>>2]|0;o=c[e>>2]|0}c[l>>2]=k;c[e>>2]=o+n;g=k}c[g+(b<<2)>>2]=w2a(64,12)|0;b=a+4|0;c[b>>2]=(c[b>>2]|0)+1;i=d;return}function Lza(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+4|0;e=a+20|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[e>>2]=64;e=a+24|0;d=a+40|0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[d>>2]=64;g[a+44>>2]=.5;g[a+48>>2]=4.0;g[a+52>>2]=1.0099999904632568;g[a+56>>2]=1.0;c[a+60>>2]=0;c[a+64>>2]=0;c[a+68>>2]=1;c[a+72>>2]=0;c[a+76>>2]=0;c[a+84>>2]=0;c[a+88>>2]=0;i=b;return}function Mza(a){a=a|0;c[a+4>>2]=0;c[a+72>>2]=0;c[a+76>>2]=0;return}function Nza(a,b,d,e){a=a|0;b=+b;d=+d;e=e|0;var f=0,h=0,j=0,k=0;f=i;i=i+32|0;h=f+16|0;j=f;c[a+76>>2]=0;k=e&-129;if((k|0)==1){g[h>>2]=b;g[h+4>>2]=d;g[h+8>>2]=0.0;c[h+12>>2]=e;Oza(a+4|0,h);i=f;return}if(k>>>0<15&(k|0)!=0){g[j>>2]=b;g[j+4>>2]=d;g[j+8>>2]=0.0;c[j+12>>2]=e;Pza(a+4|0,j);i=f;return}else{c[a+72>>2]=e&64;i=f;return}}function Oza(a,b){a=a|0;b=b|0;var c=0;c=i;aAa(a);Pza(a,b);i=c;return}function Pza(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0;d=i;e=c[a>>2]|0;if(e>>>0>1?(f=e+ -2|0,h=c[a+12>>2]|0,j=e+ -1|0,e=j&63,k=c[h+(j>>>6<<2)>>2]|0,!(Hza((c[h+(f>>>6<<2)>>2]|0)+((f&63)<<4)|0,+g[k+(e<<4)>>2],+g[k+(e<<4)+4>>2])|0)):0){aAa(a)}bAa(a,b);i=d;return}function Qza(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+76|0;if((c[d>>2]|0)==0?(e=a+4|0,f=a+72|0,Rza(e,(c[f>>2]|0)!=0),(c[e>>2]|0)>>>0<3):0){c[f>>2]=0}c[d>>2]=1;c[a+84>>2]=0;c[a+88>>2]=0;i=b;return}function Rza(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;i=i+16|0;e=d;f=c[a>>2]|0;a:do{if(f>>>0>1){h=a+12|0;j=f;do{k=j+ -2|0;l=c[h>>2]|0;m=j+ -1|0;n=m&63;o=c[l+(m>>>6<<2)>>2]|0;if(Hza((c[l+(k>>>6<<2)>>2]|0)+((k&63)<<4)|0,+g[o+(n<<4)>>2],+g[o+(n<<4)+4>>2])|0){break a}n=(c[a>>2]|0)+ -1|0;o=(c[(c[h>>2]|0)+(n>>>6<<2)>>2]|0)+((n&63)<<4)|0;c[e+0>>2]=c[o+0>>2];c[e+4>>2]=c[o+4>>2];c[e+8>>2]=c[o+8>>2];c[e+12>>2]=c[o+12>>2];aAa(a);Oza(a,e);j=c[a>>2]|0}while(j>>>0>1)}}while(0);if(!b){i=d;return}b=c[a>>2]|0;if(!(b>>>0>1)){i=d;return}e=a+12|0;f=b;while(1){b=f+ -1|0;j=c[e>>2]|0;h=c[j>>2]|0;if(Hza((c[j+(b>>>6<<2)>>2]|0)+((b&63)<<4)|0,+g[h>>2],+g[h+4>>2])|0){p=10;break}aAa(a);f=c[a>>2]|0;if(!(f>>>0>1)){p=10;break}}if((p|0)==10){i=d;return}}function Sza(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;e=i;f=a+76|0;h=a+4|0;j=a+72|0;k=a+84|0;l=a+88|0;m=a+24|0;n=a+16|0;o=a+60|0;p=a+44|0;q=a+56|0;r=a+80|0;s=a+4|0;t=a+64|0;u=a+68|0;v=a+48|0;w=a+52|0;x=a+24|0;y=c[f>>2]|0;z=2;a:while(1){b:do{switch(y|0){case 2:{A=c[c[n>>2]>>2]|0;Tza(m,A,A+16|0,+g[A+8>>2],c[o>>2]|0,+g[p>>2],+g[q>>2]);c[k>>2]=1;c[r>>2]=4;c[f>>2]=7;c[l>>2]=0;B=7;C=z;break};case 7:{D=c[l>>2]|0;if(D>>>0<(c[x>>2]|0)>>>0){E=24;break a}A=c[r>>2]|0;c[f>>2]=A;B=A;C=z;break};case 4:{A=c[k>>2]|0;F=c[s>>2]|0;if((c[j>>2]|0)==0){if(!(A>>>0<(F+ -1|0)>>>0)){c[f>>2]=3;B=3;C=z;break b}}else{if(!(A>>>0<F>>>0)){c[r>>2]=5;c[f>>2]=8;B=8;C=z;break b}}G=A&63;H=c[n>>2]|0;I=c[H+(A>>>6<<2)>>2]|0;if((c[I+(G<<4)+12>>2]&128|0)==0){J=c[t>>2]|0}else{J=4}K=Vza(F,H,A)|0;L=((A+1|0)>>>0)%(F>>>0)|0;Uza(m,K,I+(G<<4)|0,(c[H+(L>>>6<<2)>>2]|0)+((L&63)<<4)|0,+g[K+8>>2],+g[I+(G<<4)+8>>2],+g[p>>2],J,c[u>>2]|0,+g[v>>2],+g[w>>2],+g[q>>2]);c[k>>2]=(c[k>>2]|0)+1;c[r>>2]=c[f>>2];c[f>>2]=7;c[l>>2]=0;B=7;C=z;break};case 1:{E=4;break};case 10:{M=0;E=28;break a;break};case 6:{N=z;E=17;break};case 9:{E=26;break a;break};case 5:{c[f>>2]=6;N=1;E=17;break};case 3:{G=c[h>>2]|0;I=G+ -1|0;K=c[n>>2]|0;L=G+ -2|0;G=L&63;H=c[K+(L>>>6<<2)>>2]|0;Tza(m,(c[K+(I>>>6<<2)>>2]|0)+((I&63)<<4)|0,H+(G<<4)|0,+g[H+(G<<4)+8>>2],c[o>>2]|0,+g[p>>2],+g[q>>2]);c[r>>2]=6;c[f>>2]=7;c[l>>2]=0;B=7;C=z;break};case 8:{E=25;break a;break};case 0:{Qza(a);E=4;break};default:{B=y;C=z}}}while(0);if((E|0)==4){E=0;G=(c[j>>2]|0)!=0;if((c[h>>2]|0)>>>0<(G&1|2)>>>0){M=0;E=28;break}H=G?4:2;c[f>>2]=H;c[k>>2]=0;c[l>>2]=0;y=H;z=1;continue}do{if((E|0)==17){E=0;H=c[k>>2]|0;if(!(H>>>0>((c[j>>2]|0)==0&1)>>>0)){c[f>>2]=9;c[r>>2]=10;B=9;C=N;break}G=H+ -1|0;c[k>>2]=G;I=G&63;K=c[n>>2]|0;L=c[K+(G>>>6<<2)>>2]|0;if((c[L+(I<<4)+12>>2]&128|0)==0){O=c[t>>2]|0}else{O=4}F=c[s>>2]|0;A=(H>>>0)%(F>>>0)|0;H=(c[K+(A>>>6<<2)>>2]|0)+((A&63)<<4)|0;A=Vza(F,K,G)|0;Uza(m,H,L+(I<<4)|0,A,+g[L+(I<<4)+8>>2],+g[A+8>>2],+g[p>>2],O,c[u>>2]|0,+g[v>>2],+g[w>>2],+g[q>>2]);c[r>>2]=c[f>>2];c[f>>2]=7;c[l>>2]=0;B=7;C=N}}while(0);if((C&-129|0)==0){M=C;E=28;break}else{y=B;z=C}}if((E|0)==24){c[l>>2]=D+1;l=D&63;C=c[(c[a+36>>2]|0)+(D>>>6<<2)>>2]|0;g[b>>2]=+g[C+(l*12|0)>>2];g[d>>2]=+g[C+(l*12|0)+4>>2];M=z;i=e;return M|0}else if((E|0)==25){c[f>>2]=c[r>>2];M=95;i=e;return M|0}else if((E|0)==26){c[f>>2]=c[r>>2];M=111;i=e;return M|0}else if((E|0)==28){i=e;return M|0}return 0}function Tza(a,b,d,e,f,h,j){a=a|0;b=b|0;d=d|0;e=+e;f=f|0;h=+h;j=+j;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0;k=i;i=i+64|0;l=k+48|0;m=k+36|0;n=k+24|0;o=k+12|0;p=k;c[a>>2]=0;q=b+4|0;r=+g[q>>2];s=+g[b>>2];t=(+g[d+4>>2]-r)/e*h;u=(+g[d>>2]-s)/e*h;if((f|0)==2){e=+_(+u,+-t);v=+X(+(h/(.125/j+h)))*2.0;g[n>>2]=s-t;g[n+4>>2]=r+u;c[n+8>>2]=0;Wza(a,n);j=e+3.1415927410125732-v*.25;w=v+e;e=+g[b>>2];if(w<j){n=o+4|0;d=o+8|0;x=e;y=w;while(1){w=y;z=x+ +U(+w)*h;A=+g[q>>2]+ +V(+w)*h;g[o>>2]=z;g[n>>2]=A;c[d>>2]=0;Wza(a,o);y=v+y;A=+g[b>>2];if(!(y<j)){B=A;break}else{x=A}}}else{B=e}e=+g[q>>2]-u;g[p>>2]=t+B;g[p+4>>2]=e;c[p+8>>2]=0;Wza(a,p);i=k;return}else if((f|0)==1){C=u;D=t}else{C=0.0;D=0.0}g[l>>2]=s-t-C;g[l+4>>2]=u+r-D;c[l+8>>2]=0;Wza(a,l);r=+g[q>>2]-u-D;g[m>>2]=t+ +g[b>>2]-C;g[m+4>>2]=r;c[m+8>>2]=0;Wza(a,m);i=k;return}function Uza(a,b,d,e,f,h,j,k,l,m,n,o){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;h=+h;j=+j;k=k|0;l=l|0;m=+m;n=+n;o=+o;var p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0,E=0.0,F=0.0,G=0.0,H=0,I=0.0,J=0.0,K=0.0,L=0.0;p=i;i=i+144|0;q=p+120|0;r=p+108|0;s=p+96|0;t=p+84|0;u=p+72|0;v=p+60|0;w=p+48|0;x=p+36|0;y=p+24|0;z=p+12|0;A=p;B=d+4|0;C=+g[B>>2];D=b+4|0;E=(C- +g[D>>2])*j/f;F=+g[d>>2];G=(F- +g[b>>2])*j/f;H=e+4|0;I=(+g[H>>2]-C)*j/h;C=(+g[e>>2]-F)*j/h;c[a>>2]=0;F=+g[d>>2];J=+g[B>>2];if(!((J- +g[D>>2])*(+g[e>>2]-F)-(F- +g[b>>2])*(+g[H>>2]-J)>0.0)){if((k|0)==2){Yza(a,F,J,E,-G,I,-C,j,o);i=p;return}else if((k|0)==4|(k|0)==1|(k|0)==0){Xza(a,b,d,e,E,G,I,C,j,k,m,o);i=p;return}else{g[z>>2]=E+F;g[z+4>>2]=J-G;c[z+8>>2]=0;Wza(a,z);m=+g[B>>2]-C;g[A>>2]=I+ +g[d>>2];g[A+4>>2]=m;c[A+8>>2]=0;Wza(a,A);i=p;return}}if((l|0)==3|(l|0)==2){m=E-I;K=G-C;L=m*m+K*K;if(L<f*f?L<h*h:0){Xza(a,b,d,e,E,G,I,C,j,1,n,1.0);i=p;return}h=E+F;L=J-G;if((l|0)==2){g[s>>2]=h;g[s+4>>2]=L;c[s+8>>2]=0;Wza(a,s);f=+g[B>>2];g[t>>2]=+g[d>>2];g[t+4>>2]=f;c[t+8>>2]=0;Wza(a,t);f=+g[B>>2]-C;g[u>>2]=I+ +g[d>>2];g[u+4>>2]=f;c[u+8>>2]=0;Wza(a,u);i=p;return}else{g[v>>2]=h;g[v+4>>2]=L;c[v+8>>2]=0;Wza(a,v);L=+g[B>>2];g[w>>2]=+g[d>>2];g[w+4>>2]=L;c[w+8>>2]=0;Wza(a,w);Yza(a,+g[d>>2],+g[B>>2],I,-C,E,-G,j,o);o=+g[B>>2];g[x>>2]=+g[d>>2];g[x+4>>2]=o;c[x+8>>2]=0;Wza(a,x);o=+g[B>>2]-C;g[y>>2]=I+ +g[d>>2];g[y+4>>2]=o;c[y+8>>2]=0;Wza(a,y);i=p;return}}else if((l|0)==1){Xza(a,b,d,e,E,G,I,C,j,1,n,1.0);i=p;return}else{g[q>>2]=E+F;g[q+4>>2]=J-G;c[q+8>>2]=0;Wza(a,q);G=+g[B>>2]-C;g[r>>2]=I+ +g[d>>2];g[r+4>>2]=G;c[r+8>>2]=0;Wza(a,r);i=p;return}}function Vza(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=((d+ -1+a|0)>>>0)%(a>>>0)|0;return(c[b+(e>>>6<<2)>>2]|0)+((e&63)<<4)|0}function Wza(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=_za(a)|0;c[e+0>>2]=c[b+0>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[a>>2]=(c[a>>2]|0)+1;i=d;return}function Xza(a,b,d,e,f,h,j,k,l,m,n,o){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;h=+h;j=+j;k=+k;l=+l;m=m|0;n=+n;o=+o;var p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0,A=0.0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0;p=i;i=i+80|0;q=p+76|0;r=p+72|0;s=p+60|0;t=p+48|0;u=p+36|0;v=p+24|0;w=p+12|0;x=p;y=+g[d>>2];g[q>>2]=y;z=d+4|0;A=+g[z>>2];g[r>>2]=A;B=b+4|0;C=e+4|0;D=Zza(+g[b>>2]+f,+g[B>>2]-h,y+f,A-h,y+j,A-k,+g[e>>2]+j,+g[C>>2]-k,q,r)|0;A=+g[d>>2];if(D){y=+g[z>>2];E=+g[q>>2];F=+g[r>>2];G=E-A;H=F-y;if(!(+S(+(G*G+H*H))<=l*n)){I=y}else{g[s>>2]=E;g[s+4>>2]=F;c[s+8>>2]=0;Wza(a,s);i=p;return}}else{F=A+f;E=+g[z>>2];y=E-h;if((F- +g[b>>2])*h-(+g[B>>2]-y)*f<0.0^(F- +g[e>>2])*h-(+g[C>>2]-y)*f<0.0){g[t>>2]=F;g[t+4>>2]=y;c[t+8>>2]=0;Wza(a,t);i=p;return}else{I=E}}if((m|0)==4){Yza(a,A,I,f,-h,j,-k,l,o);i=p;return}else if((m|0)==1){g[u>>2]=A+f;g[u+4>>2]=I-h;c[u+8>>2]=0;Wza(a,u);o=+g[z>>2]-k;g[v>>2]=+g[d>>2]+j;g[v+4>>2]=o;c[v+8>>2]=0;Wza(a,v);i=p;return}else{g[w>>2]=h*n+(A+f);g[w+4>>2]=f*n+(I-h);c[w+8>>2]=0;Wza(a,w);h=+g[z>>2]-k-j*n;g[x>>2]=+g[d>>2]+j-k*n;g[x+4>>2]=h;c[x+8>>2]=0;Wza(a,x);i=p;return}}function Yza(a,b,d,e,f,h,j,k,l){a=a|0;b=+b;d=+d;e=+e;f=+f;h=+h;j=+j;k=+k;l=+l;var m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0.0,x=0.0;m=i;i=i+48|0;n=m+36|0;o=m+24|0;p=m+12|0;q=m;r=+_(+f,+e);s=+_(+j,+h);t=r-s;if(t>0.0){u=t<3.1415927410125732}else{u=0}if(k<0.0){v=-k}else{v=k}k=+X(+(v/(v+.125/l)))*2.0;g[n>>2]=b+e;g[n+4>>2]=d+f;c[n+8>>2]=0;Wza(a,n);if(u){if(r<s){w=s+-6.2831854820251465}else{w=s}f=k*.25+w;w=r-k;if(w>f){u=p+4|0;n=p+8|0;e=w;do{w=e;l=v*+V(+w)+d;g[p>>2]=v*+U(+w)+b;g[u>>2]=l;c[n>>2]=0;Wza(a,p);e=e-k}while(e>f)}}else{if(r>s){x=s+6.2831854820251465}else{x=s}s=x-k*.25;x=k+r;if(x<s){p=o+4|0;n=o+8|0;r=x;do{x=r;f=v*+V(+x)+d;g[o>>2]=v*+U(+x)+b;g[p>>2]=f;c[n>>2]=0;Wza(a,o);r=k+r}while(r<s)}}g[q>>2]=b+h;g[q+4>>2]=d+j;c[q+8>>2]=0;Wza(a,q);i=m;return}function Zza(a,b,c,d,e,f,h,j,k,l){a=+a;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;j=+j;k=k|0;l=l|0;var m=0,n=0.0,o=0;m=i;n=h-e;h=j-f;j=(b-f)*n-(a-e)*h;e=c-a;c=d-b;d=e*h-c*n;if(+R(+d)<1.0000000031710769e-30){o=0;i=m;return o|0}g[k>>2]=e*j/d+a;g[l>>2]=c*j/d+b;o=1;i=m;return o|0}function _za(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a>>2]|0;e=d>>>6;if(e>>>0<(c[a+4>>2]|0)>>>0){f=d}else{$za(a,e);f=c[a>>2]|0}i=b;return(c[(c[a+12>>2]|0)+(e<<2)>>2]|0)+((f&63)*12|0)|0}function $za(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;e=a+8|0;f=c[e>>2]|0;if(f>>>0>b>>>0){g=c[a+12>>2]|0}else{h=a+16|0;j=c[h>>2]|0;k=w2a(j+f|0,4)|0;l=a+12|0;m=c[l>>2]|0;if((m|0)==0){n=j;o=f}else{c3a(k|0,m|0,c[a+4>>2]<<2|0)|0;v2a(m);n=c[h>>2]|0;o=c[e>>2]|0}c[l>>2]=k;c[e>>2]=o+n;g=k}c[g+(b<<2)>>2]=w2a(64,12)|0;b=a+4|0;c[b>>2]=(c[b>>2]|0)+1;i=d;return}function aAa(a){a=a|0;var b=0;b=c[a>>2]|0;if((b|0)!=0){c[a>>2]=b+ -1}return}function bAa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=cAa(a)|0;c[e+0>>2]=c[b+0>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];c[a>>2]=(c[a>>2]|0)+1;i=d;return}function cAa(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a>>2]|0;e=d>>>6;if(e>>>0<(c[a+4>>2]|0)>>>0){f=d}else{dAa(a,e);f=c[a>>2]|0}i=b;return(c[(c[a+12>>2]|0)+(e<<2)>>2]|0)+((f&63)<<4)|0}function dAa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;e=a+8|0;f=c[e>>2]|0;if(f>>>0>b>>>0){g=c[a+12>>2]|0}else{h=a+16|0;j=c[h>>2]|0;k=w2a(j+f|0,4)|0;l=a+12|0;m=c[l>>2]|0;if((m|0)==0){n=j;o=f}else{c3a(k|0,m|0,c[a+4>>2]<<2|0)|0;v2a(m);n=c[h>>2]|0;o=c[e>>2]|0}c[l>>2]=k;c[e>>2]=o+n;g=k}c[g+(b<<2)>>2]=w2a(64,16)|0;b=a+4|0;c[b>>2]=(c[b>>2]|0)+1;i=d;return}function eAa(a,b,c){a=a|0;b=b|0;c=c|0;var e=0,f=0,g=0,h=0;e=i;f=b;b=a;a=c;a:while(1){switch(b|0){case 1:{g=3;break a;break};case 5:{g=6;break a;break};case 6:{g=7;break a;break};case 11:{g=18;break a;break};case 8:{g=11;break a;break};case 7:{g=9;break a;break};case 3:{c=a;b=8;a=f;f=c;break};case 4:{g=5;break a;break};case 10:{g=17;break a;break};case 2:{g=4;break a;break};case 9:{g=14;break a;break};default:{h=a;break a}}}switch(g|0){case 3:{h=(ca(a,f)|0)/255|0;break};case 4:{h=a+f+((ca(a,f)|0)/-255|0)|0;break};case 5:{h=(a|0)<(f|0)?a:f;break};case 6:{h=(a|0)>(f|0)?a:f;break};case 7:{if((a|0)==255){h=255}else{g=(f*255|0)/(255-a|0)|0;h=(g|0)>255?255:g}break};case 9:{if((a|0)==0){h=0}else{g=((255-f|0)*255|0)/(a|0)|0;h=(g|0)>255?0:255-g|0}break};case 11:{if((a|0)<128){h=(ca(f<<1,a)|0)/255|0;break}else{g=(a<<1)+ -255|0;h=g+f+((ca(g,f)|0)/-255|0)|0;break}break};case 14:{g=a<<1;if((a|0)<128){h=f-((ca(ca(255-f|0,f)|0,255-g|0)|0)/65025|0)|0;break}else{h=((ca((d[758888+f>>0]|0)-f|0,g+ -255|0)|0)/255|0)+f|0;break}break};case 17:{h=(f|0)<(a|0)?a-f|0:f-a|0;break};case 18:{h=a+f+((ca(f<<1,a)|0)/-255|0)|0;break}}i=e;return h|0}function fAa(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;k=i;i=i+80|0;l=k+60|0;m=k+48|0;n=k+36|0;o=k+24|0;p=k+12|0;q=k;r=e&255;e=d&255;d=b&255;b=h&255;h=g&255;g=f&255;if((a|0)==21){f=h>>>0<b>>>0?h:b;s=h>>>0>b>>>0?h:b;hAa(m,r,e,d,(g>>>0>s>>>0?g:s)-(g>>>0<f>>>0?g:f)|0);gAa(l,c[m>>2]|0,c[m+4>>2]|0,c[m+8>>2]|0,(((h*59|0)+(b*30|0)+(g*11|0)|0)>>>0)/100|0);t=c[l>>2]|0;u=c[l+4>>2]|0;v=c[l+8>>2]|0}else if((a|0)==23){gAa(p,r,e,d,(((h*59|0)+(b*30|0)+(g*11|0)|0)>>>0)/100|0);t=c[p>>2]|0;u=c[p+4>>2]|0;v=c[p+8>>2]|0}else if((a|0)==22){p=e>>>0<r>>>0?e:r;l=e>>>0>r>>>0?e:r;hAa(o,b,h,g,(d>>>0>l>>>0?d:l)-(d>>>0<p>>>0?d:p)|0);gAa(n,c[o>>2]|0,c[o+4>>2]|0,c[o+8>>2]|0,(((h*59|0)+(b*30|0)+(g*11|0)|0)>>>0)/100|0);t=c[n>>2]|0;u=c[n+4>>2]|0;v=c[n+8>>2]|0}else if((a|0)==24){gAa(q,b,h,g,(((e*59|0)+(r*30|0)+(d*11|0)|0)>>>0)/100|0);t=c[q>>2]|0;u=c[q+4>>2]|0;v=c[q+8>>2]|0}else{t=0;u=0;v=0}c[j>>2]=v;c[j+4>>2]=u;c[j+8>>2]=t;i=k;return}function gAa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;g=i;h=f-(((d*59|0)+(b*30|0)+(e*11|0)|0)/100|0)|0;f=h+b|0;b=h+d|0;d=h+e|0;e=((d*11|0)+(f*30|0)+(b*59|0)|0)/100|0;h=(b|0)<(f|0)?b:f;j=(d|0)<(h|0)?d:h;h=(b|0)>(f|0)?b:f;k=(d|0)>(h|0)?d:h;if((j|0)<0){h=e-j|0;l=((ca(f-e|0,e)|0)/(h|0)|0)+e|0;m=((ca(b-e|0,e)|0)/(h|0)|0)+e|0;n=((ca(d-e|0,e)|0)/(h|0)|0)+e|0}else{l=f;m=b;n=d}if((k|0)<=255){o=l;p=m;q=n;c[a>>2]=o;r=a+4|0;c[r>>2]=p;s=a+8|0;c[s>>2]=q;i=g;return}d=255-e|0;b=k-e|0;o=((ca(l-e|0,d)|0)/(b|0)|0)+e|0;p=((ca(m-e|0,d)|0)/(b|0)|0)+e|0;q=((ca(n-e|0,d)|0)/(b|0)|0)+e|0;c[a>>2]=o;r=a+4|0;c[r>>2]=p;s=a+8|0;c[s>>2]=q;i=g;return}function hAa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0;g=i;i=i+16|0;h=g;c[h>>2]=b;j=h+4|0;c[j>>2]=d;k=h+8|0;c[k>>2]=e;l=(d|0)>(b|0)?j:h;m=(c[l>>2]|0)<(e|0)?k:l;l=(d|0)<(b|0)?j:h;b=(c[l>>2]|0)>(e|0)?k:l;l=c[m>>2]|0;e=c[b>>2]|0;if((l|0)==(e|0)){c[h>>2]=0;c[j>>2]=0;c[k>>2]=0;c[a+0>>2]=c[h+0>>2];c[a+4>>2]=c[h+4>>2];c[a+8>>2]=c[h+8>>2];i=g;return}do{if((m|0)!=(h|0)){if((m|0)==(j|0)){n=(b|0)==(h|0)?k:h;break}else{n=(b|0)==(j|0)?h:j;break}}else{n=(b|0)==(j|0)?k:j}}while(0);if((l|0)>(e|0)){c[n>>2]=(ca((c[n>>2]|0)-e|0,f)|0)/(l-e|0)|0;c[m>>2]=f;c[b>>2]=0}c[a+0>>2]=c[h+0>>2];c[a+4>>2]=c[h+4>>2];c[a+8>>2]=c[h+8>>2];i=g;return}function iAa(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;if((e|0)<=0){i=g;return}h=(f|0)==0;j=c;c=b;b=0;while(1){k=d[j>>0]|0;j=j+1|0;if(h){l=k}else{l=((ca(d[f+b>>0]|0,k)|0)>>>0)/255|0}k=a[c>>0]|0;if(!(k<<24>>24==0)){if((l|0)!=0){m=k&255;a[c>>0]=m+l-(((ca(m,l)|0)>>>0)/255|0)}}else{a[c>>0]=l}b=b+1|0;if((b|0)==(e|0)){break}else{c=c+1|0}}i=g;return}function jAa(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;if((e|0)==0){f3a(b|0,-1,c|0)|0;i=f;return}if((c|0)>0){g=b;h=e;j=0}else{i=f;return}while(1){e=d[g>>0]|0;b=d[h>>0]|0;a[g>>0]=b+e-(((ca(b,e)|0)>>>0)/255|0);j=j+1|0;if((j|0)==(c|0)){break}else{g=g+1|0;h=h+1|0}}i=f;return}function kAa(b,e,f,g,h,j,k,l){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;m=i;i=i+16|0;n=m+3|0;o=m+2|0;p=m+1|0;q=m;r=(l|0)!=0;if(r){s=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0}else{s=0}if((g|0)==0){t=(f|0)>0;if((j|0)==0){if(!t){i=m;return}u=(h|0)==0;v=k;w=b;x=e;y=0;while(1){z=a[v>>0]|0;A=z&255;B=a[x+3>>0]|0;if(z<<24>>24==0){z=B&255;if(u){C=z}else{C=((ca(d[h+y>>0]|0,z)|0)>>>0)/255|0}if((C|0)!=0){if(r){Fc[c[(c[s>>2]|0)+36>>2]&63](s,l,w,x,1)}else{a[w>>0]=((((d[x+1>>0]|0)*59|0)+((d[x>>0]|0)*11|0)+((d[x+2>>0]|0)*30|0)|0)>>>0)/100|0}a[v>>0]=C}}else{if(u){D=B}else{D=(((ca(d[h+y>>0]|0,B&255)|0)>>>0)/255|0)&255}B=D&255;if(!(D<<24>>24==0)){z=B+A-(((ca(B,A)|0)>>>0)/255|0)|0;a[v>>0]=z;A=((B*255|0)>>>0)/((z&255)>>>0)|0;if(r){Fc[c[(c[s>>2]|0)+36>>2]&63](s,l,q,x,1);E=a[q>>0]|0}else{z=(((((d[x+1>>0]|0)*59|0)+((d[x>>0]|0)*11|0)+((d[x+2>>0]|0)*30|0)|0)>>>0)/100|0)&255;a[q>>0]=z;E=z}a[w>>0]=((ca(E&255,A)|0)+(ca(d[w>>0]|0,255-A|0)|0)|0)/255|0}}y=y+1|0;if((y|0)==(f|0)){break}else{v=v+1|0;w=w+1|0;x=x+4|0}}i=m;return}else{if(!t){i=m;return}t=(h|0)==0;x=j;w=k;v=b;y=e;E=0;while(1){q=a[w>>0]|0;D=q&255;u=a[x>>0]|0;x=x+1|0;if(q<<24>>24==0){q=u&255;if(t){F=q}else{F=((ca(d[h+E>>0]|0,q)|0)>>>0)/255|0}if((F|0)!=0){if(r){Fc[c[(c[s>>2]|0)+36>>2]&63](s,l,v,y,1)}else{a[v>>0]=((((d[y+1>>0]|0)*59|0)+((d[y>>0]|0)*11|0)+((d[y+2>>0]|0)*30|0)|0)>>>0)/100|0}a[w>>0]=F}}else{if(t){G=u}else{G=(((ca(d[h+E>>0]|0,u&255)|0)>>>0)/255|0)&255}u=G&255;if(!(G<<24>>24==0)){q=u+D-(((ca(u,D)|0)>>>0)/255|0)|0;a[w>>0]=q;D=((u*255|0)>>>0)/((q&255)>>>0)|0;if(r){Fc[c[(c[s>>2]|0)+36>>2]&63](s,l,p,y,1);H=a[p>>0]|0}else{q=(((((d[y+1>>0]|0)*59|0)+((d[y>>0]|0)*11|0)+((d[y+2>>0]|0)*30|0)|0)>>>0)/100|0)&255;a[p>>0]=q;H=q}a[v>>0]=((ca(H&255,D)|0)+(ca(d[v>>0]|0,255-D|0)|0)|0)/255|0}}E=E+1|0;if((E|0)==(f|0)){break}else{w=w+1|0;v=v+1|0;y=y+3|0}}i=m;return}}y=(g|0)>20;v=(f|0)>0;if((j|0)==0){if(!v){i=m;return}w=(h|0)==0;E=k;H=e;p=b;G=0;while(1){t=a[E>>0]|0;F=t&255;x=a[H+3>>0]|0;if(t<<24>>24==0){t=x&255;if(w){I=t}else{I=((ca(d[h+G>>0]|0,t)|0)>>>0)/255|0}if((I|0)!=0){if(r){Fc[c[(c[s>>2]|0)+36>>2]&63](s,l,p,H,1)}else{a[p>>0]=((((d[H+1>>0]|0)*59|0)+((d[H>>0]|0)*11|0)+((d[H+2>>0]|0)*30|0)|0)>>>0)/100|0}a[E>>0]=I}}else{if(w){J=x}else{J=(((ca(d[h+G>>0]|0,x&255)|0)>>>0)/255|0)&255}x=J&255;if(!(J<<24>>24==0)){t=x+F-(((ca(x,F)|0)>>>0)/255|0)|0;a[E>>0]=t;F=((x*255|0)>>>0)/((t&255)>>>0)|0;if(r){Fc[c[(c[s>>2]|0)+36>>2]&63](s,l,o,H,1);K=a[o>>0]|0}else{t=(((((d[H+1>>0]|0)*59|0)+((d[H>>0]|0)*11|0)+((d[H+2>>0]|0)*30|0)|0)>>>0)/100|0)&255;a[o>>0]=t;K=t}a[p>>0]=((ca(K&255,F)|0)+(ca(d[p>>0]|0,255-F|0)|0)|0)/255|0}}G=G+1|0;if((G|0)==(f|0)){break}else{E=E+1|0;H=H+4|0;p=p+1|0}}i=m;return}if(!v){i=m;return}v=(h|0)==0;p=(g|0)==24;H=k;k=e;e=b;b=j;j=0;while(1){E=a[H>>0]|0;G=E&255;K=a[b>>0]|0;b=b+1|0;if(E<<24>>24==0){E=K&255;if(v){L=E}else{L=((ca(d[h+j>>0]|0,E)|0)>>>0)/255|0}if((L|0)!=0){if(r){Fc[c[(c[s>>2]|0)+36>>2]&63](s,l,e,k,1)}else{a[e>>0]=((((d[k+1>>0]|0)*59|0)+((d[k>>0]|0)*11|0)+((d[k+2>>0]|0)*30|0)|0)>>>0)/100|0}a[H>>0]=L}}else{if(v){M=K}else{M=(((ca(d[h+j>>0]|0,K&255)|0)>>>0)/255|0)&255}K=M&255;if(!(M<<24>>24==0)){E=K+G-(((ca(K,G)|0)>>>0)/255|0)|0;a[H>>0]=E;G=((K*255|0)>>>0)/((E&255)>>>0)|0;if(r){Fc[c[(c[s>>2]|0)+36>>2]&63](s,l,n,k,1)}else{a[n>>0]=((((d[k+1>>0]|0)*59|0)+((d[k>>0]|0)*11|0)+((d[k+2>>0]|0)*30|0)|0)>>>0)/100|0}if(y){N=d[(p?n:e)>>0]|0}else{N=eAa(g,d[e>>0]|0,d[n>>0]|0)|0}a[n>>0]=N;a[e>>0]=((ca(d[e>>0]|0,255-G|0)|0)+(ca(N&255,G)|0)|0)/255|0}}j=j+1|0;if((j|0)==(f|0)){break}else{H=H+1|0;k=k+3|0;e=e+1|0}}i=m;return}function lAa(b,e,f,g,h,j,k,l){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;m=i;i=i+16|0;n=m+1|0;o=m;p=(l|0)!=0;if(p){q=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0}else{q=0}if((h|0)==0){if((g|0)<=0){i=m;return}r=(j|0)==0;s=b;t=e;u=k;v=0;while(1){do{if(r){w=24}else{x=d[j+v>>0]|0;if((x|0)==255){w=24;break}else if((x|0)==0){break}y=d[u>>0]|0;z=y+x-(((ca(y,x)|0)>>>0)/255|0)|0;a[u>>0]=z;y=((x*255|0)>>>0)/((z&255)>>>0)|0;if(p){Fc[c[(c[q>>2]|0)+36>>2]&63](q,l,o,t,1);A=a[o>>0]|0}else{z=(((((d[t+1>>0]|0)*59|0)+((d[t>>0]|0)*11|0)+((d[t+2>>0]|0)*30|0)|0)>>>0)/100|0)&255;a[o>>0]=z;A=z}a[s>>0]=((ca(A&255,y)|0)+(ca(d[s>>0]|0,255-y|0)|0)|0)/255|0}}while(0);if((w|0)==24){w=0;if(p){Fc[c[(c[q>>2]|0)+36>>2]&63](q,l,s,t,1)}else{a[s>>0]=((((d[t+1>>0]|0)*59|0)+((d[t>>0]|0)*11|0)+((d[t+2>>0]|0)*30|0)|0)>>>0)/100|0}a[u>>0]=-1}v=v+1|0;if((v|0)==(g|0)){break}else{s=s+1|0;t=t+f|0;u=u+1|0}}i=m;return}u=(h|0)>20;if((g|0)<=0){i=m;return}t=(j|0)==0;s=(h|0)==24;v=e;e=b;b=k;k=0;while(1){w=a[b>>0]|0;A=w&255;do{if(w<<24>>24==0){if(p){Fc[c[(c[q>>2]|0)+36>>2]&63](q,l,e,v,1);break}else{a[e>>0]=((((d[v+1>>0]|0)*59|0)+((d[v>>0]|0)*11|0)+((d[v+2>>0]|0)*30|0)|0)>>>0)/100|0;break}}else{if(!t){o=a[j+k>>0]|0;if(o<<24>>24==0){break}else{B=o&255}}else{B=255}o=B+A-(((ca(B,A)|0)>>>0)/255|0)|0;a[b>>0]=o;r=((B*255|0)>>>0)/((o&255)>>>0)|0;if(p){Fc[c[(c[q>>2]|0)+36>>2]&63](q,l,n,v,1)}else{a[n>>0]=((((d[v+1>>0]|0)*59|0)+((d[v>>0]|0)*11|0)+((d[v+2>>0]|0)*30|0)|0)>>>0)/100|0}if(u){C=d[(s?n:e)>>0]|0}else{C=eAa(h,d[e>>0]|0,d[n>>0]|0)|0}a[n>>0]=C;a[e>>0]=((ca(d[e>>0]|0,255-r|0)|0)+(ca(C&255,r)|0)|0)/255|0}}while(0);k=k+1|0;if((k|0)==(g|0)){break}else{v=v+f|0;e=e+1|0;b=b+1|0}}i=m;return}function mAa(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0;l=i;i=i+16|0;m=l;n=(g|0)>20;o=(k|0)==0;p=(f|0)>0;if((j|0)==0){if(!o){if(!p){i=l;return}q=(h|0)==0;r=(g|0)==0;s=k;t=b;u=e;v=0;while(1){w=t+3|0;x=a[w>>0]|0;y=x&255;if(!(x<<24>>24==0)){if(q){z=a[s>>0]|0}else{z=(((ca(d[s>>0]|0,d[h+v>>0]|0)|0)>>>0)/255|0)&255}x=s+1|0;A=z&255;if(z<<24>>24==0){B=x}else{C=A+y-(((ca(A,y)|0)>>>0)/255|0)|0;a[w>>0]=C;D=((A*255|0)>>>0)/((C&255)>>>0)|0;if(n){fAa(g,a[u>>0]|0,a[u+1>>0]|0,a[u+2>>0]|0,a[t>>0]|0,a[t+1>>0]|0,a[t+2>>0]|0,m)}C=255-D|0;A=y^255;E=t;F=u;G=0;while(1){if(r){H=ca(d[E>>0]|0,C)|0;I=(ca(d[F>>0]|0,D)|0)+H|0}else{if(n){J=a[F>>0]|0;K=c[m+(G<<2)>>2]|0;L=a[E>>0]|0}else{H=a[E>>0]|0;M=a[F>>0]|0;J=M;K=eAa(g,H&255,M&255)|0;L=H}I=(ca(L&255,C)|0)+(ca(((ca(J&255,A)|0)+(ca(K,y)|0)|0)/255|0,D)|0)|0}a[E>>0]=(I|0)/255|0;G=G+1|0;if((G|0)==3){B=x;break}else{E=E+1|0;F=F+1|0}}}}else{a[t>>0]=a[u>>0]|0;a[t+1>>0]=a[u+1>>0]|0;a[t+2>>0]=a[u+2>>0]|0;a[w>>0]=0;B=s+1|0}v=v+1|0;if((v|0)==(f|0)){break}else{s=B;t=t+4|0;u=u+3|0}}i=l;return}if(!p){i=l;return}u=(h|0)==0;t=(g|0)==0;B=e;s=b;v=0;while(1){I=s+3|0;K=a[I>>0]|0;J=K&255;if(!(K<<24>>24==0)){if(u){N=a[B+3>>0]|0}else{N=(((ca(d[B+3>>0]|0,d[h+v>>0]|0)|0)>>>0)/255|0)&255}K=N&255;if(!(N<<24>>24==0)){L=K+J-(((ca(K,J)|0)>>>0)/255|0)|0;a[I>>0]=L;r=((K*255|0)>>>0)/((L&255)>>>0)|0;if(n){fAa(g,a[B>>0]|0,a[B+1>>0]|0,a[B+2>>0]|0,a[s>>0]|0,a[s+1>>0]|0,a[s+2>>0]|0,m)}L=255-r|0;K=J^255;z=s;q=B;F=0;while(1){if(t){E=ca(d[z>>0]|0,L)|0;O=(ca(d[q>>0]|0,r)|0)+E|0}else{if(n){P=a[q>>0]|0;Q=c[m+(F<<2)>>2]|0;R=a[z>>0]|0}else{E=a[z>>0]|0;x=a[q>>0]|0;P=x;Q=eAa(g,E&255,x&255)|0;R=E}O=(ca(R&255,L)|0)+(ca(((ca(P&255,K)|0)+(ca(Q,J)|0)|0)/255|0,r)|0)|0}a[z>>0]=(O|0)/255|0;F=F+1|0;if((F|0)==3){break}else{z=z+1|0;q=q+1|0}}}}else{if(u){a[s>>0]=a[B>>0]|0;a[s+1>>0]=a[B+1>>0]|0;a[s+2>>0]=a[B+2>>0]|0;S=a[B+3>>0]|0}else{q=((ca(d[B+3>>0]|0,d[h+v>>0]|0)|0)>>>0)/255|0;a[s>>0]=a[B>>0]|0;a[s+1>>0]=a[B+1>>0]|0;a[s+2>>0]=a[B+2>>0]|0;S=q&255}a[I>>0]=S}v=v+1|0;if((v|0)==(f|0)){break}else{B=B+4|0;s=s+4|0}}i=l;return}if(o){if(!p){i=l;return}o=(h|0)==0;s=(g|0)==0;B=e;v=b;S=j;u=0;while(1){O=a[S>>0]|0;Q=O&255;do{if(O<<24>>24==0){if(o){a[S>>0]=a[B+3>>0]|0;a[v>>0]=a[B>>0]|0;a[v+1>>0]=a[B+1>>0]|0;a[v+2>>0]=a[B+2>>0]|0;break}else{a[S>>0]=((ca(d[B+3>>0]|0,d[h+u>>0]|0)|0)>>>0)/255|0;a[v>>0]=a[B>>0]|0;a[v+1>>0]=a[B+1>>0]|0;a[v+2>>0]=a[B+2>>0]|0;break}}else{if(o){T=a[B+3>>0]|0}else{T=(((ca(d[B+3>>0]|0,d[h+u>>0]|0)|0)>>>0)/255|0)&255}P=T&255;if(!(T<<24>>24==0)){R=P+Q-(((ca(P,Q)|0)>>>0)/255|0)|0;a[S>>0]=R;t=((P*255|0)>>>0)/((R&255)>>>0)|0;if(n){fAa(g,a[B>>0]|0,a[B+1>>0]|0,a[B+2>>0]|0,a[v>>0]|0,a[v+1>>0]|0,a[v+2>>0]|0,m)}R=255-t|0;P=Q^255;N=B;q=v;z=0;while(1){if(s){F=ca(d[q>>0]|0,R)|0;U=(ca(d[N>>0]|0,t)|0)+F|0}else{if(n){V=a[N>>0]|0;W=c[m+(z<<2)>>2]|0;X=a[q>>0]|0}else{F=a[q>>0]|0;r=a[N>>0]|0;V=r;W=eAa(g,F&255,r&255)|0;X=F}U=(ca(X&255,R)|0)+(ca(((ca(V&255,P)|0)+(ca(W,Q)|0)|0)/255|0,t)|0)|0}a[q>>0]=(U|0)/255|0;z=z+1|0;if((z|0)==3){break}else{N=N+1|0;q=q+1|0}}}}}while(0);u=u+1|0;if((u|0)==(f|0)){break}else{B=B+4|0;v=v+3|0;S=S+1|0}}i=l;return}if(!p){i=l;return}p=(h|0)==0;S=(g|0)==0;v=j;j=k;k=b;b=e;e=0;while(1){B=a[v>>0]|0;u=B&255;if(!(B<<24>>24==0)){if(p){Y=a[j>>0]|0}else{Y=(((ca(d[j>>0]|0,d[h+e>>0]|0)|0)>>>0)/255|0)&255}B=j+1|0;U=Y&255;if(Y<<24>>24==0){Z=B}else{W=U+u-(((ca(U,u)|0)>>>0)/255|0)|0;a[v>>0]=W;V=((U*255|0)>>>0)/((W&255)>>>0)|0;if(n){fAa(g,a[b>>0]|0,a[b+1>>0]|0,a[b+2>>0]|0,a[k>>0]|0,a[k+1>>0]|0,a[k+2>>0]|0,m)}W=255-V|0;U=u^255;X=b;s=k;T=0;while(1){if(S){o=ca(d[s>>0]|0,W)|0;_=(ca(d[X>>0]|0,V)|0)+o|0}else{if(n){$=a[X>>0]|0;aa=c[m+(T<<2)>>2]|0;ba=a[s>>0]|0}else{o=a[s>>0]|0;Q=a[X>>0]|0;$=Q;aa=eAa(g,o&255,Q&255)|0;ba=o}_=(ca(ba&255,W)|0)+(ca(((ca($&255,U)|0)+(ca(aa,u)|0)|0)/255|0,V)|0)|0}a[s>>0]=(_|0)/255|0;T=T+1|0;if((T|0)==3){Z=B;break}else{X=X+1|0;s=s+1|0}}}}else{if(p){a[v>>0]=a[j>>0]|0;a[k>>0]=a[b>>0]|0;a[k+1>>0]=a[b+1>>0]|0;a[k+2>>0]=a[b+2>>0]|0}else{a[v>>0]=((ca(d[j>>0]|0,d[h+e>>0]|0)|0)>>>0)/255|0;a[k>>0]=a[b>>0]|0;a[k+1>>0]=a[b+1>>0]|0;a[k+2>>0]=a[b+2>>0]|0}Z=j+1|0}e=e+1|0;if((e|0)==(f|0)){break}else{v=v+1|0;j=Z;k=k+3|0;b=b+3|0}}i=l;return}function nAa(b,e,f,g,h,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;k=i;i=i+16|0;l=k;m=(g|0)>20;n=(f|0)>0;if((j|0)!=0){if(!n){i=k;return}o=j;j=b;p=e;q=0;while(1){r=a[o>>0]|0;s=r&255;if(r<<24>>24==0){a[j>>0]=a[p>>0]|0;a[j+1>>0]=a[p+1>>0]|0;a[j+2>>0]=a[p+2>>0]|0;a[o>>0]=-1}else{a[o>>0]=-1;if(m){fAa(g,a[p>>0]|0,a[p+1>>0]|0,a[p+2>>0]|0,a[j>>0]|0,a[j+1>>0]|0,a[j+2>>0]|0,l)}r=s^255;t=j;u=p;v=0;while(1){w=d[u>>0]|0;if(m){x=c[l+(v<<2)>>2]|0}else{x=eAa(g,d[t>>0]|0,w)|0}a[t>>0]=((ca(x,s)|0)+(ca(w,r)|0)|0)/255|0;v=v+1|0;if((v|0)==3){break}else{t=t+1|0;u=u+1|0}}}q=q+1|0;if((q|0)==(f|0)){break}else{o=o+1|0;j=j+3|0;p=p+h|0}}i=k;return}if(!n){i=k;return}n=(h|0)==4;p=e;e=b;b=0;while(1){j=e+3|0;o=a[j>>0]|0;q=o&255;if(o<<24>>24==0){if(n){a[e>>0]=a[p>>0]|0;a[e+1>>0]=a[p+1>>0]|0;a[e+2>>0]=a[p+2>>0]|0}else{a[e>>0]=a[p>>0]|0;a[e+1>>0]=a[p+1>>0]|0;a[e+2>>0]=a[p+2>>0]|0}a[j>>0]=-1}else{a[j>>0]=-1;if(m){fAa(g,a[p>>0]|0,a[p+1>>0]|0,a[p+2>>0]|0,a[e>>0]|0,a[e+1>>0]|0,a[e+2>>0]|0,l)}j=q^255;o=e;x=p;u=0;while(1){t=d[x>>0]|0;if(m){y=c[l+(u<<2)>>2]|0}else{y=eAa(g,d[o>>0]|0,t)|0}a[o>>0]=((ca(y,q)|0)+(ca(t,j)|0)|0)/255|0;u=u+1|0;if((u|0)==3){break}else{o=o+1|0;x=x+1|0}}}b=b+1|0;if((b|0)==(f|0)){break}else{p=p+h|0;e=e+4|0}}i=k;return}function oAa(b,e,f,g,h,j,k,l,m){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0;n=i;i=i+16|0;o=n;p=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;q=(j|0)==0;a:do{if((k|0)!=0){if(!q){Fc[c[(c[p>>2]|0)+36>>2]&63](p,m,l,e,f);r=k;break}if((f|0)>0){s=e;t=k;u=0;v=l;while(1){Fc[c[(c[p>>2]|0)+36>>2]&63](p,m,v,s,1);a[v+3>>0]=a[t>>0]|0;u=u+1|0;if((u|0)==(f|0)){r=0;break}else{s=s+3|0;t=t+1|0;v=v+4|0}}}else{r=0}}else{if(q){if((f|0)<=0){r=0;break}v=e;t=0;s=l;while(1){Fc[c[(c[p>>2]|0)+36>>2]&63](p,m,s,v,1);a[s+3>>0]=a[v+3>>0]|0;t=t+1|0;if((t|0)==(f|0)){r=0;break a}else{v=v+4|0;s=s+4|0}}}s=(g|0)>20;if((f|0)<=0){i=n;return}v=(h|0)==0;t=(g|0)==0;u=b;w=j;x=l;y=e;z=0;while(1){Fc[c[(c[p>>2]|0)+36>>2]&63](p,m,x,y,1);A=a[w>>0]|0;B=A&255;if(!(A<<24>>24==0)){if(v){C=a[y+3>>0]|0}else{C=(((ca(d[y+3>>0]|0,d[h+z>>0]|0)|0)>>>0)/255|0)&255}A=y+4|0;D=C&255;if(C<<24>>24==0){E=A}else{F=D+B-(((ca(D,B)|0)>>>0)/255|0)|0;a[w>>0]=F;G=((D*255|0)>>>0)/((F&255)>>>0)|0;if(s){fAa(g,a[x>>0]|0,a[x+1>>0]|0,a[x+2>>0]|0,a[u>>0]|0,a[u+1>>0]|0,a[u+2>>0]|0,o)}F=255-G|0;D=B^255;H=x;I=u;J=0;while(1){if(t){K=ca(d[I>>0]|0,F)|0;L=(ca(d[H>>0]|0,G)|0)+K|0}else{if(s){M=c[o+(J<<2)>>2]|0;N=a[I>>0]|0;O=a[H>>0]|0}else{K=a[I>>0]|0;P=a[H>>0]|0;M=eAa(g,K&255,P&255)|0;N=K;O=P}L=(ca(N&255,F)|0)+(ca(((ca(O&255,D)|0)+(ca(M,B)|0)|0)/255|0,G)|0)|0}a[I>>0]=(L|0)/255|0;J=J+1|0;if((J|0)==3){E=A;break}else{H=H+1|0;I=I+1|0}}}}else{if(v){a[w>>0]=a[y+3>>0]|0;a[u>>0]=a[x>>0]|0;a[u+1>>0]=a[x+1>>0]|0;a[u+2>>0]=a[x+2>>0]|0}else{a[w>>0]=((ca(d[y+3>>0]|0,d[h+z>>0]|0)|0)>>>0)/255|0;a[u>>0]=a[x>>0]|0;a[u+1>>0]=a[x+1>>0]|0;a[u+2>>0]=a[x+2>>0]|0}E=y+4|0}z=z+1|0;if((z|0)==(f|0)){break}else{u=u+3|0;w=w+1|0;x=x+3|0;y=E}}i=n;return}}while(0);mAa(b,l,f,g,h,j,r);i=n;return}function pAa(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0;k=i;l=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;if((f|0)!=3){if((d|0)>0){f=b;m=0;n=h;while(1){Fc[c[(c[l>>2]|0)+36>>2]&63](l,j,n,f,1);m=m+1|0;if((m|0)==(d|0)){break}else{f=f+4|0;n=n+3|0}}}}else{Fc[c[(c[l>>2]|0)+36>>2]&63](l,j,h,b,d)}nAa(a,h,d,e,3,g);i=k;return}function qAa(b,c,e,f,g,h,j,k){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;l=i;if((f|0)<=0){i=l;return}m=(j|0)==0;n=k;k=b;b=0;while(1){o=b+e|0;p=(1<<7-((o|0)%8|0)&(d[c+((o|0)/8|0)>>0]|0)|0)==0?g:h;o=p>>>16;q=o&255;r=p&255;s=p>>>8;t=s&255;do{if(m){u=5}else{v=a[j+b>>0]|0;w=v&255;if(v<<24>>24==-1){u=5;break}else if(v<<24>>24==0){break}v=d[n>>0]|0;x=v+w-(((ca(v,w)|0)>>>0)/255|0)|0;a[n>>0]=x;v=((w*255|0)>>>0)/((x&255)>>>0)|0;x=255-v|0;a[k>>0]=((ca(d[k>>0]|0,x)|0)+(ca(v,r)|0)|0)/255|0;w=k+1|0;a[w>>0]=((ca(d[w>>0]|0,x)|0)+(ca(v,t)|0)|0)/255|0;w=k+2|0;a[w>>0]=((ca(d[w>>0]|0,x)|0)+(ca(v,q)|0)|0)/255|0}}while(0);if((u|0)==5){u=0;a[k>>0]=p;a[k+1>>0]=s;a[k+2>>0]=o;a[n>>0]=-1}b=b+1|0;if((b|0)==(f|0)){break}else{n=n+1|0;k=k+3|0}}i=l;return}function rAa(b,e,f,g,h,j,k,l,m){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;n=i;i=i+16|0;o=n;if((k|0)<=0){i=n;return}p=(m|0)==0;q=h<<8|g<<16|j;r=j&255;s=(l|0)>20;t=h&255;u=g&255;v=o+4|0;w=o+8|0;x=(l|0)==0;y=q>>>8&255;z=q>>>16&255;A=b;b=0;while(1){if(p){B=ca(d[e+b>>0]|0,f)|0}else{C=ca(d[m+b>>0]|0,f)|0;B=(ca(C,d[e+b>>0]|0)|0)/255|0}C=(B|0)/255|0;D=A+3|0;E=a[D>>0]|0;F=E&255;do{if(E<<24>>24==0){a[A>>0]=r;a[A+1>>0]=y;a[A+2>>0]=z;a[D>>0]=(q|C<<24)>>>24;G=A+4|0}else{if((B+254|0)>>>0<509){G=A+4|0;break}H=F+C+((ca(F,C)|0)/-255|0)|0;a[D>>0]=H;I=(C*255|0)/(H&255|0)|0;H=a[A>>0]|0;do{if(!s){J=H&255;if(x){K=255-I|0;a[A>>0]=((ca(J,K)|0)+(ca(I,j)|0)|0)/255|0;L=A+1|0;a[L>>0]=((ca(d[L>>0]|0,K)|0)+(ca(I,h)|0)|0)/255|0;L=A+2|0;a[L>>0]=((ca(d[L>>0]|0,K)|0)+(ca(I,g)|0)|0)/255|0;M=L;break}else{L=F^255;K=255-I|0;a[A>>0]=((ca(((ca(eAa(l,J,j)|0,F)|0)+(ca(L,j)|0)|0)/255|0,I)|0)+(ca(J,K)|0)|0)/255|0;J=A+1|0;N=d[J>>0]|0;a[J>>0]=((ca(((ca(eAa(l,N,h)|0,F)|0)+(ca(L,h)|0)|0)/255|0,I)|0)+(ca(N,K)|0)|0)/255|0;N=A+2|0;J=d[N>>0]|0;a[N>>0]=((ca(((ca(eAa(l,J,g)|0,F)|0)+(ca(L,g)|0)|0)/255|0,I)|0)+(ca(J,K)|0)|0)/255|0;M=N;break}}else{N=A+1|0;K=A+2|0;fAa(l,r,t,u,H,a[N>>0]|0,a[K>>0]|0,o);J=255-I|0;L=ca(d[A>>0]|0,J)|0;a[A>>0]=(L+(ca(c[o>>2]|0,I)|0)|0)/255|0;L=ca(d[N>>0]|0,J)|0;a[N>>0]=(L+(ca(c[v>>2]|0,I)|0)|0)/255|0;L=ca(d[K>>0]|0,J)|0;a[K>>0]=(L+(ca(c[w>>2]|0,I)|0)|0)/255|0;M=K}}while(0);G=M+2|0}}while(0);b=b+1|0;if((b|0)==(k|0)){break}else{A=G}}i=n;return}function sAa(b,e,f,g,h,j,k,l,m,n){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;o=i;i=i+16|0;p=o;if((k|0)<=0){i=o;return}q=(m|0)==0;r=j&255;s=h&255;t=g&255;u=(l|0)>20;v=p+4|0;w=p+8|0;x=(l|0)==0;y=n;n=b;b=0;while(1){if(q){z=ca(d[e+b>>0]|0,f)|0}else{A=ca(d[m+b>>0]|0,f)|0;z=(ca(A,d[e+b>>0]|0)|0)/255|0}A=(z|0)/255|0;B=a[y>>0]|0;C=B&255;do{if(!(B<<24>>24==0)){if((z+254|0)>>>0<509){D=y+1|0;break}E=C+A+((ca(C,A)|0)/-255|0)|0;F=y+1|0;a[y>>0]=E;G=(A*255|0)/(E&255|0)|0;E=a[n>>0]|0;if(u){H=n+1|0;I=n+2|0;fAa(l,r,s,t,E,a[H>>0]|0,a[I>>0]|0,p);J=255-G|0;K=ca(d[n>>0]|0,J)|0;a[n>>0]=(K+(ca(c[p>>2]|0,G)|0)|0)/255|0;K=ca(d[H>>0]|0,J)|0;a[H>>0]=(K+(ca(c[v>>2]|0,G)|0)|0)/255|0;K=ca(d[I>>0]|0,J)|0;a[I>>0]=(K+(ca(c[w>>2]|0,G)|0)|0)/255|0;D=F;break}K=E&255;if(x){E=255-G|0;a[n>>0]=((ca(K,E)|0)+(ca(G,j)|0)|0)/255|0;I=n+1|0;a[I>>0]=((ca(d[I>>0]|0,E)|0)+(ca(G,h)|0)|0)/255|0;I=n+2|0;a[I>>0]=((ca(d[I>>0]|0,E)|0)+(ca(G,g)|0)|0)/255|0;D=F;break}else{E=C^255;I=255-G|0;a[n>>0]=((ca(((ca(eAa(l,K,j)|0,C)|0)+(ca(E,j)|0)|0)/255|0,G)|0)+(ca(K,I)|0)|0)/255|0;K=n+1|0;J=d[K>>0]|0;a[K>>0]=((ca(((ca(eAa(l,J,h)|0,C)|0)+(ca(E,h)|0)|0)/255|0,G)|0)+(ca(J,I)|0)|0)/255|0;J=n+2|0;K=d[J>>0]|0;a[J>>0]=((ca(((ca(eAa(l,K,g)|0,C)|0)+(ca(E,g)|0)|0)/255|0,G)|0)+(ca(K,I)|0)|0)/255|0;D=F;break}}else{a[n>>0]=r;a[n+1>>0]=s;a[n+2>>0]=t;a[y>>0]=A;D=y+1|0}}while(0);b=b+1|0;if((b|0)==(k|0)){break}else{y=D;n=n+3|0}}i=o;return}function tAa(b,e,f,g,h,j,k,l,m,n){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;o=i;i=i+16|0;p=o;if((k|0)<=0){i=o;return}q=(n|0)==0;r=(l|0)>20;s=j&255;t=h&255;u=g&255;v=p+4|0;w=p+8|0;x=m+ -2|0;y=(l|0)==0;z=b;b=0;while(1){if(q){A=ca(d[e+b>>0]|0,f)|0}else{B=ca(d[n+b>>0]|0,f)|0;A=(ca(B,d[e+b>>0]|0)|0)/255|0}B=(A|0)/255|0;if((A+254|0)>>>0<509){C=z+m|0}else{D=a[z>>0]|0;do{if(!r){E=D&255;if(y){F=255-B|0;a[z>>0]=((ca(E,F)|0)+(ca(B,j)|0)|0)/255|0;G=z+1|0;a[G>>0]=((ca(d[G>>0]|0,F)|0)+(ca(B,h)|0)|0)/255|0;G=z+2|0;a[G>>0]=((ca(d[G>>0]|0,F)|0)+(ca(B,g)|0)|0)/255|0;H=G;break}else{G=255-B|0;a[z>>0]=((ca(eAa(l,E,j)|0,B)|0)+(ca(E,G)|0)|0)/255|0;E=z+1|0;F=d[E>>0]|0;a[E>>0]=((ca(F,G)|0)+(ca(eAa(l,F,h)|0,B)|0)|0)/255|0;F=z+2|0;E=d[F>>0]|0;a[F>>0]=((ca(E,G)|0)+(ca(eAa(l,E,g)|0,B)|0)|0)/255|0;H=F;break}}else{F=z+1|0;E=z+2|0;fAa(l,s,t,u,D,a[F>>0]|0,a[E>>0]|0,p);G=255-B|0;I=ca(d[z>>0]|0,G)|0;a[z>>0]=(I+(ca(c[p>>2]|0,B)|0)|0)/255|0;I=ca(d[F>>0]|0,G)|0;a[F>>0]=(I+(ca(c[v>>2]|0,B)|0)|0)/255|0;I=ca(d[E>>0]|0,G)|0;a[E>>0]=(I+(ca(c[w>>2]|0,B)|0)|0)/255|0;H=E}}while(0);C=H+x|0}b=b+1|0;if((b|0)==(k|0)){break}else{z=C}}i=o;return}function uAa(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0;h=i;if((f|0)<=0){i=h;return}j=(g|0)==0;k=b;b=0;while(1){if(j){l=ca(d[c+b>>0]|0,e)|0}else{m=ca(d[g+b>>0]|0,e)|0;l=(ca(m,d[c+b>>0]|0)|0)/255|0}m=(l|0)/255|0;n=a[k>>0]|0;if(!(n<<24>>24==0)){if((l+254|0)>>>0>508){o=n&255;a[k>>0]=o+m+((ca(o,m)|0)/-255|0)}}else{a[k>>0]=m}b=b+1|0;if((b|0)==(f|0)){break}else{k=k+1|0}}i=h;return}function vAa(b,c,e,f,g,h){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0;j=i;if((g|0)<=0){i=j;return}k=(h|0)==0;l=b;b=0;while(1){if(k){m=ca(d[c+b>>0]|0,e)|0}else{n=ca(d[h+b>>0]|0,e)|0;m=(ca(n,d[c+b>>0]|0)|0)/255|0}n=(m|0)/255|0;if((m+254|0)>>>0>508){a[l>>0]=((ca(d[l>>0]|0,255-n|0)|0)+(ca(n,f)|0)|0)/255|0}b=b+1|0;if((b|0)==(g|0)){break}else{l=l+1|0}}i=j;return}function wAa(b,c,e,f,g,h,j){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;k=i;if((g|0)<=0){i=k;return}l=(h|0)==0;m=f&255;n=j;j=b;b=0;while(1){if(l){o=ca(d[c+b>>0]|0,e)|0}else{p=ca(d[h+b>>0]|0,e)|0;o=(ca(p,d[c+b>>0]|0)|0)/255|0}p=(o|0)/255|0;q=a[n>>0]|0;r=q&255;if(!(q<<24>>24==0)){if(!((o+254|0)>>>0<509)){q=r+p+((ca(r,p)|0)/-255|0)|0;a[n>>0]=q;r=(p*255|0)/(q&255|0)|0;a[j>>0]=((ca(d[j>>0]|0,255-r|0)|0)+(ca(r,f)|0)|0)/255|0}}else{a[j>>0]=m;a[n>>0]=p}b=b+1|0;if((b|0)==(g|0)){break}else{n=n+1|0;j=j+1|0}}i=k;return}function xAa(b,e,f,g,h,j,k,l,m,n){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;o=i;i=i+16|0;p=o;q=(m|0)==0;r=(n|0)==0;if(q&r&(f|0)==255){s=h<<8|g<<16|j;if((l|0)<=0){i=o;return}t=j&255;u=s>>>8&255;v=s>>>16&255;s=b;w=0;while(1){x=w+k|0;if((1<<7-((x|0)%8|0)&(d[e+((x|0)/8|0)>>0]|0)|0)!=0){a[s>>0]=t;a[s+1>>0]=u;a[s+2>>0]=v;a[s+3>>0]=-1}w=w+1|0;if((w|0)==(l|0)){break}else{s=s+4|0}}i=o;return}if((l|0)<=0){i=o;return}s=h<<8|g<<16|j;w=j&255;v=(m|0)>20;u=h&255;t=g&255;x=p+4|0;y=p+8|0;z=s>>>8&255;A=s>>>16&255;B=b;b=0;while(1){C=b+k|0;do{if((1<<7-((C|0)%8|0)&(d[e+((C|0)/8|0)>>0]|0)|0)==0){D=B+4|0}else{if(r){E=f}else{E=(ca(d[n+b>>0]|0,f)|0)/255|0}F=B+3|0;G=a[F>>0]|0;H=G&255;if(G<<24>>24==0){a[B>>0]=w;a[B+1>>0]=z;a[B+2>>0]=A;a[F>>0]=(s|E<<24)>>>24;D=B+4|0;break}G=H+E+((ca(H,E)|0)/-255|0)|0;a[F>>0]=G;F=(E*255|0)/(G&255|0)|0;G=a[B>>0]|0;do{if(!v){I=G&255;if(q){J=255-F|0;a[B>>0]=((ca(I,J)|0)+(ca(F,j)|0)|0)/255|0;K=B+1|0;a[K>>0]=((ca(d[K>>0]|0,J)|0)+(ca(F,h)|0)|0)/255|0;K=B+2|0;a[K>>0]=((ca(d[K>>0]|0,J)|0)+(ca(F,g)|0)|0)/255|0;L=K;break}else{K=H^255;J=255-F|0;a[B>>0]=((ca(((ca(eAa(m,I,j)|0,H)|0)+(ca(K,j)|0)|0)/255|0,F)|0)+(ca(I,J)|0)|0)/255|0;I=B+1|0;M=d[I>>0]|0;a[I>>0]=((ca(((ca(eAa(m,M,h)|0,H)|0)+(ca(K,h)|0)|0)/255|0,F)|0)+(ca(M,J)|0)|0)/255|0;M=B+2|0;I=d[M>>0]|0;a[M>>0]=((ca(((ca(eAa(m,I,g)|0,H)|0)+(ca(K,g)|0)|0)/255|0,F)|0)+(ca(I,J)|0)|0)/255|0;L=M;break}}else{M=B+1|0;J=B+2|0;fAa(m,w,u,t,G,a[M>>0]|0,a[J>>0]|0,p);I=255-F|0;K=ca(d[B>>0]|0,I)|0;a[B>>0]=(K+(ca(c[p>>2]|0,F)|0)|0)/255|0;K=ca(d[M>>0]|0,I)|0;a[M>>0]=(K+(ca(c[x>>2]|0,F)|0)|0)/255|0;K=ca(d[J>>0]|0,I)|0;a[J>>0]=(K+(ca(c[y>>2]|0,F)|0)|0)/255|0;L=J}}while(0);D=L+2|0}}while(0);b=b+1|0;if((b|0)==(l|0)){break}else{B=D}}i=o;return}function yAa(b,e,f,g,h,j,k,l,m,n,o){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;var p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;p=i;i=i+16|0;q=p;r=(m|0)==0;s=(o|0)==0;t=(l|0)>0;if(r&s&(f|0)==255){if(!t){i=p;return}u=g&255;v=h&255;w=j&255;x=b;y=0;while(1){z=y+k|0;if((1<<7-((z|0)%8|0)&(d[e+((z|0)/8|0)>>0]|0)|0)!=0){a[x+2>>0]=u;a[x+1>>0]=v;a[x>>0]=w}y=y+1|0;if((y|0)==(l|0)){break}else{x=x+n|0}}i=p;return}if(!t){i=p;return}t=(m|0)>20;x=j&255;y=h&255;w=g&255;v=q+4|0;u=q+8|0;z=n+ -2|0;A=b;b=0;while(1){B=b+k|0;do{if((1<<7-((B|0)%8|0)&(d[e+((B|0)/8|0)>>0]|0)|0)==0){C=A+n|0}else{if(s){D=f}else{D=(ca(d[o+b>>0]|0,f)|0)/255|0}if((D|0)==0){C=A+n|0;break}E=a[A>>0]|0;do{if(!t){F=E&255;if(r){G=255-D|0;a[A>>0]=((ca(F,G)|0)+(ca(D,j)|0)|0)/255|0;H=A+1|0;a[H>>0]=((ca(d[H>>0]|0,G)|0)+(ca(D,h)|0)|0)/255|0;H=A+2|0;a[H>>0]=((ca(d[H>>0]|0,G)|0)+(ca(D,g)|0)|0)/255|0;I=H;break}else{H=255-D|0;a[A>>0]=((ca(eAa(m,F,j)|0,D)|0)+(ca(F,H)|0)|0)/255|0;F=A+1|0;G=d[F>>0]|0;a[F>>0]=((ca(G,H)|0)+(ca(eAa(m,G,h)|0,D)|0)|0)/255|0;G=A+2|0;F=d[G>>0]|0;a[G>>0]=((ca(F,H)|0)+(ca(eAa(m,F,g)|0,D)|0)|0)/255|0;I=G;break}}else{G=A+1|0;F=A+2|0;fAa(m,x,y,w,E,a[G>>0]|0,a[F>>0]|0,q);H=255-D|0;J=ca(d[A>>0]|0,H)|0;a[A>>0]=(J+(ca(c[q>>2]|0,D)|0)|0)/255|0;J=ca(d[G>>0]|0,H)|0;a[G>>0]=(J+(ca(c[v>>2]|0,D)|0)|0)/255|0;J=ca(d[F>>0]|0,H)|0;a[F>>0]=(J+(ca(c[u>>2]|0,D)|0)|0)/255|0;I=F}}while(0);C=I+z|0}}while(0);b=b+1|0;if((b|0)==(l|0)){break}else{A=C}}i=p;return}function zAa(b,c,e,f,g,h){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0;j=i;if((g|0)<=0){i=j;return}k=(h|0)==0;l=b;b=0;while(1){m=b+f|0;do{if((1<<7-((m|0)%8|0)&(d[c+((m|0)/8|0)>>0]|0)|0)!=0){if(k){n=e}else{n=(ca(d[h+b>>0]|0,e)|0)/255|0}o=a[l>>0]|0;if(o<<24>>24==0){a[l>>0]=n;break}if((n|0)!=0){p=o&255;a[l>>0]=p+n+((ca(p,n)|0)/-255|0)}}}while(0);b=b+1|0;if((b|0)==(g|0)){break}else{l=l+1|0}}i=j;return}function AAa(b,c,e,f,g,h,j){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0;k=i;if((h|0)<=0){i=k;return}l=(j|0)==0;m=b;b=0;while(1){n=b+g|0;if((1<<7-((n|0)%8|0)&(d[c+((n|0)/8|0)>>0]|0)|0)!=0){if(l){o=e}else{o=(ca(d[j+b>>0]|0,e)|0)/255|0}if((o|0)!=0){a[m>>0]=((ca(d[m>>0]|0,255-o|0)|0)+(ca(o,f)|0)|0)/255|0}}b=b+1|0;if((b|0)==(h|0)){break}else{m=m+1|0}}i=k;return}function BAa(b,c,e,f,g,h,j,k){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;l=i;if((h|0)<=0){i=l;return}m=(j|0)==0;n=f&255;o=k;k=b;b=0;while(1){p=b+g|0;do{if((1<<7-((p|0)%8|0)&(d[c+((p|0)/8|0)>>0]|0)|0)!=0){if(m){q=e}else{q=(ca(d[j+b>>0]|0,e)|0)/255|0}r=a[o>>0]|0;s=r&255;if(r<<24>>24==0){a[k>>0]=n;a[o>>0]=q;break}if((q|0)!=0){r=s+q+((ca(s,q)|0)/-255|0)|0;a[o>>0]=r;s=(q*255|0)/(r&255|0)|0;a[k>>0]=((ca(d[k>>0]|0,255-s|0)|0)+(ca(s,f)|0)|0)/255|0}}}while(0);b=b+1|0;if((b|0)==(h|0)){break}else{o=o+1|0;k=k+1|0}}i=l;return}function CAa(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;j=i;i=i+16|0;k=j;l=(g|0)>20;if((f|0)<=0){i=j;return}m=(h|0)==0;n=(g|0)==0;o=e;e=b;b=0;while(1){p=e+3|0;q=a[p>>0]|0;r=q&255;do{if(q<<24>>24==0){if(m){a[p>>0]=a[o+3>>0]|0;a[e>>0]=a[o+2>>0]|0;a[e+1>>0]=a[o+1>>0]|0;a[e+2>>0]=a[o>>0]|0;break}else{a[p>>0]=((ca(d[o+3>>0]|0,d[h+b>>0]|0)|0)>>>0)/255|0;a[e>>0]=a[o+2>>0]|0;a[e+1>>0]=a[o+1>>0]|0;a[e+2>>0]=a[o>>0]|0;break}}else{if(m){s=a[o+3>>0]|0}else{s=(((ca(d[o+3>>0]|0,d[h+b>>0]|0)|0)>>>0)/255|0)&255}t=s&255;if(!(s<<24>>24==0)){u=t+r-(((ca(t,r)|0)>>>0)/255|0)|0;a[p>>0]=u;v=((t*255|0)>>>0)/((u&255)>>>0)|0;if(l){fAa(g,a[o>>0]|0,a[o+1>>0]|0,a[o+2>>0]|0,a[e+2>>0]|0,a[e+1>>0]|0,a[e>>0]|0,k)}u=255-v|0;t=r^255;w=o;x=0;while(1){y=2-x|0;if(n){z=e+y|0;A=ca(d[z>>0]|0,u)|0;a[z>>0]=((ca(d[w>>0]|0,v)|0)+A|0)/255|0}else{if(l){B=a[w>>0]|0;C=c[k+(x<<2)>>2]|0;D=a[e+y>>0]|0}else{A=a[e+y>>0]|0;z=a[w>>0]|0;B=z;C=eAa(g,A&255,z&255)|0;D=A}a[e+y>>0]=((ca(D&255,u)|0)+(ca(((ca(B&255,t)|0)+(ca(C,r)|0)|0)/255|0,v)|0)|0)/255|0}x=x+1|0;if((x|0)==3){break}else{w=w+1|0}}}}}while(0);b=b+1|0;if((b|0)==(f|0)){break}else{o=o+4|0;e=e+4|0}}i=j;return}function DAa(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;j=i;i=i+16|0;k=j;l=(g|0)>20;if((f|0)<=0){i=j;return}m=(h|0)==4;n=e;e=b;b=0;while(1){o=e+3|0;p=a[o>>0]|0;q=p&255;do{if(p<<24>>24==0){if(m){a[o>>0]=a[n+3>>0]|a[n>>0];a[e>>0]=a[n+2>>0]|0;a[e+1>>0]=a[n+1>>0]|0;a[e+2>>0]=a[n>>0]|0;break}else{a[o>>0]=-1;a[e>>0]=a[n+2>>0]|0;a[e+1>>0]=a[n+1>>0]|0;a[e+2>>0]=a[n>>0]|0;break}}else{a[o>>0]=-1;if(l){fAa(g,a[n>>0]|0,a[n+1>>0]|0,a[n+2>>0]|0,a[e+2>>0]|0,a[e+1>>0]|0,a[e>>0]|0,k)}r=q^255;s=n;t=0;while(1){u=2-t|0;v=d[s>>0]|0;if(l){w=e+u|0;x=c[k+(t<<2)>>2]|0}else{y=e+u|0;w=y;x=eAa(g,d[y>>0]|0,v)|0}a[w>>0]=((ca(x,q)|0)+(ca(v,r)|0)|0)/255|0;t=t+1|0;if((t|0)==3){break}else{s=s+1|0}}}}while(0);b=b+1|0;if((b|0)==(f|0)){break}else{n=n+h|0;e=e+4|0}}i=j;return}function EAa(b,e,f,g,h,j,k,l,m){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;n=i;i=i+16|0;o=n;if((k|0)<=0){i=n;return}p=(m|0)==0;q=h<<8|g<<16|j;r=j&255;s=(l|0)>20;t=h&255;u=g&255;v=o+4|0;w=o+8|0;x=(l|0)==0;y=q>>>16&255;z=q>>>8&255;A=b;b=0;while(1){if(p){B=ca(d[e+b>>0]|0,f)|0}else{C=ca(d[m+b>>0]|0,f)|0;B=(ca(C,d[e+b>>0]|0)|0)/255|0}C=(B|0)/255|0;D=A+3|0;E=a[D>>0]|0;F=E&255;do{if(!(E<<24>>24==0)){if(!((B+254|0)>>>0<509)){G=F+C+((ca(F,C)|0)/-255|0)|0;a[D>>0]=G;H=(C*255|0)/(G&255|0)|0;G=A+2|0;I=a[G>>0]|0;if(s){J=A+1|0;fAa(l,r,t,u,I,a[J>>0]|0,a[A>>0]|0,o);K=255-H|0;L=ca(d[G>>0]|0,K)|0;a[G>>0]=(L+(ca(c[o>>2]|0,H)|0)|0)/255|0;L=ca(d[J>>0]|0,K)|0;a[J>>0]=(L+(ca(c[v>>2]|0,H)|0)|0)/255|0;L=ca(d[A>>0]|0,K)|0;a[A>>0]=(L+(ca(c[w>>2]|0,H)|0)|0)/255|0;break}L=I&255;if(x){I=255-H|0;a[G>>0]=((ca(L,I)|0)+(ca(H,j)|0)|0)/255|0;K=A+1|0;a[K>>0]=((ca(d[K>>0]|0,I)|0)+(ca(H,h)|0)|0)/255|0;a[A>>0]=((ca(d[A>>0]|0,I)|0)+(ca(H,g)|0)|0)/255|0;break}else{I=F^255;K=255-H|0;a[G>>0]=((ca(((ca(eAa(l,L,j)|0,F)|0)+(ca(I,j)|0)|0)/255|0,H)|0)+(ca(L,K)|0)|0)/255|0;L=A+1|0;G=d[L>>0]|0;a[L>>0]=((ca(((ca(eAa(l,G,h)|0,F)|0)+(ca(I,h)|0)|0)/255|0,H)|0)+(ca(G,K)|0)|0)/255|0;G=d[A>>0]|0;a[A>>0]=((ca(((ca(eAa(l,G,g)|0,F)|0)+(ca(I,g)|0)|0)/255|0,H)|0)+(ca(G,K)|0)|0)/255|0;break}}}else{a[D>>0]=(q|C<<24)>>>24;a[A>>0]=y;a[A+1>>0]=z;a[A+2>>0]=r}}while(0);b=b+1|0;if((b|0)==(k|0)){break}else{A=A+4|0}}i=n;return}function FAa(b,e,f,g,h,j,k,l,m,n){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;o=i;i=i+16|0;p=o;if((k|0)<=0){i=o;return}q=(n|0)==0;r=(l|0)>20;s=j&255;t=h&255;u=g&255;v=p+4|0;w=p+8|0;x=(l|0)==0;y=b;b=0;while(1){if(q){z=ca(d[e+b>>0]|0,f)|0}else{A=ca(d[n+b>>0]|0,f)|0;z=(ca(A,d[e+b>>0]|0)|0)/255|0}A=(z|0)/255|0;do{if(!((z+254|0)>>>0<509)){B=y+2|0;C=a[B>>0]|0;if(r){D=y+1|0;fAa(l,s,t,u,C,a[D>>0]|0,a[y>>0]|0,p);E=255-A|0;F=ca(d[B>>0]|0,E)|0;a[B>>0]=(F+(ca(c[p>>2]|0,A)|0)|0)/255|0;F=ca(d[D>>0]|0,E)|0;a[D>>0]=(F+(ca(c[v>>2]|0,A)|0)|0)/255|0;F=ca(d[y>>0]|0,E)|0;a[y>>0]=(F+(ca(c[w>>2]|0,A)|0)|0)/255|0;break}F=C&255;if(x){C=255-A|0;a[B>>0]=((ca(F,C)|0)+(ca(A,j)|0)|0)/255|0;E=y+1|0;a[E>>0]=((ca(d[E>>0]|0,C)|0)+(ca(A,h)|0)|0)/255|0;a[y>>0]=((ca(d[y>>0]|0,C)|0)+(ca(A,g)|0)|0)/255|0;break}else{C=255-A|0;a[B>>0]=((ca(eAa(l,F,j)|0,A)|0)+(ca(F,C)|0)|0)/255|0;F=y+1|0;B=d[F>>0]|0;a[F>>0]=((ca(B,C)|0)+(ca(eAa(l,B,h)|0,A)|0)|0)/255|0;B=d[y>>0]|0;a[y>>0]=((ca(B,C)|0)+(ca(eAa(l,B,g)|0,A)|0)|0)/255|0;break}}}while(0);b=b+1|0;if((b|0)==(k|0)){break}else{y=y+m|0}}i=o;return}function GAa(b,e,f,g,h,j,k,l,m,n){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;o=i;i=i+16|0;p=o;q=(m|0)==0;r=(n|0)==0;if(q&r&(f|0)==255){s=h<<8|g<<16|j;if((l|0)<=0){i=o;return}t=s>>>16&255;u=s>>>8&255;s=j&255;v=b;w=0;while(1){x=w+k|0;if((1<<7-((x|0)%8|0)&(d[e+((x|0)/8|0)>>0]|0)|0)!=0){a[v+3>>0]=-1;a[v>>0]=t;a[v+1>>0]=u;a[v+2>>0]=s}w=w+1|0;if((w|0)==(l|0)){break}else{v=v+4|0}}i=o;return}if((l|0)<=0){i=o;return}v=h<<8|g<<16|j;w=j&255;s=(m|0)>20;u=h&255;t=g&255;x=p+4|0;y=p+8|0;z=v>>>16&255;A=v>>>8&255;B=b;b=0;while(1){C=b+k|0;do{if((1<<7-((C|0)%8|0)&(d[e+((C|0)/8|0)>>0]|0)|0)!=0){if(r){D=f}else{D=(ca(d[n+b>>0]|0,f)|0)/255|0}E=B+3|0;F=a[E>>0]|0;G=F&255;if(F<<24>>24==0){a[E>>0]=(v|D<<24)>>>24;a[B>>0]=z;a[B+1>>0]=A;a[B+2>>0]=w;break}F=G+D+((ca(G,D)|0)/-255|0)|0;a[E>>0]=F;E=(D*255|0)/(F&255|0)|0;F=B+2|0;H=a[F>>0]|0;if(s){I=B+1|0;fAa(m,w,u,t,H,a[I>>0]|0,a[B>>0]|0,p);J=255-E|0;K=ca(d[F>>0]|0,J)|0;a[F>>0]=(K+(ca(c[p>>2]|0,E)|0)|0)/255|0;K=ca(d[I>>0]|0,J)|0;a[I>>0]=(K+(ca(c[x>>2]|0,E)|0)|0)/255|0;K=ca(d[B>>0]|0,J)|0;a[B>>0]=(K+(ca(c[y>>2]|0,E)|0)|0)/255|0;break}K=H&255;if(q){H=255-E|0;a[F>>0]=((ca(K,H)|0)+(ca(E,j)|0)|0)/255|0;J=B+1|0;a[J>>0]=((ca(d[J>>0]|0,H)|0)+(ca(E,h)|0)|0)/255|0;a[B>>0]=((ca(d[B>>0]|0,H)|0)+(ca(E,g)|0)|0)/255|0;break}else{H=G^255;J=255-E|0;a[F>>0]=((ca(((ca(eAa(m,K,j)|0,G)|0)+(ca(H,j)|0)|0)/255|0,E)|0)+(ca(K,J)|0)|0)/255|0;K=B+1|0;F=d[K>>0]|0;a[K>>0]=((ca(((ca(eAa(m,F,h)|0,G)|0)+(ca(H,h)|0)|0)/255|0,E)|0)+(ca(F,J)|0)|0)/255|0;F=d[B>>0]|0;a[B>>0]=((ca(((ca(eAa(m,F,g)|0,G)|0)+(ca(H,g)|0)|0)/255|0,E)|0)+(ca(F,J)|0)|0)/255|0;break}}}while(0);b=b+1|0;if((b|0)==(l|0)){break}else{B=B+4|0}}i=o;return}function HAa(b,e,f,g,h,j,k,l,m,n,o){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;var p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;p=i;i=i+16|0;q=p;r=(m|0)==0;s=(o|0)==0;t=(l|0)>0;if(r&s&(f|0)==255){if(!t){i=p;return}u=j&255;v=h&255;w=g&255;x=b;y=0;while(1){z=y+k|0;if((1<<7-((z|0)%8|0)&(d[e+((z|0)/8|0)>>0]|0)|0)!=0){a[x+2>>0]=u;a[x+1>>0]=v;a[x>>0]=w}y=y+1|0;if((y|0)==(l|0)){break}else{x=x+n|0}}i=p;return}if(!t){i=p;return}t=(m|0)>20;x=j&255;y=h&255;w=g&255;v=q+4|0;u=q+8|0;z=b;b=0;while(1){A=b+k|0;do{if((1<<7-((A|0)%8|0)&(d[e+((A|0)/8|0)>>0]|0)|0)!=0){if(s){B=f}else{B=(ca(d[o+b>>0]|0,f)|0)/255|0}if((B|0)!=0){C=z+2|0;D=a[C>>0]|0;if(t){E=z+1|0;fAa(m,x,y,w,D,a[E>>0]|0,a[z>>0]|0,q);F=255-B|0;G=ca(d[C>>0]|0,F)|0;a[C>>0]=(G+(ca(c[q>>2]|0,B)|0)|0)/255|0;G=ca(d[E>>0]|0,F)|0;a[E>>0]=(G+(ca(c[v>>2]|0,B)|0)|0)/255|0;G=ca(d[z>>0]|0,F)|0;a[z>>0]=(G+(ca(c[u>>2]|0,B)|0)|0)/255|0;break}G=D&255;if(r){D=255-B|0;a[C>>0]=((ca(G,D)|0)+(ca(B,j)|0)|0)/255|0;F=z+1|0;a[F>>0]=((ca(d[F>>0]|0,D)|0)+(ca(B,h)|0)|0)/255|0;a[z>>0]=((ca(d[z>>0]|0,D)|0)+(ca(B,g)|0)|0)/255|0;break}else{D=255-B|0;a[C>>0]=((ca(eAa(m,G,j)|0,B)|0)+(ca(G,D)|0)|0)/255|0;G=z+1|0;C=d[G>>0]|0;a[G>>0]=((ca(C,D)|0)+(ca(eAa(m,C,h)|0,B)|0)|0)/255|0;C=d[z>>0]|0;a[z>>0]=((ca(C,D)|0)+(ca(eAa(m,C,g)|0,B)|0)|0)/255|0;break}}}}while(0);b=b+1|0;if((b|0)==(l|0)){break}else{z=z+n|0}}i=p;return}function IAa(a){a=a|0;var b=0,d=0;b=i;d=c[a+12>>2]|0;if((d|0)!=0){v2a(d)}v2a(c[a+44>>2]|0);i=b;return}function JAa(a,b,d,e,f,g,h,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0;m=i;c[a+4>>2]=d;c[a+8>>2]=b;c[a+36>>2]=g;c[a+52>>2]=j;if((c[(BGa()|0)+268>>2]|0)==0){n=0}else{n=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0}j=(n|0)==0?0:l;c[a+40>>2]=j;if((b&255|0)==1){o=0;i=m;return o|0}if((d|0)==264|(d|0)==257){KAa(b,k,f,a+16|0,a+20|0,a+24|0,a+28|0,a+32|0,n,j);o=1;i=m;return o|0}if(((j|0)==0?(d&1024|0)==0:0)?(b&1024|0)!=0:0){o=0;i=m;return o|0}f=d&255;if(!(f>>>0<9)){c[a>>2]=((j|0)!=0?64:0)+((b>>>5&32|b>>>8&2|d>>>9&1|d>>>6&16|((g|0)==0?4:0)|((h|0)!=0?8:0))^3);o=1;i=m;return o|0}if((b|0)==264){o=1;i=m;return o|0}LAa(d,b,a+12|0,e,n,j);j=b>>>8;c[a>>2]=(b|0)==544|j&2|j&4|((f|0)==1?8:0);o=1;i=m;return o|0}function KAa(a,b,e,f,g,h,j,k,l,m){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;n=i;i=i+16|0;o=n;p=n+6|0;q=n+5|0;r=n+4|0;c[o>>2]=e;s=b>>>0>255;if(s){c[f>>2]=b&255;c[g>>2]=e>>>24;c[h>>2]=e>>>16&255;c[j>>2]=e>>>8&255;c[k>>2]=e&255}else{c[f>>2]=e>>>24;c[g>>2]=e>>>16&255;c[h>>2]=e>>>8&255;c[j>>2]=e&255}if((a|0)==264){i=n;return}if((a&255|0)!=8){if(s){t=e3a(e|0)|0}else{t=e}c[o>>2]=t;if((m|0)!=0){Fc[c[(c[l>>2]|0)+36>>2]&63](l,m,o,o,1);c[g>>2]=d[o+2>>0]|0;c[h>>2]=d[o+1>>0]|0;c[j>>2]=d[o>>0]|0;i=n;return}if(!s){i=n;return}f=o+1|0;b=o+2|0;dX(t&255,t>>>8&255,t>>>16&255,t>>>24&255,b,f,o);c[g>>2]=d[b>>0]|0;c[h>>2]=d[f>>0]|0;c[j>>2]=d[o>>0]|0;i=n;return}if((m|0)!=0){if(s){u=e3a(e|0)|0}else{u=e}c[o>>2]=u;Fc[c[(c[l>>2]|0)+36>>2]&63](l,m,o,o,1);m=d[o>>0]|0;c[g>>2]=(a&1024|0)!=0?m^255:m;i=n;return}if(s){dX(c[g>>2]&255,c[h>>2]&255,c[j>>2]&255,c[k>>2]&255,p,q,r);v=((d[q>>0]|0)*59|0)+((d[r>>0]|0)*11|0)+((d[p>>0]|0)*30|0)|0}else{v=((c[h>>2]|0)*59|0)+((c[j>>2]|0)*11|0)+((c[g>>2]|0)*30|0)|0}j=(v|0)/100|0;c[g>>2]=j;if((a&1024|0)==0){i=n;return}c[g>>2]=255-j;i=n;return}function LAa(b,e,f,g,h,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;k=i;i=i+32|0;l=k+4|0;m=k;n=k+16|0;o=k+15|0;p=k+14|0;q=k+13|0;r=k+12|0;s=k+11|0;t=k+10|0;u=k+9|0;v=k+8|0;w=b&1024;x=(w|0)!=0;y=w>>>10;w=e&1024;z=(w|0)!=0;A=w>>>10;c[f>>2]=0;w=(g|0)!=0;if((j|0)!=0){if(w){B=1<<(b&255);if((e&255|0)==8){C=w2a(B,1)|0;if((C|0)==0){i=k;return}c[f>>2]=C;if((B|0)<=0){i=k;return}D=C;C=0;while(1){E=c[g+(C<<2)>>2]|0;if(x){F=e3a(E|0)|0}else{F=E}c[l>>2]=F;Fc[c[(c[h>>2]|0)+36>>2]&63](h,j,D,l,1);C=C+1|0;if((C|0)==(B|0)){break}else{D=D+1|0}}i=k;return}else{D=w2a(B,4)|0;c[f>>2]=D;if(!((D|0)!=0&(B|0)>0)){i=k;return}D=0;do{C=c[g+(D<<2)>>2]|0;if(x){G=e3a(C|0)|0}else{G=C}c[m>>2]=G;Fc[c[(c[h>>2]|0)+36>>2]&63](h,j,m,m,1);C=c[m>>2]|0;if(z){H=e3a(C|0)|0}else{H=C}c[(c[f>>2]|0)+(D<<2)>>2]=H;D=D+1|0}while((D|0)!=(B|0));i=k;return}}B=1<<(b&255);D=w2a(B,1)|0;if((D|0)==0){i=k;return}if((B|0)!=2){if((B|0)>0){H=0;do{a[D+H>>0]=H;H=H+1|0}while((H|0)!=(B|0))}}else{a[D>>0]=0;a[D+1>>0]=-1}if((e&255|0)==8){Fc[c[(c[h>>2]|0)+36>>2]&63](h,j,D,D,B);c[f>>2]=D;i=k;return}H=w2a(B,4)|0;c[f>>2]=H;if((H|0)==0){v2a(D);i=k;return}a:do{if((B|0)>0){m=H;G=0;while(1){Fc[c[(c[h>>2]|0)+36>>2]&63](h,j,m+(G<<2)|0,D+G|0,1);C=(c[f>>2]|0)+(G<<2)|0;l=c[C>>2]|0;if(z){I=e3a(l|0)|0}else{I=l}c[C>>2]=I;C=G+1|0;if((C|0)==(B|0)){break a}m=c[f>>2]|0;G=C}}}while(0);v2a(D);i=k;return}D=(e&255|0)==8;e=1<<(b&255);if(w){if(!D){w=w2a(e,4)|0;c[f>>2]=w;if((w|0)==0){i=k;return}if((A|0)==(y|0)){c3a(w|0,g|0,e<<2|0)|0;i=k;return}if((e|0)>0){J=0}else{i=k;return}do{w=c[g+(J<<2)>>2]|0;dX(w>>>24&255,w>>>16&255,w>>>8&255,w&255,q,r,s);c[(c[f>>2]|0)+(J<<2)>>2]=(d[q>>0]|0)<<16|(d[r>>0]|0)<<8|(d[s>>0]|0)|-16777216;J=J+1|0}while((J|0)!=(e|0));i=k;return}J=w2a(e,1)|0;if((J|0)==0){i=k;return}c[f>>2]=J;s=(e|0)>0;if(x){if(s){K=J;L=0}else{i=k;return}while(1){r=c[g+(L<<2)>>2]|0;dX(r>>>24&255,r>>>16&255,r>>>8&255,r&255,n,o,p);a[K>>0]=((((d[o>>0]|0)*59|0)+((d[p>>0]|0)*11|0)+((d[n>>0]|0)*30|0)|0)>>>0)/100|0;L=L+1|0;if((L|0)==(e|0)){break}else{K=K+1|0}}i=k;return}else{if(s){M=J;N=0}else{i=k;return}while(1){J=c[g+(N<<2)>>2]|0;a[M>>0]=((((J>>>8&255)*59|0)+((J&255)*11|0)+((J>>>16&255)*30|0)|0)>>>0)/100|0;N=N+1|0;if((N|0)==(e|0)){break}else{M=M+1|0}}i=k;return}}if(D){D=w2a(e,1)|0;if((D|0)==0){i=k;return}if((e|0)!=2){if((e|0)>0){M=0;do{a[D+M>>0]=M;M=M+1|0}while((M|0)!=(e|0))}}else{a[D>>0]=0;a[D+1>>0]=-1}c[f>>2]=D;i=k;return}D=w2a(e,4)|0;c[f>>2]=D;if((D|0)==0){i=k;return}if((e|0)==2){c[D>>2]=x?255:-16777216;c[D+4>>2]=(x^1)<<31>>31}else{if((e|0)>0){O=0}else{i=k;return}do{if(x){P=255-O|0}else{P=O*65793|0}c[(c[f>>2]|0)+(O<<2)>>2]=P;O=O+1|0}while((O|0)!=(e|0))}if((y|0)!=(A|0)&(e|0)>0){Q=0}else{i=k;return}do{A=c[(c[f>>2]|0)+(Q<<2)>>2]|0;dX(A>>>24&255,A>>>16&255,A>>>8&255,A&255,t,u,v);c[(c[f>>2]|0)+(Q<<2)>>2]=(d[t>>0]|0)<<16|(d[u>>0]|0)<<8|(d[v>>0]|0)|-16777216;Q=Q+1|0}while((Q|0)!=(e|0));i=k;return}function MAa(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;l=i;m=b+4|0;n=c[m>>2]|0;o=n>>>3&31;p=b+8|0;q=c[p>>2]|0;r=q&255;s=r>>>3;if((c[b+52>>2]|0)!=0){do{switch(c[b>>2]|0){case 10:case 2:{NAa(e,f,g,c[b+36>>2]|0,s,h);i=l;return};case 14:case 6:{QAa(e,f,g,s,h);i=l;return};case 11:{TAa(e,f,g,c[b+36>>2]|0,s,o,h);i=l;return};case 3:{OAa(e,f,g,c[b+36>>2]|0,s,o);i=l;return};case 9:{SAa(e,f,g,c[b+36>>2]|0,o,h);i=l;return};case 5:{PAa(e,f,g,o);i=l;return};case 15:{VAa(e,f,g,s,o,h);i=l;return};case 1:{DAa(e,f,g,c[b+36>>2]|0,o);i=l;return};case 7:{RAa(e,f,g,s,o);i=l;return};case 13:{UAa(e,f,g,o,h);i=l;return};case 12:case 8:case 4:case 0:{CAa(e,f,g,c[b+36>>2]|0,h);i=l;return};default:{i=l;return}}}while(0)}if((q|0)==264){if((n&512|0)==0){jAa(e,g,h);i=l;return}if((n|0)==544){WAa(e,f,g,h);i=l;return}else{iAa(e,j,g,h);i=l;return}}if((r|0)==8){r=(g|0)>0;if((q&1024|0)!=0&r){t=e;u=0;while(1){a[t>>0]=(d[t>>0]|0)^255;u=u+1|0;if((u|0)==(g|0)){break}else{t=t+1|0}}v=e+g|0;w=c[m>>2]|0;x=c[p>>2]|0}else{v=e;w=n;x=q}q=(x&512|0)!=0;x=c[b+36>>2]|0;n=c[b+40>>2]|0;do{if((w&512|0)==0){if(q){lAa(v,f,o,g,x,h,k,n);break}else{YAa(v,f,o,g,x,h,n);break}}else{if(q){kAa(v,f,g,x,h,j,k,n);break}else{XAa(v,f,g,x,h,j,n);break}}}while(0);if((c[p>>2]&1024|0)!=0&r){y=v;z=0}else{i=l;return}while(1){a[y>>0]=(d[y>>0]|0)^255;z=z+1|0;if((z|0)==(g|0)){break}else{y=y+1|0}}i=l;return}y=(ca(s,g)|0)+4|0;z=b+48|0;do{if((y|0)>(c[z>>2]|0)){v=b+44|0;r=x2a(c[v>>2]|0,y)|0;c[v>>2]=r;if((r|0)==0){i=l;return}else{c[z>>2]=y;break}}}while(0);do{switch(c[b>>2]|0){case 7:{lBa(e,f,g,s,o);i=l;return};case 75:{kBa(e,f,g,c[b+36>>2]|0,s,o,h,c[b+44>>2]|0,c[b+40>>2]|0);i=l;return};case 77:{cBa(e,f,g,o,h,k,c[b+44>>2]|0,c[b+40>>2]|0);i=l;return};case 79:{oBa(e,f,g,s,o,h,c[b+44>>2]|0,c[b+40>>2]|0);i=l;return};case 10:case 2:{dBa(e,f,g,c[b+36>>2]|0,s,h,j);i=l;return};case 14:case 6:{fBa(e,f,g,s,h,j);i=l;return};case 74:case 66:{eBa(e,f,g,c[b+36>>2]|0,s,h,j,c[b+44>>2]|0,c[b+40>>2]|0);i=l;return};case 3:{hBa(e,f,g,c[b+36>>2]|0,s,o);i=l;return};case 9:{ZAa(e,f,g,c[b+36>>2]|0,o,h,k);i=l;return};case 76:case 72:case 68:case 64:{oAa(e,f,g,c[b+36>>2]|0,h,k,j,c[b+44>>2]|0,c[b+40>>2]|0);i=l;return};case 11:{jBa(e,f,g,c[b+36>>2]|0,s,o,h);i=l;return};case 73:{_Aa(e,f,g,c[b+36>>2]|0,o,h,k,c[b+44>>2]|0,c[b+40>>2]|0);i=l;return};case 65:{pAa(e,f,g,c[b+36>>2]|0,o,k,c[b+44>>2]|0,c[b+40>>2]|0);i=l;return};case 1:{nAa(e,f,g,c[b+36>>2]|0,o,k);i=l;return};case 5:{$Aa(e,f,g,o,k);i=l;return};case 71:{mBa(e,f,g,s,o,c[b+44>>2]|0,c[b+40>>2]|0);i=l;return};case 15:{nBa(e,f,g,s,o,h);i=l;return};case 12:case 8:case 4:case 0:{mAa(e,f,g,c[b+36>>2]|0,h,k,j);i=l;return};case 13:{bBa(e,f,g,o,h,k);i=l;return};case 69:{aBa(e,f,g,o,k,c[b+44>>2]|0,c[b+40>>2]|0);i=l;return};case 67:{iBa(e,f,g,c[b+36>>2]|0,s,o,c[b+44>>2]|0,c[b+40>>2]|0);i=l;return};case 78:case 70:{gBa(e,f,g,s,h,j,c[b+44>>2]|0,c[b+40>>2]|0);i=l;return};default:{i=l;return}}}while(0)}function NAa(b,e,f,g,h,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;k=i;i=i+16|0;l=k;m=(g|0)>20;if((f|0)<=0){i=k;return}n=b;b=e;e=j;j=0;while(1){o=a[b+3>>0]|0;if((e|0)==0){p=0;q=o}else{p=e+1|0;q=(((ca(d[e>>0]|0,o&255)|0)>>>0)/255|0)&255}o=q&255;if(!(q<<24>>24==0)){if(m){fAa(g,a[b>>0]|0,a[b+1>>0]|0,a[b+2>>0]|0,a[n+2>>0]|0,a[n+1>>0]|0,a[n>>0]|0,l)}r=o^255;s=b;t=0;while(1){u=n+(2-t)|0;v=d[u>>0]|0;if(m){w=c[l+(t<<2)>>2]|0}else{w=eAa(g,v,d[s>>0]|0)|0}a[u>>0]=((ca(w,o)|0)+(ca(v,r)|0)|0)/255|0;t=t+1|0;if((t|0)==3){break}else{s=s+1|0}}}j=j+1|0;if((j|0)==(f|0)){break}else{n=n+h|0;b=b+4|0;e=p}}i=k;return}function OAa(b,e,f,g,h,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;k=i;i=i+16|0;l=k;m=(g|0)>20;if((f|0)<=0){i=k;return}n=e;e=b;b=0;while(1){if(m){fAa(g,a[n>>0]|0,a[n+1>>0]|0,a[n+2>>0]|0,a[e+2>>0]|0,a[e+1>>0]|0,a[e>>0]|0,l);o=n;p=0}else{o=n;p=0}while(1){q=e+(2-p)|0;if(m){r=c[l+(p<<2)>>2]|0}else{r=eAa(g,d[q>>0]|0,d[o>>0]|0)|0}a[q>>0]=r;p=p+1|0;if((p|0)==3){break}else{o=o+1|0}}b=b+1|0;if((b|0)==(f|0)){break}else{n=n+j|0;e=e+h|0}}i=k;return}function PAa(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;if((d|0)<=0){i=f;return}g=(e|0)==4;h=c;c=b;b=0;while(1){if(g){a[c+3>>0]=a[h+3>>0]|a[h>>0];a[c>>0]=a[h+2>>0]|0;a[c+1>>0]=a[h+1>>0]|0;a[c+2>>0]=a[h>>0]|0}else{a[c+3>>0]=-1;a[c>>0]=a[h+2>>0]|0;a[c+1>>0]=a[h+1>>0]|0;a[c+2>>0]=a[h>>0]|0}b=b+1|0;if((b|0)==(d|0)){break}else{h=h+e|0;c=c+4|0}}i=f;return}function QAa(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;h=i;if((e|0)>0){j=b;k=g;l=c;m=0}else{i=h;return}while(1){c=a[l+3>>0]|0;if((k|0)==0){n=0;o=c}else{n=k+1|0;o=(((ca(d[k>>0]|0,c&255)|0)>>>0)/255|0)&255}c=o&255;if(o<<24>>24==-1){a[j+2>>0]=a[l>>0]|0;a[j+1>>0]=a[l+1>>0]|0;a[j>>0]=a[l+2>>0]|0}else if(!(o<<24>>24==0)){g=c^255;b=j+2|0;p=ca(d[b>>0]|0,g)|0;a[b>>0]=(((ca(d[l>>0]|0,c)|0)+p|0)>>>0)/255|0;p=j+1|0;b=ca(d[p>>0]|0,g)|0;a[p>>0]=(((ca(d[l+1>>0]|0,c)|0)+b|0)>>>0)/255|0;b=ca(d[j>>0]|0,g)|0;a[j>>0]=(((ca(d[l+2>>0]|0,c)|0)+b|0)>>>0)/255|0}m=m+1|0;if((m|0)==(e|0)){break}else{j=j+f|0;k=n;l=l+4|0}}i=h;return}function RAa(b,c,d,e,f){b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;if((d|0)>0){h=c;j=b;k=0}else{i=g;return}while(1){a[j+2>>0]=a[h>>0]|0;a[j+1>>0]=a[h+1>>0]|0;a[j>>0]=a[h+2>>0]|0;k=k+1|0;if((k|0)==(d|0)){break}else{h=h+f|0;j=j+e|0}}i=g;return}function SAa(b,e,f,g,h,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;k=i;i=i+16|0;l=k;m=(g|0)>20;if((f|0)<=0){i=k;return}n=e;e=j;j=b;b=0;while(1){o=a[e>>0]|0;e=e+1|0;p=o&255;q=j+3|0;r=a[q>>0]|0;s=r&255;if(!(r<<24>>24==0)){if(!(o<<24>>24==0)){o=s+p-(((ca(s,p)|0)>>>0)/255|0)|0;a[q>>0]=o;q=((p*255|0)>>>0)/((o&255)>>>0)|0;if(m){fAa(g,a[n>>0]|0,a[n+1>>0]|0,a[n+2>>0]|0,a[j+2>>0]|0,a[j+1>>0]|0,a[j>>0]|0,l)}o=s^255;p=255-q|0;r=n;t=0;while(1){u=2-t|0;v=d[r>>0]|0;if(m){w=c[l+(t<<2)>>2]|0;x=a[j+u>>0]|0}else{y=a[j+u>>0]|0;w=eAa(g,y&255,v)|0;x=y}a[j+u>>0]=((ca(x&255,p)|0)+(ca(((ca(w,s)|0)+(ca(v,o)|0)|0)/255|0,q)|0)|0)/255|0;t=t+1|0;if((t|0)==3){break}else{r=r+1|0}}}}else{a[j+2>>0]=a[n>>0]|0;a[j+1>>0]=a[n+1>>0]|0;a[j>>0]=a[n+2>>0]|0}b=b+1|0;if((b|0)==(f|0)){break}else{n=n+h|0;j=j+4|0}}i=k;return}function TAa(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;l=i;i=i+16|0;m=l;n=(g|0)>20;if((f|0)<=0){i=l;return}o=e;e=k;k=b;b=0;while(1){p=a[e>>0]|0;e=e+1|0;q=p&255;if(!(p<<24>>24==0)){if(n){fAa(g,a[o>>0]|0,a[o+1>>0]|0,a[o+2>>0]|0,a[k+2>>0]|0,a[k+1>>0]|0,a[k>>0]|0,m)}p=q^255;r=o;s=0;while(1){t=k+(2-s)|0;u=d[t>>0]|0;if(n){v=c[m+(s<<2)>>2]|0}else{v=eAa(g,u,d[r>>0]|0)|0}a[t>>0]=((ca(v,q)|0)+(ca(u,p)|0)|0)/255|0;s=s+1|0;if((s|0)==3){break}else{r=r+1|0}}}b=b+1|0;if((b|0)==(f|0)){break}else{o=o+j|0;k=k+h|0}}i=l;return}function UAa(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0;h=i;if((e|0)>0){j=c;k=b;l=0}else{i=h;return}while(1){b=a[g+l>>0]|0;c=b&255;if(b<<24>>24==-1){a[k+2>>0]=a[j>>0]|0;a[k+1>>0]=a[j+1>>0]|0;a[k>>0]=a[j+2>>0]|0;a[k+3>>0]=-1}else if(!(b<<24>>24==0)){b=k+3|0;m=d[b>>0]|0;n=m+c-(((ca(m,c)|0)>>>0)/255|0)|0;a[b>>0]=n;b=((c*255|0)>>>0)/((n&255)>>>0)|0;n=255-b|0;c=k+2|0;m=ca(d[c>>0]|0,n)|0;a[c>>0]=((ca(d[j>>0]|0,b)|0)+m|0)/255|0;m=k+1|0;c=ca(d[m>>0]|0,n)|0;a[m>>0]=((ca(d[j+1>>0]|0,b)|0)+c|0)/255|0;c=ca(d[k>>0]|0,n)|0;a[k>>0]=((ca(d[j+2>>0]|0,b)|0)+c|0)/255|0}l=l+1|0;if((l|0)==(e|0)){break}else{j=j+f|0;k=k+4|0}}i=h;return}function VAa(b,c,e,f,g,h){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0;j=i;if((e|0)>0){k=c;l=b;m=0}else{i=j;return}while(1){b=a[h+m>>0]|0;c=b&255;if(b<<24>>24==-1){a[l+2>>0]=a[k>>0]|0;a[l+1>>0]=a[k+1>>0]|0;a[l>>0]=a[k+2>>0]|0}else if(!(b<<24>>24==0)){b=l+2|0;n=c^255;o=ca(d[b>>0]|0,n)|0;a[b>>0]=(((ca(d[k>>0]|0,c)|0)+o|0)>>>0)/255|0;o=l+1|0;b=ca(d[o>>0]|0,n)|0;a[o>>0]=(((ca(d[k+1>>0]|0,c)|0)+b|0)>>>0)/255|0;b=ca(d[l>>0]|0,n)|0;a[l>>0]=(((ca(d[k+2>>0]|0,c)|0)+b|0)>>>0)/255|0}m=m+1|0;if((m|0)==(e|0)){break}else{k=k+g|0;l=l+f|0}}i=j;return}function WAa(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;if((e|0)<=0){i=g;return}h=(f|0)==0;j=c+3|0;c=b;b=0;while(1){k=d[j>>0]|0;if(h){l=k}else{l=((ca(d[f+b>>0]|0,k)|0)>>>0)/255|0}k=a[c>>0]|0;if(!(k<<24>>24==0)){if((l|0)!=0){m=k&255;a[c>>0]=m+l-(((ca(m,l)|0)>>>0)/255|0)}}else{a[c>>0]=l}b=b+1|0;if((b|0)==(e|0)){break}else{j=j+4|0;c=c+1|0}}i=g;return}function XAa(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;l=i;i=i+16|0;m=l;n=(k|0)!=0;if(n){o=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0}else{o=0}if((g|0)==0){p=(f|0)>0;if((j|0)==0){if(!p){i=l;return}q=(h|0)==0;r=b;s=e;t=0;while(1){u=d[s+3>>0]|0;if(q){v=u}else{v=((ca(d[h+t>>0]|0,u)|0)>>>0)/255|0}if((v|0)!=0){if(n){Fc[c[(c[o>>2]|0)+36>>2]&63](o,k,m,s,1);w=a[m>>0]|0}else{u=(((((d[s+1>>0]|0)*59|0)+((d[s>>0]|0)*11|0)+((d[s+2>>0]|0)*30|0)|0)>>>0)/100|0)&255;a[m>>0]=u;w=u}a[r>>0]=((ca(w&255,v)|0)+(ca(d[r>>0]|0,255-v|0)|0)|0)/255|0}t=t+1|0;if((t|0)==(f|0)){break}else{r=r+1|0;s=s+4|0}}i=l;return}else{if(!p){i=l;return}p=(h|0)==0;s=j;r=b;t=e;v=0;while(1){w=d[s>>0]|0;s=s+1|0;if(p){x=w}else{x=((ca(d[h+v>>0]|0,w)|0)>>>0)/255|0}if((x|0)!=0){if(n){Fc[c[(c[o>>2]|0)+36>>2]&63](o,k,m,t,1);y=a[m>>0]|0}else{w=(((((d[t+1>>0]|0)*59|0)+((d[t>>0]|0)*11|0)+((d[t+2>>0]|0)*30|0)|0)>>>0)/100|0)&255;a[m>>0]=w;y=w}a[r>>0]=((ca(y&255,x)|0)+(ca(d[r>>0]|0,255-x|0)|0)|0)/255|0}v=v+1|0;if((v|0)==(f|0)){break}else{r=r+1|0;t=t+3|0}}i=l;return}}t=(g|0)>20;r=(f|0)>0;if((j|0)==0){if(!r){i=l;return}v=(h|0)==0;x=(g|0)==24;y=e;p=b;s=0;while(1){w=d[y+3>>0]|0;if(v){z=w}else{z=((ca(d[h+s>>0]|0,w)|0)>>>0)/255|0}if((z|0)!=0){if(n){Fc[c[(c[o>>2]|0)+36>>2]&63](o,k,m,y,1)}else{a[m>>0]=((((d[y+1>>0]|0)*59|0)+((d[y>>0]|0)*11|0)+((d[y+2>>0]|0)*30|0)|0)>>>0)/100|0}if(t){A=d[(x?m:p)>>0]|0}else{A=eAa(g,d[p>>0]|0,d[m>>0]|0)|0}a[m>>0]=A;a[p>>0]=((ca(d[p>>0]|0,255-z|0)|0)+(ca(A&255,z)|0)|0)/255|0}s=s+1|0;if((s|0)==(f|0)){break}else{y=y+4|0;p=p+1|0}}i=l;return}else{if(!r){i=l;return}r=(h|0)==0;p=(g|0)==24;y=e;e=b;b=j;j=0;while(1){s=d[b>>0]|0;b=b+1|0;if(r){B=s}else{B=((ca(d[h+j>>0]|0,s)|0)>>>0)/255|0}if((B|0)!=0){if(n){Fc[c[(c[o>>2]|0)+36>>2]&63](o,k,m,y,1)}else{a[m>>0]=((((d[y+1>>0]|0)*59|0)+((d[y>>0]|0)*11|0)+((d[y+2>>0]|0)*30|0)|0)>>>0)/100|0}if(t){C=d[(p?m:e)>>0]|0}else{C=eAa(g,d[e>>0]|0,d[m>>0]|0)|0}a[m>>0]=C;a[e>>0]=((ca(d[e>>0]|0,255-B|0)|0)+(ca(C&255,B)|0)|0)/255|0}j=j+1|0;if((j|0)==(f|0)){break}else{y=y+3|0;e=e+1|0}}i=l;return}}function YAa(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;l=i;i=i+16|0;m=l;n=(k|0)!=0;if(n){o=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0}else{o=0}if((h|0)==0){if((g|0)<=0){i=l;return}p=(j|0)==0;q=e;r=b;s=0;while(1){if(n){Fc[c[(c[o>>2]|0)+36>>2]&63](o,k,m,q,1)}else{a[m>>0]=((((d[q+1>>0]|0)*59|0)+((d[q>>0]|0)*11|0)+((d[q+2>>0]|0)*30|0)|0)>>>0)/100|0}if(!p?(t=a[j+s>>0]|0,u=t&255,!(t<<24>>24==-1)):0){t=ca(d[r>>0]|0,u^255)|0;v=((((ca(d[m>>0]|0,u)|0)+t|0)>>>0)/255|0)&255}else{v=a[m>>0]|0}a[r>>0]=v;s=s+1|0;if((s|0)==(g|0)){break}else{q=q+f|0;r=r+1|0}}i=l;return}r=(h|0)>20;if((g|0)<=0){i=l;return}q=(h|0)==24;s=(j|0)==0;v=b;b=e;e=0;while(1){if(n){Fc[c[(c[o>>2]|0)+36>>2]&63](o,k,m,b,1)}else{a[m>>0]=((((d[b+1>>0]|0)*59|0)+((d[b>>0]|0)*11|0)+((d[b+2>>0]|0)*30|0)|0)>>>0)/100|0}if(r){w=d[(q?m:v)>>0]|0}else{w=eAa(h,d[v>>0]|0,d[m>>0]|0)|0}p=w&255;a[m>>0]=p;if(!s?(t=a[j+e>>0]|0,u=t&255,!(t<<24>>24==-1)):0){x=((((ca(d[v>>0]|0,u^255)|0)+(ca(u,w&255)|0)|0)>>>0)/255|0)&255}else{x=p}a[v>>0]=x;e=e+1|0;if((e|0)==(g|0)){break}else{v=v+1|0;b=b+f|0}}i=l;return}function ZAa(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;l=i;i=i+16|0;m=l;n=(g|0)>20;o=(f|0)>0;if((k|0)==0){if(!o){i=l;return}p=e;q=b;r=j;s=0;while(1){t=a[r>>0]|0;r=r+1|0;u=t&255;v=q+3|0;w=a[v>>0]|0;x=w&255;if(!(w<<24>>24==0)){if(!(t<<24>>24==0)){t=x+u-(((ca(x,u)|0)>>>0)/255|0)|0;a[v>>0]=t;v=((u*255|0)>>>0)/((t&255)>>>0)|0;if(n){fAa(g,a[p>>0]|0,a[p+1>>0]|0,a[p+2>>0]|0,a[q>>0]|0,a[q+1>>0]|0,a[q+2>>0]|0,m)}t=x^255;u=255-v|0;w=q;y=p;z=0;while(1){A=d[y>>0]|0;if(n){B=c[m+(z<<2)>>2]|0;C=a[w>>0]|0}else{D=a[w>>0]|0;B=eAa(g,D&255,A)|0;C=D}a[w>>0]=((ca(C&255,u)|0)+(ca(((ca(B,x)|0)+(ca(A,t)|0)|0)/255|0,v)|0)|0)/255|0;z=z+1|0;if((z|0)==3){break}else{w=w+1|0;y=y+1|0}}}}else{a[q>>0]=a[p>>0]|0;a[q+1>>0]=a[p+1>>0]|0;a[q+2>>0]=a[p+2>>0]|0}s=s+1|0;if((s|0)==(f|0)){break}else{p=p+h|0;q=q+4|0}}i=l;return}else{if(!o){i=l;return}o=k;k=j;j=b;b=e;e=0;while(1){q=a[k>>0]|0;k=k+1|0;p=q&255;s=a[o>>0]|0;B=s&255;if(!(s<<24>>24==0)){if(!(q<<24>>24==0)){q=B+p-(((ca(B,p)|0)>>>0)/255|0)|0;a[o>>0]=q;s=((p*255|0)>>>0)/((q&255)>>>0)|0;if(n){fAa(g,a[b>>0]|0,a[b+1>>0]|0,a[b+2>>0]|0,a[j>>0]|0,a[j+1>>0]|0,a[j+2>>0]|0,m)}q=B^255;p=255-s|0;C=j;r=b;y=0;while(1){w=d[r>>0]|0;if(n){E=c[m+(y<<2)>>2]|0;F=a[C>>0]|0}else{z=a[C>>0]|0;E=eAa(g,z&255,w)|0;F=z}a[C>>0]=((ca(F&255,p)|0)+(ca(((ca(E,B)|0)+(ca(w,q)|0)|0)/255|0,s)|0)|0)/255|0;y=y+1|0;if((y|0)==3){break}else{C=C+1|0;r=r+1|0}}}}else{a[j>>0]=a[b>>0]|0;a[j+1>>0]=a[b+1>>0]|0;a[j+2>>0]=a[b+2>>0]|0}e=e+1|0;if((e|0)==(f|0)){break}else{o=o+1|0;j=j+3|0;b=b+h|0}}i=l;return}}function _Aa(a,b,d,e,f,g,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0;l=i;m=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;if((f|0)!=3){if((d|0)>0){f=b;n=0;o=j;while(1){Fc[c[(c[m>>2]|0)+36>>2]&63](m,k,o,f,1);n=n+1|0;if((n|0)==(d|0)){break}else{f=f+4|0;o=o+3|0}}}}else{Fc[c[(c[m>>2]|0)+36>>2]&63](m,k,j,b,d)}ZAa(a,j,d,e,3,g,h);i=l;return}function $Aa(b,c,d,e,f){b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;h=(d|0)>0;if((f|0)!=0){if(h){j=f;k=b;l=c;m=0}else{i=g;return}while(1){a[k>>0]=a[l>>0]|0;a[k+1>>0]=a[l+1>>0]|0;a[k+2>>0]=a[l+2>>0]|0;a[j>>0]=-1;m=m+1|0;if((m|0)==(d|0)){break}else{j=j+1|0;k=k+3|0;l=l+e|0}}i=g;return}if(!h){i=g;return}h=(e|0)==4;l=c;c=b;b=0;while(1){if(h){a[c>>0]=a[l>>0]|0;a[c+1>>0]=a[l+1>>0]|0;a[c+2>>0]=a[l+2>>0]|0;a[c+3>>0]=-1}else{a[c>>0]=a[l>>0]|0;a[c+1>>0]=a[l+1>>0]|0;a[c+2>>0]=a[l+2>>0]|0;a[c+3>>0]=-1}b=b+1|0;if((b|0)==(d|0)){break}else{l=l+e|0;c=c+4|0}}i=g;return}function aBa(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0;j=i;k=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;if((e|0)!=3){if((d|0)>0){e=b;l=0;m=g;while(1){Fc[c[(c[k>>2]|0)+36>>2]&63](k,h,m,e,1);l=l+1|0;if((l|0)==(d|0)){break}else{e=e+4|0;m=m+3|0}}}}else{Fc[c[(c[k>>2]|0)+36>>2]&63](k,h,g,b,d)}$Aa(a,g,d,3,f);i=j;return}function bBa(b,c,e,f,g,h){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;j=i;k=(e|0)>0;if((h|0)==0){if(k){l=c;m=b;n=0}else{i=j;return}while(1){o=a[g+n>>0]|0;p=o&255;if(o<<24>>24==-1){a[m>>0]=a[l>>0]|0;a[m+1>>0]=a[l+1>>0]|0;a[m+2>>0]=a[l+2>>0]|0;a[m+3>>0]=-1}else if(!(o<<24>>24==0)){o=m+3|0;q=d[o>>0]|0;r=q+p-(((ca(q,p)|0)>>>0)/255|0)|0;a[o>>0]=r;o=((p*255|0)>>>0)/((r&255)>>>0)|0;r=255-o|0;p=ca(d[m>>0]|0,r)|0;a[m>>0]=((ca(d[l>>0]|0,o)|0)+p|0)/255|0;p=m+1|0;q=ca(d[p>>0]|0,r)|0;a[p>>0]=((ca(d[l+1>>0]|0,o)|0)+q|0)/255|0;q=m+2|0;p=ca(d[q>>0]|0,r)|0;a[q>>0]=((ca(d[l+2>>0]|0,o)|0)+p|0)/255|0}n=n+1|0;if((n|0)==(e|0)){break}else{l=l+f|0;m=m+4|0}}i=j;return}else{if(k){s=h;t=b;u=c;v=0}else{i=j;return}while(1){c=a[g+v>>0]|0;b=c&255;if(c<<24>>24==-1){a[t>>0]=a[u>>0]|0;a[t+1>>0]=a[u+1>>0]|0;a[t+2>>0]=a[u+2>>0]|0;a[s>>0]=-1}else if(!(c<<24>>24==0)){c=d[s>>0]|0;h=c+b-(((ca(c,b)|0)>>>0)/255|0)|0;a[s>>0]=h;c=((b*255|0)>>>0)/((h&255)>>>0)|0;h=255-c|0;b=ca(d[t>>0]|0,h)|0;a[t>>0]=((ca(d[u>>0]|0,c)|0)+b|0)/255|0;b=t+1|0;k=ca(d[b>>0]|0,h)|0;a[b>>0]=((ca(d[u+1>>0]|0,c)|0)+k|0)/255|0;k=t+2|0;b=ca(d[k>>0]|0,h)|0;a[k>>0]=((ca(d[u+2>>0]|0,c)|0)+b|0)/255|0}v=v+1|0;if((v|0)==(e|0)){break}else{s=s+1|0;t=t+3|0;u=u+f|0}}i=j;return}}function cBa(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0;k=i;l=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;if((e|0)!=3){if((d|0)>0){e=b;m=0;n=h;while(1){Fc[c[(c[l>>2]|0)+36>>2]&63](l,j,n,e,1);m=m+1|0;if((m|0)==(d|0)){break}else{e=e+4|0;n=n+3|0}}}}else{Fc[c[(c[l>>2]|0)+36>>2]&63](l,j,h,b,d)}bBa(a,h,d,3,f,g);i=k;return}function dBa(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;l=i;i=i+16|0;m=l;n=(g|0)>20;o=(f|0)>0;if((k|0)==0){if(!o){i=l;return}p=e;q=b;r=j;s=0;while(1){t=a[p+3>>0]|0;if((r|0)==0){u=0;v=t}else{u=r+1|0;v=(((ca(d[r>>0]|0,t&255)|0)>>>0)/255|0)&255}t=v&255;if(!(v<<24>>24==0)){if(n){fAa(g,a[p>>0]|0,a[p+1>>0]|0,a[p+2>>0]|0,a[q>>0]|0,a[q+1>>0]|0,a[q+2>>0]|0,m)}w=t^255;x=q;y=p;z=0;while(1){A=d[x>>0]|0;if(n){B=c[m+(z<<2)>>2]|0}else{B=eAa(g,A,d[y>>0]|0)|0}a[x>>0]=((ca(B,t)|0)+(ca(A,w)|0)|0)/255|0;z=z+1|0;if((z|0)==3){break}else{x=x+1|0;y=y+1|0}}}s=s+1|0;if((s|0)==(f|0)){break}else{p=p+4|0;q=q+h|0;r=u}}i=l;return}else{if(!o){i=l;return}o=k;k=j;j=b;b=e;e=0;while(1){u=a[o>>0]|0;o=o+1|0;if((k|0)==0){C=0;D=u}else{C=k+1|0;D=(((ca(d[k>>0]|0,u&255)|0)>>>0)/255|0)&255}u=D&255;if(!(D<<24>>24==0)){if(n){fAa(g,a[b>>0]|0,a[b+1>>0]|0,a[b+2>>0]|0,a[j>>0]|0,a[j+1>>0]|0,a[j+2>>0]|0,m)}r=u^255;q=j;p=b;s=0;while(1){B=d[q>>0]|0;if(n){E=c[m+(s<<2)>>2]|0}else{E=eAa(g,B,d[p>>0]|0)|0}a[q>>0]=((ca(E,u)|0)+(ca(B,r)|0)|0)/255|0;s=s+1|0;if((s|0)==3){break}else{q=q+1|0;p=p+1|0}}}e=e+1|0;if((e|0)==(f|0)){break}else{k=C;j=j+h|0;b=b+3|0}}i=l;return}}function eBa(b,e,f,g,h,j,k,l,m){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;n=i;i=i+16|0;o=n;p=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;if((k|0)!=0){Fc[c[(c[p>>2]|0)+36>>2]&63](p,m,l,e,f);dBa(b,l,f,g,h,j,k);i=n;return}k=(g|0)>20;if((f|0)<=0){i=n;return}q=e;e=b;b=j;j=l;l=0;while(1){Fc[c[(c[p>>2]|0)+36>>2]&63](p,m,j,q,1);r=a[q+3>>0]|0;if((b|0)==0){s=0;t=r}else{s=b+1|0;t=(((ca(d[b>>0]|0,r&255)|0)>>>0)/255|0)&255}q=q+4|0;r=t&255;if(!(t<<24>>24==0)){if(k){fAa(g,a[j>>0]|0,a[j+1>>0]|0,a[j+2>>0]|0,a[e>>0]|0,a[e+1>>0]|0,a[e+2>>0]|0,o)}u=r^255;v=j;w=e;x=0;while(1){y=d[w>>0]|0;if(k){z=c[o+(x<<2)>>2]|0}else{z=eAa(g,y,d[v>>0]|0)|0}a[w>>0]=((ca(z,r)|0)+(ca(y,u)|0)|0)/255|0;x=x+1|0;if((x|0)==3){break}else{v=v+1|0;w=w+1|0}}}l=l+1|0;if((l|0)==(f|0)){break}else{e=e+h|0;b=s;j=j+3|0}}i=n;return}function fBa(b,c,e,f,g,h){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;j=i;k=(e|0)>0;if((h|0)==0){if(k){l=b;m=g;n=c;o=0}else{i=j;return}while(1){p=a[n+3>>0]|0;if((m|0)==0){q=0;r=p}else{q=m+1|0;r=(((ca(d[m>>0]|0,p&255)|0)>>>0)/255|0)&255}p=r&255;if(r<<24>>24==-1){a[l>>0]=a[n>>0]|0;a[l+1>>0]=a[n+1>>0]|0;a[l+2>>0]=a[n+2>>0]|0}else if(!(r<<24>>24==0)){s=p^255;t=ca(d[l>>0]|0,s)|0;a[l>>0]=(((ca(d[n>>0]|0,p)|0)+t|0)>>>0)/255|0;t=l+1|0;u=ca(d[t>>0]|0,s)|0;a[t>>0]=(((ca(d[n+1>>0]|0,p)|0)+u|0)>>>0)/255|0;u=l+2|0;t=ca(d[u>>0]|0,s)|0;a[u>>0]=(((ca(d[n+2>>0]|0,p)|0)+t|0)>>>0)/255|0}o=o+1|0;if((o|0)==(e|0)){break}else{l=l+f|0;m=q;n=n+4|0}}i=j;return}else{if(k){v=h;w=g;x=b;y=c;z=0}else{i=j;return}while(1){c=a[v>>0]|0;v=v+1|0;if((w|0)==0){A=0;B=c}else{A=w+1|0;B=(((ca(d[w>>0]|0,c&255)|0)>>>0)/255|0)&255}c=B&255;if(B<<24>>24==-1){a[x>>0]=a[y>>0]|0;a[x+1>>0]=a[y+1>>0]|0;a[x+2>>0]=a[y+2>>0]|0}else if(!(B<<24>>24==0)){b=c^255;g=ca(d[x>>0]|0,b)|0;a[x>>0]=(((ca(d[y>>0]|0,c)|0)+g|0)>>>0)/255|0;g=x+1|0;h=ca(d[g>>0]|0,b)|0;a[g>>0]=(((ca(d[y+1>>0]|0,c)|0)+h|0)>>>0)/255|0;h=x+2|0;g=ca(d[h>>0]|0,b)|0;a[h>>0]=(((ca(d[y+2>>0]|0,c)|0)+g|0)>>>0)/255|0}z=z+1|0;if((z|0)==(e|0)){break}else{w=A;x=x+f|0;y=y+3|0}}i=j;return}}function gBa(b,e,f,g,h,j,k,l){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;m=i;n=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;if((j|0)!=0){Fc[c[(c[n>>2]|0)+36>>2]&63](n,l,k,e,f);fBa(b,k,f,g,h,j);i=m;return}if((f|0)<=0){i=m;return}j=e;e=b;b=h;h=k;k=0;while(1){Fc[c[(c[n>>2]|0)+36>>2]&63](n,l,h,j,1);o=a[j+3>>0]|0;if((b|0)==0){p=0;q=o}else{p=b+1|0;q=(((ca(d[b>>0]|0,o&255)|0)>>>0)/255|0)&255}j=j+4|0;o=q&255;if(q<<24>>24==-1){a[e>>0]=a[h>>0]|0;a[e+1>>0]=a[h+1>>0]|0;a[e+2>>0]=a[h+2>>0]|0}else if(!(q<<24>>24==0)){r=o^255;s=ca(d[e>>0]|0,r)|0;a[e>>0]=(((ca(d[h>>0]|0,o)|0)+s|0)>>>0)/255|0;s=e+1|0;t=ca(d[s>>0]|0,r)|0;a[s>>0]=(((ca(d[h+1>>0]|0,o)|0)+t|0)>>>0)/255|0;t=e+2|0;s=ca(d[t>>0]|0,r)|0;a[t>>0]=(((ca(d[h+2>>0]|0,o)|0)+s|0)>>>0)/255|0}k=k+1|0;if((k|0)==(f|0)){break}else{e=e+g|0;b=p;h=h+3|0}}i=m;return}function hBa(b,e,f,g,h,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;k=i;i=i+16|0;l=k;m=(g|0)>20;if((f|0)<=0){i=k;return}n=e;e=b;b=0;while(1){if(m){fAa(g,a[n>>0]|0,a[n+1>>0]|0,a[n+2>>0]|0,a[e>>0]|0,a[e+1>>0]|0,a[e+2>>0]|0,l);o=n;p=e;q=0}else{o=n;p=e;q=0}while(1){if(m){r=c[l+(q<<2)>>2]|0}else{r=eAa(g,d[p>>0]|0,d[o>>0]|0)|0}a[p>>0]=r;q=q+1|0;if((q|0)==3){break}else{o=o+1|0;p=p+1|0}}b=b+1|0;if((b|0)==(f|0)){break}else{n=n+j|0;e=e+h|0}}i=k;return}function iBa(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0;k=i;l=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;if((g|0)!=3){if((d|0)>0){g=b;m=0;n=h;while(1){Fc[c[(c[l>>2]|0)+36>>2]&63](l,j,n,g,1);m=m+1|0;if((m|0)==(d|0)){break}else{g=g+4|0;n=n+3|0}}}}else{Fc[c[(c[l>>2]|0)+36>>2]&63](l,j,h,b,d)}hBa(a,h,d,e,f,3);i=k;return}function jBa(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;l=i;i=i+16|0;m=l;n=(g|0)>20;if((f|0)<=0){i=l;return}o=b;b=e;e=k;k=0;while(1){p=a[e>>0]|0;e=e+1|0;q=p&255;if(!(p<<24>>24==0)){if(n){fAa(g,a[b>>0]|0,a[b+1>>0]|0,a[b+2>>0]|0,a[o>>0]|0,a[o+1>>0]|0,a[o+2>>0]|0,m)}p=q^255;r=b;s=o;t=0;while(1){u=d[s>>0]|0;if(n){v=c[m+(t<<2)>>2]|0}else{v=eAa(g,u,d[r>>0]|0)|0}a[s>>0]=((ca(v,q)|0)+(ca(u,p)|0)|0)/255|0;t=t+1|0;if((t|0)==3){break}else{r=r+1|0;s=s+1|0}}}k=k+1|0;if((k|0)==(f|0)){break}else{o=o+h|0;b=b+j|0}}i=l;return}function kBa(a,b,d,e,f,g,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0;l=i;m=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;if((g|0)!=3){if((d|0)>0){g=b;n=0;o=j;while(1){Fc[c[(c[m>>2]|0)+36>>2]&63](m,k,o,g,1);n=n+1|0;if((n|0)==(d|0)){break}else{g=g+4|0;o=o+3|0}}}}else{Fc[c[(c[m>>2]|0)+36>>2]&63](m,k,j,b,d)}jBa(a,j,d,e,f,3,h);i=l;return}function lBa(b,c,d,e,f){b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;if((e|0)==(f|0)){c3a(b|0,c|0,ca(e,d)|0)|0;i=g;return}if((d|0)>0){h=c;j=b;k=0}else{i=g;return}while(1){a[j>>0]=a[h>>0]|0;a[j+1>>0]=a[h+1>>0]|0;a[j+2>>0]=a[h+2>>0]|0;k=k+1|0;if((k|0)==(d|0)){break}else{h=h+f|0;j=j+e|0}}i=g;return}function mBa(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0;j=i;k=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;if((f|0)!=3){if((d|0)>0){f=b;l=0;m=g;while(1){Fc[c[(c[k>>2]|0)+36>>2]&63](k,h,m,f,1);l=l+1|0;if((l|0)==(d|0)){break}else{f=f+4|0;m=m+3|0}}}}else{Fc[c[(c[k>>2]|0)+36>>2]&63](k,h,g,b,d)}lBa(a,g,d,e,3);i=j;return}function nBa(b,c,e,f,g,h){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0;j=i;if((e|0)>0){k=c;l=b;m=0}else{i=j;return}while(1){b=a[h+m>>0]|0;c=b&255;if(b<<24>>24==-1){a[l>>0]=a[k>>0]|0;a[l+1>>0]=a[k+1>>0]|0;a[l+2>>0]=a[k+2>>0]|0}else if(!(b<<24>>24==0)){b=c^255;n=ca(d[l>>0]|0,b)|0;a[l>>0]=(((ca(d[k>>0]|0,c)|0)+n|0)>>>0)/255|0;n=l+1|0;o=ca(d[n>>0]|0,b)|0;a[n>>0]=(((ca(d[k+1>>0]|0,c)|0)+o|0)>>>0)/255|0;o=l+2|0;n=ca(d[o>>0]|0,b)|0;a[o>>0]=(((ca(d[k+2>>0]|0,c)|0)+n|0)>>>0)/255|0}m=m+1|0;if((m|0)==(e|0)){break}else{k=k+g|0;l=l+f|0}}i=j;return}function oBa(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0;k=i;l=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;if((f|0)!=3){if((d|0)>0){f=b;m=0;n=h;while(1){Fc[c[(c[l>>2]|0)+36>>2]&63](l,j,n,f,1);m=m+1|0;if((m|0)==(d|0)){break}else{f=f+4|0;n=n+3|0}}}}else{Fc[c[(c[l>>2]|0)+36>>2]&63](l,j,h,b,d)}nBa(a,h,d,e,3,g);i=k;return}function pBa(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;l=i;if((c[b+52>>2]|0)!=0){m=c[b+8>>2]|0;n=(m|0)==8;if((c[b+4>>2]|0)==1){if(n){i=l;return}o=c[b+12>>2]|0;if((m|0)==544){qBa(d,e,f,g,o,h);i=l;return}else{rBa(d,e,f,o,g,m>>>3&31,h);i=l;return}}else{if(n){i=l;return}n=c[b+12>>2]|0;if((m|0)==544){sBa(d,e,g,n,h);i=l;return}else{tBa(d,e,n,g,m>>>3&31,h);i=l;return}}}m=c[b+8>>2]|0;if((m|0)==264){jAa(d,g,h);i=l;return}n=m&255;o=c[b>>2]|0;if((n|0)==8){p=(m&512|0)!=0;m=c[b+12>>2]|0;q=c[b+36>>2]|0;if((o&8|0)==0){if(p){wBa(d,e,m,g,q,h,k,j);i=l;return}else{xBa(d,e,m,g,q,h,j);i=l;return}}else{r=a[m>>0]|0;s=a[m+1>>0]|0;if(p){uBa(d,e,f,r,s,g,q,h,k);i=l;return}else{vBa(d,e,f,r,s,g,q,h);i=l;return}}}switch(o|0){case 0:{ABa(d,e,c[b+12>>2]|0,g,n>>>3,h,j);i=l;return};case 2:{ABa(d,e,c[b+12>>2]|0,g,n>>>3,h,j);i=l;return};case 8:{o=c[b+12>>2]|0;BBa(d,e,f,c[o>>2]|0,c[o+4>>2]|0,g,n>>>3,h);i=l;return};case 11:{n=c[b+12>>2]|0;zBa(d,e,f,g,c[n>>2]|0,c[n+4>>2]|0,h);i=l;return};case 10:{n=c[b+12>>2]|0;qAa(d,e,f,g,c[n>>2]|0,c[n+4>>2]|0,h,k);i=l;return};case 3:{yBa(d,e,g,c[b+12>>2]|0,h,j);i=l;return};default:{i=l;return}}}function qBa(b,e,f,g,h,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;k=i;if((h|0)==0){l=0;m=0;n=0;o=255;p=255;q=255}else{r=c[h>>2]|0;s=c[h+4>>2]|0;l=r&255;m=r>>>8&255;n=r>>>16&255;o=s&255;p=s>>>8&255;q=s>>>16&255}if((g|0)<=0){i=k;return}s=(j|0)==0;r=b;b=0;while(1){h=b+f|0;t=(1<<7-((h|0)%8|0)&(d[e+((h|0)/8|0)>>0]|0)|0)==0;h=t?n:q;u=t?m:p;v=t?l:o;do{if(s){w=7}else{t=a[j+b>>0]|0;x=t&255;if(t<<24>>24==-1){w=7;break}else if(t<<24>>24==0){break}t=r+3|0;y=d[t>>0]|0;z=y+x-(((ca(y,x)|0)>>>0)/255|0)|0;a[t>>0]=z;t=((x*255|0)>>>0)/((z&255)>>>0)|0;z=r+2|0;x=255-t|0;a[z>>0]=((ca(d[z>>0]|0,x)|0)+(ca(t,v)|0)|0)/255|0;z=r+1|0;a[z>>0]=((ca(d[z>>0]|0,x)|0)+(ca(t,u)|0)|0)/255|0;a[r>>0]=((ca(d[r>>0]|0,x)|0)+(ca(t,h)|0)|0)/255|0}}while(0);if((w|0)==7){w=0;a[r+2>>0]=v;a[r+1>>0]=u;a[r>>0]=h;a[r+3>>0]=-1}b=b+1|0;if((b|0)==(g|0)){break}else{r=r+4|0}}i=k;return}function rBa(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;l=i;if((g|0)==0){m=0;n=0;o=0;p=255;q=255;r=255}else{s=c[g>>2]|0;t=c[g+4>>2]|0;m=s&255;n=s>>>8&255;o=s>>>16&255;p=t&255;q=t>>>8&255;r=t>>>16&255}if((h|0)<=0){i=l;return}t=(k|0)==0;s=b;b=0;while(1){g=b+f|0;u=(1<<7-((g|0)%8|0)&(d[e+((g|0)/8|0)>>0]|0)|0)==0;g=u?o:r;v=u?n:q;w=u?m:p;if(!t?(u=k+b|0,x=a[u>>0]|0,y=x&255,!(x<<24>>24==-1)):0){x=s+2|0;a[x>>0]=(((ca(d[x>>0]|0,y^255)|0)+(ca(y,w)|0)|0)>>>0)/255|0;y=s+1|0;x=d[u>>0]|0;a[y>>0]=(((ca(x^255,d[y>>0]|0)|0)+(ca(x,v)|0)|0)>>>0)/255|0;x=d[u>>0]|0;z=(((ca(x^255,d[s>>0]|0)|0)+(ca(x,g)|0)|0)>>>0)/255|0}else{a[s+2>>0]=w;a[s+1>>0]=v;z=g}a[s>>0]=z;b=b+1|0;if((b|0)==(h|0)){break}else{s=s+j|0}}i=l;return}function sBa(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;j=i;if((f|0)<=0){i=j;return}k=(g|0)==0;l=(h|0)==0;m=e;e=b;b=0;while(1){n=d[m>>0]|0;if(k){o=n;p=n;q=n}else{r=c[g+(n<<2)>>2]|0;o=r&255;p=r>>>8&255;q=r>>>16&255}do{if(l){s=7}else{r=a[h+b>>0]|0;n=r&255;if(r<<24>>24==-1){s=7;break}else if(r<<24>>24==0){break}r=e+3|0;t=d[r>>0]|0;u=t+n-(((ca(t,n)|0)>>>0)/255|0)|0;a[r>>0]=u;r=((n*255|0)>>>0)/((u&255)>>>0)|0;u=e+2|0;n=255-r|0;a[u>>0]=((ca(d[u>>0]|0,n)|0)+(ca(r,o)|0)|0)/255|0;u=e+1|0;a[u>>0]=((ca(d[u>>0]|0,n)|0)+(ca(r,p)|0)|0)/255|0;a[e>>0]=((ca(d[e>>0]|0,n)|0)+(ca(r,q)|0)|0)/255|0}}while(0);if((s|0)==7){s=0;a[e+2>>0]=o;a[e+1>>0]=p;a[e>>0]=q;a[e+3>>0]=-1}b=b+1|0;if((b|0)==(f|0)){break}else{m=m+1|0;e=e+4|0}}i=j;return}function tBa(b,e,f,g,h,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;k=i;if((g|0)<=0){i=k;return}l=(f|0)==0;m=(j|0)==0;n=e;e=b;b=0;while(1){o=d[n>>0]|0;if(l){p=o*65793|0}else{p=c[f+(o<<2)>>2]|0}o=p>>>16;q=o&255;r=p>>>8;s=r&255;t=p&255;if(!m?(u=j+b|0,v=a[u>>0]|0,w=v&255,!(v<<24>>24==-1)):0){v=e+2|0;a[v>>0]=(((ca(d[v>>0]|0,w^255)|0)+(ca(w,t)|0)|0)>>>0)/255|0;t=e+1|0;w=d[u>>0]|0;a[t>>0]=(((ca(w^255,d[t>>0]|0)|0)+(ca(w,s)|0)|0)>>>0)/255|0;s=d[u>>0]|0;x=(((ca(s^255,d[e>>0]|0)|0)+(ca(s,q)|0)|0)>>>0)/255|0}else{a[e+2>>0]=p;a[e+1>>0]=r;x=o}a[e>>0]=x;b=b+1|0;if((b|0)==(g|0)){break}else{n=n+1|0;e=e+h|0}}i=k;return}function uBa(b,c,e,f,g,h,j,k,l){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;m=i;n=f&255;f=g&255;if((j|0)==0){if((h|0)<=0){i=m;return}g=(k|0)==0;o=b;p=l;q=0;while(1){r=q+e|0;s=(1<<7-((r|0)%8|0)&(d[c+((r|0)/8|0)>>0]|0)|0)!=0?f:n;r=s&255;do{if(g){t=16}else{u=a[k+q>>0]|0;v=u&255;if(u<<24>>24==0){break}else if(u<<24>>24==-1){t=16;break}u=d[p>>0]|0;w=u+v-(((ca(u,v)|0)>>>0)/255|0)|0;a[p>>0]=w;u=((v*255|0)>>>0)/((w&255)>>>0)|0;a[o>>0]=((ca(d[o>>0]|0,255-u|0)|0)+(ca(u,s)|0)|0)/255|0}}while(0);if((t|0)==16){t=0;a[o>>0]=r;a[p>>0]=-1}q=q+1|0;if((q|0)==(h|0)){break}else{o=o+1|0;p=p+1|0}}i=m;return}p=(j|0)>20;if((h|0)<=0){i=m;return}o=(k|0)==0;q=(j|0)==24;g=l;l=b;b=0;while(1){s=b+e|0;u=(1<<7-((s|0)%8|0)&(d[c+((s|0)/8|0)>>0]|0)|0)!=0?f:n;s=u&255;do{if(o){t=8}else{w=a[k+b>>0]|0;v=w&255;if(w<<24>>24==-1){t=8;break}else if(w<<24>>24==0){break}w=d[g>>0]|0;x=w+v-(((ca(w,v)|0)>>>0)/255|0)|0;a[g>>0]=x;w=((v*255|0)>>>0)/((x&255)>>>0)|0;x=d[l>>0]|0;if(p){y=q?u:x}else{y=eAa(j,x,u)|0}a[l>>0]=((ca(x,255-w|0)|0)+(ca(y&255,w)|0)|0)/255|0}}while(0);if((t|0)==8){t=0;a[l>>0]=s;a[g>>0]=-1}b=b+1|0;if((b|0)==(h|0)){break}else{g=g+1|0;l=l+1|0}}i=m;return}function vBa(b,c,e,f,g,h,j,k){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;l=i;m=f&255;f=g&255;if((j|0)==0){if((h|0)<=0){i=l;return}g=(k|0)==0;n=b;o=0;while(1){p=o+e|0;q=(1<<7-((p|0)%8|0)&(d[c+((p|0)/8|0)>>0]|0)|0)!=0?f:m;if(!g?(p=a[k+o>>0]|0,r=p&255,!(p<<24>>24==-1)):0){s=(((ca(d[n>>0]|0,r^255)|0)+(ca(r,q)|0)|0)>>>0)/255|0}else{s=q}a[n>>0]=s;o=o+1|0;if((o|0)==(h|0)){break}else{n=n+1|0}}i=l;return}n=(j|0)>20;if((h|0)<=0){i=l;return}o=(j|0)==24;s=(k|0)==0;g=b;b=0;while(1){q=b+e|0;r=(1<<7-((q|0)%8|0)&(d[c+((q|0)/8|0)>>0]|0)|0)!=0?f:m;if(n){if(o){t=r}else{t=d[g>>0]|0}}else{t=eAa(j,d[g>>0]|0,r)|0}if(!s?(r=a[k+b>>0]|0,q=r&255,!(r<<24>>24==-1)):0){u=(((ca(d[g>>0]|0,q^255)|0)+(ca(q,t&255)|0)|0)>>>0)/255|0}else{u=t}a[g>>0]=u;b=b+1|0;if((b|0)==(h|0)){break}else{g=g+1|0}}i=l;return}function wBa(b,c,e,f,g,h,j,k){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;l=i;m=(g|0)!=0;if((k|0)==0){if(!m){if((f|0)<=0){i=l;return}n=(h|0)==0;o=c;p=j;q=b;r=0;while(1){s=a[e+(d[o>>0]|0)>>0]|0;o=o+1|0;do{if(n){t=49}else{u=a[h+r>>0]|0;v=u&255;if(u<<24>>24==0){break}else if(u<<24>>24==-1){t=49;break}u=d[p>>0]|0;w=u+v-(((ca(u,v)|0)>>>0)/255|0)|0;a[p>>0]=w;u=((v*255|0)>>>0)/((w&255)>>>0)|0;a[q>>0]=((ca(d[q>>0]|0,255-u|0)|0)+(ca(u,s&255)|0)|0)/255|0}}while(0);if((t|0)==49){t=0;a[q>>0]=s;a[p>>0]=-1}r=r+1|0;if((r|0)==(f|0)){break}else{p=p+1|0;q=q+1|0}}i=l;return}q=(g|0)>20;if((f|0)<=0){i=l;return}p=(h|0)==0;r=(g|0)==24;n=c;o=b;u=j;w=0;while(1){v=a[e+(d[n>>0]|0)>>0]|0;n=n+1|0;do{if(p){t=39}else{x=a[h+w>>0]|0;y=x&255;if(x<<24>>24==-1){t=39;break}else if(x<<24>>24==0){break}x=d[u>>0]|0;z=x+y-(((ca(x,y)|0)>>>0)/255|0)|0;a[u>>0]=z;x=((y*255|0)>>>0)/((z&255)>>>0)|0;do{if(q){if(r){A=a[o>>0]|0;B=v&255;break}else{z=a[o>>0]|0;A=z;B=z&255;break}}else{z=a[o>>0]|0;A=z;B=eAa(g,z&255,v&255)|0}}while(0);a[o>>0]=((ca(A&255,255-x|0)|0)+(ca(B&255,x)|0)|0)/255|0}}while(0);if((t|0)==39){t=0;a[o>>0]=v;a[u>>0]=-1}w=w+1|0;if((w|0)==(f|0)){break}else{o=o+1|0;u=u+1|0}}i=l;return}if(!m){if((f|0)<=0){i=l;return}m=(h|0)==0;u=k;o=c;w=b;t=j;B=0;while(1){A=a[e+(d[o>>0]|0)>>0]|0;o=o+1|0;r=a[t>>0]|0;q=r&255;p=a[u>>0]|0;u=u+1|0;if(r<<24>>24==0){r=p&255;if(m){C=r}else{C=((ca(d[h+B>>0]|0,r)|0)>>>0)/255|0}if((C|0)!=0){a[w>>0]=A;a[t>>0]=C}}else{if(m){D=p}else{D=(((ca(d[h+B>>0]|0,p&255)|0)>>>0)/255|0)&255}p=D&255;if(!(D<<24>>24==0)){r=p+q-(((ca(p,q)|0)>>>0)/255|0)|0;a[t>>0]=r;q=((p*255|0)>>>0)/((r&255)>>>0)|0;a[w>>0]=((ca(d[w>>0]|0,255-q|0)|0)+(ca(q,A&255)|0)|0)/255|0}}B=B+1|0;if((B|0)==(f|0)){break}else{w=w+1|0;t=t+1|0}}i=l;return}t=(g|0)>20;if((f|0)<=0){i=l;return}w=(h|0)==0;B=(g|0)==24;D=k;k=c;c=b;b=j;j=0;while(1){m=a[e+(d[k>>0]|0)>>0]|0;k=k+1|0;C=a[b>>0]|0;u=C&255;o=a[D>>0]|0;D=D+1|0;if(C<<24>>24==0){C=o&255;if(w){E=C}else{E=((ca(d[h+j>>0]|0,C)|0)>>>0)/255|0}if((E|0)!=0){a[c>>0]=m;a[b>>0]=E}}else{if(w){F=o}else{F=(((ca(d[h+j>>0]|0,o&255)|0)>>>0)/255|0)&255}o=F&255;if(!(F<<24>>24==0)){C=o+u-(((ca(o,u)|0)>>>0)/255|0)|0;a[b>>0]=C;u=((o*255|0)>>>0)/((C&255)>>>0)|0;do{if(t){if(B){G=a[c>>0]|0;H=m&255;break}else{C=a[c>>0]|0;G=C;H=C&255;break}}else{C=a[c>>0]|0;G=C;H=eAa(g,C&255,m&255)|0}}while(0);a[c>>0]=((ca(G&255,255-u|0)|0)+(ca(H&255,u)|0)|0)/255|0}}j=j+1|0;if((j|0)==(f|0)){break}else{c=c+1|0;b=b+1|0}}i=l;return}function xBa(b,c,e,f,g,h,j){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;k=i;l=(g|0)!=0;if((j|0)==0){if(!l){if((f|0)<=0){i=k;return}m=(h|0)==0;n=b;o=c;p=0;while(1){q=a[e+(d[o>>0]|0)>>0]|0;if(!m?(r=a[h+p>>0]|0,s=r&255,!(r<<24>>24==-1)):0){t=((((ca(d[n>>0]|0,s^255)|0)+(ca(s,q&255)|0)|0)>>>0)/255|0)&255}else{t=q}a[n>>0]=t;p=p+1|0;if((p|0)==(f|0)){break}else{n=n+1|0;o=o+1|0}}i=k;return}o=(g|0)>20;if((f|0)<=0){i=k;return}n=(g|0)==24;p=(h|0)==0;t=b;m=c;q=0;while(1){s=a[e+(d[m>>0]|0)>>0]|0;do{if(o){if(n){u=s&255;break}else{u=d[t>>0]|0;break}}else{u=eAa(g,d[t>>0]|0,s&255)|0}}while(0);if(!p?(s=a[h+q>>0]|0,r=s&255,!(s<<24>>24==-1)):0){v=(((ca(d[t>>0]|0,r^255)|0)+(ca(r,u&255)|0)|0)>>>0)/255|0}else{v=u}a[t>>0]=v;q=q+1|0;if((q|0)==(f|0)){break}else{t=t+1|0;m=m+1|0}}i=k;return}if(!l){if((f|0)<=0){i=k;return}l=(h|0)==0;m=c;t=b;q=j;v=0;while(1){u=a[e+(d[m>>0]|0)>>0]|0;p=d[q>>0]|0;if(l){w=p}else{w=((ca(d[h+v>>0]|0,p)|0)>>>0)/255|0}if((w|0)==0){x=u}else{x=(((ca(d[t>>0]|0,255-w|0)|0)+(ca(w,u&255)|0)|0)/255|0)&255}a[t>>0]=x;v=v+1|0;if((v|0)==(f|0)){break}else{m=m+1|0;t=t+1|0;q=q+1|0}}i=k;return}q=(g|0)>20;if((f|0)<=0){i=k;return}t=(h|0)==0;m=(g|0)==24;v=c;c=b;b=j;j=0;while(1){x=a[e+(d[v>>0]|0)>>0]|0;w=d[b>>0]|0;b=b+1|0;if(t){y=w}else{y=((ca(d[h+j>>0]|0,w)|0)>>>0)/255|0}do{if(q){if(m){z=x&255;break}else{z=d[c>>0]|0;break}}else{z=eAa(g,d[c>>0]|0,x&255)|0}}while(0);if((y|0)==0){A=z}else{A=((ca(d[c>>0]|0,255-y|0)|0)+(ca(z&255,y)|0)|0)/255|0}a[c>>0]=A;j=j+1|0;if((j|0)==(f|0)){break}else{v=v+1|0;c=c+1|0}}i=k;return}function yBa(b,e,f,g,h,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;k=i;l=(f|0)>0;if((j|0)==0){if(!l){i=k;return}m=(h|0)==0;n=e;o=b;p=0;while(1){q=c[g+((d[n>>0]|0)<<2)>>2]|0;r=q>>>16;s=r&255;t=q>>>8;u=t&255;v=q&255;do{if(m){w=19}else{x=a[h+p>>0]|0;y=x&255;if(x<<24>>24==0){break}else if(x<<24>>24==-1){w=19;break}x=o+3|0;z=d[x>>0]|0;A=z+y-(((ca(z,y)|0)>>>0)/255|0)|0;a[x>>0]=A;x=((y*255|0)>>>0)/((A&255)>>>0)|0;A=255-x|0;a[o>>0]=((ca(d[o>>0]|0,A)|0)+(ca(x,v)|0)|0)/255|0;y=o+1|0;a[y>>0]=((ca(d[y>>0]|0,A)|0)+(ca(x,u)|0)|0)/255|0;y=o+2|0;a[y>>0]=((ca(d[y>>0]|0,A)|0)+(ca(x,s)|0)|0)/255|0}}while(0);if((w|0)==19){w=0;a[o>>0]=q;a[o+1>>0]=t;a[o+2>>0]=r;a[o+3>>0]=-1}p=p+1|0;if((p|0)==(f|0)){break}else{n=n+1|0;o=o+4|0}}i=k;return}if(!l){i=k;return}l=(h|0)==0;o=e;e=b;b=j;j=0;while(1){n=c[g+((d[o>>0]|0)<<2)>>2]|0;o=o+1|0;p=n>>>16;w=p&255;m=n>>>8;s=m&255;u=n&255;v=e+3|0;x=a[v>>0]|0;A=x&255;if(!(x<<24>>24==0)){if(l){B=a[b>>0]|0}else{B=(((ca(d[b>>0]|0,d[h+j>>0]|0)|0)>>>0)/255|0)&255}x=b+1|0;y=B&255;if(B<<24>>24==0){C=x}else{z=y+A-(((ca(y,A)|0)>>>0)/255|0)|0;a[v>>0]=z;A=((y*255|0)>>>0)/((z&255)>>>0)|0;z=255-A|0;a[e>>0]=((ca(d[e>>0]|0,z)|0)+(ca(A,u)|0)|0)/255|0;u=e+1|0;a[u>>0]=((ca(d[u>>0]|0,z)|0)+(ca(A,s)|0)|0)/255|0;s=e+2|0;a[s>>0]=((ca(d[s>>0]|0,z)|0)+(ca(A,w)|0)|0)/255|0;C=x}}else{if(l){a[e>>0]=n;a[e+1>>0]=m;a[e+2>>0]=p;D=a[b>>0]|0}else{x=((ca(d[b>>0]|0,d[h+j>>0]|0)|0)>>>0)/255|0;a[e>>0]=n;a[e+1>>0]=m;a[e+2>>0]=p;D=x&255}a[v>>0]=D;C=b+1|0}j=j+1|0;if((j|0)==(f|0)){break}else{e=e+4|0;b=C}}i=k;return}function zBa(b,c,e,f,g,h,j){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;k=i;if((f|0)<=0){i=k;return}l=(j|0)==0;m=b;b=0;while(1){n=b+e|0;o=(1<<7-((n|0)%8|0)&(d[c+((n|0)/8|0)>>0]|0)|0)==0?g:h;n=o>>>16;p=n&255;q=o>>>8;r=q&255;s=o&255;do{if(l){t=5}else{u=a[j+b>>0]|0;v=u&255;if(u<<24>>24==-1){t=5;break}else if(u<<24>>24==0){break}u=m+3|0;w=d[u>>0]|0;x=w+v-(((ca(w,v)|0)>>>0)/255|0)|0;a[u>>0]=x;u=((v*255|0)>>>0)/((x&255)>>>0)|0;x=255-u|0;a[m>>0]=((ca(d[m>>0]|0,x)|0)+(ca(u,s)|0)|0)/255|0;v=m+1|0;a[v>>0]=((ca(d[v>>0]|0,x)|0)+(ca(u,r)|0)|0)/255|0;v=m+2|0;a[v>>0]=((ca(d[v>>0]|0,x)|0)+(ca(u,p)|0)|0)/255|0}}while(0);if((t|0)==5){t=0;a[m>>0]=o;a[m+1>>0]=q;a[m+2>>0]=n;a[m+3>>0]=-1}b=b+1|0;if((b|0)==(f|0)){break}else{m=m+4|0}}i=k;return}function ABa(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;l=i;m=(g|0)>0;if((k|0)==0){if(!m){i=l;return}n=(j|0)==0;o=(h|0)==4;p=e;q=b;r=0;while(1){s=c[f+((d[p>>0]|0)<<2)>>2]|0;t=s>>>16;u=t&255;v=s>>>8;w=v&255;x=s&255;if(!n?(y=j+r|0,z=a[y>>0]|0,A=z&255,!(z<<24>>24==-1)):0){a[q>>0]=(((ca(d[q>>0]|0,A^255)|0)+(ca(A,x)|0)|0)>>>0)/255|0;x=q+1|0;A=d[y>>0]|0;a[x>>0]=(((ca(A^255,d[x>>0]|0)|0)+(ca(A,w)|0)|0)>>>0)/255|0;w=q+2|0;A=d[y>>0]|0;a[w>>0]=(((ca(A^255,d[w>>0]|0)|0)+(ca(A,u)|0)|0)>>>0)/255|0}else{a[q>>0]=s;a[q+1>>0]=v;a[q+2>>0]=t}r=r+1|0;if((r|0)==(g|0)){break}else{p=p+1|0;q=o?q+4|0:q+3|0}}i=l;return}else{if(m){B=e;C=b;D=j;E=k;F=0}else{i=l;return}while(1){k=c[f+((d[B>>0]|0)<<2)>>2]|0;j=k>>>16;b=j&255;e=k>>>8;m=e&255;q=k&255;B=B+1|0;o=a[E>>0]|0;E=E+1|0;if((D|0)==0){G=0;H=o}else{G=D+1|0;H=(((ca(d[D>>0]|0,o&255)|0)>>>0)/255|0)&255}o=H&255;if(H<<24>>24==-1){a[C>>0]=k;a[C+1>>0]=e;a[C+2>>0]=j}else if(!(H<<24>>24==0)){j=o^255;a[C>>0]=(((ca(d[C>>0]|0,j)|0)+(ca(o,q)|0)|0)>>>0)/255|0;q=C+1|0;a[q>>0]=(((ca(d[q>>0]|0,j)|0)+(ca(o,m)|0)|0)>>>0)/255|0;m=C+2|0;a[m>>0]=(((ca(d[m>>0]|0,j)|0)+(ca(o,b)|0)|0)>>>0)/255|0}F=F+1|0;if((F|0)==(g|0)){break}else{C=C+h|0;D=G}}i=l;return}}function BBa(b,c,e,f,g,h,j,k){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;l=i;if((h|0)<=0){i=l;return}m=(k|0)==0;n=(j|0)==4;j=b;b=0;while(1){o=b+e|0;p=(1<<7-((o|0)%8|0)&(d[c+((o|0)/8|0)>>0]|0)|0)==0?f:g;o=p&255;q=p>>>8;r=q&255;s=p>>>16;t=s&255;if(!m?(u=k+b|0,v=a[u>>0]|0,w=v&255,!(v<<24>>24==-1)):0){a[j>>0]=(((ca(d[j>>0]|0,w^255)|0)+(ca(w,o)|0)|0)>>>0)/255|0;o=j+1|0;w=d[u>>0]|0;a[o>>0]=(((ca(w^255,d[o>>0]|0)|0)+(ca(w,r)|0)|0)>>>0)/255|0;r=j+2|0;w=d[u>>0]|0;a[r>>0]=(((ca(w^255,d[r>>0]|0)|0)+(ca(w,t)|0)|0)>>>0)/255|0}else{a[j>>0]=p;a[j+1>>0]=q;a[j+2>>0]=s}b=b+1|0;if((b|0)==(h|0)){break}else{j=n?j+4|0:j+3|0}}i=l;return}function CBa(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=i;j=c[a+8>>2]|0;if((j|0)==264){uAa(b,d,c[a+16>>2]|0,e,f);i=h;return}k=j&255;if((k|0)==8){l=c[a+16>>2]|0;m=c[a+20>>2]|0;if((j&512|0)==0){vAa(b,d,l,m,e,f);i=h;return}else{wAa(b,d,l,m,e,f,g);i=h;return}}m=(j|0)==544;if((c[a+52>>2]|0)!=0){l=c[a+16>>2]|0;n=c[a+20>>2]|0;o=c[a+24>>2]|0;p=c[a+28>>2]|0;q=c[a+36>>2]|0;if(m){EAa(b,d,l,n,o,p,e,q,f);i=h;return}else{FAa(b,d,l,n,o,p,e,q,k>>>3,f);i=h;return}}if(m){rAa(b,d,c[a+16>>2]|0,c[a+20>>2]|0,c[a+24>>2]|0,c[a+28>>2]|0,e,c[a+36>>2]|0,f);i=h;return}if((j|0)==536){sAa(b,d,c[a+16>>2]|0,c[a+20>>2]|0,c[a+24>>2]|0,c[a+28>>2]|0,e,c[a+36>>2]|0,f,g);i=h;return}else if((j|0)==32|(j|0)==24){tAa(b,d,c[a+16>>2]|0,c[a+20>>2]|0,c[a+24>>2]|0,c[a+28>>2]|0,e,c[a+36>>2]|0,j>>>3&31,f);i=h;return}else{i=h;return}}function DBa(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;j=i;k=c[a+8>>2]|0;if((k|0)==264){zAa(b,d,c[a+16>>2]|0,e,f,g);i=j;return}l=k&255;if((l|0)==8){m=c[a+16>>2]|0;n=c[a+20>>2]|0;if((k&512|0)==0){AAa(b,d,m,n,e,f,g);i=j;return}else{BAa(b,d,m,n,e,f,g,h);i=j;return}}h=(k|0)==544;if((c[a+52>>2]|0)!=0){n=c[a+16>>2]|0;m=c[a+20>>2]|0;o=c[a+24>>2]|0;p=c[a+28>>2]|0;q=c[a+36>>2]|0;if(h){GAa(b,d,n,m,o,p,e,f,q,g);i=j;return}else{HAa(b,d,n,m,o,p,e,f,q,l>>>3,g);i=j;return}}if(h){xAa(b,d,c[a+16>>2]|0,c[a+20>>2]|0,c[a+24>>2]|0,c[a+28>>2]|0,e,f,c[a+36>>2]|0,g);i=j;return}if(!((k|0)==32|(k|0)==24)){i=j;return}yAa(b,d,c[a+16>>2]|0,c[a+20>>2]|0,c[a+24>>2]|0,c[a+28>>2]|0,e,f,c[a+36>>2]|0,k>>>3&31,g);i=j;return}function EBa(a,b,d,e,f,g,h,j,k,l,m,n){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;o=i;i=i+96|0;p=o+80|0;q=o+76|0;r=o+72|0;s=o+68|0;t=o+64|0;u=o+60|0;v=o+56|0;w=o;c[p>>2]=b;c[q>>2]=d;c[r>>2]=e;c[s>>2]=f;c[t>>2]=h;c[u>>2]=j;j=a+32|0;if((c[j>>2]|0)==0){x=0;i=o;return x|0}h=g+20|0;if((c[h>>2]|0)==1){x=0;i=o;return x|0}f=a+16|0;if((c[f>>2]|0)<8){x=0;i=o;return x|0}XCa(a,p,q,r,s,c[g+8>>2]|0,c[g+12>>2]|0,t,u,l);e=c[r>>2]|0;if((e|0)==0){x=1;i=o;return x|0}r=c[s>>2]|0;if((r|0)==0){x=1;i=o;return x|0}if((l|0)!=0?(c[l>>2]|0)!=0:0){Jya(v,c[l+20>>2]|0);s=c[v>>2]|0;Fya(v);y=c[l+8>>2]|0;z=c[l+4>>2]|0;A=s}else{y=0;z=0;A=0}c[w+12>>2]=0;c[w+44>>2]=0;c[w+48>>2]=0;c[w+52>>2]=0;c[w+36>>2]=0;s=g+16|0;l=(A|0)!=0;if((JAa(w,(c[a+20>>2]<<8)+(c[f>>2]|0)|0,(c[h>>2]<<8)+(c[s>>2]|0)|0,c[g+28>>2]|0,0,k,l&1,m,0,n)|0)!=0){n=c[s>>2]|0;if((n|0)>15){B=(c[h>>2]|0)>>>2&1^1}else{B=0}h=c[g+4>>2]|0;if((r|0)>0){s=a+24|0;m=(h|0)==0;k=a+4|0;a=A+32|0;v=A+24|0;A=(B|0)==0;B=c[q>>2]|0;q=c[p>>2]|0;p=ca(q,(c[f>>2]|0)/8|0)|0;f=c[u>>2]|0;u=c[t>>2]|0;t=ca(u,(n|0)/8|0)|0;n=q-z|0;z=0;do{d=B+z|0;b=(c[j>>2]|0)+(p+(ca(d,c[s>>2]|0)|0))|0;C=f+z|0;D=(dd[c[(c[g>>2]|0)+12>>2]&511](g,C)|0)+t|0;if(m){E=0}else{E=(dd[c[(c[h>>2]|0)+12>>2]&511](h,C)|0)+u|0}C=c[k>>2]|0;if((C|0)==0){F=0}else{F=(dd[c[(c[C>>2]|0)+12>>2]&511](C,d)|0)+q|0}if(l){G=(c[a>>2]|0)+(n+(ca(z-y+B|0,c[v>>2]|0)|0))|0}else{G=0}if(A){pBa(w,b,D,u,e,G,E,F)}else{MAa(w,b,D,e,G,E,F)}z=z+1|0}while((z|0)<(r|0));H=1}else{H=1}}else{H=0}IAa(w);x=H;i=o;return x|0}function FBa(a,b,d,e,f,g,h,j,k,l,m,n,o,p){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;var q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;q=i;i=i+96|0;r=q+80|0;s=q+76|0;t=q+72|0;u=q+68|0;v=q+64|0;w=q+60|0;x=q+56|0;y=q;c[r>>2]=b;c[s>>2]=d;c[t>>2]=e;c[u>>2]=f;c[v>>2]=j;c[w>>2]=k;k=a+32|0;if((c[k>>2]|0)==0){z=0;i=q;return z|0}j=g+20|0;if((c[j>>2]|0)!=1){z=0;i=q;return z|0}f=a+16|0;if((c[f>>2]|0)<8){z=0;i=q;return z|0}XCa(a,r,s,t,u,c[g+8>>2]|0,c[g+12>>2]|0,v,w,m);e=c[t>>2]|0;if((e|0)==0){z=1;i=q;return z|0}t=c[u>>2]|0;if((t|0)==0){z=1;i=q;return z|0}if((((o&65280|0)==0?h>>>24:o&255)|0)==0){z=1;i=q;return z|0}if((m|0)!=0?(c[m>>2]|0)!=0:0){Jya(x,c[m+20>>2]|0);u=c[x>>2]|0;Fya(x);A=c[m+4>>2]|0;B=c[m+8>>2]|0;C=u}else{A=0;B=0;C=0}u=c[g+16>>2]|0;m=c[f>>2]|0;f=(m|0)/8|0;c[y+12>>2]=0;c[y+44>>2]=0;c[y+48>>2]=0;c[y+52>>2]=0;c[y+36>>2]=0;x=(C|0)!=0;if((JAa(y,(c[a+20>>2]<<8)+m|0,(c[j>>2]<<8)+u|0,0,h,l,x&1,n,o,p)|0)!=0){if((t|0)>0){p=a+24|0;o=a+4|0;a=C+32|0;n=C+24|0;C=(u|0)==1;u=c[s>>2]|0;s=c[r>>2]|0;r=ca(s,f)|0;f=c[w>>2]|0;w=s-A|0;A=c[v>>2]|0;v=0;do{l=u+v|0;h=(c[k>>2]|0)+(r+(ca(l,c[p>>2]|0)|0))|0;j=dd[c[(c[g>>2]|0)+12>>2]&511](g,f+v|0)|0;m=c[o>>2]|0;if((m|0)==0){D=0}else{D=(dd[c[(c[m>>2]|0)+12>>2]&511](m,l)|0)+s|0}if(x){E=(c[a>>2]|0)+(w+(ca(v-B+u|0,c[n>>2]|0)|0))|0}else{E=0}if(C){DBa(y,h,j,A,e,E,D)}else{CBa(y,h,j+A|0,e,E,D)}v=v+1|0}while((v|0)<(t|0));F=1}else{F=1}}else{F=0}IAa(y);z=F;i=q;return z|0}function GBa(b,e,f,g,h,j,k,l){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0;m=i;i=i+32|0;n=m+8|0;o=m;p=m+27|0;q=m+26|0;r=m+25|0;s=m+24|0;t=b+32|0;if((c[t>>2]|0)==0){u=0;i=m;return u|0}v=k>>>0>255;w=j>>>24;x=v?k&255:w;if((x|0)==0){u=1;i=m;return u|0}c[n>>2]=e;k=n+4|0;c[k>>2]=f;y=n+8|0;c[y>>2]=g+e;e=n+12|0;c[e>>2]=h+f;xxa(n,c[b+8>>2]|0,c[b+12>>2]|0);f=c[y>>2]|0;y=c[n>>2]|0;if((f|0)<=(y|0)){u=1;i=m;return u|0}h=c[e>>2]|0;g=c[k>>2]|0;if((h|0)<=(g|0)){u=1;i=m;return u|0}k=f-y|0;if(v){z=e3a(j|0)|0}else{z=j}c[o>>2]=z;A=b+16|0;B=c[A>>2]|0;C=z&65535;if((B|0)==8){a[p>>0]=-1;D=b+20|0;if((c[D>>2]|0)!=1){if(((l|0)!=0?(c[(BGa()|0)+268>>2]|0)!=0:0)?(c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0)!=0:0){E=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;Fc[c[(c[E>>2]|0)+36>>2]&63](E,l,p,o,1)}else{F=13}do{if((F|0)==13){E=z>>>16;if(v){dX(z&255,(C&65535)>>>8&255,E&255,z>>>24&255,q,r,s);a[p>>0]=((((d[r>>0]|0)*59|0)+((d[s>>0]|0)*11|0)+((d[q>>0]|0)*30|0)|0)>>>0)/100|0;break}else{a[p>>0]=((((z>>>8&255)*59|0)+((z&255)*11|0)+((E&255)*30|0)|0)>>>0)/100|0;break}}}while(0);if((c[D>>2]&4|0)!=0){a[p>>0]=(d[p>>0]|0)^255}}D=b+24|0;z=(x|0)==255;q=(k|0)>0;s=x^255;r=h;C=y;E=g;while(1){G=(c[t>>2]|0)+((ca(c[D>>2]|0,E)|0)+C)|0;if(!z){if(q){H=1;I=G;while(1){J=ca(d[I>>0]|0,s)|0;a[I>>0]=(((ca(d[p>>0]|0,x)|0)+J|0)>>>0)/255|0;if((H|0)==(k|0)){break}H=H+1|0;I=I+1|0}K=c[e>>2]|0}else{K=r}}else{f3a(G|0,a[p>>0]|0,k|0)|0;K=r}I=E+1|0;if((I|0)>=(K|0)){u=1;break}r=K;C=c[n>>2]|0;E=I}i=m;return u|0}else if((B|0)==1){E=(f|0)/8|0;C=(y|0)/8|0;K=c[b+28>>2]|0;if((K|0)==0){L=(j&255|0)==255}else{L=(c[K+4>>2]|0)==(j|0)}K=255<<8-((y|0)%8|0);r=255>>>(f&7);f=(E|0)==(C|0);p=L<<31>>31;s=E+ -1-C|0;q=C+1|0;z=g;do{D=dd[c[(c[b>>2]|0)+12>>2]&511](b,z)|0;I=D+C|0;H=(dd[c[(c[b>>2]|0)+12>>2]&511](b,z)|0)+E|0;J=d[I>>0]|0;M=J&K;N=(d[H>>0]|0)&r;do{if(f){O=N|M;if(L){a[I>>0]=O^255|J;break}else{a[I>>0]=O&J;break}}else{f3a(D+q|0,p|0,s|0)|0;if(L){a[I>>0]=J|M^255;a[H>>0]=d[H>>0]|0|N^255;break}else{a[I>>0]=M;a[H>>0]=(d[H>>0]|0)&N;break}}}while(0);z=z+1|0}while((z|0)<(h|0));u=1;i=m;return u|0}else{if((B|0)<24){u=0;i=m;return u|0}if((l|0)!=0?(c[(BGa()|0)+268>>2]|0)!=0:0){B=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;Fc[c[(c[B>>2]|0)+36>>2]&63](B,l,o,o,1);P=b+20|0}else{F=43}do{if((F|0)==43){l=b+20|0;B=(c[l>>2]&4|0)==0;if(v){if(!B){P=l;break}dX(w&255,j>>>16&255,j>>>8&255,j&255,o+2|0,o+1|0,o);P=l;break}else{if(B){P=l;break}else{u=0}i=m;return u|0}}}while(0);j=c[P>>2]|0;if((j&4|0)==0){a[o+3>>0]=x}P=c[A>>2]|0;A=(P|0)/8|0;w=j&2;v=((j<<8)+P|0)==544;j=b+24|0;if((x|0)==255){F=b+4|0;l=(P+ -32|0)>>>0<8;B=(k|0)>0;h=o+1|0;z=o+2|0;L=y;s=g;while(1){p=(c[t>>2]|0)+((ca(L,A)|0)+(ca(c[j>>2]|0,s)|0))|0;q=c[F>>2]|0;if((q|0)!=0?(f=(dd[c[(c[q>>2]|0)+12>>2]&511](q,s)|0)+L|0,(f|0)!=0):0){f3a(f|0,-1,k|0)|0}a:do{if(l){if(B){f=1;q=p;while(1){c[q>>2]=c[o>>2];if((f|0)==(k|0)){break a}f=f+1|0;q=q+4|0}}}else{if(B){q=1;f=p;while(1){a[f>>0]=a[o>>0]|0;a[f+1>>0]=a[h>>0]|0;a[f+2>>0]=a[z>>0]|0;if((q|0)==(k|0)){break a}q=q+1|0;f=f+3|0}}}}while(0);p=s+1|0;if((p|0)>=(c[e>>2]|0)){u=1;break}L=c[n>>2]|0;s=p}i=m;return u|0}s=(w|0)==0;w=b+4|0;b=(k|0)>0;L=x&255;z=x*255|0;h=(P|0)>7;P=o+2|0;B=o+1|0;l=x^255;F=(A|0)>1?A:1;p=y;y=g;while(1){g=(c[t>>2]|0)+((ca(p,A)|0)+(ca(c[j>>2]|0,y)|0))|0;b:do{if(s){if(b){f=0;q=g;while(1){if(h){r=0;K=q;while(1){if((r|0)==3){Q=-1}else{E=ca(d[K>>0]|0,l)|0;Q=((((ca(d[o+r>>0]|0,x)|0)+E|0)>>>0)/255|0)&255}a[K>>0]=Q;r=r+1|0;if((r|0)>=(A|0)){break}else{K=K+1|0}}R=q+F|0}else{R=q}f=f+1|0;if((f|0)==(k|0)){break}else{q=R}}}}else{if(v){if(b){S=0;T=g}else{break}while(1){q=T+3|0;f=a[q>>0]|0;K=f&255;if(f<<24>>24==0){a[T>>0]=a[o>>0]|0;a[T+1>>0]=a[B>>0]|0;a[T+2>>0]=a[P>>0]|0;U=x}else{f=K+x-(((ca(K,x)|0)>>>0)/255|0)|0;K=(z>>>0)/((f&255)>>>0)|0;r=255-K|0;E=ca(d[T>>0]|0,r)|0;a[T>>0]=((ca(d[o>>0]|0,K)|0)+E|0)/255|0;E=T+1|0;C=ca(d[E>>0]|0,r)|0;a[E>>0]=((ca(d[B>>0]|0,K)|0)+C|0)/255|0;C=T+2|0;E=ca(d[C>>0]|0,r)|0;a[C>>0]=((ca(d[P>>0]|0,K)|0)+E|0)/255|0;U=f}a[q>>0]=U;S=S+1|0;if((S|0)==(k|0)){break b}else{T=T+4|0}}}q=c[w>>2]|0;f=dd[c[(c[q>>2]|0)+12>>2]&511](q,y)|0;if(b){q=0;E=g;K=f+p|0;while(1){f=a[K>>0]|0;C=f&255;if(!(f<<24>>24==0)){f=C+x-(((ca(C,x)|0)>>>0)/255|0)|0;a[K>>0]=f;C=(z>>>0)/((f&255)>>>0)|0;if(h){f=255-C|0;r=0;N=E;while(1){H=ca(d[N>>0]|0,f)|0;a[N>>0]=((ca(d[o+r>>0]|0,C)|0)+H|0)/255|0;r=r+1|0;if((r|0)>=(A|0)){break}else{N=N+1|0}}V=E+F|0}else{V=E}}else{a[K>>0]=L;c3a(E|0,o|0,A|0)|0;V=E+A|0}q=q+1|0;if((q|0)==(k|0)){break}else{E=V;K=K+1|0}}}}}while(0);g=y+1|0;if((g|0)>=(c[e>>2]|0)){u=1;break}p=c[n>>2]|0;y=g}i=m;return u|0}return 0}function HBa(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=759152;c[a+56>>2]=0;c[a+88>>2]=0;c[a+92>>2]=0;c[a+96>>2]=0;c[a+80>>2]=0;d=a+120|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;i=b;return}function IBa(a){a=a|0;var b=0;b=i;c[a>>2]=759152;v2a(c[a+128>>2]|0);v2a(c[a+140>>2]|0);v2a(c[a+132>>2]|0);v2a(c[a+136>>2]|0);IAa(a+44|0);i=b;return}function JBa(a,b,d,e,f,g,h,j,k,l,m,n,o){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;var p=0,q=0;p=i;i=i+16|0;q=p;c[a+4>>2]=b;c[a+8>>2]=d;c[a+16>>2]=c[g>>2];b=g+4|0;c[a+20>>2]=c[b>>2];c[a+24>>2]=(c[g+8>>2]|0)-(c[g>>2]|0);c[a+28>>2]=(c[g+12>>2]|0)-(c[b>>2]|0);c[a+32>>2]=e;c[a+36>>2]=f;f=a+40|0;c[f>>2]=0;if((d|0)!=0?(c[d>>2]|0)!=0:0){Jya(q,c[d+20>>2]|0);c[f>>2]=c[q>>2];Fya(q)}c[a+100>>2]=h;c[a+104>>2]=j;c[a+108>>2]=k;c[a+112>>2]=m;c[a+116>>2]=n;c[a+120>>2]=l;c[a+124>>2]=o;i=p;return}function KBa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;d=i;c[a+12>>2]=e;g=a+4|0;h=c[g>>2]|0;if((c[a+40>>2]|0)==0){j=(c[a+32>>2]|0)<255}else{j=1}if((JAa(a+44|0,(c[h+20>>2]<<8)+(c[h+16>>2]|0)|0,e,f,c[a+36>>2]|0,0,j&1,c[a+120>>2]|0,c[a+112>>2]|0,c[a+116>>2]|0)|0)==0){k=0;i=d;return k|0}j=(c[a+100>>2]|0)==0;if(!j){f=c[g>>2]|0;e=w2a((ca((c[f+16>>2]|0)/8|0,b)|0)+4|0,1)|0;c[a+128>>2]=e;if((e|0)==0){k=0;i=d;return k|0}e=w2a(c[f+12>>2]|0,1)|0;c[a+132>>2]=e;if((e|0)==0){k=0;i=d;return k|0}if((c[f+4>>2]|0)!=0?(f=w2a(b+4|0,1)|0,c[a+140>>2]=f,(f|0)==0):0){k=0;i=d;return k|0}}if((c[a+32>>2]|0)<255?(f=c[g>>2]|0,g=w2a(c[(j?f+8|0:f+12|0)>>2]|0,1)|0,c[a+136>>2]=g,(g|0)==0):0){k=0;i=d;return k|0}k=1;i=d;return k|0}function LBa(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;l=i;m=b+32|0;n=c[m>>2]|0;if((n|0)<255){a:do{if((h|0)!=0){o=b+136|0;if((g|0)>0){p=n;q=0;while(1){r=((ca(d[h+q>>0]|0,p)|0)/255|0)&255;a[(c[o>>2]|0)+q>>0]=r;r=q+1|0;if((r|0)==(g|0)){s=o;break a}p=c[m>>2]|0;q=r}}else{s=o}}else{q=b+136|0;f3a(c[q>>2]|0,n&255|0,g|0)|0;s=q}}while(0);t=c[s>>2]|0}else{t=h}h=c[b+12>>2]|0;if((h|0)==264){CBa(b+44|0,e,f,g,t,k);i=l;return}s=b+44|0;if((h&255|0)==8){pBa(s,e,f,0,g,t,j,k);i=l;return}else{MAa(s,e,f,g,t,j,k);i=l;return}}function MBa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=i;if((c[a+100>>2]|0)!=0){NBa(a,b,d,e);i=f;return}g=a+40|0;h=c[g>>2]|0;if((h|0)==0){j=a+16|0;k=c[a+20>>2]|0;l=0}else{m=Lc[c[(c[h>>2]|0)+8>>2]&255](h)|0;h=c[a+20>>2]|0;n=c[a+8>>2]|0;o=ca(c[(c[g>>2]|0)+24>>2]|0,h+b-(c[n+8>>2]|0)|0)|0;g=a+16|0;j=g;k=h;l=m+(o+(c[g>>2]|0)-(c[n+4>>2]|0))|0}n=a+4|0;g=c[n>>2]|0;o=dd[c[(c[g>>2]|0)+12>>2]&511](g,k+b|0)|0;k=c[n>>2]|0;n=o+((ca(c[k+16>>2]|0,c[j>>2]|0)|0)/8|0)|0;o=c[k+4>>2]|0;if((o|0)==0){p=0}else{k=dd[c[(c[o>>2]|0)+12>>2]&511](o,(c[a+20>>2]|0)+b|0)|0;p=k+(c[j>>2]|0)|0}LBa(a,n,d,c[a+24>>2]|0,l,e,p);i=f;return}function NBa(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;g=i;h=b+4|0;j=c[h>>2]|0;k=c[j+16>>2]|0;l=(k|0)/8|0;m=c[j+24>>2]|0;n=c[j+4>>2]|0;if((n|0)==0){o=0}else{o=c[n+24>>2]|0}if((c[b+104>>2]|0)==0){p=d}else{p=(c[b+24>>2]|0)+~d|0}d=p+(c[b+16>>2]|0)|0;p=Lc[c[(c[j>>2]|0)+8>>2]&255](j)|0;j=ca(d,l)|0;n=b+20|0;q=(ca(c[n>>2]|0,m)|0)+j|0;j=c[(c[h>>2]|0)+4>>2]|0;if((j|0)==0){r=0}else{h=Lc[c[(c[j>>2]|0)+8>>2]&255](j)|0;r=h+((ca(c[n>>2]|0,o)|0)+d)|0}h=b+108|0;j=c[b+28>>2]|0;if((c[h>>2]|0)==0){s=q;t=j;u=r;v=o;w=m}else{x=j+ -1|0;s=(ca(x,m)|0)+q|0;t=j;u=r+(ca(x,o)|0)|0;v=0-o|0;w=0-m|0}m=p+s|0;s=b+128|0;p=b+28|0;if((t|0)>0){o=(k|0)>7;x=(l|0)>1?l:1;r=t;j=m;q=0;y=c[s>>2]|0;while(1){if(o){z=0;A=y;while(1){a[A>>0]=a[j+z>>0]|0;z=z+1|0;if((z|0)>=(l|0)){break}else{A=A+1|0}}B=c[p>>2]|0;C=y+x|0}else{B=r;C=y}q=q+1|0;if((q|0)>=(B|0)){break}else{r=B;j=j+w|0;y=C}}C=b+140|0;y=(u|0)!=0;if(y&(B|0)>0){j=u;r=0;q=c[C>>2]|0;while(1){a[q>>0]=a[j>>0]|0;r=r+1|0;x=c[p>>2]|0;if((r|0)>=(x|0)){D=C;E=1;F=x;break}else{j=j+v|0;q=q+1|0}}}else{D=C;E=y;F=B}}else{D=b+140|0;E=(u|0)!=0;F=t}t=c[b+40>>2]|0;if((t|0)!=0){B=c[b+132>>2]|0;y=c[t+24>>2]|0;C=Lc[c[(c[t>>2]|0)+8>>2]&255](t)|0;t=c[b+8>>2]|0;q=ca((c[n>>2]|0)-(c[t+8>>2]|0)|0,y)|0;n=q+(d-(c[t+4>>2]|0))|0;t=c[p>>2]|0;if((c[h>>2]|0)==0){G=n;H=y}else{G=(ca(t+ -1|0,y)|0)+n|0;H=0-y|0}if((t|0)>0){y=0;n=C+G|0;while(1){a[B+y>>0]=a[n>>0]|0;y=y+1|0;G=c[p>>2]|0;if((y|0)>=(G|0)){I=G;J=B;break}else{n=n+H|0}}}else{I=t;J=B}}else{I=F;J=0}LBa(b,c[s>>2]|0,e,I,J,f,c[D>>2]|0);f=c[p>>2]|0;if((f|0)<=0){i=g;return}J=(k|0)>7;k=(l|0)>1?l:1;I=f;f=m;m=0;e=c[s>>2]|0;while(1){if(J){s=0;b=e;while(1){a[f+s>>0]=a[b>>0]|0;s=s+1|0;if((s|0)>=(l|0)){break}else{b=b+1|0}}K=c[p>>2]|0;L=e+k|0}else{K=I;L=e}m=m+1|0;if((m|0)>=(K|0)){break}else{I=K;f=f+w|0;e=L}}if(!(E&(K|0)>0)){i=g;return}K=u;u=0;E=c[D>>2]|0;while(1){a[K>>0]=a[E>>0]|0;u=u+1|0;if((u|0)>=(c[p>>2]|0)){break}else{K=K+v|0;E=E+1|0}}i=g;return}function OBa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=i;g=c[a+(d<<2)>>2]|0;h=c[b+(d<<2)>>2]|0;if((d|0)<(e|0)){j=e;k=d}else{l=d;m=a+(l<<2)|0;c[m>>2]=g;n=b+(l<<2)|0;c[n>>2]=h;i=f;return l|0}while(1){a:do{if((k|0)<(j|0)){d=j;while(1){o=c[a+(d<<2)>>2]|0;e=d+ -1|0;if(o>>>0<g>>>0){break}if((k|0)<(e|0)){d=e}else{p=k;q=e;break a}}c[a+(k<<2)>>2]=o;c[b+(k<<2)>>2]=c[b+(d<<2)>>2];p=k+1|0;q=d}else{p=k;q=j}}while(0);b:do{if((p|0)<(q|0)){e=p;while(1){r=c[a+(e<<2)>>2]|0;s=e+1|0;if(r>>>0>g>>>0){break}if((s|0)<(q|0)){e=s}else{t=s;u=q;break b}}c[a+(q<<2)>>2]=r;c[b+(q<<2)>>2]=c[b+(e<<2)>>2];t=e;u=q+ -1|0}else{t=p;u=q}}while(0);if((t|0)<(u|0)){j=u;k=t}else{l=t;break}}m=a+(l<<2)|0;c[m>>2]=g;n=b+(l<<2)|0;c[n>>2]=h;i=f;return l|0}function PBa(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=i;if((c|0)<(d|0)){f=c}else{i=e;return}do{c=OBa(a,b,f,d)|0;PBa(a,b,f,c+ -1|0);f=c+1|0}while((f|0)<(d|0));i=e;return}function QBa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;g=e+ -1|0;e=0;do{h=g-e|0;j=(h|0)<0?h+256|0:h;h=c[b+(j<<2)>>2]|0;c[d+(e<<2)>>2]=h<<8&61440|h<<12&15728640|h<<4&240|-16777216;c[a+(j<<2)>>2]=e;e=e+1|0}while((e|0)!=256);i=f;return}function RBa(a){a=a|0;var b=0,d=0;b=i;d=c[a>>2]|0;if((d|0)!=0){v2a(d)}d=c[a+4>>2]|0;if((d|0)!=0){v2a(d)}d=c[a+8>>2]|0;if((d|0)!=0){v2a(d)}c[a+12>>2]=0;i=b;return}\n\n\n\nfunction bea(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;i=i+160|0;e=d+148|0;f=d+72|0;g=d;j=d+144|0;k=c[740312+(b<<2)>>2]|0;l=c[740328+(b<<2)>>2]|0;m=Y1(a)|0;if(!((b|0)==-1)){if((_1(a,l)|0)!=0){b=E3(x2(a,l)|0)|0;l=j2(a)|0;if((b|0)==0){n=0;i=d;return n|0}o=h2(a)|0;if((o|0)==1482250784){if((F3(b,0,n3(m)|0)|0)!=0){p=7}}else if(!((o|0)==1281450528?(F3(b,0,m3(m)|0)|0)==0:0)){p=7}do{if((p|0)==7){if((l|0)==1482250784){if((F3(b,1,l3(m)|0)|0)==0){break}else{n=b}i=d;return n|0}else if((l|0)==1281450528){if((F3(b,1,k3(m)|0)|0)==0){break}else{n=b}i=d;return n|0}else{n=b;i=d;return n|0}}}while(0);B3(b);n=0;i=d;return n|0}b=(_1(a,k)|0)==0;l=b?1110589744:k;if((_1(a,l)|0)!=0){k=x2(a,l)|0;if((k|0)==0){n=0;i=d;return n|0}b=z2(a,l)|0;l=E3(k)|0;if((l|0)==0){n=0;i=d;return n|0}if((h2(a)|0)==1281450528){cea(l)}if((b|0)!=1835430962){n=l;i=d;return n|0}if((h2(a)|0)!=1281450528){n=l;i=d;return n|0}if((F3(l,0,j3(m)|0)|0)!=0){if((j2(a)|0)!=1281450528){n=l;i=d;return n|0}if((F3(l,1,i3(m)|0)|0)!=0){n=l;i=d;return n|0}}B3(l);n=0;i=d;return n|0}}if((j2(a)|0)==1196573017){l=Y1(a)|0;m=x2(a,1800688195)|0;if((m|0)==0){n=0;i=d;return n|0}b=a1(m)|0;c[j>>2]=b;if((b|0)==0){n=0;i=d;return n|0}b=v3(l,3,1)|0;if((b|0)==0){V0(c[j>>2]|0);n=0;i=d;return n|0}if((h2(a)|0)==1281450528){if((F3(b,1,Q2(l,1,3,740424,0)|0)|0)!=0){p=30}}else{if((F3(b,1,Q2(l,1,3,740448,0)|0)|0)!=0){p=30}}if((p|0)==30?(F3(b,1,K2(l,1,j)|0)|0)!=0:0){V0(c[j>>2]|0);n=b;i=d;return n|0}V0(c[j>>2]|0);B3(b);n=0;i=d;return n|0}b=Y1(a)|0;if((jea(f,a)|0)==0){n=0;i=d;return n|0}if((X3(f,g)|0)==0){n=0;i=d;return n|0}h[g>>3]=+h[g>>3]*1.999969482421875;f=g+8|0;h[f>>3]=+h[f>>3]*1.999969482421875;f=g+16|0;h[f>>3]=+h[f>>3]*1.999969482421875;f=g+24|0;h[f>>3]=+h[f>>3]*1.999969482421875;f=g+32|0;h[f>>3]=+h[f>>3]*1.999969482421875;f=g+40|0;h[f>>3]=+h[f>>3]*1.999969482421875;f=g+48|0;h[f>>3]=+h[f>>3]*1.999969482421875;f=g+56|0;h[f>>3]=+h[f>>3]*1.999969482421875;f=g+64|0;h[f>>3]=+h[f>>3]*1.999969482421875;f=x2(a,1918128707)|0;j=x2(a,1733579331)|0;l=x2(a,1649693251)|0;if((f|0)==0|(j|0)==0|(l|0)==0){n=0;i=d;return n|0}c[e>>2]=a1(f)|0;f=e+4|0;c[f>>2]=a1(j)|0;j=a1(l)|0;c[e+8>>2]=j;if((c[e>>2]|0)==0){n=0;i=d;return n|0}if((c[f>>2]|0)==0|(j|0)==0){n=0;i=d;return n|0}j=v3(b,3,3)|0;do{if((j|0)!=0){if(!((h2(a)|0)==1281450528?(F3(j,1,g3(b)|0)|0)==0:0)){p=41}if(((p|0)==41?(F3(j,1,Q2(b,3,3,g,0)|0)|0)!=0:0)?(F3(j,1,K2(b,3,e)|0)|0)!=0:0){break}W0(e);B3(j);n=0;i=d;return n|0}}while(0);W0(e);n=j;i=d;return n|0}function cea(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=I3(c[a>>2]|0)|0;if((d|0)==0){i=b;return}e=a+32|0;a=d;do{if((r3(c[a+4>>2]|0)|0)==1668052340){d=(c[a+32>>2]|0)+4|0;f=(c[d>>2]|0)+4|0;c[f>>2]=c[f>>2]|256;h1(c[e>>2]|0,c[d>>2]|0)|0}a=t3(c[a+36>>2]|0)|0}while((a|0)!=0);i=b;return}function dea(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;e=c[740280+(b<<2)>>2]|0;f=c[740296+(b<<2)>>2]|0;b=Y1(a)|0;a:do{if((l2(a)|0)==1852662636){g=x2(a,1852009522)|0;if((g|0)==0){h=0}else{j=v3(b,0,0)|0;if((j|0)!=0?(F3(j,0,Bea(g,0)|0)|0)!=0:0){if((j2(a)|0)!=1281450528){h=j;break}if((F3(j,1,i3(b)|0)|0)!=0){h=j;break}}B3(j);wea(g);h=0}}else{if((_1(a,f)|0)!=0){g=E3(x2(a,f)|0)|0;j=h2(a)|0;if((g|0)==0){h=0;break}k=j2(a)|0;if((k|0)==1281450528){if((F3(g,0,m3(b)|0)|0)!=0){l=13}}else if(!((k|0)==1482250784?(F3(g,0,n3(b)|0)|0)==0:0)){l=13}do{if((l|0)==13){if((j|0)==1281450528){if((F3(g,1,k3(b)|0)|0)==0){break}else{h=g;break a}}else if((j|0)==1482250784?(F3(g,1,l3(b)|0)|0)==0:0){break}else{h=g;break a}}}while(0);B3(g);h=0;break}if((_1(a,1144144432)|0)!=0){h=E3(x2(a,1144144432)|0)|0;break}if((_1(a,e)|0)==0){if((_1(a,1093812784)|0)==0){h=0;break}else{m=1093812784}}else{m=e}j=x2(a,m)|0;if((j|0)!=0?(k=E3(j)|0,(k|0)!=0):0){if((h2(a)|0)==1281450528){cea(k)}if((z2(a,m)|0)==1835430962){if(!((j2(a)|0)==1281450528?(F3(k,0,j3(b)|0)|0)==0:0)){if((h2(a)|0)!=1281450528){h=k;break}if((F3(k,1,i3(b)|0)|0)!=0){h=k;break}}B3(k);h=0}else{h=k}}else{h=0}}}while(0);i=d;return h|0}function eea(a){a=a|0;var b=0,c=0,d=0,e=0;b=i;c=j2(a)|0;if((c|0)==1196573017){d=_1(a,1800688195)|0;i=b;return d|0}else if((c|0)==1380401696){if(((((_1(a,1918392666)|0)!=0?(_1(a,1733843290)|0)!=0:0)?(_1(a,1649957210)|0)!=0:0)?(_1(a,1918128707)|0)!=0:0)?(_1(a,1733579331)|0)!=0:0){e=(_1(a,1649693251)|0)!=0}else{e=0}d=e&1;i=b;return d|0}else{d=0;i=b;return d|0}return 0}function fea(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+16|0;f=e;if((l2(a)|0)==1818848875){g=(b2(a)|0)==(b|0)&1;i=e;return g|0}if((d|0)==1){h=740312}else if((d|0)==0){h=740280}else if((d|0)==2){if((gea(a,b,0)|0)==0){j=0}else{j=(gea(a,1,1)|0)!=0}g=j&1;i=e;return g|0}else{j=Y1(a)|0;c[f>>2]=d;Jda(j,2,740344,f);g=0;i=e;return g|0}g=_1(a,c[h+(b<<2)>>2]|0)|0;i=e;return g|0}function gea(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;if((fea(a,b,c)|0)==0){e=eea(a)|0}else{e=1}i=d;return e|0}function hea(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;f=Gea(a,b)|0;if((f|0)==0){g=0;i=e;return g|0}if((b|0)==0){g=f;i=e;return g|0}a=f+8|0;h=0;do{j=c[a>>2]|0;k=c[d+(h<<2)>>2]|0;f2(k,j+(h*48|0)+8|0);g2(k,j+(h*48|0)+20|0);c[j+(h*48|0)>>2]=d2(k)|0;c[j+(h*48|0)+4>>2]=e2(k)|0;l=x2(k,1952801640)|0;if((l|0)==0){c[j+(h*48|0)+16>>2]=0}else{c[j+(h*48|0)+16>>2]=c[l>>2]}c[j+(h*48|0)+36>>2]=iea(k,1684893284)|0;c[j+(h*48|0)+40>>2]=iea(k,1684890724)|0;c[j+(h*48|0)+44>>2]=iea(k,1684370275)|0;h=h+1|0}while((h|0)!=(b|0));g=f;i=e;return g|0}function iea(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=i;d=x2(a,b)|0;if((d|0)==0){e=0}else{e=pea(d)|0}i=c;return e|0}function jea(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;c=i;if((a|0)==0){_a(740376,740184,137,740400)}d=x2(b,1918392666)|0;e=x2(b,1733843290)|0;f=x2(b,1649957210)|0;if((d|0)==0|(e|0)==0|(f|0)==0){g=0;i=c;return g|0}T3(a,+h[d>>3],+h[e>>3],+h[f>>3]);T3(a+24|0,+h[d+8>>3],+h[e+8>>3],+h[f+8>>3]);T3(a+48|0,+h[d+16>>3],+h[e+16>>3],+h[f+16>>3]);g=1;i=c;return g|0}function kea(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=(b|0)==0?2:b;b=Dda(a,28)|0;if((b|0)==0){f=0;i=d;return f|0}c[b>>2]=a;g=Eda(a,e,12)|0;c[b+12>>2]=g;if((g|0)==0){Gda(a,b);f=0;i=d;return f|0}else{c[b+4>>2]=e;c[b+8>>2]=0;f=b;i=d;return f|0}return 0}function lea(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0;h=i;j=(Y2a(g|0)|0)+1|0;k=r4(b[e>>1]|0)|0;e=r4(b[f>>1]|0)|0;if((d|0)==0){l=0;i=h;return l|0}f=Eda(c[d>>2]|0,j,4)|0;if((f|0)==0){l=0;i=h;return l|0}if((j|0)!=0){m=0;do{c[f+(m<<2)>>2]=a[g+m>>0]|0;m=m+1|0}while((m|0)!=(j|0))}m=mea(d,j<<2,f,k,e)|0;Gda(c[d>>2]|0,f);l=m;i=h;return l|0}function mea(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;h=i;if((a|0)==0){j=0;i=h;return j|0}k=a+8|0;l=c[k>>2]|0;m=a+4|0;n=c[m>>2]|0;do{if((l|0)>=(n|0)){o=a+12|0;p=Fda(c[a>>2]|0,c[o>>2]|0,n*24|0)|0;if((p|0)==0){j=0;i=h;return j|0}else{c[o>>2]=p;c[m>>2]=n<<1;q=c[k>>2]|0;break}}else{q=l}}while(0);a:do{if((q|0)>0){l=c[a+12>>2]|0;n=0;while(1){if((b[l+(n*12|0)+2>>1]|0)==g<<16>>16?(b[l+(n*12|0)>>1]|0)==f<<16>>16:0){break}m=n+1|0;if((m|0)<(q|0)){n=m}else{break a}}if((n|0)>-1){j=0;i=h;return j|0}}}while(0);q=a+16|0;l=c[q>>2]|0;m=a+20|0;p=c[m>>2]|0;b:do{if((l-p|0)>>>0<d>>>0){o=a+24|0;r=l;while(1){s=r;r=(r|0)==0?256:r<<1;if(r>>>0<s>>>0){j=0;t=18;break}s=Fda(c[a>>2]|0,c[o>>2]|0,r)|0;if((s|0)==0){j=0;t=18;break}c[o>>2]=s;c[q>>2]=r;u=c[m>>2]|0;if(!((r-u|0)>>>0<d>>>0)){v=u;w=s;break b}}if((t|0)==18){i=h;return j|0}}else{r=c[a+24>>2]|0;if((r|0)==0){j=0;i=h;return j|0}else{v=p;w=r}}}while(0);d3a(w+v|0,e|0,d|0)|0;c[m>>2]=(c[m>>2]|0)+d;m=a+12|0;c[(c[m>>2]|0)+((c[k>>2]|0)*12|0)+4>>2]=v;c[(c[m>>2]|0)+((c[k>>2]|0)*12|0)+8>>2]=d;b[(c[m>>2]|0)+((c[k>>2]|0)*12|0)+2>>1]=g;b[(c[m>>2]|0)+((c[k>>2]|0)*12|0)>>1]=f;c[k>>2]=(c[k>>2]|0)+1;j=1;i=h;return j|0}function nea(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=i;if((a|0)==0|(b|0)==0){d=0;i=c;return d|0}e=r4(21333)|0;f=r4(28261)|0;d=mea(a,((oea(b)|0)<<2)+4|0,b,f,e)|0;i=c;return d|0}function oea(a){a=a|0;var b=0,d=0;b=i;d=a;while(1){if((c[d>>2]|0)==0){break}else{d=d+4|0}}i=b;return d-a>>2|0}function pea(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;if((a|0)==0){d=0;i=b;return d|0}e=a+8|0;f=kea(c[a>>2]|0,c[e>>2]|0)|0;if((f|0)==0){d=0;i=b;return d|0}g=c[e>>2]|0;do{if(((c[f+4>>2]|0)>=(g|0)?(h=c[f+12>>2]|0,(h|0)!=0):0)?(j=c[a+12>>2]|0,(j|0)!=0):0){d3a(h|0,j|0,g*12|0)|0;c[f+8>>2]=c[e>>2];j=a+20|0;h=c[j>>2]|0;if((h|0)==0){c[f+24>>2]=0;c[f+16>>2]=c[j>>2];break}k=Cda(c[a>>2]|0,h)|0;c[f+24>>2]=k;if((k|0)!=0?(c[f+16>>2]=c[j>>2],h=c[a+24>>2]|0,(h|0)!=0):0){l=c[j>>2]|0;d3a(k|0,h|0,l|0)|0;c[f+20>>2]=l;d=f;i=b;return d|0}}}while(0);qea(f);d=0;i=b;return d|0}function qea(a){a=a|0;var b=0,d=0;b=i;if((a|0)==0){i=b;return}d=c[a+12>>2]|0;if((d|0)!=0){Gda(c[a>>2]|0,d)}d=c[a+24>>2]|0;if((d|0)!=0){Gda(c[a>>2]|0,d)}Gda(c[a>>2]|0,a);i=b;return}function rea(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0;j=i;i=i+16|0;k=j;c[k>>2]=0;if((d|0)==0){l=0;i=j;return l|0}m=b[e>>1]|0;e=r4(b[f>>1]|0)|0;f=sea(d,k,r4(m)|0,e)|0;if((f|0)==0){l=0;i=j;return l|0}e=(c[k>>2]|0)>>>2;if((g|0)==0){l=e+1|0;i=j;return l|0}if((h|0)==0){l=0;i=j;return l|0}k=(e+1|0)>>>0>h>>>0?h+ -1|0:e;if((k|0)!=0){m=~h;h=-2-e|0;e=-2-(h>>>0<m>>>0?m:h)|0;h=0;do{m=c[f+(h<<2)>>2]|0;if((m|0)==0){a[g+h>>0]=0}else{a[g+h>>0]=m}h=h+1|0}while((h|0)!=(e|0))}a[g+k>>0]=0;l=k+1|0;i=j;return l|0}function sea(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;if((a|0)==0){h=0;i=g;return h|0}if((c[a+4>>2]|0)<1){h=0;i=g;return h|0}j=c[a+8>>2]|0;k=c[a+12>>2]|0;a:do{if((j|0)>0){l=-1;m=0;while(1){if((b[k+(m*12|0)>>1]|0)==e<<16>>16){if((b[k+(m*12|0)+2>>1]|0)==f<<16>>16){break}else{n=(l|0)==-1?m:l}}else{n=l}o=m+1|0;if((o|0)<(j|0)){l=n;m=o}else{p=n;break a}}if((d|0)!=0){c[d>>2]=c[k+(m*12|0)+8>>2]}h=(c[a+24>>2]|0)+(c[k+(m*12|0)+4>>2]|0)|0;i=g;return h|0}else{p=-1}}while(0);n=(p|0)==-1?0:p;if((d|0)!=0){c[d>>2]=c[k+(n*12|0)+8>>2]}h=(c[a+24>>2]|0)+(c[k+(n*12|0)+4>>2]|0)|0;i=g;return h|0}function tea(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+16|0;f=e;c[f>>2]=0;if((a|0)==0){i=e;return}g=r4(0)|0;h=sea(a,f,g,g)|0;if((h|0)==0|(b|0)==0|(d|0)==0){i=e;return}g=c[f>>2]|0;if((g+4|0)>>>0>d>>>0){a=d+ -4|0;c[f>>2]=a;j=a}else{j=g}d3a(b|0,h|0,j|0)|0;c[b+(j>>>2<<2)>>2]=0;i=e;return}function uea(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0;h=i;j=Dda(b,88)|0;if((j|0)==0){k=0;i=h;return k|0}c[j+80>>2]=0;c[j>>2]=0;c[j+84>>2]=b;b=j+4|0;if((c[b>>2]|0)>>>0<d>>>0){do{vea(j)|0}while((c[b>>2]|0)>>>0<d>>>0)}Z2a(j+12|0,f|0,32)|0;Z2a(j+45|0,g|0,32)|0;a[j+77>>0]=0;a[j+44>>0]=0;c[j+8>>2]=e;k=j;i=h;return k|0}function vea(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;if(((a|0)!=0?(d=a+4|0,e=c[d>>2]|0,f=(e|0)==0?64:e<<1,!(f>>>0>102400)):0)?(e=a+80|0,g=Fda(c[a+84>>2]|0,c[e>>2]|0,f*294|0)|0,(g|0)!=0):0){c[e>>2]=g;c[d>>2]=f;h=1}else{h=0}i=b;return h|0}function wea(a){a=a|0;var b=0,d=0,e=0;b=i;if((a|0)==0){i=b;return}d=c[a+80>>2]|0;e=a+84|0;if((d|0)!=0){Gda(c[e>>2]|0,d)}Gda(c[e>>2]|0,a);i=b;return}function xea(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;if((a|0)==0){d=0;i=b;return d|0}e=a+8|0;f=a+12|0;g=a+45|0;h=uea(c[a+84>>2]|0,c[a>>2]|0,c[e>>2]|0,f,g)|0;if((h|0)==0){d=0;i=b;return d|0}j=h+4|0;k=a+4|0;if((c[j>>2]|0)>>>0<(c[k>>2]|0)>>>0){do{vea(h)|0}while((c[j>>2]|0)>>>0<(c[k>>2]|0)>>>0)}d3a(h+12|0,f|0,33)|0;d3a(h+45|0,g|0,33)|0;c[h+8>>2]=c[e>>2];d3a(c[h+80>>2]|0,c[a+80>>2]|0,(c[a>>2]|0)*294|0)|0;c[h>>2]=c[a>>2];d=h;i=b;return d|0}function yea(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=i;if((d|0)==0){j=0;i=h;return j|0}if(((c[d>>2]|0)+1|0)>>>0>(c[d+4>>2]|0)>>>0?(vea(d)|0)==0:0){j=0;i=h;return j|0}k=d+8|0;if((c[k>>2]|0)==0){l=d+80|0}else{m=(g|0)==0;n=d+80|0;o=0;do{if(m){p=0}else{p=b[g+(o<<1)>>1]|0}b[(c[n>>2]|0)+((c[d>>2]|0)*294|0)+(o<<1)+262>>1]=p;o=o+1|0}while(o>>>0<(c[k>>2]|0)>>>0);l=n}if((f|0)==0){b[(c[l>>2]|0)+((c[d>>2]|0)*294|0)+256>>1]=0;b[(c[l>>2]|0)+((c[d>>2]|0)*294|0)+258>>1]=0;q=0}else{b[(c[l>>2]|0)+((c[d>>2]|0)*294|0)+256>>1]=b[f>>1]|0;b[(c[l>>2]|0)+((c[d>>2]|0)*294|0)+258>>1]=b[f+2>>1]|0;q=b[f+4>>1]|0}b[(c[l>>2]|0)+((c[d>>2]|0)*294|0)+260>>1]=q;q=(c[l>>2]|0)+((c[d>>2]|0)*294|0)|0;if((e|0)==0){a[q>>0]=0}else{Z2a(q|0,e|0,255)|0;a[(c[l>>2]|0)+((c[d>>2]|0)*294|0)+255>>0]=0}c[d>>2]=(c[d>>2]|0)+1;j=1;i=h;return j|0}function zea(a){a=a|0;var b=0;if((a|0)==0){b=0}else{b=c[a>>2]|0}return b|0}function Aea(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=i;if((a|0)==0){h=0;i=g;return h|0}if(!((c[a>>2]|0)>>>0>b>>>0)){h=0;i=g;return h|0}if((d|0)!=0){h3a(d|0,(c[a+80>>2]|0)+(b*294|0)|0)|0}if((e|0)!=0){d3a(e|0,(c[a+80>>2]|0)+(b*294|0)+256|0,6)|0}if((f|0)==0){h=1;i=g;return h|0}d3a(f|0,(c[a+80>>2]|0)+(b*294|0)+262|0,c[a+8>>2]<<1|0)|0;h=1;i=g;return h|0}function Bea(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=c[a+84>>2]|0;f=(b|0)!=0;if(f){g=3}else{g=c[a+8>>2]|0}b=E2(e,1852009504,1,g,f?194:193,227,556,xea(a)|0)|0;i=d;return b|0}function Cea(a,b,d){a=a|0;b=b|0;d=d|0;var f=0,h=0,j=0;f=i;i=i+16|0;h=f;j=c[d+32>>2]|0;d=(Qea(+g[a>>2]*65535.0)|0)&65535;if(d>>>0<(c[j>>2]|0)>>>0){a=j+80|0;g[b>>2]=+(e[(c[a>>2]|0)+(d*294|0)+256>>1]|0|0)/65535.0;g[b+4>>2]=+(e[(c[a>>2]|0)+(d*294|0)+258>>1]|0|0)/65535.0;g[b+8>>2]=+(e[(c[a>>2]|0)+(d*294|0)+260>>1]|0|0)/65535.0;i=f;return}else{a=c[j+84>>2]|0;c[h>>2]=d;Jda(a,2,740704,h);i=f;return}}function Dea(a,b,d){a=a|0;b=b|0;d=d|0;var f=0,h=0,j=0;f=i;i=i+16|0;h=f;j=c[d+32>>2]|0;d=(Qea(+g[a>>2]*65535.0)|0)&65535;if(!(d>>>0<(c[j>>2]|0)>>>0)){a=c[j+84>>2]|0;c[h>>2]=d;Jda(a,2,740704,h);i=f;return}h=j+8|0;if((c[h>>2]|0)==0){i=f;return}a=j+80|0;j=0;do{g[b+(j<<2)>>2]=+(e[(c[a>>2]|0)+(d*294|0)+(j<<1)+262>>1]|0|0)/65535.0;j=j+1|0}while(j>>>0<(c[h>>2]|0)>>>0);i=f;return}function Eea(a){a=a|0;var b=0,d=0;b=i;d=xea(c[a+32>>2]|0)|0;i=b;return d|0}function Fea(a){a=a|0;var b=0;b=i;wea(c[a+32>>2]|0);i=b;return}function Gea(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;if((b|0)==0|b>>>0>255){e=0;i=d;return e|0}f=Dda(a,12)|0;if((f|0)==0){e=0;i=d;return e|0}c[f+4>>2]=a;g=Eda(a,b,48)|0;h=f+8|0;c[h>>2]=g;c[f>>2]=b;if((g|0)==0){Gda(a,f);e=0;i=d;return e|0}else{j=g;k=0}while(1){c[j+(k*48|0)+36>>2]=0;c[(c[h>>2]|0)+(k*48|0)+40>>2]=0;c[(c[h>>2]|0)+(k*48|0)+44>>2]=0;g=k+1|0;if((g|0)==(b|0)){e=f;break}j=c[h>>2]|0;k=g}i=d;return e|0}function Hea(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;d=a+8|0;e=c[d>>2]|0;if((c[a>>2]|0)==0){f=e}else{g=e;e=0;while(1){h=c[g+(e*48|0)+36>>2]|0;if((h|0)==0){j=g}else{qea(h);j=c[d>>2]|0}h=c[j+(e*48|0)+40>>2]|0;if((h|0)==0){k=j}else{qea(h);k=c[d>>2]|0}h=c[k+(e*48|0)+44>>2]|0;if((h|0)==0){l=k}else{qea(h);l=c[d>>2]|0}e=e+1|0;if(!(e>>>0<(c[a>>2]|0)>>>0)){f=l;break}else{g=l}}}l=a+4|0;if((f|0)==0){m=c[l>>2]|0;Gda(m,a);i=b;return}Gda(c[l>>2]|0,f);m=c[l>>2]|0;Gda(m,a);i=b;return}function Iea(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;if((a|0)==0){d=0;i=b;return d|0}e=a+4|0;f=Cda(c[e>>2]|0,12)|0;if((f|0)==0){d=0;i=b;return d|0}g=Eda(c[e>>2]|0,c[a>>2]|0,48)|0;h=f+8|0;c[h>>2]=g;if((g|0)==0){Hea(f);d=0;i=b;return d|0}c[f+4>>2]=c[e>>2];e=c[a>>2]|0;c[f>>2]=e;if((e|0)==0){d=f;i=b;return d|0}e=a+8|0;j=g;g=0;while(1){k=(c[e>>2]|0)+(g*48|0)+8|0;l=c[k+4>>2]|0;m=j+(g*48|0)+8|0;c[m>>2]=c[k>>2];c[m+4>>2]=l;c[(c[h>>2]|0)+(g*48|0)>>2]=c[(c[e>>2]|0)+(g*48|0)>>2];c[(c[h>>2]|0)+(g*48|0)+4>>2]=c[(c[e>>2]|0)+(g*48|0)+4>>2];d3a((c[h>>2]|0)+(g*48|0)+20|0,(c[e>>2]|0)+(g*48|0)+20|0,16)|0;c[(c[h>>2]|0)+(g*48|0)+16>>2]=c[(c[e>>2]|0)+(g*48|0)+16>>2];l=pea(c[(c[e>>2]|0)+(g*48|0)+36>>2]|0)|0;c[(c[h>>2]|0)+(g*48|0)+36>>2]=l;l=pea(c[(c[e>>2]|0)+(g*48|0)+40>>2]|0)|0;c[(c[h>>2]|0)+(g*48|0)+40>>2]=l;l=pea(c[(c[e>>2]|0)+(g*48|0)+44>>2]|0)|0;c[(c[h>>2]|0)+(g*48|0)+44>>2]=l;l=g+1|0;if(!(l>>>0<(c[a>>2]|0)>>>0)){d=f;break}j=c[h>>2]|0;g=l}i=b;return d|0}function Jea(a){a=a|0;var b=0,d=0,e=0;b=i;d=Dda(a,8)|0;if((d|0)==0){e=0}else{c[d+4>>2]=a;e=d}i=b;return e|0}function Kea(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;if((a|0)==0){_a(740520,740544,833,740600)}d=c[a>>2]|0;e=a+4|0;if((d|0)==0){f=c[e>>2]|0;Gda(f,a);i=b;return}else{g=d}do{d=c[g+4>>2]|0;if((d|0)!=0){qea(d)}d=c[g+8>>2]|0;if((d|0)!=0){qea(d)}d=c[g+12>>2]|0;if((d|0)!=0){Gda(c[e>>2]|0,d)}d=c[g+16>>2]|0;if((d|0)!=0){Gda(c[e>>2]|0,d)}d=g;g=c[g>>2]|0;Gda(c[e>>2]|0,d)}while((g|0)!=0);f=c[e>>2]|0;Gda(f,a);i=b;return}function Lea(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;if((a|0)==0){_a(740520,740544,869,740616)}if((b|0)==0){_a(740632,740544,870,740616)}h=a+4|0;j=Dda(c[h>>2]|0,20)|0;if((j|0)==0){k=0;i=g;return k|0}c[j+4>>2]=pea(e)|0;c[j+8>>2]=pea(f)|0;c[j+12>>2]=Mea(c[h>>2]|0,b)|0;c[j+16>>2]=Mea(c[h>>2]|0,d)|0;c[j>>2]=c[a>>2];c[a>>2]=j;k=1;i=g;return k|0}function Mea(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;if((b|0)==0){d=0;i=c;return d|0}d=Hda(a,b,((oea(b)|0)<<2)+4|0)|0;i=c;return d|0}function Nea(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;if((a|0)==0){_a(740656,740544,894,740688)}d=Jea(c[a+4>>2]|0)|0;if((d|0)==0){e=0;i=b;return e|0}f=c[a>>2]|0;if((f|0)==0){e=d;i=b;return e|0}else{g=f}while(1){if((Lea(d,c[g+12>>2]|0,c[g+16>>2]|0,c[g+4>>2]|0,c[g+8>>2]|0)|0)==0){break}g=c[g>>2]|0;if((g|0)==0){e=d;h=8;break}}if((h|0)==8){i=b;return e|0}Kea(d);e=0;i=b;return e|0}function Oea(a){a=a|0;var b=0;if((a|0)==0){b=0}else{b=c[a>>2]|0}return b|0}function Pea(a){a=a|0;var b=0;if((a|0)==0){b=0}else{b=c[a>>2]|0}return b|0}function Qea(a){a=+a;var b=0,d=0.0,e=0;b=i;d=a+.5;if(!(d<=0.0)){if(!(d>=65535.0)){h[k>>3]=d+-32767.0+103079215104.0;e=((c[k>>2]|0)>>>16)+32767&65535}else{e=-1}}else{e=0}i=b;return e|0}function Rea(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0;h=i;j=U4(a,12)|0;a=c[b>>2]|0;if((c[g>>2]&2|0)!=0){Sea(a)|0;Tea(b,d,e,f,g)|0;i=h;return}if((c[a>>2]|0)==0){K3(a,195,a,0,0);i=h;return}Sea(a)|0;a=c[b>>2]|0;if((c[a>>2]|0)==0){K3(a,195,a,0,0);i=h;return}if((c[g>>2]&256|0)!=0){i=h;return}a=c[j>>2]|0;a:do{if((a|0)==0){k=740744}else{j=a;while(1){if((ed[c[j>>2]&127](b,d,e,f,g)|0)!=0){break}j=c[j+4>>2]|0;if((j|0)==0){k=740744;break a}}i=h;return}}while(0);while(1){if((ed[c[k>>2]&127](b,d,e,f,g)|0)!=0){l=13;break}k=c[k+4>>2]|0;if((k|0)==0){l=13;break}}if((l|0)==13){i=h;return}}function Sea(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;d=0;do{e=c[a>>2]|0;a:do{if((e|0)==0){f=0}else{g=e;h=0;j=a;while(1){k=g;l=h;while(1){if((c[k+8>>2]|0)!=1768189472){break}tfa(j);m=c[j>>2]|0;if((m|0)==0){f=1;break a}else{k=m;l=1}}j=k+36|0;g=c[j>>2]|0;if((g|0)==0){f=l;break}else{h=l}}}}while(0);e=sfa(a,1815246880,2016570400)|0|f;h=e|(sfa(a,2016570400,1815246880)|0);e=h|(sfa(a,874525216,840971296)|0);h=e|(sfa(a,840971296,874525216)|0);e=h|(sfa(a,1681026080,1815241760)|0);h=(e|(sfa(a,1681029152,2016568352)|0)|0)!=0;d=h?1:d}while(h);i=b;return d|0}function Tea(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;g=i;i=i+16|0;h=g+4|0;j=g;c[h>>2]=0;c[j>>2]=0;k=c[d>>2]|0;if((vfa(k)|0)!=0){l=0;i=g;return l|0}d=c[e>>2]|0;if((vfa(d)|0)!=0){l=0;i=g;return l|0}e=o4(k>>>16&31)|0;k=o4(d>>>16&31)|0;d=l4(e,c[f>>2]|0)|0;m=c[a>>2]|0;n=c[m>>2]|0;o=(I2(n)|0)==0;p=o?2:d;d=I3(n)|0;a:do{if((d|0)!=0){n=d;while(1){if((r3(c[n+4>>2]|0)|0)==1852009504){l=0;break}n=t3(c[n+36>>2]|0)|0;if((n|0)==0){break a}}i=g;return l|0}}while(0);d=m+32|0;n=m+4|0;o=m+8|0;q=v3(c[d>>2]|0,c[n>>2]|0,c[o>>2]|0)|0;if((q|0)==0){l=0;i=g;return l|0}if(((c[f>>2]&16|0)!=0?(r=I3(c[m>>2]|0)|0,(c[r+4>>2]|0)==1668707188):0)?(mfa(r)|0)==0:0){s=u3(r)|0;if((F3(q,0,s)|0)!=0){G3(m,0,h);t=s;u=12}}else{t=0;u=12}do{if((u|0)==12){s=Z2(c[d>>2]|0,p,c[n>>2]|0,c[o>>2]|0,0)|0;if((s|0)==0){l=0;i=g;return l|0}if((F3(q,1,s)|0)!=0){if(((c[f>>2]&1|0)!=0?(r=J3(m)|0,(r3(c[r+4>>2]|0)|0)==1668707188):0)?(mfa(r)|0)==0:0){v=u3(r)|0;if((F3(q,1,v)|0)==0){break}G3(m,1,j);w=v}else{w=0}if((b3(s,222,m)|0)!=0){v=c[h>>2]|0;if((v|0)!=0){O2(v)}v=c[j>>2]|0;if((v|0)!=0){O2(v)}B3(m);v=c[s+32>>2]|0;if((t|0)==0){x=0}else{x=c[(c[t+32>>2]|0)+4>>2]|0}if((w|0)==0){y=0}else{y=c[(c[w+32>>2]|0)+4>>2]|0}if((x|0)==0&(y|0)==0){s=c[v+4>>2]|0;K3(q,c[s+116>>2]|0,s,0,0)}else{K3(q,196,bfa(c[q+32>>2]|0,c[v+4>>2]|0,c[q+4>>2]|0,x,c[q+8>>2]|0,y)|0,326,265)}v=c[f>>2]|0;if((b|0)==3){s=v|4;c[f>>2]=s;z=s}else{z=v}if((z&4|0)==0){ffa(q,e,k)|0}c[a>>2]=q;l=1;i=g;return l|0}}}}while(0);a=c[h>>2]|0;if((a|0)!=0?(F3(m,0,a)|0)==0:0){_a(741016,740912,652,741024)}a=c[j>>2]|0;if((a|0)!=0?(F3(m,1,a)|0)==0:0){_a(741016,740912,657,741024)}B3(q);l=0;i=g;return l|0}function Uea(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;g=e+4|0;if((c[g>>2]|0)==0){i=f;return}else{h=0}do{b[d+(h<<1)>>1]=b[a+(h<<1)>>1]|0;h=h+1|0}while(h>>>0<(c[g>>2]|0)>>>0);i=f;return}function Vea(a,d,e,f,h){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0,w=0,x=0,y=0;d=i;i=i+128|0;j=d+64|0;k=d;l=c[a>>2]|0;if((vfa(c[e>>2]|0)|0)!=0){m=0;i=d;return m|0}if((vfa(c[f>>2]|0)|0)!=0){m=0;i=d;return m|0}f=I3(c[l>>2]|0)|0;a:do{if((f|0)!=0){n=f;while(1){if((r3(c[n+4>>2]|0)|0)!=1668707188){m=0;break}n=t3(c[n+36>>2]|0)|0;if((n|0)==0){break a}}i=d;return m|0}}while(0);f=l+32|0;n=l+4|0;o=v3(c[f>>2]|0,c[n>>2]|0,c[l+8>>2]|0)|0;if((o|0)==0){m=0;i=d;return m|0}p=Eda(c[f>>2]|0,c[n>>2]|0,4)|0;if((p|0)!=0){b:do{if((c[n>>2]|0)==0){q=0;r=10}else{s=0;while(1){t=M0(c[f>>2]|0,4096,0)|0;c[p+(s<<2)>>2]=t;s=s+1|0;if((t|0)==0){break b}t=c[n>>2]|0;if(!(s>>>0<t>>>0)){q=t;r=10;break}}}}while(0);do{if((r|0)==10){s=q;t=0;while(1){if((s|0)!=0){u=+(t>>>0)/4095.0;v=0;do{g[j+(v<<2)>>2]=u;v=v+1|0}while(v>>>0<(c[n>>2]|0)>>>0)}D3(j,k,l);if((c[n>>2]|0)==0){w=0}else{v=0;do{x=Yea(+g[k+(v<<2)>>2]*65535.0)|0;b[(c[(c[p+(v<<2)>>2]|0)+24>>2]|0)+(t<<1)>>1]=x;v=v+1|0;x=c[n>>2]|0}while(v>>>0<x>>>0);w=x}t=t+1|0;if((t|0)==4096){break}else{s=w}}s=K2(c[f>>2]|0,w,p)|0;if((s|0)!=0){if((c[n>>2]|0)!=0){t=0;do{v=p+(t<<2)|0;V0(c[v>>2]|0);c[v>>2]=0;t=t+1|0}while(t>>>0<(c[n>>2]|0)>>>0)}Gda(c[f>>2]|0,p);do{if((mfa(s)|0)==0){if((F3(o,0,s)|0)!=0){t=(wfa(c[e>>2]|0)|0)==0;v=c[s+32>>2]|0;if(t){t=s3(v)|0;x=nfa(c[o+32>>2]|0,c[t>>2]|0,65536,c[t+4>>2]|0)|0;if((x|0)==0){r=31;break}c[h>>2]=c[h>>2]|64;K3(o,198,x,327,266);break}else{x=nfa(c[o+32>>2]|0,c[v>>2]|0,256,c[v+4>>2]|0)|0;if((x|0)==0){r=31;break}c[h>>2]=c[h>>2]|64;K3(o,197,x,327,266);break}}else{r=31}}else{O2(s);if((F3(o,0,F2(c[o+32>>2]|0,c[n>>2]|0)|0)|0)==0){r=31}else{c[h>>2]=c[h>>2]|64;K3(o,195,o,0,0)}}}while(0);if((r|0)==31){O2(s);break}B3(l);c[a>>2]=o;m=1;i=d;return m|0}}}while(0);a=c[n>>2]|0;if((a|0)!=0){l=a;a=0;while(1){r=c[p+(a<<2)>>2]|0;if((r|0)==0){y=l}else{V0(r);y=c[n>>2]|0}a=a+1|0;if(!(a>>>0<y>>>0)){break}else{l=y}}}Gda(c[f>>2]|0,p)}B3(o);m=0;i=d;return m|0}function Wea(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;g=i;i=i+128|0;j=g+72|0;k=g+120|0;l=g+116|0;m=g+112|0;n=g+108|0;o=g;p=g+104|0;q=c[d>>2]|0;if((q&120|0)!=24){r=0;i=g;return r|0}if((c[e>>2]&120|0)!=24){r=0;i=g;return r|0}if((wfa(q)|0)==0){r=0;i=g;return r|0}q=c[a>>2]|0;c[j>>2]=1668707188;c[j+4>>2]=1835103334;c[j+8>>2]=1835103334;c[j+12>>2]=1668707188;c[j+16>>2]=k;c[j+20>>2]=m;c[j+24>>2]=n;c[j+28>>2]=l;if((H2(q,4,j)|0)==0){r=0;i=g;return r|0}j=s3(c[(c[m>>2]|0)+32>>2]|0)|0;m=s3(c[(c[n>>2]|0)+32>>2]|0)|0;if((c[j+4>>2]|0)!=0){r=0;i=g;return r|0}W3(o,c[m>>2]|0,c[j>>2]|0);if((V3(o)|0)==0){s=0}else{s=(c[m+4>>2]|0)==0&1}j=v3(c[q+32>>2]|0,c[q+4>>2]|0,c[q+8>>2]|0)|0;c[p>>2]=j;if((j|0)==0){r=0;i=g;return r|0}do{if((F3(j,0,u3(c[k>>2]|0)|0)|0)!=0){n=(s|0)!=0;if(!n?(F3(j,1,Q2(c[j+32>>2]|0,3,3,o,c[m+4>>2]|0)|0)|0)==0:0){break}if((F3(j,1,u3(c[l>>2]|0)|0)|0)!=0){if(!n){n=s3(c[(c[k>>2]|0)+32>>2]|0)|0;t=s3(c[(c[l>>2]|0)+32>>2]|0)|0;c[f>>2]=c[f>>2]|64;u=c[n+4>>2]|0;n=c[m+4>>2]|0;v=c[t+4>>2]|0;t=wfa(c[e>>2]|0)|0;w=j+32|0;x=Cda(c[w>>2]|0,101436)|0;if((x|0)==0){y=j}else{c[x>>2]=c[w>>2];hfa(x+4|0,c[u>>2]|0);hfa(x+1028|0,c[u+4>>2]|0);hfa(x+2052|0,c[u+8>>2]|0);ifa(x+3124|0,c[v>>2]|0,t);ifa(x+35894|0,c[v+4>>2]|0,t);ifa(x+68664|0,c[v+8>>2]|0,t);v=x+3076|0;u=0;do{c[v+(u*12|0)>>2]=~~+Q(+(+h[o+(u*24|0)>>3]*16384.0+.5));c[v+(u*12|0)+4>>2]=~~+Q(+(+h[o+(u*24|0)+8>>3]*16384.0+.5));c[v+(u*12|0)+8>>2]=~~+Q(+(+h[o+(u*24|0)+16>>3]*16384.0+.5));u=u+1|0}while((u|0)!=3);u=x+3112|0;if((n|0)==0){c[u>>2]=0;c[x+3116>>2]=0;c[x+3120>>2]=0}else{c[u>>2]=~~+Q(+(+h[n>>3]*16384.0+.5));c[x+3116>>2]=~~+Q(+(+h[n+8>>3]*16384.0+.5));c[x+3120>>2]=~~+Q(+(+h[n+16>>3]*16384.0+.5))}if((t|0)!=0){c[e>>2]=c[e>>2]|2097152}K3(j,199,x,328,267);y=j}}else{Vea(p,b,d,e,f)|0;y=c[p>>2]|0}B3(q);c[a>>2]=y;r=1;i=g;return r|0}}}while(0);B3(j);r=0;i=g;return r|0}function Xea(a,d,f,h,j){a=a|0;d=d|0;f=f|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0.0,N=0.0,O=0.0,P=0,R=0,S=0,T=0.0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0;k=i;i=i+256|0;l=k+192|0;m=k+128|0;n=k+64|0;o=k;p=c[f>>2]|0;if((vfa(p)|0)!=0){q=0;i=k;return q|0}r=c[h>>2]|0;if((vfa(r)|0)!=0){q=0;i=k;return q|0}if((p&2031616|0)!=262144){q=0;i=k;return q|0}if((r&2031616|0)!=262144){q=0;i=k;return q|0}if((wfa(p)|0)==0?(c[j>>2]&16|0)==0:0){q=0;i=k;return q|0}h=c[a>>2]|0;s=I3(c[h>>2]|0)|0;a:do{if((s|0)!=0){t=s;while(1){if((r3(c[t+4>>2]|0)|0)==1852009504){q=0;break}t=t3(c[t+36>>2]|0)|0;if((t|0)==0){break a}}i=k;return q|0}}while(0);s=o4(p>>>16&31)|0;p=o4(r>>>16&31)|0;r=l4(s,c[j>>2]|0)|0;t=l+0|0;u=t+64|0;do{c[t>>2]=0;t=t+4|0}while((t|0)<(u|0));t=m+0|0;u=t+64|0;do{c[t>>2]=0;t=t+4|0}while((t|0)<(u|0));t=h+4|0;b:do{if((c[t>>2]|0)==0){v=0;w=13}else{u=h+32|0;x=0;while(1){y=M0(c[u>>2]|0,4096,0)|0;c[l+(x<<2)>>2]=y;x=x+1|0;if((y|0)==0){z=0;A=0;break b}y=c[t>>2]|0;if(!(x>>>0<y>>>0)){v=y;w=13;break}}}}while(0);c:do{if((w|0)==13){x=v;u=0;while(1){B=+(u>>>0)/4095.0;if((x|0)!=0){y=0;do{g[n+(y<<2)>>2]=B;y=y+1|0}while(y>>>0<(c[t>>2]|0)>>>0)}D3(n,o,h);if((c[t>>2]|0)==0){C=0}else{y=0;do{D=Yea(+g[o+(y<<2)>>2]*65535.0)|0;b[(c[(c[l+(y<<2)>>2]|0)+24>>2]|0)+(u<<1)>>1]=D;y=y+1|0;D=c[t>>2]|0}while(y>>>0<D>>>0);C=D}u=u+1|0;if((u|0)==4096){break}else{x=C}}if((C|0)==0){E=0;F=1;G=0}else{x=0;do{u=c[l+(x<<2)>>2]|0;y=u+20|0;D=c[y>>2]|0;H=~~+Q(+(+(D>>>0)*.02+.5));I=D-H|0;D=I+ -1|0;J=($0(u)|0)==0;B=J?65535.0:0.0;K=u+24|0;u=c[K>>2]|0;L=+(e[u+(H<<1)>>1]|0);M=+(H|0);N=(L-(J?0.0:65535.0))/M;O=L-M*N;if((H|0)>0){J=u;P=0;while(1){b[J+(P<<1)>>1]=Yea(O+N*+(P|0))|0;P=P+1|0;R=c[K>>2]|0;if((P|0)==(H|0)){S=R;break}else{J=R}}}else{S=u}J=S+(D<<1)|0;N=+(e[J>>1]|0);O=(B-N)/M;L=+(D|0)*O;T=N-L;if((D|0)<(c[y>>2]|0)?(b[J>>1]=Yea(T+L)|0,(I|0)<(c[y>>2]|0)):0){J=I;do{H=c[K>>2]|0;b[H+(J<<1)>>1]=Yea(T+O*+(J|0))|0;J=J+1|0}while((J|0)<(c[y>>2]|0))}x=x+1|0;y=c[t>>2]|0}while(x>>>0<y>>>0);E=y;F=1;G=0}while(1){if(!(G>>>0<E>>>0)){break}x=l+(G<<2)|0;b1(c[x>>2]|0)|0;y=(c1(c[x>>2]|0)|0)==0;J=y?0:F;y=c[x>>2]|0;x=c[y+20>>2]|0;if((x|0)>0){K=c[y+24>>2]|0;y=0;I=0;D=0;do{u=b[K+(D<<1)>>1]|0;I=(u<<16>>16==0&1)+I|0;y=(u<<16>>16==-1&1)+y|0;D=D+1|0}while((D|0)!=(x|0));if((I|0)==1&(y|0)==1){U=J}else{V=y;W=I;w=33}}else{V=0;W=0;w=33}if((w|0)==33){w=0;D=(x|0)/4|0;if((W|0)>(D|0)){z=0;A=0;break c}U=(V|0)<=(D|0)?J:0}if((U|0)==0){z=0;A=0;break c}E=c[t>>2]|0;F=U;G=G+1|0}if((E|0)!=0){D=0;do{K=Z0(c[l+(D<<2)>>2]|0)|0;c[m+(D<<2)>>2]=K;D=D+1|0;if((K|0)==0){z=0;A=0;break c}}while(D>>>0<(c[t>>2]|0)>>>0)}D=E3(h)|0;if((D|0)!=0){K=h+32|0;if((F3(D,0,K2(c[K>>2]|0,c[t>>2]|0,m)|0)|0)!=0?(u=h+8|0,H=v3(c[K>>2]|0,c[t>>2]|0,c[u>>2]|0)|0,(H|0)!=0):0){P=K2(c[K>>2]|0,c[t>>2]|0,l)|0;if(((F3(H,0,P)|0)!=0?(R=Z2(c[K>>2]|0,r,c[t>>2]|0,c[u>>2]|0,0)|0,(F3(H,1,R)|0)!=0):0)?(b3(R,222,D)|0)!=0:0){if((c[t>>2]|0)!=0){u=0;do{K=c[l+(u<<2)>>2]|0;if((K|0)!=0){V0(K)}K=c[m+(u<<2)>>2]|0;if((K|0)!=0){V0(K)}u=u+1|0}while(u>>>0<(c[t>>2]|0)>>>0)}B3(D);u=J2(c[P+32>>2]|0)|0;K=c[R+32>>2]|0;X=(wfa(c[f>>2]|0)|0)==0;Y=c[H+32>>2]|0;Z=c[K+4>>2]|0;do{if(X){K=bfa(Y,Z,3,u,3,0)|0;if((K|0)==0){q=0;i=k;return q|0}else{K3(H,196,K,326,265);break}}else{K=Dda(Y,4616)|0;if((K|0)==0){q=0;i=k;return q|0}_=(u|0)==0;$=Z+48|0;aa=Z+52|0;ba=Z+56|0;da=Z+88|0;ea=K+1544|0;fa=Z+84|0;ga=K+2568|0;ha=Z+80|0;ia=K+3592|0;ja=K+8|0;ka=K+520|0;la=K+1032|0;ma=u+4|0;na=u+8|0;oa=0;do{if(_){pa=(oa<<8|oa)&65535;qa=pa;ra=pa;sa=pa}else{pa=(oa<<8|oa)&65535;ta=e1(c[u>>2]|0,pa)|0;ua=e1(c[ma>>2]|0,pa)|0;qa=ta;ra=ua;sa=e1(c[na>>2]|0,pa)|0}pa=ca(c[$>>2]|0,qa&65535)|0;ua=((pa+32767|0)/65535|0)+pa|0;pa=ca(c[aa>>2]|0,ra&65535)|0;ta=((pa+32767|0)/65535|0)+pa|0;pa=ca(c[ba>>2]|0,sa&65535)|0;va=((pa+32767|0)/65535|0)+pa|0;c[ea+(oa<<2)>>2]=ca(c[da>>2]|0,ua>>16)|0;c[ga+(oa<<2)>>2]=ca(c[fa>>2]|0,ta>>16)|0;c[ia+(oa<<2)>>2]=ca(c[ha>>2]|0,va>>16)|0;b[ja+(oa<<1)>>1]=ua;b[ka+(oa<<1)>>1]=ta;b[la+(oa<<1)>>1]=va;oa=oa+1|0}while((oa|0)!=256);c[K>>2]=Y;c[K+4>>2]=Z;K3(H,200,K,329,268)}}while(0);Z=c[j>>2]|0;if((d|0)==3){Y=Z|4;c[j>>2]=Y;wa=Y}else{wa=Z}do{if((wa&4|0)==0){if((ffa(H,s,p)|0)==0){q=0}else{break}i=k;return q|0}}while(0);B3(h);c[a>>2]=H;q=1;i=k;return q|0}else{z=D;A=H}}else{z=D;A=0}}else{z=0;A=0}}}while(0);if((c[t>>2]|0)!=0){a=0;do{h=c[l+(a<<2)>>2]|0;if((h|0)!=0){V0(h)}h=c[m+(a<<2)>>2]|0;if((h|0)!=0){V0(h)}a=a+1|0}while(a>>>0<(c[t>>2]|0)>>>0)}if((z|0)!=0){B3(z)}if((A|0)==0){q=0;i=k;return q|0}B3(A);q=0;i=k;return q|0}function Yea(a){a=+a;var b=0,d=0.0,e=0;b=i;d=a+.5;if(!(d<=0.0)){if(!(d>=65535.0)){h[k>>3]=d+-32767.0+103079215104.0;e=((c[k>>2]|0)>>>16)+32767&65535}else{e=-1}}else{e=0}i=b;return e|0}function Zea(a,d,f){a=a|0;d=d|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0;h=i;i=i+128|0;j=h+64|0;k=h;l=c[f+4>>2]|0;if(!(l>>>0<16)){_a(740880,740912,329,740968)}m=f+8|0;if(!((c[m>>2]|0)>>>0<16)){_a(740984,740912,330,740968)}if((l|0)!=0){n=0;do{g[j+(n<<2)>>2]=+(e[a+(n<<1)>>1]|0|0)/65535.0;n=n+1|0}while(n>>>0<l>>>0)}D3(j,k,f);if((c[m>>2]|0)==0){i=h;return 1}else{o=0}do{b[d+(o<<1)>>1]=Yea(+g[k+(o<<2)>>2]*65535.0)|0;o=o+1|0}while(o>>>0<(c[m>>2]|0)>>>0);i=h;return 1}function _ea(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;g=i;h=c[f+4>>2]|0;j=c[h+12>>2]|0;k=c[h+112>>2]|0;l=(e[a>>1]|0)>>>8&65535;m=(e[a+2>>1]|0)>>>8&65535;n=(e[a+4>>1]|0)>>>8&65535;a=c[f+1544+(l<<2)>>2]|0;o=c[f+2568+(m<<2)>>2]|0;p=c[f+3592+(n<<2)>>2]|0;q=b[f+8+(l<<1)>>1]|0;l=q&65535;r=b[f+520+(m<<1)>>1]|0;m=r&65535;s=b[f+1032+(n<<1)>>1]|0;n=s&65535;if(q<<16>>16==0){t=0}else{t=c[h+88>>2]|0}f=t+a|0;if(r<<16>>16==0){u=0}else{u=c[h+84>>2]|0}t=u+o|0;if(s<<16>>16==0){v=0}else{v=c[h+80>>2]|0}h=v+p|0;if((j|0)<=0){i=g;return}v=o+a|0;u=v+p|0;w=(q&65535)<(r&65535);x=(r&65535)<(s&65535);y=w|x;z=(q&65535)<(s&65535);A=(s&65535)<(r&65535);B=z|A;C=(s&65535)<(q&65535);s=C|w;w=(r&65535)<(q&65535);q=w|z;z=x|C;C=A|w;w=t+f|0;A=w+h|0;x=t+a|0;r=x+h|0;D=h+v|0;v=x+p|0;x=w+p|0;w=p+a+t|0;t=f+o|0;a=t+h|0;h=t+p|0;t=p+o+f|0;f=0;do{o=e[k+(u+f<<1)>>1]|0;do{if(y){if(!B){p=e[k+(h+f<<1)>>1]|0;E=e[k+(a+f<<1)>>1]|0;F=p-o|0;G=(e[k+(A+f<<1)>>1]|0)-E|0;H=E-p|0;break}if(!s){p=e[k+(a+f<<1)>>1]|0;E=e[k+(D+f<<1)>>1]|0;F=p-E|0;G=(e[k+(A+f<<1)>>1]|0)-p|0;H=E-o|0;break}if(!q){E=e[k+(x+f<<1)>>1]|0;p=e[k+(w+f<<1)>>1]|0;F=E-p|0;G=p-o|0;H=(e[k+(A+f<<1)>>1]|0)-E|0;break}if(!z){E=e[k+(r+f<<1)>>1]|0;p=e[k+(v+f<<1)>>1]|0;F=(e[k+(A+f<<1)>>1]|0)-E|0;G=p-o|0;H=E-p|0;break}if(C){F=0;G=0;H=0}else{p=e[k+(r+f<<1)>>1]|0;E=e[k+(D+f<<1)>>1]|0;F=(e[k+(A+f<<1)>>1]|0)-p|0;G=p-E|0;H=E-o|0}}else{E=e[k+(t+f<<1)>>1]|0;p=e[k+(x+f<<1)>>1]|0;F=E-o|0;G=p-E|0;H=(e[k+(A+f<<1)>>1]|0)-p|0}}while(0);p=(ca(H,n)|0)+32769+(ca(G,m)|0)+(ca(F,l)|0)|0;b[d+(f<<1)>>1]=(((p>>16)+p|0)>>>16)+o;f=f+1|0}while((f|0)!=(j|0));i=g;return}function $ea(a,b){a=a|0;b=b|0;var c=0;c=i;Gda(a,b);i=c;return}function afa(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=Hda(a,b,4616)|0;i=c;return d|0}function bfa(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=i;j=Dda(a,92)|0;if((j|0)==0){k=0;i=h;return k|0}c[j+4>>2]=d;c[j+8>>2]=f;if((d|0)>0){l=(e|0)==0;m=j+44|0;n=j+12|0;o=0;do{if(l){c[m+(o<<2)>>2]=0;c[n+(o<<2)>>2]=201}else{p=c[c[e+(o<<2)>>2]>>2]|0;c[m+(o<<2)>>2]=p;c[n+(o<<2)>>2]=c[p+116>>2]}o=o+1|0}while((o|0)!=(d|0))}c[j+80>>2]=b;c[j+76>>2]=c[b+116>>2];b=j+84|0;c[b>>2]=Eda(a,f,4)|0;d=Eda(a,f,4)|0;a=j+88|0;c[a>>2]=d;if((f|0)<=0){k=j;i=h;return k|0}o=(g|0)==0;n=d;d=0;while(1){if(o){c[n+(d<<2)>>2]=0;c[(c[b>>2]|0)+(d<<2)>>2]=201;q=n}else{c[n+(d<<2)>>2]=c[c[g+(d<<2)>>2]>>2];m=c[a>>2]|0;c[(c[b>>2]|0)+(d<<2)>>2]=c[(c[m+(d<<2)>>2]|0)+116>>2];q=m}d=d+1|0;if((d|0)==(f|0)){k=j;break}else{n=q}}i=h;return k|0}function cfa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+48|0;f=e+32|0;g=e;h=d+4|0;if((c[h>>2]|0)>0){j=d+12|0;k=d+44|0;l=0;do{ld[c[j+(l<<2)>>2]&255](a+(l<<1)|0,f+(l<<1)|0,c[k+(l<<2)>>2]|0);l=l+1|0}while((l|0)<(c[h>>2]|0))}ld[c[d+76>>2]&255](f,g,c[d+80>>2]|0);f=d+8|0;if((c[f>>2]|0)<=0){i=e;return}h=d+84|0;l=d+88|0;d=0;do{ld[c[(c[h>>2]|0)+(d<<2)>>2]&255](g+(d<<1)|0,b+(d<<1)|0,c[(c[l>>2]|0)+(d<<2)>>2]|0);d=d+1|0}while((d|0)<(c[f>>2]|0));i=e;return}function dfa(a,b){a=a|0;b=b|0;var d=0;d=i;Gda(a,c[b+84>>2]|0);Gda(a,c[b+88>>2]|0);Gda(a,b);i=d;return}function efa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=Hda(a,b,92)|0;if((e|0)==0){f=0;i=d;return f|0}g=b+8|0;c[e+84>>2]=Hda(a,c[b+84>>2]|0,c[g>>2]<<2)|0;c[e+88>>2]=Hda(a,c[b+88>>2]|0,c[g>>2]<<2)|0;f=e;i=d;return f|0}function ffa(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0,F=0.0,G=0.0,H=0.0;g=i;i=i+160|0;h=g;j=g+48|0;k=g+44|0;l=g+120|0;m=g+88|0;n=g+56|0;o=g+40|0;p=g+36|0;q=g+32|0;r=g+28|0;s=g+24|0;c[q>>2]=0;c[r>>2]=0;c[s>>2]=0;if((n4(d,j,0,p)|0)==0){t=0;i=g;return t|0}if((n4(f,k,0,o)|0)==0){t=0;i=g;return t|0}if((c[a+4>>2]|0)!=(c[p>>2]|0)){t=0;i=g;return t|0}if((c[a+8>>2]|0)!=(c[o>>2]|0)){t=0;i=g;return t|0}C3(c[j>>2]|0,n,a);f=c[o>>2]|0;d=c[k>>2]|0;if((f|0)>0){u=0}else{t=1;i=g;return t|0}while(1){v=b[d+(u<<1)>>1]|0;w=b[n+(u<<1)>>1]|0;x=(v&65535)-(w&65535)|0;if((((x|0)>-1?x:0-x|0)|0)>61440){t=1;y=45;break}u=u+1|0;if(!(v<<16>>16==w<<16>>16)){y=9;break}if((u|0)>=(f|0)){t=1;y=45;break}}if((y|0)==9){c[h>>2]=1668707188;c[h+4>>2]=1668052340;c[h+8>>2]=1668707188;c[h+12>>2]=q;c[h+16>>2]=r;c[h+20>>2]=s;if((((H2(a,3,h)|0)==0?(c[h>>2]=1668707188,c[h+4>>2]=1668052340,c[h+8>>2]=q,c[h+12>>2]=r,(H2(a,2,h)|0)==0):0)?(c[h>>2]=1668052340,c[h+4>>2]=1668707188,c[h+8>>2]=r,c[h+12>>2]=s,(H2(a,2,h)|0)==0):0)?(c[h>>2]=1668052340,c[h+4>>2]=r,(H2(a,1,h)|0)==0):0){t=0;i=g;return t|0}a=c[q>>2]|0;if((a|0)==0){q=c[p>>2]|0;if((q|0)==0){z=0}else{c3a(l|0,c[j>>2]|0,(q>>>0>1?q<<1:2)|0)|0;z=q}}else{q=J2(c[a+32>>2]|0)|0;if((c[p>>2]|0)==0){z=0}else{a=0;do{b[l+(a<<1)>>1]=e1(c[q+(a<<2)>>2]|0,b[(c[j>>2]|0)+(a<<1)>>1]|0)|0;a=a+1|0;f=c[p>>2]|0}while(a>>>0<f>>>0);z=f}}a=c[s>>2]|0;if((a|0)==0){s=c[o>>2]|0;if((s|0)==0){A=0;B=z}else{c3a(m|0,c[k>>2]|0,(s>>>0>1?s<<1:2)|0)|0;A=s;B=z}}else{s=J2(c[a+32>>2]|0)|0;if((c[o>>2]|0)==0){A=0;B=z}else{z=0;do{a=a1(c[s+(z<<2)>>2]|0)|0;j=b[(c[k>>2]|0)+(z<<1)>>1]|0;if((a|0)==0){b[m+(z<<1)>>1]=j}else{b[m+(z<<1)>>1]=e1(a,j)|0;V0(a)}z=z+1|0;C=c[o>>2]|0}while(z>>>0<C>>>0);A=C;B=c[p>>2]|0}}p=c[r>>2]|0;r=c[p+32>>2]|0;C=c[r+4>>2]|0;if((c[p+4>>2]|0)!=1668052340){Jda(c[p>>2]|0,3,740776,h);t=1;i=g;return t|0}do{if((B|0)==1){D=+(e[l>>1]|0)*+((c[C+48>>2]|0)>>>0)/65535.0;z=~~+Q(+D);if(D- +(z|0)!=0.0){t=1;i=g;return t|0}else{E=ca(c[C+80>>2]|0,z)|0;break}}else if((B|0)==4){D=+(e[l>>1]|0)*+((c[C+48>>2]|0)>>>0)/65535.0;F=+(e[l+2>>1]|0)*+((c[C+52>>2]|0)>>>0)/65535.0;G=+(e[l+4>>1]|0)*+((c[C+56>>2]|0)>>>0)/65535.0;H=+(e[l+6>>1]|0)*+((c[C+60>>2]|0)>>>0)/65535.0;z=~~+Q(+D);o=~~+Q(+F);k=~~+Q(+G);s=~~+Q(+H);if(D- +(z|0)!=0.0){t=1;i=g;return t|0}if(F- +(o|0)!=0.0){t=1;i=g;return t|0}if(G- +(k|0)!=0.0){t=1;i=g;return t|0}if(H- +(s|0)!=0.0){t=1;i=g;return t|0}else{a=ca(c[C+92>>2]|0,z)|0;z=(ca(c[C+88>>2]|0,o)|0)+a|0;a=z+(ca(c[C+84>>2]|0,k)|0)|0;E=a+(ca(c[C+80>>2]|0,s)|0)|0;break}}else if((B|0)==3){H=+(e[l>>1]|0)*+((c[C+48>>2]|0)>>>0)/65535.0;G=+(e[l+2>>1]|0)*+((c[C+52>>2]|0)>>>0)/65535.0;F=+(e[l+4>>1]|0)*+((c[C+56>>2]|0)>>>0)/65535.0;s=~~+Q(+H);a=~~+Q(+G);k=~~+Q(+F);if(H- +(s|0)!=0.0){t=1;i=g;return t|0}if(G- +(a|0)!=0.0){t=1;i=g;return t|0}if(F- +(k|0)!=0.0){t=1;i=g;return t|0}else{z=ca(c[C+88>>2]|0,s)|0;s=(ca(c[C+84>>2]|0,a)|0)+z|0;E=s+(ca(c[C+80>>2]|0,k)|0)|0;break}}else{k=c[p>>2]|0;c[h>>2]=B;Jda(k,3,740824,h);t=1;i=g;return t|0}}while(0);if((A|0)<=0){t=1;i=g;return t|0}h=0;do{b[(c[r>>2]|0)+(h+E<<1)>>1]=b[m+(h<<1)>>1]|0;h=h+1|0}while((h|0)!=(A|0));t=1;i=g;return t|0}else if((y|0)==45){i=g;return t|0}return 0}function gfa(a,c,d){a=a|0;c=c|0;d=d|0;b[c>>1]=b[a>>1]|0;return}function hfa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=0;do{c[a+(e<<2)>>2]=~~+Q(+(+_0(b,+(e|0)/255.0)*16384.0+.5));e=e+1|0}while((e|0)!=256);i=d;return}function ifa(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=(d|0)==0;d=0;do{g=Yea(+_0(c,+(d|0)*6103515625.0e-14)*65535.0)|0;if(f){b[a+(d<<1)>>1]=g}else{h=(((g&65535)*65281|0)+8388608|0)>>>24;b[a+(d<<1)>>1]=h<<8|h}d=d+1|0}while((d|0)!=16385);i=e;return}function jfa(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;f=i;g=c[e+4+((b[a>>1]&255)<<2)>>2]|0;h=c[e+1028+((b[a+2>>1]&255)<<2)>>2]|0;j=c[e+2052+((b[a+4>>1]&255)<<2)>>2]|0;a=ca(c[e+3076>>2]|0,g)|0;k=ca(c[e+3080>>2]|0,h)|0;l=ca(c[e+3084>>2]|0,j)|0;m=a+8192+k+l+(c[e+3112>>2]|0)>>14;l=ca(c[e+3088>>2]|0,g)|0;k=ca(c[e+3092>>2]|0,h)|0;a=ca(c[e+3096>>2]|0,j)|0;n=l+8192+k+a+(c[e+3116>>2]|0)>>14;a=ca(c[e+3100>>2]|0,g)|0;g=ca(c[e+3104>>2]|0,h)|0;h=ca(c[e+3108>>2]|0,j)|0;j=a+8192+g+h+(c[e+3120>>2]|0)>>14;if((m|0)<0){o=0}else{o=(m|0)>16384?16384:m}if((n|0)<0){p=0}else{p=(n|0)>16384?16384:n}if((j|0)<0){q=0;r=e+3124|0;s=r+(o<<1)|0;t=b[s>>1]|0;b[d>>1]=t;u=e+35894|0;v=u+(p<<1)|0;w=b[v>>1]|0;x=d+2|0;b[x>>1]=w;y=e+68664|0;z=y+(q<<1)|0;A=b[z>>1]|0;B=d+4|0;b[B>>1]=A;i=f;return}q=(j|0)>16384?16384:j;r=e+3124|0;s=r+(o<<1)|0;t=b[s>>1]|0;b[d>>1]=t;u=e+35894|0;v=u+(p<<1)|0;w=b[v>>1]|0;x=d+2|0;b[x>>1]=w;y=e+68664|0;z=y+(q<<1)|0;A=b[z>>1]|0;B=d+4|0;b[B>>1]=A;i=f;return}function kfa(a,b){a=a|0;b=b|0;var c=0;c=i;if((b|0)!=0){Gda(a,b)}i=c;return}function lfa(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=Hda(a,b,101436)|0;i=c;return d|0}function mfa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=J2(c[a+32>>2]|0)|0;if((d|0)==0){e=0;i=b;return e|0}f=q3(c[a+16>>2]|0)|0;if((f|0)==0){e=1;i=b;return e|0}else{g=0}while(1){if((b1(c[d+(g<<2)>>2]|0)|0)==0){e=0;h=5;break}g=g+1|0;if(!(g>>>0<f>>>0)){e=1;h=5;break}}if((h|0)==5){i=b;return e|0}return 0}function nfa(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=i;h=Dda(a,16)|0;if((h|0)==0){j=0;i=g;return j|0}c[h+4>>2]=d;c[h+8>>2]=e;k=Eda(a,d,4)|0;l=h+12|0;c[l>>2]=k;if((k|0)==0){j=0;i=g;return j|0}if((d|0)<=0){j=h;i=g;return j|0}k=(e|0)==256;m=(e|0)>0;n=0;while(1){o=Eda(a,e,2)|0;c[(c[l>>2]|0)+(n<<2)>>2]=o;p=c[l>>2]|0;if((c[p+(n<<2)>>2]|0)==0){break}if(!k){if(m){o=f+(n<<2)|0;q=0;do{r=e1(c[o>>2]|0,q&65535)|0;b[(c[(c[l>>2]|0)+(n<<2)>>2]|0)+(q<<1)>>1]=r;q=q+1|0}while((q|0)!=(e|0))}}else{q=f+(n<<2)|0;o=0;do{r=e1(c[q>>2]|0,(o<<8|o)&65535)|0;b[(c[(c[l>>2]|0)+(n<<2)>>2]|0)+(o<<1)>>1]=r;o=o+1|0}while((o|0)!=256)}o=n+1|0;if((o|0)<(d|0)){n=o}else{j=h;s=16;break}}if((s|0)==16){i=g;return j|0}if((n|0)>0){s=p;d=0;while(1){Gda(a,c[s+(d<<2)>>2]|0);d=d+1|0;f=c[l>>2]|0;if((d|0)==(n|0)){t=f;break}else{s=f}}}else{t=p}Gda(a,t);Gda(a,h);j=0;i=g;return j|0}function ofa(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,j=0;g=i;h=f+4|0;if((c[h>>2]|0)<=0){i=g;return}j=f+12|0;f=0;do{b[d+(f<<1)>>1]=b[(c[(c[j>>2]|0)+(f<<2)>>2]|0)+(((e[a+(f<<1)>>1]|0)>>>8&65535)<<1)>>1]|0;f=f+1|0}while((f|0)<(c[h>>2]|0));i=g;return}function pfa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;e=b+4|0;f=b+12|0;g=c[f>>2]|0;if((c[e>>2]|0)>0){h=g;j=0;while(1){Gda(a,c[h+(j<<2)>>2]|0);j=j+1|0;k=c[f>>2]|0;if((j|0)>=(c[e>>2]|0)){l=k;break}else{h=k}}}else{l=g}Gda(a,l);Gda(a,b);i=d;return}function qfa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=Hda(a,b,16)|0;if((e|0)==0){f=0;i=d;return f|0}b=e+12|0;g=c[e+4>>2]|0;h=Hda(a,c[b>>2]|0,g<<2)|0;c[b>>2]=h;if((g|0)<=0){f=e;i=d;return f|0}b=c[e+8>>2]<<1;j=0;do{k=h+(j<<2)|0;c[k>>2]=Hda(a,c[k>>2]|0,b)|0;j=j+1|0}while((j|0)<(g|0));f=e;i=d;return f|0}function rfa(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,j=0;g=i;h=f+4|0;if((c[h>>2]|0)<=0){i=g;return}j=f+12|0;f=0;do{b[d+(f<<1)>>1]=b[(c[(c[j>>2]|0)+(f<<2)>>2]|0)+((e[a+(f<<1)>>1]|0)<<1)>>1]|0;f=f+1|0}while((f|0)<(c[h>>2]|0));i=g;return}function sfa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;f=c[a>>2]|0;if((f|0)==0){g=0;i=e;return g|0}else{h=f;j=0;k=a}a:while(1){a=h;f=j;while(1){l=a+36|0;m=c[l>>2]|0;if((m|0)==0){g=f;n=7;break a}if((c[a+8>>2]|0)!=(b|0)){h=m;j=f;k=l;continue a}if((c[m+8>>2]|0)!=(d|0)){h=m;j=f;k=l;continue a}tfa(l);tfa(k);a=c[k>>2]|0;if((a|0)==0){g=1;n=7;break a}else{f=1}}}if((n|0)==7){i=e;return g|0}return 0}function tfa(a){a=a|0;var b=0,d=0;b=i;d=c[a>>2]|0;c[a>>2]=c[d+36>>2];O2(d);i=b;return}function ufa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;i=i+16|0;h=g;j=c[(U4(b,7)|0)>>2]|0;a:do{if((j|0)!=0){b=j;while(1){pd[c[b>>2]&127](h,d,e,f);k=c[h>>2]|0;if((k|0)!=0){break}b=c[b+4>>2]|0;if((b|0)==0){break a}}c[a>>2]=k;i=g;return}}while(0);if((e|0)==0){b:do{if((f|0)==1){e=0;while(1){k=e+1|0;if((~c[742332+(e*12|0)>>2]&d|0)==(c[742328+(e*12|0)>>2]|0)){break}if(k>>>0<7){e=k}else{break b}}c[a>>2]=c[742336+(e*12|0)>>2];i=g;return}else if((f|0)==0){k=0;while(1){h=k+1|0;if((~c[741812+(k*12|0)>>2]&d|0)==(c[741808+(k*12|0)>>2]|0)){break}if(h>>>0<43){k=h}else{break b}}c[a>>2]=c[741816+(k*12|0)>>2];i=g;return}}while(0);c[a>>2]=0;i=g;return}else{c:do{if((f|0)==0){e=0;while(1){h=e+1|0;if((~c[741060+(e*12|0)>>2]&d|0)==(c[741056+(e*12|0)>>2]|0)){break}if(h>>>0<55){e=h}else{break c}}c[a>>2]=c[741064+(e*12|0)>>2];i=g;return}else if((f|0)==1){k=0;while(1){h=k+1|0;if((~c[741724+(k*12|0)>>2]&d|0)==(c[741720+(k*12|0)>>2]|0)){break}if(h>>>0<7){k=h}else{break c}}c[a>>2]=c[741728+(k*12|0)>>2];i=g;return}}while(0);c[a>>2]=0;i=g;return}}function vfa(a){a=a|0;return a>>>22&1|0}function wfa(a){a=a|0;return(a&7|0)==1|0}function xfa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=i;e=j2(a)|0;a=p4(e)|0;f=((c|0)!=0&1)<<22|b|a<<16|(m4(e)|0)<<3;i=d;return f|0}function yfa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0.0,k=0;f=i;h=a+4|0;a=(c[h>>2]&4096|0)==0;g[d>>2]=+g[b>>2]*100.0;j=+g[b+4>>2]*255.0+-128.0;if(a){g[d+4>>2]=j;g[d+8>>2]=+g[b+8>>2]*255.0+-128.0;k=d+(((c[h>>2]|0)>>>5&28)+12)|0;i=f;return k|0}else{g[d+(e<<2)>>2]=j;g[d+(e<<1<<2)>>2]=+g[b+8>>2]*255.0+-128.0;k=d+4|0;i=f;return k|0}return 0}function zfa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0.0,k=0;f=i;h=a+4|0;a=(c[h>>2]&4096|0)==0;g[d>>2]=+g[b>>2]*1.999969482421875;j=+g[b+4>>2]*1.999969482421875;if(a){g[d+4>>2]=j;g[d+8>>2]=+g[b+8>>2]*1.999969482421875;k=d+(((c[h>>2]|0)>>>5&28)+12)|0;i=f;return k|0}else{g[d+(e<<2)>>2]=j;g[d+(e<<1<<2)>>2]=+g[b+8>>2]*1.999969482421875;k=d+4|0;i=f;return k|0}return 0}function Afa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0.0,l=0;f=i;j=a+4|0;a=(c[j>>2]&4096|0)==0;h[d>>3]=+g[b>>2]*100.0;k=+g[b+4>>2]*255.0+-128.0;if(a){h[d+8>>3]=k;h[d+16>>3]=+g[b+8>>2]*255.0+-128.0;l=d+(((c[j>>2]|0)>>>4&56)+24)|0;i=f;return l|0}else{h[d+(e<<3)>>3]=k;h[d+(e<<1<<3)>>3]=+g[b+8>>2]*255.0+-128.0;l=d+8|0;i=f;return l|0}return 0}function Bfa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0.0,l=0;f=i;j=a+4|0;a=(c[j>>2]&4096|0)==0;h[d>>3]=+g[b>>2]*1.999969482421875;k=+g[b+4>>2]*1.999969482421875;if(a){h[d+8>>3]=k;h[d+16>>3]=+g[b+8>>2]*1.999969482421875;l=d+(((c[j>>2]|0)>>>4&56)+24)|0;i=f;return l|0}else{h[d+(e<<3)>>3]=k;h[d+(e<<1<<3)>>3]=+g[b+8>>2]*1.999969482421875;l=d+8|0;i=f;return l|0}return 0}function Cfa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0.0,r=0,s=0,t=0,u=0.0,v=0.0,w=0,x=0,y=0;f=i;h=a+4|0;a=c[h>>2]|0;j=a>>>3&15;k=a>>>10&1;l=a>>>7&7;m=a>>>14&1;switch(a>>>16&31|0){case 29:case 28:case 27:case 26:case 25:case 24:case 23:case 22:case 21:case 20:case 19:case 6:case 5:{n=100.0;break};default:{n=1.0}}o=(k|0)!=(m|0);p=o?l:0;if((j|0)==0){q=0.0}else{r=(k|0)==0;k=(a&8192|0)==0;s=(a&4096|0)==0;a=j+ -1|0;t=0;do{u=n*+g[b+((r?t:a-t|0)<<2)>>2];if(k){v=u}else{v=n-u}u=v;w=t+p|0;if(s){g[d+(w<<2)>>2]=u}else{g[d+((ca(w,e)|0)<<2)>>2]=u}t=t+1|0}while((t|0)<(j|0));q=v}if(o){x=d}else{x=d+(l<<2)|0}if(!((l|0)!=0|(m|0)==0)){d3a(d+4|0,d|0,(j<<2)+ -4|0)|0;g[d>>2]=q}if((c[h>>2]&4096|0)==0){y=x+(j<<2)|0;i=f;return y|0}else{y=x+4|0;i=f;return y|0}return 0}function Dfa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0.0,w=0.0,x=0,y=0,z=0;f=i;j=a+4|0;a=c[j>>2]|0;k=a>>>3&15;l=a>>>10&1;m=a>>>7&7;n=a>>>14&1;switch(a>>>16&31|0){case 29:case 28:case 27:case 26:case 25:case 24:case 23:case 22:case 21:case 20:case 19:case 6:case 5:{o=100.0;break};default:{o=1.0}}p=(l|0)!=(n|0);q=p?m:0;if((k|0)==0){r=0.0}else{s=(l|0)==0;l=(a&8192|0)==0;t=(a&4096|0)==0;a=k+ -1|0;u=0;do{v=o*+g[b+((s?u:a-u|0)<<2)>>2];if(l){w=v}else{w=o-v}x=u+q|0;if(t){h[d+(x<<3)>>3]=w}else{h[d+((ca(x,e)|0)<<3)>>3]=w}u=u+1|0}while((u|0)<(k|0));r=w}if(p){y=d}else{y=d+(m<<3)|0}if(!((m|0)!=0|(n|0)==0)){d3a(d+8|0,d|0,(k<<3)+ -8|0)|0;h[d>>3]=r}if((c[j>>2]&4096|0)==0){z=y+(k<<3)|0;i=f;return z|0}else{z=y+8|0;i=f;return z|0}return 0}function Efa(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0.0,w=0.0,x=0,y=0,z=0,A=0;h=i;j=a+4|0;a=c[j>>2]|0;k=a>>>3&15;l=a>>>10&1;m=a>>>7&7;n=a>>>14&1;switch(a>>>16&31|0){case 29:case 28:case 27:case 26:case 25:case 24:case 23:case 22:case 21:case 20:case 19:case 6:case 5:{o=100.0;break};default:{o=1.0}}p=(l|0)!=(n|0);q=p?m:0;if((k|0)==0){r=0.0}else{s=(l|0)==0;l=(a&8192|0)==0;t=(a&4096|0)==0;a=k+ -1|0;u=0;do{v=o*+g[d+((s?u:a-u|0)<<2)>>2];if(l){w=v}else{w=o-v}x=vja(w)|0;y=u+q|0;if(t){b[e+(y<<1)>>1]=x}else{b[e+((ca(y,f)|0)<<1)>>1]=x}u=u+1|0}while((u|0)<(k|0));r=w}if(p){z=e}else{z=e+(m<<1)|0}if(!((m|0)!=0|(n|0)==0)){d3a(e+2|0,e|0,(k<<1)+ -2|0)|0;b[e>>1]=vja(r)|0}if((c[j>>2]&4096|0)==0){A=z+(k<<1)|0;i=h;return A|0}else{A=z+2|0;i=h;return A|0}return 0}function Ffa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0;f=i;i=i+32|0;g=f;j=a+4|0;if((c[j>>2]&4096|0)==0){e4(d,b);k=d+(((c[j>>2]|0)>>>4&56)+24)|0;i=f;return k|0}else{e4(g,b);h[d>>3]=+h[g>>3];h[d+(e<<3)>>3]=+h[g+8>>3];h[d+(e<<1<<3)>>3]=+h[g+16>>3];k=d+8|0;i=f;return k|0}return 0}function Gfa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0;f=i;i=i+32|0;g=f;j=a+4|0;if((c[j>>2]&4096|0)==0){i4(d,b);k=d+(((c[j>>2]|0)>>>4&56)+24)|0;i=f;return k|0}else{i4(g,b);h[d>>3]=+h[g>>3];h[d+(e<<3)>>3]=+h[g+8>>3];h[d+(e<<1<<3)>>3]=+h[g+16>>3];k=d+8|0;i=f;return k|0}return 0}function Hfa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0;f=i;i=i+32|0;j=f;e4(j,b);b=a+4|0;if((c[b>>2]&4096|0)==0){g[d>>2]=+h[j>>3];g[d+4>>2]=+h[j+8>>3];g[d+8>>2]=+h[j+16>>3];k=d+(((c[b>>2]|0)>>>5&28)+12)|0;i=f;return k|0}else{g[d>>2]=+h[j>>3];g[d+(e<<2)>>2]=+h[j+8>>3];g[d+(e<<1<<2)>>2]=+h[j+16>>3];k=d+4|0;i=f;return k|0}return 0}function Ifa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0;f=i;i=i+48|0;j=f+24|0;k=f;l=a+4|0;if((c[l>>2]&4096|0)==0){i4(k,b);g[d>>2]=+h[k>>3];g[d+4>>2]=+h[k+8>>3];g[d+8>>2]=+h[k+16>>3];m=d+(((c[l>>2]|0)>>>5&28)+12)|0;i=f;return m|0}else{i4(j,b);g[d>>2]=+h[j>>3];g[d+(e<<2)>>2]=+h[j+8>>3];g[d+(e<<1<<2)>>2]=+h[j+16>>3];m=d+4|0;i=f;return m|0}return 0}function Jfa(a,b,d,f){a=a|0;b=b|0;d=d|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0.0,w=0.0,x=0,y=0,z=0;g=i;j=a+4|0;a=c[j>>2]|0;k=a>>>3&15;l=a>>>10&1;m=a>>>7&7;n=a>>>14&1;switch(a>>>16&31|0){case 29:case 28:case 27:case 26:case 25:case 24:case 23:case 22:case 21:case 20:case 19:case 6:case 5:{o=655.35;break};default:{o=65535.0}}p=(l|0)!=(n|0);q=p?m:0;if((k|0)==0){r=0.0}else{s=(l|0)==0;l=(a&8192|0)==0;t=(a&4096|0)==0;a=k+ -1|0;u=0;do{v=+(e[b+((s?u:a-u|0)<<1)>>1]|0)/o;if(l){w=v}else{w=o-v}x=u+q|0;if(t){h[d+(x<<3)>>3]=w}else{h[d+((ca(x,f)|0)<<3)>>3]=w}u=u+1|0}while((u|0)<(k|0));r=w}if(p){y=d}else{y=d+(m<<3)|0}if(!((m|0)!=0|(n|0)==0)){d3a(d+8|0,d|0,(k<<3)+ -8|0)|0;h[d>>3]=r}if((c[j>>2]&4096|0)==0){z=y+(k<<3)|0;i=g;return z|0}else{z=y+8|0;i=g;return z|0}return 0}function Kfa(a,b,d,f){a=a|0;b=b|0;d=d|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0.0,w=0.0,x=0,y=0,z=0;h=i;j=a+4|0;a=c[j>>2]|0;k=a>>>3&15;l=a>>>10&1;m=a>>>7&7;n=a>>>14&1;switch(a>>>16&31|0){case 29:case 28:case 27:case 26:case 25:case 24:case 23:case 22:case 21:case 20:case 19:case 6:case 5:{o=655.35;break};default:{o=65535.0}}p=(l|0)!=(n|0);q=p?m:0;if((k|0)==0){r=0.0}else{s=(l|0)==0;l=(a&8192|0)==0;t=(a&4096|0)==0;a=k+ -1|0;u=0;do{v=+(e[b+((s?u:a-u|0)<<1)>>1]|0)/o;if(l){w=v}else{w=o-v}v=w;x=u+q|0;if(t){g[d+(x<<2)>>2]=v}else{g[d+((ca(x,f)|0)<<2)>>2]=v}u=u+1|0}while((u|0)<(k|0));r=w}if(p){y=d}else{y=d+(m<<2)|0}if(!((m|0)!=0|(n|0)==0)){d3a(d+4|0,d|0,(k<<2)+ -4|0)|0;g[d>>2]=r}if((c[j>>2]&4096|0)==0){z=y+(k<<2)|0;i=h;return z|0}else{z=y+4|0;i=h;return z|0}return 0}function Lfa(a,d,f,g){a=a|0;d=d|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0.0,w=0.0,x=0,y=0,z=0,A=0;h=i;j=a+4|0;a=c[j>>2]|0;k=a>>>3&15;l=a>>>10&1;m=a>>>7&7;n=a>>>14&1;switch(a>>>16&31|0){case 29:case 28:case 27:case 26:case 25:case 24:case 23:case 22:case 21:case 20:case 19:case 6:case 5:{o=655.3499755859375;break};default:{o=65535.0}}p=(l|0)!=(n|0);q=p?m:0;if((k|0)==0){r=0.0}else{s=(l|0)==0;l=(a&8192|0)==0;t=(a&4096|0)==0;a=k+ -1|0;u=0;do{v=+(e[d+((s?u:a-u|0)<<1)>>1]|0)/o;if(l){w=v}else{w=o-v}x=vja(w)|0;y=u+q|0;if(t){b[f+(y<<1)>>1]=x}else{b[f+((ca(y,g)|0)<<1)>>1]=x}u=u+1|0}while((u|0)<(k|0));r=w}if(p){z=f}else{z=f+(m<<1)|0}if(!((m|0)!=0|(n|0)==0)){d3a(f+2|0,f|0,(k<<1)+ -2|0)|0;b[f>>1]=vja(r)|0}if((c[j>>2]&4096|0)==0){A=z+(k<<1)|0;i=h;return A|0}else{A=z+2|0;i=h;return A|0}return 0}function Mfa(b,c,d,f){b=b|0;c=c|0;d=d|0;f=f|0;a[d>>0]=(((e[c>>1]|0)*65281|0)+8388608|0)>>>24;return d+1|0}function Nfa(b,c,d,f){b=b|0;c=c|0;d=d|0;f=f|0;a[d>>0]=(((e[c>>1]|0)*65281|0)+8388608|0)>>>24;return d+2|0}function Ofa(b,c,d,f){b=b|0;c=c|0;d=d|0;f=f|0;a[d+1>>0]=(((e[c>>1]|0)*65281|0)+8388608|0)>>>24;return d+2|0}function Pfa(b,c,d,f){b=b|0;c=c|0;d=d|0;f=f|0;a[d>>0]=((((e[c>>1]|0)^65535)*65281|0)+8388608|0)>>>24;return d+1|0}function Qfa(b,c,d,f){b=b|0;c=c|0;d=d|0;f=f|0;a[d>>0]=((((((e[c>>1]|0)<<8|128)>>>0)/257|0)*65281|0)+8388608|0)>>>24;a[d+1>>0]=((((((e[c+2>>1]|0)<<8|128)>>>0)/257|0)*65281|0)+8388608|0)>>>24;a[d+2>>0]=((((((e[c+4>>1]|0)<<8|128)>>>0)/257|0)*65281|0)+8388608|0)>>>24;return d+3|0}function Rfa(b,c,d,f){b=b|0;c=c|0;d=d|0;f=f|0;a[d+1>>0]=((((((e[c>>1]|0)<<8|128)>>>0)/257|0)*65281|0)+8388608|0)>>>24;a[d+2>>0]=((((((e[c+2>>1]|0)<<8|128)>>>0)/257|0)*65281|0)+8388608|0)>>>24;a[d+3>>0]=((((((e[c+4>>1]|0)<<8|128)>>>0)/257|0)*65281|0)+8388608|0)>>>24;return d+4|0}function Sfa(a,c,d,f){a=a|0;c=c|0;d=d|0;f=f|0;b[d>>1]=(((e[c>>1]|0)<<8|128)>>>0)/257|0;b[d+2>>1]=(((e[c+2>>1]|0)<<8|128)>>>0)/257|0;b[d+4>>1]=(((e[c+4>>1]|0)<<8|128)>>>0)/257|0;return d+6|0}function Tfa(c,d,e,f){c=c|0;d=d|0;e=e|0;f=f|0;a[e>>0]=b[d>>1];a[e+1>>0]=b[d+2>>1];a[e+2>>0]=b[d+4>>1];return e+3|0}function Ufa(c,d,e,f){c=c|0;d=d|0;e=e|0;f=f|0;a[e>>0]=b[d>>1];a[e+1>>0]=b[d+2>>1];a[e+2>>0]=b[d+4>>1];return e+4|0}function Vfa(c,d,e,f){c=c|0;d=d|0;e=e|0;f=f|0;a[e+1>>0]=b[d>>1];a[e+2>>0]=b[d+2>>1];a[e+3>>0]=b[d+4>>1];return e+4|0}function Wfa(c,d,e,f){c=c|0;d=d|0;e=e|0;f=f|0;a[e>>0]=b[d+4>>1];a[e+1>>0]=b[d+2>>1];a[e+2>>0]=b[d>>1];return e+4|0}function Xfa(c,d,e,f){c=c|0;d=d|0;e=e|0;f=f|0;a[e+1>>0]=b[d+4>>1];a[e+2>>0]=b[d+2>>1];a[e+3>>0]=b[d>>1];return e+4|0}function Yfa(c,d,e,f){c=c|0;d=d|0;e=e|0;f=f|0;a[e>>0]=b[d+4>>1];a[e+1>>0]=b[d+2>>1];a[e+2>>0]=b[d>>1];return e+3|0}function Zfa(b,c,d,f){b=b|0;c=c|0;d=d|0;f=f|0;a[d>>0]=(((e[c>>1]|0)*65281|0)+8388608|0)>>>24;a[d+1>>0]=(((e[c+2>>1]|0)*65281|0)+8388608|0)>>>24;a[d+2>>0]=(((e[c+4>>1]|0)*65281|0)+8388608|0)>>>24;return d+3|0}function _fa(b,c,d,f){b=b|0;c=c|0;d=d|0;f=f|0;a[d>>0]=(((e[c>>1]|0)*65281|0)+8388608|0)>>>24;a[d+1>>0]=(((e[c+2>>1]|0)*65281|0)+8388608|0)>>>24;a[d+2>>0]=(((e[c+4>>1]|0)*65281|0)+8388608|0)>>>24;return d+4|0}function $fa(b,c,d,f){b=b|0;c=c|0;d=d|0;f=f|0;a[d+1>>0]=(((e[c>>1]|0)*65281|0)+8388608|0)>>>24;a[d+2>>0]=(((e[c+2>>1]|0)*65281|0)+8388608|0)>>>24;a[d+3>>0]=(((e[c+4>>1]|0)*65281|0)+8388608|0)>>>24;return d+4|0}function aga(b,c,d,f){b=b|0;c=c|0;d=d|0;f=f|0;a[d>>0]=(((e[c+4>>1]|0)*65281|0)+8388608|0)>>>24;a[d+1>>0]=(((e[c+2>>1]|0)*65281|0)+8388608|0)>>>24;a[d+2>>0]=(((e[c>>1]|0)*65281|0)+8388608|0)>>>24;return d+4|0}function bga(b,c,d,f){b=b|0;c=c|0;d=d|0;f=f|0;a[d+1>>0]=(((e[c+4>>1]|0)*65281|0)+8388608|0)>>>24;a[d+2>>0]=(((e[c+2>>1]|0)*65281|0)+8388608|0)>>>24;a[d+3>>0]=(((e[c>>1]|0)*65281|0)+8388608|0)>>>24;return d+4|0}function cga(b,c,d,f){b=b|0;c=c|0;d=d|0;f=f|0;a[d>>0]=(((e[c+4>>1]|0)*65281|0)+8388608|0)>>>24;a[d+1>>0]=(((e[c+2>>1]|0)*65281|0)+8388608|0)>>>24;a[d+2>>0]=(((e[c>>1]|0)*65281|0)+8388608|0)>>>24;return d+3|0}function dga(b,c,d,f){b=b|0;c=c|0;d=d|0;f=f|0;a[d>>0]=(((e[c>>1]|0)*65281|0)+8388608|0)>>>24;a[d+1>>0]=(((e[c+2>>1]|0)*65281|0)+8388608|0)>>>24;a[d+2>>0]=(((e[c+4>>1]|0)*65281|0)+8388608|0)>>>24;a[d+3>>0]=(((e[c+6>>1]|0)*65281|0)+8388608|0)>>>24;a[d+4>>0]=(((e[c+8>>1]|0)*65281|0)+8388608|0)>>>24;a[d+5>>0]=(((e[c+10>>1]|0)*65281|0)+8388608|0)>>>24;return d+6|0}function ega(b,c,d,f){b=b|0;c=c|0;d=d|0;f=f|0;a[d>>0]=(((e[c+10>>1]|0)*65281|0)+8388608|0)>>>24;a[d+1>>0]=(((e[c+8>>1]|0)*65281|0)+8388608|0)>>>24;a[d+2>>0]=(((e[c+6>>1]|0)*65281|0)+8388608|0)>>>24;a[d+3>>0]=(((e[c+4>>1]|0)*65281|0)+8388608|0)>>>24;a[d+4>>0]=(((e[c+2>>1]|0)*65281|0)+8388608|0)>>>24;a[d+5>>0]=(((e[c>>1]|0)*65281|0)+8388608|0)>>>24;return d+6|0}function fga(b,c,d,f){b=b|0;c=c|0;d=d|0;f=f|0;a[d>>0]=(((e[c>>1]|0)*65281|0)+8388608|0)>>>24;a[d+1>>0]=(((e[c+2>>1]|0)*65281|0)+8388608|0)>>>24;a[d+2>>0]=(((e[c+4>>1]|0)*65281|0)+8388608|0)>>>24;a[d+3>>0]=(((e[c+6>>1]|0)*65281|0)+8388608|0)>>>24;return d+4|0}function gga(b,c,d,f){b=b|0;c=c|0;d=d|0;f=f|0;a[d>>0]=(((e[c>>1]|0)*65281|0)+8388608|0)>>>24^255;a[d+1>>0]=(((e[c+2>>1]|0)*65281|0)+8388608|0)>>>24^255;a[d+2>>0]=(((e[c+4>>1]|0)*65281|0)+8388608|0)>>>24^255;a[d+3>>0]=(((e[c+6>>1]|0)*65281|0)+8388608|0)>>>24^255;return d+4|0}function hga(b,c,d,f){b=b|0;c=c|0;d=d|0;f=f|0;a[d>>0]=(((e[c+6>>1]|0)*65281|0)+8388608|0)>>>24;a[d+1>>0]=(((e[c>>1]|0)*65281|0)+8388608|0)>>>24;a[d+2>>0]=(((e[c+2>>1]|0)*65281|0)+8388608|0)>>>24;a[d+3>>0]=(((e[c+4>>1]|0)*65281|0)+8388608|0)>>>24;return d+4|0}function iga(b,c,d,f){b=b|0;c=c|0;d=d|0;f=f|0;a[d>>0]=(((e[c+6>>1]|0)*65281|0)+8388608|0)>>>24;a[d+1>>0]=(((e[c+4>>1]|0)*65281|0)+8388608|0)>>>24;a[d+2>>0]=(((e[c+2>>1]|0)*65281|0)+8388608|0)>>>24;a[d+3>>0]=(((e[c>>1]|0)*65281|0)+8388608|0)>>>24;return d+4|0}function jga(b,c,d,f){b=b|0;c=c|0;d=d|0;f=f|0;a[d>>0]=(((e[c+4>>1]|0)*65281|0)+8388608|0)>>>24;a[d+1>>0]=(((e[c+2>>1]|0)*65281|0)+8388608|0)>>>24;a[d+2>>0]=(((e[c>>1]|0)*65281|0)+8388608|0)>>>24;a[d+3>>0]=(((e[c+6>>1]|0)*65281|0)+8388608|0)>>>24;return d+4|0}function kga(b,d,f,g){b=b|0;d=d|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;g=i;h=c[b+4>>2]|0;b=h>>>3&15;j=h>>>10&1;k=h>>>7&7;l=h>>>14&1;m=(j|0)!=(l|0);if(m){n=f+k|0}else{n=f}if((b|0)==0){o=n;p=0}else{q=(j|0)==0;j=(h&8192|0)==0;h=b+ -1|0;r=b>>>0>1?b:1;s=n;t=0;while(1){u=(((e[d+((q?t:h-t|0)<<1)>>1]|0)*65281|0)+8388608|0)>>>24;v=(j?u:u^255)&255;a[s>>0]=v;t=t+1|0;if((t|0)>=(b|0)){break}else{s=s+1|0}}o=n+r|0;p=v}if(m){w=o}else{w=o+k|0}if((k|0)!=0|(l|0)==0){i=g;return w|0}d3a(f+1|0,f|0,b+ -1|0)|0;a[f>>0]=p;i=g;return w|0}function lga(b,d,f,g){b=b|0;d=d|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;h=i;j=c[b+4>>2]|0;b=j>>>3&15;k=j>>>10&1;if((k|0)==(j>>>14&1|0)){l=f}else{l=f+(ca(j>>>7&7,g)|0)|0}if((b|0)==0){m=f+1|0;i=h;return m|0}n=(k|0)==0;k=(j&8192|0)==0;j=b+ -1|0;o=l;l=0;while(1){p=(((e[d+((n?l:j-l|0)<<1)>>1]|0)*65281|0)+8388608|0)>>>24;a[o>>0]=k?p:p^255;l=l+1|0;if((l|0)>=(b|0)){break}else{o=o+g|0}}m=f+1|0;i=h;return m|0}function mga(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;b[d>>1]=b[c>>1]|0;return d+2|0}function nga(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;b[d>>1]=b[c>>1]|0;return d+4|0}function oga(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;b[d+2>>1]=b[c>>1]|0;return d+4|0}function pga(a,c,d,f){a=a|0;c=c|0;d=d|0;f=f|0;b[d>>1]=(e[c>>1]|0)^65535;return d+2|0}function qga(a,c,d,f){a=a|0;c=c|0;d=d|0;f=f|0;f=e[c>>1]|0;b[d>>1]=f<<8|f>>>8;return d+2|0}function rga(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;b[d>>1]=b[c>>1]|0;b[d+2>>1]=b[c+2>>1]|0;b[d+4>>1]=b[c+4>>1]|0;return d+6|0}function sga(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;b[d>>1]=b[c+4>>1]|0;b[d+2>>1]=b[c+2>>1]|0;b[d+4>>1]=b[c>>1]|0;return d+6|0}function tga(a,c,d,f){a=a|0;c=c|0;d=d|0;f=f|0;f=e[c>>1]|0;b[d>>1]=f<<8|f>>>8;f=e[c+2>>1]|0;b[d+2>>1]=f<<8|f>>>8;f=e[c+4>>1]|0;b[d+4>>1]=f<<8|f>>>8;return d+6|0}function uga(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;b[d>>1]=b[c>>1]|0;b[d+2>>1]=b[c+2>>1]|0;b[d+4>>1]=b[c+4>>1]|0;return d+8|0}function vga(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;b[d+2>>1]=b[c+4>>1]|0;b[d+4>>1]=b[c+2>>1]|0;b[d+6>>1]=b[c>>1]|0;return d+8|0}function wga(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;b[d+2>>1]=b[c>>1]|0;b[d+4>>1]=b[c+2>>1]|0;b[d+6>>1]=b[c+4>>1]|0;return d+8|0}function xga(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;b[d>>1]=b[c+4>>1]|0;b[d+2>>1]=b[c+2>>1]|0;b[d+4>>1]=b[c>>1]|0;return d+8|0}function yga(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;b[d>>1]=b[c>>1]|0;b[d+2>>1]=b[c+2>>1]|0;b[d+4>>1]=b[c+4>>1]|0;b[d+6>>1]=b[c+6>>1]|0;return d+8|0}function zga(a,c,d,f){a=a|0;c=c|0;d=d|0;f=f|0;b[d>>1]=(e[c>>1]|0)^65535;b[d+2>>1]=(e[c+2>>1]|0)^65535;b[d+4>>1]=(e[c+4>>1]|0)^65535;b[d+6>>1]=(e[c+6>>1]|0)^65535;return d+8|0}function Aga(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;b[d>>1]=b[c+6>>1]|0;b[d+2>>1]=b[c+4>>1]|0;b[d+4>>1]=b[c+2>>1]|0;b[d+6>>1]=b[c>>1]|0;return d+8|0}function Bga(a,c,d,f){a=a|0;c=c|0;d=d|0;f=f|0;f=e[c>>1]|0;b[d>>1]=f<<8|f>>>8;f=e[c+2>>1]|0;b[d+2>>1]=f<<8|f>>>8;f=e[c+4>>1]|0;b[d+4>>1]=f<<8|f>>>8;f=e[c+6>>1]|0;b[d+6>>1]=f<<8|f>>>8;return d+8|0}function Cga(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;b[d>>1]=b[c>>1]|0;b[d+2>>1]=b[c+2>>1]|0;b[d+4>>1]=b[c+4>>1]|0;b[d+6>>1]=b[c+6>>1]|0;b[d+8>>1]=b[c+8>>1]|0;b[d+10>>1]=b[c+10>>1]|0;return d+12|0}function Dga(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;b[d>>1]=b[c+10>>1]|0;b[d+2>>1]=b[c+8>>1]|0;b[d+4>>1]=b[c+6>>1]|0;b[d+6>>1]=b[c+4>>1]|0;b[d+8>>1]=b[c+2>>1]|0;b[d+10>>1]=b[c>>1]|0;return d+12|0}function Ega(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;g=i;h=c[a+4>>2]|0;a=h>>>3&15;j=(h&1024|0)!=0;if(j){k=e+(ca(f<<1,h>>>7&7)|0)|0}else{k=e}if((a|0)==0){l=e+2|0;i=g;return l|0}m=a+ -1|0;n=(h&2048|0)==0;o=(h&8192|0)==0;h=f<<1;f=k;k=0;while(1){p=b[d+((j?m-k|0:k)<<1)>>1]|0;if(n){q=p}else{r=p&65535;q=(r<<8|r>>>8)&65535}if(o){s=q}else{s=(q&65535^65535)&65535}b[f>>1]=s;k=k+1|0;if((k|0)>=(a|0)){break}else{f=f+h|0}}l=e+2|0;i=g;return l|0}function Fga(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;f=i;g=c[a+4>>2]|0;h=g>>>3&15;j=g>>>10&1;k=g>>>7&7;l=g>>>14&1;m=(j|0)!=(l|0);if(m){n=e+(k<<1)|0}else{n=e}if((h|0)==0){o=n;p=0}else{q=(j|0)==0;j=(c[a>>2]&2048|0)==0;a=(g&8192|0)==0;g=h+ -1|0;r=h>>>0>1?h<<1:2;s=n;t=0;while(1){u=b[d+((q?t:g-t|0)<<1)>>1]|0;if(j){v=u}else{w=u&65535;v=(w<<8|w>>>8)&65535}if(a){x=v}else{x=(v&65535^65535)&65535}b[s>>1]=x;t=t+1|0;if((t|0)>=(h|0)){break}else{s=s+2|0}}o=n+r|0;p=x}if(m){y=o}else{y=o+(k<<1)|0}if((k|0)!=0|(l|0)==0){i=f;return y|0}d3a(e+2|0,e|0,(h<<1)+ -2|0)|0;b[e>>1]=p;i=f;return y|0}function Gga(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0;f=i;j=(c[a>>2]&4096|0)==0;g[b>>2]=+h[d>>3]/100.0;if(j){g[b+4>>2]=(+h[d+8>>3]+128.0)/255.0;g[b+8>>2]=(+h[d+16>>3]+128.0)/255.0;k=d+(((c[a>>2]|0)>>>4&56)+24)|0;i=f;return k|0}else{g[b+4>>2]=(+h[d+(e<<3)>>3]+128.0)/255.0;g[b+8>>2]=(+h[d+(e<<1<<3)>>3]+128.0)/255.0;k=d+8|0;i=f;return k|0}return 0}function Hga(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0;f=i;h=(c[a>>2]&4096|0)==0;g[b>>2]=+g[d>>2]/100.0;if(h){g[b+4>>2]=(+g[d+4>>2]+128.0)/255.0;g[b+8>>2]=(+g[d+8>>2]+128.0)/255.0;j=d+(((c[a>>2]|0)>>>5&28)+12)|0;i=f;return j|0}else{g[b+4>>2]=(+g[d+(e<<2)>>2]+128.0)/255.0;g[b+8>>2]=(+g[d+(e<<1<<2)>>2]+128.0)/255.0;j=d+4|0;i=f;return j|0}return 0}function Iga(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0;f=i;j=(c[a>>2]&4096|0)==0;g[b>>2]=+h[d>>3]/1.999969482421875;if(j){g[b+4>>2]=+h[d+8>>3]/1.999969482421875;g[b+8>>2]=+h[d+16>>3]/1.999969482421875;k=d+(((c[a>>2]|0)>>>4&56)+24)|0;i=f;return k|0}else{g[b+4>>2]=+h[d+(e<<3)>>3]/1.999969482421875;g[b+8>>2]=+h[d+(e<<1<<3)>>3]/1.999969482421875;k=d+8|0;i=f;return k|0}return 0}function Jga(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0;f=i;h=(c[a>>2]&4096|0)==0;g[b>>2]=+g[d>>2]/1.999969482421875;if(h){g[b+4>>2]=+g[d+4>>2]/1.999969482421875;g[b+8>>2]=+g[d+8>>2]/1.999969482421875;j=d+(((c[a>>2]|0)>>>5&28)+12)|0;i=f;return j|0}else{g[b+4>>2]=+g[d+(e<<2)>>2]/1.999969482421875;g[b+8>>2]=+g[d+(e<<1<<2)>>2]/1.999969482421875;j=d+4|0;i=f;return j|0}return 0}function Kga(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0;f=i;h=c[a>>2]|0;j=h>>>3&15;k=h>>>10&1;l=h>>>14&1;m=h>>>7&7;switch(h>>>16&31|0){case 29:case 28:case 27:case 26:case 25:case 24:case 23:case 22:case 21:case 20:case 19:case 6:case 5:{n=100.0;break};default:{n=1.0}}o=(k|0)==(l|0)?0:m;if((j|0)!=0){p=(k|0)==0;k=(h&4096|0)==0;q=(h&8192|0)==0;h=j+ -1|0;r=0;do{s=r+o|0;if(k){t=s}else{t=ca(s,e)|0}u=+g[d+(t<<2)>>2]/n;if(q){v=u}else{v=1.0-u}g[b+((p?r:h-r|0)<<2)>>2]=v;r=r+1|0}while((r|0)<(j|0))}if(!((m|0)!=0|(l|0)==0)){v=+g[b>>2];l=j+ -1|0;d3a(b|0,b+4|0,l<<2|0)|0;g[b+(l<<2)>>2]=v}if((c[a>>2]&4096|0)==0){w=d+(j+m<<2)|0;i=f;return w|0}else{w=d+4|0;i=f;return w|0}return 0}function Lga(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0;f=i;j=c[a>>2]|0;k=j>>>3&15;l=j>>>10&1;m=j>>>14&1;n=j>>>7&7;switch(j>>>16&31|0){case 29:case 28:case 27:case 26:case 25:case 24:case 23:case 22:case 21:case 20:case 19:case 6:case 5:{o=100.0;break};default:{o=1.0}}p=(l|0)==(m|0)?0:n;if((k|0)!=0){q=(l|0)==0;l=(j&4096|0)==0;r=(j&8192|0)==0;j=k+ -1|0;s=0;do{t=s+p|0;if(l){u=t}else{u=ca(t,e)|0}v=+h[d+(u<<3)>>3]/o;if(r){w=v}else{w=1.0-v}g[b+((q?s:j-s|0)<<2)>>2]=w;s=s+1|0}while((s|0)<(k|0))}if(!((n|0)!=0|(m|0)==0)){w=+g[b>>2];m=k+ -1|0;d3a(b|0,b+4|0,m<<2|0)|0;g[b+(m<<2)>>2]=w}if((c[a>>2]&4096|0)==0){x=d+(k+n<<3)|0;i=f;return x|0}else{x=d+8|0;i=f;return x|0}return 0}function Mga(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0;h=i;j=c[a>>2]|0;k=j>>>3&15;l=j>>>10&1;m=j>>>14&1;n=j>>>7&7;switch(j>>>16&31|0){case 29:case 28:case 27:case 26:case 25:case 24:case 23:case 22:case 21:case 20:case 19:case 6:case 5:{o=100.0;break};default:{o=1.0}}p=(l|0)==(m|0)?0:n;if((k|0)!=0){q=(l|0)==0;l=(j&4096|0)==0;r=(j&8192|0)==0;j=k+ -1|0;s=0;do{t=s+p|0;if(l){u=b[e+(t<<1)>>1]|0}else{u=b[e+((ca(t,f)|0)<<1)>>1]|0}v=+uja(u)/o;if(r){w=v}else{w=1.0-v}g[d+((q?s:j-s|0)<<2)>>2]=w;s=s+1|0}while((s|0)<(k|0))}if(!((n|0)!=0|(m|0)==0)){w=+g[d>>2];m=k+ -1|0;d3a(d|0,d+4|0,m<<2|0)|0;g[d+(m<<2)>>2]=w}if((c[a>>2]&4096|0)==0){x=e+(k+n<<1)|0;i=h;return x|0}else{x=e+2|0;i=h;return x|0}return 0}function Nga(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,j=0;f=i;g=+h[d>>3];if((c[a>>2]&4096|0)==0){f4(b,g,+h[d+8>>3],+h[d+16>>3]);j=d+(((c[a>>2]|0)>>>4&56)+24)|0;i=f;return j|0}else{f4(b,g,+h[d+(e<<3)>>3],+h[d+(e<<1<<3)>>3]);j=d+8|0;i=f;return j|0}return 0}function Oga(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,j=0;f=i;g=+h[d>>3];if((c[a>>2]&4096|0)==0){h4(b,g,+h[d+8>>3],+h[d+16>>3]);j=d+(((c[a>>2]|0)>>>4&56)+24)|0;i=f;return j|0}else{h4(b,g,+h[d+(e<<3)>>3],+h[d+(e<<1<<3)>>3]);j=d+8|0;i=f;return j|0}return 0}function Pga(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,j=0;f=i;h=+g[d>>2];if((c[a>>2]&4096|0)==0){f4(b,h,+g[d+4>>2],+g[d+8>>2]);j=d+(((c[a>>2]|0)>>>5&28)+12)|0;i=f;return j|0}else{f4(b,h,+g[d+(e<<2)>>2],+g[d+(e<<1<<2)>>2]);j=d+4|0;i=f;return j|0}return 0}function Qga(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,j=0;f=i;h=+g[d>>2];if((c[a>>2]&4096|0)==0){h4(b,h,+g[d+4>>2],+g[d+8>>2]);j=d+(((c[a>>2]|0)>>>5&28)+12)|0;i=f;return j|0}else{h4(b,h,+g[d+(e<<2)>>2],+g[d+(e<<1<<2)>>2]);j=d+4|0;i=f;return j|0}return 0}function Rga(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;e=i;a=Cha(+h[d>>3]*65535.0)|0;b[c+4>>1]=a;b[c+2>>1]=a;b[c>>1]=a;i=e;return d+8|0}function Sga(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;g=i;j=c[a>>2]|0;k=j>>>3&15;l=j>>>10&1;m=j>>>14&1;n=j>>>7&7;switch(j>>>16&31|0){case 29:case 28:case 27:case 26:case 25:case 24:case 23:case 22:case 21:case 20:case 19:case 6:case 5:{o=655.35;break};default:{o=65535.0}}p=(l|0)==(m|0)?0:n;if((k|0)!=0){q=(l|0)==0;l=(j&4096|0)==0;r=(j&8192|0)==0;j=k+ -1|0;s=0;do{t=s+p|0;if(l){u=t}else{u=ca(t,f)|0}t=Cha(o*+h[e+(u<<3)>>3])|0;if(r){v=t}else{v=(t&65535^65535)&65535}b[d+((q?s:j-s|0)<<1)>>1]=v;s=s+1|0}while((s|0)<(k|0))}if(!((n|0)!=0|(m|0)==0)){m=b[d>>1]|0;s=k+ -1|0;d3a(d|0,d+2|0,s<<1|0)|0;b[d+(s<<1)>>1]=m}if((c[a>>2]&4096|0)==0){w=e+(k+n<<3)|0;i=g;return w|0}else{w=e+8|0;i=g;return w|0}return 0}function Tga(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;h=i;j=c[a>>2]|0;k=j>>>3&15;l=j>>>10&1;m=j>>>14&1;n=j>>>7&7;switch(j>>>16&31|0){case 29:case 28:case 27:case 26:case 25:case 24:case 23:case 22:case 21:case 20:case 19:case 6:case 5:{o=655.35;break};default:{o=65535.0}}p=(l|0)==(m|0)?0:n;if((k|0)!=0){q=(l|0)==0;l=(j&4096|0)==0;r=(j&8192|0)==0;j=k+ -1|0;s=0;do{t=s+p|0;if(l){u=t}else{u=ca(t,f)|0}t=Cha(o*+g[e+(u<<2)>>2])|0;if(r){v=t}else{v=(t&65535^65535)&65535}b[d+((q?s:j-s|0)<<1)>>1]=v;s=s+1|0}while((s|0)<(k|0))}if(!((n|0)!=0|(m|0)==0)){m=b[d>>1]|0;s=k+ -1|0;d3a(d|0,d+2|0,s<<1|0)|0;b[d+(s<<1)>>1]=m}if((c[a>>2]&4096|0)==0){w=e+(k+n<<2)|0;i=h;return w|0}else{w=e+4|0;i=h;return w|0}return 0}function Uga(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0;g=i;h=c[a>>2]|0;j=h>>>3&15;k=h>>>10&1;l=h>>>14&1;m=h>>>7&7;switch(h>>>16&31|0){case 29:case 28:case 27:case 26:case 25:case 24:case 23:case 22:case 21:case 20:case 19:case 6:case 5:{n=655.3499755859375;break};default:{n=65535.0}}o=(k|0)==(l|0)?0:m;if((j|0)!=0){p=(k|0)==0;k=(h&4096|0)==0;q=(h&8192|0)==0;h=j+ -1|0;r=0;do{s=r+o|0;if(k){t=b[e+(s<<1)>>1]|0}else{t=b[e+((ca(s,f)|0)<<1)>>1]|0}u=+uja(t);if(q){v=u}else{v=n-u}b[d+((p?r:h-r|0)<<1)>>1]=Cha(n*v)|0;r=r+1|0}while((r|0)<(j|0))}if(!((m|0)!=0|(l|0)==0)){l=b[d>>1]|0;r=j+ -1|0;d3a(d|0,d+2|0,r<<1|0)|0;b[d+(r<<1)>>1]=l}if((c[a>>2]&4096|0)==0){w=e+(j+m<<1)|0;i=g;return w|0}else{w=e+2|0;i=g;return w|0}return 0}function Vga(a,c,e,f){a=a|0;c=c|0;e=e|0;f=f|0;f=d[e>>0]|0;a=(f<<8|f)&65535;b[c+4>>1]=a;b[c+2>>1]=a;b[c>>1]=a;return e+1|0}function Wga(a,c,e,f){a=a|0;c=c|0;e=e|0;f=f|0;f=d[e>>0]|0;a=(f<<8|f)&65535;b[c+4>>1]=a;b[c+2>>1]=a;b[c>>1]=a;return e+2|0}function Xga(a,c,e,f){a=a|0;c=c|0;e=e|0;f=f|0;f=d[e>>0]|0;a=(f<<8|f)&65535;b[c+4>>1]=a;b[c+2>>1]=a;b[c>>1]=a;return e+3|0}function Yga(a,c,e,f){a=a|0;c=c|0;e=e|0;f=f|0;f=d[e>>0]|0;a=((f<<8|f)^65535)&65535;b[c+4>>1]=a;b[c+2>>1]=a;b[c>>1]=a;return e+1|0}function Zga(a,c,e,f){a=a|0;c=c|0;e=e|0;f=f|0;f=d[e>>0]|0;b[c>>1]=f<<8|f;f=d[e+1>>0]|0;b[c+2>>1]=f<<8|f;return e+2|0}function _ga(a,c,e,f){a=a|0;c=c|0;e=e|0;f=f|0;f=d[e>>0]|0;b[c>>1]=f<<8|f;f=d[e+1>>0]|0;b[c+2>>1]=f<<8|f;f=d[e+2>>0]|0;b[c+4>>1]=f<<8|f;return e+3|0}function $ga(a,c,e,f){a=a|0;c=c|0;e=e|0;f=f|0;f=d[e+1>>0]|0;b[c>>1]=f<<8|f;f=d[e+2>>0]|0;b[c+2>>1]=f<<8|f;f=d[e+3>>0]|0;b[c+4>>1]=f<<8|f;return e+4|0}function aha(a,c,d,f){a=a|0;c=c|0;d=d|0;f=f|0;f=e[d>>1]|0;b[c>>1]=(f<<8|f)>>>8;f=e[d+2>>1]|0;b[c+2>>1]=(f<<8|f)>>>8;f=e[d+4>>1]|0;b[c+4>>1]=(f<<8|f)>>>8;return d+6|0}function bha(a,c,e,f){a=a|0;c=c|0;e=e|0;f=f|0;f=d[e>>0]|0;b[c>>1]=f<<8|f;f=d[e+1>>0]|0;b[c+2>>1]=f<<8|f;f=d[e+2>>0]|0;b[c+4>>1]=f<<8|f;return e+3|0}function cha(a,c,e,f){a=a|0;c=c|0;e=e|0;f=f|0;f=d[e>>0]|0;b[c+4>>1]=f<<8|f;f=d[e+1>>0]|0;b[c+2>>1]=f<<8|f;f=d[e+2>>0]|0;b[c>>1]=f<<8|f;return e+3|0}function dha(a,c,e,f){a=a|0;c=c|0;e=e|0;f=f|0;f=d[e+1>>0]|0;b[c+4>>1]=f<<8|f;f=d[e+2>>0]|0;b[c+2>>1]=f<<8|f;f=d[e+3>>0]|0;b[c>>1]=f<<8|f;return e+4|0}function eha(a,c,e,f){a=a|0;c=c|0;e=e|0;f=f|0;f=d[e+1>>0]|0;b[c>>1]=f<<8|f;f=d[e+2>>0]|0;b[c+2>>1]=f<<8|f;f=d[e+3>>0]|0;b[c+4>>1]=f<<8|f;return e+4|0}function fha(a,c,e,f){a=a|0;c=c|0;e=e|0;f=f|0;f=d[e>>0]|0;b[c+4>>1]=f<<8|f;f=d[e+1>>0]|0;b[c+2>>1]=f<<8|f;f=d[e+2>>0]|0;b[c>>1]=f<<8|f;return e+4|0}function gha(a,c,e,f){a=a|0;c=c|0;e=e|0;f=f|0;f=d[e>>0]|0;b[c>>1]=f<<8|f;f=d[e+1>>0]|0;b[c+2>>1]=f<<8|f;f=d[e+2>>0]|0;b[c+4>>1]=f<<8|f;f=d[e+3>>0]|0;b[c+6>>1]=f<<8|f;return e+4|0}function hha(a,c,e,f){a=a|0;c=c|0;e=e|0;f=f|0;f=(d[e>>0]|0)^255;b[c>>1]=f<<8|f;f=(d[e+1>>0]|0)^255;b[c+2>>1]=f<<8|f;f=(d[e+2>>0]|0)^255;b[c+4>>1]=f<<8|f;f=(d[e+3>>0]|0)^255;b[c+6>>1]=f<<8|f;return e+4|0}function iha(a,c,e,f){a=a|0;c=c|0;e=e|0;f=f|0;f=d[e>>0]|0;b[c+6>>1]=f<<8|f;f=d[e+1>>0]|0;b[c>>1]=f<<8|f;f=d[e+2>>0]|0;b[c+2>>1]=f<<8|f;f=d[e+3>>0]|0;b[c+4>>1]=f<<8|f;return e+4|0}function jha(a,c,e,f){a=a|0;c=c|0;e=e|0;f=f|0;f=d[e>>0]|0;b[c+6>>1]=f<<8|f;f=d[e+1>>0]|0;b[c+4>>1]=f<<8|f;f=d[e+2>>0]|0;b[c+2>>1]=f<<8|f;f=d[e+3>>0]|0;b[c>>1]=f<<8|f;return e+4|0}function kha(a,c,e,f){a=a|0;c=c|0;e=e|0;f=f|0;f=d[e>>0]|0;b[c+4>>1]=f<<8|f;f=d[e+1>>0]|0;b[c+2>>1]=f<<8|f;f=d[e+2>>0]|0;b[c>>1]=f<<8|f;f=d[e+3>>0]|0;b[c+6>>1]=f<<8|f;return e+4|0}function lha(a,e,f,g){a=a|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=i;j=c[a>>2]|0;a=j>>>3&15;k=j>>>10&1;if((k|0)==(j>>>14&1|0)){l=f}else{l=f+(ca(j>>>7&7,g)|0)|0}if((a|0)==0){m=f+1|0;i=h;return m|0}n=(k|0)==0;k=(j&8192|0)==0;j=a+ -1|0;o=l;l=0;while(1){p=d[o>>0]|0;q=p<<8|p;b[e+((n?l:j-l|0)<<1)>>1]=k?q:q^65535;l=l+1|0;if((l|0)>=(a|0)){break}else{o=o+g|0}}m=f+1|0;i=h;return m|0}function mha(a,e,f,g){a=a|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;g=i;h=c[a>>2]|0;a=h>>>3&15;j=h>>>10&1;k=h>>>14&1;l=h>>>7&7;m=(j|0)!=(k|0);if(m){n=f+l|0}else{n=f}if((a|0)==0){o=n}else{f=(j|0)==0;j=(h&8192|0)==0;h=a+ -1|0;p=a>>>0>1?a:1;q=n;r=0;while(1){s=d[q>>0]|0;t=s<<8|s;b[e+((f?r:h-r|0)<<1)>>1]=j?t:t^65535;r=r+1|0;if((r|0)>=(a|0)){break}else{q=q+1|0}}o=n+p|0}if(m){u=o}else{u=o+l|0}if((l|0)!=0|(k|0)==0){i=g;return u|0}k=b[e>>1]|0;l=a+ -1|0;d3a(e|0,e+2|0,l<<1|0)|0;b[e+(l<<1)>>1]=k;i=g;return u|0}function nha(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;e=b[d>>1]|0;b[c+4>>1]=e;b[c+2>>1]=e;b[c>>1]=e;return d+2|0}function oha(a,c,d,f){a=a|0;c=c|0;d=d|0;f=f|0;f=((e[d>>1]|0)^65535)&65535;b[c+4>>1]=f;b[c+2>>1]=f;b[c>>1]=f;return d+2|0}function pha(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;e=b[d>>1]|0;b[c+4>>1]=e;b[c+2>>1]=e;b[c>>1]=e;return d+8|0}function qha(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;b[c>>1]=b[d>>1]|0;b[c+2>>1]=b[d+2>>1]|0;return d+4|0}function rha(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;b[c>>1]=b[d>>1]|0;b[c+2>>1]=b[d+2>>1]|0;b[c+4>>1]=b[d+4>>1]|0;return d+6|0}function sha(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;b[c>>1]=b[d>>1]|0;b[c+2>>1]=b[d+2>>1]|0;b[c+4>>1]=b[d+4>>1]|0;b[c+6>>1]=b[d+6>>1]|0;return d+8|0}function tha(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;b[c+4>>1]=b[d>>1]|0;b[c+2>>1]=b[d+2>>1]|0;b[c>>1]=b[d+4>>1]|0;return d+6|0}function uha(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;b[c>>1]=b[d+2>>1]|0;b[c+2>>1]=b[d+4>>1]|0;b[c+4>>1]=b[d+6>>1]|0;return d+8|0}function vha(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;b[c+4>>1]=b[d+2>>1]|0;b[c+2>>1]=b[d+4>>1]|0;b[c>>1]=b[d+6>>1]|0;return d+8|0}function wha(a,c,d,f){a=a|0;c=c|0;d=d|0;f=f|0;b[c>>1]=(e[d>>1]|0)^65535;b[c+2>>1]=(e[d+2>>1]|0)^65535;b[c+4>>1]=(e[d+4>>1]|0)^65535;b[c+6>>1]=(e[d+6>>1]|0)^65535;return d+8|0}function xha(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;b[c+6>>1]=b[d>>1]|0;b[c>>1]=b[d+2>>1]|0;b[c+2>>1]=b[d+4>>1]|0;b[c+4>>1]=b[d+6>>1]|0;return d+8|0}function yha(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;b[c+6>>1]=b[d>>1]|0;b[c+4>>1]=b[d+2>>1]|0;b[c+2>>1]=b[d+4>>1]|0;b[c>>1]=b[d+6>>1]|0;return d+8|0}function zha(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;b[c+4>>1]=b[d>>1]|0;b[c+2>>1]=b[d+2>>1]|0;b[c>>1]=b[d+4>>1]|0;b[c+6>>1]=b[d+6>>1]|0;return d+8|0}function Aha(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;g=i;h=c[a>>2]|0;a=h>>>3&15;j=(h&1024|0)!=0;if(j){k=e+(ca(f<<1,h>>>7&7)|0)|0}else{k=e}if((a|0)==0){l=e+2|0;i=g;return l|0}m=a+ -1|0;n=(h&2048|0)==0;o=(h&8192|0)==0;h=f<<1;f=k;k=0;while(1){p=b[f>>1]|0;if(n){q=p}else{r=p&65535;q=(r<<8|r>>>8)&65535}r=q&65535;b[d+((j?m-k|0:k)<<1)>>1]=o?r:r^65535;k=k+1|0;if((k|0)>=(a|0)){break}else{f=f+h|0}}l=e+2|0;i=g;return l|0}function Bha(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;f=i;g=c[a>>2]|0;a=g>>>3&15;h=g>>>10&1;j=g>>>14&1;k=g>>>7&7;l=(h|0)!=(j|0);if(l){m=e+(k<<1)|0}else{m=e}if((a|0)==0){n=m}else{e=(h|0)==0;h=(g&2048|0)==0;o=(g&8192|0)==0;g=a+ -1|0;p=a>>>0>1?a<<1:2;q=m;r=0;while(1){s=b[q>>1]|0;if(h){t=s}else{u=s&65535;t=(u<<8|u>>>8)&65535}u=t&65535;b[d+((e?r:g-r|0)<<1)>>1]=o?u:u^65535;r=r+1|0;if((r|0)>=(a|0)){break}else{q=q+2|0}}n=m+p|0}if(l){v=n}else{v=n+(k<<1)|0}if((k|0)!=0|(j|0)==0){i=f;return v|0}j=b[d>>1]|0;k=a+ -1|0;d3a(d|0,d+2|0,k<<1|0)|0;b[d+(k<<1)>>1]=j;i=f;return v|0}function Cha(a){a=+a;var b=0,d=0.0,e=0;b=i;d=a+.5;if(!(d<=0.0)){if(!(d>=65535.0)){h[k>>3]=d+-32767.0+103079215104.0;e=((c[k>>2]|0)>>>16)+32767&65535}else{e=-1}}else{e=0}i=b;return e|0}function Dha(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0;e=i;i=i+80|0;f=e+48|0;g=e+24|0;j=e;k=l2(b)|0;if((k|0)==1633842036|(k|0)==1818848875|(k|0)==1852662636){c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;l=0;i=e;return l|0}if(d>>>0>2){c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;l=0;i=e;return l|0}if((n2(b)|0)>>>0>67108863?(d&-3|0)==0:0){if((eea(b)|0)==0){h[a>>3]=.00336;h[a+8>>3]=.0034731;h[a+16>>3]=.00287;l=1;i=e;return l|0}else{l=Eha(b,1,a)|0;i=e;return l|0}}if((d|0)==1&(k|0)==1886549106?(j2(b)|0)==1129142603:0){if((gea(b,0,0)|0)==0){c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;l=1;i=e;return l|0}k=Gha(b,0)|0;if((k|0)==0){c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;l=0;i=e;return l|0}c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;p8(k,f,g,1);if(+h[g>>3]>50.0){h[g>>3]=50.0}f=g+8|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;o8(k);c4(0,j,+h[g>>3],+h[f>>3],+h[g+16>>3]);if((a|0)==0){l=1;i=e;return l|0}c[a+0>>2]=c[j+0>>2];c[a+4>>2]=c[j+4>>2];c[a+8>>2]=c[j+8>>2];c[a+12>>2]=c[j+12>>2];c[a+16>>2]=c[j+16>>2];c[a+20>>2]=c[j+20>>2];l=1;i=e;return l|0}l=Eha(b,d,a)|0;i=e;return l|0}function Eha(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;i=i+64|0;f=e+52|0;g=e+48|0;j=e+24|0;k=e;l=Y1(a)|0;if((gea(a,b,0)|0)==0){c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;m=0;i=e;return m|0}n=xfa(a,2,0)|0;if((n4(j2(a)|0,0,f,g)|0)==0){c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;m=0;i=e;return m|0}if((c[g>>2]|0)!=(n>>>3&15|0)){c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;m=0;i=e;return m|0}g=e8(l)|0;if((g|0)==0){c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;m=0;i=e;return m|0}o=x8(l,a,n,g,4849688,b,320)|0;r2(g);if((o|0)==0){c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;m=0;i=e;return m|0}p8(o,c[f>>2]|0,j,1);f=j+8|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;if(+h[j>>3]>50.0){h[j>>3]=50.0}o8(o);c4(0,k,+h[j>>3],+h[f>>3],+h[j+16>>3]);if((d|0)==0){m=1;i=e;return m|0}c[d+0>>2]=c[k+0>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2];c[d+16>>2]=c[k+16>>2];c[d+20>>2]=c[k+20>>2];m=1;i=e;return m|0}function Fha(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0,y=0.0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0.0,J=0,K=0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,T=0.0;e=i;i=i+10464|0;f=e+10384|0;g=e+10360|0;j=e+10336|0;k=e+10312|0;l=e+10288|0;m=e+10264|0;n=e+8216|0;o=e+6168|0;p=e+4120|0;q=e+2072|0;r=e+24|0;s=e;t=l2(b)|0;if((t|0)==1633842036|(t|0)==1818848875|(t|0)==1852662636){c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;i=e;return}if(d>>>0>2){c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;i=e;return}if((n2(b)|0)>>>0>67108863?(d&-3|0)==0:0){if((eea(b)|0)==0){h[a>>3]=.00336;h[a+8>>3]=.0034731;h[a+16>>3]=.00287;i=e;return}else{Eha(b,1,a)|0;i=e;return}}t=j2(b)|0;if((fea(b,d,1)|0)!=0?(t|0)==1129142603|(t|0)==1196573017|(t|0)==1380401696:0){t=(d|0)==1;do{if(t){if((Dha(s,b,1)|0)==0){i=e;return}else{a4(0,k,+h[s>>3],+h[s+8>>3],+h[s+16>>3]);break}}else{c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;c[k+20>>2]=0}}while(0);s=Gha(b,d)|0;if((s|0)==0){i=e;return}u=m+8|0;v=m+16|0;w=+h[k+8>>3];x=!(w<-50.0)&w>50.0;y=+h[k+16>>3];z=!(y<-50.0)&y>50.0;A=y<-50.0;B=w<-50.0;C=0;do{h[m>>3]=+(C|0)*100.0/255.0;h[u>>3]=x|B?x?50.0:-50.0:w;h[v>>3]=z|A?z?50.0:-50.0:y;p8(s,m,l,1);h[n+(C<<3)>>3]=+h[m>>3];h[o+(C<<3)>>3]=+h[l>>3];C=C+1|0}while((C|0)!=256);C=o+2040|0;D=+h[C>>3];l=254;do{z=o+(l<<3)|0;E=+h[z>>3];D=E<D?E:D;h[z>>3]=D;l=l+ -1|0}while((l|0)>0);D=+h[o>>3];E=+h[C>>3];if(!(D<E)){o8(s);c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;i=e;return}F=E-D;if(t){E=D+F*.2;C=1;l=0;while(1){G=+h[n+(l<<3)>>3];if(!(G<=E)?!(+R(+(G- +h[o+(l<<3)>>3]))<4.0):0){H=0}else{H=C}l=l+1|0;if((l|0)==256){break}else{C=H}}if((H|0)!=0){c4(0,a,+h[k>>3],w,y);o8(s);i=e;return}else{I=D;J=0}}else{I=D;J=0}while(1){h[p+(J<<3)>>3]=(I-D)/F;k=J+1|0;if((k|0)==256){break}I=+h[o+(k<<3)>>3];J=k}I=t?.1:.03;F=t?.5:.25;t=0;J=0;while(1){D=+h[p+(t<<3)>>3];if(D>=I&D<F){h[q+(J<<3)>>3]=+h[n+(t<<3)>>3];h[r+(J<<3)>>3]=D;K=J+1|0}else{K=J}t=t+1|0;if((t|0)==256){break}else{J=K}}if((K|0)<3){o8(s);c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;i=e;return}do{if((K|0)>=4){J=0;F=0.0;I=0.0;D=0.0;E=0.0;G=0.0;L=0.0;M=0.0;do{N=+h[q+(J<<3)>>3];O=+h[r+(J<<3)>>3];F=F+N;P=N*N;I=I+P;Q=N*P;D=D+Q;E=E+N*Q;G=G+O;Q=N*O;L=L+Q;M=M+N*Q;J=J+1|0}while((J|0)!=(K|0));T3(f,+(K|0),F,I);T3(f+24|0,F,I,D);T3(f+48|0,I,D,E);T3(g,G,L,M);if((Y3(j,f,g)|0)!=0){Q=+h[j+16>>3];N=+h[j+8>>3];O=+h[j>>3];if(+R(+Q)<1.0e-10){P=-O/N;if(P<50.0){T=0.0;break}T=P>0.0?0.0:P;break}else{P=N*N-Q*4.0*O;if(P<=0.0){T=0.0;break}O=(+S(+P)-N)/(Q*2.0);Q=O>50.0?50.0:O;T=Q<0.0?0.0:Q;break}}else{T=0.0}}else{T=0.0}}while(0);Q=T<0.0?0.0:T;h[m>>3]=Q;h[u>>3]=w;h[v>>3]=y;c4(0,a,Q,w,y);o8(s);i=e;return}Dha(a,b,d)|0;i=e;return}function Gha(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+80|0;e=d+64|0;f=d;g=d+48|0;h=d+32|0;j=Y1(a)|0;k=f8(j)|0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[f+0>>2]=c[742416>>2];c[f+4>>2]=c[742420>>2];c[f+8>>2]=c[742424>>2];c[f+12>>2]=c[742428>>2];c[f+16>>2]=c[742432>>2];c[f+20>>2]=c[742436>>2];c[f+24>>2]=c[742440>>2];c[f+28>>2]=c[742444>>2];c[g>>2]=k;c[g+4>>2]=a;c[g+8>>2]=a;c[g+12>>2]=k;c[h>>2]=1;c[h+4>>2]=b;c[h+8>>2]=1;c[h+12>>2]=1;b=r8(j,4,g,e,h,f,0,0,4849688,4849688,320)|0;r2(k);i=d;return b|0}function Hha(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;e=a+4|0;f=Qc[c[c[e>>2]>>2]&255](a,1,104)|0;c[a+328>>2]=f;c[f>>2]=330;if(b<<24>>24==0){b=Qc[c[(c[e>>2]|0)+4>>2]&255](a,1,1280)|0;g=f+24|0;h=0;do{c[g+(h<<2)>>2]=b+(h<<7);h=h+1|0}while((h|0)!=10);c[f+64>>2]=0;i=d;return}h=a+60|0;if((c[h>>2]|0)<=0){i=d;return}b=f+64|0;f=0;g=c[a+68>>2]|0;while(1){j=c[(c[e>>2]|0)+20>>2]|0;k=vba(c[g+28>>2]|0,c[g+8>>2]|0)|0;l=c[g+12>>2]|0;m=vba(c[g+32>>2]|0,l)|0;c[b+(f<<2)>>2]=Wc[j&31](a,1,0,k,m,l)|0;f=f+1|0;if((f|0)>=(c[h>>2]|0)){break}else{g=g+84|0}}i=d;return}function Iha(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[a+328>>2]|0;c[e+8>>2]=0;Jha(a);if((b|0)==0){if((c[e+64>>2]|0)!=0){c[(c[a>>2]|0)+20>>2]=4;Rc[c[c[a>>2]>>2]&1023](a)}c[e+4>>2]=269;i=d;return}else if((b|0)==3){if((c[e+64>>2]|0)==0){c[(c[a>>2]|0)+20>>2]=4;Rc[c[c[a>>2]>>2]&1023](a)}c[e+4>>2]=270;i=d;return}else if((b|0)==2){if((c[e+64>>2]|0)==0){c[(c[a>>2]|0)+20>>2]=4;Rc[c[c[a>>2]>>2]&1023](a)}c[e+4>>2]=271;i=d;return}else{c[(c[a>>2]|0)+20>>2]=4;Rc[c[c[a>>2]>>2]&1023](a);i=d;return}}function Jha(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+328>>2]|0;do{if((c[a+228>>2]|0)<=1){e=c[a+232>>2]|0;if((c[d+8>>2]|0)>>>0<((c[a+224>>2]|0)+ -1|0)>>>0){c[d+20>>2]=c[e+12>>2];break}else{c[d+20>>2]=c[e+72>>2];break}}else{c[d+20>>2]=1}}while(0);c[d+12>>2]=0;c[d+16>>2]=0;i=b;return}function Kha(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;e=i;f=c[a+328>>2]|0;g=(c[a+248>>2]|0)+ -1|0;h=(c[a+224>>2]|0)+ -1|0;j=f+16|0;k=c[j>>2]|0;l=f+20|0;m=c[l>>2]|0;a:do{if((k|0)<(m|0)){n=f+12|0;o=a+228|0;p=a+348|0;q=f+24|0;r=f+8|0;s=a+344|0;t=m;u=c[n>>2]|0;v=k;b:while(1){if(u>>>0>g>>>0){w=t}else{x=v<<3;y=u;while(1){z=c[o>>2]|0;if((z|0)>0){A=y>>>0<g>>>0;B=z;z=0;C=0;while(1){D=c[a+(C<<2)+232>>2]|0;E=D+52|0;F=c[(A?E:D+68|0)>>2]|0;G=ca(c[D+64>>2]|0,y)|0;H=D+56|0;if((c[H>>2]|0)>0){I=D+4|0;J=D+72|0;K=z;L=0;M=x;while(1){if(!((c[r>>2]|0)>>>0<h>>>0)?(L+v|0)>=(c[J>>2]|0):0){yba(c[q+(K<<2)>>2]|0,c[E>>2]<<7);N=c[E>>2]|0;if((N|0)>0){O=q+(K+ -1<<2)|0;P=0;do{b[c[q+(P+K<<2)>>2]>>1]=b[c[O>>2]>>1]|0;P=P+1|0;Q=c[E>>2]|0}while((P|0)<(Q|0));R=Q}else{R=N}}else{ad[c[(c[s>>2]|0)+4>>2]&15](a,D,c[d+(c[I>>2]<<2)>>2]|0,c[q+(K<<2)>>2]|0,M,G,F);P=c[E>>2]|0;if((F|0)<(P|0)){yba(c[q+(K+F<<2)>>2]|0,P-F<<7);O=c[E>>2]|0;if((F|0)<(O|0)){Q=F;do{S=Q+K|0;b[c[q+(S<<2)>>2]>>1]=b[c[q+(S+ -1<<2)>>2]>>1]|0;Q=Q+1|0;S=c[E>>2]|0}while((Q|0)<(S|0));R=S}else{R=O}}else{R=P}}K=R+K|0;L=L+1|0;if((L|0)>=(c[H>>2]|0)){break}else{M=M+8|0}}T=c[o>>2]|0;U=K}else{T=B;U=z}C=C+1|0;if((C|0)>=(T|0)){break}else{B=T;z=U}}}z=y+1|0;if((dd[c[(c[p>>2]|0)+4>>2]&511](a,q)|0)<<24>>24==0){break b}if(z>>>0>g>>>0){break}else{y=z}}w=c[l>>2]|0}c[n>>2]=0;x=v+1|0;if((x|0)<(w|0)){t=w;u=0;v=x}else{V=r;W=r;break a}}c[j>>2]=v;c[n>>2]=y;X=0;i=e;return X|0}else{r=f+8|0;V=r;W=r}}while(0);c[W>>2]=(c[V>>2]|0)+1;Jha(a);X=1;i=e;return X|0}function Lha(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;e=i;f=c[a+328>>2]|0;g=(c[a+224>>2]|0)+ -1|0;h=a+60|0;if((c[h>>2]|0)<=0){j=Mha(a,d)|0;i=e;return j|0}k=a+4|0;l=f+64|0;m=f+8|0;f=a+344|0;n=0;o=c[a+68>>2]|0;while(1){p=o+12|0;q=c[p>>2]|0;r=ca(q,c[m>>2]|0)|0;s=ed[c[(c[k>>2]|0)+32>>2]&127](a,c[l+(n<<2)>>2]|0,r,q,1)|0;q=c[m>>2]|0;if(q>>>0<g>>>0){t=c[p>>2]|0}else{r=c[p>>2]|0;u=((c[o+32>>2]|0)>>>0)%(r>>>0)|0;t=(u|0)==0?r:u}u=c[o+28>>2]|0;r=c[o+8>>2]|0;v=(u>>>0)%(r>>>0)|0;w=(v|0)>0?r-v|0:v;if((t|0)>0){v=d+(n<<2)|0;x=(w|0)>0;y=w<<7;z=u+ -1|0;A=0;do{B=c[s+(A<<2)>>2]|0;ad[c[(c[f>>2]|0)+4>>2]&15](a,o,c[v>>2]|0,B,A<<3,0,u);if(x){yba(B+(u<<7)|0,y);C=b[B+(z<<7)>>1]|0;D=0;do{b[B+(D+u<<7)>>1]=C;D=D+1|0}while((D|0)!=(w|0))}A=A+1|0}while((A|0)!=(t|0));E=c[m>>2]|0}else{E=q}if((E|0)==(g|0)?(A=w+u|0,z=(A>>>0)/(r>>>0)|0,(t|0)<(c[p>>2]|0)):0){y=A<<7;A=(z|0)==0;x=r+ -1|0;v=(r|0)>0;D=t;do{C=c[s+(D<<2)>>2]|0;B=c[s+(D+ -1<<2)>>2]|0;yba(C,y);if(!A){F=0;G=B;B=C;while(1){C=b[G+(x<<7)>>1]|0;if(v){H=0;do{b[B+(H<<7)>>1]=C;H=H+1|0}while((H|0)!=(r|0))}F=F+1|0;if(!(F>>>0<z>>>0)){break}else{G=G+(r<<7)|0;B=B+(r<<7)|0}}}D=D+1|0}while((D|0)<(c[p>>2]|0))}p=n+1|0;if((p|0)>=(c[h>>2]|0)){break}n=p;o=o+84|0}j=Mha(a,d)|0;i=e;return j|0}function Mha(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0;b=i;i=i+16|0;d=b;e=c[a+328>>2]|0;f=a+228|0;if((c[f>>2]|0)>0){g=a+4|0;h=e+64|0;j=e+8|0;k=0;do{l=c[a+(k<<2)+232>>2]|0;m=c[l+12>>2]|0;n=ca(m,c[j>>2]|0)|0;c[d+(k<<2)>>2]=ed[c[(c[g>>2]|0)+32>>2]&127](a,c[h+(c[l+4>>2]<<2)>>2]|0,n,m,0)|0;k=k+1|0}while((k|0)<(c[f>>2]|0))}k=e+16|0;h=c[k>>2]|0;g=e+20|0;j=c[g>>2]|0;a:do{if((h|0)<(j|0)){m=e+12|0;n=a+248|0;l=a+348|0;o=e+24|0;p=c[m>>2]|0;q=j;r=h;b:while(1){if(p>>>0<(c[n>>2]|0)>>>0){s=p;while(1){t=c[f>>2]|0;if((t|0)>0){u=t;t=0;v=0;while(1){w=c[a+(v<<2)+232>>2]|0;x=w+52|0;y=c[x>>2]|0;z=ca(y,s)|0;A=w+56|0;w=c[A>>2]|0;if((w|0)>0){B=c[d+(v<<2)>>2]|0;C=y;y=w;w=t;D=0;while(1){if((C|0)>0){E=w;F=(c[B+(D+r<<2)>>2]|0)+(z<<7)|0;G=0;while(1){H=E;E=E+1|0;c[o+(H<<2)>>2]=F;G=G+1|0;I=c[x>>2]|0;if((G|0)>=(I|0)){break}else{F=F+128|0}}J=c[A>>2]|0;K=I;L=E}else{J=y;K=C;L=w}D=D+1|0;if((D|0)>=(J|0)){break}else{C=K;y=J;w=L}}M=c[f>>2]|0;N=L}else{M=u;N=t}v=v+1|0;if((v|0)>=(M|0)){break}else{u=M;t=N}}}t=s+1|0;if((dd[c[(c[l>>2]|0)+4>>2]&511](a,o)|0)<<24>>24==0){break b}if(t>>>0<(c[n>>2]|0)>>>0){s=t}else{break}}O=c[g>>2]|0}else{O=q}c[m>>2]=0;t=r+1|0;if((t|0)<(O|0)){p=0;q=O;r=t}else{break a}}c[k>>2]=r;c[m>>2]=s;P=0;i=b;return P|0}}while(0);s=e+8|0;c[s>>2]=(c[s>>2]|0)+1;Jha(a);P=1;i=b;return P|0}function Nha(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=Qc[c[c[a+4>>2]>>2]&255](a,1,12)|0;c[a+336>>2]=d;c[d>>2]=557;e=a+40|0;switch(c[e>>2]|0){case 3:case 2:{if((c[a+36>>2]|0)!=3){c[(c[a>>2]|0)+20>>2]=9;Rc[c[c[a>>2]>>2]&1023](a)}break};case 1:{if((c[a+36>>2]|0)!=1){c[(c[a>>2]|0)+20>>2]=9;Rc[c[c[a>>2]>>2]&1023](a)}break};case 5:case 4:{if((c[a+36>>2]|0)!=4){c[(c[a>>2]|0)+20>>2]=9;Rc[c[c[a>>2]>>2]&1023](a)}break};default:{if((c[a+36>>2]|0)<1){c[(c[a>>2]|0)+20>>2]=9;Rc[c[c[a>>2]>>2]&1023](a)}}}f=c[a+64>>2]|0;switch(f|0){case 3:{if((c[a+60>>2]|0)!=3){c[(c[a>>2]|0)+20>>2]=10;Rc[c[c[a>>2]>>2]&1023](a)}g=c[e>>2]|0;if((g|0)==2){c[d>>2]=558;c[d+4>>2]=33;i=b;return}else if((g|0)==3){c[d+4>>2]=32;i=b;return}else{c[(c[a>>2]|0)+20>>2]=27;Rc[c[c[a>>2]>>2]&1023](a);i=b;return}break};case 5:{if((c[a+60>>2]|0)!=4){c[(c[a>>2]|0)+20>>2]=10;Rc[c[c[a>>2]>>2]&1023](a)}g=c[e>>2]|0;if((g|0)==4){c[d>>2]=558;c[d+4>>2]=34;i=b;return}else if((g|0)==5){c[d+4>>2]=32;i=b;return}else{c[(c[a>>2]|0)+20>>2]=27;Rc[c[c[a>>2]>>2]&1023](a);i=b;return}break};case 1:{if((c[a+60>>2]|0)!=1){c[(c[a>>2]|0)+20>>2]=10;Rc[c[c[a>>2]>>2]&1023](a)}g=c[e>>2]|0;if((g|0)==3){c[d+4>>2]=30;i=b;return}else if((g|0)==1){c[d+4>>2]=30;i=b;return}else if((g|0)==2){c[d>>2]=558;c[d+4>>2]=31;i=b;return}else{c[(c[a>>2]|0)+20>>2]=27;Rc[c[c[a>>2]>>2]&1023](a);i=b;return}break};case 2:{if((c[a+60>>2]|0)!=3){c[(c[a>>2]|0)+20>>2]=10;Rc[c[c[a>>2]>>2]&1023](a)}if((c[e>>2]|0)==2){c[d+4>>2]=32;i=b;return}else{c[(c[a>>2]|0)+20>>2]=27;Rc[c[c[a>>2]>>2]&1023](a);i=b;return}break};case 4:{if((c[a+60>>2]|0)!=4){c[(c[a>>2]|0)+20>>2]=10;Rc[c[c[a>>2]>>2]&1023](a)}if((c[e>>2]|0)==4){c[d+4>>2]=32;i=b;return}else{c[(c[a>>2]|0)+20>>2]=27;Rc[c[c[a>>2]>>2]&1023](a);i=b;return}break};default:{if(!((f|0)==(c[e>>2]|0)?(c[a+60>>2]|0)==(c[a+36>>2]|0):0)){c[(c[a>>2]|0)+20>>2]=27;Rc[c[c[a>>2]>>2]&1023](a)}c[d+4>>2]=32;i=b;return}}}function Oha(a){a=a|0;return}function Pha(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0;h=i;j=c[b+28>>2]|0;k=c[b+36>>2]|0;if((g|0)<=0){i=h;return}b=(j|0)==0;l=f;f=d;d=g;do{d=d+ -1|0;g=c[(c[e>>2]|0)+(l<<2)>>2]|0;l=l+1|0;if(!b){m=0;n=c[f>>2]|0;while(1){a[g+m>>0]=a[n>>0]|0;m=m+1|0;if((m|0)==(j|0)){break}else{n=n+k|0}}}f=f+4|0}while((d|0)>0);i=h;return}function Qha(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+336>>2]|0;e=Qc[c[c[a+4>>2]>>2]&255](a,1,8192)|0;c[d+8>>2]=e;d=0;do{c[e+(d<<2)>>2]=d*19595;c[e+(d+256<<2)>>2]=d*38470;c[e+(d+512<<2)>>2]=(d*7471|0)+32768;c[e+(d+768<<2)>>2]=ca(d,-11059)|0;c[e+(d+1024<<2)>>2]=ca(d,-21709)|0;c[e+(d+1280<<2)>>2]=(d<<15)+8421375;c[e+(d+1536<<2)>>2]=ca(d,-27439)|0;c[e+(d+1792<<2)>>2]=ca(d,-5329)|0;d=d+1|0}while((d|0)!=256);i=b;return}function Rha(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0;j=i;k=c[(c[b+336>>2]|0)+8>>2]|0;l=c[b+28>>2]|0;if((h|0)<=0){i=j;return}b=(l|0)==0;m=g;g=e;e=h;do{e=e+ -1|0;h=c[(c[f>>2]|0)+(m<<2)>>2]|0;m=m+1|0;if(!b){n=0;o=c[g>>2]|0;while(1){a[h+n>>0]=((c[k+((d[o+1>>0]|0|256)<<2)>>2]|0)+(c[k+((d[o>>0]|0)<<2)>>2]|0)+(c[k+((d[o+2>>0]|0|512)<<2)>>2]|0)|0)>>>16;n=n+1|0;if((n|0)==(l|0)){break}else{o=o+3|0}}}g=g+4|0}while((e|0)>0);i=j;return}function Sha(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;h=i;j=c[b+60>>2]|0;k=c[b+28>>2]|0;if((g|0)<=0){i=h;return}b=(j|0)>0;l=(k|0)==0;m=f;f=d;d=g;while(1){d=d+ -1|0;if(b){g=0;do{n=c[(c[e+(g<<2)>>2]|0)+(m<<2)>>2]|0;if(!l){o=0;p=c[f>>2]|0;while(1){a[n+o>>0]=a[p+g>>0]|0;o=o+1|0;if((o|0)==(k|0)){break}else{p=p+j|0}}}g=g+1|0}while((g|0)!=(j|0))}if((d|0)<=0){break}else{m=m+1|0;f=f+4|0}}i=h;return}function Tha(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;j=i;k=c[(c[b+336>>2]|0)+8>>2]|0;l=c[b+28>>2]|0;if((h|0)<=0){i=j;return}b=f+4|0;m=f+8|0;n=(l|0)==0;o=g;g=e;e=h;do{e=e+ -1|0;h=c[(c[f>>2]|0)+(o<<2)>>2]|0;p=c[(c[b>>2]|0)+(o<<2)>>2]|0;q=c[(c[m>>2]|0)+(o<<2)>>2]|0;o=o+1|0;if(!n){r=0;s=c[g>>2]|0;while(1){t=d[s>>0]|0;u=d[s+1>>0]|0;v=d[s+2>>0]|0;a[h+r>>0]=((c[k+((u|256)<<2)>>2]|0)+(c[k+(t<<2)>>2]|0)+(c[k+((v|512)<<2)>>2]|0)|0)>>>16;a[p+r>>0]=((c[k+((u|1024)<<2)>>2]|0)+(c[k+((t|768)<<2)>>2]|0)+(c[k+((v|1280)<<2)>>2]|0)|0)>>>16;a[q+r>>0]=((c[k+((u|1536)<<2)>>2]|0)+(c[k+((t|1280)<<2)>>2]|0)+(c[k+((v|1792)<<2)>>2]|0)|0)>>>16;r=r+1|0;if((r|0)==(l|0)){break}else{s=s+3|0}}}g=g+4|0}while((e|0)>0);i=j;return}function Uha(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;j=i;k=c[(c[b+336>>2]|0)+8>>2]|0;l=c[b+28>>2]|0;if((h|0)<=0){i=j;return}b=f+4|0;m=f+8|0;n=f+12|0;o=(l|0)==0;p=g;g=e;e=h;do{e=e+ -1|0;h=c[(c[f>>2]|0)+(p<<2)>>2]|0;q=c[(c[b>>2]|0)+(p<<2)>>2]|0;r=c[(c[m>>2]|0)+(p<<2)>>2]|0;s=c[(c[n>>2]|0)+(p<<2)>>2]|0;p=p+1|0;if(!o){t=0;u=c[g>>2]|0;while(1){v=(d[u>>0]|0)^255;w=(d[u+1>>0]|0)^255;x=(d[u+2>>0]|0)^255;a[s+t>>0]=a[u+3>>0]|0;a[h+t>>0]=((c[k+((w|256)<<2)>>2]|0)+(c[k+(v<<2)>>2]|0)+(c[k+((x|512)<<2)>>2]|0)|0)>>>16;a[q+t>>0]=((c[k+((w|1024)<<2)>>2]|0)+(c[k+((v|768)<<2)>>2]|0)+(c[k+((x|1280)<<2)>>2]|0)|0)>>>16;a[r+t>>0]=((c[k+((w|1536)<<2)>>2]|0)+(c[k+((v|1280)<<2)>>2]|0)+(c[k+((x|1792)<<2)>>2]|0)|0)>>>16;t=t+1|0;if((t|0)==(l|0)){break}else{u=u+4|0}}}g=g+4|0}while((e|0)>0);i=j;return}function Vha(a){a=a|0;var b=0,d=0,e=0;b=i;d=Qc[c[c[a+4>>2]>>2]&255](a,1,28)|0;c[a+344>>2]=d;c[d>>2]=559;e=c[a+184>>2]|0;if((e|0)==0){c[d+4>>2]=15;c[d+8>>2]=560}else if((e|0)==1){c[d+4>>2]=15;c[d+8>>2]=561}else{c[(c[a>>2]|0)+20>>2]=48;Rc[c[c[a>>2]>>2]&1023](a)}a=d+12|0;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;i=b;return}function Wha(a){a=a|0;var d=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=i;f=a+60|0;if((c[f>>2]|0)<=0){i=d;return}g=a+184|0;h=(c[a+344>>2]|0)+12|0;j=a+4|0;k=0;l=c[a+68>>2]|0;while(1){m=c[l+16>>2]|0;n=a+(m<<2)+72|0;if(!(m>>>0>3)?(o=c[n>>2]|0,(o|0)!=0):0){p=o}else{c[(c[a>>2]|0)+20>>2]=52;c[(c[a>>2]|0)+24>>2]=m;Rc[c[c[a>>2]>>2]&1023](a);p=c[n>>2]|0}n=c[g>>2]|0;if((n|0)==1){o=h+(m<<2)|0;q=c[o>>2]|0;if((q|0)==0){r=Qc[c[c[j>>2]>>2]&255](a,1,256)|0;c[o>>2]=r;s=r}else{s=q}q=0;do{c[s+(q<<2)>>2]=(ca(b[742448+(q<<1)>>1]|0,e[p+(q<<1)>>1]|0)|0)+1024>>11;q=q+1|0}while((q|0)!=64)}else if((n|0)==0){q=h+(m<<2)|0;r=c[q>>2]|0;if((r|0)==0){o=Qc[c[c[j>>2]>>2]&255](a,1,256)|0;c[q>>2]=o;t=o}else{t=r}r=0;do{c[t+(r<<2)>>2]=e[p+(r<<1)>>1]<<3;r=r+1|0}while((r|0)!=64)}else{c[(c[a>>2]|0)+20>>2]=48;Rc[c[c[a>>2]>>2]&1023](a)}k=k+1|0;if((k|0)>=(c[f>>2]|0)){break}else{l=l+84|0}}i=d;return}function Xha(a,e,f,g,h,j,k){a=a|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;l=i;i=i+256|0;m=l;n=c[a+344>>2]|0;a=c[n+8>>2]|0;o=c[n+12+(c[e+16>>2]<<2)>>2]|0;if((k|0)==0){i=l;return}e=j;j=0;while(1){n=e+1|0;p=e+2|0;q=e+3|0;r=e+4|0;s=e+5|0;t=e+6|0;u=e+7|0;v=0;w=m;while(1){x=c[f+(v+h<<2)>>2]|0;c[w>>2]=(d[x+e>>0]|0)+ -128;c[w+4>>2]=(d[x+n>>0]|0)+ -128;c[w+8>>2]=(d[x+p>>0]|0)+ -128;c[w+12>>2]=(d[x+q>>0]|0)+ -128;c[w+16>>2]=(d[x+r>>0]|0)+ -128;c[w+20>>2]=(d[x+s>>0]|0)+ -128;c[w+24>>2]=(d[x+t>>0]|0)+ -128;c[w+28>>2]=(d[x+u>>0]|0)+ -128;v=v+1|0;if((v|0)==8){break}else{w=w+32|0}}Rc[a&1023](m);w=0;do{v=c[o+(w<<2)>>2]|0;u=c[m+(w<<2)>>2]|0;t=v>>1;if((u|0)>=0){s=u+t|0;if((s|0)<(v|0)){y=0}else{y=(s|0)/(v|0)|0}}else{s=t-u|0;if((s|0)<(v|0)){z=0}else{z=(s|0)/(v|0)|0}y=0-z|0}b[g+(j<<7)+(w<<1)>>1]=y;w=w+1|0}while((w|0)!=64);j=j+1|0;if((j|0)==(k|0)){break}else{e=e+8|0}}i=l;return}function Yha(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;h=i;i=i+1296|0;j=h+1028|0;k=h;if(f>>>0>3){c[(c[b>>2]|0)+20>>2]=50;c[(c[b>>2]|0)+24>>2]=f;Rc[c[c[b>>2]>>2]&1023](b)}l=e<<24>>24!=0;if(l){m=b+(f<<2)+88|0}else{m=b+(f<<2)+104|0}e=c[m>>2]|0;if((e|0)==0){c[(c[b>>2]|0)+20>>2]=50;c[(c[b>>2]|0)+24>>2]=f;Rc[c[c[b>>2]>>2]&1023](b)}f=c[g>>2]|0;if((f|0)==0){m=Qc[c[c[b+4>>2]>>2]&255](b,1,1280)|0;c[g>>2]=m;n=b;o=m}else{n=b;o=f}f=1;m=0;while(1){g=a[e+f>>0]|0;p=g&255;q=p+m|0;if((q|0)>256){c[(c[b>>2]|0)+20>>2]=8;Rc[c[c[b>>2]>>2]&1023](n)}if(g<<24>>24==0){r=m}else{f3a(j+m|0,f&255|0,p|0)|0;r=q}f=f+1|0;if((f|0)==17){break}else{m=r}}a[j+r>>0]=0;m=a[j>>0]|0;if(!(m<<24>>24==0)){f=m;q=m<<24>>24;m=0;p=0;while(1){if((f<<24>>24|0)==(q|0)){g=m;s=p;while(1){t=s+1|0;c[k+(s<<2)>>2]=g;u=g+1|0;v=a[j+t>>0]|0;if((v<<24>>24|0)==(q|0)){g=u;s=t}else{w=v;x=u;y=t;break}}}else{w=f;x=m;y=p}if((x|0)>=(1<<q|0)){c[(c[b>>2]|0)+20>>2]=8;Rc[c[c[b>>2]>>2]&1023](n)}if(w<<24>>24==0){break}else{f=w;q=q+1|0;m=x<<1;p=y}}}f3a(o+1024|0,0,256)|0;y=l?15:255;if((r|0)>0){z=0}else{i=h;return}do{l=d[e+z+17>>0]|0;p=o+l+1024|0;if(!(!(l>>>0>y>>>0)?(a[p>>0]|0)==0:0)){c[(c[b>>2]|0)+20>>2]=8;Rc[c[c[b>>2]>>2]&1023](n)}c[o+(l<<2)>>2]=c[k+(z<<2)>>2];a[p>>0]=a[j+z>>0]|0;z=z+1|0}while((z|0)!=(r|0));i=h;return}function Zha(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;g=i;i=i+2096|0;h=g+2056|0;j=g+1028|0;k=g;l=h+0|0;m=l+33|0;do{a[l>>0]=0;l=l+1|0}while((l|0)<(m|0));f3a(j|0,0,1028)|0;f3a(k|0,-1,1028)|0;c[f+1024>>2]=1;n=-1;o=0;p=1e9;a:while(1){if((o|0)<257){q=c[f+(o<<2)>>2]|0;r=(q|0)==0|(q|0)>(p|0);n=r?n:o;o=o+1|0;p=r?p:q;continue}else{s=-1;t=0;u=1e9}while(1){q=c[f+(t<<2)>>2]|0;r=(q|0)==0|(q|0)>(u|0)|(t|0)==(n|0);s=r?s:t;t=t+1|0;if((t|0)==257){break}else{u=r?u:q}}if((s|0)<0){break}q=f+(s<<2)|0;r=f+(n<<2)|0;c[r>>2]=(c[r>>2]|0)+(c[q>>2]|0);c[q>>2]=0;q=j+(n<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+(n<<2)|0;r=c[q>>2]|0;if((r|0)>-1){v=r;do{r=j+(v<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+(v<<2)|0;v=c[r>>2]|0}while((v|0)>-1);w=r}else{w=q}c[w>>2]=s;v=j+(s<<2)|0;c[v>>2]=(c[v>>2]|0)+1;v=c[k+(s<<2)>>2]|0;if((v|0)>-1){x=v}else{n=-1;o=0;p=1e9;continue}while(1){v=j+(x<<2)|0;c[v>>2]=(c[v>>2]|0)+1;v=c[k+(x<<2)>>2]|0;if((v|0)>-1){x=v}else{n=-1;o=0;p=1e9;continue a}}}p=0;do{o=c[j+(p<<2)>>2]|0;if((o|0)!=0){if((o|0)>32){c[(c[b>>2]|0)+20>>2]=39;Rc[c[c[b>>2]>>2]&1023](b)}n=h+o|0;a[n>>0]=(a[n>>0]|0)+1<<24>>24}p=p+1|0}while((p|0)!=257);y=32;while(1){p=h+y|0;b=a[p>>0]|0;if(b<<24>>24==0){z=y+ -1|0}else{n=y+ -2|0;o=y+ -1|0;x=h+o|0;k=b;do{b=n;while(1){A=h+b|0;if((a[A>>0]|0)==0){b=b+ -1|0}else{break}}a[p>>0]=(k&255)+254;a[x>>0]=(a[x>>0]|0)+1<<24>>24;s=h+(b+1)|0;a[s>>0]=(d[s>>0]|0)+2;a[A>>0]=(a[A>>0]|0)+ -1<<24>>24;k=a[p>>0]|0}while(!(k<<24>>24==0));z=o}if((z|0)>16){y=z}else{B=16;break}}while(1){C=h+B|0;D=a[C>>0]|0;if(D<<24>>24==0){B=B+ -1|0}else{break}}a[C>>0]=D+ -1<<24>>24;l=e+0|0;D=h+0|0;m=l+17|0;do{a[l>>0]=a[D>>0]|0;l=l+1|0;D=D+1|0}while((l|0)<(m|0));D=1;l=0;while(1){m=0;h=l;while(1){if((c[j+(m<<2)>>2]|0)==(D|0)){a[e+h+17>>0]=m;E=h+1|0}else{E=h}m=m+1|0;if((m|0)==256){break}else{h=E}}D=D+1|0;if((D|0)==33){break}else{l=E}}a[e+273>>0]=0;i=g;return}function _ha(a){a=a|0;var b=0,d=0;b=i;d=Qc[c[c[a+4>>2]>>2]&255](a,1,108)|0;c[a+348>>2]=d;c[d>>2]=331;a=d+44|0;d=a+64|0;do{c[a>>2]=0;a=a+4|0}while((a|0)<(d|0));i=b;return}function $ha(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;d=i;e=c[a+348>>2]|0;f=b<<24>>24!=0;b=e+4|0;if(f){c[b>>2]=272;c[e+8>>2]=562}else{c[b>>2]=273;c[e+8>>2]=563}b=a+228|0;if((c[b>>2]|0)<=0){g=e+12|0;c[g>>2]=0;h=e+16|0;c[h>>2]=0;j=a+188|0;k=c[j>>2]|0;l=e+36|0;m=k;c[l>>2]=m;n=e+40|0;c[n>>2]=0;i=d;return}o=e+76|0;p=a+4|0;q=e+92|0;r=e+20|0;s=e+44|0;t=e+60|0;u=0;do{v=c[a+(u<<2)+232>>2]|0;w=c[v+20>>2]|0;x=c[v+24>>2]|0;if(f){if(w>>>0>3){c[(c[a>>2]|0)+20>>2]=50;c[(c[a>>2]|0)+24>>2]=w;Rc[c[c[a>>2]>>2]&1023](a)}if(x>>>0>3){c[(c[a>>2]|0)+20>>2]=50;c[(c[a>>2]|0)+24>>2]=x;Rc[c[c[a>>2]>>2]&1023](a)}v=o+(w<<2)|0;y=c[v>>2]|0;if((y|0)==0){z=Qc[c[c[p>>2]>>2]&255](a,1,1028)|0;c[v>>2]=z;A=z}else{A=y}f3a(A|0,0,1028)|0;y=q+(x<<2)|0;z=c[y>>2]|0;if((z|0)==0){v=Qc[c[c[p>>2]>>2]&255](a,1,1028)|0;c[y>>2]=v;B=v}else{B=z}f3a(B|0,0,1028)|0}else{Yha(a,1,w,s+(w<<2)|0);Yha(a,0,x,t+(x<<2)|0)}c[r+(u<<2)>>2]=0;u=u+1|0}while((u|0)<(c[b>>2]|0));g=e+12|0;c[g>>2]=0;h=e+16|0;c[h>>2]=0;j=a+188|0;k=c[j>>2]|0;l=e+36|0;m=k;c[l>>2]=m;n=e+40|0;c[n>>2]=0;i=d;return}function aia(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;e=i;f=c[a+348>>2]|0;g=a+188|0;h=c[g>>2]|0;if((h|0)!=0){j=f+36|0;k=c[j>>2]|0;if((k|0)==0){l=a+228|0;if((c[l>>2]|0)>0){m=f+20|0;n=0;do{c[m+(n<<2)>>2]=0;n=n+1|0}while((n|0)<(c[l>>2]|0));o=c[g>>2]|0}else{o=h}c[j>>2]=o;p=j;q=o}else{p=j;q=k}c[p>>2]=q+ -1}q=a+256|0;if((c[q>>2]|0)<=0){i=e;return 1}p=f+20|0;k=f+76|0;j=f+92|0;f=0;do{o=c[a+(f<<2)+260>>2]|0;h=c[a+(o<<2)+232>>2]|0;g=d+(f<<2)|0;l=c[g>>2]|0;n=p+(o<<2)|0;o=c[k+(c[h+20>>2]<<2)>>2]|0;m=c[j+(c[h+24>>2]<<2)>>2]|0;h=(b[l>>1]|0)-(c[n>>2]|0)|0;r=(h|0)<0?0-h|0:h;if((r|0)!=0){h=0;s=r;while(1){t=h+1|0;s=s>>1;if((s|0)==0){break}else{h=t}}if((h|0)>10){c[(c[a>>2]|0)+20>>2]=6;Rc[c[c[a>>2]>>2]&1023](a);u=t}else{u=t}}else{u=0}s=o+(u<<2)|0;c[s>>2]=(c[s>>2]|0)+1;s=m+960|0;r=1;v=0;while(1){w=b[l+(c[726928+(r<<2)>>2]<<1)>>1]|0;x=w<<16>>16;if(w<<16>>16==0){y=v+1|0}else{if((v|0)>15){z=v+ -16|0;A=z>>>4;c[s>>2]=A+1+(c[s>>2]|0);B=z-(A<<4)|0}else{B=v}A=1;z=w<<16>>16<0?0-x|0:x;while(1){z=z>>1;if((z|0)==0){break}else{A=A+1|0}}if((A|0)>10){c[(c[a>>2]|0)+20>>2]=6;Rc[c[c[a>>2]>>2]&1023](a)}z=m+(A+(B<<4)<<2)|0;c[z>>2]=(c[z>>2]|0)+1;y=0}r=r+1|0;if((r|0)==64){break}else{v=y}}if((y|0)>0){c[m>>2]=(c[m>>2]|0)+1}c[n>>2]=b[c[g>>2]>>1]|0;f=f+1|0}while((f|0)<(c[q>>2]|0));i=e;return 1}function bia(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=i;i=i+16|0;e=d+4|0;f=d;g=c[b+348>>2]|0;c[e>>2]=0;c[f>>2]=0;h=b+228|0;if((c[h>>2]|0)<=0){i=d;return}j=g+76|0;k=g+92|0;g=0;do{l=c[b+(g<<2)+232>>2]|0;m=c[l+20>>2]|0;n=c[l+24>>2]|0;l=e+m|0;if((a[l>>0]|0)==0){o=b+(m<<2)+88|0;p=c[o>>2]|0;if((p|0)==0){q=n9(b)|0;c[o>>2]=q;r=q}else{r=p}Zha(b,r,c[j+(m<<2)>>2]|0);a[l>>0]=1}l=f+n|0;if((a[l>>0]|0)==0){m=b+(n<<2)+104|0;p=c[m>>2]|0;if((p|0)==0){q=n9(b)|0;c[m>>2]=q;s=q}else{s=p}Zha(b,s,c[k+(n<<2)>>2]|0);a[l>>0]=1}g=g+1|0}while((g|0)<(c[h>>2]|0));i=d;return}function cia(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;f=i;i=i+48|0;g=f;h=c[d+348>>2]|0;j=d+24|0;k=c[j>>2]|0;c[g>>2]=c[k>>2];l=g+4|0;c[l>>2]=c[k+4>>2];k=g+8|0;m=h+12|0;c[k+0>>2]=c[m+0>>2];c[k+4>>2]=c[m+4>>2];c[k+8>>2]=c[m+8>>2];c[k+12>>2]=c[m+12>>2];c[k+16>>2]=c[m+16>>2];c[k+20>>2]=c[m+20>>2];n=g+32|0;c[n>>2]=d;o=d+188|0;if((c[o>>2]|0)!=0?(c[h+36>>2]|0)==0:0){p=c[h+40>>2]|0;if((eia(g)|0)<<24>>24==0){q=0;i=f;return q|0}r=c[g>>2]|0;s=r+1|0;c[g>>2]=s;a[r>>0]=-1;r=(c[l>>2]|0)+ -1|0;c[l>>2]=r;do{if((r|0)==0){if((gia(g)|0)<<24>>24==0){q=0;i=f;return q|0}else{t=c[g>>2]|0;u=c[l>>2]|0;break}}else{t=s;u=r}}while(0);c[g>>2]=t+1;a[t>>0]=p+208;p=u+ -1|0;c[l>>2]=p;if((p|0)==0?(gia(g)|0)<<24>>24==0:0){q=0;i=f;return q|0}if((c[(c[n>>2]|0)+228>>2]|0)>0){p=0;do{c[g+(p<<2)+16>>2]=0;p=p+1|0}while((p|0)<(c[(c[n>>2]|0)+228>>2]|0))}}p=d+256|0;a:do{if((c[p>>2]|0)>0){u=h+44|0;t=h+60|0;r=0;b:while(1){s=c[d+(r<<2)+260>>2]|0;v=c[d+(s<<2)+232>>2]|0;w=e+(r<<2)|0;x=c[w>>2]|0;y=g+(s<<2)+16|0;s=c[u+(c[v+20>>2]<<2)>>2]|0;z=c[t+(c[v+24>>2]<<2)>>2]|0;v=(b[x>>1]|0)-(c[y>>2]|0)|0;if((v|0)<0){A=0-v|0;B=v+ -1|0}else{A=v;B=v}if((A|0)!=0){v=0;C=A;while(1){D=v+1|0;C=C>>1;if((C|0)==0){break}else{v=D}}if((v|0)>10){C=c[n>>2]|0;c[(c[C>>2]|0)+20>>2]=6;Rc[c[c[C>>2]>>2]&1023](C);E=D}else{E=D}}else{E=0}if((fia(g,c[s+(E<<2)>>2]|0,a[s+E+1024>>0]|0)|0)<<24>>24==0){q=0;F=44;break}if((E|0)!=0?(fia(g,B,E)|0)<<24>>24==0:0){q=0;F=44;break}C=z+960|0;G=z+1264|0;H=1;I=0;while(1){J=b[x+(c[726928+(H<<2)>>2]<<1)>>1]|0;K=J<<16>>16;if(!(J<<16>>16==0)){if((I|0)>15){L=I;while(1){M=L+ -16|0;if((fia(g,c[C>>2]|0,a[G>>0]|0)|0)<<24>>24==0){q=0;F=44;break b}if((M|0)>15){L=M}else{N=M;break}}}else{N=I}if(J<<16>>16<0){O=0-K|0;P=K+ -1|0}else{O=K;P=K}L=1;M=O;while(1){M=M>>1;if((M|0)==0){break}else{L=L+1|0}}if((L|0)>10){M=c[n>>2]|0;c[(c[M>>2]|0)+20>>2]=6;Rc[c[c[M>>2]>>2]&1023](M)}M=L+(N<<4)|0;if((fia(g,c[z+(M<<2)>>2]|0,a[z+M+1024>>0]|0)|0)<<24>>24==0){q=0;F=44;break b}if((fia(g,P,L)|0)<<24>>24==0){q=0;F=44;break b}else{Q=0}}else{Q=I+1|0}H=H+1|0;if((H|0)>=64){break}else{I=Q}}if((Q|0)>0?(fia(g,c[z>>2]|0,a[z+1024>>0]|0)|0)<<24>>24==0:0){q=0;F=44;break}c[y>>2]=b[c[w>>2]>>1]|0;r=r+1|0;if((r|0)>=(c[p>>2]|0)){break a}}if((F|0)==44){i=f;return q|0}}}while(0);c[c[j>>2]>>2]=c[g>>2];c[(c[j>>2]|0)+4>>2]=c[l>>2];c[m+0>>2]=c[k+0>>2];c[m+4>>2]=c[k+4>>2];c[m+8>>2]=c[k+8>>2];c[m+12>>2]=c[k+12>>2];c[m+16>>2]=c[k+16>>2];c[m+20>>2]=c[k+20>>2];k=c[o>>2]|0;if((k|0)==0){q=1;i=f;return q|0}o=h+36|0;m=c[o>>2]|0;if((m|0)==0){c[o>>2]=k;l=h+40|0;c[l>>2]=(c[l>>2]|0)+1&7;R=k}else{R=m}c[o>>2]=R+ -1;q=1;i=f;return q|0}function dia(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;i=i+48|0;d=b;e=c[a+348>>2]|0;f=a+24|0;g=c[f>>2]|0;c[d>>2]=c[g>>2];h=d+4|0;c[h>>2]=c[g+4>>2];g=d+8|0;j=e+12|0;c[g+0>>2]=c[j+0>>2];c[g+4>>2]=c[j+4>>2];c[g+8>>2]=c[j+8>>2];c[g+12>>2]=c[j+12>>2];c[g+16>>2]=c[j+16>>2];c[g+20>>2]=c[j+20>>2];c[d+32>>2]=a;if((eia(d)|0)<<24>>24==0){c[(c[a>>2]|0)+20>>2]=24;Rc[c[c[a>>2]>>2]&1023](a)}c[c[f>>2]>>2]=c[d>>2];c[(c[f>>2]|0)+4>>2]=c[h>>2];c[j+0>>2]=c[g+0>>2];c[j+4>>2]=c[g+4>>2];c[j+8>>2]=c[g+8>>2];c[j+12>>2]=c[g+12>>2];c[j+16>>2]=c[g+16>>2];c[j+20>>2]=c[g+20>>2];i=b;return}function eia(a){a=a|0;var b=0,d=0;b=i;if((fia(a,127,7)|0)<<24>>24==0){d=0;i=b;return d|0}c[a+8>>2]=0;c[a+12>>2]=0;d=1;i=b;return d|0}function fia(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=i;g=b+12|0;h=c[g>>2]|0;if((e|0)==0){j=b+32|0;c[(c[c[j>>2]>>2]|0)+20>>2]=40;k=c[j>>2]|0;Rc[c[c[k>>2]>>2]&1023](k)}k=h+e|0;h=b+8|0;j=c[h>>2]|((1<<e)+ -1&d)<<24-k;a:do{if((k|0)>7){d=b+4|0;e=k;l=j;while(1){m=l>>>16;n=m&255;o=c[b>>2]|0;c[b>>2]=o+1;a[o>>0]=m;m=(c[d>>2]|0)+ -1|0;c[d>>2]=m;if((m|0)==0?(gia(b)|0)<<24>>24==0:0){p=0;q=12;break}if(((n|0)==255?(n=c[b>>2]|0,c[b>>2]=n+1,a[n>>0]=0,n=(c[d>>2]|0)+ -1|0,c[d>>2]=n,(n|0)==0):0)?(gia(b)|0)<<24>>24==0:0){p=0;q=12;break}n=l<<8;m=e+ -8|0;if((m|0)>7){e=m;l=n}else{r=m;s=n;break a}}if((q|0)==12){i=f;return p|0}}else{r=k;s=j}}while(0);c[h>>2]=s;c[g>>2]=r;p=1;i=f;return p|0}function gia(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a+32>>2]|0;e=c[d+24>>2]|0;if((Lc[c[e+12>>2]&255](d)|0)<<24>>24==0){f=0;i=b;return f|0}c[a>>2]=c[e>>2];c[a+4>>2]=c[e+4>>2];f=1;i=b;return f|0}function hia(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;f=b+4|0;g=Qc[c[c[f>>2]>>2]&255](b,1,116)|0;c[b+392>>2]=g;c[g>>2]=564;c[g+8>>2]=565;c[g+112>>2]=0;if(d<<24>>24==0){d=Qc[c[(c[f>>2]|0)+4>>2]&255](b,1,1280)|0;h=g+32|0;j=0;do{c[h+(j<<2)>>2]=d+(j<<7);j=j+1|0}while((j|0)!=10);c[g+4>>2]=229;c[g+12>>2]=275;c[g+16>>2]=0;i=e;return}j=b+36|0;if((c[j>>2]|0)>0){d=b+200|0;h=g+72|0;k=0;l=c[b+196>>2]|0;while(1){m=c[l+12>>2]|0;if((a[d>>0]|0)==0){n=m}else{n=m*3|0}o=c[(c[f>>2]|0)+20>>2]|0;p=vba(c[l+28>>2]|0,c[l+8>>2]|0)|0;q=vba(c[l+32>>2]|0,m)|0;c[h+(k<<2)>>2]=Wc[o&31](b,1,1,p,q,n)|0;k=k+1|0;if((k|0)>=(c[j>>2]|0)){r=h;break}else{l=l+84|0}}}else{r=g+72|0}c[g+4>>2]=228;c[g+12>>2]=274;c[g+16>>2]=r;i=e;return}function iia(a){a=a|0;var b=0;b=i;c[a+128>>2]=0;oia(a);i=b;return}function jia(d){d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=i;f=c[d+392>>2]|0;if((c[f+16>>2]|0)==0){g=d+136|0;c[g>>2]=0;i=e;return}a:do{if(((a[d+73>>0]|0)!=0?(a[d+200>>0]|0)!=0:0)?(h=d+140|0,(c[h>>2]|0)!=0):0){j=f+112|0;k=c[j>>2]|0;if((k|0)==0){l=d+36|0;m=Qc[c[c[d+4>>2]>>2]&255](d,1,(c[l>>2]|0)*24|0)|0;c[j>>2]=m;n=l;o=m}else{n=d+36|0;o=k}if((c[n>>2]|0)>0){k=0;m=o;l=c[d+196>>2]|0;j=0;while(1){p=c[l+76>>2]|0;if((p|0)==0){break a}if((b[p>>1]|0)==0){break a}if((b[p+2>>1]|0)==0){break a}if((b[p+16>>1]|0)==0){break a}if((b[p+32>>1]|0)==0){break a}if((b[p+18>>1]|0)==0){break a}if((b[p+4>>1]|0)==0){break a}p=c[h>>2]|0;if((c[p+(k<<8)>>2]|0)<0){break a}q=p+(k<<8)+4|0;c[m+4>>2]=c[q>>2];r=(c[q>>2]|0)==0?j:1;q=p+(k<<8)+8|0;c[m+8>>2]=c[q>>2];s=(c[q>>2]|0)==0?r:1;r=p+(k<<8)+12|0;c[m+12>>2]=c[r>>2];q=(c[r>>2]|0)==0?s:1;s=p+(k<<8)+16|0;c[m+16>>2]=c[s>>2];r=(c[s>>2]|0)==0?q:1;q=p+(k<<8)+20|0;c[m+20>>2]=c[q>>2];j=(c[q>>2]|0)==0?r:1;k=k+1|0;if((k|0)>=(c[n>>2]|0)){break}else{m=m+24|0;l=l+84|0}}if(!(j<<24>>24==0)){c[f+12>>2]=276;g=d+136|0;c[g>>2]=0;i=e;return}}}}while(0);c[f+12>>2]=274;g=d+136|0;c[g>>2]=0;i=e;return}function kia(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0;b=i;i=i+16|0;d=b;e=c[a+392>>2]|0;f=a+292|0;if((c[f>>2]|0)>0){g=a+4|0;h=e+72|0;j=a+128|0;k=0;do{l=c[a+(k<<2)+296>>2]|0;m=c[l+12>>2]|0;n=ca(m,c[j>>2]|0)|0;c[d+(k<<2)>>2]=ed[c[(c[g>>2]|0)+32>>2]&127](a,c[h+(c[l+4>>2]<<2)>>2]|0,n,m,1)|0;k=k+1|0}while((k|0)<(c[f>>2]|0))}k=e+24|0;h=c[k>>2]|0;g=e+28|0;j=c[g>>2]|0;a:do{if((h|0)<(j|0)){m=e+20|0;n=a+312|0;l=a+408|0;o=e+32|0;p=c[m>>2]|0;q=j;r=h;b:while(1){if(p>>>0<(c[n>>2]|0)>>>0){s=p;while(1){t=c[f>>2]|0;if((t|0)>0){u=t;t=0;v=0;while(1){w=c[a+(v<<2)+296>>2]|0;x=w+52|0;y=c[x>>2]|0;z=ca(y,s)|0;A=w+56|0;w=c[A>>2]|0;if((w|0)>0){B=c[d+(v<<2)>>2]|0;C=y;y=w;w=t;D=0;while(1){if((C|0)>0){E=w;F=(c[B+(D+r<<2)>>2]|0)+(z<<7)|0;G=0;while(1){H=E;E=E+1|0;c[o+(H<<2)>>2]=F;G=G+1|0;I=c[x>>2]|0;if((G|0)>=(I|0)){break}else{F=F+128|0}}J=c[A>>2]|0;K=I;L=E}else{J=y;K=C;L=w}D=D+1|0;if((D|0)>=(J|0)){break}else{C=K;y=J;w=L}}M=c[f>>2]|0;N=L}else{M=u;N=t}v=v+1|0;if((v|0)>=(M|0)){break}else{u=M;t=N}}}t=s+1|0;if((dd[c[(c[l>>2]|0)+4>>2]&511](a,o)|0)<<24>>24==0){break b}if(t>>>0<(c[n>>2]|0)>>>0){s=t}else{break}}O=c[g>>2]|0}else{O=q}c[m>>2]=0;t=r+1|0;if((t|0)<(O|0)){p=0;q=O;r=t}else{break a}}c[k>>2]=r;c[m>>2]=s;P=0;i=b;return P|0}}while(0);s=a+128|0;k=(c[s>>2]|0)+1|0;c[s>>2]=k;if(k>>>0<(c[a+284>>2]|0)>>>0){oia(a);P=3;i=b;return P|0}else{Rc[c[(c[a+400>>2]|0)+12>>2]&1023](a);P=4;i=b;return P|0}return 0}function lia(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;e=i;f=c[b+392>>2]|0;g=b+284|0;h=(c[g>>2]|0)+ -1|0;j=b+124|0;k=b+132|0;l=b+400|0;m=b+128|0;n=b+136|0;while(1){o=c[j>>2]|0;p=c[k>>2]|0;if((o|0)>=(p|0)){if((o|0)!=(p|0)){break}if((c[m>>2]|0)>>>0>(c[n>>2]|0)>>>0){break}}if((Lc[c[c[l>>2]>>2]&255](b)|0)==0){q=0;r=22;break}}if((r|0)==22){i=e;return q|0}r=b+36|0;l=c[r>>2]|0;if((l|0)>0){m=b+4|0;k=f+72|0;f=b+412|0;j=l;l=0;p=c[b+196>>2]|0;while(1){if((a[p+48>>0]|0)==0){s=j}else{o=p+12|0;t=c[o>>2]|0;u=ca(t,c[n>>2]|0)|0;v=ed[c[(c[m>>2]|0)+32>>2]&127](b,c[k+(l<<2)>>2]|0,u,t,0)|0;if((c[n>>2]|0)>>>0<h>>>0){w=c[o>>2]|0}else{t=c[o>>2]|0;o=((c[p+32>>2]|0)>>>0)%(t>>>0)|0;w=(o|0)==0?t:o}o=c[(c[f>>2]|0)+(l<<2)+4>>2]|0;if((w|0)>0){t=p+28|0;u=p+36|0;x=c[t>>2]|0;y=0;z=c[d+(l<<2)>>2]|0;while(1){if((x|0)==0){A=c[u>>2]|0;B=0}else{C=0;D=c[v+(y<<2)>>2]|0;E=0;while(1){Fc[o&63](b,p,D,z,E);F=c[u>>2]|0;C=C+1|0;G=c[t>>2]|0;if(!(C>>>0<G>>>0)){A=F;B=G;break}else{D=D+128|0;E=F+E|0}}}y=y+1|0;if((y|0)==(w|0)){break}else{x=B;z=z+(A<<2)|0}}}s=c[r>>2]|0}l=l+1|0;if((l|0)>=(s|0)){break}else{j=s;p=p+84|0}}}p=(c[n>>2]|0)+1|0;c[n>>2]=p;q=p>>>0<(c[g>>2]|0)>>>0?3:4;i=e;return q|0}function mia(a){a=a|0;return 0}function nia(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0;e=i;f=c[b+392>>2]|0;g=(c[b+312>>2]|0)+ -1|0;h=b+284|0;j=c[h>>2]|0;k=j+ -1|0;l=f+24|0;m=c[l>>2]|0;n=f+28|0;o=c[n>>2]|0;do{if((m|0)<(o|0)){p=f+20|0;q=f+32|0;r=b+320|0;s=b+408|0;t=b+292|0;u=b+412|0;v=b+128|0;w=c[p>>2]|0;x=o;y=m;a:while(1){if(w>>>0>g>>>0){z=x}else{A=w;while(1){yba(c[q>>2]|0,c[r>>2]<<7);if((dd[c[(c[s>>2]|0)+4>>2]&511](b,q)|0)<<24>>24==0){break a}B=c[t>>2]|0;if((B|0)>0){C=A>>>0<g>>>0;D=B;B=0;E=0;while(1){F=c[b+(E<<2)+296>>2]|0;if((a[F+48>>0]|0)!=0){G=c[F+4>>2]|0;H=c[(c[u>>2]|0)+(G<<2)+4>>2]|0;I=F+52|0;J=c[(C?I:F+68|0)>>2]|0;K=F+36|0;L=ca(c[F+64>>2]|0,A)|0;M=F+56|0;N=c[M>>2]|0;if((N|0)>0){O=c[K>>2]|0;P=ca(O,y)|0;Q=F+72|0;R=(J|0)>0;S=R^1;T=N;N=O;O=B;U=(c[d+(G<<2)>>2]|0)+(P<<2)|0;P=0;while(1){if((c[v>>2]|0)>>>0<k>>>0){if(R){V=L;W=0;X=16}else{Y=T;Z=N}}else{if((P+y|0)>=(c[Q>>2]|0)|S){Y=T;Z=N}else{V=L;W=0;X=16}}if((X|0)==16){while(1){X=0;Fc[H&63](b,F,c[q+(W+O<<2)>>2]|0,U,V);_=c[K>>2]|0;W=W+1|0;if((W|0)==(J|0)){break}else{V=_+V|0;X=16}}Y=c[M>>2]|0;Z=_}$=(c[I>>2]|0)+O|0;G=P+1|0;if((G|0)>=(Y|0)){break}T=Y;N=Z;O=$;U=U+(Z<<2)|0;P=G}aa=c[t>>2]|0;ba=$}else{aa=D;ba=B}}else{aa=D;ba=(c[F+60>>2]|0)+B|0}E=E+1|0;if((E|0)>=(aa|0)){break}else{D=aa;B=ba}}}B=A+1|0;if(B>>>0>g>>>0){break}else{A=B}}z=c[n>>2]|0}c[p>>2]=0;B=y+1|0;if((B|0)<(z|0)){w=0;x=z;y=B}else{X=25;break}}if((X|0)==25){da=v;ea=c[h>>2]|0;break}c[l>>2]=y;c[p>>2]=A;fa=0;i=e;return fa|0}else{da=b+128|0;ea=j}}while(0);j=b+136|0;c[j>>2]=(c[j>>2]|0)+1;j=(c[da>>2]|0)+1|0;c[da>>2]=j;if(j>>>0<ea>>>0){oia(b);fa=3;i=e;return fa|0}else{Rc[c[(c[b+400>>2]|0)+12>>2]&1023](b);fa=4;i=e;return fa|0}return 0}function oia(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+392>>2]|0;do{if((c[a+292>>2]|0)<=1){e=c[a+296>>2]|0;if((c[a+128>>2]|0)>>>0<((c[a+284>>2]|0)+ -1|0)>>>0){c[d+28>>2]=c[e+12>>2];break}else{c[d+28>>2]=c[e+72>>2];break}}else{c[d+28>>2]=1}}while(0);c[d+20>>2]=0;c[d+24>>2]=0;i=b;return}function pia(d,f){d=d|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0;g=i;i=i+128|0;h=g;j=c[d+392>>2]|0;k=d+284|0;l=(c[k>>2]|0)+ -1|0;m=d+124|0;n=d+132|0;o=d+400|0;p=d+364|0;q=d+128|0;r=d+136|0;while(1){s=c[m>>2]|0;t=c[n>>2]|0;if((s|0)>(t|0)){break}u=c[o>>2]|0;if((a[u+17>>0]|0)!=0){break}if((s|0)==(t|0)?(c[q>>2]|0)>>>0>((c[r>>2]|0)+((c[p>>2]|0)==0&1)|0)>>>0:0){break}if((Lc[c[u>>2]&255](d)|0)==0){v=0;w=75;break}}if((w|0)==75){i=g;return v|0}w=d+36|0;p=c[w>>2]|0;if((p|0)>0){q=d+4|0;o=j+72|0;n=j+112|0;j=d+412|0;m=h+4|0;u=h+18|0;t=h+32|0;s=h+16|0;x=h+2|0;y=p;p=0;z=c[d+196>>2]|0;while(1){if((a[z+48>>0]|0)==0){A=y}else{B=c[r>>2]|0;if(B>>>0<l>>>0){C=c[z+12>>2]|0;D=C;E=C<<1;F=C;G=0}else{C=c[z+12>>2]|0;H=((c[z+32>>2]|0)>>>0)%(C>>>0)|0;I=(H|0)==0?C:H;D=C;E=I;F=I;G=1}if((B|0)==0){J=ed[c[(c[q>>2]|0)+32>>2]&127](d,c[o+(p<<2)>>2]|0,0,E,0)|0;K=1}else{I=ca(D,B+ -1|0)|0;B=ed[c[(c[q>>2]|0)+32>>2]&127](d,c[o+(p<<2)>>2]|0,I,D+E|0,0)|0;J=B+(c[z+12>>2]<<2)|0;K=0}B=c[n>>2]|0;I=p*6|0;C=c[z+76>>2]|0;H=e[C>>1]|0;L=e[C+2>>1]|0;M=e[C+16>>1]|0;N=e[C+32>>1]|0;O=e[C+18>>1]|0;P=e[C+4>>1]|0;C=c[(c[j>>2]|0)+(p<<2)+4>>2]|0;if((F|0)>0){Q=(K|0)!=0;R=(G|0)!=0;S=z+28|0;T=B+((I|1)<<2)|0;U=B+(I+2<<2)|0;V=B+(I+3<<2)|0;W=B+(I+4<<2)|0;X=B+(I+5<<2)|0;I=z+36|0;B=H*9|0;Y=P<<7;Z=P<<8;P=H*5|0;_=O<<7;$=O<<8;O=N<<7;aa=N<<8;N=H*36|0;H=M<<7;ba=M<<8;M=L<<7;da=L<<8;L=F+ -1|0;ea=0;fa=c[f+(p<<2)>>2]|0;while(1){ga=c[J+(ea<<2)>>2]|0;if(Q&(ea|0)==0){ha=ga}else{ha=c[J+(ea+ -1<<2)>>2]|0}if(R&(ea|0)==(L|0)){ia=ga}else{ia=c[J+(ea+1<<2)>>2]|0}ja=b[ha>>1]|0;ka=b[ga>>1]|0;la=b[ia>>1]|0;ma=(c[S>>2]|0)+ -1|0;na=ja;oa=ja;ja=ka;pa=ka;ka=la;qa=la;la=0;ra=ga;ga=ia;sa=0;ta=ha;while(1){xba(ra,h);if(la>>>0<ma>>>0){ua=b[ta+128>>1]|0;va=b[ra+128>>1]|0;wa=b[ga+128>>1]|0}else{ua=oa;va=pa;wa=qa}xa=c[T>>2]|0;if((xa|0)!=0?(b[x>>1]|0)==0:0){ya=ca(N,ja-va|0)|0;if((ya|0)>-1){za=(ya+M|0)/(da|0)|0;if((xa|0)>0){Aa=1<<xa;Ba=(za|0)<(Aa|0)?za:Aa+ -1|0}else{Ba=za}}else{za=(M-ya|0)/(da|0)|0;if((xa|0)>0){ya=1<<xa;Ca=(za|0)<(ya|0)?za:ya+ -1|0}else{Ca=za}Ba=0-Ca|0}b[x>>1]=Ba}za=c[U>>2]|0;if((za|0)!=0?(b[s>>1]|0)==0:0){ya=ca(N,oa-qa|0)|0;do{if((ya|0)>-1){xa=(ya+H|0)/(ba|0)|0;if((za|0)<=0){Da=xa;break}Aa=1<<za;Da=(xa|0)<(Aa|0)?xa:Aa+ -1|0}else{Aa=(H-ya|0)/(ba|0)|0;if((za|0)>0){xa=1<<za;Ea=(Aa|0)<(xa|0)?Aa:xa+ -1|0}else{Ea=Aa}Da=0-Ea|0}}while(0);b[s>>1]=Da}za=c[V>>2]|0;if((za|0)!=0?(b[t>>1]|0)==0:0){ya=ca(B,oa-(pa<<1)+qa|0)|0;do{if((ya|0)>-1){Aa=(ya+O|0)/(aa|0)|0;if((za|0)<=0){Fa=Aa;break}xa=1<<za;Fa=(Aa|0)<(xa|0)?Aa:xa+ -1|0}else{xa=(O-ya|0)/(aa|0)|0;if((za|0)>0){Aa=1<<za;Ga=(xa|0)<(Aa|0)?xa:Aa+ -1|0}else{Ga=xa}Fa=0-Ga|0}}while(0);b[t>>1]=Fa}za=c[W>>2]|0;if((za|0)!=0?(b[u>>1]|0)==0:0){ya=ca(P,na-ka-ua+wa|0)|0;do{if((ya|0)>-1){xa=(ya+_|0)/($|0)|0;if((za|0)<=0){Ha=xa;break}Aa=1<<za;Ha=(xa|0)<(Aa|0)?xa:Aa+ -1|0}else{Aa=(_-ya|0)/($|0)|0;if((za|0)>0){xa=1<<za;Ia=(Aa|0)<(xa|0)?Aa:xa+ -1|0}else{Ia=Aa}Ha=0-Ia|0}}while(0);b[u>>1]=Ha}za=c[X>>2]|0;do{if((za|0)!=0){if((b[m>>1]|0)!=0){break}ya=ca(B,ja-(pa<<1)+va|0)|0;do{if((ya|0)>-1){Aa=(ya+Y|0)/(Z|0)|0;if((za|0)<=0){Ja=Aa;break}xa=1<<za;Ja=(Aa|0)<(xa|0)?Aa:xa+ -1|0}else{xa=(Y-ya|0)/(Z|0)|0;if((za|0)>0){Aa=1<<za;Ka=(xa|0)<(Aa|0)?xa:Aa+ -1|0}else{Ka=xa}Ja=0-Ka|0}}while(0);b[m>>1]=Ja}}while(0);Fc[C&63](d,z,h,fa,sa);La=c[I>>2]|0;la=la+1|0;if(la>>>0>ma>>>0){break}else{za=qa;ya=pa;xa=oa;oa=ua;pa=va;qa=wa;ra=ra+128|0;ga=ga+128|0;sa=La+sa|0;ta=ta+128|0;ka=za;ja=ya;na=xa}}ea=ea+1|0;if((ea|0)==(F|0)){break}else{fa=fa+(La<<2)|0}}}A=c[w>>2]|0}p=p+1|0;if((p|0)>=(A|0)){break}else{y=A;z=z+84|0}}}z=(c[r>>2]|0)+1|0;c[r>>2]=z;v=z>>>0<(c[k>>2]|0)>>>0?3:4;i=g;return v|0}function qia(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=Qc[c[c[b+4>>2]>>2]&255](b,1,24)|0;c[b+420>>2]=e;c[e>>2]=566;f=b+40|0;switch(c[f>>2]|0){case 5:case 4:{if((c[b+36>>2]|0)!=4){c[(c[b>>2]|0)+20>>2]=10;Rc[c[c[b>>2]>>2]&1023](b)}break};case 3:case 2:{if((c[b+36>>2]|0)!=3){c[(c[b>>2]|0)+20>>2]=10;Rc[c[c[b>>2]>>2]&1023](b)}break};case 1:{if((c[b+36>>2]|0)!=1){c[(c[b>>2]|0)+20>>2]=10;Rc[c[c[b>>2]>>2]&1023](b)}break};default:{if((c[b+36>>2]|0)<1){c[(c[b>>2]|0)+20>>2]=10;Rc[c[c[b>>2]>>2]&1023](b)}}}g=c[b+44>>2]|0;do{if((g|0)==4){c[b+100>>2]=4;h=c[f>>2]|0;if((h|0)==4){c[e+4>>2]=38;break}else if((h|0)==5){c[e+4>>2]=39;uia(b);break}else{c[(c[b>>2]|0)+20>>2]=27;Rc[c[c[b>>2]>>2]&1023](b);break}}else if((g|0)==1){c[b+100>>2]=1;h=c[f>>2]|0;if(!((h|0)==3|(h|0)==1)){c[(c[b>>2]|0)+20>>2]=27;Rc[c[c[b>>2]>>2]&1023](b);break}c[e+4>>2]=35;h=b+36|0;if((c[h>>2]|0)>1){j=b+196|0;k=1;do{a[(c[j>>2]|0)+(k*84|0)+48>>0]=0;k=k+1|0}while((k|0)<(c[h>>2]|0))}}else if((g|0)==2){c[b+100>>2]=3;h=c[f>>2]|0;if((h|0)==2){c[e+4>>2]=38;break}else if((h|0)==1){c[e+4>>2]=37;break}else if((h|0)==3){c[e+4>>2]=36;uia(b);break}else{c[(c[b>>2]|0)+20>>2]=27;Rc[c[c[b>>2]>>2]&1023](b);break}}else{if((g|0)==(c[f>>2]|0)){c[b+100>>2]=c[b+36>>2];c[e+4>>2]=38;break}else{c[(c[b>>2]|0)+20>>2]=27;Rc[c[c[b>>2]>>2]&1023](b);break}}}while(0);if((a[b+74>>0]|0)==0){c[b+104>>2]=c[b+100>>2];i=d;return}else{c[b+104>>2]=1;i=d;return}}function ria(a){a=a|0;return}function sia(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=i;wba(c[b>>2]|0,d,e,0,f,c[a+92>>2]|0);i=g;return}function tia(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;j=i;k=c[b+420>>2]|0;l=c[b+92>>2]|0;m=c[b+288>>2]|0;b=c[k+8>>2]|0;n=c[k+12>>2]|0;o=c[k+16>>2]|0;p=c[k+20>>2]|0;if((h|0)<=0){i=j;return}k=e+4|0;q=e+8|0;r=(l|0)==0;s=g;g=f;f=h;do{f=f+ -1|0;h=c[(c[e>>2]|0)+(g<<2)>>2]|0;t=c[(c[k>>2]|0)+(g<<2)>>2]|0;u=c[(c[q>>2]|0)+(g<<2)>>2]|0;g=g+1|0;if(!r){v=0;w=c[s>>2]|0;while(1){x=d[h+v>>0]|0;y=d[t+v>>0]|0;z=d[u+v>>0]|0;a[w>>0]=a[m+((c[b+(z<<2)>>2]|0)+x)>>0]|0;a[w+1>>0]=a[m+(((c[o+(z<<2)>>2]|0)+(c[p+(y<<2)>>2]|0)>>16)+x)>>0]|0;a[w+2>>0]=a[m+((c[n+(y<<2)>>2]|0)+x)>>0]|0;v=v+1|0;if((v|0)==(l|0)){break}else{w=w+3|0}}}s=s+4|0}while((f|0)>0);i=j;return}function uia(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;d=c[a+420>>2]|0;e=a+4|0;f=d+8|0;c[f>>2]=Qc[c[c[e>>2]>>2]&255](a,1,1024)|0;g=d+12|0;c[g>>2]=Qc[c[c[e>>2]>>2]&255](a,1,1024)|0;h=d+16|0;c[h>>2]=Qc[c[c[e>>2]>>2]&255](a,1,1024)|0;j=d+20|0;c[j>>2]=Qc[c[c[e>>2]>>2]&255](a,1,1024)|0;a=0;e=-128;while(1){c[(c[f>>2]|0)+(a<<2)>>2]=(e*91881|0)+32768>>16;c[(c[g>>2]|0)+(a<<2)>>2]=(e*116130|0)+32768>>16;d=ca(e,-46802)|0;c[(c[h>>2]|0)+(a<<2)>>2]=d;d=(ca(e,-22554)|0)+32768|0;c[(c[j>>2]|0)+(a<<2)>>2]=d;a=a+1|0;if((a|0)==256){break}else{e=e+1|0}}i=b;return}function via(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0;h=i;j=c[b+92>>2]|0;if((g|0)<=0){i=h;return}b=(j|0)==0;k=f;f=e;e=g;do{e=e+ -1|0;g=c[(c[d>>2]|0)+(f<<2)>>2]|0;f=f+1|0;if(!b){l=0;m=c[k>>2]|0;while(1){n=a[g+l>>0]|0;a[m+2>>0]=n;a[m+1>>0]=n;a[m>>0]=n;l=l+1|0;if((l|0)==(j|0)){break}else{m=m+3|0}}}k=k+4|0}while((e|0)>0);i=h;return}function wia(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;h=i;j=c[b+36>>2]|0;k=c[b+92>>2]|0;if((g|0)<=0){i=h;return}b=(j|0)>0;l=(k|0)==0;m=e;e=f;f=g;while(1){f=f+ -1|0;if(b){g=0;do{if(!l){n=k;o=c[(c[d+(g<<2)>>2]|0)+(m<<2)>>2]|0;p=(c[e>>2]|0)+g|0;while(1){a[p>>0]=a[o>>0]|0;n=n+ -1|0;if((n|0)==0){break}else{o=o+1|0;p=p+j|0}}}g=g+1|0}while((g|0)!=(j|0))}if((f|0)<=0){break}else{m=m+1|0;e=e+4|0}}i=h;return}function xia(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;j=i;k=c[b+420>>2]|0;l=c[b+92>>2]|0;m=c[b+288>>2]|0;b=c[k+8>>2]|0;n=c[k+12>>2]|0;o=c[k+16>>2]|0;p=c[k+20>>2]|0;if((h|0)<=0){i=j;return}k=e+4|0;q=e+8|0;r=e+12|0;s=(l|0)==0;t=g;g=f;f=h;do{f=f+ -1|0;h=c[(c[e>>2]|0)+(g<<2)>>2]|0;u=c[(c[k>>2]|0)+(g<<2)>>2]|0;v=c[(c[q>>2]|0)+(g<<2)>>2]|0;w=c[(c[r>>2]|0)+(g<<2)>>2]|0;g=g+1|0;if(!s){x=0;y=c[t>>2]|0;while(1){z=d[u+x>>0]|0;A=d[v+x>>0]|0;B=(d[h+x>>0]|0)^255;a[y>>0]=a[m+(B-(c[b+(A<<2)>>2]|0))>>0]|0;a[y+1>>0]=a[m+(B-((c[o+(A<<2)>>2]|0)+(c[p+(z<<2)>>2]|0)>>16))>>0]|0;a[y+2>>0]=a[m+(B-(c[n+(z<<2)>>2]|0))>>0]|0;a[y+3>>0]=a[w+x>>0]|0;x=x+1|0;if((x|0)==(l|0)){break}else{y=y+4|0}}}t=t+4|0}while((f|0)>0);i=j;return}function yia(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;d=a+4|0;e=Qc[c[c[d>>2]>>2]&255](a,1,84)|0;c[a+412>>2]=e;c[e>>2]=567;f=a+36|0;if((c[f>>2]|0)<=0){i=b;return}g=e+44|0;e=0;h=c[a+196>>2]|0;while(1){j=Qc[c[c[d>>2]>>2]&255](a,1,256)|0;c[h+80>>2]=j;f3a(j|0,0,256)|0;c[g+(e<<2)>>2]=-1;e=e+1|0;if((e|0)>=(c[f>>2]|0)){break}else{h=h+84|0}}i=b;return}function zia(d){d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=i;g=c[d+412>>2]|0;h=d+36|0;if((c[h>>2]|0)<=0){i=f;return}j=g+44|0;k=d+68|0;l=0;m=c[d+196>>2]|0;n=0;o=0;while(1){p=m+36|0;q=c[p>>2]|0;do{if((q|0)==4){r=0;s=42}else if((q|0)==2){r=0;s=41}else if((q|0)==1){r=0;s=40}else if((q|0)==8){t=c[k>>2]|0;if((t|0)==1){r=1;s=44;break}else if((t|0)==0){r=0;s=43;break}else{c[(c[d>>2]|0)+20>>2]=48;Rc[c[c[d>>2]>>2]&1023](d);r=n;s=o;break}}else{c[(c[d>>2]|0)+20>>2]=7;c[(c[d>>2]|0)+24>>2]=c[p>>2];Rc[c[c[d>>2]>>2]&1023](d);r=n;s=o}}while(0);c[g+(l<<2)+4>>2]=s;do{if(((a[m+48>>0]|0)!=0?(p=j+(l<<2)|0,(c[p>>2]|0)!=(r|0)):0)?(q=c[m+76>>2]|0,(q|0)!=0):0){c[p>>2]=r;if((r|0)==0){p=c[m+80>>2]|0;t=0;do{c[p+(t<<2)>>2]=e[q+(t<<1)>>1]|0;t=t+1|0}while((t|0)!=64)}else if((r|0)==1){t=c[m+80>>2]|0;p=0;do{c[t+(p<<2)>>2]=(ca(b[742448+(p<<1)>>1]|0,e[q+(p<<1)>>1]|0)|0)+2048>>12;p=p+1|0}while((p|0)!=64)}else{c[(c[d>>2]|0)+20>>2]=48;Rc[c[c[d>>2]>>2]&1023](d);break}}}while(0);l=l+1|0;if((l|0)>=(c[h>>2]|0)){break}else{m=m+84|0;n=r;o=s}}i=f;return}function Aia(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;h=i;i=i+1296|0;j=h+1028|0;k=h;if(f>>>0>3){c[(c[b>>2]|0)+20>>2]=50;c[(c[b>>2]|0)+24>>2]=f;Rc[c[c[b>>2]>>2]&1023](b)}l=e<<24>>24==0;if(l){m=b+(f<<2)+176|0}else{m=b+(f<<2)+160|0}e=c[m>>2]|0;if((e|0)==0){c[(c[b>>2]|0)+20>>2]=50;c[(c[b>>2]|0)+24>>2]=f;Rc[c[c[b>>2]>>2]&1023](b)}f=c[g>>2]|0;if((f|0)==0){m=Qc[c[c[b+4>>2]>>2]&255](b,1,1424)|0;c[g>>2]=m;n=b;o=m}else{n=b;o=f}c[o+140>>2]=e;f=1;m=0;while(1){g=a[e+f>>0]|0;p=g&255;q=p+m|0;if((q|0)>256){c[(c[b>>2]|0)+20>>2]=8;Rc[c[c[b>>2]>>2]&1023](n)}if(g<<24>>24==0){r=m}else{f3a(j+m|0,f&255|0,p|0)|0;r=q}f=f+1|0;if((f|0)==17){break}else{m=r}}a[j+r>>0]=0;m=a[j>>0]|0;if(m<<24>>24==0){s=1;t=0}else{f=m;q=m<<24>>24;m=0;p=0;while(1){if((f<<24>>24|0)==(q|0)){g=m;u=p;while(1){v=u+1|0;c[k+(u<<2)>>2]=g;w=g+1|0;x=a[j+v>>0]|0;if((x<<24>>24|0)==(q|0)){g=w;u=v}else{y=x;z=w;A=v;break}}}else{y=f;z=m;A=p}if((z|0)>=(1<<q|0)){c[(c[b>>2]|0)+20>>2]=8;Rc[c[c[b>>2]>>2]&1023](n)}if(y<<24>>24==0){s=1;t=0;break}else{f=y;q=q+1|0;m=z<<1;p=A}}}while(1){A=e+s|0;if((a[A>>0]|0)==0){c[o+(s<<2)>>2]=-1;B=t}else{c[o+(s<<2)+72>>2]=t-(c[k+(t<<2)>>2]|0);p=(d[A>>0]|0)+t|0;c[o+(s<<2)>>2]=c[k+(p+ -1<<2)>>2];B=p}s=s+1|0;if((s|0)==17){break}else{t=B}}c[o+68>>2]=1048575;f3a(o+144|0,0,1024)|0;B=1;t=0;while(1){s=e+B|0;p=a[s>>0]|0;if(p<<24>>24==0){C=t}else{A=8-B|0;z=1<<A;m=(z|0)>0;q=p;p=1;y=t;while(1){if(m){f=e+y+17|0;j=z;u=c[k+(y<<2)>>2]<<A;while(1){c[o+(u<<2)+144>>2]=B;a[o+u+1168>>0]=a[f>>0]|0;j=j+ -1|0;if((j|0)<=0){break}else{u=u+1|0}}D=a[s>>0]|0}else{D=q}u=y+1|0;if((p|0)<(D&255|0)){q=D;p=p+1|0;y=u}else{C=u;break}}}B=B+1|0;if((B|0)==9){break}else{t=C}}if((r|0)>0&(l^1)){E=0}else{i=h;return}do{if((d[e+E+17>>0]|0)>15){c[(c[b>>2]|0)+20>>2]=8;Rc[c[c[b>>2]>>2]&1023](n)}E=E+1|0}while((E|0)!=(r|0));i=h;return}function Bia(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;g=i;h=c[b>>2]|0;j=b+4|0;k=c[j>>2]|0;l=c[b+16>>2]|0;m=l+380|0;a:do{if((c[m>>2]|0)==0){if((e|0)<25){n=l+24|0;o=d;p=e;q=k;r=h;b:while(1){if((q|0)==0){if((Lc[c[(c[n>>2]|0)+12>>2]&255](l)|0)<<24>>24==0){s=0;t=19;break}u=c[n>>2]|0;v=c[u+4>>2]|0;w=c[u>>2]|0}else{v=q;w=r}u=v+ -1|0;x=w+1|0;y=a[w>>0]|0;z=y&255;if(y<<24>>24==-1){y=u;A=x;while(1){if((y|0)==0){if((Lc[c[(c[n>>2]|0)+12>>2]&255](l)|0)<<24>>24==0){s=0;t=19;break b}B=c[n>>2]|0;C=c[B+4>>2]|0;D=c[B>>2]|0}else{C=y;D=A}E=C+ -1|0;F=D+1|0;G=a[D>>0]|0;if(G<<24>>24==0){H=E;I=255;J=F;break}else if(G<<24>>24==-1){y=E;A=F}else{t=12;break b}}}else{H=u;I=z;J=x}A=I|o<<8;y=p+8|0;if((y|0)<25){o=A;p=y;q=H;r=J}else{K=A;L=y;M=H;N=J;break a}}if((t|0)==12){c[m>>2]=G&255;O=o;P=p;Q=E;R=F;t=14;break}else if((t|0)==19){i=g;return s|0}}else{K=d;L=e;M=k;N=h}}else{O=d;P=e;Q=k;R=h;t=14}}while(0);if((t|0)==14){if((P|0)<(f|0)){f=l+408|0;if((a[(c[f>>2]|0)+8>>0]|0)==0){c[(c[l>>2]|0)+20>>2]=117;Ic[c[(c[l>>2]|0)+4>>2]&511](l,-1);a[(c[f>>2]|0)+8>>0]=1}K=O<<25-P;L=25;M=Q;N=R}else{K=O;L=P;M=Q;N=R}}c[b>>2]=N;c[j>>2]=M;c[b+8>>2]=K;c[b+12>>2]=L;s=1;i=g;return s|0}function Cia(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;h=i;do{if((e|0)<(g|0)){if((Bia(a,b,e,g)|0)<<24>>24==0){j=-1;i=h;return j|0}else{k=a+8|0;l=a+12|0;m=c[k>>2]|0;n=c[l>>2]|0;o=l;p=k;break}}else{m=b;n=e;o=a+12|0;p=a+8|0}}while(0);e=n-g|0;n=m>>e&(1<<g)+ -1;a:do{if((n|0)>(c[f+(g<<2)>>2]|0)){b=m;k=e;l=n;q=g;while(1){r=l<<1;if((k|0)<1){if((Bia(a,b,k,1)|0)<<24>>24==0){j=-1;break}s=c[p>>2]|0;t=c[o>>2]|0}else{s=b;t=k}u=t+ -1|0;v=s>>>u&1|r;r=q+1|0;if((v|0)>(c[f+(r<<2)>>2]|0)){b=s;k=u;l=v;q=r}else{w=s;x=u;y=v;z=r;break a}}i=h;return j|0}else{w=m;x=e;y=n;z=g}}while(0);c[p>>2]=w;c[o>>2]=x;if((z|0)>16){x=a+16|0;c[(c[c[x>>2]>>2]|0)+20>>2]=118;a=c[x>>2]|0;Ic[c[(c[a>>2]|0)+4>>2]&511](a,-1);j=0;i=h;return j|0}else{j=d[(c[f+140>>2]|0)+((c[f+(z<<2)+72>>2]|0)+y)+17>>0]|0;i=h;return j|0}return 0}function Dia(a){a=a|0;var b=0,d=0;b=i;d=Qc[c[c[a+4>>2]>>2]&255](a,1,172)|0;c[a+408>>2]=d;c[d>>2]=568;c[d+4>>2]=277;a=d+40|0;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;c[a+24>>2]=0;c[a+28>>2]=0;i=b;return}function Eia(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=i;e=c[b+408>>2]|0;if(!((((c[b+364>>2]|0)==0?(c[b+368>>2]|0)==63:0)?(c[b+372>>2]|0)==0:0)?(c[b+376>>2]|0)==0:0)){c[(c[b>>2]|0)+20>>2]=122;Ic[c[(c[b>>2]|0)+4>>2]&511](b,-1)}f=b+292|0;if((c[f>>2]|0)>0){g=e+40|0;h=e+56|0;j=e+20|0;k=0;do{l=c[b+(k<<2)+296>>2]|0;m=c[l+20>>2]|0;n=c[l+24>>2]|0;Aia(b,1,m,g+(m<<2)|0);Aia(b,0,n,h+(n<<2)|0);c[j+(k<<2)>>2]=0;k=k+1|0}while((k|0)<(c[f>>2]|0))}f=b+320|0;if((c[f>>2]|0)<=0){o=e+16|0;c[o>>2]=0;p=e+12|0;c[p>>2]=0;q=e+8|0;a[q>>0]=0;r=b+252|0;s=c[r>>2]|0;t=e+36|0;u=s;c[t>>2]=u;i=d;return}k=e+40|0;j=e+72|0;h=e+56|0;g=e+112|0;n=e+152|0;m=0;do{l=c[b+(c[b+(m<<2)+324>>2]<<2)+296>>2]|0;c[j+(m<<2)>>2]=c[k+(c[l+20>>2]<<2)>>2];c[g+(m<<2)>>2]=c[h+(c[l+24>>2]<<2)>>2];if((a[l+48>>0]|0)==0){a[e+m+162>>0]=0;a[n+m>>0]=0}else{a[n+m>>0]=1;a[e+m+162>>0]=(c[l+36>>2]|0)>1&1}m=m+1|0}while((m|0)<(c[f>>2]|0));o=e+16|0;c[o>>2]=0;p=e+12|0;c[p>>2]=0;q=e+8|0;a[q>>0]=0;r=b+252|0;s=c[r>>2]|0;t=e+36|0;u=s;c[t>>2]=u;i=d;return}function Fia(e,f){e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0;g=i;i=i+48|0;h=g+16|0;j=g;k=c[e+408>>2]|0;l=e+252|0;if((c[l>>2]|0)!=0?(c[k+36>>2]|0)==0:0){m=k+16|0;n=e+404|0;o=(c[n>>2]|0)+20|0;c[o>>2]=(c[o>>2]|0)+((c[m>>2]|0)/8|0);c[m>>2]=0;if((Lc[c[(c[n>>2]|0)+8>>2]&255](e)|0)<<24>>24==0){p=0;i=g;return p|0}n=e+292|0;if((c[n>>2]|0)>0){m=k+20|0;o=0;do{c[m+(o<<2)>>2]=0;o=o+1|0}while((o|0)<(c[n>>2]|0))}c[k+36>>2]=c[l>>2];if((c[e+380>>2]|0)==0){a[k+8>>0]=0}}if((a[k+8>>0]|0)==0){c[h+16>>2]=e;l=e+24|0;n=c[l>>2]|0;o=c[n>>2]|0;c[h>>2]=o;m=c[n+4>>2]|0;q=h+4|0;c[q>>2]=m;r=k+12|0;s=c[r>>2]|0;t=k+16|0;u=c[t>>2]|0;v=k+20|0;c[j+0>>2]=c[v+0>>2];c[j+4>>2]=c[v+4>>2];c[j+8>>2]=c[v+8>>2];c[j+12>>2]=c[v+12>>2];w=e+320|0;do{if((c[w>>2]|0)>0){x=k+72|0;y=k+112|0;z=h+8|0;A=h+12|0;B=k+152|0;C=u;D=0;E=s;a:while(1){F=c[f+(D<<2)>>2]|0;G=c[x+(D<<2)>>2]|0;H=c[y+(D<<2)>>2]|0;if((C|0)<8){if((Bia(h,E,C,0)|0)<<24>>24==0){p=0;I=63;break}J=c[z>>2]|0;K=c[A>>2]|0;if((K|0)<8){L=K;M=J;N=1;I=17}else{O=K;P=J;I=15}}else{O=C;P=E;I=15}if((I|0)==15){I=0;J=P>>O+ -8&255;K=c[G+(J<<2)+144>>2]|0;if((K|0)==0){L=O;M=P;N=9;I=17}else{Q=O-K|0;R=P;S=d[G+J+1168>>0]|0}}if((I|0)==17){I=0;J=Cia(h,M,L,G,N)|0;if((J|0)<0){p=0;I=63;break}Q=c[A>>2]|0;R=c[z>>2]|0;S=J}if((S|0)!=0){if((Q|0)<(S|0)){if((Bia(h,R,Q,S)|0)<<24>>24==0){p=0;I=63;break}T=c[A>>2]|0;U=c[z>>2]|0}else{T=Q;U=R}J=T-S|0;G=U>>J&(1<<S)+ -1;if((G|0)<(c[742576+(S<<2)>>2]|0)){V=J;W=U;X=(c[742640+(S<<2)>>2]|0)+G|0}else{V=J;W=U;X=G}}else{V=Q;W=R;X=0}if((a[B+D>>0]|0)!=0){G=j+(c[e+(D<<2)+324>>2]<<2)|0;J=(c[G>>2]|0)+X|0;c[G>>2]=J;b[F>>1]=J}b:do{if((a[k+D+162>>0]|0)==0){J=V;G=W;K=1;while(1){if((J|0)<8){if((Bia(h,G,J,0)|0)<<24>>24==0){p=0;I=63;break a}Y=c[z>>2]|0;Z=c[A>>2]|0;if((Z|0)<8){_=Z;$=Y;aa=1;I=50}else{ba=Z;ca=Y;I=48}}else{ba=J;ca=G;I=48}if((I|0)==48){I=0;Y=ca>>ba+ -8&255;Z=c[H+(Y<<2)+144>>2]|0;if((Z|0)==0){_=ba;$=ca;aa=9;I=50}else{da=ba-Z|0;ea=ca;fa=d[H+Y+1168>>0]|0}}if((I|0)==50){I=0;Y=Cia(h,$,_,H,aa)|0;if((Y|0)<0){p=0;I=63;break a}da=c[A>>2]|0;ea=c[z>>2]|0;fa=Y}Y=fa>>4;Z=fa&15;if((Z|0)==0){if((Y|0)==15){ga=15;ha=da;ia=ea}else{ja=da;ka=ea;break b}}else{if((da|0)<(Z|0)){if((Bia(h,ea,da,Z)|0)<<24>>24==0){p=0;I=63;break a}la=c[A>>2]|0;ma=c[z>>2]|0}else{la=da;ma=ea}ga=Y;ha=la-Z|0;ia=ma}K=K+1+ga|0;if((K|0)>=64){ja=ha;ka=ia;break}else{J=ha;G=ia}}}else{G=V;J=W;K=1;while(1){if((G|0)<8){if((Bia(h,J,G,0)|0)<<24>>24==0){p=0;I=63;break a}Z=c[z>>2]|0;Y=c[A>>2]|0;if((Y|0)<8){na=Y;oa=Z;pa=1;I=33}else{qa=Y;ra=Z;I=31}}else{qa=G;ra=J;I=31}if((I|0)==31){I=0;Z=ra>>qa+ -8&255;Y=c[H+(Z<<2)+144>>2]|0;if((Y|0)==0){na=qa;oa=ra;pa=9;I=33}else{sa=qa-Y|0;ta=ra;ua=d[H+Z+1168>>0]|0}}if((I|0)==33){I=0;Z=Cia(h,oa,na,H,pa)|0;if((Z|0)<0){p=0;I=63;break a}sa=c[A>>2]|0;ta=c[z>>2]|0;ua=Z}Z=ua>>4;Y=ua&15;if((Y|0)==0){if((Z|0)!=15){ja=sa;ka=ta;break b}va=sa;wa=ta;xa=K+15|0}else{ya=Z+K|0;if((sa|0)<(Y|0)){if((Bia(h,ta,sa,Y)|0)<<24>>24==0){p=0;I=63;break a}za=c[A>>2]|0;Aa=c[z>>2]|0}else{za=sa;Aa=ta}Z=za-Y|0;Ba=Aa>>Z&(1<<Y)+ -1;if((Ba|0)<(c[742576+(Y<<2)>>2]|0)){Ca=(c[742640+(Y<<2)>>2]|0)+Ba|0}else{Ca=Ba}b[F+(c[726928+(ya<<2)>>2]<<1)>>1]=Ca;va=Z;wa=Aa;xa=ya}K=xa+1|0;if((K|0)>=64){ja=va;ka=wa;break}else{G=va;J=wa}}}}while(0);D=D+1|0;if((D|0)>=(c[w>>2]|0)){I=60;break}else{C=ja;E=ka}}if((I|0)==60){Da=c[h>>2]|0;Ea=c[l>>2]|0;Fa=c[q>>2]|0;Ga=ja;Ha=ka;break}else if((I|0)==63){i=g;return p|0}}else{Da=o;Ea=n;Fa=m;Ga=u;Ha=s}}while(0);c[Ea>>2]=Da;c[(c[l>>2]|0)+4>>2]=Fa;c[r>>2]=Ha;c[t>>2]=Ga;c[v+0>>2]=c[j+0>>2];c[v+4>>2]=c[j+4>>2];c[v+8>>2]=c[j+8>>2];c[v+12>>2]=c[j+12>>2]}j=k+36|0;c[j>>2]=(c[j>>2]|0)+ -1;p=1;i=g;return p|0}function Gia(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;e=i;f=b+4|0;g=Qc[c[c[f>>2]>>2]&255](b,1,80)|0;h=b+388|0;c[h>>2]=g;c[g>>2]=332;if(!(d<<24>>24==0)){c[(c[b>>2]|0)+20>>2]=4;Rc[c[c[b>>2]>>2]&1023](b)}d=b+280|0;j=c[d>>2]|0;if((a[(c[b+416>>2]|0)+8>>0]|0)==0){k=c[b+36>>2]|0;l=j;m=j}else{if((j|0)<2){c[(c[b>>2]|0)+20>>2]=47;Rc[c[c[b>>2]>>2]&1023](b);n=c[d>>2]|0}else{n=j}j=c[h>>2]|0;h=b+36|0;o=Qc[c[c[f>>2]>>2]&255](b,1,c[h>>2]<<3)|0;p=j+56|0;c[p>>2]=o;q=j+60|0;c[q>>2]=o+(c[h>>2]<<2);o=c[h>>2]|0;if((o|0)>0){j=n+4|0;n=0;r=c[b+196>>2]|0;while(1){s=ca(c[r+36>>2]|0,c[r+12>>2]|0)|0;t=(s|0)/(c[d>>2]|0)|0;s=ca(t,j)|0;u=Qc[c[c[f>>2]>>2]&255](b,1,s<<3)|0;c[(c[p>>2]|0)+(n<<2)>>2]=u+(t<<2);c[(c[q>>2]|0)+(n<<2)>>2]=u+(s+t<<2);n=n+1|0;t=c[h>>2]|0;if((n|0)>=(t|0)){v=t;break}else{r=r+84|0}}}else{v=o}o=c[d>>2]|0;k=v;l=o;m=o+2|0}o=b+36|0;if((k|0)<=0){i=e;return}k=g+8|0;g=l;l=0;v=c[b+196>>2]|0;while(1){r=c[v+36>>2]|0;n=(ca(r,c[v+12>>2]|0)|0)/(g|0)|0;h=ca(c[v+28>>2]|0,r)|0;r=ca(n,m)|0;c[k+(l<<2)>>2]=id[c[(c[f>>2]|0)+8>>2]&511](b,1,h,r)|0;r=l+1|0;if((r|0)>=(c[o>>2]|0)){break}g=c[d>>2]|0;l=r;v=v+84|0}i=e;return}function Hia(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;e=i;f=b+388|0;g=c[f>>2]|0;if((d|0)!=0){c[(c[b>>2]|0)+20>>2]=4;Rc[c[c[b>>2]>>2]&1023](b);i=e;return}d=g+4|0;if((a[(c[b+416>>2]|0)+8>>0]|0)==0){c[d>>2]=64}else{c[d>>2]=63;d=c[f>>2]|0;f=b+280|0;h=c[f>>2]|0;j=b+36|0;a:do{if((c[j>>2]|0)>0){k=d+56|0;l=d+60|0;m=d+8|0;n=h+2|0;o=h+ -2|0;p=h;q=0;r=c[b+196>>2]|0;while(1){s=(ca(c[r+36>>2]|0,c[r+12>>2]|0)|0)/(p|0)|0;t=c[(c[k>>2]|0)+(q<<2)>>2]|0;u=c[(c[l>>2]|0)+(q<<2)>>2]|0;v=c[m+(q<<2)>>2]|0;w=ca(s,n)|0;if((w|0)>0){x=0;do{y=c[v+(x<<2)>>2]|0;c[u+(x<<2)>>2]=y;c[t+(x<<2)>>2]=y;x=x+1|0}while((x|0)!=(w|0))}w=s<<1;if((s|0)>0){x=ca(s,h)|0;y=ca(s,o)|0;z=0;do{A=z+x|0;B=z+y|0;c[u+(B<<2)>>2]=c[v+(A<<2)>>2];c[u+(A<<2)>>2]=c[v+(B<<2)>>2];z=z+1|0}while((z|0)<(w|0));C=0;do{c[t+(C-s<<2)>>2]=c[t>>2];C=C+1|0}while((C|0)!=(s|0))}s=q+1|0;if((s|0)>=(c[j>>2]|0)){break a}p=c[f>>2]|0;q=s;r=r+84|0}}}while(0);c[g+64>>2]=0;c[g+68>>2]=0;c[g+76>>2]=0}a[g+48>>0]=0;c[g+52>>2]=0;i=e;return}function Iia(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;g=i;h=b+388|0;j=c[h>>2]|0;k=j+48|0;do{if((a[k>>0]|0)==0){if((dd[c[(c[b+392>>2]|0)+12>>2]&511](b,c[j+56+(c[j+64>>2]<<2)>>2]|0)|0)==0){i=g;return}else{a[k>>0]=1;l=j+76|0;c[l>>2]=(c[l>>2]|0)+1;break}}}while(0);l=j+68|0;m=c[l>>2]|0;if((m|0)==1){n=j+52|0}else if((m|0)==2){o=j+52|0;p=j+72|0;ad[c[(c[b+396>>2]|0)+4>>2]&15](b,c[j+56+(c[j+64>>2]<<2)>>2]|0,o,c[p>>2]|0,d,e,f);if((c[o>>2]|0)>>>0<(c[p>>2]|0)>>>0){i=g;return}c[l>>2]=0;if((c[e>>2]|0)>>>0<f>>>0){q=o;r=9}else{i=g;return}}else if((m|0)==0){q=j+52|0;r=9}else{i=g;return}if((r|0)==9){c[q>>2]=0;r=b+280|0;c[j+72>>2]=(c[r>>2]|0)+ -1;a:do{if((c[j+76>>2]|0)==(c[b+284>>2]|0)?(m=c[h>>2]|0,o=b+36|0,(c[o>>2]|0)>0):0){p=m+72|0;s=m+64|0;t=m+56|0;m=0;u=c[b+196>>2]|0;while(1){v=ca(c[u+36>>2]|0,c[u+12>>2]|0)|0;w=(v|0)/(c[r>>2]|0)|0;x=((c[u+44>>2]|0)>>>0)%(v>>>0)|0;y=(x|0)==0?v:x;if((m|0)==0){c[p>>2]=((y+ -1|0)/(w|0)|0)+1}x=c[(c[t+(c[s>>2]<<2)>>2]|0)+(m<<2)>>2]|0;v=w<<1;if((w|0)>0){w=x+(y+ -1<<2)|0;z=0;do{c[x+(z+y<<2)>>2]=c[w>>2];z=z+1|0}while((z|0)<(v|0))}v=m+1|0;if((v|0)>=(c[o>>2]|0)){break a}m=v;u=u+84|0}}}while(0);c[l>>2]=1;n=q}q=j+64|0;r=j+72|0;ad[c[(c[b+396>>2]|0)+4>>2]&15](b,c[j+56+(c[q>>2]<<2)>>2]|0,n,c[r>>2]|0,d,e,f);if((c[n>>2]|0)>>>0<(c[r>>2]|0)>>>0){i=g;return}b:do{if((c[j+76>>2]|0)==1){f=c[h>>2]|0;e=b+280|0;d=c[e>>2]|0;u=b+36|0;m=c[u>>2]|0;if((m|0)>0){o=f+56|0;s=f+60|0;f=d+1|0;t=d+2|0;p=d;d=m;m=0;v=c[b+196>>2]|0;while(1){z=(ca(c[v+36>>2]|0,c[v+12>>2]|0)|0)/(p|0)|0;w=c[(c[o>>2]|0)+(m<<2)>>2]|0;y=c[(c[s>>2]|0)+(m<<2)>>2]|0;if((z|0)>0){x=ca(z,f)|0;A=ca(z,t)|0;B=0;do{C=B+x|0;D=B-z|0;c[w+(D<<2)>>2]=c[w+(C<<2)>>2];c[y+(D<<2)>>2]=c[y+(C<<2)>>2];C=B+A|0;c[w+(C<<2)>>2]=c[w+(B<<2)>>2];c[y+(C<<2)>>2]=c[y+(B<<2)>>2];B=B+1|0}while((B|0)!=(z|0));E=c[u>>2]|0}else{E=d}z=m+1|0;if((z|0)>=(E|0)){F=e;break b}p=c[e>>2]|0;d=E;m=z;v=v+84|0}}else{F=e}}else{F=b+280|0}}while(0);c[q>>2]=c[q>>2]^1;a[k>>0]=0;c[n>>2]=(c[F>>2]|0)+1;c[r>>2]=(c[F>>2]|0)+2;c[l>>2]=2;i=g;return}function Jia(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;h=c[b+388>>2]|0;j=h+48|0;do{if((a[j>>0]|0)==0){k=h+8|0;if((dd[c[(c[b+392>>2]|0)+12>>2]&511](b,k)|0)==0){i=g;return}else{a[j>>0]=1;l=k;break}}else{l=h+8|0}}while(0);k=c[b+280>>2]|0;m=h+52|0;ad[c[(c[b+396>>2]|0)+4>>2]&15](b,l,m,k,d,e,f);if((c[m>>2]|0)>>>0<k>>>0){i=g;return}a[j>>0]=0;c[m>>2]=0;i=g;return}function Kia(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;b=i;d=7;e=a;while(1){f=c[e>>2]|0;g=e+28|0;h=c[g>>2]|0;j=h+f|0;k=f-h|0;h=e+4|0;f=c[h>>2]|0;l=e+24|0;m=c[l>>2]|0;n=m+f|0;o=f-m|0;m=e+8|0;f=c[m>>2]|0;p=e+20|0;q=c[p>>2]|0;r=q+f|0;s=f-q|0;q=e+12|0;f=c[q>>2]|0;t=e+16|0;u=c[t>>2]|0;v=u+f|0;w=v+j|0;x=j-v|0;v=r+n|0;c[e>>2]=w+v;c[t>>2]=w-v;v=(n-r+x|0)*181>>8;c[m>>2]=v+x;c[l>>2]=x-v;v=f-u+s|0;u=o+k|0;f=(v-u|0)*98>>8;x=f+(v*139>>8)|0;v=f+(u*334>>8)|0;u=(s+o|0)*181>>8;o=u+k|0;s=k-u|0;c[p>>2]=x+s;c[q>>2]=s-x;c[h>>2]=v+o;c[g>>2]=o-v;if((d|0)>0){d=d+ -1|0;e=e+32|0}else{y=7;z=a;break}}while(1){a=c[z>>2]|0;e=z+224|0;d=c[e>>2]|0;v=d+a|0;o=a-d|0;d=z+32|0;a=c[d>>2]|0;g=z+192|0;h=c[g>>2]|0;x=h+a|0;s=a-h|0;h=z+64|0;a=c[h>>2]|0;q=z+160|0;p=c[q>>2]|0;u=p+a|0;k=a-p|0;p=z+96|0;a=c[p>>2]|0;f=z+128|0;l=c[f>>2]|0;m=l+a|0;r=m+v|0;n=v-m|0;m=u+x|0;c[z>>2]=r+m;c[f>>2]=r-m;m=(x-u+n|0)*181>>8;c[h>>2]=m+n;c[g>>2]=n-m;m=a-l+k|0;l=s+o|0;a=(m-l|0)*98>>8;n=a+(m*139>>8)|0;m=a+(l*334>>8)|0;l=(k+s|0)*181>>8;s=l+o|0;k=o-l|0;c[q>>2]=n+k;c[p>>2]=k-n;c[d>>2]=m+s;c[e>>2]=s-m;if((y|0)>0){y=y+ -1|0;z=z+4|0}else{break}}i=b;return}function Lia(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;b=i;d=7;e=a;while(1){f=c[e>>2]|0;g=e+28|0;h=c[g>>2]|0;j=h+f|0;k=f-h|0;h=e+4|0;f=c[h>>2]|0;l=e+24|0;m=c[l>>2]|0;n=m+f|0;o=f-m|0;m=e+8|0;f=c[m>>2]|0;p=e+20|0;q=c[p>>2]|0;r=q+f|0;s=f-q|0;q=e+12|0;f=c[q>>2]|0;t=e+16|0;u=c[t>>2]|0;v=u+f|0;w=f-u|0;u=v+j|0;f=j-v|0;v=r+n|0;j=n-r|0;c[e>>2]=u+v<<2;c[t>>2]=u-v<<2;v=(f+j|0)*4433|0;c[m>>2]=(f*6270|0)+1024+v>>11;c[l>>2]=(ca(j,-15137)|0)+1024+v>>11;v=w+o|0;j=s+k|0;l=(v+j|0)*9633|0;f=ca(w+k|0,-7373)|0;m=ca(s+o|0,-20995)|0;u=l+(ca(v,-16069)|0)|0;v=l+(ca(j,-3196)|0)|0;c[g>>2]=(w*2446|0)+1024+f+u>>11;c[p>>2]=(s*16819|0)+1024+m+v>>11;c[q>>2]=(o*25172|0)+1024+m+u>>11;c[h>>2]=(k*12299|0)+1024+f+v>>11;if((d|0)>0){d=d+ -1|0;e=e+32|0}else{x=7;y=a;break}}while(1){a=c[y>>2]|0;e=y+224|0;d=c[e>>2]|0;v=d+a|0;f=a-d|0;d=y+32|0;a=c[d>>2]|0;k=y+192|0;h=c[k>>2]|0;u=h+a|0;m=a-h|0;h=y+64|0;a=c[h>>2]|0;o=y+160|0;q=c[o>>2]|0;s=q+a|0;p=a-q|0;q=y+96|0;a=c[q>>2]|0;w=y+128|0;g=c[w>>2]|0;j=g+a|0;l=a-g|0;g=j+v|0;a=v-j|0;j=s+u|0;v=u-s|0;c[y>>2]=j+2+g>>2;c[w>>2]=2-j+g>>2;g=(a+v|0)*4433|0;c[h>>2]=(a*6270|0)+16384+g>>15;c[k>>2]=(ca(v,-15137)|0)+16384+g>>15;g=l+m|0;v=p+f|0;k=(g+v|0)*9633|0;a=ca(l+f|0,-7373)|0;h=ca(p+m|0,-20995)|0;j=k+(ca(g,-16069)|0)|0;g=k+(ca(v,-3196)|0)|0;c[e>>2]=(l*2446|0)+16384+a+j>>15;c[o>>2]=(p*16819|0)+16384+h+g>>15;c[q>>2]=(m*25172|0)+16384+h+j>>15;c[d>>2]=(f*12299|0)+16384+a+g>>15;if((x|0)>0){x=x+ -1|0;y=y+4|0}else{break}}i=b;return}function Mia(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;j=i;i=i+256|0;k=j;l=c[d+288>>2]|0;d=8;m=f;f=c[e+80>>2]|0;e=k;while(1){n=b[m+16>>1]|0;o=b[m+32>>1]|0;p=b[m+48>>1]|0;if((n|o)<<16>>16==0){if(p<<16>>16==0){if((((b[m+64>>1]|0)==0?(b[m+80>>1]|0)==0:0)?(b[m+96>>1]|0)==0:0)?(b[m+112>>1]|0)==0:0){q=ca(b[m>>1]|0,c[f>>2]|0)|0;c[e>>2]=q;c[e+32>>2]=q;c[e+64>>2]=q;c[e+96>>2]=q;c[e+128>>2]=q;c[e+160>>2]=q;c[e+192>>2]=q;c[e+224>>2]=q}else{r=0;s=0;t=10}}else{r=0;s=p;t=10}}else{r=o;s=p;t=10}if((t|0)==10){t=0;p=ca(b[m>>1]|0,c[f>>2]|0)|0;o=ca(r<<16>>16,c[f+64>>2]|0)|0;q=ca(b[m+64>>1]|0,c[f+128>>2]|0)|0;u=ca(b[m+96>>1]|0,c[f+192>>2]|0)|0;v=q+p|0;w=p-q|0;q=u+o|0;p=((o-u|0)*362>>8)-q|0;u=q+v|0;o=v-q|0;q=p+w|0;v=w-p|0;p=ca(n<<16>>16,c[f+32>>2]|0)|0;n=ca(s<<16>>16,c[f+96>>2]|0)|0;w=ca(b[m+80>>1]|0,c[f+160>>2]|0)|0;x=ca(b[m+112>>1]|0,c[f+224>>2]|0)|0;y=w+n|0;z=w-n|0;n=x+p|0;w=p-x|0;x=n+y|0;p=(w+z|0)*473>>8;A=((ca(z,-669)|0)>>8)-x+p|0;z=((n-y|0)*362>>8)-A|0;y=z+((w*277>>8)-p)|0;c[e>>2]=x+u;c[e+224>>2]=u-x;c[e+32>>2]=A+q;c[e+192>>2]=q-A;c[e+64>>2]=z+v;c[e+160>>2]=v-z;c[e+128>>2]=y+o;c[e+96>>2]=o-y}d=d+ -1|0;if((d|0)<=0){break}else{m=m+2|0;f=f+4|0;e=e+4|0}}e=h+1|0;f=h+2|0;m=h+3|0;d=h+4|0;s=h+5|0;r=h+6|0;y=h+7|0;o=0;z=k;while(1){k=c[g+(o<<2)>>2]|0;v=k+h|0;A=c[z+4>>2]|0;q=c[z+8>>2]|0;x=c[z+12>>2]|0;if((A|q|0)==0){if((x|0)==0){if((((c[z+16>>2]|0)==0?(c[z+20>>2]|0)==0:0)?(c[z+24>>2]|0)==0:0)?(c[z+28>>2]|0)==0:0){u=a[l+(((c[z>>2]|0)>>>5&1023)+128)>>0]|0;a[v>>0]=u;a[k+e>>0]=u;a[k+f>>0]=u;a[k+m>>0]=u;a[k+d>>0]=u;a[k+s>>0]=u;a[k+r>>0]=u;a[k+y>>0]=u}else{B=0;C=0;t=19}}else{B=0;C=x;t=19}}else{B=q;C=x;t=19}if((t|0)==19){t=0;x=c[z>>2]|0;q=c[z+16>>2]|0;u=q+x|0;p=x-q|0;q=c[z+24>>2]|0;x=q+B|0;w=((B-q|0)*362>>8)-x|0;q=x+u|0;n=u-x|0;x=w+p|0;u=p-w|0;w=c[z+20>>2]|0;p=C+w|0;D=w-C|0;w=c[z+28>>2]|0;E=w+A|0;F=A-w|0;w=E+p|0;A=(F+D|0)*473>>8;G=((ca(D,-669)|0)>>8)-w+A|0;D=((E-p|0)*362>>8)-G|0;p=D+((F*277>>8)-A)|0;a[v>>0]=a[l+(((w+q|0)>>>5&1023)+128)>>0]|0;a[k+y>>0]=a[l+(((q-w|0)>>>5&1023)+128)>>0]|0;a[k+e>>0]=a[l+(((G+x|0)>>>5&1023)+128)>>0]|0;a[k+r>>0]=a[l+(((x-G|0)>>>5&1023)+128)>>0]|0;a[k+f>>0]=a[l+(((D+u|0)>>>5&1023)+128)>>0]|0;a[k+s>>0]=a[l+(((u-D|0)>>>5&1023)+128)>>0]|0;a[k+d>>0]=a[l+(((p+n|0)>>>5&1023)+128)>>0]|0;a[k+m>>0]=a[l+(((n-p|0)>>>5&1023)+128)>>0]|0}o=o+1|0;if((o|0)==8){break}else{z=z+32|0}}i=j;return}function Nia(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;j=i;i=i+256|0;k=j;l=c[d+288>>2]|0;d=8;m=f;f=c[e+80>>2]|0;e=k;while(1){n=b[m+16>>1]|0;o=b[m+32>>1]|0;p=b[m+48>>1]|0;if((n|o)<<16>>16==0){if(p<<16>>16==0){if((((b[m+64>>1]|0)==0?(b[m+80>>1]|0)==0:0)?(b[m+96>>1]|0)==0:0)?(b[m+112>>1]|0)==0:0){q=ca(c[f>>2]<<2,b[m>>1]|0)|0;c[e>>2]=q;c[e+32>>2]=q;c[e+64>>2]=q;c[e+96>>2]=q;c[e+128>>2]=q;c[e+160>>2]=q;c[e+192>>2]=q;c[e+224>>2]=q}else{r=0;s=0;t=10}}else{r=0;s=p;t=10}}else{r=o;s=p;t=10}if((t|0)==10){t=0;p=ca(r<<16>>16,c[f+64>>2]|0)|0;o=ca(b[m+96>>1]|0,c[f+192>>2]|0)|0;q=(o+p|0)*4433|0;u=q+(ca(o,-15137)|0)|0;o=q+(p*6270|0)|0;p=ca(b[m>>1]|0,c[f>>2]|0)|0;q=ca(b[m+64>>1]|0,c[f+128>>2]|0)|0;v=q+p<<13;w=p-q<<13;q=ca(b[m+112>>1]|0,c[f+224>>2]|0)|0;p=ca(b[m+80>>1]|0,c[f+160>>2]|0)|0;x=ca(s<<16>>16,c[f+96>>2]|0)|0;y=ca(n<<16>>16,c[f+32>>2]|0)|0;n=x+q|0;z=y+p|0;A=(z+n|0)*9633|0;B=ca(y+q|0,-7373)|0;C=ca(x+p|0,-20995)|0;D=A+(ca(n,-16069)|0)|0;n=A+(ca(z,-3196)|0)|0;z=B+(q*2446|0)+D|0;q=C+(p*16819|0)+n|0;p=C+(x*25172|0)+D|0;D=B+(y*12299|0)+n|0;n=v+o+1024|0;c[e>>2]=n+D>>11;c[e+224>>2]=n-D>>11;D=w+u+1024|0;c[e+32>>2]=D+p>>11;c[e+192>>2]=D-p>>11;p=w-u+1024|0;c[e+64>>2]=p+q>>11;c[e+160>>2]=p-q>>11;q=v-o+1024|0;c[e+96>>2]=q+z>>11;c[e+128>>2]=q-z>>11}d=d+ -1|0;if((d|0)<=0){break}else{m=m+2|0;f=f+4|0;e=e+4|0}}e=h+1|0;f=h+2|0;m=h+3|0;d=h+4|0;s=h+5|0;r=h+6|0;z=h+7|0;q=0;o=k;while(1){k=c[g+(q<<2)>>2]|0;v=k+h|0;p=c[o+4>>2]|0;u=c[o+8>>2]|0;w=c[o+12>>2]|0;if((p|u|0)==0){if((w|0)==0){if((((c[o+16>>2]|0)==0?(c[o+20>>2]|0)==0:0)?(c[o+24>>2]|0)==0:0)?(c[o+28>>2]|0)==0:0){D=a[l+((((c[o>>2]|0)+16|0)>>>5&1023)+128)>>0]|0;a[v>>0]=D;a[k+e>>0]=D;a[k+f>>0]=D;a[k+m>>0]=D;a[k+d>>0]=D;a[k+s>>0]=D;a[k+r>>0]=D;a[k+z>>0]=D}else{E=0;F=0;t=19}}else{E=0;F=w;t=19}}else{E=u;F=w;t=19}if((t|0)==19){t=0;w=c[o+24>>2]|0;u=(w+E|0)*4433|0;D=u+(ca(w,-15137)|0)|0;w=u+(E*6270|0)|0;u=c[o>>2]|0;n=c[o+16>>2]|0;y=n+u<<13;B=u-n<<13;n=c[o+28>>2]|0;u=c[o+20>>2]|0;x=F+n|0;C=p+u|0;A=(C+x|0)*9633|0;G=ca(p+n|0,-7373)|0;H=ca(F+u|0,-20995)|0;I=A+(ca(x,-16069)|0)|0;x=A+(ca(C,-3196)|0)|0;C=G+(n*2446|0)+I|0;n=H+(u*16819|0)+x|0;u=H+(F*25172|0)+I|0;I=G+(p*12299|0)+x|0;x=y+w+131072|0;a[v>>0]=a[l+(((x+I|0)>>>18&1023)+128)>>0]|0;a[k+z>>0]=a[l+(((x-I|0)>>>18&1023)+128)>>0]|0;I=B+D+131072|0;a[k+e>>0]=a[l+(((I+u|0)>>>18&1023)+128)>>0]|0;a[k+r>>0]=a[l+(((I-u|0)>>>18&1023)+128)>>0]|0;u=B-D+131072|0;a[k+f>>0]=a[l+(((u+n|0)>>>18&1023)+128)>>0]|0;a[k+s>>0]=a[l+(((u-n|0)>>>18&1023)+128)>>0]|0;n=y-w+131072|0;a[k+m>>0]=a[l+(((n+C|0)>>>18&1023)+128)>>0]|0;a[k+d>>0]=a[l+(((n-C|0)>>>18&1023)+128)>>0]|0}q=q+1|0;if((q|0)==8){break}else{o=o+32|0}}i=j;return}function Oia(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;j=i;i=i+128|0;k=j;l=c[d+288>>2]|0;d=8;m=f;f=c[e+80>>2]|0;e=k;while(1){if((d|0)!=4){n=b[m+16>>1]|0;o=b[m+32>>1]|0;p=b[m+48>>1]|0;if((n|o)<<16>>16==0){if(p<<16>>16==0){if(((b[m+80>>1]|0)==0?(b[m+96>>1]|0)==0:0)?(b[m+112>>1]|0)==0:0){q=ca(c[f>>2]<<2,b[m>>1]|0)|0;c[e>>2]=q;c[e+32>>2]=q;c[e+64>>2]=q;c[e+96>>2]=q}else{r=0;s=0;t=11}}else{r=0;s=p;t=11}}else{r=o;s=p;t=11}if((t|0)==11){t=0;p=ca(c[f>>2]<<14,b[m>>1]|0)|0;o=(ca(ca(c[f+192>>2]|0,-6270)|0,b[m+96>>1]|0)|0)+(ca((c[f+64>>2]|0)*15137|0,r<<16>>16)|0)|0;q=ca(b[m+112>>1]|0,c[f+224>>2]|0)|0;u=ca(b[m+80>>1]|0,c[f+160>>2]|0)|0;v=ca(s<<16>>16,c[f+96>>2]|0)|0;w=ca(n<<16>>16,c[f+32>>2]|0)|0;n=(u*11893|0)+(ca(q,-1730)|0)+(ca(v,-17799)|0)+(w*8697|0)|0;x=(ca(u,-4926)|0)+(ca(q,-4176)|0)+(v*7373|0)+(w*20995|0)|0;w=o+p+2048|0;c[e>>2]=w+x>>12;c[e+96>>2]=w-x>>12;x=p-o+2048|0;c[e+32>>2]=x+n>>12;c[e+64>>2]=x-n>>12}n=d+ -1|0;if((n|0)>0){y=n}else{break}}else{y=3}d=y;m=m+2|0;f=f+4|0;e=e+4|0}e=h+1|0;f=h+2|0;m=h+3|0;y=0;d=k;while(1){k=c[g+(y<<2)>>2]|0;s=k+h|0;r=c[d+4>>2]|0;n=c[d+8>>2]|0;x=c[d+12>>2]|0;if((r|n|0)==0){if((x|0)==0){if(((c[d+20>>2]|0)==0?(c[d+24>>2]|0)==0:0)?(c[d+28>>2]|0)==0:0){o=a[l+((((c[d>>2]|0)+16|0)>>>5&1023)+128)>>0]|0;a[s>>0]=o;a[k+e>>0]=o;a[k+f>>0]=o;a[k+m>>0]=o}else{z=0;A=0;t=20}}else{z=0;A=x;t=20}}else{z=n*15137|0;A=x;t=20}if((t|0)==20){t=0;x=c[d>>2]<<14;n=(ca(c[d+24>>2]|0,-6270)|0)+z|0;o=c[d+28>>2]|0;p=c[d+20>>2]|0;w=(p*11893|0)+(ca(o,-1730)|0)+(ca(A,-17799)|0)+(r*8697|0)|0;v=(ca(p,-4926)|0)+(ca(o,-4176)|0)+(A*7373|0)+(r*20995|0)|0;r=n+x+262144|0;a[s>>0]=a[l+(((r+v|0)>>>19&1023)+128)>>0]|0;a[k+m>>0]=a[l+(((r-v|0)>>>19&1023)+128)>>0]|0;v=x-n+262144|0;a[k+e>>0]=a[l+(((v+w|0)>>>19&1023)+128)>>0]|0;a[k+f>>0]=a[l+(((v-w|0)>>>19&1023)+128)>>0]|0}y=y+1|0;if((y|0)==4){break}else{d=d+32|0}}i=j;return}function Pia(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;j=i;i=i+64|0;k=j;l=c[d+288>>2]|0;d=8;m=f;f=c[e+80>>2]|0;e=k;while(1){do{if(!((d&-3|0)==4|(d|0)==2)){n=b[m+16>>1]|0;o=b[m+48>>1]|0;p=b[m+80>>1]|0;if((n|o)<<16>>16==0){if(p<<16>>16==0){if((b[m+112>>1]|0)==0){q=ca(c[f>>2]<<2,b[m>>1]|0)|0;c[e>>2]=q;c[e+32>>2]=q;break}else{r=0;s=0}}else{r=p;s=0}}else{r=p;s=o}o=ca(c[f>>2]<<15,b[m>>1]|0)|0;p=ca(ca(c[f+224>>2]|0,-5906)|0,b[m+112>>1]|0)|0;q=(ca((c[f+160>>2]|0)*6967|0,r<<16>>16)|0)+p|0;p=q+(ca(ca(c[f+96>>2]|0,-10426)|0,s<<16>>16)|0)|0;q=p+(ca((c[f+32>>2]|0)*29692|0,n<<16>>16)|0)|0;n=o|4096;c[e>>2]=n+q>>13;c[e+32>>2]=n-q>>13}}while(0);d=d+ -1|0;if((d|0)<=0){break}else{m=m+2|0;f=f+4|0;e=e+4|0}}e=h+1|0;f=0;m=k;while(1){k=c[g+(f<<2)>>2]|0;d=k+h|0;s=c[m+4>>2]|0;r=c[m+12>>2]|0;q=c[m+20>>2]|0;if((s|r|0)==0){if((q|0)==0){if((c[m+28>>2]|0)==0){n=a[l+((((c[m>>2]|0)+16|0)>>>5&1023)+128)>>0]|0;a[d>>0]=n;a[k+e>>0]=n}else{t=0;u=0;v=15}}else{t=q;u=0;v=15}}else{t=q;u=ca(r,-10426)|0;v=15}if((v|0)==15){v=0;r=(t*6967|0)+(ca(c[m+28>>2]|0,-5906)|0)+u+(s*29692|0)|0;s=(c[m>>2]<<15)+524288|0;a[d>>0]=a[l+(((s+r|0)>>>20&1023)+128)>>0]|0;a[k+e>>0]=a[l+(((s-r|0)>>>20&1023)+128)>>0]|0}f=f+1|0;if((f|0)==2){break}else{m=m+32|0}}i=j;return}function Qia(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;i=a[(c[d+288>>2]|0)+((((ca(b[f>>1]|0,c[c[e+80>>2]>>2]|0)|0)+4|0)>>>3&1023)+128)>>0]|0;a[(c[g>>2]|0)+h>>0]=i;return}function Ria(){var a=0,b=0;a=i;b=u2a(20)|0;i=a;return b|0}function Sia(a){a=a|0;var b=0;b=i;if((a|0)!=0){v2a(a)}i=b;return}function Tia(a,b){a=a|0;b=b|0;return b-a|0}function Uia(a,b,d){a=a|0;b=b|0;d=d|0;c[a>>2]=b;c[a+4>>2]=b+d;c[a+8>>2]=b;c[a+12>>2]=0;c[a+16>>2]=0;return}function Via(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;if((b|0)==0){e=0;i=d;return e|0}f=a+16|0;g=a+12|0;h=c[f>>2]|0;j=b+ -1|0;k=0;while(1){if((h|0)==0){Xia(a)|0;l=c[f>>2]|0}else{l=h}h=l+ -1|0;c[f>>2]=h;m=(((c[g>>2]|0)>>>h&1)<<j)+k|0;j=j+ -1|0;if(!(j>>>0<b>>>0)){e=m;break}else{k=m}}i=d;return e|0}function Wia(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+16|0;c[d>>2]=0;if((c[a+12>>2]&255|0)==255){if((Xia(a)|0)==0){e=0}else{c[d>>2]=0;e=1}}else{e=1}i=b;return e|0}function Xia(a){a=a|0;var b=0,e=0,f=0,g=0,h=0,j=0;b=i;e=a+12|0;f=c[e>>2]<<8&65280;c[e>>2]=f;c[a+16>>2]=(f|0)==65280?7:8;g=a+8|0;h=c[g>>2]|0;if(!(h>>>0<(c[a+4>>2]|0)>>>0)){j=0;i=b;return j|0}c[g>>2]=h+1;c[e>>2]=f|(d[h>>0]|0);j=1;i=b;return j|0}function Yia(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;d=i;i=i+32|0;e=d+16|0;f=d;g=c[a+24>>2]|0;h=c[g+8>>2]|0;j=c[g>>2]|0;k=c[g+12>>2]|0;l=c[g+4>>2]|0;m=(c[a+8>>2]|0)-(c[a>>2]|0)|0;n=z2a((bja(g,b)|0)<<2)|0;c[e>>2]=n;if((n|0)==0){o=0;i=d;return o|0}c[f>>2]=n;p=b+ -1|0;if((p|0)==0){q=n}else{n=a+32|0;a=e+8|0;b=f+8|0;r=e+4|0;s=e+12|0;t=f+4|0;u=f+12|0;v=p;p=k-l|0;l=h-j|0;j=g;do{g=c[n>>2]|0;h=j;j=j+136|0;c[a>>2]=l;c[b>>2]=p;k=c[h+144>>2]|0;w=c[j>>2]|0;x=l;l=k-w|0;y=c[h+148>>2]|0;z=h+140|0;h=c[z>>2]|0;A=p;p=y-h|0;c[r>>2]=l-x;c[s>>2]=(c[j>>2]|0)%2|0;B=(y|0)==(h|0);if(B){C=A}else{A=l<<2;h=x;x=0;while(1){y=ca(x,m)|0;D=g+(y<<2)|0;if((h|0)!=0){E=D;F=(c[e>>2]|0)+(c[s>>2]<<2)|0;G=h;while(1){G=G+ -1|0;c[F>>2]=c[E>>2];if((G|0)==0){break}else{E=E+4|0;F=F+8|0}}}F=c[r>>2]|0;if((F|0)!=0){E=g+((c[a>>2]|0)+y<<2)|0;G=(c[e>>2]|0)+(1-(c[s>>2]|0)<<2)|0;H=F;while(1){H=H+ -1|0;c[G>>2]=c[E>>2];if((H|0)==0){break}else{E=E+4|0;G=G+8|0}}}Zia(e);c3a(D|0,c[e>>2]|0,A|0)|0;G=x+1|0;if((G|0)==(p|0)){break}h=c[a>>2]|0;x=G}C=c[b>>2]|0}c[t>>2]=p-C;c[u>>2]=(c[z>>2]|0)%2|0;a:do{if((k|0)!=(w|0)){x=C;h=0;while(1){if((x|0)!=0){A=g+(h<<2)|0;G=(c[f>>2]|0)+(c[u>>2]<<2)|0;E=x;while(1){E=E+ -1|0;c[G>>2]=c[A>>2];if((E|0)==0){break}else{A=A+(m<<2)|0;G=G+8|0}}}G=c[t>>2]|0;if((G|0)!=0){A=g+((ca(c[b>>2]|0,m)|0)+h<<2)|0;E=(c[f>>2]|0)+(1-(c[u>>2]|0)<<2)|0;H=G;while(1){H=H+ -1|0;c[E>>2]=c[A>>2];if((H|0)==0){break}else{A=A+(m<<2)|0;E=E+8|0}}}Zia(f);if(!B){E=c[f>>2]|0;A=0;do{c[g+((ca(A,m)|0)+h<<2)>>2]=c[E+(A<<2)>>2];A=A+1|0}while((A|0)!=(p|0))}A=h+1|0;if((A|0)==(l|0)){break a}x=c[b>>2]|0;h=A}}}while(0);v=v+ -1|0}while((v|0)!=0);q=c[e>>2]|0}v2a(q);o=1;i=d;return o|0}function Zia(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;b=i;d=c[a>>2]|0;e=c[a+4>>2]|0;f=c[a+8>>2]|0;if((c[a+12>>2]|0)==0){a=(e|0)>0;if(!(a|(f|0)>1)){i=b;return}if((f|0)>0){g=d+4|0;h=d+((e<<1)+ -1<<2)|0;j=0;do{if((j|0)>=1){if((j|0)>(e|0)){k=h}else{k=d+((j<<1)+ -1<<2)|0}}else{k=g}l=j<<1;if((j|0)<(e|0)){m=d+((l|1)<<2)|0}else{m=h}n=d+(l<<2)|0;c[n>>2]=(c[n>>2]|0)-((c[k>>2]|0)+2+(c[m>>2]|0)>>2);j=j+1|0}while((j|0)!=(f|0))}if(!a){i=b;return}a=d+((f<<1)+ -2<<2)|0;j=0;do{if((j|0)<(f|0)){o=d+(j<<1<<2)|0}else{o=a}m=j;j=j+1|0;if((j|0)<(f|0)){p=d+(j<<1<<2)|0}else{p=a}k=d+((m<<1|1)<<2)|0;c[k>>2]=((c[p>>2]|0)+(c[o>>2]|0)>>1)+(c[k>>2]|0)}while((j|0)!=(e|0));i=b;return}if((f|0)==0&(e|0)==1){c[d>>2]=(c[d>>2]|0)/2|0;i=b;return}if((f|0)>0){j=d+((e<<1)+ -2<<2)|0;o=0;do{if((o|0)<(e|0)){q=d+(o<<1<<2)|0}else{q=j}p=o;o=o+1|0;if((o|0)<(e|0)){r=d+(o<<1<<2)|0}else{r=j}a=d+((p<<1|1)<<2)|0;c[a>>2]=(c[a>>2]|0)-((c[q>>2]|0)+2+(c[r>>2]|0)>>2)}while((o|0)!=(f|0))}if((e|0)<=0){i=b;return}o=d+4|0;r=d+((f<<1)+ -1<<2)|0;q=0;do{if((q|0)<(f|0)){s=d+((q<<1|1)<<2)|0}else{s=r}j=c[s>>2]|0;if((q|0)>=1){if((q|0)>(f|0)){t=r}else{t=d+((q<<1)+ -1<<2)|0}}else{t=o}a=d+(q<<1<<2)|0;c[a>>2]=((c[t>>2]|0)+j>>1)+(c[a>>2]|0);q=q+1|0}while((q|0)!=(e|0));i=b;return}function _ia(a){a=a|0;var b=0;if((a|0)==0){b=0}else{b=(a+ -1|0)>>>0<2?1:2}return b|0}function $ia(a){a=a|0;return 0}function aja(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0;d=i;i=i+32|0;e=d+16|0;f=d;h=c[a+24>>2]|0;j=c[h+8>>2]|0;k=c[h>>2]|0;l=c[h+12>>2]|0;m=c[h+4>>2]|0;n=a+8|0;o=c[n>>2]|0;p=c[a>>2]|0;q=o-p|0;r=z2a(((bja(h,b)|0)<<4)+80|0)|0;c[e>>2]=r;c[f>>2]=r;s=b+ -1|0;if((s|0)==0){t=r;v2a(t);i=d;return}r=a+32|0;b=a+12|0;u=a+4|0;v=e+8|0;w=f+8|0;x=e+4|0;y=e+12|0;z=f+4|0;A=f+12|0;B=q<<1;C=q<<2;D=q*3|0;E=s;s=p;p=o;o=h;h=l-m|0;m=j-k|0;while(1){k=c[r>>2]|0;j=ca((c[b>>2]|0)-(c[u>>2]|0)|0,p-s|0)|0;c[v>>2]=m;c[w>>2]=h;l=o+136|0;F=c[o+144>>2]|0;G=c[l>>2]|0;H=F-G|0;I=c[o+148>>2]|0;J=o+140|0;K=c[J>>2]|0;L=I-K|0;c[x>>2]=H-m;c[y>>2]=(c[l>>2]|0)%2|0;if((L|0)>3){M=(H|0)>0;N=(I+ -4-K|0)>>>2;O=ca(q,-4-(N<<2)|0)|0;P=k+(ca(q,(N<<4)+16|0)|0)|0;N=k;Q=j;R=L;while(1){cja(e,N,q,Q);dja(e);if(M){S=H;do{S=S+ -1|0;g[N+(S<<2)>>2]=+g[(c[e>>2]|0)+(S<<4)>>2];g[N+(S+q<<2)>>2]=+g[(c[e>>2]|0)+(S<<4)+4>>2];g[N+(S+B<<2)>>2]=+g[(c[e>>2]|0)+(S<<4)+8>>2];g[N+(S+D<<2)>>2]=+g[(c[e>>2]|0)+(S<<4)+12>>2]}while((S|0)>0)}R=R+ -4|0;if((R|0)<=3){break}else{N=N+(C<<2)|0;Q=Q-C|0}}T=P;U=j+O|0}else{T=k;U=j}Q=L&3;if((Q|0)!=0?(cja(e,T,q,U),dja(e),(H|0)>0):0){N=H;do{N=N+ -1|0;if((Q|0)==3){R=c[e>>2]|0;g[T+(N+B<<2)>>2]=+g[R+(N<<4)+8>>2];V=R;W=15}else if((Q|0)==2){V=c[e>>2]|0;W=15}else if((Q|0)==1){X=c[e>>2]|0;W=16}if((W|0)==15){W=0;g[T+(N+q<<2)>>2]=+g[V+(N<<4)+4>>2];X=V;W=16}if((W|0)==16){W=0;g[T+(N<<2)>>2]=+g[X+(N<<4)>>2]}}while((N|0)>0)}c[z>>2]=L-(c[w>>2]|0);c[A>>2]=(c[J>>2]|0)%2|0;N=c[r>>2]|0;if((H|0)>3){Q=(I|0)==(K|0);j=N+((F+ -4-G+4&-4)<<2)|0;k=N;O=H;while(1){eja(f,k,q,4);dja(f);if(!Q){P=0;do{R=k+((ca(P,q)|0)<<2)|0;M=(c[f>>2]|0)+(P<<4)|0;c[R+0>>2]=c[M+0>>2];c[R+4>>2]=c[M+4>>2];c[R+8>>2]=c[M+8>>2];c[R+12>>2]=c[M+12>>2];P=P+1|0}while((P|0)!=(L|0))}O=O+ -4|0;if((O|0)<=3){break}else{k=k+16|0}}Y=j}else{Y=N}k=H&3;if((k|0)!=0?(eja(f,Y,q,k),dja(f),(I|0)!=(K|0)):0){O=k<<2;k=c[f>>2]|0;Q=0;do{c3a(Y+((ca(Q,q)|0)<<2)|0,k+(Q<<4)|0,O|0)|0;Q=Q+1|0}while((Q|0)!=(L|0))}Q=E+ -1|0;if((Q|0)==0){break}E=Q;s=c[a>>2]|0;p=c[n>>2]|0;o=l;h=L;m=H}t=c[e>>2]|0;v2a(t);i=d;return}function bja(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=b+ -1|0;if((e|0)==0){f=0;i=d;return f|0}else{g=a;h=e;j=0}while(1){e=g;g=g+136|0;a=(c[e+144>>2]|0)-(c[g>>2]|0)|0;b=j>>>0<a>>>0?a:j;a=(c[e+148>>2]|0)-(c[e+140>>2]|0)|0;e=b>>>0<a>>>0?a:b;h=h+ -1|0;if((h|0)==0){f=e;break}else{j=e}}i=d;return f|0}function cja(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=i;h=c[a>>2]|0;j=c[a+12>>2]|0;k=a+8|0;l=d*3|0;m=a+4|0;a=1-j|0;n=b;b=e;e=j;j=k;o=0;while(1){p=h+(e<<4)|0;q=c[j>>2]|0;if(((q+l|0)<(b|0)?(n&15|0)==0:0)?((p|d)&15|0)==0:0){if((q|0)>0){p=0;do{r=p<<3;g[h+(e<<4)+(r<<2)>>2]=+g[n+(p<<2)>>2];s=p+d|0;g[h+(e<<4)+((r|1)<<2)>>2]=+g[n+(s<<2)>>2];t=s+d|0;g[h+(e<<4)+((r|2)<<2)>>2]=+g[n+(t<<2)>>2];g[h+(e<<4)+((r|3)<<2)>>2]=+g[n+(t+d<<2)>>2];p=p+1|0}while((p|0)!=(q|0))}}else{u=3}if((u|0)==3?(u=0,(q|0)>0):0){p=0;do{t=p<<3;g[h+(e<<4)+(t<<2)>>2]=+g[n+(p<<2)>>2];r=p+d|0;if(((r|0)<(b|0)?(g[h+(e<<4)+((t|1)<<2)>>2]=+g[n+(r<<2)>>2],s=r+d|0,(s|0)<(b|0)):0)?(g[h+(e<<4)+((t|2)<<2)>>2]=+g[n+(s<<2)>>2],r=s+d|0,(r|0)<(b|0)):0){g[h+(e<<4)+((t|3)<<2)>>2]=+g[n+(r<<2)>>2]}p=p+1|0}while((p|0)!=(q|0))}q=c[k>>2]|0;p=o+1|0;if((p|0)==2){break}else{n=n+(q<<2)|0;b=b-q|0;e=a;j=m;o=p}}i=f;return}function dja(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;if((c[a+12>>2]|0)==0){d=c[a+4>>2]|0;e=c[a+8>>2]|0;if((d|0)>0|(e|0)>1){f=e;g=d;h=0;j=1}else{i=b;return}}else{d=c[a+8>>2]|0;e=c[a+4>>2]|0;if((d|0)>0|(e|0)>1){f=d;g=e;h=1;j=0}else{i=b;return}}e=c[a>>2]|0;a=e+(h<<4)|0;fja(a,f,1.2301740646362305);d=e+(j<<4)|0;fja(d,g,1.625732421875);k=e+(h+1<<4)|0;l=g-h|0;h=(f|0)<(l|0)?f:l;gja(d,k,f,h,-.4435068666934967);l=e+(j+1<<4)|0;e=f-j|0;j=(g|0)<(e|0)?g:e;gja(a,l,g,j,-.8829110860824585);gja(d,k,f,h,.05298011749982834);gja(a,l,g,j,1.5861343145370483);i=b;return}function eja(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;g=c[a>>2]|0;h=c[a+12>>2]|0;j=c[a+8>>2]|0;if((j|0)>0){k=e<<2;l=0;do{c3a(g+((l<<1)+h<<4)|0,b+((ca(l,d)|0)<<2)|0,k|0)|0;l=l+1|0}while((l|0)<(j|0))}l=1-h|0;h=c[a+4>>2]|0;if((h|0)<=0){i=f;return}a=e<<2;e=0;do{c3a(g+(l+(e<<1)<<4)|0,b+((ca(e+j|0,d)|0)<<2)|0,a|0)|0;e=e+1|0}while((e|0)<(h|0));i=f;return}function fja(a,b,c){a=a|0;b=b|0;c=+c;var d=0,e=0,f=0,h=0,j=0,k=0.0,l=0,m=0.0,n=0,o=0.0;d=i;if((b|0)>0){e=0}else{i=d;return}do{f=e<<3;h=a+(f<<2)|0;j=a+((f|1)<<2)|0;k=+g[j>>2];l=a+((f|2)<<2)|0;m=+g[l>>2];n=a+((f|3)<<2)|0;o=+g[n>>2];g[h>>2]=+g[h>>2]*c;g[j>>2]=k*c;g[l>>2]=m*c;g[n>>2]=o*c;e=e+1|0}while((e|0)!=(b|0));i=d;return}function gja(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;var f=0,h=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0.0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0;f=i;if((d|0)>0){h=d<<1;j=h+ -2|0;k=+g[a>>2];l=+g[a+4>>2];m=+g[a+8>>2];n=+g[a+12>>2];o=b;p=0;while(1){q=o+ -16|0;r=o+ -12|0;s=+g[r>>2];t=o+ -8|0;u=+g[t>>2];v=o+ -4|0;w=+g[v>>2];x=k;k=+g[o>>2];y=l;l=+g[o+4>>2];z=m;m=+g[o+8>>2];A=n;n=+g[o+12>>2];g[q>>2]=+g[q>>2]+(x+k)*e;g[r>>2]=s+(y+l)*e;g[t>>2]=u+(z+m)*e;g[v>>2]=w+(A+n)*e;p=p+1|0;if((p|0)==(d|0)){break}else{o=o+32|0}}B=b+(j<<4)|0;C=b+(h<<4)|0}else{B=a;C=b}if((d|0)>=(c|0)){i=f;return}n=e+e;e=n*+g[B>>2];m=n*+g[B+4>>2];l=n*+g[B+8>>2];k=n*+g[B+12>>2];B=d;d=C;while(1){C=d+ -16|0;b=d+ -12|0;n=+g[b>>2];a=d+ -8|0;A=+g[a>>2];h=d+ -4|0;w=+g[h>>2];g[C>>2]=e+ +g[C>>2];g[b>>2]=m+n;g[a>>2]=l+A;g[h>>2]=k+w;B=B+1|0;if((B|0)==(c|0)){break}else{d=d+32|0}}i=f;return}function hja(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;f=ca(d,b)|0;g=a+24|0;h=a+8|0;j=c[h>>2]|0;do{if(f>>>0>(c[g>>2]|0)>>>0){v2a(j);k=f<<2;l=z2a(k)|0;c[h>>2]=l;if((l|0)==0){m=0;i=e;return m|0}else{c[g>>2]=f;n=k;o=l;break}}else{n=f<<2;o=j}}while(0);f3a(o|0,0,n|0)|0;n=b+2|0;c[a+32>>2]=n;o=ca(d+2|0,n)|0;n=a+28|0;j=a+12|0;f=c[j>>2]|0;do{if(o>>>0>(c[n>>2]|0)>>>0){v2a(f);g=o<<1;h=z2a(g)|0;c[j>>2]=h;if((h|0)==0){m=0;i=e;return m|0}else{c[n>>2]=o;p=g;q=h;break}}else{p=o<<1;q=f}}while(0);f3a(q|0,0,p|0)|0;c[a+16>>2]=b;c[a+20>>2]=d;m=1;i=e;return m|0}function ija(){var a=0,b=0,d=0,e=0,f=0;a=i;b=u2a(36)|0;do{if((b|0)!=0){d=b+0|0;e=d+36|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(e|0));d=wja()|0;c[b>>2]=d;if((d|0)==0){jja(b);f=0;break}d=Eja()|0;c[b+4>>2]=d;if((d|0)==0){jja(b);f=0}else{f=b}}else{f=0}}while(0);i=a;return f|0}function jja(a){a=a|0;var b=0,d=0,e=0;b=i;if((a|0)==0){i=b;return}xja(c[a>>2]|0);c[a>>2]=0;d=a+4|0;Fja(c[d>>2]|0);c[d>>2]=0;d=a+8|0;e=c[d>>2]|0;if((e|0)!=0){v2a(e);c[d>>2]=0}d=c[a+12>>2]|0;if((d|0)!=0){v2a(d)}v2a(a);i=b;return}function kja(a,f,h){a=a|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0,Gc=0;j=i;k=(c[f+8>>2]|0)-(c[f>>2]|0)|0;l=f+20|0;m=c[l>>2]|0;if((m|0)==0){n=1;i=j;return n|0}o=f+24|0;p=h+808|0;q=h+16|0;r=a+4|0;s=a+8|0;t=a+16|0;u=a+20|0;v=h+20|0;h=f+32|0;f=a+32|0;w=a+12|0;x=m;m=0;a:while(1){y=c[o>>2]|0;z=y+(m*136|0)+24|0;A=c[z>>2]|0;if((A|0)==0){B=x}else{C=y+(m*136|0)+16|0;D=y+(m*136|0)+20|0;E=m+ -1|0;F=c[C>>2]|0;G=c[D>>2]|0;H=A;A=0;while(1){if((ca(G,F)|0)==0){I=H;J=G;K=F}else{L=y+(m*136|0)+(A*36|0)+48|0;M=y+(m*136|0)+(A*36|0)+44|0;N=y+(m*136|0)+(A*36|0)+28|0;O=y+(m*136|0)+(A*36|0)+32|0;P=y+(m*136|0)+(A*36|0)+60|0;Q=G;R=F;S=0;while(1){T=c[L>>2]|0;U=T+(S*40|0)+16|0;V=T+(S*40|0)+20|0;if((ca(c[V>>2]|0,c[U>>2]|0)|0)==0){W=R;X=Q}else{Y=T+(S*40|0)+24|0;T=0;do{Z=c[Y>>2]|0;_=c[M>>2]|0;$=c[p>>2]|0;aa=c[q>>2]|0;ba=c[r>>2]|0;da=c[a>>2]|0;ea=Z+(T*56|0)+8|0;fa=Z+(T*56|0)+12|0;if((hja(a,(c[Z+(T*56|0)+16>>2]|0)-(c[ea>>2]|0)|0,(c[Z+(T*56|0)+20>>2]|0)-(c[fa>>2]|0)|0)|0)==0){n=0;ga=202;break a}ha=Z+(T*56|0)+24|0;ia=c[ha>>2]|0;yja(da);zja(da,18,46);zja(da,17,3);zja(da,0,4);ja=Z+(T*56|0)+48|0;ka=c[ja>>2]|0;if((ka|0)!=0){la=Z+(T*56|0)+4|0;Z=aa&1;ma=(aa&2|0)!=0;na=(aa&8|0)==0;oa=_<<8;pa=(aa&32|0)==0;aa=ka;ka=$+ -1+ia|0;ia=2;$=0;while(1){qa=c[la>>2]|0;ra=(ia>>>0<2?(ka|0)<=((c[ha>>2]|0)+ -5|0):0)?Z:0;sa=c[qa+($<<5)>>2]|0;if((sa|0)==0){ta=aa;ua=ka;va=ia}else{wa=(ra|0)==1;xa=(c[sa>>2]|0)+(c[qa+($<<5)+4>>2]|0)|0;sa=c[qa+($<<5)+16>>2]|0;if(wa){Gja(ba,xa,sa)}else{Aja(da,xa,sa)}sa=qa+($<<5)+12|0;if((c[sa>>2]|0)==0){ya=ka;za=ia}else{qa=ma&(ra|0)==0;ra=ka;xa=0;Aa=ia;while(1){b:do{if((Aa|0)==2){Ba=c[a>>2]|0;Ca=1<<ra+1;Da=Ca>>1|Ca;do{if(na){Ca=c[s>>2]|0;Ea=(c[w>>2]|0)+2|0;Fa=c[u>>2]|0;if(Fa>>>0>3){Ga=Ba+92|0;Ha=Ba+100|0;Ia=Ba+96|0;Ja=0-Da|0;Ka=c[t>>2]|0;La=Ka;Ma=Ka;Ka=Fa;Na=Ca;Oa=Ea;Pa=0;while(1){if((La|0)==0){Qa=0;Ra=Pa+4|0;Sa=Ka;Ta=Ma;Ua=0}else{Va=Pa|1;Wa=Va+1|0;Xa=Pa|3;Ya=Va+3|0;Za=Pa+4|0;_a=0;do{$a=Na+(_a<<2)|0;ab=c[f>>2]|0;bb=_a;_a=_a+1|0;cb=(ca(ab,Va)|0)+_a|0;db=c[w>>2]|0;c:do{if((b[db+(cb<<1)>>1]&20735)==0){if(!((b[db+((ca(ab,Wa)|0)+_a<<1)>>1]&20735)==0)){ga=155;break}if(!((b[db+((ca(ab,Xa)|0)+_a<<1)>>1]&20735)==0)){ga=155;break}if(!((b[db+((ca(ab,Ya)|0)+_a<<1)>>1]&20735)==0)){ga=155;break}c[Ha>>2]=Ga;if((Cja(Ba)|0)==0){break}c[Ha>>2]=Ia;eb=(Cja(Ba)|0)<<1;fb=eb|(Cja(Ba)|0);eb=fb+Pa|0;if(!(eb>>>0<Za>>>0)){break}gb=Na+((ca(c[t>>2]|0,fb)|0)+bb<<2)|0;hb=Oa+((ca(c[f>>2]|0,fb)|0)+bb<<1)|0;fb=eb;while(1){if(!(fb>>>0<(c[u>>2]|0)>>>0)){break c}hb=hb+(c[f>>2]<<1)|0;if((fb|0)==(eb|0)){ib=c[a>>2]|0;jb=(e[hb>>1]|0)>>>4&255;c[ib+100>>2]=ib+(d[742976+jb>>0]<<2)+24;kb=Cja(ib)|0;ib=d[742720+jb>>0]|0;c[gb>>2]=(kb|0)!=(ib|0)?Ja:Da;lja(hb,ib^kb,c[f>>2]|0);b[hb>>1]=b[hb>>1]&49151}else{mja(a,hb,gb,_,Da)}fb=fb+1|0;if(!(fb>>>0<Za>>>0)){break}else{gb=gb+(c[t>>2]<<2)|0}}}else{ga=155}}while(0);if((ga|0)==155){ga=0;db=ab+bb|0;mja(a,Oa+(db<<1)|0,$a,_,Da);cb=(c[t>>2]|0)+bb|0;gb=(c[f>>2]|0)+db|0;mja(a,Oa+(gb<<1)|0,Na+(cb<<2)|0,_,Da);db=(c[t>>2]|0)+cb|0;cb=(c[f>>2]|0)+gb|0;mja(a,Oa+(cb<<1)|0,Na+(db<<2)|0,_,Da);mja(a,Oa+((c[f>>2]|0)+cb<<1)|0,Na+((c[t>>2]|0)+db<<2)|0,_,Da)}lb=c[t>>2]|0}while(_a>>>0<lb>>>0);Qa=lb<<2;Ra=Za;Sa=c[u>>2]|0;Ta=lb;Ua=lb}_a=Na+(Qa<<2)|0;Ya=Oa+(c[f>>2]<<2<<1)|0;if(Ra>>>0<(Sa&-4)>>>0){La=Ua;Ma=Ta;Ka=Sa;Na=_a;Oa=Ya;Pa=Ra}else{mb=Ta;nb=Sa;ob=_a;pb=Ya;qb=Ra;break}}}else{mb=c[t>>2]|0;nb=Fa;ob=Ca;pb=Ea;qb=0}if((mb|0)==0){break}Pa=qb+1|0;Oa=nb;Na=mb;Ka=0;while(1){do{if(qb>>>0<Oa>>>0){Ma=ob+(Ka<<2)|0;La=pb+((c[f>>2]|0)+Ka<<1)|0;mja(a,La,Ma,_,Da);Ja=c[t>>2]|0;Ia=c[u>>2]|0;if(Pa>>>0<Ia>>>0){rb=Ja;sb=La;tb=Pa;ub=Ma}else{vb=Ja;wb=Ia;break}while(1){ub=ub+(rb<<2)|0;sb=sb+(c[f>>2]<<1)|0;mja(a,sb,ub,_,Da);Ia=c[t>>2]|0;tb=tb+1|0;Ja=c[u>>2]|0;if(!(tb>>>0<Ja>>>0)){vb=Ia;wb=Ja;break}else{rb=Ia}}}else{vb=Na;wb=Oa}}while(0);Ka=Ka+1|0;if(!(Ka>>>0<vb>>>0)){break}else{Oa=wb;Na=vb}}}else{Na=c[u>>2]|0;if((Na|0)==0){break}Oa=Ba+92|0;Ka=Ba+100|0;Pa=Ba+96|0;Ea=0-Da|0;Ca=c[t>>2]|0;Fa=Na;Na=0;while(1){if((Ca|0)==0){xb=Na+4|0;yb=Fa;zb=0}else{Za=Na|3;bb=Na|1;$a=bb+1|0;ab=bb+3|0;Ia=Na+4|0;Ja=Fa;Ma=0;while(1){do{if(Za>>>0<Ja>>>0){La=c[f>>2]|0;Ha=Ma+1|0;Ga=(ca(La,bb)|0)+Ha|0;Ya=c[w>>2]|0;if(!((b[Ya+(Ga<<1)>>1]&20735)==0)){Ab=Ha;Bb=0;Cb=0;ga=122;break}if(!((b[Ya+((ca(La,$a)|0)+Ha<<1)>>1]&20735)==0)){Ab=Ha;Bb=0;Cb=0;ga=122;break}if(!((b[Ya+((ca(La,Za)|0)+Ha<<1)>>1]&20735)==0)){Ab=Ha;Bb=0;Cb=0;ga=122;break}if(!((b[Ya+((ca(La,ab)|0)+Ha<<1)>>1]&20665)==0)){Ab=Ha;Bb=0;Cb=0;ga=122;break}c[Ka>>2]=Oa;if((Cja(Ba)|0)==0){Db=Ha;break}c[Ka>>2]=Pa;La=(Cja(Ba)|0)<<1;Ab=Ha;Bb=1;Cb=La|(Cja(Ba)|0);ga=122}else{Ab=Ma+1|0;Bb=0;Cb=0;ga=122}}while(0);d:do{if((ga|0)==122){ga=0;La=Cb+Na|0;if(La>>>0<Ia>>>0){Eb=La}else{Db=Ab;break}while(1){Ha=c[u>>2]|0;if(!(Eb>>>0<Ha>>>0)){Db=Ab;break d}if((Eb|0)==(Za|0)){Fb=1}else{Fb=(Eb|0)==(Ha+ -1|0)}Ha=Eb;Eb=Eb+1|0;Ya=(ca(c[f>>2]|0,Eb)|0)+Ab|0;Ga=(c[w>>2]|0)+(Ya<<1)|0;Ya=(ca(c[t>>2]|0,Ha)|0)+Ma|0;_a=(c[s>>2]|0)+(Ya<<2)|0;Ya=c[a>>2]|0;Xa=b[Ga>>1]|0;Wa=Fb?Xa&-1095:Xa;do{if(!(Bb&(Ha|0)==(La|0))){if((Wa&20480|0)!=0){break}Xa=Ya+100|0;c[Xa>>2]=Ya+(d[743232+(Wa&255|oa)>>0]<<2)+24;if((Cja(Ya)|0)!=0){Gb=Xa;ga=130}}else{Gb=Ya+100|0;ga=130}}while(0);if((ga|0)==130){ga=0;Ha=Wa>>>4&255;c[Gb>>2]=Ya+(d[742976+Ha>>0]<<2)+24;Xa=Cja(Ya)|0;Va=d[742720+Ha>>0]|0;c[_a>>2]=(Xa|0)!=(Va|0)?Ea:Da;lja(Ga,Va^Xa,c[f>>2]|0)}b[Ga>>1]=b[Ga>>1]&49151;if(!(Eb>>>0<Ia>>>0)){Db=Ab;break}}}}while(0);La=c[t>>2]|0;Xa=c[u>>2]|0;if(Db>>>0<La>>>0){Ja=Xa;Ma=Db}else{xb=Ia;yb=Xa;zb=La;break}}}if(xb>>>0<yb>>>0){Ca=zb;Fa=yb;Na=xb}else{break}}}}while(0);if(pa){ga=164;break}c[Ba+100>>2]=Ba+96;Cja(Ba)|0;Cja(Ba)|0;Cja(Ba)|0;Cja(Ba)|0;ga=164}else if((Aa|0)==1){Da=ra+1|0;if(wa){Na=1<<Da>>1;Fa=(ra|0)>-1?0-Na|0:-1;Ca=c[u>>2]|0;if((Ca|0)==0){break}Ea=c[t>>2]|0;Pa=Ea;Ka=Ea;Ea=Ca;Ca=0;while(1){Oa=Ca;Ca=Ca+4|0;if((Pa|0)==0){Hb=Ea;Ib=Ka;Jb=0}else{Ia=(Oa|0)==-4;Ma=Ka;Ja=0;while(1){Za=Ja;Ja=Ja+1|0;if(Ia){Kb=Ma}else{ab=Oa;do{if(!(ab>>>0<(c[u>>2]|0)>>>0)){break}$a=ab;ab=ab+1|0;bb=(ca(c[f>>2]|0,ab)|0)+Ja|0;La=(c[w>>2]|0)+(bb<<1)|0;bb=(ca(c[t>>2]|0,$a)|0)+Za|0;$a=(c[s>>2]|0)+(bb<<2)|0;if((b[La>>1]&20480)==4096){bb=(Hja(c[r>>2]|0)|0)!=0;Xa=bb?Na:Fa;bb=c[$a>>2]|0;c[$a>>2]=((bb|0)<0?0-Xa|0:Xa)+bb;b[La>>1]=e[La>>1]|8192}}while(ab>>>0<Ca>>>0);Kb=c[t>>2]|0}if(!(Ja>>>0<Kb>>>0)){break}else{Ma=Kb}}Hb=c[u>>2]|0;Ib=Kb;Jb=Kb}if(!(Ca>>>0<Hb>>>0)){ga=164;break b}else{Pa=Jb;Ka=Ib;Ea=Hb}}}if(na){Ea=c[s>>2]|0;Ka=(c[w>>2]|0)+2|0;Pa=1<<Da>>1;Ca=(ra|0)>-1?0-Pa|0:-1;Fa=c[u>>2]|0;Na=c[t>>2]|0;if(Fa>>>0>3){Ba=Na;Ma=Na;Ja=Fa;Oa=Ea;Ia=Ka;ab=0;while(1){if((Ba|0)==0){Lb=0;Mb=Ja;Nb=Ma;Ob=0}else{Za=0;do{La=(c[f>>2]|0)+Za|0;nja(c[a>>2]|0,Ia+(La<<1)|0,Oa+(Za<<2)|0,Pa,Ca);bb=(c[t>>2]|0)+Za|0;Xa=(c[f>>2]|0)+La|0;nja(c[a>>2]|0,Ia+(Xa<<1)|0,Oa+(bb<<2)|0,Pa,Ca);La=(c[t>>2]|0)+bb|0;bb=(c[f>>2]|0)+Xa|0;nja(c[a>>2]|0,Ia+(bb<<1)|0,Oa+(La<<2)|0,Pa,Ca);nja(c[a>>2]|0,Ia+((c[f>>2]|0)+bb<<1)|0,Oa+((c[t>>2]|0)+La<<2)|0,Pa,Ca);Za=Za+1|0;Pb=c[t>>2]|0}while(Za>>>0<Pb>>>0);Lb=Pb<<2;Mb=c[u>>2]|0;Nb=Pb;Ob=Pb}Za=Oa+(Lb<<2)|0;La=Ia+(c[f>>2]<<2<<1)|0;bb=ab+4|0;if(bb>>>0<(Mb&-4)>>>0){Ba=Ob;Ma=Nb;Ja=Mb;Oa=Za;Ia=La;ab=bb}else{Qb=Nb;Rb=Mb;Sb=Za;Tb=La;Ub=bb;break}}}else{Qb=Na;Rb=Fa;Sb=Ea;Tb=Ka;Ub=0}if((Qb|0)==0){ga=164;break}ab=Ub+1|0;Ia=Rb;Oa=Qb;Ja=0;while(1){do{if(Ub>>>0<Ia>>>0){Ma=Sb+(Ja<<2)|0;Ba=Tb+((c[f>>2]|0)+Ja<<1)|0;nja(c[a>>2]|0,Ba,Ma,Pa,Ca);bb=c[t>>2]|0;La=c[u>>2]|0;if(ab>>>0<La>>>0){Vb=bb;Wb=Ba;Xb=ab;Yb=Ma}else{Zb=bb;_b=La;break}while(1){Yb=Yb+(Vb<<2)|0;Wb=Wb+(c[f>>2]<<1)|0;nja(c[a>>2]|0,Wb,Yb,Pa,Ca);La=c[t>>2]|0;Xb=Xb+1|0;bb=c[u>>2]|0;if(!(Xb>>>0<bb>>>0)){Zb=La;_b=bb;break}else{Vb=La}}}else{Zb=Oa;_b=Ia}}while(0);Ja=Ja+1|0;if(!(Ja>>>0<Zb>>>0)){ga=164;break b}else{Ia=_b;Oa=Zb}}}Oa=1<<Da>>1;Ia=(ra|0)>-1?0-Oa|0:-1;Ja=c[u>>2]|0;if((Ja|0)==0){ga=164;break}Ca=c[t>>2]|0;Pa=Ca;ab=Ca;Ca=Ja;Ja=0;while(1){Ka=Ja;Ja=Ja+4|0;if((Pa|0)==0){$b=Ca;ac=ab;bc=0}else{Ea=(Ka|0)==-4;Fa=Ka|3;Na=ab;La=0;while(1){bb=La;La=La+1|0;if(Ea){cc=Na}else{Ma=Ka;do{Ba=c[u>>2]|0;if(!(Ma>>>0<Ba>>>0)){break}if((Ma|0)==(Fa|0)){dc=1}else{dc=(Ma|0)==(Ba+ -1|0)}Ba=Ma;Ma=Ma+1|0;Za=(ca(c[f>>2]|0,Ma)|0)+La|0;Xa=(c[w>>2]|0)+(Za<<1)|0;Za=(ca(c[t>>2]|0,Ba)|0)+bb|0;Ba=(c[s>>2]|0)+(Za<<2)|0;Za=c[a>>2]|0;$a=b[Xa>>1]|0;Va=dc?$a&-1095:$a;if((Va&20480|0)==4096){c[Za+100>>2]=Za+(((Va&8192|0)!=0?16:(Va&255|0)!=0?15:14)<<2)+24;Va=(Cja(Za)|0)!=0;Za=Va?Oa:Ia;Va=c[Ba>>2]|0;c[Ba>>2]=((Va|0)<0?0-Za|0:Za)+Va;b[Xa>>1]=e[Xa>>1]|8192}}while(Ma>>>0<Ja>>>0);cc=c[t>>2]|0}if(!(La>>>0<cc>>>0)){break}else{Na=cc}}$b=c[u>>2]|0;ac=cc;bc=cc}if(!(Ja>>>0<$b>>>0)){ga=164;break}else{Pa=bc;ab=ac;Ca=$b}}}else if((Aa|0)==0){Ca=ra+1|0;if(wa){ab=1<<Ca;Pa=ab>>1|ab;ab=c[u>>2]|0;if((ab|0)==0){break}Ja=0-Pa|0;Ia=c[t>>2]|0;Oa=Ia;Da=Ia;Ia=ab;ab=0;while(1){Na=ab;ab=ab+4|0;if((Oa|0)==0){ec=Ia;fc=Da;gc=0}else{La=(Na|0)==-4;Fa=Na|3;Ka=Da;Ea=0;while(1){Ma=Ea;Ea=Ea+1|0;if(La){hc=Ka}else{bb=Na;do{Xa=c[u>>2]|0;if(!(bb>>>0<Xa>>>0)){break}do{if(na){ic=0}else{if((bb|0)==(Fa|0)){ic=1;break}ic=(bb|0)==(Xa+ -1|0)}}while(0);Xa=bb;bb=bb+1|0;Va=(ca(c[f>>2]|0,bb)|0)+Ea|0;Za=(c[w>>2]|0)+(Va<<1)|0;Va=(ca(c[t>>2]|0,Xa)|0)+Ma|0;Xa=(c[s>>2]|0)+(Va<<2)|0;Va=c[r>>2]|0;Ba=b[Za>>1]|0;$a=ic?Ba&-1095:Ba;if(($a&255|0)!=0&($a&20480|0)==0){if((Hja(Va)|0)!=0){$a=Hja(Va)|0;c[Xa>>2]=($a|0)!=0?Ja:Pa;lja(Za,$a,c[f>>2]|0)}b[Za>>1]=e[Za>>1]|16384}}while(bb>>>0<ab>>>0);hc=c[t>>2]|0}if(!(Ea>>>0<hc>>>0)){break}else{Ka=hc}}ec=c[u>>2]|0;fc=hc;gc=hc}if(!(ab>>>0<ec>>>0)){ga=164;break b}else{Oa=gc;Da=fc;Ia=ec}}}if(na){Ia=c[s>>2]|0;Da=(c[w>>2]|0)+2|0;Oa=1<<Ca;ab=Oa>>1|Oa;Oa=c[u>>2]|0;Pa=c[t>>2]|0;if(Oa>>>0>3){Ja=Pa;Ka=Pa;Ea=Oa;Fa=Ia;Na=Da;La=0;while(1){if((Ja|0)==0){jc=0;kc=Ea;lc=Ka;mc=0}else{bb=0;do{Ma=(c[f>>2]|0)+bb|0;oja(a,Na+(Ma<<1)|0,Fa+(bb<<2)|0,_,ab);Za=(c[t>>2]|0)+bb|0;$a=(c[f>>2]|0)+Ma|0;oja(a,Na+($a<<1)|0,Fa+(Za<<2)|0,_,ab);Ma=(c[t>>2]|0)+Za|0;Za=(c[f>>2]|0)+$a|0;oja(a,Na+(Za<<1)|0,Fa+(Ma<<2)|0,_,ab);oja(a,Na+((c[f>>2]|0)+Za<<1)|0,Fa+((c[t>>2]|0)+Ma<<2)|0,_,ab);bb=bb+1|0;nc=c[t>>2]|0}while(bb>>>0<nc>>>0);jc=nc<<2;kc=c[u>>2]|0;lc=nc;mc=nc}bb=Fa+(jc<<2)|0;Ma=Na+(c[f>>2]<<2<<1)|0;Za=La+4|0;if(Za>>>0<(kc&-4)>>>0){Ja=mc;Ka=lc;Ea=kc;Fa=bb;Na=Ma;La=Za}else{oc=lc;pc=kc;qc=bb;rc=Ma;sc=Za;break}}}else{oc=Pa;pc=Oa;qc=Ia;rc=Da;sc=0}if((oc|0)==0){ga=164;break}La=sc+1|0;Na=pc;Fa=oc;Ea=0;while(1){do{if(sc>>>0<Na>>>0){Ka=qc+(Ea<<2)|0;Ja=rc+((c[f>>2]|0)+Ea<<1)|0;oja(a,Ja,Ka,_,ab);Za=c[t>>2]|0;Ma=c[u>>2]|0;if(La>>>0<Ma>>>0){tc=Za;uc=Ja;vc=La;wc=Ka}else{xc=Za;yc=Ma;break}while(1){wc=wc+(tc<<2)|0;uc=uc+(c[f>>2]<<1)|0;oja(a,uc,wc,_,ab);Ma=c[t>>2]|0;vc=vc+1|0;Za=c[u>>2]|0;if(!(vc>>>0<Za>>>0)){xc=Ma;yc=Za;break}else{tc=Ma}}}else{xc=Fa;yc=Na}}while(0);Ea=Ea+1|0;if(!(Ea>>>0<xc>>>0)){ga=164;break b}else{Na=yc;Fa=xc}}}Fa=1<<Ca;Na=Fa>>1|Fa;Fa=c[u>>2]|0;if((Fa|0)==0){ga=164;break}Ea=0-Na|0;ab=c[t>>2]|0;La=ab;Da=ab;ab=Fa;Fa=0;while(1){Ia=Fa;Fa=Fa+4|0;if((La|0)==0){zc=ab;Ac=Da;Bc=0}else{Oa=(Ia|0)==-4;Pa=Ia|3;Ma=Da;Za=0;while(1){Ka=Za;Za=Za+1|0;if(Oa){Cc=Ma}else{Ja=Ia;do{bb=c[u>>2]|0;if(!(Ja>>>0<bb>>>0)){break}if((Ja|0)==(Pa|0)){Dc=1}else{Dc=(Ja|0)==(bb+ -1|0)}bb=Ja;Ja=Ja+1|0;$a=(ca(c[f>>2]|0,Ja)|0)+Za|0;Xa=(c[w>>2]|0)+($a<<1)|0;$a=(ca(c[t>>2]|0,bb)|0)+Ka|0;bb=(c[s>>2]|0)+($a<<2)|0;$a=c[a>>2]|0;Va=b[Xa>>1]|0;Ba=Dc?Va&-1095:Va;Va=Ba&255;if((Va|0)!=0&(Ba&20480|0)==0){Ha=$a+100|0;c[Ha>>2]=$a+(d[743232+(Va|oa)>>0]<<2)+24;if((Cja($a)|0)!=0){Va=Ba>>>4&255;c[Ha>>2]=$a+(d[742976+Va>>0]<<2)+24;Ha=Cja($a)|0;$a=d[742720+Va>>0]|0;c[bb>>2]=(Ha|0)!=($a|0)?Ea:Na;lja(Xa,$a^Ha,c[f>>2]|0)}b[Xa>>1]=e[Xa>>1]|16384}}while(Ja>>>0<Fa>>>0);Cc=c[t>>2]|0}if(!(Za>>>0<Cc>>>0)){break}else{Ma=Cc}}zc=c[u>>2]|0;Ac=Cc;Bc=Cc}if(!(Fa>>>0<zc>>>0)){ga=164;break}else{La=Bc;Da=Ac;ab=zc}}}else{ga=164}}while(0);do{if((ga|0)==164){ga=0;if(!qa){break}yja(da);zja(da,18,46);zja(da,17,3);zja(da,0,4)}}while(0);ab=Aa+1|0;Da=(ab|0)==3;La=(Da<<31>>31)+ra|0;Fa=Da?0:ab;xa=xa+1|0;if(!(xa>>>0<(c[sa>>2]|0)>>>0)){ya=La;za=Fa;break}else{ra=La;Aa=Fa}}}ta=c[ja>>2]|0;ua=ya;va=za}$=$+1|0;if(!($>>>0<ta>>>0)){break}else{aa=ta;ka=ua;ia=va}}}ia=(c[ea>>2]|0)-(c[N>>2]|0)|0;ka=(c[fa>>2]|0)-(c[O>>2]|0)|0;aa=c[M>>2]|0;if((aa&1|0)==0){Ec=ia}else{$=c[o>>2]|0;Ec=(c[$+(E*136|0)+8>>2]|0)+ia-(c[$+(E*136|0)>>2]|0)|0}if((aa&2|0)==0){Fc=ka}else{aa=c[o>>2]|0;Fc=(c[aa+(E*136|0)+12>>2]|0)+ka-(c[aa+(E*136|0)+4>>2]|0)|0}aa=c[s>>2]|0;ka=c[t>>2]|0;$=c[u>>2]|0;ia=c[p>>2]|0;if((ia|0)!=0?(ja=1<<ia,($|0)!=0):0){ia=(ka|0)==0;da=0;do{if(!ia){oa=ca(da,ka)|0;_=0;do{na=aa+(_+oa<<2)|0;pa=c[na>>2]|0;ma=(pa|0)>-1?pa:0-pa|0;if((ma|0)>=(ja|0)){ba=ma>>c[p>>2];c[na>>2]=(pa|0)<0?0-ba|0:ba}_=_+1|0}while((_|0)!=(ka|0))}da=da+1|0}while((da|0)!=($|0))}da=(ca(Fc,k)|0)+Ec|0;ja=c[h>>2]|0;ia=($|0)==0;if((c[v>>2]|0)==1){if(!ia){fa=(ka|0)==0;ea=0;do{if(!fa){_=ca(ea,ka)|0;oa=(ca(ea,k)|0)+da|0;ba=0;do{c[ja+(oa+ba<<2)>>2]=(c[aa+(ba+_<<2)>>2]|0)/2|0;ba=ba+1|0}while((ba|0)!=(ka|0))}ea=ea+1|0}while((ea|0)!=($|0))}}else{if(!ia){ea=(ka|0)==0;fa=aa;ba=0;_=ja+(da<<2)|0;while(1){if(ea){Gc=fa}else{oa=fa;pa=0;na=_;while(1){g[na>>2]=+(c[oa>>2]|0)*+g[P>>2];pa=pa+1|0;if((pa|0)==(ka|0)){break}else{oa=oa+4|0;na=na+4|0}}Gc=fa+(ka<<2)|0}ba=ba+1|0;if((ba|0)==($|0)){break}else{fa=Gc;_=_+(k<<2)|0}}}}T=T+1|0}while(T>>>0<(ca(c[V>>2]|0,c[U>>2]|0)|0)>>>0);W=c[C>>2]|0;X=c[D>>2]|0}S=S+1|0;if(!(S>>>0<(ca(X,W)|0)>>>0)){break}else{Q=X;R=W}}I=c[z>>2]|0;J=X;K=W}A=A+1|0;if(!(A>>>0<I>>>0)){break}else{F=K;G=J;H=I}}B=c[l>>2]|0}m=m+1|0;if(!(m>>>0<B>>>0)){n=1;ga=202;break}else{x=B}}if((ga|0)==202){i=j;return n|0}return 0}function lja(a,c,d){a=a|0;c=c|0;d=d|0;var f=0,g=0,h=0;f=a+(0-d<<1)|0;g=a+(d<<1)|0;h=a+(~d<<1)|0;b[h>>1]=e[h>>1]|0|2;b[f>>1]=b[f>>1]|b[742704+(c<<1)>>1];f=a+(1-d<<1)|0;b[f>>1]=e[f>>1]|0|4;f=a+ -2|0;b[f>>1]=b[f>>1]|b[742704+(c+2<<1)>>1];b[a>>1]=e[a>>1]|0|4096;f=a+2|0;b[f>>1]=b[f>>1]|b[742704+(c+4<<1)>>1];f=a+(d+ -1<<1)|0;b[f>>1]=e[f>>1]|0|1;b[g>>1]=b[g>>1]|b[742704+(c+6<<1)>>1];c=a+(d+1<<1)|0;b[c>>1]=e[c>>1]|0|8;return}function mja(a,e,f,g,h){a=a|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0;j=i;k=c[a>>2]|0;l=b[e>>1]|0;if((l&20480|0)==0?(m=k+100|0,c[m>>2]=k+(d[743232+(l&255|g<<8)>>0]<<2)+24,(Cja(k)|0)!=0):0){g=l>>>4&255;c[m>>2]=k+(d[742976+g>>0]<<2)+24;m=Cja(k)|0;k=d[742720+g>>0]|0;c[f>>2]=(m|0)!=(k|0)?0-h|0:h;lja(e,k^m,c[a+32>>2]|0)}b[e>>1]=b[e>>1]&49151;i=j;return}function nja(a,d,f,g,h){a=a|0;d=d|0;f=f|0;g=g|0;h=h|0;var j=0,k=0;j=i;k=b[d>>1]|0;if((k&20480|0)!=4096){i=j;return}c[a+100>>2]=a+(((k&8192|0)!=0?16:(k&255|0)!=0?15:14)<<2)+24;k=(Cja(a)|0)!=0;a=k?g:h;h=c[f>>2]|0;c[f>>2]=((h|0)<0?0-a|0:a)+h;b[d>>1]=e[d>>1]|8192;i=j;return}function oja(a,f,g,h,j){a=a|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0;k=i;l=c[a>>2]|0;m=b[f>>1]|0;n=m&255;if(!((n|0)!=0&(m&20480|0)==0)){i=k;return}o=l+100|0;c[o>>2]=l+(d[743232+(n|h<<8)>>0]<<2)+24;if((Cja(l)|0)!=0){h=m>>>4&255;c[o>>2]=l+(d[742976+h>>0]<<2)+24;o=Cja(l)|0;l=d[742720+h>>0]|0;c[g>>2]=(o|0)!=(l|0)?0-j|0:j;lja(f,l^o,c[a+32>>2]|0)}b[f>>1]=e[f>>1]|16384;i=k;return}function pja(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0;h=i;i=i+48|0;j=h;k=h+40|0;l=h+36|0;m=h+32|0;n=h+28|0;o=c[a>>2]|0;p=a+4|0;a=c[p>>2]|0;r=c[a+68>>2]|0;s=r+(b*5632|0)|0;t=r+(b*5632|0)+420|0;u=(c[t>>2]|0)+1|0;v=Qca(o,a,b)|0;if((v|0)==0){w=0;i=h;return w|0}a=o+16|0;x=r+(b*5632|0)+12|0;b=d+20|0;d=o+24|0;o=g;g=e;r=v;y=0;a:while(1){z=c[a>>2]<<2;A=u2a(z)|0;if((A|0)==0){B=4;break}f3a(A|0,1,z|0)|0;if((Uca(r)|0)==0){C=o;D=g}else{E=r+24|0;F=r+28|0;z=r+36|0;G=r+32|0;H=o;I=g;while(1){if((c[x>>2]|0)>>>0>(c[z>>2]|0)>>>0){J=c[E>>2]|0;K=c[b>>2]|0;if((c[F>>2]|0)>>>0<(c[K+(J*44|0)+20>>2]|0)>>>0){c[A+(J<<2)>>2]=0;c[l>>2]=0;if((sja(c[p>>2]|0,c[b>>2]|0,s,r,k,I,l,H)|0)==0){B=40;break a}L=c[l>>2]|0;if((c[k>>2]|0)==0){M=L}else{J=I+L|0;c[l>>2]=0;N=c[F>>2]|0;O=c[(c[b>>2]|0)+((c[E>>2]|0)*44|0)+24>>2]|0;P=O+(N*136|0)+24|0;Q=c[P>>2]|0;b:do{if((Q|0)==0){R=J}else{S=I+H|0;T=Q;U=0;V=O+(N*136|0)+28|0;W=J;while(1){X=c[G>>2]|0;Y=c[V+20>>2]|0;if(((c[V+8>>2]|0)!=(c[V>>2]|0)?(c[V+12>>2]|0)!=(c[V+4>>2]|0):0)?(Z=ca(c[Y+(X*40|0)+20>>2]|0,c[Y+(X*40|0)+16>>2]|0)|0,(Z|0)!=0):0){_=0;$=c[Y+(X*40|0)+24>>2]|0;X=W;while(1){Y=$+40|0;if((c[Y>>2]|0)==0){aa=X}else{ba=$+44|0;da=c[ba>>2]|0;do{if((da|0)==0){ea=c[$+4>>2]|0;c[ba>>2]=1;c[$+36>>2]=0;fa=ea}else{ea=da+ -1|0;ga=c[$+4>>2]|0;if((c[ga+(ea<<5)+8>>2]|0)!=(c[ga+(ea<<5)+20>>2]|0)){fa=ga+(ea<<5)|0;break}c[ba>>2]=da+1;fa=ga+(da<<5)|0}}while(0);da=$+36|0;ha=$+32|0;ga=fa+28|0;ea=c[ga>>2]|0;if((X+ea|0)>>>0>S>>>0){ia=ea;B=24;break a}else{ja=ea;ka=ga;la=X;ma=fa}while(1){ga=c[da>>2]|0;ea=ga+ja|0;na=c[$>>2]|0;if(ea>>>0>(c[ha>>2]|0)>>>0){oa=x2a(na,ea)|0;if((oa|0)==0){B=27;break a}ea=c[da>>2]|0;c[ha>>2]=(c[ka>>2]|0)+ea;c[$>>2]=oa;pa=oa;qa=ea;ra=c[ka>>2]|0}else{pa=na;qa=ga;ra=ja}c3a(pa+qa|0,la|0,ra|0)|0;ga=ma+8|0;na=c[ga>>2]|0;if((na|0)==0){c[ma>>2]=$;c[ma+4>>2]=c[da>>2]}ea=c[ka>>2]|0;sa=la+ea|0;oa=c[ma+24>>2]|0;c[ga>>2]=oa+na;c[Y>>2]=(c[Y>>2]|0)-oa;c[ma+12>>2]=c[ga>>2];c[da>>2]=(c[da>>2]|0)+(c[ka>>2]|0);ga=ma+16|0;c[ga>>2]=(c[ga>>2]|0)+(c[ka>>2]|0);ta=c[ba>>2]|0;if((c[Y>>2]|0)==0){break}c[ba>>2]=ta+1;ga=ma+60|0;oa=c[ga>>2]|0;if((la+(oa+ea)|0)>>>0>S>>>0){ia=oa;B=24;break a}ja=oa;ka=ga;la=sa;ma=ma+32|0}c[$+48>>2]=ta;aa=sa}ba=_+1|0;if(ba>>>0<Z>>>0){_=ba;$=$+56|0;X=aa}else{break}}ua=c[P>>2]|0;va=aa}else{ua=T;va=W}X=U+1|0;if(!(X>>>0<ua>>>0)){R=va;break b}T=ua;U=X;V=V+36|0;W=va}}}while(0);P=R-J|0;c[l>>2]=P;M=P+L|0}P=c[F>>2]|0;N=(c[d>>2]|0)+((c[E>>2]|0)*52|0)+36|0;O=c[N>>2]|0;c[N>>2]=P>>>0>O>>>0?P:O;wa=M}else{xa=K;B=42}}else{xa=c[b>>2]|0;B=42}if((B|0)==42){B=0;c[n>>2]=0;if((sja(c[p>>2]|0,xa,s,r,m,I,n,H)|0)==0){B=66;break a}O=c[n>>2]|0;if((c[m>>2]|0)==0){wa=O}else{ya=H-O|0;P=c[F>>2]|0;N=c[(c[b>>2]|0)+((c[E>>2]|0)*44|0)+24>>2]|0;c[n>>2]=0;Q=N+(P*136|0)+24|0;W=c[Q>>2]|0;if((W|0)==0){za=0}else{V=W;Aa=0;W=N+(P*136|0)+28|0;while(1){P=c[G>>2]|0;N=c[W+20>>2]|0;if(((c[W+8>>2]|0)!=(c[W>>2]|0)?(c[W+12>>2]|0)!=(c[W+4>>2]|0):0)?(T=ca(c[N+(P*40|0)+20>>2]|0,c[N+(P*40|0)+16>>2]|0)|0,(T|0)!=0):0){Ba=0;S=c[N+(P*40|0)+24>>2]|0;while(1){P=S+40|0;c:do{if((c[P>>2]|0)!=0){N=S+44|0;X=c[N>>2]|0;do{if((X|0)!=0){Z=X+ -1|0;ba=c[S+4>>2]|0;if((c[ba+(Z<<5)+8>>2]|0)==(c[ba+(Z<<5)+20>>2]|0)){c[N>>2]=X+1;Ca=ba+(X<<5)|0;break}else{Ca=ba+(Z<<5)|0;break}}else{Z=c[S+4>>2]|0;c[N>>2]=1;c[S+36>>2]=0;Ca=Z}}while(0);X=c[Ca+28>>2]|0;Z=X+(c[n>>2]|0)|0;if(Z>>>0>ya>>>0){Da=X;B=63;break a}else{Ea=Z;Fa=Ca}while(1){c[n>>2]=Ea;Z=c[Fa+24>>2]|0;X=Fa+8|0;c[X>>2]=(c[X>>2]|0)+Z;X=c[P>>2]|0;c[P>>2]=X-Z;if((X|0)==(Z|0)){break c}c[N>>2]=(c[N>>2]|0)+1;Z=c[Fa+60>>2]|0;Ea=Z+(c[n>>2]|0)|0;if(Ea>>>0>ya>>>0){Da=Z;B=63;break a}else{Fa=Fa+32|0}}}}while(0);P=Ba+1|0;if(P>>>0<T>>>0){Ba=P;S=S+56|0}else{break}}Ga=c[Q>>2]|0}else{Ga=V}S=Aa+1|0;if(!(S>>>0<Ga>>>0)){break}V=Ga;Aa=S;W=W+36|0}za=c[n>>2]|0}wa=za+O|0}}W=c[E>>2]|0;if((c[A+(W<<2)>>2]|0)!=0?(V=(c[d>>2]|0)+(W*52|0)+36|0,(c[V>>2]|0)==0):0){c[V>>2]=(c[(c[b>>2]|0)+(W*44|0)+20>>2]|0)+ -1}W=I+wa|0;V=H-wa|0;if((Uca(r)|0)==0){C=V;D=W;break}else{H=V;I=W}}}v2a(A);y=y+1|0;if(y>>>0>(c[t>>2]|0)>>>0){B=72;break}else{o=C;g=D;r=r+232|0}}if((B|0)==4){Tca(v,u);w=0;i=h;return w|0}else if((B|0)==24){r=c[q>>2]|0;g=c[G>>2]|0;C=c[F>>2]|0;o=c[E>>2]|0;c[j>>2]=ia;c[j+4>>2]=H-L;c[j+8>>2]=_;c[j+12>>2]=g;c[j+16>>2]=U;c[j+20>>2]=C;c[j+24>>2]=o;lc(r|0,744456,j|0)|0;B=40}else if((B|0)==27){v2a(c[$>>2]|0);c[ha>>2]=0;B=40}else if((B|0)==63){ha=c[q>>2]|0;$=c[G>>2]|0;G=c[F>>2]|0;F=c[E>>2]|0;c[j>>2]=Da;c[j+4>>2]=ya;c[j+8>>2]=Ba;c[j+12>>2]=$;c[j+16>>2]=Aa;c[j+20>>2]=G;c[j+24>>2]=F;lc(ha|0,744256,j|0)|0;B=66}else if((B|0)==72){Tca(v,u);c[f>>2]=D-e;w=1;i=h;return w|0}if((B|0)==40){Tca(v,u);v2a(A);w=0;i=h;return w|0}else if((B|0)==66){Tca(v,u);v2a(A);w=0;i=h;return w|0}return 0}function qja(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=u2a(8)|0;if((e|0)==0){f=0;i=d;return f|0}g=e;c[g>>2]=0;c[g+4>>2]=0;c[e>>2]=a;c[e+4>>2]=b;f=e;i=d;return f|0}function rja(a){a=a|0;var b=0;b=i;if((a|0)!=0){v2a(a)}i=b;return}function sja(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0;l=i;i=i+16|0;m=l+4|0;n=l;c[n>>2]=h;o=c[f+28>>2]|0;p=f+24|0;r=c[d+((c[p>>2]|0)*44|0)+24>>2]|0;d=f+36|0;a:do{if((c[d>>2]|0)==0?(s=r+(o*136|0)+24|0,t=c[s>>2]|0,(t|0)!=0):0){u=f+32|0;v=t;t=1;w=r+(o*136|0)+28|0;while(1){x=c[u>>2]|0;y=c[w+20>>2]|0;if((c[w+8>>2]|0)!=(c[w>>2]|0)?(c[w+12>>2]|0)!=(c[w+4>>2]|0):0){fda(c[y+(x*40|0)+32>>2]|0);fda(c[y+(x*40|0)+36>>2]|0);z=ca(c[y+(x*40|0)+20>>2]|0,c[y+(x*40|0)+16>>2]|0)|0;if((z|0)!=0){A=0;B=c[y+(x*40|0)+24>>2]|0;while(1){c[B+44>>2]=0;c[B+48>>2]=0;A=A+1|0;if((A|0)==(z|0)){break}else{B=B+56|0}}}C=c[s>>2]|0}else{C=v}if(!(t>>>0<C>>>0)){break a}v=C;t=t+1|0;w=w+36|0}}}while(0);do{if((c[e>>2]&2|0)!=0){if(k>>>0<6){lb(744568)|0;break}C=c[n>>2]|0;if((a[C>>0]|0)==-1?(a[C+1>>0]|0)==-111:0){c[n>>2]=C+6;break}lb(744544)|0;Jb(744344,28,1,c[q>>2]|0)|0}}while(0);C=Ria()|0;if((C|0)==0){D=0;i=l;return D|0}do{if((a[b+92>>0]&1)==0){if((a[e+5628>>0]&1)==0){w=c[n>>2]|0;c[m>>2]=h+k-w;E=w;F=n;G=m;break}else{w=e+5160|0;E=c[w>>2]|0;F=w;G=e+5172|0;break}}else{w=b+32|0;E=c[w>>2]|0;F=w;G=b+36|0}}while(0);Uia(C,E,c[G>>2]|0);if((Via(C,1)|0)==0){Wia(C)|0;b=Tia(c[C>>2]|0,c[C+8>>2]|0)|0;m=E+b|0;Sia(C);do{if((c[e>>2]&4|0)==0){H=m}else{if(k>>>0<2){Jb(744376,41,1,c[q>>2]|0)|0;H=m;break}if((a[m>>0]|0)==-1?(a[E+(b+1)>>0]|0)==-110:0){H=E+(b+2)|0;break}Jb(744424,28,1,c[q>>2]|0)|0;H=m}}while(0);m=c[F>>2]|0;b=H-m|0;c[G>>2]=(c[G>>2]|0)-b;c[F>>2]=m+b;c[g>>2]=0;c[j>>2]=(c[n>>2]|0)-h;D=1;i=l;return D|0}b=r+(o*136|0)+24|0;m=c[b>>2]|0;b:do{if((m|0)!=0){H=f+32|0;w=e+5576|0;t=m;v=1;s=r+(o*136|0)+28|0;c:while(1){u=c[H>>2]|0;B=c[s+20>>2]|0;if(((c[s+8>>2]|0)!=(c[s>>2]|0)?(c[s+12>>2]|0)!=(c[s+4>>2]|0):0)?(z=ca(c[B+(u*40|0)+20>>2]|0,c[B+(u*40|0)+16>>2]|0)|0,(z|0)!=0):0){A=B+(u*40|0)+32|0;x=B+(u*40|0)+36|0;y=s+28|0;I=0;J=c[B+(u*40|0)+24>>2]|0;while(1){u=J+44|0;if((c[u>>2]|0)==0){K=ida(C,c[(c[A>>2]|0)+12>>2]|0,I,(c[d>>2]|0)+1|0)|0}else{K=Via(C,1)|0}d:do{if((K|0)==0){c[J+40>>2]=0}else{if((c[u>>2]|0)==0){B=0;while(1){if((ida(C,c[(c[x>>2]|0)+12>>2]|0,I,B)|0)==0){B=B+1|0}else{break}}c[J+24>>2]=1-B+(c[y>>2]|0);c[J+28>>2]=3}do{if((Via(C,1)|0)!=0){if((Via(C,1)|0)!=0){L=Via(C,2)|0;if((L|0)!=3){M=L+3|0;break}L=Via(C,5)|0;if((L|0)==31){M=(Via(C,7)|0)+37|0;break}else{M=L+6|0;break}}else{M=2}}else{M=1}}while(0);B=J+40|0;c[B>>2]=M;L=0;while(1){if((Via(C,1)|0)==0){break}else{L=L+1|0}}N=J+28|0;c[N>>2]=(c[N>>2]|0)+L;O=c[u>>2]|0;do{if((O|0)!=0){P=O+ -1|0;Q=J+4|0;R=c[Q>>2]|0;if((c[R+(P<<5)+8>>2]|0)!=(c[R+(P<<5)+20>>2]|0)){S=Q;T=P;break}if((tja(J,O,c[(c[w>>2]|0)+((c[p>>2]|0)*1080|0)+16>>2]|0,0)|0)==0){U=63;break c}else{S=Q;T=O}}else{if((tja(J,0,c[(c[w>>2]|0)+((c[p>>2]|0)*1080|0)+16>>2]|0,1)|0)==0){U=60;break c}S=J+4|0;T=0}}while(0);O=T;L=c[B>>2]|0;while(1){Q=c[S>>2]|0;P=(c[Q+(O<<5)+20>>2]|0)-(c[Q+(O<<5)+8>>2]|0)|0;c[Q+(O<<5)+24>>2]=(P|0)<(L|0)?P:L;P=c[N>>2]|0;Q=c[(c[S>>2]|0)+(O<<5)+24>>2]|0;if(Q>>>0>1){R=Q;Q=0;while(1){V=Q+1|0;if(R>>>0>3){R=R>>>1;Q=V}else{W=V;break}}}else{W=0}Q=Via(C,W+P|0)|0;c[(c[S>>2]|0)+(O<<5)+28>>2]=Q;L=L-(c[(c[S>>2]|0)+(O<<5)+24>>2]|0)|0;if((L|0)<=0){break d}O=O+1|0;if((tja(J,O,c[(c[w>>2]|0)+((c[p>>2]|0)*1080|0)+16>>2]|0,0)|0)==0){U=69;break c}}}}while(0);I=I+1|0;if(!(I>>>0<z>>>0)){break}else{J=J+56|0}}X=c[b>>2]|0}else{X=t}if(!(v>>>0<X>>>0)){break b}t=X;v=v+1|0;s=s+36|0}if((U|0)==60){Sia(C);D=0;i=l;return D|0}else if((U|0)==63){Sia(C);D=0;i=l;return D|0}else if((U|0)==69){Sia(C);D=0;i=l;return D|0}}}while(0);if((Wia(C)|0)==0){Sia(C);D=0;i=l;return D|0}U=Tia(c[C>>2]|0,c[C+8>>2]|0)|0;X=E+U|0;Sia(C);do{if((c[e>>2]&4|0)==0){Y=X}else{if(k>>>0<2){Jb(744376,41,1,c[q>>2]|0)|0;Y=X;break}if((a[X>>0]|0)==-1?(a[E+(U+1)>>0]|0)==-110:0){Y=E+(U+2)|0;break}Jb(744424,28,1,c[q>>2]|0)|0;Y=X}}while(0);X=c[F>>2]|0;U=Y-X|0;c[G>>2]=(c[G>>2]|0)-U;c[F>>2]=X+U;c[g>>2]=1;c[j>>2]=(c[n>>2]|0)-h;D=1;i=l;return D|0}function tja(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;g=a+52|0;h=c[g>>2]|0;do{if((b+1|0)>>>0>h>>>0){j=h+10|0;c[g>>2]=j;k=a+4|0;l=x2a(c[k>>2]|0,j<<5)|0;if((l|0)!=0){c[k>>2]=l;m=l;break}v2a(c[k>>2]|0);c[k>>2]=0;c[g>>2]=0;n=0;i=f;return n|0}else{m=c[a+4>>2]|0}}while(0);a=m+(b<<5)|0;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;c[a+24>>2]=0;c[a+28>>2]=0;if((d&4|0)!=0){c[m+(b<<5)+20>>2]=1;n=1;i=f;return n|0}if((d&1|0)==0){c[m+(b<<5)+20>>2]=109;n=1;i=f;return n|0}if((e|0)!=0){c[m+(b<<5)+20>>2]=10;n=1;i=f;return n|0}e=c[m+(b+ -1<<5)+20>>2]|0;if((e|0)==1){o=2}else{o=(e|0)==10?2:1}c[m+(b<<5)+20>>2]=o;n=1;i=f;return n|0}function uja(a){a=a|0;var b=0,d=0,f=0.0;b=i;d=a&65535;a=d>>>10;f=(c[k>>2]=(c[752936+(a<<2)>>2]|0)+(c[744744+((e[744616+(a<<1)>>1]|0)+(d&1023)<<2)>>2]|0),+g[k>>2]);i=b;return+f}function vja(a){a=+a;var b=0,f=0,h=0;b=i;f=(g[k>>2]=a,c[k>>2]|0);h=f>>>23;i=b;return((f&8388607)>>>(d[754216+h>>0]|0))+(e[753192+(h<<1)>>1]|0)&65535|0}function wja(){var a=0,b=0;a=i;b=u2a(104)|0;i=a;return b|0}function xja(a){a=a|0;var b=0;b=i;if((a|0)!=0){v2a(a)}i=b;return}function yja(a){a=a|0;var b=0,d=0;b=i;d=0;do{c[a+(d<<2)+24>>2]=754728;d=d+1|0}while((d|0)!=19);i=b;return}function zja(a,b,d){a=a|0;b=b|0;d=d|0;c[a+(b<<2)+24>>2]=754728+(d<<1<<4);return}function Aja(a,b,e){a=a|0;b=b|0;e=e|0;var f=0;f=i;c[a+100>>2]=a+24;c[a+16>>2]=b;c[a+20>>2]=b+e;c[a+12>>2]=b;if((e|0)==0){c[a>>2]=16711680}else{c[a>>2]=(d[b>>0]|0)<<16}Bja(a);c[a>>2]=c[a>>2]<<7;b=a+8|0;c[b>>2]=(c[b>>2]|0)+ -7;c[a+4>>2]=32768;i=f;return}function Bja(b){b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;f=b+12|0;g=c[f>>2]|0;h=c[b+20>>2]|0;if((g|0)==(h|0)){c[b>>2]=(c[b>>2]|0)+65280;c[b+8>>2]=8;i=e;return}j=g+1|0;if((j|0)==(h|0)){k=255}else{k=d[j>>0]|0}if(!((a[g>>0]|0)==-1)){c[f>>2]=j;c[b>>2]=(c[b>>2]|0)+(k<<8);c[b+8>>2]=8;i=e;return}if(k>>>0>143){c[b>>2]=(c[b>>2]|0)+65280;c[b+8>>2]=8;i=e;return}else{c[f>>2]=j;c[b>>2]=(c[b>>2]|0)+(k<<9);c[b+8>>2]=7;i=e;return}}function Cja(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;b=i;d=c[a+100>>2]|0;e=a+4|0;f=(c[e>>2]|0)-(c[c[d>>2]>>2]|0)|0;c[e>>2]=f;g=c[a>>2]|0;h=c[c[d>>2]>>2]|0;if(g>>>16>>>0<h>>>0){c[e>>2]=h;e=c[d>>2]|0;j=c[e+4>>2]|0;if(f>>>0<h>>>0){k=j;l=e+8|0}else{k=1-j|0;l=e+12|0}c[d>>2]=c[l>>2];Dja(a);m=k;i=b;return m|0}c[a>>2]=g-(h<<16);h=c[d>>2]|0;if((f&32768|0)!=0){m=c[h+4>>2]|0;i=b;return m|0}g=c[h+4>>2]|0;if(f>>>0<(c[h>>2]|0)>>>0){n=1-g|0;o=h+12|0}else{n=g;o=h+8|0}c[d>>2]=c[o>>2];Dja(a);m=n;i=b;return m|0}function Dja(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=a+8|0;e=a+4|0;f=c[d>>2]|0;do{if((f|0)==0){Bja(a);g=c[d>>2]|0}else{g=f}h=c[e>>2]<<1;c[e>>2]=h;c[a>>2]=c[a>>2]<<1;f=g+ -1|0;c[d>>2]=f}while(h>>>0<32768);i=b;return}function Eja(){var a=0,b=0;a=i;b=u2a(28)|0;i=a;return b|0}function Fja(a){a=a|0;var b=0;b=i;if((a|0)!=0){v2a(a)}i=b;return}function Gja(b,d,e){b=b|0;d=d|0;e=e|0;c[b+20>>2]=d;c[b+8>>2]=e;c[b+12>>2]=0;a[b>>0]=0;c[b+4>>2]=0;return}function Hja(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;e=b+4|0;f=c[e>>2]|0;do{if((f|0)==0){c[e>>2]=8;g=b+12|0;h=c[g>>2]|0;if((h|0)==(c[b+8>>2]|0)){a[b>>0]=-1;j=8;k=-1;break}if((a[b>>0]|0)==-1){c[e>>2]=7;l=7}else{l=8}m=a[(c[b+20>>2]|0)+h>>0]|0;a[b>>0]=m;c[g>>2]=h+1;j=l;k=m}else{j=f;k=a[b>>0]|0}}while(0);b=j+ -1|0;c[e>>2]=b;i=d;return(k&255)>>>b&1|0}function Ija(a,b){a=a|0;b=b|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=b>>>0>268435456?4:b;return}function Jja(a){a=a|0;var b=0;b=i;v2a(a);i=b;return}function Kja(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;i=i+16|0;e=d+8|0;f=d;g=c[a>>2]|0;if((b|0)<1){v2a(g);c[a>>2]=0;c[a+8>>2]=0;c[a+4>>2]=0;h=(b|0)==0&1;i=d;return h|0}if((g|0)==0){c[e>>2]=b;j=e+4|0;c[j>>2]=0;Lja(e,c[a+12>>2]|0);if((c[j>>2]|0)!=0){c[a+8>>2]=0;c[a+4>>2]=0;h=0;i=d;return h|0}j=w2a(ZJ(c[e>>2]|0,0)|0,1)|0;c[a>>2]=j;e=a+8|0;if((j|0)==0){c[e>>2]=0;c[a+4>>2]=0;h=0;i=d;return h|0}else{c[e>>2]=b;c[a+4>>2]=b;h=1;i=d;return h|0}}e=a+8|0;j=c[e>>2]|0;if((j|0)>=(b|0)){k=a+4|0;l=c[k>>2]|0;if((l|0)<(b|0)){m=c[a+12>>2]|0;f3a(g+(ca(m,l)|0)|0,0,ca(m,b-l|0)|0)|0}c[k>>2]=b;h=1;i=d;return h|0}k=(j|0)>(b|0)?j:b;c[f>>2]=k;j=f+4|0;c[j>>2]=0;l=a+12|0;Lja(f,c[l>>2]|0);if((c[j>>2]|0)!=0){h=0;i=d;return h|0}j=a+4|0;if((k|0)<(c[j>>2]|0)){h=0;i=d;return h|0}m=c[a>>2]|0;g=x2a(m,ZJ(c[f>>2]|0,0)|0)|0;if((g|0)==0){h=0;i=d;return h|0}f=c[j>>2]|0;m=c[l>>2]|0;f3a(g+(ca(m,f)|0)|0,0,ca(k-f|0,m)|0)|0;c[a>>2]=g;c[j>>2]=b;c[e>>2]=k;h=1;i=d;return h|0}function Lja(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;f=d+8|0;c[f>>2]=b;c[f+4>>2]=0;_ja(e,a,f);f=e;e=c[f+4>>2]|0;b=a;c[b>>2]=c[f>>2];c[b+4>>2]=e;i=d;return}function Mja(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+16|0;e=d;f=c[a+4>>2]|0;c[e>>2]=f;g=e+4|0;c[g>>2]=0;h=b+4|0;YJ(e,c[h>>2]|0);j=a+12|0;if((c[j>>2]|0)!=(c[b+12>>2]|0)){i=d;return}if((c[g>>2]|0)!=0){i=d;return}if((Kja(a,ZJ(c[e>>2]|0,0)|0)|0)==0){i=d;return}e=c[j>>2]|0;j=(c[a>>2]|0)+(ca(e,f)|0)|0;c3a(j|0,c[b>>2]|0,ca(c[h>>2]|0,e)|0)|0;i=d;return}function Nja(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;if((b|0)<0){e=0;i=d;return e|0}f=c[a+4>>2]|0;do{if((f|0)>(b|0)){if((Kja(a,f+1|0)|0)==0){e=0;i=d;return e|0}else{g=c[a>>2]|0;h=a+12|0;j=c[h>>2]|0;d3a(g+(ca(j,b+1|0)|0)|0,g+(ca(j,b)|0)|0,ca(j,f-b|0)|0)|0;j=c[h>>2]|0;f3a((c[a>>2]|0)+(ca(j,b)|0)|0,0,j|0)|0;k=h;l=a;break}}else{if((Kja(a,b+1|0)|0)==0){e=0;i=d;return e|0}else{k=a+12|0;l=a;break}}}while(0);e=(c[l>>2]|0)+(ca(c[k>>2]|0,b)|0)|0;i=d;return e|0}function Oja(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;if((b|0)<0){i=d;return}e=a+4|0;f=c[e>>2]|0;g=b+1|0;if((f|0)<(g|0)){i=d;return}if((f|0)==(g|0)){h=f}else{j=c[a>>2]|0;k=c[a+12>>2]|0;d3a(j+(ca(k,b)|0)|0,j+(ca(k,g)|0)|0,ca(k,f-g|0)|0)|0;h=c[e>>2]|0}c[e>>2]=h+ -1;i=d;return}function Pja(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;if(((b|0)>=0?(c[a+4>>2]|0)>(b|0):0)?(e=c[a>>2]|0,(e|0)!=0):0){f=e+(ca(c[a+12>>2]|0,b)|0)|0}else{f=0}i=d;return f|0}function Qja(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;c[d>>2]=e;b[d+4>>1]=f;a[d+6>>0]=g;a[d+7>>0]=0;c[d+8>>2]=0;c[d+12>>2]=0;return}function Rja(a){a=a|0;var b=0;b=i;Sja(a);i=b;return}function Sja(b){b=b|0;var e=0,f=0,g=0,h=0;e=i;f=b+12|0;g=c[f>>2]|0;if((g|0)==0){i=e;return}h=b+7|0;Tja(d[h>>0]|0,d[b+6>>0]|0,g);c[f>>2]=0;a[h>>0]=0;c[b+8>>2]=0;i=e;return}function Tja(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;if((a|0)==0){v2a(d);i=e;return}if((b|0)>0){f=a+ -1|0;a=0;do{g=c[d+(a<<2)>>2]|0;if((g|0)!=0){Tja(f,b,g)}a=a+1|0}while((a|0)!=(b|0))}v2a(d);i=e;return}function Uja(e){e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;f=i;g=e+8|0;h=c[g>>2]|0;j=b[e+4>>1]|0;if(((h|0)%(j|0)|0|0)!=0){c[g>>2]=h+1;k=Vja(e,h)|0;i=f;return k|0}l=w2a(ca(c[e>>2]|0,j)|0,1)|0;if((l|0)==0){k=0;i=f;return k|0}m=e+12|0;n=c[m>>2]|0;if((n|0)==0){c[m>>2]=l;c[g>>2]=h+1;k=l;i=f;return k|0}o=e+7|0;p=a[o>>0]|0;if(p<<24>>24==0){q=w2a(d[e+6>>0]|0,4)|0;if((q|0)==0){v2a(l);k=0;i=f;return k|0}else{c[q>>2]=n;c[q+4>>2]=l;c[m>>2]=q;c[g>>2]=h+1;a[o>>0]=1;k=l;i=f;return k|0}}q=(h|0)/(j|0)|0;r=e+6|0;s=a[r>>0]|0;t=s&255;u=(q|0)%(t|0)|0;if((u|0)!=0){c[(Wja(e,q)|0)+(u<<2)>>2]=l;c[g>>2]=(c[g>>2]|0)+1;k=l;i=f;return k|0}u=p&255;v=0;w=1;while(1){x=ca(t,w)|0;v=v+1|0;if((v|0)>=(u|0)){break}else{w=x}}do{if((h|0)==(ca(j,x)|0)){u=w2a(t,4)|0;if((u|0)!=0){c[u>>2]=n;c[m>>2]=u;v=p+1<<24>>24;a[o>>0]=v;y=v;z=u;A=x;break}v2a(l);k=0;i=f;return k|0}else{y=p;z=n;A=w}}while(0);a:do{if((y&255)>1){w=s;n=y;p=1;x=z;m=q;t=A;while(1){j=x+(((m|0)/(t|0)|0)<<2)|0;h=c[j>>2]|0;if((h|0)==0){u=w2a(w&255,4)|0;c[j>>2]=u;if((u|0)==0){break}B=a[r>>0]|0;C=a[o>>0]|0;D=u}else{B=w;C=n;D=h}h=(m|0)%(t|0)|0;u=p+1|0;if((u|0)<(C&255|0)){w=B;n=C;p=u;x=D;m=h;t=(t|0)/(B&255|0)|0}else{E=C;F=u;G=D;H=h;break a}}E=a[o>>0]|0;F=p;G=x;H=m}else{E=y;F=1;G=z;H=q}}while(0);if((F|0)<(E&255|0)){v2a(l);Sja(e);k=0;i=f;return k|0}else{c[G+(((H|0)%(d[r>>0]|0)|0)<<2)>>2]=l;c[g>>2]=(c[g>>2]|0)+1;k=l;i=f;return k|0}return 0}function Vja(e,f){e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;if((f|0)<0){h=0;i=g;return h|0}if((c[e+8>>2]|0)<=(f|0)){h=0;i=g;return h|0}if((a[e+7>>0]|0)==0){h=(c[e+12>>2]|0)+(ca(c[e>>2]|0,f)|0)|0;i=g;return h|0}else{j=b[e+4>>1]|0;k=(f|0)/(j|0)|0;l=(k|0)%(d[e+6>>0]|0)|0;m=c[(Wja(e,k)|0)+(l<<2)>>2]|0;h=m+(ca(c[e>>2]|0,(f|0)%(j|0)|0)|0)|0;i=g;return h|0}return 0}function Wja(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;g=a[b+7>>0]|0;if(g<<24>>24==1){h=c[b+12>>2]|0;i=f;return h|0}else if(g<<24>>24==2){h=c[(c[b+12>>2]|0)+(((e|0)/(d[b+6>>0]|0|0)|0)<<2)>>2]|0;i=f;return h|0}else{if(!((g&255)>1)){h=c[b+12>>2]|0;i=f;return h|0}j=d[b+6>>0]|0;k=g&255;g=1;l=1;do{l=ca(j,l)|0;g=g+1|0}while((g|0)<(k|0));g=e;e=1;m=c[b+12>>2]|0;b=l;while(1){e=e+1|0;l=c[m+(((g|0)/(b|0)|0)<<2)>>2]|0;if((e|0)>=(k|0)){h=l;break}else{g=(g|0)%(b|0)|0;m=l;b=(b|0)/(j|0)|0}}i=f;return h|0}return 0}function Xja(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;a:do{if((d|0)>0){g=c[a>>2]|0;h=0;while(1){j=b+(ca(g,h)|0)|0;h=h+1|0;if((dna(e,j)|0)==0){k=j;break a}if((h|0)>=(d|0)){k=0;break}}}else{k=0}}while(0);i=f;return k|0}function Yja(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;j=i;if((e|0)==0){k=c[f>>2]|0;l=(c[d+8>>2]|0)-k|0;m=b[d+4>>1]|0;n=(l|0)>(m|0)?m:l;c[f>>2]=n+k;o=Xja(d,g,n,h)|0;i=j;return o|0}n=e+ -1|0;e=d+6|0;k=a[e>>0]|0;if(k<<24>>24==0){o=0;i=j;return o|0}else{p=k;q=0}while(1){k=c[g+(q<<2)>>2]|0;if((k|0)==0){r=p}else{l=Yja(d,n,f,k,h)|0;if((l|0)!=0){o=l;s=8;break}r=a[e>>0]|0}q=q+1|0;if((q|0)>=(r&255|0)){o=0;s=8;break}else{p=r}}if((s|0)==8){i=j;return o|0}return 0}function Zja(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e;g=c[a+12>>2]|0;if((g|0)==0){h=0;i=e;return h|0}c[f>>2]=0;h=Yja(a,d[a+7>>0]|0,f,g,b)|0;i=e;return h|0}function _ja(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e;c[f>>2]=0;g=$ja(c[b>>2]|0,c[d>>2]|0,f)|0;h=fL(c[b+4>>2]|c[f>>2]|c[d+4>>2])|0;c[a>>2]=g;c[a+4>>2]=fL(h)|0;i=e;return}function $ja(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=o3a(b|0,((b|0)<0)<<31>>31|0,a|0,((a|0)<0)<<31>>31|0)|0;c[d>>2]=aka(f,G)|0;i=e;return f|0}function aka(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=eL((b|0)<0|(b|0)==0&a>>>0<2147483648,(b|0)>-1|(b|0)==-1&a>>>0>2147483647)|0;i=c;return d|0}function bka(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=i;i=i+48|0;e=d+8|0;f=d;yF(f,e,cka(e,b,c)|0);jka(a,f);i=d;return}function cka(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;i=i+32|0;f=e;if((c|0)==0){a[b>>0]=48;g=1;i=e;return g|0}h=(d&1|0)!=0&(c|0)<0;j=h?0-c|0:c;if((d&2|0)==0){k=10;l=756344}else{k=16;l=(d&4|0)==0?756344:756320}if((j|0)==0){m=31}else{d=31;c=j;while(1){j=d+ -1|0;a[f+d>>0]=a[l+((c>>>0)%(k>>>0)|0)>>0]|0;c=(c>>>0)/(k>>>0)|0;if((c|0)==0){m=j;break}else{d=j}}}if(h){a[f+m>>0]=45;n=m+ -1|0}else{n=m}m=31-n|0;if((m|0)<=0){g=m;i=e;return g|0}c3a(b|0,f+(n+1)|0,m|0)|0;g=m;i=e;return g|0}function dka(a){a=a|0;var b=0,d=0;b=i;d=c[a>>2]|0;if((d|0)!=0?(c[d>>2]=(c[d>>2]|0)+ -1,d=c[a>>2]|0,(c[d>>2]|0)<1):0){v2a(d)}i=b;return}function eka(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;if((d|0)<0){if((b|0)!=0){f=Y2a(b|0)|0;g=4}}else{f=d;g=4}if((g|0)==4?(f|0)!=0:0){g=fka(f)|0;c[a>>2]=g;if((g|0)==0){i=e;return}c3a(g+12|0,b|0,f|0)|0;i=e;return}c[a>>2]=0;i=e;return}function fka(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;e=d;if((b|0)<1){f=0;i=d;return f|0}c[e>>2]=b;g=e+4|0;c[g>>2]=0;cla(e,13);h=w2a(ZJ(c[e>>2]|0,c[g>>2]|0)|0,1)|0;if((h|0)==0){f=0;i=d;return f|0}c[h+8>>2]=b;c[h+4>>2]=b;c[h>>2]=1;a[h+(b+12)>>0]=0;f=h;i=d;return f|0}function gka(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;if((d|0)>0){f=fka(d)|0;c[a>>2]=f;if((f|0)!=0){c3a(f+12|0,b|0,d|0)|0}}else{c[a>>2]=0}i=e;return}function hka(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[b>>2]|0;if((e|0)==0){c[a>>2]=0;i=d;return}if((c[e>>2]|0)>-1){c[a>>2]=e;c[e>>2]=(c[e>>2]|0)+1;i=d;return}else{c[a>>2]=0;ika(a,b);i=d;return}}function ika(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=c[a>>2]|0;f=c[b>>2]|0;if((e|0)==(f|0)){i=d;return}if(gl(f)|0){nka(a);i=d;return}if(!((e|0)!=0?(c[e>>2]|0)<0:0)){g=6}do{if((g|0)==6){if((f|0)!=0?(c[f>>2]|0)<0:0){break}nka(a);e=c[b>>2]|0;c[a>>2]=e;if((e|0)==0){i=d;return}c[e>>2]=(c[e>>2]|0)+1;i=d;return}}while(0);oka(a,c[f+4>>2]|0,f+12|0);i=d;return}function jka(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=(c[b+4>>2]|0)==0;c[a>>2]=0;if(e){i=d;return}kka(a,b);i=d;return}function kka(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[b+4>>2]|0;if((e|0)==0){nka(a);i=d;return}else{oka(a,e,c[b>>2]|0);i=d;return}}function lka(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;c[a>>2]=0;f=b+4|0;g=d+4|0;h=(c[g>>2]|0)+(c[f>>2]|0)|0;if((h|0)==0){i=e;return}j=fka(h)|0;c[a>>2]=j;if((j|0)==0){i=e;return}a=c[f>>2]|0;c3a(j+12|0,c[b>>2]|0,a|0)|0;c3a(j+a+12|0,c[d>>2]|0,c[g>>2]|0)|0;i=e;return}function mka(b,c){b=b|0;c=c|0;var d=0;d=i;if((c|0)!=0?(a[c>>0]|0)!=0:0){oka(b,Y2a(c|0)|0,c);i=d;return}nka(b);i=d;return}function nka(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;if((d|0)==0){i=b;return}e=c[d>>2]|0;if((e|0)>1){c[d>>2]=e+ -1}else{v2a(d)}c[a>>2]=0;i=b;return}function oka(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=i;yka(b,d);c3a((c[b>>2]|0)+12|0,e|0,d|0)|0;c[(c[b>>2]|0)+4>>2]=d;a[(c[b>>2]|0)+d+12>>0]=0;i=f;return}function pka(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;qka(a,b,c);i=d;return}function qka(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;nka(a);if((d|0)==0){c[a>>2]=0;i=e;return}f=fka(d)|0;c[a>>2]=f;if((f|0)==0){i=e;return}c3a(f+12|0,b|0,d|0)|0;i=e;return}function rka(a,b){a=a|0;b=b|0;var c=0;c=i;if((b|0)==0){i=c;return}ska(a,Y2a(b|0)|0,b);i=c;return}function ska(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;if((d|0)==0|(e|0)==0){i=f;return}g=c[b>>2]|0;if((g|0)==0){h=fka(d)|0;c[b>>2]=h;if((h|0)==0){i=f;return}c3a(h+12|0,e|0,d|0)|0;i=f;return}h=c[g+4>>2]|0;if((c[g>>2]|0)<=1?(h+d|0)<=(c[g+8>>2]|0):0){c3a(g+h+12|0,e|0,d|0)|0;j=(c[b>>2]|0)+4|0;c[j>>2]=(c[j>>2]|0)+d;j=c[b>>2]|0;a[j+(c[j+4>>2]|0)+12>>0]=0;i=f;return}Dka(b,h,g+12|0,d,e);Eka(g);i=f;return}function tka(b,c){b=b|0;c=c|0;var d=0,e=0;d=i;i=i+16|0;e=d;a[e>>0]=c;ska(b,1,e);i=d;return}function uka(a,b){a=a|0;b=b|0;var d=0;d=i;if((b|0)==0){i=d;return}ska(a,c[b+4>>2]|0,b+12|0);i=d;return}function vka(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;if((a|0)==0){e=(c[b+4>>2]|0)==0;i=d;return e|0}f=c[a+4>>2]|0;if((f|0)!=(c[b+4>>2]|0)){e=0;i=d;return e|0}e=(Q2a(a+12|0,c[b>>2]|0,f)|0)==0;i=d;return e|0}function wka(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[b>>2]|0;if((a|0)!=0){if((e|0)!=0?(b=c[a+4>>2]|0,(b|0)==(c[e+4>>2]|0)):0){f=(Q2a(a+12|0,e+12|0,b)|0)==0}else{f=0}}else{f=gl(e)|0}i=d;return f|0}function xka(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;if((b|0)==0){g=(e|0)==0;i=f;return g|0}if((c[b+4>>2]|0)!=(e|0)){g=0;i=f;return g|0}if((e|0)<=0){g=1;i=f;return g|0}h=0;j=d;d=b+12|0;while(1){b=a[d>>0]|0;k=b&255;l=a[j>>0]|0;if(!(b<<24>>24==l<<24>>24)){if((b+ -65<<24>>24&255)<26){m=k+32&255}else{m=b}if((l+ -65<<24>>24&255)<26){n=(l&255)+32&255}else{n=l}if(!(m<<24>>24==n<<24>>24)){g=0;o=13;break}}h=h+1|0;if((h|0)>=(e|0)){g=1;o=13;break}else{j=j+1|0;d=d+1|0}}if((o|0)==13){i=f;return g|0}return 0}function yka(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[a>>2]|0;if(((e|0)!=0?(c[e>>2]|0)<2:0)?(c[e+8>>2]|0)>=(b|0):0){i=d;return}nka(a);c[a>>2]=fka(b)|0;i=d;return}function zka(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a>>2]|0;if((d|0)==0){i=b;return}e=c[d>>2]|0;if((e|0)<2){i=b;return}c[d>>2]=e+ -1;e=c[d+4>>2]|0;f=fka(e)|0;c[a>>2]=f;if((f|0)==0){i=b;return}c3a(f+12|0,d+12|0,e+1|0)|0;i=b;return}function Aka(b,d){b=b|0;d=d|0;var e=0,f=0;e=i;if((c[b>>2]|0)==0){i=e;return}zka(b);if((d|0)==-1){f=Y2a((c[b>>2]|0)+12|0)|0}else{f=d}if((f|0)==0){nka(b);i=e;return}d=c[b>>2]|0;if((f|0)>(c[d+8>>2]|0)){_a(756416,756232,340,756496)}c[d+4>>2]=f;a[(c[b>>2]|0)+f+12>>0]=0;i=e;return}function Bka(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=c[b>>2]|0;g=(f|0)==0;if(g&(d|0)==0){h=0;i=e;return h|0}if(g){g=fka(d)|0;c[b>>2]=g;if((g|0)==0){h=0;i=e;return h|0}c[g+4>>2]=0;j=g+12|0;a[j>>0]=0;h=j;i=e;return h|0}if((c[f>>2]|0)<2?(c[f+8>>2]|0)>=(d|0):0){h=f+12|0;i=e;return h|0}j=c[f+4>>2]|0;g=fka((j|0)>(d|0)?j:d)|0;c[b>>2]=g;if((g|0)==0){h=0;i=e;return h|0}c3a(g+12|0,f+12|0,j+1|0)|0;c[g+4>>2]=j;j=c[f>>2]|0;c[f>>2]=j+ -1;if((j|0)<2){v2a(f)}h=(c[b>>2]|0)+12|0;i=e;return h|0}function Cka(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a>>2]|0;if((d|0)==0){i=b;return}e=d+4|0;d=c[e>>2]|0;if((d|0)<=0){i=b;return}if((d|0)>1){zka(a);f=c[a>>2]|0;d3a(f+12|0,f+13|0,d|0)|0;c[(c[a>>2]|0)+4>>2]=d+ -1;i=b;return}else{c[e>>2]=0;i=b;return}}function Dka(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;h=e+b|0;if((h|0)==0){i=g;return}j=fka(h)|0;c[a>>2]=j;if((j|0)==0){i=g;return}c3a(j+12|0,d|0,b|0)|0;c3a(j+b+12|0,f|0,e|0)|0;i=g;return}function Eka(a){a=a|0;var b=0,d=0;b=i;if((a|0)!=0?(d=c[a>>2]|0,c[a>>2]=d+ -1,(d|0)<2):0){v2a(a)}i=b;return}function Fka(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=c[b>>2]|0;if((f|0)==0){c[a>>2]=0;i=e;return}else{Gka(a,b,d,(c[f+4>>2]|0)-d|0);i=e;return}}function Gka(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;i=i+16|0;g=f;h=(d|0)<0?0:d;d=(e|0)<0?0:e;e=c[(c[b>>2]|0)+4>>2]|0;j=(h|0)>(e|0)?0:(d+h|0)>(e|0)?e-h|0:d;if((h|0)==0&(j|0)==(e|0)){hka(a,b);i=f;return}else{c[g>>2]=0;Hka(b,g,j,h);hka(a,g);dka(g);i=f;return}}function Hka(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;if((d|0)<1){i=f;return}g=fka(d)|0;c[b>>2]=g;if((g|0)==0){i=f;return}c3a(g+12|0,(c[a>>2]|0)+e+12|0,d|0)|0;i=f;return}function Ika(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0.0,R=0,S=0;f=i;i=i+288|0;g=f;j=f+16|0;l=f+32|0;c[j>>2]=c[e>>2];m=d;n=0;while(1){o=a[m>>0]|0;if(o<<24>>24==37){p=m+1|0;q=a[p>>0]|0;if(q<<24>>24==37){r=p;s=4}else{t=q;q=p;p=n;u=0;a:while(1){switch(t<<24>>24){case 42:{v=c[e>>2]|0;w=c[v>>2]|0;c[e>>2]=v+4;x=p;y=w;break};case 35:{x=p+2|0;y=u;break};case 48:case 43:case 45:case 32:{x=p;y=u;break};default:{break a}}w=q+1|0;t=a[w>>0]|0;q=w;p=x;u=y}b:do{if((u|0)==0){w=gma(q)|0;v=t;z=q;while(1){A=z+1|0;if(!((v+ -48<<24>>24&255)<10)){B=v;C=z;D=w;break b}v=a[A>>0]|0;z=A}}else{B=t;C=q;D=u}}while(0);if(D>>>0>131072){E=756272;F=10;break}if(B<<24>>24==46){u=C+1|0;q=a[u>>0]|0;c:do{if(q<<24>>24==42){t=c[e>>2]|0;z=c[t>>2]|0;c[e>>2]=t+4;G=C+2|0;H=z}else{z=gma(u)|0;t=q;v=u;while(1){w=v+1|0;if(!((t+ -48<<24>>24&255)<10)){G=v;H=z;break c}t=a[w>>0]|0;v=w}}}while(0);if(H>>>0>131072){E=756288;F=14;break}else{I=G;J=H}}else{I=C;J=0}d:do{if((S2a(I,756304,3)|0)==0){K=I+3|0;L=262144}else{switch(a[I>>0]|0){case 76:case 78:case 70:{K=I+1|0;L=0;break d;break};case 108:{K=I+1|0;L=131072;break d;break};case 104:{K=I+1|0;L=65536;break d;break};default:{K=I;L=0;break d}}}}while(0);u=a[K>>0]|0;q=u<<24>>24|L;if((q|0)==65603|(q|0)==65635){c[e>>2]=(c[e>>2]|0)+4;M=2;s=41}else if((q|0)==131139|(q|0)==131171){c[e>>2]=(c[e>>2]|0)+4;M=2;s=41}else if((q|0)==131155|(q|0)==131187){v=c[e>>2]|0;t=c[v>>2]|0;c[e>>2]=v+4;if((t|0)==0){M=6;s=41}else{v=T1a(t)|0;N=(v|0)<1?1:v;s=39}}else if((q|0)==83){v=c[e>>2]|0;t=c[v>>2]|0;c[e>>2]=v+4;if((t|0)==0){M=6;s=41}else{v=T1a(t)|0;N=(v|0)<1?1:v;s=39}}else if((q|0)==115){v=c[e>>2]|0;t=c[v>>2]|0;c[e>>2]=v+4;if((t|0)==0){M=6;s=41}else{v=Y2a(t|0)|0;N=(v|0)<1?1:v;s=39}}else if((q|0)==65619|(q|0)==65651){v=c[e>>2]|0;t=c[v>>2]|0;c[e>>2]=v+4;if((t|0)==0){M=6;s=41}else{v=Y2a(t|0)|0;N=(v|0)<1?1:v;s=39}}else if((q|0)==67|(q|0)==99){c[e>>2]=(c[e>>2]|0)+4;M=2;s=41}else{O=u;s=42}if((s|0)==39){s=0;if((N|0)==0){O=a[K>>0]|0;s=42}else{M=N;s=41}}e:do{if((s|0)==41){s=0;u=(J|0)!=0&(M|0)>(J|0)?J:M;P=(u|0)<(D|0)?D:u}else if((s|0)==42){s=0;switch(O<<24>>24|0){case 102:{u=J+D|0;if((u|0)>100){P=u+128|0;break e}else{u=c[e>>2]|0;c[k>>2]=c[u>>2];c[k+4>>2]=c[u+4>>2];Q=+h[k>>3];c[e>>2]=u+8;c[g>>2]=D;c[g+4>>2]=J+6;u=g+8|0;h[k>>3]=Q;c[u>>2]=c[k>>2];c[u+4>>2]=c[k+4>>2];J2a(l,756312,g);P=Y2a(l|0)|0;break e}break};case 111:case 88:case 120:case 117:case 105:case 100:{if((L&262144|0)==0){c[e>>2]=(c[e>>2]|0)+4}else{c[e>>2]=(c[e>>2]|0)+8}u=J+D|0;P=(u|0)>32?u:32;break e;break};case 112:{c[e>>2]=(c[e>>2]|0)+4;u=J+D|0;P=(u|0)>32?u:32;break e;break};case 71:case 103:case 69:case 101:case 65:case 97:{c[e>>2]=(c[e>>2]|0)+8;u=J+D|0;P=(u|0)>128?u:128;break e;break};case 110:{c[e>>2]=(c[e>>2]|0)+4;P=0;break e;break};default:{P=0;break e}}}}while(0);R=K;S=P+p|0}}else if(o<<24>>24==0){E=d;F=n;break}else{r=m;s=4}if((s|0)==4){s=0;R=r;S=(Y2a(r|0)|0)+n|0}m=R+1|0;n=S}Bka(b,F)|0;F=c[b>>2]|0;if((F|0)==0){i=f;return}O2a(F+12|0,E,j);Aka(b,-1);i=f;return}function Jka(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;c[f>>2]=d;Ika(a,b,f);i=e;return}function Kka(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;zka(b);e=c[b>>2]|0;if((e|0)!=0){f=c[e+4>>2]|0;g=(f|0)<0?f:0;h=f+1|0;if((c[e+8>>2]|0)<(h|0)){j=g;k=h;l=e;m=3}else{n=g;o=e;p=h}}else{j=0;k=1;l=0;m=3}do{if((m|0)==3){h=fka(k)|0;c[b>>2]=h;if((h|0)==0){i=d;return}e=h+12|0;if((l|0)==0){a[e>>0]=0;n=j;o=h;p=k;break}else{d3a(e|0,l+12|0,(c[l+4>>2]|0)+1|0)|0;Eka(l);n=j;o=c[b>>2]|0;p=k;break}}}while(0);d3a(o+(n+1)+12|0,o+n+12|0,p-n|0)|0;a[(c[b>>2]|0)+n+12>>0]=32;c[(c[b>>2]|0)+4>>2]=p;i=d;return}function Lka(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e;g=c[b>>2]|0;if((g|0)==0){c[a>>2]=0;i=e;return}h=(d|0)<0?0:d;d=c[g+4>>2]|0;if((h|0)<(d|0)){c[f>>2]=0;Hka(b,f,h,d-h|0);hka(a,f);dka(f);i=e;return}else{hka(a,b);i=e;return}}function Mka(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e;g=c[b>>2]|0;if((g|0)==0){c[a>>2]=0;i=e;return}h=(d|0)<0?0:d;if((h|0)<(c[g+4>>2]|0)){c[f>>2]=0;Hka(b,f,h,0);hka(a,f);dka(f);i=e;return}else{hka(a,b);i=e;return}}function Nka(a){a=a|0;var b=0,d=0,e=0;b=i;if(((a|0)!=0?(c[a+4>>2]|0)>0:0)?(d=a+12|0,a=P1a(d,43)|0,(a|0)!=0):0){e=a-d|0}else{e=-1}i=b;return e|0}function Oka(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;a:do{if((b|0)==0){e=-1}else{f=c[b+4>>2]|0;while(1){if((f|0)==0){e=-1;break a}g=f+ -1|0;if((a[b+g+12>>0]|0)==45){e=g;break}else{f=g}}}}while(0);i=d;return e|0}function Pka(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;a:do{if(!((e|0)>(c|0)|(e|0)==0)?(g=c-e|0,h=b+g|0,(g|0)>=0):0){g=b;while(1){j=0;while(1){if((a[g+j>>0]|0)!=(a[d+j>>0]|0)){break}j=j+1|0;if((j|0)==(e|0)){k=g;break a}}g=g+1|0;if(g>>>0>h>>>0){k=0;break}}}else{k=0}}while(0);i=f;return k|0}function Qka(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;if(((a|0)!=0?(f=c[a+4>>2]|0,(f|0)>=0):0)?(g=a+12|0,a=Pka(g,f,b,d)|0,(a|0)!=0):0){h=a-g|0}else{h=-1}i=e;return h|0}function Rka(a){a=a|0;var b=0,d=0;b=i;if(((c[a>>2]|0)!=0?(zka(a),d=c[a>>2]|0,(d|0)!=0):0)?(c[d+4>>2]|0)>=1:0){mma(d+12|0)}i=b;return}function Ska(a){a=a|0;var b=0,d=0;b=i;if(((c[a>>2]|0)!=0?(zka(a),d=c[a>>2]|0,(d|0)!=0):0)?(c[d+4>>2]|0)>=1:0){nma(d+12|0)}i=b;return}function Tka(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;if((c[b>>2]|0)==0){i=e;return}zka(b);f=c[b>>2]|0;if((f|0)==0){i=e;return}g=c[f+4>>2]|0;if((g|0)<1){i=e;return}h=f+12|0;j=f+g+12|0;g=h;f=h;while(1){h=a[f>>0]|0;if(h<<24>>24==d<<24>>24){k=g}else{a[g>>0]=h;k=g+1|0}f=f+1|0;if(!(f>>>0<j>>>0)){break}else{g=k}}a[k>>0]=0;g=(c[b>>2]|0)+4|0;c[g>>2]=(c[g>>2]|0)+(k-f);i=e;return}function Uka(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;e=i;f=c[a>>2]|0;if((f|0)==0){i=e;return}g=c[b+4>>2]|0;if((g|0)==0){i=e;return}h=d+4|0;j=c[h>>2]|0;k=c[f+4>>2]|0;l=f+k+12|0;m=c[b>>2]|0;n=Pka(f+12|0,k,m,g)|0;if((n|0)==0){i=e;return}else{o=n;p=0}while(1){q=p+1|0;n=o+g|0;o=Pka(n,l-n|0,m,g)|0;if((o|0)==0){break}else{p=q}}if((q|0)==0){i=e;return}o=k+(ca(q,j-g|0)|0)|0;if((o|0)==0){nka(a);i=e;return}j=fka(o)|0;if((j|0)==0){i=e;return}o=(c[a>>2]|0)+12|0;k=j+12|0;m=o;n=l-m|0;if((p|0)>-1){p=n;f=m;m=0;r=k;s=o;while(1){t=Pka(s,p,c[b>>2]|0,g)|0;u=t-f|0;c3a(r|0,s|0,u|0)|0;c3a(r+u|0,c[d>>2]|0,c[h>>2]|0)|0;v=r+((c[h>>2]|0)+u)|0;u=t+g|0;m=m+1|0;f=u;t=l-f|0;if((m|0)==(q|0)){w=t;x=v;y=u;break}else{p=t;r=v;s=u}}}else{w=n;x=k;y=o}c3a(x|0,y|0,w|0)|0;Eka(c[a>>2]|0);c[a>>2]=j;i=e;return}function Vka(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+32|0;f=e+8|0;g=e;gla(f+8|0);c[f>>2]=0;h=0;while(1){j=c[d>>2]|0;if((j|0)==0){k=0}else{k=c[j+4>>2]|0}if((h|0)>=(k|0)){break}xna(f,a[j+h+12>>0]|0);h=h+1|0}h=c[f+12>>2]|0;yla(g,h,c[f+16>>2]|0);Rna(b,g);ila(h);i=e;return}function Wka(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;if((d|0)<0){g=T1a(b)|0}else{g=d}c[a>>2]=0;Mna(f,b,g);Xka(a,f);Lna(f);i=e;return}function Xka(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;i=i+16|0;d=c;roa(d,756520,b);ika(a,d);dka(d);i=c;return}function Yka(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=(b|0)==0;if(e){f=0}else{f=c[b+4>>2]|0}Wka(a,e?1292088:b+12|0,f);i=d;return}function Zka(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;a:do{if((b|0)!=0){g=c[b+4>>2]|0;h=(g|0)<(e|0);j=h?g:e;if((j|0)>0){k=0;do{l=a[b+k+12>>0]|0;m=a[d+k>>0]|0;if((l&255)<(m&255)){n=-1;break a}k=k+1|0;if((l&255)>(m&255)){n=1;break a}}while((k|0)<(j|0))}if(h){n=-1}else{n=(g|0)>(e|0)&1}}else{n=((e|0)!=0)<<31>>31}}while(0);i=f;return n|0}function _ka(a){a=a|0;var b=0,c=0;b=i;i=i+16|0;c=b;oe(c,a);a=$ka(c)|0;i=b;return a|0}function $ka(a){a=a|0;var b=0,e=0,f=0,g=0,h=0,j=0;b=i;e=c[a+4>>2]|0;if((e|0)<=0){f=0;i=b;return f|0}g=c[a>>2]|0;if((e|0)<4){h=0;j=0}else{f=d[g+3>>0]|0|(d[g+2>>0]|0|(d[g+1>>0]|0|(d[g>>0]|0)<<8)<<8)<<8;i=b;return f|0}do{j=d[g+h>>0]|0|j<<8;h=h+1|0}while((h|0)<(e|0));f=j<<(4-e<<3);i=b;return f|0}function ala(b,c){b=+b;c=c|0;var d=0,e=0,f=0,g=0.0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;i=i+32|0;e=d;a[c>>0]=48;a[c+1>>0]=0;if(b==0.0){f=1;i=d;return f|0}if(b<0.0){g=-b;h=1}else{g=b;h=0}j=Fla(g)|0;if((j|0)<=99999){k=1;do{k=k*10|0;l=Fla(g*+(k|0))|0}while(!((l|0)>99999|(k|0)==1e6));if((l|0)==0){f=1;i=d;return f|0}else{m=k;n=l}}else{m=1;n=j}if((h|0)==0){o=0}else{a[c>>0]=45;o=1}pma((n|0)/(m|0)|0,e);h=Y2a(e|0)|0;c3a(c+o|0,e|0,h|0)|0;e=h+o|0;o=(n|0)%(m|0)|0;if((o|0)==0){f=e;i=d;return f|0}a[c+e>>0]=46;n=e+1|0;e=o;o=m;while(1){o=(o|0)/10|0;a[c+n>>0]=((e|0)/(o|0)|0)+48;e=(e|0)%(o|0)|0;m=n+1|0;if((e|0)==0){f=m;break}else{n=m}}i=d;return f|0}function bla(a,b){a=a|0;b=+b;var c=0,d=0;c=i;i=i+32|0;d=c;eka(a,d,ala(b,d)|0);i=c;return}function cla(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+32|0;e=d;f=d+16|0;g=d+8|0;c[g>>2]=b;c[g+4>>2]=0;dla(f,c[a>>2]|0,c[a+4>>2]|0,g);ela(e,c[f>>2]|0,c[f+4>>2]|0);f=e;e=c[f+4>>2]|0;g=a;c[g>>2]=c[f>>2];c[g+4>>2]=e;i=d;return}function dla(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;i=i+16|0;g=f;iL(g,b,d);hL(a,c[g>>2]|0,c[g+4>>2]|0,c[e>>2]|0,c[e+4>>2]|0);i=f;return}function ela(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;c[a>>2]=b;c[a+4>>2]=fL(fla(b)|0|d)|0;i=e;return}function fla(a){a=a|0;var b=0,c=0;b=i;c=eL((a|0)>-1,1)|0;i=b;return c|0}function gla(a){a=a|0;var b=0;b=i;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;i=b;return}function hla(a,b){a=a|0;b=b|0;var d=0;d=i;c[a>>2]=0;c[a+8>>2]=b;c[a+12>>2]=b;c[a+4>>2]=w2a(b,1)|0;i=d;return}function ila(a){a=a|0;var b=0;b=i;v2a(a);i=b;return}function jla(a){a=a|0;c[a+8>>2]=0;return}function kla(a){a=a|0;c[a+8>>2]=0;c[a+4>>2]=0;c[a+12>>2]=0;return}function lla(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;c[a>>2]=d;if((c[a+12>>2]|0)>=(b|0)){i=e;return}mla(a,b-(c[a+8>>2]|0)|0);i=e;return}function mla(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=(c[a+8>>2]|0)+b|0;b=a+12|0;f=c[b>>2]|0;if((f|0)>=(e|0)){i=d;return}g=c[a>>2]|0;if((g|0)==0){h=(f|0)/4|0;j=(h|0)<128?128:h}else{j=g}g=e+ -1+j|0;e=g-((g|0)%(j|0)|0)|0;j=a+4|0;a=c[j>>2]|0;if((a|0)==0){k=w2a(e,1)|0}else{k=x2a(a,e)|0}if((k|0)==0){i=d;return}c[j>>2]=k;c[b>>2]=e;i=d;return}function nla(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;mla(a,d);if((b|0)!=0?(f=c[a+4>>2]|0,(f|0)!=0):0){c3a(f+(c[a+8>>2]|0)|0,b|0,d|0)|0}b=a+8|0;c[b>>2]=(c[b>>2]|0)+d;i=e;return}function ola(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;mla(b,8);h=b+4|0;j=c[h>>2]|0;if((j|0)==0){i=g;return}k=b+8|0;d3a(j+(e+8)|0,j+e|0,(c[k>>2]|0)-e|0)|0;if((f|0)!=0){j=f;f=j;b=d[f>>0]|d[f+1>>0]<<8|d[f+2>>0]<<16|d[f+3>>0]<<24;f=j+4|0;j=d[f>>0]|d[f+1>>0]<<8|d[f+2>>0]<<16|d[f+3>>0]<<24;f=(c[h>>2]|0)+e|0;e=f;a[e>>0]=b;a[e+1>>0]=b>>8;a[e+2>>0]=b>>16;a[e+3>>0]=b>>24;b=f+4|0;a[b>>0]=j;a[b+1>>0]=j>>8;a[b+2>>0]=j>>16;a[b+3>>0]=j>>24}c[k>>2]=(c[k>>2]|0)+8;i=g;return}function pla(a,b,d){a=a|0;b=b|0;d=d|0;c[a>>2]=b;c[a+4>>2]=d;return}function qla(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;nla(a,b,c);i=d;return a|0}function rla(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;i=i+32|0;d=c;pma(b,d);nla(a,d,Y2a(d|0)|0);i=c;return a|0}function sla(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;i=i+32|0;d=c;pma(b,d);nla(a,d,Y2a(d|0)|0);i=c;return a|0}function tla(a,b){a=a|0;b=+b;var c=0,d=0;c=i;i=i+32|0;d=c;nla(a,d,ala(b,d)|0);i=c;return a|0}function ula(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;nla(a,b,c);i=d;return a|0}function vla(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=a+8|0;f=c[e>>2]|0;if((c[a+12>>2]|0)<(f+4|0)){mla(a,4);g=c[e>>2]|0}else{g=f}c[(c[a+4>>2]|0)+g>>2]=b;c[e>>2]=(c[e>>2]|0)+4;i=d;return}function wla(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;nla(a,b,c<<2);i=d;return}function xla(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=(b|0)==0;if(e){f=0}else{f=c[b+4>>2]<<2}nla(a,e?1292088:b+12|0,f);i=d;return}function yla(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;Cla(a,b,c>>>2);i=d;return}function zla(a,b,d){a=a|0;b=b|0;d=d|0;c[a+8>>2]=b;c[a+4>>2]=d<<3;c[a>>2]=0;return}function Ala(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;e=d&7;if((e|0)==0){i=b;return}c[a>>2]=d+8-e;i=b;return}function Bla(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;e=i;f=c[a+4>>2]|0;if(f>>>0<b>>>0){g=0;i=e;return g|0}h=c[a>>2]|0;j=h+b|0;if(j>>>0>f>>>0){g=0;i=e;return g|0}f=h>>>3;if((b|0)==1){k=((d[(c[a+8>>2]|0)+f>>0]|0)&1<<(h&7^7)|0)!=0&1;c[a>>2]=h+1;g=k;i=e;return g|0}k=h&7;do{if((k|0)==0){l=b;m=f;n=0}else{h=8-k|0;if(h>>>0<b>>>0){o=b-h|0;l=o;m=f+1|0;n=((d[(c[a+8>>2]|0)+f>>0]|0)&(1<<h)+ -1)<<o;break}o=((d[(c[a+8>>2]|0)+f>>0]|0)&255>>>k)>>>(h-b|0);c[a>>2]=j;g=o;i=e;return g|0}}while(0);if(l>>>0>7){b=c[a+8>>2]|0;k=l;f=m;o=n;while(1){h=k+ -8|0;p=f+1|0;q=(d[b+f>>0]|0)<<h|o;if(h>>>0>7){k=h;f=p;o=q}else{r=h;s=p;t=q;break}}}else{r=l;s=m;t=n}if((r|0)==0){u=t}else{u=(d[(c[a+8>>2]|0)+s>>0]|0)>>>(8-r|0)|t}c[a>>2]=j;g=u;i=e;return g|0}function Cla(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;c[a>>2]=b;if((d|0)==-1){c[a+4>>2]=T1a(b)|0;i=e;return}else{c[a+4>>2]=d;i=e;return}}function Dla(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a>>2]|0;e=a+8|0;f=c[e>>2]|0;if((d|0)>(f|0)){c[a>>2]=f;c[e>>2]=d}d=a+4|0;e=c[d>>2]|0;f=a+12|0;a=c[f>>2]|0;if((e|0)<=(a|0)){i=b;return}c[d>>2]=a;c[f>>2]=e;i=b;return}function Ela(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+16|0;e=d;c[e+0>>2]=c[b+0>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];Dla(e);Dla(a);b=c[a>>2]|0;f=c[e>>2]|0;g=(b|0)>(f|0)?b:f;c[a>>2]=g;f=a+4|0;b=c[f>>2]|0;h=c[e+4>>2]|0;j=(b|0)>(h|0)?b:h;c[f>>2]=j;f=a+8|0;h=c[f>>2]|0;b=c[e+8>>2]|0;k=(h|0)<(b|0)?h:b;c[f>>2]=k;f=a+12|0;b=c[f>>2]|0;h=c[e+12>>2]|0;e=(b|0)<(h|0)?b:h;c[f>>2]=e;if(!((g|0)>(k|0)|(j|0)>(e|0))){i=d;return}c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;i=d;return}function Fla(a){a=+a;var b=0,c=0;b=i;if(!(a>=0.0)){i=b;return~~(a+-.5)|0}else{c=~~(a+.5);i=b;return((c|0)>-1?c:0-c|0)|0}return 0}function Gla(a,b){a=a|0;b=b|0;g[a>>2]=+(c[b>>2]|0);g[a+4>>2]=+(c[b+8>>2]|0);g[a+8>>2]=+(c[b+4>>2]|0);g[a+12>>2]=+(c[b+12>>2]|0);return}function Hla(a){a=a|0;var b=0,c=0.0,d=0,e=0.0,f=0;b=i;c=+g[a>>2];d=a+4|0;e=+g[d>>2];if(c>e){g[a>>2]=e;g[d>>2]=c}d=a+8|0;c=+g[d>>2];f=a+12|0;e=+g[f>>2];if(!(c>e)){i=b;return}g[f>>2]=c;g[d>>2]=e;i=b;return}function Ila(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,h=0.0,j=0.0,k=0.0,l=0.0,m=0.0;d=i;i=i+16|0;e=d;Hla(a);c[e+0>>2]=c[b+0>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];Hla(e);f=+g[a>>2];h=+g[e>>2];j=f>h?f:h;g[a>>2]=j;b=a+4|0;h=+g[b>>2];f=+g[e+4>>2];k=h<f?h:f;g[b>>2]=k;b=a+8|0;f=+g[b>>2];h=+g[e+8>>2];l=f>h?f:h;g[b>>2]=l;b=a+12|0;h=+g[b>>2];f=+g[e+12>>2];m=h<f?h:f;g[b>>2]=m;if(!(j>k|l>m)){i=d;return}c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;i=d;return}function Jla(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,h=0.0;d=i;i=i+16|0;e=d;Hla(a);c[e+0>>2]=c[b+0>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];Hla(e);f=+g[a>>2];h=+g[e>>2];g[a>>2]=f<h?f:h;b=a+4|0;h=+g[b>>2];f=+g[e+4>>2];g[b>>2]=h>f?h:f;b=a+8|0;f=+g[b>>2];h=+g[e+8>>2];g[b>>2]=f<h?f:h;b=a+12|0;h=+g[b>>2];f=+g[e+12>>2];g[b>>2]=h>f?h:f;i=d;return}function Kla(a,b){a=a|0;b=b|0;var c=0;c=i;Lla(b,a,a+4|0,a+12|0,a+8|0);i=c;return}function Lla(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0,q=0;f=i;i=i+32|0;h=f+16|0;j=f;k=+g[b>>2];g[h>>2]=k;l=+g[d>>2];g[j>>2]=l;g[h+4>>2]=k;m=+g[e>>2];g[j+4>>2]=m;n=+g[c>>2];g[h+8>>2]=n;g[j+8>>2]=l;g[h+12>>2]=n;g[j+12>>2]=m;m=k;k=l;o=0;while(1){p=h+(o<<2)|0;q=j+(o<<2)|0;g[p>>2]=m;g[q>>2]=k;fma(a,p,q);q=o+1|0;if((q|0)==4){break}m=+g[h+(q<<2)>>2];k=+g[j+(q<<2)>>2];o=q}k=+g[h>>2];g[b>>2]=k;g[c>>2]=k;k=+g[j>>2];g[e>>2]=k;g[d>>2]=k;o=1;do{k=+g[h+(o<<2)>>2];if(+g[c>>2]<k){g[c>>2]=k}if(+g[b>>2]>k){g[b>>2]=k}k=+g[j+(o<<2)>>2];if(+g[d>>2]<k){g[d>>2]=k}if(+g[e>>2]>k){g[e>>2]=k}o=o+1|0}while((o|0)!=4);i=f;return}function Mla(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,h=0.0;d=i;e=+g[b+4>>2];f=+g[b+8>>2];h=+g[b+12>>2];c[a>>2]=~~+Q(+(+g[b>>2]));c[a+8>>2]=~~+ba(+e);c[a+4>>2]=~~+Q(+f);c[a+12>>2]=~~+ba(+h);Dla(a);i=d;return}function Nla(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0.0;c=i;d=+g[b+8>>2];e=+g[b+12>>2];Ola(+g[b>>2],+g[b+4>>2],a,a+8|0);Ola(d,e,a+4|0,a+12|0);Dla(a);i=c;return}function Ola(a,b,d,e){a=+a;b=+b;d=d|0;e=e|0;var f=0,g=0,h=0,i=0.0,j=0.0,k=0.0,l=0,m=0;f=~~+ba(+(b-a));g=~~+Q(+a);h=~~+ba(+a);i=+(g|0);j=+(f|0);k=+(h|0);l=+R(+(b-i-j))+(a-i)>+R(+(b-k-j))+(k-a);m=l?h:g;c[d>>2]=m;c[e>>2]=m+f;return}function Pla(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0;d=i;i=i+32|0;e=d+16|0;f=d;c[e+0>>2]=c[a+0>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[e+12>>2]=c[a+12>>2];Hla(e);c[f+0>>2]=c[b+0>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];Hla(f);if(((+g[f>>2]>=+g[e>>2]?+g[f+4>>2]<=+g[e+4>>2]:0)?+g[f+8>>2]>=+g[e+8>>2]:0)?+g[f+12>>2]<=+g[e+12>>2]:0){h=1;i=d;return h|0}h=0;i=d;return h|0}function Qla(a,b,d){a=a|0;b=+b;d=+d;var e=0,f=0,h=0;e=i;i=i+16|0;f=e;c[f+0>>2]=c[a+0>>2];c[f+4>>2]=c[a+4>>2];c[f+8>>2]=c[a+8>>2];c[f+12>>2]=c[a+12>>2];Hla(f);if((+g[f+4>>2]>=b?+g[f>>2]<=b:0)?+g[f+12>>2]>=d:0){h=+g[f+8>>2]<=d}else{h=0}i=e;return h&1|0}function Rla(a,b,c){a=a|0;b=+b;c=+c;var d=0,e=0;d=i;if(+g[a>>2]>b){g[a>>2]=b}e=a+4|0;if(+g[e>>2]<b){g[e>>2]=b}e=a+8|0;if(+g[e>>2]>c){g[e>>2]=c}e=a+12|0;if(!(+g[e>>2]<c)){i=d;return}g[e>>2]=c;i=d;return}function Sla(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;e=i;if((d|0)==0){c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;i=e;return}f=+g[b>>2];h=+g[b+4>>2];if((d|0)>1){j=1;k=f;l=h;m=f;n=h;while(1){o=+g[b+(j<<3)>>2];p=m>o?o:m;q=k<o?o:k;o=+g[b+(j<<3)+4>>2];r=n>o?o:n;s=l<o?o:l;j=j+1|0;if((j|0)==(d|0)){t=q;u=s;v=p;w=r;break}else{k=q;l=s;m=p;n=r}}}else{t=f;u=h;v=f;w=h}g[a>>2]=v;g[a+8>>2]=w;g[a+4>>2]=t;g[a+12>>2]=u;i=e;return}function Tla(a,b,c,d,e,f,h){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;g[a>>2]=b;g[a+4>>2]=c;g[a+8>>2]=d;g[a+12>>2]=e;g[a+16>>2]=f;g[a+20>>2]=h;return}function Ula(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0,f=0,h=0,j=0.0,k=0.0,l=0,m=0;c=i;d=b+12|0;e=+g[d>>2];f=b+4|0;h=b+8|0;j=+g[b>>2]*e- +g[f>>2]*+g[h>>2];if(j==0.0){i=c;return}k=-j;g[a>>2]=e/j;g[a+4>>2]=+g[f>>2]/k;g[a+8>>2]=+g[h>>2]/k;g[a+12>>2]=+g[b>>2]/j;l=b+20|0;m=b+16|0;g[a+16>>2]=(+g[h>>2]*+g[l>>2]- +g[d>>2]*+g[m>>2])/j;g[a+20>>2]=(+g[b>>2]*+g[l>>2]- +g[f>>2]*+g[m>>2])/k;i=c;return}function Vla(a,b,c,d,e,f,h){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;var j=0,k=0;j=i;i=i+32|0;k=j;g[k>>2]=b;g[k+4>>2]=c;g[k+8>>2]=d;g[k+12>>2]=e;g[k+16>>2]=f;g[k+20>>2]=h;Wla(a,k);i=j;return}function Wla(a,b){a=a|0;b=b|0;var c=0;c=i;Xla(a,a,b);i=c;return}function Xla(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0;d=+g[b>>2];e=+g[c>>2];f=+g[b+4>>2];h=+g[c+8>>2];i=+g[c+4>>2];j=+g[c+12>>2];k=+g[b+8>>2];l=+g[b+12>>2];m=+g[b+16>>2];n=+g[b+20>>2];o=+g[c+16>>2]+(e*m+h*n);p=i*m+j*n+ +g[c+20>>2];g[a>>2]=d*e+f*h;g[a+4>>2]=d*i+f*j;g[a+8>>2]=e*k+h*l;g[a+12>>2]=i*k+j*l;g[a+16>>2]=o;g[a+20>>2]=p;return}function Yla(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;i=i+32|0;d=c;g[d+12>>2]=1.0;g[d>>2]=1.0;g[d+20>>2]=0.0;g[d+16>>2]=0.0;g[d+8>>2]=0.0;g[d+4>>2]=0.0;Ula(d,b);Wla(a,d);i=c;return}function Zla(a){a=a|0;var b=0,c=0.0,d=0,e=0;b=i;c=+R(+(+g[a>>2]*1.0e3));if(!(c<+R(+(+g[a+4>>2])))){d=0;e=d&1;i=b;return e|0}c=+R(+(+g[a+12>>2]*1.0e3));d=c<+R(+(+g[a+8>>2]));e=d&1;i=b;return e|0}function _la(a){a=a|0;var b=0,c=0.0,d=0,e=0;b=i;c=+R(+(+g[a+4>>2]*1.0e3));if(!(c<+R(+(+g[a>>2])))){d=0;e=d&1;i=b;return e|0}c=+R(+(+g[a+8>>2]*1.0e3));d=c<+R(+(+g[a+12>>2]));e=d&1;i=b;return e|0}function $la(a,b,c){a=a|0;b=+b;c=+c;var d=0;d=a+16|0;g[d>>2]=+g[d>>2]+b;d=a+20|0;g[d>>2]=+g[d>>2]+c;return}function ama(a,b,c){a=a|0;b=+b;c=+c;var d=0;g[a>>2]=+g[a>>2]*b;d=a+12|0;g[d>>2]=+g[d>>2]*c;d=a+4|0;g[d>>2]=+g[d>>2]*c;d=a+8|0;g[d>>2]=+g[d>>2]*b;d=a+16|0;g[d>>2]=+g[d>>2]*b;d=a+20|0;g[d>>2]=+g[d>>2]*c;return}function bma(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0,h=0,i=0.0;d=+g[c>>2]- +g[c+4>>2];if(+R(+d)<.0010000000474974513){e=1.0}else{e=(+g[b>>2]- +g[b+4>>2])/d}g[a>>2]=e;f=c+8|0;d=+g[f>>2]- +g[c+12>>2];h=b+8|0;if(+R(+d)<.0010000000474974513){i=1.0}else{i=(+g[h>>2]- +g[b+12>>2])/d}g[a+12>>2]=i;g[a+16>>2]=+g[b>>2]- +g[c>>2]*e;g[a+20>>2]=+g[h>>2]- +g[f>>2]*i;g[a+4>>2]=0.0;g[a+8>>2]=0.0;return}function cma(a,b){a=+a;b=+b;var c=0,d=0.0;c=i;do{if(b==0.0){if(a>0.0){d=a}else{d=-a}}else{if(!(a==0.0)){d=+S(+(b*b+a*a));break}if(b>0.0){d=b}else{d=-b}}}while(0);i=c;return+d}function dma(a,b){a=+a;b=+b;var c=0,d=0.0;c=i;do{if(a==0.0){if(b>0.0){d=b}else{d=-b}}else{if(!(b==0.0)){d=+S(+(a*a+b*b));break}if(a>0.0){d=a}else{d=-a}}}while(0);i=c;return+d}function ema(a,b){a=a|0;b=b|0;var c=0;c=i;g[a>>2]=0.0;g[a+8>>2]=0.0;g[a+4>>2]=1.0;g[a+12>>2]=1.0;Kla(a,b);i=c;return}function fma(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0;d=+g[b>>2];e=+g[c>>2];f=+g[a+20>>2]+(d*+g[a+4>>2]+e*+g[a+12>>2]);g[b>>2]=+g[a+16>>2]+(+g[a>>2]*d+ +g[a+8>>2]*e);g[c>>2]=f;return}function gma(a){a=a|0;var b=0,c=0;b=i;c=hma(a)|0;i=b;return c|0}function hma(b){b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0;c=i;if((b|0)==0){d=0;i=c;return d|0}e=(a[b>>0]|0)==45;f=e?b+1|0:b;b=a[f>>0]|0;if(b<<24>>24==0|(b+ -48<<24>>24&255)>9){g=0}else{h=f;f=b;b=0;while(1){j=(b*10|0)+ -48+(f<<24>>24)|0;h=h+1|0;f=a[h>>0]|0;if(f<<24>>24==0|(f+ -48<<24>>24&255)>9){g=j;break}else{b=j}}}d=e?0-g|0:g;i=c;return d|0}function ima(a){a=a|0;var b=0,c=0;b=i;c=jma(a)|0;i=b;return c|0}function jma(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;if((a|0)==0){d=0;i=b;return d|0}e=(c[a>>2]|0)==45;f=e?a+4|0:a;a=c[f>>2]|0;if((a+ -48|0)>>>0>9){g=0}else{h=f;f=a;a=0;while(1){j=f+ -48+(a*10|0)|0;h=h+4|0;f=c[h>>2]|0;if((f+ -48|0)>>>0>9){g=j;break}else{a=j}}}d=e?0-g|0:g;i=b;return d|0}function kma(a){a=a|0;var b=0,c=0;b=i;c=lma(a)|0;i=b;return c|0}function lma(b){b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;c=i;if((b|0)==0){d=0;e=0;G=d;i=c;return e|0}f=(a[b>>0]|0)==45;g=f?b+1|0:b;b=a[g>>0]|0;if((b+ -48<<24>>24&255)>9){h=0;j=0}else{k=g;g=b;b=0;l=0;while(1){m=o3a(b|0,l|0,10,0)|0;n=g<<24>>24;o=W2a(m|0,G|0,-48,-1)|0;m=W2a(o|0,G|0,n|0,((n|0)<0)<<31>>31|0)|0;n=G;k=k+1|0;g=a[k>>0]|0;if((g+ -48<<24>>24&255)>9){h=m;j=n;break}else{b=m;l=n}}}l=X2a(0,0,h|0,j|0)|0;d=f?G:j;e=f?l:h;G=d;i=c;return e|0}function mma(b){b=b|0;var c=0,d=0,e=0,f=0;c=i;if((b|0)==0){i=c;return}d=a[b>>0]|0;if(d<<24>>24==0){i=c;return}else{e=b;f=d}do{d=f<<24>>24;a[e>>0]=(d+ -65|0)>>>0>25?d:d+32|0;e=e+1|0;f=a[e>>0]|0}while(!(f<<24>>24==0));i=c;return}function nma(b){b=b|0;var c=0,d=0,e=0,f=0;c=i;if((b|0)==0){i=c;return}d=a[b>>0]|0;if(d<<24>>24==0){i=c;return}else{e=b;f=d}do{d=f<<24>>24;a[e>>0]=(d+ -97|0)>>>0>25?d:d+224|0;e=e+1|0;f=a[e>>0]|0}while(!(f<<24>>24==0));i=c;return}function oma(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=c;c=b;while(1){b=a[c>>0]|0;f=b&255;g=(b+ -65<<24>>24&255)<26?f+32|0:f;f=a[e>>0]|0;b=f&255;h=(f+ -65<<24>>24&255)<26?b+32|0:b;if((g|0)!=0&(g|0)==(h|0)){e=e+1|0;c=c+1|0}else{break}}i=d;return g-h|0}function pma(a,b){a=a|0;b=b|0;var c=0;c=i;qma(a,b);i=c;return}function qma(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;if((b|0)>=0){if((b|0)==0){a[c>>0]=48;a[c+1>>0]=0;i=d;return}else{e=b;f=0}}else{a[c>>0]=45;e=0-b|0;f=1}if((e|0)>9){b=1;g=e;while(1){h=b+1|0;if((g|0)>99){b=h;g=(g|0)/10|0}else{break}}if((b|0)>-1){j=h;k=7}else{l=h}}else{j=1;k=7}if((k|0)==7){k=e;e=j;while(1){e=e+ -1|0;a[c+(e+f)>>0]=a[756344+((k|0)%10|0)>>0]|0;if((e|0)<=0){l=j;break}else{k=(k|0)/10|0}}}a[c+(l+f)>>0]=0;i=d;return}function rma(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0;g=i;if((d|0)<=0){h=0;i=g;return h|0}j=(e|0)!=0;k=0;l=0;while(1){m=c[b+(k<<2)>>2]|0;if((m|0)<256){if(j&(l|0)<(f|0)){a[e+l>>0]=m}n=l+1|0}else{n=l}k=k+1|0;if((k|0)==(d|0)){h=n;break}else{l=n}}i=g;return h|0}function sma(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;if((d|0)<=0){h=0;i=g;return h|0}j=(e|0)!=0;k=0;do{if(j&(k|0)<(f|0)){c[e+(k<<2)>>2]=a[b+k>>0]|0}k=k+1|0}while((k|0)!=(d|0));h=d;i=g;return h|0}function tma(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+20|0;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[e>>2]=b;i=d;return}function uma(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=a+4|0;f=vma(a,c[e>>2]|0)|0;c[f+8>>2]=b;b=c[e>>2]|0;if((b|0)==0){c[a>>2]=f;c[e>>2]=f;i=d;return}else{c[b>>2]=f;c[e>>2]=f;i=d;return}}function vma(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;e=a+12|0;f=c[e>>2]|0;do{if((f|0)==0){g=a+20|0;h=tna(a+16|0,c[g>>2]|0,12)|0;j=c[g>>2]|0;g=j+ -1|0;if((j|0)<=0){k=c[e>>2]|0;break}j=c[e>>2]|0;l=g;m=h+4+(g*12|0)|0;while(1){c[m>>2]=j;c[e>>2]=m;if((l|0)>0){g=m;l=l+ -1|0;m=m+ -12|0;j=g}else{k=m;break}}}else{k=f}}while(0);c[e>>2]=c[k>>2];c[k+4>>2]=b;c[k>>2]=0;b=a+8|0;c[b>>2]=(c[b>>2]|0)+1;c[k+8>>2]=0;i=d;return k|0}function wma(a){a=a|0;var b=0,d=0;b=i;d=a+16|0;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;una(c[d>>2]|0);c[d>>2]=0;i=b;return}function xma(a){a=a|0;var b=0;b=i;wma(a);i=b;return}function yma(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=c[a>>2]|0;a:do{if((e|0)==0){f=0}else{a=e;while(1){if((c[a+8>>2]|0)==(b|0)){break}g=c[a>>2]|0;if((g|0)==0){f=0;break a}else{a=g}}f=a}}while(0);i=d;return f|0}function zma(a,b){a=a|0;b=b|0;c[a>>2]=0;c[a+4>>2]=17;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=b;return}function Ama(a){a=a|0;var b=0,d=0;b=i;d=c[a>>2]|0;if((d|0)!=0){v2a(d);c[a>>2]=0}c[a+8>>2]=0;c[a+12>>2]=0;d=a+16|0;una(c[d>>2]|0);c[d>>2]=0;i=b;return}function Bma(a){a=a|0;var b=0;b=i;Ama(a);i=b;return}function Cma(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;g=c[b>>2]|0;a:do{if((g|0)==(-1|0)?(h=c[a+4>>2]|0,(h|0)!=0):0){j=c[a>>2]|0;k=0;while(1){l=c[j+(k<<2)>>2]|0;k=k+1|0;if((l|0)!=0){m=l;break a}if(!(k>>>0<h>>>0)){m=0;break}}}else{m=g}}while(0);g=c[m>>2]|0;h=m+4|0;b:do{if((g|0)==0){k=c[a+4>>2]|0;j=((c[h>>2]|0)>>>4>>>0)%(k>>>0)|0;while(1){j=j+1|0;if(!(j>>>0<k>>>0)){n=0;break b}l=c[(c[a>>2]|0)+(j<<2)>>2]|0;if((l|0)!=0){n=l;break}}}else{n=g}}while(0);c[b>>2]=n;c[d>>2]=c[h>>2];c[e>>2]=c[m+8>>2];i=f;return}function Dma(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=Ema(a,b,e)|0;if((f|0)==0){g=0;i=e;return g|0}c[d>>2]=c[f+8>>2];g=1;i=e;return g|0}function Ema(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=(b>>>4>>>0)%((c[a+4>>2]|0)>>>0)|0;c[d>>2]=f;d=c[a>>2]|0;a:do{if((d|0)!=0?(a=c[d+(f<<2)>>2]|0,(a|0)!=0):0){g=a;while(1){if((c[g+4>>2]|0)==(b|0)){h=g;break a}g=c[g>>2]|0;if((g|0)==0){h=0;break}}}else{h=0}}while(0);i=e;return h|0}function Fma(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=Ema(a,b,d)|0;if((e|0)==0){f=0;i=d;return f|0}f=c[e+8>>2]|0;i=d;return f|0}function Gma(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;e=d;f=Ema(a,b,e)|0;if((f|0)!=0){g=f;h=g+8|0;i=d;return h|0}if((c[a>>2]|0)==0){Hma(a,c[a+4>>2]|0,1)}f=Ima(a)|0;c[f+4>>2]=b;b=c[e>>2]|0;c[f>>2]=c[(c[a>>2]|0)+(b<<2)>>2];c[(c[a>>2]|0)+(b<<2)>>2]=f;g=f;h=g+8|0;i=d;return h|0}function Hma(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=c[a>>2]|0;if((f|0)!=0){v2a(f);c[a>>2]=0}if((d|0)!=0){c[a>>2]=w2a(b,4)|0}c[a+4>>2]=b;i=e;return}function Ima(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;d=a+12|0;e=c[d>>2]|0;do{if((e|0)==0){f=a+20|0;g=tna(a+16|0,c[f>>2]|0,12)|0;h=c[f>>2]|0;f=h+ -1|0;if((h|0)<=0){j=c[d>>2]|0;break}h=c[d>>2]|0;k=f;l=g+4+(f*12|0)|0;while(1){c[l>>2]=h;c[d>>2]=l;if((k|0)>0){f=l;k=k+ -1|0;l=l+ -12|0;h=f}else{j=l;break}}}else{j=e}}while(0);c[d>>2]=c[j>>2];d=a+8|0;c[d>>2]=(c[d>>2]|0)+1;c[j+4>>2]=0;c[j+8>>2]=0;i=b;return j|0}function Jma(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=c[a>>2]|0;if((e|0)==0){i=d;return}f=e+(((b>>>4>>>0)%((c[a+4>>2]|0)>>>0)|0)<<2)|0;while(1){g=c[f>>2]|0;if((g|0)==0){h=6;break}if((c[g+4>>2]|0)==(b|0)){break}else{f=g}}if((h|0)==6){i=d;return}c[f>>2]=c[g>>2];Kma(a,g);i=d;return}function Kma(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+12|0;c[b>>2]=c[e>>2];c[e>>2]=b;b=a+8|0;e=(c[b>>2]|0)+ -1|0;c[b>>2]=e;if((e|0)!=0){i=d;return}Ama(a);i=d;return}function Lma(a,b){a=a|0;b=b|0;c[a>>2]=0;c[a+4>>2]=17;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=b;return}function Mma(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;d=c[a>>2]|0;if((d|0)!=0){e=a+4|0;f=c[e>>2]|0;if((f|0)==0){g=d}else{h=f;f=d;d=0;while(1){j=c[f+(d<<2)>>2]|0;if((j|0)==0){k=h;l=f}else{m=j;do{dka(m+8|0);m=c[m>>2]|0}while((m|0)!=0);k=c[e>>2]|0;l=c[a>>2]|0}d=d+1|0;if(!(d>>>0<k>>>0)){g=l;break}else{h=k;f=l}}}v2a(g);c[a>>2]=0}c[a+8>>2]=0;c[a+12>>2]=0;g=a+16|0;una(c[g>>2]|0);c[g>>2]=0;i=b;return}function Nma(a){a=a|0;var b=0;b=i;Mma(a);i=b;return}function Oma(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;g=c[b>>2]|0;a:do{if((g|0)==(-1|0)?(h=c[a+4>>2]|0,(h|0)!=0):0){j=c[a>>2]|0;k=0;while(1){l=c[j+(k<<2)>>2]|0;k=k+1|0;if((l|0)!=0){m=l;break a}if(!(k>>>0<h>>>0)){m=0;break}}}else{m=g}}while(0);g=c[m>>2]|0;b:do{if((g|0)==0){h=c[a+4>>2]|0;k=c[m+4>>2]|0;while(1){k=k+1|0;if(!(k>>>0<h>>>0)){n=0;break b}j=c[(c[a>>2]|0)+(k<<2)>>2]|0;if((j|0)!=0){n=j;break}}}else{n=g}}while(0);c[b>>2]=n;ika(d,m+8|0);c[e>>2]=c[m+12>>2];i=f;return}function Pma(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;e=c[b>>2]|0;a:do{if((e|0)==(-1|0)?(f=c[a+4>>2]|0,(f|0)!=0):0){g=c[a>>2]|0;h=0;while(1){j=c[g+(h<<2)>>2]|0;h=h+1|0;if((j|0)!=0){k=j;break a}if(!(h>>>0<f>>>0)){k=0;break}}}else{k=e}}while(0);e=c[k>>2]|0;b:do{if((e|0)==0){f=c[a+4>>2]|0;h=c[k+4>>2]|0;while(1){h=h+1|0;if(!(h>>>0<f>>>0)){l=0;break b}g=c[(c[a>>2]|0)+(h<<2)>>2]|0;if((g|0)!=0){l=g;break}}}else{l=e}}while(0);c[b>>2]=l;i=d;return c[k+12>>2]|0}function Qma(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+16|0;e=d;f=Rma(a,b,e)|0;if((f|0)!=0){g=f;h=g+12|0;i=d;return h|0}if((c[a>>2]|0)==0){Sma(a,c[a+4>>2]|0)}f=Tma(a)|0;j=c[e>>2]|0;c[f+4>>2]=j;kka(f+8|0,b);c[f>>2]=c[(c[a>>2]|0)+(j<<2)>>2];c[(c[a>>2]|0)+(j<<2)>>2]=f;g=f;h=g+12|0;i=d;return h|0}function Rma(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;f=Vma(c[b>>2]|0,c[b+4>>2]|0)|0;g=(f>>>0)%((c[a+4>>2]|0)>>>0)|0;c[d>>2]=g;d=c[a>>2]|0;if((d|0)==0){h=0;i=e;return h|0}a=c[d+(g<<2)>>2]|0;if((a|0)==0){h=0;i=e;return h|0}else{j=a}while(1){if(vka(c[j+8>>2]|0,b)|0){h=j;k=5;break}j=c[j>>2]|0;if((j|0)==0){h=0;k=5;break}}if((k|0)==5){i=e;return h|0}return 0}function Sma(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[a>>2]|0;if((e|0)!=0){v2a(e);c[a>>2]=0}c[a>>2]=w2a(b,4)|0;c[a+4>>2]=b;i=d;return}function Tma(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;d=a+12|0;e=c[d>>2]|0;do{if((e|0)==0){f=a+20|0;g=tna(a+16|0,c[f>>2]|0,16)|0;h=c[f>>2]|0;f=h+ -1|0;if((h|0)<=0){j=c[d>>2]|0;break}h=c[d>>2]|0;k=f;l=g+4+(f<<4)|0;while(1){c[l>>2]=h;c[d>>2]=l;if((k|0)>0){f=l;k=k+ -1|0;l=l+ -16|0;h=f}else{j=l;break}}}else{j=e}}while(0);c[d>>2]=c[j>>2];d=a+8|0;c[d>>2]=(c[d>>2]|0)+1;c[j+8>>2]=0;c[j+12>>2]=0;i=b;return j|0}function Uma(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;dka(b+8|0);e=a+12|0;c[b>>2]=c[e>>2];c[e>>2]=b;b=a+8|0;e=(c[b>>2]|0)+ -1|0;c[b>>2]=e;if((e|0)!=0){i=d;return}Mma(a);i=d;return}function Vma(a,b){a=a|0;b=b|0;var c=0,e=0,f=0,g=0,h=0;c=i;if((b|0)>0){e=0;f=0}else{g=0;i=c;return g|0}while(1){h=(d[a+e>>0]|0)+(f*33|0)|0;e=e+1|0;if((e|0)==(b|0)){g=h;break}else{f=h}}i=c;return g|0}function Wma(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=Rma(a,b,e)|0;if((f|0)==0){g=0;i=e;return g|0}c[d>>2]=c[f+12>>2];g=1;i=e;return g|0}function Xma(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=c[a>>2]|0;if((e|0)==0){i=d;return}f=Vma(c[b>>2]|0,c[b+4>>2]|0)|0;g=e+(((f>>>0)%((c[a+4>>2]|0)>>>0)|0)<<2)|0;while(1){h=c[g>>2]|0;if((h|0)==0){j=6;break}if(vka(c[h+8>>2]|0,b)|0){break}else{g=h}}if((j|0)==6){i=d;return}c[g>>2]=c[h>>2];Uma(a,h);i=d;return}function Yma(a){a=a|0;var b=0;b=i;Qja(a+4|0,12,8,8);i=b;return}function Zma(a){a=a|0;var b=0;b=i;_ma(a);Rja(a+4|0);i=b;return}function _ma(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+4|0;e=c[a+12>>2]|0;if((e|0)>0){a=0;do{$ma(Vja(d,a)|0);a=a+1|0}while((a|0)!=(e|0))}Sja(d);i=b;return}function $ma(b){b=b|0;var d=0;d=i;if(!((a[b>>0]|0)==-1)){i=d;return}v2a(c[b+4>>2]|0);i=d;return}function ana(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=b+4|0;f=c[b+12>>2]|0;b=0;do{if((b|0)>=(f|0)){g=0;h=5;break}j=b;b=b+1|0}while((a[(Vja(e,j)|0)>>0]|0)==-2);if((h|0)==5){i=d;return g|0}g=b;i=d;return g|0}function bna(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;h=i;i=i+16|0;j=h;k=c[e>>2]|0;if((k|0)==0){i=h;return}l=k;k=b+4|0;m=Vja(k,l+ -1|0)|0;n=a[m>>0]|0;if(n<<24>>24==-1){o=d[m+1>>0]<<8|d[m+2>>0];c[j>>2]=c[m+4>>2];c[j+4>>2]=o}else if(n<<24>>24==-2){c[j>>2]=0;c[j+4>>2]=0}else{c[j>>2]=m+1;c[j+4>>2]=n&255}kka(f,j);c[g>>2]=c[m+8>>2];m=c[b+12>>2]|0;b=l;while(1){if((b|0)>=(m|0)){p=10;break}l=b;b=b+1|0;if(!((a[(Vja(k,l)|0)>>0]|0)==-2)){p=9;break}}if((p|0)==9){c[e>>2]=b;i=h;return}else if((p|0)==10){c[e>>2]=0;i=h;return}}function cna(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;f=c[d>>2]|0;if((f|0)==0){g=0;i=e;return g|0}h=f;f=b+4|0;j=c[(Vja(f,h+ -1|0)|0)+8>>2]|0;k=c[b+12>>2]|0;b=h;while(1){if((b|0)>=(k|0)){l=6;break}h=b;b=b+1|0;if(!((a[(Vja(f,h)|0)>>0]|0)==-2)){l=5;break}}if((l|0)==5){c[d>>2]=b;g=j;i=e;return g|0}else if((l|0)==6){c[d>>2]=0;g=j;i=e;return g|0}return 0}function dna(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=(ena(b,c[a>>2]|0,c[a+4>>2]|0)|0)==0&1;i=d;return e|0}function ena(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;h=a[b>>0]|0;if(f>>>0<8){if((h&255|0)==(f|0)){j=(Q2a(b+1|0,e,f)|0)==0&1}else{j=0}}else{if(h<<24>>24==-1?((d[b+1>>0]|0)<<8|(d[b+2>>0]|0)|0)==(f|0):0){j=(Q2a(c[b+4>>2]|0,e,f)|0)==0&1}else{j=0}}i=g;return j|0}function fna(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=Zja(a+4|0,b)|0;if((f|0)==0){g=0;i=e;return g|0}c[d>>2]=c[f+8>>2];g=1;i=e;return g|0}function gna(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=i;g=c[d+4>>2]|0;h=b+4|0;j=c[b+12>>2]|0;a:do{if((j|0)>0){b=c[d>>2]|0;k=0;while(1){l=Vja(h,k)|0;k=k+1|0;if((ena(l,b,g)|0)!=0){m=5;break}if((k|0)>=(j|0)){n=0;break}}if((m|0)==5){c[l+8>>2]=e;i=f;return}while(1){o=Vja(h,n)|0;n=n+1|0;if((a[o>>0]|0)==0){break}if((n|0)>=(j|0)){p=d;break a}}hna(o,b,g);c[o+8>>2]=e;i=f;return}else{p=d}}while(0);d=Uja(h)|0;hna(d,c[p>>2]|0,g);c[d+8>>2]=e;i=f;return}function hna(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;if((e|0)<8){a[b>>0]=e;c3a(b+1|0,d|0,e|0)|0;i=f;return}a[b>>0]=-1;a[b+1>>0]=(e|0)/256|0;a[b+2>>0]=e;g=w2a(e,1)|0;c[b+4>>2]=g;if((g|0)==0){i=f;return}c3a(g|0,d|0,e|0)|0;i=f;return}function ina(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=Uja(a+4|0)|0;hna(f,c[b>>2]|0,c[b+4>>2]|0);c[f+8>>2]=d;i=e;return}function jna(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;f=c[d+4>>2]|0;g=b+4|0;h=c[b+12>>2]|0;if((h|0)<=0){i=e;return}b=c[d>>2]|0;d=0;while(1){j=Vja(g,d)|0;d=d+1|0;if((ena(j,b,f)|0)!=0){break}if((d|0)>=(h|0)){k=6;break}}if((k|0)==6){i=e;return}$ma(j);a[j>>0]=-2;i=e;return}function kna(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;i=i+16|0;g=f;c[g>>2]=d;d=M1a(g,a,b>>>3,8,278)|0;if((d|0)==0){h=0;i=f;return h|0}c[e>>2]=c[d+4>>2];h=1;i=f;return h|0}function lna(a,b){a=a|0;b=b|0;return(c[a>>2]|0)-(c[b>>2]|0)|0}function mna(a){a=a|0;return(a>>>0<8?0:1)|0}function nna(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;g=c[b>>2]|0;if((g|0)==0){i=f;return}h=g;g=h+ -1|0;j=(c[a+12>>2]|0)>>>3;k=c[a+8>>2]|0;c[d>>2]=c[k+(g<<3)>>2];c[e>>2]=c[k+(g<<3)+4>>2];if((h|0)==(j|0)){c[b>>2]=0;i=f;return}else{c[b>>2]=(c[b>>2]|0)+1;i=f;return}}function ona(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;i=i+16|0;f=e;g=a+4|0;h=(c[a+12>>2]|0)>>>3;j=c[a+8>>2]|0;c[f>>2]=b;c[f+4>>2]=d;if((h|0)!=0?(a=h+ -1|0,!((c[j+(a<<3)>>2]|0)>>>0<b>>>0)):0){a:do{if((a|0)<0){k=0}else{h=a;l=0;while(1){m=l;while(1){n=(m+h|0)/2|0;o=c[j+(n<<3)>>2]|0;p=n+1|0;if(!(o>>>0<b>>>0)){break}if((n|0)<(h|0)){m=p}else{k=p;break a}}h=n+ -1|0;if(!(o>>>0>b>>>0)){break}if((m|0)>(h|0)){k=m;break a}else{l=m}}c[j+(n<<3)+4>>2]=d;i=e;return}}while(0);ola(g,k<<3,f);i=e;return}nla(g,f,8);i=e;return}function pna(a,b){a=a|0;b=b|0;var c=0;c=i;lla(a+4|0,b,1024);i=c;return}function qna(a){a=a|0;var b=0,c=0;b=i;c=u2a(a)|0;i=b;return c|0}function rna(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=x2a(a,b)|0;i=c;return d|0}function sna(a){a=a|0;var b=0;b=i;v2a(a);i=b;return}function tna(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=w2a((ca(d,b)|0)+4|0,1)|0;if((f|0)==0){g=0;i=e;return g|0}c[f>>2]=c[a>>2];c[a>>2]=f;g=f;i=e;return g|0}function una(a){a=a|0;var b=0,d=0;b=i;if((a|0)!=0){d=a;do{a=d;d=c[d>>2]|0;v2a(a)}while((d|0)!=0)}i=b;return}function vna(a){a=a|0;var b=0;b=i;jla(a+8|0);c[a>>2]=0;i=b;return}function wna(a,b){a=a|0;b=b|0;var c=0;c=i;vla(a+8|0,b);i=c;return}function xna(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=b&255;if(b<<24>>24>-1){c[a>>2]=0;vla(a+8|0,e);i=d;return}if((b&255)<192){f=c[a>>2]|0;if((f|0)==0){i=d;return}g=f+ -1|0;c[a>>2]=g;f=a+4|0;h=c[f>>2]|(e&63)<<g*6;c[f>>2]=h;if((g|0)!=0){i=d;return}vla(a+8|0,h);i=d;return}if((b&255)<224){c[a>>2]=1;c[a+4>>2]=e<<6&1984;i=d;return}if((b&255)<240){c[a>>2]=2;c[a+4>>2]=e<<12&61440;i=d;return}if((b&255)<248){c[a>>2]=3;c[a+4>>2]=e<<18&1835008;i=d;return}if((b&255)<252){c[a>>2]=4;c[a+4>>2]=e<<24&50331648;i=d;return}if(!((b&255)<254)){i=d;return}c[a>>2]=5;c[a+4>>2]=e<<30&1073741824;i=d;return}function yna(a){a=a|0;var b=0;b=i;zna(a);Jja(c[a>>2]|0);i=b;return}function zna(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a>>2]|0;e=c[a+4>>2]|0;if((e|0)>0){f=0;do{Ana(d+(f<<4)|0);f=f+1|0}while((f|0)!=(e|0))}Kja(a,0)|0;i=b;return}function Ana(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+4>>2]|0;if((d|0)==0){i=b;return}if((c[a+12>>2]|0)!=0){Rc[c[(c[d>>2]|0)+4>>2]&1023](d);i=b;return}e=c[a+8>>2]|0;if((e|0)==0){i=b;return}Rc[e&1023](d);i=b;return}function Bna(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;i=i+32|0;g=f+16|0;h=f;if((b|0)==0){i=f;return}j=c[a>>2]|0;k=c[a+4>>2]|0;a:do{if((k|0)>0){l=0;while(1){m=j+(l<<4)|0;n=l+1|0;if((c[m>>2]|0)==(b|0)){break}if((n|0)<(k|0)){l=n}else{break a}}Ana(m);c[j+(l<<4)+4>>2]=d;c[j+(l<<4)+8>>2]=e;i=f;return}}while(0);c[h>>2]=b;c[h+4>>2]=d;c[h+8>>2]=e;c[h+12>>2]=0;c[g+0>>2]=c[h+0>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];c[g+12>>2]=c[h+12>>2];Cna(a,g);i=f;return}function Cna(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+4|0;f=c[e>>2]|0;g=f+1|0;do{if((f|0)>=(c[a+8>>2]|0)){if((Kja(a,g)|0)==0){i=d;return}else{h=c[e>>2]|0;break}}else{c[e>>2]=g;h=g}}while(0);g=(c[a>>2]|0)+(h+ -1<<4)|0;c[g+0>>2]=c[b+0>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];i=d;return}function Dna(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=i;Bna(a,b,c,d);i=e;return}function Ena(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=c[a>>2]|0;e=c[a+4>>2]|0;if((e|0)>0){f=0}else{i=b;return}while(1){g=f+1|0;if((c[d+(f<<4)>>2]|0)==1){break}if((g|0)<(e|0)){f=g}else{h=5;break}}if((h|0)==5){i=b;return}Oja(a,f);i=b;return}function Fna(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=c[a>>2]|0;e=c[a+4>>2]|0;a:do{if((e|0)>0){a=0;while(1){f=a+1|0;if((c[d+(a<<4)>>2]|0)==100){break}if((f|0)<(e|0)){a=f}else{g=0;break a}}g=c[d+(a<<4)+4>>2]|0}else{g=0}}while(0);i=b;return g|0}function Gna(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;h=b+4|0;if((P2a(c[b>>2]|0,46,c[h>>2]|0)|0)!=0){c[d>>2]=0;g[e>>2]=+Hna(b);i=f;return}c[d>>2]=1;d=c[b>>2]|0;b=c[h>>2]|0;h=a[d>>0]|0;if(h<<24>>24==43){j=0;k=1}else{l=h<<24>>24==45&1;j=l;k=l}a:do{if((k|0)<(b|0)){l=k;h=0;while(1){m=a[d+l>>0]|0;if((m+ -48<<24>>24&255)>9){n=h;break a}o=(h*10|0)+ -48+(m<<24>>24)|0;l=l+1|0;if(!((o|0)>-1&(l|0)<(b|0))){n=o;break}else{h=o}}}else{n=0}}while(0);c[e>>2]=(j|0)==0?n:0-n|0;i=f;return}function Hna(b){b=b|0;var d=0,e=0,f=0.0,h=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0.0,r=0.0,s=0.0;d=i;e=c[b+4>>2]|0;if((e|0)==0){f=0.0;i=d;return+f}h=c[b>>2]|0;b=a[h>>0]|0;if(b<<24>>24==43){j=0;k=1}else{l=b<<24>>24==45&1;j=l;k=l}a:do{if((k|0)<(e|0)){l=k;while(1){b=a[h+l>>0]|0;if(!(b<<24>>24==45|b<<24>>24==43)){m=l;break a}b=l+1|0;if((b|0)<(e|0)){l=b}else{m=b;break}}}else{m=k}}while(0);b:do{if((m|0)<(e|0)){k=m;n=0.0;while(1){l=a[h+k>>0]|0;if(l<<24>>24==46){o=k;p=0;q=n;break}r=n*10.0+ +(l<<24>>24)+-48.0;k=k+1|0;if((k|0)>=(e|0)){s=r;break b}else{n=r}}while(1){o=o+1|0;if((o|0)>=(e|0)){s=q;break b}n=q+ +g[756368+(p<<2)>>2]*+((a[h+o>>0]|0)+ -48|0);p=p+1|0;if((p|0)==11){s=n;break}else{q=n}}}else{s=0.0}}while(0);if((j|0)==0){f=s;i=d;return+f}f=-s;i=d;return+f}function Ina(a){a=a|0;var b=0,c=0;b=i;c=yb(a|0)|0;i=b;return c|0}function Jna(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;if((b|0)!=0?(g=kb(b|0)|0,(g|0)!=0):0){mka(d,g+11|0);c[e>>2]=(a[g+10>>0]|0)==4&1;h=1}else{h=0}i=f;return h|0}function Kna(a){a=a|0;var b=0;b=i;if((a|0)!=0){tb(a|0)|0}i=b;return}function Lna(a){a=a|0;var b=0,d=0;b=i;d=c[a>>2]|0;if((d|0)!=0?(c[d>>2]=(c[d>>2]|0)+ -1,d=c[a>>2]|0,(c[d>>2]|0)<1):0){v2a(d)}i=b;return}function Mna(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;if((d|0)<0){if((b|0)!=0){f=T1a(b)|0;g=4}}else{f=d;g=4}if((g|0)==4?(f|0)!=0:0){g=Nna(f)|0;c[a>>2]=g;if((g|0)==0){i=e;return}c3a(g+12|0,b|0,f<<2|0)|0;i=e;return}c[a>>2]=0;i=e;return}function Nna(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;i=i+16|0;d=b;if((a|0)<1){e=0;i=b;return e|0}c[d>>2]=4;f=d+4|0;c[f>>2]=0;Lja(d,a+1|0);cla(d,12);g=w2a(ZJ(c[d>>2]|0,c[f>>2]|0)|0,1)|0;if((g|0)==0){e=0;i=b;return e|0}c[g+8>>2]=a;c[g+4>>2]=a;c[g>>2]=1;c[g+12+(a<<2)>>2]=0;e=g;i=b;return e|0}function Ona(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[b>>2]|0;if((e|0)==0){c[a>>2]=0;i=d;return}if((c[e>>2]|0)>-1){c[a>>2]=e;c[e>>2]=(c[e>>2]|0)+1;i=d;return}else{c[a>>2]=0;Pna(a,b);i=d;return}}function Pna(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=c[a>>2]|0;f=c[b>>2]|0;if((e|0)==(f|0)){i=d;return}if((dg(f)|0)!=0){Vna(a);i=d;return}if(!((e|0)!=0?(c[e>>2]|0)<0:0)){g=6}do{if((g|0)==6){if((f|0)!=0?(c[f>>2]|0)<0:0){break}Vna(a);e=c[b>>2]|0;c[a>>2]=e;if((e|0)==0){i=d;return}c[e>>2]=(c[e>>2]|0)+1;i=d;return}}while(0);Xna(a,c[f+4>>2]|0,f+12|0);i=d;return}function Qna(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=Nna(1)|0;c[a>>2]=e;if((e|0)==0){i=d;return}c[e+12>>2]=b;i=d;return}function Rna(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=b+4|0;f=c[e>>2]|0;if((f|0)==0){c[a>>2]=0;i=d;return}g=Nna(f)|0;c[a>>2]=g;if((g|0)==0){i=d;return}c3a(g+12|0,c[b>>2]|0,c[e>>2]<<2|0)|0;i=d;return}function Sna(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;c[a>>2]=0;f=b+4|0;g=d+4|0;h=(c[g>>2]|0)+(c[f>>2]|0)|0;if((h|0)==0){i=e;return}j=Nna(h)|0;c[a>>2]=j;if((j|0)==0){i=e;return}a=c[f>>2]|0;c3a(j+12|0,c[b>>2]|0,a<<2|0)|0;c3a(j+(a<<2)+12|0,c[d>>2]|0,c[g>>2]<<2|0)|0;i=e;return}function Tna(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;if((c[a>>2]|0)==0){i=d;return}Una(a);if((b|0)==-1){e=c[a>>2]|0;if((e|0)!=0){f=T1a(e+12|0)|0;g=5}}else{f=b;g=5}if((g|0)==5?(f|0)!=0:0){g=c[a>>2]|0;if((f|0)>(c[g+8>>2]|0)){_a(756416,756456,127,756496)}c[g+4>>2]=f;c[(c[a>>2]|0)+(f<<2)+12>>2]=0;i=d;return}Vna(a);i=d;return}function Una(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a>>2]|0;if((d|0)==0){i=b;return}e=c[d>>2]|0;if((e|0)<2){i=b;return}c[d>>2]=e+ -1;e=c[d+4>>2]|0;f=Nna(e)|0;c[a>>2]=f;if((f|0)==0){i=b;return}c3a(f+12|0,d+12|0,(e<<2)+4|0)|0;i=b;return}function Vna(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;if((d|0)==0){i=b;return}e=c[d>>2]|0;if((e|0)>1){c[d>>2]=e+ -1}else{v2a(d)}c[a>>2]=0;i=b;return}function Wna(a,b){a=a|0;b=b|0;var d=0;d=i;if((b|0)!=0?(c[b>>2]|0)!=0:0){Xna(a,T1a(b)|0,b);i=d;return}Vna(a);i=d;return}function Xna(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;hoa(a,b);c3a((c[a>>2]|0)+12|0,d|0,b<<2|0)|0;c[(c[a>>2]|0)+4>>2]=b;c[(c[a>>2]|0)+(b<<2)+12>>2]=0;i=e;return}function Yna(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[b+4>>2]|0;if((e|0)==0){Vna(a);i=d;return}else{Xna(a,e,c[b>>2]|0);i=d;return}}function Zna(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;c[e>>2]=b;_na(a,1,e);i=d;return}function _na(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;if((b|0)==0|(d|0)==0){i=e;return}f=c[a>>2]|0;if((f|0)==0){g=Nna(b)|0;c[a>>2]=g;if((g|0)==0){i=e;return}c3a(g+12|0,d|0,b<<2|0)|0;i=e;return}g=c[f+4>>2]|0;if((c[f>>2]|0)<=1?(g+b|0)<=(c[f+8>>2]|0):0){c3a(f+(g<<2)+12|0,d|0,b<<2|0)|0;h=(c[a>>2]|0)+4|0;c[h>>2]=(c[h>>2]|0)+b;h=c[a>>2]|0;c[h+(c[h+4>>2]<<2)+12>>2]=0;i=e;return}foa(a,g,f+12|0,b,d);goa(f);i=e;return}function $na(a,b){a=a|0;b=b|0;var d=0;d=i;if((b|0)==0){i=d;return}_na(a,c[b+4>>2]|0,b+12|0);i=d;return}function aoa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;Wn(e,b);b=boa(c[a>>2]|0,c[e>>2]|0,c[e+4>>2]|0)|0;i=d;return b|0}function boa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;if((a|0)!=0){if((c[a+4>>2]|0)==(d|0)){f=(Q2a(b,a+12|0,d<<2)|0)==0}else{f=0}}else{f=(d|0)==0}i=e;return f|0}function coa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;Ah(e,b);b=boa(c[a>>2]|0,c[e>>2]|0,c[e+4>>2]|0)|0;i=d;return b|0}function doa(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b;Wn(d,1292088);e=(boa(c[a>>2]|0,c[d>>2]|0,c[d+4>>2]|0)|0)^1;i=b;return e|0}function eoa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;Ah(e,b);b=(boa(c[a>>2]|0,c[e>>2]|0,c[e+4>>2]|0)|0)^1;i=d;return b|0}function foa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;h=e+b|0;if((h|0)==0){i=g;return}j=Nna(h)|0;c[a>>2]=j;if((j|0)==0){i=g;return}c3a(j+12|0,d|0,b<<2|0)|0;c3a(j+(b<<2)+12|0,f|0,e<<2|0)|0;i=g;return}function goa(a){a=a|0;var b=0,d=0;b=i;if((a|0)!=0?(d=c[a>>2]|0,c[a>>2]=d+ -1,(d|0)<2):0){v2a(a)}i=b;return}function hoa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[a>>2]|0;if(((e|0)!=0?(c[e>>2]|0)<2:0)?(c[e+8>>2]|0)>=(b|0):0){i=d;return}Vna(a);c[a>>2]=Nna(b)|0;i=d;return}function ioa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;i=i+16|0;f=e+8|0;g=e;h=c[d>>2]|0;if((h|0)==0){c[f>>2]=756512;c[f+4>>2]=2;jka(b,f);i=e;return}f=c[h+4>>2]|0;c[g>>2]=0;h=f<<1;j=h+2|0;k=Bka(g,j)|0;if((f|0)>0){l=0;do{m=l<<1;a[k+m>>0]=c[(c[d>>2]|0)+(l<<2)+12>>2];a[k+(m|1)>>0]=(c[(c[d>>2]|0)+(l<<2)+12>>2]|0)>>>8;l=l+1|0}while((l|0)!=(f|0))}a[k+h>>0]=0;a[k+(h|1)>>0]=0;Aka(g,j);hka(b,g);dka(g);i=e;return}function joa(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;i=i+16|0;d=c;qoa(d,756520,b);Pna(a,d);Lna(d);i=c;return}function koa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;loa(a,b)|0;b=c[a>>2]|0;if((b|0)==0){e=0}else{e=c[b+4>>2]|0}Tna(a,e);i=d;return}function loa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=c[a>>2]|0;f=(e|0)==0;if(f&(b|0)==0){g=0;i=d;return g|0}if(f){f=Nna(b)|0;c[a>>2]=f;if((f|0)==0){g=0;i=d;return g|0}c[f+4>>2]=0;h=f+12|0;c[h>>2]=0;g=h;i=d;return g|0}if((c[e>>2]|0)<2?(c[e+8>>2]|0)>=(b|0):0){g=e+12|0;i=d;return g|0}h=c[e+4>>2]|0;f=Nna((h|0)>(b|0)?h:b)|0;c[a>>2]=f;if((f|0)==0){g=0;i=d;return g|0}c3a(f+12|0,e+12|0,(h<<2)+4|0)|0;c[f+4>>2]=h;h=c[e>>2]|0;c[e>>2]=h+ -1;if((h|0)<2){v2a(e)}g=(c[a>>2]|0)+12|0;i=d;return g|0}function moa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;c[a>>2]=0;eka(e,b,-1);joa(a,e);dka(e);i=d;return}function noa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;if((c[a>>2]|0)==0){i=b;return}Una(a);d=c[a>>2]|0;if((d|0)==0){i=b;return}e=c[d+4>>2]|0;if((e|0)<1){i=b;return}else{f=e}while(1){if((f|0)==0){g=0;break}h=f+ -1|0;if((S1a(756968,c[d+(h<<2)+12>>2]|0)|0)==0){g=f;break}else{f=h}}if((g|0)>=(e|0)){i=b;return}c[d+(g<<2)+12>>2]=0;c[(c[a>>2]|0)+4>>2]=g;i=b;return}function ooa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;Una(a);e=c[a>>2]|0;if((e|0)!=0){f=c[e+4>>2]|0;g=(f|0)<0?f:0;h=f+1|0;if((c[e+8>>2]|0)<(h|0)){j=g;k=h;l=e;m=3}else{n=g;o=e;p=h}}else{j=0;k=1;l=0;m=3}do{if((m|0)==3){h=Nna(k)|0;c[a>>2]=h;if((h|0)==0){i=d;return}e=h+12|0;if((l|0)==0){c[e>>2]=0;n=j;o=h;p=k;break}else{d3a(e|0,l+12|0,(c[l+4>>2]<<2)+4|0)|0;goa(l);n=j;o=c[a>>2]|0;p=k;break}}}while(0);d3a(o+(n+1<<2)+12|0,o+(n<<2)+12|0,p-n<<2|0)|0;c[(c[a>>2]|0)+(n<<2)+12>>2]=b;c[(c[a>>2]|0)+4>>2]=p;i=d;return}function poa(a){a=a|0;var b=0,c=0;b=i;if((a|0)==0){c=0}else{c=ima(a+12|0)|0}i=b;return c|0}function qoa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+16|0;f=e;g=c[d>>2]|0;if((g|0)==0){h=0}else{h=c[g+4>>2]|0}j=c[b+8>>2]|0;if((j|0)==0){k=g}else{jd[j&0]()|0;k=c[d>>2]|0}j=sma((k|0)==0?1305928:k+12|0,h,0,0)|0;if((j|0)==0){c[a>>2]=0;i=e;return}else{c[f>>2]=0;k=loa(f,j)|0;g=c[d>>2]|0;sma((g|0)==0?1305928:g+12|0,h,k,j)|0;Tna(f,j);Ona(a,f);Lna(f);i=e;return}}function roa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+16|0;f=e;g=c[d>>2]|0;if((g|0)==0){h=0}else{h=c[g+4>>2]|0}j=c[b+8>>2]|0;if((j|0)==0){k=g}else{jd[j&0]()|0;k=c[d>>2]|0}j=rma((k|0)==0?1292088:k+12|0,h,0,0)|0;if((j|0)==0){c[a>>2]=0;i=e;return}else{c[f>>2]=0;k=Bka(f,j)|0;g=c[d>>2]|0;rma((g|0)==0?1292088:g+12|0,h,k,j)|0;Aka(f,j);hka(a,f);dka(f);i=e;return}}function soa(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=u2a(60)|0;Roa(d,a,b);i=c;return d|0}function toa(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+24|0;e=(c[d>>2]|0)+ -1|0;c[d>>2]=e;if((e|0)!=0|(a|0)==0){i=b;return}Qoa(a);v2a(a);i=b;return}function uoa(a){a=a|0;return(c[a+36>>2]|0)>>>0>=(c[((c[a+48>>2]|0)==0?a+32|0:a+56|0)>>2]|0)>>>0|0}function voa(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+36>>2]|0;if((c[a+48>>2]|0)==0){e=d;i=b;return e|0}e=d-(c[a+52>>2]|0)|0;i=b;return e|0}function woa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=c[a+36>>2]|0;g=c[a+32>>2]|0;if(!(f>>>0<g>>>0)){i=e;return 0}if((c[a+48>>2]|0)==0){h=d}else{j=(c[a+52>>2]|0)-f+(c[a+56>>2]|0)|0;h=j>>>0<d>>>0?j:d}d=g-f|0;g=h>>>0<d>>>0?h:d;d=(Aoa(a,b,f,g)|0)==0;i=e;return(d?0:g)|0}function xoa(a){a=a|0;return c[((c[a+48>>2]|0)==0?a+32|0:a+56|0)>>2]|0}function yoa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;if((b|0)<0){f=0;i=e;return f|0}if((d+b|0)>>>0>(c[a+32>>2]|0)>>>0){f=0;i=e;return f|0}c[a+52>>2]=b;c[a+56>>2]=d;c[a+48>>2]=1;c[a+36>>2]=b;f=1;i=e;return f|0}function zoa(a){a=a|0;c[a+48>>2]=0;return}function Aoa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;if((b|0)==0|(e|0)==0){g=0;i=f;return g|0}if((c[a+48>>2]|0)==0){h=d}else{h=(c[a+52>>2]|0)+d|0}d=h+e|0;if(d>>>0>(c[a+32>>2]|0)>>>0){g=0;i=f;return g|0}c[a+36>>2]=d;if((c[a+44>>2]&1|0)!=0){c3a(b|0,(c[(Hg(a+8|0,0)|0)>>2]|0)+h|0,e|0)|0;g=1;i=f;return g|0}d=a+40|0;j=c[d>>2]|0;k=(h>>>0)/(j>>>0)|0;l=a+8|0;a=b;b=e;e=h-(ca(k,j)|0)|0;h=j;j=k;while(1){k=h-e|0;m=k>>>0>b>>>0?b:k;c3a(a|0,(c[(Hg(l,j)|0)>>2]|0)+e|0,m|0)|0;if((b|0)==(m|0)){g=1;break}a=a+m|0;b=b-m|0;e=0;h=c[d>>2]|0;j=j+1|0}i=f;return g|0}function Boa(a){a=a|0;var b=0;b=a+24|0;c[b>>2]=(c[b>>2]|0)+1;return a|0}function Coa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=i;if((b|0)==0|(e|0)==0){g=0;i=f;return g|0}if((c[a+48>>2]|0)==0){h=d}else{h=(c[a+52>>2]|0)+d|0}d=h+e|0;if((c[a+44>>2]&1|0)==0){if((Poa(a,d)|0)==0){g=0;i=f;return g|0}c[a+36>>2]=d;j=a+40|0;k=c[j>>2]|0;l=(h>>>0)/(k>>>0)|0;m=a+8|0;n=e;o=b;p=h-(ca(l,k)|0)|0;q=k;k=l;while(1){l=q-p|0;r=l>>>0>n>>>0?n:l;c3a((c[(Hg(m,k)|0)>>2]|0)+p|0,o|0,r|0)|0;if((n|0)==(r|0)){g=1;break}n=n-r|0;o=o+r|0;p=0;q=c[j>>2]|0;k=k+1|0}i=f;return g|0}k=a+36|0;c[k>>2]=d;j=a+28|0;if(d>>>0>(c[j>>2]|0)>>>0){q=c[a+40>>2]|0;p=d+ -1+q|0;d=p-((p>>>0)%(q>>>0)|0)|0;c[j>>2]=d;q=a+8|0;if((c[a+12>>2]|0)<1){yg(q,w2a(d,1)|0)}else{d=c[(Hg(q,0)|0)>>2]|0;p=x2a(d,c[j>>2]|0)|0;c[(Hg(q,0)|0)>>2]=p}if((c[(Hg(q,0)|0)>>2]|0)==0){Kja(q,0)|0;g=0;i=f;return g|0}else{s=q}}else{s=a+8|0}c3a((c[(Hg(s,0)|0)>>2]|0)+h|0,b|0,e|0)|0;e=a+32|0;a=c[k>>2]|0;if(!((c[e>>2]|0)>>>0<a>>>0)){g=1;i=f;return g|0}c[e>>2]=a;g=1;i=f;return g|0}function Doa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=c[a>>2]|0;g=c[f+36>>2]|0;h=Lc[c[f+16>>2]&255](a)|0;f=id[g&511](a,b,h,d)|0;i=e;return f|0}function Eoa(a){a=a|0;return 1}function Foa(a){a=a|0;return c[a+44>>2]&1|0}function Goa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=a+8|0;g=(c[a+12>>2]|0)<1;if((c[a+44>>2]&1|0)==0){if(!g){i=e;return}c[a+40>>2]=d>>>0>4096?d:4096;i=e;return}if(g?(g=w2a(b>>>0>4096?b:4096,1)|0,(g|0)!=0):0){yg(f,g)}c[a+40>>2]=d>>>0>4096?d:4096;i=e;return}function Hoa(a){a=a|0;var b=0,d=0;b=i;if((c[a+12>>2]|0)==0){d=0;i=b;return d|0}d=Qg(a+8|0,0)|0;i=b;return d|0}function Ioa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;g=a+44|0;if((c[g>>2]&1|0)==0){i=f;return}h=a+8|0;Kja(h,0)|0;yg(h,b);c[a+32>>2]=d;c[a+28>>2]=d;c[a+36>>2]=0;c[g>>2]=(e|0)!=0?3:1;c[a+48>>2]=0;i=f;return}function Joa(a){a=a|0;var b=0,d=0;b=i;d=a+44|0;if((c[d>>2]&1|0)==0){i=b;return}Kja(a+8|0,0)|0;c[a+36>>2]=0;c[a+32>>2]=0;c[a+28>>2]=0;c[d>>2]=2;c[a+48>>2]=0;i=b;return}function Koa(a){a=a|0;var b=0;b=i;toa(a+ -4|0);i=b;return}function Loa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=a+ -4|0;a=c[f>>2]|0;g=c[a+36>>2]|0;h=Lc[c[a+16>>2]&255](f)|0;a=id[g&511](f,b,h,d)|0;i=e;return a|0}function Moa(a){a=a|0;var b=0;b=a+ -4|0;return c[((c[b+48>>2]|0)==0?b+32|0:b+56|0)>>2]|0}function Noa(a){a=a|0;return 1}function Ooa(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=i;f=Coa(a+ -4|0,b,c,d)|0;i=e;return f|0}function Poa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;e=a+32|0;if((c[e>>2]|0)>>>0<b>>>0){c[e>>2]=b}e=a+28|0;f=c[e>>2]|0;if(!(f>>>0<b>>>0)){g=1;i=d;return g|0}h=a+8|0;j=c[a+12>>2]|0;k=a+40|0;a=c[k>>2]|0;l=((b+ -1-f+a|0)>>>0)/(a>>>0)|0;Kja(h,l+j|0)|0;if((l|0)==0){g=1;i=d;return g|0}a=l;l=c[k>>2]|0;f=j;while(1){a=a+ -1|0;j=w2a(l,1)|0;if((j|0)==0){g=0;m=8;break}PH(h,f,j);l=c[k>>2]|0;c[e>>2]=(c[e>>2]|0)+l;if((a|0)==0){g=1;m=8;break}else{f=f+1|0}}if((m|0)==8){i=d;return g|0}return 0}function Qoa(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;c[a>>2]=756544;c[a+4>>2]=756620;if((c[a+44>>2]&2|0)!=0?(d=a+12|0,(c[d>>2]|0)>0):0){e=a+8|0;f=0;do{v2a(c[(Hg(e,f)|0)>>2]|0);f=f+1|0}while((f|0)<(c[d>>2]|0))}d=a+8|0;Kja(d,0)|0;Jja(c[d>>2]|0);i=b;return}function Roa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;c[a>>2]=756544;c[a+4>>2]=756620;f=a+8|0;Ija(f,4);c[a+24>>2]=1;c[a+28>>2]=d;c[a+32>>2]=d;c[a+36>>2]=0;c[a+40>>2]=65536;c[a+48>>2]=0;yg(f,b);c[a+44>>2]=1;i=e;return}function Soa(a,b){a=a|0;b=b|0;var d=0;d=i;if((b|0)==0){i=d;return}Rc[c[c[a>>2]>>2]&1023](a);i=d;return}function Toa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=u2a(16)|0;c[f>>2]=757080;c[f+4>>2]=b;c[f+8>>2]=d;c[f+12>>2]=0;c[a>>2]=f;if((f|0)==0){g=0;i=e;return g|0}c[a+4>>2]=1;c[a+8>>2]=0;g=Uoa(a)|0;i=e;return g|0}function Uoa(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a>>2]|0;if((dd[c[(c[d>>2]|0)+16>>2]&511](d,0)|0)==0){e=0;i=b;return e|0}d=c[a>>2]|0;c[a+16>>2]=Lc[c[(c[d>>2]|0)+20>>2]&255](d)|0;d=c[a>>2]|0;f=a+20|0;c[f>>2]=Lc[c[(c[d>>2]|0)+24>>2]&255](d)|0;d=c[a>>2]|0;c[a+24>>2]=Lc[c[(c[d>>2]|0)+28>>2]&255](d)|0;c[a+28>>2]=0;e=(c[f>>2]|0)!=0&1;i=b;return e|0}function Voa(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;if((Lc[c[(c[d>>2]|0)+4>>2]&255](d)|0)==0){e=0;i=b;return e|0}e=(c[a+28>>2]|0)>>>0>=(c[a+20>>2]|0)>>>0&1;i=b;return e|0}function Woa(a){a=a|0;var b=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;e=a+24|0;f=a+28|0;g=a+8|0;c[g>>2]=(c[f>>2]|0)+(c[e>>2]|0);if((Voa(a)|0)!=0){i=b;return}h=a+20|0;j=a+16|0;while(1){k=c[f>>2]|0;if(!(k>>>0<(c[h>>2]|0)>>>0)){c[g>>2]=k+(c[e>>2]|0);if((Voa(a)|0)!=0){l=9;break}if((Uoa(a)|0)==0){l=9;break}else{continue}}else{if(((d[(c[j>>2]|0)+k>>0]|0)+ -33|0)>>>0<221){l=5;break}c[f>>2]=k+1;continue}}if((l|0)==5){c[g>>2]=k+(c[e>>2]|0);i=b;return}else if((l|0)==9){i=b;return}}function Xoa(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=i;i=i+32|0;g=f+16|0;h=f+8|0;j=f;k=b+24|0;l=b+28|0;m=b+8|0;c[m>>2]=(c[l>>2]|0)+(c[k>>2]|0);if((Voa(b)|0)!=0){i=f;return}gla(g);n=b+20|0;o=b+16|0;p=g+4|0;q=g+8|0;while(1){r=c[l>>2]|0;if(!(r>>>0<(c[n>>2]|0)>>>0)){c[m>>2]=r+(c[k>>2]|0);if((Voa(b)|0)!=0){break}if((Uoa(b)|0)==0){break}else{continue}}s=a[(c[o>>2]|0)+r>>0]|0;if(s<<24>>24==58){pla(h,c[p>>2]|0,c[q>>2]|0);kka(d,h);jla(g)}else{if((a[756640+(s&255)>>0]&16)==0){t=9;break}vF(g,s)}c[l>>2]=(c[l>>2]|0)+1}if((t|0)==9){c[m>>2]=r+(c[k>>2]|0)}k=c[p>>2]|0;pla(j,k,c[q>>2]|0);kka(e,j);ila(k);i=f;return}function Yoa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;f=b+24|0;g=b+28|0;h=b+8|0;c[h>>2]=(c[g>>2]|0)+(c[f>>2]|0);if((Voa(b)|0)!=0){i=e;return}j=c[d+4>>2]|0;k=b+20|0;l=b+16|0;m=0;a:while(1){n=(m|0)==(j|0);while(1){o=c[g>>2]|0;if(o>>>0<(c[k>>2]|0)>>>0){break}c[h>>2]=o+(c[f>>2]|0);if(n){p=14;break a}if((Voa(b)|0)!=0){p=11;break a}if((Uoa(b)|0)==0){p=11;break a}}n=a[(c[d>>2]|0)+m>>0]|0;q=o+1|0;c[g>>2]=q;if(!(n<<24>>24==(a[(c[l>>2]|0)+o>>0]|0))){m=0;continue}m=m+1|0;if((m|0)==(j|0)){p=7;break}}if((p|0)==7){c[h>>2]=q+(c[f>>2]|0);i=e;return}else if((p|0)==11){q=c[b>>2]|0;if((Lc[c[(c[q>>2]|0)+4>>2]&255](q)|0)==0){do{Uoa(b)|0;c[h>>2]=(c[k>>2]|0)+(c[f>>2]|0);q=c[b>>2]|0}while((Lc[c[(c[q>>2]|0)+4>>2]&255](q)|0)==0)}c[g>>2]=c[k>>2];i=e;return}else if((p|0)==14){i=e;return}}function Zoa(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;d=i;i=i+64|0;e=d+48|0;f=d+40|0;g=d+32|0;h=d+24|0;j=d+16|0;k=d+8|0;l=d;m=b+24|0;n=b+28|0;o=b+8|0;c[o>>2]=(c[n>>2]|0)+(c[m>>2]|0);if((Voa(b)|0)!=0){p=0;i=d;return p|0}gla(e);q=b+20|0;r=b+16|0;s=0;t=0;a:while(1){u=t;b:while(1){v=(u|0)==10;while(1){w=c[n>>2]|0;if(w>>>0<(c[q>>2]|0)>>>0){break}c[o>>2]=w+(c[m>>2]|0);if(v){x=s;break a}if((Voa(b)|0)!=0){x=s;break a}if((Uoa(b)|0)==0){x=s;break a}}y=a[(c[r>>2]|0)+w>>0]|0;switch(u|0){case 0:{if(y<<24>>24==35){z=2}else{A=8;break b}break};case 1:{A=8;break b;break};case 2:{if(y<<24>>24==120){z=4}else{A=17;break b}break};case 4:{A=20;break b;break};case 3:{A=17;break b;break};case 10:{B=s;A=26;break a;break};default:{C=s;t=u;s=C;continue a}}c[n>>2]=w+1;u=z}if((A|0)==8){A=0;c[n>>2]=w+1;if(y<<24>>24==59){A=9;break}vF(e,y);C=s;t=1;s=C;continue}else if((A|0)==17){A=0;c[n>>2]=w+1;u=y&255;if(y<<24>>24==59){B=s;A=26;break}if((u+ -48|0)>>>0>9){C=s;t=3;s=C;continue}s=(s*10|0)+ -48+u|0;t=3;continue}else if((A|0)==20){A=0;c[n>>2]=w+1;u=y&255;if(y<<24>>24==59){B=s;A=26;break}v=a[756640+u>>0]&96;if((v|0)==0){C=s;t=4;s=C;continue}else if((v|0)==32){s=(s<<4)+ -48+u|0;t=4;continue}D=u+(s<<4)|0;if((v|0)==64){s=D+ -87|0;t=4;continue}else{s=D+ -55|0;t=4;continue}}}if((A|0)==9){pla(f,c[e+4>>2]|0,c[e+8>>2]|0);c[g>>2]=756896;c[g+4>>2]=2;if(!(Ue(f,g)|0)){c[h>>2]=756904;c[h+4>>2]=2;if(!(Ue(f,h)|0)){c[j>>2]=756912;c[j+4>>2]=3;if(!(Ue(f,j)|0)){c[k>>2]=756920;c[k+4>>2]=4;if(Ue(f,k)|0){B=39;A=26}else{c[l>>2]=756928;c[l+4>>2]=4;k=Ue(f,l)|0;B=k?34:s;A=26}}else{B=38;A=26}}else{B=60;A=26}}else{B=62;A=26}}if((A|0)==26){c[o>>2]=(c[n>>2]|0)+(c[m>>2]|0);x=B}ila(c[e+4>>2]|0);p=x;i=d;return p|0}function _oa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;e=i;i=i+48|0;f=e+16|0;g=e+8|0;h=e;j=b+24|0;k=b+28|0;l=b+8|0;c[l>>2]=(c[k>>2]|0)+(c[j>>2]|0);if((Voa(b)|0)!=0){i=e;return}gla(f+8|0);c[f>>2]=0;m=b+20|0;n=b+16|0;o=0;a:while(1){p=o<<24>>24==0;q=0;while(1){r=q<<24>>24==o<<24>>24;while(1){s=c[k>>2]|0;if(s>>>0<(c[m>>2]|0)>>>0){break}c[l>>2]=s+(c[j>>2]|0);if(r){t=18;break a}if((Voa(b)|0)!=0){t=18;break a}if((Uoa(b)|0)==0){t=18;break a}}u=a[(c[n>>2]|0)+s>>0]|0;if(p){break}v=s+1|0;c[k>>2]=v;if(u<<24>>24==o<<24>>24){t=10;break a}if(u<<24>>24==38){wna(f,Zoa(b)|0);if((Voa(b)|0)==0){q=38;continue}else{t=13;break a}}else{xna(f,u);q=u;continue}}if(!(u<<24>>24==34|u<<24>>24==39)){t=19;break}c[k>>2]=s+1;o=u}if((t|0)==10){c[l>>2]=v+(c[j>>2]|0);t=18}else if((t|0)==13){j=c[f+12>>2]|0;yla(g,j,c[f+16>>2]|0);Yna(d,g);w=j}else if((t|0)==19){w=c[f+12>>2]|0}if((t|0)==18){t=c[f+12>>2]|0;yla(h,t,c[f+16>>2]|0);Yna(d,h);w=t}ila(w);i=e;return}function $oa(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;h=i;i=i+16|0;j=h+8|0;k=h;l=b+24|0;m=b+28|0;n=b+8|0;c[n>>2]=(c[m>>2]|0)+(c[l>>2]|0);if((Voa(b)|0)!=0){i=h;return}c[f>>2]=0;o=b+20|0;p=b+16|0;q=j+4|0;r=k+4|0;s=(g|0)!=0&1;a:while(1){while(1){t=c[m>>2]|0;if(t>>>0<(c[o>>2]|0)>>>0){u=a[(c[p>>2]|0)+t>>0]|0;if((s|0)==1){break}else if((s|0)==0){v=6;break}else{continue}}c[n>>2]=(c[l>>2]|0)+t;if((Voa(b)|0)!=0){v=14;break a}if((Uoa(b)|0)==0){v=14;break a}}if((v|0)==6){v=0;c[m>>2]=t+1;s=u<<24>>24==60&1;continue}if(u<<24>>24==63){c[m>>2]=t+1;c[j>>2]=756936;c[q>>2]=2;Yoa(b,j);s=0;continue}else if(u<<24>>24==47){v=10;break}else if(u<<24>>24==33){c[m>>2]=t+1;c[k>>2]=756944;c[r>>2]=3;Yoa(b,k);s=0;continue}else{v=11;break}}if((v|0)==10){c[m>>2]=t+1;Xoa(b,d,e);c[f>>2]=1;i=h;return}else if((v|0)==11){Xoa(b,d,e);c[f>>2]=0;i=h;return}else if((v|0)==14){i=h;return}}function apa(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0;g=i;i=i+224|0;h=g+208|0;j=g+204|0;k=g+200|0;l=g+192|0;m=g+184|0;n=g+176|0;o=g+172|0;p=g+168|0;q=g+160|0;r=g+152|0;s=g+144|0;t=g+120|0;u=g+104|0;v=g+96|0;w=g+92|0;x=g+88|0;y=g+80|0;z=g+72|0;A=g+64|0;B=g+56|0;C=g+48|0;D=g+40|0;E=g+32|0;F=g+24|0;G=g+16|0;H=g+8|0;I=g;J=b+24|0;K=b+28|0;L=b+8|0;c[L>>2]=(c[K>>2]|0)+(c[J>>2]|0);if((Voa(b)|0)!=0){M=0;i=g;return M|0}c[h>>2]=0;c[j>>2]=0;$oa(b,j,h,k,f);f=c[h>>2]|0;do{if((((f|0)!=0?(c[f+4>>2]|0)!=0:0)?(c[k>>2]|0)==0:0)?(N=u2a(32)|0,fpa(N),(N|0)!=0):0){c[N>>2]=e;oe(l,j);oe(m,h);Gpa(N,l,m);O=b+20|0;P=b+16|0;Q=N+12|0;do{c[n>>2]=0;c[o>>2]=0;while(1){if(!((c[K>>2]|0)>>>0<(c[O>>2]|0)>>>0)){break}Woa(b);if((Voa(b)|0)!=0){break}if((a[756640+(d[(c[P>>2]|0)+(c[K>>2]|0)>>0]|0)>>0]&8)==0){break}Xoa(b,n,o);Woa(b);if((Voa(b)|0)!=0){break}R=c[K>>2]|0;if((a[(c[P>>2]|0)+R>>0]|0)!=61){break}c[K>>2]=R+1;Woa(b);if((Voa(b)|0)!=0){break}c[p>>2]=0;_oa(b,p);oe(q,n);oe(r,o);Ah(s,p);bpa(Q,q,r,s);Lna(p)}R=c[K>>2]|0;c[L>>2]=R+(c[J>>2]|0);if(R>>>0<(c[O>>2]|0)>>>0){S=18;break}R=(Voa(b)|0)!=0;dka(o);dka(n);if(R){break}}while((Uoa(b)|0)!=0);if((S|0)==18){dka(o);dka(n)}Woa(b);if((Voa(b)|0)==0){Q=c[K>>2]|0;R=Q+1|0;c[K>>2]=R;T=a[(c[P>>2]|0)+Q>>0]|0;if(T<<24>>24==47){U=Q+2|0;c[K>>2]=U;c[L>>2]=(c[J>>2]|0)+U;V=N;break}else if(T<<24>>24==62){Woa(b);if((Voa(b)|0)!=0){V=N;break}gla(t+8|0);c[t>>2]=0;gla(u);T=b+12|0;U=N+16|0;Q=v+4|0;W=E+4|0;X=C+4|0;Y=D+4|0;Z=t+12|0;_=t+16|0;$=y+4|0;aa=u+4|0;ba=u+8|0;ca=0;while(1){da=c[K>>2]|0;if(!(da>>>0<(c[O>>2]|0)>>>0)){c[L>>2]=da+(c[J>>2]|0);if((Voa(b)|0)!=0){break}if((Uoa(b)|0)==0){break}else{ea=ca;ca=ea;continue}}c[K>>2]=da+1;fa=a[(c[P>>2]|0)+da>>0]|0;if((ca|0)==1){if(fa<<24>>24==63){c[v>>2]=756936;c[Q>>2]=2;Yoa(b,v);Woa(b);ca=0;continue}else if(fa<<24>>24==33){ca=2;continue}else if(fa<<24>>24==47){S=32;break}yla(y,c[Z>>2]|0,c[_>>2]|0);wla(u,c[y>>2]|0,c[$>>2]|0);yla(A,c[aa>>2]|0,c[ba>>2]|0);Rna(z,A);if((c[T>>2]|0)==0){noa(z)}Ah(B,z);cpa(B,N);jla(u);vna(t);c[K>>2]=(c[K>>2]|0)+ -1;ga=apa(b,N,1)|0;if((ga|0)!=0){c[ga>>2]=N;yg(U,1);yg(U,ga);Woa(b)}Lna(z);ca=0;continue}else if((ca|0)==0){if(fa<<24>>24==38){c[t>>2]=0;wna(t,Zoa(b)|0);ca=0;continue}else if(fa<<24>>24==60){ca=1;continue}else{xna(t,fa);ca=0;continue}}else if((ca|0)==2){if(fa<<24>>24==45){c[K>>2]=da+2;c[D>>2]=756944;c[Y>>2]=3;Yoa(b,D)}else if(fa<<24>>24==91){c[C>>2]=756952;c[X>>2]=3;Yoa(b,C)}else{c[E>>2]=756960;c[W>>2]=1;Yoa(b,E)}vna(t);Woa(b);ca=0;continue}else{ea=ca;ca=ea;continue}}if((S|0)==32){c[w>>2]=0;c[x>>2]=0;Xoa(b,w,x);Woa(b);c[K>>2]=(c[K>>2]|0)+1;dka(x);dka(w);c[L>>2]=(c[K>>2]|0)+(c[J>>2]|0)}yla(F,c[Z>>2]|0,c[_>>2]|0);wla(u,c[F>>2]|0,c[F+4>>2]|0);yla(H,c[aa>>2]|0,c[ba>>2]|0);Rna(G,H);if((c[T>>2]|0)==0){noa(G)}Ah(I,G);cpa(I,N);jla(u);vna(t);Lna(G);ila(c[aa>>2]|0);ila(c[Z>>2]|0);V=N;break}else{c[L>>2]=(c[J>>2]|0)+R;gpa(N);v2a(N);V=0;break}}else{V=N}}else{V=0}}while(0);dka(j);dka(h);M=V;i=g;return M|0}function bpa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;g=b+4|0;h=0;while(1){j=c[a>>2]|0;k=(j|0)==0;if(k){l=0}else{l=c[j+4>>2]|0}if((h|0)>=(l|0)){break}m=rpa(j,h)|0;if(!((c[g>>2]|0)!=0?!(vka(c[m+4>>2]|0,b)|0):0)){n=7}if((n|0)==7?(n=0,vka(c[m+8>>2]|0,d)|0):0){n=8;break}h=h+1|0}if((n|0)==8){Yna(m+12|0,e);i=f;return}if(k){k=u2a(16)|0;Ija(k,16);c[a>>2]=k;if((k|0)==0){i=f;return}else{o=k}}else{o=j}j=qpa(o)|0;if((j|0)==0){i=f;return}kka(j+4|0,b);kka(j+8|0,d);Yna(j+12|0,e);i=f;return}function cpa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;if((c[a+4>>2]|0)==0){i=d;return}e=u2a(8)|0;c[e>>2]=0;f=e+4|0;c[f>>2]=0;if((e|0)==0){i=d;return}c[e>>2]=0;Yna(f,a);a=b+16|0;yg(a,2);yg(a,e);i=d;return}function dpa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+32|0;e=d;if((Toa(e,a,b)|0)==0){f=0}else{f=epa(e)|0}Soa(c[e>>2]|0,c[e+4>>2]|0);i=d;return f|0}function epa(a){a=a|0;var b=0,d=0;b=i;c[a+12>>2]=0;d=apa(a,0,0)|0;i=b;return d|0}function fpa(a){a=a|0;var b=0;b=i;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;Ija(a+16|0,4);i=b;return}function gpa(a){a=a|0;var b=0;b=i;hpa(a);Jja(c[a+16>>2]|0);spa(a+12|0);dka(a+8|0);dka(a+4|0);i=b;return}function hpa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+16|0;e=a+20|0;if((c[e>>2]|0)>0){f=0}else{Kja(d,0)|0;i=b;return}do{a=Ch(d,f)|0;if((a|0)==1){g=Ch(d,f|1)|0;hpa(g);if((g|0)!=0){gpa(g);v2a(g)}}else if((a|0)==2?(a=Ch(d,f|1)|0,(a|0)!=0):0){Lna(a+4|0);v2a(a)}f=f+2|0}while((f|0)<(c[e>>2]|0));Kja(d,0)|0;i=b;return}function ipa(a,b){a=a|0;b=b|0;var c=0;c=i;hka(a,b+8|0);i=c;return}function jpa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;if((b|0)<0){i=g;return}h=c[a+12>>2]|0;if((h|0)==0){j=0}else{j=c[h+4>>2]|0}if((j|0)<=(b|0)){i=g;return}j=rpa(h,b)|0;ika(d,j+4|0);ika(e,j+8|0);Pna(f,j+12|0);i=g;return}function kpa(a){a=a|0;var b=0;if((a|0)==0){b=0}else{b=c[a+4>>2]|0}return b|0}function lpa(a){a=a|0;return(a|0)/2|0|0}function mpa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=b<<1;if(!(e>>>0<(c[a+20>>2]|0)>>>0)){f=0;i=d;return f|0}f=Ch(a+16|0,e)|0;i=d;return f|0}function npa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=d<<1;d=b+16|0;if(f>>>0<(c[b+20>>2]|0)>>>0?(Ch(d,f)|0)==2:0){b=Ch(d,f|1)|0;if((b|0)==0){c[a>>2]=0;i=e;return}else{Ona(a,b+4|0);i=e;return}}c[a>>2]=0;i=e;return}function opa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=b<<1;b=a+16|0;if(e>>>0<(c[a+20>>2]|0)>>>0?(Ch(b,e)|0)==1:0){f=Ch(b,e|1)|0}else{f=0}i=d;return f|0}function ppa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;f=a+16|0;g=a+20|0;if((c[g>>2]|0)<=0){h=0;i=e;return h|0}a=b+4|0;j=0;a:while(1){do{if((Ch(f,j)|0)==1){k=Ch(f,j|1)|0;if((c[a>>2]|0)!=0?!(vka(c[k+4>>2]|0,b)|0):0){break}if(vka(c[k+8>>2]|0,d)|0){h=k;l=8;break a}}}while(0);j=j+2|0;if((j|0)>=(c[g>>2]|0)){h=0;l=8;break}}if((l|0)==8){i=e;return h|0}return 0}function qpa(a){a=a|0;var b=0,d=0;b=i;d=Nja(a,c[a+4>>2]|0)|0;i=b;return d|0}function rpa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((c[a+4>>2]|0)>(b|0)){e=Pja(a,b)|0;i=d;return e|0}else{_a(756992,757008,633,757056)}return 0}function spa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=c[a>>2]|0;if((d|0)==0){i=b;return}if((c[d+4>>2]|0)>0){e=d;f=0;while(1){rpa(e,f)|0;f=f+1|0;g=c[a>>2]|0;if((f|0)>=(c[g+4>>2]|0)){h=g;break}else{e=g}}}else{h=d}tpa(h);h=c[a>>2]|0;if((h|0)!=0){upa(h);v2a(h)}c[a>>2]=0;i=b;return}function tpa(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+4|0;if((c[d>>2]|0)>0){e=0;do{vpa(Pja(a,e)|0);e=e+1|0}while((e|0)<(c[d>>2]|0))}Kja(a,0)|0;i=b;return}function upa(a){a=a|0;var b=0;b=i;tpa(a);Jja(c[a>>2]|0);i=b;return}function vpa(a){a=a|0;var b=0;b=i;Lna(a+12|0);dka(a+8|0);dka(a+4|0);i=b;return}function wpa(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}Rc[c[(c[a>>2]|0)+36>>2]&1023](a);i=b;return}function xpa(a){a=a|0;return(c[a+12>>2]|0)>>>0>=(c[a+8>>2]|0)>>>0|0}function ypa(a){a=a|0;return c[a+12>>2]|0}function zpa(a,b,c){a=a|0;b=b|0;c=c|0;return 0}function Apa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=a+12|0;if((b|0)==0){f=c[e>>2]|0}else{c[e>>2]=0;f=0}b=c[a+8>>2]|0;if(!(f>>>0<b>>>0)){g=0;i=d;return g|0}c[e>>2]=b;g=1;i=d;return g|0}function Bpa(a){a=a|0;return c[a+4>>2]|0}function Cpa(a){a=a|0;return c[a+8>>2]|0}function Dpa(a){a=a|0;return 0}function Epa(a){a=a|0;return}function Fpa(a){a=a|0;var b=0;b=i;v2a(a);i=b;return}function Gpa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;kka(a+4|0,b);kka(a+8|0,c);i=d;return}function Hpa(){var a=0,b=0,c=0,d=0;a=i;b=C1a()|0;if((b|0)==0){c=0;i=a;return c|0}d=Z1a(256)|0;Sra(d,b);c=d;i=a;return c|0}function Ipa(a){a=a|0;var b=0;b=i;D1a(Lc[c[(c[a>>2]|0)+20>>2]&255](a)|0);if((a|0)==0){i=b;return}Rc[c[(c[a>>2]|0)+392>>2]&1023](a);i=b;return}function Jpa(){var a=0,b=0,c=0;a=i;b=Z1a(120)|0;Kva(b);if((b|0)==0){c=0}else{c=b+36|0}i=a;return c|0}function Kpa(a){a=a|0;var b=0,d=0;b=i;if((a|0)!=0?(d=a+ -36|0,(d|0)!=0):0){Rc[c[(c[d>>2]|0)+4>>2]&1023](d)}i=b;return}function Lpa(a){a=a|0;var b=0;b=i;$1a(a);i=b;return}function Mpa(a){a=a|0;return}function Npa(a){a=a|0;var b=0,d=0;b=i;d=c[a+8>>2]|0;a=Lc[c[c[d>>2]>>2]&255](d)|0;i=b;return a|0}function Opa(a){a=a|0;var b=0,d=0;b=i;d=c[a+8>>2]|0;a=Lc[c[(c[d>>2]|0)+8>>2]&255](d)|0;i=b;return a|0}function Ppa(a){a=a|0;var b=0,d=0;b=i;d=c[a+8>>2]|0;a=Lc[c[(c[d>>2]|0)+16>>2]&255](d)|0;i=b;return a|0}function Qpa(a){a=a|0;var b=0,d=0;b=i;d=c[a+8>>2]|0;a=Lc[c[(c[d>>2]|0)+4>>2]&255](d)|0;i=b;return a|0}function Rpa(a){a=a|0;var b=0,d=0;b=i;d=c[a+8>>2]|0;a=Lc[c[(c[d>>2]|0)+12>>2]&255](d)|0;i=b;return a|0}function Spa(a){a=a|0;var b=0,d=0;b=i;d=c[a+8>>2]|0;a=Lc[c[(c[d>>2]|0)+20>>2]&255](d)|0;i=b;return a|0}function Tpa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d;f=c[a+8>>2]|0;if((dd[c[(c[f>>2]|0)+24>>2]&511](f,b)|0)==0){g=0;i=d;return g|0}f=b+20|0;Upa(e,c[a+4>>2]|0,f);a=e;e=c[a+4>>2]|0;b=f;c[b>>2]=c[a>>2];c[b+4>>2]=e;g=1;i=d;return g|0}function Upa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0;e=i;i=i+16|0;f=e;h=b+4|0;j=c[h>>2]|0;Ic[c[(c[j>>2]|0)+116>>2]&511](f,j);j=c[h>>2]|0;h=Lc[c[(c[j>>2]|0)+112>>2]&255](j)|0;k=+g[h>>2];l=+g[h+8>>2];m=+g[h+12>>2];h=c[b+204>>2]|0;if((h|0)==1){n=(m-l-(+g[f+12>>2]- +g[f+8>>2]))*.5}else if((h|0)==2){n=m-l-(+g[f+12>>2]- +g[f+8>>2])}else{n=0.0}l=+g[d+4>>2]-(n+ +g[b+72>>2]-m);g[a>>2]=+g[d>>2]-(+g[b+68>>2]-k);g[a+4>>2]=l;i=e;return}function Vpa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d;f=c[a+8>>2]|0;if((dd[c[(c[f>>2]|0)+32>>2]&511](f,b)|0)==0){g=0;i=d;return g|0}f=b+24|0;Upa(e,c[a+4>>2]|0,f);a=e;e=c[a+4>>2]|0;b=f;c[b>>2]=c[a>>2];c[b+4>>2]=e;g=1;i=d;return g|0}function Wpa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d;f=c[a+8>>2]|0;if((dd[c[(c[f>>2]|0)+36>>2]&511](f,b)|0)==0){g=0;i=d;return g|0}f=b+12|0;Xpa(e,c[a+4>>2]|0,f);c[f+0>>2]=c[e+0>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];c[f+12>>2]=c[e+12>>2];g=1;i=d;return g|0}function Xpa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,h=0,j=0,k=0.0,l=0.0,m=0.0;d=i;i=i+32|0;e=d+24|0;f=d+16|0;h=d+8|0;j=d;k=+g[c+8>>2];g[f>>2]=+g[c>>2];g[f+4>>2]=k;Upa(e,b,f);k=+g[c+12>>2];g[j>>2]=+g[c+4>>2];g[j+4>>2]=k;Upa(h,b,j);k=+g[e+4>>2];l=+g[h>>2];m=+g[h+4>>2];g[a>>2]=+g[e>>2];g[a+8>>2]=k;g[a+4>>2]=l;g[a+12>>2]=m;i=d;return}function Ypa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[a+8>>2]|0;Ic[c[(c[e>>2]|0)+44>>2]&511](e,b);i=d;return}function Zpa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[a+8>>2]|0;Ic[c[(c[e>>2]|0)+48>>2]&511](e,b);i=d;return}function _pa(a){a=a|0;var b=0,d=0;b=i;d=c[a+8>>2]|0;a=Lc[c[(c[d>>2]|0)+52>>2]&255](d)|0;i=b;return a|0}function $pa(a){a=a|0;return c[a+4>>2]|0}function aqa(a){a=a|0;var b=0;b=i;$1a(a);i=b;return}function bqa(a){a=a|0;return}function cqa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;e=i;f=a+4|0;a=c[f>>2]|0;g=dd[c[c[a>>2]>>2]&511](a,b)|0;if((g|0)==0){h=0;i=e;return h|0}if((Lc[c[(c[g>>2]|0)+12>>2]&255](g)|0)==0){a=c[f>>2]|0;j=Qc[c[(c[a>>2]|0)+12>>2]&255](a,b,d)|0}else{j=Bu(g,d&65535)|0}if((j|0)==-1){h=0;i=e;return h|0}h=Qc[c[(c[g>>2]|0)+40>>2]&255](g,j,0)|0;i=e;return h|0}function dqa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[a+4>>2]|0;a=dd[c[c[e>>2]>>2]&511](e,b)|0;if((a|0)==0){f=0;i=d;return f|0}f=c[a+132>>2]|0;i=d;return f|0}function eqa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[a+4>>2]|0;a=dd[c[c[e>>2]>>2]&511](e,b)|0;if((a|0)==0){f=0;i=d;return f|0}f=c[a+136>>2]|0;i=d;return f|0}function fqa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;g=c[a+4>>2]|0;a=id[c[(c[g>>2]|0)+8>>2]&511](g,b,d,e)|0;i=f;return a|0}function gqa(a){a=a|0;return 0}function hqa(a,b){a=a|0;b=b|0;var c=0,d=0;a=i;if(b<<16>>16==45|(b+ -65<<16>>16&65535)<26|(b+ -97<<16>>16&65535)<26){c=1;d=c&1;i=a;return d|0}c=(b+ -192<<16>>16&65535)<496;d=c&1;i=a;return d|0}function iqa(a){a=a|0;var b=0;b=i;c[a>>2]=757240;uua(a+4|0);uua(a+24|0);tua(a+44|0);i=b;return}function jqa(a){a=a|0;var b=0;b=i;rua(a);i=b;return}function kqa(a){a=a|0;var b=0;b=i;lqa(a);$1a(a);i=b;return}function lqa(a){a=a|0;var b=0;b=i;c[a>>2]=757240;pua(a+44|0);rua(a+24|0);rua(a+4|0);i=b;return}function mqa(a){a=a|0;var b=0;b=i;pua(a);i=b;return}function nqa(a){a=a|0;var b=0;b=i;oqa(a+44|0);pqa(a+24|0,a+4|0);i=b;return}function oqa(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+4|0;e=c[a+8>>2]|0;if((e|0)>0){a=0;do{f=kua(d,a)|0;if((f|0)!=0){v2a(f)}a=a+1|0}while((a|0)!=(e|0))}Kja(d,0)|0;i=b;return}function pqa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;oua(a);e=c[b+8>>2]|0;if((e|0)>0){f=a+4|0;a=0;do{nua(f,sqa(b,a)|0);a=a+1|0}while((a|0)!=(e|0))}Kja(b+4|0,0)|0;i=d;return}function qqa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=Z1a(40)|0;c[f+0>>2]=c[b+0>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];c[f+16>>2]=c[b+16>>2];c[f+20>>2]=c[b+20>>2];b=f+24|0;c[b+0>>2]=c[d+0>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];if((f|0)==0){i=e;return}nua(a+4|0,f);i=e;return}function rqa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=a+24|0;e=c[a+32>>2]|0;if((e|0)>0){f=a+44|0;g=0;do{h=sqa(d,g)|0;if((h|0)!=0){tqa(f,h+24|0)}g=g+1|0}while((g|0)!=(e|0))}e=a+4|0;g=c[a+12>>2]|0;if((g|0)<=0){i=b;return}f=a+44|0;a=0;do{d=sqa(e,a)|0;if((d|0)!=0){tqa(f,d+24|0)}a=a+1|0}while((a|0)!=(g|0));i=b;return}function sqa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)>=0?(c[a+8>>2]|0)>(b|0):0){e=mua(a+4|0,b)|0}else{e=0}i=d;return e|0}function tqa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=a+4|0;f=c[a+8>>2]|0;a:do{if((f|0)>0){a=0;while(1){g=kua(e,a)|0;if((g|0)!=0?(Pla(g,b)|0)!=0:0){break}a=a+1|0;if((a|0)>=(f|0)){break a}}i=d;return}}while(0);f=u2a(16)|0;c[f+0>>2]=c[b+0>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];if((f|0)==0){i=d;return}lua(e,f);i=d;return}function uqa(a,b){a=a|0;b=b|0;var d=0;d=i;c[a>>2]=757256;Ija(a+4|0,4);c[a+20>>2]=0;c[a+24>>2]=b;c[a+28>>2]=0;c[a+32>>2]=1;c[a+36>>2]=0;i=d;return}function vqa(a){a=a|0;var b=0;b=i;wqa(a);$1a(a);i=b;return}function wqa(a){a=a|0;var b=0;b=i;c[a>>2]=757256;xqa(a);Jja(c[a+4>>2]|0);i=b;return}function xqa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+4|0;e=c[a+8>>2]|0;if((e|0)>0){f=0;do{g=zqa(d,f)|0;Rc[c[(c[g>>2]|0)+12>>2]&1023](g);f=f+1|0}while((f|0)!=(e|0))}c[a+20>>2]=0;Kja(d,0)|0;i=b;return}function yqa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+36|0;c[d>>2]=1;e=a+20|0;f=c[e>>2]|0;if((f|0)<=0){c[d>>2]=0;i=b;return}g=zqa(a+4|0,f+ -1|0)|0;Rc[c[c[g>>2]>>2]&1023](g);g=(c[e>>2]|0)+ -1|0;c[e>>2]=g;c[a+28>>2]=(g|0)!=0&1;c[d>>2]=0;i=b;return}function zqa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)>=0?(c[a+4>>2]|0)>(b|0):0){e=c[(c[a>>2]|0)+(b<<2)>>2]|0;i=d;return e|0}b=c[0]|0;da();e=b;i=d;return e|0}function Aqa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+36|0;c[d>>2]=1;e=a+20|0;f=c[e>>2]|0;if((f|0)>=(c[a+8>>2]|0)){c[d>>2]=0;i=b;return}g=zqa(a+4|0,f)|0;Rc[c[(c[g>>2]|0)+4>>2]&1023](g);g=(c[e>>2]|0)+1|0;c[e>>2]=g;c[a+28>>2]=(g|0)!=0&1;c[d>>2]=0;i=b;return}function Bqa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+20|0;f=a+8|0;g=c[f>>2]|0;if((c[e>>2]|0)<(g|0)){Cqa(a);h=c[f>>2]|0}else{h=g}if((h|0)>=(c[a+24>>2]|0)){Dqa(a);c[a+32>>2]=0}Eqa(a+4|0,b);b=c[f>>2]|0;c[e>>2]=b;c[a+28>>2]=(b|0)!=0&1;i=d;return}function Cqa(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+4|0;e=c[a+8>>2]|0;f=a+20|0;if((e|0)<=(c[f>>2]|0)){i=b;return}a=e;do{a=a+ -1|0;e=zqa(d,a)|0;Rc[c[(c[e>>2]|0)+12>>2]&1023](e);Oja(d,a)}while((a|0)>(c[f>>2]|0));i=b;return}function Dqa(a){a=a|0;var b=0,d=0;b=i;d=a+4|0;a=zqa(d,0)|0;Rc[c[(c[a>>2]|0)+12>>2]&1023](a);Oja(d,0);i=b;return}function Eqa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+4|0;f=c[e>>2]|0;g=f+1|0;do{if((f|0)>=(c[a+8>>2]|0)){if((Kja(a,g)|0)==0){i=d;return}else{h=c[e>>2]|0;break}}else{c[e>>2]=g;h=g}}while(0);c[(c[a>>2]|0)+(h+ -1<<2)>>2]=b;i=d;return}function Fqa(a,b){a=a|0;b=b|0;var d=0;d=i;c[a>>2]=757272;Ona(a+4|0,b);Ija(a+8|0,4);i=d;return}function Gqa(a){a=a|0;var b=0;b=i;Hqa(a);$1a(a);i=b;return}function Hqa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;c[a>>2]=757272;d=a+8|0;e=c[a+12>>2]|0;if((e|0)>0){f=0;do{g=c[(Iqa(d,f)|0)>>2]|0;Rc[c[(c[g>>2]|0)+12>>2]&1023](g);f=f+1|0}while((f|0)<(e|0))}Kja(d,0)|0;Jja(c[d>>2]|0);Lna(a+4|0);i=b;return}function Iqa(b,d){b=b|0;d=d|0;var e=0;e=i;if(!((d|0)>=0?(c[b+4>>2]|0)>(d|0):0)){a[0]=0;da()}i=e;return(c[b>>2]|0)+(d<<2)|0}function Jqa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;c[b+4>>2]=0;c[b+8>>2]=0;Kqa(a+8|0,b);f=a+4|0;if((dg(c[f>>2]|0)|0)==0){i=d;return}Ic[c[(c[b>>2]|0)+8>>2]&511](e,b);Pna(f,e);Lna(e);i=d;return}function Kqa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+4|0;f=c[e>>2]|0;g=f+1|0;do{if((f|0)>=(c[a+8>>2]|0)){if((Kja(a,g)|0)==0){i=d;return}else{h=c[e>>2]|0;break}}else{c[e>>2]=g;h=g}}while(0);c[(c[a>>2]|0)+(h+ -1<<2)>>2]=b;i=d;return}function Lqa(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+8|0;e=a+12|0;if((c[e>>2]|0)<=0){i=b;return}c[(c[(Iqa(d,0)|0)>>2]|0)+4>>2]=1;c[(c[(Iqa(d,(c[e>>2]|0)+ -1|0)|0)>>2]|0)+8>>2]=1;i=b;return}function Mqa(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+8|0;e=c[a+12>>2]|0;if((e|0)>0){f=e}else{i=b;return}do{f=f+ -1|0;e=c[(Iqa(d,f)|0)>>2]|0;Rc[c[c[e>>2]>>2]&1023](e)}while((f|0)>0);i=b;return}function Nqa(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+8|0;e=c[a+12>>2]|0;if((e|0)>0){f=0}else{i=b;return}do{a=c[(Iqa(d,f)|0)>>2]|0;Rc[c[(c[a>>2]|0)+4>>2]&1023](a);f=f+1|0}while((f|0)!=(e|0));i=b;return}function Oqa(a,b){a=a|0;b=b|0;var c=0;c=i;Ona(a,b+4|0);i=c;return}function Pqa(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}Rc[c[(c[a>>2]|0)+20>>2]&1023](a);i=b;return}function Qqa(a,d,e,f,g,h,j){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0;k=i;c[a+4>>2]=1;c[a+8>>2]=1;c[a>>2]=757304;c[a+12>>2]=d;d=a+16|0;c[d+0>>2]=c[e+0>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];e=a+28|0;c[e+0>>2]=c[f+0>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];b[a+40>>1]=g;c[a+44>>2]=h;h=a+48|0;c[h>>2]=-1;g=a+52|0;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;c[g+20>>2]=0;if((j|0)==0){i=k;return}c[h+0>>2]=c[j+0>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];c[h+12>>2]=c[j+12>>2];c[h+16>>2]=c[j+16>>2];c[h+20>>2]=c[j+20>>2];c[h+24>>2]=c[j+24>>2];i=k;return}function Rqa(a){a=a|0;var b=0;b=i;$1a(a);i=b;return}function Sqa(a){a=a|0;return}\n\n\n\nfunction qd(a){a=a|0;var b=0;b=i;i=i+a|0;i=i+7&-8;return b|0}function rd(){return i|0}function sd(a){a=a|0;i=a}function td(a,b){a=a|0;b=b|0;if((r|0)==0){r=a;s=b}}function ud(b){b=b|0;a[k>>0]=a[b>>0];a[k+1>>0]=a[b+1>>0];a[k+2>>0]=a[b+2>>0];a[k+3>>0]=a[b+3>>0]}function vd(b){b=b|0;a[k>>0]=a[b>>0];a[k+1>>0]=a[b+1>>0];a[k+2>>0]=a[b+2>>0];a[k+3>>0]=a[b+3>>0];a[k+4>>0]=a[b+4>>0];a[k+5>>0]=a[b+5>>0];a[k+6>>0]=a[b+6>>0];a[k+7>>0]=a[b+7>>0]}function wd(a){a=a|0;G=a}function xd(){return G|0}function yd(){var a=0,b=0;a=i;Ce();b=8;c[b>>2]=0;c[b+4>>2]=0;c[2]=1;c[12>>2]=306;je();i=a;return}function zd(a,b){a=a|0;b=b|0;var d=0,e=0;a=i;i=i+16|0;d=a;do{switch(b|0){case 1:{e=2520;break};case 2:{e=24;break};case 16:case 3:{e=48;break};case 4:{e=64;break};case 5:{e=88;break};case 8:case 7:case 6:{e=104;break};case 11:{e=272;break};case 12:{e=1688;break};case 13:{e=1680;break};case 15:case 14:{e=280;break};case 17:{e=120;break};default:{e=1640}}}while(0);c[d>>2]=e;Gb(144,d|0)|0;i=a;return}function Ad(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=Z1a(156)|0;Md(d,a,b);i=c;return d|0}function Bd(a){a=a|0;var b=0;b=i;if((a|0)!=0){Ld(a);$1a(a)}i=b;return}function Cd(a){a=a|0;return c[a+152>>2]|0}function Dd(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=Ge(c[a+144>>2]|0,b)|0;b=a+148|0;ve(e,c[b>>2]|0);ye(e,c[b>>2]|0,0);b=Z1a(8)|0;c[b>>2]=e;c[b+4>>2]=a;i=d;return b|0}function Ed(a){a=a|0;var b=0,d=0;b=i;d=~~+He(c[a>>2]|0);i=b;return d|0}function Fd(a){a=a|0;var b=0,d=0;b=i;d=~~+Ie(c[a>>2]|0);i=b;return d|0}function Gd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=Oe(b,d)|0;Pe(f,b,d);Le(f,c[a>>2]|0,b,d);se(c[(c[a+4>>2]|0)+148>>2]|0,f,c[a>>2]|0,b,d);i=e;return f|0}function Hd(a){a=a|0;var b=0,c=0;b=i;c=Qe(a)|0;i=b;return c|0}function Id(a){a=a|0;var b=0,c=0;b=i;c=Re(a)|0;i=b;return c|0}function Jd(a){a=a|0;var b=0;b=i;Se(a);i=b;return}function Kd(a){a=a|0;var b=0,d=0;b=i;d=a+4|0;ye(c[a>>2]|0,c[(c[d>>2]|0)+148>>2]|0,1);we(c[a>>2]|0,c[(c[d>>2]|0)+148>>2]|0);Me(c[a>>2]|0);if((a|0)==0){i=b;return}$1a(a);i=b;return}function Ld(a){a=a|0;var b=0,d=0;b=i;d=a+148|0;xe(c[d>>2]|0);re(c[d>>2]|0);Ne(c[a+144>>2]|0);Rd(c[a+140>>2]|0);i=b;return}function Md(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+16|0;f=e;g=a+0|0;h=g+44|0;do{c[g>>2]=0;g=g+4|0}while((g|0)<(h|0));c[a>>2]=1;c[a+4>>2]=75;j=a+44|0;g=j+0|0;h=g+64|0;do{c[g>>2]=0;g=g+4|0}while((g|0)<(h|0));c[j>>2]=1;c[a+108>>2]=a;g=a+112|0;h=g;c[h>>2]=0;c[h+4>>2]=0;c[g>>2]=d;c[a+116>>2]=287;c[a+120>>2]=b;b=a+124|0;d=b;c[d>>2]=0;c[d+4>>2]=0;c[b>>2]=1;c[a+128>>2]=190;d=a+132|0;h=d;c[h>>2]=0;c[h+4>>2]=0;c[d>>2]=1;c[a+136>>2]=157;h=Qd(b,g)|0;b=a+140|0;c[b>>2]=h;Sd(h,d);if((Wd(c[b>>2]|0)|0)==0){h=De(g)|0;c[a+144>>2]=h;k=h}else{h=Td(c[b>>2]|0)|0;c[a+144>>2]=h;k=h}h=a+144|0;Ee(k);Vd(c[b>>2]|0,d);k=qe(c[h>>2]|0,j)|0;j=a+148|0;c[j>>2]=k;te(k);ue(c[j>>2]|0);j=Fe(c[h>>2]|0)|0;h=a+152|0;c[h>>2]=j;c[f>>2]=j;Gb(16,f|0)|0;if((c[h>>2]|0)>0){l=0}else{i=e;return}do{Ud(c[b>>2]|0,l,d);l=l+1|0}while((l|0)<(c[h>>2]|0));i=e;return}function Nd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;e=i;lb(176)|0;i=e;return 0}function Od(a,b,c){a=a|0;b=b|0;c=c|0;return 1}function Pd(a,b,c){a=a|0;b=b|0;c=c|0;return}function Qd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=u2a(20)|0;f=e+4|0;c[f>>2]=264;g=e+12|0;c[g>>2]=224;c[e>>2]=0;c[e+8>>2]=a;c[e+16>>2]=b;b=u2a(1908)|0;$J(b,f,g);c[e>>2]=b;i=d;return e|0}function Rd(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}Yd(c[a>>2]|0);v2a(a);i=b;return}function Sd(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;if((a|0)==0|(b|0)==0){i=d;return}c[e>>2]=208;c[e+4>>2]=b;iK(c[a>>2]|0,e)|0;i=d;return}function Td(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((a|0)==0){d=0;i=b;return d|0}e=u2a(488)|0;LI(e);mka(e+388|0,0);if((MJ(e,c[(c[a>>2]|0)+860>>2]|0)|0)==0){f=e+4|0;bK(c[a>>2]|0,c[f>>2]|0);ne(c[f>>2]|0);d=c[f>>2]|0;i=b;return d|0}if((e|0)==0){d=0;i=b;return d|0}MI(e);v2a(e);d=0;i=b;return d|0}function Ud(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;if((a|0)==0|(d|0)==0){i=e;return}c[f>>2]=208;c[f+4>>2]=d;XK(c[a>>2]|0,b,f)|0;i=e;return}function Vd(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;if((a|0)==0|(b|0)==0){i=d;return}c[e>>2]=208;c[e+4>>2]=b;_K(c[a>>2]|0,e)|0;i=d;return}function Wd(a){a=a|0;var b=0,d=0;b=i;if((a|0)==0){d=-1}else{d=JK(c[a>>2]|0)|0}i=b;return d|0}function Xd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=c[a+4>>2]|0;ld[c[f+4>>2]&255](f,b,d);i=e;return}function Yd(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}aK(a);v2a(a);i=b;return}function Zd(a){a=a|0;return}function _d(a){a=a|0;return 0}function $d(a){a=a|0;return 0}function ae(a,b,c){a=a|0;b=b|0;c=c|0;return 0}function be(a){a=a|0;return c[c[a+4>>2]>>2]|0}function ce(a,b,c){a=a|0;b=b|0;c=c|0;return 0}function de(a){a=a|0;return}function ee(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;g=c[a+4>>2]|0;a=id[c[g+4>>2]&511](c[g+8>>2]|0,d,b,e)|0;i=f;return a|0}function fe(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=c[a+4>>2]|0;a=(Qc[c[f+4>>2]&255](f,b,d)|0)&1;i=e;return a|0}function ge(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((a|0)!=0?(e=c[a+4>>2]|0,(e|0)!=0):0){Ic[e&511](a,b)}i=d;return}function he(a){a=a|0;var b=0;b=i;$1a(a);i=b;return}function ie(a){a=a|0;var b=0,d=0;b=i;d=Dt(xt()|0)|0;if((d|0)==0){i=b;return}ge(c[d>>2]|0,a);i=b;return}function je(){var a=0,b=0;a=i;if((c[2]|0)!=1){i=a;return}b=Z1a(4)|0;c[b>>2]=8;Ct(xt()|0,b);i=a;return}function ke(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;b=i;i=i+144|0;d=b+136|0;e=b+128|0;f=b+120|0;g=b+112|0;h=b+104|0;j=b+96|0;k=b+88|0;l=b+80|0;m=b+72|0;n=b+64|0;o=b+56|0;p=b+48|0;q=b+40|0;r=b+32|0;s=b+24|0;t=b+16|0;u=b+8|0;v=b;w=a+16|0;Ll(d,c[w>>2]|0);pe(e,272);a=c[d>>2]|0;if((Zka(a,c[e>>2]|0,c[e+4>>2]|0)|0)==0){ie(11);dka(d);i=b;return}pe(f,280);if((Zka(a,c[f>>2]|0,c[f+4>>2]|0)|0)==0){f=c[w>>2]|0;c[g>>2]=0;pe(h,288);if((nI(f,h)|0)==0){x=0}else{pe(k,288);aI(j,f,k);ika(g,j);dka(j);x=c[g>>2]|0}pe(l,296);if((Zka(x,c[l>>2]|0,c[l+4>>2]|0)|0)!=0){ie(14)}dka(g);dka(d);i=b;return}pe(m,1688);if((Zka(a,c[m>>2]|0,c[m+4>>2]|0)|0)==0){ie(12);dka(d);i=b;return}pe(n,1680);if((Zka(a,c[n>>2]|0,c[n+4>>2]|0)|0)==0){ie(13);dka(d);i=b;return}pe(o,304);if((Zka(a,c[o>>2]|0,c[o+4>>2]|0)|0)==0){ie(15);dka(d);i=b;return}pe(p,320);if((Zka(a,c[p>>2]|0,c[p+4>>2]|0)|0)==0){ie(16);dka(d);i=b;return}pe(q,669440);if((Zka(a,c[q>>2]|0,c[q+4>>2]|0)|0)!=0){dka(d);i=b;return}q=c[w>>2]|0;c[r>>2]=0;pe(s,38400);if((nI(q,s)|0)==0){y=0}else{pe(u,38400);aI(t,q,u);ika(r,t);dka(t);y=c[r>>2]|0}pe(v,38408);if((Zka(y,c[v>>2]|0,c[v+4>>2]|0)|0)==0){ie(17)}dka(r);dka(d);i=b;return}function le(a){a=a|0;eb(a|0)|0;f2a()}function me(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=i;i=i+64|0;e=d+48|0;f=d+44|0;g=d+40|0;h=d+32|0;j=d+24|0;k=d+16|0;l=d+8|0;m=d+4|0;n=d;o=kpa(c[a+12>>2]|0)|0;if((o|0)>0){p=h+4|0;q=j+4|0;r=0;do{c[e>>2]=0;c[f>>2]=0;c[g>>2]=0;jpa(a,r,e,f,g);c[h>>2]=336;c[p>>2]=5;if(((vka(c[e>>2]|0,h)|0?(c[j>>2]=344,c[q>>2]=7,vka(c[f>>2]|0,j)|0):0)?aoa(g,352)|0:0)?(pe(k,344),oe(l,b),s=ppa(a,k,l)|0,(s|0)!=0):0){npa(m,s,0);s=poa(c[m>>2]|0)|0;if((s|0)==1){ie(6)}else if((s|0)==2){ie(7)}else if((s|0)==0){ie(8)}Lna(m)}Lna(g);dka(f);dka(e);r=r+1|0}while((r|0)<(o|0))}o=lpa(c[a+20>>2]|0)|0;if((o|0)>0){t=0}else{i=d;return}do{if((mpa(a,t)|0)==1){r=opa(a,t)|0;hka(n,b);me(r,n);dka(n)}t=t+1|0}while((t|0)<(o|0));i=d;return}function ne(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;b=i;i=i+96|0;d=b+80|0;e=b+72|0;f=b+64|0;g=b+56|0;h=b+48|0;j=b+40|0;k=b+32|0;l=b+24|0;m=b+16|0;n=b+8|0;o=b+4|0;p=b;if((a|0)==0){i=b;return}q=c[a+52>>2]|0;a:do{if((q|0)!=0){c[d>>2]=0;pe(e,536);b:do{if((nI(q,e)|0)==0){pe(f,2376);c:do{if((nI(q,f)|0)!=0?(pe(g,2376),r=iI(q,g)|0,(r|0)!=0):0){pe(h,552);if((nI(r,h)|0)!=0){ie(3);break b}pe(j,1760);if((((nI(r,j)|0)!=0?(pe(k,1760),s=iI(r,k)|0,(s|0)!=0):0)?(pe(l,2376),r=jI(s,l)|0,(r|0)!=0):0)?(s=c[r+16>>2]|0,(s|0)>0):0){t=n+4|0;u=0;while(1){HH(m,r,u);pe(n,568);if((Zka(c[m>>2]|0,c[n>>2]|0,c[t>>2]|0)|0)==0){break}dka(m);u=u+1|0;if((u|0)>=(s|0)){break c}}ie(5);dka(m);break b}}}while(0);dka(d);break a}else{ie(2)}}while(0);dka(d);i=b;return}}while(0);kp(o);mp(o,a);d=np(c[o>>2]|0)|0;if((d|0)!=0){eka(p,608,-1);me(d,p);dka(p)}p=u2a(68)|0;sn(p,a,0);if((p|0)!=0){if((Ln(c[p+24>>2]|0)|0)!=0){ie(1)}un(p);v2a(p)}lp(o);i=b;return}function oe(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[b>>2]|0;c[a>>2]=(d|0)==0?0:d+12|0;d=c[b>>2]|0;if((d|0)==0){e=0}else{e=c[d+4>>2]|0}c[a+4>>2]=e;return}function pe(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;c[a>>2]=b;if((b|0)==0){e=0}else{e=Y2a(b|0)|0}c[a+4>>2]=e;i=d;return}function qe(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;if((!((a|0)==0|(b|0)==0)?(c[b>>2]|0)==1:0)?(e=Z1a(36)|0,Uh(e,a),(e|0)!=0):0){Yh(e,b);b=c[e+20>>2]|0;if((b|0)!=0?(a=Z1a(48)|0,$h(a,b,e),(a|0)!=0):0){c[e+16>>2]=a;f=e}else{f=e}}else{f=0}i=d;return f|0}function re(a){a=a|0;var b=0,d=0,e=0;b=i;if((a|0)==0){i=b;return}d=a+16|0;e=Zh(c[d>>2]|0)|0;if((e|0)!=0){c[d>>2]=0;ai(e);$1a(e)}Vh(a);$1a(a);i=b;return}function se(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0;h=i;i=i+80|0;j=h+40|0;k=h+16|0;l=h;if((a|0)==0|(d|0)==0){i=h;return}ML(j);m=j+12|0;c[m>>2]=c[m>>2]&-2;c[j+20>>2]=0;m=u2a(36)|0;op(m,c[d+8>>2]|0,0);n=j+24|0;c[n>>2]=m;g[k+12>>2]=1.0;g[k>>2]=1.0;g[k+20>>2]=0.0;g[k+16>>2]=0.0;g[k+8>>2]=0.0;g[k+4>>2]=0.0;Vy(d,k,0,0,e,f,0);c[l>>2]=0;c[l+8>>2]=e;c[l+4>>2]=0;c[l+12>>2]=f;f=u2a(52)|0;Kxa(f);if((f|0)==0){i=h;return}Lxa(f,b,0,0);LGa(c[f+44>>2]|0);TGa(f,l);l=u2a(36)|0;rM(l);if((l|0)==0){Rc[c[(c[f>>2]|0)+4>>2]&1023](f);i=h;return}b=Zh(c[a+16>>2]|0)|0;if((b|0)==0){uM(l);v2a(l);Rc[c[(c[f>>2]|0)+4>>2]&1023](f);i=h;return}a=bi(b,d,1)|0;if((a|0)!=0){ri(a,f,k)}MGa(f,0);if((m|0)!=0){Rc[c[(c[m>>2]|0)+4>>2]&1023](m);c[n>>2]=0}uM(l);v2a(l);Rc[c[(c[f>>2]|0)+4>>2]&1023](f);i=h;return}function te(a){a=a|0;var b=0,d=0;b=i;if(((a|0)!=0?(d=Zh(c[a+16>>2]|0)|0,(d|0)!=0):0)?(a=hi(d)|0,(a|0)!=0):0){_g(a)}i=b;return}function ue(b){b=b|0;var d=0,e=0;d=i;if(((b|0)!=0?(e=Zh(c[b+16>>2]|0)|0,(e|0)!=0):0)?(b=hi(e)|0,(b|0)!=0):0){a[b+68>>0]=100}i=d;return}function ve(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)==0|(a|0)==0){i=d;return}e=Zh(c[b+16>>2]|0)|0;if((e|0)==0){i=d;return}b=bi(e,a,1)|0;if((b|0)==0){i=d;return}c[b+68>>2]=1;i=d;return}function we(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)==0|(a|0)==0){i=d;return}e=Zh(c[b+16>>2]|0)|0;b=bi(e,a,0)|0;if((b|0)==0){i=d;return}c[b+68>>2]=0;gi(e,a);i=d;return}function xe(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+16|0;d=b+8|0;e=b;if((a|0)==0){i=b;return}f=Zh(c[a+16>>2]|0)|0;if((f|0)==0){i=b;return}g=c[(c[f+24>>2]|0)+52>>2]|0;if((g|0)==0){i=b;return}c[d>>2]=2632;c[d+4>>2]=2;h=iI(g,d)|0;if((Fl(h,16)|0)==0){i=b;return}Gl(e,h,16);h=Xh(a)|0;id[c[(c[h>>2]|0)+24>>2]&511](h,e,16,f)|0;i=b;return}function ye(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+16|0;f=e+8|0;g=e+4|0;h=e;if((b|0)==0|(a|0)==0){i=e;return}j=Zh(c[b+16>>2]|0)|0;if((bi(j,a,0)|0)==0){i=e;return}b=Xh(c[j+36>>2]|0)|0;k=c[a>>2]|0;c[f>>2]=2632;c[f+4>>2]=2;a=iI(k,f)|0;if((d|0)==0){if((Fl(a,10)|0)==0){i=e;return}Gl(g,a,10);id[c[(c[b>>2]|0)+20>>2]&511](b,g,10,j)|0;i=e;return}else{if((Fl(a,11)|0)==0){i=e;return}Gl(h,a,11);id[c[(c[b>>2]|0)+20>>2]&511](b,h,11,j)|0;i=e;return}}function ze(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;g=c[b+4>>2]|0;if(!(g>>>0>d>>>0)){h=0;i=f;return h|0}j=b+528|0;k=c[j>>2]|0;do{if(!(k>>>0<=d>>>0&(k|0)!=-1&(k+512|0)>>>0>d>>>0)){c[j>>2]=d;if((id[c[b+8>>2]&511](c[b+12>>2]|0,d,b+16|0,(d+512|0)>>>0>g>>>0?g-d|0:512)|0)==0){h=0;i=f;return h|0}else{l=c[j>>2]|0;break}}else{l=k}}while(0);a[e>>0]=a[b+(d-l)+16>>0]|0;h=1;i=f;return h|0}function Ae(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;if((e+b|0)>>>0>(c[a+4>>2]|0)>>>0){g=0;i=f;return g|0}g=id[c[a+8>>2]&511](c[a+12>>2]|0,b,d,e)|0;i=f;return g|0}function Be(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;if((e+d|0)>>>0>(c[a+4>>2]|0)>>>0){g=0;i=f;return g|0}g=id[c[a+8>>2]&511](c[a+12>>2]|0,d,b,e)|0;i=f;return g|0}function Ce(){var a=0,b=0;a=i;c[170]=eV()|0;CGa();b=BGa()|0;c[b+268>>2]=c[170];yt();b=xt()|0;c[b+4>>2]=c[170];MA(xt()|0);LL(xt()|0);if((xt()|0)==0){i=a;return}cu();du();bu();eu();i=a;return}function De(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=u2a(488)|0;LI(d);mka(d+388|0,0);e=u2a(532)|0;c[e>>2]=632;f=e+4|0;c[f+0>>2]=c[a+0>>2];c[f+4>>2]=c[a+4>>2];c[f+8>>2]=c[a+8>>2];c[e+528>>2]=-1;a=(d|0)==0;if((RI(d,e)|0)==0){if(a){g=0}else{g=c[d+4>>2]|0}ne(g);h=c[d+4>>2]|0;i=b;return h|0}else{if(a){h=0;i=b;return h|0}MI(d);v2a(d);h=0;i=b;return h|0}return 0}function Ee(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b;if((a|0)==0){i=b;return}e=c[(c[a+44>>2]|0)+360>>2]|0;if((e|0)==0){i=b;return}pe(d,669064);eI(e,d)|0;i=b;return}function Fe(a){a=a|0;var b=0,d=0;b=i;if((a|0)==0){d=0;i=b;return d|0}d=VG(c[a+84>>2]|0)|0;i=b;return d|0}function Ge(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=i;if((!((a|0)==0|(b|0)<0)?(Fe(a)|0)>(b|0):0)?(d=RG(a,b)|0,(d|0)!=0):0){b=u2a(132)|0;Ly(b);My(b,a,d);Py(b);e=b}else{e=0}i=c;return e|0}function He(a){a=a|0;var b=0.0;if((a|0)==0){b=0.0}else{b=+g[a+96>>2]}return+b}function Ie(a){a=a|0;var b=0.0;if((a|0)==0){b=0.0}else{b=+g[a+100>>2]}return+b}function Je(a){a=a|0;var b=0;b=i;if((a|0)!=0){Ri(a);v2a(a)}i=b;return}function Ke(a,b,d,e,f,h,j,k,l,m){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0;n=i;i=i+48|0;o=n+16|0;p=n;if((b|0)==0){i=n;return}q=a+16|0;r=c[q>>2]|0;if((r|0)==0){s=u2a(36)|0;ML(s);c[q>>2]=s;t=s}else{t=r}r=t+12|0;t=c[r>>2]|0;c[r>>2]=(k&2|0)==0?t&-2:t|1;if((k&4|0)!=0){t=(c[q>>2]|0)+12|0;c[t>>2]=c[t>>2]|32}if((k&512|0)!=0){t=(c[q>>2]|0)+12|0;c[t>>2]=c[t>>2]|-2147483648}if((k&1024|0)!=0){t=(c[q>>2]|0)+12|0;c[t>>2]=c[t>>2]|64}if((k&8|0)!=0){c[c[q>>2]>>2]=1;c[(c[q>>2]|0)+8>>2]=0;c[(c[q>>2]|0)+4>>2]=16777215}c[(c[q>>2]|0)+20>>2]=k>>8;t=u2a(36)|0;op(t,c[b+8>>2]|0,k>>>10&2);c[(c[q>>2]|0)+24>>2]=t;g[o+12>>2]=1.0;g[o>>2]=1.0;g[o+20>>2]=0.0;g[o+16>>2]=0.0;g[o+8>>2]=0.0;g[o+4>>2]=0.0;Vy(b,o,d,e,f,h,j);c[p>>2]=d;c[p+8>>2]=f+d;c[p+4>>2]=e;c[p+12>>2]=h+e;LGa(c[(c[a>>2]|0)+44>>2]|0);TGa(c[a>>2]|0,p);p=u2a(36)|0;rM(p);e=a+4|0;c[e>>2]=p;tM(p,b);vM(c[e>>2]|0,b,o);if((k&1|0)!=0){k=u2a(44)|0;Hl(k,b);c[a+12>>2]=k;Te(k,b,c[e>>2]|0,(c[(c[a>>2]|0)+24>>2]|0)!=1&1,o)}o=u2a(56)|0;yM(o);c[a+8>>2]=o;BM(o,c[e>>2]|0,c[a>>2]|0,c[q>>2]|0,m);if((l|0)==0){i=n;return}MGa(c[a>>2]|0,0);i=n;return}function Le(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;if((a|0)==0|(b|0)==0){i=f;return}g=u2a(20)|0;Qi(g);h=b+80|0;Dna(h,1,g,517);j=u2a(52)|0;Kxa(j);c[g>>2]=j;Lxa(j,a,0,0);Ke(g,b,0,0,d,e,0,0,1,0);if((g|0)!=0){Ri(g);v2a(g)}Ena(h);i=f;return}function Me(a){a=a|0;var b=0;b=i;if((a|0)!=0){Qy(a);v2a(a)}i=b;return}function Ne(a){a=a|0;var b=0,d=0;b=i;do{if((a|0)!=0){d=c[a+44>>2]|0;if((d|0)==0){OG(a);v2a(a);break}else{MI(d);v2a(d);break}}}while(0);i=b;return}function Oe(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=u2a(40)|0;ICa(d);JCa(d,a,b,32,0)|0;i=c;return d|0}function Pe(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+80|0;f=e+16|0;g=e;if((a|0)==0){i=e;return}Kxa(f);Lxa(f,a,0,0);c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=b;c[g+12>>2]=d;WGa(f,g,-1,0)|0;Oxa(f);i=e;return}function Qe(a){a=a|0;var b=0,d=0;b=i;if((a|0)==0){d=0;i=b;return d|0}d=Lc[c[(c[a>>2]|0)+8>>2]&255](a)|0;i=b;return d|0}function Re(a){a=a|0;var b=0;if((a|0)==0){b=0}else{b=c[a+24>>2]|0}return b|0}function Se(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}Rc[c[(c[a>>2]|0)+4>>2]&1023](a);i=b;return}function Te(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=i;Ql(a,b,c,d,e);i=f;return}function Ue(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[b+4>>2]|0;if((e|0)!=(c[a+4>>2]|0)){f=0;i=d;return f|0}f=(Q2a(c[b>>2]|0,c[a>>2]|0,e)|0)==0;i=d;return f|0}function Ve(a){a=a|0;var b=0;b=i;if((a|0)!=0){v2a(a)}i=b;return}function We(a){a=a|0;return c[a+4>>2]|0}function Xe(a,b){a=a|0;b=b|0;b=i;eka(a,1305928,-1);i=b;return}function Ye(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=i;Uk(a,b,d);c[a>>2]=696;c[a+20>>2]=e;c[a+28>>2]=0;c[a+32>>2]=0;i=f;return}function Ze(a){a=a|0;var b=0;b=i;Wk(a);$1a(a);i=b;return}function _e(a){a=a|0;var b=0;b=i;Wk(a);i=b;return}function $e(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;i=i+48|0;e=d+32|0;f=d+24|0;g=d+16|0;h=d+8|0;j=d;k=a+4|0;l=c[(c[k>>2]|0)+16>>2]|0;pe(e,669488);m=iI(l,e)|0;if((m|0)==0){n=0;i=d;return n|0}if((b|0)==2){o=37032}else{o=(b|0)==1?669016:1274672}pe(f,o);b=(nI(m,f)|0)==0;pe(g,b?1274672:o);o=$H(m,g)|0;if((o|0)==0){n=0;i=d;return n|0}switch(af(a)|0){case 7:case 6:case 5:case 4:case 1:{n=(c[o>>2]|0)==7&1;i=d;return n|0};case 3:case 2:{if((c[o>>2]|0)!=6){n=0;i=d;return n|0}kl(j,c[(c[k>>2]|0)+16>>2]|0);oe(h,j);k=(kI(o,h)|0)!=0&1;dka(j);n=k;i=d;return n|0};default:{n=1;i=d;return n|0}}return 0}function af(a){a=a|0;var b=0,d=0;b=i;d=Po(c[c[(ef(a)|0)+4>>2]>>2]|0)|0;i=b;return d|0}function bf(a){a=a|0;var b=0,d=0;b=i;d=c[(ef(a)|0)+4>>2]|0;i=b;return d|0}function cf(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+20>>2]|0;e=Lc[c[(c[d>>2]|0)+48>>2]&255](d)|0;d=Do(c[(c[(En(e,c[(c[a+4>>2]|0)+16>>2]|0)|0)+4>>2]|0)+12>>2]|0)|0;i=b;return d|0}function df(a,b){a=a|0;b=b|0;var c=0;c=i;if((af(b)|0)==7){eka(a,1288,-1);i=c;return}else{cl(a,b);i=c;return}}function ef(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+20>>2]|0;e=Lc[c[(c[d>>2]|0)+48>>2]&255](d)|0;d=En(e,$k(c[(c[a+4>>2]|0)+16>>2]|0)|0)|0;i=b;return d|0}function ff(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=En(a,b)|0;i=c;return d|0}function gf(a){a=a|0;var b=0,d=0;b=i;d=(mo(c[(ef(a)|0)+8>>2]|0)|0)%360|0;i=b;return d|0}function hf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d;f=ef(a)|0;c[e>>2]=0;a=(jf(f,e)|0)>>>16&255;g=a|(jf(f,e)|0)&65280;c[b>>2]=g|(jf(f,e)|0)<<16&16711680;i=d;return(c[e>>2]|0)!=0|0}function jf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;eka(e,2240,-1);f=oo(c[a+8>>2]|0,b,e)|0;dka(e);i=d;return f|0}function kf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d;f=ef(a)|0;c[e>>2]=0;a=(lf(f,e)|0)>>>16&255;g=a|(lf(f,e)|0)&65280;c[b>>2]=g|(lf(f,e)|0)<<16&16711680;i=d;return(c[e>>2]|0)!=0|0}function lf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;eka(e,39672,-1);f=oo(c[a+8>>2]|0,b,e)|0;dka(e);i=d;return f|0}function mf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+16|0;e=d+8|0;f=d+4|0;g=d;Ao(e,ef(a)|0);if((Ep(e)|0)==0){h=0;j=e+4|0;dka(j);i=d;return h|0}c[g>>2]=0;Gp(e,f,g);a=c[f>>2]|0;c[b>>2]=a>>>16&255|a&65280|a<<16&16711680;h=(c[g>>2]|0)!=0&1;j=e+4|0;dka(j);i=d;return h|0}function nf(a){a=a|0;var b=0,c=0,d=0,e=0,f=0.0;b=i;i=i+16|0;c=b+8|0;d=b+4|0;e=b;Ao(c,ef(a)|0);eka(d,1305928,-1);g[e>>2]=0.0;Dp(c,d,e);f=+g[e>>2];dka(d);dka(c+4|0);i=b;return+f}function of(a){a=a|0;var b=0,d=0;b=i;d=$o(c[(ef(a)|0)+4>>2]|0,0)|0;i=b;return d|0}function pf(a,b){a=a|0;b=b|0;var d=0;d=i;To(a,c[(ef(b)|0)+4>>2]|0);i=d;return}function qf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;Mo(a,c[(c[(ef(b)|0)+4>>2]|0)+12>>2]|0,d);i=e;return}function rf(a){a=a|0;var b=0,d=0;b=i;d=dp(c[(c[(ef(a)|0)+4>>2]|0)+12>>2]|0)|0;i=b;return d|0}function sf(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=ep(c[(ef(a)|0)+4>>2]|0,b)|0;i=d;return e|0}function tf(a){a=a|0;var b=0,d=0;b=i;d=ip(c[(c[(ef(a)|0)+4>>2]|0)+12>>2]|0)|0;i=b;return d|0}function uf(a){a=a|0;var b=0,c=0;b=i;c=fo(ef(a)|0)|0;i=b;return c|0}function vf(a){a=a|0;var b=0,c=0;b=i;c=Bo(ef(a)|0)|0;i=b;return c|0}function wf(a){a=a|0;var b=0,d=0;b=i;d=Zo(c[(ef(a)|0)+4>>2]|0)|0;i=b;return d|0}function xf(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=ef(a)|0;a=c[e+4>>2]|0;Jo(a,Oo(a,e)|0,b);i=d;return}function yf(a,b){a=a|0;b=b|0;var d=0;d=i;Yo(c[(ef(a)|0)+4>>2]|0,b);i=d;return}function zf(a,b){a=a|0;b=b|0;var d=0;d=i;No(c[(ef(a)|0)+4>>2]|0,b);i=d;return}function Af(a){a=a|0;var b=0;b=i;Ko(c[(ef(a)|0)+4>>2]|0);i=b;return}function Bf(a){a=a|0;c[a+24>>2]=0;return}function Cf(a){a=a|0;return a|0}function Df(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;c[a+24>>2]=1;f=a+28|0;g=c[f>>2]|0;c[f>>2]=(g|0)>999998?0:g+1|0;if((d|0)!=0){d=a+32|0;c[d>>2]=(c[d>>2]|0)+1}switch(af(a)|0){case 1:{Ef(a);break};case 2:{Ff(a);break};case 3:{Gf(a);break};case 4:{Hf(a,b);break};case 5:{If(a);break};case 6:{Jf(a,b);break};default:{}}Tl(c[a+4>>2]|0);i=e;return}function Ef(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0.0,La=0.0,Ma=0.0,Na=0.0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0.0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0;b=i;i=i+672|0;d=b+656|0;e=b+632|0;f=b+612|0;h=b+608|0;j=b+592|0;k=b+576|0;l=b+556|0;m=b+536|0;n=b+520|0;o=b+496|0;p=b+492|0;q=b+488|0;r=b+480|0;s=b+476|0;t=b+472|0;u=b+468|0;v=b+464|0;w=b+460|0;x=b+456|0;y=b+452|0;z=b+448|0;A=b+444|0;B=b+440|0;C=b+436|0;D=b+432|0;E=b+428|0;F=b+424|0;G=b+416|0;H=b+408|0;I=b+404|0;J=b+400|0;K=b+392|0;L=b+384|0;M=b+380|0;N=b+376|0;O=b+368|0;P=b+360|0;Q=b+356|0;R=b+352|0;S=b+288|0;T=b+280|0;U=b+276|0;V=b+272|0;W=b+268|0;X=b+264|0;Y=b+260|0;Z=b+256|0;_=b+240|0;$=b+216|0;aa=b+208|0;ba=b+204|0;ca=b+200|0;da=b+196|0;ea=b+192|0;fa=b+188|0;ga=b+184|0;ha=b+180|0;ia=b+176|0;ja=b+160|0;ka=b+136|0;la=b+128|0;ma=b+124|0;na=b+104|0;oa=b+100|0;pa=b+96|0;qa=b+92|0;ra=b+88|0;sa=b+68|0;ta=b+64|0;ua=b+60|0;va=b+56|0;wa=b+40|0;xa=b+16|0;ya=b+12|0;za=b+8|0;Aa=b+4|0;Ba=b;Ca=ef(a)|0;Tf(d,a);Da=Ca+8|0;Ea=yo(c[Da>>2]|0)|0;Fa=(Ea+ -1|0)>>>0<6?Ea:0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;Ea=f+4|0;Ga=f+8|0;Ha=f+12|0;Ia=f+16|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;Uf(Ca,h,j);Ja=c[h>>2]|0;if((Ja|0)>0){Ka=+g[j>>2];La=+g[j+4>>2];Ma=+g[j+8>>2];Na=+g[j+12>>2];c[e>>2]=Ja;g[e+4>>2]=Ka;g[e+8>>2]=La;g[e+12>>2]=Ma;g[e+16>>2]=Na}Vf(Ca,h,j);Ja=c[h>>2]|0;if((Ja|0)>0){Na=+g[j>>2];Ma=+g[j+4>>2];La=+g[j+8>>2];Ka=+g[j+12>>2];c[f>>2]=Ja;g[Ea>>2]=Na;g[Ga>>2]=Ma;g[Ha>>2]=La;g[Ia>>2]=Ka}Ka=+(ll(a)|0);c[k>>2]=3;Ia=k+4|0;c[Ia>>2]=0;Ha=k+8|0;c[Ha>>2]=0;Ga=l+4|0;Ea=l+8|0;Ja=l+12|0;Oa=l+16|0;c[l+0>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;c[l+12>>2]=0;c[l+16>>2]=0;Pa=m+4|0;Qa=m+8|0;Ra=m+12|0;Sa=m+16|0;c[m+0>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;Ta=ml(a)|0;if((Ta|0)==1){c[k>>2]=3;c[Ia>>2]=3;c[Ha>>2]=0;Ua=Ka;Va=1}else if((Ta|0)==3){c[l>>2]=1;g[Ga>>2]=.5;g[Ea>>2]=0.0;g[Ja>>2]=0.0;g[Oa>>2]=0.0;c[m>>2]=1;g[Pa>>2]=.75;g[Qa>>2]=0.0;g[Ra>>2]=0.0;g[Sa>>2]=0.0;Ua=Ka*2.0;Va=3}else if((Ta|0)==4){Ua=Ka;Va=4}else if((Ta|0)==2){c[l>>2]=1;g[Ga>>2]=1.0;g[Ea>>2]=0.0;g[Ja>>2]=0.0;g[Oa>>2]=0.0;GYa(m,e);Ua=Ka*2.0;Va=2}else{Ua=Ka;Va=0}sYa(n,d,Ua);c[o>>2]=1;Oa=o+4|0;Ja=o+8|0;Ea=o+12|0;Ta=o+16|0;c[Oa+0>>2]=0;c[Oa+4>>2]=0;c[Oa+8>>2]=0;c[Oa+12>>2]=0;g[p>>2]=12.0;c[q>>2]=0;Ao(r,Ca);if((Ep(r)|0)!=0){Fp(r,h,j);Ka=+g[j>>2];La=+g[j+4>>2];Ma=+g[j+8>>2];Na=+g[j+12>>2];c[o>>2]=c[h>>2];g[Oa>>2]=Ka;g[Ja>>2]=La;g[Ea>>2]=Ma;g[Ta>>2]=Na}if((Cp(r)|0)!=0){Dp(r,q,p)}c[s>>2]=0;c[t>>2]=0;c[u>>2]=0;c[v>>2]=0;eka(w,736,-1);Ta=ko(c[Da>>2]|0,w)|0;dka(w);if((Ta|0)!=0){Wf(x,Ca);Pna(t,x);Lna(x)}eka(y,744,-1);x=ko(c[Da>>2]|0,y)|0;dka(y);if((x|0)!=0){Xf(z,Ca);Pna(u,z);Lna(z)}eka(A,752,-1);z=ko(c[Da>>2]|0,A)|0;dka(A);if((z|0)!=0){Yf(B,Ca);Pna(v,B);Lna(B)}eka(C,37016,-1);B=ko(c[Da>>2]|0,C)|0;dka(C);if((B|0)==0){Wa=0}else{Wa=Zf(Ca)|0}eka(D,760,-1);B=ko(c[Da>>2]|0,D)|0;dka(D);if((B|0)==0){Xa=0}else{Xa=_f(Ca)|0}eka(E,768,-1);B=ko(c[Da>>2]|0,E)|0;dka(E);if((B|0)==0){Ya=0}else{Ya=$f(Ca)|0}Ca=(Wa|0)!=0;do{if(Ca?(B=c[Wa+12>>2]|0,(B|0)!=0):0){pe(G,1293312);aI(F,B,G);E=c[F>>2]|0;if((E|0)!=0){D=(c[E+4>>2]|0)==0;dka(F);if(!D){break}}else{dka(F)}pe(H,1293312);eka(I,776,-1);uI(B,H,I);dka(I)}}while(0);I=(Xa|0)!=0;do{if(I?(H=c[Xa+12>>2]|0,(H|0)!=0):0){pe(K,1293312);aI(J,H,K);F=c[J>>2]|0;if((F|0)!=0){G=(c[F+4>>2]|0)==0;dka(J);if(!G){break}}else{dka(J)}pe(L,1293312);eka(M,784,-1);uI(H,L,M);dka(M)}}while(0);M=(Ya|0)!=0;do{if(M?(L=c[Ya+12>>2]|0,(L|0)!=0):0){pe(O,1293312);aI(N,L,O);J=c[N>>2]|0;if((J|0)!=0){K=(c[J+4>>2]|0)==0;dka(N);if(!K){break}}else{dka(N)}pe(P,1293312);eka(Q,792,-1);uI(L,P,Q);dka(Q)}}while(0);wo(R,c[Da>>2]|0);dQ(S,a,c[(c[(c[(c[a+20>>2]|0)+4>>2]|0)+36>>2]|0)+28>>2]|0);hQ(S,0);eka(T,1274672,-1);oQ(S,T);dka(T);uYa(W,d,e);DYa(X,d,Ua,f,l,m,Va,k);ag(V,W,X);T=(Rp(c[R>>2]|0)|0)!=0;Na=+g[p>>2];CYa(Y,T?d:n,S,Wa,R,t,o,Na,Fa);ag(U,V,Y);dka(Y);dka(V);dka(X);dka(W);eka(Z,1274672,-1);Tf(_,a);bg($,a);eka(aa,1305928,-1);nl(a,Z,_,$,U,aa);dka(aa);dka(Z);if(Ca){eka(ba,1274672,-1);cg(c[(c[a+4>>2]|0)+16>>2]|0,c[(c[a+8>>2]|0)+24>>2]|0,ba,Wa);dka(ba)}if(!(((io(c[Da>>2]|0)|0)+ -3|0)>>>0<2)){eka(Aa,37032,-1);Da=a+4|0;eg(c[(c[Da>>2]|0)+16>>2]|0,Aa);dka(Aa);eka(Ba,669016,-1);eg(c[(c[Da>>2]|0)+16>>2]|0,Ba);dka(Ba);dka(U);fQ(S);Lna(v);Lna(u);Lna(t);Lna(s);Za=r+4|0;dka(Za);dka(q);i=b;return}if((dg(c[u>>2]|0)|0)==0|I){_a=Xa}else{Pna(u,t);_a=Wa}eka(ca,669016,-1);oQ(S,ca);dka(ca);uYa(fa,d,e);DYa(ga,d,Ua,f,l,m,Va,k);ag(ea,fa,ga);ca=(Rp(c[R>>2]|0)|0)!=0;CYa(ha,ca?d:n,S,_a,R,u,o,Na,Fa);ag(da,ea,ha);ika(U,da);dka(da);dka(ha);dka(ea);dka(ga);dka(fa);eka(ia,669016,-1);Tf(ja,a);bg(ka,a);eka(la,1305928,-1);nl(a,ia,ja,ka,U,la);dka(la);dka(ia);if((_a|0)!=0){eka(ma,669016,-1);cg(c[(c[a+4>>2]|0)+16>>2]|0,c[(c[a+8>>2]|0)+24>>2]|0,ma,_a);dka(ma)}if((dg(c[v>>2]|0)|0)==0|M){$a=Ya}else{Pna(v,t);$a=Wa}if((Va|0)==3){c[l>>2]=1;c[Ga+0>>2]=0;c[Ga+4>>2]=0;c[Ga+8>>2]=0;c[Ga+12>>2]=0;c[m>>2]=1;g[Pa>>2]=1.0;g[Qa>>2]=0.0;g[Ra>>2]=0.0;g[Sa>>2]=0.0}else if((Va|0)==2){c[na+0>>2]=c[l+0>>2];c[na+4>>2]=c[l+4>>2];c[na+8>>2]=c[l+8>>2];c[na+12>>2]=c[l+12>>2];c[na+16>>2]=c[l+16>>2];c[l+0>>2]=c[m+0>>2];c[l+4>>2]=c[m+4>>2];c[l+8>>2]=c[m+8>>2];c[l+12>>2]=c[m+12>>2];c[l+16>>2]=c[m+16>>2];c[m+0>>2]=c[na+0>>2];c[m+4>>2]=c[na+4>>2];c[m+8>>2]=c[na+8>>2];c[m+12>>2]=c[na+12>>2];c[m+16>>2]=c[na+16>>2]}eka(oa,37032,-1);oQ(S,oa);dka(oa);FYa(sa,e);uYa(ra,d,sa);DYa(ta,d,Ua,f,l,m,Va,k);ag(qa,ra,ta);k=(Rp(c[R>>2]|0)|0)!=0;CYa(ua,k?d:n,S,$a,R,v,o,+g[p>>2],Fa);ag(pa,qa,ua);ika(U,pa);dka(pa);dka(ua);dka(qa);dka(ta);dka(ra);eka(va,37032,-1);Tf(wa,a);bg(xa,a);eka(ya,1305928,-1);nl(a,va,wa,xa,U,ya);dka(ya);dka(va);if(($a|0)==0){dka(U);fQ(S);Lna(v);Lna(u);Lna(t);Lna(s);Za=r+4|0;dka(Za);dka(q);i=b;return}eka(za,37032,-1);cg(c[(c[a+4>>2]|0)+16>>2]|0,c[(c[a+8>>2]|0)+24>>2]|0,za,$a);dka(za);dka(U);fQ(S);Lna(v);Lna(u);Lna(t);Lna(s);Za=r+4|0;dka(Za);dka(q);i=b;return}function Ff(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0.0,oa=0,pa=0,qa=0;b=i;i=i+464|0;d=b+444|0;e=b+424|0;f=b+404|0;h=b+400|0;j=b+384|0;k=b+368|0;l=b+348|0;m=b+328|0;n=b+312|0;o=b+296|0;p=b+288|0;q=b+284|0;r=b+280|0;s=b+276|0;t=b+272|0;u=b+268|0;v=b+248|0;w=b+244|0;x=b+240|0;y=b+220|0;z=b+216|0;A=b+212|0;B=b+208|0;C=b+204|0;D=b+200|0;E=b+184|0;F=b+160|0;G=b+156|0;H=b+152|0;I=b+136|0;J=b+112|0;K=b+108|0;L=b+104|0;M=b+88|0;N=b+64|0;O=b+60|0;P=b+56|0;Q=b+40|0;R=b+16|0;S=b+8|0;T=b+4|0;U=b;V=ef(a)|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;W=e+4|0;X=e+8|0;Y=e+12|0;Z=e+16|0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;_=f+4|0;$=f+8|0;aa=f+12|0;ba=f+16|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;Uf(V,h,j);ca=c[h>>2]|0;if((ca|0)>0){da=+g[j>>2];ea=+g[j+4>>2];fa=+g[j+8>>2];ga=+g[j+12>>2];c[d>>2]=ca;g[d+4>>2]=da;g[d+8>>2]=ea;g[d+12>>2]=fa;g[d+16>>2]=ga}Vf(V,h,j);ca=c[h>>2]|0;if((ca|0)>0){ga=+g[j>>2];fa=+g[j+4>>2];ea=+g[j+8>>2];da=+g[j+12>>2];c[e>>2]=ca;g[W>>2]=ga;g[X>>2]=fa;g[Y>>2]=ea;g[Z>>2]=da}da=+(ll(a)|0);c[k>>2]=3;Z=k+4|0;c[Z>>2]=0;Y=k+8|0;c[Y>>2]=0;X=l+4|0;W=l+8|0;ca=l+12|0;ha=l+16|0;c[l+0>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;c[l+12>>2]=0;c[l+16>>2]=0;ia=m+4|0;ja=m+8|0;ka=m+12|0;la=m+16|0;c[m+0>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;ma=ml(a)|0;if((ma|0)==2){c[l>>2]=1;g[X>>2]=1.0;g[W>>2]=0.0;g[ca>>2]=0.0;g[ha>>2]=0.0;GYa(m,d);na=da*2.0;oa=2}else if((ma|0)==3){c[l>>2]=1;g[X>>2]=.5;g[W>>2]=0.0;g[ca>>2]=0.0;g[ha>>2]=0.0;c[m>>2]=1;g[ia>>2]=.75;g[ja>>2]=0.0;g[ka>>2]=0.0;g[la>>2]=0.0;na=da*2.0;oa=3}else if((ma|0)==4){na=da;oa=4}else if((ma|0)==1){c[k>>2]=3;c[Z>>2]=3;c[Y>>2]=0;na=da;oa=1}else{na=da;oa=0}Tf(n,a);sYa(o,n,na);Ao(p,V);if((Ep(p)|0)!=0){Fp(p,h,j);da=+g[j>>2];ea=+g[j+4>>2];fa=+g[j+8>>2];ga=+g[j+12>>2];c[f>>2]=c[h>>2];g[_>>2]=da;g[$>>2]=ea;g[aa>>2]=fa;g[ba>>2]=ga}Wf(q,V);ba=c[q>>2]|0;a:do{if((ba|0)!=0?(c[ba+4>>2]|0)>0:0){switch(c[ba+12>>2]|0){case 56:{pa=2;break a;break};case 117:{pa=3;break a;break};case 110:{pa=4;break a;break};case 72:{pa=5;break a;break};case 108:{pa=1;break a;break};default:{pa=0;break a}}}else{pa=0}}while(0);uYa(s,n,d);DYa(t,n,na,e,l,m,oa,k);ag(r,s,t);dka(t);dka(s);hka(u,r);if((oa|0)==3){c[l>>2]=1;c[X+0>>2]=0;c[X+4>>2]=0;c[X+8>>2]=0;c[X+12>>2]=0;c[m>>2]=1;g[ia>>2]=1.0;g[ja>>2]=0.0;g[ka>>2]=0.0;g[la>>2]=0.0}else if((oa|0)==2){c[v+0>>2]=c[l+0>>2];c[v+4>>2]=c[l+4>>2];c[v+8>>2]=c[l+8>>2];c[v+12>>2]=c[l+12>>2];c[v+16>>2]=c[l+16>>2];c[l+0>>2]=c[m+0>>2];c[l+4>>2]=c[m+4>>2];c[l+8>>2]=c[m+8>>2];c[l+12>>2]=c[m+12>>2];c[l+16>>2]=c[m+16>>2];c[m+0>>2]=c[v+0>>2];c[m+4>>2]=c[v+4>>2];c[m+8>>2]=c[v+8>>2];c[m+12>>2]=c[v+12>>2];c[m+16>>2]=c[v+16>>2]}FYa(y,d);uYa(x,n,y);DYa(z,n,na,e,l,m,oa,k);ag(w,x,z);dka(z);dka(x);hka(A,w);NYa(B,o,pa,f);uka(r,c[B>>2]|0);dka(B);NYa(C,o,pa,f);uka(w,c[C>>2]|0);dka(C);eka(D,1274672,-1);Tf(E,a);bg(F,a);co(G,V);nl(a,D,E,F,r,G);dka(G);dka(D);eka(H,1274672,-1);Tf(I,a);bg(J,a);eka(K,2656,-1);nl(a,H,I,J,u,K);dka(K);dka(H);eka(L,37032,-1);Tf(M,a);bg(N,a);co(O,V);nl(a,L,M,N,w,O);dka(O);dka(L);eka(P,37032,-1);Tf(Q,a);bg(R,a);eka(S,2656,-1);nl(a,P,Q,R,A,S);dka(S);dka(P);P=a+4|0;kl(T,c[(c[P>>2]|0)+16>>2]|0);a=c[T>>2]|0;if((a|0)!=0?(c[a+4>>2]|0)!=0:0){dka(T);dka(A);dka(w);dka(u);dka(r);Lna(q);qa=p+4|0;dka(qa);i=b;return}eka(U,2656,-1);jl(c[(c[P>>2]|0)+16>>2]|0,U);dka(U);dka(T);dka(A);dka(w);dka(u);dka(r);Lna(q);qa=p+4|0;dka(qa);i=b;return}function Gf(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0.0,pa=0.0,qa=0.0,ra=0.0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0.0,za=0,Aa=0,Ba=0;b=i;i=i+560|0;d=b+532|0;e=b+512|0;f=b+492|0;h=b+488|0;j=b+472|0;k=b+456|0;l=b+436|0;m=b+416|0;n=b+400|0;o=b+384|0;p=b+376|0;q=b+372|0;r=b+368|0;s=b+352|0;t=b+336|0;u=b+328|0;v=b+324|0;w=b+320|0;x=b+316|0;y=b+312|0;z=b+308|0;A=b+304|0;B=b+284|0;C=b+280|0;D=b+260|0;E=b+256|0;F=b+252|0;G=b+248|0;H=b+244|0;I=b+240|0;J=b+220|0;K=b+216|0;L=b+212|0;M=b+208|0;N=b+204|0;O=b+200|0;P=b+184|0;Q=b+160|0;R=b+156|0;S=b+152|0;T=b+136|0;U=b+112|0;V=b+108|0;W=b+104|0;X=b+88|0;Y=b+64|0;Z=b+60|0;_=b+56|0;$=b+40|0;aa=b+16|0;ba=b+8|0;ca=b+4|0;da=b;ea=ef(a)|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;fa=e+4|0;ga=e+8|0;ha=e+12|0;ia=e+16|0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;ja=f+4|0;ka=f+8|0;la=f+12|0;ma=f+16|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;Uf(ea,h,j);na=c[h>>2]|0;if((na|0)>0){oa=+g[j>>2];pa=+g[j+4>>2];qa=+g[j+8>>2];ra=+g[j+12>>2];c[d>>2]=na;g[d+4>>2]=oa;g[d+8>>2]=pa;g[d+12>>2]=qa;g[d+16>>2]=ra}Vf(ea,h,j);na=c[h>>2]|0;if((na|0)>0){ra=+g[j>>2];qa=+g[j+4>>2];pa=+g[j+8>>2];oa=+g[j+12>>2];c[e>>2]=na;g[fa>>2]=ra;g[ga>>2]=qa;g[ha>>2]=pa;g[ia>>2]=oa}oa=+(ll(a)|0);c[k>>2]=3;ia=k+4|0;c[ia>>2]=0;ha=k+8|0;c[ha>>2]=0;ga=l+4|0;fa=l+8|0;na=l+12|0;sa=l+16|0;c[l+0>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;c[l+12>>2]=0;c[l+16>>2]=0;ta=m+4|0;ua=m+8|0;va=m+12|0;wa=m+16|0;c[m+0>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;xa=ml(a)|0;if((xa|0)==1){c[k>>2]=3;c[ia>>2]=3;c[ha>>2]=0;ya=oa;za=1}else if((xa|0)==3){c[l>>2]=1;g[ga>>2]=.5;g[fa>>2]=0.0;g[na>>2]=0.0;g[sa>>2]=0.0;c[m>>2]=1;g[ta>>2]=.75;g[ua>>2]=0.0;g[va>>2]=0.0;g[wa>>2]=0.0;ya=oa*2.0;za=3}else if((xa|0)==4){ya=oa;za=4}else if((xa|0)==2){c[l>>2]=1;g[ga>>2]=1.0;g[fa>>2]=0.0;g[na>>2]=0.0;g[sa>>2]=0.0;GYa(m,d);ya=oa*2.0;za=2}else{ya=oa;za=0}Tf(n,a);sYa(o,n,ya);Ao(p,ea);if((Ep(p)|0)!=0){Fp(p,h,j);oa=+g[j>>2];pa=+g[j+4>>2];qa=+g[j+8>>2];ra=+g[j+12>>2];c[f>>2]=c[h>>2];g[ja>>2]=oa;g[ka>>2]=pa;g[la>>2]=qa;g[ma>>2]=ra}Wf(q,ea);ma=c[q>>2]|0;a:do{if((ma|0)!=0?(c[ma+4>>2]|0)>0:0){switch(c[ma+12>>2]|0){case 56:{Aa=2;break a;break};case 117:{Aa=3;break a;break};case 110:{Aa=4;break a;break};case 72:{Aa=5;break a;break};case 52:{Aa=0;break a;break};default:{Aa=1;break a}}}else{Aa=1}}while(0);c[r>>2]=0;xYa(t,n);sYa(s,t,1.0);t=(Aa|0)==1;if(t){if((za|0)==2){c[l>>2]=1;g[ga>>2]=1.0;g[fa>>2]=0.0;g[na>>2]=0.0;g[sa>>2]=0.0;FYa(m,d)}else if((za|0)==3){c[l>>2]=1;g[ga>>2]=.5;g[fa>>2]=0.0;g[na>>2]=0.0;g[sa>>2]=0.0;c[m>>2]=1;g[ta>>2]=.75;g[ua>>2]=0.0;g[va>>2]=0.0;g[wa>>2]=0.0}wYa(v,s,d);EYa(w,s,ya,e,l,m,za,k);ag(u,v,w);ika(r,u);dka(u);dka(w);dka(v)}else{uYa(y,n,d);DYa(z,n,ya,e,l,m,za,k);ag(x,y,z);ika(r,x);dka(x);dka(z);dka(y)}hka(A,r);if((za|0)==3){c[l>>2]=1;c[ga+0>>2]=0;c[ga+4>>2]=0;c[ga+8>>2]=0;c[ga+12>>2]=0;c[m>>2]=1;g[ta>>2]=1.0;g[ua>>2]=0.0;g[va>>2]=0.0;g[wa>>2]=0.0}else if((za|0)==2){c[B+0>>2]=c[l+0>>2];c[B+4>>2]=c[l+4>>2];c[B+8>>2]=c[l+8>>2];c[B+12>>2]=c[l+12>>2];c[B+16>>2]=c[l+16>>2];c[l+0>>2]=c[m+0>>2];c[l+4>>2]=c[m+4>>2];c[l+8>>2]=c[m+8>>2];c[l+12>>2]=c[m+12>>2];c[l+16>>2]=c[m+16>>2];c[m+0>>2]=c[B+0>>2];c[m+4>>2]=c[B+4>>2];c[m+8>>2]=c[B+8>>2];c[m+12>>2]=c[B+12>>2];c[m+16>>2]=c[B+16>>2]}c[C>>2]=0;if(t){FYa(D,d);if((za|0)==3){c[l>>2]=1;c[ga+0>>2]=0;c[ga+4>>2]=0;c[ga+8>>2]=0;c[ga+12>>2]=0;c[m>>2]=1;g[ta>>2]=1.0;g[ua>>2]=0.0;g[va>>2]=0.0;g[wa>>2]=0.0}else if((za|0)==2){FYa(l,d);c[m>>2]=1;g[ta>>2]=1.0;g[ua>>2]=0.0;g[va>>2]=0.0;g[wa>>2]=0.0;c[D+0>>2]=c[d+0>>2];c[D+4>>2]=c[d+4>>2];c[D+8>>2]=c[d+8>>2];c[D+12>>2]=c[d+12>>2];c[D+16>>2]=c[d+16>>2]}wYa(F,s,D);EYa(G,s,ya,e,l,m,za,k);ag(E,F,G);ika(C,E);dka(E);dka(G);dka(F)}else{FYa(J,d);uYa(I,n,J);DYa(K,n,ya,e,l,m,za,k);ag(H,I,K);ika(C,H);dka(H);dka(K);dka(I)}hka(L,C);OYa(M,o,Aa,f);uka(r,c[M>>2]|0);dka(M);OYa(N,o,Aa,f);uka(C,c[N>>2]|0);dka(N);eka(O,1274672,-1);Tf(P,a);bg(Q,a);co(R,ea);nl(a,O,P,Q,r,R);dka(R);dka(O);eka(S,1274672,-1);Tf(T,a);bg(U,a);eka(V,2656,-1);nl(a,S,T,U,A,V);dka(V);dka(S);eka(W,37032,-1);Tf(X,a);bg(Y,a);co(Z,ea);nl(a,W,X,Y,C,Z);dka(Z);dka(W);eka(_,37032,-1);Tf($,a);bg(aa,a);eka(ba,2656,-1);nl(a,_,$,aa,L,ba);dka(ba);dka(_);_=a+4|0;kl(ca,c[(c[_>>2]|0)+16>>2]|0);a=c[ca>>2]|0;if((a|0)!=0?(c[a+4>>2]|0)!=0:0){dka(ca);dka(L);dka(C);dka(A);dka(r);Lna(q);Ba=p+4|0;dka(Ba);i=b;return}eka(da,2656,-1);jl(c[(c[_>>2]|0)+16>>2]|0,da);dka(da);dka(ca);dka(L);dka(C);dka(A);dka(r);Lna(q);Ba=p+4|0;dka(Ba);i=b;return}function Hf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0.0,fa=0.0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0;d=i;i=i+416|0;e=d+392|0;f=d+376|0;h=d+360|0;j=d+344|0;k=d+280|0;l=d+264|0;m=d+260|0;n=d+256|0;o=d+240|0;p=d+232|0;q=d+224|0;r=d+216|0;s=d+208|0;t=d+200|0;u=d+192|0;v=d+184|0;w=d+176|0;x=d+152|0;y=d+144|0;z=d+136|0;A=d+132|0;B=d+128|0;C=d+120|0;D=d+112|0;E=d+104|0;F=d+96|0;G=d+92|0;H=d+88|0;I=d+84|0;J=d+80|0;K=d+76|0;L=d+72|0;M=d+64|0;N=d+56|0;O=d+48|0;P=d+32|0;Q=d+8|0;R=d;S=c[(ef(a)|0)+4>>2]|0;gla(e);gla(f);fg(h,a);c[j+0>>2]=c[h+0>>2];c[j+4>>2]=c[h+4>>2];c[j+8>>2]=c[h+8>>2];c[j+12>>2]=c[h+12>>2];g[j>>2]=+g[j+4>>2]+-13.0;Hla(j);T=Hpa()|0;if((T|0)==0){PYa(G,j);oe(F,G);U=c[F>>2]|0;V=F+4|0;W=c[V>>2]|0;qla(e,U,W)|0;dka(G);ig(K,a);jg(L,a);ag(J,K,L);X=f+4|0;Y=c[X>>2]|0;Z=f+8|0;_=c[Z>>2]|0;pla(M,Y,_);hg(I,J,M);$=e+4|0;aa=c[$>>2]|0;ba=e+8|0;ca=c[ba>>2]|0;pla(N,aa,ca);hg(H,I,N);dka(I);dka(J);dka(L);dka(K);eka(O,1274672,-1);Tf(P,a);bg(Q,a);eka(R,1305928,-1);nl(a,O,P,Q,H,R);dka(R);dka(O);dka(H);ila(Y);da=c[$>>2]|0;ila(da);i=d;return}Ic[c[(c[T>>2]|0)+292>>2]&511](T,0);dQ(k,a,c[(c[(c[(c[a+20>>2]|0)+4>>2]|0)+36>>2]|0)+28>>2]|0);hQ(k,0);Ic[c[c[T>>2]>>2]&511](T,k);c[l+0>>2]=c[h+0>>2];c[l+4>>2]=c[h+4>>2];c[l+8>>2]=c[h+8>>2];c[l+12>>2]=c[h+12>>2];h=l+4|0;g[h>>2]=+g[j>>2];Hla(l);ld[c[(c[T>>2]|0)+32>>2]&255](T,l,1);ld[c[(c[T>>2]|0)+44>>2]&255](T,1,1);ea=+nf(a);fa=ea;if(fa<.01&fa>-.01){ld[c[(c[T>>2]|0)+80>>2]&255](T,1,1)}else{Oc[c[(c[T>>2]|0)+88>>2]&3](T,ea,1)}Rc[c[(c[T>>2]|0)+28>>2]&1023](T);do{if((b|0)==0){ga=$o(S,0)|0;ha=c[(c[T>>2]|0)+248>>2]|0;if((ga|0)<0){To(m,S);ia=c[m>>2]|0;Fc[ha&63](T,(ia|0)==0?1292088:ia+12|0,1,0,0);Lna(m);break}else{Mo(n,c[S+12>>2]|0,ga);ga=c[n>>2]|0;Fc[ha&63](T,(ga|0)==0?1292088:ga+12|0,1,0,0);Lna(n);break}}else{Fc[c[(c[T>>2]|0)+248>>2]&63](T,b,1,0,0)}}while(0);Ic[c[(c[T>>2]|0)+200>>2]&511](o,T);g[q>>2]=0.0;g[q+4>>2]=0.0;yYa(p,T,q,0,1,0);q=c[p>>2]|0;if((q|0)!=0?(c[q+4>>2]|0)>0:0){pe(r,1291024);q=qla(e,c[r>>2]|0,c[r+4>>2]|0)|0;pe(s,1293864);qla(q,c[s>>2]|0,c[s+4>>2]|0)|0;ea=+g[l>>2];if(!(+g[o+4>>2]- +g[o>>2]>+g[h>>2]-ea)){s=l+12|0;q=l+8|0;if(+g[o+12>>2]- +g[o+8>>2]>+g[s>>2]- +g[q>>2]){ja=s;ka=q;la=15}}else{ja=l+12|0;ka=l+8|0;la=15}if((la|0)==15){la=tla(e,ea)|0;pe(t,1305864);q=qla(la,c[t>>2]|0,c[t+4>>2]|0)|0;t=tla(q,+g[ka>>2])|0;pe(u,1305864);q=qla(t,c[u>>2]|0,c[u+4>>2]|0)|0;u=tla(q,+g[h>>2]- +g[l>>2])|0;pe(v,1305864);l=qla(u,c[v>>2]|0,c[v+4>>2]|0)|0;v=tla(l,+g[ja>>2]- +g[ka>>2])|0;pe(w,2248);qla(v,c[w>>2]|0,c[w+4>>2]|0)|0}gg(x,a);pe(y,1291896);w=qla(e,c[y>>2]|0,c[y+4>>2]|0)|0;c[B>>2]=1;vYa(A,x,B);oe(z,A);B=qla(w,c[z>>2]|0,c[z+4>>2]|0)|0;oe(C,p);z=qla(B,c[C>>2]|0,c[C+4>>2]|0)|0;pe(D,1291904);C=qla(z,c[D>>2]|0,c[D+4>>2]|0)|0;pe(E,2264);qla(C,c[E>>2]|0,c[E+4>>2]|0)|0;dka(A)}Ipa(T);dka(p);fQ(k);PYa(G,j);oe(F,G);U=c[F>>2]|0;V=F+4|0;W=c[V>>2]|0;qla(e,U,W)|0;dka(G);ig(K,a);jg(L,a);ag(J,K,L);X=f+4|0;Y=c[X>>2]|0;Z=f+8|0;_=c[Z>>2]|0;pla(M,Y,_);hg(I,J,M);$=e+4|0;aa=c[$>>2]|0;ba=e+8|0;ca=c[ba>>2]|0;pla(N,aa,ca);hg(H,I,N);dka(I);dka(J);dka(L);dka(K);eka(O,1274672,-1);Tf(P,a);bg(Q,a);eka(R,1305928,-1);nl(a,O,P,Q,H,R);dka(R);dka(O);dka(H);ila(Y);da=c[$>>2]|0;ila(da);i=d;return}function If(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0.0,sa=0.0,ta=0.0,ua=0.0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0.0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0.0,$a=0,ab=0,bb=0,cb=0.0,db=0.0,eb=0.0;b=i;i=i+576|0;d=b+552|0;e=b+536|0;f=b+520|0;h=b+456|0;j=b+440|0;k=b+424|0;l=b+416|0;m=b+400|0;n=b+392|0;o=b+384|0;p=b+376|0;q=b+356|0;r=b+352|0;s=b+344|0;t=b+336|0;u=b+328|0;v=b+320|0;w=b+312|0;x=b+304|0;y=b+296|0;z=b+288|0;A=b+268|0;B=b+264|0;C=b+256|0;D=b+248|0;E=b+240|0;F=b+232|0;G=b+208|0;H=b+200|0;I=b+192|0;J=b+188|0;K=b+184|0;L=b+176|0;M=b+168|0;N=b+160|0;O=b+152|0;P=b+144|0;Q=b+136|0;R=b+128|0;S=b+120|0;T=b+112|0;U=b+104|0;V=b+96|0;W=b+88|0;X=b+84|0;Y=b+80|0;Z=b+76|0;_=b+72|0;$=b+64|0;aa=b+56|0;ba=b+48|0;ca=b+32|0;da=b+8|0;ea=b;fa=c[(ef(a)|0)+4>>2]|0;fg(d,a);gla(e);gla(f);ga=Hpa()|0;if((ga|0)==0){ig(Z,a);jg(_,a);ag(Y,Z,_);ha=f+4|0;ia=c[ha>>2]|0;ja=f+8|0;ka=c[ja>>2]|0;pla($,ia,ka);hg(X,Y,$);la=e+4|0;ma=c[la>>2]|0;na=e+8|0;oa=c[na>>2]|0;pla(aa,ma,oa);hg(W,X,aa);dka(X);dka(Y);dka(_);dka(Z);eka(ba,1274672,-1);Tf(ca,a);bg(da,a);eka(ea,1305928,-1);nl(a,ba,ca,da,W,ea);dka(ea);dka(ba);dka(W);ila(ia);pa=c[la>>2]|0;ila(pa);i=b;return}Ic[c[(c[ga>>2]|0)+292>>2]&511](ga,0);dQ(h,a,c[(c[(c[(c[a+20>>2]|0)+4>>2]|0)+36>>2]|0)+28>>2]|0);hQ(h,0);Ic[c[c[ga>>2]>>2]&511](ga,h);qa=c[(c[ga>>2]|0)+32>>2]|0;ra=+g[d>>2];sa=+g[d+4>>2];g[j>>2]=ra;g[j+8>>2]=0.0;g[j+4>>2]=sa;g[j+12>>2]=0.0;ld[qa&255](ga,j,1);ta=+nf(a);ua=ta;j=c[(c[ga>>2]|0)+88>>2]|0;if(ua<.01&ua>-.01){Oc[j&3](ga,12.0,1)}else{Oc[j&3](ga,ta,1)}Rc[c[(c[ga>>2]|0)+28>>2]&1023](ga);gla(k);ta=+g[d+12>>2];j=fa+12|0;qa=ip(c[j>>2]|0)|0;va=dp(c[j>>2]|0)|0;wa=_o(fa)|0;if((qa|0)<(va|0)){xa=(wa|0)>0;ya=m+12|0;za=m+8|0;Aa=N+4|0;Ba=q+4|0;Ca=q+8|0;Da=q+12|0;Ea=q+16|0;Fa=A+4|0;Ga=A+8|0;Ha=A+12|0;Ia=A+16|0;Ja=E+4|0;Ka=H+4|0;La=I+4|0;Ma=L+4|0;Na=O+4|0;Oa=n+4|0;Pa=o+4|0;ua=ra;Qa=s+4|0;Ra=t+4|0;Sa=sa-ra;Ta=u+4|0;Ua=v+4|0;Va=w+4|0;Wa=x+4|0;Xa=y+4|0;Ya=C+4|0;Za=F+4|0;_a=ta;$a=qa;while(1){a:do{if(xa){qa=0;while(1){if(($o(fa,qa)|0)==($a|0)){ab=1;break a}qa=qa+1|0;if((qa|0)>=(wa|0)){ab=0;break}}}else{ab=0}}while(0);qa=c[(c[ga>>2]|0)+248>>2]|0;Mo(l,c[j>>2]|0,$a);bb=c[l>>2]|0;Fc[qa&63](ga,(bb|0)==0?1292088:bb+12|0,1,0,0);Lna(l);Ic[c[(c[ga>>2]|0)+200>>2]&511](m,ga);cb=+g[ya>>2]- +g[za>>2];if((ab|0)==0){gg(G,a);pe(H,1291896);bb=qla(k,c[H>>2]|0,c[Ka>>2]|0)|0;c[K>>2]=1;vYa(J,G,K);oe(I,J);qa=qla(bb,c[I>>2]|0,c[La>>2]|0)|0;g[N>>2]=0.0;g[Aa>>2]=_a;yYa(M,ga,N,0,1,0);oe(L,M);bb=qla(qa,c[L>>2]|0,c[Ma>>2]|0)|0;pe(O,1291904);qla(bb,c[O>>2]|0,c[Na>>2]|0)|0;dka(M);dka(J);db=_a-cb}else{eb=_a-cb;pe(n,1293864);bb=qla(k,c[n>>2]|0,c[Oa>>2]|0)|0;c[q>>2]=2;g[Ba>>2]=0.0;g[Ca>>2]=.20000000298023224;g[Da>>2]=.4431372582912445;g[Ea>>2]=0.0;c[r>>2]=1;vYa(p,q,r);oe(o,p);qa=tla(qla(bb,c[o>>2]|0,c[Pa>>2]|0)|0,ua)|0;pe(s,1305864);bb=tla(qla(qa,c[s>>2]|0,c[Qa>>2]|0)|0,eb)|0;pe(t,1305864);qa=tla(qla(bb,c[t>>2]|0,c[Ra>>2]|0)|0,Sa)|0;pe(u,1305864);bb=tla(qla(qa,c[u>>2]|0,c[Ta>>2]|0)|0,_a-eb)|0;pe(v,1292072);qa=qla(bb,c[v>>2]|0,c[Ua>>2]|0)|0;pe(w,1293904);qla(qa,c[w>>2]|0,c[Va>>2]|0)|0;dka(p);pe(x,1291896);qa=qla(k,c[x>>2]|0,c[Wa>>2]|0)|0;c[A>>2]=1;g[Fa>>2]=1.0;g[Ga>>2]=0.0;g[Ha>>2]=0.0;g[Ia>>2]=0.0;c[B>>2]=1;vYa(z,A,B);oe(y,z);bb=qla(qa,c[y>>2]|0,c[Xa>>2]|0)|0;g[E>>2]=0.0;g[Ja>>2]=_a;yYa(D,ga,E,0,1,0);oe(C,D);qa=qla(bb,c[C>>2]|0,c[Ya>>2]|0)|0;pe(F,1291904);qla(qa,c[F>>2]|0,c[Za>>2]|0)|0;dka(D);dka(z);db=eb}$a=$a+1|0;if(($a|0)>=(va|0)){break}else{_a=db}}}va=k+8|0;if((c[va>>2]|0)>0){pe(P,1291024);$a=qla(e,c[P>>2]|0,c[P+4>>2]|0)|0;pe(Q,1293864);P=tla(qla($a,c[Q>>2]|0,c[Q+4>>2]|0)|0,ra)|0;pe(R,1305864);Q=qla(P,c[R>>2]|0,c[R+4>>2]|0)|0;db=+g[d+8>>2];d=tla(Q,db)|0;pe(S,1305864);Q=tla(qla(d,c[S>>2]|0,c[S+4>>2]|0)|0,sa-ra)|0;pe(T,1305864);S=tla(qla(Q,c[T>>2]|0,c[T+4>>2]|0)|0,ta-db)|0;pe(U,2248);qla(S,c[U>>2]|0,c[U+4>>2]|0)|0;U=ula(e,c[k+4>>2]|0,c[va>>2]|0)|0;pe(V,2264);qla(U,c[V>>2]|0,c[V+4>>2]|0)|0}Ipa(ga);ila(c[k+4>>2]|0);fQ(h);ig(Z,a);jg(_,a);ag(Y,Z,_);ha=f+4|0;ia=c[ha>>2]|0;ja=f+8|0;ka=c[ja>>2]|0;pla($,ia,ka);hg(X,Y,$);la=e+4|0;ma=c[la>>2]|0;na=e+8|0;oa=c[na>>2]|0;pla(aa,ma,oa);hg(W,X,aa);dka(X);dka(Y);dka(_);dka(Z);eka(ba,1274672,-1);Tf(ca,a);bg(da,a);eka(ea,1305928,-1);nl(a,ba,ca,da,W,ea);dka(ea);dka(ba);dka(W);ila(ia);pa=c[la>>2]|0;ila(pa);i=b;return}function Jf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0.0,Ja=0.0,Ka=0.0,La=0,Ma=0,Na=0,Oa=0,Pa=0;d=i;i=i+672|0;e=d+648|0;f=d+632|0;h=d+568|0;j=d+552|0;k=d+544|0;l=d+528|0;m=d+520|0;n=d+512|0;o=d+504|0;p=d+496|0;q=d+488|0;r=d+480|0;s=d+472|0;t=d+464|0;u=d+440|0;v=d+432|0;w=d+424|0;x=d+420|0;y=d+416|0;z=d+408|0;A=d+400|0;B=d+392|0;C=d+384|0;D=d+364|0;E=d+360|0;F=d+352|0;G=d+344|0;H=d+336|0;I=d+328|0;J=d+308|0;K=d+304|0;L=d+296|0;M=d+288|0;N=d+280|0;O=d+272|0;P=d+264|0;Q=d+256|0;R=d+248|0;S=d+228|0;T=d+224|0;U=d+216|0;V=d+208|0;W=d+200|0;X=d+192|0;Y=d+172|0;Z=d+168|0;_=d+160|0;$=d+152|0;aa=d+144|0;ba=d+136|0;ca=d+128|0;da=d+120|0;ea=d+112|0;fa=d+104|0;ga=d+96|0;ha=d+88|0;ia=d+84|0;ja=d+80|0;ka=d+76|0;la=d+72|0;ma=d+64|0;na=d+56|0;oa=d+48|0;pa=d+32|0;qa=d+8|0;ra=d;sa=ef(a)|0;ta=c[sa+4>>2]|0;gla(e);gla(f);ua=Hpa()|0;if((ua|0)==0){ig(ka,a);jg(la,a);ag(ja,ka,la);va=f+4|0;wa=c[va>>2]|0;xa=f+8|0;ya=c[xa>>2]|0;pla(ma,wa,ya);hg(ia,ja,ma);za=e+4|0;Aa=c[za>>2]|0;Ba=e+8|0;Ca=c[Ba>>2]|0;pla(na,Aa,Ca);hg(ha,ia,na);dka(ia);dka(ja);dka(la);dka(ka);eka(oa,1274672,-1);Tf(pa,a);bg(qa,a);eka(ra,1305928,-1);nl(a,oa,pa,qa,ha,ra);dka(ra);dka(oa);dka(ha);Da=c[va>>2]|0;ila(Da);Ea=c[za>>2]|0;ila(Ea);i=d;return}Ic[c[(c[ua>>2]|0)+292>>2]&511](ua,0);dQ(h,a,c[(c[(c[(c[a+20>>2]|0)+4>>2]|0)+36>>2]|0)+28>>2]|0);hQ(h,0);Ic[c[c[ua>>2]>>2]&511](ua,h);fg(j,a);ld[c[(c[ua>>2]|0)+32>>2]&255](ua,j,1);Fa=c[(c[ua>>2]|0)+40>>2]|0;Ga=Bo(sa)|0;ld[Fa&255](ua,Ga,1);Ga=Do(c[ta+12>>2]|0)|0;Fa=c[ua>>2]|0;if((Ga&4096|0)==0){ld[c[Fa+44>>2]&255](ua,1,1)}else{ld[c[Fa+72>>2]&255](ua,1,1);ld[c[(c[ua>>2]|0)+76>>2]&255](ua,1,1)}if((Ga&8192|0)==0){Ha=0}else{ld[c[(c[ua>>2]|0)+48>>2]&255](ua,42,1);Ha=42}Fa=Zo(ta)|0;sa=Ga>>>24&1;Ia=+nf(a);do{if((Fa|0)>0){if((sa|0)!=0){ld[c[(c[ua>>2]|0)+56>>2]&255](ua,Fa,1);Ja=Ia;if(!(Ja<.01&Ja>-.01)){Ka=Ia;La=Fa;break}Ka=+TUa(dd[c[c[h>>2]>>2]&511](h,0)|0,j,Fa);La=Fa;break}if((b|0)==0){Ma=Fa}else{Ma=T1a(b)|0}ld[c[(c[ua>>2]|0)+52>>2]&255](ua,Ma,1);Ka=Ia;La=Ma}else{Ka=Ia;La=Fa}}while(0);Ia=Ka;if(Ia<.01&Ia>-.01){ld[c[(c[ua>>2]|0)+80>>2]&255](ua,1,1)}else{Oc[c[(c[ua>>2]|0)+88>>2]&3](ua,Ka,1)}Rc[c[(c[ua>>2]|0)+28>>2]&1023](ua);Fa=c[(c[ua>>2]|0)+248>>2]|0;if((b|0)==0){To(k,ta);ta=c[k>>2]|0;Fc[Fa&63](ua,(ta|0)==0?1292088:ta+12|0,1,0,0);Lna(k)}else{Fc[Fa&63](ua,b,1,0,0)}Ic[c[(c[ua>>2]|0)+200>>2]&511](l,ua);g[n>>2]=0.0;g[n+4>>2]=0.0;b=(sa|0)==0;yYa(m,ua,n,0,sa^1,Ha);Ha=c[m>>2]|0;if((Ha|0)!=0?(c[Ha+4>>2]|0)>0:0){pe(o,1291024);Ha=qla(e,c[o>>2]|0,c[o+4>>2]|0)|0;pe(p,1293864);qla(Ha,c[p>>2]|0,c[p+4>>2]|0)|0;p=j+4|0;Ka=+g[j>>2];if(!(+g[l+4>>2]- +g[l>>2]>+g[p>>2]-Ka)){Ha=j+12|0;o=j+8|0;if(+g[l+12>>2]- +g[l+8>>2]>+g[Ha>>2]- +g[o>>2]){Na=Ha;Oa=o;Pa=25}}else{Na=j+12|0;Oa=j+8|0;Pa=25}if((Pa|0)==25){Pa=tla(e,Ka)|0;pe(q,1305864);o=qla(Pa,c[q>>2]|0,c[q+4>>2]|0)|0;q=tla(o,+g[Oa>>2])|0;pe(r,1305864);o=qla(q,c[r>>2]|0,c[r+4>>2]|0)|0;r=tla(o,+g[p>>2]- +g[j>>2])|0;pe(s,1305864);p=qla(r,c[s>>2]|0,c[s+4>>2]|0)|0;s=tla(p,+g[Na>>2]- +g[Oa>>2])|0;pe(t,2248);qla(s,c[t>>2]|0,c[t+4>>2]|0)|0}gg(u,a);pe(v,1291896);t=qla(e,c[v>>2]|0,c[v+4>>2]|0)|0;c[y>>2]=1;vYa(x,u,y);oe(w,x);y=qla(t,c[w>>2]|0,c[w+4>>2]|0)|0;oe(z,m);w=qla(y,c[z>>2]|0,c[z+4>>2]|0)|0;pe(A,1291904);z=qla(w,c[A>>2]|0,c[A+4>>2]|0)|0;pe(B,2264);qla(z,c[B>>2]|0,c[B+4>>2]|0)|0;dka(x)}do{if(!b){x=ml(a)|0;if((x|0)==0){kg(D,a);c[E>>2]=0;vYa(C,D,E);B=c[C>>2]|0;if((B|0)!=0?(c[B+4>>2]|0)>0:0){pe(F,1293864);B=qla(f,c[F>>2]|0,c[F+4>>2]|0)|0;z=rla(B,ll(a)|0)|0;pe(G,1292032);B=qla(z,c[G>>2]|0,c[G+4>>2]|0)|0;kg(J,a);c[K>>2]=0;vYa(I,J,K);oe(H,I);z=qla(B,c[H>>2]|0,c[H+4>>2]|0)|0;pe(L,1289608);qla(z,c[L>>2]|0,c[L+4>>2]|0)|0;dka(I);if((La|0)>1){z=j+4|0;Ka=+(La|0);B=j+8|0;A=j+12|0;w=M+4|0;y=N+4|0;t=O+4|0;u=P+4|0;v=1;do{Ia=+g[j>>2];Ja=+(v|0);s=tla(f,Ia+Ja*((+g[z>>2]-Ia)/Ka))|0;pe(M,1305864);Oa=qla(s,c[M>>2]|0,c[w>>2]|0)|0;s=tla(Oa,+g[B>>2])|0;pe(N,1293880);Oa=qla(s,c[N>>2]|0,c[y>>2]|0)|0;Ia=+g[j>>2];s=tla(Oa,Ia+Ja*((+g[z>>2]-Ia)/Ka))|0;pe(O,1305864);Oa=qla(s,c[O>>2]|0,c[t>>2]|0)|0;s=tla(Oa,+g[A>>2])|0;pe(P,1292016);qla(s,c[P>>2]|0,c[u>>2]|0)|0;v=v+1|0}while((v|0)<(La|0))}pe(Q,1293904);qla(f,c[Q>>2]|0,c[Q+4>>2]|0)|0}dka(C);break}else if((x|0)==1){kg(S,a);c[T>>2]=0;vYa(R,S,T);v=c[R>>2]|0;if((v|0)!=0?(c[v+4>>2]|0)>0:0){pe(U,1293864);v=qla(f,c[U>>2]|0,c[U+4>>2]|0)|0;u=rla(v,ll(a)|0)|0;pe(V,1292032);v=qla(u,c[V>>2]|0,c[V+4>>2]|0)|0;kg(Y,a);c[Z>>2]=0;vYa(X,Y,Z);oe(W,X);u=qla(v,c[W>>2]|0,c[W+4>>2]|0)|0;pe(_,1292048);v=rla(qla(u,c[_>>2]|0,c[_+4>>2]|0)|0,3)|0;pe($,1305864);u=rla(qla(v,c[$>>2]|0,c[$+4>>2]|0)|0,3)|0;pe(aa,1292e3);v=rla(qla(u,c[aa>>2]|0,c[aa+4>>2]|0)|0,0)|0;pe(ba,1292008);qla(v,c[ba>>2]|0,c[ba+4>>2]|0)|0;dka(X);if((La|0)>1){v=j+4|0;Ka=+(La|0);u=j+8|0;A=j+12|0;t=ca+4|0;z=da+4|0;y=ea+4|0;B=fa+4|0;w=1;do{Ia=+g[j>>2];Ja=+(w|0);s=tla(f,Ia+Ja*((+g[v>>2]-Ia)/Ka))|0;pe(ca,1305864);Oa=qla(s,c[ca>>2]|0,c[t>>2]|0)|0;s=tla(Oa,+g[u>>2])|0;pe(da,1293880);Oa=qla(s,c[da>>2]|0,c[z>>2]|0)|0;Ia=+g[j>>2];s=tla(Oa,Ia+Ja*((+g[v>>2]-Ia)/Ka))|0;pe(ea,1305864);Oa=qla(s,c[ea>>2]|0,c[y>>2]|0)|0;s=tla(Oa,+g[A>>2])|0;pe(fa,1292016);qla(s,c[fa>>2]|0,c[B>>2]|0)|0;w=w+1|0}while((w|0)<(La|0))}pe(ga,1293904);qla(f,c[ga>>2]|0,c[ga+4>>2]|0)|0}dka(R);break}else{break}}}while(0);Ipa(ua);dka(m);fQ(h);ig(ka,a);jg(la,a);ag(ja,ka,la);va=f+4|0;wa=c[va>>2]|0;xa=f+8|0;ya=c[xa>>2]|0;pla(ma,wa,ya);hg(ia,ja,ma);za=e+4|0;Aa=c[za>>2]|0;Ba=e+8|0;Ca=c[Ba>>2]|0;pla(na,Aa,Ca);hg(ha,ia,na);dka(ia);dka(ja);dka(la);dka(ka);eka(oa,1274672,-1);Tf(pa,a);bg(qa,a);eka(ra,1305928,-1);nl(a,oa,pa,qa,ha,ra);dka(ra);dka(oa);dka(ha);Da=c[va>>2]|0;ila(Da);Ea=c[za>>2]|0;ila(Ea);i=d;return}function Kf(a){a=a|0;ef(a)|0}function Lf(){}function Mf(a){a=a|0;var b=0,d=0;b=i;d=c[(ef(a)|0)+4>>2]|0;Nf(c[a+20>>2]|0,d,0);i=b;return}function Nf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=c[b+20>>2]|0;if((f|0)<=0){i=e;return}g=b+16|0;b=0;do{h=vg(a,Ch(g,b)|0)|0;if((h|0)!=0){Df(h,d,1)}b=b+1|0}while((b|0)!=(f|0));i=e;return}function Of(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0;f=i;i=i+64|0;h=f+48|0;j=f+32|0;k=f;if(((af(a)|0)&-2|0)==2&(e|0)==0?($e(a,0)|0)==0:0){OIa(h);al(j,a);XIa(h,+g[j>>2],+g[j+8>>2],+g[j+4>>2],+g[j+12>>2]);dJa(k);g[k+24>>2]=0.0;UGa(b,h,d,k,0,-5592406,1,0)|0;gJa(c[k+8>>2]|0);PIa(c[h+4>>2]|0);i=f;return}el(c[a+4>>2]|0,c[(c[a+8>>2]|0)+24>>2]|0,b,d,e);i=f;return}function Pf(a){a=a|0;var b=0,d=0;b=i;d=c[(ef(a)|0)+4>>2]|0;Qf(c[a+20>>2]|0,d);i=b;return}function Qf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=i;i=i+16|0;e=d;f=c[b+20>>2]|0;if((f|0)<=0){i=d;return}g=b+16|0;b=a+4|0;h=e+4|0;j=e+8|0;k=e+12|0;l=0;do{m=vg(a,Ch(g,l)|0)|0;if((m|0)!=0){n=c[(c[b>>2]|0)+36>>2]|0;o=_h(n)|0;p=vl(c[m+8>>2]|0)|0;q=bi(c[b>>2]|0,p,0)|0;pd[c[(c[o>>2]|0)+24>>2]&127](e,o,q,m);Bg(c[n+12>>2]|0,p,+(c[e>>2]|0),+(c[h>>2]|0),+(c[j>>2]|0),+(c[k>>2]|0))}l=l+1|0}while((l|0)!=(f|0));i=d;return}function Rf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0;f=i;i=i+80|0;h=f+56|0;j=f+40|0;k=f+16|0;l=f;m=af(b)|0;n=b+20|0;o=m+ -1|0;if(o>>>0>5){i=f;return}if((c[(c[n>>2]|0)+(o<<2)+72>>2]|0)==0){i=f;return}al(h,b);b=c[n>>2]|0;n=Sf(b,m)|0;m=a[b+68>>0]|0;c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;if((c[(c[b+4>>2]|0)+36>>2]|0)==0){i=f;return}c[k+0>>2]=c[e+0>>2];c[k+4>>2]=c[e+4>>2];c[k+8>>2]=c[e+8>>2];c[k+12>>2]=c[e+12>>2];c[k+16>>2]=c[e+16>>2];c[k+20>>2]=c[e+20>>2];p=+g[h+8>>2];e=j+8|0;g[j>>2]=+g[h>>2];g[e>>2]=p;fma(k,j,e);p=+g[h+12>>2];b=j+4|0;o=j+12|0;g[b>>2]=+g[h+4>>2];g[o>>2]=p;fma(k,b,o);Hla(j);k=ECa(m&255,n)|0;n=~~+g[o>>2];o=~~+g[b>>2];b=~~+g[e>>2];c[l>>2]=~~+g[j>>2];c[l+4>>2]=n;c[l+8>>2]=o;c[l+12>>2]=b;WGa(d,l,k,0)|0;i=f;return}function Sf(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;do{if(!(b>>>0>6)){if((b|0)==0){e=c[a+44>>2]|0;break}else{e=c[a+(b+ -1<<2)+44>>2]|0;break}}else{e=16777215}}while(0);i=d;return e|0}function Tf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,h=0.0;d=i;i=i+16|0;e=d;al(e,b);f=+g[e+4>>2]- +g[e>>2];h=+g[e+12>>2]- +g[e+8>>2];e=ef(b)|0;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;b=(mo(c[e+8>>2]|0)|0)%360|0;e=(b|0)>-1?b:0-b|0;if((e|0)==90|(e|0)==270){g[a>>2]=0.0;g[a+4>>2]=h;g[a+8>>2]=0.0;g[a+12>>2]=f;i=d;return}else{g[a>>2]=0.0;g[a+4>>2]=f;g[a+8>>2]=0.0;g[a+12>>2]=h;i=d;return}}function Uf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;eka(f,2240,-1);qo(c[a+8>>2]|0,b,d,f);dka(f);i=e;return}function Vf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;eka(f,39672,-1);qo(c[a+8>>2]|0,b,d,f);dka(f);i=e;return}function Wf(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;eka(e,736,-1);so(a,c[b+8>>2]|0,e);dka(e);i=d;return}function Xf(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;eka(e,744,-1);so(a,c[b+8>>2]|0,e);dka(e);i=d;return}function Yf(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;eka(e,752,-1);so(a,c[b+8>>2]|0,e);dka(e);i=d;return}function Zf(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b;eka(d,37016,-1);e=uo(c[a+8>>2]|0,d)|0;dka(d);i=b;return e|0}function _f(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b;eka(d,760,-1);e=uo(c[a+8>>2]|0,d)|0;dka(d);i=b;return e|0}function $f(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b;eka(d,768,-1);e=uo(c[a+8>>2]|0,d)|0;dka(d);i=b;return e|0}function ag(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d+8|0;f=d;oe(e,b);oe(f,c);lka(a,e,f);i=d;return}function bg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0;d=i;i=i+16|0;e=d;f=a+12|0;g[f>>2]=1.0;g[a>>2]=1.0;h=a+20|0;g[h>>2]=0.0;j=a+16|0;g[j>>2]=0.0;k=a+8|0;g[k>>2]=0.0;l=a+4|0;g[l>>2]=0.0;m=ef(b)|0;al(e,b);n=+g[e+4>>2]- +g[e>>2];o=+g[e+12>>2]- +g[e+8>>2];e=(mo(c[m+8>>2]|0)|0)%360|0;m=(e|0)>-1?e:0-e|0;if((m|0)==90){g[a>>2]=0.0;g[l>>2]=1.0;g[k>>2]=-1.0;g[f>>2]=0.0;g[j>>2]=n;g[h>>2]=0.0;i=d;return}else if((m|0)==180){g[a>>2]=-1.0;g[l>>2]=0.0;g[k>>2]=0.0;g[f>>2]=-1.0;g[j>>2]=n;g[h>>2]=o;i=d;return}else if((m|0)==270){g[a>>2]=0.0;g[l>>2]=-1.0;g[k>>2]=1.0;g[f>>2]=0.0;g[j>>2]=0.0;g[h>>2]=o;i=d;return}else{g[a>>2]=1.0;g[l>>2]=0.0;g[k>>2]=0.0;g[f>>2]=1.0;g[j>>2]=0.0;g[h>>2]=0.0;i=d;return}}function cg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=i;i=i+64|0;g=f+56|0;h=f+48|0;j=f+44|0;k=f+40|0;l=f+32|0;m=f+24|0;n=f+16|0;o=f+8|0;p=f;q=si(b)|0;pe(g,669488);b=iI(a,g)|0;oe(h,d);d=c[(kI(b,h)|0)+12>>2]|0;eka(j,800,-1);h=c[e+12>>2]|0;do{if((h|0)!=0){pe(l,1293312);aI(k,h,l);ika(j,k);dka(k);b=c[j>>2]|0;if((b|0)!=0?(c[b+4>>2]|0)!=0:0){break}mka(j,800)}}while(0);pe(m,669496);k=iI(d,m)|0;if((k|0)==0){m=u2a(32)|0;Dh(m);pe(n,669496);oI(d,n,m,0);if((m|0)==0){dka(j);i=f;return}else{r=m}}else{r=k}k=u2a(32)|0;Dh(k);oe(o,j);if((q|0)==0){s=0}else{s=q+16|0}vI(k,o,s,c[e+4>>2]|0);pe(p,36952);oI(r,p,k,0);dka(j);i=f;return}function dg(a){a=a|0;var b=0;if((a|0)==0){b=1}else{b=(c[a+4>>2]|0)==0}return b&1|0}function eg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=i;i=i+16|0;d=c+8|0;e=c;pe(d,669488);f=iI(a,d)|0;if((f|0)==0){i=c;return}oe(e,b);qI(f,e);i=c;return}function fg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0,f=0.0;c=i;i=i+16|0;d=c;Tf(d,b);e=+(ll(b)|0);if(((ml(b)|0)+ -2|0)>>>0<2){f=e*2.0}else{f=e}sYa(a,d,f);i=c;return}function gg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0;d=i;i=i+32|0;e=d+24|0;f=d+16|0;h=d;c[a>>2]=1;j=a+4|0;k=a+8|0;l=a+12|0;m=a+16|0;c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;Ao(e,ef(b)|0);if((Ep(e)|0)==0){n=e+4|0;dka(n);i=d;return}Fp(e,f,h);o=+g[h>>2];p=+g[h+4>>2];q=+g[h+8>>2];r=+g[h+12>>2];c[a>>2]=c[f>>2];g[j>>2]=o;g[k>>2]=p;g[l>>2]=q;g[m>>2]=r;n=e+4|0;dka(n);i=d;return}function hg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;i=i+16|0;e=d;oe(e,b);lka(a,e,c);i=d;return}function ig(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+48|0;e=d+16|0;f=d;lg(e,b);if((c[e>>2]|0)==0){eka(a,1305928,-1);i=d;return}else{Tf(f,b);uYa(a,f,e);i=d;return}}function jg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0,u=0.0,v=0;d=i;i=i+112|0;e=d+96|0;f=d+72|0;h=d+52|0;j=d+32|0;k=d+12|0;l=d;Tf(e,b);kg(f,b);lg(h,b);m=j+4|0;n=j+8|0;o=j+12|0;p=j+16|0;c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;q=+(ll(b)|0);c[l>>2]=3;r=l+4|0;c[r>>2]=0;s=l+8|0;c[s>>2]=0;t=ml(b)|0;if((t|0)==2){c[j>>2]=1;g[m>>2]=1.0;g[n>>2]=0.0;g[o>>2]=0.0;g[p>>2]=0.0;GYa(k,h);u=q*2.0;v=2}else if((t|0)==1){c[l>>2]=3;c[r>>2]=3;c[s>>2]=0;u=q;v=1}else if((t|0)==3){c[j>>2]=1;g[m>>2]=.5;g[n>>2]=0.0;g[o>>2]=0.0;g[p>>2]=0.0;c[k>>2]=1;g[k+4>>2]=.75;g[k+8>>2]=0.0;g[k+12>>2]=0.0;g[k+16>>2]=0.0;u=q*2.0;v=3}else if((t|0)==4){u=q;v=4}else{u=q;v=0}DYa(a,e,u,f,j,k,v,l);i=d;return}function kg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0.0,j=0.0,k=0.0,l=0.0;d=i;i=i+32|0;e=d+16|0;f=d;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;Vf(ef(b)|0,e,f);b=c[e>>2]|0;if((b|0)<=0){i=d;return}h=+g[f>>2];j=+g[f+4>>2];k=+g[f+8>>2];l=+g[f+12>>2];c[a>>2]=b;g[a+4>>2]=h;g[a+8>>2]=j;g[a+12>>2]=k;g[a+16>>2]=l;i=d;return}function lg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0.0,j=0.0,k=0.0,l=0.0;d=i;i=i+32|0;e=d+16|0;f=d;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;Uf(ef(b)|0,e,f);b=c[e>>2]|0;if((b|0)<=0){i=d;return}h=+g[f>>2];j=+g[f+4>>2];k=+g[f+8>>2];l=+g[f+12>>2];c[a>>2]=b;g[a+4>>2]=h;g[a+8>>2]=j;g[a+12>>2]=k;g[a+16>>2]=l;i=d;return}function mg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;g=f;ld[c[(c[a>>2]|0)+24>>2]&255](g,a,b);h=c[g>>2]|0;if((h|0)==0){j=0;i=f;return j|0}if((zl(h)|0)==0){j=0;i=f;return j|0}h=c[e+48>>2]|0;e=Xh(c[h+36>>2]|0)|0;k=c[(c[e>>2]|0)+40>>2]|0;l=c[(ef(a)|0)+4>>2]|0;j=Wc[k&31](e,g,b,h,l,d)|0;i=f;return j|0}function ng(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;switch(d|0){case 9:case 8:case 7:case 6:case 5:case 4:case 3:case 2:case 1:case 0:{tl(a,b,d);i=e;return};case 15:case 14:case 13:case 12:{Qo(f,c[(c[(ef(b)|0)+4>>2]|0)+12>>2]|0);g=c[f>>2]|0;if((g|0)==0){tl(a,b,d);i=e;return}else{Gl(a,g,d);i=e;return}break};default:{c[a>>2]=0;i=e;return}}}function og(a){a=a|0;return a|0}function pg(a){a=a|0;return a|0}function qg(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=i;c[b>>2]=816;f=b+4|0;c[f>>2]=d;d=b+8|0;c[d>>2]=0;zma(b+12|0,10);c[b+36>>2]=1;c[b+40>>2]=0;g=u2a(68)|0;sn(g,c[(c[f>>2]|0)+24>>2]|0,0);c[d>>2]=g;Vn(g,b);g=b+72|0;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;c[g+20>>2]=0;a[b+68>>0]=0;i=e;return}function rg(a){a=a|0;var b=0;b=i;sg(a);v2a(a);i=b;return}function sg(a){a=a|0;var b=0,d=0,e=0;b=i;c[a>>2]=816;d=a+8|0;e=c[d>>2]|0;if((e|0)!=0){un(e);v2a(e)}c[d>>2]=0;d=a+12|0;Ama(d);Bma(d);i=b;return}function tg(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}Rc[c[(c[a>>2]|0)+4>>2]&1023](a);i=b;return}function ug(a){a=a|0;return c[a+8>>2]|0}function vg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+16|0;e=d+8|0;f=d;if((b|0)==0){g=0;i=d;return g|0}if((c[a+8>>2]|0)==0){g=0;i=d;return g|0}c[e>>2]=0;wg(a+12|0,b,e);h=c[e>>2]|0;if((h|0)!=0){g=h;i=d;return g|0}h=c[b+8>>2]|0;b=a+4|0;a=c[(c[b>>2]|0)+24>>2]|0;pe(f,669064);e=iI(h,f)|0;if(((e|0)!=0?(f=UG(a,c[e+4>>2]|0)|0,(f|0)>-1):0)?(e=di(c[b>>2]|0,f)|0,(e|0)!=0):0){j=e}else{e=xg(a,h)|0;if(!((e|0)>-1)){g=0;i=d;return g|0}a=di(c[b>>2]|0,e)|0;if((a|0)==0){g=0;i=d;return g|0}else{j=a}}g=vi(j,h)|0;i=d;return g|0}function wg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;c[f>>2]=0;if((Dma(a,b,f)|0)==0){i=e;return}c[d>>2]=c[f>>2];i=e;return}function xg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;i=i+16|0;e=d;f=VG(c[a+84>>2]|0)|0;if((f|0)<=0){g=-1;i=d;return g|0}h=0;a:while(1){j=RG(a,h)|0;if(((j|0)!=0?(pe(e,38856),k=jI(j,e)|0,(k|0)!=0):0)?(j=c[k+16>>2]|0,(j|0)>0):0){l=0;do{if((b|0)==(GH(k,l)|0)){g=h;m=9;break a}l=l+1|0}while((l|0)<(j|0))}h=h+1|0;if((h|0)>=(f|0)){g=-1;m=9;break}}if((m|0)==9){i=d;return g|0}return 0}function yg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+4|0;f=c[e>>2]|0;g=f+1|0;do{if((f|0)>=(c[a+8>>2]|0)){if((Kja(a,g)|0)==0){i=d;return}else{h=c[e>>2]|0;break}}else{c[e>>2]=g;h=g}}while(0);c[(c[a>>2]|0)+(h+ -1<<2)>>2]=b;i=d;return}function zg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;c[(Gma(a+12|0,b)|0)>>2]=d;i=e;return}function Ag(a,b){a=a|0;b=b|0;var c=0;c=i;Jma(a+12|0,b);i=c;return}function Bg(a,b,d,e,f,g){a=a|0;b=b|0;d=+d;e=+e;f=+f;g=+g;var h=0,j=0;h=i;if((a|0)!=0?(j=c[a+8>>2]|0,(j|0)!=0):0){Mc[j&0](a,b,d,e,f,g)}i=h;return}function Cg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;i=i+64|0;g=f+52|0;h=f+48|0;j=f;Qo(g,c[b+12>>2]|0);k=c[g>>2]|0;if((k|0)==0){i=f;return}if((Fl(k,12)|0)==0){i=f;return}Gl(h,k,12);if((c[h>>2]|0)==0){i=f;return}k=a+4|0;a=Xh(c[(c[k>>2]|0)+36>>2]|0)|0;g=j+44|0;l=j+0|0;m=l+44|0;do{c[l>>2]=0;l=l+4|0}while((l|0)<(m|0));c[g>>2]=1;c[j>>2]=0;c[j+4>>2]=0;Pna(j+32|0,d);Wc[c[(c[a>>2]|0)+44>>2]&31](a,h,12,c[k>>2]|0,b,j)|0;c[e>>2]=c[g>>2];Bh(j);i=f;return}function Dg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;i=i+64|0;g=f+52|0;h=f+48|0;j=f;Qo(g,c[b+12>>2]|0);k=c[g>>2]|0;if((k|0)==0){i=f;return}if((Fl(k,14)|0)==0){i=f;return}Gl(h,k,14);if((c[h>>2]|0)==0){i=f;return}k=a+4|0;a=Xh(c[(c[k>>2]|0)+36>>2]|0)|0;g=j+44|0;l=j+0|0;m=l+44|0;do{c[l>>2]=0;l=l+4|0}while((l|0)<(m|0));c[g>>2]=1;c[j>>2]=0;c[j+4>>2]=0;Pna(j+32|0,d);Wc[c[(c[a>>2]|0)+44>>2]&31](a,h,14,c[k>>2]|0,b,j)|0;c[e>>2]=c[g>>2];Bh(j);i=f;return}function Eg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;d=i;i=i+64|0;e=d+48|0;f=d+32|0;g=d+16|0;h=d;c[e>>2]=b;Ija(f,4);Cl(e,f);Ija(g,4);Ija(h,4);Fg(a,f,h);e=Gg(c[b>>2]|0)|0;b=c[h+4>>2]|0;if((b|0)<=0){j=0;k=c[h>>2]|0;Jja(k);l=c[g>>2]|0;Jja(l);m=c[f>>2]|0;Jja(m);i=d;return j|0}n=(e|0)==0;e=0;o=0;while(1){p=c[(Hg(h,o)|0)>>2]|0;q=c[p+20>>2]|0;if((q|0)>0){r=p+16|0;p=e;s=0;while(1){t=vg(a,Ch(r,s)|0)|0;if((t|0)==0){u=p}else{v=t+4|0;w=(Yk(c[(c[v>>2]|0)+16>>2]|0)|0)&-36;hl(c[(c[v>>2]|0)+16>>2]|0,n?w:w|2);ii(_k(c[t+8>>2]|0)|0,t);u=1}s=s+1|0;if((s|0)>=(q|0)){x=u;break}else{p=u}}}else{x=e}o=o+1|0;if((o|0)>=(b|0)){j=x;break}else{e=x}}k=c[h>>2]|0;Jja(k);l=c[g>>2]|0;Jja(l);m=c[f>>2]|0;Jja(m);i=d;return j|0}function Fg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+16|0;f=e;g=c[b+4>>2]|0;if((g|0)<=0){i=e;return}h=a+8|0;a=0;do{j=Qg(b,a)|0;do{if((j|0)!=0){k=c[j>>2]|0;if((k|0)==6){if((Dn(c[h>>2]|0,j)|0)==0){break}yg(d,j);break}else if((k|0)!=3){break}uH(f,j);k=Cn(c[h>>2]|0,f)|0;if((k|0)!=0){yg(d,k)}Lna(f)}}while(0);a=a+1|0}while((a|0)<(g|0));i=e;return}function Gg(a){a=a|0;var b=0,c=0,d=0;b=i;i=i+16|0;c=b;pe(c,37056);d=hI(a,c,1)|0;i=b;return d|0}function Hg(b,d){b=b|0;d=d|0;var e=0;e=i;if(!((d|0)>=0?(c[b+4>>2]|0)>(d|0):0)){a[0]=0;da()}i=e;return(c[b>>2]|0)+(d<<2)|0}function Ig(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+64|0;e=d+48|0;f=d+40|0;g=d+32|0;h=d+16|0;j=d;Al(e,b);if((dg(c[e>>2]|0)|0)!=0){Lna(e);i=d;return}k=c[b>>2]|0;pe(f,2464);if((nI(k,f)|0)==0){if((On(c[a+8>>2]|0,0,1)|0)!=0){Lna(e);i=d;return}Lg(a,e)|0;Lna(e);i=d;return}c[g>>2]=b;f=Jg(c[b>>2]|0)|0;Ija(h,4);Cl(g,h);Ija(j,4);Fg(a,h,j);if((c[j+4>>2]|0)==0){if((On(c[a+8>>2]|0,0,1)|0)==0){Lg(a,e)|0}}else{g=f&1^1;if((On(c[a+8>>2]|0,j,g)|0)==0){Kg(a,e,j,g)}}Jja(c[j>>2]|0);Jja(c[h>>2]|0);Lna(e);i=d;return}function Jg(a){a=a|0;var b=0,c=0,d=0;b=i;i=i+16|0;c=b;pe(c,11680);d=eI(a,c)|0;i=b;return d|0}function Kg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;i=i+16|0;g=f;h=a+4|0;j=c[(c[h>>2]|0)+36>>2]|0;gla(g);Mg(c[(c[h>>2]|0)+36>>2]|0,c[a+8>>2]|0,d,e,g);e=g+4|0;d=c[b>>2]|0;Ng(j,c[e>>2]|0,c[g+8>>2]|0,(d|0)==0?1292088:d+12|0);ila(c[e>>2]|0);i=f;return}function Lg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;i=i+32|0;e=d+24|0;f=d+16|0;g=d;if((dg(c[b>>2]|0)|0)!=0){h=0;i=d;return h|0}j=c[a+4>>2]|0;k=c[j+36>>2]|0;if((j|0)==0){h=0;i=d;return h|0}ni(e,k);j=c[a+8>>2]|0;if((j|0)!=0?(Ah(f,e),a=Qn(j,f)|0,(a|0)!=0):0){gla(g);f=aH(a,g)|0;_G(a);v2a(a);if((f|0)==0){l=0;m=g+4|0}else{f=g+4|0;a=c[b>>2]|0;Ng(k,c[f>>2]|0,c[g+8>>2]|0,(a|0)==0?1292088:a+12|0);l=1;m=f}ila(c[m>>2]|0);n=l}else{n=0}Lna(e);h=n;i=d;return h|0}function Mg(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;i=i+16|0;g=f+8|0;h=f;ni(h,a);Ah(g,h);a=Rn(b,g,c,d)|0;Lna(h);if((a|0)==0){i=f;return}aH(a,e)|0;_G(a);v2a(a);i=f;return}function Ng(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;g=f+4|0;h=f;j=a+12|0;a=c[j>>2]|0;if((a|0)==0){i=f;return}k=c[a+64>>2]|0;if((k|0)==0){i=f;return}if((c[k+28>>2]|0)==0){i=f;return}Mna(h,e,-1);ioa(g,h);Lna(h);h=c[g>>2]|0;if((h|0)==0){l=0}else{l=c[h+4>>2]|0}h=Bka(g,l)|0;l=c[(c[j>>2]|0)+64>>2]|0;pd[c[l+28>>2]&127](l,b,d,h);Aka(g,-1);dka(g);i=f;return}function Og(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+48|0;e=d+40|0;f=d+32|0;g=d+16|0;h=d;j=c[b>>2]|0;pe(e,2464);if((nI(j,e)|0)==0){k=Jn(c[a+8>>2]|0)|0;i=d;return k|0}else{c[f>>2]=b;e=Jg(c[b>>2]|0)|0;Ija(g,4);Cl(f,g);Ija(h,4);Fg(a,g,h);f=In(c[a+8>>2]|0,h,e&1^1)|0;Jja(c[h>>2]|0);Jja(c[g>>2]|0);k=f;i=d;return k|0}return 0}function Pg(a){a=a|0;var b=0,c=0;b=i;i=i+16|0;c=b;Al(c,a);Lna(c);i=b;return}function Qg(b,d){b=b|0;d=d|0;var e=0;e=i;if(!((d|0)>=0?(c[b+4>>2]|0)>(d|0):0)){a[0]=0;da()}i=e;return c[(c[b>>2]|0)+(d<<2)>>2]|0}function Rg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;if(((Po(c[b>>2]|0)|0)&-3|0)!=4){g=0;i=e;return g|0}c[f>>2]=1;Cg(a,b,d,f);if((c[f>>2]|0)==0){g=-1;i=e;return g|0}Dg(a,b,d,f);g=(c[f>>2]|0)==0?-1:1;i=e;return g|0}function Sg(a,b){a=a|0;b=b|0;return 0}function Tg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;if((Po(c[b>>2]|0)|0)!=5){g=0;i=e;return g|0}c[f>>2]=1;Cg(a,b,d,f);if((c[f>>2]|0)==0){g=-1;i=e;return g|0}Dg(a,b,d,f);g=(c[f>>2]|0)==0?-1:1;i=e;return g|0}function Ug(a,b){a=a|0;b=b|0;var d=0;d=i;if((Po(c[b>>2]|0)|0)!=5){i=d;return 0}Nf(a,b,0);Qf(a,b);i=d;return 0}function Vg(a,b,d){a=a|0;b=b|0;d=d|0;d=i;if(((Po(c[b>>2]|0)|0)&-2|0)!=2){i=d;return 0}Qf(a,b);i=d;return 0}function Wg(a,b){a=a|0;b=b|0;return 0}function Xg(a,b){a=a|0;b=b|0;return 0}function Yg(a,b){a=a|0;b=b|0;return 0}function Zg(a,b){a=a|0;b=b|0;return 0}function _g(a){a=a|0;c[a+44>>2]=16770269;c[a+72>>2]=1;c[a+48>>2]=16770269;c[a+76>>2]=1;c[a+52>>2]=16770269;c[a+80>>2]=1;c[a+56>>2]=16770269;c[a+84>>2]=1;c[a+60>>2]=16770269;c[a+88>>2]=1;c[a+64>>2]=16770269;c[a+92>>2]=1;return}function $g(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;i=i+16|0;g=f+8|0;h=f;c[a>>2]=880;j=a+4|0;c[j>>2]=b;hka(a+8|0,d);hka(a+12|0,e);e=a+16|0;c[e>>2]=0;Ija(a+20|0,4);d=c[c[(c[j>>2]|0)+24>>2]>>2]|0;pe(h,912);aI(g,d,h);do{if(!(ah(g,669016)|0)){if(ah(g,1274288)|0){c[e>>2]=2;break}else{c[e>>2]=0;break}}else{c[e>>2]=1}}while(0);bh(a);dka(g);i=f;return}function ah(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;pe(e,b);b=vka(c[a>>2]|0,e)|0;i=d;return b|0}function bh(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0,I=0,J=0,K=0,L=0.0,M=0.0,N=0.0,O=0,P=0,Q=0.0,R=0,S=0,T=0,U=0;b=i;i=i+208|0;d=b+192|0;e=b+188|0;f=b+168|0;h=b+164|0;j=b+160|0;k=b+144|0;l=b+128|0;m=b+112|0;n=b+96|0;o=b+72|0;p=b+68|0;q=b+64|0;r=b+48|0;s=b+32|0;t=b+16|0;u=b;v=c[a+16>>2]|0;if((v|0)==1){yh(f);w=a+4|0;x=c[w>>2]|0;y=ti(c[(c[x+28>>2]|0)+8>>2]|0)|0;a:do{if((y|0)>0){z=a+8|0;A=a+12|0;B=f+4|0;C=x;D=0;while(1){E=ui(C,D)|0;bl(h,c[(c[E+4>>2]|0)+16>>2]|0);if(wka(c[h>>2]|0,z)|0){Ic[c[(c[E>>2]|0)+20>>2]&511](j,E);F=wka(c[j>>2]|0,A)|0;dka(j);dka(h);if(F){mh(B,E)}}else{dka(h)}E=D+1|0;if((E|0)>=(y|0)){G=B;break a}C=c[w>>2]|0;D=E}}else{G=f+4|0}}while(0);w=f+8|0;b:do{if((c[w>>2]|0)>0){nh(f,242,1);y=k+12|0;h=a+20|0;j=n+12|0;x=n+8|0;D=l+8|0;C=l+12|0;B=m+4|0;while(1){A=c[w>>2]|0;if((A|0)>0){H=0.0;I=A;J=-1}else{K=G;break b}while(1){I=I+ -1|0;kh(k,c[(oh(G,I)|0)+4>>2]|0);L=+g[y>>2];A=L>H;J=A?I:J;if((I|0)<=0){break}else{H=A?L:H}}if(!((J|0)>-1)){continue}A=oh(G,J)|0;kh(l,c[A+4>>2]|0);mh(h,A);Oja(G,J);Ija(m,4);A=c[w>>2]|0;if((A|0)>0){L=+g[D>>2];M=+g[C>>2];z=0;do{kh(n,c[(oh(G,z)|0)+4>>2]|0);N=(+g[j>>2]+ +g[x>>2])*.5;if(N>L&N<M){ph(m,z)|0}z=z+1|0}while((z|0)<(A|0))}A=c[B>>2]|0;if((A|0)>0){z=0;do{mh(h,c[(fh(G,c[(qh(m,z)|0)>>2]|0)|0)>>2]|0);z=z+1|0}while((z|0)<(A|0));O=c[B>>2]|0}else{O=A}while(1){z=O+ -1|0;if((O|0)<=0){break}Oja(G,c[(qh(m,z)|0)>>2]|0);O=z}Kja(m,0)|0;Jja(c[m>>2]|0)}}else{K=G}}while(0);Kja(K,0)|0;Jja(c[f+4>>2]|0);i=b;return}else if((v|0)==0){f=a+4|0;K=c[f>>2]|0;G=ti(c[(c[K+28>>2]|0)+8>>2]|0)|0;if((G|0)<=0){i=b;return}m=a+8|0;O=a+12|0;n=a+20|0;w=K;K=0;while(1){J=ui(w,K)|0;bl(d,c[(c[J+4>>2]|0)+16>>2]|0);if(wka(c[d>>2]|0,m)|0){Ic[c[(c[J>>2]|0)+20>>2]&511](e,J);l=wka(c[e>>2]|0,O)|0;dka(e);dka(d);if(l){mh(n,J)}}else{dka(d)}J=K+1|0;if((J|0)>=(G|0)){break}w=c[f>>2]|0;K=J}i=b;return}else if((v|0)==2){yh(o);v=a+4|0;K=c[v>>2]|0;f=ti(c[(c[K+28>>2]|0)+8>>2]|0)|0;c:do{if((f|0)>0){w=a+8|0;G=a+12|0;d=o+4|0;n=K;e=0;while(1){O=ui(n,e)|0;bl(p,c[(c[O+4>>2]|0)+16>>2]|0);if(wka(c[p>>2]|0,w)|0){Ic[c[(c[O>>2]|0)+20>>2]&511](q,O);m=wka(c[q>>2]|0,G)|0;dka(q);dka(p);if(m){mh(d,O)}}else{dka(p)}O=e+1|0;if((O|0)>=(f|0)){P=d;break c}n=c[v>>2]|0;e=O}}else{P=o+4|0}}while(0);v=o+8|0;d:do{if((c[v>>2]|0)>0){nh(o,243,0);f=a+20|0;p=u+4|0;q=s+4|0;K=t+4|0;while(1){e=c[v>>2]|0;if((e|0)>0){Q=-1.0;R=e;S=-1}else{T=P;break d}e:while(1){e=Q<0.0;n=R;while(1){d=n+ -1|0;if((n|0)<=0){break e}kh(r,c[(oh(P,d)|0)+4>>2]|0);H=+g[r>>2];if(e){Q=H;R=d;S=0;continue e}if(H<Q){Q=H;R=d;S=d;continue e}else{n=d}}}if(!((S|0)>-1)){continue}n=oh(P,S)|0;kh(s,c[n+4>>2]|0);mh(f,n);Oja(P,S);Ija(t,4);n=c[v>>2]|0;if((n|0)>0){H=+g[s>>2];M=+g[q>>2];e=0;do{kh(u,c[(oh(P,e)|0)+4>>2]|0);L=(+g[u>>2]+ +g[p>>2])*.5;if(L>H&L<M){ph(t,e)|0}e=e+1|0}while((e|0)<(n|0))}n=c[K>>2]|0;if((n|0)>0){e=0;do{mh(f,c[(fh(P,c[(qh(t,e)|0)>>2]|0)|0)>>2]|0);e=e+1|0}while((e|0)<(n|0));U=c[K>>2]|0}else{U=n}while(1){e=U+ -1|0;if((U|0)<=0){break}Oja(P,c[(qh(t,e)|0)>>2]|0);U=e}Kja(t,0)|0;Jja(c[t>>2]|0)}}else{T=P}}while(0);Kja(T,0)|0;Jja(c[o+4>>2]|0);i=b;return}else{i=b;return}}function ch(a){a=a|0;var b=0;b=i;dh(a);$1a(a);i=b;return}function dh(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=880;d=a+20|0;Kja(d,0)|0;Jja(c[d>>2]|0);dka(a+12|0);dka(a+8|0);i=b;return}function eh(a){a=a|0;var b=0,d=0;b=i;if((c[a+24>>2]|0)<=0){d=0;i=b;return d|0}d=c[(fh(a+20|0,0)|0)>>2]|0;i=b;return d|0}function fh(b,d){b=b|0;d=d|0;var e=0;e=i;if(!((d|0)>=0?(c[b+4>>2]|0)>(d|0):0)){a[0]=0;da()}i=e;return(c[b>>2]|0)+(d<<2)|0}function gh(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+24>>2]|0;if((d|0)<=0){e=0;i=b;return e|0}e=c[(fh(a+20|0,d+ -1|0)|0)>>2]|0;i=b;return e|0}function hh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=a+20|0;f=c[a+24>>2]|0;a=0;do{if((a|0)>=(f|0)){g=0;h=7;break}j=a;a=a+1|0}while((c[(fh(e,j)|0)>>2]|0)!=(b|0));if((h|0)==7){i=d;return g|0}if((a|0)<(f|0)){g=c[(fh(e,a)|0)>>2]|0;i=d;return g|0}else{g=c[(fh(e,0)|0)>>2]|0;i=d;return g|0}return 0}function ih(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=a+20|0;f=c[a+24>>2]|0;if((f|0)>0){g=0}else{h=0;i=d;return h|0}while(1){a=g+1|0;if((c[(fh(e,g)|0)>>2]|0)==(b|0)){break}if((a|0)<(f|0)){g=a}else{h=0;j=7;break}}if((j|0)==7){i=d;return h|0}if((g|0)>0){h=c[(fh(e,g+ -1|0)|0)>>2]|0;i=d;return h|0}else{h=c[(fh(e,f+ -1|0)|0)>>2]|0;i=d;return h|0}return 0}function jh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0.0,j=0.0,k=0;d=i;i=i+32|0;e=d+16|0;f=d;kh(e,c[a+4>>2]|0);kh(f,c[b+4>>2]|0);h=+g[e>>2];j=+g[f>>2];if(h<j){k=-1;i=d;return k|0}k=h>j&1;i=d;return k|0}function kh(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=Xk(b)|0;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;Ml(c[e+16>>2]|0,a);i=d;return}function lh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0.0,j=0.0,k=0;d=i;i=i+32|0;e=d+16|0;f=d;kh(e,c[a+4>>2]|0);kh(f,c[b+4>>2]|0);h=+g[e+12>>2];j=+g[f+12>>2];if(h<j){k=-1;i=d;return k|0}k=h>j&1;i=d;return k|0}function mh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+4|0;f=c[e>>2]|0;g=f+1|0;do{if((f|0)>=(c[a+8>>2]|0)){if((Kja(a,g)|0)==0){i=d;return}else{h=c[e>>2]|0;break}}else{c[e>>2]=g;h=g}}while(0);c[(c[a>>2]|0)+(h+ -1<<2)>>2]=b;i=d;return}function nh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;vh(a,0,(c[a+8>>2]|0)+ -1|0,d,b);i=e;return}function oh(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)>=0?(c[a+4>>2]|0)>(b|0):0){e=c[(c[a>>2]|0)+(b<<2)>>2]|0;i=d;return e|0}b=c[0]|0;da();e=b;i=d;return e|0}function ph(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=a+4|0;f=c[e>>2]|0;g=f+1|0;do{if((f|0)>=(c[a+8>>2]|0)){if((Kja(a,g)|0)==0){h=0;i=d;return h|0}else{j=c[e>>2]|0;break}}else{c[e>>2]=g;j=g}}while(0);c[(c[a>>2]|0)+(j+ -1<<2)>>2]=b;h=1;i=d;return h|0}function qh(b,d){b=b|0;d=d|0;var e=0;e=i;if(!((d|0)>=0?(c[b+4>>2]|0)>(d|0):0)){a[0]=0;da()}i=e;return(c[b>>2]|0)+(d<<2)|0}function rh(a){a=a|0;var b=0;b=i;Jja(c[a+4>>2]|0);i=b;return}function sh(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}Rc[c[(c[a>>2]|0)+4>>2]&1023](a);i=b;return}function th(a){a=a|0;return 5}function uh(a){a=a|0;return 2}function vh(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=i;g=a+4|0;h=(d|0)!=0;j=h^1;k=b;while(1){if(!(k>>>0<c>>>0)){l=19;break}b=c-k|0;if((b|0)==1){l=4;break}m=(b>>>1)+k|0;b=oh(g,m)|0;a:do{if(k>>>0<m>>>0){n=k;o=m;while(1){p=o;while(1){q=oh(g,n)|0;r=dd[e&511](q,b)|0;if(!(h&(r|0)>0|(r|0)<0&j)){break}xh(g,p+1|0,q);Oja(g,n);q=p+ -1|0;if(n>>>0<q>>>0){p=q}else{s=q;break a}}n=n+1|0;if(!(n>>>0<p>>>0)){s=p;break}else{o=p}}}else{s=m}}while(0);b:do{if(s>>>0<c>>>0){m=c;o=s;while(1){n=o;while(1){q=oh(g,m)|0;r=dd[e&511](q,b)|0;if(!(h&(r|0)<0|(r|0)>0&j)){break}Oja(g,m);xh(g,n,q);q=n+1|0;if(m>>>0>q>>>0){n=q}else{t=q;break b}}m=m+ -1|0;if(!(m>>>0>n>>>0)){t=n;break}else{o=n}}}else{t=s}}while(0);if(t>>>0>k>>>0){vh(a,k,t,d,e)}if(t>>>0<c>>>0){k=t}else{l=19;break}}if((l|0)==4){t=oh(g,k)|0;d=oh(g,c)|0;a=dd[e&511](t,d)|0;if(!(h&(a|0)>0|(a|0)<0&j)){i=f;return}wh(g,k,d);wh(g,c,t);i=f;return}else if((l|0)==19){i=f;return}}function wh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;if((b|0)>=0?(c[a+4>>2]|0)>(b|0):0){c[(c[a>>2]|0)+(b<<2)>>2]=d}i=e;return}function xh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;if((Nja(a,b)|0)==0){i=e;return}c[(c[a>>2]|0)+(b<<2)>>2]=d;i=e;return}function yh(a){a=a|0;var b=0;b=i;Ija(a+4|0,4);c[a>>2]=928;i=b;return}function zh(a){a=a|0;var b=0;b=i;Jja(c[a+4>>2]|0);v2a(a);i=b;return}function Ah(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[b>>2]|0;c[a>>2]=(d|0)==0?1292088:d+12|0;d=c[b>>2]|0;if((d|0)==0){e=0}else{e=c[d+4>>2]|0}c[a+4>>2]=e;return}function Bh(a){a=a|0;var b=0;b=i;Lna(a+32|0);Lna(a+16|0);Lna(a+12|0);i=b;return}function Ch(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)>=0?(c[a+4>>2]|0)>(b|0):0){e=c[(c[a>>2]|0)+(b<<2)>>2]|0;i=d;return e|0}b=c[0]|0;da();e=b;i=d;return e|0}function Dh(a){a=a|0;var b=0;b=i;c[a+4>>2]=0;c[a+8>>2]=0;Yma(a+12|0);c[a>>2]=6;i=b;return}function Eh(a,b){a=a|0;b=b|0;var d=0;d=i;Fh(c[(c[a+4>>2]|0)+12>>2]|0,b);i=d;return}function Fh(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((a|0)!=0?(e=c[a+16>>2]|0,(e|0)!=0):0){Ic[e&511](a,b)}i=d;return}function Gh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0;e=i;i=i+80|0;f=e+56|0;h=e+32|0;j=e+28|0;k=e+24|0;l=e+20|0;m=e+16|0;n=e;o=c[b+8>>2]|0;b=_k(o)|0;p=vl(o)|0;if((p|0)==0|(b|0)==0){i=e;return}c[f+0>>2]=c[b+0>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];c[f+16>>2]=c[b+16>>2];c[f+20>>2]=c[b+20>>2];g[h+12>>2]=1.0;g[h>>2]=1.0;g[h+20>>2]=0.0;g[h+16>>2]=0.0;g[h+8>>2]=0.0;g[h+4>>2]=0.0;Ula(h,f);q=+(c[d+4>>2]|0);g[j>>2]=+(c[d>>2]|0);g[k>>2]=q;fma(h,j,k);q=+(c[d+12>>2]|0);g[l>>2]=+(c[d+8>>2]|0);g[m>>2]=q;fma(h,l,m);q=+g[m>>2];r=+g[l>>2];s=+g[k>>2];g[n>>2]=+g[j>>2];j=n+8|0;g[j>>2]=q;k=n+4|0;g[k>>2]=r;l=n+12|0;g[l>>2]=s;Hla(n);Bg(c[(c[a+4>>2]|0)+12>>2]|0,p,+g[n>>2],+g[l>>2],+g[k>>2],+g[j>>2]);i=e;return}function Hh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0.0;e=i;i=i+32|0;f=e+24|0;h=e+16|0;j=e+8|0;k=e;if((b|0)==0){i=e;return}l=+g[d+8>>2];g[f>>2]=+g[d>>2];g[f+4>>2]=l;l=+g[d+12>>2];g[h>>2]=+g[d+4>>2];g[h+4>>2]=l;hR(j,b,f);hR(k,b,h);h=vl(c[(c[b+20>>2]|0)+8>>2]|0)|0;Ih(c[(c[a+4>>2]|0)+12>>2]|0,h,+g[j>>2],+g[k+4>>2],+g[k>>2],+g[j+4>>2]);i=e;return}function Ih(a,b,d,e,f,g){a=a|0;b=b|0;d=+d;e=+e;f=+f;g=+g;var h=0,j=0;h=i;if((a|0)!=0?(j=c[a+12>>2]|0,(j|0)!=0):0){Mc[j&0](a,b,d,e,f,g)}i=h;return}function Jh(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+4>>2]|0;if(((d|0)!=0?(a=c[d+12>>2]|0,(a|0)!=0):0)?(c[a+12>>2]|0)!=0:0){e=1;i=b;return e|0}e=0;i=b;return e|0}function Kh(a,b,c){a=a|0;b=b|0;c=c|0;c=i;eka(a,1305928,-1);i=c;return}function Lh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;i=i+16|0;a=b;e=c[(BGa()|0)+264>>2]|0;if((e|0)==0){f=0;i=b;return f|0}g=c[e>>2]|0;if((g|0)==0){f=0;i=b;return f|0}e=g+8|0;h=g+12|0;j=c[h>>2]|0;if((j|0)==0){_Ha(g);k=c[h>>2]|0}else{k=j}if((k|0)<=0){f=0;i=b;return f|0}j=a+4|0;h=0;while(1){g=Mh(e,h)|0;oe(a,d);h=h+1|0;if((Zka(c[g>>2]|0,c[a>>2]|0,c[j>>2]|0)|0)!=0){f=1;l=9;break}if((h|0)>=(k|0)){f=0;l=9;break}}if((l|0)==9){i=b;return f|0}return 0}function Mh(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((c[a+4>>2]|0)>(b|0)){e=Pja(a,b)|0;i=d;return e|0}else{_a(756992,1056,633,757056)}return 0}function Nh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;a=i;if((b|0)==0){e=0;i=a;return e|0}f=u2a(72)|0;eHa(f);g=d&255;if((g|0)==128){h=932}else if((g|0)==129){h=949}else if((g|0)==134){h=936}else if((g|0)==136){h=950}else{h=0}hHa(f,c,1,0,0,0,h,0);h=hu(b,f,g)|0;if((f|0)==0){e=h;i=a;return e|0}fHa(f);v2a(f);e=h;i=a;return e|0}function Oh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=Ph(c[(c[a+4>>2]|0)+12>>2]|0,b,d)|0;i=e;return f|0}function Ph(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;if((a|0)!=0?(f=c[a+20>>2]|0,(f|0)!=0):0){g=Qc[f&255](a,b,d)|0}else{g=-1}i=e;return g|0}function Qh(a,b){a=a|0;b=b|0;var d=0;d=i;Rh(c[(c[a+4>>2]|0)+12>>2]|0,b);i=d;return}function Rh(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((a|0)!=0?(e=c[a+24>>2]|0,(e|0)!=0):0){Ic[e&511](a,b)}i=d;return}function Sh(a,b){a=a|0;b=b|0;var d=0;d=i;Th(a,c[(c[b+4>>2]|0)+12>>2]|0);i=d;return}function Th(a,d){a=a|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;if((d|0)==0){i=e;return}g=c[d+28>>2]|0;if((g|0)==0){i=e;return}Ic[g&511](f,d);b[a+6>>1]=b[f+6>>1]|0;b[a+4>>1]=b[f+4>>1]|0;b[a+8>>1]=b[f+8>>1]|0;b[a+14>>1]=b[f+14>>1]|0;b[a+10>>1]=b[f+10>>1]|0;b[a+2>>1]=b[f+2>>1]|0;b[a+12>>1]=b[f+12>>1]|0;b[a>>1]=b[f>>1]|0;i=e;return}function Uh(a,b){a=a|0;b=b|0;var d=0;d=i;c[a>>2]=0;c[a+4>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=b;c[a+24>>2]=0;b=Z1a(12)|0;c[b>>2]=944;c[b+4>>2]=a;c[b+8>>2]=-1;c[a+28>>2]=b;i=d;return}function Vh(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+24|0;e=c[d>>2]|0;if((e|0)!=0){Rc[c[(c[e>>2]|0)+16>>2]&1023](e);c[d>>2]=0}d=a+28|0;e=c[d>>2]|0;if((e|0)!=0){Rc[c[(c[e>>2]|0)+4>>2]&1023](e);c[d>>2]=0}d=c[a>>2]|0;if((d|0)!=0){Rc[c[(c[d>>2]|0)+4>>2]&1023](d);c[a>>2]=0}d=a+4|0;a=c[d>>2]|0;if((a|0)==0){i=b;return}Rc[c[(c[a>>2]|0)+4>>2]&1023](a);c[d>>2]=0;i=b;return}function Wh(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;if((d|0)!=0){e=d;i=b;return e|0}d=Z1a(48)|0;vj(d,a);c[a>>2]=d;e=d;i=b;return e|0}function Xh(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+4|0;e=c[d>>2]|0;if((e|0)!=0){f=e;i=b;return f|0}e=Z1a(16)|0;Si(e,a);c[d>>2]=e;f=e;i=b;return f|0}function Yh(a,b){a=a|0;b=b|0;c[a+12>>2]=b;return}function Zh(a){a=a|0;return a|0}function _h(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+24|0;e=c[d>>2]|0;if((e|0)!=0){f=e;i=b;return f|0}e=Z1a(36)|0;RR(e,a);c[d>>2]=e;f=e;i=b;return f|0}function $h(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;zma(a,10);c[a+24>>2]=b;c[a+28>>2]=0;c[a+36>>2]=d;c[a+40>>2]=0;c[a+44>>2]=0;c[a+32>>2]=0;i=e;return}function ai(a){a=a|0;var b=0,d=0,e=0;b=i;Ama(a);d=a+28|0;e=c[d>>2]|0;if((e|0)!=0){Rc[c[(c[e>>2]|0)+44>>2]&1023](e);c[d>>2]=0}d=a+40|0;e=c[d>>2]|0;if((e|0)==0){Bma(a);i=b;return}Rc[c[(c[e>>2]|0)+4>>2]&1023](e);c[d>>2]=0;Bma(a);i=b;return}function bi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=Fma(a,b)|0;if((f|0)!=0|(d|0)==0){g=f;i=e;return g|0}f=Z1a(72)|0;pi(f,a,b);c[(Gma(a,b)|0)>>2]=f;ci(f);g=f;i=e;return g|0}function ci(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;d=c[(c[a+48>>2]|0)+36>>2]|0;e=xn()|0;yn(0);f=u2a(44)|0;Hl(f,c[a+24>>2]|0);g=a+28|0;c[g>>2]=f;yn(e);e=c[g>>2]|0;f=c[e+8>>2]|0;if((f|0)<=0){i=b;return}h=a+32|0;j=e;e=0;while(1){k=Ch(j+4|0,e)|0;ke(k);l=Wh(d)|0;if((l|0)!=0?(m=Qc[c[(c[l>>2]|0)+8>>2]&255](l,k,a)|0,(m|0)!=0):0){yg(h,m);Ic[c[(c[l>>2]|0)+20>>2]&511](l,m)}m=e+1|0;if((m|0)==(f|0)){break}j=c[g>>2]|0;e=m}i=b;return}function di(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d;c[e>>2]=0;f=ei(c[(c[a+36>>2]|0)+12>>2]|0,c[a+24>>2]|0,b)|0;if((f|0)==0){g=0;i=d;return g|0}fi(a,f,e);g=c[e>>2]|0;i=d;return g|0}function ei(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;if((a|0)!=0?(f=c[a+36>>2]|0,(f|0)!=0):0){g=Qc[f&255](a,b,d)|0}else{g=0}i=e;return g|0}function fi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;c[f>>2]=0;if((Dma(a,b,f)|0)==0){i=e;return}c[d>>2]=c[f>>2];i=e;return}function gi(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=Fma(a,b)|0;if((d|0)==0){i=c;return}qi(d);$1a(d);Jma(a,b);i=c;return}function hi(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+28|0;e=c[d>>2]|0;if((e|0)!=0){f=e;i=b;return f|0}e=u2a(96)|0;qg(e,a);c[d>>2]=e;f=e;i=b;return f|0}function ii(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;f=c[(c[a+48>>2]|0)+36>>2]|0;al(e,b);Bg(c[f+12>>2]|0,c[a+24>>2]|0,+g[e>>2],+g[e+12>>2],+g[e+4>>2],+g[e+8>>2]);i=d;return}function ji(a){a=a|0;return a|0}function ki(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=a+32|0;f=c[e>>2]|0;do{if((f|0)!=(b|0)){if((f|0)==0){if((b|0)==0){break}}else{if((li(a)|0)==0|(b|0)==0){break}}if(((((c[(_k(c[b+8>>2]|0)|0)+68>>2]|0)!=0?(g=Wh(c[a+36>>2]|0)|0,(g|0)!=0):0)?(c[e>>2]|0)==0:0)?(Qc[c[(c[g>>2]|0)+76>>2]&255](g,b,0)|0)!=0:0)?(c[e>>2]|0)==0:0){c[e>>2]=b}}}while(0);i=d;return}function li(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;i=i+16|0;d=b+8|0;e=b;f=a+32|0;do{if((c[f>>2]|0)!=0?(g=a+36|0,h=Wh(c[g>>2]|0)|0,(h|0)!=0):0){j=c[f>>2]|0;c[f>>2]=0;if((Qc[c[(c[h>>2]|0)+80>>2]&255](h,j,0)|0)==0){c[f>>2]=j;break}bl(d,c[(c[j+4>>2]|0)+16>>2]|0);c[e>>2]=669440;c[e+4>>2]=6;h=vka(c[d>>2]|0,e)|0;dka(d);if(h?((af(j)|0)&-3|0)==4:0){mi(c[(c[g>>2]|0)+12>>2]|0,0,0,0)}if((c[f>>2]|0)==0){k=1;i=b;return k|0}}}while(0);k=0;i=b;return k|0}function mi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;if((a|0)!=0?(g=c[a+52>>2]|0,(g|0)!=0):0){pd[g&127](a,b,d,e)}i=f;return}function ni(a,b){a=a|0;b=b|0;var c=0;c=i;oi(a,b);i=c;return}function oi(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+16|0;e=d+4|0;f=d;g=b+12|0;b=c[g>>2]|0;if(((b|0)!=0?(h=c[b+64>>2]|0,(h|0)!=0):0)?(b=c[h+16>>2]|0,(b|0)!=0):0){j=Qc[b&255](h,0,0)|0;if((j|0)<1){Mna(a,1292088,-1);i=d;return}h=_1a(j)|0;if((h|0)==0){Mna(a,1292088,-1);i=d;return}else{f3a(h|0,0,j|0)|0;b=c[(c[g>>2]|0)+64>>2]|0;eka(e,h,Qc[c[b+16>>2]&255](b,h,j)|0);j=c[e>>2]|0;moa(f,(j|0)==0?1305928:j+12|0);a2a(h);Ona(a,f);Lna(f);dka(e);i=d;return}}Mna(a,1292088,-1);i=d;return}function pi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0;e=i;g[a+12>>2]=1.0;g[a>>2]=1.0;g[a+20>>2]=0.0;g[a+16>>2]=0.0;g[a+8>>2]=0.0;g[a+4>>2]=0.0;c[a+24>>2]=d;f=a+32|0;Ija(f,4);c[a+48>>2]=b;h=hi(b)|0;if((h|0)!=0){b=Lc[c[(c[h>>2]|0)+48>>2]&255](h)|0;Mn(b,c[d>>2]|0)}Kja(f,0)|0;f=a+52|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;i=e;return}function qi(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;d=a+48|0;e=c[(c[d>>2]|0)+36>>2]|0;f=a+32|0;g=c[a+36>>2]|0;if((g|0)>0){h=0;do{j=Ch(f,h)|0;k=c[d>>2]|0;if((j|0)==(c[k+32>>2]|0)){li(k)|0}k=Wh(e)|0;Ic[c[(c[k>>2]|0)+12>>2]&511](k,j);h=h+1|0}while((h|0)<(g|0))}Kja(f,0)|0;g=a+28|0;a=c[g>>2]|0;if((a|0)==0){l=c[f>>2]|0;Jja(l);i=b;return}Jl(a);v2a(a);c[g>>2]=0;l=c[f>>2]|0;Jja(l);i=b;return}function ri(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+48|0;f=e+8|0;g=e;c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];c[a+16>>2]=c[d+16>>2];c[a+20>>2]=c[d+20>>2];h=c[(c[a+48>>2]|0)+36>>2]|0;tk(f,a,1,0,0,0);c[g>>2]=-1;while(1){j=Ak(f,g)|0;if((j|0)==0){break}k=Wh(h)|0;Tc[c[(c[k>>2]|0)+24>>2]&31](k,a,j,b,d,0)}c[f>>2]=1312;Jja(c[f+4>>2]|0);i=e;return}function si(a){a=a|0;var b=0;if((a|0)==0){b=0}else{b=c[a+8>>2]|0}return b|0}function ti(a){a=a|0;return a|0}function ui(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if(!((b|0)>-1?(c[a+36>>2]|0)>(b|0):0)){e=0;i=d;return e|0}e=Ch(a+32|0,b)|0;i=d;return e|0}function vi(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=a+32|0;f=c[a+36>>2]|0;if((f|0)>0){g=0}else{h=0;i=d;return h|0}while(1){a=Ch(e,g)|0;g=g+1|0;if((c[(Xk(c[a+4>>2]|0)|0)+16>>2]|0)==(b|0)){h=a;j=4;break}if((g|0)>=(f|0)){h=0;j=4;break}}if((j|0)==4){i=d;return h|0}return 0}function wi(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=c[(c[a+48>>2]|0)+32>>2]|0;a:do{if((d|0)!=0?(e=a+32|0,f=a+36|0,(c[f>>2]|0)>0):0){g=0;while(1){if((Ch(e,g)|0)==(d|0)){h=d;break a}g=g+1|0;if((g|0)>=(c[f>>2]|0)){h=0;break}}}else{h=0}}while(0);i=b;return h|0}function xi(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;a:do{if((b|0)!=0?(e=a+28|0,f=c[e>>2]|0,g=c[f+8>>2]|0,(g|0)>0):0){h=f;f=0;while(1){j=f+1|0;if((Ch(h+4|0,f)|0)==(b|0)){k=1;break a}if((j|0)>=(g|0)){k=0;break a}h=c[e>>2]|0;f=j}}else{k=0}}while(0);i=d;return k|0}function yi(a){a=a|0;return}function zi(a){a=a|0;var b=0;b=i;$1a(a);i=b;return}function Ai(a,b,c){a=a|0;b=b|0;c=c|0;c=i;Mna(a,1292088,-1);i=c;return}function Bi(a,b,c){a=a|0;b=b|0;c=c|0;return 0}function Ci(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return}function Di(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return}function Ei(a){a=a|0;return 0}function Fi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return 0}function Gi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return 0}function Hi(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return-1}function Ii(a,b){a=a|0;b=b|0;return}function Ji(a,b){a=a|0;b=b|0;return b&1|0}function Ki(a,b){a=a|0;b=b|0;return b>>>1&1|0}function Li(a,b){a=a|0;b=b|0;return b>>>2&1|0}function Mi(a,b){a=a|0;b=b|0;return 0}function Ni(a){a=a|0;return c[a+8>>2]|0}function Oi(a,b){a=a|0;b=b|0;c[a+8>>2]=b;return}function Pi(a){a=a|0;return c[a+8>>2]|0}function Qi(a){a=a|0;var b=0;b=i;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;i=b;return}function Ri(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a+8>>2]|0;if((d|0)!=0){zM(d);v2a(d)}d=c[a+4>>2]|0;if((d|0)!=0){uM(d);v2a(d)}d=c[a>>2]|0;if((d|0)!=0){Rc[c[(c[d>>2]|0)+4>>2]&1023](d)}d=c[a+12>>2]|0;if((d|0)!=0){Jl(d);v2a(d)}d=a+16|0;a=c[d>>2]|0;e=c[a+24>>2]|0;if((e|0)==0){f=a}else{Rc[c[(c[e>>2]|0)+4>>2]&1023](e);f=c[d>>2]|0}if((f|0)==0){i=b;return}v2a(f);i=b;return}function Si(a,b){a=a|0;b=b|0;var d=0;d=i;c[a>>2]=1136;c[a+4>>2]=b;c[a+12>>2]=0;c[a+8>>2]=Z1a(1)|0;i=d;return}function Ti(a){a=a|0;var b=0;b=i;Ui(a);$1a(a);i=b;return}function Ui(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=1136;d=a+8|0;a=c[d>>2]|0;if((a|0)==0){i=b;return}$1a(a);c[d>>2]=0;i=b;return}function Vi(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}Rc[c[(c[a>>2]|0)+4>>2]&1023](a);i=b;return}function Wi(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=i;i=i+32|0;e=d;tma(e,10);f=Xi(a,b,c,e)|0;xma(e);i=d;return f|0}function Xi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;g=f;h=c[b>>2]|0;if((yma(e,h)|0)!=0){j=0;i=f;return j|0}uma(e,h);if((zl(c[b>>2]|0)|0)!=14){jj(a,b,d)}h=Dl(b)|0;if((h|0)>0){k=0}else{j=1;i=f;return j|0}while(1){El(g,b,k);k=k+1|0;if((Xi(a,g,d,e)|0)==0){j=0;l=7;break}if((k|0)>=(h|0)){j=1;l=7;break}}if((l|0)==7){i=f;return j|0}return 0}function Yi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=i;zl(c[b>>2]|0)|0;i=e;return 0}function Zi(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return 0}function _i(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;c=i;i=i+32|0;e=c;tma(e,10);f=$i(a,b,d,e)|0;xma(e);i=c;return f|0}function $i(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;g=f;h=c[b>>2]|0;if((yma(e,h)|0)!=0){j=0;i=f;return j|0}uma(e,h);if((zl(c[b>>2]|0)|0)!=14){jj(a,b,d)}h=Dl(b)|0;if((h|0)>0){k=0}else{j=1;i=f;return j|0}while(1){El(g,b,k);k=k+1|0;if(($i(a,g,d,e)|0)==0){j=0;l=7;break}if((k|0)>=(h|0)){j=1;l=7;break}}if((l|0)==7){i=f;return j|0}return 0}function aj(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;c=i;i=i+32|0;e=c;tma(e,10);f=$i(a,b,d,e)|0;xma(e);i=c;return f|0}function bj(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;d=i;i=i+32|0;b=d;tma(b,10);f=cj(a,c,e,b)|0;xma(b);i=d;return f|0}function cj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;g=f;h=c[b>>2]|0;if((yma(e,h)|0)!=0){j=0;i=f;return j|0}uma(e,h);if((zl(c[b>>2]|0)|0)!=14){jj(a,b,d)}h=Dl(b)|0;if((h|0)>0){k=0}else{j=1;i=f;return j|0}while(1){El(g,b,k);k=k+1|0;if((cj(a,g,d,e)|0)==0){j=0;l=7;break}if((k|0)>=(h|0)){j=1;l=7;break}}if((l|0)==7){i=f;return j|0}return 0}function dj(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;e=i;i=i+32|0;c=e;tma(c,10);f=ej(a,b,d,c)|0;xma(c);i=e;return f|0}function ej(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;g=f;h=c[b>>2]|0;if((yma(e,h)|0)!=0){j=0;i=f;return j|0}uma(e,h);if((zl(c[b>>2]|0)|0)!=14){jj(a,b,d)}h=Dl(b)|0;if((h|0)>0){k=0}else{j=1;i=f;return j|0}while(1){El(g,b,k);k=k+1|0;if((ej(a,g,d,e)|0)==0){j=0;l=7;break}if((k|0)>=(h|0)){j=1;l=7;break}}if((l|0)==7){i=f;return j|0}return 0}function fj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=i;i=i+32|0;e=d;tma(e,10);f=gj(a,b,c,e)|0;xma(e);i=d;return f|0}function gj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;g=f;h=c[b>>2]|0;if((yma(e,h)|0)!=0){j=0;i=f;return j|0}uma(e,h);if((zl(c[b>>2]|0)|0)!=14){jj(a,b,d)}h=Dl(b)|0;if((h|0)>0){k=0}else{j=1;i=f;return j|0}while(1){El(g,b,k);k=k+1|0;if((gj(a,g,d,e)|0)==0){j=0;l=7;break}if((k|0)>=(h|0)){j=1;l=7;break}}if((l|0)==7){i=f;return j|0}return 0}function hj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;f=i;i=i+32|0;e=f;tma(e,10);c=ij(a,b,d,e)|0;xma(e);i=f;return c|0}function ij(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;g=f;h=c[b>>2]|0;if((yma(e,h)|0)!=0){j=0;i=f;return j|0}uma(e,h);if((zl(c[b>>2]|0)|0)!=14){jj(a,b,d)}h=Dl(b)|0;if((h|0)>0){k=0}else{j=1;i=f;return j|0}while(1){El(g,b,k);k=k+1|0;if((ij(a,g,d,e)|0)==0){j=0;l=7;break}if((k|0)>=(h|0)){j=1;l=7;break}}if((l|0)==7){i=f;return j|0}return 0}function jj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;switch(zl(c[b>>2]|0)|0){case 12:{if((c[a+8>>2]|0)==0){i=e;return}pj(b,d);i=e;return};case 9:{if((c[a+8>>2]|0)==0){i=e;return}mj(b,d);i=e;return};case 6:{lj(c[d+24>>2]|0,c[d+36>>2]|0,b);i=e;return};case 1:{kj(c[d+24>>2]|0,c[d+36>>2]|0,b);i=e;return};case 13:{if((c[a+8>>2]|0)==0){i=e;return}qj(b,d);i=e;return};case 11:{if((c[a+8>>2]|0)==0){i=e;return}oj(b,d);i=e;return};case 10:{nj(d,c[b>>2]|0);i=e;return};default:{i=e;return}}}function kj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;i=i+16|0;f=e;xl(f,d,a);d=c[f>>2]|0;f=Zm(d,a)|0;a=_m(d)|0;if((d|0)==0){rj(c[b+12>>2]|0,f,a,0,0);i=e;return}h=d+16|0;j=c[h>>2]|0;k=_1a(j>>>0>1073741823?-1:j<<2)|0;if((c[h>>2]|0)>2){l=2;m=0}else{n=0;o=b+12|0;p=c[o>>2]|0;rj(p,f,a,k,n);a2a(k);i=e;return}while(1){j=m+1|0;g[k+(m<<2)>>2]=+DH(d,l);l=l+1|0;if((l|0)>=(c[h>>2]|0)){n=j;break}else{m=j}}o=b+12|0;p=c[o>>2]|0;rj(p,f,a,k,n);a2a(k);i=e;return}function lj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;Bl(f,d,a);a=c[f>>2]|0;sj(c[b+12>>2]|0,(a|0)==0?1305928:a+12|0);dka(f);i=e;return}function mj(a,b){a=a|0;b=b|0;var d=0;d=i;if((Eg(hi(b)|0,a)|0)==0){i=d;return}c[b+44>>2]=1;i=d;return}function nj(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;tj(e,b);b=c[e>>2]|0;uj(c[(c[a+36>>2]|0)+12>>2]|0,(b|0)==0?1305928:b+12|0);dka(e);i=d;return}function oj(a,b){a=a|0;b=b|0;var c=0;c=i;Ig(hi(b)|0,a);i=c;return}function pj(a,b){a=a|0;b=b|0;var c=0;c=i;Og(hi(b)|0,a)|0;i=c;return}function qj(a,b){a=a|0;b=b|0;var c=0;c=i;hi(b)|0;Pg(a);i=c;return}function rj(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=i;if((a|0)==0){i=g;return}h=c[a+60>>2]|0;if((h|0)==0){i=g;return}Fc[h&63](a,b,d,e,f);i=g;return}function sj(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((a|0)!=0?(e=c[a+56>>2]|0,(e|0)!=0):0){Ic[e&511](a,b)}i=d;return}function tj(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;i=i+16|0;d=c;pe(d,1274672);aI(a,b,d);i=c;return}function uj(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((a|0)!=0?(e=c[a+48>>2]|0,(e|0)!=0):0){Ic[e&511](a,b)}i=d;return}function vj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;c[a>>2]=1192;Ija(a+4|0,4);Lma(a+20|0,10);c[a+44>>2]=b;e=Z1a(12)|0;c[e>>2]=1344;c[e+4>>2]=b;f=e+8|0;c[f>>2]=0;c[f>>2]=_h(b)|0;wj(a,e);i=d;return}function wj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d+8|0;f=d;Aj(a+4|0,b);Ic[c[(c[b>>2]|0)+8>>2]&511](f,b);oe(e,f);c[(Qma(a+20|0,e)|0)>>2]=b;dka(f);i=d;return}function xj(a){a=a|0;var b=0;b=i;yj(a);$1a(a);i=b;return}function yj(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;c[a>>2]=1192;d=a+4|0;e=a+8|0;if((c[e>>2]|0)>0){f=0;do{g=zj(d,f)|0;if((g|0)!=0){Rc[c[(c[g>>2]|0)+4>>2]&1023](g)}f=f+1|0}while((f|0)<(c[e>>2]|0))}Kja(d,0)|0;e=a+20|0;Mma(e);Nma(e);Jja(c[d>>2]|0);i=b;return}function zj(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)>=0?(c[a+4>>2]|0)>(b|0):0){e=c[(c[a>>2]|0)+(b<<2)>>2]|0;i=d;return e|0}b=c[0]|0;da();e=b;i=d;return e|0}function Aj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+4|0;f=c[e>>2]|0;g=f+1|0;do{if((f|0)>=(c[a+8>>2]|0)){if((Kja(a,g)|0)==0){i=d;return}else{h=c[e>>2]|0;break}}else{c[e>>2]=g;h=g}}while(0);c[(c[a>>2]|0)+(h+ -1<<2)>>2]=b;i=d;return}function Bj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e;Ll(f,c[b+16>>2]|0);g=Cj(a,f)|0;dka(f);if((g|0)==0){f=Z1a(20)|0;Uk(f,b,d);h=f;i=e;return h|0}else{h=Qc[c[(c[g>>2]|0)+20>>2]&255](g,b,d)|0;i=e;return h|0}return 0}function Cj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d+8|0;f=d;c[e>>2]=0;oe(f,b);Wma(a+20|0,f,e)|0;i=d;return c[e>>2]|0}function Dj(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=Ej(a,c[b+4>>2]|0)|0;if((e|0)==0){Rc[c[(c[b>>2]|0)+4>>2]&1023](b);i=d;return}else{Ic[c[(c[e>>2]|0)+60>>2]&511](e,b);Ic[c[(c[e>>2]|0)+24>>2]&511](e,b);i=d;return}}function Ej(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;Ll(e,c[(Xk(b)|0)+16>>2]|0);b=Cj(a,e)|0;dka(e);i=d;return b|0}function Fj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+48|0;e=d+24|0;f=d+16|0;g=d+8|0;h=d;j=b+4|0;k=Xk(c[j>>2]|0)|0;Rk(e);l=k+16|0;k=c[l>>2]|0;pe(f,22800);Tk(g,e);uI(k,f,g);dka(g);g=c[l>>2]|0;pe(h,37048);wI(g,h,0.0);h=Ej(a,c[j>>2]|0)|0;if((h|0)==0){i=d;return}Ic[c[(c[h>>2]|0)+48>>2]&511](h,b);i=d;return}function Gj(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=Ej(a,c[b+4>>2]|0)|0;if((e|0)==0){i=d;return}Ic[c[(c[e>>2]|0)+52>>2]&511](e,b);i=d;return}function Hj(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0;h=i;j=d+4|0;k=Ej(a,c[j>>2]|0)|0;if((k|0)==0){el(c[j>>2]|0,c[(c[d+8>>2]|0)+24>>2]|0,e,f,0);i=h;return}else{Tc[c[(c[k>>2]|0)+40>>2]&31](k,b,d,e,f,g);i=h;return}}function Ij(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;h=Ej(a,c[d+4>>2]|0)|0;if((h|0)==0){j=0;i=g;return j|0}j=ed[c[(c[h>>2]|0)+72>>2]&127](h,b,d,e,f)|0;i=g;return j|0}function Jj(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;h=Ej(a,c[d+4>>2]|0)|0;if((h|0)==0){j=0;i=g;return j|0}j=ed[c[(c[h>>2]|0)+76>>2]&127](h,b,d,e,f)|0;i=g;return j|0}function Kj(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;h=Ej(a,c[d+4>>2]|0)|0;if((h|0)==0){j=0;i=g;return j|0}j=ed[c[(c[h>>2]|0)+80>>2]&127](h,b,d,e,f)|0;i=g;return j|0}function Lj(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;h=Ej(a,c[d+4>>2]|0)|0;if((h|0)==0){j=0;i=g;return j|0}j=ed[c[(c[h>>2]|0)+84>>2]&127](h,b,d,e,f)|0;i=g;return j|0}function Mj(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0;h=i;j=Ej(a,c[d+4>>2]|0)|0;if((j|0)==0){k=0;i=h;return k|0}k=Wc[c[(c[j>>2]|0)+88>>2]&31](j,b,d,e,f,g)|0;i=h;return k|0}function Nj(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;h=Ej(a,c[d+4>>2]|0)|0;if((h|0)==0){j=0;i=g;return j|0}j=ed[c[(c[h>>2]|0)+92>>2]&127](h,b,d,e,f)|0;i=g;return j|0}function Oj(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;h=Ej(a,c[d+4>>2]|0)|0;if((h|0)==0){j=0;i=g;return j|0}j=ed[c[(c[h>>2]|0)+96>>2]&127](h,b,d,e,f)|0;i=g;return j|0}function Pj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;g=Ej(a,c[d+4>>2]|0)|0;if((g|0)==0){i=f;return}pd[c[(c[g>>2]|0)+64>>2]&127](g,b,d,e);i=f;return}function Qj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;g=Ej(a,c[d+4>>2]|0)|0;if((g|0)==0){i=f;return}pd[c[(c[g>>2]|0)+68>>2]&127](g,b,d,e);i=f;return}function Rj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;g=Ej(a,c[b+4>>2]|0)|0;if((g|0)==0){h=0;i=f;return h|0}h=id[c[(c[g>>2]|0)+104>>2]&511](g,b,d,e)|0;i=f;return h|0}function Sj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;if(((e&6|0)==0?(g=_k(c[b+8>>2]|0)|0,h=wi(g)|0,(h|0)!=0&(d|0)==9):0)?(j=Tj(h,e&1^1)|0,!((j|0)==0|(j|0)==(h|0))):0){ki(c[g+48>>2]|0,j);k=1;i=f;return k|0}j=Ej(a,c[b+4>>2]|0)|0;if((j|0)==0){k=0;i=f;return k|0}k=id[c[(c[j>>2]|0)+108>>2]&511](j,b,d,e)|0;i=f;return k|0}function Tj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+48|0;e=d+8|0;f=d+4|0;g=d;h=c[a+8>>2]|0;eka(f,669440,-1);eka(g,1305928,-1);$g(e,_k(h)|0,f,g);dka(g);dka(f);if((b|0)==0){j=ih(e,a)|0;dh(e);i=d;return j|0}else{j=hh(e,a)|0;dh(e);i=d;return j|0}return 0}function Uj(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return 0}function Vj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=Ej(a,c[b+4>>2]|0)|0;if((f|0)==0){i=e;return 0}else{a=(Qc[c[(c[f>>2]|0)+124>>2]&255](f,b,d)|0)==0;i=e;return(a?0:1)|0}return 0}function Wj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=Ej(a,c[b+4>>2]|0)|0;if((f|0)==0){g=0;i=e;return g|0}g=(Qc[c[(c[f>>2]|0)+128>>2]&255](f,b,d)|0)!=0&1;i=e;return g|0}function Xj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;g=Ej(b,c[e+4>>2]|0)|0;if((g|0)==0){al(a,e);i=f;return}else{pd[c[(c[g>>2]|0)+32>>2]&127](a,g,d,e);i=f;return}}function Yj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;g=Ej(a,c[d+4>>2]|0)|0;if((g|0)==0){h=0;i=f;return h|0}if((dd[c[(c[g>>2]|0)+16>>2]&511](g,d)|0)==0){h=0;i=f;return h|0}h=id[c[(c[g>>2]|0)+36>>2]&511](g,b,d,e)|0;i=f;return h|0}function Zj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;a=i;i=i+16|0;d=a;Ic[c[(c[b>>2]|0)+20>>2]&511](d,b);if((!(ah(d,1288)|0)?(ql(c[(c[b+4>>2]|0)+16>>2]|0)|0)!=0:0)?((cf(b)|0)&1|0)==0:0){if((af(b)|0)==1){e=1}else{f=XG(c[(vl(c[b+8>>2]|0)|0)+8>>2]|0)|0;if((f&256|0)==0){g=(f&32|0)!=0}else{g=1}e=g&1}}else{e=0}dka(d);i=a;return e|0}function _j(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=hi(Zh(c[(c[a+4>>2]|0)+16>>2]|0)|0)|0;a=Lc[c[(c[f>>2]|0)+48>>2]&255](f)|0;g=ff(a,c[b+16>>2]|0)|0;if((g|0)==0){h=0;i=e;return h|0}a=Z1a(36)|0;Ye(a,b,d,f);zg(f,g,a);g=Lc[c[(c[f>>2]|0)+48>>2]&255](f)|0;if((g|0)==0){h=a;i=e;return h|0}if((Fn(c[g+24>>2]|0)|0)==0){h=a;i=e;return h|0}Df(a,0,0);h=a;i=e;return h|0}function $j(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[a+8>>2]|0;if((e|0)!=0){Ic[c[(c[e>>2]|0)+40>>2]&511](e,b)}e=c[b+20>>2]|0;Ag(e,ef(b)|0);if((b|0)==0){i=d;return}Rc[c[(c[b>>2]|0)+4>>2]&1023](b);i=d;return}function ak(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0;h=i;i=i+16|0;j=h;Ic[c[(c[d>>2]|0)+20>>2]&511](j,d);if(ah(j,1288)|0){el(c[d+4>>2]|0,c[(c[d+8>>2]|0)+24>>2]|0,e,f,0);dka(j);i=h;return}k=c[a+8>>2]|0;if((k|0)==0){dka(j);i=h;return}Tc[c[(c[k>>2]|0)+28>>2]&31](k,b,d,e,f,g);dka(j);i=h;return}function bk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;i=i+16|0;g=f;Ic[c[(c[d>>2]|0)+20>>2]&511](g,d);if(!(ah(g,1288)|0)?(h=c[a+8>>2]|0,(h|0)!=0):0){pd[c[(c[h>>2]|0)+44>>2]&127](h,b,d,e)}dka(g);i=f;return}function ck(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;i=i+16|0;g=f;Ic[c[(c[d>>2]|0)+20>>2]&511](g,d);if(!(ah(g,1288)|0)?(h=c[a+8>>2]|0,(h|0)!=0):0){pd[c[(c[h>>2]|0)+48>>2]&127](h,b,d,e)}dka(g);i=f;return}function dk(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;i=i+16|0;h=g;Ic[c[(c[d>>2]|0)+20>>2]&511](h,d);if(!(ah(h,1288)|0)?(j=c[a+8>>2]|0,(j|0)!=0):0){k=ed[c[(c[j>>2]|0)+52>>2]&127](j,b,d,e,f)|0}else{k=0}dka(h);i=g;return k|0}function ek(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;i=i+16|0;h=g;Ic[c[(c[d>>2]|0)+20>>2]&511](h,d);if(!(ah(h,1288)|0)?(j=c[a+8>>2]|0,(j|0)!=0):0){k=ed[c[(c[j>>2]|0)+56>>2]&127](j,b,d,e,f)|0}else{k=0}dka(h);i=g;return k|0}function fk(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;i=i+16|0;h=g;Ic[c[(c[d>>2]|0)+20>>2]&511](h,d);if(!(ah(h,1288)|0)?(j=c[a+8>>2]|0,(j|0)!=0):0){k=ed[c[(c[j>>2]|0)+60>>2]&127](j,b,d,e,f)|0}else{k=0}dka(h);i=g;return k|0}function gk(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;i=i+16|0;h=g;Ic[c[(c[d>>2]|0)+20>>2]&511](h,d);if(!(ah(h,1288)|0)?(j=c[a+8>>2]|0,(j|0)!=0):0){k=ed[c[(c[j>>2]|0)+64>>2]&127](j,b,d,e,f)|0}else{k=0}dka(h);i=g;return k|0}function hk(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0;h=i;i=i+16|0;j=h;Ic[c[(c[d>>2]|0)+20>>2]&511](j,d);if(!(ah(j,1288)|0)?(k=c[a+8>>2]|0,(k|0)!=0):0){l=Wc[c[(c[k>>2]|0)+68>>2]&31](k,b,d,e,f,g)|0}else{l=0}dka(j);i=h;return l|0}function ik(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;i=i+16|0;h=g;Ic[c[(c[d>>2]|0)+20>>2]&511](h,d);if(!(ah(h,1288)|0)?(j=c[a+8>>2]|0,(j|0)!=0):0){k=ed[c[(c[j>>2]|0)+72>>2]&127](j,b,d,e,f)|0}else{k=0}dka(h);i=g;return k|0}function jk(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;i=i+16|0;h=g;Ic[c[(c[d>>2]|0)+20>>2]&511](h,d);if(!(ah(h,1288)|0)?(j=c[a+8>>2]|0,(j|0)!=0):0){k=ed[c[(c[j>>2]|0)+76>>2]&127](j,b,d,e,f)|0}else{k=0}dka(h);i=g;return k|0}function kk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;i=i+16|0;g=f;Ic[c[(c[b>>2]|0)+20>>2]&511](g,b);if(!(ah(g,1288)|0)?(h=c[a+8>>2]|0,(h|0)!=0):0){j=id[c[(c[h>>2]|0)+88>>2]&511](h,b,d,e)|0}else{j=0}dka(g);i=f;return j|0}function lk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;i=i+16|0;g=f;Ic[c[(c[b>>2]|0)+20>>2]&511](g,b);if(!(ah(g,1288)|0)?(h=c[a+8>>2]|0,(h|0)!=0):0){j=id[c[(c[h>>2]|0)+84>>2]&511](h,b,d,e)|0}else{j=0}dka(g);i=f;return j|0}function mk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return 0}function nk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;Ic[c[(c[b>>2]|0)+20>>2]&511](e,b);if(!(ah(e,1288)|0)?(f=c[a+8>>2]|0,(f|0)!=0):0){Ic[c[(c[f>>2]|0)+32>>2]&511](f,b)}dka(e);i=d;return}function ok(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;Ic[c[(c[b>>2]|0)+20>>2]&511](e,b);if(ah(e,1288)|0){dka(e);i=d;return}if((fl(c[(c[b+4>>2]|0)+16>>2]|0)|0)==0){Df(b,0,0)}if(((af(b)|0)&-3|0)==4){Kf(b)}f=c[a+8>>2]|0;if((f|0)==0){dka(e);i=d;return}Ic[c[(c[f>>2]|0)+36>>2]&511](f,b);dka(e);i=d;return}function pk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e;Ic[c[(c[b>>2]|0)+20>>2]&511](f,b);if(!(ah(f,1288)|0)?(g=c[a+8>>2]|0,(g|0)!=0):0){h=Qc[c[(c[g>>2]|0)+100>>2]&255](g,b,d)|0}else{h=1}dka(f);i=e;return h|0}function qk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e;Ic[c[(c[b>>2]|0)+20>>2]&511](f,b);if(!(ah(f,1288)|0)?(g=c[a+8>>2]|0,(g|0)!=0):0){h=Qc[c[(c[g>>2]|0)+104>>2]&255](g,b,d)|0}else{h=1}dka(f);i=e;return h|0}function rk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;i=i+32|0;g=f+16|0;h=f;Ic[c[(c[e>>2]|0)+20>>2]&511](g,e);if(!(ah(g,1288)|0)?(j=c[b+8>>2]|0,(j|0)!=0):0){pd[c[(c[j>>2]|0)+24>>2]&127](h,j,d,e);Gla(a,h);dka(g);i=f;return}c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;dka(g);i=f;return}function sk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0;f=i;i=i+16|0;h=f;pd[c[(c[a>>2]|0)+32>>2]&127](h,a,b,d);d=Qla(h,+g[e>>2],+g[e+4>>2])|0;i=f;return d|0}function tk(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0;h=i;c[a>>2]=1312;j=a+4|0;Ija(j,4);c[a+20>>2]=d;c[a+24>>2]=e;c[a+28>>2]=f;Kja(j,0)|0;Qc[c[(c[a>>2]|0)+20>>2]&255](a,b,g)|0;i=h;return}function uk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+16|0;e=d;c[e>>2]=-1;f=a+4|0;g=c[a+8>>2]|0;a:do{if((b|0)!=0&(g|0)>0){h=0;while(1){j=h+1|0;if((Ch(f,h)|0)==(b|0)){break}if((j|0)<(g|0)){h=j}else{break a}}c[e>>2]=h}}while(0);g=vk(a,e)|0;i=d;return g|0}function vk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;e=a+4|0;f=c[a+8>>2]|0;if((f|0)<1){c[b>>2]=-1;g=0;i=d;return g|0}h=c[b>>2]|0;if((h|0)>=0){j=(h|0)<(f+ -1|0);f=h+1|0;if((c[a+28>>2]|0)==0){k=j?f:-1}else{k=j?f:0}c[b>>2]=k;if((k|0)<0){g=0;i=d;return g|0}else{l=k}}else{c[b>>2]=0;l=0}g=Ch(e,l)|0;i=d;return g|0}function wk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+16|0;e=d;c[e>>2]=-1;f=a+4|0;g=c[a+8>>2]|0;a:do{if((b|0)!=0&(g|0)>0){h=0;while(1){j=h+1|0;if((Ch(f,h)|0)==(b|0)){break}if((j|0)<(g|0)){h=j}else{break a}}c[e>>2]=h}}while(0);g=xk(a,e)|0;i=d;return g|0}function xk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;e=a+4|0;f=c[a+8>>2]|0;if((f|0)<1){c[b>>2]=-1;g=0;i=d;return g|0}h=c[b>>2]|0;do{if((h|0)>=0){j=(h|0)>0;if((c[a+28>>2]|0)==0){k=j?h+ -1|0:-1;c[b>>2]=k;l=k;break}else{k=(j?h:f)+ -1|0;c[b>>2]=k;l=k;break}}else{k=f+ -1|0;c[b>>2]=k;l=k}}while(0);if((l|0)<0){g=0;i=d;return g|0}g=Ch(e,l)|0;i=d;return g|0}function yk(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((c[a+20>>2]|0)==0){e=uk(a,b)|0;i=d;return e|0}else{e=wk(a,b)|0;i=d;return e|0}return 0}function zk(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((c[a+20>>2]|0)==0){e=wk(a,b)|0;i=d;return e|0}else{e=uk(a,b)|0;i=d;return e|0}return 0}function Ak(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((c[a+20>>2]|0)==0){e=vk(a,b)|0;i=d;return e|0}else{e=xk(a,b)|0;i=d;return e|0}return 0}function Bk(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((c[a+20>>2]|0)==0){e=xk(a,b)|0;i=d;return e|0}else{e=vk(a,b)|0;i=d;return e|0}return 0}function Ck(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=a+4|0;if((c[d>>2]|0)>1){e=1}else{i=b;return}do{f=c[(Hg(a,e)|0)>>2]|0;g=e+ -1|0;if((Dk(f,c[(Hg(a,g)|0)>>2]|0)|0)<0){f=c[(Hg(a,e)|0)>>2]|0;h=g;while(1){g=c[(Hg(a,h)|0)>>2]|0;c[(Hg(a,h+1|0)|0)>>2]=g;g=h+ -1|0;if((h|0)<=0){break}if((Dk(f,c[(Hg(a,g)|0)>>2]|0)|0)<0){h=g}else{break}}c[(Hg(a,h)|0)>>2]=f}e=e+1|0}while((e|0)<(c[d>>2]|0));i=b;return}function Dk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=Lc[c[(c[a>>2]|0)+16>>2]&255](a)|0;if((e|0)<(Lc[c[(c[b>>2]|0)+16>>2]&255](b)|0)){f=-1;i=d;return f|0}e=Lc[c[(c[a>>2]|0)+16>>2]&255](a)|0;f=(e|0)!=(Lc[c[(c[b>>2]|0)+16>>2]&255](b)|0)&1;i=d;return f|0}function Ek(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;f=(d|0)==0?b+32|0:d;d=a+4|0;Kja(d,0)|0;if((c[a+24>>2]|0)==0){g=wi(b)|0}else{g=0}b=c[f+4>>2]|0;a=(b|0)>0;if(a){h=b;do{h=h+ -1|0;yg(d,Ch(f,h)|0)}while((h|0)>0)}Ck(d);if((g|0)==0|a^1){i=e;return 1}else{j=0}while(1){k=Ch(d,j)|0;a=j+1|0;if((k|0)==(g|0)){break}if((a|0)<(b|0)){j=a}else{l=9;break}}if((l|0)==9){i=e;return 1}Oja(d,j);Fk(d,0,k);i=e;return 1}function Fk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;if((Nja(a,b)|0)==0){i=e;return}c[(c[a>>2]|0)+(b<<2)>>2]=d;i=e;return}function Gk(a){a=a|0;return}function Hk(a){a=a|0;var b=0;b=i;$1a(a);i=b;return}function Ik(a,b){a=a|0;b=b|0;b=i;eka(a,669440,-1);i=b;return}function Jk(a,b){a=a|0;b=b|0;b=i;eka(a,1480,-1);i=b;return}function Kk(a,b){a=a|0;b=b|0;return}function Lk(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return}function Mk(a,b){a=a|0;b=b|0;return}function Nk(a,b){a=a|0;b=b|0;return}function Ok(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return 0}function Pk(a,b){a=a|0;b=b|0;return}function Qk(a,b){a=a|0;b=b|0;return}function Rk(a){a=a|0;var b=0;b=i;Sk(a);i=b;return}function Sk(d){d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;Vb();Kb(f|0)|0;g=Hb(f|0)|0;b[d>>1]=(c[g+20>>2]|0)+1900;a[d+2>>0]=(c[g+16>>2]|0)+1;a[d+3>>0]=c[g+12>>2];a[d+4>>0]=c[g+8>>2];a[d+5>>0]=c[g+4>>2];a[d+6>>0]=c[g>>2];i=e;return}function Tk(e,f){e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;g=i;i=i+80|0;h=g;j=g+40|0;k=g+36|0;l=g+32|0;m=g+28|0;n=g+24|0;c[e>>2]=0;o=d[f+2>>0]|0;p=d[f+3>>0]|0;q=d[f+4>>0]|0;r=d[f+5>>0]|0;s=d[f+6>>0]|0;c[h>>2]=b[f>>1]|0;c[h+4>>2]=o;c[h+8>>2]=p;c[h+12>>2]=q;c[h+16>>2]=r;c[h+20>>2]=s;J2a(j,1512,h);eka(k,j,-1);ika(e,k);dka(k);k=f+7|0;if((a[k>>0]|0)<0){eka(l,1496,-1);uka(e,c[l>>2]|0);dka(l)}else{eka(m,1504,-1);uka(e,c[m>>2]|0);dka(m)}m=R(a[k>>0]|0)|0;k=d[f+8>>0]|0;c[h>>2]=m;c[h+4>>2]=k;J2a(j,1544,h);eka(n,j,-1);uka(e,c[n>>2]|0);dka(n);i=g;return}function Uk(a,b,d){a=a|0;b=b|0;d=d|0;c[a>>2]=1568;c[a+4>>2]=b;c[a+8>>2]=d;c[a+12>>2]=0;c[a+16>>2]=-1;return}function Vk(a){a=a|0;var b=0;b=i;$1a(a);i=b;return}function Wk(a){a=a|0;c[a>>2]=1568;c[a+4>>2]=0;c[a+8>>2]=0;return}function Xk(a){a=a|0;return a|0}function Yk(a){a=a|0;var b=0,c=0;b=i;c=Zk(a)|0;i=b;return c|0}function Zk(a){a=a|0;var b=0,c=0,d=0;b=i;i=i+16|0;c=b;pe(c,37048);d=eI(a,c)|0;i=b;return d|0}function _k(a){a=a|0;return a|0}function $k(a){a=a|0;return a|0}function al(a,b){a=a|0;b=b|0;var d=0;d=i;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;Ml(c[(c[b+4>>2]|0)+16>>2]|0,a);i=d;return}function bl(a,b){a=a|0;b=b|0;var c=0;c=i;Ll(a,b);i=c;return}function cl(a,b){a=a|0;b=b|0;b=i;eka(a,1305928,-1);i=b;return}function dl(a){a=a|0;return}function el(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=i;Ol(a,b,c,d,e)|0;i=f;return}function fl(a){a=a|0;var b=0,c=0,d=0;b=i;i=i+16|0;c=b;pe(c,669488);d=(iI(a,c)|0)!=0&1;i=b;return d|0}function gl(a){a=a|0;var b=0;if((a|0)==0){b=1}else{b=(c[a+4>>2]|0)==0}return b|0}function hl(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;i=i+16|0;d=c;pe(d,37048);sI(a,d,b);i=c;return}function il(a){a=a|0;var b=0,c=0,d=0;b=i;i=i+16|0;c=b;pe(c,37048);d=eI(a,c)|0;i=b;return d|0}function jl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d+8|0;f=d;if(gl(c[b>>2]|0)|0){pe(e,3160);qI(a,e);i=d;return}else{pe(f,3160);uI(a,f,b);i=d;return}}function kl(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;i=i+16|0;d=c;pe(d,3160);aI(a,b,d);i=c;return}function ll(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;i=i+32|0;d=b+16|0;e=b+8|0;f=b;g=a+4|0;a=c[(c[g>>2]|0)+16>>2]|0;pe(d,2120);h=jI(a,d)|0;if((h|0)!=0){j=JH(h,2)|0;i=b;return j|0}h=c[(c[g>>2]|0)+16>>2]|0;pe(e,2232);g=iI(h,e)|0;if((g|0)==0){j=1;i=b;return j|0}pe(f,1274880);j=fI(g,f,1)|0;i=b;return j|0}function ml(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;i=i+48|0;d=b+32|0;e=b+24|0;f=b+16|0;g=b+8|0;h=b;j=a+4|0;a=c[(c[j>>2]|0)+16>>2]|0;pe(d,2232);k=iI(a,d)|0;do{if((k|0)!=0){pe(f,39648);pe(g,39648);dI(e,k,f,g);if(!(ah(e,39648)|0)){if(!(ah(e,37032)|0)){if(!(ah(e,1274280)|0)){if(ah(e,37016)|0){l=3}else{d=ah(e,669160)|0;dka(e);if(d){m=4}else{break}i=b;return m|0}}else{l=2}}else{l=1}}else{l=0}dka(e);m=l;i=b;return m|0}}while(0);l=c[(c[j>>2]|0)+16>>2]|0;pe(h,2120);j=jI(l,h)|0;if((((j|0)!=0?(c[j+16>>2]|0)>>>0>3:0)?(h=MH(j,3)|0,(h|0)!=0):0)?(c[h+16>>2]|0)!=0:0){m=1;i=b;return m|0}m=0;i=b;return m|0}function nl(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;h=i;i=i+112|0;j=h+104|0;k=h+96|0;l=h+88|0;m=h+80|0;n=h+72|0;o=h+64|0;p=h+56|0;q=h+48|0;r=h+40|0;s=h+32|0;t=h+24|0;u=h+16|0;v=h+8|0;w=h;x=a+4|0;y=c[(c[x>>2]|0)+16>>2]|0;pe(j,669488);z=iI(y,j)|0;if((z|0)==0){j=u2a(32)|0;Dh(j);y=c[(c[x>>2]|0)+16>>2]|0;pe(k,669488);oI(y,k,j,0);A=j}else{A=z}if(gl(c[g>>2]|0)|0){oe(l,b);B=A;C=kI(A,l)|0}else{oe(m,b);l=iI(A,m)|0;if((l|0)==0){m=u2a(32)|0;Dh(m);oe(n,b);oI(A,n,m,0);D=m}else{D=l}oe(o,g);B=D;C=kI(D,o)|0}if((C|0)==0){o=si(c[(c[a+8>>2]|0)+24>>2]|0)|0;a=u2a(36)|0;zI(a,0,0,0);D=o+16|0;g=II(D,a)|0;oe(p,b);vI(B,p,(o|0)==0?0:D,g);E=a}else{E=C}C=c[E+12>>2]|0;if((C|0)==0){a=u2a(32)|0;Dh(a);pe(q,669480);eka(r,36952,-1);tI(a,q,r);dka(r);pe(s,669432);eka(t,38280,-1);tI(a,s,t);dka(t);pe(u,1608);sI(a,u,1);CI(E,a);if((a|0)!=0){F=a;G=12}}else{F=C;G=12}if((G|0)==12){pe(v,1293304);yI(F,v,e);pe(w,1293296);xI(F,w,d)}d=c[f>>2]|0;f=(d|0)==0;w=f?1305928:d+12|0;if(f){H=0;wH(E,w,H);i=h;return}H=c[d+4>>2]|0;wH(E,w,H);i=h;return}function ol(a){a=a|0;return 1.0}function pl(a){a=a|0;return 1.0}function ql(a){a=a|0;var b=0,c=0,d=0;b=i;c=il(a)|0;if((c&3|0)==0){d=(c&32|0)==0}else{d=0}i=b;return d&1|0}function rl(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;pe(e,1293592);c[a>>2]=iI(b,e)|0;i=d;return}function sl(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;pe(e,2632);c[a>>2]=iI(b,e)|0;i=d;return}function tl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;g=b+4|0;sl(f,c[(c[g>>2]|0)+16>>2]|0);b=c[f>>2]|0;if((Fl(b,d)|0)!=0){Gl(a,b,d);i=e;return}if((d|0)==3){rl(a,c[(c[g>>2]|0)+16>>2]|0);i=e;return}else{c[a>>2]=0;i=e;return}}function ul(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;e=i;f=a+4|0;g=a+8|0;Vl(c[f>>2]|0,c[(c[g>>2]|0)+24>>2]|0,0)|0;Ol(c[f>>2]|0,c[(c[g>>2]|0)+24>>2]|0,b,d,0)|0;i=e;return}function vl(a){a=a|0;var b=0;if((a|0)==0){b=0}else{b=c[a+24>>2]|0}return b|0}function wl(a){a=a|0;var b=0;b=i;c[a+4>>2]=0;c[a+8>>2]=0;Ija(a+12|0,4);c[a>>2]=5;i=b;return}function xl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;i=i+64|0;f=e+48|0;g=e+40|0;h=e+32|0;j=e+24|0;k=e+16|0;l=e+8|0;m=e;n=c[b>>2]|0;if((n|0)==0){c[a>>2]=0;i=e;return}pe(g,39648);aI(f,n,g);if(yl(f,1624)|0?yl(f,1632)|0:0){c[a>>2]=0}else{o=6}do{if((o|0)==6){g=c[b>>2]|0;pe(h,37032);n=$H(g,h)|0;if((n|0)==0){c[a>>2]=0;break}g=c[n>>2]|0;if((g|0)==5){c[a>>2]=n;break}else if((g|0)==4|(g|0)==3){c[k>>2]=2384;c[k+4>>2]=5;$m(j,d,k);dH(m,n);oe(l,m);dka(m);c[a>>2]=cn(j,d,l)|0;break}else{c[a>>2]=0;break}}}while(0);dka(f);i=e;return}function yl(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;pe(e,b);b=(vka(c[a>>2]|0,e)|0)^1;i=d;return b|0}function zl(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+16|0;e=d+8|0;f=d;if((b|0)==0){g=0;i=d;return g|0}pe(f,39648);aI(e,b,f);f=c[e>>2]|0;a:do{if((f|0)!=0?(c[f+4>>2]|0)!=0:0){b=1640;h=0;while(1){j=h+1|0;if(ah(e,b)|0){break}b=c[1832+(j<<2)>>2]|0;if((a[b>>0]|0)==0){break a}else{h=j}}dka(e);g=h;i=d;return g|0}}while(0);dka(e);g=0;i=d;return g|0}function Al(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;i=i+64|0;e=d+48|0;f=d+40|0;g=d+32|0;h=d+24|0;j=d+16|0;k=d+8|0;l=d;m=c[b>>2]|0;pe(f,39648);aI(e,m,f);if(((yl(e,1632)|0?yl(e,1656)|0:0)?yl(e,1712)|0:0)?yl(e,1744)|0:0){c[a>>2]=0;dka(e);i=d;return}f=c[b>>2]|0;pe(g,37048);m=$H(f,g)|0;c[h>>2]=0;do{if((m|0)==0){if(ah(e,1656)|0?(g=c[b>>2]|0,c[j>>2]=1912,c[j+4>>2]=3,f=iI(g,j)|0,(f|0)!=0):0){c[l>>2]=37048;c[l+4>>2]=1;aI(k,f,l);f=c[k>>2]|0;moa(a,(f|0)==0?1305928:f+12|0);dka(k);break}Ona(a,h)}else{dn(m,h);Ona(a,h)}}while(0);Lna(h);dka(e);i=d;return}function Bl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;i=i+64|0;f=e+48|0;g=e+40|0;h=e+32|0;j=e+24|0;k=e+16|0;l=e+12|0;m=e+8|0;n=e;c[a>>2]=0;o=c[b>>2]|0;if((o|0)==0){i=e;return}pe(g,39648);aI(f,o,g);g=yl(f,1672)|0;dka(f);if(g){i=e;return}g=c[b>>2]|0;pe(j,1672);aI(h,g,j);ika(a,h);dka(h);h=c[d+52>>2]|0;pe(k,1672);d=iI(h,k)|0;if((d|0)==0){i=e;return}if((Qka(c[a>>2]|0,1920,1)|0)>=1){i=e;return}pe(n,1928);aI(m,d,n);ag(l,m,a);ika(a,l);dka(l);dka(m);i=e;return}function Cl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+32|0;e=d+24|0;f=d+16|0;g=d+8|0;h=d;Kja(b,0)|0;j=c[a>>2]|0;if((j|0)==0){i=d;return}a=c[j>>2]|0;if((a|0)==0){i=d;return}pe(f,39648);aI(e,a,f);if(ah(e,1696)|0){pe(g,38664);k=$H(a,g)|0}else{pe(h,2464);k=jI(a,h)|0}do{if((k|0)!=0){h=c[k>>2]|0;if((h|0)==3|(h|0)==6){yg(b,k);break}else if((h|0)!=5){break}h=c[k+16>>2]|0;if((h|0)!=0){a=0;do{g=GH(k,a)|0;if((g|0)!=0){yg(b,g)}a=a+1|0}while(a>>>0<h>>>0)}}}while(0);dka(e);i=d;return}function Dl(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;i=i+16|0;d=b+8|0;e=b;f=c[a>>2]|0;do{if(((f|0)!=0?(pe(d,1936),(nI(f,d)|0)!=0):0)?(g=c[a>>2]|0,pe(e,1936),h=$H(g,e)|0,(h|0)!=0):0){g=c[h>>2]|0;if((g|0)==6){j=1;break}else if((g|0)==5){j=c[h+16>>2]|0;break}else{j=0;break}}else{j=0}}while(0);i=b;return j|0}function El(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e+8|0;g=e;h=c[b>>2]|0;if((h|0)!=0?(pe(f,1936),(nI(h,f)|0)!=0):0){f=c[b>>2]|0;pe(g,1936);b=$H(f,g)|0;g=c[b>>2]|0;if((g|0)==6&(d|0)==0){c[a>>2]=b;i=e;return}if((g|0)==5){c[a>>2]=KH(b,d)|0;i=e;return}else{c[a>>2]=0;i=e;return}}c[a>>2]=0;i=e;return}function Fl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;if((a|0)==0){f=0;i=d;return f|0}pe(e,c[2024+(b<<2)>>2]|0);f=nI(a,e)|0;i=d;return f|0}function Gl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;if((b|0)==0){c[a>>2]=0;i=e;return}else{pe(f,c[2024+(d<<2)>>2]|0);c[a>>2]=iI(b,f)|0;i=e;return}}function Hl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=i;i=i+48|0;e=d+40|0;f=d+32|0;g=d+24|0;h=d+16|0;j=d+8|0;k=d;l=a+4|0;Ija(l,4);Ija(a+28|0,4);m=c[b>>2]|0;c[a+20>>2]=m;if((m|0)==0){i=d;return}n=a+24|0;c[n>>2]=c[b+8>>2];pe(e,38856);b=jI(m,e)|0;if((b|0)==0){i=d;return}e=c[(c[n>>2]|0)+52>>2]|0;pe(f,669448);m=iI(e,f)|0;if((m|0)==0){o=0}else{pe(g,2504);o=(hI(m,g,0)|0)!=0}g=b+16|0;if((c[g>>2]|0)==0){i=d;return}m=h+4|0;f=k+4|0;e=0;while(1){p=GH(b,e)|0;if((p|0)!=0?(c[p>>2]|0)==6:0){if((c[p+4>>2]|0)==0){q=II((c[n>>2]|0)+16|0,p)|0;r=c[n>>2]|0;if((r|0)==0){s=0}else{s=r+16|0}r=Il(s,q)|0;if((r|0)==0){t=20;break}QH(b,e,r);NH(b,e+1|0);u=KH(b,e)|0}else{u=p}p=u2a(48)|0;Rl(p,u);if((p|0)==0){t=20;break}c[p+44>>2]=a;yg(l,p);if((o?(c[h>>2]=669432,c[m>>2]=7,bI(j,u,h),c[k>>2]=669440,c[f>>2]=6,Ue(j,k)|0):0)?(xn()|0)!=0:0){sm(c[n>>2]|0,u)}}e=e+1|0;if(!(e>>>0<(c[g>>2]|0)>>>0)){t=20;break}}if((t|0)==20){i=d;return}}function Il(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=u2a(20)|0;c[e+4>>2]=0;c[e+8>>2]=0;c[e>>2]=9;c[e+12>>2]=a;c[e+16>>2]=b;i=d;return e|0}function Jl(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+4|0;e=a+8|0;if((c[e>>2]|0)>0){f=0;do{g=c[(Hg(d,f)|0)>>2]|0;if((g|0)!=0){Sl(g);v2a(g)}f=f+1|0}while((f|0)<(c[e>>2]|0))}e=a+28|0;f=a+32|0;if((c[f>>2]|0)>0){a=0;do{g=c[(Hg(e,a)|0)>>2]|0;if((g|0)!=0){Iy(g);v2a(g)}a=a+1|0}while((a|0)<(c[f>>2]|0))}Jja(c[e>>2]|0);Jja(c[d>>2]|0);i=b;return}function Kl(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;h=i;i=i+48|0;j=h+40|0;k=h+24|0;l=h;m=a+8|0;if((c[m>>2]|0)<=0){i=h;return}n=a+4|0;a=(g|0)!=0;g=a^1;o=(e|0)==0;e=(d|0)==0;p=0;do{q=c[(Hg(n,p)|0)>>2]|0;r=q+16|0;Ll(j,c[r>>2]|0);s=ah(j,669440)|0;dka(j);do{if((s|g)&(a|s^1)?(t=Zk(c[r>>2]|0)|0,(t&2|0)==0):0){if(o){if((t&32|0)!=0){break}}else{if((t&4|0)==0){break}}c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;Ml(c[r>>2]|0,k);c[l+0>>2]=c[f+0>>2];c[l+4>>2]=c[f+4>>2];c[l+8>>2]=c[f+8>>2];c[l+12>>2]=c[f+12>>2];c[l+16>>2]=c[f+16>>2];c[l+20>>2]=c[f+20>>2];if(!e){Nl(q,b,d,l);break}if((Ol(q,b,0,l,0)|0)==0){Pl(q,l)}}}while(0);p=p+1|0}while((p|0)<(c[m>>2]|0));i=h;return}function Ll(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d+8|0;f=d;if((b|0)==0){c[e>>2]=0;c[e+4>>2]=0}else{c[f>>2]=669432;c[f+4>>2]=7;bI(e,b,f)}jka(a,e);i=d;return}function Ml(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+32|0;e=d+8|0;f=d;if((a|0)==0){i=d;return}pe(f,2224);lI(e,a,f);c[b+0>>2]=c[e+0>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];Hla(b);i=d;return}function Nl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,h=0;e=i;i=i+32|0;f=e;g[f+12>>2]=1.0;g[f>>2]=1.0;g[f+20>>2]=0.0;g[f+16>>2]=0.0;g[f+8>>2]=0.0;g[f+4>>2]=0.0;h=Wl(b,a,0,d,f)|0;if((h|0)==0){i=e;return}vM(c,h,f);i=e;return}function Ol(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0;f=i;i=i+64|0;h=f+40|0;j=f;g[h+12>>2]=1.0;g[h>>2]=1.0;g[h+20>>2]=0.0;g[h+16>>2]=0.0;g[h+8>>2]=0.0;g[h+4>>2]=0.0;k=Wl(b,a,e,d,h)|0;if((k|0)==0){l=0;i=f;return l|0}rM(j);tM(j,b);xM(j,c,k,h,0);uM(j);l=1;i=f;return l|0}function Pl(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0.0,D=0,E=0,F=0,G=0;e=i;i=i+128|0;f=e+120|0;h=e+112|0;j=e+104|0;k=e+96|0;l=e+88|0;m=e+80|0;n=e+72|0;o=e+64|0;p=e+32|0;q=e+16|0;r=e;s=b+16|0;Ll(f,c[s>>2]|0);b=ah(f,2112)|0;dka(f);if(b){i=e;return}b=Zk(c[s>>2]|0)|0;if((b&2|0)!=0){i=e;return}if((c[6]|0)==2){if((b&4|0)==0){i=e;return}}else{if((b&32|0)!=0){i=e;return}}b=c[s>>2]|0;pe(h,2232);f=iI(b,h)|0;if((f|0)==0){h=c[s>>2]|0;pe(j,2120);b=jI(h,j)|0;if((b|0)!=0){t=+DH(b,2);if((c[b+16>>2]|0)==4){j=MH(b,3)|0;if((j|0)==0){i=e;return}b=c[j+16>>2]|0;a:do{if((b|0)>0){h=0;while(1){u=GH(j,h)|0;if((u|0)!=0?(jH(u)|0)!=0:0){v=h;break a}u=h+1|0;if((u|0)<(b|0)){h=u}else{v=u;break}}}else{v=0}}while(0);if((v|0)==(b|0)){i=e;return}else{w=j;x=68;y=t;z=18}}else{w=0;x=83;y=t;z=18}}else{A=0;B=83;C=1.0}}else{pe(l,39648);aI(k,f,l);pe(m,37032);l=jI(f,m)|0;m=c[k>>2]|0;if((m|0)==0){D=0}else{D=a[m+13>>0]|0}pe(n,1274880);t=+gI(f,n);dka(k);w=l;x=D;y=t;z=18}if((z|0)==18){if(!(y<=0.0)){A=w;B=x;C=y}else{i=e;return}}x=c[s>>2]|0;pe(o,1274288);w=jI(x,o)|0;if((w|0)==0){E=-16777216}else{o=~~(+DH(w,0)*255.0);x=~~(+DH(w,1)*255.0);E=o<<16|x<<8|~~(+DH(w,2)*255.0)|-16777216}dJa(p);g[p+24>>2]=C;do{if(B<<24>>24==68){if((A|0)==0){w=w2a(2,4)|0;c[p+8>>2]=w;if((w|0)==0){F=w;break}c[p+4>>2]=2;g[w+4>>2]=3.0;g[w>>2]=3.0;z=30;break}w=A+16|0;x=c[w>>2]|0;o=(x&1)+x|0;x=w2a(o,4)|0;D=p+8|0;c[D>>2]=x;if((x|0)!=0){c[p+4>>2]=o;if((c[w>>2]|0)==0){G=0}else{l=0;while(1){y=+DH(A,l);g[(c[D>>2]|0)+(l<<2)>>2]=y;k=l+1|0;if(k>>>0<(c[w>>2]|0)>>>0){l=k}else{G=k;break}}}if(G>>>0<o>>>0){l=c[D>>2]|0;g[l+(G<<2)>>2]=+g[l+(G+ -1<<2)>>2];z=30}else{z=30}}else{F=x}}else{z=30}}while(0);if((z|0)==30){c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;Ml(c[s>>2]|0,q);OIa(r);y=C*.5;XIa(r,y+ +g[q>>2],y+ +g[q+8>>2],+g[q+4>>2]-y,+g[q+12>>2]-y);UGa(0,r,d,p,E,E,0,0)|0;PIa(c[r+4>>2]|0);F=c[p+8>>2]|0}gJa(F);i=e;return}function Ql(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=i;Kl(a,b,c,d,e,0);Kl(a,b,c,d,e,1);i=f;return}function Rl(a,b){a=a|0;b=b|0;var d=0;d=i;Ija(a,16);zma(a+20|0,10);c[a+44>>2]=0;c[a+16>>2]=b;i=d;return}function Sl(a){a=a|0;var b=0;b=i;Tl(a);Bma(a+20|0);yna(a);i=b;return}function Tl(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+16|0;d=b+8|0;e=b+4|0;f=b;g=a+20|0;h=(c[a+28>>2]|0)==0;c[d>>2]=h?0:-1;if(h){Ama(g);i=b;return}do{Cma(g,d,e,f);h=c[f>>2]|0;if((h|0)!=0){Iy(h);v2a(h)}}while((c[d>>2]|0)!=0);Ama(g);i=b;return}function Ul(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;d=i;i=i+112|0;e=d+96|0;f=d+88|0;g=d+80|0;h=d+72|0;j=d+64|0;k=d+56|0;l=d+48|0;m=d+40|0;n=d+32|0;o=d+24|0;p=d+16|0;q=d+8|0;r=d;pe(e,669488);s=iI(a,e)|0;if((s|0)==0){t=0;i=d;return t|0}if((b|0)==2){u=37032}else{u=(b|0)==1?669016:1274672}pe(f,u);b=(nI(s,f)|0)==0;pe(g,b?1274672:u);u=$H(s,g)|0;if((u|0)==0){t=0;i=d;return t|0}g=c[u>>2]|0;if((g|0)==6){pe(j,3160);aI(h,a,j);j=c[h>>2]|0;if(!((j|0)!=0?(c[j+4>>2]|0)!=0:0)){c[l>>2]=669136;c[l+4>>2]=1;aI(k,a,l);l=c[k>>2]|0;if(!((l|0)!=0?(c[l+4>>2]|0)!=0:0)){c[m>>2]=38824;c[m+4>>2]=6;l=iI(a,m)|0;if((l|0)==0){c[n>>2]=0;v=1;w=0}else{c[o>>2]=669136;c[o+4>>2]=1;aI(n,l,o);v=0;w=1}ika(k,n);if(v){dka(n)}if(w){dka(n)}}n=c[k>>2]|0;if(((n|0)!=0?(c[n+4>>2]|0)!=0:0)?(oe(p,k),(nI(u,p)|0)!=0):0){ika(h,k)}else{c[q>>2]=2656;c[q+4>>2]=3;kka(h,q)}dka(k)}oe(r,h);k=kI(u,r)|0;dka(h);t=k;i=d;return t|0}else if((g|0)==7){t=u;i=d;return t|0}else{t=0;i=d;return t|0}return 0}function Vl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+16|0;f=e;g=Ul(c[a+16>>2]|0,d)|0;if((g|0)==0){h=0;i=e;return h|0}d=a+20|0;if((Dma(d,g,f)|0)!=0){h=c[f>>2]|0;i=e;return h|0}j=u2a(80)|0;Sy(j,c[(c[a+44>>2]|0)+24>>2]|0,c[b+16>>2]|0,g,0);c[f>>2]=j;if((j|0)==0){h=0;i=e;return h|0}Uy(j,0,0,0,0,0);c[(Gma(d,g)|0)>>2]=j;h=j;i=e;return h|0}function Wl(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;g=i;i=i+80|0;h=g+56|0;j=g+48|0;k=g+24|0;l=g+16|0;m=g;n=Vl(b,a,d)|0;if((n|0)==0){o=0;i=g;return o|0}d=c[n>>2]|0;c[j>>2]=1293296;c[j+4>>2]=4;lI(h,d,j);j=c[n>>2]|0;c[l>>2]=1293304;c[l+4>>2]=6;mI(k,j,l);rm(k,h);c[m+0>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;Ml(c[b+16>>2]|0,m);bma(f,m,h);Wla(f,e);o=n;i=g;return o|0}function Xl(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=c[a>>2]|0;if((d|0)==0){e=u2a(32)|0;dJa(e);c[a>>2]=e;if((e|0)==0){f=e}else{c[e+28>>2]=1;f=e}}else{e=d+28|0;g=c[e>>2]|0;if((g|0)>1){c[e>>2]=g+ -1;g=c[a>>2]|0;c[a>>2]=0;e=u2a(32)|0;eJa(e,g);c[a>>2]=e;if((e|0)==0){f=e}else{c[e+28>>2]=1;f=e}}else{f=d}}i=b;return f|0}function Yl(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=c[a>>2]|0;if((d|0)==0){e=u2a(32)|0;c[e+8>>2]=0;c[e+4>>2]=0;c[e+20>>2]=0;c[e+16>>2]=0;c[a>>2]=e;if((e|0)==0){f=e;i=b;return f|0}c[e+28>>2]=1;f=e;i=b;return f|0}e=d+28|0;g=c[e>>2]|0;if((g|0)<=1){f=d;i=b;return f|0}c[e>>2]=g+ -1;g=c[a>>2]|0;c[a>>2]=0;e=u2a(32)|0;DC(e,g);c[a>>2]=e;if((e|0)==0){f=e;i=b;return f|0}c[e+28>>2]=1;f=e;i=b;return f|0}function Zl(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=c[a>>2]|0;if((d|0)==0){e=u2a(16)|0;OIa(e);c[a>>2]=e;if((e|0)==0){f=e}else{c[e+12>>2]=1;f=e}}else{e=d+12|0;g=c[e>>2]|0;if((g|0)>1){c[e>>2]=g+ -1;g=c[a>>2]|0;c[a>>2]=0;e=u2a(16)|0;SIa(e,g);c[a>>2]=e;if((e|0)==0){f=e}else{c[e+12>>2]=1;f=e}}else{f=d}}i=b;return f|0}function _l(a){a=a|0;var b=0,d=0;b=i;d=a+8|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[a+48>>2]=0;c[a>>2]=37368;c[a+52>>2]=0;g[a+76>>2]=1.0;g[a+64>>2]=1.0;g[a+84>>2]=0.0;g[a+80>>2]=0.0;g[a+72>>2]=0.0;g[a+68>>2]=0.0;c[a+28>>2]=2;i=b;return}function $l(a){a=a|0;var b=0;b=i;c[a>>2]=2136;nm(a+48|0);dm(a+4|0);i=b;return}function am(a){a=a|0;var b=0;b=i;cm(a);i=b;return}function bm(a){a=a|0;var b=0;b=i;cm(a);v2a(a);i=b;return}function cm(a){a=a|0;var b=0;b=i;c[a>>2]=37368;qm(a+52|0);$l(a);i=b;return}function dm(a){a=a|0;var b=0;b=i;mm(a+20|0);lm(a+16|0);jm(a+12|0);im(a+8|0);hm(a+4|0);i=b;return}function em(a,b){a=a|0;b=b|0;return}function fm(a){a=a|0;var b=0;b=i;$l(a);i=b;return}function gm(a){a=a|0;var b=0;b=i;$l(a);v2a(a);i=b;return}function hm(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;if((d|0)==0){i=b;return}e=d+20|0;c[e>>2]=(c[e>>2]|0)+ -1;e=c[a>>2]|0;if((c[e+20>>2]|0)>0|(e|0)==0){i=b;return}uC(e);v2a(e);i=b;return}function im(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;if((d|0)==0){i=b;return}e=d+28|0;c[e>>2]=(c[e>>2]|0)+ -1;e=c[a>>2]|0;if((c[e+28>>2]|0)>0|(e|0)==0){i=b;return}gJa(c[e+8>>2]|0);v2a(e);i=b;return}function jm(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;if((d|0)==0){i=b;return}e=d+28|0;c[e>>2]=(c[e>>2]|0)+ -1;e=c[a>>2]|0;if((c[e+28>>2]|0)>0|(e|0)==0){i=b;return}km(e);v2a(e);i=b;return}function km(a){a=a|0;var b=0;b=i;iA(a+16|0);iA(a+4|0);i=b;return}function lm(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;if((d|0)==0){i=b;return}e=d+52|0;c[e>>2]=(c[e>>2]|0)+ -1;e=c[a>>2]|0;if((c[e+52>>2]|0)>0|(e|0)==0){i=b;return}LC(c[e>>2]|0);v2a(e);i=b;return}function mm(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;if((d|0)==0){i=b;return}e=d+136|0;c[e>>2]=(c[e>>2]|0)+ -1;e=c[a>>2]|0;if((c[e+136>>2]|0)>0|(e|0)==0){i=b;return}PC(e);v2a(e);i=b;return}function nm(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;if((d|0)==0){i=b;return}e=d+20|0;c[e>>2]=(c[e>>2]|0)+ -1;e=c[a>>2]|0;if((c[e+20>>2]|0)>0|(e|0)==0){i=b;return}om(e+4|0);v2a(e);i=b;return}function om(a){a=a|0;var b=0;b=i;pm(a);Jja(c[a>>2]|0);i=b;return}function pm(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+4|0;if((c[d>>2]|0)>0){e=0;do{ZC(Pja(a,e)|0);e=e+1|0}while((e|0)<(c[d>>2]|0))}Kja(a,0)|0;i=b;return}function qm(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;if((d|0)==0){i=b;return}e=d+12|0;c[e>>2]=(c[e>>2]|0)+ -1;e=c[a>>2]|0;if((c[e+12>>2]|0)>0|(e|0)==0){i=b;return}PIa(c[e+4>>2]|0);v2a(e);i=b;return}function rm(a,b){a=a|0;b=b|0;var c=0;c=i;Lla(a,b,b+4|0,b+12|0,b+8|0);i=c;return}function sm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;i=i+80|0;e=d+64|0;f=d+56|0;g=d+48|0;h=d+40|0;j=d+32|0;k=d+24|0;l=d+16|0;m=d+8|0;n=d;if((b|0)==0){i=d;return}pe(e,669432);bI(f,b,e);if(tm(c[f>>2]|0,c[f+4>>2]|0,669440,6)|0){i=d;return}dH(g,Up(b,38400,0)|0);if((Up(b,2584,0)|0)==0){o=0}else{o=jH(Up(b,2584,0)|0)|0}do{if(!(ah(g,2600)|0)){if(ah(g,2608)|0){if((o&131072|0)==0){wm(a,b)|0;break}else{vm(a,b)|0;break}}if((((ah(g,2592)|0?(o&65536|0)==0:0)?(pe(h,3160),(nI(b,h)|0)==0):0)?(pe(j,38824),f=iI(b,j)|0,(f|0)!=0):0)?(pe(k,3160),(nI(f,k)|0)!=0):0){pe(l,3160);pe(n,3160);aI(m,f,n);uI(b,l,m);dka(m)}}else{um(a,b)|0}}while(0);dka(g);i=d;return}function tm(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=i;if((d|0)!=(b|0)){f=1;i=e;return f|0}f=(Q2a(c,a,d)|0)!=0;i=e;return f|0}function um(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;c[e>>2]=0;f=Lm(a,b,e)|0;i=d;return f|0}function vm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;c[e>>2]=1;f=Lm(a,b,e)|0;i=d;return f|0}function wm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;c[e>>2]=2;f=Lm(a,b,e)|0;i=d;return f|0}function xm(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=i;c[a>>2]=2160;c[a+4>>2]=b;c[a+8>>2]=d;c[a+12>>2]=e;hka(a+16|0,f);c[a+20>>2]=0;c[a+24>>2]=0;i=g;return}function ym(a){a=a|0;var b=0;b=i;zm(a);$1a(a);i=b;return}function zm(a){a=a|0;var b=0;b=i;c[a>>2]=2160;dka(a+24|0);dka(a+16|0);i=b;return}function Am(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;i=i+48|0;g=f+36|0;h=f+32|0;j=f+24|0;k=f+16|0;l=f+8|0;m=f;if((a|0)==0|(b|0)==0){i=f;return}c[g>>2]=0;n=c[a+52>>2]|0;pe(j,669448);c[h>>2]=iI(n,j)|0;j=Op(h,a,e)|0;if((j|0)!=0){pe(k,669472);h=iI(b,k)|0;if((h|0)!=0?(oe(l,e),(nI(h,l)|0)==0):0){oe(m,e);vI(h,m,a+16|0,c[(c[j+96>>2]|0)+4>>2]|0)}c[d>>2]=j}dka(g);i=f;return}function Bm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;if((b|0)==1){e=a+20|0;f=c[e>>2]|0;if((f|0)==0){Am(c[a+4>>2]|0,c[a+8>>2]|0,e,a+24|0);g=c[e>>2]|0}else{g=f}}else if((b|0)==0){g=c[a+12>>2]|0}else{g=0}i=d;return g|0}function Cm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;if((d|0)==1){f=b+20|0;if((c[f>>2]|0)==0){g=b+24|0;Am(c[b+4>>2]|0,c[b+8>>2]|0,f,g);h=g}else{h=b+24|0}hka(a,h);i=e;return}else if((d|0)==0){hka(a,b+16|0);i=e;return}else{eka(a,1305928,-1);i=e;return}}function Dm(a){a=a|0;var b=0;b=i;$1a(a);i=b;return}function Em(a){a=a|0;return}function Fm(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;e=i;f=c[a+4>>2]|0;a=dd[c[c[f>>2]>>2]&511](f,b)|0;if((a|0)==0){g=0;i=e;return g|0}b=Bu(a,d&65535)|0;if((b|0)==-1){g=0;i=e;return g|0}g=Qc[c[(c[a>>2]|0)+40>>2]&255](a,b,0)|0;i=e;return g|0}function Gm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[a+4>>2]|0;a=dd[c[c[e>>2]>>2]&511](e,b)|0;if((a|0)==0){f=0;i=d;return f|0}f=c[a+132>>2]|0;i=d;return f|0}function Hm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[a+4>>2]|0;a=dd[c[c[e>>2]>>2]&511](e,b)|0;if((a|0)==0){f=0;i=d;return f|0}f=c[a+136>>2]|0;i=d;return f|0}function Im(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;e=i;d=a+4|0;a=c[d>>2]|0;f=dd[c[c[a>>2]>>2]&511](a,0)|0;if((f|0)!=0?!((Bu(f,b&65535)|0)==-1):0){g=0;i=e;return g|0}f=c[d>>2]|0;d=dd[c[c[f>>2]>>2]&511](f,1)|0;if((d|0)!=0?!((Bu(d,b&65535)|0)==-1):0){g=1;i=e;return g|0}g=-1;i=e;return g|0}function Jm(a,b){a=a|0;b=b|0;var c=0;a=i;if(!((b+ -97<<16>>16&65535)<26|(b+ -65<<16>>16&65535)<26)?!(b<<16>>16==39|b<<16>>16==45):0){c=0}else{c=1}i=a;return c|0}function Km(a){a=a|0;return 0}function Lm(d,e,f){d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Oc=0,Pc=0,Qc=0,Rc=0,Sc=0,Tc=0,Uc=0,Vc=0,Wc=0,Xc=0,Yc=0,Zc=0,_c=0,$c=0,ad=0,bd=0,cd=0,dd=0,ed=0,fd=0,gd=0,hd=0,id=0,jd=0,kd=0,ld=0,md=0,nd=0,od=0,pd=0,qd=0,rd=0,sd=0,td=0,ud=0,vd=0,wd=0,xd=0.0,yd=0.0,zd=0.0,Ad=0.0,Bd=0.0,Cd=0,Dd=0,Ed=0,Fd=0,Gd=0,Hd=0,Id=0,Jd=0,Kd=0,Ld=0,Md=0,Nd=0.0,Od=0,Pd=0,Qd=0,Rd=0,Sd=0,Td=0.0,Ud=0,Vd=0,Wd=0,Xd=0,Yd=0,Zd=0,_d=0,$d=0,ae=0,be=0,ce=0,de=0,ee=0.0,fe=0.0,ge=0,he=0,ie=0.0,je=0.0,ke=0.0,le=0.0,me=0,ne=0,qe=0,re=0,se=0,te=0,ue=0,ve=0,we=0,xe=0,ye=0,ze=0,Ae=0,Be=0,Ce=0,De=0,Ee=0,Fe=0,Ge=0,He=0,Ie=0,Je=0,Ke=0,Le=0,Me=0,Ne=0,Oe=0,Pe=0,Qe=0,Re=0,Se=0,Te=0,Ue=0,Ve=0,We=0.0,Xe=0,Ye=0,Ze=0,_e=0.0,$e=0,af=0,bf=0;h=i;i=i+2208|0;j=h+2072|0;k=h+2064|0;l=h+2056|0;m=h+2048|0;n=h+2040|0;o=h+2032|0;p=h+2024|0;q=h+2016|0;r=h+2008|0;s=h+2e3|0;t=h+1992|0;u=h+1984|0;v=h+1976|0;w=h+1968|0;x=h+1960|0;y=h+1956|0;z=h+1952|0;A=h+1944|0;B=h+1928|0;C=h+1920|0;D=h+1912|0;E=h+1904|0;F=h+1896|0;G=h+1888|0;H=h+1880|0;I=h+1856|0;J=h+1848|0;K=h+1840|0;L=h+1832|0;M=h+1824|0;N=h+1816|0;O=h+1808|0;P=h+1800|0;Q=h+1792|0;R=h+1784|0;S=h+1776|0;T=h+1768|0;U=h+1760|0;V=h+1752|0;W=h+1744|0;X=h+1736|0;Y=h+1728|0;Z=h+1720|0;_=h+1712|0;$=h+1704|0;aa=h+1688|0;ba=h+1680|0;ca=h+1672|0;da=h+1664|0;ea=h+1648|0;fa=h+1624|0;ga=h+1608|0;ha=h+1588|0;ia=h+1568|0;ja=h+1560|0;ka=h+1552|0;la=h+1544|0;ma=h+1536|0;na=h+1528|0;oa=h+1520|0;pa=h+1500|0;qa=h+1480|0;ra=h+1472|0;sa=h+1464|0;ta=h+1440|0;ua=h+1432|0;va=h+1408|0;wa=h+1392|0;xa=h+1388|0;ya=h+1384|0;za=h+1376|0;Aa=h+1368|0;Ba=h+1360|0;Ca=h+1352|0;Da=h+1344|0;Ea=h+1336|0;Fa=h+1328|0;Ga=h+1320|0;Ha=h+1312|0;Ia=h+1304|0;Ja=h+1296|0;Ka=h+1280|0;La=h+1272|0;Ma=h+1264|0;Na=h+1256|0;Oa=h+1248|0;Pa=h+1240|0;Qa=h+1232|0;Ra=h+1224|0;Sa=h+1216|0;Ta=h+1208|0;Ua=h+1200|0;Va=h+1192|0;Wa=h+1184|0;Xa=h+1176|0;Ya=h+1168|0;Za=h+1160|0;_a=h+1156|0;$a=h+1128|0;ab=h+1120|0;bb=h+1112|0;cb=h+1104|0;db=h+1088|0;eb=h;fb=h+1080|0;gb=h+1072|0;hb=h+1064|0;ib=h+1056|0;jb=h+1048|0;kb=h+1040|0;lb=h+1032|0;mb=h+1024|0;nb=h+1016|0;ob=h+1012|0;pb=h+1008|0;qb=h+1e3|0;rb=h+992|0;sb=h+984|0;tb=h+980|0;ub=h+952|0;vb=h+944|0;wb=h+936|0;xb=h+928|0;yb=h+912|0;zb=h+896|0;Ab=h+880|0;Bb=h+872|0;Cb=h+864|0;Db=h+856|0;Eb=h+848|0;Fb=h+840|0;Gb=h+832|0;Hb=h+824|0;Ib=h+816|0;Jb=h+808|0;Kb=h+800|0;Lb=h+796|0;Mb=h+792|0;Nb=h+784|0;Ob=h+776|0;Pb=h+768|0;Qb=h+760|0;Rb=h+740|0;Sb=h+736|0;Tb=h+728|0;Ub=h+720|0;Vb=h+712|0;Wb=h+704|0;Xb=h+696|0;Yb=h+688|0;Zb=h+680|0;_b=h+672|0;$b=h+652|0;ac=h+632|0;bc=h+612|0;cc=h+600|0;dc=h+592|0;ec=h+584|0;fc=h+576|0;gc=h+568|0;hc=h+560|0;ic=h+552|0;jc=h+544|0;kc=h+536|0;lc=h+528|0;mc=h+520|0;nc=h+512|0;oc=h+504|0;pc=h+496|0;qc=h+488|0;rc=h+480|0;sc=h+448|0;tc=h+440|0;uc=h+432|0;vc=h+424|0;wc=h+408|0;xc=h+400|0;yc=h+396|0;zc=h+392|0;Ac=h+376|0;Bc=h+368|0;Cc=h+360|0;Dc=h+352|0;Ec=h+332|0;Fc=h+328|0;Gc=h+320|0;Hc=h+312|0;Ic=h+304|0;Jc=h+296|0;Kc=h+288|0;Lc=h+280|0;Mc=h+272|0;Nc=h+264|0;Oc=h+244|0;Pc=h+240|0;Qc=h+232|0;Rc=h+224|0;Sc=h+216|0;Tc=h+208|0;Uc=h+200|0;Vc=h+192|0;Wc=h+188|0;Xc=h+184|0;Yc=h+176|0;Zc=h+168|0;_c=h+160|0;$c=h+152|0;ad=h+144|0;bd=h+136|0;cd=h+128|0;dd=h+120|0;ed=h+112|0;fd=h+104|0;gd=h+96|0;hd=h+88|0;id=h+80|0;jd=h+72|0;kd=h+64|0;ld=h+56|0;md=h+48|0;nd=h+40|0;od=h+32|0;pd=h+24|0;qd=h+16|0;rd=h+8|0;sd=c[d+52>>2]|0;if((sd|0)==0){td=0;i=h;return td|0}pe(w,669448);ud=iI(sd,w)|0;if((ud|0)==0){td=0;i=h;return td|0}c[x>>2]=0;w=Up(e,669512,0)|0;if(((w|0)!=0?(dH(y,w),ika(x,y),dka(y),y=c[x>>2]|0,(y|0)!=0):0)?(c[y+4>>2]|0)!=0:0){vd=8}else{pe(A,669512);aI(z,ud,A);ika(x,z);dka(z);z=c[x>>2]|0;if((z|0)!=0?(c[z+4>>2]|0)!=0:0){vd=8}else{wd=0}}if((vd|0)==8){oe(C,x);oL(B,C);pe(D,669520);rL(B,D,2)|0;qL(F,B);jka(E,F);uL(G,E);ika(E,G);dka(G);G=c[E>>2]|0;do{if((G|0)!=0?(c[G+4>>2]|0)!=0:0){qL(H,B);xd=+Hna(H);oe(k,x);oL(j,k);F=j+8|0;c[F>>2]=0;pe(l,1291936);do{if((rL(j,l,1)|0)==0){c[F>>2]=0;pe(n,1291912);if((rL(j,n,3)|0)!=0){qL(o,j);yd=+Hna(o);qL(p,j);zd=+Hna(p);qL(q,j);Ad=+Hna(q);c[I>>2]=2;g[I+4>>2]=yd;g[I+8>>2]=zd;g[I+12>>2]=Ad;g[I+16>>2]=0.0;break}c[F>>2]=0;pe(r,1291952);if((rL(j,r,4)|0)==0){c[I+0>>2]=0;c[I+4>>2]=0;c[I+8>>2]=0;c[I+12>>2]=0;c[I+16>>2]=0;break}else{qL(s,j);Ad=+Hna(s);qL(t,j);zd=+Hna(t);qL(u,j);yd=+Hna(u);qL(v,j);Bd=+Hna(v);c[I>>2]=3;g[I+4>>2]=Ad;g[I+8>>2]=zd;g[I+12>>2]=yd;g[I+16>>2]=Bd;break}}else{qL(m,j);Bd=+Hna(m);c[I>>2]=1;g[I+4>>2]=Bd;g[I+8>>2]=0.0;g[I+12>>2]=0.0;g[I+16>>2]=0.0}}while(0);c[J>>2]=669464;c[J+4>>2]=2;F=iI(e,J)|0;if((F|0)==0){c[K>>2]=669464;c[K+4>>2]=2;D=iI(ud,K)|0;if((D|0)==0){Cd=0;break}else{Dd=1;Ed=D}}else{Dd=0;Ed=F}pe(L,669472);F=iI(Ed,L)|0;if((F|0)!=0){Fka(N,E,1);oe(M,N);D=iI(F,M)|0;dka(N);if((D|0)==0&(Dd|0)==0){c[O>>2]=669464;c[O+4>>2]=2;C=iI(ud,O)|0;pe(P,669472);z=iI(C,P)|0;if((z|0)==0){Cd=0;break}Fka(R,E,1);oe(Q,R);C=iI(z,Q)|0;dka(R);Fd=z;Gd=C}else{Fd=F;Gd=D}if((Fd|0)!=0){if((Gd|0)==0){D=Wm()|0;if((D|0)==0){Cd=0;break}c[S>>2]=669480;c[S+4>>2]=4;eka(T,669472,-1);tI(D,S,T);dka(T);c[U>>2]=669432;c[U+4>>2]=7;eka(V,34544,-1);tI(D,U,V);dka(V);c[W>>2]=34552;c[W+4>>2]=8;eka(X,1290288,-1);tI(D,W,X);dka(X);c[Y>>2]=1280496;c[Y+4>>2]=8;eka(Z,11776,-1);tI(D,Y,Z);dka(Z);F=d+16|0;II(F,D)|0;Fka($,E,1);oe(_,$);vI(Fd,_,(d|0)==0?0:F,c[D+4>>2]|0);dka($);Hd=D}else{Hd=Gd}D=RA(d,Hd)|0;if((D|0)!=0){pe(ba,2224);lI(aa,e,ba);pe(ca,2560);F=iI(e,ca)|0;if((F|0)==0){Id=0}else{pe(da,669016);Id=(eI(F,da)|0)%360|0}c[ea+0>>2]=0;c[ea+4>>2]=0;c[ea+8>>2]=0;c[ea+12>>2]=0;F=fa+12|0;g[F>>2]=1.0;g[fa>>2]=1.0;C=fa+20|0;g[C>>2]=0.0;z=fa+16|0;g[z>>2]=0.0;A=fa+8|0;g[A>>2]=0.0;y=fa+4|0;g[y>>2]=0.0;if((Id|0)==0){Bd=+g[aa+4>>2]- +g[aa>>2];yd=+g[aa+12>>2]- +g[aa+8>>2];g[ea>>2]=0.0;g[ea+4>>2]=Bd;g[ea+8>>2]=0.0;g[ea+12>>2]=yd}else if((Id|0)==90){yd=+g[aa+4>>2]- +g[aa>>2];g[fa>>2]=0.0;g[y>>2]=1.0;g[A>>2]=-1.0;g[F>>2]=0.0;g[z>>2]=yd;g[C>>2]=0.0;Bd=+g[aa+12>>2]- +g[aa+8>>2];g[ea>>2]=0.0;g[ea+4>>2]=Bd;g[ea+8>>2]=0.0;g[ea+12>>2]=yd}else if((Id|0)==180){yd=+g[aa+4>>2]- +g[aa>>2];Bd=+g[aa+12>>2]- +g[aa+8>>2];g[fa>>2]=-1.0;g[y>>2]=0.0;g[A>>2]=0.0;g[F>>2]=-1.0;g[z>>2]=yd;g[C>>2]=Bd;g[ea>>2]=0.0;g[ea+4>>2]=yd;g[ea+8>>2]=0.0;g[ea+12>>2]=Bd}else if((Id|0)==270){Bd=+g[aa+12>>2]- +g[aa+8>>2];g[fa>>2]=0.0;g[y>>2]=-1.0;g[A>>2]=1.0;g[F>>2]=0.0;g[z>>2]=0.0;g[C>>2]=Bd;yd=+g[aa+4>>2]- +g[aa>>2];g[ea>>2]=0.0;g[ea+4>>2]=Bd;g[ea+8>>2]=0.0;g[ea+12>>2]=yd}c[ga>>2]=3;C=ga+4|0;c[C>>2]=0;z=ga+8|0;c[z>>2]=0;F=ha+4|0;A=ha+8|0;y=ha+12|0;w=ha+16|0;c[ha+0>>2]=0;c[ha+4>>2]=0;c[ha+8>>2]=0;c[ha+12>>2]=0;c[ha+16>>2]=0;sd=ia+4|0;Jd=ia+8|0;Kd=ia+12|0;Ld=ia+16|0;c[ia+0>>2]=0;c[ia+4>>2]=0;c[ia+8>>2]=0;c[ia+12>>2]=0;c[ia+16>>2]=0;pe(ja,2232);Md=iI(e,ja)|0;do{if((Md|0)!=0){pe(ka,1274880);if((nI(Md,ka)|0)==0){Nd=1.0}else{pe(la,1274880);Nd=+gI(Md,la)}pe(ma,37032);Od=jI(Md,ma)|0;if((Od|0)!=0){Pd=JH(Od,0)|0;Qd=JH(Od,1)|0;Rd=JH(Od,2)|0;c[ga>>2]=Pd;c[C>>2]=Qd;c[z>>2]=Rd}pe(oa,39648);aI(na,Md,oa);Rd=c[na>>2]|0;if((Rd|0)==0){Sd=0}else{Sd=a[Rd+12>>0]|0}dka(na);Rd=Sd&255;if((Rd|0)==68){Td=Nd;Ud=1;break}else if((Rd|0)==85){Td=Nd;Ud=4;break}else if((Rd|0)==66){c[ha>>2]=1;g[F>>2]=1.0;g[A>>2]=0.0;g[y>>2]=0.0;g[w>>2]=0.0;c[ia>>2]=1;g[sd>>2]=.5;g[Jd>>2]=0.0;g[Kd>>2]=0.0;g[Ld>>2]=0.0;Td=Nd*2.0;Ud=2;break}else if((Rd|0)==73){c[ha>>2]=1;g[F>>2]=.5;g[A>>2]=0.0;g[y>>2]=0.0;g[w>>2]=0.0;c[ia>>2]=1;g[sd>>2]=.75;g[Jd>>2]=0.0;g[Kd>>2]=0.0;g[Ld>>2]=0.0;Td=Nd*2.0;Ud=3;break}else{Td=Nd;Ud=0;break}}else{Td=1.0;Ud=0}}while(0);c[pa+0>>2]=0;c[pa+4>>2]=0;c[pa+8>>2]=0;c[pa+12>>2]=0;c[pa+16>>2]=0;c[qa+0>>2]=0;c[qa+4>>2]=0;c[qa+8>>2]=0;c[qa+12>>2]=0;c[qa+16>>2]=0;pe(ra,2560);Ld=iI(e,ra)|0;if((Ld|0)!=0){pe(sa,39672);Kd=jI(Ld,sa)|0;if((Kd|0)!=0){Xm(ta,Kd);c[pa+0>>2]=c[ta+0>>2];c[pa+4>>2]=c[ta+4>>2];c[pa+8>>2]=c[ta+8>>2];c[pa+12>>2]=c[ta+12>>2];c[pa+16>>2]=c[ta+16>>2]}pe(ua,2240);Kd=jI(Ld,ua)|0;if((Kd|0)!=0){Xm(va,Kd);c[qa+0>>2]=c[va+0>>2];c[qa+4>>2]=c[va+4>>2];c[qa+8>>2]=c[va+8>>2];c[qa+12>>2]=c[va+12>>2];c[qa+16>>2]=c[va+16>>2]}}gla(wa);c[ya>>2]=1;Tm(xa,qa,ya);Kd=c[xa>>2]|0;if((Kd|0)!=0?(c[Kd+4>>2]|0)>0:0){pe(za,1293864);Kd=qla(wa,c[za>>2]|0,c[za+4>>2]|0)|0;oe(Aa,xa);Ld=qla(Kd,c[Aa>>2]|0,c[Aa+4>>2]|0)|0;Kd=tla(Ld,+g[ea>>2])|0;pe(Ba,1305864);Ld=qla(Kd,c[Ba>>2]|0,c[Ba+4>>2]|0)|0;Kd=ea+8|0;Jd=tla(Ld,+g[Kd>>2])|0;pe(Ca,1305864);Ld=qla(Jd,c[Ca>>2]|0,c[Ca+4>>2]|0)|0;Jd=tla(Ld,+g[ea+4>>2]- +g[ea>>2])|0;pe(Da,1305864);Ld=qla(Jd,c[Da>>2]|0,c[Da+4>>2]|0)|0;Jd=tla(Ld,+g[ea+12>>2]- +g[Kd>>2])|0;pe(Ea,1292072);Kd=qla(Jd,c[Ea>>2]|0,c[Ea+4>>2]|0)|0;pe(Fa,1293904);qla(Kd,c[Fa>>2]|0,c[Fa+4>>2]|0)|0}Sm(Ga,ea,Td,pa,ha,ia,Ud,ga);Kd=c[Ga>>2]|0;do{if((Kd|0)!=0){if((c[Kd+4>>2]|0)<=0){break}pe(Ha,1293864);Jd=qla(wa,c[Ha>>2]|0,c[Ha+4>>2]|0)|0;oe(Ia,Ga);Ld=qla(Jd,c[Ia>>2]|0,c[Ia+4>>2]|0)|0;pe(Ja,1293904);qla(Ld,c[Ja>>2]|0,c[Ja+4>>2]|0)|0}}while(0);yd=Td+ +g[ea+8>>2];Bd=+g[ea+4>>2]-Td;zd=+g[ea+12>>2]-Td;g[Ka>>2]=Td+ +g[ea>>2];Kd=Ka+8|0;g[Kd>>2]=yd;Ld=Ka+4|0;g[Ld>>2]=Bd;Jd=Ka+12|0;g[Jd>>2]=zd;Hla(Ka);pe(La,669488);sd=iI(e,La)|0;do{if((sd|0)==0){w=Wm()|0;if((w|0)==0){Vd=0;break}pe(Ma,669488);oI(e,Ma,w,0);Wd=w;vd=61}else{Wd=sd;vd=61}}while(0);a:do{if((vd|0)==61){pe(Na,1274672);sd=kI(Wd,Na)|0;if((sd|0)==0){w=Ym(0,0,0)|0;if((w|0)==0){Vd=0;break}y=d+16|0;A=II(y,w)|0;pe(Oa,669488);F=iI(e,Oa)|0;pe(Pa,1274672);vI(F,Pa,(d|0)==0?0:y,A);Xd=w}else{Xd=sd}sd=Xd+12|0;w=c[sd>>2]|0;A=(w|0)!=0;do{if(A){pe(Qa,1293304);yI(w,Qa,fa);pe(Ra,1293296);xI(w,Ra,ea);pe(Sa,669496);y=iI(w,Sa)|0;if((y|0)==0){pe(Xa,669496);pe(Ya,669464);oI(w,Xa,pH(iI(ud,Ya)|0,0)|0,0);pe(Za,669496);iI(w,Za)|0;break}pe(Ta,669472);F=iI(y,Ta)|0;if((F|0)==0){Md=Wm()|0;if((Md|0)==0){Vd=0;break a}pe(Ua,669472);oI(y,Ua,Md,0);Yd=Md}else{Yd=F}oe(Va,E);if((nI(Yd,Va)|0)!=0){break}oe(Wa,E);if((d|0)==0){Zd=0}else{Zd=d+16|0}vI(Yd,Wa,Zd,c[Hd+4>>2]|0)}}while(0);F=c[f>>2]|0;if((F|0)==0){if((Up(e,669136,0)|0)==0){c[_a>>2]=0}else{uH(_a,Up(e,669136,0)|0)}if((Up(e,22808,0)|0)==0){_d=0}else{_d=jH(Up(e,22808,0)|0)|0}if((Up(e,2584,0)|0)==0){$d=0}else{$d=jH(Up(e,2584,0)|0)|0}if((Up(e,2640,0)|0)==0){ae=0}else{ae=jH(Up(e,2640,0)|0)|0}if(A){pe(ab,669496);be=iI(w,ab)|0}else{be=0}Md=c[E>>2]|0;if((Md|0)==0){ce=-1}else{ce=(c[Md+4>>2]|0)+ -1|0}Lka(bb,E,ce);xm($a,d,be,D,bb);dka(bb);c[cb>>2]=2184;c[cb+4>>2]=$a;_q(j);ks(j,cb)|0;Md=j+8|0;c[Md+0>>2]=c[Ka+0>>2];c[Md+4>>2]=c[Ka+4>>2];c[Md+8>>2]=c[Ka+8>>2];c[Md+12>>2]=c[Ka+12>>2];c[j+76>>2]=_d;zd=xd;if(zd<1.0e-4&zd>-1.0e-4){c[j+72>>2]=1}else{g[j+100>>2]=xd}Md=($d&4096|0)!=0;if(Md){c[j+64>>2]=1;c[j+68>>2]=1}if(($d&8192|0)==0){de=0}else{b[j+92>>1]=42;de=42}y=$d&16777216;if((y|0)==0){c[j+56>>2]=ae}else{c[j+60>>2]=ae}dr(j);z=c[_a>>2]|0;zr(j,(z|0)==0?1292088:z+12|0,1,0,0);ds(j);Rr(db,j);g[eb>>2]=0.0;g[eb+4>>2]=0.0;if(!Md){zd=+((+g[db+12>>2]- +g[db+8>>2]-(+g[Jd>>2]- +g[Kd>>2]))*.5);Md=eb;c[Md>>2]=0;g[Md+4>>2]=zd}Mm(fb,$a,js(j)|0,eb,y>>>24^1,de);y=c[fb>>2]|0;do{if((y|0)!=0){if((c[y+4>>2]|0)<=0){break}pe(gb,1291024);Md=qla(wa,c[gb>>2]|0,c[gb+4>>2]|0)|0;pe(hb,1293864);qla(Md,c[hb>>2]|0,c[hb+4>>2]|0)|0;zd=+g[Ka>>2];Bd=+g[Ld>>2]-zd;if(!(+g[db+4>>2]- +g[db>>2]>Bd)){yd=+g[Jd>>2];Ad=+g[Kd>>2];if(+g[db+12>>2]- +g[db+8>>2]>yd-Ad){ee=Ad;fe=yd;vd=105}}else{ee=+g[Kd>>2];fe=+g[Jd>>2];vd=105}if((vd|0)==105){Md=tla(wa,zd)|0;pe(ib,1305864);z=tla(qla(Md,c[ib>>2]|0,c[ib+4>>2]|0)|0,ee)|0;pe(jb,1305864);Md=tla(qla(z,c[jb>>2]|0,c[jb+4>>2]|0)|0,Bd)|0;pe(kb,1305864);z=tla(qla(Md,c[kb>>2]|0,c[kb+4>>2]|0)|0,fe-ee)|0;pe(lb,2248);qla(z,c[lb>>2]|0,c[lb+4>>2]|0)|0}pe(mb,1291896);z=qla(wa,c[mb>>2]|0,c[mb+4>>2]|0)|0;c[pb>>2]=1;Tm(ob,I,pb);oe(nb,ob);Md=qla(z,c[nb>>2]|0,c[nb+4>>2]|0)|0;oe(qb,fb);z=qla(Md,c[qb>>2]|0,c[qb+4>>2]|0)|0;pe(rb,1291904);Md=qla(z,c[rb>>2]|0,c[rb+4>>2]|0)|0;pe(sb,2264);qla(Md,c[sb>>2]|0,c[sb+4>>2]|0)|0;dka(ob)}}while(0);dka(fb);br(j);zm($a);Lna(_a)}else if((F|0)==1){if((Up(e,669136,0)|0)==0){c[tb>>2]=0}else{uH(tb,Up(e,669136,0)|0)}if(A){pe(vb,669496);ge=iI(w,vb)|0}else{ge=0}y=c[E>>2]|0;if((y|0)==0){he=-1}else{he=(c[y+4>>2]|0)+ -1|0}Lka(wb,E,he);xm(ub,d,ge,D,wb);dka(wb);c[xb>>2]=2184;c[xb+4>>2]=ub;_q(j);ks(j,xb)|0;c[yb+0>>2]=c[Ka+0>>2];c[yb+4>>2]=c[Ka+4>>2];c[yb+8>>2]=c[Ka+8>>2];c[yb+12>>2]=c[Ka+12>>2];y=yb+4|0;g[yb>>2]=+g[y>>2]+-13.0;Hla(yb);c[zb+0>>2]=c[Ka+0>>2];c[zb+4>>2]=c[Ka+4>>2];c[zb+8>>2]=c[Ka+8>>2];c[zb+12>>2]=c[Ka+12>>2];Bd=+g[yb>>2];Md=zb+4|0;g[Md>>2]=Bd;Hla(zb);z=j+8|0;c[z+0>>2]=c[zb+0>>2];c[z+4>>2]=c[zb+4>>2];c[z+8>>2]=c[zb+8>>2];c[z+12>>2]=c[zb+12>>2];zd=xd;if(zd<1.0e-4&zd>-1.0e-4){c[j+72>>2]=1}else{g[j+100>>2]=xd}dr(j);z=c[tb>>2]|0;zr(j,(z|0)==0?1292088:z+12|0,1,0,0);ds(j);Rr(Ab,j);zd=+g[zb+8>>2];yd=+g[zb+12>>2]-zd;Ad=(+g[Ab+12>>2]- +g[Ab+8>>2]-yd)*.5;g[Bb>>2]=0.0;g[Bb+4>>2]=Ad;Mm(Cb,ub,js(j)|0,Bb,1,0);z=c[Cb>>2]|0;do{if((z|0)!=0){if((c[z+4>>2]|0)<=0){break}pe(Db,1291024);C=qla(wa,c[Db>>2]|0,c[Db+4>>2]|0)|0;pe(Eb,1293864);qla(C,c[Eb>>2]|0,c[Eb+4>>2]|0)|0;Ad=+g[zb>>2];C=tla(wa,Ad)|0;pe(Fb,1305864);Rd=tla(qla(C,c[Fb>>2]|0,c[Fb+4>>2]|0)|0,zd)|0;pe(Gb,1305864);C=qla(Rd,c[Gb>>2]|0,c[Gb+4>>2]|0)|0;Rd=tla(C,+g[Md>>2]-Ad)|0;pe(Hb,1305864);C=tla(qla(Rd,c[Hb>>2]|0,c[Hb+4>>2]|0)|0,yd)|0;pe(Ib,2248);qla(C,c[Ib>>2]|0,c[Ib+4>>2]|0)|0;pe(Jb,1291896);C=qla(wa,c[Jb>>2]|0,c[Jb+4>>2]|0)|0;c[Mb>>2]=1;Tm(Lb,I,Mb);oe(Kb,Lb);Rd=qla(C,c[Kb>>2]|0,c[Kb+4>>2]|0)|0;oe(Nb,Cb);C=qla(Rd,c[Nb>>2]|0,c[Nb+4>>2]|0)|0;pe(Ob,1291904);Rd=qla(C,c[Ob>>2]|0,c[Ob+4>>2]|0)|0;pe(Pb,2264);qla(Rd,c[Pb>>2]|0,c[Pb+4>>2]|0)|0;dka(Lb)}}while(0);c[Rb>>2]=2;g[Rb+4>>2]=.8627451062202454;g[Rb+8>>2]=.8627451062202454;g[Rb+12>>2]=.8627451062202454;g[Rb+16>>2]=0.0;c[Sb>>2]=1;Tm(Qb,Rb,Sb);Md=c[Qb>>2]|0;do{if((Md|0)!=0){if((c[Md+4>>2]|0)<=0){break}yd=+g[y>>2];if(Bd>=yd){break}z=yb+8|0;zd=+g[z>>2];Rd=yb+12|0;Ad=+g[Rd>>2];if(zd>=Ad){break}pe(Tb,1293864);C=qla(wa,c[Tb>>2]|0,c[Tb+4>>2]|0)|0;oe(Ub,Qb);qla(C,c[Ub>>2]|0,c[Ub+4>>2]|0)|0;C=tla(wa,Bd)|0;pe(Vb,1305864);Qd=tla(qla(C,c[Vb>>2]|0,c[Vb+4>>2]|0)|0,zd)|0;pe(Wb,1305864);C=tla(qla(Qd,c[Wb>>2]|0,c[Wb+4>>2]|0)|0,yd-Bd)|0;pe(Xb,1305864);Qd=tla(qla(C,c[Xb>>2]|0,c[Xb+4>>2]|0)|0,Ad-zd)|0;pe(Yb,1292072);qla(Qd,c[Yb>>2]|0,c[Yb+4>>2]|0)|0;pe(Zb,1293904);qla(wa,c[Zb>>2]|0,c[Zb+4>>2]|0)|0;c[$b>>2]=1;Qd=$b+4|0;c[Qd+0>>2]=0;c[Qd+4>>2]=0;c[Qd+8>>2]=0;c[Qd+12>>2]=0;c[ac>>2]=1;g[ac+4>>2]=1.0;g[ac+8>>2]=0.0;g[ac+12>>2]=0.0;g[ac+16>>2]=0.0;c[bc>>2]=1;g[bc+4>>2]=.5;g[bc+8>>2]=0.0;g[bc+12>>2]=0.0;g[bc+16>>2]=0.0;c[cc>>2]=3;c[cc+4>>2]=0;c[cc+8>>2]=0;Sm(_b,yb,2.0,$b,ac,bc,2,cc);Qd=c[_b>>2]|0;do{if((Qd|0)!=0){if((c[Qd+4>>2]|0)<=0){break}pe(dc,1293864);C=qla(wa,c[dc>>2]|0,c[dc+4>>2]|0)|0;oe(ec,_b);Pd=qla(C,c[ec>>2]|0,c[ec+4>>2]|0)|0;pe(fc,1293904);qla(Pd,c[fc>>2]|0,c[fc+4>>2]|0)|0}}while(0);zd=+g[yb>>2];Ad=+g[y>>2];yd=(zd+Ad)*.5;ie=+g[Rd>>2];je=+g[z>>2];ke=(ie+je)*.5;le=Ad-zd;do{if(le>6.0){zd=le+-6.0;if(zd<1.0e-4&zd>-1.0e-4){break}zd=ie-je;if(!(zd>6.0)){break}Ad=zd+-6.0;if(Ad<1.0e-4&Ad>-1.0e-4){break}pe(gc,1293864);Qd=qla(wa,c[gc>>2]|0,c[gc+4>>2]|0)|0;pe(hc,1292080);qla(Qd,c[hc>>2]|0,c[hc+4>>2]|0)|0;Ad=yd+-3.0;Qd=tla(wa,Ad)|0;pe(ic,1305864);zd=ke+1.5;Pd=tla(qla(Qd,c[ic>>2]|0,c[ic+4>>2]|0)|0,zd)|0;pe(jc,1293880);qla(Pd,c[jc>>2]|0,c[jc+4>>2]|0)|0;Pd=tla(wa,yd+3.0)|0;pe(kc,1305864);Qd=tla(qla(Pd,c[kc>>2]|0,c[kc+4>>2]|0)|0,zd)|0;pe(lc,1293888);qla(Qd,c[lc>>2]|0,c[lc+4>>2]|0)|0;Qd=tla(wa,yd)|0;pe(mc,1305864);Pd=tla(qla(Qd,c[mc>>2]|0,c[mc+4>>2]|0)|0,ke+-1.5)|0;pe(nc,1293888);qla(Pd,c[nc>>2]|0,c[nc+4>>2]|0)|0;Pd=tla(wa,Ad)|0;pe(oc,1305864);Qd=tla(qla(Pd,c[oc>>2]|0,c[oc+4>>2]|0)|0,zd)|0;pe(pc,1293896);qla(Qd,c[pc>>2]|0,c[pc+4>>2]|0)|0;oe(qc,Qb);Qd=qla(wa,c[qc>>2]|0,c[qc+4>>2]|0)|0;pe(rc,1293904);qla(Qd,c[rc>>2]|0,c[rc+4>>2]|0)|0}}while(0);dka(_b)}}while(0);dka(Qb);dka(Cb);br(j);zm(ub);Lna(tb)}else if((F|0)==2){if(A){pe(tc,669496);me=iI(w,tc)|0}else{me=0}y=c[E>>2]|0;if((y|0)==0){ne=-1}else{ne=(c[y+4>>2]|0)+ -1|0}Lka(uc,E,ne);xm(sc,d,me,D,uc);dka(uc);c[vc>>2]=2184;c[vc+4>>2]=sc;if((Up(e,2648,0)|0)==0){qe=0}else{qe=mH(Up(e,2648,0)|0)|0}if((Up(e,37016,0)|0)==0){re=0}else{re=mH(Up(e,37016,0)|0)|0}if((Up(e,2688,0)|0)==0){se=0}else{se=jH(Up(e,2688,0)|0)|0}gla(wc);b:do{if((qe|0)!=0){y=c[qe+16>>2]|0;if((se|0)>=(y|0)){break}Md=(re|0)==0;z=j+8|0;Rd=j+12|0;Qd=j+16|0;Pd=j+20|0;Bd=xd;C=j+100|0;ke=Bd<1.0e-4&Bd>-1.0e-4?12.0:xd;Od=Ac+12|0;te=Ac+8|0;ue=_c+4|0;ve=Ec+4|0;we=Ec+8|0;xe=Ec+12|0;ye=Ec+16|0;ze=Oc+4|0;Ae=Oc+8|0;Be=Oc+12|0;Ce=Oc+16|0;De=Sc+4|0;Ee=re+16|0;Bd=+g[Kd>>2];yd=+g[Ka>>2];je=+g[Ld>>2];Fe=Uc+4|0;Ge=Vc+4|0;He=Yc+4|0;Ie=$c+4|0;Je=Bc+4|0;Ke=Cc+4|0;ie=yd;Le=Gc+4|0;Me=Hc+4|0;le=je-yd;Ne=Ic+4|0;Oe=Jc+4|0;Pe=Kc+4|0;Qe=Lc+4|0;Re=Mc+4|0;Se=Qc+4|0;Te=Tc+4|0;zd=+g[Jd>>2];Ue=se;while(1){if(zd<Bd?(Ad=zd-Bd,!(Ad<1.0e-4&Ad>-1.0e-4)):0){break b}Ve=GH(qe,Ue)|0;if((Ve|0)==0){We=zd}else{c[xc>>2]=0;Xe=c[Ve>>2]|0;if((Xe|0)==3){uH(yc,Ve);Pna(xc,yc);Lna(yc)}else if((Xe|0)==5){uH(zc,GH(Ve,1)|0);Pna(xc,zc);Lna(zc)}c:do{if(Md){Ye=0}else{Ve=c[Ee>>2]|0;if((Ve|0)==0){Ye=0;break}else{Ze=0}while(1){if((Ue|0)==(JH(re,Ze)|0)){Ye=1;break c}Ze=Ze+1|0;if(!(Ze>>>0<Ve>>>0)){Ye=0;break}}}}while(0);_q(j);ks(j,vc)|0;g[z>>2]=yd;g[Rd>>2]=je;g[Qd>>2]=0.0;g[Pd>>2]=0.0;g[C>>2]=ke;dr(j);Ve=c[xc>>2]|0;zr(j,(Ve|0)==0?1292088:Ve+12|0,1,0,0);ds(j);Rr(Ac,j);Ad=+g[Od>>2]- +g[te>>2];if((Ye|0)==0){pe(Uc,1291896);Ve=qla(wc,c[Uc>>2]|0,c[Fe>>2]|0)|0;c[Xc>>2]=1;Tm(Wc,I,Xc);oe(Vc,Wc);Xe=qla(Ve,c[Vc>>2]|0,c[Ge>>2]|0)|0;Ve=js(j)|0;g[_c>>2]=0.0;g[ue>>2]=zd;Mm(Zc,sc,Ve,_c,1,0);oe(Yc,Zc);Ve=qla(Xe,c[Yc>>2]|0,c[He>>2]|0)|0;pe($c,1291904);qla(Ve,c[$c>>2]|0,c[Ie>>2]|0)|0;dka(Zc);dka(Wc)}else{_e=zd-Ad;pe(Bc,1293864);Ve=qla(wc,c[Bc>>2]|0,c[Je>>2]|0)|0;c[Ec>>2]=2;g[ve>>2]=0.0;g[we>>2]=.20000000298023224;g[xe>>2]=.4431372582912445;g[ye>>2]=0.0;c[Fc>>2]=1;Tm(Dc,Ec,Fc);oe(Cc,Dc);Xe=tla(qla(Ve,c[Cc>>2]|0,c[Ke>>2]|0)|0,ie)|0;pe(Gc,1305864);Ve=tla(qla(Xe,c[Gc>>2]|0,c[Le>>2]|0)|0,_e)|0;pe(Hc,1305864);Xe=tla(qla(Ve,c[Hc>>2]|0,c[Me>>2]|0)|0,le)|0;pe(Ic,1305864);Ve=tla(qla(Xe,c[Ic>>2]|0,c[Ne>>2]|0)|0,zd-_e)|0;pe(Jc,1292072);Xe=qla(Ve,c[Jc>>2]|0,c[Oe>>2]|0)|0;pe(Kc,1293904);qla(Xe,c[Kc>>2]|0,c[Pe>>2]|0)|0;dka(Dc);pe(Lc,1291896);Xe=qla(wc,c[Lc>>2]|0,c[Qe>>2]|0)|0;c[Oc>>2]=1;g[ze>>2]=1.0;g[Ae>>2]=0.0;g[Be>>2]=0.0;g[Ce>>2]=0.0;c[Pc>>2]=1;Tm(Nc,Oc,Pc);oe(Mc,Nc);Ve=qla(Xe,c[Mc>>2]|0,c[Re>>2]|0)|0;Xe=js(j)|0;g[Sc>>2]=0.0;g[De>>2]=zd;Mm(Rc,sc,Xe,Sc,1,0);oe(Qc,Rc);Xe=qla(Ve,c[Qc>>2]|0,c[Se>>2]|0)|0;pe(Tc,1291904);qla(Xe,c[Tc>>2]|0,c[Te>>2]|0)|0;dka(Rc);dka(Nc)}br(j);Lna(xc);We=zd-Ad}Ue=Ue+1|0;if((Ue|0)>=(y|0)){break}else{zd=We}}}}while(0);w=wc+8|0;if((c[w>>2]|0)>0){pe(ad,1291024);A=qla(wa,c[ad>>2]|0,c[ad+4>>2]|0)|0;pe(bd,1293864);qla(A,c[bd>>2]|0,c[bd+4>>2]|0)|0;zd=+g[Ka>>2];A=tla(wa,zd)|0;pe(cd,1305864);F=qla(A,c[cd>>2]|0,c[cd+4>>2]|0)|0;le=+g[Kd>>2];A=tla(F,le)|0;pe(dd,1305864);F=qla(A,c[dd>>2]|0,c[dd+4>>2]|0)|0;A=tla(F,+g[Ld>>2]-zd)|0;pe(ed,1305864);F=qla(A,c[ed>>2]|0,c[ed+4>>2]|0)|0;A=tla(F,+g[Jd>>2]-le)|0;pe(fd,2248);qla(A,c[fd>>2]|0,c[fd+4>>2]|0)|0;A=wc+4|0;pla(gd,c[A>>2]|0,c[w>>2]|0);w=qla(wa,c[gd>>2]|0,c[gd+4>>2]|0)|0;pe(hd,2264);qla(w,c[hd>>2]|0,c[hd+4>>2]|0)|0;$e=A}else{$e=wc+4|0}ila(c[$e>>2]|0);zm(sc)}if((Xd|0)==0){Vd=1;break}wH(Xd,c[wa+4>>2]|0,c[wa+8>>2]|0);A=c[sd>>2]|0;if((A|0)==0){Vd=1;break}pe(id,1293304);yI(A,id,fa);pe(jd,1293296);xI(A,jd,ea);pe(kd,669496);w=iI(A,kd)|0;if((w|0)==0){pe(pd,669496);pe(qd,669464);oI(A,pd,pH(iI(ud,qd)|0,0)|0,0);pe(rd,669496);iI(A,rd)|0;Vd=1;break}pe(ld,669472);A=iI(w,ld)|0;if((A|0)==0){F=Wm()|0;if((F|0)==0){Vd=0;break}pe(md,669472);oI(w,md,F,0);af=F}else{af=A}oe(nd,E);if((nI(af,nd)|0)!=0){Vd=1;break}oe(od,E);if((d|0)==0){bf=0}else{bf=d+16|0}vI(af,od,bf,c[Hd+4>>2]|0);Vd=1}}while(0);dka(Ga);dka(xa);ila(c[wa+4>>2]|0);Cd=Vd}else{Cd=0}}else{Cd=0}}else{Cd=0}}else{Cd=0}}while(0);dka(E);wd=Cd}dka(x);td=wd;i=h;return td|0}function Mm(a,d,e,f,h,j){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0.0,Aa=0.0,Ba=0,Ca=0,Da=0,Ea=0.0,Fa=0.0,Ga=0,Ha=0.0,Ia=0.0,Ja=0,Ka=0.0,La=0.0,Ma=0.0,Na=0.0,Oa=0,Pa=0,Qa=0;k=i;i=i+480|0;l=k+456|0;m=k+440|0;n=k+424|0;o=k+412|0;p=k+400|0;q=k+392|0;r=k+388|0;s=k+384|0;t=k+376|0;u=k+300|0;v=k+224|0;w=k+216|0;x=k+208|0;y=k+200|0;z=k+196|0;A=k+192|0;B=k+184|0;C=k+176|0;D=k+168|0;E=k+160|0;F=k+156|0;G=k+80|0;H=k+72|0;I=k+64|0;J=k+56|0;K=k+48|0;L=k+40|0;M=k+36|0;N=k+32|0;O=k+24|0;P=k+20|0;Q=k+16|0;R=k+8|0;S=k;gla(l);gla(m);gla(n);if((e|0)==0){T=l+4|0;U=c[T>>2]|0;V=l+8|0;W=c[V>>2]|0;pla(S,U,W);jka(a,S);X=n+4|0;Y=c[X>>2]|0;ila(Y);Z=m+4|0;_=c[Z>>2]|0;ila(_);$=c[T>>2]|0;ila($);i=k;return}Ic[c[(c[e>>2]|0)+44>>2]&511](e,0);c[o>>2]=-1;c[o+4>>2]=-1;c[o+8>>2]=-1;aa=(h|0)==0;h=G+20|0;ba=G+24|0;ca=f+4|0;da=G+40|0;ea=G+44|0;fa=v+40|0;ga=n+8|0;ha=v+44|0;ia=v+24|0;ja=v+28|0;ka=u+20|0;la=u+24|0;ma=H+4|0;na=I+4|0;oa=L+4|0;pa=J+4|0;qa=E+4|0;ra=n+4|0;sa=y+4|0;ta=C+4|0;ua=q+4|0;va=m+4|0;wa=m+8|0;xa=w+4|0;ya=x+4|0;za=0.0;Aa=0.0;Ba=-1;a:while(1){while(1){if((Lc[c[c[e>>2]>>2]&255](e)|0)==0){break a}Ca=Lc[c[(c[e>>2]|0)+52>>2]&255](e)|0;c[p+0>>2]=c[Ca+0>>2];c[p+4>>2]=c[Ca+4>>2];c[p+8>>2]=c[Ca+8>>2];if(!aa){break}Um(G);if((dd[c[(c[e>>2]|0)+24>>2]&511](e,G)|0)!=0){Da=22;break}}if((Da|0)==22){Da=0;Ea=+g[h>>2]+ +g[f>>2];Fa=+g[ba>>2]+ +g[ca>>2];if(Ea!=Aa|Fa!=za){Ca=tla(l,Ea-Aa)|0;pe(H,1305864);Ga=tla(qla(Ca,c[H>>2]|0,c[ma>>2]|0)|0,Fa-za)|0;pe(I,1305872);qla(Ga,c[I>>2]|0,c[na>>2]|0)|0;Ha=Fa;Ia=Ea}else{Ha=za;Ia=Aa}Ga=c[da>>2]|0;if((Ga|0)==(Ba|0)){Ja=Ba}else{Qm(K,d,Ga,+g[ea>>2]);oe(J,K);qla(l,c[J>>2]|0,c[pa>>2]|0)|0;dka(K);Ja=c[da>>2]|0}Rm(N,d,Ja,b[G>>1]|0,j);Pm(M,N);oe(L,M);qla(l,c[L>>2]|0,c[oa>>2]|0)|0;dka(M);dka(N);za=Ha;Aa=Ia;Ba=Ja;continue}if((Om(p,o)|0)!=0){Ga=c[ga>>2]|0;if((Ga|0)>0){pla(t,c[ra>>2]|0,Ga);jka(s,t);Pm(r,s);oe(q,r);qla(m,c[q>>2]|0,c[ua>>2]|0)|0;dka(r);dka(s);ula(l,c[va>>2]|0,c[wa>>2]|0)|0;jla(m);jla(n)}Um(u);if((dd[c[(c[e>>2]|0)+24>>2]&511](e,u)|0)==0){c[v+0>>2]=-1;c[v+4>>2]=-1;c[v+8>>2]=-1;c[v+12>>2]=-1;c[v+16>>2]=-1;c[v+20>>2]=-1;c[ia+0>>2]=0;c[ia+4>>2]=0;c[ia+8>>2]=0;c[ia+12>>2]=0;c[ia+16>>2]=0;dd[c[(c[e>>2]|0)+32>>2]&511](e,v)|0;Ka=+g[ia>>2]+ +g[f>>2];La=+g[ja>>2]+ +g[ca>>2]}else{Ka=+g[ka>>2]+ +g[f>>2];La=+g[la>>2]+ +g[ca>>2]}if(Ka!=Aa|La!=za){Ga=tla(m,Ka-Aa)|0;pe(w,1305864);Ca=tla(qla(Ga,c[w>>2]|0,c[xa>>2]|0)|0,La-za)|0;pe(x,1305872);qla(Ca,c[x>>2]|0,c[ya>>2]|0)|0;Ma=La;Na=Ka}else{Ma=za;Na=Aa}}else{Ma=za;Na=Aa}Um(v);if((dd[c[(c[e>>2]|0)+24>>2]&511](e,v)|0)==0){Oa=Ba}else{Ca=c[fa>>2]|0;if((Ca|0)==(Ba|0)){Pa=Ba}else{Ga=c[ga>>2]|0;if((Ga|0)>0){pla(B,c[ra>>2]|0,Ga);jka(A,B);Pm(z,A);oe(y,z);qla(m,c[y>>2]|0,c[sa>>2]|0)|0;dka(z);dka(A);jla(n);Qa=c[fa>>2]|0}else{Qa=Ca}Qm(D,d,Qa,+g[ha>>2]);oe(C,D);qla(m,c[C>>2]|0,c[ta>>2]|0)|0;dka(D);Pa=c[fa>>2]|0}Rm(F,d,Pa,b[v>>1]|0,j);oe(E,F);qla(n,c[E>>2]|0,c[qa>>2]|0)|0;dka(F);Oa=Pa}c[o+0>>2]=c[p+0>>2];c[o+4>>2]=c[p+4>>2];c[o+8>>2]=c[p+8>>2];za=Ma;Aa=Na;Ba=Oa}Oa=c[ga>>2]|0;if((Oa|0)<=0){T=l+4|0;U=c[T>>2]|0;V=l+8|0;W=c[V>>2]|0;pla(S,U,W);jka(a,S);X=n+4|0;Y=c[X>>2]|0;ila(Y);Z=m+4|0;_=c[Z>>2]|0;ila(_);$=c[T>>2]|0;ila($);i=k;return}pla(R,c[ra>>2]|0,Oa);jka(Q,R);Pm(P,Q);oe(O,P);qla(m,c[O>>2]|0,c[O+4>>2]|0)|0;dka(P);dka(Q);ula(l,c[va>>2]|0,c[wa>>2]|0)|0;jla(n);T=l+4|0;U=c[T>>2]|0;V=l+8|0;W=c[V>>2]|0;pla(S,U,W);jka(a,S);X=n+4|0;Y=c[X>>2]|0;ila(Y);Z=m+4|0;_=c[Z>>2]|0;ila(_);$=c[T>>2]|0;ila($);i=k;return}function Nm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=c[a>>2]|0;f=c[b>>2]|0;if((e|0)<=(f|0)){if((e|0)>=(f|0)){f=c[a+4>>2]|0;e=c[b+4>>2]|0;if((f|0)<=(e|0)){if((f|0)>=(e|0)){e=c[a+8>>2]|0;a=c[b+8>>2]|0;if((e|0)>(a|0)){g=1}else{g=((e|0)<(a|0))<<31>>31}}else{g=-1}}else{g=1}}else{g=-1}}else{g=1}i=d;return g|0}function Om(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=c[a>>2]|0;f=c[b>>2]|0;if((e|0)<=(f|0)){if((e|0)>=(f|0)){f=c[a+4>>2]|0;a=c[b+4>>2]|0;if((f|0)>(a|0)){g=1}else{g=((f|0)<(a|0))<<31>>31}}else{g=-1}}else{g=1}i=d;return g|0}function Pm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;f=c[b>>2]|0;if((f|0)!=0?(c[f+4>>2]|0)>0:0){EG(e,b,0);Vm(a,e,1305920);dka(e);i=d;return}eka(a,1305928,-1);i=d;return}function Qm(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=i;i=i+64|0;g=f+48|0;h=f+40|0;j=f+32|0;k=f+24|0;l=f+16|0;m=f+8|0;n=f;gla(g);if((b|0)==0){o=g+4|0;p=c[o>>2]|0;q=g+8|0;r=c[q>>2]|0;pla(n,p,r);jka(a,n);s=c[o>>2]|0;ila(s);i=f;return}ld[c[(c[b>>2]|0)+4>>2]&255](h,b,d);d=c[h>>2]|0;if((d|0)!=0?(c[d+4>>2]|0)>0&e>0.0:0){pe(j,1305904);d=qla(g,c[j>>2]|0,c[j+4>>2]|0)|0;oe(k,h);j=qla(d,c[k>>2]|0,c[k+4>>2]|0)|0;pe(l,1305864);k=tla(qla(j,c[l>>2]|0,c[l+4>>2]|0)|0,e)|0;pe(m,1305912);qla(k,c[m>>2]|0,c[m+4>>2]|0)|0}dka(h);o=g+4|0;p=c[o>>2]|0;q=g+8|0;r=c[q>>2]|0;pla(n,p,r);jka(a,n);s=c[o>>2]|0;ila(s);i=f;return}function Rm(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;i=i+32|0;h=g;j=g+16|0;k=g+8|0;c[a>>2]=0;if(!(f<<16>>16==0)){c[h>>2]=f&65535;Jka(a,2216,h);i=g;return}if((b|0)==0){i=g;return}f=dd[c[c[b>>2]>>2]&511](b,d)|0;if((f|0)==0){i=g;return}pe(j,1290504);d=f+88|0;if((Zka(c[d>>2]|0,c[j>>2]|0,c[j+4>>2]|0)|0)!=0?(pe(k,1290512),(Zka(c[d>>2]|0,c[k>>2]|0,c[k+4>>2]|0)|0)!=0):0){k=Bu(f,e&65535)|0;if((k|0)==-1){i=g;return}xu(f,a,k);i=g;return}c[h>>2]=e&65535;Jka(a,2216,h);i=g;return}function Sm(a,b,d,e,f,h,j,k){a=a|0;b=b|0;d=+d;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0.0,Pa=0.0,Qa=0.0,Ra=0.0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0.0,Ya=0.0,Za=0.0,_a=0.0,$a=0.0;l=i;i=i+624|0;m=l+600|0;n=l+592|0;o=l+588|0;p=l+584|0;q=l+576|0;r=l+568|0;s=l+560|0;t=l+552|0;u=l+544|0;v=l+536|0;w=l+528|0;x=l+520|0;y=l+512|0;z=l+504|0;A=l+500|0;B=l+496|0;C=l+488|0;D=l+480|0;E=l+472|0;F=l+464|0;G=l+456|0;H=l+448|0;I=l+440|0;J=l+432|0;K=l+424|0;L=l+416|0;M=l+408|0;N=l+400|0;O=l+392|0;P=l+384|0;Q=l+376|0;R=l+368|0;S=l+364|0;T=l+360|0;U=l+352|0;V=l+344|0;W=l+336|0;X=l+328|0;Y=l+320|0;Z=l+312|0;_=l+304|0;$=l+296|0;aa=l+288|0;ba=l+280|0;ca=l+272|0;da=l+264|0;ea=l+256|0;fa=l+252|0;ga=l+248|0;ha=l+240|0;ia=l+232|0;ja=l+224|0;ka=l+216|0;la=l+208|0;ma=l+200|0;na=l+192|0;oa=l+184|0;pa=l+176|0;qa=l+168|0;ra=l+160|0;sa=l+152|0;ta=l+144|0;ua=l+140|0;va=l+136|0;wa=l+128|0;xa=l+120|0;ya=l+112|0;za=l+104|0;Aa=l+96|0;Ba=l+88|0;Ca=l+80|0;Da=l+72|0;Ea=l+64|0;Fa=l+60|0;Ga=l+56|0;Ha=l+48|0;Ia=l+40|0;Ja=l+32|0;Ka=l+24|0;La=l+16|0;Ma=l+8|0;Na=l;gla(m);c[n>>2]=0;Oa=+g[b>>2];Pa=+g[b+4>>2];Qa=+g[b+12>>2];Ra=+g[b+8>>2];if(!(d>0.0)){Sa=m+4|0;Ta=c[Sa>>2]|0;Ua=m+8|0;Va=c[Ua>>2]|0;pla(Na,Ta,Va);jka(a,Na);dka(n);Wa=c[Sa>>2]|0;ila(Wa);i=l;return}Xa=d*.5;if((j|0)==1){c[B>>2]=0;Tm(A,e,B);ika(n,A);dka(A);A=c[n>>2]|0;if((A|0)==0){Sa=m+4|0;Ta=c[Sa>>2]|0;Ua=m+8|0;Va=c[Ua>>2]|0;pla(Na,Ta,Va);jka(a,Na);dka(n);Wa=c[Sa>>2]|0;ila(Wa);i=l;return}if((c[A+4>>2]|0)<=0){Sa=m+4|0;Ta=c[Sa>>2]|0;Ua=m+8|0;Va=c[Ua>>2]|0;pla(Na,Ta,Va);jka(a,Na);dka(n);Wa=c[Sa>>2]|0;ila(Wa);i=l;return}oe(C,n);qla(m,c[C>>2]|0,c[C+4>>2]|0)|0;C=tla(m,d)|0;pe(D,1291984);A=qla(C,c[D>>2]|0,c[D+4>>2]|0)|0;pe(E,1291992);D=qla(A,c[E>>2]|0,c[E+4>>2]|0)|0;E=rla(D,c[k>>2]|0)|0;pe(F,1305864);D=qla(E,c[F>>2]|0,c[F+4>>2]|0)|0;F=rla(D,c[k+4>>2]|0)|0;pe(G,1292e3);D=qla(F,c[G>>2]|0,c[G+4>>2]|0)|0;G=rla(D,c[k+8>>2]|0)|0;pe(H,1292008);qla(G,c[H>>2]|0,c[H+4>>2]|0)|0;Ya=Xa+Oa;H=tla(m,Ya)|0;pe(I,1305864);Za=Xa+Ra;G=tla(qla(H,c[I>>2]|0,c[I+4>>2]|0)|0,Za)|0;pe(J,1293880);qla(G,c[J>>2]|0,c[J+4>>2]|0)|0;J=tla(m,Ya)|0;pe(K,1305864);_a=Qa-Xa;G=tla(qla(J,c[K>>2]|0,c[K+4>>2]|0)|0,_a)|0;pe(L,1293888);qla(G,c[L>>2]|0,c[L+4>>2]|0)|0;$a=Pa-Xa;L=tla(m,$a)|0;pe(M,1305864);G=tla(qla(L,c[M>>2]|0,c[M+4>>2]|0)|0,_a)|0;pe(N,1293888);qla(G,c[N>>2]|0,c[N+4>>2]|0)|0;N=tla(m,$a)|0;pe(O,1305864);G=tla(qla(N,c[O>>2]|0,c[O+4>>2]|0)|0,Za)|0;pe(P,1293888);qla(G,c[P>>2]|0,c[P+4>>2]|0)|0;P=tla(m,Ya)|0;pe(Q,1305864);G=tla(qla(P,c[Q>>2]|0,c[Q+4>>2]|0)|0,Za)|0;pe(R,1292016);qla(G,c[R>>2]|0,c[R+4>>2]|0)|0;Sa=m+4|0;Ta=c[Sa>>2]|0;Ua=m+8|0;Va=c[Ua>>2]|0;pla(Na,Ta,Va);jka(a,Na);dka(n);Wa=c[Sa>>2]|0;ila(Wa);i=l;return}else if((j|0)==3|(j|0)==2){c[T>>2]=1;Tm(S,f,T);ika(n,S);dka(S);S=c[n>>2]|0;if((S|0)!=0?(c[S+4>>2]|0)>0:0){oe(U,n);qla(m,c[U>>2]|0,c[U+4>>2]|0)|0;Za=Xa+Oa;U=tla(m,Za)|0;pe(V,1305864);S=tla(qla(U,c[V>>2]|0,c[V+4>>2]|0)|0,Xa+Ra)|0;pe(W,1293880);qla(S,c[W>>2]|0,c[W+4>>2]|0)|0;W=tla(m,Za)|0;pe(X,1305864);Za=Qa-Xa;S=tla(qla(W,c[X>>2]|0,c[X+4>>2]|0)|0,Za)|0;pe(Y,1293888);qla(S,c[Y>>2]|0,c[Y+4>>2]|0)|0;Y=tla(m,Pa-Xa)|0;pe(Z,1305864);S=tla(qla(Y,c[Z>>2]|0,c[Z+4>>2]|0)|0,Za)|0;pe(_,1293888);qla(S,c[_>>2]|0,c[_+4>>2]|0)|0;Za=Xa*2.0;_=tla(m,Pa-Za)|0;pe($,1305864);Ya=Qa-Za;S=tla(qla(_,c[$>>2]|0,c[$+4>>2]|0)|0,Ya)|0;pe(aa,1293888);qla(S,c[aa>>2]|0,c[aa+4>>2]|0)|0;$a=Za+Oa;aa=tla(m,$a)|0;pe(ba,1305864);S=tla(qla(aa,c[ba>>2]|0,c[ba+4>>2]|0)|0,Ya)|0;pe(ca,1293888);qla(S,c[ca>>2]|0,c[ca+4>>2]|0)|0;ca=tla(m,$a)|0;pe(da,1305864);S=tla(qla(ca,c[da>>2]|0,c[da+4>>2]|0)|0,Za+Ra)|0;pe(ea,1293896);qla(S,c[ea>>2]|0,c[ea+4>>2]|0)|0}c[ga>>2]=1;Tm(fa,h,ga);ika(n,fa);dka(fa);fa=c[n>>2]|0;if((fa|0)!=0?(c[fa+4>>2]|0)>0:0){oe(ha,n);qla(m,c[ha>>2]|0,c[ha+4>>2]|0)|0;Za=Pa-Xa;ha=tla(m,Za)|0;pe(ia,1305864);fa=tla(qla(ha,c[ia>>2]|0,c[ia+4>>2]|0)|0,Qa-Xa)|0;pe(ja,1293880);qla(fa,c[ja>>2]|0,c[ja+4>>2]|0)|0;ja=tla(m,Za)|0;pe(ka,1305864);Za=Xa+Ra;fa=tla(qla(ja,c[ka>>2]|0,c[ka+4>>2]|0)|0,Za)|0;pe(la,1293888);qla(fa,c[la>>2]|0,c[la+4>>2]|0)|0;la=tla(m,Xa+Oa)|0;pe(ma,1305864);fa=tla(qla(la,c[ma>>2]|0,c[ma+4>>2]|0)|0,Za)|0;pe(na,1293888);qla(fa,c[na>>2]|0,c[na+4>>2]|0)|0;Za=Xa*2.0;na=tla(m,Za+Oa)|0;pe(oa,1305864);$a=Za+Ra;fa=tla(qla(na,c[oa>>2]|0,c[oa+4>>2]|0)|0,$a)|0;pe(pa,1293888);qla(fa,c[pa>>2]|0,c[pa+4>>2]|0)|0;Ya=Pa-Za;pa=tla(m,Ya)|0;pe(qa,1305864);fa=tla(qla(pa,c[qa>>2]|0,c[qa+4>>2]|0)|0,$a)|0;pe(ra,1293888);qla(fa,c[ra>>2]|0,c[ra+4>>2]|0)|0;ra=tla(m,Ya)|0;pe(sa,1305864);fa=tla(qla(ra,c[sa>>2]|0,c[sa+4>>2]|0)|0,Qa-Za)|0;pe(ta,1293896);qla(fa,c[ta>>2]|0,c[ta+4>>2]|0)|0}c[va>>2]=1;Tm(ua,e,va);ika(n,ua);dka(ua);ua=c[n>>2]|0;if((ua|0)==0){Sa=m+4|0;Ta=c[Sa>>2]|0;Ua=m+8|0;Va=c[Ua>>2]|0;pla(Na,Ta,Va);jka(a,Na);dka(n);Wa=c[Sa>>2]|0;ila(Wa);i=l;return}if((c[ua+4>>2]|0)<=0){Sa=m+4|0;Ta=c[Sa>>2]|0;Ua=m+8|0;Va=c[Ua>>2]|0;pla(Na,Ta,Va);jka(a,Na);dka(n);Wa=c[Sa>>2]|0;ila(Wa);i=l;return}oe(wa,n);qla(m,c[wa>>2]|0,c[wa+4>>2]|0)|0;wa=tla(m,Oa)|0;pe(xa,1305864);ua=tla(qla(wa,c[xa>>2]|0,c[xa+4>>2]|0)|0,Ra)|0;pe(ya,1305864);Za=Pa-Oa;xa=tla(qla(ua,c[ya>>2]|0,c[ya+4>>2]|0)|0,Za)|0;pe(za,1305864);Ya=Qa-Ra;ya=tla(qla(xa,c[za>>2]|0,c[za+4>>2]|0)|0,Ya)|0;pe(Aa,1291968);qla(ya,c[Aa>>2]|0,c[Aa+4>>2]|0)|0;Aa=tla(m,Xa+Oa)|0;pe(Ba,1305864);ya=tla(qla(Aa,c[Ba>>2]|0,c[Ba+4>>2]|0)|0,Xa+Ra)|0;pe(Ca,1305864);$a=Xa*2.0;Ba=tla(qla(ya,c[Ca>>2]|0,c[Ca+4>>2]|0)|0,Za-$a)|0;pe(Da,1305864);Ca=tla(qla(Ba,c[Da>>2]|0,c[Da+4>>2]|0)|0,Ya-$a)|0;pe(Ea,1292024);qla(Ca,c[Ea>>2]|0,c[Ea+4>>2]|0)|0;Sa=m+4|0;Ta=c[Sa>>2]|0;Ua=m+8|0;Va=c[Ua>>2]|0;pla(Na,Ta,Va);jka(a,Na);dka(n);Wa=c[Sa>>2]|0;ila(Wa);i=l;return}else if((j|0)==4){c[Ga>>2]=0;Tm(Fa,e,Ga);ika(n,Fa);dka(Fa);Fa=c[n>>2]|0;if((Fa|0)==0){Sa=m+4|0;Ta=c[Sa>>2]|0;Ua=m+8|0;Va=c[Ua>>2]|0;pla(Na,Ta,Va);jka(a,Na);dka(n);Wa=c[Sa>>2]|0;ila(Wa);i=l;return}if((c[Fa+4>>2]|0)<=0){Sa=m+4|0;Ta=c[Sa>>2]|0;Ua=m+8|0;Va=c[Ua>>2]|0;pla(Na,Ta,Va);jka(a,Na);dka(n);Wa=c[Sa>>2]|0;ila(Wa);i=l;return}oe(Ha,n);qla(m,c[Ha>>2]|0,c[Ha+4>>2]|0)|0;Ha=tla(m,d)|0;pe(Ia,1292032);qla(Ha,c[Ia>>2]|0,c[Ia+4>>2]|0)|0;Ia=tla(m,Oa)|0;pe(Ja,1305864);$a=Xa+Ra;Ha=tla(qla(Ia,c[Ja>>2]|0,c[Ja+4>>2]|0)|0,$a)|0;pe(Ka,1293880);qla(Ha,c[Ka>>2]|0,c[Ka+4>>2]|0)|0;Ka=tla(m,Pa)|0;pe(La,1305864);Ha=tla(qla(Ka,c[La>>2]|0,c[La+4>>2]|0)|0,$a)|0;pe(Ma,1292016);qla(Ha,c[Ma>>2]|0,c[Ma+4>>2]|0)|0;Sa=m+4|0;Ta=c[Sa>>2]|0;Ua=m+8|0;Va=c[Ua>>2]|0;pla(Na,Ta,Va);jka(a,Na);dka(n);Wa=c[Sa>>2]|0;ila(Wa);i=l;return}else{c[p>>2]=1;Tm(o,e,p);ika(n,o);dka(o);o=c[n>>2]|0;if((o|0)==0){Sa=m+4|0;Ta=c[Sa>>2]|0;Ua=m+8|0;Va=c[Ua>>2]|0;pla(Na,Ta,Va);jka(a,Na);dka(n);Wa=c[Sa>>2]|0;ila(Wa);i=l;return}if((c[o+4>>2]|0)<=0){Sa=m+4|0;Ta=c[Sa>>2]|0;Ua=m+8|0;Va=c[Ua>>2]|0;pla(Na,Ta,Va);jka(a,Na);dka(n);Wa=c[Sa>>2]|0;ila(Wa);i=l;return}oe(q,n);qla(m,c[q>>2]|0,c[q+4>>2]|0)|0;q=tla(m,Oa)|0;pe(r,1305864);o=tla(qla(q,c[r>>2]|0,c[r+4>>2]|0)|0,Ra)|0;pe(s,1305864);$a=Pa-Oa;r=tla(qla(o,c[s>>2]|0,c[s+4>>2]|0)|0,$a)|0;pe(t,1305864);Pa=Qa-Ra;s=tla(qla(r,c[t>>2]|0,c[t+4>>2]|0)|0,Pa)|0;pe(u,1291968);qla(s,c[u>>2]|0,c[u+4>>2]|0)|0;u=tla(m,Oa+d)|0;pe(v,1305864);s=tla(qla(u,c[v>>2]|0,c[v+4>>2]|0)|0,Ra+d)|0;pe(w,1305864);Ra=d*2.0;v=tla(qla(s,c[w>>2]|0,c[w+4>>2]|0)|0,$a-Ra)|0;pe(x,1305864);w=tla(qla(v,c[x>>2]|0,c[x+4>>2]|0)|0,Pa-Ra)|0;pe(y,1291968);qla(w,c[y>>2]|0,c[y+4>>2]|0)|0;pe(z,1291976);qla(m,c[z>>2]|0,c[z+4>>2]|0)|0;Sa=m+4|0;Ta=c[Sa>>2]|0;Ua=m+8|0;Va=c[Ua>>2]|0;pla(Na,Ta,Va);jka(a,Na);dka(n);Wa=c[Sa>>2]|0;ila(Wa);i=l;return}}function Tm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;e=i;i=i+144|0;f=e+120|0;h=e+112|0;j=e+104|0;k=e+96|0;l=e+88|0;m=e+80|0;n=e+72|0;o=e+64|0;p=e+56|0;q=e+48|0;r=e+40|0;s=e+32|0;t=e+24|0;u=e+16|0;v=e+8|0;w=e;gla(f);x=c[b>>2]|0;if((x|0)==3){y=tla(f,+g[b+4>>2])|0;pe(q,1305864);z=qla(y,c[q>>2]|0,c[q+4>>2]|0)|0;q=tla(z,+g[b+8>>2])|0;pe(r,1305864);z=qla(q,c[r>>2]|0,c[r+4>>2]|0)|0;r=tla(z,+g[b+12>>2])|0;pe(s,1305864);z=qla(r,c[s>>2]|0,c[s+4>>2]|0)|0;s=tla(z,+g[b+16>>2])|0;pe(t,1305864);z=qla(s,c[t>>2]|0,c[t+4>>2]|0)|0;pe(u,(c[d>>2]|0)!=0?1291952:1291960);t=qla(z,c[u>>2]|0,c[u+4>>2]|0)|0;pe(v,1291928);qla(t,c[v>>2]|0,c[v+4>>2]|0)|0}else if((x|0)==2){v=tla(f,+g[b+4>>2])|0;pe(h,1305864);t=qla(v,c[h>>2]|0,c[h+4>>2]|0)|0;h=tla(t,+g[b+8>>2])|0;pe(j,1305864);t=qla(h,c[j>>2]|0,c[j+4>>2]|0)|0;j=tla(t,+g[b+12>>2])|0;pe(k,1305864);t=qla(j,c[k>>2]|0,c[k+4>>2]|0)|0;pe(l,(c[d>>2]|0)!=0?1291912:1291920);k=qla(t,c[l>>2]|0,c[l+4>>2]|0)|0;pe(m,1291928);qla(k,c[m>>2]|0,c[m+4>>2]|0)|0}else if((x|0)==1){x=tla(f,+g[b+4>>2])|0;pe(n,1305864);b=qla(x,c[n>>2]|0,c[n+4>>2]|0)|0;pe(o,(c[d>>2]|0)!=0?1291936:1291944);d=qla(b,c[o>>2]|0,c[o+4>>2]|0)|0;pe(p,1291928);qla(d,c[p>>2]|0,c[p+4>>2]|0)|0}p=f+4|0;pla(w,c[p>>2]|0,c[f+8>>2]|0);jka(a,w);ila(c[p>>2]|0);i=e;return}function Um(a){a=a|0;var d=0,e=0,f=0;d=i;b[a>>1]=0;c[a+4>>2]=0;c[a+8>>2]=-1;c[a+12>>2]=-1;c[a+16>>2]=-1;e=a+20|0;g[a+44>>2]=0.0;f=a+48|0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[f>>2]=-1;f=a+52|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;i=d;return}function Vm(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d+8|0;f=d;oe(e,b);pe(f,c);lka(a,e,f);i=d;return}function Wm(){var a=0,b=0;a=i;b=u2a(32)|0;Dh(b);i=a;return b|0}function Xm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0;d=i;e=a+4|0;f=a+8|0;h=a+12|0;j=a+16|0;k=b+16|0;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;l=c[k>>2]|0;if((l|0)==3){m=+DH(b,0);n=+DH(b,1);o=+DH(b,2);c[a>>2]=2;g[e>>2]=m;g[f>>2]=n;g[h>>2]=o;g[j>>2]=0.0;i=d;return}else if((l|0)==1){o=+DH(b,0);c[a>>2]=1;g[e>>2]=o;g[f>>2]=0.0;g[h>>2]=0.0;g[j>>2]=0.0;i=d;return}else if((l|0)==4){o=+DH(b,0);n=+DH(b,1);m=+DH(b,2);p=+DH(b,3);c[a>>2]=3;g[e>>2]=o;g[f>>2]=n;g[h>>2]=m;g[j>>2]=p;i=d;return}else{i=d;return}}function Ym(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;e=u2a(36)|0;zI(e,a,b,c);i=d;return e|0}function Zm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;do{if(((a|0)!=0?(c[a>>2]|0)==5:0)?(e=GH(a,0)|0,(e|0)!=0):0){f=c[e>>2]|0;if((f|0)==2){g=jH(e)|0;break}else if((f|0)==6){g=UG(b,c[e+4>>2]|0)|0;break}else{g=0;break}}else{g=0}}while(0);i=d;return g|0}function _m(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;i=i+16|0;e=d+4|0;f=d;if((b|0)==0){g=0;i=d;return g|0}if((c[b>>2]|0)!=5){g=0;i=d;return g|0}c[e>>2]=0;h=GH(b,1)|0;if((h|0)==0){c[f>>2]=0;j=1;k=0}else{dH(f,h);j=0;k=1}ika(e,f);if(j){dka(f)}if(k){dka(f);l=0}else{l=0}while(1){f=c[2336+(l<<2)>>2]|0;if((a[f>>0]|0)==0){m=0;break}k=l+1|0;if(ah(e,f)|0){m=k;break}else{l=k}}dka(e);g=m;i=d;return g|0}function $m(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e+8|0;g=e;h=b+52|0;b=c[h>>2]|0;if((b|0)!=0?(c[f>>2]=2376,c[f+4>>2]=5,(iI(b,f)|0)!=0):0){f=c[h>>2]|0;c[g>>2]=2376;c[g+4>>2]=5;c[a>>2]=iI(iI(f,g)|0,d)|0;i=e;return}c[a>>2]=0;i=e;return}function an(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;f=i;i=i+80|0;g=f+72|0;h=f+68|0;j=f+64|0;k=f+56|0;l=f+48|0;m=f+40|0;n=f+32|0;o=f+24|0;p=f+16|0;q=f+8|0;r=f;if((e|0)>32){s=0;i=f;return s|0}c[g>>2]=2456;c[g+4>>2]=6;t=jI(a,g)|0;do{if((t|0)!=0){HH(h,t,0);HH(j,t,1);oe(k,j);if((Zka(c[h>>2]|0,c[k>>2]|0,c[k+4>>2]|0)|0)>0){hka(l,j);ika(j,h);ika(h,l);dka(l)}oe(m,h);if((Zka(c[b>>2]|0,c[m>>2]|0,c[m+4>>2]|0)|0)<0){dka(j);dka(h);s=0;i=f;return s|0}else{oe(n,j);g=(Zka(c[b>>2]|0,c[n>>2]|0,c[n+4>>2]|0)|0)>0;dka(j);dka(h);if(g){s=0}else{break}i=f;return s|0}}}while(0);c[o>>2]=2376;c[o+4>>2]=5;h=jI(a,o)|0;if((h|0)==0){c[r>>2]=38832;c[r+4>>2]=4;o=jI(a,r)|0;if((o|0)==0){s=0;i=f;return s|0}r=e+1|0;e=o+16|0;if((c[e>>2]|0)==0){s=0;i=f;return s|0}else{u=0}while(1){a=KH(o,u)|0;if((a|0)!=0?(j=an(a,b,d,r)|0,(j|0)!=0):0){s=j;v=22;break}u=u+1|0;if(!(u>>>0<(c[e>>2]|0)>>>0)){s=0;v=22;break}}if((v|0)==22){i=f;return s|0}}e=(c[h+16>>2]|0)>>>1;a:do{if((e|0)!=0){u=q+4|0;r=0;while(1){w=r<<1;HH(p,h,w);oe(q,b);o=Zka(c[p>>2]|0,c[q>>2]|0,c[u>>2]|0)|0;if((o|0)>=1){v=13;break}if((o|0)>=0){break}dka(p);o=r+1|0;if(o>>>0<e>>>0){r=o}else{break a}}if((v|0)==13){dka(p);break}c[d>>2]=(c[d>>2]|0)+r;u=GH(h,w|1)|0;dka(p);s=u;i=f;return s|0}}while(0);c[d>>2]=(c[d>>2]|0)+e;s=0;i=f;return s|0}function bn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;if((a|0)==0){f=0;i=d;return f|0}c[e>>2]=0;f=an(a,b,e,0)|0;i=d;return f|0}function cn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+32|0;f=e+16|0;g=e+8|0;h=e;jka(f,d);j=bn(c[a>>2]|0,f)|0;dka(f);if((j|0)==0){f=c[b+52>>2]|0;c[g>>2]=2384;c[g+4>>2]=5;b=iI(f,g)|0;if((b|0)==0){k=0;i=e;return k|0}g=$H(b,d)|0;if((g|0)==0){k=0;i=e;return k|0}else{l=g}}else{l=j}j=c[l>>2]|0;if((j|0)==5){k=l;i=e;return k|0}else if((j|0)==6){c[h>>2]=37032;c[h+4>>2]=1;k=jI(l,h)|0;i=e;return k|0}else{k=0;i=e;return k|0}return 0}function dn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;d=i;i=i+160|0;e=d+144|0;f=d+136|0;g=d+132|0;h=d+128|0;j=d+120|0;k=d+112|0;l=d+104|0;m=d+96|0;n=d+88|0;o=d+84|0;p=d+80|0;q=d+72|0;r=d+64|0;s=d+60|0;t=d+56|0;u=d+48|0;v=d+40|0;w=d+36|0;x=d+32|0;y=d+24|0;z=d+16|0;A=d+12|0;B=d+8|0;C=d;if((a|0)==0){i=d;return}do{if((c[a>>2]|0)==6){c[f>>2]=2392;c[f+4>>2]=2;cI(e,a,f);Pna(b,e);Lna(e);if((dg(c[b>>2]|0)|0)!=0){c[j>>2]=37048;c[j+4>>2]=1;aI(h,a,j);D=c[h>>2]|0;moa(g,(D|0)==0?1305928:D+12|0);Pna(b,g);Lna(g);dka(h)}c[l>>2]=2400;c[l+4>>2]=2;aI(k,a,l);c[m>>2]=2408;c[m+4>>2]=3;D=vka(c[k>>2]|0,m)|0;dka(k);if(D){i=d;return}if((dg(c[b>>2]|0)|0)!=0){c[n>>2]=2416;c[n+4>>2]=3;if((nI(a,n)|0)!=0){c[q>>2]=2416;c[q+4>>2]=3;aI(p,a,q);D=c[p>>2]|0;moa(o,(D|0)==0?1305928:D+12|0);Pna(b,o);Lna(o);dka(p);break}c[r>>2]=2424;c[r+4>>2]=3;if((nI(a,r)|0)!=0){c[u>>2]=2424;c[u+4>>2]=3;aI(t,a,u);D=c[t>>2]|0;moa(s,(D|0)==0?1305928:D+12|0);Pna(b,s);Lna(s);dka(t);break}c[v>>2]=2432;c[v+4>>2]=4;if((nI(a,v)|0)==0){i=d;return}else{c[y>>2]=2432;c[y+4>>2]=4;aI(x,a,y);D=c[x>>2]|0;moa(w,(D|0)==0?1305928:D+12|0);Pna(b,w);Lna(w);dka(x);break}}}else{dH(A,a);D=c[A>>2]|0;moa(z,(D|0)==0?1305928:D+12|0);Pna(b,z);Lna(z);dka(A)}}while(0);Ah(C,b);if((c[C+4>>2]|0)<2){c[B>>2]=0}else{Rna(B,C)}Pna(b,B);Lna(B);i=d;return}function en(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;i=i+32|0;d=b+16|0;e=b+8|0;f=b;g=Wm()|0;c[a>>2]=g;if((g|0)==0){i=b;return}c[d>>2]=669480;c[d+4>>2]=4;c[f>>2]=2440;c[f+4>>2]=8;jka(e,f);tI(g,d,e);dka(e);i=b;return}function fn(a,b){a=a|0;b=b|0;var d=0;d=i;if((c[b+4>>2]|0)<2){c[a>>2]=0;i=d;return}else{Rna(a,b);i=d;return}}function gn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+48|0;e=d+40|0;f=d+36|0;g=d+32|0;h=d+24|0;j=d+16|0;k=d+8|0;l=d;c[e>>2]=0;fn(f,b);Pna(e,f);Lna(f);f=c[a>>2]|0;if((f|0)==6){c[h>>2]=37048;c[h+4>>2]=1;b=c[e>>2]|0;Yka(j,b);uI(a,h,j);dka(j);c[k>>2]=2392;c[k+4>>2]=2;DG(l,(b|0)==0?1292088:b+12|0,-1);uI(a,k,l);dka(l);Lna(e);i=d;return}else if((f|0)==3){Yka(g,c[e>>2]|0);nH(a,g);dka(g);Lna(e);i=d;return}else{Lna(e);i=d;return}}function hn(a){a=a|0;var b=0,d=0;b=i;d=a+4|0;$n(d);c[d>>2]=0;c[a+28>>2]=0;i=b;return}function jn(a){a=a|0;var b=0;b=i;kn(a);_n(a+4|0);i=b;return}function kn(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+8|0;e=a+12|0;if((c[e>>2]|0)>0){f=0}else{i=b;return}do{mn(c[(Hg(d,f)|0)>>2]|0,0);f=f+1|0}while((f|0)<(c[e>>2]|0));i=b;return}function ln(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;if((a|0)==0){e=0;i=d;return e|0}f=u2a(28)|0;$n(f);if((f|0)==0){e=0;i=d;return e|0}c[f>>2]=a;Pna(f+20|0,b);c[f+24>>2]=0;yg(a+4|0,f);e=f;i=d;return e|0}function mn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;if((a|0)==0){i=d;return}if((b|0)>32){_n(a);v2a(a);i=d;return}e=a+4|0;f=a+8|0;if((c[f>>2]|0)>0){g=b+1|0;b=0;do{mn(c[(Hg(e,b)|0)>>2]|0,g);b=b+1|0}while((b|0)<(c[f>>2]|0))}_n(a);v2a(a);i=d;return}function nn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=i;if((a|0)==0){e=0;i=d;return e|0}f=a+4|0;g=a+8|0;if((c[g>>2]|0)<=0){e=0;i=d;return e|0}a=0;while(1){h=c[(Hg(f,a)|0)>>2]|0;j=c[h+20>>2]|0;k=(j|0)==0;if(k){l=0}else{l=c[j+4>>2]|0}m=c[b>>2]|0;n=(m|0)==0;if(n){o=0}else{o=c[m+4>>2]|0}if((l|0)==(o|0)){if(n){p=0}else{p=c[m+4>>2]<<2}if((Q2a(k?1292088:j+12|0,n?1292088:m+12|0,p)|0)==0){e=h;q=13;break}}a=a+1|0;if((a|0)>=(c[g>>2]|0)){e=0;q=13;break}}if((q|0)==13){i=d;return e|0}return 0}function on(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;i=i+32|0;f=e+12|0;g=e+8|0;h=e+4|0;j=e;if(aoa(b,1292088)|0){i=e;return}Zn(f,b);pn(f,g,h);b=a+4|0;a=c[h>>2]|0;if((a|0)>0){k=a;l=b}else{i=e;return}while(1){Mna(j,c[g>>2]|0,k);a=nn(l,j)|0;if((a|0)==0){m=ln(l,j)|0}else{m=a}pn(f,g,h);Lna(j);k=c[h>>2]|0;if((k|0)<=0){break}else{l=m}}if((m|0)==(b|0)){i=e;return}c[m+24>>2]=d;i=e;return}function pn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;f=a+8|0;g=c[f>>2]|0;c[b>>2]=g;h=c[f>>2]|0;j=a+4|0;a=c[j>>2]|0;if(h>>>0<a>>>0){k=h;while(1){if((c[k>>2]|0)==46){l=k;break}m=k+4|0;c[f>>2]=m;if(m>>>0<a>>>0){k=m}else{l=m;break}}n=l;o=c[b>>2]|0}else{n=h;o=g}c[d>>2]=n-o>>2;o=c[f>>2]|0;if(!(o>>>0<(c[j>>2]|0)>>>0)){i=e;return}if((c[o>>2]|0)!=46){i=e;return}c[f>>2]=o+4;i=e;return}function qn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+32|0;e=d+12|0;f=d+8|0;g=d+4|0;h=d;if(aoa(b,1292088)|0){j=0;i=d;return j|0}Zn(e,b);pn(e,f,g);b=a+4|0;a=c[g>>2]|0;if((a|0)>0){k=a;a=b;do{Mna(h,c[f>>2]|0,k);a=nn(a,h)|0;pn(e,f,g);Lna(h);k=c[g>>2]|0}while((k|0)>0&(a|0)!=0);if((a|0)==0){j=0;i=d;return j|0}else{l=a}}else{l=b}j=c[l+24>>2]|0;i=d;return j|0}function rn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+32|0;e=d+12|0;f=d+8|0;g=d+4|0;h=d;if(aoa(b,1292088)|0){j=0;i=d;return j|0}Zn(e,b);pn(e,f,g);b=a+4|0;a=c[g>>2]|0;if((a|0)>0){k=a;l=b}else{j=b;i=d;return j|0}while(1){Mna(h,c[f>>2]|0,k);b=nn(l,h)|0;pn(e,f,g);Lna(h);k=c[g>>2]|0;if(!((k|0)>0&(b|0)!=0)){j=b;break}else{l=b}}i=d;return j|0}function sn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+16|0;f=e+8|0;g=e;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;Ija(a,16);zma(a+28|0,10);c[a+56>>2]=0;h=a+16|0;c[h>>2]=b;c[a+20>>2]=d;c[a+60>>2]=0;c[a+64>>2]=0;d=u2a(32)|0;hn(d);c[a+52>>2]=d;d=c[(c[h>>2]|0)+52>>2]|0;pe(f,669448);h=iI(d,f)|0;c[a+24>>2]=h;if((h|0)==0){i=e;return}pe(g,2464);f=jI(h,g)|0;if((f|0)==0){i=e;return}g=c[f+16>>2]|0;if((g|0)>0){j=0}else{i=e;return}do{tn(a,KH(f,j)|0,0);j=j+1|0}while((j|0)<(g|0));i=e;return}function tn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+32|0;f=e+16|0;g=e+8|0;h=e;if((d|0)>32|(b|0)==0){i=e;return}j=c[b+4>>2]|0;pe(f,38832);k=jI(b,f)|0;if((k|0)==0){Kn(a,b);i=e;return}f=KH(k,0)|0;if((f|0)==0){i=e;return}pe(g,38664);if((nI(f,g)|0)==0?(pe(h,38832),(nI(f,h)|0)==0):0){Kn(a,b);i=e;return}b=k+16|0;if((c[b>>2]|0)==0){i=e;return}h=d+1|0;d=0;do{f=KH(k,d)|0;if((f|0)!=0?(c[f+4>>2]|0)!=(j|0):0){tn(a,f,h)}d=d+1|0}while(d>>>0<(c[b>>2]|0)>>>0);i=e;return}function un(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;i=i+16|0;d=b+8|0;e=b+4|0;f=b;g=a+28|0;h=(c[a+36>>2]|0)==0;c[d>>2]=h?0:-1;if(!h){do{Cma(g,d,e,f);v2a(c[f>>2]|0)}while((c[d>>2]|0)!=0)}d=a+52|0;f=c[d>>2]|0;if((f|0)!=0){e=vn(f+4|0,0)|0;f=c[d>>2]|0;if((e|0)>0){h=f;j=0;while(1){k=wn(h+4|0,j)|0;if((k|0)!=0){Go(k);v2a(k)}j=j+1|0;k=c[d>>2]|0;if((j|0)>=(e|0)){l=k;break}else{h=k}}}else{l=f}if((l|0)!=0){jn(l);v2a(l)}}dka(a+56|0);Bma(g);yna(a);i=b;return}function vn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;if((b|0)<=32){if((c[a+24>>2]|0)==0){e=a+8|0;if((c[e>>2]|0)>0){f=a+4|0;a=b+1|0;b=0;g=0;while(1){h=(vn(Ch(f,g)|0,a)|0)+b|0;g=g+1|0;if((g|0)>=(c[e>>2]|0)){j=h;break}else{b=h}}}else{j=0}}else{j=1}}else{j=0}i=d;return j|0}function wn(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;c[e>>2]=b;b=Yn(a,e)|0;i=d;return b|0}function xn(){return c[618]|0}function yn(a){a=a|0;c[618]=a;return}function zn(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;f=i;i=i+48|0;g=f;h=f+40|0;j=f+36|0;k=f+32|0;l=f+24|0;m=f+16|0;n=f+8|0;o=f+4|0;eka(h,e,-1);eka(j,669472,-1);e=c[h>>2]|0;if(!((e|0)!=0?(c[e+4>>2]|0)!=0:0)){p=3}do{if((p|0)==3){if(ah(j,36960)|0){mka(h,2480);break}if(ah(j,39808)|0){mka(h,39688);break}if(ah(j,669472)|0){mka(h,2488);break}else{mka(h,2496);break}}}while(0);hka(k,h);p=c[h>>2]|0;e=(p|0)==0;if(e){q=0}else{q=c[p+4>>2]|0}mka(k,1305928);r=0;while(1){s=(r|0)<4;if(!(s&(r|0)<(q|0))){break}if(e){t=0}else{t=a[p+r+12>>0]|0}tka(k,t);r=r+1|0}if(s){s=r;while(1){tka(k,((s|0)%10|0)+48&255);t=s+1|0;if((t|0)<4){s=t}else{u=t;break}}}else{u=r}if((d|0)==0){hka(b,k);dka(k);dka(j);dka(h);i=f;return}pe(l,669472);r=iI(d,l)|0;if((r|0)==0){hka(b,k);dka(k);dka(j);dka(h);i=f;return}c[m>>2]=0;l=u;u=0;while(1){ag(o,k,m);oe(n,o);d=nI(r,n)|0;dka(o);if((d|0)==0){break}if((l|0)<(q|0)){if(e){v=0}else{v=a[p+l+12>>0]|0}tka(k,v);w=l+1|0;x=u}else{c[g>>2]=u;Jka(m,2664,g);w=l;x=u+1|0}l=w+1|0;u=x}ag(b,k,m);dka(m);dka(k);dka(j);dka(h);i=f;return}function An(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+1024|0;e=d;if((a|0)==0){f=0;i=d;return f|0}if(gl(c[b>>2]|0)|0){f=0;i=d;return f|0}if(ah(b,1290512)|0){g=c[b>>2]|0;f=ju(a,(g|0)==0?1305928:g+12|0,0)|0;i=d;return f|0}else{jv(e,1);g=c[b>>2]|0;f=ju(a,(g|0)==0?1305928:g+12|0,e)|0;i=d;return f|0}return 0}function Bn(a){a=a|0;c[a>>2]=0;return}function Cn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=aoa(b,1292088)|0;f=c[a+52>>2]|0;if(e){g=wn(f+4|0,0)|0;i=d;return g|0}e=rn(f,b)|0;if((e|0)==0){g=0;i=d;return g|0}g=wn(e,0)|0;i=d;return g|0}function Dn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;a:do{if((b|0)!=0?(e=a+52|0,f=vn((c[e>>2]|0)+4|0,0)|0,(f|0)>0):0){g=0;while(1){if((wn((c[e>>2]|0)+4|0,g)|0)==(b|0)){h=1;break a}g=g+1|0;if((g|0)>=(f|0)){h=0;break}}}else{h=0}}while(0);i=d;return h|0}function En(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;c[e>>2]=0;Dma(a+28|0,b,e)|0;i=d;return c[e>>2]|0}function Fn(a){a=a|0;var b=0,c=0,d=0;b=i;i=i+16|0;c=b;if((a|0)==0){d=0;i=b;return d|0}pe(c,2504);d=hI(a,c,0)|0;i=b;return d|0}function Gn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d+12|0;f=d+8|0;g=d;c[e>>2]=0;if((b|0)==0){Xn(a,e);dka(e);i=d;return}else{pe(g,669512);aI(f,b,g);ika(e,f);dka(f);Xn(a,e);dka(e);i=d;return}}function Hn(a){a=a|0;var b=0,c=0,d=0;b=i;i=i+16|0;c=b;if((a|0)==0){d=0;i=b;return d|0}pe(c,22808);d=fI(a,c,0)|0;i=b;return d|0}function In(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;f=a+60|0;g=c[f>>2]|0;if((g|0)!=0?(dd[c[(c[g>>2]|0)+28>>2]&511](g,a)|0)<0:0){h=0;i=e;return h|0}g=a+52|0;j=vn((c[g>>2]|0)+4|0,0)|0;if((j|0)>0){k=b+4|0;l=(d|0)==0;d=0;do{m=wn((c[g>>2]|0)+4|0,d)|0;a:do{if((m|0)!=0){n=c[k>>2]|0;b:do{if((n|0)>0){o=0;while(1){if((m|0)==(Qg(b,o)|0)){break}o=o+1|0;if((o|0)>=(n|0)){p=10;break b}}if(l){break a}}else{p=10}}while(0);if((p|0)==10?(p=0,!l):0){break}Io(m)}}while(0);d=d+1|0}while((d|0)!=(j|0))}j=c[f>>2]|0;if((j|0)==0){h=1;i=e;return h|0}dd[c[(c[j>>2]|0)+32>>2]&511](j,a)|0;h=1;i=e;return h|0}function Jn(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;d=a+60|0;e=c[d>>2]|0;if((e|0)!=0?(dd[c[(c[e>>2]|0)+28>>2]&511](e,a)|0)<0:0){f=0;i=b;return f|0}e=a+52|0;g=vn((c[e>>2]|0)+4|0,0)|0;if((g|0)>0){h=0;do{j=wn((c[e>>2]|0)+4|0,h)|0;if((j|0)!=0){Io(j)}h=h+1|0}while((h|0)!=(g|0))}g=c[d>>2]|0;if((g|0)==0){f=1;i=b;return f|0}dd[c[(c[g>>2]|0)+32>>2]&511](g,a)|0;f=1;i=b;return f|0}function Kn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;d=i;i=i+192|0;e=d+176|0;f=d+168|0;g=d+160|0;h=d+152|0;j=d+144|0;k=d+136|0;l=d+128|0;m=d+120|0;n=d+112|0;o=d+104|0;p=d+96|0;q=d+88|0;r=d+80|0;s=d+72|0;t=d+64|0;u=d+56|0;v=d+48|0;w=d+40|0;x=d+32|0;y=d+24|0;z=d+16|0;A=d+8|0;B=d;c[e>>2]=38664;c[e+4>>2]=1;if((nI(b,e)|0)==0){i=d;return}Ap(f,b);do{if((dg(c[f>>2]|0)|0)==0){e=a+52|0;C=qn(c[e>>2]|0,f)|0;if((C|0)==0){pe(g,38664);if((nI(b,g)|0)==0?(c[j>>2]=669432,c[j+4>>2]=7,aI(h,b,j),c[k>>2]=669440,c[k+4>>2]=6,D=vka(c[h>>2]|0,k)|0,dka(h),D):0){c[l>>2]=38824;c[l+4>>2]=6;D=iI(b,l)|0;E=(D|0)==0?b:D;if(!((E|0)==0|(E|0)==(b|0))?(c[m>>2]=38400,c[m+4>>2]=2,(nI(E,m)|0)==0):0){c[n>>2]=38400;c[n+4>>2]=2;if((nI(b,n)|0)!=0?(c[o>>2]=38400,c[o+4>>2]=2,D=$H(b,o)|0,(D|0)!=0):0){c[p>>2]=38400;c[p+4>>2]=2;oI(E,p,pH(D,0)|0,0)}c[q>>2]=2584;c[q+4>>2]=2;if((nI(b,q)|0)!=0?(c[r>>2]=2584,c[r+4>>2]=2,D=$H(b,r)|0,(D|0)!=0):0){c[s>>2]=2584;c[s+4>>2]=2;oI(E,s,pH(D,0)|0,0);F=E}else{F=E}}else{F=E}}else{F=b}E=u2a(40)|0;Eo(E,a,F);pe(t,38664);D=_H(b,t)|0;do{if((D|0)!=0?(c[D>>2]|0)==9:0){G=pH(D,1)|0;if((G|0)==0){pe(v,38664);eka(w,1305928,-1);tI(b,v,w);dka(w);break}else{pe(u,38664);oI(b,u,G,0);break}}}while(0);on(c[e>>2]|0,f,E);H=E}else{H=C}pe(x,38832);D=jI(b,x)|0;if((D|0)==0){pe(z,669432);aI(y,b,z);G=ah(y,669440)|0;dka(y);if(!G){break}Nn(a,H,b);break}G=D+16|0;if((c[G>>2]|0)!=0){I=0;do{J=KH(D,I)|0;if((J|0)!=0?(pe(B,669432),aI(A,J,B),K=yl(A,669440)|0,dka(A),!K):0){Nn(a,H,J)}I=I+1|0}while(I>>>0<(c[G>>2]|0)>>>0)}}}while(0);Lna(f);i=d;return}function Ln(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;i=i+16|0;d=b;if((a|0)==0){e=0;f=e&1;i=b;return f|0}c[d>>2]=2520;c[d+4>>2]=3;e=(jI(a,d)|0)!=0;f=e&1;i=b;return f|0}function Mn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+32|0;e=d+16|0;f=d+8|0;g=d;if((b|0)==0){i=d;return}c[e>>2]=38856;c[e+4>>2]=6;h=jI(b,e)|0;if((h|0)==0){i=d;return}e=c[h+16>>2]|0;if((e|0)<=0){i=d;return}b=g+4|0;j=0;do{k=KH(h,j)|0;if((k|0)!=0?(c[g>>2]=669432,c[b>>2]=7,aI(f,k,g),l=ah(f,669440)|0,dka(f),l):0){tn(a,k,0)}j=j+1|0}while((j|0)<(e|0));i=d;return}function Nn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;c[f>>2]=0;g=a+28|0;if((Dma(g,d,f)|0)!=0){i=e;return}f=u2a(12)|0;ao(f,b,d);if((f|0)==0){i=e;return}c[(Gma(g,d)|0)>>2]=f;yg(b+16|0,f);i=e;return}function On(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;i=i+16|0;f=e+8|0;g=e;h=a+52|0;a=vn((c[h>>2]|0)+4|0,0)|0;if((a|0)<=0){j=0;i=e;return j|0}k=(b|0)==0;l=(d|0)==0;d=0;while(1){m=wn((c[h>>2]|0)+4|0,d)|0;if(((m|0)!=0?(n=c[m>>2]|0,!((n&-3|0)==1|(n|0)==7)):0)?(n=m+12|0,o=Do(c[n>>2]|0)|0,(o&4|0)==0):0){if(k){p=0}else{p=(Pn(b,m)|0)<0}if(l&p|(l|p)^1?(o&2|0)!=0:0){o=c[n>>2]|0;pe(g,669136);aI(f,o,g);o=c[f>>2]|0;if((o|0)==0){q=11;break}n=(c[o+4>>2]|0)==0;dka(f);if(n){j=m;q=14;break}}}d=d+1|0;if((d|0)>=(a|0)){j=0;q=14;break}}if((q|0)==11){dka(f);j=m;i=e;return j|0}else if((q|0)==14){i=e;return j|0}return 0}function Pn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=c[a+4>>2]|0;a:do{if((e|0)>0){f=c[a>>2]|0;g=0;while(1){if((c[f+(g<<2)>>2]|0)==(b|0)){h=g;break a}g=g+1|0;if((g|0)>=(e|0)){h=-1;break}}}else{h=-1}}while(0);i=d;return h|0}function Qn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;e=d;Ija(e,4);f=a+52|0;g=vn((c[f>>2]|0)+4|0,0)|0;if((g|0)>0){h=0;do{yg(e,wn((c[f>>2]|0)+4|0,h)|0);h=h+1|0}while((h|0)<(g|0))}g=Rn(a,b,e,1)|0;Jja(c[e>>2]|0);i=d;return g|0}function Rn(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;f=i;i=i+96|0;g=f+88|0;h=f+80|0;j=f+72|0;k=f+64|0;l=f+56|0;m=f+48|0;n=f+40|0;o=f+32|0;p=f+28|0;q=f+24|0;r=f+16|0;s=f+8|0;t=f;u=$G()|0;if((u|0)==0){v=0;i=f;return v|0}w=c[u+36>>2]|0;pe(g,38288);x=iI(w,g)|0;if((c[b+4>>2]|0)!=0){en(h);g=c[h>>2]|0;gn(g,b);pe(j,37048);oI(x,j,g,0)}g=Sn()|0;if((g|0)==0){v=0;i=f;return v|0}pe(k,2464);oI(x,k,g,0);k=a+52|0;a=vn((c[k>>2]|0)+4|0,0)|0;if((a|0)<=0){v=u;i=f;return v|0}x=(e|0)!=0;e=0;a:while(1){j=wn((c[k>>2]|0)+4|0,e)|0;b:do{if((((j|0)!=0?(c[j>>2]|0)!=1:0)?(b=j+12|0,h=Do(c[b>>2]|0)|0,(h&4|0)==0):0)?!(x^(Pn(d,j)|0)>-1):0){do{if((h&2|0)!=0){w=c[b>>2]|0;pe(m,669136);aI(l,w,m);w=c[l>>2]|0;if((w|0)!=0){y=(c[w+4>>2]|0)==0;dka(l);if(y){break b}else{break}}else{dka(l);break b}}}while(0);Ap(n,c[b>>2]|0);z=Wm()|0;if((z|0)==0){A=27;break a}h=Tn(n)|0;if((h|0)==0){A=17;break a}pe(o,38664);oI(z,o,h,0);if(!(((c[j>>2]|0)+ -2|0)>>>0<2)){h=Up(c[b>>2]|0,669136,0)|0;if((h|0)!=0){pe(t,669136);oI(z,t,pH(h,1)|0,0)}}else{So(p,j);h=c[p>>2]|0;DG(q,(h|0)==0?1292088:h+12|0,-1);if((Up(c[b>>2]|0,2648,0)|0)==0){pe(r,669136);tI(z,r,q)}else{pe(s,669136);uI(z,s,q)}dka(q);Lna(p)}RH(g,z);Lna(n)}}while(0);e=e+1|0;if((e|0)>=(a|0)){v=u;A=28;break}}if((A|0)==17){bH(z);Lna(n);v=0;i=f;return v|0}else if((A|0)==27){Lna(n);v=0;i=f;return v|0}else if((A|0)==28){i=f;return v|0}return 0}function Sn(){var a=0,b=0;a=i;b=u2a(28)|0;wl(b);i=a;return b|0}function Tn(a){a=a|0;var b=0,c=0;b=i;c=u2a(20)|0;AH(c,a);i=b;return c|0}function Un(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=i;i=i+16|0;d=c+8|0;e=c;Ah(d,b);Wn(e,3488);Sna(a,d,e);i=c;return}function Vn(a,b){a=a|0;b=b|0;c[a+60>>2]=b;return}function Wn(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;c[a>>2]=b;if((b|0)==0){e=0}else{e=T1a(b)|0}c[a+4>>2]=e;i=d;return}function Xn(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+4|0;c[e>>2]=0;ika(e,b);i=d;return}function Yn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=c[a+24>>2]|0;a:do{if((e|0)==0){f=a+4|0;g=a+8|0;if((c[g>>2]|0)>0){h=0;while(1){j=Yn(Ch(f,h)|0,b)|0;h=h+1|0;if((j|0)!=0){k=j;break a}if((h|0)>=(c[g>>2]|0)){k=0;break}}}else{k=0}}else{g=c[b>>2]|0;if((g|0)==0){k=e}else{c[b>>2]=g+ -1;k=0}}}while(0);i=d;return k|0}function Zn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=c[b>>2]|0;e=(d|0)==0?1292088:d+12|0;c[a>>2]=e;d=c[b>>2]|0;if((d|0)==0){f=0}else{f=c[d+4>>2]|0}c[a+4>>2]=e+(f<<2);c[a+8>>2]=e;return}function _n(a){a=a|0;var b=0;b=i;Lna(a+20|0);Jja(c[a+4>>2]|0);i=b;return}function $n(a){a=a|0;var b=0;b=i;Ija(a+4|0,4);c[a+20>>2]=0;i=b;return}function ao(a,b,d){a=a|0;b=b|0;d=d|0;c[a+4>>2]=b;c[a+8>>2]=d;c[a>>2]=c[b+8>>2];return}function bo(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+32|0;e=d+24|0;f=d+16|0;g=d+8|0;h=d;c[e>>2]=0;pe(f,669488);j=iI(b,f)|0;if((j|0)==0){hka(a,e);dka(e);i=d;return}pe(g,1274672);f=iI(j,g)|0;if((f|0)==0){hka(a,e);dka(e);i=d;return}g=YH(f)|0;c[h>>2]=g;a:do{if((g|0)!=0){while(1){ZH(f,h,e)|0;if(yl(e,2656)|0){break}if((c[h>>2]|0)==0){break a}}hka(a,e);dka(e);i=d;return}}while(0);c[a>>2]=0;dka(e);i=d;return}function co(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;e=d;bo(a,c[b+8>>2]|0);f=b+4|0;g=c[f>>2]|0;if((((c[g>>2]|0)+ -2|0)>>>0<2?(h=Up(c[g+12>>2]|0,2648,0)|0,(h|0)!=0):0)?(c[h>>2]|0)==5:0){c[e>>2]=Oo(c[f>>2]|0,b)|0;Jka(a,2664,e)}if(!(gl(c[a>>2]|0)|0)){i=d;return}mka(a,2528);i=d;return}function eo(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+16|0;e=d+4|0;f=d;bo(e,c[b+8>>2]|0);g=b+4|0;h=c[g>>2]|0;if((((c[h>>2]|0)+ -2|0)>>>0<2?(j=Up(c[h+12>>2]|0,2648,0)|0,(j|0)!=0):0)?(c[j>>2]|0)==5:0){HH(f,j,Oo(c[g>>2]|0,b)|0);ika(e,f);dka(f)}f=c[e>>2]|0;if((f|0)!=0?(c[f+4>>2]|0)!=0:0){k=f;CG(a,k);dka(e);i=d;return}mka(e,2528);k=c[e>>2]|0;CG(a,k);dka(e);i=d;return}function fo(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;i=i+16|0;d=b+12|0;e=b+8|0;f=b;g=a+8|0;bo(d,c[g>>2]|0);a=c[g>>2]|0;pe(f,3160);aI(e,a,f);f=wka(c[e>>2]|0,d)|0;dka(e);dka(d);i=b;return f&1|0}function go(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;i=i+16|0;d=b+4|0;e=b;f=Up(c[(c[a+4>>2]|0)+12>>2]|0,2616,0)|0;if((f|0)==0){g=0;i=b;return g|0}dH(d,f);bo(e,c[a+8>>2]|0);a=wka(c[d>>2]|0,e)|0;dka(e);dka(d);g=a&1;i=b;return g|0}function ho(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;i=i+48|0;e=d+36|0;f=d+32|0;g=d+24|0;h=d+16|0;j=d+8|0;k=d;l=a+8|0;bo(e,c[l>>2]|0);m=c[l>>2]|0;pe(g,3160);pe(h,2656);dI(f,m,g,h);eka(j,2656,-1);if((b|0)!=0){ika(j,e)}if(wka(c[f>>2]|0,j)|0){dka(j);dka(f);dka(e);i=d;return}b=c[l>>2]|0;pe(k,3160);tI(b,k,j);c[(c[a>>2]|0)+64>>2]=1;dka(j);dka(f);dka(e);i=d;return}function io(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+32|0;e=d+24|0;f=d+16|0;g=d+8|0;h=d;if((b|0)==0){j=1;i=d;return j|0}pe(f,37056);pe(g,37016);dI(e,b,f,g);g=c[e>>2]|0;f=1274672;b=0;while(1){pe(h,f);if(vka(g,h)|0){k=b;break}b=b+1|0;f=c[2536+(b<<2)>>2]|0;if((a[f>>0]|0)==0){k=1;break}}dka(e);j=k;i=d;return j|0}function jo(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;if((b|0)==0){c[a>>2]=0;i=d;return}else{c[e>>2]=2560;c[e+4>>2]=2;c[a>>2]=iI(b,e)|0;i=d;return}}function ko(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d+8|0;f=d;jo(e,a);oe(f,b);b=lo(c[e>>2]|0,f)|0;i=d;return b|0}function lo(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;if((a|0)==0){d=0}else{d=nI(a,b)|0}i=c;return d|0}function mo(a){a=a|0;var b=0,d=0;b=i;i=i+16|0;d=b;jo(d,a);a=no(c[d>>2]|0)|0;i=b;return a|0}function no(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b;if((a|0)==0){e=0;i=b;return e|0}c[d>>2]=669016;c[d+4>>2]=1;e=eI(a,d)|0;i=b;return e|0}function oo(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d+8|0;f=d;jo(e,a);oe(f,c);c=po(e,b,f)|0;i=d;return c|0}function po(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0.0,j=0.0,k=0.0,l=0.0,m=0.0;e=i;c[b>>2]=0;f=c[a>>2]|0;if((f|0)==0){g=0;i=e;return g|0}a=jI(f,d)|0;if((a|0)==0){g=0;i=e;return g|0}d=c[a+16>>2]|0;if((d|0)==1){c[b>>2]=1;f=~~(+DH(a,0)*255.0);g=f|f<<8|f<<16|-16777216;i=e;return g|0}else if((d|0)==4){c[b>>2]=3;h=+DH(a,0);j=+DH(a,1);k=+DH(a,2);l=+DH(a,3);m=h+l;h=j+l;j=k+l;g=~~((1.0-(j>1.0?1.0:j))*255.0)|~~((1.0-(h>1.0?1.0:h))*255.0)<<8|~~((1.0-(m>1.0?1.0:m))*255.0)<<16|-16777216;i=e;return g|0}else if((d|0)==3){c[b>>2]=2;m=+DH(a,0)*255.0;h=+DH(a,1)*255.0;g=~~m<<16|~~h<<8|~~(+DH(a,2)*255.0)|-16777216;i=e;return g|0}else{g=0;i=e;return g|0}return 0}function qo(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e+8|0;g=e;jo(f,a);oe(g,d);ro(f,b,c,g);i=e;return}function ro(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0;f=i;c[b>>2]=0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;h=c[a>>2]|0;if((h|0)==0){i=f;return}a=jI(h,e)|0;if((a|0)==0){i=f;return}e=c[a+16>>2]|0;if((e|0)==4){c[b>>2]=3;g[d>>2]=+DH(a,0);g[d+4>>2]=+DH(a,1);g[d+8>>2]=+DH(a,2);g[d+12>>2]=+DH(a,3);i=f;return}else if((e|0)==3){c[b>>2]=2;g[d>>2]=+DH(a,0);g[d+4>>2]=+DH(a,1);g[d+8>>2]=+DH(a,2);i=f;return}else if((e|0)==1){c[b>>2]=1;g[d>>2]=+DH(a,0);i=f;return}else{i=f;return}}function so(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e+8|0;g=e;jo(f,b);oe(g,d);to(a,c[f>>2]|0,g);i=e;return}function to(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;c[f>>2]=0;if((b|0)==0){Ona(a,f)}else{cI(a,b,d)}Lna(f);i=e;return}function uo(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d+8|0;f=d;jo(e,a);oe(f,b);b=vo(c[e>>2]|0,f)|0;i=d;return b|0}function vo(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;if((a|0)==0){d=0}else{d=kI(a,b)|0}i=c;return d|0}function wo(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;jo(e,b);xo(a,c[e>>2]|0);i=d;return}function xo(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;if((b|0)==0){c[a>>2]=0;i=d;return}else{c[e>>2]=2568;c[e+4>>2]=2;c[a>>2]=iI(b,e)|0;i=d;return}}function yo(a){a=a|0;var b=0,d=0;b=i;i=i+16|0;d=b;jo(d,a);a=zo(c[d>>2]|0)|0;i=b;return a|0}function zo(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b;if((a|0)==0){e=0;i=b;return e|0}c[d>>2]=2576;c[d+4>>2]=2;e=fI(a,d,0)|0;i=b;return e|0}function Ao(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+48|0;e=d+32|0;f=d+24|0;g=d+16|0;h=d+8|0;j=d;k=b+8|0;l=c[k>>2]|0;if((l|0)==0){c[e>>2]=0;Xn(a,e);dka(e);i=d;return}pe(f,669512);if((nI(l,f)|0)!=0){f=c[k>>2]|0;pe(h,669512);aI(g,f,h);Xn(a,g);dka(g);i=d;return}g=b+4|0;b=Up(c[(c[g>>2]|0)+12>>2]|0,669512,0)|0;if((b|0)==0){Gn(a,c[(c[(c[g>>2]|0)+8>>2]|0)+24>>2]|0);i=d;return}else{dH(j,b);Xn(a,j);dka(j);i=d;return}}function Bo(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+16|0;d=b+8|0;e=b;f=a+8|0;g=c[f>>2]|0;if((g|0)==0){h=0;i=b;return h|0}pe(d,22808);if((nI(g,d)|0)!=0){d=c[f>>2]|0;pe(e,22808);h=fI(d,e,0)|0;i=b;return h|0}e=a+4|0;a=Up(c[(c[e>>2]|0)+12>>2]|0,22808,0)|0;if((a|0)==0){h=Hn(c[(c[(c[e>>2]|0)+8>>2]|0)+24>>2]|0)|0;i=b;return h|0}else{h=jH(a)|0;i=b;return h|0}return 0}function Co(a){a=a|0;var b=0,d=0;b=i;if((c[a>>2]|0)==3){d=1;i=b;return d|0}d=(Do(c[a+12>>2]|0)|0)>>>25&1;i=b;return d|0}function Do(a){a=a|0;var b=0,c=0,d=0;b=i;c=Up(a,2584,0)|0;if((c|0)==0){d=0;i=b;return d|0}d=jH(c)|0;i=b;return d|0}function Eo(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;Ija(a+16|0,4);c[a+12>>2]=d;c[a>>2]=0;c[a+8>>2]=b;c[a+36>>2]=0;g[a+32>>2]=0.0;Fo(a);i=e;return}function Fo(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+16|0;d=b;e=a+12|0;if((Up(c[e>>2]|0,38400,0)|0)==0){c[d>>2]=0}else{dH(d,Up(c[e>>2]|0,38400,0)|0)}if((Up(c[e>>2]|0,2584,0)|0)==0){f=0;g=0}else{h=jH(Up(c[e>>2]|0,2584,0)|0)|0;f=h;g=h&7}h=a+4|0;c[h>>2]=g;if(ah(d,2592)|0){if((f&32768|0)==0){if((f&65536|0)==0){c[a>>2]=3;dka(d);i=b;return}else{c[a>>2]=1;dka(d);i=b;return}}c[a>>2]=2;if((f&16384|0)!=0){c[h>>2]=c[h>>2]|256}if((f&33554432|0)==0){dka(d);i=b;return}c[h>>2]=c[h>>2]|512;dka(d);i=b;return}if(ah(d,2600)|0){do{if((f&1048576|0)==0){if((f&33554432|0)!=0){c[a>>2]=5;break}c[a>>2]=4;if((f&4096|0)!=0){c[h>>2]=c[h>>2]|256}if((f&8192|0)!=0){c[h>>2]=c[h>>2]|512}if((f&8388608|0)!=0){c[h>>2]=c[h>>2]|1024}}else{c[a>>2]=6}}while(0);Ho(a);dka(d);i=b;return}else{if(!(ah(d,2608)|0)){if(!(ah(d,38408)|0)){dka(d);i=b;return}c[a>>2]=9;dka(d);i=b;return}if((f&131072|0)==0){c[a>>2]=7;if((f&2097152|0)!=0){c[h>>2]=c[h>>2]|256}}else{c[a>>2]=8;if((f&262144|0)!=0){c[h>>2]=c[h>>2]|256}}Ho(a);dka(d);i=b;return}}function Go(a){a=a|0;var b=0;b=i;Jja(c[a+16>>2]|0);i=b;return}function Ho(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;b=i;i=i+128|0;d=b+120|0;e=b+116|0;f=b+112|0;h=b+104|0;j=b+88|0;k=b+80|0;l=b+72|0;m=b+64|0;n=b+56|0;o=b+48|0;p=b+40|0;q=b+32|0;r=b+24|0;s=b+16|0;t=b+8|0;u=b;c[d>>2]=0;v=Up(c[a+12>>2]|0,669512,0)|0;if((v|0)!=0){dH(e,v);ika(d,e);dka(e);e=c[d>>2]|0;if(!((e|0)!=0?(c[e+4>>2]|0)!=0:0)){w=e;x=4}}else{w=0;x=4}if((x|0)==4){x=c[(c[a+8>>2]|0)+24>>2]|0;if((x|0)==0){y=w}else{pe(h,669512);aI(f,x,h);ika(d,f);dka(f);y=c[d>>2]|0}if((y|0)==0){dka(d);i=b;return}if((c[y+4>>2]|0)==0){dka(d);i=b;return}}oe(k,d);oL(j,k);pe(l,669520);rL(j,l,2)|0;qL(n,j);jka(m,n);n=a+8|0;l=c[(c[n>>2]|0)+24>>2]|0;if((((l|0)!=0?(pe(o,669464),(iI(l,o)|0)!=0):0)?(o=c[(c[n>>2]|0)+24>>2]|0,pe(p,669464),l=iI(o,p)|0,pe(q,669472),(iI(l,q)|0)!=0):0)?(q=c[(c[n>>2]|0)+24>>2]|0,pe(r,669464),l=iI(q,r)|0,pe(s,669472),r=iI(l,s)|0,oe(t,m),s=iI(r,t)|0,(s|0)!=0):0){c[a+36>>2]=RA(c[(c[n>>2]|0)+16>>2]|0,s)|0;qL(u,j);g[a+32>>2]=+Hna(u)}dka(m);dka(d);i=b;return}function Io(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;b=i;i=i+80|0;d=b+64|0;e=b+60|0;f=b+56|0;g=b+52|0;h=b+48|0;j=b+44|0;k=b+40|0;l=b+36|0;m=b+32|0;n=b+24|0;o=b+16|0;p=b+8|0;q=b;r=c[a>>2]|0;if((r|0)==2|(r|0)==3){Ija(d,1);s=a+8|0;if((c[(c[s>>2]|0)+60>>2]|0)!=0){Sp(a,d)}t=c[a+20>>2]|0;do{if((t|0)!=0){u=(t|0)>0;if((Co(a)|0)==0){if(!u){break}v=a+16|0;w=0;do{Jo(a,w,go(Ch(v,w)|0)|0);w=w+1|0}while((w|0)<(t|0))}else{if(!u){break}w=a+16|0;v=0;do{Jo(a,v,go(Ch(w,v)|0)|0);v=v+1|0}while((v|0)<(t|0))}}}while(0);t=c[(c[s>>2]|0)+60>>2]|0;if((t|0)!=0){Qc[c[(c[t>>2]|0)+24>>2]&255](t,a,d)|0}Jja(c[d>>2]|0);i=b;return}else if((r|0)==7){c[g>>2]=0;Ko(a);d=Lo(a)|0;if((d|0)>-1){hp(h,c[a+12>>2]|0,d,1);Pna(g,h);Lna(h)}h=a+8|0;t=c[(c[h>>2]|0)+60>>2]|0;if((t|0)!=0?(Qc[c[(c[t>>2]|0)+16>>2]&255](t,a,g)|0)<0:0){Lna(g);i=b;return}No(a,d);d=c[(c[h>>2]|0)+60>>2]|0;if((d|0)!=0){dd[c[(c[d>>2]|0)+20>>2]&511](d,a)|0}Lna(g);i=b;return}else if((r|0)==8){c[e>>2]=0;Ko(a);r=Lo(a)|0;if((r|0)>-1){hp(f,c[a+12>>2]|0,r,1);Pna(e,f);Lna(f)}f=a+8|0;g=c[(c[f>>2]|0)+60>>2]|0;if((g|0)!=0?(Qc[c[(c[g>>2]|0)+8>>2]&255](g,a,e)|0)<0:0){Lna(e);i=b;return}No(a,r);r=c[(c[f>>2]|0)+60>>2]|0;if((r|0)!=0){dd[c[(c[r>>2]|0)+12>>2]&511](r,a)|0}Lna(e);i=b;return}else{e=a+12|0;r=Up(c[e>>2]|0,2616,0)|0;c[j>>2]=0;f=(r|0)==0;if(!f){uH(k,r);Pna(j,k);Lna(k)}k=Up(c[e>>2]|0,669136,0)|0;c[l>>2]=0;if((k|0)!=0){uH(m,k);Pna(l,m);Lna(m)}m=(Up(c[e>>2]|0,2624,0)|0)!=0;if(!(!m?coa(j,l)|0:0)){x=35}do{if((x|0)==35){k=a+8|0;g=c[(c[k>>2]|0)+60>>2]|0;if((g|0)!=0?(Qc[c[(c[g>>2]|0)+8>>2]&255](g,a,j)|0)<0:0){break}if(!f){g=pH(r,0)|0;if((g|0)==0){break}d=c[e>>2]|0;pe(p,669136);oI(d,p,g,0);if(m){g=pH(r,0)|0;d=c[e>>2]|0;pe(q,2624);oI(d,q,g,0)}}else{g=c[e>>2]|0;pe(n,669136);qI(g,n);g=c[e>>2]|0;pe(o,2624);qI(g,o)}g=c[k>>2]|0;d=c[g+60>>2]|0;if((d|0)==0){y=g}else{dd[c[(c[d>>2]|0)+12>>2]&511](d,a)|0;y=c[k>>2]|0}c[y+64>>2]=1}}while(0);Lna(l);Lna(j);i=b;return}}function Jo(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;e=i;i=i+96|0;f=e;g=e+72|0;h=e+64|0;j=e+60|0;k=e+56|0;l=e+52|0;m=e+48|0;n=e+40|0;o=e+36|0;p=e+32|0;q=e+24|0;r=e+20|0;s=e+16|0;t=e+8|0;u=a+16|0;v=Ch(u,b)|0;if((v|0)==0){i=e;return}w=(d|0)!=0;if(!w?(fo(v)|0)==0:0){i=e;return}Ija(g,1);eo(h,v);x=c[h>>2]|0;DG(j,(x|0)==0?1292088:x+12|0,-1);x=c[a+20>>2]|0;y=Co(a)|0;if((x|0)>0){z=(y|0)==0;y=v+8|0;v=0;do{A=Ch(u,v)|0;do{if(z){if((v|0)==(b|0)){ho(A,d);break}if(w){ho(A,0)}}else{eo(k,A);do{if(coa(k,h)|0){bo(l,c[A+8>>2]|0);bo(m,c[y>>2]|0);B=wka(c[l>>2]|0,m)|0;dka(m);dka(l);if(B){ho(A,d);break}if(w){ho(A,0)}}else{if(w){ho(A,0)}}}while(0);Lna(k)}}while(0);v=v+1|0}while((v|0)<(x|0))}x=a+12|0;v=Up(c[x>>2]|0,2648,0)|0;if((v|0)!=0?(c[v>>2]|0)==5:0){if(w){c[s>>2]=0;c[f>>2]=b;Jka(s,2664,f);f=c[x>>2]|0;pe(t,669136);tI(f,t,s);dka(s)}}else{C=22}do{if((C|0)==22){if(w){s=c[x>>2]|0;pe(n,669136);tI(s,n,j);break}c[o>>2]=0;s=Up(c[x>>2]|0,669136,0)|0;if((s|0)==0){D=0}else{dH(p,s);ika(o,p);dka(p);D=c[o>>2]|0}if(wka(D,j)|0){s=c[x>>2]|0;pe(q,669136);eka(r,2656,-1);tI(s,q,r);dka(r)}dka(o)}}while(0);c[(c[a+8>>2]|0)+64>>2]=1;dka(j);Lna(h);Jja(c[g>>2]|0);i=e;return}function Ko(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;i=i+16|0;d=b+8|0;e=b;f=a+12|0;g=c[f>>2]|0;pe(d,669136);qI(g,d);d=c[f>>2]|0;pe(e,37016);qI(d,e);if((c[618]|0)!=0){Xo(a)}c[(c[a+8>>2]|0)+64>>2]=1;i=b;return}function Lo(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;i=i+16|0;d=b+4|0;e=b;f=a+12|0;a=Up(c[f>>2]|0,2616,0)|0;if((a|0)==0){g=-1;i=b;return g|0}uH(d,a);a:do{if((dg(c[d>>2]|0)|0)==0?(a=dp(c[f>>2]|0)|0,(a|0)>0):0){h=0;while(1){hp(e,c[f>>2]|0,h,0);j=coa(d,e)|0;Lna(e);if(j){k=h;break a}h=h+1|0;if((h|0)>=(a|0)){k=-1;break}}}else{k=-1}}while(0);Lna(d);g=k;i=b;return g|0}function Mo(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;hp(a,b,c,1);i=d;return}function No(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;d=i;i=i+64|0;e=d+56|0;f=d+48|0;g=d+40|0;h=d+36|0;j=d+32|0;k=d+24|0;l=d+16|0;m=d+8|0;n=d;if((b|0)<0){i=d;return}o=a+12|0;if((dp(c[o>>2]|0)|0)<=(b|0)){i=d;return}hp(e,c[o>>2]|0,b,0);p=c[a>>2]|0;do{if((p|0)==8){q=c[o>>2]|0;pe(l,669136);r=c[e>>2]|0;s=(r|0)==0;if(s){t=0}else{t=c[r+4>>2]|0}DG(m,s?1292088:r+12|0,t);uI(q,l,m);dka(m);q=Sn()|0;if((q|0)!=0){UH(q,b);r=c[o>>2]|0;pe(n,37016);oI(r,n,q,0);u=20}}else if((p|0)==7){gp(a,b);if((c[a+4>>2]&256|0)==0){q=c[o>>2]|0;pe(f,669136);r=c[e>>2]|0;s=(r|0)==0;if(s){v=0}else{v=c[r+4>>2]|0}DG(g,s?1292088:r+12|0,v);uI(q,f,g);dka(g);u=20;break}q=Sn()|0;if((q|0)!=0){r=dp(c[o>>2]|0)|0;if((r|0)>0){s=0;do{if(!((s|0)!=(b|0)?(ep(a,s)|0)==0:0)){hp(h,c[o>>2]|0,s,0);Pna(e,h);Lna(h);w=c[e>>2]|0;DG(j,(w|0)==0?1292088:w+12|0,-1);TH(q,j);dka(j)}s=s+1|0}while((s|0)<(r|0))}r=c[o>>2]|0;pe(k,669136);oI(r,k,q,0);u=20}}else{u=20}}while(0);if((u|0)==20){if((c[618]|0)!=0){Xo(a)}c[(c[a+8>>2]|0)+64>>2]=1}Lna(e);i=d;return}function Oo(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;a:do{if((b|0)!=0?(e=a+16|0,f=c[a+20>>2]|0,(f|0)>0):0){g=0;while(1){if((Ch(e,g)|0)==(b|0)){h=g;break a}g=g+1|0;if((g|0)>=(f|0)){h=-1;break}}}else{h=-1}}while(0);i=d;return h|0}function Po(a){a=a|0;var b=0;switch(a|0){case 1:{b=1;break};case 2:{b=3;break};case 3:{b=2;break};case 6:case 5:case 4:{b=6;break};case 7:{b=5;break};case 8:{b=4;break};case 9:{b=7;break};default:{b=0}}return b|0}function Qo(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=Up(b,2632,0)|0;if((e|0)==0){c[a>>2]=0;i=d;return}else{c[a>>2]=lH(e)|0;i=d;return}}function Ro(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;if(((c[b>>2]|0)+ -2|0)>>>0<2){So(a,b);i=d;return}e=b+12|0;f=Up(c[e>>2]|0,669136,0)|0;do{if((f|0)==0){g=c[b>>2]|0;if((g|0)==5){h=Up(c[e>>2]|0,669136,0)|0;if((h|0)!=0){j=h;break}k=c[b>>2]|0}else{k=g}if((k|0)!=4?(g=Up(c[e>>2]|0,2616,0)|0,(g|0)!=0):0){j=g;break}c[a>>2]=0;i=d;return}else{j=f}}while(0);f=c[j>>2]|0;if((f|0)==7|(f|0)==3){uH(a,j);i=d;return}else if((f|0)==5){uH(a,GH(j,0)|0);i=d;return}else{c[a>>2]=0;i=d;return}}function So(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+16|0;e=d;Mna(a,2672,-1);f=c[b+20>>2]|0;if((f|0)<=0){i=d;return}g=b+16|0;b=0;while(1){h=Ch(g,b)|0;b=b+1|0;if((fo(h)|0)!=0){break}if((b|0)>=(f|0)){j=6;break}}if((j|0)==6){i=d;return}eo(e,h);Pna(a,e);Lna(e);i=d;return}function To(a,b){a=a|0;b=b|0;var c=0;c=i;Ro(a,b);i=c;return}function Uo(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;i=i+48|0;e=d+44|0;f=d+40|0;g=d+32|0;h=d+24|0;j=d+16|0;k=d+8|0;l=d;a:do{switch(c[a>>2]|0){case 2:case 3:{Vo(a,b);i=d;return};case 7:{m=c[b>>2]|0;n=Wo(a,(m|0)==0?1292088:m+12|0)|0;if((n|0)<0){i=d;return}else{Ko(a);No(a,n);c[(c[a+8>>2]|0)+64>>2]=1;break a}break};case 8:case 4:case 5:case 6:{Ona(e,b);n=c[e>>2]|0;m=(n|0)==0?1292088:n+12|0;n=Wo(a,m)|0;if((n|0)<0){DG(f,m,-1);o=a+12|0;p=c[o>>2]|0;pe(g,669136);uI(p,g,f);if((c[a>>2]|0)==5){p=c[o>>2]|0;pe(h,2624);uI(p,h,f)}p=c[o>>2]|0;pe(j,37016);qI(p,j);dka(f)}else{p=c[a+12>>2]|0;pe(k,669136);DG(l,m,-1);uI(p,k,l);dka(l);Ko(a);No(a,n)}c[(c[a+8>>2]|0)+64>>2]=1;Lna(e);break};default:{}}}while(0);if((c[618]|0)==0){i=d;return}Xo(a);i=d;return}function Vo(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;i=i+32|0;e=d+8|0;f=d;Ija(e,1);g=c[a+20>>2]|0;if((g|0)>0){h=a+16|0;j=0;do{k=Ch(h,j)|0;eo(f,k);l=coa(f,b)|0;m=Oo(a,k)|0;if(l){Jo(a,m,1);n=0}else{Jo(a,m,0);n=1}Lna(f);j=j+1|0}while(n&(j|0)<(g|0))}c[(c[a+8>>2]|0)+64>>2]=1;Jja(c[e>>2]|0);i=d;return}function Wo(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+16|0;e=d;f=a+12|0;a=dp(c[f>>2]|0)|0;if((a|0)>0){g=0;h=0}else{j=-1;i=d;return j|0}while(1){hp(e,c[f>>2]|0,h,0);k=aoa(e,b)|0;g=k?h:g;Lna(e);h=h+1|0;if(k){j=g;l=4;break}if((h|0)>=(a|0)){j=-1;l=4;break}}if((l|0)==4){i=d;return j|0}return 0}function Xo(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;if(((c[a>>2]|0)+ -1|0)>>>0<3){i=b;return}d=a+8|0;if((c[(c[d>>2]|0)+20>>2]|0)==0){i=b;return}e=a+20|0;if((c[e>>2]|0)<=0){i=b;return}f=a+16|0;a=0;do{g=Ch(f,a)|0;sm(c[(c[d>>2]|0)+16>>2]|0,c[g+8>>2]|0);a=a+1|0}while((a|0)<(c[e>>2]|0));i=b;return}function Yo(a,b){a=a|0;b=b|0;var c=0;c=i;Uo(a,b);i=c;return}function Zo(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;i=i+16|0;d=b+8|0;e=b;f=Up(c[a+12>>2]|0,2640,0)|0;if((f|0)!=0){g=jH(f)|0;i=b;return g|0}f=a+16|0;h=c[a+20>>2]|0;if((h|0)>0){j=0}else{g=0;i=b;return g|0}while(1){a=Ch(f,j)|0;if((a|0)!=0?(k=c[a+8>>2]|0,pe(d,2640),(nI(k,d)|0)!=0):0){break}j=j+1|0;if((j|0)>=(h|0)){g=0;l=8;break}}if((l|0)==8){i=b;return g|0}pe(e,2640);g=eI(k,e)|0;i=b;return g|0}function _o(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;i=i+16|0;d=b+4|0;e=b;f=a+12|0;a=Up(c[f>>2]|0,669136,0)|0;if((a|0)==0){g=Up(c[f>>2]|0,37016,0)|0;if((g|0)==0){h=0;i=b;return h|0}else{j=g}}else{j=a}a=c[j>>2]|0;if((a|0)==3){dH(d,j);g=c[d>>2]|0;if((g|0)==0){k=1}else{k=(c[g+4>>2]|0)==0}dka(d);h=k&1^1;i=b;return h|0}else if((a|0)==5){h=c[j+16>>2]|0;i=b;return h|0}else if((a|0)==2){dH(e,j);j=c[e>>2]|0;if((j|0)==0){l=1}else{l=(c[j+4>>2]|0)==0}dka(e);h=l&1^1;i=b;return h|0}else{h=0;i=b;return h|0}return 0}function $o(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;i=i+32|0;e=d+16|0;f=d+12|0;g=d+8|0;h=d+4|0;j=d;k=a+12|0;a=Up(c[k>>2]|0,669136,0)|0;if((a|0)==0){l=Up(c[k>>2]|0,37016,0)|0;if((l|0)==0){m=-1;i=d;return m|0}else{n=l}}else{n=a}c[e>>2]=0;a=c[n>>2]|0;if((a|0)==3){if((b|0)==0){uH(f,n);Pna(e,f);Lna(f);o=15}else{p=-1}}else if((a|0)!=2){if(!((a|0)!=5|(b|0)<0)){a=GH(n,b)|0;if((a|0)==0){c[g>>2]=0;q=1;r=0}else{uH(g,a);q=0;r=1}Pna(e,g);if(q){Lna(g)}if(r){Lna(g);o=15}else{o=15}}else{p=-1}}else{p=jH(n)|0}a:do{if((o|0)==15){if((ap(c[k>>2]|0)|0)>(b|0)?(n=bp(c[k>>2]|0,b)|0,hp(h,c[k>>2]|0,n,0),g=coa(h,e)|0,Lna(h),g):0){p=n;break}n=dp(c[k>>2]|0)|0;if((n|0)>0){g=0;while(1){hp(j,c[k>>2]|0,g,0);r=coa(e,j)|0;Lna(j);if(r){p=g;break a}g=g+1|0;if((g|0)>=(n|0)){p=-1;break}}}else{p=-1}}}while(0);Lna(e);m=p;i=d;return m|0}function ap(a){a=a|0;var b=0,d=0,e=0;b=i;d=Up(a,37016,0)|0;if((d|0)!=0?(a=mH(d)|0,(a|0)!=0):0){e=c[a+16>>2]|0}else{e=0}i=b;return e|0}function bp(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=Up(a,37016,0)|0;if(((e|0)!=0?(a=mH(e)|0,(a|0)!=0):0)?(e=c[a+16>>2]|0,(e|0)>0&(e|0)>(b|0)):0){f=JH(a,b)|0}else{f=-1}i=d;return f|0}function cp(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;hp(a,b,c,0);i=d;return}function dp(a){a=a|0;var b=0,d=0,e=0;b=i;d=Up(a,2648,0)|0;if((d|0)!=0?(c[d>>2]|0)==5:0){e=c[d+16>>2]|0}else{e=0}i=b;return e|0}function ep(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;i=i+16|0;e=d+12|0;f=d+8|0;g=d+4|0;h=d;if((b|0)<0){j=0;i=d;return j|0}k=a+12|0;if((dp(c[k>>2]|0)|0)<=(b|0)){j=0;i=d;return j|0}if((fp(c[k>>2]|0,b)|0)!=0){j=1;i=d;return j|0}hp(e,c[k>>2]|0,b,0);a=Up(c[k>>2]|0,669136,0)|0;if((a|0)==0){l=Up(c[k>>2]|0,37016,0)|0;if((l|0)==0){m=0}else{n=l;o=6}}else{n=a;o=6}a:do{if((o|0)==6){a=c[n>>2]|0;if((a|0)==5){l=0;while(1){if((l|0)>=(ap(c[k>>2]|0)|0)){p=-1;break}if((bp(c[k>>2]|0,l)|0)==(b|0)){p=l;break}else{l=l+1|0}}l=n+16|0;if((c[l>>2]|0)==0){m=0;break}else{q=0}while(1){uH(h,GH(n,q)|0);r=coa(h,e)|0;Lna(h);if(r&(q|0)==(p|0)){m=1;break a}q=q+1|0;if(!(q>>>0<(c[l>>2]|0)>>>0)){m=0;break}}}else if((a|0)==2){dH(g,n);l=c[g>>2]|0;if((l|0)==0){dka(g);m=0;break}r=(c[l+4>>2]|0)==0;dka(g);if(r){m=0;break}m=(jH(n)|0)==(b|0)&1;break}else if((a|0)==3){uH(f,n);r=coa(f,e)|0;Lna(f);m=r&1;break}else{m=0;break}}}while(0);Lna(e);j=m;i=d;return j|0}function fp(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=Up(a,37016,0)|0;a:do{if(((e|0)!=0?(a=mH(e)|0,(a|0)!=0):0)?(f=c[a+16>>2]|0,(f|0)>0):0){g=0;while(1){if((JH(a,g)|0)==(b|0)){h=1;break a}g=g+1|0;if((g|0)>=(f|0)){h=0;break}}}else{h=0}}while(0);i=d;return h|0}function gp(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;i=i+32|0;e=d+16|0;f=d+8|0;g=d;h=a+12|0;j=c[h>>2]|0;pe(e,37016);k=jI(j,e)|0;do{if((k|0)==0){e=Sn()|0;if((e|0)==0){i=d;return}else{j=c[h>>2]|0;pe(f,37016);oI(j,f,e,0);l=e;break}}else{l=k}}while(0);k=l+16|0;a:do{if((c[k>>2]|0)>0){f=0;while(1){e=JH(l,f)|0;if((e|0)==(b|0)){m=13;break}j=f+1|0;if((e|0)>(b|0)){break}if((j|0)<(c[k>>2]|0)){f=j}else{m=10;break a}}if((m|0)==13){i=d;return}j=jp(b)|0;if((j|0)==0){i=d;return}else{QH(l,f,j);break}}else{m=10}}while(0);if((m|0)==10?(UH(l,b),(c[k>>2]|0)==0):0){k=c[h>>2]|0;pe(g,37016);qI(k,g)}c[(c[a+8>>2]|0)+64>>2]=1;i=d;return}function hp(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;g=Up(b,2648,0)|0;if((g|0)!=0?(c[g>>2]|0)==5:0){b=GH(g,d)|0;if((b|0)==0){c[a>>2]=0;i=f;return}d=c[b>>2]|0;if((d|0)==5){g=GH(b,e)|0;if((g|0)!=0){h=c[g>>2]|0;j=g;k=9}}else{h=d;j=b;k=9}if((k|0)==9?(h|0)==3:0){uH(a,j);i=f;return}c[a>>2]=0;i=f;return}c[a>>2]=0;i=f;return}function ip(a){a=a|0;var b=0,c=0,d=0;b=i;c=Up(a,2688,0)|0;if((c|0)==0){d=0;i=b;return d|0}d=jH(c)|0;i=b;return d|0}function jp(a){a=a|0;var b=0,c=0;b=i;c=u2a(20)|0;xH(c,a);i=b;return c|0}function kp(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;i=i+16|0;d=b+8|0;e=b;f=w2a(1,16)|0;c[a>>2]=f;a=f+12|0;f=u2a(20)|0;Yma(f);c[a>>2]=f;if((f|0)==0){i=b;return}c[d>>2]=0;f=0;do{mka(d,c[2696+(f<<2)>>2]|0);g=c[a>>2]|0;oe(e,d);ina(g,e,c[2696+((f|1)<<2)>>2]|0);f=f+2|0}while((f|0)<18);dka(d);i=b;return}function lp(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=c[a>>2]|0;if((d|0)==0){_a(2768,2784,42,2824)}e=c[d+4>>2]|0;if((e|0)==0){f=d}else{gpa(e);v2a(e);f=c[a>>2]|0}e=c[f+12>>2]|0;if((e|0)==0){g=f;v2a(g);i=b;return}_ma(e);v2a(e);g=c[a>>2]|0;v2a(g);i=b;return}function mp(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;i=i+64|0;e=d+56|0;f=d+28|0;g=d+24|0;h=d+16|0;j=d+8|0;k=d;if((b|0)==0){_a(3064,2784,56,2840)}c[c[a>>2]>>2]=b;l=c[b+52>>2]|0;c[e>>2]=38480;c[e+4>>2]=8;b=kI(l,e)|0;if((b|0)==0){i=d;return}EI(f);rH(f,b,0,0,0);b=sH(f)|0;e=vH(f)|0;l=(c[a>>2]|0)+4|0;m=dpa(e,b)|0;c[l>>2]=m;if((m|0)!=0){b=(c[a>>2]|0)+8|0;ipa(g,m);c[h>>2]=2848;c[h+4>>2]=3;m=vka(c[g>>2]|0,h)|0;dka(g);g=c[l>>2]|0;if(m){n=g}else{c[j>>2]=0;c[j+4>>2]=0;c[k>>2]=2848;c[k+4>>2]=3;n=ppa(g,j,k)|0}c[b>>2]=n}FI(f);i=d;return}function np(a){a=a|0;return c[a+4>>2]|0}function op(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;c[a>>2]=3048;zma(a+12|0,10);if((b|0)==0){_a(3064,3080,96,3112)}else{c[a+4>>2]=b;c[a+8>>2]=d;i=e;return}}function pp(a){a=a|0;var b=0;b=i;qp(a);v2a(a);i=b;return}function qp(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=3048;d=a+12|0;Ama(d);Bma(d);i=b;return}function rp(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;f=i;i=i+176|0;g=f+168|0;h=f+160|0;j=f+152|0;k=f+144|0;l=f+136|0;m=f+128|0;n=f+120|0;o=f+112|0;p=f+104|0;q=f+96|0;r=f+88|0;s=f+80|0;t=f+72|0;u=f+64|0;v=f+56|0;w=f+48|0;x=f+40|0;y=f+32|0;z=f+24|0;A=f+16|0;B=f+8|0;C=f;if((a|0)==0|(d|0)==0){_a(3416,3080,51,3440)}D=c[a+52>>2]|0;c[g>>2]=3464;c[g+4>>2]=12;a=iI(D,g)|0;a:do{if(((a|0)!=0?(c[h>>2]=3192,c[h+4>>2]=4,g=jI(a,h)|0,(g|0)!=0):0)?(sp(g,d)|0)>=0:0){c[j>>2]=37032;c[j+4>>2]=1;g=iI(a,j)|0;c[k>>2]=3480;c[k+4>>2]=7;D=jI(a,k)|0;if((D|0)!=0?(E=c[D+16>>2]|0,(E|0)>0):0){F=l+4|0;G=m+4|0;H=0;while(1){I=KH(D,H)|0;if((I|0)!=0?(c[l>>2]=3184,c[F>>2]=4,c[m>>2]=3184,c[G>>2]=4,(up(I,l,m)|0)!=0):0){J=I;break a}H=H+1|0;if((H|0)>=(E|0)){J=g;break}}}else{J=g}}else{J=0}}while(0);if((J|0)==0){K=1;i=f;return K|0}c[e>>2]=1;c[o>>2]=3128;c[o+4>>2]=9;c[p>>2]=3144;c[p+4>>2]=2;dI(n,J,o,p);c[q>>2]=3152;c[q+4>>2]=3;p=(vka(c[n>>2]|0,q)|0)&1^1;dka(n);c[r>>2]=3144;c[r+4>>2]=2;n=jI(J,r)|0;if((n|0)==0){L=p}else{r=(sp(n,d)|0)>-1;L=r?1:p}c[s>>2]=3152;c[s+4>>2]=3;p=jI(J,s)|0;if((p|0)==0){M=L}else{s=(sp(p,d)|0)>-1;M=s?0:L}c[t>>2]=3160;c[t+4>>2]=2;L=jI(J,t)|0;if((L|0)==0){K=M;i=f;return K|0}c[v>>2]=3168;c[v+4>>2]=5;lka(u,b,v);v=c[L+16>>2]|0;if((v|0)>0){t=x+4|0;J=y+4|0;s=z+4|0;p=C+4|0;r=M;n=0;while(1){q=KH(L,n)|0;if(((((q|0)!=0?(c[x>>2]=3176,c[t>>2]=5,c[y>>2]=3184,c[J>>2]=4,dI(w,q,x,y),o=vka(c[w>>2]|0,b)|0,dka(w),o):0)?(c[z>>2]=3192,c[s>>2]=4,o=jI(q,z)|0,(o|0)!=0):0)?(sp(o,d)|0)>=0:0)?(o=iI(q,b)|0,(o|0)!=0):0){oe(B,u);aI(A,o,B);c[C>>2]=3152;c[p>>2]=3;o=(vka(c[A>>2]|0,C)|0)&1^1;dka(A);N=o}else{N=r}n=n+1|0;if((n|0)>=(v|0)){O=N;break}else{r=N}}}else{O=M}dka(u);K=O;i=f;return K|0}function sp(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;a:do{if(!((a|0)==0|(b|0)==0)){if((c[a>>2]|0)!=5){e=((lH(a)|0)!=(b|0))<<31>>31;break}f=c[a+16>>2]|0;if((f|0)!=0){g=0;while(1){if((KH(a,g)|0)==(b|0)){e=g;break a}g=g+1|0;if(!(g>>>0<f>>>0)){e=-1;break}}}else{e=-1}}else{e=-1}}while(0);i=d;return e|0}function tp(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;d=i;i=i+192|0;e=d+176|0;f=d+168|0;g=d+160|0;h=d+152|0;j=d+144|0;k=d+136|0;l=d+128|0;m=d+120|0;n=d+112|0;o=d+104|0;p=d+96|0;q=d+88|0;r=d+80|0;s=d+72|0;t=d+64|0;u=d+56|0;v=d+48|0;w=d+40|0;x=d+32|0;y=d+24|0;z=d+16|0;A=d+8|0;B=d;c[j>>2]=3184;c[j+4>>2]=4;c[k>>2]=3184;c[k+4>>2]=4;if((up(b,j,k)|0)==0){C=1;i=d;return C|0}k=c[a+8>>2]|0;c[e>>2]=3184;c[e+4>>2]=4;jka(l,e);if((k|0)==2){c[g>>2]=3344;c[g+4>>2]=5;kka(l,g)}else if((k|0)==1){c[f>>2]=3336;c[f+4>>2]=6;kka(l,f)}else if((k|0)==3){c[h>>2]=3352;c[h+4>>2]=6;kka(l,h)}c[m>>2]=3200;c[m+4>>2]=5;h=iI(b,m)|0;a:do{if((h|0)!=0){oe(n,l);m=iI(h,n)|0;do{if((m|0)!=0){c[p>>2]=3168;c[p+4>>2]=5;hg(o,l,p);oe(q,o);if((nI(m,q)|0)==0){dka(o);break}else{oe(s,o);aI(r,m,s);c[t>>2]=3152;c[t+4>>2]=3;k=vka(c[r>>2]|0,t)|0;dka(r);dka(o);D=k&1^1;break a}}}while(0);c[u>>2]=3184;c[u+4>>2]=4;if((!(vka(c[l>>2]|0,u)|0)?(c[v>>2]=3184,c[v+4>>2]=4,m=iI(h,v)|0,(m|0)!=0):0)?(c[w>>2]=3208,c[w+4>>2]=9,(nI(m,w)|0)!=0):0){c[y>>2]=3208;c[y+4>>2]=9;aI(x,m,y);c[z>>2]=3152;c[z+4>>2]=3;m=vka(c[x>>2]|0,z)|0;dka(x);D=m&1^1}else{E=15}}else{E=15}}while(0);if((E|0)==15){c[A>>2]=0;oe(B,l);D=rp(c[a+4>>2]|0,B,b,A)|0}dka(l);C=D;i=d;return C|0}function up(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;i=i+48|0;f=e+32|0;g=e+28|0;h=e+24|0;j=e+16|0;k=e+8|0;l=e;if((a|0)==0){_a(3360,3080,30,3376)}c[f>>2]=3400;c[f+4>>2]=6;m=$H(a,f)|0;if((m|0)==0){n=(Ue(b,d)|0)&1;i=e;return n|0}c[g>>2]=0;a:do{if((c[m>>2]|0)==5){d=c[m+16>>2]|0;if((d|0)==0){o=0}else{f=j+4|0;a=0;while(1){HH(h,m,a);ika(g,h);dka(h);c[j>>2]=3408;c[f>>2]=3;p=c[g>>2]|0;if(vka(p,j)|0){o=1;break a}a=a+1|0;if(vka(p,b)|0){o=1;break a}if(!(a>>>0<d>>>0)){o=0;break}}}}else{dH(k,m);ika(g,k);dka(k);c[l>>2]=3408;c[l+4>>2]=3;d=c[g>>2]|0;if(vka(d,l)|0){q=1}else{q=vka(d,b)|0}o=q&1}}while(0);dka(g);n=o;i=e;return n|0}function vp(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;e=d;if((b|0)==0){f=0;i=d;return f|0}c[e>>2]=0;g=a+12|0;if((wp(g,b,e)|0)==0){h=tp(a,b)|0;a=h;c[e>>2]=a;c[(Gma(g,b)|0)>>2]=a;f=(h|0)!=0&1;i=d;return f|0}else{f=(c[e>>2]|0)!=0&1;i=d;return f|0}return 0}function wp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;c[f>>2]=0;if((Dma(a,b,f)|0)==0){g=0;i=e;return g|0}c[d>>2]=c[f>>2];g=1;i=e;return g|0}function xp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;e=i;i=i+48|0;f=e+32|0;g=e+24|0;h=e+16|0;j=e+8|0;k=e;if((d|0)>32|(b|0)==0){l=0;i=e;return l|0}m=c[b+16>>2]|0;HH(f,b,0);c[g>>2]=3224;c[g+4>>2]=3;n=c[f>>2]|0;do{if(vka(n,g)|0){o=GH(b,1)|0;if((o|0)!=0){p=c[o>>2]|0;if((p|0)==5){q=(xp(a,o,d+1|0)|0)==0&1;break}else if((p|0)==6){q=(vp(a,o)|0)==0&1;break}else{q=0;break}}else{q=0}}else{c[h>>2]=3232;c[h+4>>2]=2;if(vka(n,h)|0){if((m|0)<=1){q=0;break}}else{c[j>>2]=3240;c[j+4>>2]=3;if(!((vka(n,j)|0)&(m|0)>1)){q=0;break}}o=k+4|0;p=d+1|0;r=0;s=1;while(1){t=GH(b,1)|0;do{if((t|0)!=0){u=c[t>>2]|0;if((u|0)==6){v=vp(a,t)|0}else if((u|0)==5){v=xp(a,t,p)|0}else{v=0}if((s|0)!=1){c[k>>2]=3232;c[o>>2]=2;if(vka(n,k)|0){w=(v|r|0)!=0&1;break}else{w=(r|0)!=0&(v|0)!=0&1;break}}else{w=v}}else{w=r}}while(0);s=s+1|0;if((s|0)>=(m|0)){q=w;break}else{r=w}}}}while(0);dka(f);l=q;i=e;return l|0}function yp(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;d=i;i=i+96|0;e=d+80|0;f=d+72|0;g=d+64|0;h=d+56|0;j=d+48|0;k=d+40|0;l=d+32|0;m=d+24|0;n=d+16|0;o=d+8|0;p=d;if((b|0)==0){_a(3248,3080,243,3272)}c[e>>2]=3288;c[e+4>>2]=2;q=jI(b,e)|0;if((q|0)!=0){r=xp(a,q,0)|0;i=d;return r|0}c[g>>2]=669064;c[g+4>>2]=1;c[h>>2]=3296;c[h+4>>2]=5;dI(f,b,g,h);c[j>>2]=3192;c[j+4>>2]=4;h=$H(b,j)|0;a:do{if((h|0)!=0){j=c[h>>2]|0;if((j|0)==6){s=vp(a,h)|0;break}else if((j|0)!=5){s=1;break}c[k>>2]=3304;c[k+4>>2]=5;j=c[f>>2]|0;if(!(vka(j,k)|0)?(c[l>>2]=3312,c[l+4>>2]=6,!(vka(j,l)|0)):0){t=0}else{t=1}b=c[h+16>>2]|0;if((b|0)>0){g=m+4|0;q=n+4|0;e=o+4|0;u=p+4|0;v=0;while(1){w=KH(h,v)|0;if((w|0)==0){x=1}else{x=vp(a,w)|0}c[m>>2]=3296;c[g>>2]=5;w=(x|0)==0;if(!(w|(vka(j,m)|0)^1)){s=1;break a}c[n>>2]=3320;c[q>>2]=6;if((vka(j,n)|0)&w){s=1;break a}c[o>>2]=3304;c[e>>2]=5;if((vka(j,o)|0)&w){s=0;break a}c[p>>2]=3312;c[u>>2]=6;v=v+1|0;if(!(w|(vka(j,p)|0)^1)){s=0;break a}if((v|0)>=(b|0)){s=t;break}}}else{s=t}}else{s=1}}while(0);dka(f);r=s;i=d;return r|0}function zp(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+32|0;e=d+24|0;f=d+16|0;g=d+8|0;h=d;if((b|0)==0){j=1;i=d;return j|0}c[f>>2]=669480;c[f+4>>2]=4;c[g>>2]=3328;c[g+4>>2]=3;dI(e,b,f,g);c[h>>2]=3328;c[h+4>>2]=3;if(vka(c[e>>2]|0,h)|0){k=vp(a,b)|0}else{k=yp(a,b)|0}dka(e);j=k;i=d;return j|0}function Ap(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+32|0;e=d+24|0;f=d+16|0;g=d+12|0;h=d+8|0;j=d;c[a>>2]=0;k=b;while(1){if((k|0)==0){break}pe(f,38664);cI(e,k,f);do{if(doa(e)|0){if(aoa(a,1292088)|0){Pna(a,e);break}else{Un(h,e);Bp(g,h,a);Pna(a,g);Lna(g);Lna(h);break}}}while(0);pe(j,38824);b=iI(k,j)|0;Lna(e);k=b}i=d;return}function Bp(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d+8|0;f=d;Ah(e,b);Ah(f,c);Sna(a,e,f);i=d;return}function Cp(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+32|0;d=b+16|0;e=b+8|0;f=b;g=a+4|0;if(gl(c[g>>2]|0)|0){h=0;i=b;return h|0}oe(e,g);oL(d,e);pe(f,669520);h=rL(d,f,2)|0;i=b;return h|0}function Dp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;i=i+80|0;f=e+64|0;h=e+56|0;j=e+48|0;k=e+40|0;l=e+32|0;m=e+24|0;n=e+16|0;o=e+8|0;p=e;mka(b,1305928);g[d>>2]=0.0;q=a+4|0;if(gl(c[q>>2]|0)|0){i=e;return}oe(h,q);oL(f,h);pe(j,669520);if((rL(f,j,2)|0)!=0){qL(l,f);jka(k,l);ika(b,k);dka(k);Cka(b);qL(o,f);jka(n,o);oe(m,n);g[d>>2]=+Hna(m);dka(n)}uL(p,b);ika(b,p);dka(p);i=e;return}function Ep(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;i=i+48|0;d=b+32|0;e=b+24|0;f=b+16|0;g=b+8|0;h=b;j=a+4|0;if(gl(c[j>>2]|0)|0){k=0;i=b;return k|0}oe(e,j);oL(d,e);pe(f,1291936);if((rL(d,f,1)|0)!=0){k=1;i=b;return k|0}f=d+8|0;c[f>>2]=0;pe(g,1291912);if((rL(d,g,3)|0)!=0){k=1;i=b;return k|0}c[f>>2]=0;pe(h,1291952);k=rL(d,h,4)|0;i=b;return k|0}function Fp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;e=i;i=i+240|0;f=e+224|0;h=e+216|0;j=e+208|0;k=e+200|0;l=e+192|0;m=e+184|0;n=e+176|0;o=e+168|0;p=e+160|0;q=e+152|0;r=e+144|0;s=e+136|0;t=e+128|0;u=e+120|0;v=e+112|0;w=e+104|0;x=e+96|0;y=e+88|0;z=e+80|0;A=e+72|0;B=e+64|0;C=e+56|0;D=e+48|0;E=e+40|0;F=e+32|0;G=e+24|0;H=e+16|0;I=e+8|0;J=e;c[b>>2]=0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;K=a+4|0;if(gl(c[K>>2]|0)|0){i=e;return}oe(h,K);oL(f,h);pe(j,1291936);if((rL(f,j,1)|0)!=0){c[b>>2]=1;qL(m,f);jka(l,m);oe(k,l);g[d>>2]=+Hna(k);dka(l);i=e;return}l=f+8|0;c[l>>2]=0;pe(n,1291912);if((rL(f,n,3)|0)!=0){c[b>>2]=2;qL(q,f);jka(p,q);oe(o,p);g[d>>2]=+Hna(o);dka(p);qL(t,f);jka(s,t);oe(r,s);g[d+4>>2]=+Hna(r);dka(s);qL(w,f);jka(v,w);oe(u,v);g[d+8>>2]=+Hna(u);dka(v);i=e;return}c[l>>2]=0;pe(x,1291952);if((rL(f,x,4)|0)==0){i=e;return}c[b>>2]=3;qL(A,f);jka(z,A);oe(y,z);g[d>>2]=+Hna(y);dka(z);qL(D,f);jka(C,D);oe(B,C);g[d+4>>2]=+Hna(B);dka(C);qL(G,f);jka(F,G);oe(E,F);g[d+8>>2]=+Hna(E);dka(F);qL(J,f);jka(I,J);oe(H,I);g[d+12>>2]=+Hna(H);dka(I);i=e;return}function Gp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0;e=i;i=i+240|0;f=e+224|0;g=e+216|0;h=e+208|0;j=e+200|0;k=e+192|0;l=e+184|0;m=e+176|0;n=e+168|0;o=e+160|0;p=e+152|0;q=e+144|0;r=e+136|0;s=e+128|0;t=e+120|0;u=e+112|0;v=e+104|0;w=e+96|0;x=e+88|0;y=e+80|0;z=e+72|0;A=e+64|0;B=e+56|0;C=e+48|0;D=e+40|0;E=e+32|0;F=e+24|0;G=e+16|0;H=e+8|0;I=e;c[b>>2]=0;c[d>>2]=0;J=a+4|0;if(gl(c[J>>2]|0)|0){i=e;return}oe(g,J);oL(f,g);pe(h,1291936);if((rL(f,h,1)|0)!=0){c[d>>2]=1;qL(l,f);jka(k,l);oe(j,k);K=+Hna(j)*255.0+.5;dka(k);k=~~K;c[b>>2]=k|k<<8|k<<16|-16777216;i=e;return}k=f+8|0;c[k>>2]=0;pe(m,1291912);if((rL(f,m,3)|0)!=0){c[d>>2]=2;qL(p,f);jka(o,p);oe(n,o);K=+Hna(n)*255.0+.5;dka(o);qL(s,f);jka(r,s);oe(q,r);L=+Hna(q);dka(r);qL(v,f);jka(u,v);oe(t,u);M=+Hna(t)*255.0+.5;dka(u);c[b>>2]=~~K<<16|~~(L*255.0+.5)<<8|~~M|-16777216;i=e;return}c[k>>2]=0;pe(w,1291952);if((rL(f,w,4)|0)==0){i=e;return}c[d>>2]=3;qL(z,f);jka(y,z);oe(x,y);M=+Hna(x);dka(y);qL(C,f);jka(B,C);oe(A,B);L=+Hna(A);dka(B);qL(F,f);jka(E,F);oe(D,E);K=+Hna(D);dka(E);qL(I,f);jka(H,I);oe(G,H);N=+Hna(G);dka(H);O=M+N;M=L+N;L=K+N;c[b>>2]=~~((1.0-(L>1.0?1.0:L))*255.0+.5)|~~((1.0-(M>1.0?1.0:M))*255.0+.5)<<8|~~((1.0-(O>1.0?1.0:O))*255.0+.5)<<16|-16777216;i=e;return}function Hp(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;d=i;i=i+64|0;e=d+56|0;f=d+48|0;g=d+40|0;h=d+36|0;j=d+32|0;k=d+28|0;l=d+24|0;m=d+20|0;n=d+16|0;o=d+8|0;p=d;if((b|0)==0){i=d;return}q=c[a>>2]|0;do{if((q|0)==0){r=Wm()|0;c[a>>2]=r;if((r|0)==0){i=d;return}else{s=b+16|0;t=II(s,r)|0;r=c[b+52>>2]|0;pe(e,669448);vI(r,e,s,t);u=c[a>>2]|0;break}}else{u=q}}while(0);c[f>>2]=0;pe(g,669464);if((nI(u,g)|0)==0){c[h>>2]=0;c[j>>2]=0;eka(k,1290288,-1);g=An(b,k)|0;dka(k);if((g|0)==0){v=0}else{Ip(a,b,g,h);ika(j,h);vL(n,j);Jp(m,1305904,n);Vm(l,m,3496);ika(f,l);dka(l);dka(m);dka(n);v=c[f>>2]|0}dka(j);dka(h);if((v|0)!=0?(c[v+4>>2]|0)!=0:0){rka(f,1305864)}}rka(f,3504);v=c[a>>2]|0;pe(o,669512);if((nI(v,o)|0)==0){o=c[a>>2]|0;pe(p,669512);uI(o,p,f)}dka(f);i=d;return}function Ip(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;f=i;i=i+64|0;g=f+48|0;h=f+40|0;j=f+32|0;k=f+24|0;l=f+16|0;m=f+8|0;n=f;if((d|0)==0){i=f;return}o=c[a>>2]|0;if((o|0)==0){Hp(a,b);p=c[a>>2]|0}else{p=o}c[g>>2]=0;do{if((Lp(p,d,g)|0)==0){o=c[a>>2]|0;if((o|0)==0){Hp(a,b);q=c[a>>2]|0}else{q=o}pe(h,669464);o=iI(q,h)|0;if((o|0)==0){r=Wm()|0;if((r|0)==0){break}s=c[a>>2]|0;pe(j,669464);oI(s,j,r,0);t=r}else{t=o}pe(k,669472);o=iI(t,k)|0;if((o|0)==0){r=Wm()|0;pe(l,669472);oI(t,l,r,0);u=r}else{u=o}if(gl(c[e>>2]|0)|0){ika(e,d+88|0)}Tka(e,32);o=c[e>>2]|0;zn(m,t,(o|0)==0?1305928:o+12|0);ika(e,m);dka(m);oe(n,e);if((b|0)==0){v=0}else{v=b+16|0}vI(u,n,v,c[(c[d+96>>2]|0)+4>>2]|0)}else{ika(e,g)}}while(0);dka(g);i=f;return}function Jp(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d+8|0;f=d;pe(e,b);oe(f,c);lka(a,e,f);i=d;return}function Kp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;i=i+48|0;f=e+32|0;g=e+24|0;h=e+16|0;j=e+12|0;k=e+8|0;l=e;if((a|0)==0){m=0;i=e;return m|0}pe(f,669464);n=iI(a,f)|0;if((n|0)==0){m=0;i=e;return m|0}pe(g,669472);f=iI(n,g)|0;if((f|0)==0){m=0;i=e;return m|0}g=YH(f)|0;c[h>>2]=g;if((g|0)==0){m=0;i=e;return m|0}while(1){c[j>>2]=0;g=ZH(f,h,j)|0;if(((((((g|0)!=0?(n=oH(g)|0,(n|0)!=0):0)?(c[n>>2]|0)==6:0)?(pe(l,669480),aI(k,n,l),g=yl(k,669472)|0,dka(k),!g):0)?(o=RA(b,n)|0,(o|0)!=0):0)?(n=c[o+12>>2]|0,(n|0)!=0):0)?(c[n+8>>2]|0)==0:0){break}dka(j);if((c[h>>2]|0)==0){m=0;p=15;break}}if((p|0)==15){i=e;return m|0}ika(d,j);dka(j);m=o;i=e;return m|0}function Lp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;i=i+48|0;f=e+32|0;g=e+24|0;h=e+16|0;j=e+12|0;k=e+8|0;l=e;if((a|0)==0|(b|0)==0){m=0;i=e;return m|0}pe(f,669464);n=iI(a,f)|0;if((n|0)==0){m=0;i=e;return m|0}pe(g,669472);f=iI(n,g)|0;if((f|0)==0){m=0;i=e;return m|0}g=YH(f)|0;c[h>>2]=g;if((g|0)==0){m=0;i=e;return m|0}g=b+96|0;a:while(1){c[j>>2]=0;b=ZH(f,h,j)|0;do{if((b|0)==0){dka(j)}else{n=oH(b)|0;if((n|0)==0){dka(j);break}if((c[n>>2]|0)!=6){dka(j);break}pe(l,669480);aI(k,n,l);a=yl(k,669472)|0;dka(k);if(a){dka(j);break}if((c[g>>2]|0)==(n|0)){break a}dka(j)}}while(0);if((c[h>>2]|0)==0){m=0;o=18;break}}if((o|0)==18){i=e;return m|0}ika(d,j);dka(j);m=1;i=e;return m|0}function Mp(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;g=i;i=i+48|0;h=g+40|0;j=g+32|0;k=g+28|0;l=g+24|0;m=g+20|0;n=g+16|0;o=g+8|0;p=g;if((a|0)==0){q=0;i=g;return q|0}pe(h,669464);r=iI(a,h)|0;if((r|0)==0){q=0;i=g;return q|0}pe(j,669472);h=iI(r,j)|0;if((h|0)==0){q=0;i=g;return q|0}j=c[d>>2]|0;if((j|0)!=0?(c[j+4>>2]|0)>0:0){Tka(d,32)}j=YH(h)|0;c[k>>2]=j;if((j|0)==0){q=0;i=g;return q|0}while(1){c[l>>2]=0;c[m>>2]=0;j=ZH(h,k,l)|0;if(((((j|0)!=0?(r=oH(j)|0,(r|0)!=0):0)?(c[r>>2]|0)==6:0)?(pe(o,669480),aI(n,r,o),j=yl(n,669472)|0,dka(n),!j):0)?(j=RA(b,r)|0,c[e>>2]=j,(j|0)!=0):0){c[p>>2]=0;ika(p,j+88|0);Tka(p,32);if(wka(c[p>>2]|0,d)|0){ika(f,l);s=1}else{s=0}dka(p);t=s}else{t=2}dka(m);dka(l);if((t|0)==1){q=1;u=19;break}if((c[k>>2]|0)==0){q=0;u=19;break}}if((u|0)==19){i=g;return q|0}return 0}function Np(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;i=i+16|0;f=e+12|0;g=e+8|0;h=e+4|0;j=e;k=c[a>>2]|0;if((k|0)==0){Hp(a,b);l=c[a>>2]|0}else{l=k}c[f>>2]=0;k=Kp(l,b,f)|0;c[g>>2]=k;if((k|0)!=0){ika(d,f);m=k;dka(f);i=e;return m|0}Bn(h);k=c[h>>2]|0;if(((k|0)!=0?(c[k+4>>2]|0)!=0:0)?(k=c[a>>2]|0,hka(j,h),a=Mp(k,b,j,g,d)|0,dka(j),(a|0)!=0):0){n=c[g>>2]|0}else{c[g>>2]=0;n=0}dka(h);m=n;dka(f);i=e;return m|0}function Op(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;e=Np(a,b,c)|0;i=d;return e|0}function Pp(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0;b=i;i=i+32|0;c=b+16|0;d=b+8|0;e=b;if((a|0)==0){f=0;i=b;return f|0}pe(d,3512);pe(e,1293592);dI(c,a,d,e);if(!(ah(c,1274280)|0)){if(ah(c,39648)|0){g=2}else{e=ah(c,1274672)|0;g=e?3:0}}else{g=1}dka(c);f=g;i=b;return f|0}function Qp(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;b=i;i=i+32|0;c=b+16|0;d=b+8|0;e=b;if((a|0)==0){f=1;i=b;return f|0}pe(d,39648);pe(e,669064);dI(c,a,d,e);e=(yl(c,1293592)|0)&1;dka(c);f=e;i=b;return f|0}function Rp(a){a=a|0;var b=0,c=0,d=0;b=i;i=i+16|0;c=b;if((a|0)==0){d=0;i=b;return d|0}pe(c,3520);d=hI(a,c,0)|0;i=b;return d|0}function Sp(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=c[a+20>>2]|0;if((e|0)<=0){i=d;return}f=a+16|0;a=0;do{g=Ch(f,a)|0;if((g|0)!=0){Tp(b,(fo(g)|0)!=0&1)}a=a+1|0}while((a|0)!=(e|0));i=d;return}function Tp(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=b+4|0;g=c[f>>2]|0;h=g+1|0;do{if((g|0)>=(c[b+8>>2]|0)){if((Kja(b,h)|0)==0){i=e;return}else{j=c[f>>2]|0;break}}else{c[f>>2]=h;j=h}}while(0);a[(c[b>>2]|0)+(j+ -1)>>0]=d;i=e;return}function Up(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;e=d+8|0;f=d;if((c|0)>32|(a|0)==0){g=0;i=d;return g|0}pe(e,b);h=$H(a,e)|0;if((h|0)!=0){g=h;i=d;return g|0}pe(f,38824);h=iI(a,f)|0;if((h|0)==0){g=0;i=d;return g|0}g=Up(h,b,c+1|0)|0;i=d;return g|0}function Vp(a){a=a|0;var b=0;b=i;v2a(a);i=b;return}function Wp(a){a=a|0;return}function Xp(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=i;if((f|0)>(b|0)){c[a>>2]=d;c[a+4>>2]=e;c[a+8>>2]=b;i=g;return}else{c[a>>2]=d;c[a+4>>2]=e;c[a+8>>2]=f+ -1;i=g;return}}function Yp(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=i;if((f|0)<(b|0)){c[a>>2]=d;c[a+4>>2]=e;c[a+8>>2]=b;i=g;return}else{c[a>>2]=d;c[a+4>>2]=e;c[a+8>>2]=f+1;i=g;return}}function Zp(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;c[a>>2]=3552;c[a+4>>2]=-1;c[a+8>>2]=-1;c[a+12>>2]=-1;c[a+16>>2]=4480;e=a+20|0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+20>>2]=0;c[e+24>>2]=0;wt(a+48|0);Ija(a+72|0,4);c[a+88>>2]=b;i=d;return}function _p(a){a=a|0;var b=0;b=i;ut(a);i=b;return}function $p(a){a=a|0;var b=0;b=i;st(a);i=b;return}function aq(a){a=a|0;var b=0;b=i;bq(a);v2a(a);i=b;return}function bq(a){a=a|0;var b=0;b=i;c[a>>2]=3552;cq(a);Jja(c[a+72>>2]|0);ut(a+48|0);st(a+16|0);i=b;return}function cq(a){a=a|0;var b=0;b=i;dq(a);eq(a+48|0);i=b;return}function dq(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+72|0;e=c[a+76>>2]|0;if((e|0)>0){f=0}else{Kja(d,0)|0;i=b;return}do{a=fq(d,f)|0;if((a|0)!=0){Rc[c[(c[a>>2]|0)+4>>2]&1023](a)}f=f+1|0}while((f|0)!=(e|0));Kja(d,0)|0;i=b;return}function eq(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=c[a+8>>2]|0;if((d|0)>0){e=a+4|0;f=0;do{g=qt(e,f)|0;if((g|0)!=0){Rc[c[(c[g>>2]|0)+4>>2]&1023](g)}f=f+1|0}while((f|0)!=(d|0))}Kja(a+4|0,0)|0;c[a+20>>2]=0;i=b;return}function fq(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)>-1?(c[a+4>>2]|0)>(b|0):0){e=dt(a,b)|0}else{e=0}i=d;return e|0}function gq(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=c[a+56>>2]|0;if((d|0)<=0){i=b;return}e=a+52|0;f=a+4|0;a=0;do{g=qt(e,a)|0;if((g|0)!=0){c[g+4>>2]=c[f>>2];c[g+8>>2]=a;c[g+12>>2]=-1}a=a+1|0}while((a|0)!=(d|0));i=b;return}function hq(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;g=u2a(32)|0;pt(g,e);do{if((g|0)!=0){e=b+72|0;h=c[b+76>>2]|0;j=c[d+8>>2]|0;k=(j|0)<(h|0)?j:h;j=(k|0)>0?k:0;if((j|0)==(h|0)){iq(e,g);break}else{jq(e,j,g);break}}}while(0);c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];i=f;return}function iq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+4|0;f=c[e>>2]|0;g=f+1|0;do{if((f|0)>=(c[a+8>>2]|0)){if((Kja(a,g)|0)==0){i=d;return}else{h=c[e>>2]|0;break}}else{c[e>>2]=g;h=g}}while(0);c[(c[a>>2]|0)+(h+ -1<<2)>>2]=b;i=d;return}function jq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;if((Nja(a,b)|0)==0){i=e;return}c[(c[a>>2]|0)+(b<<2)>>2]=d;i=e;return}function kq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=c[b+4>>2]|0;g=lq(b+48|0,d)|0;c[a>>2]=f;c[a+4>>2]=g;c[a+8>>2]=-1;i=e;return}function lq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=a+20|0;f=c[e>>2]|0;if((f|0)<(c[a+8>>2]|0)){g=qt(a+4|0,f)|0;if((g|0)!=0){h=g+16|0;c[h+0>>2]=c[b+0>>2];c[h+4>>2]=c[b+4>>2];c[h+8>>2]=c[b+8>>2];c[h+12>>2]=c[b+12>>2];c[h+16>>2]=c[b+16>>2];c[h+20>>2]=c[b+20>>2];c[h+24>>2]=c[b+24>>2];c[h+28>>2]=c[b+28>>2]}h=c[e>>2]|0;c[e>>2]=h+1;j=h;i=d;return j|0}else{h=u2a(48)|0;c[h>>2]=3536;c[h+4>>2]=-1;c[h+8>>2]=-1;c[h+12>>2]=-1;g=h+16|0;c[g>>2]=0;c[h+20>>2]=-1;c[h+24>>2]=-1;k=h+28|0;c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;if((h|0)==0){j=f;i=d;return j|0}c[g+0>>2]=c[b+0>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];c[g+16>>2]=c[b+16>>2];c[g+20>>2]=c[b+20>>2];c[g+24>>2]=c[b+24>>2];c[g+28>>2]=c[b+28>>2];ot(a+4|0,h);h=c[e>>2]|0;c[e>>2]=h+1;j=h;i=d;return j|0}return 0}function mq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+64|0;e=d+28|0;f=d;g=c[b+88>>2]|0;if((c[g+60>>2]|0)>0){c[e>>2]=3568;h=e+4|0;j=e+20|0;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;c[j>>2]=g;c[e+24>>2]=b;nq(a,e);i=d;return}else{c[f>>2]=3568;e=f+4|0;j=f+20|0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[j>>2]=g;c[f+24>>2]=b;oq(a,f);i=d;return}}function nq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0,H=0.0,I=0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0;d=i;e=b+20|0;f=(c[e>>2]|0)+120|0;h=Kq(c[f>>2]|0)|0;j=c[e>>2]|0;k=+Vc[c[(c[j>>2]|0)+124>>2]&15](j);l=+Jq(c[f>>2]|0,h,k);h=(c[e>>2]|0)+120|0;f=Kq(c[h>>2]|0)|0;j=c[e>>2]|0;k=+Vc[c[(c[j>>2]|0)+124>>2]&15](j);m=+Lq(c[h>>2]|0,f,k);f=b+4|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;h=c[e>>2]|0;j=c[h+60>>2]|0;if((j|0)<1){n=1.0}else{n=+(j|0)}k=(+g[h+12>>2]- +g[h+8>>2])/n;h=b+24|0;j=qt((c[h>>2]|0)+52|0,0)|0;if((j|0)==0){o=0.0;p=0.0;q=+o;r=f;s=r;c[s>>2]=0;t=r+4|0;u=t;g[u>>2]=q;v=b+12|0;g[v>>2]=p;w=b+16|0;g[w>>2]=0.0;c[a+0>>2]=c[f+0>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];i=d;return}x=c[e>>2]|0;y=c[h>>2]|0;z=y+16|0;n=l+(+xq(x,z)+0.0);A=Mq(x,z)|0;if((A|0)==1){z=((c[x+60>>2]|0)-(c[y+76>>2]|0)|0)/2|0;B=j+28|0;g[B>>2]=k*+(z|0)-k*.5;C=B;D=z}else if((A|0)==0){z=j+28|0;g[z>>2]=k*.5;C=z;D=0}else if((A|0)==2){A=(c[x+60>>2]|0)-(c[y+76>>2]|0)|0;y=j+28|0;g[y>>2]=k*+(A|0)-k*.5;C=y;D=A}else{C=j+28|0;D=0}A=c[(c[h>>2]|0)+76>>2]|0;E=k;F=l;l=m;y=0;m=0.0;a:while(1){x=y;while(1){if((x|0)>=(A|0)){break a}if((x|0)>=(c[(c[e>>2]|0)+60>>2]|0)){break a}G=x+1|0;z=fq((c[h>>2]|0)+72|0,G)|0;if((z|0)==0){H=0.0}else{g[z+20>>2]=0.0;H=+Aq(c[e>>2]|0,z)}I=fq((c[h>>2]|0)+72|0,x)|0;if((I|0)==0){x=G}else{break}}z=I+20|0;g[z>>2]=0.0;J=+Aq(c[e>>2]|0,I);K=+Nq(c[e>>2]|0,I,0);L=+Oq(c[e>>2]|0,I,0);M=E*(+(x+D|0)+.5)-J*.5;g[I+12>>2]=M;g[I+16>>2]=n;if((x|0)==0){g[C>>2]=M}if((x|0)==((c[(c[h>>2]|0)+76>>2]|0)+ -1|0)){N=0.0}else{O=k-(H+J)*.5;N=O>0.0?O:0.0}g[z>>2]=N;F=F>K?F:K;l=l<L?l:L;y=G;m=J+M}c[j+20>>2]=0;c[j+24>>2]=(c[(c[h>>2]|0)+76>>2]|0)+ -1;g[j+32>>2]=n;g[j+36>>2]=m- +g[C>>2];g[j+40>>2]=F;g[j+44>>2]=l;o=m;p=n-l;q=+o;r=f;s=r;c[s>>2]=0;t=r+4|0;u=t;g[u>>2]=q;v=b+12|0;g[v>>2]=p;w=b+16|0;g[w>>2]=0.0;c[a+0>>2]=c[f+0>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];i=d;return}function oq(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=b+24|0;c[(c[e>>2]|0)+68>>2]=0;Pq(b,1,0.0);Rq((c[e>>2]|0)+48|0);Sq(b);e=b+4|0;c[a+0>>2]=c[e+0>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];i=d;return}function pq(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+32|0;f=e;c[f>>2]=3568;g=f+4|0;h=f+20|0;j=b+88|0;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[h>>2]=c[j>>2];c[f+24>>2]=b;qq(a,f,d);i=e;return}function qq(a,b,c){a=a|0;b=b|0;c=+c;var d=0,e=0.0;d=i;Pq(b,0,c);c=+g[b+8>>2]- +g[b+4>>2];e=+Qq(+g[b+12>>2],+g[b+16>>2]);g[a>>2]=c;g[a+4>>2]=e;i=d;return}function rq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=qt(b+52|0,0)|0;if((e|0)==0){f=b+4|0;c[a+0>>2]=c[f+0>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];i=d;return}else{f=c[e+8>>2]|0;c[a>>2]=c[e+4>>2];c[a+4>>2]=f;c[a+8>>2]=-1;i=d;return}}function sq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=qt(b+52|0,(c[b+56>>2]|0)+ -1|0)|0;if((e|0)==0){f=b+4|0;c[a+0>>2]=c[f+0>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];i=d;return}else{f=c[e+8>>2]|0;b=c[e+24>>2]|0;c[a>>2]=c[e+4>>2];c[a+4>>2]=f;c[a+8>>2]=b;i=d;return}}function tq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;f=d+4|0;g=c[f>>2]|0;if((g|0)<0){rq(a,b);i=e;return}if((g|0)>=(c[b+56>>2]|0)){sq(a,b);i=e;return}h=b+52|0;b=qt(h,g)|0;if((b|0)!=0){g=c[d+8>>2]|0;j=c[b+20>>2]|0;if((g|0)==(j|0)){k=c[f>>2]|0;c[a>>2]=c[d>>2];c[a+4>>2]=k;c[a+8>>2]=-1;i=e;return}if((g|0)>=(j|0)){Xp(a,c[b+24>>2]|0,c[d>>2]|0,c[f>>2]|0,g);i=e;return}g=qt(h,(c[f>>2]|0)+ -1|0)|0;if((g|0)!=0){f=c[g+8>>2]|0;h=c[g+24>>2]|0;c[a>>2]=c[g+4>>2];c[a+4>>2]=f;c[a+8>>2]=h;i=e;return}}c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];i=e;return}function uq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=d+4|0;g=c[f>>2]|0;if((g|0)<0){rq(a,b);i=e;return}if((g|0)>=(c[b+56>>2]|0)){sq(a,b);i=e;return}h=b+52|0;b=qt(h,g)|0;if((b|0)!=0){g=c[d+8>>2]|0;if((g|0)<(c[b+24>>2]|0)){Yp(a,c[b+20>>2]|0,c[d>>2]|0,c[f>>2]|0,g);i=e;return}g=qt(h,(c[f>>2]|0)+1|0)|0;if((g|0)!=0){f=c[g+8>>2]|0;c[a>>2]=c[g+4>>2];c[a+4>>2]=f;c[a+8>>2]=-1;i=e;return}}c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];i=e;return}function vq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;e=c[a+56>>2]|0;f=e+ -1|0;if((e|0)<1){i=d;return}e=a+52|0;a=b+8|0;g=0;h=f;j=f;a:while(1){f=g;k=h;while(1){l=(k|0)/2|0;m=qt(e,l)|0;if((m|0)==0){n=10;break a}o=c[a>>2]|0;if((o|0)<(c[m+20>>2]|0)){break}if((o|0)<=(c[m+24>>2]|0)){n=9;break a}m=l+1|0;if((l|0)<(j|0)){f=m;k=m+j|0}else{n=10;break a}}k=l+ -1|0;if((f|0)>(k|0)){n=10;break}else{g=f;h=k+f|0;j=k}}if((n|0)==9){c[b+4>>2]=l;i=d;return}else if((n|0)==10){i=d;return}}function wq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0,H=0,I=0,J=0;e=i;i=i+48|0;f=e+16|0;h=e;rq(a,b);j=c[b+56>>2]|0;k=b+52|0;do{if((j|0)<1){l=1;m=18}else{n=b+88|0;o=b+16|0;p=d+4|0;q=1;r=1;s=0;t=j;u=j+ -1|0;a:while(1){v=q;w=r;x=t;y=u;while(1){z=(x|0)/2|0;do{A=qt(k,z)|0}while((A|0)==0);B=+g[A+32>>2];C=B- +g[A+40>>2];D=C- +xq(c[n>>2]|0,o);E=B- +g[A+44>>2];F=+g[p>>2];if(F>D){B=F-D;G=B<1.0e-4&B>-1.0e-4?w:0}else{G=w}if(F<E){B=F-E;H=B<1.0e-4&B>-1.0e-4?v:0}else{H=v}if(!(F<D)){break}B=F-D;if(B<1.0e-4&B>-1.0e-4){break}I=z+ -1|0;if((s|0)>(I|0)){m=17;break a}else{v=H;w=G;x=I+s|0;y=I}}if(!(F>E)){break}B=F-E;if(B<1.0e-4&B>-1.0e-4){break}x=z+1|0;if((z|0)<(y|0)){q=H;r=G;s=x;t=x+y|0;u=y}else{m=17;break}}if((m|0)==17){if((G|0)==0){J=H;break}else{l=H;m=18;break}}B=+g[d>>2];u=A+4|0;t=A+8|0;Yp(h,c[A+20>>2]|0,c[u>>2]|0,c[t>>2]|0,-1);s=c[u>>2]|0;u=c[t>>2]|0;t=c[A+24>>2]|0;c[f+0>>2]=-1;c[f+4>>2]=-1;c[f+8>>2]=-1;c[f+12>>2]=-1;c[f+0>>2]=c[h+0>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=s;c[f+16>>2]=u;c[f+20>>2]=t;nt(f);yq(a,b,B,f);c[a+4>>2]=z;i=e;return}}while(0);if((m|0)==18){rq(a,b);J=l}if((J|0)==0){i=e;return}sq(a,b);i=e;return}function xq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;if((c[a+108>>2]|0)!=0?(e=c[b+24>>2]|0,(e|0)!=0):0){f=e}else{f=a+80|0}i=d;return+(+g[f>>2])}function yq(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0;f=i;h=e;j=c[h+4>>2]|0;k=a;c[k>>2]=c[h>>2];c[k+4>>2]=j;j=a+8|0;c[j>>2]=-1;a=b+88|0;if((c[a>>2]|0)==0){i=f;return}k=c[e+8>>2]|0;h=(c[e+20>>2]|0)+1|0;e=(h+k|0)/2|0;l=b+72|0;a:do{if((k|0)>=(h|0)|(e|0)==(k|0)){m=e}else{b=k;n=e;o=h;b:while(1){p=b;q=n;while(1){if((q|0)==(o|0)){break b}r=fq(l,q)|0;if((r|0)==0){m=q;break a}s=+g[r+12>>2];if(!(s+ +Aq(c[a>>2]|0,r)*.5<d)){break}r=(q+o|0)/2|0;if((q|0)>=(o|0)|(r|0)==(q|0)){m=r;break a}else{t=q;q=r;p=t}}t=(q+p|0)/2|0;if((p|0)>=(q|0)|(t|0)==(p|0)){m=t;break a}else{b=p;n=t;o=q}}m=o+ -1|0}}while(0);h=fq(l,m)|0;if((h|0)==0){i=f;return}s=+g[h+12>>2];if(!(s+ +Aq(c[a>>2]|0,h)*.5<d)){i=f;return}c[j>>2]=m;i=f;return}function zq(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;var f=0,h=0,j=0,k=0,l=0.0,m=0,n=0;f=i;i=i+48|0;h=f+16|0;j=f;k=qt(b+52|0,e)|0;if((k|0)==0){rq(a,b);i=f;return}else{l=d- +g[b+20>>2];e=k+4|0;m=k+8|0;Yp(j,c[k+20>>2]|0,c[e>>2]|0,c[m>>2]|0,-1);n=c[e>>2]|0;e=c[m>>2]|0;m=c[k+24>>2]|0;c[h+0>>2]=-1;c[h+4>>2]=-1;c[h+8>>2]=-1;c[h+12>>2]=-1;c[h+0>>2]=c[j+0>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];c[h+12>>2]=n;c[h+16>>2]=e;c[h+20>>2]=m;nt(h);yq(a,b,l,h);i=f;return}}function Aq(a,d){a=a|0;d=d|0;var e=0,f=0,h=0,j=0,k=0.0,l=0,m=0.0,n=0,o=0,p=0.0;e=i;f=Vr(c[a+108>>2]|0,d)|0;h=b[d+4>>1]|0;j=b[a+92>>1]|0;k=+Xr(a,d);l=Yr(a,d)|0;m=+Ur(a,d,0);n=c[d+28>>2]|0;if((n|0)==0){o=0}else{o=c[n+16>>2]|0}p=+Wq(c[a+120>>2]|0,f,h,j,k,l,m,+g[d+20>>2],o);i=e;return+p}function Bq(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if(!((b|0)>-1)){i=d;return}e=a+72|0;a=b;while(1){b=fq(e,a)|0;if((b|0)!=0){Rc[c[(c[b>>2]|0)+4>>2]&1023](b)}Cq(e,a);if((a|0)>0){a=a+ -1|0}else{break}}i=d;return}function Cq(a,b){a=a|0;b=b|0;var d=0;d=i;if((b|0)>-1?(c[a+4>>2]|0)>(b|0):0){Oja(a,b)}i=d;return}function Dq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=a+72|0;f=(c[a+76>>2]|0)+ -1|0;if((f|0)>(b|0)){g=f}else{i=d;return}do{f=fq(e,g)|0;if((f|0)!=0){Rc[c[(c[f>>2]|0)+4>>2]&1023](f)}Cq(e,g);g=g+ -1|0}while((g|0)>(b|0));i=d;return}function Eq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;if((d|0)<=(b|0)){i=e;return}f=a+72|0;a=d;do{d=fq(f,a)|0;if((d|0)!=0){Rc[c[(c[d>>2]|0)+4>>2]&1023](d)}Cq(f,a);a=a+ -1|0}while((a|0)>(b|0));i=e;return}function Fq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+32|0;e=d+12|0;f=d;rq(e,a);sq(f,a);g=(Nm(b,e)|0)>-1;e=(Nm(b+12|0,f)|0)<1;if(g){g=c[b+8>>2]|0;if(e){Eq(a,g,c[b+20>>2]|0);i=d;return}else{Dq(a,g);i=d;return}}else{if(e){Bq(a,c[b+20>>2]|0);i=d;return}else{dq(a);i=d;return}}}function Gq(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+72|0;a=b+8|0;b=fq(e,c[a>>2]|0)|0;if((b|0)!=0){Rc[c[(c[b>>2]|0)+4>>2]&1023](b)}Cq(e,c[a>>2]|0);i=d;return}function Hq(a){a=a|0;var b=0;b=i;$1a(a);i=b;return}function Iq(a){a=a|0;return}function Jq(a,b,c){a=a|0;b=b|0;c=+c;var d=0,e=0.0;d=i;e=+(Zr(a,b)|0)*c*.0010000000474974513;i=d;return+e}function Kq(a){a=a|0;var b=0,d=0;b=i;if((a|0)==0){d=-1;i=b;return d|0}d=Lc[c[(c[a>>2]|0)+20>>2]&255](a)|0;i=b;return d|0}function Lq(a,b,c){a=a|0;b=b|0;c=+c;var d=0,e=0.0;d=i;e=+(_r(a,b)|0)*c*.0010000000474974513;i=d;return+e}function Mq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;if((c[a+108>>2]|0)!=0?(e=c[b+24>>2]|0,(e|0)!=0):0){f=e+8|0}else{f=a+76|0}i=d;return c[f>>2]|0}function Nq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,h=0.0;e=i;f=Vr(c[a+108>>2]|0,b)|0;g=+Ur(a,b,d);h=+Jq(c[a+120>>2]|0,f,g);i=e;return+h}function Oq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,h=0.0;e=i;f=Vr(c[a+108>>2]|0,b)|0;g=+Ur(a,b,d);h=+Lq(c[a+120>>2]|0,f,g);i=e;return+h}function Pq(a,d,e){a=a|0;d=d|0;e=+e;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0,u=0.0,v=0,w=0,x=0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0,F=0.0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0,N=0.0,O=0,P=0,Q=0.0,R=0,S=0.0,T=0.0,U=0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0.0,ea=0.0,fa=0,ga=0.0,ha=0.0,ia=0.0,ja=0.0,ka=0,la=0,ma=0,na=0,oa=0.0,pa=0,qa=0.0,ra=0,sa=0,ta=0.0,ua=0.0,va=0.0,wa=0,xa=0.0,ya=0.0,za=0.0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0.0,Fa=0.0,Ga=0.0,Ha=0.0,Ia=0,Ja=0.0,Ka=0,La=0,Ma=0,Na=0;f=i;i=i+80|0;h=f+40|0;j=f+24|0;k=f+12|0;l=f;c[h>>2]=0;m=h+4|0;c[m>>2]=-1;n=h+8|0;c[n>>2]=-1;o=h+12|0;c[o+0>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[o+16>>2]=0;o=a+20|0;p=c[o>>2]|0;q=+g[p+12>>2]- +g[p+8>>2];r=a+24|0;s=c[r>>2]|0;t=s+16|0;u=q- +Tq(c[p+108>>2]|0,t);v=u>0.0;q=v?u:0.0;w=c[s+76>>2]|0;x=(d|0)==0;if((w|0)<=0){if(x){d=p+120|0;y=Kq(c[d>>2]|0)|0;u=+Jq(c[d>>2]|0,y,e);y=(c[o>>2]|0)+120|0;d=Kq(c[y>>2]|0)|0;z=u;A=+Lq(c[y>>2]|0,d,e)}else{u=+Yq(p,t);B=+Zq(c[o>>2]|0,(c[r>>2]|0)+16|0);c[m>>2]=-1;c[n>>2]=-1;c[h>>2]=0;g[h+20>>2]=0.0;g[h+24>>2]=u;g[h+28>>2]=B;kq(l,c[r>>2]|0,h);z=u;A=B}C=0.0;D=z+ +xq(c[o>>2]|0,(c[r>>2]|0)+16|0)-A+0.0;E=a+4|0;F=+C;G=E;H=G;c[H>>2]=0;I=G+4|0;J=I;g[J>>2]=F;K=a+12|0;g[K>>2]=D;L=a+16|0;g[L>>2]=0.0;i=f;return}l=h+20|0;t=h+24|0;p=h+28|0;A=0.0;d=s;s=0;z=0.0;B=0.0;u=0.0;M=0.0;N=0.0;y=0;O=0;P=0;a:while(1){Q=0.0;R=d;S=0.0;T=0.0;U=s;V=z;W=B;X=u;Y=N;Z=O;_=0;$=0;aa=P;while(1){ba=fq(R+72|0,Z)|0;if((Z|0)>0){ca=fq((c[r>>2]|0)+72|0,Z+ -1|0)|0}else{ca=ba}if((ba|0)==0){da=S;ea=T;fa=U;ga=V;ha=W;ia=X;ja=Y;ka=_;la=$;ma=aa}else{na=c[o>>2]|0;if(x){oa=+Uq(c[na+108>>2]|0,c[na+120>>2]|0,ba,e);pa=c[o>>2]|0;qa=+Vq(c[pa+108>>2]|0,c[pa+120>>2]|0,ba,e);pa=c[o>>2]|0;ra=ba+4|0;sa=ra;ta=S>oa?S:oa;ua=T<qa?T:qa;va=+Wq(c[pa+120>>2]|0,c[ba+24>>2]|0,b[ra>>1]|0,b[pa+92>>1]|0,+g[pa+84>>2],c[pa+88>>2]|0,e,+g[ba+20>>2],0)}else{qa=+Nq(na,ba,1);oa=+Oq(c[o>>2]|0,ba,1);sa=ba+4|0;ta=S>qa?S:qa;ua=T<oa?T:oa;va=+Aq(c[o>>2]|0,ba)}ba=b[sa>>1]|0;b:do{if((U|0)!=0){if(ba<<16>>16==32|ba<<16>>16==12288){wa=U;xa=V;ya=W;za=X;Aa=$;Ba=aa}else{na=(Xq(ba&65535)|0)==0;wa=na?0:U;xa=V;ya=W;za=X;Aa=$;Ba=aa}}else{na=ba&65535;do{if((Xq(na)|0)==0){if((ca|0)==0){wa=0;xa=V;ya=W;za=X;Aa=$;Ba=aa;break b}pa=b[ca+4>>1]|0;if(!((ht(pa)|0)==0?!(((pa&65535)+ -48|0)>>>0<10):0)){if((ht(ba)|0)!=0){wa=0;xa=V;ya=W;za=X;Aa=$;Ba=aa;break b}if((na+ -48|0)>>>0<10){wa=0;xa=V;ya=W;za=X;Aa=$;Ba=aa;break b}}if(ba<<16>>16==32|ba<<16>>16==12288){wa=0;xa=V;ya=W;za=X;Aa=$;Ba=aa;break b}if((it(na)|0)!=0){wa=0;xa=V;ya=W;za=X;Aa=$;Ba=aa;break b}ra=pa&65535;if((jt(ra)|0)!=0){wa=0;xa=V;ya=W;za=X;Aa=$;Ba=aa;break b}if((jt(na)|0)!=0){wa=0;xa=V;ya=W;za=X;Aa=$;Ba=aa;break b}if(!(pa<<16>>16==32|pa<<16>>16==12288)?(it(ra)|0)==0:0){if((kt(pa)|0)!=0){wa=0;xa=V;ya=W;za=X;Aa=$;Ba=aa;break b}if((kt(ba)|0)!=0){Ca=0;break}if((lt(na)|0)!=0){Ca=0;break}if((lt(ra)|0)==0){wa=0;xa=V;ya=W;za=X;Aa=$;Ba=aa;break b}else{Ca=0}}else{Ca=0}}else{Ca=1}}while(0);wa=Ca;xa=ta;ya=ua;za=Q;Aa=((_|0)>0&1)+$|0;Ba=Z}}while(0);da=ta;ea=ua;fa=wa;ga=xa;ha=ya;ia=za;ja=va;ka=_+1|0;la=Aa;ma=Ba}Da=c[o>>2]|0;oa=Q+ja;if((c[Da+68>>2]|0)!=0&v&oa>q){break}ba=Z+1|0;if((ba|0)>=(w|0)){Ea=oa;Fa=ea;Ga=da;Ha=A;Ia=Da;Ja=M;Ka=y;La=O;break a}Q=oa;R=c[r>>2]|0;S=da;T=ea;U=fa;V=ga;W=ha;X=ia;Y=ja;Z=ba;_=ka;$=la;aa=ma}aa=(la|0)>0;Y=aa?ga:da;X=aa?ha:ea;$=(ka|0)==1;W=$?ja:aa?ia:Q;_=($&1)+(aa?ma:Z)|0;if(x){Ma=Da}else{c[m>>2]=O;c[n>>2]=_+ -1;c[h>>2]=y+_;g[l>>2]=W;g[t>>2]=Y;g[p>>2]=X;kq(j,c[r>>2]|0,h);Ma=c[o>>2]|0}d=c[r>>2]|0;V=M+(Y+ +xq(Ma,d+16|0))-X;X=W>A?W:A;aa=0-_|0;if((_|0)>=(w|0)){Ea=0.0;Fa=0.0;Ga=0.0;Ha=X;Ia=Ma;Ja=V;Ka=aa;La=_;break}else{A=X;s=fa;z=ga;B=ha;u=ia;M=V;N=ja;y=aa;O=_;P=ma}}ma=w+ -1|0;if((La|0)>(ma|0)){C=Ha;D=Ja;E=a+4|0;F=+C;G=E;H=G;c[H>>2]=0;I=G+4|0;J=I;g[J>>2]=F;K=a+12|0;g[K>>2]=D;L=a+16|0;g[L>>2]=0.0;i=f;return}if(x){Na=Ia}else{c[m>>2]=La;c[n>>2]=ma;c[h>>2]=w+Ka;g[l>>2]=Ea;g[t>>2]=Ga;g[p>>2]=Fa;kq(k,c[r>>2]|0,h);Na=c[o>>2]|0}ja=Ja+(Ga+ +xq(Na,(c[r>>2]|0)+16|0))-Fa;C=Ea>Ha?Ea:Ha;D=ja;E=a+4|0;F=+C;G=E;H=G;c[H>>2]=0;I=G+4|0;J=I;g[J>>2]=F;K=a+12|0;g[K>>2]=D;L=a+16|0;g[L>>2]=0.0;i=f;return}function Qq(a,b){a=+a;b=+b;var c=0,d=0.0;c=i;if(b>a){d=b-a;i=c;return+d}else{d=a-b;i=c;return+d}return 0.0}function Rq(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a+8>>2]|0;e=a+20|0;if((d|0)<=(c[e>>2]|0)){i=b;return}f=a+4|0;a=d;do{a=a+ -1|0;d=qt(f,a)|0;if((d|0)!=0){Rc[c[(c[d>>2]|0)+4>>2]&1023](d)}mt(f,a)}while((a|0)>(c[e>>2]|0));i=b;return}function Sq(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0.0,l=0.0,m=0.0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0,B=0,C=0,D=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0;b=i;d=a+20|0;e=c[d>>2]|0;f=a+24|0;h=c[f>>2]|0;j=h+16|0;k=+Tq(c[e+108>>2]|0,j);l=+g[e+12>>2]- +g[e+8>>2]-k;m=l>0.0?l:0.0;n=Mq(e,j)|0;if((n|0)==1){l=+g[a+8>>2];o=+g[a+4>>2];p=o;q=l;r=(m-(l-o))*.5}else if((n|0)==2){o=+g[a+8>>2];l=+g[a+4>>2];p=l;q=o;r=m-(o-l)}else{p=+g[a+4>>2];q=+g[a+8>>2];r=0.0}n=a+4|0;l=r+(q-p);j=a+12|0;e=a+16|0;p=+Qq(+g[j>>2],+g[e>>2]);a=c[h+56>>2]|0;if((a|0)<=0){s=+r;t=+l;u=n;v=u;g[v>>2]=s;w=u+4|0;x=w;g[x>>2]=t;g[j>>2]=p;g[e>>2]=0.0;i=b;return}c[h+36>>2]=a;q=0.0;h=0;while(1){y=qt((c[f>>2]|0)+52|0,h)|0;if((y|0)==0){z=q}else{A=c[d>>2]|0;B=(c[f>>2]|0)+16|0;C=Mq(A,B)|0;if((C|0)==2){D=m- +g[y+36>>2]}else if((C|0)==1){D=(m- +g[y+36>>2])*.5}else{D=0.0}o=k+D;E=q+ +xq(A,B);F=E+ +g[y+40>>2];g[y+28>>2]=o-r;g[y+32>>2]=F;B=c[y+20>>2]|0;A=y+24|0;if((B|0)<=(c[A>>2]|0)){E=o;C=B;while(1){B=fq((c[f>>2]|0)+72|0,C)|0;if((B|0)==0){G=E}else{g[B+12>>2]=E-r;H=c[B+28>>2]|0;do{if((H|0)!=0){I=c[H+12>>2]|0;if((I|0)==1){g[B+16>>2]=F- +Nq(c[d>>2]|0,B,0);break}else if((I|0)==2){g[B+16>>2]=F- +Oq(c[d>>2]|0,B,0);break}else{g[B+16>>2]=F;break}}else{g[B+16>>2]=F}}while(0);G=E+ +Aq(c[d>>2]|0,B)}if((C|0)<(c[A>>2]|0)){E=G;C=C+1|0}else{break}}}z=F- +g[y+44>>2]}h=h+1|0;if((h|0)==(a|0)){break}else{q=z}}s=+r;t=+l;u=n;v=u;g[v>>2]=s;w=u+4|0;x=w;g[x>>2]=t;g[j>>2]=p;g[e>>2]=0.0;i=b;return}function Tq(a,b){a=a|0;b=b|0;var d=0,e=0.0;d=i;if((a|0)!=0?(a=c[b+24>>2]|0,(a|0)!=0):0){e=+g[a+4>>2]}else{e=0.0}i=d;return+e}function Uq(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;var e=0,f=0.0;e=i;f=+Jq(b,Vr(a,c)|0,d);i=e;return+f}function Vq(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;var e=0,f=0.0;e=i;f=+Lq(b,Vr(a,c)|0,d);i=e;return+f}function Wq(a,b,c,d,e,f,g,h,j){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=f|0;g=+g;h=+h;j=j|0;var k=0,l=0.0;k=i;l=+(f|0)*(+(Wr(a,b,c,d,j)|0)*g*.0010000000474974513+e)*.009999999776482582+h;i=k;return+l}function Xq(a){a=a|0;var b=0,d=0,e=0;b=i;if(a>>>0<128){if((c[3960+(a<<2)>>2]&4|0)==0){d=4}else{e=1}}else{if((a|0)==12298|(a|0)==12300|(a|0)==12302|(a|0)==12304|(a|0)==12308|(a|0)==12310|(a|0)==12312|(a|0)==12314|(a|0)==65288|(a|0)==65339|(a|0)==65371|(a|0)==65378){e=1}else{d=4}}if((d|0)==4){e=0}i=b;return e|0}function Yq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,h=0.0;d=i;if((c[a+108>>2]|0)!=0?(e=c[b+28>>2]|0,(e|0)!=0):0){f=+Jq(c[a+120>>2]|0,c[e>>2]|0,+g[e+4>>2]);i=d;return+f}e=a+120|0;b=Kq(c[e>>2]|0)|0;h=+Vc[c[(c[a>>2]|0)+124>>2]&15](a);f=+Jq(c[e>>2]|0,b,h);i=d;return+f}function Zq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,h=0.0;d=i;if((c[a+108>>2]|0)!=0?(e=c[b+28>>2]|0,(e|0)!=0):0){f=+Lq(c[a+120>>2]|0,c[e>>2]|0,+g[e+4>>2]);i=d;return+f}e=a+120|0;b=Kq(c[e>>2]|0)|0;h=+Vc[c[(c[a>>2]|0)+124>>2]&15](a);f=+Lq(c[e>>2]|0,b,h);i=d;return+f}function _q(a){a=a|0;var d=0,e=0,f=0;d=i;e=a+4|0;f=a+8|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;c[f+24>>2]=0;c[f+28>>2]=0;c[a>>2]=3584;c[e>>2]=3816;Ija(a+40|0,4);e=a+56|0;f=a+88|0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+20>>2]=0;c[e+24>>2]=0;c[e+28>>2]=0;c[f>>2]=100;b[a+92>>1]=0;f=a+96|0;c[a+120>>2]=0;c[a+124>>2]=0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;i=d;return}function $q(a){a=a|0;var b=0;b=i;br(a);v2a(a);i=b;return}function ar(a){a=a|0;var b=0;b=i;$q(a+ -4|0);i=b;return}function br(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;c[a>>2]=3584;c[a+4>>2]=3816;d=a+124|0;e=c[d>>2]|0;if((e|0)==0){f=3584|0}else{Rc[c[(c[e>>2]|0)+60>>2]&1023](e);c[d>>2]=0;f=c[a>>2]|0}Rc[c[f+80>>2]&1023](a);Jja(c[a+40>>2]|0);i=b;return}function cr(a){a=a|0;var b=0;b=i;br(a+ -4|0);i=b;return}function dr(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0.0;b=i;i=i+112|0;d=b+72|0;e=b+60|0;f=b+48|0;h=b+16|0;j=b;k=a+104|0;if((c[k>>2]|0)!=0){i=b;return}c[d>>2]=4480;l=d+4|0;c[l+0>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;c[l+12>>2]=0;c[l+16>>2]=0;c[l+20>>2]=0;c[l+24>>2]=0;if((c[a+108>>2]|0)!=0){l=u2a(12)|0;g[l>>2]=0.0;g[l+4>>2]=0.0;c[l+8>>2]=0;c[d+24>>2]=l;l=u2a(28)|0;c[l>>2]=Kq(c[a+120>>2]|0)|0;g[l+4>>2]=18.0;m=l+8|0;n=l+24|0;c[m+0>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[n>>2]=100;c[d+28>>2]=l}c[e+4>>2]=-1;c[e+8>>2]=-1;c[e>>2]=0;er(f,a,e,d);c[h>>2]=0;c[h+4>>2]=-1;c[h+8>>2]=-1;f=h+12|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;f=a+120|0;l=Kq(c[f>>2]|0)|0;o=+Vc[c[(c[a>>2]|0)+124>>2]&15](a);g[h+24>>2]=+Jq(c[f>>2]|0,l,o);l=Kq(c[f>>2]|0)|0;o=+Vc[c[(c[a>>2]|0)+124>>2]&15](a);g[h+28>>2]=+Lq(c[f>>2]|0,l,o);fr(j,a,e,h);h=gr(a+40|0,0)|0;if((h|0)!=0){gq(h)}c[k>>2]=1;st(d);i=b;return}function er(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;if((Lc[c[(c[b>>2]|0)+64>>2]&255](b)|0)!=0?(c[b+64>>2]|0)==0:0){c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];i=f;return}g=b+40|0;h=b+44|0;j=c[h>>2]|0;k=c[d>>2]|0;l=(k|0)<(j|0)?k:j;j=(l|0)>0?l:0;l=u2a(92)|0;Zp(l,b);if((l|0)==0){c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];i=f;return}Ar(l+16|0,e);c[l+4>>2]=j;if((j|0)==(c[h>>2]|0)){Or(g,l)}else{Pr(g,j,l)}c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];i=f;return}function fr(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;if((c[b+44>>2]|0)<1){c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];i=f;return}g=gr(b+40|0,c[d>>2]|0)|0;if((g|0)==0){c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];i=f;return}else{kq(a,g,e);i=f;return}}function gr(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)>-1?(c[a+4>>2]|0)>(b|0):0){e=ct(a,b)|0}else{e=0}i=d;return e|0}function hr(a){a=a|0;var b=0;b=i;c[a+104>>2]=0;ir(a);i=b;return}function ir(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+40|0;e=c[a+44>>2]|0;if((e|0)>0){f=0}else{Kja(d,0)|0;i=b;return}do{a=gr(d,f)|0;if((a|0)!=0){Rc[c[(c[a>>2]|0)+4>>2]&1023](a)}f=f+1|0}while((f|0)!=(e|0));Kja(d,0)|0;i=b;return}function jr(a,d,e,f,h,j){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;k=i;i=i+80|0;l=k+64|0;m=k+32|0;n=k;o=Lc[c[(c[d>>2]|0)+120>>2]&255](d)|0;p=c[d+56>>2]|0;if(!((p|0)<1|(o|0)<(p|0))){c[a+0>>2]=c[e+0>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];i=k;return}p=c[d+60>>2]|0;if(!((p|0)<1|(o|0)<(p|0))){c[a+0>>2]=c[e+0>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];i=k;return}c[l+0>>2]=c[e+0>>2];c[l+4>>2]=c[e+4>>2];c[l+8>>2]=c[e+8>>2];p=l+8|0;c[p>>2]=(c[p>>2]|0)+1;if((c[d+108>>2]|0)==0){p=(b[d+92>>1]|0)==0;o=d+120|0;q=Kq(c[o>>2]|0)|0;if(p){r=kr(c[o>>2]|0,f,h,q)|0}else{r=q}c[n>>2]=3952;b[n+4>>1]=f;c[n+8>>2]=h;g[n+12>>2]=0.0;g[n+16>>2]=0.0;g[n+20>>2]=0.0;c[n+24>>2]=r;c[n+28>>2]=0;lr(a,d,l,n);et(n);i=k;return}n=u2a(28)|0;if((j|0)==0){c[n>>2]=-1;r=n+4|0;c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[r+16>>2]=0;c[r+20>>2]=0}else{gt(n,j)}if((n|0)==0){c[a+0>>2]=c[e+0>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];i=k;return}else{c[n>>2]=kr(c[d+120>>2]|0,f,h,c[j>>2]|0)|0;c[m>>2]=3952;b[m+4>>1]=f;c[m+8>>2]=h;g[m+12>>2]=0.0;g[m+16>>2]=0.0;g[m+20>>2]=0.0;c[m+24>>2]=-1;c[m+28>>2]=n;lr(a,d,l,m);et(m);i=k;return}}function kr(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;if((a|0)==0){g=-1;i=f;return g|0}g=id[c[(c[a>>2]|0)+12>>2]&511](a,b,d,e)|0;i=f;return g|0}function lr(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+16|0;g=f;h=c[b+44>>2]|0;if((h|0)<1){c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];i=f;return}j=b+40|0;c[g+0>>2]=c[d+0>>2];c[g+4>>2]=c[d+4>>2];c[g+8>>2]=c[d+8>>2];b=h+ -1|0;h=c[g>>2]|0;k=(h|0)<(b|0)?h:b;b=(k|0)>0?k:0;c[g>>2]=b;k=gr(j,b)|0;if((k|0)==0){c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];i=f;return}else{hq(a,k,g,e);i=f;return}}function mr(a){a=a|0;var b=0;b=i;et(a);i=b;return}function nr(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;h=i;i=i+96|0;j=h+80|0;k=h+68|0;l=h+56|0;m=h+24|0;n=h+12|0;o=h;p=Lc[c[(c[b>>2]|0)+120>>2]&255](b)|0;q=c[b+56>>2]|0;if(!((q|0)<1|(p|0)<(q|0))){c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];i=h;return}q=c[b+60>>2]|0;if(!((q|0)<1|(p|0)<(q|0))){c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];i=h;return}if((c[b+64>>2]|0)==0){c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];i=h;return}c[j+0>>2]=c[d+0>>2];c[j+4>>2]=c[d+4>>2];c[j+8>>2]=c[d+8>>2];Ic[c[(c[b>>2]|0)+200>>2]&511](b,j);c[k+0>>2]=c[d+0>>2];c[k+4>>2]=c[d+4>>2];c[k+8>>2]=c[d+8>>2];d=b+40|0;q=gr(d,c[j>>2]|0)|0;if((q|0)!=0){c[l>>2]=(c[j>>2]|0)+1;c[l+4>>2]=0;p=l+8|0;c[p>>2]=-1;c[m>>2]=4480;r=m+4|0;c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[r+16>>2]=0;c[r+20>>2]=0;c[r+24>>2]=0;if((c[b+108>>2]|0)!=0){if((e|0)!=0){r=u2a(12)|0;g[r>>2]=+g[e>>2];g[r+4>>2]=+g[e+4>>2];c[r+8>>2]=c[e+8>>2];c[m+24>>2]=r}if((f|0)!=0){r=u2a(28)|0;gt(r,f);c[m+28>>2]=r}}er(n,b,l,m);c[k+0>>2]=c[l+0>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];n=gr(d,c[l>>2]|0)|0;if((n|0)!=0?(d=q+72|0,r=c[q+76>>2]|0,q=(c[j+8>>2]|0)+1|0,(q|0)<(r|0)):0){f=q;do{q=fq(d,f)|0;if((q|0)!=0){c[p>>2]=(c[p>>2]|0)+1;hq(o,n,l,q)}f=f+1|0}while((f|0)<(r|0))}or(b,j);st(m)}c[a+0>>2]=c[k+0>>2];c[a+4>>2]=c[k+4>>2];c[a+8>>2]=c[k+8>>2];i=h;return}function or(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d;pd[c[(c[a>>2]|0)+204>>2]&127](e,a,b,1);f=gr(a+40|0,c[b>>2]|0)|0;if((f|0)==0){i=d;return}b=f+72|0;a=(c[f+76>>2]|0)+ -1|0;f=e+8|0;if((a|0)>(c[f>>2]|0)){g=a}else{i=d;return}do{a=fq(b,g)|0;if((a|0)!=0){Rc[c[(c[a>>2]|0)+4>>2]&1023](a)}Cq(b,g);g=g+ -1|0}while((g|0)>(c[f>>2]|0));i=d;return}function pr(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;j=i;i=i+64|0;k=j+48|0;l=j+36|0;m=j+24|0;n=j+12|0;o=j;Mna(k,e,-1);c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];d=c[k>>2]|0;if((d|0)==0){Lna(k);i=j;return}e=c[d+4>>2]|0;if((e|0)<=0){Lna(k);i=j;return}p=b+64|0;q=0;do{c[l+0>>2]=c[a+0>>2];c[l+4>>2]=c[a+4>>2];c[l+8>>2]=c[a+8>>2];r=c[d+(q<<2)+12>>2]|0;s=r&65535;t=r&65535;if((t|0)==9){u=32;v=10}else if((t|0)==13){if((c[p>>2]|0)==0){w=q}else{r=q+1|0;x=c[d+(r<<2)+12>>2]|0;Fc[c[(c[b>>2]|0)+92>>2]&63](m,b,a,g,h);y=(x|0)==10?r:q;c[a+0>>2]=c[m+0>>2];c[a+4>>2]=c[m+4>>2];c[a+8>>2]=c[m+8>>2];w=y}}else if((t|0)==10){if((c[p>>2]|0)==0){w=q}else{t=q+1|0;y=c[d+(t<<2)+12>>2]|0;Fc[c[(c[b>>2]|0)+92>>2]&63](n,b,a,g,h);r=(y|0)==13?t:q;c[a+0>>2]=c[n+0>>2];c[a+4>>2]=c[n+4>>2];c[a+8>>2]=c[n+8>>2];w=r}}else{u=s;v=10}if((v|0)==10){v=0;Tc[c[(c[b>>2]|0)+88>>2]&31](o,b,a,u,f,h);c[a+0>>2]=c[o+0>>2];c[a+4>>2]=c[o+4>>2];c[a+8>>2]=c[o+8>>2];w=q}q=w+1|0}while((qr(a,l)|0)==0&(q|0)<(e|0));Lna(k);i=j;return}function qr(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((c[b>>2]|0)==(c[a>>2]|0)?(c[b+4>>2]|0)==(c[a+4>>2]|0):0){e=(c[b+8>>2]|0)==(c[a+8>>2]|0)}else{e=0}i=d;return e&1|0}function rr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+16|0;f=e;g=d+12|0;h=gr(b+40|0,c[g>>2]|0)|0;if((h|0)==0){j=0}else{sq(f,h);j=qr(g,f)|0}sr(b,d);if((c[d>>2]|0)!=(c[g>>2]|0)?(tr(b,d),(j|0)==0):0){ur(b,d)}c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];i=e;return}function sr(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+48|0;e=d+16|0;f=d;c[e+0>>2]=-1;c[e+4>>2]=-1;c[e+8>>2]=-1;c[e+12>>2]=-1;c[e+16>>2]=-1;c[e+20>>2]=-1;pd[c[(c[a>>2]|0)+204>>2]&127](e,a,b,1);g=e+12|0;pd[c[(c[a>>2]|0)+204>>2]&127](f,a,b+12|0,1);c[g+0>>2]=c[f+0>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];f=c[g>>2]|0;g=c[e>>2]|0;if((f|0)<(g|0)){i=d;return}b=a+40|0;a=g;g=f;while(1){f=gr(b,g)|0;if((f|0)==0){h=a}else{Fq(f,e);h=c[e>>2]|0}if((g|0)>(h|0)){a=h;g=g+ -1|0}else{break}}i=d;return}function tr(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d;c[e>>2]=-1;c[e+4>>2]=-1;c[e+8>>2]=-1;f=c[b+12>>2]|0;if((f|0)>(c[b>>2]|0)){g=f}else{i=d;return}do{c[e>>2]=g;as(a,e);g=g+ -1|0}while((g|0)>(c[b>>2]|0));i=d;return}function ur(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;i=i+32|0;e=d+12|0;f=d;pd[c[(c[a>>2]|0)+204>>2]&127](e,a,b,1);g=a+40|0;a=gr(g,(c[b>>2]|0)+1|0)|0;if((a|0)==0){i=d;return}h=gr(g,c[e>>2]|0)|0;if((h|0)!=0?(j=a+72|0,k=c[a+76>>2]|0,(k|0)>0):0){l=e+8|0;m=0;do{n=fq(j,m)|0;if((n|0)!=0){c[l>>2]=(c[l>>2]|0)+1;hq(f,h,e,n)}m=m+1|0}while((m|0)!=(k|0))}Rc[c[(c[a>>2]|0)+4>>2]&1023](a);bs(g,(c[b>>2]|0)+1|0);i=d;return}function vr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;pd[c[(c[b>>2]|0)+204>>2]&127](f,b,d,1);wr(a,b,f);i=e;return}function wr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+32|0;f=e+12|0;g=e;h=gr(b+40|0,c[d>>2]|0)|0;do{if((h|0)!=0?(j=c[b>>2]|0,k=c[j+204>>2]|0,ld[c[j+168>>2]&255](g,b,d),pd[k&127](f,b,g,0),(cs(f,d)|0)!=0):0){if((c[f>>2]|0)==(c[d>>2]|0)){Gq(h,f);break}else{ur(b,d);break}}}while(0);c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];i=e;return}function xr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;pd[c[(c[b>>2]|0)+204>>2]&127](f,b,d,1);yr(a,b,f);i=e;return}function yr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;g=gr(b+40|0,c[d>>2]|0)|0;if((g|0)==0){c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];i=e;return}ld[c[(c[b>>2]|0)+164>>2]&255](f,b,d);do{if((cs(f,d)|0)!=0){if((c[f>>2]|0)==(c[d>>2]|0)){Gq(g,d);break}if((c[g+76>>2]|0)==0){as(b,d);break}else{ur(b,f);break}}}while(0);c[a+0>>2]=c[f+0>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];i=e;return}function zr(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;h=i;i=i+160|0;j=h+128|0;k=h+112|0;l=h+100|0;m=h+88|0;n=h+84|0;o=h+72|0;p=h+40|0;q=h+24|0;r=h+12|0;s=h;t=c[a>>2]|0;u=c[t+100>>2]|0;Ic[c[t+156>>2]&511](k,a);Ic[c[(c[a>>2]|0)+160>>2]&511](l,a);t=j+12|0;c[j+0>>2]=c[k+0>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[t+0>>2]=c[l+0>>2];c[t+4>>2]=c[l+4>>2];c[t+8>>2]=c[l+8>>2];nt(j);ld[u&255](m,a,j);Mna(n,b,-1);c[o>>2]=0;b=o+4|0;c[b>>2]=0;j=o+8|0;c[j>>2]=-1;c[p>>2]=4480;m=p+4|0;c[m+0>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;c[m+20>>2]=0;c[m+24>>2]=0;if((c[a+108>>2]|0)!=0){if((e|0)!=0){m=u2a(12)|0;g[m>>2]=+g[e>>2];g[m+4>>2]=+g[e+4>>2];c[m+8>>2]=c[e+8>>2];c[p+24>>2]=m}if((f|0)!=0){m=u2a(28)|0;gt(m,f);c[p+28>>2]=m}}m=gr(a+40|0,0)|0;if((m|0)!=0){Ar(m+16|0,p)}m=c[n>>2]|0;if((m|0)==0){st(p);Lna(n);i=h;return}e=c[m+4>>2]|0;if((e|0)<=0){st(p);Lna(n);i=h;return}u=a+56|0;l=a+60|0;t=a+64|0;k=0;v=0;while(1){w=c[u>>2]|0;if(!((w|0)<1|(v|0)<(w|0))){x=22;break}w=c[l>>2]|0;if(!((w|0)<1|(v|0)<(w|0))){x=22;break}w=c[m+(k<<2)+12>>2]|0;y=w&65535;z=w&65535;if((z|0)==10){if((c[t>>2]|0)==0){A=k}else{w=k+1|0;B=(c[m+(w<<2)+12>>2]|0)==13?w:k;c[o>>2]=(c[o>>2]|0)+1;c[b>>2]=0;c[j>>2]=-1;er(r,a,o,p);A=B}}else if((z|0)==13){if((c[t>>2]|0)==0){A=k}else{B=k+1|0;w=(c[m+(B<<2)+12>>2]|0)==10?B:k;c[o>>2]=(c[o>>2]|0)+1;c[b>>2]=0;c[j>>2]=-1;er(q,a,o,p);A=w}}else if((z|0)==9){C=32;x=19}else{C=y;x=19}if((x|0)==19){x=0;Tc[c[(c[a>>2]|0)+88>>2]&31](s,a,o,C,d,f);c[o+0>>2]=c[s+0>>2];c[o+4>>2]=c[s+4>>2];c[o+8>>2]=c[s+8>>2];A=k}y=A+1|0;if((y|0)>=(e|0)){x=22;break}k=y;v=v+1|0}if((x|0)==22){st(p);Lna(n);i=h;return}}function Ar(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0;d=i;if((a|0)==(b|0)){i=d;return}e=a+4|0;f=b+4|0;c[e+0>>2]=c[f+0>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];c[a+20>>2]=c[b+20>>2];f=c[b+24>>2]|0;do{if((f|0)!=0){e=a+24|0;h=c[e>>2]|0;if((h|0)==0){j=u2a(12)|0;g[j>>2]=+g[f>>2];g[j+4>>2]=+g[f+4>>2];c[j+8>>2]=c[f+8>>2];c[e>>2]=j;break}else{c[h+0>>2]=c[f+0>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];break}}}while(0);f=c[b+28>>2]|0;if((f|0)==0){i=d;return}b=a+28|0;a=c[b>>2]|0;if((a|0)==0){h=u2a(28)|0;gt(h,f);c[b>>2]=h;i=d;return}else{c[a+0>>2]=c[f+0>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];c[a+16>>2]=c[f+16>>2];c[a+20>>2]=c[f+20>>2];c[a+24>>2]=c[f+24>>2];i=d;return}}function Br(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+48|0;e=d+24|0;f=d+12|0;g=d;h=c[b>>2]|0;if((h|0)<0){Ic[c[(c[a>>2]|0)+156>>2]&511](e,a);c[b+0>>2]=c[e+0>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];j=c[b>>2]|0}else{j=h}h=a+40|0;if((j|0)<(c[a+44>>2]|0)){k=b}else{Ic[c[(c[a>>2]|0)+160>>2]&511](f,a);c[b+0>>2]=c[f+0>>2];c[b+4>>2]=c[f+4>>2];c[b+8>>2]=c[f+8>>2];k=b}pd[c[(c[a>>2]|0)+204>>2]&127](g,a,b,1);c[k+0>>2]=c[g+0>>2];c[k+4>>2]=c[g+4>>2];c[k+8>>2]=c[g+8>>2];g=gr(h,c[b>>2]|0)|0;if((g|0)==0){i=d;return}vq(g,b);i=d;return}function Cr(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=i;i=i+16|0;e=d;c[e+0>>2]=c[b+0>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];Ic[c[(c[a>>2]|0)+200>>2]&511](a,e);b=a+40|0;f=a+44|0;a=c[f>>2]|0;do{if((a|0)>0){g=0;h=0;while(1){if((g|0)>=(c[e>>2]|0)){j=g;k=h;break}l=gr(b,g)|0;if((l|0)==0){m=h}else{m=(c[l+76>>2]|0)+h+((g|0)!=((c[f>>2]|0)+ -1|0)&1)|0}l=g+1|0;if((l|0)<(a|0)){g=l;h=m}else{j=l;k=m;break}}if((j|0)>-1){n=c[f>>2]|0;o=j;p=k;break}else{q=k;i=d;return q|0}}else{n=a;o=0;p=0}}while(0);if((o|0)>=(n|0)){q=p;i=d;return q|0}q=p+1+(c[e+8>>2]|0)|0;i=d;return q|0}function Dr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=i;i=i+32|0;f=e+12|0;g=e;Ic[c[(c[b>>2]|0)+156>>2]&511](a,b);h=b+40|0;j=b+44|0;k=c[j>>2]|0;a:do{if((k|0)>0){l=0;m=0;n=0;while(1){o=gr(h,l)|0;if((o|0)==0){p=m;q=n}else{r=(c[o+76>>2]|0)+m|0;if((r|0)==(d|0)){s=4;break}if((r|0)>(d|0)){s=6;break}t=((l|0)!=((c[j>>2]|0)+ -1|0)&1)+r|0;p=t;q=t}t=l+1|0;if((t|0)<(k|0)){l=t;m=p;n=q}else{break a}}if((s|0)==4){sq(f,o);c[a+0>>2]=c[f+0>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];i=e;return}else if((s|0)==6){c[a>>2]=l;c[a+8>>2]=d+ -1-n;vq(o,a);i=e;return}}}while(0);Ic[c[(c[b>>2]|0)+160>>2]&511](g,b);c[a+0>>2]=c[g+0>>2];c[a+4>>2]=c[g+4>>2];c[a+8>>2]=c[g+8>>2];i=e;return}function Er(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+16|0;f=e;g=c[d>>2]|0;if((g|0)<0){Ic[c[(c[b>>2]|0)+156>>2]&511](a,b);i=e;return}h=b+40|0;if((g|0)>=(c[b+44>>2]|0)){Ic[c[(c[b>>2]|0)+160>>2]&511](a,b);i=e;return}j=gr(h,g)|0;if((j|0)==0){c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];i=e;return}rq(f,j);if((Nm(d,f)|0)>=1){tq(a,j,d);i=e;return}j=gr(h,(c[d>>2]|0)+ -1|0)|0;if((j|0)==0){Ic[c[(c[b>>2]|0)+156>>2]&511](a,b);i=e;return}else{sq(a,j);i=e;return}}function Fr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+16|0;f=e;g=c[d>>2]|0;if((g|0)<0){Ic[c[(c[b>>2]|0)+156>>2]&511](a,b);i=e;return}h=b+40|0;if((g|0)>=(c[b+44>>2]|0)){Ic[c[(c[b>>2]|0)+160>>2]&511](a,b);i=e;return}j=gr(h,g)|0;if((j|0)==0){c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];i=e;return}sq(f,j);if(!((Nm(d,f)|0)>-1)){uq(a,j,d);i=e;return}j=gr(h,(c[d>>2]|0)+1|0)|0;if((j|0)==0){Ic[c[(c[b>>2]|0)+160>>2]&511](a,b);i=e;return}else{rq(a,j);i=e;return}}function Gr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0,G=0.0,H=0,I=0,J=0;e=i;i=i+48|0;f=e+32|0;h=e+24|0;j=e+12|0;k=e;l=+g[d>>2]- +g[b+8>>2];m=+g[b+20>>2]- +g[d+4>>2];Ic[c[(c[b>>2]|0)+156>>2]&511](a,b);d=b+40|0;n=c[b+44>>2]|0;do{if((n|0)<1){o=1;p=17}else{q=1;r=1;s=0;t=n;u=n+ -1|0;a:while(1){v=q;w=r;x=s;y=t;while(1){z=(y|0)/2|0;A=gr(d,z)|0;if((A|0)==0){B=v;C=w;p=16;break a}D=+g[A+32>>2];if(m>D){E=m-D;F=E<1.0e-4&E>-1.0e-4?w:0}else{F=w}E=+g[A+28>>2];if(E>m){G=E-m;H=G<1.0e-4&G>-1.0e-4?v:0}else{H=v}if(m<D?(G=m-D,!(G<1.0e-4&G>-1.0e-4)):0){break}if(!(m>E)){break a}G=m-E;if(G<1.0e-4&G>-1.0e-4){break a}I=z+1|0;if((z|0)<(u|0)){v=H;w=F;x=I;y=I+u|0}else{B=H;C=F;p=16;break a}}y=z+ -1|0;if((x|0)>(y|0)){B=H;C=F;p=16;break}else{q=H;r=F;s=x;t=y+x|0;u=y}}if((p|0)==16){if((C|0)==0){J=B;break}else{o=B;p=17;break}}g[h>>2]=l- +g[A+20>>2];g[h+4>>2]=m-D;wq(f,A,h);c[a+0>>2]=c[f+0>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a>>2]=z;i=e;return}}while(0);if((p|0)==17){Ic[c[(c[b>>2]|0)+156>>2]&511](j,b);c[a+0>>2]=c[j+0>>2];c[a+4>>2]=c[j+4>>2];c[a+8>>2]=c[j+8>>2];J=o}if((J|0)==0){i=e;return}Ic[c[(c[b>>2]|0)+160>>2]&511](k,b);c[a+0>>2]=c[k+0>>2];c[a+4>>2]=c[k+4>>2];c[a+8>>2]=c[k+8>>2];i=e;return}function Hr(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0.0,n=0;f=i;h=b+40|0;j=gr(h,c[d>>2]|0)|0;if((j|0)!=0){k=c[d>>2]|0;l=c[d+4>>2]|0;m=+g[e>>2]- +g[b+8>>2];if((l|0)>0){zq(a,j,m- +g[j+20>>2],l+ -1|0);i=f;return}if((k|0)>0?(l=gr(h,k+ -1|0)|0,(l|0)!=0):0){zq(a,l,m- +g[l+20>>2],(c[l+56>>2]|0)+ -1|0);i=f;return}else{n=d}}else{n=d}c[a+0>>2]=c[n+0>>2];c[a+4>>2]=c[n+4>>2];c[a+8>>2]=c[n+8>>2];i=f;return}function Ir(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0.0,n=0;f=i;h=b+40|0;j=gr(h,c[d>>2]|0)|0;if((j|0)!=0){k=c[d>>2]|0;l=c[d+4>>2]|0;m=+g[e>>2]- +g[b+8>>2];if((l|0)<((c[j+56>>2]|0)+ -1|0)){zq(a,j,m- +g[j+20>>2],l+1|0);i=f;return}if((k|0)<((c[b+44>>2]|0)+ -1|0)?(b=gr(h,k+1|0)|0,(b|0)!=0):0){zq(a,b,m- +g[j+20>>2],0);i=f;return}else{n=d}}else{n=d}c[a+0>>2]=c[n+0>>2];c[a+4>>2]=c[n+4>>2];c[a+8>>2]=c[n+8>>2];i=f;return}function Jr(a,b,d){a=a|0;b=b|0;d=d|0;b=c[d+4>>2]|0;c[a>>2]=c[d>>2];c[a+4>>2]=b;c[a+8>>2]=-1;return}function Kr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=gr(b+40|0,c[d>>2]|0)|0;if((f|0)!=0?(b=qt(f+52|0,c[d+4>>2]|0)|0,(b|0)!=0):0){f=c[b+8>>2]|0;g=c[b+24>>2]|0;c[a>>2]=c[b+4>>2];c[a+4>>2]=f;c[a+8>>2]=g;i=e;return}c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];i=e;return}function Lr(a,b,d){a=a|0;b=b|0;d=d|0;c[a>>2]=c[d>>2];c[a+4>>2]=0;c[a+8>>2]=-1;return}function Mr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=gr(b+40|0,c[d>>2]|0)|0;if((f|0)==0){c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];i=e;return}else{sq(a,f);i=e;return}}function Nr(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;d=a+40|0;e=c[a+44>>2]|0;if((e|0)>0){f=0;g=0}else{h=0;j=h+ -1|0;i=b;return j|0}while(1){a=gr(d,f)|0;if((a|0)==0){k=g}else{k=g+1+(c[a+76>>2]|0)|0}f=f+1|0;if((f|0)==(e|0)){h=k;break}else{g=k}}j=h+ -1|0;i=b;return j|0}function Or(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+4|0;f=c[e>>2]|0;g=f+1|0;do{if((f|0)>=(c[a+8>>2]|0)){if((Kja(a,g)|0)==0){i=d;return}else{h=c[e>>2]|0;break}}else{c[e>>2]=g;h=g}}while(0);c[(c[a>>2]|0)+(h+ -1<<2)>>2]=b;i=d;return}function Pr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;if((Nja(a,b)|0)==0){i=e;return}c[(c[a>>2]|0)+(b<<2)>>2]=d;i=e;return}function Qr(a,d){a=a|0;d=d|0;var e=0,f=0,g=0;e=i;if((a|0)==(d|0)){i=e;return}b[a+4>>1]=b[d+4>>1]|0;c[a+8>>2]=c[d+8>>2];c[a+24>>2]=c[d+24>>2];f=c[d+28>>2]|0;if((f|0)==0){i=e;return}d=a+28|0;a=c[d>>2]|0;if((a|0)==0){g=u2a(28)|0;gt(g,f);c[d>>2]=g;i=e;return}else{c[a+0>>2]=c[f+0>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];c[a+16>>2]=c[f+16>>2];c[a+20>>2]=c[f+20>>2];c[a+24>>2]=c[f+24>>2];i=e;return}}function Rr(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0.0,h=0.0;c=+g[b+8>>2];d=+g[b+20>>2];e=d- +g[b+36>>2];f=+g[b+28>>2]+c;h=d- +g[b+32>>2];g[a>>2]=+g[b+24>>2]+c;g[a+8>>2]=h;g[a+4>>2]=f;g[a+12>>2]=e;return}function Sr(a,b,c,d){a=a|0;b=+b;c=+c;d=d|0;var e=0.0,f=0.0,h=0.0;e=c- +g[d+12>>2];f=+g[d+4>>2]+b;h=c- +g[d+8>>2];g[a>>2]=+g[d>>2]+b;g[a+8>>2]=h;g[a+4>>2]=f;g[a+12>>2]=e;return}function Tr(a,b){a=a|0;b=b|0;var c=0;c=i;Rr(a,b+ -4|0);i=c;return}function Ur(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0.0,j=0.0;e=i;if((c[a+108>>2]|0)!=0?(f=c[b+28>>2]|0,(f|0)!=0):0){h=+g[f+4>>2];if(!((c[f+12>>2]|0)!=0&(d|0)==0)){j=h;i=e;return+j}j=h*.5;i=e;return+j}j=+Vc[c[(c[a>>2]|0)+124>>2]&15](a);i=e;return+j}function Vr(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((a|0)!=0?(a=c[b+28>>2]|0,(a|0)!=0):0){e=a}else{e=b+24|0}i=d;return c[e>>2]|0}function Wr(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;if((a|0)==0){h=0;i=g;return h|0}j=c[c[a>>2]>>2]|0;if(e<<16>>16==0){h=id[j&511](a,b,d,f)|0;i=g;return h|0}else{h=id[j&511](a,b,e,f)|0;i=g;return h|0}return 0}function Xr(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;if((c[a+108>>2]|0)!=0?(e=c[b+28>>2]|0,(e|0)!=0):0){f=e+20|0}else{f=a+84|0}i=d;return+(+g[f>>2])}function Yr(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;if((c[a+108>>2]|0)!=0?(e=c[b+28>>2]|0,(e|0)!=0):0){f=e+24|0}else{f=a+88|0}i=d;return c[f>>2]|0}function Zr(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((a|0)==0){e=0;i=d;return e|0}e=dd[c[(c[a>>2]|0)+4>>2]&511](a,b)|0;i=d;return e|0}function _r(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((a|0)==0){e=0;i=d;return e|0}e=dd[c[(c[a>>2]|0)+8>>2]&511](a,b)|0;i=d;return e|0}function $r(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;if((c[d+8>>2]|0)<0?(c[d+4>>2]|0)>0:0){g=c[b>>2]|0;if((e|0)==0){ld[c[g+168>>2]&255](a,b,d);i=f;return}else{ld[c[g+164>>2]&255](a,b,d);i=f;return}}c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];i=f;return}function as(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[b>>2]|0;if((e|0)==0?(c[a+44>>2]|0)==1:0){i=d;return}f=a+40|0;a=gr(f,e)|0;if((a|0)==0){i=d;return}if((c[a+76>>2]|0)!=0){i=d;return}Rc[c[(c[a>>2]|0)+4>>2]&1023](a);bs(f,c[b>>2]|0);i=d;return}function bs(a,b){a=a|0;b=b|0;var d=0;d=i;if((b|0)>-1?(c[a+4>>2]|0)>(b|0):0){Oja(a,b)}i=d;return}function cs(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((c[b>>2]|0)==(c[a>>2]|0)?(c[b+4>>2]|0)==(c[a+4>>2]|0):0){e=(c[b+8>>2]|0)!=(c[a+8>>2]|0)}else{e=1}i=d;return e&1|0}function ds(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+64|0;d=b+40|0;e=b+28|0;f=b+16|0;g=b;Ic[c[(c[a>>2]|0)+156>>2]&511](e,a);Ic[c[(c[a>>2]|0)+160>>2]&511](f,a);h=d+12|0;c[d+0>>2]=c[e+0>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[h+0>>2]=c[f+0>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];nt(d);es(g,a,d);i=b;return}function es(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0;e=i;i=i+80|0;f=e+64|0;h=e+40|0;j=e+28|0;k=e+16|0;l=e;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;g[a>>2]=0.0;if((Lc[c[(c[b>>2]|0)+64>>2]&255](b)|0)==0){m=b+4|0;n=c[m>>2]|0;o=n+16|0;p=c[o>>2]|0;Ic[p&511](m,a);i=e;return}if((c[b+72>>2]|0)==0){hs(l,b,c[d>>2]|0,c[d+12>>2]|0);c[a+0>>2]=c[l+0>>2];c[a+4>>2]=c[l+4>>2];c[a+8>>2]=c[l+8>>2];c[a+12>>2]=c[l+12>>2];m=b+4|0;n=c[m>>2]|0;o=n+16|0;p=c[o>>2]|0;Ic[p&511](m,a);i=e;return}else{l=c[(c[b>>2]|0)+48>>2]|0;q=+gs(b);Gc[l&15](b,q);Ic[c[(c[b>>2]|0)+156>>2]&511](j,b);Ic[c[(c[b>>2]|0)+160>>2]&511](k,b);l=h+12|0;c[h+0>>2]=c[j+0>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];c[l+0>>2]=c[k+0>>2];c[l+4>>2]=c[k+4>>2];c[l+8>>2]=c[k+8>>2];nt(h);hs(f,b,c[h>>2]|0,c[h+12>>2]|0);c[a+0>>2]=c[f+0>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];m=b+4|0;n=c[m>>2]|0;o=n+16|0;p=c[o>>2]|0;Ic[p&511](m,a);i=e;return}}function fs(a,b){a=a|0;b=b|0;var c=0;c=i;i=i+16|0;es(c,a,b);i=c;return}function gs(a){a=a|0;var b=0,e=0,f=0,h=0.0,j=0.0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0.0,r=0;b=i;e=(Lc[c[(c[a>>2]|0)+144>>2]&255](a)|0)==0;f=e?25:6;if(+g[a+12>>2]- +g[a+8>>2]<=0.0){h=0.0;i=b;return+h}e=f>>>1;j=+(d[3840+e>>0]|0);k=0;l=e;e=f+ -1|0;a:while(1){m=j;f=l;n=e;while(1){if((is(a,m)|0)==0){break}o=f+ -1|0;p=(o+k|0)/2|0;q=+(d[3840+p>>0]|0);if((k|0)>(o|0)){h=q;r=7;break a}else{m=q;f=p;n=o}}k=f+1|0;l=(k+n|0)/2|0;m=+(d[3840+l>>0]|0);if((f|0)>=(n|0)){h=m;r=7;break}else{j=m;e=n}}if((r|0)==7){i=b;return+h}return 0.0}function hs(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0.0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0;f=i;i=i+16|0;h=f;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;g[a>>2]=0.0;j=b+40|0;k=c[b+44>>2]|0;if((k|0)<=0){i=f;return}b=h+12|0;l=a+12|0;m=h+4|0;n=a+4|0;o=h+8|0;p=a+8|0;q=0.0;r=0;while(1){s=gr(j,r)|0;if((s|0)==0){t=q}else{c[s+4>>2]=r;c[s+8>>2]=-1;c[s+12>>2]=-1;u=s+20|0;c[h+0>>2]=c[u+0>>2];c[h+4>>2]=c[u+4>>2];c[h+8>>2]=c[u+8>>2];c[h+12>>2]=c[u+12>>2];if((r|0)>=(d|0)){if((r|0)>(e|0)){v=+g[s+28>>2]- +g[s+32>>2];g[b>>2]=q;w=v}else{mq(h,s);g[b>>2]=q+ +g[b>>2];w=+g[o>>2]}g[o>>2]=q+w;c[u+0>>2]=c[h+0>>2];c[u+4>>2]=c[h+4>>2];c[u+8>>2]=c[h+8>>2];c[u+12>>2]=c[h+12>>2];gq(s)}if((r|0)==0){c[a+0>>2]=c[h+0>>2];c[a+4>>2]=c[h+4>>2];c[a+8>>2]=c[h+8>>2];c[a+12>>2]=c[h+12>>2];x=+g[o>>2];y=+g[b>>2]}else{v=+g[h>>2];z=+g[a>>2];g[a>>2]=v<z?v:z;z=+g[b>>2];v=+g[l>>2];g[l>>2]=z<v?z:v;v=+g[m>>2];A=+g[n>>2];g[n>>2]=v>A?v:A;A=+g[o>>2];v=+g[p>>2];g[p>>2]=A>v?A:v;x=A;y=z}t=q+ +Qq(x,y)}r=r+1|0;if((r|0)==(k|0)){break}else{q=t}}i=f;return}function is(a,b){a=a|0;b=+b;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0.0,y=0.0;d=i;i=i+16|0;e=d;f=a+40|0;h=c[a+44>>2]|0;if((h|0)<=0){j=0;i=d;return j|0}k=e+4|0;l=a+12|0;m=a+8|0;n=a+20|0;o=a+16|0;p=0.0;q=0.0;a=0;while(1){r=gr(f,a)|0;if((r|0)!=0){pq(e,r,b);s=+g[e>>2];t=s>p?s:p;s=q+ +g[k>>2];u=+g[l>>2]- +g[m>>2];if(t>u?(v=t-u,!(v<1.0e-4&v>-1.0e-4)):0){j=1;w=9;break}v=+g[n>>2]- +g[o>>2];if(s>v?(u=s-v,!(u<1.0e-4&u>-1.0e-4)):0){j=1;w=9;break}else{x=s;y=t}}else{x=q;y=p}a=a+1|0;if((a|0)>=(h|0)){j=0;w=9;break}else{p=y;q=x}}if((w|0)==9){i=d;return j|0}return 0}function js(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+124|0;e=c[d>>2]|0;if((e|0)==0){f=u2a(20)|0;c[f>>2]=3880;c[f+4>>2]=-1;c[f+8>>2]=-1;c[f+12>>2]=-1;c[f+16>>2]=a;c[d>>2]=f;g=f;i=b;return g|0}else{g=e;i=b;return g|0}return 0}function ks(a,b){a=a|0;b=b|0;var d=0;d=a+120|0;a=c[d>>2]|0;c[d>>2]=b;return a|0}function ls(a){a=a|0;var b=0;b=i;v2a(a);i=b;return}function ms(a){a=a|0;return}function ns(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d;f=a+4|0;g=c[a+16>>2]|0;ld[c[(c[g>>2]|0)+212>>2]&255](e,g,b);c[f+0>>2]=c[e+0>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];i=d;return}function os(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+4|0;c[e+0>>2]=c[b+0>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];i=d;return}function ps(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+32|0;d=b+12|0;e=b;f=a+4|0;g=a+16|0;a=c[g>>2]|0;Ic[c[(c[a>>2]|0)+160>>2]&511](d,a);if((qr(f,d)|0)!=0){h=0;i=b;return h|0}d=c[g>>2]|0;ld[c[(c[d>>2]|0)+168>>2]&255](e,d,f);c[f+0>>2]=c[e+0>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];h=1;i=b;return h|0}function qs(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+32|0;d=b+12|0;e=b;f=a+4|0;g=a+16|0;a=c[g>>2]|0;Ic[c[(c[a>>2]|0)+156>>2]&511](d,a);if((qr(f,d)|0)!=0){h=0;i=b;return h|0}d=c[g>>2]|0;ld[c[(c[d>>2]|0)+164>>2]&255](e,d,f);c[f+0>>2]=c[e+0>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];h=1;i=b;return h|0}function rs(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;d=a+16|0;e=a+4|0;f=gr((c[d>>2]|0)+40|0,c[e>>2]|0)|0;if((f|0)==0){g=0;i=b;return g|0}h=a+8|0;j=c[h>>2]|0;k=c[e>>2]|0;if((j|0)<((c[f+56>>2]|0)+ -1|0)){c[e>>2]=k;c[h>>2]=j+1;c[a+12>>2]=-1;g=1;i=b;return g|0}if((k|0)>=((c[(c[d>>2]|0)+44>>2]|0)+ -1|0)){g=0;i=b;return g|0}c[e>>2]=k+1;c[h>>2]=0;c[a+12>>2]=-1;g=1;i=b;return g|0}function ss(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;d=a+16|0;e=a+4|0;if((gr((c[d>>2]|0)+40|0,c[e>>2]|0)|0)==0){f=0;i=b;return f|0}g=a+8|0;h=c[g>>2]|0;j=c[e>>2]|0;if((h|0)>0){c[e>>2]=j;c[g>>2]=h+ -1;c[a+12>>2]=-1;f=1;i=b;return f|0}if((j|0)<=0){f=0;i=b;return f|0}h=gr((c[d>>2]|0)+40|0,j+ -1|0)|0;if((h|0)==0){f=0;i=b;return f|0}j=(c[h+56>>2]|0)+ -1|0;c[e>>2]=(c[e>>2]|0)+ -1;c[g>>2]=j;c[a+12>>2]=-1;f=1;i=b;return f|0}function ts(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+4|0;e=c[d>>2]|0;if((e|0)>=((c[(c[a+16>>2]|0)+44>>2]|0)+ -1|0)){f=0;i=b;return f|0}c[d>>2]=e+1;c[a+8>>2]=0;c[a+12>>2]=-1;f=1;i=b;return f|0}function us(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+4|0;e=c[d>>2]|0;if((e|0)<=0){f=0;i=b;return f|0}c[d>>2]=e+ -1;c[a+8>>2]=0;c[a+12>>2]=-1;f=1;i=b;return f|0}function vs(a,d){a=a|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0.0,m=0.0;e=i;f=d+8|0;h=a+4|0;c[f+0>>2]=c[h+0>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];f=a+16|0;j=gr((c[f>>2]|0)+40|0,c[h>>2]|0)|0;if((j|0)==0){k=0;i=e;return k|0}if((qt(j+52|0,c[a+8>>2]|0)|0)==0){k=0;i=e;return k|0}h=fq(j+72|0,c[a+12>>2]|0)|0;if((h|0)==0){k=0;i=e;return k|0}b[d>>1]=b[h+4>>1]|0;c[d+4>>2]=c[h+8>>2];g[d+36>>2]=+Aq(c[f>>2]|0,h);a=c[f>>2]|0;l=+(+g[h+12>>2]+ +g[j+20>>2]+ +g[a+8>>2]);m=+(+g[a+20>>2]-(+g[h+16>>2]+ +g[j+32>>2]));j=d+20|0;g[j>>2]=l;g[j+4>>2]=m;g[d+28>>2]=+Nq(c[f>>2]|0,h,0);g[d+32>>2]=+Oq(c[f>>2]|0,h,0);j=c[h+28>>2]|0;if((j|0)!=0){a=d+48|0;c[a+0>>2]=c[j+0>>2];c[a+4>>2]=c[j+4>>2];c[a+8>>2]=c[j+8>>2];c[a+12>>2]=c[j+12>>2];c[a+16>>2]=c[j+16>>2];c[a+20>>2]=c[j+20>>2];c[a+24>>2]=c[j+24>>2]}c[d+40>>2]=Vr(c[(c[f>>2]|0)+108>>2]|0,h)|0;g[d+44>>2]=+Ur(c[f>>2]|0,h,0);k=1;i=e;return k|0}\n\n\n\nfunction S7(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;do{if(((((((((J4(a,+h[c[b>>2]>>3])|0)!=0?(J4(a,+h[(c[b>>2]|0)+8>>3])|0)!=0:0)?(J4(a,+h[(c[b>>2]|0)+16>>3])|0)!=0:0)?(J4(a,+h[(c[b>>2]|0)+24>>3])|0)!=0:0)?(J4(a,+h[(c[b>>2]|0)+32>>3])|0)!=0:0)?(J4(a,+h[(c[b>>2]|0)+40>>3])|0)!=0:0)?(J4(a,+h[(c[b>>2]|0)+48>>3])|0)!=0:0)?(J4(a,+h[(c[b>>2]|0)+56>>3])|0)!=0:0)?(J4(a,+h[(c[b>>2]|0)+64>>3])|0)!=0:0){e=b+4|0;f=c[e>>2]|0;if((f|0)==0){if((J4(a,0.0)|0)==0){g=0;break}if((J4(a,0.0)|0)==0){g=0;break}if((J4(a,0.0)|0)==0){g=0;break}}else{if((J4(a,+h[f>>3])|0)==0){g=0;break}if((J4(a,+h[(c[e>>2]|0)+8>>3])|0)==0){g=0;break}if((J4(a,+h[(c[e>>2]|0)+16>>3])|0)==0){g=0;break}}g=1}else{g=0}}while(0);i=d;return g|0}function T7(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=i;i=i+96|0;g=f;h=f+72|0;j=f+76|0;k=f+8|0;if(e>>>0>16){l=0;i=f;return l|0}if((dd[c[b+276>>2]&511](b,d)|0)==0){l=0;i=f;return l|0}d=(e|0)==0;a:do{if(d){m=a+20|0;n=13}else{f3a(k|0,0,e<<2|0)|0;o=a+20|0;p=0;while(1){q=Q4(b)|0;if((q|0)==1668641398){r=A5(a,b,h,0)|0}else if((q|0)==1885434465){r=E5(a,b,h,0)|0}else{Kda(j,q);q=c[o>>2]|0;c[g>>2]=j;Jda(q,8,723144,g);r=0}c[k+(p<<2)>>2]=r;if((r|0)==0){s=0;break a}p=p+1|0;if((S4(b)|0)==0){s=0;break a}if(!(p>>>0<e>>>0)){m=o;n=13;break}}}}while(0);if((n|0)==13){s=K2(c[m>>2]|0,e,k)|0}if(d){l=s;i=f;return l|0}else{t=0}do{V0(c[k+(t<<2)>>2]|0);t=t+1|0}while((t|0)!=(e|0));l=s;i=f;return l|0}function U7(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+96|0;f=e+24|0;g=e;if(((((((((((((dd[c[b+276>>2]&511](b,d)|0)!=0?(A4(b,f)|0)!=0:0)?(A4(b,f+8|0)|0)!=0:0)?(A4(b,f+16|0)|0)!=0:0)?(A4(b,f+24|0)|0)!=0:0)?(A4(b,f+32|0)|0)!=0:0)?(A4(b,f+40|0)|0)!=0:0)?(A4(b,f+48|0)|0)!=0:0)?(A4(b,f+56|0)|0)!=0:0)?(A4(b,f+64|0)|0)!=0:0)?(A4(b,g)|0)!=0:0)?(A4(b,g+8|0)|0)!=0:0)?(A4(b,g+16|0)|0)!=0:0){h=Q2(c[a+20>>2]|0,3,3,f,g)|0}else{h=0}i=e;return h|0}function V7(e,f,g,h,j){e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;k=i;i=i+96|0;l=k;m=k+80|0;n=k+8|0;o=k+73|0;p=k+72|0;a:do{if((dd[c[f+276>>2]&511](f,g)|0)!=0?(q=f+272|0,(id[c[q>>2]&511](f,m,16,1)|0)==1):0){r=0;do{s=a[m+r>>0]|0;if(s<<24>>24==1){t=0;break a}c[n+(r<<2)>>2]=s&255;r=r+1|0}while(r>>>0<16);if(((((u4(f,o)|0)!=0?(u4(f,0)|0)!=0:0)?(u4(f,0)|0)!=0:0)?(u4(f,0)|0)!=0:0)?(r=e+20|0,s=U2(c[r>>2]|0,n,h,j,0)|0,(s|0)!=0):0){u=c[s+32>>2]|0;v=a[o>>0]|0;if(v<<24>>24==1){w=u+8|0;if((c[w>>2]|0)==0){t=s;break}x=0;while(1){if((id[c[q>>2]&511](f,p,1,1)|0)!=1){t=0;break a}y=d[p>>0]|0;b[(c[u>>2]|0)+(x<<1)>>1]=y<<8|y;x=x+1|0;if(!(x>>>0<(c[w>>2]|0)>>>0)){t=s;break}}}else if(v<<24>>24==2){if((w4(f,c[u+8>>2]|0,c[u>>2]|0)|0)!=0){t=s;break}O2(s);t=0;break}else{O2(s);w=c[r>>2]|0;c[l>>2]=d[o>>0]|0;Jda(w,8,723112,l);t=0;break}}else{t=0}}else{t=0}}while(0);i=k;return t|0}function W7(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;if((d|0)==0){_a(723424,722448,2012,723448)}f=d+4|0;g=c[(c[c[f>>2]>>2]|0)+20>>2]|0;h=c[d>>2]|0;if((h|0)==0){j=1;i=e;return j|0}k=(g|0)>0;l=h;h=0;a:while(1){if(k){m=0;do{if((E4(a,b[(c[(c[(c[f>>2]|0)+(h<<2)>>2]|0)+24>>2]|0)+(m<<1)>>1]|0)|0)==0){j=0;n=10;break a}m=m+1|0}while((m|0)<(g|0));o=c[d>>2]|0}else{o=l}h=h+1|0;if(!(h>>>0<o>>>0)){j=1;n=10;break}else{l=o}}if((n|0)==10){i=e;return j|0}return 0}function X7(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;if((b|0)==0|(a|0)==0){e=0;i=d;return e|0}a:do{if((c|0)==0){f=1}else{g=4294967295/(b>>>0)|0;h=c;j=1;while(1){k=ca(j,b)|0;h=h+ -1|0;if(k>>>0>g>>>0){e=-1;break}if((h|0)==0){f=k;break a}else{j=k}}i=d;return e|0}}while(0);b=ca(f,a)|0;e=(f|0)==((b>>>0)/(a>>>0)|0|0)?b:-1;i=d;return e|0}function Y7(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;i=i+64|0;h=g;if((f|0)<1){j=1;i=g;return j|0}if((f|0)<2|(e|0)>16){j=0;i=g;return j|0}k=h+0|0;l=k+64|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(l|0));k=(e|0)>0;a:do{if(k){l=0;while(1){m=M0(a,f,0)|0;c[h+(l<<2)>>2]=m;if((m|0)==0){break a}l=l+1|0;if((w4(b,f,c[m+24>>2]|0)|0)==0){break a}if((l|0)>=(e|0)){n=8;break}}}else{n=8}}while(0);if((n|0)==8?(F3(d,1,K2(a,e,h)|0)|0)!=0:0){if(k){o=0}else{j=1;i=g;return j|0}do{V0(c[h+(o<<2)>>2]|0);o=o+1|0}while((o|0)!=(e|0));j=1;i=g;return j|0}if(k){p=0}else{j=0;i=g;return j|0}do{k=c[h+(p<<2)>>2]|0;if((k|0)!=0){V0(k)}p=p+1|0}while((p|0)!=(e|0));j=0;i=g;return j|0}function Z7(a,d,f,g){a=a|0;d=d|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;h=i;i=i+16|0;j=h;if((f|0)==0){k=1;i=h;return k|0}l=(g|0)==0;m=g+4|0;g=0;a:while(1){b:do{if(!l){n=c[(c[m>>2]|0)+(g<<2)>>2]|0;o=c[n+20>>2]|0;if((o|0)==256){p=n;q=0;while(1){r=q+1|0;if((D4(d,(((e[(c[p+24>>2]|0)+(q<<1)>>1]|0)*65281|0)+8388608|0)>>>24&255)|0)==0){k=0;s=14;break a}if((r|0)>=256){break b}p=c[(c[m>>2]|0)+(g<<2)>>2]|0;q=r}}else if((o|0)!=2){s=9;break a}q=c[n+24>>2]|0;if((b[q>>1]|0)!=0){s=9;break a}if((b[q+2>>1]|0)==-1){t=0}else{s=9;break a}do{if((D4(d,t&255)|0)==0){k=0;s=14;break a}t=t+1|0}while((t|0)<256)}}while(0);g=g+1|0;if(!(g>>>0<f>>>0)){k=1;s=14;break}}if((s|0)==9){Jda(a,2,723512,j);k=0;i=h;return k|0}else if((s|0)==14){i=h;return k|0}return 0}function _7(a,e,f,g){a=a|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;h=i;i=i+64|0;j=h;if((g+ -1|0)>>>0>15){k=0;i=h;return k|0}l=j+0|0;m=l+64|0;do{c[l>>2]=0;l=l+4|0}while((l|0)<(m|0));l=Cda(a,256)|0;if((l|0)==0){k=0;i=h;return k|0}m=(g|0)>0;a:do{if(m){n=0;do{o=M0(a,256,0)|0;c[j+(n<<2)>>2]=o;n=n+1|0;if((o|0)==0){p=l;break a}}while((n|0)<(g|0));n=e+272|0;o=0;while(1){if((id[c[n>>2]&511](e,l,256,1)|0)!=1){p=l;break a}q=j+(o<<2)|0;r=0;do{s=d[l+r>>0]|0;b[(c[(c[q>>2]|0)+24>>2]|0)+(r<<1)>>1]=s<<8|s;r=r+1|0}while((r|0)!=256);o=o+1|0;if((o|0)>=(g|0)){t=11;break}}}else{t=11}}while(0);if((t|0)==11){Gda(a,l);if((F3(f,1,K2(a,g,j)|0)|0)==0){p=0}else{if(m){u=0}else{k=1;i=h;return k|0}do{V0(c[j+(u<<2)>>2]|0);u=u+1|0}while((u|0)!=(g|0));k=1;i=h;return k|0}}if(m){m=0;do{u=c[j+(m<<2)>>2]|0;if((u|0)!=0){V0(u)}m=m+1|0}while((m|0)!=(g|0))}if((p|0)==0){k=0;i=h;return k|0}Gda(a,p);k=0;i=h;return k|0}function $7(a,b,c){a=+a;b=+b;c=c|0;var d=0,e=0;d=i;if((G4(c,K4(a)|0)|0)==0){e=0;i=d;return e|0}e=(G4(c,K4(b)|0)|0)!=0&1;i=d;return e|0}function a8(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=i;i=i+272|0;g=f+192|0;j=f+120|0;k=f+96|0;l=f+24|0;m=f;n=X1(a)|0;if((n|0)==0){o=0;i=f;return o|0}o2(n,4.3);m2(n,1835955314);k2(n,1380401696);i2(n,1482250784);c2(n);a:do{if((b8(n,723744)|0)!=0){if((b|0)!=0){if((A2(n,2004119668,724176)|0)==0){break}$3(m,b);l8(l,m)|0;if((A2(n,1667785060,l)|0)==0){break}if((d|0)!=0){h[k>>3]=+h[b>>3];h[k+8>>3]=+h[b+8>>3];h[k+16>>3]=1.0;if((m8(g,k,d)|0)==0){break}h[j>>3]=+h[g>>3];h[j+8>>3]=+h[g+24>>3];h[j+16>>3]=+h[g+48>>3];a=j+24|0;h[a>>3]=+h[g+8>>3];h[j+32>>3]=+h[g+32>>3];h[j+40>>3]=+h[g+56>>3];p=j+48|0;h[p>>3]=+h[g+16>>3];h[j+56>>3]=+h[g+40>>3];h[j+64>>3]=+h[g+64>>3];if((A2(n,1918392666,j)|0)==0){break}if((A2(n,1649957210,p)|0)==0){break}if((A2(n,1733843290,a)|0)==0){break}}}do{if((e|0)!=0){if((A2(n,1918128707,c[e>>2]|0)|0)==0){break a}a=c[e+4>>2]|0;if((a|0)==(c[e>>2]|0)){if((D2(n,1733579331)|0)==0){break a}}else{if((A2(n,1733579331,a)|0)==0){break a}}a=c[e+8>>2]|0;if((a|0)==(c[e>>2]|0)){if((D2(n,1649693251)|0)==0){break a}else{break}}else{if((A2(n,1649693251,a)|0)==0){break a}else{break}}}}while(0);if((d|0)==0){o=n;i=f;return o|0}a=(A2(n,1667789421,d)|0)!=0;if(a){o=a?n:0;i=f;return o|0}}}while(0);r2(n);o=0;i=f;return o|0}function b8(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;c=i;d=Y1(a)|0;e=kea(d,1)|0;f=kea(d,1)|0;d=(e|0)==0;g=(f|0)==0;if(((!(d|g)?(nea(e,b)|0)!=0:0)?(nea(f,724072)|0)!=0:0)?(A2(a,1684370275,e)|0)!=0:0){h=(A2(a,1668313716,f)|0)!=0&1}else{h=0}if(!d){qea(e)}if(g){i=c;return h|0}qea(f);i=c;return h|0}function c8(a){a=a|0;var b=0,c=0,d=0,e=0;b=i;i=i+32|0;c=b;d=X1(0)|0;if((d|0)==0){e=0;i=b;return e|0}o2(d,4.3);m2(d,1835955314);k2(d,1196573017);i2(d,1482250784);c2(d);if((b8(d,723800)|0)!=0?($3(c,724200),(A2(d,2004119668,c)|0)!=0):0){if((a|0)==0){e=d;i=b;return e|0}c=(A2(d,1800688195,a)|0)!=0;if(c){e=c?d:0;i=b;return e|0}}r2(d);e=0;i=b;return e|0}function d8(a){a=a|0;var b=0,c=0;b=i;c=c8(a)|0;i=b;return c|0}function e8(a){a=a|0;var b=0,c=0,d=0,e=0;b=i;i8();c=a8(a,724200,0,0)|0;if((c|0)==0){d=0;i=b;return d|0}o2(c,2.1);m2(c,1633842036);k2(c,1281450528);i2(c,1281450528);if((b8(c,723856)|0)==0){d=0;i=b;return d|0}e=v3(a,3,3)|0;if((e|0)!=0){if((F3(e,0,a3(a)|0)|0)!=0?(A2(c,1093812784,e)|0)!=0:0){B3(e);d=c;i=b;return d|0}B3(e)}r2(c);d=0;i=b;return d|0}function f8(a){a=a|0;var b=0,c=0,d=0,e=0;b=i;i8();c=a8(a,724200,0,0)|0;if((c|0)==0){d=0;i=b;return d|0}o2(c,4.3);m2(c,1633842036);k2(c,1281450528);i2(c,1281450528);if((b8(c,723856)|0)!=0?(e=v3(a,3,3)|0,(e|0)!=0):0){if((F3(e,0,P2(a)|0)|0)!=0?(A2(c,1093812784,e)|0)!=0:0){B3(e);d=c;i=b;return d|0}B3(e)}r2(c);d=0;i=b;return d|0}function g8(){var a=0,b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0;a=i;i=i+160|0;b=a+96|0;d=a+72|0;e=a;f=a+136|0;g=e+0|0;j=723944|0;k=g+72|0;do{c[g>>2]=c[j>>2];g=g+4|0;j=j+4|0}while((g|0)<(k|0));j8(d,6504.0)|0;h[b>>3]=2.4;h[b+8>>3]=.9478672985781991;h[b+16>>3]=.05213270142180095;h[b+24>>3]=.07739938080495357;h[b+32>>3]=.04045;j=S0(0,4,b)|0;c[f+8>>2]=j;c[f+4>>2]=j;c[f>>2]=j;if((j|0)==0){l=0;i=a;return l|0}j=a8(0,d,e,f)|0;V0(c[f>>2]|0);if((j|0)==0){l=0;i=a;return l|0}if((b8(j,724016)|0)!=0){l=j;i=a;return l|0}r2(j);l=0;i=a;return l|0}function h8(){var a=0,b=0;a=i;b=g8()|0;i=a;return b|0}function i8(){var a=0;a=i;_3(724200,724176);i=a;return}function j8(a,b){a=a|0;b=+b;var c=0,d=0,e=0.0,f=0.0,g=0.0,j=0;c=i;i=i+16|0;d=c;if((a|0)==0){_a(724224,724256,54,724312)}e=b*b;f=e*b;do{if(b>=4.0e3&b<=7.0e3){g=1.0e9/f*-4.607+1.0e6/e*2.9678+1.0e3/b*.09911+.244063}else{if(b>7.0e3&b<=25.0e3){g=1.0e9/f*-2.0064+1.0e6/e*1.9018+1.0e3/b*.24748+.23704;break}Jda(0,2,724336,d);j=0;i=c;return j|0}}while(0);h[a>>3]=g;h[a+8>>3]=g*2.87+g*g*-3.0+-.275;h[a+16>>3]=1.0;j=1;i=c;return j|0}function k8(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0.0,f=0.0,g=0.0,j=0.0,k=0.0,l=0.0,m=0,n=0;c=i;if((b|0)==0){_a(724224,724256,151,724376)}if((a|0)==0){_a(724400,724256,152,724376)}d=+h[b>>3];e=+h[b+8>>3];f=e*6.0-d+1.5;g=d*2.0/f;d=e*3.0/f;f=0.0;b=0;e=0.0;while(1){j=+h[724448+(b<<5)>>3];k=+h[724424+(b<<5)>>3];l=(d- +h[724440+(b<<5)>>3]-(g- +h[724432+(b<<5)>>3])*j)/+S(+(j*j+1.0));if((b|0)==0){f=l;b=1;e=k;continue}if(f/l<0.0){break}b=b+1|0;if(!(b>>>0<31)){m=0;n=10;break}else{f=l;e=k}}if((n|0)==10){i=c;return m|0}h[a>>3]=1.0e6/(e+(k-e)*(f/(f-l)));m=1;i=c;return m|0}function l8(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;i=i+384|0;e=d+312|0;f=d+288|0;g=d+264|0;j=d+240|0;k=d+216|0;l=d+144|0;m=d+72|0;n=d;o=n+0|0;p=725416|0;q=o+72|0;do{c[o>>2]=c[p>>2];o=o+4|0;p=p+4|0}while((o|0)<(q|0));o=m+0|0;p=725416|0;q=o+72|0;do{c[o>>2]=c[p>>2];o=o+4|0;p=p+4|0}while((o|0)<(q|0));if((X3(m,e)|0)==0){r=0;i=d;return r|0}T3(f,+h[b>>3],+h[b+8>>3],+h[b+16>>3]);T3(j,+h[90522],+h[724184>>3],+h[724192>>3]);Z3(g,n,f);Z3(k,n,j);T3(l,+h[k>>3]/+h[g>>3],0.0,0.0);T3(l+24|0,0.0,+h[k+8>>3]/+h[g+8>>3],0.0);T3(l+48|0,0.0,0.0,+h[k+16>>3]/+h[g+16>>3]);W3(m,l,n);W3(a,e,m);r=1;i=d;return r|0}function m8(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0.0;e=i;i=i+368|0;f=e+336|0;g=e+264|0;j=e+192|0;k=e+168|0;l=e+144|0;m=e+72|0;n=e;o=+h[b>>3];p=+h[b+8>>3];q=+h[d>>3];r=+h[d+8>>3];s=+h[d+24>>3];t=+h[d+32>>3];u=+h[d+48>>3];v=+h[d+56>>3];T3(n,q,s,u);T3(n+24|0,r,t,v);w=1.0-q-r;x=1.0-s-t;y=1.0-u-v;T3(n+48|0,w,x,y);if((X3(n,m)|0)==0){z=0;i=e;return z|0}T3(k,o/p,1.0,(1.0-o-p)/p);Z3(l,m,k);p=+h[l>>3];o=+h[l+8>>3];A=+h[l+16>>3];T3(a,q*p,s*o,u*A);T3(a+24|0,r*p,t*o,v*A);T3(a+48|0,w*p,x*o,y*A);$3(f,b);if((l8(g,f)|0)==0){z=0;i=e;return z|0}f=j+0|0;b=a+0|0;l=f+72|0;do{c[f>>2]=c[b>>2];f=f+4|0;b=b+4|0}while((f|0)<(l|0));W3(a,g,j);z=1;i=e;return z|0}function n8(a){a=a|0;var b=0,c=0.0;b=i;c=+h[(U4(a,3)|0)>>3];i=b;return+c}function o8(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;if((a|0)==0){_a(725584,725528,151,725608)}d=c[a+96>>2]|0;if((d|0)!=0){B3(d)}d=c[a+92>>2]|0;if((d|0)!=0){B3(d)}d=c[a+100>>2]|0;if((d|0)!=0){wea(d)}d=c[a+104>>2]|0;if((d|0)!=0){wea(d)}d=c[a+168>>2]|0;if((d|0)!=0){Hea(d)}d=c[a+192>>2]|0;if((d|0)==0){e=a+188|0;f=c[e>>2]|0;Gda(f,a);i=b;return}else{g=a+188|0;Ic[c[a+196>>2]&511](c[g>>2]|0,d);e=g;f=c[e>>2]|0;Gda(f,a);i=b;return}}function p8(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=i;Fc[c[a+8>>2]&63](a,b,d,e,e);i=f;return}function q8(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;i=i+32|0;h=g;if((e|0)==0){i=g;return}j=a+12|0;k=a+16|0;l=b;b=0;m=d;do{l=id[c[j>>2]&511](a,h,l,f)|0;m=id[c[k>>2]&511](a,h,m,f)|0;b=b+1|0}while((b|0)!=(e|0));i=g;return}function r8(a,d,e,f,g,h,j,k,l,m,n){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;o=i;i=i+16|0;p=o;q=o+12|0;r=o+8|0;s=o+4|0;c[q>>2]=l;c[r>>2]=m;c[s>>2]=n;t=d+ -1|0;u=g+(t<<2)|0;v=c[u>>2]|0;if((n&512|0)!=0){w=s8(a,0,0,q,r,s)|0;i=o;return w|0}x=(j|0)==0;if((n&4096|0)!=0&x){y=n&-4097;c[s>>2]=y;z=y}else{z=n}if((vfa(l)|0)==0?(vfa(m)|0)==0:0){A=z}else{n=z|64;c[s>>2]=n;A=n}a:do{if((d|0)>=1?(n=c[e>>2]|0,(n|0)!=0):0){z=j2(n)|0;b:do{if((d|0)>0){y=(d|0)>1;B=n;C=z;D=z;E=0;while(1){F=(D|0)!=1281450528&(D|0)!=1482250784;if((B|0)==0){break a}G=l2(B)|0;do{if((G|0)==1852662636){if(y){H=826494034;I=h2(B)|0;break}else{H=826494034;I=j2(B)|0;break}}else{if(F|(G|0)==1818848875){J=j2(B)|0;H=J;I=h2(B)|0;break}else{J=h2(B)|0;H=J;I=j2(B)|0;break}}}while(0);G=(E|0)==0?H:C;F=E+1|0;if((F|0)>=(d|0)){K=G;L=I;break b}B=c[e+(F<<2)>>2]|0;C=G;D=I;E=F}}else{K=z;L=z}}while(0);if((t8(K,l)|0)==0){Jda(a,9,725680,p);w=0;i=o;return w|0}if((t8(L,m)|0)==0){Jda(a,9,725720,p);w=0;i=o;return w|0}z=sda(a,d,g,e,f,h,A)|0;if((z|0)==0){Jda(a,13,725760,p);w=0;i=o;return w|0}n=m4(K)|0;if((n|0)==(z3(z)|0)?(n=m4(L)|0,(n|0)==(A3(z)|0)):0){n=s8(a,z,v,q,r,s)|0;if((n|0)==0){w=0;i=o;return w|0}c[n+108>>2]=K;c[n+112>>2]=L;c[n+184>>2]=c[u>>2];u8(n+120|0,x2(c[e>>2]|0,2004119668)|0);E=e+(t<<2)|0;u8(n+144|0,x2(c[E>>2]|0,2004119668)|0);if(!x?(c[s>>2]&4096|0)!=0:0){c[n+96>>2]=Wda(a,e,f,g,h,k,j)|0}D=c[e>>2]|0;if((_1(D,1668051572)|0)!=0){c[n+100>>2]=xea(x2(D,1668051572)|0)|0}D=c[E>>2]|0;if((l2(D)|0)==1818848875){if((_1(D,1668050804)|0)!=0){c[n+104>>2]=xea(x2(D,1668050804)|0)|0}}else{if((_1(D,1668051572)|0)!=0){c[n+104>>2]=xea(x2(D,1668051572)|0)|0}}if((c[s>>2]&128|0)==0){c[n+168>>2]=0}else{c[n+168>>2]=hea(a,d,e)|0}do{if((c[s>>2]&64|0)==0){D=n+28|0;E=D+0|0;C=E+32|0;do{b[E>>1]=0;E=E+2|0}while((E|0)<(C|0));if((c[n+96>>2]|0)==0){E=c[n+92>>2]|0;ld[c[E+16>>2]&255](D,n+60|0,c[E+12>>2]|0);break}else{v8(n,D,n+60|0);break}}}while(0);w=n;i=o;return w|0}B3(z);Jda(a,13,725792,p);w=0;i=o;return w|0}}while(0);Jda(a,4,725640,p);w=0;i=o;return w|0}function s8(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;h=i;i=i+48|0;j=h;k=h+32|0;l=h+28|0;m=h+24|0;n=h+20|0;o=h+16|0;p=h+12|0;q=h+8|0;r=h+4|0;s=U4(a,13)|0;t=Dda(a,200)|0;if((t|0)==0){u=0;i=h;return u|0}v=t+92|0;c[v>>2]=b;w=c[s>>2]|0;do{if((w|0)==0){x=b}else{s=t+8|0;y=t+192|0;z=t+196|0;A=w;while(1){if((Ec[c[A>>2]&15](s,y,z,v,e,f,g)|0)!=0){break}A=c[A+4>>2]|0;if((A|0)==0){B=7;break}}if((B|0)==7){x=c[v>>2]|0;break}c[t+188>>2]=a;A=c[e>>2]|0;c[t>>2]=A;c[t+4>>2]=c[f>>2];c[t+172>>2]=c[g>>2];ufa(k,a,A,0,0);c[t+12>>2]=c[k>>2];ufa(l,a,c[f>>2]|0,1,0);c[t+16>>2]=c[l>>2];ufa(m,a,c[e>>2]|0,0,1);c[t+20>>2]=c[m>>2];ufa(n,a,c[f>>2]|0,1,1);c[t+24>>2]=c[n>>2];u=t;i=h;return u|0}}while(0);if((x|0)!=0){Rea(a,v,d,e,f,g)}d=c[e>>2]|0;do{if((vfa(d)|0)!=0?(vfa(c[f>>2]|0)|0)!=0:0){ufa(o,a,d,0,1);v=t+20|0;c[v>>2]=c[o>>2];ufa(p,a,c[f>>2]|0,1,1);x=c[p>>2]|0;c[t+24>>2]=x;n=c[g>>2]|0;m=n|33554432;c[g>>2]=m;if((c[v>>2]|0)==0|(x|0)==0){Jda(a,8,725904,j);Gda(a,t);u=0;i=h;return u|0}x=t+8|0;if((n&512|0)==0){c[x>>2]=23;C=m;break}else{c[x>>2]=22;C=m;break}}else{B=17}}while(0);do{if((B|0)==17){if((d|0)==0?(c[f>>2]|0)==0:0){c[t+16>>2]=0;c[t+12>>2]=0;p=c[g>>2]|33554432;c[g>>2]=p;D=p}else{B=20}do{if((B|0)==20){ufa(q,a,d,0,0);p=t+12|0;c[p>>2]=c[q>>2];ufa(r,a,c[f>>2]|0,1,0);o=c[r>>2]|0;c[t+16>>2]=o;if((c[p>>2]|0)==0|(o|0)==0){Jda(a,8,725904,j);Gda(a,t);u=0;i=h;return u|0}else{o=c[t>>2]&7;p=c[g>>2]|0;if(!((o|0)==0|o>>>0>1)){D=p;break}o=p|33554432;c[g>>2]=o;D=o;break}}}while(0);if((D&512|0)!=0){c[t+8>>2]=24;C=D;break}o=(D&4096|0)!=0;p=t+8|0;if((D&64|0)==0){if(o){c[p>>2]=27}c[p>>2]=28;C=D;break}else{if(o){c[p>>2]=25}c[p>>2]=26;C=D;break}}}while(0);c[t>>2]=c[e>>2];c[t+4>>2]=c[f>>2];c[t+172>>2]=C;c[t+188>>2]=a;c[t+192>>2]=0;u=t;i=h;return u|0}function t8(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=b>>>16&31;b=p4(a)|0;if((d|0)==0|(d|0)==(b|0)){i=c;return 1}if((d|0)==30&(b|0)==10){i=c;return 1}else{i=c;return(d|0)==10&(b|0)==30&1|0}return 0}function u8(a,b){a=a|0;b=b|0;var c=0;c=i;if((b|0)==0){h[a>>3]=.9642;h[a+8>>3]=1.0;h[a+16>>3]=.8249;i=c;return}else{h[a>>3]=+h[b>>3];h[a+8>>3]=+h[b+8>>3];h[a+16>>3]=+h[b+16>>3];i=c;return}}function v8(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;i=i+16|0;g=f;h=c[a+96>>2]|0;ld[c[h+16>>2]&255](d,g,c[h+12>>2]|0);if((b[g>>1]|0)==0){g=c[a+92>>2]|0;ld[c[g+16>>2]&255](d,e,c[g+12>>2]|0);i=f;return}g=U4(c[a+188>>2]|0,2)|0;d=a+92|0;if((c[(c[d>>2]|0)+8>>2]|0)==0){i=f;return}a=0;h=0;do{b[e+(a<<1)>>1]=b[g+(a<<1)>>1]|0;h=h+1<<16>>16;a=h&65535}while(a>>>0<(c[(c[d>>2]|0)+8>>2]|0)>>>0);i=f;return}function w8(a,b,d,e,f,g,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0;k=i;i=i+4112|0;l=k+2048|0;m=k+3080|0;n=k+2056|0;o=k;if((d|0)==0|d>>>0>255){c[l>>2]=d;Jda(a,2,725848,l);p=0;i=k;return p|0}l=j>>>13&1;q=0;do{c[m+(q<<2)>>2]=l;c[n+(q<<2)>>2]=g;h[o+(q<<3)>>3]=+n8(a);q=q+1|0}while((q|0)!=(d|0));p=r8(a,d,b,m,n,o,0,0,e,f,j)|0;i=k;return p|0}function x8(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0;j=i;i=i+16|0;k=j;c[k>>2]=b;c[k+4>>2]=e;b=w8(a,k,(e|0)==0?1:2,d,f,g,h)|0;i=j;return b|0}function y8(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=i;h=x8(Y1(a)|0,a,b,c,d,e,f)|0;i=g;return h|0}function z8(a,b,d,e,f,g,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0;m=i;i=i+80|0;n=m+64|0;o=m+48|0;p=m+32|0;q=m;r=l>>>13&1;c[n>>2]=b;c[n+4>>2]=g;c[n+8>>2]=g;c[n+12>>2]=e;c[o>>2]=j;c[o+4>>2]=j;c[o+8>>2]=1;c[o+12>>2]=k;c[p>>2]=r;c[p+4>>2]=r;c[p+8>>2]=0;c[p+12>>2]=0;s=+n8(a);h[q+24>>3]=s;h[q+16>>3]=s;h[q+8>>3]=s;h[q>>3]=s;if((l&20480|0)==0){t=x8(a,b,d,e,f,j,l)|0;i=m;return t|0}else{t=r8(a,4,n,p,o,q,g,1,d,f,l)|0;i=m;return t|0}return 0}function A8(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0;j=i;k=z8(Y1(a)|0,a,b,c,d,e,f,g,h)|0;i=j;return k|0}function B8(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;i=i+64|0;h=g;if((e|0)==0){i=g;return}j=a+20|0;k=a+24|0;l=b;b=0;m=d;do{l=id[c[j>>2]&511](a,h,l,f)|0;m=id[c[k>>2]&511](a,h,m,f)|0;b=b+1|0}while((b|0)!=(e|0));i=g;return}function C8(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;h=i;i=i+144|0;j=h+72|0;k=h+8|0;l=h;if((e|0)==0){i=h;return}m=a+20|0;n=a+96|0;o=a+92|0;p=a+24|0;q=b;b=0;r=d;do{q=id[c[m>>2]&511](a,j,q,f)|0;d=c[n>>2]|0;do{if((d|0)!=0){D3(j,l,d);if(+g[l>>2]>0.0){s=0;do{g[k+(s<<2)>>2]=-1.0;s=s+1|0}while((s|0)!=16)}else{D3(j,k,c[o>>2]|0);break}}else{D3(j,k,c[o>>2]|0)}}while(0);r=id[c[p>>2]&511](a,k,r,f)|0;b=b+1|0}while((b|0)!=(e|0));i=h;return}function D8(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0;g=i;i=i+64|0;h=g+32|0;j=g;if((e|0)==0){i=g;return}k=a+12|0;l=a+16|0;m=b;b=0;n=d;do{m=id[c[k>>2]&511](a,h,m,f)|0;v8(a,h,j);n=id[c[l>>2]&511](a,j,n,f)|0;b=b+1|0}while((b|0)!=(e|0));i=g;return}function E8(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;g=i;i=i+64|0;h=g+32|0;j=g;if((e|0)==0){i=g;return}k=a+12|0;l=a+92|0;m=a+16|0;n=b;b=0;o=d;do{n=id[c[k>>2]&511](a,h,n,f)|0;d=c[l>>2]|0;ld[c[d+16>>2]&255](h,j,c[d+12>>2]|0);o=id[c[m>>2]&511](a,j,o,f)|0;b=b+1|0}while((b|0)!=(e|0));i=g;return}function F8(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;h=i;i=i+128|0;j=h+96|0;k=h+64|0;l=h;m=j+0|0;n=m+32|0;do{b[m>>1]=0;m=m+2|0}while((m|0)<(n|0));m=k+0|0;n=m+32|0;do{b[m>>1]=0;m=m+2|0}while((m|0)<(n|0));m=l+0|0;o=a+28|0;n=m+64|0;do{b[m>>1]=b[o>>1]|0;m=m+2|0;o=o+2|0}while((m|0)<(n|0));if((f|0)==0){i=h;return}p=a+12|0;q=l+32|0;r=a+16|0;s=d;d=0;t=e;do{s=id[c[p>>2]&511](a,j,s,g)|0;if((Q2a(j,l,32)|0)==0){m=k+0|0;o=q+0|0;n=m+32|0;do{b[m>>1]=b[o>>1]|0;m=m+2|0;o=o+2|0}while((m|0)<(n|0))}else{v8(a,j,k);m=l+0|0;o=j+0|0;n=m+32|0;do{b[m>>1]=b[o>>1]|0;m=m+2|0;o=o+2|0}while((m|0)<(n|0));m=q+0|0;o=k+0|0;n=m+32|0;do{b[m>>1]=b[o>>1]|0;m=m+2|0;o=o+2|0}while((m|0)<(n|0))}t=id[c[r>>2]&511](a,k,t,g)|0;d=d+1|0}while((d|0)!=(f|0));i=h;return}function G8(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;h=i;i=i+128|0;j=h+96|0;k=h+64|0;l=h;m=j+0|0;n=m+32|0;do{b[m>>1]=0;m=m+2|0}while((m|0)<(n|0));m=k+0|0;n=m+32|0;do{b[m>>1]=0;m=m+2|0}while((m|0)<(n|0));m=l+0|0;o=a+28|0;n=m+64|0;do{b[m>>1]=b[o>>1]|0;m=m+2|0;o=o+2|0}while((m|0)<(n|0));if((f|0)==0){i=h;return}p=a+12|0;q=l+32|0;r=a+16|0;s=a+92|0;t=d;d=0;u=e;do{t=id[c[p>>2]&511](a,j,t,g)|0;if((Q2a(j,l,32)|0)==0){m=k+0|0;o=q+0|0;n=m+32|0;do{b[m>>1]=b[o>>1]|0;m=m+2|0;o=o+2|0}while((m|0)<(n|0))}else{e=c[s>>2]|0;ld[c[e+16>>2]&255](j,k,c[e+12>>2]|0);m=l+0|0;o=j+0|0;n=m+32|0;do{b[m>>1]=b[o>>1]|0;m=m+2|0;o=o+2|0}while((m|0)<(n|0));m=q+0|0;o=k+0|0;n=m+32|0;do{b[m>>1]=b[o>>1]|0;m=m+2|0;o=o+2|0}while((m|0)<(n|0))}u=id[c[r>>2]&511](a,k,u,g)|0;d=d+1|0}while((d|0)!=(f|0));i=h;return}function H8(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;c[b+4>>2]=0;e=c[b>>2]|0;f=b+12|0;g=c[f>>2]|0;f3a(b|0,0,360)|0;c[b>>2]=e;c[f>>2]=g;a[b+16>>0]=0;$aa(b);c[b+8>>2]=0;c[b+24>>2]=0;c[b+352>>2]=0;g=b+48|0;f=b+68|0;e=f+52|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(e|0));h[g>>3]=1.0;c[b+20>>2]=100;i=d;return}function I8(a){a=a|0;var b=0;b=i;l9(a);i=b;return}function J8(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=c[b+72>>2]|0;if((f|0)!=0){a[f+128>>0]=d}f=c[b+76>>2]|0;if((f|0)!=0){a[f+128>>0]=d}f=c[b+80>>2]|0;if((f|0)!=0){a[f+128>>0]=d}f=c[b+84>>2]|0;if((f|0)==0){g=0}else{a[f+128>>0]=d;g=0}do{f=c[b+(g<<2)+88>>2]|0;if((f|0)!=0){a[f+273>>0]=d}f=c[b+(g<<2)+104>>2]|0;if((f|0)!=0){a[f+273>>0]=d}g=g+1|0}while((g|0)!=4);i=e;return}function K8(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=i;e=b+20|0;f=c[e>>2]|0;if((f|0)==102|(f|0)==101){if((c[b+208>>2]|0)>>>0<(c[b+32>>2]|0)>>>0){c[(c[b>>2]|0)+20>>2]=67;Rc[c[c[b>>2]>>2]&1023](b)}Rc[c[(c[b+316>>2]|0)+8>>2]&1023](b)}else if((f|0)!=103){c[(c[b>>2]|0)+20>>2]=20;c[(c[b>>2]|0)+24>>2]=c[e>>2];Rc[c[c[b>>2]>>2]&1023](b)}e=b+316|0;f=c[e>>2]|0;if((a[f+13>>0]|0)!=0){g=b;h=b+332|0;j=c[h>>2]|0;k=j+12|0;l=c[k>>2]|0;Rc[l&1023](b);m=b+24|0;n=c[m>>2]|0;o=n+16|0;p=c[o>>2]|0;Rc[p&1023](b);k9(g);i=d;return}q=b+224|0;r=b+8|0;s=b+328|0;t=f;do{Rc[c[t>>2]&1023](b);if((c[q>>2]|0)!=0){f=0;do{u=c[r>>2]|0;if((u|0)!=0){c[u+4>>2]=f;c[(c[r>>2]|0)+8>>2]=c[q>>2];Rc[c[c[r>>2]>>2]&1023](b)}if((dd[c[(c[s>>2]|0)+4>>2]&511](b,0)|0)<<24>>24==0){c[(c[b>>2]|0)+20>>2]=24;Rc[c[c[b>>2]>>2]&1023](b)}f=f+1|0}while(f>>>0<(c[q>>2]|0)>>>0)}Rc[c[(c[e>>2]|0)+8>>2]&1023](b);t=c[e>>2]|0}while((a[t+13>>0]|0)==0);g=b;h=b+332|0;j=c[h>>2]|0;k=j+12|0;l=c[k>>2]|0;Rc[l&1023](b);m=b+24|0;n=c[m>>2]|0;o=n+16|0;p=c[o>>2]|0;Rc[p&1023](b);k9(g);i=d;return}function L8(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;g=a+20|0;if(!((c[a+208>>2]|0)==0?((c[g>>2]|0)+ -101|0)>>>0<3:0)){c[(c[a>>2]|0)+20>>2]=20;c[(c[a>>2]|0)+24>>2]=c[g>>2];Rc[c[c[a>>2]>>2]&1023](a)}g=a+332|0;ld[c[(c[g>>2]|0)+20>>2]&255](a,226,e);h=c[(c[g>>2]|0)+24>>2]|0;if((e|0)==0){i=f;return}else{j=e;k=b}while(1){j=j+ -1|0;Ic[h&511](a,d[k>>0]|0);if((j|0)==0){break}else{k=k+1|0}}i=f;return}function M8(b,d){b=b|0;d=d|0;var e=0,f=0;e=i;f=b+20|0;if((c[f>>2]|0)!=100){c[(c[b>>2]|0)+20>>2]=20;c[(c[b>>2]|0)+24>>2]=c[f>>2];Rc[c[c[b>>2]>>2]&1023](b)}if(!(d<<24>>24==0)){J8(b,0)}Rc[c[(c[b>>2]|0)+16>>2]&1023](b);Rc[c[(c[b+24>>2]|0)+8>>2]&1023](b);O8(b);Rc[c[c[b+316>>2]>>2]&1023](b);c[b+208>>2]=0;c[f>>2]=(a[b+176>>0]|0)!=0?102:101;i=e;return}function N8(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;g=f;h=b+20|0;if((c[h>>2]|0)!=101){c[(c[b>>2]|0)+20>>2]=20;c[(c[b>>2]|0)+24>>2]=c[h>>2];Rc[c[c[b>>2]>>2]&1023](b)}h=b+208|0;j=b+32|0;if(!((c[h>>2]|0)>>>0<(c[j>>2]|0)>>>0)){c[(c[b>>2]|0)+20>>2]=123;Ic[c[(c[b>>2]|0)+4>>2]&511](b,-1)}k=b+8|0;l=c[k>>2]|0;if((l|0)!=0){c[l+4>>2]=c[h>>2];c[(c[k>>2]|0)+8>>2]=c[j>>2];Rc[c[c[k>>2]>>2]&1023](b)}k=c[b+316>>2]|0;if((a[k+12>>0]|0)!=0){Rc[c[k+4>>2]&1023](b)}k=(c[j>>2]|0)-(c[h>>2]|0)|0;c[g>>2]=0;pd[c[(c[b+320>>2]|0)+4>>2]&127](b,d,g,k>>>0<e>>>0?k:e);e=c[g>>2]|0;c[h>>2]=(c[h>>2]|0)+e;i=f;return e|0}function O8(b){b=b|0;var d=0,e=0;d=i;e9(b,0);if((a[b+176>>0]|0)==0){Nha(b);Q9(b);L9(b,0)}Vha(b);do{if((a[b+177>>0]|0)==0){if((a[b+212>>0]|0)==0){_ha(b);break}else{w9(b);break}}else{c[(c[b>>2]|0)+20>>2]=1;Rc[c[c[b>>2]>>2]&1023](b)}}while(0);if((c[b+168>>2]|0)>1){e=1}else{e=(a[b+178>>0]|0)!=0&1}Hha(b,e);P8(b,0);S8(b);Rc[c[(c[b+4>>2]|0)+24>>2]&1023](b);Rc[c[c[b+332>>2]>>2]&1023](b);i=d;return}function P8(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=b+4|0;g=Qc[c[c[f>>2]>>2]&255](b,1,64)|0;c[b+320>>2]=g;c[g>>2]=320;if((a[b+176>>0]|0)!=0){i=e;return}if(!(d<<24>>24==0)){c[(c[b>>2]|0)+20>>2]=4;Rc[c[c[b>>2]>>2]&1023](b);i=e;return}d=b+60|0;if((c[d>>2]|0)<=0){i=e;return}h=g+24|0;g=0;j=c[b+68>>2]|0;while(1){c[h+(g<<2)>>2]=id[c[(c[f>>2]|0)+8>>2]&511](b,1,c[j+28>>2]<<3,c[j+12>>2]<<3)|0;g=g+1|0;if((g|0)>=(c[d>>2]|0)){break}else{j=j+84|0}}i=e;return}function Q8(b,d){b=b|0;d=d|0;var e=0,f=0;e=i;f=c[b+320>>2]|0;if((a[b+176>>0]|0)!=0){i=e;return}c[f+8>>2]=0;c[f+12>>2]=0;a[f+16>>0]=0;c[f+20>>2]=d;if((d|0)==0){c[f+4>>2]=47;i=e;return}else{c[(c[b>>2]|0)+20>>2]=4;Rc[c[c[b>>2]>>2]&1023](b);i=e;return}}function R8(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=i;h=c[b+320>>2]|0;j=h+8|0;k=b+224|0;if(!((c[j>>2]|0)>>>0<(c[k>>2]|0)>>>0)){i=g;return}l=h+12|0;m=b+324|0;n=h+24|0;o=b+328|0;p=h+16|0;h=c[l>>2]|0;while(1){if(h>>>0<8){ad[c[(c[m>>2]|0)+4>>2]&15](b,d,e,f,n,l,8);q=c[l>>2]|0}else{q=h}if((q|0)!=8){r=12;break}s=(dd[c[(c[o>>2]|0)+4>>2]&511](b,n)|0)<<24>>24==0;t=(a[p>>0]|0)!=0;if(s){r=7;break}if(t){c[e>>2]=(c[e>>2]|0)+1;a[p>>0]=0}c[l>>2]=0;s=(c[j>>2]|0)+1|0;c[j>>2]=s;if(s>>>0<(c[k>>2]|0)>>>0){h=0}else{r=12;break}}if((r|0)==7){if(t){i=g;return}c[e>>2]=(c[e>>2]|0)+ -1;a[p>>0]=1;i=g;return}else if((r|0)==12){i=g;return}}function S8(a){a=a|0;var b=0,d=0;b=i;d=Qc[c[c[a+4>>2]>>2]&255](a,1,32)|0;c[a+332>>2]=d;c[d>>2]=532;c[d+4>>2]=533;c[d+8>>2]=534;c[d+12>>2]=535;c[d+16>>2]=536;c[d+20>>2]=192;c[d+24>>2]=321;c[d+28>>2]=0;i=b;return}function T8(b){b=b|0;var f=0,g=0;f=i;g=c[b+332>>2]|0;$8(b,216);c[g+28>>2]=0;if((a[b+196>>0]|0)!=0){$8(b,224);a9(b,16);_8(b,74);_8(b,70);_8(b,73);_8(b,70);_8(b,0);_8(b,d[b+197>>0]|0);_8(b,d[b+198>>0]|0);_8(b,d[b+199>>0]|0);a9(b,e[b+200>>1]|0);a9(b,e[b+202>>1]|0);_8(b,0);_8(b,0)}if((a[b+204>>0]|0)==0){i=f;return}$8(b,238);a9(b,14);_8(b,65);_8(b,100);_8(b,111);_8(b,98);_8(b,101);a9(b,100);a9(b,0);a9(b,0);g=c[b+64>>2]|0;if((g|0)==3){_8(b,1);i=f;return}else if((g|0)==5){_8(b,2);i=f;return}else{_8(b,0);i=f;return}}function U8(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;e=b+68|0;f=b+60|0;g=c[f>>2]|0;if((g|0)>0){h=0;j=c[e>>2]|0;k=0;while(1){l=(b9(b,c[j+16>>2]|0)|0)+k|0;h=h+1|0;m=c[f>>2]|0;if((h|0)>=(m|0)){n=m;o=l;break}else{j=j+84|0;k=l}}}else{n=g;o=0}g=b+177|0;a:do{if((a[g>>0]|0)==0){k=b+212|0;b:do{if((a[k>>0]|0)==0){do{if((c[b+56>>2]|0)==8){if((n|0)>0){j=0;h=c[e>>2]|0;f=1;while(1){if((c[h+20>>2]|0)<=1?(c[h+24>>2]|0)<=1:0){p=f}else{p=0}j=j+1|0;if((j|0)>=(n|0)){q=p;break}else{h=h+84|0;f=p}}}else{q=1}if(!((o|0)==0|q<<24>>24==0)){c[(c[b>>2]|0)+20>>2]=75;Ic[c[(c[b>>2]|0)+4>>2]&511](b,0);if((a[g>>0]|0)!=0){break a}if((a[k>>0]|0)==0){break}else{break b}}else{r=q}if(!(r<<24>>24==0)){d9(b,192);i=d;return}}}while(0);d9(b,193);i=d;return}}while(0);d9(b,194);i=d;return}}while(0);d9(b,201);i=d;return}function V8(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;d=i;e=c[b+332>>2]|0;f=b+177|0;if((a[f>>0]|0)==0?(g=b+228|0,(c[g>>2]|0)>0):0){h=b+212|0;j=b+300|0;k=b+308|0;l=0;do{m=c[b+(l<<2)+232>>2]|0;do{if((a[h>>0]|0)!=0){if((c[j>>2]|0)!=0){c9(b,c[m+24>>2]|0,1);break}if((c[k>>2]|0)==0){c9(b,c[m+20>>2]|0,0)}}else{c9(b,c[m+20>>2]|0,0);c9(b,c[m+24>>2]|0,1)}}while(0);l=l+1|0}while((l|0)<(c[g>>2]|0))}g=b+188|0;l=e+28|0;if((c[g>>2]|0)!=(c[l>>2]|0)){$8(b,221);a9(b,4);a9(b,c[g>>2]|0);c[l>>2]=c[g>>2]}$8(b,218);g=b+228|0;a9(b,(c[g>>2]<<1)+6|0);_8(b,c[g>>2]|0);if((c[g>>2]|0)<=0){n=b+300|0;o=b+308|0;p=c[n>>2]|0;_8(b,p);q=b+304|0;r=c[q>>2]|0;_8(b,r);s=c[o>>2]|0;t=s<<4;u=b+312|0;v=c[u>>2]|0;w=t+v|0;_8(b,w);i=d;return}l=b+212|0;e=b+300|0;k=b+308|0;j=0;do{h=c[b+(j<<2)+232>>2]|0;_8(b,c[h>>2]|0);m=c[h+20>>2]|0;x=c[h+24>>2]|0;if((a[l>>0]|0)!=0){if((c[e>>2]|0)==0){if((c[k>>2]|0)==0){y=0;z=m}else{y=0;z=(a[f>>0]|0)==0?0:m}}else{y=x;z=0}}else{y=x;z=m}_8(b,(z<<4)+y|0);j=j+1|0}while((j|0)<(c[g>>2]|0));n=e;o=k;p=c[n>>2]|0;_8(b,p);q=b+304|0;r=c[q>>2]|0;_8(b,r);s=c[o>>2]|0;t=s<<4;u=b+312|0;v=c[u>>2]|0;w=t+v|0;_8(b,w);i=d;return}function W8(a){a=a|0;var b=0;b=i;$8(a,217);i=b;return}function X8(b){b=b|0;var d=0,e=0;d=i;$8(b,216);if((c[b+72>>2]|0)!=0){b9(b,0)|0}if((c[b+76>>2]|0)!=0){b9(b,1)|0}if((c[b+80>>2]|0)!=0){b9(b,2)|0}if((c[b+84>>2]|0)!=0){b9(b,3)|0}if((a[b+177>>0]|0)==0){e=0}else{$8(b,217);i=d;return}do{if((c[b+(e<<2)+88>>2]|0)!=0){c9(b,e,0)}if((c[b+(e<<2)+104>>2]|0)!=0){c9(b,e,1)}e=e+1|0}while((e|0)!=4);$8(b,217);i=d;return}function Y8(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;if(d>>>0>65533){c[(c[a>>2]|0)+20>>2]=11;Rc[c[c[a>>2]>>2]&1023](a)}$8(a,b);a9(a,d+2|0);i=e;return}function Z8(a,b){a=a|0;b=b|0;var c=0;c=i;_8(a,b);i=c;return}function _8(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=c[b+24>>2]|0;g=c[f>>2]|0;c[f>>2]=g+1;a[g>>0]=d;d=f+4|0;g=(c[d>>2]|0)+ -1|0;c[d>>2]=g;if((g|0)!=0){i=e;return}if(!((Lc[c[f+12>>2]&255](b)|0)<<24>>24==0)){i=e;return}c[(c[b>>2]|0)+20>>2]=24;Rc[c[c[b>>2]>>2]&1023](b);i=e;return}function $8(a,b){a=a|0;b=b|0;var c=0;c=i;_8(a,255);_8(a,b);i=c;return}function a9(a,b){a=a|0;b=b|0;var c=0;c=i;_8(a,b>>>8&255);_8(a,b&255);i=c;return}function b9(b,d){b=b|0;d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;g=c[b+(d<<2)+72>>2]|0;if((g|0)==0){c[(c[b>>2]|0)+20>>2]=52;c[(c[b>>2]|0)+24>>2]=d;Rc[c[c[b>>2]>>2]&1023](b);h=0;j=0}else{h=0;j=0}do{j=(e[g+(h<<1)>>1]|0)>255?1:j;h=h+1|0}while((h|0)!=64);h=g+128|0;if((a[h>>0]|0)!=0){i=f;return j|0}$8(b,219);k=(j|0)!=0;a9(b,k?131:67);_8(b,(j<<4)+d|0);d=0;do{l=e[g+(c[726928+(d<<2)>>2]<<1)>>1]|0;if(k){_8(b,l>>>8)}_8(b,l&255);d=d+1|0}while((d|0)!=64);a[h>>0]=1;i=f;return j|0}function c9(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;if(f<<24>>24==0){h=e;j=b+(e<<2)+88|0}else{h=e+16|0;j=b+(e<<2)+104|0}e=c[j>>2]|0;if((e|0)==0){c[(c[b>>2]|0)+20>>2]=50;c[(c[b>>2]|0)+24>>2]=h;Rc[c[c[b>>2]>>2]&1023](b)}j=e+273|0;if((a[j>>0]|0)!=0){i=g;return}$8(b,196);f=1;k=0;do{k=(d[e+f>>0]|0)+k|0;f=f+1|0}while((f|0)!=17);a9(b,k+19|0);_8(b,h);h=1;do{_8(b,d[e+h>>0]|0);h=h+1|0}while((h|0)!=17);if((k|0)>0){h=0;do{_8(b,d[e+h+17>>0]|0);h=h+1|0}while((h|0)!=(k|0))}a[j>>0]=1;i=g;return}function d9(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;$8(a,b);b=a+60|0;a9(a,((c[b>>2]|0)*3|0)+8|0);e=a+32|0;f=a+28|0;if(!((c[e>>2]|0)<=65535?(c[f>>2]|0)<=65535:0)){c[(c[a>>2]|0)+20>>2]=41;c[(c[a>>2]|0)+24>>2]=65535;Rc[c[c[a>>2]>>2]&1023](a)}_8(a,c[a+56>>2]|0);a9(a,c[e>>2]|0);a9(a,c[f>>2]|0);_8(a,c[b>>2]|0);if((c[b>>2]|0)<=0){i=d;return}f=0;e=c[a+68>>2]|0;while(1){_8(a,c[e>>2]|0);_8(a,(c[e+8>>2]<<4)+(c[e+12>>2]|0)|0);_8(a,c[e+16>>2]|0);f=f+1|0;if((f|0)>=(c[b>>2]|0)){break}else{e=e+84|0}}i=d;return}function e9(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;e=i;i=i+2576|0;f=e+2560|0;g=e;h=Qc[c[c[b+4>>2]>>2]&255](b,1,32)|0;c[b+316>>2]=h;c[h>>2]=537;c[h+4>>2]=538;c[h+8>>2]=539;a[h+13>>0]=0;j=b+32|0;k=c[j>>2]|0;l=b+28|0;if((((k|0)!=0?(c[l>>2]|0)!=0:0)?(c[b+60>>2]|0)>=1:0)?(c[b+36>>2]|0)>=1:0){m=k}else{c[(c[b>>2]|0)+20>>2]=32;Rc[c[c[b>>2]>>2]&1023](b);m=c[j>>2]|0}if(!((m|0)<=65500?(c[l>>2]|0)<=65500:0)){c[(c[b>>2]|0)+20>>2]=41;c[(c[b>>2]|0)+24>>2]=65500;Rc[c[c[b>>2]>>2]&1023](b)}m=b+56|0;if((c[m>>2]|0)!=8){c[(c[b>>2]|0)+20>>2]=15;c[(c[b>>2]|0)+24>>2]=c[m>>2];Rc[c[c[b>>2]>>2]&1023](b)}m=b+60|0;k=c[m>>2]|0;if((k|0)>10){c[(c[b>>2]|0)+20>>2]=26;c[(c[b>>2]|0)+24>>2]=c[m>>2];c[(c[b>>2]|0)+28>>2]=10;Rc[c[c[b>>2]>>2]&1023](b);n=c[m>>2]|0}else{n=k}k=b+216|0;c[k>>2]=1;o=b+220|0;c[o>>2]=1;p=b+68|0;if((n|0)>0){q=n;n=1;r=1;s=0;t=c[p>>2]|0;while(1){u=t+8|0;v=c[u>>2]|0;w=t+12|0;if(!((v+ -1|0)>>>0>3)?!(((c[w>>2]|0)+ -1|0)>>>0>3):0){x=r;y=v;z=n;A=q}else{c[(c[b>>2]|0)+20>>2]=18;Rc[c[c[b>>2]>>2]&1023](b);x=c[k>>2]|0;y=c[u>>2]|0;z=c[o>>2]|0;A=c[m>>2]|0}r=(x|0)>(y|0)?x:y;c[k>>2]=r;u=c[w>>2]|0;n=(z|0)>(u|0)?z:u;c[o>>2]=n;s=s+1|0;if((s|0)>=(A|0)){break}else{q=A;t=t+84|0}}if((A|0)>0){A=0;t=c[p>>2]|0;while(1){c[t+4>>2]=A;c[t+36>>2]=8;p=c[t+8>>2]|0;q=ca(p,c[l>>2]|0)|0;c[t+28>>2]=uba(q,c[k>>2]<<3)|0;q=c[t+12>>2]|0;s=ca(q,c[j>>2]|0)|0;c[t+32>>2]=uba(s,c[o>>2]<<3)|0;s=ca(p,c[l>>2]|0)|0;c[t+40>>2]=uba(s,c[k>>2]|0)|0;s=ca(q,c[j>>2]|0)|0;c[t+44>>2]=uba(s,c[o>>2]|0)|0;a[t+48>>0]=1;A=A+1|0;if((A|0)>=(c[m>>2]|0)){break}else{t=t+84|0}}B=c[o>>2]|0}else{B=n}}else{B=1}c[b+224>>2]=uba(c[j>>2]|0,B<<3)|0;B=b+172|0;j=c[B>>2]|0;do{if((j|0)!=0){n=b+168|0;if((c[n>>2]|0)<1){c[(c[b>>2]|0)+20>>2]=19;c[(c[b>>2]|0)+24>>2]=0;Rc[c[c[b>>2]>>2]&1023](b);C=c[B>>2]|0}else{C=j}if((c[C+20>>2]|0)==0?(c[C+24>>2]|0)==63:0){a[b+212>>0]=0;o=c[m>>2]|0;if((o|0)>0){f3a(f|0,0,((o|0)>1?o:1)|0)|0;D=o;E=0}else{D=o;E=0}}else{a[b+212>>0]=1;o=c[m>>2]|0;if((o|0)>0){f3a(g|0,-1,o<<8|0)|0;D=o;E=1}else{D=o;E=1}}if((c[n>>2]|0)<1){F=E;G=D}else{o=b+212|0;t=1;A=C;while(1){k=c[A>>2]|0;if((k+ -1|0)>>>0>3){c[(c[b>>2]|0)+20>>2]=26;c[(c[b>>2]|0)+24>>2]=k;c[(c[b>>2]|0)+28>>2]=4;Rc[c[c[b>>2]>>2]&1023](b)}l=(k|0)>0;if(l){s=0;do{q=c[A+(s<<2)+4>>2]|0;if(!((q|0)>=0?(q|0)<(c[m>>2]|0):0)){c[(c[b>>2]|0)+20>>2]=19;c[(c[b>>2]|0)+24>>2]=t;Rc[c[c[b>>2]>>2]&1023](b)}if((s|0)>0?(q|0)<=(c[A+(s+ -1<<2)+4>>2]|0):0){c[(c[b>>2]|0)+20>>2]=19;c[(c[b>>2]|0)+24>>2]=t;Rc[c[c[b>>2]>>2]&1023](b)}s=s+1|0}while((s|0)!=(k|0))}s=c[A+20>>2]|0;q=c[A+24>>2]|0;p=c[A+28>>2]|0;z=c[A+32>>2]|0;if((a[o>>0]|0)==0){if(!((s|0)==0&(q|0)==63&(p|0)==0&(z|0)==0)){c[(c[b>>2]|0)+20>>2]=17;c[(c[b>>2]|0)+24>>2]=t;Rc[c[c[b>>2]>>2]&1023](b)}if(l){r=0;do{y=f+(c[A+(r<<2)+4>>2]|0)|0;if((a[y>>0]|0)!=0){c[(c[b>>2]|0)+20>>2]=19;c[(c[b>>2]|0)+24>>2]=t;Rc[c[c[b>>2]>>2]&1023](b)}a[y>>0]=1;r=r+1|0}while((r|0)!=(k|0))}}else{if(!(!(s>>>0>63)?!((q|0)<(s|0)|(q|0)>63|p>>>0>10|z>>>0>10):0)){c[(c[b>>2]|0)+20>>2]=17;c[(c[b>>2]|0)+24>>2]=t;Rc[c[c[b>>2]>>2]&1023](b)}r=(s|0)==0;if(r){if((q|0)!=0){c[(c[b>>2]|0)+20>>2]=17;c[(c[b>>2]|0)+24>>2]=t;Rc[c[c[b>>2]>>2]&1023](b)}}else{if((k|0)!=1){c[(c[b>>2]|0)+20>>2]=17;c[(c[b>>2]|0)+24>>2]=t;Rc[c[c[b>>2]>>2]&1023](b)}}if(l){y=(p|0)==0;x=(z|0)==(p+ -1|0);u=0;do{w=c[A+(u<<2)+4>>2]|0;do{if(r){H=0}else{if((c[g+(w<<8)>>2]|0)>=0){H=s;break}c[(c[b>>2]|0)+20>>2]=17;c[(c[b>>2]|0)+24>>2]=t;Rc[c[c[b>>2]>>2]&1023](b);H=s}}while(0);if((H|0)<=(q|0)){v=H;while(1){I=g+(w<<8)+(v<<2)|0;J=c[I>>2]|0;do{if((J|0)<0){if(y){break}c[(c[b>>2]|0)+20>>2]=17;c[(c[b>>2]|0)+24>>2]=t;Rc[c[c[b>>2]>>2]&1023](b)}else{if((p|0)==(J|0)&x){break}c[(c[b>>2]|0)+20>>2]=17;c[(c[b>>2]|0)+24>>2]=t;Rc[c[c[b>>2]>>2]&1023](b)}}while(0);c[I>>2]=z;if((v|0)<(q|0)){v=v+1|0}else{break}}}u=u+1|0}while((u|0)!=(k|0))}}if((t|0)<(c[n>>2]|0)){t=t+1|0;A=A+36|0}else{break}}F=a[o>>0]|0;G=c[m>>2]|0}A=(G|0)>0;if(F<<24>>24==0){if(!A){break}t=G;n=0;while(1){if((a[f+n>>0]|0)==0){c[(c[b>>2]|0)+20>>2]=45;Rc[c[c[b>>2]>>2]&1023](b);K=c[m>>2]|0}else{K=t}n=n+1|0;if((n|0)>=(K|0)){break}else{t=K}}}else{if(!A){break}t=G;n=0;while(1){if((c[g+(n<<8)>>2]|0)<0){c[(c[b>>2]|0)+20>>2]=45;Rc[c[c[b>>2]>>2]&1023](b);L=c[m>>2]|0}else{L=t}n=n+1|0;if((n|0)>=(L|0)){break}else{t=L}}}}else{a[b+212>>0]=0;c[b+168>>2]=1}}while(0);if((a[b+212>>0]|0)!=0){a[b+178>>0]=1}do{if(!(d<<24>>24==0)){L=b+178|0;m=h+16|0;if((a[L>>0]|0)==0){c[m>>2]=2;M=L;break}else{c[m>>2]=1;M=L;break}}else{c[h+16>>2]=0;M=b+178|0}}while(0);c[h+28>>2]=0;c[h+20>>2]=0;d=c[b+168>>2]|0;if((a[M>>0]|0)==0){c[h+24>>2]=d;i=e;return}else{c[h+24>>2]=d<<1;i=e;return}}function f9(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=c[b+316>>2]|0;f=e+16|0;g=c[f>>2]|0;do{if((g|0)==1){i9(b);j9(b);if(((c[b+300>>2]|0)==0?(c[b+308>>2]|0)!=0:0)?(a[b+177>>0]|0)==0:0){c[f>>2]=2;h=e+20|0;c[h>>2]=(c[h>>2]|0)+1;j=12;break}Ic[c[c[b+348>>2]>>2]&511](b,1);Ic[c[c[b+328>>2]>>2]&511](b,2);a[e+12>>0]=0}else if((g|0)==0){i9(b);j9(b);if((a[b+176>>0]|0)==0){Rc[c[c[b+336>>2]>>2]&1023](b);Rc[c[c[b+340>>2]>>2]&1023](b);Ic[c[c[b+324>>2]>>2]&511](b,0)}Rc[c[c[b+344>>2]>>2]&1023](b);h=b+178|0;Ic[c[c[b+348>>2]>>2]&511](b,a[h>>0]|0);Ic[c[c[b+328>>2]>>2]&511](b,(c[e+24>>2]|0)>1?3:0);Ic[c[c[b+320>>2]>>2]&511](b,0);k=e+12|0;if((a[h>>0]|0)==0){a[k>>0]=1;break}else{a[k>>0]=0;break}}else if((g|0)==2){j=12}else{c[(c[b>>2]|0)+20>>2]=48;Rc[c[c[b>>2]>>2]&1023](b)}}while(0);if((j|0)==12){if((a[b+178>>0]|0)==0){i9(b);j9(b)}Ic[c[c[b+348>>2]>>2]&511](b,0);Ic[c[c[b+328>>2]>>2]&511](b,2);j=b+332|0;if((c[e+28>>2]|0)==0){Rc[c[(c[j>>2]|0)+4>>2]&1023](b)}Rc[c[(c[j>>2]|0)+8>>2]&1023](b);a[e+12>>0]=0}j=c[e+20>>2]|0;g=e+24|0;a[e+13>>0]=(j|0)==((c[g>>2]|0)+ -1|0)&1;e=b+8|0;b=c[e>>2]|0;if((b|0)==0){i=d;return}c[b+12>>2]=j;c[(c[e>>2]|0)+16>>2]=c[g>>2];i=d;return}function g9(b){b=b|0;var d=0,e=0;d=i;a[(c[b+316>>2]|0)+12>>0]=0;e=b+332|0;Rc[c[(c[e>>2]|0)+4>>2]&1023](b);Rc[c[(c[e>>2]|0)+8>>2]&1023](b);i=d;return}function h9(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=c[b+316>>2]|0;Rc[c[(c[b+348>>2]|0)+8>>2]&1023](b);f=e+16|0;g=c[f>>2]|0;if((g|0)==2){if((a[b+178>>0]|0)!=0){c[f>>2]=1}h=e+28|0;c[h>>2]=(c[h>>2]|0)+1}else if((g|0)==1){c[f>>2]=2}else if((g|0)==0?(c[f>>2]=2,(a[b+178>>0]|0)==0):0){b=e+28|0;c[b>>2]=(c[b>>2]|0)+1}b=e+20|0;c[b>>2]=(c[b>>2]|0)+1;i=d;return}function i9(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;d=c[a+172>>2]|0;if((d|0)!=0){e=c[(c[a+316>>2]|0)+28>>2]|0;f=d+(e*36|0)|0;c[a+228>>2]=c[f>>2];if((c[f>>2]|0)>0){g=a+68|0;h=0;do{c[a+(h<<2)+232>>2]=(c[g>>2]|0)+((c[d+(e*36|0)+(h<<2)+4>>2]|0)*84|0);h=h+1|0}while((h|0)<(c[f>>2]|0))}c[a+300>>2]=c[d+(e*36|0)+20>>2];c[a+304>>2]=c[d+(e*36|0)+24>>2];c[a+308>>2]=c[d+(e*36|0)+28>>2];c[a+312>>2]=c[d+(e*36|0)+32>>2];i=b;return}e=a+60|0;d=c[e>>2]|0;if((d|0)>4){c[(c[a>>2]|0)+20>>2]=26;c[(c[a>>2]|0)+24>>2]=c[e>>2];c[(c[a>>2]|0)+28>>2]=4;Rc[c[c[a>>2]>>2]&1023](a);j=c[e>>2]|0}else{j=d}c[a+228>>2]=j;if((j|0)>0){j=a+68|0;d=0;do{c[a+(d<<2)+232>>2]=(c[j>>2]|0)+(d*84|0);d=d+1|0}while((d|0)<(c[e>>2]|0))}c[a+300>>2]=0;c[a+304>>2]=63;c[a+308>>2]=0;c[a+312>>2]=0;i=b;return}function j9(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;d=a+228|0;e=c[d>>2]|0;if((e|0)!=1){if((e+ -1|0)>>>0>3){c[(c[a>>2]|0)+20>>2]=26;c[(c[a>>2]|0)+24>>2]=c[d>>2];c[(c[a>>2]|0)+28>>2]=4;Rc[c[c[a>>2]>>2]&1023](a);f=c[d>>2]|0}else{f=e}c[a+248>>2]=uba(c[a+28>>2]|0,c[a+216>>2]<<3)|0;c[a+252>>2]=uba(c[a+32>>2]|0,c[a+220>>2]<<3)|0;e=a+256|0;c[e>>2]=0;if((f|0)>0){f=0;do{g=c[a+(f<<2)+232>>2]|0;h=c[g+8>>2]|0;c[g+52>>2]=h;j=c[g+12>>2]|0;c[g+56>>2]=j;k=ca(h,j)|0;c[g+60>>2]=k;c[g+64>>2]=h<<3;l=((c[g+28>>2]|0)>>>0)%(h>>>0)|0;c[g+68>>2]=(l|0)==0?h:l;l=((c[g+32>>2]|0)>>>0)%(j>>>0)|0;c[g+72>>2]=(l|0)==0?j:l;if(((c[e>>2]|0)+k|0)>10){c[(c[a>>2]|0)+20>>2]=13;Rc[c[c[a>>2]>>2]&1023](a)}if((k|0)>0){l=k;do{l=l+ -1|0;k=c[e>>2]|0;c[e>>2]=k+1;c[a+(k<<2)+260>>2]=f}while((l|0)>0)}f=f+1|0}while((f|0)<(c[d>>2]|0))}}else{d=c[a+232>>2]|0;c[a+248>>2]=c[d+28>>2];f=d+32|0;c[a+252>>2]=c[f>>2];c[d+52>>2]=1;c[d+56>>2]=1;c[d+60>>2]=1;c[d+64>>2]=8;c[d+68>>2]=1;e=c[d+12>>2]|0;l=((c[f>>2]|0)>>>0)%(e>>>0)|0;c[d+72>>2]=(l|0)==0?e:l;c[a+256>>2]=1;c[a+260>>2]=0}l=c[a+192>>2]|0;if((l|0)<=0){i=b;return}e=ca(c[a+248>>2]|0,l)|0;c[a+188>>2]=(e|0)<65535?e:65535;i=b;return}function k9(b){b=b|0;var d=0,e=0;d=i;e=c[b+4>>2]|0;if((e|0)==0){i=d;return}Ic[c[e+36>>2]&511](b,1);e=b+20|0;if((a[b+16>>0]|0)==0){c[e>>2]=100;i=d;return}else{c[e>>2]=200;c[b+268>>2]=0;i=d;return}}function l9(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+4|0;e=c[d>>2]|0;if((e|0)!=0){Rc[c[e+40>>2]&1023](a)}c[d>>2]=0;c[a+20>>2]=0;i=b;return}function m9(b){b=b|0;var d=0,e=0;d=i;e=Qc[c[c[b+4>>2]>>2]&255](b,0,130)|0;a[e+128>>0]=0;i=d;return e|0}function n9(b){b=b|0;var d=0,e=0;d=i;e=Qc[c[c[b+4>>2]>>2]&255](b,0,274)|0;a[e+273>>0]=0;i=d;return e|0}function o9(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0;j=i;k=d+20|0;if((c[k>>2]|0)!=100){c[(c[d>>2]|0)+20>>2]=20;c[(c[d>>2]|0)+24>>2]=c[k>>2];Rc[c[c[d>>2]>>2]&1023](d)}if(e>>>0>3){c[(c[d>>2]|0)+20>>2]=31;c[(c[d>>2]|0)+24>>2]=e;Rc[c[c[d>>2]>>2]&1023](d)}k=d+(e<<2)+72|0;e=c[k>>2]|0;if((e|0)==0){l=m9(d)|0;c[k>>2]=l;m=l}else{m=e}e=h<<24>>24!=0;h=m;m=0;do{l=((ca(c[f+(m<<2)>>2]|0,g)|0)+50|0)/100|0;d=(l|0)<1?1:l;l=(d|0)>32767?32767:d;b[h+(m<<1)>>1]=e&(l|0)>255?255:l&65535;m=m+1|0;h=c[k>>2]|0}while((m|0)!=64);a[h+128>>0]=0;i=j;return}function p9(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;o9(a,0,725936,b,c);o9(a,1,726192,b,c);i=d;return}function q9(a){a=a|0;var b=0,c=0,d=0;b=i;c=(a|0)<1?1:a;a=(c|0)>100?100:c;if((a|0)<50){d=5e3/(a|0)|0;i=b;return d|0}else{d=200-(a<<1)|0;i=b;return d|0}return 0}function r9(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;p9(a,q9(b)|0,c);i=d;return}function s9(d){d=d|0;var e=0,f=0,g=0,h=0;e=i;f=d+20|0;if((c[f>>2]|0)!=100){c[(c[d>>2]|0)+20>>2]=20;c[(c[d>>2]|0)+24>>2]=c[f>>2];Rc[c[c[d>>2]>>2]&1023](d)}f=d+68|0;if((c[f>>2]|0)==0){c[f>>2]=Qc[c[c[d+4>>2]>>2]&255](d,0,840)|0}f=d+56|0;c[f>>2]=8;r9(d,75,1);v9(d,d+88|0,726448,726472);v9(d,d+104|0,726528,726552);v9(d,d+92|0,726488,726512);v9(d,d+108|0,726720,726744);g=0;do{a[d+g+120>>0]=0;a[d+g+136>>0]=1;a[d+g+152>>0]=5;g=g+1|0}while((g|0)!=16);g=d+168|0;h=d+178|0;c[g+0>>2]=0;c[g+4>>2]=0;b[g+8>>1]=0;a[g+10>>0]=0;a[h>>0]=(c[f>>2]|0)>8&1;f=d+197|0;h=d+179|0;g=h+17|0;do{a[h>>0]=0;h=h+1|0}while((h|0)<(g|0));a[f>>0]=1;a[d+198>>0]=1;a[d+199>>0]=0;b[d+200>>1]=1;b[d+202>>1]=1;t9(d);i=e;return}function t9(a){a=a|0;var b=0;b=i;switch(c[a+40>>2]|0){case 4:{u9(a,4);break};case 2:{u9(a,3);break};case 1:{u9(a,1);break};case 3:{u9(a,3);break};case 0:{u9(a,0);break};case 5:{u9(a,5);break};default:{c[(c[a>>2]|0)+20>>2]=9;Rc[c[c[a>>2]>>2]&1023](a)}}i=b;return}function u9(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=b+20|0;if((c[f>>2]|0)!=100){c[(c[b>>2]|0)+20>>2]=20;c[(c[b>>2]|0)+24>>2]=c[f>>2];Rc[c[c[b>>2]>>2]&1023](b)}c[b+64>>2]=d;f=b+196|0;a[f>>0]=0;g=b+204|0;a[g>>0]=0;switch(d|0){case 4:{a[g>>0]=1;c[b+60>>2]=4;d=b+68|0;h=c[d>>2]|0;c[h>>2]=67;c[h+8>>2]=1;c[h+12>>2]=1;c[h+16>>2]=0;c[h+20>>2]=0;c[h+24>>2]=0;h=c[d>>2]|0;c[h+84>>2]=77;c[h+92>>2]=1;c[h+96>>2]=1;c[h+100>>2]=0;c[h+104>>2]=0;c[h+108>>2]=0;h=c[d>>2]|0;c[h+168>>2]=89;c[h+176>>2]=1;c[h+180>>2]=1;c[h+184>>2]=0;c[h+188>>2]=0;c[h+192>>2]=0;h=c[d>>2]|0;c[h+252>>2]=75;c[h+260>>2]=1;c[h+264>>2]=1;c[h+268>>2]=0;c[h+272>>2]=0;c[h+276>>2]=0;i=e;return};case 5:{a[g>>0]=1;c[b+60>>2]=4;h=b+68|0;d=c[h>>2]|0;c[d>>2]=1;c[d+8>>2]=2;c[d+12>>2]=2;c[d+16>>2]=0;c[d+20>>2]=0;c[d+24>>2]=0;d=c[h>>2]|0;c[d+84>>2]=2;c[d+92>>2]=1;c[d+96>>2]=1;c[d+100>>2]=1;c[d+104>>2]=1;c[d+108>>2]=1;d=c[h>>2]|0;c[d+168>>2]=3;c[d+176>>2]=1;c[d+180>>2]=1;c[d+184>>2]=1;c[d+188>>2]=1;c[d+192>>2]=1;d=c[h>>2]|0;c[d+252>>2]=4;c[d+260>>2]=2;c[d+264>>2]=2;c[d+268>>2]=0;c[d+272>>2]=0;c[d+276>>2]=0;i=e;return};case 2:{a[g>>0]=1;c[b+60>>2]=3;g=b+68|0;d=c[g>>2]|0;c[d>>2]=82;c[d+8>>2]=1;c[d+12>>2]=1;c[d+16>>2]=0;c[d+20>>2]=0;c[d+24>>2]=0;d=c[g>>2]|0;c[d+84>>2]=71;c[d+92>>2]=1;c[d+96>>2]=1;c[d+100>>2]=0;c[d+104>>2]=0;c[d+108>>2]=0;d=c[g>>2]|0;c[d+168>>2]=66;c[d+176>>2]=1;c[d+180>>2]=1;c[d+184>>2]=0;c[d+188>>2]=0;c[d+192>>2]=0;i=e;return};case 0:{d=c[b+36>>2]|0;g=b+60|0;c[g>>2]=d;if((d+ -1|0)>>>0>9){c[(c[b>>2]|0)+20>>2]=26;c[(c[b>>2]|0)+24>>2]=c[g>>2];c[(c[b>>2]|0)+28>>2]=10;Rc[c[c[b>>2]>>2]&1023](b);j=c[g>>2]|0}else{j=d}if((j|0)<=0){i=e;return}j=b+68|0;d=0;do{h=c[j>>2]|0;c[h+(d*84|0)>>2]=d;c[h+(d*84|0)+8>>2]=1;c[h+(d*84|0)+12>>2]=1;c[h+(d*84|0)+16>>2]=0;c[h+(d*84|0)+20>>2]=0;c[h+(d*84|0)+24>>2]=0;d=d+1|0}while((d|0)<(c[g>>2]|0));i=e;return};case 1:{a[f>>0]=1;c[b+60>>2]=1;g=c[b+68>>2]|0;c[g>>2]=1;c[g+8>>2]=1;c[g+12>>2]=1;c[g+16>>2]=0;c[g+20>>2]=0;c[g+24>>2]=0;i=e;return};case 3:{a[f>>0]=1;c[b+60>>2]=3;f=b+68|0;g=c[f>>2]|0;c[g>>2]=1;c[g+8>>2]=2;c[g+12>>2]=2;c[g+16>>2]=0;c[g+20>>2]=0;c[g+24>>2]=0;g=c[f>>2]|0;c[g+84>>2]=2;c[g+92>>2]=1;c[g+96>>2]=1;c[g+100>>2]=1;c[g+104>>2]=1;c[g+108>>2]=1;g=c[f>>2]|0;c[g+168>>2]=3;c[g+176>>2]=1;c[g+180>>2]=1;c[g+184>>2]=1;c[g+188>>2]=1;c[g+192>>2]=1;i=e;return};default:{c[(c[b>>2]|0)+20>>2]=10;Rc[c[c[b>>2]>>2]&1023](b);i=e;return}}}function v9(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0;h=i;j=c[e>>2]|0;if((j|0)==0){k=n9(b)|0;c[e>>2]=k;l=k}else{l=j}j=l+0|0;l=f+0|0;k=j+17|0;do{a[j>>0]=a[l>>0]|0;j=j+1|0;l=l+1|0}while((j|0)<(k|0));l=1;j=0;do{j=(d[f+l>>0]|0)+j|0;l=l+1|0}while((l|0)!=17);if((j+ -1|0)>>>0>255){c[(c[b>>2]|0)+20>>2]=8;Rc[c[c[b>>2]>>2]&1023](b)}c3a((c[e>>2]|0)+17|0,g|0,j|0)|0;a[(c[e>>2]|0)+273>>0]=0;i=h;return}function w9(a){a=a|0;var b=0,d=0;b=i;d=Qc[c[c[a+4>>2]>>2]&255](a,1,108)|0;c[a+348>>2]=d;c[d>>2]=322;a=d+76|0;c[d+64>>2]=0;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;c[a+24>>2]=0;c[a+28>>2]=0;i=b;return}function x9(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;e=i;f=c[b+348>>2]|0;c[f+32>>2]=b;a[f+12>>0]=d;g=(c[b+300>>2]|0)==0;h=g&1;j=b+308|0;k=f+4|0;do{if((c[j>>2]|0)==0){if(g){c[k>>2]=257;break}else{c[k>>2]=258;break}}else{if(g){c[k>>2]=259;break}c[k>>2]=260;l=f+64|0;if((c[l>>2]|0)==0){c[l>>2]=Qc[c[c[b+4>>2]>>2]&255](b,1,1e3)|0}}}while(0);k=d<<24>>24!=0;c[f+8>>2]=k?541:540;d=b+228|0;if((c[d>>2]|0)<=0){m=f+56|0;c[m>>2]=0;n=f+60|0;c[n>>2]=0;o=f+24|0;c[o>>2]=0;p=f+28|0;c[p>>2]=0;q=b+188|0;r=c[q>>2]|0;s=f+68|0;t=r;c[s>>2]=t;u=f+72|0;c[u>>2]=0;i=e;return}l=f+36|0;v=f+92|0;w=b+4|0;x=f+76|0;y=f+52|0;z=0;do{A=c[b+(z<<2)+232>>2]|0;c[l+(z<<2)>>2]=0;if(g){if((c[j>>2]|0)==0){B=c[A+20>>2]|0;C=15}}else{D=c[A+24>>2]|0;c[y>>2]=D;B=D;C=15}do{if((C|0)==15){C=0;if(!k){Yha(b,h,B,x+(B<<2)|0);break}if(B>>>0>3){c[(c[b>>2]|0)+20>>2]=50;c[(c[b>>2]|0)+24>>2]=B;Rc[c[c[b>>2]>>2]&1023](b)}D=v+(B<<2)|0;A=c[D>>2]|0;if((A|0)==0){E=Qc[c[c[w>>2]>>2]&255](b,1,1028)|0;c[D>>2]=E;F=E}else{F=A}f3a(F|0,0,1028)|0}}while(0);z=z+1|0}while((z|0)<(c[d>>2]|0));m=f+56|0;c[m>>2]=0;n=f+60|0;c[n>>2]=0;o=f+24|0;c[o>>2]=0;p=f+28|0;c[p>>2]=0;q=b+188|0;r=c[q>>2]|0;s=f+68|0;t=r;c[s>>2]=t;u=f+72|0;c[u>>2]=0;i=e;return}function y9(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;e=i;f=c[a+348>>2]|0;g=c[a+312>>2]|0;h=a+24|0;j=f+16|0;c[j>>2]=c[c[h>>2]>>2];k=f+20|0;c[k>>2]=c[(c[h>>2]|0)+4>>2];l=a+188|0;if((c[l>>2]|0)!=0?(c[f+68>>2]|0)==0:0){K9(f,c[f+72>>2]|0)}m=a+256|0;if((c[m>>2]|0)>0){n=f+36|0;o=0;do{p=c[a+(o<<2)+260>>2]|0;q=c[a+(p<<2)+232>>2]|0;r=b[c[d+(o<<2)>>2]>>1]>>g;s=n+(p<<2)|0;p=r-(c[s>>2]|0)|0;c[s>>2]=r;if((p|0)<0){t=0-p|0;u=p+ -1|0}else{t=p;u=p}if((t|0)!=0){p=0;r=t;while(1){v=p+1|0;r=r>>1;if((r|0)==0){break}else{p=v}}if((p|0)>10){c[(c[a>>2]|0)+20>>2]=6;Rc[c[c[a>>2]>>2]&1023](a);w=v}else{w=v}}else{w=0}I9(f,c[q+20>>2]|0,w);if((w|0)!=0){G9(f,u,w)}o=o+1|0}while((o|0)<(c[m>>2]|0))}c[c[h>>2]>>2]=c[j>>2];c[(c[h>>2]|0)+4>>2]=c[k>>2];k=c[l>>2]|0;if((k|0)==0){i=e;return 1}l=f+68|0;h=c[l>>2]|0;if((h|0)==0){c[l>>2]=k;j=f+72|0;c[j>>2]=(c[j>>2]|0)+1&7;x=k}else{x=h}c[l>>2]=x+ -1;i=e;return 1}function z9(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;e=i;f=c[a+348>>2]|0;g=c[a+304>>2]|0;h=c[a+312>>2]|0;j=a+24|0;k=f+16|0;c[k>>2]=c[c[j>>2]>>2];l=f+20|0;c[l>>2]=c[(c[j>>2]|0)+4>>2];m=a+188|0;if((c[m>>2]|0)!=0?(c[f+68>>2]|0)==0:0){K9(f,c[f+72>>2]|0)}n=c[d>>2]|0;d=c[a+300>>2]|0;if((d|0)<=(g|0)){o=f+56|0;p=f+52|0;q=d;d=0;while(1){r=b[n+(c[726928+(q<<2)>>2]<<1)>>1]|0;s=r<<16>>16;do{if(r<<16>>16==0){t=d+1|0}else{if(r<<16>>16<0){u=0-s>>h;v=u;w=~u}else{u=s>>h;v=u;w=u}if((v|0)==0){t=d+1|0;break}if((c[o>>2]|0)!=0){E9(f)}if((d|0)>15){u=d;do{I9(f,c[p>>2]|0,240);u=u+ -16|0}while((u|0)>15);x=d&15}else{x=d}u=1;y=v;while(1){y=y>>1;if((y|0)==0){break}else{u=u+1|0}}if((u|0)>10){c[(c[a>>2]|0)+20>>2]=6;Rc[c[c[a>>2]>>2]&1023](a)}I9(f,c[p>>2]|0,u+(x<<4)|0);G9(f,w,u);t=0}}while(0);if((q|0)<(g|0)){q=q+1|0;d=t}else{break}}if((t|0)>0?(t=(c[o>>2]|0)+1|0,c[o>>2]=t,(t|0)==32767):0){E9(f)}}c[c[j>>2]>>2]=c[k>>2];c[(c[j>>2]|0)+4>>2]=c[l>>2];l=c[m>>2]|0;if((l|0)==0){i=e;return 1}m=f+68|0;j=c[m>>2]|0;if((j|0)==0){c[m>>2]=l;k=f+72|0;c[k>>2]=(c[k>>2]|0)+1&7;z=l}else{z=j}c[m>>2]=z+ -1;i=e;return 1}function A9(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;f=c[a+348>>2]|0;g=c[a+312>>2]|0;h=a+24|0;j=f+16|0;c[j>>2]=c[c[h>>2]>>2];k=f+20|0;c[k>>2]=c[(c[h>>2]|0)+4>>2];l=a+188|0;if((c[l>>2]|0)!=0?(c[f+68>>2]|0)==0:0){K9(f,c[f+72>>2]|0)}m=a+256|0;if((c[m>>2]|0)>0){a=0;do{G9(f,b[c[d+(a<<2)>>2]>>1]>>g,1);a=a+1|0}while((a|0)<(c[m>>2]|0))}c[c[h>>2]>>2]=c[j>>2];c[(c[h>>2]|0)+4>>2]=c[k>>2];k=c[l>>2]|0;if((k|0)==0){i=e;return 1}l=f+68|0;h=c[l>>2]|0;if((h|0)==0){c[l>>2]=k;j=f+72|0;c[j>>2]=(c[j>>2]|0)+1&7;n=k}else{n=h}c[l>>2]=n+ -1;i=e;return 1}function B9(d,f){d=d|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;g=i;i=i+256|0;h=g;j=c[d+348>>2]|0;k=c[d+304>>2]|0;l=c[d+312>>2]|0;m=d+24|0;n=j+16|0;c[n>>2]=c[c[m>>2]>>2];o=j+20|0;c[o>>2]=c[(c[m>>2]|0)+4>>2];p=d+188|0;if((c[p>>2]|0)!=0?(c[j+68>>2]|0)==0:0){K9(j,c[j+72>>2]|0)}q=c[f>>2]|0;f=c[d+300>>2]|0;if((f|0)>(k|0)){d=j+60|0;r=d;s=d;t=0;u=0}else{d=0;v=f;while(1){w=b[q+(c[726928+(v<<2)>>2]<<1)>>1]|0;x=w<<16>>16;y=(w<<16>>16<0?0-x|0:x)>>l;c[h+(v<<2)>>2]=y;d=(y|0)==1?v:d;if((v|0)>=(k|0)){break}else{v=v+1|0}}v=j+64|0;l=j+60|0;y=j+52|0;x=0;w=(c[v>>2]|0)+(c[l>>2]|0)|0;z=f;f=0;while(1){A=c[h+(z<<2)>>2]|0;do{if((A|0)!=0){if((f|0)<16|(z|0)>(d|0)){B=x;C=w;D=f}else{E=x;F=w;G=f;while(1){E9(j);I9(j,c[y>>2]|0,240);H=G+ -16|0;J9(j,F,E);I=c[v>>2]|0;if((H|0)<16){B=0;C=I;D=H;break}else{E=0;F=I;G=H}}}if((A|0)>1){a[C+B>>0]=A&1;J=B+1|0;K=C;L=D;break}else{E9(j);I9(j,c[y>>2]|0,D<<4|1);G9(j,(e[q+(c[726928+(z<<2)>>2]<<1)>>1]|0)>>>15&65535^1,1);J9(j,C,B);J=0;K=c[v>>2]|0;L=0;break}}else{J=x;K=w;L=f+1|0}}while(0);if((z|0)<(k|0)){x=J;w=K;z=z+1|0;f=L}else{r=l;s=l;t=J;u=L;break}}}if(!((u|0)<1&(t|0)==0)?(u=j+56|0,L=(c[u>>2]|0)+1|0,c[u>>2]=L,u=(c[r>>2]|0)+t|0,c[s>>2]=u,(L|0)==32767|u>>>0>937):0){E9(j)}c[c[m>>2]>>2]=c[n>>2];c[(c[m>>2]|0)+4>>2]=c[o>>2];o=c[p>>2]|0;if((o|0)==0){i=g;return 1}p=j+68|0;m=c[p>>2]|0;if((m|0)==0){c[p>>2]=o;n=j+72|0;c[n>>2]=(c[n>>2]|0)+1&7;M=o}else{M=m}c[p>>2]=M+ -1;i=g;return 1}function C9(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=i;i=i+16|0;e=d;f=c[b+348>>2]|0;E9(f);g=(c[b+300>>2]|0)==0;c[e>>2]=0;h=b+228|0;j=c[h>>2]|0;if((j|0)<=0){i=d;return}k=b+308|0;l=f+92|0;f=j;j=0;while(1){m=c[b+(j<<2)+232>>2]|0;if(g){if((c[k>>2]|0)==0){n=m+20|0;o=7}else{p=f}}else{n=m+24|0;o=7}if((o|0)==7){o=0;m=c[n>>2]|0;q=e+m|0;if((a[q>>0]|0)==0){if(g){r=b+(m<<2)+88|0}else{r=b+(m<<2)+104|0}s=c[r>>2]|0;if((s|0)==0){t=n9(b)|0;c[r>>2]=t;u=t}else{u=s}Zha(b,u,c[l+(m<<2)>>2]|0);a[q>>0]=1;p=c[h>>2]|0}else{p=f}}j=j+1|0;if((j|0)>=(p|0)){break}else{f=p}}i=d;return}function D9(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a+348>>2]|0;e=a+24|0;a=d+16|0;c[a>>2]=c[c[e>>2]>>2];f=d+20|0;c[f>>2]=c[(c[e>>2]|0)+4>>2];E9(d);F9(d);c[c[e>>2]>>2]=c[a>>2];c[(c[e>>2]|0)+4>>2]=c[f>>2];i=b;return}function E9(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+56|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}else{f=0;g=e}while(1){g=g>>1;if((g|0)==0){break}else{f=f+1|0}}if((f|0)>14){g=a+32|0;c[(c[c[g>>2]>>2]|0)+20>>2]=40;e=c[g>>2]|0;Rc[c[c[e>>2]>>2]&1023](e)}I9(a,c[a+52>>2]|0,f<<4);if((f|0)!=0){G9(a,c[d>>2]|0,f)}c[d>>2]=0;d=a+60|0;J9(a,c[a+64>>2]|0,c[d>>2]|0);c[d>>2]=0;i=b;return}function F9(a){a=a|0;var b=0;b=i;G9(a,127,7);c[a+24>>2]=0;c[a+28>>2]=0;i=b;return}function G9(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=i;g=b+28|0;h=c[g>>2]|0;if((e|0)==0){j=b+32|0;c[(c[c[j>>2]>>2]|0)+20>>2]=40;k=c[j>>2]|0;Rc[c[c[k>>2]>>2]&1023](k)}if((a[b+12>>0]|0)!=0){i=f;return}k=h+e|0;j=b+24|0;l=c[j>>2]|((1<<e)+ -1&d)<<24-k;if((k|0)>7){d=b+16|0;m=b+20|0;n=7-h-e|0;e=k+((n|0)>-8?n:-8)&-8;n=k;h=l;do{o=h>>>16;p=c[d>>2]|0;c[d>>2]=p+1;a[p>>0]=o;p=(c[m>>2]|0)+ -1|0;c[m>>2]=p;if((p|0)==0){H9(b)}if((o&255|0)==255?(o=c[d>>2]|0,c[d>>2]=o+1,a[o>>0]=0,o=(c[m>>2]|0)+ -1|0,c[m>>2]=o,(o|0)==0):0){H9(b)}h=h<<8;n=n+ -8|0}while((n|0)>7);q=k+ -8-e|0;r=h}else{q=k;r=l}c[j>>2]=r;c[g>>2]=q;i=f;return}function H9(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+32|0;e=c[d>>2]|0;f=c[e+24>>2]|0;if((Lc[c[f+12>>2]&255](e)|0)<<24>>24==0){c[(c[c[d>>2]>>2]|0)+20>>2]=24;e=c[d>>2]|0;Rc[c[c[e>>2]>>2]&1023](e)}c[a+16>>2]=c[f>>2];c[a+20>>2]=c[f+4>>2];i=b;return}function I9(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;if((a[b+12>>0]|0)==0){g=c[b+(d<<2)+76>>2]|0;G9(b,c[g+(e<<2)>>2]|0,a[g+e+1024>>0]|0);i=f;return}else{g=(c[b+(d<<2)+92>>2]|0)+(e<<2)|0;c[g>>2]=(c[g>>2]|0)+1;i=f;return}}function J9(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=i;if((a[b+12>>0]|0)!=0|(d|0)==0){i=e;return}else{f=c;g=d}while(1){G9(b,a[f>>0]|0,1);g=g+ -1|0;if((g|0)==0){break}else{f=f+1|0}}i=e;return}function K9(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;E9(b);if((a[b+12>>0]|0)==0){F9(b);f=b+16|0;g=c[f>>2]|0;c[f>>2]=g+1;a[g>>0]=-1;g=b+20|0;h=(c[g>>2]|0)+ -1|0;c[g>>2]=h;if((h|0)==0){H9(b)}h=c[f>>2]|0;c[f>>2]=h+1;a[h>>0]=d+208;d=(c[g>>2]|0)+ -1|0;c[g>>2]=d;if((d|0)==0){H9(b)}}d=b+32|0;g=c[d>>2]|0;if((c[g+300>>2]|0)!=0){c[b+56>>2]=0;c[b+60>>2]=0;i=e;return}if((c[g+228>>2]|0)>0){j=0}else{i=e;return}do{c[b+(j<<2)+36>>2]=0;j=j+1|0}while((j|0)<(c[(c[d>>2]|0)+228>>2]|0));i=e;return}function L9(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;e=i;if(d<<24>>24==0){f=b}else{c[(c[b>>2]|0)+20>>2]=4;Rc[c[c[b>>2]>>2]&1023](b);f=b}d=b+4|0;g=Qc[c[c[d>>2]>>2]&255](f,1,64)|0;h=b+324|0;c[h>>2]=g;c[g>>2]=323;j=g+4|0;if((a[(c[b+340>>2]|0)+8>>0]|0)==0){c[j>>2]=10;k=b+60|0;if((c[k>>2]|0)<=0){i=e;return}l=b+216|0;m=b+220|0;n=g+8|0;g=0;o=c[b+68>>2]|0;while(1){p=ca(c[o+28>>2]<<3,c[l>>2]|0)|0;c[n+(g<<2)>>2]=id[c[(c[d>>2]|0)+8>>2]&511](f,1,(p|0)/(c[o+8>>2]|0)|0,c[m>>2]|0)|0;g=g+1|0;if((g|0)>=(c[k>>2]|0)){break}else{o=o+84|0}}i=e;return}c[j>>2]=9;j=c[h>>2]|0;h=c[b+220>>2]|0;o=b+60|0;k=ca(h*20|0,c[o>>2]|0)|0;g=Qc[c[c[d>>2]>>2]&255](f,1,k)|0;if((c[o>>2]|0)<=0){i=e;return}k=b+216|0;m=h*3|0;n=h*12|0;l=(h|0)>0;p=j+8|0;j=h*5|0;q=h<<1;r=h<<2;s=0;t=c[b+68>>2]|0;b=g;while(1){g=ca(c[t+28>>2]<<3,c[k>>2]|0)|0;u=id[c[(c[d>>2]|0)+8>>2]&511](f,1,(g|0)/(c[t+8>>2]|0)|0,m)|0;g=b+(h<<2)|0;c3a(g|0,u|0,n|0)|0;if(l){v=0;do{c[b+(v<<2)>>2]=c[u+(v+q<<2)>>2];c[b+(v+r<<2)>>2]=c[u+(v<<2)>>2];v=v+1|0}while((v|0)!=(h|0))}c[p+(s<<2)>>2]=g;s=s+1|0;if((s|0)>=(c[o>>2]|0)){break}else{t=t+84|0;b=b+(j<<2)|0}}i=e;return}function M9(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[a+324>>2]|0;if((b|0)!=0){c[(c[a>>2]|0)+20>>2]=4;Rc[c[c[a>>2]>>2]&1023](a)}c[e+48>>2]=c[a+32>>2];c[e+52>>2]=0;c[e+56>>2]=0;c[e+60>>2]=c[a+220>>2]<<1;i=d;return}function N9(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;j=i;k=c[a+324>>2]|0;l=a+220|0;m=(c[l>>2]|0)*3|0;n=k+48|0;if(!((c[g>>2]|0)>>>0<h>>>0)){i=j;return}o=k+60|0;p=k+52|0;q=a+336|0;r=k+8|0;s=a+32|0;t=a+60|0;u=a+28|0;v=a+340|0;w=k+56|0;while(1){k=c[d>>2]|0;if(!(k>>>0<e>>>0)){if((c[n>>2]|0)!=0){x=25;break}y=c[p>>2]|0;z=c[o>>2]|0;if((y|0)<(z|0)){if((c[t>>2]|0)>0){A=y;B=z;C=0;while(1){P9(c[r+(C<<2)>>2]|0,c[u>>2]|0,A,B);D=C+1|0;if((D|0)>=(c[t>>2]|0)){break}A=c[p>>2]|0;B=c[o>>2]|0;C=D}E=c[o>>2]|0}else{E=z}c[p>>2]=E;x=21}else{F=y;G=z;x=20}}else{C=e-k|0;B=c[p>>2]|0;A=(c[o>>2]|0)-B|0;D=A>>>0<C>>>0?A:C;Fc[c[(c[q>>2]|0)+4>>2]&63](a,b+(k<<2)|0,r,B,D);if((c[n>>2]|0)==(c[s>>2]|0)?(B=c[t>>2]|0,(B|0)>0):0){C=c[l>>2]|0;A=B;B=0;while(1){if((C|0)<1){H=A;I=C}else{J=r+(B<<2)|0;K=1;while(1){L=c[J>>2]|0;wba(L,0,L,0-K|0,1,c[u>>2]|0);M=c[l>>2]|0;if((K|0)<(M|0)){K=K+1|0}else{break}}H=c[t>>2]|0;I=M}B=B+1|0;if((B|0)>=(H|0)){break}else{C=I;A=H}}}c[d>>2]=(c[d>>2]|0)+D;A=(c[p>>2]|0)+D|0;c[p>>2]=A;c[n>>2]=(c[n>>2]|0)-D;F=A;G=c[o>>2]|0;x=20}if((x|0)==20?(x=0,(F|0)==(G|0)):0){x=21}if((x|0)==21){x=0;Fc[c[(c[v>>2]|0)+4>>2]&63](a,r,c[w>>2]|0,f,c[g>>2]|0);c[g>>2]=(c[g>>2]|0)+1;A=(c[w>>2]|0)+(c[l>>2]|0)|0;c[w>>2]=(A|0)<(m|0)?A:0;A=c[p>>2]|0;if((A|0)<(m|0)){N=A}else{c[p>>2]=0;N=0}c[o>>2]=(c[l>>2]|0)+N}if(!((c[g>>2]|0)>>>0<h>>>0)){x=25;break}}if((x|0)==25){i=j;return}}function O9(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;j=i;k=c[a+324>>2]|0;l=c[d>>2]|0;if(!(l>>>0<e>>>0)){i=j;return}m=a+220|0;n=k+52|0;o=a+336|0;p=k+8|0;q=k+48|0;k=a+60|0;r=a+28|0;s=a+340|0;t=l;while(1){if(!((c[g>>2]|0)>>>0<h>>>0)){u=21;break}l=e-t|0;v=c[n>>2]|0;w=(c[m>>2]|0)-v|0;x=w>>>0<l>>>0?w:l;Fc[c[(c[o>>2]|0)+4>>2]&63](a,b+(t<<2)|0,p,v,x);c[d>>2]=(c[d>>2]|0)+x;v=(c[n>>2]|0)+x|0;c[n>>2]=v;l=c[q>>2]|0;c[q>>2]=l-x;if((l|0)==(x|0)?(x=c[m>>2]|0,(v|0)<(x|0)):0){if((c[k>>2]|0)>0){l=v;w=x;y=0;while(1){P9(c[p+(y<<2)>>2]|0,c[r>>2]|0,l,w);z=y+1|0;if((z|0)>=(c[k>>2]|0)){break}l=c[n>>2]|0;w=c[m>>2]|0;y=z}A=c[m>>2]|0}else{A=x}c[n>>2]=A;B=A}else{B=v}if((B|0)==(c[m>>2]|0)){Fc[c[(c[s>>2]|0)+4>>2]&63](a,p,0,f,c[g>>2]|0);c[n>>2]=0;c[g>>2]=(c[g>>2]|0)+1}if((c[q>>2]|0)==0?(C=c[g>>2]|0,C>>>0<h>>>0):0){u=16;break}t=c[d>>2]|0;if(!(t>>>0<e>>>0)){u=21;break}}if((u|0)==16){a:do{if((c[k>>2]|0)>0){e=C;t=0;d=c[a+68>>2]|0;while(1){q=c[d+12>>2]|0;P9(c[f+(t<<2)>>2]|0,c[d+28>>2]<<3,ca(q,e)|0,ca(q,h)|0);q=t+1|0;if((q|0)>=(c[k>>2]|0)){break a}e=c[g>>2]|0;t=q;d=d+84|0}}}while(0);c[g>>2]=h;i=j;return}else if((u|0)==21){i=j;return}}function P9(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=i;if((c|0)>=(d|0)){i=e;return}f=c+ -1|0;g=c;do{wba(a,f,a,g,1,b);g=g+1|0}while((g|0)!=(d|0));i=e;return}function Q9(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=i;e=Qc[c[c[b+4>>2]>>2]&255](b,1,52)|0;c[b+340>>2]=e;c[e>>2]=542;c[e+4>>2]=29;f=e+8|0;a[f>>0]=0;if((a[b+179>>0]|0)!=0){c[(c[b>>2]|0)+20>>2]=25;Rc[c[c[b>>2]>>2]&1023](b)}g=b+60|0;if((c[g>>2]|0)<=0){i=d;return}h=b+216|0;j=b+220|0;k=b+180|0;l=e+12|0;e=0;m=c[b+68>>2]|0;n=1;while(1){o=c[m+8>>2]|0;p=c[h>>2]|0;do{if((o|0)==(p|0)?(c[m+12>>2]|0)==(c[j>>2]|0):0){q=l+(e<<2)|0;if((c[k>>2]|0)==0){c[q>>2]=49;r=n;break}else{c[q>>2]=48;a[f>>0]=1;r=n;break}}else{s=10}}while(0);do{if((s|0)==10){s=0;if((o<<1|0)==(p|0)){q=c[m+12>>2]|0;t=c[j>>2]|0;if((q|0)==(t|0)){c[l+(e<<2)>>2]=50;r=0;break}if((q<<1|0)==(t|0)){t=l+(e<<2)|0;if((c[k>>2]|0)==0){c[t>>2]=52;r=n;break}else{c[t>>2]=51;a[f>>0]=1;r=n;break}}}if(((p|0)%(o|0)|0|0)==0?((c[j>>2]|0)%(c[m+12>>2]|0)|0|0)==0:0){c[l+(e<<2)>>2]=53;r=0;break}c[(c[b>>2]|0)+20>>2]=38;Rc[c[c[b>>2]>>2]&1023](b);r=n}}while(0);e=e+1|0;if((e|0)>=(c[g>>2]|0)){break}else{m=m+84|0;n=r}}if(!((c[k>>2]|0)!=0&r<<24>>24==0)){i=d;return}c[(c[b>>2]|0)+20>>2]=99;Ic[c[(c[b>>2]|0)+4>>2]&511](b,0);i=d;return}function R9(a){a=a|0;return}function S9(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;h=a+60|0;if((c[h>>2]|0)<=0){i=g;return}j=(c[a+340>>2]|0)+12|0;k=0;l=c[a+68>>2]|0;while(1){m=(c[e+(k<<2)>>2]|0)+((ca(c[l+12>>2]|0,f)|0)<<2)|0;pd[c[j+(k<<2)>>2]&127](a,l,(c[b+(k<<2)>>2]|0)+(d<<2)|0,m);k=k+1|0;if((k|0)>=(c[h>>2]|0)){break}else{l=l+84|0}}i=g;return}function T9(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;h=i;j=c[e+28>>2]<<3;Z9(f+ -4|0,(c[b+220>>2]|0)+2|0,c[b+28>>2]|0,j);k=c[b+180>>2]|0;b=65536-(k<<9)|0;l=k<<6;k=e+12|0;if((c[k>>2]|0)<=0){i=h;return}e=j+ -2|0;m=j+ -1|0;j=0;do{n=c[g+(j<<2)>>2]|0;o=c[f+(j<<2)>>2]|0;p=c[f+(j+ -1<<2)>>2]|0;j=j+1|0;q=c[f+(j<<2)>>2]|0;r=p+1|0;s=q+1|0;t=(d[q>>0]|0)+(d[p>>0]|0)|0;p=d[o>>0]|0;q=t+p|0;u=o+1|0;v=(d[s>>0]|0)+(d[r>>0]|0)+(d[u>>0]|0)|0;a[n>>0]=((ca(p,b)|0)+32768+(ca(q+t+v|0,l)|0)|0)>>>16;t=n+m|0;p=n;n=r;r=s;s=e;w=v;v=u;u=q;while(1){p=p+1|0;q=d[v>>0]|0;v=v+1|0;n=n+1|0;r=r+1|0;x=(d[r>>0]|0)+(d[n>>0]|0)+(d[v>>0]|0)|0;a[p>>0]=((ca(q,b)|0)+32768+(ca(u+w-q+x|0,l)|0)|0)>>>16;s=s+ -1|0;if((s|0)==0){break}else{q=w;w=x;u=q}}u=d[o+m>>0]|0;a[t>>0]=((ca(u,b)|0)+32768+(ca(w-u+(x<<1)|0,l)|0)|0)>>>16}while((j|0)<(c[k>>2]|0));i=h;return}function U9(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;g=a+220|0;h=a+28|0;wba(d,0,e,0,c[g>>2]|0,c[h>>2]|0);Z9(e,c[g>>2]|0,c[h>>2]|0,c[b+28>>2]<<3);i=f;return}function V9(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=i;j=c[e+28>>2]|0;Z9(f,c[b+220>>2]|0,c[b+28>>2]|0,j<<4);b=e+12|0;e=c[b>>2]|0;if((e|0)<=0){i=h;return}k=(j&536870911|0)==0;l=j<<3;j=e;e=0;while(1){if(k){m=j}else{n=0;o=c[f+(e<<2)>>2]|0;p=0;q=c[g+(e<<2)>>2]|0;while(1){a[q>>0]=((d[o>>0]|0)+n+(d[o+1>>0]|0)|0)>>>1;p=p+1|0;if((p|0)==(l|0)){break}else{n=n^1;o=o+2|0;q=q+1|0}}m=c[b>>2]|0}e=e+1|0;if((e|0)>=(m|0)){break}else{j=m}}i=h;return}function W9(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;h=i;j=c[e+28>>2]|0;k=j<<4;Z9(f+ -4|0,(c[b+220>>2]|0)+2|0,c[b+28>>2]|0,k);l=c[b+180>>2]|0;b=(ca(l,-80)|0)+16384|0;m=l<<4;l=e+12|0;if((c[l>>2]|0)<=0){i=h;return}e=j<<3;j=e+ -2|0;n=e+ -1|0;e=k+ -3|0;k=0;o=0;do{p=c[g+(o<<2)>>2]|0;q=c[f+(k<<2)>>2]|0;r=c[f+((k|1)<<2)>>2]|0;s=c[f+(k+ -1<<2)>>2]|0;k=k+2|0;t=c[f+(k<<2)>>2]|0;u=d[q>>0]|0;v=d[r>>0]|0;w=d[s>>0]|0;x=d[t>>0]|0;y=q+2|0;z=r+2|0;A=s+2|0;B=t+2|0;a[p>>0]=((ca((d[q+1>>0]|0)+u+v+(d[r+1>>0]|0)|0,b)|0)+32768+(ca(x+w+(d[A>>0]|0)+(d[B>>0]|0)+(v+u+w+(d[s+1>>0]|0)+x+(d[t+1>>0]|0)+(d[y>>0]|0)+(d[z>>0]|0)<<1)|0,m)|0)|0)>>>16;x=p+n|0;w=p;p=A;A=B;B=j;u=y;y=z;while(1){z=w+1|0;C=d[u+1>>0]|0;D=d[y+1>>0]|0;E=C+(d[u>>0]|0)+(d[y>>0]|0)+D|0;F=d[p+1>>0]|0;G=d[A+1>>0]|0;H=F+(d[p>>0]|0)+(d[A>>0]|0)+G+(d[u+ -1>>0]|0)|0;if((B|0)==0){break}v=u+2|0;q=y+2|0;I=p+2|0;J=A+2|0;a[z>>0]=((ca(E,b)|0)+32768+(ca((d[I>>0]|0)+(d[p+ -1>>0]|0)+((d[v>>0]|0)+H+(d[y+ -1>>0]|0)+(d[q>>0]|0)<<1)+(d[A+ -1>>0]|0)+(d[J>>0]|0)|0,m)|0)|0)>>>16;w=z;p=I;A=J;B=B+ -1|0;u=v;y=q}a[x>>0]=((ca(E,b)|0)+32768+(ca(G+F+(d[s+e>>0]|0)+(d[t+e>>0]|0)+(D+C+H+(d[r+e>>0]|0)<<1)|0,m)|0)|0)>>>16;o=o+1|0}while((o|0)<(c[l>>2]|0));i=h;return}function X9(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;h=i;j=c[e+28>>2]|0;Z9(f,c[b+220>>2]|0,c[b+28>>2]|0,j<<4);b=e+12|0;e=c[b>>2]|0;if((e|0)<=0){i=h;return}k=(j&536870911|0)==0;l=j<<3;j=e;e=0;m=0;while(1){if(k){n=j}else{o=1;p=c[f+(e<<2)>>2]|0;q=c[f+((e|1)<<2)>>2]|0;r=0;s=c[g+(m<<2)>>2]|0;while(1){a[s>>0]=((d[p>>0]|0)+o+(d[p+1>>0]|0)+(d[q>>0]|0)+(d[q+1>>0]|0)|0)>>>2;r=r+1|0;if((r|0)==(l|0)){break}else{o=o^3;p=p+2|0;q=q+2|0;s=s+1|0}}n=c[b>>2]|0}m=m+1|0;if((m|0)>=(n|0)){break}else{j=n;e=e+2|0}}i=h;return}function Y9(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;h=i;j=c[e+28>>2]<<3;k=(c[b+216>>2]|0)/(c[e+8>>2]|0)|0;l=c[b+220>>2]|0;m=e+12|0;e=(l|0)/(c[m>>2]|0)|0;n=ca(e,k)|0;o=(n|0)/2|0;Z9(f,l,c[b+28>>2]|0,ca(k,j)|0);b=c[m>>2]|0;if((b|0)<=0){i=h;return}l=(j|0)==0;p=(e|0)>0;q=(k|0)>0;r=b;b=0;s=0;while(1){if(l){t=r}else{u=0;v=0;w=c[g+(s<<2)>>2]|0;while(1){if(p){x=0;y=0;while(1){if(q){z=0;A=(c[f+(y+b<<2)>>2]|0)+v|0;B=x;while(1){C=(d[A>>0]|0)+B|0;z=z+1|0;if((z|0)==(k|0)){D=C;break}else{A=A+1|0;B=C}}}else{D=x}y=y+1|0;if((y|0)==(e|0)){E=D;break}else{x=D}}}else{E=0}a[w>>0]=(E+o|0)/(n|0)|0;u=u+1|0;if((u|0)==(j|0)){break}else{v=v+k|0;w=w+1|0}}t=c[m>>2]|0}s=s+1|0;if((s|0)>=(t|0)){break}else{r=t;b=b+e|0}}i=h;return}function Z9(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;h=f-e|0;if(!((h|0)>0&(d|0)>0)){i=g;return}f=e+ -1|0;j=0;do{k=c[b+(j<<2)>>2]|0;f3a(k+e|0,a[k+f>>0]|0,h|0)|0;j=j+1|0}while((j|0)!=(d|0));i=g;return}function _9(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;c[b+4>>2]=0;e=c[b>>2]|0;f=b+12|0;g=c[f>>2]|0;f3a(b|0,0,432)|0;c[b>>2]=e;c[f>>2]=g;a[b+16>>0]=1;$aa(b);c[b+8>>2]=0;c[b+24>>2]=0;c[b+268>>2]=0;g=b+144|0;f=g+48|0;do{c[g>>2]=0;g=g+4|0}while((g|0)<(f|0));laa(b);faa(b);c[b+20>>2]=200;i=d;return}function $9(a){a=a|0;var b=0;b=i;l9(a);i=b;return}function aaa(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+20|0;if(!(((c[d>>2]|0)+ -200|0)>>>0<2)){c[(c[a>>2]|0)+20>>2]=20;c[(c[a>>2]|0)+24>>2]=c[d>>2];Rc[c[c[a>>2]>>2]&1023](a)}d=baa(a)|0;if((d|0)==2){c[(c[a>>2]|0)+20>>2]=51;Rc[c[c[a>>2]>>2]&1023](a);k9(a);e=2;i=b;return e|0}else if((d|0)==1){e=1;i=b;return e|0}else{e=d;i=b;return e|0}return 0}function baa(b){b=b|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0;e=i;f=b+20|0;switch(c[f>>2]|0){case 201:{g=b+400|0;break};case 210:case 208:case 207:case 206:case 205:case 204:case 203:{j=Lc[c[c[b+400>>2]>>2]&255](b)|0;i=e;return j|0};case 200:{k=b+400|0;Rc[c[(c[k>>2]|0)+4>>2]&1023](b);Rc[c[(c[b+24>>2]|0)+8>>2]&1023](b);c[f>>2]=201;g=k;break};case 202:{j=1;i=e;return j|0};default:{c[(c[b>>2]|0)+20>>2]=20;c[(c[b>>2]|0)+24>>2]=c[f>>2];Rc[c[c[b>>2]>>2]&1023](b);j=0;i=e;return j|0}}k=Lc[c[c[g>>2]>>2]&255](b)|0;if((k|0)!=1){j=k;i=e;return j|0}k=c[b+36>>2]|0;if((k|0)==1){c[b+40>>2]=1;c[b+44>>2]=1}else if((k|0)==3){do{if((a[b+256>>0]|0)==0){if((a[b+264>>0]|0)!=0){g=b+265|0;l=d[g>>0]|0;if((l|0)==0){c[b+40>>2]=2;break}else if((l|0)==1){c[b+40>>2]=3;break}else{c[(c[b>>2]|0)+20>>2]=114;c[(c[b>>2]|0)+24>>2]=d[g>>0]|0;Ic[c[(c[b>>2]|0)+4>>2]&511](b,-1);c[b+40>>2]=3;break}}g=c[b+196>>2]|0;l=c[g>>2]|0;m=c[g+84>>2]|0;n=c[g+168>>2]|0;if((l|0)==1&(m|0)==2&(n|0)==3){c[b+40>>2]=3;break}if((l|0)==82&(m|0)==71&(n|0)==66){c[b+40>>2]=2;break}else{g=c[b>>2]|0;c[g+24>>2]=l;c[g+28>>2]=m;c[g+32>>2]=n;c[(c[b>>2]|0)+20>>2]=111;Ic[c[(c[b>>2]|0)+4>>2]&511](b,1);c[b+40>>2]=3;break}}else{c[b+40>>2]=3}}while(0);c[b+44>>2]=2}else if((k|0)==4){do{if((a[b+264>>0]|0)!=0){k=b+265|0;n=d[k>>0]|0;if((n|0)==0){c[b+40>>2]=4;break}else if((n|0)==2){c[b+40>>2]=5;break}else{c[(c[b>>2]|0)+20>>2]=114;c[(c[b>>2]|0)+24>>2]=d[k>>0]|0;Ic[c[(c[b>>2]|0)+4>>2]&511](b,-1);c[b+40>>2]=5;break}}else{c[b+40>>2]=4}}while(0);c[b+44>>2]=4}else{c[b+40>>2]=0;c[b+44>>2]=0}c[b+48>>2]=1;c[b+52>>2]=1;h[b+56>>3]=1.0;a[b+64>>0]=0;a[b+65>>0]=0;c[b+68>>2]=0;a[b+72>>0]=1;a[b+73>>0]=1;a[b+74>>0]=0;c[b+76>>2]=2;a[b+80>>0]=0;c[b+84>>2]=256;c[b+116>>2]=0;a[b+88>>0]=0;a[b+89>>0]=0;a[b+90>>0]=0;c[f>>2]=202;j=1;i=e;return j|0}function caa(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;e=b+20|0;f=c[e>>2]|0;do{if((f|0)==202){yaa(b);if((a[b+64>>0]|0)==0){c[e>>2]=203;g=5;break}c[e>>2]=207;h=1;i=d;return h|0}else if((f|0)==203){g=5}else if((f|0)!=204){c[(c[b>>2]|0)+20>>2]=20;c[(c[b>>2]|0)+24>>2]=c[e>>2];Rc[c[c[b>>2]>>2]&1023](b)}}while(0);if((g|0)==5){g=b+400|0;a:do{if((a[(c[g>>2]|0)+16>>0]|0)!=0){e=b+8|0;f=b+284|0;b:while(1){j=c[e>>2]|0;while(1){if((j|0)!=0){Rc[c[j>>2]&1023](b)}k=Lc[c[c[g>>2]>>2]&255](b)|0;if((k|0)==0){h=0;break b}else if((k|0)==2){break a}l=c[e>>2]|0;if((l|0)==0){j=0;continue}if((k&-3|0)!=1){continue b}k=l+4|0;l=(c[k>>2]|0)+1|0;c[k>>2]=l;j=c[e>>2]|0;m=j+8|0;n=c[m>>2]|0;if((l|0)>=(n|0)){break}}c[m>>2]=(c[f>>2]|0)+n}i=d;return h|0}}while(0);c[b+132>>2]=c[b+124>>2]}daa(b);h=1;i=d;return h|0}function daa(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=b+20|0;f=b+384|0;if((c[e>>2]|0)!=204){Rc[c[c[f>>2]>>2]&1023](b);c[b+120>>2]=0;c[e>>2]=204}if((a[(c[f>>2]|0)+8>>0]|0)==0){g=b+65|0;h=a[g>>0]|0;j=h<<24>>24!=0;k=j?206:205;c[e>>2]=k;i=d;return}do{c[(c[b>>2]|0)+20>>2]=48;Rc[c[c[b>>2]>>2]&1023](b)}while((a[(c[f>>2]|0)+8>>0]|0)!=0);g=b+65|0;h=a[g>>0]|0;j=h<<24>>24!=0;k=j?206:205;c[e>>2]=k;i=d;return}function eaa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;i=i+16|0;f=e;if((c[a+20>>2]|0)!=205){g=0;i=e;return g|0}h=a+120|0;j=c[h>>2]|0;k=a+96|0;if(!(j>>>0<(c[k>>2]|0)>>>0)){c[(c[a>>2]|0)+20>>2]=123;Ic[c[(c[a>>2]|0)+4>>2]&511](a,-1);g=0;i=e;return g|0}l=a+8|0;m=c[l>>2]|0;if((m|0)!=0){c[m+4>>2]=j;c[(c[l>>2]|0)+8>>2]=c[k>>2];Rc[c[c[l>>2]>>2]&1023](a)}c[f>>2]=0;pd[c[(c[a+388>>2]|0)+4>>2]&127](a,b,f,d);d=c[f>>2]|0;c[h>>2]=(c[h>>2]|0)+d;g=d;i=e;return g|0}function faa(b){b=b|0;var d=0,e=0;d=i;e=Qc[c[c[b+4>>2]>>2]&255](b,0,24)|0;c[b+400>>2]=e;c[e>>2]=219;c[e+4>>2]=543;c[e+8>>2]=544;c[e+12>>2]=545;a[e+16>>0]=0;a[e+17>>0]=0;a[e+20>>0]=1;i=d;return}function gaa(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;d=i;e=b+400|0;f=c[e>>2]|0;g=f+17|0;if((a[g>>0]|0)!=0){h=2;i=d;return h|0}j=b+404|0;k=Lc[c[(c[j>>2]|0)+4>>2]&255](b)|0;if((k|0)==1){l=f+20|0;if((a[l>>0]|0)==0){if((a[f+16>>0]|0)==0){c[(c[b>>2]|0)+20>>2]=35;Rc[c[c[b>>2]>>2]&1023](b)}iaa(b);h=1;i=d;return h|0}m=b+32|0;if(!((c[m>>2]|0)<=65500?(c[b+28>>2]|0)<=65500:0)){c[(c[b>>2]|0)+20>>2]=41;c[(c[b>>2]|0)+24>>2]=65500;Rc[c[c[b>>2]>>2]&1023](b)}n=b+192|0;if((c[n>>2]|0)!=8){c[(c[b>>2]|0)+20>>2]=15;c[(c[b>>2]|0)+24>>2]=c[n>>2];Rc[c[c[b>>2]>>2]&1023](b)}n=b+36|0;o=c[n>>2]|0;if((o|0)>10){c[(c[b>>2]|0)+20>>2]=26;c[(c[b>>2]|0)+24>>2]=c[n>>2];c[(c[b>>2]|0)+28>>2]=10;Rc[c[c[b>>2]>>2]&1023](b);p=c[n>>2]|0}else{p=o}o=b+272|0;c[o>>2]=1;q=b+276|0;c[q>>2]=1;r=b+196|0;if((p|0)>0){s=p;t=1;u=1;v=0;w=c[r>>2]|0;while(1){x=w+8|0;y=c[x>>2]|0;z=w+12|0;if(!((y+ -1|0)>>>0>3)?!(((c[z>>2]|0)+ -1|0)>>>0>3):0){A=u;B=y;C=t;D=s}else{c[(c[b>>2]|0)+20>>2]=18;Rc[c[c[b>>2]>>2]&1023](b);A=c[o>>2]|0;B=c[x>>2]|0;C=c[q>>2]|0;D=c[n>>2]|0}u=(A|0)>(B|0)?A:B;c[o>>2]=u;x=c[z>>2]|0;t=(C|0)>(x|0)?C:x;c[q>>2]=t;v=v+1|0;if((v|0)>=(D|0)){break}else{s=D;w=w+84|0}}c[b+280>>2]=8;if((D|0)>0){w=b+28|0;s=0;v=c[r>>2]|0;while(1){c[v+36>>2]=8;r=c[v+8>>2]|0;C=ca(r,c[w>>2]|0)|0;c[v+28>>2]=uba(C,c[o>>2]<<3)|0;C=c[v+12>>2]|0;u=ca(C,c[m>>2]|0)|0;c[v+32>>2]=uba(u,c[q>>2]<<3)|0;u=ca(r,c[w>>2]|0)|0;c[v+40>>2]=uba(u,c[o>>2]|0)|0;u=ca(C,c[m>>2]|0)|0;c[v+44>>2]=uba(u,c[q>>2]|0)|0;a[v+48>>0]=1;c[v+76>>2]=0;s=s+1|0;E=c[n>>2]|0;if((s|0)>=(E|0)){break}else{v=v+84|0}}F=c[q>>2]|0;G=E}else{F=t;G=D}}else{c[b+280>>2]=8;F=1;G=p}c[b+284>>2]=uba(c[m>>2]|0,F<<3)|0;if((c[b+292>>2]|0)>=(G|0)?(a[b+200>>0]|0)==0:0){a[(c[e>>2]|0)+16>>0]=0}else{a[(c[e>>2]|0)+16>>0]=1}a[l>>0]=0;h=1;i=d;return h|0}else if((k|0)==2){a[g>>0]=1;if((a[f+20>>0]|0)==0){f=b+132|0;g=c[b+124>>2]|0;if((c[f>>2]|0)<=(g|0)){h=2;i=d;return h|0}c[f>>2]=g;h=2;i=d;return h|0}else{if((a[(c[j>>2]|0)+13>>0]|0)==0){h=2;i=d;return h|0}c[(c[b>>2]|0)+20>>2]=59;Rc[c[c[b>>2]>>2]&1023](b);h=2;i=d;return h|0}}else{h=k;i=d;return h|0}return 0}function haa(b){b=b|0;var d=0,e=0;d=i;e=c[b+400>>2]|0;c[e>>2]=219;a[e+16>>0]=0;a[e+17>>0]=0;a[e+20>>0]=1;Rc[c[(c[b>>2]|0)+16>>2]&1023](b);Rc[c[c[b+404>>2]>>2]&1023](b);c[b+140>>2]=0;i=d;return}function iaa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;b=i;d=a+292|0;e=c[d>>2]|0;if((e|0)==1){f=c[a+296>>2]|0;c[a+312>>2]=c[f+28>>2];g=f+32|0;c[a+316>>2]=c[g>>2];c[f+52>>2]=1;c[f+56>>2]=1;c[f+60>>2]=1;c[f+64>>2]=c[f+36>>2];c[f+68>>2]=1;h=c[f+12>>2]|0;j=((c[g>>2]|0)>>>0)%(h>>>0)|0;c[f+72>>2]=(j|0)==0?h:j;c[a+320>>2]=1;c[a+324>>2]=0;k=c[d>>2]|0}else{if((e+ -1|0)>>>0>3){c[(c[a>>2]|0)+20>>2]=26;c[(c[a>>2]|0)+24>>2]=c[d>>2];c[(c[a>>2]|0)+28>>2]=4;Rc[c[c[a>>2]>>2]&1023](a);l=c[d>>2]|0}else{l=e}c[a+312>>2]=uba(c[a+28>>2]|0,c[a+272>>2]<<3)|0;c[a+316>>2]=uba(c[a+32>>2]|0,c[a+276>>2]<<3)|0;e=a+320|0;c[e>>2]=0;if((l|0)<=0){m=a+408|0;n=c[m>>2]|0;o=c[n>>2]|0;Rc[o&1023](a);p=a+392|0;q=c[p>>2]|0;r=c[q>>2]|0;Rc[r&1023](a);s=c[p>>2]|0;t=s+4|0;u=c[t>>2]|0;v=a+400|0;w=c[v>>2]|0;c[w>>2]=u;i=b;return}l=0;do{j=c[a+(l<<2)+296>>2]|0;h=c[j+8>>2]|0;c[j+52>>2]=h;f=c[j+12>>2]|0;c[j+56>>2]=f;g=ca(f,h)|0;c[j+60>>2]=g;c[j+64>>2]=ca(c[j+36>>2]|0,h)|0;x=((c[j+28>>2]|0)>>>0)%(h>>>0)|0;c[j+68>>2]=(x|0)==0?h:x;x=((c[j+32>>2]|0)>>>0)%(f>>>0)|0;c[j+72>>2]=(x|0)==0?f:x;if(((c[e>>2]|0)+g|0)>10){c[(c[a>>2]|0)+20>>2]=13;Rc[c[c[a>>2]>>2]&1023](a)}if((g|0)>0){x=g;do{x=x+ -1|0;g=c[e>>2]|0;c[e>>2]=g+1;c[a+(g<<2)+324>>2]=l}while((x|0)>0)}l=l+1|0;x=c[d>>2]|0}while((l|0)<(x|0));k=x}if((k|0)<=0){m=a+408|0;n=c[m>>2]|0;o=c[n>>2]|0;Rc[o&1023](a);p=a+392|0;q=c[p>>2]|0;r=c[q>>2]|0;Rc[r&1023](a);s=c[p>>2]|0;t=s+4|0;u=c[t>>2]|0;v=a+400|0;w=c[v>>2]|0;c[w>>2]=u;i=b;return}l=a+4|0;e=k;k=0;while(1){x=c[a+(k<<2)+296>>2]|0;g=x+76|0;if((c[g>>2]|0)==0){f=c[x+16>>2]|0;x=a+(f<<2)+144|0;if(!(!(f>>>0>3)?(c[x>>2]|0)!=0:0)){c[(c[a>>2]|0)+20>>2]=52;c[(c[a>>2]|0)+24>>2]=f;Rc[c[c[a>>2]>>2]&1023](a)}f=Qc[c[c[l>>2]>>2]&255](a,1,130)|0;c3a(f|0,c[x>>2]|0,130)|0;c[g>>2]=f;y=c[d>>2]|0}else{y=e}k=k+1|0;if((k|0)>=(y|0)){break}else{e=y}}m=a+408|0;n=c[m>>2]|0;o=c[n>>2]|0;Rc[o&1023](a);p=a+392|0;q=c[p>>2]|0;r=c[q>>2]|0;Rc[r&1023](a);s=c[p>>2]|0;t=s+4|0;u=c[t>>2]|0;v=a+400|0;w=c[v>>2]|0;c[w>>2]=u;i=b;return}function jaa(a){a=a|0;c[c[a+400>>2]>>2]=219;return}function kaa(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;d=i;e=c[b+24>>2]|0;f=e+4|0;g=e+12|0;h=b+404|0;j=c[f>>2]|0;k=c[e>>2]|0;a:while(1){if((j|0)==0){if((Lc[c[g>>2]&255](b)|0)<<24>>24==0){l=0;m=19;break}n=c[e>>2]|0;o=c[f>>2]|0}else{n=k;o=j}p=o+ -1|0;q=n+1|0;if((a[n>>0]|0)==-1){r=p;s=q}else{t=p;p=q;while(1){q=(c[h>>2]|0)+20|0;c[q>>2]=(c[q>>2]|0)+1;c[e>>2]=p;c[f>>2]=t;if((t|0)==0){if((Lc[c[g>>2]&255](b)|0)<<24>>24==0){l=0;m=19;break a}u=c[e>>2]|0;v=c[f>>2]|0}else{u=p;v=t}q=v+ -1|0;w=u+1|0;if((a[u>>0]|0)==-1){r=q;s=w;break}else{t=q;p=w}}}do{if((r|0)==0){if((Lc[c[g>>2]&255](b)|0)<<24>>24==0){l=0;m=19;break a}x=c[f>>2]|0;y=c[e>>2]|0}else{x=r;y=s}r=x+ -1|0;s=y+1|0;z=a[y>>0]|0}while(z<<24>>24==-1);p=(c[h>>2]|0)+20|0;A=c[p>>2]|0;if(!(z<<24>>24==0)){m=16;break}c[p>>2]=A+2;c[e>>2]=s;c[f>>2]=r;j=r;k=s}if((m|0)==16){k=z&255;if((A|0)!=0){c[(c[b>>2]|0)+20>>2]=116;c[(c[b>>2]|0)+24>>2]=c[(c[h>>2]|0)+20>>2];c[(c[b>>2]|0)+28>>2]=k;Ic[c[(c[b>>2]|0)+4>>2]&511](b,-1);c[(c[h>>2]|0)+20>>2]=0}c[b+380>>2]=k;c[e>>2]=s;c[f>>2]=r;l=1;i=d;return l|0}else if((m|0)==19){i=d;return l|0}return 0}function laa(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=Qc[c[c[b+4>>2]>>2]&255](b,0,168)|0;f=b+404|0;c[f>>2]=e;c[e>>2]=546;c[e+4>>2]=220;c[e+8>>2]=221;c[e+24>>2]=222;c[e+92>>2]=0;g=e+28|0;h=e+96|0;j=0;do{c[g+(j<<2)>>2]=222;c[h+(j<<2)>>2]=0;j=j+1|0}while((j|0)!=16);c[g>>2]=223;c[e+84>>2]=223;e=c[f>>2]|0;c[b+196>>2]=0;c[b+124>>2]=0;c[b+380>>2]=0;a[e+12>>0]=0;a[e+13>>0]=0;c[e+20>>2]=0;c[e+160>>2]=0;i=d;return}function maa(b){b=b|0;var d=0;d=c[b+404>>2]|0;c[b+196>>2]=0;c[b+124>>2]=0;c[b+380>>2]=0;a[d+12>>0]=0;a[d+13>>0]=0;c[d+20>>2]=0;c[d+160>>2]=0;return}function naa(f){f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0;g=i;i=i+288|0;h=g+256|0;j=g;k=f+380|0;l=f+404|0;m=f+24|0;n=f+252|0;o=f+40|0;p=f+266|0;q=f+256|0;r=f+257|0;s=f+258|0;t=f+259|0;u=f+260|0;v=f+262|0;w=f+264|0;x=f+265|0;y=h+1|0;z=h+2|0;A=h+3|0;B=h+4|0;C=h+5|0;D=h+6|0;E=h+7|0;F=h+8|0;G=h+9|0;H=h+10|0;I=h+11|0;J=h+12|0;K=h+13|0;L=h+14|0;M=h+15|0;N=h+16|0;O=c[k>>2]|0;a:while(1){if((O|0)==0){if((a[(c[l>>2]|0)+12>>0]|0)!=0){if((kaa(f)|0)<<24>>24==0){P=0;Q=163;break}}else{R=c[m>>2]|0;S=R+4|0;T=c[S>>2]|0;if((T|0)==0){if((Lc[c[R+12>>2]&255](f)|0)<<24>>24==0){P=0;Q=163;break}U=c[S>>2]|0}else{U=T}T=c[R>>2]|0;V=U+ -1|0;W=T+1|0;X=a[T>>0]|0;T=X&255;if((V|0)==0){if((Lc[c[R+12>>2]&255](f)|0)<<24>>24==0){P=0;Q=163;break}Y=c[S>>2]|0;Z=c[R>>2]|0}else{Y=V;Z=W}W=a[Z>>0]|0;V=W&255;if(!(X<<24>>24==-1&W<<24>>24==-40)){c[(c[f>>2]|0)+20>>2]=53;c[(c[f>>2]|0)+24>>2]=T;c[(c[f>>2]|0)+28>>2]=V;Rc[c[c[f>>2]>>2]&1023](f)}c[k>>2]=V;c[R>>2]=Z+1;c[S>>2]=Y+ -1}_=c[k>>2]|0}else{_=O}do{switch(_|0){case 216:{c[(c[f>>2]|0)+20>>2]=102;Ic[c[(c[f>>2]|0)+4>>2]&511](f,1);if((a[(c[l>>2]|0)+12>>0]|0)==0){$=0}else{c[(c[f>>2]|0)+20>>2]=61;Rc[c[c[f>>2]>>2]&1023](f);$=0}do{a[f+$+202>>0]=0;a[f+$+218>>0]=1;a[f+$+234>>0]=5;$=$+1|0}while(($|0)!=16);c[n>>2]=0;c[o>>2]=0;a[p>>0]=0;a[q>>0]=0;a[r>>0]=1;a[s>>0]=1;a[t>>0]=0;b[u>>1]=1;b[v>>1]=1;a[w>>0]=0;a[x>>0]=0;a[(c[l>>2]|0)+12>>0]=1;break};case 217:{Q=70;break a;break};case 204:{if((paa(f)|0)<<24>>24==0){P=0;Q=163;break a}break};case 196:{S=c[m>>2]|0;R=S+4|0;V=c[R>>2]|0;if((V|0)==0){if((Lc[c[S+12>>2]&255](f)|0)<<24>>24==0){P=0;Q=163;break a}aa=c[R>>2]|0}else{aa=V}V=c[S>>2]|0;T=aa+ -1|0;W=V+1|0;X=d[V>>0]<<8;if((T|0)==0){if((Lc[c[S+12>>2]&255](f)|0)<<24>>24==0){P=0;Q=163;break a}ba=c[R>>2]|0;ca=c[S>>2]|0}else{ba=T;ca=W}W=ba+ -1|0;T=ca+1|0;V=(d[ca>>0]|X)+ -2|0;if((V|0)>16){X=S+12|0;da=W;ea=V;fa=T;while(1){if((da|0)==0){if((Lc[c[X>>2]&255](f)|0)<<24>>24==0){P=0;Q=163;break a}ga=c[R>>2]|0;ha=c[S>>2]|0}else{ga=da;ha=fa}ia=d[ha>>0]|0;c[(c[f>>2]|0)+20>>2]=80;c[(c[f>>2]|0)+24>>2]=ia;Ic[c[(c[f>>2]|0)+4>>2]&511](f,1);a[h>>0]=0;ja=ga+ -1|0;ka=0;la=1;ma=ha+1|0;do{if((ja|0)==0){if((Lc[c[X>>2]&255](f)|0)<<24>>24==0){P=0;Q=163;break a}na=c[R>>2]|0;oa=c[S>>2]|0}else{na=ja;oa=ma}pa=a[oa>>0]|0;a[h+la>>0]=pa;ka=(pa&255)+ka|0;la=la+1|0;ja=na+ -1|0;ma=oa+1|0}while((la|0)<17);la=ea+ -17|0;pa=c[f>>2]|0;c[pa+24>>2]=d[y>>0]|0;c[pa+28>>2]=d[z>>0]|0;c[pa+32>>2]=d[A>>0]|0;c[pa+36>>2]=d[B>>0]|0;c[pa+40>>2]=d[C>>0]|0;c[pa+44>>2]=d[D>>0]|0;c[pa+48>>2]=d[E>>0]|0;c[pa+52>>2]=d[F>>0]|0;c[(c[f>>2]|0)+20>>2]=86;Ic[c[(c[f>>2]|0)+4>>2]&511](f,2);pa=c[f>>2]|0;c[pa+24>>2]=d[G>>0]|0;c[pa+28>>2]=d[H>>0]|0;c[pa+32>>2]=d[I>>0]|0;c[pa+36>>2]=d[J>>0]|0;c[pa+40>>2]=d[K>>0]|0;c[pa+44>>2]=d[L>>0]|0;c[pa+48>>2]=d[M>>0]|0;c[pa+52>>2]=d[N>>0]|0;c[(c[f>>2]|0)+20>>2]=86;Ic[c[(c[f>>2]|0)+4>>2]&511](f,2);if((ka|0)>256|(ka|0)>(la|0)){c[(c[f>>2]|0)+20>>2]=8;Rc[c[c[f>>2]>>2]&1023](f)}if((ka|0)>0){pa=ja;qa=0;ra=ma;while(1){if((pa|0)==0){if((Lc[c[X>>2]&255](f)|0)<<24>>24==0){P=0;Q=163;break a}sa=c[R>>2]|0;ta=c[S>>2]|0}else{sa=pa;ta=ra}ua=sa+ -1|0;va=ta+1|0;a[j+qa>>0]=a[ta>>0]|0;qa=qa+1|0;if((qa|0)>=(ka|0)){wa=ua;xa=va;break}else{pa=ua;ra=va}}}else{wa=ja;xa=ma}ra=la-ka|0;if((ia&16|0)==0){ya=f+(ia<<2)+160|0;za=ia}else{pa=ia+ -16|0;ya=f+(pa<<2)+176|0;za=pa}if(za>>>0>3){c[(c[f>>2]|0)+20>>2]=30;c[(c[f>>2]|0)+24>>2]=za;Rc[c[c[f>>2]>>2]&1023](f)}pa=c[ya>>2]|0;if((pa|0)==0){qa=n9(f)|0;c[ya>>2]=qa;Aa=qa}else{Aa=pa}pa=Aa+0|0;qa=h+0|0;va=pa+17|0;do{a[pa>>0]=a[qa>>0]|0;pa=pa+1|0;qa=qa+1|0}while((pa|0)<(va|0));c3a((c[ya>>2]|0)+17|0,j|0,256)|0;if((ra|0)>16){da=wa;ea=ra;fa=xa}else{Ba=wa;Ca=ra;Da=xa;break}}}else{Ba=W;Ca=V;Da=T}if((Ca|0)!=0){c[(c[f>>2]|0)+20>>2]=11;Rc[c[c[f>>2]>>2]&1023](f)}c[S>>2]=Da;c[R>>2]=Ba;break};case 201:{if((vaa(f,0,1)|0)<<24>>24==0){P=0;Q=163;break a}break};case 193:case 192:{if((vaa(f,0,0)|0)<<24>>24==0){P=0;Q=163;break a}break};case 194:{if((vaa(f,1,0)|0)<<24>>24==0){P=0;Q=163;break a}break};case 207:case 206:case 205:case 203:case 200:case 199:case 198:case 197:case 195:{c[(c[f>>2]|0)+20>>2]=60;c[(c[f>>2]|0)+24>>2]=c[k>>2];Rc[c[c[f>>2]>>2]&1023](f);break};case 202:{if((vaa(f,1,1)|0)<<24>>24==0){P=0;Q=163;break a}break};case 218:{Q=25;break a;break};case 221:{fa=c[m>>2]|0;ea=fa+4|0;da=c[ea>>2]|0;if((da|0)==0){if((Lc[c[fa+12>>2]&255](f)|0)<<24>>24==0){P=0;Q=163;break a}Ea=c[ea>>2]|0}else{Ea=da}da=c[fa>>2]|0;X=Ea+ -1|0;qa=da+1|0;pa=d[da>>0]<<8;if((X|0)==0){if((Lc[c[fa+12>>2]&255](f)|0)<<24>>24==0){P=0;Q=163;break a}Fa=c[ea>>2]|0;Ga=c[fa>>2]|0}else{Fa=X;Ga=qa}qa=Fa+ -1|0;X=Ga+1|0;if((d[Ga>>0]|pa|0)!=4){c[(c[f>>2]|0)+20>>2]=11;Rc[c[c[f>>2]>>2]&1023](f)}if((qa|0)==0){if((Lc[c[fa+12>>2]&255](f)|0)<<24>>24==0){P=0;Q=163;break a}Ha=c[ea>>2]|0;Ia=c[fa>>2]|0}else{Ha=qa;Ia=X}X=Ha+ -1|0;qa=Ia+1|0;pa=d[Ia>>0]<<8;if((X|0)==0){if((Lc[c[fa+12>>2]&255](f)|0)<<24>>24==0){P=0;Q=163;break a}Ja=c[ea>>2]|0;Ka=c[fa>>2]|0}else{Ja=X;Ka=qa}qa=d[Ka>>0]|pa;c[(c[f>>2]|0)+20>>2]=82;c[(c[f>>2]|0)+24>>2]=qa;Ic[c[(c[f>>2]|0)+4>>2]&511](f,1);c[n>>2]=qa;c[fa>>2]=Ka+1;c[ea>>2]=Ja+ -1;break};case 219:{ea=c[m>>2]|0;fa=ea+4|0;qa=c[fa>>2]|0;if((qa|0)==0){if((Lc[c[ea+12>>2]&255](f)|0)<<24>>24==0){P=0;Q=163;break a}La=c[fa>>2]|0}else{La=qa}qa=c[ea>>2]|0;pa=La+ -1|0;X=qa+1|0;da=d[qa>>0]<<8;if((pa|0)==0){if((Lc[c[ea+12>>2]&255](f)|0)<<24>>24==0){P=0;Q=163;break a}Ma=c[fa>>2]|0;Na=c[ea>>2]|0}else{Ma=pa;Na=X}X=Ma+ -1|0;pa=Na+1|0;qa=(d[Na>>0]|da)+ -2|0;if((qa|0)>0){da=ea+12|0;va=X;ia=qa;ka=pa;while(1){if((va|0)==0){if((Lc[c[da>>2]&255](f)|0)<<24>>24==0){P=0;Q=163;break a}Oa=c[fa>>2]|0;Pa=c[ea>>2]|0}else{Oa=va;Pa=ka}la=d[Pa>>0]|0;ma=la>>>4;ja=la&15;c[(c[f>>2]|0)+20>>2]=81;c[(c[f>>2]|0)+24>>2]=ja;c[(c[f>>2]|0)+28>>2]=ma;Ic[c[(c[f>>2]|0)+4>>2]&511](f,1);if(ja>>>0>3){c[(c[f>>2]|0)+20>>2]=31;c[(c[f>>2]|0)+24>>2]=ja;Rc[c[c[f>>2]>>2]&1023](f)}la=f+(ja<<2)+144|0;ja=c[la>>2]|0;if((ja|0)==0){ua=m9(f)|0;c[la>>2]=ua;Qa=ua}else{Qa=ja}ja=(ma|0)==0;ma=Oa+ -1|0;ua=0;la=Pa+1|0;do{Ra=(ma|0)==0;if(ja){if(Ra){if((Lc[c[da>>2]&255](f)|0)<<24>>24==0){P=0;Q=163;break a}Sa=c[fa>>2]|0;Ta=c[ea>>2]|0}else{Sa=ma;Ta=la}Ua=Sa;Va=Ta;Wa=d[Ta>>0]|0}else{if(Ra){if((Lc[c[da>>2]&255](f)|0)<<24>>24==0){P=0;Q=163;break a}Xa=c[fa>>2]|0;Ya=c[ea>>2]|0}else{Xa=ma;Ya=la}Ra=Xa+ -1|0;Za=Ya+1|0;_a=d[Ya>>0]<<8;if((Ra|0)==0){if((Lc[c[da>>2]&255](f)|0)<<24>>24==0){P=0;Q=163;break a}$a=c[fa>>2]|0;ab=c[ea>>2]|0}else{$a=Ra;ab=Za}Ua=$a;Va=ab;Wa=d[ab>>0]|_a}b[Qa+(c[726928+(ua<<2)>>2]<<1)>>1]=Wa;ua=ua+1|0;ma=Ua+ -1|0;la=Va+1|0}while((ua|0)<64);ua=c[f>>2]|0;b:do{if((c[ua+104>>2]|0)>1){ra=ua;_a=0;while(1){c[ra+24>>2]=e[Qa+(_a<<1)>>1]|0;c[ra+28>>2]=e[Qa+((_a|1)<<1)>>1]|0;c[ra+32>>2]=e[Qa+((_a|2)<<1)>>1]|0;c[ra+36>>2]=e[Qa+((_a|3)<<1)>>1]|0;c[ra+40>>2]=e[Qa+((_a|4)<<1)>>1]|0;c[ra+44>>2]=e[Qa+((_a|5)<<1)>>1]|0;c[ra+48>>2]=e[Qa+((_a|6)<<1)>>1]|0;c[ra+52>>2]=e[Qa+((_a|7)<<1)>>1]|0;c[(c[f>>2]|0)+20>>2]=93;Ic[c[(c[f>>2]|0)+4>>2]&511](f,2);Za=_a+8|0;if((Za|0)>=64){break b}ra=c[f>>2]|0;_a=Za}}}while(0);ua=(ja?-65:-129)+ia|0;if((ua|0)>0){va=ma;ia=ua;ka=la}else{bb=ma;cb=ua;db=la;break}}}else{bb=X;cb=qa;db=pa}if((cb|0)!=0){c[(c[f>>2]|0)+20>>2]=11;Rc[c[c[f>>2]>>2]&1023](f)}c[ea>>2]=db;c[fa>>2]=bb;break};case 239:case 238:case 237:case 236:case 235:case 234:case 233:case 232:case 231:case 230:case 229:case 228:case 227:case 226:case 225:case 224:{if((Lc[c[(c[l>>2]|0)+28+(_+ -224<<2)>>2]&255](f)|0)<<24>>24==0){P=0;Q=163;break a}break};case 1:case 215:case 214:case 213:case 212:case 211:case 210:case 209:case 208:{c[(c[f>>2]|0)+20>>2]=92;c[(c[f>>2]|0)+24>>2]=c[k>>2];Ic[c[(c[f>>2]|0)+4>>2]&511](f,1);break};case 220:{if((paa(f)|0)<<24>>24==0){P=0;Q=163;break a}break};case 254:{if((Lc[c[(c[l>>2]|0)+24>>2]&255](f)|0)<<24>>24==0){P=0;Q=163;break a}break};default:{c[(c[f>>2]|0)+20>>2]=68;c[(c[f>>2]|0)+24>>2]=c[k>>2];Rc[c[c[f>>2]>>2]&1023](f)}}}while(0);c[k>>2]=0;O=0}if((Q|0)==25){O=c[m>>2]|0;m=c[O>>2]|0;_=O+4|0;bb=c[_>>2]|0;if((a[(c[l>>2]|0)+13>>0]|0)==0){c[(c[f>>2]|0)+20>>2]=62;Rc[c[c[f>>2]>>2]&1023](f)}do{if((bb|0)==0){if((Lc[c[O+12>>2]&255](f)|0)<<24>>24==0){P=0;i=g;return P|0}else{eb=c[_>>2]|0;fb=c[O>>2]|0;break}}else{eb=bb;fb=m}}while(0);m=eb+ -1|0;eb=fb+1|0;bb=d[fb>>0]<<8;do{if((m|0)==0){if((Lc[c[O+12>>2]&255](f)|0)<<24>>24==0){P=0;i=g;return P|0}else{gb=c[_>>2]|0;hb=c[O>>2]|0;break}}else{gb=m;hb=eb}}while(0);eb=gb+ -1|0;gb=hb+1|0;m=d[hb>>0]|bb;do{if((eb|0)==0){if((Lc[c[O+12>>2]&255](f)|0)<<24>>24==0){P=0;i=g;return P|0}else{ib=c[_>>2]|0;jb=c[O>>2]|0;break}}else{ib=eb;jb=gb}}while(0);gb=a[jb>>0]|0;eb=gb&255;c[(c[f>>2]|0)+20>>2]=103;c[(c[f>>2]|0)+24>>2]=eb;Ic[c[(c[f>>2]|0)+4>>2]&511](f,1);if(!((m|0)==((eb<<1)+6|0)?!(gb<<24>>24==0|(gb&255)>4):0)){c[(c[f>>2]|0)+20>>2]=11;Rc[c[c[f>>2]>>2]&1023](f)}c[f+292>>2]=eb;m=ib+ -1|0;ib=jb+1|0;jb=(m|0)==0;c:do{if(!(gb<<24>>24==0)){bb=O+12|0;hb=f+196|0;fb=f+36|0;db=jb;cb=m;Qa=0;Va=ib;while(1){if(db){if((Lc[c[bb>>2]&255](f)|0)<<24>>24==0){P=0;Q=163;break}kb=c[_>>2]|0;lb=c[O>>2]|0}else{kb=cb;lb=Va}Ua=kb+ -1|0;Wa=lb+1|0;ab=d[lb>>0]|0;if((Ua|0)==0){if((Lc[c[bb>>2]&255](f)|0)<<24>>24==0){P=0;Q=163;break}mb=c[_>>2]|0;nb=c[O>>2]|0}else{mb=Ua;nb=Wa}Wa=d[nb>>0]|0;Ua=(Qa|0)>0;d:do{if(Ua){$a=0;while(1){if((ab|0)==(c[c[f+($a<<2)+296>>2]>>2]|0)){ob=1;break d}$a=$a+1|0;if(($a|0)>=(Qa|0)){ob=0;break}}}else{ob=0}}while(0);fa=ob?ab+240|0:ab;ea=c[hb>>2]|0;pa=c[fb>>2]|0;e:do{if((pa|0)>0){qa=0;X=ea;while(1){if((fa|0)==(c[X>>2]|0)){pb=X;break e}qa=qa+1|0;$a=X+84|0;if((qa|0)>=(pa|0)){qb=$a;Q=53;break}else{X=$a}}}else{qb=ea;Q=53}}while(0);if((Q|0)==53){Q=0;c[(c[f>>2]|0)+20>>2]=5;c[(c[f>>2]|0)+24>>2]=fa;Rc[c[c[f>>2]>>2]&1023](f);pb=qb}c[f+(Qa<<2)+296>>2]=pb;ea=pb+20|0;c[ea>>2]=Wa>>>4;pa=pb+24|0;c[pa>>2]=Wa&15;ab=c[f>>2]|0;c[ab+24>>2]=fa;c[ab+28>>2]=c[ea>>2];c[ab+32>>2]=c[pa>>2];c[(c[f>>2]|0)+20>>2]=104;Ic[c[(c[f>>2]|0)+4>>2]&511](f,1);if(Ua){pa=0;do{if((c[f+(pa<<2)+296>>2]|0)==(pb|0)){c[(c[f>>2]|0)+20>>2]=5;c[(c[f>>2]|0)+24>>2]=fa;Rc[c[c[f>>2]>>2]&1023](f)}pa=pa+1|0}while((pa|0)!=(Qa|0))}Qa=Qa+1|0;pa=mb+ -1|0;fa=nb+1|0;Ua=(pa|0)==0;if((Qa|0)>=(eb|0)){rb=Ua;sb=pa;tb=fa;break c}else{db=Ua;cb=pa;Va=fa}}if((Q|0)==163){i=g;return P|0}}else{rb=jb;sb=m;tb=ib}}while(0);do{if(rb){if((Lc[c[O+12>>2]&255](f)|0)<<24>>24==0){P=0;i=g;return P|0}else{ub=c[_>>2]|0;vb=c[O>>2]|0;break}}else{ub=sb;vb=tb}}while(0);tb=ub+ -1|0;ub=vb+1|0;sb=f+364|0;c[sb>>2]=d[vb>>0]|0;do{if((tb|0)==0){if((Lc[c[O+12>>2]&255](f)|0)<<24>>24==0){P=0;i=g;return P|0}else{wb=c[_>>2]|0;xb=c[O>>2]|0;break}}else{wb=tb;xb=ub}}while(0);ub=wb+ -1|0;wb=f+368|0;c[wb>>2]=d[xb>>0]|0;do{if((ub|0)==0){if((Lc[c[O+12>>2]&255](f)|0)<<24>>24==0){P=0;i=g;return P|0}else{yb=c[_>>2]|0;zb=c[O>>2]|0;break}}else{yb=ub;zb=xb+1|0}}while(0);xb=d[zb>>0]|0;ub=f+372|0;c[ub>>2]=xb>>>4;tb=f+376|0;c[tb>>2]=xb&15;xb=c[f>>2]|0;c[xb+24>>2]=c[sb>>2];c[xb+28>>2]=c[wb>>2];c[xb+32>>2]=c[ub>>2];c[xb+36>>2]=c[tb>>2];c[(c[f>>2]|0)+20>>2]=105;Ic[c[(c[f>>2]|0)+4>>2]&511](f,1);c[(c[l>>2]|0)+16>>2]=0;l=f+124|0;c[l>>2]=(c[l>>2]|0)+1;c[O>>2]=zb+1;c[_>>2]=yb+ -1;c[k>>2]=0;P=1;i=g;return P|0}else if((Q|0)==70){c[(c[f>>2]|0)+20>>2]=85;Ic[c[(c[f>>2]|0)+4>>2]&511](f,1);c[k>>2]=0;P=2;i=g;return P|0}else if((Q|0)==163){i=g;return P|0}return 0}function oaa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=a+380|0;e=c[d>>2]|0;do{if((e|0)==0){if((kaa(a)|0)<<24>>24==0){f=0;i=b;return f|0}else{g=c[d>>2]|0;break}}else{g=e}}while(0);e=a+404|0;h=c[(c[e>>2]|0)+16>>2]|0;if((g|0)!=(h+208|0)){if((dd[c[(c[a+24>>2]|0)+20>>2]&511](a,h)|0)<<24>>24==0){f=0;i=b;return f|0}}else{c[(c[a>>2]|0)+20>>2]=98;c[(c[a>>2]|0)+24>>2]=c[(c[e>>2]|0)+16>>2];Ic[c[(c[a>>2]|0)+4>>2]&511](a,3);c[d>>2]=0}d=(c[e>>2]|0)+16|0;c[d>>2]=(c[d>>2]|0)+1&7;f=1;i=b;return f|0}function paa(a){a=a|0;var b=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;b=i;e=a+24|0;f=c[e>>2]|0;g=f+4|0;h=c[g>>2]|0;do{if((h|0)==0){if((Lc[c[f+12>>2]&255](a)|0)<<24>>24==0){j=0;i=b;return j|0}else{k=c[g>>2]|0;break}}else{k=h}}while(0);h=c[f>>2]|0;l=k+ -1|0;k=h+1|0;m=(d[h>>0]|0)<<8;do{if((l|0)==0){if((Lc[c[f+12>>2]&255](a)|0)<<24>>24==0){j=0;i=b;return j|0}else{n=c[g>>2]|0;o=c[f>>2]|0;break}}else{n=l;o=k}}while(0);k=(d[o>>0]|0|m)+ -2|0;c[(c[a>>2]|0)+20>>2]=91;c[(c[a>>2]|0)+24>>2]=c[a+380>>2];c[(c[a>>2]|0)+28>>2]=k;Ic[c[(c[a>>2]|0)+4>>2]&511](a,1);c[f>>2]=o+1;c[g>>2]=n+ -1;if((k|0)<=0){j=1;i=b;return j|0}Ic[c[(c[e>>2]|0)+16>>2]&511](a,k);j=1;i=b;return j|0}function qaa(b){b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;e=i;i=i+16|0;f=e;g=b+24|0;h=c[g>>2]|0;j=h+4|0;k=c[j>>2]|0;do{if((k|0)==0){if((Lc[c[h+12>>2]&255](b)|0)<<24>>24==0){l=0;i=e;return l|0}else{m=c[j>>2]|0;break}}else{m=k}}while(0);k=c[h>>2]|0;n=m+ -1|0;m=k+1|0;o=(d[k>>0]|0)<<8;do{if((n|0)==0){if((Lc[c[h+12>>2]&255](b)|0)<<24>>24==0){l=0;i=e;return l|0}else{p=c[j>>2]|0;q=c[h>>2]|0;break}}else{p=n;q=m}}while(0);m=(d[q>>0]|0|o)+ -2|0;o=p+ -1|0;p=q+1|0;if((m|0)<=13){if((m|0)<1){r=o;s=p;t=0}else{u=o;v=p;w=m;x=9}}else{u=o;v=p;w=14;x=9}a:do{if((x|0)==9){p=h+12|0;o=u;q=0;n=v;while(1){if((o|0)==0){if((Lc[c[p>>2]&255](b)|0)<<24>>24==0){l=0;break}y=c[j>>2]|0;z=c[h>>2]|0}else{y=o;z=n}a[f+q>>0]=a[z>>0]|0;q=q+1|0;k=y+ -1|0;A=z+1|0;if(!(q>>>0<w>>>0)){r=k;s=A;t=w;break a}else{o=k;n=A}}i=e;return l|0}}while(0);w=m-t|0;m=b+380|0;z=c[m>>2]|0;if((z|0)==238){uaa(b,f,t,w)}else if((z|0)==224){taa(b,f,t,w)}else{c[(c[b>>2]|0)+20>>2]=68;c[(c[b>>2]|0)+24>>2]=c[m>>2];Rc[c[c[b>>2]>>2]&1023](b)}c[h>>2]=s;c[j>>2]=r;if((w|0)<=0){l=1;i=e;return l|0}Ic[c[(c[g>>2]|0)+16>>2]&511](b,w);l=1;i=e;return l|0}function raa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;f=c[a+404>>2]|0;g=(c[(c[a+4>>2]|0)+48>>2]|0)+ -20|0;h=(g|0)<(d|0)?g:d;d=(b|0)==224;if((h|0)!=0){if(d&h>>>0<14){j=14;k=224}else{j=(b|0)==238&h>>>0<12?12:h;k=224}}else{j=0;k=d|(b|0)==238?223:222}if((b|0)==254){c[f+24>>2]=k;c[f+92>>2]=j;i=e;return}d=b+ -224|0;if(d>>>0<16){c[f+28+(d<<2)>>2]=k;c[f+96+(d<<2)>>2]=j;i=e;return}else{c[(c[a>>2]|0)+20>>2]=68;c[(c[a>>2]|0)+24>>2]=b;Rc[c[c[a>>2]>>2]&1023](a);i=e;return}}function saa(b){b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;e=i;f=c[b+404>>2]|0;g=f+160|0;h=c[g>>2]|0;j=b+24|0;k=c[j>>2]|0;l=c[k>>2]|0;m=k+4|0;n=c[m>>2]|0;if((h|0)==0){do{if((n|0)==0){if((Lc[c[k+12>>2]&255](b)|0)<<24>>24==0){o=0;i=e;return o|0}else{p=c[m>>2]|0;q=c[k>>2]|0;break}}else{p=n;q=l}}while(0);r=p+ -1|0;p=q+1|0;s=(d[q>>0]|0)<<8;do{if((r|0)==0){if((Lc[c[k+12>>2]&255](b)|0)<<24>>24==0){o=0;i=e;return o|0}else{t=c[m>>2]|0;u=c[k>>2]|0;break}}else{t=r;u=p}}while(0);p=t+ -1|0;t=u+1|0;r=(d[u>>0]|0|s)+ -2|0;if((r|0)>-1){s=b+380|0;u=c[s>>2]|0;if((u|0)==254){v=f+92|0}else{v=f+96+(u+ -224<<2)|0}u=c[v>>2]|0;v=r>>>0<u>>>0?r:u;u=Qc[c[(c[b+4>>2]|0)+4>>2]&255](b,1,v+20|0)|0;c[u>>2]=0;a[u+4>>0]=c[s>>2];c[u+8>>2]=r;c[u+12>>2]=v;s=u+20|0;c[u+16>>2]=s;c[g>>2]=u;c[f+164>>2]=0;w=p;x=0;y=u;z=s;A=v;B=r;C=t;D=14}else{E=p;F=0;G=0;H=r;I=t}}else{t=c[f+164>>2]|0;w=n;x=t;y=h;z=(c[h+16>>2]|0)+t|0;A=c[h+12>>2]|0;B=0;C=l;D=14}if((D|0)==14){a:do{if(x>>>0<A>>>0){D=f+164|0;l=k+12|0;h=w;t=x;n=z;r=C;while(1){c[k>>2]=r;c[m>>2]=h;c[D>>2]=t;if((h|0)==0){if((Lc[c[l>>2]&255](b)|0)<<24>>24==0){o=0;break}J=c[m>>2]|0;K=c[k>>2]|0}else{J=h;K=r}if(t>>>0>=A>>>0|(J|0)==0){L=J;M=t;N=n;O=K}else{p=0-J|0;v=t-A|0;s=v>>>0<p>>>0?p:v;v=t-s|0;p=0-s|0;u=n+p|0;q=K+p|0;p=n;P=K;while(1){a[p>>0]=a[P>>0]|0;P=P+1|0;if((P|0)==(q|0)){break}else{p=p+1|0}}L=J+s|0;M=v;N=u;O=q}if(M>>>0<A>>>0){h=L;t=M;n=N;r=O}else{Q=L;R=N;S=O;break a}}i=e;return o|0}else{Q=w;R=z;S=C}}while(0);if((y|0)==0){E=Q;F=R;G=A;H=B;I=S}else{B=b+268|0;R=c[B>>2]|0;if((R|0)==0){c[B>>2]=y}else{B=R;while(1){R=c[B>>2]|0;if((R|0)==0){break}else{B=R}}c[B>>2]=y}E=Q;F=c[y+16>>2]|0;G=A;H=(c[y+8>>2]|0)-A|0;I=S}}c[g>>2]=0;g=b+380|0;S=c[g>>2]|0;if((S|0)==238){uaa(b,F,G,H)}else if((S|0)==224){taa(b,F,G,H)}else{c[(c[b>>2]|0)+20>>2]=91;c[(c[b>>2]|0)+24>>2]=c[g>>2];c[(c[b>>2]|0)+28>>2]=H+G;Ic[c[(c[b>>2]|0)+4>>2]&511](b,1)}c[k>>2]=I;c[m>>2]=E;if((H|0)<=0){o=1;i=e;return o|0}Ic[c[(c[j>>2]|0)+16>>2]&511](b,H);o=1;i=e;return o|0}function taa(f,g,h,j){f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;k=i;l=j+h|0;if(((((h>>>0>13?(a[g>>0]|0)==74:0)?(a[g+1>>0]|0)==70:0)?(a[g+2>>0]|0)==73:0)?(a[g+3>>0]|0)==70:0)?(a[g+4>>0]|0)==0:0){a[f+256>>0]=1;j=a[g+5>>0]|0;m=f+257|0;a[m>>0]=j;n=f+258|0;a[n>>0]=a[g+6>>0]|0;o=f+259|0;a[o>>0]=a[g+7>>0]|0;p=f+260|0;b[p>>1]=d[g+8>>0]<<8|d[g+9>>0];q=f+262|0;b[q>>1]=d[g+10>>0]<<8|d[g+11>>0];if(j<<24>>24==1){r=f;s=1}else{c[(c[f>>2]|0)+20>>2]=119;c[(c[f>>2]|0)+24>>2]=d[m>>0]|0;c[(c[f>>2]|0)+28>>2]=d[n>>0]|0;Ic[c[(c[f>>2]|0)+4>>2]&511](f,-1);r=f;s=a[m>>0]|0}m=c[f>>2]|0;c[m+24>>2]=s&255;c[m+28>>2]=d[n>>0]|0;c[m+32>>2]=e[p>>1]|0;c[m+36>>2]=e[q>>1]|0;c[m+40>>2]=d[o>>0]|0;c[(c[f>>2]|0)+20>>2]=87;Ic[c[(c[f>>2]|0)+4>>2]&511](r,1);o=g+12|0;m=a[o>>0]|0;q=g+13|0;p=a[q>>0]|0;if((p|m)<<24>>24==0){t=m;u=p}else{c[(c[f>>2]|0)+20>>2]=90;c[(c[f>>2]|0)+24>>2]=d[o>>0]|0;c[(c[f>>2]|0)+28>>2]=d[q>>0]|0;Ic[c[(c[f>>2]|0)+4>>2]&511](r,1);t=a[o>>0]|0;u=a[q>>0]|0}q=l+ -14|0;if((q|0)==(ca((t&255)*3|0,u&255)|0)){i=k;return}c[(c[f>>2]|0)+20>>2]=88;c[(c[f>>2]|0)+24>>2]=q;Ic[c[(c[f>>2]|0)+4>>2]&511](r,1);i=k;return}if(((((h>>>0>5?(a[g>>0]|0)==74:0)?(a[g+1>>0]|0)==70:0)?(a[g+2>>0]|0)==88:0)?(a[g+3>>0]|0)==88:0)?(a[g+4>>0]|0)==0:0){h=g+5|0;g=d[h>>0]|0;if((g|0)==16){c[(c[f>>2]|0)+20>>2]=108;c[(c[f>>2]|0)+24>>2]=l;Ic[c[(c[f>>2]|0)+4>>2]&511](f,1);i=k;return}else if((g|0)==19){c[(c[f>>2]|0)+20>>2]=110;c[(c[f>>2]|0)+24>>2]=l;Ic[c[(c[f>>2]|0)+4>>2]&511](f,1);i=k;return}else if((g|0)==17){c[(c[f>>2]|0)+20>>2]=109;c[(c[f>>2]|0)+24>>2]=l;Ic[c[(c[f>>2]|0)+4>>2]&511](f,1);i=k;return}else{c[(c[f>>2]|0)+20>>2]=89;c[(c[f>>2]|0)+24>>2]=d[h>>0]|0;c[(c[f>>2]|0)+28>>2]=l;Ic[c[(c[f>>2]|0)+4>>2]&511](f,1);i=k;return}}c[(c[f>>2]|0)+20>>2]=77;c[(c[f>>2]|0)+24>>2]=l;Ic[c[(c[f>>2]|0)+4>>2]&511](f,1);i=k;return}function uaa(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0;h=i;if(((((f>>>0>11?(a[e>>0]|0)==65:0)?(a[e+1>>0]|0)==100:0)?(a[e+2>>0]|0)==111:0)?(a[e+3>>0]|0)==98:0)?(a[e+4>>0]|0)==101:0){j=d[e+7>>0]<<8|d[e+8>>0];k=d[e+9>>0]<<8|d[e+10>>0];l=a[e+11>>0]|0;m=c[b>>2]|0;c[m+24>>2]=d[e+5>>0]<<8|d[e+6>>0];c[m+28>>2]=j;c[m+32>>2]=k;c[m+36>>2]=l&255;c[(c[b>>2]|0)+20>>2]=76;Ic[c[(c[b>>2]|0)+4>>2]&511](b,1);a[b+264>>0]=1;a[b+265>>0]=l;i=h;return}c[(c[b>>2]|0)+20>>2]=78;c[(c[b>>2]|0)+24>>2]=g+f;Ic[c[(c[b>>2]|0)+4>>2]&511](b,1);i=h;return}function vaa(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;g=i;h=c[b+24>>2]|0;j=c[h>>2]|0;k=h+4|0;l=c[k>>2]|0;a[b+200>>0]=e;a[b+201>>0]=f;do{if((l|0)==0){if((Lc[c[h+12>>2]&255](b)|0)<<24>>24==0){m=0;i=g;return m|0}else{n=c[k>>2]|0;o=c[h>>2]|0;break}}else{n=l;o=j}}while(0);j=n+ -1|0;n=o+1|0;l=d[o>>0]<<8;do{if((j|0)==0){if((Lc[c[h+12>>2]&255](b)|0)<<24>>24==0){m=0;i=g;return m|0}else{p=c[k>>2]|0;q=c[h>>2]|0;break}}else{p=j;q=n}}while(0);n=p+ -1|0;p=q+1|0;j=d[q>>0]|l;do{if((n|0)==0){if((Lc[c[h+12>>2]&255](b)|0)<<24>>24==0){m=0;i=g;return m|0}else{r=c[k>>2]|0;s=c[h>>2]|0;break}}else{r=n;s=p}}while(0);p=r+ -1|0;r=s+1|0;c[b+192>>2]=d[s>>0]|0;do{if((p|0)==0){if((Lc[c[h+12>>2]&255](b)|0)<<24>>24==0){m=0;i=g;return m|0}else{t=c[k>>2]|0;u=c[h>>2]|0;break}}else{t=p;u=r}}while(0);r=t+ -1|0;t=u+1|0;p=d[u>>0]<<8;do{if((r|0)==0){if((Lc[c[h+12>>2]&255](b)|0)<<24>>24==0){m=0;i=g;return m|0}else{v=c[k>>2]|0;w=c[h>>2]|0;break}}else{v=r;w=t}}while(0);t=v+ -1|0;v=w+1|0;r=d[w>>0]|p;do{if((t|0)==0){if((Lc[c[h+12>>2]&255](b)|0)<<24>>24==0){m=0;i=g;return m|0}else{x=c[k>>2]|0;y=c[h>>2]|0;break}}else{x=t;y=v}}while(0);v=x+ -1|0;x=y+1|0;t=d[y>>0]<<8;do{if((v|0)==0){if((Lc[c[h+12>>2]&255](b)|0)<<24>>24==0){m=0;i=g;return m|0}else{z=c[k>>2]|0;A=c[h>>2]|0;break}}else{z=v;A=x}}while(0);x=z+ -1|0;z=A+1|0;v=d[A>>0]|t;do{if((x|0)==0){if((Lc[c[h+12>>2]&255](b)|0)<<24>>24==0){m=0;i=g;return m|0}else{B=c[k>>2]|0;C=c[h>>2]|0;break}}else{B=x;C=z}}while(0);z=b+36|0;c[z>>2]=d[C>>0]|0;if(v>>>0<65501){c[b+28>>2]=v}v=b+32|0;if(r>>>0<65501){c[v>>2]=r}r=j+ -8|0;j=c[b>>2]|0;c[j+24>>2]=c[b+380>>2];x=b+28|0;c[j+28>>2]=c[x>>2];c[j+32>>2]=c[v>>2];c[j+36>>2]=c[z>>2];c[(c[b>>2]|0)+20>>2]=100;Ic[c[(c[b>>2]|0)+4>>2]&511](b,1);j=b+404|0;if((a[(c[j>>2]|0)+13>>0]|0)!=0){c[(c[b>>2]|0)+20>>2]=58;Rc[c[c[b>>2]>>2]&1023](b)}if(((c[v>>2]|0)!=0?(c[x>>2]|0)!=0:0)?(x=c[z>>2]|0,(x|0)>=1):0){D=x}else{c[(c[b>>2]|0)+20>>2]=32;Rc[c[c[b>>2]>>2]&1023](b);D=c[z>>2]|0}if((r|0)!=(D*3|0)){c[(c[b>>2]|0)+20>>2]=11;Rc[c[c[b>>2]>>2]&1023](b)}D=b+196|0;r=c[D>>2]|0;if((r|0)==0){x=Qc[c[c[b+4>>2]>>2]&255](b,1,(c[z>>2]|0)*84|0)|0;c[D>>2]=x;E=x}else{E=r}r=B+ -1|0;B=C+1|0;a:do{if((c[z>>2]|0)>0){C=h+12|0;x=r;v=0;t=E;A=B;while(1){c[t+4>>2]=v;if((x|0)==0){if((Lc[c[C>>2]&255](b)|0)<<24>>24==0){m=0;F=58;break}G=c[k>>2]|0;H=c[h>>2]|0}else{G=x;H=A}y=G+ -1|0;p=H+1|0;w=d[H>>0]|0;c[t>>2]=w;b:do{if((v|0)>0){u=c[D>>2]|0;s=0;while(1){if((w|0)==(c[u+(s*84|0)>>2]|0)){break}s=s+1|0;if((s|0)>=(v|0)){break b}}c[t>>2]=w+240}}while(0);if((y|0)==0){if((Lc[c[C>>2]&255](b)|0)<<24>>24==0){m=0;F=58;break}I=c[k>>2]|0;J=c[h>>2]|0}else{I=y;J=p}w=I+ -1|0;s=d[J>>0]|0;u=t+8|0;c[u>>2]=s>>>4;n=t+12|0;c[n>>2]=s&15;if((w|0)==0){if((Lc[c[C>>2]&255](b)|0)<<24>>24==0){m=0;F=58;break}K=c[k>>2]|0;L=c[h>>2]|0}else{K=w;L=J+1|0}w=t+16|0;c[w>>2]=d[L>>0]|0;s=c[b>>2]|0;c[s+24>>2]=c[t>>2];c[s+28>>2]=c[u>>2];c[s+32>>2]=c[n>>2];c[s+36>>2]=c[w>>2];c[(c[b>>2]|0)+20>>2]=101;Ic[c[(c[b>>2]|0)+4>>2]&511](b,1);v=v+1|0;w=K+ -1|0;s=L+1|0;if((v|0)>=(c[z>>2]|0)){M=w;N=s;break a}else{x=w;t=t+84|0;A=s}}if((F|0)==58){i=g;return m|0}}else{M=r;N=B}}while(0);a[(c[j>>2]|0)+13>>0]=1;c[h>>2]=N;c[k>>2]=M;m=1;i=g;return m|0}function waa(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;d=i;e=b+20|0;if((c[e>>2]|0)!=202){c[(c[b>>2]|0)+20>>2]=20;c[(c[b>>2]|0)+24>>2]=c[e>>2];Rc[c[c[b>>2]>>2]&1023](b)}e=c[b+48>>2]|0;f=c[b+52>>2]|0;do{if(e<<3>>>0>f>>>0){if(!(e<<2>>>0>f>>>0)){c[b+92>>2]=uba(c[b+28>>2]|0,4)|0;c[b+96>>2]=uba(c[b+32>>2]|0,4)|0;c[b+280>>2]=2;g=2;break}h=c[b+28>>2]|0;if(e<<1>>>0>f>>>0){c[b+92>>2]=h;c[b+96>>2]=c[b+32>>2];c[b+280>>2]=8;g=8;break}else{c[b+92>>2]=uba(h,2)|0;c[b+96>>2]=uba(c[b+32>>2]|0,2)|0;c[b+280>>2]=4;g=4;break}}else{c[b+92>>2]=uba(c[b+28>>2]|0,8)|0;c[b+96>>2]=uba(c[b+32>>2]|0,8)|0;c[b+280>>2]=1;g=1}}while(0);f=b+196|0;e=b+36|0;h=c[e>>2]|0;a:do{if((h|0)>0){j=b+280|0;k=b+272|0;l=b+276|0;m=g;n=1;o=c[f>>2]|0;while(1){p=o+12|0;b:do{if((m|0)<8){q=c[o+8>>2]|0;r=ca(m,c[k>>2]|0)|0;s=m;while(1){t=s<<1;if((ca(t,q)|0)>(r|0)){u=s;break b}v=ca(t,c[p>>2]|0)|0;if((v|0)>(ca(c[l>>2]|0,m)|0)){u=s;break b}if((t|0)<8){s=t}else{u=t;break}}}else{u=m}}while(0);c[o+36>>2]=u;w=c[e>>2]|0;if((n|0)>=(w|0)){break}m=c[j>>2]|0;n=n+1|0;o=o+84|0}if((w|0)>0){o=b+28|0;n=b+32|0;j=1;m=c[f>>2]|0;while(1){p=c[m+36>>2]|0;s=ca(ca(c[m+8>>2]|0,c[o>>2]|0)|0,p)|0;c[m+40>>2]=uba(s,c[k>>2]<<3)|0;s=ca(ca(c[m+12>>2]|0,c[n>>2]|0)|0,p)|0;c[m+44>>2]=uba(s,c[l>>2]<<3)|0;s=c[e>>2]|0;if((j|0)>=(s|0)){x=s;break a}j=j+1|0;m=m+84|0}}else{x=w}}else{x=h}}while(0);switch(c[b+44>>2]|0){case 1:{c[b+100>>2]=1;y=1;break};case 3:case 2:{c[b+100>>2]=3;y=3;break};case 5:case 4:{c[b+100>>2]=4;y=4;break};default:{c[b+100>>2]=x;y=x}}c[b+104>>2]=(a[b+74>>0]|0)==0?y:1;if((xaa(b)|0)<<24>>24==0){c[b+108>>2]=1;i=d;return}else{c[b+108>>2]=c[b+276>>2];i=d;return}}function xaa(b){b=b|0;var d=0,e=0,f=0;d=i;if((((((((((((((a[b+72>>0]|0)==0?(a[b+266>>0]|0)==0:0)?(c[b+40>>2]|0)==3:0)?(c[b+36>>2]|0)==3:0)?(c[b+44>>2]|0)==2:0)?(c[b+100>>2]|0)==3:0)?(e=c[b+196>>2]|0,(c[e+8>>2]|0)==2):0)?(c[e+92>>2]|0)==1:0)?(c[e+176>>2]|0)==1:0)?(c[e+12>>2]|0)<=2:0)?(c[e+96>>2]|0)==1:0)?(c[e+180>>2]|0)==1:0)?(f=c[e+36>>2]|0,(f|0)==(c[b+280>>2]|0)):0)?(c[e+120>>2]|0)==(f|0):0){i=d;return(c[e+204>>2]|0)==(f|0)|0}i=d;return 0}function yaa(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;e=b+4|0;f=Qc[c[c[e>>2]>>2]&255](b,1,28)|0;g=b+384|0;c[g>>2]=f;c[f>>2]=547;c[f+4>>2]=548;a[f+8>>0]=0;f=c[g>>2]|0;waa(b);g=Qc[c[c[e>>2]>>2]&255](b,1,1408)|0;h=b+288|0;c[h>>2]=g+256;f3a(g|0,0,256)|0;j=0;do{a[g+(j+256)>>0]=j;j=j+1|0}while((j|0)!=256);f3a(g+512|0,-1,384)|0;f3a(g+896|0,0,384)|0;j=g+1280|0;g=(c[h>>2]|0)+0|0;h=j+128|0;do{a[j>>0]=a[g>>0]|0;j=j+1|0;g=g+1|0}while((j|0)<(h|0));g=b+100|0;j=f+12|0;c[j>>2]=0;h=f+16|0;a[h>>0]=xaa(b)|0;c[f+20>>2]=0;c[f+24>>2]=0;do{if((a[b+74>>0]|0)==0){a[b+88>>0]=0;a[b+89>>0]=0;a[b+90>>0]=0;k=b+65|0}else{if((a[b+64>>0]|0)==0){a[b+88>>0]=0;a[b+89>>0]=0;a[b+90>>0]=0}f=b+65|0;if((a[f>>0]|0)!=0){c[(c[b>>2]|0)+20>>2]=47;Rc[c[c[b>>2]>>2]&1023](b)}do{if((c[g>>2]|0)==3){if((c[b+116>>2]|0)!=0){a[b+89>>0]=1;break}if((a[b+80>>0]|0)==0){a[b+88>>0]=1;break}else{a[b+90>>0]=1;break}}else{a[b+88>>0]=1;a[b+89>>0]=0;a[b+90>>0]=0;c[b+116>>2]=0}}while(0);if((a[b+88>>0]|0)!=0){c[(c[b>>2]|0)+20>>2]=48;Rc[c[c[b>>2]>>2]&1023](b)}if((a[b+90>>0]|0)==0?(a[b+89>>0]|0)==0:0){k=f;break}c[(c[b>>2]|0)+20>>2]=48;Rc[c[c[b>>2]>>2]&1023](b);k=f}}while(0);if((a[k>>0]|0)==0){if((a[h>>0]|0)==0){qia(b);Raa(b)}else{Baa(b)}Oaa(b,a[b+90>>0]|0)}yia(b);do{if((a[b+201>>0]|0)==0){if((a[b+200>>0]|0)==0){Dia(b);break}else{Haa(b);break}}else{c[(c[b>>2]|0)+20>>2]=1;Rc[c[c[b>>2]>>2]&1023](b)}}while(0);h=b+400|0;if((a[(c[h>>2]|0)+16>>0]|0)==0){l=(a[b+64>>0]|0)!=0&1}else{l=1}hia(b,l);if((a[k>>0]|0)==0){Gia(b,0)}Rc[c[(c[e>>2]|0)+24>>2]&1023](b);Rc[c[(c[h>>2]|0)+8>>2]&1023](b);e=b+8|0;k=c[e>>2]|0;if((k|0)==0){i=d;return}if((a[b+64>>0]|0)!=0){i=d;return}if((a[(c[h>>2]|0)+16>>0]|0)==0){i=d;return}h=c[b+36>>2]|0;if((a[b+200>>0]|0)==0){m=h}else{m=(h*3|0)+2|0}c[k+4>>2]=0;k=ca(c[b+284>>2]|0,m)|0;c[(c[e>>2]|0)+8>>2]=k;c[(c[e>>2]|0)+12>>2]=0;c[(c[e>>2]|0)+16>>2]=(a[b+90>>0]|0)!=0?3:2;c[j>>2]=(c[j>>2]|0)+1;i=d;return}function zaa(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=c[b+384>>2]|0;f=e+8|0;if((a[f>>0]|0)==0){g=b+74|0;do{if((a[g>>0]|0)!=0?(c[b+116>>2]|0)==0:0){if((a[b+80>>0]|0)!=0?(a[b+90>>0]|0)!=0:0){c[b+424>>2]=c[e+24>>2];a[f>>0]=1;break}if((a[b+88>>0]|0)==0){c[(c[b>>2]|0)+20>>2]=46;Rc[c[c[b>>2]>>2]&1023](b);break}else{c[b+424>>2]=c[e+20>>2];break}}}while(0);Rc[c[c[b+412>>2]>>2]&1023](b);Rc[c[(c[b+392>>2]|0)+8>>2]&1023](b);if((a[b+65>>0]|0)==0){if((a[e+16>>0]|0)==0){Rc[c[c[b+420>>2]>>2]&1023](b)}Rc[c[c[b+416>>2]>>2]&1023](b);if((a[g>>0]|0)!=0){Ic[c[c[b+424>>2]>>2]&511](b,a[f>>0]|0)}Ic[c[c[b+396>>2]>>2]&511](b,(a[f>>0]|0)!=0?3:0);Ic[c[c[b+388>>2]>>2]&511](b,0)}}else{c[(c[b>>2]|0)+20>>2]=48;Rc[c[c[b>>2]>>2]&1023](b)}g=b+8|0;h=c[g>>2]|0;if((h|0)==0){i=d;return}j=e+12|0;c[h+12>>2]=c[j>>2];c[(c[g>>2]|0)+16>>2]=((a[f>>0]|0)!=0?2:1)+(c[j>>2]|0);if((a[b+64>>0]|0)==0){i=d;return}if((a[(c[b+400>>2]|0)+17>>0]|0)!=0){i=d;return}j=(c[g>>2]|0)+16|0;c[j>>2]=(c[j>>2]|0)+((a[b+90>>0]|0)!=0?2:1);i=d;return}function Aaa(b){b=b|0;var d=0,e=0;d=i;e=c[b+384>>2]|0;if((a[b+74>>0]|0)!=0){Rc[c[(c[b+424>>2]|0)+8>>2]&1023](b)}b=e+12|0;c[b>>2]=(c[b>>2]|0)+1;i=d;return}function Baa(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=b+4|0;f=Qc[c[c[e>>2]>>2]&255](b,1,48)|0;g=b+416|0;c[g>>2]=f;c[f>>2]=549;a[f+8>>0]=0;h=ca(c[b+100>>2]|0,c[b+92>>2]|0)|0;c[f+40>>2]=h;j=f+4|0;if((c[b+276>>2]|0)==2){c[j>>2]=11;c[f+12>>2]=54;c[f+32>>2]=Qc[c[(c[e>>2]|0)+4>>2]&255](b,1,h)|0}else{c[j>>2]=12;c[f+12>>2]=55;c[f+32>>2]=0}f=c[g>>2]|0;g=f+16|0;c[g>>2]=Qc[c[c[e>>2]>>2]&255](b,1,1024)|0;j=f+20|0;c[j>>2]=Qc[c[c[e>>2]>>2]&255](b,1,1024)|0;h=f+24|0;c[h>>2]=Qc[c[c[e>>2]>>2]&255](b,1,1024)|0;k=f+28|0;c[k>>2]=Qc[c[c[e>>2]>>2]&255](b,1,1024)|0;b=0;e=-128;while(1){c[(c[g>>2]|0)+(b<<2)>>2]=(e*91881|0)+32768>>16;c[(c[j>>2]|0)+(b<<2)>>2]=(e*116130|0)+32768>>16;f=ca(e,-46802)|0;c[(c[h>>2]|0)+(b<<2)>>2]=f;f=(ca(e,-22554)|0)+32768|0;c[(c[k>>2]|0)+(b<<2)>>2]=f;b=b+1|0;if((b|0)==256){break}else{e=e+1|0}}i=d;return}function Caa(b){b=b|0;var d=0;d=c[b+416>>2]|0;a[d+36>>0]=0;c[d+44>>2]=c[b+96>>2];return}function Daa(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=i;i=i+16|0;k=f;l=c[b+416>>2]|0;m=l+36|0;if((a[m>>0]|0)==0){n=l+44|0;o=c[n>>2]|0;p=o>>>0<2?o:2;o=c[h>>2]|0;q=j-o|0;j=p>>>0>q>>>0?q:p;c[k>>2]=c[g+(o<<2)>>2];if(j>>>0>1){c[k+4>>2]=c[g+(o+1<<2)>>2]}else{c[k+4>>2]=c[l+32>>2];a[m>>0]=1}pd[c[l+12>>2]&127](b,d,c[e>>2]|0,k);r=n;s=j}else{wba(l+32|0,0,g+(c[h>>2]<<2)|0,0,1,c[l+40>>2]|0);a[m>>0]=0;r=l+44|0;s=1}c[h>>2]=(c[h>>2]|0)+s;c[r>>2]=(c[r>>2]|0)-s;if((a[m>>0]|0)!=0){i=f;return}c[e>>2]=(c[e>>2]|0)+1;i=f;return}function Eaa(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;h=i;j=c[b+416>>2]|0;k=c[b+288>>2]|0;l=c[j+16>>2]|0;m=c[j+20>>2]|0;n=c[j+24>>2]|0;o=c[j+28>>2]|0;j=f<<1;p=c[e>>2]|0;q=c[p+(j<<2)>>2]|0;r=c[p+((j|1)<<2)>>2]|0;j=c[(c[e+4>>2]|0)+(f<<2)>>2]|0;p=c[(c[e+8>>2]|0)+(f<<2)>>2]|0;f=c[g>>2]|0;e=c[g+4>>2]|0;g=b+92|0;b=c[g>>2]|0;s=b>>>1;if((s|0)==0){t=b;u=q;v=r;w=j;x=p;y=f;z=e}else{b=s*6|0;A=s<<1;B=f+b|0;C=p+s|0;D=s;E=q;F=r;G=j;H=p;p=f;f=e;while(1){I=d[G>>0]|0;J=d[H>>0]|0;K=c[l+(J<<2)>>2]|0;L=(c[n+(J<<2)>>2]|0)+(c[o+(I<<2)>>2]|0)>>16;J=c[m+(I<<2)>>2]|0;I=d[E>>0]|0;a[p>>0]=a[k+(I+K)>>0]|0;a[p+1>>0]=a[k+(I+L)>>0]|0;a[p+2>>0]=a[k+(I+J)>>0]|0;I=d[E+1>>0]|0;a[p+3>>0]=a[k+(I+K)>>0]|0;a[p+4>>0]=a[k+(I+L)>>0]|0;a[p+5>>0]=a[k+(I+J)>>0]|0;I=d[F>>0]|0;a[f>>0]=a[k+(I+K)>>0]|0;a[f+1>>0]=a[k+(I+L)>>0]|0;a[f+2>>0]=a[k+(I+J)>>0]|0;I=d[F+1>>0]|0;a[f+3>>0]=a[k+(I+K)>>0]|0;a[f+4>>0]=a[k+(I+L)>>0]|0;a[f+5>>0]=a[k+(I+J)>>0]|0;D=D+ -1|0;if((D|0)==0){break}else{E=E+2|0;F=F+2|0;G=G+1|0;H=H+1|0;p=p+6|0;f=f+6|0}}t=c[g>>2]|0;u=q+A|0;v=r+A|0;w=j+s|0;x=C;y=B;z=e+b|0}if((t&1|0)==0){i=h;return}t=d[w>>0]|0;w=d[x>>0]|0;x=c[l+(w<<2)>>2]|0;l=(c[n+(w<<2)>>2]|0)+(c[o+(t<<2)>>2]|0)>>16;o=c[m+(t<<2)>>2]|0;t=d[u>>0]|0;a[y>>0]=a[k+(t+x)>>0]|0;a[y+1>>0]=a[k+(t+l)>>0]|0;a[y+2>>0]=a[k+(t+o)>>0]|0;t=d[v>>0]|0;a[z>>0]=a[k+(t+x)>>0]|0;a[z+1>>0]=a[k+(t+l)>>0]|0;a[z+2>>0]=a[k+(t+o)>>0]|0;i=h;return}function Faa(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;h=i;pd[c[(c[a+416>>2]|0)+12>>2]&127](a,b,c[d>>2]|0,f+(c[g>>2]<<2)|0);c[g>>2]=(c[g>>2]|0)+1;c[d>>2]=(c[d>>2]|0)+1;i=h;return}function Gaa(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;h=i;j=c[b+416>>2]|0;k=c[b+288>>2]|0;l=c[j+16>>2]|0;m=c[j+20>>2]|0;n=c[j+24>>2]|0;o=c[j+28>>2]|0;j=c[(c[e>>2]|0)+(f<<2)>>2]|0;p=c[(c[e+4>>2]|0)+(f<<2)>>2]|0;q=c[(c[e+8>>2]|0)+(f<<2)>>2]|0;f=c[g>>2]|0;g=b+92|0;b=c[g>>2]|0;e=b>>>1;if((e|0)==0){r=b;s=j;t=p;u=q;v=f}else{b=e*6|0;w=e<<1;x=q+e|0;y=e;z=j;A=p;B=q;q=f;while(1){C=d[A>>0]|0;D=d[B>>0]|0;E=c[l+(D<<2)>>2]|0;F=(c[n+(D<<2)>>2]|0)+(c[o+(C<<2)>>2]|0)>>16;D=c[m+(C<<2)>>2]|0;C=d[z>>0]|0;a[q>>0]=a[k+(C+E)>>0]|0;a[q+1>>0]=a[k+(C+F)>>0]|0;a[q+2>>0]=a[k+(C+D)>>0]|0;C=d[z+1>>0]|0;a[q+3>>0]=a[k+(C+E)>>0]|0;a[q+4>>0]=a[k+(C+F)>>0]|0;a[q+5>>0]=a[k+(C+D)>>0]|0;y=y+ -1|0;if((y|0)==0){break}else{z=z+2|0;A=A+1|0;B=B+1|0;q=q+6|0}}r=c[g>>2]|0;s=j+w|0;t=p+e|0;u=x;v=f+b|0}if((r&1|0)==0){i=h;return}r=d[t>>0]|0;t=d[u>>0]|0;u=(c[n+(t<<2)>>2]|0)+(c[o+(r<<2)>>2]|0)>>16;o=c[m+(r<<2)>>2]|0;r=d[s>>0]|0;a[v>>0]=a[k+(r+(c[l+(t<<2)>>2]|0))>>0]|0;a[v+1>>0]=a[k+(r+u)>>0]|0;a[v+2>>0]=a[k+(r+o)>>0]|0;i=h;return}function Haa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+4|0;e=Qc[c[c[d>>2]>>2]&255](a,1,64)|0;c[a+408>>2]=e;c[e>>2]=550;f=e+44|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;f=a+36|0;e=Qc[c[c[d>>2]>>2]&255](a,1,c[f>>2]<<8)|0;c[a+140>>2]=e;if((c[f>>2]|0)>0){g=0}else{i=b;return}do{f3a(e+(g<<8)|0,-1,256)|0;g=g+1|0}while((g|0)<(c[f>>2]|0));i=b;return}function Iaa(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;d=i;e=c[b+408>>2]|0;f=b+364|0;g=c[f>>2]|0;h=(g|0)==0;j=b+368|0;k=c[j>>2]|0;if(h){l=(k|0)!=0&1}else{l=(c[b+292>>2]|0)==1?((g|0)>(k|0)|(k|0)>63)&1:1}k=b+372|0;g=c[k>>2]|0;m=b+376|0;n=c[m>>2]|0;if((g|0)==0){o=l}else{o=(n|0)==(g+ -1|0)?l:1}if(!(o<<24>>24==0&(n|0)<14)){c[(c[b>>2]|0)+20>>2]=16;c[(c[b>>2]|0)+24>>2]=c[f>>2];c[(c[b>>2]|0)+28>>2]=c[j>>2];c[(c[b>>2]|0)+32>>2]=c[k>>2];c[(c[b>>2]|0)+36>>2]=c[m>>2];Rc[c[c[b>>2]>>2]&1023](b)}n=b+292|0;if((c[n>>2]|0)>0){o=b+140|0;l=0;do{g=c[(c[b+(l<<2)+296>>2]|0)+4>>2]|0;p=c[o>>2]|0;if(!h?(c[p+(g<<8)>>2]|0)<0:0){c[(c[b>>2]|0)+20>>2]=115;c[(c[b>>2]|0)+24>>2]=g;c[(c[b>>2]|0)+28>>2]=0;Ic[c[(c[b>>2]|0)+4>>2]&511](b,-1)}q=c[f>>2]|0;a:do{if((q|0)<=(c[j>>2]|0)){r=q;while(1){s=p+(g<<8)+(r<<2)|0;t=c[s>>2]|0;if((c[k>>2]|0)!=(((t|0)<0?0:t)|0)){c[(c[b>>2]|0)+20>>2]=115;c[(c[b>>2]|0)+24>>2]=g;c[(c[b>>2]|0)+28>>2]=r;Ic[c[(c[b>>2]|0)+4>>2]&511](b,-1)}c[s>>2]=c[m>>2];if((r|0)>=(c[j>>2]|0)){break a}r=r+1|0}}}while(0);l=l+1|0}while((l|0)<(c[n>>2]|0))}l=e+4|0;do{if((c[k>>2]|0)==0){if(h){c[l>>2]=261;break}else{c[l>>2]=262;break}}else{if(h){c[l>>2]=263;break}else{c[l>>2]=264;break}}}while(0);if((c[n>>2]|0)<=0){u=e+20|0;v=e+16|0;c[v>>2]=0;w=e+12|0;c[w>>2]=0;x=e+8|0;a[x>>0]=0;c[u>>2]=0;y=b+252|0;z=c[y>>2]|0;A=e+40|0;B=z;c[A>>2]=B;i=d;return}l=e+44|0;j=e+20|0;m=j+4|0;f=e+60|0;o=0;do{g=c[b+(o<<2)+296>>2]|0;if(h){if((c[k>>2]|0)==0){p=c[g+20>>2]|0;Aia(b,1,p,l+(p<<2)|0)}}else{p=c[g+24>>2]|0;g=l+(p<<2)|0;Aia(b,0,p,g);c[f>>2]=c[g>>2]}c[m+(o<<2)>>2]=0;o=o+1|0}while((o|0)<(c[n>>2]|0));u=j;v=e+16|0;c[v>>2]=0;w=e+12|0;c[w>>2]=0;x=e+8|0;a[x>>0]=0;c[u>>2]=0;y=b+252|0;z=c[y>>2]|0;A=e+40|0;B=z;c[A>>2]=B;i=d;return}function Jaa(e,f){e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;g=i;i=i+48|0;h=g+20|0;j=g;k=c[e+408>>2]|0;l=c[e+376>>2]|0;if(((c[e+252>>2]|0)!=0?(c[k+40>>2]|0)==0:0)?(Naa(e)|0)<<24>>24==0:0){m=0;i=g;return m|0}if((a[k+8>>0]|0)==0){c[h+16>>2]=e;n=e+24|0;o=c[n>>2]|0;p=c[o>>2]|0;c[h>>2]=p;q=c[o+4>>2]|0;r=h+4|0;c[r>>2]=q;s=k+12|0;t=c[s>>2]|0;u=k+16|0;v=c[u>>2]|0;w=k+20|0;c[j+0>>2]=c[w+0>>2];c[j+4>>2]=c[w+4>>2];c[j+8>>2]=c[w+8>>2];c[j+12>>2]=c[w+12>>2];c[j+16>>2]=c[w+16>>2];x=e+320|0;do{if((c[x>>2]|0)>0){y=k+44|0;z=h+8|0;A=h+12|0;B=v;C=0;D=t;while(1){E=c[f+(C<<2)>>2]|0;F=c[e+(C<<2)+324>>2]|0;G=c[y+(c[(c[e+(F<<2)+296>>2]|0)+20>>2]<<2)>>2]|0;if((B|0)<8){if((Bia(h,D,B,0)|0)<<24>>24==0){m=0;H=24;break}I=c[z>>2]|0;J=c[A>>2]|0;if((J|0)<8){K=J;L=I;M=1;H=12}else{N=J;O=I;H=10}}else{N=B;O=D;H=10}if((H|0)==10){H=0;I=O>>N+ -8&255;J=c[G+(I<<2)+144>>2]|0;if((J|0)==0){K=N;L=O;M=9;H=12}else{P=N-J|0;Q=O;R=d[G+I+1168>>0]|0}}if((H|0)==12){H=0;I=Cia(h,L,K,G,M)|0;if((I|0)<0){m=0;H=24;break}P=c[A>>2]|0;Q=c[z>>2]|0;R=I}if((R|0)!=0){if((P|0)<(R|0)){if((Bia(h,Q,P,R)|0)<<24>>24==0){m=0;H=24;break}S=c[A>>2]|0;T=c[z>>2]|0}else{S=P;T=Q}I=S-R|0;G=T>>I&(1<<R)+ -1;if((G|0)<(c[742576+(R<<2)>>2]|0)){U=I;V=T;W=(c[742640+(R<<2)>>2]|0)+G|0}else{U=I;V=T;W=G}}else{U=P;V=Q;W=0}G=j+(F<<2)+4|0;F=(c[G>>2]|0)+W|0;c[G>>2]=F;b[E>>1]=F<<l;C=C+1|0;if((C|0)>=(c[x>>2]|0)){H=21;break}else{B=U;D=V}}if((H|0)==21){X=c[h>>2]|0;Y=c[n>>2]|0;Z=c[r>>2]|0;_=U;$=V;break}else if((H|0)==24){i=g;return m|0}}else{X=p;Y=o;Z=q;_=v;$=t}}while(0);c[Y>>2]=X;c[(c[n>>2]|0)+4>>2]=Z;c[s>>2]=$;c[u>>2]=_;c[w+0>>2]=c[j+0>>2];c[w+4>>2]=c[j+4>>2];c[w+8>>2]=c[j+8>>2];c[w+12>>2]=c[j+12>>2];c[w+16>>2]=c[j+16>>2]}j=k+40|0;c[j>>2]=(c[j>>2]|0)+ -1;m=1;i=g;return m|0}function Kaa(e,f){e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0;g=i;i=i+32|0;h=g;j=c[e+408>>2]|0;k=c[e+368>>2]|0;l=c[e+376>>2]|0;if(((c[e+252>>2]|0)!=0?(c[j+40>>2]|0)==0:0)?(Naa(e)|0)<<24>>24==0:0){m=0;i=g;return m|0}if((a[j+8>>0]|0)==0){n=j+20|0;o=c[n>>2]|0;if((o|0)==0){c[h+16>>2]=e;p=e+24|0;q=c[p>>2]|0;c[h>>2]=c[q>>2];r=h+4|0;c[r>>2]=c[q+4>>2];q=j+12|0;s=c[q>>2]|0;t=j+16|0;u=c[t>>2]|0;v=c[f>>2]|0;f=c[j+60>>2]|0;w=c[e+364>>2]|0;a:do{if((w|0)<=(k|0)){e=h+8|0;x=h+12|0;y=u;z=s;A=w;while(1){if((y|0)<8){if((Bia(h,z,y,0)|0)<<24>>24==0){m=0;B=35;break}C=c[e>>2]|0;D=c[x>>2]|0;if((D|0)<8){E=D;F=C;G=1;B=14}else{H=D;I=C;B=12}}else{H=y;I=z;B=12}if((B|0)==12){B=0;C=I>>H+ -8&255;D=c[f+(C<<2)+144>>2]|0;if((D|0)==0){E=H;F=I;G=9;B=14}else{J=H-D|0;K=I;L=d[f+C+1168>>0]|0}}if((B|0)==14){B=0;C=Cia(h,F,E,f,G)|0;if((C|0)<0){m=0;B=35;break}J=c[x>>2]|0;K=c[e>>2]|0;L=C}M=L>>4;C=L&15;if((C|0)==0){if((M|0)!=15){B=25;break}N=J;O=K;P=A+15|0}else{D=M+A|0;if((J|0)<(C|0)){if((Bia(h,K,J,C)|0)<<24>>24==0){m=0;B=35;break}Q=c[x>>2]|0;R=c[e>>2]|0}else{Q=J;R=K}S=Q-C|0;T=R>>S&(1<<C)+ -1;if((T|0)<(c[742576+(C<<2)>>2]|0)){U=(c[742640+(C<<2)>>2]|0)+T|0}else{U=T}b[v+(c[726928+(D<<2)>>2]<<1)>>1]=U<<l;N=S;O=R;P=D}if((P|0)<(k|0)){y=N;z=O;A=P+1|0}else{V=0;W=N;X=O;break a}}if((B|0)==25){A=1<<M;if((M|0)==0){Y=A;Z=J;_=K}else{do{if((J|0)<(M|0)){if((Bia(h,K,J,M)|0)<<24>>24==0){m=0;i=g;return m|0}else{$=c[x>>2]|0;aa=c[e>>2]|0;break}}else{$=J;aa=K}}while(0);e=$-M|0;Y=(aa>>e&A+ -1)+A|0;Z=e;_=aa}V=Y+ -1|0;W=Z;X=_;break}else if((B|0)==35){i=g;return m|0}}else{V=0;W=u;X=s}}while(0);c[c[p>>2]>>2]=c[h>>2];c[(c[p>>2]|0)+4>>2]=c[r>>2];c[q>>2]=X;c[t>>2]=W;ba=V}else{ba=o+ -1|0}c[n>>2]=ba}ba=j+40|0;c[ba>>2]=(c[ba>>2]|0)+ -1;m=1;i=g;return m|0}function Laa(a,d){a=a|0;d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;f=i;i=i+32|0;g=f;h=c[a+408>>2]|0;j=1<<c[a+376>>2];if(((c[a+252>>2]|0)!=0?(c[h+40>>2]|0)==0:0)?(Naa(a)|0)<<24>>24==0:0){k=0;i=f;return k|0}c[g+16>>2]=a;l=a+24|0;m=c[l>>2]|0;n=c[m>>2]|0;c[g>>2]=n;o=c[m+4>>2]|0;p=g+4|0;c[p>>2]=o;q=h+12|0;r=c[q>>2]|0;s=h+16|0;t=c[s>>2]|0;u=a+320|0;do{if((c[u>>2]|0)>0){a=g+8|0;v=g+12|0;w=t;x=0;y=r;while(1){z=c[d+(x<<2)>>2]|0;if((w|0)<1){if((Bia(g,y,w,1)|0)<<24>>24==0){k=0;A=14;break}B=c[v>>2]|0;C=c[a>>2]|0}else{B=w;C=y}w=B+ -1|0;if((1<<w&C|0)!=0){b[z>>1]=e[z>>1]|0|j}x=x+1|0;if((x|0)>=(c[u>>2]|0)){A=12;break}else{y=C}}if((A|0)==12){D=c[g>>2]|0;E=c[l>>2]|0;F=c[p>>2]|0;G=w;H=C;break}else if((A|0)==14){i=f;return k|0}}else{D=n;E=m;F=o;G=t;H=r}}while(0);c[E>>2]=D;c[(c[l>>2]|0)+4>>2]=F;c[q>>2]=H;c[s>>2]=G;G=h+40|0;c[G>>2]=(c[G>>2]|0)+ -1;k=1;i=f;return k|0}function Maa(e,f){e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0;g=i;i=i+288|0;h=g+256|0;j=g;k=c[e+408>>2]|0;l=c[e+368>>2]|0;m=c[e+376>>2]|0;n=1<<m;o=-1<<m;if(((c[e+252>>2]|0)!=0?(c[k+40>>2]|0)==0:0)?(Naa(e)|0)<<24>>24==0:0){p=0;i=g;return p|0}do{if((a[k+8>>0]|0)==0){c[h+16>>2]=e;m=e+24|0;q=c[m>>2]|0;c[h>>2]=c[q>>2];r=h+4|0;c[r>>2]=c[q+4>>2];q=k+12|0;s=c[q>>2]|0;t=k+16|0;u=c[t>>2]|0;v=k+20|0;w=c[v>>2]|0;x=c[f>>2]|0;y=c[k+60>>2]|0;z=c[e+364>>2]|0;a:do{if((w|0)==0){if((z|0)<=(l|0)){A=h+8|0;B=h+12|0;C=u;D=s;E=z;F=0;while(1){if((C|0)<8){if((Bia(h,D,C,0)|0)<<24>>24==0){G=F;break a}H=c[A>>2]|0;I=c[B>>2]|0;if((I|0)<8){J=I;K=H;L=1;M=14}else{N=I;O=H;M=12}}else{N=C;O=D;M=12}if((M|0)==12){M=0;H=O>>N+ -8&255;I=c[y+(H<<2)+144>>2]|0;if((I|0)==0){J=N;K=O;L=9;M=14}else{P=N-I|0;Q=O;R=d[y+H+1168>>0]|0}}if((M|0)==14){M=0;H=Cia(h,K,J,y,L)|0;if((H|0)<0){G=F;break a}P=c[B>>2]|0;Q=c[A>>2]|0;R=H}S=R>>4;H=R&15;if((H|0)==0){if((S|0)==15){T=P;U=Q;V=15;W=0}else{break}}else if((H|0)==1){M=18}else{c[(c[e>>2]|0)+20>>2]=118;Ic[c[(c[e>>2]|0)+4>>2]&511](e,-1);M=18}if((M|0)==18){M=0;if((P|0)<1){if((Bia(h,Q,P,1)|0)<<24>>24==0){G=F;break a}X=c[B>>2]|0;Y=c[A>>2]|0}else{X=P;Y=Q}H=X+ -1|0;T=H;U=Y;V=S;W=(1<<H&Y|0)==0?o:n}H=T;I=U;Z=E;_=V;b:while(1){$=x+(c[726928+(Z<<2)>>2]<<1)|0;do{if((b[$>>1]|0)==0){if((_|0)<1){aa=H;ba=I;ca=Z;break b}else{da=H;ea=I;fa=_+ -1|0}}else{if((H|0)<1){if((Bia(h,I,H,1)|0)<<24>>24==0){G=F;break a}ga=c[B>>2]|0;ha=c[A>>2]|0}else{ga=H;ha=I}ia=ga+ -1|0;if((1<<ia&ha|0)!=0?(ja=b[$>>1]|0,ka=ja<<16>>16,(ka&n|0)==0):0){if(ja<<16>>16>-1){b[$>>1]=ka+n;da=ia;ea=ha;fa=_;break}else{b[$>>1]=ka+o;da=ia;ea=ha;fa=_;break}}else{da=ia;ea=ha;fa=_}}}while(0);$=Z+1|0;if((Z|0)<(l|0)){H=da;I=ea;Z=$;_=fa}else{aa=da;ba=ea;ca=$;break}}if((W|0)==0){la=F}else{_=c[726928+(ca<<2)>>2]|0;b[x+(_<<1)>>1]=W;c[j+(F<<2)>>2]=_;la=F+1|0}if((ca|0)<(l|0)){C=aa;D=ba;E=ca+1|0;F=la}else{ma=0;na=aa;oa=ba;M=56;break a}}D=1<<S;if((S|0)!=0){if((P|0)<(S|0)){if((Bia(h,Q,P,S)|0)<<24>>24==0){G=F;break}pa=c[B>>2]|0;qa=c[A>>2]|0}else{pa=P;qa=Q}C=pa-S|0;_=(qa>>C&D+ -1)+D|0;if((_|0)==0){ma=0;na=C;oa=qa;M=56}else{ra=_;sa=C;ta=qa;ua=E;va=F;M=43}}else{ra=D;sa=P;ta=Q;ua=E;va=F;M=43}}else{ma=0;na=u;oa=s;M=56}}else{ra=w;sa=u;ta=s;ua=z;va=0;M=43}}while(0);c:do{if((M|0)==43){if((ua|0)>(l|0)){wa=sa;xa=ta}else{z=h+8|0;s=h+12|0;u=sa;w=ta;y=ua;while(1){D=x+(c[726928+(y<<2)>>2]<<1)|0;do{if((b[D>>1]|0)!=0){if((u|0)<1){if((Bia(h,w,u,1)|0)<<24>>24==0){G=va;break c}ya=c[s>>2]|0;za=c[z>>2]|0}else{ya=u;za=w}C=ya+ -1|0;if((1<<C&za|0)!=0?(_=b[D>>1]|0,Z=_<<16>>16,(Z&n|0)==0):0){if(_<<16>>16>-1){b[D>>1]=Z+n;Aa=C;Ba=za;break}else{b[D>>1]=Z+o;Aa=C;Ba=za;break}}else{Aa=C;Ba=za}}else{Aa=u;Ba=w}}while(0);if((y|0)<(l|0)){u=Aa;w=Ba;y=y+1|0}else{wa=Aa;xa=Ba;break}}}ma=ra+ -1|0;na=wa;oa=xa;M=56}}while(0);if((M|0)==56){c[c[m>>2]>>2]=c[h>>2];c[(c[m>>2]|0)+4>>2]=c[r>>2];c[q>>2]=oa;c[t>>2]=na;c[v>>2]=ma;break}if((G|0)>0){Ca=G}else{p=0;i=g;return p|0}do{Ca=Ca+ -1|0;b[x+(c[j+(Ca<<2)>>2]<<1)>>1]=0}while((Ca|0)>0);p=0;i=g;return p|0}}while(0);Ca=k+40|0;c[Ca>>2]=(c[Ca>>2]|0)+ -1;p=1;i=g;return p|0}function Naa(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=c[b+408>>2]|0;f=e+16|0;g=b+404|0;h=(c[g>>2]|0)+20|0;c[h>>2]=(c[h>>2]|0)+((c[f>>2]|0)/8|0);c[f>>2]=0;if((Lc[c[(c[g>>2]|0)+8>>2]&255](b)|0)<<24>>24==0){j=0;i=d;return j|0}g=b+292|0;f=e+20|0;if((c[g>>2]|0)>0){h=f+4|0;k=0;do{c[h+(k<<2)>>2]=0;k=k+1|0}while((k|0)<(c[g>>2]|0))}c[f>>2]=0;c[e+40>>2]=c[b+252>>2];if((c[b+380>>2]|0)!=0){j=1;i=d;return j|0}a[e+8>>0]=0;j=1;i=d;return j|0}function Oaa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=b+4|0;g=Qc[c[c[f>>2]>>2]&255](b,1,28)|0;c[b+396>>2]=g;c[g>>2]=324;c[g+8>>2]=0;h=g+12|0;c[h>>2]=0;if((a[b+74>>0]|0)==0){i=e;return}j=c[b+276>>2]|0;c[g+16>>2]=j;if(d<<24>>24==0){d=ca(c[b+100>>2]|0,c[b+92>>2]|0)|0;c[h>>2]=id[c[(c[f>>2]|0)+8>>2]&511](b,1,d,j)|0;i=e;return}else{c[(c[b>>2]|0)+20>>2]=4;Rc[c[c[b>>2]>>2]&1023](b);i=e;return}}function Paa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=c[b+396>>2]|0;do{if((d|0)==0){if((a[b+74>>0]|0)==0){c[f+4>>2]=c[(c[b+416>>2]|0)+4>>2];break}c[f+4>>2]=13;g=f+12|0;if((c[g>>2]|0)==0){c[g>>2]=ed[c[(c[b+4>>2]|0)+28>>2]&127](b,c[f+8>>2]|0,0,c[f+16>>2]|0,1)|0}}else{c[(c[b>>2]|0)+20>>2]=4;Rc[c[c[b>>2]>>2]&1023](b)}}while(0);c[f+24>>2]=0;c[f+20>>2]=0;i=e;return}function Qaa(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0;j=i;i=i+16|0;k=j;l=c[a+396>>2]|0;m=h-(c[g>>2]|0)|0;h=c[l+16>>2]|0;c[k>>2]=0;n=l+12|0;ad[c[(c[a+416>>2]|0)+4>>2]&15](a,b,d,e,c[n>>2]|0,k,m>>>0>h>>>0?h:m);pd[c[(c[a+424>>2]|0)+4>>2]&127](a,c[n>>2]|0,f+(c[g>>2]<<2)|0,c[k>>2]|0);c[g>>2]=(c[g>>2]|0)+(c[k>>2]|0);i=j;return}function Raa(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;d=i;e=b+4|0;f=Qc[c[c[e>>2]>>2]&255](b,1,160)|0;c[b+416>>2]=f;c[f>>2]=551;c[f+4>>2]=14;g=f+8|0;a[g>>0]=0;if((a[b+266>>0]|0)!=0){c[(c[b>>2]|0)+20>>2]=25;Rc[c[c[b>>2]>>2]&1023](b)}if((a[b+72>>0]|0)==0){h=0}else{h=(c[b+280>>2]|0)>1&1}j=b+36|0;if((c[j>>2]|0)<=0){i=d;return}k=b+280|0;l=b+272|0;m=b+276|0;n=f+100|0;o=f+52|0;p=h<<24>>24==0;h=b+92|0;q=f+12|0;r=0;s=c[b+196>>2]|0;while(1){t=c[s+36>>2]|0;u=ca(t,c[s+8>>2]|0)|0;v=c[k>>2]|0;w=(u|0)/(v|0)|0;u=(ca(c[s+12>>2]|0,t)|0)/(v|0)|0;v=c[l>>2]|0;t=c[m>>2]|0;c[n+(r<<2)>>2]=u;do{if((a[s+48>>0]|0)==0){c[o+(r<<2)>>2]=56}else{x=(u|0)==(t|0);if((w|0)==(v|0)&x){c[o+(r<<2)>>2]=57;break}y=(w<<1|0)==(v|0);do{if(y&x){if(!p?(c[s+40>>2]|0)>>>0>2:0){c[o+(r<<2)>>2]=58;break}c[o+(r<<2)>>2]=59}else{if(y?(u<<1|0)==(t|0):0){if(!p?(c[s+40>>2]|0)>>>0>2:0){c[o+(r<<2)>>2]=60;a[g>>0]=1;break}c[o+(r<<2)>>2]=61;break}if(((v|0)%(w|0)|0|0)==0?((t|0)%(u|0)|0|0)==0:0){c[o+(r<<2)>>2]=62;a[f+(r+140)>>0]=(v|0)/(w|0)|0;a[f+(r+150)>>0]=(t|0)/(u|0)|0;break}c[(c[b>>2]|0)+20>>2]=38;Rc[c[c[b>>2]>>2]&1023](b)}}while(0);y=c[(c[e>>2]|0)+8>>2]|0;x=vba(c[h>>2]|0,c[l>>2]|0)|0;c[q+(r<<2)>>2]=id[y&511](b,1,x,c[m>>2]|0)|0}}while(0);u=r+1|0;if((u|0)>=(c[j>>2]|0)){break}r=u;s=s+84|0}i=d;return}function Saa(a){a=a|0;var b=0;b=c[a+416>>2]|0;c[b+92>>2]=c[a+276>>2];c[b+96>>2]=c[a+96>>2];return}function Taa(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;e=i;j=c[a+416>>2]|0;k=j+92|0;l=c[k>>2]|0;m=a+276|0;n=c[m>>2]|0;if((l|0)<(n|0)){o=l;p=n}else{n=a+36|0;if((c[n>>2]|0)>0){l=j+52|0;q=j+100|0;r=j+12|0;s=0;t=c[a+196>>2]|0;while(1){u=(c[b+(s<<2)>>2]|0)+((ca(c[q+(s<<2)>>2]|0,c[d>>2]|0)|0)<<2)|0;pd[c[l+(s<<2)>>2]&127](a,t,u,r+(s<<2)|0);s=s+1|0;if((s|0)>=(c[n>>2]|0)){break}else{t=t+84|0}}}c[k>>2]=0;o=0;p=c[m>>2]|0}t=p-o|0;p=j+96|0;n=c[p>>2]|0;s=t>>>0>n>>>0?n:t;t=c[g>>2]|0;n=h-t|0;h=s>>>0>n>>>0?n:s;Fc[c[(c[a+420>>2]|0)+4>>2]&63](a,j+12|0,o,f+(t<<2)|0,h);c[g>>2]=(c[g>>2]|0)+h;c[p>>2]=(c[p>>2]|0)-h;p=(c[k>>2]|0)+h|0;c[k>>2]=p;if((p|0)<(c[m>>2]|0)){i=e;return}c[d>>2]=(c[d>>2]|0)+1;i=e;return}function Uaa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[e>>2]=0;return}function Vaa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[e>>2]=d;return}function Waa(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;h=i;j=c[g>>2]|0;g=b+276|0;if((c[g>>2]|0)<=0){i=h;return}b=e+40|0;e=0;do{k=c[f+(e<<2)>>2]|0;l=c[j+(e<<2)>>2]|0;m=k+1|0;n=a[k>>0]|0;a[l>>0]=n;a[l+1>>0]=((d[m>>0]|0)+2+((n&255)*3|0)|0)>>>2;n=c[b>>2]|0;o=n+ -2|0;p=l+2|0;if((o|0)==0){q=l;r=m;s=p}else{t=n<<1;u=l;v=o;o=m;m=p;while(1){p=(d[o>>0]|0)*3|0;a[m>>0]=((d[o+ -1>>0]|0)+1+p|0)>>>2;o=o+1|0;a[u+3>>0]=(p+2+(d[o>>0]|0)|0)>>>2;v=v+ -1|0;if((v|0)==0){break}else{p=m;m=m+2|0;u=p}}q=l+(t+ -4)|0;r=k+(n+ -1)|0;s=l+(t+ -2)|0}u=a[r>>0]|0;a[s>>0]=((d[r+ -1>>0]|0)+1+((u&255)*3|0)|0)>>>2;a[q+3>>0]=u;e=e+1|0}while((e|0)<(c[g>>2]|0));i=h;return}function Xaa(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;g=c[f>>2]|0;f=b+276|0;h=c[f>>2]|0;if((h|0)<=0){i=d;return}j=b+92|0;b=h;h=0;while(1){k=c[g+(h<<2)>>2]|0;l=c[j>>2]|0;m=k+l|0;if((l|0)>0){l=c[e+(h<<2)>>2]|0;n=k;while(1){k=a[l>>0]|0;a[n>>0]=k;a[n+1>>0]=k;n=n+2|0;if(!(n>>>0<m>>>0)){break}else{l=l+1|0}}o=c[f>>2]|0}else{o=b}h=h+1|0;if((h|0)>=(o|0)){break}else{b=o}}i=d;return}function Yaa(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;h=i;j=c[g>>2]|0;g=b+276|0;if((c[g>>2]|0)<=0){i=h;return}b=e+40|0;e=0;k=0;while(1){l=f+(e<<2)|0;m=k;n=0;do{o=c[l>>2]|0;p=c[f+(((n|0)==0?-1:1)+e<<2)>>2]|0;q=c[j+(m<<2)>>2]|0;m=m+1|0;r=((d[o>>0]|0)*3|0)+(d[p>>0]|0)|0;s=((d[o+1>>0]|0)*3|0)+(d[p+1>>0]|0)|0;a[q>>0]=((r<<2)+8|0)>>>4;a[q+1>>0]=((r*3|0)+7+s|0)>>>4;t=c[b>>2]|0;u=t+ -2|0;v=q+2|0;if((u|0)==0){w=q;x=r;y=v;z=s}else{A=t<<1;t=q;B=u;u=o+2|0;o=p+2|0;p=r;r=v;v=s;while(1){C=((d[u>>0]|0)*3|0)+(d[o>>0]|0)|0;s=v*3|0;a[r>>0]=(p+8+s|0)>>>4;a[t+3>>0]=(s+7+C|0)>>>4;B=B+ -1|0;if((B|0)==0){break}else{s=v;D=r;u=u+1|0;o=o+1|0;r=r+2|0;v=C;p=s;t=D}}w=q+(A+ -4)|0;x=v;y=q+(A+ -2)|0;z=C}a[y>>0]=(x+8+(z*3|0)|0)>>>4;a[w+3>>0]=((z<<2)+7|0)>>>4;n=n+1|0}while((n|0)!=2);k=k+2|0;if((k|0)>=(c[g>>2]|0)){break}else{e=e+1|0}}i=h;return}function Zaa(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;g=c[f>>2]|0;f=b+276|0;if((c[f>>2]|0)<=0){i=d;return}h=b+92|0;b=0;j=0;while(1){k=c[g+(j<<2)>>2]|0;l=c[h>>2]|0;m=k+l|0;if((l|0)>0){n=c[e+(b<<2)>>2]|0;o=k;while(1){k=a[n>>0]|0;a[o>>0]=k;a[o+1>>0]=k;o=o+2|0;if(!(o>>>0<m>>>0)){break}else{n=n+1|0}}p=c[h>>2]|0}else{p=l}wba(g,j,g,j|1,1,p);j=j+2|0;if((j|0)>=(c[f>>2]|0)){break}else{b=b+1|0}}i=d;return}function _aa(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=i;h=c[b+416>>2]|0;j=c[f>>2]|0;f=c[d+4>>2]|0;d=a[h+140+f>>0]|0;k=d&255;l=a[h+f+150>>0]|0;f=l&255;h=b+276|0;if((c[h>>2]|0)<=0){i=g;return}m=b+92|0;b=(l&255)>1;l=f+ -1|0;n=d<<24>>24==0;d=0-k|0;o=((d|0)>-1?d:-1)+k+1|0;k=0;d=0;while(1){p=c[j+(d<<2)>>2]|0;q=c[m>>2]|0;r=p+q|0;if((q|0)>0){q=c[e+(k<<2)>>2]|0;s=p;while(1){if(n){t=s}else{f3a(s|0,a[q>>0]|0,o|0)|0;t=s+o|0}if(t>>>0<r>>>0){q=q+1|0;s=t}else{break}}}if(b){wba(j,d,j,d+1|0,l,c[m>>2]|0)}s=d+f|0;if((s|0)>=(c[h>>2]|0)){break}k=k+1|0;d=s}i=g;return}function $aa(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+4|0;c[d>>2]=0;e=tba()|0;f=nba(84)|0;if((f|0)==0){c[(c[a>>2]|0)+20>>2]=54;c[(c[a>>2]|0)+24>>2]=0;Rc[c[c[a>>2]>>2]&1023](a)}c[f>>2]=211;c[f+4>>2]=212;c[f+8>>2]=297;c[f+12>>2]=298;c[f+16>>2]=21;c[f+20>>2]=22;c[f+24>>2]=552;c[f+28>>2]=83;c[f+32>>2]=84;c[f+36>>2]=325;c[f+40>>2]=553;c[f+48>>2]=1e9;c[f+44>>2]=e;e=f+52|0;a=f+76|0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+20>>2]=0;c[a>>2]=84;c[d>>2]=f;i=b;return}function aba(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;e=i;f=c[a+4>>2]|0;if(d>>>0>999999984){c[(c[a>>2]|0)+20>>2]=54;c[(c[a>>2]|0)+24>>2]=1;Rc[c[c[a>>2]>>2]&1023](a)}g=d&7;if((g|0)==0){h=d}else{h=d+8-g|0}if(b>>>0>1){c[(c[a>>2]|0)+20>>2]=14;c[(c[a>>2]|0)+24>>2]=b;Rc[c[c[a>>2]>>2]&1023](a)}g=f+52+(b<<2)|0;d=c[g>>2]|0;a:do{if((d|0)==0){j=0;k=10}else{l=d;while(1){if(!((c[l+8>>2]|0)>>>0<h>>>0)){m=l;break a}n=c[l>>2]|0;if((n|0)==0){j=l;k=10;break}else{l=n}}}}while(0);do{if((k|0)==10){d=h+16|0;l=(j|0)==0;n=c[(l?726912:726920)+(b<<2)>>2]|0;o=999999984-h|0;p=n>>>0>o>>>0?o:n;n=d+p|0;o=nba(n)|0;if((o|0)==0){q=p;while(1){r=q>>>1;if(q>>>0<100){c[(c[a>>2]|0)+20>>2]=54;c[(c[a>>2]|0)+24>>2]=2;Rc[c[c[a>>2]>>2]&1023](a)}s=d+r|0;t=nba(s)|0;if((t|0)==0){q=r}else{u=s;v=t;w=r;break}}}else{u=n;v=o;w=p}q=f+76|0;c[q>>2]=(c[q>>2]|0)+u;c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=w+h;if(l){c[g>>2]=v;m=v;break}else{c[j>>2]=v;m=v;break}}}while(0);v=m+4|0;j=c[v>>2]|0;c[v>>2]=j+h;v=m+8|0;c[v>>2]=(c[v>>2]|0)-h;i=e;return m+16+j|0}function bba(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=c[a+4>>2]|0;if(d>>>0>999999984){c[(c[a>>2]|0)+20>>2]=54;c[(c[a>>2]|0)+24>>2]=3;Rc[c[c[a>>2]>>2]&1023](a)}g=d&7;if((g|0)==0){h=d}else{h=d+8-g|0}if(b>>>0>1){c[(c[a>>2]|0)+20>>2]=14;c[(c[a>>2]|0)+24>>2]=b;Rc[c[c[a>>2]>>2]&1023](a)}g=h+16|0;d=pba(g)|0;if((d|0)==0){c[(c[a>>2]|0)+20>>2]=54;c[(c[a>>2]|0)+24>>2]=4;Rc[c[c[a>>2]>>2]&1023](a)}a=f+76|0;c[a>>2]=(c[a>>2]|0)+g;g=f+60+(b<<2)|0;c[d>>2]=c[g>>2];c[d+4>>2]=h;c[d+8>>2]=0;c[g>>2]=d;i=e;return d+16|0}function cba(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f=i;g=c[a+4>>2]|0;h=999999984/(d>>>0)|0;if((h|0)==0){c[(c[a>>2]|0)+20>>2]=70;Rc[c[c[a>>2]>>2]&1023](a)}j=(h|0)<(e|0)?h:e;c[g+80>>2]=j;g=aba(a,b,e<<2)|0;if((e|0)==0){i=f;return g|0}h=~e;k=0;l=j;while(1){j=e-k|0;m=l;l=l>>>0<j>>>0?l:j;j=bba(a,b,ca(l,d)|0)|0;if((l|0)==0){n=k}else{o=~m;m=k+h|0;p=m>>>0<o>>>0?o:m;m=k;o=l;q=j;while(1){c[g+(m<<2)>>2]=q;o=o+ -1|0;if((o|0)==0){break}else{m=m+1|0;q=q+d|0}}n=k+ -1-p|0}if(!(n>>>0<e>>>0)){break}else{k=n}}i=f;return g|0}function dba(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=i;g=c[a+4>>2]|0;h=d<<7;j=999999984/(h>>>0)|0;if((j|0)==0){c[(c[a>>2]|0)+20>>2]=70;Rc[c[c[a>>2]>>2]&1023](a)}k=(j|0)<(e|0)?j:e;c[g+80>>2]=k;g=aba(a,b,e<<2)|0;if((e|0)==0){i=f;return g|0}j=~e;l=0;m=k;while(1){k=e-l|0;n=m;m=m>>>0<k>>>0?m:k;k=bba(a,b,ca(h,m)|0)|0;if((m|0)==0){o=l}else{p=~n;n=l+j|0;q=n>>>0<p>>>0?p:n;n=l;p=m;r=k;while(1){c[g+(n<<2)>>2]=r;p=p+ -1|0;if((p|0)==0){break}else{n=n+1|0;r=r+(d<<7)|0}}o=l+ -1-q|0}if(!(o>>>0<e>>>0)){break}else{l=o}}i=f;return g|0}function eba(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0;j=i;k=c[b+4>>2]|0;if((d|0)!=1){c[(c[b>>2]|0)+20>>2]=14;c[(c[b>>2]|0)+24>>2]=d;Rc[c[c[b>>2]>>2]&1023](b)}l=aba(b,d,120)|0;c[l>>2]=0;c[l+4>>2]=g;c[l+8>>2]=f;c[l+12>>2]=h;a[l+32>>0]=e;a[l+34>>0]=0;e=k+68|0;c[l+36>>2]=c[e>>2];c[e>>2]=l;i=j;return l|0}function fba(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0;j=i;k=c[b+4>>2]|0;if((d|0)!=1){c[(c[b>>2]|0)+20>>2]=14;c[(c[b>>2]|0)+24>>2]=d;Rc[c[c[b>>2]>>2]&1023](b)}l=aba(b,d,120)|0;c[l>>2]=0;c[l+4>>2]=g;c[l+8>>2]=f;c[l+12>>2]=h;a[l+32>>0]=e;a[l+34>>0]=0;e=k+72|0;c[l+36>>2]=c[e>>2];c[e>>2]=l;i=j;return l|0}function gba(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;d=i;e=c[b+4>>2]|0;f=c[e+68>>2]|0;g=(f|0)==0;if(g){h=0;j=0}else{k=0;l=0;m=f;while(1){if((c[m>>2]|0)==0){n=c[m+8>>2]|0;o=(ca(n,c[m+12>>2]|0)|0)+l|0;p=(ca(c[m+4>>2]|0,n)|0)+k|0;q=o}else{p=k;q=l}m=c[m+36>>2]|0;if((m|0)==0){h=p;j=q;break}else{k=p;l=q}}}q=e+72|0;l=c[q>>2]|0;if((l|0)==0){r=h;s=j}else{p=l;k=h;h=j;while(1){if((c[p>>2]|0)==0){j=c[p+8>>2]|0;m=(ca(c[p+12>>2]<<7,j)|0)+h|0;t=(ca(j<<7,c[p+4>>2]|0)|0)+k|0;u=m}else{t=k;u=h}p=c[p+36>>2]|0;if((p|0)==0){r=t;s=u;break}else{k=t;h=u}}}if((s|0)<1){i=d;return}u=rba(s,r,c[e+76>>2]|0)|0;if((u|0)<(r|0)){r=(u|0)/(s|0)|0;v=(r|0)<1?1:r}else{v=1e9}if(g){w=l}else{l=e+80|0;g=f;do{if((c[g>>2]|0)==0){f=c[g+4>>2]|0;r=c[g+12>>2]|0;if(((((f+ -1|0)>>>0)/(r>>>0)|0)+1|0)>(v|0)){s=g+16|0;c[s>>2]=ca(r,v)|0;r=g+8|0;sba(b,ca(c[r>>2]|0,f)|0);a[g+34>>0]=1;x=r;y=c[s>>2]|0}else{c[g+16>>2]=f;x=g+8|0;y=f}c[g>>2]=cba(b,1,c[x>>2]|0,y)|0;c[g+20>>2]=c[l>>2];c[g+24>>2]=0;c[g+28>>2]=0;a[g+33>>0]=0}g=c[g+36>>2]|0}while((g|0)!=0);w=c[q>>2]|0}if((w|0)==0){i=d;return}q=e+80|0;e=w;do{if((c[e>>2]|0)==0){w=c[e+4>>2]|0;g=c[e+12>>2]|0;if(((((w+ -1|0)>>>0)/(g>>>0)|0)+1|0)>(v|0)){l=e+16|0;c[l>>2]=ca(g,v)|0;g=e+8|0;sba(b,ca(w<<7,c[g>>2]|0)|0);a[e+34>>0]=1;z=g;A=c[l>>2]|0}else{c[e+16>>2]=w;z=e+8|0;A=w}c[e>>2]=dba(b,1,c[z>>2]|0,A)|0;c[e+20>>2]=c[q>>2];c[e+24>>2]=0;c[e+28>>2]=0;a[e+33>>0]=0}e=c[e+36>>2]|0}while((e|0)!=0);i=d;return}function hba(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;h=i;j=f+e|0;if(!((!(j>>>0>(c[d+4>>2]|0)>>>0)?!((c[d+12>>2]|0)>>>0<f>>>0):0)?(c[d>>2]|0)!=0:0)){c[(c[b>>2]|0)+20>>2]=22;Rc[c[c[b>>2]>>2]&1023](b)}f=d+24|0;k=c[f>>2]|0;if(!(!(k>>>0>e>>>0)?!(j>>>0>((c[d+16>>2]|0)+k|0)>>>0):0)){if((a[d+34>>0]|0)==0){c[(c[b>>2]|0)+20>>2]=69;Rc[c[c[b>>2]>>2]&1023](b)}k=d+33|0;if((a[k>>0]|0)!=0){mba(b,d,1);a[k>>0]=0}if((c[f>>2]|0)>>>0<e>>>0){l=e}else{k=j-(c[d+16>>2]|0)|0;l=(k|0)<0?0:k}c[f>>2]=l;mba(b,d,0)}l=d+28|0;k=c[l>>2]|0;do{if(k>>>0<j>>>0){if(k>>>0<e>>>0){if(g<<24>>24==0){m=0;n=e}else{c[(c[b>>2]|0)+20>>2]=22;Rc[c[c[b>>2]>>2]&1023](b);o=e;p=18}}else{o=k;p=18}if((p|0)==18){if(g<<24>>24==0){m=0;n=o}else{c[l>>2]=j;m=1;n=o}}if((a[d+32>>0]|0)==0){if(m){break}c[(c[b>>2]|0)+20>>2]=22;Rc[c[c[b>>2]>>2]&1023](b);break}q=c[d+8>>2]|0;r=c[f>>2]|0;s=n-r|0;t=j-r|0;if(s>>>0<t>>>0){r=s;do{yba(c[(c[d>>2]|0)+(r<<2)>>2]|0,q);r=r+1|0}while((r|0)!=(t|0))}}}while(0);if(g<<24>>24==0){u=c[d>>2]|0;v=c[f>>2]|0;w=e-v|0;x=u+(w<<2)|0;i=h;return x|0}a[d+33>>0]=1;u=c[d>>2]|0;v=c[f>>2]|0;w=e-v|0;x=u+(w<<2)|0;i=h;return x|0}function iba(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;h=i;j=f+e|0;if(!((!(j>>>0>(c[d+4>>2]|0)>>>0)?!((c[d+12>>2]|0)>>>0<f>>>0):0)?(c[d>>2]|0)!=0:0)){c[(c[b>>2]|0)+20>>2]=22;Rc[c[c[b>>2]>>2]&1023](b)}f=d+24|0;k=c[f>>2]|0;if(!(!(k>>>0>e>>>0)?!(j>>>0>((c[d+16>>2]|0)+k|0)>>>0):0)){if((a[d+34>>0]|0)==0){c[(c[b>>2]|0)+20>>2]=69;Rc[c[c[b>>2]>>2]&1023](b)}k=d+33|0;if((a[k>>0]|0)!=0){lba(b,d,1);a[k>>0]=0}if((c[f>>2]|0)>>>0<e>>>0){l=e}else{k=j-(c[d+16>>2]|0)|0;l=(k|0)<0?0:k}c[f>>2]=l;lba(b,d,0)}l=d+28|0;k=c[l>>2]|0;do{if(k>>>0<j>>>0){if(k>>>0<e>>>0){if(g<<24>>24==0){m=0;n=e}else{c[(c[b>>2]|0)+20>>2]=22;Rc[c[c[b>>2]>>2]&1023](b);o=e;p=18}}else{o=k;p=18}if((p|0)==18){if(g<<24>>24==0){m=0;n=o}else{c[l>>2]=j;m=1;n=o}}if((a[d+32>>0]|0)==0){if(m){break}c[(c[b>>2]|0)+20>>2]=22;Rc[c[c[b>>2]>>2]&1023](b);break}q=c[d+8>>2]<<7;r=c[f>>2]|0;s=n-r|0;t=j-r|0;if(s>>>0<t>>>0){r=s;do{yba(c[(c[d>>2]|0)+(r<<2)>>2]|0,q);r=r+1|0}while((r|0)!=(t|0))}}}while(0);if(g<<24>>24==0){u=c[d>>2]|0;v=c[f>>2]|0;w=e-v|0;x=u+(w<<2)|0;i=h;return x|0}a[d+33>>0]=1;u=c[d>>2]|0;v=c[f>>2]|0;w=e-v|0;x=u+(w<<2)|0;i=h;return x|0}function jba(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=c[b+4>>2]|0;if(!(d>>>0>1)){if((d|0)==1){g=f+68|0;h=c[g>>2]|0;if((h|0)!=0){j=h;do{h=j+34|0;if((a[h>>0]|0)!=0){a[h>>0]=0;Ic[c[j+48>>2]&511](b,j+40|0)}j=c[j+36>>2]|0}while((j|0)!=0)}c[g>>2]=0;g=f+72|0;j=c[g>>2]|0;if((j|0)!=0){h=j;do{j=h+34|0;if((a[j>>0]|0)!=0){a[j>>0]=0;Ic[c[h+48>>2]&511](b,h+40|0)}h=c[h+36>>2]|0}while((h|0)!=0)}c[g>>2]=0}}else{c[(c[b>>2]|0)+20>>2]=14;c[(c[b>>2]|0)+24>>2]=d;Rc[c[c[b>>2]>>2]&1023](b)}b=f+60+(d<<2)|0;g=c[b>>2]|0;c[b>>2]=0;if((g|0)!=0){b=f+76|0;h=g;do{g=h;h=c[h>>2]|0;j=(c[g+4>>2]|0)+16+(c[g+8>>2]|0)|0;qba(g,j);c[b>>2]=(c[b>>2]|0)-j}while((h|0)!=0)}h=f+52+(d<<2)|0;d=c[h>>2]|0;c[h>>2]=0;if((d|0)==0){i=e;return}h=f+76|0;f=d;do{d=f;f=c[f>>2]|0;b=(c[d+4>>2]|0)+16+(c[d+8>>2]|0)|0;oba(d,b);c[h>>2]=(c[h>>2]|0)-b}while((f|0)!=0);i=e;return}function kba(a){a=a|0;var b=0,d=0;b=i;jba(a,1);jba(a,0);d=a+4|0;oba(c[d>>2]|0,84);c[d>>2]=0;i=b;return}function lba(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;e=i;f=c[b+8>>2]<<7;g=b+24|0;h=b+20|0;j=b+16|0;k=c[j>>2]|0;if((k|0)<=0){i=e;return}l=c[g>>2]|0;m=ca(l,f)|0;n=b+28|0;o=b+4|0;p=d<<24>>24==0;d=b+40|0;q=b+44|0;r=k;k=c[h>>2]|0;s=l;l=m;m=0;while(1){t=r-m|0;u=(k|0)<(t|0)?k:t;t=s+m|0;v=(c[n>>2]|0)-t|0;w=(u|0)<(v|0)?u:v;v=(c[o>>2]|0)-t|0;t=(w|0)<(v|0)?w:v;if((t|0)<1){x=9;break}v=ca(t,f)|0;if(p){Fc[c[d>>2]&63](a,d,c[(c[b>>2]|0)+(m<<2)>>2]|0,l,v)}else{Fc[c[q>>2]&63](a,d,c[(c[b>>2]|0)+(m<<2)>>2]|0,l,v)}t=c[h>>2]|0;w=t+m|0;u=c[j>>2]|0;if((w|0)>=(u|0)){x=9;break}r=u;k=t;s=c[g>>2]|0;l=v+l|0;m=w}if((x|0)==9){i=e;return}}function mba(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;e=i;f=c[b+8>>2]|0;g=b+24|0;h=b+20|0;j=b+16|0;k=c[j>>2]|0;if((k|0)<=0){i=e;return}l=c[g>>2]|0;m=ca(l,f)|0;n=b+28|0;o=b+4|0;p=d<<24>>24==0;d=b+40|0;q=b+44|0;r=k;k=c[h>>2]|0;s=l;l=m;m=0;while(1){t=r-m|0;u=(k|0)<(t|0)?k:t;t=s+m|0;v=(c[n>>2]|0)-t|0;w=(u|0)<(v|0)?u:v;v=(c[o>>2]|0)-t|0;t=(w|0)<(v|0)?w:v;if((t|0)<1){x=9;break}v=ca(t,f)|0;if(p){Fc[c[d>>2]&63](a,d,c[(c[b>>2]|0)+(m<<2)>>2]|0,l,v)}else{Fc[c[q>>2]&63](a,d,c[(c[b>>2]|0)+(m<<2)>>2]|0,l,v)}t=c[h>>2]|0;w=t+m|0;u=c[j>>2]|0;if((w|0)>=(u|0)){x=9;break}r=u;k=t;s=c[g>>2]|0;l=v+l|0;m=w}if((x|0)==9){i=e;return}}function nba(a){a=a|0;var b=0,c=0;b=i;c=qna(a)|0;i=b;return c|0}function oba(a,b){a=a|0;b=b|0;b=i;sna(a);i=b;return}function pba(a){a=a|0;var b=0,c=0;b=i;c=qna(a)|0;i=b;return c|0}function qba(a,b){a=a|0;b=b|0;b=i;sna(a);i=b;return}function rba(a,b,c){a=a|0;b=b|0;c=c|0;return b|0}function sba(a,b){a=a|0;b=b|0;b=i;c[(c[a>>2]|0)+20>>2]=49;Rc[c[c[a>>2]>>2]&1023](a);i=b;return}function tba(){return 0}function uba(a,b){a=a|0;b=b|0;return(a+ -1+b|0)/(b|0)|0|0}function vba(a,b){a=a|0;b=b|0;var c=0;c=a+ -1+b|0;return c-((c|0)%(b|0)|0)|0}function wba(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0;h=i;if((f|0)<=0){i=h;return}j=d+(e<<2)|0;e=a+(b<<2)|0;b=f;while(1){c3a(c[j>>2]|0,c[e>>2]|0,g|0)|0;b=b+ -1|0;if((b|0)<=0){break}else{j=j+4|0;e=e+4|0}}i=h;return}function xba(b,c){b=b|0;c=c|0;var d=0,e=0;d=i;e=c+0|0;c=b+0|0;b=e+128|0;do{a[e>>0]=a[c>>0]|0;e=e+1|0;c=c+1|0}while((e|0)<(b|0));i=d;return}function yba(a,b){a=a|0;b=b|0;var c=0;c=i;f3a(a|0,0,b|0)|0;i=c;return}function zba(){var a=0,b=0,d=0,e=0,f=0;a=i;b=u2a(12)|0;if((b|0)==0){d=0;i=a;return d|0}e=b;c[e>>2]=0;c[e+4>>2]=0;c[b+4>>2]=10;e=u2a(40)|0;c[b+8>>2]=e;if((e|0)==0){v2a(b);d=0;i=a;return d|0}else{f=e+0|0;e=f+40|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(e|0));d=b;i=a;return d|0}return 0}function Aba(a){a=a|0;var b=0,d=0;b=i;if((a|0)==0){i=b;return}d=c[a+8>>2]|0;if((d|0)!=0){v2a(d)}v2a(a);i=b;return}function Bba(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;e=a+4|0;f=c[e>>2]|0;g=c[a>>2]|0;do{if((f|0)==(g|0)){h=f+10|0;c[e>>2]=h;j=a+8|0;k=x2a(c[j>>2]|0,h<<2)|0;if((k|0)!=0){c[j>>2]=k;l=k;m=c[a>>2]|0;break}v2a(c[j>>2]|0);c[e>>2]=0;c[a>>2]=0;Jb(727248,52,1,c[q>>2]|0)|0;i=d;return}else{l=c[a+8>>2]|0;m=g}}while(0);c[l+(m<<2)>>2]=b;c[a>>2]=(c[a>>2]|0)+1;i=d;return}function Cba(a){a=a|0;return a|0}function Dba(a){a=a|0;return a|0}function Eba(a){a=a|0;c[a>>2]=0;return}function Fba(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0;e=i;i=i+16|0;f=e;if((d|0)==0){i=e;return}h=0;j=b;b=a;while(1){wY(b,f,2);g[j>>2]=+((c[f>>2]|0)>>>0);h=h+1|0;if((h|0)==(d|0)){break}else{j=j+4|0;b=b+2|0}}i=e;return}function Gba(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0;e=i;i=i+16|0;f=e;if((d|0)==0){i=e;return}h=0;j=b;b=a;while(1){wY(b,f,4);g[j>>2]=+((c[f>>2]|0)>>>0);h=h+1|0;if((h|0)==(d|0)){break}else{j=j+4|0;b=b+4|0}}i=e;return}function Hba(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,h=0;d=i;i=i+16|0;e=d;if((c|0)==0){i=d;return}f=0;h=b;b=a;while(1){yY(b,e);g[h>>2]=+g[e>>2];f=f+1|0;if((f|0)==(c|0)){break}else{h=h+4|0;b=b+4|0}}i=d;return}function Iba(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,j=0;d=i;i=i+16|0;e=d;if((c|0)==0){i=d;return}f=0;j=b;b=a;while(1){xY(b,e);g[j>>2]=+h[e>>3];f=f+1|0;if((f|0)==(c|0)){break}else{j=j+4|0;b=b+8|0}}i=d;return}function Jba(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e;if((d|0)==0){i=e;return}g=0;h=b;b=a;while(1){wY(b,f,2);c[h>>2]=c[f>>2];g=g+1|0;if((g|0)==(d|0)){break}else{h=h+4|0;b=b+2|0}}i=e;return}function Kba(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e;if((d|0)==0){i=e;return}g=0;h=b;b=a;while(1){wY(b,f,4);c[h>>2]=c[f>>2];g=g+1|0;if((g|0)==(d|0)){break}else{h=h+4|0;b=b+4|0}}i=e;return}function Lba(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0;e=i;i=i+16|0;f=e;if((d|0)==0){i=e;return}h=0;j=b;b=a;while(1){yY(b,f);c[j>>2]=~~+g[f>>2];h=h+1|0;if((h|0)==(d|0)){break}else{j=j+4|0;b=b+4|0}}i=e;return}function Mba(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0;e=i;i=i+16|0;f=e;if((d|0)==0){i=e;return}g=0;j=b;b=a;while(1){xY(b,f);c[j>>2]=~~+h[f>>3];g=g+1|0;if((g|0)==(d|0)){break}else{j=j+4|0;b=b+8|0}}i=e;return}function Nba(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;g=i;i=i+32|0;h=g;j=g+16|0;k=g+12|0;l=g+8|0;c[k>>2]=0;if((d|0)==0){_a(731616,727592,3964,732544)}if((b|0)==0){_a(727656,727592,3965,732544)}if((f|0)==0){_a(727712,727592,3966,732544)}if((e|0)!=8){RY(f,1,732568,h);m=0;i=g;return m|0}e=b+196|0;wY(d,e,2);n=c[e>>2]|0;o=c[b+112>>2]|0;if(!(n>>>0<(ca(c[b+116>>2]|0,o)|0)>>>0)){c[h>>2]=n;RY(f,1,732600,h);m=0;i=g;return m|0}p=c[b+156>>2]|0;q=(n>>>0)%(o>>>0)|0;r=(n>>>0)/(o>>>0)|0;wY(d+2|0,j,4);o=d+6|0;s=c[j>>2]|0;do{if(!((s|0)!=0&s>>>0<14)){if((s|0)==0){RY(f,4,732728,h);c[b+72>>2]=1}}else{if((s|0)==12){c[h>>2]=12;RY(f,2,732624,h);break}c[h>>2]=s;RY(f,1,732664,h);m=0;i=g;return m|0}}while(0);wY(o,l,1);wY(d+7|0,k,1);d=c[k>>2]|0;o=p+(n*5632|0)+5580|0;n=c[o>>2]|0;do{if((d|0)==0){t=n;u=0}else{p=c[l>>2]|0;if((n|0)==0|p>>>0<n>>>0){v=d}else{c[h>>2]=p;c[h+4>>2]=n;RY(f,1,732840,h);j=d+1|0;c[k>>2]=j;v=j}if(p>>>0<v>>>0){c[o>>2]=v;t=v;u=v;break}c[h>>2]=p;c[h+4>>2]=v;RY(f,1,732944,h);c[b+72>>2]=1;m=0;i=g;return m|0}}while(0);if((t|0)!=0?(t|0)==((c[l>>2]|0)+1|0):0){t=b+76|0;a[t>>0]=a[t>>0]&-2}if((c[b+72>>2]|0)==0){c[b+24>>2]=s+ -12}else{c[b+24>>2]=0}c[b+8>>2]=16;s=c[b+60>>2]|0;do{if(!((s|0)==-1)){if((s|0)>-1){t=b+76|0;a[t>>0]=((c[e>>2]|0)!=(s|0)&1)<<2&255|a[t>>0]&-5;break}else{_a(733056,727592,4120,732544)}}else{if((!(q>>>0<(c[b+28>>2]|0)>>>0)?q>>>0<(c[b+36>>2]|0)>>>0:0)?!(r>>>0<(c[b+32>>2]|0)>>>0):0){w=(r>>>0>=(c[b+40>>2]|0)>>>0&1)<<2&255}else{w=4}t=b+76|0;a[t>>0]=a[t>>0]&-5|w}}while(0);w=b+192|0;b=c[w>>2]|0;if((b|0)==0){m=1;i=g;return m|0}r=c[b+40>>2]|0;if((r|0)==0){_a(733120,727592,4128,732544)}b=c[e>>2]|0;c[r+(b*40|0)>>2]=b;b=c[l>>2]|0;c[(c[(c[w>>2]|0)+40>>2]|0)+((c[e>>2]|0)*40|0)+12>>2]=b;l=c[e>>2]|0;r=c[(c[w>>2]|0)+40>>2]|0;if((u|0)!=0){c[r+(l*40|0)+4>>2]=u;c[(c[(c[w>>2]|0)+40>>2]|0)+((c[e>>2]|0)*40|0)+8>>2]=u;q=c[e>>2]|0;s=(c[w>>2]|0)+40|0;t=c[(c[s>>2]|0)+(q*40|0)+16>>2]|0;if((t|0)==0){v=w2a(u,24)|0;c[(c[s>>2]|0)+(q*40|0)+16>>2]=v;m=1;i=g;return m|0}v=x2a(t,u*24|0)|0;if((v|0)==0){v2a(c[(c[(c[w>>2]|0)+40>>2]|0)+((c[e>>2]|0)*40|0)+16>>2]|0);c[(c[(c[w>>2]|0)+40>>2]|0)+((c[e>>2]|0)*40|0)+16>>2]=0;RY(f,1,733160,h);m=0;i=g;return m|0}else{c[(c[(c[w>>2]|0)+40>>2]|0)+((c[e>>2]|0)*40|0)+16>>2]=v;m=1;i=g;return m|0}}if((c[r+(l*40|0)+16>>2]|0)==0){c[r+(l*40|0)+8>>2]=10;v=c[e>>2]|0;u=(c[w>>2]|0)+40|0;t=w2a(c[(c[u>>2]|0)+(v*40|0)+8>>2]|0,24)|0;c[(c[u>>2]|0)+(v*40|0)+16>>2]=t;x=c[(c[w>>2]|0)+40>>2]|0;y=c[e>>2]|0}else{x=r;y=l}l=x+(y*40|0)+8|0;if(b>>>0<(c[l>>2]|0)>>>0){m=1;i=g;return m|0}c[l>>2]=b+1;b=c[e>>2]|0;l=c[(c[w>>2]|0)+40>>2]|0;y=x2a(c[l+(b*40|0)+16>>2]|0,(c[l+(b*40|0)+8>>2]|0)*24|0)|0;if((y|0)==0){v2a(c[(c[(c[w>>2]|0)+40>>2]|0)+((c[e>>2]|0)*40|0)+16>>2]|0);c[(c[(c[w>>2]|0)+40>>2]|0)+((c[e>>2]|0)*40|0)+16>>2]=0;c[(c[(c[w>>2]|0)+40>>2]|0)+((c[e>>2]|0)*40|0)+8>>2]=0;RY(f,1,733160,h);m=0;i=g;return m|0}else{c[(c[(c[w>>2]|0)+40>>2]|0)+((c[e>>2]|0)*40|0)+16>>2]=y;m=1;i=g;return m|0}return 0}function Oba(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=i;i=i+16|0;g=f;h=f+8|0;j=f+4|0;c[h>>2]=d;if((b|0)==0){_a(731616,727592,2410,735160)}if((a|0)==0){_a(727656,727592,2411,735160)}if((e|0)==0){_a(727712,727592,2412,735160)}k=a+80|0;l=c[k>>2]|0;m=a+8|0;if((c[m>>2]|0)==16){n=(c[a+156>>2]|0)+((c[a+196>>2]|0)*5632|0)|0}else{n=c[a+12>>2]|0}if(d>>>0<5){RY(e,1,735184,g);o=0;i=f;return o|0}wY(b,n,1);wY(b+1|0,j,1);c[n+4>>2]=c[j>>2];j=n+8|0;wY(b+2|0,j,2);p=c[a+164>>2]|0;if((p|0)==0){c[n+12>>2]=c[j>>2]}else{c[n+12>>2]=p}wY(b+4|0,n+16|0,1);p=b+5|0;c[h>>2]=d+ -5;d=l+16|0;if((c[d>>2]|0)!=0){l=n+5576|0;b=0;do{c[(c[l>>2]|0)+(b*1080|0)>>2]=c[n>>2]&1;b=b+1|0}while(b>>>0<(c[d>>2]|0)>>>0)}if((Mca(a,0,p,h,e)|0)==0){RY(e,1,735184,g);o=0;i=f;return o|0}if((c[h>>2]|0)!=0){RY(e,1,735184,g);o=0;i=f;return o|0}if((c[m>>2]|0)==16){q=(c[a+156>>2]|0)+((c[a+196>>2]|0)*5632|0)|0}else{q=c[a+12>>2]|0}a=c[q+5576>>2]|0;q=a+4|0;m=c[q>>2]|0;g=m<<2;if(!((c[(c[k>>2]|0)+16>>2]|0)>>>0>1)){o=1;i=f;return o|0}e=a+8|0;h=a+12|0;p=a+16|0;d=a+20|0;b=a+812|0;n=a+944|0;c[a+1084>>2]=m;c[a+1088>>2]=c[e>>2];c[a+1092>>2]=c[h>>2];c[a+1096>>2]=c[p>>2];c[a+1100>>2]=c[d>>2];c3a(a+1892|0,b|0,g|0)|0;c3a(a+2024|0,n|0,g|0)|0;if((c[(c[k>>2]|0)+16>>2]|0)>>>0>2){r=a;s=m;t=3}else{o=1;i=f;return o|0}while(1){c[r+2164>>2]=s;c[r+2168>>2]=c[e>>2];c[r+2172>>2]=c[h>>2];c[r+2176>>2]=c[p>>2];c[r+2180>>2]=c[d>>2];c3a(r+2972|0,b|0,g|0)|0;c3a(r+3104|0,n|0,g|0)|0;if(!(t>>>0<(c[(c[k>>2]|0)+16>>2]|0)>>>0)){o=1;break}r=r+1080|0;s=c[q>>2]|0;t=t+1|0}i=f;return o|0}function Pba(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;i=i+16|0;g=f;h=f+8|0;j=f+4|0;c[h>>2]=d;if((b|0)==0){_a(731616,727592,2616,734688)}if((a|0)==0){_a(727656,727592,2617,734688)}if((e|0)==0){_a(727712,727592,2618,734688)}if((c[a+8>>2]|0)==16){k=(c[a+156>>2]|0)+((c[a+196>>2]|0)*5632|0)|0}else{k=c[a+12>>2]|0}l=(c[a+80>>2]|0)+16|0;m=(c[l>>2]|0)>>>0<257?1:2;n=m+1|0;if(n>>>0>d>>>0){RY(e,1,734712,g);o=0;i=f;return o|0}c[h>>2]=d-n;wY(b,j,m);d=c[j>>2]|0;if(!(d>>>0<(c[l>>2]|0)>>>0)){RY(e,1,734744,g);o=0;i=f;return o|0}wY(b+m|0,(c[k+5576>>2]|0)+(d*1080|0)|0,1);if((Mca(a,d,b+n|0,h,e)|0)==0){RY(e,1,734712,g);o=0;i=f;return o|0}if((c[h>>2]|0)==0){o=1;i=f;return o|0}RY(e,1,734712,g);o=0;i=f;return o|0}function Qba(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;i=i+16|0;g=f;h=f+12|0;if((b|0)==0){_a(731616,727592,4516,732424)}if((a|0)==0){_a(727656,727592,4517,732424)}if((e|0)==0){_a(727712,727592,4518,732424)}j=c[(c[a+80>>2]|0)+16>>2]|0;k=j>>>0<257?1:2;if((k+2|0)!=(d|0)){RY(e,1,732448,g);l=0;i=f;return l|0}if((c[a+8>>2]|0)==16){m=(c[a+156>>2]|0)+((c[a+196>>2]|0)*5632|0)|0}else{m=c[a+12>>2]|0}wY(b,h,k);wY(b+k|0,f+8|0,1);a=c[h>>2]|0;if(a>>>0<j>>>0){wY(b+(k+1)|0,(c[m+5576>>2]|0)+(a*1080|0)+808|0,1);l=1;i=f;return l|0}else{c[g>>2]=a;c[g+4>>2]=j;RY(e,1,732480,g);l=0;i=f;return l|0}return 0}function Rba(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+16|0;g=f;h=f+4|0;c[h>>2]=d;if((b|0)==0){_a(731616,727592,2727,734632)}if((a|0)==0){_a(727656,727592,2728,734632)}if((e|0)==0){_a(727712,727592,2729,734632)}if((Lca(a,0,b,h,e)|0)==0){RY(e,1,734656,g);j=0;i=f;return j|0}if((c[h>>2]|0)!=0){RY(e,1,734656,g);j=0;i=f;return j|0}if((c[a+8>>2]|0)==16){k=(c[a+156>>2]|0)+((c[a+196>>2]|0)*5632|0)|0}else{k=c[a+12>>2]|0}g=c[k+5576>>2]|0;k=a+80|0;if(!((c[(c[k>>2]|0)+16>>2]|0)>>>0>1)){j=1;i=f;return j|0}a=g+24|0;e=g+804|0;h=g+28|0;b=g;g=1;while(1){c[b+1104>>2]=c[a>>2];c[b+1884>>2]=c[e>>2];c3a(b+1108|0,h|0,776)|0;g=g+1|0;if(!(g>>>0<(c[(c[k>>2]|0)+16>>2]|0)>>>0)){j=1;break}else{b=b+1080|0}}i=f;return j|0}function Sba(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;i=i+16|0;g=f;h=f+12|0;j=f+8|0;c[h>>2]=d;if((b|0)==0){_a(731616,727592,2860,734224)}if((a|0)==0){_a(727656,727592,2861,734224)}if((e|0)==0){_a(727712,727592,2862,734224)}k=a+80|0;do{if((c[(c[k>>2]|0)+16>>2]|0)>>>0<257){if((d|0)!=0){wY(b,j,1);l=b+1|0;m=d+ -1|0;break}RY(e,1,734248,g);n=0;i=f;return n|0}else{if(!(d>>>0<2)){wY(b,j,2);l=b+2|0;m=d+ -2|0;break}RY(e,1,734248,g);n=0;i=f;return n|0}}while(0);c[h>>2]=m;m=c[j>>2]|0;j=c[(c[k>>2]|0)+16>>2]|0;if(!(m>>>0<j>>>0)){c[g>>2]=m;c[g+4>>2]=j;RY(e,1,734280,g);n=0;i=f;return n|0}if((Lca(a,m,l,h,e)|0)==0){RY(e,1,734248,g);n=0;i=f;return n|0}if((c[h>>2]|0)==0){n=1;i=f;return n|0}RY(e,1,734248,g);n=0;i=f;return n|0}function Tba(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;g=i;i=i+16|0;h=g;j=g+4|0;if((d|0)==0){_a(731616,727592,3144,734144)}if((b|0)==0){_a(727656,727592,3145,734144)}if((f|0)==0){_a(727712,727592,3146,734144)}k=c[(c[b+80>>2]|0)+16>>2]|0;l=k>>>0<257?1:2;m=(l<<1)+5|0;n=(e>>>0)/(m>>>0)|0;if(!((n|0)!=0&((e>>>0)%(m>>>0)|0|0)==0)){RY(f,1,734168,h);o=0;i=g;return o|0}if((c[b+8>>2]|0)==16){p=(c[b+156>>2]|0)+((c[b+196>>2]|0)*5632|0)|0}else{p=c[b+12>>2]|0}b=p+5628|0;m=a[b>>0]|0;if((m&2)==0){q=0}else{q=(c[p+420>>2]|0)+1|0}e=q+n|0;if(e>>>0>31){c[h>>2]=e;RY(f,1,734200,h);o=0;i=g;return o|0}a[b>>0]=m|2;if(q>>>0<e>>>0){m=l+1|0;b=p+8|0;h=l+3|0;f=l|4;n=f+l|0;r=n+1|0;s=d;d=q;t=p+(q*148|0)+424|0;while(1){wY(s,t,1);wY(s+1|0,t+4|0,l);q=t+8|0;wY(s+m|0,q,2);u=c[q>>2]|0;v=c[b>>2]|0;c[q>>2]=u>>>0<v>>>0?u:v;wY(s+h|0,t+12|0,1);v=t+16|0;wY(s+f|0,v,l);wY(s+n|0,j,1);c[t+36>>2]=c[j>>2];u=c[v>>2]|0;c[v>>2]=u>>>0<k>>>0?u:k;d=d+1|0;if(!(d>>>0<e>>>0)){break}else{s=s+r|0;t=t+148|0}}}c[p+420>>2]=e+ -1;o=1;i=g;return o|0}function Uba(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,H=0,I=0;g=i;i=i+32|0;h=g;j=g+16|0;k=g+12|0;if((b|0)==0){_a(727656,727592,1925,735240)}if((f|0)==0){_a(727712,727592,1926,735240)}if((d|0)==0){_a(731616,727592,1927,735240)}l=c[b+80>>2]|0;m=b+88|0;if(e>>>0<36){RY(f,1,735264,h);n=0;i=g;return n|0}o=e+ -36|0;e=(o>>>0)/3|0;if(((o>>>0)%3|0|0)!=0){RY(f,1,735264,h);n=0;i=g;return n|0}wY(d,j,2);c[m>>2]=c[j>>2];o=l+8|0;wY(d+2|0,o,4);p=l+12|0;wY(d+6|0,p,4);wY(d+10|0,l,4);q=l+4|0;wY(d+14|0,q,4);r=b+100|0;wY(d+18|0,r,4);s=b+104|0;wY(d+22|0,s,4);t=b+92|0;wY(d+26|0,t,4);u=b+96|0;wY(d+30|0,u,4);wY(d+34|0,j,2);v=d+36|0;d=c[j>>2]|0;if(!(d>>>0<16385)){c[h>>2]=d;RY(f,1,735296,h);n=0;i=g;return n|0}j=d&65535;d=l+16|0;c[d>>2]=j;if((j|0)!=(e|0)){c[h>>2]=j;c[h+4>>2]=e;RY(f,1,735360,h);n=0;i=g;return n|0}j=c[l>>2]|0;w=c[o>>2]|0;if(!(j>>>0>w>>>0)){x=c[q>>2]|0;y=c[p>>2]|0;if(x>>>0>y>>>0){z=x;A=y}else{x=c[r>>2]|0;B=c[s>>2]|0;if((ca(B,x)|0)==0){c[h>>2]=x;c[h+4>>2]=B;RY(f,1,735536,h);n=0;i=g;return n|0}B=o3a(y|0,0,w|0,0)|0;if(!((B|0)==(ca(y,w)|0)&(G|0)==0)){c[h>>2]=w;c[h+4>>2]=y;RY(f,1,735600,h);n=0;i=g;return n|0}y=w2a(e,52)|0;e=l+24|0;c[e>>2]=y;if((y|0)==0){c[d>>2]=0;RY(f,1,735648,h);n=0;i=g;return n|0}f3a(y|0,0,(c[d>>2]|0)*52|0)|0;a:do{if((c[d>>2]|0)!=0){y=b+160|0;B=v;x=0;C=c[e>>2]|0;while(1){wY(B,k,1);c[C+24>>2]=(c[k>>2]&127)+1;c[C+32>>2]=(c[k>>2]|0)>>>7;wY(B+1|0,k,1);c[C>>2]=c[k>>2];wY(B+2|0,k,1);D=c[k>>2]|0;c[C+4>>2]=D;E=c[C>>2]|0;if((E|0)==0|E>>>0>255|(D|0)==0|D>>>0>255){break}c[C+36>>2]=0;c[C+40>>2]=c[y>>2];F=x+1|0;if(F>>>0<(c[d>>2]|0)>>>0){B=B+3|0;x=F;C=C+52|0}else{break a}}c[h>>2]=x;c[h+4>>2]=E;c[h+8>>2]=D;RY(f,1,735696,h);n=0;i=g;return n|0}}while(0);D=b+112|0;c[D>>2]=gca((c[o>>2]|0)-(c[t>>2]|0)|0,c[r>>2]|0)|0;o=gca((c[p>>2]|0)-(c[u>>2]|0)|0,c[s>>2]|0)|0;c[b+116>>2]=o;E=c[D>>2]|0;if(!((E|0)==0|(o|0)==0)?!(E>>>0>(65535/(o>>>0)|0)>>>0):0){D=ca(E,o)|0;k=b+28|0;if((a[b+76>>0]&2)==0){c[k>>2]=0;c[b+32>>2]=0;c[b+36>>2]=E;c[b+40>>2]=o}else{v=c[t>>2]|0;t=c[r>>2]|0;c[k>>2]=(((c[k>>2]|0)-v|0)>>>0)/(t>>>0)|0;k=b+32|0;c[k>>2]=(((c[k>>2]|0)-(c[u>>2]|0)|0)>>>0)/((c[s>>2]|0)>>>0)|0;k=b+36|0;c[k>>2]=gca((c[k>>2]|0)-v|0,t)|0;t=b+40|0;c[t>>2]=gca((c[t>>2]|0)-(c[u>>2]|0)|0,c[s>>2]|0)|0}s=w2a(D,5632)|0;u=b+156|0;c[u>>2]=s;if((s|0)==0){RY(f,1,735648,h);n=0;i=g;return n|0}f3a(s|0,0,D*5632|0)|0;s=w2a(c[d>>2]|0,1080)|0;t=b+12|0;c[(c[t>>2]|0)+5576>>2]=s;s=c[(c[t>>2]|0)+5576>>2]|0;if((s|0)==0){RY(f,1,735648,h);n=0;i=g;return n|0}f3a(s|0,0,(c[d>>2]|0)*1080|0)|0;s=u2a(200)|0;c[(c[t>>2]|0)+5604>>2]=s;s=c[(c[t>>2]|0)+5604>>2]|0;if((s|0)==0){RY(f,1,735648,h);n=0;i=g;return n|0}f3a(s|0,0,200)|0;c[(c[t>>2]|0)+5612>>2]=10;s=u2a(200)|0;c[(c[t>>2]|0)+5616>>2]=s;s=c[(c[t>>2]|0)+5616>>2]|0;if((s|0)==0){RY(f,1,735648,h);n=0;i=g;return n|0}f3a(s|0,0,200)|0;c[(c[t>>2]|0)+5624>>2]=10;s=c[d>>2]|0;if((s|0)==0){H=0}else{v=s;s=0;while(1){k=c[e>>2]|0;if((c[k+(s*52|0)+32>>2]|0)==0){c[(c[(c[t>>2]|0)+5576>>2]|0)+(s*1080|0)+1076>>2]=1<<(c[k+(s*52|0)+24>>2]|0)+ -1;I=c[d>>2]|0}else{I=v}s=s+1|0;if(!(s>>>0<I>>>0)){H=I;break}else{v=I}}}b:do{if((D|0)!=0){I=H;v=1;s=c[u>>2]|0;while(1){t=u2a(I*1080|0)|0;c[s+5576>>2]=t;if((t|0)==0){break}f3a(t|0,0,(c[d>>2]|0)*1080|0)|0;if(!(v>>>0<D>>>0)){break b}I=c[d>>2]|0;v=v+1|0;s=s+5632|0}RY(f,1,735648,h);n=0;i=g;return n|0}}while(0);c[b+8>>2]=4;WY(l,m);n=1;i=g;return n|0}c[h>>2]=E;c[h+4>>2]=o;RY(f,1,735800,h);n=0;i=g;return n|0}}else{z=c[q>>2]|0;A=c[p>>2]|0}c[h>>2]=w-j;c[h+4>>2]=A-z;RY(f,1,735480,h);n=0;i=g;return n|0}function Vba(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;i=i+16|0;g=f;h=f+4|0;if((b|0)==0){_a(731616,727592,3264,734032)}if((a|0)==0){_a(727656,727592,3265,734032)}if((e|0)==0){_a(727712,727592,3266,734032)}if(d>>>0<2){RY(e,1,734056,g);j=0;i=f;return j|0}wY(b,f+8|0,1);wY(b+1|0,h,1);b=c[h>>2]|0;if((((d+ -2|0)>>>0)%(((b>>>5&2)+2+(b>>>4&3)|0)>>>0)|0|0)==0){j=1;i=f;return j|0}RY(e,1,734056,g);j=0;i=f;return j|0}function Wba(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;if((b|0)==0){_a(731616,727592,3319,733976)}if((a|0)==0){_a(727656,727592,3320,733976)}if((d|0)==0){_a(727712,727592,3321,733976)}if((c|0)!=0){f=1;i=e;return f|0}RY(d,1,734e3,e);f=0;i=e;return f|0}function Xba(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;i=i+16|0;g=f;h=f+4|0;if((b|0)==0){_a(731616,727592,3391,733920)}if((a|0)==0){_a(727656,727592,3392,733920)}if((e|0)==0){_a(727712,727592,3393,733920)}if((d|0)==0){RY(e,1,733944,g);j=0;i=f;return j|0}wY(b,f+8|0,1);a=d+ -1|0;if((a|0)==0){j=1;i=f;return j|0}else{k=0;l=0;m=b}while(1){m=m+1|0;wY(m,h,1);b=c[h>>2]|0;if((b&128|0)==0){n=0}else{n=(b&127|l)<<7}k=k+1|0;if((k|0)==(a|0)){break}else{l=n}}if((n|0)==0){j=1;i=f;return j|0}RY(e,1,733944,g);j=0;i=f;return j|0}function Yba(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;g=i;i=i+32|0;h=g;j=g+16|0;k=g+12|0;if((d|0)==0){_a(731616,727592,3540,733360)}if((b|0)==0){_a(727656,727592,3541,733360)}if((f|0)==0){_a(727712,727592,3542,733360)}if((e|0)==0){RY(f,1,733376,h);l=0;i=g;return l|0}m=b+180|0;a[m>>0]=a[m>>0]|1;wY(d,j,1);n=d+1|0;o=e+ -1|0;p=c[j>>2]|0;j=o>>>0<4;do{if((p|0)==0){if(j){RY(f,1,733376,h);l=0;i=g;return l|0}wY(n,k,4);q=e+ -5|0;r=c[k>>2]|0;if(q>>>0<r>>>0){c[h>>2]=q;c[h+4>>2]=r;c[h+8>>2]=0;RY(f,1,733408,h);s=b+120|0;v2a(c[s>>2]|0);c[s>>2]=0;c[b+136>>2]=0;a[m>>0]=a[m>>0]&-2;l=0;i=g;return l|0}c[b+124>>2]=r;c[b+128>>2]=0;s=u2a(r)|0;c[b+120>>2]=s;c[b+136>>2]=s;if((s|0)!=0){f3a(s|0,0,r|0)|0;c[b+132>>2]=s;t=d+5|0;u=s;v=r;w=q;break}RY(f,1,733472,h);l=0;i=g;return l|0}else{if(j){RY(f,2,733512,h);l=1;i=g;return l|0}q=c[b+128>>2]|0;r=b+124|0;s=c[r>>2]|0;if(q>>>0<s>>>0){x=(c[b+120>>2]|0)+q|0;c[b+132>>2]=x;y=s-q|0;c[k>>2]=y;t=n;u=x;v=y;w=o;break}wY(n,k,4);y=e+ -5|0;x=c[k>>2]|0;if(y>>>0<x>>>0){c[h>>2]=y;c[h+4>>2]=x;c[h+8>>2]=p;RY(f,1,733408,h);q=b+120|0;v2a(c[q>>2]|0);c[q>>2]=0;c[b+136>>2]=0;a[m>>0]=a[m>>0]&-2;l=0;i=g;return l|0}q=b+120|0;s=c[q>>2]|0;z=b+136|0;if((s|0)!=(c[z>>2]|0)){_a(733536,727592,3625,733360)}A=x2a(s,(c[r>>2]|0)+x|0)|0;if((A|0)!=0){c[q>>2]=A;c[z>>2]=A;s=c[r>>2]|0;B=A+s|0;c[b+132>>2]=B;c[r>>2]=s+x;t=d+5|0;u=B;v=x;w=y;break}v2a(c[q>>2]|0);c[q>>2]=0;c[z>>2]=0;c[r>>2]=0;RY(f,1,733648,h);l=0;i=g;return l|0}}while(0);a:do{if(!(w>>>0<v>>>0)){d=b+132|0;m=b+128|0;p=b+120|0;e=b+136|0;n=b+124|0;o=t;j=u;r=v;z=w;while(1){c3a(j|0,o|0,r|0)|0;q=c[k>>2]|0;y=z-q|0;x=o+q|0;c[m>>2]=(c[m>>2]|0)+q;if((z|0)==(q|0)){C=x;D=z;E=y;break a}if(y>>>0<4){l=0;F=45;break}wY(x,k,4);x=o+(q+4)|0;q=y+ -4|0;y=c[k>>2]|0;B=q>>>0<y>>>0;if(B){C=x;D=y;E=q;break a}s=c[p>>2]|0;if((s|0)!=(c[e>>2]|0)){F=34;break}A=x2a(s,(c[n>>2]|0)+y|0)|0;if((A|0)==0){F=36;break}c[p>>2]=A;c[e>>2]=A;s=c[n>>2]|0;c[d>>2]=A+s;c[n>>2]=s+y;if(B){C=x;D=y;E=q;break a}o=x;j=c[d>>2]|0;r=y;z=q}if((F|0)==34){_a(733536,727592,3673,733360)}else if((F|0)==36){v2a(c[p>>2]|0);c[p>>2]=0;c[e>>2]=0;c[n>>2]=0;RY(f,1,733728,h);l=0;i=g;return l|0}else if((F|0)==45){i=g;return l|0}}else{C=t;D=v;E=w}}while(0);if((E|0)==0){l=1;i=g;return l|0}w=b+120|0;v=c[w>>2]|0;t=b+136|0;if((v|0)!=(c[t>>2]|0)){_a(733536,727592,3696,733360)}F=b+124|0;k=x2a(v,D+(c[F>>2]|0)|0)|0;if((k|0)==0){v2a(c[w>>2]|0);c[w>>2]=0;c[t>>2]=0;c[F>>2]=0;RY(f,1,733824,h);l=0;i=g;return l|0}else{c[w>>2]=k;c[t>>2]=k;t=c[F>>2]|0;w=k+t|0;c[b+132>>2]=w;c[F>>2]=t+D;c3a(w|0,C|0,E|0)|0;C=b+128|0;c[C>>2]=(c[C>>2]|0)+E;l=1;i=g;return l|0}return 0}function Zba(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;g=i;i=i+16|0;h=g;j=g+4|0;if((d|0)==0){_a(731616,727592,3789,733200)}if((b|0)==0){_a(727656,727592,3790,733200)}if((f|0)==0){_a(727712,727592,3791,733200)}if((e|0)==0){RY(f,1,733224,h);k=0;i=g;return k|0}if(!((a[b+180>>0]&1)==0)){RY(f,1,733256,h);k=0;i=g;return k|0}l=c[b+196>>2]|0;m=c[b+156>>2]|0;b=m+(l*5632|0)+5628|0;a[b>>0]=a[b>>0]|1;wY(d,j,1);b=d+1|0;d=e+ -1|0;do{if((c[j>>2]|0)==0){c[m+(l*5632|0)+5168>>2]=0;e=m+(l*5632|0)+5172|0;c[e>>2]=d;n=m+(l*5632|0)+5164|0;v2a(c[n>>2]|0);o=w2a(c[e>>2]|0,1)|0;c[n>>2]=o;if((o|0)!=0){c[m+(l*5632|0)+5160>>2]=o;p=o;break}RY(f,1,733160,h);k=0;i=g;return k|0}else{o=m+(l*5632|0)+5172|0;n=(c[o>>2]|0)+d|0;c[o>>2]=n;e=m+(l*5632|0)+5164|0;q=x2a(c[e>>2]|0,n)|0;if((q|0)!=0){c[e>>2]=q;c[m+(l*5632|0)+5160>>2]=q;f3a(q+(c[m+(l*5632|0)+5168>>2]|0)|0,0,d|0)|0;p=c[e>>2]|0;break}v2a(c[e>>2]|0);c[e>>2]=0;c[o>>2]=0;RY(f,1,733160,h);k=0;i=g;return k|0}}while(0);h=m+(l*5632|0)+5168|0;c3a(p+(c[h>>2]|0)|0,b|0,d|0)|0;c[h>>2]=(c[h>>2]|0)+d;k=1;i=g;return k|0}function _ba(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;i=i+16|0;if((b|0)==0){_a(731616,727592,3224,734088)}if((a|0)==0){_a(727656,727592,3225,734088)}if((e|0)==0){_a(727712,727592,3226,734088)}if((c[(c[a+80>>2]|0)+16>>2]<<2|0)==(d|0)){g=1;i=f;return g|0}RY(e,1,734112,f);g=0;i=f;return g|0}function $ba(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=i;if((a|0)==0){_a(727656,727592,2310,735216)}if((d|0)==0){_a(727712,727592,2311,735216)}if((b|0)==0){_a(731616,727592,2312,735216)}else{i=c;return 1}return 0}function aca(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;f=i;i=i+16|0;g=f;h=f+4|0;if((b|0)==0){_a(731616,727592,5113,732216)}if((a|0)==0){_a(727656,727592,5114,732216)}if((c[a+8>>2]|0)==16){j=(c[a+156>>2]|0)+((c[a+196>>2]|0)*5632|0)|0}else{j=c[a+12>>2]|0}if(d>>>0<2){RY(e,1,732240,g);k=0;i=f;return k|0}wY(b,h,2);if((c[h>>2]|0)!=0){RY(e,2,732272,g);k=1;i=f;return k|0}if(d>>>0<7){RY(e,1,732240,g);k=0;i=f;return k|0}wY(b+2|0,h,2);a=b+4|0;l=c[h>>2]&255;m=j+5604|0;n=c[m>>2]|0;o=j+5608|0;p=c[o>>2]|0;if((p|0)!=0){q=0;r=n;while(1){if((c[r+8>>2]|0)==(l|0)){s=q;t=r;break}u=r+20|0;v=q+1|0;if(v>>>0<p>>>0){q=v;r=u}else{s=v;t=u;break}}if((s|0)==(p|0)){w=p;x=18}else{y=t}}else{w=0;x=18}if((x|0)==18){x=j+5612|0;do{if((w|0)==(c[x>>2]|0)){j=w+10|0;c[x>>2]=j;t=x2a(n,j*20|0)|0;if((t|0)!=0){c[m>>2]=t;j=c[o>>2]|0;f3a(t+(j*20|0)|0,0,((c[x>>2]|0)-j|0)*20|0)|0;z=c[m>>2]|0;A=c[o>>2]|0;break}v2a(c[m>>2]|0);c[m>>2]=0;c[x>>2]=0;c[o>>2]=0;RY(e,1,732336,g);k=0;i=f;return k|0}else{z=n;A=w}}while(0);y=z+(A*20|0)|0}A=y+12|0;z=c[A>>2]|0;if((z|0)!=0){v2a(z);c[A>>2]=0}c[y+8>>2]=l;c[y+4>>2]=(c[h>>2]|0)>>>8&3;c[y>>2]=(c[h>>2]|0)>>>10&3;wY(a,h,2);if((c[h>>2]|0)!=0){RY(e,2,732376,g);k=1;i=f;return k|0}h=d+ -6|0;d=u2a(h)|0;c[A>>2]=d;if((d|0)==0){RY(e,1,732240,g);k=0;i=f;return k|0}else{c3a(d|0,b+6|0,h|0)|0;c[y+16>>2]=h;c[o>>2]=(c[o>>2]|0)+1;k=1;i=f;return k|0}return 0}function bca(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;g=f;h=f+8|0;j=f+4|0;if((b|0)==0){_a(731616,727592,5813,731640)}if((a|0)==0){_a(727656,727592,5814,731640)}if((e|0)==0){_a(727712,727592,5815,731640)}k=a+80|0;a=c[(c[k>>2]|0)+16>>2]|0;if((a+2|0)!=(d|0)){RY(e,1,731664,g);l=0;i=f;return l|0}wY(b,h,2);if((c[h>>2]|0)!=(a|0)){RY(e,1,731664,g);l=0;i=f;return l|0}if((a|0)==0){l=1;i=f;return l|0}g=b+2|0;b=0;e=c[(c[k>>2]|0)+24>>2]|0;while(1){wY(g,j,1);c[e+32>>2]=(c[j>>2]|0)>>>7&1;c[e+24>>2]=(c[j>>2]&127)+1;b=b+1|0;if((b|0)==(a|0)){l=1;break}else{g=g+1|0;e=e+52|0}}i=f;return l|0}function cca(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;g=i;i=i+32|0;h=g;j=g+16|0;k=g+12|0;l=g+8|0;m=g+4|0;if((d|0)==0){_a(731616,727592,5325,731824)}if((b|0)==0){_a(727656,727592,5326,731824)}if((f|0)==0){_a(727712,727592,5327,731824)}if((c[b+8>>2]|0)==16){n=(c[b+156>>2]|0)+((c[b+196>>2]|0)*5632|0)|0}else{n=c[b+12>>2]|0}if(e>>>0<2){RY(f,1,731848,h);o=0;i=g;return o|0}wY(d,j,2);if((c[j>>2]|0)!=0){RY(f,2,731880,h);o=1;i=g;return o|0}if(e>>>0<7){RY(f,1,731848,h);o=0;i=g;return o|0}wY(d+2|0,k,1);b=d+3|0;p=n+5616|0;q=c[p>>2]|0;r=n+5620|0;s=c[r>>2]|0;if((s|0)!=0){t=c[k>>2]|0;u=0;v=q;while(1){if((c[v>>2]|0)==(t|0)){w=u;x=v;break}y=v+20|0;z=u+1|0;if(z>>>0<s>>>0){u=z;v=y}else{w=z;x=y;break}}if((w|0)==(s|0)){A=s;B=21}else{C=t;D=x}}else{A=0;B=21}if((B|0)==21){x=n+5624|0;do{if((A|0)==(c[x>>2]|0)){t=A+10|0;c[x>>2]=t;s=x2a(q,t*20|0)|0;if((s|0)!=0){c[p>>2]=s;t=c[r>>2]|0;f3a(s+(t*20|0)|0,0,((c[x>>2]|0)-t|0)*20|0)|0;E=c[p>>2]|0;F=c[r>>2]|0;break}v2a(c[p>>2]|0);c[p>>2]=0;c[x>>2]=0;c[r>>2]=0;RY(f,1,731928,h);o=0;i=g;return o|0}else{E=q;F=A}}while(0);C=c[k>>2]|0;D=E+(F*20|0)|0}c[D>>2]=C;wY(b,j,2);if((c[j>>2]|0)!=0){RY(f,2,731880,h);o=1;i=g;return o|0}wY(d+5|0,l,2);b=c[l>>2]|0;if(b>>>0>1){RY(f,2,731968,h);o=1;i=g;return o|0}C=e+ -7|0;a:do{if((b|0)!=0){e=D+4|0;F=D+16|0;E=D+8|0;A=D+12|0;q=n+5604|0;x=n+5608|0;p=d+7|0;t=C;s=0;b:while(1){if(t>>>0<3){B=33;break}wY(p,j,1);if((c[j>>2]|0)!=1){B=35;break}wY(p+1|0,m,2);w=t+ -3|0;v=c[m>>2]|0;u=(v>>>15)+1|0;y=v&32767;c[e>>2]=y;v=(ca(u,y)|0)+2|0;if(w>>>0<v>>>0){B=37;break}z=p+3|0;G=w-v|0;if((y|0)==0){H=z}else{y=z;z=0;while(1){wY(y,j,u);if((c[j>>2]|0)!=(z|0)){B=40;break b}v=y+u|0;z=z+1|0;if(!(z>>>0<(c[e>>2]|0)>>>0)){H=v;break}else{y=v}}}wY(H,m,2);y=H+2|0;z=c[m>>2]|0;u=(z>>>15)+1|0;v=z&32767;c[m>>2]=v;if((v|0)!=(c[e>>2]|0)){B=43;break}z=(ca(u,v)|0)+3|0;if(G>>>0<z>>>0){B=45;break}w=G-z|0;if((v|0)==0){I=y}else{v=y;y=0;while(1){wY(v,j,u);if((c[j>>2]|0)!=(y|0)){B=48;break b}z=v+u|0;y=y+1|0;if(!(y>>>0<(c[e>>2]|0)>>>0)){I=z;break}else{v=z}}}wY(I,j,3);p=I+3|0;a[F>>0]=((c[j>>2]|0)>>>16^1)&1|a[F>>0]&-2;c[E>>2]=0;c[A>>2]=0;v=c[j>>2]|0;y=v&255;c[k>>2]=y;if((y|0)==0){J=v}else{v=c[x>>2]|0;c:do{if((v|0)==0){B=56}else{u=0;G=c[q>>2]|0;while(1){if((c[G+8>>2]|0)==(y|0)){break}u=u+1|0;if(!(u>>>0<v>>>0)){B=56;break c}else{G=G+20|0}}c[E>>2]=G;K=G}}while(0);if((B|0)==56){B=0;K=c[E>>2]|0}if((K|0)==0){B=59;break}J=c[j>>2]|0}v=J>>>8&255;c[k>>2]=v;if((v|0)!=0){y=c[x>>2]|0;d:do{if((y|0)==0){B=66}else{u=0;z=c[q>>2]|0;while(1){if((c[z+8>>2]|0)==(v|0)){break}u=u+1|0;if(!(u>>>0<y>>>0)){B=66;break d}else{z=z+20|0}}c[A>>2]=z;L=z}}while(0);if((B|0)==66){B=0;L=c[A>>2]|0}if((L|0)==0){B=68;break}}s=s+1|0;if(!(s>>>0<(c[l>>2]|0)>>>0)){M=w;break a}else{t=w}}if((B|0)==33){RY(f,1,731848,h);o=0;i=g;return o|0}else if((B|0)==35){RY(f,2,732016,h);o=1;i=g;return o|0}else if((B|0)==37){RY(f,1,731848,h);o=0;i=g;return o|0}else if((B|0)==40){RY(f,2,732088,h);o=1;i=g;return o|0}else if((B|0)==43){RY(f,2,732144,h);o=1;i=g;return o|0}else if((B|0)==45){RY(f,1,731848,h);o=0;i=g;return o|0}else if((B|0)==48){RY(f,2,732088,h);o=1;i=g;return o|0}else if((B|0)==59){RY(f,1,731848,h);o=0;i=g;return o|0}else if((B|0)==68){RY(f,1,731848,h);o=0;i=g;return o|0}}else{M=C}}while(0);if((M|0)==0){c[r>>2]=(c[r>>2]|0)+1;o=1;i=g;return o|0}else{RY(f,1,731848,h);o=0;i=g;return o|0}return 0}function dca(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;f=i;i=i+16|0;g=f;h=f+8|0;j=f+4|0;if((b|0)==0){_a(731616,727592,5603,731696)}if((a|0)==0){_a(727656,727592,5604,731696)}if((e|0)==0){_a(727712,727592,5605,731696)}k=a+80|0;l=c[k>>2]|0;if((c[a+8>>2]|0)==16){m=(c[a+156>>2]|0)+((c[a+196>>2]|0)*5632|0)|0}else{m=c[a+12>>2]|0}if((d|0)==0){RY(e,1,731720,g);n=0;i=f;return n|0}wY(b,j,1);a=c[j>>2]|0;if(a>>>0>1){RY(e,2,731752,g);n=1;i=f;return n|0}if((a+1|0)!=(d|0)){RY(e,2,731720,g);n=0;i=f;return n|0}g=m+5576|0;e=l+16|0;if((c[e>>2]|0)!=0){l=0;d=c[g>>2]|0;while(1){c[d+1076>>2]=0;l=l+1|0;if(!(l>>>0<(c[e>>2]|0)>>>0)){break}else{d=d+1080|0}}}d=m+5596|0;e=c[d>>2]|0;if((e|0)!=0){v2a(e);c[d>>2]=0}if((c[j>>2]|0)==0){n=1;i=f;return n|0}e=(m|0)==0;l=m+5616|0;a=m+5620|0;m=0;o=b;while(1){o=o+1|0;wY(o,h,1);b=c[k>>2]|0;if(e){p=24;break}q=c[l>>2]|0;r=c[a>>2]|0;if((r|0)!=0){s=(c[q>>2]|0)==(c[h>>2]|0);t=0;while(1){u=t+1|0;if(s){v=t;break}if(u>>>0<r>>>0){t=u}else{v=u;break}}if((v|0)!=(r|0)?(t=c[q+4>>2]|0,s=b+16|0,(t|0)==(c[s>>2]|0)):0){u=c[q+8>>2]|0;if((u|0)!=0){w=ca(t,t)|0;t=ca(c[727728+(c[u>>2]<<2)>>2]|0,w)|0;if((c[u+16>>2]|0)!=(t|0)){n=0;p=43;break}t=u2a(w<<2)|0;c[d>>2]=t;if((t|0)==0){n=0;p=43;break}ld[c[727304+(c[u>>2]<<2)>>2]&255](c[u+12>>2]|0,t,w)}w=c[q+12>>2]|0;if((w|0)!=0){t=c[s>>2]|0;u=ca(t,c[727728+(c[w>>2]<<2)>>2]|0)|0;if((c[w+16>>2]|0)!=(u|0)){n=0;p=43;break}u=u2a(t<<2)|0;if((u|0)==0){n=0;p=43;break}ld[c[727320+(c[w>>2]<<2)>>2]&255](c[w+12>>2]|0,u,t);if((c[s>>2]|0)!=0){t=0;w=u;x=c[g>>2]|0;while(1){c[x+1076>>2]=c[w>>2];t=t+1|0;if(!(t>>>0<(c[s>>2]|0)>>>0)){break}else{w=w+4|0;x=x+1080|0}}}v2a(u)}}}m=m+1|0;if(!(m>>>0<(c[j>>2]|0)>>>0)){n=1;p=43;break}}if((p|0)==24){_a(736040,727592,5665,731808)}else if((p|0)==43){i=f;return n|0}return 0}function eca(a,b){a=a|0;b=b|0;var d=0;d=i;if((a|0)==0|(b|0)==0){i=d;return}c[a+164>>2]=c[b+4>>2];c[a+160>>2]=c[b>>2];i=d;return}function fca(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;if((b|0)==0){i=d;return}if((c[b>>2]|0)==0){e=b+36|0;f=c[e>>2]|0;if((f|0)!=0){v2a(f);c[e>>2]=0}e=b+24|0;f=c[e>>2]|0;if((f|0)!=0){v2a(f);c[e>>2]=0;c[b+28>>2]=0}e=b+44|0;f=c[e>>2]|0;if((f|0)!=0){v2a(f);c[e>>2]=0;c[b+48>>2]=0}}else{e=b+12|0;f=c[e>>2]|0;if((f|0)!=0){lca(f);v2a(c[e>>2]|0);c[e>>2]=0}e=b+16|0;f=c[e>>2]|0;if((f|0)!=0){v2a(f);c[e>>2]=0;c[b+20>>2]=0}}Yca(c[b+200>>2]|0);e=b+88|0;f=b+156|0;g=c[f>>2]|0;if((g|0)!=0){h=ca(c[b+112>>2]|0,c[b+116>>2]|0)|0;if((h|0)==0){j=g}else{k=0;l=g;while(1){lca(l);k=k+1|0;if((k|0)==(h|0)){break}else{l=l+5632|0}}j=c[f>>2]|0}v2a(j);c[f>>2]=0}f=b+136|0;v2a(c[f>>2]|0);c[f>>2]=0;c[b+120>>2]=0;f=b+108|0;v2a(c[f>>2]|0);c[f>>2]=0;if((a[b+180>>0]&2)==0){f=b+172|0;v2a(c[f>>2]|0);c[f>>2]=0}f=e+0|0;e=f+96|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(e|0));f=b+184|0;Aba(c[f>>2]|0);c[f>>2]=0;Aba(c[b+188>>2]|0);c[f>>2]=0;f=b+192|0;mca(c[f>>2]|0);c[f>>2]=0;f=b+80|0;VY(c[f>>2]|0);c[f>>2]=0;VY(c[b+84>>2]|0);v2a(b);i=d;return}function gca(a,b){a=a|0;b=b|0;var c=0;c=i;if((b|0)==0){_a(736880,736888,111,736960)}else{i=c;return(a+ -1+b|0)/(b|0)|0|0}return 0}function hca(a,b,c){a=a|0;b=b|0;c=c|0;return 1}function ica(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;if((b|0)==0){_a(727656,727592,6556,727672)}if((a|0)==0){_a(727696,727592,6557,727672)}if((e|0)==0){_a(727712,727592,6558,727672)}g=UY()|0;h=b+80|0;c[h>>2]=g;if((g|0)==0){j=0;i=f;return j|0}g=b+188|0;Bba(c[g>>2]|0,213);Bba(c[g>>2]|0,214);if((jca(b,c[g>>2]|0,a,e)|0)==0){VY(c[h>>2]|0);c[h>>2]=0;j=0;i=f;return j|0}g=b+184|0;Bba(c[g>>2]|0,215);Bba(c[g>>2]|0,216);if((jca(b,c[g>>2]|0,a,e)|0)==0){VY(c[h>>2]|0);c[h>>2]=0;j=0;i=f;return j|0}e=UY()|0;c[d>>2]=e;if((e|0)==0){j=0;i=f;return j|0}YY(c[h>>2]|0,e);j=(kca(b)|0)!=0&1;i=f;return j|0}function jca(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;if((b|0)==0){_a(731104,727592,7039,731128)}if((a|0)==0){_a(727656,727592,7040,731128)}if((d|0)==0){_a(727696,727592,7041,731128)}if((e|0)==0){_a(727712,727592,7042,731128)}g=Cba(c[b>>2]|0)|0;if((g|0)==0){h=1;Eba(b);i=f;return h|0}j=0;k=Dba(c[b+8>>2]|0)|0;l=1;while(1){if((l|0)==0){m=0}else{m=(Qc[c[k>>2]&255](a,d,e)|0)!=0}n=m&1;j=j+1|0;if((j|0)==(g|0)){h=n;break}else{k=k+4|0;l=n}}Eba(b);i=f;return h|0}function kca(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;d=ca(c[a+116>>2]|0,c[a+112>>2]|0)|0;e=a+192|0;c[(c[e>>2]|0)+36>>2]=d;d=c[e>>2]|0;c[d+40>>2]=w2a(c[d+36>>2]|0,40)|0;d=c[e>>2]|0;a=c[d+40>>2]|0;if((a|0)==0){f=0;i=b;return f|0}if((c[d+36>>2]|0)==0){f=1;i=b;return f|0}else{g=a;h=0}while(1){c[g+(h*40|0)+28>>2]=100;c[(c[(c[e>>2]|0)+40>>2]|0)+(h*40|0)+20>>2]=0;a=(c[e>>2]|0)+40|0;d=w2a(c[(c[a>>2]|0)+(h*40|0)+28>>2]|0,24)|0;c[(c[a>>2]|0)+(h*40|0)+24>>2]=d;d=c[e>>2]|0;g=c[d+40>>2]|0;if((c[g+(h*40|0)+24>>2]|0)==0){f=0;j=5;break}h=h+1|0;if(!(h>>>0<(c[d+36>>2]|0)>>>0)){f=1;j=5;break}}if((j|0)==5){i=b;return f|0}return 0}function lca(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;if((a|0)==0){i=b;return}d=a+5164|0;e=c[d>>2]|0;if((e|0)!=0){v2a(e);c[d>>2]=0}d=a+5576|0;e=c[d>>2]|0;if((e|0)!=0){v2a(e);c[d>>2]=0}d=a+5600|0;e=c[d>>2]|0;if((e|0)!=0){v2a(e);c[d>>2]=0}d=a+5596|0;e=c[d>>2]|0;if((e|0)!=0){v2a(e);c[d>>2]=0}d=a+5616|0;e=c[d>>2]|0;if((e|0)!=0){v2a(e);c[d>>2]=0;c[a+5624>>2]=0;c[a+5620>>2]=0}d=a+5604|0;e=c[d>>2]|0;if((e|0)!=0){f=a+5608|0;g=c[f>>2]|0;if((g|0)==0){h=e}else{j=g;g=0;k=e;while(1){e=k+12|0;l=c[e>>2]|0;if((l|0)==0){m=j}else{v2a(l);c[e>>2]=0;m=c[f>>2]|0}g=g+1|0;if(!(g>>>0<m>>>0)){break}else{j=m;k=k+20|0}}h=c[d>>2]|0}v2a(h);c[d>>2]=0}d=a+5592|0;h=c[d>>2]|0;if((h|0)!=0){v2a(h);c[d>>2]=0}rca(a);i=b;return}function mca(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;if((a|0)==0){i=b;return}d=a+28|0;e=c[d>>2]|0;if((e|0)!=0){v2a(e);c[d>>2]=0}d=a+40|0;e=c[d>>2]|0;if((e|0)!=0){f=a+36|0;if((c[f>>2]|0)==0){g=e}else{h=e;e=0;while(1){j=c[h+(e*40|0)+36>>2]|0;if((j|0)==0){k=h}else{v2a(j);c[(c[d>>2]|0)+(e*40|0)+36>>2]=0;k=c[d>>2]|0}j=c[k+(e*40|0)+16>>2]|0;if((j|0)==0){l=k}else{v2a(j);c[(c[d>>2]|0)+(e*40|0)+16>>2]=0;l=c[d>>2]|0}j=c[l+(e*40|0)+24>>2]|0;if((j|0)==0){m=l}else{v2a(j);c[(c[d>>2]|0)+(e*40|0)+24>>2]=0;m=c[d>>2]|0}e=e+1|0;if(!(e>>>0<(c[f>>2]|0)>>>0)){g=m;break}else{h=m}}}v2a(g)}v2a(a);i=b;return}function nca(b,d,e,f,g,h,j,k,l,m,n){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0;o=i;i=i+16|0;p=o;q=o+12|0;r=o+8|0;c[q>>2]=65424;if((m|0)==0){_a(727696,727592,7420,727744)}if((b|0)==0){_a(727656,727592,7421,727744)}if((n|0)==0){_a(727712,727592,7422,727744)}s=b+8|0;t=c[s>>2]|0;if((t|0)==256){c[q>>2]=65497;u=65497}else if((t|0)==8){u=65424}else{v=0;i=o;return v|0}t=b+76|0;a:do{if((a[t>>0]&1)==0){w=b+196|0;x=b+156|0;y=b+72|0;z=b+24|0;A=b+192|0;B=b+16|0;C=b+20|0;D=b+64|0;E=m+56|0;F=u;b:while(1){c:do{if((F|0)==65427){H=65427}else if((F|0)!=65497){I=F;while(1){J=PY(m)|0;if((J|0)==0&(G|0)==0){K=13;break}if((NY(m,c[B>>2]|0,2,n)|0)!=2){K=15;break b}wY(c[B>>2]|0,r,2);if((I|0)==32896?(J=PY(m)|0,(J|0)==0&(G|0)==0):0){K=18;break}J=c[s>>2]|0;L=c[r>>2]|0;if((J&16|0)!=0){c[z>>2]=-2-L+(c[z>>2]|0)}M=L+ -2|0;c[r>>2]=M;N=oca(I)|0;if((c[N+4>>2]&J|0)==0){K=22;break b}J=c[B>>2]|0;if(M>>>0>(c[C>>2]|0)>>>0){O=x2a(J,M)|0;if((O|0)==0){K=25;break b}c[B>>2]=O;c[C>>2]=M;P=O}else{P=J}if((NY(m,P,M,n)|0)!=(M|0)){K=28;break b}J=c[N+8>>2]|0;if((J|0)==0){K=30;break b}if((id[J&511](b,c[B>>2]|0,M,n)|0)==0){K=32;break b}M=c[w>>2]|0;J=c[A>>2]|0;O=c[N>>2]|0;Q=E;R=OY(c[Q>>2]|0,c[Q+4>>2]|0)|0;Q=-2-L|0;if((pca(M,J,O,Q+R|0,0,L+2|0)|0)==0){K=34;break b}do{if((c[N>>2]|0)==65424){L=E;R=OY(c[L>>2]|0,c[L+4>>2]|0)|0;L=Q+R|0;R=D;O=c[R+4>>2]|0;if(!(0>(O|0)|(0==(O|0)?L>>>0>(c[R>>2]|0)>>>0:0))){break}R=D;c[R>>2]=L;c[R+4>>2]=0}}while(0);if(!((a[t>>0]&4)==0)){K=39;break}if((NY(m,c[B>>2]|0,2,n)|0)!=2){K=43;break b}wY(c[B>>2]|0,q,2);Q=c[q>>2]|0;if((Q|0)==65427){H=65427;break c}else{I=Q}}if((K|0)==13){K=0;c[s>>2]=64;H=I;break}else if((K|0)==18){K=0;c[s>>2]=64;H=32896;break}else if((K|0)==39){K=0;Q=QY(m,c[z>>2]|0,0,n)|0;if(!((G|0)==0?(Q|0)==(c[z>>2]|0):0)){K=40;break b}c[q>>2]=65427;H=65427;break}}else{K=75;break a}}while(0);Q=PY(m)|0;if((Q|0)==0&(G|0)==0?(c[s>>2]|0)==64:0){S=H;K=74;break a}Q=a[t>>0]|0;if((Q&4)==0){N=c[w>>2]|0;R=c[x>>2]|0;if((c[y>>2]|0)==0){L=c[z>>2]|0;if(L>>>0>1){O=L+ -2|0;c[z>>2]=O;T=O}else{T=L}}else{L=PY(m)|0;O=W2a(L|0,G|0,-2,0)|0;c[z>>2]=O;T=O}U=R+(N*5632|0)+5584|0;O=R+(N*5632|0)+5588|0;do{if((T|0)==0){V=1}else{N=c[U>>2]|0;if((N|0)==0){R=u2a(T)|0;c[U>>2]=R;if((R|0)==0){break b}else{V=0;break}}R=c[O>>2]|0;if(R>>>0>~T>>>0){W=N;K=58;break b}L=x2a(N,R+T|0)|0;if((L|0)==0){K=56;break b}c[U>>2]=L;V=0}}while(0);L=c[A>>2]|0;if((L|0)!=0?(R=E,N=OY(c[R>>2]|0,c[R+4>>2]|0)|0,R=G,J=W2a(N|0,R|0,-2,-1)|0,M=G,X=c[w>>2]|0,Y=L+40|0,Z=c[Y>>2]|0,_=c[Z+(X*40|0)+12>>2]|0,$=(c[Z+(X*40|0)+16>>2]|0)+(_*24|0)+8|0,c[$>>2]=J,c[$+4>>2]=M,$=W2a(c[z>>2]|0,0,N|0,R|0)|0,R=(c[(c[Y>>2]|0)+((c[w>>2]|0)*40|0)+16>>2]|0)+(_*24|0)+16|0,c[R>>2]=$,c[R+4>>2]=G,(pca(c[w>>2]|0,L,65427,J,M,(c[z>>2]|0)+2|0)|0)==0):0){K=63;break}if((V|0)==0){aa=NY(m,(c[U>>2]|0)+(c[O>>2]|0)|0,c[z>>2]|0,n)|0}else{aa=0}c[s>>2]=(aa|0)==(c[z>>2]|0)?8:64;c[O>>2]=(c[O>>2]|0)+aa;if((a[t>>0]&1)==0){do{if((NY(m,c[B>>2]|0,2,n)|0)!=2){K=68;break b}wY(c[B>>2]|0,q,2)}while((c[q>>2]&65280|0)!=65280)}}else{a[t>>0]=Q&-6;c[s>>2]=8;if((NY(m,c[B>>2]|0,2,n)|0)!=2){K=71;break}wY(c[B>>2]|0,q,2)}O=c[q>>2]|0;if((a[t>>0]&1)==0){F=O}else{S=O;K=74;break a}}switch(K|0){case 15:{RY(n,1,727776,p);v=0;i=o;return v|0};case 22:{RY(n,1,727800,p);v=0;i=o;return v|0};case 25:{v2a(c[B>>2]|0);c[B>>2]=0;c[C>>2]=0;RY(n,1,727848,p);v=0;i=o;return v|0};case 28:{RY(n,1,727776,p);v=0;i=o;return v|0};case 30:{RY(n,1,727888,p);v=0;i=o;return v|0};case 32:{c[p>>2]=I;RY(n,1,727920,p);v=0;i=o;return v|0};case 34:{RY(n,1,727968,p);v=0;i=o;return v|0};case 40:{RY(n,1,727776,p);v=0;i=o;return v|0};case 43:{RY(n,1,727776,p);v=0;i=o;return v|0};case 56:{W=c[U>>2]|0;K=58;break};case 63:{RY(n,1,727968,p);v=0;i=o;return v|0};case 68:{RY(n,1,727776,p);v=0;i=o;return v|0};case 71:{RY(n,1,727776,p);v=0;i=o;return v|0}}if((K|0)==58){v2a(W);c[U>>2]=0}RY(n,1,730984,p);v=0;i=o;return v|0}else{S=u;K=74}}while(0);if((K|0)==74?(S|0)==65497:0){K=75}if((K|0)==75?(c[s>>2]|0)!=256:0){c[b+196>>2]=0;c[s>>2]=256}K=b+196|0;S=c[K>>2]|0;if((a[t>>0]&1)==0){t=ca(c[b+112>>2]|0,c[b+116>>2]|0)|0;d:do{if(S>>>0<t>>>0){u=S;U=(c[b+156>>2]|0)+(S*5632|0)|0;while(1){if((c[U+5584>>2]|0)!=0){ba=u;break d}W=u+1|0;c[K>>2]=W;if(W>>>0<t>>>0){u=W;U=U+5632|0}else{ba=W;break}}}else{ba=S}}while(0);if((ba|0)==(t|0)){c[l>>2]=0;v=1;i=o;return v|0}else{da=ba}}else{da=S}S=b+200|0;ba=c[S>>2]|0;if((_ca(c[c[ba+20>>2]>>2]|0,c[ba+24>>2]|0,c[ba+28>>2]|0,da)|0)==0){RY(n,1,728008,p);v=0;i=o;return v|0}else{da=(ca(c[b+112>>2]|0,c[b+116>>2]|0)|0)+ -1|0;c[p>>2]=c[K>>2];c[p+4>>2]=da;RY(n,4,728048,p);c[d>>2]=c[K>>2];c[l>>2]=1;c[e>>2]=$ca(c[S>>2]|0)|0;c[f>>2]=c[c[c[(c[S>>2]|0)+20>>2]>>2]>>2];c[g>>2]=c[(c[c[(c[S>>2]|0)+20>>2]>>2]|0)+4>>2];c[h>>2]=c[(c[c[(c[S>>2]|0)+20>>2]>>2]|0)+8>>2];c[j>>2]=c[(c[c[(c[S>>2]|0)+20>>2]>>2]|0)+12>>2];c[k>>2]=c[(c[c[(c[S>>2]|0)+20>>2]>>2]|0)+16>>2];c[s>>2]=c[s>>2]|128;v=1;i=o;return v|0}return 0}function oca(a){a=a|0;var b=0,d=0,e=0;b=i;d=727336;while(1){e=c[d>>2]|0;if((e|0)==0|(e|0)==(a|0)){break}else{d=d+12|0}}i=b;return d|0}function pca(a,d,e,f,g,h){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;j=i;if((d|0)==0){_a(731024,727592,6496,731048)}k=d+40|0;d=c[k>>2]|0;if((d|0)==0){_a(731072,727592,6497,731048)}l=c[d+(a*40|0)+20>>2]|0;m=d+(a*40|0)+28|0;n=c[m>>2]|0;do{if((l+1|0)>>>0>n>>>0){c[m>>2]=~~(+(n>>>0)+100.0)>>>0;o=c[k>>2]|0;p=x2a(c[o+(a*40|0)+24>>2]|0,(c[o+(a*40|0)+28>>2]|0)*24|0)|0;if((p|0)!=0){c[(c[k>>2]|0)+(a*40|0)+24>>2]=p;p=c[k>>2]|0;q=p;r=c[p+(a*40|0)+20>>2]|0;break}v2a(c[(c[k>>2]|0)+(a*40|0)+24>>2]|0);c[(c[k>>2]|0)+(a*40|0)+24>>2]=0;c[(c[k>>2]|0)+(a*40|0)+28>>2]=0;c[(c[k>>2]|0)+(a*40|0)+20>>2]=0;s=0;i=j;return s|0}else{q=d;r=l}}while(0);b[(c[q+(a*40|0)+24>>2]|0)+(r*24|0)>>1]=e;r=$2a(0,f|0,32)|0;q=c[k>>2]|0;l=(c[q+(a*40|0)+24>>2]|0)+((c[q+(a*40|0)+20>>2]|0)*24|0)+8|0;c[l>>2]=r;c[l+4>>2]=G;l=c[k>>2]|0;c[(c[l+(a*40|0)+24>>2]|0)+((c[l+(a*40|0)+20>>2]|0)*24|0)+16>>2]=h;h=(c[k>>2]|0)+(a*40|0)+20|0;c[h>>2]=(c[h>>2]|0)+1;if((e|0)!=65424){s=1;i=j;return s|0}e=c[k>>2]|0;k=c[e+(a*40|0)+16>>2]|0;if((k|0)==0){s=1;i=j;return s|0}h=k+((c[e+(a*40|0)+12>>2]|0)*24|0)|0;c[h>>2]=f;c[h+4>>2]=g;s=1;i=j;return s|0}function qca(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;j=i;i=i+16|0;k=j;l=j+4|0;m=j+8|0;if((g|0)==0){_a(727696,727592,7646,728088)}if((b|0)==0){_a(727656,727592,7647,728088)}if((h|0)==0){_a(727712,727592,7648,728088)}n=b+8|0;if((c[n>>2]&128|0)==0){o=0;i=j;return o|0}p=b+196|0;if((c[p>>2]|0)!=(d|0)){o=0;i=j;return o|0}q=c[b+156>>2]|0;r=q+(d*5632|0)|0;s=c[q+(d*5632|0)+5584>>2]|0;if((s|0)==0){lca(r);o=0;i=j;return o|0}t=b+200|0;if((ada(c[t>>2]|0,s,c[q+(d*5632|0)+5588>>2]|0,d)|0)==0){lca(r);c[n>>2]=c[n>>2]|32768;RY(h,1,728112,k);o=0;i=j;return o|0}if((bda(c[t>>2]|0,e,f)|0)==0){o=0;i=j;return o|0}rca(r);r=b+76|0;a[r>>0]=a[r>>0]&-2;c[n>>2]=c[n>>2]&-129;r=PY(g)|0;b=c[n>>2]|0;if((r|0)==0&(G|0)==0&(b|0)==64|(b|0)==256){o=1;i=j;return o|0}if((NY(g,m,2,h)|0)!=2){RY(h,1,727776,k);o=0;i=j;return o|0}wY(m,l,2);m=c[l>>2]|0;if((m|0)==65424){o=1;i=j;return o|0}else if((m|0)==65497){c[p>>2]=0;c[n>>2]=256;o=1;i=j;return o|0}else{RY(h,1,728136,k);k=PY(g)|0;if(!((k|0)==0&(G|0)==0)){o=0;i=j;return o|0}c[n>>2]=64;o=1;i=j;return o|0}return 0}function rca(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+5584|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}v2a(e);c[d>>2]=0;c[a+5588>>2]=0;i=b;return}function sca(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;k=i;i=i+16|0;l=k;m=c[b+80>>2]|0;if((c[b+8>>2]|0)!=8){RY(j,1,728168,l);n=0;i=k;return n|0}if((f|e|g|h|0)==0){RY(j,4,728248,l);c[b+28>>2]=0;c[b+32>>2]=0;c[b+36>>2]=c[b+112>>2];c[b+40>>2]=c[b+116>>2];n=1;i=k;return n|0}if(!((e|0)>-1)){_a(728320,727592,8013,728336)}if(!((f|0)>-1)){_a(728360,727592,8014,728336)}o=m+8|0;p=c[o>>2]|0;if(p>>>0<e>>>0){c[l>>2]=e;c[l+4>>2]=p;RY(j,1,728376,l);n=0;i=k;return n|0}p=c[m>>2]|0;if(p>>>0>e>>>0){c[l>>2]=e;c[l+4>>2]=p;RY(j,2,728464,l);c[b+28>>2]=0;c[d>>2]=c[m>>2]}else{c[b+28>>2]=((e-(c[b+92>>2]|0)|0)>>>0)/((c[b+100>>2]|0)>>>0)|0;c[d>>2]=e}e=m+12|0;p=c[e>>2]|0;if(p>>>0<f>>>0){c[l>>2]=f;c[l+4>>2]=p;RY(j,1,728552,l);n=0;i=k;return n|0}p=m+4|0;q=c[p>>2]|0;if(q>>>0>f>>>0){c[l>>2]=f;c[l+4>>2]=q;RY(j,2,728640,l);c[b+32>>2]=0;c[d+4>>2]=c[p>>2]}else{c[b+32>>2]=((f-(c[b+96>>2]|0)|0)>>>0)/((c[b+104>>2]|0)>>>0)|0;c[d+4>>2]=f}if((g|0)==0){_a(728728,727592,8054,728336)}if((h|0)==0){_a(728752,727592,8055,728336)}f=c[m>>2]|0;if(f>>>0>g>>>0){c[l>>2]=g;c[l+4>>2]=f;RY(j,1,728776,l);n=0;i=k;return n|0}f=c[o>>2]|0;if(f>>>0<g>>>0){c[l>>2]=g;c[l+4>>2]=f;RY(j,2,728872,l);c[b+36>>2]=c[b+112>>2];c[d+8>>2]=c[o>>2]}else{c[b+36>>2]=gca(g-(c[b+92>>2]|0)|0,c[b+100>>2]|0)|0;c[d+8>>2]=g}g=c[p>>2]|0;if(g>>>0>h>>>0){c[l>>2]=h;c[l+4>>2]=g;RY(j,1,728960,l);n=0;i=k;return n|0}g=c[e>>2]|0;if(g>>>0<h>>>0){c[l>>2]=h;c[l+4>>2]=g;RY(j,2,729056,l);c[b+40>>2]=c[b+116>>2];c[d+12>>2]=c[e>>2]}else{c[b+40>>2]=gca(h-(c[b+96>>2]|0)|0,c[b+104>>2]|0)|0;c[d+12>>2]=h}h=b+76|0;a[h>>0]=a[h>>0]|2;h=d+16|0;b=c[d>>2]|0;a:do{if((c[h>>2]|0)!=0){e=d+4|0;g=d+8|0;p=d+12|0;o=b;f=0;m=c[d+24>>2]|0;while(1){q=m+16|0;c[q>>2]=gca(o,c[m>>2]|0)|0;r=m+4|0;s=m+20|0;c[s>>2]=gca(c[e>>2]|0,c[r>>2]|0)|0;t=gca(c[g>>2]|0,c[m>>2]|0)|0;u=gca(c[p>>2]|0,c[r>>2]|0)|0;r=c[m+40>>2]|0;v=1<<r;w=((v|0)<0)<<31>>31;x=W2a(t|0,((t|0)<0)<<31>>31|0,-1,-1)|0;t=W2a(x|0,G|0,v|0,w|0)|0;x=$2a(t|0,G|0,r|0)|0;t=c[q>>2]|0;q=W2a(t|0,((t|0)<0)<<31>>31|0,-1,-1)|0;t=W2a(q|0,G|0,v|0,w|0)|0;q=$2a(t|0,G|0,r|0)|0;y=x-q|0;if((y|0)<0){z=37;break}c[m+8>>2]=y;q=W2a(u|0,((u|0)<0)<<31>>31|0,-1,-1)|0;u=W2a(q|0,G|0,v|0,w|0)|0;q=$2a(u|0,G|0,r|0)|0;u=c[s>>2]|0;s=W2a(u|0,((u|0)<0)<<31>>31|0,-1,-1)|0;u=W2a(s|0,G|0,v|0,w|0)|0;w=$2a(u|0,G|0,r|0)|0;A=q-w|0;if((A|0)<0){z=39;break}c[m+12>>2]=A;w=f+1|0;q=c[d>>2]|0;if(w>>>0<(c[h>>2]|0)>>>0){o=q;f=w;m=m+52|0}else{B=q;C=g;D=p;E=e;break a}}if((z|0)==37){c[l>>2]=f;c[l+4>>2]=y;RY(j,1,729152,l);n=0;i=k;return n|0}else if((z|0)==39){c[l>>2]=f;c[l+4>>2]=A;RY(j,1,729224,l);n=0;i=k;return n|0}}else{B=b;C=d+8|0;D=d+12|0;E=d+4|0}}while(0);d=c[E>>2]|0;E=c[C>>2]|0;C=c[D>>2]|0;c[l>>2]=B;c[l+4>>2]=d;c[l+8>>2]=E;c[l+12>>2]=C;RY(j,4,729296,l);n=1;i=k;return n|0}function tca(){var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=u2a(208)|0;if((d|0)==0){e=0;i=b;return e|0}f3a(d|0,0,208)|0;c[d>>2]=1;a[d+180>>0]=2;f=u2a(5632)|0;c[d+12>>2]=f;if((f|0)==0){fca(d);e=0;i=b;return e|0}f3a(f|0,0,5632)|0;f=u2a(1e3)|0;c[d+16>>2]=f;if((f|0)==0){fca(d);e=0;i=b;return e|0}c[d+20>>2]=1e3;c[d+60>>2]=-1;f=d+64|0;c[f>>2]=0;c[f+4>>2]=0;f=w2a(1,48)|0;if((f|0)!=0?(c[f+32>>2]=100,c[f+24>>2]=0,g=w2a(100,24)|0,c[f+28>>2]=g,(g|0)!=0):0){c[f+40>>2]=0;h=f}else{h=0}c[d+192>>2]=h;h=zba()|0;c[d+188>>2]=h;if((h|0)==0){fca(d);e=0;i=b;return e|0}h=zba()|0;c[d+184>>2]=h;if((h|0)!=0){e=d;i=b;return e|0}fca(d);e=0;i=b;return e|0}function uca(a,b,d){a=a|0;b=b|0;d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;f=i;i=i+32|0;g=f;if((b&384|0)!=0){Jb(729336,11,1,d|0)|0;i=f;return}if((b&1|0)!=0?(h=c[a+80>>2]|0,(h|0)!=0):0){vca(h,d)}if((b&2|0)!=0){Jb(730208,36,1,d|0)|0;h=c[a+96>>2]|0;c[g>>2]=c[a+92>>2];c[g+4>>2]=h;lc(d|0,730248,g|0)|0;h=c[a+104>>2]|0;c[g>>2]=c[a+100>>2];c[g+4>>2]=h;lc(d|0,730272,g|0)|0;h=c[a+116>>2]|0;c[g>>2]=c[a+112>>2];c[g+4>>2]=h;lc(d|0,730296,g|0)|0;wca(c[a+12>>2]|0,c[(c[a+80>>2]|0)+16>>2]|0,d);Jb(729464,2,1,d|0)|0}a:do{if((b&8|0)!=0?(h=ca(c[a+112>>2]|0,c[a+116>>2]|0)|0,(h|0)!=0):0){j=a+80|0;k=1;l=c[a+156>>2]|0;while(1){wca(l,c[(c[j>>2]|0)+16>>2]|0,d);if((k|0)==(h|0)){break a}k=k+1|0;l=l+5632|0}}}while(0);if((b&16|0)==0){i=f;return}b=c[a+192>>2]|0;Jb(730312,37,1,d|0)|0;a=b;l=c[a+4>>2]|0;k=b+8|0;h=c[k>>2]|0;j=c[k+4>>2]|0;k=g;c[k>>2]=c[a>>2];c[k+4>>2]=l;l=g+8|0;c[l>>2]=h;c[l+4>>2]=j;lc(d|0,730352,g|0)|0;Jb(730424,17,1,d|0)|0;j=b+28|0;l=c[j>>2]|0;b:do{if((l|0)!=0?(h=b+24|0,(c[h>>2]|0)!=0):0){k=l;a=0;while(1){m=k+(a*24|0)+8|0;n=c[m>>2]|0;o=c[m+4>>2]|0;m=c[k+(a*24|0)+16>>2]|0;c[g>>2]=e[k+(a*24|0)>>1]|0;p=g+4|0;c[p>>2]=n;c[p+4>>2]=o;c[g+12>>2]=m;lc(d|0,730448,g|0)|0;m=a+1|0;if(!(m>>>0<(c[h>>2]|0)>>>0)){break b}k=c[j>>2]|0;a=m}}}while(0);Jb(730480,4,1,d|0)|0;j=b+40|0;l=c[j>>2]|0;if((l|0)!=0?(a=b+36|0,b=c[a>>2]|0,(b|0)!=0):0){k=0;h=0;do{h=(c[l+(k*40|0)+4>>2]|0)+h|0;k=k+1|0}while((k|0)!=(b|0));if((h|0)!=0){Jb(730488,16,1,d|0)|0;if((c[a>>2]|0)!=0){h=c[j>>2]|0;b=0;while(1){k=c[h+(b*40|0)+4>>2]|0;c[g>>2]=b;c[g+4>>2]=k;lc(d|0,730512,g|0)|0;l=c[j>>2]|0;m=c[l+(b*40|0)+16>>2]|0;c:do{if((m|0)==0|(k|0)==0){q=l}else{o=m;p=0;while(1){n=o+(p*24|0)|0;r=c[n>>2]|0;s=c[n+4>>2]|0;n=o+(p*24|0)+8|0;t=c[n>>2]|0;u=c[n+4>>2]|0;n=o+(p*24|0)+16|0;v=c[n>>2]|0;w=c[n+4>>2]|0;c[g>>2]=p;n=g+4|0;c[n>>2]=r;c[n+4>>2]=s;s=g+12|0;c[s>>2]=t;c[s+4>>2]=u;u=g+20|0;c[u>>2]=v;c[u+4>>2]=w;lc(d|0,730552,g|0)|0;w=p+1|0;u=c[j>>2]|0;if((w|0)==(k|0)){q=u;break c}o=c[u+(b*40|0)+16>>2]|0;p=w}}}while(0);k=c[q+(b*40|0)+24>>2]|0;d:do{if((k|0)!=0?(c[q+(b*40|0)+20>>2]|0)!=0:0){m=k;l=0;while(1){p=m+(l*24|0)+8|0;o=c[p>>2]|0;w=c[p+4>>2]|0;p=c[m+(l*24|0)+16>>2]|0;c[g>>2]=e[m+(l*24|0)>>1]|0;u=g+4|0;c[u>>2]=o;c[u+4>>2]=w;c[g+12>>2]=p;lc(d|0,730448,g|0)|0;p=l+1|0;w=c[j>>2]|0;if(!(p>>>0<(c[w+(b*40|0)+20>>2]|0)>>>0)){x=w;break d}m=c[w+(b*40|0)+24>>2]|0;l=p}}else{x=q}}while(0);b=b+1|0;if(!(b>>>0<(c[a>>2]|0)>>>0)){break}else{h=x}}}Jb(730480,4,1,d|0)|0}}Jb(729464,2,1,d|0)|0;i=f;return}function vca(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+16|0;f=e;g=e+12|0;Jb(729352,13,1,d|0)|0;a[g>>0]=9;a[g+1>>0]=0;h=c[b>>2]|0;j=c[b+4>>2]|0;c[f>>2]=g;c[f+4>>2]=h;c[f+8>>2]=j;lc(d|0,729368,f|0)|0;j=c[b+8>>2]|0;h=c[b+12>>2]|0;c[f>>2]=g;c[f+4>>2]=j;c[f+8>>2]=h;lc(d|0,729392,f|0)|0;h=b+16|0;j=c[h>>2]|0;c[f>>2]=g;c[f+4>>2]=j;lc(d|0,729416,f|0)|0;j=b+24|0;if((c[j>>2]|0)==0){Jb(729464,2,1,d|0)|0;i=e;return}if((c[h>>2]|0)==0){Jb(729464,2,1,d|0)|0;i=e;return}else{k=0}do{c[f>>2]=g;c[f+4>>2]=k;lc(d|0,729432,f|0)|0;xca((c[j>>2]|0)+(k*52|0)|0,d);c[f>>2]=g;lc(d|0,729456,f|0)|0;k=k+1|0}while(k>>>0<(c[h>>2]|0)>>>0);Jb(729464,2,1,d|0)|0;i=e;return}function wca(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;i=i+16|0;f=e;if((a|0)==0){i=e;return}Jb(730624,17,1,d|0)|0;c[f>>2]=c[a>>2];lc(d|0,730648,f|0)|0;c[f>>2]=c[a+4>>2];lc(d|0,730664,f|0)|0;c[f>>2]=c[a+8>>2];lc(d|0,730680,f|0)|0;c[f>>2]=c[a+16>>2];lc(d|0,730704,f|0)|0;if((b|0)>0){g=a+5576|0;a=0;do{h=c[g>>2]|0;c[f>>2]=a;lc(d|0,730720,f|0)|0;c[f>>2]=c[h+(a*1080|0)>>2];lc(d|0,730736,f|0)|0;j=h+(a*1080|0)+4|0;c[f>>2]=c[j>>2];lc(d|0,730752,f|0)|0;c[f>>2]=c[h+(a*1080|0)+8>>2];lc(d|0,730776,f|0)|0;c[f>>2]=c[h+(a*1080|0)+12>>2];lc(d|0,730792,f|0)|0;c[f>>2]=c[h+(a*1080|0)+16>>2];lc(d|0,730808,f|0)|0;c[f>>2]=c[h+(a*1080|0)+20>>2];lc(d|0,730832,f|0)|0;Jb(730848,23,1,d|0)|0;if((c[j>>2]|0)!=0){k=0;do{l=c[h+(a*1080|0)+(k<<2)+944>>2]|0;c[f>>2]=c[h+(a*1080|0)+(k<<2)+812>>2];c[f+4>>2]=l;lc(d|0,730872,f|0)|0;k=k+1|0}while(k>>>0<(c[j>>2]|0)>>>0)}vc(10,d|0)|0;k=h+(a*1080|0)+24|0;c[f>>2]=c[k>>2];lc(d|0,730888,f|0)|0;c[f>>2]=c[h+(a*1080|0)+804>>2];lc(d|0,730904,f|0)|0;Jb(730928,20,1,d|0)|0;if((c[k>>2]|0)!=1){k=((c[j>>2]|0)*3|0)+ -2|0;if((k|0)>0){m=k;n=8}}else{m=1;n=8}if((n|0)==8){n=0;k=0;do{l=c[h+(a*1080|0)+(k<<3)+28>>2]|0;c[f>>2]=c[h+(a*1080|0)+(k<<3)+32>>2];c[f+4>>2]=l;lc(d|0,730872,f|0)|0;k=k+1|0}while((k|0)!=(m|0))}vc(10,d|0)|0;c[f>>2]=c[h+(a*1080|0)+808>>2];lc(d|0,730952,f|0)|0;Jb(730976,5,1,d|0)|0;a=a+1|0}while((a|0)!=(b|0))}Jb(730480,4,1,d|0)|0;i=e;return}function xca(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+16|0;f=e;g=e+12|0;a[g>>0]=9;a[g+1>>0]=9;a[g+2>>0]=0;h=c[b>>2]|0;j=c[b+4>>2]|0;c[f>>2]=g;c[f+4>>2]=h;c[f+8>>2]=j;lc(d|0,729472,f|0)|0;j=c[b+24>>2]|0;c[f>>2]=g;c[f+4>>2]=j;lc(d|0,729496,f|0)|0;j=c[b+32>>2]|0;c[f>>2]=g;c[f+4>>2]=j;lc(d|0,729512,f|0)|0;i=e;return}function yca(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;b=i;i=i+16|0;d=b;e=(c[a+80>>2]|0)+16|0;f=c[e>>2]|0;g=w2a(1,56)|0;c[d>>2]=g;if((g|0)==0){h=0;i=b;return h|0}j=c[e>>2]|0;c[g+24>>2]=j;c[g>>2]=c[a+92>>2];c[g+4>>2]=c[a+96>>2];c[g+8>>2]=c[a+100>>2];c[g+12>>2]=c[a+104>>2];c[g+16>>2]=c[a+112>>2];c[g+20>>2]=c[a+116>>2];c[g+52>>2]=0;e=c[a+12>>2]|0;c[g+32>>2]=c[e>>2];c[g+36>>2]=c[e+4>>2];c[g+40>>2]=c[e+8>>2];c[g+44>>2]=c[e+16>>2];a=w2a(j,1080)|0;c[g+48>>2]=a;if((a|0)==0){jZ(d);h=0;i=b;return h|0}if((f|0)==0){h=g;i=b;return h|0}g=e+5576|0;e=a;a=0;while(1){j=c[g>>2]|0;c[e+(a*1080|0)+4>>2]=c[j+(a*1080|0)>>2];k=j+(a*1080|0)+4|0;c[e+(a*1080|0)+8>>2]=c[k>>2];c[e+(a*1080|0)+12>>2]=c[j+(a*1080|0)+8>>2];c[e+(a*1080|0)+16>>2]=c[j+(a*1080|0)+12>>2];c[e+(a*1080|0)+20>>2]=c[j+(a*1080|0)+16>>2];c[e+(a*1080|0)+24>>2]=c[j+(a*1080|0)+20>>2];l=c[k>>2]|0;if(l>>>0<33){c3a(e+(a*1080|0)+948|0,j+(a*1080|0)+944|0,l|0)|0;c3a(e+(a*1080|0)+816|0,j+(a*1080|0)+812|0,c[k>>2]|0)|0}l=j+(a*1080|0)+24|0;c[e+(a*1080|0)+28>>2]=c[l>>2];c[e+(a*1080|0)+808>>2]=c[j+(a*1080|0)+804>>2];if((c[l>>2]|0)!=1){l=(c[k>>2]|0)*3|0;if((l+ -3|0)>>>0<96){m=l+ -2|0;n=10}}else{m=1;n=10}if((n|0)==10){n=0;l=0;do{c[e+(a*1080|0)+(l<<2)+32>>2]=c[j+(a*1080|0)+(l<<3)+32>>2];c[e+(a*1080|0)+(l<<2)+420>>2]=c[j+(a*1080|0)+(l<<3)+28>>2];l=l+1|0}while((l|0)!=(m|0))}c[e+(a*1080|0)+812>>2]=c[j+(a*1080|0)+808>>2];l=a+1|0;k=c[d>>2]|0;if((l|0)==(f|0)){h=k;break}e=c[k+48>>2]|0;a=l}i=b;return h|0}function zca(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;b=i;d=w2a(1,48)|0;if((d|0)==0){e=0;i=b;return e|0}f=a+192|0;a=c[f>>2]|0;g=a;h=c[g+4>>2]|0;j=d;c[j>>2]=c[g>>2];c[j+4>>2]=h;h=a+8|0;j=c[h+4>>2]|0;g=d+8|0;c[g>>2]=c[h>>2];c[g+4>>2]=j;j=a+16|0;g=c[j+4>>2]|0;h=d+16|0;c[h>>2]=c[j>>2];c[h+4>>2]=g;g=c[a+24>>2]|0;c[d+24>>2]=g;h=g*24|0;g=u2a(h)|0;j=d+28|0;c[j>>2]=g;if((g|0)==0){v2a(d);e=0;i=b;return e|0}k=c[a+28>>2]|0;if((k|0)==0){v2a(g);c[j>>2]=0;l=c[f>>2]|0;m=0}else{c3a(g|0,k|0,h|0)|0;l=a;m=g}g=c[l+36>>2]|0;c[d+36>>2]=g;a=w2a(g,40)|0;h=d+40|0;c[h>>2]=a;if((a|0)==0){v2a(m);v2a(d);e=0;i=b;return e|0}k=c[l+40>>2]|0;if((k|0)==0){v2a(a);c[h>>2]=0;e=d;i=b;return e|0}if((g|0)==0){e=d;i=b;return e|0}else{n=k;o=l;p=0}while(1){l=c[n+(p*40|0)+20>>2]|0;c[a+(p*40|0)+20>>2]=l;k=l*24|0;l=u2a(k)|0;h=a+(p*40|0)+24|0;c[h>>2]=l;if((l|0)==0){q=13;break}j=c[(c[o+40>>2]|0)+(p*40|0)+24>>2]|0;if((j|0)==0){v2a(l);c[h>>2]=0;r=c[f>>2]|0}else{c3a(l|0,j|0,k|0)|0;r=o}k=r+40|0;j=c[(c[k>>2]|0)+(p*40|0)+4>>2]|0;c[a+(p*40|0)+4>>2]=j;l=j*24|0;j=u2a(l)|0;h=a+(p*40|0)+16|0;c[h>>2]=j;if((j|0)==0){q=20;break}s=c[(c[k>>2]|0)+(p*40|0)+16>>2]|0;if((s|0)==0){v2a(j);c[h>>2]=0}else{c3a(j|0,s|0,l|0)|0}c[a+(p*40|0)+32>>2]=0;c[a+(p*40|0)+36>>2]=0;l=p+1|0;if(!(l>>>0<g>>>0)){e=d;q=28;break}s=c[f>>2]|0;n=c[s+40>>2]|0;o=s;p=l}if((q|0)==13){if((p|0)!=0){o=0;do{v2a(c[a+(o*40|0)+24>>2]|0);o=o+1|0}while((o|0)!=(p|0))}v2a(a);v2a(m);v2a(d);e=0;i=b;return e|0}else if((q|0)==20){if((p|0)!=0){o=0;do{v2a(c[a+(o*40|0)+24>>2]|0);v2a(c[a+(o*40|0)+16>>2]|0);o=o+1|0}while((o|0)!=(p|0))}v2a(a);v2a(m);v2a(d);e=0;i=b;return e|0}else if((q|0)==28){i=b;return e|0}return 0}function Aca(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;if((d|0)==0){g=0;i=f;return g|0}h=UY()|0;j=a+84|0;c[j>>2]=h;if((h|0)==0){g=0;i=f;return g|0}YY(d,h);if((a|0)==0){_a(727656,727592,9208,730112)}h=a+184|0;Bba(c[h>>2]|0,217);if((jca(a,c[h>>2]|0,b,e)|0)==0){e=a+80|0;VY(c[e>>2]|0);c[e>>2]=0;g=0;i=f;return g|0}e=d+16|0;if((c[e>>2]|0)==0){g=1;i=f;return g|0}a=d+24|0;d=0;do{c[(c[a>>2]|0)+(d*52|0)+36>>2]=c[(c[(c[j>>2]|0)+24>>2]|0)+(d*52|0)+36>>2];c[(c[a>>2]|0)+(d*52|0)+44>>2]=c[(c[(c[j>>2]|0)+24>>2]|0)+(d*52|0)+44>>2];c[(c[(c[j>>2]|0)+24>>2]|0)+(d*52|0)+44>>2]=0;d=d+1|0}while(d>>>0<(c[e>>2]|0)>>>0);g=1;i=f;return g|0}function Bca(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;g=i;i=i+16|0;h=g;if((d|0)==0){RY(e,1,729528,h);j=0;i=g;return j|0}k=c[a+112>>2]|0;l=ca(c[a+116>>2]|0,k)|0;if(!(l>>>0>f>>>0)){c[h>>2]=f;c[h+4>>2]=l+ -1;RY(e,1,729568,h);j=0;i=g;return j|0}h=(f>>>0)%(k>>>0)|0;l=(f>>>0)/(k>>>0)|0;k=a+100|0;m=ca(c[k>>2]|0,h)|0;n=a+92|0;o=m+(c[n>>2]|0)|0;c[d>>2]=o;m=a+80|0;p=c[c[m>>2]>>2]|0;c[d>>2]=o>>>0<p>>>0?p:o;o=ca(c[k>>2]|0,h+1|0)|0;h=o+(c[n>>2]|0)|0;n=d+8|0;c[n>>2]=h;o=c[(c[m>>2]|0)+8>>2]|0;c[n>>2]=h>>>0>o>>>0?o:h;h=a+104|0;o=ca(c[h>>2]|0,l)|0;k=a+96|0;p=o+(c[k>>2]|0)|0;o=d+4|0;c[o>>2]=p;q=c[(c[m>>2]|0)+4>>2]|0;c[o>>2]=p>>>0<q>>>0?q:p;p=ca(c[h>>2]|0,l+1|0)|0;l=p+(c[k>>2]|0)|0;k=d+12|0;c[k>>2]=l;p=c[(c[m>>2]|0)+12>>2]|0;c[k>>2]=l>>>0>p>>>0?p:l;l=d+24|0;p=d+16|0;if((c[p>>2]|0)!=0){h=0;q=c[l>>2]|0;while(1){r=q+40|0;c[r>>2]=c[(c[(c[m>>2]|0)+24>>2]|0)+(h*52|0)+40>>2];s=q+16|0;c[s>>2]=gca(c[d>>2]|0,c[q>>2]|0)|0;t=q+4|0;u=q+20|0;c[u>>2]=gca(c[o>>2]|0,c[t>>2]|0)|0;v=gca(c[n>>2]|0,c[q>>2]|0)|0;w=gca(c[k>>2]|0,c[t>>2]|0)|0;t=c[r>>2]|0;r=1<<t;x=((r|0)<0)<<31>>31;y=W2a(v|0,((v|0)<0)<<31>>31|0,-1,-1)|0;v=W2a(y|0,G|0,r|0,x|0)|0;y=$2a(v|0,G|0,t|0)|0;v=c[s>>2]|0;s=W2a(v|0,((v|0)<0)<<31>>31|0,-1,-1)|0;v=W2a(s|0,G|0,r|0,x|0)|0;s=$2a(v|0,G|0,t|0)|0;c[q+8>>2]=y-s;s=W2a(w|0,((w|0)<0)<<31>>31|0,-1,-1)|0;w=W2a(s|0,G|0,r|0,x|0)|0;s=$2a(w|0,G|0,t|0)|0;w=c[u>>2]|0;u=W2a(w|0,((w|0)<0)<<31>>31|0,-1,-1)|0;w=W2a(u|0,G|0,r|0,x|0)|0;x=$2a(w|0,G|0,t|0)|0;c[q+12>>2]=s-x;h=h+1|0;if(!(h>>>0<(c[p>>2]|0)>>>0)){break}else{q=q+52|0}}}q=a+84|0;h=c[q>>2]|0;if((h|0)!=0){VY(h)}h=UY()|0;c[q>>2]=h;if((h|0)==0){j=0;i=g;return j|0}YY(d,h);c[a+60>>2]=f;if((a|0)==0){_a(727656,727592,9341,729760)}f=a+184|0;Bba(c[f>>2]|0,218);if((jca(a,c[f>>2]|0,b,e)|0)==0){VY(c[m>>2]|0);c[m>>2]=0;j=0;i=g;return j|0}if((c[p>>2]|0)==0){j=1;i=g;return j|0}else{z=0}do{c[(c[l>>2]|0)+(z*52|0)+36>>2]=c[(c[(c[q>>2]|0)+24>>2]|0)+(z*52|0)+36>>2];m=c[l>>2]|0;e=c[m+(z*52|0)+44>>2]|0;if((e|0)==0){A=m}else{v2a(e);A=c[l>>2]|0}c[A+(z*52|0)+44>>2]=c[(c[(c[q>>2]|0)+24>>2]|0)+(z*52|0)+44>>2];c[(c[(c[q>>2]|0)+24>>2]|0)+(z*52|0)+44>>2]=0;z=z+1|0}while(z>>>0<(c[p>>2]|0)>>>0);j=1;i=g;return j|0}function Cca(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;i=i+16|0;f=e;c[a+160>>2]=b;g=a+80|0;h=c[g>>2]|0;if((h|0)==0){j=0;i=e;return j|0}if((c[h+24>>2]|0)==0){j=0;i=e;return j|0}k=a+12|0;a=c[k>>2]|0;if((a|0)==0){j=0;i=e;return j|0}l=c[a+5576>>2]|0;if((l|0)==0){j=0;i=e;return j|0}if((c[h+16>>2]|0)==0){j=1;i=e;return j|0}else{m=l;n=h;o=0}while(1){if(!((c[m+(o*1080|0)+4>>2]|0)>>>0>b>>>0)){break}c[(c[n+24>>2]|0)+(o*52|0)+40>>2]=b;h=o+1|0;l=c[g>>2]|0;if(!(h>>>0<(c[l+16>>2]|0)>>>0)){j=1;p=10;break}m=c[(c[k>>2]|0)+5576>>2]|0;n=l;o=h}if((p|0)==10){i=e;return j|0}RY(d,1,729632,f);j=0;i=e;return j|0}function Dca(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;e=i;i=i+48|0;f=e;g=e+36|0;h=e+32|0;j=e+28|0;k=e+24|0;l=e+20|0;m=e+16|0;n=e+12|0;o=e+8|0;c[g>>2]=1;p=u2a(1e3)|0;if((p|0)==0){RY(d,1,729792,f);q=0;i=e;return q|0}r=a+192|0;s=c[(c[r>>2]|0)+40>>2]|0;do{if((s|0)==0){if((kca(a)|0)!=0){t=c[(c[r>>2]|0)+40>>2]|0;u=c[a+60>>2]|0;if((t|0)==0){v=u;break}else{w=t;x=u;y=8;break}}v2a(p);q=0;i=e;return q|0}else{w=s;x=c[a+60>>2]|0;y=8}}while(0);if((y|0)==8){if((c[w+16>>2]|0)!=0){if((c[w+(x*40|0)+4>>2]|0)==0){s=a+64|0;u=W2a(c[s>>2]|0,c[s+4>>2]|0,2,0)|0;if((BY(b,u,G,d)|0)==0){RY(d,1,729832,f);v2a(p);q=0;i=e;return q|0}}else{u=c[w+(x*40|0)+16>>2]|0;w=W2a(c[u>>2]|0,c[u+4>>2]|0,2,0)|0;if((BY(b,w,G,d)|0)==0){RY(d,1,729832,f);v2a(p);q=0;i=e;return q|0}}w=a+8|0;if((c[w>>2]|0)==256){c[w>>2]=8;v=x}else{v=x}}else{v=x}}a:do{if((nca(a,h,j,k,l,m,n,o,g,b,d)|0)==0){z=p}else{x=a+116|0;w=a+112|0;u=a+200|0;s=a+84|0;t=p;A=1e3;while(1){if((c[g>>2]|0)==0){B=t;break}C=c[j>>2]|0;if(C>>>0>A>>>0){D=x2a(t,C)|0;if((D|0)==0){y=22;break}else{E=D;F=C}}else{E=t;F=A}D=c[h>>2]|0;if((qca(a,D,E,C,b,d)|0)==0){y=24;break}C=(ca(c[w>>2]|0,c[x>>2]|0)|0)+ -1|0;c[f>>2]=D;c[f+4>>2]=C;RY(d,4,729904,f);if((Eca(c[u>>2]|0,E,c[s>>2]|0)|0)==0){y=26;break}C=c[h>>2]|0;c[f>>2]=C;RY(d,4,729936,f);if((C|0)==(v|0)){y=28;break}c[f>>2]=C;c[f+4>>2]=v;RY(d,2,729984,f);if((nca(a,h,j,k,l,m,n,o,g,b,d)|0)==0){z=E;break a}else{t=E;A=F}}if((y|0)==22){v2a(t);A=(ca(c[w>>2]|0,c[x>>2]|0)|0)+ -1|0;c[f>>2]=c[h>>2];c[f+4>>2]=A;RY(d,1,729864,f);q=0;i=e;return q|0}else if((y|0)==24){v2a(E);q=0;i=e;return q|0}else if((y|0)==26){v2a(E);q=0;i=e;return q|0}else if((y|0)==28){A=(c[r>>2]|0)+8|0;s=W2a(c[A>>2]|0,c[A+4>>2]|0,2,0)|0;if((BY(b,s,G,d)|0)==0){RY(d,1,729832,f);q=0;i=e;return q|0}else{B=E}}v2a(B);q=1;i=e;return q|0}}while(0);v2a(z);q=0;i=e;return q|0}function Eca(f,g,h){f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0;j=i;k=c[f+24>>2]|0;l=k+16|0;if((c[l>>2]|0)==0){m=1;i=j;return m|0}n=g;g=0;o=c[h+24>>2]|0;h=c[k+24>>2]|0;k=c[(c[c[f+20>>2]>>2]|0)+20>>2]|0;while(1){f=o+44|0;p=c[f>>2]|0;q=o+8|0;if((p|0)==0){r=o+12|0;s=w2a(ca(c[r>>2]|0,c[q>>2]|0)|0,4)|0;c[f>>2]=s;if((s|0)==0){m=0;t=66;break}else{u=r;v=s}}else{u=o+12|0;v=p}p=h+36|0;c[o+36>>2]=c[p>>2];s=c[h+24>>2]|0;r=c[k+24>>2]|0;f=c[p>>2]|0;p=((s&7|0)!=0&1)+(s>>>3)|0;s=(p|0)==3?4:p;p=c[r+(f*136|0)+8>>2]|0;w=c[r+(f*136|0)>>2]|0;x=p-w|0;y=c[r+(f*136|0)+12>>2]|0;z=c[r+(f*136|0)+4>>2]|0;f=y-z|0;r=c[o+16>>2]|0;A=c[o+40>>2]|0;B=1<<A;C=((B|0)<0)<<31>>31;D=W2a(r|0,((r|0)<0)<<31>>31|0,-1,-1)|0;r=W2a(D|0,G|0,B|0,C|0)|0;D=$2a(r|0,G|0,A|0)|0;r=c[o+20>>2]|0;E=W2a(r|0,((r|0)<0)<<31>>31|0,-1,-1)|0;r=W2a(E|0,G|0,B|0,C|0)|0;C=$2a(r|0,G|0,A|0)|0;A=c[q>>2]|0;q=D+A|0;r=c[u>>2]|0;B=C+r|0;if(!((w|0)>-1)){t=7;break}if(!((p|0)>-1)){t=9;break}do{if(D>>>0<w>>>0){E=w-D|0;if(q>>>0<p>>>0){F=q-w|0;H=0;I=x-F|0;J=E;K=F}else{H=0;I=0;J=E;K=x}}else{E=D-w|0;if(q>>>0<p>>>0){H=E;I=p-q|0;J=0;K=A;break}else{H=E;I=0;J=0;K=x-E|0;break}}}while(0);do{if(C>>>0<z>>>0){q=z-C|0;if(B>>>0<y>>>0){p=B-z|0;L=p;M=0;N=f-p|0;O=q}else{L=f;M=0;N=0;O=q}}else{q=C-z|0;if(B>>>0<y>>>0){L=r;M=q;N=y-B|0;O=0;break}else{L=f-q|0;M=q;N=0;O=0;break}}}while(0);if((H|I|N|M|0)<0){m=0;t=66;break}if((L|K|0)<0){m=0;t=66;break}f=(ca(M,x)|0)+H|0;B=H+I|0;y=(ca(N,x)|0)-H|0;r=A-K|0;z=v+((ca(A,O)|0)+J<<2)|0;if((s|0)==4){C=n+(f<<2)|0;if((L|0)==0){P=C}else{q=(K|0)==0;p=0;w=z;D=C;while(1){if(q){Q=w;R=D}else{C=w+(K<<2)|0;E=0;F=w;S=D;while(1){c[F>>2]=c[S>>2];E=E+1|0;if((E|0)==(K|0)){break}else{F=F+4|0;S=S+4|0}}Q=C;R=D+(K<<2)|0}S=R+(B<<2)|0;p=p+1|0;if((p|0)==(L|0)){P=S;break}else{w=Q+(r<<2)|0;D=S}}}T=P+(y<<2)|0}else if((s|0)==2){D=n+(f<<1)|0;w=(L|0)==0;if((c[h+32>>2]|0)==0){if(w){U=D}else{p=(K|0)==0;q=0;A=z;x=D;while(1){if(p){V=A;W=x}else{S=A+(K<<2)|0;F=0;E=A;X=x;while(1){c[E>>2]=e[X>>1]|0;F=F+1|0;if((F|0)==(K|0)){break}else{E=E+4|0;X=X+2|0}}V=S;W=x+(K<<1)|0}X=W+(B<<1)|0;q=q+1|0;if((q|0)==(L|0)){U=X;break}else{A=V+(r<<2)|0;x=X}}}}else{if(w){U=D}else{x=(K|0)==0;A=0;q=z;p=D;while(1){if(x){Y=q;Z=p}else{X=q+(K<<2)|0;E=0;F=q;C=p;while(1){c[F>>2]=b[C>>1]|0;E=E+1|0;if((E|0)==(K|0)){break}else{F=F+4|0;C=C+2|0}}Y=X;Z=p+(K<<1)|0}C=Z+(B<<1)|0;A=A+1|0;if((A|0)==(L|0)){U=C;break}else{q=Y+(r<<2)|0;p=C}}}}T=U+(y<<1)|0}else if((s|0)==1){p=n+f|0;q=(L|0)==0;if((c[h+32>>2]|0)==0){if(q){_=p}else{A=(K|0)==0;x=0;D=z;w=p;while(1){if(A){$=D;aa=w}else{C=D+(K<<2)|0;F=0;E=D;S=w;while(1){c[E>>2]=d[S>>0]|0;F=F+1|0;if((F|0)==(K|0)){break}else{E=E+4|0;S=S+1|0}}$=C;aa=w+K|0}S=aa+B|0;x=x+1|0;if((x|0)==(L|0)){_=S;break}else{D=$+(r<<2)|0;w=S}}}}else{if(q){_=p}else{w=(K|0)==0;D=0;x=z;A=p;while(1){if(w){ba=x;da=A}else{f=x+(K<<2)|0;s=0;S=x;E=A;while(1){c[S>>2]=a[E>>0]|0;s=s+1|0;if((s|0)==(K|0)){break}else{S=S+4|0;E=E+1|0}}ba=f;da=A+K|0}E=da+B|0;D=D+1|0;if((D|0)==(L|0)){_=E;break}else{x=ba+(r<<2)|0;A=E}}}}T=_+y|0}else{T=n}g=g+1|0;if(!(g>>>0<(c[l>>2]|0)>>>0)){m=1;t=66;break}else{n=T;o=o+52|0;h=h+52|0;k=k+44|0}}if((t|0)==7){_a(730048,727592,7799,730064)}else if((t|0)==9){_a(730096,727592,7800,730064)}else if((t|0)==66){i=j;return m|0}return 0}function Fca(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;e=i;i=i+48|0;f=e;g=e+36|0;h=e+32|0;j=e+28|0;k=e+24|0;l=e+20|0;m=e+16|0;n=e+12|0;o=e+8|0;c[g>>2]=1;p=u2a(1e3)|0;if((p|0)==0){RY(d,1,730136,f);q=0;i=e;return q|0}r=a+116|0;s=a+112|0;t=a+200|0;u=a+84|0;v=a+8|0;w=p;p=1e3;x=0;while(1){if((nca(a,h,j,k,l,m,n,o,g,b,d)|0)==0){y=5;break}if((c[g>>2]|0)==0){z=w;y=17;break}A=c[j>>2]|0;if(A>>>0>p>>>0){B=x2a(w,A)|0;if((B|0)==0){y=9;break}else{C=B;D=A}}else{C=w;D=p}B=c[h>>2]|0;if((qca(a,B,C,A,b,d)|0)==0){y=11;break}A=ca(c[s>>2]|0,c[r>>2]|0)|0;c[f>>2]=B+1;c[f+4>>2]=A;RY(d,4,729904,f);if((Eca(c[t>>2]|0,C,c[u>>2]|0)|0)==0){y=13;break}c[f>>2]=(c[h>>2]|0)+1;RY(d,4,729936,f);A=PY(b)|0;if((A|0)==0&(G|0)==0?(c[v>>2]|0)==64:0){z=C;y=17;break}x=x+1|0;if((x|0)==(ca(c[s>>2]|0,c[r>>2]|0)|0)){z=C;y=17;break}else{w=C;p=D}}if((y|0)==5){v2a(w);q=0;i=e;return q|0}else if((y|0)==9){v2a(w);w=ca(c[s>>2]|0,c[r>>2]|0)|0;c[f>>2]=(c[h>>2]|0)+1;c[f+4>>2]=w;RY(d,1,729864,f);q=0;i=e;return q|0}else if((y|0)==11){v2a(C);w=ca(c[s>>2]|0,c[r>>2]|0)|0;c[f>>2]=(c[h>>2]|0)+1;c[f+4>>2]=w;RY(d,1,730176,f);q=0;i=e;return q|0}else if((y|0)==13){v2a(C);q=0;i=e;return q|0}else if((y|0)==17){v2a(z);q=1;i=e;return q|0}return 0}function Gca(a,b,c){a=a|0;b=b|0;c=c|0;return 1}function Hca(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;if((a|0)==0){_a(727656,727592,6878,731144)}if((b|0)==0){_a(727696,727592,6879,731144)}if((d|0)==0){_a(727712,727592,6880,731144)}else{i=e;return(c[a+8>>2]|0)==0&(c[a+184>>2]|0)!=0&(c[a+188>>2]|0)!=0&1|0}return 0}function Ica(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;e=i;i=i+32|0;f=e;g=e+20|0;h=e+16|0;j=e+12|0;k=e+8|0;if((b|0)==0){_a(727696,727592,6909,731216)}if((a|0)==0){_a(727656,727592,6910,731216)}if((d|0)==0){_a(727712,727592,6911,731216)}l=a+8|0;c[l>>2]=1;do{if((NY(b,g,2,d)|0)==2?(wY(g,h,2),(c[h>>2]|0)==65359):0){c[l>>2]=2;m=b+56|0;n=m;o=OY(c[n>>2]|0,c[n+4>>2]|0)|0;n=W2a(o|0,G|0,-2,-1)|0;o=a+192|0;p=c[o>>2]|0;c[p>>2]=n;c[p+4>>2]=G;p=c[o>>2]|0;n=c[p+4>>2]|0;q=f;c[q>>2]=c[p>>2];c[q+4>>2]=n;RY(d,4,731576,f);n=c[o>>2]|0;q=n;if((Kca(n,65359,c[q>>2]|0,c[q+4>>2]|0,2)|0)==0){RY(d,1,731448,f);break}q=a+16|0;if((NY(b,c[q>>2]|0,2,d)|0)!=2){RY(d,1,727776,f);r=0;i=e;return r|0}wY(c[q>>2]|0,j,2);n=c[j>>2]|0;a:do{if((n|0)!=65424){p=a+20|0;s=n;b:while(1){if(s>>>0<65280){t=17;break}u=oca(s)|0;if((c[u>>2]|0)==0){RY(d,2,731560,f);v=2;while(1){do{if((NY(b,c[q>>2]|0,2,d)|0)!=2){t=22;break b}wY(c[q>>2]|0,g,2);w=c[g>>2]|0}while(w>>>0<65280);x=oca(w)|0;if((c[x+4>>2]&c[l>>2]|0)==0){t=25;break b}y=c[x>>2]|0;if((y|0)==65424){t=27;break b}else if((y|0)!=0){break}v=v+2|0}y=c[o>>2]|0;z=m;A=OY(c[z>>2]|0,c[z+4>>2]|0)|0;if((Kca(y,0,A-v|0,0,v)|0)==0){t=29;break}A=c[x>>2]|0;c[j>>2]=A;if((A|0)==65424){break a}B=oca(A)|0}else{B=u}if((c[B+4>>2]&c[l>>2]|0)==0){t=35;break}if((NY(b,c[q>>2]|0,2,d)|0)!=2){t=37;break}wY(c[q>>2]|0,k,2);A=c[k>>2]|0;y=A+ -2|0;c[k>>2]=y;z=c[q>>2]|0;if(y>>>0>(c[p>>2]|0)>>>0){C=x2a(z,y)|0;if((C|0)==0){t=40;break}c[q>>2]=C;c[p>>2]=y;D=C}else{D=z}if((NY(b,D,y,d)|0)!=(y|0)){t=43;break}if((id[c[B+8>>2]&511](a,c[q>>2]|0,y,d)|0)==0){t=45;break}y=c[o>>2]|0;z=c[B>>2]|0;C=m;E=OY(c[C>>2]|0,c[C+4>>2]|0)|0;if((Kca(y,z,-2-A+E|0,0,A+2|0)|0)==0){t=47;break}if((NY(b,c[q>>2]|0,2,d)|0)!=2){t=49;break}wY(c[q>>2]|0,j,2);A=c[j>>2]|0;if((A|0)==65424){break a}else{s=A}}switch(t|0){case 17:{c[f>>2]=s;RY(d,1,731272,f);r=0;i=e;return r|0};case 22:{RY(d,1,727776,f);break};case 25:{RY(d,1,727800,f);break};case 27:{c[j>>2]=65424;break a;break};case 29:{RY(d,1,731448,f);break};case 35:{RY(d,1,727800,f);r=0;i=e;return r|0};case 37:{RY(d,1,727776,f);r=0;i=e;return r|0};case 40:{v2a(c[q>>2]|0);c[q>>2]=0;c[p>>2]=0;RY(d,1,727848,f);r=0;i=e;return r|0};case 43:{RY(d,1,727776,f);r=0;i=e;return r|0};case 45:{RY(d,1,731384,f);r=0;i=e;return r|0};case 47:{RY(d,1,731448,f);r=0;i=e;return r|0};case 49:{RY(d,1,727776,f);r=0;i=e;return r|0}}RY(d,1,731328,f);r=0;i=e;return r|0}}while(0);RY(d,4,731488,f);q=m;n=OY(c[q>>2]|0,c[q+4>>2]|0)|0;q=(c[o>>2]|0)+8|0;c[q>>2]=n+ -2;c[q+4>>2]=0;c[l>>2]=8;r=1;i=e;return r|0}}while(0);RY(d,1,731248,f);r=0;i=e;return r|0}function Jca(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;f=i;i=i+16|0;g=f;if((b|0)==0){_a(727656,727592,7077,731176)}if((d|0)==0){_a(727696,727592,7078,731176)}if((e|0)==0){_a(727712,727592,7079,731176)}d=c[b+80>>2]|0;h=b+88|0;j=ca(c[b+112>>2]|0,c[b+116>>2]|0)|0;k=c[d+16>>2]|0;l=k*1080|0;m=c[b+12>>2]|0;n=ca(k<<2,k)|0;a:do{if((j|0)!=0){k=m+5596|0;o=m+5612|0;p=m+5604|0;q=m+5608|0;r=m+5624|0;s=m+5616|0;t=m+5576|0;u=0;v=c[b+156>>2]|0;b:while(1){w=v+5576|0;x=c[w>>2]|0;c3a(v|0,m|0,5632)|0;y=v+5628|0;a[y>>0]=a[y>>0]&-2;c[v+5160>>2]=0;c[w>>2]=x;if((c[k>>2]|0)!=0){w=u2a(n)|0;c[v+5596>>2]=w;if((w|0)==0){z=0;A=31;break}c3a(w|0,c[k>>2]|0,n|0)|0}w=(c[o>>2]|0)*20|0;y=u2a(w)|0;B=v+5604|0;c[B>>2]=y;if((y|0)==0){z=0;A=31;break}c3a(y|0,c[p>>2]|0,w|0)|0;w=c[q>>2]|0;if((w|0)!=0){y=w;w=0;C=c[B>>2]|0;D=c[p>>2]|0;while(1){E=D+12|0;if((c[E>>2]|0)==0){F=y}else{G=D+16|0;H=u2a(c[G>>2]|0)|0;c[C+12>>2]=H;if((H|0)==0){z=0;A=31;break b}c3a(H|0,c[E>>2]|0,c[G>>2]|0)|0;F=c[q>>2]|0}w=w+1|0;if(!(w>>>0<F>>>0)){break}else{y=F;C=C+20|0;D=D+20|0}}}D=(c[r>>2]|0)*20|0;C=u2a(D)|0;y=v+5616|0;c[y>>2]=C;if((C|0)==0){z=0;A=31;break}c3a(C|0,c[s>>2]|0,D|0)|0;if((c[r>>2]|0)!=0){D=0;C=c[y>>2]|0;y=c[s>>2]|0;while(1){w=c[y+8>>2]|0;if((w|0)!=0){c[C+8>>2]=(c[B>>2]|0)+(((w-(c[p>>2]|0)|0)/20|0)*20|0)}w=c[y+12>>2]|0;if((w|0)!=0){c[C+12>>2]=(c[B>>2]|0)+(((w-(c[p>>2]|0)|0)/20|0)*20|0)}D=D+1|0;if(!(D>>>0<(c[r>>2]|0)>>>0)){break}else{C=C+20|0;y=y+20|0}}}c3a(x|0,c[t>>2]|0,l|0)|0;u=u+1|0;if(!(u>>>0<j>>>0)){break a}else{v=v+5632|0}}if((A|0)==31){i=f;return z|0}}}while(0);A=Wca(1)|0;j=b+200|0;c[j>>2]=A;if((A|0)==0){z=0;i=f;return z|0}if((Xca(A,d,h)|0)!=0){z=1;i=f;return z|0}Yca(c[j>>2]|0);c[j>>2]=0;RY(e,1,728008,g);z=0;i=f;return z|0}function Kca(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=i;if((a|0)==0){_a(731024,727592,6468,731536)}h=a+24|0;j=c[h>>2]|0;k=a+32|0;l=c[k>>2]|0;do{if((j+1|0)>>>0>l>>>0){m=~~(+(l>>>0)+100.0)>>>0;c[k>>2]=m;n=a+28|0;o=x2a(c[n>>2]|0,m*24|0)|0;if((o|0)!=0){c[n>>2]=o;p=o;q=c[h>>2]|0;break}v2a(c[n>>2]|0);c[n>>2]=0;c[k>>2]=0;r=0;s=0;c[h>>2]=s;i=f;return r|0}else{p=c[a+28>>2]|0;q=j}}while(0);j=a+28|0;b[p+(q*24|0)>>1]=d;d=$2a(0,e|0,32)|0;e=(c[j>>2]|0)+((c[h>>2]|0)*24|0)+8|0;c[e>>2]=d;c[e+4>>2]=G;c[(c[j>>2]|0)+((c[h>>2]|0)*24|0)+16>>2]=g;r=1;s=(c[h>>2]|0)+1|0;c[h>>2]=s;i=f;return r|0}function Lca(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;g=i;i=i+16|0;h=g;j=g+12|0;if((a|0)==0){_a(727656,727592,8571,734352)}if((f|0)==0){_a(727712,727592,8572,734352)}if((d|0)==0){_a(731616,727592,8573,734352)}if((c[a+8>>2]|0)==16){k=(c[a+156>>2]|0)+((c[a+196>>2]|0)*5632|0)|0}else{k=c[a+12>>2]|0}if(!((c[(c[a+80>>2]|0)+16>>2]|0)>>>0>b>>>0)){_a(729712,727592,8582,734352)}a=c[k+5576>>2]|0;k=c[e>>2]|0;if((k|0)==0){RY(f,1,734376,h);l=0;i=g;return l|0}c[e>>2]=k+ -1;wY(d,j,1);k=d+1|0;d=c[j>>2]|0;m=d&31;n=a+(b*1080|0)+24|0;c[n>>2]=m;c[a+(b*1080|0)+804>>2]=d>>>5;do{if((m|0)==1){o=1;p=16}else{d=(c[e>>2]|0)>>>((m|0)!=0&1);if(d>>>0>97){c[h>>2]=d;c[h+4>>2]=97;c[h+8>>2]=97;RY(f,2,734416,h);q=c[n>>2]|0}else{q=m}r=(d|0)==0;if((q|0)!=0){if(r){s=0;p=28;break}else{o=d;p=16;break}}if(!r){r=0;t=k;while(1){wY(t,j,1);if(r>>>0<97){c[a+(b*1080|0)+(r<<3)+28>>2]=(c[j>>2]|0)>>>3;c[a+(b*1080|0)+(r<<3)+32>>2]=0}r=r+1|0;if((r|0)==(d|0)){break}else{t=t+1|0}}}u=(c[e>>2]|0)-d|0}}while(0);if((p|0)==16){q=0;m=k;while(1){wY(m,j,2);if(q>>>0<97){k=c[j>>2]|0;c[a+(b*1080|0)+(q<<3)+28>>2]=k>>>11;c[a+(b*1080|0)+(q<<3)+32>>2]=k&2047}q=q+1|0;if((q|0)==(o|0)){s=o;p=28;break}else{m=m+2|0}}}if((p|0)==28){u=(c[e>>2]|0)-(s<<1)|0}c[e>>2]=u;if((c[n>>2]|0)!=1){l=1;i=g;return l|0}n=a+(b*1080|0)+28|0;u=a+(b*1080|0)+32|0;e=1;do{s=(c[n>>2]|0)-(((e+ -1|0)>>>0)/3|0)|0;c[a+(b*1080|0)+(e<<3)+28>>2]=(s|0)>0?s:0;c[a+(b*1080|0)+(e<<3)+32>>2]=c[u>>2];e=e+1|0}while((e|0)!=97);l=1;i=g;return l|0}function Mca(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;g=i;i=i+16|0;h=g;j=g+8|0;if((a|0)==0){_a(727656,727592,8319,734800)}if((f|0)==0){_a(727712,727592,8320,734800)}if((d|0)==0){_a(731616,727592,8321,734800)}k=a+8|0;if((c[k>>2]|0)==16){l=(c[a+156>>2]|0)+((c[a+196>>2]|0)*5632|0)|0}else{l=c[a+12>>2]|0}if(!((c[(c[a+80>>2]|0)+16>>2]|0)>>>0>b>>>0)){_a(734832,727592,8329,734800)}m=c[l+5576>>2]|0;if((c[e>>2]|0)>>>0<5){RY(f,1,734880,h);n=0;i=g;return n|0}l=m+(b*1080|0)+4|0;wY(d,l,1);o=(c[l>>2]|0)+1|0;c[l>>2]=o;if(o>>>0>33){c[h>>2]=o;c[h+4>>2]=33;RY(f,1,734920,h);n=0;i=g;return n|0}if(!((c[a+160>>2]|0)>>>0<o>>>0)){c[h>>2]=b;RY(f,1,735e3,h);c[k>>2]=c[k>>2]|32768;n=0;i=g;return n|0}k=m+(b*1080|0)+8|0;wY(d+1|0,k,1);c[k>>2]=(c[k>>2]|0)+2;k=m+(b*1080|0)+12|0;wY(d+2|0,k,1);c[k>>2]=(c[k>>2]|0)+2;wY(d+3|0,m+(b*1080|0)+16|0,1);wY(d+4|0,m+(b*1080|0)+20|0,1);k=(c[e>>2]|0)+ -5|0;c[e>>2]=k;o=c[l>>2]|0;if((c[m+(b*1080|0)>>2]&1|0)==0){if((o|0)==0){n=1;i=g;return n|0}else{p=0}do{c[m+(b*1080|0)+(p<<2)+812>>2]=15;c[m+(b*1080|0)+(p<<2)+944>>2]=15;p=p+1|0}while(p>>>0<(c[l>>2]|0)>>>0);n=1;i=g;return n|0}if(k>>>0<o>>>0){RY(f,1,734880,h);n=0;i=g;return n|0}if((o|0)==0){q=0;r=k}else{k=0;o=d+5|0;while(1){wY(o,j,1);d=c[j>>2]|0;c[m+(b*1080|0)+(k<<2)+812>>2]=d&15;c[m+(b*1080|0)+(k<<2)+944>>2]=d>>>4;k=k+1|0;s=c[l>>2]|0;if(!(k>>>0<s>>>0)){break}else{o=o+1|0}}q=s;r=c[e>>2]|0}c[e>>2]=r-q;n=1;i=g;return n|0}function Nca(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;if((e|0)==0){i=f;return}else{g=0}do{h=a+(g<<2)|0;j=b+(g<<2)|0;k=c[j>>2]|0;l=d+(g<<2)|0;m=c[l>>2]|0;n=(c[h>>2]|0)-(m+k>>2)|0;c[h>>2]=n+m;c[j>>2]=n;c[l>>2]=n+k;g=g+1|0}while((g|0)!=(e|0));i=f;return}function Oca(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,h=0,j=0.0,k=0,l=0.0,m=0,n=0.0;e=i;if((d|0)==0){i=e;return}else{f=0}do{h=a+(f<<2)|0;j=+g[h>>2];k=b+(f<<2)|0;l=+g[k>>2];m=c+(f<<2)|0;n=+g[m>>2];g[h>>2]=j+n*1.4019999504089355;g[k>>2]=j-l*.3441300094127655-n*.714139997959137;g[m>>2]=j+l*1.7719999551773071;f=f+1|0}while((f|0)!=(d|0));i=e;return}function Pca(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0,r=0;f=i;h=u2a(e<<3)|0;if((h|0)==0){j=0;i=f;return j|0}if((b|0)!=0){k=(e|0)==0;l=0;do{if(!k){m=0;do{g[h+(m<<2)>>2]=+g[c[d+(m<<2)>>2]>>2];m=m+1|0}while((m|0)!=(e|0));n=0;o=a;while(1){m=h+(n+e<<2)|0;g[m>>2]=0.0;p=0.0;q=0;r=o;while(1){p=p+ +g[r>>2]*+g[h+(q<<2)>>2];g[m>>2]=p;q=q+1|0;if((q|0)==(e|0)){break}else{r=r+4|0}}r=d+(n<<2)|0;q=c[r>>2]|0;c[r>>2]=q+4;g[q>>2]=p;n=n+1|0;if((n|0)==(e|0)){break}else{o=o+(e<<2)|0}}}l=l+1|0}while((l|0)!=(b|0))}v2a(h);j=1;i=f;return j|0}function Qca(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;f=i;i=i+32|0;g=f+28|0;h=f+24|0;j=f+20|0;k=f+16|0;l=f+12|0;m=f+8|0;n=f+4|0;o=f;if((d|0)==0){_a(735888,735904,1182,735968)}if((b|0)==0){_a(735992,735904,1183,735968)}if(!((ca(c[d+28>>2]|0,c[d+24>>2]|0)|0)>>>0>e>>>0)){_a(736008,735904,1184,735968)}p=c[d+68>>2]|0;q=p+(e*5632|0)|0;r=p+(e*5632|0)+420|0;s=(c[r>>2]|0)+1|0;t=b+16|0;u=c[t>>2]|0;v=u2a(u*528|0)|0;if((v|0)==0){w=0;i=f;return w|0}x=u2a(u<<2)|0;if((x|0)==0){v2a(v);w=0;i=f;return w|0}u=Rca(b,d,e)|0;if((u|0)==0){v2a(v);v2a(x);w=0;i=f;return w|0}y=c[t>>2]|0;if((y|0)!=0){z=0;A=v;while(1){c[x+(z<<2)>>2]=A;z=z+1|0;if(!(z>>>0<y>>>0)){break}else{A=A+528|0}}}Sca(b,d,e,j,k,l,m,n,o,h,g,x);o=c[h>>2]|0;n=ca(c[t>>2]|0,o)|0;t=ca(c[g>>2]|0,n)|0;d=p+(e*5632|0)+8|0;A=w2a(ca((c[d>>2]|0)+1|0,t)|0,2)|0;c[u+4>>2]=A;if((A|0)==0){v2a(v);v2a(x);Tca(u,s);w=0;i=f;return w|0}f3a(A|0,0,ca(t<<1,(c[d>>2]|0)+1|0)|0)|0;A=c[u+196>>2]|0;y=b+24|0;b=c[y>>2]|0;c[u+200>>2]=c[j>>2];c[u+204>>2]=c[l>>2];c[u+208>>2]=c[k>>2];c[u+212>>2]=c[m>>2];c[u+20>>2]=1;c[u+16>>2]=o;c[u+12>>2]=n;c[u+8>>2]=t;z=u+192|0;if((c[z>>2]|0)!=0){B=0;C=A;A=b;while(1){b=c[C+12>>2]|0;D=c[x+(B<<2)>>2]|0;c[C>>2]=c[A>>2];c[C+4>>2]=c[A+4>>2];E=C+8|0;if((c[E>>2]|0)!=0){F=D;D=b;b=0;while(1){c[D>>2]=c[F>>2];c[D+4>>2]=c[F+4>>2];c[D+8>>2]=c[F+8>>2];c[D+12>>2]=c[F+12>>2];b=b+1|0;if(!(b>>>0<(c[E>>2]|0)>>>0)){break}else{F=F+16|0;D=D+16|0}}}B=B+1|0;if(!(B>>>0<(c[z>>2]|0)>>>0)){break}else{C=C+16|0;A=A+52|0}}}a:do{if(s>>>0>1){A=u;C=2;while(1){z=A+232|0;B=c[A+428>>2]|0;D=c[y>>2]|0;c[A+432>>2]=c[j>>2];c[A+436>>2]=c[l>>2];c[A+440>>2]=c[k>>2];c[A+444>>2]=c[m>>2];c[A+252>>2]=1;c[A+248>>2]=o;c[A+244>>2]=n;c[A+240>>2]=t;F=A+424|0;if((c[F>>2]|0)!=0){E=0;b=B;B=D;while(1){D=c[b+12>>2]|0;G=c[x+(E<<2)>>2]|0;c[b>>2]=c[B>>2];c[b+4>>2]=c[B+4>>2];H=b+8|0;if((c[H>>2]|0)!=0){I=G;G=D;D=0;while(1){c[G>>2]=c[I>>2];c[G+4>>2]=c[I+4>>2];c[G+8>>2]=c[I+8>>2];c[G+12>>2]=c[I+12>>2];D=D+1|0;if(!(D>>>0<(c[H>>2]|0)>>>0)){break}else{I=I+16|0;G=G+16|0}}}E=E+1|0;if(!(E>>>0<(c[F>>2]|0)>>>0)){break}else{b=b+16|0;B=B+52|0}}}c[A+236>>2]=c[A+4>>2];if((C|0)==(s|0)){break a}A=z;C=C+1|0}}}while(0);v2a(v);v2a(x);x=c[h>>2]|0;if((a[p+(e*5632|0)+5628>>0]&2)==0){h=c[g>>2]|0;if((q|0)==0){_a(736040,735904,1039,736056)}g=(c[r>>2]|0)+1|0;if((g|0)==0){w=u;i=f;return w|0}v=p+(e*5632|0)+4|0;s=u;t=0;while(1){c[s+80>>2]=c[v>>2];c[s+40>>2]=1;c[s+44>>2]=0;c[s+48>>2]=0;c[s+64>>2]=0;c[s+68>>2]=0;c[s+56>>2]=h;c[s+60>>2]=c[s+192>>2];c[s+52>>2]=c[d>>2];c[s+72>>2]=x;t=t+1|0;if((t|0)==(g|0)){w=u;break}else{s=s+232|0}}i=f;return w|0}else{if((q|0)==0){_a(736040,735904,1002,736088)}q=(c[r>>2]|0)+1|0;if((q|0)==0){w=u;i=f;return w|0}r=u;s=p+(e*5632|0)+424|0;e=0;while(1){c[r+80>>2]=c[s+36>>2];c[r+40>>2]=1;c[r+44>>2]=c[s>>2];c[r+48>>2]=c[s+4>>2];c[r+64>>2]=0;c[r+68>>2]=0;c[r+56>>2]=c[s+12>>2];c[r+60>>2]=c[s+16>>2];c[r+52>>2]=c[s+8>>2];c[r+72>>2]=x;e=e+1|0;if((e|0)==(q|0)){w=u;break}else{r=r+232|0;s=s+148|0}}i=f;return w|0}return 0}function Rca(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;if((b|0)==0){_a(736184,735904,805,736200)}if((a|0)==0){_a(736216,735904,806,736200)}if(!((ca(c[b+28>>2]|0,c[b+24>>2]|0)|0)>>>0>d>>>0)){_a(736232,735904,807,736200)}f=c[b+68>>2]|0;b=(c[f+(d*5632|0)+420>>2]|0)+1|0;g=w2a(b,232)|0;if((g|0)==0){h=0;i=e;return h|0}f3a(g|0,0,b*232|0)|0;if((b|0)==0){h=g;i=e;return h|0}j=a+16|0;a=f+(d*5632|0)+5576|0;d=c[j>>2]|0;f=g;k=0;a:while(1){l=w2a(d,16)|0;m=f+196|0;c[m>>2]=l;if((l|0)==0){n=11;break}c[f+192>>2]=c[j>>2];o=c[j>>2]|0;f3a(l|0,0,o<<4|0)|0;if((o|0)==0){p=0}else{o=0;while(1){l=c[m>>2]|0;q=(c[a>>2]|0)+(o*1080|0)+4|0;r=u2a(c[q>>2]<<4)|0;c[l+(o<<4)+12>>2]=r;if((r|0)==0){n=14;break a}c[l+(o<<4)+8>>2]=c[q>>2];f3a(r|0,0,c[q>>2]<<4|0)|0;o=o+1|0;q=c[j>>2]|0;if(!(o>>>0<q>>>0)){p=q;break}}}k=k+1|0;if(!(k>>>0<b>>>0)){h=g;n=17;break}else{d=p;f=f+232|0}}if((n|0)==11){Tca(g,b);h=0;i=e;return h|0}else if((n|0)==14){Tca(g,b);h=0;i=e;return h|0}else if((n|0)==17){i=e;return h|0}return 0}function Sca(a,b,d,e,f,g,h,j,k,l,m,n){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0;o=i;if((b|0)==0){_a(735888,735904,697,736120)}if((a|0)==0){_a(735992,735904,698,736120)}p=c[b+24>>2]|0;if(!((ca(c[b+28>>2]|0,p)|0)>>>0>d>>>0)){_a(736152,735904,699,736120)}q=c[(c[b+68>>2]|0)+(d*5632|0)+5576>>2]|0;r=c[a+24>>2]|0;s=(d>>>0)%(p>>>0)|0;t=(d>>>0)/(p>>>0)|0;p=b+4|0;d=b+12|0;u=(ca(c[d>>2]|0,s)|0)+(c[p>>2]|0)|0;v=c[a>>2]|0;c[e>>2]=(u|0)>(v|0)?u:v;v=(ca(c[d>>2]|0,s+1|0)|0)+(c[p>>2]|0)|0;p=c[a+8>>2]|0;c[f>>2]=(v|0)<(p|0)?v:p;p=b+8|0;v=b+16|0;b=(ca(c[v>>2]|0,t)|0)+(c[p>>2]|0)|0;s=c[a+4>>2]|0;c[g>>2]=(b|0)>(s|0)?b:s;s=(ca(c[v>>2]|0,t+1|0)|0)+(c[p>>2]|0)|0;p=c[a+12>>2]|0;c[h>>2]=(s|0)<(p|0)?s:p;c[l>>2]=0;c[m>>2]=0;c[j>>2]=2147483647;c[k>>2]=2147483647;p=a+16|0;if((c[p>>2]|0)==0){i=o;return}else{w=0;x=r;y=q}while(1){q=c[n+(w<<2)>>2]|0;r=Vca(c[e>>2]|0,c[x>>2]|0)|0;a=x+4|0;s=Vca(c[g>>2]|0,c[a>>2]|0)|0;t=Vca(c[f>>2]|0,c[x>>2]|0)|0;v=Vca(c[h>>2]|0,c[a>>2]|0)|0;b=y+4|0;d=c[b>>2]|0;if(d>>>0>(c[m>>2]|0)>>>0){c[m>>2]=d;z=c[b>>2]|0}else{z=d}if((z|0)!=0){d=W2a(r|0,((r|0)<0)<<31>>31|0,-1,-1)|0;r=G;u=W2a(s|0,((s|0)<0)<<31>>31|0,-1,-1)|0;s=G;A=W2a(t|0,((t|0)<0)<<31>>31|0,-1,-1)|0;t=G;B=W2a(v|0,((v|0)<0)<<31>>31|0,-1,-1)|0;v=G;C=q;q=z;D=0;while(1){q=q+ -1|0;E=c[y+(D<<2)+812>>2]|0;F=c[y+(D<<2)+944>>2]|0;c[C>>2]=E;c[C+4>>2]=F;H=c[x>>2]<<E+q;I=c[a>>2]<<F+q;J=c[j>>2]|0;c[j>>2]=(J|0)<(H|0)?J:H;H=c[k>>2]|0;c[k>>2]=(H|0)<(I|0)?H:I;I=1<<q;H=((I|0)<0)<<31>>31;J=W2a(d|0,r|0,I|0,H|0)|0;K=$2a(J|0,G|0,q|0)|0;J=W2a(u|0,s|0,I|0,H|0)|0;L=$2a(J|0,G|0,q|0)|0;J=W2a(A|0,t|0,I|0,H|0)|0;M=$2a(J|0,G|0,q|0)|0;J=W2a(B|0,v|0,I|0,H|0)|0;H=$2a(J|0,G|0,q|0)|0;J=1<<F;I=W2a(H|0,((H|0)<0)<<31>>31|0,-1,-1)|0;N=W2a(I|0,G|0,J|0,((J|0)<0)<<31>>31|0)|0;J=$2a(N|0,G|0,F|0)|0;if((K|0)==(M|0)){O=0}else{N=1<<E;I=W2a(M|0,((M|0)<0)<<31>>31|0,-1,-1)|0;M=W2a(I|0,G|0,N|0,((N|0)<0)<<31>>31|0)|0;N=$2a(M|0,G|0,E|0)|0;O=(N<<E)-(K>>E<<E)>>E}if((L|0)==(H|0)){P=0}else{P=(J<<F)-(L>>F<<F)>>F}c[C+8>>2]=O;c[C+12>>2]=P;F=ca(P,O)|0;if(F>>>0>(c[l>>2]|0)>>>0){c[l>>2]=F}D=D+1|0;if(!(D>>>0<(c[b>>2]|0)>>>0)){break}else{C=C+16|0}}}w=w+1|0;if(!(w>>>0<(c[p>>2]|0)>>>0)){break}else{x=x+52|0;y=y+1080|0}}i=o;return}function Tca(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;if((a|0)==0){i=d;return}e=a+4|0;f=c[e>>2]|0;if((f|0)!=0){v2a(f);c[e>>2]=0}if((b|0)!=0){e=a;f=0;while(1){g=e+196|0;h=c[g>>2]|0;if((h|0)!=0){j=e+192|0;k=c[j>>2]|0;if((k|0)==0){l=h}else{m=k;k=0;n=h;while(1){h=n+12|0;o=c[h>>2]|0;if((o|0)==0){p=m}else{v2a(o);c[h>>2]=0;p=c[j>>2]|0}k=k+1|0;if(!(k>>>0<p>>>0)){break}else{m=p;n=n+16|0}}l=c[g>>2]|0}v2a(l);c[g>>2]=0}f=f+1|0;if((f|0)==(b|0)){break}else{e=e+232|0}}}v2a(a);i=d;return}function Uca(d){d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0;e=i;switch(c[d+80>>2]|0){case 2:{f=d+40|0;if((c[f>>2]|0)==0){g=d+36|0;h=g;j=c[g>>2]|0;k=83}else{c[f>>2]=0;f=d+224|0;c[f>>2]=0;g=d+228|0;c[g>>2]=0;l=c[d+192>>2]|0;if((l|0)!=0){m=c[d+196>>2]|0;n=0;o=0;p=0;while(1){q=m+(p<<4)+8|0;r=c[q>>2]|0;if((r|0)==0){s=n;t=o}else{u=m+(p<<4)+12|0;v=m+(p<<4)|0;w=m+(p<<4)+4|0;x=r;r=o;y=n;z=0;A=0;while(1){B=c[u>>2]|0;C=x+ -1+z|0;D=c[v>>2]<<(c[B+(A<<4)>>2]|0)+C;E=c[w>>2]<<(c[B+(A<<4)+4>>2]|0)+C;if((r|0)==0){F=D}else{F=r>>>0<D>>>0?r:D}c[f>>2]=F;if((y|0)==0){G=E}else{G=y>>>0<E>>>0?y:E}c[g>>2]=G;E=A+1|0;x=c[q>>2]|0;if(!(E>>>0<x>>>0)){s=G;t=F;break}else{r=F;y=G;z=~A;A=E}}}p=p+1|0;if((p|0)==(l|0)){break}else{n=s;o=t}}}if((a[d>>0]|0)==0){c[d+104>>2]=c[d+204>>2];c[d+96>>2]=c[d+200>>2];c[d+108>>2]=c[d+212>>2];c[d+100>>2]=c[d+208>>2]}t=c[d+44>>2]|0;c[d+28>>2]=t;H=t;k=61}while(1){if((k|0)==61){k=0;if(!(H>>>0<(c[d+56>>2]|0)>>>0)){I=0;k=169;break}t=c[d+104>>2]|0;c[d+220>>2]=t;J=t;k=63}else if((k|0)==83){k=0;t=j+1|0;c[h>>2]=t;K=t;k=78}while(1){if((k|0)==63){k=0;if((J|0)>=(c[d+108>>2]|0)){k=87;break}t=c[d+96>>2]|0;c[d+216>>2]=t;L=t;k=65}else if((k|0)==78){k=0;if(K>>>0<(c[d+52>>2]|0)>>>0){break}M=d+24|0;k=84}while(1){if((k|0)==65){k=0;if((L|0)>=(c[d+100>>2]|0)){k=86;break}t=c[d+48>>2]|0;o=d+24|0;c[o>>2]=t;N=o;O=t}else if((k|0)==84){k=0;t=(c[M>>2]|0)+1|0;c[M>>2]=t;N=d+24|0;O=t}if(!(O>>>0<(c[d+60>>2]|0)>>>0)){t=c[d+224>>2]|0;o=d+216|0;s=c[o>>2]|0;n=s+t-((s|0)%(t|0)|0)|0;c[o>>2]=n;L=n;k=65;continue}n=c[d+196>>2]|0;o=c[d+28>>2]|0;t=c[n+(O<<4)+8>>2]|0;if(!(o>>>0<t>>>0)){M=N;k=84;continue}s=c[n+(O<<4)+12>>2]|0;P=t+~o|0;t=d+200|0;l=n+(O<<4)|0;Q=Vca(c[t>>2]|0,c[l>>2]<<P)|0;p=d+204|0;R=n+(O<<4)+4|0;S=Vca(c[p>>2]|0,c[R>>2]<<P)|0;n=Vca(c[d+208>>2]|0,c[l>>2]<<P)|0;G=Vca(c[d+212>>2]|0,c[R>>2]<<P)|0;T=s+(o<<4)|0;F=(c[T>>2]|0)+P|0;U=s+(o<<4)+4|0;g=(c[U>>2]|0)+P|0;V=d+220|0;f=c[V>>2]|0;if(((f|0)%(c[R>>2]<<g|0)|0|0)!=0){if((f|0)!=(c[p>>2]|0)){M=N;k=84;continue}if(((S<<P|0)%(1<<g|0)|0|0)==0){M=N;k=84;continue}}W=c[d+216>>2]|0;X=c[l>>2]|0;if(((W|0)%(X<<F|0)|0|0)!=0){if((W|0)!=(c[t>>2]|0)){M=N;k=84;continue}if(((Q<<P|0)%(1<<F|0)|0|0)==0){M=N;k=84;continue}}Y=s+(o<<4)+8|0;if((c[Y>>2]|0)==0){M=N;k=84;continue}if(((Q|0)==(n|0)?1:(c[s+(o<<4)+12>>2]|0)==0)|(S|0)==(G|0)){M=N;k=84}else{k=77;break}}if((k|0)==77){k=0;G=Vca(W,X<<P)|0;o=c[T>>2]|0;s=Vca(c[V>>2]|0,c[R>>2]<<P)|0;n=c[U>>2]|0;c[d+32>>2]=(G>>o)-(Q>>o)+(ca((s>>n)-(S>>n)|0,c[Y>>2]|0)|0);n=c[d+64>>2]|0;c[d+36>>2]=n;K=n;k=78;continue}else if((k|0)==86){k=0;n=c[d+228>>2]|0;s=d+220|0;o=c[s>>2]|0;G=o+n-((o|0)%(n|0)|0)|0;c[s>>2]=G;J=G;k=63;continue}}if((k|0)==87){k=0;G=d+28|0;s=(c[G>>2]|0)+1|0;c[G>>2]=s;H=s;k=61;continue}s=ca(c[d+8>>2]|0,K)|0;G=(ca(c[d+12>>2]|0,c[d+28>>2]|0)|0)+s|0;s=G+(ca(c[d+16>>2]|0,c[d+24>>2]|0)|0)|0;G=s+(ca(c[d+20>>2]|0,c[d+32>>2]|0)|0)|0;Z=(c[d+4>>2]|0)+(G<<1)|0;if((b[Z>>1]|0)==0){break}h=d+36|0;j=K;k=83}if((k|0)==169){i=e;return I|0}b[Z>>1]=1;I=1;i=e;return I|0};case 3:{Z=d+40|0;if((c[Z>>2]|0)==0){K=d+36|0;_=K;$=c[K>>2]|0;aa=(c[d+196>>2]|0)+(c[d+24>>2]<<4)|0;k=125}else{c[Z>>2]=0;Z=d+224|0;c[Z>>2]=0;K=d+228|0;c[K>>2]=0;j=c[d+192>>2]|0;if((j|0)!=0){h=c[d+196>>2]|0;H=0;J=0;Y=0;while(1){S=h+(Y<<4)+8|0;Q=c[S>>2]|0;if((Q|0)==0){ba=H;da=J}else{U=h+(Y<<4)+12|0;P=h+(Y<<4)|0;R=h+(Y<<4)+4|0;V=Q;Q=J;T=H;X=0;W=0;while(1){N=c[U>>2]|0;M=V+ -1+X|0;O=c[P>>2]<<(c[N+(W<<4)>>2]|0)+M;L=c[R>>2]<<(c[N+(W<<4)+4>>2]|0)+M;if((Q|0)==0){ea=O}else{ea=Q>>>0<O>>>0?Q:O}c[Z>>2]=ea;if((T|0)==0){fa=L}else{fa=T>>>0<L>>>0?T:L}c[K>>2]=fa;L=W+1|0;V=c[S>>2]|0;if(!(L>>>0<V>>>0)){ba=fa;da=ea;break}else{Q=ea;T=fa;X=~W;W=L}}}Y=Y+1|0;if((Y|0)==(j|0)){break}else{H=ba;J=da}}}if((a[d>>0]|0)==0){da=c[d+204>>2]|0;c[d+104>>2]=da;c[d+96>>2]=c[d+200>>2];c[d+108>>2]=c[d+212>>2];c[d+100>>2]=c[d+208>>2];ga=da}else{ga=c[d+104>>2]|0}c[d+220>>2]=ga;ha=ga;k=104}while(1){if((k|0)==104){k=0;if((ha|0)>=(c[d+108>>2]|0)){I=0;k=169;break}ga=c[d+96>>2]|0;c[d+216>>2]=ga;ia=ga;k=106}else if((k|0)==125){k=0;ga=$+1|0;c[_>>2]=ga;ja=ga;ka=aa;k=120}while(1){if((k|0)==106){k=0;if((ia|0)>=(c[d+100>>2]|0)){k=129;break}ga=c[d+48>>2]|0;c[d+24>>2]=ga;la=ga;k=108}else if((k|0)==120){k=0;if(ja>>>0<(c[d+52>>2]|0)>>>0){break}ma=d+28|0;na=ka;k=126}while(1){if((k|0)==108){k=0;if(!(la>>>0<(c[d+60>>2]|0)>>>0)){k=128;break}ga=(c[d+196>>2]|0)+(la<<4)|0;da=c[d+44>>2]|0;J=d+28|0;c[J>>2]=da;oa=J;pa=da;qa=ga}else if((k|0)==126){k=0;ga=(c[ma>>2]|0)+1|0;c[ma>>2]=ga;oa=d+28|0;pa=ga;qa=na}ga=c[d+56>>2]|0;da=c[qa+8>>2]|0;if(!(pa>>>0<(ga>>>0<da>>>0?ga:da)>>>0)){ga=d+24|0;J=(c[ga>>2]|0)+1|0;c[ga>>2]=J;la=J;k=108;continue}J=c[qa+12>>2]|0;ra=da+~pa|0;da=d+200|0;sa=Vca(c[da>>2]|0,c[qa>>2]<<ra)|0;ga=d+204|0;ta=qa+4|0;ua=Vca(c[ga>>2]|0,c[ta>>2]<<ra)|0;ba=Vca(c[d+208>>2]|0,c[qa>>2]<<ra)|0;H=Vca(c[d+212>>2]|0,c[ta>>2]<<ra)|0;va=J+(pa<<4)|0;j=(c[va>>2]|0)+ra|0;wa=J+(pa<<4)+4|0;Y=(c[wa>>2]|0)+ra|0;xa=d+220|0;fa=c[xa>>2]|0;if(((fa|0)%(c[ta>>2]<<Y|0)|0|0)!=0){if((fa|0)!=(c[ga>>2]|0)){ma=oa;na=qa;k=126;continue}if(((ua<<ra|0)%(1<<Y|0)|0|0)==0){ma=oa;na=qa;k=126;continue}}ya=c[d+216>>2]|0;za=c[qa>>2]|0;if(((ya|0)%(za<<j|0)|0|0)!=0){if((ya|0)!=(c[da>>2]|0)){ma=oa;na=qa;k=126;continue}if(((sa<<ra|0)%(1<<j|0)|0|0)==0){ma=oa;na=qa;k=126;continue}}Aa=J+(pa<<4)+8|0;if((c[Aa>>2]|0)==0){ma=oa;na=qa;k=126;continue}if(((sa|0)==(ba|0)?1:(c[J+(pa<<4)+12>>2]|0)==0)|(ua|0)==(H|0)){ma=oa;na=qa;k=126}else{k=119;break}}if((k|0)==119){k=0;H=Vca(ya,za<<ra)|0;J=c[va>>2]|0;ba=Vca(c[xa>>2]|0,c[ta>>2]<<ra)|0;j=c[wa>>2]|0;c[d+32>>2]=(H>>J)-(sa>>J)+(ca((ba>>j)-(ua>>j)|0,c[Aa>>2]|0)|0);j=c[d+64>>2]|0;c[d+36>>2]=j;ja=j;ka=qa;k=120;continue}else if((k|0)==128){k=0;j=c[d+224>>2]|0;ba=d+216|0;J=c[ba>>2]|0;H=J+j-((J|0)%(j|0)|0)|0;c[ba>>2]=H;ia=H;k=106;continue}}if((k|0)==129){k=0;H=c[d+228>>2]|0;ba=d+220|0;j=c[ba>>2]|0;J=j+H-((j|0)%(H|0)|0)|0;c[ba>>2]=J;ha=J;k=104;continue}J=ca(c[d+8>>2]|0,ja)|0;ba=(ca(c[d+12>>2]|0,c[d+28>>2]|0)|0)+J|0;J=ba+(ca(c[d+16>>2]|0,c[d+24>>2]|0)|0)|0;ba=J+(ca(c[d+20>>2]|0,c[d+32>>2]|0)|0)|0;Ba=(c[d+4>>2]|0)+(ba<<1)|0;if((b[Ba>>1]|0)==0){break}_=d+36|0;$=ja;aa=ka;k=125}if((k|0)==169){i=e;return I|0}b[Ba>>1]=1;I=1;i=e;return I|0};case 1:{Ba=d+40|0;if((c[Ba>>2]|0)==0){ka=d+32|0;Ca=ka;Da=c[ka>>2]|0;k=42}else{c[Ba>>2]=0;Ba=c[d+44>>2]|0;c[d+28>>2]=Ba;Ea=Ba;k=27}while(1){if((k|0)==27){k=0;if(!(Ea>>>0<(c[d+56>>2]|0)>>>0)){I=0;k=169;break}Ba=c[d+64>>2]|0;c[d+36>>2]=Ba;Fa=Ba;k=29}else if((k|0)==42){k=0;Ba=Da+1|0;c[Ca>>2]=Ba;Ga=Ba;k=37}while(1){if((k|0)==29){k=0;if(!(Fa>>>0<(c[d+52>>2]|0)>>>0)){k=45;break}Ba=c[d+48>>2]|0;c[d+24>>2]=Ba;Ha=Ba}else if((k|0)==37){k=0;if(Ga>>>0<(c[d+72>>2]|0)>>>0){break}Ba=d+24|0;Ia=Ba;Ja=c[Ba>>2]|0;k=43}while(1){if((k|0)==43){k=0;Ba=Ja+1|0;c[Ia>>2]=Ba;Ha=Ba}if(!(Ha>>>0<(c[d+60>>2]|0)>>>0)){k=44;break}Ka=c[d+196>>2]|0;La=c[d+28>>2]|0;if(La>>>0<(c[Ka+(Ha<<4)+8>>2]|0)>>>0){break}Ia=d+24|0;Ja=Ha;k=43}if((k|0)==44){k=0;Ba=d+36|0;ka=(c[Ba>>2]|0)+1|0;c[Ba>>2]=ka;Fa=ka;k=29;continue}ka=c[Ka+(Ha<<4)+12>>2]|0;if((a[d>>0]|0)==0){c[d+72>>2]=ca(c[ka+(La<<4)+12>>2]|0,c[ka+(La<<4)+8>>2]|0)|0}ka=c[d+68>>2]|0;c[d+32>>2]=ka;Ga=ka;k=37}if((k|0)==45){k=0;ka=d+28|0;Ba=(c[ka>>2]|0)+1|0;c[ka>>2]=Ba;Ea=Ba;k=27;continue}Ba=ca(c[d+8>>2]|0,c[d+36>>2]|0)|0;ka=(ca(c[d+12>>2]|0,c[d+28>>2]|0)|0)+Ba|0;Ba=ka+(ca(c[d+16>>2]|0,c[d+24>>2]|0)|0)|0;ka=Ba+(ca(c[d+20>>2]|0,Ga)|0)|0;Ma=(c[d+4>>2]|0)+(ka<<1)|0;if((b[Ma>>1]|0)==0){break}Ca=d+32|0;Da=Ga;k=42}if((k|0)==169){i=e;return I|0}b[Ma>>1]=1;I=1;i=e;return I|0};case 0:{Ma=d+40|0;if((c[Ma>>2]|0)==0){Ga=d+32|0;Na=Ga;Oa=c[Ga>>2]|0;k=20}else{c[Ma>>2]=0;Ma=c[d+64>>2]|0;c[d+36>>2]=Ma;Pa=Ma;k=5}while(1){if((k|0)==5){k=0;if(!(Pa>>>0<(c[d+52>>2]|0)>>>0)){I=0;k=169;break}Ma=c[d+44>>2]|0;c[d+28>>2]=Ma;Qa=Ma;k=7}else if((k|0)==20){k=0;Ma=Oa+1|0;c[Na>>2]=Ma;Ra=Ma;k=15}while(1){if((k|0)==7){k=0;if(!(Qa>>>0<(c[d+56>>2]|0)>>>0)){k=23;break}Ma=c[d+48>>2]|0;c[d+24>>2]=Ma;Sa=Ma}else if((k|0)==15){k=0;if(Ra>>>0<(c[d+72>>2]|0)>>>0){break}Ma=d+24|0;Ta=Ma;Ua=c[Ma>>2]|0;k=21}while(1){if((k|0)==21){k=0;Ma=Ua+1|0;c[Ta>>2]=Ma;Sa=Ma}if(!(Sa>>>0<(c[d+60>>2]|0)>>>0)){k=22;break}Va=c[d+196>>2]|0;Wa=c[d+28>>2]|0;if(Wa>>>0<(c[Va+(Sa<<4)+8>>2]|0)>>>0){break}Ta=d+24|0;Ua=Sa;k=21}if((k|0)==22){k=0;Ma=d+28|0;Ga=(c[Ma>>2]|0)+1|0;c[Ma>>2]=Ga;Qa=Ga;k=7;continue}Ga=c[Va+(Sa<<4)+12>>2]|0;if((a[d>>0]|0)==0){c[d+72>>2]=ca(c[Ga+(Wa<<4)+12>>2]|0,c[Ga+(Wa<<4)+8>>2]|0)|0}Ga=c[d+68>>2]|0;c[d+32>>2]=Ga;Ra=Ga;k=15}if((k|0)==23){k=0;Ga=d+36|0;Ma=(c[Ga>>2]|0)+1|0;c[Ga>>2]=Ma;Pa=Ma;k=5;continue}Ma=ca(c[d+8>>2]|0,c[d+36>>2]|0)|0;Ga=(ca(c[d+12>>2]|0,c[d+28>>2]|0)|0)+Ma|0;Ma=Ga+(ca(c[d+16>>2]|0,c[d+24>>2]|0)|0)|0;Ga=Ma+(ca(c[d+20>>2]|0,Ra)|0)|0;Xa=(c[d+4>>2]|0)+(Ga<<1)|0;if((b[Xa>>1]|0)==0){break}Na=d+32|0;Oa=Ra;k=20}if((k|0)==169){i=e;return I|0}b[Xa>>1]=1;I=1;i=e;return I|0};case 4:{Xa=d+40|0;if((c[Xa>>2]|0)==0){Ra=d+36|0;Ya=Ra;Za=c[Ra>>2]|0;_a=(c[d+196>>2]|0)+(c[d+24>>2]<<4)|0;k=164}else{c[Xa>>2]=0;Xa=c[d+48>>2]|0;c[d+24>>2]=Xa;$a=Xa;k=133}while(1){if((k|0)==133){k=0;if(!($a>>>0<(c[d+60>>2]|0)>>>0)){I=0;k=169;break}Xa=c[d+196>>2]|0;Ra=Xa+($a<<4)|0;Oa=d+224|0;c[Oa>>2]=0;Na=d+228|0;c[Na>>2]=0;Pa=Xa+($a<<4)+8|0;Wa=c[Pa>>2]|0;if((Wa|0)!=0){Sa=Xa+($a<<4)+12|0;Va=Xa+($a<<4)+4|0;Xa=Wa;Wa=0;Qa=0;Ua=0;Ta=0;while(1){Ga=c[Sa>>2]|0;Ma=Xa+ -1+Ua|0;Da=c[Ra>>2]<<(c[Ga+(Ta<<4)>>2]|0)+Ma;Ca=c[Va>>2]<<(c[Ga+(Ta<<4)+4>>2]|0)+Ma;if((Wa|0)==0){ab=Da}else{ab=Wa>>>0<Da>>>0?Wa:Da}c[Oa>>2]=ab;if((Qa|0)==0){bb=Ca}else{bb=Qa>>>0<Ca>>>0?Qa:Ca}c[Na>>2]=bb;Ca=Ta+1|0;Xa=c[Pa>>2]|0;if(!(Ca>>>0<Xa>>>0)){break}else{Wa=ab;Qa=bb;Ua=~Ta;Ta=Ca}}}if((a[d>>0]|0)==0){Ta=c[d+204>>2]|0;c[d+104>>2]=Ta;c[d+96>>2]=c[d+200>>2];c[d+108>>2]=c[d+212>>2];c[d+100>>2]=c[d+208>>2];cb=Ta}else{cb=c[d+104>>2]|0}c[d+220>>2]=cb;db=cb;eb=Ra;k=145}else if((k|0)==164){k=0;Ta=Za+1|0;c[Ya>>2]=Ta;fb=Ta;gb=_a;k=159}while(1){if((k|0)==145){k=0;if((db|0)>=(c[d+108>>2]|0)){k=168;break}Ta=c[d+96>>2]|0;c[d+216>>2]=Ta;hb=Ta;ib=eb;k=147}else if((k|0)==159){k=0;if(fb>>>0<(c[d+52>>2]|0)>>>0){break}jb=d+28|0;kb=gb;k=165}while(1){if((k|0)==147){k=0;if((hb|0)>=(c[d+100>>2]|0)){k=167;break}Ta=c[d+44>>2]|0;Ua=d+28|0;c[Ua>>2]=Ta;lb=Ua;mb=Ta;nb=ib}else if((k|0)==165){k=0;Ta=(c[jb>>2]|0)+1|0;c[jb>>2]=Ta;lb=d+28|0;mb=Ta;nb=kb}Ta=c[d+56>>2]|0;Ua=c[nb+8>>2]|0;if(!(mb>>>0<(Ta>>>0<Ua>>>0?Ta:Ua)>>>0)){Ta=c[d+224>>2]|0;Qa=d+216|0;Wa=c[Qa>>2]|0;Xa=Wa+Ta-((Wa|0)%(Ta|0)|0)|0;c[Qa>>2]=Xa;hb=Xa;ib=nb;k=147;continue}Xa=c[nb+12>>2]|0;ob=Ua+~mb|0;Ua=d+200|0;pb=Vca(c[Ua>>2]|0,c[nb>>2]<<ob)|0;Qa=d+204|0;qb=nb+4|0;rb=Vca(c[Qa>>2]|0,c[qb>>2]<<ob)|0;Ta=Vca(c[d+208>>2]|0,c[nb>>2]<<ob)|0;Wa=Vca(c[d+212>>2]|0,c[qb>>2]<<ob)|0;sb=Xa+(mb<<4)|0;Pa=(c[sb>>2]|0)+ob|0;tb=Xa+(mb<<4)+4|0;Na=(c[tb>>2]|0)+ob|0;ub=d+220|0;Oa=c[ub>>2]|0;if(((Oa|0)%(c[qb>>2]<<Na|0)|0|0)!=0){if((Oa|0)!=(c[Qa>>2]|0)){jb=lb;kb=nb;k=165;continue}if(((rb<<ob|0)%(1<<Na|0)|0|0)==0){jb=lb;kb=nb;k=165;continue}}vb=c[d+216>>2]|0;wb=c[nb>>2]|0;if(((vb|0)%(wb<<Pa|0)|0|0)!=0){if((vb|0)!=(c[Ua>>2]|0)){jb=lb;kb=nb;k=165;continue}if(((pb<<ob|0)%(1<<Pa|0)|0|0)==0){jb=lb;kb=nb;k=165;continue}}xb=Xa+(mb<<4)+8|0;if((c[xb>>2]|0)==0){jb=lb;kb=nb;k=165;continue}if(((pb|0)==(Ta|0)?1:(c[Xa+(mb<<4)+12>>2]|0)==0)|(rb|0)==(Wa|0)){jb=lb;kb=nb;k=165}else{k=158;break}}if((k|0)==158){k=0;Wa=Vca(vb,wb<<ob)|0;Xa=c[sb>>2]|0;Ta=Vca(c[ub>>2]|0,c[qb>>2]<<ob)|0;Pa=c[tb>>2]|0;c[d+32>>2]=(Wa>>Xa)-(pb>>Xa)+(ca((Ta>>Pa)-(rb>>Pa)|0,c[xb>>2]|0)|0);Pa=c[d+64>>2]|0;c[d+36>>2]=Pa;fb=Pa;gb=nb;k=159;continue}else if((k|0)==167){k=0;Pa=c[d+228>>2]|0;Ta=d+220|0;Xa=c[Ta>>2]|0;Wa=Xa+Pa-((Xa|0)%(Pa|0)|0)|0;c[Ta>>2]=Wa;db=Wa;eb=ib;k=145;continue}}if((k|0)==168){k=0;Ra=d+24|0;Wa=(c[Ra>>2]|0)+1|0;c[Ra>>2]=Wa;$a=Wa;k=133;continue}Wa=ca(c[d+8>>2]|0,fb)|0;Ra=(ca(c[d+12>>2]|0,c[d+28>>2]|0)|0)+Wa|0;Wa=Ra+(ca(c[d+16>>2]|0,c[d+24>>2]|0)|0)|0;Ra=Wa+(ca(c[d+20>>2]|0,c[d+32>>2]|0)|0)|0;yb=(c[d+4>>2]|0)+(Ra<<1)|0;if((b[yb>>1]|0)==0){break}Ya=d+36|0;Za=fb;_a=gb;k=164}if((k|0)==169){i=e;return I|0}b[yb>>1]=1;I=1;i=e;return I|0};default:{I=0;i=e;return I|0}}return 0}function Vca(a,b){a=a|0;b=b|0;var c=0;c=i;if((b|0)==0){_a(736880,736888,111,736960)}else{i=c;return(a+ -1+b|0)/(b|0)|0|0}return 0}function Wca(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=u2a(44)|0;if((e|0)==0){f=0;i=d;return f|0}g=e+0|0;h=g+44|0;do{c[g>>2]=0;g=g+4|0}while((g|0)<(h|0));a[e+40>>0]=(b|0)!=0&1;b=u2a(4)|0;c[e+20>>2]=b;if((b|0)==0){v2a(e);f=0;i=d;return f|0}else{c[b>>2]=0;f=e;i=d;return f|0}return 0}function Xca(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;c[a+24>>2]=b;c[a+28>>2]=d;f=u2a(848)|0;g=a+20|0;c[c[g>>2]>>2]=f;f=c[c[g>>2]>>2]|0;if((f|0)==0){h=0;i=e;return h|0}f3a(f|0,0,848)|0;f=b+16|0;b=(c[f>>2]|0)*44|0;j=u2a(b)|0;c[(c[c[g>>2]>>2]|0)+20>>2]=j;j=c[(c[c[g>>2]>>2]|0)+20>>2]|0;if((j|0)==0){h=0;i=e;return h|0}f3a(j|0,0,b|0)|0;c[(c[c[g>>2]>>2]|0)+16>>2]=c[f>>2];c[a>>2]=c[d+80>>2];h=1;i=e;return h|0}function Yca(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;d=i;if((b|0)==0){i=d;return}e=b+20|0;f=c[e>>2]|0;do{if((f|0)!=0){g=(a[b+40>>0]&1)==0?555:554;h=c[f>>2]|0;if((h|0)!=0){j=h+20|0;k=h+16|0;if((c[k>>2]|0)!=0){h=0;l=c[j>>2]|0;while(1){m=l+24|0;n=c[m>>2]|0;if((n|0)!=0){o=c[l+28>>2]|0;p=(o>>>0)/136|0;if(o>>>0>135){o=n;q=0;while(1){r=0;s=o+28|0;while(1){t=s+20|0;u=c[t>>2]|0;if((u|0)!=0){v=c[s+24>>2]|0;w=(v>>>0)/40|0;if(v>>>0>39){v=u;x=0;while(1){y=v+32|0;hda(c[y>>2]|0);c[y>>2]=0;y=v+36|0;hda(c[y>>2]|0);c[y>>2]=0;Rc[g&1023](v);x=x+1|0;if(!(x>>>0<w>>>0)){break}else{v=v+40|0}}z=c[t>>2]|0}else{z=u}v2a(z);c[t>>2]=0}r=r+1|0;if((r|0)==3){break}else{s=s+36|0}}q=q+1|0;if(!(q>>>0<p>>>0)){break}else{o=o+136|0}}A=c[m>>2]|0}else{A=n}v2a(A);c[m>>2]=0}o=l+32|0;p=c[o>>2]|0;if((p|0)!=0){v2a(p);c[o>>2]=0}h=h+1|0;if(!(h>>>0<(c[k>>2]|0)>>>0)){break}else{l=l+44|0}}}v2a(c[j>>2]|0);c[j>>2]=0;v2a(c[c[e>>2]>>2]|0);c[c[e>>2]>>2]=0;l=c[e>>2]|0;if((l|0)==0){break}else{B=l}}else{B=f}v2a(B)}}while(0);v2a(b);i=d;return}function Zca(a,b){a=a|0;b=b|0;var c=0;c=i;if((b|0)==0){_a(736880,736888,111,736960)}else{i=c;return(a+ -1+b|0)/(b|0)|0|0}return 0}function _ca(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0.0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0;f=i;h=c[(c[d+68>>2]|0)+(e*5632|0)+5576>>2]|0;j=c[a+20>>2]|0;k=c[b+24>>2]|0;l=c[d+24>>2]|0;m=(e>>>0)%(l>>>0)|0;n=(e>>>0)/(l>>>0)|0;l=d+4|0;e=d+12|0;o=(ca(c[e>>2]|0,m)|0)+(c[l>>2]|0)|0;p=c[b>>2]|0;r=(o|0)>(p|0)?o:p;c[a>>2]=r;p=d+8|0;o=d+16|0;s=(ca(c[o>>2]|0,n)|0)+(c[p>>2]|0)|0;t=c[b+4>>2]|0;u=a+4|0;c[u>>2]=(s|0)>(t|0)?s:t;t=(ca(c[e>>2]|0,m+1|0)|0)+(c[l>>2]|0)|0;l=c[b+8>>2]|0;m=a+8|0;c[m>>2]=(t|0)<(l|0)?t:l;l=(ca(c[o>>2]|0,n+1|0)|0)+(c[p>>2]|0)|0;p=c[b+12>>2]|0;b=a+12|0;c[b>>2]=(l|0)<(p|0)?l:p;if((c[h+4>>2]|0)==0){Jb(736264,38,1,c[q>>2]|0)|0;v=0;i=f;return v|0}p=a+16|0;if((c[p>>2]|0)==0){v=1;i=f;return v|0}l=d+72|0;d=c[q>>2]|0;n=r;r=1;o=k;k=h;h=j;a:while(1){c[h>>2]=Zca(n,c[o>>2]|0)|0;j=o+4|0;t=h+4|0;c[t>>2]=Zca(c[u>>2]|0,c[j>>2]|0)|0;e=h+8|0;c[e>>2]=Zca(c[m>>2]|0,c[o>>2]|0)|0;s=Zca(c[b>>2]|0,c[j>>2]|0)|0;j=h+12|0;c[j>>2]=s;w=c[e>>2]|0;if((w|0)<0){v=0;x=78;break}y=c[h>>2]|0;if((y|s|0)<0){v=0;x=78;break}z=c[t>>2]|0;if((z|0)<0){v=0;x=78;break}A=ca(w-y<<2,s-z|0)|0;z=k+4|0;s=h+16|0;c[s>>2]=c[z>>2];y=c[z>>2]|0;z=c[l>>2]|0;if(y>>>0<z>>>0){c[h+20>>2]=1}else{c[h+20>>2]=y-z}B=h+32|0;z=c[B>>2]|0;if((z|0)!=0){C=h+36|0;if(A>>>0>(c[C>>2]|0)>>>0){y=x2a(z,A)|0;Jb(736304,38,1,d|0)|0;if((y|0)==0){x=16;break}c[B>>2]=y;c[C>>2]=A}}else{y=u2a(A)|0;c[B>>2]=y;if((y|0)==0){v=0;x=78;break}c[h+36>>2]=A}A=(c[s>>2]|0)*136|0;D=h+24|0;y=c[D>>2]|0;if((y|0)!=0){E=h+28|0;if(A>>>0>(c[E>>2]|0)>>>0){z=x2a(y,A)|0;if((z|0)==0){x=23;break}c[D>>2]=z;y=c[E>>2]|0;f3a(z+y|0,0,A-y|0)|0;c[E>>2]=A}}else{y=u2a(A)|0;c[D>>2]=y;if((y|0)==0){v=0;x=78;break}c[h+28>>2]=A;f3a(y|0,0,A|0)|0}A=c[s>>2]|0;y=(c[k+20>>2]|0)==0?226:225;b:do{if((A|0)!=0){z=k+8|0;w=k+12|0;F=o+24|0;H=k+804|0;I=A;J=c[D>>2]|0;K=k+28|0;L=0;while(1){M=I+ -1|0;N=c[h>>2]|0;O=1<<M;P=W2a(O|0,((O|0)<0)<<31>>31|0,-1,-1)|0;O=G;Q=W2a(P|0,O|0,N|0,((N|0)<0)<<31>>31|0)|0;N=$2a(Q|0,G|0,M|0)|0;c[J>>2]=N;Q=c[t>>2]|0;R=W2a(P|0,O|0,Q|0,((Q|0)<0)<<31>>31|0)|0;Q=$2a(R|0,G|0,M|0)|0;c[J+4>>2]=Q;R=c[e>>2]|0;S=W2a(P|0,O|0,R|0,((R|0)<0)<<31>>31|0)|0;R=$2a(S|0,G|0,M|0)|0;c[J+8>>2]=R;S=c[j>>2]|0;T=W2a(P|0,O|0,S|0,((S|0)<0)<<31>>31|0)|0;S=$2a(T|0,G|0,M|0)|0;c[J+12>>2]=S;T=c[k+(L<<2)+812>>2]|0;U=c[k+(L<<2)+944>>2]|0;if((T|0)==0|(U|0)==0){v=0;x=78;break a}V=N>>T<<T;W=Q>>U<<U;X=1<<U;Y=W2a(X|0,((X|0)<0)<<31>>31|0,-1,-1)|0;X=W2a(Y|0,G|0,S|0,((S|0)<0)<<31>>31|0)|0;Y=$2a(X|0,G|0,U|0)|0;if((N|0)==(R|0)){Z=0}else{N=1<<T;X=W2a(N|0,((N|0)<0)<<31>>31|0,-1,-1)|0;N=W2a(X|0,G|0,R|0,((R|0)<0)<<31>>31|0)|0;R=$2a(N|0,G|0,T|0)|0;Z=(R<<T)-V>>T}R=J+16|0;c[R>>2]=Z;if((Q|0)==(S|0)){_=0}else{_=(Y<<U)-W>>U}c[J+20>>2]=_;Y=ca(Z,_)|0;S=Y*40|0;Q=(L|0)==0;if(Q){c[J+24>>2]=1;$=U;aa=T;ba=V;da=W}else{N=W2a(V|0,((V|0)<0)<<31>>31|0,1,0)|0;V=a3a(N|0,G|0,1)|0;N=W2a(W|0,((W|0)<0)<<31>>31|0,1,0)|0;W=a3a(N|0,G|0,1)|0;c[J+24>>2]=3;$=U+ -1|0;aa=T+ -1|0;ba=V;da=W}W=c[z>>2]|0;V=W>>>0<aa>>>0?W:aa;W=c[w>>2]|0;T=W>>>0<$>>>0?W:$;W=J+24|0;U=(Y|0)==0;N=1<<aa;X=1<<$;ea=1<<V;fa=W2a(ea|0,((ea|0)<0)<<31>>31|0,-1,-1)|0;ga=G;ha=1<<T;ia=W2a(ha|0,((ha|0)<0)<<31>>31|0,-1,-1)|0;ja=G;ka=1<<I;la=W2a(ka|0,((ka|0)<0)<<31>>31|0,-1,-1)|0;ka=G;ma=0;na=J+28|0;oa=K;while(1){if(Q){c[na+16>>2]=0;pa=c[h>>2]|0;qa=W2a(P|0,O|0,pa|0,((pa|0)<0)<<31>>31|0)|0;pa=$2a(qa|0,G|0,M|0)|0;c[na>>2]=pa;pa=c[t>>2]|0;qa=W2a(P|0,O|0,pa|0,((pa|0)<0)<<31>>31|0)|0;pa=$2a(qa|0,G|0,M|0)|0;c[na+4>>2]=pa;pa=c[e>>2]|0;qa=W2a(P|0,O|0,pa|0,((pa|0)<0)<<31>>31|0)|0;pa=$2a(qa|0,G|0,M|0)|0;c[na+8>>2]=pa;pa=c[j>>2]|0;qa=W2a(P|0,O|0,pa|0,((pa|0)<0)<<31>>31|0)|0;pa=$2a(qa|0,G|0,M|0)|0;c[na+12>>2]=pa;ra=0}else{pa=ma+1|0;c[na+16>>2]=pa;qa=(pa&1)<<M;sa=(c[h>>2]|0)-qa|0;ta=W2a(la|0,ka|0,sa|0,((sa|0)<0)<<31>>31|0)|0;sa=$2a(ta|0,G|0,I|0)|0;c[na>>2]=sa;sa=pa>>>1<<M;ta=(c[t>>2]|0)-sa|0;ua=W2a(la|0,ka|0,ta|0,((ta|0)<0)<<31>>31|0)|0;ta=$2a(ua|0,G|0,I|0)|0;c[na+4>>2]=ta;ta=(c[e>>2]|0)-qa|0;qa=W2a(la|0,ka|0,ta|0,((ta|0)<0)<<31>>31|0)|0;ta=$2a(qa|0,G|0,I|0)|0;c[na+8>>2]=ta;ta=(c[j>>2]|0)-sa|0;sa=W2a(la|0,ka|0,ta|0,((ta|0)<0)<<31>>31|0)|0;ta=$2a(sa|0,G|0,I|0)|0;c[na+12>>2]=ta;ra=pa}pa=Lc[y&255](ra)|0;va=+(c[oa+4>>2]|0)*.00048828125+1.0;g[na+32>>2]=+L1a((c[F>>2]|0)+pa-(c[oa>>2]|0)|0)*va*.5;c[na+28>>2]=(c[oa>>2]|0)+ -1+(c[H>>2]|0);wa=na+20|0;pa=c[wa>>2]|0;do{if((pa|0)==0){ta=u2a(S)|0;c[wa>>2]=ta;if((ta|0)==0){v=0;x=78;break a}f3a(ta|0,0,S|0)|0;c[na+24>>2]=S}else{xa=na+24|0;if(!((c[xa>>2]|0)>>>0<S>>>0)){break}ta=x2a(pa,S)|0;if((ta|0)==0){x=44;break a}c[wa>>2]=ta;sa=c[xa>>2]|0;f3a(ta+sa|0,0,S-sa|0)|0;c[xa>>2]=S}}while(0);if(!U){pa=na+4|0;sa=na+8|0;ta=na+12|0;qa=c[wa>>2]|0;ua=0;while(1){ya=c[R>>2]|0;za=(((ua>>>0)%(ya>>>0)|0)<<aa)+ba|0;Aa=(((ua>>>0)/(ya>>>0)|0)<<$)+da|0;ya=za+N|0;Ba=Aa+X|0;Ca=c[na>>2]|0;Da=(za|0)>(Ca|0)?za:Ca;c[qa>>2]=Da;Ca=c[pa>>2]|0;za=(Aa|0)>(Ca|0)?Aa:Ca;Ca=qa+4|0;c[Ca>>2]=za;Aa=c[sa>>2]|0;Ea=(ya|0)<(Aa|0)?ya:Aa;Aa=qa+8|0;c[Aa>>2]=Ea;ya=c[ta>>2]|0;Fa=(Ba|0)<(ya|0)?Ba:ya;ya=qa+12|0;c[ya>>2]=Fa;Ba=Da>>V<<V;Da=za>>T<<T;za=W2a(fa|0,ga|0,Ea|0,((Ea|0)<0)<<31>>31|0)|0;Ea=$2a(za|0,G|0,V|0)|0;za=W2a(ia|0,ja|0,Fa|0,((Fa|0)<0)<<31>>31|0)|0;Fa=$2a(za|0,G|0,T|0)|0;za=(Ea<<V)-Ba>>V;Ea=qa+16|0;c[Ea>>2]=za;Ga=(Fa<<T)-Da>>T;Fa=qa+20|0;c[Fa>>2]=Ga;Ha=ca(Ga,za)|0;za=Ha*56|0;Ia=qa+24|0;Ga=c[Ia>>2]|0;do{if((Ga|0)==0){Ja=u2a(za)|0;c[Ia>>2]=Ja;if((Ja|0)==0){v=0;x=78;break a}f3a(Ja|0,0,za|0)|0;c[qa+28>>2]=za}else{Ka=qa+28|0;if(!(za>>>0>(c[Ka>>2]|0)>>>0)){break}Ja=x2a(Ga,za)|0;if((Ja|0)==0){x=53;break a}c[Ia>>2]=Ja;La=c[Ka>>2]|0;f3a(Ja+La|0,0,za-La|0)|0;c[Ka>>2]=za}}while(0);za=qa+32|0;Ga=c[za>>2]|0;La=c[Ea>>2]|0;Ja=c[Fa>>2]|0;if((Ga|0)==0){Ma=eda(La,Ja)|0}else{Ma=gda(Ga,La,Ja)|0}c[za>>2]=Ma;if((Ma|0)==0){Jb(736496,30,1,d|0)|0}za=qa+36|0;Ja=c[za>>2]|0;La=c[Ea>>2]|0;Ga=c[Fa>>2]|0;if((Ja|0)==0){Na=eda(La,Ga)|0}else{Na=gda(Ja,La,Ga)|0}c[za>>2]=Na;if((Na|0)==0){Jb(736528,30,1,d|0)|0}if((Ha|0)!=0){za=0;Ga=c[Ia>>2]|0;while(1){La=c[Ea>>2]|0;Ja=(((za>>>0)%(La>>>0)|0)<<V)+Ba|0;Oa=(((za>>>0)/(La>>>0)|0)<<T)+Da|0;La=Ja+ea|0;Pa=Oa+ha|0;Qa=c[qa>>2]|0;c[Ga+8>>2]=(Ja|0)>(Qa|0)?Ja:Qa;Qa=c[Ca>>2]|0;c[Ga+12>>2]=(Oa|0)>(Qa|0)?Oa:Qa;Qa=c[Aa>>2]|0;c[Ga+16>>2]=(La|0)<(Qa|0)?La:Qa;Qa=c[ya>>2]|0;c[Ga+20>>2]=(Pa|0)<(Qa|0)?Pa:Qa;if((c[Ga>>2]|0)==0){Qa=u2a(8192)|0;c[Ga>>2]=Qa;if((Qa|0)==0){v=0;x=78;break a}c[Ga+32>>2]=8192;Qa=u2a(320)|0;c[Ga+4>>2]=Qa;if((Qa|0)==0){v=0;x=78;break a}f3a(Qa|0,0,320)|0;c[Ga+52>>2]=10}za=za+1|0;if(!(za>>>0<Ha>>>0)){break}else{Ga=Ga+56|0}}}ua=ua+1|0;if(!(ua>>>0<Y>>>0)){break}else{qa=qa+40|0}}}oa=oa+8|0;ma=ma+1|0;if(!(ma>>>0<(c[W>>2]|0)>>>0)){break}else{na=na+36|0}}na=L+1|0;if(!(na>>>0<(c[s>>2]|0)>>>0)){break b}I=M;J=J+136|0;K=oa;L=na}}}while(0);if(!(r>>>0<(c[p>>2]|0)>>>0)){v=1;x=78;break}n=c[a>>2]|0;r=r+1|0;o=o+52|0;k=k+1080|0;h=h+44|0}if((x|0)==16){v2a(c[B>>2]|0);c[B>>2]=0;c[C>>2]=0;v=0;i=f;return v|0}else if((x|0)==23){Jb(736344,38,1,d|0)|0;v2a(c[D>>2]|0);c[D>>2]=0;c[E>>2]=0;v=0;i=f;return v|0}else if((x|0)==44){Jb(736384,42,1,d|0)|0;v2a(c[wa>>2]|0);c[wa>>2]=0;c[xa>>2]=0;v=0;i=f;return v|0}else if((x|0)==53){v2a(c[Ia>>2]|0);c[Ia>>2]=0;c[Ka>>2]=0;Jb(736432,57,1,d|0)|0;v=0;i=f;return v|0}else if((x|0)==78){i=f;return v|0}return 0}function $ca(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;d=c[a+24>>2]|0;e=c[d+16>>2]|0;if((e|0)==0){f=0;i=b;return f|0}g=0;h=0;j=c[d+24>>2]|0;d=c[(c[c[a+20>>2]>>2]|0)+20>>2]|0;while(1){a=c[j+24>>2]|0;k=((a&7|0)!=0&1)+(a>>>3)|0;a=c[d+24>>2]|0;l=(c[d+20>>2]|0)+ -1|0;m=(ca(ca((k|0)==3?4:k,(c[a+(l*136|0)+8>>2]|0)-(c[a+(l*136|0)>>2]|0)|0)|0,(c[a+(l*136|0)+12>>2]|0)-(c[a+(l*136|0)+4>>2]|0)|0)|0)+h|0;g=g+1|0;if(!(g>>>0<e>>>0)){f=m;break}else{h=m;j=j+52|0;d=d+44|0}}i=b;return f|0}function ada(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;f=i;i=i+16|0;h=f;j=f+4|0;k=a+36|0;c[k>>2]=e;l=c[a+28>>2]|0;m=a+32|0;c[m>>2]=(c[l+68>>2]|0)+(e*5632|0);c[j>>2]=0;e=a+24|0;n=qja(c[e>>2]|0,l)|0;if((n|0)==0){o=0;i=f;return o|0}l=a+20|0;a=pja(n,c[k>>2]|0,c[c[l>>2]>>2]|0,b,j,d)|0;rja(n);if((a|0)==0){o=0;i=f;return o|0}a=c[c[l>>2]>>2]|0;n=c[a+20>>2]|0;d=c[(c[m>>2]|0)+5576>>2]|0;j=ija()|0;if((j|0)==0){o=0;i=f;return o|0}b=a+16|0;a:do{if((c[b>>2]|0)!=0){a=0;k=d;p=n;while(1){if((kja(j,p,k)|0)==0){break}a=a+1|0;if(!(a>>>0<(c[b>>2]|0)>>>0)){break a}else{k=k+1080|0;p=p+44|0}}jja(j);o=0;i=f;return o|0}}while(0);jja(j);j=c[c[l>>2]>>2]|0;b=j+16|0;do{if((c[b>>2]|0)!=0){n=0;d=c[(c[e>>2]|0)+24>>2]|0;p=c[(c[m>>2]|0)+5576>>2]|0;k=c[j+20>>2]|0;while(1){a=(c[d+36>>2]|0)+1|0;if((c[p+20>>2]|0)==1){if((Yia(k,a)|0)==0){o=0;r=56;break}}else{aja(k,a)}n=n+1|0;if(!(n>>>0<(c[b>>2]|0)>>>0)){r=14;break}else{d=d+52|0;p=p+1080|0;k=k+44|0}}if((r|0)==14){s=c[c[l>>2]>>2]|0;break}else if((r|0)==56){i=f;return o|0}}else{s=j}}while(0);j=c[m>>2]|0;b=c[s+20>>2]|0;k=c[j+16>>2]|0;do{if((k|0)!=0){p=ca((c[b+12>>2]|0)-(c[b+4>>2]|0)|0,(c[b+8>>2]|0)-(c[b>>2]|0)|0)|0;d=s+16|0;n=c[d>>2]|0;if(!(n>>>0>2)){a=c[q>>2]|0;c[h>>2]=n;lc(a|0,736800,h|0)|0;break}if((ca((c[b+56>>2]|0)-(c[b+48>>2]|0)|0,(c[b+52>>2]|0)-(c[b+44>>2]|0)|0)|0)>=(p|0)?(ca((c[b+100>>2]|0)-(c[b+92>>2]|0)|0,(c[b+96>>2]|0)-(c[b+88>>2]|0)|0)|0)>=(p|0):0){if((k|0)!=2){a=c[b+32>>2]|0;if((c[(c[j+5576>>2]|0)+20>>2]|0)==1){Nca(a,c[b+76>>2]|0,c[b+120>>2]|0,p);break}else{Oca(a,c[b+76>>2]|0,c[b+120>>2]|0,p);break}}a=j+5596|0;if((c[a>>2]|0)==0){break}t=u2a(n<<2)|0;if((t|0)==0){o=0;i=f;return o|0}if((c[d>>2]|0)==0){u=0}else{n=0;v=b;while(1){c[t+(n<<2)>>2]=c[v+32>>2];n=n+1|0;w=c[d>>2]|0;if(!(n>>>0<w>>>0)){u=w;break}else{v=v+44|0}}}v=(Pca(c[a>>2]|0,p,t,u)|0)==0;v2a(t);if(v){o=0}else{break}i=f;return o|0}Jb(736736,60,1,c[q>>2]|0)|0;o=0;i=f;return o|0}}while(0);u=c[c[l>>2]>>2]|0;l=u+16|0;if((c[l>>2]|0)==0){o=1;i=f;return o|0}b=0;j=c[(c[e>>2]|0)+24>>2]|0;e=c[(c[m>>2]|0)+5576>>2]|0;m=c[u+20>>2]|0;while(1){u=c[m+24>>2]|0;k=c[j+36>>2]|0;h=c[u+(k*136|0)+8>>2]|0;s=c[u+(k*136|0)>>2]|0;v=h-s|0;n=c[u+(k*136|0)+12>>2]|0;d=c[u+(k*136|0)+4>>2]|0;k=n-d|0;u=(c[m+8>>2]|0)-(c[m>>2]|0)|0;w=u-v|0;x=(n|0)==(d|0);if(!x?u>>>0>(((c[m+36>>2]|0)>>>0)/(k>>>0)|0)>>>0:0){r=34;break}u=c[j+24>>2]|0;if((c[j+32>>2]|0)==0){y=1<<u;z=0}else{d=1<<u+ -1;y=d;z=0-d|0}d=y+ -1|0;u=c[m+32>>2]|0;if((c[e+20>>2]|0)==1){if(!x){n=(h|0)==(s|0);A=e+1076|0;B=0;C=u;while(1){if(n){D=C}else{E=0;F=C;while(1){G=(c[A>>2]|0)+(c[F>>2]|0)|0;if((G|0)<(z|0)){H=z}else{H=(G|0)>(d|0)?d:G}c[F>>2]=H;E=E+1|0;if((E|0)==(v|0)){break}else{F=F+4|0}}D=C+(v<<2)|0}B=B+1|0;if((B|0)==(k|0)){break}else{C=D+(w<<2)|0}}}}else{if(!x){C=(h|0)==(s|0);B=e+1076|0;A=0;n=u;while(1){if(C){I=n}else{t=0;p=n;while(1){a=Eb(+(+g[p>>2]))|0;F=(c[B>>2]|0)+a|0;if((F|0)<(z|0)){J=z}else{J=(F|0)>(d|0)?d:F}c[p>>2]=J;t=t+1|0;if((t|0)==(v|0)){break}else{p=p+4|0}}I=n+(v<<2)|0}A=A+1|0;if((A|0)==(k|0)){break}else{n=I+(w<<2)|0}}}}b=b+1|0;if(!(b>>>0<(c[l>>2]|0)>>>0)){o=1;r=56;break}else{j=j+52|0;e=e+1080|0;m=m+44|0}}if((r|0)==34){_a(736560,736640,1677,736704)}else if((r|0)==56){i=f;return o|0}return 0}function bda(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;g=i;if(($ca(d)|0)>>>0>f>>>0){h=0;i=g;return h|0}f=d+24|0;j=c[f>>2]|0;if((c[j+16>>2]|0)==0){h=1;i=g;return h|0}k=e;e=0;l=c[j+24>>2]|0;j=c[(c[c[d+20>>2]>>2]|0)+20>>2]|0;while(1){d=c[l+24>>2]|0;m=c[j+24>>2]|0;n=c[l+36>>2]|0;o=c[m+(n*136|0)+8>>2]|0;p=c[m+(n*136|0)>>2]|0;q=o-p|0;r=c[m+(n*136|0)+12>>2]|0;s=c[m+(n*136|0)+4>>2]|0;n=(c[j+8>>2]|0)-(c[j>>2]|0)-q|0;m=((d&7|0)!=0&1)+(d>>>3)|0;d=(m|0)==3?4:m;do{if((d|0)==4){if((r|0)==(s|0)){t=k}else{m=(o|0)==(p|0);u=r-s|0;v=0;w=k;x=c[j+32>>2]|0;while(1){if(m){y=w;z=x}else{A=w+(q<<2)|0;B=0;C=w;D=x;while(1){c[C>>2]=c[D>>2];B=B+1|0;if((B|0)==(q|0)){break}else{C=C+4|0;D=D+4|0}}y=A;z=x+(q<<2)|0}v=v+1|0;if((v|0)==(u|0)){t=y;break}else{w=y;x=z+(n<<2)|0}}}E=t}else if((d|0)==1){x=c[j+32>>2]|0;w=(r|0)==(s|0);if((c[l+32>>2]|0)==0){if(w){E=k;break}u=(o|0)==(p|0);v=r-s|0;m=0;D=k;C=x;while(1){if(u){F=D;G=C}else{B=D+q|0;H=0;I=D;J=C;while(1){a[I>>0]=c[J>>2];H=H+1|0;if((H|0)==(q|0)){break}else{I=I+1|0;J=J+4|0}}F=B;G=C+(q<<2)|0}m=m+1|0;if((m|0)==(v|0)){E=F;break}else{D=F;C=G+(n<<2)|0}}}else{if(w){E=k;break}C=(o|0)==(p|0);D=r-s|0;v=0;m=k;u=x;while(1){if(C){K=m;L=u}else{J=m+q|0;I=0;H=m;A=u;while(1){a[H>>0]=c[A>>2];I=I+1|0;if((I|0)==(q|0)){break}else{H=H+1|0;A=A+4|0}}K=J;L=u+(q<<2)|0}v=v+1|0;if((v|0)==(D|0)){E=K;break}else{m=K;u=L+(n<<2)|0}}}}else if((d|0)==2){u=c[j+32>>2]|0;m=(r|0)==(s|0);if((c[l+32>>2]|0)==0){if(m){M=k}else{D=(o|0)==(p|0);v=r-s|0;C=0;x=k;w=u;while(1){if(D){N=x;O=w}else{A=x+(q<<1)|0;H=0;I=x;B=w;while(1){b[I>>1]=c[B>>2];H=H+1|0;if((H|0)==(q|0)){break}else{I=I+2|0;B=B+4|0}}N=A;O=w+(q<<2)|0}C=C+1|0;if((C|0)==(v|0)){M=N;break}else{x=N;w=O+(n<<2)|0}}}}else{if(m){M=k}else{w=(o|0)==(p|0);x=r-s|0;v=0;C=k;D=u;while(1){if(w){P=C;Q=D}else{B=C+(q<<1)|0;I=0;H=C;J=D;while(1){b[H>>1]=c[J>>2];I=I+1|0;if((I|0)==(q|0)){break}else{H=H+2|0;J=J+4|0}}P=B;Q=D+(q<<2)|0}v=v+1|0;if((v|0)==(x|0)){M=P;break}else{C=P;D=Q+(n<<2)|0}}}}E=M}else{E=k}}while(0);e=e+1|0;if(!(e>>>0<(c[(c[f>>2]|0)+16>>2]|0)>>>0)){h=1;break}else{k=E;l=l+52|0;j=j+44|0}}i=g;return h|0}function cda(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;d=a+24|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}f=c[a+28>>2]|0;a=(f>>>0)/56|0;if(f>>>0>55){f=0;g=e;while(1){h=c[g>>2]|0;if((h|0)!=0){v2a(h);c[g>>2]=0}h=g+4|0;j=c[h>>2]|0;if((j|0)!=0){v2a(j);c[h>>2]=0}f=f+1|0;if(!(f>>>0<a>>>0)){break}else{g=g+56|0}}k=c[d>>2]|0}else{k=e}v2a(k);c[d>>2]=0;i=b;return}function dda(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;d=a+24|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}f=c[a+28>>2]|0;a=(f>>>0)/48|0;if(f>>>0>47){f=0;g=e;while(1){h=c[g>>2]|0;if((h|0)!=0){v2a(h+ -1|0);c[g>>2]=0}h=g+4|0;j=c[h>>2]|0;if((j|0)!=0){v2a(j);c[h>>2]=0}h=g+8|0;j=c[h>>2]|0;if((j|0)!=0){v2a(j);c[h>>2]=0}f=f+1|0;if(!(f>>>0<a>>>0)){break}else{g=g+48|0}}k=c[d>>2]|0}else{k=e}v2a(k);c[d>>2]=0;i=b;return}function eda(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;d=i;i=i+256|0;e=d+128|0;f=d;g=u2a(20)|0;if((g|0)==0){Jb(736976,42,1,c[q>>2]|0)|0;h=0;i=d;return h|0}c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;c[g>>2]=a;c[g+4>>2]=b;c[e>>2]=a;c[f>>2]=b;j=g+8|0;c[j>>2]=0;k=0;l=a;m=b;n=0;while(1){o=ca(m,l)|0;l=(l+1|0)/2|0;p=n+1|0;c[e+(p<<2)>>2]=l;m=(m+1|0)/2|0;c[f+(p<<2)>>2]=m;k=k+o|0;if(!(o>>>0>1)){break}else{n=p}}c[j>>2]=k;if((k|0)==0){v2a(g);Jb(737024,60,1,c[q>>2]|0)|0;h=0;i=d;return h|0}j=w2a(k,16)|0;c[g+12>>2]=j;if((j|0)==0){Jb(737088,54,1,c[q>>2]|0)|0;v2a(g);h=0;i=d;return h|0}m=k<<4;f3a(j|0,0,m|0)|0;c[g+16>>2]=m;m=j+((ca(b,a)|0)<<4)|0;if((n|0)==0){r=j}else{a=0;b=m;k=m;m=j;while(1){j=f+(a<<2)|0;l=c[j>>2]|0;if((l|0)>0){p=e+(a<<2)|0;o=l;l=0;s=b;t=k;u=m;while(1){v=c[p>>2]|0;if((v|0)>0){w=(v+ -1|0)>>>1;x=v;v=s;y=u;while(1){c[y>>2]=v;z=y+16|0;x=x+ -2|0;if(!((x|0)>-1)){A=z;break}c[z>>2]=v;z=y+32|0;if((x|0)<=0){A=z;break}else{v=v+16|0;y=z}}B=c[j>>2]|0;C=s+(w+1<<4)|0;D=A}else{B=o;C=s;D=u}if((l&1|0)==0?(l|0)!=(B+ -1|0):0){E=t;F=t+(c[p>>2]<<4)|0}else{E=C;F=C}l=l+1|0;if((l|0)>=(B|0)){G=E;H=F;I=D;break}else{o=B;s=E;t=F;u=D}}}else{G=b;H=k;I=m}a=a+1|0;if((a|0)==(n|0)){r=I;break}else{b=G;k=H;m=I}}}c[r>>2]=0;fda(g);h=g;i=d;return h|0}function fda(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((a|0)==0){i=b;return}d=a+8|0;if((c[d>>2]|0)==0){i=b;return}e=0;f=c[a+12>>2]|0;while(1){c[f+4>>2]=999;c[f+8>>2]=0;c[f+12>>2]=0;e=e+1|0;if(!(e>>>0<(c[d>>2]|0)>>>0)){break}else{f=f+16|0}}i=b;return}function gda(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;e=i;i=i+256|0;f=e+128|0;g=e;if((a|0)==0){h=0;i=e;return h|0}j=a+4|0;if(!((c[a>>2]|0)==(b|0)?(c[j>>2]|0)==(d|0):0)){c[a>>2]=b;c[j>>2]=d;c[f>>2]=b;c[g>>2]=d;k=a+8|0;c[k>>2]=0;l=0;m=b;n=d;o=0;while(1){p=ca(n,m)|0;m=(m+1|0)/2|0;r=o+1|0;c[f+(r<<2)>>2]=m;n=(n+1|0)/2|0;c[g+(r<<2)>>2]=n;l=l+p|0;if(!(p>>>0>1)){break}else{o=r}}c[k>>2]=l;if((l|0)==0){hda(a);h=0;i=e;return h|0}k=l<<4;l=a+16|0;n=a+12|0;m=c[n>>2]|0;do{if(k>>>0>(c[l>>2]|0)>>>0){r=x2a(m,k)|0;if((r|0)!=0){c[n>>2]=r;p=c[l>>2]|0;f3a(r+p|0,0,k-p|0)|0;c[l>>2]=k;s=c[a>>2]|0;t=c[j>>2]|0;u=r;break}Jb(737144,53,1,c[q>>2]|0)|0;hda(a);h=0;i=e;return h|0}else{s=b;t=d;u=m}}while(0);m=u+((ca(t,s)|0)<<4)|0;if((o|0)==0){v=u}else{s=0;t=u;u=m;d=m;while(1){m=g+(s<<2)|0;b=c[m>>2]|0;if((b|0)>0){j=f+(s<<2)|0;k=b;b=0;l=t;n=u;r=d;while(1){p=c[j>>2]|0;if((p|0)>0){w=(p+ -1|0)>>>1;x=p;p=l;y=n;while(1){c[p>>2]=y;z=p+16|0;x=x+ -2|0;if(!((x|0)>-1)){A=z;break}c[z>>2]=y;z=p+32|0;if((x|0)<=0){A=z;break}else{p=z;y=y+16|0}}B=c[m>>2]|0;C=A;D=n+(w+1<<4)|0}else{B=k;C=l;D=n}if((b&1|0)==0?(b|0)!=(B+ -1|0):0){E=r;F=r+(c[j>>2]<<4)|0}else{E=D;F=D}b=b+1|0;if((b|0)>=(B|0)){G=C;H=E;I=F;break}else{k=B;l=C;n=E;r=F}}}else{G=t;H=u;I=d}s=s+1|0;if((s|0)==(o|0)){v=G;break}else{t=G;u=H;d=I}}}c[v>>2]=0}fda(a);h=a;i=e;return h|0}function hda(a){a=a|0;var b=0,d=0;b=i;if((a|0)==0){i=b;return}d=c[a+12>>2]|0;if((d|0)!=0){v2a(d)}v2a(a);i=b;return}function ida(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;i=i+128|0;g=f;h=b+(d<<4)|0;if((c[h>>2]|0)==0){j=0;k=h;l=g}else{d=h;b=h;h=g;while(1){m=h+4|0;c[h>>2]=b;b=c[d>>2]|0;if((c[b>>2]|0)==0){j=0;k=b;l=m;break}else{d=b;h=m}}}while(1){h=k+8|0;b=c[h>>2]|0;if((j|0)>(b|0)){c[h>>2]=j;n=j}else{n=b}a:do{if((n|0)<(e|0)){b=k+4|0;d=n;while(1){m=c[b>>2]|0;while(1){if((d|0)>=(m|0)){o=d;break a}if((Via(a,1)|0)==0){break}c[b>>2]=d;m=d}m=d+1|0;if((m|0)<(e|0)){d=m}else{o=m;break}}}else{o=n}}while(0);c[h>>2]=o;if((l|0)==(g|0)){break}d=l+ -4|0;j=o;k=c[d>>2]|0;l=d}i=f;return(c[k+4>>2]|0)<(e|0)|0}function jda(a,b,c){a=a|0;b=b|0;c=c|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;e=i;f=a>>>16;g=a&65535;if((c|0)==1){a=(d[b>>0]|0)+g|0;h=a>>>0>65520?a+ -65521|0:a;a=h+f|0;j=(a>>>0>65520?a+15|0:a)<<16|h;i=e;return j|0}if((b|0)==0){j=1;i=e;return j|0}if(c>>>0<16){if((c|0)==0){k=g;l=f}else{h=b;a=c;m=g;n=f;while(1){a=a+ -1|0;o=(d[h>>0]|0)+m|0;p=o+n|0;if((a|0)==0){k=o;l=p;break}else{h=h+1|0;m=o;n=p}}}j=((l>>>0)%65521|0)<<16|(k>>>0>65520?k+ -65521|0:k);i=e;return j|0}if(c>>>0>5551){k=b;l=c;n=g;m=f;do{l=l+ -5552|0;h=k;a=n;p=347;o=m;while(1){q=(d[h>>0]|0)+a|0;r=q+(d[h+1>>0]|0)|0;s=r+(d[h+2>>0]|0)|0;t=s+(d[h+3>>0]|0)|0;u=t+(d[h+4>>0]|0)|0;v=u+(d[h+5>>0]|0)|0;w=v+(d[h+6>>0]|0)|0;x=w+(d[h+7>>0]|0)|0;y=x+(d[h+8>>0]|0)|0;z=y+(d[h+9>>0]|0)|0;A=z+(d[h+10>>0]|0)|0;B=A+(d[h+11>>0]|0)|0;C=B+(d[h+12>>0]|0)|0;D=C+(d[h+13>>0]|0)|0;E=D+(d[h+14>>0]|0)|0;a=E+(d[h+15>>0]|0)|0;o=q+o+r+s+t+u+v+w+x+y+z+A+B+C+D+E+a|0;p=p+ -1|0;if((p|0)==0){break}else{h=h+16|0}}k=k+5552|0;n=(a>>>0)%65521|0;m=(o>>>0)%65521|0}while(l>>>0>5551);if((l|0)!=0){if(l>>>0>15){F=l;G=k;H=n;I=m;J=15}else{K=l;L=k;M=n;N=m;J=16}}else{O=n;P=m}}else{F=c;G=b;H=g;I=f;J=15}if((J|0)==15){while(1){J=0;F=F+ -16|0;f=(d[G>>0]|0)+H|0;g=f+(d[G+1>>0]|0)|0;b=g+(d[G+2>>0]|0)|0;c=b+(d[G+3>>0]|0)|0;m=c+(d[G+4>>0]|0)|0;n=m+(d[G+5>>0]|0)|0;k=n+(d[G+6>>0]|0)|0;l=k+(d[G+7>>0]|0)|0;h=l+(d[G+8>>0]|0)|0;p=h+(d[G+9>>0]|0)|0;E=p+(d[G+10>>0]|0)|0;D=E+(d[G+11>>0]|0)|0;C=D+(d[G+12>>0]|0)|0;B=C+(d[G+13>>0]|0)|0;A=B+(d[G+14>>0]|0)|0;H=A+(d[G+15>>0]|0)|0;I=f+I+g+b+c+m+n+k+l+h+p+E+D+C+B+A+H|0;G=G+16|0;if(!(F>>>0>15)){break}else{J=15}}if((F|0)==0){Q=H;R=I;J=17}else{K=F;L=G;M=H;N=I;J=16}}if((J|0)==16){while(1){J=0;K=K+ -1|0;I=(d[L>>0]|0)+M|0;H=I+N|0;if((K|0)==0){Q=I;R=H;J=17;break}else{L=L+1|0;M=I;N=H;J=16}}}if((J|0)==17){O=(Q>>>0)%65521|0;P=(R>>>0)%65521|0}j=P<<16|O;i=e;return j|0}function kda(e,f){e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0;g=i;h=c[e+28>>2]|0;j=c[e>>2]|0;k=e+4|0;l=j+((c[k>>2]|0)+ -6)|0;m=e+12|0;n=c[m>>2]|0;o=e+16|0;p=c[o>>2]|0;q=n+(p+ -258)|0;r=c[h+44>>2]|0;s=c[h+48>>2]|0;t=c[h+52>>2]|0;u=h+56|0;v=h+60|0;w=c[h+76>>2]|0;x=c[h+80>>2]|0;y=(1<<c[h+84>>2])+ -1|0;z=(1<<c[h+88>>2])+ -1|0;A=n+(p+~f)|0;f=h+7104|0;p=t+ -1|0;B=(s|0)==0;C=(c[h+40>>2]|0)+ -1|0;D=C+s|0;E=s+ -1|0;F=A+ -1|0;G=A-s|0;H=c[v>>2]|0;I=c[u>>2]|0;J=j+ -1|0;j=n+ -1|0;a:while(1){if(H>>>0<15){n=J+2|0;K=H+16|0;L=((d[J+1>>0]|0)<<H)+I+((d[n>>0]|0)<<H+8)|0;M=n}else{K=H;L=I;M=J}n=L&y;N=a[w+(n<<2)>>0]|0;O=b[w+(n<<2)+2>>1]|0;P=d[w+(n<<2)+1>>0]|0;n=L>>>P;Q=K-P|0;do{if(!(N<<24>>24==0)){R=N&255;S=Q;T=n;P=O;while(1){if((R&16|0)!=0){break}if((R&64|0)!=0){U=55;break a}V=(T&(1<<R)+ -1)+(P&65535)|0;W=a[w+(V<<2)>>0]|0;X=b[w+(V<<2)+2>>1]|0;Y=d[w+(V<<2)+1>>0]|0;Z=T>>>Y;_=S-Y|0;if(W<<24>>24==0){U=6;break}else{R=W&255;S=_;T=Z;P=X}}if((U|0)==6){U=0;$=Z;aa=_;ba=X&255;U=7;break}W=P&65535;Y=R&15;if((Y|0)==0){ca=S;da=T;ea=M;fa=W}else{if(S>>>0<Y>>>0){V=M+1|0;ga=S+8|0;ha=((d[V>>0]|0)<<S)+T|0;ia=V}else{ga=S;ha=T;ia=M}ca=ga-Y|0;da=ha>>>Y;ea=ia;fa=(ha&(1<<Y)+ -1)+W|0}if(ca>>>0<15){W=ea+2|0;ja=ca+16|0;ka=((d[ea+1>>0]|0)<<ca)+da+((d[W>>0]|0)<<ca+8)|0;la=W}else{ja=ca;ka=da;la=ea}W=ka&z;Y=b[x+(W<<2)+2>>1]|0;V=d[x+(W<<2)+1>>0]|0;ma=ka>>>V;na=ja-V|0;V=d[x+(W<<2)>>0]|0;if((V&16|0)==0){W=V;oa=ma;pa=na;qa=Y;while(1){if((W&64|0)!=0){U=52;break a}ra=(oa&(1<<W)+ -1)+(qa&65535)|0;sa=b[x+(ra<<2)+2>>1]|0;ta=d[x+(ra<<2)+1>>0]|0;ua=oa>>>ta;va=pa-ta|0;ta=d[x+(ra<<2)>>0]|0;if((ta&16|0)==0){W=ta;oa=ua;pa=va;qa=sa}else{wa=ua;xa=va;ya=ta;za=sa;break}}}else{wa=ma;xa=na;ya=V;za=Y}qa=za&65535;W=ya&15;if(xa>>>0<W>>>0){P=la+1|0;sa=((d[P>>0]|0)<<xa)+wa|0;ta=xa+8|0;if(ta>>>0<W>>>0){va=la+2|0;Aa=xa+16|0;Ba=((d[va>>0]|0)<<ta)+sa|0;Ca=va}else{Aa=ta;Ba=sa;Ca=P}}else{Aa=xa;Ba=wa;Ca=la}P=(Ba&(1<<W)+ -1)+qa|0;Da=Ba>>>W;Ea=Aa-W|0;W=j;qa=W-A|0;if(!(P>>>0>qa>>>0)){sa=j+(0-P)|0;ta=fa;va=j;while(1){a[va+1>>0]=a[sa+1>>0]|0;a[va+2>>0]=a[sa+2>>0]|0;ua=sa+3|0;Fa=va+3|0;a[Fa>>0]=a[ua>>0]|0;ta=ta+ -3|0;if(!(ta>>>0>2)){break}else{sa=ua;va=Fa}}if((ta|0)==0){Ga=Ea;Ha=Da;Ia=Ca;Ja=Fa;break}Y=va+4|0;a[Y>>0]=a[sa+4>>0]|0;if(!(ta>>>0>1)){Ga=Ea;Ha=Da;Ia=Ca;Ja=Y;break}Y=va+5|0;a[Y>>0]=a[sa+5>>0]|0;Ga=Ea;Ha=Da;Ia=Ca;Ja=Y;break}Y=P-qa|0;if(Y>>>0>r>>>0?(c[f>>2]|0)!=0:0){U=22;break a}do{if(B){V=t+(C-Y)|0;if(Y>>>0<fa>>>0){na=fa-Y|0;ma=P-W|0;ua=V;ra=Y;Ka=j;do{ua=ua+1|0;Ka=Ka+1|0;a[Ka>>0]=a[ua>>0]|0;ra=ra+ -1|0}while((ra|0)!=0);La=j+(F+ma+(1-P))|0;Ma=na;Na=j+(A+ma)|0}else{La=V;Ma=fa;Na=j}}else{if(!(s>>>0<Y>>>0)){ra=t+(E-Y)|0;if(!(Y>>>0<fa>>>0)){La=ra;Ma=fa;Na=j;break}ua=fa-Y|0;Ka=P-W|0;Oa=ra;ra=Y;Pa=j;do{Oa=Oa+1|0;Pa=Pa+1|0;a[Pa>>0]=a[Oa>>0]|0;ra=ra+ -1|0}while((ra|0)!=0);La=j+(F+Ka+(1-P))|0;Ma=ua;Na=j+(A+Ka)|0;break}ra=t+(D-Y)|0;Oa=Y-s|0;if(Oa>>>0<fa>>>0){Pa=fa-Oa|0;V=P-W|0;ma=ra;na=Oa;Oa=j;do{ma=ma+1|0;Oa=Oa+1|0;a[Oa>>0]=a[ma>>0]|0;na=na+ -1|0}while((na|0)!=0);na=j+(G+V)|0;if(s>>>0<Pa>>>0){ma=Pa-s|0;Oa=p;Ka=s;ua=na;do{Oa=Oa+1|0;ua=ua+1|0;a[ua>>0]=a[Oa>>0]|0;Ka=Ka+ -1|0}while((Ka|0)!=0);La=j+(F+V+(1-P))|0;Ma=ma;Na=j+(A+V)|0}else{La=p;Ma=Pa;Na=na}}else{La=ra;Ma=fa;Na=j}}}while(0);if(Ma>>>0>2){P=La;W=Ma;Y=Na;while(1){a[Y+1>>0]=a[P+1>>0]|0;a[Y+2>>0]=a[P+2>>0]|0;qa=P+3|0;sa=Y+3|0;a[sa>>0]=a[qa>>0]|0;va=W+ -3|0;if(va>>>0>2){P=qa;W=va;Y=sa}else{Qa=qa;Ra=va;Sa=sa;break}}}else{Qa=La;Ra=Ma;Sa=Na}if((Ra|0)!=0){Y=Sa+1|0;a[Y>>0]=a[Qa+1>>0]|0;if(Ra>>>0>1){W=Sa+2|0;a[W>>0]=a[Qa+2>>0]|0;Ga=Ea;Ha=Da;Ia=Ca;Ja=W}else{Ga=Ea;Ha=Da;Ia=Ca;Ja=Y}}else{Ga=Ea;Ha=Da;Ia=Ca;Ja=Sa}}else{$=n;aa=Q;ba=O&255;U=7}}while(0);if((U|0)==7){U=0;O=j+1|0;a[O>>0]=ba;Ga=aa;Ha=$;Ia=M;Ja=O}if(Ia>>>0<l>>>0&Ja>>>0<q>>>0){H=Ga;I=Ha;J=Ia;j=Ja}else{Ta=Ga;Ua=Ha;Va=Ia;Wa=Ja;break}}do{if((U|0)==22){c[e+24>>2]=737200;c[h>>2]=29;Ta=Ea;Ua=Da;Va=Ca;Wa=j}else if((U|0)==52){c[e+24>>2]=737232;c[h>>2]=29;Ta=pa;Ua=oa;Va=la;Wa=j}else if((U|0)==55){if((R&32|0)==0){c[e+24>>2]=737256;c[h>>2]=29;Ta=S;Ua=T;Va=M;Wa=j;break}else{c[h>>2]=11;Ta=S;Ua=T;Va=M;Wa=j;break}}}while(0);j=Ta>>>3;M=Va+(0-j)|0;T=Ta-(j<<3)|0;Ta=(1<<T)+ -1&Ua;c[e>>2]=Va+(1-j);c[m>>2]=Wa+1;if(M>>>0<l>>>0){Xa=l-M|0}else{Xa=l-M|0}c[k>>2]=Xa+5;if(Wa>>>0<q>>>0){Ya=q-Wa|0;Za=Ya+257|0;c[o>>2]=Za;c[u>>2]=Ta;c[v>>2]=T;i=g;return}else{Ya=q-Wa|0;Za=Ya+257|0;c[o>>2]=Za;c[u>>2]=Ta;c[v>>2]=T;i=g;return}}function lda(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;e=Qc[c[(c[d>>2]|0)+4>>2]&255](d,8,512)|0;c[a+4>>2]=e;f3a(e|0,0,4096)|0;i=b;return}function mda(a,b){a=a|0;b=b|0;var d=0;d=i;Ic[c[(c[a>>2]|0)+16>>2]&511](a,b);i=d;return}function nda(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;f=a+4|0;a=B$(b,(c[f>>2]|0)+8|0)|0;g=a|2;h=B$(b,(c[f>>2]|0)+(g<<3)|0)|0;j=g<<1|h;if((h|0)!=0){h=B$(b,(c[f>>2]|0)+(j<<3)|0)|0;g=h|j<<1;if((h|0)!=0){h=B$(b,(c[f>>2]|0)+(g<<3)|0)|0;k=h|g<<1;if((h|0)!=0){h=B$(b,(c[f>>2]|0)+(k<<3)|0)|0;l=h|k<<1;if((h|0)==0){m=l;n=84;o=8}else{h=B$(b,(c[f>>2]|0)+(l<<3)|0)|0;p=(h|0)==0;m=h|l<<1;n=p?340:4436;o=p?12:32}}else{m=k;n=20;o=6}}else{m=g;n=4;o=4}}else{m=j;n=0;o=2}j=m;m=0;g=0;while(1){k=B$(b,(c[f>>2]|0)+(j<<3)|0)|0;p=k|j<<1;if((j|0)<256){q=p}else{q=p&255|256}g=k|g<<1;m=m+1|0;if((m|0)>=(o|0)){break}else{j=q}}q=g+n|0;n=(a|0)==1;a=n&(q|0)>0?0-q|0:q;c[d>>2]=a;i=e;return n&(a|0)==0&1|0}function oda(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;g=b+8|0;a[g>>0]=e;h=c[b>>2]|0;j=Qc[c[(c[h>>2]|0)+4>>2]&255](h,8,1<<(e&255))|0;c[b+4>>2]=j;f3a(j|0,0,8<<(d[g>>0]|0)|0)|0;i=f;return}function pda(a,b){a=a|0;b=b|0;var d=0;d=i;Ic[c[(c[a>>2]|0)+16>>2]&511](a,b);i=d;return}function qda(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;g=i;h=b+8|0;j=a[h>>0]|0;if(j<<24>>24==0){k=j&255;l=1}else{j=b+4|0;b=1;m=0;while(1){n=B$(e,(c[j>>2]|0)+(b<<3)|0)|0|b<<1;m=m+1|0;o=d[h>>0]|0;if((m|0)>=(o|0)){k=o;l=n;break}else{b=n}}}c[f>>2]=l-(1<<k);i=g;return}function rda(a,b,d,e,f,g,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;j=i;i=i+112|0;k=j+96|0;l=j+24|0;m=j;if((b|0)==0){n=0;i=j;return n|0}o=v3(a,0,0)|0;if((o|0)==0){n=0;i=j;return n|0}p=c[e>>2]|0;q=(b|0)==1;r=p;s=j2(p)|0;p=0;a:while(1){t=l2(r)|0;u=(p|0)==0;if(u?!((t|0)==1633842036|(t|0)==1818848875):0){v=c[d>>2]|0;w=1;x=9}else{y=(s|0)!=1281450528&(s|0)!=1482250784;z=c[d+(p<<2)>>2]|0;if((s|0)==1281450528|(s|0)==1482250784?!((t|0)==1633842036|(t|0)==1818848875):0){A=h2(r)|0;B=z;C=A;D=j2(r)|0;E=y}else{v=z;w=y;x=9}}if((x|0)==9){x=0;y=j2(r)|0;B=v;C=y;D=h2(r)|0;E=w}if(((((C|0)!=(s|0)?!((C|0)==876825682&(s|0)==1129142603):0)?!((C|0)==1129142603&(s|0)==876825682):0)?!((C|0)==1482250784&(s|0)==1281450528):0)?!((C|0)==1281450528&(s|0)==1482250784):0){x=16;break}do{if(!((t|0)==1633842036|(t|0)==1818848875)?!((t|0)==1852662636&q):0){if(E){y=aea(r,B)|0;if((y|0)==0){break a}else{F=y;break}}y=bea(r,B)|0;if((y|0)==0){break a}if((yda(p,e,B,c[f+(p<<2)>>2]|0,+h[g+(p<<3)>>3],l,m)|0)==0){G=y;x=33;break a}if((zda(o,s,C,l,m)|0)==0){H=y;x=32;break a}else{F=y}}else{x=19}}while(0);if((x|0)==19){x=0;y=dea(r,B)|0;if((y|0)==0){break}if(!((t|0)!=1633842036|u)){if((yda(p,e,B,c[f+(p<<2)>>2]|0,+h[g+(p<<3)>>3],l,m)|0)==0){G=y;x=33;break}}else{U3(l);T3(m,0.0,0.0,0.0)}if((zda(o,s,C,l,m)|0)==0){H=y;x=32;break}else{F=y}}if((H3(o,F)|0)==0){H=F;x=32;break}B3(F);y=p+1|0;if(!(y>>>0<b>>>0)){n=o;x=35;break}r=c[e+(y<<2)>>2]|0;s=D;p=y}if((x|0)==16){Jda(a,9,740032,k)}else if((x|0)==32){if((H|0)!=0){G=H;x=33}}else if((x|0)==35){i=j;return n|0}if((x|0)==33){B3(G)}B3(o);n=0;i=j;return n|0}function sda(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;j=i;i=i+16|0;k=j;if((b|0)==0|b>>>0>255){c[k>>2]=b;Jda(a,2,737296,k);l=0;i=j;return l|0}else{m=0}do{n=d+(m<<2)|0;o=c[n>>2]|0;if((o|0)==3){c[f+(m<<2)>>2]=0;p=c[n>>2]|0}else{p=o}if((p|0)==2|(p|0)==0?+q2(c[e+(m<<2)>>2]|0)>=4.0:0){c[f+(m<<2)>>2]=1}m=m+1|0}while((m|0)!=(b|0));m=c[d>>2]|0;p=c[(U4(a,10)|0)>>2]|0;a:do{if((p|0)==0){q=737352;r=12}else{o=p;while(1){if((c[o>>2]|0)==(m|0)){s=o;break a}o=c[o+264>>2]|0;if((o|0)==0){q=737352;r=12;break}}}}while(0);b:do{if((r|0)==12){while(1){r=0;if((c[q>>2]|0)==(m|0)){s=q;break b}q=c[q+264>>2]|0;if((q|0)==0){break}else{r=12}}c[k>>2]=c[d>>2];Jda(a,8,737328,k);l=0;i=j;return l|0}}while(0);l=Ec[c[s+260>>2]&15](a,b,d,e,f,g,h)|0;i=j;return l|0}function tda(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;j=i;i=i+1040|0;k=j;l=j+8|0;if((b|0)==0|b>>>0>255){m=0;i=j;return m|0}else{n=0}do{o=c[d+(n<<2)>>2]|0;switch(o|0){case 15:case 12:{p=2;break};case 14:case 11:{p=1;break};case 13:case 10:{p=0;break};default:{p=o}}c[l+(n<<2)>>2]=p;n=n+1|0}while((n|0)!=(b|0));if((j2(c[e>>2]|0)|0)==1129142603?(j2(c[e+(b+ -1<<2)>>2]|0)|0)==1129142603:0){n=k;c[n>>2]=0;c[n+4>>2]=0;n=v3(a,4,4)|0;if((n|0)==0){m=0;i=j;return m|0}p=rda(a,b,l,e,f,g,h)|0;c[k>>2]=p;if((p|0)!=0){p=Uda(a,b,l,e,f,g,h)|0;d=k+4|0;c[d>>2]=p;if((((p|0)!=0?(p=Z2(a,l4(1129142603,h)|0,4,4,0)|0,(p|0)!=0):0)?(F3(n,0,p)|0)!=0:0)?(b3(p,219,k)|0)!=0:0){B3(c[k>>2]|0);V0(c[d>>2]|0);m=n;i=j;return m|0}p=c[k>>2]|0;if((p|0)==0){q=d}else{B3(p);q=d}}else{q=k+4|0}k=c[q>>2]|0;if((k|0)!=0){V0(k)}B3(n);m=0;i=j;return m|0}m=rda(a,b,l,e,f,g,h)|0;i=j;return m|0}function uda(a,b,d,e,f,g,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0;k=i;i=i+1072|0;l=k;m=k+48|0;if((b|0)==0|b>>>0>255){n=0;i=k;return n|0}else{o=0}do{p=c[d+(o<<2)>>2]|0;switch(p|0){case 15:case 12:{q=2;break};case 13:case 10:{q=0;break};case 14:case 11:{q=1;break};default:{q=p}}c[m+(o<<2)>>2]=q;o=o+1|0}while((o|0)!=(b|0));do{if((j2(c[e>>2]|0)|0)==1129142603){o=e+(b+ -1<<2)|0;q=c[o>>2]|0;if((j2(q)|0)!=1129142603?(l2(q)|0)!=1886549106:0){break}q=v3(a,4,4)|0;if((q|0)==0){n=0;i=k;return n|0}d=l+0|0;p=d+48|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(p|0));d=aea(c[o>>2]|0,1)|0;p=l+16|0;c[p>>2]=d;if((((((((d|0)!=0?(r=+Yda(c[o>>2]|0)/100.0,h[l+40>>3]=r,!(r<=0.0)):0)?(d=rda(a,b,m,e,f,g,j)|0,c[l>>2]=d,(d|0)!=0):0)?(d=Uda(a,b,m,e,f,g,j)|0,c[l+12>>2]=d,(d|0)!=0):0)?(d=f8(a)|0,s=x8(a,c[o>>2]|0,34,d,4849688,1,320)|0,c[l+4>>2]=s,(s|0)!=0):0)?(s=x8(a,c[o>>2]|0,4194340,d,4194332,1,320)|0,c[l+8>>2]=s,(s|0)!=0):0)?(r2(d),h[l+24>>3]=0.0,d=Z2(a,l4(1129142603,j)|0,4,4,0)|0,(d|0)!=0):0)?(F3(q,0,d)|0)!=0:0){b3(d,220,l)|0}d=c[l>>2]|0;if((d|0)!=0){B3(d)}d=c[l+8>>2]|0;if((d|0)!=0){o8(d)}d=c[l+4>>2]|0;if((d|0)!=0){o8(d)}d=c[l+12>>2]|0;if((d|0)!=0){V0(d)}d=c[p>>2]|0;if((d|0)==0){n=q;i=k;return n|0}B3(d);n=q;i=k;return n|0}}while(0);n=rda(a,b,m,e,f,g,j)|0;i=k;return n|0}function vda(a,d,f){a=a|0;d=d|0;f=f|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0;j=i;i=i+96|0;k=j+80|0;l=j+64|0;m=j+48|0;n=j+24|0;o=j;g[k>>2]=+(e[a>>1]|0)/65535.0;p=a+2|0;g[k+4>>2]=+(e[p>>1]|0)/65535.0;q=a+4|0;g[k+8>>2]=+(e[q>>1]|0)/65535.0;r=+(e[a+6>>1]|0)/65535.0;g[k+12>>2]=r;s=+_0(c[f+12>>2]|0,r);t=m+12|0;g[t>>2]=s;if(((b[a>>1]|0)==0?(b[p>>1]|0)==0:0)?(b[q>>1]|0)==0:0){b[d+4>>1]=0;b[d+2>>1]=0;b[d>>1]=0;b[d+6>>1]=wda(s*65535.0)|0;i=j;return 1}D3(k,l,c[f>>2]|0);b[d>>1]=wda(+g[l>>2]*65535.0)|0;k=l+4|0;q=d+2|0;b[q>>1]=wda(+g[k>>2]*65535.0)|0;p=l+8|0;a=d+4|0;b[a>>1]=wda(+g[p>>2]*65535.0)|0;u=l+12|0;s=+g[u>>2];v=d+6|0;b[v>>1]=wda(s*65535.0)|0;if(+R(+(s- +g[t>>2]))<45777065690089265.0e-21){i=j;return 1}w=f+4|0;p8(c[w>>2]|0,d,n,1);p8(c[f+8>>2]|0,l,m,1);if((L3(m,l,l,c[f+16>>2]|0)|0)==0){i=j;return 1}s=+g[t>>2];g[u>>2]=s;r=+g[l>>2];x=+g[k>>2];y=+g[p>>2];z=r+x+y;A=s;s=A+z;B=+h[f+40>>3];if(s>B){C=1.0-(s-B)/z;if(C<0.0){D=0.0}else{D=C}}else{D=1.0}b[d>>1]=wda(D*r*65535.0)|0;b[q>>1]=wda(D*x*65535.0)|0;b[a>>1]=wda(D*y*65535.0)|0;b[v>>1]=wda(A*65535.0)|0;p8(c[w>>2]|0,d,o,1);A=+k4(+h[n>>3],+h[n+8>>3],+h[n+16>>3],+h[o>>3],+h[o+8>>3],+h[o+16>>3]);o=f+24|0;if(!(A>+h[o>>3])){i=j;return 1}h[o>>3]=A;i=j;return 1}function wda(a){a=+a;var b=0,d=0.0,e=0;b=i;d=a+.5;if(!(d<=0.0)){if(!(d>=65535.0)){h[k>>3]=d+-32767.0+103079215104.0;e=((c[k>>2]|0)>>>16)+32767&65535}else{e=-1}}else{e=0}i=b;return e|0}function xda(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0;f=i;if(((b[a>>1]|0)==0?(b[a+2>>1]|0)==0:0)?(b[a+4>>1]|0)==0:0){b[d+4>>1]=0;b[d+2>>1]=0;b[d>>1]=0;b[d+6>>1]=e1(c[e+4>>2]|0,b[a+6>>1]|0)|0;i=f;return 1}g=c[e>>2]|0;ld[c[g+16>>2]&255](a,d,c[g+12>>2]|0);i=f;return 1}function yda(a,b,d,e,f,g,j){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0.0,B=0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0,N=0,O=0,P=0;k=i;i=i+720|0;l=k+696|0;m=k+672|0;n=k+600|0;o=k+528|0;p=k+456|0;q=k+384|0;r=k+312|0;s=k+240|0;t=k+216|0;u=k+192|0;v=k+120|0;w=k+48|0;x=k+24|0;y=k;U3(g);T3(j,0.0,0.0,0.0);do{if((d|0)!=3){if((e|0)!=0){Dha(x,c[b+(a+ -1<<2)>>2]|0,d)|0;Fha(y,c[b+(a<<2)>>2]|0,d);z=+h[x>>3];A=+h[y>>3];B=x+8|0;if(!(z!=A)){C=+h[B>>3];D=+h[y+8>>3];if(!(C!=D)?!(+h[x+16>>3]!=+h[y+16>>3]):0){break}else{E=C;F=D}}else{E=+h[B>>3];F=+h[y+8>>3]}D=+h[90522];C=z-D;G=+h[724184>>3];H=E-G;I=+h[x+16>>3];J=+h[724192>>3];K=I-J;L=+h[y+16>>3];T3(g,(A-D)/C,0.0,0.0);T3(g+24|0,0.0,(F-G)/H,0.0);T3(g+48|0,0.0,0.0,(L-J)/K);T3(j,-(D*(A-z))/C,-(G*(F-E))/H,-(J*(L-I))/K)}}else{B=b+(a+ -1<<2)|0;_da(t,c[B>>2]|0);$da(v,c[B>>2]|0);B=b+(a<<2)|0;_da(u,c[B>>2]|0);$da(w,c[B>>2]|0);if(f==1.0){T3(g,+h[t>>3]/+h[u>>3],0.0,0.0);T3(g+24|0,0.0,+h[t+8>>3]/+h[u+8>>3],0.0);T3(g+48|0,0.0,0.0,+h[t+16>>3]/+h[u+16>>3]);break}T3(n,+h[t>>3]/+h[u>>3],0.0,0.0);T3(n+24|0,0.0,+h[t+8>>3]/+h[u+8>>3],0.0);T3(n+48|0,0.0,0.0,+h[t+16>>3]/+h[u+16>>3]);if(f==0.0){M=o+0|0;N=w+0|0;O=M+72|0;do{c[M>>2]=c[N>>2];M=M+4|0;N=N+4|0}while((M|0)<(O|0));W3(p,o,n);W3(g,p,w);M=q+0|0;N=v+0|0;O=M+72|0;do{c[M>>2]=c[N>>2];M=M+4|0;N=N+4|0}while((M|0)<(O|0));if((X3(q,r)|0)==0){P=0;i=k;return P|0}else{W3(g,p,r);break}}M=o+0|0;N=v+0|0;O=M+72|0;do{c[M>>2]=c[N>>2];M=M+4|0;N=N+4|0}while((M|0)<(O|0));if((X3(o,p)|0)==0){P=0;i=k;return P|0}W3(q,p,n);K=+Bda(v);I=+Bda(w);if(K<0.0|I<0.0){P=0;i=k;return P|0}if((V3(n)|0)!=0?+R(+(K-I))<.01:0){U3(g);break}j8(m,K*f+(1.0-f)*I)|0;$3(l,m);l8(s,l)|0;W3(g,q,s)}}while(0);h[j>>3]=+h[j>>3]/1.999969482421875;s=j+8|0;h[s>>3]=+h[s>>3]/1.999969482421875;s=j+16|0;h[s>>3]=+h[s>>3]/1.999969482421875;P=1;i=k;return P|0}function zda(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;do{if((b|0)==1482250784){if((d|0)==1482250784){if((Ada(e,f)|0)!=0){h=17;break}if((F3(a,1,Q2(c[a+32>>2]|0,3,3,e,f)|0)|0)==0){j=0;break}else{h=17;break}}else if((d|0)!=1281450528){j=0;break}k=a+32|0;if((Ada(e,f)|0)==0?(F3(a,1,Q2(c[k>>2]|0,3,3,e,f)|0)|0)==0:0){j=0;break}if((F3(a,1,o3(c[k>>2]|0)|0)|0)==0){j=0}else{h=17}}else if((b|0)==1281450528){if((d|0)==1482250784){k=a+32|0;if((F3(a,1,g3(c[k>>2]|0)|0)|0)==0){j=0;break}if((Ada(e,f)|0)!=0){h=17;break}if((F3(a,1,Q2(c[k>>2]|0,3,3,e,f)|0)|0)==0){j=0;break}else{h=17;break}}else if((d|0)!=1281450528){j=0;break}if((Ada(e,f)|0)==0){k=a+32|0;if(((F3(a,1,g3(c[k>>2]|0)|0)|0)!=0?(F3(a,1,Q2(c[k>>2]|0,3,3,e,f)|0)|0)!=0:0)?(F3(a,1,o3(c[k>>2]|0)|0)|0)!=0:0){h=17}else{j=0}}else{h=17}}else{if((b|0)==(d|0)){h=17}else{j=0}}}while(0);if((h|0)==17){j=1}i=g;return j|0}function Ada(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,j=0.0,k=0.0;c=i;i=i+80|0;d=c;e=(a|0)==0;f=(b|0)==0;if(e&f){g=1;i=c;return g|0}if(!(f|e^1)){g=0;i=c;return g|0}U3(d);j=0.0;e=0;do{j=j+ +R(+(+h[a+(e<<3)>>3]- +h[d+(e<<3)>>3]));e=e+1|0}while((e|0)!=9);k=j+ +R(+(+h[b>>3]));j=k+ +R(+(+h[b+8>>3]));g=j+ +R(+(+h[b+16>>3]))<.002&1;i=c;return g|0}function Bda(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0.0;b=i;i=i+256|0;d=b+224|0;e=b+200|0;f=b+176|0;g=b+152|0;j=b+144|0;k=b+72|0;l=b;m=k+0|0;n=a+0|0;a=m+72|0;do{c[m>>2]=c[n>>2];m=m+4|0;n=n+4|0}while((m|0)<(a|0));if((X3(k,l)|0)==0){o=0.0;i=b;return+o}h[e>>3]=+h[90522];h[e+8>>3]=+h[724184>>3];h[e+16>>3]=+h[724192>>3];Z3(d,l,e);h[f>>3]=+h[d>>3];h[f+8>>3]=+h[d+8>>3];h[f+16>>3]=+h[d+16>>3];_3(g,f);f=(k8(j,g)|0)==0;o=f?-1.0:+h[j>>3];i=b;return+o}function Cda(a,b){a=a|0;b=b|0;var c=0;a=i;c=qna(b)|0;i=a;return c|0}function Dda(a,b){a=a|0;b=b|0;var c=0;a=i;c=qna(b)|0;if((c|0)!=0){f3a(c|0,0,b|0)|0}i=a;return c|0}function Eda(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;a=i;d=ca(c,b)|0;if((d|0)!=0?!(d>>>0>536870911?1:((d>>>0)/(c>>>0)|0|0)!=(b|0)):0){e=Dda(0,d)|0}else{e=0}i=a;return e|0}function Fda(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;a=i;d=rna(b,c)|0;i=a;return d|0}function Gda(a,b){a=a|0;b=b|0;a=i;if((b|0)!=0){sna(b)}i=a;return}function Hda(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;a=i;d=qna(c)|0;c3a(d|0,b|0,c|0)|0;i=a;return d|0}function Ida(a,b,c){a=a|0;b=b|0;c=c|0;return}function Jda(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;i=i+1040|0;g=f;h=f+16|0;c[g>>2]=e;M2a(h,1023,d,g);g=c[(U4(a,1)|0)>>2]|0;if((g|0)==0){i=f;return}ld[g&255](a,b,h);i=f;return}function Kda(b,c){b=b|0;c=c|0;var d=0,e=0;d=i;e=s4(c)|0;a[b>>0]=e;a[b+1>>0]=e>>8;a[b+2>>0]=e>>16;a[b+3>>0]=e>>24;a[b+4>>0]=0;i=d;return}function Lda(a){a=a|0;var b=0;a=i;b=qna(24)|0;Cc(b|0,0)|0;i=a;return b|0}function Mda(a,b){a=a|0;b=b|0;a=i;$b(b|0)|0;Gda(0,b);i=a;return}function Nda(a,b){a=a|0;b=b|0;var c=0;a=i;c=(Lb(b|0)|0)==0&1;i=a;return c|0}function Oda(a,b){a=a|0;b=b|0;a=i;pc(b|0)|0;i=a;return}function Pda(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[(U4(a,14)|0)>>2]|0;if((d|0)==0){e=0;i=b;return e|0}e=Lc[d&255](a)|0;i=b;return e|0}function Qda(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[(U4(a,14)|0)+4>>2]|0;if((e|0)==0){i=d;return}Ic[e&511](a,b);i=d;return}function Rda(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[(U4(a,14)|0)+8>>2]|0;if((e|0)==0){f=1;i=d;return f|0}f=dd[e&511](a,b)|0;i=d;return f|0}function Sda(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[(U4(a,14)|0)+12>>2]|0;if((e|0)==0){i=d;return}Ic[e&511](a,b);i=d;return}function Tda(a,b,d,e,f,g,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;k=i;i=i+5120|0;l=k+4096|0;m=k+3072|0;n=k;o=k+2048|0;if(b>>>0>254){p=0;i=k;return p|0}q=f8(a)|0;if((q|0)==0){p=0;i=k;return p|0}if((b|0)!=0){r=b<<2;c3a(l|0,e|0,r|0)|0;c3a(m|0,f|0,r|0)|0;c3a(n|0,g|0,b<<3|0)|0;c3a(o|0,d|0,r|0)|0}c[l+(b<<2)>>2]=q;c[m+(b<<2)>>2]=0;h[n+(b<<3)>>3]=1.0;c[o+(b<<2)>>2]=1;r=r8(a,b+1|0,l,m,o,n,0,0,4587556,4849688,j)|0;r2(q);p=r;i=k;return p|0}function Uda(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0;j=i;do{if((((j2(c[e>>2]|0)|0)==1129142603?(k=b+ -1|0,l=e+(k<<2)|0,m=c[l>>2]|0,(j2(m)|0)==1129142603):0)?(l2(m)|0)==1886549106:0)?(m=Vda(a,k,d,e,f,g,h)|0,(m|0)!=0):0){n=Vda(a,1,d+(k<<2)|0,l,f+(k<<2)|0,g+(k<<3)|0,h)|0;if((n|0)==0){V0(m);o=0;break}k=Y0(a,m,n)|0;V0(m);V0(n);if((k|0)!=0){if((c1(k)|0)==0){V0(k);o=0}else{o=k}}else{o=0}}else{o=0}}while(0);i=j;return o|0}function Vda(a,b,c,d,e,f,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;j=j|0;var k=0,l=0,m=0,n=0,o=0;k=i;i=i+48|0;l=k;m=k+24|0;n=Tda(a,b,c,d,e,f,j)|0;if((n|0)==0){o=0;i=k;return o|0}j=Eda(a,4096,4)|0;if((j|0)==0){o8(n);o=0;i=k;return o|0}f=m+4|0;e=m+8|0;d=m+12|0;c=0;do{g[m>>2]=0.0;g[f>>2]=0.0;g[e>>2]=0.0;g[d>>2]=+(c>>>0)*100.0/4095.0;p8(n,m,l,1);g[j+(c<<2)>>2]=1.0- +h[l>>3]/100.0;c=c+1|0}while((c|0)!=4096);c=R0(a,j)|0;o8(n);Gda(a,j);o=c;i=k;return o|0}function Wda(a,b,d,e,f,g,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;k=i;i=i+5152|0;l=k+2072|0;m=k+2048|0;n=k+4128|0;o=k+3104|0;p=k;q=k+2080|0;c[m+0>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;c[m+20>>2]=0;if((g|0)==0|g>>>0>255){c[l>>2]=g;Jda(a,2,740104,l);r=0;i=k;return r|0}l=f8(a)|0;if((l|0)==0){r=0;i=k;return r|0}s=(eea(j)|0)==0;h[m+16>>3]=s?5.0:1.0;s=g<<2;c3a(n|0,b|0,s|0)|0;c3a(o|0,d|0,s|0)|0;c3a(p|0,f|0,g<<3|0)|0;c3a(q|0,e|0,s|0)|0;c[n+(g<<2)>>2]=l;c[o+(g<<2)>>2]=0;h[p+(g<<3)>>3]=1.0;c[q+(g<<2)>>2]=1;s=j2(j)|0;e=m4(s)|0;f=l4(s,1024)|0;s=e<<3|2;c[m>>2]=r8(a,g+1|0,n,o,q,p,0,0,s,4849688,64)|0;p=m+4|0;c[p>>2]=x8(a,l,4849688,j,s,1,64)|0;q=x8(a,j,s,l,4849688,1,64)|0;s=m+8|0;c[s>>2]=q;if((c[m>>2]|0)!=0){do{if(!((c[p>>2]|0)==0|(q|0)==0)?(j=v3(a,3,1)|0,(j|0)!=0):0){o=Z2(a,f,e,1,0)|0;if((F3(j,0,o)|0)==0){B3(j);t=0;break}else{b3(o,221,m)|0;t=j;break}}else{t=0}}while(0);e=c[m>>2]|0;if((e|0)==0){u=t}else{o8(e);u=t}}else{u=0}t=c[p>>2]|0;if((t|0)!=0){o8(t)}t=c[s>>2]|0;if((t|0)!=0){o8(t)}r2(l);r=u;i=k;return r|0}function Xda(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,j=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,v=0.0;f=i;i=i+144|0;g=f+48|0;j=f+24|0;l=f;m=f+104|0;n=f+72|0;p8(c[e>>2]|0,a,g,1);a=e+4|0;p8(c[a>>2]|0,g,m,1);o=e+8|0;p8(c[o>>2]|0,m,j,1);p=+h[j>>3];m=j+8|0;q=+h[m>>3];r=j+16|0;s=+h[r>>3];p8(c[a>>2]|0,j,n,1);p8(c[o>>2]|0,n,l,1);t=+k4(+h[g>>3],+h[g+8>>3],+h[g+16>>3],+h[j>>3],+h[m>>3],+h[r>>3]);u=+k4(p,q,s,+h[l>>3],+h[l+8>>3],+h[l+16>>3]);s=+h[e+16>>3];e=t<s;l=u<s;if(e&l){b[d>>1]=0;i=f;return 1}if(e&u>s){b[d>>1]=0;i=f;return 1}if(t>s&l){h[k>>3]=t-s+.5+103079215104.0;b[d>>1]=(c[k>>2]|0)>>>16;i=f;return 1}if(u==0.0){v=t}else{v=t/u}if(v>s){h[k>>3]=v-s+.5+103079215104.0;b[d>>1]=(c[k>>2]|0)>>>16;i=f;return 1}else{b[d>>1]=0;i=f;return 1}return 0}function Yda(a){a=a|0;var b=0,d=0,e=0,f=0,h=0.0,j=0,k=0,l=0,m=0,n=0.0;b=i;i=i+112|0;d=b+32|0;e=b;f=Y1(a)|0;if((l2(a)|0)!=1886549106){h=0.0;i=b;return+h}j=xfa(a,4,1)|0;c[d>>2]=j>>>3&15;k=d+8|0;g[k>>2]=0.0;l=f8(f)|0;if((l|0)==0){h=0.0;i=b;return+h}m=x8(f,l,655386,a,j,0,320)|0;j=d+4|0;c[j>>2]=m;r2(l);if((m|0)==0){h=0.0;i=b;return+h}c[e>>2]=6;c[e+4>>2]=74;c[e+8>>2]=74;if((f3(e,d)|0)==0){g[k>>2]=0.0;n=0.0}else{n=+g[k>>2]}o8(c[j>>2]|0);h=n;i=b;return+h}function Zda(a,b){a=a|0;b=b|0;var d=0,f=0,h=0,j=0,k=0.0,l=0.0,m=0,n=0.0;d=i;i=i+64|0;f=d;p8(c[b+4>>2]|0,a,f,1);h=c[b>>2]|0;if((h|0)==0){j=0;k=0.0}else{l=0.0;m=0;while(1){n=l+ +g[f+(m<<2)>>2];m=m+1|0;if(!(m>>>0<h>>>0)){j=h;k=n;break}else{l=n}}}h=b+8|0;if(!(k>+g[h>>2])){i=d;return 1}g[h>>2]=k;if((j|0)==0){i=d;return 1}j=b+12|0;h=0;do{g[j+(h<<2)>>2]=+(e[a+(h<<1)>>1]|0);h=h+1|0}while(h>>>0<(c[b>>2]|0)>>>0);i=d;return 1}function _da(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((a|0)==0){_a(740160,740184,68,740240)}e=x2(b,2004119668)|0;if((e|0)==0){c[a+0>>2]=c[724176>>2];c[a+4>>2]=c[724180>>2];c[a+8>>2]=c[724184>>2];c[a+12>>2]=c[724188>>2];c[a+16>>2]=c[724192>>2];c[a+20>>2]=c[724196>>2];i=d;return}if((n2(b)|0)>>>0<67108864?(l2(b)|0)==1835955314:0){c[a+0>>2]=c[724176>>2];c[a+4>>2]=c[724180>>2];c[a+8>>2]=c[724184>>2];c[a+12>>2]=c[724188>>2];c[a+16>>2]=c[724192>>2];c[a+20>>2]=c[724196>>2];i=d;return}c[a+0>>2]=c[e+0>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];c[a+16>>2]=c[e+16>>2];c[a+20>>2]=c[e+20>>2];i=d;return}function $da(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;if((a|0)==0){_a(740160,740184,98,740264)}e=x2(b,1667785060)|0;if((e|0)!=0){f=a+0|0;g=e+0|0;e=f+72|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(e|0));i=d;return}U3(a);if(!((n2(b)|0)>>>0<67108864)){i=d;return}if((l2(b)|0)!=1835955314){i=d;return}g=x2(b,2004119668)|0;if((g|0)==0){U3(a);i=d;return}else{l8(a,g)|0;i=d;return}}function aea(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;i=i+96|0;e=d;f=d+88|0;g=d+84|0;j=d+72|0;k=c[740280+(b<<2)>>2]|0;l=c[740296+(b<<2)>>2]|0;m=Y1(a)|0;if((l2(a)|0)==1852662636){n=x2(a,1852009522)|0;if((n|0)==0){o=0;i=d;return o|0}p=v3(m,0,0)|0;if((p|0)==0){wea(n);o=0;i=d;return o|0}if((F3(p,0,Bea(n,1)|0)|0)!=0?(F3(p,1,i3(m)|0)|0)!=0:0){o=p;i=d;return o|0}B3(p);o=0;i=d;return o|0}do{if(!((b|0)==-1)){if((_1(a,l)|0)==0){p=(_1(a,k)|0)==0;n=p?1093812784:k;if((_1(a,n)|0)==0){break}p=x2(a,n)|0;if((p|0)==0){o=0;i=d;return o|0}q=z2(a,n)|0;n=E3(p)|0;if((q|0)!=1835430962){o=n;i=d;return o|0}if((h2(a)|0)!=1281450528){o=n;i=d;return o|0}if(!((j2(a)|0)==1281450528?(F3(n,0,j3(m)|0)|0)==0:0)){r=24}if((r|0)==24?(F3(n,1,i3(m)|0)|0)!=0:0){o=n;i=d;return o|0}B3(n);o=0;i=d;return o|0}else{n=E3(x2(a,l)|0)|0;q=h2(a)|0;if((n|0)==0){o=0;i=d;return o|0}p=j2(a)|0;if((p|0)==1281450528){if((F3(n,0,m3(m)|0)|0)!=0){r=14}}else if(!((p|0)==1482250784?(F3(n,0,n3(m)|0)|0)==0:0)){r=14}do{if((r|0)==14){if((q|0)==1482250784){if((F3(n,1,l3(m)|0)|0)==0){break}else{o=n}i=d;return o|0}else if((q|0)==1281450528){if((F3(n,1,k3(m)|0)|0)==0){break}else{o=n}i=d;return o|0}else{o=n;i=d;return o|0}}}while(0);B3(n);o=0;i=d;return o|0}}}while(0);if((j2(a)|0)==1196573017){m=Y1(a)|0;r=x2(a,1800688195)|0;c[f>>2]=r;if((r|0)==0){o=0;i=d;return o|0}r=v3(m,1,3)|0;do{if((r|0)!=0){if((h2(a)|0)!=1281450528){if((F3(r,1,K2(m,1,f)|0)|0)==0){break}if((F3(r,1,Q2(m,3,1,740496,0)|0)|0)==0){break}else{o=r}i=d;return o|0}c[g>>2]=-2139062144;l=M0(m,2,g)|0;if((l|0)!=0){c[j>>2]=c[f>>2];c[j+4>>2]=l;c[j+8>>2]=l;if((F3(r,1,Q2(m,3,1,740472,0)|0)|0)!=0?(F3(r,1,K2(m,3,j)|0)|0)!=0:0){V0(l);o=r;i=d;return o|0}V0(l)}}}while(0);B3(r);o=0;i=d;return o|0}r=Y1(a)|0;if((jea(e,a)|0)==0){o=0;i=d;return o|0}h[e>>3]=+h[e>>3]*.5000076295109483;m=e+8|0;h[m>>3]=+h[m>>3]*.5000076295109483;m=e+16|0;h[m>>3]=+h[m>>3]*.5000076295109483;m=e+24|0;h[m>>3]=+h[m>>3]*.5000076295109483;m=e+32|0;h[m>>3]=+h[m>>3]*.5000076295109483;m=e+40|0;h[m>>3]=+h[m>>3]*.5000076295109483;m=e+48|0;h[m>>3]=+h[m>>3]*.5000076295109483;m=e+56|0;h[m>>3]=+h[m>>3]*.5000076295109483;m=e+64|0;h[m>>3]=+h[m>>3]*.5000076295109483;c[j>>2]=x2(a,1918128707)|0;m=j+4|0;c[m>>2]=x2(a,1733579331)|0;f=x2(a,1649693251)|0;c[j+8>>2]=f;if((c[j>>2]|0)==0){o=0;i=d;return o|0}if((c[m>>2]|0)==0|(f|0)==0){o=0;i=d;return o|0}f=v3(r,3,3)|0;if((f|0)==0){o=0;i=d;return o|0}if((F3(f,1,K2(r,3,j)|0)|0)!=0?(F3(f,1,Q2(r,3,3,e,0)|0)|0)!=0:0){if((h2(a)|0)!=1281450528){o=f;i=d;return o|0}if((F3(f,1,o3(r)|0)|0)!=0){o=f;i=d;return o|0}}B3(f);o=0;i=d;return o|0}\n\n\n\nfunction _Pa(d,f,g){d=d|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0;h=i;i=i+64|0;j=h+52|0;k=h+48|0;l=h+58|0;m=h+56|0;n=h+8|0;o=h;p=c[d>>2]|0;q=d+12|0;r=c[q>>2]|0;if(g>>>0>1?(e[p+290>>1]|0)>>>0<g>>>0:0){s=21;i=h;return s|0}if(!((c[p+16>>2]|0)>>>0>f>>>0)){s=16;i=h;return s|0}c[d+20>>2]=f;t=d+16|0;if((c[t>>2]&1|0)==0){u=c[d+4>>2]|0;v=c[u+48>>2]|0;w=c[u+52>>2]|0}else{v=65536;w=65536}b[j>>1]=0;b[k>>1]=0;b[l>>1]=0;b[m>>1]=0;ed[c[(c[p+528>>2]|0)+112>>2]&127](p,0,f,j,l)|0;ZPa(p,f,k,m);u=d+52|0;c[u>>2]=b[j>>1]|0;x=e[l>>1]|0;l=d+56|0;c[l>>2]=x;y=d+176|0;c[y>>2]=b[k>>1]|0;z=d+180|0;c[z>>2]=e[m>>1]|0;m=d+64|0;if((a[m>>0]|0)==0){a[m>>0]=1;c[d+60>>2]=x}x=p+128|0;m=c[(c[x>>2]|0)+48>>2]|0;do{if((m|0)!=0){A=Qc[c[c[m>>2]>>2]&255](c[m+4>>2]|0,f,o)|0;if((A|0)==0){B=c[o+4>>2]|0;c[d+28>>2]=B;C=n+0|0;D=C+40|0;do{c[C>>2]=0;C=C+4|0}while((C|0)<(D|0));nEa(n,c[o>>2]|0,B);c[d+24>>2]=n;E=1;F=0;break}else{s=A;i=h;return s|0}}else{E=0;F=YPa(p,f,d+28|0)|0}}while(0);n=d+28|0;m=c[n>>2]|0;do{if((m|0)>0){C=c[d+84>>2]|0;if((C|0)==0?(c[(c[x>>2]|0)+48>>2]|0)==0:0){G=8;break}D=id[c[p+508>>2]&511](d,f,C+F|0,m)|0;if((D|0)==0){C=Lc[c[p+516>>2]&255](d)|0;if((C|0)==0){H=c[n>>2]|0;I=1;J=18}else{K=C;J=85}}else{G=D}}else{H=m;I=0;J=18}}while(0);a:do{if((J|0)==18){do{if((H|0)!=0?(m=d+32|0,(b[m>>1]|0)!=0):0){F=(c[d+36>>2]|0)-(c[u>>2]|0)|0;D=d+68|0;c[D>>2]=F;c[d+72>>2]=0;C=d+76|0;c[C>>2]=(c[l>>2]|0)+F;c[d+80>>2]=0;F=d+184|0;c[F>>2]=0;L=(c[d+48>>2]|0)+(c[y>>2]|0)|0;M=d+188|0;c[M>>2]=L;N=d+192|0;c[N>>2]=0;O=d+196|0;c[O>>2]=L-(c[z>>2]|0);$Pa(d,f);L=b[m>>1]|0;if(L<<16>>16>0){m=Lc[c[p+520>>2]&255](d)|0;if((m|0)!=0){P=m;break}Rc[c[p+512>>2]&1023](d);m=c[q>>2]|0;Q=b[m+58>>1]|0;R=m+60|0;S=D;T=c[S+4>>2]|0;U=(c[R>>2]|0)+(Q<<3)|0;c[U>>2]=c[S>>2];c[U+4>>2]=T;T=Q+1|0;U=C;S=c[U+4>>2]|0;V=(c[R>>2]|0)+(T<<3)|0;c[V>>2]=c[U>>2];c[V+4>>2]=S;S=Q+2|0;V=F;U=c[V+4>>2]|0;W=(c[R>>2]|0)+(S<<3)|0;c[W>>2]=c[V>>2];c[W+4>>2]=U;U=Q+3|0;W=N;V=c[W+4>>2]|0;X=(c[R>>2]|0)+(U<<3)|0;c[X>>2]=c[W>>2];c[X+4>>2]=V;V=m+64|0;a[(c[V>>2]|0)+Q>>0]=0;a[(c[V>>2]|0)+T>>0]=0;a[(c[V>>2]|0)+S>>0]=0;a[(c[V>>2]|0)+U>>0]=0;V=Q+4|0;X=c[t>>2]|0;if((X&2|0)==0){bQa(d+124|0,m+56|0,0,0);c3a(c[d+144>>2]|0,c[d+140>>2]|0,(e[d+132>>1]<<3)+32|0)|0;Y=c[t>>2]|0}else{Y=X}X=c[R>>2]|0;m=X+(V<<3)|0;if((Y&1|0)==0){W=c[d+4>>2]|0;Z=c[W+48>>2]|0;_=c[W+52>>2]|0;if((V|0)>0){V=X;do{c[V>>2]=SDa(c[V>>2]|0,Z)|0;W=V+4|0;c[W>>2]=SDa(c[W>>2]|0,_)|0;V=V+8|0}while(V>>>0<m>>>0);$=c[t>>2]|0;aa=c[R>>2]|0}else{$=Y;aa=X}m=aa+(Q<<3)|0;V=c[m+4>>2]|0;_=D;c[_>>2]=c[m>>2];c[_+4>>2]=V;V=(c[R>>2]|0)+(T<<3)|0;_=c[V+4>>2]|0;m=C;c[m>>2]=c[V>>2];c[m+4>>2]=_;_=(c[R>>2]|0)+(S<<3)|0;m=c[_+4>>2]|0;V=F;c[V>>2]=c[_>>2];c[V+4>>2]=m;m=(c[R>>2]|0)+(U<<3)|0;V=c[m+4>>2]|0;_=N;c[_>>2]=c[m>>2];c[_+4>>2]=V;ba=$}else{ba=Y}if(((ba&2|0)==0?(c[(c[d>>2]|0)+8>>2]&8192|0)!=0:0)?(V=d+132|0,b[V>>1]=(e[V>>1]|0)+4,V=cQa(d,0)|0,(V|0)!=0):0){G=V;break a}iEa(r);G=0;break a}if(L<<16>>16==-1){V=r+22|0;_=b[V>>1]|0;m=b[r+20>>1]|0;Z=Lc[c[p+524>>2]&255](d)|0;if((Z|0)==0){W=d+168|0;ca=c[W>>2]|0;Rc[c[p+512>>2]&1023](d);da=c[t>>2]|0;if((da&1|0)==0){c[D>>2]=SDa(c[D>>2]|0,v)|0;c[C>>2]=SDa(c[C>>2]|0,v)|0;c[M>>2]=SDa(c[M>>2]|0,w)|0;c[O>>2]=SDa(c[O>>2]|0,w)|0}if((da&1024|0)!=0){iEa(r);c[(c[d+8>>2]|0)+72>>2]=1668246896;G=0;break a}da=c[r+84>>2]|0;ea=c[r+48>>2]|0;fa=d+24|0;ga=c[fa>>2]|0;ha=c[n>>2]|0;iEa(r);if((da|0)==0){ia=_;ja=0}else{ka=r+52|0;la=g+1|0;ma=d+4|0;na=0;do{oa=na+ea|0;pa=D;qa=c[pa>>2]|0;ra=c[pa+4>>2]|0;pa=C;sa=c[pa>>2]|0;ta=c[pa+4>>2]|0;pa=F;ua=c[pa>>2]|0;va=c[pa+4>>2]|0;pa=N;wa=c[pa>>2]|0;xa=c[pa+4>>2]|0;pa=b[V>>1]|0;ya=pa<<16>>16;za=_Pa(d,c[(c[ka>>2]|0)+(oa<<5)>>2]|0,la)|0;if((za|0)!=0){G=za;break a}Aa=c[ka>>2]|0;za=Aa+(oa<<5)+4|0;if((b[za>>1]&512)==0){Ba=D;c[Ba>>2]=qa;c[Ba+4>>2]=ra;ra=C;c[ra>>2]=sa;c[ra+4>>2]=ta;ta=F;c[ta>>2]=ua;c[ta+4>>2]=va;va=N;c[va>>2]=wa;c[va+4>>2]=xa}Ca=b[V>>1]|0;b:do{if(!(Ca<<16>>16==pa<<16>>16)){xa=c[q>>2]|0;va=xa+24|0;wa=c[va>>2]|0;ta=b[xa+22>>1]|0;xa=ta<<16>>16;ua=b[za>>1]|0;ra=(ua&200)==0;if((ta&65535)>(pa&65535)&(ra^1)){ta=Aa+(oa<<5)+16|0;sa=ya;do{yEa(wa+(sa<<3)|0,ta);sa=sa+1|0}while((sa|0)!=(xa|0));Da=b[za>>1]|0}else{Da=ua}sa=c[Aa+(oa<<5)+8>>2]|0;ta=c[Aa+(oa<<5)+12>>2]|0;do{if((Da&2)==0){Ba=sa+_|0;qa=ta+ya|0;if(!(Ba>>>0<ya>>>0&qa>>>0<xa>>>0)){break b}Ea=c[va>>2]|0;Fa=(c[Ea+(Ba<<3)>>2]|0)-(c[Ea+(qa<<3)>>2]|0)|0;Ga=(c[Ea+(Ba<<3)+4>>2]|0)-(c[Ea+(qa<<3)+4>>2]|0)|0}else{if((ta|sa|0)==0){break b}do{if(ra){Ha=sa;Ia=ta}else{if((Da&2048)==0){Ha=sa;Ia=ta;break}qa=MDa(c[Aa+(oa<<5)+16>>2]|0,c[Aa+(oa<<5)+20>>2]|0)|0;Ea=MDa(c[Aa+(oa<<5)+28>>2]|0,c[Aa+(oa<<5)+24>>2]|0)|0;Ba=SDa(sa,qa)|0;Ha=Ba;Ia=SDa(ta,Ea)|0}}while(0);if((c[t>>2]&1|0)!=0){Fa=Ha;Ga=Ia;break}Ea=c[ma>>2]|0;Ba=c[Ea+52>>2]|0;qa=SDa(Ha,c[Ea+48>>2]|0)|0;Ea=SDa(Ia,Ba)|0;if((b[za>>1]&4)==0){Fa=qa;Ga=Ea;break}Fa=qa+32&-64;Ga=Ea+32&-64}}while(0);if((Fa|Ga|0)==0){break}dQa(xa-ya|0,wa+(ya<<3)|0,Fa,Ga)}}while(0);na=na+1|0}while(na>>>0<da>>>0);ia=Ca<<16>>16;ja=Aa+(oa<<5)|0}c[fa>>2]=ga;c[n>>2]=ha;c[W>>2]=ca;if((c[t>>2]&2|0)!=0){G=0;break a}if(!(ia>>>0>_>>>0?(b[ja+4>>1]&256)!=0:0)){G=0;break a}da=c[q>>2]|0;na=da+22|0;ma=b[na>>1]|0;V=ma<<16>>16;ka=V+4|0;do{if((ka|0)==0){J=69}else{if(!((ka+V+(b[da+58>>1]|0)|0)>>>0>(c[da+4>>2]|0)>>>0)){J=69;break}la=fEa(da,ka,0)|0;c[j>>2]=la;if((la|0)!=0){G=0;break a}Ja=b[na>>1]|0}}while(0);if((J|0)==69){c[j>>2]=0;Ja=ma}ka=da+24|0;V=D;ca=c[V+4>>2]|0;ha=(c[ka>>2]|0)+(Ja<<16>>16<<3)|0;c[ha>>2]=c[V>>2];c[ha+4>>2]=ca;ca=C;ha=c[ca+4>>2]|0;V=(c[ka>>2]|0)+((b[na>>1]|0)+1<<3)|0;c[V>>2]=c[ca>>2];c[V+4>>2]=ha;ha=F;V=c[ha+4>>2]|0;ca=(c[ka>>2]|0)+((b[na>>1]|0)+2<<3)|0;c[ca>>2]=c[ha>>2];c[ca+4>>2]=V;V=N;ca=c[V+4>>2]|0;ha=(c[ka>>2]|0)+((b[na>>1]|0)+3<<3)|0;c[ha>>2]=c[V>>2];c[ha+4>>2]=ca;ca=da+28|0;a[(c[ca>>2]|0)+(b[na>>1]|0)>>0]=0;a[(c[ca>>2]|0)+((b[na>>1]|0)+1)>>0]=0;a[(c[ca>>2]|0)+((b[na>>1]|0)+2)>>0]=0;a[(c[ca>>2]|0)+((b[na>>1]|0)+3)>>0]=0;ca=c[fa>>2]|0;ha=uFa(ca,c[W>>2]|0)|0;c[j>>2]=ha;if((ha|0)!=0){G=0;break a}ha=xFa(ca,j)|0;if((c[j>>2]|0)!=0){G=0;break a}V=ha&65535;if((ha&65535)>(e[(c[d>>2]|0)+286>>1]|0)){if((V|0)>(c[n>>2]|0)){G=0;break a}ka=d+160|0;ga=c[ka>>2]|0;c[k>>2]=c[ga+388>>2];la=aQa(c[ga+8>>2]|0,k,1,ga+392|0,V)|0;c[j>>2]=la;c[(c[ka>>2]|0)+388>>2]=c[k>>2]&65535;if((la|0)==0){Ka=ka}else{G=0;break a}}else{if(ha<<16>>16==0){G=0;break a}Ka=d+160|0}ha=vFa(ca,c[(c[Ka>>2]|0)+392>>2]|0,V)|0;c[j>>2]=ha;if((ha|0)!=0){G=0;break a}ha=d+8|0;c[(c[ha>>2]|0)+136>>2]=c[(c[Ka>>2]|0)+392>>2];c[(c[ha>>2]|0)+140>>2]=V;bQa(d+124|0,(c[q>>2]|0)+20|0,_,m);V=d+132|0;ha=e[V>>1]|0;if(ha>>>0>_>>>0){ca=d+148|0;ka=_;do{la=(c[ca>>2]|0)+ka|0;a[la>>0]=a[la>>0]&231;ka=ka+1|0;la=e[V>>1]|0}while(ka>>>0<la>>>0);La=la}else{La=ha}b[V>>1]=La+4;cQa(d,1)|0;G=0;break a}else{P=Z}}else{P=20}}else{J=20}}while(0);if((J|0)==20){A=d+36|0;c[A+0>>2]=0;c[A+4>>2]=0;c[A+8>>2]=0;c[A+12>>2]=0;A=c[u>>2]|0;B=d+68|0;c[B>>2]=0-A;c[d+72>>2]=0;ka=d+76|0;c[ka>>2]=(c[l>>2]|0)-A;c[d+80>>2]=0;c[d+184>>2]=0;A=c[y>>2]|0;ca=d+188|0;c[ca>>2]=A;c[d+192>>2]=0;_=d+196|0;c[_>>2]=A-(c[z>>2]|0);$Pa(d,f);if((c[t>>2]&1|0)==0){c[B>>2]=SDa(c[B>>2]|0,v)|0;c[ka>>2]=SDa(c[ka>>2]|0,v)|0;c[ca>>2]=SDa(c[ca>>2]|0,w)|0;c[_>>2]=SDa(c[_>>2]|0,w)|0;P=0}else{P=0}}if(I<<24>>24==0){G=P}else{K=P;J=85}}}while(0);if((J|0)==85){Rc[c[p+512>>2]&1023](d);G=K}if(E<<24>>24==0){s=G;i=h;return s|0}E=c[(c[x>>2]|0)+48>>2]|0;Ic[c[(c[E>>2]|0)+4>>2]&511](c[E+4>>2]|0,o);s=G;i=h;return s|0}function $Pa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+16|0;f=e;g=(c[b>>2]|0)+128|0;h=c[(c[g>>2]|0)+48>>2]|0;if((h|0)==0){i=e;return}if((c[(c[h>>2]|0)+8>>2]|0)==0){i=e;return}h=b+52|0;c[f>>2]=c[h>>2];c[f+4>>2]=0;j=b+56|0;k=f+8|0;c[k>>2]=c[j>>2];c[f+12>>2]=0;l=c[(c[g>>2]|0)+48>>2]|0;if((id[c[(c[l>>2]|0)+8>>2]&511](c[l+4>>2]|0,d,0,f)|0)!=0){i=e;return}d=c[k>>2]|0;c[h>>2]=c[f>>2]<<16>>16;f=d&65535;c[j>>2]=f;c[b+176>>2]=0;c[b+180>>2]=0;j=b+64|0;if((a[j>>0]|0)!=0){i=e;return}a[j>>0]=1;c[b+60>>2]=f;i=e;return}function aQa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0;g=i;i=i+16|0;h=g;j=c[b>>2]|0;if(!(j>>>0<f>>>0)){k=0;i=g;return k|0}l=ca(j,d)|0;j=ca(f,d)|0;c[e>>2]=dEa(a,1,l,j,c[e>>2]|0,h)|0;e=c[h>>2]|0;if((e|0)!=0){k=e;i=g;return k|0}c[b>>2]=f;k=0;i=g;return k|0}function bQa(a,d,f,g){a=a|0;d=d|0;f=f|0;g=g|0;b[a+8>>1]=(e[d+2>>1]|0)-f;b[a+10>>1]=(e[d>>1]|0)-g;c[a+12>>2]=(c[d+20>>2]|0)+(f<<3);c[a+16>>2]=(c[d+4>>2]|0)+(f<<3);c[a+20>>2]=(c[d+24>>2]|0)+(f<<3);c[a+24>>2]=(c[d+8>>2]|0)+f;c[a+28>>2]=(c[d+12>>2]|0)+(g<<1);b[a+32>>1]=f;return}function cQa(f,g){f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;h=i;j=f+124|0;k=c[(c[f+8>>2]|0)+140>>2]|0;l=f+132|0;m=e[l>>1]|0;n=f+140|0;o=c[n>>2]|0;p=c[o+(m+ -4<<3)>>2]|0;q=p+32&-64;if((q|0)!=(p|0)){dQa(m,o,q-p|0,0)}p=(k|0)!=0;if(p){c3a(c[f+136>>2]|0,c[n>>2]|0,e[l>>1]<<3|0)|0}q=f+160|0;o=f+4|0;m=(c[q>>2]|0)+284|0;r=(c[o>>2]|0)+172|0;s=m+68|0;do{c[m>>2]=c[r>>2];m=m+4|0;r=r+4|0}while((m|0)<(s|0));if(g<<24>>24==0){c[(c[q>>2]|0)+220>>2]=c[(c[o>>2]|0)+48>>2];c[(c[q>>2]|0)+224>>2]=c[(c[o>>2]|0)+52>>2]}else{c[(c[q>>2]|0)+220>>2]=65536;c[(c[q>>2]|0)+224>>2]=65536;c3a(c[f+144>>2]|0,c[n>>2]|0,e[l>>1]<<3|0)|0}o=(c[n>>2]|0)+((e[l>>1]|0)+ -3<<3)|0;c[o>>2]=(c[o>>2]|0)+32&-64;o=(c[n>>2]|0)+((e[l>>1]|0)+ -1<<3)+4|0;c[o>>2]=(c[o>>2]|0)+32&-64;if(p){p=c[(c[f+12>>2]|0)+64>>2]|0;o=c[q>>2]|0;c[o+460>>2]=c[o+392>>2];c[o+464>>2]=k;a[(c[q>>2]|0)+560>>0]=g;m=(c[q>>2]|0)+144|0;r=j+0|0;s=m+36|0;do{c[m>>2]=c[r>>2];m=m+4|0;r=r+4|0}while((m|0)<(s|0));j=c[q>>2]|0;c[j+356>>2]=c[j+460>>2];c[j+364>>2]=c[j+464>>2];c[j+360>>2]=0;c[j+352>>2]=3;g=j+144|0;m=j+36|0;r=g+0|0;s=m+36|0;do{c[m>>2]=c[r>>2];m=m+4|0;r=r+4|0}while((m|0)<(s|0));m=j+72|0;r=g+0|0;s=m+36|0;do{c[m>>2]=c[r>>2];m=m+4|0;r=r+4|0}while((m|0)<(s|0));m=j+108|0;r=g+0|0;s=m+36|0;do{c[m>>2]=c[r>>2];m=m+4|0;r=r+4|0}while((m|0)<(s|0));b[j+344>>1]=1;b[j+346>>1]=1;b[j+348>>1]=1;r=j+294|0;b[r>>1]=16384;b[j+296>>1]=0;m=j+298|0;s=e[r>>1]|e[r+2>>1]<<16;b[m>>1]=s;b[m+2>>1]=s>>>16;m=j+290|0;b[m>>1]=s;b[m+2>>1]=s>>>16;c[j+312>>2]=1;c[j+304>>2]=1;c[j+16>>2]=0;c[j+428>>2]=0;s=Lc[c[(c[j>>2]|0)+648>>2]&255](j)|0;j=c[q>>2]|0;if((s|0)!=0?(a[j+561>>0]|0)!=0:0){t=s;i=h;return t|0}a[p>>0]=c[j+340>>2]<<5|d[p>>0]|4}if((a[f+65>>0]|0)!=0){t=0;i=h;return t|0}p=e[l>>1]|0;l=c[n>>2]|0;n=l+(p+ -4<<3)|0;j=c[n+4>>2]|0;s=f+68|0;c[s>>2]=c[n>>2];c[s+4>>2]=j;j=l+(p+ -3<<3)|0;s=c[j+4>>2]|0;n=f+76|0;c[n>>2]=c[j>>2];c[n+4>>2]=s;s=l+(p+ -2<<3)|0;n=c[s+4>>2]|0;j=f+184|0;c[j>>2]=c[s>>2];c[j+4>>2]=n;n=l+(p+ -1<<3)|0;p=c[n+4>>2]|0;l=f+192|0;c[l>>2]=c[n>>2];c[l+4>>2]=p;t=0;i=h;return t|0}function dQa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;g=(a|0)==0;if(!((d|0)==0|g)){h=0;do{j=b+(h<<3)|0;c[j>>2]=(c[j>>2]|0)+d;h=h+1|0}while((h|0)!=(a|0))}if((e|0)==0|g){i=f;return}else{k=0}do{g=b+(k<<3)+4|0;c[g>>2]=(c[g>>2]|0)+e;k=k+1|0}while((k|0)!=(a|0));i=f;return}function eQa(d,f,g){d=d|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;h=i;i=i+16|0;j=h;c[d>>2]=f;c[d+4>>2]=g;if((g|0)!=0){c[d+396>>2]=c[g+116>>2];c[d+400>>2]=c[g+120>>2];c[d+408>>2]=c[g+128>>2];c[d+412>>2]=c[g+132>>2];c[d+404>>2]=c[g+124>>2];c[d+416>>2]=c[g+136>>2];k=d+244|0;l=g+72|0;m=k+40|0;do{c[k>>2]=c[l>>2];k=k+4|0;l=l+4|0}while((k|0)<(m|0));n=d+216|0;o=g+44|0;c[n+0>>2]=c[o+0>>2];c[n+4>>2]=c[o+4>>2];c[n+8>>2]=c[o+8>>2];c[n+12>>2]=c[o+12>>2];c[n+16>>2]=c[o+16>>2];c[n+20>>2]=c[o+20>>2];c[n+24>>2]=c[o+24>>2];c[d+420>>2]=c[g+140>>2];c[d+424>>2]=c[g+144>>2];o=g+148|0;n=c[o+4>>2]|0;p=d+444|0;c[p>>2]=c[o>>2];c[p+4>>2]=n;n=g+156|0;p=c[n+4>>2]|0;o=d+452|0;c[o>>2]=c[n>>2];c[o+4>>2]=p;p=g+164|0;o=c[p+4>>2]|0;n=d+460|0;c[n>>2]=c[p>>2];c[n+4>>2]=o;k=d+284|0;l=g+172|0;m=k+68|0;do{c[k>>2]=c[l>>2];k=k+4|0;l=l+4|0}while((k|0)<(m|0));c[d+380>>2]=c[g+240>>2];c[d+384>>2]=c[g+244>>2];b[d+468>>1]=b[g+248>>1]|0;c[d+472>>2]=c[g+252>>2];k=d+180|0;l=g+256|0;m=k+36|0;do{c[k>>2]=c[l>>2];k=k+4|0;l=l+4|0}while((k|0)<(m|0));g=d+36|0;k=g+0|0;m=k+36|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(m|0));k=d+72|0;l=g+0|0;m=k+36|0;do{c[k>>2]=c[l>>2];k=k+4|0;l=l+4|0}while((k|0)<(m|0));k=d+108|0;l=g+0|0;m=k+36|0;do{c[k>>2]=c[l>>2];k=k+4|0;l=l+4|0}while((k|0)<(m|0))}g=d+20|0;c[j>>2]=c[g>>2];o=d+8|0;n=aQa(c[o>>2]|0,j,4,d+24|0,(e[f+284>>1]|0)+32|0)|0;c[g>>2]=c[j>>2];if((n|0)!=0){i=h;return}n=d+388|0;c[j>>2]=c[n>>2];g=aQa(c[o>>2]|0,j,1,d+392|0,e[f+286>>1]|0)|0;c[n>>2]=c[j>>2]&65535;if((g|0)!=0){i=h;return}g=d+144|0;b[d+152>>1]=0;b[d+154>>1]=0;k=d+72|0;l=g+0|0;m=k+36|0;do{c[k>>2]=c[l>>2];k=k+4|0;l=l+4|0}while((k|0)<(m|0));k=d+108|0;l=g+0|0;m=k+36|0;do{c[k>>2]=c[l>>2];k=k+4|0;l=l+4|0}while((k|0)<(m|0));k=d+36|0;l=g+0|0;m=k+36|0;do{c[k>>2]=c[l>>2];k=k+4|0;l=l+4|0}while((k|0)<(m|0));a[d+488>>0]=0;i=h;return}function fQa(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;g=c[d>>2]|0;h=d+292|0;if((a[h>>0]|0)==0){j=(c[g+96>>2]|0)+28|0}else{j=d+296|0}k=c[j>>2]|0;if((k|0)==0){i=f;return}eQa(k,g,d);c[k+428>>2]=0;c[k+16>>2]=0;a[k+488>>0]=0;a[k+561>>0]=e;e=c[g+636>>2]|0;j=g+632|0;l=c[j>>2]|0;c[k+452>>2]=e;c[k+456>>2]=l;c[k+460>>2]=0;c[k+464>>2]=0;if((c[j>>2]|0)!=0?(c[k+356>>2]=e,c[k+364>>2]=l,c[k+360>>2]=0,c[k+352>>2]=2,(a[h>>0]|0)==0):0){Lc[c[g+648>>2]&255](k)|0}g=k+284|0;b[k+290>>1]=16384;b[k+292>>1]=0;b[k+294>>1]=16384;b[k+296>>1]=0;b[k+298>>1]=16384;b[k+300>>1]=0;b[g>>1]=0;b[k+286>>1]=0;b[k+288>>1]=0;b[k+344>>1]=1;b[k+346>>1]=1;b[k+348>>1]=1;c[k+304>>2]=1;h=d+172|0;l=g+0|0;g=h+68|0;do{c[h>>2]=c[l>>2];h=h+4|0;l=l+4|0}while((h|0)<(g|0));gQa(k,d);i=f;return}function gQa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;c[b+116>>2]=c[a+396>>2];c[b+128>>2]=c[a+408>>2];c[b+140>>2]=c[a+420>>2];c[b+144>>2]=c[a+424>>2];d=a+444|0;e=c[d+4>>2]|0;f=b+148|0;c[f>>2]=c[d>>2];c[f+4>>2]=e;e=a+452|0;f=c[e+4>>2]|0;d=b+156|0;c[d>>2]=c[e>>2];c[d+4>>2]=f;f=a+460|0;a=c[f+4>>2]|0;d=b+164|0;c[d>>2]=c[f>>2];c[d+4>>2]=a;return}function hQa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;if((R2a(b,1278560)|0)==0){if((c[d>>2]|0)==35){c[a+68>>2]=35;f=0}else{f=7}}else{f=12}i=e;return f|0}function iQa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;if((R2a(b,1278560)|0)!=0){f=12;i=e;return f|0}c[d>>2]=c[a+68>>2];f=0;i=e;return f|0}function jQa(a){a=a|0;return 0}function kQa(a){a=a|0;return}function lQa(a,b){a=a|0;b=b|0;var c=0;a=i;c=jEa(1280736,b)|0;i=a;return c|0}function mQa(e,f,g,h,j){e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0;j=i;i=i+2928|0;h=j+404|0;e=j+400|0;k=j+396|0;l=j+392|0;m=j+16|0;n=j+12|0;o=j;p=f+132|0;c[f>>2]=1;q=f+96|0;r=iFa(c[q>>2]|0,1284e3)|0;c[f+484>>2]=r;s=(c[q>>2]|0)+4|0;q=hFa(c[s>>2]|0,1281024)|0;t=f+488|0;c[t>>2]=q;if((q|0)==0){u=11;i=j;return u|0}c[f+548>>2]=hFa(c[s>>2]|0,1284024)|0;f3a(m|0,0,376)|0;c[f+532>>2]=-1;c[f+536>>2]=-1;s=f+540|0;c[s>>2]=0;c[f+280>>2]=7;c[f+284>>2]=1;c[f+172>>2]=4;c[f+348>>2]=3932;c[f+276>>2]=2596864;v=c[f+104>>2]|0;w=f+100|0;x=c[w>>2]|0;y=q+4|0;pd[c[c[y>>2]>>2]&127](m,0,0,x);z=m+72|0;c[z>>2]=v;A=m+80|0;B=m+76|0;C=m+92|0;D=m+93|0;c[B+0>>2]=0;c[B+4>>2]=0;c[B+8>>2]=0;c[B+12>>2]=0;b[B+16>>1]=0;a[B+18>>0]=0;E=SQa(v,1280704,14)|0;c[h>>2]=E;if((E|0)!=0){if((E&255|0)==2){F=SQa(v,1280720,10)|0;c[h>>2]=F;if((F|0)==0){G=5}else{H=F;G=18}}else{H=E;G=18}}else{G=5}do{if((G|0)==5){E=uFa(v,0)|0;c[h>>2]=E;if((E|0)==0){F=FQa(v,e,k)|0;c[h>>2]=F;if((F|0)==0){if((b[e>>1]|0)==-32767){a[C>>0]=1}else{I=uFa(v,0)|0;c[h>>2]=I;if((I|0)!=0){H=I;G=18;break}c[k>>2]=c[v+4>>2]}if((c[v+20>>2]|0)==0){c[B>>2]=(c[v>>2]|0)+(c[v+8>>2]|0);I=c[k>>2]|0;c[A>>2]=I;a[D>>0]=1;J=wFa(v,I)|0;c[h>>2]=J;if((J|0)!=0){H=J;G=18;break}K=c[A>>2]|0}else{J=c[k>>2]|0;I=ZDa(x,J,h)|0;c[B>>2]=I;L=c[h>>2]|0;if((L|0)!=0){H=L;G=18;break}L=vFa(v,I,J)|0;c[h>>2]=L;if((L|0)!=0){H=L;G=18;break}c[A>>2]=J;K=J}J=c[B>>2]|0;c[m+4>>2]=J;c[m>>2]=J;c[m+8>>2]=J+K;M=0}else{H=F;G=18}}else{H=E;G=18}}}while(0);if((G|0)==18){if((a[D>>0]|0)==0){aEa(x,c[B>>2]|0);c[B>>2]=0;M=H}else{M=H}}c[n>>2]=M;a:do{if((M|0)==0){H=EQa(f,m,c[B>>2]|0,c[A>>2]|0)|0;c[n>>2]=H;if((H|0)==0){x=c[z>>2]|0;K=c[m+16>>2]|0;c[h>>2]=0;b:do{if((a[C>>0]|0)!=0){v=zFa(c[x+8>>2]|0)|0;E=m+88|0;c[E>>2]=0;while(1){F=FQa(x,k,e)|0;if((F|0)!=0){N=F;G=71;break}if(!((b[k>>1]|0)==-32766)){break}F=c[e>>2]|0;c[E>>2]=(c[E>>2]|0)+F;J=wFa(x,F)|0;if((J|0)!=0){N=J;G=71;break}}if((G|0)==71){c[h>>2]=N;O=N;break}c[h>>2]=0;if((c[E>>2]|0)==0){c[h>>2]=3;O=3;break}J=uFa(x,v)|0;c[h>>2]=J;if((J|0)==0){F=m+84|0;c[F>>2]=ZDa(K,c[E>>2]|0,h)|0;L=c[h>>2]|0;if((L|0)==0){c[E>>2]=0;I=FQa(x,k,e)|0;c[h>>2]=I;do{if((I|0)==0&(b[k>>1]|0)==-32766){while(1){P=c[e>>2]|0;Q=vFa(x,(c[F>>2]|0)+(c[E>>2]|0)|0,P)|0;if((Q|0)!=0){G=70;break}c[E>>2]=(c[E>>2]|0)+P;R=FQa(x,k,e)|0;if(!((R|0)==0&(b[k>>1]|0)==-32766)){G=32;break}}if((G|0)==32){c[h>>2]=R;break}else if((G|0)==70){c[h>>2]=Q;O=Q;break b}}}while(0);c[h>>2]=0;S=E;T=F;G=67}else{O=L}}else{O=J}}else{I=c[B>>2]|0;v=c[A>>2]|0;P=m+8|0;U=m+32|0;V=m+12|0;W=m+28|0;X=I;Y=v;Z=I;_=I+v|0;c:while(1){v=Z;while(1){I=v+1|0;if(((((a[v>>0]|0)==101&(v+9|0)>>>0<_>>>0?(a[I>>0]|0)==101:0)?(a[v+2>>0]|0)==120:0)?(a[v+3>>0]|0)==101:0)?(a[v+4>>0]|0)==99:0){break}if(I>>>0<_>>>0){v=I}else{G=44;break c}}c[m>>2]=X;I=v+10|0;c[P>>2]=I;if(X>>>0<I>>>0){$=X;do{if((a[$>>0]|0)==101?(S2a($,1278696,5)|0)==0:0){break c}Rc[c[U>>2]&1023](m);if((c[V>>2]|0)!=0){break}Rc[c[W>>2]&1023](m);$=c[m>>2]|0}while($>>>0<I>>>0);aa=c[B>>2]|0;ba=c[A>>2]|0}else{aa=X;ba=Y}X=aa;Y=ba;Z=I;_=aa+ba|0}if((G|0)==44){c[h>>2]=3;O=3;break}c[P>>2]=(c[B>>2]|0)+(c[A>>2]|0);Rc[c[U>>2]&1023](m);_=c[m>>2]|0;Z=c[P>>2]|0;d:do{if(_>>>0<Z>>>0){Y=_;while(1){X=a[Y>>0]|0;if(!(X<<24>>24==10|X<<24>>24==13|X<<24>>24==9|X<<24>>24==32)){break}X=Y+1|0;if(X>>>0<Z>>>0){Y=X}else{break d}}I=c[B>>2]|0;X=I-Y+(c[A>>2]|0)|0;c[e>>2]=X;if((a[D>>0]|0)==0){a[m+94>>0]=1;c[m+84>>2]=I;c[m+88>>2]=X;c[B>>2]=0;c[A>>2]=0;ca=I}else{I=ZDa(K,X+1|0,h)|0;c[m+84>>2]=I;W=c[h>>2]|0;if((W|0)!=0){O=W;break b}c[m+88>>2]=X;ca=I}I=Y+3|0;if((((I>>>0<Z>>>0?(W=d[Y>>0]|0,(W+ -48|0)>>>0<10|(W+ -97|0)>>>0<6|(W+ -65|0)>>>0<6):0)?(W=d[Y+1>>0]|0,(W+ -48|0)>>>0<10|(W+ -97|0)>>>0<6|(W+ -65|0)>>>0<6):0)?(W=d[Y+2>>0]|0,(W+ -48|0)>>>0<10|(W+ -97|0)>>>0<6|(W+ -65|0)>>>0<6):0)?(W=d[I>>0]|0,(W+ -48|0)>>>0<10|(W+ -97|0)>>>0<6|(W+ -65|0)>>>0<6):0){c[m>>2]=Y;W=m+84|0;I=m+88|0;ed[c[(c[y>>2]|0)+24>>2]&127](m,ca,X,l,0)|0;V=c[l>>2]|0;c[I>>2]=V;a[(c[W>>2]|0)+V>>0]=0;S=I;T=W;G=67;break b}d3a(ca|0,Y|0,X|0)|0;S=m+88|0;T=m+84|0;G=67;break b}}while(0);c[h>>2]=3;O=3}}while(0);do{if((G|0)==67){ld[c[q+16>>2]&255](c[T>>2]|0,c[S>>2]|0,-9871);if((c[S>>2]|0)>>>0<4){c[h>>2]=3;O=3;break}else{a[c[T>>2]>>0]=32;a[(c[T>>2]|0)+1>>0]=32;a[(c[T>>2]|0)+2>>0]=32;a[(c[T>>2]|0)+3>>0]=32;K=c[T>>2]|0;c[m+4>>2]=K;c[m>>2]=K;c[m+8>>2]=K+(c[S>>2]|0);O=0;break}}}while(0);c[n>>2]=O;if((O|0)==0){K=EQa(f,m,c[m+84>>2]|0,c[m+88>>2]|0)|0;c[n>>2]=K;if((K|0)==0){x=f+176|0;a[x>>0]=a[x>>0]&254;x=f+528|0;Z=c[x>>2]|0;do{if((Z|0)!=0){_=Z+416|0;P=c[_>>2]|0;if((P|0)!=0){if((P|0)==(c[Z+4>>2]|0)){da=Z}else{c[_>>2]=0;da=c[x>>2]|0}if((da|0)==0){G=91;break}else{ea=da}}else{ea=Z}if((c[ea>>2]|0)!=0?(c[ea+4>>2]|0)!=0:0){fa=ea}else{DQa(f);fa=c[x>>2]|0}if((fa|0)!=0){_=c[fa+4>>2]|0;if((_|0)!=0){P=0;while(1){if((a[fa+(P*12|0)+88>>0]|0)==0){G=86;break}P=P+1|0;if(!(P>>>0<_>>>0)){ga=fa;break}}if((G|0)==86){DQa(f);ga=c[x>>2]|0}if((ga|0)==0){G=91;break}}_=c[s>>2]|0;if((_|0)!=0?(c[f+544>>2]=dEa(c[w>>2]|0,4,0,_,0,n)|0,_=c[n>>2]|0,(_|0)!=0):0){c[s>>2]=0;ha=_;break a}}else{G=91}}else{G=91}}while(0);if((G|0)==91){c[s>>2]=0}x=f+416|0;c[x>>2]=c[m+152>>2];Z=m+328|0;if((c[Z>>2]|0)!=0){c[Z>>2]=0;c[f+404>>2]=c[m+312>>2];c[f+392>>2]=c[m+316>>2];c[f+408>>2]=c[m+340>>2];c[f+412>>2]=c[m+344>>2]}Z=m+220|0;if((c[(c[f+128>>2]|0)+48>>2]|0)==0?(c[Z>>2]|0)==0:0){c[n>>2]=3;ia=3}else{ia=0}c[Z>>2]=0;c[f+396>>2]=c[m+208>>2];c[f+424>>2]=c[m+232>>2];c[f+428>>2]=c[m+236>>2];Z=m+156|0;c[f+400>>2]=c[Z>>2];_=m+180|0;P=f+420|0;c[P>>2]=c[_>>2];c[Z>>2]=0;c[_>>2]=0;if((c[f+368>>2]|0)==1){_=m+116|0;if((c[_>>2]|0)>0){Z=f+384|0;U=f+388|0;X=m+124|0;W=0;I=0;V=0;while(1){b[(c[Z>>2]|0)+(W<<1)>>1]=0;c[(c[U>>2]|0)+(W<<2)>>2]=1278688;J=c[(c[X>>2]|0)+(W<<2)>>2]|0;e:do{if((J|0)!=0?(L=c[x>>2]|0,(L|0)>0):0){F=c[P>>2]|0;E=0;while(1){ja=c[F+(E<<2)>>2]|0;$=E+1|0;if((R2a(J,ja)|0)==0){break}if(($|0)<(L|0)){E=$}else{ka=I;la=V;break e}}b[(c[Z>>2]|0)+(W<<1)>>1]=E;c[(c[U>>2]|0)+(W<<2)>>2]=ja;if((R2a(1278688,ja)|0)!=0){ka=(W|0)<(I|0)?I:W+1|0;la=(W|0)<(V|0)?W:V}else{ka=I;la=V}}else{ka=I;la=V}}while(0);W=W+1|0;if((W|0)>=(c[_>>2]|0)){ma=ka;na=la;break}else{I=ka;V=la}}}else{ma=0;na=0}c[f+376>>2]=na;c[f+380>>2]=ma;c[f+372>>2]=c[m+96>>2];ha=ia}else{ha=ia}}else{ha=K}}else{ha=O}}else{ha=H}}else{ha=M}}while(0);M=c[m+148>>2]|0;if((M|0)!=0){Rc[M&1023](m+100|0)}M=c[m+256>>2]|0;if((M|0)!=0){Rc[M&1023](m+208|0)}M=c[m+204>>2]|0;if((M|0)!=0){Rc[M&1023](m+156|0)}M=c[m+308>>2]|0;if((M|0)!=0){Rc[M&1023](m+260|0)}M=c[m+364>>2]|0;if((M|0)!=0){Rc[M&1023](m+316|0)}M=c[m+16>>2]|0;O=m+84|0;aEa(M,c[O>>2]|0);c[O>>2]=0;if((a[D>>0]|0)==0){aEa(M,c[B>>2]|0);c[B>>2]=0}Rc[c[m+24>>2]&1023](m);if((ha|0)!=0|(g|0)<0){u=ha;i=j;return u|0}if((g|0)>0){u=6;i=j;return u|0}g=f+416|0;c[f+16>>2]=c[g>>2];c[f+4>>2]=0;ha=f+8|0;m=(a[f+156>>0]|0)==0?2577:2581;c[ha>>2]=m;B=c[f+528>>2]|0;if((B|0)!=0){c[ha>>2]=m|256}m=c[f+144>>2]|0;ha=f+20|0;c[ha>>2]=m;M=f+24|0;c[M>>2]=0;f:do{if((m|0)==0){D=c[f+364>>2]|0;if((D|0)==0){G=139}else{c[ha>>2]=D;G=139}}else{D=c[f+140>>2]|0;if((D|0)==0){G=139}else{O=a[D>>0]|0;g:do{if(!(O<<24>>24==0)){ia=O;ma=m;na=D;while(1){la=a[ma>>0]|0;ka=ia;oa=na;while(1){if(ka<<24>>24==la<<24>>24){G=130;break}if(!(ka<<24>>24==45|ka<<24>>24==32)){G=134;break}ja=oa+1|0;n=a[ja>>0]|0;if(n<<24>>24==0){break g}else{ka=n;oa=ja}}if((G|0)==130){G=0;E=oa+1|0;pa=a[E>>0]|0;qa=E}else if((G|0)==134){G=0;if(la<<24>>24==45|la<<24>>24==32){pa=ka;qa=oa}else if(la<<24>>24==0){break}else{G=139;break f}}if(pa<<24>>24==0){break g}else{ia=pa;ma=ma+1|0;na=qa}}c[M>>2]=oa;if((oa|0)==0){G=139;break f}else{break f}}}while(0);c[M>>2]=1284040}}}while(0);do{if((G|0)==139){oa=c[f+148>>2]|0;if((oa|0)==0){c[M>>2]=1284040;break}else{c[M>>2]=oa;break}}}while(0);M=f+12|0;G=(c[f+152>>2]|0)!=0&1;c[M>>2]=G;oa=c[f+148>>2]|0;do{if((oa|0)!=0){if((R2a(oa,1284048)|0)!=0?(R2a(oa,1284056)|0)!=0:0){break}c[M>>2]=G|2}}while(0);c[f+28>>2]=0;c[f+32>>2]=0;G=f+460|0;c[f+52>>2]=c[G>>2]>>16;M=c[G+4>>2]>>16;c[f+56>>2]=M;oa=(c[G+8>>2]|0)+65535>>16;c[f+60>>2]=oa;qa=(c[G+12>>2]|0)+65535>>16;c[f+64>>2]=qa;G=f+68|0;pa=b[G>>1]|0;if(pa<<16>>16==0){b[G>>1]=1e3;ra=1e3}else{ra=pa}b[f+70>>1]=qa;b[f+72>>1]=M;pa=(((ra&65535)*12|0)>>>0)/10|0;ra=f+74|0;G=qa-M|0;b[ra>>1]=(pa<<16>>16|0)<(G|0)?G:pa;pa=f+76|0;b[pa>>1]=oa;oa=(c[t>>2]|0)+12|0;if((Hc[c[c[oa>>2]>>2]&7](h,f,0,0,c[f+420>>2]|0,B,0,0,292)|0)==0){a[h+70>>0]=1;a[h+68>>0]=0;c[h+2388>>2]=c[f+404>>2];c[h+2392>>2]=c[f+408>>2];c[h+2396>>2]=c[f+412>>2];c[h+2512>>2]=c[f+544>>2];c[h+2516>>2]=c[s>>2];if((c[g>>2]|0)>0){s=h+40|0;B=0;t=0;while(1){AQa(h,t)|0;G=c[s>>2]|0;M=(t|0)==0|(G|0)>(B|0)?G:B;t=t+1|0;if((t|0)>=(c[g>>2]|0)){sa=M;break}else{B=M}}}else{sa=0}Rc[c[(c[oa>>2]|0)+4>>2]&1023](h);b[pa>>1]=(KDa(sa)|0)>>>16}b[f+78>>1]=b[ra>>1]|0;b[f+80>>1]=b[p+26>>1]|0;b[f+82>>1]=b[f+160>>1]|0;if((r|0)==0){u=0;i=j;return u|0}r=c[q+20>>2]|0;c[o>>2]=f;q=o+8|0;b[q>>1]=3;p=o+10|0;b[p>>1]=1;ra=o+4|0;c[ra>>2]=1970170211;sa=r+12|0;pa=YEa(c[sa>>2]|0,0,o,0)|0;if(!((pa|0)==0|(pa&255|0)==163)){u=pa;i=j;return u|0}b[q>>1]=7;q=c[f+368>>2]|0;if((q|0)==2){c[ra>>2]=1094995778;b[p>>1]=0;ta=r}else if((q|0)==4){c[ra>>2]=1094992453;b[p>>1]=1;ta=r+4|0}else if((q|0)==1){c[ra>>2]=1094992451;b[p>>1]=2;ta=r+8|0}else if((q|0)==3){c[ra>>2]=1818326065;b[p>>1]=3;ta=sa}else{u=0;i=j;return u|0}sa=c[ta>>2]|0;if((sa|0)==0){u=0;i=j;return u|0}u=YEa(sa,0,o,0)|0;i=j;return u|0}function nQa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;if((a|0)==0){i=b;return}d=c[a+100>>2]|0;e=a+132|0;f=a+544|0;g=c[f>>2]|0;if((g|0)!=0){aEa(d,g);c[f>>2]=0;c[a+540>>2]=0}DQa(a);c[a+528>>2]=0;aEa(d,c[e>>2]|0);c[e>>2]=0;e=a+136|0;aEa(d,c[e>>2]|0);c[e>>2]=0;e=a+140|0;aEa(d,c[e>>2]|0);c[e>>2]=0;e=a+144|0;aEa(d,c[e>>2]|0);c[e>>2]=0;e=a+148|0;aEa(d,c[e>>2]|0);c[e>>2]=0;e=a+428|0;aEa(d,c[e>>2]|0);c[e>>2]=0;e=a+424|0;aEa(d,c[e>>2]|0);c[e>>2]=0;e=a+420|0;aEa(d,c[e>>2]|0);c[e>>2]=0;e=a+408|0;aEa(d,c[e>>2]|0);c[e>>2]=0;e=a+412|0;aEa(d,c[e>>2]|0);c[e>>2]=0;e=a+392|0;aEa(d,c[e>>2]|0);c[e>>2]=0;e=a+396|0;aEa(d,c[e>>2]|0);c[e>>2]=0;e=a+400|0;aEa(d,c[e>>2]|0);c[e>>2]=0;e=a+372|0;f=e+12|0;aEa(d,c[f>>2]|0);c[f>>2]=0;f=e+16|0;aEa(d,c[f>>2]|0);c[f>>2]=0;f=a+364|0;aEa(d,c[f>>2]|0);c[f>>2]=0;f=c[a+492>>2]|0;if((f|0)!=0){yQa(d,f)}c[a+20>>2]=0;c[a+24>>2]=0;i=b;return}function oQa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+16|0;d=b;e=c[a>>2]|0;f=CQa(c[(c[e+96>>2]|0)+4>>2]|0,c[e+548>>2]|0)|0;if((f|0)==0){g=0;i=b;return g|0}e=c[a>>2]|0;h=Qc[c[f>>2]&255](c[e+100>>2]|0,e+168|0,d)|0;if((h|0)!=0){g=h;i=b;return g|0}c[a+40>>2]=c[d>>2];g=0;i=b;return g|0}function pQa(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+40|0;if((c[d>>2]|0)==0){i=b;return}e=c[a>>2]|0;a=CQa(c[(c[e+96>>2]|0)+4>>2]|0,c[e+548>>2]|0)|0;if((a|0)!=0){Rc[c[a+8>>2]&1023](c[d>>2]|0)}c[d>>2]=0;i=b;return}function qQa(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a+4>>2]|0;e=c[d+548>>2]|0;if((e|0)==0){i=b;return 0}f=gFa(c[(c[d+96>>2]|0)+4>>2]|0,1284024)|0;if((f|0)==0){i=b;return 0}d=Lc[c[e+4>>2]&255](f)|0;c[(c[a+156>>2]|0)+36>>2]=d;i=b;return 0}function rQa(a){a=a|0;c[(c[a+156>>2]|0)+36>>2]=0;return}function sQa(d,f,g,h){d=d|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;j=i;i=i+2576|0;k=j+48|0;l=j+32|0;m=j+24|0;n=j+8|0;o=j;p=c[d+4>>2]|0;q=c[(c[p+488>>2]|0)+12>>2]|0;if(!((c[p+16>>2]|0)>>>0>g>>>0)?(c[(c[p+128>>2]|0)+48>>2]|0)==0:0){r=6;i=j;return r|0}s=(h&1024|0)==0?h:h|3;h=(f|0)!=0;if(h){c[d+172>>2]=c[f+16>>2];c[d+176>>2]=c[f+20>>2]}else{c[d+172>>2]=65536;c[d+176>>2]=65536}t=d+108|0;b[d+110>>1]=0;b[t>>1]=0;u=(s&1|0)==0;if(u){v=(s>>>1&1^1)&255}else{v=0}w=d+72|0;c[w>>2]=1869968492;x=Hc[c[q>>2]&7](k,p,f,d,c[p+420>>2]|0,c[p+528>>2]|0,v,s>>>16&15,292)|0;if((x|0)!=0){r=x;i=j;return r|0}x=s&1024;a[k+69>>0]=x>>>10;c[k+2388>>2]=c[p+404>>2];c[k+2392>>2]=c[p+408>>2];c[k+2396>>2]=c[p+412>>2];c[k+2512>>2]=c[p+544>>2];c[k+2516>>2]=c[p+540>>2];y=BQa(k,g,m)|0;if((y|0)!=0){Rc[c[q+4>>2]&1023](k);r=y;i=j;return r|0}y=(x|0)==0;x=k+2400|0;c[l+0>>2]=c[x+0>>2];c[l+4>>2]=c[x+4>>2];c[l+8>>2]=c[x+8>>2];c[l+12>>2]=c[x+12>>2];x=c[k+2416>>2]|0;g=c[k+2420>>2]|0;Rc[c[q+4>>2]&1023](k);q=d+124|0;c[q>>2]=c[q>>2]&1|4;if(y){y=d+24|0;z=(KDa(c[k+40>>2]|0)|0)>>16;A=d+40|0;c[A>>2]=z;c[d+56>>2]=z;a[(c[d+156>>2]|0)+8>>0]=0;z=(s&16|0)!=0;if(z){s=p+460|0;B=(c[s+12>>2]|0)-(c[s+4>>2]|0)>>16;c[d+52>>2]=B;c[d+60>>2]=B}else{B=(KDa(c[k+44>>2]|0)|0)>>16;c[d+52>>2]=B;c[d+60>>2]=B}c[w>>2]=1869968492;if(h?(e[f+14>>1]|0)<24:0){c[q>>2]=c[q>>2]|256}if(!((((c[l>>2]|0)==65536?(c[l+12>>2]|0)==65536:0)?(c[l+4>>2]|0)==0:0)?(c[l+8>>2]|0)==0:0)){wEa(t,l)}if((g|x|0)!=0){xEa(t,x,g)}c[o>>2]=c[A>>2];q=o+4|0;c[q>>2]=0;yEa(o,l);c[A>>2]=(c[o>>2]|0)+x;c[o>>2]=0;f=d+52|0;c[q>>2]=c[f>>2];yEa(o,l);o=(c[q>>2]|0)+g|0;c[f>>2]=o;if(u){u=c[k+16>>2]|0;q=c[u+4>>2]|0;h=c[d+172>>2]|0;w=c[d+176>>2]|0;if(!(v<<24>>24==0)?(c[k+72>>2]|0)!=0:0){C=o}else{v=b[u+2>>1]|0;if(v<<16>>16>0){u=v<<16>>16;v=q;while(1){c[v>>2]=SDa(c[v>>2]|0,h)|0;q=v+4|0;c[q>>2]=SDa(c[q>>2]|0,w)|0;u=u+ -1|0;if((u|0)<=0){break}else{v=v+8|0}}C=c[f>>2]|0}else{C=o}}c[A>>2]=SDa(c[A>>2]|0,h)|0;c[f>>2]=SDa(C,w)|0}qFa(t,n);t=c[n>>2]|0;c[y>>2]=(c[n+8>>2]|0)-t;w=c[n+12>>2]|0;c[d+28>>2]=w-(c[n+4>>2]|0);c[d+32>>2]=t;c[d+36>>2]=w;if(z){MEa(y,c[f>>2]|0)}}else{f=c[d+156>>2]|0;c[d+32>>2]=(KDa(c[k+32>>2]|0)|0)>>16;c[d+40>>2]=(KDa(c[k+40>>2]|0)|0)>>16;k=f+12|0;c[k+0>>2]=c[l+0>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];c[k+12>>2]=c[l+12>>2];c[f+28>>2]=x;c[f+32>>2]=g;a[f+8>>0]=1}f=d+136|0;c[f>>2]=c[m>>2];g=d+140|0;c[g>>2]=c[m+4>>2];d=c[(c[p+128>>2]|0)+48>>2]|0;if((d|0)==0){r=0;i=j;return r|0}Ic[c[(c[d>>2]|0)+4>>2]&511](c[d+4>>2]|0,m);c[f>>2]=0;c[g>>2]=0;r=0;i=j;return r|0}function tQa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;c[e>>2]=0;g=e+4|0;c[g>>2]=0;h=c[a+492>>2]|0;if((h|0)==0){i=f;return 0}a=b<<16|d;d=c[h+36>>2]|0;b=(c[h+40>>2]|0)+ -1|0;a:do{if((b|0)>=0){h=d+(b<<4)|0;j=d;b:while(1){k=h;l=j;while(1){m=(k-l>>4|0)/2|0;n=c[l+(m<<4)>>2]<<16|c[l+(m<<4)+4>>2];if((n|0)==(a|0)){break b}if(!(n>>>0<a>>>0)){break}n=l+(m+1<<4)|0;if(n>>>0>h>>>0){break a}else{l=n}}k=m+ -1|0;if((k|0)<0){break a}else{h=l+(k<<4)|0;j=l}}c[e>>2]=c[l+(m<<4)+8>>2];c[g>>2]=c[l+(m<<4)+12>>2];i=f;return 0}}while(0);c[e>>2]=0;c[g>>2]=0;i=f;return 0}function uQa(a,e){a=a|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;f=i;i=i+32|0;g=f+24|0;h=f+4|0;j=f;k=e+28|0;l=c[k>>2]|0;c[j>>2]=2;m=a+132|0;n=ZDa(l,44,j)|0;o=c[j>>2]|0;if((o|0)==0){p=e+4|0;q=CFa(e,c[p>>2]|0)|0;c[j>>2]=q;if((q|0)==0){r=n+4|0;s=a+460|0;c[r+0>>2]=c[s+0>>2];c[r+4>>2]=c[s+4>>2];c[r+8>>2]=c[s+8>>2];c[r+12>>2]=c[s+12>>2];t=n+20|0;c[t>>2]=c[s+12>>2];u=n+24|0;c[u>>2]=c[s+4>>2];v=(c[a+488>>2]|0)+24|0;w=c[v>>2]|0;if((w|0)!=0){x=id[c[w>>2]&511](h,c[k>>2]|0,c[e+32>>2]|0,c[e+36>>2]|0)|0;c[j>>2]=x;if((x|0)==0){c[h+8>>2]=n;c[h+12>>2]=238;c[h+16>>2]=m;m=Lc[c[(c[v>>2]|0)+8>>2]&255](h)|0;c[j>>2]=m;Rc[c[(c[v>>2]|0)+4>>2]&1023](h);y=m}else{y=x}if((((y&255|0)==2?(x=c[e+32>>2]|0,m=c[p>>2]|0,m>>>0>6):0)?(d[x+1>>0]|0)<4:0)?(d[x+4>>0]<<16|d[x+5>>0]<<24|d[x+3>>0]<<8|d[x+2>>0]|0)==(m|0):0){c[g>>2]=0;m=c[k>>2]|0;k=c[e+36>>2]|0;a:do{if(!((x+101|0)>>>0>k>>>0)){p=d[x+100>>0]<<8|d[x+99>>0];if((!((x+(p+135)|0)>>>0>k>>>0)?!((d[x+(p+118)>>0]<<8|d[x+(p+117)>>0])>>>0<18):0)?(h=d[x+(p+133)>>0]<<16|d[x+(p+134)>>0]<<24|d[x+(p+132)>>0]<<8|d[x+(p+131)>>0],p=x+h|0,(h|0)!=0):0){v=h+2|0;w=x+v|0;if(w>>>0>k>>>0){c[g>>2]=2;z=2;A=34;break}B=d[x+(h+1)>>0]<<8|d[p>>0];p=n+40|0;c[p>>2]=B;if((x+((B<<2)+v)|0)>>>0>k>>>0){c[g>>2]=2;z=2;A=34;break}if((B|0)!=0){h=dEa(m,16,0,B,0,g)|0;B=n+36|0;c[B>>2]=h;C=c[g>>2]|0;if((C|0)==0){D=(c[p>>2]<<2)+v|0;E=x+D|0;F=c[a+92>>2]|0;G=c[a+36>>2]|0;b:do{if((G|0)>0){H=c[a+40>>2]|0;I=0;while(1){J=c[H+(I<<2)>>2]|0;I=I+1|0;if((b[J+8>>1]|0)==7){break}if((I|0)>=(G|0)){break b}}I=VEa(a,J)|0;c[g>>2]=I;if((I|0)!=0){z=I;A=34;break a}}}while(0);if((v|0)<(D|0)){G=h;I=w;while(1){c[G>>2]=AEa(a,d[I>>0]|0)|0;c[G+4>>2]=AEa(a,d[I+1>>0]|0)|0;c[G+8>>2]=(d[I+3>>0]<<8|d[I+2>>0])<<16>>16;c[G+12>>2]=0;I=I+4|0;if(!(I>>>0<E>>>0)){break}else{G=G+16|0}}}if((F|0)==0){K=c[g>>2]|0}else{G=VEa(a,F)|0;c[g>>2]=G;K=G}if((K|0)!=0){z=K;A=34;break}N1a(c[B>>2]|0,c[p>>2]|0,16,293);L=0}else{z=C;A=34}}else{L=0}}else{L=0}}else{c[g>>2]=2;z=2;A=34}}while(0);if((A|0)==34){g=n+36|0;aEa(m,c[g>>2]|0);c[g>>2]=0;c[n+40>>2]=0;L=z}c[j>>2]=L;M=L}else{M=y}if((M|0)==0){N=M;A=37}else{O=M;P=n}}else{N=0;A=37}if((A|0)==37){c[s+0>>2]=c[r+0>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[a+52>>2]=c[r>>2]>>16;c[a+56>>2]=c[n+8>>2]>>16;c[a+60>>2]=(c[n+12>>2]|0)+65535>>16;c[a+64>>2]=(c[n+16>>2]|0)+65535>>16;b[a+70>>1]=((c[t>>2]|0)+32768|0)>>>16;b[a+72>>1]=((c[u>>2]|0)+32768|0)>>>16;if((c[n+40>>2]|0)==0){O=N;P=n}else{u=a+8|0;c[u>>2]=c[u>>2]|64;c[a+492>>2]=n;O=N;P=0}}FFa(e);Q=O;R=P}else{Q=q;R=n}}else{Q=o;R=n}if((R|0)==0){i=f;return Q|0}yQa(l,R);i=f;return Q|0}function vQa(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0;h=i;i=i+2528|0;j=h;if((f&16|0)!=0){if((e|0)==0){k=0;i=h;return k|0}f3a(g|0,0,e<<2|0)|0;k=0;i=h;return k|0}f=Hc[c[c[(c[b+488>>2]|0)+12>>2]>>2]&7](j,b,0,0,c[b+420>>2]|0,c[b+528>>2]|0,0,0,292)|0;if((f|0)!=0){k=f;i=h;return k|0}a[j+70>>0]=1;a[j+68>>0]=0;c[j+2388>>2]=c[b+404>>2];c[j+2392>>2]=c[b+408>>2];c[j+2396>>2]=c[b+412>>2];c[j+2512>>2]=c[b+544>>2];c[j+2516>>2]=c[b+540>>2];if((e|0)==0){k=0;i=h;return k|0}b=j+40|0;f=0;do{if((AQa(j,f+d|0)|0)==0){c[g+(f<<2)>>2]=(KDa(c[b>>2]|0)|0)>>16}else{c[g+(f<<2)>>2]=0}f=f+1|0}while((f|0)!=(e|0));k=0;i=h;return k|0}function wQa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[a>>2]|0;f=CQa(c[(c[e+96>>2]|0)+4>>2]|0,c[e+548>>2]|0)|0;PEa(c[a>>2]|0,b);if((f|0)==0){i=d;return 0}ed[c[f+4>>2]&127](c[a+40>>2]|0,c[a+16>>2]|0,c[a+20>>2]|0,0,0)|0;i=d;return 0}function xQa(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;if(d>>>0>65535){g=0;i=f;return g|0}h=c[e+284>>2]|0;if((h|0)<=0){g=0;i=f;return g|0}j=c[e+288>>2]|0;e=0;while(1){k=c[j+(e<<2)>>2]|0;if((((k|0)!=0?(a[k>>0]|0)==(a[b>>0]|0):0)?(Y2a(k|0)|0)==(d|0):0)?(S2a(k,b,d)|0)==0:0){g=e;l=9;break}e=e+1|0;if((e|0)>=(h|0)){g=0;l=9;break}}if((l|0)==9){i=f;return g|0}return 0}function yQa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=b+36|0;aEa(a,c[e>>2]|0);c[e>>2]=0;c[b+40>>2]=0;e=b+28|0;aEa(a,c[e>>2]|0);c[e>>2]=0;c[b+32>>2]=0;aEa(a,b);i=d;return}function zQa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[a>>2]<<16|c[a+4>>2];a=c[b>>2]<<16|c[b+4>>2];if(e>>>0>a>>>0){f=1;i=d;return f|0}f=(e>>>0<a>>>0)<<31>>31;i=d;return f|0}function AQa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;f=BQa(a,b,e)|0;if((f|0)!=0){i=d;return f|0}b=c[(c[(c[a+4>>2]|0)+128>>2]|0)+48>>2]|0;if((b|0)==0){i=d;return f|0}Ic[c[(c[b>>2]|0)+4>>2]&511](c[b+4>>2]|0,e);i=d;return f|0}function BQa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;i=i+16|0;f=e;g=c[a+4>>2]|0;h=c[(c[g+128>>2]|0)+48>>2]|0;j=a+2400|0;k=g+436|0;c[j+0>>2]=c[k+0>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];k=g+452|0;j=c[k+4>>2]|0;l=a+2416|0;c[l>>2]=c[k>>2];c[l+4>>2]=j;j=(h|0)!=0;do{if(j){l=Qc[c[c[h>>2]>>2]&255](c[h+4>>2]|0,b,d)|0;if((l|0)==0){m=c[d>>2]|0;n=c[d+4>>2]|0;break}else{o=l;i=e;return o|0}}else{l=c[(c[g+424>>2]|0)+(b<<2)>>2]|0;c[d>>2]=l;k=c[(c[g+428>>2]|0)+(b<<2)>>2]|0;c[d+4>>2]=k;m=l;n=k}}while(0);d=Qc[c[a+2508>>2]&255](a,m,n)|0;if((d|0)!=0|j^1){o=d;i=e;return o|0}if((c[(c[h>>2]|0)+8>>2]|0)==0){o=0;i=e;return o|0}d=a+32|0;c[f>>2]=(KDa(c[d>>2]|0)|0)>>16;c[f+4>>2]=0;j=a+40|0;n=f+8|0;c[n>>2]=(KDa(c[j>>2]|0)|0)>>16;m=a+44|0;a=f+12|0;c[a>>2]=(KDa(c[m>>2]|0)|0)>>16;g=id[c[(c[h>>2]|0)+8>>2]&511](c[h+4>>2]|0,b,0,f)|0;c[d>>2]=c[f>>2]<<16;c[j>>2]=c[n>>2]<<16;c[m>>2]=c[a>>2]<<16;o=g;i=e;return o|0}function CQa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=gFa(a,1284024)|0;if((e|0)==0|(b|0)==0){f=0;i=d;return f|0}a=c[b>>2]|0;if((a|0)==0){f=0;i=d;return f|0}f=Lc[a&255](e)|0;i=d;return f|0}function DQa(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=c[b+100>>2]|0;f=b+528|0;b=c[f>>2]|0;if((b|0)==0){i=d;return}g=c[b>>2]|0;h=c[b+4>>2]|0;j=b+24|0;aEa(e,c[j>>2]|0);c[j>>2]=0;if(g>>>0>1){f3a(b+28|0,0,(g<<2)+ -4|0)|0}j=b+216|0;aEa(e,c[j>>2]|0);c[j>>2]=0;j=b+148|0;aEa(e,c[j>>2]|0);c[j>>2]=0;j=b+288|0;aEa(e,c[j>>2]|0);c[j>>2]=0;if((g|0)!=0){j=0;do{c[b+(j<<2)+212>>2]=0;c[b+(j<<2)+144>>2]=0;c[b+(j<<2)+284>>2]=0;j=j+1|0}while((j|0)!=(g|0))}g=b+136|0;aEa(e,c[g>>2]|0);c[g>>2]=0;c[b+140>>2]=0;if((h|0)!=0){g=0;do{j=b+(g<<2)+8|0;aEa(e,c[j>>2]|0);c[j>>2]=0;g=g+1|0}while((g|0)!=(h|0));k=0;do{g=b+(k*12|0)+92|0;aEa(e,c[g>>2]|0);c[g>>2]=0;a[b+(k*12|0)+88>>0]=0;k=k+1|0}while((k|0)!=(h|0))}aEa(e,c[f>>2]|0);c[f>>2]=0;i=d;return}function EQa(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;g=i;i=i+32|0;h=g+16|0;j=g+12|0;k=g+8|0;l=g+4|0;m=g;c[d>>2]=e;n=e+f|0;c[d+8>>2]=n;f=d+12|0;c[f>>2]=0;e=d+28|0;Rc[c[e>>2]&1023](d);o=c[d>>2]|0;a:do{if(o>>>0<n>>>0){p=d+372|0;q=d+32|0;r=b+128|0;s=b+528|0;t=b+132|0;u=d+68|0;v=d+64|0;w=b+132|0;x=b+164|0;y=b+168|0;z=b+460|0;A=o;B=0;C=0;b:while(1){D=a[A>>0]|0;c:do{if(D<<24>>24==101){E=A+6|0;if((E|0)!=(n|0)){if(!(E>>>0<n>>>0)){F=20;break}switch(a[A+5>>0]|0){case 37:case 125:case 123:case 93:case 91:case 62:case 60:case 41:case 40:case 47:case 0:case 12:case 9:case 10:case 13:case 32:{break};default:{F=20;break c}}}if((S2a(A,1278696,5)|0)==0){break a}else{F=20}}else if(D<<24>>24==99){E=A+10|0;if((E|0)==(n|0)){F=11}else{if(!(E>>>0<n>>>0)){F=20;break}switch(a[A+9>>0]|0){case 37:case 125:case 123:case 93:case 91:case 62:case 60:case 41:case 40:case 47:case 0:case 12:case 9:case 10:case 13:case 32:{F=11;break};default:{}}}if((F|0)==11?(F=0,(S2a(A,1278704,9)|0)==0):0){break a}if(D<<24>>24==70){F=13}else{F=20}}else if(D<<24>>24==70){F=13}else{F=20}}while(0);d:do{if((F|0)==13){F=0;E=A+14|0;if((E|0)!=(n|0)){if(!(E>>>0<n>>>0)){F=20;break}switch(a[A+13>>0]|0){case 37:case 125:case 123:case 93:case 91:case 62:case 60:case 41:case 40:case 47:case 0:case 12:case 9:case 10:case 13:case 32:{break};default:{F=20;break d}}}if((S2a(A,1278720,13)|0)==0){E=c[p>>2]|0;if((E&1|0)!=0){c[p>>2]=E|2}c[d>>2]=A+13;G=B;H=C}else{F=20}}}while(0);e:do{if((F|0)==20){F=0;if(((D&255)+ -48|0)>>>0<10){Rc[c[q>>2]&1023](d);if((c[f>>2]|0)==0){G=1;H=A;break}else{break a}}E=(A+6|0)>>>0<n>>>0;if(D<<24>>24==82&E?!((a[A+1>>0]|0)!=68|B<<24>>24==0):0){c[d>>2]=C;if((GQa(d,j,k,(c[(c[r>>2]|0)+48>>2]|0)!=0&1)|0)==0){I=3;F=66;break b}else{G=0;H=C;break}}if(D<<24>>24==45&E?!((a[A+1>>0]|0)!=124|B<<24>>24==0):0){c[d>>2]=C;if((GQa(d,l,m,(c[(c[r>>2]|0)+48>>2]|0)!=0&1)|0)==0){I=3;F=66;break b}else{G=0;H=C;break}}if(!(D<<24>>24==47&(A+2|0)>>>0<n>>>0)){Rc[c[q>>2]&1023](d);if((c[f>>2]|0)==0){G=0;H=C;break}else{break a}}E=A+1|0;c[d>>2]=E;Rc[c[q>>2]&1023](d);if((c[f>>2]|0)!=0){break a}J=c[d>>2]|0;K=J-E|0;if((K+ -1|0)>>>0<21&J>>>0<n>>>0){J=a[E>>0]|0;L=1283048;M=1278736;while(1){if((J<<24>>24==(a[L>>0]|0)?(K|0)==(Y2a(L|0)|0):0)?(Q2a(E,L,K)|0)==0:0){break}N=M+36|0;O=c[N>>2]|0;if((O|0)==0){G=0;H=C;break e}else{L=O;M=N}}K=c[p>>2]|0;if(((K&1)+1&c[M+32>>2]|0)!=0){if((K&2|0)!=0?(R2a(L,1280432)|0)!=0:0){G=0;H=C;break}K=c[s>>2]|0;if((K|0)==0){P=0}else{P=(c[K>>2]|0)==0?0:K}E=c[M+8>>2]|0;do{if((E|0)!=11){switch(c[M+4>>2]|0){case 2:{c[h>>2]=x;Q=0;R=h;break};case 7:{c[h>>2]=b;Q=0;R=h;break};case 8:{c[h>>2]=K;Q=0;R=h;break};case 3:{c[h>>2]=w;if((P|0)==0){Q=0;R=h}else{Q=c[P>>2]|0;R=P+144|0}break};case 6:{c[h>>2]=d;Q=0;R=h;break};case 5:{c[h>>2]=z;if((P|0)==0){Q=0;R=h}else{Q=c[P>>2]|0;R=P+284|0}break};case 4:{c[h>>2]=y;if((P|0)==0){Q=0;R=h}else{Q=c[P>>2]|0;R=P+212|0}break};default:{c[h>>2]=t;Q=0;R=h}}if((c[R>>2]|0)==0){c[f>>2]=0;G=0;H=C;break e}if((E+ -9|0)>>>0<2){S=ed[c[u>>2]&127](d,M,R,Q,0)|0;break}else{S=ed[c[v>>2]&127](d,M,R,Q,0)|0;break}}else{Ic[c[M+12>>2]&511](b,d);S=c[f>>2]|0}}while(0);c[f>>2]=S;if((S|0)!=0){if((S&255|0)!=162){I=S;F=66;break b}c[f>>2]=0;G=0;H=C}else{G=0;H=C}}else{G=0;H=C}}else{G=0;H=C}}}while(0);Rc[c[e>>2]&1023](d);A=c[d>>2]|0;if(!(A>>>0<n>>>0)){break a}else{B=G;C=H}}if((F|0)==66){i=g;return I|0}}}while(0);I=c[f>>2]|0;i=g;return I|0}function FQa(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;g=f;b[d>>1]=0;c[e>>2]=0;h=xFa(a,g)|0;j=c[g>>2]|0;if((j|0)!=0){k=j;i=f;return k|0}if((h+32767<<16>>16&65535)<2){j=KFa(a,g)|0;a=c[g>>2]|0;if((a|0)==0){c[e>>2]=j;l=0}else{l=a}}else{l=0}b[d>>1]=h;k=l;i=f;return k|0}function GQa(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0;g=i;h=c[a+8>>2]|0;Rc[c[a+28>>2]&1023](a);j=c[a>>2]|0;if(((j>>>0<h>>>0?((d[j>>0]|0)+ -48|0)>>>0<10:0)?(j=Lc[c[a+36>>2]&255](a)|0,Rc[c[a+32>>2]&1023](a),k=(c[a>>2]|0)+1|0,c[e>>2]=k,(j|0)>-1):0)?(j|0)<(h-k|0):0){c[a>>2]=(c[a>>2]|0)+(j+1);c[b>>2]=j;l=(c[a+12>>2]|0)==0&1;i=g;return l|0}if(!(f<<24>>24==0)){l=0;i=g;return l|0}c[a+12>>2]=3;l=0;i=g;return l|0}function HQa(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=i;i=i+32|0;f=e;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;if((id[c[d+52>>2]&511](d,6,f,3)|0)<0){c[d+12>>2]=3;i=e;return}g=f+12|0;h=c[g>>2]|0;j=(h|0)<0?0-h|0:h;if((j|0)==0){c[d+12>>2]=3;i=e;return}b[a+68>>1]=TDa(1e3,j)|0;if((j|0)==65536){k=c[f>>2]|0;l=c[f+4>>2]|0;m=c[f+8>>2]|0;n=h;o=c[f+16>>2]|0;p=c[f+20>>2]|0}else{d=TDa(c[f>>2]|0,j)|0;c[f>>2]=d;q=f+4|0;r=TDa(c[q>>2]|0,j)|0;c[q>>2]=r;q=f+8|0;s=TDa(c[q>>2]|0,j)|0;c[q>>2]=s;q=f+16|0;t=TDa(c[q>>2]|0,j)|0;c[q>>2]=t;q=f+20|0;f=TDa(c[q>>2]|0,j)|0;c[q>>2]=f;q=h>>31&-131072|65536;c[g>>2]=q;k=d;l=r;m=s;n=q;o=t;p=f}c[a+436>>2]=k;c[a+444>>2]=l;c[a+440>>2]=m;c[a+448>>2]=n;c[a+452>>2]=o>>16;c[a+456>>2]=p>>16;i=e;return}function IQa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;e=i;i=i+16|0;f=e;g=c[d+8>>2]|0;h=c[b+488>>2]|0;j=d+28|0;Rc[c[j>>2]&1023](d);k=c[d>>2]|0;if(!(k>>>0<g>>>0)){c[d+12>>2]=3;i=e;return}l=a[k>>0]|0;m=l<<24>>24==91;if(!(((l&255)+ -48|0)>>>0<10|m)){if((k+17|0)>>>0<g>>>0?(S2a(k,1280640,16)|0)==0:0){c[b+368>>2]=2;i=e;return}if((k+15|0)>>>0<g>>>0?(S2a(k,1280664,14)|0)==0:0){c[b+368>>2]=4;i=e;return}if((k+18|0)>>>0<g>>>0?(S2a(k,1280680,17)|0)==0:0){c[b+368>>2]=3;i=e;return}c[d+12>>2]=162;i=e;return}l=d+100|0;n=c[d+16>>2]|0;if(m){c[d>>2]=k+1;o=256;p=1}else{o=Lc[c[d+36>>2]&255](d)|0;p=0}Rc[c[j>>2]&1023](d);if(!((c[d>>2]|0)>>>0<g>>>0)){i=e;return}c[b+372>>2]=o;c[d+96>>2]=o;c[b+384>>2]=dEa(n,2,0,o,0,f)|0;m=c[f>>2]|0;if((m|0)==0){c[b+388>>2]=dEa(n,4,0,o,0,f)|0;q=c[f>>2]|0;if((q|0)==0){r=Qc[c[c[h>>2]>>2]&255](l,o,n)|0;c[f>>2]=r;if((r|0)==0){if((o|0)>0){f=d+144|0;n=0;do{id[c[f>>2]&511](l,n,1278688,8)|0;n=n+1|0}while((n|0)!=(o|0))}Rc[c[j>>2]&1023](d);n=c[d>>2]|0;a:do{if(n>>>0<g>>>0){f=p<<24>>24==0;h=d+32|0;s=d+12|0;t=p<<24>>24!=0;u=d+144|0;v=d+124|0;w=d+36|0;x=n;y=0;b:while(1){z=a[x>>0]|0;if(z<<24>>24==93){A=22;break}else if(((z<<24>>24==100?(B=x+3|0,B>>>0<g>>>0):0)?(a[x+1>>0]|0)==101:0)?(a[x+2>>0]|0)==102:0){switch(a[B>>0]|0){case 37:case 125:case 123:case 93:case 91:case 62:case 60:case 41:case 40:case 47:case 0:case 12:case 9:case 10:case 13:case 32:{C=B;break a;break};default:{}}}do{if(((z&255)+ -48|0)>>>0>9&f){Rc[c[h>>2]&1023](d);if((c[s>>2]|0)==0){D=x;E=y}else{A=47;break b}}else{if(t){F=x;G=y}else{B=Lc[c[w>>2]&255](d)|0;Rc[c[j>>2]&1023](d);F=c[d>>2]|0;G=B}if((F+2|0)>>>0<g>>>0?(a[F>>0]|0)==47&(y|0)<(o|0):0){B=F+1|0;c[d>>2]=B;Rc[c[h>>2]&1023](d);H=c[d>>2]|0;if(!(H>>>0<g>>>0)){A=47;break b}if((c[s>>2]|0)!=0){A=47;break b}I=H-B|0;H=id[c[u>>2]&511](l,G,B,I+1|0)|0;c[s>>2]=H;if((H|0)!=0){A=47;break b}a[(c[(c[v>>2]|0)+(G<<2)>>2]|0)+I>>0]=0;D=B;E=y+1|0;break}if(t){A=33;break b}else{D=F;E=y}}}while(0);Rc[c[j>>2]&1023](d);z=c[d>>2]|0;if(z>>>0<g>>>0){x=z;y=E}else{C=D;break a}}if((A|0)==22){C=x+1|0;break}else if((A|0)==33){c[s>>2]=2;i=e;return}else if((A|0)==47){i=e;return}}else{C=k}}while(0);c[b+368>>2]=1;c[d>>2]=C;i=e;return}else{J=r}}else{J=q}}else{J=m}c[d+12>>2]=J;i=e;return}function JQa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;e=i;i=i+16|0;f=e+8|0;g=e+4|0;h=e;j=d+316|0;k=c[d+16>>2]|0;l=c[b+488>>2]|0;m=d+28|0;Rc[c[m>>2]&1023](d);n=c[d>>2]|0;o=d+8|0;if(n>>>0<(c[o>>2]|0)>>>0?(a[n>>0]|0)==91:0){Rc[c[d+32>>2]&1023](d);Rc[c[m>>2]&1023](d);n=c[d>>2]|0;if(n>>>0<(c[o>>2]|0)>>>0?(a[n>>0]|0)==93:0){i=e;return}c[d+12>>2]=3;i=e;return}n=d+36|0;p=Lc[c[n>>2]&255](d)|0;q=d+32|0;Rc[c[q>>2]&1023](d);r=d+12|0;if((c[r>>2]|0)!=0){i=e;return}Rc[c[m>>2]&1023](d);s=d+312|0;if((c[s>>2]|0)==0?(t=Qc[c[c[l>>2]>>2]&255](j,p,k)|0,c[f>>2]=t,(t|0)!=0):0){u=t}else{v=9}a:do{if((v|0)==9){t=c[d>>2]|0;b:do{if((t+4|0)>>>0<(c[o>>2]|0)>>>0){w=b+128|0;x=b+172|0;y=l+16|0;z=d+360|0;A=t;while(1){if((S2a(A,1280624,3)|0)!=0){break b}Rc[c[q>>2]&1023](d);B=Lc[c[n>>2]&255](d)|0;if((GQa(d,g,h,(c[(c[w>>2]|0)+48>>2]|0)!=0&1)|0)==0){v=29;break}Rc[c[q>>2]&1023](d);if((c[r>>2]|0)!=0){v=29;break}Rc[c[m>>2]&1023](d);C=c[d>>2]|0;if((C+4|0)>>>0<(c[o>>2]|0)>>>0?(S2a(C,1280632,3)|0)==0:0){Rc[c[q>>2]&1023](d);Rc[c[m>>2]&1023](d)}if((c[s>>2]|0)==0){C=c[x>>2]|0;if((C|0)>-1){D=c[g>>2]|0;if((D|0)<(C|0)){v=21;break}C=ZDa(k,D,f)|0;E=c[f>>2]|0;if((E|0)!=0){u=E;break a}c3a(C|0,c[h>>2]|0,D|0)|0;ld[c[y>>2]&255](C,D,4330);E=c[x>>2]|0;F=D-E|0;c[g>>2]=F;D=id[c[z>>2]&511](j,B,C+E|0,F)|0;c[f>>2]=D;aEa(k,C);G=D}else{D=id[c[z>>2]&511](j,B,c[h>>2]|0,c[g>>2]|0)|0;c[f>>2]=D;G=D}if((G|0)!=0){u=G;break a}}A=c[d>>2]|0;if(!((A+4|0)>>>0<(c[o>>2]|0)>>>0)){break b}}if((v|0)==21){c[f>>2]=3;u=3;break a}else if((v|0)==29){i=e;return}}}while(0);if((c[s>>2]|0)!=0){i=e;return}c[s>>2]=p;i=e;return}}while(0);c[r>>2]=u;i=e;return}function KQa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0;e=i;i=i+32|0;f=e+8|0;g=e+4|0;h=e;j=e+12|0;k=d+208|0;l=d+156|0;m=d+260|0;n=c[d+16>>2]|0;o=c[b+488>>2]|0;p=c[d+8>>2]|0;q=Lc[c[d+36>>2]&255](d)|0;a:do{if((q|0)>=0){if((q|0)==0){i=e;return}r=d+12|0;if((c[r>>2]|0)!=0){i=e;return}s=d+152|0;if((c[s>>2]|0)==0){t=q+6|0;u=Qc[c[c[o>>2]>>2]&255](k,t,n)|0;c[f>>2]=u;if((u|0)!=0){v=r;w=u;break}u=Qc[c[c[o>>2]>>2]&255](l,t,n)|0;c[f>>2]=u;if((u|0)!=0){v=r;w=u;break}u=Qc[c[c[o>>2]>>2]&255](m,4,n)|0;c[f>>2]=u;if((u|0)!=0){v=r;w=u;break}}u=d+28|0;Rc[c[u>>2]&1023](d);t=c[d>>2]|0;do{if(t>>>0<p>>>0){x=d+32|0;y=b+128|0;z=d+200|0;A=d+180|0;B=b+172|0;C=q+5|0;D=o+16|0;E=d+252|0;F=t;G=0;H=0;I=0;b:while(1){J=(G|0)==0;K=F;while(1){L=K+3|0;c:do{if(L>>>0<p>>>0){switch(a[L>>0]|0){case 37:case 125:case 123:case 93:case 91:case 62:case 60:case 41:case 40:case 47:case 0:case 12:case 9:case 10:case 13:case 32:{break};default:{break c}}M=a[K>>0]|0;if(M<<24>>24==100){if((a[K+1>>0]|0)!=101){break}if((a[K+2>>0]|0)!=102|J){break}else{N=G;O=H;P=I;Q=40;break b}}else if(M<<24>>24==101){if((a[K+1>>0]|0)!=110){break}if((a[K+2>>0]|0)==100){N=G;O=H;P=I;Q=40;break b}else{break}}else{break}}}while(0);Rc[c[x>>2]&1023](d);if((c[r>>2]|0)!=0){Q=58;break b}if((a[K>>0]|0)==47){R=K+1|0;if(!(R>>>0<p>>>0)){Q=25;break b}S=c[d>>2]|0;if((GQa(d,g,h,(c[(c[y>>2]|0)+48>>2]|0)!=0&1)|0)==0){Q=58;break b}T=c[h>>2]|0;U=c[g>>2]|0;if(!((T+U|0)>>>0<p>>>0)){Q=28;break b}if((c[s>>2]|0)==0){break}}Rc[c[u>>2]&1023](d);K=c[d>>2]|0;if(!(K>>>0<p>>>0)){N=G;O=H;P=I;Q=40;break b}}K=S-R|0;J=id[c[z>>2]&511](l,G,R,K+1|0)|0;c[f>>2]=J;if((J|0)!=0){v=r;w=J;break a}a[(c[(c[A>>2]|0)+(G<<2)>>2]|0)+K>>0]=0;if((a[R>>0]|0)==46){K=(R2a(1278688,c[(c[A>>2]|0)+(G<<2)>>2]|0)|0)==0;V=K?1:H;W=K?G:I}else{V=H;W=I}K=c[B>>2]|0;if((K|0)>-1&(G|0)<(C|0)){if((U|0)<=(K|0)){Q=35;break}K=ZDa(n,U,f)|0;J=c[f>>2]|0;if((J|0)!=0){v=r;w=J;break a}c3a(K|0,T|0,U|0)|0;ld[c[D>>2]&255](K,U,4330);J=c[B>>2]|0;L=U-J|0;c[g>>2]=L;c[f>>2]=id[c[E>>2]&511](k,G,K+J|0,L)|0;aEa(n,K);X=c[f>>2]|0}else{K=id[c[E>>2]&511](k,G,T,U)|0;c[f>>2]=K;X=K}K=G+1|0;if((X|0)!=0){v=r;w=X;break a}Rc[c[u>>2]&1023](d);F=c[d>>2]|0;if(!(F>>>0<p>>>0)){N=K;O=V;P=W;Q=40;break}else{G=K;H=V;I=W}}if((Q|0)==25){c[f>>2]=3;v=r;w=3;break a}else if((Q|0)==28){c[f>>2]=3;v=r;w=3;break a}else if((Q|0)==35){c[f>>2]=3;v=r;w=3;break a}else if((Q|0)==40){c[s>>2]=N;if(O<<24>>24==0){Y=A;Z=N;break}I=c[c[A>>2]>>2]|0;if((R2a(1278688,I)|0)==0){i=e;return}H=d+304|0;G=d+184|0;F=id[c[H>>2]&511](m,0,I,c[c[G>>2]>>2]|0)|0;c[f>>2]=F;if((F|0)!=0){v=r;w=F;break a}F=d+232|0;I=d+236|0;B=id[c[H>>2]&511](m,1,c[c[F>>2]>>2]|0,c[c[I>>2]>>2]|0)|0;c[f>>2]=B;if((B|0)!=0){v=r;w=B;break a}B=id[c[H>>2]&511](m,2,c[(c[A>>2]|0)+(P<<2)>>2]|0,c[(c[G>>2]|0)+(P<<2)>>2]|0)|0;c[f>>2]=B;if((B|0)!=0){v=r;w=B;break a}B=id[c[H>>2]&511](m,3,c[(c[F>>2]|0)+(P<<2)>>2]|0,c[(c[I>>2]|0)+(P<<2)>>2]|0)|0;c[f>>2]=B;if((B|0)!=0){v=r;w=B;break a}B=d+284|0;I=d+288|0;F=id[c[z>>2]&511](l,P,c[c[B>>2]>>2]|0,c[c[I>>2]>>2]|0)|0;c[f>>2]=F;if((F|0)!=0){v=r;w=F;break a}F=id[c[E>>2]&511](k,P,c[(c[B>>2]|0)+4>>2]|0,c[(c[I>>2]|0)+4>>2]|0)|0;c[f>>2]=F;if((F|0)!=0){v=r;w=F;break a}F=id[c[z>>2]&511](l,0,c[(c[B>>2]|0)+8>>2]|0,c[(c[I>>2]|0)+8>>2]|0)|0;c[f>>2]=F;if((F|0)!=0){v=r;w=F;break a}F=id[c[E>>2]&511](k,0,c[(c[B>>2]|0)+12>>2]|0,c[(c[I>>2]|0)+12>>2]|0)|0;c[f>>2]=F;if((F|0)!=0){v=r;w=F;break a}i=e;return}else if((Q|0)==58){i=e;return}}else{c[s>>2]=0;Y=d+180|0;Z=0}}while(0);a[j+0>>0]=a[1280616>>0]|0;a[j+1>>0]=a[1280617>>0]|0;a[j+2>>0]=a[1280618>>0]|0;a[j+3>>0]=a[1280619>>0]|0;a[j+4>>0]=a[1280620>>0]|0;u=d+304|0;t=id[c[u>>2]&511](m,0,c[c[Y>>2]>>2]|0,c[c[d+184>>2]>>2]|0)|0;c[f>>2]=t;if((t|0)==0){F=id[c[u>>2]&511](m,1,c[c[d+232>>2]>>2]|0,c[c[d+236>>2]>>2]|0)|0;c[f>>2]=F;if((F|0)==0){u=d+200|0;I=id[c[u>>2]&511](l,0,1278688,8)|0;c[f>>2]=I;if((I|0)==0){B=d+252|0;H=id[c[B>>2]&511](k,0,j,5)|0;c[f>>2]=H;if((H|0)==0){G=d+284|0;D=d+288|0;C=id[c[u>>2]&511](l,Z,c[c[G>>2]>>2]|0,c[c[D>>2]>>2]|0)|0;c[f>>2]=C;if((C|0)==0){u=id[c[B>>2]&511](k,Z,c[(c[G>>2]|0)+4>>2]|0,c[(c[D>>2]|0)+4>>2]|0)|0;c[f>>2]=u;if((u|0)==0){c[s>>2]=(c[s>>2]|0)+1;i=e;return}else{v=r;w=u}}else{v=r;w=C}}else{v=r;w=H}}else{v=r;w=I}}else{v=r;w=F}}else{v=r;w=t}}else{c[f>>2]=3;v=d+12|0;w=3}}while(0);c[v>>2]=w;i=e;return}function LQa(a,b){a=a|0;b=b|0;a=b+372|0;c[a>>2]=c[a>>2]|1;return}function MQa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;d=i;i=i+256|0;e=d+64|0;f=d+56|0;g=d+8|0;h=d;j=b+60|0;pd[c[j>>2]&127](b,e,16,f);k=c[f>>2]|0;a:do{if((k|0)>=0){if((k|0)==0|(k|0)>16){l=3}else{m=c[b>>2]|0;n=b+8|0;o=c[n>>2]|0;p=a+528|0;if((k|0)>0){q=b+40|0;r=c[p>>2]|0;s=0;t=0;while(1){c[b>>2]=c[e+(s*12|0)>>2];c[n>>2]=c[e+(s*12|0)+4>>2];pd[c[j>>2]&127](b,g,4,h);u=c[h>>2]|0;if((s|0)!=0){if((u|0)==(t|0)){v=t;w=r;x=t}else{l=3;break a}}else{if((u+ -1|0)>>>0>3){l=3;break a}y=RQa(a,c[f>>2]|0,u)|0;if((y|0)!=0){l=y;break a}v=c[h>>2]|0;w=c[p>>2]|0;x=u}if((v|0)>0){u=w+(s<<2)+24|0;y=0;do{c[b>>2]=c[g+(y*12|0)>>2];c[n>>2]=c[g+(y*12|0)+4>>2];z=dd[c[q>>2]&511](b,0)|0;c[(c[u>>2]|0)+(y<<2)>>2]=z;y=y+1|0}while((y|0)<(c[h>>2]|0))}s=s+1|0;if((s|0)>=(c[f>>2]|0)){break}else{r=w;t=x}}}c[b>>2]=m;c[n>>2]=o;l=0}}else{l=162}}while(0);c[b+12>>2]=l;i=d;return}function NQa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;e=i;i=i+320|0;f=e+304|0;g=e+256|0;h=e+248|0;j=e+8|0;k=e;c[f>>2]=0;l=c[b+100>>2]|0;m=d+60|0;pd[c[m>>2]&127](d,g,4,h);n=c[h>>2]|0;if((n|0)<0){c[f>>2]=162;o=162;p=d+12|0;c[p>>2]=o;i=e;return}if((n|0)==0|(n|0)>4){c[f>>2]=3;o=3;p=d+12|0;c[p>>2]=o;i=e;return}q=c[d>>2]|0;r=d+8|0;s=c[r>>2]|0;t=RQa(b,0,n)|0;c[f>>2]=t;if((t|0)!=0){o=t;p=d+12|0;c[p>>2]=o;i=e;return}t=c[b+528>>2]|0;a:do{if((c[h>>2]|0)>0){b=d+36|0;n=d+40|0;u=0;while(1){c[d>>2]=c[g+(u*12|0)>>2];c[r>>2]=c[g+(u*12|0)+4>>2];pd[c[m>>2]&127](d,j,20,k);v=c[k>>2]|0;if((v+ -1|0)>>>0>19){break}w=dEa(l,4,0,v<<1,0,f)|0;v=t+(u*12|0)+92|0;c[v>>2]=w;x=c[f>>2]|0;if((x|0)!=0){o=x;y=15;break}x=t+(u*12|0)+96|0;c[x>>2]=w+(c[k>>2]<<2);a[t+(u*12|0)+88>>0]=c[k>>2];if((c[k>>2]|0)>0){w=0;do{c[d>>2]=(c[j+(w*12|0)>>2]|0)+1;c[r>>2]=(c[j+(w*12|0)+4>>2]|0)+ -1;z=Lc[c[b>>2]&255](d)|0;c[(c[v>>2]|0)+(w<<2)>>2]=z;z=dd[c[n>>2]&511](d,0)|0;c[(c[x>>2]|0)+(w<<2)>>2]=z;w=w+1|0}while((w|0)<(c[k>>2]|0))}u=u+1|0;if((u|0)>=(c[h>>2]|0)){break a}}if((y|0)==15){p=d+12|0;c[p>>2]=o;i=e;return}c[f>>2]=3;o=3;p=d+12|0;c[p>>2]=o;i=e;return}}while(0);c[d>>2]=q;c[r>>2]=s;o=0;p=d+12|0;c[p>>2]=o;i=e;return}function OQa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=i;i=i+64|0;f=e+8|0;g=e+4|0;h=e;c[h>>2]=0;pd[c[d+60>>2]&127](d,f,4,g);j=c[g>>2]|0;a:do{if((j|0)>=0){if((j|0)==0|(j|0)>4){c[h>>2]=3;k=3;break}l=RQa(b,0,j)|0;c[h>>2]=l;if((l|0)==0){m=c[b+528>>2]|0;n=c[b+100>>2]|0;if((c[g>>2]|0)>0){o=0;while(1){p=f+(o*12|0)|0;q=c[p>>2]|0;if((a[q>>0]|0)==47){r=q+1|0;c[p>>2]=r;s=r}else{s=q}q=c[f+(o*12|0)+4>>2]|0;r=q-s|0;if((q|0)==(s|0)){break}q=ZDa(n,r+1|0,h)|0;c[m+(o<<2)+8>>2]=q;t=c[h>>2]|0;if((t|0)!=0){k=t;break a}c3a(q|0,c[p>>2]|0,r|0)|0;a[q+r>>0]=0;o=o+1|0;if((o|0)>=(c[g>>2]|0)){k=0;break a}}c[h>>2]=3;k=3}else{k=0}}else{k=l}}else{c[h>>2]=162;k=162}}while(0);c[d+12>>2]=k;i=e;return}function PQa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=i;i=i+208|0;e=d+8|0;f=d;g=a+528|0;h=c[g>>2]|0;pd[c[b+60>>2]&127](b,e,16,f);j=c[f>>2]|0;do{if((j|0)>=0){if((j|0)==0|(j|0)>16){k=3}else{if((h|0)!=0?(l=c[h>>2]|0,(l|0)!=0):0){if((l|0)==(j|0)){m=j;n=h}else{k=3;break}}else{l=RQa(a,j,0)|0;if((l|0)!=0){k=l;break}m=c[f>>2]|0;n=c[g>>2]|0}l=c[b>>2]|0;o=b+8|0;p=c[o>>2]|0;if((m|0)>0){q=b+40|0;r=n+136|0;s=n+140|0;t=0;do{c[b>>2]=c[e+(t*12|0)>>2];c[o>>2]=c[e+(t*12|0)+4>>2];u=dd[c[q>>2]&511](b,0)|0;c[(c[r>>2]|0)+(t<<2)>>2]=u;c[(c[s>>2]|0)+(t<<2)>>2]=u;t=t+1|0}while((t|0)<(c[f>>2]|0))}c[b>>2]=l;c[o>>2]=p;k=0}}else{k=162}}while(0);c[b+12>>2]=k;i=d;return}function QQa(a,b){a=a|0;b=b|0;var d=0;d=i;c[a+540>>2]=id[c[b+52>>2]&511](b,0,0,0)|0;i=d;return}function RQa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=i;i=i+16|0;f=e;g=c[a+100>>2]|0;c[f>>2]=0;h=a+528|0;j=c[h>>2]|0;do{if((j|0)==0){k=ZDa(g,420,f)|0;l=c[f>>2]|0;if((l|0)==0){c[k+416>>2]=0;c[h>>2]=k;m=k;break}else{n=l;i=e;return n|0}}else{m=j}}while(0);do{if((b|0)==0){o=15}else{j=c[m>>2]|0;if((j|0)!=0){if((j|0)==(b|0)){o=15;break}else{break}}j=m+148|0;c[j>>2]=dEa(g,32,0,b,0,f)|0;h=c[f>>2]|0;if((h|0)!=0){n=h;i=e;return n|0}h=m+216|0;c[h>>2]=dEa(g,196,0,b,0,f)|0;l=c[f>>2]|0;if((l|0)!=0){n=l;i=e;return n|0}l=m+288|0;c[l>>2]=dEa(g,16,0,b,0,f)|0;k=c[f>>2]|0;if((k|0)!=0){n=k;i=e;return n|0}k=dEa(g,4,0,b<<1,0,f)|0;c[m+136>>2]=k;p=c[f>>2]|0;if((p|0)!=0){n=p;i=e;return n|0}c[m+140>>2]=k+(b<<2);c[m+144>>2]=a+132;c[m+212>>2]=a+168;c[m+284>>2]=a+460;if(!(b>>>0<2)){k=c[j>>2]|0;j=c[h>>2]|0;h=c[l>>2]|0;l=2;do{k=k+32|0;c[m+(l<<2)+144>>2]=k;j=j+196|0;c[m+(l<<2)+212>>2]=j;h=h+16|0;c[m+(l<<2)+284>>2]=h;l=l+1|0}while(!(l>>>0>b>>>0))}c[m>>2]=b;o=15}}while(0);do{if((o|0)==15){b=m+4|0;a=c[b>>2]|0;if((d|0)==0){q=a}else{if(!((a|0)==0|(a|0)==(d|0))){break}c[b>>2]=d;q=d}b=c[m>>2]|0;if((b|0)==0|(q|0)==0){n=0;i=e;return n|0}a=m+24|0;if((c[a>>2]|0)!=0){n=0;i=e;return n|0}l=dEa(g,4,0,ca(q,b)|0,0,f)|0;c[a>>2]=l;h=c[f>>2]|0;if((h|0)==0&b>>>0>1){r=l;s=1}else{n=h;i=e;return n|0}while(1){c[m+(s<<2)+24>>2]=r+((ca(s,q)|0)<<2);h=s+1|0;if((h|0)==(b|0)){n=0;break}r=c[a>>2]|0;s=h}i=e;return n|0}}while(0);c[f>>2]=3;n=3;i=e;return n|0}function SQa(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;i=i+16|0;g=f+4|0;h=uFa(a,0)|0;do{if((h|0)==0){j=FQa(a,g,f)|0;if((j|0)==0){if(!((b[g>>1]|0)==-32767)?(k=uFa(a,0)|0,(k|0)!=0):0){l=k;break}k=CFa(a,e)|0;if((k|0)==0){m=(Q2a(c[a+32>>2]|0,d,e)|0)==0;FFa(a);l=m?0:2}else{l=k}}else{l=j}}else{l=h}}while(0);i=f;return l|0}function TQa(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=c[a+528>>2]|0;if((f|0)==0){g=6;i=e;return g|0}a=f+4|0;c[b>>2]=c[a>>2];c[b+4>>2]=c[f>>2];if((c[a>>2]|0)==0){g=0;i=e;return g|0}else{h=0}do{c[b+(h*12|0)+8>>2]=c[f+(h<<2)+8>>2];j=f+(h*12|0)+92|0;c[b+(h*12|0)+12>>2]=c[c[j>>2]>>2];c[b+(h*12|0)+16>>2]=c[(c[j>>2]|0)+((d[f+(h*12|0)+88>>0]|0)+ -1<<2)>>2];h=h+1|0}while(h>>>0<(c[a>>2]|0)>>>0);g=0;i=e;return g|0}function UQa(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;f=i;i=i+64|0;g=f;h=c[b+528>>2]|0;if((h|0)==0){j=6;i=f;return j|0}k=h+4|0;if((c[k>>2]|0)!=(d|0)){j=6;i=f;return j|0}if((d|0)!=0){l=d;m=0;while(1){n=c[e+(m<<2)>>2]|0;o=c[h+(m*12|0)+92>>2]|0;p=c[h+(m*12|0)+96>>2]|0;q=a[h+(m*12|0)+88>>0]|0;do{if(!(q<<24>>24==0)){r=q&255;s=-1;t=0;while(1){u=c[o+(t<<2)>>2]|0;if((n|0)==(u|0)){v=8;break}w=t+1|0;if((n|0)<(u|0)){x=t;y=s;break}if(w>>>0<r>>>0){u=t;t=w;s=u}else{x=-1;y=t;break}}if((v|0)==8){v=0;z=l;A=c[p+(t<<2)>>2]|0;break}if((y|0)>=0){if((x|0)<0){z=l;A=c[p+(r+ -1<<2)>>2]|0;break}else{s=c[o+(y<<2)>>2]|0;u=ODa(n-s|0,(c[p+(x<<2)>>2]|0)-(c[p+(y<<2)>>2]|0)|0,(c[o+(x<<2)>>2]|0)-s|0)|0;z=c[k>>2]|0;A=u;break}}else{v=11}}else{v=11}}while(0);if((v|0)==11){v=0;z=l;A=c[p>>2]|0}c[g+(m<<2)>>2]=A;m=m+1|0;if(!(m>>>0<z>>>0)){break}else{l=z}}}j=VQa(b,d,g)|0;i=f;return j|0}function VQa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;f=c[a+528>>2]|0;if((f|0)==0){g=6;i=e;return g|0}a=f+4|0;if((c[a>>2]|0)!=(b|0)){g=6;i=e;return g|0}if((c[f>>2]|0)==0){g=0;i=e;return g|0}h=f+136|0;j=b;b=0;while(1){if((j|0)==0){k=65536}else{l=0;m=65536;while(1){n=c[d+(l<<2)>>2]|0;o=(n|0)<0?0:n;n=(o|0)>65536?65536:o;o=SDa(m,(1<<l&b|0)==0?65536-n|0:n)|0;l=l+1|0;if(!(l>>>0<j>>>0)){k=o;break}else{m=o}}}c[(c[h>>2]|0)+(b<<2)>>2]=k;m=b+1|0;if(!(m>>>0<(c[f>>2]|0)>>>0)){g=0;break}j=c[a>>2]|0;b=m}i=e;return g|0}function WQa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;e=i;i=i+80|0;f=e+24|0;g=e+16|0;h=e;j=c[b+100>>2]|0;k=c[b+528>>2]|0;l=TQa(b,f)|0;c[g>>2]=l;if((l|0)!=0){m=l;i=e;return m|0}l=c[f>>2]|0;b=ZDa(j,(l*24|0)+20|0,g)|0;j=c[g>>2]|0;if((j|0)!=0){m=j;i=e;return m|0}c[b>>2]=l;c[b+4>>2]=c[f+4>>2];c[b+8>>2]=-1;j=b+20|0;g=b+12|0;c[g>>2]=j;c[b+16>>2]=0;a:do{if((l|0)==0){n=0}else{o=j;p=0;while(1){c[o+(p*24|0)>>2]=c[f+(p*12|0)+8>>2];c[(c[g>>2]|0)+(p*24|0)+4>>2]=c[f+(p*12|0)+12>>2]<<16;c[(c[g>>2]|0)+(p*24|0)+12>>2]=c[f+(p*12|0)+16>>2]<<16;q=c[g>>2]|0;c[q+(p*24|0)+8>>2]=((c[q+(p*24|0)+12>>2]|0)+(c[q+(p*24|0)+4>>2]|0)|0)/2|0;c[(c[g>>2]|0)+(p*24|0)+20>>2]=-1;c[(c[g>>2]|0)+(p*24|0)+16>>2]=-1;q=c[g>>2]|0;r=c[q+(p*24|0)>>2]|0;do{if((R2a(r,1283096)|0)!=0){if((R2a(r,1280896)|0)==0){c[q+(p*24|0)+16>>2]=2003072104;break}if((R2a(r,1280904)|0)==0){c[q+(p*24|0)+16>>2]=1869640570}}else{c[q+(p*24|0)+16>>2]=2003265652}}while(0);q=p+1|0;if(!(q>>>0<l>>>0)){n=l;break a}o=c[g>>2]|0;p=q}}}while(0);l=c[k+4>>2]|0;b:do{if((c[k>>2]|0)==(1<<l|0)){f=c[k+140>>2]|0;if((l|0)==2){j=c[f+12>>2]|0;p=(c[f+4>>2]|0)+j|0;c[h>>2]=p;c[h+4>>2]=(c[f+8>>2]|0)+j;s=p}else if((l|0)==1){p=c[f+4>>2]|0;c[h>>2]=p;s=p}else if((l|0)==3){p=c[f+28>>2]|0;j=c[f+20>>2]|0;o=c[f+12>>2]|0;q=j+p+o+(c[f+4>>2]|0)|0;c[h>>2]=q;r=(c[f+24>>2]|0)+p|0;c[h+4>>2]=r+o+(c[f+8>>2]|0);c[h+8>>2]=r+j+(c[f+16>>2]|0);s=q}else{q=c[f+60>>2]|0;j=c[f+52>>2]|0;r=c[f+44>>2]|0;o=c[f+36>>2]|0;p=c[f+28>>2]|0;t=c[f+20>>2]|0;u=c[f+12>>2]|0;v=j+q+r+o+p+t+u+(c[f+4>>2]|0)|0;c[h>>2]=v;w=(c[f+56>>2]|0)+q|0;q=c[f+40>>2]|0;x=c[f+24>>2]|0;c[h+4>>2]=w+r+q+p+x+u+(c[f+8>>2]|0);u=w+j+(c[f+48>>2]|0)|0;c[h+8>>2]=u+p+x+t+(c[f+16>>2]|0);c[h+12>>2]=u+r+q+o+(c[f+32>>2]|0);s=v}if((n|0)!=0){v=s;f=0;while(1){o=c[k+(f*12|0)+96>>2]|0;c:do{if((c[o>>2]|0)<(v|0)){q=a[k+(f*12|0)+88>>0]|0;r=q&255;d:do{if((q&255)>1){u=1;while(1){y=c[o+(u<<2)>>2]|0;t=u+1|0;if((y|0)>=(v|0)){break}if((t|0)<(r|0)){u=t}else{break d}}t=u+ -1|0;x=c[k+(f*12|0)+92>>2]|0;p=c[x+(t<<2)>>2]|0;j=(c[x+(u<<2)>>2]|0)-p|0;x=c[o+(t<<2)>>2]|0;z=(ca(TDa(v-x|0,y-x|0)|0,j)|0)+(p<<16)|0;break c}}while(0);z=c[(c[k+(f*12|0)+92>>2]|0)+(r+ -1<<2)>>2]<<16}else{z=c[c[k+(f*12|0)+92>>2]>>2]<<16}}while(0);c[(c[g>>2]|0)+(f*24|0)+8>>2]=z;o=f+1|0;if(!(o>>>0<n>>>0)){break b}v=c[h+(o<<2)>>2]|0;f=o}}}}while(0);c[d>>2]=b;m=0;i=e;return m|0}function XQa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e;if(b>>>0<5&(b|0)!=0){g=0}else{h=6;i=e;return h|0}do{c[f+(g<<2)>>2]=(KDa(c[d+(g<<2)>>2]|0)|0)>>16;g=g+1|0}while((g|0)!=(b|0));h=UQa(a,b,f)|0;i=e;return h|0}function YQa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;g=c[a+492>>2]|0;if((g|0)==0){h=6;i=f;return h|0}a=g+32|0;if((c[a>>2]|0)<=0){h=0;i=f;return h|0}j=g+28|0;g=0;do{k=c[j>>2]|0;do{if((c[k+(g*20|0)>>2]|0)==(d|0)){l=c[k+(g*20|0)+4>>2]|0;if((l|0)>(b|0)){c[e>>2]=c[k+(g*20|0)+8>>2];break}m=c[k+(g*20|0)+12>>2]|0;if((m|0)<(b|0)){c[e>>2]=c[k+(g*20|0)+16>>2];break}else{n=k+(g*20|0)+8|0;o=ODa(b-l|0,(c[k+(g*20|0)+16>>2]|0)-(c[n>>2]|0)|0,m-l|0)|0;c[e>>2]=(c[n>>2]|0)+o;break}}}while(0);g=g+1|0}while((g|0)<(c[a>>2]|0));h=0;i=f;return h|0}function ZQa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+132|0;c[b+0>>2]=c[e+0>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];c[b+16>>2]=c[e+16>>2];c[b+20>>2]=c[e+20>>2];c[b+24>>2]=c[e+24>>2];c[b+28>>2]=c[e+28>>2];i=d;return 0}function _Qa(a,c){a=a|0;c=c|0;b[c>>1]=b[a+164>>1]|0;return 0}function $Qa(a){a=a|0;return 1}function aRa(a,b){a=a|0;b=b|0;var c=0;c=i;c3a(b|0,a+168|0,196)|0;i=c;return 0}function bRa(e,f,g,h,j){e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;k=i;l=e+132|0;do{switch(f|0){case 30:{if((h|0)!=0&(j|0)>0){a[h>>0]=a[e+294>>0]|0;m=1}else{m=1}break};case 11:{if((h|0)!=0&(j|0)>3){c[h>>2]=c[e+404>>2];m=4}else{m=4}break};case 14:{if((h|0)!=0&(j|0)>1){b[h>>1]=b[e+290>>1]|0;m=2}else{m=2}break};case 41:{if((h|0)!=0&(j|0)>0){a[h>>0]=a[e+156>>0]|0;m=1}else{m=1}break};case 37:{n=c[e+136>>2]|0;o=(Y2a(n|0)|0)+1|0;if((h|0)==0|(o|0)>(j|0)){m=o}else{c3a(h|0,n|0,o|0)|0;m=o}break};case 22:{if((h|0)!=0&(j|0)>0){a[h>>0]=a[e+179>>0]|0;m=1}else{m=1}break};case 45:{if((h|0)!=0&(j|0)>3){c[h>>2]=c[e+152>>2];m=4}else{m=4}break};case 31:{if((h|0)!=0&(j|0)>0){a[h>>0]=a[e+295>>0]|0;m=1}else{m=1}break};case 2:{if(g>>>0<4){if((h|0)!=0&(j|0)>3){if((g|0)==3){p=c[e+472>>2]|0}else if((g|0)==0){p=c[e+460>>2]|0}else if((g|0)==1){p=c[e+464>>2]|0}else if((g|0)==2){p=c[e+468>>2]|0}else{p=0}c[h>>2]=p;m=4}else{m=4}}else{m=-1}break};case 43:{if((h|0)!=0&(j|0)>1){b[h>>1]=b[e+160>>1]|0;m=2}else{m=2}break};case 28:{if((h|0)!=0&(j|0)>0){a[h>>0]=a[e+293>>0]|0;m=1}else{m=1}break};case 3:{if((h|0)!=0&(j|0)>0){a[h>>0]=a[e+432>>0]|0;m=1}else{m=1}break};case 26:{if((h|0)!=0&(j|0)>0){a[h>>0]=a[e+292>>0]|0;m=1}else{m=1}break};case 34:{if((h|0)!=0&(j|0)>3){c[h>>2]=c[e+356>>2];m=4}else{m=4}break};case 33:{if((h|0)!=0&(j|0)>3){c[h>>2]=c[e+172>>2];m=4}else{m=4}break};case 7:{if((c[e+416>>2]|0)>>>0>g>>>0){o=c[(c[e+420>>2]|0)+(g<<2)>>2]|0;n=Y2a(o|0)|0;q=n+1|0;if((h|0)==0|(q|0)>(j|0)){m=q}else{c3a(h|0,o|0,q|0)|0;a[h+n>>0]=0;m=q}}else{m=-1}break};case 36:{q=c[l>>2]|0;n=(Y2a(q|0)|0)+1|0;if((h|0)==0|(n|0)>(j|0)){m=n}else{c3a(h|0,q|0,n|0)|0;m=n}break};case 24:{if((h|0)!=0&(j|0)>3){c[h>>2]=c[e+276>>2];m=4}else{m=4}break};case 4:{n=c[e+364>>2]|0;q=(Y2a(n|0)|0)+1|0;if((h|0)==0|(q|0)>(j|0)){m=q}else{c3a(h|0,n|0,q|0)|0;m=q}break};case 19:{q=e+168|0;if((d[q+9>>0]|0)>>>0>g>>>0){if((h|0)!=0&(j|0)>1){b[h>>1]=b[q+40+(g<<1)>>1]|0;m=2}else{m=2}}else{m=-1}break};case 13:{if((h|0)!=0&(j|0)>1){b[h>>1]=b[e+288>>1]|0;m=2}else{m=2}break};case 20:{if((h|0)!=0&(j|0)>0){a[h>>0]=a[e+178>>0]|0;m=1}else{m=1}break};case 42:{if((h|0)!=0&(j|0)>1){b[h>>1]=b[l+26>>1]|0;m=2}else{m=2}break};case 15:{if((h|0)!=0&(j|0)>0){a[h>>0]=a[e+176>>0]|0;m=1}else{m=1}break};case 39:{q=c[e+144>>2]|0;n=(Y2a(q|0)|0)+1|0;if((h|0)==0|(n|0)>(j|0)){m=n}else{c3a(h|0,q|0,n|0)|0;m=n}break};case 35:{if((h|0)!=0&(j|0)>3){c[h>>2]=c[e+352>>2];m=4}else{m=4}break};case 8:{if((c[e+416>>2]|0)>>>0>g>>>0){n=c[(c[e+428>>2]|0)+(g<<2)>>2]|0;q=n+1|0;if((h|0)!=0&(n|0)<(j|0)){c3a(h|0,c[(c[e+424>>2]|0)+(g<<2)>>2]|0,n|0)|0;a[h+n>>0]=0;m=q}else{m=q}}else{m=-1}break};case 40:{q=c[e+148>>2]|0;n=(Y2a(q|0)|0)+1|0;if((h|0)==0|(n|0)>(j|0)){m=n}else{c3a(h|0,q|0,n|0)|0;m=n}break};case 38:{n=c[e+140>>2]|0;q=(Y2a(n|0)|0)+1|0;if((h|0)==0|(q|0)>(j|0)){m=q}else{c3a(h|0,n|0,q|0)|0;m=q}break};case 17:{if((h|0)!=0&(j|0)>3){c[h>>2]=c[e+284>>2];m=4}else{m=4}break};case 23:{q=e+168|0;if((d[q+11>>0]|0)>>>0>g>>>0){if((h|0)!=0&(j|0)>1){b[h>>1]=b[q+88+(g<<1)>>1]|0;m=2}else{m=2}}else{m=-1}break};case 27:{q=e+168|0;if((d[q+124>>0]|0)>>>0>g>>>0){if((h|0)!=0&(j|0)>1){b[h>>1]=b[q+128+(g<<1)>>1]|0;m=2}else{m=2}}else{m=-1}break};case 29:{q=e+168|0;if((d[q+125>>0]|0)>>>0>g>>>0){if((h|0)!=0&(j|0)>1){b[h>>1]=b[q+(g<<1)+154>>1]|0;m=2}else{m=2}}else{m=-1}break};case 25:{if((h|0)!=0&(j|0)>3){c[h>>2]=c[e+280>>2];m=4}else{m=4}break};case 12:{if((c[e+404>>2]|0)>>>0>g>>>0){q=c[(c[e+412>>2]|0)+(g<<2)>>2]|0;n=q+1|0;if((h|0)!=0&(q|0)<(j|0)){c3a(h|0,c[(c[e+408>>2]|0)+(g<<2)>>2]|0,q|0)|0;a[h+q>>0]=0;m=n}else{m=n}}else{m=-1}break};case 44:{if((h|0)!=0&(j|0)>1){b[h>>1]=b[e+164>>1]|0;m=2}else{m=2}break};case 32:{if(g>>>0<2){if((h|0)!=0&(j|0)>1){b[h>>1]=b[e+360+(g<<1)>>1]|0;m=2}else{m=2}}else{m=-1}break};case 1:{if(g>>>0<4){if((h|0)!=0&(j|0)>3){if((g|0)==1){r=c[e+440>>2]|0}else if((g|0)==3){r=c[e+448>>2]|0}else if((g|0)==0){r=c[e+436>>2]|0}else if((g|0)==2){r=c[e+444>>2]|0}else{r=0}c[h>>2]=r;m=4}else{m=4}}else{m=-1}break};case 9:{if((h|0)!=0&(j|0)>3){c[h>>2]=c[e+368>>2];m=4}else{m=4}break};case 21:{n=e+168|0;if((d[n+10>>0]|0)>>>0>g>>>0){if((h|0)!=0&(j|0)>1){b[h>>1]=b[n+60+(g<<1)>>1]|0;m=2}else{m=2}}else{m=-1}break};case 6:{if((h|0)!=0&(j|0)>3){c[h>>2]=c[e+416>>2];m=4}else{m=4}break};case 5:{if((h|0)!=0&(j|0)>3){c[h>>2]=c[e+168>>2];m=4}else{m=4}break};case 18:{if((h|0)!=0&(j|0)>0){a[h>>0]=a[e+177>>0]|0;m=1}else{m=1}break};case 10:{if((c[e+368>>2]|0)==1?(n=e+372|0,(c[n>>2]|0)>>>0>g>>>0):0){q=c[(c[n+16>>2]|0)+(g<<2)>>2]|0;n=Y2a(q|0)|0;o=n+1|0;if((h|0)==0|(o|0)>(j|0)){m=o}else{c3a(h|0,q|0,n|0)|0;a[h+n>>0]=0;m=o}}else{m=-1}break};case 16:{o=e+168|0;if((d[o+8>>0]|0)>>>0>g>>>0){if((h|0)!=0&(j|0)>1){b[h>>1]=b[o+12+(g<<1)>>1]|0;m=2}else{m=2}}else{m=-1}break};case 0:{if((h|0)!=0&(j|0)>0){a[h>>0]=a[l+301>>0]|0;m=1}else{m=1}break};default:{m=-1}}}while(0);i=k;return m|0}function cRa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=i;SFa(d,c[(c[a+420>>2]|0)+(b<<2)>>2]|0,e);i=f;return 0}function dRa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=c[a+416>>2]|0;a:do{if((e|0)>0){f=c[a+420>>2]|0;g=0;while(1){if((R2a(b,c[f+(g<<2)>>2]|0)|0)==0){h=g;break a}g=g+1|0;if((g|0)>=(e|0)){h=0;break}}}else{h=0}}while(0);i=d;return h|0}function eRa(a){a=a|0;return c[a+364>>2]|0}function fRa(a){a=a|0;return 0}function gRa(a){a=a|0;return}function hRa(a,b){a=a|0;b=b|0;var c=0;a=i;c=jEa(1283704,b)|0;i=a;return c|0}function iRa(e,f,g,h,j){e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0;j=i;i=i+640|0;h=j+384|0;k=j+112|0;l=j+8|0;m=j;c[f>>2]=1;n=f+136|0;do{if((c[n>>2]|0)==0){o=hFa(c[(c[f+96>>2]|0)+4>>2]|0,1281024)|0;if((o|0)==0){p=11;i=j;return p|0}else{c[n>>2]=o;break}}}while(0);o=f+320|0;if((c[o>>2]|0)==0){c[o>>2]=hFa(c[(c[f+96>>2]|0)+4>>2]|0,1284024)|0}o=uFa(e,0)|0;if((o|0)!=0){p=o;i=j;return p|0}o=f+100|0;e=c[o>>2]|0;q=l+0|0;r=q+104|0;do{c[q>>2]=0;q=q+4|0}while((q|0)<(r|0));s=f+104|0;t=c[s>>2]|0;u=c[n>>2]|0;q=l+0|0;r=q+100|0;do{c[q>>2]=0;q=q+4|0}while((q|0)<(r|0));pd[c[c[u+4>>2]>>2]&127](l,0,0,e);u=l+72|0;c[u>>2]=t;v=t+8|0;w=zFa(c[v>>2]|0)|0;x=CFa(t,31)|0;a:do{if((x|0)==0){y=(S2a(c[t+32>>2]|0,1283640,31)|0)==0;FFa(t);if(!y){c[m>>2]=2;break}y=t+4|0;z=k+10|0;A=k;B=10-A|0;C=l+76|0;D=l+84|0;E=l+80|0;F=l+4|0;G=l+8|0;H=l+96|0;I=l+32|0;J=l+28|0;K=l+12|0;L=7-A|0;b:while(1){A=c[y>>2]|0;M=zFa(c[v>>2]|0)|0;if((A|0)==(M|0)){N=3;O=37;break a}P=A-M|0;A=M;M=k;Q=266;c:while(1){R=(Q|0)<(P|0)?Q:P;S=vFa(t,M,R)|0;if((S|0)!=0){N=S;O=37;break a}if((R|0)<256){a[M+R>>0]=0}S=M+(R+ -10)|0;if(k>>>0<S>>>0){R=a[k>>0]|0;T=k;while(1){if(R<<24>>24==83?(S2a(T,1283672,9)|0)==0:0){O=19;break c}U=T+1|0;R=a[U>>0]|0;if(R<<24>>24==115?(S2a(T,1283688,6)|0)==0:0){O=23;break c}if(!(U>>>0<S>>>0)){V=U;break}else{T=U}}}else{V=k}d3a(k|0,V|0,10)|0;S=c[y>>2]|0;R=zFa(c[v>>2]|0)|0;if((S|0)==(R|0)){N=3;O=37;break a}else{P=S-R|0;A=A+256|0;M=z;Q=256}}if((O|0)==19){O=0;W=B+T|0}else if((O|0)==23){O=0;W=L+T|0}Q=W+A|0;M=Q-w|0;P=uFa(t,w)|0;if((P|0)!=0){N=P;O=37;break a}P=BFa(t,M,C)|0;if((P|0)!=0){N=P;O=37;break a}c[D>>2]=Q;c[E>>2]=M;P=c[C>>2]|0;c[F>>2]=P;c[l>>2]=P;c[G>>2]=P+M;c[H>>2]=-1;Rc[c[I>>2]&1023](l);Rc[c[J>>2]&1023](l);M=c[l>>2]|0;Rc[c[I>>2]&1023](l);Rc[c[J>>2]&1023](l);R=c[G>>2]|0;S=c[l>>2]|0;if(S>>>0<R>>>0){X=P;Y=M;M=S;while(1){S=c[K>>2]|0;if((S|0)!=0){N=S;O=37;break a}if((a[M>>0]|0)==83?(S2a(M,1283672,9)|0)==0:0){break b}if((a[M+1>>0]|0)==115?(S2a(M,1283688,6)|0)==0:0){N=2;O=37;break a}Rc[c[I>>2]&1023](l);Rc[c[J>>2]&1023](l);S=c[l>>2]|0;if(S>>>0<R>>>0){P=M;U=Y;M=S;Y=P;X=U}else{break}}}DFa(t,C);M=uFa(t,Q)|0;if((M|0)!=0){N=M;O=37;break a}}if((S2a(X,1283696,5)|0)==0){c[l+88>>2]=gma(Y)|0}c[m>>2]=0;F=c[C>>2]|0;L=c[E>>2]|0;c[l>>2]=F;B=F+L|0;c[G>>2]=B;c[K>>2]=0;z=F+(L+ -18)|0;L=f+140|0;y=f+300|0;M=f+304|0;R=l+68|0;A=l+64|0;U=f+164|0;P=f+312|0;S=f+196|0;Z=F;d:while(1){c[l>>2]=Z;Rc[c[J>>2]&1023](l);F=c[l>>2]|0;_=F>>>0<B>>>0;$=_?F+ -17|0:z;if(Z>>>0<$>>>0){aa=Z;do{if(((a[aa>>0]|0)==37?(S2a(aa,1281032,17)|0)==0:0)?(c[y>>2]|0)>0:0){c[H>>2]=(c[H>>2]|0)+1}aa=aa+1|0}while((aa|0)!=($|0))}if(!_){O=74;break}Rc[c[I>>2]&1023](l);$=c[l>>2]|0;if(!($>>>0<B>>>0)){O=74;break}if((c[K>>2]|0)!=0){O=74;break}if(!((a[F>>0]|0)==47&(F+2|0)>>>0<B>>>0)){Z=$;continue}aa=F+1|0;Q=$-aa|0;if(!((Q+ -1|0)>>>0<21)){Z=$;continue}ba=a[aa>>0]|0;aa=(Q|0)>1;da=1282896;ea=1281056;e:while(1){f:do{if(ba<<24>>24==(a[da>>0]|0)?(Q|0)==(Y2a(da|0)|0):0){if(aa){fa=1}else{break e}while(1){ga=fa;fa=fa+1|0;if((a[F+fa>>0]|0)!=(a[da+ga>>0]|0)){break f}if((fa|0)>=(Q|0)){break e}}}}while(0);ga=ea+36|0;ha=c[ga>>2]|0;if((ha|0)==0){Z=$;continue d}else{da=ha;ea=ga}}da=c[ea+8>>2]|0;do{if((da|0)!=11){$=c[ea+4>>2]|0;if(($|0)==5){ia=S}else if(($|0)==0){ia=L}else if(($|0)==3){ia=U}else if(($|0)==2){ia=P}else{$=c[H>>2]|0;if(($|0)<0){O=69;break d}if(($|0)>=(c[y>>2]|0)){O=69;break d}ia=(c[M>>2]|0)+($*252|0)|0}c[h>>2]=ia;if((da+ -9|0)>>>0<2){ja=ed[c[R>>2]&127](l,ea,h,0,0)|0;break}else{ja=ed[c[A>>2]&127](l,ea,h,0,0)|0;break}}else{Ic[c[ea+12>>2]&511](f,l);ja=c[K>>2]|0}}while(0);c[K>>2]=ja;if((ja|0)!=0){ka=ja;break}Z=c[l>>2]|0}if((O|0)==69){c[K>>2]=160;ka=160}else if((O|0)==74){Z=c[K>>2]|0;c[m>>2]=Z;if((Z|0)!=0|(g|0)<0){break}Z=ZDa(e,40,m)|0;A=f+328|0;c[A>>2]=Z;if((c[m>>2]|0)!=0){break}R=l+88|0;H=c[R>>2]|0;if((H|0)==0){q=Z+0|0;Z=(c[s>>2]|0)+0|0;r=q+40|0;do{c[q>>2]=c[Z>>2];q=q+4|0;Z=Z+4|0}while((q|0)<(r|0));c[f+308>>2]=c[D>>2]}else{Z=ZDa(e,H,m)|0;K=f+324|0;c[K>>2]=Z;if((c[m>>2]|0)!=0){break}P=c[R>>2]|0;U=c[s>>2]|0;if((uFa(U,c[D>>2]|0)|0)!=0){break}L=Z+P|0;g:do{if((P|0)>0){S=U+4|0;B=U+8|0;I=Z;z=h;J=h;G=1;while(1){E=z;C=J;h:while(1){if(E>>>0<C>>>0){la=E;ma=C}else{ea=zFa(c[B>>2]|0)|0;da=c[S>>2]|0;$=da-ea|0;if((da|0)==(ea|0)){break a}if((vFa(U,h,$>>>0<256?$:256)|0)!=0){break a}la=h;ma=h+((zFa(c[B>>2]|0)|0)-ea)|0}ea=a[la>>0]|0;na=ea&255;if((na+ -48|0)>>>0<10){O=87;break}if((ea+ -97<<24>>24&255)<6){O=89;break}if((ea+ -65<<24>>24&255)<6){O=91;break}switch(ea<<24>>24){case 0:case 12:case 10:case 13:case 9:case 32:{break};case 62:{oa=1;pa=0;break h;break};default:{break a}}E=la+1|0;C=ma}if((O|0)==87){O=0;oa=0;pa=na+208&255}else if((O|0)==89){O=0;oa=0;pa=na+159&255}else if((O|0)==91){O=0;oa=0;pa=na+201&255}if(G<<24>>24==0){a[I>>0]=(d[I>>0]|0)+(pa&255);qa=I+1|0}else{a[I>>0]=(pa&255)<<4;qa=I}if(!(oa<<24>>24==0)){break g}if(qa>>>0<L>>>0){I=qa;z=la+1|0;J=ma;G=1-(G&255)&255}else{break}}}}while(0);nEa(c[A>>2]|0,c[K>>2]|0,c[R>>2]|0);c[f+308>>2]=0}L=c[o>>2]|0;U=c[A>>2]|0;Z=c[n>>2]|0;P=dEa(L,8,0,c[y>>2]|0,0,h)|0;D=f+316|0;c[D>>2]=P;i:do{if((c[h>>2]|0)==0?(c[y>>2]|0)>0:0){H=f+308|0;G=U+32|0;J=Z+16|0;z=0;I=0;B=0;S=P;j:while(1){C=c[M>>2]|0;E=c[C+(I*252|0)+4>>2]|0;ea=c[C+(I*252|0)+240>>2]|0;if((ea|0)==-1){O=105;break}$=ea+1|0;if($>>>0>z>>>0){da=ea+4&-4;if(!(da>>>0>z>>>0)){O=108;break}Q=dEa(L,4,z,da,B,h)|0;if((c[h>>2]|0)==0){ra=da;sa=Q}else{ta=Q;break}}else{ra=z;sa=B}Q=uFa(U,(c[C+(I*252|0)+244>>2]|0)+(c[H>>2]|0)|0)|0;c[h>>2]=Q;if((Q|0)!=0){ta=sa;break}Q=C+(I*252|0)+248|0;C=CFa(U,ca(c[Q>>2]|0,$)|0)|0;c[h>>2]=C;if((C|0)!=0){ta=sa;break}c[k>>2]=c[G>>2];C=0;do{c[sa+(C<<2)>>2]=rRa(k,c[Q>>2]&255)|0;C=C+1|0}while(!(C>>>0>ea>>>0));FFa(U);C=(ea|0)==0;Q=c[sa>>2]|0;if(!C){da=Q;F=1;do{aa=da;da=c[sa+(F<<2)>>2]|0;F=F+1|0;if(aa>>>0>da>>>0){ta=sa;break j}}while(!(F>>>0>ea>>>0))}F=(c[sa+(ea<<2)>>2]|0)-Q|0;da=S+4|0;c[da>>2]=dEa(L,4,0,$,0,h)|0;if((c[h>>2]|0)!=0){ta=sa;break}aa=ZDa(L,F,h)|0;c[c[da>>2]>>2]=aa;if((c[h>>2]|0)!=0){ta=sa;break}aa=uFa(U,(c[sa>>2]|0)+(c[H>>2]|0)|0)|0;c[h>>2]=aa;if((aa|0)!=0){ta=sa;break}aa=vFa(U,c[c[da>>2]>>2]|0,F)|0;c[h>>2]=aa;if((aa|0)!=0){ta=sa;break}do{if(!C){aa=1;do{F=aa+ -1|0;ba=c[da>>2]|0;c[ba+(aa<<2)>>2]=(c[ba+(F<<2)>>2]|0)+((c[sa+(aa<<2)>>2]|0)-(c[sa+(F<<2)>>2]|0));aa=aa+1|0}while(!(aa>>>0>ea>>>0));if((E|0)<0){break}else{ua=0}do{aa=ua;ua=ua+1|0;ld[c[J>>2]&255](c[(c[da>>2]|0)+(aa<<2)>>2]|0,(c[sa+(ua<<2)>>2]|0)-(c[sa+(aa<<2)>>2]|0)|0,4330)}while((ua|0)!=(ea|0))}}while(0);c[S>>2]=ea;I=I+1|0;if((I|0)>=(c[y>>2]|0)){va=sa;break i}else{z=ra;B=sa;S=S+8|0}}if((O|0)==105){c[h>>2]=160;ta=B}else if((O|0)==108){c[h>>2]=160;ta=B}S=c[D>>2]|0;if((S|0)==0){va=ta}else{if((c[y>>2]|0)>0){z=S;I=0;while(1){J=c[z+(I<<3)+4>>2]|0;if((J|0)==0){wa=0}else{aEa(L,c[J>>2]|0);c[c[(c[D>>2]|0)+(I<<3)+4>>2]>>2]=0;wa=c[(c[D>>2]|0)+(I<<3)+4>>2]|0}aEa(L,wa);c[(c[D>>2]|0)+(I<<3)+4>>2]=0;I=I+1|0;J=c[D>>2]|0;if((I|0)>=(c[y>>2]|0)){xa=J;break}else{z=J}}}else{xa=S}aEa(L,xa);c[D>>2]=0;va=ta}}else{va=0}}while(0);aEa(L,va);c[m>>2]=c[h>>2];break}c[m>>2]=ka}else{N=x;O=37}}while(0);if((O|0)==37){c[m>>2]=N}N=l+76|0;if((c[N>>2]|0)!=0){DFa(c[u>>2]|0,N)}Rc[c[l+24>>2]&1023](l);l=c[m>>2]|0;if((l|0)!=0|(g|0)<0){p=l;i=j;return p|0}if((g|0)!=0){p=6;i=j;return p|0}g=f+140|0;l=g+24|0;c[f+16>>2]=c[g+156>>2];c[f+36>>2]=0;c[f+4>>2]=0;c[f+8>>2]=(a[g+48>>0]|0)==0?2065:2069;m=c[g+36>>2]|0;N=f+20|0;c[N>>2]=m;u=f+24|0;c[u>>2]=1284040;k:do{if((m|0)==0){x=c[g>>2]|0;if((x|0)!=0){c[N>>2]=x}}else{x=c[g+32>>2]|0;if((x|0)!=0?(ka=a[x>>0]|0,!(ka<<24>>24==0)):0){h=ka;ka=m;va=x;l:while(1){x=h<<24>>24==0;ta=ka;while(1){xa=a[ta>>0]|0;if(h<<24>>24==xa<<24>>24){O=142;break}if(h<<24>>24==45|h<<24>>24==32){ya=ta;break}if(xa<<24>>24==0){break l}else if(!(xa<<24>>24==45|xa<<24>>24==32)){break k}if(x){break k}else{ta=ta+1|0}}if((O|0)==142){O=0;ya=ta+1|0}x=va+1|0;h=a[x>>0]|0;if(h<<24>>24==0){break k}else{ka=ya;va=x}}c[u>>2]=va}}}while(0);u=f+12|0;ya=(c[g+44>>2]|0)!=0&1;c[u>>2]=ya;O=c[g+40>>2]|0;do{if((O|0)!=0){if((R2a(O,1284048)|0)!=0?(R2a(O,1284056)|0)!=0:0){break}c[u>>2]=ya|2}}while(0);c[f+28>>2]=0;c[f+32>>2]=0;c[f+52>>2]=c[g+56>>2]>>16;ya=c[g+60>>2]>>16;c[f+56>>2]=ya;c[f+60>>2]=(c[g+64>>2]|0)+65535>>16;u=(c[g+68>>2]|0)+65535>>16;c[f+64>>2]=u;O=f+68|0;m=b[O>>1]|0;if(m<<16>>16==0){b[O>>1]=1e3;za=1e3}else{za=m}b[f+70>>1]=u;b[f+72>>1]=ya;m=(((za&65535)*12|0)>>>0)/10|0;za=u-ya|0;b[f+74>>1]=(m<<16>>16|0)<(za|0)?za:m;b[f+80>>1]=b[l+26>>1]|0;b[f+82>>1]=b[g+52>>1]|0;p=0;i=j;return p|0}function jRa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;b=i;if((a|0)==0){i=b;return}d=a+140|0;e=d+24|0;f=c[a+100>>2]|0;g=a+316|0;h=c[g>>2]|0;j=d+160|0;if((h|0)!=0){k=c[j>>2]|0;if((k|0)>0){l=h;m=k;k=0;while(1){n=l+(k<<3)+4|0;o=c[n>>2]|0;if((o|0)==0){p=m;q=l}else{aEa(f,c[o>>2]|0);c[c[n>>2]>>2]=0;aEa(f,c[n>>2]|0);c[n>>2]=0;p=c[j>>2]|0;q=c[g>>2]|0}k=k+1|0;if((k|0)>=(p|0)){r=q;break}else{l=q;m=p}}}else{r=h}aEa(f,r);c[g>>2]=0}aEa(f,c[e>>2]|0);c[e>>2]=0;e=d+28|0;aEa(f,c[e>>2]|0);c[e>>2]=0;e=d+32|0;aEa(f,c[e>>2]|0);c[e>>2]=0;e=d+36|0;aEa(f,c[e>>2]|0);c[e>>2]=0;e=d+40|0;aEa(f,c[e>>2]|0);c[e>>2]=0;e=d+164|0;aEa(f,c[e>>2]|0);c[e>>2]=0;c[j>>2]=0;aEa(f,c[d>>2]|0);c[d>>2]=0;j=d+12|0;aEa(f,c[j>>2]|0);c[j>>2]=0;j=d+16|0;aEa(f,c[j>>2]|0);c[j>>2]=0;c[a+20>>2]=0;c[a+24>>2]=0;j=a+324|0;aEa(f,c[j>>2]|0);c[j>>2]=0;j=a+328|0;aEa(f,c[j>>2]|0);c[j>>2]=0;i=b;return}function kRa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+16|0;d=b;e=sRa(c[a>>2]|0)|0;if((e|0)==0){f=0;i=b;return f|0}g=c[a>>2]|0;h=Qc[c[e>>2]&255](c[g+100>>2]|0,(c[g+304>>2]|0)+((c[g+4>>2]|0)*252|0)|0,d)|0;if((h|0)!=0){f=h;i=b;return f|0}c[a+40>>2]=c[d>>2];f=0;i=b;return f|0}function lRa(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+40|0;if((c[d>>2]|0)==0){i=b;return}e=sRa(c[a>>2]|0)|0;if((e|0)!=0){Rc[c[e+8>>2]&1023](c[d>>2]|0)}c[d>>2]=0;i=b;return}function mRa(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a+4>>2]|0;e=c[d+320>>2]|0;if((e|0)==0){i=b;return 0}f=gFa(c[(c[d+96>>2]|0)+4>>2]|0,1284024)|0;if((f|0)==0){i=b;return 0}d=Lc[c[e+4>>2]&255](f)|0;c[(c[a+156>>2]|0)+36>>2]=d;i=b;return 0}function nRa(a){a=a|0;c[(c[a+156>>2]|0)+36>>2]=0;return}function oRa(d,f,g,h){d=d|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;j=i;i=i+2576|0;k=j+40|0;l=j+24|0;m=j+8|0;n=j;o=c[d+4>>2]|0;p=c[o+136>>2]|0;if(!((c[o+16>>2]|0)>>>0>g>>>0)){q=6;i=j;return q|0}r=(h&1024|0)==0?h:h|3;h=d+164|0;c[h>>2]=c[f+16>>2];s=d+168|0;c[s>>2]=c[f+20>>2];t=d+108|0;b[d+110>>1]=0;b[t>>1]=0;u=(r&1|0)==0;if(u){v=(r>>>1&1^1)&255}else{v=0}w=d+72|0;c[w>>2]=1869968492;x=p+12|0;p=Hc[c[c[x>>2]>>2]&7](k,o,f,d,0,0,v,r>>>16&15,294)|0;if((p|0)!=0){q=p;i=j;return q|0}p=r&1024;a[k+69>>0]=p>>>10;y=qRa(k,g)|0;if((y|0)!=0){q=y;i=j;return q|0}y=(p|0)==0;p=k+2400|0;c[l+0>>2]=c[p+0>>2];c[l+4>>2]=c[p+4>>2];c[l+8>>2]=c[p+8>>2];c[l+12>>2]=c[p+12>>2];p=c[k+2416>>2]|0;g=c[k+2420>>2]|0;Rc[c[(c[x>>2]|0)+4>>2]&1023](k);x=d+124|0;c[x>>2]=c[x>>2]&1|4;if(!y){y=c[d+156>>2]|0;c[d+32>>2]=(KDa(c[k+32>>2]|0)|0)>>16;c[d+40>>2]=(KDa(c[k+40>>2]|0)|0)>>16;z=y+12|0;c[z+0>>2]=c[l+0>>2];c[z+4>>2]=c[l+4>>2];c[z+8>>2]=c[l+8>>2];c[z+12>>2]=c[l+12>>2];c[y+28>>2]=p;c[y+32>>2]=g;a[y+8>>0]=1;q=0;i=j;return q|0}y=d+24|0;z=(KDa(c[k+40>>2]|0)|0)>>16;A=d+40|0;c[A>>2]=z;c[d+56>>2]=z;a[(c[d+156>>2]|0)+8>>0]=0;z=o+140|0;o=(c[z+68>>2]|0)-(c[z+60>>2]|0)>>16;z=d+52|0;c[z>>2]=o;c[d+60>>2]=o;c[w>>2]=1869968492;if((e[f+14>>1]|0)<24){c[x>>2]=c[x>>2]|256}wEa(t,l);xEa(t,p,g);c[n>>2]=c[A>>2];x=n+4|0;c[x>>2]=0;yEa(n,l);c[A>>2]=(c[n>>2]|0)+p;c[n>>2]=0;c[x>>2]=c[z>>2];yEa(n,l);l=(c[x>>2]|0)+g|0;c[z>>2]=l;if(u){u=c[k+16>>2]|0;g=c[u+4>>2]|0;x=c[h>>2]|0;h=c[s>>2]|0;if(!(v<<24>>24==0)?(c[k+72>>2]|0)!=0:0){B=l}else{k=b[u+2>>1]|0;if(k<<16>>16>0){u=k<<16>>16;k=g;while(1){c[k>>2]=SDa(c[k>>2]|0,x)|0;g=k+4|0;c[g>>2]=SDa(c[g>>2]|0,h)|0;u=u+ -1|0;if((u|0)<=0){break}else{k=k+8|0}}B=c[z>>2]|0}else{B=l}}c[A>>2]=SDa(c[A>>2]|0,x)|0;c[z>>2]=SDa(B,h)|0}qFa(t,m);t=c[m>>2]|0;c[y>>2]=(c[m+8>>2]|0)-t;h=c[m+12>>2]|0;c[d+28>>2]=h-(c[m+4>>2]|0);c[d+32>>2]=t;c[d+36>>2]=h;if((r&16|0)==0){q=0;i=j;return q|0}MEa(y,c[z>>2]|0);q=0;i=j;return q|0}function pRa(a,b){a=a|0;b=b|0;var d=0;d=i;PEa(c[a>>2]|0,b);b=sRa(c[a>>2]|0)|0;if((b|0)==0){i=d;return 0}ed[c[b+4>>2]&127](c[a+40>>2]|0,c[a+16>>2]|0,c[a+20>>2]|0,0,0)|0;i=d;return 0}function qRa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;d=i;i=i+32|0;e=d+28|0;f=d+24|0;g=d+16|0;h=d;j=c[a+4>>2]|0;k=j+140|0;l=c[j+328>>2]|0;c[f>>2]=0;m=c[j+100>>2]|0;n=c[j+136>>2]|0;o=c[(c[j+128>>2]|0)+48>>2]|0;p=(o|0)!=0;if(p){q=o+4|0;r=Qc[c[c[o>>2]>>2]&255](c[q>>2]|0,b,g)|0;c[f>>2]=r;if((r|0)!=0){s=r;i=d;return s|0}c[e>>2]=c[g>>2];r=k+148|0;t=rRa(e,c[r>>2]&255)|0;u=c[g+4>>2]|0;if((u|0)!=0){v=u-(c[r>>2]|0)|0;u=ZDa(m,v,f)|0;w=c[f>>2]|0;if((w|0)==0){c3a(u|0,(c[g>>2]|0)+(c[r>>2]|0)|0,v|0)|0;x=0;y=u;z=v}else{x=w;y=u;z=v}}else{x=0;y=0;z=0}Ic[c[(c[o>>2]|0)+4>>2]&511](c[q>>2]|0,g);if((x|0)==0){A=y;B=t;C=z}else{s=x;i=d;return s|0}}else{x=k+148|0;z=k+152|0;t=(c[z>>2]|0)+(c[x>>2]|0)|0;y=k+168|0;g=uFa(l,(c[k+144>>2]|0)+(c[y>>2]|0)+(ca(t,b)|0)|0)|0;c[f>>2]=g;if((g|0)!=0){s=g;i=d;return s|0}g=CFa(l,t<<1)|0;c[f>>2]=g;if((g|0)!=0){s=g;i=d;return s|0}c[e>>2]=c[l+32>>2];g=rRa(e,c[x>>2]&255)|0;t=rRa(e,c[z>>2]&255)|0;c[e>>2]=(c[e>>2]|0)+(c[x>>2]|0);x=rRa(e,c[z>>2]&255)|0;z=x-t|0;FFa(l);if(!(g>>>0<(c[k+160>>2]|0)>>>0)){c[f>>2]=9;s=9;i=d;return s|0}if((x|0)==(t|0)){s=0;i=d;return s|0}x=ZDa(m,z,f)|0;e=c[f>>2]|0;if((e|0)!=0){s=e;i=d;return s|0}e=AFa(l,(c[y>>2]|0)+t|0,x,z)|0;c[f>>2]=e;if((e|0)==0){A=x;B=g;C=z}else{s=e;i=d;return s|0}}e=c[j+316>>2]|0;c[a+2388>>2]=c[e+(B<<3)>>2];c[a+2392>>2]=c[e+(B<<3)+4>>2];c[a+2396>>2]=0;e=c[k+164>>2]|0;k=a+2400|0;j=e+(B*252|0)+216|0;c[k+0>>2]=c[j+0>>2];c[k+4>>2]=c[j+4>>2];c[k+8>>2]=c[j+8>>2];c[k+12>>2]=c[j+12>>2];j=e+(B*252|0)+232|0;k=c[j+4>>2]|0;z=a+2416|0;c[z>>2]=c[j>>2];c[z+4>>2]=k;k=c[e+(B*252|0)+4>>2]|0;c[a+2384>>2]=k;B=(k|0)>-1;e=B?k:0;if(B){ld[c[n+16>>2]&255](A,C,4330)}n=Qc[c[a+2508>>2]&255](a,A+e|0,C-e|0)|0;c[f>>2]=n;aEa(m,A);if((n|0)!=0|p^1){s=n;i=d;return s|0}if((c[(c[o>>2]|0)+8>>2]|0)==0){s=0;i=d;return s|0}n=a+32|0;c[h>>2]=(KDa(c[n>>2]|0)|0)>>16;c[h+4>>2]=0;p=a+40|0;A=h+8|0;c[A>>2]=(KDa(c[p>>2]|0)|0)>>16;m=a+44|0;a=h+12|0;c[a>>2]=(KDa(c[m>>2]|0)|0)>>16;e=id[c[(c[o>>2]|0)+8>>2]&511](c[o+4>>2]|0,b,0,h)|0;c[f>>2]=e;c[n>>2]=c[h>>2]<<16;c[p>>2]=c[A>>2]<<16;c[m>>2]=c[a>>2]<<16;s=e;i=d;return s|0}function rRa(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;f=c[a>>2]|0;if(b<<24>>24==0){g=f;h=0;c[a>>2]=g;i=e;return h|0}j=(b+ -1<<24>>24&255)+1|0;k=b;b=f;l=0;while(1){l=d[b>>0]|0|l<<8;k=k+ -1<<24>>24;if(k<<24>>24==0){break}else{b=b+1|0}}g=f+j|0;h=l;c[a>>2]=g;i=e;return h|0}function sRa(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a+320>>2]|0;e=gFa(c[(c[a+96>>2]|0)+4>>2]|0,1284024)|0;if((e|0)==0|(d|0)==0){f=0;i=b;return f|0}a=c[d>>2]|0;if((a|0)==0){f=0;i=b;return f|0}f=Lc[a&255](e)|0;i=b;return f|0}function tRa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+16|0;e=d;f=c[a+100>>2]|0;c[e>>2]=0;g=Lc[c[b+36>>2]&255](b)|0;b=a+304|0;if((c[b>>2]|0)!=0){h=0;i=d;return h|0}j=dEa(f,252,0,g,0,e)|0;c[b>>2]=j;f=c[e>>2]|0;if((f|0)!=0){h=f;i=d;return h|0}f=a+300|0;c[f>>2]=g;if((g|0)>0){k=j;l=0}else{h=0;i=d;return h|0}while(1){c[k+(l*252|0)+4>>2]=4;j=l+1|0;if((j|0)>=(c[f>>2]|0)){h=0;break}k=c[b>>2]|0;l=j}i=d;return h|0}function uRa(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=i;i=i+32|0;f=e;g=c[d+96>>2]|0;if(!((g|0)>-1)){i=e;return 0}if((g|0)>=(c[a+300>>2]|0)){i=e;return 0}h=c[a+304>>2]|0;id[c[d+52>>2]&511](d,6,f,3)|0;d=f+12|0;j=c[d>>2]|0;k=(j|0)<0?0-j|0:j;b[a+68>>1]=TDa(1e3,k)|0;if((k|0)==65536){l=f+8|0;m=f+16|0;n=f+20|0;o=f+4|0;p=c[f>>2]|0}else{a=TDa(c[f>>2]|0,k)|0;c[f>>2]=a;j=f+4|0;c[j>>2]=TDa(c[j>>2]|0,k)|0;q=f+8|0;c[q>>2]=TDa(c[q>>2]|0,k)|0;r=f+16|0;c[r>>2]=TDa(c[r>>2]|0,k)|0;s=f+20|0;c[s>>2]=TDa(c[s>>2]|0,k)|0;c[d>>2]=65536;l=q;m=r;n=s;o=j;p=a}c[h+(g*252|0)+216>>2]=p;c[h+(g*252|0)+224>>2]=c[o>>2];c[h+(g*252|0)+220>>2]=c[l>>2];c[h+(g*252|0)+228>>2]=c[d>>2];c[h+(g*252|0)+232>>2]=c[m>>2]>>16;c[h+(g*252|0)+236>>2]=c[n>>2]>>16;i=e;return 0}function vRa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[b+96>>2]|0;if(!((e|0)>-1)){i=d;return 0}if((e|0)>=(c[a+300>>2]|0)){i=d;return 0}f=c[a+304>>2]|0;a=dd[c[b+40>>2]&511](b,0)|0;c[f+(e*252|0)+208>>2]=a;c[f+(e*252|0)+180>>2]=a;i=d;return 0}function wRa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=i;if((b|0)!=0){c[b>>2]=c[a+152>>2]}if((d|0)!=0){c[d>>2]=c[a+156>>2]}if((e|0)==0){i=f;return 0}c[e>>2]=c[a+160>>2];i=f;return 0}function xRa(b,c){b=b|0;c=c|0;if((c|0)!=0){a[c>>0]=1}return 0}function yRa(a,b,d){a=a|0;b=b|0;d=d|0;if((d|0)!=0){c[d>>2]=b}return 0}function zRa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+164|0;c[b+0>>2]=c[e+0>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];c[b+16>>2]=c[e+16>>2];c[b+20>>2]=c[e+20>>2];c[b+24>>2]=c[e+24>>2];c[b+28>>2]=c[e+28>>2];i=d;return 0}function ARa(a,c){a=a|0;c=c|0;b[c>>1]=b[a+312>>1]|0;return 0}function BRa(b){b=b|0;var d=0,e=0;d=i;e=c[b+140>>2]|0;if((e|0)==0){i=d;return 0}else{i=d;return((a[e>>0]|0)==47?e+1|0:e)|0}return 0}function CRa(b){b=b|0;c[b+28>>2]=1;a[b+32>>0]=0;return 0}function DRa(a){a=a|0;return}function ERa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=jEa(1287656,b)|0;if((e|0)==0){if(((a|0)!=0?(f=c[a+4>>2]|0,(f|0)!=0):0)?(a=gFa(f,1283992)|0,(a|0)!=0):0){g=dd[c[(c[a>>2]|0)+32>>2]&511](a,b)|0}else{g=0}}else{g=e}i=d;return g|0}function FRa(f,g,h,j,k){f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0;l=i;i=i+96|0;m=l+84|0;n=l+80|0;o=l+48|0;p=l+16|0;q=l+12|0;r=l;s=c[g+96>>2]|0;t=c[s+4>>2]|0;u=hFa(t,1283992)|0;if((u|0)==0){c[q>>2]=11;v=11;i=l;return v|0}w=iFa(s,1284e3)|0;s=hFa(t,1284024)|0;x=uFa(f,0)|0;c[q>>2]=x;if((x|0)!=0){v=x;i=l;return v|0}x=ed[c[u+4>>2]&127](f,g,h,j,k)|0;c[q>>2]=x;do{if((x|0)==0){y=c[g+148>>2]|0;if(!((y|0)==65536|(y|0)==1330926671)){c[q>>2]=2;v=2;i=l;return v|0}if((h|0)<0){v=0;i=l;return v|0}y=g+504|0;z=id[c[y>>2]&511](g,1751474532,f,0)|0;c[q>>2]=z;if((z|0)==0){z=ed[c[u+8>>2]&127](f,g,h,j,k)|0;c[q>>2]=z;if((z|0)==0){A=0}else{v=z;i=l;return v|0}}else{z=dd[c[u+32>>2]&511](g,f)|0;c[q>>2]=z;if((z|0)==0){A=1}else{v=z;i=l;return v|0}}z=id[c[y>>2]&511](g,1128678944,f,0)|0;c[q>>2]=z;if((z|0)==0){B=A;C=1}else{v=z;i=l;return v|0}}else{z=uFa(f,0)|0;c[q>>2]=z;if((z|0)==0){c[q>>2]=0;B=1;C=0;break}else{v=z;i=l;return v|0}}}while(0);A=c[g+100>>2]|0;u=ZDa(A,2980,q)|0;k=c[q>>2]|0;if((k|0)!=0){v=k;i=l;return v|0}c[g+652>>2]=u;k=f+28|0;j=c[k>>2]|0;f3a(u|0,0,2980)|0;c[o+0>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[o+16>>2]=0;c[o+20>>2]=0;c[o+24>>2]=0;c[o+28>>2]=0;c[u>>2]=f;c[u+4>>2]=j;x=u+1324|0;z=zFa(c[f+8>>2]|0)|0;y=LFa(f,1284072,u)|0;c[n>>2]=y;a:do{if((y|0)==0){if(((a[u+16>>0]|0)==1?(D=a[u+18>>0]|0,E=D&255,!((D&255)<4)):0)?(d[u+19>>0]|0)<=4:0){D=wFa(f,E+ -4|0)|0;c[n>>2]=D;if((D|0)!=0){break}D=fSa(u+20|0,f,0)|0;c[n>>2]=D;if((D|0)!=0){break}D=u+1208|0;E=fSa(D,f,0)|0;c[n>>2]=E;if((E|0)!=0){break}E=fSa(o,f,1)|0;c[n>>2]=E;if((E|0)!=0){break}E=u+84|0;F=fSa(E,f,1)|0;c[n>>2]=F;if((F|0)!=0){break}F=gSa(o,u+1316|0,u+1320|0)|0;c[n>>2]=F;if((F|0)!=0){break}c[u+1312>>2]=c[o+8>>2];F=c[u+28>>2]|0;do{if(B<<24>>24==0){if(F>>>0>1){c[n>>2]=3;break a}else{G=0}}else{if((F|0)>(h|0)){c[u+8>>2]=F;G=h;break}else{c[n>>2]=6;break a}}}while(0);if((h|0)<0){break}F=hSa(x,D,G,f,z,t)|0;c[n>>2]=F;if((F|0)!=0){break}F=u+1436|0;H=uFa(f,(c[F>>2]|0)+z|0)|0;c[n>>2]=H;if((H|0)!=0){break}H=fSa(u+1176|0,f,0)|0;c[n>>2]=H;if((H|0)!=0){break}H=u+1456|0;if((c[H>>2]|0)!=65535){I=uFa(f,(c[u+1488>>2]|0)+z|0)|0;c[n>>2]=I;if((I|0)!=0){break}I=fSa(p,f,0)|0;c[n>>2]=I;if((I|0)!=0){break}I=p+8|0;J=c[I>>2]|0;b:do{if(!(J>>>0>256)){c[u+1896>>2]=J;K=dEa(j,572,0,J,0,n)|0;if((c[n>>2]|0)!=0){break}L=c[I>>2]|0;if((L|0)!=0){M=0;do{c[u+(M<<2)+1900>>2]=K+(M*572|0);M=M+1|0}while((M|0)!=(L|0));N=0;do{L=hSa(c[u+(N<<2)+1900>>2]|0,p,N,f,z,t)|0;c[n>>2]=L;N=N+1|0;if((L|0)!=0){break b}}while(N>>>0<(c[I>>2]|0)>>>0)}L=c[u+1184>>2]|0;M=uFa(f,(c[u+1492>>2]|0)+z|0)|0;c[m>>2]=M;do{if((M|0)==0){K=JFa(f,m)|0;O=c[m>>2]|0;if((O|0)!=0){P=O;break}a[u+2924>>0]=K;c[u+2944>>2]=0;O=K&255;if((O|0)==0){c[u+2936>>2]=L;Q=L}else if((O|0)==3){O=xFa(f,m)|0;K=c[m>>2]|0;if((K|0)!=0){P=K;break}K=((O&65535)*3|0)+2|0;c[u+2936>>2]=K;Q=K}else{c[m>>2]=3;P=3;break}K=BFa(f,Q,u+2932|0)|0;c[m>>2]=K;P=K}else{P=M}}while(0);c[n>>2]=P}}while(0);_Ra(p);if((c[n>>2]|0)!=0){break}}else{c[u+1896>>2]=0}if((c[F>>2]|0)==0){c[n>>2]=3;break}I=u+12|0;c[I>>2]=c[u+1184>>2];J=gSa(E,u+1308|0,0)|0;c[n>>2]=J;if((J|0)!=0){break}J=c[I>>2]|0;c:do{if((J|0)!=0){if((c[H>>2]|0)==65535){R=0}else{R=B<<24>>24!=0&1}D=u+1152|0;M=c[u+1428>>2]|0;L=c[k>>2]|0;c[m>>2]=0;d:do{if(M>>>0>2){K=M+z|0;O=u+1156|0;c[O>>2]=K;S=uFa(f,K)|0;c[m>>2]=S;if((S|0)!=0){T=O;U=102;break}c[D>>2]=(JFa(f,m)|0)&255;if((c[m>>2]|0)!=0){T=O;U=102;break}S=dEa(L,2,0,J,0,m)|0;K=u+1160|0;c[K>>2]=S;if((c[m>>2]|0)!=0){T=O;U=102;break}b[S>>1]=0;S=c[D>>2]|0;if((S|0)==0){V=CFa(f,(J<<1)+ -2|0)|0;c[m>>2]=V;if((V|0)!=0){T=O;U=102;break}if(J>>>0>1){V=1;do{W=HFa(f)|0;b[(c[K>>2]|0)+(V<<1)>>1]=W;V=V+1|0}while((V|0)!=(J|0))}FFa(f);U=96;break}else if((S|0)==2|(S|0)==1){if(J>>>0>1){X=1}else{U=96;break}while(1){V=xFa(f,m)|0;if((c[m>>2]|0)!=0){T=O;U=102;break d}if((c[D>>2]|0)==2){W=(xFa(f,m)|0)&65535;if((c[m>>2]|0)==0){Y=W}else{T=O;U=102;break d}}else{W=(JFa(f,m)|0)&255;if((c[m>>2]|0)==0){Y=W}else{T=O;U=102;break d}}W=V&65535;if(X>>>0<J>>>0){Z=X-J|0;_=~(W>>>0>(Y^65535)>>>0?W^65535:Y);W=Z>>>0>_>>>0?Z:_;_=0-W|0;Z=V;V=0;$=X;while(1){b[(c[K>>2]|0)+($<<1)>>1]=Z;V=V+1|0;if((V|0)==(_|0)){break}else{Z=Z+1<<16>>16;$=$+1|0}}aa=X-W|0}else{aa=X}if(aa>>>0<J>>>0){X=aa}else{U=96;break}}}else{c[m>>2]=3;T=O;U=102;break}}else{K=u+1156|0;c[K>>2]=M;if((M|0)==0){if(J>>>0>229){c[m>>2]=3;T=K;U=102;break}S=dEa(L,2,0,J,0,m)|0;c[u+1160>>2]=S;if((c[m>>2]|0)!=0){T=K;U=102;break}c3a(S|0,1285120,J<<1|0)|0;U=96;break}else if((M|0)==1){if(J>>>0>166){c[m>>2]=3;T=K;U=102;break}S=dEa(L,2,0,J,0,m)|0;c[u+1160>>2]=S;if((c[m>>2]|0)!=0){T=K;U=102;break}c3a(S|0,1285584,J<<1|0)|0;U=96;break}else if((M|0)==2){if(J>>>0>87){c[m>>2]=3;T=K;U=102;break}S=dEa(L,2,0,J,0,m)|0;c[u+1160>>2]=S;if((c[m>>2]|0)!=0){T=K;U=102;break}c3a(S|0,1285920,J<<1|0)|0;U=96;break}else{c[m>>2]=3;T=K;U=102;break}}}while(0);do{if((U|0)==96){if(R<<24>>24==0){ba=c[m>>2]|0}else{M=iSa(D,J,L)|0;c[m>>2]=M;ba=M}if((ba|0)==0){c[n>>2]=0;break}else{T=u+1156|0;U=102;break}}}while(0);if((U|0)==102?(M=u+1160|0,aEa(L,c[M>>2]|0),c[M>>2]=0,K=u+1164|0,aEa(L,c[K>>2]|0),c[K>>2]=0,c[D>>2]=0,c[T>>2]=0,c[M>>2]=0,M=c[m>>2]|0,c[n>>2]=M,(M|0)!=0):0){break a}if((c[H>>2]|0)!=65535){break}M=c[I>>2]|0;K=c[u+1432>>2]|0;c[m>>2]=0;S=u+1160|0;e:do{if((c[S>>2]|0)==0){c[m>>2]=3;ca=3}else{$=0;do{b[u+($<<1)+128>>1]=0;b[u+($<<1)+640>>1]=0;$=$+1|0}while(($|0)!=256);do{if(K>>>0>1){$=K+z|0;c[u+120>>2]=$;O=uFa(f,$)|0;c[m>>2]=O;if((O|0)!=0){ca=O;break e}O=u+116|0;c[O>>2]=(JFa(f,m)|0)&255;$=c[m>>2]|0;if(($|0)!=0){ca=$;break e}$=JFa(f,m)|0;Z=$&255;_=c[m>>2]|0;if((_|0)!=0){ca=_;break e}_=c[O>>2]&127;do{if((_|0)==1){V=u+124|0;c[V>>2]=0;if($<<24>>24==0){break}else{da=1;ea=0}do{fa=(JFa(f,m)|0)&255;ga=c[m>>2]|0;if((ga|0)!=0){ca=ga;break e}ga=JFa(f,m)|0;ha=c[m>>2]|0;if((ha|0)!=0){ca=ha;break e}ha=ga&255;ga=ha+1|0;if(ga>>>0>(c[V>>2]|0)>>>0){c[V>>2]=ga}ia=da;da=ga+da|0;if(ia>>>0<da>>>0){ga=ia+1+ha|0;ha=fa;fa=ia;while(1){if(fa>>>0<M>>>0&ha>>>0<256){b[u+(ha<<1)+640>>1]=fa;b[u+(ha<<1)+128>>1]=b[(c[S>>2]|0)+(fa<<1)>>1]|0}fa=fa+1|0;if((fa|0)==(ga|0)){break}else{ha=ha+1|0}}}ea=ea+1|0}while(ea>>>0<Z>>>0);if(!((c[V>>2]|0)>>>0>256)){break}c[V>>2]=256}else if((_|0)==0){c[u+124>>2]=Z+1;ha=CFa(f,Z)|0;c[m>>2]=ha;if((ha|0)!=0){ca=ha;break e}if(!($<<24>>24==0)){ha=1;ga=c[f+32>>2]|0;while(1){fa=d[ga>>0]|0;if(ha>>>0<M>>>0){b[u+(fa<<1)+640>>1]=ha;b[u+(fa<<1)+128>>1]=b[(c[S>>2]|0)+(ha<<1)>>1]|0}ha=ha+1|0;if(ha>>>0>Z>>>0){break}else{ga=ga+1|0}}}FFa(f)}else{c[m>>2]=3;ca=3;break e}}while(0);if((c[O>>2]&128|0)==0){Z=c[m>>2]|0;c[n>>2]=Z;if((Z|0)==0){break c}else{break a}}Z=JFa(f,m)|0;$=Z&255;_=c[m>>2]|0;if((_|0)!=0){ca=_;break e}if(Z<<24>>24==0){break}Z=(M|0)==0;_=0;do{W=(JFa(f,m)|0)&255;ga=c[m>>2]|0;if((ga|0)!=0){ca=ga;break e}ga=xFa(f,m)|0;ha=c[m>>2]|0;if((ha|0)!=0){ca=ha;break e}b[u+(W<<1)+128>>1]=ga;f:do{if(!Z){ha=c[S>>2]|0;V=0;while(1){fa=V+1|0;if((b[ha+(V<<1)>>1]|0)==ga<<16>>16){break}if(fa>>>0<M>>>0){V=fa}else{break f}}b[u+(W<<1)+640>>1]=V}}while(0);_=_+1|0}while(_>>>0<$>>>0)}else{if((K|0)==0){c3a(u+128|0,1284096,512)|0}else if((K|0)==1){c3a(u+128|0,1284608,512)|0}else{c[m>>2]=3;ca=3;break e}$=u+124|0;c[$>>2]=0;_=iSa(D,M,c[k>>2]|0)|0;c[m>>2]=_;if((_|0)==0){ja=0}else{ca=_;break e}while(1){_=u+(ja<<1)+128|0;Z=b[_>>1]|0;do{if(Z<<16>>16==0){U=152}else{O=jSa(D,Z&65535)|0;if((O|0)==0){U=152;break}b[u+(ja<<1)+640>>1]=O;O=ja+1|0;c[$>>2]=O;ka=O}}while(0);if((U|0)==152){U=0;b[u+(ja<<1)+640>>1]=0;b[_>>1]=0;ka=ja+1|0}if((ka|0)==256){break}else{ja=ka}}}}while(0);c[n>>2]=0;break c}}while(0);c[n>>2]=ca;break a}}while(0);c[u+1304>>2]=aSa(u,G)|0;break}c[n>>2]=2}}while(0);_Ra(o);o=c[n>>2]|0;c[q>>2]=o;if((o|0)!=0){v=o;i=l;return v|0}c[u+2952>>2]=s;c[u+2956>>2]=w;c[g+4>>2]=h;s=g+16|0;c[s>>2]=c[u+12>>2];o=u+1456|0;if((c[o>>2]|0)==65535&(w|0)==0){c[q>>2]=11;v=11;i=l;return v|0}w=u+1388|0;if((a[w>>0]|0)==0){if(B<<24>>24==0){la=e[g+68>>1]|0}else{la=1e3}n=u+1392|0;c[n>>2]=la;ma=n}else{ma=u+1392|0}n=u+1372|0;la=u+1396|0;G=u+1384|0;ca=c[G>>2]|0;ka=(ca|0)<0?0-ca|0:ca;if((ka|0)==65536){na=la;oa=c[la>>2]|0;pa=c[u+1400>>2]|0}else{c[ma>>2]=TDa(c[ma>>2]|0,ka)|0;c[n>>2]=TDa(c[n>>2]|0,ka)|0;ca=u+1380|0;c[ca>>2]=TDa(c[ca>>2]|0,ka)|0;ca=u+1376|0;c[ca>>2]=TDa(c[ca>>2]|0,ka)|0;c[G>>2]=TDa(c[G>>2]|0,ka)|0;G=TDa(c[la>>2]|0,ka)|0;c[la>>2]=G;ca=u+1400|0;ja=TDa(c[ca>>2]|0,ka)|0;c[ca>>2]=ja;na=la;oa=G;pa=ja}c[na>>2]=oa>>16;c[u+1400>>2]=pa>>16;pa=c[u+1896>>2]|0;if((pa|0)!=0){oa=u+1900|0;na=pa;do{na=na+ -1|0;pa=c[oa+(na<<2)>>2]|0;do{if((a[pa+64>>0]|0)==0){ja=pa+48|0;c[ja+0>>2]=c[n+0>>2];c[ja+4>>2]=c[n+4>>2];c[ja+8>>2]=c[n+8>>2];c[ja+12>>2]=c[n+12>>2];ja=pa+72|0;G=la;ca=c[G+4>>2]|0;ka=ja;c[ka>>2]=c[G>>2];c[ka+4>>2]=ca;ca=pa+68|0;c[ca>>2]=c[ma>>2];qa=ja;ra=ca}else{if((a[w>>0]|0)==0){qa=pa+72|0;ra=pa+68|0;break}ca=c[ma>>2]|0;ja=pa+68|0;if(ca>>>0>1?(ka=c[ja>>2]|0,ka>>>0>1):0){sa=ca>>>0<ka>>>0?ca:ka}else{sa=1}UDa(n,pa+48|0,sa);ka=pa+72|0;VDa(ka,n,sa);c[ja>>2]=ODa(c[ja>>2]|0,c[ma>>2]|0,sa)|0;qa=ka;ra=ja}}while(0);ja=pa+60|0;ka=c[ja>>2]|0;ca=(ka|0)<0?0-ka|0:ka;if((ca|0)==65536){ta=qa;ua=c[pa+76>>2]|0}else{c[ra>>2]=TDa(c[ra>>2]|0,ca)|0;ka=pa+48|0;c[ka>>2]=TDa(c[ka>>2]|0,ca)|0;ka=pa+56|0;c[ka>>2]=TDa(c[ka>>2]|0,ca)|0;ka=pa+52|0;c[ka>>2]=TDa(c[ka>>2]|0,ca)|0;c[ja>>2]=TDa(c[ja>>2]|0,ca)|0;c[qa>>2]=TDa(c[qa>>2]|0,ca)|0;ja=pa+76|0;ka=TDa(c[ja>>2]|0,ca)|0;c[ja>>2]=ka;ta=qa;ua=ka}c[ta>>2]=c[ta>>2]>>16;c[pa+76>>2]=ua>>16}while((na|0)!=0)}na=B<<24>>24==0;if(!na){c[g>>2]=c[u+8>>2];if((c[o>>2]|0)==65535){va=c[u+1184>>2]|0}else{va=(c[u+1168>>2]|0)+1|0}c[s>>2]=va;c[g+52>>2]=c[u+1408>>2]>>16;va=c[u+1412>>2]>>16;c[g+56>>2]=va;c[g+60>>2]=(c[u+1416>>2]|0)+65535>>16;s=(c[u+1420>>2]|0)+65535>>16;c[g+64>>2]=s;B=c[ma>>2]|0;b[g+68>>1]=B;b[g+70>>1]=s;b[g+72>>1]=va;ma=(((B&65535)*12|0)>>>0)/10|0;B=s-va|0;b[g+74>>1]=(ma<<16>>16|0)<(B|0)?B:ma;b[g+80>>1]=(c[u+1356>>2]|0)>>>16;b[g+82>>1]=(c[u+1360>>2]|0)>>>16;ma=aSa(u,h)|0;h=g+20|0;c[h>>2]=ma;g:do{if((ma|0)==0){B=YRa(u,c[u+1496>>2]|0)|0;if((B|0)==0){U=220}else{c[h>>2]=bSa(A,B)|0;U=220}}else{B=YRa(u,c[u+1336>>2]|0)|0;va=c[h>>2]|0;s=Y2a(va|0)|0;ua=va+6|0;h:do{if((s|0)>5){ta=va+1|0;qa=va+2|0;ra=va+3|0;sa=va+4|0;n=va+5|0;w=1;la=s+1|0;do{if((a[ua>>0]|0)!=43){break h}w=((a[n>>0]|0)+ -65<<24>>24&255)<26?((a[sa>>0]|0)+ -65<<24>>24&255)<26?((a[ra>>0]|0)+ -65<<24>>24&255)<26?((a[qa>>0]|0)+ -65<<24>>24&255)<26?((a[ta>>0]|0)+ -65<<24>>24&255)<26?((a[va>>0]|0)+ -65<<24>>24&255)<26?w:0:0:0:0:0:0;if(w<<24>>24==0){break h}if((la|0)>7){oa=7;do{a[va+(oa+ -7)>>0]=a[va+oa>>0]|0;oa=oa+1|0}while((oa|0)!=(la|0))}la=la+ -7|0}while((la|0)>6)}}while(0);ua=c[u+1340>>2]|0;if((ua|0)==0){wa=va}else{s=YRa(u,ua)|0;wa=(s|0)==0?va:s}if(!((B|0)==0|(wa|0)==0)?(s=a[B>>0]|0,!(s<<24>>24==0)):0){ua=s;s=wa;pa=B;i:while(1){la=ua<<24>>24==0;w=s;while(1){ta=a[w>>0]|0;if(ua<<24>>24==ta<<24>>24){U=202;break}if(ua<<24>>24==45|ua<<24>>24==32){xa=w;break}if(ta<<24>>24==0){break i}else if(!(ta<<24>>24==45|ta<<24>>24==32)){U=220;break g}if(la){U=220;break g}w=w+1|0}if((U|0)==202){U=0;xa=w+1|0}la=pa+1|0;ua=a[la>>0]|0;if(ua<<24>>24==0){U=220;break g}else{s=xa;pa=la}}s=bSa(A,pa)|0;ua=c[h>>2]|0;B=Y2a(ua|0)|0;va=Y2a(s|0)|0;j:do{if((B|0)>(va|0)){if((va|0)>=1){la=1;while(1){if((a[ua+(B-la)>>0]|0)!=(a[s+(va-la)>>0]|0)){break j}if((la|0)<(va|0)){la=la+1|0}else{break}}}la=B-va|0;w=la+ -1|0;if((w|0)>0){ya=la;za=w}else{U=218;break}while(1){w=a[ua+za>>0]|0;if(!(w<<24>>24==43|w<<24>>24==95|w<<24>>24==32|w<<24>>24==45)){break}w=za+ -1|0;if((w|0)>0){la=za;za=w;ya=la}else{U=218;break j}}a[ua+ya>>0]=0;U=218}else{U=218}}while(0);if((U|0)==218?(s|0)==0:0){U=220;break}c[g+24>>2]=s}else{U=220}}}while(0);if((U|0)==220){c[g+24>>2]=bSa(A,1284040)|0}A=C<<24>>24==0?2065:2073;c[g+8>>2]=(a[u+1348>>0]|0)==0?A:A|4;A=(c[u+1352>>2]|0)!=0&1;C=YRa(u,c[u+1344>>2]|0)|0;do{if((C|0)==0){Aa=A}else{if((R2a(C,1284048)|0)!=0?(R2a(C,1284056)|0)!=0:0){Aa=A;break}Aa=A|2}}while(0);do{if((Aa&2|0)==0?(A=c[g+24>>2]|0,(A|0)!=0):0){if((S2a(A,1284048,4)|0)!=0?(S2a(A,1284056,5)|0)!=0:0){Ba=Aa;break}Ba=Aa|2}else{Ba=Aa}}while(0);if((Ba&1|0)==0?(Aa=c[g+24>>2]|0,(Aa|0)!=0):0){Ca=(S2a(Aa,1284064,6)|0)==0|Ba}else{Ca=Ba}c[g+12>>2]=Ca}Ca=c[o>>2]|0;if((Ca|0)==65535){Ba=g+8|0;c[Ba>>2]=c[Ba>>2]|512;Da=c[o>>2]|0}else{Da=Ca}if(!((Da|0)==65535|na)){Da=g+8|0;c[Da>>2]=c[Da>>2]|4096}Da=g+36|0;Ca=c[Da>>2]|0;k:do{if((Ca|0)==0){Ea=0;U=243}else{Ba=c[g+40>>2]|0;Aa=0;while(1){A=c[Ba+(Aa<<2)>>2]|0;C=b[A+8>>1]|0;if(C<<16>>16==0){break k}else if(C<<16>>16==3?(b[A+10>>1]|0)==1:0){break k}Aa=Aa+1|0;if(!(Aa>>>0<Ca>>>0)){Ea=Ca;U=243;break}}}}while(0);if((U|0)==243){if(!na?(c[o>>2]|0)!=65535:0){v=0;i=l;return v|0}c[r>>2]=g;b[r+8>>1]=3;b[r+10>>1]=1;c[r+4>>2]=1970170211;o=YEa(1283952,0,r,0)|0;c[q>>2]=o;if(!((o|0)==0|(o&255|0)==163)){v=o;i=l;return v|0}c[q>>2]=0;o=g+92|0;if((c[o>>2]|0)==0?(Ea|0)!=(c[Da>>2]|0):0){c[o>>2]=c[(c[g+40>>2]|0)+(Ea<<2)>>2]}}if((c[u+124>>2]|0)==0){v=0;i=l;return v|0}c[r>>2]=g;b[r+8>>1]=7;g=c[u+120>>2]|0;do{if((g|0)!=0){u=r+10|0;if((g|0)==1){b[u>>1]=1;c[r+4>>2]=1094992453;break}else{b[u>>1]=2;c[r+4>>2]=1094992451;break}}else{b[r+10>>1]=0;c[r+4>>2]=1094995778}}while(0);g=YEa(1283912,0,r,0)|0;c[q>>2]=g;v=g;i=l;return v|0}function GRa(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;if((b|0)==0){i=d;return}e=c[b+100>>2]|0;f=c[b+528>>2]|0;if((f|0)!=0){Rc[c[f+12>>2]&1023](b)}f=b+652|0;b=c[f>>2]|0;if((b|0)==0){i=d;return}g=c[b+4>>2]|0;_Ra(b+84|0);_Ra(b+1208|0);_Ra(b+20|0);_Ra(b+1176|0);h=b+1896|0;if((c[h>>2]|0)!=0){j=0;do{$Ra(g,c[b+(j<<2)+1900>>2]|0);j=j+1|0}while(j>>>0<(c[h>>2]|0)>>>0);h=b+1900|0;aEa(g,c[h>>2]|0);c[h>>2]=0}c[b+116>>2]=0;c[b+120>>2]=0;c[b+124>>2]=0;h=c[(c[b>>2]|0)+28>>2]|0;j=b+1164|0;aEa(h,c[j>>2]|0);c[j>>2]=0;c[b+1168>>2]=0;j=b+1160|0;aEa(h,c[j>>2]|0);c[j>>2]=0;c[b+1152>>2]=0;c[b+1156>>2]=0;$Ra(g,b+1324|0);j=b+2932|0;if((c[j>>2]|0)!=0){DFa(c[b>>2]|0,j)}c[b+2936>>2]=0;a[b+2924>>0]=0;c[b+2928>>2]=0;j=b+2960|0;aEa(g,c[j>>2]|0);c[j>>2]=0;j=b+1304|0;aEa(g,c[j>>2]|0);c[j>>2]=0;j=b+1308|0;aEa(g,c[j>>2]|0);c[j>>2]=0;j=b+1316|0;aEa(g,c[j>>2]|0);c[j>>2]=0;j=b+1320|0;aEa(g,c[j>>2]|0);c[j>>2]=0;j=c[b+2976>>2]|0;if((j|0)!=0){h=b+2972|0;Rc[j&1023](c[h>>2]|0);aEa(g,c[h>>2]|0);c[h>>2]=0}aEa(e,c[f>>2]|0);c[f>>2]=0;i=d;return}function HRa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;b=i;i=i+208|0;d=b+196|0;e=b;c[d>>2]=0;f=c[a>>2]|0;g=tSa(c[(c[f+96>>2]|0)+4>>2]|0,c[f+652>>2]|0)|0;do{if((g|0)!=0){f=c[a>>2]|0;h=c[f+652>>2]|0;j=ZDa(c[f+100>>2]|0,1028,d)|0;f=c[d>>2]|0;if((f|0)!=0){k=f;i=b;return k|0}uSa(h+1324|0,e);f=Qc[c[g>>2]&255](c[(c[a>>2]|0)+100>>2]|0,e,j)|0;c[d>>2]=f;if((f|0)!=0){k=f;i=b;return k|0}f=h+1900|0;l=j+4|0;m=c[h+1896>>2]|0;while(1){if((m|0)==0){n=7;break}m=m+ -1|0;uSa(c[f+(m<<2)>>2]|0,e);h=Qc[c[g>>2]&255](c[(c[a>>2]|0)+100>>2]|0,e,l+(m<<2)|0)|0;c[d>>2]=h;if((h|0)!=0){k=h;n=9;break}}if((n|0)==7){c[a+40>>2]=j;break}else if((n|0)==9){i=b;return k|0}}}while(0);c[a+44>>2]=-1;k=0;i=b;return k|0}function IRa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=c[a>>2]|0;e=c[d+652>>2]|0;f=c[a+40>>2]|0;if((f|0)==0){i=b;return}a=tSa(c[(c[d+96>>2]|0)+4>>2]|0,e)|0;if((a|0)==0){i=b;return}d=a+8|0;Rc[c[d>>2]&1023](c[f>>2]|0);a=c[e+1896>>2]|0;if((a|0)==0){i=b;return}else{g=a}do{g=g+ -1|0;Rc[c[d>>2]&1023](c[f+(g<<2)+4>>2]|0)}while((g|0)!=0);i=b;return}function JRa(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a+4>>2]|0;e=c[(c[d+652>>2]|0)+2952>>2]|0;if((e|0)==0){i=b;return 0}f=gFa(c[(c[d+96>>2]|0)+4>>2]|0,1284024)|0;if((f|0)==0){i=b;return 0}d=Lc[c[e+8>>2]&255](f)|0;c[(c[a+156>>2]|0)+36>>2]=d;i=b;return 0}function KRa(a){a=a|0;c[(c[a+156>>2]|0)+36>>2]=0;return}function LRa(d,f,g,h){d=d|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;j=i;i=i+1008|0;k=j+64|0;l=j+48|0;m=j+44|0;n=j+40|0;o=j+24|0;p=j+8|0;q=j;r=j+998|0;s=j+996|0;if((d|0)==0){t=37;i=j;return t|0}u=h|3;v=(f|0)==0?u:h;h=(v&1|0)==0?f:0;w=(h|0)==0;if(!w){x=c[f>>2]|0;if((x|0)==(c[d+4>>2]|0)){y=x}else{t=35;i=j;return t|0}}else{y=c[d+4>>2]|0}x=y+652|0;f=c[x>>2]|0;if((c[f+1456>>2]|0)!=65535?(z=f+1152|0,(c[f+1164>>2]|0)!=0):0){if((g|0)!=0){A=jSa(z,g)|0;if((A|0)==0){t=6;i=j;return t|0}else{B=A}}else{B=0}}else{if((c[f+12>>2]|0)>>>0>g>>>0){B=g}else{t=6;i=j;return t|0}}g=(v&1024|0)==0?v:u;u=d+164|0;c[u>>2]=65536;v=d+168|0;c[v>>2]=65536;A=(h|0)!=0;if(A){c[u>>2]=c[h+16>>2];c[v>>2]=c[h+20>>2]}if((g&16384|0)!=0){t=6;i=j;return t|0}z=f+1896|0;if((c[z>>2]|0)!=0){C=vSa(f+2924|0,B)|0;D=c[z>>2]|0;if((C&255)>>>0<D>>>0){E=C}else{E=D+255&255}D=c[f+1392>>2]|0;C=f+1900+((E&255)<<2)|0;E=c[C>>2]|0;z=c[E+68>>2]|0;F=E+48|0;c[l+0>>2]=c[F+0>>2];c[l+4>>2]=c[F+4>>2];c[l+8>>2]=c[F+8>>2];c[l+12>>2]=c[F+12>>2];F=c[C>>2]|0;C=c[F+72>>2]|0;E=c[F+76>>2]|0;if((D|0)==(z|0)){G=C;H=E;I=0}else{c[u>>2]=ODa(c[u>>2]|0,D,z)|0;c[v>>2]=ODa(c[v>>2]|0,D,z)|0;G=C;H=E;I=1}}else{E=f+1372|0;c[l+0>>2]=c[E+0>>2];c[l+4>>2]=c[E+4>>2];c[l+8>>2]=c[E+8>>2];c[l+12>>2]=c[E+12>>2];G=c[f+1396>>2]|0;H=c[f+1400>>2]|0;I=0}E=d+108|0;C=d+110|0;b[C>>1]=0;b[E>>1]=0;z=(g>>>1&1^1)&255;D=g&1;F=(D|0)!=0;J=d+160|0;a[J>>0]=z;a[d+161>>0]=D^1;D=d+72|0;c[D>>2]=1869968492;K=g>>>16&15;L=c[x>>2]|0;f3a(k|0,0,932)|0;a[k+65>>0]=1;x=k+4|0;c[x>>2]=y;M=k+8|0;c[M>>2]=d;c[k>>2]=c[y+100>>2];N=d+156|0;O=c[c[N>>2]>>2]|0;c[k+12>>2]=O;P=k+16|0;c[P>>2]=O+20;c[k+20>>2]=O+56;_Da(O);O=k+72|0;c[O>>2]=0;Q=k+68|0;c[Q>>2]=0;if(!(z<<24>>24==0|w)){c[O>>2]=c[c[h+40>>2]>>2];c[Q>>2]=c[(c[N>>2]|0)+36>>2]}R=k+24|0;c[R+0>>2]=0;c[R+4>>2]=0;c[R+8>>2]=0;c[R+12>>2]=0;c[R+16>>2]=0;c[R+20>>2]=0;R=k+76|0;c[R>>2]=L;S=c[L+92>>2]|0;c[k+892>>2]=S;c[k+908>>2]=c[L+1308>>2];c[k+900>>2]=kTa(c[L+1368>>2]|0,S)|0;c[k+920>>2]=K;if((g&256|0)!=0){a[k+753>>0]=1}K=g&1024;a[k+66>>0]=0;S=wSa(y,B,m,n)|0;if((S|0)!=0){t=S;i=j;return t|0}S=c[(c[x>>2]|0)+652>>2]|0;x=S+1896|0;if((c[x>>2]|0)!=0){L=(vSa(S+2924|0,B)|0)&255;if(!(L>>>0<(c[x>>2]|0)>>>0)){t=3;i=j;return t|0}x=c[S+1900+(L<<2)>>2]|0;if((c[Q>>2]|0)==0|w){T=x}else{c[O>>2]=c[(c[h+40>>2]|0)+(L<<2)+4>>2];T=x}}else{T=S+1324|0}S=c[T+544>>2]|0;c[k+888>>2]=S;c[k+904>>2]=c[T+568>>2];c[k+896>>2]=kTa(c[(c[R>>2]|0)+1368>>2]|0,S)|0;S=k+744|0;c[S>>2]=c[T+528>>2];c[k+748>>2]=c[T+532>>2];c[k+928>>2]=T;T=c[m>>2]|0;R=c[n>>2]|0;n=xSa(k,T,R)|0;if((n&255|0)==164){a[J>>0]=0;U=xSa(k,T,R)|0;V=1;W=0}else{U=n;V=I;W=z}ySa(y,m,R);if((U|0)!=0){t=U;i=j;return t|0}U=y+128|0;if((c[(c[U>>2]|0)+48>>2]|0)==0){m=c[f+1200>>2]|0;if((m|0)!=0){c[d+136>>2]=(c[f+1204>>2]|0)+((c[m+(B<<2)>>2]|0)+ -1);c[d+140>>2]=R}}else{c[d+136>>2]=0;c[d+140>>2]=0}R=c[M>>2]|0;if((R|0)!=0){M=R+108|0;R=c[P>>2]|0;c[M+0>>2]=c[R+0>>2];c[M+4>>2]=c[R+4>>2];c[M+8>>2]=c[R+8>>2];c[M+12>>2]=c[R+12>>2];c[M+16>>2]=c[R+16>>2]}R=c[(c[U>>2]|0)+48>>2]|0;if(((R|0)!=0?(c[(c[R>>2]|0)+8>>2]|0)!=0:0)?(R=k+32|0,c[o>>2]=c[R>>2],c[o+4>>2]=0,M=k+40|0,P=o+8|0,c[P>>2]=c[M>>2],m=k+44|0,f=o+12|0,c[f>>2]=c[m>>2],z=c[(c[U>>2]|0)+48>>2]|0,U=id[c[(c[z>>2]|0)+8>>2]&511](c[z+4>>2]|0,B,0,o)|0,c[R>>2]=c[o>>2],c[M>>2]=c[P>>2],c[m>>2]=c[f>>2],(U|0)!=0):0){t=U;i=j;return t|0}if((K|0)!=0){K=c[N>>2]|0;c[d+32>>2]=c[k+32>>2];c[d+40>>2]=c[S>>2];k=K+12|0;c[k+0>>2]=c[l+0>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];c[k+12>>2]=c[l+12>>2];c[K+28>>2]=G;c[K+32>>2]=H;a[K+8>>0]=1;t=0;i=j;return t|0}K=d+24|0;k=c[S>>2]|0;S=d+40|0;c[S>>2]=k;c[d+56>>2]=k;a[(c[N>>2]|0)+8>>0]=0;if((a[y+292>>0]|0)!=0?(b[y+330>>1]|0)!=0:0){b[r>>1]=0;b[s>>1]=0;ed[c[(c[y+528>>2]|0)+112>>2]&127](y,1,B,r,s)|0;c[d+48>>2]=b[r>>1]|0;r=e[s>>1]|0;c[d+52>>2]=r;X=r;Y=1}else{Z=45}do{if((Z|0)==45){r=y+364|0;if((b[r>>1]|0)==-1){s=y+216|0;B=(b[s+4>>1]|0)-(b[s+6>>1]|0)|0;c[d+52>>2]=B;X=B;Y=0;break}else{B=(b[r+70>>1]|0)-(b[r+72>>1]|0)|0;c[d+52>>2]=B;X=B;Y=0;break}}}while(0);y=d+52|0;c[d+60>>2]=X;c[D>>2]=1869968492;D=d+124|0;c[D>>2]=0;if(A?(e[h+14>>1]|0)<24:0){c[D>>2]=256;_=260}else{_=4}c[D>>2]=_;do{if((c[l>>2]|0)==65536){if((c[l+12>>2]|0)!=65536){Z=55;break}if((c[l+4>>2]|0)!=0){Z=55;break}if((c[l+8>>2]|0)!=0){Z=55}}else{Z=55}}while(0);if((Z|0)==55){wEa(E,l)}if((H|G|0)!=0){xEa(E,G,H)}c[q>>2]=c[S>>2];_=q+4|0;c[_>>2]=0;yEa(q,l);c[S>>2]=(c[q>>2]|0)+G;c[q>>2]=0;c[_>>2]=c[y>>2];yEa(q,l);l=(c[_>>2]|0)+H|0;c[y>>2]=l;if(!(F&V<<24>>24==0)){V=c[d+112>>2]|0;F=c[u>>2]|0;u=c[v>>2]|0;if(!(W<<24>>24==0)?(c[Q>>2]|0)!=0:0){$=l}else{Z=61}do{if((Z|0)==61){Q=b[C>>1]|0;if(!(Q<<16>>16>0)){$=l;break}W=Q<<16>>16;Q=V;while(1){c[Q>>2]=SDa(c[Q>>2]|0,F)|0;v=Q+4|0;c[v>>2]=SDa(c[v>>2]|0,u)|0;W=W+ -1|0;if((W|0)<=0){break}else{Q=Q+8|0}}$=c[y>>2]|0}}while(0);c[S>>2]=SDa(c[S>>2]|0,F)|0;c[y>>2]=SDa($,u)|0}qFa(E,p);E=c[p>>2]|0;c[K>>2]=(c[p+8>>2]|0)-E;u=c[p+12>>2]|0;c[d+28>>2]=u-(c[p+4>>2]|0);c[d+32>>2]=E;c[d+36>>2]=u;if(Y){c[d+44>>2]=E-((c[S>>2]|0)/2|0);t=0;i=j;return t|0}if((g&16|0)==0){t=0;i=j;return t|0}MEa(K,c[y>>2]|0);t=0;i=j;return t|0}function MRa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;g=c[a+528>>2]|0;c[e>>2]=0;c[e+4>>2]=0;if((g|0)==0){i=f;return 0}c[e>>2]=Qc[c[g+84>>2]&255](a,b,d)|0;i=f;return 0}function NRa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0;g=i;h=c[a+84>>2]|0;j=e|256;k=a+88|0;if((d|0)==0){l=0;i=g;return l|0}a=(e&16|0)==0?h+56|0:h+60|0;e=0;while(1){m=LRa(h,c[k>>2]|0,e+b|0,j)|0;if((m|0)!=0){l=m;n=5;break}c[f+(e<<2)>>2]=c[a>>2];e=e+1|0;if(!(e>>>0<d>>>0)){l=0;n=5;break}}if((n|0)==5){i=g;return l|0}return 0}function ORa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;PEa(c[a>>2]|0,b);b=c[a>>2]|0;e=tSa(c[(c[b+96>>2]|0)+4>>2]|0,c[b+652>>2]|0)|0;if((e|0)==0){i=d;return 0}b=c[(c[a>>2]|0)+652>>2]|0;f=c[a+40>>2]|0;g=c[b+1392>>2]|0;h=e+4|0;e=a+16|0;j=a+20|0;ed[c[h>>2]&127](c[f>>2]|0,c[e>>2]|0,c[j>>2]|0,0,0)|0;a=c[b+1896>>2]|0;if((a|0)==0){i=d;return 0}k=b+1900|0;b=a;do{b=b+ -1|0;a=c[(c[k+(b<<2)>>2]|0)+68>>2]|0;l=c[e>>2]|0;if((g|0)==(a|0)){m=l;n=c[j>>2]|0}else{o=ODa(l,g,a)|0;m=o;n=ODa(c[j>>2]|0,g,a)|0}ed[c[h>>2]&127](c[f+(b<<2)+4>>2]|0,m,n,0,0)|0}while((b|0)!=0);i=d;return 0}function PRa(a,b){a=a|0;b=b|0;c[a+16>>2]=(c[(c[a>>2]|0)+652>>2]|0)+640;return 0}function QRa(a){a=a|0;c[a+16>>2]=0;return}function RRa(a,b){a=a|0;b=b|0;var d=0,f=0;d=i;if(!(b>>>0<256)){f=0;i=d;return f|0}f=e[(c[a+16>>2]|0)+(b<<1)>>1]|0;i=d;return f|0}function SRa(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;f=c[d>>2]|0;c[d>>2]=0;a:do{if(f>>>0<255){g=a+16|0;h=f;j=0;do{h=h+1|0;if(h>>>0>255){k=j;break a}l=b[(c[g>>2]|0)+(h<<1)>>1]|0;j=l&65535}while(l<<16>>16==0);c[d>>2]=h;k=j}else{k=0}}while(0);i=e;return k|0}function TRa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;b=i;d=c[a>>2]|0;e=c[d+652>>2]|0;if((c[e+1160>>2]|0)==0){f=163;i=b;return f|0}f=Wc[c[(c[e+2956>>2]|0)+4>>2]&31](c[d+100>>2]|0,a,c[e+12>>2]|0,295,0,d)|0;i=b;return f|0}function URa(a){a=a|0;var b=0,d=0;b=i;d=a+20|0;aEa(c[(c[a>>2]|0)+100>>2]|0,c[d>>2]|0);c[d>>2]=0;c[a+16>>2]=0;i=b;return}function VRa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=dd[c[(c[(c[(c[a>>2]|0)+652>>2]|0)+2956>>2]|0)+8>>2]&511](a,b)|0;i=d;return e|0}function WRa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=dd[c[(c[(c[(c[a>>2]|0)+652>>2]|0)+2956>>2]|0)+12>>2]&511](a,b)|0;i=d;return e|0}function XRa(a,b){a=a|0;b=b|0;var d=0,f=0;d=i;f=c[a+652>>2]|0;a=YRa(f,e[(c[f+1160>>2]|0)+(b<<1)>>1]|0)|0;i=d;return a|0}function YRa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;do{if((b|0)!=65535){if(b>>>0>390){e=ZRa(a,b+ -391|0)|0;break}f=c[a+2956>>2]|0;if((f|0)!=0){e=Lc[c[f+20>>2]&255](b)|0}else{e=0}}else{e=0}}while(0);i=d;return e|0}function ZRa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if(!((c[a+1312>>2]|0)>>>0>b>>>0)){e=0;i=d;return e|0}e=c[(c[a+1316>>2]|0)+(b<<2)>>2]|0;i=d;return e|0}function _Ra(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a>>2]|0;if((d|0)==0){i=b;return}e=c[d+28>>2]|0;f=a+28|0;if((c[f>>2]|0)!=0){DFa(d,f)}aEa(e,c[a+24>>2]|0);c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;c[a+24>>2]=0;c[a+28>>2]=0;i=b;return}function $Ra(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)==0){i=d;return}_Ra(b+536|0);e=b+568|0;aEa(a,c[e>>2]|0);c[e>>2]=0;i=d;return}function aSa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+16|0;f=e+8|0;g=e+4|0;h=e;j=b+20|0;b=c[(c[j>>2]|0)+28>>2]|0;k=cSa(j,d,f,g)|0;c[h>>2]=k;if((k|0)!=0){l=0;i=e;return l|0}k=c[g>>2]|0;g=ZDa(b,k+1|0,h)|0;if((c[h>>2]|0)==0){c3a(g|0,c[f>>2]|0,k|0)|0;a[g+k>>0]=0}dSa(j,f);l=g;i=e;return l|0}function bSa(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;i=i+16|0;d=RFa(a,b,c)|0;i=c;return d|0}function cSa(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;g=i;i=i+16|0;h=g;c[h>>2]=0;if((a|0)!=0?(j=a+8|0,k=c[j>>2]|0,k>>>0>b>>>0):0){l=c[a>>2]|0;m=c[a+24>>2]|0;a:do{if((m|0)==0){n=ca(d[a+12>>0]|0,b)|0;o=uFa(l,(c[a+4>>2]|0)+3+n|0)|0;c[h>>2]=o;if((o|0)!=0){p=c[h>>2]|0;i=g;return p|0}o=eSa(a,h)|0;if((c[h>>2]|0)!=0){p=c[h>>2]|0;i=g;return p|0}if((o|0)==0){q=12}else{n=b;while(1){n=n+1|0;r=eSa(a,h)|0;if((r|0)!=0){s=o;t=r;q=14;break a}if(!(n>>>0<(c[j>>2]|0)>>>0)){u=o;q=13;break}}}}else{o=c[m+(b<<2)>>2]|0;if((o|0)==0){q=12}else{n=b;while(1){n=n+1|0;r=c[m+(n<<2)>>2]|0;if((r|0)!=0){s=o;t=r;q=14;break a}if(!(n>>>0<k>>>0)){u=o;q=13;break}}}}}while(0);if((q|0)==12){v=c[l+4>>2]|0;w=0;x=0;q=16}else if((q|0)==13){v=c[l+4>>2]|0;w=u;x=0;q=16}else if((q|0)==14){u=c[l+4>>2]|0;if(t>>>0>(u+1|0)>>>0){y=u;z=c[a+16>>2]|0;A=s;q=17}else{v=u;w=s;x=t;q=16}}if((q|0)==16){t=c[a+16>>2]|0;if(t>>>0>(v+1-x|0)>>>0){y=v;z=t;A=w;q=17}else{B=w;C=x}}if((q|0)==17){B=A;C=y+1-z|0}if(!((B|0)!=0&C>>>0>B>>>0)){c[e>>2]=0;c[f>>2]=0;p=c[h>>2]|0;i=g;return p|0}z=C-B|0;c[f>>2]=z;f=c[a+28>>2]|0;if((f|0)!=0){c[e>>2]=f+(B+ -1);p=c[h>>2]|0;i=g;return p|0}f=uFa(l,B+ -1+(c[a+16>>2]|0)|0)|0;c[h>>2]=f;if((f|0)!=0){p=c[h>>2]|0;i=g;return p|0}c[h>>2]=BFa(l,z,e)|0;p=c[h>>2]|0;i=g;return p|0}c[h>>2]=6;p=c[h>>2]|0;i=g;return p|0}function dSa(a,b){a=a|0;b=b|0;var d=0;d=i;if((c[a+28>>2]|0)!=0){i=d;return}DFa(c[a>>2]|0,b);i=d;return}function eSa(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;i=i+16|0;g=f;h=b+12|0;j=vFa(c[b>>2]|0,g,d[h>>0]|0)|0;if((j|0)==0?(b=a[h>>0]|0,!(b<<24>>24==0)):0){h=b&255;b=0;k=0;while(1){l=d[g+b>>0]|0|k<<8;b=b+1|0;if((b|0)>=(h|0)){m=l;break}else{k=l}}}else{m=0}c[e>>2]=j;i=f;return m|0}function fSa(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=i;i=i+16|0;g=f;h=c[d+28>>2]|0;c[b+0>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b+16>>2]=0;c[b+20>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;c[b>>2]=d;j=b+4|0;c[j>>2]=zFa(c[d+8>>2]|0)|0;k=xFa(d,g)|0;l=c[g>>2]|0;do{if((l|0)==0){m=k&65535;if(k<<16>>16==0){n=0;i=f;return n|0}o=JFa(d,g)|0;p=c[g>>2]|0;if((p|0)==0){q=o&255;if(o<<24>>24==0|(o&255)>4){c[g>>2]=8;r=8;break}c[b+8>>2]=m;a[b+12>>0]=o;o=ca(q,m+1|0)|0;c[b+16>>2]=o+3+(c[j>>2]|0);m=wFa(d,o-q|0)|0;c[g>>2]=m;if((m|0)==0){q=eSa(b,g)|0;o=c[g>>2]|0;if((o|0)==0){if((q|0)==0){c[g>>2]=8;r=8;break}s=q+ -1|0;c[b+20>>2]=s;if(e<<24>>24==0){t=wFa(d,s)|0}else{t=BFa(d,s,b+28|0)|0}c[g>>2]=t;if((t|0)==0){n=0;i=f;return n|0}else{r=t}}else{r=o}}else{r=m}}else{r=p}}else{r=l}}while(0);l=b+24|0;aEa(h,c[l>>2]|0);c[l>>2]=0;n=r;i=f;return n|0}function gSa(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;g=i;i=i+16|0;h=g+4|0;j=g;c[j>>2]=0;k=c[(c[b>>2]|0)+28>>2]|0;c[e>>2]=0;l=b+24|0;a:do{if((c[l>>2]|0)==0){c[h>>2]=0;m=c[b>>2]|0;n=c[m+28>>2]|0;o=b+8|0;p=c[o>>2]|0;do{if((p|0)!=0){q=p+1|0;r=d[b+12>>0]|0;s=ca(r,q)|0;c[l>>2]=dEa(n,4,0,q,0,h)|0;q=c[h>>2]|0;if((q|0)==0){t=uFa(m,(c[b+4>>2]|0)+3|0)|0;c[h>>2]=t;if((t|0)==0){u=CFa(m,s)|0;c[h>>2]=u;if((u|0)==0){v=c[l>>2]|0;w=c[m+32>>2]|0;x=w+s|0;if((r|0)==1){if((s|0)>0){y=w;z=v;while(1){c[z>>2]=d[y>>0]|0;y=y+1|0;if(!(y>>>0<x>>>0)){break}else{z=z+4|0}}}}else if((r|0)==2){if((s|0)>0){z=w;y=v;while(1){c[y>>2]=(d[z>>0]|0)<<8|(d[z+1>>0]|0);z=z+2|0;if(!(z>>>0<x>>>0)){break}else{y=y+4|0}}}}else if((r|0)==3){if((s|0)>0){y=w;z=v;while(1){c[z>>2]=(d[y+1>>0]|0)<<8|(d[y>>0]|0)<<16|(d[y+2>>0]|0);y=y+3|0;if(!(y>>>0<x>>>0)){break}else{z=z+4|0}}}}else{if((s|0)>0){z=w;y=v;while(1){c[y>>2]=(d[z+1>>0]|0)<<16|(d[z>>0]|0)<<24|(d[z+2>>0]|0)<<8|(d[z+3>>0]|0);z=z+4|0;if(!(z>>>0<x>>>0)){break}else{y=y+4|0}}}}FFa(m);y=c[h>>2]|0;if((y|0)==0){break}else{A=y}}else{A=u}}else{A=t}}else{A=q}aEa(n,c[l>>2]|0);c[l>>2]=0;c[j>>2]=A;if((A|0)==0){B=o;break a}else{C=A}i=g;return C|0}}while(0);c[j>>2]=0;B=o}else{B=b+8|0}}while(0);A=c[B>>2]|0;if((A|0)==0){C=0;i=g;return C|0}h=dEa(k,4,0,A+1|0,0,j)|0;A=c[j>>2]|0;if((A|0)!=0){C=A;i=g;return C|0}A=(f|0)!=0;n=b+20|0;if(A){m=ZDa(k,(c[B>>2]|0)+(c[n>>2]|0)|0,j)|0;k=c[j>>2]|0;if((k|0)==0){D=m}else{C=k;i=g;return C|0}}else{D=0}k=c[b+28>>2]|0;b=(c[c[l>>2]>>2]|0)+ -1|0;m=b>>>0>=(c[n>>2]|0)>>>0?0:b;c[h>>2]=(A?D:k)+m;b=c[B>>2]|0;if((b|0)!=0){j=b;b=m;m=0;p=1;while(1){y=(c[(c[l>>2]|0)+(p<<2)>>2]|0)+ -1|0;if(!((y|0)==0|y>>>0<b>>>0)?!(p>>>0<j>>>0?y>>>0>=(c[n>>2]|0)>>>0:0):0){E=y}else{E=b}if(A){y=D+(E+m)|0;x=h+(p<<2)|0;c[x>>2]=y;if((E|0)==(b|0)){F=m}else{z=c[h+(p+ -1<<2)>>2]|0;c3a(z|0,k+b|0,y-z|0)|0;a[c[x>>2]>>0]=0;c[x>>2]=(c[x>>2]|0)+1;F=m+1|0}}else{c[h+(p<<2)>>2]=k+E;F=m}p=p+1|0;j=c[B>>2]|0;if(p>>>0>j>>>0){break}else{b=E;m=F}}}c[e>>2]=h;if(!A){C=0;i=g;return C|0}c[f>>2]=D;C=0;i=g;return C|0}function hSa(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;j=i;i=i+432|0;k=j+8|0;l=j+4|0;m=j;c[l>>2]=0;f3a(k|0,0,404)|0;n=k+16|0;o=k+404|0;c[o>>2]=n;p=k+408|0;c[p>>2]=4096;q=k+412|0;c[q>>2]=b;c[k>>2]=h;f3a(b|0,0,172)|0;c[b+32>>2]=-6553600;c[b+36>>2]=3276800;c[b+44>>2]=2;c[b+48>>2]=65536;c[b+60>>2]=65536;c[b+156>>2]=8720;c[b>>2]=65535;c[b+4>>2]=65535;c[b+8>>2]=65535;c[b+12>>2]=65535;c[b+16>>2]=65535;c[b+20>>2]=65535;c[b+128>>2]=65535;r=b+132|0;c[r>>2]=65535;c[b+136>>2]=65535;c[b+172>>2]=65535;s=cSa(d,e,l,m)|0;if((s|0)!=0){dSa(d,l);t=s;i=j;return t|0}s=c[l>>2]|0;e=kSa(k,s,s+(c[m>>2]|0)|0)|0;dSa(d,l);if((e|0)!=0){t=e;i=j;return t|0}if((c[r>>2]|0)!=65535){t=0;i=j;return t|0}r=b+116|0;e=c[r>>2]|0;do{if((e|0)!=0?(l=b+120|0,(c[l>>2]|0)!=0):0){d=b+176|0;f3a(d|0,0,360)|0;c[b+376>>2]=7;c[b+380>>2]=1;c[b+508>>2]=-1;c[b+516>>2]=3932;c[b+372>>2]=2596864;f3a(k|0,0,404)|0;c[o>>2]=n;c[p>>2]=8192;c[q>>2]=d;c[k>>2]=h;m=uFa(f,e+g|0)|0;if((m|0)!=0){t=m;i=j;return t|0}m=CFa(f,c[l>>2]|0)|0;if((m|0)!=0){t=m;i=j;return t|0}m=kSa(k,c[f+32>>2]|0,c[f+36>>2]|0)|0;FFa(f);if((m|0)==0){a[d>>0]=a[d>>0]&254;break}else{t=m;i=j;return t|0}}}while(0);k=c[b+524>>2]|0;if((k|0)==0){t=0;i=j;return t|0}e=uFa(f,k+g+(c[r>>2]|0)|0)|0;if((e|0)!=0){t=e;i=j;return t|0}e=b+536|0;r=fSa(e,f,1)|0;if((r|0)!=0){t=r;i=j;return t|0}t=gSa(e,b+568|0,0)|0;i=j;return t|0}function iSa(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;g=i;i=i+16|0;h=g;c[h>>2]=0;j=a+16|0;if((c[j>>2]|0)!=0){k=0;i=g;return k|0}if((d|0)==0){l=0}else{m=c[a+8>>2]|0;n=0;o=0;while(1){p=b[m+(n<<1)>>1]|0;q=(p&65535)>(o&65535)?p:o;n=n+1|0;if((n|0)==(d|0)){l=q;break}else{o=q}}}o=l&65535;l=dEa(f,2,0,o+1|0,0,h)|0;f=a+12|0;c[f>>2]=l;n=c[h>>2]|0;if((n|0)!=0){k=n;i=g;return k|0}n=d+ -1|0;a:do{if((n|0)>-1){h=a+8|0;m=l;q=n;while(1){b[m+((e[(c[h>>2]|0)+(q<<1)>>1]|0)<<1)>>1]=q;p=q+ -1|0;if(!((p|0)>-1)){break a}m=c[f>>2]|0;q=p}}}while(0);c[j>>2]=o;c[a+20>>2]=d;k=0;i=g;return k|0}function jSa(a,b){a=a|0;b=b|0;var d=0,f=0;d=i;if((c[a+16>>2]|0)>>>0<b>>>0){f=0;i=d;return f|0}f=e[(c[a+12>>2]|0)+(b<<1)>>1]|0;i=d;return f|0}function kSa(e,f,g){e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;h=i;j=e+16|0;k=e+404|0;c[k>>2]=j;c[e+4>>2]=f;c[e+8>>2]=g;c[e+12>>2]=f;if(!(f>>>0<g>>>0)){l=0;i=h;return l|0}m=j;n=e+408|0;o=e+412|0;p=e+20|0;q=j;r=f;a:while(1){f=a[r>>0]|0;s=q-m|0;t=s>>2;do{if((f&255)>26&f<<24>>24!=31){if((s|0)>380){l=6;u=39;break a}c[k>>2]=q+4;c[q>>2]=r;if(f<<24>>24==28){v=r+2|0;break}else if(f<<24>>24==30){w=r;while(1){x=w+1|0;if(!(x>>>0<g>>>0)){l=0;u=39;break a}y=d[x>>0]|0;if((y&240|0)==240|(y&15|0)==15){v=x;break}else{w=x}}}else if(f<<24>>24==29){v=r+4|0;break}else{v=(f&255)>246?r+1|0:r;break}}else{w=f&255;c[q>>2]=r;if(f<<24>>24==12){x=r+1|0;if(!(x>>>0<g>>>0)){l=6;u=39;break a}z=d[x>>0]|0|256;A=x}else{z=w;A=r}w=c[n>>2]|z;x=4;y=1286096;while(1){B=y+28|0;if((c[y+4>>2]|0)==(w|0)){u=17;break}C=c[B>>2]|0;if((C|0)==0){break}else{x=C;y=B}}b:do{if((u|0)==17){u=0;w=c[o>>2]|0;B=w+(c[y+8>>2]|0)|0;if((x|0)!=6&(t|0)==0){l=6;u=39;break a}switch(x|0){case 3:{D=mSa(c[j>>2]|0,c[p>>2]|0,3)|0;break};case 2:{D=mSa(c[j>>2]|0,c[p>>2]|0,0)|0;break};case 1:case 4:case 5:{D=lSa(c[j>>2]|0,c[p>>2]|0)|0;break};case 6:{C=c[y+20>>2]|0;E=t>>>0>C>>>0?C:t;a[w+(c[y+24>>2]|0)>>0]=E;if((E|0)==0){break b}w=y+12|0;C=j;F=E;E=B;G=0;while(1){H=C;C=C+4|0;G=(lSa(c[H>>2]|0,c[C>>2]|0)|0)+G|0;H=d[w>>0]|0;if((H|0)==2){b[E>>1]=G}else if((H|0)==4){c[E>>2]=G}else if((H|0)==1){a[E>>0]=G}else{c[E>>2]=G}F=F+ -1|0;if((F|0)==0){break b}else{E=E+(d[w>>0]|0)|0}}break};default:{w=Lc[c[y+16>>2]&255](e)|0;if((w|0)==0){break b}else{l=w;u=39;break a}}}w=d[y+12>>0]|0;if((w|0)==2){b[B>>1]=D;break}else if((w|0)==4){c[B>>2]=D;break}else if((w|0)==1){a[B>>0]=D;break}else{c[B>>2]=D;break}}}while(0);c[k>>2]=j;v=A}}while(0);t=v+1|0;if(!(t>>>0<g>>>0)){l=0;u=39;break}q=c[k>>2]|0;r=t}if((u|0)==39){i=h;return l|0}return 0}function lSa(b,c){b=b|0;c=c|0;var d=0,e=0;d=i;if((a[b>>0]|0)==30){e=(nSa(b,c,0,0)|0)>>16;i=d;return e|0}else{e=oSa(b,c)|0;i=d;return e|0}return 0}function mSa(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;if((a[b>>0]|0)==30){g=nSa(b,d,e,0)|0;i=f;return g|0}h=oSa(b,d)|0;if((e|0)==0){j=h}else{j=ca(c[1287552+(e<<2)>>2]|0,h)|0}if((j|0)>32767){g=2147483647;i=f;return g|0}else{i=f;return((j|0)<-32767?-2147483647:j<<16)|0}return 0}function nSa(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0;g=i;h=(f|0)!=0;if(h){c[f>>2]=0;j=0;k=0;l=0;m=b;n=4;o=0}else{j=0;k=0;l=0;m=b;n=4;o=0}a:while(1){b=(l|0)>214748363;p=j;q=m;r=n;s=o;b:while(1){t=p;u=q;v=r;while(1){w=u;x=v;while(1){if((x|0)!=0){y=w+1|0;if(y>>>0<d>>>0){z=y}else{A=0;break a}}else{z=w}B=a[z>>0]|0;C=(B&255)>>>x&15;x=4-x|0;if((C|0)==14){p=t;q=z;r=x;s=1;continue b}if(C>>>0>9){D=14;break a}if(b){break}if((C|l|0)!=0){break b}else{w=z}}t=t+1|0;u=z;v=x}}j=t;k=k+1|0;l=C+(l*10|0)|0;m=z;n=x;o=s}c:do{if((D|0)==14){d:do{if((C|0)==10){o=B;n=t;m=0;j=l;b=z;r=x;while(1){q=(j|0)<214748364&(m|0)<9;p=o;v=n;u=b;w=r;e:while(1){y=p;E=u;F=w;while(1){if((F|0)==0){G=y;H=E}else{I=E+1|0;if(!(I>>>0<d>>>0)){A=0;break c}G=a[I>>0]|0;H=I}J=(G&255)>>>F&15;F=4-F|0;if(J>>>0>9){K=G;L=v;M=m;N=J;O=j;P=H;Q=F;break d}if((J|j|0)==0){break}if(q){break e}else{y=G;E=H}}p=G;v=v+ -1|0;u=H;w=F}o=G;n=v;m=m+1|0;j=J+(j*10|0)|0;b=H;r=F}}else{K=B;L=t;M=0;N=C;O=l;P=z;Q=x}}while(0);r=(N|0)==12;if((N+ -11|0)>>>0<2){b=K;j=0;m=0;n=P;o=Q;f:while(1){w=(j|0)>1e3;u=b;R=m;p=n;q=o;while(1){if((q|0)==0){S=u;T=p}else{E=p+1|0;if(!(E>>>0<d>>>0)){A=0;break c}S=a[E>>0]|0;T=E}U=(S&255)>>>q&15;q=4-q|0;if(U>>>0>9){break f}if(!w){break}else{u=S;R=1;p=T}}b=S;j=U+(j*10|0)|0;m=R;n=T;o=q}V=r?0-j|0:j;W=R}else{V=0;W=0}if((O|0)==0){A=0}else{do{if((W|0)!=0){if(!r){A=2147483647;break c}}else{o=L+e+V|0;if(!h){n=o+k|0;if((n|0)>5){A=2147483647;break c}if((n|0)<-5){break}if((n|0)<0){X=M+k|0;Y=(O|0)/(c[1287552+(0-n<<2)>>2]|0)|0}else{X=M-o|0;Y=O}if((X|0)!=10){if((X|0)>0){Z=X;_=Y}else{n=ca(c[1287552+(0-X<<2)>>2]|0,Y)|0;A=(n|0)>32767?2147483647:n<<16;break c}}else{Z=9;_=(Y|0)/10|0}n=c[1287552+(Z<<2)>>2]|0;if(((_|0)/(n|0)|0|0)>32767){A=0;break c}A=TDa(_,n)|0;break c}n=M+k|0;m=o+k|0;if((n|0)>=6){o=c[1287552+(n+ -5<<2)>>2]|0;if(((O|0)/(o|0)|0|0)>32767){b=TDa(O,c[1287552+(n+ -4<<2)>>2]|0)|0;c[f>>2]=m+ -4;A=b;break c}else{b=TDa(O,o)|0;c[f>>2]=m+ -5;A=b;break c}}if((O|0)>32767){b=TDa(O,10)|0;c[f>>2]=1-n+m;A=b;break c}do{if((m|0)>0){b=(m|0)<5?m:5;o=b-n|0;if((o|0)<=0){$=m-n|0;aa=O;break}p=m-b|0;b=ca(c[1287552+(o<<2)>>2]|0,O)|0;if((b|0)>32767){$=p+1|0;aa=(b|0)/10|0}else{$=p;aa=b}}else{$=m-n|0;aa=O}}while(0);c[f>>2]=$;A=aa<<16;break c}}while(0);A=0}}}while(0);i=g;return((s|0)==0?A:0-A|0)|0}function oSa(b,c){b=b|0;c=c|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;f=b+1|0;g=a[b>>0]|0;h=g&255;do{if(g<<24>>24==29){if((b+5|0)>>>0>c>>>0){j=0}else{j=(d[b+2>>0]|0)<<16|(d[f>>0]|0)<<24|(d[b+3>>0]|0)<<8|(d[b+4>>0]|0)}}else if(g<<24>>24==28){if((b+3|0)>>>0>c>>>0){j=0}else{j=((d[f>>0]|0)<<8|(d[b+2>>0]|0))<<16>>16}}else{if((g&255)<247){j=h+ -139|0;break}k=(b+2|0)>>>0>c>>>0;if((g&255)<251){if(k){j=0;break}j=(d[f>>0]|0|(h<<8)+ -63232)+108|0;break}else{if(k){j=0;break}j=(251-h<<8)+ -108-(d[f>>0]|0)|0;break}}}while(0);i=e;return j|0}function pSa(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;d=i;i=i+16|0;e=d;f=c[b+412>>2]|0;g=f+72|0;h=f+68|0;j=b+40|0;if((c[b+404>>2]|0)>>>0<j>>>0){k=161;i=d;return k|0}l=f+48|0;a[f+64>>0]=1;m=c[b+16>>2]|0;n=b+20|0;o=c[n>>2]|0;do{if((a[m>>0]|0)!=30){p=oSa(m,o)|0;if((p|0)>32767){q=5}else{c[e>>2]=0;r=p<<16;break}while(1){s=q+1|0;if((p|0)<(c[1287552+(q<<2)>>2]|0)){t=q;break}if((s|0)<10){q=s}else{t=s;break}}s=t+ -5|0;u=c[1287552+(s<<2)>>2]|0;if(((p|0)/(u|0)|0|0)>32767){v=t+ -4|0;c[e>>2]=v;r=TDa(p,c[1287552+(v<<2)>>2]|0)|0;break}else{c[e>>2]=s;r=TDa(p,u)|0;break}}else{r=nSa(m,o,0,e)|0}}while(0);c[l>>2]=r;r=c[e>>2]|0;o=0-r|0;c[e>>2]=o;if((r|0)>0|(o|0)>9){c[l>>2]=65536;c[f+56>>2]=0;c[f+52>>2]=0;c[f+60>>2]=65536;c[g>>2]=0;c[f+76>>2]=0;c[h>>2]=1;k=0;i=d;return k|0}else{l=b+24|0;c[f+56>>2]=mSa(c[n>>2]|0,c[l>>2]|0,o)|0;o=b+28|0;c[f+52>>2]=mSa(c[l>>2]|0,c[o>>2]|0,c[e>>2]|0)|0;l=b+32|0;c[f+60>>2]=mSa(c[o>>2]|0,c[l>>2]|0,c[e>>2]|0)|0;o=b+36|0;c[g>>2]=mSa(c[l>>2]|0,c[o>>2]|0,c[e>>2]|0)|0;c[f+76>>2]=mSa(c[o>>2]|0,c[j>>2]|0,c[e>>2]|0)|0;c[h>>2]=c[1287552+(c[e>>2]<<2)>>2];k=0;i=d;return k|0}return 0}function qSa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=c[a+412>>2]|0;e=a+32|0;if((c[a+404>>2]|0)>>>0<e>>>0){f=161;i=b;return f|0}g=a+20|0;c[d+84>>2]=KDa(mSa(c[a+16>>2]|0,c[g>>2]|0,0)|0)|0;h=a+24|0;c[d+88>>2]=KDa(mSa(c[g>>2]|0,c[h>>2]|0,0)|0)|0;g=a+28|0;c[d+92>>2]=KDa(mSa(c[h>>2]|0,c[g>>2]|0,0)|0)|0;c[d+96>>2]=KDa(mSa(c[g>>2]|0,c[e>>2]|0,0)|0)|0;f=0;i=b;return f|0}function rSa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=c[a+412>>2]|0;e=a+24|0;if((c[a+404>>2]|0)>>>0<e>>>0){f=161;i=b;return f|0}g=a+20|0;c[d+120>>2]=lSa(c[a+16>>2]|0,c[g>>2]|0)|0;c[d+116>>2]=lSa(c[g>>2]|0,c[e>>2]|0)|0;f=0;i=b;return f|0}function sSa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=c[a+412>>2]|0;e=a+28|0;if((c[a+404>>2]|0)>>>0<e>>>0){f=161;i=b;return f|0}g=a+20|0;c[d+132>>2]=lSa(c[a+16>>2]|0,c[g>>2]|0)|0;h=a+24|0;c[d+136>>2]=lSa(c[g>>2]|0,c[h>>2]|0)|0;c[d+140>>2]=lSa(c[h>>2]|0,c[e>>2]|0)|0;f=0;i=b;return f|0}function tSa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[b+2952>>2]|0;b=gFa(a,1284024)|0;if((b|0)==0|(e|0)==0){f=0;i=d;return f|0}a=c[e>>2]|0;if((a|0)==0){f=0;i=d;return f|0}f=Lc[a&255](b)|0;i=d;return f|0}function uSa(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=i;f3a(e|0,0,196)|0;g=a[d+176>>0]|0;a[e+8>>0]=g;if(!(g<<24>>24==0)){h=g&255;g=0;do{b[e+(g<<1)+12>>1]=c[d+(g<<2)+180>>2];g=g+1|0}while((g|0)!=(h|0))}h=a[d+177>>0]|0;a[e+9>>0]=h;if(!(h<<24>>24==0)){g=h&255;h=0;do{b[e+(h<<1)+40>>1]=c[d+(h<<2)+236>>2];h=h+1|0}while((h|0)!=(g|0))}g=a[d+178>>0]|0;a[e+10>>0]=g;if(!(g<<24>>24==0)){h=g&255;g=0;do{b[e+(g<<1)+60>>1]=c[d+(g<<2)+276>>2];g=g+1|0}while((g|0)!=(h|0))}h=a[d+179>>0]|0;a[e+11>>0]=h;if(!(h<<24>>24==0)){g=h&255;h=0;do{b[e+(h<<1)+88>>1]=c[d+(h<<2)+332>>2];h=h+1|0}while((h|0)!=(g|0))}c[e+108>>2]=c[d+372>>2];c[e+112>>2]=c[d+376>>2];c[e+116>>2]=c[d+380>>2];b[e+120>>1]=c[d+384>>2];b[e+122>>1]=c[d+388>>2];g=a[d+392>>0]|0;a[e+124>>0]=g;if(!(g<<24>>24==0)){h=g&255;g=0;do{b[e+(g<<1)+128>>1]=c[d+(g<<2)+396>>2];g=g+1|0}while((g|0)!=(h|0))}h=a[d+393>>0]|0;a[e+125>>0]=h;if(h<<24>>24==0){j=d+500|0;k=a[j>>0]|0;l=e+126|0;a[l>>0]=k;m=d+512|0;n=c[m>>2]|0;o=e+184|0;c[o>>2]=n;p=d+508|0;q=c[p>>2]|0;r=e+4|0;c[r>>2]=q;i=f;return}g=h&255;h=0;do{b[e+(h<<1)+154>>1]=c[d+(h<<2)+448>>2];h=h+1|0}while((h|0)!=(g|0));j=d+500|0;k=a[j>>0]|0;l=e+126|0;a[l>>0]=k;m=d+512|0;n=c[m>>2]|0;o=e+184|0;c[o>>2]=n;p=d+508|0;q=c[p>>2]|0;r=e+4|0;c[r>>2]=q;i=f;return}function vSa(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f=i;g=d[b>>0]|0;if((g|0)==3){h=b+16|0;j=b+20|0;if((e-(c[h>>2]|0)|0)>>>0<(c[j>>2]|0)>>>0){k=a[b+24>>0]|0;i=f;return k|0}l=c[b+8>>2]|0;m=l+(c[b+12>>2]|0)|0;n=(d[l>>0]|0)<<8|(d[l+1>>0]|0);o=l+2|0;while(1){if(n>>>0>e>>>0){k=0;p=10;break}l=o+3|0;q=(d[o+1>>0]|0)<<8|(d[o+2>>0]|0);if(q>>>0>e>>>0){p=8;break}if(l>>>0<m>>>0){n=q;o=l}else{k=0;p=10;break}}if((p|0)==8){m=a[o>>0]|0;c[h>>2]=n;c[j>>2]=q-n;a[b+24>>0]=m;k=m;i=f;return k|0}else if((p|0)==10){i=f;return k|0}}else if((g|0)==0){k=a[(c[b+8>>2]|0)+e>>0]|0;i=f;return k|0}else{k=0;i=f;return k|0}return 0}function wSa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;i=i+16|0;g=f;h=c[(c[a+128>>2]|0)+48>>2]|0;if((h|0)==0){j=cSa((c[a+652>>2]|0)+1176|0,b,d,e)|0;i=f;return j|0}else{a=Qc[c[c[h>>2]>>2]&255](c[h+4>>2]|0,b,g)|0;c[d>>2]=c[g>>2];c[e>>2]=c[g+4>>2];j=a;i=f;return j|0}return 0}function xSa(d,f,g){d=d|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0;h=i;i=i+64|0;j=h+48|0;k=h+44|0;l=h+40|0;m=h;n=h+16|0;c[l>>2]=0;o=c[d>>2]|0;p=d+76|0;q=c[p>>2]|0;r=c[q+2972>>2]|0;do{if((r|0)==0){c[q+2976>>2]=579;s=ZDa(o,472,l)|0;c[(c[p>>2]|0)+2972>>2]=s;if((c[l>>2]|0)==0){s=c[(c[p>>2]|0)+2972>>2]|0;c[s>>2]=o;t=s+100|0;u=s+4|0;c[t+0>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;c[t+20>>2]=0;c[t+24>>2]=0;c[t+28>>2]=0;c[s+120>>2]=o;c[s+124>>2]=u;c[t>>2]=335;c[s+104>>2]=336;c[s+112>>2]=337;v=s;break}else{w=64;i=h;return w|0}}else{v=r}}while(0);r=v+132|0;c[r>>2]=d;o=v+128|0;c[o>>2]=d;p=d+4|0;l=c[(c[p>>2]|0)+96>>2]|0;q=m;c[q>>2]=0;c[q+4>>2]=0;c[m+12>>2]=f;c[m+4>>2]=f;c[m+8>>2]=f+g;c[n+0>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;c[n+16>>2]=0;c[n+20>>2]=0;g=c[d+8>>2]|0;d=a[g+161>>0]|0;f=(a[g+160>>0]|0)==0;if(f){c[n>>2]=1024;x=1024;y=1024}else{q=TDa(c[g+164>>2]|0,4194304)|0;c[n>>2]=q;x=TDa(c[g+168>>2]|0,4194304)|0;y=q}c[n+12>>2]=x;q=v+8|0;g=f&1^1;c[q>>2]=g;if(!(d<<24>>24==0)?(a[l+32>>0]|0)==0:0){c[q>>2]=g|2}g=b[(c[p>>2]|0)+68>>1]|0;p=g&65535;l=v+88|0;c[l>>2]=p;if(g<<16>>16<0){w=164;i=h;return w|0}g=TDa(131072e3,p<<16)|0;if((y|0)>(g|0)|(x|0)>(g|0)){w=164;i=h;return w|0}c[k>>2]=0;c[j>>2]=0;c[j+4>>2]=0;g=c[r>>2]|0;x=c[v+92>>2]|0;y=c[v+96>>2]|0;p=v+4|0;c[p>>2]=0;d=g+928|0;f=e[(c[(c[g+4>>2]|0)+88>>2]|0)+14>>1]<<16;g=v+84|0;if((c[g>>2]|0)==(f|0)){z=(c[v+136>>2]|0)!=(c[d>>2]|0)&1}else{c[g>>2]=f;z=1}g=c[q>>2]|0;a[v+140>>0]=g&1;q=v+12|0;if((Q2a(n,q,16)|0)==0){A=z}else{c[q+0>>2]=c[n+0>>2];c[q+4>>2]=c[n+4>>2];c[q+8>>2]=c[n+8>>2];c[q+12>>2]=c[n+12>>2];c[v+32>>2]=0;c[v+28>>2]=0;q=v+36|0;c[q+0>>2]=c[n+0>>2];c[q+4>>2]=c[n+4>>2];c[q+8>>2]=c[n+8>>2];c[q+12>>2]=c[n+12>>2];c[q+16>>2]=c[n+16>>2];c[q+20>>2]=c[n+20>>2];c[v+72>>2]=65536;c[v+60>>2]=65536;c[v+68>>2]=0;c[v+64>>2]=0;A=1}n=v+142|0;q=a[n>>0]|0;z=g&2;if((q&255|0)==(z|0)){if(!(A<<24>>24==0)){B=q;C=19}}else{q=z&255;a[n>>0]=q;B=q;C=19}a:do{if((C|0)==19){q=c[l>>2]|0;z=(q|0)==0?1e3:q;q=(f|0)<262144?262144:f;A=65536e3/(z|0)|0;g=c[(c[d>>2]|0)+388>>2]<<16;s=v+144|0;if((g|0)<1){D=TDa(4915200,A)|0}else{D=g}c[s>>2]=D;if((x|0)>0){g=TDa(z<<16,q)|0;cTa(A,q,D,v+152|0,(x|0)>(g|0)?x:g,0)}else{cTa(A,q,D,v+152|0,0,B)}g=c[(c[d>>2]|0)+384>>2]|0;if((g&65535)<<16>>16>0?(c[s>>2]|0)>(g<<17|0):0){g=TDa(4915200,A)|0;c[v+148>>2]=g;E=g}else{g=TDa(7208960,A)|0;c[v+148>>2]=g;E=g}g=v+156|0;cTa(A,q,E,g,y,a[n>>0]|0);if((c[v+152>>2]|0)==0?(c[g>>2]|0)==0:0){a[v+141>>0]=0}else{a[v+141>>0]=1}a[v+160>>0]=0;q=v+164|0;A=c[r>>2]|0;f3a(q|0,0,308)|0;s=c[v+48>>2]|0;c[q>>2]=s;z=v+176|0;t=A+928|0;c[z>>2]=TDa(c[(c[t>>2]|0)+372>>2]|0,65536e3)|0;c[v+180>>2]=c[(c[t>>2]|0)+376>>2]<<16;c[v+184>>2]=c[(c[t>>2]|0)+380>>2]<<16;A=c[t>>2]|0;t=a[A+176>>0]|0;u=t&255;F=A+180|0;G=a[A+177>>0]|0;H=G&255;I=a[A+178>>0]|0;J=I&255;K=a[A+179>>0]|0;L=K&255;do{if((c[A+512>>2]|0)==1){if((u|0)==4){if(!((c[F>>2]&65535)<<16>>16<-120)){break}if(!((c[A+184>>2]&65535)<<16>>16<-120)){break}if(!((c[A+188>>2]&65535)<<16>>16>880)){break}if(!((c[A+192>>2]&65535)<<16>>16>880)){break}}else if((u|0)!=0){break}c[v+220>>2]=-7864321;c[v+224>>2]=((SDa(-7864321,s)|0)+32768&-65536)+ -32768;c[v+228>>2]=s;c[v+212>>2]=49;M=(c[g>>2]<<1)+57671681|0;c[v+200>>2]=M;c[v+204>>2]=(SDa(M,s)|0)+32768&-65536|32768;c[v+208>>2]=s;c[v+192>>2]=50;a[v+173>>0]=1;break a}}while(0);s=v+168|0;if(t<<24>>24==0){N=0;O=0}else{F=0;M=0;P=0;while(1){c[v+(F*20|0)+232>>2]=c[A+(M<<2)+180>>2]<<16;c[v+((c[s>>2]|0)*20|0)+236>>2]=c[A+((M|1)<<2)+180>>2]<<16;Q=c[s>>2]|0;R=v+(Q*20|0)+236|0;S=c[R>>2]|0;T=S-(c[v+(Q*20|0)+232>>2]|0)|0;if((T|0)<0){U=Q;V=P}else{if((M|0)==0){a[v+(Q*20|0)+248>>0]=1;Q=c[s>>2]|0;c[v+(Q*20|0)+240>>2]=c[v+(Q*20|0)+236>>2]}else{c[R>>2]=(c[g>>2]<<1)+S;S=v+((c[s>>2]|0)*20|0)+232|0;c[S>>2]=(c[S>>2]|0)+(c[g>>2]<<1);a[v+((c[s>>2]|0)*20|0)+248>>0]=0;S=c[s>>2]|0;c[v+(S*20|0)+240>>2]=c[v+(S*20|0)+232>>2]}S=(c[s>>2]|0)+1|0;c[s>>2]=S;U=S;V=(T|0)>(P|0)?T:P}M=M+2|0;if(!(M>>>0<u>>>0)){N=U;O=V;break}else{F=U;P=V}}}if(G<<24>>24==0){W=N;X=O}else{P=N;F=0;u=O;while(1){c[v+(P*20|0)+232>>2]=c[A+(F<<2)+236>>2]<<16;c[v+((c[s>>2]|0)*20|0)+236>>2]=c[A+((F|1)<<2)+236>>2]<<16;M=c[s>>2]|0;t=(c[v+(M*20|0)+236>>2]|0)-(c[v+(M*20|0)+232>>2]|0)|0;if((t|0)<0){Y=M;Z=u}else{a[v+(M*20|0)+248>>0]=1;M=c[s>>2]|0;c[v+(M*20|0)+240>>2]=c[v+(M*20|0)+236>>2];M=(c[s>>2]|0)+1|0;c[s>>2]=M;Y=M;Z=(t|0)>(u|0)?t:u}F=F+2|0;if(!(F>>>0<H>>>0)){W=Y;X=Z;break}else{P=Y;u=Z}}}u=TDa(65536,c[q>>2]|0)|0;if((W|0)==0){_=0}else{P=K<<24>>24==0;H=(I&255)>1;F=A+280|0;G=(I&255)>2;t=0;while(1){M=v+(t*20|0)+240|0;T=c[M>>2]|0;b:do{if((a[v+(t*20|0)+248>>0]|0)==0){if(G){$=2;aa=2147483647}else{break}while(1){S=(c[g>>2]<<1)+(c[A+($<<2)+276>>2]<<16)|0;R=T-S|0;Q=(R|0)<0?0-R|0:R;if((Q|0)<(aa|0)&(Q|0)<(u|0)){c[M>>2]=S;if((Q|0)==0){break b}else{ba=Q}}else{ba=aa}$=$+2|0;if(!($>>>0<J>>>0)){break}else{aa=ba}}}else{c:do{if(P){ca=2147483647}else{Q=0;S=2147483647;while(1){R=c[A+((Q|1)<<2)+332>>2]<<16;da=T-R|0;ea=(da|0)<0?0-da|0:da;if((ea|0)<(S|0)&(ea|0)<(u|0)){c[M>>2]=R;if((ea|0)==0){ca=0;break c}else{fa=ea}}else{fa=S}Q=Q+2|0;if(!(Q>>>0<L>>>0)){ca=fa;break}else{S=fa}}}}while(0);if(!H){break}S=c[F>>2]<<16;Q=T-S|0;ea=(Q|0)<0?0-Q|0:Q;if(!((ea|0)<(ca|0)&(ea|0)<(u|0))){break}c[M>>2]=S}}while(0);t=t+1|0;M=c[s>>2]|0;if(!(t>>>0<M>>>0)){_=M;break}}}t=c[z>>2]|0;if((X|0)>0?(u=TDa(65536,X)|0,(t|0)>(u|0)):0){c[z>>2]=u;ga=u}else{ga=t}t=c[q>>2]|0;if((t|0)<(ga|0)){a[v+172>>0]=1;u=SDa(39322,65536-(TDa(t,ga)|0)|0)|0;c[v+188>>2]=(u|0)>32767?32767:u}if((a[n>>0]|0)!=0){c[v+188>>2]=0}if((_|0)==0){break}u=v+188|0;F=t;t=0;while(1){H=(a[v+(t*20|0)+248>>0]|0)==0;L=SDa(c[v+(t*20|0)+240>>2]|0,F)|0;A=c[u>>2]|0;P=L+32768|0;if(H){c[v+(t*20|0)+244>>2]=P+A&-65536}else{c[v+(t*20|0)+244>>2]=P-A&-65536}A=t+1|0;if(!(A>>>0<(c[s>>2]|0)>>>0)){break a}F=c[q>>2]|0;t=A}}}while(0);d:do{if((c[p>>2]|0)==0){_=v+160|0;a[_>>0]=0;n=v+116|0;ga=v+100|0;X=a[v+141>>0]|0;while(1){ca=c[o>>2]|0;c[n>>2]=0;_Da(c[ca+12>>2]|0);ASa(v,m,ga,j,0,0,0,k);if((c[p>>2]|0)!=0){break d}if(X<<24>>24==0){break}if((c[n>>2]|0)>-1){break}a[_>>0]=1;X=0}X=c[o>>2]|0;CSa(c[X+20>>2]|0);iEa(c[X+12>>2]|0)}}while(0);j=c[k>>2]|0;BSa(p,0);if((c[p>>2]|0)!=0){w=3;i=h;return w|0}c[(c[o>>2]|0)+744>>2]=j+32768>>16;w=0;i=h;return w|0}function ySa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;g=(c[a+128>>2]|0)+48|0;if((c[g>>2]|0)==0){dSa((c[a+652>>2]|0)+1176|0,b);i=e;return}else{c[f>>2]=c[b>>2];c[f+4>>2]=d;d=c[g>>2]|0;Ic[c[(c[d>>2]|0)+4>>2]&511](c[d+4>>2]|0,f);i=e;return}}function zSa(a){a=a|0;return}function ASa(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0;l=i;i=i+15840|0;m=l+11968|0;n=l+11964|0;o=l+11960|0;p=l+11928|0;q=l+15836|0;r=l+11896|0;s=l+11864|0;t=l+11832|0;u=l+48|0;v=l+32|0;w=l+28|0;x=l;c[n>>2]=h;c[o>>2]=j;h=b+132|0;y=c[h>>2]|0;z=b+4|0;A=c[b>>2]|0;B=b+48|0;C=c[B>>2]|0;D=y+928|0;E=c[(c[D>>2]|0)+532>>2]<<16;c[p>>2]=A;c[p+4>>2]=z;c[p+8>>2]=16;F=p+12|0;c[F>>2]=0;c[p+16>>2]=10;G=p+20|0;c[G>>2]=0;c[p+24>>2]=0;H=p+28|0;c[H>>2]=0;c[r>>2]=A;c[r+4>>2]=z;c[r+8>>2]=20;c[r+12>>2]=0;c[r+16>>2]=10;I=r+20|0;c[I>>2]=0;c[r+24>>2]=0;c[r+28>>2]=0;c[s>>2]=A;c[s+4>>2]=z;c[s+8>>2]=20;c[s+12>>2]=0;c[s+16>>2]=10;J=s+20|0;c[J>>2]=0;c[s+24>>2]=0;c[s+28>>2]=0;c[t+0>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;c[t+20>>2]=0;c[t+24>>2]=0;c[t>>2]=z;f3a(u|0,0,11784)|0;c[u>>2]=b;K=u+4|0;c[K>>2]=e;L=u+11612|0;c[L>>2]=A;c[u+11616>>2]=z;c[u+11620>>2]=8;c[u+11624>>2]=0;c[u+11628>>2]=10;c[u+11632>>2]=0;c[u+11636>>2]=0;c[u+11640>>2]=0;M=u+7744|0;f3a(M|0,0,3868)|0;N=b+140|0;O=a[N>>0]|0;a[u+7757>>0]=O;c[u+7760>>2]=C;c[M>>2]=b;c[u+7748>>2]=M;c[u+7752>>2]=L;P=u+3876|0;f3a(P|0,0,3868)|0;a[u+3889>>0]=O;c[u+3892>>2]=C;c[P>>2]=b;c[u+3880>>2]=M;c[u+3884>>2]=L;P=u+8|0;f3a(P|0,0,3868)|0;a[u+21>>0]=O;c[u+24>>2]=C;c[P>>2]=b;c[u+12>>2]=M;c[u+16>>2]=L;c[u+11644>>2]=c[b+36>>2];c[u+11648>>2]=c[b+44>>2];c[u+11652>>2]=c[B>>2];B=f;P=c[B+4>>2]|0;O=u+11656|0;c[O>>2]=c[B>>2];c[O+4>>2]=P;c[u+11668>>2]=r;c[u+11672>>2]=s;c[u+11676>>2]=t;c[u+11680>>2]=j;c[u+11684>>2]=b+164;a[u+11665>>0]=a[b+141>>0]|0;j=c[b+152>>2]|0;c[u+11688>>2]=j;P=c[b+156>>2]|0;c[u+11692>>2]=P;O=(j|0)<0?0-j|0:j;j=(P|0)<0?0-P|0:P;c[u+11696>>2]=((O|0)>(j|0)?O:j)<<1;c[u+11700>>2]=6554;a[u+11666>>0]=1;a[u+11664>>0]=0;a[u+11744>>0]=0;a[q>>0]=0;c[k>>2]=c[(c[D>>2]|0)+528>>2]<<16;c[m>>2]=0;D=EFa(A,396,m)|0;if((c[m>>2]|0)!=0){if((D|0)==0){BSa(z,64);TSa(L);TSa(s);TSa(r);TSa(p);i=l;return}else{Q=0}}else{c[D>>2]=A;c[D+4>>2]=z;c[D+392>>2]=D+8;Q=(D|0)==0}if(!((c[F>>2]|0)>>>0<11?(XSa(p,11)|0)<<24>>24==0:0)){c[G>>2]=11}G=c[H>>2]|0;c[G+0>>2]=c[d+0>>2];c[G+4>>2]=c[d+4>>2];c[G+8>>2]=c[d+8>>2];c[G+12>>2]=c[d+12>>2];a:do{if((c[z>>2]|0)==0){d=D+392|0;H=D+4|0;F=D+8|0;A=F;j=y+900|0;O=y+892|0;P=y+908|0;B=y+896|0;R=y+888|0;S=y+904|0;T=m+13|0;U=m+16|0;V=m+4|0;W=m+8|0;X=G;Y=0;Z=19999999;b:while(1){if((c[X+12>>2]|0)>>>0<(c[X+8>>2]|0)>>>0){_=(DSa(X)|0)&255}else{_=(Y|0)==0?14:11}if((c[z>>2]|0)!=0){$=0;break a}if((Z|0)==0){$=18;break a}c:do{switch(_|0){case 14:{break b;break};case 5:{aa=(c[d>>2]|0)-A>>3;if((aa|0)!=0){ba=0;do{da=FSa(D,ba)|0;c[n>>2]=(c[n>>2]|0)+da;da=FSa(D,ba|1)|0;ea=(c[o>>2]|0)+da|0;c[o>>2]=ea;ISa(u,c[n>>2]|0,ea);ea=c[K>>2]|0;if(((ea|0)!=0?(da=c[ea+24>>2]|0,(da|0)!=0):0)?(c[da>>2]|0)!=0:0){$=0;break a}ba=ba+2|0}while(ba>>>0<aa>>>0)}c[d>>2]=F;fa=X;ga=Y;break};case 25:{aa=(c[d>>2]|0)-A>>3;if(aa>>>0>6){ba=0;while(1){da=FSa(D,ba)|0;c[n>>2]=(c[n>>2]|0)+da;da=FSa(D,ba|1)|0;ea=(c[o>>2]|0)+da|0;c[o>>2]=ea;ISa(u,c[n>>2]|0,ea);ea=c[K>>2]|0;if(((ea|0)!=0?(da=c[ea+24>>2]|0,(da|0)!=0):0)?(c[da>>2]|0)!=0:0){$=0;break a}da=ba+2|0;if((ba+8|0)>>>0<aa>>>0){ba=da}else{ha=da;break}}}else{ha=0}if(ha>>>0<aa>>>0){ba=ha;do{da=FSa(D,ba)|0;ea=(c[n>>2]|0)+da|0;da=FSa(D,ba|1)|0;ia=(c[o>>2]|0)+da|0;da=(FSa(D,ba+2|0)|0)+ea|0;ja=(FSa(D,ba+3|0)|0)+ia|0;ka=(FSa(D,ba+4|0)|0)+da|0;la=(FSa(D,ba+5|0)|0)+ja|0;JSa(u,ea,ia,da,ja,ka,la);ja=c[K>>2]|0;if(((ja|0)!=0?(da=c[ja+24>>2]|0,(da|0)!=0):0)?(c[da>>2]|0)!=0:0){$=0;break a}c[n>>2]=ka;c[o>>2]=la;ba=ba+6|0}while(ba>>>0<aa>>>0)}c[d>>2]=F;fa=X;ga=Y;break};case 8:case 24:{aa=(c[d>>2]|0)-A>>3;if(aa>>>0<6){ma=0}else{ba=6;la=0;while(1){ka=FSa(D,la)|0;da=(c[n>>2]|0)+ka|0;ka=FSa(D,la|1)|0;ja=(c[o>>2]|0)+ka|0;ka=(FSa(D,la+2|0)|0)+da|0;ia=(FSa(D,la+3|0)|0)+ja|0;ea=(FSa(D,la+4|0)|0)+ka|0;na=(FSa(D,la+5|0)|0)+ia|0;JSa(u,da,ja,ka,ia,ea,na);ia=c[K>>2]|0;if(((ia|0)!=0?(ka=c[ia+24>>2]|0,(ka|0)!=0):0)?(c[ka>>2]|0)!=0:0){$=0;break a}c[n>>2]=ea;c[o>>2]=na;na=ba+6|0;if(na>>>0>aa>>>0){ma=ba;break}else{ea=ba;ba=na;la=ea}}}if((((_|0)==24?(la=FSa(D,ma)|0,c[n>>2]=(c[n>>2]|0)+la,la=FSa(D,ma|1)|0,ba=(c[o>>2]|0)+la|0,c[o>>2]=ba,ISa(u,c[n>>2]|0,ba),ba=c[K>>2]|0,(ba|0)!=0):0)?(la=c[ba+24>>2]|0,(la|0)!=0):0)?(c[la>>2]|0)!=0:0){$=0;break a}c[d>>2]=F;fa=X;ga=Y;break};case 1:case 18:{ESa(b,D,r,k,q);if((a[(c[h>>2]|0)+753>>0]|0)==0){oa=141}else{$=0;break a}break};case 10:case 29:{if((Y|0)>10){$=18;break a}la=Y+1|0;ba=KSa(p,la)|0;aa=LSa(D)|0;ea=(_|0)==29;c[ba+0>>2]=0;c[ba+4>>2]=0;c[ba+8>>2]=0;c[ba+12>>2]=0;if(ea){ea=(c[j>>2]|0)+aa|0;if(!(ea>>>0<(c[O>>2]|0)>>>0)){$=18;break a}na=c[(c[P>>2]|0)+(ea<<2)>>2]|0;c[ba+12>>2]=na;c[ba+4>>2]=na;c[ba+8>>2]=c[(c[P>>2]|0)+(ea+1<<2)>>2];fa=ba;ga=la;break c}else{ea=(c[B>>2]|0)+aa|0;if(!(ea>>>0<(c[R>>2]|0)>>>0)){$=18;break a}aa=c[(c[S>>2]|0)+(ea<<2)>>2]|0;c[ba+12>>2]=aa;c[ba+4>>2]=aa;c[ba+8>>2]=c[(c[S>>2]|0)+(ea+1<<2)>>2];fa=ba;ga=la;break c}break};case 22:{if((c[d>>2]|0)-A>>3>>>0>1?(a[q>>0]|0)==0:0){c[k>>2]=(FSa(D,0)|0)+E}a[q>>0]=1;if((a[(c[h>>2]|0)+753>>0]|0)!=0){$=0;break a}la=GSa(D)|0;ba=(c[n>>2]|0)+la|0;c[n>>2]=ba;HSa(u,ba,c[o>>2]|0);ba=c[K>>2]|0;if(((ba|0)!=0?(la=c[ba+24>>2]|0,(la|0)!=0):0)?(c[la>>2]|0)!=0:0){$=0;break a}else{oa=141}break};case 3:case 23:{ESa(b,D,s,k,q);if((a[(c[h>>2]|0)+753>>0]|0)==0){oa=141}else{$=0;break a}break};case 4:{if((c[d>>2]|0)-A>>3>>>0>1?(a[q>>0]|0)==0:0){c[k>>2]=(FSa(D,0)|0)+E}a[q>>0]=1;if((a[(c[h>>2]|0)+753>>0]|0)!=0){$=0;break a}la=GSa(D)|0;ba=(c[o>>2]|0)+la|0;c[o>>2]=ba;HSa(u,c[n>>2]|0,ba);ba=c[K>>2]|0;if(((ba|0)!=0?(la=c[ba+24>>2]|0,(la|0)!=0):0)?(c[la>>2]|0)!=0:0){$=0;break a}else{oa=141}break};case 27:{la=(c[d>>2]|0)-A>>3;if((la|0)!=0){ba=0;do{if((la-ba&1|0)==0){pa=ba;qa=c[o>>2]|0}else{ea=FSa(D,ba)|0;pa=ba+1|0;qa=(c[o>>2]|0)+ea|0}ea=FSa(D,pa)|0;aa=(c[n>>2]|0)+ea|0;ea=(FSa(D,pa+1|0)|0)+aa|0;na=(FSa(D,pa+2|0)|0)+qa|0;ka=(FSa(D,pa+3|0)|0)+ea|0;JSa(u,aa,qa,ea,na,ka,na);ea=c[K>>2]|0;if(((ea|0)!=0?(aa=c[ea+24>>2]|0,(aa|0)!=0):0)?(c[aa>>2]|0)!=0:0){$=0;break a}c[n>>2]=ka;c[o>>2]=na;ba=pa+4|0}while(ba>>>0<la>>>0)}c[d>>2]=F;fa=X;ga=Y;break};case 26:{la=(c[d>>2]|0)-A>>3;if((la|0)!=0){ba=0;do{if((la-ba&1|0)==0){ra=ba;sa=c[n>>2]|0}else{na=FSa(D,ba)|0;ra=ba+1|0;sa=(c[n>>2]|0)+na|0}na=FSa(D,ra)|0;ka=(c[o>>2]|0)+na|0;na=(FSa(D,ra+1|0)|0)+sa|0;aa=(FSa(D,ra+2|0)|0)+ka|0;ea=(FSa(D,ra+3|0)|0)+aa|0;JSa(u,sa,ka,na,aa,na,ea);aa=c[K>>2]|0;if(((aa|0)!=0?(ka=c[aa+24>>2]|0,(ka|0)!=0):0)?(c[ka>>2]|0)!=0:0){$=0;break a}c[n>>2]=na;c[o>>2]=ea;ba=ra+4|0}while(ba>>>0<la>>>0)}c[d>>2]=F;fa=X;ga=Y;break};case 12:{la=(DSa(X)|0)&255;if((la|0)==36){MSa(D,n,o,u,1287624,0);fa=X;ga=Y;break c}else if((la|0)==37){MSa(D,n,o,u,1287640,1);fa=X;ga=Y;break c}else if((la|0)==34){MSa(D,n,o,u,1287592,0);fa=X;ga=Y;break c}else if((la|0)==35){MSa(D,n,o,u,1287608,0);oa=141;break c}else{oa=141;break c}break};case 11:{if((Y|0)<1){$=18;break a}la=Y+ -1|0;fa=KSa(p,la)|0;ga=la;break};case 21:{if((c[d>>2]|0)-A>>3>>>0>2?(a[q>>0]|0)==0:0){c[k>>2]=(FSa(D,0)|0)+E}a[q>>0]=1;if((a[(c[h>>2]|0)+753>>0]|0)!=0){$=0;break a}la=GSa(D)|0;c[o>>2]=(c[o>>2]|0)+la;la=GSa(D)|0;ba=(c[n>>2]|0)+la|0;c[n>>2]=ba;HSa(u,ba,c[o>>2]|0);ba=c[K>>2]|0;if(((ba|0)!=0?(la=c[ba+24>>2]|0,(la|0)!=0):0)?(c[la>>2]|0)!=0:0){$=0;break a}else{oa=141}break};case 31:case 30:{la=(c[d>>2]|0)-A>>3;if((la|0)!=0){ba=(_|0)==31&1;ea=0;while(1){if(ba<<24>>24==0){na=c[n>>2]|0;ka=FSa(D,ea)|0;aa=(c[o>>2]|0)+ka|0;ka=ea+1|0;ia=(FSa(D,ka)|0)+na|0;ja=(FSa(D,ea+2|0)|0)+aa|0;da=(FSa(D,ea+3|0)|0)+ia|0;if((la-ea|0)==5){ta=1;ua=ka;va=na;wa=ia;xa=da;ya=aa;za=ja;Aa=(FSa(D,ea+4|0)|0)+ja|0}else{ta=1;ua=ea;va=na;wa=ia;xa=da;ya=aa;za=ja;Aa=ja}}else{ja=FSa(D,ea)|0;aa=(c[n>>2]|0)+ja|0;ja=c[o>>2]|0;da=ea+1|0;ia=(FSa(D,da)|0)+aa|0;na=(FSa(D,ea+2|0)|0)+ja|0;ka=(FSa(D,ea+3|0)|0)+na|0;if((la-ea|0)==5){ta=0;ua=da;va=aa;wa=ia;xa=(FSa(D,ea+4|0)|0)+ia|0;ya=ja;za=na;Aa=ka}else{ta=0;ua=ea;va=aa;wa=ia;xa=ia;ya=ja;za=na;Aa=ka}}JSa(u,va,ya,wa,za,xa,Aa);ka=c[K>>2]|0;if(((ka|0)!=0?(na=c[ka+24>>2]|0,(na|0)!=0):0)?(c[na>>2]|0)!=0:0){$=0;break a}c[n>>2]=xa;c[o>>2]=Aa;ea=ua+4|0;if(!(ea>>>0<la>>>0)){break}else{ba=ta}}}c[d>>2]=F;fa=X;ga=Y;break};case 7:case 6:{ba=(c[d>>2]|0)-A>>3;if((ba|0)!=0){la=0;ea=(_|0)==6;do{na=FSa(D,la)|0;if(ea){ka=(c[n>>2]|0)+na|0;c[n>>2]=ka;Ba=ka;Ca=c[o>>2]|0}else{ka=(c[o>>2]|0)+na|0;c[o>>2]=ka;Ba=c[n>>2]|0;Ca=ka}ea=ea^1;ISa(u,Ba,Ca);ka=c[K>>2]|0;if(((ka|0)!=0?(na=c[ka+24>>2]|0,(na|0)!=0):0)?(c[na>>2]|0)!=0:0){$=0;break a}la=la+1|0}while(la>>>0<ba>>>0)}c[d>>2]=F;fa=X;ga=Y;break};case 19:case 20:{ESa(b,D,s,k,q);if((a[(c[h>>2]|0)+753>>0]|0)!=0){$=0;break a}if((_|0)==19){QSa(t,X,(c[J>>2]|0)+(c[I>>2]|0)|0);oa=141;break c}else{f3a(m|0,0,3868)|0;a[T>>0]=a[N>>0]|0;c[U>>2]=C;c[m>>2]=b;c[V>>2]=M;c[W>>2]=L;c[x+0>>2]=0;c[x+4>>2]=0;c[x+8>>2]=0;c[x+12>>2]=0;c[x+16>>2]=0;c[x+20>>2]=0;c[x+24>>2]=0;c[x>>2]=z;QSa(x,X,(c[J>>2]|0)+(c[I>>2]|0)|0);RSa(m,r,s,x,0,0);oa=141;break c}break};case 17:case 16:case 15:case 13:case 9:case 2:case 0:{oa=141;break};case 28:{ba=(DSa(X)|0)<<8;SSa(D,(ba|(DSa(X)|0))<<16>>16);fa=X;ga=Y;break};default:{if(_>>>0<247){SSa(D,_+ -139|0);fa=X;ga=Y;break c}if(_>>>0<251){SSa(D,(_<<8)+ -63124+(DSa(X)|0)|0);fa=X;ga=Y;break c}ba=DSa(X)|0;if((_|0)!=255){SSa(D,(ca(_,-256)|0)+64148-ba|0);fa=X;ga=Y;break c}la=DSa(X)|0;ea=DSa(X)|0;na=DSa(X)|0;ka=c[d>>2]|0;if((ka|0)==(d|0)){BSa(c[H>>2]|0,130);fa=X;ga=Y;break c}else{c[ka>>2]=la<<16|ba<<24|ea<<8|na;c[(c[d>>2]|0)+4>>2]=0;c[d>>2]=(c[d>>2]|0)+8;fa=X;ga=Y;break c}}}}while(0);if((oa|0)==141){oa=0;c[d>>2]=F;fa=X;ga=Y}X=fa;Y=ga;Z=Z+ -1|0}Z=(c[d>>2]|0)-A>>3;if((Z|0)==5|(Z|0)==1?(a[q>>0]|0)==0:0){c[k>>2]=(FSa(D,0)|0)+E}a[q>>0]=1;if((a[(c[h>>2]|0)+753>>0]|0)==0?(NSa(u),(c[d>>2]|0)-A>>3>>>0>1):0){if(g<<24>>24==0){Z=LSa(D)|0;Y=LSa(D)|0;c[o>>2]=GSa(D)|0;c[n>>2]=GSa(D)|0;X=OSa(y,Z,v)|0;if((X|0)==0){ASa(b,v,e,f,1,c[n>>2]|0,c[o>>2]|0,w);Z=y+4|0;PSa(c[Z>>2]|0,v);F=OSa(y,Y,v)|0;if((F|0)==0){ASa(b,v,e,f,1,0,0,w);PSa(c[Z>>2]|0,v);$=0}else{$=F}}else{$=X}}else{$=18}}else{$=0}}else{$=0}}while(0);BSa(z,$);TSa(L);TSa(s);TSa(r);TSa(p);if(Q){i=l;return}aEa(c[D>>2]|0,D);i=l;return}function BSa(a,b){a=a|0;b=b|0;var d=0;d=i;if((a|0)!=0?(c[a>>2]|0)==0:0){c[a>>2]=b}i=d;return}function CSa(d){d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;if((d|0)==0){i=e;return}f=b[d>>1]|0;if(f<<16>>16<2){g=0}else{g=(b[(c[d+12>>2]|0)+((f<<16>>16)+ -2<<1)>>1]|0)+1|0}h=d+2|0;j=b[h>>1]|0;if(((j<<16>>16>1?(k=c[d+4>>2]|0,l=(j<<16>>16)+ -1|0,m=(c[d+8>>2]|0)+l|0,(c[k+(g<<3)>>2]|0)==(c[k+(l<<3)>>2]|0)):0)?(c[k+(g<<3)+4>>2]|0)==(c[k+(l<<3)+4>>2]|0):0)?(a[m>>0]|0)==1:0){m=j+ -1<<16>>16;b[h>>1]=m;n=m}else{n=j}if(!(f<<16>>16>0)){i=e;return}j=(n<<16>>16)+ -1|0;if((g|0)==(j|0)){b[d>>1]=f+ -1<<16>>16;b[h>>1]=n+ -1<<16>>16;i=e;return}else{b[(c[d+12>>2]|0)+((f<<16>>16)+ -1<<1)>>1]=j;i=e;return}}function DSa(a){a=a|0;var b=0,e=0,f=0,g=0;b=i;e=a+12|0;f=c[e>>2]|0;if(f>>>0<(c[a+8>>2]|0)>>>0){c[e>>2]=f+1;g=d[f>>0]|0;i=b;return g|0}else{BSa(c[a>>2]|0,85);g=0;i=b;return g|0}return 0}function ESa(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;h=i;i=i+32|0;j=h;k=d+392|0;l=d+8|0;m=(c[k>>2]|0)-l>>3;n=m&1;if((n|0)!=0?(a[g>>0]|0)==0:0){o=FSa(d,0)|0;c[f>>2]=(c[(c[(c[b+132>>2]|0)+928>>2]|0)+532>>2]<<16)+o}if((a[(c[b+132>>2]|0)+753>>0]|0)!=0){a[g>>0]=1;i=h;return}if(n>>>0<m>>>0){b=j+4|0;o=j+8|0;f=j+12|0;p=j+16|0;q=n;n=0;do{r=(FSa(d,q)|0)+n|0;c[b>>2]=r;n=r+(FSa(d,q+1|0)|0)|0;c[o>>2]=n;a[j>>0]=0;c[f>>2]=0;c[p>>2]=0;WSa(e,j);q=q+2|0}while(q>>>0<m>>>0)}c[k>>2]=l;a[g>>0]=1;i=h;return}function FSa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;do{if((c[a+392>>2]|0)-(a+8)>>3>>>0>b>>>0){e=a+(b<<3)+8|0;f=c[a+(b<<3)+12>>2]|0;if((f|0)==1){g=c[e>>2]|0;if((g|0)<0){h=0-(8192-g>>14)|0;break}else{h=g+8192>>14;break}}else if((f|0)==2){h=c[e>>2]<<16;break}else{h=c[e>>2]|0;break}}else{BSa(c[a+4>>2]|0,130);h=0}}while(0);i=d;return h|0}function GSa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;d=a+392|0;e=c[d>>2]|0;do{if((e|0)!=(a+8|0)){f=e+ -8|0;c[d>>2]=f;g=c[e+ -4>>2]|0;if((g|0)==1){h=c[f>>2]|0;if((h|0)<0){j=0-(8192-h>>14)|0;break}else{j=h+8192>>14;break}}else if((g|0)==2){j=c[f>>2]<<16;break}else{j=c[f>>2]|0;break}}else{BSa(c[a+4>>2]|0,161);j=0}}while(0);i=b;return j|0}function HSa(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;NSa(b);c[b+11736>>2]=d;c[b+11720>>2]=d;c[b+11740>>2]=e;c[b+11724>>2]=e;a[b+11666>>0]=1;e=b+8|0;d=c[b+11676>>2]|0;if((a[b+20>>0]|0)!=0?(a[d+5>>0]|0)==0:0){g=b+3876|0;c3a(g|0,e|0,3868)|0;i=f;return}RSa(e,c[b+11668>>2]|0,c[b+11672>>2]|0,d,c[b+11680>>2]|0,0);g=b+3876|0;c3a(g|0,e|0,3868)|0;i=f;return}function ISa(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;i=i+16|0;g=f+12|0;h=f+8|0;j=f;k=b+11720|0;l=c[k>>2]|0;m=b+11724|0;n=c[m>>2]|0;if((l|0)==(d|0)&(n|0)==(e|0)){i=f;return}aTa(b,l,n,d,e,g,h);n=c[g>>2]|0;g=n+(c[k>>2]|0)|0;c[j>>2]=g;l=c[h>>2]|0;h=l+(c[m>>2]|0)|0;c[j+4>>2]=h;o=n+d|0;n=l+e|0;l=b+11666|0;if((a[l>>0]|0)!=0){bTa(b,g,h);h=c[b+4>>2]|0;if(((h|0)!=0?(g=c[h+24>>2]|0,(g|0)!=0):0)?(c[g>>2]|0)!=0:0){i=f;return}a[l>>0]=0;a[b+11664>>0]=1;l=b+11712|0;c[l>>2]=o;c[l+4>>2]=n}l=b+11744|0;if((((a[l>>0]|0)!=0?(_Sa(b,b+8|0,j,o,n,0),g=c[b+4>>2]|0,(g|0)!=0):0)?(h=c[g+24>>2]|0,(h|0)!=0):0)?(c[h>>2]|0)!=0:0){i=f;return}a[l>>0]=1;c[b+11748>>2]=2;l=j;j=c[l+4>>2]|0;h=b+11752|0;c[h>>2]=c[l>>2];c[h+4>>2]=j;j=b+11760|0;c[j>>2]=o;c[j+4>>2]=n;n=c[b+11676>>2]|0;if((a[n+5>>0]|0)!=0){RSa(b+8|0,c[b+11668>>2]|0,c[b+11672>>2]|0,n,c[b+11680>>2]|0,0)}c[k>>2]=d;c[m>>2]=e;i=f;return}function JSa(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;k=i;i=i+32|0;l=k+20|0;m=k+16|0;n=k+12|0;o=k+8|0;p=k;q=b+11720|0;r=b+11724|0;aTa(b,c[q>>2]|0,c[r>>2]|0,d,e,l,m);aTa(b,f,g,h,j,n,o);s=(ca(g-e>>16,d>>16)|0)-(ca(f-d>>16,e>>16)|0)|0;t=b+4|0;u=(c[t>>2]|0)+16|0;c[u>>2]=s+(c[u>>2]|0);u=c[l>>2]|0;l=u+(c[q>>2]|0)|0;c[p>>2]=l;s=c[m>>2]|0;m=s+(c[r>>2]|0)|0;c[p+4>>2]=m;v=u+d|0;d=s+e|0;e=c[n>>2]|0;n=e+f|0;f=c[o>>2]|0;o=f+g|0;g=e+h|0;e=f+j|0;f=b+11666|0;if((a[f>>0]|0)!=0){bTa(b,l,m);m=c[t>>2]|0;if(((m|0)!=0?(l=c[m+24>>2]|0,(l|0)!=0):0)?(c[l>>2]|0)!=0:0){i=k;return}a[f>>0]=0;a[b+11664>>0]=1;f=b+11712|0;c[f>>2]=v;c[f+4>>2]=d}f=b+11744|0;if((((a[f>>0]|0)!=0?(_Sa(b,b+8|0,p,v,d,0),l=c[t>>2]|0,(l|0)!=0):0)?(t=c[l+24>>2]|0,(t|0)!=0):0)?(c[t>>2]|0)!=0:0){i=k;return}a[f>>0]=1;c[b+11748>>2]=4;f=p;p=c[f+4>>2]|0;t=b+11752|0;c[t>>2]=c[f>>2];c[t+4>>2]=p;p=b+11760|0;c[p>>2]=v;c[p+4>>2]=d;c[b+11768>>2]=n;c[b+11772>>2]=o;c[b+11776>>2]=g;c[b+11780>>2]=e;e=c[b+11676>>2]|0;if((a[e+5>>0]|0)!=0){RSa(b+8|0,c[b+11668>>2]|0,c[b+11672>>2]|0,e,c[b+11680>>2]|0,0)}c[q>>2]=h;c[r>>2]=j;i=k;return}function KSa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((c[a+20>>2]|0)>>>0>b>>>0){e=b}else{BSa(c[a+4>>2]|0,130);e=0}b=(c[a+28>>2]|0)+(ca(c[a+8>>2]|0,e)|0)|0;i=d;return b|0}function LSa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+392|0;e=c[d>>2]|0;if((e|0)==(a+8|0)){BSa(c[a+4>>2]|0,161);f=0;i=b;return f|0}g=e+ -8|0;if((c[e+ -4>>2]|0)==2){c[d>>2]=g;f=c[g>>2]|0;i=b;return f|0}else{BSa(c[a+4>>2]|0,160);f=0;i=b;return f|0}return 0}function MSa(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;j=i;i=i+64|0;k=j;l=c[d>>2]|0;c[k>>2]=l;c[k+4>>2]=c[e>>2];m=(a[g+9>>0]|0)==0;n=m?9:10;o=l;l=0;p=0;while(1){q=k+(l+2<<2)|0;c[q>>2]=o;if((a[g+l>>0]|0)==0){r=p}else{s=FSa(b,p)|0;c[q>>2]=(c[q>>2]|0)+s;r=p+1|0}s=l+1|0;if((s|0)>=(n|0)){break}o=c[k+(s<<2)>>2]|0;l=s;p=r}if(m){c[k+44>>2]=c[e>>2]}do{if(h<<24>>24==0){if((a[g+10>>0]|0)==0){c[k+48>>2]=c[d>>2];t=r}else{m=c[k+40>>2]|0;c[k+48>>2]=(FSa(b,r)|0)+m;t=r+1|0}if((a[g+11>>0]|0)==0){c[k+52>>2]=c[e>>2];u=0;break}else{m=c[k+44>>2]|0;c[k+52>>2]=(FSa(b,t)|0)+m;u=0;break}}else{m=k+40|0;p=(c[m>>2]|0)-(c[d>>2]|0)|0;l=k+44|0;o=(c[l>>2]|0)-(c[e>>2]|0)|0;n=FSa(b,r)|0;if((((p|0)<0?0-p|0:p)|0)>(((o|0)<0?0-o|0:o)|0)){c[k+48>>2]=(c[m>>2]|0)+n;c[k+52>>2]=c[e>>2];u=0;break}else{c[k+48>>2]=c[d>>2];c[k+52>>2]=(c[l>>2]|0)+n;u=0;break}}}while(0);do{r=u*6|0;JSa(f,c[k+(r+2<<2)>>2]|0,c[k+(r+3<<2)>>2]|0,c[k+(r+4<<2)>>2]|0,c[k+(r+5<<2)>>2]|0,c[k+(r+6<<2)>>2]|0,c[k+(r+7<<2)>>2]|0);u=u+1|0}while((u|0)!=2);c[b+392>>2]=b+8;c[d>>2]=c[k+48>>2];c[e>>2]=c[k+52>>2];i=j;return}function NSa(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;e=b+11664|0;if((a[e>>0]|0)==0){i=d;return}ISa(b,c[b+11736>>2]|0,c[b+11740>>2]|0);f=c[b+4>>2]|0;if(((f|0)!=0?(g=c[f+24>>2]|0,(g|0)!=0):0)?(c[g>>2]|0)!=0:0){i=d;return}_Sa(b,b+3876|0,b+11704|0,c[b+11712>>2]|0,c[b+11716>>2]|0,1);a[b+11666>>0]=1;a[e>>0]=0;a[b+11744>>0]=0;i=d;return}function OSa(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;i=i+16|0;g=f+4|0;h=f;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;j=c[a+76>>2]|0;k=c[j+1160>>2]|0;if((k|0)==0|d>>>0>255){l=18;i=f;return l|0}if(d>>>0<256){m=b[1284096+(d<<1)>>1]|0}else{m=0}d=c[j+12>>2]|0;if((d|0)==0){l=18;i=f;return l|0}else{n=0}while(1){j=n+1|0;if((b[k+(n<<1)>>1]|0)==m<<16>>16){break}if(j>>>0<d>>>0){n=j}else{l=18;o=10;break}}if((o|0)==10){i=f;return l|0}if((n|0)<0){l=18;i=f;return l|0}o=wSa(c[a+4>>2]|0,n,g,h)|0;if((o|0)!=0){l=o;i=f;return l|0}o=c[g>>2]|0;c[e+4>>2]=o;c[e+8>>2]=o+(c[h>>2]|0);c[e+12>>2]=o;l=0;i=f;return l|0}function PSa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=b+4|0;ySa(a,e,(c[b+8>>2]|0)-(c[e>>2]|0)|0);i=d;return}function QSa(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;if((ZSa(b,e)|0)==0){i=f;return}e=b+12|0;if((c[e>>2]|0)==0){i=f;return}else{g=0}do{a[b+g+16>>0]=DSa(d)|0;g=g+1|0}while(g>>>0<(c[e>>2]|0)>>>0);i=f;return}function RSa(b,e,f,g,h,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0;k=i;i=i+176|0;l=k+168|0;m=k+140|0;n=k+120|0;o=k+100|0;p=k+80|0;q=k+60|0;r=k+40|0;s=k+20|0;t=k;u=c[b>>2]|0;v=j<<24>>24!=0;if(!v?(j=c[b+4>>2]|0,(a[j+12>>0]|0)==0):0){w=c[g>>2]|0;c[m+0>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;c[m+20>>2]=0;c[m+24>>2]=0;c[m>>2]=w;RSa(j,e,f,m,h,1)}j=e+20|0;if((a[g+4>>0]|0)==0?(w=(c[f+20>>2]|0)+(c[j>>2]|0)|0,f=0-w&7,(ZSa(g,w)|0)!=0):0){w=g+12|0;if((c[w>>2]|0)==0){x=-1}else{y=0;do{a[g+y+16>>0]=-1;y=y+1|0;z=c[w>>2]|0}while(y>>>0<z>>>0);x=z+ -1|0}z=g+x+16|0;a[z>>0]=d[z>>0]&-1<<f}f=b+20|0;c[f>>2]=0;c[b+24>>2]=0;c[m+0>>2]=c[g+0>>2];c[m+4>>2]=c[g+4>>2];c[m+8>>2]=c[g+8>>2];c[m+12>>2]=c[g+12>>2];c[m+16>>2]=c[g+16>>2];c[m+20>>2]=c[g+20>>2];c[m+24>>2]=c[g+24>>2];z=m+16|0;x=m+28|0;m=c[j>>2]|0;if((a[u+173>>0]|0)!=0){c[n+0>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;c[n+16>>2]=0;USa(b,u+212|0,n);USa(b,n,u+192|0)}n=(m|0)==0;a:do{if(!n){j=b+16|0;y=u+184|0;w=u+168|0;A=p+8|0;B=o+8|0;C=u+172|0;D=u+180|0;E=p+12|0;F=o+12|0;G=0;H=128;I=z;while(1){b:do{if((d[I>>0]&H|0)!=0){VSa(o,e,G,u,h,c[j>>2]|0,1);VSa(p,e,G,u,h,c[j>>2]|0,0);J=c[o>>2]|0;if((J&16|0)==0?(K=c[p>>2]|0,(K&16|0)==0):0){L=c[y>>2]|0;M=c[w>>2]|0;if((M|0)==0){break}N=(K&10|0)==0;O=c[A>>2]|0;P=(J&5|0)==0;Q=c[B>>2]|0;R=0;while(1){S=u+(R*20|0)+232|0;if((a[u+(R*20|0)+248>>0]|0)==0){if((!N?(T=c[S>>2]|0,(T-L|0)<=(O|0)):0)?(O|0)<=((c[u+(R*20|0)+236>>2]|0)+L|0):0){U=31;break}}else{if((!P?((c[S>>2]|0)-L|0)<=(Q|0):0)?(V=c[u+(R*20|0)+236>>2]|0,(Q|0)<=(V+L|0)):0){U=23;break}}S=R+1|0;if(S>>>0<M>>>0){R=S}else{break b}}if((U|0)==23){U=0;if((a[C>>0]|0)==0){M=c[F>>2]|0;L=M+32768&-65536;if((V-Q|0)<(c[D>>2]|0)){W=M;X=L}else{P=(c[u+(R*20|0)+244>>2]|0)+ -65536|0;W=M;X=(L|0)<(P|0)?L:P}}else{W=c[F>>2]|0;X=c[u+(R*20|0)+244>>2]|0}Y=X-W|0}else if((U|0)==31){U=0;if((a[C>>0]|0)==0){P=c[E>>2]|0;L=P+32768&-65536;if((O-T|0)<(c[D>>2]|0)){Z=P;_=L}else{M=(c[u+(R*20|0)+244>>2]|0)+65536|0;Z=P;_=(L|0)>(M|0)?L:M}}else{Z=c[E>>2]|0;_=c[u+(R*20|0)+244>>2]|0}Y=_-Z|0}if((J|0)!=0){c[F>>2]=(c[F>>2]|0)+Y;c[o>>2]=J|16}if((K|0)!=0){c[E>>2]=(c[E>>2]|0)+Y;c[p>>2]=K|16}}USa(b,o,p);a[I>>0]=d[I>>0]&(H^255)}}while(0);if((G&7|0)==7){M=I+1|0;if(M>>>0<x>>>0){$=128;aa=M}else{break a}}else{$=H>>>1&127;aa=I}G=G+1|0;if(!(G>>>0<m>>>0)){break}else{H=$;I=aa}}}}while(0);c:do{if(!v){if(!n){aa=b+16|0;$=0;p=128;o=z;while(1){if((d[o>>0]&p|0)!=0){VSa(s,e,$,u,h,c[aa>>2]|0,1);VSa(t,e,$,u,h,c[aa>>2]|0,0);USa(b,s,t)}if(($&7|0)==7){Y=o+1|0;if(Y>>>0<x>>>0){ba=128;ca=Y}else{break c}}else{ba=p>>>1&127;ca=o}$=$+1|0;if(!($>>>0<m>>>0)){break}else{p=ba;o=ca}}}}else{o=c[f>>2]|0;if(((o|0)!=0?(c[b+36>>2]|0)<=0:0)?(c[b+((o+ -1|0)*20|0)+36>>2]|0)>=0:0){break}c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[q>>2]=49;c[q+16>>2]=c[b+16>>2];c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[r+16>>2]=0;USa(b,q,r)}}while(0);r=b+8|0;c[(c[r>>2]|0)+20>>2]=0;q=c[f>>2]|0;if((q|0)!=0){ca=l+4|0;ba=q;q=0;do{m=c[b+(q*20|0)+28>>2]|0;x=(m&12|0)!=0;t=q+1|0;s=x?t:q;if((m&16|0)==0){m=b+(q*20|0)+40|0;h=c[m>>2]|0;u=h&65535;z=b+(s*20|0)+40|0;n=c[z>>2]|0;o=n&65535;p=0-u|0;$=0-o|0;aa=(u|0)==0?0:65536-u|0;u=(o|0)==0?0:65536-o|0;o=aa>>>0<u>>>0?aa:u;u=(p|0)>($|0)?p:$;do{if(s>>>0<(ba+ -1|0)>>>0?($=s+1|0,(c[b+($*20|0)+40>>2]|0)<(n+32768+o|0)):0){if((q|0)!=0?(c[b+((q+ -1|0)*20|0)+40>>2]|0)>(h+ -32768+u|0):0){da=0}else{if((o|0)<(0-u|0)){da=u}else{ea=h;fa=u;break}}if((c[b+($*20|0)+28>>2]&16|0)==0){c[l>>2]=s;c[ca>>2]=o-da;WSa(c[r>>2]|0,l);ea=c[m>>2]|0;fa=da}else{ea=h;fa=da}}else{U=64}}while(0);do{if((U|0)==64){U=0;if((q|0)!=0?(c[b+((q+ -1|0)*20|0)+40>>2]|0)>(h+ -32768+u|0):0){ea=h;fa=o;break}ea=h;fa=(o|0)>(0-u|0)?u:o}}while(0);c[m>>2]=fa+ea;if(x){c[z>>2]=(c[z>>2]|0)+fa}}if((q|0)!=0?(o=c[b+(q*20|0)+36>>2]|0,u=q+ -1|0,h=c[b+(u*20|0)+36>>2]|0,(o|0)!=(h|0)):0){c[b+(u*20|0)+44>>2]=TDa((c[b+(q*20|0)+40>>2]|0)-(c[b+(u*20|0)+40>>2]|0)|0,o-h|0)|0}if(x){h=c[b+(s*20|0)+36>>2]|0;o=s+ -1|0;u=c[b+(o*20|0)+36>>2]|0;if((h|0)==(u|0)){ga=t}else{c[b+(o*20|0)+44>>2]=TDa((c[b+(s*20|0)+40>>2]|0)-(c[b+(o*20|0)+40>>2]|0)|0,h-u|0)|0;ga=t}}else{ga=q}q=ga+1|0;ba=c[f>>2]|0}while(q>>>0<ba>>>0)}ba=c[r>>2]|0;q=c[ba+20>>2]|0;d:do{if((q|0)!=0){ga=ba;fa=q;while(1){ea=fa+ -1|0;U=KSa(ga,ea)|0;da=c[U>>2]|0;l=b+(da*20|0)+40|0;ca=U+4|0;U=(c[ca>>2]|0)+(c[l>>2]|0)|0;if((c[b+((da+1|0)*20|0)+40>>2]|0)>=(U+32768|0)?(c[l>>2]=U,(c[b+(da*20|0)+28>>2]&12|0)!=0):0){U=b+((da+ -1|0)*20|0)+40|0;c[U>>2]=(c[U>>2]|0)+(c[ca>>2]|0)}if((ea|0)==0){break d}ga=c[r>>2]|0;fa=ea}}}while(0);if(v){ha=b+12|0;a[ha>>0]=1;ia=g+5|0;a[ia>>0]=0;i=k;return}v=c[f>>2]|0;if((v|0)==0){ha=b+12|0;a[ha>>0]=1;ia=g+5|0;a[ia>>0]=0;i=k;return}else{ja=v;ka=0}while(1){v=b+(ka*20|0)+28|0;if((c[v>>2]&32|0)==0){r=KSa(e,c[b+(ka*20|0)+32>>2]|0)|0;q=c[b+(ka*20|0)+40>>2]|0;if((c[v>>2]&10|0)==0){c[r+12>>2]=q}else{c[r+16>>2]=q}a[r>>0]=1;la=c[f>>2]|0}else{la=ja}ka=ka+1|0;if(!(ka>>>0<la>>>0)){break}else{ja=la}}ha=b+12|0;a[ha>>0]=1;ia=g+5|0;a[ia>>0]=0;i=k;return}function SSa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=a+392|0;f=c[e>>2]|0;if((f|0)==(a+392|0)){BSa(c[a+4>>2]|0,130);i=d;return}else{c[f>>2]=b;c[(c[e>>2]|0)+4>>2]=2;c[e>>2]=(c[e>>2]|0)+8;i=d;return}}function TSa(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;c[a+12>>2]=0;c[a+20>>2]=0;c[a+24>>2]=0;e=a+28|0;aEa(d,c[e>>2]|0);c[e>>2]=0;i=b;return}function USa(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;if((c[d>>2]|0)==0){g=e;h=0}else{g=d;h=(c[e>>2]|0)!=0&1}d=b+20|0;j=c[d>>2]|0;if((j|0)!=0){k=c[g+8>>2]|0;l=0;while(1){m=l+1|0;if((c[b+(l*20|0)+36>>2]|0)>(k|0)){n=l;break}if(m>>>0<j>>>0){l=m}else{n=m;break}}if(n>>>0<j>>>0){if(!(h<<24>>24==0)?(c[b+(n*20|0)+36>>2]|0)<(c[e+8>>2]|0):0){i=f;return}if((c[b+(n*20|0)+28>>2]&8|0)!=0){i=f;return}else{o=n}}else{o=n}}else{o=0}n=c[b+4>>2]|0;do{if((a[n+12>>0]|0)!=0?(c[g>>2]&16|0)==0:0){if(h<<24>>24==0){c[g+12>>2]=YSa(n,c[g+8>>2]|0)|0;break}else{j=e+8|0;l=g+8|0;k=YSa(n,((c[l>>2]|0)+(c[j>>2]|0)|0)/2|0)|0;m=SDa(((c[j>>2]|0)-(c[l>>2]|0)|0)/2|0,c[b+16>>2]|0)|0;c[g+12>>2]=k-m;c[e+12>>2]=m+k;break}}}while(0);if((o|0)!=0?(c[g+12>>2]|0)<(c[b+((o+ -1|0)*20|0)+40>>2]|0):0){i=f;return}n=c[d>>2]|0;do{if(o>>>0<n>>>0){if(h<<24>>24==0){if((c[g+12>>2]|0)<=(c[b+(o*20|0)+40>>2]|0)){break}i=f;return}else{if((c[e+12>>2]|0)<=(c[b+(o*20|0)+40>>2]|0)){break}i=f;return}}}while(0);k=n+(h&255)|0;if((k|0)>191){i=f;return}if((n|0)!=(o|0)){m=n-o|0;l=k;k=n;do{k=k+ -1|0;m=m+ -1|0;n=b+(l*20|0)+28|0;l=l+ -1|0;j=b+(k*20|0)+28|0;c[n+0>>2]=c[j+0>>2];c[n+4>>2]=c[j+4>>2];c[n+8>>2]=c[j+8>>2];c[n+12>>2]=c[j+12>>2];c[n+16>>2]=c[j+16>>2]}while((m|0)!=0)}m=b+(o*20|0)+28|0;c[m+0>>2]=c[g+0>>2];c[m+4>>2]=c[g+4>>2];c[m+8>>2]=c[g+8>>2];c[m+12>>2]=c[g+12>>2];c[m+16>>2]=c[g+16>>2];c[d>>2]=(c[d>>2]|0)+1;if(h<<24>>24==0){i=f;return}h=b+((o+1|0)*20|0)+28|0;c[h+0>>2]=c[e+0>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];c[h+12>>2]=c[e+12>>2];c[h+16>>2]=c[e+16>>2];c[d>>2]=(c[d>>2]|0)+1;i=f;return}function VSa(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;k=i;c[b+0>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b+16>>2]=0;l=KSa(d,e)|0;d=c[l+8>>2]|0;m=c[l+4>>2]|0;n=d-m|0;do{if((n|0)==-1310720){if(j<<24>>24==0){c[b+8>>2]=m;c[b>>2]=2;o=2;p=m;q=16;break}else{c[b>>2]=0;r=0;q=15;break}}else if((n|0)==-1376256){if(j<<24>>24==0){c[b>>2]=0;r=0;q=15;break}else{c[b+8>>2]=d;c[b>>2]=1;r=1;q=15;break}}else{s=j<<24>>24!=0;t=b+8|0;if((n|0)<0){if(s){c[t>>2]=d;c[b>>2]=4;r=4;q=15;break}else{c[t>>2]=m;c[b>>2]=8;o=8;p=m;q=16;break}}else{if(s){c[t>>2]=m;c[b>>2]=4;r=4;q=15;break}else{c[t>>2]=d;c[b>>2]=8;o=8;p=d;q=16;break}}}}while(0);if((q|0)==15){u=c[b+8>>2]|0;v=r;w=1}else if((q|0)==16){q=p+(c[f+156>>2]<<1)|0;c[b+8>>2]=q;u=q;v=o;w=0}o=u+g|0;c[b+8>>2]=o;c[b+16>>2]=h;c[b+4>>2]=e;if((v|0)!=0?(a[l>>0]|0)!=0:0){if(w){c[b+12>>2]=c[l+12>>2]}else{c[b+12>>2]=c[l+16>>2]}c[b>>2]=v|16;i=k;return}c[b+12>>2]=SDa(o,h)|0;i=k;return}function WSa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+20|0;f=c[e>>2]|0;do{if((f|0)==(c[a+12>>2]|0)){if((XSa(a,(c[a+16>>2]|0)+f|0)|0)<<24>>24==0){i=d;return}else{g=c[e>>2]|0;break}}else{g=f}}while(0);f=c[a+8>>2]|0;h=ca(f,g)|0;c3a((c[a+28>>2]|0)+h|0,b|0,f|0)|0;c[e>>2]=(c[e>>2]|0)+1;i=d;return}function XSa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+16|0;e=d;c[e>>2]=0;f=c[a+8>>2]|0;g=ca(f,b)|0;if(!((2147483647/(f>>>0)|0)>>>0<b>>>0)?(f=a+24|0,h=a+28|0,c[h>>2]=dEa(c[a>>2]|0,1,c[f>>2]|0,g,c[h>>2]|0,e)|0,(c[e>>2]|0)==0):0){c[a+12>>2]=b;c[f>>2]=g;g=a+20|0;if(!((c[g>>2]|0)>>>0>b>>>0)){j=1;i=d;return j|0}BSa(c[a+4>>2]|0,130);c[g>>2]=b;j=0;i=d;return j|0}BSa(c[a+4>>2]|0,64);j=0;i=d;return j|0}function YSa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;f=c[b+20>>2]|0;if((f|0)!=0?(a[b+13>>0]|0)!=0:0){g=b+24|0;h=f+ -1|0;f=c[g>>2]|0;while(1){if(!(f>>>0<h>>>0)){break}j=f+1|0;if((c[b+(j*20|0)+36>>2]|0)>(d|0)){break}else{f=j}}a:do{if((f|0)==0){k=11}else{h=f;while(1){l=b+(h*20|0)+36|0;j=h+ -1|0;if((c[l>>2]|0)<=(d|0)){break}if((j|0)==0){k=11;break a}else{h=j}}c[g>>2]=h;m=c[l>>2]|0;n=h}}while(0);if((k|0)==11){c[g>>2]=0;g=c[b+36>>2]|0;if((g|0)>(d|0)){k=SDa(d-g|0,c[b+16>>2]|0)|0;o=(c[b+40>>2]|0)+k|0;i=e;return o|0}else{m=g;n=0}}g=SDa(d-m|0,c[b+(n*20|0)+44>>2]|0)|0;o=(c[b+(n*20|0)+40>>2]|0)+g|0;i=e;return o|0}o=SDa(d,c[b+16>>2]|0)|0;i=e;return o|0}function ZSa(b,d){b=b|0;d=d|0;var e=0,f=0;e=i;if(d>>>0>96){BSa(c[b>>2]|0,18);f=0;i=e;return f|0}else{c[b+8>>2]=d;c[b+12>>2]=(d+7|0)>>>3;a[b+4>>0]=1;a[b+5>>0]=1;f=d;i=e;return f|0}return 0}function _Sa(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;h=i;i=i+48|0;j=h;k=a+11748|0;l=c[k>>2]|0;if((l|0)==2){m=a+11752|0;n=a+11760|0}else{m=a+11768|0;n=a+11776|0}o=c[n>>2]|0;p=c[d>>2]|0;q=c[n+4>>2]|0;r=d+4|0;s=c[r>>2]|0;if(!((o|0)==(p|0)&(q|0)==(s|0))?(t=c[m>>2]|0,u=c[m+4>>2]|0,m=e+16-p>>5,v=f+16-s>>5,w=SDa(o+16-t>>5,v)|0,x=SDa(q+16-u>>5,m)|0,(w|0)!=(x|0)):0){y=SDa(16-t+p>>5,v)|0;v=TDa(y-(SDa(16-u+s>>5,m)|0)|0,w-x|0)|0;x=(SDa(v,o-t|0)|0)+t|0;w=(SDa(v,q-u|0)|0)+u|0;if((t|0)==(o|0)){t=x-o|0;z=(((t|0)<0?0-t|0:t)|0)<(c[a+11700>>2]|0)?o:x}else{z=x}if((u|0)==(q|0)){u=w-q|0;A=(((u|0)<0?0-u|0:u)|0)<(c[a+11700>>2]|0)?q:w}else{A=w}if((p|0)==(e|0)){w=z-e|0;B=(((w|0)<0?0-w|0:w)|0)<(c[a+11700>>2]|0)?e:z}else{B=z}if((s|0)==(f|0)){z=A-f|0;C=(((z|0)<0?0-z|0:z)|0)<(c[a+11700>>2]|0)?f:A}else{C=A}A=B-((p+o|0)/2|0)|0;o=c[a+11696>>2]|0;if((((A|0)<0?0-A|0:A)|0)<=(o|0)?(A=C-((s+q|0)/2|0)|0,(((A|0)<0?0-A|0:A)|0)<=(o|0)):0){o=n;c[o>>2]=B;c[o+4>>2]=C;D=B;E=C;F=c[k>>2]|0;G=1}else{D=B;E=C;F=l;G=0}}else{D=0;E=0;F=l;G=0}l=a+11728|0;C=l;B=c[C+4>>2]|0;k=j;c[k>>2]=c[C>>2];c[k+4>>2]=B;if((F|0)==2){c[j+32>>2]=2;B=j+8|0;$Sa(a,b,B,c[a+11760>>2]|0,c[a+11764>>2]|0);k=c[a+4>>2]|0;Ic[c[k+4>>2]&511](k,j);k=B;B=c[k+4>>2]|0;C=l;c[C>>2]=c[k>>2];c[C+4>>2]=B}else if((F|0)==4){c[j+32>>2]=4;$Sa(a,b,j+8|0,c[a+11760>>2]|0,c[a+11764>>2]|0);$Sa(a,b,j+16|0,c[a+11768>>2]|0,c[a+11772>>2]|0);F=j+24|0;$Sa(a,b,F,c[a+11776>>2]|0,c[a+11780>>2]|0);B=c[a+4>>2]|0;Ic[c[B+12>>2]&511](B,j);B=F;F=c[B+4>>2]|0;C=l;c[C>>2]=c[B>>2];c[C+4>>2]=F}F=G<<24>>24!=0;do{if(!(F&g<<24>>24==0)){G=j+8|0;$Sa(a,b,G,c[d>>2]|0,c[r>>2]|0);if((c[G>>2]|0)==(c[l>>2]|0)?(c[j+12>>2]|0)==(c[a+11732>>2]|0):0){break}c[j+32>>2]=2;C=l;B=c[C+4>>2]|0;k=j;c[k>>2]=c[C>>2];c[k+4>>2]=B;B=c[a+4>>2]|0;Ic[c[B+4>>2]&511](B,j);B=G;G=c[B+4>>2]|0;k=l;c[k>>2]=c[B>>2];c[k+4>>2]=G}}while(0);if(!F){i=h;return}F=d;c[F>>2]=D;c[F+4>>2]=E;i=h;return}function $Sa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;h=SDa(c[a+11644>>2]|0,e)|0;e=(SDa(c[a+11648>>2]|0,f)|0)+h|0;h=YSa(b,f)|0;f=c[a>>2]|0;b=SDa(c[f+60>>2]|0,e)|0;j=(SDa(c[f+68>>2]|0,h)|0)+b|0;c[d>>2]=j+(c[a+11656>>2]|0);j=c[a>>2]|0;b=SDa(c[j+64>>2]|0,e)|0;e=(SDa(c[j+72>>2]|0,h)|0)+b|0;c[d+4>>2]=e+(c[a+11660>>2]|0);i=g;return}function aTa(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0;k=i;l=f-d|0;f=g-e|0;if((a[(c[b>>2]|0)+160>>0]|0)==0){m=l;n=f}else{m=0-l|0;n=0-f|0}c[j>>2]=0;c[h>>2]=0;if((a[b+11665>>0]|0)==0){i=k;return}g=(ca(f>>16,d>>16)|0)-(ca(l>>16,e>>16)|0)|0;e=(c[b+4>>2]|0)+16|0;c[e>>2]=g+(c[e>>2]|0);e=(n|0)>-1;if((m|0)>-1){if(e){if((m|0)>(n<<1|0)){c[h>>2]=0;c[j>>2]=0;i=k;return}g=c[b+11688>>2]|0;if((n|0)>(m<<1|0)){c[h>>2]=g;c[j>>2]=c[b+11692>>2];i=k;return}else{c[h>>2]=SDa(45875,g)|0;c[j>>2]=SDa(19661,c[b+11692>>2]|0)|0;i=k;return}}else{if((m|0)>(ca(n,-2)|0)){c[h>>2]=0;c[j>>2]=0;i=k;return}g=c[b+11688>>2]|0;if((m<<1|0)<(0-n|0)){c[h>>2]=0-g;c[j>>2]=c[b+11692>>2];i=k;return}else{c[h>>2]=SDa(-45874,g)|0;c[j>>2]=SDa(19661,c[b+11692>>2]|0)|0;i=k;return}}}else{g=0-m|0;if(e){if((n<<1|0)<(g|0)){c[h>>2]=0;c[j>>2]=c[b+11692>>2]<<1;i=k;return}e=(n|0)>(ca(m,-2)|0);l=c[b+11688>>2]|0;if(e){c[h>>2]=l;c[j>>2]=c[b+11692>>2];i=k;return}else{c[h>>2]=SDa(45875,l)|0;c[j>>2]=SDa(111411,c[b+11692>>2]|0)|0;i=k;return}}else{if((ca(n,-2)|0)<(g|0)){c[h>>2]=0;c[j>>2]=c[b+11692>>2]<<1;i=k;return}g=(ca(m,-2)|0)<(0-n|0);n=b+11688|0;m=c[n>>2]|0;if(g){c[h>>2]=0-m;c[j>>2]=c[n>>2];i=k;return}else{c[h>>2]=SDa(-45874,m)|0;c[j>>2]=SDa(111411,c[b+11692>>2]|0)|0;i=k;return}}}}function bTa(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+48|0;g=f;c[g+32>>2]=1;h=b+11728|0;j=h;k=c[j+4>>2]|0;l=g;c[l>>2]=c[j>>2];c[l+4>>2]=k;if((a[b+20>>0]|0)==0){HSa(b,c[b+11736>>2]|0,c[b+11740>>2]|0)}k=g+8|0;$Sa(b,b+8|0,k,d,e);l=c[b+4>>2]|0;Ic[c[l>>2]&511](l,g);g=k;k=c[g+4>>2]|0;l=h;c[l>>2]=c[g>>2];c[l+4>>2]=k;k=b+11704|0;c[k>>2]=d;c[k+4>>2]=e;i=f;return}function cTa(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0;h=i;c[e>>2]=0;j=g<<24>>24==0;if((f|0)==0&j|(a|0)<655){i=h;return}if(j){k=0}else{j=f+d|0;d=SDa(j,a)|0;do{if((a|0)<65537|(d|0)>(j|0)){g=SDa(d,b)|0;l=(b|0)<65537|(g|0)>(d|0)?g:152895488;if((l|0)<32768e3){g=TDa(26214400,b)|0;c[e>>2]=g;m=g;break}if((l|0)<65536e3){g=TDa(34406400,b)|0;n=g-(SDa(d,16384)|0)|0;c[e>>2]=n;m=n;break}if((l|0)<109248512){n=TDa(18022400,b)|0;c[e>>2]=n;m=n;break}if((l|0)<152895488){l=TDa(63111168,b)|0;n=l-(SDa(d,27066)|0)|0;c[e>>2]=n;m=n}else{m=0}}else{m=0}}while(0);d=TDa(m,a<<1)|0;c[e>>2]=d;k=d}c[e>>2]=k+((f|0)/2|0);i=h;return}function dTa(b,d){b=b|0;d=d|0;var e=0;d=i;e=c[b+28>>2]|0;CSa(c[e+20>>2]|0);a[e+64>>0]=0;i=d;return}function eTa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=c[b+28>>2]|0;if((a[f+64>>0]|0)==0){g=gTa(f,c[d>>2]|0,c[d+4>>2]|0)|0;h=c[b+24>>2]|0;if((h|0)!=0){c[h>>2]=g}if((g|0)!=0){i=e;return}}g=jTa(f,c[d+8>>2]|0,c[d+12>>2]|0)|0;if((b|0)==0){i=e;return}d=c[b+24>>2]|0;if((d|0)==0){i=e;return}c[d>>2]=g;i=e;return}function fTa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;f=c[b+28>>2]|0;do{if((a[f+64>>0]|0)==0){g=gTa(f,c[d>>2]|0,c[d+4>>2]|0)|0;h=b+24|0;j=c[h>>2]|0;if((j|0)!=0){c[j>>2]=g}if((g|0)==0){g=hTa(f,3)|0;if((b|0)==0){k=g;break}else{l=h;m=g;n=7;break}}else{i=e;return}}else{l=b+24|0;m=hTa(f,3)|0;n=7}}while(0);if((n|0)==7){n=c[l>>2]|0;if((n|0)==0){k=m}else{c[n>>2]=m;k=m}}if((k|0)!=0){i=e;return}k=f+20|0;m=f+65|0;iTa(c[k>>2]|0,a[m>>0]|0,c[d+8>>2]|0,c[d+12>>2]|0,0);iTa(c[k>>2]|0,a[m>>0]|0,c[d+16>>2]|0,c[d+20>>2]|0,0);iTa(c[k>>2]|0,a[m>>0]|0,c[d+24>>2]|0,c[d+28>>2]|0,1);i=e;return}function gTa(d,f,g){d=d|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0;h=i;j=d+64|0;if((a[j>>0]|0)!=0){k=0;i=h;return k|0}a[j>>0]=1;j=c[d+20>>2]|0;if((a[d+65>>0]|0)==0){b[j>>1]=(b[j>>1]|0)+1<<16>>16}else{l=c[d+12>>2]|0;if(((b[l+20>>1]|0)+1+(b[l+56>>1]|0)|0)>>>0>(c[l+8>>2]|0)>>>0?(m=fEa(l,0,1)|0,(m|0)!=0):0){k=m;i=h;return k|0}m=b[j>>1]|0;if(m<<16>>16>0){b[(c[j+12>>2]|0)+((m<<16>>16)+ -1<<1)>>1]=(e[j+2>>1]|0)+65535;n=b[j>>1]|0}else{n=m}b[j>>1]=n+1<<16>>16}k=jTa(d,f,g)|0;i=h;return k|0}function hTa(a,d){a=a|0;d=d|0;var e=0,f=0,g=0;e=i;if((d|0)==0){f=0;i=e;return f|0}g=c[a+12>>2]|0;if(!(((b[g+22>>1]|0)+d+(b[g+58>>1]|0)|0)>>>0>(c[g+4>>2]|0)>>>0)){f=0;i=e;return f|0}f=fEa(g,d,0)|0;i=e;return f|0}function iTa(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0;j=i;if(e<<24>>24==0){k=d+2|0;l=b[k>>1]|0;m=l+1<<16>>16;b[k>>1]=m;i=j;return}else{e=c[d+4>>2]|0;n=d+2|0;o=b[n>>1]|0;p=(c[d+8>>2]|0)+o|0;c[e+(o<<3)>>2]=f>>10;c[e+(o<<3)+4>>2]=g>>10;a[p>>0]=h<<24>>24!=0?1:2;k=n;l=b[k>>1]|0;m=l+1<<16>>16;b[k>>1]=m;i=j;return}}function jTa(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;g=hTa(b,1)|0;if((g|0)!=0){i=f;return g|0}iTa(c[b+20>>2]|0,a[b+65>>0]|0,d,e,1);i=f;return g|0}function kTa(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;if((a|0)!=1){if(b>>>0<1240){d=107}else{d=b>>>0<33900?1131:32768}}else{d=0}i=c;return d|0}function lTa(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;if((R2a(d,1287920)|0)==0){if((c[e>>2]|0)==1){c[b+28>>2]=1;g=0}else{g=7}}else{if((R2a(d,1287936)|0)==0){a[b+32>>0]=a[e>>0]|0;g=0}else{g=12}}i=f;return g|0}function mTa(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;g=a[b+32>>0]|0;if((R2a(d,1287920)|0)!=0){if((R2a(d,1287936)|0)==0){a[e>>0]=g;h=0}else{h=12}}else{c[e>>2]=c[b+28>>2];h=0}i=f;return h|0}function nTa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;g=c[a+652>>2]|0;if((g|0)==0){h=0;i=f;return h|0}a=c[g+1456>>2]|0;if((a|0)==65535){h=6;i=f;return h|0}if((b|0)!=0){j=g+2964|0;k=c[j>>2]|0;if((k|0)==0){l=YRa(g,a)|0;c[j>>2]=l;m=l}else{m=k}c[b>>2]=m}if((d|0)!=0){m=g+2968|0;b=c[m>>2]|0;if((b|0)==0){k=YRa(g,c[g+1460>>2]|0)|0;c[m>>2]=k;n=k}else{n=b}c[d>>2]=n}if((e|0)==0){h=0;i=f;return h|0}c[e>>2]=c[g+1464>>2];h=0;i=f;return h|0}function oTa(b,d){b=b|0;d=d|0;var e=0,f=0;e=i;f=c[b+652>>2]|0;a[d>>0]=0;if((f|0)!=0?(c[f+1456>>2]|0)!=65535:0){a[d>>0]=1}i=e;return 0}function pTa(a,b,d){a=a|0;b=b|0;d=d|0;var f=0,g=0,h=0;f=i;g=c[a+652>>2]|0;if((g|0)!=0){if((c[g+1456>>2]|0)!=65535?!((c[g+12>>2]|0)>>>0<b>>>0):0){if((d|0)==0){h=0}else{c[d>>2]=e[(c[g+1160>>2]|0)+(b<<1)>>1]|0;h=0}}else{h=6}}else{h=0}i=f;return h|0}function qTa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=c[(c[(c[a>>2]|0)+96>>2]|0)+4>>2]|0;c[b>>2]=0;c[b+4>>2]=0;f=c[a+12>>2]|0;if((f|0)==1283912|(f|0)==1283952){g=0;i=d;return g|0}f=iFa(gFa(e,1283992)|0,1287848)|0;if((f|0)==0){g=0;i=d;return g|0}e=c[f>>2]|0;if((e|0)==0){g=0;i=d;return g|0}g=dd[e&511](a,b)|0;i=d;return g|0}function rTa(a,b,d,f){a=a|0;b=b|0;d=d|0;f=f|0;var g=0,h=0,j=0;g=i;h=c[a+652>>2]|0;if((c[h+2956>>2]|0)==0){j=11;i=g;return j|0}a=YRa(h,e[(c[h+1160>>2]|0)+(b<<1)>>1]|0)|0;if((a|0)==0){j=0;i=g;return j|0}SFa(d,a,f);j=0;i=g;return j|0}function sTa(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;f=c[a+652>>2]|0;g=iFa(c[a+96>>2]|0,1284e3)|0;if((g|0)==0){h=0;i=e;return h|0}a=f+12|0;if((c[a>>2]|0)==0){h=0;i=e;return h|0}j=f+1160|0;k=g+20|0;g=0;while(1){l=b[(c[j>>2]|0)+(g<<1)>>1]|0;m=l&65535;if((l&65535)>390){n=ZRa(f,m+ -391|0)|0}else{n=Lc[c[k>>2]&255](m)|0}if((n|0)!=0?(R2a(d,n)|0)==0:0){h=g;o=10;break}g=g+1|0;if(!(g>>>0<(c[a>>2]|0)>>>0)){h=0;o=10;break}}if((o|0)==10){i=e;return h|0}return 0}function tTa(a){a=a|0;return c[(c[a+652>>2]|0)+1304>>2]|0}function uTa(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;i=i+16|0;g=f;h=c[d+652>>2]|0;c[g>>2]=0;if((h|0)==0){j=0;i=f;return j|0}k=h+2960|0;l=c[k>>2]|0;do{if((l|0)==0){m=ZDa(c[d+100>>2]|0,32,g)|0;n=c[g>>2]|0;if((n|0)==0){c[m>>2]=YRa(h,c[h+1324>>2]|0)|0;c[m+4>>2]=YRa(h,c[h+1328>>2]|0)|0;c[m+8>>2]=YRa(h,c[h+1336>>2]|0)|0;c[m+12>>2]=YRa(h,c[h+1340>>2]|0)|0;c[m+16>>2]=YRa(h,c[h+1344>>2]|0)|0;c[m+20>>2]=c[h+1352>>2];a[m+24>>0]=a[h+1348>>0]|0;b[m+26>>1]=c[h+1356>>2];b[m+28>>1]=c[h+1360>>2];c[k>>2]=m;o=m;break}else{j=n;i=f;return j|0}}else{o=l}}while(0);c[e+0>>2]=c[o+0>>2];c[e+4>>2]=c[o+4>>2];c[e+8>>2]=c[o+8>>2];c[e+12>>2]=c[o+12>>2];c[e+16>>2]=c[o+16>>2];c[e+20>>2]=c[o+20>>2];c[e+24>>2]=c[o+24>>2];c[e+28>>2]=c[o+28>>2];j=0;i=f;return j|0}function vTa(a){a=a|0;return(c[a+8>>2]|0)>>>9&1|0}function wTa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0;e=i;i=i+16|0;f=e;a_a(a,b,d)|0;h=a+276|0;if((c[h>>2]|0)!=0?(E_a(a),c[h>>2]=0,(N_a(a,b)|0)!=0):0){h=n_a(c[a+180>>2]|0)|0;if((h|0)!=0){Fc[c[(c[h>>2]|0)+88>>2]&63](h,a,6,0,(~~+g[b+4>>2]&65535)<<16|~~+g[b>>2]&65535)}c[f>>2]=0;oXa(a,0,f,d);if((c[f>>2]|0)!=0){j=0;i=e;return j|0}}j=1;i=e;return j|0}function xTa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;g=c[a+268>>2]|0;if((g|0)==0){h=0;i=f;return h|0}j=b&65535;if(!((j+ -35|0)>>>0<6)){h=0;i=f;return h|0}switch(j|0){case 35:{j=c[(c[g>>2]|0)+148>>2]|0;b=p$a(a,e)|0;k=o$a(a,e)|0;ld[j&255](g,b,k);break};case 39:{k=c[(c[g>>2]|0)+140>>2]|0;b=p$a(a,e)|0;j=o$a(a,e)|0;ld[k&255](g,b,j);break};case 40:{j=c[(c[g>>2]|0)+132>>2]|0;b=p$a(a,e)|0;k=o$a(a,e)|0;ld[j&255](g,b,k);break};case 36:{k=c[(c[g>>2]|0)+144>>2]|0;b=p$a(a,e)|0;j=o$a(a,e)|0;ld[k&255](g,b,j);break};case 38:{j=c[(c[g>>2]|0)+128>>2]|0;b=p$a(a,e)|0;k=o$a(a,e)|0;ld[j&255](g,b,k);break};case 37:{k=c[(c[g>>2]|0)+136>>2]|0;b=p$a(a,e)|0;j=o$a(a,e)|0;ld[k&255](g,b,j);break};default:{}}oXa(a,1,d,e);h=1;i=f;return h|0}function yTa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;g=c[a+268>>2]|0;if((g|0)==0){h=0;i=f;return h|0}j=c[(c[g>>2]|0)+156>>2]|0;k=p$a(a,e)|0;l=o$a(a,e)|0;if((id[j&511](g,b,k,l)|0)==0){h=0;i=f;return h|0}l=n_a(c[a+180>>2]|0)|0;if((l|0)!=0){zTa(l)}oXa(a,1,d,e);h=1;i=f;return h|0}function zTa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;i=i+16|0;d=b+4|0;e=b;f=a+276|0;g=c[f>>2]|0;Ic[c[(c[g>>2]|0)+244>>2]&511](d,g);g=a+268|0;LVa(c[(c[g>>2]|0)+272>>2]|0);h=c[g>>2]|0;j=c[f>>2]|0;Ic[c[(c[j>>2]|0)+244>>2]&511](e,j);j=c[e>>2]|0;PUa(h,(j|0)==0?1292088:j+12|0);Lna(e);LVa(c[(c[g>>2]|0)+272>>2]|0);c[a+304>>2]=GXa(c[(c[f>>2]|0)+268>>2]|0)|0;Lna(d);i=b;return}function ATa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0;d=i;i=i+128|0;e=d+112|0;f=d+96|0;h=d+88|0;j=d+80|0;k=d+72|0;l=d+64|0;m=d+56|0;n=d+48|0;o=d+40|0;p=d+32|0;q=d+24|0;r=d+16|0;s=d+8|0;t=d;EZa(a,b);o_a(e,a);if((c[a+256>>2]|0)==0){i=d;return}u=+g[e>>2];v=+g[e+4>>2];if(u>=v){i=d;return}w=+g[e+8>>2];x=+g[e+12>>2];if(w>=x){i=d;return}gla(f);r_a(h,a);y=+g[h>>2];z=y+-3.0;A=+g[h+4>>2];B=A+1.5;C=y+3.0;D=A+-1.5;A=v-u;if(((A>6.0?(u=A+-6.0,!(u<1.0e-4&u>-1.0e-4)):0)?(u=x-w,u>3.0):0)?(w=u+-3.0,!(w<1.0e-4&w>-1.0e-4)):0){pe(j,1293872);qla(f,c[j>>2]|0,c[j+4>>2]|0)|0;w=z;j=tla(f,w)|0;pe(k,1305864);z=B;h=tla(qla(j,c[k>>2]|0,c[k+4>>2]|0)|0,z)|0;pe(l,1293880);qla(h,c[l>>2]|0,c[l+4>>2]|0)|0;l=tla(f,C)|0;pe(m,1305864);h=tla(qla(l,c[m>>2]|0,c[m+4>>2]|0)|0,z)|0;pe(n,1293888);qla(h,c[n>>2]|0,c[n+4>>2]|0)|0;n=tla(f,y)|0;pe(o,1305864);h=tla(qla(n,c[o>>2]|0,c[o+4>>2]|0)|0,D)|0;pe(p,1293888);qla(h,c[p>>2]|0,c[p+4>>2]|0)|0;p=tla(f,w)|0;pe(q,1305864);h=tla(qla(p,c[q>>2]|0,c[q+4>>2]|0)|0,z)|0;pe(r,1293896);qla(h,c[r>>2]|0,c[r+4>>2]|0)|0;pe(s,1293864);r=qla(b,c[s>>2]|0,c[s+4>>2]|0)|0;s=ula(r,c[f+4>>2]|0,c[f+8>>2]|0)|0;pe(t,1293904);qla(s,c[t>>2]|0,c[t+4>>2]|0)|0}ila(c[f+4>>2]|0);i=d;return}function BTa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0;e=i;i=i+64|0;f=e+40|0;h=e+32|0;j=e+20|0;k=e;LZa(a,b,d);o_a(f,a);if((c[a+256>>2]|0)==0){i=e;return}l=+g[f>>2];m=+g[f+4>>2];if(l>=m){i=e;return}n=+g[f+8>>2];o=+g[f+12>>2];if(n>=o){i=e;return}r_a(h,a);p=+g[h>>2];q=p+-3.0;r=+g[h+4>>2];s=r+1.5;t=m-l;if(!(t>6.0)){i=e;return}l=t+-6.0;if(l<1.0e-4&l>-1.0e-4){i=e;return}l=o-n;if(!(l>3.0)){i=e;return}n=l+-3.0;if(n<1.0e-4&n>-1.0e-4){i=e;return}OIa(j);QIa(j,4);WIa(j,0,q,s,6);WIa(j,1,p+3.0,s,2);WIa(j,2,p,r+-1.5,2);WIa(j,3,q,s,2);c[k>>2]=1;h=k+4|0;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;UGa(b,j,d,0,SYa(k,MZa(c[a+156>>2]|0)|0)|0,0,1,0)|0;PIa(c[j+4>>2]|0);i=e;return}function CTa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;$Za(a,b,d)|0;C_a(a);d=n_a(c[a+180>>2]|0)|0;if((d|0)==0){i=e;return 1}Fc[c[(c[d>>2]|0)+88>>2]&63](d,a,5,0,(~~+g[b+4>>2]&65535)<<16|~~+g[b>>2]&65535);i=e;return 1}function DTa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;a_a(a,b,c)|0;E_a(a);i=d;return 1}function ETa(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;nZa(a);c[a>>2]=1287968;d=a+304|0;e=a+268|0;f=e+36|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));c[d>>2]=-1;c[a+308>>2]=0;i=b;return}function FTa(a,b){a=a|0;b=b|0;b=i;eka(a,1288208,-1);i=b;return}function GTa(a,b){a=a|0;b=b|0;a=b+32|0;c[a>>2]=c[a>>2]&-402653185;return}function HTa(a){a=a|0;var b=0,d=0;b=i;d=c[a+268>>2]|0;if((d|0)==0){i=b;return}Rc[c[(c[d>>2]|0)+80>>2]&1023](d);i=b;return}function ITa(a){a=a|0;var b=0;b=i;JTa(a,0);J_a(a);i=b;return}function JTa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0,q=0,r=0.0;d=i;i=i+48|0;e=d+24|0;f=d+20|0;h=d+16|0;j=d;k=a+276|0;l=c[k>>2]|0;if((l|0)==0){i=d;return}m=a+280|0;if((c[m>>2]|0)==(b|0)){i=d;return}KXa(e,c[l+268>>2]|0);n=+g[e+12>>2]- +g[e+8>>2];if(!(n>0.0)){i=d;return}o=n;if(o<1.0e-4&o>-1.0e-4){i=d;return}if((b|0)==0){c[m>>2]=0;BZa(a,a+284|0,1,1);i=d;return}e=a+308|0;if((c[e>>2]|0)==0){i=d;return}c[f>>2]=0;g[h>>2]=0.0;l=(JXa(c[(c[k>>2]|0)+268>>2]|0)|0)>3;p=c[k>>2]|0;if(l){o=+LXa(c[p+268>>2]|0)*3.0;l=c[k>>2]|0;q=l;r=o+ +((FZa(l)|0)<<1|0)}else{q=p;r=0.0}o=n+ +((FZa(q)|0)<<1|0);q=c[e>>2]|0;e=c[c[q>>2]>>2]|0;p=A_a(c[a+176>>2]|0)|0;Pc[e&1](q,p,r,o,f,h);o=+g[h>>2];if(!(o>0.0)){i=d;return}r=o;if(r<1.0e-4&r>-1.0e-4){i=d;return}c[m>>2]=b;o_a(j,a);b=a+284|0;c[b+0>>2]=c[j+0>>2];c[b+4>>2]=c[j+4>>2];c[b+8>>2]=c[j+8>>2];c[b+12>>2]=c[j+12>>2];b=c[f>>2]|0;r=+g[h>>2];if((b|0)==1){h=j+12|0;g[h>>2]=r+ +g[h>>2]}else{h=j+8|0;g[h>>2]=+g[h>>2]-r}c[a+300>>2]=b;BZa(a,j,1,1);i=d;return}function KTa(a,b){a=a|0;b=b|0;var d=0;d=i;if((b|0)==0){c[a>>2]=0;i=d;return}else{WVa(a,c[b+272>>2]|0);i=d;return}}function LTa(a,b){a=a|0;b=b|0;var d=0;d=i;if((a|0)==0){i=d;return}Ic[c[(c[a>>2]|0)+240>>2]&511](a,b);i=d;return}function MTa(a,b){a=a|0;b=b|0;var d=0;d=i;if((a|0)==0){i=d;return}xXa(c[a+268>>2]|0,b);i=d;return}function NTa(a){a=a|0;return a|0}function OTa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;e=d;f=a+276|0;CXa(c[(c[f>>2]|0)+268>>2]|0,b);g=c[f>>2]|0;f=c[a+268>>2]|0;h=c[(c[f>>2]|0)+240>>2]|0;Ic[c[(c[g>>2]|0)+244>>2]&511](e,g);g=c[e>>2]|0;Ic[h&511](f,(g|0)==0?1292088:g+12|0);Lna(e);c[a+304>>2]=b;i=d;return}function PTa(a,b){a=a|0;b=b|0;var c=0;c=i;QTa(a,b);RTa(a,b);STa(a,b);i=c;return}function QTa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+192|0;e=d;f=a+268|0;if((c[f>>2]|0)!=0){i=d;return}g=Z1a(332)|0;jUa(g);c[f>>2]=g;c[g+328>>2]=c[a+312>>2];c3a(e|0,b|0,192)|0;c[e+156>>2]=a;b=e+32|0;c[b>>2]=-1006630272;f=c[a+56>>2]|0;a=(uZa(f,8388608)|0)==0;c[b>>2]=a?-1006630272:-998241664;if((uZa(f,1)|0)==0){c[b>>2]=a?-989853056:-981464448}c[e+68>>2]=0;c[e+64>>2]=0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;rZa(g,e);i=d;return}function RTa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0;d=i;i=i+192|0;e=d;f=a+272|0;if((c[f>>2]|0)!=0){i=d;return}h=Z1a(268)|0;nZa(h);c[h>>2]=1288496;c[f>>2]=h;c3a(e|0,b|0,192)|0;c[e+156>>2]=a;c[e+32>>2]=-469762048;c[e+36>>2]=2;g[e+40>>2]=.8627451062202454;g[e+44>>2]=.8627451062202454;g[e+48>>2]=.8627451062202454;g[e+52>>2]=0.0;c[e+72>>2]=1;a=e+76|0;b=e+68|0;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[b>>2]=2;c[e+64>>2]=2;c[e+164>>2]=0;rZa(h,e);i=d;return}function STa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0;d=i;i=i+192|0;e=d;f=a+276|0;if((c[f>>2]|0)!=0){i=d;return}h=Z1a(292)|0;eXa(h);c[h>>2]=1288232;c[f>>2]=h;c[h+288>>2]=c[a+312>>2];c3a(e|0,b|0,192)|0;c[e+156>>2]=a;c[e+32>>2]=-402653176;c[e+64>>2]=0;c[e+68>>2]=1;c[e+164>>2]=0;a=b+32|0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;if((c[a>>2]&8388608|0)==0){g[e+136>>2]=+g[b+136>>2]}else{g[e+136>>2]=12.0}if((c[b+72>>2]|0)==0){c[e+72>>2]=1;a=e+76|0;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0}if((c[b+36>>2]|0)==0){c[e+36>>2]=1;g[e+40>>2]=1.0;g[e+44>>2]=0.0;g[e+48>>2]=0.0;g[e+52>>2]=0.0}rZa(h,e);i=d;return}function TTa(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;b=i;i=i+112|0;d=b+96|0;e=b+80|0;f=b+64|0;h=b+48|0;j=b+32|0;k=b+16|0;l=b;Ic[c[(c[a>>2]|0)+152>>2]&511](d,a);if((c[a+280>>2]|0)==0){c[k+0>>2]=c[d+0>>2];c[k+4>>2]=c[d+4>>2];c[k+8>>2]=c[d+8>>2];c[k+12>>2]=c[d+12>>2];m=+g[k+4>>2]+-13.0;g[k>>2]=m;n=+g[d>>2];if(m<n){g[k>>2]=n;o=n}else{o=m}p=c[a+272>>2]|0;if((p|0)==0){q=o;r=n}else{BZa(p,k,1,0);q=+g[k>>2];r=+g[d>>2]}c[l+0>>2]=c[d+0>>2];c[l+4>>2]=c[d+4>>2];c[l+8>>2]=c[d+8>>2];c[l+12>>2]=c[d+12>>2];n=q+-1.0;k=l+4|0;g[k>>2]=n;q=+g[l>>2];if(q<r){g[l>>2]=r;s=r}else{s=q}if(n<s){g[k>>2]=s}k=c[a+268>>2]|0;if((k|0)!=0){BZa(k,l,1,0)}l=c[a+276>>2]|0;if((l|0)==0){i=b;return}Ic[c[(c[l>>2]|0)+100>>2]&511](l,0);i=b;return}Ic[c[(c[a>>2]|0)+152>>2]&511](e,a);c[f+0>>2]=c[e+0>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];c[f+12>>2]=c[e+12>>2];c[h+0>>2]=c[d+0>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];o_a(j,a);s=+g[a+296>>2]- +g[a+292>>2];n=s- +((FZa(a)|0)<<1|0);d=c[a+300>>2]|0;if((d|0)==0){q=+g[f+4>>2]+-13.0;g[f>>2]=q;r=+g[e>>2];if(q<r){g[f>>2]=r;t=r}else{t=q}g[f+8>>2]=+g[f+12>>2]-n;q=t+-1.0;l=h+4|0;g[l>>2]=q;t=+g[h>>2];if(t<r){g[h>>2]=r;u=r}else{u=t}if(q<u){g[l>>2]=u}g[h+8>>2]=+g[h+12>>2]-n;l=j+12|0;g[l>>2]=+g[l>>2]-s}else if((d|0)==1){u=+g[f+4>>2]+-13.0;g[f>>2]=u;q=+g[e>>2];if(u<q){g[f>>2]=q;v=q}else{v=u}g[f+12>>2]=n+ +g[f+8>>2];u=v+-1.0;e=h+4|0;g[e>>2]=u;v=+g[h>>2];if(v<q){g[h>>2]=q;w=q}else{w=v}if(u<w){g[e>>2]=w}g[h+12>>2]=n+ +g[h+8>>2];e=j+8|0;g[e>>2]=s+ +g[e>>2]}e=c[a+272>>2]|0;if((e|0)!=0){BZa(e,f,1,0)}f=c[a+268>>2]|0;if((f|0)!=0){BZa(f,h,1,0)}h=a+276|0;f=c[h>>2]|0;if((f|0)==0){i=b;return}Ic[c[(c[f>>2]|0)+100>>2]&511](f,1);BZa(c[h>>2]|0,j,1,0);FXa(c[(c[h>>2]|0)+268>>2]|0,c[a+304>>2]|0);i=b;return}function UTa(a){a=a|0;var b=0,d=0;b=i;d=c[a+268>>2]|0;if((d|0)==0){i=b;return}if((uZa(c[a+56>>2]|0,1)|0)==0){i=b;return}LVa(c[d+272>>2]|0);i=b;return}function VTa(a,b){a=a|0;b=b|0;b=i;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;i=b;return}function WTa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;i=i+16|0;f=e+4|0;g=e;h=a+276|0;j=c[h>>2]|0;do{if((j|0)!=0?(k=c[a+268>>2]|0,(k|0)!=0):0){c[a+304>>2]=-1;l=b&65535;if((l|0)==38){if((GXa(c[j+268>>2]|0)|0)<=0){m=1;break}c[f>>2]=0;n=c[h>>2]|0;if((id[c[(c[n>>2]|0)+248>>2]&511](n,b,f,d)|0)==0){m=1;break}if((c[f>>2]|0)!=0){m=0;break}zTa(a);m=1;break}else if((l|0)==40){l=GXa(c[j+268>>2]|0)|0;if((l|0)>=((JXa(c[(c[h>>2]|0)+268>>2]|0)|0)+ -1|0)){m=1;break}c[g>>2]=0;l=c[h>>2]|0;if((id[c[(c[l>>2]|0)+248>>2]&511](l,b,g,d)|0)==0){m=1;break}if((c[g>>2]|0)!=0){m=0;break}zTa(a);m=1;break}else{if((uZa(c[a+56>>2]|0,1)|0)==0){m=0;break}m=Qc[c[(c[k>>2]|0)+24>>2]&255](k,b,d)|0;break}}else{m=0}}while(0);i=e;return m|0}function XTa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+16|0;f=e;g=c[a+276>>2]|0;if((g|0)==0){h=0;i=e;return h|0}j=c[a+268>>2]|0;if((j|0)==0){h=0;i=e;return h|0}c[a+304>>2]=-1;c[f>>2]=0;if((uZa(c[a+56>>2]|0,1)|0)==0){a=(id[c[(c[g>>2]|0)+252>>2]&511](g,b,f,d)|0)==0;i=e;return(a?0:c[f>>2]|0)|0}h=Qc[c[(c[j>>2]|0)+32>>2]&255](j,b,d)|0;i=e;return h|0}function YTa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;if((d|0)==6){h=a+268|0;if((c[h>>2]|0)!=0?(j=c[a+276>>2]|0,(j|0)!=0&(j|0)==(b|0)):0){zTa(a);UTa(a);j=c[h>>2]|0;Rc[c[(c[j>>2]|0)+80>>2]&1023](j);JTa(a,0);i=g;return}}else if((d|0)==5?(c[a+272>>2]|0)==(b|0):0){JTa(a,(c[a+280>>2]|0)==0&1);i=g;return}l_a(a,b,d,e,f);i=g;return}function ZTa(a){a=a|0;var b=0,d=0;b=i;d=c[a+268>>2]|0;a=Lc[c[(c[d>>2]|0)+140>>2]&255](d)|0;i=b;return a|0}function _Ta(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;c[a+308>>2]=b;e=c[a+268>>2]|0;if((e|0)!=0){c[e+300>>2]=b}e=c[a+276>>2]|0;if((e|0)==0){i=d;return}c[e+284>>2]=b;i=d;return}function $Ta(a){a=a|0;var b=0;b=i;gXa(a);i=b;return}function aUa(a){a=a|0;var b=0;b=i;gXa(a);$1a(a);i=b;return}function bUa(a){a=a|0;return 0}function cUa(a,b){a=a|0;b=+b;return 0.0}function dUa(a){a=a|0;return 0.0}function eUa(a){a=a|0;return 0.0}function fUa(a){a=a|0;var b=0;b=i;pZa(a);i=b;return}function gUa(a){a=a|0;var b=0;b=i;pZa(a);$1a(a);i=b;return}function hUa(a){a=a|0;var b=0;b=i;pZa(a);i=b;return}function iUa(a){a=a|0;var b=0;b=i;pZa(a);$1a(a);i=b;return}function jUa(a){a=a|0;var b=0;b=i;qUa(a);c[a>>2]=1288744;c[a+268>>2]=1289088;c[a+296>>2]=1289128;i=b;return}function kUa(a){a=a|0;var b=0;b=i;sUa(a);i=b;return}function lUa(a){a=a|0;var b=0;b=i;sUa(a);$1a(a);i=b;return}function mUa(a,b,c,d,e,f,g){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;g=+g;return}function nUa(a,b){a=a|0;b=+b;return}function oUa(a,b,c,d,e,f,g){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;g=+g;return}function pUa(a,b){a=a|0;b=+b;return}function qUa(a){a=a|0;var b=0,d=0;b=i;tVa(a);c[a>>2]=1289168;c[a+268>>2]=1289512;c[a+296>>2]=1289552;d=a+300|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;c[d+24>>2]=0;c[d+28>>2]=0;i=b;return}function rUa(a){a=a|0;var b=0;b=i;sUa(a);$1a(a);i=b;return}function sUa(a){a=a|0;var b=0;b=i;c[a>>2]=1289168;c[a+268>>2]=1289512;c[a+296>>2]=1289552;vVa(a);i=b;return}function tUa(a,b){a=a|0;b=b|0;b=i;eka(a,1289584,-1);i=b;return}function uUa(a){a=a|0;return}function vUa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;d=i;i=i+32|0;e=d+24|0;f=d+20|0;g=d+16|0;h=d+8|0;j=d+4|0;k=d;Mna(e,b,-1);if((uZa(c[a+56>>2]|0,4096)|0)==0){l=e;m=a+272|0;n=c[m>>2]|0;o=c[n>>2]|0;p=o+248|0;q=c[p>>2]|0;r=c[l>>2]|0;s=(r|0)==0;t=r+12|0;u=s?1292088:t;Fc[q&63](n,u,1,0,0);Lna(e);i=d;return}Yka(f,c[e>>2]|0);b=c[f>>2]|0;v=(b|0)==0;if(v){w=0}else{w=c[b+4>>2]|0}x=dpa(v?1305928:b+12|0,w)|0;if((x|0)!=0){w=lpa(c[x+20>>2]|0)|0;Vna(e);if((w|0)>0){b=h+4|0;v=1;y=0;while(1){z=opa(x,y)|0;if((z|0)==0){A=v}else{ipa(g,z);pe(h,1289600);if(xka(c[g>>2]|0,c[h>>2]|0,c[b>>2]|0)|0){B=lpa(c[z+20>>2]|0)|0;c[j>>2]=0;if((B|0)>0){C=0;do{npa(k,z,C);$na(j,c[k>>2]|0);Lna(k);C=C+1|0}while((C|0)<(B|0))}if((v|0)==0){Zna(e,13)}$na(e,c[j>>2]|0);Lna(j);D=0}else{D=v}dka(g);A=D}y=y+1|0;if((y|0)>=(w|0)){break}else{v=A}}}gpa(x);v2a(x)}dka(f);l=e;m=a+272|0;n=c[m>>2]|0;o=c[n>>2]|0;p=o+248|0;q=c[p>>2]|0;r=c[l>>2]|0;s=(r|0)==0;t=r+12|0;u=s?1292088:t;Fc[q&63](n,u,1,0,0);Lna(e);i=d;return}function wUa(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0.0,k=0.0,l=0.0;b=i;i=i+48|0;d=b+32|0;e=b+16|0;f=b;h=q_a(a)|0;if((h|0)!=0){j=+g[a+316>>2];k=+g[a+320>>2];l=+g[a+324>>2];g[d>>2]=j;g[d+8>>2]=k;g[d+4>>2]=j+12.0;g[d+12>>2]=l;BZa(h,d,1,0)}d=c[a+276>>2]|0;if((d|0)==0){AVa(a);i=b;return}if((uZa(c[a+56>>2]|0,16384)|0)!=0){AVa(a);i=b;return}Ic[c[(c[a>>2]|0)+152>>2]&511](f,a);rYa(e,f,1.0);P_a(d,e);AVa(a);i=b;return}function xUa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;Ic[c[(c[b>>2]|0)+148>>2]&511](e,b);f=FZa(b)|0;sYa(a,e,+((Lc[c[(c[b>>2]|0)+128>>2]&255](b)|0)+f|0));f=q_a(b)|0;if((f|0)==0){i=d;return}if((c[f+256>>2]|0)==0){i=d;return}f=a+4|0;g[f>>2]=+g[f>>2]+-12.0;i=d;return}function yUa(a){a=a|0;var b=0;b=i;ld[c[(c[a>>2]|0)+44>>2]&255](a,1,1);i=b;return}function zUa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+32|0;e=d+28|0;f=d+24|0;g=d+12|0;h=d;j=b+272|0;b=c[j>>2]|0;if((Lc[c[(c[b>>2]|0)+188>>2]&255](b)|0)==0){c[a+0>>2]=-1;c[a+4>>2]=-1;c[a+8>>2]=-1;c[a+12>>2]=-1;c[a+16>>2]=-1;c[a+20>>2]=-1;i=d;return}else{c[e>>2]=-1;c[f>>2]=-1;b=c[j>>2]|0;ld[c[(c[b>>2]|0)+160>>2]&255](b,e,f);b=c[j>>2]|0;ld[c[(c[b>>2]|0)+316>>2]&255](g,b,c[e>>2]|0);e=c[j>>2]|0;ld[c[(c[e>>2]|0)+316>>2]&255](h,e,c[f>>2]|0);f=a+12|0;c[a+0>>2]=c[g+0>>2];c[a+4>>2]=c[g+4>>2];c[a+8>>2]=c[g+8>>2];c[f+0>>2]=c[h+0>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];nt(a);i=d;return}}function AUa(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+56>>2]|0;if((uZa(d,2)|0)==0?(uZa(d,32768)|0)==0:0){d=c[a+272>>2]|0;e=(Lc[c[(c[d>>2]|0)+188>>2]&255](d)|0)!=0}else{e=0}i=b;return e&1|0}function BUa(a){a=a|0;var b=0,d=0,e=0;b=i;if((AUa(a)|0)==0){d=0;e=d&1;i=b;return e|0}d=(Q_a(c[a+56>>2]|0)|0)==0;e=d&1;i=b;return e|0}function CUa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;i=i+16|0;d=b+4|0;e=b;if((Q_a(c[a+56>>2]|0)|0)!=0){f=0;i=b;return f|0}c[d>>2]=0;g=Lc[c[(c[a>>2]|0)+12>>2]&255](a)|0;if((g|0)==0){h=0}else{j=SZa(c[a+80>>2]|0)|0;ld[c[(c[g>>2]|0)+20>>2]&255](e,g,j);Pna(d,e);Lna(e);h=c[d>>2]|0}e=(dg(h)|0)==0&1;Lna(d);f=e;i=b;return f|0}function DUa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+16|0;d=b+4|0;e=b;if((AUa(a)|0)==0){i=b;return}f=c[a+272>>2]|0;Ic[c[(c[f>>2]|0)+180>>2]&511](d,f);f=Lc[c[(c[a>>2]|0)+12>>2]&255](a)|0;if((f|0)!=0){g=c[(c[f>>2]|0)+24>>2]|0;h=c[a+80>>2]|0;Ona(e,d);a=SZa(h)|0;Qc[g&255](f,a,e)|0;Lna(e)}Lna(d);i=b;return}function EUa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;b=i;i=i+32|0;d=b+28|0;e=b+24|0;f=b+20|0;g=b+16|0;h=b+12|0;j=b+8|0;k=b+4|0;l=b;if((CUa(a)|0)==0){i=b;return}c[d>>2]=0;m=Lc[c[(c[a>>2]|0)+12>>2]&255](a)|0;if((m|0)!=0){n=SZa(c[a+80>>2]|0)|0;ld[c[(c[m>>2]|0)+20>>2]&255](e,m,n);Pna(d,e);Lna(e)}e=a+300|0;do{if((c[e>>2]|0)!=0){c[f>>2]=1;c[g>>2]=0;c[h>>2]=0;c[j>>2]=0;c[k>>2]=0;YVa(c[a+272>>2]|0,j,k);n=c[e>>2]|0;m=A_a(c[a+176>>2]|0)|0;hd[c[(c[n>>2]|0)+4>>2]&1](n,1,m,0,d,h,c[j>>2]|0,c[k>>2]|0,1,f,g,0);if((c[f>>2]|0)!=0){m=(c[g>>2]|0)==0;Lna(h);if(m){o=8;break}else{break}}else{Lna(h);break}}else{o=8}}while(0);if((o|0)==8){o=c[d>>2]|0;if((o|0)!=0?(c[o+4>>2]|0)>0:0){JVa(a);o=c[d>>2]|0;Ic[c[(c[a>>2]|0)+268>>2]&511](a,(o|0)==0?1292088:o+12|0)}o=c[e>>2]|0;if((o|0)!=0){c[l>>2]=0;e=A_a(c[a+176>>2]|0)|0;Fc[c[(c[o>>2]|0)+8>>2]&63](o,1,e,l,0)}}Lna(d);i=b;return}function FUa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;i=i+16|0;d=b+4|0;e=b;if((BUa(a)|0)==0){i=b;return}f=a+272|0;g=c[f>>2]|0;Ic[c[(c[g>>2]|0)+180>>2]&511](d,g);g=Lc[c[(c[a>>2]|0)+12>>2]&255](a)|0;if((g|0)!=0){h=c[(c[g>>2]|0)+24>>2]|0;j=c[a+80>>2]|0;Ona(e,d);a=SZa(j)|0;Qc[h&255](g,a,e)|0;Lna(e)}e=c[f>>2]|0;Lc[c[(c[e>>2]|0)+272>>2]&255](e)|0;Lna(d);i=b;return}function GUa(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b;xVa(a);e=q_a(a)|0;if((e|0)!=0){s_a(e);e$a(e,255)}HUa(a);e=a+312|0;Ic[c[(c[a>>2]|0)+148>>2]&511](d,a);c[e+0>>2]=c[d+0>>2];c[e+4>>2]=c[d+4>>2];c[e+8>>2]=c[d+8>>2];c[e+12>>2]=c[d+12>>2];d=a+272|0;e=c[d>>2]|0;Ic[c[(c[e>>2]|0)+12>>2]&511](e,a+296|0);a=c[d>>2]|0;Ic[c[(c[a>>2]|0)+308>>2]&511](a,1);i=b;return}function HUa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;b=i;i=i+240|0;d=b+224|0;e=b+208|0;f=b+192|0;g=b;h=a+56|0;j=c[h>>2]|0;do{if((uZa(j,8)|0)==0){k=(uZa(j,16)|0)==0;l=c[a+272>>2]|0;m=c[(c[l>>2]|0)+40>>2]|0;if(k){ld[m&255](l,0,0);break}else{ld[m&255](l,1,0);break}}else{l=c[a+272>>2]|0;ld[c[(c[l>>2]|0)+40>>2]&255](l,2,0)}}while(0);j=c[h>>2]|0;do{if((uZa(j,64)|0)==0){l=(uZa(j,128)|0)==0;m=c[a+272>>2]|0;k=c[(c[m>>2]|0)+44>>2]|0;if(l){ld[k&255](m,0,0);break}else{ld[k&255](m,1,0);break}}else{m=c[a+272>>2]|0;ld[c[(c[m>>2]|0)+44>>2]&255](m,2,0)}}while(0);j=c[h>>2]|0;m=a+272|0;if((uZa(j,2)|0)==0){n=j}else{j=c[m>>2]|0;ld[c[(c[j>>2]|0)+48>>2]&255](j,42,0);n=c[h>>2]|0}j=c[m>>2]|0;k=c[(c[j>>2]|0)+72>>2]|0;l=uZa(n,1)|0;ld[k&255](j,l,0);l=c[m>>2]|0;j=c[(c[l>>2]|0)+76>>2]|0;k=uZa(c[h>>2]|0,1024)|0;ld[j&255](l,k,0);k=c[m>>2]|0;l=c[(c[k>>2]|0)+80>>2]|0;j=uZa(c[h>>2]|0,8388608)|0;ld[l&255](k,j,0);j=c[m>>2]|0;k=c[(c[j>>2]|0)+84>>2]|0;l=uZa(c[h>>2]|0,512)|0;ld[k&255](j,l,0);l=c[m>>2]|0;j=c[(c[l>>2]|0)+300>>2]|0;k=uZa(c[h>>2]|0,2048)|0;Ic[j&511](l,k);if((uZa(c[h>>2]|0,16384)|0)==0){k=c[a+276>>2]|0;if((k|0)!=0){Ic[c[(c[a>>2]|0)+152>>2]&511](f,a);rYa(e,f,1.0);P_a(k,e)}}else{c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;P_a(a,d);d=c[m>>2]|0;ld[c[(c[d>>2]|0)+92>>2]&255](d,1,0)}if((uZa(c[h>>2]|0,8192)|0)==0){i=b;return}m_a(g,a);c[a+304>>2]=c[g+60>>2];i=b;return}function IUa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0.0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0.0,$a=0.0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0;d=i;i=i+976|0;e=d+960|0;f=d+944|0;h=d+936|0;j=d+928|0;k=d+920|0;l=d+912|0;m=d+892|0;n=d+888|0;o=d+880|0;p=d+872|0;q=d+864|0;r=d+856|0;s=d+848|0;t=d+840|0;u=d+832|0;v=d+824|0;w=d+816|0;x=d+808|0;y=d+788|0;z=d+784|0;A=d+776|0;B=d+768|0;C=d+752|0;D=d+744|0;E=d+728|0;F=d+720|0;G=d+704|0;H=d+696|0;I=d+688|0;J=d+680|0;K=d+672|0;L=d+664|0;M=d+656|0;N=d+640|0;O=d+632|0;P=d+608|0;Q=d+584|0;R=d+560|0;S=d+536|0;T=d+512|0;U=d+488|0;V=d+464|0;W=d+456|0;X=d+448|0;Y=d+440|0;Z=d+420|0;_=d+416|0;$=d+408|0;aa=d+384|0;ba=d+376|0;ca=d+368|0;da=d+360|0;ea=d+352|0;fa=d+332|0;ga=d+328|0;ha=d+320|0;ia=d+312|0;ja=d+288|0;ka=d+280|0;la=d+272|0;ma=d+264|0;na=d+256|0;oa=d+236|0;pa=d+232|0;qa=d+224|0;ra=d+216|0;sa=d+192|0;ta=d+184|0;ua=d+176|0;va=d+168|0;wa=d+160|0;xa=d+140|0;ya=d+136|0;za=d+128|0;Aa=d+120|0;Ba=d+112|0;Ca=d+104|0;Da=d+96|0;Ea=d+76|0;Fa=d+72|0;Ga=d+64|0;Ha=d+48|0;Ia=d+40|0;Ja=d+32|0;Ka=d+24|0;La=d+16|0;Ma=d+8|0;Na=d;EZa(a,b);Ic[c[(c[a>>2]|0)+152>>2]&511](e,a);gla(f);Oa=a+272|0;Pa=c[Oa>>2]|0;Qa=Lc[c[(c[Pa>>2]|0)+348>>2]&255](Pa)|0;do{if((Qa|0)>0){Pa=GZa(c[a+88>>2]|0)|0;if((Pa|0)==0){pe(h,1293864);Ra=qla(f,c[h>>2]|0,c[h+4>>2]|0)|0;Sa=rla(Ra,FZa(a)|0)|0;pe(j,1292032);Ra=qla(Sa,c[j>>2]|0,c[j+4>>2]|0)|0;Ic[c[(c[a>>2]|0)+112>>2]&511](m,a);c[n>>2]=0;vYa(l,m,n);oe(k,l);Sa=qla(Ra,c[k>>2]|0,c[k+4>>2]|0)|0;pe(o,1289608);qla(Sa,c[o>>2]|0,c[o+4>>2]|0)|0;dka(l);if((Qa|0)>1){Sa=e+4|0;Ta=+(Qa|0);Ra=e+8|0;Ua=e+12|0;Va=p+4|0;Wa=q+4|0;Xa=r+4|0;Ya=s+4|0;Za=1;do{_a=+g[e>>2];$a=+(Za|0);ab=tla(f,_a+$a*((+g[Sa>>2]-_a)/Ta))|0;pe(p,1305864);bb=qla(ab,c[p>>2]|0,c[Va>>2]|0)|0;ab=tla(bb,+g[Ra>>2])|0;pe(q,1293880);bb=qla(ab,c[q>>2]|0,c[Wa>>2]|0)|0;_a=+g[e>>2];ab=tla(bb,_a+$a*((+g[Sa>>2]-_a)/Ta))|0;pe(r,1305864);bb=qla(ab,c[r>>2]|0,c[Xa>>2]|0)|0;ab=tla(bb,+g[Ua>>2])|0;pe(s,1292016);qla(ab,c[s>>2]|0,c[Ya>>2]|0)|0;Za=Za+1|0}while((Za|0)<(Qa|0))}pe(t,1293904);qla(f,c[t>>2]|0,c[t+4>>2]|0)|0;break}else if((Pa|0)==1){pe(u,1293864);Za=qla(f,c[u>>2]|0,c[u+4>>2]|0)|0;Ya=rla(Za,FZa(a)|0)|0;pe(v,1292032);Za=qla(Ya,c[v>>2]|0,c[v+4>>2]|0)|0;Ic[c[(c[a>>2]|0)+112>>2]&511](y,a);c[z>>2]=0;vYa(x,y,z);oe(w,x);Ya=qla(Za,c[w>>2]|0,c[w+4>>2]|0)|0;pe(A,1289608);Za=qla(Ya,c[A>>2]|0,c[A+4>>2]|0)|0;pe(B,1292048);Ya=qla(Za,c[B>>2]|0,c[B+4>>2]|0)|0;HZa(C,a);Za=rla(Ya,c[C>>2]|0)|0;pe(D,1305864);Ya=qla(Za,c[D>>2]|0,c[D+4>>2]|0)|0;HZa(E,a);Za=rla(Ya,c[E+4>>2]|0)|0;pe(F,1292e3);Ya=qla(Za,c[F>>2]|0,c[F+4>>2]|0)|0;HZa(G,a);Za=rla(Ya,c[G+8>>2]|0)|0;pe(H,1292008);qla(Za,c[H>>2]|0,c[H+4>>2]|0)|0;dka(x);if((Qa|0)>1){Za=e+4|0;Ta=+(Qa|0);Ya=e+8|0;Ua=e+12|0;Xa=I+4|0;Sa=J+4|0;Wa=K+4|0;Ra=L+4|0;Va=1;do{_a=+g[e>>2];$a=+(Va|0);ab=tla(f,_a+$a*((+g[Za>>2]-_a)/Ta))|0;pe(I,1305864);bb=qla(ab,c[I>>2]|0,c[Xa>>2]|0)|0;ab=tla(bb,+g[Ya>>2])|0;pe(J,1293880);bb=qla(ab,c[J>>2]|0,c[Sa>>2]|0)|0;_a=+g[e>>2];ab=tla(bb,_a+$a*((+g[Za>>2]-_a)/Ta))|0;pe(K,1305864);bb=qla(ab,c[K>>2]|0,c[Wa>>2]|0)|0;ab=tla(bb,+g[Ua>>2])|0;pe(L,1292016);qla(ab,c[L>>2]|0,c[Ra>>2]|0)|0;Va=Va+1|0}while((Va|0)<(Qa|0))}pe(M,1293904);qla(f,c[M>>2]|0,c[M+4>>2]|0)|0;break}else{break}}}while(0);M=f+4|0;ula(b,c[M>>2]|0,c[f+8>>2]|0)|0;gla(N);g[O>>2]=0.0;g[O+4>>2]=0.0;f=c[Oa>>2]|0;Ic[c[(c[f>>2]|0)+208>>2]&511](P,f);zUa(Q,a);f=a+56|0;if((uZa(c[f>>2]|0,16384)|0)==0){Qa=c[Oa>>2]|0;Ic[c[(c[Qa>>2]|0)+204>>2]&511](R,Qa);cb=P}else{c[R+0>>2]=c[P+0>>2];c[R+4>>2]=c[P+4>>2];c[R+8>>2]=c[P+8>>2];c[R+12>>2]=c[P+12>>2];c[R+16>>2]=c[P+16>>2];c[R+20>>2]=c[P+20>>2];cb=P}Qa=S+12|0;c[S+0>>2]=c[cb+0>>2];c[S+4>>2]=c[cb+4>>2];c[S+8>>2]=c[cb+8>>2];c[Qa+0>>2]=c[Q+0>>2];c[Qa+4>>2]=c[Q+4>>2];c[Qa+8>>2]=c[Q+8>>2];nt(S);Qa=Q+12|0;cb=P+12|0;P=T+12|0;c[T+0>>2]=c[Qa+0>>2];c[T+4>>2]=c[Qa+4>>2];c[T+8>>2]=c[Qa+8>>2];c[P+0>>2]=c[cb+0>>2];c[P+4>>2]=c[cb+4>>2];c[P+8>>2]=c[cb+8>>2];nt(T);zUa(V,a);jYa(U,V,R);zYa(W,c[Oa>>2]|0,O,U);V=c[W>>2]|0;if((V|0)!=0?(c[V+4>>2]|0)>0:0){c[Z>>2]=2;g[Z+4>>2]=0.0;g[Z+8>>2]=.20000000298023224;g[Z+12>>2]=.4431372582912445;g[Z+16>>2]=0.0;c[_>>2]=1;vYa(Y,Z,_);oe(X,Y);_=qla(N,c[X>>2]|0,c[X+4>>2]|0)|0;oe($,W);qla(_,c[$>>2]|0,c[$+4>>2]|0)|0;dka(Y)}jYa(aa,R,S);c[U+0>>2]=c[aa+0>>2];c[U+4>>2]=c[aa+4>>2];c[U+8>>2]=c[aa+8>>2];c[U+12>>2]=c[aa+12>>2];c[U+16>>2]=c[aa+16>>2];c[U+20>>2]=c[aa+20>>2];aa=c[Oa>>2]|0;S=c[f>>2]|0;Y=Lc[c[(c[aa>>2]|0)+344>>2]&255](aa)|0;yYa(ba,aa,O,U,(uZa(S,256)|0)==0&1,Y);Y=c[ba>>2]|0;if((Y|0)!=0?(c[Y+4>>2]|0)>0:0){pe(ca,1291896);Y=qla(N,c[ca>>2]|0,c[ca+4>>2]|0)|0;Ic[c[(c[a>>2]|0)+116>>2]&511](fa,a);c[ga>>2]=1;vYa(ea,fa,ga);oe(da,ea);ga=qla(Y,c[da>>2]|0,c[da+4>>2]|0)|0;oe(ha,ba);da=qla(ga,c[ha>>2]|0,c[ha+4>>2]|0)|0;pe(ia,1291904);qla(da,c[ia>>2]|0,c[ia+4>>2]|0)|0;dka(ea)}jYa(ja,R,Q);c[U+0>>2]=c[ja+0>>2];c[U+4>>2]=c[ja+4>>2];c[U+8>>2]=c[ja+8>>2];c[U+12>>2]=c[ja+12>>2];c[U+16>>2]=c[ja+16>>2];c[U+20>>2]=c[ja+20>>2];ja=c[Oa>>2]|0;Q=c[f>>2]|0;ea=Lc[c[(c[ja>>2]|0)+344>>2]&255](ja)|0;yYa(ka,ja,O,U,(uZa(Q,256)|0)==0&1,ea);ea=c[ka>>2]|0;if((ea|0)!=0?(c[ea+4>>2]|0)>0:0){pe(la,1291896);ea=qla(N,c[la>>2]|0,c[la+4>>2]|0)|0;c[oa>>2]=1;g[oa+4>>2]=1.0;g[oa+8>>2]=0.0;g[oa+12>>2]=0.0;g[oa+16>>2]=0.0;c[pa>>2]=1;vYa(na,oa,pa);oe(ma,na);pa=qla(ea,c[ma>>2]|0,c[ma+4>>2]|0)|0;oe(qa,ka);ma=qla(pa,c[qa>>2]|0,c[qa+4>>2]|0)|0;pe(ra,1291904);qla(ma,c[ra>>2]|0,c[ra+4>>2]|0)|0;dka(na)}jYa(sa,R,T);c[U+0>>2]=c[sa+0>>2];c[U+4>>2]=c[sa+4>>2];c[U+8>>2]=c[sa+8>>2];c[U+12>>2]=c[sa+12>>2];c[U+16>>2]=c[sa+16>>2];c[U+20>>2]=c[sa+20>>2];sa=c[Oa>>2]|0;T=c[f>>2]|0;na=Lc[c[(c[sa>>2]|0)+344>>2]&255](sa)|0;yYa(ta,sa,O,U,(uZa(T,256)|0)==0&1,na);na=c[ta>>2]|0;if((na|0)!=0?(c[na+4>>2]|0)>0:0){pe(ua,1291896);na=qla(N,c[ua>>2]|0,c[ua+4>>2]|0)|0;Ic[c[(c[a>>2]|0)+116>>2]&511](xa,a);c[ya>>2]=1;vYa(wa,xa,ya);oe(va,wa);ya=qla(na,c[va>>2]|0,c[va+4>>2]|0)|0;oe(za,ta);va=qla(ya,c[za>>2]|0,c[za+4>>2]|0)|0;pe(Aa,1291904);qla(va,c[Aa>>2]|0,c[Aa+4>>2]|0)|0;dka(wa)}if((uZa(c[f>>2]|0,8192)|0)!=0){AYa(Ba,c[Oa>>2]|0,c[a+304>>2]|0,O,R);R=c[Ba>>2]|0;if((R|0)!=0?(c[R+4>>2]|0)>0:0){c[Ea>>2]=2;g[Ea+4>>2]=1.0;g[Ea+8>>2]=0.0;g[Ea+12>>2]=0.0;g[Ea+16>>2]=0.0;c[Fa>>2]=0;vYa(Da,Ea,Fa);oe(Ca,Da);Fa=qla(N,c[Ca>>2]|0,c[Ca+4>>2]|0)|0;oe(Ga,Ba);qla(Fa,c[Ga>>2]|0,c[Ga+4>>2]|0)|0;dka(Da)}dka(Ba)}Ba=N+8|0;if((c[Ba>>2]|0)<=0){db=N+4|0;dka(ta);dka(ka);dka(ba);dka(W);eb=c[db>>2]|0;ila(eb);fb=c[M>>2]|0;ila(fb);i=d;return}Ic[c[(c[a>>2]|0)+152>>2]&511](Ha,a);pe(Ia,1289624);qla(b,c[Ia>>2]|0,c[Ia+4>>2]|0)|0;if((uZa(c[f>>2]|0,16384)|0)==0){f=tla(b,+g[Ha>>2])|0;pe(Ja,1305864);Ia=qla(f,c[Ja>>2]|0,c[Ja+4>>2]|0)|0;Ja=Ha+8|0;f=tla(Ia,+g[Ja>>2])|0;pe(Ka,1305864);Ia=qla(f,c[Ka>>2]|0,c[Ka+4>>2]|0)|0;Ka=tla(Ia,+g[Ha+4>>2]- +g[Ha>>2])|0;pe(La,1305864);Ia=qla(Ka,c[La>>2]|0,c[La+4>>2]|0)|0;La=tla(Ia,+g[Ha+12>>2]- +g[Ja>>2])|0;pe(Ma,1293240);qla(La,c[Ma>>2]|0,c[Ma+4>>2]|0)|0}Ma=N+4|0;ula(b,c[Ma>>2]|0,c[Ba>>2]|0)|0;pe(Na,1289640);qla(b,c[Na>>2]|0,c[Na+4>>2]|0)|0;db=Ma;dka(ta);dka(ka);dka(ba);dka(W);eb=c[db>>2]|0;ila(eb);fb=c[M>>2]|0;ila(fb);i=d;return}function JUa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0.0,G=0,H=0,I=0,J=0,K=0.0,L=0,M=0.0,N=0,O=0,P=0;e=i;i=i+496|0;f=e+472|0;h=e+456|0;j=e+424|0;k=e+412|0;l=e+392|0;m=e+364|0;n=e+352|0;o=e+340|0;p=e+328|0;q=e+316|0;r=e+296|0;s=e+280|0;t=e+256|0;u=e+240|0;v=e+220|0;w=e+200|0;x=e+192|0;y=e;LZa(a,b,d);Ic[c[(c[a>>2]|0)+152>>2]&511](f,a);gla(h);z=a+272|0;A=c[z>>2]|0;B=Lc[c[(c[A>>2]|0)+348>>2]&255](A)|0;do{if((B|0)>0){A=GZa(c[a+88>>2]|0)|0;if((A|0)==1){dJa(m);g[m+24>>2]=+(FZa(a)|0);hJa(m,2);HZa(n,a);C=m+8|0;g[c[C>>2]>>2]=+(c[n>>2]|0);HZa(o,a);g[(c[C>>2]|0)+4>>2]=+(c[o+4>>2]|0);HZa(p,a);g[m+12>>2]=+(c[p+8>>2]|0);OIa(q);D=B+ -1|0;QIa(q,D<<1);E=f+4|0;F=+(B|0);G=f+8|0;H=f+12|0;I=0;while(1){if((I|0)>=(D|0)){break}J=I<<1;K=+g[f>>2];L=I+1|0;M=+(L|0);WIa(q,J,K+M*((+g[E>>2]-K)/F),+g[G>>2],6);K=+g[f>>2];WIa(q,J|1,K+M*((+g[E>>2]-K)/F),+g[H>>2],2);I=L}if((c[q>>2]|0)>0){Ic[c[(c[a>>2]|0)+112>>2]&511](r,a);UGa(b,q,d,m,0,SYa(r,255)|0,1,0)|0}PIa(c[q+4>>2]|0);gJa(c[C>>2]|0);break}else if((A|0)==0){dJa(j);g[j+24>>2]=+(FZa(a)|0);OIa(k);I=B+ -1|0;QIa(k,I<<1);H=f+4|0;F=+(B|0);E=f+8|0;G=f+12|0;D=0;while(1){if((D|0)>=(I|0)){break}L=D<<1;K=+g[f>>2];J=D+1|0;M=+(J|0);WIa(k,L,K+M*((+g[H>>2]-K)/F),+g[E>>2],6);K=+g[f>>2];WIa(k,L|1,K+M*((+g[H>>2]-K)/F),+g[G>>2],2);D=J}if((c[k>>2]|0)>0){Ic[c[(c[a>>2]|0)+112>>2]&511](l,a);UGa(b,k,d,j,0,SYa(l,255)|0,1,0)|0}PIa(c[k+4>>2]|0);gJa(c[j+8>>2]|0);break}else{break}}}while(0);c[s+0>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;c[s+12>>2]=0;j=c[z>>2]|0;Ic[c[(c[j>>2]|0)+204>>2]&511](t,j);j=a+56|0;if((uZa(c[j>>2]|0,16384)|0)==0){Ic[c[(c[a>>2]|0)+152>>2]&511](u,a);c[s+0>>2]=c[u+0>>2];c[s+4>>2]=c[u+4>>2];c[s+8>>2]=c[u+8>>2];c[s+12>>2]=c[u+12>>2];N=t}else{N=0}t=Lc[c[(c[a>>2]|0)+12>>2]&255](a)|0;u=c[z>>2]|0;Ic[c[(c[a>>2]|0)+116>>2]&511](v,a);k=a+156|0;l=SYa(v,MZa(c[k>>2]|0)|0)|0;Ic[c[(c[a>>2]|0)+120>>2]&511](w,a);v=SYa(w,MZa(c[k>>2]|0)|0)|0;g[x>>2]=0.0;g[x+4>>2]=0.0;J1a(b,d,u,l,v,s,x,N,t,c[a+328>>2]|0);if((uZa(c[j>>2]|0,8192)|0)==0){O=h+4|0;P=c[O>>2]|0;ila(P);i=e;return}j=c[z>>2]|0;m_a(y,a);_Ya(b,d,j,s,N,c[y+60>>2]|0);O=h+4|0;P=c[O>>2]|0;ila(P);i=e;return}function KUa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;$Za(a,b,d)|0;if((uZa(c[a+56>>2]|0,16384)|0)==0?(N_a(a,b)|0)==0:0){i=e;return 1}f=a+280|0;if((c[f>>2]|0)!=0){Ic[c[(c[a>>2]|0)+20>>2]&511](a,0)}c[f>>2]=1;C_a(a);f=c[a+272>>2]|0;g=c[(c[f>>2]|0)+216>>2]|0;h=p$a(a,d)|0;j=o$a(a,d)|0;pd[g&127](f,b,h,j);i=e;return 1}function LUa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;YZa(a,b,d)|0;if((uZa(c[a+56>>2]|0,16384)|0)==0?(N_a(a,b)|0)==0:0){i=e;return 1}b=c[a+272>>2]|0;Rc[c[(c[b>>2]|0)+164>>2]&1023](b);i=e;return 1}function MUa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;e=i;i=i+144|0;f=e+120|0;g=e+112|0;h=e+96|0;j=e+8|0;k=e+92|0;l=e+88|0;m=e+84|0;n=e;o=e+80|0;p=e+76|0;q=e+72|0;r=e+68|0;s=e+64|0;t=e+60|0;u=e+56|0;v=e+52|0;w=e+48|0;x=e+44|0;y=e+40|0;z=e+36|0;A=e+32|0;B=e+28|0;C=e+24|0;D=e+20|0;E=e+16|0;if((c[a+280>>2]|0)!=0){F=0;i=e;return F|0}g_a(a,b,d)|0;d=a+56|0;if((uZa(c[d>>2]|0,16384)|0)==0?(N_a(a,b)|0)==0:0){F=1;i=e;return F|0}G=Lc[c[(c[a>>2]|0)+12>>2]&255](a)|0;if((G|0)==0){F=0;i=e;return F|0}Rc[c[(c[a>>2]|0)+80>>2]&1023](a);NUa(f,a,b);H=a+272|0;I=c[H>>2]|0;ld[c[(c[I>>2]|0)+360>>2]&255](g,I,f);I=Lc[c[(c[G>>2]|0)+40>>2]&255](G)|0;if((I|0)==0){J=0}else{Ija(h,4);K=b;b=c[K+4>>2]|0;L=j;c[L>>2]=c[K>>2];c[L+4>>2]=b;b=c[d>>2]|0;if((((Q_a(b)|0)==0?(uZa(b,8192)|0)!=0:0)?(L=c[g>>2]|0,(dg(L)|0)==0):0)?(K=a+304|0,(c[K>>2]|0)!=0):0){Yka(k,L);L=c[K>>2]|0;M=c[k>>2]|0;N=(M|0)==0?1305928:M+12|0;if((dd[c[c[L>>2]>>2]&511](L,N)|0)==0){L=c[K>>2]|0;ld[c[(c[L>>2]|0)+4>>2]&255](L,N,h);N=c[h+4>>2]|0;if((N|0)>0){L=0;do{K=c[(c[G>>2]|0)+44>>2]|0;Vka(l,Mh(h,L)|0);id[K&511](G,I,L+8|0,l)|0;Lna(l);L=L+1|0}while((L|0)<(N|0));N=c[(c[G>>2]|0)+44>>2]|0;Mna(m,1292088,-1);id[N&511](G,I,0,m)|0;Lna(m)}OUa(n,c[H>>2]|0,f+12|0);m=n;n=c[m+4>>2]|0;N=j;c[N>>2]=c[m>>2];c[N+4>>2]=n}dka(k);O=c[d>>2]|0}else{O=b}b=a$a(c[a+48>>2]|0)|0;if((uZa(O,2048)|0)!=0){O=c[(c[G>>2]|0)+44>>2]|0;k=(b|0)!=0;if(k){ld[c[(c[b>>2]|0)+4>>2]&255](o,b,0)}else{Mna(o,1289648,-1)}id[O&511](G,I,1,o)|0;Lna(o);o=c[(c[G>>2]|0)+44>>2]|0;if(k){ld[c[(c[b>>2]|0)+4>>2]&255](p,b,1)}else{Mna(p,1289672,-1)}id[o&511](G,I,2,p)|0;Lna(p);p=c[(c[G>>2]|0)+44>>2]|0;Mna(q,1292088,-1);id[p&511](G,I,0,q)|0;Lna(q);q=c[H>>2]|0;if((Lc[c[(c[q>>2]|0)+368>>2]&255](q)|0)==0){id[c[(c[G>>2]|0)+48>>2]&511](G,I,1,0)|0}q=c[H>>2]|0;if((Lc[c[(c[q>>2]|0)+372>>2]&255](q)|0)==0){id[c[(c[G>>2]|0)+48>>2]&511](G,I,2,0)|0}}q=c[(c[G>>2]|0)+44>>2]|0;p=(b|0)!=0;if(p){ld[c[(c[b>>2]|0)+4>>2]&255](r,b,2)}else{Mna(r,1289696,-1)}id[q&511](G,I,3,r)|0;Lna(r);r=c[(c[G>>2]|0)+44>>2]|0;if(p){ld[c[(c[b>>2]|0)+4>>2]&255](s,b,3)}else{Mna(s,1289720,-1)}id[r&511](G,I,4,s)|0;Lna(s);s=c[(c[G>>2]|0)+44>>2]|0;if(p){ld[c[(c[b>>2]|0)+4>>2]&255](t,b,4)}else{Mna(t,1289744,-1)}id[s&511](G,I,5,t)|0;Lna(t);t=c[(c[G>>2]|0)+44>>2]|0;if(p){ld[c[(c[b>>2]|0)+4>>2]&255](u,b,5)}else{Mna(u,1289776,-1)}id[t&511](G,I,6,u)|0;Lna(u);u=a+80|0;t=SZa(c[u>>2]|0)|0;ld[c[(c[G>>2]|0)+20>>2]&255](v,G,t);if((dg(c[v>>2]|0)|0)!=0){id[c[(c[G>>2]|0)+48>>2]&511](G,I,5,0)|0}t=c[H>>2]|0;if((Lc[c[(c[t>>2]|0)+188>>2]&255](t)|0)==0){id[c[(c[G>>2]|0)+48>>2]&511](G,I,3,0)|0;id[c[(c[G>>2]|0)+48>>2]&511](G,I,4,0)|0;id[c[(c[G>>2]|0)+48>>2]&511](G,I,6,0)|0}t=c[d>>2]|0;if((Q_a(t)|0)==0){P=t}else{id[c[(c[G>>2]|0)+48>>2]&511](G,I,3,0)|0;id[c[(c[G>>2]|0)+48>>2]&511](G,I,6,0)|0;id[c[(c[G>>2]|0)+48>>2]&511](G,I,5,0)|0;P=c[d>>2]|0}if((uZa(P,2)|0)==0){Q=P}else{id[c[(c[G>>2]|0)+48>>2]&511](G,I,3,0)|0;id[c[(c[G>>2]|0)+48>>2]&511](G,I,4,0)|0;Q=c[d>>2]|0}if((uZa(Q,32768)|0)!=0){id[c[(c[G>>2]|0)+48>>2]&511](G,I,3,0)|0;id[c[(c[G>>2]|0)+48>>2]&511](G,I,4,0)|0}Q=c[(c[G>>2]|0)+44>>2]|0;Mna(w,1292088,-1);id[Q&511](G,I,0,w)|0;Lna(w);w=c[(c[G>>2]|0)+44>>2]|0;if(p){ld[c[(c[b>>2]|0)+4>>2]&255](x,b,6)}else{Mna(x,1289808,-1)}id[w&511](G,I,7,x)|0;Lna(x);x=c[H>>2]|0;if((Lc[c[(c[x>>2]|0)+380>>2]&255](x)|0)==0){id[c[(c[G>>2]|0)+48>>2]&511](G,I,7,0)|0}h$a(a,j,y,z);j=SZa(c[u>>2]|0)|0;pd[c[(c[G>>2]|0)+28>>2]&127](G,j,y,z);Ic[c[(c[G>>2]|0)+36>>2]&511](G,0);j=SZa(c[u>>2]|0)|0;do{switch(ed[c[(c[G>>2]|0)+52>>2]&127](G,I,c[y>>2]|0,c[z>>2]|0,j)|0){case 11:{u=c[H>>2]|0;x=dd[c[(c[u>>2]|0)+312>>2]&511](u,f)|0;u=c[H>>2]|0;w=dd[c[(c[u>>2]|0)+312>>2]&511](u,f+12|0)|0;XVa(c[H>>2]|0,x,w);Vka(D,Mh(h,3)|0);w=c[D>>2]|0;PUa(a,(w|0)==0?1292088:w+12|0);Lna(D);break};case 6:{JVa(a);break};case 7:{LVa(c[H>>2]|0);break};case 9:{w=c[H>>2]|0;x=dd[c[(c[w>>2]|0)+312>>2]&511](w,f)|0;w=c[H>>2]|0;u=dd[c[(c[w>>2]|0)+312>>2]&511](w,f+12|0)|0;XVa(c[H>>2]|0,x,u);Vka(B,Mh(h,1)|0);u=c[B>>2]|0;PUa(a,(u|0)==0?1292088:u+12|0);Lna(B);break};case 4:{Rc[c[(c[a>>2]|0)+244>>2]&1023](a);break};case 5:{Rc[c[(c[a>>2]|0)+248>>2]&1023](a);break};case 3:{Rc[c[(c[a>>2]|0)+252>>2]&1023](a);break};case 8:{u=c[H>>2]|0;x=dd[c[(c[u>>2]|0)+312>>2]&511](u,f)|0;u=c[H>>2]|0;w=dd[c[(c[u>>2]|0)+312>>2]&511](u,f+12|0)|0;XVa(c[H>>2]|0,x,w);Vka(A,Mh(h,0)|0);w=c[A>>2]|0;PUa(a,(w|0)==0?1292088:w+12|0);Lna(A);break};case 1:{NVa(a);break};case 2:{MVa(a);break};case 12:{w=c[H>>2]|0;x=dd[c[(c[w>>2]|0)+312>>2]&511](w,f)|0;w=c[H>>2]|0;u=dd[c[(c[w>>2]|0)+312>>2]&511](w,f+12|0)|0;XVa(c[H>>2]|0,x,u);Vka(E,Mh(h,4)|0);u=c[E>>2]|0;PUa(a,(u|0)==0?1292088:u+12|0);Lna(E);break};case 10:{u=c[H>>2]|0;x=dd[c[(c[u>>2]|0)+312>>2]&511](u,f)|0;u=c[H>>2]|0;w=dd[c[(c[u>>2]|0)+312>>2]&511](u,f+12|0)|0;XVa(c[H>>2]|0,x,w);Vka(C,Mh(h,2)|0);w=c[C>>2]|0;PUa(a,(w|0)==0?1292088:w+12|0);Lna(C);break};default:{}}}while(0);Ic[c[(c[G>>2]|0)+56>>2]&511](G,I);Lna(v);FG(h);J=1}Lna(g);F=J;i=e;return F|0}function NUa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;g=b+272|0;b=c[g>>2]|0;ld[c[(c[b>>2]|0)+336>>2]&255](f,b,d);sVa(a,c[g>>2]|0,f);i=e;return}function OUa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0.0,l=0.0;e=i;i=i+96|0;f=e+76|0;h=e;g[a>>2]=0.0;g[a+4>>2]=0.0;j=Lc[c[(c[b>>2]|0)+16>>2]&255](b)|0;if((j|0)==0){i=e;return}b=Lc[c[(c[j>>2]|0)+52>>2]&255](j)|0;c[f+0>>2]=c[b+0>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];Ic[c[(c[j>>2]|0)+48>>2]&511](j,d);Um(h);if((dd[c[(c[j>>2]|0)+32>>2]&511](j,h)|0)!=0){k=+(+g[h+20>>2]+ +g[h+36>>2]);l=+(+g[h+24>>2]+ +g[h+32>>2]);h=a;g[h>>2]=k;g[h+4>>2]=l}Ic[c[(c[j>>2]|0)+48>>2]&511](j,f);i=e;return}function PUa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+272|0;a=c[e>>2]|0;Lc[c[(c[a>>2]|0)+272>>2]&255](a)|0;a=c[e>>2]|0;ed[c[(c[a>>2]|0)+260>>2]&127](a,b,1,0,0)|0;i=d;return}function QUa(a){a=a|0;var b=0,d=0;b=i;TVa(a);if((Q_a(c[a+56>>2]|0)|0)==0?(d=$_a(c[a+52>>2]|0)|0,(d|0)!=0):0){Ic[c[c[d>>2]>>2]&511](d,a)}c[a+308>>2]=1;i=b;return}function RUa(a){a=a|0;var b=0,d=0,e=0,f=0,h=0;b=i;i=i+16|0;d=b+8|0;e=b;Ic[c[(c[a>>2]|0)+256>>2]&511](a,0);f=c[a+272>>2]|0;Rc[c[(c[f>>2]|0)+168>>2]&1023](f);g[d>>2]=0.0;g[d+4>>2]=0.0;g[e>>2]=0.0;g[e+4>>2]=0.0;CVa(a,0,d,e);c[a+288>>2]=0;if((Q_a(c[a+56>>2]|0)|0)!=0){h=a+308|0;c[h>>2]=0;i=b;return}e=$_a(c[a+52>>2]|0)|0;if((e|0)==0){h=a+308|0;c[h>>2]=0;i=b;return}Ic[c[(c[e>>2]|0)+4>>2]&511](e,a);h=a+308|0;c[h>>2]=0;i=b;return}function SUa(a){a=a|0;var b=0,d=0;b=i;d=Lc[c[(c[a>>2]|0)+364>>2]&255](a)|0;i=b;return d|0}function TUa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,j=0.0;e=i;if((a|0)==0){f=0.0;i=e;return+f}if((Tu(a)|0)!=0){f=0.0;i=e;return+f}h=(+g[b+4>>2]- +g[b>>2])/+(d|0)*1.0e3/+((c[a+120>>2]|0)-(c[a+112>>2]|0)|0);j=(+g[b+12>>2]- +g[b+8>>2])*-1.0e3/+((c[a+124>>2]|0)-(c[a+116>>2]|0)|0);f=h<j?h:j;i=e;return+f}function UUa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0.0;d=i;i=i+16|0;e=d;f=a+56|0;if(!((uZa(c[f>>2]|0,256)|0)!=0&(b|0)>0)){i=d;return}g=a+272|0;h=c[g>>2]|0;ld[c[(c[h>>2]|0)+56>>2]&255](h,b,1);h=c[g>>2]|0;ld[c[(c[h>>2]|0)+92>>2]&255](h,1,1);if((uZa(c[f>>2]|0,8388608)|0)==0){i=d;return}f=b$a(c[a+44>>2]|0)|0;if((f|0)==0){i=d;return}h=dd[c[c[f>>2]>>2]&511](f,0)|0;Ic[c[(c[a>>2]|0)+152>>2]&511](e,a);j=+TUa(h,e,b);if(!(j>0.0)){i=d;return}b=c[g>>2]|0;ld[c[(c[b>>2]|0)+80>>2]&255](b,0,1);b=c[g>>2]|0;Oc[c[(c[b>>2]|0)+88>>2]&3](b,j,1);i=d;return}function VUa(a,b){a=a|0;b=b|0;var d=0;d=i;ld[c[(c[a>>2]|0)+52>>2]&255](a,b,1);i=d;return}function WUa(a,b){a=a|0;b=b|0;b=i;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;i=b;return}function XUa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0;d=i;i=i+16|0;e=d;f=q_a(a)|0;if((f|0)==0){i=d;return}h=(c[f+256>>2]|0)!=0;if((b|0)==0){if(!h){i=d;return}Ic[c[(c[f>>2]|0)+100>>2]&511](f,0);BZa(a,a+312|0,1,1);i=d;return}else{if(h){i=d;return}Ic[c[(c[f>>2]|0)+100>>2]&511](f,1);Ic[c[(c[a>>2]|0)+148>>2]&511](e,a);f=a+312|0;c[f+0>>2]=c[e+0>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];c[f+12>>2]=c[e+12>>2];f=e+4|0;g[f>>2]=+g[f>>2]+12.0;BZa(a,e,1,1);i=d;return}}function YUa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;e=i;i=i+32|0;f=e+24|0;g=e+20|0;h=e+16|0;j=e+12|0;k=e+8|0;l=e+4|0;m=e;if((c[a+280>>2]|0)!=0){n=1;i=e;return n|0}if(b<<16>>16==46){o=a+300|0;do{if((c[o>>2]|0)!=0){c[f>>2]=1;c[g>>2]=0;c[h>>2]=0;c[j>>2]=0;c[k>>2]=0;c[l>>2]=0;YVa(c[a+272>>2]|0,k,l);p=c[k>>2]|0;q=c[l>>2]|0;if((p|0)==(q|0)){r=p+1|0;c[l>>2]=r;s=r}else{s=q}q=c[o>>2]|0;r=A_a(c[a+176>>2]|0)|0;hd[c[(c[q>>2]|0)+4>>2]&1](q,1,r,46,h,j,p,s,1,f,g,d);if((c[f>>2]|0)==0){Lna(j);Lna(h);n=0;i=e;return n|0}p=(c[g>>2]|0)!=0;Lna(j);Lna(h);if(p){n=0;i=e;return n|0}else{t=HVa(a,46,d)|0;break}}else{t=HVa(a,46,d)|0}}while(0);h=c[o>>2]|0;if((h|0)!=0?(c[m>>2]=0,o=c[(c[h>>2]|0)+8>>2]|0,j=A_a(c[a+176>>2]|0)|0,Fc[o&63](h,1,j,m,d),(c[m>>2]|0)!=0):0){n=0;i=e;return n|0}else{u=t}}else{u=HVa(a,b,d)|0}t=(ZUa(a,b,d)|0)==0;n=t?u:1;i=e;return n|0}function ZUa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=o$a(a,c)|0;f=b&65535;if(!((e|0)!=0&(q$a(a,c)|0)==0)){if((f|0)==32|(f|0)==13|(f|0)==8|(f|0)==27){g=1}else{h=4}}else{switch(f|0){case 32:case 13:case 8:case 27:case 90:case 65:case 88:case 86:case 67:{g=1;break};default:{h=4}}}if((h|0)==4){g=0}i=d;return g|0}function _Ua(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+32|0;f=e+20|0;g=e+16|0;h=e+12|0;j=e+8|0;k=e+4|0;l=e;if((c[a+280>>2]|0)!=0){m=1;i=e;return m|0}c[f>>2]=1;c[g>>2]=0;n=(o$a(a,d)|0)!=0;if(!n?(o=a+300|0,(c[o>>2]|0)!=0):0){c[h>>2]=0;c[j>>2]=0;c[k>>2]=0;YVa(c[a+272>>2]|0,j,k);p=b&65535;if((p|0)==8){q=c[j>>2]|0;if((q|0)==(c[k>>2]|0)){c[j>>2]=q+ -1;r=8}else{r=8}}else if((p|0)==13){r=13}else{Zna(h,p);r=0}c[l>>2]=0;p=c[o>>2]|0;o=A_a(c[a+176>>2]|0)|0;hd[c[(c[p>>2]|0)+4>>2]&1](p,1,o,r,h,l,c[j>>2]|0,c[k>>2]|0,1,f,g,d);Lna(l);Lna(h)}if((c[f>>2]|0)==0){m=1;i=e;return m|0}if((c[g>>2]|0)!=0){m=0;i=e;return m|0}f=b$a(c[a+44>>2]|0)|0;if((f|0)!=0?(h=a+288|0,l=PVa(c[h>>2]|0)|0,k=Qc[c[(c[f>>2]|0)+16>>2]&255](f,b,1)|0,(l|0)!=(k|0)):0){c[h>>2]=k&255}k=KVa(a,b,d)|0;if((!n?(n=c[a+300>>2]|0,(n|0)!=0):0)?(b=c[(c[n>>2]|0)+8>>2]|0,h=A_a(c[a+176>>2]|0)|0,Fc[b&63](n,1,h,g,d),(c[g>>2]|0)!=0):0){m=0;i=e;return m|0}m=k;i=e;return m|0}function $Ua(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0.0,k=0.0,l=0.0;e=i;i=i+16|0;d=e;if((uZa(c[a+56>>2]|0,1)|0)==0){f=0;i=e;return f|0}h=a+272|0;_Va(d,c[h>>2]|0);j=+Vc[c[(c[a>>2]|0)+124>>2]&15](a);a=d+4|0;k=+g[a>>2];if(b<<16>>16>0){l=j+k}else{l=k-j}g[a>>2]=l;ZVa(c[h>>2]|0,d);f=1;i=e;return f|0}function aVa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+80|0;f=e+48|0;g=e+24|0;h=e;if((uZa(c[a+56>>2]|0,8192)|0)!=0){j=a+272|0;k=c[j>>2]|0;l=c[(c[k>>2]|0)+296>>2]|0;cVa(g,k,d);cVa(h,c[j>>2]|0,b);bVa(f,g,h);Ic[l&511](k,f)}f=c[a+284>>2]|0;if((f|0)==0){i=e;return}ld[c[(c[f>>2]|0)+12>>2]&255](f,b,d);i=e;return}function bVa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;c[a+0>>2]=-1;c[a+4>>2]=-1;c[a+8>>2]=-1;c[a+12>>2]=-1;c[a+16>>2]=-1;c[a+20>>2]=-1;if((Nm(b,d)|0)<0){c[a+0>>2]=c[b+0>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2]}else{c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2]}f=b+12|0;b=d+12|0;d=a+12|0;if((Nm(f,b)|0)<0){c[d+0>>2]=c[b+0>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];i=e;return}else{c[d+0>>2]=c[f+0>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];i=e;return}}function cVa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;sVa(a,b,c);i=d;return}function dVa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;aVa(a+ -296|0,b,c);i=d;return}function eVa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+80|0;f=e+48|0;g=e+24|0;h=e;if((uZa(c[a+56>>2]|0,8192)|0)!=0){j=a+272|0;k=c[j>>2]|0;l=c[(c[k>>2]|0)+296>>2]|0;cVa(g,k,d);cVa(h,c[j>>2]|0,b);bVa(f,g,h);Ic[l&511](k,f)}f=c[a+284>>2]|0;if((f|0)==0){i=e;return}ld[c[(c[f>>2]|0)+16>>2]&255](f,b,d);i=e;return}function fVa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;eVa(a+ -296|0,b,c);i=d;return}function gVa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+80|0;f=e+48|0;g=e+24|0;h=e;if((uZa(c[a+56>>2]|0,8192)|0)!=0){j=a+272|0;k=c[j>>2]|0;l=c[(c[k>>2]|0)+296>>2]|0;cVa(g,k,d);cVa(h,c[j>>2]|0,b);bVa(f,g,h);Ic[l&511](k,f)}f=c[a+284>>2]|0;if((f|0)==0){i=e;return}ld[c[(c[f>>2]|0)+20>>2]&255](f,b,d);i=e;return}function hVa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;gVa(a+ -296|0,b,c);i=d;return}function iVa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+80|0;f=e+48|0;g=e+24|0;h=e;if((uZa(c[a+56>>2]|0,8192)|0)!=0){j=a+272|0;k=c[j>>2]|0;l=c[(c[k>>2]|0)+296>>2]|0;cVa(g,k,d);cVa(h,c[j>>2]|0,b);bVa(f,g,h);Ic[l&511](k,f)}f=c[a+284>>2]|0;if((f|0)==0){i=e;return}ld[c[(c[f>>2]|0)+24>>2]&255](f,b,d);i=e;return}function jVa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;iVa(a+ -296|0,b,c);i=d;return}function kVa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+80|0;f=e+48|0;g=e+24|0;h=e;if((uZa(c[a+56>>2]|0,8192)|0)!=0){j=a+272|0;k=c[j>>2]|0;l=c[(c[k>>2]|0)+296>>2]|0;cVa(g,k,d);cVa(h,c[j>>2]|0,b);bVa(f,g,h);Ic[l&511](k,f)}f=c[a+284>>2]|0;if((f|0)==0){i=e;return}ld[c[(c[f>>2]|0)+8>>2]&255](f,b,d);i=e;return}function lVa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;kVa(a+ -296|0,b,c);i=d;return}function mVa(a,b,c){a=a|0;b=b|0;c=c|0;return}function nVa(a,b,c){a=a|0;b=b|0;c=c|0;return}function oVa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+80|0;f=e+48|0;g=e+24|0;h=e;if((uZa(c[a+56>>2]|0,8192)|0)!=0){j=a+272|0;k=c[j>>2]|0;l=c[(c[k>>2]|0)+296>>2]|0;cVa(g,k,d);cVa(h,c[j>>2]|0,b);bVa(f,g,h);Ic[l&511](k,f)}f=c[a+284>>2]|0;if((f|0)==0){i=e;return}ld[c[(c[f>>2]|0)+28>>2]&255](f,b,d);i=e;return}function pVa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;oVa(a+ -296|0,b,c);i=d;return}function qVa(a,b){a=a|0;b=b|0;var d=0;b=i;d=c[a+284>>2]|0;if((d|0)==0){i=b;return}Ic[c[(c[d>>2]|0)+36>>2]&511](d,a);i=b;return}function rVa(a,b){a=a|0;b=b|0;b=i;qVa(a+ -296|0,0);i=b;return}function sVa(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;i=i+112|0;g=f+24|0;h=f+12|0;j=f;c[a+0>>2]=-1;c[a+4>>2]=-1;c[a+8>>2]=-1;c[a+12>>2]=-1;c[a+16>>2]=-1;c[a+20>>2]=-1;k=Lc[c[(c[d>>2]|0)+16>>2]&255](d)|0;if((k|0)==0){i=f;return}Um(g);c[h+0>>2]=c[e+0>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];c[j+0>>2]=c[e+0>>2];c[j+4>>2]=c[e+4>>2];c[j+8>>2]=c[e+8>>2];Ic[c[(c[k>>2]|0)+48>>2]&511](k,e);a:do{if((Lc[c[(c[k>>2]|0)+8>>2]&255](k)|0)==0){l=g}else{while(1){if((dd[c[(c[k>>2]|0)+32>>2]&511](k,g)|0)==0){l=g;break a}d=b[g>>1]|0;if(!(d<<16>>16==45|(d+ -65<<16>>16&65535)<26|(d+ -97<<16>>16&65535)<26|(d+ -192<<16>>16&65535)<496)){l=g;break a}d=Lc[c[(c[k>>2]|0)+52>>2]&255](k)|0;c[j+0>>2]=c[d+0>>2];c[j+4>>2]=c[d+4>>2];c[j+8>>2]=c[d+8>>2];if((Lc[c[(c[k>>2]|0)+8>>2]&255](k)|0)==0){l=g;break}}}}while(0);Ic[c[(c[k>>2]|0)+48>>2]&511](k,e);do{if((dd[c[(c[k>>2]|0)+32>>2]&511](k,g)|0)==0){m=10;break}e=b[l>>1]|0;if(!(e<<16>>16==45|(e+ -65<<16>>16&65535)<26|(e+ -97<<16>>16&65535)<26|(e+ -192<<16>>16&65535)<496)){m=10;break}}while((Lc[c[(c[k>>2]|0)+20>>2]&255](k)|0)!=0);if((m|0)==10){m=Lc[c[(c[k>>2]|0)+52>>2]&255](k)|0;c[h+0>>2]=c[m+0>>2];c[h+4>>2]=c[m+4>>2];c[h+8>>2]=c[m+8>>2]}c[a+0>>2]=c[h+0>>2];c[a+4>>2]=c[h+4>>2];c[a+8>>2]=c[h+8>>2];h=a+12|0;c[h+0>>2]=c[j+0>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];nt(a);i=f;return}function tVa(a){a=a|0;var b=0,d=0,e=0;b=i;nZa(a);c[a>>2]=1289864;c[a+268>>2]=1290176;d=a+272|0;e=a+288|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[e>>2]=1;c[a+292>>2]=0;c[d>>2]=Hpa()|0;i=b;return}function uVa(a){a=a|0;var b=0;b=i;vVa(a);$1a(a);i=b;return}function vVa(a){a=a|0;var b=0;b=i;c[a>>2]=1289864;c[a+268>>2]=1290176;Ipa(c[a+272>>2]|0);pZa(a);i=b;return}function wVa(a,b){a=a|0;b=b|0;c[b+164>>2]=3;return}function xVa(a){a=a|0;var b=0,d=0,e=0,f=0,h=0;b=i;i=i+192|0;d=b;e=c[(c[a>>2]|0)+144>>2]|0;m_a(d,a);Gc[e&15](a,+g[d+136>>2]);d=a+272|0;e=c[d>>2]|0;f=c[c[e>>2]>>2]|0;h=b$a(c[a+44>>2]|0)|0;Ic[f&511](e,h);h=c[d>>2]|0;Ic[c[(c[h>>2]|0)+8>>2]&511](h,a+268|0);a=c[d>>2]|0;Rc[c[(c[a>>2]|0)+28>>2]&1023](a);i=b;return}function yVa(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;b=i;i=i+48|0;c=b+16|0;d=b+8|0;e=b;f$a(c,a);g[d>>2]=0.0;a=d+4|0;g[a>>2]=1.0;g[e>>2]=1.0;f=e+4|0;g[f>>2]=1.0;fma(c,d,a);fma(c,e,f);i=b;return+g[f>>2]==+g[a>>2]|0}function zVa(a){a=a|0;var b=0,d=0,e=0;b=i;if((sZa(c[a+252>>2]|0)|0)==0){i=b;return}d=Lc[c[(c[a>>2]|0)+12>>2]&255](a)|0;if((d|0)==0){i=b;return}e=(yVa(a)|0)==0;a=c[(c[d>>2]|0)+36>>2]|0;if(e){Ic[a&511](d,4);i=b;return}else{Ic[a&511](d,3);i=b;return}}function AVa(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;i=i+16|0;d=b;e=c[a+272>>2]|0;f=c[(c[e>>2]|0)+32>>2]|0;Ic[c[(c[a>>2]|0)+152>>2]&511](d,a);ld[f&255](e,d,1);i=b;return}function BVa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0.0,n=0,o=0;h=i;i=i+16|0;j=h+8|0;k=h;l_a(a,b,d,e,f);if((d|0)==9){l=e;if((e|0)==0){i=h;return}CVa(a,c[l>>2]|0,l+4|0,l+12|0);i=h;return}else if((d|0)==4){if((e|0)!=1){i=h;return}m=+g[f>>2];l=c[a+272>>2]|0;n=c[l>>2]|0;o=c[n+36>>2]|0;Ic[c[n+192>>2]&511](k,l);g[j>>2]=+g[k>>2];g[j+4>>2]=m;Ic[o&511](l,j);i=h;return}else if((d|0)==3){if((e|0)!=1){i=h;return}j=q_a(a)|0;if((j|0)==0){i=h;return}Fc[c[(c[j>>2]|0)+88>>2]&63](j,b,3,1,f);i=h;return}else if((d|0)==2){if((e|0)!=1){i=h;return}e=q_a(a)|0;if((e|0)==0){i=h;return}Fc[c[(c[e>>2]|0)+88>>2]&63](e,b,2,1,f);i=h;return}else{i=h;return}}function CVa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;g=a+276|0;if((c[g>>2]|0)==0){i=f;return}if((W_a(a)|0)!=0?(h=c[a+272>>2]|0,(Lc[c[(c[h>>2]|0)+188>>2]&255](h)|0)==0):0){j=b}else{j=0}M$a(c[g>>2]|0,j,d,e);i=f;return}function DVa(a,b){a=a|0;b=b|0;var d=0;d=i;if((Q_a(c[a+56>>2]|0)|0)!=0){i=d;return}EVa(a,b);i=d;return}function EVa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+208|0;e=d;f=d+16|0;g=a+276|0;if((c[g>>2]|0)!=0){i=d;return}h=Z1a(312)|0;D$a(h);c[g>>2]=h;Ic[c[(c[a>>2]|0)+152>>2]&511](e,a);j=h+296|0;c[j+0>>2]=c[e+0>>2];c[j+4>>2]=c[e+4>>2];c[j+8>>2]=c[e+8>>2];c[j+12>>2]=c[e+12>>2];c3a(f|0,b|0,192)|0;c[f+156>>2]=a;c[f+32>>2]=-2145386496;c[f+68>>2]=0;c[f+64>>2]=0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;rZa(c[g>>2]|0,f);i=d;return}function FVa(a,b){a=a|0;b=+b;var d=0,e=0;d=i;e=c[a+272>>2]|0;Oc[c[(c[e>>2]|0)+88>>2]&3](e,b,1);i=d;return}function GVa(a){a=a|0;var b=0,d=0,e=0.0;b=i;d=c[a+272>>2]|0;e=+Vc[c[(c[d>>2]|0)+340>>2]&15](d);i=b;return+e}function HVa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;if((c[a+280>>2]|0)!=0){f=1;i=e;return f|0}g=TZa(a,b,d)|0;switch(b&65535|0){case 122:case 97:case 120:case 118:case 99:case 90:case 65:case 88:case 86:case 67:case 45:case 35:case 36:case 39:case 37:case 40:case 38:case 46:{break};default:{f=0;i=e;return f|0}}if(b<<16>>16==46){h=c[a+272>>2]|0;j=(Lc[c[(c[h>>2]|0)+188>>2]&255](h)|0)==0;k=j?46:0}else{k=b}do{switch(k&65535|0){case 46:{IVa(a);f=1;i=e;return f|0};case 45:{if((p$a(a,d)|0)==0){f=1;i=e;return f|0}Rc[c[(c[a>>2]|0)+248>>2]&1023](a);f=1;i=e;return f|0};case 36:{b=c[a+272>>2]|0;j=c[(c[b>>2]|0)+240>>2]|0;h=p$a(a,d)|0;l=o$a(a,d)|0;ld[j&255](b,h,l);f=1;i=e;return f|0};case 40:{l=c[a+272>>2]|0;h=c[(c[l>>2]|0)+228>>2]|0;b=p$a(a,d)|0;ld[h&255](l,b,0);f=1;i=e;return f|0};case 38:{b=c[a+272>>2]|0;l=c[(c[b>>2]|0)+224>>2]|0;h=p$a(a,d)|0;ld[l&255](b,h,0);f=1;i=e;return f|0};case 35:{h=c[a+272>>2]|0;b=c[(c[h>>2]|0)+244>>2]|0;l=p$a(a,d)|0;j=o$a(a,d)|0;ld[b&255](h,l,j);f=1;i=e;return f|0};case 39:{j=c[a+272>>2]|0;l=c[(c[j>>2]|0)+236>>2]|0;h=p$a(a,d)|0;ld[l&255](j,h,0);f=1;i=e;return f|0};case 0:{if((p$a(a,d)|0)==0){JVa(a);f=1;i=e;return f|0}else{Rc[c[(c[a>>2]|0)+252>>2]&1023](a);f=1;i=e;return f|0}break};case 37:{h=c[a+272>>2]|0;j=c[(c[h>>2]|0)+232>>2]|0;l=p$a(a,d)|0;ld[j&255](h,l,0);f=1;i=e;return f|0};default:{f=g;i=e;return f|0}}}while(0);return 0}function IVa(a){a=a|0;var b=0,d=0;b=i;if((Q_a(c[a+56>>2]|0)|0)!=0){i=b;return}d=c[a+272>>2]|0;Lc[c[(c[d>>2]|0)+268>>2]&255](d)|0;i=b;return}function JVa(a){a=a|0;var b=0,d=0;b=i;if((Q_a(c[a+56>>2]|0)|0)!=0){i=b;return}d=c[a+272>>2]|0;Lc[c[(c[d>>2]|0)+272>>2]&255](d)|0;i=b;return}function KVa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;if((c[a+280>>2]|0)!=0){f=1;i=e;return f|0}XZa(a,b,d)|0;g=b&65535;if((g|0)==27|(g|0)==10){f=0;i=e;return f|0}h=o$a(a,d)|0;j=q$a(a,d)|0;k=p$a(a,d)|0;a:do{if((h|0)!=0&(j|0)==0){switch(g|0){case 26:{if((k|0)==0){NVa(a);f=1;i=e;return f|0}else{MVa(a);f=1;i=e;return f|0}break};case 22:{Rc[c[(c[a>>2]|0)+248>>2]&1023](a);f=1;i=e;return f|0};case 3:{Rc[c[(c[a>>2]|0)+244>>2]&1023](a);f=1;i=e;return f|0};case 1:{l=c[a+272>>2]|0;Rc[c[(c[l>>2]|0)+164>>2]&1023](l);f=1;i=e;return f|0};case 24:{Rc[c[(c[a>>2]|0)+252>>2]&1023](a);f=1;i=e;return f|0};default:{if((b&65535)<32){f=0}else{break a}i=e;return f|0}}}}while(0);if((Q_a(c[a+56>>2]|0)|0)!=0){f=1;i=e;return f|0}k=c[a+272>>2]|0;g=(Lc[c[(c[k>>2]|0)+188>>2]&255](k)|0)!=0&b<<16>>16==8;k=g?0:b;JVa(a);b=k&65535;if((b|0)==8){OVa(a);f=1;i=e;return f|0}else if((b|0)==13){Rc[c[(c[a>>2]|0)+264>>2]&1023](a);f=1;i=e;return f|0}else if((b|0)==0){f=1;i=e;return f|0}else{if((r$a(a,d)|0)!=0){IVa(a)}d=c[a+288>>2]|0;ld[c[(c[a>>2]|0)+260>>2]&255](a,k,(d|0)<0?1:d);f=1;i=e;return f|0}return 0}function LVa(a){a=a|0;var b=0;b=i;Rc[c[(c[a>>2]|0)+164>>2]&1023](a);i=b;return}function MVa(a){a=a|0;var b=0,d=0;b=i;if((iWa(a)|0)==0){i=b;return}d=c[a+272>>2]|0;Lc[c[(c[d>>2]|0)+276>>2]&255](d)|0;i=b;return}function NVa(a){a=a|0;var b=0,d=0;b=i;if((hWa(a)|0)==0){i=b;return}d=c[a+272>>2]|0;Lc[c[(c[d>>2]|0)+280>>2]&255](d)|0;i=b;return}function OVa(a){a=a|0;var b=0,d=0;b=i;if((Q_a(c[a+56>>2]|0)|0)!=0){i=b;return}d=c[a+272>>2]|0;Lc[c[(c[d>>2]|0)+264>>2]&255](d)|0;i=b;return}function PVa(a){a=a|0;return((a|0)<0?1:a)|0}function QVa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;$Za(a,b,d)|0;if((N_a(a,b)|0)==0){i=e;return 1}f=a+280|0;if((c[f>>2]|0)!=0){Ic[c[(c[a>>2]|0)+20>>2]&511](a,0)}c[f>>2]=1;C_a(a);f=c[a+272>>2]|0;g=c[(c[f>>2]|0)+216>>2]|0;h=p$a(a,d)|0;j=o$a(a,d)|0;pd[g&127](f,b,h,j);i=e;return 1}function RVa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;a_a(a,b,d)|0;d=a+280|0;if((c[d>>2]|0)==0){i=e;return 1}if((N_a(a,b)|0)!=0?(W_a(a)|0)==0:0){Rc[c[(c[a>>2]|0)+80>>2]&1023](a)}E_a(a);c[d>>2]=0;i=e;return 1}function SVa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;h_a(a,b,d)|0;if((c[a+280>>2]|0)==0){i=e;return 1}d=c[a+272>>2]|0;pd[c[(c[d>>2]|0)+220>>2]&127](d,b,0,0);i=e;return 1}function TVa(a){a=a|0;var b=0,d=0,e=0,f=0,h=0;b=i;i=i+32|0;d=b+24|0;e=b+16|0;f=b;g[d>>2]=0.0;g[d+4>>2]=0.0;g[e>>2]=0.0;g[e+4>>2]=0.0;UVa(a,d,e);h=c[a+272>>2]|0;Ic[c[(c[h>>2]|0)+176>>2]&511](f,h);Fc[c[(c[a>>2]|0)+288>>2]&63](a,1,d,e,f);i=b;return}function UVa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0.0,n=0.0;e=i;i=i+128|0;f=e+44|0;h=e;j=a+272|0;a=c[j>>2]|0;k=Lc[c[(c[a>>2]|0)+16>>2]&255](a)|0;if((k|0)==0){i=e;return}a=c[(c[k>>2]|0)+44>>2]|0;l=c[j>>2]|0;j=Lc[c[(c[l>>2]|0)+172>>2]&255](l)|0;Ic[a&511](k,j);Um(f);j=h+24|0;c[h+0>>2]=-1;c[h+4>>2]=-1;c[h+8>>2]=-1;c[h+12>>2]=-1;c[h+16>>2]=-1;c[h+20>>2]=-1;c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;if((dd[c[(c[k>>2]|0)+32>>2]&511](k,f)|0)!=0){m=+g[f+20>>2]+ +g[f+36>>2];g[b>>2]=m;n=+g[f+24>>2];g[b+4>>2]=n+ +g[f+28>>2];g[d>>2]=m;g[d+4>>2]=n+ +g[f+32>>2];i=e;return}if((dd[c[(c[k>>2]|0)+36>>2]&511](k,h)|0)==0){i=e;return}n=+g[j>>2];g[b>>2]=n;m=+g[h+28>>2];g[b+4>>2]=m+ +g[h+36>>2];g[d>>2]=n;g[d+4>>2]=m+ +g[h+40>>2];i=e;return}function VVa(a){a=a|0;var b=0,d=0;b=i;d=c[a+272>>2]|0;a=Lc[c[(c[d>>2]|0)+376>>2]&255](d)|0;i=b;return a|0}function WVa(a,b){a=a|0;b=b|0;var d=0;d=i;Ic[c[(c[b>>2]|0)+184>>2]&511](a,b);i=d;return}function XVa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;ld[c[(c[a>>2]|0)+156>>2]&255](a,b,d);i=e;return}function YVa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;ld[c[(c[a>>2]|0)+160>>2]&255](a,b,d);i=e;return}function ZVa(a,b){a=a|0;b=b|0;var d=0;d=i;if((a|0)==0){i=d;return}Ic[c[(c[a>>2]|0)+36>>2]&511](a,b);i=d;return}function _Va(a,b){a=a|0;b=b|0;var d=0;d=i;if((b|0)==0){g[a>>2]=0.0;g[a+4>>2]=0.0;i=d;return}else{Ic[c[(c[b>>2]|0)+192>>2]&511](a,b);i=d;return}}function $Va(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[a+272>>2]|0;Fc[c[(c[e>>2]|0)+248>>2]&63](e,b,1,0,0);i=d;return}function aWa(a){a=a|0;return}function bWa(a){a=a|0;return}function cWa(a){a=a|0;return}function dWa(a,b){a=a|0;b=b|0;return}function eWa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((Q_a(c[a+56>>2]|0)|0)!=0){i=d;return}e=c[a+272>>2]|0;ed[c[(c[e>>2]|0)+260>>2]&127](e,b,1,0,0)|0;i=d;return}function fWa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;if((Q_a(c[a+56>>2]|0)|0)!=0){i=e;return}f=c[a+272>>2]|0;id[c[(c[f>>2]|0)+252>>2]&511](f,b,d,0)|0;i=e;return}function gWa(a){a=a|0;var b=0,d=0;b=i;if((Q_a(c[a+56>>2]|0)|0)!=0){i=b;return}d=c[a+272>>2]|0;Qc[c[(c[d>>2]|0)+256>>2]&255](d,0,0)|0;i=b;return}function hWa(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((Q_a(c[a+56>>2]|0)|0)!=0){d=0;e=d&1;i=b;return e|0}f=c[a+272>>2]|0;d=(Lc[c[(c[f>>2]|0)+368>>2]&255](f)|0)!=0;e=d&1;i=b;return e|0}function iWa(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((Q_a(c[a+56>>2]|0)|0)!=0){d=0;e=d&1;i=b;return e|0}f=c[a+272>>2]|0;d=(Lc[c[(c[f>>2]|0)+372>>2]&255](f)|0)!=0;e=d&1;i=b;return e|0}function jWa(a,b,d,e,f,h,j){a=a|0;b=+b;d=+d;e=+e;f=+f;h=+h;j=+j;var k=0,l=0,m=0,n=0,o=0;k=i;i=i+32|0;l=k;c[l>>2]=0;m=l+8|0;g[m>>2]=d-b;g[l>>2]=e;n=l+4|0;g[n>>2]=f;g[l+16>>2]=h;g[l+12>>2]=j;Fc[c[(c[a>>2]|0)+88>>2]&63](a,a,2,1,l);j=+g[m>>2];h=+g[n>>2]- +g[l>>2];f=j-h;if(!(j>h?!(f<1.0e-4&f>-1.0e-4):0)){o=3}if((o|0)==3?!(f<1.0e-4&f>-1.0e-4):0){Ic[c[(c[a>>2]|0)+256>>2]&511](a,1);i=k;return}Ic[c[(c[a>>2]|0)+256>>2]&511](a,0);i=k;return}function kWa(a,b,c,d,e,f,g){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;g=+g;var h=0;h=i;jWa(a+ -268|0,b,c,d,e,f,g);i=h;return}function lWa(a,b){a=a|0;b=+b;var d=0,e=0;d=i;i=i+16|0;e=d;g[e>>2]=b;Fc[c[(c[a>>2]|0)+88>>2]&63](a,a,3,1,e);i=d;return}function mWa(a,b){a=a|0;b=+b;var c=0;c=i;lWa(a+ -268|0,b);i=c;return}function nWa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;f=i;i=i+32|0;g=f;c[g>>2]=b;b=d;d=c[b+4>>2]|0;h=g+4|0;c[h>>2]=c[b>>2];c[h+4>>2]=d;d=e;e=c[d+4>>2]|0;h=g+12|0;c[h>>2]=c[d>>2];c[h+4>>2]=e;Fc[c[(c[a>>2]|0)+88>>2]&63](a,a,9,g,0);i=f;return}function oWa(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;e=i;nWa(a+ -268|0,b,c,d,0);i=e;return}function pWa(a,b,c){a=a|0;b=b|0;c=c|0;return}function qWa(a,b,c){a=a|0;b=b|0;c=c|0;return}function rWa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((sZa(c[a+252>>2]|0)|0)==0){i=d;return}e=c[a+284>>2]|0;if((e|0)==0){i=d;return}Ic[c[(c[e>>2]|0)+4>>2]&511](e,b);i=d;return}function sWa(a,b){a=a|0;b=b|0;var c=0;c=i;rWa(a+ -268|0,b);i=c;return}function tWa(a,b){a=a|0;b=b|0;var d=0;d=i;Ic[c[(c[a>>2]|0)+20>>2]&511](a,b);i=d;return}function uWa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+ -268|0;Ic[c[(c[e>>2]|0)+20>>2]&511](e,b);i=d;return}function vWa(a){a=a|0;var b=0,d=0;b=i;d=a+280|0;if((c[d>>2]|0)==0){i=b;return}E_a(a);c[d>>2]=0;i=b;return}function wWa(a,b){a=a|0;b=b|0;var d=0;d=i;c[a>>2]=1290216;Ija(a+4|0,4);Ija(a+20|0,4);c[a+36>>2]=0;c[a+40>>2]=b;i=d;return}function xWa(a){a=a|0;var b=0;b=i;yWa(a);$1a(a);i=b;return}function yWa(a){a=a|0;var b=0,d=0,e=0;b=i;c[a>>2]=1290216;d=a+36|0;e=c[d>>2]|0;if((e|0)!=0){OG(e);v2a(e);c[d>>2]=0}zWa(a);Jja(c[a+20>>2]|0);Jja(c[a+4>>2]|0);i=b;return}function zWa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=a+4|0;e=c[a+8>>2]|0;if((e|0)>0){f=0;do{g=CWa(d,f)|0;if((g|0)!=0){dka(g+8|0);$1a(g)}f=f+1|0}while((f|0)<(e|0))}Kja(d,0)|0;d=a+20|0;e=c[a+24>>2]|0;if((e|0)>0){h=0}else{Kja(d,0)|0;i=b;return}do{a=KWa(d,h)|0;if((a|0)!=0){dka(a+4|0);$1a(a)}h=h+1|0}while((h|0)<(e|0));Kja(d,0)|0;i=b;return}function AWa(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+36|0;a=c[d>>2]|0;if((a|0)!=0){e=a;i=b;return e|0}if((xt()|0)==0){e=0;i=b;return e|0}a=u2a(104)|0;fu(a);c[d>>2]=a;gu(a);e=c[d>>2]|0;i=b;return e|0}function BWa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;if(((b|0)>-1?(c[a+8>>2]|0)>(b|0):0)?(e=CWa(a+4|0,b)|0,(e|0)!=0):0){f=c[e>>2]|0}else{f=0}i=d;return f|0}function CWa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)>=0?(c[a+4>>2]|0)>(b|0):0){e=c[(c[a>>2]|0)+(b<<2)>>2]|0;i=d;return e|0}b=c[0]|0;da();e=b;i=d;return e|0}function DWa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;if(((d|0)>-1?(c[b+8>>2]|0)>(d|0):0)?(f=CWa(b+4|0,d)|0,(f|0)!=0):0){hka(a,f+8|0);i=e;return}eka(a,1305928,-1);i=e;return}function EWa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;if(((b|0)>-1?(c[a+8>>2]|0)>(b|0):0)?(CWa(a+4|0,b)|0)!=0:0){f=(Qc[c[(c[a>>2]|0)+12>>2]&255](a,b,d)|0)>>>31^1}else{f=0}i=e;return f|0}function FWa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;g=f+4|0;h=f;do{if((e|0)>0){if((EWa(a,e,b)|0)!=0){j=e;i=f;return j|0}}else{k=GWa(a)|0;if((k|0)!=0){if((d|0)!=1?(l=c[k+4>>2]|0,!((l|0)==2|(l|0)==(d|0))):0){break}if((EWa(a,0,b)|0)!=0){j=0;i=f;return j|0}}}}while(0);IWa(g,a,d);e=HWa(a,g,d,1)|0;dka(g);if((e|0)>-1?(EWa(a,e,b)|0)!=0:0){j=e;i=f;return j|0}eka(h,1290264,-1);e=HWa(a,h,1,0)|0;dka(h);if((e|0)>-1?(EWa(a,e,b)|0)!=0:0){j=e;i=f;return j|0}j=-1;i=f;return j|0}function GWa(a){a=a|0;var b=0,d=0;b=i;if((c[a+8>>2]|0)<=0){d=0;i=b;return d|0}d=CWa(a+4|0,0)|0;i=b;return d|0}function HWa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;i=i+16|0;g=f+12|0;h=f+8|0;j=f+4|0;k=f;QWa(g,b,d);l=PWa(a,g,d)|0;dka(g);if((l|0)>-1){m=l;i=f;return m|0}c[h>>2]=0;if((e|0)!=0?(e=Qc[c[(c[a>>2]|0)+32>>2]&255](a,h,d)|0,(e|0)!=0):0){n=e}else{hka(j,b);b=RWa(a,Lc[c[(c[a>>2]|0)+40>>2]&255](a)|0,j,d&255)|0;QWa(k,j,d);ika(h,k);dka(k);dka(j);n=b}ld[c[(c[a>>2]|0)+36>>2]&255](a,n,h);b=SWa(a,n,h,d)|0;dka(h);m=b;i=f;return m|0}function IWa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+16|0;f=e;g=b+20|0;h=c[b+24>>2]|0;a:do{if((h|0)>0){j=0;while(1){k=KWa(g,j)|0;if((k|0)!=0?(c[k>>2]|0)==(d|0):0){break}j=j+1|0;if((j|0)>=(h|0)){break a}}hka(a,k+4|0);i=e;return}}while(0);LWa(f,b,d);b=c[f>>2]|0;if((b|0)!=0?(c[b+4>>2]|0)!=0:0){b=Z1a(8)|0;k=b+4|0;c[k>>2]=0;c[b>>2]=d;ika(k,f);MWa(g,b)}hka(a,f);dka(f);i=e;return}function JWa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=CWa(a+4|0,b)|0;if((f|0)==0){g=-1;i=e;return g|0}b=c[f>>2]|0;if((b|0)==0){g=-1;i=e;return g|0}if((Lc[c[(c[b>>2]|0)+12>>2]&255](b)|0)==0){i=e;return((d&65535)<255?d&65535:-1)|0}b=Bu(c[f>>2]|0,d&65535)|0;d=c[f>>2]|0;Qc[c[(c[d>>2]|0)+32>>2]&255](d,b,0)|0;g=b;i=e;return g|0}function KWa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)>=0?(c[a+4>>2]|0)>(b|0):0){e=c[(c[a>>2]|0)+(b<<2)>>2]|0;i=d;return e|0}b=c[0]|0;da();e=b;i=d;return e|0}function LWa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+16|0;f=e+8|0;g=e+4|0;h=e;c[a>>2]=0;j=(d|0)==1?0:d;WWa(f,j);ika(a,f);dka(f);f=b+40|0;b=c[f>>2]|0;if((b|0)==0){i=e;return}d=c[(c[b>>2]|0)+64>>2]|0;hka(g,a);k=Qc[d&255](b,j,g)|0;dka(g);if((k|0)!=0){i=e;return}k=c[f>>2]|0;ld[c[(c[k>>2]|0)+60>>2]&255](h,k,j);ika(a,h);dka(h);i=e;return}function MWa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+4|0;f=c[e>>2]|0;g=f+1|0;do{if((f|0)>=(c[a+8>>2]|0)){if((Kja(a,g)|0)==0){i=d;return}else{h=c[e>>2]|0;break}}else{c[e>>2]=g;h=g}}while(0);c[(c[a>>2]|0)+(h+ -1<<2)>>2]=b;i=d;return}function NWa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;eka(e,b,-1);b=c[e>>2]|0;if(!((b|0)!=0?(c[b+4>>2]|0)!=0:0)){mka(e,1290288)}HWa(a,e,0,0)|0;dka(e);i=d;return}function OWa(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=0;while(1){if(ah(a,c[1290528+(d<<2)>>2]|0)|0){e=1;f=4;break}d=d+1|0;if((d|0)>=14){e=0;f=4;break}}if((f|0)==4){i=b;return e|0}return 0}function PWa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;f=a+4|0;g=c[a+8>>2]|0;if((g|0)<=0){h=-1;i=e;return h|0}a=(d|0)==1;j=0;a:while(1){k=CWa(f,j)|0;do{if((k|0)!=0){if(!a?(c[k+4>>2]|0)!=(d|0):0){break}if(gl(c[b>>2]|0)|0){h=j;l=9;break a}if(wka(c[k+8>>2]|0,b)|0){h=j;l=9;break a}}}while(0);j=j+1|0;if((j|0)>=(g|0)){h=-1;l=9;break}}if((l|0)==9){i=e;return h|0}return 0}function QWa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e;g=e+8|0;h=e+4|0;c[g>>2]=0;c[f>>2]=d;Jka(g,1290584,f);ZWa(h,b);ag(a,h,g);dka(h);dka(g);i=e;return}function RWa(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=i;if((OWa(c)|0)==0){f=YWa(a,b,c,d)|0;i=e;return f|0}else{f=XWa(b,c)|0;i=e;return f|0}return 0}function SWa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;g=Z1a(12)|0;h=g+8|0;c[h>>2]=0;c[g>>2]=b;ika(h,d);c[g+4>>2]=e;UWa(a+4|0,g);i=f;return(c[a+8>>2]|0)+ -1|0}function TWa(a,b,c){a=a|0;b=b|0;c=c|0;return 0}function UWa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+4|0;f=c[e>>2]|0;g=f+1|0;do{if((f|0)>=(c[a+8>>2]|0)){if((Kja(a,g)|0)==0){i=d;return}else{h=c[e>>2]|0;break}}else{c[e>>2]=g;h=g}}while(0);c[(c[a>>2]|0)+(h+ -1<<2)>>2]=b;i=d;return}function VWa(a,b,c){a=a|0;b=b|0;c=c|0;return}function WWa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=0;while(1){f=e+1|0;if((c[1290640+(e<<3)>>2]|0)==(b|0)){g=4;break}if((f|0)==8){g=5;break}else{e=f}}if((g|0)==4){eka(a,c[1290644+(e<<3)>>2]|0,-1);i=d;return}else if((g|0)==5){eka(a,1305928,-1);i=d;return}}function XWa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+1024|0;e=d;if((a|0)==0){f=0;i=d;return f|0}if(ah(b,1290512)|0){g=c[b>>2]|0;f=ju(a,(g|0)==0?1305928:g+12|0,0)|0;i=d;return f|0}else{jv(e,1);g=c[b>>2]|0;f=ju(a,(g|0)==0?1305928:g+12|0,e)|0;i=d;return f|0}return 0}function YWa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;i=i+16|0;g=f+4|0;h=f;if((b|0)==0){j=0;i=f;return j|0}if(gl(c[d>>2]|0)|0){LWa(g,a,e&255);ika(d,g);dka(g)}g=c[a+40>>2]|0;if((g|0)==0){j=0;i=f;return j|0}a=c[(c[g>>2]|0)+68>>2]|0;hka(h,d);d=id[a&511](g,b,h,e<<24>>24==1?0:e)|0;dka(h);j=d;i=f;return j|0}function ZWa(a,b){a=a|0;b=b|0;var c=0;c=i;hka(a,b);Tka(a,32);i=c;return}function _Wa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=a+40|0;a=c[f>>2]|0;if((a|0)!=0?!((Lc[c[(c[a>>2]|0)+100>>2]&255](a)|0)==-1):0){a=c[f>>2]|0;g=Lc[c[(c[a>>2]|0)+100>>2]&255](a)|0;i=e;return g|0}if((b&65535)<127){g=0;i=e;return g|0}if((d|0)!=1){g=d;i=e;return g|0}if((b+ -19968<<16>>16&65535)<20902|(b+6201<<16>>16&65535)<45|(b+ -12288<<16>>16&65535)<64|(b+ -8192<<16>>16&65535)<112){g=134;i=e;return g|0}if((b+ -12352<<16>>16&65535)<96|(b+ -12448<<16>>16&65535)<96|(b+ -12784<<16>>16&65535)<16|(b+256<<16>>16&65535)<240){g=128;i=e;return g|0}if((b+21504<<16>>16&65535)<11184|(b+ -4352<<16>>16&65535)<256|(b+ -12592<<16>>16&65535)<96){g=129;i=e;return g|0}if((b+ -3584<<16>>16&65535)<128){g=222;i=e;return g|0}if((b+ -880<<16>>16&65535)<144|(b+ -7936<<16>>16&65535)<256){g=161;i=e;return g|0}if((b+ -1536<<16>>16&65535)<256|(b+1200<<16>>16&65535)<941){g=178;i=e;return g|0}if((b+ -1424<<16>>16&65535)<112){g=177;i=e;return g|0}if((b+ -1024<<16>>16&65535)<256){g=204;i=e;return g|0}if((b+ -256<<16>>16&65535)<336){g=238;i=e;return g|0}else{i=e;return((b+ -7680<<16>>16&65535)<256?163:0)|0}return 0}function $Wa(a){a=a|0;var b=0;b=i;$1a(a);i=b;return}function aXa(a){a=a|0;return}function bXa(a,b,d,e,f,h,j){a=a|0;b=+b;d=+d;e=+e;f=+f;h=+h;j=+j;var k=0,l=0,m=0,n=0,o=0,p=0;k=i;i=i+32|0;l=k;c[l>>2]=0;m=l+8|0;g[m>>2]=d-b;g[l>>2]=e;n=l+4|0;g[n>>2]=f;g[l+16>>2]=h;g[l+12>>2]=j;o=a+4|0;a=c[o>>2]|0;Fc[c[(c[a>>2]|0)+88>>2]&63](a,a,2,1,l);a=q_a(c[o>>2]|0)|0;if((a|0)==0){i=k;return}j=+g[m>>2];h=+g[n>>2]- +g[l>>2];f=j-h;if(!(j>h?!(f<1.0e-4&f>-1.0e-4):0)){p=4}if((p|0)==4?!(f<1.0e-4&f>-1.0e-4):0){if((c[a+256>>2]|0)!=0){i=k;return}Ic[c[(c[a>>2]|0)+100>>2]&511](a,1);p=c[o>>2]|0;Rc[c[(c[p>>2]|0)+192>>2]&1023](p);i=k;return}if((c[a+256>>2]|0)==0){i=k;return}Ic[c[(c[a>>2]|0)+100>>2]&511](a,0);a=c[o>>2]|0;Rc[c[(c[a>>2]|0)+192>>2]&1023](a);i=k;return}function cXa(a,b){a=a|0;b=+b;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;g[e>>2]=b;f=c[a+4>>2]|0;Fc[c[(c[f>>2]|0)+88>>2]&63](f,f,3,1,e);i=d;return}function dXa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[a+4>>2]|0;Ic[c[(c[e>>2]|0)+20>>2]&511](e,b);i=d;return}function eXa(a){a=a|0;var b=0,d=0;b=i;nZa(a);c[a>>2]=1290760;d=a+268|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d>>2]=Jpa()|0;i=b;return}function fXa(a){a=a|0;var b=0;b=i;gXa(a);$1a(a);i=b;return}function gXa(a){a=a|0;var b=0,d=0,e=0;b=i;c[a>>2]=1290760;Kpa(c[a+268>>2]|0);d=a+272|0;e=c[d>>2]|0;if((e|0)==0){pZa(a);i=b;return}Rc[c[(c[e>>2]|0)+24>>2]&1023](e);c[d>>2]=0;pZa(a);i=b;return}function hXa(a,b){a=a|0;b=b|0;b=i;eka(a,1291008,-1);i=b;return}function iXa(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0;b=i;i=i+192|0;d=b;e=a+268|0;f=c[e>>2]|0;if((f|0)==0){i=b;return}h=a+272|0;j=c[h>>2]|0;if((j|0)==0){k=f}else{Rc[c[(c[j>>2]|0)+24>>2]&1023](j);k=c[e>>2]|0}j=c[c[k>>2]>>2]|0;f=b$a(c[a+44>>2]|0)|0;Ic[j&511](k,f);f=c[e>>2]|0;k=c[(c[f>>2]|0)+4>>2]|0;j=Z1a(8)|0;c[j>>2]=1290720;c[j+4>>2]=a;c[h>>2]=j;Ic[k&511](f,j);j=a+56|0;f=c[j>>2]|0;k=a+280|0;c[k>>2]=uZa(f,8)|0;h=c[e>>2]|0;l=c[(c[h>>2]|0)+44>>2]|0;m=uZa(f,1)|0;Ic[l&511](h,m);m=c[e>>2]|0;e=c[(c[m>>2]|0)+12>>2]|0;m_a(d,a);Gc[e&15](m,+g[d+136>>2]);c[k>>2]=uZa(c[j>>2]|0,8)|0;i=b;return}function jXa(a){a=a|0;var b=0,d=0;b=i;d=a+272|0;a=c[d>>2]|0;if((a|0)==0){i=b;return}Rc[c[(c[a>>2]|0)+24>>2]&1023](a);c[d>>2]=0;i=b;return}function kXa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0.0,la=0.0,ma=0,na=0,oa=0;d=i;i=i+336|0;e=d+312|0;f=d+296|0;h=d+280|0;j=d+272|0;k=d+264|0;l=d+256|0;m=d+236|0;n=d+232|0;o=d+224|0;p=d+216|0;q=d+208|0;r=d+188|0;s=d+184|0;t=d+176|0;u=d+168|0;v=d+160|0;w=d+152|0;x=d+144|0;y=d+136|0;z=d+116|0;A=d+112|0;B=d+104|0;C=d+96|0;D=d+80|0;E=d+64|0;F=d+56|0;G=d+48|0;H=d+40|0;I=d+32|0;J=d+24|0;K=d+16|0;L=d+8|0;M=d;EZa(a,b);gla(e);N=a+268|0;O=c[N>>2]|0;if((O|0)!=0?(Ic[c[(c[O>>2]|0)+16>>2]&511](f,O),O=c[N>>2]|0,P=Lc[c[(c[O>>2]|0)+32>>2]&255](O)|0,(P|0)>0):0){O=h+8|0;Q=f+12|0;R=h+12|0;S=f+8|0;f=j+4|0;T=m+4|0;U=m+8|0;V=m+12|0;W=m+16|0;X=r+4|0;Y=r+8|0;Z=r+12|0;_=r+16|0;$=w+4|0;aa=x+4|0;ba=B+4|0;ca=C+4|0;da=k+4|0;ea=o+4|0;fa=p+4|0;ga=t+4|0;ha=u+4|0;ia=0;do{ja=c[N>>2]|0;ld[c[(c[ja>>2]|0)+68>>2]&255](h,ja,ia);ka=+g[O>>2];do{if(!(ka>+g[Q>>2])?(la=+g[R>>2],!(la<+g[S>>2])):0){g[j>>2]=+g[h>>2];g[f>>2]=(ka+la)*.5;ja=c[N>>2]|0;if((dd[c[(c[ja>>2]|0)+36>>2]&511](ja,ia)|0)==0){ja=c[N>>2]|0;yYa(v,dd[c[(c[ja>>2]|0)+28>>2]&511](ja,ia)|0,j,0,1,0);ja=c[v>>2]|0;if((ja|0)!=0?(c[ja+4>>2]|0)>0:0){pe(w,1291896);ja=qla(e,c[w>>2]|0,c[$>>2]|0)|0;Ic[c[(c[a>>2]|0)+116>>2]&511](z,a);c[A>>2]=1;vYa(y,z,A);oe(x,y);ma=qla(ja,c[x>>2]|0,c[aa>>2]|0)|0;oe(B,v);ja=qla(ma,c[B>>2]|0,c[ba>>2]|0)|0;pe(C,1291904);qla(ja,c[C>>2]|0,c[ca>>2]|0)|0;dka(y)}dka(v);break}else{c[m>>2]=2;g[T>>2]=0.0;g[U>>2]=.20000000298023224;g[V>>2]=.4431372582912445;g[W>>2]=0.0;uYa(l,h,m);oe(k,l);qla(e,c[k>>2]|0,c[da>>2]|0)|0;dka(l);ja=c[N>>2]|0;yYa(n,dd[c[(c[ja>>2]|0)+28>>2]&511](ja,ia)|0,j,0,1,0);ja=c[n>>2]|0;if((ja|0)!=0?(c[ja+4>>2]|0)>0:0){pe(o,1291896);ja=qla(e,c[o>>2]|0,c[ea>>2]|0)|0;c[r>>2]=2;g[X>>2]=1.0;g[Y>>2]=1.0;g[Z>>2]=1.0;g[_>>2]=0.0;c[s>>2]=1;vYa(q,r,s);oe(p,q);ma=qla(ja,c[p>>2]|0,c[fa>>2]|0)|0;oe(t,n);ja=qla(ma,c[t>>2]|0,c[ga>>2]|0)|0;pe(u,1291904);qla(ja,c[u>>2]|0,c[ha>>2]|0)|0;dka(q)}dka(n);break}}}while(0);ia=ia+1|0}while((ia|0)<(P|0))}P=e+8|0;if((c[P>>2]|0)>0){gla(D);Ic[c[(c[a>>2]|0)+152>>2]&511](E,a);pe(F,1293864);qla(D,c[F>>2]|0,c[F+4>>2]|0)|0;F=tla(D,+g[E>>2])|0;pe(G,1305864);a=qla(F,c[G>>2]|0,c[G+4>>2]|0)|0;G=E+8|0;F=tla(a,+g[G>>2])|0;pe(H,1305864);a=qla(F,c[H>>2]|0,c[H+4>>2]|0)|0;H=tla(a,+g[E+4>>2]- +g[E>>2])|0;pe(I,1305864);a=qla(H,c[I>>2]|0,c[I+4>>2]|0)|0;I=tla(a,+g[E+12>>2]- +g[G>>2])|0;pe(J,1293240);qla(I,c[J>>2]|0,c[J+4>>2]|0)|0;J=e+4|0;I=ula(D,c[J>>2]|0,c[P>>2]|0)|0;pe(K,1293904);qla(I,c[K>>2]|0,c[K+4>>2]|0)|0;pe(L,1291024);K=qla(b,c[L>>2]|0,c[L+4>>2]|0)|0;L=D+4|0;b=ula(K,c[L>>2]|0,c[D+8>>2]|0)|0;pe(M,1291040);qla(b,c[M>>2]|0,c[M+4>>2]|0)|0;ila(c[L>>2]|0);na=J;oa=c[na>>2]|0;ila(oa);i=d;return}else{na=e+4|0;oa=c[na>>2]|0;ila(oa);i=d;return}}function lXa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0,G=0,H=0;e=i;i=i+176|0;f=e+160|0;h=e+144|0;j=e+128|0;k=e+112|0;l=e+104|0;m=e+88|0;n=e+64|0;o=e+44|0;p=e+40|0;q=e+20|0;r=e;LZa(a,b,d);s=a+268|0;t=c[s>>2]|0;if((t|0)==0){i=e;return}Ic[c[(c[t>>2]|0)+16>>2]&511](f,t);mXa(h,a);Ic[c[(c[a>>2]|0)+152>>2]&511](j,a);t=c[s>>2]|0;u=Lc[c[(c[t>>2]|0)+32>>2]&255](t)|0;if((u|0)<=0){i=e;return}t=k+8|0;v=f+12|0;w=k+12|0;x=f+8|0;f=l+4|0;y=a+288|0;z=m+4|0;A=j+4|0;B=0;do{C=c[s>>2]|0;ld[c[(c[C>>2]|0)+68>>2]&255](k,C,B);D=+g[t>>2];do{if(!(D>+g[v>>2])?(E=+g[w>>2],!(E<+g[x>>2])):0){g[l>>2]=+g[k>>2];g[f>>2]=(D+E)*.5;C=c[s>>2]|0;F=dd[c[(c[C>>2]|0)+28>>2]&511](C,B)|0;do{if((F|0)!=0){Ic[c[(c[F>>2]|0)+200>>2]&511](m,F);if(+g[z>>2]- +g[m>>2]>+g[A>>2]- +g[j>>2]){Ila(k,h);break}else{Ila(k,j);break}}}while(0);F=c[s>>2]|0;C=(dd[c[(c[F>>2]|0)+36>>2]&511](F,B)|0)==0;F=Lc[c[(c[a>>2]|0)+12>>2]&255](a)|0;if(C){C=c[s>>2]|0;G=dd[c[(c[C>>2]|0)+28>>2]&511](C,B)|0;Ic[c[(c[a>>2]|0)+116>>2]&511](q,a);C=SYa(q,255)|0;Ic[c[(c[a>>2]|0)+120>>2]&511](r,a);J1a(b,d,G,C,SYa(r,255)|0,h,l,0,F,0);break}if((F|0)!=0?(Lc[c[(c[F>>2]|0)+16>>2]&255](F)|0)!=0:0){C=c[s>>2]|0;G=dd[c[(c[C>>2]|0)+28>>2]&511](C,B)|0;Ic[c[(c[a>>2]|0)+116>>2]&511](n,a);C=SYa(n,255)|0;Ic[c[(c[a>>2]|0)+120>>2]&511](o,a);H=SYa(o,255)|0;J1a(b,d,G,C,H,h,l,0,F,c[y>>2]|0);ld[c[(c[F>>2]|0)+12>>2]&255](F,c[y>>2]|0,k);break}c[p>>2]=-16764047;TYa(b,d,k,p);H=c[s>>2]|0;C=dd[c[(c[H>>2]|0)+28>>2]&511](H,B)|0;J1a(b,d,C,-1,0,h,l,0,F,c[y>>2]|0)}}while(0);B=B+1|0}while((B|0)!=(u|0));i=e;return}function mXa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;Ic[c[(c[b>>2]|0)+148>>2]&511](e,b);f=FZa(b)|0;sYa(a,e,+((Lc[c[(c[b>>2]|0)+128>>2]&255](b)|0)+f|0));i=d;return}function nXa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+16|0;f=e;TZa(a,b,d)|0;g=c[a+268>>2]|0;if((g|0)==0){h=0;i=e;return h|0}j=b&65535;if(!((j+ -35|0)>>>0<6)){h=0;i=e;return h|0}switch(j|0){case 35:{j=c[(c[g>>2]|0)+148>>2]|0;b=p$a(a,d)|0;k=o$a(a,d)|0;ld[j&255](g,b,k);break};case 36:{k=c[(c[g>>2]|0)+144>>2]|0;b=p$a(a,d)|0;j=o$a(a,d)|0;ld[k&255](g,b,j);break};case 39:{j=c[(c[g>>2]|0)+140>>2]|0;b=p$a(a,d)|0;k=o$a(a,d)|0;ld[j&255](g,b,k);break};case 38:{k=c[(c[g>>2]|0)+128>>2]|0;b=p$a(a,d)|0;j=o$a(a,d)|0;ld[k&255](g,b,j);break};case 37:{j=c[(c[g>>2]|0)+136>>2]|0;b=p$a(a,d)|0;k=o$a(a,d)|0;ld[j&255](g,b,k);break};case 40:{k=c[(c[g>>2]|0)+132>>2]|0;b=p$a(a,d)|0;j=o$a(a,d)|0;ld[k&255](g,b,j);break};default:{}}c[f>>2]=0;oXa(a,1,f,d);h=1;i=e;return h|0}function oXa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;i=i+16|0;g=f+8|0;h=f+4|0;j=f;k=a+284|0;if((c[k>>2]|0)==0){i=f;return}c[g>>2]=1;Ic[c[(c[a>>2]|0)+244>>2]&511](h,a);c[j>>2]=0;l=c[h>>2]|0;if((l|0)==0){m=0}else{m=c[l+4>>2]|0}l=c[k>>2]|0;n=a+176|0;a=A_a(c[n>>2]|0)|0;hd[c[(c[l>>2]|0)+4>>2]&1](l,0,a,0,h,j,0,m,b,g,d,e);if((c[d>>2]|0)==0){g=c[k>>2]|0;k=A_a(c[n>>2]|0)|0;Fc[c[(c[g>>2]|0)+8>>2]&63](g,0,k,d,e)}Lna(j);Lna(h);i=f;return}function pXa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+16|0;f=e;XZa(a,b,d)|0;g=c[a+268>>2]|0;if((g|0)==0){h=0;i=e;return h|0}j=c[(c[g>>2]|0)+156>>2]|0;k=p$a(a,d)|0;l=o$a(a,d)|0;if((id[j&511](g,b,k,l)|0)==0){h=0;i=e;return h|0}c[f>>2]=0;oXa(a,1,f,d);h=1;i=e;return h|0}function qXa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;$Za(a,b,d)|0;if((N_a(a,b)|0)==0){i=e;return 1}c[a+276>>2]=1;Rc[c[(c[a>>2]|0)+80>>2]&1023](a);C_a(a);f=c[a+268>>2]|0;if((f|0)==0){i=e;return 1}g=c[(c[f>>2]|0)+120>>2]|0;h=p$a(a,d)|0;j=o$a(a,d)|0;pd[g&127](f,b,h,j);i=e;return 1}function rXa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;a_a(a,b,d)|0;b=a+276|0;if((c[b>>2]|0)!=0){E_a(a);c[b>>2]=0}c[f>>2]=0;oXa(a,0,f,d);i=e;return 1}function sXa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;h_a(a,b,d)|0;if((((c[a+280>>2]|0)!=0?(U_a(a)|0)==0:0)?(N_a(a,b)|0)!=0:0)?(f=c[a+268>>2]|0,(f|0)!=0):0){g=c[f>>2]|0;h=c[g+100>>2]|0;j=dd[c[g+84>>2]&511](f,b)|0;Ic[h&511](f,j)}if((c[a+276>>2]|0)==0){i=e;return 1}j=c[a+268>>2]|0;if((j|0)==0){i=e;return 1}f=c[(c[j>>2]|0)+124>>2]|0;h=p$a(a,d)|0;g=o$a(a,d)|0;pd[f&127](j,b,h,g);i=e;return 1}function tXa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0.0,m=0;h=i;i=i+16|0;j=h;l_a(a,b,d,e,f);if((d|0)==3){if((e|0)==1?(k=q_a(a)|0,(k|0)!=0):0){Fc[c[(c[k>>2]|0)+88>>2]&63](k,b,3,1,f)}}else if((d|0)==4){l=+g[f>>2];if((e|0)==1?(k=c[a+268>>2]|0,(k|0)!=0):0){m=c[(c[k>>2]|0)+60>>2]|0;g[j>>2]=0.0;g[j+4>>2]=l;Ic[m&511](k,j)}}else if(((d|0)==2?(e|0)==1:0)?(e=q_a(a)|0,(e|0)!=0):0){Fc[c[(c[e>>2]|0)+88>>2]&63](e,b,2,1,f)}i=h;return}function uXa(a){a=a|0;var b=0;b=i;J_a(a);i=b;return}function vXa(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;i=i+16|0;d=b;R_a(a);e=c[a+268>>2]|0;if((e|0)==0){i=b;return}f=c[(c[e>>2]|0)+8>>2]|0;mXa(d,a);Ic[f&511](e,d);i=b;return}function wXa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+32|0;e=d+16|0;f=d;g=b+268|0;h=c[g>>2]|0;if((h|0)!=0?(Lc[c[(c[h>>2]|0)+48>>2]&255](h)|0)!=0:0){h=c[g>>2]|0;g=c[h>>2]|0;j=c[g+68>>2]|0;k=Lc[c[g+72>>2]&255](h)|0;ld[j&255](e,h,k);Ic[c[(c[b>>2]|0)+152>>2]&511](f,b);Ila(e,f);c[a+0>>2]=c[e+0>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];i=d;return}X_a(a,b);i=d;return}function xXa(a,b){a=a|0;b=b|0;var d=0;d=i;if((a|0)==0){i=d;return}Ic[c[(c[a>>2]|0)+92>>2]&511](a,b);i=d;return}function yXa(a,b,c){a=a|0;b=b|0;c=c|0;return}function zXa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[b+268>>2]|0;if((e|0)==0){Mna(a,1292088,-1);i=d;return}else{Ic[c[(c[e>>2]|0)+116>>2]&511](a,e);i=d;return}}function AXa(a,b){a=a|0;b=+b;var d=0,e=0;d=i;e=c[a+268>>2]|0;if((e|0)==0){i=d;return}Gc[c[(c[e>>2]|0)+12>>2]&15](e,b);i=d;return}function BXa(a){a=a|0;var b=0,d=0,e=0.0;b=i;d=c[a+268>>2]|0;if((d|0)==0){e=0.0;i=b;return+e}e=+Vc[c[(c[d>>2]|0)+24>>2]&15](d);i=b;return+e}function CXa(a,b){a=a|0;b=b|0;var d=0;d=i;if((a|0)==0){i=d;return}Ic[c[(c[a>>2]|0)+100>>2]&511](a,b);i=d;return}function DXa(a,b){a=a|0;b=b|0;var d=0;d=i;if((a|0)==0){i=d;return}Ic[c[(c[a>>2]|0)+104>>2]&511](a,b);i=d;return}function EXa(a,b){a=a|0;b=b|0;var d=0;d=i;if((a|0)==0){i=d;return}Ic[c[(c[a>>2]|0)+96>>2]&511](a,b);i=d;return}function FXa(a,b){a=a|0;b=b|0;var d=0;d=i;if((a|0)==0){i=d;return}Ic[c[(c[a>>2]|0)+64>>2]&511](a,b);i=d;return}function GXa(a){a=a|0;var b=0,d=0;b=i;if((a|0)==0){d=-1;i=b;return d|0}d=Lc[c[(c[a>>2]|0)+76>>2]&255](a)|0;i=b;return d|0}function HXa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((a|0)==0){e=0;i=d;return e|0}e=dd[c[(c[a>>2]|0)+36>>2]&511](a,b)|0;i=d;return e|0}function IXa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+268|0;a=c[d>>2]|0;if((a|0)==0){i=b;return}e=c[a>>2]|0;f=c[e+64>>2]|0;g=Lc[c[e+88>>2]&255](a)|0;Ic[f&511](a,g);g=c[d>>2]|0;Lc[c[(c[g>>2]|0)+80>>2]&255](g)|0;i=b;return}function JXa(a){a=a|0;var b=0,d=0;b=i;if((a|0)==0){d=0;i=b;return d|0}d=Lc[c[(c[a>>2]|0)+32>>2]&255](a)|0;i=b;return d|0}function KXa(a,b){a=a|0;b=b|0;var d=0;d=i;if((b|0)==0){c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;i=d;return}else{Ic[c[(c[b>>2]|0)+20>>2]&511](a,b);i=d;return}}function LXa(a){a=a|0;var b=0,d=0.0;b=i;if((a|0)==0){d=0.0;i=b;return+d}d=+Vc[c[(c[a>>2]|0)+40>>2]&15](a);i=b;return+d}function MXa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+16|0;f=d;g=c[a+268>>2]|0;if((g|0)==0){h=0;i=d;return h|0}j=c[g>>2]|0;if(b<<16>>16<0){b=c[j+132>>2]|0;k=p$a(a,e)|0;l=o$a(a,e)|0;ld[b&255](g,k,l)}else{l=c[j+128>>2]|0;j=p$a(a,e)|0;k=o$a(a,e)|0;ld[l&255](g,j,k)}c[f>>2]=0;oXa(a,0,f,e);h=1;i=d;return h|0}function NXa(a,b,c,d,e,f,g){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;g=+g;return}function OXa(a,b){a=a|0;b=+b;return}function PXa(a){a=a|0;var b=0;b=i;w$a(a);c[a>>2]=1291056;i=b;return}function QXa(a){a=a|0;var b=0;b=i;y$a(a);$1a(a);i=b;return}function RXa(a){a=a|0;var b=0;b=i;y$a(a);i=b;return}function SXa(a,b){a=a|0;b=b|0;b=i;eka(a,1291296,-1);i=b;return}function TXa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;Ic[c[(c[b>>2]|0)+148>>2]&511](e,b);sYa(a,e,+(FZa(b)|0));i=d;return}function UXa(a){a=a|0;var b=0;b=i;w$a(a);c[a>>2]=1291320;c[a+272>>2]=0;i=b;return}function VXa(a){a=a|0;var b=0;b=i;y$a(a);$1a(a);i=b;return}function WXa(a){a=a|0;var b=0;b=i;y$a(a);i=b;return}function XXa(a,b){a=a|0;b=b|0;b=i;eka(a,1291568,-1);i=b;return}function YXa(a,b){a=a|0;b=b|0;c[a+272>>2]=b;return}function ZXa(a){a=a|0;return a|0}function _Xa(a,b){a=a|0;b=b|0;var d=0,e=0;b=i;if((Q_a(c[a+56>>2]|0)|0)!=0){d=0;i=b;return d|0}e=a+272|0;c[e>>2]=(c[e>>2]|0)==0&1;d=1;i=b;return d|0}function $Xa(a,b){a=a|0;b=b|0;b=a+272|0;c[b>>2]=(c[b>>2]|0)==0&1;return 1}function aYa(a){a=a|0;var b=0;b=i;w$a(a);c[a>>2]=1291592;c[a+272>>2]=0;i=b;return}function bYa(a){a=a|0;var b=0;b=i;y$a(a);$1a(a);i=b;return}function cYa(a){a=a|0;var b=0;b=i;y$a(a);i=b;return}function dYa(a,b){a=a|0;b=b|0;b=i;eka(a,1291840,-1);i=b;return}function eYa(a,b){a=a|0;b=b|0;var d=0;b=i;if((Q_a(c[a+56>>2]|0)|0)!=0){d=0;i=b;return d|0}c[a+272>>2]=1;d=1;i=b;return d|0}function fYa(a,b){a=a|0;b=b|0;c[a+272>>2]=b;return}function gYa(a){a=a|0;return a|0}function hYa(a,b){a=a|0;b=b|0;c[a+272>>2]=1;return 1}function iYa(a,b,c,d){a=a|0;b=b|0;c=+c;d=+d;var e=0.0,f=0.0,h=0.0;e=+g[b+8>>2]+d;f=+g[b+4>>2]+c;h=+g[b+12>>2]+d;g[a>>2]=+g[b>>2]+c;g[a+8>>2]=e;g[a+4>>2]=f;g[a+12>>2]=h;return}function jYa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;c[a+0>>2]=-1;c[a+4>>2]=-1;c[a+8>>2]=-1;c[a+12>>2]=-1;c[a+16>>2]=-1;c[a+20>>2]=-1;f=d+12|0;if((Nm(f,b)|0)<0){i=e;return}g=b+12|0;if((Nm(d,g)|0)>0){i=e;return}if((Nm(g,d)|0)<0){i=e;return}if((Nm(b,f)|0)>0){i=e;return}if((Nm(b,d)|0)<0){c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2]}else{c[a+0>>2]=c[b+0>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2]}b=a+12|0;if((Nm(g,f)|0)<0){c[b+0>>2]=c[g+0>>2];c[b+4>>2]=c[g+4>>2];c[b+8>>2]=c[g+8>>2];i=e;return}else{c[b+0>>2]=c[f+0>>2];c[b+4>>2]=c[f+4>>2];c[b+8>>2]=c[f+8>>2];i=e;return}}function kYa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0.0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;d=i;i=i+288|0;e=d+264|0;f=d+72|0;h=d+64|0;j=d+56|0;k=d+48|0;l=d+40|0;m=d+32|0;n=d+24|0;o=d+16|0;p=d+8|0;q=d;gla(e);r=+g[b+4>>2]- +g[b>>2];s=b+8|0;t=+g[b+12>>2]- +g[s>>2];g[f>>2]=.2800000011920929;u=f+4|0;g[u>>2]=.5199999809265137;g[f+8>>2]=.27000001072883606;g[f+12>>2]=.47999998927116394;g[f+16>>2]=.28999999165534973;g[f+20>>2]=.4000000059604645;g[f+24>>2]=.30000001192092896;g[f+28>>2]=.33000001311302185;g[f+32>>2]=.3100000023841858;g[f+36>>2]=.28999999165534973;g[f+40>>2]=.3100000023841858;g[f+44>>2]=.2800000011920929;g[f+48>>2]=.38999998569488525;g[f+52>>2]=.2800000011920929;g[f+56>>2]=.49000000953674316;g[f+60>>2]=.28999999165534973;g[f+64>>2]=.7699999809265137;g[f+68>>2]=.6700000166893005;g[f+72>>2]=.7599999904632568;g[f+76>>2]=.6800000071525574;g[f+80>>2]=.7799999713897705;g[f+84>>2]=.6899999976158142;g[f+88>>2]=.7599999904632568;g[f+92>>2]=.75;g[f+96>>2]=.7599999904632568;g[f+100>>2]=.75;g[f+104>>2]=.7300000190734863;g[f+108>>2]=.800000011920929;g[f+112>>2]=.6800000071525574;g[f+116>>2]=.75;g[f+120>>2]=.6800000071525574;g[f+124>>2]=.7400000095367432;g[f+128>>2]=.6800000071525574;g[f+132>>2]=.7400000095367432;g[f+136>>2]=.4399999976158142;g[f+140>>2]=.4699999988079071;g[f+144>>2]=.4300000071525574;g[f+148>>2]=.4699999988079071;g[f+152>>2]=.4000000059604645;g[f+156>>2]=.4699999988079071;g[f+160>>2]=.4099999964237213;g[f+164>>2]=.5799999833106995;g[f+168>>2]=.4000000059604645;g[f+172>>2]=.6000000238418579;g[f+176>>2]=.2800000011920929;g[f+180>>2]=.6600000262260437;g[f+184>>2]=.30000001192092896;g[f+188>>2]=.5600000023841858;v=+g[b>>2];w=+g[s>>2];x=.2800000011920929;y=.5199999809265137;s=0;while(1){g[f+(s<<3)>>2]=r*x+v;g[f+(s<<3)+4>>2]=t*y+w;b=s+1|0;if((b|0)==24){break}x=+g[f+(b<<3)>>2];y=+g[f+(b<<3)+4>>2];s=b}s=tla(e,+g[f>>2])|0;pe(h,1305864);b=qla(s,c[h>>2]|0,c[h+4>>2]|0)|0;h=tla(b,+g[u>>2])|0;pe(j,1293880);qla(h,c[j>>2]|0,c[j+4>>2]|0)|0;j=k+4|0;h=l+4|0;u=m+4|0;b=n+4|0;s=o+4|0;z=p+4|0;A=0;do{B=A*3|0;C=B+1|0;D=B+2|0;E=(A|0)<7?B+3|0:0;y=+g[f+(B<<3)>>2];F=f+(B<<3)+4|0;x=+g[f+(C<<3)+4>>2]- +g[F>>2];B=f+(E<<3)|0;w=+g[f+(D<<3)>>2]- +g[B>>2];G=f+(E<<3)+4|0;t=+g[f+(D<<3)+4>>2]- +g[G>>2];D=tla(e,y+(+g[f+(C<<3)>>2]-y)*.5522847771644592)|0;pe(k,1305864);C=qla(D,c[k>>2]|0,c[j>>2]|0)|0;D=tla(C,x*.5522847771644592+ +g[F>>2])|0;pe(l,1305864);F=qla(D,c[l>>2]|0,c[h>>2]|0)|0;D=tla(F,w*.5522847771644592+ +g[B>>2])|0;pe(m,1305864);F=qla(D,c[m>>2]|0,c[u>>2]|0)|0;D=tla(F,t*.5522847771644592+ +g[G>>2])|0;pe(n,1305864);F=qla(D,c[n>>2]|0,c[b>>2]|0)|0;D=tla(F,+g[B>>2])|0;pe(o,1305864);B=qla(D,c[o>>2]|0,c[s>>2]|0)|0;D=tla(B,+g[G>>2])|0;pe(p,1291864);qla(D,c[p>>2]|0,c[z>>2]|0)|0;A=A+1|0}while((A|0)<8);A=e+4|0;pla(q,c[A>>2]|0,c[e+8>>2]|0);jka(a,q);ila(c[A>>2]|0);i=d;return}function lYa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0,R=0.0,S=0.0,T=0.0;d=i;i=i+240|0;e=d+216|0;f=d+208|0;h=d+200|0;j=d+192|0;k=d+184|0;l=d+176|0;m=d+168|0;n=d+160|0;o=d+152|0;p=d+144|0;q=d+136|0;r=d+128|0;s=d+120|0;t=d+112|0;u=d+104|0;v=d+96|0;w=d+88|0;x=d+80|0;y=d+72|0;z=d+64|0;A=d+56|0;B=d+48|0;C=d+40|0;D=d+32|0;E=d+24|0;F=d+16|0;G=d+8|0;H=d;gla(e);I=+g[b+4>>2];J=+g[b>>2];K=+g[b+12>>2];L=+g[b+8>>2];M=L+(K-L)*.5;N=J+(I-J)*.5;O=J;b=tla(e,O)|0;pe(f,1305864);P=M;Q=tla(qla(b,c[f>>2]|0,c[f+4>>2]|0)|0,P)|0;pe(h,1293880);qla(Q,c[h>>2]|0,c[h+4>>2]|0)|0;h=tla(e,O)|0;pe(j,1305864);R=M+(K-M)*.5522847771644592;Q=tla(qla(h,c[j>>2]|0,c[j+4>>2]|0)|0,R)|0;pe(k,1305864);S=N-(N-J)*.5522847771644592;j=tla(qla(Q,c[k>>2]|0,c[k+4>>2]|0)|0,S)|0;pe(l,1305864);J=K;k=tla(qla(j,c[l>>2]|0,c[l+4>>2]|0)|0,J)|0;pe(m,1305864);K=N;l=tla(qla(k,c[m>>2]|0,c[m+4>>2]|0)|0,K)|0;pe(n,1305864);m=tla(qla(l,c[n>>2]|0,c[n+4>>2]|0)|0,J)|0;pe(o,1291864);qla(m,c[o>>2]|0,c[o+4>>2]|0)|0;T=N+(I-N)*.5522847771644592;o=tla(e,T)|0;pe(p,1305864);m=tla(qla(o,c[p>>2]|0,c[p+4>>2]|0)|0,J)|0;pe(q,1305864);J=I;p=tla(qla(m,c[q>>2]|0,c[q+4>>2]|0)|0,J)|0;pe(r,1305864);q=tla(qla(p,c[r>>2]|0,c[r+4>>2]|0)|0,R)|0;pe(s,1305864);r=tla(qla(q,c[s>>2]|0,c[s+4>>2]|0)|0,J)|0;pe(t,1305864);s=tla(qla(r,c[t>>2]|0,c[t+4>>2]|0)|0,P)|0;pe(u,1291864);qla(s,c[u>>2]|0,c[u+4>>2]|0)|0;u=tla(e,J)|0;pe(v,1305864);J=M-(M-L)*.5522847771644592;s=tla(qla(u,c[v>>2]|0,c[v+4>>2]|0)|0,J)|0;pe(w,1305864);v=tla(qla(s,c[w>>2]|0,c[w+4>>2]|0)|0,T)|0;pe(x,1305864);T=L;w=tla(qla(v,c[x>>2]|0,c[x+4>>2]|0)|0,T)|0;pe(y,1305864);x=tla(qla(w,c[y>>2]|0,c[y+4>>2]|0)|0,K)|0;pe(z,1305864);y=tla(qla(x,c[z>>2]|0,c[z+4>>2]|0)|0,T)|0;pe(A,1291864);qla(y,c[A>>2]|0,c[A+4>>2]|0)|0;A=tla(e,S)|0;pe(B,1305864);y=tla(qla(A,c[B>>2]|0,c[B+4>>2]|0)|0,T)|0;pe(C,1305864);B=tla(qla(y,c[C>>2]|0,c[C+4>>2]|0)|0,O)|0;pe(D,1305864);C=tla(qla(B,c[D>>2]|0,c[D+4>>2]|0)|0,J)|0;pe(E,1305864);D=tla(qla(C,c[E>>2]|0,c[E+4>>2]|0)|0,O)|0;pe(F,1305864);E=tla(qla(D,c[F>>2]|0,c[F+4>>2]|0)|0,P)|0;pe(G,1291864);qla(E,c[G>>2]|0,c[G+4>>2]|0)|0;G=e+4|0;pla(H,c[G>>2]|0,c[e+8>>2]|0);jka(a,H);ila(c[G>>2]|0);i=d;return}function mYa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;i=i+96|0;e=d+72|0;f=d+64|0;h=d+56|0;j=d+48|0;k=d+40|0;l=d+32|0;m=d+24|0;n=d+16|0;o=d+8|0;p=d;gla(e);q=tla(e,+g[b>>2])|0;pe(f,1305864);r=qla(q,c[f>>2]|0,c[f+4>>2]|0)|0;f=b+12|0;q=tla(r,+g[f>>2])|0;pe(h,1293880);qla(q,c[h>>2]|0,c[h+4>>2]|0)|0;h=b+4|0;q=tla(e,+g[h>>2])|0;pe(j,1305864);r=qla(q,c[j>>2]|0,c[j+4>>2]|0)|0;j=b+8|0;q=tla(r,+g[j>>2])|0;pe(k,1293888);qla(q,c[k>>2]|0,c[k+4>>2]|0)|0;k=tla(e,+g[b>>2])|0;pe(l,1305864);b=qla(k,c[l>>2]|0,c[l+4>>2]|0)|0;l=tla(b,+g[j>>2])|0;pe(m,1293880);qla(l,c[m>>2]|0,c[m+4>>2]|0)|0;m=tla(e,+g[h>>2])|0;pe(n,1305864);h=qla(m,c[n>>2]|0,c[n+4>>2]|0)|0;n=tla(h,+g[f>>2])|0;pe(o,1293888);qla(n,c[o>>2]|0,c[o+4>>2]|0)|0;o=e+4|0;pla(p,c[o>>2]|0,c[e+8>>2]|0);jka(a,p);ila(c[o>>2]|0);i=d;return}function nYa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0.0;d=i;i=i+112|0;e=d+88|0;f=d+80|0;h=d+72|0;j=d+64|0;k=d+56|0;l=d+48|0;m=d+40|0;n=d+32|0;o=d+24|0;p=d+16|0;q=d+8|0;r=d;gla(e);s=+g[b+4>>2];t=+g[b>>2];u=+g[b+12>>2];v=+g[b+8>>2];w=t;b=tla(e,w)|0;pe(f,1305864);x=v+(u-v)*.5;y=tla(qla(b,c[f>>2]|0,c[f+4>>2]|0)|0,x)|0;pe(h,1293880);qla(y,c[h>>2]|0,c[h+4>>2]|0)|0;z=t+(s-t)*.5;h=tla(e,z)|0;pe(j,1305864);y=tla(qla(h,c[j>>2]|0,c[j+4>>2]|0)|0,u)|0;pe(k,1293888);qla(y,c[k>>2]|0,c[k+4>>2]|0)|0;k=tla(e,s)|0;pe(l,1305864);y=tla(qla(k,c[l>>2]|0,c[l+4>>2]|0)|0,x)|0;pe(m,1293888);qla(y,c[m>>2]|0,c[m+4>>2]|0)|0;m=tla(e,z)|0;pe(n,1305864);y=tla(qla(m,c[n>>2]|0,c[n+4>>2]|0)|0,v)|0;pe(o,1293888);qla(y,c[o>>2]|0,c[o+4>>2]|0)|0;o=tla(e,w)|0;pe(p,1305864);y=tla(qla(o,c[p>>2]|0,c[p+4>>2]|0)|0,x)|0;pe(q,1293888);qla(y,c[q>>2]|0,c[q+4>>2]|0)|0;q=e+4|0;pla(r,c[q>>2]|0,c[e+8>>2]|0);jka(a,r);ila(c[q>>2]|0);i=d;return}function oYa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=i;i=i+112|0;e=d+88|0;f=d+80|0;h=d+72|0;j=d+64|0;k=d+56|0;l=d+48|0;m=d+40|0;n=d+32|0;o=d+24|0;p=d+16|0;q=d+8|0;r=d;gla(e);s=tla(e,+g[b>>2])|0;pe(f,1305864);t=qla(s,c[f>>2]|0,c[f+4>>2]|0)|0;f=b+12|0;s=tla(t,+g[f>>2])|0;pe(h,1293880);qla(s,c[h>>2]|0,c[h+4>>2]|0)|0;h=b+4|0;s=tla(e,+g[h>>2])|0;pe(j,1305864);t=qla(s,c[j>>2]|0,c[j+4>>2]|0)|0;j=tla(t,+g[f>>2])|0;pe(k,1293888);qla(j,c[k>>2]|0,c[k+4>>2]|0)|0;k=tla(e,+g[h>>2])|0;pe(l,1305864);h=qla(k,c[l>>2]|0,c[l+4>>2]|0)|0;l=b+8|0;k=tla(h,+g[l>>2])|0;pe(m,1293888);qla(k,c[m>>2]|0,c[m+4>>2]|0)|0;m=tla(e,+g[b>>2])|0;pe(n,1305864);k=qla(m,c[n>>2]|0,c[n+4>>2]|0)|0;n=tla(k,+g[l>>2])|0;pe(o,1293888);qla(n,c[o>>2]|0,c[o+4>>2]|0)|0;o=tla(e,+g[b>>2])|0;pe(p,1305864);b=qla(o,c[p>>2]|0,c[p+4>>2]|0)|0;p=tla(b,+g[f>>2])|0;pe(q,1293888);qla(p,c[q>>2]|0,c[q+4>>2]|0)|0;q=e+4|0;pla(r,c[q>>2]|0,c[e+8>>2]|0);jka(a,r);ila(c[q>>2]|0);i=d;return}function pYa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0;d=i;i=i+96|0;e=d+80|0;f=d+60|0;h=d+40|0;j=d+32|0;k=d+24|0;l=d+16|0;m=d+8|0;n=d;gla(e);o=+g[b+12>>2];p=+g[b+8>>2];q=(o-p)/1.8090169429779053;r=(+g[b>>2]+ +g[b+4>>2])*.5;s=(o+p)*.5;p=.3141592741012573;b=0;while(1){o=p;g[f+(b<<2)>>2]=r+q*+U(+o);g[h+(b<<2)>>2]=s+q*+V(+o);b=b+1|0;if((b|0)==5){break}else{p=p+1.2566370964050293}}b=tla(e,+g[f>>2])|0;pe(j,1305864);t=qla(b,c[j>>2]|0,c[j+4>>2]|0)|0;j=tla(t,+g[h>>2])|0;pe(k,1293880);qla(j,c[k>>2]|0,c[k+4>>2]|0)|0;k=l+4|0;j=m+4|0;t=0;b=0;do{u=b+2|0;b=(u|0)>4?b+ -3|0:u;u=tla(e,+g[f+(b<<2)>>2])|0;pe(l,1305864);v=qla(u,c[l>>2]|0,c[k>>2]|0)|0;u=tla(v,+g[h+(b<<2)>>2])|0;pe(m,1293888);qla(u,c[m>>2]|0,c[j>>2]|0)|0;t=t+1|0}while((t|0)<5);t=e+4|0;pla(n,c[t>>2]|0,c[e+8>>2]|0);jka(a,n);ila(c[t>>2]|0);i=d;return}function qYa(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0,F=0.0,G=0.0,H=0.0,I=0,J=0.0,K=0;e=i;i=i+192|0;f=e+168|0;h=e+160|0;j=e+152|0;k=e+144|0;l=e+136|0;m=e+128|0;n=e+120|0;o=e+112|0;p=e+104|0;q=e+96|0;r=e+88|0;s=e+80|0;t=e+72|0;u=e+64|0;v=e+56|0;w=e+48|0;x=e+40|0;y=e+32|0;z=e+24|0;A=e+16|0;B=e+8|0;C=e;gla(f);D=+g[b+4>>2]- +g[b>>2];E=b+8|0;F=D*-.5;G=(+g[b+12>>2]- +g[E>>2])*.5;H=D*.5;D=d;d=+U(+D);I=tla(f,d)|0;pe(h,1305864);J=+V(+D);K=tla(qla(I,c[h>>2]|0,c[h+4>>2]|0)|0,J)|0;pe(j,1305864);h=tla(qla(K,c[j>>2]|0,c[j+4>>2]|0)|0,-J)|0;pe(k,1305864);j=tla(qla(h,c[k>>2]|0,c[k+4>>2]|0)|0,d)|0;pe(l,1305864);k=qla(j,c[l>>2]|0,c[l+4>>2]|0)|0;l=tla(k,H+ +g[b>>2])|0;pe(m,1305864);b=qla(l,c[m>>2]|0,c[m+4>>2]|0)|0;m=tla(b,G+ +g[E>>2])|0;pe(n,1293264);qla(m,c[n>>2]|0,c[n+4>>2]|0)|0;d=F;n=tla(f,d)|0;pe(o,1305864);m=tla(qla(n,c[o>>2]|0,c[o+4>>2]|0)|0,0.0)|0;pe(p,1293880);qla(m,c[p>>2]|0,c[p+4>>2]|0)|0;p=tla(f,d)|0;pe(q,1305864);d=G*.5522847771644592+0.0;m=tla(qla(p,c[q>>2]|0,c[q+4>>2]|0)|0,d)|0;pe(r,1305864);q=tla(qla(m,c[r>>2]|0,c[r+4>>2]|0)|0,0.0-(0.0-F)*.5522847771644592)|0;pe(s,1305864);F=G;r=tla(qla(q,c[s>>2]|0,c[s+4>>2]|0)|0,F)|0;pe(t,1305864);s=tla(qla(r,c[t>>2]|0,c[t+4>>2]|0)|0,0.0)|0;pe(u,1305864);t=tla(qla(s,c[u>>2]|0,c[u+4>>2]|0)|0,F)|0;pe(v,1291864);qla(t,c[v>>2]|0,c[v+4>>2]|0)|0;v=tla(f,H*.5522847771644592+0.0)|0;pe(w,1305864);t=tla(qla(v,c[w>>2]|0,c[w+4>>2]|0)|0,F)|0;pe(x,1305864);F=H;w=tla(qla(t,c[x>>2]|0,c[x+4>>2]|0)|0,F)|0;pe(y,1305864);x=tla(qla(w,c[y>>2]|0,c[y+4>>2]|0)|0,d)|0;pe(z,1305864);y=tla(qla(x,c[z>>2]|0,c[z+4>>2]|0)|0,F)|0;pe(A,1305864);z=tla(qla(y,c[A>>2]|0,c[A+4>>2]|0)|0,0.0)|0;pe(B,1291864);qla(z,c[B>>2]|0,c[B+4>>2]|0)|0;B=f+4|0;pla(C,c[B>>2]|0,c[f+8>>2]|0);jka(a,C);ila(c[B>>2]|0);i=e;return}function rYa(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,h=0.0,j=0.0,k=0.0;e=i;i=i+16|0;f=e;if((Ny(b)|0)==0){h=+g[b+8>>2]-d;j=+g[b+4>>2]+d;k=+g[b+12>>2]+d;g[f>>2]=+g[b>>2]-d;g[f+8>>2]=h;g[f+4>>2]=j;g[f+12>>2]=k;Hla(f);c[a+0>>2]=c[f+0>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];i=e;return}else{c[a+0>>2]=c[b+0>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];i=e;return}}function sYa(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,h=0.0,j=0.0,k=0.0;e=i;i=i+16|0;f=e;if((Ny(b)|0)==0){h=+g[b+8>>2]+d;j=+g[b+4>>2]-d;k=+g[b+12>>2]-d;g[f>>2]=+g[b>>2]+d;g[f+8>>2]=h;g[f+4>>2]=j;g[f+12>>2]=k;Hla(f);c[a+0>>2]=c[f+0>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];i=e;return}else{c[a+0>>2]=c[b+0>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];i=e;return}}function tYa(a,b,c){a=a|0;b=b|0;c=+c;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;d=+g[b+4>>2];e=+g[b>>2];f=+g[b+12>>2];h=+g[b+8>>2];i=(d+e)*.5;j=(f+h)*.5;k=(d-e)*.5*c;e=(f-h)*.5*c;g[a>>2]=i-k;g[a+8>>2]=j-e;g[a+4>>2]=i+k;g[a+12>>2]=j+e;return}function uYa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;i=i+80|0;f=e+64|0;h=e+60|0;j=e+56|0;k=e+48|0;l=e+40|0;m=e+32|0;n=e+24|0;o=e+16|0;p=e+8|0;q=e;gla(f);c[j>>2]=1;vYa(h,d,j);j=c[h>>2]|0;if((j|0)!=0?(c[j+4>>2]|0)>0:0){pe(k,1293864);j=qla(f,c[k>>2]|0,c[k+4>>2]|0)|0;oe(l,h);qla(j,c[l>>2]|0,c[l+4>>2]|0)|0;l=tla(f,+g[b>>2])|0;pe(m,1305864);j=qla(l,c[m>>2]|0,c[m+4>>2]|0)|0;m=b+8|0;l=tla(j,+g[m>>2])|0;pe(n,1305864);j=qla(l,c[n>>2]|0,c[n+4>>2]|0)|0;n=tla(j,+g[b+4>>2]- +g[b>>2])|0;pe(o,1305864);j=qla(n,c[o>>2]|0,c[o+4>>2]|0)|0;o=tla(j,+g[b+12>>2]- +g[m>>2])|0;pe(p,1291872);qla(o,c[p>>2]|0,c[p+4>>2]|0)|0}p=f+4|0;pla(q,c[p>>2]|0,c[f+8>>2]|0);jka(a,q);dka(h);ila(c[p>>2]|0);i=e;return}function vYa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;e=i;i=i+144|0;f=e+120|0;h=e+112|0;j=e+104|0;k=e+96|0;l=e+88|0;m=e+80|0;n=e+72|0;o=e+64|0;p=e+56|0;q=e+48|0;r=e+40|0;s=e+32|0;t=e+24|0;u=e+16|0;v=e+8|0;w=e;gla(f);x=c[b>>2]|0;if((x|0)==2){y=tla(f,+g[b+4>>2])|0;pe(h,1305864);z=qla(y,c[h>>2]|0,c[h+4>>2]|0)|0;h=tla(z,+g[b+8>>2])|0;pe(j,1305864);z=qla(h,c[j>>2]|0,c[j+4>>2]|0)|0;j=tla(z,+g[b+12>>2])|0;pe(k,1305864);z=qla(j,c[k>>2]|0,c[k+4>>2]|0)|0;pe(l,(c[d>>2]|0)!=0?1291912:1291920);k=qla(z,c[l>>2]|0,c[l+4>>2]|0)|0;pe(m,1291928);qla(k,c[m>>2]|0,c[m+4>>2]|0)|0}else if((x|0)==3){m=tla(f,+g[b+4>>2])|0;pe(q,1305864);k=qla(m,c[q>>2]|0,c[q+4>>2]|0)|0;q=tla(k,+g[b+8>>2])|0;pe(r,1305864);k=qla(q,c[r>>2]|0,c[r+4>>2]|0)|0;r=tla(k,+g[b+12>>2])|0;pe(s,1305864);k=qla(r,c[s>>2]|0,c[s+4>>2]|0)|0;s=tla(k,+g[b+16>>2])|0;pe(t,1305864);k=qla(s,c[t>>2]|0,c[t+4>>2]|0)|0;pe(u,(c[d>>2]|0)!=0?1291952:1291960);t=qla(k,c[u>>2]|0,c[u+4>>2]|0)|0;pe(v,1291928);qla(t,c[v>>2]|0,c[v+4>>2]|0)|0}else if((x|0)==1){x=tla(f,+g[b+4>>2])|0;pe(n,1305864);b=qla(x,c[n>>2]|0,c[n+4>>2]|0)|0;pe(o,(c[d>>2]|0)!=0?1291936:1291944);d=qla(b,c[o>>2]|0,c[o+4>>2]|0)|0;pe(p,1291928);qla(d,c[p>>2]|0,c[p+4>>2]|0)|0}p=f+4|0;pla(w,c[p>>2]|0,c[f+8>>2]|0);jka(a,w);ila(c[p>>2]|0);i=e;return}function wYa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;i=i+80|0;f=e+56|0;g=e+52|0;h=e+48|0;j=e+40|0;k=e+32|0;l=e+24|0;m=e+16|0;n=e+8|0;o=e;gla(f);c[h>>2]=1;vYa(g,d,h);h=c[g>>2]|0;if((h|0)!=0?(c[h+4>>2]|0)>0:0){pe(j,1293864);h=qla(f,c[j>>2]|0,c[j+4>>2]|0)|0;oe(k,g);j=qla(h,c[k>>2]|0,c[k+4>>2]|0)|0;lYa(m,b);oe(l,m);b=qla(j,c[l>>2]|0,c[l+4>>2]|0)|0;pe(n,1291888);qla(b,c[n>>2]|0,c[n+4>>2]|0)|0;dka(m)}m=f+4|0;pla(o,c[m>>2]|0,c[f+8>>2]|0);jka(a,o);dka(g);ila(c[m>>2]|0);i=e;return}function xYa(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;c=+g[b+4>>2];d=+g[b>>2];e=c-d;f=+g[b+12>>2];h=+g[b+8>>2];i=f-h;j=(c+d)*.5;d=(f+h)*.5;h=(e>i?i:e)*.5;g[a>>2]=j-h;g[a+8>>2]=d-h;g[a+4>>2]=j+h;g[a+12>>2]=d+h;return}function yYa(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0;g=i;F1a(a,b,c,d,e,f);i=g;return}function zYa(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=i;I1a(a,b,c,d);i=e;return}function AYa(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0;h=i;i=i+240|0;j=h+224|0;k=h+216|0;l=h+204|0;m=h+128|0;n=h+120|0;o=h+112|0;p=h+88|0;q=h+80|0;r=h+72|0;s=h+48|0;t=h+40|0;u=h+32|0;v=h+8|0;w=h;gla(j);if((g|0)==0){x=j+4|0;y=c[x>>2]|0;z=j+8|0;A=c[z>>2]|0;pla(w,y,A);jka(a,w);B=c[x>>2]|0;ila(B);i=h;return}C=g+12|0;if((cs(g,C)|0)==0){x=j+4|0;y=c[x>>2]|0;z=j+8|0;A=c[z>>2]|0;pla(w,y,A);jka(a,w);B=c[x>>2]|0;ila(B);i=h;return}D=Lc[c[(c[d>>2]|0)+16>>2]&255](d)|0;if((D|0)==0){x=j+4|0;y=c[x>>2]|0;z=j+8|0;A=c[z>>2]|0;pla(w,y,A);jka(a,w);B=c[x>>2]|0;ila(B);i=h;return}Ic[c[(c[D>>2]|0)+48>>2]&511](D,g);c[k>>2]=0;g=s+4|0;d=s+8|0;E=s+12|0;F=s+16|0;G=s+20|0;H=p+4|0;I=p+8|0;J=p+12|0;K=p+16|0;L=p+20|0;M=l+4|0;N=l+8|0;O=q+4|0;P=n+4|0;Q=-1;R=-1;S=-1;T=-1;U=-1;V=-1;W=0;a:while(1){X=W;while(1){if((Lc[c[(c[D>>2]|0)+8>>2]&255](D)|0)==0){break a}Y=Lc[c[(c[D>>2]|0)+52>>2]&255](D)|0;c[l+0>>2]=c[Y+0>>2];c[l+4>>2]=c[Y+4>>2];c[l+8>>2]=c[Y+8>>2];if((Nm(l,C)|0)>0){break a}Um(m);if((dd[c[(c[D>>2]|0)+32>>2]&511](D,m)|0)==0){if((X|0)==0){X=0;continue}Y=c[k>>2]|0;if((dd[c[c[e>>2]>>2]&511](e,(Y|0)==0?1305928:Y+12|0)|0)==0){c[s+0>>2]=-1;c[s+4>>2]=-1;c[s+8>>2]=-1;c[s+12>>2]=-1;c[s>>2]=S;c[g>>2]=R;c[d>>2]=Q;c[E>>2]=V;c[F>>2]=U;c[G>>2]=T;nt(s);BYa(r,D,f,s);oe(q,r);qla(j,c[q>>2]|0,c[O>>2]|0)|0;dka(r)}nka(k);X=0;continue}Z=b[m>>1]|0;_=(X|0)==0;if(Z<<16>>16==45|(Z+ -65<<16>>16&65535)<26|(Z+ -97<<16>>16&65535)<26|(Z+ -192<<16>>16&65535)<496){break}if(!_?(Y=c[k>>2]|0,(dd[c[c[e>>2]>>2]&511](e,(Y|0)==0?1305928:Y+12|0)|0)==0):0){c[p+0>>2]=-1;c[p+4>>2]=-1;c[p+8>>2]=-1;c[p+12>>2]=-1;c[p>>2]=S;c[H>>2]=R;c[I>>2]=Q;c[J>>2]=V;c[K>>2]=U;c[L>>2]=T;nt(p);BYa(o,D,f,p);oe(n,o);qla(j,c[n>>2]|0,c[P>>2]|0)|0;dka(o);Ic[c[(c[D>>2]|0)+48>>2]&511](D,l)}nka(k);X=0}if(_){$=c[N>>2]|0;aa=c[M>>2]|0;ba=c[l>>2]|0;ca=1}else{$=Q;aa=R;ba=S;ca=X}tka(k,Z&255);Q=$;R=aa;S=ba;T=c[N>>2]|0;U=c[M>>2]|0;V=c[l>>2]|0;W=ca}if((X|0)!=0){X=c[k>>2]|0;if((dd[c[c[e>>2]>>2]&511](e,(X|0)==0?1305928:X+12|0)|0)==0){c[v+0>>2]=-1;c[v+4>>2]=-1;c[v+8>>2]=-1;c[v+12>>2]=-1;c[v>>2]=S;c[v+4>>2]=R;c[v+8>>2]=Q;c[v+12>>2]=V;c[v+16>>2]=U;c[v+20>>2]=T;nt(v);BYa(u,D,f,v);oe(t,u);qla(j,c[t>>2]|0,c[t+4>>2]|0)|0;dka(u)}nka(k)}dka(k);x=j+4|0;y=c[x>>2]|0;z=j+8|0;A=c[z>>2]|0;pla(w,y,A);jka(a,w);B=c[x>>2]|0;ila(B);i=h;return}function BYa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0,$=0.0,aa=0.0,ba=0.0,ca=0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0,ia=0.0,ja=0,ka=0;f=i;i=i+320|0;h=f+304|0;j=f+296|0;k=f+288|0;l=f+280|0;m=f+272|0;n=f+264|0;o=f+256|0;p=f+248|0;q=f+232|0;r=f+220|0;s=f+176|0;t=f+100|0;u=f+24|0;v=f+16|0;w=f+8|0;x=f;gla(q);if((b|0)==0){y=q+4|0;z=c[y>>2]|0;A=q+8|0;B=c[A>>2]|0;pla(x,z,B);jka(a,x);C=c[y>>2]|0;ila(C);i=f;return}Ic[c[(c[b>>2]|0)+48>>2]&511](b,e);D=s+24|0;E=t+20|0;F=e+12|0;G=u+20|0;H=u+36|0;I=d+4|0;J=s+32|0;K=s+28|0;L=s+36|0;M=s+40|0;N=j+4|0;O=k+4|0;P=l+4|0;Q=o+4|0;R=h+4|0;S=h+8|0;T=v+4|0;U=m+4|0;V=n+4|0;W=0.0;X=0.0;Y=0.0;Z=0.0;while(1){_=Lc[c[(c[b>>2]|0)+52>>2]&255](b)|0;c[r+0>>2]=c[_+0>>2];c[r+4>>2]=c[_+4>>2];c[r+8>>2]=c[_+8>>2];c[s+0>>2]=-1;c[s+4>>2]=-1;c[s+8>>2]=-1;c[s+12>>2]=-1;c[s+16>>2]=-1;c[s+20>>2]=-1;c[D+0>>2]=0;c[D+4>>2]=0;c[D+8>>2]=0;c[D+12>>2]=0;c[D+16>>2]=0;if((dd[c[(c[b>>2]|0)+36>>2]&511](b,s)|0)==0){$=Y;aa=Z}else{$=(+g[L>>2]- +g[M>>2])*.0625;aa=+g[K>>2]}if((Om(r,e)|0)==0){Ic[c[(c[b>>2]|0)+48>>2]&511](b,e);Um(t);_=(dd[c[(c[b>>2]|0)+32>>2]&511](b,t)|0)==0;ba=_?X:+g[E>>2]}else{ba=+g[D>>2]}if((Om(r,F)|0)==0){Ic[c[(c[b>>2]|0)+48>>2]&511](b,F);Um(u);if((dd[c[(c[b>>2]|0)+32>>2]&511](b,u)|0)==0){ca=1;da=W}else{ca=1;da=+g[G>>2]+ +g[H>>2]}}else{ca=0;da=+g[D>>2]+ +g[J>>2]}ea=+g[d>>2];fa=ba+ea;ga=da+ea;ea=aa+ +g[I>>2];gla(h);pe(j,1294176);_=tla(qla(h,c[j>>2]|0,c[N>>2]|0)|0,fa)|0;pe(k,1305864);ha=tla(qla(_,c[k>>2]|0,c[O>>2]|0)|0,ea)|0;pe(l,1293880);qla(ha,c[l>>2]|0,c[P>>2]|0)|0;ia=$+fa;if(ia<ga){fa=ia;ha=1;while(1){_=tla(h,fa)|0;pe(m,1305864);ja=tla(qla(_,c[m>>2]|0,c[U>>2]|0)|0,ea+$*+(ha&1|0))|0;pe(n,1293888);qla(ja,c[n>>2]|0,c[V>>2]|0)|0;fa=$+fa;if(!(fa<ga)){break}else{ha=ha+1|0}}}pe(o,1292096);qla(h,c[o>>2]|0,c[Q>>2]|0)|0;pla(p,c[R>>2]|0,c[S>>2]|0);jka(w,p);ila(c[R>>2]|0);oe(v,w);qla(q,c[v>>2]|0,c[T>>2]|0)|0;dka(w);if((ca|0)!=0){ka=16;break}if((Lc[c[(c[b>>2]|0)+12>>2]&255](b)|0)==0){ka=16;break}else{W=da;X=ba;Y=$;Z=aa}}if((ka|0)==16){y=q+4|0;z=c[y>>2]|0;A=q+8|0;B=c[A>>2]|0;pla(x,z,B);jka(a,x);C=c[y>>2]|0;ila(C);i=f;return}}function CYa(a,b,d,e,f,h,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=+k;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0,N=0,O=0,P=0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0;m=i;i=i+672|0;n=m+656|0;o=m+376|0;p=m+184|0;q=m+168|0;r=m+152|0;s=m+136|0;t=m+120|0;u=m+112|0;v=m+108|0;w=m+104|0;x=m+96|0;y=m+88|0;z=m+80|0;A=m+76|0;B=m+72|0;C=m+64|0;D=m+56|0;E=m+48|0;F=m+40|0;G=m+32|0;H=m+24|0;I=m+16|0;J=m+8|0;K=m;L=Hpa()|0;if((L|0)==0){eka(a,1305928,-1);i=m;return}Ic[c[c[L>>2]>>2]&511](L,d);ld[c[(c[L>>2]|0)+40>>2]&255](L,1,1);ld[c[(c[L>>2]|0)+44>>2]&255](L,1,1);ld[c[(c[L>>2]|0)+72>>2]&255](L,0,1);ld[c[(c[L>>2]|0)+76>>2]&255](L,0,1);M=k;d=M<1.0e-4&M>-1.0e-4;if(d){ld[c[(c[L>>2]|0)+80>>2]&255](L,1,1)}else{Oc[c[(c[L>>2]|0)+88>>2]&3](L,k,1)}Rc[c[(c[L>>2]|0)+28>>2]&1023](L);N=c[h>>2]|0;Fc[c[(c[L>>2]|0)+248>>2]&63](L,(N|0)==0?1292088:N+12|0,1,0,0);Ic[c[(c[L>>2]|0)+200>>2]&511](n,L);_$a(o);QR(p);c[p+32>>2]=67108864;rZa(o,p);c[o+276>>2]=f;V$a(o,e);f=q+8|0;p=q+4|0;N=q+12|0;c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;h=r+8|0;O=r+4|0;P=r+12|0;c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;a:do{switch(l|0){case 6:{c[q+0>>2]=c[b+0>>2];c[q+4>>2]=c[b+4>>2];c[q+8>>2]=c[b+8>>2];c[q+12>>2]=c[b+12>>2];c[r+0>>2]=c[b+0>>2];c[r+4>>2]=c[b+4>>2];c[r+8>>2]=c[b+8>>2];c[r+12>>2]=c[b+12>>2];break};case 0:{c[q+0>>2]=c[b+0>>2];c[q+4>>2]=c[b+4>>2];c[q+8>>2]=c[b+8>>2];c[q+12>>2]=c[b+12>>2];c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;break};case 2:{if((e|0)==0){c[q+0>>2]=c[b+0>>2];c[q+4>>2]=c[b+4>>2];c[q+8>>2]=c[b+8>>2];c[q+12>>2]=c[b+12>>2];c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;break a}if(d){k=+g[b+12>>2];M=+g[b+8>>2];Q=+g[b>>2];R=+g[b+4>>2];S=M+(k-M)*.3333333432674408;g[q>>2]=Q;g[p>>2]=R;g[f>>2]=M;g[N>>2]=S;g[r>>2]=Q;g[O>>2]=R;g[h>>2]=S;g[P>>2]=k;break a}k=+g[b+8>>2];S=k+(+g[n+12>>2]- +g[n+8>>2]);R=+g[b+12>>2];if(S>R){c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[q+0>>2]=c[b+0>>2];c[q+4>>2]=c[b+4>>2];c[q+8>>2]=c[b+8>>2];c[q+12>>2]=c[b+12>>2];break a}else{Q=+g[b>>2];M=+g[b+4>>2];g[q>>2]=Q;g[p>>2]=M;g[f>>2]=k;g[N>>2]=S;g[r>>2]=Q;g[O>>2]=M;g[h>>2]=S;g[P>>2]=R;break a}break};case 4:{if((e|0)==0){c[q+0>>2]=c[b+0>>2];c[q+4>>2]=c[b+4>>2];c[q+8>>2]=c[b+8>>2];c[q+12>>2]=c[b+12>>2];c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;break a}if(!d){R=+g[n+4>>2]- +g[n>>2];S=+g[b>>2];M=+g[b+4>>2];if(S+R>M){c[q+0>>2]=c[b+0>>2];c[q+4>>2]=c[b+4>>2];c[q+8>>2]=c[b+8>>2];c[q+12>>2]=c[b+12>>2];c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;break a}else{Q=M-R;R=+g[b+8>>2];k=+g[b+12>>2];g[q>>2]=Q;g[p>>2]=M;g[f>>2]=R;g[N>>2]=k;g[r>>2]=S;g[O>>2]=Q;g[h>>2]=R;g[P>>2]=k;break a}}k=+g[b+4>>2];R=+g[b>>2];Q=k-R;S=Q*.3333333432674408;M=k-S;T=+g[b+8>>2];U=+g[b+12>>2];g[q>>2]=M;g[p>>2]=k;g[f>>2]=T;g[N>>2]=U;g[r>>2]=R;g[O>>2]=M;g[h>>2]=T;g[P>>2]=U;M=+g[n+4>>2]- +g[n>>2];if(!(M<S)){if(M<Q){Q=k-M;g[q>>2]=Q;g[p>>2]=k;g[f>>2]=T;g[N>>2]=U;g[r>>2]=R;g[O>>2]=Q;g[h>>2]=T;g[P>>2]=U;break a}else{c[q+0>>2]=c[b+0>>2];c[q+4>>2]=c[b+4>>2];c[q+8>>2]=c[b+8>>2];c[q+12>>2]=c[b+12>>2];c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;break a}}break};case 1:{c[r+0>>2]=c[b+0>>2];c[r+4>>2]=c[b+4>>2];c[r+8>>2]=c[b+8>>2];c[r+12>>2]=c[b+12>>2];c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;break};case 3:{if((e|0)==0){c[q+0>>2]=c[b+0>>2];c[q+4>>2]=c[b+4>>2];c[q+8>>2]=c[b+8>>2];c[q+12>>2]=c[b+12>>2];c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;break a}if(d){U=+g[b+12>>2];T=+g[b+8>>2];Q=+g[b>>2];R=U-(U-T)*.3333333432674408;k=+g[b+4>>2];g[q>>2]=Q;g[p>>2]=k;g[f>>2]=R;g[N>>2]=U;g[r>>2]=Q;g[O>>2]=k;g[h>>2]=T;g[P>>2]=R;break a}R=+g[n+12>>2]- +g[n+8>>2];T=+g[b+8>>2];k=+g[b+12>>2];if(T+R>k){c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[q+0>>2]=c[b+0>>2];c[q+4>>2]=c[b+4>>2];c[q+8>>2]=c[b+8>>2];c[q+12>>2]=c[b+12>>2];break a}else{Q=+g[b>>2];U=k-R;R=+g[b+4>>2];g[q>>2]=Q;g[p>>2]=R;g[f>>2]=U;g[N>>2]=k;g[r>>2]=Q;g[O>>2]=R;g[h>>2]=T;g[P>>2]=U;break a}break};case 5:{if((e|0)==0){c[q+0>>2]=c[b+0>>2];c[q+4>>2]=c[b+4>>2];c[q+8>>2]=c[b+8>>2];c[q+12>>2]=c[b+12>>2];c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;break a}if(!d){U=+g[b>>2];T=U+(+g[n+4>>2]- +g[n>>2]);R=+g[b+4>>2];if(T>R){c[q+0>>2]=c[b+0>>2];c[q+4>>2]=c[b+4>>2];c[q+8>>2]=c[b+8>>2];c[q+12>>2]=c[b+12>>2];c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;break a}else{Q=+g[b+8>>2];k=+g[b+12>>2];g[q>>2]=U;g[p>>2]=T;g[f>>2]=Q;g[N>>2]=k;g[r>>2]=T;g[O>>2]=R;g[h>>2]=Q;g[P>>2]=k;break a}}k=+g[b+4>>2];Q=+g[b>>2];R=k-Q;T=+g[b+8>>2];U=R*.3333333432674408;M=Q+U;S=+g[b+12>>2];g[q>>2]=Q;g[p>>2]=M;g[f>>2]=T;g[N>>2]=S;g[r>>2]=M;g[O>>2]=k;g[h>>2]=T;g[P>>2]=S;M=+g[n+4>>2]- +g[n>>2];if(!(M<U)){if(M<R){R=M+Q;g[q>>2]=Q;g[p>>2]=R;g[f>>2]=T;g[N>>2]=S;g[r>>2]=R;g[O>>2]=k;g[h>>2]=T;g[P>>2]=S;break a}else{c[q+0>>2]=c[b+0>>2];c[q+4>>2]=c[b+4>>2];c[q+8>>2]=c[b+8>>2];c[q+12>>2]=c[b+12>>2];c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;break a}}break};default:{}}}while(0);gla(s);gla(t);if(!(+g[r>>2]>=+g[O>>2])?!(+g[h>>2]>=+g[P>>2]):0){BZa(o,r,0,0);Ic[c[(c[o>>2]|0)+240>>2]&511](v,o);oe(u,v);qla(t,c[u>>2]|0,c[u+4>>2]|0)|0;dka(v)}yZa(o);if(!(+g[q>>2]>=+g[p>>2])?!(+g[f>>2]>=+g[N>>2]):0){ld[c[(c[L>>2]|0)+32>>2]&255](L,q,1);g[x>>2]=0.0;g[x+4>>2]=0.0;F1a(w,L,x,0,1,0);x=c[w>>2]|0;if((x|0)!=0?(c[x+4>>2]|0)>0:0){pe(y,1291896);x=qla(t,c[y>>2]|0,c[y+4>>2]|0)|0;c[B>>2]=1;vYa(A,j,B);oe(z,A);B=qla(x,c[z>>2]|0,c[z+4>>2]|0)|0;oe(C,w);z=qla(B,c[C>>2]|0,c[C+4>>2]|0)|0;pe(D,1291904);qla(z,c[D>>2]|0,c[D+4>>2]|0)|0;dka(A)}dka(w)}Ipa(L);L=t+8|0;if((c[L>>2]|0)>0){pe(E,1293864);w=qla(s,c[E>>2]|0,c[E+4>>2]|0)|0;E=tla(w,+g[b>>2])|0;pe(F,1305864);w=qla(E,c[F>>2]|0,c[F+4>>2]|0)|0;F=b+8|0;E=tla(w,+g[F>>2])|0;pe(G,1305864);w=qla(E,c[G>>2]|0,c[G+4>>2]|0)|0;G=tla(w,+g[b+4>>2]- +g[b>>2])|0;pe(H,1305864);w=qla(G,c[H>>2]|0,c[H+4>>2]|0)|0;H=tla(w,+g[b+12>>2]- +g[F>>2])|0;pe(I,1293240);qla(H,c[I>>2]|0,c[I+4>>2]|0)|0;I=ula(s,c[t+4>>2]|0,c[L>>2]|0)|0;pe(J,1293904);qla(I,c[J>>2]|0,c[J+4>>2]|0)|0}J=s+4|0;pla(K,c[J>>2]|0,c[s+8>>2]|0);jka(a,K);ila(c[t+4>>2]|0);ila(c[J>>2]|0);R$a(o);i=m;return}\n\n\n\nfunction dQ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;wWa(a,d);c[a>>2]=669320;d=a+44|0;f=a+60|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;eka(f,1274672,-1);c[d>>2]=c[(vl(c[b+8>>2]|0)|0)+8>>2];c[a+48>>2]=c[(Xk(c[b+4>>2]|0)|0)+16>>2];i=e;return}function eQ(a){a=a|0;var b=0;b=i;fQ(a);$1a(a);i=b;return}function fQ(a){a=a|0;var b=0;b=i;c[a>>2]=669320;dka(a+60|0);dka(a+56|0);yWa(a);i=b;return}function gQ(a){a=a|0;var b=0;b=i;zWa(a);c[a+52>>2]=0;mka(a+56|0,1305928);i=b;return}function hQ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=a+52|0;if((c[e>>2]|0)==0?(f=a+56|0,g=iQ(a,f)|0,c[e>>2]=g,(g|0)!=0):0){h=c[g+12>>2]|0;if((h|0)==0){if((!(ah(f,669368)|0)?!(ah(f,669384)|0):0)?!(ah(f,669400)|0):0){g=ah(f,669416)|0;j=g?2:0}else{j=2}}else{j=c[h+8>>2]|0}SWa(a,c[e>>2]|0,f,j)|0;jQ(a,c[e>>2]|0,f);if((j|0)==0){i=d;return}}NWa(a,b);i=d;return}function iQ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;d=i;i=i+176|0;e=d+168|0;f=d+160|0;g=d+152|0;h=d+148|0;j=d+144|0;k=d+140|0;l=d+128|0;m=d+120|0;n=d+112|0;o=d+104|0;p=d+96|0;q=d+92|0;r=d+88|0;s=d+80|0;t=d+72|0;u=d+64|0;v=d+56|0;w=d+48|0;x=d+40|0;y=d+32|0;z=d+24|0;A=d+16|0;B=d+8|0;C=d;D=a+48|0;E=c[D>>2]|0;pe(f,669432);aI(e,E,f);f=ah(e,669440)|0;dka(e);if(f?(e=c[(c[a+44>>2]|0)+52>>2]|0,(e|0)!=0):0){pe(g,669448);F=iI(e,g)|0}else{F=0}c[h>>2]=0;g=Up(c[D>>2]|0,669512,0)|0;if((g|0)!=0){dH(j,g);ika(h,j);dka(j)}do{if(f){j=c[h>>2]|0;if((j|0)!=0?(c[j+4>>2]|0)!=0:0){break}j=Up(F,669512,0)|0;if((j|0)==0){c[k>>2]=0;G=1;H=0}else{dH(k,j);G=0;H=1}ika(h,k);if(G){dka(k)}if(H){dka(k)}}}while(0);k=c[h>>2]|0;if((k|0)==0){I=0;dka(h);i=d;return I|0}if((c[k+4>>2]|0)==0){I=0;dka(h);i=d;return I|0}oe(m,h);oL(l,m);pe(n,669520);rL(l,n,2)|0;qL(p,l);jka(o,p);uL(r,o);Fka(q,r,1);ika(b,q);dka(q);dka(r);r=c[D>>2]|0;pe(s,669464);q=iI(r,s)|0;if(((q|0)!=0?(pe(t,669472),s=iI(q,t)|0,(s|0)!=0):0)?(oe(u,b),t=iI(s,u)|0,(t|0)!=0):0){dka(o);J=t}else{t=c[D>>2]|0;pe(v,669488);D=iI(t,v)|0;if((((D|0)!=0?(pe(w,1274672),v=iI(D,w)|0,(v|0)!=0):0)?(pe(x,669496),w=iI(v,x)|0,(w|0)!=0):0)?(pe(y,669472),x=iI(w,y)|0,(x|0)!=0):0){oe(z,b);K=iI(x,z)|0}else{K=0}if((!((F|0)==0|f&(K|0)==0^1)?(pe(A,669464),f=iI(F,A)|0,(f|0)!=0):0)?(pe(B,669472),A=iI(f,B)|0,(A|0)!=0):0){oe(C,b);L=iI(A,C)|0}else{L=K}dka(o);if((L|0)==0){I=0;dka(h);i=d;return I|0}else{J=L}}I=RA(c[a+44>>2]|0,J)|0;dka(h);i=d;return I|0}function jQ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;e=i;i=i+96|0;f=e+80|0;g=e+72|0;h=e+64|0;j=e+56|0;k=e+48|0;l=e+40|0;m=e+32|0;n=e+24|0;o=e+16|0;p=e+8|0;q=e;if((b|0)==0){i=e;return}r=a+48|0;s=c[r>>2]|0;pe(f,669488);t=iI(s,f)|0;if((t|0)==0){f=u2a(32)|0;Dh(f);s=c[r>>2]|0;pe(g,669488);oI(s,g,f,0);u=f}else{u=t}t=a+60|0;oe(h,t);f=_H(u,h)|0;if((f|0)!=0?(c[f>>2]|0)==6:0){i=e;return}oe(j,t);f=kI(u,j)|0;if((f|0)==0){j=u2a(36)|0;zI(j,0,0,0);h=a+44|0;g=II((c[h>>2]|0)+16|0,j)|0;oe(k,t);t=c[h>>2]|0;if((t|0)==0){v=0}else{v=t+16|0}vI(u,k,v,g);w=j}else{w=f}f=c[w+12>>2]|0;if((f|0)==0){j=u2a(32)|0;Dh(j);CI(w,j);if((j|0)==0){i=e;return}else{x=j}}else{x=f}pe(l,669496);f=iI(x,l)|0;if((f|0)==0){l=u2a(32)|0;Dh(l);pe(m,669496);oI(x,m,l,0);if((l|0)==0){i=e;return}else{y=l}}else{y=f}pe(n,669472);f=iI(y,n)|0;if((f|0)==0){n=u2a(32)|0;Dh(n);l=a+44|0;m=II((c[l>>2]|0)+16|0,n)|0;pe(o,669472);x=c[l>>2]|0;if((x|0)==0){z=0}else{z=x+16|0}vI(y,o,z,m);A=n}else{A=f}oe(p,d);if((nI(A,p)|0)!=0){i=e;return}oe(q,d);d=c[a+44>>2]|0;if((d|0)==0){B=0}else{B=d+16|0}vI(A,q,B,c[(c[b+96>>2]|0)+4>>2]|0);i=e;return}function kQ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+32|0;f=e+24|0;g=e+16|0;h=e+8|0;j=e;k=c[a+48>>2]|0;pe(g,669432);aI(f,k,g);g=ah(f,669440)|0;dka(f);if(!g){l=0;i=e;return l|0}g=c[(Lc[c[(c[a>>2]|0)+40>>2]&255](a)|0)+52>>2]|0;if((g|0)==0){l=0;i=e;return l|0}pe(h,669448);f=iI(g,h)|0;if((f|0)==0){l=0;i=e;return l|0}pe(j,669464);h=iI(f,j)|0;if((h|0)==0){l=0;i=e;return l|0}l=lQ(a,h,b,d)|0;i=e;return l|0}function lQ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=i;i=i+32|0;g=f+24|0;h=f+16|0;j=f+12|0;k=f+8|0;l=f;if((b|0)==0){m=0;i=f;return m|0}n=Lc[c[(c[a>>2]|0)+40>>2]&255](a)|0;pe(g,669472);a=iI(b,g)|0;if((a|0)==0){m=0;i=f;return m|0}g=YH(a)|0;c[h>>2]=g;if((g|0)==0){m=0;i=f;return m|0}g=0;while(1){c[j>>2]=0;b=ZH(a,h,j)|0;if(((((((b|0)!=0?(o=oH(b)|0,(o|0)!=0):0)?(c[o>>2]|0)==6:0)?(pe(l,669480),aI(k,o,l),b=yl(k,669472)|0,dka(k),!b):0)?(b=RA(n,o)|0,(b|0)!=0):0)?(o=c[b+12>>2]|0,(o|0)!=0):0)?(c[o+8>>2]|0)==(e|0):0){ika(d,j);p=b}else{p=g}dka(j);if((c[h>>2]|0)==0){m=p;break}else{g=p}}i=f;return m|0}function mQ(a){a=a|0;return c[a+44>>2]|0}function nQ(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;jQ(a,b,c);i=d;return}function oQ(a,b){a=a|0;b=b|0;var d=0;d=i;ika(a+60|0,b);gQ(a);Ic[c[(c[a>>2]|0)+28>>2]&511](a,0);i=d;return}function pQ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;c[a>>2]=669984;hZa(a+4|0);c[a>>2]=669536;c[a+4>>2]=669736;c[a+12>>2]=b;c[a+20>>2]=d;c[a+24>>2]=0;zma(a+28|0,10);g[a+52>>2]=0.0;g[a+56>>2]=0.0;c[a+16>>2]=d;i=e;return}function qQ(a){a=a|0;var b=0;b=i;sQ(a);$1a(a);i=b;return}function rQ(a){a=a|0;var b=0;b=i;qQ(a+ -4|0);i=b;return}function sQ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;i=i+16|0;d=b+8|0;e=b+4|0;f=b;c[a>>2]=669536;c[a+4>>2]=669736;g=a+28|0;h=(c[a+36>>2]|0)==0;c[d>>2]=h?0:-1;if(h){Ama(g);Bma(g);j=a+4|0;jZa(j);i=b;return}do{c[e>>2]=0;c[f>>2]=0;uQ(g,d,e,f);h=c[f>>2]|0;if((h|0)!=0){k=A_a(c[h+176>>2]|0)|0;yZa(h);Rc[c[(c[h>>2]|0)+4>>2]&1023](h);$1a(k)}}while((c[d>>2]|0)!=0);Ama(g);Bma(g);j=a+4|0;jZa(j);i=b;return}function tQ(a){a=a|0;var b=0;b=i;sQ(a+ -4|0);i=b;return}function uQ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;i=i+16|0;g=f+4|0;h=f;c[g>>2]=0;c[h>>2]=0;Cma(a,b,g,h);c[d>>2]=c[g>>2];c[e>>2]=c[h>>2];i=f;return}function vQ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;g=wQ(a,b,0)|0;if((g|0)==0){i=e;return}c[f+0>>2]=c[d+0>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];BZa(g,f,1,0);i=e;return}function wQ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+208|0;f=e+192|0;g=e;c[f>>2]=0;h=a+28|0;bR(h,b,f);j=c[f>>2]|0;if((d|0)==0){k=j;i=e;return k|0}if((j|0)==0){Ic[c[(c[a>>2]|0)+176>>2]&511](g,a);d=c[a+16>>2]|0;c[g+56>>2]=d;l=Z1a(16)|0;c[l>>2]=d;c[l+4>>2]=b;c[l+8>>2]=og(c[d+28>>2]|0)|0;c[l+12>>2]=0;c[g+152>>2]=l;l=Qc[c[(c[a>>2]|0)+180>>2]&255](a,g,b)|0;c[f>>2]=l;if((l|0)==0){k=0;i=e;return k|0}c[(Gma(h,b)|0)>>2]=l;k=l;i=e;return k|0}else{l=A_a(c[j+176>>2]|0)|0;h=c[l+8>>2]|0;f=c[a+16>>2]|0;if((h|0)==(og(c[f+28>>2]|0)|0)){k=j;i=e;return k|0}j=c[(c[a>>2]|0)+156>>2]|0;h=pg(c[f+32>>2]|0)|0;k=Qc[j&255](a,b,(h|0)==(c[l+12>>2]|0)&1)|0;i=e;return k|0}return 0}function xQ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=wQ(b,d,0)|0;if((f|0)==0){c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;i=e;return}else{Ic[c[(c[f>>2]|0)+148>>2]&511](a,f);i=e;return}}function yQ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0;e=i;i=i+80|0;f=e+64|0;h=e+48|0;j=e+32|0;k=e+16|0;l=e;al(f,c[b+16>>2]|0);m=wQ(b,d,0)|0;if((m|0)!=0){Ic[c[(c[m>>2]|0)+148>>2]&511](h,m);zQ(f,b,h)}c[j+0>>2]=c[f+0>>2];c[j+4>>2]=c[f+4>>2];c[j+8>>2]=c[f+8>>2];c[j+12>>2]=c[f+12>>2];ld[c[(c[b>>2]|0)+184>>2]&255](k,b,d);if(!(+g[k>>2]>=+g[k+4>>2])?!(+g[k+8>>2]>=+g[k+12>>2]):0){Jla(j,k)}rYa(l,j,1.0);Mla(a,l);i=e;return}function zQ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+32|0;f=e;BQ(f,b);c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];rm(f,a);i=e;return}function AQ(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;f=i;i=i+32|0;g=f;h=wQ(a,b,0)|0;if((h|0)!=0){BQ(g,a);Wla(g,e);KZa(h,d,g);i=f;return}if((ZR(c)|0)==0){i=f;return}Of(c,d,e,0);i=f;return}function BQ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0;d=i;i=i+16|0;e=d;f=a+12|0;g[f>>2]=1.0;g[a>>2]=1.0;h=a+20|0;g[h>>2]=0.0;j=a+16|0;g[j>>2]=0.0;k=a+8|0;g[k>>2]=0.0;l=a+4|0;g[l>>2]=0.0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;m=b+16|0;Ml(c[(Xk(c[(c[m>>2]|0)+4>>2]|0)|0)+16>>2]|0,e);b=gf(c[m>>2]|0)|0;if((b|0)==180){n=+g[e+4>>2]- +g[e>>2];o=+g[e+12>>2]- +g[e+8>>2];g[a>>2]=-1.0;g[l>>2]=0.0;g[k>>2]=0.0;g[f>>2]=-1.0;g[j>>2]=n;g[h>>2]=o;p=n;q=o}else if((b|0)==270){o=+g[e+12>>2]- +g[e+8>>2];g[a>>2]=0.0;g[l>>2]=-1.0;g[k>>2]=1.0;g[f>>2]=0.0;g[j>>2]=0.0;g[h>>2]=o;p=0.0;q=o}else if((b|0)==90){o=+g[e+4>>2]- +g[e>>2];g[a>>2]=0.0;g[l>>2]=1.0;g[k>>2]=-1.0;g[f>>2]=0.0;g[j>>2]=o;g[h>>2]=0.0;p=o;q=0.0}else{g[a>>2]=1.0;g[l>>2]=0.0;g[k>>2]=0.0;g[f>>2]=1.0;g[j>>2]=0.0;g[h>>2]=0.0;p=0.0;q=0.0}g[j>>2]=+g[e>>2]+p;g[h>>2]=+g[e+8>>2]+q;i=d;return}function CQ(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;f=i;Of(c,d,e,0);i=f;return}function DQ(a,b){a=a|0;b=b|0;return}function EQ(a,b){a=a|0;b=b|0;return}function FQ(a,b){a=a|0;b=b|0;return}function GQ(a,b,c){a=a|0;b=b|0;c=c|0;return}function HQ(a,b,d){a=a|0;b=b|0;d=d|0;d=i;lZa(c[a+8>>2]|0);i=d;return}function IQ(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0;h=i;i=i+32|0;j=h+8|0;k=h;l=wQ(a,b,1)|0;if((l|0)==0){m=0;i=h;return m|0}c[a+24>>2]=1;pd[c[(c[a>>2]|0)+16>>2]&127](j,a,b,d);Yc[c[(c[a>>2]|0)+188>>2]&1](a,+(c[j>>2]|0),+(c[j+4>>2]|0),+(c[j+8>>2]|0),+(c[j+12>>2]|0));if((JQ(j,~~+g[f>>2],~~+g[f+4>>2])|0)==0){m=0;i=h;return m|0}j=c[(c[l>>2]|0)+40>>2]|0;gR(k,a,f);m=Qc[j&255](l,k,e)|0;i=h;return m|0}function JQ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;if(((c[a>>2]|0)<=(b|0)?(c[a+8>>2]|0)>(b|0):0)?(c[a+4>>2]|0)<=(d|0):0){f=(c[a+12>>2]|0)>(d|0)}else{f=0}i=e;return f&1|0}function KQ(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0;g=i;i=i+32|0;h=g+8|0;j=g;k=wQ(a,b,0)|0;if((k|0)==0){l=0;i=g;return l|0}pd[c[(c[a>>2]|0)+16>>2]&127](h,a,b,d);Yc[c[(c[a>>2]|0)+188>>2]&1](a,+(c[h>>2]|0),+(c[h+4>>2]|0),+(c[h+8>>2]|0),+(c[h+12>>2]|0));h=c[(c[k>>2]|0)+44>>2]|0;gR(j,a,f);Qc[h&255](k,j,e)|0;l=1;i=g;return l|0}function LQ(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;d=i;i=i+16|0;g=d;h=wQ(a,b,0)|0;if((h|0)==0){j=0;i=d;return j|0}b=c[(c[h>>2]|0)+36>>2]|0;gR(g,a,f);Qc[b&255](h,g,e)|0;j=1;i=d;return j|0}function MQ(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0;d=i;i=i+16|0;h=d;j=a+52|0;if(!(!(+g[j>>2]!=+g[f>>2])?!(+g[a+56>>2]!=+g[f+4>>2]):0)){k=f;l=c[k+4>>2]|0;m=j;c[m>>2]=c[k>>2];c[m+4>>2]=l}l=wQ(a,b,0)|0;if((l|0)==0){n=0;i=d;return n|0}b=c[(c[l>>2]|0)+72>>2]|0;gR(h,a,f);Qc[b&255](l,h,e)|0;n=1;i=d;return n|0}function NQ(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0;d=i;i=i+16|0;h=d;if((c[a+24>>2]|0)==0){j=0;i=d;return j|0}k=wQ(a,b,1)|0;if((k|0)==0){j=0;i=d;return j|0}b=c[(c[k>>2]|0)+76>>2]|0;gR(h,a,g);j=id[b&511](k,f,h,e)|0;i=d;return j|0}function OQ(a){a=a|0;return a|0}function PQ(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;d=i;i=i+16|0;g=d;h=wQ(a,b,1)|0;if((h|0)==0){j=0;i=d;return j|0}b=c[(c[h>>2]|0)+64>>2]|0;gR(g,a,f);Qc[b&255](h,g,e)|0;j=1;i=d;return j|0}function QQ(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;d=i;i=i+16|0;g=d;h=wQ(a,b,0)|0;if((h|0)==0){j=0;i=d;return j|0}b=c[(c[h>>2]|0)+68>>2]|0;gR(g,a,f);Qc[b&255](h,g,e)|0;j=1;i=d;return j|0}function RQ(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;d=i;i=i+16|0;g=d;h=wQ(a,b,0)|0;if((h|0)==0){j=0;i=d;return j|0}b=c[(c[h>>2]|0)+60>>2]|0;gR(g,a,f);Qc[b&255](h,g,e)|0;j=1;i=d;return j|0}function SQ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;b=i;if((c[a+24>>2]|0)==0){f=0;i=b;return f|0}g=wQ(a,TQ(a)|0,0)|0;if((g|0)==0){f=0;i=b;return f|0}f=Qc[c[(c[g>>2]|0)+24>>2]&255](g,d&65535,e)|0;i=b;return f|0}function TQ(a){a=a|0;var b=0,d=0,e=0;b=i;d=Zh(c[(c[a+12>>2]|0)+16>>2]|0)|0;if((d|0)==0){e=0;i=b;return e|0}e=bi(d,vl(c[(c[a+20>>2]|0)+8>>2]|0)|0,1)|0;i=b;return e|0}function UQ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;b=i;if((c[a+24>>2]|0)==0){f=0;i=b;return f|0}g=wQ(a,TQ(a)|0,0)|0;if((g|0)==0){f=0;i=b;return f|0}f=Qc[c[(c[g>>2]|0)+32>>2]&255](g,d&65535,e)|0;i=b;return f|0}function VQ(a,b){a=a|0;b=b|0;return}function WQ(a,b){a=a|0;b=b|0;return}function XQ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;d=i;i=i+16|0;e=d;f=vl(c[b+8>>2]|0)|0;g=bi(Zh(c[(c[a+12>>2]|0)+16>>2]|0)|0,f,1)|0;f=wQ(a,g,1)|0;if((f|0)!=0){Rc[c[(c[f>>2]|0)+80>>2]&1023](f)}c[a+24>>2]=1;pd[c[(c[a>>2]|0)+16>>2]&127](e,a,g,b);Yc[c[(c[a>>2]|0)+188>>2]&1](a,+(c[e>>2]|0),+(c[e+4>>2]|0),+(c[e+8>>2]|0),+(c[e+12>>2]|0));i=d;return 1}function YQ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;b=i;if((c[a+24>>2]|0)==0){i=b;return 1}e=TQ(a)|0;ZQ(a,e,d);d=wQ(a,e,0)|0;if((d|0)!=0){Rc[c[(c[d>>2]|0)+84>>2]&1023](d)}if(((af(c[a+16>>2]|0)|0)+ -1|0)>>>0<3){_Q(a,e,1);i=b;return 1}else{_Q(a,e,0);i=b;return 1}return 0}function ZQ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e;if((dd[c[(c[a>>2]|0)+164>>2]&511](a,b)|0)==0){i=e;return}g=_h(c[a+12>>2]|0)|0;c[f>>2]=1;h=a+16|0;zS(g,c[h>>2]|0,b,f,d);if((c[f>>2]|0)==0){Qc[c[(c[a>>2]|0)+156>>2]&255](a,b,0)|0;i=e;return}AS(g,c[h>>2]|0,b,f,d);if((c[f>>2]|0)==0){Qc[c[(c[a>>2]|0)+156>>2]&255](a,b,0)|0;i=e;return}else{Ic[c[(c[a>>2]|0)+168>>2]&511](a,b);BS(g,c[h>>2]|0,b);CS(g,c[h>>2]|0,b);i=e;return}}function _Q(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;c[a+24>>2]=0;pd[c[(c[a>>2]|0)+16>>2]&127](f,a,b,c[a+16>>2]|0);Yc[c[(c[a>>2]|0)+188>>2]&1](a,+(c[f>>2]|0),+(c[f+4>>2]|0),+(c[f+8>>2]|0),+(c[f+12>>2]|0));if((d|0)==0){i=e;return}cR(a,b);i=e;return}function $Q(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0;d=i;i=i+32|0;e=d+8|0;f=d;QR(a);c[a+156>>2]=0;c[a+24>>2]=b;aR(e,b);c[a+0>>2]=c[e+0>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];e=b+16|0;h=(cf(c[e>>2]|0)|0)<<24&16777216;if((hf(c[e>>2]|0,f)|0)!=0){j=c[f>>2]|0;c[a+36>>2]=2;g[a+40>>2]=+(j&255|0)/255.0;g[a+44>>2]=+(j>>>8&255|0)/255.0;g[a+48>>2]=+(j>>>16&255|0)/255.0;g[a+52>>2]=0.0}if((kf(c[e>>2]|0,f)|0)!=0){j=c[f>>2]|0;c[a+72>>2]=2;g[a+76>>2]=+(j&255|0)/255.0;g[a+80>>2]=+(j>>>8&255|0)/255.0;g[a+84>>2]=+(j>>>16&255|0)/255.0;g[a+88>>2]=0.0}j=a+92|0;c[j>>2]=1;k=a+96|0;c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;if((mf(c[e>>2]|0,f)|0)!=0){l=c[f>>2]|0;c[j>>2]=2;g[k>>2]=+(l&255|0)/255.0;g[a+100>>2]=+(l>>>8&255|0)/255.0;g[a+104>>2]=+(l>>>16&255|0)/255.0;g[a+108>>2]=0.0}l=a+136|0;g[l>>2]=+nf(c[e>>2]|0);k=a+68|0;c[k>>2]=ll(c[e>>2]|0)|0;switch(ml(c[e>>2]|0)|0){case 1:{c[a+64>>2]=1;c[a+140>>2]=3;c[a+144>>2]=3;c[a+148>>2]=0;break};case 2:{c[a+64>>2]=2;c[k>>2]=c[k>>2]<<1;break};case 0:{c[a+64>>2]=0;break};case 3:{c[a+64>>2]=3;c[k>>2]=c[k>>2]<<1;break};case 4:{c[a+64>>2]=4;break};default:{}}c[a+32>>2]=(!(+g[l>>2]<=0.0)?1677721600:1686110208)|h;c[a+16>>2]=c[(c[b+12>>2]|0)+28>>2];i=d;return}function aR(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0.0,j=0.0;d=i;i=i+16|0;e=d;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;f=b+16|0;Ml(c[(Xk(c[(c[f>>2]|0)+4>>2]|0)|0)+16>>2]|0,e);h=+g[e+4>>2]- +g[e>>2];j=+g[e+12>>2]- +g[e+8>>2];e=(((gf(c[f>>2]|0)|0)/90|0)&1|0)==0;g[a>>2]=0.0;g[a+8>>2]=0.0;f=a+4|0;if(e){g[f>>2]=h;g[a+12>>2]=j;i=d;return}else{g[f>>2]=j;g[a+12>>2]=h;i=d;return}}function bR(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;c[f>>2]=0;if((Dma(a,b,f)|0)==0){i=e;return}c[d>>2]=c[f>>2];i=e;return}function cR(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;c[e>>2]=0;f=a+28|0;bR(f,b,e);a=c[e>>2]|0;if((a|0)==0){Jma(f,b);i=d;return}e=A_a(c[a+176>>2]|0)|0;c[e+4>>2]=0;yZa(a);Rc[c[(c[a>>2]|0)+4>>2]&1023](a);$1a(e);Jma(f,b);i=d;return}function dR(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0;e=i;i=i+48|0;f=e+24|0;h=e;if((d|0)!=0?(j=c[d+4>>2]|0,(j|0)!=0):0){c[f+0>>2]=c[j+0>>2];c[f+4>>2]=c[j+4>>2];c[f+8>>2]=c[j+8>>2];c[f+12>>2]=c[j+12>>2];c[f+16>>2]=c[j+16>>2];c[f+20>>2]=c[j+20>>2];BQ(h,b);Wla(h,f);c[a+0>>2]=c[h+0>>2];c[a+4>>2]=c[h+4>>2];c[a+8>>2]=c[h+8>>2];c[a+12>>2]=c[h+12>>2];c[a+16>>2]=c[h+16>>2];c[a+20>>2]=c[h+20>>2];i=e;return}g[a>>2]=1.0;g[a+4>>2]=0.0;g[a+8>>2]=0.0;g[a+12>>2]=1.0;g[a+16>>2]=0.0;g[a+20>>2]=0.0;i=e;return}function eR(a,b,c){a=a|0;b=b|0;c=c|0;c=i;Mna(a,1292088,-1);i=c;return}function fR(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+48|0;f=e+32|0;g=e+16|0;h=e;j=wQ(b,d,0)|0;if((j|0)==0){c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;i=e;return}Ic[c[(c[j>>2]|0)+104>>2]&511](g,j);zQ(f,b,g);g=(c[d+24>>2]|0)+20|0;c[h+0>>2]=c[g+0>>2];c[h+4>>2]=c[g+4>>2];c[h+8>>2]=c[g+8>>2];c[h+12>>2]=c[g+12>>2];if((Pla(h,f)|0)==0){c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;i=e;return}else{c[a+0>>2]=c[f+0>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];i=e;return}}function gR(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0;e=i;i=i+48|0;f=e+24|0;h=e;g[f+12>>2]=1.0;g[f>>2]=1.0;g[f+20>>2]=0.0;g[f+16>>2]=0.0;g[f+8>>2]=0.0;g[f+4>>2]=0.0;BQ(h,b);Ula(f,h);h=d;d=c[h+4>>2]|0;b=a;c[b>>2]=c[h>>2];c[b+4>>2]=d;fma(f,a,a+4|0);i=e;return}function hR(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+32|0;f=e;BQ(f,b);b=d;d=c[b+4>>2]|0;g=a;c[g>>2]=c[b>>2];c[g+4>>2]=d;fma(f,a,a+4|0);i=e;return}function iR(a,b){a=a|0;b=b|0;return 0}function jR(a,b){a=a|0;b=b|0;return}function kR(a,b,c){a=a|0;b=b|0;c=c|0;return}function lR(a){a=a|0;var b=0;b=i;mR(a);i=b;return}function mR(a){a=a|0;var b=0,d=0;b=i;if((a|0)!=0?(d=c[a+32>>2]|0,(d|0)!=0):0){Rc[d&1023](a)}i=b;return}function nR(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;d=i;i=i+16|0;b=d;pf(b,c[a+16>>2]|0);Pna(e+32|0,b);Lna(b);i=d;return}function oR(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return}function pR(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return 0}function qR(a,b){a=a|0;b=b|0;return}function rR(a,b){a=a|0;b=b|0;return}function sR(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;c=i;d=wQ(a,b,0)|0;i=c;return d|0}function tR(a){a=a|0;return}function uR(a){a=a|0;return}function vR(a){a=a|0;return c[(c[a+12>>2]|0)+28>>2]|0}function wR(a){a=a|0;return c[(c[a+ -4+12>>2]|0)+28>>2]|0}function xR(a,b){a=a|0;b=b|0;return}function yR(a,b){a=a|0;b=b|0;return 0}function zR(a,b){a=a|0;b=b|0;return 0}function AR(a,b){a=a|0;b=b|0;return 0}function BR(a,b){a=a|0;b=b|0;return}function CR(a,b){a=a|0;b=b|0;return}function DR(a,b){a=a|0;b=b|0;return}function ER(a,b,d,e,f){a=a|0;b=+b;d=+d;e=+e;f=+f;var g=0,h=0;g=i;h=vl(c[(c[a+16>>2]|0)+8>>2]|0)|0;Bg(c[(c[a+12>>2]|0)+12>>2]|0,h,b,d,e,f);i=g;return}function FR(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;pQ(a,b,d);c[a>>2]=669760;c[a+4>>2]=669960;c[a+60>>2]=0;c[a+64>>2]=0;i=e;return}function GR(a){a=a|0;var b=0;b=i;sQ(a);$1a(a);i=b;return}function HR(a){a=a|0;var b=0;b=i;GR(a+ -4|0);i=b;return}function IR(a){a=a|0;var b=0;b=i;sQ(a+ -4|0);i=b;return}function JR(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;c[a+60>>2]=1;pd[c[(c[a>>2]|0)+16>>2]&127](f,a,b,d);Yc[c[(c[a>>2]|0)+188>>2]&1](a,+(c[f>>2]|0),+(c[f+4>>2]|0),+(c[f+8>>2]|0),+(c[f+12>>2]|0));i=e;return}function KR(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;c[a+60>>2]=0;pd[c[(c[a>>2]|0)+16>>2]&127](f,a,b,d);Yc[c[(c[a>>2]|0)+188>>2]&1](a,+(c[f>>2]|0),+(c[f+4>>2]|0),+(c[f+8>>2]|0),+(c[f+12>>2]|0));lZa(c[a+8>>2]|0);i=e;return}function LR(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0;e=i;i=i+32|0;h=e+16|0;j=e;al(h,d);if((Qla(h,+g[f>>2],+g[f+4>>2])|0)==0){k=0;i=e;return k|0}c[a+64>>2]=1;c[a+24>>2]=1;pd[c[(c[a>>2]|0)+16>>2]&127](j,a,b,d);Yc[c[(c[a>>2]|0)+188>>2]&1](a,+(c[j>>2]|0),+(c[j+4>>2]|0),+(c[j+8>>2]|0),+(c[j+12>>2]|0));k=1;i=e;return k|0}function MR(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0;e=i;i=i+32|0;h=e+16|0;j=e;al(h,d);if((Qla(h,+g[f>>2],+g[f+4>>2])|0)==0){k=0;i=e;return k|0}c[a+64>>2]=0;pd[c[(c[a>>2]|0)+16>>2]&127](j,a,b,d);Yc[c[(c[a>>2]|0)+188>>2]&1](a,+(c[j>>2]|0),+(c[j+4>>2]|0),+(c[j+8>>2]|0),+(c[j+12>>2]|0));k=1;i=e;return k|0}function NR(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return 1}function OR(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;g=i;if((io(c[(ef(d)|0)+8>>2]|0)|0)!=3){Of(d,e,f,0);i=g;return}if((c[a+64>>2]|0)!=0){if(($e(d,2)|0)==0){Of(d,e,f,0);i=g;return}else{Of(d,e,f,2);i=g;return}}if((c[a+60>>2]|0)==0){Of(d,e,f,0);i=g;return}if(($e(d,1)|0)==0){Of(d,e,f,0);i=g;return}else{Of(d,e,f,1);i=g;return}}function PR(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=i;Tc[c[(c[a>>2]|0)+20>>2]&31](a,b,d,e,f,g);i=h;return}function QR(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+68|0;e=a+0|0;f=e+68|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));c[d>>2]=1;d=a+132|0;e=a+72|0;f=e+60|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));c[d>>2]=255;g[a+136>>2]=9.0;c[a+140>>2]=3;d=a+144|0;e=a+168|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;g[e>>2]=1.0;g[a+172>>2]=0.0;g[a+176>>2]=0.0;g[a+180>>2]=1.0;g[a+184>>2]=0.0;g[a+188>>2]=0.0;i=b;return}function RR(a,b){a=a|0;b=b|0;var d=0;d=i;c[a>>2]=67e4;c[a+4>>2]=b;zma(a+8|0,10);c[a+32>>2]=0;i=d;return}function SR(a){a=a|0;var b=0;b=i;TR(a);$1a(a);i=b;return}function TR(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+16|0;d=b+8|0;e=b+4|0;f=b;c[a>>2]=67e4;g=a+8|0;h=(c[a+16>>2]|0)==0;c[d>>2]=h?0:-1;if(h){Ama(g);Bma(g);i=b;return}do{c[e>>2]=0;c[f>>2]=0;UR(g,d,e,f);h=c[f>>2]|0;if((h|0)!=0){Rc[c[(c[h>>2]|0)+12>>2]&1023](h)}}while((c[d>>2]|0)!=0);Ama(g);Bma(g);i=b;return}function UR(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;i=i+16|0;g=f+4|0;h=f;c[g>>2]=0;c[h>>2]=0;Cma(a,b,g,h);c[d>>2]=c[g>>2];c[e>>2]=c[h>>2];i=f;return}function VR(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;b=i;i=i+16|0;a=b;al(a,c);c=(Qla(a,+g[d>>2],+g[d+4>>2])|0)!=0&1;i=b;return c|0}function WR(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;i=i+32|0;g=f+16|0;h=f;j=XR(b,e,0)|0;if((j|0)==0){b=Xk(c[e+4>>2]|0)|0;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;Ml(c[b+16>>2]|0,g);rYa(h,g,1.0);Mla(a,h);i=f;return}else{pd[c[(c[j>>2]|0)+16>>2]&127](a,j,d,e);i=f;return}}function XR(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+16|0;f=e;c[f>>2]=0;g=a+8|0;vS(g,b,f)|0;h=c[f>>2]|0;if((h|0)!=0){j=h;i=e;return j|0}if((d|0)==0){j=0;i=e;return j|0}switch(af(b)|0){case 1:{d=Z1a(68)|0;fT(d,c[a+4>>2]|0,b);c[f>>2]=d;k=d;break};case 3:{d=Z1a(68)|0;nT(d,c[a+4>>2]|0,b);c[f>>2]=d;k=d;break};case 5:{d=Z1a(104)|0;QS(d,c[a+4>>2]|0,b);c[f>>2]=d;k=d;break};case 6:{d=Z1a(84)|0;yT(d,c[a+4>>2]|0,b);c[f>>2]=d;k=d;break};case 4:{d=Z1a(88)|0;sU(d,c[a+4>>2]|0,b);c[f>>2]=d;k=d;break};case 2:{d=Z1a(68)|0;hU(d,c[a+4>>2]|0,b);c[f>>2]=d;k=d;break};default:{c[f>>2]=0;j=0;i=e;return j|0}}if((k|0)==0){j=0;i=e;return j|0}c[(Gma(g,b)|0)>>2]=k;j=k;i=e;return j|0}function YR(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0;j=i;i=i+64|0;k=j+40|0;l=j+28|0;m=j;if((ql(c[(c[d+4>>2]|0)+16>>2]|0)|0)==0){i=j;return}n=XR(a,d,0)|0;if((n|0)!=0?(OQ(c[n+24>>2]|0)|0)!=0:0){Tc[c[(c[n>>2]|0)+20>>2]&31](n,b,d,e,f,h);if((ji(c[(Zh(c[(c[a+4>>2]|0)+16>>2]|0)|0)+32>>2]|0)|0)!=(d|0)){i=j;return}ld[c[(c[n>>2]|0)+184>>2]&255](k,n,b);n=k+4|0;if(+g[k>>2]>=+g[n>>2]){i=j;return}o=k+8|0;p=k+12|0;if(+g[o>>2]>=+g[p>>2]){i=j;return}OIa(l);QIa(l,5);WIa(l,0,+g[k>>2],+g[p>>2],6);WIa(l,1,+g[k>>2],+g[o>>2],2);WIa(l,2,+g[n>>2],+g[o>>2],2);WIa(l,3,+g[n>>2],+g[p>>2],2);WIa(l,4,+g[k>>2],+g[p>>2],2);dJa(m);hJa(m,1);p=m+8|0;g[c[p>>2]>>2]=1.0;g[m+12>>2]=0.0;g[m+24>>2]=1.0;UGa(e,l,f,m,0,-16777216,1,0)|0;gJa(c[p>>2]|0);PIa(c[l+4>>2]|0);i=j;return}l=XR(a,d,0)|0;if((l|0)==0){Of(d,e,f,0)}else{Tc[c[(c[l>>2]|0)+24>>2]&31](l,b,d,e,f,h)}if(((cf(d)|0)&1|0)!=0){i=j;return}if((_R(d)|0)==0){i=j;return}Rf(d,e,b);i=j;return}function ZR(a){a=a|0;var b=0,d=0;b=i;d=ql(c[(c[a+4>>2]|0)+16>>2]|0)|0;i=b;return d|0}function _R(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((af(a)|0)==1){d=1;i=b;return d|0}e=XG(c[(vl(c[a+8>>2]|0)|0)+8>>2]|0)|0;if((e&288|0)==0){f=(e&8|0)!=0}else{f=1}d=f&1;i=b;return d|0}function $R(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=XR(a,b,0)|0;if((e|0)==0){i=d;return}Ic[c[(c[e>>2]|0)+28>>2]&511](e,b);i=d;return}function aS(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=XR(a,b,0)|0;if((e|0)==0){i=d;return}Ic[c[(c[e>>2]|0)+32>>2]&511](e,b);i=d;return}function bS(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=XR(a,b,0)|0;if((e|0)!=0){Ic[c[(c[e>>2]|0)+36>>2]&511](e,b)}cS(a,b);i=d;return}function cS(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;c[e>>2]=0;f=a+8|0;if((vS(f,b,e)|0)==0){i=d;return}a=c[e>>2]|0;if((a|0)!=0){Rc[c[(c[a>>2]|0)+12>>2]&1023](a)}Jma(f,b);i=d;return}function dS(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;i=i+64|0;g=f+48|0;h=f;j=a+32|0;if((c[j>>2]|0)==0?(ld[c[(c[d>>2]|0)+24>>2]&255](g,d,0),(c[g>>2]|0)!=0):0){c[j>>2]=1;g=d+32|0;k=pg(c[g>>2]|0)|0;Bf(d);l=h+44|0;m=h+0|0;n=m+44|0;do{c[m>>2]=0;m=m+4|0}while((m|0)<(n|0));c[l>>2]=1;c[h>>2]=e>>>1&1;c[h+4>>2]=e&1;mg(d,0,h,b)|0;c[j>>2]=0;if((Cf(c[d+24>>2]|0)|0)!=0?(j=XR(a,d,0)|0,(j|0)!=0):0){e=pg(c[g>>2]|0)|0;Qc[c[(c[j>>2]|0)+156>>2]&255](j,b,(e|0)==(k|0)&1)|0}Bh(h)}h=XR(a,d,1)|0;if((h|0)==0){i=f;return}ld[c[(c[h>>2]|0)+40>>2]&255](h,b,d);i=f;return}function eS(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;i=i+64|0;g=f+48|0;h=f;j=a+32|0;if((c[j>>2]|0)==0?(ld[c[(c[d>>2]|0)+24>>2]&255](g,d,1),(c[g>>2]|0)!=0):0){c[j>>2]=1;g=d+32|0;k=pg(c[g>>2]|0)|0;Bf(d);l=h+44|0;m=h+0|0;n=m+44|0;do{c[m>>2]=0;m=m+4|0}while((m|0)<(n|0));c[l>>2]=1;c[h>>2]=e>>>1&1;c[h+4>>2]=e&1;mg(d,1,h,b)|0;c[j>>2]=0;if((Cf(c[d+24>>2]|0)|0)!=0?(j=XR(a,d,0)|0,(j|0)!=0):0){e=pg(c[g>>2]|0)|0;Qc[c[(c[j>>2]|0)+156>>2]&255](j,b,(k|0)==(e|0)&1)|0}Bh(h)}h=XR(a,d,0)|0;if((h|0)==0){i=f;return}ld[c[(c[h>>2]|0)+44>>2]&255](h,b,d);i=f;return}function fS(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;g=i;i=i+64|0;h=g+16|0;j=g;k=g+8|0;l=a+32|0;if((c[l>>2]|0)==0){m=c[(c[a>>2]|0)+20>>2]|0;n=f;o=c[n+4>>2]|0;p=j;c[p>>2]=c[n>>2];c[p+4>>2]=o;c[h+0>>2]=c[j+0>>2];c[h+4>>2]=c[j+4>>2];if((id[m&511](a,b,d,h)|0)!=0?(ld[c[(c[d>>2]|0)+24>>2]&255](k,d,2),(c[k>>2]|0)!=0):0){c[l>>2]=1;k=d+32|0;m=pg(c[k>>2]|0)|0;Bf(d);j=h+44|0;o=h+0|0;p=o+44|0;do{c[o>>2]=0;o=o+4|0}while((o|0)<(p|0));c[j>>2]=1;c[h>>2]=e>>>1&1;c[h+4>>2]=e&1;mg(d,2,h,b)|0;c[l>>2]=0;if((gS(b,d)|0)==0){Bh(h);q=1;i=g;return q|0}if((Cf(c[d+24>>2]|0)|0)!=0?(l=XR(a,d,0)|0,(l|0)!=0):0){j=pg(c[k>>2]|0)|0;Qc[c[(c[l>>2]|0)+156>>2]&255](l,b,(m|0)==(j|0)&1)|0}Bh(h)}}h=XR(a,d,0)|0;if((h|0)==0){q=0;i=g;return q|0}q=ed[c[(c[h>>2]|0)+48>>2]&127](h,b,d,e,f)|0;i=g;return q|0}function gS(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((a|0)==0){e=0;i=d;return e|0}e=xi(a,Xk(c[b+4>>2]|0)|0)|0;i=d;return e|0}function hS(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0;h=i;i=i+32|0;j=h+8|0;k=h+4|0;l=h;m=Zh(c[(c[a+4>>2]|0)+16>>2]|0)|0;if(!(((af(d)|0)+ -1|0)>>>0<3?(pd[c[(c[a>>2]|0)+24>>2]&127](j,a,b,d),(JQ(j,~~+g[f>>2],~~+g[f+4>>2])|0)==0):0)){ki(m,d)}j=XR(a,d,0)|0;if((j|0)==0){n=0}else{n=ed[c[(c[j>>2]|0)+52>>2]&127](j,b,d,e,f)|0}if((ji(c[m+32>>2]|0)|0)==(d|0)?(c[k>>2]=0,c[l>>2]=0,iS(a,d,b,l,k,e),(c[k>>2]|0)!=0):0){o=1;i=h;return o|0}o=n;i=h;return o|0}function iS(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;h=i;i=i+64|0;j=h+48|0;k=h;l=a+32|0;if((c[l>>2]|0)!=0){i=h;return}ld[c[(c[b>>2]|0)+24>>2]&255](j,b,3);if((c[j>>2]|0)==0){i=h;return}c[l>>2]=1;j=b+28|0;m=og(c[j>>2]|0)|0;n=b+32|0;o=pg(c[n>>2]|0)|0;p=k+44|0;q=k+0|0;r=q+44|0;do{c[q>>2]=0;q=q+4|0}while((q|0)<(r|0));c[p>>2]=1;c[k>>2]=g>>>1&1;c[k+4>>2]=g&1;mg(b,3,k,d)|0;c[l>>2]=0;if((gS(d,b)|0)!=0){if((m|0)!=(og(c[j>>2]|0)|0)){j=XR(a,b,0)|0;if((j|0)!=0){b=pg(c[n>>2]|0)|0;Qc[c[(c[j>>2]|0)+156>>2]&255](j,d,(o|0)==(b|0)&1)|0}c[e>>2]=1}}else{c[f>>2]=1}Bh(k);i=h;return}function jS(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;h=XR(a,d,0)|0;if((h|0)==0){j=0;i=g;return j|0}j=ed[c[(c[h>>2]|0)+56>>2]&127](h,b,d,e,f)|0;i=g;return j|0}function kS(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;h=XR(a,d,1)|0;if((h|0)==0){j=0;i=g;return j|0}j=ed[c[(c[h>>2]|0)+60>>2]&127](h,b,d,e,f)|0;i=g;return j|0}function lS(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0;h=i;j=XR(a,d,0)|0;if((j|0)==0){k=0;i=h;return k|0}k=Wc[c[(c[j>>2]|0)+64>>2]&31](j,b,d,e,f,g)|0;i=h;return k|0}function mS(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;h=XR(a,d,0)|0;if((h|0)==0){j=0;i=g;return j|0}j=ed[c[(c[h>>2]|0)+68>>2]&127](h,b,d,e,f)|0;i=g;return j|0}function nS(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;h=XR(a,d,0)|0;if((h|0)==0){j=0;i=g;return j|0}j=ed[c[(c[h>>2]|0)+72>>2]&127](h,b,d,e,f)|0;i=g;return j|0}function oS(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;h=XR(a,d,0)|0;if((h|0)==0){j=0;i=g;return j|0}j=ed[c[(c[h>>2]|0)+76>>2]&127](h,b,d,e,f)|0;i=g;return j|0}function pS(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;g=XR(a,b,0)|0;if((g|0)==0){h=0;i=f;return h|0}h=id[c[(c[g>>2]|0)+80>>2]&511](g,b,d,e)|0;i=f;return h|0}function qS(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;if((d|0)!=9){g=XR(a,b,0)|0;if((g|0)==0){h=0}else{h=id[c[(c[g>>2]|0)+84>>2]&511](g,b,d,e)|0}}else{h=1}i=f;return h|0}function rS(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=XR(a,b,0)|0;if((e|0)==0){i=d;return}Ic[c[(c[e>>2]|0)+88>>2]&511](e,b);i=d;return}function sS(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=XR(a,b,0)|0;if((e|0)==0){i=d;return}Ic[c[(c[e>>2]|0)+92>>2]&511](e,b);i=d;return}function tS(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;i=i+64|0;f=e+48|0;g=e;if((b|0)==0){h=0;i=e;return h|0}j=a+32|0;if((c[j>>2]|0)==0?(ld[c[(c[b>>2]|0)+24>>2]&255](f,b,4),(c[f>>2]|0)!=0):0){c[j>>2]=1;f=b+32|0;k=pg(c[f>>2]|0)|0;Bf(b);l=_k(c[b+8>>2]|0)|0;m=g+44|0;n=g+0|0;o=n+44|0;do{c[n>>2]=0;n=n+4|0}while((n|0)<(o|0));c[m>>2]=1;c[g>>2]=d>>>1&1;c[g+4>>2]=d&1;m=XR(a,b,1)|0;if((m|0)==0){Bh(g);h=0;i=e;return h|0}pd[c[(c[m>>2]|0)+136>>2]&127](m,l,4,g);mg(b,4,g,l)|0;c[j>>2]=0;if((Cf(c[b+24>>2]|0)|0)!=0?(j=XR(a,b,0)|0,(j|0)!=0):0){m=pg(c[f>>2]|0)|0;Qc[c[(c[j>>2]|0)+156>>2]&255](j,l,(k|0)==(m|0)&1)|0}Bh(g)}g=XR(a,b,1)|0;if((g|0)==0){h=1;i=e;return h|0}h=(Qc[c[(c[g>>2]|0)+96>>2]&255](g,b,d)|0)!=0&1;i=e;return h|0}function uS(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;i=i+64|0;f=e+48|0;g=e;if((b|0)==0){h=0;i=e;return h|0}j=XR(a,b,0)|0;if((j|0)==0){h=1;i=e;return h|0}if((Qc[c[(c[j>>2]|0)+100>>2]&255](j,b,d)|0)==0){h=0;i=e;return h|0}k=a+32|0;if((c[k>>2]|0)!=0){h=1;i=e;return h|0}ld[c[(c[b>>2]|0)+24>>2]&255](f,b,5);if((c[f>>2]|0)==0){h=1;i=e;return h|0}c[k>>2]=1;Bf(b);f=_k(c[b+8>>2]|0)|0;a=g+44|0;l=g+0|0;m=l+44|0;do{c[l>>2]=0;l=l+4|0}while((l|0)<(m|0));c[a>>2]=1;c[g>>2]=d>>>1&1;c[g+4>>2]=d&1;pd[c[(c[j>>2]|0)+136>>2]&127](j,f,5,g);mg(b,5,g,f)|0;c[k>>2]=0;Bh(g);h=1;i=e;return h|0}function vS(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;c[f>>2]=0;if((Dma(a,b,f)|0)==0){g=0;i=e;return g|0}c[d>>2]=c[f>>2];g=1;i=e;return g|0}function wS(a,b,d,e,f,h){a=a|0;b=b|0;d=+d;e=+e;f=f|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0,t=0.0;a=i;i=i+32|0;j=a+16|0;k=a;l=j+8|0;m=j+4|0;n=j+12|0;c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;o=c[(c[b>>2]|0)+8>>2]|0;g[m>>2]=+g[(vl(o)|0)+96>>2];g[l>>2]=+g[(vl(o)|0)+100>>2];Hla(j);al(k,c[b>>2]|0);o=(gf(c[b>>2]|0)|0)/90|0;if((o|0)==3){p=+g[k>>2]- +g[j>>2];q=+g[m>>2]- +g[k+4>>2]}else if((o|0)==1){p=+g[m>>2]- +g[k+4>>2];q=+g[k>>2]- +g[j>>2]}else if((o|0)==2){p=+g[n>>2]- +g[k+12>>2];q=+g[k+8>>2]- +g[l>>2]}else{p=+g[k+8>>2]- +g[l>>2];q=+g[n>>2]- +g[k+12>>2]}if(e>140.0){r=d>140.0?d:140.0}else{r=e}if(p>r){s=0;t=r;c[f>>2]=s;g[h>>2]=t;i=a;return}if(q>r){s=1;t=r;c[f>>2]=s;g[h>>2]=t;i=a;return}k=q>p;s=k&1;t=k?q:p;c[f>>2]=s;g[h>>2]=t;i=a;return}function xS(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0;e=i;i=i+48|0;f=e+32|0;h=e+16|0;j=e;k=XR(a,c[b>>2]|0,1)|0;if((k|0)==0){i=e;return}l=b+4|0;xQ(f,k,c[l>>2]|0);zQ(j,k,f);zQ(h,k,d);vQ(k,c[l>>2]|0,d);Jla(j,h);m=+g[j>>2]+-.5;g[j>>2]=m;h=j+4|0;n=+g[h>>2]+.5;g[h>>2]=n;h=j+12|0;o=+g[h>>2]+.5;g[h>>2]=o;h=j+8|0;p=+g[h>>2]+-.5;g[h>>2]=p;h=c[a+4>>2]|0;a=vl(c[(c[b>>2]|0)+8>>2]|0)|0;Bg(c[h+12>>2]|0,a,m,o,n,p);i=e;return}function yS(a,b,d,e,f,g,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;k=i;j=XR(a,c[d>>2]|0,0)|0;Ic[c[(c[j>>2]|0)+160>>2]&511](j,h);i=k;return}function zS(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0;g=i;i=i+112|0;h=g+96|0;j=g+48|0;k=g;l=a+32|0;if((c[l>>2]|0)!=0){i=g;return}ld[c[(c[b>>2]|0)+24>>2]&255](h,b,12);if((c[h>>2]|0)==0){i=g;return}c[l>>2]=1;Bf(b);h=j+44|0;m=j+0|0;n=m+44|0;do{c[m>>2]=0;m=m+4|0}while((m|0)<(n|0));c[j>>2]=f>>>1&1;c[j+4>>2]=f&1;c[j+36>>2]=1;c[j+8>>2]=0;c[j+20>>2]=1;c[h>>2]=1;f=XR(a,b,0)|0;pd[c[(c[f>>2]|0)+136>>2]&127](f,d,12,j);Ic[c[(c[f>>2]|0)+148>>2]&511](f,d);PS(k,j);mg(b,12,j,d)|0;c[e>>2]=c[h>>2];c[l>>2]=0;Bh(k);Bh(j);i=g;return}function AS(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0;g=i;i=i+112|0;h=g+96|0;j=g+48|0;k=g;l=a+32|0;if((c[l>>2]|0)!=0){i=g;return}ld[c[(c[b>>2]|0)+24>>2]&255](h,b,14);if((c[h>>2]|0)==0){i=g;return}c[l>>2]=1;Bf(b);h=j+44|0;m=j+0|0;n=m+44|0;do{c[m>>2]=0;m=m+4|0}while((m|0)<(n|0));c[j>>2]=f>>>1&1;c[j+4>>2]=f&1;c[j+20>>2]=1;c[h>>2]=1;f=XR(a,b,0)|0;pd[c[(c[f>>2]|0)+136>>2]&127](f,d,14,j);Ic[c[(c[f>>2]|0)+148>>2]&511](f,d);PS(k,j);mg(b,14,j,d)|0;c[e>>2]=c[h>>2];c[l>>2]=0;Bh(k);Bh(j);i=g;return}function BS(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=a+32|0;if((c[f>>2]|0)!=0){i=e;return}hi(c[d+48>>2]|0)|0;bf(b)|0;c[f>>2]=0;i=e;return}function CS(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;if((c[a+32>>2]|0)==0){hi(c[d+48>>2]|0)|0;bf(b)|0;Lf()}else{i=e;return}}function DS(a,b){a=a|0;b=b|0;return}function ES(a,b){a=a|0;b=b|0;var d=0;d=i;Ic[c[(c[a>>2]|0)+116>>2]&511](a,b);i=d;return}function FS(a,b){a=a|0;b=b|0;return}function GS(a,b){a=a|0;b=b|0;return}function HS(a,b){a=a|0;b=b|0;return 0}function IS(a,b){a=a|0;b=b|0;return 0}function JS(a,b){a=a|0;b=b|0;return 0}function KS(a,b){a=a|0;b=b|0;return}function LS(a,b){a=a|0;b=b|0;return}function MS(a,b){a=a|0;b=b|0;return}function NS(a,b,d,e,f,g,h,j,k,l,m,n){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;e=i;i=i+64|0;b=e+48|0;o=e;p=XR(a,c[d>>2]|0,0)|0;q=a+32|0;if((c[q>>2]|0)!=0){i=e;return}a=c[d>>2]|0;ld[c[(c[a>>2]|0)+24>>2]&255](b,a,12);if((c[b>>2]|0)==0){i=e;return}c[q>>2]=1;b=c[d>>2]|0;a=og(c[b+28>>2]|0)|0;r=pg(c[b+32>>2]|0)|0;b=d+4|0;s=c[(c[b>>2]|0)+48>>2]|0;t=o+44|0;u=o+0|0;v=u+44|0;do{c[u>>2]=0;u=u+4|0}while((u|0)<(v|0));c[t>>2]=1;c[o>>2]=n>>>1&1;c[o+4>>2]=n&1;Pna(o+12|0,f);Pna(o+16|0,g);c[o+20>>2]=k;c[o+36>>2]=0;c[t>>2]=1;c[o+28>>2]=h;c[o+24>>2]=j;pd[c[(c[p>>2]|0)+136>>2]&127](p,c[b>>2]|0,12,o);Ic[c[(c[p>>2]|0)+148>>2]&511](p,c[b>>2]|0);j=(mg(c[d>>2]|0,12,o,c[b>>2]|0)|0)==0;h=(gS(c[b>>2]|0,c[d>>2]|0)|0)==0;do{if(j){if(h){c[m>>2]=1;c[q>>2]=0}else{w=15}}else{if(h){c[m>>2]=1;c[q>>2]=0;break}k=c[d>>2]|0;if((a|0)==(og(c[k+28>>2]|0)|0)){x=d}else{g=pg(c[k+32>>2]|0)|0;k=A_a(c[(Qc[c[(c[p>>2]|0)+156>>2]&255](p,c[b>>2]|0,(r|0)==(g|0)&1)|0)+176>>2]|0)|0;c[m>>2]=1;x=k}if((c[t>>2]|0)==0){Ic[c[(c[p>>2]|0)+152>>2]&511](p,c[x+4>>2]|0)}else{pd[c[(c[p>>2]|0)+140>>2]&127](p,c[x+4>>2]|0,12,o)}c[l>>2]=0;k=ji(c[s+32>>2]|0)|0;if((k|0)==(c[x>>2]|0)){w=15}else{ZQ(p,c[x+4>>2]|0,n);c[m>>2]=1;w=15}}}while(0);if((w|0)==15){c[q>>2]=0}Bh(o);i=e;return}function OS(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;f=i;g=XR(a,c[d>>2]|0,0)|0;if((b|0)!=0){i=f;return}Ic[c[(c[g>>2]|0)+160>>2]&511](g,c[e>>2]|0);i=f;return}function PS(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;c[a+0>>2]=c[b+0>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];Ona(a+12|0,b+12|0);Ona(a+16|0,b+16|0);e=a+20|0;f=b+20|0;c[e+0>>2]=c[f+0>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];Ona(a+32|0,b+32|0);f=a+36|0;a=b+36|0;c[f+0>>2]=c[a+0>>2];c[f+4>>2]=c[a+4>>2];c[f+8>>2]=c[a+8>>2];i=d;return}function QS(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;pQ(a,b,d);c[a>>2]=670168;c[a+4>>2]=670372;c[a+60>>2]=0;zma(a+64|0,10);Ija(a+88|0,4);i=e;return}function RS(a){a=a|0;var b=0;b=i;TS(a);$1a(a);i=b;return}function SS(a){a=a|0;var b=0;b=i;RS(a+ -4|0);i=b;return}function TS(a){a=a|0;var b=0,d=0,e=0;b=i;c[a>>2]=670168;c[a+4>>2]=670372;d=a+60|0;e=c[d>>2]|0;if((e|0)!=0){Rc[c[(c[e>>2]|0)+24>>2]&1023](e);c[d>>2]=0}Jja(c[a+88>>2]|0);Bma(a+64|0);sQ(a);i=b;return}function US(a){a=a|0;var b=0;b=i;TS(a+ -4|0);i=b;return}function VS(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0;d=i;$Q(a,b);e=b+16|0;f=((cf(c[e>>2]|0)|0)&2097152|0)==0;h=a+32|0;j=c[h>>2]|0;if(f){k=j}else{f=j|1;c[h>>2]=f;k=f}c[h>>2]=k|134217728;if((k&8388608|0)!=0){g[a+136>>2]=12.0}k=b+60|0;h=c[k>>2]|0;if((h|0)!=0){l=h;m=a+20|0;c[m>>2]=l;i=d;return}h=Z1a(64)|0;dQ(h,c[e>>2]|0,c[(c[b+12>>2]|0)+28>>2]|0);c[k>>2]=h;Ic[c[(c[h>>2]|0)+28>>2]&511](h,0);l=c[k>>2]|0;m=a+20|0;c[m>>2]=l;i=d;return}function WS(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;i=i+16|0;e=d;f=Z1a(292)|0;eXa(f);c[f+288>>2]=a;rZa(f,b);c[f+284>>2]=_h(c[a+12>>2]|0)|0;b=a+16|0;g=rf(c[b>>2]|0)|0;if((g|0)>0){h=f+268|0;j=0;do{qf(e,c[b>>2]|0,j);k=c[e>>2]|0;xXa(c[h>>2]|0,(k|0)==0?1292088:k+12|0);Lna(e);j=j+1|0}while((j|0)<(g|0))}a:do{if((uZa(c[f+56>>2]|0,1)|0)==0){g=rf(c[b>>2]|0)|0;if((g|0)>0){j=0;while(1){e=j+1|0;if((sf(c[b>>2]|0,j)|0)!=0){break}if((e|0)<(g|0)){j=e}else{break a}}CXa(c[f+268>>2]|0,j)}}else{g=a+64|0;Ama(g);e=rf(c[b>>2]|0)|0;if((e|0)>0){h=f+268|0;k=0;l=0;while(1){if((sf(c[b>>2]|0,l)|0)==0){m=k}else{if((k|0)==0){DXa(c[h>>2]|0,l);n=1}else{n=k}CXa(c[h>>2]|0,l);c[(Gma(g,l)|0)>>2]=0;m=n}l=l+1|0;if((l|0)==(e|0)){break}else{k=m}}}}}while(0);m=tf(c[b>>2]|0)|0;EXa(c[f+268>>2]|0,m);i=d;return f|0}function XS(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=i;f=UQ(a,b,c,d)|0;i=e;return f|0}function YS(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;i=i+16|0;e=d;f=wQ(a,b,0)|0;if((f|0)==0){g=0;i=d;return g|0}b=a+16|0;h=((cf(c[b>>2]|0)|0)&2097152|0)==0;j=f+268|0;f=c[j>>2]|0;if(h){h=GXa(f)|0;g=(h|0)!=(of(c[b>>2]|0)|0)&1;i=d;return g|0}b=JXa(f)|0;a:do{if((b|0)>0){f=a+64|0;h=0;k=0;while(1){if((HXa(c[j>>2]|0,h)|0)==0){l=k}else{c[e>>2]=0;if((ZS(f,h,e)|0)==0){g=1;break}l=k+1|0}h=h+1|0;if((h|0)>=(b|0)){m=l;break a}else{k=l}}i=d;return g|0}else{m=0}}while(0);g=(m|0)!=(c[a+72>>2]|0)&1;i=d;return g|0}function ZS(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;c[f>>2]=0;if((Dma(a,b,f)|0)==0){g=0;i=e;return g|0}c[d>>2]=c[f>>2];g=1;i=e;return g|0}function _S(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+32|0;e=d+16|0;f=d;g=wQ(a,b,0)|0;if((g|0)==0){i=d;return}Ija(e,4);Ija(f,4);b=a+16|0;h=rf(c[b>>2]|0)|0;if((h|0)>0){j=0;do{if((sf(c[b>>2]|0,j)|0)!=0){ph(e,j)|0}j=j+1|0}while((j|0)<(h|0))}IXa(g);Af(c[b>>2]|0);if(((cf(c[b>>2]|0)|0)&2097152|0)!=0){h=g+268|0;j=JXa(c[h>>2]|0)|0;if((j|0)>0){k=0;do{if((HXa(c[h>>2]|0,k)|0)!=0){zf(c[b>>2]|0,k);ph(f,k)|0}k=k+1|0}while((k|0)<(j|0))}}else{j=c[b>>2]|0;k=g+268|0;zf(j,GXa(c[k>>2]|0)|0);ph(f,GXa(c[k>>2]|0)|0)|0}Mf(c[b>>2]|0);Pf(c[b>>2]|0);lR(c[(c[a+12>>2]|0)+12>>2]|0);Jja(c[f>>2]|0);Jja(c[e>>2]|0);i=d;return}function $S(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+16|0;g=f+4|0;h=f;if((d|0)==14){j=a+16|0;if(((cf(c[j>>2]|0)|0)&2097152|0)!=0){Wna(e+32|0,1292088);i=f;return}k=wQ(a,b,0)|0;if((k|0)==0){i=f;return}b=GXa(c[k+268>>2]|0)|0;if(!((b|0)>-1)){i=f;return}qf(g,c[j>>2]|0,b);Pna(e+32|0,g);Lna(g);i=f;return}else if((d|0)==4|(d|0)==5){d=a+16|0;if(((cf(c[d>>2]|0)|0)&2097152|0)!=0){Wna(e+32|0,1292088);i=f;return}a=of(c[d>>2]|0)|0;if(!((a|0)>-1)){i=f;return}qf(h,c[d>>2]|0,a);Pna(e+32|0,h);Lna(h);i=f;return}else{i=f;return}}function aT(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return}function bT(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=wQ(a,b,0)|0;if((e|0)==0){i=d;return}b=e+268|0;e=JXa(c[b>>2]|0)|0;if((e|0)<=0){i=d;return}f=a+88|0;a=0;do{if((HXa(c[b>>2]|0,a)|0)!=0){ph(f,a)|0}a=a+1|0}while((a|0)!=(e|0));i=d;return}function cT(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=wQ(a,b,0)|0;if((e|0)==0){i=d;return}b=a+88|0;f=c[a+92>>2]|0;if((f|0)<=0){i=d;return}a=e+268|0;e=0;do{g=c[(qh(b,e)|0)>>2]|0;CXa(c[a>>2]|0,g);e=e+1|0}while((e|0)!=(f|0));i=d;return}function dT(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;if((d|0)==0){cR(a,b);f=wQ(a,b,1)|0;g=a+16|0;h=c[g>>2]|0;Pf(h);i=e;return f|0}else{Ic[c[(c[a>>2]|0)+148>>2]&511](a,b);cR(a,b);Ic[c[(c[a>>2]|0)+152>>2]&511](a,b);f=wQ(a,b,0)|0;g=a+16|0;h=c[g>>2]|0;Pf(h);i=e;return f|0}return 0}function eT(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;b=i;if(((cf(c[a+16>>2]|0)|0)&67108864|0)==0){i=b;return}e=a+24|0;if((c[e>>2]|0)==0){i=b;return}f=TQ(a)|0;ZQ(a,f,d);cR(a,f);c[e>>2]=0;i=b;return}function fT(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;FR(a,b,d);c[a>>2]=670400;c[a+4>>2]=670600;i=e;return}function gT(a){a=a|0;var b=0;b=i;sQ(a);$1a(a);i=b;return}function hT(a){a=a|0;var b=0;b=i;gT(a+ -4|0);i=b;return}function iT(a){a=a|0;var b=0;b=i;sQ(a);i=b;return}function jT(a){a=a|0;var b=0;b=i;sQ(a+ -4|0);i=b;return}function kT(a,b,c){a=a|0;b=b|0;c=c|0;c=i;a=Z1a(272)|0;PXa(a);rZa(a,b);i=c;return a|0}function lT(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=i;f=UQ(a,b,c,d)|0;i=e;return f|0}function mT(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0;g=i;OR(a,b,c,d,e,f);i=g;return}function nT(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;FR(a,b,d);c[a>>2]=670624;c[a+4>>2]=670824;i=e;return}function oT(a){a=a|0;var b=0;b=i;sQ(a);$1a(a);i=b;return}function pT(a){a=a|0;var b=0;b=i;oT(a+ -4|0);i=b;return}function qT(a){a=a|0;var b=0;b=i;sQ(a);i=b;return}function rT(a){a=a|0;var b=0;b=i;sQ(a+ -4|0);i=b;return}function sT(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;d=i;e=Z1a(276)|0;aYa(e);rZa(e,b);fYa(e,uf(c[a+16>>2]|0)|0);i=d;return e|0}function tT(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=i;if((c|0)==32|(c|0)==13){f=1}else{f=SQ(a,b,c,d)|0}i=e;return f|0}function uT(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;g=f+4|0;h=f;if(!((d|0)==32|(d|0)==13)){j=UQ(a,b,d,e)|0;i=f;return j|0}k=_h(c[a+12>>2]|0)|0;l=_k(c[b+8>>2]|0)|0;c[g>>2]=0;c[h>>2]=0;iS(k,c[a+16>>2]|0,l,g,h,e);if((c[g>>2]|0)!=0){j=1;i=f;return j|0}if((c[h>>2]|0)!=0){j=1;i=f;return j|0}UQ(a,b,d,e)|0;d=wQ(a,l,1)|0;if((d|0)!=0){fYa(d,1)}ZQ(a,l,e);j=1;i=f;return j|0}function vT(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=i;MR(a,b,d,e,f)|0;if((OQ(c[a+24>>2]|0)|0)==0){i=g;return 1}f=wQ(a,b,1)|0;if((f|0)!=0){fYa(f,1)}ZQ(a,b,e);i=g;return 1}function wT(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=wQ(a,b,0)|0;if((e|0)==0){f=0;i=d;return f|0}b=gYa(c[e+272>>2]|0)|0;f=(b|0)!=(uf(c[a+16>>2]|0)|0)&1;i=d;return f|0}function xT(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=wQ(a,b,0)|0;if((e|0)==0){i=d;return}b=gYa(c[e+272>>2]|0)|0;e=a+16|0;a:do{if((b|0)!=0?(f=bf(c[e>>2]|0)|0,g=c[f+20>>2]|0,(g|0)>0):0){h=f+16|0;f=0;do{j=Ch(h,f)|0;if((j|0)!=0?(fo(j)|0)!=0:0){break a}f=f+1|0}while((f|0)<(g|0))}}while(0);xf(c[e>>2]|0,b);Pf(c[e>>2]|0);lR(c[(c[a+12>>2]|0)+12>>2]|0);i=d;return}function yT(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;pQ(a,b,d);c[a>>2]=670848;c[a+4>>2]=671060;c[a+60>>2]=671084;c[a+64>>2]=671100;d=a+68|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;i=e;return}function zT(a){a=a|0;var b=0;b=i;BT(a);$1a(a);i=b;return}function AT(a){a=a|0;var b=0;b=i;zT(a+ -4|0);i=b;return}function BT(a){a=a|0;var b=0,d=0,e=0;b=i;c[a>>2]=670848;c[a+4>>2]=671060;c[a+60>>2]=671084;c[a+64>>2]=671100;d=a+68|0;e=c[d>>2]|0;if((e|0)!=0){Rc[c[(c[e>>2]|0)+24>>2]&1023](e);c[d>>2]=0}Lna(a+80|0);sQ(a);i=b;return}function CT(a){a=a|0;var b=0;b=i;BT(a+ -4|0);i=b;return}function DT(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;$Q(a,b);e=b+16|0;f=cf(c[e>>2]|0)|0;g=a+32|0;h=c[g>>2]|0;if((f&8192|0)==0){j=h}else{k=h|2;c[g>>2]=k;j=k}if((f&4096|0)==0){k=j|128;c[g>>2]=k;if((f&8388608|0)==0){h=j|640;c[g>>2]=h;l=h}else{l=k}}else{k=j|1057;c[g>>2]=k;if((f&8388608|0)==0){h=j|134219297;c[g>>2]=h;l=h}else{l=k}}if((f&16777216|0)==0){m=l}else{k=l|256;c[g>>2]=k;m=k}if((f&33554432|0)==0){n=m}else{f=m|4096;c[g>>2]=f;n=f}c[g>>2]=n|2048;n=vf(c[e>>2]|0)|0;if((n|0)==1){c[g>>2]=c[g>>2]|16}else if((n|0)==2){c[g>>2]=c[g>>2]|8}else{c[g>>2]=c[g>>2]|4}g=b+68|0;n=c[g>>2]|0;if((n|0)!=0){o=n;p=a+20|0;c[p>>2]=o;q=b+60|0;r=a+28|0;c[r>>2]=q;i=d;return}n=Z1a(64)|0;dQ(n,c[e>>2]|0,c[(c[b+12>>2]|0)+28>>2]|0);c[g>>2]=n;Ic[c[(c[n>>2]|0)+28>>2]&511](n,0);o=c[g>>2]|0;p=a+20|0;c[p>>2]=o;q=b+60|0;r=a+28|0;c[r>>2]=q;i=d;return}function ET(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;d=i;i=i+16|0;e=d;f=Z1a(332)|0;qUa(f);c[f+328>>2]=a;rZa(f,b);c[f+300>>2]=_h(c[a+12>>2]|0)|0;b=a+16|0;a=wf(c[b>>2]|0)|0;pf(e,c[b>>2]|0);do{if((a|0)>0){if((uZa(c[f+56>>2]|0,256)|0)==0){VUa(c[f+272>>2]|0,a);break}else{UUa(f,a);yUa(c[f+272>>2]|0);break}}}while(0);a=c[e>>2]|0;Ic[c[(c[f>>2]|0)+240>>2]&511](f,(a|0)==0?1292088:a+12|0);Lna(e);i=d;return f|0}function FT(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;i=i+16|0;h=f;do{if((d|0)==27){_Q(a,TQ(a)|0,1);j=1;i=f;return j|0}else if((d|0)==13?((cf(c[a+16>>2]|0)|0)&4096|0)==0:0){k=TQ(a)|0;l=a+24|0;c[l>>2]=(c[l>>2]|0)==0&1;al(h,b);m=c[a+12>>2]|0;n=vl(c[b+8>>2]|0)|0;Bg(c[m+12>>2]|0,n,+g[h>>2],+g[h+12>>2],+g[h+4>>2],+g[h+8>>2]);if((c[l>>2]|0)==0){ZQ(a,k,e);cR(a,k);j=1;i=f;return j|0}else{l=wQ(a,k,1)|0;if((l|0)==0){o=a;break}Rc[c[(c[l>>2]|0)+80>>2]&1023](l);o=a;break}}else{o=a}}while(0);j=UQ(o,b,d,e)|0;i=f;return j|0}function GT(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;e=d+4|0;f=d;g=wQ(a,b,0)|0;if((g|0)==0){h=0;i=d;return h|0}WVa(e,c[g+272>>2]|0);pf(f,c[a+16>>2]|0);a=eoa(e,f)|0;Lna(f);Lna(e);h=a&1;i=d;return h|0}function HT(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d+4|0;f=d;g=wQ(a,b,0)|0;if((g|0)==0){i=d;return}b=a+16|0;pf(e,c[b>>2]|0);WVa(f,c[g+272>>2]|0);yf(c[b>>2]|0,f);Mf(c[b>>2]|0);Pf(c[b>>2]|0);lR(c[(c[a+12>>2]|0)+12>>2]|0);Lna(f);Lna(e);i=d;return}function IT(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+16|0;g=f+8|0;h=f+4|0;j=f;if((d|0)==4|(d|0)==5){pf(j,c[a+16>>2]|0);Pna(e+32|0,j);Lna(j);i=f;return}else if((d|0)==12){j=wQ(a,b,0)|0;if((j|0)==0){i=f;return}k=j+272|0;j=e+40|0;c[j>>2]=SUa(c[k>>2]|0)|0;WVa(g,c[k>>2]|0);Pna(e+32|0,g);Lna(g);if((c[j>>2]|0)==0){i=f;return}Wna(e+12|0,1292088);Wna(e+16|0,1292088);i=f;return}else if((d|0)==14){d=wQ(a,b,0)|0;if((d|0)==0){i=f;return}WVa(h,c[d+272>>2]|0);Pna(e+32|0,h);Lna(h);i=f;return}else{i=f;return}}function JT(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=i;if((d|0)!=12){i=f;return}d=wQ(a,b,0)|0;if((d|0)==0){i=f;return}Rc[c[(c[d>>2]|0)+80>>2]&1023](d);XVa(c[d+272>>2]|0,c[e+28>>2]|0,c[e+24>>2]|0);b=c[e+12>>2]|0;PUa(d,(b|0)==0?1292088:b+12|0);i=f;return}function KT(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;a=i;if((b|0)!=12){f=0;i=a;return f|0}if((c[d+40>>2]|0)==0?(c[d+24>>2]|0)!=(c[e+24>>2]|0):0){g=1}else{if((c[d+28>>2]|0)==(c[e+28>>2]|0)){g=eoa(d+12|0,e+12|0)|0}else{g=1}}f=g&1;i=a;return f|0}function LT(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;f=wQ(a,b,0)|0;if((f|0)==0){i=d;return}b=f+272|0;YVa(c[b>>2]|0,a+72|0,a+76|0);WVa(e,c[b>>2]|0);Pna(a+80|0,e);Lna(e);i=d;return}function MT(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=wQ(a,b,1)|0;if((e|0)==0){i=d;return}b=c[a+80>>2]|0;Ic[c[(c[e>>2]|0)+240>>2]&511](e,(b|0)==0?1292088:b+12|0);XVa(c[e+272>>2]|0,c[a+72>>2]|0,c[a+76>>2]|0);i=d;return}function NT(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;if((d|0)==0){cR(a,b);f=wQ(a,b,1)|0;g=a+16|0;h=c[g>>2]|0;Pf(h);i=e;return f|0}else{Ic[c[(c[a>>2]|0)+148>>2]&511](a,b);cR(a,b);Ic[c[(c[a>>2]|0)+152>>2]&511](a,b);f=wQ(a,b,0)|0;g=a+16|0;h=c[g>>2]|0;Pf(h);i=e;return f|0}return 0}function OT(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+16|0;e=d+8|0;f=d+4|0;g=d;Ic[c[(c[b>>2]|0)+16>>2]&511](e,b);h=ah(e,1289584)|0;dka(e);if(!h){i=d;return}c[b+288>>2]=134;c[b+292>>2]=936;vWa(b);WVa(f,c[b+272>>2]|0);h=c[f>>2]|0;if((h|0)==0){j=0}else{j=c[h+4>>2]|0}ioa(g,f);h=c[g>>2]|0;e=c[a+12>>2]|0;bf(c[a+16>>2]|0)|0;mi(c[e+12>>2]|0,(h|0)==0?1305928:h+12|0,j,1);c[b+284>>2]=a+64;dka(g);Lna(f);i=d;return}function PT(a,b){a=a|0;b=b|0;var c=0;c=i;OT(a+ -60|0,b);i=c;return}function QT(a,b){a=a|0;b=b|0;return}function RT(a,b){a=a|0;b=b|0;return}function ST(a,b){a=a|0;b=b|0;return 0}function TT(a,b){a=a|0;b=b|0;return 0}function UT(a,b){a=a|0;b=b|0;return 0}function VT(a,b){a=a|0;b=b|0;return}function WT(a,b){a=a|0;b=b|0;return}function XT(a,b){a=a|0;b=b|0;return}function YT(a,b){a=a|0;b=b|0;return}function ZT(a,b){a=a|0;b=b|0;return}function _T(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return}function $T(a,b){a=a|0;b=b|0;return}function aU(a,b,c){a=a|0;b=b|0;c=c|0;return}function bU(a,b,c){a=a|0;b=b|0;c=c|0;return}function cU(a,b,c){a=a|0;b=b|0;c=c|0;return}function dU(a,b,c){a=a|0;b=b|0;c=c|0;return}function eU(a,b,c){a=a|0;b=b|0;c=c|0;return}function fU(a,b,c){a=a|0;b=b|0;c=c|0;return}function gU(a,b,c){a=a|0;b=b|0;c=c|0;return}function hU(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;FR(a,b,d);c[a>>2]=671152;c[a+4>>2]=671352;i=e;return}function iU(a){a=a|0;var b=0;b=i;sQ(a);$1a(a);i=b;return}function jU(a){a=a|0;var b=0;b=i;iU(a+ -4|0);i=b;return}function kU(a){a=a|0;var b=0;b=i;sQ(a);i=b;return}function lU(a){a=a|0;var b=0;b=i;sQ(a+ -4|0);i=b;return}function mU(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;d=i;e=Z1a(276)|0;UXa(e);rZa(e,b);YXa(e,uf(c[a+16>>2]|0)|0);i=d;return e|0}function nU(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=i;if((c|0)==32|(c|0)==13){f=1}else{f=SQ(a,b,c,d)|0}i=e;return f|0}function oU(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;g=f+4|0;h=f;if(!((d|0)==32|(d|0)==13)){j=UQ(a,b,d,e)|0;i=f;return j|0}k=_h(c[a+12>>2]|0)|0;l=_k(c[b+8>>2]|0)|0;c[g>>2]=0;c[h>>2]=0;iS(k,c[a+16>>2]|0,l,g,h,e);if((c[g>>2]|0)!=0){j=1;i=f;return j|0}if((c[h>>2]|0)!=0){j=1;i=f;return j|0}UQ(a,b,d,e)|0;d=wQ(a,l,1)|0;if((d|0)!=0){YXa(d,(ZXa(c[d+272>>2]|0)|0)==0&1)}ZQ(a,l,e);j=1;i=f;return j|0}function pU(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=i;MR(a,b,d,e,f)|0;if((OQ(c[a+24>>2]|0)|0)==0){i=g;return 1}f=wQ(a,b,1)|0;if((f|0)!=0){YXa(f,(uf(d)|0)==0&1)}ZQ(a,b,e);i=g;return 1}function qU(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=wQ(a,b,0)|0;if((e|0)==0){f=0;i=d;return f|0}b=ZXa(c[e+272>>2]|0)|0;f=(b|0)!=(uf(c[a+16>>2]|0)|0)&1;i=d;return f|0}function rU(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=wQ(a,b,0)|0;if((e|0)==0){i=d;return}b=ZXa(c[e+272>>2]|0)|0;e=a+16|0;a:do{if((b|0)!=0?(f=bf(c[e>>2]|0)|0,g=c[f+20>>2]|0,(g|0)>0):0){h=f+16|0;f=0;do{j=Ch(h,f)|0;if((j|0)!=0?(fo(j)|0)!=0:0){break a}f=f+1|0}while((f|0)<(g|0))}}while(0);xf(c[e>>2]|0,b);Pf(c[e>>2]|0);lR(c[(c[a+12>>2]|0)+12>>2]|0);i=d;return}function sU(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;pQ(a,b,d);c[a>>2]=671376;c[a+4>>2]=671592;c[a+60>>2]=671616;c[a+64>>2]=671632;d=a+68|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;i=e;return}function tU(a){a=a|0;var b=0;b=i;vU(a);$1a(a);i=b;return}function uU(a){a=a|0;var b=0;b=i;tU(a+ -4|0);i=b;return}function vU(a){a=a|0;var b=0,d=0,e=0;b=i;c[a>>2]=671376;c[a+4>>2]=671592;c[a+60>>2]=671616;c[a+64>>2]=671632;d=a+68|0;e=c[d>>2]|0;if((e|0)!=0){Rc[c[(c[e>>2]|0)+24>>2]&1023](e);c[d>>2]=0}Lna(a+84|0);sQ(a);i=b;return}function wU(a){a=a|0;var b=0;b=i;vU(a+ -4|0);i=b;return}function xU(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;$Q(a,b);e=b+16|0;if(((cf(c[e>>2]|0)|0)&262144|0)!=0){f=a+32|0;c[f>>2]=c[f>>2]|1}f=b+68|0;g=c[f>>2]|0;if((g|0)!=0){h=g;j=a+20|0;c[j>>2]=h;k=b+60|0;l=a+28|0;c[l>>2]=k;i=d;return}g=Z1a(64)|0;m=c[e>>2]|0;dQ(g,m,Lc[c[(c[b>>2]|0)+132>>2]&255](b)|0);c[f>>2]=g;Ic[c[(c[g>>2]|0)+28>>2]&511](g,0);h=c[f>>2]|0;j=a+20|0;c[j>>2]=h;k=b+60|0;l=a+28|0;c[l>>2]=k;i=d;return}function yU(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+16|0;e=d+12|0;f=d+8|0;g=d+4|0;h=d;j=Z1a(316)|0;ETa(j);c[j+312>>2]=a;rZa(j,b);_Ta(j,_h(c[a+12>>2]|0)|0);b=a+16|0;a=of(c[b>>2]|0)|0;c[e>>2]=0;k=c[b>>2]|0;if((a|0)<0){pf(f,k);Pna(e,f);Lna(f)}else{qf(g,k,a);Pna(e,g);Lna(g)}g=rf(c[b>>2]|0)|0;if((g|0)>0){k=j+276|0;f=0;do{qf(h,c[b>>2]|0,f);l=c[h>>2]|0;MTa(c[k>>2]|0,(l|0)==0?1292088:l+12|0);Lna(h);f=f+1|0}while((f|0)<(g|0))}OTa(j,a);a=c[e>>2]|0;LTa(c[j+268>>2]|0,(a|0)==0?1292088:a+12|0);Lna(e);i=d;return j|0}function zU(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=i;f=UQ(a,b,c,d)|0;i=e;return f|0}function AU(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+16|0;e=d+4|0;f=d;g=wQ(a,b,0)|0;if((g|0)==0){h=0;i=d;return h|0}b=NTa(c[g+304>>2]|0)|0;j=a+16|0;if(((cf(c[j>>2]|0)|0)&262144|0)==0){h=(b|0)!=(of(c[j>>2]|0)|0)&1;i=d;return h|0}if((b|0)>-1){h=(b|0)!=(of(c[j>>2]|0)|0)&1;i=d;return h|0}else{KTa(e,c[g+268>>2]|0);pf(f,c[j>>2]|0);j=eoa(e,f)|0;Lna(f);Lna(e);h=j&1;i=d;return h|0}return 0}function BU(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;i=i+16|0;e=d+12|0;f=d+8|0;g=d+4|0;h=d;j=wQ(a,b,0)|0;if((j|0)==0){i=d;return}KTa(e,c[j+268>>2]|0);b=NTa(c[j+304>>2]|0)|0;j=a+16|0;do{if(((cf(c[j>>2]|0)|0)&262144|0)==0){c[g>>2]=0;k=c[j>>2]|0;l=8}else{if((b|0)>-1){qf(f,c[j>>2]|0,b);m=eoa(e,f)|0;Lna(f);c[g>>2]=0;n=c[j>>2]|0;if(m){o=n}else{k=n;l=8;break}}else{c[g>>2]=0;o=c[j>>2]|0}pf(h,o);Pna(g,h);Lna(h);yf(c[j>>2]|0,e)}}while(0);if((l|0)==8){of(k)|0;zf(c[j>>2]|0,b)}Mf(c[j>>2]|0);Pf(c[j>>2]|0);lR(c[(c[a+12>>2]|0)+12>>2]|0);Lna(g);Lna(e);i=d;return}function CU(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;i=i+32|0;g=f+20|0;h=f+16|0;j=f+12|0;k=f+8|0;l=f+4|0;m=f;if((d|0)==14){n=wQ(a,b,0)|0;if((n|0)==0){i=f;return}o=c[n+268>>2]|0;if((o|0)==0){i=f;return}WVa(l,c[o+272>>2]|0);Pna(e+32|0,l);Lna(l);i=f;return}else if((d|0)==12){l=wQ(a,b,0)|0;if((l|0)==0){i=f;return}b=c[l+268>>2]|0;if((b|0)==0){i=f;return}l=b+272|0;b=e+40|0;c[b>>2]=SUa(c[l>>2]|0)|0;c[g>>2]=0;c[h>>2]=0;YVa(c[l>>2]|0,g,h);c[e+24>>2]=c[h>>2];c[e+28>>2]=c[g>>2];WVa(j,c[l>>2]|0);Pna(e+32|0,j);Lna(j);j=e+16|0;DU(k,a);Pna(j,k);Lna(k);if((c[b>>2]|0)==0){i=f;return}Wna(e+12|0,1292088);Wna(j,1292088);i=f;return}else if((d|0)==4|(d|0)==5){pf(m,c[a+16>>2]|0);Pna(e+32|0,m);Lna(m);i=f;return}else{i=f;return}}function DU(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;e=d+4|0;f=d;c[a>>2]=0;g=wQ(b,TQ(b)|0,0)|0;if((g|0)==0){i=d;return}h=NTa(c[g+304>>2]|0)|0;if(!((h|0)>-1)){i=d;return}g=bf(c[b+16>>2]|0)|0;if((g|0)==0){i=d;return}b=g+12|0;cp(e,c[b>>2]|0,h);Pna(a,e);Lna(e);if((dg(c[a>>2]|0)|0)==0){i=d;return}Mo(f,c[b>>2]|0,h);Pna(a,f);Lna(f);i=d;return}function EU(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=i;if((d|0)!=12){i=f;return}d=wQ(a,b,0)|0;if((d|0)==0){i=f;return}b=c[d+268>>2]|0;if((b|0)==0){i=f;return}XVa(c[b+272>>2]|0,c[e+28>>2]|0,c[e+24>>2]|0);d=c[e+12>>2]|0;PUa(b,(d|0)==0?1292088:d+12|0);i=f;return}function FU(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;a=i;if((b|0)!=12){f=0;i=a;return f|0}if((c[d+40>>2]|0)==0?(c[d+24>>2]|0)!=(c[e+24>>2]|0):0){g=1}else{if((c[d+28>>2]|0)==(c[e+28>>2]|0)){g=eoa(d+12|0,e+12|0)|0}else{g=1}}f=g&1;i=a;return f|0}function GU(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;f=wQ(a,b,0)|0;if((f|0)==0){i=d;return}c[a+72>>2]=NTa(c[f+304>>2]|0)|0;b=c[f+268>>2]|0;if((b|0)==0){i=d;return}f=b+272|0;YVa(c[f>>2]|0,a+76|0,a+80|0);WVa(e,c[f>>2]|0);Pna(a+84|0,e);Lna(e);i=d;return}function HU(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=wQ(a,b,1)|0;if((e|0)==0){i=d;return}b=c[a+72>>2]|0;if((b|0)>-1){OTa(e,b);i=d;return}b=c[e+268>>2]|0;if((b|0)==0){i=d;return}e=c[a+84>>2]|0;Ic[c[(c[b>>2]|0)+240>>2]&511](b,(e|0)==0?1292088:e+12|0);XVa(c[b+272>>2]|0,c[a+76>>2]|0,c[a+80>>2]|0);i=d;return}function IU(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;if((d|0)==0){cR(a,b);f=wQ(a,b,1)|0;g=a+16|0;h=c[g>>2]|0;Pf(h);i=e;return f|0}else{Ic[c[(c[a>>2]|0)+148>>2]&511](a,b);cR(a,b);Ic[c[(c[a>>2]|0)+152>>2]&511](a,b);f=wQ(a,b,0)|0;g=a+16|0;h=c[g>>2]|0;Pf(h);i=e;return f|0}return 0}function JU(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;b=i;if(((cf(c[a+16>>2]|0)|0)&67108864|0)==0){i=b;return}e=a+24|0;if((c[e>>2]|0)==0){i=b;return}f=TQ(a)|0;ZQ(a,f,d);cR(a,f);c[e>>2]=0;i=b;return}function KU(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+16|0;e=d+8|0;f=d+4|0;g=d;Ic[c[(c[b>>2]|0)+16>>2]&511](e,b);h=ah(e,1289584)|0;dka(e);if(!h){i=d;return}c[b+288>>2]=134;c[b+292>>2]=936;vWa(b);WVa(f,c[b+272>>2]|0);h=c[f>>2]|0;if((h|0)==0){j=0}else{j=c[h+4>>2]|0}ioa(g,f);h=c[g>>2]|0;e=c[a+12>>2]|0;bf(c[a+16>>2]|0)|0;mi(c[e+12>>2]|0,(h|0)==0?1305928:h+12|0,j,1);c[b+284>>2]=a+64;dka(g);Lna(f);i=d;return}function LU(a,b){a=a|0;b=b|0;var c=0;c=i;KU(a+ -60|0,b);i=c;return}function MU(a,b){a=a|0;b=b|0;return}function NU(a,b){a=a|0;b=b|0;return}function OU(a,b){a=a|0;b=b|0;return 0}function PU(a,b){a=a|0;b=b|0;return 0}function QU(a,b){a=a|0;b=b|0;return 0}function RU(a,b){a=a|0;b=b|0;return}function SU(a,b){a=a|0;b=b|0;return}function TU(a,b){a=a|0;b=b|0;return}function UU(a,b){a=a|0;b=b|0;return}function VU(a,b){a=a|0;b=b|0;return}function WU(a){a=a|0;var b=0,d=0;b=i;d=u2a(4)|0;c[d>>2]=671952;c[a>>2]=d;d=u2a(4)|0;c[d>>2]=673272;c[a+4>>2]=d;d=u2a(8)|0;c[d>>2]=693760;c[d+4>>2]=0;c[a+8>>2]=d;d=u2a(4)|0;oY(d);c[a+12>>2]=d;d=u2a(8)|0;c[d>>2]=693568;c[d+4>>2]=671984;c[a+16>>2]=d;d=u2a(56)|0;zV(d);c[a+20>>2]=d;d=u2a(4)|0;c[d>>2]=673784;c[a+24>>2]=d;i=b;return}function XU(a){a=a|0;c[a>>2]=671680;c[a+40>>2]=-1;c[a+48>>2]=0;c[a+44>>2]=0;return}function YU(a){a=a|0;var b=0;b=i;ZU(a);v2a(a);i=b;return}function ZU(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=671680;d=c[a+48>>2]|0;if((d|0)==0){i=b;return}v2a(d);i=b;return}function _U(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=c[a+48>>2]|0;if((e|0)!=0?(c[e+8>>2]|0)>(b|0):0){f=e+12+(ca(c[a+32>>2]|0,b)|0)|0;i=d;return f|0}e=a+40|0;g=c[e>>2]|0;if((g|0)==(b+1|0)){f=c[a+44>>2]|0;i=d;return f|0}do{if((g|0)<0|(g|0)>(b|0)){if((Lc[c[(c[a>>2]|0)+48>>2]&255](a)|0)==0){f=0;i=d;return f|0}else{c[e>>2]=0;h=0;break}}else{h=g}}while(0);g=$U(a)|0;if((h|0)<(b|0)){do{h=(c[e>>2]|0)+1|0;c[e>>2]=h;j=$U(a)|0}while((h|0)<(b|0));k=j}else{k=g}c[a+44>>2]=k;c[e>>2]=(c[e>>2]|0)+1;f=k;i=d;return f|0}function $U(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;d=Lc[c[(c[a>>2]|0)+52>>2]&255](a)|0;if((d|0)==0){e=0;i=b;return e|0}f=a+48|0;g=c[f>>2]|0;if((g|0)==0){e=d;i=b;return e|0}h=c[a+40>>2]|0;if((h|0)!=(c[g+8>>2]|0)){e=d;i=b;return e|0}j=c[a+32>>2]|0;c3a(g+12+(ca(j,h)|0)|0,d|0,j|0)|0;j=(c[f>>2]|0)+8|0;c[j>>2]=(c[j>>2]|0)+1;e=d;i=b;return e|0}function aV(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;f=c[a+48>>2]|0;if((f|0)!=0?(c[f+8>>2]|0)>(b|0):0){g=0;i=e;return g|0}f=a+40|0;h=c[f>>2]|0;if((h|0)==(b|0)|(h|0)==(b+1|0)){g=0;i=e;return g|0}if((h|0)<0|(h|0)>(b|0)){Lc[c[(c[a>>2]|0)+48>>2]&255](a)|0;c[f>>2]=0;j=0}else{j=h}h=a+44|0;c[h>>2]=0;if((j|0)>=(b|0)){g=0;i=e;return g|0}j=(d|0)==0;while(1){c[h>>2]=$U(a)|0;k=(c[f>>2]|0)+1|0;c[f>>2]=k;if(j){l=k}else{if((Lc[c[c[d>>2]>>2]&255](d)|0)!=0){g=1;m=12;break}l=c[f>>2]|0}if((l|0)>=(b|0)){g=0;m=12;break}}if((m|0)==12){i=e;return g|0}return 0}function bV(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;ld[c[(c[a>>2]|0)+56>>2]&255](a,(b|0)<0?0-b|0:b,(d|0)<0?0-d|0:d);d=a+48|0;b=c[d>>2]|0;if((b|0)==0){f=a+20|0}else{g=a+20|0;if((c[b+4>>2]|0)==(c[g>>2]|0)?(c[b>>2]|0)==(c[a+16>>2]|0):0){i=e;return}v2a(b);c[d>>2]=0;f=g}g=c[f>>2]|0;f=w2a((ca(g,c[a+32>>2]|0)|0)+16|0,1)|0;c[d>>2]=f;if((f|0)==0){i=e;return}c[f+4>>2]=g;c[f>>2]=c[a+16>>2];c[f+8>>2]=0;i=e;return}function cV(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return 0}function dV(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return 0}function eV(){var a=0,b=0;a=i;b=u2a(28)|0;WU(b);i=a;return b|0}function fV(a){a=a|0;var b=0;b=i;gV(a);v2a(a);i=b;return}function gV(a){a=a|0;var b=0;b=i;c[a>>2]=671752;v2a(c[a+52>>2]|0);ZU(a);i=b;return}function hV(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=i;e=c[b+60>>2]|0;a:do{if((e|0)!=0){f=c[b+56>>2]|0;g=0;h=0;while(1){j=a[f+h>>0]|0;k=j&255;if(j<<24>>24>-1){l=g+1+k|0;if(l>>>0<g>>>0){m=0;n=11;break}o=l;p=h+2+k|0}else{if(!((j&255)>128)){q=g;break a}j=257-k+g|0;if(j>>>0<g>>>0){m=0;n=11;break}o=j;p=h+2|0}if(p>>>0<e>>>0){g=o;h=p}else{q=o;break a}}if((n|0)==11){i=d;return m|0}}else{q=0}}while(0);n=ca(c[b+24>>2]|0,c[b+4>>2]|0)|0;o=ca(n,c[b+28>>2]|0)|0;m=((ca(o,c[b+8>>2]|0)|0)+7|0)>>>3>>>0<=q>>>0&1;i=d;return m|0}function iV(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0;j=i;c[a+56>>2]=b;c[a+60>>2]=d;c[a+4>>2]=e;c[a+16>>2]=e;c[a+8>>2]=f;c[a+20>>2]=f;c[a+24>>2]=g;c[a+28>>2]=h;c[a+36>>2]=0;c[a+12>>2]=1;f=ca(ca(g,e)|0,h)|0;h=((f+31|0)/32|0)<<2;c[a+32>>2]=h;c[a+64>>2]=(f+7|0)/8|0;f=w2a(h,1)|0;c[a+52>>2]=f;if((f|0)==0){k=0;i=j;return k|0}k=hV(a)|0;i=j;return k|0}function jV(b){b=b|0;var d=0;d=i;f3a(c[b+52>>2]|0,0,c[b+32>>2]|0)|0;c[b+68>>2]=0;c[b+72>>2]=0;a[b+76>>0]=0;i=d;return 1}function kV(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;d=i;e=b+68|0;if((c[e>>2]|0)!=0){if((c[b+72>>2]|0)!=0){f=0;i=d;return f|0}}else{lV(b)}g=b+52|0;f3a(c[g>>2]|0,0,c[b+32>>2]|0)|0;h=c[e>>2]|0;j=b+60|0;k=c[j>>2]|0;a:do{if(h>>>0<k>>>0){l=b+76|0;m=b+64|0;n=b+56|0;o=b+72|0;p=h;q=k;r=0;while(1){s=a[l>>0]|0;if(s<<24>>24>-1){t=(s&255)+1|0;u=c[m>>2]|0;v=(t+r|0)>>>0<u>>>0;w=v?t:u-r|0;u=q-p|0;if(w>>>0<u>>>0){x=w}else{c[o>>2]=1;x=u}c3a((c[g>>2]|0)+r|0,(c[n>>2]|0)+p|0,x|0)|0;mV(b,x&255);y=x;z=v&1}else{if(!((s&255)>128)){break}if((p+ -1|0)>>>0<(q+ -1|0)>>>0){A=a[(c[n>>2]|0)+p>>0]|0}else{A=0}v=257-(s&255)|0;s=c[m>>2]|0;u=(v+r|0)>>>0<s>>>0;w=u?v:s-r|0;f3a((c[g>>2]|0)+r|0,A|0,w|0)|0;mV(b,w&255);y=w;z=u&1}p=c[e>>2]|0;q=c[j>>2]|0;if(!(p>>>0<q>>>0&(z|0)==1)){break a}else{r=y+r|0}}c[o>>2]=1}}while(0);f=c[g>>2]|0;i=d;return f|0}function lV(b){b=b|0;var d=0,e=0,f=0;d=i;e=b+68|0;f=c[e>>2]|0;if(f>>>0<(c[b+60>>2]|0)>>>0){a[b+76>>0]=a[(c[b+56>>2]|0)+f>>0]|0;c[e>>2]=f+1;i=d;return}else{a[b+76>>0]=-128;i=d;return}}function mV(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=d&255;if(d<<24>>24==0){i=e;return}d=b+76|0;g=a[d>>0]|0;h=g&255;if(!(g<<24>>24>-1)){g=257-h|0;j=g&255;if(j>>>0<f>>>0){_a(671912,671856,424,671896)}if((f|0)==(j|0)){j=b+68|0;c[j>>2]=(c[j>>2]|0)+1;lV(b);i=e;return}else{a[d>>0]=f+1-g;i=e;return}}g=h+1|0;if(g>>>0<f>>>0){_a(671816,671856,410,671896)}if((f|0)==(g|0)){g=b+68|0;c[g>>2]=(c[g>>2]|0)+f;lV(b);i=e;return}a[d>>0]=h-f;h=b+68|0;g=(c[h>>2]|0)+f|0;c[h>>2]=g;if(g>>>0<(c[b+60>>2]|0)>>>0){i=e;return}a[d>>0]=-128;i=e;return}function nV(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0;b=i;k=u2a(80)|0;c[k+40>>2]=-1;c[k+48>>2]=0;c[k+44>>2]=0;c[k>>2]=671752;l=k+52|0;c[l+0>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;c[l+12>>2]=0;c[l+16>>2]=0;c[l+20>>2]=0;a[l+24>>0]=0;if((k|0)==0){m=0;i=b;return m|0}if((iV(k,d,e,f,g,h,j)|0)==0){Rc[c[(c[k>>2]|0)+4>>2]&1023](k);m=0;i=b;return m|0}else{m=k;i=b;return m|0}return 0}function oV(a){a=a|0;return}function pV(a){a=a|0;var b=0;b=i;v2a(a);i=b;return}function qV(a){a=a|0;return-1}function rV(a){a=a|0;return c[a+16>>2]|0}function sV(a){a=a|0;return c[a+20>>2]|0}function tV(a){a=a|0;return c[a+24>>2]|0}function uV(a){a=a|0;return c[a+28>>2]|0}function vV(a){a=a|0;return c[a+36>>2]|0}function wV(a){a=a|0;var b=0,d=0;b=i;d=a+48|0;a=c[d>>2]|0;if((a|0)!=0){v2a(a)}c[d>>2]=0;i=b;return}function xV(a){a=a|0;return c[a+68>>2]|0}function yV(a,b,c){a=a|0;b=b|0;c=c|0;return}function zV(a){a=a|0;var b=0;b=i;c[a>>2]=673824;Lma(a+4|0,10);Lma(a+28|0,10);i=b;return}function AV(a,b){a=a|0;b=b|0;c[a+52>>2]=b;return}function BV(a,b){a=a|0;b=b|0;var c=0;a=i;c=w2a(b,1)|0;i=a;return c|0}function CV(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;a=i;if((c|0)!=0?!((4294967295/(c>>>0)|0)>>>0>b>>>0):0){d=0;i=a;return d|0}d=w2a(ca(c,b)|0,1)|0;i=a;return d|0}function DV(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;a=i;if((d|0)!=0?!((4294967295/(d>>>0)|0)>>>0>c>>>0):0){e=0}else{f=3}do{if((f|0)==3){g=ca(d,c)|0;if((g|0)!=0?!((4294967295/(g>>>0)|0)>>>0>b>>>0):0){e=0;break}e=w2a(ca(g,b)|0,1)|0}}while(0);i=a;return e|0}function EV(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;a=i;d=x2a(b,c)|0;i=a;return d|0}function FV(a,b){a=a|0;b=b|0;a=i;v2a(b);i=a;return}function GV(a,b){a=a|0;b=b|0;return}function HV(a,b,c){a=a|0;b=b|0;c=c|0;return}function IV(a,b,c){a=a|0;b=b|0;c=c|0;return}function JV(a,b,c){a=a|0;b=b|0;c=c|0;return}function KV(a,b){a=a|0;b=b|0;c[a+4>>2]=b;return}function LV(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;if((e|0)>=(c|0)){h=c;i=g;return h|0}j=(f|0)!=0;f=j?672024:672280;k=(e|0)%8|0;do{if((k|0)==0){l=e}else{m=(e|0)/8|0;n=a[b+m>>0]|0;if(j){o=n&255&255>>>k}else{o=n&255|255<<8-k}n=a[f+(o&255)>>0]|0;if(!((n&255)<8)){l=e+7|0;break}h=(n&255)+(m<<3)|0;i=g;return h|0}}while(0);e=(l|0)/8|0;l=(c+7|0)/8|0;a:do{if((e|0)<(l|0)){o=j?0:255;k=e;while(1){m=k+1|0;if((d[b+k>>0]|0|0)!=(o|0)){p=k;break a}if((m|0)<(l|0)){k=m}else{p=m;break}}}else{p=e}}while(0);if((p|0)==(l|0)){h=c;i=g;return h|0}l=(d[f+(d[b+p>>0]|0)>>0]|0)+(p<<3)|0;h=(l|0)>(c|0)?c:l;i=g;return h|0}function MV(a,b,e,f,g,h){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0;j=i;if((e|0)<0){k=1}else{k=(1<<7-((e|0)%8|0)&(d[a+((e|0)/8|0)>>0]|0)|0)!=0&1}l=k^1;m=LV(a,b,e+1|0,l&255)|0;c[g>>2]=m;if((m|0)>=(b|0)){c[h>>2]=b;c[g>>2]=b;i=j;return}e=k&255;if((e|0)==((f|0)==0|0)){f=LV(a,b,m+1|0,e)|0;c[g>>2]=f;n=f;o=l}else{n=m;o=k}if((n|0)<(b|0)){c[h>>2]=LV(a,b,n+1|0,o&255)|0;i=j;return}else{c[h>>2]=b;c[g>>2]=b;i=j;return}}function NV(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;g=(d|0)<0?0:d;d=(e|0)<0?0:e;e=(d|0)<(c|0)?d:c;if((g|0)>=(e|0)){i=f;return}c=(g|0)/8|0;d=e+ -1|0;e=(d|0)/8|0;h=(g|0)%8|0;if((c|0)==(e|0)){g=(d|0)%8|0;if((h|0)>(g|0)){i=f;return}j=b+c|0;k=a[j>>0]|0;l=h;while(1){k=(k&255)-(1<<7-l)&255;if((l|0)>=(g|0)){break}else{l=l+1|0}}a[j>>0]=k;i=f;return}k=b+c|0;j=a[k>>0]|0;l=h;do{j=(j&255)-(1<<7-l)&255;l=l+1|0}while((l|0)<8);a[k>>0]=j;j=(d|0)%8|0;if((j|0)>=0){d=b+e|0;k=a[d>>0]|0;l=0;while(1){k=(k&255)-(1<<7-l)&255;if((l|0)==(j|0)){break}else{l=l+1|0}}a[d>>0]=k}k=c+1|0;if((e|0)<=(k|0)){i=f;return}f3a(b+k|0,0,e+~c|0)|0;i=f;return}function OV(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;h=i;j=a[b>>0]|0;if(j<<24>>24==-1){k=-1;i=h;return k|0}l=j&255;j=1;m=c[f>>2]|0;n=0;a:while(1){if((m|0)>=(g|0)){k=-1;o=9;break}n=(1<<7-((m|0)%8|0)&(d[e+((m|0)/8|0)>>0]|0)|0)!=0|n<<1;m=m+1|0;c[f>>2]=m;p=(l*3|0)+j|0;if((l|0)==0){q=j}else{r=j;while(1){s=r+3|0;if((d[b+r>>0]|0|0)==(n|0)){o=8;break a}if((s|0)<(p|0)){r=s}else{q=s;break}}}p=a[b+q>>0]|0;if(p<<24>>24==-1){k=-1;o=9;break}else{l=p&255;j=q+1|0}}if((o|0)==8){k=(d[b+(r+2)>>0]|0)<<8|(d[b+(r+1)>>0]|0);i=h;return k|0}else if((o|0)==9){i=h;return k|0}return 0}function PV(b,e,f,g,h,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;k=i;i=i+16|0;l=k+4|0;m=k;if((c[f>>2]|0)<(e|0)){n=-1;o=1}else{p=0;i=k;return p|0}a:while(1){q=(o|0)==0;r=(o|0)!=0;s=r?672536:672864;t=r?672864:672536;u=n;b:while(1){while(1){MV(h,j,u,o,l,m);v=c[f>>2]|0;w=1<<7-((v|0)%8|0)&(d[b+((v|0)/8|0)>>0]|0);x=v+1|0;c[f>>2]=x;if((w|0)!=0){y=0;break b}if((x|0)>=(e|0)){p=0;z=36;break a}w=a[b+((x|0)/8|0)>>0]|0;A=v+2|0;c[f>>2]=A;if((A|0)>=(e|0)){p=0;z=36;break a}B=1<<7-((A|0)%8|0)&(d[b+((A|0)/8|0)>>0]|0);A=v+3|0;c[f>>2]=A;C=(1<<7-((x|0)%8|0)&(w&255)|0)!=0;w=(B|0)==0;if(C){y=C&(w^1)?1:-1;break b}if(!w){D=0;z=10;break}if((A|0)>=(e|0)){p=0;z=36;break a}w=1<<7-((A|0)%8|0)&(d[b+((A|0)/8|0)>>0]|0);A=v+4|0;c[f>>2]=A;if((w|0)!=0){z=20;break}if((A|0)>=(e|0)){p=0;z=36;break a}w=a[b+((A|0)/8|0)>>0]|0;C=v+5|0;c[f>>2]=C;if((C|0)>=(e|0)){p=0;z=36;break a}B=1<<7-((C|0)%8|0)&(d[b+((C|0)/8|0)>>0]|0);E=v+6|0;c[f>>2]=E;C=(1<<7-((A|0)%8|0)&(w&255)|0)!=0;w=(B|0)==0;if(C){y=C&(w^1)?2:-2;break b}F=(E|0)>=(e|0);if(!w){z=27;break b}if(F){p=0;z=36;break a}w=1<<7-((E|0)%8|0)&(d[b+((E|0)/8|0)>>0]|0);c[f>>2]=v+7;if((w|0)==0){z=32;break a}w=v+10|0;c[f>>2]=w;if((w|0)>=(e|0)){p=0;z=36;break a}}if((z|0)==10){while(1){z=0;w=OV(s,b,f,e)|0;D=w+D|0;if((w|0)<64){break}else{z=10}}w=(u>>>31)+u+D|0;if(r){G=0}else{NV(g,j,u,w);G=0}do{C=OV(t,b,f,e)|0;G=C+G|0}while((C|0)>=64);C=G+w|0;if(r){NV(g,j,w,C)}if((C|0)<(j|0)){H=C}else{p=1;z=36;break a}}else if((z|0)==20){z=0;C=c[m>>2]|0;if(q){NV(g,j,u,C)}if((C|0)<(j|0)){H=C}else{p=1;z=36;break a}}if((c[f>>2]|0)<(e|0)){u=H}else{p=0;z=36;break a}}if((z|0)==27){z=0;if(F){p=0;z=36;break}q=1<<7-((E|0)%8|0)&(d[b+((E|0)/8|0)>>0]|0);c[f>>2]=v+7;y=(q|0)==0?-3:3}n=(c[l>>2]|0)+y|0;if(!r){NV(g,j,u,n)}if((n|0)>=(j|0)){p=1;z=36;break}if((c[f>>2]|0)>=(e|0)){p=0;z=36;break}else{o=r&1^1}}if((z|0)==32){c[f>>2]=v+12;p=1;i=k;return p|0}else if((z|0)==36){i=k;return p|0}return 0}function QV(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;g=c[e>>2]|0;h=g;do{if((h|0)>=(b|0)){j=0;k=6;break}l=1<<7-((h|0)%8|0)&(d[a+((h|0)/8|0)>>0]|0);h=h+1|0;c[e>>2]=h}while((l|0)==0);if((k|0)==6){i=f;return j|0}if((h-g|0)>=12){j=1;i=f;return j|0}c[e>>2]=g;j=1;i=f;return j|0}function RV(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=i;if((c[e>>2]|0)<(b|0)){j=1;k=0}else{l=0;i=h;return l|0}a:while(1){m=(j|0)!=0;n=m?672536:672864;o=0;do{p=OV(n,a,e,b)|0;if((p|0)<0){q=5;break a}o=p+o|0}while((p|0)>=64);n=k;k=o+k|0;if(!m){NV(f,g,n,k)}if((k|0)>=(g|0)){l=1;q=12;break}if((c[e>>2]|0)>=(b|0)){l=0;q=12;break}else{j=m&1^1}}if((q|0)==5){j=c[e>>2]|0;while(1){if((j|0)>=(b|0)){l=0;q=12;break}g=1<<7-((j|0)%8|0)&(d[a+((j|0)/8|0)>>0]|0);j=j+1|0;c[e>>2]=j;if((g|0)!=0){l=1;q=12;break}}if((q|0)==12){i=h;return l|0}}else if((q|0)==12){i=h;return l|0}return 0}function SV(a){a=a|0;var b=0;b=i;XU(a);c[a>>2]=673200;c[a+80>>2]=0;c[a+84>>2]=0;i=b;return}function TV(a){a=a|0;var b=0;b=i;UV(a);v2a(a);i=b;return}function UV(a){a=a|0;var b=0;b=i;c[a>>2]=673200;v2a(c[a+80>>2]|0);v2a(c[a+84>>2]|0);ZU(a);i=b;return}function VV(a,b,d,e,f,g,h,j,k,l,m){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0;n=i;c[a+52>>2]=g;c[a+56>>2]=h;c[a+60>>2]=j;c[a+64>>2]=k;k=a+4|0;c[k>>2]=l;j=a+8|0;c[j>>2]=m;if((l|0)==0){c[k>>2]=e;o=e}else{o=l}if((m|0)==0){c[j>>2]=f;p=f}else{p=m}m=((o+31|0)/32|0)<<2;c[a+32>>2]=m;c[a+16>>2]=o;c[a+20>>2]=p;p=w2a(m,1)|0;c[a+80>>2]=p;if((p|0)==0){i=n;return}p=w2a(m,1)|0;c[a+84>>2]=p;if((p|0)==0){i=n;return}c[a+72>>2]=b;c[a+76>>2]=d;c[a+24>>2]=1;c[a+28>>2]=1;c[a+36>>2]=0;i=n;return}function WV(a){a=a|0;var b=0;b=i;f3a(c[a+84>>2]|0,-1,c[a+32>>2]|0)|0;c[a+68>>2]=0;i=b;return 1}function XV(b){b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;f=c[b+76>>2]<<3;g=b+72|0;h=b+68|0;QV(c[g>>2]|0,f,h)|0;if((c[h>>2]|0)>=(f|0)){j=0;i=e;return j|0}k=b+80|0;l=b+32|0;f3a(c[k>>2]|0,-1,c[l>>2]|0)|0;m=c[b+52>>2]|0;do{if((m|0)<0){n=b+84|0;PV(c[g>>2]|0,f,h,c[k>>2]|0,c[n>>2]|0,c[b+4>>2]|0)|0;c3a(c[n>>2]|0,c[k>>2]|0,c[l>>2]|0)|0}else{if((m|0)==0){RV(c[g>>2]|0,f,h,c[k>>2]|0,c[b+4>>2]|0)|0;break}n=c[h>>2]|0;o=c[g>>2]|0;p=1<<7-((n|0)%8|0)&(d[o+((n|0)/8|0)>>0]|0);c[h>>2]=n+1;n=c[k>>2]|0;if((p|0)==0){p=b+84|0;PV(o,f,h,n,c[p>>2]|0,c[b+4>>2]|0)|0;q=p}else{RV(o,f,h,n,c[b+4>>2]|0)|0;q=b+84|0}c3a(c[q>>2]|0,c[k>>2]|0,c[l>>2]|0)|0}}while(0);if((c[b+56>>2]|0)!=0){QV(c[g>>2]|0,f,h)|0}q=b+60|0;a:do{if((c[q>>2]|0)!=0?(m=c[h>>2]|0,(m|0)<(f|0)):0){n=((m+7|0)/8|0)<<3;b:do{if((m|0)<(n|0)){o=c[g>>2]|0;p=m;while(1){if((1<<7-((p|0)%8|0)&(d[o+((p|0)/8|0)>>0]|0)|0)!=0){break}p=p+1|0;if((p|0)>=(n|0)){break b}}c[q>>2]=0;break a}}while(0);c[h>>2]=n}}while(0);if((c[b+64>>2]|0)!=0?(c[l>>2]|0)>0:0){b=0;do{h=(c[k>>2]|0)+b|0;a[h>>0]=(d[h>>0]|0)^255;b=b+1|0}while((b|0)<(c[l>>2]|0))}j=c[k>>2]|0;i=e;return j|0}function YV(a){a=a|0;var b=0,d=0;b=((c[a+68>>2]|0)+7|0)/8|0;d=c[a+76>>2]|0;return(b>>>0>d>>>0?d:b)|0}function ZV(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0;j=i;i=i+16|0;k=j;if((h|0)==0){l=(f+7|0)/8|0}else{l=h}h=w2a(l,1)|0;if((h|0)==0){i=j;return}f3a(h|0,-1,l|0)|0;m=c[d>>2]|0;c[k>>2]=m;if((g|0)>0){n=b<<3;b=0;do{o=e+(ca(b,l)|0)|0;f3a(o|0,-1,l|0)|0;PV(a,n,k,o,h,f)|0;c3a(h|0,o|0,l|0)|0;b=b+1|0}while((b|0)!=(g|0));p=c[k>>2]|0}else{p=m}v2a(h);c[d>>2]=p;i=j;return}function _V(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=i;h=a+4|0;gla(h);c[a+40>>2]=b;c[a+28>>2]=d;c[a+32>>2]=e;c[a+36>>2]=f;e=w2a(f,1)|0;c[a+20>>2]=e;if((e|0)==0){i=g;return}f3a(e|0,-1,f|0)|0;e=w2a(f<<3,1)|0;c[a+24>>2]=e;if((e|0)==0){i=g;return}lla(h,0,10240);i=g;return}function $V(a){a=a|0;var b=0;b=i;v2a(c[a+20>>2]|0);v2a(c[a+24>>2]|0);ila(c[a+8>>2]|0);i=b;return}function aW(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;g=i;i=i+16|0;h=g+8|0;j=g+4|0;k=g;c[k>>2]=0;l=b+32|0;if((c[l>>2]|0)<=0){m=b+4|0;n=b+8|0;o=c[n>>2]|0;c[e>>2]=o;p=b+12|0;q=c[p>>2]|0;c[f>>2]=q;kla(m);i=g;return}r=b+40|0;s=b+36|0;t=b+24|0;u=b+20|0;v=b+28|0;w=b+4|0;x=0;y=0;do{z=c[s>>2]|0;A=(c[r>>2]|0)+(ca(z,x)|0)|0;f3a(c[t>>2]|0,0,z<<3|0)|0;a[c[t>>2]>>0]=y;z=c[t>>2]|0;B=c[u>>2]|0;C=c[v>>2]|0;D=-1;E=1;while(1){F=1-E|0;G=LV(A,C,D+1|0,F)|0;MV(B,C,D,E,h,j);H=c[j>>2]|0;do{if((H|0)<(G|0)){I=(c[k>>2]|0)+3|0;c[k>>2]=I;J=z+((I|0)/8|0)|0;a[J>>0]=d[J>>0]|0|1<<7-((I|0)%8|0);c[k>>2]=(c[k>>2]|0)+1;K=H;L=E}else{I=c[h>>2]|0;J=G-I|0;if(!((J|0)<4&(I-G|0)<4)){I=LV(A,C,G+1|0,E)|0;M=(c[k>>2]|0)+2|0;c[k>>2]=M;N=z+((M|0)/8|0)|0;a[N>>0]=d[N>>0]|0|1<<7-((M|0)%8|0);c[k>>2]=(c[k>>2]|0)+1;gW(z,k,G-((D|0)<0?0:D)|0,E);gW(z,k,I-G|0,F);K=I;L=E;break}switch(J|0){case 2:case 3:{O=J+2|0;P=11;break};case 0:{I=c[k>>2]|0;M=z+((I|0)/8|0)|0;a[M>>0]=d[M>>0]|0|1<<7-((I|0)%8|0);break};case-1:{Q=1;P=13;break};case-2:case-3:{Q=2-J|0;P=13;break};case 1:{O=1;P=11;break};default:{}}if((P|0)==11){P=0;J=(c[k>>2]|0)+O|0;c[k>>2]=J;I=z+((J|0)/8|0)|0;a[I>>0]=d[I>>0]|0|1<<7-((J|0)%8|0);J=(c[k>>2]|0)+1|0;c[k>>2]=J;I=z+((J|0)/8|0)|0;a[I>>0]=d[I>>0]|0|1<<7-((J|0)%8|0)}else if((P|0)==13){P=0;J=(c[k>>2]|0)+Q|0;c[k>>2]=J;I=z+((J|0)/8|0)|0;a[I>>0]=d[I>>0]|0|1<<7-((J|0)%8|0);c[k>>2]=(c[k>>2]|0)+1}c[k>>2]=(c[k>>2]|0)+1;K=G;L=F}}while(0);if((K|0)<(C|0)){D=K;E=L}else{break}}nla(w,c[t>>2]|0,(c[k>>2]|0)/8|0);E=c[k>>2]|0;y=a[(c[t>>2]|0)+((E|0)/8|0)>>0]|0;c[k>>2]=(E|0)%8|0;c3a(c[u>>2]|0,A|0,c[s>>2]|0)|0;x=x+1|0}while((x|0)<(c[l>>2]|0));if((c[k>>2]|0)==0){m=w;n=b+8|0;o=c[n>>2]|0;c[e>>2]=o;p=b+12|0;q=c[p>>2]|0;c[f>>2]=q;kla(m);i=g;return}vF(w,y);m=w;n=b+8|0;o=c[n>>2]|0;c[e>>2]=o;p=b+12|0;q=c[p>>2]|0;c[f>>2]=q;kla(m);i=g;return}function bW(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;a=i;i=i+48|0;h=a;_V(h,b,c,d,e);aW(h,f,g);$V(h);i=a;return 1}function cW(a,b,c,d,e,f,g,h,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0;a=i;m=u2a(88)|0;SV(m);if((m|0)==0){n=0;i=a;return n|0}VV(m,b,c,d,e,f,g,h,j,k,l);n=m;i=a;return n|0}function dW(a,b,c){a=a|0;b=b|0;c=c|0;return}function eW(a){a=a|0;return}function fW(a){a=a|0;var b=0;b=i;v2a(a);i=b;return}function gW(a,b,c,e){a=a|0;b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;if((c|0)>2559){g=((c+ -2560|0)>>>0)%2560|0;h=c;do{hW(a,b,31,12);h=h+ -2560|0}while((h|0)>2559);j=g}else{j=c}if((j|0)>63){c=(e|0)!=0?673288:673368;g=((j|0)/64|0)<<1;hW(a,b,d[c+(g+ -2)>>0]|0,d[c+(g+ -1)>>0]|0)}g=(e|0)!=0?673448:673576;e=((j|0)%64|0)<<1;hW(a,b,d[g+e>>0]|0,d[g+(e|1)>>0]|0);i=f;return}function hW(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0;h=i;if((g|0)>0){j=g}else{i=h;return}do{j=j+ -1|0;if((1<<j&f|0)!=0){g=c[e>>2]|0;k=b+((g|0)/8|0)|0;a[k>>0]=d[k>>0]|0|1<<7-((g|0)%8|0)}c[e>>2]=(c[e>>2]|0)+1}while((j|0)>0);i=h;return}function iW(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;c[a+12>>2]=b;c[a+16>>2]=d;f=a+20|0;g=c[f>>2]|0;h=f_(a)|0;a=(c[f>>2]|0)-g|0;if(!(a>>>0<d>>>0)){i=e;return h|0}f3a(b+a|0,0,d-a|0)|0;i=e;return h|0}function jW(a){a=a|0;var b=0;b=i;h_(a);Ic[c[a+36>>2]&511](0,a);i=b;return}function kW(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=a+20104|0;g=c[f>>2]|0;h=a+16|0;if(((c[h>>2]|0)+g|0)==4094){i=e;return}c[f>>2]=g+1;c[a+(g<<2)+20>>2]=d&255|b<<16;b=(c[h>>2]|0)+(c[f>>2]|0)|0;if((b|0)==766){c[a+24112>>2]=11;i=e;return}else if((b|0)==254){c[a+24112>>2]=10;i=e;return}else if((b|0)==1790){c[a+24112>>2]=12;i=e;return}else{i=e;return}}function lW(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;f=d+ -258|0;a:do{if((f|0)<0){g=d;h=b+24108|0}else{j=b+20104|0;k=b+24108|0;l=d;m=f;while(1){if((m|0)>=(c[j>>2]|0)){g=l;h=k;break a}n=c[b+(m<<2)+20>>2]|0;o=c[k>>2]|0;if(o>>>0>3999){break}c[k>>2]=o+1;a[b+o+20108>>0]=n;o=n>>>16;m=o+ -258|0;if((m|0)<0){g=o;h=k;break a}else{l=o}}i=e;return}}while(0);f=c[h>>2]|0;if(f>>>0>3999){i=e;return}c[h>>2]=f+1;a[b+f+20108>>0]=g;i=e;return}function mW(b,e,f,g,h,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;k=i;l=b+24112|0;c[l>>2]=9;c[b>>2]=0;m=b+4|0;c[m>>2]=0;n=b+12|0;c[n>>2]=g;g=b+8|0;c[g>>2]=e;c[b+16>>2]=(j|0)!=0&1;j=b+20104|0;c[j>>2]=0;a:do{if(!(c[h>>2]<<3>>>0<9)){e=b+24108|0;o=b+20108|0;p=9;q=0;r=0;s=-1;b:while(1){t=q;u=p;v=s;while(1){w=t>>>3;x=t&7;if((x|0)==0){y=u;z=w;A=0}else{B=8-x|0;x=u-B|0;y=x;z=w+1|0;A=((d[(c[n>>2]|0)+w>>0]|0)&(1<<B)+ -1)<<x}if((y|0)>=8){x=y+ -8|0;B=c[n>>2]|0;w=(d[B+z>>0]|0)<<x|A;if((x|0)==0){C=w}else{C=(d[B+(z+1)>>0]|0)>>>(16-y|0)|w}}else{C=(d[(c[n>>2]|0)+z>>0]|0)>>>(8-y|0)|A}t=t+u|0;c[b>>2]=t;if(C>>>0<256){D=11;break}if((C|0)==257){break a}else if((C|0)!=256){D=19;break}c[l>>2]=9;c[j>>2]=0;if((t+9|0)>>>0>c[h>>2]<<3>>>0){break a}else{u=9;v=-1}}do{if((D|0)==11){D=0;u=c[m>>2]|0;if((u|0)==(c[f>>2]|0)){E=-5;D=34;break b}t=c[g>>2]|0;w=C&255;if((t|0)==0){F=u}else{a[t+u>>0]=w;F=c[m>>2]|0}c[m>>2]=F+1;if((v|0)==-1){G=w}else{kW(b,v,w);G=w}}else if((D|0)==19){D=0;if((v|0)==-1){E=2;D=34;break b}c[e>>2]=0;if(C>>>0<((c[j>>2]|0)+258|0)>>>0){lW(b,C)}else{c[e>>2]=1;a[o>>0]=r;lW(b,v)}w=c[m>>2]|0;u=c[e>>2]|0;if((u+w|0)>>>0>(c[f>>2]|0)>>>0){E=-5;D=34;break b}t=c[g>>2]|0;c:do{if((t|0)!=0){if((u|0)==0){H=0;I=w}else{B=u;x=w;J=t;K=0;while(1){a[J+(x+K)>>0]=a[b+(B+~K)+20108>>0]|0;L=K+1|0;M=c[e>>2]|0;N=c[m>>2]|0;if(!(L>>>0<M>>>0)){H=M;I=N;break c}B=M;x=N;J=c[g>>2]|0;K=L}}}else{H=u;I=w}}while(0);O=I+H|0;c[m>>2]=O;w=a[b+(H+ -1)+20108>>0]|0;if(v>>>0<256){kW(b,v,w);G=w;break}if(!((v+ -258|0)>>>0<(c[j>>2]|0)>>>0)){D=31;break b}kW(b,v,w);G=w}}while(0);q=c[b>>2]|0;p=c[l>>2]|0;if((p+q|0)>>>0>c[h>>2]<<3>>>0){break a}else{r=G;s=C}}if((D|0)==31){c[f>>2]=O;c[h>>2]=((c[b>>2]|0)+7|0)>>>3;E=0;i=k;return E|0}else if((D|0)==34){i=k;return E|0}}}while(0);c[f>>2]=c[m>>2];c[h>>2]=((c[b>>2]|0)+7|0)>>>3;E=0;i=k;return E|0}function nW(a){a=a|0;var b=0,d=0;b=i;XU(a);c[a>>2]=673712;c[a+52>>2]=0;d=a+64|0;c[a+100>>2]=0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;i=b;return}function oW(a){a=a|0;var b=0;b=i;pW(a);v2a(a);i=b;return}function pW(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=673712;v2a(c[a+64>>2]|0);v2a(c[a+68>>2]|0);v2a(c[a+72>>2]|0);v2a(c[a+76>>2]|0);d=c[a+52>>2]|0;if((d|0)==0){ZU(a);i=b;return}jW(d);ZU(a);i=b;return}function qW(a,b,d,e,f,g,h,j,k,l,m){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0;n=i;c[a+56>>2]=b;c[a+60>>2]=d;c[a+4>>2]=e;c[a+16>>2]=e;c[a+8>>2]=f;c[a+20>>2]=f;c[a+24>>2]=g;c[a+28>>2]=h;c[a+36>>2]=0;f=((ca(ca(g,e)|0,h)|0)+7|0)/8|0;c[a+32>>2]=f;d=w2a(f,1)|0;c[a+64>>2]=d;if((d|0)==0){i=n;return}d=a+80|0;c[d>>2]=0;if((j|0)==0){i=n;return}if((j|0)<=9){if((j|0)==2){o=1}else{i=n;return}}else{o=2}c[d>>2]=o;o=(ca(ca(l,k)|0,m)|0)==0;d=o?g:k;k=o?h:l;l=o?e:m;c[a+84>>2]=d;c[a+88>>2]=k;c[a+92>>2]=l;m=((ca(ca(k,l)|0,d)|0)+7|0)/8|0;c[a+96>>2]=m;d=w2a(m,1)|0;c[a+68>>2]=d;if((d|0)==0){i=n;return}d=w2a(m+1|0,1)|0;c[a+76>>2]=d;if((d|0)==0){i=n;return}c[a+72>>2]=w2a(m,1)|0;i=n;return}function rW(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=a+52|0;e=c[d>>2]|0;if((e|0)!=0){jW(e)}e=w2a(56,1)|0;if((e|0)==0){c[d>>2]=0;f=0;i=b;return f|0}else{g=e+0|0;h=g+56|0;do{c[g>>2]=0;g=g+4|0}while((g|0)<(h|0));c[e+32>>2]=191;c[e+36>>2]=307;e_(e);c[d>>2]=e;d=c[a+60>>2]|0;c[e>>2]=c[a+56>>2];c[e+4>>2]=d;c[a+100>>2]=0;f=1;i=b;return f|0}return 0}function sW(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;a=i;d=w2a(ca(c,b)|0,1)|0;i=a;return d|0}function tW(a,b){a=a|0;b=b|0;a=i;v2a(b);i=a;return}function uW(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;b=i;d=a+80|0;e=c[d>>2]|0;if((e|0)==0){f=a+64|0;iW(c[a+52>>2]|0,c[f>>2]|0,c[a+32>>2]|0)|0;g=f;h=c[g>>2]|0;i=b;return h|0}f=a+32|0;j=c[f>>2]|0;k=a+96|0;l=c[k>>2]|0;if((j|0)==(l|0)){m=c[a+52>>2]|0;if((e|0)==2){e=a+76|0;iW(m,c[e>>2]|0,j+1|0)|0;n=a+64|0;o=a+68|0;vW(c[n>>2]|0,c[e>>2]|0,c[o>>2]|0,c[a+88>>2]|0,c[a+84>>2]|0,c[a+92>>2]|0);c3a(c[o>>2]|0,c[n>>2]|0,c[k>>2]|0)|0;g=n;h=c[g>>2]|0;i=b;return h|0}else{n=a+64|0;iW(m,c[n>>2]|0,j)|0;wW(c[n>>2]|0,c[k>>2]|0,c[a+28>>2]|0,c[a+24>>2]|0,c[a+16>>2]|0);g=n;h=c[g>>2]|0;i=b;return h|0}}n=a+100|0;m=c[n>>2]|0;o=(m|0)>(j|0)?j:m;if((o|0)==0){p=j}else{c3a(c[a+64>>2]|0,(c[a+72>>2]|0)+(l-m)|0,o|0)|0;c[n>>2]=(c[n>>2]|0)-o;p=j-o|0}if((p|0)==0){g=a+64|0;h=c[g>>2]|0;i=b;return h|0}o=a+52|0;j=a+76|0;m=a+72|0;l=a+68|0;e=a+88|0;q=a+84|0;r=a+92|0;s=a+64|0;a=p;while(1){p=c[o>>2]|0;if((c[d>>2]|0)==2){iW(p,c[j>>2]|0,(c[k>>2]|0)+1|0)|0;vW(c[m>>2]|0,c[j>>2]|0,c[l>>2]|0,c[e>>2]|0,c[q>>2]|0,c[r>>2]|0);c3a(c[l>>2]|0,c[m>>2]|0,c[k>>2]|0)|0}else{iW(p,c[m>>2]|0,c[k>>2]|0)|0;wW(c[m>>2]|0,c[k>>2]|0,c[e>>2]|0,c[q>>2]|0,c[r>>2]|0)}p=c[k>>2]|0;t=(p|0)>(a|0)?a:p;c3a((c[s>>2]|0)+((c[f>>2]|0)-a)|0,c[m>>2]|0,t|0)|0;c[n>>2]=(c[k>>2]|0)-t+(c[n>>2]|0);if((a|0)==(t|0)){g=s;break}a=a-t|0}h=c[g>>2]|0;i=b;return h|0}function vW(b,c,d,e,f,g){b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;h=i;j=ca(f,e)|0;e=ca(j,g)|0;g=(e+7|0)/8|0;f=(j+7|0)/8|0;j=a[c>>0]|0;k=j&255;if(j<<24>>24==0){d3a(b|0,c+1|0,g|0)|0;i=h;return}if((e|0)<=0){i=h;return}e=(d|0)==0;j=0;do{l=j;j=j+1|0;m=a[c+j>>0]|0;if((k|0)==1){if((l|0)<(f|0)){n=0}else{n=a[b+(l-f)>>0]|0}a[b+l>>0]=(n&255)+(m&255)}else if((k|0)==4){o=(l|0)>=(f|0);if(o){p=a[b+(l-f)>>0]|0}else{p=0}if(!e){q=a[d+l>>0]|0;if(o){r=q;s=a[d+(l-f)>>0]|0}else{r=q;s=0}}else{r=0;s=0}a[b+l>>0]=((GW(p&255,r&255,s&255)|0)&255)+(m&255)}else if((k|0)==2){if(e){t=0}else{t=a[d+l>>0]|0}a[b+l>>0]=(t&255)+(m&255)}else if((k|0)==3){if((l|0)<(f|0)){u=0}else{u=a[b+(l-f)>>0]|0}if(e){v=0}else{v=a[d+l>>0]|0}a[b+l>>0]=(((v&255)+(u&255)|0)>>>1)+(m&255)}else{a[b+l>>0]=m}}while((j|0)<(g|0));i=h;return}function wW(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;h=i;j=ca(f,e)|0;if((e|0)==1){if((ca(j,g)|0)<=1){i=h;return}k=ca(g,f)|0;f=1;do{g=(f|0)%8|0;l=(f|0)/8|0;m=(g|0)==0;n=b+l|0;o=d[n>>0]|0;p=7-g|0;q=1<<p;if((((d[b+((m<<31>>31)+l)>>0]|0)>>>(m?0:8-g|0)^o>>>p)&1|0)==0){r=o&(q^255)}else{r=o|q}a[n>>0]=r;f=f+1|0}while((f|0)!=(k|0));i=h;return}k=(j|0)/8|0;j=(k|0)<(c|0);if((e|0)==16){if(j){s=k}else{i=h;return}do{e=s-k|0;f=b+s|0;r=b+(s+1)|0;n=((d[f>>0]|0)<<8|(d[r>>0]|0))+((d[b+e>>0]|0)<<8|(d[b+(e+1)>>0]|0))|0;a[f>>0]=n>>>8;a[r>>0]=n;s=s+2|0}while((s|0)<(c|0));i=h;return}else{if(j){t=k}else{i=h;return}do{j=b+t|0;a[j>>0]=(d[j>>0]|0)+(d[b+(t-k)>>0]|0);t=t+1|0}while((t|0)!=(c|0));i=h;return}}function xW(a){a=a|0;return c[(c[a+52>>2]|0)+8>>2]|0}function yW(a,b,c,d,e,f,g,h,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0;a=i;m=u2a(104)|0;nW(m);if((m|0)==0){n=0;i=a;return n|0}qW(m,b,c,d,e,f,g,h,j,k,l);n=m;i=a;return n|0}function zW(b,d,e,f,g,h,j,k,l,m,n,o){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;var p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0;b=i;i=i+32|0;p=b+8|0;q=b;c[n>>2]=0;c[q>>2]=0;if((h|0)!=0){if((h|0)>9){r=2}else{r=(h|0)==2&1}}else{r=0}do{if((d|0)!=0){h=u2a(24116)|0;if((h|0)==0){s=-1;i=b;return s|0}c[o>>2]=-1;c[q>>2]=f;t=mW(h,0,o,e,q,g)|0;v2a(h);if((t|0)!=0){s=-1;i=b;return s|0}t=c[o>>2]|0;if((t|0)==-1|(t|0)==0){s=-1;i=b;return s|0}h=u2a(24116)|0;if((h|0)==0){s=-1;i=b;return s|0}u=w2a(t+1|0,1)|0;c[n>>2]=u;if((u|0)==0){s=-1;i=b;return s|0}else{a[u+(c[o>>2]|0)>>0]=0;mW(h,u,o,e,q,g)|0;v2a(h);break}}else{h=(m|0)!=0;u=h?m:f<<1;if(h){v=10240}else{v=f>>>0<10240?10240:f}h=u>>>0>1e7;t=h?1e7:v;w=h?1e7:u;u=w2a(w+1|0,1)|0;if((u|0)==0){c[n>>2]=0;c[o>>2]=0;break}a[u+w>>0]=0;h=f>>>0<10240;x=w2a(56,1)|0;if((x|0)==0){c[n>>2]=0;c[o>>2]=0;break}y=x+0|0;z=y+56|0;do{c[y>>2]=0;y=y+4|0}while((y|0)<(z|0));c[x+32>>2]=191;c[x+36>>2]=307;e_(x);c[x>>2]=e;c[x+4>>2]=f;Ija(p,4);y=x+16|0;z=u;A=w;B=u;C=w;a:while(1){D=A+1|0;E=z;while(1){F=iW(x,E,A)|0;G=c[y>>2]|0;H=(F|0)!=0;if(h){break}if(H){I=21;break a}HW(p,E);if((G|0)!=0){I=32;break a}F=w2a(D,1)|0;if((F|0)==0){I=24;break a}a[F+A>>0]=0;E=F}if(!((G|0)==0&(H^1))){I=39;break}D=C+t|0;if(D>>>0<C>>>0|(D|0)==-1){I=28;break}F=x2a(B,D+1|0)|0;if((F|0)==0){I=30;break}a[F+D>>0]=0;z=F+C|0;A=t;B=F;C=D}b:do{if((I|0)==21){HW(p,E);I=32}else if((I|0)==24){c[n>>2]=0;c[o>>2]=0}else if((I|0)==28){c[n>>2]=0;c[o>>2]=0}else if((I|0)==30){c[n>>2]=0;c[o>>2]=0}else if((I|0)==39){t=c[x+20>>2]|0;c[o>>2]=t;c[q>>2]=c[x+8>>2];do{if(C>>>1>>>0>t>>>0){z=x2a(B,t+1|0)|0;if((z|0)==0){c[n>>2]=0;c[o>>2]=0;break b}else{a[z+(c[o>>2]|0)>>0]=0;J=z;break}}else{J=B}}while(0);c[n>>2]=J;I=44}}while(0);do{if((I|0)==32){B=c[x+20>>2]|0;c[o>>2]=B;c[q>>2]=c[x+8>>2];C=p+4|0;t=c[C>>2]|0;if((t|0)==1){c[n>>2]=c[c[p>>2]>>2];I=44;break}z=w2a(B,1)|0;if((z|0)==0){c[n>>2]=0;c[o>>2]=0;break}if((t|0)>0){t=0;B=0;while(1){h=c[(IW(p,t)|0)>>2]|0;y=A-((t|0)==((c[C>>2]|0)+ -1|0)?G:0)|0;c3a(z+B|0,h|0,y|0)|0;v2a(h);c[(IW(p,t)|0)>>2]=0;t=t+1|0;if((t|0)>=(c[C>>2]|0)){break}else{B=y+B|0}}}c[n>>2]=z;I=44}}while(0);if((I|0)==44){jW(x)}Jja(c[p>>2]|0)}}while(0);if((r|0)==0){s=c[q>>2]|0;i=b;return s|0}else if((r|0)==1){p=((ca(ca(k,j)|0,l)|0)+7|0)/8|0;I=c[o>>2]|0;G=((p+ -1+I|0)>>>0)/(p>>>0)|0;J=(I>>>0)%(p>>>0)|0;if((G|0)>0?(E=(p|0)>(I|0)?J:p,wW(c[n>>2]|0,E,k,j,l),(G|0)>1):0){p=E;E=1;do{I=(c[n>>2]|0)+(ca(E,p)|0)|0;E=E+1|0;H=(ca(E,p)|0)>(c[o>>2]|0);p=H?J:p;wW(I,p,k,j,l)}while((E|0)<(G|0))}}else if((r|0)==2?(r=ca(k,j)|0,j=(r+7|0)/8|0,k=ca(r,l)|0,l=(k+7|0)/8|0,r=c[o>>2]|0,G=l+1|0,E=((r+l|0)>>>0)/(G>>>0)|0,p=(r>>>0)%(G>>>0)|0,r=ca(E,l)|0,J=w2a(r,1)|0,(J|0)!=0):0){if((E|0)>0){I=p+ -1|0;H=(k|0)>0;k=0;f=J;e=c[n>>2]|0;v=0;while(1){m=a[e>>0]|0;g=m&255;if(m<<24>>24==0){m=v+1|0;d=ca(m,G)|0;A=(d|0)>(c[o>>2]|0)?I:l;d3a(f|0,e+1|0,A|0)|0;d=A+1|0;K=d;L=m;M=d+k|0;N=A}else{c:do{if(H){A=(v|0)==0;d=0;m=k;while(1){if((m|0)>=(c[o>>2]|0)){O=m;break c}B=d;d=d+1|0;C=a[e+d>>0]|0;if((g|0)==3){if((B|0)<(j|0)){P=0}else{P=a[f+(B-j)>>0]|0}if(A){Q=0}else{Q=a[f+(B-l)>>0]|0}a[f+B>>0]=(((Q&255)+(P&255)|0)>>>1)+(C&255)}else if((g|0)==4){t=(B|0)>=(j|0);if(t){R=a[f+(B-j)>>0]|0}else{R=0}if(!A){y=B-l|0;h=a[f+y>>0]|0;if(t){S=h;T=a[f+(y-j)>>0]|0}else{S=h;T=0}}else{S=0;T=0}a[f+B>>0]=((GW(R&255,S&255,T&255)|0)&255)+(C&255)}else if((g|0)==1){if((B|0)<(j|0)){U=0}else{U=a[f+(B-j)>>0]|0}a[f+B>>0]=(U&255)+(C&255)}else if((g|0)==2){if(A){V=0}else{V=a[f+(B-l)>>0]|0}a[f+B>>0]=(V&255)+(C&255)}else{a[f+B>>0]=C}C=m+1|0;if((d|0)>=(l|0)){O=C;break}else{m=C}}}else{O=k}}while(0);K=G;L=v+1|0;M=O+1|0;N=l}if((L|0)<(E|0)){k=M;f=f+N|0;e=e+K|0;v=L}else{break}}}v2a(c[n>>2]|0);c[n>>2]=J;c[o>>2]=r-((p|0)>0?G-p|0:0)}s=c[q>>2]|0;i=b;return s|0}function AW(b,e,f,g,h,j,k,l,m){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0;n=i;if((g|0)!=2&(g|0)<10){o=ed[c[(c[b>>2]|0)+20>>2]&127](b,e,f,l,m)|0;i=n;return o|0}p=w2a(f,1)|0;if((p|0)==0){o=0;i=n;return o|0}c3a(p|0,e|0,f|0)|0;if((g|0)==2){e=ca(j,h)|0;q=ca(e,k)|0;r=(q+7|0)/8|0;s=((f+ -1+r|0)>>>0)/(r>>>0)|0;t=(f>>>0)%(r>>>0)|0;if((s|0)>0){u=(e|0)/8|0;e=(j|0)<8;v=q-j|0;q=(v|0)<(j|0);w=(j|0)==8;x=(j|0)==2?3:(j|0)==4?15:1;y=0;z=r;do{r=ca(y,z)|0;y=y+1|0;A=(ca(y,z)|0)>(f|0);z=A?t:z;do{if(e){if(!q){A=v;do{B=(A|0)%8|0;C=(B|0)==0;D=((A|0)/8|0)+r|0;E=p+D|0;F=d[E>>0]|0;G=8-B|0;B=G-j|0;a[E>>0]=((F>>>B&x)-((d[p+(D+(C<<31>>31))>>0]|0)>>>(C?0:G)&x)&x)<<B|(x<<B^255)&F;A=A-j|0}while((A|0)>=(j|0))}}else{if(w){if((u|0)>=(z|0)){break}A=r-u|0;F=z;do{F=F+ -1|0;B=p+(F+r)|0;a[B>>0]=(d[B>>0]|0)-(d[p+(A+F)>>0]|0)}while((F|0)>(u|0))}else{F=z-u|0;if((F|0)<(u|0)){break}A=r+1|0;B=F;do{F=p+(B+r)|0;G=p+(B+A)|0;B=B-u|0;C=((d[F>>0]|0)<<8|(d[G>>0]|0))-((d[p+(B+r)>>0]|0)<<8|(d[p+(B+A)>>0]|0))|0;a[F>>0]=C>>>8;a[G>>0]=C}while((B|0)>=(u|0))}}}while(0)}while((y|0)<(s|0));H=p;I=f}else{H=p;I=f}}else{if((g|0)>9?(s=ca(j,h)|0,h=(s+7|0)/8|0,j=ca(s,k)|0,k=(j+7|0)/8|0,s=((f+ -1+k|0)>>>0)/(k>>>0)|0,y=(f>>>0)%(k>>>0)|0,u=k+1|0,z=ca(s,u)|0,w=w2a(z,1)|0,(w|0)!=0):0){if((s|0)>0){x=(g|0)==10;v=(j|0)>0;j=0;q=w;e=p;t=0;while(1){if(x){a[q>>0]=0;r=t+1|0;if((ca(r,k)|0)>(f|0)){J=f-(ca(t,k)|0)|0}else{J=k}d3a(q+1|0,e|0,J|0)|0;K=J+1|0;L=r;M=J+j|0;N=J}else{a:do{if(v){r=(t|0)==0;B=0;A=j;while(1){if((A|0)>=(f|0)){O=A;break a}if((g|0)==14){a[q>>0]=4;C=(B|0)>=(h|0);if(C){P=a[e+(B-h)>>0]|0}else{P=0}if(!r){G=B-k|0;F=a[e+G>>0]|0;if(C){Q=F;R=a[e+(G-h)>>0]|0}else{Q=F;R=0}}else{Q=0;R=0}F=d[e+B>>0]|0;a[q+(B+1)>>0]=F-((GW(P&255,Q&255,R&255)|0)&255)}else if((g|0)==13){a[q>>0]=3;if((B|0)<(h|0)){S=0}else{S=a[e+(B-h)>>0]|0}if(r){T=0}else{T=a[e+(B-k)>>0]|0}a[q+(B+1)>>0]=(d[e+B>>0]|0)-(((T&255)+(S&255)|0)>>>1)}else if((g|0)==12){a[q>>0]=2;if(r){U=0}else{U=a[e+(B-k)>>0]|0}a[q+(B+1)>>0]=(d[e+B>>0]|0)-(U&255)}else if((g|0)==11){a[q>>0]=1;if((B|0)<(h|0)){V=0}else{V=a[e+(B-h)>>0]|0}a[q+(B+1)>>0]=(d[e+B>>0]|0)-(V&255)}else{a[q+(B+1)>>0]=a[e+B>>0]|0}F=A+1|0;B=B+1|0;if((B|0)>=(k|0)){O=F;break}else{A=F}}}else{O=j}}while(0);K=u;L=t+1|0;M=O;N=k}if((L|0)<(s|0)){j=M;q=q+K|0;e=e+N|0;t=L}else{break}}}v2a(p);H=w;I=z-((y|0)>0?k-y|0:0)|0}else{H=p;I=f}}f=ed[c[(c[b>>2]|0)+20>>2]&127](b,H,I,l,m)|0;v2a(H);o=f;i=n;return o|0}function BW(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;a=i;i=i+16|0;g=a;h=d+12+((d>>>0)/1e3|0)|0;c[f>>2]=h;j=w2a(h,1)|0;c[e>>2]=j;if((j|0)==0){k=0;i=a;return k|0}c[g>>2]=c[f>>2];OZ(j,g,b,d);c[f>>2]=c[g>>2];k=1;i=a;return k|0}function CW(a,b,c){a=a|0;b=b|0;c=c|0;return}function DW(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}Rc[c[(c[a>>2]|0)+4>>2]&1023](a);i=b;return}function EW(a){a=a|0;return}function FW(a){a=a|0;var b=0;b=i;v2a(a);i=b;return}function GW(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=b+a-c|0;f=e-a|0;g=(f|0)>-1?f:0-f|0;f=e-b|0;h=(f|0)>-1?f:0-f|0;f=e-c|0;e=(f|0)>-1?f:0-f|0;if(!((g|0)>(h|0)|(g|0)>(e|0))){j=a;k=j&255;i=d;return k|0}j=(h|0)>(e|0)?c:b;k=j&255;i=d;return k|0}function HW(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+4|0;f=c[e>>2]|0;g=f+1|0;do{if((f|0)>=(c[a+8>>2]|0)){if((Kja(a,g)|0)==0){i=d;return}else{h=c[e>>2]|0;break}}else{c[e>>2]=g;h=g}}while(0);c[(c[a>>2]|0)+(h+ -1<<2)>>2]=b;i=d;return}function IW(b,d){b=b|0;d=d|0;var e=0;e=i;if(!((d|0)>=0?(c[b+4>>2]|0)>(d|0):0)){a[0]=0;da()}i=e;return(c[b>>2]|0)+(d<<2)|0}function JW(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=i;do{if((b+ -1|0)>>>0>14){e=0}else{if((a|0)==1380401696){if(!((c|0)==0|(b|0)==3)){e=0;break}}else if((a|0)==1129142603){if(!((c|0)==0|(b|0)==4)){e=0;break}}else if((a|0)==1196573017){f=(c|0)==0;if(f&(b|0)>2|(f|(b|0)==1)^1){e=0;break}}else if((a|0)==1281450528){if((b|0)<3){e=0;break}}else{if((b|0)!=3){e=0;break}}e=1}}while(0);i=d;return e|0}function KW(a,b,d,e,f,g,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;l=i;m=t2(a,b)|0;if((m|0)==0){n=0;i=l;return n|0}if((e|0)==0&(f|0)==0&(g|0)==3){o=h8()|0}else{o=t2(e,f)|0}if((o|0)==0){r2(m);n=0;i=l;return n|0}f=j2(m)|0;if((JW(f,d,0)|0)==0){r2(m);r2(o);n=0;i=l;return n|0}e=d<<3;if((f|0)!=1281450528){b=e|1;if((f|0)==1380401696){p=0;q=(j&1024|0)==0?b:e|1025}else{p=0;q=b}}else{p=1;q=e|655360}e=j2(o)|0;if((JW(e,g,1)|0)==0){r2(m);r2(o);n=0;i=l;return n|0}if((e|0)==1129142603){r=y8(m,q,o,k&1024|393249,h,0)|0;s=19}else if((e|0)==1196573017){r=y8(m,q,o,196617,h,0)|0;s=19}else if((e|0)==1380401696){r=y8(m,q,o,263193,h,0)|0;s=19}if((s|0)==19?(r|0)!=0:0){s=u2a(16)|0;if((s|0)==0){n=0;i=l;return n|0}c[s+4>>2]=d;c[s+8>>2]=g;c[s>>2]=r;c[s+12>>2]=p;r2(m);r2(o);n=s;i=l;return n|0}r2(m);r2(o);n=0;i=l;return n|0}function LW(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;f=i;g=KW(a,b,c,0,0,3,d,e,0)|0;i=f;return g|0}function MW(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}o8(c[a>>2]|0);v2a(a);i=b;return}function NW(b,e,f,j){b=b|0;e=e|0;f=f|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0;k=i;i=i+160|0;l=k+156|0;m=k;n=k+136|0;if((b|0)==0){i=k;return}if((c[b+12>>2]|0)==0){fX(n,e);o=n+16|0;p=c[o>>2]|0;q=(p|0)==0?n:p;if((e|0)!=0){p=0;do{r=+g[f+(p<<2)>>2];do{if(!(r>1.0)){if(r<0.0){a[q+p>>0]=0;break}else{a[q+p>>0]=~~(r*255.0);break}}else{a[q+p>>0]=-1}}while(0);p=p+1|0}while((p|0)!=(e|0))}p8(c[b>>2]|0,q,l,1);v2a(c[o>>2]|0)}else{hX(m,e);o=m+128|0;q=c[o>>2]|0;p=(q|0)==0?m:q;if((e|0)!=0){q=0;do{h[p+(q<<3)>>3]=+g[f+(q<<2)>>2];q=q+1|0}while((q|0)!=(e|0))}p8(c[b>>2]|0,p,l,1);gX(c[o>>2]|0)}o=c[b+8>>2]|0;if((o|0)==3){g[j>>2]=+(d[l+2>>0]|0|0)/255.0;g[j+4>>2]=+(d[l+1>>0]|0|0)/255.0;g[j+8>>2]=+(d[l>>0]|0|0)/255.0;i=k;return}else if((o|0)==4){g[j>>2]=+(d[l>>0]|0|0)/255.0;g[j+4>>2]=+(d[l+1>>0]|0|0)/255.0;g[j+8>>2]=+(d[l+2>>0]|0|0)/255.0;g[j+12>>2]=+(d[l+3>>0]|0|0)/255.0;i=k;return}else if((o|0)==1){g[j>>2]=+(d[l>>0]|0|0)/255.0;i=k;return}else{i=k;return}}function OW(a){a=+a;var b=0,c=0,d=0,e=0;b=i;i8();if((j8(724200,6504.0)|0)!=0?(c=U0(0,a)|0,(c|0)!=0):0){d=d8(c)|0;V0(c);e=d}else{e=0}i=b;return e|0}function PW(a){a=a|0;var b=0,c=0,d=0;b=i;a:do{if((a|0)==0){c=0}else{d=j2(a)|0;do{if((d|0)==1196573017){c=8;break a}else if((d|0)==1212961568){c=7;break a}else if((d|0)==1282766368){c=3;break a}else if((d|0)==1129142603){c=10;break a}else if((d|0)==1213421088){c=6;break a}else if((d|0)==1482250784){c=1;break a}else if((d|0)==1129142560){c=11;break a}else if((d|0)==1380401696){c=9;break a}else if((d|0)==1497588338){c=4;break a}else if((d|0)==1281450528){c=2;break a}else if((d|0)==1501067552){c=5;break a}else{c=0;break a}}while(0)}}while(0);i=b;return c|0}function QW(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;a=i;d=t2(b,c)|0;if((d|0)==0){e=0;i=a;return e|0}c=PW(d)|0;r2(d);e=c;i=a;return e|0}function RW(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;if((b|0)==0){e=0;i=d;return e|0}f=Lc[c[(c[b>>2]|0)+16>>2]&255](b)|0;g=w2a(f,1)|0;if((g|0)==0){e=0;i=d;return e|0}id[c[(c[b>>2]|0)+28>>2]&511](b,g,0,f)|0;b=Qc[c[(c[a>>2]|0)+8>>2]&255](a,g,f)|0;v2a(g);e=b;i=d;return e|0}function SW(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=i;d=j2(a)|0;do{if((d|0)==1213421088){e=786457}else if((d|0)==1281450528){e=4849688}else if((d|0)==1129142603){e=b&1024|393249}else if((d|0)==1497588338){e=458777}else if((d|0)==1129142560){e=327705}else if((d|0)==1482250784){e=589850}else if((d|0)==1212961568){e=851993}else if((d|0)==1296255030){e=1310769}else if((d|0)==1296255031){e=b&1024|1376313}else if((d|0)==1296255041){e=b&1024|1572945}else if((d|0)==1296255029){e=b&1024|1245225}else if((d|0)==1196573017){e=196617}else if((d|0)==1296255032){e=b&1024|1441857}else if((d|0)==1296255043){e=b&1024|1704033}else if((d|0)==1501067552){e=917530}else if((d|0)==1296255042){e=b&1024|1638489}else if((d|0)==1296255033){e=b&1024|1507401}else if((d|0)==1282766368){e=524313}else if((d|0)==1380401696){e=b&1024^263193}else{e=0}}while(0);i=c;return e|0}function TW(a){a=a|0;var b=0;b=i;if((a|0)!=0){r2(a)}i=b;return}function UW(a){a=a|0;var b=0,d=0;b=i;d=c[a>>2]|0;if((d|0)!=0){o8(d)}d=c[a+8>>2]|0;if((d|0)==0){i=b;return}v2a(d);i=b;return}function VW(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;c[e>>2]=b;nla(a,e,4);i=d;return a|0}function WW(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;g=i;i=i+80|0;j=g;l=g+48|0;m=g+32|0;n=g+28|0;o=g+56|0;p=g+24|0;q=g+16|0;r=g+8|0;c[l>>2]=0;gla(m);c[n>>2]=0;s=d+4|0;t=VW(m,c[s>>2]|0)|0;u=d+8|0;VW(t,c[u>>2]|e<<8)|0;e=c[u>>2]|0;if((e|0)==2){t=o+0|0;v=t+16|0;do{a[t>>0]=0;t=t+1|0}while((t|0)<(v|0));if((c[s>>2]|0)==8){h[k>>3]=+h[d+24>>3];c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];Jka(n,673808,j)}j=Bka(n,0)|0;t=c[n>>2]|0;if((t|0)==0){w=0}else{w=c[t+4>>2]|0}R3(j,w,o);x=o}else if((e|0)==1){R3(c[d+16>>2]|0,c[d+20>>2]|0,o);x=o}else if((e|0)==0){y=0;z=m+4|0;dka(n);A=c[z>>2]|0;ila(A);i=g;return y|0}else{x=o}nla(m,x,16);x=m+4|0;gka(p,c[x>>2]|0,c[m+8>>2]|0);m=Bka(p,0)|0;o=c[p>>2]|0;if((o|0)==0){B=0}else{B=c[o+4>>2]|0}nla(f,m,B);B=b+28|0;oe(q,p);if((Wma(B,q,l)|0)==0){q=u2a(8)|0;c[q>>2]=0;c[q+4>>2]=1;c[l>>2]=q;if((q|0)==0){C=0}else{b=c[u>>2]|0;do{if((b|0)==1){c[q>>2]=t2(c[d+16>>2]|0,c[d+20>>2]|0)|0}else if((b|0)==2){u=c[s>>2]|0;if((u|0)==9){c[q>>2]=h8()|0;break}else if((u|0)==8){c[q>>2]=OW(+h[d+24>>3])|0;break}else{break}}}while(0);oe(r,p);c[(Qma(B,r)|0)>>2]=q;D=q;E=21}}else{q=c[l>>2]|0;l=q+4|0;c[l>>2]=(c[l>>2]|0)+1;D=q;E=21}if((E|0)==21){C=c[D>>2]|0}dka(p);y=C;z=x;dka(n);A=c[z>>2]|0;ila(A);i=g;return y|0}function XW(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;k=i;i=i+32|0;l=k+16|0;m=k+8|0;n=k;gla(l);o=WW(a,b,0,l)|0;do{if(((o|0)!=0?(p=WW(a,d,1,l)|0,(p|0)!=0):0)?(q=b+12|0,r=SW(o,c[q>>2]|0)|0,s=SW(p,c[d+12>>2]|0)|0,!((r|0)==0|(s|0)==0)):0){if((e|0)==0){t=0}else{t=WW(a,e,2,l)|0}u=(t|0)!=0;VW(VW(VW(VW(VW(VW(VW(l,r)|0,s)|0,f)|0,g)|0,u&1)|0,h)|0,j)|0;v=c[l+8>>2]|0;c[m>>2]=c[l+4>>2];c[m+4>>2]=v;v=a+4|0;if((Wma(v,m,n)|0)==0){w=w2a(1,16)|0;if((w|0)==0){x=0;break}c[w+4>>2]=r>>>3&15;c[w+8>>2]=s>>>3&15;c[w+12>>2]=(c[q>>2]&2031616|0)==655360&1;q=u2a(12)|0;c[q>>2]=0;c[q+4>>2]=1;c[q+8>>2]=w;c[n>>2]=q;if((q|0)==0){v2a(w);x=0;break}if(u){u=A8(o,r,p,s,t,f,h,j)|0;c[q>>2]=u;y=u}else{u=y8(o,r,p,s,f,g)|0;c[q>>2]=u;y=u}c[w>>2]=y;c[(Qma(v,m)|0)>>2]=q;z=q}else{q=c[n>>2]|0;v=q+4|0;c[v>>2]=(c[v>>2]|0)+1;z=q}x=c[z+8>>2]|0}else{x=0}}while(0);ila(c[l+4>>2]|0);i=k;return x|0}function YW(a){a=a|0;var b=0;b=i;ZW(a);v2a(a);i=b;return}function ZW(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;i=i+16|0;d=b+12|0;e=b+8|0;f=b+4|0;g=b;c[a>>2]=673824;h=a+28|0;j=(c[a+36>>2]|0)==0;c[d>>2]=j?0:-1;c[e>>2]=0;if(!j){do{Oma(h,d,e,f);j=c[f>>2]|0;if((j|0)!=0){TW(c[j>>2]|0);v2a(j)}}while((c[d>>2]|0)!=0)}f=a+4|0;j=(c[a+12>>2]|0)==0;c[d>>2]=j?0:-1;if(j){dka(e);Nma(h);Nma(f);i=b;return}do{Oma(f,d,e,g);j=c[g>>2]|0;if((j|0)!=0){UW(j);v2a(j)}}while((c[d>>2]|0)!=0);dka(e);Nma(h);Nma(f);i=b;return}function _W(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0;a=i;g=LW(b,c,d,e,f)|0;i=a;return g|0}function $W(a,b,c,d,e,f,g,h,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0;a=i;k=KW(b,c,d,e,f,4,g,h,j)|0;i=a;return k|0}function aX(a,b){a=a|0;b=b|0;a=i;MW(b);i=a;return}function bX(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=i;NW(b,c[a+52>>2]|0,d,e);i=f;return}function cX(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;a=i;p8(c[b>>2]|0,e,d,f);i=a;return}function dX(b,c,e,f,g,h,i){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;j=b&255;b=j<<8;k=c&255;c=k<<8;l=e&255;e=l<<8;m=f&255;f=m<<8;n=(b+4096|0)>>>13;o=(c+4096|0)>>>13;p=(e+4096|0)>>>13;q=(f+4096|0)>>>13;r=(o*81|0)+(n*729|0)+(p*9|0)|0;s=(r+q|0)*3|0;t=d[673872+s>>0]|0;u=d[s+673873>>0]|0;v=d[s+673874>>0]|0;w=j>>>5;j=((w|0)==(n|0)&1)+w|0;w=k>>>5;k=((w|0)==(o|0)&1)+w|0;w=l>>>5;l=((w|0)==(p|0)&1)+w|0;w=m>>>5;m=((w|0)==(q|0)&1)+w|0;w=s+((j-n|0)*2187|0)|0;x=s+((k-o|0)*243|0)|0;y=((l-p|0)*27|0)+s|0;s=(m+r|0)*3|0;r=ca(n-j|0,b-(n<<13)|0)|0;n=ca(o-k|0,c-(o<<13)|0)|0;o=ca(p-l|0,e-(p<<13)|0)|0;p=ca(q-m|0,f-(q<<13)|0)|0;q=((ca(t-(d[673872+w>>0]|0)|0,r)|0)/32|0)+(t<<8)+((ca(t-(d[673872+x>>0]|0)|0,n)|0)/32|0)+((ca(t-(d[673872+y>>0]|0)|0,o)|0)/32|0)+((ca(t-(d[673872+s>>0]|0)|0,p)|0)/32|0)|0;t=((ca(u-(d[w+673873>>0]|0)|0,r)|0)/32|0)+(u<<8)+((ca(u-(d[x+673873>>0]|0)|0,n)|0)/32|0)+((ca(u-(d[y+673873>>0]|0)|0,o)|0)/32|0)+((ca(u-(d[s+673873>>0]|0)|0,p)|0)/32|0)|0;u=((ca(v-(d[w+673874>>0]|0)|0,r)|0)/32|0)+(v<<8)+((ca(v-(d[x+673874>>0]|0)|0,n)|0)/32|0)+((ca(v-(d[y+673874>>0]|0)|0,o)|0)/32|0)+((ca(v-(d[s+673874>>0]|0)|0,p)|0)/32|0)|0;a[g>>0]=(q|0)<0?0:q>>>8&255;a[h>>0]=(t|0)<0?0:t>>>8&255;a[i>>0]=(u|0)<0?0:u>>>8&255;return}function eX(a,b,c,e,f,h,j){a=+a;b=+b;c=+c;e=+e;f=f|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0;k=i;i=i+16|0;l=k+2|0;m=k+1|0;n=k;o=(Fla(a*255.0)|0)&255;p=(Fla(b*255.0)|0)&255;q=(Fla(c*255.0)|0)&255;dX(o,p,q,(Fla(e*255.0)|0)&255,l,m,n);g[f>>2]=+(d[l>>0]|0|0)/255.0;g[h>>2]=+(d[m>>0]|0|0)/255.0;g[j>>2]=+(d[n>>0]|0|0)/255.0;i=k;return}function fX(b,d){b=b|0;d=d|0;var e=0,f=0;e=i;f=b+16|0;c[f>>2]=0;if((d|0)>16){c[f>>2]=w2a(d,1)|0;i=e;return}else{d=b+0|0;b=d+16|0;do{a[d>>0]=0;d=d+1|0}while((d|0)<(b|0));i=e;return}}function gX(a){a=a|0;var b=0;b=i;if((a|0)!=0){v2a(a)}i=b;return}function hX(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+128|0;c[e>>2]=0;if((b|0)>16){c[e>>2]=w2a(b,8)|0;i=d;return}else{b=a+0|0;a=b+128|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(a|0));i=d;return}}function iX(a){a=a|0;var b=0;b=i;v2a(a);i=b;return}function jX(a){a=a|0;return}function kX(a){a=a|0;var b=0,d=0,e=0;a=i;b=u2a(52)|0;d=b+0|0;e=d+52|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(e|0));i=a;return b|0}function lX(a,b){a=a|0;b=b|0;a=i;if((b|0)==0){i=a;return}z_(c[b+44>>2]|0);v2a(b);i=a;return}function mX(a,b,d,e,f,g,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0;l=i;m=ca(k,d)|0;f3a(j|0,0,m|0)|0;n=y_(a+4|0,g,h,e,f,3,0)|0;if((n|0)==0){o=0;i=l;return o|0}f=L_(n,j,b,d,k,0)|0;z_(n);if((f|0)!=0){o=0;i=l;return o|0}f=m>>>2;if((f|0)==0){o=1;i=l;return o|0}else{p=0}do{m=j+(p<<2)|0;c[m>>2]=~c[m>>2];p=p+1|0}while((p|0)<(f|0));o=1;i=l;return o|0}function nX(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0;h=i;j=Lc[c[(c[b>>2]|0)+16>>2]&255](b)|0;k=w2a(j,1)|0;if((k|0)==0){l=0;i=h;return l|0}if(((id[c[(c[b>>2]|0)+28>>2]&511](b,k,0,j)|0)!=0?(b=y_(a+4|0,0,0,k,j,0,0)|0,(b|0)!=0):0)?(j=N_(b,0)|0,z_(b),(j|0)==0):0){c[d>>2]=c[1];c[e>>2]=c[2];c[f>>2]=c[3];c[g>>2]=c[4];c[5]=0;v2a(k);l=1;i=h;return l|0}v2a(k);l=0;i=h;return l|0}function oX(a,b,d,e,f,g,h,j,k,l,m){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0;n=i;if((b|0)==0){o=9;i=n;return o|0}c[b+4>>2]=d;c[b+8>>2]=e;c[b+12>>2]=f;c[b+16>>2]=g;c[b+20>>2]=h;c[b+24>>2]=j;c[b+28>>2]=k;c[b+32>>2]=l;c[b+40>>2]=m;c[b+36>>2]=0;p=ca(l,e)|0;f3a(k|0,0,p|0)|0;q=y_(a+4|0,h,j,f,g,3,m)|0;g=b+44|0;c[g>>2]=q;if((q|0)==0){o=-1;i=n;return o|0}b=L_(q,k,d,e,l,m)|0;m=c[g>>2]|0;l=c[m+48>>2]|0;if((l|0)!=4){o=l;i=n;return o|0}z_(m);c[g>>2]=0;if((b|0)!=0){o=-1;i=n;return o|0}b=p>>>2;if((b|0)==0){o=4;i=n;return o|0}else{r=0}do{p=k+(r<<2)|0;c[p>>2]=~c[p>>2];r=r+1|0}while((r|0)<(b|0));o=4;i=n;return o|0}function pX(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0;k=i;if((b|0)==0){l=9;i=k;return l|0}c[b+36>>2]=1;m=b+48|0;c[m>>2]=0;n=Lc[c[(c[d>>2]|0)+16>>2]&255](d)|0;o=b+16|0;c[o>>2]=n;p=w2a(n,1)|0;q=b+12|0;c[q>>2]=p;if((p|0)==0){l=5;i=k;return l|0}if((id[c[(c[d>>2]|0)+28>>2]&511](d,p,0,n)|0)!=0?(n=y_(a+4|0,0,0,c[q>>2]|0,c[o>>2]|0,0,j)|0,o=b+44|0,c[o>>2]=n,(n|0)!=0):0){b=N_(n,j)|0;j=c[o>>2]|0;if((c[j+48>>2]|0)==3){c[e>>2]=c[(c[m>>2]|0)+4>>2];c[f>>2]=c[(c[m>>2]|0)+8>>2];c[g>>2]=c[(c[m>>2]|0)+12>>2];c[h>>2]=c[(c[m>>2]|0)+16>>2];c[(c[m>>2]|0)+20>>2]=0;l=3;i=k;return l|0}z_(j);c[o>>2]=0;if((b|0)==0){c[e>>2]=c[(c[m>>2]|0)+4>>2];c[f>>2]=c[(c[m>>2]|0)+8>>2];c[g>>2]=c[(c[m>>2]|0)+12>>2];c[h>>2]=c[(c[m>>2]|0)+16>>2];c[(c[m>>2]|0)+20>>2]=0;h=c[m>>2]|0;if((h|0)!=0){o0(h);D0(h)}v2a(c[q>>2]|0);l=4;i=k;return l|0}}v2a(c[q>>2]|0);c[q>>2]=0;l=-1;i=k;return l|0}function qX(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;a=i;e=b+44|0;f=M_(c[e>>2]|0,d)|0;d=c[e>>2]|0;g=c[d+48>>2]|0;if((g|0)!=4){h=g;i=a;return h|0}g=(c[b+36>>2]|0)==0;z_(d);c[e>>2]=0;e=(f|0)!=0;if(g){if(e){h=-1;i=a;return h|0}g=(ca(c[b+32>>2]|0,c[b+8>>2]|0)|0)>>>2;f=c[b+28>>2]|0;if((g|0)==0){h=4;i=a;return h|0}else{j=0}do{d=f+(j<<2)|0;c[d>>2]=~c[d>>2];j=j+1|0}while((j|0)<(g|0));h=4;i=a;return h|0}if(e){e=b+12|0;v2a(c[e>>2]|0);c[e>>2]=0;h=-1;i=a;return h|0}e=c[b+48>>2]|0;if((e|0)!=0){o0(e);D0(e)}v2a(c[b+12>>2]|0);h=4;i=a;return h|0}function rX(a){a=a|0;var b=0;b=i;XU(a);c[a>>2]=693616;c[a+808>>2]=0;c[a+12>>2]=1;c[a+816>>2]=0;c[a+812>>2]=0;c[a+824>>2]=0;c[a+828>>2]=0;f3a(a+208|0,0,592)|0;c[a+832>>2]=1;i=b;return}function sX(a){a=a|0;var b=0;b=i;tX(a);v2a(a);i=b;return}function tX(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=693616;d=c[a+824>>2]|0;if((d|0)==0){v2a(c[a+808>>2]|0);if((c[a+812>>2]|0)!=0){$9(a+208|0)}}else{Ic[c[(c[d>>2]|0)+8>>2]&511](d,c[a+828>>2]|0)}ZU(a);i=b;return}function uX(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;d=i;e=i;i=i+168|0;c[e>>2]=0;f=b+208|0;c[f>>2]=b+640;g=b+52|0;c[b+220>>2]=g;_2a(g,2,e|0)|0;r=0;h=r;r=0;if((h|0)!=0&(s|0)!=0){j=b3a(c[h>>2]|0,e)|0;if((j|0)==0){bb(h|0,s|0)}G=s}else{j=-1}h=G;if((j|0)==2){k=0;l=h}else if((j|0)==1){m=0;n=h;o=7}else{k=0;l=0}while(1){if((o|0)==7){o=0;if((n|0)==-1){r=0;va(520,f|0);h=r;r=0;if((h|0)!=0&(s|0)!=0){p=b3a(c[h>>2]|0,e)|0;if((p|0)==0){bb(h|0,s|0)}G=s}else{p=-1}h=G;if((p|0)==2){k=m;l=h;continue}else if((p|0)==1){q=m;n=h;m=q;o=7;continue}else{o=9;break}}else{t=b+4|0;u=b+236|0;c[u>>2]=c[t>>2];v=b+8|0;w=b+240|0;c[w>>2]=c[v>>2];r=0;x=pa(200,f|0)|0;h=r;r=0;if((h|0)!=0&(s|0)!=0){y=b3a(c[h>>2]|0,e)|0;if((y|0)==0){bb(h|0,s|0)}G=s}else{y=-1}h=G;if((y|0)==2){k=m;l=h;continue}else if((y|0)==1){q=m;n=h;m=q;o=7;continue}else{o=11;break}}}if((l|0)==-1){z=0;o=18;break}r=0;va(519,f|0);h=r;r=0;if((h|0)!=0&(s|0)!=0){A=b3a(c[h>>2]|0,e)|0;if((A|0)==0){bb(h|0,s|0)}G=s}else{A=-1}h=G;if((A|0)==2){l=h;continue}else if((A|0)==1){m=k;n=h;o=7;continue}h=b+812|0;c[h>>2]=1;j=b+772|0;c[b+232>>2]=j;c[b+776>>2]=c[b+804>>2];c[j>>2]=c[b+800>>2];_2a(g,1,e|0)|0;r=0;j=r;r=0;if((j|0)!=0&(s|0)!=0){B=b3a(c[j>>2]|0,e)|0;if((B|0)==0){bb(j|0,s|0)}G=s}else{B=-1}j=G;if((B|0)==2){k=h;l=j;continue}else if((B|0)==1){m=h;n=j;o=7;continue}m=h;n=0;o=7}if((o|0)==9){c[m>>2]=0;z=0;i=d;return z|0}else if((o|0)==11){if((x|0)!=1){z=0;i=d;return z|0}if((a[b+472>>0]|0)!=0){c[b+820>>2]=1}if((c[b+244>>2]|0)==3?(c[b+820>>2]|0)==0:0){c[b+252>>2]=c[b+248>>2]}x=c[u>>2]|0;c[t>>2]=x;t=c[w>>2]|0;c[v>>2]=t;c[b+16>>2]=x;c[b+20>>2]=t;c[b+832>>2]=c[b+260>>2];z=1;i=d;return z|0}else if((o|0)==18){i=d;return z|0}return 0}function vX(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0;l=i;i=i+16|0;m=l+4|0;n=l;c[m>>2]=d;c[n>>2]=e;if((k|0)!=0){c[b+824>>2]=k;o=Ec[c[(c[k>>2]|0)+4>>2]&15](k,d,e,f,g,h,j)|0;c[b+828>>2]=o;p=(o|0)!=0&1;i=l;return p|0}wX(m,n);o=c[m>>2]|0;c[b+800>>2]=o;m=c[n>>2]|0;c[b+804>>2]=m;c[b+640>>2]=521;c[b+644>>2]=308;c[b+648>>2]=522;c[b+652>>2]=309;c[b+656>>2]=522;c[b+780>>2]=523;c[b+796>>2]=523;c[b+788>>2]=310;c[b+784>>2]=201;c[b+792>>2]=252;c[b+820>>2]=j;if(m>>>0>1?(j=o+(m+ -2)|0,(Q2a(j,693680,2)|0)!=0):0){a[j>>0]=-1;a[o+(m+ -1)>>0]=-39}c[b+4>>2]=f;c[b+16>>2]=f;c[b+8>>2]=g;c[b+20>>2]=g;if((uX(b)|0)==0){p=0;i=l;return p|0}g=c[b+244>>2]|0;if((g|0)<(h|0)){p=0;i=l;return p|0}h=c[b+236>>2]|0;if((h|0)<(f|0)){p=0;i=l;return p|0}f=(ca(h,g)|0)+3&-4;c[b+32>>2]=f;h=w2a(f,1)|0;c[b+808>>2]=h;if((h|0)==0){p=0;i=l;return p|0}c[b+24>>2]=g;c[b+28>>2]=8;c[b+36>>2]=0;c[b+816>>2]=0;p=1;i=l;return p|0}function wX(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;f=c[d>>2]|0;if(f>>>0<2){i=e;return}g=c[b>>2]|0;h=f+ -1|0;f=0;while(1){j=g+f|0;k=f+1|0;if((a[j>>0]|0)==-1?(a[g+k>>0]|0)==-40:0){break}if(k>>>0<h>>>0){f=k}else{l=7;break}}if((l|0)==7){i=e;return}c[b>>2]=j;c[d>>2]=(c[d>>2]|0)-f;i=e;return}function xX(a){a=a|0;bb(c[a+12>>2]|0,-1)}function yX(a,b){a=a|0;b=b|0;return}function zX(a){a=a|0;return}function AX(a,b){a=a|0;b=b|0;return}function BX(a){a=a|0;return}function CX(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=a+24|0;f=c[e>>2]|0;if((c[f+4>>2]|0)<(b|0)){xX(a)}else{c[f>>2]=(c[f>>2]|0)+b;f=(c[e>>2]|0)+4|0;c[f>>2]=(c[f>>2]|0)-b;i=d;return}}function DX(a){a=a|0;return 0}function EX(a,b){a=a|0;b=b|0;return 0}function FX(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=i;f=(a|0)/(c|0)|0;c=(b|0)/(d|0)|0;d=(f|0)>(c|0)?c:f;if((d|0)<=7){if((d|0)>3){g=4}else{g=(d|0)>1?2:1}}else{g=8}i=e;return g|0}function GX(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;f=c[a+824>>2]|0;if((f|0)!=0){pd[c[(c[f>>2]|0)+12>>2]&127](f,c[a+828>>2]|0,b,d);i=e;return}f=a+12|0;g=c[f>>2]|0;h=c[a+4>>2]|0;j=c[a+8>>2]|0;k=FX(h,j,b,d)|0;c[f>>2]=k;f=(k+ -1+h|0)/(k|0)|0;c[a+16>>2]=f;c[a+20>>2]=(j+ -1+k|0)/(k|0)|0;c[a+32>>2]=(((ca(c[a+24>>2]|0,f)|0)+3|0)/4|0)<<2;if((g|0)==(k|0)){i=e;return}c[a+40>>2]=-1;i=e;return}function HX(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,t=0,u=0,v=0,w=0;b=i;d=i;i=i+168|0;c[d>>2]=0;e=c[a+824>>2]|0;do{if((e|0)==0){f=a+816|0;if((c[f>>2]|0)!=0){r=0;va(520,a+208|0);g=r;r=0;if((g|0)!=0&(s|0)!=0){h=b3a(c[g>>2]|0,d)|0;if((h|0)==0){bb(g|0,s|0)}G=s}else{h=-1}if((h|0)==1){j=f;k=G;break}r=0;g=pa(202,a|0)|0;l=r;r=0;if((l|0)!=0&(s|0)!=0){m=b3a(c[l>>2]|0,d)|0;if((m|0)==0){bb(l|0,s|0)}G=s}else{m=-1}if((m|0)==1){j=f;k=G;break}if((g|0)==0){n=0;i=b;return n|0}}_2a(a+52|0,1,d|0)|0;r=0;g=r;r=0;if((g|0)!=0&(s|0)!=0){o=b3a(c[g>>2]|0,d)|0;if((o|0)==0){bb(g|0,s|0)}G=s}else{o=-1}if((o|0)==1){j=f;k=G}else{j=f;k=0}}else{r=0;f=Ja(c[(c[e>>2]|0)+16>>2]|0,e|0,c[a+828>>2]|0)|0;g=r;r=0;if((g|0)!=0&(s|0)!=0){p=b3a(c[g>>2]|0,d)|0;if((p|0)==0){bb(g|0,s|0)}G=s}else{p=-1}if((p|0)==1){j=0;k=G}else{n=f;i=b;return n|0}}}while(0);while(1){if((k|0)==-1){n=0;q=19;break}p=c[a+12>>2]|0;e=a+208|0;c[a+260>>2]=ca(p,c[a+832>>2]|0)|0;o=a+4|0;c[a+16>>2]=((c[o>>2]|0)+ -1+p|0)/(p|0)|0;c[a+20>>2]=((c[a+8>>2]|0)+ -1+p|0)/(p|0)|0;r=0;p=pa(203,e|0)|0;m=r;r=0;if((m|0)!=0&(s|0)!=0){t=b3a(c[m>>2]|0,d)|0;if((t|0)==0){bb(m|0,s|0)}G=s}else{t=-1}if((t|0)==1){u=j;k=G;j=u;continue}if(p<<24>>24==0){r=0;va(520,e|0);e=r;r=0;if((e|0)!=0&(s|0)!=0){v=b3a(c[e>>2]|0,d)|0;if((v|0)==0){bb(e|0,s|0)}G=s}else{v=-1}if((v|0)==1){u=j;k=G;j=u;continue}else{q=14;break}}if((c[a+300>>2]|0)<=(c[o>>2]|0)){q=18;break}r=0;Va(46,1303104,693688,519,693736);o=r;r=0;if((o|0)!=0&(s|0)!=0){w=b3a(c[o>>2]|0,d)|0;if((w|0)==0){bb(o|0,s|0)}G=s}else{w=-1}if((w|0)==1){u=j;k=G;j=u}else{q=17;break}}if((q|0)==14){n=0;i=b;return n|0}else if((q|0)!=17)if((q|0)==18){c[j>>2]=1;n=1;i=b;return n|0}else if((q|0)==19){i=b;return n|0}return 0}function IX(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+824>>2]|0;if((d|0)!=0){e=dd[c[(c[d>>2]|0)+20>>2]&511](d,c[a+828>>2]|0)|0;i=b;return e|0}d=a+808|0;if((eaa(a+208|0,d,1)|0)<1){e=0;i=b;return e|0}e=c[d>>2]|0;i=b;return e|0}function JX(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+824>>2]|0;if((d|0)==0){e=(c[a+804>>2]|0)-(c[a+776>>2]|0)|0;i=b;return e|0}else{e=dd[c[(c[d>>2]|0)+24>>2]&511](d,c[a+828>>2]|0)|0;i=b;return e|0}return 0}function KX(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0;j=i;if((b|0)==0|(d|0)==0){k=0;i=j;return k|0}l=u2a(840)|0;rX(l);if((l|0)==0){k=0;i=j;return k|0}if((vX(l,b,d,e,f,g,h,c[a+4>>2]|0)|0)==0){Rc[c[(c[l>>2]|0)+4>>2]&1023](l);k=0;i=j;return k|0}else{k=l;i=j;return k|0}return 0}function LX(a,b,d,e,f,g,h,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0;m=i;n=c[a+4>>2]|0;if((n|0)==0){o=MX(b,d,e,f,g,h,j,k,l)|0;i=m;return o|0}else{o=Jc[c[(c[n>>2]|0)+28>>2]&3](n,b,d,e,f,g,h,j,k,l)|0;i=m;return o|0}return 0}function MX(a,b,d,e,f,g,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;l=i;i=i+768|0;m=i;i=i+168|0;c[m>>2]=0;n=l+752|0;o=l+748|0;p=l;q=l+616|0;t=l+460|0;u=l+432|0;c[n>>2]=a;c[o>>2]=b;r=0;ma(311,n|0,o|0);b=r;r=0;if((b|0)!=0&(s|0)!=0){v=b3a(c[b>>2]|0,m)|0;if((v|0)==0){bb(b|0,s|0)}G=s}else{v=-1}b=G;do{if((v|0)==1){w=0;x=0;y=0;z=0;A=b}else if((v|0)==2){B=0;C=0;D=0;E=0;F=b;H=4}else{c[q>>2]=521;c[q+4>>2]=308;c[q+8>>2]=522;c[q+12>>2]=309;c[q+16>>2]=522;c[q+104>>2]=0;c[p>>2]=q;c[p+12>>2]=t;_2a(t,2,m|0)|0;r=0;a=r;r=0;if((a|0)!=0&(s|0)!=0){I=b3a(c[a>>2]|0,m)|0;if((I|0)==0){bb(a|0,s|0)}G=s}else{I=-1}a=G;if((I|0)==1){w=t;x=t;y=q;z=p;A=a;break}else if((I|0)==2){B=t;C=t;D=q;E=p;F=a;H=4;break}B=t;C=t;D=q;E=p;F=0;H=4}}while(0);while(1){if((H|0)==4){H=0;if((F|0)==-1){J=0;K=C;L=D;M=E;H=24;break}r=0;va(519,p|0);q=r;r=0;if((q|0)!=0&(s|0)!=0){N=b3a(c[q>>2]|0,m)|0;if((N|0)==0){bb(q|0,s|0)}G=s}else{N=-1}q=G;if((N|0)==1){w=B;x=C;y=D;z=E;A=q;continue}else if((N|0)==2){O=E;P=D;Q=C;R=B;F=q;E=O;D=P;C=Q;B=R;H=4;continue}c[u+8>>2]=523;c[u+24>>2]=523;c[u+16>>2]=310;c[u+12>>2]=201;c[u+20>>2]=252;c[u+4>>2]=c[o>>2];c[u>>2]=c[n>>2];c[p+24>>2]=u;_2a(B,1,m|0)|0;r=0;q=r;r=0;if((q|0)!=0&(s|0)!=0){S=b3a(c[q>>2]|0,m)|0;if((S|0)==0){bb(q|0,s|0)}G=s}else{S=-1}q=G;if((S|0)==1){w=B;x=C;y=D;z=E;A=q;continue}else if((S|0)==2){O=E;P=D;Q=C;R=B;F=q;E=O;D=P;C=Q;B=R;H=4;continue}w=B;x=C;y=D;z=E;A=0}if((A|0)==-1){r=0;va(520,p|0);q=r;r=0;if((q|0)!=0&(s|0)!=0){T=b3a(c[q>>2]|0,m)|0;if((T|0)==0){bb(q|0,s|0)}G=s}else{T=-1}q=G;if((T|0)==1){U=z;V=y;W=x;X=w;A=q;z=U;y=V;x=W;w=X;continue}else if((T|0)==2){B=w;C=x;D=y;E=z;F=q;H=4;continue}else{H=10;break}}q=(j|0)!=0;t=(k|0)==0;if(!(t|q^1)){r=0;Ra(160,p|0,226,65535);I=r;r=0;if((I|0)!=0&(s|0)!=0){Y=b3a(c[I>>2]|0,m)|0;if((Y|0)==0){bb(I|0,s|0)}G=s}else{Y=-1}I=G;if((Y|0)==1){U=z;V=y;W=x;X=w;A=I;z=U;y=V;x=W;w=X;continue}else if((Y|0)==2){B=w;C=x;D=y;E=z;F=I;H=4;continue}}r=0;I=pa(200,p|0)|0;b=r;r=0;if((b|0)!=0&(s|0)!=0){Z=b3a(c[b>>2]|0,m)|0;if((Z|0)==0){bb(b|0,s|0)}G=s}else{Z=-1}b=G;if((Z|0)==1){U=z;V=y;W=x;X=w;A=b;z=U;y=V;x=W;w=X;continue}else if((Z|0)==2){B=w;C=x;D=y;E=z;F=b;H=4;continue}if((I|0)!=1){r=0;va(520,p|0);I=r;r=0;if((I|0)!=0&(s|0)!=0){_=b3a(c[I>>2]|0,m)|0;if((_|0)==0){bb(I|0,s|0)}G=s}else{_=-1}I=G;if((_|0)==1){U=z;V=y;W=x;X=w;A=I;z=U;y=V;x=W;w=X;continue}else if((_|0)==2){B=w;C=x;D=y;E=z;F=I;H=4;continue}else{H=17;break}}c[d>>2]=c[p+28>>2];c[e>>2]=c[p+32>>2];c[f>>2]=c[p+36>>2];I=c[p+40>>2]|0;c[h>>2]=((I|0)==3|(I|0)==5)&1;c[g>>2]=c[p+192>>2];if(q){c[j>>2]=0}if(!t){c[k>>2]=0}r=0;va(520,p|0);t=r;r=0;if((t|0)!=0&(s|0)!=0){$=b3a(c[t>>2]|0,m)|0;if(($|0)==0){bb(t|0,s|0)}G=s}else{$=-1}t=G;if(($|0)==1){U=z;V=y;W=x;X=w;A=t;z=U;y=V;x=W;w=X}else if(($|0)==2){B=w;C=x;D=y;E=z;F=t;H=4}else{H=23;break}}if((H|0)==10){J=0;K=x;L=y;M=z;i=l;return J|0}else if((H|0)==17){J=0;K=x;L=y;M=z;i=l;return J|0}else if((H|0)==23){J=1;K=x;L=y;M=z;i=l;return J|0}else if((H|0)==24){i=l;return J|0}return 0}function NX(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;l=i;i=i+528|0;m=l;n=l+384|0;o=l+364|0;p=l+360|0;q=c[b+4>>2]|0;if((q|0)!=0){r=Ec[c[(c[q>>2]|0)+32>>2]&15](q,e,f,g,h,j,k)|0;i=l;return r|0}q=e+16|0;if((c[q>>2]|0)<8){r=0;i=l;return r|0}if((c[e+28>>2]|0)!=0){r=0;i=l;return r|0}c[n>>2]=522;c[n+4>>2]=308;c[n+8>>2]=522;c[n+12>>2]=309;c[n+16>>2]=522;c[m>>2]=n;H8(m);n=c[q>>2]|0;q=(n|0)/8|0;if((n|0)>23){s=((c[e+20>>2]|0)>>>2&1)+3|0}else{s=1}n=c[e+24>>2]|0;b=c[e+8>>2]|0;t=c[e+12>>2]|0;u=ca(b,s)|0;v=ca(u,t)|0;w=(k|0)==0;x=v+(w?1024:k+5614|0)|0;v=w2a(x,1)|0;c[f>>2]=v;if((v|0)==0){y=x;while(1){z=y>>>1;A=w2a(z,1)|0;c[f>>2]=A;if((A|0)==0){y=z}else{B=A;C=z;break}}}else{B=v;C=x}c[o+8>>2]=524;c[o+16>>2]=524;c[o+12>>2]=204;c[o>>2]=B;B=o+4|0;c[B>>2]=C;c[m+24>>2]=o;c[m+28>>2]=b;x=m+32|0;c[x>>2]=t;c[m+36>>2]=s;do{if((s|0)!=1){t=m+40|0;if((s|0)!=3){c[t>>2]=4;if(!(s>>>0>1)){D=0;E=0;break}}else{c[t>>2]=2}t=w2a(u,1)|0;if((t|0)==0){r=1;i=l;return r|0}else{D=1;E=t}}else{c[m+40>>2]=1;D=0;E=0}}while(0);s9(m);if((h|0)!=75){r9(m,h,1)}M8(m,1);if((!((j|0)==0|w)?(w=(k>>>0)/65519|0,h=w+1|0,!(h>>>0>255)):0)?(u=k+14|0,t=h>>>0>1?65533:u,v=w2a(t,1)|0,(v|0)!=0):0){y=v+0|0;z=693816|0;A=y+12|0;do{a[y>>0]=a[z>>0]|0;y=y+1|0;z=z+1|0}while((y|0)<(A|0));z=h&255;a[v+13>>0]=z;h=v+12|0;y=v+14|0;if(k>>>0>65518){A=0;F=0;do{a[h>>0]=A+1;c3a(y|0,j+(A*65519|0)|0,65519)|0;L8(m,v,t);F=F+1<<24>>24;A=F&255}while(A>>>0<w>>>0)}a[h>>0]=z;z=w*65519|0;c3a(y|0,j+z|0,k-z|0)|0;L8(m,v,u-z|0);v2a(v)}v=m+208|0;z=(s|0)==3;s=(n|0)>0;u=(b|0)>0;k=C;a:while(1){C=c[v>>2]|0;do{if(!(C>>>0<(c[x>>2]|0)>>>0)){G=36;break a}j=dd[c[(c[e>>2]|0)+12>>2]&511](e,C)|0;do{if(D){if(z){if(u){H=E;I=0;J=j}else{K=E;break}while(1){a[H>>0]=a[J+2>>0]|0;a[H+1>>0]=a[J+1>>0]|0;a[H+2>>0]=a[J>>0]|0;I=I+1|0;if((I|0)==(b|0)){K=E;break}else{H=H+3|0;J=J+q|0}}}else{if(s){L=E;M=0;N=j}else{K=E;break}while(1){a[L>>0]=(d[N>>0]|0)^255;M=M+1|0;if((M|0)==(n|0)){K=E;break}else{L=L+1|0;N=N+1|0}}}}else{K=j}}while(0);c[p>>2]=K;j=c[v>>2]|0;N8(m,p,1)|0;C=c[v>>2]|0}while((C|0)!=(j|0));C=k+1048576|0;j=x2a(c[f>>2]|0,C)|0;c[f>>2]=j;if((j|0)==0){G=34;break}y=c[B>>2]|0;c[o>>2]=j+(k-y);c[B>>2]=y+1048576;k=C}if((G|0)==34){v2a(E);r=1;i=l;return r|0}else if((G|0)==36){K8(m);I8(m);v2a(E);c[g>>2]=k-(c[B>>2]|0);r=1;i=l;return r|0}return 0}function OX(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=i;d=i;i=i+168|0;c[d>>2]=0;e=c[a+4>>2]|0;if((e|0)==0){r=0;a=Ja(253,768,1)|0;f=r;r=0;if((f|0)!=0&(s|0)!=0){g=b3a(c[f>>2]|0,d)|0;if((g|0)==0){bb(f|0,s|0)}G=s}else{g=-1}if((g|0)!=1){if((a|0)==0){h=0;i=b;return h|0}c[a+756>>2]=205;c[a+760>>2]=525;g=a+592|0;c[g>>2]=526;c[a+596>>2]=308;c[a+600>>2]=522;c[a+604>>2]=309;c[a+608>>2]=522;c[a+732>>2]=523;c[a+748>>2]=523;c[a+740>>2]=312;c[a+736>>2]=201;c[a+744>>2]=252;f=a+160|0;c[a+172>>2]=a;c[f>>2]=g;_2a(a,1,d|0)|0;r=0;g=r;r=0;if((g|0)!=0&(s|0)!=0){j=b3a(c[g>>2]|0,d)|0;if((j|0)==0){bb(g|0,s|0)}G=s}else{j=-1}if((j|0)==1){k=a;l=G;m=f}else{k=a;l=0;m=f}}else{k=a;l=G;m=0}}else{r=0;a=pa(c[(c[e>>2]|0)+36>>2]|0,e|0)|0;e=r;r=0;if((e|0)!=0&(s|0)!=0){n=b3a(c[e>>2]|0,d)|0;if((n|0)==0){bb(e|0,s|0)}G=s}else{n=-1}if((n|0)==1){k=0;l=G;m=0}else{h=a;i=b;return h|0}}while(1){if((l|0)==-1){h=0;o=11;break}p=k+724|0;r=0;va(519,m|0);a=r;r=0;if((a|0)!=0&(s|0)!=0){q=b3a(c[a>>2]|0,d)|0;if((q|0)==0){bb(a|0,s|0)}G=s}else{q=-1}if((q|0)==1){l=G}else{break}}if((o|0)==11){i=b;return h|0}c[k+184>>2]=p;c[k+752>>2]=0;h=k;i=b;return h|0}function PX(a){a=a|0;var b=0,c=0;b=i;c=w2a(a,1)|0;i=b;return c|0}function QX(a){a=a|0;var b=0;b=i;v2a(a);i=b;return}function RX(a){a=a|0;bb(c[a+12>>2]|0,-1)}function SX(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=a+24|0;f=c[e>>2]|0;g=c[f+4>>2]|0;if(g>>>0<b>>>0){c[(c[a+12>>2]|0)+752>>2]=b-g;c[(c[e>>2]|0)+4>>2]=0;i=d;return}else{c[f>>2]=(c[f>>2]|0)+b;f=(c[e>>2]|0)+4|0;c[f>>2]=(c[f>>2]|0)-b;i=d;return}}function TX(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[a+4>>2]|0;if((e|0)==0){$9(b+160|0);Rc[c[b+760>>2]&1023](b);i=d;return}else{Ic[c[(c[e>>2]|0)+40>>2]&511](e,b);i=d;return}}function UX(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;g=c[a+4>>2]|0;if((g|0)!=0){pd[c[(c[g>>2]|0)+44>>2]&127](g,b,d,e);i=f;return}g=b+752|0;a=c[g>>2]|0;do{if((a|0)==0){h=d;j=e}else{if(!(a>>>0>e>>>0)){c[g>>2]=0;h=d+a|0;j=e-a|0;break}c[b+728>>2]=0;c[g>>2]=a-e;i=f;return}}while(0);c[b+724>>2]=h;c[b+728>>2]=j;i=f;return}function VX(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;g=i;h=i;i=i+168|0;c[h>>2]=0;j=c[a+4>>2]|0;if((j|0)==0){_2a(b,1,h|0)|0;r=0;a=r;r=0;if((a|0)!=0&(s|0)!=0){k=b3a(c[a>>2]|0,h)|0;if((k|0)==0){bb(a|0,s|0)}G=s}else{k=-1}if((k|0)==1){l=G}else{l=0}}else{r=0;k=Ka(c[(c[j>>2]|0)+48>>2]|0,j|0,b|0,d|0,e|0,f|0)|0;j=r;r=0;if((j|0)!=0&(s|0)!=0){m=b3a(c[j>>2]|0,h)|0;if((m|0)==0){bb(j|0,s|0)}G=s}else{m=-1}if((m|0)==1){l=G}else{n=k;i=g;return n|0}}while(1){if((l|0)==-1){n=1;o=11;break}r=0;p=pa(200,b+160|0)|0;k=r;r=0;if((k|0)!=0&(s|0)!=0){q=b3a(c[k>>2]|0,h)|0;if((q|0)==0){bb(k|0,s|0)}G=s}else{q=-1}if((q|0)==1){l=G}else{break}}if((o|0)==11){i=g;return n|0}if((p|0)==1){c[d>>2]=c[b+188>>2];c[e>>2]=c[b+192>>2];c[f>>2]=c[b+196>>2];n=0;i=g;return n|0}else if((p|0)==0){n=2;i=g;return n|0}else{n=1;i=g;return n|0}return 0}function WX(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;f=i;i=i+168|0;c[f>>2]=0;g=c[a+4>>2]|0;if((g|0)==0){_2a(b,1,f|0)|0;r=0;a=r;r=0;if((a|0)!=0&(s|0)!=0){h=b3a(c[a>>2]|0,f)|0;if((h|0)==0){bb(a|0,s|0)}G=s}else{h=-1}if((h|0)==1){j=G}else{j=0}}else{r=0;h=ua(c[(c[g>>2]|0)+52>>2]|0,g|0,b|0,d|0)|0;g=r;r=0;if((g|0)!=0&(s|0)!=0){k=b3a(c[g>>2]|0,f)|0;if((k|0)==0){bb(g|0,s|0)}G=s}else{k=-1}if((k|0)==1){j=G}else{l=h;i=e;return l|0}}while(1){if((j|0)==-1){l=0;m=9;break}c[b+212>>2]=d;r=0;n=pa(203,b+160|0)|0;h=r;r=0;if((h|0)!=0&(s|0)!=0){o=b3a(c[h>>2]|0,f)|0;if((o|0)==0){bb(h|0,s|0)}G=s}else{o=-1}if((o|0)==1){j=G}else{break}}if((m|0)==9){i=e;return l|0}l=n&255;i=e;return l|0}function XX(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;i=i+16|0;f=i;i=i+168|0;c[f>>2]=0;g=e;c[g>>2]=d;h=c[a+4>>2]|0;if((h|0)==0){_2a(b,1,f|0)|0;r=0;a=r;r=0;if((a|0)!=0&(s|0)!=0){j=b3a(c[a>>2]|0,f)|0;if((j|0)==0){bb(a|0,s|0)}G=s}else{j=-1}if((j|0)==1){k=G}else{k=0}}else{r=0;j=ua(c[(c[h>>2]|0)+56>>2]|0,h|0,b|0,d|0)|0;d=r;r=0;if((d|0)!=0&(s|0)!=0){l=b3a(c[d>>2]|0,f)|0;if((l|0)==0){bb(d|0,s|0)}G=s}else{l=-1}if((l|0)==1){k=G}else{m=j;i=e;return m|0}}while(1){if((k|0)==-1){m=0;n=9;break}r=0;o=ua(192,b+160|0,g|0,1)|0;j=r;r=0;if((j|0)!=0&(s|0)!=0){p=b3a(c[j>>2]|0,f)|0;if((p|0)==0){bb(j|0,s|0)}G=s}else{p=-1}if((p|0)==1){k=G}else{break}}if((n|0)==9){i=e;return m|0}m=(o|0)==1&1;i=e;return m|0}function YX(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=c[a+4>>2]|0;if((f|0)!=0){g=Qc[c[(c[f>>2]|0)+60>>2]&255](f,b,d)|0;i=e;return g|0}if((d|0)!=0){c[d>>2]=0;f=b+728|0;if((c[f>>2]|0)==0){h=f}else{c[d>>2]=c[b+724>>2];h=f}}else{h=b+728|0}g=c[h>>2]|0;i=e;return g|0}function ZX(a){a=a|0;return}function _X(a){a=a|0;var b=0;b=i;v2a(a);i=b;return}function $X(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}Rc[c[(c[a>>2]|0)+4>>2]&1023](a);i=b;return}function aY(a){a=a|0;return}function bY(a){a=a|0;return 0}function cY(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((((a|0)!=0?(c[a>>2]|0)!=0:0)?(d=a+4|0,(c[d>>2]|0)>=1):0)?(e=zY()|0,(e|0)!=0):0){LY(e,a);a=c[d>>2]|0;MY(e,a,((a|0)<0)<<31>>31);HY(e);JY(e);KY(e);IY(e);f=e}else{f=0}i=b;return f|0}function dY(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;if((((d|0)!=0?(f=c[d+4>>2]|0,(f|0)!=0):0)?(g=c[d>>2]|0,(g|0)!=0):0)?(h=d+8|0,d=c[h>>2]|0,(d|0)<(f|0)):0){j=f-d|0;if((f|0)==(d|0)){k=0}else{f=j>>>0>b>>>0?b:j;c3a(a|0,g+d|0,f|0)|0;c[h>>2]=(c[h>>2]|0)+f;k=f}}else{k=-1}i=e;return k|0}function eY(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;if((((d|0)!=0?(f=c[d+4>>2]|0,(f|0)!=0):0)?(g=c[d>>2]|0,(g|0)!=0):0)?(h=d+8|0,d=c[h>>2]|0,(d|0)<(f|0)):0){j=f-d|0;f=j>>>0>b>>>0?b:j;c3a(c[g+d>>2]|0,a|0,f|0)|0;c[h>>2]=(c[h>>2]|0)+f;k=f}else{k=-1}i=e;return k|0}function fY(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;if((((d|0)!=0?(f=c[d+4>>2]|0,(f|0)!=0):0)?(c[d>>2]|0)!=0:0)?(g=d+8|0,d=c[g>>2]|0,(d|0)<(f|0)):0){f=W2a(d|0,((d|0)<0)<<31>>31|0,a|0,b|0)|0;c[g>>2]=(G|0)<0?0:f;h=b;j=a}else{h=-1;j=-1}G=h;i=e;return j|0}function gY(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;b=i;do{if((((d|0)!=0?(e=c[d+4>>2]|0,(e|0)!=0):0)?(c[d>>2]|0)!=0:0)?(f=d+8|0,(c[f>>2]|0)<(e|0)):0){c[f>>2]=a;if((a|0)<0){c[f>>2]=0;g=1;break}if((a|0)>(e|0)){c[f>>2]=e;g=1}else{g=1}}else{g=-1}}while(0);i=b;return g|0}function hY(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0;b=i;if((c[a+16>>2]|0)>>>0<3){c[a+20>>2]=2;i=b;return}d=a+24|0;e=c[d>>2]|0;if((c[e>>2]|0)!=1){i=b;return}f=c[e+52>>2]|0;do{if((f|0)==2){if((((c[e+104>>2]|0)==2?(c[e+4>>2]|0)==1:0)?(c[e+56>>2]|0)==2:0)?(c[e+108>>2]|0)==2:0){g=c[e+24>>2]|0;h=1<<g+ -1;j=(1<<g)+ -1|0;g=c[e+8>>2]|0;k=c[e+12>>2]|0;l=ca(k,g)|0;m=c[e+44>>2]|0;n=c[e+96>>2]|0;o=c[e+148>>2]|0;p=w2a(l,4)|0;q=w2a(l,4)|0;r=w2a(l,4)|0;if((k|0)>0){l=(g|0)>0;s=r;t=n;n=o;o=q;u=0;v=p;w=m;while(1){if(l){m=s;x=t;y=n;z=o;A=0;B=s+(g<<2)|0;C=o+(g<<2)|0;D=v+(g<<2)|0;E=w+(g<<2)|0;F=v;G=w;while(1){vY(h,j,c[G>>2]|0,c[x>>2]|0,c[y>>2]|0,F,z,m);vY(h,j,c[G+4>>2]|0,c[x>>2]|0,c[y>>2]|0,F+4|0,z+4|0,m+4|0);H=G+8|0;I=F+8|0;J=z+8|0;K=m+8|0;vY(h,j,c[E>>2]|0,c[x>>2]|0,c[y>>2]|0,D,C,B);vY(h,j,c[E+4>>2]|0,c[x>>2]|0,c[y>>2]|0,D+4|0,C+4|0,B+4|0);L=x+4|0;M=y+4|0;A=A+2|0;if((A|0)>=(g|0)){N=K;O=L;P=M;Q=J;R=I;S=H;break}else{m=K;x=L;y=M;z=J;B=B+8|0;C=C+8|0;D=D+8|0;E=E+8|0;F=I;G=H}}}else{N=s;O=t;P=n;Q=o;R=v;S=w}u=u+2|0;if((u|0)>=(k|0)){break}else{s=N+(g<<2)|0;t=O;n=P;o=Q+(g<<2)|0;v=R+(g<<2)|0;w=S+(g<<2)|0}}T=c[d>>2]|0}else{T=e}v2a(c[T+44>>2]|0);c[(c[d>>2]|0)+44>>2]=p;v2a(c[(c[d>>2]|0)+96>>2]|0);c[(c[d>>2]|0)+96>>2]=q;v2a(c[(c[d>>2]|0)+148>>2]|0);c[(c[d>>2]|0)+148>>2]=r;c[(c[d>>2]|0)+60>>2]=g;c[(c[d>>2]|0)+64>>2]=k;c[(c[d>>2]|0)+112>>2]=g;c[(c[d>>2]|0)+116>>2]=k;c[(c[d>>2]|0)+60>>2]=g;c[(c[d>>2]|0)+64>>2]=k;c[(c[d>>2]|0)+112>>2]=g;c[(c[d>>2]|0)+116>>2]=k;w=c[d>>2]|0;c[w+52>>2]=c[w>>2];w=c[d>>2]|0;c[w+104>>2]=c[w>>2];w=c[d>>2]|0;c[w+56>>2]=c[w+4>>2];w=c[d>>2]|0;c[w+108>>2]=c[w+4>>2];break}if((c[e+104>>2]|0)!=2){i=b;return}if((c[e+4>>2]|0)!=1){i=b;return}if((c[e+56>>2]|0)!=1){i=b;return}if((c[e+108>>2]|0)!=1){i=b;return}w=c[e+24>>2]|0;v=1<<w+ -1;o=(1<<w)+ -1|0;w=c[e+8>>2]|0;n=c[e+12>>2]|0;t=ca(n,w)|0;s=c[e+44>>2]|0;u=c[e+96>>2]|0;j=c[e+148>>2]|0;h=w2a(t,4)|0;l=w2a(t,4)|0;G=w2a(t,4)|0;if((n|0)>0){t=(w|0)>0;F=G;E=u;u=j;j=l;D=0;C=h;B=s;while(1){if(t){s=F;z=E;y=u;x=j;m=0;A=C;H=B;while(1){vY(v,o,c[H>>2]|0,c[z>>2]|0,c[y>>2]|0,A,x,s);vY(v,o,c[H+4>>2]|0,c[z>>2]|0,c[y>>2]|0,A+4|0,x+4|0,s+4|0);I=H+8|0;J=A+8|0;M=x+8|0;L=s+8|0;K=z+4|0;U=y+4|0;m=m+2|0;if((m|0)>=(w|0)){V=L;W=K;X=U;Y=M;Z=J;_=I;break}else{s=L;z=K;y=U;x=M;A=J;H=I}}}else{V=F;W=E;X=u;Y=j;Z=C;_=B}D=D+1|0;if((D|0)==(n|0)){break}else{F=V;E=W;u=X;j=Y;C=Z;B=_}}$=c[d>>2]|0}else{$=e}v2a(c[$+44>>2]|0);c[(c[d>>2]|0)+44>>2]=h;v2a(c[(c[d>>2]|0)+96>>2]|0);c[(c[d>>2]|0)+96>>2]=l;v2a(c[(c[d>>2]|0)+148>>2]|0);c[(c[d>>2]|0)+148>>2]=G;c[(c[d>>2]|0)+60>>2]=w;c[(c[d>>2]|0)+64>>2]=n;c[(c[d>>2]|0)+112>>2]=w;c[(c[d>>2]|0)+116>>2]=n;c[(c[d>>2]|0)+60>>2]=w;c[(c[d>>2]|0)+64>>2]=n;c[(c[d>>2]|0)+112>>2]=w;c[(c[d>>2]|0)+116>>2]=n;B=c[d>>2]|0;c[B+52>>2]=c[B>>2];B=c[d>>2]|0;c[B+104>>2]=c[B>>2];B=c[d>>2]|0;c[B+56>>2]=c[B+4>>2];B=c[d>>2]|0;c[B+108>>2]=c[B+4>>2]}else if((f|0)==1){if((c[e+104>>2]|0)!=1){i=b;return}if((c[e+4>>2]|0)!=1){i=b;return}if((c[e+56>>2]|0)!=1){i=b;return}if((c[e+108>>2]|0)!=1){i=b;return}B=c[e+24>>2]|0;C=1<<B+ -1;j=(1<<B)+ -1|0;B=ca(c[e+12>>2]|0,c[e+8>>2]|0)|0;u=c[e+44>>2]|0;E=c[e+96>>2]|0;F=c[e+148>>2]|0;D=w2a(B,4)|0;o=w2a(B,4)|0;v=w2a(B,4)|0;if((B|0)>0){t=v;k=E;E=F;F=o;g=0;r=D;q=u;while(1){vY(C,j,c[q>>2]|0,c[k>>2]|0,c[E>>2]|0,r,F,t);g=g+1|0;if((g|0)==(B|0)){break}else{t=t+4|0;k=k+4|0;E=E+4|0;F=F+4|0;r=r+4|0;q=q+4|0}}aa=c[d>>2]|0}else{aa=e}v2a(c[aa+44>>2]|0);c[(c[d>>2]|0)+44>>2]=D;v2a(c[(c[d>>2]|0)+96>>2]|0);c[(c[d>>2]|0)+96>>2]=o;v2a(c[(c[d>>2]|0)+148>>2]|0);c[(c[d>>2]|0)+148>>2]=v}else{i=b;return}}while(0);c[a+20>>2]=1;i=b;return}function iY(a){a=a|0;var b=0,d=0;b=i;d=c[a+12>>2]|0;if((d|0)!=0){iZ(d)}d=c[a+16>>2]|0;if((d|0)!=0){GY(d)}d=c[a+8>>2]|0;if((d|0)==0){i=b;return}VY(d);i=b;return}function jY(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;i=i+8272|0;g=f+12|0;h=f;j=b+8|0;c[j>>2]=0;c[b>>2]=d;c[b+4>>2]=e;c[h+8>>2]=0;c[h+4>>2]=e;c[h>>2]=d;d=cY(h)|0;h=b+16|0;c[h>>2]=d;if((d|0)==0){k=0;i=f;return k|0}bZ(g);d=g+8200|0;c[d>>2]=0;c[g+8204>>2]=3;if((Q2a(c[b>>2]|0,693832,12)|0)==0){e=aZ(2)|0;c[b+12>>2]=e;c[d>>2]=1;l=e}else{e=aZ(0)|0;c[b+12>>2]=e;l=e}e=b+12|0;if((l|0)==0){k=0;i=f;return k|0}ZY(l);_Y(c[e>>2]|0);$Y(c[e>>2]|0);if((cZ(c[e>>2]|0,g)|0)==0){k=0;i=f;return k|0}if((dZ(c[h>>2]|0,c[e>>2]|0,j)|0)==0){c[j>>2]=0;k=0;i=f;return k|0}a[(c[j>>2]|0)+36>>0]=(c[b+20>>2]|0)!=0&1;b=c[e>>2]|0;do{if((c[g+8232>>2]|0)!=0){if((gZ(b,c[h>>2]|0,c[j>>2]|0,c[g+8228>>2]|0)|0)==0){k=0;i=f;return k|0}}else{if((fZ(b,c[j>>2]|0,c[g+8208>>2]|0,c[g+8216>>2]|0,c[g+8212>>2]|0,c[g+8220>>2]|0)|0)==0){VY(c[j>>2]|0);c[j>>2]=0;k=0;i=f;return k|0}if((eZ(c[e>>2]|0,c[h>>2]|0,c[j>>2]|0)|0)!=0?(hZ(c[e>>2]|0,c[h>>2]|0)|0)!=0:0){break}VY(c[j>>2]|0);c[j>>2]=0;k=0;i=f;return k|0}}while(0);GY(c[h>>2]|0);c[h>>2]=0;h=c[j>>2]|0;e=h+20|0;g=c[h+16>>2]|0;if((c[e>>2]|0)!=3&(g|0)==3){b=c[h+24>>2]|0;if((c[b>>2]|0)==(c[b+4>>2]|0)?(c[b+52>>2]|0)!=1:0){c[e>>2]=3}}else{if(g>>>0<3){c[e>>2]=2}}e=c[j>>2]|0;if((c[e+20>>2]|0)==3){hY(e);m=c[j>>2]|0}else{m=e}e=c[m+28>>2]|0;if((e|0)!=0?(a[m+36>>0]|0)==0:0){v2a(e);c[(c[j>>2]|0)+28>>2]=0;c[(c[j>>2]|0)+32>>2]=0;n=c[j>>2]|0}else{n=m}k=(n|0)!=0&1;i=f;return k|0}function kY(a,b){a=a|0;b=b|0;return}function lY(a,b){a=a|0;b=b|0;return}function mY(a,b){a=a|0;b=b|0;return}function nY(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;h=i;j=b+8|0;b=c[j>>2]|0;k=c[b+24>>2]|0;l=c[k+8>>2]|0;if((l|0)!=(c[b+8>>2]|0)){m=0;i=h;return m|0}n=c[k+12>>2]|0;if((n|0)!=(c[b+12>>2]|0)){m=0;i=h;return m|0}if(((ca(l<<3,c[b+16>>2]|0)|0)+31>>5<<2|0)>(f|0)){m=0;i=h;return m|0}f3a(e|0,-1,ca(n,f)|0)|0;n=c[j>>2]|0;b=c[n+16>>2]|0;l=w2a(b,4)|0;if((l|0)==0){m=0;i=h;return m|0}k=w2a(b,4)|0;if((k|0)==0){v2a(l);m=0;i=h;return m|0}if((b|0)>0){o=c[n+24>>2]|0;n=0;do{c[l+(n<<2)>>2]=e+(d[g+n>>0]|0);p=c[o+(n*52|0)+24>>2]|0;c[k+(n<<2)>>2]=p+ -8;if((n|0)>0){q=n+ -1|0;if((c[o+(n*52|0)>>2]|0)!=(c[o+(q*52|0)>>2]|0)){r=13;break}if((c[o+(n*52|0)+4>>2]|0)!=(c[o+(q*52|0)+4>>2]|0)){r=13;break}if((p|0)!=(c[o+(q*52|0)+24>>2]|0)){r=13;break}}n=n+1|0}while((n|0)<(b|0));if((r|0)==13){v2a(l);v2a(k);m=0;i=h;return m|0}r=c[o+8>>2]|0;b=c[o+12>>2]|0;o=(b|0)>0;n=(r|0)>0;g=0;do{e=c[l+(g<<2)>>2]|0;q=c[k+(g<<2)>>2]|0;if((q|0)<0){if(o){p=(q|0)>0;s=0-q|0;t=0;do{u=ca(t,f)|0;if(n){v=ca(t,r)|0;w=0;do{x=c[j>>2]|0;y=e+((ca(c[x+16>>2]|0,w)|0)+u)|0;z=c[x+24>>2]|0;if((c[z+(g*52|0)+32>>2]|0)==0){A=0}else{A=1<<(c[z+(g*52|0)+24>>2]|0)+ -1}if(p){B=0}else{B=A+(c[(c[z+(g*52|0)+44>>2]|0)+(w+v<<2)>>2]|0)<<s&255}a[y>>0]=B;w=w+1|0}while((w|0)!=(r|0))}t=t+1|0}while((t|0)!=(b|0))}}else{if(o){t=(q|0)<1;s=q+ -1|0;p=0;do{w=ca(p,f)|0;if(n){v=ca(p,r)|0;u=0;do{y=c[j>>2]|0;z=e+((ca(c[y+16>>2]|0,u)|0)+w)|0;x=c[y+24>>2]|0;y=c[x+(g*52|0)+44>>2]|0;do{if((y|0)!=0){if((c[x+(g*52|0)+32>>2]|0)==0){C=0}else{C=1<<(c[x+(g*52|0)+24>>2]|0)+ -1}D=C+(c[y+(u+v<<2)>>2]|0)|0;E=D>>q;if(t){a[z>>0]=E;break}F=((D>>s|0)%2|0)+E|0;if((F|0)>255){G=-1}else{G=(F|0)<0?0:F&255}a[z>>0]=G}}while(0);u=u+1|0}while((u|0)!=(r|0))}p=p+1|0}while((p|0)!=(b|0))}}g=g+1|0}while((g|0)<(c[(c[j>>2]|0)+16>>2]|0))}v2a(l);v2a(k);m=1;i=h;return m|0}function oY(a){a=a|0;c[a>>2]=693856;return}function pY(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;a=i;f=u2a(24)|0;g=f+8|0;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;if((f|0)==0){h=0;i=a;return h|0}c[f+20>>2]=e;e=(jY(f,b,d)|0)!=0;if(e){h=e?f:0;i=a;return h|0}iY(f);v2a(f);h=0;i=a;return h|0}function qY(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;a=b+8|0;c[d>>2]=c[(c[a>>2]|0)+8>>2];c[e>>2]=c[(c[a>>2]|0)+12>>2];e=c[(c[a>>2]|0)+16>>2]|0;c[f>>2]=e;c[g>>2]=e;return}function rY(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;e=i;a=nY(b,c,d,f)|0;i=e;return a|0}function sY(a,b){a=a|0;b=b|0;a=i;if((b|0)!=0){iY(b);v2a(b)}i=a;return}function tY(a){a=a|0;return}function uY(a){a=a|0;var b=0;b=i;v2a(a);i=b;return}function vY(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0.0,m=0,n=0.0,o=0,p=0;k=i;l=+(f-a|0);f=~~(l*1.402)+d|0;if((f|0)<0){m=0}else{m=(f|0)>(b|0)?b:f}c[g>>2]=m;n=+(e-a|0);a=d-~~(n*.344+l*.714)|0;if((a|0)<0){o=0}else{o=(a|0)>(b|0)?b:a}c[h>>2]=o;o=~~(n*1.772)+d|0;if((o|0)<0){p=0;c[j>>2]=p;i=k;return}p=(o|0)>(b|0)?b:o;c[j>>2]=p;i=k;return}function wY(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;if(!((e|0)!=0&e>>>0<5)){_a(693880,693936,83,694e3)}c[d>>2]=0;g=b;b=0;h=d+(e+ -1)|0;while(1){a[h>>0]=a[g>>0]|0;b=b+1|0;if((b|0)==(e|0)){break}else{g=g+1|0;h=h+ -1|0}}i=f;return}function xY(b,c){b=b|0;c=c|0;var d=0;d=c+8|0;a[d+ -1>>0]=a[b>>0]|0;a[d+ -2>>0]=a[b+1>>0]|0;a[d+ -3>>0]=a[b+2>>0]|0;a[d+ -4>>0]=a[b+3>>0]|0;a[d+ -5>>0]=a[b+4>>0]|0;a[d+ -6>>0]=a[b+5>>0]|0;a[d+ -7>>0]=a[b+6>>0]|0;a[c>>0]=a[b+7>>0]|0;return}function yY(b,c){b=b|0;c=c|0;var d=0;d=c+4|0;a[d+ -1>>0]=a[b>>0]|0;a[d+ -2>>0]=a[b+1>>0]|0;a[d+ -3>>0]=a[b+2>>0]|0;a[c>>0]=a[b+3>>0]|0;return}function zY(){var a=0,b=0,d=0,e=0,f=0;a=i;b=u2a(72)|0;if((b|0)==0){d=0;i=a;return d|0}e=b+0|0;f=e+72|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));c[b+64>>2]=1048576;e=u2a(1048576)|0;c[b+32>>2]=e;if((e|0)==0){v2a(b);d=0;i=a;return d|0}else{c[b+36>>2]=e;c[b+68>>2]=2;c[b+40>>2]=288;c[b+44>>2]=289;c[b+16>>2]=193;c[b+20>>2]=194;c[b+24>>2]=195;c[b+28>>2]=196;d=b;i=a;return d|0}return 0}function AY(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;f=i;i=i+16|0;g=f;if(!((d|0)>-1|(d|0)==-1&b>>>0>4294967295)){_a(694056,693936,469,694072)}h=a+48|0;j=c[h>>2]|0;if(!(j>>>0<b>>>0)){k=a+36|0;c[k>>2]=(c[k>>2]|0)+b;c[h>>2]=j-b;k=a+56|0;l=k;m=W2a(c[l>>2]|0,c[l+4>>2]|0,b|0,d|0)|0;l=k;c[l>>2]=m;c[l+4>>2]=G;n=d;o=b;G=n;i=f;return o|0}l=a+68|0;if((c[l>>2]&4|0)!=0){m=a+36|0;c[m>>2]=(c[m>>2]|0)+j;c[h>>2]=0;m=a+56|0;k=m;p=W2a(c[k>>2]|0,c[k+4>>2]|0,j|0,0)|0;k=m;c[k>>2]=p;c[k+4>>2]=G;k=(j|0)!=0;n=k?0:-1;o=k?j:-1;G=n;i=f;return o|0}if((j|0)==0){q=0;r=0;s=d;t=b}else{c[a+36>>2]=c[a+32>>2];k=X2a(b|0,d|0,j|0,0)|0;c[h>>2]=0;q=j;r=0;s=G;t=k}a:do{if((s|0)>0|(s|0)==0&t>>>0>0){k=a+24|0;j=t;h=s;d=q;b=r;while(1){p=Qc[c[k>>2]&255](j,h,c[a>>2]|0)|0;m=G;if((p|0)==-1&(m|0)==-1){break}j=X2a(j|0,h|0,p|0,m|0)|0;h=G;u=W2a(p|0,m|0,d|0,b|0)|0;m=G;if(!((h|0)>0|(h|0)==0&j>>>0>0)){v=u;w=m;break a}else{d=u;b=m}}RY(e,4,694024,g);c[l>>2]=c[l>>2]|4;j=a+56|0;h=j;k=W2a(c[h>>2]|0,c[h+4>>2]|0,d|0,b|0)|0;h=j;c[h>>2]=k;c[h+4>>2]=G;h=(d|0)!=0|(b|0)!=0;n=h?b:-1;o=h?d:-1;G=n;i=f;return o|0}else{v=q;w=r}}while(0);r=a+56|0;a=r;q=W2a(c[a>>2]|0,c[a+4>>2]|0,v|0,w|0)|0;a=r;c[a>>2]=q;c[a+4>>2]=G;n=w;o=v;G=n;i=f;return o|0}function BY(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;e=i;c[a+36>>2]=c[a+32>>2];c[a+48>>2]=0;f=(Qc[c[a+28>>2]&255](b,d,c[a>>2]|0)|0)==0;g=a+68|0;h=c[g>>2]|0;if(f){c[g>>2]=h|4;j=0;i=e;return j|0}else{c[g>>2]=h&-5;h=a+56|0;c[h>>2]=b;c[h+4>>2]=d;j=1;i=e;return j|0}return 0}function CY(a,b,c){a=a|0;b=b|0;c=c|0;return-1}function DY(a,b,c){a=a|0;b=b|0;c=c|0;return-1}function EY(a,b,c){a=a|0;b=b|0;c=c|0;c=i;G=-1;i=c;return-1}function FY(a,b,c){a=a|0;b=b|0;c=c|0;return 0}function GY(a){a=a|0;var b=0,d=0;b=i;if((a|0)==0){i=b;return}d=c[a+4>>2]|0;if((d|0)!=0){Rc[d&1023](c[a>>2]|0)}v2a(c[a+32>>2]|0);v2a(a);i=b;return}function HY(a){a=a|0;var b=0;b=i;if((a|0)!=0?(c[a+68>>2]&2|0)!=0:0){c[a+16>>2]=197}i=b;return}function IY(a){a=a|0;if((a|0)!=0){c[a+28>>2]=198}return}function JY(a){a=a|0;var b=0;b=i;if((a|0)!=0?(c[a+68>>2]&1|0)!=0:0){c[a+20>>2]=199}i=b;return}function KY(a){a=a|0;if((a|0)!=0){c[a+24>>2]=200}return}function LY(a,b){a=a|0;b=b|0;var d=0;d=i;if((a|0)==0){i=d;return}c[a>>2]=b;c[a+4>>2]=0;i=d;return}function MY(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;if((a|0)==0){i=e;return}f=a+8|0;c[f>>2]=b;c[f+4>>2]=d;i=e;return}function NY(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,H=0;f=i;i=i+16|0;g=f;h=a+48|0;j=c[h>>2]|0;if(!(j>>>0<d>>>0)){k=a+36|0;c3a(b|0,c[k>>2]|0,d|0)|0;c[k>>2]=(c[k>>2]|0)+d;c[h>>2]=(c[h>>2]|0)-d;k=a+56|0;l=k;m=W2a(c[l>>2]|0,c[l+4>>2]|0,d|0,0)|0;l=k;c[l>>2]=m;c[l+4>>2]=G;n=d;i=f;return n|0}l=a+68|0;if((c[l>>2]&4|0)!=0){m=a+36|0;c3a(b|0,c[m>>2]|0,j|0)|0;k=c[h>>2]|0;c[m>>2]=(c[m>>2]|0)+k;m=a+56|0;o=m;p=W2a(c[o>>2]|0,c[o+4>>2]|0,k|0,0)|0;k=m;c[k>>2]=p;c[k+4>>2]=G;c[h>>2]=0;n=(j|0)!=0?j:-1;i=f;return n|0}if((j|0)==0){k=c[a+32>>2]|0;c[a+36>>2]=k;q=d;r=b;s=a+56|0;t=k;u=0}else{k=a+36|0;c3a(b|0,c[k>>2]|0,j|0)|0;p=c[a+32>>2]|0;c[k>>2]=p;k=c[h>>2]|0;m=a+56|0;o=m;v=W2a(c[o>>2]|0,c[o+4>>2]|0,k|0,0)|0;o=m;c[o>>2]=v;c[o+4>>2]=G;c[h>>2]=0;q=d-k|0;r=b+k|0;s=m;t=p;u=j}j=a+64|0;p=a+16|0;m=a+32|0;k=a+36|0;b=q;q=r;r=t;t=u;while(1){u=c[j>>2]|0;d=c[p>>2]|0;o=c[a>>2]|0;if(b>>>0<u>>>0){v=Qc[d&255](r,u,o)|0;c[h>>2]=v;if((v|0)==-1){w=11;break}if(!(v>>>0<b>>>0)){w=14;break}c3a(q|0,c[k>>2]|0,v|0)|0;u=c[m>>2]|0;c[k>>2]=u;x=c[h>>2]|0;y=s;z=W2a(c[y>>2]|0,c[y+4>>2]|0,x|0,0)|0;A=x;B=z;C=G;D=u;E=v+t|0}else{F=Qc[d&255](q,b,o)|0;c[h>>2]=F;if((F|0)==-1){w=16;break}H=F+t|0;if(!(F>>>0<b>>>0)){w=20;break}o=c[m>>2]|0;c[k>>2]=o;d=s;v=W2a(c[d>>2]|0,c[d+4>>2]|0,F|0,0)|0;A=F;B=v;C=G;D=o;E=H}o=s;c[o>>2]=B;c[o+4>>2]=C;c[h>>2]=0;b=b-A|0;q=q+A|0;r=D;t=E}if((w|0)==11){RY(e,4,694024,g);c[h>>2]=0;c[l>>2]=c[l>>2]|4;n=(t|0)!=0?t:-1;i=f;return n|0}else if((w|0)==14){c3a(q|0,c[k>>2]|0,b|0)|0;c[k>>2]=(c[k>>2]|0)+b;c[h>>2]=(c[h>>2]|0)-b;q=s;E=W2a(c[q>>2]|0,c[q+4>>2]|0,b|0,0)|0;q=s;c[q>>2]=E;c[q+4>>2]=G;n=t+b|0;i=f;return n|0}else if((w|0)==16){RY(e,4,694024,g);c[h>>2]=0;c[l>>2]=c[l>>2]|4;n=(t|0)!=0?t:-1;i=f;return n|0}else if((w|0)==20){w=s;t=W2a(c[w>>2]|0,c[w+4>>2]|0,F|0,0)|0;F=s;c[F>>2]=t;c[F+4>>2]=G;c[k>>2]=c[m>>2];c[h>>2]=0;n=H;i=f;return n|0}return 0}function OY(a,b){a=a|0;b=b|0;var c=0;c=i;G=b;i=c;return a|0}function PY(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=a+56|0;e=c[d>>2]|0;f=c[d+4>>2]|0;if(!((f|0)>-1|(f|0)==-1&e>>>0>4294967295)){_a(694096,693936,565,694128)}d=a+8|0;a=c[d>>2]|0;g=c[d+4>>2]|0;if(g>>>0<f>>>0|(g|0)==(f|0)&a>>>0<e>>>0){_a(694160,693936,566,694128)}else{d=(a|0)==0&(g|0)==0;h=X2a(a|0,g|0,e|0,f|0)|0;G=d?0:G;i=b;return(d?0:h)|0}return 0}function QY(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;if((d|0)>-1|(d|0)==-1&b>>>0>4294967295){g=id[c[a+40>>2]&511](a,b,d,e)|0;i=f;return g|0}else{_a(694056,693936,574,694232)}return 0}function RY(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+528|0;g=f;h=f+16|0;if((a|0)==0){i=f;return}if((b|0)==4){j=a+8|0;k=a+20|0}else if((b|0)==1){j=a;k=a+12|0}else if((b|0)==2){j=a+4|0;k=a+16|0}else{i=f;return}a=c[j>>2]|0;j=c[k>>2]|0;if((j|0)==0|(d|0)==0){i=f;return}f3a(h|0,0,512)|0;c[g>>2]=e;M2a(h,512,d,g);Ic[j&511](h,a);i=f;return}function SY(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=313;c[a+20>>2]=313;c[a+16>>2]=313;return}function TY(a,b){a=a|0;b=b|0;return}function UY(){var a=0,b=0;a=i;b=w2a(1,40)|0;i=a;return b|0}function VY(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;if((a|0)==0){i=b;return}d=a+24|0;e=c[d>>2]|0;if((e|0)!=0){f=a+16|0;g=c[f>>2]|0;if((g|0)==0){h=e}else{j=g;g=e;e=0;while(1){k=c[g+(e*52|0)+44>>2]|0;if((k|0)==0){l=j;m=g}else{v2a(k);l=c[f>>2]|0;m=c[d>>2]|0}e=e+1|0;if(!(e>>>0<l>>>0)){h=m;break}else{j=l;g=m}}}v2a(h)}v2a(c[a+28>>2]|0);v2a(a);i=b;return}function WY(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;e=c[b+4>>2]|0;f=c[a>>2]|0;g=(e|0)>(f|0)?e:f;f=c[b+8>>2]|0;h=c[a+4>>2]|0;j=(f|0)>(h|0)?f:h;h=(ca(c[b+12>>2]|0,c[b+24>>2]|0)|0)+e|0;e=c[a+8>>2]|0;k=(h|0)<(e|0)?h:e;e=(ca(c[b+16>>2]|0,c[b+28>>2]|0)|0)+f|0;f=c[a+12>>2]|0;b=(e|0)<(f|0)?e:f;f=a+16|0;if((c[f>>2]|0)==0){i=d;return}e=0;h=c[a+24>>2]|0;while(1){a=XY(g,c[h>>2]|0)|0;l=h+4|0;m=XY(j,c[l>>2]|0)|0;n=XY(k,c[h>>2]|0)|0;o=XY(b,c[l>>2]|0)|0;l=n-a|0;n=c[h+40>>2]|0;p=1<<n;q=((p|0)<0)<<31>>31;r=W2a(l|0,((l|0)<0)<<31>>31|0,-1,-1)|0;l=W2a(r|0,G|0,p|0,q|0)|0;r=$2a(l|0,G|0,n|0)|0;l=o-m|0;o=W2a(l|0,((l|0)<0)<<31>>31|0,-1,-1)|0;l=W2a(o|0,G|0,p|0,q|0)|0;q=$2a(l|0,G|0,n|0)|0;c[h+8>>2]=r;c[h+12>>2]=q;c[h+16>>2]=a;c[h+20>>2]=m;e=e+1|0;if(!(e>>>0<(c[f>>2]|0)>>>0)){break}else{h=h+52|0}}i=d;return}function XY(a,b){a=a|0;b=b|0;var c=0;c=i;if((b|0)==0){_a(736880,736888,111,736960)}else{i=c;return(a+ -1+b|0)/(b|0)|0|0}return 0}function YY(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;if((a|0)==0){_a(694248,694272,149,694336)}if((b|0)==0){_a(694360,694272,150,694336)}c[b>>2]=c[a>>2];c[b+4>>2]=c[a+4>>2];c[b+8>>2]=c[a+8>>2];c[b+12>>2]=c[a+12>>2];e=b+24|0;f=c[e>>2]|0;g=b+16|0;if((f|0)!=0){h=c[g>>2]|0;if((h|0)==0){j=f}else{k=f;f=h;h=0;while(1){l=c[k+(h*52|0)+44>>2]|0;if((l|0)==0){m=f;n=k}else{v2a(l);m=c[g>>2]|0;n=c[e>>2]|0}h=h+1|0;if(!(h>>>0<m>>>0)){j=n;break}else{k=n;f=m}}}v2a(j);c[e>>2]=0}j=c[a+16>>2]|0;c[g>>2]=j;m=u2a(j*52|0)|0;c[e>>2]=m;if((m|0)==0){c[e>>2]=0;c[g>>2]=0;i=d;return}a:do{if((j|0)!=0){f=a+24|0;n=m;k=0;while(1){h=n+(k*52|0)+0|0;l=(c[f>>2]|0)+(k*52|0)+0|0;o=h+52|0;do{c[h>>2]=c[l>>2];h=h+4|0;l=l+4|0}while((h|0)<(o|0));c[(c[e>>2]|0)+(k*52|0)+44>>2]=0;l=k+1|0;if(!(l>>>0<(c[g>>2]|0)>>>0)){break a}n=c[e>>2]|0;k=l}}}while(0);c[b+20>>2]=c[a+20>>2];e=a+32|0;g=c[e>>2]|0;m=b+32|0;c[m>>2]=g;if((g|0)==0){c[b+28>>2]=0;i=d;return}j=u2a(g)|0;g=b+28|0;c[g>>2]=j;if((j|0)==0){c[g>>2]=0;c[m>>2]=0;i=d;return}else{c3a(j|0,c[a+28>>2]|0,c[e>>2]|0)|0;i=d;return}}function ZY(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}c[a+64>>2]=314;c[a+52>>2]=0;i=b;return}function _Y(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}c[a+60>>2]=315;c[a+48>>2]=0;i=b;return}function $Y(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}c[a+56>>2]=316;c[a+44>>2]=0;i=b;return}function aZ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=w2a(1,84)|0;if((d|0)==0){e=0;i=b;return e|0}f=d+0|0;g=f+84|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));c[d+68>>2]=1;if((a|0)==0){c[d+72>>2]=161;c[d+76>>2]=206;c[d+80>>2]=207;c[d+4>>2]=290;c[d+16>>2]=201;c[d>>2]=291;c[d+20>>2]=527;c[d+24>>2]=317;c[d+8>>2]=4;c[d+12>>2]=19;c[d+28>>2]=12;c[d+32>>2]=76;c[d+36>>2]=202;f=tca()|0;c[d+40>>2]=f;if((f|0)==0){v2a(d);e=0;i=b;return e|0}}else if(!((a|0)==2?(c[d+72>>2]=162,c[d+76>>2]=208,c[d+80>>2]=209,c[d+4>>2]=292,c[d+16>>2]=203,c[d>>2]=293,c[d+8>>2]=5,c[d+12>>2]=20,c[d+20>>2]=528,c[d+24>>2]=318,c[d+28>>2]=13,c[d+32>>2]=77,c[d+36>>2]=204,a=HZ()|0,c[d+40>>2]=a,(a|0)!=0):0)){v2a(d);e=0;i=b;return e|0}SY(d+44|0);e=d;i=b;return e|0}function bZ(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}f3a(a|0,0,8248)|0;c[a>>2]=0;c[a+8200>>2]=-1;c[a+8204>>2]=-1;c[a+8248>>2]=0;i=b;return}function cZ(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;if((a|0)==0|(b|0)==0){e=0;i=d;return e|0}if((c[a+68>>2]|0)==0){RY(a+44|0,1,694384,d);e=0;i=d;return e|0}else{Ic[c[a+24>>2]&511](c[a+40>>2]|0,b);e=1;i=d;return e|0}return 0}function dZ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;if((b|0)==0|(a|0)==0){f=0;i=e;return f|0}if((c[b+68>>2]|0)==0){RY(b+44|0,1,694472,e);f=0;i=e;return f|0}else{f=id[c[b>>2]&511](a,c[b+40>>2]|0,d,b+44|0)|0;i=e;return f|0}return 0}function eZ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;if((a|0)==0|(b|0)==0){f=0;i=e;return f|0}if((c[a+68>>2]|0)==0){f=0;i=e;return f|0}f=id[c[a+4>>2]&511](c[a+40>>2]|0,b,d,a+44|0)|0;i=e;return f|0}function fZ(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0;h=i;if((a|0)==0){j=0;i=h;return j|0}if((c[a+68>>2]|0)==0){j=0;i=h;return j|0}j=Ec[c[a+28>>2]&15](c[a+40>>2]|0,b,d,e,f,g,a+44|0)|0;i=h;return j|0}function gZ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;if((a|0)==0|(b|0)==0){g=0;i=f;return g|0}if((c[a+68>>2]|0)==0){g=0;i=f;return g|0}g=ed[c[a+32>>2]&127](c[a+40>>2]|0,b,d,a+44|0,e)|0;i=f;return g|0}function hZ(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((a|0)==0|(b|0)==0){e=0;i=d;return e|0}if((c[a+68>>2]|0)==0){e=0;i=d;return e|0}e=Qc[c[a+16>>2]&255](c[a+40>>2]|0,b,a+44|0)|0;i=d;return e|0}function iZ(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}if((c[a+68>>2]|0)==0){Rc[c[a+16>>2]&1023](c[a+40>>2]|0)}else{Rc[c[a+20>>2]&1023](c[a+40>>2]|0)}v2a(a);i=b;return}function jZ(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((a|0)==0){i=b;return}d=c[a>>2]|0;e=c[d+48>>2]|0;if((e|0)==0){f=d}else{v2a(e);f=c[a>>2]|0}v2a(f);c[a>>2]=0;i=b;return}function kZ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+16|0;g=f;h=f+4|0;if((b|0)==0){_a(731616,694696,2048,695896)}if((a|0)==0){_a(694760,694696,2049,695896)}if((e|0)==0){_a(727712,694696,2050,695896)}j=a+100|0;if((c[j>>2]|0)!=0){RY(e,1,695912,g);k=0;i=f;return k|0}if((d|0)!=4){RY(e,1,695968,g);k=0;i=f;return k|0}wY(b,h,4);if((c[h>>2]|0)==218793738){c[j>>2]=c[j>>2]|1;k=1;i=f;return k|0}else{RY(e,1,696008,g);k=0;i=f;return k|0}return 0}function lZ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;i=i+16|0;g=f;if((b|0)==0){_a(731616,694696,2094,695736)}if((a|0)==0){_a(694760,694696,2095,695736)}if((e|0)==0){_a(727712,694696,2096,695736)}h=a+100|0;if((c[h>>2]|0)!=1){RY(e,1,695760,g);j=0;i=f;return j|0}if(d>>>0<8){RY(e,1,695816,g);j=0;i=f;return j|0}wY(b,a+56|0,4);wY(b+4|0,a+60|0,4);k=b+8|0;b=d+ -8|0;if((b&3|0)!=0){RY(e,1,695816,g);j=0;i=f;return j|0}d=b>>>2;b=a+64|0;c[b>>2]=d;a:do{if((d|0)!=0){l=d<<2;m=u2a(l)|0;n=a+68|0;c[n>>2]=m;if((m|0)==0){RY(e,1,695856,g);j=0;i=f;return j|0}f3a(m|0,0,l|0)|0;l=k;m=0;while(1){wY(l,(c[n>>2]|0)+(m<<2)|0,4);o=m+1|0;if(!(o>>>0<(c[b>>2]|0)>>>0)){break a}l=l+4|0;m=o}}}while(0);c[h>>2]=c[h>>2]|2;j=1;i=f;return j|0}function mZ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;f=i;i=i+16|0;g=f;h=f+8|0;j=f+4|0;if((b|0)==0){_a(731616,694696,2202,695408)}if((a|0)==0){_a(694760,694696,2203,695408)}if((e|0)==0){_a(727712,694696,2204,695408)}k=a+100|0;l=c[k>>2]|0;if((l&2|0)==0){RY(e,1,695432,g);m=0;i=f;return m|0}n=a+104|0;c[n>>2]=0;do{if((d|0)==0){o=l}else{p=b;q=d;while(1){if((p|0)==0){r=12;break}if(q>>>0<8){r=14;break}wY(p,h,4);s=c[h>>2]|0;wY(p+4|0,h,4);t=p+8|0;u=c[h>>2]|0;if((s|0)==1){if(q>>>0<16){r=17;break}wY(t,j,4);if((c[j>>2]|0)!=0){r=19;break}wY(p+12|0,h,4);t=c[h>>2]|0;if((t|0)==0){r=21;break}else{v=16;w=t}}else if((s|0)==0){r=22;break}else{v=8;w=s}if(w>>>0>q>>>0){r=25;break}else{x=0}while(1){s=694576+(x<<3)|0;x=x+1|0;if((c[s>>2]|0)==(u|0)){y=s;break}if(!(x>>>0<6)){y=0;break}}if(w>>>0<v>>>0){m=0;r=35;break}if((y|0)!=0){if((id[c[y+4>>2]&511](a,p+v|0,w-v|0,e)|0)==0){m=0;r=35;break}}else{c[n>>2]=c[n>>2]|2147483647}if((q|0)==(w|0)){r=33;break}else{p=p+w|0;q=q-w|0}}if((r|0)==12){_a(695600,694696,2262,695616)}else if((r|0)==14){RY(e,1,695648,g)}else if((r|0)==17){RY(e,1,695688,g)}else if((r|0)==19){RY(e,1,695360,g)}else if((r|0)==21){RY(e,1,695072,g)}else if((r|0)==22){RY(e,1,695072,g)}else if((r|0)==25){RY(e,1,695528,g);m=0;i=f;return m|0}else if((r|0)==33){o=c[k>>2]|0;break}else if((r|0)==35){i=f;return m|0}RY(e,1,695480,g);m=0;i=f;return m|0}}while(0);c[k>>2]=o|4;m=1;i=f;return m|0}function nZ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;i=i+16|0;g=f;if((b|0)==0){_a(697432,694696,523,697464)}if((a|0)==0){_a(694760,694696,524,697464)}if((e|0)==0){_a(727712,694696,525,697464)}if((d|0)!=14){RY(e,1,697488,g);h=0;i=f;return h|0}wY(b,a+16|0,4);wY(b+4|0,a+12|0,4);d=a+20|0;wY(b+8|0,d,2);j=(c[d>>2]|0)*12|0;d=u2a(j)|0;c[a+72>>2]=d;if((d|0)==0){RY(e,1,697528,g);h=0;i=f;return h|0}f3a(d|0,0,j|0)|0;wY(b+10|0,a+24|0,1);j=a+28|0;wY(b+11|0,j,1);d=c[j>>2]|0;if((d|0)!=7){c[g>>2]=d;RY(e,4,697584,g)}wY(b+12|0,a+32|0,1);wY(b+13|0,a+36|0,1);h=1;i=f;return h|0}function oZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;g=i;i=i+48|0;h=g;j=g+32|0;k=g+28|0;l=g+24|0;m=g+20|0;n=g+16|0;o=g+12|0;p=g+8|0;q=g+4|0;if((b|0)==0){_a(694760,694696,1211,696488)}if((d|0)==0){_a(696512,694696,1212,696488)}if((f|0)==0){_a(727712,694696,1213,696488)}if(e>>>0<3){RY(f,1,696544,h);r=0;i=g;return r|0}s=b+108|0;t=b+124|0;if((a[t>>0]|0)!=0){RY(f,4,696576,h);r=1;i=g;return r|0}u=b+40|0;wY(d,u,1);wY(d+1|0,b+52|0,1);wY(d+2|0,b+44|0,1);v=d+3|0;w=c[u>>2]|0;if((w|0)==1){if(e>>>0>7){c[h>>2]=e;RY(f,2,696688,h)}u=b+48|0;wY(v,u,4);x=d+7|0;if((c[u>>2]|0)==14){u=u2a(36)|0;c[u>>2]=14;if((e|0)==35){wY(x,k,4);wY(d+11|0,l,4);wY(d+15|0,m,4);wY(d+19|0,n,4);wY(d+23|0,o,4);wY(d+27|0,p,4);wY(d+31|0,q,4);c[u+4>>2]=0;y=c[k>>2]|0;z=c[m>>2]|0;A=c[o>>2]|0;B=c[l>>2]|0;C=c[n>>2]|0;D=c[p>>2]|0;E=c[q>>2]|0}else if((e|0)==7){c[p>>2]=0;c[n>>2]=0;c[l>>2]=0;c[o>>2]=0;c[m>>2]=0;c[k>>2]=0;c[q>>2]=4470064;c[u+4>>2]=1145390592;y=0;z=0;A=0;B=0;C=0;D=0;E=4470064}else{y=0;z=0;A=0;B=0;C=0;D=0;E=0}c[u+8>>2]=y;c[u+16>>2]=z;c[u+24>>2]=A;c[u+12>>2]=B;c[u+20>>2]=C;c[u+28>>2]=D;c[u+32>>2]=E;c[s>>2]=u;c[b+112>>2]=0}a[t>>0]=1;r=1;i=g;return r|0}else if((w|0)==2){u=e+ -3|0;e=b+112|0;c[e>>2]=u;b=u2a(u)|0;c[s>>2]=b;if((b|0)==0){c[e>>2]=0;r=0;i=g;return r|0}f3a(b|0,0,u|0)|0;if((u|0)>0){b=v;v=0;while(1){wY(b,j,1);a[(c[s>>2]|0)+v>>0]=c[j>>2];v=v+1|0;if((v|0)==(u|0)){break}else{b=b+1|0}}}a[t>>0]=1;r=1;i=g;return r|0}else{if(!(w>>>0>2)){r=1;i=g;return r|0}c[h>>2]=w;RY(f,4,696728,h);r=1;i=g;return r|0}return 0}function pZ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;i=i+16|0;g=f;if((b|0)==0){_a(697232,694696,663,697256)}if((a|0)==0){_a(694760,694696,664,697256)}if((e|0)==0){_a(727712,694696,665,697256)}h=c[a+24>>2]|0;if((h|0)!=255){c[g>>2]=h;RY(e,2,697280,g)}h=a+20|0;if((c[h>>2]|0)!=(d|0)){RY(e,1,697400,g);j=0;i=f;return j|0}if((d|0)==0){j=1;i=f;return j|0}d=a+72|0;a=b;b=0;while(1){wY(a,(c[d>>2]|0)+(b*12|0)+8|0,1);b=b+1|0;if(!(b>>>0<(c[h>>2]|0)>>>0)){j=1;break}else{a=a+1|0}}i=f;return j|0}function qZ(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;j=i;i=i+16|0;k=j;if((f|0)==0){_a(697176,694696,942,697208)}if((e|0)==0){_a(694760,694696,943,697208)}if((h|0)==0){_a(727712,694696,944,697208)}h=e+120|0;if((c[h>>2]|0)!=0|g>>>0<3){l=0;i=j;return l|0}wY(f,k,2);e=c[k>>2]|0;wY(f+2|0,k,1);m=c[k>>2]|0;n=m&65535;if((n+3|0)>>>0>g>>>0|(n|0)==0){l=0;i=j;return l|0}o=e&65535;if(!(o>>>0<(4294967295/(n>>>0)|0)>>>0)){l=0;i=j;return l|0}p=u2a(ca(o<<2,n)|0)|0;if((p|0)==0){l=0;i=j;return l|0}q=u2a(n)|0;if((q|0)==0){v2a(p);l=0;i=j;return l|0}r=u2a(n)|0;if((r|0)==0){v2a(p);v2a(q);l=0;i=j;return l|0}s=u2a(20)|0;if((s|0)==0){v2a(p);v2a(q);v2a(r);l=0;i=j;return l|0}c[s+4>>2]=r;c[s+8>>2]=q;c[s>>2]=p;b[s+16>>1]=e;a[s+18>>0]=m;c[s+12>>2]=0;c[h>>2]=s;s=f+3|0;h=0;m=0;do{wY(s,k,1);s=s+1|0;e=c[k>>2]|0;a[q+h>>0]=(e&127)+1;a[r+h>>0]=e>>>7&1;m=m+1<<16>>16;h=m&65535}while(h>>>0<n>>>0);if((o|0)==0){l=1;i=j;return l|0}h=f;f=s;s=p;p=0;a:while(1){m=f;r=0;e=s;t=1;while(1){u=((d[q+r>>0]|0)+7|0)>>>3;v=u>>>0>4?4:u;if((m-h+v|0)>(g|0)){l=0;w=26;break a}wY(m,k,v);x=m+v|0;c[e>>2]=c[k>>2];y=e+4|0;v=t&65535;if(!(v>>>0<n>>>0)){break}m=x;r=v;e=y;t=t+1<<16>>16}t=p+1<<16>>16;if((t&65535)>>>0<o>>>0){f=x;s=y;p=t}else{l=1;w=26;break}}if((w|0)==26){i=j;return l|0}return 0}function rZ(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;h=i;i=i+16|0;j=h;k=h+4|0;if((d|0)==0){_a(694760,694696,1037,697e3)}if((e|0)==0){_a(697024,694696,1038,697e3)}if((g|0)==0){_a(727712,694696,1039,697e3)}l=d+120|0;d=c[l>>2]|0;if((d|0)==0){RY(g,1,697056,j);m=0;i=h;return m|0}if((c[d+12>>2]|0)!=0){RY(g,1,697104,j);m=0;i=h;return m|0}n=a[d+18>>0]|0;o=(n&255)<<2;if(o>>>0>f>>>0){RY(g,1,697136,j);m=0;i=h;return m|0}j=u2a(o)|0;if((j|0)==0){m=0;i=h;return m|0}if(n<<24>>24==0){p=d}else{d=e;e=0;while(1){wY(d,k,2);b[j+(e<<2)>>1]=c[k>>2];wY(d+2|0,k,1);a[j+(e<<2)+2>>0]=c[k>>2];wY(d+3|0,k,1);a[j+(e<<2)+3>>0]=c[k>>2];e=e+1|0;if((e&255)<<24>>24==n<<24>>24){break}else{d=d+4|0}}p=c[l>>2]|0}c[p+12>>2]=j;m=1;i=h;return m|0}function sZ(a,d,f,g){a=a|0;d=d|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;h=i;i=i+16|0;j=h;k=h+4|0;if((a|0)==0){_a(694760,694696,1145,696840)}if((d|0)==0){_a(696864,694696,1146,696840)}if((g|0)==0){_a(727712,694696,1147,696840)}l=a+116|0;if((c[l>>2]|0)!=0){m=0;i=h;return m|0}if(f>>>0<2){RY(g,1,696896,j);m=0;i=h;return m|0}wY(d,k,2);a=c[k>>2]|0;n=a&65535;if((n|0)==0){RY(g,1,696936,j);m=0;i=h;return m|0}if(((n*6|0)+2|0)>>>0>f>>>0){RY(g,1,696896,j);m=0;i=h;return m|0}j=u2a(a*6|0)|0;if((j|0)==0){m=0;i=h;return m|0}g=u2a(8)|0;c[l>>2]=g;if((g|0)==0){v2a(j);m=0;i=h;return m|0}c[g>>2]=j;f=a&65535;b[g+4>>1]=f;if(f<<16>>16==0){m=1;i=h;return m|0}else{o=0;p=d}do{d=o&65535;wY(p+2|0,k,2);b[j+(d*6|0)>>1]=c[k>>2];wY(p+4|0,k,2);p=p+6|0;b[j+(d*6|0)+2>>1]=c[k>>2];wY(p,k,2);b[j+(d*6|0)+4>>1]=c[k>>2];o=o+1<<16>>16}while((o&65535)<(e[(c[l>>2]|0)+4>>1]|0));m=1;i=h;return m|0}function tZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;i=i+16|0;if((e|0)==0){h=0;i=g;return h|0}if((Aca(c[b>>2]|0,d,e,f)|0)==0){RY(f,1,694624,g);h=0;i=g;return h|0}if((c[b+128>>2]|0)!=0){h=1;i=g;return h|0}d=b+108|0;if((uZ(e,d,f)|0)==0){h=0;i=g;return h|0}f=c[b+48>>2]|0;do{if((f|0)==17){c[e+20>>2]=2}else if((f|0)==18){c[e+20>>2]=3}else if((f|0)!=16){j=e+20|0;if((f|0)==24){c[j>>2]=4;break}else{c[j>>2]=-1;break}}else{c[e+20>>2]=1}}while(0);if((c[b+116>>2]|0)!=0){vZ(e,d)}f=c[b+120>>2]|0;do{if((f|0)!=0){if((c[f+12>>2]|0)==0){wZ(d);break}if((a[e+36>>0]|0)==0){xZ(e,d)}}}while(0);f=c[d>>2]|0;if((f|0)==0){h=1;i=g;return h|0}c[e+28>>2]=f;c[e+32>>2]=c[b+112>>2];c[d>>2]=0;h=1;i=g;return h|0}function uZ(d,f,g){d=d|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;h=i;i=i+16|0;j=h;k=c[f+8>>2]|0;a:do{if((k|0)!=0?(l=c[k>>2]|0,m=b[k+4>>1]|0,!(m<<16>>16==0)):0){n=c[d+16>>2]|0;o=0;while(1){p=o&65535;q=e[l+(p*6|0)>>1]|0;if(!(q>>>0<n>>>0)){r=5;break}s=b[l+(p*6|0)+4>>1]|0;if(!(s<<16>>16==0)?(t=(s&65535)+ -1|0,!(t>>>0<n>>>0)):0){r=8;break}o=o+1<<16>>16;if(!((o&65535)<(m&65535))){break a}}if((r|0)==5){c[j>>2]=q;c[j+4>>2]=n;RY(g,1,696192,j);u=0;i=h;return u|0}else if((r|0)==8){c[j>>2]=t;c[j+4>>2]=n;RY(g,1,696192,j);u=0;i=h;return u|0}}}while(0);t=c[f+12>>2]|0;if((t|0)!=0?(f=c[t+12>>2]|0,(f|0)!=0):0){q=a[t+18>>0]|0;t=q&255;k=q<<24>>24==0;b:do{if(k){v=1}else{m=d+16|0;o=0;l=1;s=1;while(1){p=e[f+(o<<2)>>1]|0;w=c[m>>2]|0;if(p>>>0<w>>>0){x=s}else{c[j>>2]=p;c[j+4>>2]=w;RY(g,1,696192,j);x=0}w=l&65535;if(!(w>>>0<t>>>0)){v=x;break b}o=w;l=l+1<<16>>16;s=x}}}while(0);x=w2a(t,4)|0;if((x|0)==0){RY(g,1,696232,j);u=0;i=h;return u|0}if(k){y=v}else{k=0;d=0;s=v;while(1){v=a[f+(k<<2)+3>>0]|0;l=a[f+(k<<2)+2>>0]|0;if(!((l&255)<2)){r=22;break}o=v&255;do{if((v&255)<(q&255)){m=x+(o<<2)|0;if((c[m>>2]|0)!=0&l<<24>>24==1){c[j>>2]=o;RY(g,1,696376,j);z=0;break}if(l<<24>>24!=0|v<<24>>24==0){c[m>>2]=1;z=s;break}else{c[j>>2]=k;c[j+4>>2]=o;RY(g,1,696408,j);z=0;break}}else{c[j>>2]=o;RY(g,1,696320,j);z=0}}while(0);d=d+1<<16>>16;k=d&65535;if(!(k>>>0<t>>>0)){A=0;B=0;C=z;break}else{s=z}}if((r|0)==22){_a(696256,694696,807,696296)}while(1){if((c[x+(A<<2)>>2]|0)==0?(a[f+(A<<2)+2>>0]|0)!=0:0){c[j>>2]=A;RY(g,1,696448,j);D=0}else{D=C}B=B+1<<16>>16;A=B&65535;if(!(A>>>0<t>>>0)){y=D;break}else{C=D}}}v2a(x);if((y|0)==0){u=0;i=h;return u|0}}u=1;i=h;return u|0}function vZ(a,d){a=a|0;d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;f=i;i=i+64|0;g=f;h=d+8|0;d=c[h>>2]|0;j=c[d>>2]|0;k=b[d+4>>1]|0;if(k<<16>>16==0){l=j;m=d}else{d=a+16|0;n=a+24|0;a=c[q>>2]|0;o=0;do{p=j+(o*6|0)+4|0;r=b[p>>1]|0;do{if(r<<16>>16==-1|r<<16>>16==0){if(o>>>0<(c[d>>2]|0)>>>0){b[(c[n>>2]|0)+(o*52|0)+48>>1]=b[j+(o*6|0)+2>>1]|0}}else{s=e[j+(o*6|0)>>1]|0;t=c[d>>2]|0;u=(r&65535)+65535&65535;if(!(s>>>0<t>>>0&u>>>0<t>>>0)){c[g>>2]=s;c[g+4>>2]=u;c[g+8>>2]=t;lc(a|0,696160,g|0)|0;break}if((s|0)!=(u|0)){t=c[n>>2]|0;v=t+(s*52|0)|0;w=g+0|0;x=v+0|0;y=w+52|0;do{c[w>>2]=c[x>>2];w=w+4|0;x=x+4|0}while((w|0)<(y|0));w=v+0|0;x=t+(u*52|0)+0|0;y=w+52|0;do{c[w>>2]=c[x>>2];w=w+4|0;x=x+4|0}while((w|0)<(y|0));w=(c[n>>2]|0)+(u*52|0)+0|0;x=g+0|0;y=w+52|0;do{c[w>>2]=c[x>>2];w=w+4|0;x=x+4|0}while((w|0)<(y|0));b[p>>1]=s+1;b[j+(u*6|0)+4>>1]=(e[j+(u*6|0)>>1]|0)+1}b[(c[n>>2]|0)+(s*52|0)+48>>1]=b[j+(o*6|0)+2>>1]|0}}while(0);o=o+1|0}while(!((o&65535)<<16>>16==k<<16>>16));k=c[h>>2]|0;l=c[k>>2]|0;m=k}if((l|0)==0){z=m;v2a(z);c[h>>2]=0;i=f;return}v2a(l);z=c[h>>2]|0;v2a(z);c[h>>2]=0;i=f;return}function wZ(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+12|0;v2a(c[(c[d>>2]|0)+4>>2]|0);v2a(c[(c[d>>2]|0)+8>>2]|0);v2a(c[c[d>>2]>>2]|0);a=c[d>>2]|0;e=c[a+12>>2]|0;if((e|0)==0){f=a;v2a(f);c[d>>2]=0;i=b;return}v2a(e);f=c[d>>2]|0;v2a(f);c[d>>2]=0;i=b;return}function xZ(f,g){f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;h=i;j=c[g+12>>2]|0;k=c[j+8>>2]|0;l=c[j+4>>2]|0;m=c[j>>2]|0;n=c[j+12>>2]|0;o=a[j+18>>0]|0;p=f+24|0;q=c[p>>2]|0;r=o&255;s=u2a(r*52|0)|0;a:do{if(!(o<<24>>24==0)){t=0;u=0;while(1){v=a[n+(t<<2)+3>>0]|0;w=b[n+(t<<2)>>1]|0;if((a[n+(t<<2)+2>>0]|0)==0){if(!(v<<24>>24==0)){x=4;break}y=s+(t*52|0)+0|0;z=q+((w&65535)*52|0)+0|0;A=y+52|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0))}else{if((t|0)!=(v&255|0)){x=7;break}y=s+(t*52|0)+0|0;z=q+((w&65535)*52|0)+0|0;A=y+52|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0))}v=w&65535;c[s+(t*52|0)+44>>2]=u2a(ca(c[q+(v*52|0)+8>>2]<<2,c[q+(v*52|0)+12>>2]|0)|0)|0;c[s+(t*52|0)+24>>2]=d[k+t>>0]|0;c[s+(t*52|0)+32>>2]=d[l+t>>0]|0;u=u+1<<16>>16;t=u&65535;if(!(t>>>0<r>>>0)){x=10;break}}if((x|0)==4){_a(696072,694696,868,696088)}else if((x|0)==7){_a(696112,694696,871,696088)}else if((x|0)==10){t=(e[j+16>>1]|0)+ -1|0;u=0;v=0;while(1){B=b[n+(u<<2)>>1]|0;C=c[q+((B&65535)*52|0)+44>>2]|0;if((C|0)==0){x=12;break}D=d[n+(u<<2)+3>>0]|0;E=ca(c[s+(D*52|0)+12>>2]|0,c[s+(D*52|0)+8>>2]|0)|0;if((a[n+(u<<2)+2>>0]|0)==0){if(!(B<<16>>16==0)){x=15;break}B=c[s+(u*52|0)+44>>2]|0;if((B|0)==0){x=18;break}if((E|0)!=0){F=0;do{c[B+(F<<2)>>2]=c[C+(F<<2)>>2];F=F+1|0}while((F|0)!=(E|0))}}else{if((u|0)!=(D|0)){x=21;break}F=c[s+(u*52|0)+44>>2]|0;if((F|0)==0){x=24;break}if((E|0)!=0){B=0;do{w=c[C+(B<<2)>>2]|0;if((w|0)<0){G=0}else{G=(w|0)>(t|0)?t:w}c[F+(B<<2)>>2]=c[m+((ca(G,r)|0)+u<<2)>>2];B=B+1|0}while((B|0)!=(E|0))}}v=v+1<<16>>16;u=v&65535;if(!(u>>>0<r>>>0)){break a}}if((x|0)==12){_a(696128,694696,888,696088)}else if((x|0)==15){_a(696136,694696,893,696088)}else if((x|0)==18){_a(696152,694696,895,696088)}else if((x|0)==21){_a(696112,694696,901,696088)}else if((x|0)==24){_a(696152,694696,903,696088)}}}}while(0);x=f+16|0;f=c[x>>2]|0;if((f|0)==0){v2a(q);c[p>>2]=s;c[x>>2]=r;wZ(g);i=h;return}else{H=0;I=0}do{G=c[q+(H*52|0)+44>>2]|0;if((G|0)!=0){v2a(G)}I=I+1<<16>>16;H=I&65535}while(H>>>0<f>>>0);v2a(q);c[p>>2]=s;c[x>>2]=r;wZ(g);i=h;return}function yZ(b,d){b=b|0;d=d|0;var e=0;e=i;eca(c[b>>2]|0,d);a[b+124>>0]=0;c[b+128>>2]=c[d+8248>>2]&1;i=e;return}function zZ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;if((a|0)==0){_a(694760,694696,1714,694776)}if((b|0)==0){_a(694800,694696,1715,694776)}if((d|0)==0){_a(727712,694696,1716,694776)}else{f=a+8|0;Bba(c[f>>2]|0,205);g=(AZ(a,c[f>>2]|0,b,d)|0)==0;i=e;return(g?0:1)|0}return 0}function AZ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;if((b|0)==0){_a(731104,694696,1948,696056)}if((a|0)==0){_a(694760,694696,1949,696056)}if((d|0)==0){_a(694680,694696,1950,696056)}if((e|0)==0){_a(727712,694696,1951,696056)}g=Cba(c[b>>2]|0)|0;if((g|0)==0){h=1;Eba(b);i=f;return h|0}j=0;k=Dba(c[b+8>>2]|0)|0;l=1;while(1){if((l|0)==0){m=0}else{m=(Qc[c[k>>2]&255](a,d,e)|0)!=0}n=m&1;j=j+1|0;if((j|0)==(g|0)){h=n;break}else{k=k+4|0;l=n}}Eba(b);i=f;return h|0}function BZ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;if((b|0)==0){_a(694760,694696,2326,694816)}if((a|0)==0){_a(727696,694696,2327,694816)}if((e|0)==0){_a(727712,694696,2328,694816)}g=b+8|0;Bba(c[g>>2]|0,205);if((AZ(b,c[b+4>>2]|0,a,e)|0)==0){h=0;i=f;return h|0}if((AZ(b,c[g>>2]|0,a,e)|0)==0){h=0;i=f;return h|0}h=ica(a,c[b>>2]|0,d,e)|0;i=f;return h|0}function CZ(a,b,d,e,f,g,h,j,k,l,m){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0;n=i;o=nca(c[a>>2]|0,b,d,e,f,g,h,j,k,l,m)|0;i=n;return o|0}function DZ(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0;h=i;j=qca(c[a>>2]|0,b,d,e,f,g)|0;i=h;return j|0}function EZ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;if((a|0)==0){i=b;return}fca(c[a>>2]|0);c[a>>2]=0;d=a+72|0;e=c[d>>2]|0;if((e|0)!=0){v2a(e);c[d>>2]=0}d=a+68|0;e=c[d>>2]|0;if((e|0)!=0){v2a(e);c[d>>2]=0}d=a+108|0;e=c[d>>2]|0;if((e|0)!=0){v2a(e);c[d>>2]=0}d=a+116|0;e=c[d>>2]|0;if((e|0)!=0){f=c[e>>2]|0;if((f|0)==0){g=e}else{v2a(f);c[c[d>>2]>>2]=0;g=c[d>>2]|0}v2a(g);c[d>>2]=0}d=a+120|0;g=c[d>>2]|0;if((g|0)!=0){f=c[g+12>>2]|0;if((f|0)==0){h=g}else{v2a(f);c[(c[d>>2]|0)+12>>2]=0;h=c[d>>2]|0}f=c[h+4>>2]|0;if((f|0)==0){j=h}else{v2a(f);c[(c[d>>2]|0)+4>>2]=0;j=c[d>>2]|0}f=c[j+8>>2]|0;if((f|0)==0){k=j}else{v2a(f);c[(c[d>>2]|0)+8>>2]=0;k=c[d>>2]|0}f=c[k>>2]|0;if((f|0)==0){l=k}else{v2a(f);c[c[d>>2]>>2]=0;l=c[d>>2]|0}v2a(l);c[d>>2]=0}d=a+4|0;l=c[d>>2]|0;if((l|0)!=0){Aba(l);c[d>>2]=0}d=c[a+8>>2]|0;if((d|0)!=0){Aba(d)}v2a(a);i=b;return}function FZ(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0;j=i;k=sca(c[a>>2]|0,b,d,e,f,g,h)|0;i=j;return k|0}function GZ(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;i=i+16|0;h=g;if((d|0)==0){j=0;i=g;return j|0}RY(e,2,694840,h);if((Bca(c[a>>2]|0,b,d,e,f)|0)==0){RY(e,1,694624,h);j=0;i=g;return j|0}h=a+108|0;if((uZ(d,h,e)|0)==0){j=0;i=g;return j|0}e=c[a+48>>2]|0;do{if((e|0)==17){c[d+20>>2]=2}else if((e|0)!=16){f=d+20|0;if((e|0)==18){c[f>>2]=3;break}else{c[f>>2]=-1;break}}else{c[d+20>>2]=1}}while(0);if((c[a+116>>2]|0)!=0){vZ(d,h)}e=c[a+120>>2]|0;do{if((e|0)!=0){if((c[e+12>>2]|0)==0){wZ(h);break}else{xZ(d,h);break}}}while(0);e=c[h>>2]|0;if((e|0)==0){j=1;i=g;return j|0}c[d+28>>2]=e;c[d+32>>2]=c[a+112>>2];c[h>>2]=0;j=1;i=g;return j|0}function HZ(){var b=0,d=0,e=0,f=0;b=i;d=u2a(136)|0;do{if((d|0)!=0){f3a(d|0,0,136)|0;e=tca()|0;c[d>>2]=e;if((e|0)==0){EZ(d);f=0;break}e=d+108|0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;a[e+16>>0]=0;e=zba()|0;c[d+4>>2]=e;if((e|0)==0){EZ(d);f=0;break}e=zba()|0;c[d+8>>2]=e;if((e|0)==0){EZ(d);f=0}else{f=d}}else{f=d}}while(0);i=b;return f|0}function IZ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;if((a|0)==0){_a(694920,694696,2622,694936)}else{uca(c[a>>2]|0,b,d);i=e;return}}function JZ(a){a=a|0;var b=0,d=0;b=i;d=zca(c[a>>2]|0)|0;i=b;return d|0}function KZ(a){a=a|0;var b=0,d=0;b=i;d=yca(c[a>>2]|0)|0;i=b;return d|0}function LZ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=Cca(c[a>>2]|0,b,d)|0;i=e;return f|0}function MZ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;e=i;i=i+32|0;f=e;g=e+24|0;h=e+20|0;j=e+8|0;if((b|0)==0){_a(694680,694696,1845,694952)}if((a|0)==0){_a(694760,694696,1846,694952)}if((d|0)==0){_a(727712,694696,1847,694952)}k=u2a(1024)|0;if((k|0)==0){RY(d,1,694984,f);l=0;i=e;return l|0}f3a(k|0,0,1024)|0;m=g+4|0;n=j+4|0;o=a+100|0;p=k;k=1024;a:while(1){while(1){if((NY(b,g,8,d)|0)!=8){break a}wY(g,j,4);wY(m,n,4);q=c[j>>2]|0;if((q|0)==0){r=PY(b)|0;c[j>>2]=r;if((r|0)==(r|0)&0==(G|0)){s=8}else{t=14;break a}}else if((q|0)==1){if((NY(b,g,8,d)|0)!=8){break a}wY(g,h,4);if((c[h>>2]|0)!=0){t=17;break a}wY(m,j,4);s=16}else{s=8}u=c[n>>2]|0;if((u|0)==1785737827){t=20;break a}v=c[j>>2]|0;if((v|0)==0){t=24;break a}if(v>>>0<s>>>0){t=27;break a}q=PY(b)|0;r=G;if(0>(r|0)|0==(r|0)&v>>>0>q>>>0){t=27;break a}else{w=0}while(1){x=694552+(w<<3)|0;q=w+1|0;if((c[x>>2]|0)==(u|0)){t=31;break}if(q>>>0<3){w=q}else{t=29;break}}if((t|0)==29){t=0;y=v-s|0}else if((t|0)==31){t=0;z=v-s|0;if((x|0)==0){y=z}else{break}}c[o>>2]=c[o>>2]|2147483647;q=QY(b,y,0,d)|0;if(!((q|0)==(y|0)&(G|0)==0)){t=40;break a}}if(z>>>0>k>>>0){q=x2a(p,z)|0;if((q|0)==0){t=34;break}else{A=q;B=z}}else{A=p;B=k}if((NY(b,A,z,d)|0)!=(z|0)){t=36;break}if((id[c[694556+(w<<3)>>2]&511](a,A,z,d)|0)==0){t=38;break}else{p=A;k=B}}if((t|0)==14){_a(695328,694696,464,695304)}else if((t|0)==17){RY(d,1,695360,f)}else if((t|0)==20){B=c[o>>2]|0;if((B&4|0)==0){RY(d,1,695040,f);v2a(p);l=0;i=e;return l|0}else{c[o>>2]=B|8;v2a(p);l=1;i=e;return l|0}}else if((t|0)==24){RY(d,1,695072,f);v2a(p);l=0;i=e;return l|0}else if((t|0)==27){c[f>>2]=v;c[f+4>>2]=u;RY(d,1,695112,f);v2a(p);l=0;i=e;return l|0}else if((t|0)==34){v2a(p);RY(d,1,695144,f);l=0;i=e;return l|0}else if((t|0)==36){RY(d,1,695192,f);v2a(A);l=0;i=e;return l|0}else if((t|0)==38){v2a(A);l=0;i=e;return l|0}else if((t|0)==40){RY(d,1,695248,f);v2a(p);l=0;i=e;return l|0}v2a(p);l=1;i=e;return l|0}function NZ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;i=i+64|0;g=f;c[g>>2]=d;c[g+4>>2]=e;c[g+12>>2]=a;c[g+16>>2]=c[b>>2];c[g+32>>2]=0;c[g+36>>2]=0;c[g+40>>2]=0;if((PZ(g,-1,697680,56)|0)!=0){i=f;return}if((VZ(g,4)|0)==1){c[b>>2]=c[g+20>>2];RZ(g)|0;i=f;return}else{RZ(g)|0;i=f;return}}function OZ(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=i;NZ(a,b,c,d);i=e;return}function PZ(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=i;f=QZ(a,b,c,d)|0;i=e;return f|0}function QZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;if((e|0)==0){h=-6;i=g;return h|0}if(!((a[e>>0]|0)==49&(f|0)==56)){h=-6;i=g;return h|0}if((b|0)==0){h=-2;i=g;return h|0}f=b+24|0;c[f>>2]=0;e=b+32|0;j=c[e>>2]|0;if((j|0)==0){c[e>>2]=206;c[b+40>>2]=0;k=206}else{k=j}j=b+36|0;if((c[j>>2]|0)==0){c[j>>2]=319}j=(d|0)==-1?6:d;if(j>>>0>9){h=-2;i=g;return h|0}d=b+40|0;l=Qc[k&255](c[d>>2]|0,1,5828)|0;if((l|0)==0){h=-4;i=g;return h|0}c[b+28>>2]=l;c[l>>2]=b;c[l+24>>2]=1;c[l+28>>2]=0;c[l+48>>2]=15;k=l+44|0;c[k>>2]=32768;c[l+52>>2]=32767;c[l+80>>2]=15;m=l+76|0;c[m>>2]=32768;c[l+84>>2]=32767;c[l+88>>2]=5;n=l+56|0;c[n>>2]=Qc[c[e>>2]&255](c[d>>2]|0,32768,2)|0;o=l+64|0;c[o>>2]=Qc[c[e>>2]&255](c[d>>2]|0,c[k>>2]|0,2)|0;k=l+68|0;c[k>>2]=Qc[c[e>>2]&255](c[d>>2]|0,c[m>>2]|0,2)|0;c[l+5824>>2]=0;m=l+5788|0;c[m>>2]=16384;p=Qc[c[e>>2]&255](c[d>>2]|0,16384,4)|0;c[l+8>>2]=p;d=c[m>>2]|0;c[l+12>>2]=d<<2;if(((c[n>>2]|0)!=0?(c[o>>2]|0)!=0:0)?!((c[k>>2]|0)==0|(p|0)==0):0){c[l+5796>>2]=p+(d>>>1<<1);c[l+5784>>2]=p+(d*3|0);c[l+132>>2]=j;c[l+136>>2]=0;a[l+36>>0]=8;h=SZ(b)|0;i=g;return h|0}c[l+4>>2]=666;c[f>>2]=703352;RZ(b)|0;h=-4;i=g;return h|0}function RZ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;b=i;if((a|0)==0){d=-2;i=b;return d|0}e=a+28|0;f=c[e>>2]|0;if((f|0)==0){d=-2;i=b;return d|0}g=c[f+4>>2]|0;switch(g|0){case 42:case 69:case 73:case 91:case 103:case 113:case 666:{break};default:{d=-2;i=b;return d|0}}h=c[f+8>>2]|0;if((h|0)==0){j=f}else{Ic[c[a+36>>2]&511](c[a+40>>2]|0,h);j=c[e>>2]|0}h=c[j+68>>2]|0;if((h|0)==0){k=j}else{Ic[c[a+36>>2]&511](c[a+40>>2]|0,h);k=c[e>>2]|0}h=c[k+64>>2]|0;j=a+36|0;if((h|0)==0){l=k}else{Ic[c[j>>2]&511](c[a+40>>2]|0,h);l=c[e>>2]|0}h=c[l+56>>2]|0;if((h|0)==0){m=a+40|0;n=l}else{l=a+40|0;Ic[c[j>>2]&511](c[l>>2]|0,h);m=l;n=c[e>>2]|0}Ic[c[j>>2]&511](c[m>>2]|0,n);c[e>>2]=0;d=(g|0)==113?-3:0;i=b;return d|0}function SZ(a){a=a|0;var d=0,f=0,g=0,h=0;d=i;f=UZ(a)|0;if((f|0)!=0){i=d;return f|0}g=c[a+28>>2]|0;c[g+60>>2]=c[g+44>>2]<<1;a=g+76|0;h=g+68|0;b[(c[h>>2]|0)+((c[a>>2]|0)+ -1<<1)>>1]=0;f3a(c[h>>2]|0,0,(c[a>>2]<<1)+ -2|0)|0;a=c[g+132>>2]|0;c[g+128>>2]=e[697690+(a*12|0)>>1]|0;c[g+140>>2]=e[697688+(a*12|0)>>1]|0;c[g+144>>2]=e[697692+(a*12|0)>>1]|0;c[g+124>>2]=e[697694+(a*12|0)>>1]|0;c[g+108>>2]=0;c[g+92>>2]=0;c[g+116>>2]=0;c[g+5812>>2]=0;c[g+120>>2]=2;c[g+96>>2]=2;c[g+104>>2]=0;c[g+72>>2]=0;i=d;return f|0}function TZ(a){a=a|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;f=i;g=a+44|0;h=c[g>>2]|0;j=a+60|0;k=a+116|0;l=a+108|0;m=h+ -262|0;n=a+56|0;o=a+5812|0;p=a+72|0;q=a+88|0;r=a+84|0;s=a+68|0;t=a+52|0;u=a+64|0;v=a+112|0;w=a+92|0;x=a+76|0;y=c[k>>2]|0;z=h;while(1){A=c[l>>2]|0;B=(c[j>>2]|0)-y-A|0;if(A>>>0<(m+z|0)>>>0){C=B}else{A=c[n>>2]|0;c3a(A|0,A+h|0,h|0)|0;c[v>>2]=(c[v>>2]|0)-h;c[l>>2]=(c[l>>2]|0)-h;c[w>>2]=(c[w>>2]|0)-h;A=c[x>>2]|0;D=A;E=(c[s>>2]|0)+(A<<1)|0;do{E=E+ -2|0;A=e[E>>1]|0;if(A>>>0<h>>>0){F=0}else{F=A-h&65535}b[E>>1]=F;D=D+ -1|0}while((D|0)!=0);D=h;E=(c[u>>2]|0)+(h<<1)|0;do{E=E+ -2|0;A=e[E>>1]|0;if(A>>>0<h>>>0){G=0}else{G=A-h&65535}b[E>>1]=G;D=D+ -1|0}while((D|0)!=0);C=B+h|0}D=c[a>>2]|0;E=D+4|0;A=c[E>>2]|0;if((A|0)==0){break}H=c[k>>2]|0;I=(c[n>>2]|0)+(H+(c[l>>2]|0))|0;J=A>>>0>C>>>0?C:A;if((J|0)==0){K=0;L=H}else{c[E>>2]=A-J;c3a(I|0,c[D>>2]|0,J|0)|0;if((c[(c[D+28>>2]|0)+24>>2]|0)==1){A=D+48|0;c[A>>2]=jda(c[A>>2]|0,I,J)|0}c[D>>2]=(c[D>>2]|0)+J;I=D+8|0;c[I>>2]=(c[I>>2]|0)+J;K=J;L=c[k>>2]|0}J=L+K|0;c[k>>2]=J;I=c[o>>2]|0;a:do{if((J+I|0)>>>0>2){D=(c[l>>2]|0)-I|0;A=c[n>>2]|0;E=d[A+D>>0]|0;c[p>>2]=E;c[p>>2]=((d[A+(D+1)>>0]|0)^E<<c[q>>2])&c[r>>2];E=J;A=I;H=D;while(1){if((A|0)==0){M=E;break a}D=((d[(c[n>>2]|0)+(H+2)>>0]|0)^c[p>>2]<<c[q>>2])&c[r>>2];c[p>>2]=D;b[(c[u>>2]|0)+((c[t>>2]&H)<<1)>>1]=b[(c[s>>2]|0)+(D<<1)>>1]|0;b[(c[s>>2]|0)+(c[p>>2]<<1)>>1]=H;A=(c[o>>2]|0)+ -1|0;c[o>>2]=A;D=c[k>>2]|0;if((D+A|0)>>>0<3){M=D;break}else{E=D;H=H+1|0}}}else{M=J}}while(0);if(!(M>>>0<262)){break}if((c[(c[a>>2]|0)+4>>2]|0)==0){break}y=M;z=c[g>>2]|0}g=a+5824|0;a=c[g>>2]|0;z=c[j>>2]|0;if(!(a>>>0<z>>>0)){i=f;return}j=(c[k>>2]|0)+(c[l>>2]|0)|0;if(a>>>0<j>>>0){l=z-j|0;k=l>>>0>258?258:l;f3a((c[n>>2]|0)+j|0,0,k|0)|0;c[g>>2]=k+j;i=f;return}k=j+258|0;if(!(a>>>0<k>>>0)){i=f;return}j=k-a|0;k=z-a|0;z=j>>>0>k>>>0?k:j;f3a((c[n>>2]|0)+a|0,0,z|0)|0;c[g>>2]=(c[g>>2]|0)+z;i=f;return}function UZ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;if((a|0)==0){d=-2;i=b;return d|0}e=c[a+28>>2]|0;if((e|0)==0){d=-2;i=b;return d|0}if((c[a+32>>2]|0)==0){d=-2;i=b;return d|0}if((c[a+36>>2]|0)==0){d=-2;i=b;return d|0}c[a+20>>2]=0;c[a+8>>2]=0;c[a+24>>2]=0;c[a+44>>2]=2;c[e+20>>2]=0;c[e+16>>2]=c[e+8>>2];f=e+24|0;g=c[f>>2]|0;if((g|0)<0){h=0-g|0;c[f>>2]=h;j=h}else{j=g}c[e+4>>2]=(j|0)!=0?42:113;c[a+48>>2]=jda(0,0,0)|0;c[e+40>>2]=0;j_(e);d=0;i=b;return d|0}function VZ(e,f){e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0;g=i;if((e|0)==0){h=-2;i=g;return h|0}j=c[e+28>>2]|0;if((j|0)==0|f>>>0>5){h=-2;i=g;return h|0}do{if((c[e+12>>2]|0)!=0){if((c[e>>2]|0)==0?(c[e+4>>2]|0)!=0:0){break}k=j+4|0;l=c[k>>2]|0;m=(f|0)==4;if((l|0)!=666|m){n=e+16|0;if((c[n>>2]|0)==0){c[e+24>>2]=703376;h=-5;i=g;return h|0}c[j>>2]=e;o=j+40|0;p=c[o>>2]|0;c[o>>2]=f;if((l|0)==42){l=(c[j+48>>2]<<12)+ -30720|0;if((c[j+136>>2]|0)<=1?(q=c[j+132>>2]|0,(q|0)>=2):0){if((q|0)<6){r=64}else{r=(q|0)==6?128:192}}else{r=0}q=r|l;l=j+108|0;s=(c[l>>2]|0)==0?q:q|32;c[k>>2]=113;WZ(j,(s|((s>>>0)%31|0))^31);s=e+48|0;if((c[l>>2]|0)!=0){WZ(j,(c[s>>2]|0)>>>16);WZ(j,c[s>>2]&65535)}c[s>>2]=jda(0,0,0)|0}s=j+20|0;do{if((c[s>>2]|0)==0){l=c[e+4>>2]|0;if((l|0)==0){if(((f<<1)-((f|0)>4?9:0)|0)>((p<<1)-((p|0)>4?9:0)|0)|m){t=0}else{c[e+24>>2]=703376;h=-5;i=g;return h|0}}else{t=l}}else{XZ(e);if((c[n>>2]|0)!=0){t=c[e+4>>2]|0;break}c[o>>2]=-1;h=0;i=g;return h|0}}while(0);p=(c[k>>2]|0)==666;l=(t|0)==0;if(p){if(l){u=29}else{c[e+24>>2]=703376;h=-5;i=g;return h|0}}else{if(l){u=29}else{u=32}}do{if((u|0)==29){if((c[j+116>>2]|0)==0){if((f|0)!=0){if(p){break}else{u=32;break}}else{h=0;i=g;return h|0}}else{u=32}}}while(0);do{if((u|0)==32){p=c[j+136>>2]|0;a:do{if((p|0)==2){l=j+116|0;q=j+96|0;v=j+108|0;w=j+56|0;x=j+5792|0;y=j+5796|0;z=j+5784|0;A=j+5788|0;B=j+92|0;while(1){if((c[l>>2]|0)==0?(TZ(j),(c[l>>2]|0)==0):0){break}c[q>>2]=0;C=a[(c[w>>2]|0)+(c[v>>2]|0)>>0]|0;b[(c[y>>2]|0)+(c[x>>2]<<1)>>1]=0;D=c[x>>2]|0;c[x>>2]=D+1;a[(c[z>>2]|0)+D>>0]=C;D=j+((C&255)<<2)+148|0;b[D>>1]=(b[D>>1]|0)+1<<16>>16;D=(c[x>>2]|0)==((c[A>>2]|0)+ -1|0);c[l>>2]=(c[l>>2]|0)+ -1;C=(c[v>>2]|0)+1|0;c[v>>2]=C;if(!D){continue}D=c[B>>2]|0;if((D|0)>-1){E=(c[w>>2]|0)+D|0}else{E=0}p_(j,E,C-D|0,0);c[B>>2]=c[v>>2];XZ(c[j>>2]|0);if((c[(c[j>>2]|0)+16>>2]|0)==0){u=88;break a}}if((f|0)!=0){c[j+5812>>2]=0;if(m){l=c[B>>2]|0;if((l|0)>-1){F=(c[w>>2]|0)+l|0}else{F=0}p_(j,F,(c[v>>2]|0)-l|0,1);c[B>>2]=c[v>>2];XZ(c[j>>2]|0);G=(c[(c[j>>2]|0)+16>>2]|0)==0?2:3;u=85;break}if((c[x>>2]|0)!=0){l=c[B>>2]|0;if((l|0)>-1){H=(c[w>>2]|0)+l|0}else{H=0}p_(j,H,(c[v>>2]|0)-l|0,0);c[B>>2]=c[v>>2];XZ(c[j>>2]|0);if((c[(c[j>>2]|0)+16>>2]|0)==0){u=88}}}else{u=88}}else if((p|0)==3){l=j+116|0;A=(f|0)==0;z=j+96|0;y=j+108|0;q=j+5792|0;D=j+5796|0;C=j+5784|0;I=j+2440|0;J=j+5788|0;K=j+56|0;L=j+92|0;while(1){M=c[l>>2]|0;if(M>>>0<259){TZ(j);N=c[l>>2]|0;if(N>>>0<259&A){u=88;break a}if((N|0)==0){break}c[z>>2]=0;if(N>>>0>2){O=N;u=56}else{P=c[y>>2]|0;u=71}}else{c[z>>2]=0;O=M;u=56}if((u|0)==56){u=0;M=c[y>>2]|0;if((M|0)!=0){N=c[K>>2]|0;Q=a[N+(M+ -1)>>0]|0;if((Q<<24>>24==(a[N+M>>0]|0)?Q<<24>>24==(a[N+(M+1)>>0]|0):0)?(R=N+(M+2)|0,Q<<24>>24==(a[R>>0]|0)):0){S=N+(M+258)|0;N=R;while(1){R=N+1|0;if(!(Q<<24>>24==(a[R>>0]|0))){T=R;break}R=N+2|0;if(!(Q<<24>>24==(a[R>>0]|0))){T=R;break}R=N+3|0;if(!(Q<<24>>24==(a[R>>0]|0))){T=R;break}R=N+4|0;if(!(Q<<24>>24==(a[R>>0]|0))){T=R;break}R=N+5|0;if(!(Q<<24>>24==(a[R>>0]|0))){T=R;break}R=N+6|0;if(!(Q<<24>>24==(a[R>>0]|0))){T=R;break}R=N+7|0;if(!(Q<<24>>24==(a[R>>0]|0))){T=R;break}R=N+8|0;if(R>>>0<S>>>0?Q<<24>>24==(a[R>>0]|0):0){N=R}else{T=R;break}}N=T-S+258|0;Q=N>>>0>O>>>0?O:N;c[z>>2]=Q;if(Q>>>0>2){N=Q+253|0;b[(c[D>>2]|0)+(c[q>>2]<<1)>>1]=1;Q=c[q>>2]|0;c[q>>2]=Q+1;a[(c[C>>2]|0)+Q>>0]=N;Q=j+((d[701152+(N&255)>>0]|256)+1<<2)+148|0;b[Q>>1]=(b[Q>>1]|0)+1<<16>>16;b[I>>1]=(b[I>>1]|0)+1<<16>>16;Q=(c[q>>2]|0)==((c[J>>2]|0)+ -1|0)&1;N=c[z>>2]|0;c[l>>2]=(c[l>>2]|0)-N;R=(c[y>>2]|0)+N|0;c[y>>2]=R;c[z>>2]=0;U=R;V=Q}else{P=M;u=71}}else{P=M;u=71}}else{P=0;u=71}}if((u|0)==71){u=0;Q=a[(c[K>>2]|0)+P>>0]|0;b[(c[D>>2]|0)+(c[q>>2]<<1)>>1]=0;R=c[q>>2]|0;c[q>>2]=R+1;a[(c[C>>2]|0)+R>>0]=Q;R=j+((Q&255)<<2)+148|0;b[R>>1]=(b[R>>1]|0)+1<<16>>16;R=(c[q>>2]|0)==((c[J>>2]|0)+ -1|0)&1;c[l>>2]=(c[l>>2]|0)+ -1;Q=(c[y>>2]|0)+1|0;c[y>>2]=Q;U=Q;V=R}if((V|0)==0){continue}R=c[L>>2]|0;if((R|0)>-1){W=(c[K>>2]|0)+R|0}else{W=0}p_(j,W,U-R|0,0);c[L>>2]=c[y>>2];XZ(c[j>>2]|0);if((c[(c[j>>2]|0)+16>>2]|0)==0){u=88;break a}}c[j+5812>>2]=0;if(m){l=c[L>>2]|0;if((l|0)>-1){X=(c[K>>2]|0)+l|0}else{X=0}p_(j,X,(c[y>>2]|0)-l|0,1);c[L>>2]=c[y>>2];XZ(c[j>>2]|0);G=(c[(c[j>>2]|0)+16>>2]|0)==0?2:3;u=85;break}if((c[q>>2]|0)!=0){l=c[L>>2]|0;if((l|0)>-1){Y=(c[K>>2]|0)+l|0}else{Y=0}p_(j,Y,(c[y>>2]|0)-l|0,0);c[L>>2]=c[y>>2];XZ(c[j>>2]|0);if((c[(c[j>>2]|0)+16>>2]|0)==0){u=88}}}else{G=dd[c[697696+((c[j+132>>2]|0)*12|0)>>2]&511](j,f)|0;u=85}}while(0);if((u|0)==85){if((G&-2|0)==2){c[k>>2]=666}if((G&-3|0)!=0){if((G|0)!=1){break}}else{u=88}}if((u|0)==88){if((c[n>>2]|0)!=0){h=0;i=g;return h|0}c[o>>2]=-1;h=0;i=g;return h|0}if((f|0)==1){o_(j)}else if(((f|0)!=5?(l_(j,0,0,0),(f|0)==3):0)?(p=j+76|0,l=j+68|0,b[(c[l>>2]|0)+((c[p>>2]|0)+ -1<<1)>>1]=0,f3a(c[l>>2]|0,0,(c[p>>2]<<1)+ -2|0)|0,(c[j+116>>2]|0)==0):0){c[j+108>>2]=0;c[j+92>>2]=0;c[j+5812>>2]=0}XZ(e);if((c[n>>2]|0)==0){c[o>>2]=-1;h=0;i=g;return h|0}}}while(0);if(!m){h=0;i=g;return h|0}o=j+24|0;if((c[o>>2]|0)<1){h=1;i=g;return h|0}n=e+48|0;WZ(j,(c[n>>2]|0)>>>16);WZ(j,c[n>>2]&65535);XZ(e);n=c[o>>2]|0;if((n|0)>0){c[o>>2]=0-n}h=(c[s>>2]|0)==0&1;i=g;return h|0}}}while(0);c[e+24>>2]=703336;h=-2;i=g;return h|0}function WZ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=b+20|0;f=c[e>>2]|0;c[e>>2]=f+1;g=b+8|0;a[(c[g>>2]|0)+f>>0]=d>>>8;f=c[e>>2]|0;c[e>>2]=f+1;a[(c[g>>2]|0)+f>>0]=d;return}function XZ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;d=c[a+28>>2]|0;m_(d);e=d+20|0;f=c[e>>2]|0;g=a+16|0;h=c[g>>2]|0;j=f>>>0>h>>>0?h:f;if((j|0)==0){i=b;return}f=a+12|0;h=d+16|0;c3a(c[f>>2]|0,c[h>>2]|0,j|0)|0;c[f>>2]=(c[f>>2]|0)+j;c[h>>2]=(c[h>>2]|0)+j;f=a+20|0;c[f>>2]=(c[f>>2]|0)+j;c[g>>2]=(c[g>>2]|0)-j;g=c[e>>2]|0;c[e>>2]=g-j;if((g|0)!=(j|0)){i=b;return}c[h>>2]=c[d+8>>2];i=b;return}function YZ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;d=i;e=(c[a+12>>2]|0)+ -5|0;f=e>>>0<65535?e:65535;e=a+116|0;g=a+108|0;h=a+92|0;j=a+44|0;k=a+56|0;while(1){l=c[e>>2]|0;if(l>>>0<2){TZ(a);m=c[e>>2]|0;if((m|b|0)==0){n=0;o=23;break}if((m|0)==0){o=14;break}else{p=m}}else{p=l}l=(c[g>>2]|0)+p|0;c[g>>2]=l;c[e>>2]=0;m=c[h>>2]|0;q=m+f|0;if((l|0)!=0&l>>>0<q>>>0){r=m;s=l}else{c[e>>2]=l-q;c[g>>2]=q;if((m|0)>-1){t=(c[k>>2]|0)+m|0}else{t=0}p_(a,t,f,0);c[h>>2]=c[g>>2];XZ(c[a>>2]|0);if((c[(c[a>>2]|0)+16>>2]|0)==0){n=0;o=23;break}r=c[h>>2]|0;s=c[g>>2]|0}m=s-r|0;if(m>>>0<((c[j>>2]|0)+ -262|0)>>>0){continue}if((r|0)>-1){u=(c[k>>2]|0)+r|0}else{u=0}p_(a,u,m,0);c[h>>2]=c[g>>2];XZ(c[a>>2]|0);if((c[(c[a>>2]|0)+16>>2]|0)==0){n=0;o=23;break}}if((o|0)==14){c[a+5812>>2]=0;if((b|0)==4){b=c[h>>2]|0;if((b|0)>-1){v=(c[k>>2]|0)+b|0}else{v=0}p_(a,v,(c[g>>2]|0)-b|0,1);c[h>>2]=c[g>>2];XZ(c[a>>2]|0);n=(c[(c[a>>2]|0)+16>>2]|0)==0?2:3;i=d;return n|0}b=c[g>>2]|0;v=c[h>>2]|0;if((b|0)>(v|0)){if((v|0)>-1){w=(c[k>>2]|0)+v|0}else{w=0}p_(a,w,b-v|0,0);c[h>>2]=c[g>>2];XZ(c[a>>2]|0);if((c[(c[a>>2]|0)+16>>2]|0)==0){n=0;i=d;return n|0}}n=1;i=d;return n|0}else if((o|0)==23){i=d;return n|0}return 0}function ZZ(e,f){e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;g=i;h=e+116|0;j=(f|0)==0;k=e+72|0;l=e+88|0;m=e+108|0;n=e+56|0;o=e+84|0;p=e+68|0;q=e+52|0;r=e+64|0;s=e+44|0;t=e+96|0;u=e+112|0;v=e+5792|0;w=e+5796|0;x=e+5784|0;y=e+5788|0;z=e+128|0;A=e+92|0;while(1){if((c[h>>2]|0)>>>0<262){TZ(e);B=c[h>>2]|0;if(B>>>0<262&j){C=0;D=32;break}if((B|0)==0){D=23;break}if(!(B>>>0>2)){D=9}else{D=6}}else{D=6}if((D|0)==6){D=0;B=c[m>>2]|0;E=((d[(c[n>>2]|0)+(B+2)>>0]|0)^c[k>>2]<<c[l>>2])&c[o>>2];c[k>>2]=E;F=b[(c[p>>2]|0)+(E<<1)>>1]|0;b[(c[r>>2]|0)+((c[q>>2]&B)<<1)>>1]=F;B=F&65535;b[(c[p>>2]|0)+(c[k>>2]<<1)>>1]=c[m>>2];if(!(F<<16>>16==0)?!(((c[m>>2]|0)-B|0)>>>0>((c[s>>2]|0)+ -262|0)>>>0):0){F=$Z(e,B)|0;c[t>>2]=F;G=F}else{D=9}}if((D|0)==9){D=0;G=c[t>>2]|0}do{if(G>>>0>2){F=G+253|0;B=(c[m>>2]|0)-(c[u>>2]|0)|0;b[(c[w>>2]|0)+(c[v>>2]<<1)>>1]=B;E=c[v>>2]|0;c[v>>2]=E+1;a[(c[x>>2]|0)+E>>0]=F;E=e+((d[701152+(F&255)>>0]|0|256)+1<<2)+148|0;b[E>>1]=(b[E>>1]|0)+1<<16>>16;E=B+65535&65535;if(E>>>0<256){H=E}else{H=(E>>>7)+256|0}E=e+((d[700640+H>>0]|0)<<2)+2440|0;b[E>>1]=(b[E>>1]|0)+1<<16>>16;E=(c[v>>2]|0)==((c[y>>2]|0)+ -1|0)&1;B=c[t>>2]|0;F=(c[h>>2]|0)-B|0;c[h>>2]=F;if(!(F>>>0>2?B>>>0<=(c[z>>2]|0)>>>0:0)){F=(c[m>>2]|0)+B|0;c[m>>2]=F;c[t>>2]=0;I=c[n>>2]|0;J=d[I+F>>0]|0;c[k>>2]=J;c[k>>2]=((d[I+(F+1)>>0]|0)^J<<c[l>>2])&c[o>>2];K=F;L=E;break}c[t>>2]=B+ -1;do{B=c[m>>2]|0;F=B+1|0;c[m>>2]=F;J=((d[(c[n>>2]|0)+(B+3)>>0]|0)^c[k>>2]<<c[l>>2])&c[o>>2];c[k>>2]=J;b[(c[r>>2]|0)+((c[q>>2]&F)<<1)>>1]=b[(c[p>>2]|0)+(J<<1)>>1]|0;b[(c[p>>2]|0)+(c[k>>2]<<1)>>1]=c[m>>2];J=(c[t>>2]|0)+ -1|0;c[t>>2]=J}while((J|0)!=0);J=(c[m>>2]|0)+1|0;c[m>>2]=J;K=J;L=E}else{J=a[(c[n>>2]|0)+(c[m>>2]|0)>>0]|0;b[(c[w>>2]|0)+(c[v>>2]<<1)>>1]=0;F=c[v>>2]|0;c[v>>2]=F+1;a[(c[x>>2]|0)+F>>0]=J;F=e+((J&255)<<2)+148|0;b[F>>1]=(b[F>>1]|0)+1<<16>>16;F=(c[v>>2]|0)==((c[y>>2]|0)+ -1|0)&1;c[h>>2]=(c[h>>2]|0)+ -1;J=(c[m>>2]|0)+1|0;c[m>>2]=J;K=J;L=F}}while(0);if((L|0)==0){continue}F=c[A>>2]|0;if((F|0)>-1){M=(c[n>>2]|0)+F|0}else{M=0}p_(e,M,K-F|0,0);c[A>>2]=c[m>>2];XZ(c[e>>2]|0);if((c[(c[e>>2]|0)+16>>2]|0)==0){C=0;D=32;break}}if((D|0)==23){K=c[m>>2]|0;c[e+5812>>2]=K>>>0<2?K:2;if((f|0)==4){f=c[A>>2]|0;if((f|0)>-1){N=(c[n>>2]|0)+f|0}else{N=0}p_(e,N,K-f|0,1);c[A>>2]=c[m>>2];XZ(c[e>>2]|0);C=(c[(c[e>>2]|0)+16>>2]|0)==0?2:3;i=g;return C|0}if((c[v>>2]|0)!=0){v=c[A>>2]|0;if((v|0)>-1){O=(c[n>>2]|0)+v|0}else{O=0}p_(e,O,K-v|0,0);c[A>>2]=c[m>>2];XZ(c[e>>2]|0);if((c[(c[e>>2]|0)+16>>2]|0)==0){C=0;i=g;return C|0}}C=1;i=g;return C|0}else if((D|0)==32){i=g;return C|0}return 0}function _Z(e,f){e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0;g=i;h=e+116|0;j=(f|0)==0;k=e+72|0;l=e+88|0;m=e+108|0;n=e+56|0;o=e+84|0;p=e+68|0;q=e+52|0;r=e+64|0;s=e+96|0;t=e+120|0;u=e+112|0;v=e+100|0;w=e+5792|0;x=e+5796|0;y=e+5784|0;z=e+5788|0;A=e+104|0;B=e+92|0;C=e+128|0;D=e+44|0;E=e+136|0;a:while(1){F=c[h>>2]|0;while(1){if(F>>>0<262){TZ(e);G=c[h>>2]|0;if(G>>>0<262&j){H=0;I=46;break a}if((G|0)==0){I=35;break a}if(!(G>>>0>2)){c[t>>2]=c[s>>2];c[v>>2]=c[u>>2];c[s>>2]=2;J=2;I=16}else{I=8}}else{I=8}do{if((I|0)==8){I=0;G=c[m>>2]|0;K=((d[(c[n>>2]|0)+(G+2)>>0]|0)^c[k>>2]<<c[l>>2])&c[o>>2];c[k>>2]=K;L=b[(c[p>>2]|0)+(K<<1)>>1]|0;b[(c[r>>2]|0)+((c[q>>2]&G)<<1)>>1]=L;G=L&65535;b[(c[p>>2]|0)+(c[k>>2]<<1)>>1]=c[m>>2];K=c[s>>2]|0;c[t>>2]=K;c[v>>2]=c[u>>2];c[s>>2]=2;if(!(L<<16>>16==0)){if(K>>>0<(c[C>>2]|0)>>>0){if(!(((c[m>>2]|0)-G|0)>>>0>((c[D>>2]|0)+ -262|0)>>>0)){L=$Z(e,G)|0;c[s>>2]=L;if(L>>>0<6){if((c[E>>2]|0)!=1){if((L|0)!=3){J=L;I=16;break}if(!(((c[m>>2]|0)-(c[u>>2]|0)|0)>>>0>4096)){J=3;I=16;break}}c[s>>2]=2;J=2;I=16}else{J=L;I=16}}else{J=2;I=16}}else{M=K;N=2}}else{J=2;I=16}}}while(0);if((I|0)==16){I=0;M=c[t>>2]|0;N=J}if(!(M>>>0<3|N>>>0>M>>>0)){break}if((c[A>>2]|0)==0){c[A>>2]=1;c[m>>2]=(c[m>>2]|0)+1;K=(c[h>>2]|0)+ -1|0;c[h>>2]=K;F=K;continue}K=a[(c[n>>2]|0)+((c[m>>2]|0)+ -1)>>0]|0;b[(c[x>>2]|0)+(c[w>>2]<<1)>>1]=0;L=c[w>>2]|0;c[w>>2]=L+1;a[(c[y>>2]|0)+L>>0]=K;L=e+((K&255)<<2)+148|0;b[L>>1]=(b[L>>1]|0)+1<<16>>16;if((c[w>>2]|0)==((c[z>>2]|0)+ -1|0)){L=c[B>>2]|0;if((L|0)>-1){O=(c[n>>2]|0)+L|0}else{O=0}p_(e,O,(c[m>>2]|0)-L|0,0);c[B>>2]=c[m>>2];XZ(c[e>>2]|0)}c[m>>2]=(c[m>>2]|0)+1;F=(c[h>>2]|0)+ -1|0;c[h>>2]=F;if((c[(c[e>>2]|0)+16>>2]|0)==0){H=0;I=46;break a}}F=c[m>>2]|0;L=F+ -3+(c[h>>2]|0)|0;K=M+253|0;G=F+65535-(c[v>>2]|0)|0;b[(c[x>>2]|0)+(c[w>>2]<<1)>>1]=G;F=c[w>>2]|0;c[w>>2]=F+1;a[(c[y>>2]|0)+F>>0]=K;F=e+((d[701152+(K&255)>>0]|0|256)+1<<2)+148|0;b[F>>1]=(b[F>>1]|0)+1<<16>>16;F=G+65535&65535;if(F>>>0<256){P=F}else{P=(F>>>7)+256|0}F=e+((d[700640+P>>0]|0)<<2)+2440|0;b[F>>1]=(b[F>>1]|0)+1<<16>>16;F=c[w>>2]|0;G=(c[z>>2]|0)+ -1|0;K=c[t>>2]|0;c[h>>2]=1-K+(c[h>>2]|0);Q=K+ -2|0;c[t>>2]=Q;K=Q;do{Q=c[m>>2]|0;R=Q+1|0;c[m>>2]=R;if(R>>>0>L>>>0){S=K}else{T=((d[(c[n>>2]|0)+(Q+3)>>0]|0)^c[k>>2]<<c[l>>2])&c[o>>2];c[k>>2]=T;b[(c[r>>2]|0)+((c[q>>2]&R)<<1)>>1]=b[(c[p>>2]|0)+(T<<1)>>1]|0;b[(c[p>>2]|0)+(c[k>>2]<<1)>>1]=c[m>>2];S=c[t>>2]|0}K=S+ -1|0;c[t>>2]=K}while((K|0)!=0);c[A>>2]=0;c[s>>2]=2;K=(c[m>>2]|0)+1|0;c[m>>2]=K;if((F|0)!=(G|0)){continue}L=c[B>>2]|0;if((L|0)>-1){U=(c[n>>2]|0)+L|0}else{U=0}p_(e,U,K-L|0,0);c[B>>2]=c[m>>2];XZ(c[e>>2]|0);if((c[(c[e>>2]|0)+16>>2]|0)==0){H=0;I=46;break}}if((I|0)==35){if((c[A>>2]|0)!=0){U=a[(c[n>>2]|0)+((c[m>>2]|0)+ -1)>>0]|0;b[(c[x>>2]|0)+(c[w>>2]<<1)>>1]=0;x=c[w>>2]|0;c[w>>2]=x+1;a[(c[y>>2]|0)+x>>0]=U;x=e+((U&255)<<2)+148|0;b[x>>1]=(b[x>>1]|0)+1<<16>>16;c[A>>2]=0}A=c[m>>2]|0;c[e+5812>>2]=A>>>0<2?A:2;if((f|0)==4){f=c[B>>2]|0;if((f|0)>-1){V=(c[n>>2]|0)+f|0}else{V=0}p_(e,V,A-f|0,1);c[B>>2]=c[m>>2];XZ(c[e>>2]|0);H=(c[(c[e>>2]|0)+16>>2]|0)==0?2:3;i=g;return H|0}if((c[w>>2]|0)!=0){w=c[B>>2]|0;if((w|0)>-1){W=(c[n>>2]|0)+w|0}else{W=0}p_(e,W,A-w|0,0);c[B>>2]=c[m>>2];XZ(c[e>>2]|0);if((c[(c[e>>2]|0)+16>>2]|0)==0){H=0;i=g;return H|0}}H=1;i=g;return H|0}else if((I|0)==46){i=g;return H|0}return 0}function $Z(b,d){b=b|0;d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;f=i;g=c[b+124>>2]|0;h=c[b+56>>2]|0;j=c[b+108>>2]|0;k=h+j|0;l=c[b+120>>2]|0;m=c[b+144>>2]|0;n=(c[b+44>>2]|0)+ -262|0;o=j>>>0>n>>>0?j-n|0:0;n=c[b+64>>2]|0;p=c[b+52>>2]|0;q=h+(j+258)|0;r=c[b+116>>2]|0;s=m>>>0>r>>>0?r:m;m=b+112|0;t=h+(j+1)|0;u=h+(j+2)|0;v=q;w=j+257|0;x=d;d=l;y=l>>>0<(c[b+140>>2]|0)>>>0?g:g>>>2;g=a[h+(l+j)>>0]|0;b=a[h+(j+ -1+l)>>0]|0;while(1){l=h+x|0;if((((a[h+(x+d)>>0]|0)==g<<24>>24?(a[h+(d+ -1+x)>>0]|0)==b<<24>>24:0)?(a[l>>0]|0)==(a[k>>0]|0):0)?(a[h+(x+1)>>0]|0)==(a[t>>0]|0):0){l=h+(x+2)|0;z=u;while(1){A=z+1|0;if((a[A>>0]|0)!=(a[l+1>>0]|0)){B=A;break}A=z+2|0;if((a[A>>0]|0)!=(a[l+2>>0]|0)){B=A;break}A=z+3|0;if((a[A>>0]|0)!=(a[l+3>>0]|0)){B=A;break}A=z+4|0;if((a[A>>0]|0)!=(a[l+4>>0]|0)){B=A;break}A=z+5|0;if((a[A>>0]|0)!=(a[l+5>>0]|0)){B=A;break}A=z+6|0;if((a[A>>0]|0)!=(a[l+6>>0]|0)){B=A;break}A=z+7|0;if((a[A>>0]|0)!=(a[l+7>>0]|0)){B=A;break}A=z+8|0;l=l+8|0;if(!(A>>>0<q>>>0?(a[A>>0]|0)==(a[l>>0]|0):0)){B=A;break}else{z=A}}z=B-v|0;l=z+258|0;if((l|0)>(d|0)){c[m>>2]=x;if((l|0)>=(s|0)){C=l;D=20;break}E=l;F=a[h+(l+j)>>0]|0;G=a[h+(w+z)>>0]|0}else{E=d;F=g;G=b}}else{E=d;F=g;G=b}x=e[n+((x&p)<<1)>>1]|0;if(!(x>>>0>o>>>0)){C=E;D=20;break}y=y+ -1|0;if((y|0)==0){C=E;D=20;break}else{d=E;g=F;b=G}}if((D|0)==20){i=f;return(C>>>0>r>>>0?r:C)|0}return 0}function a_(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((a|0)==0){d=-2;i=b;return d|0}e=c[a+28>>2]|0;if((e|0)==0){d=-2;i=b;return d|0}c[e+28>>2]=0;c[a+20>>2]=0;c[a+8>>2]=0;c[a+24>>2]=0;f=c[e+8>>2]|0;if((f|0)!=0){c[a+48>>2]=f&1}c[e>>2]=0;c[e+4>>2]=0;c[e+12>>2]=0;c[e+20>>2]=32768;c[e+32>>2]=0;c[e+56>>2]=0;c[e+60>>2]=0;f=e+1328|0;c[e+108>>2]=f;c[e+80>>2]=f;c[e+76>>2]=f;c[e+7104>>2]=1;c[e+7108>>2]=-1;d=0;i=b;return d|0}function b_(a){a=a|0;var b=0,d=0,e=0;b=i;if((a|0)!=0?(d=c[a+28>>2]|0,(d|0)!=0):0){c[d+40>>2]=0;c[d+44>>2]=0;c[d+48>>2]=0;e=a_(a)|0}else{e=-2}i=b;return e|0}function c_(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;if((a|0)==0){d=-2;i=b;return d|0}e=c[a+28>>2]|0;if((e|0)==0){d=-2;i=b;return d|0}f=e+52|0;g=c[f>>2]|0;h=e+36|0;if((g|0)!=0?(c[h>>2]|0)!=15:0){Ic[c[a+36>>2]&511](c[a+40>>2]|0,g);c[f>>2]=0}c[e+8>>2]=1;c[h>>2]=15;d=b_(a)|0;i=b;return d|0}function d_(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;if((a|0)==0){i=b;return}c[a+24>>2]=0;d=a+32|0;e=c[d>>2]|0;if((e|0)==0){c[d>>2]=206;c[a+40>>2]=0;f=206}else{f=e}e=a+36|0;if((c[e>>2]|0)==0){c[e>>2]=319}d=a+40|0;g=Qc[f&255](c[d>>2]|0,1,7116)|0;if((g|0)==0){i=b;return}f=a+28|0;c[f>>2]=g;c[g+52>>2]=0;if((c_(a)|0)==0){i=b;return}Ic[c[e>>2]&511](c[d>>2]|0,g);c[f>>2]=0;i=b;return}function e_(a){a=a|0;var b=0;b=i;d_(a);i=b;return}function f_(f){f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Oc=0,Pc=0,Qc=0,Rc=0,Sc=0,Tc=0,Uc=0,Vc=0,Wc=0,Xc=0,Yc=0,Zc=0,_c=0,$c=0,ad=0,bd=0,cd=0,dd=0,ed=0,fd=0,gd=0,hd=0,id=0,jd=0,kd=0,ld=0,md=0,nd=0,od=0,pd=0,qd=0,rd=0,sd=0,td=0,ud=0,vd=0,wd=0,xd=0,yd=0,zd=0,Ad=0,Bd=0,Cd=0,Dd=0,Ed=0,Fd=0,Gd=0,Hd=0,Id=0,Jd=0,Kd=0,Ld=0,Md=0,Nd=0,Od=0,Pd=0,Qd=0,Rd=0,Sd=0,Td=0,Ud=0,Vd=0,Wd=0,Xd=0,Yd=0,Zd=0,_d=0,$d=0,ae=0,be=0,ce=0,de=0,ee=0,fe=0,ge=0,he=0,ie=0,je=0,ke=0,le=0,me=0,ne=0,oe=0,pe=0,qe=0,re=0,se=0,te=0,ue=0,ve=0,we=0,xe=0,ye=0,ze=0;g=i;if((f|0)==0){h=-2;i=g;return h|0}j=c[f+28>>2]|0;if((j|0)==0){h=-2;i=g;return h|0}k=f+12|0;l=c[k>>2]|0;if((l|0)==0){h=-2;i=g;return h|0}m=c[f>>2]|0;if((m|0)==0?(c[f+4>>2]|0)!=0:0){h=-2;i=g;return h|0}n=c[j>>2]|0;if((n|0)==11){c[j>>2]=12;o=12;p=c[f>>2]|0;q=c[k>>2]|0}else{o=n;p=m;q=l}l=f+16|0;m=c[l>>2]|0;n=f+4|0;r=c[n>>2]|0;s=j+56|0;t=j+60|0;u=j+8|0;v=j+36|0;w=j+20|0;x=j+24|0;y=f+48|0;z=f+24|0;A=j+12|0;B=j+4|0;C=j+76|0;D=j+84|0;E=j+80|0;F=j+88|0;G=j+64|0;H=j+7108|0;I=j+72|0;J=j+7112|0;K=j+68|0;L=j+44|0;M=j+7104|0;N=j+48|0;O=j+52|0;P=j+40|0;Q=f+20|0;R=j+28|0;S=j+96|0;T=j+100|0;U=j+92|0;V=j+104|0;W=j+108|0;X=j+112|0;Y=j+752|0;Z=j+624|0;_=j+1328|0;$=o;o=c[t>>2]|0;aa=r;ba=c[s>>2]|0;ca=m;da=p;p=m;m=q;q=0;a:while(1){b:do{switch($|0){case 12:case 11:{ea=o;fa=aa;ga=ba;ha=da;ia=35;break};case 10:{ja=o;ka=aa;la=ba;ma=da;ia=32;break};case 9:{if(o>>>0<32){na=o;oa=aa;pa=ba;qa=da;while(1){if((oa|0)==0){ra=na;sa=0;ta=pa;ua=ca;va=qa;wa=p;xa=q;break a}ya=oa+ -1|0;za=qa+1|0;Aa=(d[qa>>0]<<na)+pa|0;na=na+8|0;if(!(na>>>0<32)){Ba=ya;Ca=Aa;Da=za;break}else{oa=ya;pa=Aa;qa=za}}}else{Ba=aa;Ca=ba;Da=da}qa=e3a(Ca|0)|0;c[x>>2]=qa;c[y>>2]=qa;c[j>>2]=10;ja=0;ka=Ba;la=0;ma=Da;ia=32;break};case 18:{Ea=c[V>>2]|0;Fa=o;Ga=aa;Ha=ba;Ia=da;Ja=q;ia=72;break};case 21:{Ka=c[I>>2]|0;La=o;Ma=aa;Na=ba;Oa=da;Pa=q;ia=126;break};case 19:{Qa=o;Ra=aa;Sa=ba;Ta=da;Ua=q;ia=106;break};case 20:{Va=o;Wa=aa;Xa=ba;Ya=da;Za=q;ia=107;break};case 14:{_a=o;$a=aa;ab=ba;bb=da;ia=52;break};case 15:{cb=o;db=aa;eb=ba;fb=da;ia=53;break};case 23:{gb=c[I>>2]|0;hb=o;ib=aa;jb=ba;kb=da;lb=q;ia=145;break};case 16:{if(o>>>0<14){qa=o;pa=aa;oa=ba;na=da;while(1){if((pa|0)==0){ra=qa;sa=0;ta=oa;ua=ca;va=na;wa=p;xa=q;break a}za=pa+ -1|0;Aa=na+1|0;ya=(d[na>>0]<<qa)+oa|0;mb=qa+8|0;if(mb>>>0<14){qa=mb;pa=za;oa=ya;na=Aa}else{nb=mb;ob=za;pb=ya;qb=Aa;break}}}else{nb=o;ob=aa;pb=ba;qb=da}na=(pb&31)+257|0;c[S>>2]=na;oa=(pb>>>5&31)+1|0;c[T>>2]=oa;c[U>>2]=(pb>>>10&15)+4;pa=pb>>>14;qa=nb+ -14|0;if(na>>>0>286|oa>>>0>30){c[z>>2]=697984;c[j>>2]=29;rb=qa;sb=ob;tb=pa;ub=ca;vb=qb;wb=p;xb=m;yb=q;break b}else{c[V>>2]=0;c[j>>2]=17;zb=0;Ab=qa;Bb=ob;Cb=pa;Db=qb;ia=63;break b}break};case 22:{Eb=o;Fb=aa;Gb=ba;Hb=da;Ib=q;ia=133;break};case 24:{Jb=o;Kb=aa;Lb=ba;Mb=da;Nb=q;ia=151;break};case 17:{pa=c[V>>2]|0;if(pa>>>0<(c[U>>2]|0)>>>0){zb=pa;Ab=o;Bb=aa;Cb=ba;Db=da;ia=63}else{Ob=pa;Pb=o;Qb=aa;Rb=ba;Sb=da;ia=67}break};case 0:{if((c[u>>2]|0)==0){c[j>>2]=12;rb=o;sb=aa;tb=ba;ub=ca;vb=da;wb=p;xb=m;yb=q;break b}if(o>>>0<16){pa=o;qa=aa;oa=ba;na=da;while(1){if((qa|0)==0){ra=pa;sa=0;ta=oa;ua=ca;va=na;wa=p;xa=q;break a}Aa=qa+ -1|0;ya=na+1|0;za=(d[na>>0]<<pa)+oa|0;mb=pa+8|0;if(mb>>>0<16){pa=mb;qa=Aa;oa=za;na=ya}else{Tb=mb;Ub=Aa;Vb=za;Wb=ya;break}}}else{Tb=o;Ub=aa;Vb=ba;Wb=da}if(((((Vb<<8&65280)+(Vb>>>8)|0)>>>0)%31|0|0)!=0){c[z>>2]=697848;c[j>>2]=29;rb=Tb;sb=Ub;tb=Vb;ub=ca;vb=Wb;wb=p;xb=m;yb=q;break b}if((Vb&15|0)!=8){c[z>>2]=697872;c[j>>2]=29;rb=Tb;sb=Ub;tb=Vb;ub=ca;vb=Wb;wb=p;xb=m;yb=q;break b}na=Vb>>>4;oa=Tb+ -4|0;qa=(na&15)+8|0;pa=c[v>>2]|0;if((pa|0)!=0){if(qa>>>0>pa>>>0){c[z>>2]=697904;c[j>>2]=29;rb=oa;sb=Ub;tb=na;ub=ca;vb=Wb;wb=p;xb=m;yb=q;break b}}else{c[v>>2]=qa}c[w>>2]=1<<qa;qa=jda(0,0,0)|0;c[x>>2]=qa;c[y>>2]=qa;c[j>>2]=Vb>>>12&2^11;rb=0;sb=Ub;tb=0;ub=ca;vb=Wb;wb=p;xb=m;yb=q;break};case 13:{qa=o&7;na=ba>>>qa;oa=o-qa|0;if(oa>>>0<32){qa=oa;pa=aa;ya=na;za=da;while(1){if((pa|0)==0){ra=qa;sa=0;ta=ya;ua=ca;va=za;wa=p;xa=q;break a}Aa=pa+ -1|0;mb=za+1|0;Xb=(d[za>>0]<<qa)+ya|0;Yb=qa+8|0;if(Yb>>>0<32){qa=Yb;pa=Aa;ya=Xb;za=mb}else{Zb=Yb;_b=Aa;$b=Xb;ac=mb;break}}}else{Zb=oa;_b=aa;$b=na;ac=da}za=$b&65535;if((za|0)==($b>>>16^65535|0)){c[G>>2]=za;c[j>>2]=14;_a=0;$a=_b;ab=0;bb=ac;ia=52;break b}else{c[z>>2]=697952;c[j>>2]=29;rb=Zb;sb=_b;tb=$b;ub=ca;vb=ac;wb=p;xb=m;yb=q;break b}break};case 25:{if((ca|0)==0){ra=o;sa=aa;ta=ba;ua=0;va=da;wa=p;xa=q;break a}a[m>>0]=c[G>>2];c[j>>2]=20;rb=o;sb=aa;tb=ba;ub=ca+ -1|0;vb=da;wb=p;xb=m+1|0;yb=q;break};case 26:{if((c[u>>2]|0)==0){bc=o;cc=aa;dc=ba;ec=da;fc=p;ia=176;break a}if(o>>>0<32){za=o;ya=aa;pa=ba;qa=da;while(1){if((ya|0)==0){ra=za;sa=0;ta=pa;ua=ca;va=qa;wa=p;xa=q;break a}mb=ya+ -1|0;Xb=qa+1|0;Aa=(d[qa>>0]<<za)+pa|0;Yb=za+8|0;if(Yb>>>0<32){za=Yb;ya=mb;pa=Aa;qa=Xb}else{gc=Yb;hc=mb;ic=Aa;jc=Xb;break}}}else{gc=o;hc=aa;ic=ba;jc=da}qa=p-ca|0;c[Q>>2]=(c[Q>>2]|0)+qa;c[R>>2]=(c[R>>2]|0)+qa;if((p|0)!=(ca|0)){pa=jda(c[x>>2]|0,m+(0-qa)|0,qa)|0;c[x>>2]=pa;c[y>>2]=pa}pa=e3a(ic|0)|0;if((pa|0)==(c[x>>2]|0)){bc=0;cc=hc;dc=0;ec=jc;fc=ca;ia=176;break a}c[z>>2]=698184;c[j>>2]=29;rb=gc;sb=hc;tb=ic;ub=ca;vb=jc;wb=ca;xb=m;yb=q;break};case 29:{ia=177;break a;break};case 28:{ra=o;sa=aa;ta=ba;ua=ca;va=da;wa=p;xa=1;break a;break};case 30:{h=-4;ia=190;break a;break};default:{ia=189;break a}}}while(0);if((ia|0)==32){ia=0;if((c[A>>2]|0)==0){ia=33;break}pa=jda(0,0,0)|0;c[x>>2]=pa;c[y>>2]=pa;c[j>>2]=11;ea=ja;fa=ka;ga=la;ha=ma;ia=35}else if((ia|0)==52){ia=0;c[j>>2]=15;cb=_a;db=$a;eb=ab;fb=bb;ia=53}else if((ia|0)==63){while(1){ia=0;if(Ab>>>0<3){pa=Ab;qa=Bb;ya=Cb;za=Db;while(1){if((qa|0)==0){ra=pa;sa=0;ta=ya;ua=ca;va=za;wa=p;xa=q;break a}na=qa+ -1|0;oa=za+1|0;Xb=(d[za>>0]<<pa)+ya|0;Aa=pa+8|0;if(Aa>>>0<3){pa=Aa;qa=na;ya=Xb;za=oa}else{kc=Aa;lc=na;mc=Xb;nc=oa;break}}}else{kc=Ab;lc=Bb;mc=Cb;nc=Db}c[V>>2]=zb+1;b[j+(e[697808+(zb<<1)>>1]<<1)+112>>1]=mc&7;za=mc>>>3;ya=kc+ -3|0;qa=c[V>>2]|0;if(qa>>>0<(c[U>>2]|0)>>>0){zb=qa;Ab=ya;Bb=lc;Cb=za;Db=nc;ia=63}else{Ob=qa;Pb=ya;Qb=lc;Rb=za;Sb=nc;ia=67;break}}}do{if((ia|0)==35){ia=0;if((c[B>>2]|0)!=0){za=ea&7;c[j>>2]=26;rb=ea-za|0;sb=fa;tb=ga>>>za;ub=ca;vb=ha;wb=p;xb=m;yb=q;break}if(ea>>>0<3){za=ea;ya=fa;qa=ga;pa=ha;while(1){if((ya|0)==0){ra=za;sa=0;ta=qa;ua=ca;va=pa;wa=p;xa=q;break a}oa=ya+ -1|0;Xb=pa+1|0;na=(d[pa>>0]<<za)+qa|0;Aa=za+8|0;if(Aa>>>0<3){za=Aa;ya=oa;qa=na;pa=Xb}else{oc=Aa;pc=oa;qc=na;rc=Xb;break}}}else{oc=ea;pc=fa;qc=ga;rc=ha}c[B>>2]=qc&1;pa=qc>>>1&3;if((pa|0)==0){c[j>>2]=13}else if((pa|0)==1){c[C>>2]=698208;c[D>>2]=9;c[E>>2]=700256;c[F>>2]=5;c[j>>2]=19}else if((pa|0)==2){c[j>>2]=16}else if((pa|0)==3){c[z>>2]=697928;c[j>>2]=29}rb=oc+ -3|0;sb=pc;tb=qc>>>3;ub=ca;vb=rc;wb=p;xb=m;yb=q}else if((ia|0)==53){ia=0;pa=c[G>>2]|0;if((pa|0)==0){c[j>>2]=11;rb=cb;sb=db;tb=eb;ub=ca;vb=fb;wb=p;xb=m;yb=q;break}qa=pa>>>0>db>>>0?db:pa;pa=qa>>>0>ca>>>0?ca:qa;if((pa|0)==0){ra=cb;sa=db;ta=eb;ua=ca;va=fb;wa=p;xa=q;break a}c3a(m|0,fb|0,pa|0)|0;c[G>>2]=(c[G>>2]|0)-pa;rb=cb;sb=db-pa|0;tb=eb;ub=ca-pa|0;vb=fb+pa|0;wb=p;xb=m+pa|0;yb=q}else if((ia|0)==67){ia=0;if(Ob>>>0<19){pa=Ob;do{c[V>>2]=pa+1;b[j+(e[697808+(pa<<1)>>1]<<1)+112>>1]=0;pa=c[V>>2]|0}while(pa>>>0<19)}c[W>>2]=_;c[C>>2]=_;c[D>>2]=7;pa=i_(0,X,19,W,D,Y)|0;if((pa|0)==0){c[V>>2]=0;c[j>>2]=18;Ea=0;Fa=Pb;Ga=Qb;Ha=Rb;Ia=Sb;Ja=0;ia=72;break}else{c[z>>2]=698024;c[j>>2]=29;rb=Pb;sb=Qb;tb=Rb;ub=ca;vb=Sb;wb=p;xb=m;yb=pa;break}}}while(0);c:do{if((ia|0)==72){ia=0;pa=c[S>>2]|0;qa=c[T>>2]|0;do{if(Ea>>>0<(qa+pa|0)>>>0){ya=Ea;za=pa;Xb=qa;na=Fa;oa=Ga;Aa=Ha;mb=Ia;d:while(1){Yb=(1<<c[D>>2])+ -1|0;sc=Yb&Aa;tc=c[C>>2]|0;uc=d[tc+(sc<<2)+1>>0]|0;if(uc>>>0>na>>>0){vc=na;wc=oa;xc=Aa;yc=mb;while(1){if((wc|0)==0){ra=vc;sa=0;ta=xc;ua=ca;va=yc;wa=p;xa=Ja;break a}zc=wc+ -1|0;Ac=yc+1|0;Bc=(d[yc>>0]<<vc)+xc|0;Cc=vc+8|0;Dc=Yb&Bc;Ec=d[tc+(Dc<<2)+1>>0]|0;if(Ec>>>0>Cc>>>0){vc=Cc;wc=zc;xc=Bc;yc=Ac}else{Fc=Ec;Gc=Dc;Hc=Cc;Ic=zc;Jc=Bc;Kc=Ac;break}}}else{Fc=uc;Gc=sc;Hc=na;Ic=oa;Jc=Aa;Kc=mb}yc=b[tc+(Gc<<2)+2>>1]|0;e:do{if((yc&65535)<16){c[V>>2]=ya+1;b[j+(ya<<1)+112>>1]=yc;Lc=Hc-Fc|0;Mc=Ic;Nc=Jc>>>Fc;Oc=Kc}else{if(yc<<16>>16==16){xc=Fc+2|0;if(Hc>>>0<xc>>>0){wc=Hc;vc=Ic;Yb=Jc;Ac=Kc;while(1){if((vc|0)==0){ra=wc;sa=0;ta=Yb;ua=ca;va=Ac;wa=p;xa=Ja;break a}Bc=vc+ -1|0;zc=Ac+1|0;Cc=(d[Ac>>0]<<wc)+Yb|0;Dc=wc+8|0;if(Dc>>>0<xc>>>0){wc=Dc;vc=Bc;Yb=Cc;Ac=zc}else{Pc=Dc;Qc=Bc;Rc=Cc;Sc=zc;break}}}else{Pc=Hc;Qc=Ic;Rc=Jc;Sc=Kc}Tc=Rc>>>Fc;Uc=Pc-Fc|0;if((ya|0)==0){ia=86;break d}Vc=Uc+ -2|0;Wc=(Tc&3)+3|0;Xc=Qc;Yc=Tc>>>2;Zc=b[j+(ya+ -1<<1)+112>>1]|0;_c=Sc}else if(yc<<16>>16==17){Ac=Fc+3|0;if(Hc>>>0<Ac>>>0){Yb=Hc;vc=Ic;wc=Jc;xc=Kc;while(1){if((vc|0)==0){ra=Yb;sa=0;ta=wc;ua=ca;va=xc;wa=p;xa=Ja;break a}zc=vc+ -1|0;Cc=xc+1|0;Bc=(d[xc>>0]<<Yb)+wc|0;Dc=Yb+8|0;if(Dc>>>0<Ac>>>0){Yb=Dc;vc=zc;wc=Bc;xc=Cc}else{$c=Dc;ad=zc;bd=Bc;cd=Cc;break}}}else{$c=Hc;ad=Ic;bd=Jc;cd=Kc}xc=bd>>>Fc;Vc=-3-Fc+$c|0;Wc=(xc&7)+3|0;Xc=ad;Yc=xc>>>3;Zc=0;_c=cd}else{xc=Fc+7|0;if(Hc>>>0<xc>>>0){wc=Hc;vc=Ic;Yb=Jc;Ac=Kc;while(1){if((vc|0)==0){ra=wc;sa=0;ta=Yb;ua=ca;va=Ac;wa=p;xa=Ja;break a}Cc=vc+ -1|0;Bc=Ac+1|0;zc=(d[Ac>>0]<<wc)+Yb|0;Dc=wc+8|0;if(Dc>>>0<xc>>>0){wc=Dc;vc=Cc;Yb=zc;Ac=Bc}else{dd=Dc;ed=Cc;fd=zc;gd=Bc;break}}}else{dd=Hc;ed=Ic;fd=Jc;gd=Kc}Ac=fd>>>Fc;Vc=-7-Fc+dd|0;Wc=(Ac&127)+11|0;Xc=ed;Yc=Ac>>>7;Zc=0;_c=gd}if((ya+Wc|0)>>>0>(Xb+za|0)>>>0){ia=95;break d}else{hd=ya;id=Wc}while(1){Ac=id+ -1|0;c[V>>2]=hd+1;b[j+(hd<<1)+112>>1]=Zc;if((Ac|0)==0){Lc=Vc;Mc=Xc;Nc=Yc;Oc=_c;break e}hd=c[V>>2]|0;id=Ac}}}while(0);ya=c[V>>2]|0;za=c[S>>2]|0;Xb=c[T>>2]|0;if(!(ya>>>0<(Xb+za|0)>>>0)){ia=98;break}else{na=Lc;oa=Mc;Aa=Nc;mb=Oc}}if((ia|0)==86){ia=0;c[z>>2]=698056;c[j>>2]=29;rb=Uc;sb=Qc;tb=Tc;ub=ca;vb=Sc;wb=p;xb=m;yb=Ja;break c}else if((ia|0)==95){ia=0;c[z>>2]=698056;c[j>>2]=29;rb=Vc;sb=Xc;tb=Yc;ub=ca;vb=_c;wb=p;xb=m;yb=Ja;break c}else if((ia|0)==98){ia=0;if((c[j>>2]|0)==29){rb=Lc;sb=Mc;tb=Nc;ub=ca;vb=Oc;wb=p;xb=m;yb=Ja;break c}else{jd=za;kd=Lc;ld=Mc;md=Nc;nd=Oc;break}}}else{jd=pa;kd=Fa;ld=Ga;md=Ha;nd=Ia}}while(0);if((b[Z>>1]|0)==0){c[z>>2]=698088;c[j>>2]=29;rb=kd;sb=ld;tb=md;ub=ca;vb=nd;wb=p;xb=m;yb=Ja;break}c[W>>2]=_;c[C>>2]=_;c[D>>2]=9;pa=i_(1,X,jd,W,D,Y)|0;if((pa|0)!=0){c[z>>2]=698128;c[j>>2]=29;rb=kd;sb=ld;tb=md;ub=ca;vb=nd;wb=p;xb=m;yb=pa;break}c[E>>2]=c[W>>2];c[F>>2]=6;pa=i_(2,j+(c[S>>2]<<1)+112|0,c[T>>2]|0,W,F,Y)|0;if((pa|0)==0){c[j>>2]=19;Qa=kd;Ra=ld;Sa=md;Ta=nd;Ua=0;ia=106;break}else{c[z>>2]=698160;c[j>>2]=29;rb=kd;sb=ld;tb=md;ub=ca;vb=nd;wb=p;xb=m;yb=pa;break}}}while(0);if((ia|0)==106){ia=0;c[j>>2]=20;Va=Qa;Wa=Ra;Xa=Sa;Ya=Ta;Za=Ua;ia=107}do{if((ia|0)==107){ia=0;if(Wa>>>0>5&ca>>>0>257){c[k>>2]=m;c[l>>2]=ca;c[f>>2]=Ya;c[n>>2]=Wa;c[s>>2]=Xa;c[t>>2]=Va;kda(f,p);pa=c[k>>2]|0;qa=c[l>>2]|0;mb=c[f>>2]|0;Aa=c[n>>2]|0;oa=c[s>>2]|0;na=c[t>>2]|0;if((c[j>>2]|0)!=11){rb=na;sb=Aa;tb=oa;ub=qa;vb=mb;wb=p;xb=pa;yb=Za;break}c[H>>2]=-1;rb=na;sb=Aa;tb=oa;ub=qa;vb=mb;wb=p;xb=pa;yb=Za;break}c[H>>2]=0;pa=(1<<c[D>>2])+ -1|0;mb=pa&Xa;qa=c[C>>2]|0;oa=a[qa+(mb<<2)+1>>0]|0;Aa=oa&255;if(Aa>>>0>Va>>>0){na=Va;Xb=Wa;ya=Xa;yc=Ya;while(1){if((Xb|0)==0){ra=na;sa=0;ta=ya;ua=ca;va=yc;wa=p;xa=Za;break a}tc=Xb+ -1|0;sc=yc+1|0;uc=(d[yc>>0]<<na)+ya|0;Ac=na+8|0;Yb=pa&uc;vc=a[qa+(Yb<<2)+1>>0]|0;wc=vc&255;if(wc>>>0>Ac>>>0){na=Ac;Xb=tc;ya=uc;yc=sc}else{od=vc;pd=wc;qd=Yb;rd=Ac;sd=tc;td=uc;ud=sc;break}}}else{od=oa;pd=Aa;qd=mb;rd=Va;sd=Wa;td=Xa;ud=Ya}yc=a[qa+(qd<<2)>>0]|0;ya=b[qa+(qd<<2)+2>>1]|0;Xb=yc&255;if(!(yc<<24>>24==0)){if((Xb&240|0)==0){na=ya&65535;pa=(1<<pd+Xb)+ -1|0;Xb=((td&pa)>>>pd)+na|0;sc=a[qa+(Xb<<2)+1>>0]|0;if(((sc&255)+pd|0)>>>0>rd>>>0){uc=rd;tc=sd;Ac=td;Yb=ud;while(1){if((tc|0)==0){ra=uc;sa=0;ta=Ac;ua=ca;va=Yb;wa=p;xa=Za;break a}wc=tc+ -1|0;vc=Yb+1|0;xc=(d[Yb>>0]<<uc)+Ac|0;Bc=uc+8|0;zc=((xc&pa)>>>pd)+na|0;Cc=a[qa+(zc<<2)+1>>0]|0;if(((Cc&255)+pd|0)>>>0>Bc>>>0){uc=Bc;tc=wc;Ac=xc;Yb=vc}else{vd=zc;wd=Cc;xd=Bc;yd=wc;zd=xc;Ad=vc;break}}}else{vd=Xb;wd=sc;xd=rd;yd=sd;zd=td;Ad=ud}Yb=b[qa+(vd<<2)+2>>1]|0;Ac=a[qa+(vd<<2)>>0]|0;c[H>>2]=pd;Bd=pd;Cd=xd-pd|0;Dd=yd;Ed=Ac;Fd=wd;Gd=Yb;Hd=zd>>>pd;Id=Ad}else{Bd=0;Cd=rd;Dd=sd;Ed=yc;Fd=od;Gd=ya;Hd=td;Id=ud}}else{Bd=0;Cd=rd;Dd=sd;Ed=0;Fd=od;Gd=ya;Hd=td;Id=ud}Yb=Fd&255;Ac=Hd>>>Yb;tc=Cd-Yb|0;c[H>>2]=Bd+Yb;c[G>>2]=Gd&65535;Yb=Ed&255;if(Ed<<24>>24==0){c[j>>2]=25;rb=tc;sb=Dd;tb=Ac;ub=ca;vb=Id;wb=p;xb=m;yb=Za;break}if((Yb&32|0)!=0){c[H>>2]=-1;c[j>>2]=11;rb=tc;sb=Dd;tb=Ac;ub=ca;vb=Id;wb=p;xb=m;yb=Za;break}if((Yb&64|0)==0){uc=Yb&15;c[I>>2]=uc;c[j>>2]=21;Ka=uc;La=tc;Ma=Dd;Na=Ac;Oa=Id;Pa=Za;ia=126;break}else{c[z>>2]=737256;c[j>>2]=29;rb=tc;sb=Dd;tb=Ac;ub=ca;vb=Id;wb=p;xb=m;yb=Za;break}}}while(0);if((ia|0)==126){ia=0;if((Ka|0)==0){Jd=c[G>>2]|0;Kd=La;Ld=Ma;Md=Na;Nd=Oa}else{if(La>>>0<Ka>>>0){Ac=La;tc=Ma;uc=Na;Yb=Oa;while(1){if((tc|0)==0){ra=Ac;sa=0;ta=uc;ua=ca;va=Yb;wa=p;xa=Pa;break a}na=tc+ -1|0;pa=Yb+1|0;mb=(d[Yb>>0]<<Ac)+uc|0;Aa=Ac+8|0;if(Aa>>>0<Ka>>>0){Ac=Aa;tc=na;uc=mb;Yb=pa}else{Od=Aa;Pd=na;Qd=mb;Rd=pa;break}}}else{Od=La;Pd=Ma;Qd=Na;Rd=Oa}Yb=(c[G>>2]|0)+((1<<Ka)+ -1&Qd)|0;c[G>>2]=Yb;c[H>>2]=(c[H>>2]|0)+Ka;Jd=Yb;Kd=Od-Ka|0;Ld=Pd;Md=Qd>>>Ka;Nd=Rd}c[J>>2]=Jd;c[j>>2]=22;Eb=Kd;Fb=Ld;Gb=Md;Hb=Nd;Ib=Pa;ia=133}do{if((ia|0)==133){ia=0;Yb=(1<<c[F>>2])+ -1|0;uc=Yb&Gb;tc=c[E>>2]|0;Ac=a[tc+(uc<<2)+1>>0]|0;pa=Ac&255;if(pa>>>0>Eb>>>0){mb=Eb;na=Fb;Aa=Gb;oa=Hb;while(1){if((na|0)==0){ra=mb;sa=0;ta=Aa;ua=ca;va=oa;wa=p;xa=Ib;break a}vc=na+ -1|0;xc=oa+1|0;wc=(d[oa>>0]<<mb)+Aa|0;Bc=mb+8|0;Cc=Yb&wc;zc=a[tc+(Cc<<2)+1>>0]|0;Dc=zc&255;if(Dc>>>0>Bc>>>0){mb=Bc;na=vc;Aa=wc;oa=xc}else{Sd=zc;Td=Dc;Ud=Cc;Vd=Bc;Wd=vc;Xd=wc;Yd=xc;break}}}else{Sd=Ac;Td=pa;Ud=uc;Vd=Eb;Wd=Fb;Xd=Gb;Yd=Hb}oa=a[tc+(Ud<<2)>>0]|0;Aa=b[tc+(Ud<<2)+2>>1]|0;na=oa&255;if((na&240|0)==0){mb=Aa&65535;Yb=(1<<Td+na)+ -1|0;na=((Xd&Yb)>>>Td)+mb|0;ya=a[tc+(na<<2)+1>>0]|0;if(((ya&255)+Td|0)>>>0>Vd>>>0){yc=Vd;qa=Wd;sc=Xd;Xb=Yd;while(1){if((qa|0)==0){ra=yc;sa=0;ta=sc;ua=ca;va=Xb;wa=p;xa=Ib;break a}xc=qa+ -1|0;wc=Xb+1|0;vc=(d[Xb>>0]<<yc)+sc|0;Bc=yc+8|0;Cc=((vc&Yb)>>>Td)+mb|0;Dc=a[tc+(Cc<<2)+1>>0]|0;if(((Dc&255)+Td|0)>>>0>Bc>>>0){yc=Bc;qa=xc;sc=vc;Xb=wc}else{Zd=Cc;_d=Dc;$d=Bc;ae=xc;be=vc;ce=wc;break}}}else{Zd=na;_d=ya;$d=Vd;ae=Wd;be=Xd;ce=Yd}Xb=b[tc+(Zd<<2)+2>>1]|0;sc=a[tc+(Zd<<2)>>0]|0;qa=(c[H>>2]|0)+Td|0;c[H>>2]=qa;de=qa;ee=$d-Td|0;fe=ae;ge=sc;he=_d;ie=Xb;je=be>>>Td;ke=ce}else{de=c[H>>2]|0;ee=Vd;fe=Wd;ge=oa;he=Sd;ie=Aa;je=Xd;ke=Yd}Xb=he&255;sc=je>>>Xb;qa=ee-Xb|0;c[H>>2]=de+Xb;Xb=ge&255;if((Xb&64|0)==0){c[K>>2]=ie&65535;yc=Xb&15;c[I>>2]=yc;c[j>>2]=23;gb=yc;hb=qa;ib=fe;jb=sc;kb=ke;lb=Ib;ia=145;break}else{c[z>>2]=737232;c[j>>2]=29;rb=qa;sb=fe;tb=sc;ub=ca;vb=ke;wb=p;xb=m;yb=Ib;break}}}while(0);if((ia|0)==145){ia=0;if((gb|0)==0){le=hb;me=ib;ne=jb;oe=kb}else{if(hb>>>0<gb>>>0){sc=hb;qa=ib;yc=jb;Xb=kb;while(1){if((qa|0)==0){ra=sc;sa=0;ta=yc;ua=ca;va=Xb;wa=p;xa=lb;break a}mb=qa+ -1|0;Yb=Xb+1|0;uc=(d[Xb>>0]<<sc)+yc|0;pa=sc+8|0;if(pa>>>0<gb>>>0){sc=pa;qa=mb;yc=uc;Xb=Yb}else{pe=pa;qe=mb;re=uc;se=Yb;break}}}else{pe=hb;qe=ib;re=jb;se=kb}c[K>>2]=(c[K>>2]|0)+((1<<gb)+ -1&re);c[H>>2]=(c[H>>2]|0)+gb;le=pe-gb|0;me=qe;ne=re>>>gb;oe=se}c[j>>2]=24;Jb=le;Kb=me;Lb=ne;Mb=oe;Nb=lb;ia=151}do{if((ia|0)==151){ia=0;if((ca|0)==0){ra=Jb;sa=Kb;ta=Lb;ua=0;va=Mb;wa=p;xa=Nb;break a}Xb=p-ca|0;yc=c[K>>2]|0;if(yc>>>0>Xb>>>0){qa=yc-Xb|0;if(qa>>>0>(c[L>>2]|0)>>>0?(c[M>>2]|0)!=0:0){c[z>>2]=737200;c[j>>2]=29;rb=Jb;sb=Kb;tb=Lb;ub=ca;vb=Mb;wb=p;xb=m;yb=Nb;break}Xb=c[N>>2]|0;if(qa>>>0>Xb>>>0){sc=qa-Xb|0;te=sc;ue=(c[O>>2]|0)+((c[P>>2]|0)-sc)|0}else{te=qa;ue=(c[O>>2]|0)+(Xb-qa)|0}qa=c[G>>2]|0;ve=qa;we=te>>>0>qa>>>0?qa:te;xe=ue}else{qa=c[G>>2]|0;ve=qa;we=qa;xe=m+(0-yc)|0}yc=we>>>0>ca>>>0?ca:we;c[G>>2]=ve-yc;qa=~ca;Xb=~we;sc=qa>>>0>Xb>>>0?qa:Xb;Xb=yc;qa=xe;Yb=m;while(1){a[Yb>>0]=a[qa>>0]|0;Xb=Xb+ -1|0;if((Xb|0)==0){break}else{qa=qa+1|0;Yb=Yb+1|0}}Yb=ca-yc|0;qa=m+~sc|0;if((c[G>>2]|0)==0){c[j>>2]=20;rb=Jb;sb=Kb;tb=Lb;ub=Yb;vb=Mb;wb=p;xb=qa;yb=Nb}else{rb=Jb;sb=Kb;tb=Lb;ub=Yb;vb=Mb;wb=p;xb=qa;yb=Nb}}}while(0);$=c[j>>2]|0;o=rb;aa=sb;ba=tb;ca=ub;da=vb;p=wb;m=xb;q=yb}if((ia|0)==33){c[k>>2]=m;c[l>>2]=ca;c[f>>2]=ma;c[n>>2]=ka;c[s>>2]=la;c[t>>2]=ja;h=2;i=g;return h|0}else if((ia|0)==176){c[j>>2]=28;ra=bc;sa=cc;ta=dc;ua=ca;va=ec;wa=fc;xa=1}else if((ia|0)==177){ra=o;sa=aa;ta=ba;ua=ca;va=da;wa=p;xa=-3}else if((ia|0)==189){h=-2;i=g;return h|0}else if((ia|0)==190){i=g;return h|0}c[k>>2]=m;c[l>>2]=ua;c[f>>2]=va;c[n>>2]=sa;c[s>>2]=ta;c[t>>2]=ra;ra=c[l>>2]|0;if((c[P>>2]|0)==0){if((wa|0)!=(ra|0)){if((c[j>>2]|0)>>>0<29){ia=181}else{ye=ra}}else{ye=wa}}else{ia=181}do{if((ia|0)==181){if((g_(f,c[k>>2]|0,wa-ra|0)|0)==0){ye=c[l>>2]|0;break}c[j>>2]=30;h=-4;i=g;return h|0}}while(0);l=c[n>>2]|0;n=wa-ye|0;ra=f+8|0;c[ra>>2]=r-l+(c[ra>>2]|0);c[Q>>2]=(c[Q>>2]|0)+n;c[R>>2]=(c[R>>2]|0)+n;R=(wa|0)==(ye|0);if(!((c[u>>2]|0)==0|R)){u=jda(c[x>>2]|0,(c[k>>2]|0)+(0-n)|0,n)|0;c[x>>2]=u;c[y>>2]=u}u=c[j>>2]|0;if((u|0)==19){ze=256}else{ze=(u|0)==14?256:0}c[f+44>>2]=((c[B>>2]|0)!=0?64:0)+(c[t>>2]|0)+((u|0)==11?128:0)+ze;h=(r|0)==(l|0)&R&(xa|0)==0?-5:xa;i=g;return h|0}function g_(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;f=c[a+28>>2]|0;g=f+52|0;h=c[g>>2]|0;if((h|0)==0){j=Qc[c[a+32>>2]&255](c[a+40>>2]|0,1<<c[f+36>>2],1)|0;c[g>>2]=j;if((j|0)==0){k=1;i=e;return k|0}else{l=j}}else{l=h}h=f+40|0;j=c[h>>2]|0;if((j|0)==0){a=1<<c[f+36>>2];c[h>>2]=a;c[f+48>>2]=0;c[f+44>>2]=0;m=a}else{m=j}if(!(m>>>0>d>>>0)){c3a(l|0,b+(0-m)|0,m|0)|0;c[f+48>>2]=0;c[f+44>>2]=c[h>>2];k=0;i=e;return k|0}j=f+48|0;a=c[j>>2]|0;n=m-a|0;m=n>>>0>d>>>0?d:n;c3a(l+a|0,b+(0-d)|0,m|0)|0;a=d-m|0;if((m|0)!=(d|0)){c3a(c[g>>2]|0,b+(0-a)|0,a|0)|0;c[j>>2]=a;c[f+44>>2]=c[h>>2];k=0;i=e;return k|0}a=(c[j>>2]|0)+d|0;b=c[h>>2]|0;c[j>>2]=(a|0)==(b|0)?0:a;a=f+44|0;f=c[a>>2]|0;if(!(f>>>0<b>>>0)){k=0;i=e;return k|0}c[a>>2]=f+d;k=0;i=e;return k|0}function h_(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;if((a|0)==0){i=b;return}d=a+28|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}f=a+36|0;g=c[f>>2]|0;if((g|0)==0){i=b;return}h=c[e+52>>2]|0;j=a+40|0;if((h|0)==0){k=g;l=e}else{Ic[g&511](c[j>>2]|0,h);k=c[f>>2]|0;l=c[d>>2]|0}Ic[k&511](c[j>>2]|0,l);c[d>>2]=0;i=b;return}function i_(d,f,g,h,j,k){d=d|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0;l=i;i=i+64|0;m=l+32|0;n=l;o=m+0|0;p=o+32|0;do{b[o>>1]=0;o=o+2|0}while((o|0)<(p|0));o=(g|0)==0;if(!o){p=0;do{q=m+(e[f+(p<<1)>>1]<<1)|0;b[q>>1]=(b[q>>1]|0)+1<<16>>16;p=p+1|0}while((p|0)!=(g|0))}p=c[j>>2]|0;q=15;while(1){r=q+ -1|0;if((b[m+(q<<1)>>1]|0)!=0){break}if((r|0)==0){s=7;break}else{q=r}}if((s|0)==7){r=c[h>>2]|0;c[h>>2]=r+4;a[r>>0]=64;a[r+1>>0]=1;b[r+2>>1]=0;r=c[h>>2]|0;c[h>>2]=r+4;a[r>>0]=64;a[r+1>>0]=1;b[r+2>>1]=0;c[j>>2]=1;t=0;i=l;return t|0}r=p>>>0>q>>>0?q:p;a:do{if(q>>>0>1){p=1;while(1){u=p+1|0;if((b[m+(p<<1)>>1]|0)!=0){v=p;break a}if(u>>>0<q>>>0){p=u}else{v=u;break}}}else{v=1}}while(0);p=r>>>0<v>>>0?v:r;r=1;u=1;do{r=(r<<1)-(e[m+(u<<1)>>1]|0)|0;u=u+1|0;if((r|0)<0){t=-1;s=50;break}}while(u>>>0<16);if((s|0)==50){i=l;return t|0}if((r|0)>0?!((d|0)!=0&(q|0)==1):0){t=-1;i=l;return t|0}b[n+2>>1]=0;r=0;u=1;do{r=(e[m+(u<<1)>>1]|0)+(r&65535)|0;u=u+1|0;b[n+(u<<1)>>1]=r}while((u|0)!=15);if(!o){o=0;do{u=b[f+(o<<1)>>1]|0;if(!(u<<16>>16==0)){r=n+((u&65535)<<1)|0;u=b[r>>1]|0;b[r>>1]=u+1<<16>>16;b[k+((u&65535)<<1)>>1]=o}o=o+1|0}while((o|0)!=(g|0))}if((d|0)==0){w=0;x=1<<p;y=0;z=k;A=19;B=k}else if((d|0)==1){g=1<<p;if(g>>>0>852){t=1;i=l;return t|0}else{w=0;x=g;y=1;z=700384+ -514|0;A=256;B=700448+ -514|0}}else{g=1<<p;o=(d|0)==2;if(o&g>>>0>592){t=1;i=l;return t|0}else{w=o;x=g;y=0;z=700512;A=-1;B=700576}}g=x+ -1|0;o=p&255;d=p;n=0;u=0;r=v;v=-1;C=c[h>>2]|0;D=0;E=x;b:while(1){x=1<<d;F=u;G=r;H=D;while(1){I=G-n|0;J=I&255;K=b[k+(H<<1)>>1]|0;L=K&65535;if((L|0)>=(A|0)){if((L|0)>(A|0)){M=b[B+(L<<1)>>1]&255;N=b[z+(L<<1)>>1]|0}else{M=96;N=0}}else{M=0;N=K}K=1<<I;I=F>>>n;L=x;do{O=L;L=L-K|0;P=L+I|0;a[C+(P<<2)>>0]=M;a[C+(P<<2)+1>>0]=J;b[C+(P<<2)+2>>1]=N}while((O|0)!=(K|0));K=1<<G+ -1;while(1){if((K&F|0)==0){break}else{K=K>>>1}}if((K|0)==0){Q=0}else{Q=(K+ -1&F)+K|0}I=H;H=H+1|0;I=m+(G<<1)|0;L=(b[I>>1]|0)+ -1<<16>>16;b[I>>1]=L;if(L<<16>>16==0){if((G|0)==(q|0)){break b}R=e[f+(e[k+(H<<1)>>1]<<1)>>1]|0}else{R=G}if(!(R>>>0>p>>>0)){F=Q;G=R;H=H;continue}S=Q&g;if((S|0)!=(v|0)){break}else{F=Q;G=R}}G=(n|0)==0?p:n;F=C+(x<<2)|0;L=R-G|0;c:do{if(R>>>0<q>>>0){I=R;O=L;P=1<<L;while(1){T=P-(e[m+(I<<1)>>1]|0)|0;if((T|0)<1){U=O;break c}V=O+1|0;I=V+G|0;if(!(I>>>0<q>>>0)){U=V;break}else{O=V;P=T<<1}}}else{U=L}}while(0);L=(1<<U)+E|0;if(y&L>>>0>852|w&L>>>0>592){t=1;s=50;break}a[(c[h>>2]|0)+(S<<2)>>0]=U;a[(c[h>>2]|0)+(S<<2)+1>>0]=o;x=c[h>>2]|0;b[x+(S<<2)+2>>1]=(F-x|0)>>>2;d=U;n=G;u=Q;r=R;v=S;C=F;D=H;E=L}if((s|0)==50){i=l;return t|0}if((Q|0)!=0){a[C+(Q<<2)>>0]=64;a[C+(Q<<2)+1>>0]=J;b[C+(Q<<2)+2>>1]=0}c[h>>2]=(c[h>>2]|0)+(E<<2);c[j>>2]=p;t=0;i=l;return t|0}function j_(a){a=a|0;var d=0;d=i;c[a+2840>>2]=a+148;c[a+2848>>2]=701408;c[a+2852>>2]=a+2440;c[a+2860>>2]=701432;c[a+2864>>2]=a+2684;c[a+2872>>2]=701456;b[a+5816>>1]=0;c[a+5820>>2]=0;k_(a);i=d;return}function k_(a){a=a|0;var d=0,e=0,f=0,g=0;d=i;e=0;do{b[a+(e<<2)+148>>1]=0;e=e+1|0}while((e|0)!=286);f=0;do{b[a+(f<<2)+2440>>1]=0;f=f+1|0}while((f|0)!=30);g=0;do{b[a+(g<<2)+2684>>1]=0;g=g+1|0}while((g|0)!=19);b[a+1172>>1]=1;c[a+5804>>2]=0;c[a+5800>>2]=0;c[a+5808>>2]=0;c[a+5792>>2]=0;i=d;return}function l_(d,f,g,h){d=d|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;j=i;k=d+5820|0;l=c[k>>2]|0;m=h&65535;h=d+5816|0;n=e[h>>1]|0|m<<l;b[h>>1]=n;if((l|0)>13){o=d+20|0;p=c[o>>2]|0;c[o>>2]=p+1;q=d+8|0;a[(c[q>>2]|0)+p>>0]=n;n=(e[h>>1]|0)>>>8&255;p=c[o>>2]|0;c[o>>2]=p+1;a[(c[q>>2]|0)+p>>0]=n;n=c[k>>2]|0;b[h>>1]=m>>>(16-n|0);r=q;s=o;t=n+ -13|0}else{r=d+8|0;s=d+20|0;t=l+3|0}c[k>>2]=t;s_(d);d=c[s>>2]|0;c[s>>2]=d+1;a[(c[r>>2]|0)+d>>0]=g;d=c[s>>2]|0;c[s>>2]=d+1;a[(c[r>>2]|0)+d>>0]=g>>>8;d=g&65535^65535;t=c[s>>2]|0;c[s>>2]=t+1;a[(c[r>>2]|0)+t>>0]=d;t=c[s>>2]|0;c[s>>2]=t+1;a[(c[r>>2]|0)+t>>0]=d>>>8;if((g|0)==0){i=j;return}else{u=g;v=f}while(1){u=u+ -1|0;f=a[v>>0]|0;g=c[s>>2]|0;c[s>>2]=g+1;a[(c[r>>2]|0)+g>>0]=f;if((u|0)==0){break}else{v=v+1|0}}i=j;return}function m_(a){a=a|0;var b=0;b=i;n_(a);i=b;return}function n_(d){d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;g=d+5820|0;h=c[g>>2]|0;if((h|0)==16){j=d+5816|0;k=b[j>>1]&255;l=d+20|0;m=c[l>>2]|0;c[l>>2]=m+1;n=d+8|0;a[(c[n>>2]|0)+m>>0]=k;k=(e[j>>1]|0)>>>8&255;m=c[l>>2]|0;c[l>>2]=m+1;a[(c[n>>2]|0)+m>>0]=k;b[j>>1]=0;c[g>>2]=0;i=f;return}if((h|0)<=7){i=f;return}h=d+5816|0;j=b[h>>1]&255;k=d+20|0;m=c[k>>2]|0;c[k>>2]=m+1;a[(c[d+8>>2]|0)+m>>0]=j;b[h>>1]=(e[h>>1]|0)>>>8;c[g>>2]=(c[g>>2]|0)+ -8;i=f;return}function o_(d){d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=i;g=d+5820|0;h=c[g>>2]|0;j=d+5816|0;k=e[j>>1]|0|2<<h;b[j>>1]=k;if((h|0)>13){l=d+20|0;m=c[l>>2]|0;c[l>>2]=m+1;n=d+8|0;a[(c[n>>2]|0)+m>>0]=k;m=(e[j>>1]|0)>>>8&255;o=c[l>>2]|0;c[l>>2]=o+1;a[(c[n>>2]|0)+o>>0]=m;m=c[g>>2]|0;o=2>>>(16-m|0);b[j>>1]=o;p=o;q=m+ -13|0}else{p=k;q=h+3|0}c[g>>2]=q;if((q|0)>9){h=d+20|0;k=c[h>>2]|0;c[h>>2]=k+1;m=d+8|0;a[(c[m>>2]|0)+k>>0]=p;p=(e[j>>1]|0)>>>8&255;k=c[h>>2]|0;c[h>>2]=k+1;a[(c[m>>2]|0)+k>>0]=p;b[j>>1]=0;r=(c[g>>2]|0)+ -9|0;c[g>>2]=r;n_(d);i=f;return}else{r=q+7|0;c[g>>2]=r;n_(d);i=f;return}}function p_(f,g,h,j){f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;k=i;if((c[f+132>>2]|0)>0){l=(c[f>>2]|0)+44|0;if((c[l>>2]|0)==2){m=-201342849;n=0;while(1){if((m&1|0)!=0?(b[f+(n<<2)+148>>1]|0)!=0:0){o=0;break}n=n+1|0;if((n|0)>=32){p=6;break}else{m=m>>>1}}a:do{if((p|0)==6){if(((b[f+184>>1]|0)==0?(b[f+188>>1]|0)==0:0)?(b[f+200>>1]|0)==0:0){m=32;while(1){if((b[f+(m<<2)+148>>1]|0)!=0){o=1;break a}m=m+1|0;if((m|0)>=256){o=0;break}}}else{o=1}}}while(0);c[l>>2]=o}q_(f,f+2840|0);q_(f,f+2852|0);u_(f,f+148|0,c[f+2844>>2]|0);u_(f,f+2440|0,c[f+2856>>2]|0);q_(f,f+2864|0);o=18;while(1){l=o+ -1|0;if((b[f+(d[703232+o>>0]<<2)+2686>>1]|0)!=0){q=o;break}if((l|0)>2){o=l}else{q=l;break}}o=f+5800|0;l=(q*3|0)+17+(c[o>>2]|0)|0;c[o>>2]=l;o=(l+10|0)>>>3;l=((c[f+5804>>2]|0)+10|0)>>>3;r=q;s=l>>>0>o>>>0?o:l;t=l}else{l=h+5|0;r=0;s=l;t=l}do{if((h+4|0)>>>0>s>>>0|(g|0)==0){l=f+5820|0;o=c[l>>2]|0;q=(o|0)>13;if((t|0)==(s|0)?1:(c[f+136>>2]|0)==4){p=j+2&65535;m=f+5816|0;n=e[m>>1]|p<<o;b[m>>1]=n;if(q){u=f+20|0;v=c[u>>2]|0;c[u>>2]=v+1;w=f+8|0;a[(c[w>>2]|0)+v>>0]=n;n=(e[m>>1]|0)>>>8&255;v=c[u>>2]|0;c[u>>2]=v+1;a[(c[w>>2]|0)+v>>0]=n;n=c[l>>2]|0;b[m>>1]=p>>>(16-n|0);x=n+ -13|0}else{x=o+3|0}c[l>>2]=x;r_(f,701480,702632);break}n=j+4&65535;p=f+5816|0;m=e[p>>1]|n<<o;b[p>>1]=m;if(q){q=f+20|0;v=c[q>>2]|0;c[q>>2]=v+1;w=f+8|0;a[(c[w>>2]|0)+v>>0]=m;v=(e[p>>1]|0)>>>8&255;u=c[q>>2]|0;c[q>>2]=u+1;a[(c[w>>2]|0)+u>>0]=v;v=c[l>>2]|0;u=n>>>(16-v|0);b[p>>1]=u;y=u;z=v+ -13|0}else{y=m;z=o+3|0}c[l>>2]=z;o=c[f+2844>>2]|0;m=c[f+2856>>2]|0;v=o+65280&65535;u=y&65535|v<<z;b[p>>1]=u;if((z|0)>11){n=f+20|0;w=c[n>>2]|0;c[n>>2]=w+1;q=f+8|0;a[(c[q>>2]|0)+w>>0]=u;w=(e[p>>1]|0)>>>8&255;A=c[n>>2]|0;c[n>>2]=A+1;a[(c[q>>2]|0)+A>>0]=w;w=c[l>>2]|0;A=v>>>(16-w|0);b[p>>1]=A;B=w+ -11|0;C=A}else{B=z+5|0;C=u}c[l>>2]=B;u=m&65535;A=u<<B|C&65535;b[p>>1]=A;if((B|0)>11){w=f+20|0;v=c[w>>2]|0;c[w>>2]=v+1;q=f+8|0;a[(c[q>>2]|0)+v>>0]=A;v=(e[p>>1]|0)>>>8&255;n=c[w>>2]|0;c[w>>2]=n+1;a[(c[q>>2]|0)+n>>0]=v;v=c[l>>2]|0;n=u>>>(16-v|0);b[p>>1]=n;D=v+ -11|0;E=n}else{D=B+5|0;E=A}c[l>>2]=D;A=r+65533&65535;n=A<<D|E&65535;b[p>>1]=n;if((D|0)>12){v=f+20|0;u=c[v>>2]|0;c[v>>2]=u+1;q=f+8|0;a[(c[q>>2]|0)+u>>0]=n;u=(e[p>>1]|0)>>>8&255;w=c[v>>2]|0;c[v>>2]=w+1;a[(c[q>>2]|0)+w>>0]=u;u=c[l>>2]|0;w=A>>>(16-u|0);b[p>>1]=w;F=w;G=u+ -12|0}else{F=n;G=D+4|0}c[l>>2]=G;if((r|0)>-1){n=f+20|0;u=f+8|0;w=G;A=F;q=0;while(1){v=e[f+(d[703232+q>>0]<<2)+2686>>1]|0;H=v<<w|A&65535;b[p>>1]=H;if((w|0)>13){I=c[n>>2]|0;c[n>>2]=I+1;a[(c[u>>2]|0)+I>>0]=H;I=(e[p>>1]|0)>>>8&255;J=c[n>>2]|0;c[n>>2]=J+1;a[(c[u>>2]|0)+J>>0]=I;I=c[l>>2]|0;J=v>>>(16-I|0);b[p>>1]=J;K=J;L=I+ -13|0}else{K=H;L=w+3|0}c[l>>2]=L;if((q|0)==(r|0)){break}else{w=L;A=K;q=q+1|0}}}q=f+148|0;t_(f,q,o);A=f+2440|0;t_(f,A,m);r_(f,q,A)}else{l_(f,g,h,j)}}while(0);k_(f);if((j|0)==0){i=k;return}s_(f);i=k;return}function q_(d,f){d=d|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;g=i;i=i+32|0;h=g;j=c[f>>2]|0;k=f+8|0;l=c[k>>2]|0;m=c[l>>2]|0;n=c[l+12>>2]|0;l=d+5200|0;c[l>>2]=0;o=d+5204|0;c[o>>2]=573;if((n|0)>0){p=-1;q=0;while(1){if((b[j+(q<<2)>>1]|0)==0){b[j+(q<<2)+2>>1]=0;r=p}else{s=(c[l>>2]|0)+1|0;c[l>>2]=s;c[d+(s<<2)+2908>>2]=q;a[d+q+5208>>0]=0;r=q}q=q+1|0;if((q|0)==(n|0)){break}else{p=r}}p=c[l>>2]|0;if((p|0)<2){t=p;u=r;v=3}else{w=r}}else{t=0;u=-1;v=3}if((v|0)==3){v=d+5800|0;r=(m|0)==0;p=d+5804|0;q=t;t=u;while(1){u=(t|0)<2;s=t+1|0;x=u?s:t;y=u?s:0;s=q+1|0;c[l>>2]=s;c[d+(s<<2)+2908>>2]=y;b[j+(y<<2)>>1]=1;a[d+y+5208>>0]=0;c[v>>2]=(c[v>>2]|0)+ -1;if(!r){c[p>>2]=(c[p>>2]|0)-(e[m+(y<<2)+2>>1]|0)}q=c[l>>2]|0;if((q|0)>=2){w=x;break}else{t=x}}}t=f+4|0;c[t>>2]=w;q=c[l>>2]|0;if((q|0)>1){m=(q|0)/2|0;do{v_(d,j,m);m=m+ -1|0}while((m|0)>0);z=c[l>>2]|0}else{z=q}q=d+2912|0;m=z;z=n;while(1){n=c[q>>2]|0;c[l>>2]=m+ -1;c[q>>2]=c[d+(m<<2)+2908>>2];v_(d,j,1);p=c[q>>2]|0;r=(c[o>>2]|0)+ -1|0;c[o>>2]=r;c[d+(r<<2)+2908>>2]=n;r=(c[o>>2]|0)+ -1|0;c[o>>2]=r;c[d+(r<<2)+2908>>2]=p;b[j+(z<<2)>>1]=(e[j+(p<<2)>>1]|0)+(e[j+(n<<2)>>1]|0);r=a[d+n+5208>>0]|0;v=a[d+p+5208>>0]|0;a[d+z+5208>>0]=(((r&255)<(v&255)?v:r)&255)+1;r=z&65535;b[j+(p<<2)+2>>1]=r;b[j+(n<<2)+2>>1]=r;c[q>>2]=z;v_(d,j,1);m=c[l>>2]|0;if((m|0)<=1){break}else{z=z+1|0}}z=c[q>>2]|0;q=(c[o>>2]|0)+ -1|0;c[o>>2]=q;c[d+(q<<2)+2908>>2]=z;z=c[f>>2]|0;f=c[t>>2]|0;t=c[k>>2]|0;k=c[t>>2]|0;q=c[t+4>>2]|0;m=c[t+8>>2]|0;l=c[t+16>>2]|0;t=d+2876|0;r=t+32|0;do{b[t>>1]=0;t=t+2|0}while((t|0)<(r|0));b[z+(c[d+(c[o>>2]<<2)+2908>>2]<<2)+2>>1]=0;t=(c[o>>2]|0)+1|0;a:do{if((t|0)<573){o=d+5800|0;r=(k|0)==0;n=d+5804|0;p=t;v=0;do{x=c[d+(p<<2)+2908>>2]|0;y=z+(x<<2)+2|0;s=e[z+(e[y>>1]<<2)+2>>1]|0;u=(s|0)<(l|0);A=u?s+1|0:l;v=(u&1^1)+v|0;b[y>>1]=A;if((x|0)<=(f|0)){y=d+(A<<1)+2876|0;b[y>>1]=(b[y>>1]|0)+1<<16>>16;if((x|0)<(m|0)){B=0}else{B=c[q+(x-m<<2)>>2]|0}y=e[z+(x<<2)>>1]|0;u=ca(y,B+A|0)|0;c[o>>2]=u+(c[o>>2]|0);if(!r){u=ca((e[k+(x<<2)+2>>1]|0)+B|0,y)|0;c[n>>2]=u+(c[n>>2]|0)}}p=p+1|0}while((p|0)!=573);if((v|0)!=0){p=d+(l<<1)+2876|0;n=v;do{r=l;while(1){u=r+ -1|0;C=d+(u<<1)+2876|0;D=b[C>>1]|0;if(D<<16>>16==0){r=u}else{break}}b[C>>1]=D+ -1<<16>>16;u=d+(r<<1)+2876|0;b[u>>1]=(e[u>>1]|0)+2;E=(b[p>>1]|0)+ -1<<16>>16;b[p>>1]=E;n=n+ -2|0}while((n|0)>0);if((l|0)!=0){n=E;p=l;v=573;while(1){u=p&65535;y=v;x=n&65535;b:while(1){A=(x|0)==0;F=y;while(1){if(A){break b}G=F+ -1|0;H=c[d+(G<<2)+2908>>2]|0;if((H|0)>(f|0)){F=G}else{break}}A=z+(H<<2)+2|0;s=e[A>>1]|0;if((s|0)!=(p|0)){I=ca(e[z+(H<<2)>>1]|0,p-s|0)|0;c[o>>2]=I+(c[o>>2]|0);b[A>>1]=u}y=G;x=x+ -1|0}x=p+ -1|0;if((x|0)==0){break a}n=b[d+(x<<1)+2876>>1]|0;p=x;v=F}}}}}while(0);F=1;G=0;do{G=(e[d+(F+ -1<<1)+2876>>1]|0)+(G&65534)<<1;b[h+(F<<1)>>1]=G;F=F+1|0}while((F|0)!=16);if((w|0)<0){i=g;return}else{J=0}while(1){F=b[j+(J<<2)+2>>1]|0;G=F&65535;if(!(F<<16>>16==0)){F=h+(G<<1)|0;d=b[F>>1]|0;b[F>>1]=d+1<<16>>16;F=G;G=d&65535;d=0;while(1){K=d|G&1;F=F+ -1|0;if((F|0)<=0){break}else{G=G>>>1;d=K<<1}}b[j+(J<<2)>>1]=K}if((J|0)==(w|0)){break}else{J=J+1|0}}i=g;return}function r_(f,g,h){f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;j=i;k=f+5792|0;if((c[k>>2]|0)==0){l=c[f+5820>>2]|0;m=b[f+5816>>1]|0}else{n=f+5796|0;o=f+5784|0;p=f+5820|0;q=f+5816|0;r=f+20|0;s=f+8|0;t=0;do{u=b[(c[n>>2]|0)+(t<<1)>>1]|0;v=u&65535;w=d[(c[o>>2]|0)+t>>0]|0;t=t+1|0;do{if(u<<16>>16==0){x=e[g+(w<<2)+2>>1]|0;y=c[p>>2]|0;z=e[g+(w<<2)>>1]|0;A=e[q>>1]|0|z<<y;B=A&65535;b[q>>1]=B;if((y|0)>(16-x|0)){C=c[r>>2]|0;c[r>>2]=C+1;a[(c[s>>2]|0)+C>>0]=A;A=(e[q>>1]|0)>>>8&255;C=c[r>>2]|0;c[r>>2]=C+1;a[(c[s>>2]|0)+C>>0]=A;A=c[p>>2]|0;C=z>>>(16-A|0)&65535;b[q>>1]=C;z=x+ -16+A|0;c[p>>2]=z;D=C;E=z;break}else{z=y+x|0;c[p>>2]=z;D=B;E=z;break}}else{z=d[701152+w>>0]|0;B=(z|256)+1|0;x=e[g+(B<<2)+2>>1]|0;y=c[p>>2]|0;C=e[g+(B<<2)>>1]|0;B=e[q>>1]|0|C<<y;A=B&65535;b[q>>1]=A;if((y|0)>(16-x|0)){F=c[r>>2]|0;c[r>>2]=F+1;a[(c[s>>2]|0)+F>>0]=B;B=(e[q>>1]|0)>>>8&255;F=c[r>>2]|0;c[r>>2]=F+1;a[(c[s>>2]|0)+F>>0]=B;B=c[p>>2]|0;F=C>>>(16-B|0)&65535;b[q>>1]=F;G=F;H=x+ -16+B|0}else{G=A;H=y+x|0}c[p>>2]=H;x=c[702752+(z<<2)>>2]|0;do{if((z+ -8|0)>>>0<20){y=w-(c[702872+(z<<2)>>2]|0)&65535;A=y<<H|G&65535;B=A&65535;b[q>>1]=B;if((H|0)>(16-x|0)){F=c[r>>2]|0;c[r>>2]=F+1;a[(c[s>>2]|0)+F>>0]=A;A=(e[q>>1]|0)>>>8&255;F=c[r>>2]|0;c[r>>2]=F+1;a[(c[s>>2]|0)+F>>0]=A;A=c[p>>2]|0;F=y>>>(16-A|0)&65535;b[q>>1]=F;y=x+ -16+A|0;c[p>>2]=y;I=y;J=F;break}else{F=H+x|0;c[p>>2]=F;I=F;J=B;break}}else{I=H;J=G}}while(0);x=v+ -1|0;if(x>>>0<256){K=x}else{K=(x>>>7)+256|0}z=d[700640+K>>0]|0;B=e[h+(z<<2)+2>>1]|0;F=e[h+(z<<2)>>1]|0;y=J&65535|F<<I;A=y&65535;b[q>>1]=A;if((I|0)>(16-B|0)){C=c[r>>2]|0;c[r>>2]=C+1;a[(c[s>>2]|0)+C>>0]=y;y=(e[q>>1]|0)>>>8&255;C=c[r>>2]|0;c[r>>2]=C+1;a[(c[s>>2]|0)+C>>0]=y;y=c[p>>2]|0;C=F>>>(16-y|0)&65535;b[q>>1]=C;L=B+ -16+y|0;M=C}else{L=I+B|0;M=A}c[p>>2]=L;A=c[702992+(z<<2)>>2]|0;if((z+ -4|0)>>>0<26){B=x-(c[703112+(z<<2)>>2]|0)&65535;z=B<<L|M&65535;x=z&65535;b[q>>1]=x;if((L|0)>(16-A|0)){C=c[r>>2]|0;c[r>>2]=C+1;a[(c[s>>2]|0)+C>>0]=z;z=(e[q>>1]|0)>>>8&255;C=c[r>>2]|0;c[r>>2]=C+1;a[(c[s>>2]|0)+C>>0]=z;z=c[p>>2]|0;C=B>>>(16-z|0)&65535;b[q>>1]=C;B=A+ -16+z|0;c[p>>2]=B;D=C;E=B;break}else{B=L+A|0;c[p>>2]=B;D=x;E=B;break}}else{D=M;E=L}}}while(0)}while(t>>>0<(c[k>>2]|0)>>>0);l=E;m=D}D=e[g+1026>>1]|0;E=f+5820|0;k=e[g+1024>>1]|0;g=f+5816|0;t=m&65535|k<<l;b[g>>1]=t;if((l|0)>(16-D|0)){m=f+20|0;L=c[m>>2]|0;c[m>>2]=L+1;M=f+8|0;a[(c[M>>2]|0)+L>>0]=t;t=(e[g>>1]|0)>>>8&255;L=c[m>>2]|0;c[m>>2]=L+1;a[(c[M>>2]|0)+L>>0]=t;t=c[E>>2]|0;b[g>>1]=k>>>(16-t|0);N=D+ -16+t|0;c[E>>2]=N;i=j;return}else{N=l+D|0;c[E>>2]=N;i=j;return}}function s_(d){d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;g=d+5820|0;h=c[g>>2]|0;if((h|0)>8){j=d+5816|0;k=b[j>>1]&255;l=d+20|0;m=c[l>>2]|0;c[l>>2]=m+1;n=d+8|0;a[(c[n>>2]|0)+m>>0]=k;k=(e[j>>1]|0)>>>8&255;m=c[l>>2]|0;c[l>>2]=m+1;a[(c[n>>2]|0)+m>>0]=k;o=j;b[o>>1]=0;c[g>>2]=0;i=f;return}j=d+5816|0;if((h|0)<=0){o=j;b[o>>1]=0;c[g>>2]=0;i=f;return}h=b[j>>1]&255;k=d+20|0;m=c[k>>2]|0;c[k>>2]=m+1;a[(c[d+8>>2]|0)+m>>0]=h;o=j;b[o>>1]=0;c[g>>2]=0;i=f;return}function t_(d,f,g){d=d|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;h=i;j=b[f+2>>1]|0;k=j<<16>>16==0;l=d+2754|0;m=d+5820|0;n=d+2752|0;o=d+5816|0;p=d+20|0;q=d+8|0;r=d+2758|0;s=d+2756|0;t=d+2750|0;u=d+2748|0;v=k?138:7;w=k?3:4;k=0;x=j&65535;j=-1;a:while(1){y=0;z=k;while(1){if((z|0)>(g|0)){break a}z=z+1|0;A=b[f+(z<<2)+2>>1]|0;B=A&65535;C=y+1|0;D=(x|0)==(B|0);if(!((C|0)<(v|0)&D)){break}else{y=C}}do{if((C|0)>=(w|0)){if((x|0)!=0){if((x|0)==(j|0)){E=b[o>>1]|0;F=c[m>>2]|0;G=C}else{H=e[d+(x<<2)+2686>>1]|0;I=c[m>>2]|0;J=e[d+(x<<2)+2684>>1]|0;K=e[o>>1]|0|J<<I;L=K&65535;b[o>>1]=L;if((I|0)>(16-H|0)){M=c[p>>2]|0;c[p>>2]=M+1;a[(c[q>>2]|0)+M>>0]=K;K=(e[o>>1]|0)>>>8&255;M=c[p>>2]|0;c[p>>2]=M+1;a[(c[q>>2]|0)+M>>0]=K;K=c[m>>2]|0;M=J>>>(16-K|0)&65535;b[o>>1]=M;N=M;O=H+ -16+K|0}else{N=L;O=I+H|0}c[m>>2]=O;E=N;F=O;G=y}H=e[t>>1]|0;I=e[u>>1]|0;L=E&65535|I<<F;b[o>>1]=L;if((F|0)>(16-H|0)){K=c[p>>2]|0;c[p>>2]=K+1;a[(c[q>>2]|0)+K>>0]=L;K=(e[o>>1]|0)>>>8&255;M=c[p>>2]|0;c[p>>2]=M+1;a[(c[q>>2]|0)+M>>0]=K;K=c[m>>2]|0;M=I>>>(16-K|0);b[o>>1]=M;P=H+ -16+K|0;Q=M}else{P=F+H|0;Q=L}c[m>>2]=P;L=G+65533&65535;H=Q&65535|L<<P;b[o>>1]=H;if((P|0)>14){M=c[p>>2]|0;c[p>>2]=M+1;a[(c[q>>2]|0)+M>>0]=H;H=(e[o>>1]|0)>>>8&255;M=c[p>>2]|0;c[p>>2]=M+1;a[(c[q>>2]|0)+M>>0]=H;H=c[m>>2]|0;b[o>>1]=L>>>(16-H|0);c[m>>2]=H+ -14;break}else{c[m>>2]=P+2;break}}if((C|0)<11){H=e[l>>1]|0;L=c[m>>2]|0;M=e[n>>1]|0;K=e[o>>1]|0|M<<L;b[o>>1]=K;if((L|0)>(16-H|0)){I=c[p>>2]|0;c[p>>2]=I+1;a[(c[q>>2]|0)+I>>0]=K;I=(e[o>>1]|0)>>>8&255;J=c[p>>2]|0;c[p>>2]=J+1;a[(c[q>>2]|0)+J>>0]=I;I=c[m>>2]|0;J=M>>>(16-I|0);b[o>>1]=J;R=H+ -16+I|0;S=J}else{R=L+H|0;S=K}c[m>>2]=R;K=y+65534&65535;H=S&65535|K<<R;b[o>>1]=H;if((R|0)>13){L=c[p>>2]|0;c[p>>2]=L+1;a[(c[q>>2]|0)+L>>0]=H;H=(e[o>>1]|0)>>>8&255;L=c[p>>2]|0;c[p>>2]=L+1;a[(c[q>>2]|0)+L>>0]=H;H=c[m>>2]|0;b[o>>1]=K>>>(16-H|0);c[m>>2]=H+ -13;break}else{c[m>>2]=R+3;break}}else{H=e[r>>1]|0;K=c[m>>2]|0;L=e[s>>1]|0;J=e[o>>1]|0|L<<K;b[o>>1]=J;if((K|0)>(16-H|0)){I=c[p>>2]|0;c[p>>2]=I+1;a[(c[q>>2]|0)+I>>0]=J;I=(e[o>>1]|0)>>>8&255;M=c[p>>2]|0;c[p>>2]=M+1;a[(c[q>>2]|0)+M>>0]=I;I=c[m>>2]|0;M=L>>>(16-I|0);b[o>>1]=M;T=H+ -16+I|0;U=M}else{T=K+H|0;U=J}c[m>>2]=T;J=y+65526&65535;H=U&65535|J<<T;b[o>>1]=H;if((T|0)>9){K=c[p>>2]|0;c[p>>2]=K+1;a[(c[q>>2]|0)+K>>0]=H;H=(e[o>>1]|0)>>>8&255;K=c[p>>2]|0;c[p>>2]=K+1;a[(c[q>>2]|0)+K>>0]=H;H=c[m>>2]|0;b[o>>1]=J>>>(16-H|0);c[m>>2]=H+ -9;break}else{c[m>>2]=T+7;break}}}else{H=d+(x<<2)+2686|0;J=d+(x<<2)+2684|0;K=c[m>>2]|0;M=b[o>>1]|0;I=C;while(1){L=e[H>>1]|0;V=e[J>>1]|0;W=M&65535|V<<K;X=W&65535;b[o>>1]=X;if((K|0)>(16-L|0)){Y=c[p>>2]|0;c[p>>2]=Y+1;a[(c[q>>2]|0)+Y>>0]=W;W=(e[o>>1]|0)>>>8&255;Y=c[p>>2]|0;c[p>>2]=Y+1;a[(c[q>>2]|0)+Y>>0]=W;W=c[m>>2]|0;Y=V>>>(16-W|0)&65535;b[o>>1]=Y;Z=Y;_=L+ -16+W|0}else{Z=X;_=K+L|0}c[m>>2]=_;I=I+ -1|0;if((I|0)==0){break}else{K=_;M=Z}}}}while(0);if(A<<16>>16==0){$=x;v=138;w=3;k=z;x=B;j=$;continue}$=x;v=D?6:7;w=D?3:4;k=z;x=B;j=$}i=h;return}function u_(a,c,d){a=a|0;c=c|0;d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;f=i;g=b[c+2>>1]|0;h=g<<16>>16==0;b[c+(d+1<<2)+2>>1]=-1;j=a+2752|0;k=a+2756|0;l=a+2748|0;m=h?138:7;n=h?3:4;h=0;o=g&65535;g=-1;a:while(1){p=0;q=h;do{if((q|0)>(d|0)){break a}q=q+1|0;r=b[c+(q<<2)+2>>1]|0;s=r&65535;p=p+1|0;t=(o|0)==(s|0)}while((p|0)<(m|0)&t);do{if((p|0)>=(n|0)){if((o|0)==0){if((p|0)<11){b[j>>1]=(b[j>>1]|0)+1<<16>>16;break}else{b[k>>1]=(b[k>>1]|0)+1<<16>>16;break}}else{if((o|0)!=(g|0)){u=a+(o<<2)+2684|0;b[u>>1]=(b[u>>1]|0)+1<<16>>16}b[l>>1]=(b[l>>1]|0)+1<<16>>16;break}}else{u=a+(o<<2)+2684|0;b[u>>1]=(e[u>>1]|0)+p}}while(0);if(r<<16>>16==0){v=o;m=138;n=3;h=q;o=s;g=v;continue}v=o;m=t?6:7;n=t?3:4;h=q;o=s;g=v}i=f;return}function v_(a,e,f){a=a|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;g=i;h=c[a+(f<<2)+2908>>2]|0;j=a+h+5208|0;k=f<<1;l=a+5200|0;m=c[l>>2]|0;a:do{if((k|0)>(m|0)){n=f}else{o=e+(h<<2)|0;p=f;q=m;r=k;while(1){do{if((r|0)<(q|0)){s=r|1;t=c[a+(s<<2)+2908>>2]|0;u=b[e+(t<<2)>>1]|0;v=c[a+(r<<2)+2908>>2]|0;w=b[e+(v<<2)>>1]|0;if(!((u&65535)<(w&65535))){if(!(u<<16>>16==w<<16>>16)){x=r;break}if((d[a+t+5208>>0]|0)>(d[a+v+5208>>0]|0)){x=r;break}}x=s}else{x=r}}while(0);s=b[o>>1]|0;v=c[a+(x<<2)+2908>>2]|0;t=b[e+(v<<2)>>1]|0;if((s&65535)<(t&65535)){n=p;break a}if(s<<16>>16==t<<16>>16?(d[j>>0]|0)<=(d[a+v+5208>>0]|0):0){n=p;break a}c[a+(p<<2)+2908>>2]=v;r=x<<1;q=c[l>>2]|0;if((r|0)>(q|0)){n=x;break}else{p=x}}}}while(0);c[a+(n<<2)+2908>>2]=h;i=g;return}function w_(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;a=i;d=qna(ca(c,b)|0)|0;i=a;return d|0}function x_(a,b){a=a|0;b=b|0;a=i;sna(b);i=a;return}function y_(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0;h=i;j=C0(96,a)|0;A_(j,b,c,d,e,f,g);i=h;return j|0}function z_(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}B_(a);D0(a);i=b;return}function A_(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0;j=i;if((b|0)==0|(d|0)==0){c[a+4>>2]=0;k=a}else{l=C0(96,c[a>>2]|0)|0;A_(l,0,0,b,d,3,h);c[a+4>>2]=l;c[l>>2]=c[a>>2];k=a}l=C0(20,c[k>>2]|0)|0;r$(l,e,f);c[a+12>>2]=l;c[l>>2]=c[k>>2];c[a+8>>2]=g;c[a+16>>2]=0;g=C0(16,c[k>>2]|0)|0;l$(g);c[a+20>>2]=g;c[g>>2]=c[k>>2];g=C0(16,c[k>>2]|0)|0;k$(g,1);c[a+24>>2]=g;c[g>>2]=c[k>>2];c[a+28>>2]=0;c[a+32>>2]=0;c[a+40>>2]=h;c[a+36>>2]=0;c[a+44>>2]=10;h=a+56|0;c[a+48>>2]=0;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;c[h+16>>2]=0;i=j;return}function B_(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+56|0;e=c[d>>2]|0;if((e|0)!=0){D0(e)}c[d>>2]=0;d=a+60|0;e=c[d>>2]|0;if((e|0)!=0){D0(e)}c[d>>2]=0;d=a+64|0;e=c[d>>2]|0;if((e|0)!=0){f=c[a>>2]|0;Ic[c[(c[f>>2]|0)+16>>2]&511](f,e)}c[d>>2]=0;d=a+4|0;e=c[d>>2]|0;if((e|0)!=0){B_(e);D0(e)}c[d>>2]=0;d=a+24|0;e=c[d>>2]|0;if((e|0)!=0){i$(e);D0(e)}c[d>>2]=0;d=a+28|0;if((c[a+32>>2]|0)!=0?(e=c[d>>2]|0,(e|0)!=0):0){o0(e);D0(e)}c[d>>2]=0;d=a+12|0;e=c[d>>2]|0;if((e|0)!=0){D0(e)}c[d>>2]=0;d=a+20|0;a=c[d>>2]|0;if((a|0)==0){c[d>>2]=0;i=b;return}g$(a);D0(a);c[d>>2]=0;i=b;return}function C_(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;i=i+16|0;f=e;g=e+8|0;h=e+4|0;j=b+12|0;k=c[j>>2]|0;l=k+12|0;m=c[l>>2]|0;if(((c[k+8>>2]|0)-m|0)>>>0<8){n=c[b>>2]|0;ld[c[(c[n>>2]|0)+24>>2]&255](n,703400,f);o=-2;i=e;return o|0}if((Q2a((c[k+4>>2]|0)+m|0,703392,8)|0)!=0){k=c[b>>2]|0;ld[c[(c[k>>2]|0)+24>>2]&255](k,703424,f);o=-4;i=e;return o|0}c[l>>2]=m+8;if((D_(c[j>>2]|0,g)|0)!=0){m=c[b>>2]|0;ld[c[(c[m>>2]|0)+24>>2]&255](m,703400,f);o=-2;i=e;return o|0}m=a[g>>0]|0;if((m&2)==0){if((E_(c[j>>2]|0,h)|0)!=0){j=c[b>>2]|0;ld[c[(c[j>>2]|0)+24>>2]&255](j,703400,f);o=-2;i=e;return o|0}f=c[h>>2]|0;if((f|0)!=0){h=b+24|0;j=c[h>>2]|0;if((j|0)!=0){i$(j);D0(j)}j=C0(16,c[b>>2]|0)|0;k$(j,f);c[h>>2]=j;c[j>>2]=c[b>>2]}}j=b+8|0;if((m&1)==0){c[j>>2]=2;o=G_(b,d)|0;i=e;return o|0}else{c[j>>2]=1;o=F_(b,d)|0;i=e;return o|0}return 0}function D_(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=b+12|0;g=c[f>>2]|0;if(!(g>>>0<(c[b+8>>2]|0)>>>0)){h=-1;i=e;return h|0}a[d>>0]=a[(c[b+4>>2]|0)+g>>0]|0;c[f>>2]=(c[f>>2]|0)+1;h=0;i=e;return h|0}function E_(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;f=a+12|0;g=c[f>>2]|0;h=g+3|0;if(!(h>>>0<(c[a+8>>2]|0)>>>0)){j=-1;i=e;return j|0}k=c[a+4>>2]|0;c[b>>2]=(d[k+(g+1)>>0]|0)<<16|(d[k+g>>0]|0)<<24|(d[k+(g+2)>>0]|0)<<8|(d[k+h>>0]|0);c[f>>2]=(c[f>>2]|0)+4;j=0;i=e;return j|0}function F_(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;d=i;e=a+12|0;f=c[e>>2]|0;g=c[f+8>>2]|0;h=c[f+12>>2]|0;if((g|0)==(h|0)){j=3;i=d;return j|0}if(!((g-h|0)>>>0>10)){j=0;i=d;return j|0}h=a+68|0;g=a+72|0;f=a+48|0;k=a+20|0;l=a+28|0;m=(b|0)==0;while(1){n=c[h>>2]|0;if((n|0)==0){o=C0(48,c[a>>2]|0)|0;H0(o);c[h>>2]=o;c[o>>2]=c[a>>2];p=H_(a,c[h>>2]|0)|0;if((p|0)!=0){q=6;break}c[g>>2]=c[(c[e>>2]|0)+12>>2];r=c[h>>2]|0}else{r=n}s=I_(a,r,b)|0;if((c[f>>2]|0)==3){q=11;break}if((s&-2|0)==2){q=13;break}if((s|0)!=0){q=17;break}J_(c[k>>2]|0,c[h>>2]|0);n=c[(c[h>>2]|0)+24>>2]|0;if((n|0)==-1){o=(c[e>>2]|0)+12|0;c[o>>2]=(c[o>>2]|0)+4}else{o=(c[g>>2]|0)+n|0;c[g>>2]=o;n=c[e>>2]|0;t=c[n+8>>2]|0;c[n+12>>2]=t>>>0<o>>>0?t:o}c[h>>2]=0;o=c[e>>2]|0;t=c[o+8>>2]|0;n=c[o+12>>2]|0;if((t|0)!=(n|0)){if((c[l>>2]|0)==0|m){u=n;v=t}else{if((Lc[c[c[b>>2]>>2]&255](b)|0)!=0){q=28;break}n=c[e>>2]|0;u=c[n+12>>2]|0;v=c[n+8>>2]|0}}else{u=t;v=t}if(!((v-u|0)>>>0>10)){j=0;q=29;break}}if((q|0)==6){u=c[h>>2]|0;if((u|0)!=0){I0(u);D0(u)}c[h>>2]=0;j=p;i=d;return j|0}else if((q|0)==11){c[f>>2]=3;c[a+44>>2]=2;j=0;i=d;return j|0}else if((q|0)==13){p=c[h>>2]|0;if((p|0)!=0){I0(p);D0(p)}c[h>>2]=0;j=0;i=d;return j|0}else if((q|0)==17){p=c[h>>2]|0;if((p|0)!=0){I0(p);D0(p)}c[h>>2]=0;j=s;i=d;return j|0}else if((q|0)==28){c[f>>2]=3;c[a+44>>2]=2;j=0;i=d;return j|0}else if((q|0)==29){i=d;return j|0}return 0}function G_(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;f=b+12|0;g=c[f>>2]|0;a:do{if(((c[g+8>>2]|0)-(c[g+12>>2]|0)|0)>>>0>11){h=b+20|0;j=(d|0)==0;k=b+40|0;while(1){l=C0(48,c[b>>2]|0)|0;H0(l);c[l>>2]=c[b>>2];m=H_(b,l)|0;if((m|0)!=0){n=4;break}if((a[l+8>>0]&63)==51){n=7;break}J_(c[h>>2]|0,l);if((!j?(c[k>>2]|0)!=0:0)?(Lc[c[c[d>>2]>>2]&255](d)|0)!=0:0){n=12;break}o=c[f>>2]|0;if(!(((c[o+8>>2]|0)-(c[o+12>>2]|0)|0)>>>0>11)){break a}}if((n|0)==4){if((l|0)==0){p=m;i=e;return p|0}I0(l);D0(l);p=m;i=e;return p|0}else if((n|0)==7){I0(l);D0(l);break}else if((n|0)==12){c[b+44>>2]=3;c[b+48>>2]=3;p=0;i=e;return p|0}}}while(0);c[b+36>>2]=0;p=K_(b,d)|0;i=e;return p|0}function H_(b,f){b=b|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;g=i;i=i+16|0;h=g;j=g+10|0;k=g+8|0;l=g+4|0;m=b+12|0;n=f+4|0;a:do{if((E_(c[m>>2]|0,n)|0)==0?(o=f+8|0,(D_(c[m>>2]|0,o)|0)==0):0){p=c[m>>2]|0;q=Q_(p)|0;a[j>>0]=q;do{if((q&-32)<<24>>24==-32){r=f+12|0;if((E_(p,r)|0)!=0){break a}s=c[r>>2]&536870911;c[r>>2]=s;if(!(s>>>0>64)){t=s;u=((s+1|0)>>>3)+9|0;break}s=c[b>>2]|0;ld[c[(c[s>>2]|0)+24>>2]&255](s,703440,h);v=-6;i=g;return v|0}else{if((D_(p,j)|0)!=0){break a}s=(d[j>>0]|0)>>>5;c[f+12>>2]=s;t=s;u=6}}while(0);c[l>>2]=u;p=c[n>>2]|0;if(p>>>0>65536){w=4}else{w=p>>>0>256?2:1}p=a[o>>0]&64;q=f+12|0;b:do{if((t|0)!=0?(s=c[b>>2]|0,r=f+16|0,c[r>>2]=Qc[c[(c[s>>2]|0)+4>>2]&255](s,4,t)|0,(c[q>>2]|0)>0):0){s=0;while(1){if((w|0)==4){if((E_(c[m>>2]|0,l)|0)!=0){break a}c[(c[r>>2]|0)+(s<<2)>>2]=c[l>>2]}else if((w|0)==2){if((R_(c[m>>2]|0,k)|0)!=0){break a}c[(c[r>>2]|0)+(s<<2)>>2]=e[k>>1]|0}else if((w|0)==1){if((D_(c[m>>2]|0,j)|0)!=0){break a}c[(c[r>>2]|0)+(s<<2)>>2]=d[j>>0]|0}if(!((c[(c[r>>2]|0)+(s<<2)>>2]|0)>>>0<(c[n>>2]|0)>>>0)){break}s=s+1|0;if((s|0)>=(c[q>>2]|0)){break b}}s=c[b>>2]|0;ld[c[(c[s>>2]|0)+24>>2]&255](s,703472,h);break a}}while(0);q=c[m>>2]|0;if(!(p<<24>>24==0)){if((E_(q,f+20|0)|0)!=0){break}}else{if((D_(q,j)|0)!=0){break}c[f+20>>2]=d[j>>0]|0}if((E_(c[m>>2]|0,f+24|0)|0)==0){q=c[m>>2]|0;c[f+32>>2]=(c[q+4>>2]|0)+(c[q+12>>2]|0);c[f+36>>2]=1;v=0;i=g;return v|0}}}while(0);f=c[b>>2]|0;ld[c[(c[f>>2]|0)+24>>2]&255](f,703544,h);v=-2;i=g;return v|0}function I_(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;f=S_(a,b,d)|0;g=a+12|0;h=a+48|0;if((c[h>>2]|0)==3){j=f}else{k=f;i=e;return k|0}while(1){f=c[g>>2]|0;if((c[f+8>>2]|0)==(c[f+12>>2]|0)){k=j;l=4;break}f=S_(a,b,d)|0;if((c[h>>2]|0)==3){j=f}else{k=f;l=4;break}}if((l|0)==4){i=e;return k|0}return 0}function J_(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;e=a+12|0;f=c[e>>2]|0;g=a+4|0;h=c[g>>2]|0;if((f|0)<(h|0)){j=f;k=c[a+8>>2]|0;l=j+1|0;c[e>>2]=l;m=k+(j<<2)|0;c[m>>2]=b;i=d;return}else{f=h+8|0;c[g>>2]=f;g=c[a>>2]|0;h=a+8|0;a=Qc[c[(c[g>>2]|0)+12>>2]&255](g,c[h>>2]|0,f<<2)|0;c[h>>2]=a;j=c[e>>2]|0;k=a;l=j+1|0;c[e>>2]=l;m=k+(j<<2)|0;c[m>>2]=b;i=d;return}}function K_(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;e=a+36|0;f=c[e>>2]|0;g=a+20|0;h=c[g>>2]|0;if((f|0)>=(c[h+12>>2]|0)){j=0;i=d;return j|0}k=a+28|0;l=(b|0)==0;m=h;h=f;while(1){f=I_(a,c[(c[m+8>>2]|0)+(h<<2)>>2]|0,b)|0;if((f&-2|0)==2){j=0;n=9;break}if((f|0)!=0){j=f;n=9;break}if(!((c[k>>2]|0)==0|l)?(Lc[c[c[b>>2]>>2]&255](b)|0)!=0:0){n=7;break}h=(c[e>>2]|0)+1|0;c[e>>2]=h;m=c[g>>2]|0;if((h|0)>=(c[m+12>>2]|0)){j=0;n=9;break}}if((n|0)==7){c[a+44>>2]=4;c[a+48>>2]=3;j=0;i=d;return j|0}else if((n|0)==9){i=d;return j|0}return 0}function L_(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0;h=i;j=c[a+4>>2]|0;if((j|0)!=0?(k=F_(j,g)|0,(k|0)!=0):0){c[a+48>>2]=-1;l=k;i=h;return l|0}c[a+52>>2]=1;k=a+44|0;c[k>>2]=0;j=a+28|0;m=c[j>>2]|0;if((m|0)!=0){o0(m);D0(m)}m=C0(24,c[a>>2]|0)|0;m0(m,d,e,f,b);c[j>>2]=m;c[m>>2]=c[a>>2];c[a+32>>2]=1;if(!((c[j>>2]|0)==0|(g|0)==0)?(Lc[c[c[g>>2]>>2]&255](g)|0)!=0:0){c[k>>2]=1;c[a+48>>2]=3;l=0;i=h;return l|0}l=M_(a,g)|0;i=h;return l|0}function M_(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=a+48|0;c[e>>2]=2;f=a+44|0;g=c[f>>2]|0;do{if((g|0)<2){h=c[a+8>>2]|0;if((h|0)==0){j=C_(a,b)|0;break}else if((h|0)==2){if((c[a+52>>2]|0)==0){j=K_(a,b)|0;break}else{j=G_(a,b)|0;break}}else if((h|0)==3){j=F_(a,b)|0;break}else if((h|0)==1){j=F_(a,b)|0;break}else{c[e>>2]=-1;k=-5;i=d;return k|0}}else{if((g|0)==4){j=K_(a,b)|0;break}else if((g|0)==2){j=F_(a,b)|0;break}else if((g|0)==5){c[e>>2]=4;k=0;i=d;return k|0}else if((g|0)==3){j=G_(a,b)|0;break}else{j=0;break}}}while(0);if((c[e>>2]|0)==3){k=j;i=d;return k|0}c[f>>2]=5;if((c[a+32>>2]|j|0)==0){c[e>>2]=4;k=0;i=d;return k|0}else{c[e>>2]=(j|0)==0?4:-1;k=j;i=d;return k|0}return 0}function N_(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;c[a+52>>2]=1;c[a+44>>2]=0;e=c[a+4>>2]|0;if((e|0)!=0?(f=F_(e,b)|0,(f|0)!=0):0){g=f;i=d;return g|0}c[a+32>>2]=0;g=M_(a,b)|0;i=d;return g|0}function O_(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=c[a+4>>2]|0;if((e|0)!=0?(f=O_(e,b)|0,(f|0)!=0):0){g=f;i=d;return g|0}f=c[a+20>>2]|0;a=c[f+12>>2]|0;if((a|0)<=0){g=0;i=d;return g|0}e=c[f+8>>2]|0;f=0;while(1){h=c[e+(f<<2)>>2]|0;f=f+1|0;if((c[h+4>>2]|0)==(b|0)){g=h;j=7;break}if((f|0)>=(a|0)){g=0;j=7;break}}if((j|0)==7){i=d;return g|0}return 0}function P_(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;g=c[d+12>>2]|0;if((g|0)<=0){h=0;i=f;return h|0}j=c[d+16>>2]|0;d=0;k=0;while(1){l=O_(b,c[j+(k<<2)>>2]|0)|0;if((l|0)!=0?(a[l+8>>0]&63)==53:0){if((d|0)==(e|0)){h=l;m=8;break}n=d+1|0}else{n=d}k=k+1|0;if((k|0)>=(g|0)){h=0;m=8;break}else{d=n}}if((m|0)==8){i=f;return h|0}return 0}function Q_(b){b=b|0;var d=0,e=0,f=0;d=i;e=c[b+12>>2]|0;if(!(e>>>0<(c[b+8>>2]|0)>>>0)){f=0;i=d;return f|0}f=a[(c[b+4>>2]|0)+e>>0]|0;i=d;return f|0}function R_(a,e){a=a|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;g=a+12|0;h=c[g>>2]|0;j=h+1|0;if(!(j>>>0<(c[a+8>>2]|0)>>>0)){k=-1;i=f;return k|0}l=c[a+4>>2]|0;b[e>>1]=(d[l+h>>0]|0)<<8|(d[l+j>>0]|0);c[g>>2]=(c[g>>2]|0)+2;k=0;i=f;return k|0}function S_(f,g,h){f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;j=i;i=i+16|0;k=j;l=j+4|0;a:do{switch(a[g+8>>0]&63|0){case 43:case 42:case 40:{if((c[f+16>>2]|0)==0){m=36}else{n=Y_(f,g)|0;i=j;return n|0}break};case 62:{o=(c[f+12>>2]|0)+12|0;c[o>>2]=(c[o>>2]|0)+(c[g+24>>2]|0);m=34;break};case 7:case 6:case 4:{if((c[f+16>>2]|0)==0){m=36}else{n=U_(f,g)|0;i=j;return n|0}break};case 23:case 22:case 20:{if((c[f+16>>2]|0)==0){m=36}else{n=W_(f,g,h)|0;i=j;return n|0}break};case 52:{o=(c[f+12>>2]|0)+12|0;c[o>>2]=(c[o>>2]|0)+(c[g+24>>2]|0);m=34;break};case 16:{n=V_(f,g,h)|0;i=j;return n|0};case 53:{n=__(f,g)|0;i=j;return n|0};case 48:{o=C0(32,c[f>>2]|0)|0;c[o>>2]=c[f>>2];p=f+12|0;q=o+4|0;if((((((E_(c[p>>2]|0,q)|0)==0?(r=o+8|0,(E_(c[p>>2]|0,r)|0)==0):0)?(E_(c[p>>2]|0,o+12|0)|0)==0:0)?(E_(c[p>>2]|0,o+16|0)|0)==0:0)?(s=o+20|0,(D_(c[p>>2]|0,s)|0)==0):0)?(R_(c[p>>2]|0,l)|0)==0:0){p=b[l>>1]|0;t=(p&65535)>>>15;u=o+24|0;c[u>>2]=t&65535;v=o+28|0;b[v>>1]=p&32767;if(!((c[r>>2]|0)!=-1|t<<16>>16==1)){t=c[f>>2]|0;ld[c[(c[t>>2]|0)+28>>2]&255](t,703568,k);c[u>>2]=1}u=f+28|0;do{if((c[f+32>>2]|0)==0){t=c[u>>2]|0;if((t|0)!=0){o0(t);D0(t)}t=(c[r>>2]|0)==-1;p=C0(24,c[f>>2]|0)|0;w=c[q>>2]|0;if(t){l0(p,w,e[v>>1]|0);c[u>>2]=p;c[p>>2]=c[f>>2];break}else{l0(p,w,c[r>>2]|0);c[u>>2]=p;c[p>>2]=c[f>>2];break}}}while(0);s0(c[u>>2]|0,(d[s>>0]|0)>>>2&1);Z_(c[f+24>>2]|0,o);c[f+16>>2]=1;m=34;break a}if((o|0)!=0){D0(o)}r=c[f>>2]|0;ld[c[(c[r>>2]|0)+24>>2]&255](r,703616,k);n=-2;i=j;return n|0};case 39:case 38:case 36:{if((c[f+16>>2]|0)==0){m=36}else{n=X_(f,g,h)|0;i=j;return n|0}break};case 51:{n=3;i=j;return n|0};case 50:{r=(c[f+12>>2]|0)+12|0;c[r>>2]=(c[r>>2]|0)+(c[g+24>>2]|0);m=34;break};case 49:{c[f+16>>2]=0;n=2;i=j;return n|0};case 0:{n=T_(f,g,h)|0;i=j;return n|0};default:{m=34}}}while(0);if((m|0)==34){n=0;i=j;return n|0}else if((m|0)==36){m=c[f>>2]|0;ld[c[(c[m>>2]|0)+24>>2]&255](m,703640,k);n=-3;i=j;return n|0}return 0}function T_(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0;g=i;i=i+16|0;h=g;j=g+4|0;k=C0(64,c[d>>2]|0)|0;l=k+0|0;m=l+64|0;do{c[l>>2]=0;l=l+4|0}while((l|0)<(m|0));c[k>>2]=c[d>>2];l=d+12|0;a:do{if((R_(c[l>>2]|0,j)|0)==0){m=b[j>>1]|0;n=m&65535;o=n&1;p=k+4|0;c[p>>2]=o;q=n>>>1&1;r=k+8|0;c[r>>2]=q;s=n>>>10&3;t=k+44|0;a[t>>0]=s;u=k+56|0;c[u>>2]=n>>>12&3;v=n>>>2&3;w=n>>>4&3;x=n&64;y=n&128;do{if((o|0)==0){n=s<<24>>24==0?8:2;z=0;while(1){if((D_(c[l>>2]|0,k+(z+45)|0)|0)!=0){A=7;break}z=z+1|0;if((z|0)>=(n|0)){A=8;break}}if((A|0)==7){n=c[d>>2]|0;ld[c[(c[n>>2]|0)+24>>2]&255](n,703664,h);B=0;C=0;D=0;E=0;F=0;G=0;H=0;I=0;J=-2;break a}else if((A|0)==8){K=c[r>>2]|0;break}}else{K=q}}while(0);b:do{if((K|0)==1?(c[u>>2]|0)==0:0){q=0;while(1){if((D_(c[l>>2]|0,k+(q+60)|0)|0)!=0){break}q=q+1|0;if((q|0)>=4){break b}}q=c[d>>2]|0;ld[c[(c[q>>2]|0)+24>>2]&255](q,703664,h);B=0;C=0;D=0;E=0;F=0;G=0;H=0;I=0;J=-2;break a}}while(0);q=k+24|0;if((E_(c[l>>2]|0,q)|0)==0?(s=k+20|0,(E_(c[l>>2]|0,s)|0)==0):0){if(!((c[q>>2]|0)>>>0>65535)?!((c[s>>2]|0)>>>0>65535):0){s=e+12|0;q=c[s>>2]|0;c:do{if((q|0)>0){o=c[e+16>>2]|0;n=0;while(1){if((O_(d,c[o+(n<<2)>>2]|0)|0)==0){break}n=n+1|0;if((n|0)>=(q|0)){break c}}n=c[d>>2]|0;ld[c[(c[n>>2]|0)+24>>2]&255](n,703784,h);B=0;C=0;D=0;E=0;F=0;G=0;H=0;I=0;J=-3;break a}}while(0);q=k+12|0;c[q>>2]=0;n=c[s>>2]|0;if((n|0)>0){o=e+16|0;z=0;L=n;n=0;M=0;while(1){N=O_(d,c[(c[o>>2]|0)+(n<<2)>>2]|0)|0;if((a[N+8>>0]&63)==0){O=z+(c[(c[N+44>>2]|0)+4>>2]|0)|0;c[q>>2]=O;P=c[s>>2]|0;Q=O;R=N}else{P=L;Q=z;R=M}n=n+1|0;if((n|0)>=(P|0)){break}else{z=Q;L=P;M=R}}if((Q|0)!=0){M=c[d>>2]|0;L=Qc[c[(c[M>>2]|0)+4>>2]&255](M,4,Q)|0;M=c[s>>2]|0;if((M|0)>0){z=M;M=0;n=0;while(1){q=O_(d,c[(c[o>>2]|0)+(n<<2)>>2]|0)|0;if((a[q+8>>0]&63)==0){N=q+44|0;q=c[N>>2]|0;c3a(L+(M<<2)|0,c[q+8>>2]|0,c[q+4>>2]<<2|0)|0;S=c[s>>2]|0;T=(c[(c[N>>2]|0)+4>>2]|0)+M|0}else{S=z;T=M}n=n+1|0;if((n|0)>=(S|0)){U=L;V=R;break}else{z=S;M=T}}}else{U=L;V=R}}else{U=0;V=R}}else{U=0;V=0}c[k+16>>2]=U;do{if((c[p>>2]|0)==1){if((v|0)==2|(w|0)==2){M=c[d>>2]|0;ld[c[(c[M>>2]|0)+24>>2]&255](M,703848,h);B=U;C=0;D=0;E=0;F=0;G=0;H=0;I=0;J=-3;break a}do{if((v|0)==0){M=C0(32,c[d>>2]|0)|0;g0(M,703920,7,0);c[M>>2]=c[d>>2];c[k+28>>2]=M;W=M;X=0;Y=0}else if((v|0)!=1){M=P_(d,e,0)|0;if((M|0)==0){z=c[d>>2]|0;ld[c[(c[z>>2]|0)+24>>2]&255](z,704104,h);B=U;C=0;D=0;E=0;F=0;G=0;H=0;I=0;J=-3;break a}else{c[k+28>>2]=c[M+44>>2];W=0;X=0;Y=1;break}}else{M=C0(32,c[d>>2]|0)|0;g0(M,704008,8,0);c[M>>2]=c[d>>2];c[k+28>>2]=M;W=0;X=M;Y=0}}while(0);do{if((w|0)==1){M=C0(32,c[d>>2]|0)|0;g0(M,704272,9,1);c[M>>2]=c[d>>2];c[k+32>>2]=M;Z=0;_=M;$=Y}else if((w|0)!=0){M=P_(d,e,Y)|0;if((M|0)==0){z=c[d>>2]|0;ld[c[(c[z>>2]|0)+24>>2]&255](z,704384,h);B=U;C=0;D=0;E=0;F=W;G=X;H=0;I=0;J=-3;break a}else{c[k+32>>2]=c[M+44>>2];Z=0;_=0;$=Y+1|0;break}}else{M=C0(32,c[d>>2]|0)|0;g0(M,704176,8,1);c[M>>2]=c[d>>2];c[k+32>>2]=M;Z=M;_=0;$=Y}}while(0);do{if((x|0)!=0){M=P_(d,e,$)|0;if((M|0)==0){z=c[d>>2]|0;ld[c[(c[z>>2]|0)+24>>2]&255](z,704520,h);B=U;C=0;D=Z;E=_;F=W;G=X;H=0;I=0;J=-3;break a}else{c[k+36>>2]=c[M+44>>2];aa=0;ba=$+1|0;break}}else{M=C0(32,c[d>>2]|0)|0;g0(M,704456,5,0);c[M>>2]=c[d>>2];c[k+36>>2]=M;aa=M;ba=$}}while(0);if((c[r>>2]|0)==1){if((y|0)!=0){M=P_(d,e,ba)|0;if((M|0)==0){z=c[d>>2]|0;ld[c[(c[z>>2]|0)+24>>2]&255](z,704600,h);B=U;C=aa;D=Z;E=_;F=W;G=X;H=0;I=0;J=-3;break a}else{c[k+40>>2]=c[M+44>>2];ca=aa;da=Z;ea=_;fa=W;ga=X;break}}else{if((aa|0)==0){M=C0(32,c[d>>2]|0)|0;g0(M,704456,5,0);c[M>>2]=c[d>>2];ha=M}else{ha=aa}c[k+40>>2]=ha;ca=ha;da=Z;ea=_;fa=W;ga=X;break}}else{ca=aa;da=Z;ea=_;fa=W;ga=X}}else{ca=0;da=0;ea=0;fa=0;ga=0}}while(0);if(!((m&256)==0|(V|0)==0)?(y=V+44|0,(c[(c[y>>2]|0)+12>>2]|0)!=0):0){if((c[p>>2]|0)==0){x=a[t>>0]|0;if(x<<24>>24==0){ia=65536}else{ia=x<<24>>24==1?8192:1024}x=c[d>>2]|0;w=Qc[c[(c[x>>2]|0)+4>>2]&255](x,8,ia)|0;c3a(w|0,c[(c[y>>2]|0)+16>>2]|0,ia<<3|0)|0;ja=w}else{ja=0}if((c[r>>2]|0)==1){w=(c[u>>2]|0)!=0?1024:8192;x=c[d>>2]|0;v=Qc[c[(c[x>>2]|0)+4>>2]&255](x,8,w)|0;c3a(v|0,c[(c[y>>2]|0)+20>>2]|0,w<<3|0)|0;ka=ja;la=v}else{ka=ja;la=0}}else{if((c[p>>2]|0)==0){v=a[t>>0]|0;if(v<<24>>24==0){ma=65536}else{ma=v<<24>>24==1?8192:1024}v=c[d>>2]|0;w=Qc[c[(c[v>>2]|0)+4>>2]&255](v,8,ma)|0;f3a(w|0,0,ma<<3|0)|0;na=w}else{na=0}if((c[r>>2]|0)==1){w=(c[u>>2]|0)!=0?1024:8192;v=c[d>>2]|0;y=Qc[c[(c[v>>2]|0)+4>>2]&255](v,8,w)|0;f3a(y|0,0,w<<3|0)|0;ka=na;la=y}else{ka=na;la=0}}c[e+40>>2]=2;if((c[p>>2]|0)==0){y=C0(24,c[d>>2]|0)|0;c[y+20>>2]=c[l>>2];m$(y);c[y>>2]=c[d>>2];w=K$(k,y,ka,la)|0;v=e+44|0;c[v>>2]=w;if((y|0)==0){oa=w}else{D0(y);oa=c[v>>2]|0}if((oa|0)==0){B=U;C=ca;D=da;E=ea;F=fa;G=ga;H=ka;I=la;J=-3;break}$_(c[l>>2]|0);v=(c[l>>2]|0)+12|0;c[v>>2]=(c[v>>2]|0)+2}else{v=L$(k,c[l>>2]|0,la,f)|0;c[e+44>>2]=v;if((v|0)==0){B=U;C=ca;D=da;E=ea;F=fa;G=ga;H=ka;I=la;J=-3;break}$_(c[l>>2]|0)}if(!((m&512)==0)){v=e+44|0;c[(c[v>>2]|0)+12>>2]=1;if((c[p>>2]|0)==0){c[(c[v>>2]|0)+16>>2]=ka}if((c[r>>2]|0)==1){c[(c[v>>2]|0)+20>>2]=la;pa=1}else{pa=1}}else{pa=0}if((k|0)!=0){D0(k)}if((U|0)!=0){v=c[d>>2]|0;Ic[c[(c[v>>2]|0)+16>>2]&511](v,U)}if((ca|0)!=0){k0(ca);D0(ca)}if((da|0)!=0){k0(da);D0(da)}if((ea|0)!=0){k0(ea);D0(ea)}if((fa|0)!=0){k0(fa);D0(fa)}if((ga|0)!=0){k0(ga);D0(ga)}if((pa|0)!=0){qa=0;i=g;return qa|0}if((ka|0)!=0){v=c[d>>2]|0;Ic[c[(c[v>>2]|0)+16>>2]&511](v,ka)}if((la|0)==0){qa=0;i=g;return qa|0}v=c[d>>2]|0;Ic[c[(c[v>>2]|0)+16>>2]&511](v,la);qa=0;i=g;return qa|0}v=c[d>>2]|0;ld[c[(c[v>>2]|0)+24>>2]&255](v,703720,h);B=0;C=0;D=0;E=0;F=0;G=0;H=0;I=0;J=-6;break}v=c[d>>2]|0;ld[c[(c[v>>2]|0)+24>>2]&255](v,703664,h);B=0;C=0;D=0;E=0;F=0;G=0;H=0;I=0;J=-2}else{v=c[d>>2]|0;ld[c[(c[v>>2]|0)+24>>2]&255](v,703664,h);B=0;C=0;D=0;E=0;F=0;G=0;H=0;I=0;J=-2}}while(0);if((k|0)!=0){D0(k)}if((B|0)!=0){k=c[d>>2]|0;Ic[c[(c[k>>2]|0)+16>>2]&511](k,B)}if((C|0)!=0){k0(C);D0(C)}if((D|0)!=0){k0(D);D0(D)}if((E|0)!=0){k0(E);D0(E)}if((F|0)!=0){k0(F);D0(F)}if((G|0)!=0){k0(G);D0(G)}if((H|0)!=0){G=c[d>>2]|0;Ic[c[(c[G>>2]|0)+16>>2]&511](G,H)}if((I|0)==0){qa=J;i=g;return qa|0}H=c[d>>2]|0;Ic[c[(c[H>>2]|0)+16>>2]&511](H,I);qa=J;i=g;return qa|0}function U_(b,f){b=b|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0;g=i;i=i+32|0;h=g;j=g+24|0;k=g+4|0;l=C0(104,c[b>>2]|0)|0;m=l+0|0;n=m+104|0;do{c[m>>2]=0;m=m+4|0}while((m|0)<(n|0));c[l>>2]=c[b>>2];a:do{if((a$(b,k)|0)==0?(m=b+12|0,(R_(c[m>>2]|0,j)|0)==0):0){c[l+12>>2]=c[k>>2];n=c[k+4>>2]|0;c[l+16>>2]=n;o=e[j>>1]|0;p=o&1;q=l+4|0;c[q>>2]=p;r=o>>>1&1;s=l+8|0;c[s>>2]=r;c[l+24>>2]=1<<(o>>>2&3);c[l+56>>2]=o>>>4&3;c[l+52>>2]=o>>>6&1;c[l+48>>2]=o>>>7&3;c[l+44>>2]=o>>>9&1;t=o>>>10;u=t&31;a[l+60>>0]=u>>>0>15?t|224:u;u=l+96|0;c[u>>2]=o>>>15;do{if((p|0)!=0){if((R_(c[m>>2]|0,j)|0)==0){o=e[j>>1]|0;v=c[s>>2]|0;w=o>>>2&3;x=o>>>4&3;y=o&3;z=o>>>8&3;A=o>>>6&3;B=o>>>10&3;C=o>>>12&3;D=o>>>14&1;break}else{o=c[b>>2]|0;ld[c[(c[o>>2]|0)+24>>2]&255](o,704680,h);E=0;F=0;G=0;H=0;I=0;J=0;K=0;L=0;M=0;N=0;O=0;P=0;Q=0;R=0;S=-2;break a}}else{v=r;w=0;x=0;y=0;z=0;A=0;B=0;C=0;D=0}}while(0);b:do{if((v|0)==1?(c[u>>2]|0)==0:0){r=0;while(1){if((D_(c[m>>2]|0,l+(r+100)|0)|0)!=0){break}r=r+1|0;if((r|0)>=4){break b}}r=c[b>>2]|0;ld[c[(c[r>>2]|0)+24>>2]&255](r,704680,h);E=0;F=0;G=0;H=0;I=0;J=0;K=0;L=0;M=0;N=0;O=0;P=0;Q=0;R=0;S=-2;break a}}while(0);if((E_(c[m>>2]|0,l+20|0)|0)!=0){r=c[b>>2]|0;ld[c[(c[r>>2]|0)+24>>2]&255](r,704680,h);E=0;F=0;G=0;H=0;I=0;J=0;K=0;L=0;M=0;N=0;O=0;P=0;Q=0;R=0;S=-2;break}r=f+12|0;p=c[r>>2]|0;c:do{if((p|0)>0){o=c[f+16>>2]|0;t=0;while(1){if((O_(b,c[o+(t<<2)>>2]|0)|0)==0){break}t=t+1|0;if((t|0)>=(p|0)){break c}}t=c[b>>2]|0;ld[c[(c[t>>2]|0)+24>>2]&255](t,704728,h);E=0;F=0;G=0;H=0;I=0;J=0;K=0;L=0;M=0;N=0;O=0;P=0;Q=0;R=0;S=-3;break a}}while(0);p=l+28|0;c[p>>2]=0;t=c[r>>2]|0;if((t|0)>0){o=f+16|0;T=0;U=t;t=0;while(1){V=O_(b,c[(c[o>>2]|0)+(t<<2)>>2]|0)|0;if((a[V+8>>0]&63)==0){W=T+(c[(c[V+44>>2]|0)+4>>2]|0)|0;c[p>>2]=W;X=c[r>>2]|0;Y=W}else{X=U;Y=T}t=t+1|0;if((t|0)>=(X|0)){break}else{T=Y;U=X}}if((Y|0)!=0){U=c[b>>2]|0;T=Qc[c[(c[U>>2]|0)+4>>2]&255](U,4,Y)|0;U=c[r>>2]|0;if((U|0)>0){t=U;U=0;W=0;while(1){V=O_(b,c[(c[o>>2]|0)+(W<<2)>>2]|0)|0;if((a[V+8>>0]&63)==0){Z=V+44|0;V=c[Z>>2]|0;c3a(T+(U<<2)|0,c[V+8>>2]|0,c[V+4>>2]<<2|0)|0;_=c[r>>2]|0;$=(c[(c[Z>>2]|0)+4>>2]|0)+U|0}else{_=t;$=U}W=W+1|0;if((W|0)>=(_|0)){break}else{t=_;U=$}}}c[l+40>>2]=T;aa=T}else{ba=31}}else{ba=31}if((ba|0)==31){c[l+40>>2]=0;aa=0}U=c[q>>2]|0;do{if((U|0)==1){t=b$(b,c[m>>2]|0,c[p>>2]|0)|0;if((t|0)==0){W=c[b>>2]|0;ld[c[(c[W>>2]|0)+24>>2]&255](W,704784,h);E=0;F=aa;G=0;H=0;I=0;J=0;K=0;L=0;M=0;N=0;O=0;P=0;Q=0;R=0;S=-3;break a}else{$_(c[m>>2]|0);c[l+32>>2]=t;ca=c[q>>2]|0;da=t;break}}else{t=c[p>>2]|0;W=0;while(1){if(1<<W>>>0<t>>>0){W=W+1|0}else{break}}a[l+36>>0]=W;ca=U;da=0}}while(0);do{if((ca|0)==1){if((y|0)==2|(A|0)==2|(z|0)==2|(B|0)==2|(C|0)==2){U=c[b>>2]|0;ld[c[(c[U>>2]|0)+24>>2]&255](U,704848,h);E=da;F=aa;G=0;H=0;I=0;J=0;K=0;L=0;M=0;N=0;O=0;P=0;Q=0;R=0;S=-3;break a}do{if((y|0)==0){U=C0(32,c[b>>2]|0)|0;g0(U,704960,14,0);c[U>>2]=c[b>>2];c[l+64>>2]=U;ea=U;fa=0;ga=0}else if((y|0)!=1){U=P_(b,f,0)|0;if((U|0)==0){p=c[b>>2]|0;ld[c[(c[p>>2]|0)+24>>2]&255](p,705312,h);E=da;F=aa;G=0;H=0;I=0;J=0;K=0;L=0;M=0;N=0;O=0;P=0;Q=0;R=0;S=-3;break a}else{c[l+64>>2]=c[U+44>>2];ea=0;fa=0;ga=1;break}}else{U=C0(32,c[b>>2]|0)|0;g0(U,705128,15,0);c[U>>2]=c[b>>2];c[l+64>>2]=U;ea=0;fa=U;ga=0}}while(0);do{if((w|0)==0){W=C0(32,c[b>>2]|0)|0;g0(W,705376,21,1);c[W>>2]=c[b>>2];c[l+68>>2]=W;ha=0;ia=W;ja=0;ka=ga}else if((w|0)==1){W=C0(32,c[b>>2]|0)|0;g0(W,705632,22,1);c[W>>2]=c[b>>2];c[l+68>>2]=W;ha=0;ia=0;ja=W;ka=ga}else if((w|0)!=2){W=P_(b,f,ga)|0;if((W|0)==0){U=c[b>>2]|0;ld[c[(c[U>>2]|0)+24>>2]&255](U,706152,h);E=da;F=aa;G=0;H=0;I=0;J=0;K=0;L=0;M=0;N=ea;O=fa;P=0;Q=0;R=0;S=-3;break a}else{c[l+68>>2]=c[W+44>>2];ha=0;ia=0;ja=0;ka=ga+1|0;break}}else{W=C0(32,c[b>>2]|0)|0;g0(W,705896,21,1);c[W>>2]=c[b>>2];c[l+68>>2]=W;ha=W;ia=0;ja=0;ka=ga}}while(0);do{if((x|0)==0){W=C0(32,c[b>>2]|0)|0;g0(W,706216,14,0);c[W>>2]=c[b>>2];c[l+72>>2]=W;la=W;ma=0;na=0;oa=ka}else if((x|0)==1){W=C0(32,c[b>>2]|0)|0;g0(W,706384,14,0);c[W>>2]=c[b>>2];c[l+72>>2]=W;la=0;ma=W;na=0;oa=ka}else if((x|0)!=2){W=P_(b,f,ka)|0;if((W|0)==0){U=c[b>>2]|0;ld[c[(c[U>>2]|0)+24>>2]&255](U,706720,h);E=da;F=aa;G=0;H=ha;I=0;J=0;K=0;L=0;M=0;N=ea;O=fa;P=ia;Q=ja;R=0;S=-3;break a}else{c[l+72>>2]=c[W+44>>2];la=0;ma=0;na=0;oa=ka+1|0;break}}else{W=C0(32,c[b>>2]|0)|0;g0(W,706552,14,0);c[W>>2]=c[b>>2];c[l+72>>2]=W;la=0;ma=0;na=W;oa=ka}}while(0);do{if((A|0)==0){W=C0(32,c[b>>2]|0)|0;g0(W,706784,7,0);c[W>>2]=c[b>>2];c[l+76>>2]=W;pa=W;qa=0;ra=oa}else if((A|0)!=1){W=P_(b,f,oa)|0;if((W|0)==0){U=c[b>>2]|0;ld[c[(c[U>>2]|0)+24>>2]&255](U,707032,h);E=da;F=aa;G=0;H=ha;I=la;J=ma;K=na;L=0;M=0;N=ea;O=fa;P=ia;Q=ja;R=0;S=-3;break a}else{c[l+76>>2]=c[W+44>>2];pa=0;qa=0;ra=oa+1|0;break}}else{W=C0(32,c[b>>2]|0)|0;g0(W,706872,13,0);c[W>>2]=c[b>>2];c[l+76>>2]=W;pa=0;qa=W;ra=oa}}while(0);do{if((z|0)==0){if((pa|0)==0){W=C0(32,c[b>>2]|0)|0;g0(W,706784,7,0);c[W>>2]=c[b>>2];sa=W}else{sa=pa}c[l+80>>2]=sa;ta=sa;ua=qa;va=ra}else if((z|0)!=1){W=P_(b,f,ra)|0;if((W|0)==0){U=c[b>>2]|0;ld[c[(c[U>>2]|0)+24>>2]&255](U,707096,h);E=da;F=aa;G=0;H=ha;I=la;J=ma;K=na;L=pa;M=qa;N=ea;O=fa;P=ia;Q=ja;R=0;S=-3;break a}else{c[l+80>>2]=c[W+44>>2];ta=pa;ua=qa;va=ra+1|0;break}}else{if((qa|0)==0){W=C0(32,c[b>>2]|0)|0;g0(W,706872,13,0);c[W>>2]=c[b>>2];wa=W}else{wa=qa}c[l+80>>2]=wa;ta=pa;ua=wa;va=ra}}while(0);do{if((B|0)==0){if((ta|0)==0){W=C0(32,c[b>>2]|0)|0;g0(W,706784,7,0);c[W>>2]=c[b>>2];xa=W}else{xa=ta}c[l+84>>2]=xa;ya=xa;za=ua;Aa=va}else if((B|0)!=1){W=P_(b,f,va)|0;if((W|0)==0){U=c[b>>2]|0;ld[c[(c[U>>2]|0)+24>>2]&255](U,707160,h);E=da;F=aa;G=0;H=ha;I=la;J=ma;K=na;L=ta;M=ua;N=ea;O=fa;P=ia;Q=ja;R=0;S=-3;break a}else{c[l+84>>2]=c[W+44>>2];ya=ta;za=ua;Aa=va+1|0;break}}else{if((ua|0)==0){W=C0(32,c[b>>2]|0)|0;g0(W,706872,13,0);c[W>>2]=c[b>>2];Ba=W}else{Ba=ua}c[l+84>>2]=Ba;ya=ta;za=Ba;Aa=va}}while(0);do{if((C|0)==0){if((ya|0)==0){W=C0(32,c[b>>2]|0)|0;g0(W,706784,7,0);c[W>>2]=c[b>>2];Ca=W}else{Ca=ya}c[l+88>>2]=Ca;Da=Ca;Ea=za;Fa=Aa}else if((C|0)!=1){W=P_(b,f,Aa)|0;if((W|0)==0){U=c[b>>2]|0;ld[c[(c[U>>2]|0)+24>>2]&255](U,707224,h);E=da;F=aa;G=0;H=ha;I=la;J=ma;K=na;L=ya;M=za;N=ea;O=fa;P=ia;Q=ja;R=0;S=-3;break a}else{c[l+88>>2]=c[W+44>>2];Da=ya;Ea=za;Fa=Aa+1|0;break}}else{if((za|0)==0){W=C0(32,c[b>>2]|0)|0;g0(W,706872,13,0);c[W>>2]=c[b>>2];Ga=W}else{Ga=za}c[l+88>>2]=Ga;Da=ya;Ea=Ga;Fa=Aa}}while(0);if((D|0)==0){W=C0(32,c[b>>2]|0)|0;g0(W,704456,5,0);c[W>>2]=c[b>>2];c[l+92>>2]=W;Ha=W;Ia=ha;Ja=la;Ka=ma;La=na;Ma=Da;Na=Ea;Oa=ea;Pa=fa;Qa=ia;Ra=ja;break}W=P_(b,f,Fa)|0;if((W|0)==0){U=c[b>>2]|0;ld[c[(c[U>>2]|0)+24>>2]&255](U,707288,h);E=da;F=aa;G=0;H=ha;I=la;J=ma;K=na;L=Da;M=Ea;N=ea;O=fa;P=ia;Q=ja;R=0;S=-3;break a}else{c[l+92>>2]=c[W+44>>2];Ha=0;Ia=ha;Ja=la;Ka=ma;La=na;Ma=Da;Na=Ea;Oa=ea;Pa=fa;Qa=ia;Ra=ja;break}}else{Ha=0;Ia=0;Ja=0;Ka=0;La=0;Ma=0;Na=0;Oa=0;Pa=0;Qa=0;Ra=0}}while(0);if((c[s>>2]|0)==1){W=(c[u>>2]|0)!=0?1024:8192;U=c[b>>2]|0;p=Qc[c[(c[U>>2]|0)+4>>2]&255](U,8,W)|0;f3a(p|0,0,W<<3|0)|0;Sa=p}else{Sa=0}if((c[q>>2]|0)==0){p=C0(24,c[b>>2]|0)|0;c[p+20>>2]=c[m>>2];m$(p);c[p>>2]=c[b>>2];c[f+40>>2]=1;W=J$(l,p,Sa,0)|0;U=f+44|0;c[U>>2]=W;if((p|0)==0){Ta=W}else{D0(p);Ta=c[U>>2]|0}if((Ta|0)==0){E=da;F=aa;G=Ha;H=Ia;I=Ja;J=Ka;K=La;L=Ma;M=Na;N=Oa;O=Pa;P=Qa;Q=Ra;R=Sa;S=-3;break}$_(c[m>>2]|0);U=(c[m>>2]|0)+12|0;c[U>>2]=(c[U>>2]|0)+2}else{c[f+40>>2]=1;U=H$(l,c[m>>2]|0,Sa)|0;c[f+44>>2]=U;if((U|0)==0){E=da;F=aa;G=Ha;H=Ia;I=Ja;J=Ka;K=La;L=Ma;M=Na;N=Oa;O=Pa;P=Qa;Q=Ra;R=Sa;S=-3;break}$_(c[m>>2]|0)}if(!((a[f+8>>0]&63)==4)){if(((c[b+32>>2]|0)==0?(U=c[b+24>>2]|0,p=c[(c[U+8>>2]|0)+((c[U+12>>2]|0)+ -1<<2)>>2]|0,(c[p+24>>2]|0)==1):0)?(U=n+(c[k+12>>2]|0)|0,W=c[b+28>>2]|0,(U|0)>(c[W+8>>2]|0)):0){B0(W,U,(d[p+20>>0]|0)>>>2&1)}p=f+44|0;y0(c[b+28>>2]|0,c[k+8>>2]|0,c[k+12>>2]|0,c[p>>2]|0,a[k+16>>0]&3);U=c[p>>2]|0;if((U|0)!=0){o0(U);D0(U)}c[p>>2]=0}if((l|0)!=0){D0(l)}if((aa|0)!=0){p=c[b>>2]|0;Ic[c[(c[p>>2]|0)+16>>2]&511](p,aa)}if((da|0)!=0){p=c[b>>2]|0;Ic[c[(c[p>>2]|0)+16>>2]&511](p,da)}if((Sa|0)!=0){p=c[b>>2]|0;Ic[c[(c[p>>2]|0)+16>>2]&511](p,Sa)}if((Ha|0)!=0){k0(Ha);D0(Ha)}if((Oa|0)!=0){k0(Oa);D0(Oa)}if((Pa|0)!=0){k0(Pa);D0(Pa)}if((Qa|0)!=0){k0(Qa);D0(Qa)}if((Ra|0)!=0){k0(Ra);D0(Ra)}if((Ia|0)!=0){k0(Ia);D0(Ia)}if((Ja|0)!=0){k0(Ja);D0(Ja)}if((Ka|0)!=0){k0(Ka);D0(Ka)}if((La|0)!=0){k0(La);D0(La)}if((Ma|0)!=0){k0(Ma);D0(Ma)}if((Na|0)==0){Ua=0;i=g;return Ua|0}k0(Na);D0(Na);Ua=0;i=g;return Ua|0}else{ba=3}}while(0);if((ba|0)==3){ba=c[b>>2]|0;ld[c[(c[ba>>2]|0)+24>>2]&255](ba,704680,h);E=0;F=0;G=0;H=0;I=0;J=0;K=0;L=0;M=0;N=0;O=0;P=0;Q=0;R=0;S=-2}if((l|0)!=0){D0(l)}if((F|0)!=0){l=c[b>>2]|0;Ic[c[(c[l>>2]|0)+16>>2]&511](l,F)}if((E|0)!=0){F=c[b>>2]|0;Ic[c[(c[F>>2]|0)+16>>2]&511](F,E)}if((R|0)!=0){E=c[b>>2]|0;Ic[c[(c[E>>2]|0)+16>>2]&511](E,R)}if((G|0)!=0){k0(G);D0(G)}if((N|0)!=0){k0(N);D0(N)}if((O|0)!=0){k0(O);D0(O)}if((P|0)!=0){k0(P);D0(P)}if((Q|0)!=0){k0(Q);D0(Q)}if((H|0)!=0){k0(H);D0(H)}if((I|0)!=0){k0(I);D0(I)}if((J|0)!=0){k0(J);D0(J)}if((K|0)!=0){k0(K);D0(K)}if((L|0)!=0){k0(L);D0(L)}if((M|0)==0){Ua=S;i=g;return Ua|0}k0(M);D0(M);Ua=S;i=g;return Ua|0}function V_(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;g=i;i=i+16|0;h=g;j=g+4|0;k=C0(20,c[b>>2]|0)|0;c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;c[k>>2]=c[b>>2];l=b+12|0;do{if((((D_(c[l>>2]|0,j)|0)==0?(D_(c[l>>2]|0,k+8|0)|0)==0:0)?(D_(c[l>>2]|0,k+9|0)|0)==0:0)?(m=k+12|0,(E_(c[l>>2]|0,m)|0)==0):0){if((c[m>>2]|0)>>>0>65535){m=c[b>>2]|0;ld[c[(c[m>>2]|0)+24>>2]&255](m,707416,h);n=-6;break}m=d[j>>0]|0;o=k+4|0;c[o>>2]=m&1;p=k+16|0;a[p>>0]=m>>>1&3;c[e+40>>2]=3;if((c[o>>2]|0)==0){o=a[p>>0]|0;if(o<<24>>24==0){q=65536}else{q=o<<24>>24==1?8192:1024}o=c[b>>2]|0;p=Qc[c[(c[o>>2]|0)+4>>2]&255](o,8,q)|0;f3a(p|0,0,q<<3|0)|0;o=C0(24,c[b>>2]|0)|0;c[o+20>>2]=c[l>>2];m$(o);c[o>>2]=c[b>>2];m=S$(k,o,p,f)|0;r=e+44|0;c[r>>2]=m;if((o|0)==0){s=m}else{D0(o);s=c[r>>2]|0}r=c[b>>2]|0;Ic[c[(c[r>>2]|0)+16>>2]&511](r,p);if((s|0)==0){n=-3;break}$_(c[l>>2]|0);p=(c[l>>2]|0)+12|0;c[p>>2]=(c[p>>2]|0)+2}else{p=U$(k,c[l>>2]|0,f)|0;c[e+44>>2]=p;if((p|0)==0){n=-3;break}$_(c[l>>2]|0)}if((k|0)==0){t=0;i=g;return t|0}D0(k);t=0;i=g;return t|0}else{u=5}}while(0);if((u|0)==5){u=c[b>>2]|0;ld[c[(c[u>>2]|0)+24>>2]&255](u,707360,h);n=-2}if((k|0)==0){t=n;i=g;return t|0}D0(k);t=n;i=g;return t|0}function W_(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;g=i;i=i+32|0;h=g;j=g+24|0;k=g+4|0;l=C0(64,c[b>>2]|0)|0;m=l+0|0;n=m+64|0;do{c[m>>2]=0;m=m+4|0}while((m|0)<(n|0));c[l>>2]=c[b>>2];do{if((((((((a$(b,k)|0)==0?(m=b+12|0,(D_(c[m>>2]|0,j)|0)==0):0)?(E_(c[m>>2]|0,l+40|0)|0)==0:0)?(E_(c[m>>2]|0,l+44|0)|0)==0:0)?(E_(c[m>>2]|0,l+48|0)|0)==0:0)?(E_(c[m>>2]|0,l+52|0)|0)==0:0)?(R_(c[m>>2]|0,l+56|0)|0)==0:0)?(R_(c[m>>2]|0,l+58|0)|0)==0:0){c[l+4>>2]=c[k>>2];n=c[k+4>>2]|0;c[l+8>>2]=n;o=d[j>>0]|0;p=l+12|0;c[p>>2]=o&1;q=l+16|0;a[q>>0]=o>>>1&3;c[l+36>>2]=o>>>3&1;c[l+32>>2]=o>>>4&7;c[l+28>>2]=o>>>7;if((c[e+12>>2]|0)!=1){o=c[b>>2]|0;ld[c[(c[o>>2]|0)+24>>2]&255](o,707520,h);r=-3;break}o=O_(b,c[c[e+16>>2]>>2]|0)|0;if((o|0)!=0?(a[o+8>>0]&63)==16:0){s=c[o+44>>2]|0;if((s|0)!=0?(o=c[s+4>>2]|0,(o|0)!=0):0){c[l+20>>2]=o;o=s+8|0;c[l+24>>2]=c[o>>2];a[l+60>>0]=c[(c[c[o>>2]>>2]|0)+4>>2];a[l+61>>0]=c[(c[c[o>>2]>>2]|0)+8>>2];c[e+40>>2]=1;if((c[p>>2]|0)==0){p=a[q>>0]|0;if(p<<24>>24==0){t=65536}else{t=p<<24>>24==1?8192:1024}p=c[b>>2]|0;q=Qc[c[(c[p>>2]|0)+4>>2]&255](p,8,t)|0;f3a(q|0,0,t<<3|0)|0;p=C0(24,c[b>>2]|0)|0;c[p+20>>2]=c[m>>2];m$(p);c[p>>2]=c[b>>2];o=O$(l,p,q,f)|0;s=e+44|0;c[s>>2]=o;if((p|0)==0){u=o}else{D0(p);u=c[s>>2]|0}s=c[b>>2]|0;Ic[c[(c[s>>2]|0)+16>>2]&511](s,q);if((u|0)==0){r=-3;break}$_(c[m>>2]|0);q=(c[m>>2]|0)+12|0;c[q>>2]=(c[q>>2]|0)+2}else{q=Q$(l,c[m>>2]|0,f)|0;c[e+44>>2]=q;if((q|0)==0){r=-3;break}$_(c[m>>2]|0)}if(!((a[e+8>>0]&63)==20)){do{if((c[b+32>>2]|0)==0){m=c[b+24>>2]|0;q=c[(c[m+8>>2]|0)+((c[m+12>>2]|0)+ -1<<2)>>2]|0;if((c[q+24>>2]|0)!=1){break}m=n+(c[k+12>>2]|0)|0;s=c[b+28>>2]|0;if((m|0)<=(c[s+8>>2]|0)){break}B0(s,m,(d[q+20>>0]|0)>>>2&1)}}while(0);n=e+44|0;y0(c[b+28>>2]|0,c[k+8>>2]|0,c[k+12>>2]|0,c[n>>2]|0,a[k+16>>0]&3);q=c[n>>2]|0;if((q|0)!=0){o0(q);D0(q)}c[n>>2]=0}if((l|0)==0){v=0;i=g;return v|0}D0(l);v=0;i=g;return v|0}n=c[b>>2]|0;ld[c[(c[n>>2]|0)+24>>2]&255](n,707656,h);r=-3;break}n=c[b>>2]|0;ld[c[(c[n>>2]|0)+24>>2]&255](n,707584,h);r=-3}else{w=9}}while(0);if((w|0)==9){w=c[b>>2]|0;ld[c[(c[w>>2]|0)+24>>2]&255](w,707464,h);r=-2}if((l|0)==0){v=r;i=g;return v|0}D0(l);v=r;i=g;return v|0}function X_(e,f,g){e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;h=i;i=i+48|0;j=h;k=h+40|0;l=h+24|0;m=h+8|0;n=e+60|0;a:do{if((c[n>>2]|0)==0){o=C0(92,c[e>>2]|0)|0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;b[o+32>>1]=0;p=o+36|0;c[p+0>>2]=0;c[p+4>>2]=0;c[p+8>>2]=0;c[p+12>>2]=0;c[p+16>>2]=0;c[n>>2]=o;c[o>>2]=c[e>>2];o=e+76|0;if((a$(e,o)|0)==0?(p=e+12|0,(D_(c[p>>2]|0,k)|0)==0):0){q=e+80|0;if((c[q>>2]|0)>=0?(r=c[o>>2]|0,(r|0)>=0):0){c[(c[n>>2]|0)+60>>2]=r;c[(c[n>>2]|0)+64>>2]=c[q>>2];q=d[k>>0]|0;c[(c[n>>2]|0)+56>>2]=q&1;a[(c[n>>2]|0)+68>>0]=q>>>1&3;c[(c[n>>2]|0)+72>>2]=q>>>3&1;q=c[n>>2]|0;b:do{if((c[q+56>>2]|0)==0){if((a[q+68>>0]|0)==0){r=q;o=0;while(1){s=o+1|0;if((D_(c[p>>2]|0,r+o+84|0)|0)!=0){break}if((s|0)>=8){break b}r=c[n>>2]|0;o=s}o=c[e>>2]|0;ld[c[(c[o>>2]|0)+24>>2]&255](o,707704,j);t=-2;break a}else{o=q;r=0;while(1){s=r+1|0;if((D_(c[p>>2]|0,o+r+84|0)|0)!=0){break}if((s|0)>=2){break b}o=c[n>>2]|0;r=s}r=c[e>>2]|0;ld[c[(c[r>>2]|0)+24>>2]&255](r,707704,j);t=-2;break a}}}while(0);c[(c[n>>2]|0)+76>>2]=0;u=19;break}p=c[e>>2]|0;ld[c[(c[p>>2]|0)+24>>2]&255](p,707752,j);t=-1;break}p=c[e>>2]|0;ld[c[(c[p>>2]|0)+24>>2]&255](p,707704,j);t=-2}else{u=19}}while(0);c:do{if((u|0)==19){c[f+40>>2]=1;j=c[n>>2]|0;do{if((c[j+56>>2]|0)==0){k=a[j+68>>0]|0;if(k<<24>>24==0){v=524288}else{v=k<<24>>24==1?65536:8192}k=e+64|0;if((c[k>>2]|0)==0){p=c[e>>2]|0;q=dd[c[c[p>>2]>>2]&511](p,v)|0;c[k>>2]=q;f3a(q|0,0,v|0)|0}q=e+56|0;if((c[q>>2]|0)==0){p=C0(24,c[e>>2]|0)|0;c[p+20>>2]=c[e+12>>2];m$(p);c[q>>2]=p;c[p>>2]=c[e>>2];p=f+44|0;r=T$(c[n>>2]|0,p,c[q>>2]|0,c[k>>2]|0,g)|0;c[e+48>>2]=r;w=p;x=r}else{r=N$(c[n>>2]|0,g)|0;c[e+48>>2]=r;w=f+44|0;x=r}r=e+48|0;if((x|0)!=3){p=c[q>>2]|0;if((p|0)!=0){D0(p)}c[q>>2]=0;q=(c[w>>2]|0)==0;p=c[e>>2]|0;Ic[c[(c[p>>2]|0)+16>>2]&511](p,c[k>>2]|0);c[k>>2]=0;if(q){c[r>>2]=-1;t=-3;break c}else{r=e+12|0;$_(c[r>>2]|0);q=(c[r>>2]|0)+12|0;c[q>>2]=(c[q>>2]|0)+2;break}}if((a[f+8>>0]&63)==36){y=0;i=h;return y|0}if(((c[e+32>>2]|0)==0?(q=c[e+24>>2]|0,r=c[(c[q+8>>2]|0)+((c[q+12>>2]|0)+ -1<<2)>>2]|0,(c[r+24>>2]|0)==1):0)?(q=(c[e+80>>2]|0)+(c[e+88>>2]|0)|0,k=c[e+28>>2]|0,(q|0)>(c[k+8>>2]|0)):0){B0(k,q,(d[r+20>>0]|0)>>>2&1)}r=(c[n>>2]|0)+40|0;c[l+0>>2]=c[r+0>>2];c[l+4>>2]=c[r+4>>2];c[l+8>>2]=c[r+8>>2];c[l+12>>2]=c[r+12>>2];z0(c[e+28>>2]|0,(c[l>>2]|0)+(c[e+84>>2]|0)|0,(c[l+4>>2]|0)+(c[e+88>>2]|0)|0,c[w>>2]|0,a[e+92>>0]&3,l);y=0;i=h;return y|0}else{r=f+44|0;q=e+12|0;if((M$(j,r,c[q>>2]|0)|0)==3){while(1){N$(c[n>>2]|0,g)|0}}if((c[r>>2]|0)==0){t=-3;break c}$_(c[q>>2]|0)}}while(0);if(!((a[f+8>>0]&63)==36)){if(((c[e+32>>2]|0)==0?(j=c[e+24>>2]|0,k=c[(c[j+8>>2]|0)+((c[j+12>>2]|0)+ -1<<2)>>2]|0,(c[k+24>>2]|0)==1):0)?(j=(c[e+80>>2]|0)+(c[e+88>>2]|0)|0,p=c[e+28>>2]|0,(j|0)>(c[p+8>>2]|0)):0){B0(p,j,(d[k+20>>0]|0)>>>2&1)}k=(c[n>>2]|0)+40|0;c[m+0>>2]=c[k+0>>2];c[m+4>>2]=c[k+4>>2];c[m+8>>2]=c[k+8>>2];c[m+12>>2]=c[k+12>>2];k=f+44|0;z0(c[e+28>>2]|0,(c[m>>2]|0)+(c[e+84>>2]|0)|0,(c[m+4>>2]|0)+(c[e+88>>2]|0)|0,c[k>>2]|0,a[e+92>>0]&3,m);j=c[k>>2]|0;if((j|0)!=0){o0(j);D0(j)}c[k>>2]=0}k=c[n>>2]|0;if((k|0)!=0){D0(k)}c[n>>2]=0;y=0;i=h;return y|0}}while(0);m=c[n>>2]|0;if((m|0)!=0){D0(m)}c[n>>2]=0;y=t;i=h;return y|0}function Y_(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;f=i;i=i+32|0;g=f;h=f+4|0;j=f+24|0;k=C0(36,c[b>>2]|0)|0;l=k+0|0;m=l+36|0;do{c[l>>2]=0;l=l+4|0}while((l|0)<(m|0));c[k>>2]=c[b>>2];a:do{if((a$(b,h)|0)==0?(l=b+12|0,(D_(c[l>>2]|0,j)|0)==0):0){c[k+4>>2]=c[h>>2];m=c[h+4>>2]|0;c[k+8>>2]=m;n=d[j>>0]|0;o=n&1;p=k+12|0;c[p>>2]=o;c[k+28>>2]=n>>>1&1;b:do{if((o|0)==0){n=0;while(1){if((D_(c[l>>2]|0,k+(n+32)|0)|0)!=0){break}n=n+1|0;if((n|0)>=4){break b}}n=c[b>>2]|0;ld[c[(c[n>>2]|0)+24>>2]&255](n,707792,g);q=-2;break a}}while(0);o=c[e+12>>2]|0;do{if((o|0)>0){n=O_(b,c[c[e+16>>2]>>2]|0)|0;if((n|0)==0){r=c[b>>2]|0;ld[c[(c[r>>2]|0)+24>>2]&255](r,707856,g);q=-3;break a}r=a[n+8>>0]&63;s=0;while(1){if(r<<24>>24==40|r<<24>>24==36|r<<24>>24==20|r<<24>>24==4){t=s;break}u=s+1|0;if((u|0)<(o|0)){s=u}else{t=u;break}}if((t|0)<(o|0)){c[k+16>>2]=c[n+44>>2];break}else{s=c[b>>2]|0;ld[c[(c[s>>2]|0)+24>>2]&255](s,707928,g);q=-3;break a}}else{c[k+16>>2]=c[b+28>>2]}}while(0);c[k+20>>2]=0;c[k+24>>2]=0;o=(c[p>>2]|0)!=0?1024:8192;s=c[b>>2]|0;r=Qc[c[(c[s>>2]|0)+4>>2]&255](s,8,o)|0;f3a(r|0,0,o<<3|0)|0;o=C0(24,c[b>>2]|0)|0;c[o+20>>2]=c[l>>2];m$(o);c[o>>2]=c[b>>2];c[e+40>>2]=1;s=C$(k,o,r)|0;u=e+44|0;c[u>>2]=s;if((o|0)==0){v=s}else{D0(o);v=c[u>>2]|0}o=c[b>>2]|0;Ic[c[(c[o>>2]|0)+16>>2]&511](o,r);if((v|0)==0){q=-3}else{$_(c[l>>2]|0);r=(c[l>>2]|0)+12|0;c[r>>2]=(c[r>>2]|0)+2;if(!((a[e+8>>0]&63)==40)){if(((c[b+32>>2]|0)==0?(r=c[b+24>>2]|0,o=c[(c[r+8>>2]|0)+((c[r+12>>2]|0)+ -1<<2)>>2]|0,(c[o+24>>2]|0)==1):0)?(r=m+(c[h+12>>2]|0)|0,s=c[b+28>>2]|0,(r|0)>(c[s+8>>2]|0)):0){B0(s,r,(d[o+20>>0]|0)>>>2&1)}y0(c[b+28>>2]|0,c[h+8>>2]|0,c[h+12>>2]|0,c[u>>2]|0,a[h+16>>0]&3);o=c[u>>2]|0;if((o|0)!=0){o0(o);D0(o)}c[u>>2]=0}if((k|0)==0){w=0;i=f;return w|0}D0(k);w=0;i=f;return w|0}}else{x=3}}while(0);if((x|0)==3){x=c[b>>2]|0;ld[c[(c[x>>2]|0)+24>>2]&255](x,707792,g);q=-2}if((k|0)==0){w=q;i=f;return w|0}D0(k);w=q;i=f;return w|0}function Z_(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;e=a+12|0;f=c[e>>2]|0;g=a+4|0;h=c[g>>2]|0;if((f|0)<(h|0)){j=f;k=c[a+8>>2]|0;l=j+1|0;c[e>>2]=l;m=k+(j<<2)|0;c[m>>2]=b;i=d;return}else{f=h+8|0;c[g>>2]=f;g=c[a>>2]|0;h=a+8|0;a=Qc[c[(c[g>>2]|0)+12>>2]&255](g,c[h>>2]|0,f<<2)|0;c[h>>2]=a;j=c[e>>2]|0;k=a;l=j+1|0;c[e>>2]=l;m=k+(j<<2)|0;c[m>>2]=b;i=d;return}}function __(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;c[b+40>>2]=4;e=C0(32,c[a>>2]|0)|0;f=a+12|0;i0(e,c[f>>2]|0);g=b+44|0;c[g>>2]=e;c[e>>2]=c[a>>2];a=c[g>>2]|0;if((c[a+28>>2]|0)!=0){$_(c[f>>2]|0);h=0;i=d;return h|0}if((a|0)!=0){k0(a);D0(a)}c[g>>2]=0;h=-3;i=d;return h|0}function $_(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+16|0;if((c[d>>2]|0)==0){i=b;return}e=a+12|0;c[e>>2]=(c[e>>2]|0)+1;c[d>>2]=0;i=b;return}function a$(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+12|0;if((E_(c[e>>2]|0,b)|0)!=0){i=d;return-2}if((E_(c[e>>2]|0,b+4|0)|0)!=0){i=d;return-2}if((E_(c[e>>2]|0,b+8|0)|0)!=0){i=d;return-2}if((E_(c[e>>2]|0,b+12|0)|0)==0){a=(D_(c[e>>2]|0,b+16|0)|0)==0;i=d;return(a?0:-2)|0}else{i=d;return-2}return 0}function b$(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;e=i;i=i+288|0;f=e+144|0;g=e+4|0;h=e;j=c[a>>2]|0;k=Qc[c[(c[j>>2]|0)+4>>2]&255](j,8,d)|0;j=0;while(1){if((c$(b,4,g+(j<<2)|0)|0)!=0){break}j=j+1|0;if((j|0)>=35){l=4;break}}a:do{if((l|0)==4){d$(a,f,g);if((d|0)>0){j=0;m=0;while(1){if((e$(b,h)|0)==0){n=0;o=0}else{break a}b:while(1){o=c[h>>2]|o<<1;n=n+1|0;p=0;while(1){if((n|0)==(c[g+(p<<2)>>2]|0)?(o|0)==(c[f+(p<<2)>>2]|0):0){break b}q=p+1|0;if((q|0)<35){p=q}else{break}}if((e$(b,h)|0)!=0){break a}}if((p|0)>=32){if((p|0)==33){if((c$(b,3,h)|0)!=0){break a}r=(c[h>>2]|0)+3|0}else if((p|0)==32){if((c$(b,2,h)|0)!=0){break a}r=(c[h>>2]|0)+3|0}else if((p|0)==34){if((c$(b,7,h)|0)!=0){break a}r=(c[h>>2]|0)+11|0}else{r=m}if((r|0)>0){q=r+j|0;if((q|0)>(d|0)){break a}s=(p|0)==32&(j|0)>0;t=k+(j+ -1<<3)|0;u=0;do{if(s){c[k+(u+j<<3)>>2]=c[t>>2]}else{c[k+(u+j<<3)>>2]=0}u=u+1|0}while((u|0)!=(r|0));v=q;w=r}else{x=r;l=27}}else{c[k+(j<<3)>>2]=p;x=0;l=27}if((l|0)==27){l=0;v=j+1|0;w=x}if((v|0)<(d|0)){j=v;m=w}else{break}}}f$(a,k,d);y=k;i=e;return y|0}}while(0);d=c[a>>2]|0;Ic[c[(c[d>>2]|0)+16>>2]&511](d,k);y=0;i=e;return y|0}function c$(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;g=a+12|0;h=a+16|0;j=(c[g>>2]<<3)+(c[h>>2]|0)|0;k=a+8|0;if(j>>>0>c[k>>2]<<3>>>0){l=-1;i=f;return l|0}c[e>>2]=0;m=c[k>>2]<<3;k=(j+b|0)>>>0>m>>>0?m-j|0:b;if((k|0)==0){l=0;i=f;return l|0}b=a+4|0;a=c[h>>2]|0;j=0;m=k;while(1){c[e>>2]=(d[(c[b>>2]|0)+(c[g>>2]|0)>>0]|0)>>>(7-a|0)&1|j;k=c[h>>2]|0;if((k|0)==7){c[g>>2]=(c[g>>2]|0)+1;n=0}else{n=k+1|0}c[h>>2]=n;k=m+ -1|0;if((k|0)==0){l=0;break}a=n;j=c[e>>2]<<1;m=k}i=f;return l|0}function d$(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;e=i;f=0;g=0;do{h=c[d+(g<<2)>>2]|0;f=(h|0)>(f|0)?h:f;g=g+1|0}while((g|0)!=35);g=c[a>>2]|0;h=f+1|0;j=Qc[c[(c[g>>2]|0)+4>>2]&255](g,4,h)|0;f3a(j|0,0,h<<2|0)|0;g=c[a>>2]|0;k=Qc[c[(c[g>>2]|0)+4>>2]&255](g,4,h)|0;g=0;do{l=j+(c[d+(g<<2)>>2]<<2)|0;c[l>>2]=(c[l>>2]|0)+1;g=g+1|0}while((g|0)!=35);c[k>>2]=0;c[j>>2]=0;if((f|0)<1){m=c[a>>2]|0;n=c[m>>2]|0;o=n+16|0;p=c[o>>2]|0;Ic[p&511](m,j);q=c[a>>2]|0;r=c[q>>2]|0;s=r+16|0;t=c[s>>2]|0;Ic[t&511](q,k);i=e;return}else{u=0;v=1}while(1){f=u+(c[k+(v+ -1<<2)>>2]|0)<<1;c[k+(v<<2)>>2]=f;g=f;f=0;while(1){if((c[d+(f<<2)>>2]|0)==(v|0)){c[b+(f<<2)>>2]=g;w=g+1|0}else{w=g}f=f+1|0;if((f|0)==35){break}else{g=w}}g=v+1|0;if((g|0)==(h|0)){break}u=c[j+(v<<2)>>2]|0;v=g}m=c[a>>2]|0;n=c[m>>2]|0;o=n+16|0;p=c[o>>2]|0;Ic[p&511](m,j);q=c[a>>2]|0;r=c[q>>2]|0;s=r+16|0;t=c[s>>2]|0;Ic[t&511](q,k);i=e;return}function e$(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;f=a+12|0;g=c[f>>2]|0;if(!(g>>>0<(c[a+8>>2]|0)>>>0)){h=-1;i=e;return h|0}j=a+16|0;c[b>>2]=(d[(c[a+4>>2]|0)+g>>0]|0)>>>(7-(c[j>>2]|0)|0)&1;g=c[j>>2]|0;if((g|0)==7){c[f>>2]=(c[f>>2]|0)+1;k=0}else{k=g+1|0}c[j>>2]=k;h=0;i=e;return h|0}function f$(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;e=i;f=(d|0)>0;if(f){g=0;h=0;while(1){j=c[b+(h<<3)>>2]|0;k=(j|0)>(g|0)?j:g;h=h+1|0;if((h|0)==(d|0)){l=k;break}else{g=k}}}else{l=0}g=c[a>>2]|0;h=l+1|0;k=Qc[c[(c[g>>2]|0)+4>>2]&255](g,4,h)|0;f3a(k|0,0,h<<2|0)|0;g=c[a>>2]|0;j=Qc[c[(c[g>>2]|0)+4>>2]&255](g,4,h)|0;if(f){g=0;do{m=k+(c[b+(g<<3)>>2]<<2)|0;c[m>>2]=(c[m>>2]|0)+1;g=g+1|0}while((g|0)!=(d|0))}c[j>>2]=0;c[k>>2]=0;if((l|0)<1){n=c[a>>2]|0;o=c[n>>2]|0;p=o+16|0;q=c[p>>2]|0;Ic[q&511](n,k);r=c[a>>2]|0;s=c[r>>2]|0;t=s+16|0;u=c[t>>2]|0;Ic[u&511](r,j);i=e;return}else{v=0;w=1}while(1){l=v+(c[j+(w+ -1<<2)>>2]|0)<<1;c[j+(w<<2)>>2]=l;if(f){g=l;l=0;while(1){if((c[b+(l<<3)>>2]|0)==(w|0)){c[b+(l<<3)+4>>2]=g;x=g+1|0}else{x=g}l=l+1|0;if((l|0)==(d|0)){break}else{g=x}}}g=w+1|0;if((g|0)==(h|0)){break}v=c[k+(w<<2)>>2]|0;w=g}n=c[a>>2]|0;o=c[n>>2]|0;p=o+16|0;q=c[p>>2]|0;Ic[q&511](n,k);r=c[a>>2]|0;s=c[r>>2]|0;t=s+16|0;u=c[t>>2]|0;Ic[u&511](r,j);i=e;return}function g$(a){a=a|0;var b=0,d=0;b=i;h$(a);d=c[a>>2]|0;Ic[c[(c[d>>2]|0)+16>>2]&511](d,c[a+8>>2]|0);i=b;return}function h$(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=a+12|0;e=c[d>>2]|0;if((e|0)<=0){c[d>>2]=0;i=b;return}f=a+8|0;a=e;e=0;while(1){g=c[(c[f>>2]|0)+(e<<2)>>2]|0;if((g|0)==0){h=a}else{I0(g);D0(g);h=c[d>>2]|0}e=e+1|0;if((e|0)>=(h|0)){break}else{a=h}}c[d>>2]=0;i=b;return}function i$(a){a=a|0;var b=0,d=0;b=i;j$(a);d=c[a>>2]|0;Ic[c[(c[d>>2]|0)+16>>2]&511](d,c[a+8>>2]|0);i=b;return}function j$(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=a+12|0;e=c[d>>2]|0;if((e|0)<=0){c[d>>2]=0;i=b;return}f=a+8|0;a=e;e=0;while(1){g=c[(c[f>>2]|0)+(e<<2)>>2]|0;if((g|0)==0){h=a}else{D0(g);h=c[d>>2]|0}e=e+1|0;if((e|0)>=(h|0)){break}else{a=h}}c[d>>2]=0;i=b;return}function k$(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;c[a+4>>2]=b;e=c[a>>2]|0;c[a+8>>2]=Qc[c[(c[e>>2]|0)+4>>2]&255](e,4,b)|0;c[a+12>>2]=0;i=d;return}function l$(a){a=a|0;var b=0,d=0;b=i;c[a+4>>2]=8;d=c[a>>2]|0;c[a+8>>2]=Qc[c[(c[d>>2]|0)+4>>2]&255](d,4,8)|0;c[a+12>>2]=0;i=b;return}function m$(b){b=b|0;var d=0,e=0,f=0;d=i;e=n$(c[b+20>>2]|0)|0;a[b+4>>0]=e;f=b+8|0;c[f>>2]=(e&255)<<16^16711680;o$(b);c[f>>2]=c[f>>2]<<7;f=b+16|0;c[f>>2]=(c[f>>2]|0)+ -7;c[b+12>>2]=32768;i=d;return}function n$(b){b=b|0;var d=0,e=0,f=0;d=i;e=c[b+12>>2]|0;if(!(e>>>0<(c[b+8>>2]|0)>>>0)){f=-1;i=d;return f|0}f=a[(c[b+4>>2]|0)+e>>0]|0;i=d;return f|0}function o$(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=b+4|0;f=b+20|0;g=c[f>>2]|0;if(!((a[e>>0]|0)==-1)){q$(g);h=n$(c[f>>2]|0)|0;a[e>>0]=h;f=b+8|0;c[f>>2]=(c[f>>2]|0)+65280-((h&255)<<8);c[b+16>>2]=8;i=d;return}h=p$(g)|0;if((h&255)>143){c[b+16>>2]=8;i=d;return}else{q$(g);a[e>>0]=h;e=b+8|0;c[e>>2]=65024-((h&255)<<9)+(c[e>>2]|0);c[b+16>>2]=7;i=d;return}}function p$(b){b=b|0;var d=0,e=0,f=0;d=i;e=(c[b+12>>2]|0)+1|0;if(!(e>>>0<(c[b+8>>2]|0)>>>0)){f=-1;i=d;return f|0}f=a[(c[b+4>>2]|0)+e>>0]|0;i=d;return f|0}function q$(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+12|0;e=c[d>>2]|0;if(!(e>>>0<(c[a+8>>2]|0)>>>0)){i=b;return}c[d>>2]=e+1;i=b;return}function r$(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=a+4|0;c[f>>2]=b;b=a+8|0;c[b>>2]=d;c[a+12>>2]=0;c[a+16>>2]=0;if(!(d>>>0>268435456)){i=e;return}c[b>>2]=0;c[f>>2]=0;i=e;return}function s$(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;g=b+60|0;h=b+64|0;if((c[g>>2]|0)!=0?(c[h>>2]|0)!=0:0){j=a[b+68>>0]|0;if(j<<24>>24==0){if((((((((a[b+84>>0]|0)==3?(a[b+85>>0]|0)==-1:0)?(a[b+86>>0]|0)==-3:0)?(a[b+87>>0]|0)==-1:0)?(a[b+88>>0]|0)==2:0)?(a[b+89>>0]|0)==-2:0)?(a[b+90>>0]|0)==-2:0)?(a[b+91>>0]|0)==-2:0){k=t$(b,d,e)|0;i=f;return k|0}k=u$(b,d,e)|0;i=f;return k|0}else if(!(j<<24>>24==1)){l=(a[b+84>>0]|0)==2;if(j<<24>>24==2){if(l?(a[b+85>>0]|0)==-1:0){k=x$(b,d,e)|0;i=f;return k|0}k=y$(b,d,e)|0;i=f;return k|0}else{if(l?(a[b+85>>0]|0)==-1:0){k=z$(b,d,e)|0;i=f;return k|0}k=A$(b,d,e)|0;i=f;return k|0}}else{if((a[b+84>>0]|0)==3?(a[b+85>>0]|0)==-1:0){k=v$(b,d,e)|0;i=f;return k|0}k=w$(b,d,e)|0;i=f;return k|0}}e=C0(24,c[b>>2]|0)|0;l0(e,c[g>>2]|0,c[h>>2]|0);c[e>>2]=c[b>>2];k=e;i=f;return k|0}function t$(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0;g=i;i=i+16|0;h=g;j=C0(24,c[b>>2]|0)|0;k=b+60|0;l=b+64|0;l0(j,c[k>>2]|0,c[l>>2]|0);c[j>>2]=c[b>>2];m=c[j+16>>2]|0;if((m|0)==0){if((j|0)!=0){o0(j);D0(j)}n=c[b>>2]|0;o=c[(c[n>>2]|0)+24>>2]|0;p=c[l>>2]|0;c[h>>2]=c[k>>2];c[h+4>>2]=p;ld[o&255](n,708008,h);q=0;i=g;return q|0}h=c[j+12>>2]|0;n=c[k>>2]|0;k=(n+7|0)>>>3;o=k+ -1|0;p=c[l>>2]&2147483647;if((p|0)==0){q=j;i=g;return q|0}l=b+72|0;b=0-(h<<1)|0;r=0-h|0;s=b|1;t=1-h|0;u=(o|0)>0;v=(n-(o<<3)|0)>0;w=f+317736|0;x=n+8-(k<<3)|0;k=0;n=0;y=m;while(1){if((c[l>>2]|0)==0){z=k}else{z=(B$(e,w)|0)^k}do{if((z|0)==1){r0(j,n,n+ -1|0)}else{if(n>>>0>1){m=d[y+b>>0]|0;A=d[y+r>>0]|0;B=m<<6&14336|A&240;C=m<<14;if(u){m=C;D=B;E=0;F=A;G=y+s|0;H=y+t|0;while(1){I=(d[G>>0]|0)<<6|m;J=d[H>>0]|0|F<<8;K=D;L=0;M=7;while(1){N=B$(e,f+(K<<3)|0)|0;L=N<<M|L&255;K=I>>>M&2048|K<<1&63470|J>>>M&16|N;if((M|0)<=0){break}else{M=M+ -1|0}}a[y+E>>0]=L;E=E+1|0;M=I<<8;if((E|0)>=(o|0)){O=M;P=K;Q=J;break}else{m=M;D=K;F=J;G=G+1|0;H=H+1|0}}}else{O=C;P=B;Q=A}H=Q<<8;if(v){G=P;F=0;D=0;while(1){m=B$(e,f+(G<<3)|0)|0;E=7-D|0;F=m<<E|F&255;D=D+1|0;if((D|0)==(x|0)){break}else{G=O>>>E&2048|G<<1&63470|H>>>E&16|m}}R=F&255}else{R=0}a[y+o>>0]=R;break}H=y+r|0;G=(n&1|0)!=0;if(G){S=d[H>>0]|0;T=y+t|0}else{S=0;T=H}H=S&240;if(u){D=H;A=0;B=S;C=T;while(1){if(G){U=d[C>>0]|0|B<<8;V=C+1|0}else{U=B;V=C}m=D;E=0;M=7;while(1){N=B$(e,f+(m<<3)|0)|0;E=N<<M|E&255;m=U>>>M&16|m<<1&63470|N;if((M|0)<=0){break}else{M=M+ -1|0}}a[y+A>>0]=E;A=A+1|0;if((A|0)>=(o|0)){W=m;X=U;break}else{D=m;B=U;C=V}}}else{W=H;X=S}C=X<<8;if(v){B=W;D=0;A=0;while(1){G=B$(e,f+(B<<3)|0)|0;F=7-A|0;D=G<<F|D&255;A=A+1|0;if((A|0)==(x|0)){break}else{B=C>>>F&16|B<<1&63470|G}}Y=D&255}else{Y=0}a[y+o>>0]=Y}}while(0);n=n+1|0;if((n|0)==(p|0)){q=j;break}else{k=z;y=y+h|0}}i=g;return q|0}function u$(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;f=i;g=C0(24,c[b>>2]|0)|0;h=b+60|0;j=b+64|0;l0(g,c[h>>2]|0,c[j>>2]|0);c[g>>2]=c[b>>2];s0(g,0);if((c[j>>2]|0)==0){i=f;return g|0}k=b+72|0;l=b+76|0;m=b+84|0;n=b+85|0;o=b+86|0;p=b+87|0;q=b+88|0;r=b+89|0;s=b+90|0;t=b+91|0;u=b+80|0;b=e+317736|0;v=0;w=0;while(1){if((c[k>>2]|0)==0){x=v}else{x=(B$(d,b)|0)^v}a:do{if((x|0)!=1){y=w+ -2|0;z=w+ -1|0;if((c[h>>2]|0)!=0){A=p0(g,0,z)|0;B=p0(g,1,z)|0;C=p0(g,2,z)|0;D=p0(g,0,y)|0;E=D<<1|(p0(g,1,y)|0);D=B<<1|C|A<<2;A=0;C=0;while(1){if((c[l>>2]|0)!=0?(p0(c[u>>2]|0,C,w)|0)!=0:0){F=0}else{B=(p0(g,(a[m>>0]|0)+C|0,(a[n>>0]|0)+w|0)|0)<<4;G=(p0(g,(a[o>>0]|0)+C|0,(a[p>>0]|0)+w|0)|0)<<10;H=(p0(g,(a[q>>0]|0)+C|0,(a[r>>0]|0)+w|0)|0)<<11;I=B$(d,e+((A|E<<12|D<<5|B|G|H|(p0(g,(a[s>>0]|0)+C|0,(a[t>>0]|0)+w|0)|0)<<15)<<3)|0)|0;if((I|0)==0){F=0}else{q0(g,C,w,I);F=I}}I=C+1|0;if(!(I>>>0<(c[h>>2]|0)>>>0)){break a}H=p0(g,C+3|0,z)|0;E=(p0(g,C+2|0,y)|0|E<<1)&7;D=(H|D<<1)&31;A=(F|A<<1)&15;C=I}}}else{r0(g,w,w+ -1|0)}}while(0);w=w+1|0;if(!(w>>>0<(c[j>>2]|0)>>>0)){break}else{v=x}}i=f;return g|0}function v$(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0;g=i;i=i+16|0;h=g;j=C0(24,c[b>>2]|0)|0;k=b+60|0;l=b+64|0;l0(j,c[k>>2]|0,c[l>>2]|0);c[j>>2]=c[b>>2];m=c[j+16>>2]|0;if((m|0)==0){if((j|0)!=0){o0(j);D0(j)}n=c[b>>2]|0;o=c[(c[n>>2]|0)+24>>2]|0;p=c[l>>2]|0;c[h>>2]=c[k>>2];c[h+4>>2]=p;ld[o&255](n,708008,h);q=0;i=g;return q|0}h=c[j+12>>2]|0;n=c[k>>2]|0;k=(n+7|0)>>>3;o=k+ -1|0;if((c[l>>2]|0)==0){q=j;i=g;return q|0}p=b+72|0;b=0-(h<<1)|0;r=0-h|0;s=b|1;t=1-h|0;u=(o|0)>0;v=(n-(o<<3)|0)>0;w=f+15528|0;x=n+8-(k<<3)|0;k=0;n=0;y=m;while(1){if((c[p>>2]|0)==0){z=k}else{z=(B$(e,w)|0)^k}do{if((z|0)==1){r0(j,n,n+ -1|0)}else{if(n>>>0>1){m=d[y+b>>0]|0;A=d[y+r>>0]|0;B=A>>>1&120|m<<4&3584;C=m<<12;if(u){m=C;D=B;E=0;F=A;G=y+s|0;H=y+t|0;while(1){I=(d[G>>0]|0)<<4|m;J=d[H>>0]|0|F<<8;K=D;L=0;M=7;while(1){N=B$(e,f+(K<<3)|0)|0;L=N<<M|L&255;K=I>>>M&512|K<<1&7670|J>>>(M+1|0)&8|N;if((M|0)<=0){break}else{M=M+ -1|0}}a[y+E>>0]=L;E=E+1|0;M=I<<8;if((E|0)>=(o|0)){O=M;P=K;Q=J;break}else{m=M;D=K;F=J;G=G+1|0;H=H+1|0}}}else{O=C;P=B;Q=A}H=Q<<8;if(v){G=P;F=0;D=0;while(1){m=B$(e,f+(G<<3)|0)|0;E=7-D|0;F=m<<E|F&255;M=D+1|0;if((M|0)==(x|0)){break}else{G=O>>>E&512|G<<1&7670|H>>>(8-D|0)&8|m;D=M}}R=F&255}else{R=0}a[y+o>>0]=R;break}D=y+r|0;H=(n&1|0)!=0;if(H){S=d[D>>0]|0;T=y+t|0}else{S=0;T=D}D=S>>>1&120;if(u){G=D;A=0;B=S;C=T;while(1){if(H){U=d[C>>0]|0|B<<8;V=C+1|0}else{U=B;V=C}M=G;m=0;E=7;while(1){N=B$(e,f+(M<<3)|0)|0;m=N<<E|m&255;M=U>>>(E+1|0)&8|M<<1&7670|N;if((E|0)<=0){break}else{E=E+ -1|0}}a[y+A>>0]=m;A=A+1|0;if((A|0)>=(o|0)){W=M;X=U;break}else{G=M;B=U;C=V}}}else{W=D;X=S}C=X<<8;if(v){B=W;G=0;A=0;while(1){H=B$(e,f+(B<<3)|0)|0;G=H<<7-A|G&255;F=A+1|0;if((F|0)==(x|0)){break}else{B=C>>>(8-A|0)&8|B<<1&7670|H;A=F}}Y=G&255}else{Y=0}a[y+o>>0]=Y}}while(0);n=n+1|0;if(!(n>>>0<(c[l>>2]|0)>>>0)){q=j;break}else{k=z;y=y+h|0}}i=g;return q|0}function w$(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;f=i;g=C0(24,c[b>>2]|0)|0;h=b+60|0;j=b+64|0;l0(g,c[h>>2]|0,c[j>>2]|0);c[g>>2]=c[b>>2];s0(g,0);if((c[j>>2]|0)==0){i=f;return g|0}k=b+72|0;l=b+76|0;m=b+84|0;n=b+85|0;o=b+80|0;b=e+15528|0;p=0;q=0;while(1){if((c[k>>2]|0)==0){r=p}else{r=(B$(d,b)|0)^p}a:do{if((r|0)!=1){s=q+ -2|0;t=q+ -1|0;if((c[h>>2]|0)!=0){u=p0(g,0,t)|0;v=p0(g,1,t)|0;w=p0(g,2,t)|0;x=p0(g,0,s)|0;y=p0(g,1,s)|0;z=y<<1|(p0(g,2,s)|0)|x<<2;x=v<<1|w|u<<2;u=0;w=0;while(1){if((c[l>>2]|0)!=0?(p0(c[o>>2]|0,w,q)|0)!=0:0){A=0}else{v=B$(d,e+((u|z<<9|x<<4|(p0(g,(a[m>>0]|0)+w|0,(a[n>>0]|0)+q|0)|0)<<3)<<3)|0)|0;if((v|0)==0){A=0}else{q0(g,w,q,v);A=v}}v=w+3|0;y=w+1|0;if(!(y>>>0<(c[h>>2]|0)>>>0)){break a}B=p0(g,v,t)|0;z=(p0(g,v,s)|0|z<<1)&15;x=(B|x<<1)&31;u=(A|u<<1)&7;w=y}}}else{r0(g,q,q+ -1|0)}}while(0);q=q+1|0;if(!(q>>>0<(c[j>>2]|0)>>>0)){break}else{p=r}}i=f;return g|0}\n\n\n\nfunction rH(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=i;i=i+32|0;h=g+24|0;j=g+8|0;k=g;if((b|0)==0){i=g;return}if((c[b>>2]|0)!=7){i=g;return}l=a+20|0;c[l>>2]=b;m=b+20|0;if((c[m>>2]|0)==-1?(n=c[b+12>>2]|0,c[h>>2]=39824,c[h+4>>2]=6,!((nI(n,h)|0)!=0&(d|0)==0)):0){c[a+4>>2]=c[b+16>>2];c[a>>2]=c[b+24>>2];i=g;return}h=c[b+16>>2]|0;if((h|0)==0){i=g;return}if(!((c[m>>2]|0)==-1)){n=w2a(h,1)|0;c[a+24>>2]=n;if((n|0)==0){i=g;return}if((DI(b,n,h)|0)==0){i=g;return}else{o=n}}else{o=c[b+24>>2]|0}n=b+32|0;if((c[n>>2]|0)==0){p=h;q=o}else{gla(j);r=c[n>>2]|0;lla(j,dd[c[(c[r>>2]|0)+12>>2]&511](r,h)|0,0);r=c[n>>2]|0;s=Qc[c[(c[r>>2]|0)+16>>2]&255](r,c[b+4>>2]|0,c[m>>2]|0)|0;m=c[n>>2]|0;ed[c[(c[m>>2]|0)+20>>2]&127](m,s,o,h,j)|0;h=c[n>>2]|0;Qc[c[(c[h>>2]|0)+24>>2]&255](h,s,j)|0;s=j+4|0;h=c[s>>2]|0;n=c[j+8>>2]|0;kla(j);ila(c[s>>2]|0);p=n;q=h}h=c[b+12>>2]|0;c[k>>2]=39824;c[k+4>>2]=6;if((nI(h,k)|0)!=0&(d|0)==0){d=a+4|0;if((zG(q,p,c[(c[l>>2]|0)+12>>2]|0,a,d,a+12|0,a+16|0,e,f)|0)==0){c[a>>2]=q;c[d>>2]=p}}else{c[a>>2]=q;c[a+4>>2]=p}p=b+24|0;if((o|0)!=(c[p>>2]|0)?(o|0)!=(c[a>>2]|0):0){v2a(o);t=a}else{t=a}if((q|0)!=(o|0)?(q|0)!=(c[t>>2]|0):0){v2a(q)}c[a+24>>2]=0;c[a+8>>2]=(c[t>>2]|0)!=(c[p>>2]|0)&1;i=g;return}function sH(a){a=a|0;var b=0,d=0,e=0;b=i;if((c[a+8>>2]|0)==0){d=c[a+20>>2]|0;if((d|0)==0){e=0}else{e=c[d+16>>2]|0}}else{e=c[a+4>>2]|0}i=b;return e|0}function tH(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((c[a+8>>2]|0)!=0){d=c[a>>2]|0;c[a>>2]=0;c[a+4>>2]=0;e=d;i=b;return e|0}d=c[a+4>>2]|0;f=w2a(d,1)|0;if((f|0)==0){e=0;i=b;return e|0}c3a(f|0,c[a>>2]|0,d|0)|0;e=f;i=b;return e|0}function uH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+32|0;e=d+4|0;f=d;g=c[b>>2]|0;if((g|0)==3){CG(a,c[b+12>>2]|0);i=d;return}else if((g|0)==4){CG(a,c[b+12>>2]|0);i=d;return}else if((g|0)==7){c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+20>>2]=0;c[e+24>>2]=0;rH(e,b,0,0,0);b=vH(e)|0;BG(f,b,sH(e)|0);Ona(a,f);Lna(f);FI(e);i=d;return}else{c[a>>2]=0;i=d;return}}function vH(a){a=a|0;var b=0,d=0,e=0;b=i;if((c[a+8>>2]|0)==0){d=c[a+20>>2]|0;if((d|0)==0){e=0}else{e=c[d+24>>2]|0}}else{e=c[a>>2]|0}i=b;return e|0}function wH(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;i=i+32|0;f=e+16|0;g=e+8|0;h=e;j=a+20|0;if((c[j>>2]|0)==-1){k=a+24|0;v2a(c[k>>2]|0);l=k}else{c[j>>2]=-1;c[a+32>>2]=0;l=a+24|0}j=w2a(d,1)|0;c[l>>2]=j;if((b|0)!=0){c3a(j|0,b|0,d|0)|0}c[a+16>>2]=d;b=a+12|0;a=c[b>>2]|0;if((a|0)==0){j=u2a(32)|0;Dh(j);c[b>>2]=j;m=j}else{m=a}c[f>>2]=669280;c[f+4>>2]=6;sI(m,f,d);d=c[b>>2]|0;c[g>>2]=39824;c[g+4>>2]=6;qI(d,g);g=c[b>>2]|0;c[h>>2]=38384;c[h+4>>2]=11;qI(g,h);i=e;return}function xH(a,b){a=a|0;b=b|0;c[a+4>>2]=0;c[a+8>>2]=0;c[a>>2]=2;c[a+12>>2]=1;c[a+16>>2]=b;return}function yH(a,b,d){a=a|0;b=b|0;d=d|0;c[a+4>>2]=0;c[a+8>>2]=0;c[a>>2]=2;c[a+12>>2]=b;c[a+16>>2]=c[d>>2];return}function zH(a,b){a=a|0;b=b|0;var d=0;d=i;c[a+4>>2]=0;c[a+8>>2]=0;c[a>>2]=2;Gna(b,a+12|0,a+16|0);i=d;return}function AH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;e=d;c[a+4>>2]=0;c[a+8>>2]=0;f=a+12|0;c[f>>2]=0;c[a>>2]=3;g=c[b>>2]|0;b=(g|0)==0;if(b){h=0}else{h=c[g+4>>2]|0}DG(e,b?1292088:g+12|0,h);ika(f,e);dka(e);c[a+16>>2]=0;i=d;return}function BH(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=c[a+16>>2]|0;e=a+12|0;a=c[e>>2]|0;if((d|0)>0){f=0}else{g=a;Jja(g);i=b;return}do{h=c[a+(f<<2)>>2]|0;if((h|0)!=0){bH(h)}f=f+1|0}while((f|0)<(d|0));g=c[e>>2]|0;Jja(g);i=b;return}function CH(a,b){a=a|0;b=b|0;var d=0;d=i;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;if((c[b>>2]|0)!=5){i=d;return}if((c[b+16>>2]|0)!=4){i=d;return}g[a>>2]=+DH(b,0);g[a+8>>2]=+DH(b,1);g[a+4>>2]=+DH(b,2);g[a+12>>2]=+DH(b,3);i=d;return}function DH(a,b){a=a|0;b=b|0;var d=0,e=0.0;d=i;if(!((c[a+16>>2]|0)>>>0>b>>>0)){e=0.0;i=d;return+e}e=+hH(Ch(a+12|0,b)|0);i=d;return+e}function EH(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,h=0.0,j=0.0,k=0.0;d=i;g[a+12>>2]=1.0;g[a>>2]=1.0;g[a+20>>2]=0.0;g[a+16>>2]=0.0;g[a+8>>2]=0.0;g[a+4>>2]=0.0;if((c[b>>2]|0)!=5){i=d;return}if((c[b+16>>2]|0)!=6){i=d;return}e=+DH(b,0);f=+DH(b,1);h=+DH(b,2);j=+DH(b,3);k=+DH(b,4);Tla(a,e,f,h,j,k,+DH(b,5));i=d;return}function FH(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if(!((c[a+16>>2]|0)>>>0>b>>>0)){e=0;i=d;return e|0}e=Ch(a+12|0,b)|0;i=d;return e|0}function GH(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if(!((c[a+16>>2]|0)>>>0>b>>>0)){e=0;i=d;return e|0}e=oH(Ch(a+12|0,b)|0)|0;i=d;return e|0}function HH(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;if((c[b+16>>2]|0)>>>0>d>>>0){dH(a,Ch(b+12|0,d)|0);i=e;return}else{c[a>>2]=0;i=e;return}}function IH(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;if((c[b+16>>2]|0)>>>0>d>>>0){gH(a,Ch(b+12|0,d)|0);i=e;return}else{c[a>>2]=0;c[a+4>>2]=0;i=e;return}}function JH(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if(!((c[a+16>>2]|0)>>>0>b>>>0)){e=0;i=d;return e|0}e=jH(Ch(a+12|0,b)|0)|0;i=d;return e|0}function KH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=GH(a,b)|0;do{if((e|0)!=0){b=c[e>>2]|0;if((b|0)==7){f=c[e+12>>2]|0;break}else if((b|0)==6){f=e;break}else{f=0;break}}else{f=0}}while(0);i=d;return f|0}function LH(a){a=a|0;var b=0,d=0,e=0;b=i;d=GH(a,1)|0;if((d|0)!=0?(c[d>>2]|0)==7:0){e=d}else{e=0}i=b;return e|0}function MH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=GH(a,b)|0;if((e|0)!=0?(c[e>>2]|0)==5:0){f=e}else{f=0}i=d;return f|0}function NH(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+12|0;if(!((c[a+16>>2]|0)>>>0>b>>>0)){i=d;return}a=Ch(e,b)|0;if((a|0)!=0){bH(a)}Oja(e,b);i=d;return}function OH(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=a+12|0;if(!((c[a+16>>2]|0)>>>0>b>>>0)){i=e;return}a=Ch(f,b)|0;if((a|0)!=0){bH(a)}a=c[d+4>>2]|0;if((a|0)==0){g=d}else{g=Il(0,a)|0}PH(f,b,g);i=e;return}function PH(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;if((b|0)>=0?(c[a+4>>2]|0)>(b|0):0){c[(c[a>>2]|0)+(b<<2)>>2]=d}i=e;return}function QH(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=c[d+4>>2]|0;if((f|0)==0){g=d}else{g=Il(0,f)|0}Fk(a+12|0,b,g);i=e;return}function RH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[b+4>>2]|0;if((e|0)==0){f=b}else{f=Il(0,e)|0}yg(a+12|0,f);i=d;return}function SH(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=u2a(16)|0;Ov(d,b);RH(a,d);i=c;return}function TH(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=u2a(20)|0;XF(d,b,0);RH(a,d);i=c;return}function UH(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=u2a(20)|0;c[e+4>>2]=0;c[e+8>>2]=0;c[e>>2]=2;c[e+12>>2]=1;c[e+16>>2]=b;RH(a,e);i=d;return}function VH(a,b){a=a|0;b=+b;var d=0,e=0;d=i;e=u2a(20)|0;c[e+4>>2]=0;c[e+8>>2]=0;c[e>>2]=2;c[e+12>>2]=0;g[e+16>>2]=b;RH(a,e);i=d;return}function WH(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=u2a(20)|0;c[f+4>>2]=0;c[f+8>>2]=0;c[f>>2]=9;c[f+12>>2]=b;c[f+16>>2]=d;RH(a,f);i=e;return}function XH(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b;e=a+12|0;a=ana(e)|0;c[d>>2]=a;if((a|0)==0){Zma(e);i=b;return}do{a=cna(e,d)|0;if((a|0)!=0){bH(a)}}while((c[d>>2]|0)!=0);Zma(e);i=b;return}function YH(a){a=a|0;var b=0,c=0;b=i;c=ana(a+12|0)|0;i=b;return c|0}function ZH(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;if((c[b>>2]|0)==0){g=0;i=e;return g|0}bna(a+12|0,b,d,f);g=c[f>>2]|0;i=e;return g|0}function _H(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;c[e>>2]=0;fna(a+12|0,b,e)|0;i=d;return c[e>>2]|0}function $H(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;c[e>>2]=0;fna(a+12|0,b,e)|0;b=c[e>>2]|0;if((b|0)==0){f=0;i=d;return f|0}f=oH(b)|0;i=d;return f|0}function aI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;c[f>>2]=0;fna(b+12|0,d,f)|0;d=c[f>>2]|0;if((d|0)==0){c[a>>2]=0;i=e;return}else{dH(a,d);i=e;return}}function bI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;c[f>>2]=0;fna(b+12|0,d,f)|0;d=c[f>>2]|0;if((d|0)==0){c[a>>2]=0;c[a+4>>2]=0;i=e;return}else{gH(a,d);i=e;return}}function cI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;c[f>>2]=0;fna(b+12|0,d,f)|0;d=c[f>>2]|0;if((d|0)==0){c[a>>2]=0;i=e;return}if((c[d>>2]|0)==9){b=oH(d)|0;c[f>>2]=b;uH(a,b);i=e;return}else{uH(a,d);i=e;return}}function dI(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;i=i+16|0;g=f;c[g>>2]=0;fna(b+12|0,d,g)|0;d=c[g>>2]|0;if((d|0)==0){jka(a,e);i=f;return}else{dH(a,d);i=f;return}}function eI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;c[e>>2]=0;fna(a+12|0,b,e)|0;b=c[e>>2]|0;if((b|0)==0){f=0;i=d;return f|0}f=jH(b)|0;i=d;return f|0}function fI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;c[f>>2]=0;fna(a+12|0,b,f)|0;b=c[f>>2]|0;if((b|0)==0){g=d;i=e;return g|0}g=jH(b)|0;i=e;return g|0}function gI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0;d=i;i=i+16|0;e=d;c[e>>2]=0;fna(a+12|0,b,e)|0;b=c[e>>2]|0;if((b|0)==0){f=0.0;i=d;return+f}f=+hH(b);i=d;return+f}function hI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;c[f>>2]=0;fna(a+12|0,b,f)|0;b=c[f>>2]|0;if((b|0)!=0?(c[b>>2]|0)==1:0){g=jH(b)|0}else{g=d}i=e;return g|0}function iI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=$H(a,b)|0;do{if((e|0)!=0){b=c[e>>2]|0;if((b|0)==6){f=e;break}else if((b|0)==7){f=c[e+12>>2]|0;break}else{f=0;break}}else{f=0}}while(0);i=d;return f|0}function jI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=$H(a,b)|0;if((e|0)!=0?(c[e>>2]|0)==5:0){f=e}else{f=0}i=d;return f|0}function kI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=$H(a,b)|0;if((e|0)!=0?(c[e>>2]|0)==7:0){f=e}else{f=0}i=d;return f|0}function lI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;f=jI(b,d)|0;if((f|0)==0){i=e;return}CH(a,f);i=e;return}function mI(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;g[a+12>>2]=1.0;g[a>>2]=1.0;g[a+20>>2]=0.0;g[a+16>>2]=0.0;g[a+8>>2]=0.0;g[a+4>>2]=0.0;e=jI(b,c)|0;if((e|0)==0){i=d;return}EH(a,e);i=d;return}function nI(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;i=i+16|0;d=fna(a+12|0,b,c)|0;i=c;return d|0}function oI(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;i=i+16|0;g=f;c[g>>2]=0;h=a+12|0;fna(h,b,g)|0;a=c[g>>2]|0;if((a|0)==(d|0)){i=f;return}if((a|0)!=0){bH(a)}if((d|0)==0){jna(h,b);i=f;return}a=c[d+4>>2]|0;if((a|0)==0){j=d}else{j=Il(e,a)|0}gna(h,b,j);i=f;return}function pI(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;ina(a+12|0,b,c);i=d;return}function qI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;c[e>>2]=0;f=a+12|0;fna(f,b,e)|0;a=c[e>>2]|0;if((a|0)==0){i=d;return}bH(a);jna(f,b);i=d;return}function rI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;c[f>>2]=0;g=a+12|0;fna(g,b,f)|0;a=c[f>>2]|0;if((a|0)==0){i=e;return}jna(g,b);gna(g,d,a);i=e;return}function sI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=u2a(20)|0;c[f+4>>2]=0;c[f+8>>2]=0;c[f>>2]=2;c[f+12>>2]=1;c[f+16>>2]=d;oI(a,b,f,0);i=e;return}function tI(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;e=u2a(16)|0;Ov(e,c);oI(a,b,e,0);i=d;return}function uI(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;e=u2a(20)|0;XF(e,c,0);oI(a,b,e,0);i=d;return}function vI(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;g=u2a(20)|0;c[g+4>>2]=0;c[g+8>>2]=0;c[g>>2]=9;c[g+12>>2]=d;c[g+16>>2]=e;oI(a,b,g,0);i=f;return}function wI(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0;e=i;f=u2a(20)|0;c[f+4>>2]=0;c[f+8>>2]=0;c[f>>2]=2;c[f+12>>2]=0;g[f+16>>2]=d;oI(a,b,f,0);i=e;return}function xI(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;e=u2a(28)|0;wl(e);VH(e,+g[c>>2]);VH(e,+g[c+8>>2]);VH(e,+g[c+4>>2]);VH(e,+g[c+12>>2]);oI(a,b,e,0);i=d;return}function yI(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;e=u2a(28)|0;wl(e);VH(e,+g[c>>2]);VH(e,+g[c+4>>2]);VH(e,+g[c+8>>2]);VH(e,+g[c+12>>2]);VH(e,+g[c+16>>2]);VH(e,+g[c+20>>2]);oI(a,b,e,0);i=d;return}function zI(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[a+4>>2]=0;c[a+8>>2]=0;c[a>>2]=7;c[a+12>>2]=e;c[a+16>>2]=d;c[a+20>>2]=-1;c[a+24>>2]=b;c[a+32>>2]=0;return}function AI(a){a=a|0;var b=0,d=0;b=i;if((c[a+20>>2]|0)==-1){v2a(c[a+24>>2]|0)}d=c[a+12>>2]|0;if((d|0)==0){i=b;return}bH(d);i=b;return}function BI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;if((b|0)!=0){e=a+12|0;f=c[e>>2]|0;if((f|0)!=0){bH(f)}c[e>>2]=b}b=a+20|0;if((c[b>>2]|0)==-1){v2a(c[a+24>>2]|0)}c[b+0>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;i=d;return}function CI(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;BI(a,b);c[a+20>>2]=-1;c[a+24>>2]=w2a(0,1)|0;c[a+16>>2]=0;b=c[a+12>>2]|0;if((b|0)==0){i=d;return}c[e>>2]=669280;c[e+4>>2]=6;sI(b,e,0);i=d;return}function DI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;if((c[a+20>>2]|0)==-1){f=c[a+24>>2]|0;if((f|0)==0){g=1;i=e;return g|0}c3a(b|0,f|0,d|0)|0;g=1;i=e;return g|0}else{f=c[a+24>>2]|0;if((f|0)==0){g=1;i=e;return g|0}g=id[c[(c[f>>2]|0)+28>>2]&511](f,b,c[a+28>>2]|0,d)|0;i=e;return g|0}return 0}function EI(a){a=a|0;var b=0;b=i;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;c[a+24>>2]=0;i=b;return}function FI(a){a=a|0;var b=0;b=i;if((c[a+8>>2]|0)!=0){v2a(c[a>>2]|0)}v2a(c[a+24>>2]|0);dka(a+12|0);i=b;return}function GI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=a+4|0;zma(e,10);f=a+28|0;c[f>>2]=b;Hma(e,1013,1);if((b|0)==0){c[a+32>>2]=0;i=d;return}else{b=c[f>>2]|0;c[a+32>>2]=Lc[c[(c[b>>2]|0)+12>>2]&255](b)|0;i=d;return}}function HI(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+16|0;d=b+8|0;e=b+4|0;f=b;g=a+4|0;h=(c[a+12>>2]|0)==0;c[d>>2]=h?0:-1;if(h){Bma(g);i=b;return}do{Cma(g,d,e,f);cH(c[f>>2]|0)}while((c[d>>2]|0)!=0);Bma(g);i=b;return}function II(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=b+4|0;f=c[e>>2]|0;if((f|0)!=0){g=f;i=d;return g|0}f=a+32|0;h=(c[f>>2]|0)+1|0;c[f>>2]=h;c[(Gma(a+4|0,h)|0)>>2]=b;c[e>>2]=c[f>>2];g=c[f>>2]|0;i=d;return g|0}function JI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+16|0;f=e;if((b|0)==0|(d|0)==0){i=e;return}c[f>>2]=0;g=a+4|0;h=b;j=(Dma(g,h,f)|0)!=0;k=c[f>>2]|0;do{if(j&(k|0)!=0){if((c[d+8>>2]|0)>>>0>(c[k+8>>2]|0)>>>0){cH(k);break}else{i=e;return}}}while(0);c[d+4>>2]=b;c[(Gma(g,h)|0)>>2]=d;d=a+32|0;if(!((c[d>>2]|0)>>>0<b>>>0)){i=e;return}c[d>>2]=b;i=e;return}function KI(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;i=i+32|0;d=b+24|0;e=b+16|0;f=b+8|0;g=b;c[d>>2]=669480;c[d+4>>2]=4;h=$H(a,d)|0;if((h|0)==0){c[e>>2]=38400;c[e+4>>2]=2;d=$H(a,e)|0;if((d|0)==0){j=0;i=b;return j|0}else{k=d}}else{k=h}dH(f,k);c[g>>2]=38408;c[g+4>>2]=3;k=vka(c[f>>2]|0,g)|0;dka(f);j=k&1;i=b;return j|0}function LI(a){a=a|0;var b=0;b=i;c[a>>2]=38424;QJ(a+8|0);zma(a+328|0,10);c[a+380>>2]=0;c[a+384>>2]=0;c[a+388>>2]=0;Ija(a+392|0,4);Ija(a+408|0,1);Ija(a+424|0,4);Ija(a+440|0,2);Ija(a+456|0,4);c[a+4>>2]=0;c[a+356>>2]=0;c[a+360>>2]=0;c[a+372>>2]=0;c[a+476>>2]=0;c[a+480>>2]=0;c[a+484>>2]=0;c[a+324>>2]=1;c[a+376>>2]=0;i=b;return}function MI(a){a=a|0;var b=0;b=i;c[a>>2]=38424;NI(a);Jja(c[a+456>>2]|0);Jja(c[a+440>>2]|0);Jja(c[a+424>>2]|0);Jja(c[a+408>>2]|0);Jja(c[a+392>>2]|0);dka(a+388|0);dka(a+384|0);dka(a+380|0);Bma(a+328|0);RJ(a+8|0);i=b;return}function NI(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+16|0;d=b+8|0;e=b+4|0;f=b;c[a+472>>2]=0;g=a+4|0;h=c[g>>2]|0;if((h|0)!=0){OG(h);v2a(h);c[g>>2]=0}g=a+356|0;h=c[g>>2]|0;if((h|0)!=0){bH(h);c[g>>2]=0}PI(a);c[a+360>>2]=0;if((c[a+324>>2]|0)!=0?(g=a+24|0,h=c[g>>2]|0,(h|0)!=0):0){Rc[c[c[h>>2]>>2]&1023](h);c[g>>2]=0}g=a+328|0;h=(c[a+336>>2]|0)==0;c[d>>2]=h?0:-1;if(!h){do{Cma(g,d,e,f);h=c[f>>2]|0;if((h|0)!=0){FI(h);v2a(h)}}while((c[d>>2]|0)!=0)}Ama(g);Kja(a+424|0,0)|0;Kja(a+392|0,0)|0;Kja(a+408|0,0)|0;Kja(a+440|0,0)|0;g=a+456|0;d=c[a+460>>2]|0;if((d|0)>0){f=0;do{e=QI(g,f)|0;if((e|0)!=0){bH(e)}f=f+1|0}while((f|0)!=(d|0))}Kja(g,0)|0;g=a+476|0;a=c[g>>2]|0;if((a|0)==0){i=b;return}bH(a);c[g>>2]=0;i=b;return}function OI(a){a=a|0;var b=0;b=c[a+396>>2]|0;return((b|0)==0?0:b+ -1|0)|0}function PI(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+48|0;e=c[d>>2]|0;if((e|0)!=0){Rc[c[(c[e>>2]|0)+4>>2]&1023](e);c[d>>2]=0}d=a+372|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}if((c[a+376>>2]|0)!=0){i=b;return}Rc[c[(c[e>>2]|0)+4>>2]&1023](e);c[d>>2]=0;i=b;return}function QI(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)>=0?(c[a+4>>2]|0)>(b|0):0){e=c[(c[a>>2]|0)+(b<<2)>>2]|0;i=d;return e|0}b=c[0]|0;da();e=b;i=d;return e|0}function RI(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=i;i=i+48|0;f=e+32|0;g=e+24|0;h=e+20|0;j=e+16|0;k=e+12|0;l=e+8|0;m=e;NI(a);c[a+368>>2]=0;n=a+364|0;c[n>>2]=0;c[a+324>>2]=1;o=SI(b)|0;if((o|0)==-1){if((b|0)==0){p=2;i=e;return p|0}Rc[c[c[b>>2]>>2]&1023](b);p=2;i=e;return p|0}q=a+8|0;TI(q,b,o);o=a+12|0;c[o>>2]=5;dd[c[c[q>>2]>>2]&511](q,f)|0;b=a+352|0;c[b>>2]=((d[f>>0]|0)*10|0)+ -480;c[o>>2]=7;dd[c[c[q>>2]>>2]&511](q,f)|0;c[b>>2]=(d[f>>0]|0)+ -48+(c[b>>2]|0);c[o>>2]=(c[a+32>>2]|0)+ -9-(c[a+28>>2]|0);b=u2a(104)|0;HG(b,a);f=a+4|0;c[f>>2]=b;c[g>>2]=38464;c[g+4>>2]=9;if((UI(q,g,4096)|0)==0){_I(a);r=1}else{c[h>>2]=c[o>>2];o=a+424|0;if((M1a(h,c[o>>2]|0,c[a+428>>2]|0,4,246)|0)==0){ph(o,c[h>>2]|0)|0}WI(j,q);dka(j);XI(l,q,k);if((c[k>>2]|0)==0){dka(l);p=2;i=e;return p|0}k=c[l>>2]|0;q=kma((k|0)==0?1305928:k+12|0)|0;c[n>>2]=q;if((YI(a,q)|0)==0?(ZI(a,c[n>>2]|0)|0)==0:0){_I(a);c[n>>2]=0;s=1}else{s=0}dka(l);r=s}s=$I(a)|0;if((s|0)!=0){p=s;i=e;return p|0}KG(c[f>>2]|0);s=c[f>>2]|0;if(!((c[s+52>>2]|0)!=0?(VG(c[s+84>>2]|0)|0)!=0:0)){if((r|0)!=0){p=2;i=e;return p|0}PI(a);_I(a);r=$I(a)|0;if((r|0)!=0){p=r;i=e;return p|0}KG(c[f>>2]|0);if((c[(c[f>>2]|0)+52>>2]|0)==0){p=2;i=e;return p|0}}N1a(c[a+424>>2]|0,c[a+428>>2]|0,4,246);if((aJ(a)|0)==0){PI(a);_I(a);if((aJ(a)|0)==0){p=2;i=e;return p|0}r=$I(a)|0;if((r|0)!=0){p=r;i=e;return p|0}}r=c[a+372>>2]|0;if((r|0)==0){p=0;i=e;return p|0}if((Lc[c[(c[r>>2]|0)+24>>2]&255](r)|0)!=0){p=0;i=e;return p|0}r=c[(c[f>>2]|0)+52>>2]|0;c[m>>2]=38480;c[m+4>>2]=8;f=_H(r,m)|0;if((f|0)==0){p=0;i=e;return p|0}if((c[f>>2]|0)!=9){p=0;i=e;return p|0}c[a+20>>2]=c[f+16>>2];p=0;i=e;return p|0}function SI(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;i=i+16|0;d=b;e=0;while(1){if((id[c[(c[a>>2]|0)+28>>2]&511](a,d,e,4)|0)==0){f=-1;g=5;break}if((c[d>>2]|0)==1178882085){f=e;g=5;break}if((e|0)>1023){f=-1;g=5;break}else{e=e+1|0}}if((g|0)==5){i=b;return f|0}return 0}function TI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=a+28|0;g=c[f>>2]|0;if((g|0)!=0){v2a(g);c[f>>2]=0}g=a+32|0;c[f>>2]=w2a(c[g>>2]|0,1)|0;c[a+20>>2]=d;d=Lc[c[(c[b>>2]|0)+16>>2]&255](b)|0;c[a+24>>2]=d;c[a+4>>2]=0;c[a+16>>2]=b;c[a+36>>2]=0;a=c[g>>2]|0;id[c[(c[b>>2]|0)+28>>2]&511](b,c[f>>2]|0,0,(a|0)>(d|0)?d:a)|0;i=e;return}function UI(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=i;i=i+16|0;g=f;h=c[d+4>>2]|0;if((h|0)==0){j=0;i=f;return j|0}k=b+4|0;l=h+ -1|0;m=c[d>>2]|0;n=(e|0)==0;o=m+l|0;p=h+ -2|0;q=l;r=c[k>>2]|0;a:while(1){if(!n?(r|0)<=((c[k>>2]|0)-e|0):0){j=0;s=13;break}if((SJ(b,r,g)|0)==0){j=0;s=13;break}t=a[g>>0]|0;do{if(t<<24>>24==(a[m+q>>0]|0)){if((q|0)<=0){if((_J(b,r,e,a[c[d>>2]>>0]|0,h)|0)==0){s=11;break}else{s=10;break a}}else{u=q+ -1|0;break}}else{s=11}}while(0);if((s|0)==11){s=0;if((r|0)<1){j=0;s=13;break}else{u=t<<24>>24==(a[o>>0]|0)?p:l}}q=u;r=r+ -1|0}if((s|0)==10){c[k>>2]=r;j=1;i=f;return j|0}else if((s|0)==13){i=f;return j|0}return 0}function VI(a,b){a=a|0;b=b|0;var d=0;d=(c[a>>2]|0)-(c[b>>2]|0)|0;return((d|0)>0?1:d>>31)|0}function WI(a,b){a=a|0;b=b|0;var d=0;d=i;TJ(b);eka(a,b+44|0,c[b+304>>2]|0);i=d;return}function XI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;TJ(b);c[d>>2]=c[b+308>>2];eka(a,b+44|0,c[b+304>>2]|0);i=e;return}function YI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;d=i;i=i+96|0;e=d+80|0;f=d+64|0;g=d+48|0;h=d+40|0;j=d+32|0;k=d+24|0;l=d+16|0;m=d+8|0;n=d;if((dJ(a,b,0,1,0)|0)==0){o=0;i=d;return o|0}p=eJ(a)|0;q=a+356|0;c[q>>2]=p;if((p|0)==0){o=0;i=d;return o|0}c[e>>2]=38520;c[e+4>>2]=4;r=fJ(p,e)|0;if((r+ -1|0)>>>0>1048575){o=0;i=d;return o|0}Kja(a+392|0,r)|0;Kja(a+408|0,r)|0;Ija(f,4);Ija(g,4);ph(f,b)|0;r=c[q>>2]|0;c[h>>2]=38528;c[h+4>>2]=7;ph(g,fJ(r,h)|0)|0;h=c[q>>2]|0;c[j>>2]=38536;c[j+4>>2]=4;a:do{if((gJ(h,j)|0)!=0?(r=c[q>>2]|0,c[k>>2]=38536,c[k+4>>2]=4,e=fJ(r,k)|0,(e|0)!=(b|0)):0){r=l+4|0;p=m+4|0;s=n+4|0;t=a+456|0;u=e;while(1){if((u|0)==0){v=8;break}hJ(f,u);dJ(a,u,0,1,0)|0;w=eJ(a)|0;if((w|0)==0){x=0;break a}c[l>>2]=38536;c[r>>2]=4;if((gJ(w,l)|0)==0){v=11;break}c[m>>2]=38536;c[p>>2]=4;e=fJ(w,m)|0;if((e|0)==(u|0)){v=13;break}c[n>>2]=38528;c[s>>2]=7;hJ(g,eI(w,n)|0);iJ(t,w);u=e}if((v|0)==8){u=f+4|0;if((c[u>>2]|0)>0){y=0}else{x=1;break}while(1){t=c[(qh(f,y)|0)>>2]|0;if((dJ(a,t,c[(qh(g,y)|0)>>2]|0,0,(y|0)==0&1)|0)==0){x=0;break a}y=y+1|0;if((y|0)>=(c[u>>2]|0)){x=1;break}}}else if((v|0)==11){bH(w);x=0;break}else if((v|0)==13){bH(w);x=0;break}}else{x=0}}while(0);Jja(c[g>>2]|0);Jja(c[f>>2]|0);o=x;i=d;return o|0}function ZI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d;c[e>>2]=b;if((rJ(a,b,e,1)|0)==0){f=0;i=d;return f|0}while(1){b=c[e>>2]|0;if((b|0)==0){break}if((rJ(a,b,e,0)|0)==0){f=0;g=5;break}}if((g|0)==5){i=d;return f|0}Hma(a+328|0,101,0);c[a+368>>2]=1;f=1;i=d;return f|0}function _I(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0;d=i;i=i+112|0;e=d+108|0;f=d+104|0;g=d+96|0;h=d+88|0;j=d+80|0;k=d+72|0;l=d+64|0;m=d+56|0;n=d+48|0;o=d+40|0;p=d+32|0;q=d+28|0;r=d+24|0;s=d+16|0;t=d+12|0;u=d+8|0;v=d+4|0;w=d;x=b+392|0;Kja(x,0)|0;y=b+408|0;Kja(y,0)|0;z=b+424|0;Kja(z,0)|0;A=b+440|0;Kja(A,0)|0;B=b+356|0;C=c[B>>2]|0;if((C|0)!=0){bH(C);c[B>>2]=0}C=w2a(4096,1)|0;D=b+8|0;E=b+28|0;F=c[E>>2]|0;G=b+32|0;H=c[G>>2]|0;if((F|0)<(H|0)){I=b+24|0;J=b+428|0;K=b+4|0;L=g+4|0;M=j+4|0;N=k+4|0;O=l+4|0;P=m+4|0;Q=n+4|0;R=b+12|0;S=o+4|0;T=b+396|0;U=b+472|0;V=b+364|0;W=p+4|0;X=H;Y=0;Z=0;_=0;$=-1;aa=-1;ba=-1;ca=0;da=F;F=0;ea=0;fa=0;while(1){ga=X-da|0;ha=ga>>>0>4096?4096:ga;ga=c[I>>2]|0;if((id[c[(c[ga>>2]|0)+28>>2]&511](ga,C,da,ha)|0)==0){ia=$;ja=aa;ka=ba;break}a:do{if((ha|0)==0){la=Y;ma=Z;na=_;oa=$;pa=aa;qa=ba;ra=ca;sa=da;ta=0;ua=F;va=ea;wa=fa}else{ga=Y;xa=Z;ya=0;za=_;Aa=$;Ba=aa;Ca=ba;Da=ca;Ea=da;Fa=F;Ga=ea;Ha=fa;while(1){Ia=a[C+ya>>0]|0;b:do{switch(Ha|0){case 6:{if((za|0)==1){Ja=Ia<<24>>24==98;Ka=ga;La=xa;Ma=ya+((Ja^1)<<31>>31)|0;Na=Ja?2:1;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=Ja?6:0;Ua=121;break b}else if((za|0)==2){Ja=Ia<<24>>24==106;Ka=ga;La=xa;Ma=ya+((Ja^1)<<31>>31)|0;Na=Ja?3:2;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=Ja?6:0;Ua=121;break b}else if((za|0)==3){Ja=a[39080+(Ia&255)>>0]|0;if(!(Ja<<24>>24==68|Ja<<24>>24==87)){Va=ya;Wa=ga;Xa=xa;Ya=3;Za=Aa;_a=Ba;$a=Ca;ab=Da;bb=Ea;cb=Fa;db=Ga;eb=0;break b}if(Da>>>0>16777216){Ka=ga;La=xa;Ma=ya;Na=3;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=0;Ua=121;break b}c[e>>2]=Fa-(c[E>>2]|0);if((M1a(e,c[z>>2]|0,c[J>>2]|0,4,246)|0)==0){ph(z,c[e>>2]|0)|0}c[f>>2]=0;Ja=c[K>>2]|0;if((Ja|0)==0){fb=0}else{fb=Ja+16|0}Ja=sJ(b,fb,c[e>>2]|0,Da,f)|0;gb=(Ja|0)!=0;if(((gb?(c[Ja>>2]|0)==7:0)?(hb=c[Ja+12>>2]|0,(hb|0)!=0):0)?(c[g>>2]=669480,c[L>>2]=4,(nI(hb,g)|0)!=0):0){c[j>>2]=669480;c[M>>2]=4;aI(h,hb,j);c[k>>2]=38552;c[N>>2]=4;do{if(vka(c[h>>2]|0,k)|0){c[l>>2]=38520;c[O>>2]=4;if((nI(hb,l)|0)==0){break}c[m>>2]=38560;c[P>>2]=4;ib=_H(hb,m)|0;if((ib|0)==0){break}if((lH(ib)|0)==0){break}jb=lH(ib)|0;c[n>>2]=38568;c[Q>>2]=5;if((_H(jb,n)|0)==0){break}jb=c[B>>2]|0;if((jb|0)!=0){bH(jb)}c[B>>2]=pH(hb,0)|0}}while(0);dka(h)}c[R>>2]=c[e>>2];c[o>>2]=38576;c[S>>2]=3;hb=tJ(D,o)|0;jb=c[f>>2]|0;ib=c[e>>2]|0;kb=jb-ib+((hb|0)==-1?0:-3-hb|0)|0;if(kb>>>0>(ha-ya|0)>>>0){lb=1;mb=ya;nb=(c[E>>2]|0)+jb|0}else{lb=0;mb=kb+ya|0;nb=Ea}do{if((c[T>>2]|0)>(Da|0)){if((c[(qh(x,Da)|0)>>2]|0)==0){ob=c[e>>2]|0;Ua=63;break}if(gb){kb=(uJ(A,Da)|0)&65535;jb=c[e>>2]|0;c[(qh(x,Da)|0)>>2]=jb;vJ(A,Da,xa&65535);if((kb|0)==(xa|0)){Ua=64;break}c[U>>2]=1;Ua=64}}else{ob=ib;Ua=63}}while(0);if((Ua|0)==63?(Ua=0,mJ(x,Da,ob),nJ(y,Da,1),oJ(A,Da,xa&65535),gb):0){Ua=64}if((Ua|0)==64){Ua=0;bH(Ja)}if((lb|0)==0){Va=mb;Wa=ga;Xa=xa;Ya=3;Za=Fa;_a=Ba;$a=Ca;ab=Da;bb=nb;cb=Fa;db=Ga;eb=0;break b}else{la=ga;ma=xa;na=3;oa=Fa;pa=Ba;qa=Ca;ra=Da;sa=nb;ta=0;ua=Fa;va=Ga;wa=0;break a}}else{Ka=ga;La=xa;Ma=ya;Na=za;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=6;Ua=121;break b}break};case 1:{ib=Ia&255;if((a[39080+ib>>0]|0)!=87){if((Ia+ -48<<24>>24&255)<10){Ka=ga;La=xa;Ma=ya;Na=za;Oa=Ba;Pa=Ca;Qa=ib+ -48|0;Ra=Ea+ya|0;Sa=Ga;Ta=2;Ua=121;break b}if(Ia<<24>>24==120){Ka=ga;La=xa;Ma=ya;Na=1;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=8;Ua=121;break b}else if(Ia<<24>>24==116){Ka=ga;La=xa;Ma=ya;Na=1;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=7;Ua=121;break b}else{Ka=ga;La=xa;Ma=ya+ -1|0;Na=za;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=0;Ua=121;break b}}else{Ka=ga;La=xa;Ma=ya;Na=za;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=1;Ua=121}break};case 5:{ib=Ia&255;if(!(Ia<<24>>24==111)){if((a[39080+ib>>0]|0)!=87){if((Ia+ -48<<24>>24&255)<10){Ka=ga;La=ib+ -48|0;Ma=ya;Na=za;Oa=Ba;Pa=Ca;Qa=xa;Ra=Ga;Sa=Ea+ya|0;Ta=4;Ua=121;break b}else{ib=Ia<<24>>24==116;Ka=ga;La=xa;Ma=((ib^1)<<31>>31)+ya|0;Na=ib?1:za;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=ib?7:0;Ua=121;break b}}else{Ka=ga;La=xa;Ma=ya;Na=za;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=5;Ua=121}}else{Ka=ga;La=xa;Ma=ya;Na=1;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=6;Ua=121}break};case 4:{ib=Ia&255;if((Ia+ -48<<24>>24&255)<10){Ka=ga;La=(xa*10|0)+ -48+ib|0;Ma=ya;Na=za;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=4;Ua=121;break b}else{kb=(a[39080+ib>>0]|0)==87;Ka=ga;La=xa;Ma=((kb^1)<<31>>31)+ya|0;Na=za;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=kb?5:0;Ua=121;break b}break};case 2:{kb=Ia&255;if((Ia+ -48<<24>>24&255)<10){Ka=ga;La=xa;Ma=ya;Na=za;Oa=Ba;Pa=Ca;Qa=(Da*10|0)+ -48+kb|0;Ra=Fa;Sa=Ga;Ta=2;Ua=121;break b}else{ib=(a[39080+kb>>0]|0)==87;Ka=ga;La=xa;Ma=((ib^1)<<31>>31)+ya|0;Na=ib?za:0;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=ib?3:14;Ua=121;break b}break};case 8:{if((za|0)==4){Ka=ga;La=xa;Ma=ya;Na=4;Oa=Ba;Pa=ya+ -4+Ea|0;Qa=Da;Ra=Fa;Sa=Ga;Ta=1;Ua=121;break b}if((Ia&255|0)==(a[38544+za>>0]|0)){Ka=ga;La=xa;Ma=ya;Na=za+1|0;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=8;Ua=121;break b}else{Ka=ga;La=xa;Ma=ya+ -1|0;Na=za;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=0;Ua=121;break b}break};case 9:{if(Ia<<24>>24==10|Ia<<24>>24==13){Ka=ga;La=xa;Ma=ya;Na=za;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=0;Ua=121}else{Ka=ga;La=xa;Ma=ya;Na=za;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=9;Ua=121}break};case 10:{if(Ia<<24>>24==40){pb=ga+1|0}else if(Ia<<24>>24==41){pb=(((ga|0)>0)<<31>>31)+ga|0}else{pb=ga}Ka=pb;La=xa;Ma=ya;Na=za;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=(pb|0)==0?0:10;Ua=121;break};case 11:{if(Ia<<24>>24==60&(za|0)==1){Ka=ga;La=xa;Ma=ya;Na=0;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=12;Ua=121}else{Ka=ga;La=xa;Ma=ya;Na=0;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=Ia<<24>>24==62?0:11;Ua=121}break};case 12:{Ka=ga;La=xa;Ma=ya+ -1|0;Na=za;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=0;Ua=121;break};case 13:{ib=a[39080+(Ia&255)>>0]|0;if(ib<<24>>24==87|ib<<24>>24==68){Ka=ga;La=xa;Ma=ya+ -1|0;Na=za;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=0;Ua=121}else{Ka=ga;La=xa;Ma=ya;Na=za;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=13;Ua=121}break};case 14:{ib=Ia&255;if((a[39080+ib>>0]|0)!=87){if(Ia<<24>>24==92|Ia<<24>>24==60|Ia<<24>>24==40|Ia<<24>>24==37){Ka=ga;La=xa;Ma=ya+ -1|0;Na=za;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=0;Ua=121;break b}if((za|0)==6){Ka=ga;La=xa;Ma=ya+ -1|0;Na=6;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=0;Ua=121;break b}else{Ka=ga;La=xa;Ma=ya;Na=((ib|0)==(a[38592+za>>0]|0)&1)+za|0;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=14;Ua=121;break b}}else{Ka=ga;La=xa;Ma=ya;Na=za;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=0;Ua=121}break};case 3:{ib=Ia&255;if((Ia+ -48<<24>>24&255)<10){Ka=ga;La=ib+ -48|0;Ma=ya;Na=za;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ea+ya|0;Ta=4;Ua=121;break b}if((a[39080+ib>>0]|0)==87){Ka=ga;La=xa;Ma=ya;Na=za;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=3;Ua=121}else{ib=Ia<<24>>24==116;Ka=ga;La=xa;Ma=((ib^1)<<31>>31)+ya|0;Na=ib?1:za;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=ib?7:0;Ua=121}break};case 0:{ib=(Ia+ -48<<24>>24&255)<10;kb=Ia<<24>>24==37;jb=Ia<<24>>24==40;hb=Ia<<24>>24==60;qb=Ia<<24>>24==116;Ka=jb?1:ga;La=xa;Ma=(ib<<31>>31)+ya|0;Na=qb?1:hb?1:kb?0:za;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=qb?7:Ia<<24>>24==92?13:hb?11:jb?10:kb?9:ib?1:(a[39080+(Ia&255)>>0]|0)==87&1;Ua=121;break};case 7:{ib=Ia&255;if((za|0)!=7){if((ib|0)==(a[38584+za>>0]|0)){Ka=ga;La=xa;Ma=ya;Na=za+1|0;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=7;Ua=121;break b}else{Ka=ga;La=xa;Ma=ya+ -1|0;Na=za;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=0;Ua=121;break b}}kb=a[39080+ib>>0]|0;c:do{if(kb<<24>>24==68|kb<<24>>24==87){ib=Ea+ya|0;jb=ib+ -7|0;c[R>>2]=ib-(c[E>>2]|0);ib=c[K>>2]|0;if((ib|0)==0){rb=0}else{rb=ib+16|0}ib=wJ(D,rb,0,0,0,0,1)|0;if((ib|0)==0){sb=jb}else{hb=c[ib>>2]|0;if((hb|0)==7){tb=7;ub=c[ib+12>>2]|0}else if((hb|0)==6){tb=6;ub=ib}else{bH(ib);sb=jb;break}if((ub|0)==0){bH(ib);sb=jb;break}if((c[B>>2]|0)==0){if((tb|0)==7){c[B>>2]=pH(ub,0)|0;bH(ib)}else{c[B>>2]=ub}hb=c[R>>2]|0;WI(t,D);if((Zka(c[t>>2]|0,38464,9)|0)==0){c[u>>2]=0;XI(v,D,u);if((c[u>>2]|0)!=0){qb=c[v>>2]|0;c[V>>2]=gma((qb|0)==0?1305928:qb+12|0)|0}dka(v)}c[R>>2]=hb;dka(t);sb=jb;break}c[p>>2]=38560;c[W>>2]=4;hb=_H(ub,p)|0;d:do{if((hb|0)!=0){do{if((c[hb>>2]|0)==9){qb=c[hb+16>>2]|0;if(!((c[T>>2]|0)>>>0>qb>>>0)){break}if((xJ(x,qb)|0)!=0){break d}}}while(0);bH(ib);sb=jb;break c}}while(0);hb=YH(ub)|0;c[q>>2]=hb;if((hb|0)!=0){do{c[r>>2]=0;hb=ZH(ub,q,r)|0;qb=c[B>>2]|0;oe(s,r);vb=pH(hb,0)|0;hb=c[K>>2]|0;if((hb|0)==0){wb=0}else{wb=hb+16|0}oI(qb,s,vb,wb);dka(r)}while((c[q>>2]|0)!=0)}bH(ib);sb=jb}}else{sb=Ba}}while(0);Ka=ga;La=xa;Ma=ya+ -1|0;Na=7;Oa=sb;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=0;Ua=121;break};default:{Ka=ga;La=xa;Ma=ya;Na=za;Oa=Ba;Pa=Ca;Qa=Da;Ra=Fa;Sa=Ga;Ta=Ha;Ua=121}}}while(0);if((Ua|0)==121){Ua=0;Va=Ma+1|0;Wa=Ka;Xa=La;Ya=Na;Za=Aa;_a=Oa;$a=Pa;ab=Qa;bb=Ea;cb=Ra;db=Sa;eb=Ta}if(Va>>>0<ha>>>0){ga=Wa;xa=Xa;ya=Va;za=Ya;Aa=Za;Ba=_a;Ca=$a;Da=ab;Ea=bb;Fa=cb;Ga=db;Ha=eb}else{la=Wa;ma=Xa;na=Ya;oa=Za;pa=_a;qa=$a;ra=ab;sa=bb;ta=ha;ua=cb;va=db;wa=eb;break a}}}}while(0);da=sa+ta|0;X=c[G>>2]|0;if((da|0)>=(X|0)){ia=oa;ja=pa;ka=qa;break}else{Y=la;Z=ma;_=na;$=oa;aa=pa;ba=qa;ca=ra;F=ua;ea=va;fa=wa}}if(!((ka|0)!=-1&(ka|0)>(ia|0))){if((ja|0)==-1|(ka|0)<(ia|0)){xb=J;yb=z;zb=c[G>>2]|0}else{xb=J;yb=z;zb=ja}}else{xb=J;yb=z;zb=ka}}else{xb=b+428|0;yb=z;zb=H}c[w>>2]=zb-(c[E>>2]|0);if((M1a(w,c[yb>>2]|0,c[xb>>2]|0,4,246)|0)!=0){v2a(C);i=d;return}ph(z,c[w>>2]|0)|0;v2a(C);i=d;return}function $I(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;i=i+32|0;d=b+24|0;e=b+16|0;f=b+8|0;g=b;PI(a);h=a+360|0;c[h>>2]=0;j=c[a+356>>2]|0;if((j|0)==0){k=2;i=b;return k|0}c[d>>2]=38496;c[d+4>>2]=7;l=_H(j,d)|0;do{if((l|0)!=0){d=c[l>>2]|0;if((d|0)==6){c[h>>2]=l;break}else if((d|0)!=9){break}d=fH((c[a+4>>2]|0)+16|0,c[l+16>>2]|0,0)|0;if((d|0)!=0){c[h>>2]=lH(d)|0}}}while(0);if((c[a+376>>2]|0)!=0){l=a+372|0;d=c[l>>2]|0;if((d|0)==0){k=4;i=b;return k|0}if((Qc[c[(c[d>>2]|0)+8>>2]&255](d,a,c[h>>2]|0)|0)==0){k=4;i=b;return k|0}d=c[l>>2]|0;j=Lc[c[(c[d>>2]|0)+28>>2]&255](d)|0;if((Qc[c[(c[j>>2]|0)+8>>2]&255](j,c[h>>2]|0,c[l>>2]|0)|0)!=0){c[a+48>>2]=j;k=0;i=b;return k|0}if((j|0)==0){k=4;i=b;return k|0}Rc[c[(c[j>>2]|0)+4>>2]&1023](j);k=4;i=b;return k|0}j=c[h>>2]|0;if((j|0)==0){k=0;i=b;return k|0}c[f>>2]=39824;c[f+4>>2]=6;aI(e,j,f);c[g>>2]=38504;c[g+4>>2]=8;do{if(vka(c[e>>2]|0,g)|0?(f=OP()|0,(f|0)!=0):0){if((Qc[c[(c[f>>2]|0)+8>>2]&255](f,a,c[h>>2]|0)|0)==0){Rc[c[(c[f>>2]|0)+4>>2]&1023](f);m=3;break}j=a+372|0;c[j>>2]=f;l=Lc[c[(c[f>>2]|0)+28>>2]&255](f)|0;if((Qc[c[(c[l>>2]|0)+8>>2]&255](l,c[h>>2]|0,c[j>>2]|0)|0)==0){if((l|0)==0){m=4;break}Rc[c[(c[l>>2]|0)+4>>2]&1023](l);m=4;break}else{c[a+48>>2]=l;dka(e);k=0;i=b;return k|0}}else{m=4}}while(0);dka(e);k=m;i=b;return k|0}function aJ(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;i=i+16|0;d=b;e=c[a+356>>2]|0;if(((e|0)!=0?(c[d>>2]=38560,c[d+4>>2]=4,a=_H(e,d)|0,(a|0)!=0):0)?(c[a>>2]|0)==9:0){f=c[a+16>>2]|0}else{f=0}i=b;return f|0}function bJ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=b+392|0;if(!((c[b+396>>2]|0)>>>0>d>>>0)){g=0;i=e;return g|0}h=b+408|0;if((a[(cJ(h,d)|0)>>0]|0)==1){g=c[(qh(f,d)|0)>>2]|0;i=e;return g|0}if((a[(cJ(h,d)|0)>>0]|0)!=2){g=0;i=e;return g|0}g=c[(qh(f,c[(qh(f,d)|0)>>2]|0)|0)>>2]|0;i=e;return g|0}function cJ(b,d){b=b|0;d=d|0;var e=0;e=i;if(!((d|0)>=0?(c[b+4>>2]|0)>(d|0):0)){a[0]=0;da()}i=e;return(c[b>>2]|0)+d|0}function dJ(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0;h=i;i=i+32|0;j=h+24|0;k=h+20|0;l=h+16|0;m=h+8|0;n=h+4|0;o=h;c[j>>2]=d;c[k>>2]=e;e=b+8|0;p=b+12|0;c[p>>2]=d;WI(l,e);c[m>>2]=38544;c[m+4>>2]=4;d=vka(c[l>>2]|0,m)|0;dka(l);if(!d){q=0;i=h;return q|0}d=b+424|0;l=b+428|0;if((M1a(j,c[d>>2]|0,c[l>>2]|0,4,246)|0)==0){ph(d,c[j>>2]|0)|0}if((c[k>>2]|0)!=0?(M1a(k,c[d>>2]|0,c[l>>2]|0,4,246)|0)==0:0){ph(d,c[k>>2]|0)|0}j=c[p>>2]|0;XI(o,e,n);m=c[o>>2]|0;a:do{if((m|0)!=0){r=b+484|0;s=(f|0)==0;t=(g|0)!=0&1;u=b+392|0;v=b+408|0;w=b+472|0;x=b+440|0;y=b+32|0;z=m;A=j;b:while(1){if((c[z+4>>2]|0)==0){break a}if((c[n>>2]|0)==0){break}B=gma((z|0)==0?1305928:z+12|0)|0;if(B>>>0>1048575){break a}C=pJ(e)|0;qJ(e);D=c[p>>2]|0;c[r>>2]=B;if(s){E=w2a(20481,1)|0;a[E+20480>>0]=0;F=C>>>10;G=F+1|0;H=C&1023;I=1;J=t;K=0;L=B;while(1){B=(K|0)==(F|0)?H:1024;lJ(e,E,B*20|0)|0;if((B|0)==0){M=I;N=J;O=L}else{P=K<<10;Q=I;R=J;S=0;T=L;while(1){U=S+P+T|0;V=S*20|0;W=E+V|0;if((a[E+(V+17)>>0]|0)==102){X=(R|0)==0?U:0;if((Q|0)==0){Y=X;Z=T}else{_=kma(W)|0;$=(gma(E+(V+11)|0)|0)!=65535|(_|0)!=0|(T|0)==0;Y=$?X:0;Z=(($^1)<<31>>31)+T|0}mJ(u,Y,0);nJ(v,Y,0);aa=0;ba=Z}else{$=kma(W)|0;if(($|0)==0){W=0;do{if(((a[E+(W+V)>>0]|0)+ -48<<24>>24&255)>9){ca=23;break b}W=W+1|0}while((W|0)<10)}mJ(u,U,$);W=gma(E+(V+11)|0)|0;if((W|0)>0){c[w>>2]=1}oJ(x,U,W&65535);W=c[(qh(u,U)|0)>>2]|0;do{if((W|0)<(c[y>>2]|0)){X=qh(u,U)|0;if((M1a(X,c[d>>2]|0,c[l>>2]|0,4,246)|0)!=0){break}ph(d,c[(qh(u,U)|0)>>2]|0)|0}}while(0);nJ(v,U,1);aa=R;ba=T}S=S+1|0;if((S|0)>=(B|0)){M=0;N=aa;O=ba;break}else{Q=0;R=aa;T=ba}}}K=K+1|0;if((K|0)>=(G|0)){break}else{I=M;J=N;L=O}}v2a(E)}c[p>>2]=D+(C*20|0);dka(o);L=c[p>>2]|0;XI(o,e,n);z=c[o>>2]|0;if((z|0)==0){break a}else{A=L}}if((ca|0)==23){v2a(E);break}c[p>>2]=A;dka(o);z=c[k>>2]|0;if((z|0)!=0?(rJ(b,z,k,0)|0)==0:0){q=0;i=h;return q|0}q=1;i=h;return q|0}}while(0);dka(o);q=0;i=h;return q|0}function eJ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;i=i+16|0;d=b+8|0;e=b;f=a+8|0;WI(d,f);c[e>>2]=38584;c[e+4>>2]=7;g=vka(c[d>>2]|0,e)|0;dka(d);if(!g){h=0;i=b;return h|0}g=c[a+4>>2]|0;if((g|0)==0){j=0}else{j=g+16|0}g=wJ(f,j,0,0,0,0,1)|0;if((g|0)==0){h=0;i=b;return h|0}if((c[g>>2]|0)==6){h=g;i=b;return h|0}else{bH(g);h=0;i=b;return h|0}return 0}function fJ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=_H(a,b)|0;if((e|0)!=0?(c[e>>2]|0)==2:0){f=kH(e)|0}else{f=0}i=d;return f|0}function gJ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=_H(a,b)|0;if((e|0)==0){f=1;i=d;return f|0}f=(c[e>>2]|0)==2&1;i=d;return f|0}function hJ(a,b){a=a|0;b=b|0;var d=0;d=i;if((Nja(a,0)|0)==0){i=d;return}c[c[a>>2]>>2]=b;i=d;return}function iJ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+4|0;f=c[e>>2]|0;g=f+1|0;do{if((f|0)>=(c[a+8>>2]|0)){if((Kja(a,g)|0)==0){i=d;return}else{h=c[e>>2]|0;break}}else{c[e>>2]=g;h=g}}while(0);c[(c[a>>2]|0)+(h+ -1<<2)>>2]=b;i=d;return}function jJ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;i=i+80|0;f=e+64|0;g=e+48|0;h=e+32|0;j=e+24|0;k=e+16|0;l=e+8|0;m=e;if((kJ(a,b,d)|0)==0){n=0;i=e;return n|0}d=eJ(a)|0;o=a+356|0;c[o>>2]=d;if((d|0)==0){n=0;i=e;return n|0}c[f>>2]=38520;c[f+4>>2]=4;if((fJ(d,f)|0)==0){n=0;i=e;return n|0}Ija(g,4);Ija(h,4);ph(g,b)|0;b=c[o>>2]|0;c[j>>2]=38528;c[j+4>>2]=7;ph(h,fJ(b,j)|0)|0;j=c[o>>2]|0;c[k>>2]=38536;c[k+4>>2]=4;o=l+4|0;b=m+4|0;f=a+456|0;d=fJ(j,k)|0;while(1){if((d|0)==0){p=6;break}hJ(g,d);dJ(a,d,0,1,0)|0;k=eJ(a)|0;if((k|0)==0){q=0;break}c[l>>2]=38536;c[o>>2]=4;j=fJ(k,l)|0;c[m>>2]=38528;c[b>>2]=7;hJ(h,eI(k,m)|0);iJ(f,k);d=j}a:do{if((p|0)==6){d=g+4|0;if((c[d>>2]|0)>1){f=1;while(1){m=c[(qh(g,f)|0)>>2]|0;if((dJ(a,m,c[(qh(h,f)|0)>>2]|0,0,0)|0)==0){q=0;break a}f=f+1|0;if((f|0)>=(c[d>>2]|0)){q=1;break}}}else{q=1}}}while(0);Jja(c[h>>2]|0);Jja(c[g>>2]|0);n=q;i=e;return n|0}function kJ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;f=i;i=i+16|0;g=f;c[g>>2]=d;h=b+8|0;j=d-(c[b+28>>2]|0)|0;d=b+12|0;c[d>>2]=j;k=b+424|0;l=b+428|0;if((M1a(g,c[k>>2]|0,c[l>>2]|0,4,246)|0)==0){ph(k,c[g>>2]|0)|0;m=k}else{m=k}g=c[d>>2]|0;n=w2a(20481,1)|0;a[n+20480>>0]=0;o=e>>>10;p=o+1|0;q=e&1023;r=b+32|0;s=b+392|0;t=b+408|0;u=b+472|0;v=b+440|0;b=0;a:while(1){w=(b|0)==(o|0)?q:1024;x=w*20|0;if((x+j|0)>(c[r>>2]|0)){y=6;break}if((lJ(h,n,x)|0)==0){y=10;break}if((w|0)!=0){x=b<<10;z=0;do{A=z+x|0;B=z*20|0;if((a[n+(B+17)>>0]|0)==102){mJ(s,A,0);nJ(t,A,0)}else{C=gma(n+B|0)|0;if((C|0)==0){D=0;do{if(((a[n+(D+B)>>0]|0)+ -48<<24>>24&255)>9){y=16;break a}D=D+1|0}while((D|0)<10)}mJ(s,A,C);D=gma(n+(B+11)|0)|0;if((D|0)>0){c[u>>2]=1}oJ(v,A,D&65535);D=c[(qh(s,A)|0)>>2]|0;if((D|0)<(c[r>>2]|0)?(D=qh(s,A)|0,(M1a(D,c[k>>2]|0,c[l>>2]|0,4,246)|0)==0):0){ph(m,c[(qh(s,A)|0)>>2]|0)|0}nJ(t,A,1)}z=z+1|0}while((z|0)<(w|0))}b=b+1|0;if((b|0)>=(p|0)){y=25;break}}if((y|0)==6){v2a(n);E=0;i=f;return E|0}else if((y|0)==10){v2a(n);E=0;i=f;return E|0}else if((y|0)==16){v2a(n);E=0;i=f;return E|0}else if((y|0)==25){v2a(n);c[d>>2]=g+(e*20|0);E=1;i=f;return E|0}return 0}function lJ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=c[a+16>>2]|0;g=a+4|0;if((id[c[(c[f>>2]|0)+28>>2]&511](f,b,(c[a+20>>2]|0)+(c[g>>2]|0)|0,d)|0)==0){h=0;i=e;return h|0}c[g>>2]=(c[g>>2]|0)+d;h=1;i=e;return h|0}function mJ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;if((b|0)<0){i=e;return}if((c[a+4>>2]|0)<=(b|0)?(Kja(a,b+1|0)|0)==0:0){i=e;return}c[(c[a>>2]|0)+(b<<2)>>2]=d;i=e;return}function nJ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=i;if((d|0)<0){i=f;return}if((c[b+4>>2]|0)<=(d|0)?(Kja(b,d+1|0)|0)==0:0){i=f;return}a[(c[b>>2]|0)+d>>0]=e;i=f;return}function oJ(a,d,e){a=a|0;d=d|0;e=e|0;var f=0;f=i;if((d|0)<0){i=f;return}if((c[a+4>>2]|0)<=(d|0)?(Kja(a,d+1|0)|0)==0:0){i=f;return}b[(c[a>>2]|0)+(d<<1)>>1]=e;i=f;return}function pJ(b){b=b|0;var d=0,e=0;d=i;TJ(b);if((c[b+308>>2]|0)==0){e=0;i=d;return e|0}a[b+(c[b+304>>2]|0)+44>>0]=0;e=gma(b+44|0)|0;i=d;return e|0}function qJ(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;i=i+16|0;e=d;if((dd[c[c[b>>2]>>2]&511](b,e)|0)==0){i=d;return}f=a[e>>0]|0;g=b+4|0;h=b+312|0;j=f&255;k=f;a:while(1){if((a[39080+j>>0]|0)==87){c[h>>2]=c[g>>2];if((dd[c[c[b>>2]>>2]&511](b,e)|0)==0){l=11;break}f=a[e>>0]|0;j=f&255;k=f;continue}if(!(k<<24>>24==37)){l=10;break}do{if((dd[c[c[b>>2]>>2]&511](b,e)|0)==0){l=11;break a}m=a[e>>0]|0}while(!(m<<24>>24==10|m<<24>>24==13));j=m&255;k=m}if((l|0)==10){c[g>>2]=(c[g>>2]|0)+ -1;i=d;return}else if((l|0)==11){i=d;return}}function rJ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;g=i;i=i+112|0;h=g+96|0;j=g+88|0;k=g+72|0;l=g+56|0;m=g+48|0;n=g+40|0;o=g+8|0;p=g+4|0;q=g;r=b+4|0;s=c[r>>2]|0;if((s|0)==0){t=0}else{t=s+16|0}s=yJ(b,t,d,0,0)|0;if((s|0)==0){u=0;i=g;return u|0}d=c[r>>2]|0;if((d|0)!=0){JI(d+16|0,c[s+4>>2]|0,s)}if((c[s>>2]|0)!=7){u=0;i=g;return u|0}d=s+12|0;r=c[d>>2]|0;c[h>>2]=38536;c[h+4>>2]=4;c[e>>2]=eI(r,h)|0;h=c[d>>2]|0;c[j>>2]=38520;c[j+4>>2]=4;r=eI(h,j)|0;if((r|0)<0){bH(s);u=0;i=g;return u|0}if((f|0)!=0){c[b+356>>2]=pH(c[d>>2]|0,0)|0;Kja(b+392|0,r)|0;f=b+408|0;if((Kja(f,r)|0)!=0){f3a(c[f>>2]|0,0,r|0)|0}}else{iJ(b+456|0,pH(c[d>>2]|0,0)|0)}Ija(k,4);Ija(l,4);f=c[d>>2]|0;c[m>>2]=38600;c[m+4>>2]=5;j=jI(f,m)|0;if((j|0)!=0){m=j+16|0;if((c[m>>2]|0)==0){v=0}else{f=0;do{ax(k,JH(j,f)|0);f=f+1|0;w=c[m>>2]|0}while(f>>>0<w>>>0);v=w>>>1}}else{ax(k,0);ax(k,r);v=1}r=c[d>>2]|0;c[n>>2]=1274880;c[n+4>>2]=1;d=jI(r,n)|0;do{if((d|0)==0){bH(s);x=0}else{n=d+16|0;if((c[n>>2]|0)!=0){r=0;w=0;do{ax(l,JH(d,r)|0);if(((c[(zJ(l,r)|0)>>2]|0)+w|0)>>>0<w>>>0){y=22;break}w=(c[(zJ(l,r)|0)>>2]|0)+w|0;r=r+1|0}while(r>>>0<(c[n>>2]|0)>>>0);if((y|0)==22){bH(s);x=0;break}if((w|0)!=0?(n=c[l+4>>2]|0,(n|0)>=3):0){EI(o);rH(o,s,0,0,0);r=vH(o)|0;f=sH(o)|0;a:do{if((v|0)==0){y=64}else{m=b+484|0;j=b+408|0;h=b+412|0;e=b+392|0;t=b+424|0;z=b+428|0;A=(n|0)>0;B=c[l>>2]|0;C=0;D=0;b:while(1){E=C<<1;F=c[(zJ(k,E)|0)>>2]|0;do{if(((F|0)>=0?(c[m>>2]=F,G=c[(zJ(k,E|1)|0)>>2]|0,H=G+D|0,!(H>>>0<D>>>0|(H|0)==0)):0)?!((ca(H,w)|0)>>>0>f>>>0?1:w>>>0>=(4294967295/(H>>>0)|0)>>>0):0){I=G+F|0;if(I>>>0<F>>>0){J=D;break}if(I>>>0>(c[h>>2]|0)>>>0){J=D;break}if((G|0)==0){J=H;break}else{K=0}while(1){I=ca(K+D|0,w)|0;if(!A){a[0]=0;da()}L=c[B>>2]|0;if((L|0)==0){M=1}else{if(A){N=L}else{a[0]=0;da();N=c[B>>2]|0}M=AJ(r+I|0,N)|0}L=K+F|0;do{if((a[(cJ(j,L)|0)>>0]|0)==-1){if(A){O=r+((c[B>>2]|0)+I)|0;if((n|0)>1){P=O}else{Q=O;y=45}}else{a[0]=0;da();Q=r+((c[B>>2]|0)+I)|0;y=45}if((y|0)==45){y=0;a[0]=0;da();P=Q}O=AJ(P,c[B+4>>2]|0)|0;c[p>>2]=O;c[(qh(e,L)|0)>>2]=O;if((M1a(p,c[t>>2]|0,c[z>>2]|0,4,246)|0)!=0){break}ph(t,c[p>>2]|0)|0}else{if((a[(cJ(j,L)|0)>>0]|0)!=0){break}a[(cJ(j,L)|0)>>0]=M;if((M|0)==0){c[(qh(e,L)|0)>>2]=0;break}if(A){O=r+((c[B>>2]|0)+I)|0;if((n|0)>1){R=O}else{S=O;y=54}}else{a[0]=0;da();S=r+((c[B>>2]|0)+I)|0;y=54}if((y|0)==54){y=0;a[0]=0;da();R=S}O=AJ(R,c[B+4>>2]|0)|0;c[q>>2]=O;c[(qh(e,L)|0)>>2]=O;if((M|0)==1){if((M1a(q,c[t>>2]|0,c[z>>2]|0,4,246)|0)!=0){break}ph(t,c[q>>2]|0)|0;break}O=c[q>>2]|0;if((O|0)<0){break b}if((O|0)>=(c[h>>2]|0)){break b}a[(cJ(j,O)|0)>>0]=-1}}while(0);K=K+1|0;if(!(K>>>0<G>>>0)){J=H;break}}}else{J=D}}while(0);C=C+1|0;if(!(C>>>0<v>>>0)){y=64;break a}else{D=J}}bH(s);T=0}}while(0);if((y|0)==64){bH(s);T=1}FI(o);x=T;break}}bH(s);x=0}}while(0);Jja(c[l>>2]|0);Jja(c[k>>2]|0);u=x;i=g;return u|0}function sJ(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;i=i+32|0;h=g+20|0;j=g+16|0;k=g+12|0;l=g+8|0;m=g;n=a+8|0;o=a+12|0;a=c[o>>2]|0;c[o>>2]=d;XI(j,n,h);if((c[h>>2]|0)==0){c[o>>2]=a;p=0;dka(j);i=g;return p|0}d=c[j>>2]|0;if(!((e|0)==0|(gma((d|0)==0?1305928:d+12|0)|0)==(e|0))){c[o>>2]=a;p=0;dka(j);i=g;return p|0}XI(k,n,h);ika(j,k);dka(k);if((c[h>>2]|0)==0){c[o>>2]=a;p=0;dka(j);i=g;return p|0}h=c[j>>2]|0;k=gma((h|0)==0?1305928:h+12|0)|0;WI(l,n);c[m>>2]=38576;c[m+4>>2]=3;h=vka(c[l>>2]|0,m)|0;dka(l);if(!h){c[o>>2]=a;p=0;dka(j);i=g;return p|0}h=IJ(n,b,e,k)|0;if((f|0)!=0){c[f>>2]=c[o>>2]}c[o>>2]=a;p=h;dka(j);i=g;return p|0}function tJ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+16|0;f=e;g=c[d+4>>2]|0;h=b+4|0;j=c[h>>2]|0;if((dd[c[c[b>>2]>>2]&511](b,f)|0)==0){k=-1;i=e;return k|0}l=(j|0)==0;m=0;while(1){n=a[f>>0]|0;o=c[d>>2]|0;if(n<<24>>24==(a[o+m>>0]|0)){p=m+1|0;if((p|0)==(g|0)){q=5;break}else{r=p}}else{r=n<<24>>24==(a[o>>0]|0)&1}if(!l?(c[h>>2]|0)==(j|0):0){k=-1;q=10;break}if((dd[c[c[b>>2]>>2]&511](b,f)|0)==0){k=-1;q=10;break}else{m=r}}if((q|0)==5){k=(c[h>>2]|0)-(j+g)|0;i=e;return k|0}else if((q|0)==10){i=e;return k|0}return 0}function uJ(a,d){a=a|0;d=d|0;var e=0,f=0;e=i;if((d|0)>=0?(c[a+4>>2]|0)>(d|0):0){f=b[(c[a>>2]|0)+(d<<1)>>1]|0;i=e;return f|0}d=b[0]|0;da();f=d;i=e;return f|0}function vJ(a,d,e){a=a|0;d=d|0;e=e|0;var f=0;f=i;if((d|0)>=0?(c[a+4>>2]|0)>(d|0):0){b[(c[a>>2]|0)+(d<<1)>>1]=e}i=f;return}function wJ(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0;k=i;i=i+240|0;l=k+228|0;m=k+224|0;n=k+220|0;o=k+216|0;p=k+208|0;q=k+200|0;r=k+192|0;s=k+184|0;t=k+176|0;u=k+168|0;v=k+160|0;w=k+152|0;x=k+144|0;y=k+136|0;z=k+128|0;A=k+120|0;B=k+112|0;C=k+104|0;D=k+96|0;E=k+92|0;F=k+88|0;G=k+80|0;H=k+72|0;I=k+64|0;J=k+56|0;K=k+48|0;L=k+40|0;M=k+32|0;N=k+24|0;O=k+20|0;P=k+16|0;Q=k+8|0;R=k;if((g|0)>64){S=0;i=k;return S|0}T=b+4|0;U=c[T>>2]|0;V=(h|0)!=0;if(V){W=(c[h>>2]&1|0)!=0}else{W=0}XI(m,b,l);X=c[m>>2]|0;do{if((X|0)!=0?(c[X+4>>2]|0)!=0:0){if((c[l>>2]|0)!=0){Y=c[T>>2]|0;XI(n,b,l);if((c[l>>2]|0)==0){c[T>>2]=Y;if(W){Z=2}else{oe(r,m);Z=NF(r)|0}}else{XI(o,b,l);c[p>>2]=669016;c[p+4>>2]=1;if(vka(c[o>>2]|0,p)|0){if(W){_=9}else{_=Il(d,gma(X+12|0)|0)|0}}else{c[T>>2]=Y;if(W){_=2}else{oe(q,m);_=NF(q)|0}}dka(o);Z=_}dka(n);$=Z;break}c[s>>2]=1273800;c[s+4>>2]=4;if(!(vka(X,s)|0)?(c[t>>2]=38688,c[t+4>>2]=5,!(vka(X,t)|0)):0){c[v>>2]=38696;c[v+4>>2]=4;if(vka(X,v)|0){if(W){$=8;break}$=KF()|0;break}c[w>>2]=38704;c[w+4>>2]=1;if(vka(X,w)|0){if(W){$=3;break}UJ(x,b);Y=c[b+40>>2]|0;if(!((Y|0)==0|(j|0)==0)){_P(Y,e,f,x)}Y=OF(x,0)|0;dka(x);$=Y;break}c[y>>2]=38712;c[y+4>>2]=1;if(vka(X,y)|0){if(W){$=3;break}VJ(z,b);Y=c[b+40>>2]|0;if(!((Y|0)==0|(j|0)==0)){_P(Y,e,f,z)}Y=OF(z,1)|0;dka(z);$=Y;break}c[A>>2]=1292048;c[A+4>>2]=1;if(vka(X,A)|0){if(W){$=5;break}Y=Sn()|0;aa=g+1|0;while(1){ba=wJ(b,d,e,f,aa,0,1)|0;if((ba|0)==0){break}RH(Y,ba)}$=Y;break}if((a[X+12>>0]|0)==47){if(W){$=4;break}aa=(c[b+304>>2]|0)+ -1|0;c[C>>2]=b+45;c[C+4>>2]=aa;sL(B,C);aa=nv(B)|0;dka(B);$=aa;break}c[D>>2]=39376;c[D+4>>2]=2;if(!(vka(X,D)|0)){c[R>>2]=39384;c[R+4>>2]=2;if(!(vka(X,R)|0)){$=0;break}c[T>>2]=U;$=0;break}if(W){$=6;break}if(V){c[h+4>>2]=U}aa=Wm()|0;ba=(aa|0)==0;ca=G+4|0;da=H+4|0;ea=J+4|0;fa=g+1|0;ga=0;ha=0;while(1){XI(F,b,E);ia=c[F>>2]|0;if((ia|0)==0){ja=50;break}ka=c[ia+4>>2]|0;if((ka|0)==0){ja=50;break}la=c[T>>2]|0;c[G>>2]=39384;c[ca>>2]=2;if(vka(ia,G)|0){break}c[H>>2]=38592;c[da>>2]=6;if(vka(ia,H)|0){ja=54;break}a:do{if((a[ia+12>>0]|0)==47){ma=ha+1|0;uL(I,F);ika(F,I);dka(I);c[J>>2]=38720;c[ea>>2]=9;na=c[F>>2]|0;if(vka(na,J)|0){oa=c[T>>2]|0}else{oa=ga}pa=wJ(b,d,e,f,fa,0,1)|0;if((pa|0)==0){qa=oa;ra=ma;break}do{if((na|0)==0){if((ma|0)<32){sa=1305929|0;ta=-1;ja=64}else{ua=1305929|0;va=-1;ja=65}}else{wa=c[na+4>>2]|0;if((wa|0)!=1){xa=na+13|0;ya=wa+ -1|0;if((ma|0)<32){sa=xa;ta=ya;ja=64;break}else{ua=xa;va=ya;ja=65;break}}else{yF(K,na+13|0,0);oI(aa,K,pa,0);qa=oa;ra=ma;break a}}}while(0);if((ja|0)==64){ja=0;yF(L,sa,ta);oI(aa,L,pa,0);qa=oa;ra=ma;break}else if((ja|0)==65){ja=0;yF(M,ua,va);pI(aa,M,pa);qa=oa;ra=ma;break}}else{qa=ga;ra=ha}}while(0);dka(F);ga=qa;ha=ra}if((ja|0)==50){if(!ba){bH(aa)}dka(F);$=0;break}else if((ja|0)==54){c[T>>2]=la-ka}dka(F);if((KI(aa)|0)!=0){ha=c[T>>2]|0;c[T>>2]=ga;ea=wJ(b,d,e,f,fa,0,0)|0;c[N>>2]=38736;c[N+4>>2]=8;oI(aa,N,ea,0);c[T>>2]=ha}if(V?(c[h+8>>2]=c[T>>2],(c[h>>2]&2|0)!=0):0){$=aa;break}ha=c[T>>2]|0;XI(P,b,O);c[Q>>2]=38752;c[Q+4>>2]=6;do{if(vka(c[P>>2]|0,Q)|0){ea=XJ(b,aa,h,e,f)|0;if((ea|0)!=0){za=ea;break}if(ba){za=0;break}bH(aa);za=0}else{c[T>>2]=ha;za=aa}}while(0);dka(P);$=za;break}if(W){$=1}else{c[u>>2]=1273800;c[u+4>>2]=4;$=JF((vka(X,u)|0)&1)|0}}else{$=0}}while(0);dka(m);S=$;i=k;return S|0}function xJ(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)>=0?(c[a+4>>2]|0)>(b|0):0){e=c[(c[a>>2]|0)+(b<<2)>>2]|0;i=d;return e|0}b=c[0]|0;da();e=b;i=d;return e|0}function yJ(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;g=i;i=i+32|0;h=g+28|0;j=g+24|0;k=g+20|0;l=g+16|0;m=g+8|0;n=g;o=a+8|0;p=a+12|0;a=c[p>>2]|0;c[p>>2]=d;XI(j,o,h);if((c[h>>2]|0)==0){c[p>>2]=a;q=0;dka(j);i=g;return q|0}d=c[j>>2]|0;r=gma((d|0)==0?1305928:d+12|0)|0;d=(e|0)!=0;if(!((r|0)==(e|0)|d^1)){c[p>>2]=a;q=0;dka(j);i=g;return q|0}XI(k,o,h);ika(j,k);dka(k);if((c[h>>2]|0)==0){c[p>>2]=a;q=0;dka(j);i=g;return q|0}h=c[j>>2]|0;k=gma((h|0)==0?1305928:h+12|0)|0;WI(l,o);c[m>>2]=38576;c[m+4>>2]=3;h=vka(c[l>>2]|0,m)|0;dka(l);if(!h){c[p>>2]=a;q=0;dka(j);i=g;return q|0}h=wJ(o,b,e,k,0,f,1)|0;WI(n,o);c[p>>2]=a;if(!((h|0)==0|d)){c[h+4>>2]=r;c[h+8>>2]=k}dka(n);q=h;dka(j);i=g;return q|0}function zJ(b,d){b=b|0;d=d|0;var e=0;e=i;if(!((d|0)>=0?(c[b+4>>2]|0)>(d|0):0)){a[0]=0;da()}i=e;return(c[b>>2]|0)+(d<<2)|0}function AJ(a,b){a=a|0;b=b|0;var c=0,e=0,f=0,g=0,h=0;c=i;if((b|0)>0){e=0;f=0;while(1){g=d[a+e>>0]|0|f<<8;e=e+1|0;if((e|0)==(b|0)){h=g;break}else{f=g}}}else{h=0}i=c;return h|0}function BJ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;i=i+16|0;d=b+8|0;e=b;f=a+356|0;g=c[f>>2]|0;if((g|0)==0){h=0;i=b;return h|0}c[d>>2]=38608;c[d+4>>2]=2;j=_H(g,d)|0;if((j|0)==0){h=0;i=b;return h|0}d=c[j>>2]|0;do{if((d|0)==9){g=CJ(a,0,c[j+16>>2]|0,0)|0;k=c[f>>2]|0;c[e>>2]=38608;c[e+4>>2]=2;oI(k,e,g,0);if((g|0)==0){h=0;i=b;return h|0}else{l=c[g>>2]|0;m=g;break}}else{l=d;m=j}}while(0);if((l|0)!=5){h=0;i=b;return h|0}h=m;i=b;return h|0}function CJ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=i;i=i+336|0;h=g+328|0;j=g+320|0;k=g;l=b+392|0;if(!((c[b+396>>2]|0)>>>0>e>>>0)){m=0;i=g;return m|0}n=b+408|0;if((a[(cJ(n,e)|0)>>0]|0)!=1?!((a[(cJ(n,e)|0)>>0]|0)==-1):0){if((a[(cJ(n,e)|0)>>0]|0)!=2){m=0;i=g;return m|0}n=GJ(b,c[(qh(l,e)|0)>>2]|0)|0;if((n|0)==0){m=0;i=g;return m|0}o=n+20|0;p=c[o>>2]|0;if((p|0)==0){q=0}else{q=c[p+12>>2]|0}c[h>>2]=1274672;c[h+4>>2]=1;p=eI(q,h)|0;h=c[o>>2]|0;if((h|0)==0){r=0}else{r=c[h+12>>2]|0}c[j>>2]=38640;c[j+4>>2]=5;h=eI(r,j)|0;QJ(k);j=vH(n)|0;r=soa(j,sH(n)|0)|0;TI(k,r,0);a:do{if((p|0)==0){s=0}else{n=p;while(1){j=pJ(k)|0;t=pJ(k)|0;n=n+ -1|0;if((j|0)==(e|0)){break}if((n|0)==0){s=0;break a}}c[k+4>>2]=t+h;s=wJ(k,d,0,0,0,f,1)|0}}while(0);Rc[c[c[r>>2]>>2]&1023](r);c[k>>2]=38680;v2a(c[k+28>>2]|0);m=s;i=g;return m|0}s=c[(qh(l,e)|0)>>2]|0;if((s|0)<1){m=0;i=g;return m|0}m=yJ(b,d,s,e,f)|0;i=g;return m|0}function DJ(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;i=i+16|0;d=b;e=c[a+356>>2]|0;if(((e|0)!=0?(c[d>>2]=38616,c[d+4>>2]=4,a=_H(e,d)|0,(a|0)!=0):0)?(c[a>>2]|0)==9:0){f=c[a+16>>2]|0}else{f=0}i=b;return f|0}function EJ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;g=f+8|0;h=f;c[e>>2]=0;if(!((c[b+396>>2]|0)>>>0>d>>>0)){j=1;i=f;return j|0}k=b+408|0;if((a[(cJ(k,d)|0)>>0]|0)==0){j=1;i=f;return j|0}if((a[(cJ(k,d)|0)>>0]|0)==2){j=1;i=f;return j|0}c[g>>2]=c[(qh(b+392|0,d)|0)>>2];d=b+424|0;k=b+428|0;l=M1a(g,c[d>>2]|0,c[k>>2]|0,4,246)|0;if((l|0)==0){j=1;i=f;return j|0}if((l-(c[d>>2]|0)>>2|0)==((c[k>>2]|0)+ -1|0)){j=0;i=f;return j|0}k=c[g>>2]|0;g=(c[l+4>>2]|0)-k|0;l=b+12|0;d=c[l>>2]|0;c[l>>2]=k;c[h>>2]=38624;c[h+4>>2]=12;c[e>>2]=(FJ(b+8|0,h,g)|0)==0&1;c[l>>2]=d;j=1;i=f;return j|0}function FJ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;f=i;i=i+16|0;g=f;h=c[d+4>>2]|0;if((h|0)>0){j=c[d>>2]|0;k=0;l=1;while(1){m=((a[j+k>>0]|0)==0&1)+l|0;k=k+1|0;if((k|0)>=(h|0)){n=m;break}else{l=m}}}else{n=1}l=w2a(n,12)|0;if((h|0)>=0){k=c[d>>2]|0;d=0;j=0;m=0;while(1){if((a[k+d>>0]|0)==0){c[l+(j*12|0)>>2]=k+m;c[l+(j*12|0)+4>>2]=d-m;c[l+(j*12|0)+8>>2]=0;o=d+1|0;p=o;q=j+1|0;r=o}else{p=d+1|0;q=j;r=m}if((d|0)<(h|0)){d=p;j=q;m=r}else{break}}}r=b+4|0;m=c[r>>2]|0;dd[c[c[b>>2]>>2]&511](b,g)|0;c[r>>2]=m;q=(n|0)>0;j=(e|0)==0;p=m;d=m;a:while(1){d=d+1|0;if(q){m=a[g>>0]|0;h=0;while(1){k=l+(h*12|0)+8|0;o=c[k>>2]|0;s=c[l+(h*12|0)>>2]|0;do{if((a[s+o>>0]|0)==m<<24>>24){t=o+1|0;c[k>>2]=t;if((t|0)==(c[l+(h*12|0)+4>>2]|0)){if((_J(b,d-t|0,e,a[s>>0]|0,t)|0)!=0){u=h;v=27;break a}t=a[s>>0]|0;w=a[g>>0]|0;if(t<<24>>24==w<<24>>24){c[k>>2]=1;x=t;break}else{c[k>>2]=0;x=w;break}}else{x=m}}else{if((a[s>>0]|0)==m<<24>>24){c[k>>2]=1;x=m;break}else{c[k>>2]=0;x=m;break}}}while(0);h=h+1|0;if((h|0)>=(n|0)){break}else{m=x}}y=c[r>>2]|0}else{y=p}if(!j?(d|0)>=(y+e|0):0){u=-1;v=27;break}c[r>>2]=d;m=dd[c[c[b>>2]>>2]&511](b,g)|0;c[r>>2]=y;if((m|0)==0){u=-1;v=27;break}else{p=y}}if((v|0)==27){v2a(l);i=f;return u|0}return 0}function GJ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+16|0;e=d;c[e>>2]=0;f=a+328|0;g=b;if((Dma(f,g,e)|0)!=0){h=c[e>>2]|0;i=d;return h|0}j=c[a+4>>2]|0;if((j|0)==0){h=0;i=d;return h|0}a=fH(j+16|0,b,0)|0;if((a|0)==0){h=0;i=d;return h|0}if((c[a>>2]|0)!=7){h=0;i=d;return h|0}b=u2a(28)|0;EI(b);c[e>>2]=b;rH(b,a,0,0,0);c[(Gma(f,g)|0)>>2]=b;h=b;i=d;return h|0}function HJ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+16|0;f=e;g=b+392|0;if(!((c[b+396>>2]|0)>>>0>d>>>0)){h=0;i=e;return h|0}j=b+408|0;if((a[(cJ(j,d)|0)>>0]|0)==2){k=c[(qh(g,d)|0)>>2]|0}else{k=d}if((a[(cJ(j,k)|0)>>0]|0)!=1?!((a[(cJ(j,k)|0)>>0]|0)==-1):0){h=0;i=e;return h|0}j=c[(qh(g,k)|0)>>2]|0;c[f>>2]=j;if((j|0)==0){h=0;i=e;return h|0}j=b+424|0;k=b+428|0;b=M1a(f,c[j>>2]|0,c[k>>2]|0,4,246)|0;if((b|0)==0){h=0;i=e;return h|0}if((b-(c[j>>2]|0)>>2|0)==((c[k>>2]|0)+ -1|0)){h=0;i=e;return h|0}h=(c[b+4>>2]|0)-(c[f>>2]|0)|0;i=e;return h|0}function IJ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0;g=i;i=i+224|0;h=g+204|0;j=g+200|0;k=g+196|0;l=g+192|0;m=g+184|0;n=g+176|0;o=g+168|0;p=g+160|0;q=g+152|0;r=g+144|0;s=g+136|0;t=g+128|0;u=g+120|0;v=g+112|0;w=g+104|0;x=g+96|0;y=g+88|0;z=g+80|0;A=g+72|0;B=g+68|0;C=g+64|0;D=g+56|0;E=g+48|0;F=g+40|0;G=g+208|0;H=g+32|0;I=g+24|0;J=g+20|0;K=g+16|0;L=g+8|0;M=g;N=b+4|0;O=c[N>>2]|0;XI(j,b,h);P=c[j>>2]|0;if((P|0)==0){Q=0;dka(j);i=g;return Q|0}if((c[P+4>>2]|0)==0){Q=0;dka(j);i=g;return Q|0}if((c[h>>2]|0)!=0){R=c[N>>2]|0;XI(k,b,h);if((c[h>>2]|0)==0){c[N>>2]=R;oe(o,j);S=NF(o)|0}else{XI(l,b,h);c[m>>2]=669016;c[m+4>>2]=1;if(vka(c[l>>2]|0,m)|0){T=Il(d,gma(P+12|0)|0)|0}else{c[N>>2]=R;oe(n,j);T=NF(n)|0}dka(l);S=T}dka(k);Q=S;dka(j);i=g;return Q|0}c[p>>2]=1273800;c[p+4>>2]=4;if(!(vka(P,p)|0)?(c[q>>2]=38688,c[q+4>>2]=5,!(vka(P,q)|0)):0){c[s>>2]=38696;c[s+4>>2]=4;if(vka(P,s)|0){Q=KF()|0;dka(j);i=g;return Q|0}c[t>>2]=38704;c[t+4>>2]=1;if(vka(P,t)|0){UJ(u,b);t=c[b+40>>2]|0;if((t|0)!=0){_P(t,e,f,u)}t=OF(u,0)|0;dka(u);Q=t;dka(j);i=g;return Q|0}c[v>>2]=38712;c[v+4>>2]=1;if(vka(P,v)|0){VJ(w,b);v=c[b+40>>2]|0;if((v|0)!=0){_P(v,e,f,w)}v=OF(w,1)|0;dka(w);Q=v;dka(j);i=g;return Q|0}c[x>>2]=1292048;c[x+4>>2]=1;if(vka(P,x)|0){x=Sn()|0;while(1){v=wJ(b,d,e,f,1,0,1)|0;if((v|0)==0){break}RH(x,v)}if((a[b+44>>0]|0)==93){Q=x;dka(j);i=g;return Q|0}if((x|0)==0){Q=0;dka(j);i=g;return Q|0}bH(x);Q=0;dka(j);i=g;return Q|0}if((a[P+12>>0]|0)==47){x=(c[b+304>>2]|0)+ -1|0;c[z>>2]=b+45;c[z+4>>2]=x;sL(y,z);z=nv(y)|0;dka(y);Q=z;dka(j);i=g;return Q|0}c[A>>2]=39376;c[A+4>>2]=2;if(!(vka(P,A)|0)){c[M>>2]=39384;c[M+4>>2]=2;if(!(vka(P,M)|0)){Q=0;dka(j);i=g;return Q|0}c[N>>2]=O;Q=0;dka(j);i=g;return Q|0}O=Wm()|0;M=(O|0)==0;A=D+4|0;z=E+4|0;a:while(1){U=c[N>>2]|0;XI(C,b,B);y=c[C>>2]|0;if((y|0)==0){V=38;break}if((c[y+4>>2]|0)==0){V=38;break}c[D>>2]=39384;c[A>>2]=2;if(vka(y,D)|0){break}c[E>>2]=38592;c[z>>2]=6;if(vka(y,E)|0){V=42;break}b:do{if((a[y+12>>0]|0)==47){uL(F,C);ika(C,F);dka(F);x=wJ(b,d,e,f,1,0,1)|0;if((x|0)==0){V=45;break a}v=c[C>>2]|0;do{if((v|0)==0){W=1305929|0;X=-1}else{w=c[v+4>>2]|0;t=v+13|0;u=w+ -1|0;if((w|0)!=1){W=t;X=u;break}yF(H,t,u);oI(O,H,x,0);break b}}while(0);yF(I,W,X);pI(O,I,x)}}while(0);dka(C)}c:do{if((V|0)==38){if(M){V=53}else{bH(O);V=53}}else if((V|0)==42){c[N>>2]=U}else if((V|0)==45){if(!M){bH(O)}while(1){if((dd[c[c[b>>2]>>2]&511](b,G)|0)==0){V=53;break c}I=a[G>>0]|0;if(I<<24>>24==13|I<<24>>24==10){V=53;break}}}}while(0);if((V|0)==53){dka(C);Q=0;dka(j);i=g;return Q|0}dka(C);C=c[N>>2]|0;XI(K,b,J);c[L>>2]=38752;c[L+4>>2]=6;do{if(vka(c[K>>2]|0,L)|0){J=XJ(b,O,0,e,f)|0;if((J|0)!=0){Y=J;break}if(M){Y=0}else{bH(O);Y=0}}else{c[N>>2]=C;Y=O}}while(0);dka(K);Q=Y;dka(j);i=g;return Q|0}c[r>>2]=1273800;c[r+4>>2]=4;Q=JF((vka(P,r)|0)&1)|0;dka(j);i=g;return Q|0}function JJ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+32|0;e=d+24|0;f=d+16|0;g=d+8|0;h=d;j=c[a+372>>2]|0;if((j|0)==0){k=-1;i=d;return k|0}l=Lc[c[(c[j>>2]|0)+12>>2]&255](j)|0;j=a+360|0;a=c[j>>2]|0;if((a|0)==0){k=l;i=d;return k|0}c[f>>2]=39824;c[f+4>>2]=6;aI(e,a,f);c[g>>2]=38504;c[g+4>>2]=8;f=vka(c[e>>2]|0,g)|0;dka(e);if(!f){k=l;i=d;return k|0}f=l&3900|-3904;if((b|0)==0){k=f;i=d;return k|0}else{k=c[j>>2]|0;c[h>>2]=669016;c[h+4>>2]=1;j=(eI(k,h)|0)==2;i=d;return(j?f&-3844:f)|0}return 0}function KJ(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+372>>2]|0;if((d|0)==0){e=1;i=b;return e|0}e=Lc[c[(c[d>>2]|0)+16>>2]&255](d)|0;i=b;return e|0}function LJ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;e=i;i=i+64|0;f=e+60|0;g=e+56|0;h=e+52|0;j=e+48|0;k=e+40|0;l=e+32|0;m=e+24|0;n=e+16|0;o=e+8|0;p=e;q=a+8|0;TI(q,b,d);d=(c[a+28>>2]|0)+9|0;r=a+12|0;c[r>>2]=d;XI(g,q,f);if((c[f>>2]|0)==0){s=0;dka(g);i=e;return s|0}t=c[g>>2]|0;u=gma((t|0)==0?1305928:t+12|0)|0;XI(h,q,f);ika(g,h);dka(h);if((c[f>>2]|0)==0){s=0;dka(g);i=e;return s|0}h=c[g>>2]|0;t=gma((h|0)==0?1305928:h+12|0)|0;WI(j,q);c[k>>2]=38576;c[k+4>>2]=3;h=vka(c[j>>2]|0,k)|0;dka(j);if(!h){c[r>>2]=d;s=0;dka(g);i=e;return s|0}d=wJ(q,0,u,t,0,0,1)|0;t=a+476|0;c[t>>2]=d;if((d|0)==0){s=0;dka(g);i=e;return s|0}if((lH(d)|0)!=0?(d=lH(c[t>>2]|0)|0,c[l>>2]=38648,c[l+4>>2]=10,(_H(d,l)|0)!=0):0){XI(m,q,f);dka(m);m=lH(c[t>>2]|0)|0;c[n>>2]=1274632;c[n+4>>2]=1;f=_H(m,n)|0;if((f|0)==0){bH(c[t>>2]|0);s=0;dka(g);i=e;return s|0}n=jH(f)|0;if((n|0)!=(Lc[c[(c[b>>2]|0)+16>>2]&255](b)|0)){s=0;dka(g);i=e;return s|0}b=lH(c[t>>2]|0)|0;c[o>>2]=669064;c[o+4>>2]=1;n=_H(b,o)|0;if((n|0)!=0?(c[n>>2]|0)==2:0){c[a+480>>2]=jH(n)|0}n=lH(c[t>>2]|0)|0;c[p>>2]=38664;c[p+4>>2]=1;o=_H(n,p)|0;if((o|0)==0){s=1;dka(g);i=e;return s|0}if((c[o>>2]|0)!=2){s=1;dka(g);i=e;return s|0}c[a+364>>2]=jH(o)|0;s=1;dka(g);i=e;return s|0}bH(c[t>>2]|0);c[t>>2]=0;s=0;dka(g);i=e;return s|0}function MJ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;i=i+32|0;e=d+16|0;f=d+8|0;g=d;NI(a);c[a+368>>2]=0;h=a+364|0;c[h>>2]=0;c[a+324>>2]=1;j=SI(b)|0;if((j|0)==-1){k=2;i=d;return k|0}if((LJ(a,b,j)|0)==0){c[a+24>>2]=0;k=RI(a,b)|0;i=d;return k|0}b=u2a(104)|0;HG(b,a);j=a+4|0;c[j>>2]=b;b=c[a+12>>2]|0;c[e>>2]=b;do{if((dJ(a,b,0,0,0)|0)==0){if((rJ(a,b,e,1)|0)==0){_I(a);c[h>>2]=0;l=1}else{l=0}}else{m=eJ(a)|0;c[a+356>>2]=m;if((m|0)==0){k=0;i=d;return k|0}c[f>>2]=38520;c[f+4>>2]=4;n=fJ(m,f)|0;if((n|0)==0){k=0;i=d;return k|0}else{Kja(a+392|0,n)|0;Kja(a+408|0,n)|0;l=0;break}}}while(0);f=$I(a)|0;if((f|0)!=0){k=f;i=d;return k|0}f=c[j>>2]|0;h=a+476|0;MG(f,lH(c[h>>2]|0)|0);f=c[j>>2]|0;if(!((c[f+52>>2]|0)!=0?(VG(c[f+84>>2]|0)|0)!=0:0)){if((l|0)!=0){k=2;i=d;return k|0}PI(a);_I(a);l=$I(a)|0;if((l|0)!=0){k=l;i=d;return k|0}l=c[j>>2]|0;MG(l,lH(c[h>>2]|0)|0);if((c[(c[j>>2]|0)+52>>2]|0)==0){k=2;i=d;return k|0}}N1a(c[a+424>>2]|0,c[a+428>>2]|0,4,246);if((aJ(a)|0)==0){PI(a);_I(a);if((aJ(a)|0)==0){k=2;i=d;return k|0}h=$I(a)|0;if((h|0)!=0){k=h;i=d;return k|0}}h=c[a+372>>2]|0;if((h|0)==0){k=0;i=d;return k|0}if((Lc[c[(c[h>>2]|0)+24>>2]&255](h)|0)==0){k=0;i=d;return k|0}h=c[(c[j>>2]|0)+52>>2]|0;c[g>>2]=38480;c[g+4>>2]=8;j=_H(h,g)|0;if((j|0)==0){k=0;i=d;return k|0}if((c[j>>2]|0)!=9){k=0;i=d;return k|0}c[a+20>>2]=c[j+16>>2];k=0;i=d;return k|0}function NJ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d;c[e>>2]=b;if((rJ(a,b,e,0)|0)==0){f=0;i=d;return f|0}while(1){b=c[e>>2]|0;if((b|0)==0){break}if((rJ(a,b,e,0)|0)==0){f=0;g=5;break}}if((g|0)==5){i=d;return f|0}Hma(a+328|0,101,0);c[a+368>>2]=1;f=1;i=d;return f|0}function OJ(b){b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;e=i;i=i+16|0;f=e+12|0;g=e+8|0;h=e+4|0;j=e;k=b+8|0;l=b+20|0;m=c[l>>2]|0;c[l>>2]=0;n=b+356|0;o=c[n>>2]|0;if((o|0)!=0){bH(o);c[n>>2]=0}n=b+364|0;o=b+28|0;p=b+12|0;c[p>>2]=(c[n>>2]|0)-(c[o>>2]|0);a[f>>0]=0;PJ(k,f)|0;a:do{if((a[39080+(d[f>>0]|0)>>0]|0)==87){q=b+32|0;r=0;while(1){s=r+1|0;if((c[q>>2]|0)>=((c[o>>2]|0)+(c[p>>2]|0)|0)){t=s;break a}PJ(k,f)|0;if((a[39080+(d[f>>0]|0)>>0]|0)==87){r=s}else{t=s;break}}}else{t=0}}while(0);c[n>>2]=(c[n>>2]|0)+t;t=b+328|0;f=(c[b+336>>2]|0)==0;c[g>>2]=f?0:-1;if(!f){do{Cma(t,g,h,j);f=c[j>>2]|0;if((f|0)!=0){FI(f);v2a(f)}}while((c[g>>2]|0)!=0)}Ama(t);if((jJ(b,c[n>>2]|0,c[b+484>>2]|0)|0)==0?(NJ(b,c[n>>2]|0)|0)==0:0){c[n>>2]=0;u=2;c[l>>2]=m;i=e;return u|0}N1a(c[b+424>>2]|0,c[b+428>>2]|0,4,246);u=0;c[l>>2]=m;i=e;return u|0}function PJ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=i;f=b+4|0;g=(c[b+20>>2]|0)+(c[f>>2]|0)|0;h=c[b+24>>2]|0;if((g|0)>=(h|0)){j=0;i=e;return j|0}k=b+36|0;l=c[k>>2]|0;m=c[b+32>>2]|0;if((l|0)<(g|0)?(m+l|0)>(g|0):0){n=b+28|0;o=l}else{p=5}do{if((p|0)==5){l=(m|0)>(h|0)?h:m;q=(l+g|0)>(h|0)?h-l|0:g;r=c[b+16>>2]|0;s=b+28|0;if((id[c[(c[r>>2]|0)+28>>2]&511](r,c[s>>2]|0,q,l)|0)==0){j=0;i=e;return j|0}else{c[k>>2]=q;n=s;o=q;break}}}while(0);a[d>>0]=a[(c[n>>2]|0)+(g-o)>>0]|0;c[f>>2]=(c[f>>2]|0)+1;j=1;i=e;return j|0}function QJ(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=38680;c[a+16>>2]=0;c[a+40>>2]=0;d=a+28|0;c[d>>2]=0;c[a+32>>2]=c[(xt()|0)>>2];c[d>>2]=0;c[a+12>>2]=0;c[a+312>>2]=0;c[a+8>>2]=0;i=b;return}function RJ(a){a=a|0;var b=0;b=i;c[a>>2]=38680;v2a(c[a+28>>2]|0);i=b;return}function SJ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=i;g=(c[b+20>>2]|0)+d|0;d=c[b+24>>2]|0;if((g|0)>=(d|0)){h=0;i=f;return h|0}j=b+36|0;k=c[j>>2]|0;l=c[b+32>>2]|0;if((k|0)<(g|0)?(l+k|0)>(g|0):0){m=b+28|0;n=k}else{o=5}do{if((o|0)==5){if((g|0)<(l|0)){p=0}else{p=g+1-l|0}if((l+p|0)>(d|0)){k=(d|0)<(l|0);q=k?0:d-l|0;r=k?d:l}else{q=p;r=l}k=c[b+16>>2]|0;s=b+28|0;if((id[c[(c[k>>2]|0)+28>>2]&511](k,c[s>>2]|0,q,r)|0)==0){h=0;i=f;return h|0}else{c[j>>2]=q;m=s;n=q;break}}}while(0);a[e>>0]=a[(c[m>>2]|0)+(g-n)>>0]|0;h=1;i=f;return h|0}function TJ(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;i=i+16|0;e=d;f=b+304|0;c[f>>2]=0;g=b+308|0;c[g>>2]=1;if((dd[c[c[b>>2]>>2]&511](b,e)|0)==0){i=d;return}h=a[e>>0]|0;j=h&255;k=h;a:while(1){l=a[39080+j>>0]|0;if(l<<24>>24==87){if((dd[c[c[b>>2]>>2]&511](b,e)|0)==0){m=33;break}h=a[e>>0]|0;j=h&255;k=h;continue}if(!(k<<24>>24==37)){m=10;break}do{if((dd[c[c[b>>2]>>2]&511](b,e)|0)==0){m=33;break a}n=a[e>>0]|0}while(!(n<<24>>24==10|n<<24>>24==13));j=n&255;k=n}if((m|0)==10){if(!(l<<24>>24==68)){n=k;j=l;do{l=c[f>>2]|0;if(l>>>0<256){c[f>>2]=l+1;a[b+l+44>>0]=n}if(!(j<<24>>24==78)){c[g>>2]=0}if((dd[c[c[b>>2]>>2]&511](b,e)|0)==0){m=33;break}n=a[e>>0]|0;j=a[39080+(n&255)>>0]|0}while(!(j<<24>>24==87|j<<24>>24==68));if((m|0)==33){i=d;return}j=b+4|0;c[j>>2]=(c[j>>2]|0)+ -1;i=d;return}c[g>>2]=0;g=c[f>>2]|0;c[f>>2]=g+1;a[b+g+44>>0]=k;if(k<<24>>24==62){if((dd[c[c[b>>2]>>2]&511](b,e)|0)==0){i=d;return}if((a[e>>0]|0)==62){g=c[f>>2]|0;c[f>>2]=g+1;a[b+g+44>>0]=62;i=d;return}else{g=b+4|0;c[g>>2]=(c[g>>2]|0)+ -1;i=d;return}}else if(k<<24>>24==47){if((dd[c[c[b>>2]>>2]&511](b,e)|0)==0){i=d;return}while(1){g=a[e>>0]|0;j=a[39080+(g&255)>>0]|0;if(!(j<<24>>24==78|j<<24>>24==82)){break}j=c[f>>2]|0;if(j>>>0<256){c[f>>2]=j+1;a[b+j+44>>0]=g}if((dd[c[c[b>>2]>>2]&511](b,e)|0)==0){m=33;break}}if((m|0)==33){i=d;return}g=b+4|0;c[g>>2]=(c[g>>2]|0)+ -1;i=d;return}else if(k<<24>>24==60){if((dd[c[c[b>>2]>>2]&511](b,e)|0)==0){i=d;return}if((a[e>>0]|0)==60){e=c[f>>2]|0;c[f>>2]=e+1;a[b+e+44>>0]=60;i=d;return}else{e=b+4|0;c[e>>2]=(c[e>>2]|0)+ -1;i=d;return}}else{i=d;return}}else if((m|0)==33){i=d;return}}function UJ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;e=i;i=i+48|0;f=e+32|0;g=e+16|0;h=e+8|0;j=e;if((dd[c[c[d>>2]>>2]&511](d,f)|0)==0){c[b>>2]=0;i=e;return}gla(g);k=0;l=0;m=0;a:while(1){n=k&255;o=m;b:while(1){switch(o|0){case 1:{p=12;break b;break};case 2:{q=a[f>>0]|0;if((q+ -48<<24>>24&255)<8){p=23;break b}vF(g,n);o=0;continue b;break};case 0:{p=6;break b;break};case 3:{r=a[f>>0]|0;if((r+ -48<<24>>24&255)<8){p=26;break b}vF(g,n);o=0;continue b;break};case 4:{if((a[f>>0]|0)==10){s=k;t=l;u=0;break b}else{o=0;continue b}break};default:{s=k;t=l;u=o;break b}}}c:do{if((p|0)==6){p=0;o=a[f>>0]|0;if(o<<24>>24==41){if((l|0)==0){p=8;break a}vF(g,41);s=k;t=l+ -1|0;u=0;break}else if(o<<24>>24==40){vF(g,40);s=k;t=l+1|0;u=0;break}else if(o<<24>>24==92){s=k;t=l;u=1;break}else{vF(g,o);s=k;t=l;u=0;break}}else if((p|0)==12){p=0;o=a[f>>0]|0;if((o+ -48<<24>>24&255)<8){s=(o&255)+ -48|0;t=l;u=2;break}switch(o<<24>>24){case 116:{vF(g,9);break};case 114:{vF(g,13);break};case 110:{vF(g,10);break};case 98:{vF(g,8);break};case 13:{s=k;t=l;u=4;break c;break};case 102:{vF(g,12);break};case 10:{break};default:{vF(g,o)}}s=k;t=l;u=0}else if((p|0)==23){p=0;s=(k<<3)+ -48+(q&255)|0;t=l;u=3}else if((p|0)==26){p=0;o=(k<<3)+ -48+(r&255)|0;vF(g,o&255);s=o;t=l;u=0}}while(0);if((dd[c[c[d>>2]>>2]&511](d,f)|0)==0){p=30;break}else{k=s;l=t;m=u}}if((p|0)==8){u=c[g+4>>2]|0;pla(h,u,c[g+8>>2]|0);jka(b,h);v=u}else if((p|0)==30){dd[c[c[d>>2]>>2]&511](d,f)|0;f=c[g+4>>2]|0;pla(j,f,c[g+8>>2]|0);jka(b,j);v=f}ila(v);i=e;return}function VJ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;e=i;i=i+32|0;f=e+24|0;g=e+8|0;h=e;if((dd[c[c[d>>2]>>2]&511](d,f)|0)==0){c[b>>2]=0;i=e;return}gla(g);j=1;k=0;while(1){l=a[f>>0]|0;m=l&255;if(l<<24>>24==62){n=j;o=k;break}do{if(!((l+ -48<<24>>24&255)<10)){if((l+ -65<<24>>24&255)<6){p=(j|0)!=0;q=m+ -55|0;if(p){r=q<<4&255}else{s=q+(k&255)&255;vF(g,s);r=s}t=p&1^1;u=r;break}if((l+ -97<<24>>24&255)<6){p=(j|0)!=0;s=m+ -87|0;if(p){v=s<<4&255}else{q=s+(k&255)&255;vF(g,q);v=q}t=p&1^1;u=v}else{t=j;u=k}}else{p=(j|0)!=0;q=m+ -48|0;if(p){w=q<<4&255}else{s=q+(k&255)&255;vF(g,s);w=s}t=p&1^1;u=w}}while(0);if((dd[c[c[d>>2]>>2]&511](d,f)|0)==0){n=t;o=u;break}else{j=t;k=u}}if((n|0)==0){vF(g,o)}o=c[g+4>>2]|0;pla(h,o,c[g+8>>2]|0);jka(b,h);ila(o);i=e;return}function WJ(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d;while(1){if((dd[c[c[b>>2]>>2]&511](b,e)|0)==0){f=6;break}g=a[e>>0]|0;if(g<<24>>24==13){f=4;break}else if(g<<24>>24==10){f=6;break}}if((f|0)==4){dd[c[c[b>>2]>>2]&511](b,e)|0;if((a[e>>0]|0)==10){i=d;return}e=b+4|0;c[e>>2]=(c[e>>2]|0)+ -1;i=d;return}else if((f|0)==6){i=d;return}}function XJ(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;g=i;i=i+80|0;h=g+56|0;j=g+48|0;k=g+40|0;l=g+32|0;m=g+65|0;n=g+64|0;o=g+24|0;p=g+16|0;q=g;c[h>>2]=669280;c[h+4>>2]=6;r=_H(b,h)|0;do{if((r|0)==0){s=0}else{if((c[r>>2]|0)==9){if((c[r+12>>2]|0)==0){s=0;break}if((c[r+16>>2]|0)==(e|0)){s=0;break}}s=jH(r)|0}}while(0);WJ(a);r=a+4|0;h=c[r>>2]|0;t=(d|0)!=0;if(t){c[d+12>>2]=h;u=c[r>>2]|0}else{u=h}c[j>>2]=u;u=j+4|0;c[u>>2]=0;YJ(j,s);if((c[u>>2]|0)!=0){v=0;i=g;return v|0}u=c[j>>2]|0;j=ZJ(u,0)|0;if((j|0)>=(c[a+24>>2]|0)){v=0;i=g;return v|0}c[r>>2]=ZJ(u,0)|0;if((c[a+12>>2]|0)!=(e|0)?(u=c[a+40>>2]|0,(u|0)!=0):0){w=u;x=0;y=s}else{z=12}do{if((z|0)==12){TJ(a);if(!((c[a+304>>2]|0)>>>0<9)?(Q2a(a+44|0,38760,9)|0)==0:0){w=0;x=1;y=s;break}c[r>>2]=h;c[k>>2]=38760;c[k+4>>2]=9;u=tJ(a,k)|0;if(!((u|0)>-1)){c[r>>2]=h;c[p>>2]=38592;c[p+4>>2]=6;if((tJ(a,p)|0)<0){v=0}else{w=0;x=1;y=s;break}i=g;return v|0}j=c[r>>2]|0;c[r>>2]=h;c[l>>2]=38592;c[l+4>>2]=6;A=tJ(a,l)|0;if((A|0)<(u|0)&(A|0)>-1){B=c[r>>2]|0;C=A}else{c[r>>2]=j;B=j;C=u}u=C+h|0;c[r>>2]=u+ -1;dd[c[c[a>>2]>>2]&511](a,m)|0;c[r>>2]=u+ -2;dd[c[c[a>>2]>>2]&511](a,n)|0;c[r>>2]=B;c[o>>2]=669280;c[o+4>>2]=6;sI(b,o,C);w=0;x=1;y=C}}while(0);c[r>>2]=h;h=w2a(y,1)|0;if((h|0)==0){v=0;i=g;return v|0}lJ(a,h,y)|0;if(x){D=y;E=h}else{gla(q);lla(q,dd[c[(c[w>>2]|0)+12>>2]&511](w,y)|0,0);x=Qc[c[(c[w>>2]|0)+16>>2]&255](w,e,f)|0;ed[c[(c[w>>2]|0)+20>>2]&127](w,x,h,y,q)|0;Qc[c[(c[w>>2]|0)+24>>2]&255](w,x,q)|0;v2a(h);h=q+4|0;x=c[h>>2]|0;w=c[q+8>>2]|0;kla(q);ila(c[h>>2]|0);D=w;E=x}x=u2a(36)|0;zI(x,E,D,b);if(t){c[d+16>>2]=(c[d+12>>2]|0)+D}D=c[r>>2]|0;TJ(a);if((c[a+304>>2]|0)!=6){v=x;i=g;return v|0}if((Q2a(a+44|0,38592,6)|0)!=0){v=x;i=g;return v|0}c[r>>2]=D;v=x;i=g;return v|0}function YJ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;f=d+8|0;c[f>>2]=b;c[f+4>>2]=0;kL(e,a,f);f=e;e=c[f+4>>2]|0;b=a;c[b>>2]=c[f>>2];c[b+4>>2]=e;i=d;return}function ZJ(a,b){a=a|0;b=b|0;if((b|0)==0){return a|0}else{ec()}return 0}function _J(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0;j=i;i=i+16|0;k=j;l=a[39080+(g&255)>>0]|0;g=h+e|0;if(((g|0)<=(f|0)?(f=b+4|0,h=c[f>>2]|0,c[f>>2]=g,g=dd[c[c[b>>2]>>2]&511](b,k)|0,c[f>>2]=h,(g|0)!=0):0)?(g=a[39080+(d[k>>0]|0)>>0]|0,g<<24>>24==82|g<<24>>24==78):0){m=0;i=j;return m|0}if((((e|0)>0?!(l<<24>>24==68|l<<24>>24==87):0)?(l=b+4|0,g=c[l>>2]|0,c[l>>2]=e+ -1,e=dd[c[c[b>>2]>>2]&511](b,k)|0,c[l>>2]=g,(e|0)!=0):0)?(e=a[39080+(d[k>>0]|0)>>0]|0,e<<24>>24==82|e<<24>>24==78):0){m=0;i=j;return m|0}m=1;i=j;return m|0}function $J(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;c[a>>2]=38784;LI(a+4|0);QJ(a+492|0);Ija(a+876|0,4);Ija(a+892|0,4);c[a+920>>2]=0;Ija(a+1700|0,4);Ija(a+1716|0,4);Ija(a+1732|0,4);Ija(a+1808|0,4);Ija(a+1844|0,4);mL(a+1876|0);c[a+856>>2]=b;c[a+860>>2]=d;c[a+908>>2]=0;b=a+864|0;c[b>>2]=0;if((d|0)!=0){c[b>>2]=Lc[c[(c[d>>2]|0)+16>>2]&255](d)|0}c[a+848>>2]=0;c[a+1184>>2]=0;c[a+840>>2]=0;c[a+912>>2]=0;c[a+916>>2]=0;d=a+1748|0;b=a+816|0;c[a+868>>2]=0;f=a+1860|0;c[a+836>>2]=0;c[a+808>>2]=0;g=a+1824|0;c[a+1900>>2]=0;c[a+852>>2]=0;c[a+328>>2]=0;c[a+1904>>2]=0;c[b+0>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;b=d+0|0;d=b+60|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(d|0));c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;i=e;return}function aK(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;c[a>>2]=38784;d=c[a+820>>2]|0;if((d|0)!=0){bH(d)}d=c[a+808>>2]|0;if((d|0)!=0){bH(d)}d=c[a+824>>2]|0;if((d|0)!=0){bH(d)}d=c[a+1900>>2]|0;if((d|0)!=0){ila(c[d+8>>2]|0);v2a(d)}d=c[a+1904>>2]|0;if((d|0)!=0){ila(c[d+8>>2]|0);v2a(d)}d=a+1808|0;e=c[a+1812>>2]|0;if((e|0)>0){f=0;do{bH(Ch(d,f)|0);f=f+1|0}while((f|0)<(e|0))}aL(a+1876|0);Jja(c[a+1844>>2]|0);Jja(c[d>>2]|0);Jja(c[a+1732>>2]|0);Jja(c[a+1716>>2]|0);Jja(c[a+1700>>2]|0);dka(a+920|0);Jja(c[a+892>>2]|0);Jja(c[a+876>>2]|0);RJ(a+492|0);MI(a+4|0);i=b;return}function bK(a,b){a=a|0;b=b|0;c[a+868>>2]=b;return}function cK(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;g=c[b+44>>2]|0;if((g|0)==0){h=0;i=f;return h|0}b=g+392|0;if(!((c[g+396>>2]|0)>>>0>d>>>0)){h=0;i=f;return h|0}j=g+408|0;if((a[(cJ(j,d)|0)>>0]|0)==2){k=c[(qh(b,d)|0)>>2]|0}else{k=d}if((a[(cJ(j,k)|0)>>0]|0)!=1?!((a[(cJ(j,k)|0)>>0]|0)==-1):0){h=0;i=f;return h|0}j=c[(qh(b,k)|0)>>2]|0;c[e>>2]=j;if((j|0)==0){h=0;i=f;return h|0}j=g+424|0;k=g+428|0;g=M1a(e,c[j>>2]|0,c[k>>2]|0,4,246)|0;if((g|0)==0){h=0;i=f;return h|0}if((g-(c[j>>2]|0)>>2|0)==((c[k>>2]|0)+ -1|0)){h=0;i=f;return h|0}h=(c[g+4>>2]|0)-(c[e>>2]|0)|0;i=f;return h|0}function dK(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;g=i;i=i+64|0;h=g+40|0;j=g+32|0;k=g+24|0;l=g+16|0;m=g+12|0;n=g+8|0;o=g;p=b+4|0;if((c[p>>2]|0)==0){q=1;i=g;return q|0}Ija(h,4);if((c[p>>2]|0)>0){r=(d|0)==0;d=o+4|0;s=a+864|0;t=a+856|0;u=a+872|0;v=a+868|0;w=0;x=0;while(1){y=c[(Hg(b,x)|0)>>2]|0;a:do{if((y|0)!=0){z=c[y>>2]|0;if((z|0)==9){A=y+16|0;B=c[A>>2]|0;C=cK(c[v>>2]|0,B,n)|0;c[o>>2]=C;c[d>>2]=0;if((C|0)==0){D=w;break}E=c[n>>2]|0;if((E|0)<0){D=w;break}if((E|0)>=(c[s>>2]|0)){D=w;break}eK(o,E);eK(o,512);if((c[d>>2]|0)!=0){D=w;break}E=fK(o)|0;F=c[s>>2]|0;if(E>>>0>F>>>0){E=F-(c[n>>2]|0)|0;F=dL(E)|0;G=o;c[G>>2]=E;c[G+4>>2]=F;if(!(F>>>0<1|(F|0)==1&E>>>0<0)){D=w;break}}else{E=o;c[E>>2]=C+512;c[E+4>>2]=0}E=c[t>>2]|0;C=c[c[E>>2]>>2]|0;F=c[n>>2]|0;G=fK(o)|0;if((Qc[C&255](E,F,G)|0)==0){G=c[c[e>>2]>>2]|0;F=c[n>>2]|0;E=fK(o)|0;ld[G&255](e,F,E);yg(f,y);D=w+1|0;break}if((gK(u,B)|0)!=0){D=w;break}hK(u,B);B=fH((c[v>>2]|0)+16|0,c[A>>2]|0,0)|0;if((B|0)==0){D=w;break}yg(h,B);D=w;break}else if((z|0)==6){H=y}else if((z|0)==7){H=lH(y)|0}else if((z|0)==5){z=mH(y)|0;B=z+16|0;if((c[B>>2]|0)==0){D=w;break}else{I=0}while(1){yg(h,FH(z,I)|0);I=I+1|0;if(!(I>>>0<(c[B>>2]|0)>>>0)){D=w;break a}}}else{D=w;break}B=lH(H)|0;if((B|0)!=0?(pe(k,669480),aI(j,B,k),z=ah(j,38816)|0,dka(j),z&r):0){D=w;break}z=YH(B)|0;c[l>>2]=z;if((z|0)!=0){do{c[m>>2]=0;z=ZH(B,l,m)|0;if(yl(m,38824)|0){yg(h,z)}dka(m)}while((c[l>>2]|0)!=0);D=w}else{D=w}}else{D=w}}while(0);x=x+1|0;if((x|0)>=(c[p>>2]|0)){break}else{w=D}}if((D|0)!=0){D=c[h+4>>2]|0;if((D|0)>0){w=0;do{p=c[(Hg(h,w)|0)>>2]|0;if(!((c[p>>2]|0)==9?(gK(u,c[p+16>>2]|0)|0)!=0:0)){yg(f,p)}w=w+1|0}while((w|0)<(D|0));J=0}else{J=0}}else{K=35}}else{K=35}if((K|0)==35){Kja(b,0)|0;Mja(b,h);J=dK(a,b,0,e,f)|0}Jja(c[h>>2]|0);q=J;i=g;return q|0}function eK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;gL(e,a,b,0);b=e;e=c[b+4>>2]|0;f=a;c[f>>2]=c[b>>2];c[f+4>>2]=e;i=d;return}function fK(a){a=a|0;if((c[a+4>>2]|0)==0){return c[a>>2]|0}else{ec()}return 0}function gK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;c[e>>2]=0;f=$K(a,b,e)|0;i=d;return f|0}function hK(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;c[e>>2]=0;if(($K(a,b,e)|0)!=0){i=d;return}ku(a+4|0,c[e>>2]|0,b);i=d;return}function iK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=a+864|0;if(((c[e>>2]|0)==0?(f=c[a+860>>2]|0,(f|0)!=0):0)?(g=Lc[c[(c[f>>2]|0)+16>>2]&255](f)|0,c[e>>2]=g,(g|0)==0):0){h=1;i=d;return h|0}g=a+828|0;while(1){if((c[g>>2]|0)!=0){h=1;j=7;break}if((jK(a,b)|0)==0){h=0;j=7;break}}if((j|0)==7){i=d;return h|0}return 0}function jK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=a+852|0;a:do{switch(c[e>>2]|0){case 15:{c[e>>2]=14;f=23;break};case 10:{g=yK(a,b)|0;break};case 14:{if((c[a+1868>>2]|0)==0){c[e>>2]=15;g=1;break a}else{g=BK(a,b)|0;break a}break};case 6:{g=sK(a,b)|0;break};case 8:{g=vK(a)|0;break};case 5:{g=rK(a,b)|0;break};case 7:{g=tK(a,b)|0;break};case 11:{g=lK(a,b)|0;break};case 13:{if((c[a+1868>>2]|0)==0){g=AK(a,b)|0;break a}else{g=zK(a,b)|0;break a}break};case 19:{g=wK(a,b)|0;break};case 4:{g=qK(a,b)|0;break};case 3:{g=pK(a,b)|0;break};case 20:{g=uK(a,b)|0;break};case 0:{g=nK(a,b)|0;break};case 2:case 1:{g=oK(a,b)|0;break};case 9:{g=xK(a,b)|0;break};case 18:{g=wK(a,b)|0;break};default:{f=23}}}while(0);if((f|0)==23){c[a+828>>2]=1;g=1}i=d;return g|0}function kK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+32|0;e=d+16|0;f=d;g=a+892|0;if((c[a+896>>2]|0)==0){Kja(g,0)|0;Kja(a+876|0,0)|0;Ija(e,4);Mja(e,a+1808|0);h=dK(a,e,0,b,g)|0;if((h|0)!=0){Kja(g,0)|0}Jja(c[e>>2]|0);j=h;i=d;return j|0}Ija(f,4);h=dK(a,g,0,b,f)|0;if((h|0)==0){Kja(g,0)|0;Mja(g,f)}else{g=a+1808|0;b=c[a+1812>>2]|0;if((b|0)>0){a=0;do{bH(Ch(g,a)|0);a=a+1|0}while((a|0)<(b|0))}Kja(g,0)|0}Jja(c[f>>2]|0);j=h;i=d;return j|0}function lK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d;c[e>>2]=0;f=mK(a,c[a+1796>>2]|0,b,e)|0;c[a+1804>>2]=f;if((c[e>>2]|0)==0){c[a+852>>2]=13;g=1;i=d;return g|0}if((f|0)!=0){yg(a+1808|0,f);c[a+852>>2]=13;g=1;i=d;return g|0}f=a+852|0;if((c[f>>2]|0)!=18){g=0;i=d;return g|0}c[f>>2]=19;g=1;i=d;return g|0}function mK(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;i=i+16|0;g=f;h=(e|0)!=0;if(h){c[e>>2]=1}j=a+868|0;k=c[j>>2]|0;if((k|0)!=0){c[g>>2]=0;l=cK(k,b,g)|0;k=c[g>>2]|0;m=l+512|0;l=c[a+864>>2]|0;n=(m+k|0)>(l|0)?l-k|0:m;m=c[a+856>>2]|0;if((Qc[c[c[m>>2]>>2]&255](m,k,n)|0)==0){ld[c[c[d>>2]>>2]&255](d,c[g>>2]|0,n);o=0;i=f;return o|0}n=CJ(c[(c[j>>2]|0)+44>>2]|0,0,b,0)|0;if((n|0)!=0|h^1){o=n;i=f;return o|0}c[e>>2]=0;o=0;i=f;return o|0}n=a+4|0;j=bJ(n,b)|0;if((j|0)<0){c[e>>2]=0;o=0;i=f;return o|0}g=HJ(n,b)|0;k=c[a+864>>2]|0;m=(j+512+g|0)>(k|0)?k-j|0:g+512|0;g=c[a+856>>2]|0;if((Qc[c[c[g>>2]>>2]&255](g,j,m)|0)==0){ld[c[c[d>>2]>>2]&255](d,j,m);o=0;i=f;return o|0}m=CJ(n,0,b,0)|0;if((m|0)!=0|h^1){o=m;i=f;return o|0}c[e>>2]=0;o=0;i=f;return o|0}function nK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+1024|0;e=d;f=c[a+864>>2]|0;g=(f|0)<1024?f:1024;f=c[a+856>>2]|0;if((Qc[c[c[f>>2]>>2]&255](f,0,g)|0)==0){ld[c[c[b>>2]>>2]&255](b,0,g);h=0;i=d;return h|0}b=c[a+860>>2]|0;id[c[(c[b>>2]|0)+28>>2]&511](b,e,0,g)|0;b=a+852|0;if((HK(a,e,g)|0)==0){if((c[b>>2]|0)==18){h=0;i=d;return h|0}else{j=3}}else{j=1}c[b>>2]=j;h=1;i=d;return h|0}function oK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;i=i+32|0;e=d+16|0;f=d+8|0;g=d;h=lH(c[a+820>>2]|0)|0;if((h|0)!=0?(c[e>>2]=38840,c[e+4>>2]=1,j=_H(h,e)|0,(j|0)!=0):0){c[f>>2]=38664;c[f+4>>2]=1;e=_H(h,f)|0;if((e|0)==0){c[a+852>>2]=18;k=0;i=d;return k|0}c[g>>2]=1274632;c[g+4>>2]=1;f=_H(h,g)|0;if((f|0)==0){c[a+852>>2]=18;k=0;i=d;return k|0}if((c[j>>2]|0)==2?(g=(jH(j)|0)+512|0,j=c[a+864>>2]|0,h=(g|0)>(j|0)?j:g,g=(j|0)>1024?1024:j,j=h>>>0>1024?h+ -1024|0:0,h=c[a+856>>2]|0,(Qc[c[c[h>>2]>>2]&255](h,g,j)|0)==0):0){ld[c[c[b>>2]>>2]&255](b,g,j);l=1}else{l=0}j=a+836|0;c[j>>2]=0;if((c[e>>2]|0)==2){g=jH(e)|0;c[j>>2]=g;m=g}else{m=0}if((c[f>>2]|0)==2){g=jH(f)|0;n=c[j>>2]|0;o=g}else{n=m;o=0}m=c[a+856>>2]|0;g=a+852|0;if((Qc[c[c[m>>2]>>2]&255](m,n,o-n|0)|0)==0){if((c[g>>2]|0)==1){n=c[j>>2]|0;j=o-n|0;m=j>>>0<512&(o|0)>512;ld[c[c[b>>2]>>2]&255](b,m?o+ -512|0:n,m?512:j)}}else{c[g>>2]=2}if((l|0)==0?(c[g>>2]|0)==2:0){c[g>>2]=17;k=1;i=d;return k|0}c[g>>2]=2;k=0;i=d;return k|0}c[a+852>>2]=18;k=0;i=d;return k|0}function pK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=i;i=i+1056|0;e=d+24|0;f=d+16|0;g=d+8|0;h=d+4|0;j=d;k=a+864|0;l=c[k>>2]|0;m=(l|0)>1024?l+ -1024|0:0;n=l-m|0;l=c[a+856>>2]|0;if((Qc[c[c[l>>2]>>2]&255](l,m,n)|0)==0){ld[c[c[b>>2]>>2]&255](b,m,n);o=0;i=d;return o|0}b=c[a+860>>2]|0;id[c[(c[b>>2]|0)+28>>2]&511](b,e,m,n)|0;m=soa(e,n)|0;e=a+492|0;TI(e,m,0);c[a+496>>2]=n+ -1;c[f>>2]=38464;c[f+4>>2]=9;if((UI(e,f,n)|0)==0){c[a+852>>2]=19;p=1}else{XI(h,e,g);dka(h);XI(j,e,g);do{if((c[g>>2]|0)==0){c[a+852>>2]=18;q=0}else{e=c[j>>2]|0;h=kma((e|0)==0?1305928:e+12|0)|0;c[a+840>>2]=h;if((h|0)!=0?(h|0)<=(c[k>>2]|0):0){c[a+836>>2]=h;c[a+908>>2]=h;c[a+852>>2]=4;q=1;break}c[a+852>>2]=19;q=1}}while(0);dka(j);p=q}Rc[c[c[m>>2]>>2]&1023](m);o=p;i=d;return o|0}function qK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+16|0;e=d;f=a+908|0;c[e>>2]=0;if((LK(a,e)|0)==0){g=c[f>>2]|0;h=c[a+864>>2]|0;ld[c[c[b>>2]>>2]&255](b,g,(g+512|0)>(h|0)?h-g|0:512);j=0;dka(e);i=d;return j|0}if(!(ah(e,38544)|0)){c[a+852>>2]=19;j=1;dka(e);i=d;return j|0}hJ(a+1700|0,c[a+840>>2]|0);while(1){if((LK(a,e)|0)==0){k=6;break}if(ah(e,38584)|0){k=8;break}}if((k|0)==6){g=c[f>>2]|0;h=c[a+864>>2]|0;ld[c[c[b>>2]>>2]&255](b,g,(g+512|0)>(h|0)?h-g|0:512);c[a+852>>2]=5;j=0;dka(e);i=d;return j|0}else if((k|0)==8){c[a+844>>2]=c[f>>2];c[a+852>>2]=7;j=1;dka(e);i=d;return j|0}return 0}function rK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+16|0;e=d;c[e>>2]=0;while(1){if((LK(a,e)|0)==0){f=3;break}if(ah(e,38584)|0){f=5;break}}if((f|0)==3){g=c[a+908>>2]|0;h=c[a+864>>2]|0;ld[c[c[b>>2]>>2]&255](b,g,(g+512|0)>(h|0)?h-g|0:512);j=0;dka(e);i=d;return j|0}else if((f|0)==5){c[a+844>>2]=c[a+908>>2];c[a+852>>2]=7;j=1;dka(e);i=d;return j|0}return 0}function sK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d;c[e>>2]=0;f=KK(a,b,e)|0;do{if((f|0)==1){b=c[e>>2]|0;if((b|0)==0){c[a+852>>2]=8;g=1;break}else{c[a+1784>>2]=b;c[a+908>>2]=b;g=1;break}}else if((f|0)==-1){c[a+852>>2]=18;g=0}else{g=0}}while(0);i=d;return g|0}function tK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=i;i=i+48|0;e=d+24|0;f=d+16|0;g=d+8|0;h=d;j=a+908|0;k=c[j>>2]|0;l=a+864|0;m=c[l>>2]|0;n=(k+512|0)>(m|0)?m-k|0:512;m=c[a+856>>2]|0;if((Qc[c[c[m>>2]>>2]&255](m,k,n)|0)==0){ld[c[c[b>>2]>>2]&255](b,c[j>>2]|0,n);o=0;i=d;return o|0}k=a+844|0;m=(c[j>>2]|0)+n-(c[k>>2]|0)|0;hla(e,m);p=c[e+4>>2]|0;if((p|0)!=0){e=c[a+860>>2]|0;if((id[c[(c[e>>2]|0)+28>>2]&511](e,p,c[k>>2]|0,m)|0)==0){q=0}else{k=soa(p,m)|0;m=a+492|0;TI(m,k,0);e=wJ(m,0,0,0,0,0,1)|0;do{if((e|0)!=0){m=lH(e)|0;if(((m|0)!=0?(pe(f,38496),r=_H(m,f)|0,(r|0)!=0):0)?(c[r>>2]|0)==9:0){c[a+852>>2]=19;bH(e);s=1;break}r=lH(e)|0;c[g>>2]=38536;c[g+4>>2]=4;m=fJ(r,g)|0;if((m|0)==0){c[a+1864>>2]=0;c[a+852>>2]=20;bH(e);s=1;break}r=lH(e)|0;c[h>>2]=38528;c[h+4>>2]=7;t=a+1864|0;c[t>>2]=fJ(r,h)|0;bH(e);if((c[t>>2]|0)!=0){c[a+852>>2]=19;s=1;break}c[t>>2]=m;if((m|0)<(c[l>>2]|0)){c[j>>2]=m;c[a+852>>2]=20;s=1;break}else{c[a+852>>2]=19;s=1;break}}else{m=(c[j>>2]|0)+(c[a+496>>2]|0)|0;c[j>>2]=m;ld[c[c[b>>2]>>2]&255](b,m,n);s=0}}while(0);Rc[c[c[k>>2]>>2]&1023](k);q=s}}else{c[a+852>>2]=18;q=0}ila(p);o=q;i=d;return o|0}function uK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=a+908|0;f=c[e>>2]|0;g=c[a+864>>2]|0;if((f|0)<(g|0)?(h=(c[a+496>>2]|0)+f|0,f=(h+512|0)>(g|0)?g-h|0:512,g=c[a+856>>2]|0,(Qc[c[c[g>>2]>>2]&255](g,h,f)|0)==0):0){ld[c[c[b>>2]>>2]&255](b,h,f);j=0;i=d;return j|0}f=c[a+1864>>2]|0;if((f|0)==0){c[a+852>>2]=8;j=1;i=d;return j|0}else{c[e>>2]=f;c[a+852>>2]=4;j=1;i=d;return j|0}return 0}function vK(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+4|0;TI(a+12|0,c[a+860>>2]|0,c[a+832>>2]|0);c[a+328>>2]=0;e=a+836|0;if((YI(d,c[e>>2]|0)|0)==0?(ZI(d,c[e>>2]|0)|0)==0:0){c[a+852>>2]=19;f=0;i=b;return f|0}N1a(c[a+428>>2]|0,c[a+432>>2]|0,4,246);c[a+812>>2]=aJ(d)|0;c[a+816>>2]=DJ(d)|0;c[a+1780>>2]=d;c[a+852>>2]=9;f=1;i=b;return f|0}function wK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=c[a+856>>2]|0;f=a+864|0;if((Qc[c[c[e>>2]>>2]&255](e,0,c[f>>2]|0)|0)==0){ld[c[c[b>>2]>>2]&255](b,0,c[f>>2]|0);g=0;i=d;return g|0}else{c[a+852>>2]=17;g=1;i=d;return g|0}return 0}function xK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+32|0;e=d+16|0;f=d+8|0;g=d;c[e>>2]=0;h=mK(a,c[a+812>>2]|0,b,e)|0;b=a+808|0;c[b>>2]=h;if((c[e>>2]|0)==0){c[a+852>>2]=19;j=1;i=d;return j|0}if((h|0)==0){e=a+852|0;if((c[e>>2]|0)!=18){j=0;i=d;return j|0}c[e>>2]=19;j=1;i=d;return j|0}e=lH(h)|0;c[f>>2]=38568;c[f+4>>2]=5;h=_H(e,f)|0;if((h|0)!=0?(c[h>>2]|0)==9:0){c[a+1748>>2]=c[h+16>>2];h=lH(c[b>>2]|0)|0;c[g>>2]=669448;c[g+4>>2]=8;b=_H(h,g)|0;if((b|0)!=0?(c[b>>2]|0)==9:0){c[a+1792>>2]=1;c[a+1796>>2]=c[b+16>>2]}if((c[a+816>>2]|0)!=0){c[a+852>>2]=10;j=1;i=d;return j|0}b=a+852|0;if((c[a+1792>>2]|0)==0){c[b>>2]=13;j=1;i=d;return j|0}else{c[b>>2]=11;j=1;i=d;return j|0}}c[a+852>>2]=18;j=0;i=d;return j|0}function yK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d;c[e>>2]=0;f=mK(a,c[a+816>>2]|0,b,e)|0;if((c[e>>2]|0)==0){c[a+852>>2]=(c[a+1792>>2]|0)==0?13:11;g=1;i=d;return g|0}if((f|0)!=0){bH(f);c[a+852>>2]=(c[a+1792>>2]|0)==0?13:11;g=1;i=d;return g|0}f=a+852|0;if((c[f>>2]|0)==18){c[f>>2]=19;g=1;i=d;return g|0}if((c[a+908>>2]|0)!=(c[a+864>>2]|0)){g=0;i=d;return g|0}c[f>>2]=18;g=0;i=d;return g|0}function zK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d;c[e>>2]=0;f=mK(a,c[a+1748>>2]|0,b,e)|0;if((c[e>>2]|0)==0){c[a+852>>2]=19;g=1;i=d;return g|0}if((f|0)==0){e=a+852|0;if((c[e>>2]|0)!=18){g=0;i=d;return g|0}c[e>>2]=19;g=1;i=d;return g|0}e=(GK(a,c[a+1780>>2]|0,f)|0)==0;bH(f);f=a+852|0;if(e){c[f>>2]=18;g=0;i=d;return g|0}else{c[f>>2]=14;g=1;i=d;return g|0}return 0}function AK(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((QK(a,c[a+1748>>2]|0,a+1876|0,b)|0)==0){e=0;i=d;return e|0}if((SK(a,b)|0)==0){c[a+1868>>2]=1;e=0;i=d;return e|0}else{c[a+852>>2]=14;e=1;i=d;return e|0}return 0}function BK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;d=i;i=i+48|0;e=d+24|0;f=d+20|0;g=d+16|0;h=d+8|0;j=d;k=a+1732|0;l=a+1736|0;m=c[l>>2]|0;Ija(e,4);if((m|0)!=0){n=h+4|0;o=j+4|0;p=a+1844|0;q=0;do{r=SG(k,q)|0;c[f>>2]=0;s=mK(a,r,b,f)|0;do{if((s|0)==0){if((c[f>>2]|0)!=0){ax(e,r)}}else{t=c[s>>2]|0;if((t|0)==5){u=mH(s)|0;if((u|0)!=0?(v=c[u+16>>2]|0,(v|0)>0):0){w=0;do{x=FH(u,w)|0;if((x|0)!=0?(c[x>>2]|0)==9:0){ax(e,c[x+16>>2]|0)}w=w+1|0}while((w|0)<(v|0));y=c[s>>2]|0;z=14}}else{y=t;z=14}if((z|0)==14?(z=0,(y|0)==6):0){v=lH(s)|0;c[h>>2]=669480;c[n>>2]=4;aI(g,v,h);c[j>>2]=38568;c[o>>2]=5;if(vka(c[g>>2]|0,j)|0){yg(p,s)}else{bH(s)}dka(g);break}bH(s)}}while(0);q=q+1|0}while(q>>>0<m>>>0)}Kja(k,0)|0;if((c[e+4>>2]|0)!=0){Mja(k,e);A=0;B=c[e>>2]|0;Jja(B);i=d;return A|0}k=a+1844|0;m=c[a+1848>>2]|0;a:do{if((m|0)!=0){q=a+1780|0;g=0;while(1){p=Ch(k,g)|0;if((p|0)!=0?(j=(GK(a,c[q>>2]|0,p)|0)==0,bH(p),j):0){C=g;break}g=g+1|0;if(!(g>>>0<m>>>0)){break a}}while(1){g=C+1|0;if(!(C>>>0<m>>>0)){break}bH(Ch(k,g)|0);C=g}Kja(k,0)|0;c[a+852>>2]=18;A=0;B=c[e>>2]|0;Jja(B);i=d;return A|0}}while(0);Kja(k,0)|0;if((c[l>>2]|0)!=0){A=1;B=c[e>>2]|0;Jja(B);i=d;return A|0}c[a+852>>2]=17;A=1;B=c[e>>2]|0;Jja(B);i=d;return A|0}function CK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[a+852>>2]|0;if((e|0)==14){f=BK(a,b)|0}else if((e|0)==13){f=zK(a,b)|0}else if((e|0)==18){f=wK(a,b)|0}else{c[a+1772>>2]=1;c[a+1776>>2]=1;f=1}i=d;return f|0}function DK(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+16|0;d=b;e=a+868|0;f=c[(c[e>>2]|0)+52>>2]|0;if(((f|0)!=0?(c[d>>2]=38568,c[d+4>>2]=5,g=_H(f,d)|0,(g|0)!=0):0)?(c[g>>2]|0)==9:0){c[a+1748>>2]=c[g+16>>2];c[a+1780>>2]=c[(c[e>>2]|0)+44>>2];c[a+852>>2]=13;h=1;i=b;return h|0}c[a+852>>2]=18;h=0;i=b;return h|0}function EK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+16|0;e=d;f=a+1900|0;a=c[f>>2]|0;if((a|0)==0){g=u2a(20)|0;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;gla(g+4|0);c[f>>2]=g;h=g}else{h=a}c[e>>2]=0;if((kna(c[h+8>>2]|0,c[h+12>>2]|0,b,e)|0)==0){ona(c[f>>2]|0,b,1);j=1;i=d;return j|0}if((c[e>>2]|0)!=0){j=0;i=d;return j|0}ona(c[f>>2]|0,b,1);j=1;i=d;return j|0}function FK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;e=d;f=a+1900|0;a=c[f>>2]|0;if((a|0)==0){g=u2a(20)|0;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;gla(g+4|0);c[f>>2]=g;h=g}else{h=a}c[e>>2]=1;if((kna(c[h+8>>2]|0,c[h+12>>2]|0,b,e)|0)==0){i=d;return}ona(c[f>>2]|0,b,0);i=d;return}function GK(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+16|0;f=e;do{if((b|0)!=0){g=lH(d)|0;if((g|0)!=0?(c[f>>2]=38832,c[f+4>>2]=4,h=_H(g,f)|0,(h|0)!=0):0){g=c[h>>2]|0;if((g|0)==9){ax(a+1732|0,c[h+16>>2]|0);j=1;break}else if((g|0)==5){g=h+16|0;if((c[g>>2]|0)==0){j=1;break}k=a+1732|0;l=0;do{ax(k,c[(FH(h,l)|0)+16>>2]|0);l=l+1|0}while(l>>>0<(c[g>>2]|0)>>>0);j=1}else{c[a+852>>2]=18;j=0;break}}else{j=1}}else{c[a+852>>2]=18;j=0}}while(0);i=e;return j|0}function HK(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;i=i+32|0;f=e+28|0;g=e+24|0;h=e+16|0;j=e+8|0;k=e;l=soa(b,d)|0;d=SI(l)|0;if((d|0)==-1){c[a+852>>2]=18;m=0;n=c[l>>2]|0;o=c[n>>2]|0;Rc[o&1023](l);i=e;return m|0}c[a+832>>2]=d;b=a+492|0;TI(b,l,d);d=a+512|0;c[a+496>>2]=(c[d>>2]|0)+9;c[f>>2]=0;XI(g,b,f);if((c[f>>2]|0)!=0){f=c[g>>2]|0;b=gma((f|0)==0?1305928:f+12|0)|0;f=a+820|0;p=c[f>>2]|0;if((p|0)!=0){bH(p);c[f>>2]=0}p=IK(a,(c[d>>2]|0)+9|0,b)|0;c[f>>2]=p;if(((((p|0)!=0?(lH(p)|0)!=0:0)?(p=lH(c[f>>2]|0)|0,c[h>>2]=38648,c[h+4>>2]=10,(_H(p,h)|0)!=0):0)?(h=lH(c[f>>2]|0)|0,c[j>>2]=1274632,c[j+4>>2]=1,p=_H(h,j)|0,(p|0)!=0):0)?(j=jH(p)|0,p=c[a+860>>2]|0,(j|0)==(Lc[c[(c[p>>2]|0)+16>>2]&255](p)|0)):0){c[a+1752>>2]=1;p=lH(c[f>>2]|0)|0;c[k>>2]=669064;c[k+4>>2]=1;f=_H(p,k)|0;if((f|0)!=0?(c[f>>2]|0)==2:0){c[a+1756>>2]=jH(f)|0;q=1}else{q=1}}else{q=0}}else{q=0}dka(g);m=q;n=c[l>>2]|0;o=c[n>>2]|0;Rc[o&1023](l);i=e;return m|0}function IK(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;i=i+32|0;f=e+20|0;g=e+16|0;h=e+12|0;j=e+8|0;k=e;l=a+492|0;m=a+496|0;a=c[m>>2]|0;c[m>>2]=b;XI(g,l,f);if((c[f>>2]|0)==0){n=0;dka(g);i=e;return n|0}b=c[g>>2]|0;if(!((d|0)==0|(gma((b|0)==0?1305928:b+12|0)|0)==(d|0))){n=0;dka(g);i=e;return n|0}XI(h,l,f);ika(g,h);dka(h);if((c[f>>2]|0)==0){n=0;dka(g);i=e;return n|0}f=c[g>>2]|0;h=gma((f|0)==0?1305928:f+12|0)|0;WI(j,l);c[k>>2]=38576;c[k+4>>2]=3;f=vka(c[j>>2]|0,k)|0;dka(j);if(f){f=wJ(l,0,d,h,0,0,1)|0;c[m>>2]=a;n=f;dka(g);i=e;return n|0}else{c[m>>2]=a;n=0;dka(g);i=e;return n|0}return 0}function JK(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;i=i+1024|0;d=b;e=c[a+856>>2]|0;if((Qc[c[c[e>>2]>>2]&255](e,0,1024)|0)==0){f=-1;i=b;return f|0}e=a+860|0;g=c[e>>2]|0;if((g|0)==0){f=0;i=b;return f|0}if((Lc[c[(c[g>>2]|0)+16>>2]&255](g)|0)<1024){f=-1;i=b;return f|0}g=c[e>>2]|0;id[c[(c[g>>2]|0)+28>>2]&511](g,d,0,1024)|0;f=(HK(a,d,1024)|0)!=0&1;i=b;return f|0}function KK(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=i;i=i+64|0;f=e+40|0;g=e+36|0;h=e+32|0;j=e+24|0;k=e+16|0;l=e+8|0;m=e;c[d>>2]=0;n=a+908|0;o=c[n>>2]|0;p=c[a+864>>2]|0;q=(o+512|0)>(p|0)?p-o|0:512;p=c[a+856>>2]|0;if((Qc[c[c[p>>2]>>2]&255](p,o,q)|0)==0){ld[c[c[b>>2]>>2]&255](b,c[n>>2]|0,q);r=0;i=e;return r|0}b=a+1784|0;o=(c[n>>2]|0)+q-(c[b>>2]|0)|0;hla(f,o);q=c[f+4>>2]|0;f=c[a+860>>2]|0;id[c[(c[f>>2]|0)+28>>2]&511](f,q,c[b>>2]|0,o)|0;b=soa(q,o)|0;o=a+12|0;TI(o,b,0);c[g>>2]=0;XI(h,o,g);do{if((c[g>>2]|0)==0){s=-1}else{o=c[h>>2]|0;f=yJ(a+4|0,0,0,gma((o|0)==0?1305928:o+12|0)|0,0)|0;if((f|0)==0){c[n>>2]=(c[n>>2]|0)+(c[a+16>>2]|0);s=0;break}o=lH(f)|0;if(((o|0)!=0?(c[j>>2]=669480,c[j+4>>2]=4,p=_H(o,j)|0,(p|0)!=0):0)?(c[p>>2]|0)==4:0){dH(k,p);c[l>>2]=38552;c[l+4>>2]=4;p=vka(c[k>>2]|0,l)|0;dka(k);if(p){c[n>>2]=(c[n>>2]|0)+(c[a+16>>2]|0);p=lH(f)|0;c[m>>2]=38536;c[m+4>>2]=4;c[d>>2]=eI(p,m)|0;bH(f);s=1;break}else{bH(f);s=-1;break}}bH(f);s=-1}}while(0);dka(h);Rc[c[c[b>>2]>>2]&1023](b);ila(q);r=s;i=e;return r|0}function LK(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+16|0;f=e+12|0;g=e+8|0;h=e+4|0;j=e;k=b+1184|0;c[k>>2]=0;if((MK(b,f)|0)==0){l=0;i=e;return l|0}m=a[f>>0]|0;n=m&255;o=m;a:while(1){p=a[39080+n>>0]|0;if(p<<24>>24==87){if((MK(b,f)|0)==0){l=0;q=32;break}m=a[f>>0]|0;n=m&255;o=m;continue}if(!(o<<24>>24==37)){q=10;break}do{if((MK(b,f)|0)==0){l=0;q=32;break a}r=a[f>>0]|0}while(!(r<<24>>24==10|r<<24>>24==13));n=r&255;o=r}if((q|0)==10){if(!(p<<24>>24==68)){p=o;do{r=c[k>>2]|0;if(r>>>0<256){c[k>>2]=r+1;a[b+r+924>>0]=p}if((MK(b,f)|0)==0){l=0;q=32;break}p=a[f>>0]|0;r=a[39080+(p&255)>>0]|0}while(!(r<<24>>24==87|r<<24>>24==68));if((q|0)==32){i=e;return l|0}p=b+908|0;c[p>>2]=(c[p>>2]|0)+ -1;gka(j,b+924|0,c[k>>2]|0);ika(d,j);dka(j);l=1;i=e;return l|0}j=c[k>>2]|0;c[k>>2]=j+1;p=b+924|0;a[b+j+924>>0]=o;do{if(o<<24>>24==47){if((MK(b,f)|0)==0){l=0;i=e;return l|0}while(1){j=a[f>>0]|0;r=a[39080+(j&255)>>0]|0;if(!(r<<24>>24==78|r<<24>>24==82)){break}r=c[k>>2]|0;if(r>>>0<256){c[k>>2]=r+1;a[b+r+924>>0]=j}if((MK(b,f)|0)==0){l=0;q=32;break}}if((q|0)==32){i=e;return l|0}j=b+908|0;c[j>>2]=(c[j>>2]|0)+ -1;gka(g,p,c[k>>2]|0);ika(d,g);dka(g);l=1;i=e;return l|0}else if(o<<24>>24==62){if((MK(b,f)|0)==0){l=0;i=e;return l|0}if((a[f>>0]|0)==62){j=c[k>>2]|0;c[k>>2]=j+1;a[b+j+924>>0]=62;break}else{j=b+908|0;c[j>>2]=(c[j>>2]|0)+ -1;break}}else if(o<<24>>24==60){if((MK(b,f)|0)==0){l=0;i=e;return l|0}if((a[f>>0]|0)==60){j=c[k>>2]|0;c[k>>2]=j+1;a[b+j+924>>0]=60;break}else{j=b+908|0;c[j>>2]=(c[j>>2]|0)+ -1;break}}}while(0);gka(h,p,c[k>>2]|0);ika(d,h);dka(h);l=1;i=e;return l|0}else if((q|0)==32){i=e;return l|0}return 0}function MK(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;f=b+908|0;g=c[f>>2]|0;h=c[b+864>>2]|0;if((g|0)>=(h|0)){j=0;i=e;return j|0}k=b+912|0;l=c[k>>2]|0;if((l|0)<(g|0)?((c[b+916>>2]|0)+l|0)>(g|0):0){m=l}else{n=4}do{if((n|0)==4){l=(h|0)<512?h:512;o=(l+g|0)>(h|0)?h-l|0:g;p=c[b+860>>2]|0;if((id[c[(c[p>>2]|0)+28>>2]&511](p,b+1188|0,o,l)|0)==0){j=0;i=e;return j|0}else{c[k>>2]=o;c[b+916>>2]=l;m=o;break}}}while(0);a[d>>0]=a[b+(g-m)+1188>>0]|0;c[f>>2]=(c[f>>2]|0)+1;j=1;i=e;return j|0}function NK(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=a+852|0;while(1){g=c[f>>2]|0;if((g|0)==18){h=5;break}else if((g|0)==13){if((AK(a,d)|0)==0){j=0;h=7;break}else{continue}}else if((g|0)==14){if((OK(a,b,d)|0)==0){j=0;h=7;break}else{continue}}else{h=6;break}}if((h|0)==5){j=wK(a,d)|0;i=e;return j|0}else if((h|0)==6){c[a+1772>>2]=1;c[a+1776>>2]=1;c[a+1872>>2]=1;c[f>>2]=14;j=1;i=e;return j|0}else if((h|0)==7){i=e;return j|0}return 0}function OK(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e;g=c[a+868>>2]|0;if((VG(c[g+84>>2]|0)|0)>(b|0)?(SG(g+80|0,b)|0)==0:0){g=a+1876|0;if((c[g>>2]|0)!=1){c[f>>2]=-1;h=RK(a,g,b,f,d)|0;i=e;return h|0}d=a+852|0;if((b|0)==0){c[d>>2]=17;h=1;i=e;return h|0}else{c[d>>2]=18;h=1;i=e;return h|0}}c[a+852>>2]=17;h=1;i=e;return h|0}function PK(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;i=i+16|0;g=f;c[g>>2]=0;h=mK(a,b,e,g)|0;if((c[g>>2]|0)==0){c[a+852>>2]=18;j=0;i=f;return j|0}if((h|0)==0){g=a+852|0;if((c[g>>2]|0)!=18){j=0;i=f;return j|0}c[g>>2]=18;j=0;i=f;return j|0}if((c[h>>2]|0)!=5){bH(h);c[a+852>>2]=18;j=0;i=f;return j|0}c[d>>2]=2;a=h+16|0;if((c[a>>2]|0)!=0){g=d+8|0;d=0;do{e=FH(h,d)|0;if((e|0)!=0?(c[e>>2]|0)==9:0){b=u2a(24)|0;mL(b);yg(g,b);c[b+4>>2]=c[e+16>>2]}d=d+1|0}while(d>>>0<(c[a>>2]|0)>>>0)}bH(h);j=1;i=f;return j|0}function QK(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;f=i;i=i+48|0;g=f+36|0;h=f+32|0;j=f+24|0;k=f+16|0;l=f+8|0;m=f;c[g>>2]=0;n=mK(a,b,e,g)|0;if((c[g>>2]|0)==0){c[a+852>>2]=18;o=0;i=f;return o|0}if((n|0)==0){g=a+852|0;if((c[g>>2]|0)!=18){o=0;i=f;return o|0}c[g>>2]=18;o=0;i=f;return o|0}g=c[n>>2]|0;if((g|0)==6){c[d+4>>2]=b;e=lH(n)|0;if((e|0)==0){c[h>>2]=0;p=0}else{c[j>>2]=669480;c[j+4>>2]=4;aI(h,e,j);p=c[h>>2]|0}c[k>>2]=38568;c[k+4>>2]=5;do{if(vka(p,k)|0){c[d>>2]=2;c[l>>2]=38832;c[l+4>>2]=4;j=_H(e,l)|0;if((j|0)==0){c[a+852>>2]=14;q=1;break}r=c[j>>2]|0;if((r|0)==9){s=u2a(24)|0;mL(s);yg(d+8|0,s);c[s+4>>2]=c[j+16>>2];t=26;break}else if((r|0)!=5){t=26;break}r=j+16|0;if((c[r>>2]|0)==0){t=26}else{s=d+8|0;u=0;do{v=FH(j,u)|0;if((v|0)!=0?(c[v>>2]|0)==9:0){w=u2a(24)|0;mL(w);yg(s,w);c[w+4>>2]=c[v+16>>2]}u=u+1|0}while(u>>>0<(c[r>>2]|0)>>>0);t=26}}else{c[m>>2]=38816;c[m+4>>2]=4;if(vka(p,m)|0){c[d>>2]=1;t=26;break}else{bH(n);c[a+852>>2]=18;q=0;break}}}while(0);if((t|0)==26){bH(n);q=1}dka(h);o=q;i=f;return o|0}else if((g|0)==5){c[d+4>>2]=b;c[d>>2]=3;bH(n);o=1;i=f;return o|0}else{bH(n);c[a+852>>2]=18;o=0;i=f;return o|0}return 0}function RK(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;g=i;h=b+8|0;j=c[b+12>>2]|0;if((j|0)==0){c[a+852>>2]=18;k=0;i=g;return k|0}if((j|0)<=0){k=1;i=g;return k|0}b=a+868|0;l=0;while(1){m=Ch(h,l)|0;if((m|0)!=0){n=c[m>>2]|0;if((n|0)==2){if((RK(a,m,d,e,f)|0)==0){k=0;o=18;break}else{p=l}}else if((n|0)==1){q=(c[e>>2]|0)+1|0;c[e>>2]=q;if((q|0)==(d|0)?(q=c[b>>2]|0,(q|0)!=0):0){QG(q+80|0,d,c[m+4>>2]|0);p=l}else{p=l}}else if((n|0)==3){if((PK(a,c[m+4>>2]|0,m,f)|0)==0){k=0;o=18;break}p=l+ -1|0}else if((n|0)==0){if((QK(a,c[m+4>>2]|0,m,f)|0)==0){k=0;o=18;break}p=l+ -1|0}else{p=l}if((c[e>>2]|0)==(d|0)){o=16;break}else{r=p}}else{r=l}l=r+1|0;if((l|0)>=(j|0)){k=1;o=18;break}}if((o|0)==16){c[a+852>>2]=17;k=1;i=g;return k|0}else if((o|0)==18){i=g;return k|0}return 0}function SK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+32|0;e=d+16|0;f=d+8|0;g=d;c[e>>2]=0;h=mK(a,c[a+1748>>2]|0,b,e)|0;if((c[e>>2]|0)==0){c[a+852>>2]=18;j=0;i=d;return j|0}if((h|0)==0){j=0;i=d;return j|0}e=lH(h)|0;if((e|0)==0){bH(h);c[a+852>>2]=18;j=0;i=d;return j|0}c[f>>2]=38832;c[f+4>>2]=4;if((nI(e,f)|0)==0){bH(h);j=1;i=d;return j|0}else{c[g>>2]=38848;c[g+4>>2]=5;f=(eI(e,g)|0)>0;bH(h);j=f&1;i=d;return j|0}return 0}function TK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=a+1772|0;while(1){if((c[e>>2]|0)!=0){break}if((CK(a,b)|0)==0){f=0;g=6;break}}if((g|0)==6){i=d;return f|0}if((c[a+1776>>2]|0)!=0){f=1;i=d;return f|0}NG(c[a+868>>2]|0);f=0;i=d;return f|0}function UK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=a+1760|0;if((c[e>>2]|0)!=0){f=1;i=d;return f|0}g=c[a+856>>2]|0;h=a+836|0;j=c[h>>2]|0;k=a+864|0;if((Qc[c[c[g>>2]>>2]&255](g,j,(c[k>>2]|0)-j|0)|0)==0){j=c[h>>2]|0;ld[c[c[b>>2]>>2]&255](b,j,(c[k>>2]|0)-j|0);f=0;i=d;return f|0}j=a+1764|0;if((c[j>>2]|0)==0){do{if((OJ(c[(c[a+868>>2]|0)+44>>2]|0)|0)==0){if((DK(a)|0)==0){f=0;i=d;return f|0}else{c[a+1768>>2]=1;break}}}while(0);c[j>>2]=1}c[e>>2]=1;f=1;i=d;return f|0}function VK(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+48|0;f=e+32|0;g=e+16|0;h=e;j=a+892|0;if((c[a+896>>2]|0)!=0){Ija(h,4);k=dK(a,j,0,d,h)|0;Kja(j,0)|0;if((k|0)==0){Mja(j,h)}Jja(c[h>>2]|0);l=k;i=e;return l|0}Kja(j,0)|0;Kja(a+876|0,0)|0;k=RG(c[a+868>>2]|0,b)|0;if((k|0)==0){l=1;i=e;return l|0}c[f>>2]=38856;c[f+4>>2]=6;b=_H(k,f)|0;if((b|0)==0){l=1;i=e;return l|0}Ija(g,4);yg(g,b);b=dK(a,g,0,d,j)|0;if((b|0)!=0){Kja(j,0)|0}Jja(c[g>>2]|0);l=b;i=e;return l|0}function WK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;e=d+8|0;f=d;pe(e,38824);g=_H(b,e)|0;if((g|0)==0){h=0;i=d;return h|0}e=lH(g)|0;if((e|0)==0){h=0;i=d;return h|0}pe(f,38864);g=_H(e,f)|0;if((g|0)==0){h=WK(a,e)|0;i=d;return h|0}else{c[a+1828>>2]=g;h=1;i=d;return h|0}return 0}function XK(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;i=i+48|0;f=e+40|0;g=e+24|0;h=e+8|0;j=e;k=a+868|0;if((c[k>>2]|0)==0){l=0;i=e;return l|0}if((EK(a,b)|0)!=0){c[a+1872>>2]=0;c[a+1836>>2]=0;c[a+1788>>2]=0;c[a+1832>>2]=0;Kja(a+892|0,0)|0;Kja(a+876|0,0)|0}m=a+1904|0;n=c[m>>2]|0;if((n|0)==0){o=u2a(20)|0;c[o+0>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[o+16>>2]=0;gla(o+4|0);c[m>>2]=o;p=o}else{p=n}c[f>>2]=0;n=(kna(c[p+8>>2]|0,c[p+12>>2]|0,b,f)|0)!=0;if(n&(c[f>>2]|0)!=0){l=1;i=e;return l|0}do{if((c[a+1752>>2]|0)==0){if(((c[a+1868>>2]|0)==0?(c[a+1872>>2]|0)==0:0)?(NK(a,b,d)|0)==0:0){l=0;i=e;return l|0}}else{if((c[a+1756>>2]|0)==(b|0)){ona(c[m>>2]|0,b,1);l=1;i=e;return l|0}if((UK(a,d)|0)==0){l=0;i=e;return l|0}if((c[a+1768>>2]|0)==0){if((wK(a,d)|0)==0){l=0;i=e;return l|0}_I(c[(c[k>>2]|0)+44>>2]|0);FK(a,b);l=1;i=e;return l|0}if((c[a+1868>>2]|0)!=0){if((TK(a,d)|0)==0){l=0}else{break}i=e;return l|0}if((c[a+1872>>2]|0)==0?(NK(a,b,d)|0)==0:0){l=0;i=e;return l|0}}}while(0);do{if((c[a+1792>>2]|0)!=0?(f=a+1800|0,(c[f>>2]|0)==0):0){if((kK(a,d)|0)==0){l=0;i=e;return l|0}else{c[f>>2]=1;break}}}while(0);f=a+1836|0;if((c[f>>2]|0)==0){n=a+892|0;do{if((c[a+896>>2]|0)==0){Kja(n,0)|0;Kja(a+876|0,0)|0;p=RG(c[k>>2]|0,b)|0;o=a+1824|0;c[o>>2]=p;if((p|0)==0){FK(a,b);l=1;i=e;return l|0}Ija(g,4);yg(g,c[o>>2]|0);if((dK(a,g,1,d,n)|0)!=0){Kja(n,0)|0;c[f>>2]=1;Jja(c[g>>2]|0);break}Jja(c[g>>2]|0);l=0;i=e;return l|0}else{Ija(h,4);o=dK(a,n,0,d,h)|0;Kja(n,0)|0;if((o|0)!=0){c[f>>2]=1;Jja(c[h>>2]|0);break}Mja(n,h);Jja(c[h>>2]|0);l=0;i=e;return l|0}}while(0);if((c[f>>2]|0)!=0){q=36}}else{q=36}do{if((q|0)==36?(h=a+1788|0,(c[h>>2]|0)==0):0){if((VK(a,b,d)|0)==0){l=0;i=e;return l|0}else{c[h>>2]=1;break}}}while(0);h=a+1824|0;n=c[h>>2]|0;g=a+1832|0;k=(c[g>>2]|0)==0;if((n|0)==0){if(!k){q=45}}else{if(k){pe(j,38864);if((_H(n,j)|0)==0){c[g>>2]=WK(a,c[h>>2]|0)|0}c[g>>2]=0}else{q=45}}do{if((q|0)==45){if((YK(a,d)|0)==0){l=0;i=e;return l|0}else{c[g>>2]=0;break}}}while(0);c[f>>2]=0;c[a+1788>>2]=0;c[a+1872>>2]=0;FK(a,b);ona(c[m>>2]|0,b,1);l=1;i=e;return l|0}function YK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+32|0;e=d+16|0;f=d;g=a+892|0;if((c[a+896>>2]|0)==0){Kja(g,0)|0;Ija(e,4);yg(e,c[a+1828>>2]|0);h=dK(a,e,1,b,g)|0;if((h|0)!=0){Kja(g,0)|0}Jja(c[e>>2]|0);j=h;i=d;return j|0}else{Ija(f,4);h=dK(a,g,0,b,f)|0;Kja(g,0)|0;if((h|0)==0){Mja(g,f)}Jja(c[f>>2]|0);j=h;i=d;return j|0}return 0}function ZK(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;if((b|0)!=0){c[b>>2]=c[a+836>>2]}if((d|0)==0){i=e;return}c[d>>2]=(c[a+864>>2]|0)-(c[a+836>>2]|0);i=e;return}function _K(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+32|0;e=d+16|0;f=d;g=c[a+868>>2]|0;if((g|0)==0){h=1;i=d;return h|0}j=a+1840|0;if((c[j>>2]|0)==0){k=c[g+52>>2]|0;if((k|0)==0){h=1;i=d;return h|0}c[e>>2]=669448;c[e+4>>2]=8;g=_H(k,e)|0;if((g|0)==0){h=2;i=d;return h|0}if((c[a+1764>>2]|0)==0?(UK(a,b)|0)==0:0){h=0;i=d;return h|0}if((c[a+896>>2]|0)==0){yg(a+892|0,lH(g)|0)}c[j>>2]=1}Ija(f,4);j=a+892|0;g=dK(a,j,0,b,f)|0;Kja(j,0)|0;if((g|0)==0){Mja(j,f);l=0}else{l=1}Jja(c[f>>2]|0);h=l;i=d;return h|0}function $K(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;f=a+4|0;g=c[a+8>>2]|0;a:do{if((g|0)<1){h=0;j=0}else{a=g+ -1|0;k=0;while(1){l=a;while(1){m=(l+k|0)/2|0;SG(f,m)|0;if((SG(f,m)|0)==(b|0)){h=1;j=m;break a}n=m+ -1|0;if(!((SG(f,m)|0)>>>0>b>>>0)){break}if((k|0)>(n|0)){h=0;j=k;break a}else{l=n}}n=(SG(f,m)|0)>>>0<b>>>0;o=n?m+1|0:k;if((o|0)>(l|0)){h=0;j=o;break}else{a=l;k=o}}}}while(0);c[d>>2]=j;i=e;return h|0}function aL(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+8|0;e=c[a+12>>2]|0;if((e|0)>0){a=0;do{f=c[(Hg(d,a)|0)>>2]|0;if((f|0)!=0){aL(f);v2a(f)}a=a+1|0}while((a|0)<(e|0))}Kja(d,0)|0;Jja(c[d>>2]|0);i=b;return}function bL(a){a=a|0;return c[a+360>>2]|0}function cL(a){a=a|0;return c[a+1752>>2]|0}function dL(a){a=a|0;var b=0,c=0;b=i;c=eL(1,(a|0)>-1)|0;i=b;return c|0}function eL(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=fL((b&1|(a?0:2))^1)|0;i=c;return d|0}function fL(a){a=a|0;if(a>>>0<4){return a|0}else{_a(38880,38968,99,39056)}return 0}function gL(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;i=i+16|0;g=f;iL(g,d,e);hL(a,c[b>>2]|0,c[b+4>>2]|0,c[g>>2]|0,c[g+4>>2]|0);i=f;return}function hL(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=i;h=fL((e>>>0<=~b>>>0?0:2)|d|f)|0;c[a>>2]=e+b;c[a+4>>2]=fL(h)|0;i=g;return}function iL(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;jL(a,b,c);i=d;return}function jL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;c[a>>2]=b;c[a+4>>2]=fL(dL(b)|0|d)|0;i=e;return}function kL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e;c[f>>2]=0;g=lL(c[b>>2]|0,c[d>>2]|0,f)|0;h=fL(c[b+4>>2]|c[f>>2]|c[d+4>>2])|0;c[a>>2]=g;c[a+4>>2]=fL(h)|0;i=e;return}function lL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=b+a|0;if(((e^a)&(e^b)|0)>-1){f=0}else{f=(e>>>31)+1|0}c[d>>2]=f;return e|0}function mL(a){a=a|0;var b=0;b=i;c[a>>2]=0;Ija(a+8|0,4);i=b;return}function nL(a,b,d){a=a|0;b=b|0;d=d|0;c[a>>2]=b;c[a+4>>2]=d;c[a+8>>2]=0;return}function oL(a,b){a=a|0;b=b|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=0;return}function pL(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;h=i;c[e>>2]=0;c[f>>2]=0;c[g>>2]=0;j=b+4|0;k=c[j>>2]|0;l=b+8|0;m=c[l>>2]|0;if(!(k>>>0>m>>>0)){i=h;return}n=c[b>>2]|0;o=m;a:while(1){m=o+1|0;c[l>>2]=m;p=a[n+o>>0]|0;q=a[39080+(p&255)>>0]|0;if(q<<24>>24==87){r=m;while(1){if(!(k>>>0>r>>>0)){s=33;break a}t=r+1|0;c[l>>2]=t;u=a[n+r>>0]|0;v=a[39080+(u&255)>>0]|0;if(v<<24>>24==87){r=t}else{w=t;x=u;y=v;break}}}else{w=m;x=p;y=q}if(x<<24>>24==37){z=w}else{s=10;break}do{if(!(k>>>0>z>>>0)){s=33;break a}r=z;z=z+1|0;c[l>>2]=z;v=a[n+r>>0]|0}while(!(v<<24>>24==10|v<<24>>24==13));if(k>>>0>z>>>0){o=z}else{s=33;break}}if((s|0)==10){z=w+ -1|0;c[e>>2]=n+z;if(!(y<<24>>24==68)){c[g>>2]=1;n=y;y=1;while(1){c[f>>2]=y;if(!(n<<24>>24==78)){c[g>>2]=2}A=c[l>>2]|0;if(!((c[j>>2]|0)>>>0>A>>>0)){s=33;break}c[l>>2]=A+1;e=a[39080+(d[(c[b>>2]|0)+A>>0]|0)>>0]|0;if(e<<24>>24==87|e<<24>>24==68){break}n=e;y=(c[f>>2]|0)+1|0}if((s|0)==33){i=h;return}c[l>>2]=A;i=h;return}if(x<<24>>24==47){A=c[j>>2]|0;y=c[l>>2]|0;if(!(A>>>0>y>>>0)){i=h;return}n=c[b>>2]|0;e=y;while(1){y=e+1|0;c[l>>2]=y;w=a[39080+(d[n+e>>0]|0)>>0]|0;if(!(w<<24>>24==78|w<<24>>24==82)){break}if(A>>>0>y>>>0){e=y}else{s=33;break}}if((s|0)==33){i=h;return}c[l>>2]=e;c[f>>2]=e-z;c[g>>2]=4;i=h;return}c[g>>2]=3;c[f>>2]=1;if(x<<24>>24==62){g=c[l>>2]|0;if(!((c[j>>2]|0)>>>0>g>>>0)){i=h;return}c[l>>2]=g+1;if((a[(c[b>>2]|0)+g>>0]|0)==62){c[f>>2]=2;i=h;return}else{c[l>>2]=g;i=h;return}}else if(x<<24>>24==60){x=c[l>>2]|0;if(!((c[j>>2]|0)>>>0>x>>>0)){i=h;return}c[l>>2]=x+1;if((a[(c[b>>2]|0)+x>>0]|0)==60){c[f>>2]=2;i=h;return}else{c[l>>2]=x;i=h;return}}else{i=h;return}}else if((s|0)==33){i=h;return}}function qL(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;e=i;i=i+16|0;f=e+8|0;g=e+4|0;pL(d,f,g,e);h=c[g>>2]|0;g=c[f>>2]|0;do{if((h|0)==1){f=a[g>>0]|0;if(f<<24>>24==60){j=d+8|0;k=c[j>>2]|0;l=c[d+4>>2]|0;a:do{if(k>>>0<l>>>0){m=c[d>>2]|0;n=k;while(1){if((a[m+n>>0]|0)==62){o=n;break a}p=n+1|0;c[j>>2]=p;if(p>>>0<l>>>0){n=p}else{o=p;break}}}else{o=k}}while(0);if(o>>>0<l>>>0){k=o+1|0;c[j>>2]=k;q=k}else{q=o}k=q-g+(c[d>>2]|0)|0;c[b>>2]=g;c[b+4>>2]=k;i=e;return}else if(!(f<<24>>24==40)){break}k=d+8|0;n=c[k>>2]|0;m=c[d+4>>2]|0;b:do{if(n>>>0<m>>>0){p=c[d>>2]|0;r=n;s=1;while(1){t=a[p+r>>0]|0;if(t<<24>>24==40){u=r;v=s+1|0}else if(t<<24>>24==92){if(!(m>>>0>r>>>0)){w=r;break b}x=r+1|0;c[k>>2]=x;u=x;v=s}else if(t<<24>>24==41){t=s+ -1|0;if((t|0)==0){w=r;break b}else{u=r;v=t}}else{u=r;v=s}if(!(m>>>0>u>>>0)){w=u;break b}t=u+1|0;c[k>>2]=t;if(t>>>0<m>>>0){r=t;s=v}else{w=t;break}}}else{w=n}}while(0);if(w>>>0<m>>>0){n=w+1|0;c[k>>2]=n;y=n}else{y=w}n=y-g+(c[d>>2]|0)|0;c[b>>2]=g;c[b+4>>2]=n;i=e;return}}while(0);c[b>>2]=g;c[b+4>>2]=h;i=e;return}function rL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;i=i+16|0;f=e;g=d+1|0;d=w2a(g,4)|0;h=a+8|0;j=f+4|0;k=0;l=0;while(1){m=l+1|0;c[d+(l<<2)>>2]=c[h>>2];l=(m|0)==(g|0)?0:m;k=(k|0)<(g|0)?k+1|0:g;qL(f,a);if((c[j>>2]|0)==0){n=3;break}if(!((k|0)<(g|0)|(Ue(f,b)|0)^1)){n=5;break}}if((n|0)==3){v2a(d);o=0;i=e;return o|0}else if((n|0)==5){c[h>>2]=c[d+(l<<2)>>2];v2a(d);o=1;i=e;return o|0}return 0}function sL(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+16|0;f=e;g=c[d+4>>2]|0;h=c[d>>2]|0;if((P2a(h,35,g)|0)==0){jka(b,d);i=e;return}c[f>>2]=0;d=Bka(f,g)|0;if((g|0)>0){j=g+ -2|0;k=0;l=d;while(1){m=a[h+k>>0]|0;if(m<<24>>24==35){if((k|0)<(j|0)){n=(tL(a[h+(k+1)>>0]|0)|0)<<4;o=k+2|0;p=o;q=(tL(a[h+o>>0]|0)|0)+n&255}else{p=k;q=35}}else{p=k;q=m}m=l+1|0;a[l>>0]=q;k=p+1|0;if((k|0)>=(g|0)){r=m;break}else{l=m}}}else{r=d}Aka(f,r-d|0);hka(b,f);dka(f);i=e;return}function tL(a){a=a|0;var b=0,c=0,d=0;b=i;c=a<<24>>24;if((a+ -48<<24>>24&255)<10){d=c+ -48|0;i=b;return d|0}if(!((a+ -97<<24>>24&255)<6)){i=b;return((a+ -65<<24>>24&255)<6?c+ -55|0:0)|0}d=c+ -87|0;i=b;return d|0}function uL(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;e=d;f=c[b>>2]|0;g=(f|0)==0;if(g){h=0}else{h=c[f+4>>2]|0}if((P2a(g?1305928:f+12|0,35,h)|0)==0){hka(a,b);i=d;return}else{oe(e,b);sL(a,e);i=d;return}}function vL(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+16|0;f=e;g=c[d>>2]|0;h=(g|0)==0;j=h?1305928:g+12|0;if(!h){h=c[g+4>>2]|0;if((h|0)>0){g=0;k=0;while(1){l=a[j+k>>0]|0;if(!(l<<24>>24<0|l<<24>>24==35)?(m=a[39080+(l&255)>>0]|0,!(m<<24>>24==68|m<<24>>24==87)):0){n=g+1|0}else{n=g+3|0}k=k+1|0;if((k|0)==(h|0)){o=1;p=n;break}else{g=n}}}else{o=0;p=0}if((p|0)!=(h|0)){c[f>>2]=0;n=Bka(f,p)|0;if(o){o=0;p=0;while(1){g=a[j+p>>0]|0;k=g&255;if(!(g<<24>>24<0|g<<24>>24==35)?(m=a[39080+k>>0]|0,!(m<<24>>24==68|m<<24>>24==87)):0){a[n+o>>0]=g;q=o}else{a[n+o>>0]=35;g=o+2|0;a[n+(o+1)>>0]=a[756320+(k>>>4)>>0]|0;a[n+g>>0]=a[756320+(k&15)>>0]|0;q=g}g=q+1|0;p=p+1|0;if((p|0)==(h|0)){r=g;break}else{o=g}}}else{r=0}a[n+r>>0]=0;Aka(f,-1);hka(b,f);dka(f);i=e;return}}hka(b,d);i=e;return}function wL(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;d=i;i=i+144|0;e=d+128|0;f=d+120|0;g=d+116|0;h=d+112|0;j=d+104|0;k=d+100|0;l=d+96|0;m=d+88|0;n=d+80|0;o=d+72|0;p=d+64|0;q=d+60|0;r=d+56|0;s=d+48|0;t=d+40|0;u=d+32|0;v=d;if((b|0)==0){qla(a,39344,5)|0;i=d;return a|0}switch(c[b>>2]|0){case 7:{qla(wL(a,c[b+12>>2]|0)|0,39392,8)|0;EI(v);rH(v,b,1,0,0);nla(a,vH(v)|0,sH(v)|0);qla(a,39408,11)|0;FI(v);i=d;return a|0};case 2:case 1:{pe(e,1305864);v=qla(a,c[e>>2]|0,c[e+4>>2]|0)|0;dH(g,b);oe(f,g);qla(v,c[f>>2]|0,c[f+4>>2]|0)|0;dka(g);i=d;return a|0};case 3:{dH(h,b);EG(k,h,c[b+16>>2]|0);oe(j,k);qla(a,c[j>>2]|0,c[j+4>>2]|0)|0;dka(k);dka(h);i=d;return a|0};case 5:{qla(a,1292048,1)|0;h=b+16|0;if((c[h>>2]|0)!=0){k=p+4|0;j=0;do{g=FH(b,j)|0;f=g+4|0;if((c[f>>2]|0)==0){wL(a,g)|0}else{pe(p,1305864);g=qla(a,c[p>>2]|0,c[k>>2]|0)|0;qla(sla(g,c[f>>2]|0)|0,39360,4)|0}j=j+1|0}while(j>>>0<(c[h>>2]|0)>>>0)}qla(a,39368,1)|0;i=d;return a|0};case 4:{dH(l,b);h=qla(a,1305904,1)|0;vL(n,l);oe(m,n);qla(h,c[m>>2]|0,c[m+4>>2]|0)|0;dka(n);dka(l);i=d;return a|0};case 8:{qla(a,39344,5)|0;i=d;return a|0};case 6:{qla(a,39376,2)|0;l=YH(b)|0;c[q>>2]=l;if((l|0)!=0){l=s+4|0;n=u+4|0;do{c[r>>2]=0;m=ZH(b,q,r)|0;h=qla(a,1305904,1)|0;vL(t,r);oe(s,t);qla(h,c[s>>2]|0,c[l>>2]|0)|0;dka(t);h=m+4|0;if((c[h>>2]|0)==0){wL(a,m)|0}else{pe(u,1305864);m=qla(a,c[u>>2]|0,c[n>>2]|0)|0;qla(sla(m,c[h>>2]|0)|0,39352,5)|0}dka(r)}while((c[q>>2]|0)!=0)}qla(a,39384,2)|0;i=d;return a|0};case 9:{pe(o,1305864);q=qla(a,c[o>>2]|0,c[o+4>>2]|0)|0;qla(sla(q,c[b+16>>2]|0)|0,39352,5)|0;i=d;return a|0};default:{i=d;return a|0}}return 0}function xL(a){a=+a;var b=0.0;if(a<0.0){b=0.0}else{b=a>1.0?1.0:a}return+b}function yL(a,b){a=a|0;b=b|0;var d=0;d=i;c[a>>2]=b;c[a+4>>2]=0;zma(a+8|0,10);zma(a+32|0,10);i=d;return}function zL(a){a=a|0;var b=0;b=i;AL(a,1);Bma(a+32|0);Bma(a+8|0);i=b;return}function AL(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;i=i+32|0;e=d+16|0;f=d+12|0;g=d+8|0;h=d+4|0;j=d;k=a+8|0;l=(c[a+16>>2]|0)==0;c[e>>2]=l?0:-1;if(!l){l=(b|0)==0;do{BL(k,e,f,g);m=c[g>>2]|0;if(!(l?!((c[m+4>>2]|0)>>>0<2):0)){n=c[m>>2]|0;if((n|0)!=0){VO(n);v2a(n)}if((m|0)!=0){v2a(m)}Jma(k,c[f>>2]|0)}}while((c[e>>2]|0)!=0)}f=a+32|0;k=(c[a+40>>2]|0)==0;c[e>>2]=k?0:-1;if(!k){k=(b|0)==0;do{CL(f,e,h,j);l=c[j>>2]|0;if(!(k?!((c[l+4>>2]|0)>>>0<2):0)){g=c[l>>2]|0;if((g|0)!=0){v2a(g)}if((l|0)!=0){v2a(l)}Jma(f,c[h>>2]|0)}}while((c[e>>2]|0)!=0)}e=a+4|0;a=c[e>>2]|0;if((a|0)==0){i=d;return}if((b|0)==0){qJa(a,0);i=d;return}else{pJa(a);v2a(a);c[e>>2]=0;i=d;return}}function BL(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;i=i+16|0;g=f+4|0;h=f;c[g>>2]=0;c[h>>2]=0;Cma(a,b,g,h);c[d>>2]=c[g>>2];c[e>>2]=c[h>>2];i=f;return}function CL(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;i=i+16|0;g=f+4|0;h=f;c[g>>2]=0;c[h>>2]=0;Cma(a,b,g,h);c[d>>2]=c[g>>2];c[e>>2]=c[h>>2];i=f;return}function DL(a){a=a|0;var b=0,d=0;b=i;d=u2a(52)|0;VM(d);c[a+4>>2]=d;i=b;return}function EL(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;e=d;f=a+8|0;if((FL(f,b,e)|0)==0){a=u2a(28)|0;Lma(a+4|0,10);c[a>>2]=b;g=u2a(8)|0;c[e>>2]=g;c[g>>2]=a;c[g+4>>2]=1;c[(Gma(f,b)|0)>>2]=g;h=g}else{h=c[e>>2]|0}e=h+4|0;c[e>>2]=(c[e>>2]|0)+1;i=d;return c[h>>2]|0}function FL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;c[f>>2]=0;if((Dma(a,b,f)|0)==0){g=0;i=e;return g|0}c[d>>2]=c[f>>2];g=1;i=e;return g|0}function GL(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;if((FL(a+8|0,b,e)|0)==0){i=d;return}b=(c[e>>2]|0)+4|0;c[b>>2]=(c[b>>2]|0)+ -1;i=d;return}function HL(a,b){a=a|0;b=b|0;var c=0;a=i;c=u2a(56)|0;yL(c,b);DL(c);i=a;return c|0}function IL(a,b){a=a|0;b=b|0;a=i;if((b|0)!=0){zL(b);v2a(b)}i=a;return}function JL(a,b){a=a|0;b=b|0;a=i;if((b|0)!=0){AL(b,0)}i=a;return}function KL(a,b){a=a|0;b=b|0;a=i;if((b|0)!=0){UM(b);v2a(b)}i=a;return}function LL(a){a=a|0;var b=0,d=0;b=i;d=a+8|0;a=c[d>>2]|0;if((a|0)!=0){Rc[c[(c[a>>2]|0)+4>>2]&1023](a)}a=u2a(68)|0;TM(a);c[d>>2]=a;i=b;return}function ML(a){a=a|0;c[a>>2]=0;c[a+12>>2]=1;c[a+16>>2]=0;c[a+20>>2]=0;c[a+24>>2]=0;c[a+28>>2]=104857600;c[a+32>>2]=-1;return}function NL(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=i;i=i+16|0;e=d+12|0;f=d+8|0;g=d+4|0;h=d;j=c[a>>2]|0;if((j|0)==3|(j|0)==0){k=b;i=d;return k|0}DCa(b,e,f,g,h);j=c[h>>2]|0;l=c[g>>2]|0;m=c[f>>2]|0;n=(l*59|0)+(j*11|0)+(m*30|0)|0;o=(n|0)/100|0;if((c[a>>2]|0)!=2){p=c[a+8>>2]|0;q=p&255;r=p>>>8&255;s=p>>>16&255;p=c[a+4>>2]|0;t=((ca((p&255)-q|0,o)|0)/255|0)+q|0;c[f>>2]=t;f=((ca((p>>>8&255)-r|0,o)|0)/255|0)+r|0;c[g>>2]=f;g=((ca((p>>>16&255)-s|0,o)|0)/255|0)+s|0;c[h>>2]=g;k=c[e>>2]<<24|g|t<<16|f<<8;i=d;return k|0}f=m-o|0;m=l-o|0;l=j-o|0;o=((ca(f,f)|0)+(ca(m,m)|0)+(ca(l,l)|0)|0)<20;if((n|0)<3500&o){k=ECa(c[e>>2]|0,c[a+8>>2]|0)|0;i=d;return k|0}if(!((n|0)>22199&o)){k=b;i=d;return k|0}k=ECa(c[e>>2]|0,c[a+4>>2]|0)|0;i=d;return k|0}function OL(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;c[a+4>>2]=0;c[a+16>>2]=1;c[a+20>>2]=0;c[a+24>>2]=0;c[a+28>>2]=0;c[a+32>>2]=104857600;c[a+36>>2]=-1;Ija(a+48|0,4);g[a+92>>2]=1.0;g[a+80>>2]=1.0;d=a+96|0;g[a+88>>2]=0.0;g[a+84>>2]=0.0;e=a+120|0;f=a+64|0;c[a+40>>2]=0;c[a+44>>2]=0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;d=e+0|0;e=d+68|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(e|0));i=b;return}function PL(a){a=a|0;var b=0,d=0;b=i;d=c[a+144>>2]|0;if((d|0)!=0){Rc[c[(c[d>>2]|0)+4>>2]&1023](d)}dm(a+116|0);hm(a+104|0);Jja(c[a+48>>2]|0);i=b;return}function QL(a,b,d,e,f,g,h,j,k,l,m,n,o,p,q,r,s){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;var t=0,u=0,v=0,w=0;t=i;c[a+72>>2]=b;b=a+64|0;c[b>>2]=d;d=a+76|0;c[d>>2]=e;c[a+156>>2]=OGa(c[e+44>>2]|0,8)|0;c[a+148>>2]=(c[(c[d>>2]|0)+24>>2]|0)!=1&1;if((f|0)!=0){d=a+80|0;c[d+0>>2]=c[f+0>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];c[d+16>>2]=c[f+16>>2];c[d+20>>2]=c[f+20>>2]}c[a+112>>2]=g;if((k|0)!=0){g=a+4|0;f=k+0|0;k=g+36|0;do{c[g>>2]=c[f>>2];g=g+4|0;f=f+4|0}while((g|0)<(k|0))}c[a+160>>2]=m;c[a+164>>2]=o;c[a+180>>2]=q;c[a+176>>2]=p;c[a+168>>2]=r;c[a+172>>2]=s;c[a+40>>2]=n;c[a+44>>2]=c[(c[b>>2]|0)+4>>2];b=a+116|0;if(!((j|0)!=0&(p|0)==0)){pC(b);u=a+144|0;c[u>>2]=0;v=a+152|0;c[v>>2]=l;i=t;return}sC(b,j);if((h|0)==0){u=a+144|0;c[u>>2]=0;v=a+152|0;c[v>>2]=l;i=t;return}j=a+128|0;b=c[j>>2]|0;p=c[h+128>>2]|0;do{if((b|0)!=0){if((c[b+8>>2]|0)==0){h=Yl(j)|0;c[h+12>>2]=c[p+12>>2];oA(h+4|0,p+4|0)}if((c[b+20>>2]|0)==0){w=p+12|0;break}else{u=a+144|0;c[u>>2]=0;v=a+152|0;c[v>>2]=l;i=t;return}}else{h=Yl(j)|0;n=p+12|0;c[h+12>>2]=c[n>>2];oA(h+4|0,p+4|0);w=n}}while(0);b=Yl(j)|0;c[b+24>>2]=c[w>>2];oA(b+16|0,p+16|0);u=a+144|0;c[u>>2]=0;v=a+152|0;c[v>>2]=l;i=t;return}function RL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0;e=i;i=i+48|0;f=e+24|0;h=e;if((c[a+72>>2]|0)>32){i=e;return}Gla(f,(c[a+76>>2]|0)+28|0);g[h+12>>2]=1.0;g[h>>2]=1.0;g[h+20>>2]=0.0;g[h+16>>2]=0.0;g[h+8>>2]=0.0;g[h+4>>2]=0.0;Ula(h,d);rm(h,f);h=c[b+40>>2]|0;if((h|0)==0){i=e;return}b=a+112|0;j=a+68|0;k=+g[f+4>>2];l=+g[f>>2];m=+g[f+12>>2];n=+g[f+8>>2];f=h;while(1){h=f;f=c[f>>2]|0;o=c[h+8>>2]|0;if((o|0)==(c[b>>2]|0)){p=5;break}if(((((o|0)!=0?!(+g[o+32>>2]>k):0)?!(+g[o+36>>2]<l):0)?!(+g[o+44>>2]>m):0)?!(+g[o+40>>2]<n):0){SL(a,o,d);if((c[j>>2]|0)!=0|(f|0)==0){p=13;break}else{f=f;continue}}if((f|0)==0){p=13;break}}if((p|0)==5){c[j>>2]=1;i=e;return}else if((p|0)==13){i=e;return}}function SL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e;if((c[a+72>>2]|0)>32){i=e;return}c[a+108>>2]=b;g=c[a+28>>2]|0;if(((g|0)!=0?(h=c[b+48>>2]|0,(h|0)!=0):0)?(TL(g,h)|0)==0:0){i=e;return}SM(f,c[b+8>>2]|0);UL(a,f,d);hm(f);if((VL(a,b,d)|0)!=0){i=e;return}WL(a,b,d);i=e;return}function TL(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+16|0;e=d;f=c[b+8>>2]|0;if((f|0)<=0){g=1;i=d;return g|0}h=b+4|0;b=e+4|0;j=0;while(1){k=aD(h,j)|0;c[e>>2]=39424;c[b>>2]=2;if((vka(c[k+4>>2]|0,e)|0?(c[k+8>>2]|0)==1:0)?(dd[c[(c[a>>2]|0)+8>>2]&511](a,c[k+12>>2]|0)|0)==0:0){g=0;l=7;break}j=j+1|0;if((j|0)>=(f|0)){g=1;l=7;break}}if((l|0)==7){i=d;return g|0}return 0}function UL(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=i;i=i+16|0;g=f+12|0;h=f;j=c[b>>2]|0;k=a+104|0;l=c[k>>2]|0;if((j|0)==0){if((l|0)==0){i=f;return}MGa(c[a+76>>2]|0,1);hy(k);i=f;return}if((l|0)==(j|0)){i=f;return}Yy(k,b);k=a+76|0;MGa(c[k>>2]|0,1);j=c[b>>2]|0;l=c[j>>2]|0;if((l|0)>0){m=h+4|0;n=j;o=0;while(1){xC(g,c[n+4>>2]|0,o);p=c[g>>2]|0;qm(g);do{if((p|0)!=0){if((c[p>>2]|0)==0){OIa(h);XIa(h,-1.0,-1.0,0.0,0.0);RGa(c[k>>2]|0,h,0,2)|0;PIa(c[m>>2]|0);break}else{RGa(c[k>>2]|0,p,e,d[(c[(c[b>>2]|0)+8>>2]|0)+o>>0]|0)|0;break}}}while(0);o=o+1|0;p=c[b>>2]|0;if((o|0)>=(l|0)){q=p;break}else{n=p}}}else{q=j}j=c[q+12>>2]|0;if((j|0)==0){i=f;return}q=c[k>>2]|0;if((c[q+24>>2]|0)==1){if(!(((OGa(c[q+44>>2]|0,7)|0)&256|0)!=0&(j|0)>0)){i=f;return}}else{if((j|0)<=0){i=f;return}}q=a+16|0;n=0;l=0;while(1){o=c[(c[(c[b>>2]|0)+16>>2]|0)+(n<<2)>>2]|0;m=(l|0)==0;if((o|0)==0){if(m){r=0}else{RGa(c[k>>2]|0,l,0,(c[q>>2]|0)>>>19&512|2)|0;PIa(c[l+4>>2]|0);v2a(l);r=0}}else{if(m){m=u2a(12)|0;OIa(m);s=m}else{s=l}bP(a,o,e,s)|0;r=s}n=n+1|0;if((n|0)>=(j|0)){break}else{l=r}}if((r|0)==0){i=f;return}PIa(c[r+4>>2]|0);v2a(r);i=f;return}function VL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0,E=0,F=0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0;e=i;i=i+448|0;f=e+432|0;h=e+424|0;j=e+416|0;k=e+400|0;l=e+376|0;m=e+320|0;n=e+296|0;o=e+240|0;p=e+216|0;q=e+24|0;r=e;s=b+24|0;t=c[s>>2]|0;u=(t|0)!=0;if(u){v=c[t+16>>2]|0;if((v|0)==-1){w=1;i=e;return w|0}x=c[t+20>>2]|0;if((x|0)!=0){if((c[b+28>>2]|0)==3){y=c[(c[b+52>>2]|0)+12>>2]|0;if((y|0)==0){z=0}else{z=c[y+12>>2]|0}c[f>>2]=39912;c[f+4>>2]=5;y=(nI(z,f)|0)==0;A=v;B=y?x:0}else{A=v;B=x}}else{A=v;B=0}}else{A=0;B=0}v=a+152|0;x=c[v>>2]|0;y=b+28|0;if((c[y>>2]|0)==5){f=c[s>>2]|0;if((f|0)==0){C=1.0}else{C=+g[f+52>>2]}f=c[b+52>>2]|0;s=c[f+36>>2]|0;z=s>>>9&1;D=c[f>>2]|0;if((D|0)==0){E=s;F=z;G=C;H=0}else{pe(h,669496);E=s;F=z;G=C;H=iI(D,h)|0}}else{E=x;F=0;G=1.0;H=0}x=b+8|0;h=c[x>>2]|0;if(((h|0)!=0?(c[h+12>>2]|0)!=0:0)?(h=c[a+76>>2]|0,(c[h+24>>2]|0)==1):0){I=(OGa(c[h+44>>2]|0,7)|0)>>>8&1^1}else{I=0}h=a+4|0;if((((c[a+16>>2]&1024|0)!=0?!((c[y>>2]|0)!=3|u^1):0)?(c[t+108>>2]|0)!=0:0)?(c[t+104>>2]|0)!=0:0){u=c[(c[a+64>>2]|0)+8>>2]|0;if((u|0)!=0){D=c[u+36>>2]|0;u=c[D+8>>2]|0;if((D|0)==0){J=0;K=u}else{J=c[D+12>>2]|0;K=u}}else{J=0;K=c[(c[b+52>>2]|0)+40>>2]|0}u=c[(c[(c[b+52>>2]|0)+12>>2]|0)+12>>2]|0;c[j>>2]=39808;c[j+4>>2]=10;D=$H(u,j)|0;j=VA(K,D,J)|0;if((j|0)!=0){J=c[j+8>>2]|0;if((J|0)==3|(J|0)==8|(J|0)==9){L=4}else{L=A}bB(IG(K)|0,D);M=L}else{M=A}}else{M=A}A=(B|0)==0;L=(I|0)==0;if(A&G==1.0&(M|0)==0&L&(F|0)==0){w=0;i=e;return w|0}F=E&512;if((c[a+148>>2]|0)!=0){if(((F|0)==0&A&L?(c[(c[a+76>>2]|0)+20>>2]&128|0)!=0:0)?(I=a+184|0,D=c[I>>2]|0,c[I>>2]=M,K=cM(a,b,d)|0,c[I>>2]=D,(K|0)!=0):0){w=1;i=e;return w|0}YL(a,b,d);w=1;i=e;return w|0}ly(k,b,d);K=a+76|0;Ela(k,(c[K>>2]|0)+28|0);D=c[k+8>>2]|0;I=c[k>>2]|0;if((D|0)<=(I|0)){w=1;i=e;return w|0}J=c[k+12>>2]|0;j=k+4|0;u=c[j>>2]|0;if((J|0)<=(u|0)){w=1;i=e;return w|0}PGa(l,c[(c[K>>2]|0)+44>>2]|0);C=+R(+(+g[l>>2]));N=+R(+(+g[l+12>>2]));l=Fla(C*+(D-I|0))|0;D=Fla(N*+(J-u|0))|0;Kxa(m);if((F|0)==0?(c[(c[K>>2]|0)+20>>2]&1|0)!=0:0){F=u2a(40)|0;ICa(F);if((QGa(c[(c[K>>2]|0)+20>>2]|0,F,l,D)|0)!=0){XGa(c[K>>2]|0,F,I,u)|0;O=F;P=41}}else{O=0;P=41}do{if((P|0)==41?(Mxa(m,l,D,544,O)|0)!=0:0){F=c[m+4>>2]|0;WCa(F,0);c[n+0>>2]=c[d+0>>2];c[n+4>>2]=c[d+4>>2];c[n+8>>2]=c[d+8>>2];c[n+12>>2]=c[d+12>>2];c[n+16>>2]=c[d+16>>2];c[n+20>>2]=c[d+20>>2];mM(n,0-I|0,0-u|0);ama(n,C,N);if(L){Q=0}else{K=u2a(40)|0;ICa(K);if((JCa(K,l,D,264,0)|0)==0){if((K|0)==0){break}Rc[c[(c[K>>2]|0)+4>>2]&1023](K);break}WCa(K,0);Kxa(o);Lxa(o,K,0,0);J=c[x>>2]|0;a:do{if((c[J+12>>2]|0)!=0){z=p+12|0;s=p+20|0;f=p+16|0;S=p+8|0;T=p+4|0;U=J;V=0;do{W=c[(c[U+16>>2]|0)+(V<<2)>>2]|0;if((W|0)==0){break a}g[z>>2]=1.0;g[p>>2]=1.0;g[s>>2]=0.0;g[f>>2]=0.0;g[S>>2]=0.0;g[T>>2]=0.0;qy(W,p);X=c[W+20>>2]|0;eP(o,c[W+60>>2]|0,c[W+64>>2]|0,c[W+68>>2]|0,c[X>>2]|0,+g[X+4>>2],p,n,c[W+12>>2]|0,-1,0,0,0)|0;V=V+1|0;U=c[x>>2]|0}while(V>>>0<(c[U+12>>2]|0)>>>0)}}while(0);Oxa(o);Q=K}OL(q);QL(q,(c[a+72>>2]|0)+1|0,c[a+64>>2]|0,m,0,c[a+112>>2]|0,0,0,h,0,c[a+160>>2]|0,H,1,0,0,0,0);WL(q,b,n);c[a+68>>2]=c[q+68>>2];if(!A){J=t+24|0;c[r+0>>2]=c[J+0>>2];c[r+4>>2]=c[J+4>>2];c[r+8>>2]=c[J+8>>2];c[r+12>>2]=c[J+12>>2];c[r+16>>2]=c[J+16>>2];c[r+20>>2]=c[J+20>>2];Wla(r,d);J=GN(a,B,k,r)|0;if((J|0)!=0){$Ca(F,J);Rc[c[(c[J>>2]|0)+4>>2]&1023](J)}}if((Q|0)!=0){$Ca(F,Q);Rc[c[(c[Q>>2]|0)+4>>2]&1023](Q)}if((E&256|0)!=0&G!=1.0){aDa(F,~~(G*255.0))}J=c[v>>2]|0;mN(a,F,c[k>>2]|0,c[j>>2]|0,0,255,M,(c[y>>2]|0)==5?J|256:J);if((O|0)!=0){Rc[c[(c[O>>2]|0)+4>>2]&1023](O)}PL(q)}}while(0);Oxa(m);w=1;i=e;return w|0}function WL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;switch(c[b+28>>2]|0){case 3:{f=jN(a,b,d)|0;g=7;break};case 5:{bM(a,b,d);i=e;return};case 4:{yO(a,b,d);i=e;return};case 2:{f=aM(a,b,d)|0;g=7;break};case 1:{f=bP(a,b,d,0)|0;g=7;break};default:{}}if((g|0)==7?(f|0)!=0:0){i=e;return}YL(a,b,d);i=e;return}function XL(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;i=i+16|0;g=f;h=a+144|0;j=c[h>>2]|0;if((j|0)!=0){if((dd[c[(c[j>>2]|0)+12>>2]&511](j,e)|0)!=0){k=1;i=f;return k|0}j=c[h>>2]|0;if((c[j+4>>2]|0)==0){YL(a,b,d);l=c[h>>2]|0}else{l=j}if((l|0)!=0){Rc[c[(c[l>>2]|0)+4>>2]&1023](l)}c[h>>2]=0;k=0;i=f;return k|0}c[a+108>>2]=b;l=c[a+28>>2]|0;if(((l|0)!=0?(j=c[b+48>>2]|0,(j|0)!=0):0)?(TL(l,j)|0)==0:0){k=0;i=f;return k|0}SM(g,c[b+8>>2]|0);UL(a,g,d);hm(g);if((VL(a,b,d)|0)!=0){k=0;i=f;return k|0}if((c[b+28>>2]|0)!=3){WL(a,b,d);k=0;i=f;return k|0}g=ZL()|0;c[h>>2]=g;if((Wc[c[(c[g>>2]|0)+8>>2]&31](g,a,b,d,0,0)|0)!=0){k=XL(a,b,d,e)|0;i=f;return k|0}e=c[h>>2]|0;if((c[e+4>>2]|0)==0){YL(a,b,d);m=c[h>>2]|0}else{m=e}if((m|0)!=0){Rc[c[(c[m>>2]|0)+4>>2]&1023](m)}c[h>>2]=0;k=0;i=f;return k|0}function YL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=i;i=i+304|0;f=e+280|0;h=e+224|0;j=e+200|0;k=e+192|0;l=e;if((_L(a,b,d,f)|0)!=0){i=e;return}m=b+28|0;n=a+76|0;if((c[m>>2]|0)==3){o=(OGa(c[(c[n>>2]|0)+44>>2]|0,1)|0)==2;p=o?0:300}else{p=300}g[h+44>>2]=1.0;g[h+32>>2]=1.0;g[h+52>>2]=0.0;g[h+48>>2]=0.0;g[h+40>>2]=0.0;g[h+36>>2]=0.0;o=h+28|0;c[o>>2]=0;q=a+64|0;r=a+4|0;if((eM(h,c[q>>2]|0,c[n>>2]|0,f,b,r,p)|0)!=0){c[j+0>>2]=c[d+0>>2];c[j+4>>2]=c[d+4>>2];c[j+8>>2]=c[d+8>>2];c[j+12>>2]=c[d+12>>2];c[j+16>>2]=c[d+16>>2];c[j+20>>2]=c[d+20>>2];d=h+32|0;Wla(j,d);dM(c[(c[n>>2]|0)+44>>2]|0,j);if(((c[m>>2]|0)==5?(m=c[b+52>>2]|0,(m|0)!=0):0)?(n=c[m>>2]|0,(n|0)!=0):0){c[k>>2]=669496;c[k+4>>2]=9;s=iI(n,k)|0}else{s=0}OL(l);k=c[o>>2]|0;if((k|0)==0){t=c[h>>2]|0}else{t=k}QL(l,(c[a+72>>2]|0)+1|0,c[q>>2]|0,t,d,0,0,0,r,c[a+152>>2]|0,c[a+160>>2]|0,s,0,0,0,0,0);SL(l,b,j);fM(h);PL(l)}JM(c[o>>2]|0);i=e;return}function ZL(){var a=0,b=0;a=i;b=u2a(128)|0;tN(b);i=a;return b|0}function _L(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0.0,m=0.0,n=0;f=i;i=i+64|0;h=f+40|0;j=f+24|0;k=f;ly(h,b,d);c[e+0>>2]=c[h+0>>2];c[e+4>>2]=c[h+4>>2];c[e+8>>2]=c[h+8>>2];c[e+12>>2]=c[h+12>>2];h=c[a+76>>2]|0;a=h+28|0;c[j+0>>2]=c[a+0>>2];c[j+4>>2]=c[a+4>>2];c[j+8>>2]=c[a+8>>2];c[j+12>>2]=c[a+12>>2];PGa(k,c[h+44>>2]|0);l=+R(+(+g[k>>2]));m=+R(+(+g[k+12>>2]));if(!(l!=1.0|m!=1.0)){Ela(e,j);n=$L(e)|0;i=f;return n|0}k=c[e>>2]|0;h=e+8|0;c[h>>2]=~~+ba(+(l*+((c[h>>2]|0)-k|0)))+k;k=c[e+4>>2]|0;h=e+12|0;c[h>>2]=~~+ba(+(m*+((c[h>>2]|0)-k|0)))+k;k=c[j>>2]|0;h=j+8|0;c[h>>2]=~~+ba(+(l*+((c[h>>2]|0)-k|0)))+k;k=c[j+4>>2]|0;h=j+12|0;c[h>>2]=~~+ba(+(m*+((c[h>>2]|0)-k|0)))+k;Ela(e,j);n=$L(e)|0;i=f;return n|0}function $L(a){a=a|0;var b=0,d=0,e=0;b=i;if((c[a+8>>2]|0)<=(c[a>>2]|0)){d=1;e=d&1;i=b;return e|0}d=(c[a+12>>2]|0)<=(c[a+4>>2]|0);e=d&1;i=b;return e|0}function aM(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;e=i;i=i+64|0;f=e+60|0;h=e+56|0;j=e+32|0;k=e;c[f>>2]=c[b+56>>2];c[h>>2]=c[b+60>>2];CO(a,b,d,f,h);l=c[f>>2]|0;m=(l|0)==0;do{if(m){n=c[h>>2]|0;if((n|0)==0){o=1;i=e;return o|0}else{p=b;q=n;r=0;s=5;break}}else{n=hM(a,b,0)|0;t=c[h>>2]|0;if((t|0)==0){u=0;v=n;w=0}else{p=b;q=t;r=n;s=5}}}while(0);if((s|0)==5){u=q;v=r;w=iM(a,p)|0}p=b+64|0;c[j+0>>2]=c[p+0>>2];c[j+4>>2]=c[p+4>>2];c[j+8>>2]=c[p+8>>2];c[j+12>>2]=c[p+12>>2];c[j+16>>2]=c[p+16>>2];c[j+20>>2]=c[p+20>>2];Wla(j,d);if((gM(j)|0)==0){o=1;i=e;return o|0}d=a+16|0;p=c[d>>2]|0;if(!m){if((p&128|0)==0){x=l}else{m=l|8;c[f>>2]=m;x=m}}else{x=0}if((p&256|0)==0){y=x}else{m=x|4;c[f>>2]=m;y=m}if((p&536870912|0)==0){z=y}else{p=y|512;c[f>>2]=p;z=p}if((u|0)==0){A=z}else{u=z|16;c[f>>2]=u;A=u}u=c[b+24>>2]|0;if((u|0)!=0?(c[u+92>>2]|0)!=0:0){u=A|32;c[f>>2]=u;B=u}else{B=A}if((c[a+176>>2]|0)==0){C=B}else{A=B|128;c[f>>2]=A;C=A}eJa(k,c[b+12>>2]|0);if((c[d>>2]&2048|0)!=0){g[k+24>>2]=0.0}d=UGa(c[a+76>>2]|0,c[b+52>>2]|0,j,k,v,w,C,c[a+184>>2]|0)|0;gJa(c[k+8>>2]|0);o=d;i=e;return o|0}function bM(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;i=i+240|0;f=e+224|0;g=e+200|0;h=e+192|0;j=e;k=b+52|0;l=c[c[k>>2]>>2]|0;c[f>>2]=39424;c[f+4>>2]=2;m=iI(l,f)|0;if(((m|0)!=0?(f=c[a+28>>2]|0,(f|0)!=0):0)?(dd[c[(c[f>>2]|0)+8>>2]&511](f,m)|0)==0:0){i=e;return}m=b+56|0;c[g+0>>2]=c[m+0>>2];c[g+4>>2]=c[m+4>>2];c[g+8>>2]=c[m+8>>2];c[g+12>>2]=c[m+12>>2];c[g+16>>2]=c[m+16>>2];c[g+20>>2]=c[m+20>>2];Wla(g,d);d=c[k>>2]|0;if((d|0)!=0?(m=c[d>>2]|0,(m|0)!=0):0){c[h>>2]=669496;c[h+4>>2]=9;n=iI(m,h)|0}else{n=0}OL(j);h=a+76|0;if((b|0)==0){o=0}else{o=b+4|0}QL(j,(c[a+72>>2]|0)+1|0,c[a+64>>2]|0,c[h>>2]|0,0,c[a+112>>2]|0,a,o,a+4|0,c[a+152>>2]|0,c[a+160>>2]|0,n,0,0,0,0,0);c[j+184>>2]=c[a+184>>2];LGa(c[(c[h>>2]|0)+44>>2]|0);RL(j,c[k>>2]|0,g);c[a+68>>2]=c[j+68>>2];MGa(c[h>>2]|0,0);PL(j);i=e;return}function cM(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=c[b+28>>2]|0;if((f|0)==5){bM(a,b,d);g=1}else if((f|0)==3){g=jN(a,b,d)|0}else if((f|0)==2){g=aM(a,b,d)|0}else{g=0}i=e;return g|0}function dM(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0;c=i;i=i+32|0;d=c;PGa(d,a);e=+R(+(+g[d>>2]));g[b>>2]=e*+g[b>>2];e=+R(+(+g[d+12>>2]));d=b+12|0;g[d>>2]=e*+g[d>>2];i=c;return}function eM(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;j=i;i=i+32|0;k=j+16|0;l=j;if((e|0)==0){_a(39432,39448,1417,39496)}c[a>>2]=d;m=d+44|0;if(((OGa(c[m>>2]|0,7)|0)&1|0)!=0){n=1;i=j;return n|0}d=a+4|0;c[d>>2]=b;b=a+8|0;c[b+0>>2]=c[e+0>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];b=a+24|0;c[b>>2]=f;f=a+32|0;mM(f,0-(c[e>>2]|0)|0,0-(c[e+4>>2]|0)|0);o=OGa(c[m>>2]|0,5)|0;p=OGa(c[m>>2]|0,6)|0;if(!((o|0)==0|(p|0)==0|(h|0)==0)){q=((OGa(c[m>>2]|0,2)|0)*254|0)/(o*10|0)|0;o=((OGa(c[m>>2]|0,3)|0)*254|0)/(p*10|0)|0;if((q|0)>(h|0)){ama(f,+(h|0)/+(q|0),1.0)}if((o|0)>(h|0)){ama(f,1.0,+(h|0)/+(o|0))}}o=u2a(52)|0;Kxa(o);h=a+28|0;c[h>>2]=o;o=(OGa(c[(c[a>>2]|0)+44>>2]|0,7)|0)&64;a=(o>>>3)+24|0;q=(o|0)==0?24:544;c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;o=l+8|0;p=l+12|0;m=l+4|0;while(1){Gla(k,e);rm(f,k);Mla(l,k);r=(c[o>>2]|0)-(c[l>>2]|0)|0;s=(c[p>>2]|0)-(c[m>>2]|0)|0;if((ca(s,r)|0)<1){n=0;t=15;break}if((ca(s<<2,((ca(r,a)|0)+31|0)/32|0)|0)<31457281?(Mxa(c[h>>2]|0,r,s,q,0)|0)!=0:0){break}ama(f,.5,.5)}if((t|0)==15){i=j;return n|0}pM(c[d>>2]|0,c[(c[h>>2]|0)+4>>2]|0,c[b>>2]|0,g,f);n=1;i=j;return n|0}function fM(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a+28>>2]|0;if((d|0)==0){i=b;return}e=c[a+8>>2]|0;f=c[a+12>>2]|0;_Ga(c[a>>2]|0,c[d+4>>2]|0,e,f,(c[a+16>>2]|0)-e|0,(c[a+20>>2]|0)-f|0,0,0)|0;i=b;return}function gM(a){a=a|0;var b=0,c=0.0,d=0.0,e=0,f=0,h=0;b=i;c=+g[a>>2];if(!(c==0.0)?(d=+g[a+12>>2],!(d==0.0)):0){if(!(+g[a+4>>2]==0.0)?!(+g[a+8>>2]==0.0):0){e=1;i=b;return e|0}if(c!=0.0){f=d!=0.0}else{f=0}e=f&1;i=b;return e|0}if(+g[a+4>>2]!=0.0){h=+g[a+8>>2]!=0.0}else{h=0}e=h&1;i=b;return e|0}function hM(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;f=c[b+16>>2]|0;h=c[a+176>>2]|0;do{if((h|0)!=0&(d|0)==0){if(!((c[h>>2]|0)==0|(f|0)==0)?(c[f+8>>2]|0)!=0:0){break}j=c[a+180>>2]|0;i=e;return j|0}}while(0);if((f|0)!=0?(c[f+8>>2]|0)!=0:0){k=f}else{k=c[a+128>>2]|0}f=c[k+12>>2]|0;if((f|0)==-1){j=0;i=e;return j|0}k=c[b+24>>2]|0;do{if((k|0)!=0){b=~~(+g[k+52>>2]*255.0);h=c[k+56>>2]|0;if((h|0)==0){l=b;m=f}else{d=k+60|0;n=c[d>>2]|0;if((n|0)==0){o=jM(c[c[a+64>>2]>>2]|0,h)|0;c[d>>2]=o;if((o|0)==0){l=b;m=f;break}else{p=o}}else{p=n}l=b;m=nN(p,f)|0}}else{l=255;m=f}}while(0);j=NL(a+4|0,ECa(l,m)|0)|0;i=e;return j|0}function iM(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;e=c[b+16>>2]|0;f=c[a+176>>2]|0;do{if((f|0)!=0){if(!((c[f>>2]|0)==0|(e|0)==0)?(c[e+20>>2]|0)!=0:0){break}h=c[a+180>>2]|0;i=d;return h|0}}while(0);if((e|0)!=0?(c[e+20>>2]|0)!=0:0){j=e}else{j=c[a+128>>2]|0}e=c[j+24>>2]|0;if((e|0)==-1){h=0;i=d;return h|0}j=c[b+24>>2]|0;do{if((j|0)!=0){b=~~(+g[j+48>>2]*255.0);f=c[j+56>>2]|0;if((f|0)==0){k=b;l=e}else{m=j+60|0;n=c[m>>2]|0;if((n|0)==0){o=jM(c[c[a+64>>2]>>2]|0,f)|0;c[m>>2]=o;if((o|0)==0){k=b;l=e;break}else{p=o}}else{p=n}k=b;l=nN(p,e)|0}}else{k=255;l=e}}while(0);h=NL(a+4|0,ECa(k,l)|0)|0;i=d;return h|0}function jM(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=i;d=JG(a)|0;if((d|0)==0){e=0;i=c;return e|0}e=kM(d,b)|0;i=c;return e|0}function kM(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;e=i;i=i+96|0;f=e+84|0;h=e+72|0;j=e+8|0;k=e+4|0;l=e;if((d|0)==0){m=0;i=e;return m|0}n=b+32|0;if((DM(n,d,f)|0)==0){c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;do{if((c[d>>2]|0)==5){if((c[d+16>>2]|0)>>>0<3){m=0;i=e;return m|0}else{o=0}while(1){p=eC(GH(d,o)|0)|0;c[h+(2-o<<2)>>2]=p;o=o+1|0;if((p|0)==0){m=0;q=27;break}if(!(o>>>0<3)){q=9;break}}if((q|0)==9){r=c[h>>2]|0;s=1;break}else if((q|0)==27){i=e;return m|0}}else{p=eC(d)|0;c[h>>2]=p;if((p|0)==0){m=0;i=e;return m|0}else{r=p;s=0}}}while(0);q=u2a(776)|0;c[q>>2]=c[b>>2];b=u2a(8)|0;c[f>>2]=b;c[b+4>>2]=1;c[b>>2]=q;c[(Gma(n,d)|0)>>2]=b;d=j+0|0;n=d+64|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(n|0));d=(r|0)==0;n=r+8|0;o=1;p=0;while(1){g[k>>2]=+(p|0)/255.0;if(s){t=p&255;u=p+4|0;v=o;w=0;while(1){x=c[h+(w<<2)>>2]|0;if((x|0)!=0?(c[x+8>>2]|0)<17:0){gC(x,k,1,j,l)|0;x=Fla(+g[j>>2]*255.0)|0;a[q+(u+(w<<8))>>0]=x;y=(x|0)==(p|0)?v:0}else{a[q+(u+(w<<8))>>0]=t;y=v}w=w+1|0;if((w|0)==3){z=y;break}else{v=y}}}else{if(!d?(c[n>>2]|0)<17:0){gC(r,k,1,j,l)|0}v=Fla(+g[j>>2]*255.0)|0;w=v&255;a[q+(p+4)>>0]=w;a[q+(p+260)>>0]=w;a[q+(p+516)>>0]=w;z=(v|0)==(p|0)?o:0}p=p+1|0;if((p|0)==256){break}else{o=z}}if(!d){Rc[c[(c[r>>2]|0)+4>>2]&1023](r)}r=c[h+4>>2]|0;if((r|0)!=0){Rc[c[(c[r>>2]|0)+4>>2]&1023](r)}r=c[h+8>>2]|0;if((r|0)!=0){Rc[c[(c[r>>2]|0)+4>>2]&1023](r)}c[q+772>>2]=z;A=b}else{A=c[f>>2]|0}f=A+4|0;c[f>>2]=(c[f>>2]|0)+1;m=c[A>>2]|0;i=e;return m|0}function lM(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0;f=i;i=i+64|0;h=f+32|0;j=f;k=b+64|0;c[h+0>>2]=c[k+0>>2];c[h+4>>2]=c[k+4>>2];c[h+8>>2]=c[k+8>>2];c[h+12>>2]=c[k+12>>2];c[h+16>>2]=c[k+16>>2];c[h+20>>2]=c[k+20>>2];Wla(h,d);if((e|0)==0){l=RGa(c[a+76>>2]|0,c[b+52>>2]|0,h,(c[a+16>>2]|0)>>>20&512|c[b+56>>2])|0;i=f;return l|0}eJa(j,c[b+12>>2]|0);if((c[a+16>>2]&2048|0)!=0){g[j+24>>2]=0.0}e=SGa(c[a+76>>2]|0,c[b+52>>2]|0,h,j)|0;gJa(c[j+8>>2]|0);l=e;i=f;return l|0}function mM(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;$la(a,+(b|0),+(c|0));i=d;return}function nM(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0;j=i;i=i+128|0;k=j+104|0;l=j+80|0;m=j+56|0;n=j;c[k+0>>2]=c[d+0>>2];c[k+4>>2]=c[d+4>>2];c[k+8>>2]=c[d+8>>2];c[k+12>>2]=c[d+12>>2];d=a+76|0;Ela(k,(c[d>>2]|0)+28|0);o=c[k>>2]|0;c[e>>2]=o;p=c[k+4>>2]|0;c[f>>2]=p;PGa(l,c[(c[d>>2]|0)+44>>2]|0);q=+R(+(+g[l>>2]));r=+R(+(+g[l+12>>2]));l=Fla(q*+((c[k+8>>2]|0)-o|0))|0;o=Fla(r*+((c[k+12>>2]|0)-p|0))|0;p=u2a(40)|0;ICa(p);if((h|0)!=0?(c[a+160>>2]|0)==0:0){JCa(p,l,o,544,0)|0}else{QGa(c[(c[d>>2]|0)+20>>2]|0,p,l,o)|0}if((Lc[c[(c[p>>2]|0)+8>>2]&255](p)|0)==0){if((p|0)==0){s=0;i=j;return s|0}Rc[c[(c[p>>2]|0)+4>>2]&1023](p);s=0;i=j;return s|0}o=p+20|0;l=c[d>>2]|0;d=c[l+20>>2]|0;if((((c[o>>2]&2|0)==0?d:d>>>6)&1|0)==0){d=a+80|0;c[m+0>>2]=c[d+0>>2];c[m+4>>2]=c[d+4>>2];c[m+8>>2]=c[d+8>>2];c[m+12>>2]=c[d+12>>2];c[m+16>>2]=c[d+16>>2];c[m+20>>2]=c[d+20>>2];mM(m,0-(c[e>>2]|0)|0,0-(c[f>>2]|0)|0);ama(m,q,r);WCa(p,((c[o>>2]|0)>>>1&1)+ -1|0);Kxa(n);Lxa(n,p,0,0);oM(c[a+64>>2]|0,n,b,a+4|0,m);Oxa(n);s=p;i=j;return s|0}else{XGa(l,p,c[e>>2]|0,c[f>>2]|0)|0;s=p;i=j;return s|0}return 0}function oM(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;g=i;i=i+224|0;h=g+192|0;j=g;k=c[a+16>>2]|0;if((k|0)<=0){i=g;return}l=a+12|0;m=(f|0)==0;n=j+16|0;o=a+8|0;p=j+32|0;q=j+68|0;r=j+16|0;s=j+32|0;t=j+68|0;u=b+44|0;v=0;while(1){LGa(c[u>>2]|0);w=Pja(l,v)|0;if(m){OL(j);QL(j,0,a,b,0,d,0,0,e,c[(c[w>>2]|0)+36>>2]|0,0,0,0,0,0,0,0);RL(j,c[w>>2]|0,w+4|0);if((c[n>>2]|0)<0){XM(c[o>>2]|0,c[p>>2]|0)}if((c[q>>2]|0)!=0){x=12;break}PL(j)}else{y=w+4|0;c[h+0>>2]=c[y+0>>2];c[h+4>>2]=c[y+4>>2];c[h+8>>2]=c[y+8>>2];c[h+12>>2]=c[y+12>>2];c[h+16>>2]=c[y+16>>2];c[h+20>>2]=c[y+20>>2];Wla(h,f);OL(j);QL(j,0,a,b,f,d,0,0,e,c[(c[w>>2]|0)+36>>2]|0,0,0,0,0,0,0,0);RL(j,c[w>>2]|0,h);if((c[r>>2]|0)<0){XM(c[o>>2]|0,c[s>>2]|0)}if((c[t>>2]|0)!=0){x=7;break}PL(j)}MGa(b,0);v=v+1|0;if((v|0)>=(k|0)){x=15;break}}if((x|0)==7){MGa(b,0);PL(j);i=g;return}else if((x|0)==12){MGa(b,0);PL(j);i=g;return}else if((x|0)==15){i=g;return}}function pM(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0;g=i;i=i+80|0;h=g+16|0;j=g;Kxa(h);Lxa(h,b,0,0);b=c[a+28>>2]|0;if((b|0)==0){k=c[h+8>>2]|0;l=c[h+12>>2]|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=k;c[j+12>>2]=l;WGa(h,j,-1,0)|0}else{ld[c[c[b>>2]>>2]&255](b,h,f)}oM(a,h,d,e,f);Oxa(h);i=g;return}function qM(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;if((a|0)==0){e=0;i=d;return e|0}f=u2a(24)|0;g=f+4|0;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;if((f|0)==0){e=0;i=d;return e|0}sC(f,a);g=(b|0)!=0;b=a+12|0;a=c[b>>2]|0;if((c[((a|0)==0?0:g?a+16|0:a+4|0)+4>>2]|0)==0){e=f;i=d;return e|0}a=Yl(f+12|0)|0;h=c[b>>2]|0;b=c[(g?h+24|0:h+12|0)>>2]|0;c[a+12>>2]=b;c[a+24>>2]=b;e=f;i=d;return e|0}function rM(a){a=a|0;var b=0;b=i;Ija(a+12|0,28);i=b;return}function sM(a,b,d){a=a|0;b=b|0;d=d|0;c[a+28>>2]=0;c[a>>2]=b;c[a+4>>2]=0;c[a+8>>2]=d;c[a+32>>2]=1;return}function tM(a,b){a=a|0;b=b|0;c[a+28>>2]=0;c[a>>2]=c[b+8>>2];c[a+4>>2]=c[b+12>>2];c[a+8>>2]=c[b+128>>2];c[a+32>>2]=1;return}function uM(a){a=a|0;var b=0;b=i;Jja(c[a+12>>2]|0);i=b;return}function vM(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=wM(a+12|0)|0;c[f>>2]=b;b=f+4|0;if((d|0)==0){g[f+16>>2]=1.0;g[b>>2]=1.0;g[f+24>>2]=0.0;g[f+20>>2]=0.0;g[f+12>>2]=0.0;g[f+8>>2]=0.0;i=e;return}else{c[b+0>>2]=c[d+0>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];i=e;return}}function wM(a){a=a|0;var b=0,d=0;b=i;d=Nja(a,c[a+4>>2]|0)|0;i=b;return d|0}function xM(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=i;vM(a,c,d);oM(a,b,0,e,0);i=f;return}function yM(a){a=a|0;var b=0,d=0;b=i;d=a+20|0;c[a+4>>2]=0;c[a+8>>2]=0;c[a>>2]=0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;i=b;return}function zM(a){a=a|0;var b=0;b=i;AM(a);i=b;return}function AM(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+20|0;e=c[d>>2]|0;if((e|0)==0){c[a>>2]=0;i=b;return}PL(e);v2a(e);MGa(c[a+8>>2]|0,0);c[d>>2]=0;c[a>>2]=0;i=b;return}function BM(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=i;if((c[a>>2]|0)!=0){c[a>>2]=3;i=g;return}c[a+4>>2]=b;c[a+8>>2]=d;c[a+12>>2]=e;c[a+16>>2]=0;if((b|0)==0|(d|0)==0){c[a>>2]=3;i=g;return}else{c[a>>2]=1;d=a+40|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;CM(a,f);i=g;return}}function CM(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0;d=i;i=i+48|0;e=d+24|0;f=d;if((c[a>>2]|0)!=1){i=d;return}h=a+4|0;j=c[h>>2]|0;k=c[j+16>>2]|0;l=a+40|0;m=c[l>>2]|0;a:do{if(m>>>0<k>>>0){n=a+48|0;o=a+52|0;p=a+20|0;q=a+8|0;r=a+44|0;s=a+12|0;t=a+16|0;u=a+24|0;v=f+12|0;w=f+20|0;x=f+16|0;y=f+8|0;z=f+4|0;A=a+28|0;B=a+24|0;C=a+36|0;D=a+32|0;E=(b|0)==0;F=j;G=m;b:while(1){H=Pja(F+12|0,G)|0;I=c[H>>2]|0;J=c[I+44>>2]|0;do{if((c[n>>2]|0)==0){K=c[o>>2]|0;if((J|0)==(K|0)){if((c[I+76>>2]|0)!=2){Jy(I,b);L=c[H>>2]|0;if((c[L+76>>2]|0)!=2){M=45;break b}N=c[o>>2]|0;O=L;P=c[L+44>>2]|0;M=9}}else{N=K;O=I;P=J;M=9}if((M|0)==9?(M=0,(P|0)!=(N|0)):0){if((N|0)==0){Q=O+40|0}else{c[n>>2]=N;Q=N}c[n>>2]=c[Q>>2];c[o>>2]=P;M=16;break}K=c[p>>2]|0;if((K|0)!=0){PL(K);v2a(K);c[p>>2]=0;MGa(c[q>>2]|0,0);c[n>>2]=0;c[o>>2]=0}}else{M=16}}while(0);if((M|0)==16){M=0;if((c[p>>2]|0)==0){c[n>>2]=c[(c[H>>2]|0)+40>>2];c[r>>2]=0;J=u2a(188)|0;OL(J);c[p>>2]=J;QL(J,0,c[h>>2]|0,c[q>>2]|0,0,0,0,0,c[s>>2]|0,c[(c[H>>2]|0)+36>>2]|0,c[t>>2]|0,0,0,0,0,0,0);LGa(c[(c[q>>2]|0)+44>>2]|0);Gla(e,(c[q>>2]|0)+28|0);c[u+0>>2]=c[e+0>>2];c[u+4>>2]=c[e+4>>2];c[u+8>>2]=c[e+8>>2];c[u+12>>2]=c[e+12>>2];g[v>>2]=1.0;g[f>>2]=1.0;g[w>>2]=0.0;g[x>>2]=0.0;g[y>>2]=0.0;g[z>>2]=0.0;J=H+4|0;Ula(f,J);rm(f,u);R=J}else{R=H+4|0}J=c[(xt()|0)+8>>2]|0;I=Lc[c[(c[J>>2]|0)+36>>2]&255](J)|0;c:while(1){J=c[n>>2]|0;K=c[I+4>>2]|0;while(1){if((J|0)==0){break c}L=c[J+8>>2]|0;if(((((L|0)!=0?+g[L+32>>2]<=+g[A>>2]:0)?+g[L+36>>2]>=+g[B>>2]:0)?+g[L+44>>2]<=+g[C>>2]:0)?+g[L+40>>2]>=+g[D>>2]:0){if((XL(c[p>>2]|0,L,R,b)|0)!=0){M=45;break b}S=L+28|0;L=c[S>>2]|0;if((L|0)==3){T=c[p>>2]|0;if((c[T+16>>2]|0)<0){XM(c[(c[h>>2]|0)+8>>2]|0,c[T+32>>2]|0);U=c[S>>2]|0}else{U=3}}else{U=L}V=c[n>>2]|0;W=(U+ -4|0)>>>0<2?0:K+ -1|0}else{V=J;W=K}c[r>>2]=(c[r>>2]|0)+1;J=c[V>>2]|0;c[n>>2]=J;if((W|0)==0){break}else{K=W}}if(!E?(Lc[c[c[b>>2]>>2]&255](b)|0)!=0:0){M=45;break b}K=c[(xt()|0)+8>>2]|0;I=Lc[c[(c[K>>2]|0)+36>>2]&255](K)|0}if((c[(c[H>>2]|0)+76>>2]|0)!=2){M=45;break}I=c[p>>2]|0;if((I|0)!=0){PL(I);v2a(I)}c[p>>2]=0;MGa(c[q>>2]|0,0);c[n>>2]=0;c[o>>2]=0;if(!E?(Lc[c[c[b>>2]>>2]&255](b)|0)!=0:0){M=41;break}}I=(c[l>>2]|0)+1|0;c[l>>2]=I;if(!(I>>>0<k>>>0)){break a}F=c[h>>2]|0;G=I}if((M|0)==41){c[l>>2]=(c[l>>2]|0)+1;i=d;return}else if((M|0)==45){i=d;return}}}while(0);c[a>>2]=2;i=d;return}function DM(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;c[f>>2]=0;if((Dma(a,b,f)|0)==0){g=0;i=e;return g|0}c[d>>2]=c[f>>2];g=1;i=e;return g|0}function EM(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;if((DM(a+32|0,b,e)|0)==0){i=d;return}b=(c[e>>2]|0)+4|0;c[b>>2]=(c[b>>2]|0)+ -1;i=d;return}function FM(a){a=a|0;g[a+44>>2]=1.0;g[a+32>>2]=1.0;g[a+52>>2]=0.0;g[a+48>>2]=0.0;g[a+40>>2]=0.0;g[a+36>>2]=0.0;c[a+28>>2]=0;c[a>>2]=0;c[a+4>>2]=0;c[a+24>>2]=0;return}function GM(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}Rc[c[(c[a>>2]|0)+4>>2]&1023](a);i=b;return}function HM(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0.0;h=i;i=i+64|0;j=h+32|0;k=h+16|0;l=h;c[a>>2]=d;c[a+4>>2]=b;b=a+8|0;c[b+0>>2]=c[e+0>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];c[a+24>>2]=f;f=a+32|0;mM(f,0-(c[e>>2]|0)|0,0-(c[e+4>>2]|0)|0);b=d+44|0;d=OGa(c[b>>2]|0,5)|0;m=OGa(c[b>>2]|0,6)|0;if(!((d|0)==0|(m|0)==0)){n=((OGa(c[b>>2]|0,2)|0)*254|0)/(d*10|0)|0;d=((OGa(c[b>>2]|0,3)|0)*254|0)/(m*10|0)|0;if((n|0)>150){ama(f,150.0/+(n|0),1.0)}if((d|0)>150){ama(f,1.0,150.0/+(d|0))}}PGa(j,c[(c[a>>2]|0)+44>>2]|0);o=+R(+(+g[j>>2]));Vla(f,o,0.0,0.0,+R(+(+g[j+12>>2])),0.0,0.0);Gla(k,e);rm(f,k);Mla(l,k);k=u2a(40)|0;ICa(k);c[a+28>>2]=k;JCa(k,(c[l+8>>2]|0)-(c[l>>2]|0)|0,(c[l+12>>2]|0)-(c[l+4>>2]|0)|0,544,0)|0;i=h;return}function IM(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;i=i+48|0;d=b;if(((OGa(c[(c[a>>2]|0)+44>>2]|0,7)|0)&1|0)==0){ICa(d);e=a+28|0;f=c[e>>2]|0;QGa(c[(c[a>>2]|0)+20>>2]|0,d,c[f+8>>2]|0,c[f+12>>2]|0)|0;pM(c[a+4>>2]|0,d,c[a+24>>2]|0,0,a+32|0);EBa(d,0,0,c[d+8>>2]|0,c[d+12>>2]|0,c[e>>2]|0,0,0,0,0,0,0)|0;e=c[a+8>>2]|0;f=c[a+12>>2]|0;_Ga(c[a>>2]|0,d,e,f,(c[a+16>>2]|0)-e|0,(c[a+20>>2]|0)-f|0,0,0)|0;PCa(d);i=b;return}if(+g[a+32>>2]==1.0?+g[a+44>>2]==1.0:0){ZGa(c[a>>2]|0,c[a+28>>2]|0,c[a+8>>2]|0,c[a+12>>2]|0,0)|0;i=b;return}d=c[a+8>>2]|0;f=c[a+12>>2]|0;_Ga(c[a>>2]|0,c[a+28>>2]|0,d,f,(c[a+16>>2]|0)-d|0,(c[a+20>>2]|0)-f|0,0,0)|0;i=b;return}function JM(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}Rc[c[(c[a>>2]|0)+4>>2]&1023](a);i=b;return}function KM(a){a=a|0;var b=0;b=i;RM(a);i=b;return}function LM(a){a=a|0;var b=0;b=i;c[a>>2]=39520;zL(a+4|0);v2a(a);i=b;return}function MM(a){a=a|0;return a+4|0}function NM(a,b){a=a|0;b=b|0;var c=0;a=i;c=u2a(52)|0;QM(c,b);i=a;return c|0}function OM(a){a=a|0;return a+60|0}function PM(a){a=a|0;return 1}function QM(a,b){a=a|0;b=b|0;var d=0;d=i;zma(a+4|0,10);c[a+36>>2]=b;c[a+40>>2]=0;c[a+44>>2]=0;c[a+28>>2]=0;c[a+48>>2]=0;c[a+32>>2]=0;i=d;return}function RM(a){a=a|0;var b=0;b=i;c[a>>2]=39520;zL(a+4|0);i=b;return}function SM(a,b){a=a|0;b=b|0;var d=0;d=i;c[a>>2]=b;if((b|0)==0){i=d;return}a=b+20|0;c[a>>2]=(c[a>>2]|0)+1;i=d;return}function TM(a){a=a|0;var b=0;b=i;c[a>>2]=39520;yL(a+4|0,0);c[a+60>>2]=0;c[a+64>>2]=100;i=b;return}function UM(a){a=a|0;var b=0;b=i;WM(a);Bma(a+4|0);i=b;return}function VM(a){a=a|0;var b=0;b=i;zma(a+4|0,10);zma(a+28|0,10);i=b;return}function WM(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+16|0;d=b+8|0;e=b+4|0;f=b;g=a+4|0;h=(c[a+12>>2]|0)==0;c[d>>2]=h?0:-1;if(!h){do{Cma(g,d,e,f);h=c[f>>2]|0;if((h|0)!=0){cN(h);v2a(h)}}while((c[d>>2]|0)!=0)}Ama(g);c[a+44>>2]=0;c[a+40>>2]=0;i=b;return}function XM(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;i=i+16|0;e=d+8|0;f=d+4|0;g=d;h=a+44|0;if(!((c[h>>2]|0)>>>0>b>>>0)){i=d;return}j=a+4|0;k=c[a+12>>2]|0;l=w2a(k<<3,1)|0;m=(k|0)==0;c[e>>2]=m?0:-1;if(!m){m=0;while(1){Cma(j,e,f,g);n=c[g>>2]|0;c[l+(m<<3)>>2]=c[n>>2];c[l+(m<<3)+4>>2]=c[n+24>>2];if((c[e>>2]|0)==0){break}else{m=m+1|0}}}N1a(l,k,8,247);m=a+40|0;if((c[m>>2]|0)==-1){if((k|0)>0){e=0;do{c[c[(Gma(j,c[l+(e<<3)+4>>2]|0)|0)>>2]>>2]=e;e=e+1|0}while((e|0)!=(k|0))}c[m>>2]=k}if((k|0)>15){m=k+ -15|0;k=0;do{ZM(a,c[l+(k<<3)+4>>2]|0);k=k+1|0}while((k|0)!=(m|0));o=m}else{o=0}if((c[h>>2]|0)>>>0>b>>>0){m=o;while(1){ZM(a,c[l+(m<<3)+4>>2]|0);if((c[h>>2]|0)>>>0>b>>>0){m=m+1|0}else{break}}}v2a(l);i=d;return}function YM(a,b){a=a|0;b=b|0;return(c[a>>2]|0)-(c[b>>2]|0)|0}function ZM(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=a+4|0;f=Fma(e,b)|0;if((f|0)==0){Jma(e,b);i=d;return}else{g=a+44|0;c[g>>2]=(c[g>>2]|0)-(c[f+36>>2]|0);cN(f);v2a(f);Jma(e,b);i=d;return}}function _M(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;h=i;j=a+4|0;k=a+28|0;l=Dma(j,b,k)|0;m=a+48|0;c[m>>2]=l;if((l|0)==0){l=u2a(40)|0;n=c[a+36>>2]|0;o=c[n+8>>2]|0;p=l+20|0;c[l+0>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;c[l+12>>2]=0;c[l+16>>2]=0;c[p>>2]=o;c[l+24>>2]=b;c[l+28>>2]=0;c[l+32>>2]=0;c[l+36>>2]=0;c[k>>2]=l;q=n;r=l}else{q=c[a+36>>2]|0;r=c[k>>2]|0}l=$M(r,c[g+40>>2]|0,c[q+12>>2]|0,d,e,f,g)|0;if((l|0)==2){s=1;i=h;return s|0}g=a+40|0;c[g>>2]=(c[g>>2]|0)+1;if((c[m>>2]|0)==0){m=c[k>>2]|0;c[(Gma(j,b)|0)>>2]=m}if((l|0)!=0){s=0;i=h;return s|0}l=a+44|0;c[l>>2]=(c[l>>2]|0)+(c[(c[k>>2]|0)+36>>2]|0);s=0;i=h;return s|0}function $M(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0;j=i;k=c[a+28>>2]|0;if((k|0)!=0){c[a+4>>2]=k;c[a+8>>2]=c[a+32>>2];l=1;i=j;return l|0}if((h|0)==0){l=0;i=j;return l|0}c[a+16>>2]=h;h=u2a(136)|0;WN(h);k=a+4|0;c[k>>2]=h;m=SN(h,c[a+20>>2]|0,c[a+24>>2]|0,1,b,d,e,f,g)|0;if((m|0)==2){l=2;i=j;return l|0}else if((m|0)==0){m=c[k>>2]|0;if((m|0)!=0){Rc[c[(c[m>>2]|0)+4>>2]&1023](m)}c[k>>2]=0;l=0;i=j;return l|0}else{gN(a);l=0;i=j;return l|0}return 0}function aN(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=a+28|0;f=bN(c[e>>2]|0,b)|0;if((f|0)==2){g=1;i=d;return g|0}b=a+40|0;c[b>>2]=(c[b>>2]|0)+1;if((c[a+48>>2]|0)==0){b=c[e>>2]|0;c[(Gma(a+4|0,c[b+24>>2]|0)|0)>>2]=b}if((f|0)!=0){g=0;i=d;return g|0}f=a+44|0;c[f>>2]=(c[f>>2]|0)+(c[(c[e>>2]|0)+36>>2]|0);g=0;i=d;return g|0}function bN(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=a+4|0;f=VN(c[e>>2]|0,b)|0;if((f|0)==2){g=2;i=d;return g|0}else if((f|0)==0){f=c[e>>2]|0;if((f|0)!=0){Rc[c[(c[f>>2]|0)+4>>2]&1023](f)}c[e>>2]=0;g=0;i=d;return g|0}else{gN(a);g=0;i=d;return g|0}return 0}function cN(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+28|0;e=c[d>>2]|0;if((e|0)!=0){Rc[c[(c[e>>2]|0)+4>>2]&1023](e);c[d>>2]=0}d=a+32|0;a=c[d>>2]|0;if((a|0)==0){i=b;return}Rc[c[(c[a>>2]|0)+4>>2]&1023](a);c[d>>2]=0;i=b;return}function dN(a){a=a|0;var b=0,d=0;b=i;d=hN(c[a+28>>2]|0)|0;c[a+36>>2]=(hN(c[a+32>>2]|0)|0)+d;i=b;return}function eN(a){a=a|0;var b=0;b=a+4|0;a=c[b>>2]|0;c[b>>2]=0;return a|0}function fN(a){a=a|0;var b=0;b=a+8|0;a=c[b>>2]|0;c[b>>2]=0;return a|0}function gN(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;b=i;d=a+4|0;e=c[d>>2]|0;c[a+12>>2]=c[e+36>>2];f=TN(e)|0;e=a+8|0;c[e>>2]=f;c[a>>2]=c[(c[(c[(c[a+16>>2]|0)+64>>2]|0)+8>>2]|0)+40>>2];g=c[d>>2]|0;if((ca(c[g+12>>2]|0,c[g+24>>2]|0)|0)>>>0<6e7){c[a+28>>2]=RCa(g,0)|0;h=c[d>>2]|0;if((h|0)!=0){Rc[c[(c[h>>2]|0)+4>>2]&1023](h)}c[d>>2]=0;j=c[e>>2]|0}else{c[a+28>>2]=g;j=f}if((j|0)==0){k=a+32|0;l=a+28|0;m=c[l>>2]|0;c[d>>2]=m;n=c[k>>2]|0;c[e>>2]=n;dN(a);i=b;return}f=a+32|0;c[f>>2]=RCa(j,0)|0;j=c[e>>2]|0;if((j|0)!=0){Rc[c[(c[j>>2]|0)+4>>2]&1023](j)}c[e>>2]=0;k=f;l=a+28|0;m=c[l>>2]|0;c[d>>2]=m;n=c[k>>2]|0;c[e>>2]=n;dN(a);i=b;return}function hN(a){a=a|0;var b=0,d=0,e=0;b=i;if((a|0)==0){d=0;i=b;return d|0}if((Lc[c[(c[a>>2]|0)+8>>2]&255](a)|0)==0){d=0;i=b;return d|0}e=ca(c[a+24>>2]|0,c[a+12>>2]|0)|0;d=((iN(a)|0)<<2)+e|0;i=b;return d|0}function iN(a){a=a|0;var b=0,d=0,e=0;b=i;if((c[a+20>>2]|0)!=1){d=c[a+16>>2]|0;if((d|0)==1){e=2}else{e=(d|0)==8?256:0}}else{e=0}i=b;return e|0}function jN(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+128|0;f=e;tN(f);if((kN(f,a,b,d,c[a+164>>2]|0,c[a+184>>2]|0)|0)!=0){lN(f,0)|0}a=c[f+4>>2]|0;vN(f);i=e;return a|0}function kN(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0;h=i;c[a+8>>2]=b;c[a+120>>2]=f;f=a+12|0;c[f>>2]=d;c[a+124>>2]=g;c[a+20>>2]=e;g=c[(c[d+52>>2]|0)+44>>2]|0;do{if((g|0)!=0?(j=c[b+28>>2]|0,(j|0)!=0):0){if((dd[c[(c[j>>2]|0)+8>>2]&511](j,g)|0)==0){k=0;i=h;return k|0}else{l=c[f>>2]|0;break}}else{l=d}}while(0);d=a+24|0;f=l+56|0;c[d+0>>2]=c[f+0>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];c[d+16>>2]=c[f+16>>2];c[d+20>>2]=c[f+20>>2];Wla(d,e);if((wN(a)|0)!=0){k=1;i=h;return k|0}k=xN(a)|0;i=h;return k|0}function lN(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;e=c[a+16>>2]|0;if((e|0)==1){f=a+100|0;if((EN(c[f>>2]|0,b)|0)!=0){g=1;i=d;return g|0}h=c[f>>2]|0;f=c[h>>2]|0;j=c[(c[a+8>>2]|0)+76>>2]|0;k=c[h+4>>2]|0;l=c[h+8>>2]|0;if((c[f+20>>2]|0)==1){$Ga(c[j+44>>2]|0,f,k,l,c[a+92>>2]|0)|0;g=0;i=d;return g|0}else{ZGa(j,f,k,l,c[a+124>>2]|0)|0;g=0;i=d;return g|0}}else if((e|0)==4){if((rO(c[a+116>>2]|0,b)|0)!=0){g=1;i=d;return g|0}if((xN(a)|0)==0){g=0;i=d;return g|0}g=dd[c[(c[a>>2]|0)+12>>2]&511](a,b)|0;i=d;return g|0}else if((e|0)==2){l=a+104|0;if((yDa(c[l>>2]|0,b)|0)!=0){g=1;i=d;return g|0}k=oDa((c[l>>2]|0)+132|0)|0;if((k|0)==0){g=0;i=d;return g|0}f=c[a+80>>2]|0;j=(f|0)!=255;if((c[k+20>>2]|0)==1){h=a+92|0;m=c[h>>2]|0;if(j){n=(((ca(m>>>24,f)|0)>>>0)/255|0)<<24|m&16777215;c[h>>2]=n;o=n}else{o=m}m=c[l>>2]|0;c[a+4>>2]=$Ga(c[(c[(c[a+8>>2]|0)+76>>2]|0)+44>>2]|0,k,c[m+20>>2]|0,c[m+24>>2]|0,o)|0}else{if(j){aDa(k,f)}f=c[l>>2]|0;c[a+4>>2]=ZGa(c[(c[a+8>>2]|0)+76>>2]|0,k,c[f+20>>2]|0,c[f+24>>2]|0,c[a+124>>2]|0)|0}Rc[c[(c[k>>2]|0)+4>>2]&1023](k);g=0;i=d;return g|0}else if((e|0)==3){g=cHa(c[(c[(c[a+8>>2]|0)+76>>2]|0)+44>>2]|0,c[a+112>>2]|0,b)|0;i=d;return g|0}else{g=0;i=d;return g|0}return 0}function mN(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;k=i;i=i+48|0;l=k+24|0;m=k+20|0;n=k+16|0;o=k;if((b|0)==0){i=k;return}p=j&512;do{if((h|0)==0){if((c[b+20>>2]|0)==1){q=NL(a+4|0,f)|0;r=q>>>24;if((g|0)<255){s=(ca(r,g)|0)/255|0}else{s=r}if(($Ga(c[(c[a+76>>2]|0)+44>>2]|0,b,d,e,s<<24|q&16777215)|0)==0){t=1;break}i=k;return}else{if((g|0)<255){aDa(b,g)}if((ZGa(c[a+76>>2]|0,b,d,e,0)|0)==0){t=1;break}i=k;return}}else{if((p|0)==0){t=1}else{t=(c[a+160>>2]|0)!=0}}}while(0);g=a+76|0;s=c[g>>2]|0;q=c[s+20>>2]|0;if((q&64|0)==0?!(t&(q&1|0)!=0):0){q=b+8|0;t=(c[q>>2]|0)+d|0;r=b+12|0;u=(c[r>>2]|0)+e|0;c[o>>2]=d;c[o+4>>2]=e;c[o+8>>2]=t;c[o+12>>2]=u;u=nM(a,c[a+108>>2]|0,o,m,n,(h|0)>0&(p|0)!=0&1)|0;if((u|0)==0){i=k;return}p=c[m>>2]|0;m=d-p|0;o=c[n>>2]|0;n=e-o|0;a=c[q>>2]|0;q=c[r>>2]|0;if((c[b+20>>2]|0)==1){FBa(u,m,n,a,q,b,f,0,0,h,0,0,0,0)|0}else{EBa(u,m,n,a,q,b,0,0,h,0,0,0)|0}q=u2a(40)|0;ICa(q);a=u+8|0;n=u+12|0;JCa(q,c[a>>2]|0,c[n>>2]|0,32,0)|0;WCa(q,-1);EBa(q,0,0,c[a>>2]|0,c[n>>2]|0,u,0,0,0,0,0,0)|0;Rc[c[(c[u>>2]|0)+4>>2]&1023](u);ZGa(c[g>>2]|0,q,p,o,0)|0;if((q|0)==0){i=k;return}Rc[c[(c[q>>2]|0)+4>>2]&1023](q);i=k;return}if((j&768|0)!=256){if((c[b+20>>2]|0)==1){i=k;return}ZGa(s,b,d,e,h)|0;i=k;return}j=(c[b+8>>2]|0)+d|0;q=(c[b+12>>2]|0)+e|0;c[l>>2]=d;o=l+4|0;c[o>>2]=e;c[l+8>>2]=j;c[l+12>>2]=q;Ela(l,s+28|0);do{if((YGa(c[(c[g>>2]|0)+44>>2]|0)|0)!=0?(s=c[g>>2]|0,(c[s+4>>2]|0)!=0):0){q=RCa(YGa(c[s+44>>2]|0)|0,l)|0;s=q+8|0;j=q+12|0;EBa(q,0,0,c[s>>2]|0,c[j>>2]|0,c[(c[g>>2]|0)+4>>2]|0,c[l>>2]|0,c[o>>2]|0,0,0,0,0)|0;p=(d|0)<0?d:0;u=(e|0)<0?e:0;n=c[s>>2]|0;s=c[j>>2]|0;if((c[b+20>>2]|0)==1){FBa(q,0,0,n,s,b,f,p,u,h,0,0,0,0)|0;v=1;w=q;break}else{EBa(q,0,0,n,s,b,p,u,h,0,0,0)|0;v=1;w=q;break}}else{v=0;w=b}}while(0);do{if((YGa(c[(c[g>>2]|0)+44>>2]|0)|0)==0){if((c[b+20>>2]|0)==1){i=k;return}else{ZGa(c[g>>2]|0,b,c[l>>2]|0,c[o>>2]|0,h)|0;break}}else{ZGa(c[g>>2]|0,w,c[l>>2]|0,c[o>>2]|0,0)|0}}while(0);if((v|0)==0|(w|0)==0){i=k;return}Rc[c[(c[w>>2]|0)+4>>2]&1023](w);i=k;return}function nN(a,b){a=a|0;b=b|0;return(d[a+(b>>>8&255|256)+4>>0]|0)<<8|(d[a+(b&255)+4>>0]|0)|(d[a+(b>>>16&255|512)+4>>0]|0)<<16|0}function oN(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;e=u2a(56)|0;qN(e,a);hDa(e,b,c);i=d;return e|0}function pN(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[(c[a+32>>2]|0)+20>>2]|0;if((d|0)==1){e=264;i=b;return e|0}e=(d&2|0)!=0?544:24;i=b;return e|0}function qN(a,b){a=a|0;b=b|0;var d=0;d=i;eDa(a);c[a>>2]=39576;c[a+44>>2]=b+4;c[a+48>>2]=b+260;c[a+52>>2]=b+516;i=d;return}function rN(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;g=i;h=c[b+32>>2]|0;switch((c[h+20>>2]<<8)+(c[h+16>>2]|0)|0){case 257:{j=c[b+44>>2]|0;k=a[j>>0]|0;l=a[j+255>>0]|0;j=b+8|0;if((c[j>>2]|0)>0){m=e;n=0}else{i=g;return}while(1){a[m>>0]=(1<<7-((n|0)%8|0)&(d[f+((n|0)/8|0)>>0]|0)|0)==0?k:l;n=n+1|0;if((n|0)>=(c[j>>2]|0)){break}else{m=m+1|0}}i=g;return};case 1:{m=c[b+44>>2]|0;j=a[m>>0]|0;n=c[b+48>>2]|0;l=a[n>>0]|0;k=c[b+52>>2]|0;o=a[k>>0]|0;p=a[m+255>>0]|0;m=a[n+255>>0]|0;n=a[k+255>>0]|0;k=b+8|0;if((c[k>>2]|0)>0){q=e;r=0}else{i=g;return}while(1){s=q+1|0;if((1<<7-((r|0)%8|0)&(d[f+((r|0)/8|0)>>0]|0)|0)==0){a[q>>0]=o;a[s>>0]=l;a[q+2>>0]=j}else{a[q>>0]=n;a[s>>0]=m;a[q+2>>0]=p}r=r+1|0;if((r|0)>=(c[k>>2]|0)){break}else{q=q+3|0}}i=g;return};case 32:{t=1;break};case 264:{q=b+8|0;if((c[q>>2]|0)<=0){i=g;return}k=b+44|0;r=f;p=e;m=0;while(1){a[p>>0]=a[(c[k>>2]|0)+(d[r>>0]|0)>>0]|0;m=m+1|0;if((m|0)>=(c[q>>2]|0)){break}else{r=r+1|0;p=p+1|0}}i=g;return};case 24:{p=b+8|0;if((c[p>>2]|0)<=0){i=g;return}r=b+52|0;q=b+48|0;m=b+44|0;k=f;n=e;j=0;while(1){a[n>>0]=a[(c[r>>2]|0)+(d[k>>0]|0)>>0]|0;a[n+1>>0]=a[(c[q>>2]|0)+(d[k+1>>0]|0)>>0]|0;a[n+2>>0]=a[(c[m>>2]|0)+(d[k+2>>0]|0)>>0]|0;j=j+1|0;if((j|0)>=(c[p>>2]|0)){break}else{k=k+3|0;n=n+3|0}}i=g;return};case 544:{t=0;break};case 8:{n=c[h+28>>2]|0;h=b+8|0;if((c[h>>2]|0)<=0){i=g;return}k=(n|0)==0;p=b+52|0;j=b+48|0;m=b+44|0;q=f;r=e;l=0;while(1){o=d[q>>0]|0;if(k){a[r>>0]=a[(c[p>>2]|0)+o>>0]|0;a[r+1>>0]=a[(c[j>>2]|0)+o>>0]|0;a[r+2>>0]=a[(c[m>>2]|0)+o>>0]|0}else{s=c[n+(o<<2)>>2]|0;a[r>>0]=a[(c[p>>2]|0)+(s>>>16&255)>>0]|0;a[r+1>>0]=a[(c[j>>2]|0)+(s>>>8&255)>>0]|0;a[r+2>>0]=a[(c[m>>2]|0)+(s&255)>>0]|0}l=l+1|0;if((l|0)>=(c[h>>2]|0)){break}else{q=q+1|0;r=r+3|0}}i=g;return};default:{i=g;return}}r=b+8|0;if((c[r>>2]|0)<=0){i=g;return}q=b+52|0;h=b+48|0;l=b+44|0;b=(t|0)==0;t=f;f=e;e=0;while(1){a[f>>0]=a[(c[q>>2]|0)+(d[t>>0]|0)>>0]|0;a[f+1>>0]=a[(c[h>>2]|0)+(d[t+1>>0]|0)>>0]|0;m=f+3|0;a[f+2>>0]=a[(c[l>>2]|0)+(d[t+2>>0]|0)>>0]|0;if(b){a[m>>0]=a[t+3>>0]|0;u=f+4|0}else{u=m}e=e+1|0;if((e|0)>=(c[r>>2]|0)){break}else{t=t+4|0;f=u}}i=g;return}function sN(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0;j=i;if((h|0)==8){if((g|0)<=0){i=j;return}k=b+44|0;l=e;m=f;n=0;while(1){a[l>>0]=a[(c[k>>2]|0)+(d[m>>0]|0)>>0]|0;n=n+1|0;if((n|0)==(g|0)){break}else{l=l+1|0;m=m+1|0}}i=j;return}else if((h|0)==24){if((g|0)<=0){i=j;return}h=b+52|0;m=b+48|0;l=b+44|0;n=e;k=f;o=0;while(1){a[n>>0]=a[(c[h>>2]|0)+(d[k>>0]|0)>>0]|0;a[n+1>>0]=a[(c[m>>2]|0)+(d[k+1>>0]|0)>>0]|0;a[n+2>>0]=a[(c[l>>2]|0)+(d[k+2>>0]|0)>>0]|0;o=o+1|0;if((o|0)==(g|0)){break}else{n=n+3|0;k=k+3|0}}i=j;return}else{if((g|0)<=0){i=j;return}k=b+52|0;n=b+48|0;o=b+44|0;b=f;f=e;e=0;while(1){a[f>>0]=a[(c[k>>2]|0)+(d[b>>0]|0)>>0]|0;a[f+1>>0]=a[(c[n>>2]|0)+(d[b+1>>0]|0)>>0]|0;a[f+2>>0]=a[(c[o>>2]|0)+(d[b+2>>0]|0)>>0]|0;a[f+3>>0]=a[b+3>>0]|0;e=e+1|0;if((e|0)==(g|0)){break}else{b=b+4|0;f=f+4|0}}i=j;return}}function tN(a){a=a|0;var b=0,d=0,e=0;b=i;c[a>>2]=39632;g[a+36>>2]=1.0;g[a+24>>2]=1.0;d=a+40|0;g[a+32>>2]=0.0;g[a+28>>2]=0.0;c[a+8>>2]=0;c[a+12>>2]=0;e=a+4|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;c[d+24>>2]=0;c[d+28>>2]=0;c[e>>2]=1;c[a+16>>2]=0;c[a+100>>2]=0;c[a+104>>2]=0;e=a+112|0;c[a+76>>2]=0;c[a+84>>2]=0;c[a+88>>2]=0;c[a+20>>2]=0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;i=b;return}function uN(a){a=a|0;var b=0;b=i;vN(a);v2a(a);i=b;return}function vN(a){a=a|0;var b=0,d=0,e=0;b=i;c[a>>2]=39632;d=c[a+100>>2]|0;if((d|0)!=0){FN(d);v2a(d)}d=c[a+104>>2]|0;if((d|0)!=0){BDa(d);v2a(d)}d=c[a+112>>2]|0;if((d|0)!=0){dHa(c[(c[(c[a+8>>2]|0)+76>>2]|0)+44>>2]|0,d)}d=c[a+116>>2]|0;if((d|0)!=0){nO(d);v2a(d)}d=c[a+76>>2]|0;if((d|0)==0){e=a+48|0;sO(e);i=b;return}Rc[c[(c[d>>2]|0)+4>>2]&1023](d);e=a+48|0;sO(e);i=b;return}function wN(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0;b=i;i=i+32|0;d=b+16|0;e=b;f=a+24|0;ema(d,f);Mla(e,d);d=(c[e+8>>2]|0)-(c[e>>2]|0)|0;h=(c[e+12>>2]|0)-(c[e+4>>2]|0)|0;e=c[a+8>>2]|0;j=a+116|0;if((qO(a+48|0,c[a+12>>2]|0,c[(c[e+64>>2]|0)+8>>2]|0,j,c[a+120>>2]|0,c[e+168>>2]|0,c[e+172>>2]|0,e,+g[f>>2]<0.0?0-d|0:d,+g[a+36>>2]>0.0?0-h|0:h)|0)==0){k=0;i=b;return k|0}if((c[j>>2]|0)==0){k=0;i=b;return k|0}c[a+16>>2]=4;k=1;i=b;return k|0}function xN(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;b=i;i=i+64|0;d=b+56|0;e=b+48|0;f=b+40|0;h=b+32|0;j=b+24|0;k=b+16|0;l=b+8|0;m=b;n=a+48|0;o=c[n>>2]|0;if((o|0)==0){p=0;i=b;return p|0}q=a+80|0;c[q>>2]=255;r=a+12|0;s=c[(c[r>>2]|0)+24>>2]|0;t=(s|0)!=0;if(t){c[q>>2]=Fla(+g[s+52>>2]*255.0)|0}u=a+72|0;c[u>>2]=o;o=a+8|0;v=c[o>>2]|0;if((c[v+4>>2]|0)==3?(c[a+52>>2]|0)==0:0){p=yN(a)|0;i=b;return p|0}do{if(t?(w=c[s+56>>2]|0,(w|0)!=0):0){x=s+60|0;y=c[x>>2]|0;if((y|0)==0){z=jM(c[c[v+64>>2]>>2]|0,w)|0;c[x>>2]=z;if((z|0)==0){break}else{A=z}}else{A=y}if((c[A+772>>2]|0)==0){y=a+60|0;z=oN(A,c[n>>2]|0,(c[y>>2]|0)==0&1)|0;c[n>>2]=z;c[u>>2]=z;if((c[y>>2]|0)!=0?(z=a+52|0,x=c[z>>2]|0,(x|0)!=0):0){c[z>>2]=RCa(x,0)|0}c[y>>2]=0}}}while(0);n=a+92|0;c[n>>2]=0;A=a+84|0;c[A>>2]=0;v=a+88|0;c[v>>2]=0;y=c[u>>2]|0;if((c[y+20>>2]|0)!=1){if((c[(c[o>>2]|0)+4>>2]|0)==1){x=RCa(y,0)|0;y=a+76|0;c[y>>2]=x;z=c[o>>2]|0;dDa(x,c[z+8>>2]|0,c[z+12>>2]|0);c[u>>2]=c[y>>2]}}else{y=c[r>>2]|0;u=c[y+16>>2]|0;z=(u|0)==0;x=z?0:u+4|0;if((!z?(zN(c[x>>2]|0)|0)!=0:0)?(z=qA(x)|0,c[v>>2]=z,(z|0)!=0):0){c[A>>2]=1}c[n>>2]=hM(c[o>>2]|0,y,0)|0}y=a+96|0;c[y>>2]=0;n=c[o>>2]|0;z=c[n+16>>2]|0;if((z&4|0)==0){if((z&64|0)!=0){c[y>>2]=64}}else{c[y>>2]=4}a:do{if((c[(c[n+76>>2]|0)+24>>2]|0)!=1?(z=c[(c[(c[(c[r>>2]|0)+52>>2]|0)+12>>2]|0)+12>>2]|0,c[d>>2]=39824,c[d+4>>2]=6,v=$H(z,d)|0,(v|0)!=0):0){z=c[v>>2]|0;if((z|0)==4){gH(e,v);c[f>>2]=39928;c[f+4>>2]=9;if(!(Ue(e,f)|0)?(c[h>>2]=39760,c[h+4>>2]=9,!(Ue(e,h)|0)):0){break}c[y>>2]=c[y>>2]|4096;break}else if((z|0)!=5){break}z=v+16|0;if((c[z>>2]|0)!=0){x=k+4|0;u=l+4|0;w=0;while(1){IH(j,v,w);c[k>>2]=39928;c[x>>2]=9;if(Ue(j,k)|0){break}c[l>>2]=39760;c[u>>2]=9;w=w+1|0;if(Ue(j,l)|0){break}if(!(w>>>0<(c[z>>2]|0)>>>0)){break a}}c[y>>2]=c[y>>2]|4096}}}while(0);l=c[o>>2]|0;if((c[l+16>>2]&1073741824|0)==0){if((c[(c[(c[r>>2]|0)+52>>2]|0)+36>>2]|0)!=0){c[y>>2]=c[y>>2]|32}}else{c[y>>2]=c[y>>2]|256}if((c[a+52>>2]|0)!=0){p=AN(a)|0;i=b;return p|0}if((c[A>>2]|0)!=0){p=BN(a,c[a+20>>2]|0)|0;i=b;return p|0}if(((((!((c[q>>2]|0)!=255|t^1)?(c[s+108>>2]|0)!=0:0)?(c[s+112>>2]|0)==0:0)?(c[s+16>>2]|0)==0:0)?+g[s+48>>2]==1.0:0)?+g[s+52>>2]==1.0:0){s=c[(c[l+64>>2]|0)+8>>2]|0;if((s|0)!=0){l=c[s+36>>2]|0;s=c[l+8>>2]|0;if((l|0)==0){B=0;C=s}else{B=c[l+12>>2]|0;C=s}}else{B=0;C=c[(c[(c[r>>2]|0)+52>>2]|0)+40>>2]|0}s=c[(c[(c[(c[r>>2]|0)+52>>2]|0)+12>>2]|0)+12>>2]|0;c[m>>2]=39808;c[m+4>>2]=10;r=$H(s,m)|0;m=VA(C,r,B)|0;if((m|0)!=0){B=c[m+8>>2]|0;if((B|0)==3|(B|0)==8|(B|0)==9){c[a+124>>2]=4}bB(IG(C)|0,r)}}p=CN(a)|0;i=b;return p|0}function yN(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;b=i;i=i+64|0;d=b+40|0;e=b+36|0;f=b+32|0;h=b+16|0;j=b;k=a+72|0;l=c[k>>2]|0;m=c[l+20>>2]|0;if((m&3|0)==0){OIa(d);XIa(d,0.0,0.0,1.0,1.0);$Ia(d,a+24|0);n=c[a+80>>2]|0;UGa(c[(c[a+8>>2]|0)+76>>2]|0,d,0,0,n|n<<8|n<<16|-16777216,0,2,0)|0;PIa(c[d+4>>2]|0);o=0;i=b;return o|0}if((m|0)==1){p=l}else{p=ZCa(l)|0}l=a+24|0;if(!(+R(+(+g[a+28>>2]))>=.5)?!(+R(+(+g[a+32>>2]))>=.5):0){ema(h,l);Mla(j,h);h=c[j+8>>2]|0;m=c[j>>2]|0;d=h-m|0;n=+g[l>>2]>0.0?d:0-d|0;d=c[j+12>>2]|0;q=c[j+4>>2]|0;j=d-q|0;r=+g[a+36>>2]>0.0?0-j|0:j;j=c[a+80>>2]|0;aHa(c[(c[a+8>>2]|0)+76>>2]|0,p,(n|0)>0?m:h,(r|0)>0?q:d,n,r,j|j<<8|j<<16|-16777216,0)|0}else{s=7}do{if((s|0)==7){j=wDa(p,l,e,f)|0;if((j|0)==0){o=1;i=b;return o|0}else{r=c[a+80>>2]|0;$Ga(c[(c[(c[a+8>>2]|0)+76>>2]|0)+44>>2]|0,j,c[e>>2]|0,c[f>>2]|0,r|r<<8|r<<16|-16777216)|0;Rc[c[(c[j>>2]|0)+4>>2]&1023](j);break}}}while(0);if((p|0)==0?1:(c[k>>2]|0)==(p|0)){o=0;i=b;return o|0}Rc[c[(c[p>>2]|0)+4>>2]&1023](p);o=0;i=b;return o|0}function zN(a){a=a|0;var b=0;if((a|0)==0){b=0}else{b=(c[a+8>>2]|0)==11}return b&1|0}function AN(b){b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;e=i;i=i+624|0;f=e+600|0;g=e+584|0;h=e+560|0;j=e+504|0;k=e+316|0;l=e+128|0;m=e;n=b+8|0;o=c[n>>2]|0;if((c[o+148>>2]|0)!=0?(c[(c[o+76>>2]|0)+20>>2]&128|0)==0:0){c[b+4>>2]=0;p=0;i=e;return p|0}o=b+24|0;ema(g,o);Mla(f,g);Ela(f,(c[(c[n>>2]|0)+76>>2]|0)+28|0);g=c[f+8>>2]|0;q=c[f>>2]|0;if((g|0)<=(q|0)){p=0;i=e;return p|0}r=c[f+12>>2]|0;s=f+4|0;t=c[s>>2]|0;if((r|0)<=(t|0)){p=0;i=e;return p|0}c[h+0>>2]=c[o+0>>2];c[h+4>>2]=c[o+4>>2];c[h+8>>2]=c[o+8>>2];c[h+12>>2]=c[o+12>>2];c[h+16>>2]=c[o+16>>2];c[h+20>>2]=c[o+20>>2];mM(h,0-q|0,0-t|0);o=g-q|0;q=r-t|0;Kxa(j);if((Mxa(j,o,q,32,0)|0)!=0){t=j+4|0;WCa(c[t>>2]|0,16777215);OL(k);r=c[n>>2]|0;QL(k,(c[r+72>>2]|0)+1|0,c[r+64>>2]|0,j,0,0,0,0,0,0,c[r+160>>2]|0,0,1,0,0,0,0);tN(l);r=c[b+72>>2]|0;g=b+96|0;u=c[g>>2]|0;c[l+8>>2]=k;c[l+72>>2]=r;c[l+92>>2]=0;c[l+80>>2]=255;r=l+24|0;c[r+0>>2]=c[h+0>>2];c[r+4>>2]=c[h+4>>2];c[r+8>>2]=c[h+8>>2];c[r+12>>2]=c[h+12>>2];c[r+16>>2]=c[h+16>>2];c[r+20>>2]=c[h+20>>2];c[l+96>>2]=u;c[l+120>>2]=1;c[l+124>>2]=0;if((CN(l)|0)!=0){lN(l,0)|0}vN(l);PL(k);Kxa(k);if((Mxa(k,o,q,8,0)|0)==0){v=1}else{u=k+4|0;WCa(c[u>>2]|0,0);OL(l);r=c[n>>2]|0;QL(l,(c[r+72>>2]|0)+1|0,c[r+64>>2]|0,k,0,0,0,0,0,0,c[r+160>>2]|0,0,1,0,0,0,0);tN(m);r=c[b+52>>2]|0;w=c[g>>2]|0;c[m+8>>2]=l;c[m+72>>2]=r;c[m+92>>2]=-1;c[m+80>>2]=255;r=m+24|0;c[r+0>>2]=c[h+0>>2];c[r+4>>2]=c[h+4>>2];c[r+8>>2]=c[h+8>>2];c[r+12>>2]=c[h+12>>2];c[r+16>>2]=c[h+16>>2];c[r+20>>2]=c[h+20>>2];c[m+96>>2]=w;c[m+120>>2]=1;c[m+124>>2]=0;if((CN(m)|0)!=0){lN(m,0)|0}w=c[b+56>>2]|0;if(!((w|0)==-1)?(h=w>>>16&255,r=w>>>8&255,g=w&255,(q|0)>0):0){w=(o|0)>0;x=0;do{y=c[t>>2]|0;z=dd[c[(c[y>>2]|0)+12>>2]&511](y,x)|0;y=c[u>>2]|0;A=dd[c[(c[y>>2]|0)+12>>2]&511](y,x)|0;if(w){y=0;B=z;z=A;while(1){A=a[z>>0]|0;z=z+1|0;C=A&255;if(!(A<<24>>24==0)){A=((((d[B>>0]|0)-g|0)*255|0)/(C|0)|0)+g|0;if((A|0)<0){D=0}else{D=(A|0)>255?-1:A&255}A=B+1|0;a[B>>0]=D;E=((((d[A>>0]|0)-r|0)*255|0)/(C|0)|0)+r|0;if((E|0)<0){F=0}else{F=(E|0)>255?-1:E&255}E=B+2|0;a[A>>0]=F;A=((((d[E>>0]|0)-h|0)*255|0)/(C|0)|0)+h|0;if((A|0)<0){G=0}else{G=(A|0)>255?-1:A&255}a[E>>0]=G}y=y+1|0;if((y|0)==(o|0)){break}else{B=B+4|0}}}x=x+1|0}while((x|0)<(q|0))}kCa(c[u>>2]|0,264)|0;$Ca(c[t>>2]|0,c[u>>2]|0);u=c[b+80>>2]|0;if((u|0)<255){aDa(c[t>>2]|0,u)}vN(m);PL(l);v=0}Oxa(k);if((v|0)==0){ZGa(c[(c[n>>2]|0)+76>>2]|0,c[t>>2]|0,c[f>>2]|0,c[s>>2]|0,c[b+124>>2]|0)|0;H=0}else{H=1}}else{H=1}Oxa(j);p=H;i=e;return p|0}function BN(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;f=i;i=i+640|0;g=f+624|0;h=f+608|0;j=f+584|0;k=f+532|0;l=f+344|0;m=f+320|0;n=f+128|0;o=f;p=b+8|0;q=c[p>>2]|0;if((c[q+148>>2]|0)!=0?(c[(c[q+76>>2]|0)+20>>2]&128|0)==0:0){c[b+4>>2]=0;r=0;i=f;return r|0}q=b+24|0;ema(h,q);Mla(g,h);Ela(g,(c[(c[p>>2]|0)+76>>2]|0)+28|0);h=c[g+8>>2]|0;s=c[g>>2]|0;if((h|0)<=(s|0)){r=0;i=f;return r|0}t=c[g+12>>2]|0;u=g+4|0;v=c[u>>2]|0;if((t|0)<=(v|0)){r=0;i=f;return r|0}c[j+0>>2]=c[q+0>>2];c[j+4>>2]=c[q+4>>2];c[j+8>>2]=c[q+8>>2];c[j+12>>2]=c[q+12>>2];c[j+16>>2]=c[q+16>>2];c[j+20>>2]=c[q+20>>2];q=0-s|0;w=0-v|0;mM(j,q,w);x=h-s|0;s=t-v|0;Kxa(k);if((Mxa(k,x,s,32,0)|0)!=0){v=k+4|0;WCa(c[v>>2]|0,16777215);OL(l);t=c[p>>2]|0;QL(l,(c[t+72>>2]|0)+1|0,c[t+64>>2]|0,k,0,0,0,0,t+4|0,0,c[t+160>>2]|0,0,1,0,0,0,0);c[m+0>>2]=c[e+0>>2];c[m+4>>2]=c[e+4>>2];c[m+8>>2]=c[e+8>>2];c[m+12>>2]=c[e+12>>2];c[m+16>>2]=c[e+16>>2];c[m+20>>2]=c[e+20>>2];$la(m,+(q|0),+(w|0));w=c[b+88>>2]|0;if((c[w+8>>2]|0)==1){zO(l,w,c[b+12>>2]|0,m,0)}else{wO(l,w,c[b+12>>2]|0,m,0)}PL(l);Kxa(l);if((Mxa(l,x,s,8,0)|0)==0){y=1}else{m=l+4|0;WCa(c[m>>2]|0,0);OL(n);w=c[p>>2]|0;QL(n,(c[w+72>>2]|0)+1|0,c[w+64>>2]|0,l,0,0,0,0,0,0,c[w+160>>2]|0,0,1,0,0,0,0);tN(o);w=c[b+72>>2]|0;q=c[b+96>>2]|0;c[o+8>>2]=n;c[o+72>>2]=w;c[o+92>>2]=-1;c[o+80>>2]=255;w=o+24|0;c[w+0>>2]=c[j+0>>2];c[w+4>>2]=c[j+4>>2];c[w+8>>2]=c[j+8>>2];c[w+12>>2]=c[j+12>>2];c[w+16>>2]=c[j+16>>2];c[w+20>>2]=c[j+20>>2];c[o+96>>2]=q;c[o+120>>2]=1;c[o+124>>2]=0;if((CN(o)|0)!=0){lN(o,0)|0}q=c[b+56>>2]|0;if(!((q|0)==-1)?(j=q>>>16&255,w=q>>>8&255,e=q&255,(s|0)>0):0){q=(x|0)>0;t=0;do{h=c[v>>2]|0;z=dd[c[(c[h>>2]|0)+12>>2]&511](h,t)|0;h=c[m>>2]|0;A=dd[c[(c[h>>2]|0)+12>>2]&511](h,t)|0;if(q){h=0;B=z;z=A;while(1){A=a[z>>0]|0;z=z+1|0;C=A&255;if(!(A<<24>>24==0)){A=((((d[B>>0]|0)-e|0)*255|0)/(C|0)|0)+e|0;if((A|0)<0){D=0}else{D=(A|0)>255?-1:A&255}A=B+1|0;a[B>>0]=D;E=((((d[A>>0]|0)-w|0)*255|0)/(C|0)|0)+w|0;if((E|0)<0){F=0}else{F=(E|0)>255?-1:E&255}E=B+2|0;a[A>>0]=F;A=((((d[E>>0]|0)-j|0)*255|0)/(C|0)|0)+j|0;if((A|0)<0){G=0}else{G=(A|0)>255?-1:A&255}a[E>>0]=G}h=h+1|0;if((h|0)==(x|0)){break}else{B=B+4|0}}}t=t+1|0}while((t|0)<(s|0))}kCa(c[m>>2]|0,264)|0;$Ca(c[v>>2]|0,c[m>>2]|0);aDa(c[v>>2]|0,255);vN(o);PL(n);y=0}Oxa(l);if((y|0)==0){ZGa(c[(c[p>>2]|0)+76>>2]|0,c[v>>2]|0,c[g>>2]|0,c[u>>2]|0,c[b+124>>2]|0)|0;H=0}else{H=1}}else{H=1}Oxa(k);r=H;i=f;return r|0}function CN(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0,B=0,C=0,D=0;b=i;i=i+80|0;d=b+64|0;e=b+48|0;f=b+32|0;h=b+16|0;j=b;k=a+96|0;l=c[k>>2]|0;m=a+72|0;n=c[m>>2]|0;if((((l&4|0)==0?(o=c[n+16>>2]|0,(o|0)>1):0)?(p=ca(c[n+8>>2]|0,(o|0)/8|0)|0,(ca(p,c[n+12>>2]|0)|0)>6e7):0)?(l&64|0)==0:0){p=l|4;c[k>>2]=p;q=p}else{q=l}l=a+8|0;p=a+80|0;o=a+92|0;r=a+24|0;s=a+112|0;t=a+124|0;if((bHa(c[(c[(c[l>>2]|0)+76>>2]|0)+44>>2]|0,n,c[p>>2]|0,c[o>>2]|0,r,q,s,c[t>>2]|0)|0)!=0){if((c[s>>2]|0)==0){u=0;i=b;return u|0}c[a+16>>2]=3;u=1;i=b;return u|0}ema(d,r);Mla(e,d);d=c[e+8>>2]|0;s=c[e>>2]|0;q=d-s|0;n=c[e+12>>2]|0;v=e+4|0;w=c[v>>2]|0;x=n-w|0;if(((!(+R(+(+g[a+28>>2]))>=.5)?(y=+g[r>>2],!(y==0.0)):0)?!(+R(+(+g[a+32>>2]))>=.5):0)?(z=+g[a+36>>2],!(z==0.0)):0){A=y<0.0?0-q|0:q;q=z>0.0?0-x|0:x;x=(A|0)>0?s:d;d=(q|0)>0?w:n;n=c[m>>2]|0;w=c[n+20>>2]|0;do{if((w&3|0)==0?(c[p>>2]|0)==255:0){if((_Ga(c[(c[l>>2]|0)+76>>2]|0,n,x,d,A,q,c[k>>2]|0,c[t>>2]|0)|0)==0){s=c[m>>2]|0;B=s;C=c[s+20>>2]|0;break}else{u=0;i=b;return u|0}}else{B=n;C=w}}while(0);if((C|0)==1){C=c[p>>2]|0;w=c[o>>2]|0;if((C|0)==255){D=w}else{n=(((ca(w>>>24,C)|0)>>>0)/255|0)<<24|w&16777215;c[o>>2]=n;D=n}if((aHa(c[(c[l>>2]|0)+76>>2]|0,B,x,d,A,q,D,c[k>>2]|0)|0)!=0){u=0;i=b;return u|0}}D=c[l>>2]|0;d=c[D+76>>2]|0;if((c[D+148>>2]|0)!=0?(c[d+20>>2]&128|0)==0:0){c[a+4>>2]=0;u=1;i=b;return u|0}D=d+28|0;c[h+0>>2]=c[D+0>>2];c[h+4>>2]=c[D+4>>2];c[h+8>>2]=c[D+8>>2];c[h+12>>2]=c[D+12>>2];Ela(h,e);D=c[h>>2]|0;d=c[e>>2]|0;x=c[h+4>>2]|0;B=c[v>>2]|0;v=(c[h+8>>2]|0)-d|0;n=(c[h+12>>2]|0)-B|0;c[j>>2]=D-d;c[j+4>>2]=x-B;c[j+8>>2]=v;c[j+12>>2]=n;n=zDa(c[m>>2]|0,A,q,c[k>>2]|0,j)|0;if((n|0)==0){u=0;i=b;return u|0}mN(c[l>>2]|0,n,D,x,c[o>>2]|0,c[p>>2]|0,c[t>>2]|0,0);Rc[c[(c[n>>2]|0)+4>>2]&1023](n);u=0;i=b;return u|0}n=c[l>>2]|0;l=c[n+76>>2]|0;if((c[n+148>>2]|0)!=0?(c[l+20>>2]&128|0)==0:0){c[a+4>>2]=0;u=0;i=b;return u|0}n=l+28|0;c[f+0>>2]=c[n+0>>2];c[f+4>>2]=c[n+4>>2];c[f+8>>2]=c[n+8>>2];c[f+12>>2]=c[n+12>>2];Ela(f,e);c[a+16>>2]=2;e=u2a(148)|0;ADa(e);c[a+104>>2]=e;xDa(e,c[m>>2]|0,r,c[k>>2]|0,f);u=1;i=b;return u|0}function DN(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=i;c[a+8>>2]=b;c[a+72>>2]=d;c[a+92>>2]=e;c[a+80>>2]=255;e=a+24|0;c[e+0>>2]=c[f+0>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];c[e+16>>2]=c[f+16>>2];c[e+20>>2]=c[f+20>>2];c[a+96>>2]=0;c[a+120>>2]=0;c[a+124>>2]=0;f=CN(a)|0;i=g;return f|0}function EN(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;e=i;f=c[b>>2]|0;g=Lc[c[(c[f>>2]|0)+8>>2]&255](f)|0;f=b+60|0;h=c[f>>2]|0;if((h|0)!=0){j=Lc[c[(c[h>>2]|0)+24>>2]&255](h)|0;h=c[f>>2]|0;if((h|0)==0){k=j;l=5}else{m=j;n=Lc[c[(c[h>>2]|0)+28>>2]&255](h)|0}}else{k=c[b+40>>2]|0;l=5}if((l|0)==5){m=k;n=c[b+44>>2]|0}k=b+36|0;h=ca(c[k>>2]|0,m)|0;j=b+64|0;o=b+92|0;p=c[o>>2]|0;q=b+32|0;r=c[q>>2]|0;if((p|0)>=(r|0)){s=0;i=e;return s|0}t=b+52|0;u=b+16|0;v=b+24|0;w=b+28|0;x=(d|0)==0;y=b+12|0;z=b+48|0;A=b+20|0;B=b+56|0;C=p;p=r;while(1){if((c[t>>2]|0)==0){r=ca((c[u>>2]|0)+C|0,n)|0;D=C;E=(r|0)/(c[v>>2]|0)|0}else{r=p-C|0;F=c[v>>2]|0;D=r+ -1|0;E=(ca(1-r+ -1+F-(c[u>>2]|0)|0,n)|0)/(F|0)|0}F=c[f>>2]|0;if((F|0)!=0){r=dd[c[(c[F>>2]|0)+16>>2]&511](F,E)|0;if((r|0)==0){s=0;l=27;break}else{G=r}}else{r=vH(j)|0;if((r|0)==0){s=0;l=27;break}G=r+(ca(h,E)|0)|0}if((c[w>>2]|0)>0){r=g+(ca(c[(c[b>>2]|0)+24>>2]|0,D)|0)|0;F=0;while(1){H=(c[y>>2]|0)+F|0;I=c[A>>2]|0;if((c[z>>2]|0)==0){J=H}else{J=I+~H|0}H=(ca(J,m)|0)/(I|0)|0;I=ca(c[k>>2]|0,H)|0;H=G+I|0;K=c[B>>2]|0;if((K|0)==0){a[r>>0]=a[G+(I+2)>>0]|0;a[r+1>>0]=a[G+(I+1)>>0]|0;a[r+2>>0]=a[H>>0]|0}else{ad[c[(c[K>>2]|0)+12>>2]&15](K,r,H,1,0,0,0)}F=F+1|0;if((F|0)>=(c[w>>2]|0)){break}else{r=r+3|0}}}r=(c[o>>2]|0)+1|0;c[o>>2]=r;if(x){L=r}else{if((Lc[c[c[d>>2]>>2]&255](d)|0)!=0){s=1;l=27;break}L=c[o>>2]|0}p=c[q>>2]|0;if((L|0)>=(p|0)){s=0;l=27;break}else{C=L}}if((l|0)==27){i=e;return s|0}return 0}function FN(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;if((d|0)!=0){Rc[c[(c[d>>2]|0)+4>>2]&1023](d)}d=c[a+56>>2]|0;if((d|0)!=0){Az(d)}d=c[a+60>>2]|0;if((d|0)==0){e=a+64|0;FI(e);i=b;return}Rc[c[(c[d>>2]|0)+4>>2]&1023](d);e=a+64|0;FI(e);i=b;return}function GN(b,e,f,h){b=b|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;j=i;i=i+592|0;k=j+576|0;l=j+568|0;m=j+560|0;n=j+552|0;o=j+528|0;p=j+448|0;q=j+392|0;r=j+384|0;s=j+376|0;t=j+368|0;u=j+360|0;v=j+356|0;w=j+352|0;x=j+348|0;y=j+312|0;z=j+304|0;A=j+264|0;B=j+76|0;C=j+8|0;D=j+4|0;E=j;if((e|0)==0){F=0;i=j;return F|0}G=(c[f+8>>2]|0)-(c[f>>2]|0)|0;H=f+4|0;I=(c[f+12>>2]|0)-(c[H>>2]|0)|0;c[k>>2]=39648;c[k+4>>2]=1;bI(l,e,k);k=tm(c[l>>2]|0,c[l+4>>2]|0,39656,5)|0;l=k&1;c[m>>2]=1291944;c[m+4>>2]=1;J=kI(e,m)|0;if((J|0)==0){F=0;i=j;return F|0}c[n>>2]=39664;c[n+4>>2]=2;m=$H(e,n)|0;if((m|0)!=0?((c[m>>2]|0)+ -6|0)>>>0<2:0){K=eC(m)|0}else{K=0}c[o+0>>2]=c[h+0>>2];c[o+4>>2]=c[h+4>>2];c[o+8>>2]=c[h+8>>2];c[o+12>>2]=c[h+12>>2];c[o+16>>2]=c[h+16>>2];c[o+20>>2]=c[h+20>>2];mM(o,0-(c[f>>2]|0)|0,0-(c[H>>2]|0)|0);H=b+64|0;f=c[H>>2]|0;Sy(p,c[f>>2]|0,c[f+4>>2]|0,J,0);Uy(p,0,0,0,0,0);Kxa(q);if((Mxa(q,G,I,k?24:264,0)|0)==0){L=0}else{f=c[q+4>>2]|0;if(k){c[r>>2]=39672;c[r+4>>2]=2;h=jI(e,r)|0;if((h|0)!=0){r=c[J+12>>2]|0;if((r|0)!=0?(c[s>>2]=39680,c[s+4>>2]=5,(iI(r,s)|0)!=0):0){c[t>>2]=39680;c[t+4>>2]=5;s=iI(r,t)|0;c[u>>2]=39688;c[u+4>>2]=2;M=$H(s,u)|0}else{M=0}u=VA(c[c[H>>2]>>2]|0,M,0)|0;if((u|0)!=0){s=c[u+12>>2]|0;t=(s|0)>8?s:8;ON(y,t);s=y+32|0;r=c[s>>2]|0;J=(r|0)==0?y:r;f3a(J|0,0,t<<2|0)|0;t=c[h+16>>2]|0;r=t>>>0>8?8:t;if((r|0)>0){t=0;do{g[J+(t<<2)>>2]=+DH(h,t);t=t+1|0}while((t|0)<(r|0))}ed[c[(c[u>>2]|0)+4>>2]&127](u,J,v,w,x)|0;J=~~(+g[v>>2]*255.0)<<16|~~(+g[w>>2]*255.0)<<8|~~(+g[x>>2]*255.0)|-16777216;bB(IG(c[c[H>>2]>>2]|0)|0,M);NN(c[s>>2]|0);N=J;O=u}else{N=-16777216;O=0}}else{N=-16777216;O=0}WCa(f,N);P=O}else{WCa(f,0);P=0}O=c[p>>2]|0;if((O|0)==0){Q=0}else{c[z>>2]=669496;c[z+4>>2]=9;Q=iI(O,z)|0}ML(A);c[A>>2]=k?0:3;OL(B);if((P|0)==0){R=0}else{R=c[P+8>>2]|0}QL(B,(c[b+72>>2]|0)+1|0,c[H>>2]|0,q,0,0,0,0,A,0,c[b+160>>2]|0,Q,1,0,0,R,l);RL(B,p,o);o=u2a(40)|0;ICa(o);if((JCa(o,G,I,264,0)|0)==0){if((o|0)==0){S=0}else{Rc[c[(c[o>>2]|0)+4>>2]&1023](o);S=0}}else{l=Lc[c[(c[o>>2]|0)+8>>2]&255](o)|0;R=c[o+24>>2]|0;Q=Lc[c[(c[f>>2]|0)+8>>2]&255](f)|0;b=c[f+24>>2]|0;A=w2a(256,1)|0;H=(K|0)!=0;if(H){KA(C,c[K+8>>2]|0);P=C+64|0;z=0;do{g[D>>2]=+(z|0)/255.0;O=c[P>>2]|0;gC(K,D,1,(O|0)==0?C:O,E)|0;O=c[P>>2]|0;a[A+z>>0]=Fla(+g[((O|0)==0?C:O)>>2]*255.0)|0;z=z+1|0}while((z|0)<256);JA(c[P>>2]|0)}else{P=0;do{a[A+P>>0]=P;P=P+1|0}while((P|0)!=256)}do{if(k){P=(c[f+16>>2]|0)/8|0;if((I|0)>0){z=(G|0)>0;C=0;do{if(z){E=0;D=l+(ca(C,R)|0)|0;O=Q+(ca(C,b)|0)|0;while(1){a[D>>0]=a[A+(((((d[O+1>>0]|0)*59|0)+((d[O>>0]|0)*11|0)+((d[O+2>>0]|0)*30|0)|0)>>>0)/100|0)>>0]|0;E=E+1|0;if((E|0)==(G|0)){break}else{D=D+1|0;O=O+P|0}}}C=C+1|0}while((C|0)!=(I|0));T=41}else{T=41}}else{C=ca(R,I)|0;if(!H){c3a(l|0,Q|0,C|0)|0;break}if((C|0)>0){P=0;do{a[l+P>>0]=a[A+(d[Q+P>>0]|0)>>0]|0;P=P+1|0}while((P|0)!=(C|0));T=41}else{T=41}}}while(0);if((T|0)==41?!((K|0)==0|H^1):0){Rc[c[(c[K>>2]|0)+4>>2]&1023](K)}v2a(A);S=o}PL(B);L=S}Oxa(q);Iy(p);F=L;i=j;return F|0}function HN(a){a=a|0;var b=0;b=i;gDa(a);i=b;return}function IN(a){a=a|0;var b=0;b=i;gDa(a);v2a(a);i=b;return}function JN(a){a=a|0;return 0}function KN(a,b,c){a=a|0;b=b|0;c=c|0;return 0}function LN(a,b,c){a=a|0;b=b|0;c=c|0;return}function MN(a){a=a|0;return 0}function NN(a){a=a|0;var b=0;b=i;if((a|0)!=0){v2a(a)}i=b;return}function ON(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+32|0;c[e>>2]=0;if((b|0)>8){c[e>>2]=w2a(b,4)|0;i=d;return}else{c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;c[a+24>>2]=0;c[a+28>>2]=0;i=d;return}}function PN(a){a=a|0;var b=0,d=0,e=0;b=i;d=u2a(136)|0;WN(d);if((QN(d,c[a+40>>2]|0,c[a+12>>2]|0)|0)!=0){e=d;i=b;return e|0}if((d|0)==0){e=0;i=b;return e|0}Rc[c[(c[d>>2]|0)+4>>2]&1023](d);e=0;i=b;return e|0}function QN(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+32|0;f=e+16|0;g=e+8|0;h=e;if((d|0)==0){j=0;i=e;return j|0}c[a+64>>2]=b;b=c[d+12>>2]|0;k=a+76|0;c[k>>2]=b;c[a+68>>2]=d;c[f>>2]=1280896;c[f+4>>2]=5;l=a+8|0;c[l>>2]=eI(b,f)|0;f=c[k>>2]|0;c[g>>2]=39736;c[g+4>>2]=6;k=eI(f,g)|0;g=a+12|0;c[g>>2]=k;f=c[l>>2]|0;if((f|0)<1|(k|0)<1|(f|0)>131071|(k|0)>131071){j=0;i=e;return j|0}c[a+96>>2]=0;c[a+100>>2]=0;if((ZN(a,0,0)|0)==0){j=0;i=e;return j|0}k=a+88|0;f=c[k>>2]|0;if((f|0)!=0){b=c[a+92>>2]|0;if((b|0)!=0){if(b>>>0>(2147483647/(f>>>0)|0)>>>0){j=0;i=e;return j|0}m=ca(b,f)|0;b=c[l>>2]|0;if((m|0)!=0?b>>>0>(2147483647/(m>>>0)|0)>>>0:0){j=0;i=e;return j|0}n=ca(b,m)|0;if(n>>>0>4294967288){j=0;i=e;return j|0}m=(n+7|0)>>>3;if((m|0)!=0){if((c[g>>2]|0)>>>0>(2147483647/(m>>>0)|0)>>>0){j=0;i=e;return j|0}else{o=m}}else{o=0}}else{o=f}}else{o=0}f=u2a(28)|0;EI(f);m=a+72|0;c[m>>2]=f;rH(f,d,0,ca(c[g>>2]|0,o)|0,1);o=c[m>>2]|0;if((sH(o)|0)==0){j=0;i=e;return j|0}if((vH(o)|0)==0){j=0;i=e;return j|0}m=c[o+12>>2]|0;if(!(gl(m)|0)?(c[h>>2]=39744,c[h+4>>2]=14,vka(m,h)|0):0){c[k>>2]=1}if((_N(a)|0)==0){j=0;i=e;return j|0}do{if((c[a+108>>2]|0)==0){h=c[k>>2]|0;m=c[a+92>>2]|0;o=ca(m,h)|0;do{if((o|0)!=1){g=a+16|0;if(o>>>0<9){c[g>>2]=8;p=8;break}else{c[g>>2]=24;p=24;break}}else{c[a+16>>2]=1;p=1}}while(0);if((h|0)==0|(m|0)==0){j=0;i=e;return j|0}else{q=a+16|0;r=p;break}}else{o=a+16|0;c[o>>2]=1;c[k>>2]=1;c[a+92>>2]=1;c[a+20>>2]=1;q=o;r=1}}while(0);k=c[l>>2]|0;p=a+24|0;c[p>>2]=k;if(r>>>0>(2147483647/(k>>>0)|0)>>>0){j=0;i=e;return j|0}o=ca(r,k)|0;c[p>>2]=o;if(o>>>0>4294967264){j=0;i=e;return j|0}k=(o+31|0)>>>5<<2;c[p>>2]=k;c[a+120>>2]=w2a(k,1)|0;$N(a);if((c[a+112>>2]|0)==0){j=1;i=e;return j|0}c[q>>2]=32;c[a+20>>2]=2;q=c[l>>2]|0;c[p>>2]=q;if((2147483647/(q>>>0)|0)>>>0<32){j=0;i=e;return j|0}l=q<<2&536870908;c[p>>2]=l;c[a+124>>2]=w2a(l,1)|0;j=1;i=e;return j|0}function RN(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0;h=i;j=u2a(136)|0;WN(j);c[a>>2]=j;k=SN(j,c[a+40>>2]|0,c[a+12>>2]|0,1,b,d,e,f,g)|0;if((k|0)==2){l=1;i=h;return l|0}g=c[a>>2]|0;if((k|0)!=0){k=g+32|0;f=c[k>>2]|0;c[k>>2]=0;c[a+4>>2]=f;c[a+8>>2]=c[(c[a>>2]|0)+36>>2];l=0;i=h;return l|0}if((g|0)!=0){Rc[c[(c[g>>2]|0)+4>>2]&1023](g)}c[a>>2]=0;l=0;i=h;return l|0}function SN(a,b,d,e,f,g,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;l=i;i=i+32|0;m=l+16|0;n=l+8|0;o=l;if((d|0)==0){p=0;i=l;return p|0}c[a+64>>2]=b;b=c[d+12>>2]|0;q=a+76|0;c[q>>2]=b;r=a+68|0;c[r>>2]=d;s=a+48|0;c[s>>2]=h;h=a+60|0;c[h>>2]=e;c[m>>2]=1280896;c[m+4>>2]=5;e=a+8|0;c[e>>2]=eI(b,m)|0;m=c[q>>2]|0;c[n>>2]=39736;c[n+4>>2]=6;q=eI(m,n)|0;n=a+12|0;c[n>>2]=q;m=c[e>>2]|0;if((m|0)<1|(q|0)<1|(m|0)>131071|(q|0)>131071){p=0;i=l;return p|0}c[a+96>>2]=j;c[a+100>>2]=k;if((ZN(a,(c[(c[r>>2]|0)+4>>2]|0)!=0?0:f,g)|0)==0){p=0;i=l;return p|0}g=a+88|0;f=c[g>>2]|0;if((f|0)!=0){r=c[a+92>>2]|0;if((r|0)!=0){if(r>>>0>(2147483647/(f>>>0)|0)>>>0){p=0;i=l;return p|0}k=ca(r,f)|0;r=c[e>>2]|0;if((k|0)!=0?r>>>0>(2147483647/(k>>>0)|0)>>>0:0){p=0;i=l;return p|0}e=ca(r,k)|0;if(e>>>0>4294967288){p=0;i=l;return p|0}k=(e+7|0)>>>3;if((k|0)!=0){if((c[n>>2]|0)>>>0>(2147483647/(k>>>0)|0)>>>0){p=0;i=l;return p|0}else{t=k}}else{t=0}}else{t=f}}else{t=0}f=u2a(28)|0;EI(f);k=a+72|0;c[k>>2]=f;rH(f,d,0,ca(c[n>>2]|0,t)|0,1);t=c[k>>2]|0;if((sH(t)|0)==0){p=0;i=l;return p|0}if((vH(t)|0)==0){p=0;i=l;return p|0}k=c[t+12>>2]|0;if(!(gl(k)|0)?(c[o>>2]=39744,c[o+4>>2]=14,vka(k,o)|0):0){c[g>>2]=1}g=_N(a)|0;if((g|0)==0){p=0;i=l;return p|0}else if((g|0)==1){if((aO(a)|0)==0){p=0;i=l;return p|0}if((c[h>>2]|0)!=0){o=bO(a)|0;if((o|0)==2){p=2;i=l;return p|0}else{u=o}}else{u=1}o=c[a+80>>2]|0;if((o|0)==0){p=u;i=l;return p|0}if((c[s>>2]|0)==0){p=u;i=l;return p|0}Ic[c[(c[o>>2]|0)+20>>2]&511](o,0);p=u;i=l;return p|0}else{if((aO(a)|0)==0){p=0;i=l;return p|0}if((c[h>>2]|0)==0){p=g;i=l;return p|0}bO(a)|0;p=g;i=l;return p|0}return 0}function TN(a){a=a|0;var b=0;b=a+32|0;a=c[b>>2]|0;c[b>>2]=0;return a|0}function UN(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=VN(c[a>>2]|0,b)|0;if((e|0)==2){f=1;i=d;return f|0}b=c[a>>2]|0;if((e|0)!=0){e=b+32|0;g=c[e>>2]|0;c[e>>2]=0;c[a+4>>2]=g;c[a+8>>2]=c[(c[a>>2]|0)+36>>2];f=0;i=d;return f|0}if((b|0)!=0){Rc[c[(c[b>>2]|0)+4>>2]&1023](b)}c[a>>2]=0;f=0;i=d;return f|0}function VN(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;d=i;i=i+16|0;e=d+8|0;f=d;g=a+52|0;h=c[g>>2]|0;if((h|0)==1){j=a+72|0;k=c[j>>2]|0;c[e>>2]=39760;c[e+4>>2]=9;if(vka(c[k+12>>2]|0,e)|0){l=0;i=d;return l|0}e=Ht(c[(xt()|0)+4>>2]|0)|0;k=a+40|0;m=c[k>>2]|0;if((m|0)!=0){n=Qc[c[(c[e>>2]|0)+28>>2]&255](e,m,b)|0;if((n|0)<0){m=a+128|0;o=c[m>>2]|0;if((o|0)!=0){Rc[c[(c[o>>2]|0)+4>>2]&1023](o)}c[m>>2]=0;m=a+44|0;o=c[m>>2]|0;if((o|0)!=0){FI(o);v2a(o)}c[m>>2]=0;Ic[c[(c[e>>2]|0)+32>>2]&511](e,c[k>>2]|0);c[k>>2]=0;l=0;i=d;return l|0}if((n|0)==3){l=2;i=d;return l|0}if((c[a+60>>2]|0)!=0){n=cO(a,b)|0;c[g>>2]=2;if((n|0)==2){l=2;i=d;return l|0}else{p=n}}else{p=1}n=c[a+80>>2]|0;if((n|0)==0){l=p;i=d;return l|0}if((c[a+48>>2]|0)==0){l=p;i=d;return l|0}Ic[c[(c[n>>2]|0)+20>>2]&511](n,0);l=p;i=d;return l|0}c[k>>2]=Lc[c[(c[e>>2]|0)+16>>2]&255](e)|0;p=c[(c[j>>2]|0)+16>>2]|0;if((p|0)!=0?(c[f>>2]=39776,c[f+4>>2]=12,n=kI(p,f)|0,(n|0)!=0):0){f=u2a(28)|0;EI(f);c[a+44>>2]=f;rH(f,n,0,0,0)}n=c[(c[e>>2]|0)+20>>2]|0;f=c[k>>2]|0;p=c[a+8>>2]|0;m=c[a+12>>2]|0;o=c[j>>2]|0;j=vH(o)|0;q=sH(o)|0;o=a+44|0;r=c[o>>2]|0;if((r|0)==0){s=0;t=0}else{u=vH(r)|0;s=u;t=sH(r)|0}r=a+128|0;u=c[r>>2]|0;v=Lc[c[(c[u>>2]|0)+8>>2]&255](u)|0;u=Nc[n&7](e,f,p,m,j,q,s,t,v,c[(c[r>>2]|0)+24>>2]|0,b)|0;if((u|0)<0){v=c[r>>2]|0;if((v|0)!=0){Rc[c[(c[v>>2]|0)+4>>2]&1023](v)}c[r>>2]=0;r=c[o>>2]|0;if((r|0)!=0){FI(r);v2a(r)}c[o>>2]=0;Ic[c[(c[e>>2]|0)+32>>2]&511](e,c[k>>2]|0);c[k>>2]=0;l=0;i=d;return l|0}if((u|0)==3){l=2;i=d;return l|0}if((c[a+60>>2]|0)!=0){u=cO(a,b)|0;c[g>>2]=2;if((u|0)==2){l=2;i=d;return l|0}else{w=u}}else{w=1}u=c[a+80>>2]|0;if((u|0)==0){l=w;i=d;return l|0}if((c[a+48>>2]|0)==0){l=w;i=d;return l|0}Ic[c[(c[u>>2]|0)+20>>2]&511](u,0);l=w;i=d;return l|0}else if((h|0)==2){l=cO(a,b)|0;i=d;return l|0}else{l=0;i=d;return l|0}return 0}function WN(a){a=a|0;var b=0,d=0,e=0;b=i;FCa(a);c[a>>2]=39704;c[a+64>>2]=0;c[a+72>>2]=0;c[a+76>>2]=0;c[a+16>>2]=0;c[a+12>>2]=0;c[a+8>>2]=0;c[a+80>>2]=0;c[a+104>>2]=1;d=a+108|0;c[a+92>>2]=0;c[a+88>>2]=0;c[a+100>>2]=0;c[a+84>>2]=0;e=a+28|0;a=e+36|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(a|0));c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;c[d+24>>2]=0;i=b;return}function XN(a){a=a|0;var b=0;b=i;YN(a);v2a(a);i=b;return}function YN(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;c[a>>2]=39704;d=c[a+72>>2]|0;if((d|0)!=0){FI(d);v2a(d)}v2a(c[a+124>>2]|0);v2a(c[a+120>>2]|0);d=c[a+128>>2]|0;if((d|0)!=0){Rc[c[(c[d>>2]|0)+4>>2]&1023](d)}d=c[a+132>>2]|0;if((d|0)!=0){Rc[c[(c[d>>2]|0)+4>>2]&1023](d)}d=c[a+116>>2]|0;if((d|0)!=0){v2a(d)}d=c[a+80>>2]|0;if((d|0)!=0?(e=c[a+64>>2]|0,(e|0)!=0):0){f=IG(e)|0;bB(f,c[d+16>>2]|0)}d=a+40|0;f=c[d>>2]|0;if((f|0)!=0){e=Ht(c[(xt()|0)+4>>2]|0)|0;Ic[c[(c[e>>2]|0)+32>>2]&511](e,f);c[d>>2]=0}d=a+44|0;f=c[d>>2]|0;if((f|0)==0){c[d>>2]=0;HCa(a);i=b;return}FI(f);v2a(f);c[d>>2]=0;HCa(a);i=b;return}function ZN(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0.0,W=0,X=0,Y=0,Z=0.0,_=0;e=i;i=i+160|0;f=e+144|0;h=e+136|0;j=e+128|0;k=e+124|0;l=e+120|0;m=e+112|0;n=e+104|0;o=e+96|0;p=e+88|0;q=e+80|0;r=e+72|0;s=e+64|0;t=e+56|0;u=e+48|0;v=e+40|0;w=e+32|0;x=e+28|0;y=e+24|0;z=e+20|0;A=e+16|0;B=e+8|0;C=e;D=a+76|0;E=c[D>>2]|0;pe(f,39792);F=a+108|0;do{if((eI(E,f)|0)==0){if((c[F>>2]|0)==0){G=c[D>>2]|0;c[h>>2]=39808;c[h+4>>2]=10;if((nI(G,h)|0)==0){if((c[F>>2]|0)!=0){break}G=c[D>>2]|0;c[j>>2]=39824;c[j+4>>2]=6;H=$H(G,j)|0;if((H|0)==0){break}c[k>>2]=0;G=c[H>>2]|0;if((G|0)==4){dH(l,H);ika(k,l);dka(l);c[m>>2]=39760;c[m+4>>2]=9;if(!(vka(c[k>>2]|0,m)|0)){I=10}}else if(!((G|0)==5?(HH(n,H,(c[H+16>>2]|0)+ -1|0),c[o>>2]=39760,c[o+4>>2]=9,H=vka(c[n>>2]|0,o)|0,dka(n),H):0)){I=10}if((I|0)==10){dka(k);break}dka(k);J=1;i=e;return J|0}H=c[D>>2]|0;c[q>>2]=39808;c[q+4>>2]=10;G=$H(H,q)|0;if((G|0)==0){J=0;i=e;return J|0}H=IG(c[a+64>>2]|0)|0;if((b|0)==0){K=c[a+80>>2]|0}else{L=WA(H,G,b)|0;c[a+80>>2]=L;K=L}L=a+80|0;if((K|0)==0?(M=WA(H,G,d)|0,c[L>>2]=M,(M|0)==0):0){J=0;i=e;return J|0}M=c[D>>2]|0;c[r>>2]=39840;c[r+4>>2]=16;H=eI(M,r)|0;M=a+88|0;c[M>>2]=H;N=c[L>>2]|0;O=c[N+8>>2]|0;P=a+84|0;c[P>>2]=O;Q=c[N+12>>2]|0;N=a+92|0;c[N>>2]=Q;if((O|0)==7?(c[G>>2]|0)==4:0){dH(s,G);c[t>>2]=39864;c[t+4>>2]=10;G=c[s>>2]|0;do{if(!(vka(G,t)|0)){c[u>>2]=39880;c[u+4>>2]=9;if(vka(G,u)|0){c[N>>2]=3;break}c[v>>2]=39896;c[v+4>>2]=10;if(vka(G,v)|0){c[N>>2]=4}}else{c[N>>2]=1}}while(0);dka(s);R=c[N>>2]|0;S=c[M>>2]|0}else{R=Q;S=H}G=a+116|0;c[G>>2]=w2a(R,16)|0;if((S|0)==0){J=1;i=e;return J|0}O=(1<<S)+ -1|0;T=c[D>>2]|0;c[w>>2]=39832;c[w+4>>2]=6;U=jI(T,w)|0;T=(c[N>>2]|0)==0;if((U|0)==0){if(!T){V=+(O|0);W=0;do{X=c[L>>2]|0;Y=c[G>>2]|0;Fc[c[c[X>>2]>>2]&63](X,W,A,Y+(W<<4)|0,Y+(W<<4)+4|0);if((c[P>>2]|0)==10){g[(c[G>>2]|0)+(W<<4)+4>>2]=V}Y=c[G>>2]|0;X=Y+(W<<4)+4|0;g[X>>2]=(+g[X>>2]- +g[Y+(W<<4)>>2])/V;W=W+1|0}while(W>>>0<(c[N>>2]|0)>>>0)}}else{if(!T){V=+(O|0);W=a+104|0;H=0;do{Q=H<<1;Z=+DH(U,Q);g[(c[G>>2]|0)+(H<<4)>>2]=Z;Z=+DH(U,Q|1);Q=c[G>>2]|0;g[Q+(H<<4)+4>>2]=(Z- +g[Q+(H<<4)>>2])/V;Q=c[L>>2]|0;Fc[c[c[Q>>2]>>2]&63](Q,H,x,y,z);if((c[P>>2]|0)==10){g[z>>2]=V}if(!(!(+g[y>>2]!=+g[(c[G>>2]|0)+(H<<4)>>2])?!(+g[z>>2]!=Z):0)){c[W>>2]=0}H=H+1|0}while(H>>>0<(c[N>>2]|0)>>>0)}}H=c[D>>2]|0;c[B>>2]=39912;c[B+4>>2]=5;if((nI(H,B)|0)!=0){J=1;i=e;return J|0}H=c[D>>2]|0;c[C>>2]=39920;c[C+4>>2]=4;W=$H(H,C)|0;if((W|0)==0){J=1;i=e;return J|0}if((c[W>>2]|0)!=5){J=1;i=e;return J|0}H=c[N>>2]|0;if(!((H&2147483647|0)==0?1:(c[W+16>>2]|0)>>>0<H<<1>>>0)){H=0;do{P=JH(W,H)|0;L=H>>>1;U=c[G>>2]|0;if((H&1|0)==0){c[U+(L<<4)+8>>2]=P}else{c[U+(L<<4)+12>>2]=P}H=H+1|0}while(H>>>0<c[N>>2]<<1>>>0)}c[a+112>>2]=1;J=1;i=e;return J|0}}else{c[F>>2]=1}}while(0);c[F>>2]=1;c[a+92>>2]=1;c[a+88>>2]=1;F=c[D>>2]|0;c[p>>2]=39832;c[p+4>>2]=6;D=jI(F,p)|0;if((D|0)==0){_=1}else{_=(JH(D,0)|0)==0}c[a+104>>2]=_&1;J=1;i=e;return J|0}function _N(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;b=i;i=i+80|0;d=b+64|0;e=b+56|0;f=b+48|0;g=b+40|0;h=b+36|0;j=b+32|0;k=b+24|0;l=b+16|0;m=b+8|0;n=b;o=c[a+72>>2]|0;p=c[o+12>>2]|0;if(gl(p)|0){q=1;i=b;return q|0}r=vH(o)|0;s=sH(o)|0;t=c[o+16>>2]|0;c[d>>2]=39744;c[d+4>>2]=14;do{if(vka(p,d)|0){o=a+132|0;c[o>>2]=vG(r,s,c[a+8>>2]|0,c[a+12>>2]|0,t)|0;u=o}else{c[e>>2]=39928;c[e+4>>2]=9;if(vka(p,e)|0){o=Ft(c[(xt()|0)+4>>2]|0)|0;v=c[(c[o>>2]|0)+12>>2]|0;w=a+8|0;x=c[w>>2]|0;y=a+12|0;z=c[y>>2]|0;A=a+92|0;B=c[A>>2]|0;if((t|0)==0){C=1}else{pe(f,39944);C=fI(t,f,1)|0}D=Ec[v&15](o,r,s,x,z,B,C)|0;B=a+132|0;c[B>>2]=D;if((D|0)!=0){u=B;break}c[g>>2]=0;D=Ft(c[(xt()|0)+4>>2]|0)|0;if((Jc[c[(c[D>>2]|0)+16>>2]&3](D,r,s,w,y,h,j,g,0,0)|0)==0){u=B;break}D=c[h>>2]|0;c[A>>2]=D;c[a+88>>2]=c[j>>2];A=Ft(c[(xt()|0)+4>>2]|0)|0;c[B>>2]=Ec[c[(c[A>>2]|0)+12>>2]&15](A,r,s,c[w>>2]|0,c[y>>2]|0,D,c[g>>2]|0)|0;u=B;break}c[k>>2]=39960;c[k+4>>2]=11;if(vka(p,k)|0){B=a+132|0;c[B>>2]=wG(r,s,c[a+8>>2]|0,c[a+12>>2]|0,c[a+92>>2]|0,c[a+88>>2]|0,t)|0;u=B;break}c[l>>2]=39760;c[l+4>>2]=9;if(vka(p,l)|0){dO(a);q=(c[a+128>>2]|0)!=0&1;i=b;return q|0}c[m>>2]=39976;c[m+4>>2]=11;if(!(vka(p,m)|0)){c[n>>2]=39992;c[n+4>>2]=15;if(vka(p,n)|0){B=c[c[(xt()|0)+4>>2]>>2]|0;D=a+132|0;c[D>>2]=Ec[c[(c[B>>2]|0)+16>>2]&15](B,r,s,c[a+8>>2]|0,c[a+12>>2]|0,c[a+92>>2]|0,c[a+88>>2]|0)|0;u=D;break}else{u=a+132|0;break}}D=u2a(40)|0;ICa(D);B=a+128|0;c[B>>2]=D;if((JCa(D,c[a+8>>2]|0,c[a+12>>2]|0,(c[a+108>>2]|0)!=0?257:1,0)|0)!=0){c[a+52>>2]=1;q=2;i=b;return q|0}D=c[B>>2]|0;if((D|0)!=0){Rc[c[(c[D>>2]|0)+4>>2]&1023](D)}c[B>>2]=0;q=0;i=b;return q|0}}while(0);s=c[u>>2]|0;if((s|0)==0){q=0;i=b;return q|0}r=ca(c[a+92>>2]|0,c[a+8>>2]|0)|0;n=((ca(r,c[a+88>>2]|0)|0)+7|0)>>>3;a=Lc[c[(c[s>>2]|0)+24>>2]&255](s)|0;s=c[u>>2]|0;r=ca(Lc[c[(c[s>>2]|0)+32>>2]&255](s)|0,a)|0;a=c[u>>2]|0;q=(((ca(r,Lc[c[(c[a>>2]|0)+36>>2]&255](a)|0)|0)+7|0)/8|0|0)>=(n|0)&1;i=b;return q|0}function $N(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;b=i;i=i+112|0;d=b+92|0;e=b+88|0;f=b+84|0;h=b+80|0;j=b+12|0;k=b+8|0;l=b+4|0;m=b;n=a+88|0;o=a+92|0;p=ca(c[o>>2]|0,c[n>>2]|0)|0;if(p>>>0>8){i=b;return}q=a+80|0;r=c[q>>2]|0;if((r|0)==0){i=b;return}if((p|0)==1){if((c[a+104>>2]|0)!=0?((c[a+84>>2]|0)+ -1|0)>>>0<2:0){i=b;return}if((c[r+12>>2]|0)>3){i=b;return}p=a+116|0;s=+g[c[p>>2]>>2];g[d>>2]=s;t=d+8|0;g[t>>2]=s;u=d+4|0;g[u>>2]=s;g[e>>2]=0.0;g[f>>2]=0.0;g[h>>2]=0.0;ed[c[(c[r>>2]|0)+4>>2]&127](r,d,e,f,h)|0;v=Fla(+g[e>>2]*255.0)|0;w=Fla(+g[f>>2]*255.0)|0;x=v<<16|w<<8|(Fla(+g[h>>2]*255.0)|0)|-16777216;w=(c[p>>2]|0)+4|0;g[d>>2]=+g[w>>2]+ +g[d>>2];g[u>>2]=+g[w>>2]+ +g[u>>2];g[t>>2]=+g[w>>2]+ +g[t>>2];t=c[q>>2]|0;ed[c[(c[t>>2]|0)+4>>2]&127](t,d,e,f,h)|0;d=Fla(+g[e>>2]*255.0)|0;e=Fla(+g[f>>2]*255.0)|0;f=d<<16|e<<8|(Fla(+g[h>>2]*255.0)|0)|-16777216;if((x|0)==-16777216&(f|0)==-1){i=b;return}UCa(a,0,x);UCa(a,1,f);i=b;return}f=(r|0)==(Dz(1)|0);r=c[n>>2]|0;if(f&(r|0)==8){if((c[a+104>>2]|0)==0){y=8}else{i=b;return}}else{y=r}r=c[o>>2]|0;f=1<<(ca(r,y)|0);KA(j,r);r=j+64|0;y=c[r>>2]|0;x=(y|0)==0?j:y;if((f|0)>0){j=a+84|0;h=a+116|0;e=0;do{if((c[o>>2]|0)!=0){d=e;t=0;while(1){w=1<<c[n>>2];u=c[h>>2]|0;g[x+(t<<2)>>2]=+g[u+(t<<4)>>2]+ +((d|0)%(w|0)|0|0)*+g[u+(t<<4)+4>>2];t=t+1|0;z=c[o>>2]|0;if(!(t>>>0<z>>>0)){break}else{d=(d|0)/(w|0)|0}}g[k>>2]=0.0;g[l>>2]=0.0;g[m>>2]=0.0;if(((z|0)==1?(c[j>>2]|0)==7:0)?(d=c[q>>2]|0,t=c[d+12>>2]|0,(t|0)>1):0){w=w2a(t,4)|0;u=0;do{g[w+(u<<2)>>2]=+g[x>>2];u=u+1|0}while((u|0)!=(t|0));ed[c[(c[d>>2]|0)+4>>2]&127](d,w,k,l,m)|0;v2a(w)}else{A=22}}else{g[k>>2]=0.0;g[l>>2]=0.0;g[m>>2]=0.0;A=22}if((A|0)==22){A=0;t=c[q>>2]|0;ed[c[(c[t>>2]|0)+4>>2]&127](t,x,k,l,m)|0}t=Fla(+g[k>>2]*255.0)|0;u=Fla(+g[l>>2]*255.0)|0;UCa(a,e,t<<16|u<<8|(Fla(+g[m>>2]*255.0)|0)|-16777216);e=e+1|0}while((e|0)<(f|0));B=c[r>>2]|0}else{B=y}JA(B);i=b;return}function aO(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;do{if((c[a+108>>2]|0)==0){d=c[a+88>>2]|0;e=c[a+92>>2]|0;f=ca(e,d)|0;do{if((f|0)!=1){g=a+16|0;if(f>>>0<9){c[g>>2]=8;h=8;break}else{c[g>>2]=24;h=24;break}}else{c[a+16>>2]=1;h=1}}while(0);if((d|0)==0|(e|0)==0){j=0;i=b;return j|0}else{k=a+16|0;l=h;break}}else{f=a+16|0;c[f>>2]=1;c[a+88>>2]=1;c[a+92>>2]=1;c[a+20>>2]=1;k=f;l=1}}while(0);h=a+8|0;f=c[h>>2]|0;g=a+24|0;c[g>>2]=f;if(l>>>0>(2147483647/(f>>>0)|0)>>>0){j=0;i=b;return j|0}m=ca(l,f)|0;c[g>>2]=m;if(m>>>0>4294967264){j=0;i=b;return j|0}f=(m+31|0)>>>5<<2;c[g>>2]=f;c[a+120>>2]=w2a(f,1)|0;f=c[a+80>>2]|0;if((f|0)!=0?(c[a+48>>2]|0)!=0:0){Ic[c[(c[f>>2]|0)+20>>2]&511](f,1)}$N(a);if((c[a+112>>2]|0)==0){j=1;i=b;return j|0}c[k>>2]=32;c[a+20>>2]=2;k=c[h>>2]|0;c[g>>2]=k;if((2147483647/(k>>>0)|0)>>>0<32){j=0;i=b;return j|0}h=k<<2&536870908;c[g>>2]=h;c[a+124>>2]=w2a(h,1)|0;j=1;i=b;return j|0}function bO(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=i;i=i+48|0;d=b+32|0;e=b+24|0;f=b+16|0;h=b+12|0;j=b+8|0;k=b;l=a+36|0;c[l>>2]=-1;m=a+76|0;n=c[m>>2]|0;c[d>>2]=39912;c[d+4>>2]=5;o=kI(n,d)|0;d=a+56|0;c[d>>2]=o;if((o|0)==0){n=c[m>>2]|0;c[k>>2]=39920;c[k+4>>2]=4;m=$H(n,k)|0;c[d>>2]=m;if((m|0)==0){p=1;i=b;return p|0}if((c[m>>2]|0)!=7){p=1;i=b;return p|0}p=eO(a)|0;i=b;return p|0}m=lH(o)|0;c[e>>2]=40008;c[e+4>>2]=5;o=jI(m,e)|0;if(((o|0)!=0?(e=a+80|0,m=c[e>>2]|0,(m|0)!=0):0)?(d=a+92|0,k=c[d>>2]|0,!((c[m+12>>2]|0)>>>0>k>>>0)):0){n=w2a(k,4)|0;if((k|0)==0){q=m}else{m=0;do{g[n+(m<<2)>>2]=+DH(o,m);m=m+1|0}while(m>>>0<(c[d>>2]|0)>>>0);q=c[e>>2]|0}ed[c[(c[q>>2]|0)+4>>2]&127](q,n,f,h,j)|0;v2a(n);n=(Fla(+g[f>>2]*255.0)|0)<<16;f=(Fla(+g[h>>2]*255.0)|0)<<8|n;c[l>>2]=f|(Fla(+g[j>>2]*255.0)|0)}p=eO(a)|0;i=b;return p|0}function cO(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+32|0;f=c[e>>2]|0;if((f|0)==0){g=1;i=d;return g|0}h=VN(f,b)|0;if((h|0)==2){g=2;i=d;return g|0}b=c[a+80>>2]|0;if((b|0)!=0?(c[a+48>>2]|0)!=0:0){Ic[c[(c[b>>2]|0)+20>>2]&511](b,0)}if((h|0)!=0){g=1;i=d;return g|0}h=c[e>>2]|0;if((h|0)!=0){Rc[c[(c[h>>2]|0)+4>>2]&1023](h)}c[e>>2]=0;g=0;i=d;return g|0}function dO(b){b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;e=i;i=i+16|0;f=e+12|0;g=e+8|0;h=e+4|0;j=e;k=Gt(c[(xt()|0)+4>>2]|0)|0;if((k|0)==0){i=e;return}l=c[(c[k>>2]|0)+8>>2]|0;m=c[b+72>>2]|0;n=vH(m)|0;o=sH(m)|0;m=b+80|0;p=id[l&511](k,n,o,(c[m>>2]|0)!=0&1)|0;if((p|0)==0){i=e;return}c[f>>2]=0;c[g>>2]=0;c[h>>2]=0;c[j>>2]=0;Tc[c[(c[k>>2]|0)+12>>2]&31](k,p,f,g,h,j);if((c[f>>2]|0)>=(c[b+8>>2]|0)?(c[g>>2]|0)>=(c[b+12>>2]|0):0){o=c[m>>2]|0;if((o|0)!=0){n=c[h>>2]|0;if((n|0)!=(c[o+12>>2]|0)){i=e;return}if((o|0)==(Dz(2)|0)){c[m>>2]=0;q=1;r=0;s=n}else{q=0;r=0;s=n}}else{n=c[j>>2]|0;j=(n|0)==0?c[h>>2]|0:n;if((j|0)!=3){if((j|0)==4){c[m>>2]=Dz(3)|0;t=0;u=0}else{t=0;u=1}}else{t=1;u=1}c[b+92>>2]=j;q=t;r=u;s=j}if((s|0)!=1){if((s|0)>=4){if((s|0)==4){v=32}else{c[f>>2]=(((ca(c[f>>2]|0,s)|0)+2|0)>>>0)/3|0;v=24}}else{v=24}}else{v=8}j=u2a(40)|0;ICa(j);u=b+128|0;c[u>>2]=j;t=(JCa(j,c[f>>2]|0,c[g>>2]|0,v,0)|0)==0;v=c[u>>2]|0;if(t){if((v|0)!=0){Rc[c[(c[v>>2]|0)+4>>2]&1023](v)}c[u>>2]=0;i=e;return}WCa(v,-1);v=w2a(s,1)|0;if((s|0)>0){t=0;do{a[v+t>>0]=t;t=t+1|0}while((t|0)!=(s|0))}if((q|0)!=0){a[v>>0]=2;a[v+2>>0]=0}q=c[(c[k>>2]|0)+16>>2]|0;s=c[u>>2]|0;t=Lc[c[(c[s>>2]|0)+8>>2]&255](s)|0;if((Wc[q&31](k,p,t,c[(c[u>>2]|0)+24>>2]|0,r,v)|0)==0){r=c[u>>2]|0;if((r|0)!=0){Rc[c[(c[r>>2]|0)+4>>2]&1023](r)}c[u>>2]=0;i=e;return}v2a(v);Ic[c[(c[k>>2]|0)+20>>2]&511](k,p);v=c[m>>2]|0;if((((v|0)!=0?(c[v+8>>2]|0)==10:0)?(v=c[b+88>>2]|0,v>>>0<8):0)?(m=8-v|0,(c[g>>2]|0)!=0):0){v=0;do{r=c[u>>2]|0;t=dd[c[(c[r>>2]|0)+12>>2]&511](r,v)|0;if((c[f>>2]|0)!=0){r=0;q=t;while(1){a[q>>0]=(d[q>>0]|0)>>>m;r=r+1|0;if(!(r>>>0<(c[f>>2]|0)>>>0)){break}else{q=q+1|0}}}v=v+1|0}while(v>>>0<(c[g>>2]|0)>>>0)}c[b+88>>2]=8;i=e;return}Ic[c[(c[k>>2]|0)+20>>2]&511](k,p);i=e;return}function eO(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=u2a(136)|0;WN(d);e=a+32|0;c[e>>2]=d;f=SN(d,c[a+64>>2]|0,c[a+56>>2]|0,0,0,0,1,0,0)|0;if((f|0)==0){d=c[e>>2]|0;if((d|0)!=0){Rc[c[(c[d>>2]|0)+4>>2]&1023](d)}c[e>>2]=0;g=1;i=b;return g|0}else if((f|0)==2){f=a+52|0;if((c[f>>2]|0)!=0){g=2;i=b;return g|0}c[f>>2]=2;g=2;i=b;return g|0}else{g=1;i=b;return g|0}return 0}function fO(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;d=i;i=i+112|0;e=d+104|0;f=d+96|0;g=d+88|0;h=d+80|0;j=d+72|0;k=d+64|0;l=d+56|0;m=d+48|0;n=d+40|0;o=d+32|0;p=d+24|0;q=d+16|0;r=d+8|0;s=d;if((a|0)==0){t=b;i=d;return t|0}c[e>>2]=39824;c[e+4>>2]=6;u=$H(a,e)|0;if((u|0)==0){t=b;i=d;return t|0}e=c[u>>2]|0;if((e|0)==5){a=u+16|0;HH(l,u,(c[a>>2]|0)+ -1|0);c[m>>2]=40016;c[m+4>>2]=14;if(vka(c[l>>2]|0,m)|0){v=1}else{HH(n,u,(c[a>>2]|0)+ -1|0);c[o>>2]=39976;c[o+4>>2]=11;m=vka(c[n>>2]|0,o)|0;dka(n);v=m?1:b}dka(l);HH(p,u,(c[a>>2]|0)+ -1|0);c[q>>2]=39992;c[q+4>>2]=15;if(vka(c[p>>2]|0,q)|0){w=8;dka(p);i=d;return w|0}HH(r,u,(c[a>>2]|0)+ -1|0);c[s>>2]=39928;c[s+4>>2]=9;a=vka(c[r>>2]|0,s)|0;dka(r);w=a?8:v;dka(p);i=d;return w|0}else if((e|0)==4){dH(f,u);c[g>>2]=39744;c[g+4>>2]=14;u=c[f>>2]|0;if(!(vka(u,g)|0)?(c[h>>2]=39976,c[h+4>>2]=11,!(vka(u,h)|0)):0){x=b}else{x=1}c[j>>2]=39992;c[j+4>>2]=15;if(!(vka(u,j)|0)?(c[k>>2]=39928,c[k+4>>2]=9,!(vka(u,k)|0)):0){y=x}else{y=8}dka(f);t=y;i=d;return t|0}else{t=b;i=d;return t|0}return 0}function gO(b,e,f){b=b|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0,R=0.0,S=0.0,T=0.0,U=0.0;h=i;i=i+80|0;j=h+12|0;k=h+8|0;l=h+4|0;m=h;n=b+88|0;o=c[n>>2]|0;p=(1<<o)+ -1|0;do{if((c[b+104>>2]|0)!=0){q=c[b+84>>2]|0;if(!((q|0)==5|(q|0)==2)){if((o|0)!=8){break}r=c[b+80>>2]|0;if((c[b+92>>2]|0)!=(c[r+12>>2]|0)){i=h;return}s=c[b+8>>2]|0;if((c[b+100>>2]|0)==0){t=0}else{t=(q|0)==3?(c[b+96>>2]|0)==3:0}ad[c[(c[r>>2]|0)+12>>2]&15](r,e,f,s,s,c[b+12>>2]|0,t&1);i=h;return}if((o|0)==8){s=b+8|0;if((c[s>>2]|0)>0){u=e;v=0;w=f}else{i=h;return}while(1){a[u>>0]=a[w+2>>0]|0;a[u+1>>0]=a[w+1>>0]|0;a[u+2>>0]=a[w>>0]|0;v=v+1|0;if((v|0)>=(c[s>>2]|0)){break}else{u=u+3|0;w=w+3|0}}i=h;return}else if((o|0)==16){s=b+8|0;if((c[s>>2]|0)>0){x=e;y=0;z=f}else{i=h;return}while(1){a[x>>0]=a[z+4>>0]|0;a[x+1>>0]=a[z+2>>0]|0;a[x+2>>0]=a[z>>0]|0;y=y+1|0;if((y|0)>=(c[s>>2]|0)){break}else{x=x+3|0;z=z+6|0}}i=h;return}else{s=fO(c[b+76>>2]|0,o)|0;r=b+8|0;if((c[r>>2]|0)>0){A=0;B=0;C=0}else{i=h;return}while(1){q=hO(f,C,s)|0;D=C+s|0;E=hO(f,D,s)|0;F=D+s|0;D=hO(f,F,s)|0;if((q|0)>(p|0)){G=p}else{G=(q|0)<0?0:q}if((E|0)>(p|0)){H=p}else{H=(E|0)<0?0:E}if((D|0)>(p|0)){I=p}else{I=(D|0)<0?0:D}a[e+B>>0]=(I*255|0)/(p|0)|0;a[e+(B+1)>>0]=(H*255|0)/(p|0)|0;a[e+(B+2)>>0]=(G*255|0)/(p|0)|0;A=A+1|0;if((A|0)>=(c[r>>2]|0)){break}else{B=B+3|0;C=F+s|0}}i=h;return}}}while(0);C=b+92|0;KA(j,c[C>>2]|0);B=j+64|0;A=c[B>>2]|0;p=(A|0)==0?j:A;g[k>>2]=0.0;g[l>>2]=0.0;g[m>>2]=0.0;A=c[n>>2]|0;if((A|0)==8){n=b+8|0;if((c[n>>2]|0)>0){j=b+100|0;G=b+80|0;H=b+96|0;I=b+84|0;o=p+12|0;z=p+4|0;x=p+8|0;y=b+116|0;w=0;u=0;v=0;while(1){if((c[C>>2]|0)==0){J=v}else{t=0;s=v;while(1){r=s+1|0;F=c[y>>2]|0;g[p+(t<<2)>>2]=+g[F+(t<<4)>>2]+ +(d[f+s>>0]|0|0)*+g[F+(t<<4)+4>>2];t=t+1|0;if(!(t>>>0<(c[C>>2]|0)>>>0)){J=r;break}else{s=r}}}if(((c[j>>2]|0)!=0?(c[H>>2]|0)==3:0)?(c[I>>2]|0)==3:0){K=1.0- +g[o>>2];L=K*(1.0- +g[p>>2]);g[k>>2]=L;g[l>>2]=K*(1.0- +g[z>>2]);g[m>>2]=K*(1.0- +g[x>>2]);M=L}else{s=c[G>>2]|0;ed[c[(c[s>>2]|0)+4>>2]&127](s,p,k,l,m)|0;M=+g[k>>2]}if(M>1.0){N=1.0}else{N=M<0.0?0.0:M}g[k>>2]=N;L=+g[l>>2];if(L>1.0){O=1.0}else{O=L<0.0?0.0:L}g[l>>2]=O;L=+g[m>>2];if(L>1.0){P=1.0}else{P=L<0.0?0.0:L}g[m>>2]=P;a[e+u>>0]=~~(P*255.0);a[e+(u+1)>>0]=~~(O*255.0);a[e+(u+2)>>0]=~~(N*255.0);w=w+1|0;if((w|0)>=(c[n>>2]|0)){break}else{u=u+3|0;v=J}}}}else{J=fO(c[b+76>>2]|0,A)|0;A=b+8|0;if((c[A>>2]|0)>0){v=b+100|0;u=b+80|0;n=b+96|0;w=b+84|0;G=p+12|0;x=p+4|0;z=p+8|0;o=b+116|0;b=0;I=0;H=0;while(1){if((c[C>>2]|0)==0){Q=H}else{j=0;y=H;while(1){s=hO(f,y,J)|0;t=c[o>>2]|0;g[p+(j<<2)>>2]=+g[t+(j<<4)>>2]+ +(s|0)*+g[t+(j<<4)+4>>2];t=y+J|0;j=j+1|0;if(!(j>>>0<(c[C>>2]|0)>>>0)){Q=t;break}else{y=t}}}if(((c[v>>2]|0)!=0?(c[n>>2]|0)==3:0)?(c[w>>2]|0)==3:0){N=1.0- +g[G>>2];O=N*(1.0- +g[p>>2]);g[k>>2]=O;g[l>>2]=N*(1.0- +g[x>>2]);g[m>>2]=N*(1.0- +g[z>>2]);R=O}else{y=c[u>>2]|0;ed[c[(c[y>>2]|0)+4>>2]&127](y,p,k,l,m)|0;R=+g[k>>2]}if(R>1.0){S=1.0}else{S=R<0.0?0.0:R}g[k>>2]=S;O=+g[l>>2];if(O>1.0){T=1.0}else{T=O<0.0?0.0:O}g[l>>2]=T;O=+g[m>>2];if(O>1.0){U=1.0}else{U=O<0.0?0.0:O}g[m>>2]=U;a[e+I>>0]=~~(U*255.0);a[e+(I+1)>>0]=~~(T*255.0);a[e+(I+2)>>0]=~~(S*255.0);b=b+1|0;if((b|0)>=(c[A>>2]|0)){break}else{I=I+3|0;H=Q}}}}JA(c[B>>2]|0);i=h;return}function hO(a,b,c){a=a|0;b=b|0;c=c|0;var e=0,f=0,g=0;e=(b|0)/8|0;f=d[a+e>>0]|0;switch(c|0){case 4:{g=(b&7|0)!=0?f&15:f>>>4;break};case 1:{g=f>>>(7-((b|0)%8|0)|0)&1;break};case 2:{g=f>>>(6-((b|0)%8|0)|0)&3;break};case 16:{g=d[a+(e+1)>>0]|0|f<<8;break};case 8:{g=f;break};default:{g=0}}return g|0}function iO(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+128>>2]|0;if((d|0)==0){e=0;i=b;return e|0}e=Lc[c[(c[d>>2]|0)+8>>2]&255](d)|0;i=b;return e|0}function jO(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;f=i;g=b+8|0;h=b+88|0;j=ca(c[h>>2]|0,c[g>>2]|0)|0;k=b+92|0;l=((ca(j,c[k>>2]|0)|0)+7|0)>>>3;j=c[b+128>>2]|0;do{if((j|0)==0){m=c[b+132>>2]|0;if((m|0)!=0){n=dd[c[(c[m>>2]|0)+16>>2]&511](m,e)|0;o=7;break}m=c[b+72>>2]|0;if(!((sH(m)|0)>>>0<(ca(l,e+1|0)|0)>>>0)){n=(vH(m)|0)+(ca(l,e)|0)|0;o=7}}else{m=c[j+12>>2]|0;n=dd[c[(c[j>>2]|0)+12>>2]&511](j,(m|0)>(e|0)?e:m+ -1|0)|0;o=7}}while(0);if((o|0)==7?(n|0)!=0:0){e=c[h>>2]|0;j=c[k>>2]|0;m=ca(j,e)|0;if((m|0)==1){if((c[b+108>>2]|0)!=0?(c[b+104>>2]|0)!=0:0){p=b+120|0;if((l|0)==0){q=p}else{r=0;do{a[(c[p>>2]|0)+r>>0]=(d[n+r>>0]|0)^255;r=r+1|0}while(r>>>0<l>>>0);q=p}}else{o=16}do{if((o|0)==16){if((c[b+112>>2]|0)==0){p=b+120|0;c3a(c[p>>2]|0,n|0,l|0)|0;q=p;break}p=c[b+28>>2]|0;if((p|0)==0){s=-16777216;t=-1}else{s=c[p>>2]|0;t=c[p+4>>2]|0}p=c[b+116>>2]|0;r=(c[p+8>>2]|0)==0?0:s;u=(c[p+12>>2]|0)==1?0:t;p=b+124|0;if((c[g>>2]|0)>0){v=0;w=c[p>>2]|0;while(1){c[w>>2]=(1<<7-((v|0)%8|0)&(d[n+((v|0)/8|0)>>0]|0)|0)==0?r:u;v=v+1|0;if((v|0)>=(c[g>>2]|0)){break}else{w=w+4|0}}}x=c[p>>2]|0;i=f;return x|0}}while(0);x=c[q>>2]|0;i=f;return x|0}if(!(m>>>0<9)){m=b+112|0;do{if((c[m>>2]|0)!=0){q=c[b+124>>2]|0;if(!((j|0)==3&(e|0)==8)){f3a(q|0,-1,c[b+24>>2]|0)|0;break}if((c[g>>2]|0)>0){t=b+116|0;s=0;do{o=s*3|0;w=d[n+o>>0]|0;v=c[t>>2]|0;if(((((w|0)>=(c[v+8>>2]|0)?(w|0)<=(c[v+12>>2]|0):0)?(w=d[n+(o+1)>>0]|0,(w|0)>=(c[v+24>>2]|0)):0)?(w|0)<=(c[v+28>>2]|0):0)?(w=d[n+(o+2)>>0]|0,(w|0)>=(c[v+40>>2]|0)):0){y=((w|0)>(c[v+44>>2]|0))<<31>>31}else{y=-1}a[q+(s<<2|3)>>0]=y;s=s+1|0}while((s|0)<(c[g>>2]|0))}}}while(0);if((c[b+80>>2]|0)==0){z=n}else{y=b+120|0;gO(b,c[y>>2]|0,n);z=c[y>>2]|0}if((c[m>>2]|0)==0){x=z;i=f;return x|0}m=b+124|0;if((c[g>>2]|0)>0){y=0;s=c[m>>2]|0;q=z;while(1){a[s>>0]=a[q>>0]|0;a[s+1>>0]=a[q+1>>0]|0;a[s+2>>0]=a[q+2>>0]|0;y=y+1|0;if((y|0)>=(c[g>>2]|0)){break}else{s=s+4|0;q=q+3|0}}}x=c[m>>2]|0;i=f;return x|0}a:do{if((e|0)!=8){if((c[g>>2]|0)>0){m=b+120|0;q=j;s=0;y=0;while(1){if((q|0)==0){A=0;B=y}else{z=c[h>>2]|0;t=ca(z,q>>>0>1?q:1)|0;p=0;v=0;w=y;while(1){v=(hO(n,w,z)|0)<<(ca(z,p)|0)|v;p=p+1|0;if(!(p>>>0<q>>>0)){break}else{w=z+w|0}}A=v&255;B=y+t|0}a[(c[m>>2]|0)+s>>0]=A;w=s+1|0;if((w|0)>=(c[g>>2]|0)){break a}q=c[k>>2]|0;s=w;y=B}}}else{c3a(c[b+120>>2]|0,n|0,l|0)|0}}while(0);if((c[b+112>>2]|0)==0){x=c[b+120>>2]|0;i=f;return x|0}l=b+124|0;if((c[g>>2]|0)>0){n=b+28|0;B=b+116|0;k=0;A=c[l>>2]|0;h=c[b+120>>2]|0;while(1){j=a[h>>0]|0;e=c[n>>2]|0;if((e|0)==0){a[A>>0]=j;a[A+1>>0]=j;a[A+2>>0]=j;C=j&255}else{y=j&255;a[A>>0]=c[e+(y<<2)>>2];a[A+1>>0]=(c[(c[n>>2]|0)+(y<<2)>>2]|0)>>>8;a[A+2>>0]=(c[(c[n>>2]|0)+(y<<2)>>2]|0)>>>16;C=y}y=c[B>>2]|0;if((C|0)<(c[y+8>>2]|0)){D=-1}else{D=((C|0)>(c[y+12>>2]|0))<<31>>31}a[A+3>>0]=D;k=k+1|0;if((k|0)>=(c[g>>2]|0)){break}else{A=A+4|0;h=h+1|0}}}x=c[l>>2]|0;i=f;return x|0}l=c[b+124>>2]|0;if((l|0)==0){E=c[b+120>>2]|0}else{E=l}f3a(E|0,-1,c[b+24>>2]|0)|0;x=E;i=f;return x|0}function kO(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=c[a+132>>2]|0;if((f|0)==0){g=0;i=e;return g|0}g=Qc[c[(c[f>>2]|0)+20>>2]&255](f,b,d)|0;i=e;return g|0}function lO(b,e,f,h,j,k,l,m){b=b|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0.0,X=0.0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0;n=i;i=i+144|0;o=n;p=n+132|0;q=fO(c[b+76>>2]|0,c[b+88>>2]|0)|0;r=c[b+8>>2]|0;s=ca(r,q)|0;t=b+92|0;u=((ca(s,c[t>>2]|0)|0)+7|0)>>>3;s=c[b+128>>2]|0;do{if((s|0)==0){v=c[b+132>>2]|0;if((v|0)!=0){w=dd[c[(c[v>>2]|0)+16>>2]&511](v,e)|0;x=8;break}v=c[b+72>>2]|0;if((sH(v)|0)>>>0<(ca(u,e+1|0)|0)>>>0){y=(h|0)/8|0;break}else{w=(vH(v)|0)+(ca(u,e)|0)|0;x=8;break}}else{w=dd[c[(c[s>>2]|0)+12>>2]&511](s,e)|0;x=8}}while(0);if((x|0)==8){x=(ca(c[t>>2]|0,q)|0)>>>3;e=(h|0)/8|0;if((w|0)==0){y=e}else{tO(o,x);s=c[t>>2]|0;u=ca(s,q)|0;a:do{if((u|0)==1){do{if((c[b+108>>2]|0)==0){if((c[b+112>>2]|0)==0){if((h+ -8|0)>>>0<8){z=0;A=-1;break}v=c[b+28>>2]|0;if((v|0)==0){z=0;A=-1;break}z=c[v>>2]|0;A=c[v+4>>2]|0;break}v=c[b+28>>2]|0;if((v|0)==0){B=-16777216;C=-1}else{B=c[v>>2]|0;C=c[v+4>>2]|0}v=c[b+116>>2]|0;D=(c[v+8>>2]|0)==0?0:B;E=(c[v+12>>2]|0)==1?0:C;if((m|0)<=0){break a}v=(k|0)==0;F=r+ -1|0;H=0;while(1){I=((ca(H+l|0,r)|0)>>>0)/(j>>>0)|0;J=((v?I:F-I|0)>>>0)%(r>>>0)|0;c[f+(H<<2)>>2]=(1<<(J&7^7)&(d[w+(J>>>3)>>0]|0)|0)==0?D:E;H=H+1|0;if((H|0)==(m|0)){break a}}}else{H=(c[b+104>>2]|0)==0;z=(H^1)<<31>>31;A=H<<31>>31}}while(0);if((m|0)>0){H=(k|0)==0;E=(h+ -8|0)>>>0<8;D=z&255;F=(h+ -24|0)>>>0<8;v=z>>>8&255;J=z>>>16&255;I=A&255;K=A>>>8&255;L=A>>>16&255;M=r+ -1|0;N=0;do{O=((ca(N+l|0,r)|0)>>>0)/(j>>>0)|0;P=((H?O:M-O|0)>>>0)%(r>>>0)|0;O=ca(N,e)|0;Q=f+O|0;do{if((1<<(P&7^7)&(d[w+(P>>>3)>>0]|0)|0)==0){if(E){a[Q>>0]=D;break}if(F){a[Q>>0]=D;a[f+(O+1)>>0]=v;a[f+(O+2)>>0]=J;break}else{c[Q>>2]=z;break}}else{if(E){a[Q>>0]=I;break}if(F){a[Q>>0]=I;a[f+(O+1)>>0]=K;a[f+(O+2)>>0]=L;break}else{c[Q>>2]=A;break}}}while(0);N=N+1|0}while((N|0)!=(m|0))}}else{if(u>>>0<9){if(q>>>0<8){N=b+120|0;b:do{if((r|0)!=0){L=s;K=0;I=0;while(1){if((L|0)==0){R=0;S=I}else{F=ca(q,L>>>0>1?L:1)|0;E=0;J=0;v=I;while(1){J=(hO(w,v,q)|0)<<(ca(E,q)|0)|J;E=E+1|0;if(!(E>>>0<L>>>0)){break}else{v=v+q|0}}R=J&255;S=I+F|0}a[(c[N>>2]|0)+K>>0]=R;v=K+1|0;if((v|0)==(r|0)){break b}L=c[t>>2]|0;K=v;I=S}}}while(0);T=c[N>>2]|0}else{T=w}I=(m|0)>0;if((c[b+112>>2]|0)==0){if(!I){break}K=(k|0)==0;L=(h+ -8|0)>>>0<8;v=b+28|0;E=r+ -1|0;D=0;while(1){M=((ca(D+l|0,r)|0)>>>0)/(j>>>0)|0;H=a[T+(((K?M:E-M|0)>>>0)%(r>>>0)|0)>>0]|0;if(L){a[f+D>>0]=H}else{M=ca(D,e)|0;Q=c[(c[v>>2]|0)+((H&255)<<2)>>2]|0;a[f+M>>0]=Q;a[f+(M+1)>>0]=Q>>>8;a[f+(M+2)>>0]=Q>>>16}D=D+1|0;if((D|0)==(m|0)){break a}}}if(!I){break}D=(k|0)==0;v=b+28|0;L=b+116|0;E=r+ -1|0;K=0;while(1){N=((ca(K+l|0,r)|0)>>>0)/(j>>>0)|0;Q=K<<2;M=f+Q|0;H=a[T+(((D?N:E-N|0)>>>0)%(r>>>0)|0)>>0]|0;N=c[v>>2]|0;if((N|0)==0){O=Q|1;a[M>>0]=H;a[f+O>>0]=H;a[f+(O+1)>>0]=H;U=H&255}else{O=H&255;H=Q|1;a[M>>0]=c[N+(O<<2)>>2];a[f+H>>0]=(c[(c[v>>2]|0)+(O<<2)>>2]|0)>>>8;a[f+(H+1)>>0]=(c[(c[v>>2]|0)+(O<<2)>>2]|0)>>>16;U=O}O=c[L>>2]|0;if((U|0)<(c[O+8>>2]|0)){V=-1}else{V=((U|0)>(c[O+12>>2]|0))<<31>>31}a[f+(Q|3)>>0]=V;K=K+1|0;if((K|0)==(m|0)){break a}}}W=+(q>>>0)*+(s>>>0)*.125;X=255.0/+((1<<q)+ -1|0);if((m|0)>0){K=(k|0)==0;L=((j|0)<0)<<31>>31;v=(q&7|0)==0;E=(h+ -32|0)>>>0<8;D=b+80|0;I=b+112|0;Q=(q|0)==8;O=b+116|0;H=b+104|0;N=p+2|0;M=p+1|0;P=q>>>0<8;Y=o+128|0;Z=b+100|0;_=b+96|0;$=b+84|0;aa=(x|0)==0;ba=j+ -1|0;da=0;ea=0;fa=-1;while(1){ga=da+l|0;ha=K?ga:ba-ga|0;ga=o3a(ha|0,((ha|0)<0)<<31>>31|0,r|0,0)|0;ha=m3a(ga|0,G|0,j|0,L|0)|0;ga=(ha>>>0)%(r>>>0)|0;if(v){ia=ca(ga,x)|0}else{ia=~~(W*+(ga>>>0))}ha=w+ia|0;ja=ca(da,e)|0;ka=f+ja|0;if((ga|0)!=(fa|0)){la=c[D>>2]|0;if((la|0)==0){ma=(d[w+(ia+1)>>0]|0)<<8|(d[w+(ia+2)>>0]|0)<<16|(d[ha>>0]|0)}else{do{if((c[H>>2]|0)==0){if(aa){na=la}else{oa=0;do{pa=c[O>>2]|0;qa=~~((+g[pa+(oa<<4)>>2]+ +g[pa+(oa<<4)+4>>2]*+(d[w+(oa+ia)>>0]|0))*255.0+.5);if((qa|0)>255){ra=-1}else{ra=(qa|0)<0?0:qa&255}qa=c[Y>>2]|0;a[((qa|0)==0?o:qa)+oa>>0]=ra;oa=oa+1|0}while((oa|0)<(x|0));na=c[D>>2]|0}oa=c[(c[na>>2]|0)+12>>2]|0;F=c[Y>>2]|0;J=(F|0)==0?o:F;if((c[Z>>2]|0)!=0?(c[_>>2]|0)==3:0){sa=(c[$>>2]|0)==3}else{sa=0}ad[oa&15](na,p,J,1,0,0,sa&1)}else{if(!P){J=c[(c[la>>2]|0)+12>>2]|0;if((c[Z>>2]|0)!=0?(c[_>>2]|0)==3:0){ta=(c[$>>2]|0)==3}else{ta=0}ad[J&15](la,p,ha,1,0,0,ta&1);break}if((c[t>>2]|0)==0){ua=la}else{J=0;oa=ga<<2&4;while(1){F=~~(X*+((hO(ha,oa,q)|0)>>>0))&255;qa=c[Y>>2]|0;a[((qa|0)==0?o:qa)+J>>0]=F;J=J+1|0;if(!(J>>>0<(c[t>>2]|0)>>>0)){break}else{oa=oa+q|0}}ua=c[D>>2]|0}oa=c[(c[ua>>2]|0)+12>>2]|0;J=c[Y>>2]|0;F=(J|0)==0?o:J;if((c[Z>>2]|0)!=0?(c[_>>2]|0)==3:0){va=(c[$>>2]|0)==3}else{va=0}ad[oa&15](ua,p,F,1,0,0,va&1)}}while(0);ma=(d[M>>0]|0)<<8|(d[N>>0]|0)<<16|(d[p>>0]|0)}if((c[I>>2]|0)==0){wa=ma|-16777216;xa=ga}else{if((((((c[t>>2]|0)==3&Q?(la=d[ha>>0]|0,F=c[O>>2]|0,(la|0)>=(c[F+8>>2]|0)):0)?(la|0)<=(c[F+12>>2]|0):0)?(la=d[w+(ia+1)>>0]|0,(la|0)>=(c[F+24>>2]|0)):0)?(la|0)<=(c[F+28>>2]|0):0)?(la=d[w+(ia+2)>>0]|0,(la|0)>=(c[F+40>>2]|0)):0){ya=(la|0)>(c[F+44>>2]|0)?-16777216:0}else{ya=-16777216}wa=ya|ma&16777215;xa=ga}}else{wa=ea;xa=fa}if(E){c[ka>>2]=wa}else{a[ka>>0]=wa;a[f+(ja+1)>>0]=wa>>>8;a[f+(ja+2)>>0]=wa>>>16}da=da+1|0;if((da|0)>=(m|0)){break}else{ea=wa;fa=xa}}}}}while(0);v2a(c[o+128>>2]|0);i=n;return}}f3a(f|0,-1,ca(y,m)|0)|0;i=n;return}function mO(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=a+132|0;g=c[f>>2]|0;if((g|0)==0){i=e;return}ld[c[(c[g>>2]|0)+12>>2]&255](g,b,d);d=c[f>>2]|0;c[a+8>>2]=Lc[c[(c[d>>2]|0)+24>>2]&255](d)|0;d=c[f>>2]|0;c[a+12>>2]=Lc[c[(c[d>>2]|0)+28>>2]&255](d)|0;i=e;return}function nO(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;return}function oO(a,b,d,e,f,g,h,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0;m=i;c[a>>2]=b;c[a+4>>2]=e;b=a+8|0;c[b>>2]=d;c[a+12>>2]=k;c[a+16>>2]=l;l=c[d+52>>2]|0;if((e|0)==0){d=RN(l,c[j+40>>2]|0,c[j+44>>2]|0,f,g,h)|0;if((d|0)!=0){n=d;i=m;return n|0}c[(c[a>>2]|0)+12>>2]=0;d=c[(c[b>>2]|0)+52>>2]|0;k=c[d>>2]|0;c[d>>2]=0;c[c[a>>2]>>2]=k;k=(c[(c[b>>2]|0)+52>>2]|0)+4|0;d=c[k>>2]|0;c[k>>2]=0;c[(c[a>>2]|0)+4>>2]=d;c[(c[a>>2]|0)+8>>2]=c[(c[(c[b>>2]|0)+52>>2]|0)+8>>2];n=0;i=m;return n|0}else{b=_M(e,c[l+12>>2]|0,f,g,h,j)|0;if((b|0)!=0){n=b;i=m;return n|0}c[(c[a>>2]|0)+12>>2]=1;b=e+28|0;e=eN(c[b>>2]|0)|0;c[c[a>>2]>>2]=e;e=fN(c[b>>2]|0)|0;c[(c[a>>2]|0)+4>>2]=e;c[(c[a>>2]|0)+8>>2]=c[(c[b>>2]|0)+12>>2];n=0;i=m;return n|0}return 0}function pO(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=a+4|0;f=c[e>>2]|0;if((f|0)==0){g=a+8|0;h=UN(c[(c[g>>2]|0)+52>>2]|0,b)|0;if((h|0)!=0){j=h;i=d;return j|0}c[(c[a>>2]|0)+12>>2]=0;h=c[(c[g>>2]|0)+52>>2]|0;k=c[h>>2]|0;c[h>>2]=0;c[c[a>>2]>>2]=k;k=(c[(c[g>>2]|0)+52>>2]|0)+4|0;h=c[k>>2]|0;c[k>>2]=0;c[(c[a>>2]|0)+4>>2]=h;c[(c[a>>2]|0)+8>>2]=c[(c[(c[g>>2]|0)+52>>2]|0)+8>>2];j=0;i=d;return j|0}else{g=aN(f,b)|0;if((g|0)!=0){j=g;i=d;return j|0}c[(c[a>>2]|0)+12>>2]=1;g=eN(c[(c[e>>2]|0)+28>>2]|0)|0;c[c[a>>2]>>2]=g;g=fN(c[(c[e>>2]|0)+28>>2]|0)|0;c[(c[a>>2]|0)+4>>2]=g;c[(c[a>>2]|0)+8>>2]=c[(c[(c[e>>2]|0)+28>>2]|0)+12>>2];j=0;i=d;return j|0}return 0}function qO(a,b,d,e,f,g,h,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0;m=i;c[a+16>>2]=k;c[a+20>>2]=l;n=u2a(20)|0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;o=oO(n,a,b,d,f,g,h,j,k,l)|0;c[e>>2]=n;i=m;return o|0}function rO(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=pO(a,b)|0;i=c;return d|0}function sO(a){a=a|0;var b=0,d=0;b=i;if((c[a+12>>2]|0)!=0){i=b;return}d=c[a>>2]|0;if((d|0)!=0){Rc[c[(c[d>>2]|0)+4>>2]&1023](d);c[a>>2]=0}d=c[a+4>>2]|0;if((d|0)==0){i=b;return}Rc[c[(c[d>>2]|0)+4>>2]&1023](d);i=b;return}function tO(b,d){b=b|0;d=d|0;var e=0,f=0;e=i;f=b+128|0;c[f>>2]=0;if((d|0)>128){c[f>>2]=w2a(d,1)|0;i=e;return}else{d=b+0|0;b=d+128|0;do{a[d>>0]=0;d=d+1|0}while((d|0)<(b|0));i=e;return}}function uO(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=+d;e=+e;f=f|0;var h=0,j=0,k=0.0;h=i;do{if(c==e){j=0}else{k=+(a|0);if(c<e){if(k<c|k>e){j=0;break}}else{if(k<e|k>c){j=0;break}}g[f>>2]=(k-c)*(d-b)/(e-c)+b;j=1}}while(0);i=h;return j|0}function vO(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0.0,pa=0,qa=0,ra=0.0,sa=0.0,ta=0.0,ua=0.0,va=0.0,wa=0.0,xa=0.0,ya=0.0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0.0,Ga=0.0,Ha=0.0,Ia=0.0,Ja=0.0,Ka=0.0,La=0.0,Ma=0.0,Na=0.0,Oa=0.0,Pa=0,Qa=0,Ra=0.0,Sa=0.0,Ta=0.0,Ua=0.0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0.0,ab=0.0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0;j=i;i=i+2224|0;k=j+2152|0;l=j+1128|0;m=j+968|0;n=j+908|0;o=j+752|0;p=j;q=j+728|0;r=j+720|0;s=j+712|0;t=j+704|0;u=j+700|0;v=j+696|0;w=j+692|0;x=j+688|0;y=j+684|0;z=j+680|0;A=j+672|0;B=j+664|0;C=j+656|0;D=j+632|0;E=j+624|0;F=j+620|0;G=j+616|0;H=j+612|0;I=j+608|0;J=j+604|0;K=j+600|0;L=j+548|0;M=j+472|0;N=j+448|0;O=j+440|0;P=j+436|0;Q=j+432|0;R=j+416|0;T=j+384|0;U=j+352|0;V=j+320|0;W=j+288|0;X=j+280|0;Y=j+272|0;Z=j+264|0;_=j+260|0;$=j+256|0;aa=j+248|0;ba=j+232|0;da=j+224|0;ea=j+208|0;fa=j+152|0;ga=j+128|0;ha=b+80|0;ia=c[b+96>>2]|0;ja=b+64|0;ka=lH(c[ja>>2]|0)|0;la=c[b+76>>2]|0;if((la|0)==0){i=j;return}if((((c[b+68>>2]|0)==0?(ma=lH(c[ja>>2]|0)|0,c[X>>2]=40032,c[X+4>>2]=10,(nI(ma,X)|0)!=0):0)?(X=lH(c[ja>>2]|0)|0,c[Y>>2]=40032,c[Y+4>>2]=10,ma=jI(X,Y)|0,(ma|0)!=0):0)?(Y=la+12|0,X=c[Y>>2]|0,!((c[ma+16>>2]|0)>>>0<X>>>0)):0){KA(k,X);X=k+64|0;if((c[Y>>2]|0)>0){na=0;do{oa=+DH(ma,na);pa=c[X>>2]|0;g[((pa|0)==0?k:pa)+(na<<2)>>2]=oa;na=na+1|0}while((na|0)<(c[Y>>2]|0))}g[Z>>2]=0.0;g[_>>2]=0.0;g[$>>2]=0.0;Y=c[X>>2]|0;ed[c[(c[la>>2]|0)+4>>2]&127](la,(Y|0)==0?k:Y,Z,_,$)|0;Y=~~(+g[Z>>2]*255.0)<<16|~~(+g[_>>2]*255.0)<<8|~~(+g[$>>2]*255.0)|-16777216;JA(c[X>>2]|0);qa=Y}else{qa=0}c[aa>>2]=1293296;c[aa+4>>2]=4;if((nI(ka,aa)|0)!=0){c[da>>2]=1293296;c[da+4>>2]=4;lI(ba,ka,da);Kla(ba,d);Mla(ea,ba);Ela(e,ea)}FM(fa);HM(fa,c[a+64>>2]|0,c[a+76>>2]|0,e,c[a+108>>2]|0);c[ga+0>>2]=c[d+0>>2];c[ga+4>>2]=c[d+4>>2];c[ga+8>>2]=c[d+8>>2];c[ga+12>>2]=c[d+12>>2];c[ga+16>>2]=c[d+16>>2];c[ga+20>>2]=c[d+20>>2];Wla(ga,fa+32|0);d=fa+28|0;e=c[d>>2]|0;if((Lc[c[(c[e>>2]|0)+8>>2]&255](e)|0)!=0){WCa(e,qa);qa=c[a+16>>2]|0;ea=c[b+72>>2]|0;switch(ea|0){case 3:{c[p>>2]=40064;c[p+4>>2]=6;ba=jI(ka,p)|0;if((ba|0)!=0){oa=+DH(ba,0);ra=+DH(ba,1);sa=+DH(ba,2);ta=+DH(ba,3);ua=+DH(ba,4);va=+DH(ba,5);g[q+12>>2]=1.0;g[q>>2]=1.0;g[q+20>>2]=0.0;g[q+16>>2]=0.0;g[q+8>>2]=0.0;g[q+4>>2]=0.0;Ula(q,ga);c[r>>2]=40072;c[r+4>>2]=6;ba=jI(ka,r)|0;if((ba|0)==0){wa=1.0;xa=0.0}else{ya=+DH(ba,0);wa=+DH(ba,1);xa=ya}c[s>>2]=40080;c[s+4>>2]=6;ba=jI(ka,s)|0;if((ba|0)==0){za=0;Aa=0}else{da=JH(ba,0)|0;za=JH(ba,1)|0;Aa=da}da=(ia|0)>0;if(da){ba=0;aa=0;while(1){Y=c[b+(ba<<2)+80>>2]|0;if((Y|0)==0){Ba=aa}else{Ba=(c[Y+8>>2]|0)+aa|0}ba=ba+1|0;if((ba|0)==(ia|0)){Ca=Ba;break}else{aa=Ba}}}else{Ca=0}Ba=c[la+12>>2]|0;aa=(Ba|0)>(Ca|0)?Ba:Ca;KA(k,aa);Ca=k+64|0;Ba=c[Ca>>2]|0;ba=(Ba|0)==0?k:Ba;f3a(ba|0,0,aa<<2|0)|0;ya=wa-xa;aa=f<<24;Ba=0;do{g[t>>2]=xa+ya*+(Ba|0)*.00390625;if(da){Y=0;X=0;while(1){$=c[b+(Y<<2)+80>>2]|0;if(($|0)!=0?(gC($,t,1,ba+(X<<2)|0,u)|0)!=0:0){Da=(c[u>>2]|0)+X|0}else{Da=X}Y=Y+1|0;if((Y|0)>=(ia|0)){break}else{X=Da}}}ed[c[(c[la>>2]|0)+4>>2]&127](la,ba,v,w,x)|0;X=Fla(+g[v>>2]*255.0)|0;Y=Fla(+g[w>>2]*255.0)|0;c[l+(Ba<<2)>>2]=X<<16|aa|Y<<8|(Fla(+g[x>>2]*255.0)|0);Ba=Ba+1|0}while((Ba|0)<256);ya=oa-ta;xa=ra-ua;wa=ya*ya+xa*xa;xa=sa-va;ya=wa-xa*xa;Ba=c[e+8>>2]|0;x=c[e+12>>2]|0;aa=c[e+24>>2]|0;if(sa>va?+(~~+S(+wa)|0)<xa:0){Ea=1}else{Ea=0}if((x|0)>0){ba=(Ba|0)>0;xa=ta-oa;ta=ua-ra;ua=va-sa;va=sa*ua;wa=sa*sa;Da=ya==0.0;da=(Aa|0)==0;Aa=(za|0)==0;za=ya>0.0;Fa=ya*2.0;Y=(Ea|0)==0;Ea=Aa^1;X=0;do{$=(Lc[c[(c[e>>2]|0)+8>>2]&255](e)|0)+(ca(X,aa)|0)|0;if(ba){Ga=+(X|0);_=0;do{g[y>>2]=+(_|0);g[z>>2]=Ga;fma(q,y,z);Ha=+g[y>>2]-oa;Ia=+g[z>>2]-ra;Ja=(va+(xa*Ha+ta*Ia))*-2.0;Ka=Ha*Ha+Ia*Ia-wa;if(!Da){Ia=Ja*Ja-ya*Ka*4.0;if(!(Ia<0.0)){Ha=+S(+Ia);Ia=(-Ja-Ha)/Fa;La=(Ha-Ja)/Fa;Ha=za?Ia:La;Ma=za?La:Ia;if(Y){Na=!(Ma<=1.0)&Aa?Ha:Ma}else{Na=!(Ha>=0.0)&da?Ma:Ha}if(!(sa+ua*Na<0.0)){Oa=Na;Pa=91}}}else{Oa=-Ka/Ja;Pa=91}do{if((Pa|0)==91){Pa=0;Z=~~(Oa*255.0);if((Z|0)<0){if(da){break}else{Qa=0}}else{na=(Z|0)<256;if(na|Ea){Qa=na?Z:255}else{break}}c[$+(_<<2)>>2]=c[l+(Qa<<2)>>2]}}while(0);_=_+1|0}while((_|0)<(Ba|0))}X=X+1|0}while((X|0)<(x|0))}JA(c[Ca>>2]|0)}break};case 1:{c[k>>2]=40072;c[k+4>>2]=6;Ca=jI(ka,k)|0;if((Ca|0)==0){Ra=1.0;Sa=0.0;Ta=1.0;Ua=0.0}else{Oa=+DH(Ca,0);Na=+DH(Ca,1);ua=+DH(Ca,2);Ra=Na;Sa=Oa;Ta=+DH(Ca,3);Ua=ua}c[m>>2]=1293304;c[m+4>>2]=6;mI(l,ka,m);g[n+12>>2]=1.0;g[n>>2]=1.0;g[n+20>>2]=0.0;g[n+16>>2]=0.0;g[n+8>>2]=0.0;g[n+4>>2]=0.0;g[o+12>>2]=1.0;g[o>>2]=1.0;g[o+20>>2]=0.0;g[o+16>>2]=0.0;g[o+8>>2]=0.0;g[o+4>>2]=0.0;Ula(n,ga);Ula(o,l);Wla(n,o);Ca=c[e+8>>2]|0;x=c[e+12>>2]|0;X=c[e+24>>2]|0;Ba=(ia|0)>0;if(Ba){Qa=0;Ea=0;while(1){da=c[b+(Qa<<2)+80>>2]|0;if((da|0)==0){Va=Ea}else{Va=(c[da+8>>2]|0)+Ea|0}Qa=Qa+1|0;if((Qa|0)==(ia|0)){Wa=Va;break}else{Ea=Va}}}else{Wa=0}Va=c[la+12>>2]|0;Ea=(Va|0)>(Wa|0)?Va:Wa;KA(p,Ea);Wa=p+64|0;Va=c[Wa>>2]|0;Qa=(Va|0)==0?p:Va;f3a(Qa|0,0,Ea<<2|0)|0;if((x|0)>0){Ea=(Ca|0)>0;Va=s+4|0;da=f<<24;Aa=0;do{Y=(Lc[c[(c[e>>2]|0)+8>>2]&255](e)|0)+(ca(Aa,X)|0)|0;if(Ea){ua=+(Aa|0);za=0;do{g[q>>2]=+(za|0);g[r>>2]=ua;fma(n,q,r);Oa=+g[q>>2];if(!(Oa<Sa|Oa>Ra)?(Na=+g[r>>2],!(Na<Ua|Na>Ta)):0){g[s>>2]=Oa;g[Va>>2]=Na;if(Ba){Da=0;z=0;while(1){y=c[b+(Da<<2)+80>>2]|0;do{if((y|0)==0){Xa=z}else{if((gC(y,s,2,Qa+(z<<2)|0,t)|0)==0){Xa=z;break}Xa=(c[t>>2]|0)+z|0}}while(0);Da=Da+1|0;if((Da|0)>=(ia|0)){break}else{z=Xa}}}ed[c[(c[la>>2]|0)+4>>2]&127](la,Qa,u,v,w)|0;c[Y+(za<<2)>>2]=~~(+g[u>>2]*255.0)<<16|da|~~(+g[v>>2]*255.0)<<8|~~(+g[w>>2]*255.0)}za=za+1|0}while((za|0)<(Ca|0))}Aa=Aa+1|0}while((Aa|0)<(x|0))}JA(c[Wa>>2]|0);break};case 4:{Wa=c[ja>>2]|0;if((c[Wa>>2]|0)==7){x=m+116|0;EI(x);a:do{if((jG(m,Wa,ha,ia,la)|0)!=0){Ya=n+0|0;Za=Ya+60|0;do{c[Ya>>2]=0;Ya=Ya+4|0}while((Ya|0)<(Za|0));Aa=m+144|0;Ca=m+148|0;w=n+20|0;v=n+40|0;while(1){if(!((c[Aa>>2]|0)>>>0<(c[Ca>>2]|0)>>>0)){break a}da=nG(m,o,ga)|0;if((da|0)==0){c[n+0>>2]=c[o+0>>2];c[n+4>>2]=c[o+4>>2];c[n+8>>2]=c[o+8>>2];c[n+12>>2]=c[o+12>>2];c[n+16>>2]=c[o+16>>2];u=1;do{nG(m,n+(u*20|0)|0,ga)|0;u=u+1|0}while((u|0)<3)}else if((da|0)==1){c[n+0>>2]=c[w+0>>2];c[n+4>>2]=c[w+4>>2];c[n+8>>2]=c[w+8>>2];c[n+12>>2]=c[w+12>>2];c[n+16>>2]=c[w+16>>2];Pa=106}else{Pa=106}if((Pa|0)==106){Pa=0;c[w+0>>2]=c[v+0>>2];c[w+4>>2]=c[v+4>>2];c[w+8>>2]=c[v+8>>2];c[w+12>>2]=c[v+12>>2];c[w+16>>2]=c[v+16>>2];c[v+0>>2]=c[o+0>>2];c[v+4>>2]=c[o+4>>2];c[v+8>>2]=c[o+8>>2];c[v+12>>2]=c[o+12>>2];c[v+16>>2]=c[o+16>>2]}UO(e,f,n)}}}while(0);FI(x)}break};case 5:{x=c[ja>>2]|0;if((c[x>>2]|0)==7?(Wa=c[x+12>>2]|0,pe(k,40048),v=eI(Wa,k)|0,(v|0)>=2):0){Wa=l+116|0;EI(Wa);do{if((jG(l,x,ha,ia,la)|0)!=0){w=w2a(v<<1,20)|0;if((oG(l,w,v,ga)|0)==0){v2a(w);break}Ca=(v|0)>1;Aa=n+20|0;u=n+40|0;Qa=0;b:while(1){Xa=ca(Qa,v)|0;t=1-Qa|0;s=ca(t,v)|0;if((oG(l,w+(s*20|0)|0,v,ga)|0)==0){break}if(Ca){_a=1}else{Qa=t;continue}while(1){Ba=w+((_a+Xa|0)*20|0)|0;c[n+0>>2]=c[Ba+0>>2];c[n+4>>2]=c[Ba+4>>2];c[n+8>>2]=c[Ba+8>>2];c[n+12>>2]=c[Ba+12>>2];c[n+16>>2]=c[Ba+16>>2];Ba=_a+ -1|0;Va=w+((Ba+s|0)*20|0)|0;c[Aa+0>>2]=c[Va+0>>2];c[Aa+4>>2]=c[Va+4>>2];c[Aa+8>>2]=c[Va+8>>2];c[Aa+12>>2]=c[Va+12>>2];c[Aa+16>>2]=c[Va+16>>2];Va=w+((Ba+Xa|0)*20|0)|0;c[u+0>>2]=c[Va+0>>2];c[u+4>>2]=c[Va+4>>2];c[u+8>>2]=c[Va+8>>2];c[u+12>>2]=c[Va+12>>2];c[u+16>>2]=c[Va+16>>2];UO(e,f,n);Va=w+((_a+s|0)*20|0)|0;c[u+0>>2]=c[Va+0>>2];c[u+4>>2]=c[Va+4>>2];c[u+8>>2]=c[Va+8>>2];c[u+12>>2]=c[Va+12>>2];c[u+16>>2]=c[Va+16>>2];UO(e,f,n);Va=_a+1|0;if((Va|0)<(v|0)){_a=Va}else{Qa=t;continue b}}}v2a(w)}}while(0);FI(Wa)}break};case 2:{c[A>>2]=40064;c[A+4>>2]=6;Wa=jI(ka,A)|0;if((Wa|0)!=0){Ta=+DH(Wa,0);Ua=+DH(Wa,1);Ra=+DH(Wa,2);Sa=+DH(Wa,3);c[B>>2]=40072;c[B+4>>2]=6;Wa=jI(ka,B)|0;if((Wa|0)==0){$a=1.0;ab=0.0}else{ua=+DH(Wa,0);$a=+DH(Wa,1);ab=ua}c[C>>2]=40080;c[C+4>>2]=6;Wa=jI(ka,C)|0;if((Wa|0)==0){bb=0;cb=0}else{C=JH(Wa,0)|0;bb=JH(Wa,1)|0;cb=C}C=c[e+8>>2]|0;Wa=c[e+12>>2]|0;ua=Ra-Ta;Ra=Sa-Ua;Sa=ua*ua+Ra*Ra;g[D+12>>2]=1.0;g[D>>2]=1.0;g[D+20>>2]=0.0;g[D+16>>2]=0.0;g[D+8>>2]=0.0;g[D+4>>2]=0.0;Ula(D,ga);ka=(ia|0)>0;if(ka){B=0;A=0;while(1){_a=c[b+(B<<2)+80>>2]|0;if((_a|0)==0){db=A}else{db=(c[_a+8>>2]|0)+A|0}B=B+1|0;if((B|0)==(ia|0)){eb=db;break}else{A=db}}}else{eb=0}db=c[la+12>>2]|0;A=(db|0)>(eb|0)?db:eb;KA(k,A);eb=k+64|0;db=c[eb>>2]|0;B=(db|0)==0?k:db;f3a(B|0,0,A<<2|0)|0;Na=$a-ab;A=f<<24;db=0;do{g[E>>2]=ab+Na*+(db|0)*.00390625;if(ka){_a=0;v=0;while(1){x=c[b+(_a<<2)+80>>2]|0;if((x|0)!=0?(c[F>>2]=0,(gC(x,E,1,B+(v<<2)|0,F)|0)!=0):0){fb=(c[F>>2]|0)+v|0}else{fb=v}_a=_a+1|0;if((_a|0)>=(ia|0)){break}else{v=fb}}}g[G>>2]=0.0;g[H>>2]=0.0;g[I>>2]=0.0;ed[c[(c[la>>2]|0)+4>>2]&127](la,B,G,H,I)|0;v=Fla(+g[G>>2]*255.0)|0;_a=Fla(+g[H>>2]*255.0)|0;c[l+(db<<2)>>2]=v<<16|A|_a<<8|(Fla(+g[I>>2]*255.0)|0);db=db+1|0}while((db|0)<256);db=c[e+24>>2]|0;if((Wa|0)>0){I=(C|0)>0;A=(cb|0)==0;cb=(bb|0)!=0;bb=0;do{H=(Lc[c[(c[e>>2]|0)+8>>2]&255](e)|0)+(ca(bb,db)|0)|0;if(I){Na=+(bb|0);G=0;do{g[J>>2]=+(G|0);g[K>>2]=Na;fma(D,J,K);B=~~((ua*(+g[J>>2]-Ta)+Ra*(+g[K>>2]-Ua))/Sa*255.0);if((B|0)<0){if(!A){gb=0;Pa=57}}else{fb=(B|0)<256;if(fb|cb){gb=fb?B:255;Pa=57}}if((Pa|0)==57){Pa=0;c[H+(G<<2)>>2]=c[l+(gb<<2)>>2]}G=G+1|0}while((G|0)<(C|0))}bb=bb+1|0}while((bb|0)<(Wa|0))}JA(c[eb>>2]|0)}break};case 7:case 6:{eb=c[ja>>2]|0;if((c[eb>>2]|0)==7){Kxa(L);Lxa(L,e,0,0);ja=o+116|0;EI(ja);if((jG(o,eb,ha,ia,la)|0)!=0){Ya=M+0|0;Za=Ya+48|0;do{c[Ya>>2]=0;Ya=Ya+4|0}while((Ya|0)<(Za|0));Ya=M+52|0;OIa(Ya);c[M+72>>2]=f;c[M+64>>2]=L;c[M+68>>2]=qa;QIa(Ya,13);Ya=M+56|0;qa=c[Ya>>2]|0;c[qa+8>>2]=6;f=1;do{c[qa+(f*12|0)+8>>2]=4;f=f+1|0}while((f|0)!=13);f=0;do{g[p+(f<<3)>>2]=0.0;g[p+(f<<3)+4>>2]=0.0;f=f+1|0}while((f|0)!=16);f=(ea|0)!=6?16:12;ea=o+144|0;qa=o+148|0;if((c[ea>>2]|0)>>>0<(c[qa>>2]|0)>>>0){Za=R+4|0;la=e+8|0;ia=R+12|0;ha=R+8|0;eb=e+12|0;Wa=p+4|0;bb=p+88|0;C=p+92|0;gb=p+80|0;Pa=p+84|0;cb=p+72|0;A=p+76|0;K=p+24|0;J=p+28|0;D=p+32|0;I=p+36|0;db=p+40|0;G=p+44|0;H=p+48|0;B=p+52|0;fb=p+8|0;F=p+12|0;E=p+16|0;b=p+20|0;ka=p+64|0;_a=p+68|0;v=p+56|0;w=p+60|0;x=N+12|0;Qa=p+8|0;u=p+16|0;Aa=p+24|0;do{Ca=kG(o)|0;if((Ca|0)==0){hb=0;ib=0}else{t=Ca*3|0;s=p+(((t>>>0)%12|0)<<3)|0;Xa=c[s+4>>2]|0;da=p+((((t+1|0)>>>0)%12|0)<<3)|0;Va=c[da>>2]|0;Ba=c[da+4>>2]|0;da=p+((((t+2|0)>>>0)%12|0)<<3)|0;r=c[da>>2]|0;q=c[da+4>>2]|0;da=p+((((t+3|0)>>>0)%12|0)<<3)|0;t=c[da>>2]|0;Ea=c[da+4>>2]|0;da=p;c[da>>2]=c[s>>2];c[da+4>>2]=Xa;Xa=Qa;c[Xa>>2]=Va;c[Xa+4>>2]=Ba;Ba=u;c[Ba>>2]=r;c[Ba+4>>2]=q;q=Aa;c[q>>2]=t;c[q+4>>2]=Ea;Ea=M+(Ca*12|0)|0;c[N+0>>2]=c[Ea+0>>2];c[N+4>>2]=c[Ea+4>>2];c[N+8>>2]=c[Ea+8>>2];Ea=M+((Ca+1&3)*12|0)|0;c[x+0>>2]=c[Ea+0>>2];c[x+4>>2]=c[Ea+4>>2];c[x+8>>2]=c[Ea+8>>2];c[M+0>>2]=c[N+0>>2];c[M+4>>2]=c[N+4>>2];c[M+8>>2]=c[N+8>>2];c[M+12>>2]=c[N+12>>2];c[M+16>>2]=c[N+16>>2];c[M+20>>2]=c[N+20>>2];hb=2;ib=4}Ea=ib;do{Ca=p+(Ea<<3)|0;q=p+(Ea<<3)+4|0;lG(o,Ca,q);fma(ga,Ca,q);Ea=Ea+1|0}while((Ea|0)<(f|0));jb=hb;do{g[O>>2]=0.0;g[P>>2]=0.0;g[Q>>2]=0.0;mG(o,O,P,Q);c[M+(jb*12|0)>>2]=~~(+g[O>>2]*255.0);c[M+(jb*12|0)+4>>2]=~~(+g[P>>2]*255.0);c[M+(jb*12|0)+8>>2]=~~(+g[Q>>2]*255.0);jb=jb+1|0}while((jb|0)<4);Sla(R,p,f);if(((!(+g[Za>>2]<=0.0)?!(+g[R>>2]>=+(c[la>>2]|0)):0)?!(+g[ia>>2]<=0.0):0)?!(+g[ha>>2]>=+(c[eb>>2]|0)):0){DO(T,+g[p>>2],+g[Wa>>2],+g[bb>>2],+g[C>>2],+g[gb>>2],+g[Pa>>2],+g[cb>>2],+g[A>>2]);DO(U,+g[K>>2],+g[J>>2],+g[D>>2],+g[I>>2],+g[db>>2],+g[G>>2],+g[H>>2],+g[B>>2]);DO(V,+g[p>>2],+g[Wa>>2],+g[fb>>2],+g[F>>2],+g[E>>2],+g[b>>2],+g[K>>2],+g[J>>2]);DO(W,+g[cb>>2],+g[A>>2],+g[ka>>2],+g[_a>>2],+g[v>>2],+g[w>>2],+g[H>>2],+g[B>>2]);c[n+0>>2]=c[T+0>>2];c[n+4>>2]=c[T+4>>2];c[n+8>>2]=c[T+8>>2];c[n+12>>2]=c[T+12>>2];c[n+16>>2]=c[T+16>>2];c[n+20>>2]=c[T+20>>2];c[n+24>>2]=c[T+24>>2];c[n+28>>2]=c[T+28>>2];c[m+0>>2]=c[U+0>>2];c[m+4>>2]=c[U+4>>2];c[m+8>>2]=c[U+8>>2];c[m+12>>2]=c[U+12>>2];c[m+16>>2]=c[U+16>>2];c[m+20>>2]=c[U+20>>2];c[m+24>>2]=c[U+24>>2];c[m+28>>2]=c[U+28>>2];c[l+0>>2]=c[V+0>>2];c[l+4>>2]=c[V+4>>2];c[l+8>>2]=c[V+8>>2];c[l+12>>2]=c[V+12>>2];c[l+16>>2]=c[V+16>>2];c[l+20>>2]=c[V+20>>2];c[l+24>>2]=c[V+24>>2];c[l+28>>2]=c[V+28>>2];c[k+0>>2]=c[W+0>>2];c[k+4>>2]=c[W+4>>2];c[k+8>>2]=c[W+8>>2];c[k+12>>2]=c[W+12>>2];c[k+16>>2]=c[W+16>>2];c[k+20>>2]=c[W+20>>2];c[k+24>>2]=c[W+24>>2];c[k+28>>2]=c[W+28>>2];EO(M,1,1,0,0,n,m,l,k)}}while((c[ea>>2]|0)>>>0<(c[qa>>2]|0)>>>0)}PIa(c[Ya>>2]|0)}FI(ja);Oxa(L)}break};default:{}}if((h|0)!=0){_Ca(e,1,e)|0}if((c[a+4>>2]|0)==1){dDa(e,c[a+12>>2]|0,c[a+8>>2]|0)}IM(fa)}GM(c[d>>2]|0);i=j;return}function wO(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;i=i+64|0;h=g+40|0;j=g+24|0;k=g;if((iG(b)|0)==0){i=g;return}l=a+76|0;LGa(c[(c[l>>2]|0)+44>>2]|0);m=c[d+28>>2]|0;if((m|0)==2){if((lM(a,d,e,f)|0)==0){MGa(c[l>>2]|0,0);i=g;return}}else if((m|0)==3){ly(h,d,e);TGa(c[l>>2]|0,h)}else{i=g;return}if((_L(a,d,e,j)|0)==0){h=b+12|0;c[k+0>>2]=c[h+0>>2];c[k+4>>2]=c[h+4>>2];c[k+8>>2]=c[h+8>>2];c[k+12>>2]=c[h+12>>2];c[k+16>>2]=c[h+16>>2];c[k+20>>2]=c[h+20>>2];Wla(k,e);dM(c[(c[l>>2]|0)+44>>2]|0,k);e=xO(c[d+24>>2]|0,f)|0;vO(a,b,k,j,e,(c[a+4>>2]|0)==3&1);MGa(c[l>>2]|0,0);i=g;return}else{MGa(c[l>>2]|0,0);i=g;return}}function xO(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;if((a|0)==0){d=255;i=c;return d|0}d=Fla(+g[((b|0)==0?a+52|0:a+48|0)>>2]*255.0)|0;i=c;return d|0}function yO(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+64|0;f=e+40|0;g=e+24|0;h=e;ly(f,b,d);j=(c[a+76>>2]|0)+28|0;c[g+0>>2]=c[j+0>>2];c[g+4>>2]=c[j+4>>2];c[g+8>>2]=c[j+8>>2];c[g+12>>2]=c[j+12>>2];Ela(f,g);if((c[f+8>>2]|0)<=(c[f>>2]|0)){i=e;return}if((c[f+12>>2]|0)<=(c[f+4>>2]|0)){i=e;return}g=b+56|0;c[h+0>>2]=c[g+0>>2];c[h+4>>2]=c[g+4>>2];c[h+8>>2]=c[g+8>>2];c[h+12>>2]=c[g+12>>2];c[h+16>>2]=c[g+16>>2];c[h+20>>2]=c[g+20>>2];Wla(h,d);d=c[b+52>>2]|0;g=xO(c[b+24>>2]|0,0)|0;vO(a,d,h,f,g,(c[a+4>>2]|0)==3&1);i=e;return}function zO(a,b,e,f,h){a=a|0;b=b|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0.0,I=0,J=0.0,K=0,L=0,M=0,N=0,O=0,P=0,S=0.0,T=0,U=0,V=0.0,W=0.0,X=0,Y=0,Z=0,_=0,$=0,aa=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0;j=i;i=i+384|0;k=j+360|0;l=j+344|0;m=j+320|0;n=j+296|0;o=j+280|0;p=j+256|0;q=j+240|0;r=j+232|0;s=j+228|0;t=j+224|0;u=j+200|0;v=j+8|0;w=j+4|0;x=j;if((dG(b)|0)==0){i=j;return}y=a+76|0;LGa(c[(c[y>>2]|0)+44>>2]|0);z=c[e+28>>2]|0;if((z|0)==2){if((lM(a,e,f,h)|0)==0){MGa(c[y>>2]|0,0);i=j;return}}else if((z|0)==3){ly(k,e,f);TGa(c[y>>2]|0,k)}else{i=j;return}k=c[y>>2]|0;z=k+28|0;c[l+0>>2]=c[z+0>>2];c[l+4>>2]=c[z+4>>2];c[l+8>>2]=c[z+8>>2];c[l+12>>2]=c[z+12>>2];z=l+8|0;A=c[z>>2]|0;B=c[l>>2]|0;if((A|0)>(B|0)?(C=l+12|0,D=c[C>>2]|0,E=l+4|0,F=c[E>>2]|0,(D|0)>(F|0)):0){PGa(m,c[k+44>>2]|0);G=+R(+(+g[m>>2]));H=+R(+(+g[m+12>>2]));c[z>>2]=~~+ba(+(G*+(A-B|0)))+B;c[C>>2]=~~+ba(+(H*+(D-F|0)))+F;F=b+12|0;c[n+0>>2]=c[F+0>>2];c[n+4>>2]=c[F+4>>2];c[n+8>>2]=c[F+8>>2];c[n+12>>2]=c[F+12>>2];c[n+16>>2]=c[F+16>>2];c[n+20>>2]=c[F+20>>2];Wla(n,f);dM(c[(c[y>>2]|0)+44>>2]|0,n);F=b+68|0;D=b+76|0;do{if(((+g[F>>2]==0.0?+g[D>>2]==0.0:0)?+g[b+72>>2]==+g[b+84>>2]:0)?+g[b+80>>2]==+g[b+88>>2]:0){if((_la(n)|0)==0?(Zla(n)|0)==0:0){I=0;break}I=1}else{I=0}}while(0);c[o+0>>2]=c[F+0>>2];c[o+4>>2]=c[F+4>>2];c[o+8>>2]=c[F+8>>2];c[o+12>>2]=c[F+12>>2];rm(n,o);H=+g[o>>2];B=~~+ba(+(+g[o+4>>2]-H));G=+g[o+8>>2];A=~~+ba(+(+g[o+12>>2]-G));o=(B|0)==0?1:B;B=(A|0)==0?1:A;g[p+12>>2]=1.0;g[p>>2]=1.0;g[p+20>>2]=0.0;g[p+16>>2]=0.0;g[p+8>>2]=0.0;g[p+4>>2]=0.0;Ula(p,n);Gla(q,l);Kla(q,p);p=b+84|0;J=+g[p>>2];A=~~+ba(+((+g[q>>2]- +g[b+72>>2])/J));m=~~+Q(+((+g[q+4>>2]- +g[F>>2])/J));F=b+88|0;J=+g[F>>2];K=~~+ba(+((+g[q+8>>2]- +g[b+80>>2])/J));L=~~+Q(+((+g[q+12>>2]- +g[D>>2])/J));D=c[z>>2]|0;z=c[l>>2]|0;l=D-z|0;if(((o|0)<=(l|0)?(q=c[C>>2]|0,C=c[E>>2]|0,E=q-C|0,(B|0)<=(E|0)):0)?(M=ca(B,o)|0,(M|0)<=(ca(E,l)|0)):0){N=(I|0)!=0;I=n+16|0;if(N){J=+g[I>>2];O=Fla(J)|0;P=n+20|0;S=+g[P>>2];T=Fla(S)|0;U=P;V=J;W=S;X=(((D|0)<=(O|0))<<31>>31)+((D-O|0)/(o|0)|0)|0;Y=(((q|0)<=(T|0))<<31>>31)+((q-T|0)/(B|0)|0)|0;Z=(((z|0)<(O|0))<<31>>31)+((z-O|0)/(o|0)|0)|0;_=(((C|0)<(T|0))<<31>>31)+((C-T|0)/(B|0)|0)|0}else{T=n+20|0;U=T;V=+g[I>>2];W=+g[T>>2];X=m;Y=L;Z=A;_=K}S=H-V;V=G-W;T=c[a+64>>2]|0;O=c[T>>2]|0;q=c[T+8>>2]|0;T=c[a+16>>2]|0;if((M|0)<16){M=AO(O,q,b,f,8,8,T)|0;D=zDa(M,o,B,0,0)|0;if((M|0)==0){$=D}else{Rc[c[(c[M>>2]|0)+4>>2]&1023](M);$=D}}else{$=AO(O,q,b,f,o,B,T)|0}if(($|0)==0){MGa(c[y>>2]|0,0);i=j;return}if((c[a+4>>2]|0)==1){dDa($,c[a+12>>2]|0,c[a+8>>2]|0)}T=hM(a,e,0)|0;ICa(v);if((JCa(v,l,E,544,0)|0)!=0){WCa(v,0);q=Lc[c[(c[$>>2]|0)+8>>2]&255]($)|0;if((Z|0)<=(X|0)){O=(_|0)>(Y|0);D=(o|0)==1&(B|0)==1;M=v+32|0;P=v+24|0;aa=b+64|0;da=T&16777215;ea=Z;while(1){if(!O){Z=ca(ea,o)|0;W=+(ea|0);fa=_;while(1){if(N){ga=Fla(+g[I>>2])|0;ha=ga+Z|0;ia=(Fla(+g[U>>2])|0)+(ca(fa,B)|0)|0}else{g[w>>2]=W*+g[p>>2];g[x>>2]=+(fa|0)*+g[F>>2];fma(n,w,x);ga=Fla(S+ +g[w>>2])|0;ha=ga;ia=Fla(V+ +g[x>>2])|0}ga=ia-C|0;ja=ha-z|0;do{if(D){if((ja|0)<0){break}if(!((((ja|0)>=(l|0)|(ga|0)<0)^1)&(ga|0)<(E|0))){break}ka=(c[M>>2]|0)+((ca(c[P>>2]|0,ga)|0)+(ja<<2))|0;if((c[aa>>2]|0)==0){c[ka>>2]=(d[q>>0]|0)<<24|da;break}else{c[ka>>2]=c[q>>2];break}}else{if((c[aa>>2]|0)==0){FBa(v,ja,ga,o,B,$,T,0,0,0,0,0,0,0)|0;break}else{EBa(v,ja,ga,o,B,$,0,0,0,0,0,0)|0;break}}}while(0);if((fa|0)<(Y|0)){fa=fa+1|0}else{break}}}if((ea|0)<(X|0)){ea=ea+1|0}else{break}}}mN(a,v,z,C,0,255,0,0);MGa(c[y>>2]|0,0);Rc[c[(c[$>>2]|0)+4>>2]&1023]($)}PCa(v);i=j;return}if((c[b+64>>2]|0)==0){if((e|0)==0){la=0}else{la=e+4|0}ma=qM(la,h)|0}else{ma=0}h=b+92|0;b=c[c[h>>2]>>2]|0;if((b|0)==0){na=0}else{c[r>>2]=669496;c[r+4>>2]=9;na=iI(b,r)|0}if((A|0)<=(m|0)){r=(K|0)>(L|0);b=n+16|0;la=n+20|0;e=a+72|0;$=a+64|0;C=a+4|0;z=a+160|0;ea=A;while(1){a:do{if(!r){V=+(ea|0);A=K;while(1){g[s>>2]=V*+g[p>>2];g[t>>2]=+(A|0)*+g[F>>2];fma(n,s,t);c[u+0>>2]=c[f+0>>2];c[u+4>>2]=c[f+4>>2];c[u+8>>2]=c[f+8>>2];c[u+12>>2]=c[f+12>>2];c[u+16>>2]=c[f+16>>2];c[u+20>>2]=c[f+20>>2];$la(u,+g[s>>2]- +g[b>>2],+g[t>>2]- +g[la>>2]);LGa(c[(c[y>>2]|0)+44>>2]|0);OL(v);QL(v,(c[e>>2]|0)+1|0,c[$>>2]|0,c[y>>2]|0,0,0,a,ma,C,c[(c[h>>2]|0)+36>>2]|0,c[z>>2]|0,na,0,0,0,0,0);RL(v,c[h>>2]|0,u);MGa(c[y>>2]|0,0);PL(v);if((A|0)>=(L|0)){break a}A=A+1|0}}}while(0);if((ea|0)<(m|0)){ea=ea+1|0}else{break}}}MGa(c[y>>2]|0,0);if((ma|0)==0){i=j;return}dm(ma);v2a(ma);i=j;return}MGa(k,0);i=j;return}function AO(a,b,d,e,f,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;k=i;i=i+208|0;l=k+152|0;m=k+136|0;n=k+120|0;o=k+96|0;p=k+72|0;q=k+36|0;r=k;s=u2a(40)|0;ICa(s);t=d+64|0;if((JCa(s,f,h,(c[t>>2]|0)!=0?544:264,0)|0)==0){if((s|0)==0){u=0;i=k;return u|0}Rc[c[(c[s>>2]|0)+4>>2]&1023](s);u=0;i=k;return u|0}else{Kxa(l);Lxa(l,s,0,0);WCa(s,0);v=d+68|0;c[m+0>>2]=c[v+0>>2];c[m+4>>2]=c[v+4>>2];c[m+8>>2]=c[v+8>>2];c[m+12>>2]=c[v+12>>2];rm(d+12|0,m);rm(e,m);g[n>>2]=0.0;g[n+8>>2]=0.0;g[n+4>>2]=+(f|0);g[n+12>>2]=+(h|0);g[o+12>>2]=1.0;g[o>>2]=1.0;g[o+20>>2]=0.0;g[o+16>>2]=0.0;g[o+8>>2]=0.0;g[o+4>>2]=0.0;bma(o,n,m);c[p+0>>2]=c[e+0>>2];c[p+4>>2]=c[e+4>>2];c[p+8>>2]=c[e+8>>2];c[p+12>>2]=c[e+12>>2];c[p+16>>2]=c[e+16>>2];c[p+20>>2]=c[e+20>>2];Wla(p,o);ML(q);if((c[t>>2]|0)==0){c[q>>2]=3}c[q+12>>2]=j|64;rM(r);sM(r,a,b);xM(r,l,c[d+92>>2]|0,p,q);uM(r);Oxa(l);u=s;i=k;return u|0}return 0}function BO(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=i;h=qA(e)|0;if((h|0)==0){i=g;return}if((c[h+8>>2]|0)==1){zO(a,h,b,d,f);i=g;return}else{wO(a,h,b,d,f);i=g;return}}function CO(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;if(((c[e>>2]|0)!=0?(h=c[b+16>>2]|0,j=(h|0)==0?0:h+4|0,h=c[j>>2]|0,(h|0)!=0):0)?(c[h+8>>2]|0)==11:0){BO(a,b,d,j,0);c[e>>2]=0}if((c[f>>2]|0)==0){i=g;return}e=c[b+16>>2]|0;j=(e|0)==0?0:e+16|0;e=c[j>>2]|0;if((e|0)==0){i=g;return}if((c[e+8>>2]|0)!=11){i=g;return}BO(a,b,d,j,1);c[f>>2]=0;i=g;return}function DO(a,b,c,d,e,f,g,h,j){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;g=+g;h=+h;j=+j;var k=0;k=i;TO(a,b,d,f,h);TO(a+16|0,c,e,g,j);i=k;return}function EO(a,b,d,e,f,g,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0;l=i;i=i+944|0;m=l+912|0;n=l+880|0;o=l+848|0;p=l+816|0;q=l+768|0;r=l+736|0;s=l+704|0;t=l+672|0;u=l+640|0;v=l+608|0;w=l+576|0;x=l+544|0;y=l+512|0;z=l+480|0;A=l+448|0;B=l+416|0;C=l+384|0;D=l+352|0;E=l+320|0;F=l+288|0;G=l+256|0;H=l+224|0;I=l+192|0;J=l+160|0;K=l+128|0;L=l+96|0;M=l+64|0;N=l+32|0;O=l;if((+FO(g)<2.0?+FO(h)<2.0:0)?+FO(j)<2.0:0){P=+FO(k)<2.0}else{P=0}Q=q+0|0;R=Q+48|0;do{c[Q>>2]=0;Q=Q+4|0}while((Q|0)<(R|0));GO(q,a,e,f,b,d);if(!P){P=q+12|0;Q=f+1|0;GO(P,a,e,Q,b,d);R=q+24|0;S=e+1|0;GO(R,a,S,Q,b,d);Q=q+36|0;GO(Q,a,S,f,b,d);S=c[Q>>2]|0;Q=c[q+40>>2]|0;T=c[q+44>>2]|0;U=c[q>>2]|0;V=q+4|0;W=c[V>>2]|0;X=q+8|0;Y=c[X>>2]|0;Z=HO(S,Q,T,U,W,Y)|0;_=c[P>>2]|0;P=c[q+16>>2]|0;$=c[q+20>>2]|0;aa=HO(_,P,$,U,W,Y)|0;Y=c[R>>2]|0;R=c[q+28>>2]|0;W=c[q+32>>2]|0;U=HO(_,P,$,Y,R,W)|0;$=(Z|0)<4;Z=(aa|0)<4;aa=(U|0)<4;U=(HO(Y,R,W,S,Q,T)|0)<4;if(!($&Z&aa&U)){if($&aa){KO(r,j,k,g,h);aa=d<<1;$=f<<1;LO(s,j);LO(t,k);c[p+0>>2]=c[g+0>>2];c[p+4>>2]=c[g+4>>2];c[p+8>>2]=c[g+8>>2];c[p+12>>2]=c[g+12>>2];c[p+16>>2]=c[g+16>>2];c[p+20>>2]=c[g+20>>2];c[p+24>>2]=c[g+24>>2];c[p+28>>2]=c[g+28>>2];c[o+0>>2]=c[r+0>>2];c[o+4>>2]=c[r+4>>2];c[o+8>>2]=c[r+8>>2];c[o+12>>2]=c[r+12>>2];c[o+16>>2]=c[r+16>>2];c[o+20>>2]=c[r+20>>2];c[o+24>>2]=c[r+24>>2];c[o+28>>2]=c[r+28>>2];c[n+0>>2]=c[s+0>>2];c[n+4>>2]=c[s+4>>2];c[n+8>>2]=c[s+8>>2];c[n+12>>2]=c[s+12>>2];c[n+16>>2]=c[s+16>>2];c[n+20>>2]=c[s+20>>2];c[n+24>>2]=c[s+24>>2];c[n+28>>2]=c[s+28>>2];c[m+0>>2]=c[t+0>>2];c[m+4>>2]=c[t+4>>2];c[m+8>>2]=c[t+8>>2];c[m+12>>2]=c[t+12>>2];c[m+16>>2]=c[t+16>>2];c[m+20>>2]=c[t+20>>2];c[m+24>>2]=c[t+24>>2];c[m+28>>2]=c[t+28>>2];EO(a,b,aa,e,$,p,o,n,m);t=$|1;MO(u,j);MO(v,k);c[p+0>>2]=c[r+0>>2];c[p+4>>2]=c[r+4>>2];c[p+8>>2]=c[r+8>>2];c[p+12>>2]=c[r+12>>2];c[p+16>>2]=c[r+16>>2];c[p+20>>2]=c[r+20>>2];c[p+24>>2]=c[r+24>>2];c[p+28>>2]=c[r+28>>2];c[o+0>>2]=c[h+0>>2];c[o+4>>2]=c[h+4>>2];c[o+8>>2]=c[h+8>>2];c[o+12>>2]=c[h+12>>2];c[o+16>>2]=c[h+16>>2];c[o+20>>2]=c[h+20>>2];c[o+24>>2]=c[h+24>>2];c[o+28>>2]=c[h+28>>2];c[n+0>>2]=c[u+0>>2];c[n+4>>2]=c[u+4>>2];c[n+8>>2]=c[u+8>>2];c[n+12>>2]=c[u+12>>2];c[n+16>>2]=c[u+16>>2];c[n+20>>2]=c[u+20>>2];c[n+24>>2]=c[u+24>>2];c[n+28>>2]=c[u+28>>2];c[m+0>>2]=c[v+0>>2];c[m+4>>2]=c[v+4>>2];c[m+8>>2]=c[v+8>>2];c[m+12>>2]=c[v+12>>2];c[m+16>>2]=c[v+16>>2];c[m+20>>2]=c[v+20>>2];c[m+24>>2]=c[v+24>>2];c[m+28>>2]=c[v+28>>2];EO(a,b,aa,e,t,p,o,n,m);i=l;return}if(Z&U){KO(w,g,h,j,k);U=b<<1;Z=e<<1;LO(x,g);LO(y,h);c[p+0>>2]=c[x+0>>2];c[p+4>>2]=c[x+4>>2];c[p+8>>2]=c[x+8>>2];c[p+12>>2]=c[x+12>>2];c[p+16>>2]=c[x+16>>2];c[p+20>>2]=c[x+20>>2];c[p+24>>2]=c[x+24>>2];c[p+28>>2]=c[x+28>>2];c[o+0>>2]=c[y+0>>2];c[o+4>>2]=c[y+4>>2];c[o+8>>2]=c[y+8>>2];c[o+12>>2]=c[y+12>>2];c[o+16>>2]=c[y+16>>2];c[o+20>>2]=c[y+20>>2];c[o+24>>2]=c[y+24>>2];c[o+28>>2]=c[y+28>>2];c[n+0>>2]=c[j+0>>2];c[n+4>>2]=c[j+4>>2];c[n+8>>2]=c[j+8>>2];c[n+12>>2]=c[j+12>>2];c[n+16>>2]=c[j+16>>2];c[n+20>>2]=c[j+20>>2];c[n+24>>2]=c[j+24>>2];c[n+28>>2]=c[j+28>>2];c[m+0>>2]=c[w+0>>2];c[m+4>>2]=c[w+4>>2];c[m+8>>2]=c[w+8>>2];c[m+12>>2]=c[w+12>>2];c[m+16>>2]=c[w+16>>2];c[m+20>>2]=c[w+20>>2];c[m+24>>2]=c[w+24>>2];c[m+28>>2]=c[w+28>>2];EO(a,U,d,Z,f,p,o,n,m);y=Z|1;MO(z,g);MO(A,h);c[p+0>>2]=c[z+0>>2];c[p+4>>2]=c[z+4>>2];c[p+8>>2]=c[z+8>>2];c[p+12>>2]=c[z+12>>2];c[p+16>>2]=c[z+16>>2];c[p+20>>2]=c[z+20>>2];c[p+24>>2]=c[z+24>>2];c[p+28>>2]=c[z+28>>2];c[o+0>>2]=c[A+0>>2];c[o+4>>2]=c[A+4>>2];c[o+8>>2]=c[A+8>>2];c[o+12>>2]=c[A+12>>2];c[o+16>>2]=c[A+16>>2];c[o+20>>2]=c[A+20>>2];c[o+24>>2]=c[A+24>>2];c[o+28>>2]=c[A+28>>2];c[n+0>>2]=c[w+0>>2];c[n+4>>2]=c[w+4>>2];c[n+8>>2]=c[w+8>>2];c[n+12>>2]=c[w+12>>2];c[n+16>>2]=c[w+16>>2];c[n+20>>2]=c[w+20>>2];c[n+24>>2]=c[w+24>>2];c[n+28>>2]=c[w+28>>2];c[m+0>>2]=c[k+0>>2];c[m+4>>2]=c[k+4>>2];c[m+8>>2]=c[k+8>>2];c[m+12>>2]=c[k+12>>2];c[m+16>>2]=c[k+16>>2];c[m+20>>2]=c[k+20>>2];c[m+24>>2]=c[k+24>>2];c[m+28>>2]=c[k+28>>2];EO(a,U,d,y,f,p,o,n,m);i=l;return}else{KO(B,j,k,g,h);KO(C,g,h,j,k);LO(D,B);MO(E,B);LO(F,C);MO(G,C);C=b<<1;b=d<<1;d=e<<1;e=f<<1;LO(H,g);LO(I,j);c[p+0>>2]=c[H+0>>2];c[p+4>>2]=c[H+4>>2];c[p+8>>2]=c[H+8>>2];c[p+12>>2]=c[H+12>>2];c[p+16>>2]=c[H+16>>2];c[p+20>>2]=c[H+20>>2];c[p+24>>2]=c[H+24>>2];c[p+28>>2]=c[H+28>>2];c[o+0>>2]=c[D+0>>2];c[o+4>>2]=c[D+4>>2];c[o+8>>2]=c[D+8>>2];c[o+12>>2]=c[D+12>>2];c[o+16>>2]=c[D+16>>2];c[o+20>>2]=c[D+20>>2];c[o+24>>2]=c[D+24>>2];c[o+28>>2]=c[D+28>>2];c[n+0>>2]=c[I+0>>2];c[n+4>>2]=c[I+4>>2];c[n+8>>2]=c[I+8>>2];c[n+12>>2]=c[I+12>>2];c[n+16>>2]=c[I+16>>2];c[n+20>>2]=c[I+20>>2];c[n+24>>2]=c[I+24>>2];c[n+28>>2]=c[I+28>>2];c[m+0>>2]=c[F+0>>2];c[m+4>>2]=c[F+4>>2];c[m+8>>2]=c[F+8>>2];c[m+12>>2]=c[F+12>>2];c[m+16>>2]=c[F+16>>2];c[m+20>>2]=c[F+20>>2];c[m+24>>2]=c[F+24>>2];c[m+28>>2]=c[F+28>>2];EO(a,C,b,d,e,p,o,n,m);I=e|1;LO(J,h);MO(K,j);c[p+0>>2]=c[D+0>>2];c[p+4>>2]=c[D+4>>2];c[p+8>>2]=c[D+8>>2];c[p+12>>2]=c[D+12>>2];c[p+16>>2]=c[D+16>>2];c[p+20>>2]=c[D+20>>2];c[p+24>>2]=c[D+24>>2];c[p+28>>2]=c[D+28>>2];c[o+0>>2]=c[J+0>>2];c[o+4>>2]=c[J+4>>2];c[o+8>>2]=c[J+8>>2];c[o+12>>2]=c[J+12>>2];c[o+16>>2]=c[J+16>>2];c[o+20>>2]=c[J+20>>2];c[o+24>>2]=c[J+24>>2];c[o+28>>2]=c[J+28>>2];c[n+0>>2]=c[K+0>>2];c[n+4>>2]=c[K+4>>2];c[n+8>>2]=c[K+8>>2];c[n+12>>2]=c[K+12>>2];c[n+16>>2]=c[K+16>>2];c[n+20>>2]=c[K+20>>2];c[n+24>>2]=c[K+24>>2];c[n+28>>2]=c[K+28>>2];c[m+0>>2]=c[G+0>>2];c[m+4>>2]=c[G+4>>2];c[m+8>>2]=c[G+8>>2];c[m+12>>2]=c[G+12>>2];c[m+16>>2]=c[G+16>>2];c[m+20>>2]=c[G+20>>2];c[m+24>>2]=c[G+24>>2];c[m+28>>2]=c[G+28>>2];EO(a,C,b,d,I,p,o,n,m);K=d|1;MO(L,g);LO(M,k);c[p+0>>2]=c[L+0>>2];c[p+4>>2]=c[L+4>>2];c[p+8>>2]=c[L+8>>2];c[p+12>>2]=c[L+12>>2];c[p+16>>2]=c[L+16>>2];c[p+20>>2]=c[L+20>>2];c[p+24>>2]=c[L+24>>2];c[p+28>>2]=c[L+28>>2];c[o+0>>2]=c[E+0>>2];c[o+4>>2]=c[E+4>>2];c[o+8>>2]=c[E+8>>2];c[o+12>>2]=c[E+12>>2];c[o+16>>2]=c[E+16>>2];c[o+20>>2]=c[E+20>>2];c[o+24>>2]=c[E+24>>2];c[o+28>>2]=c[E+28>>2];c[n+0>>2]=c[F+0>>2];c[n+4>>2]=c[F+4>>2];c[n+8>>2]=c[F+8>>2];c[n+12>>2]=c[F+12>>2];c[n+16>>2]=c[F+16>>2];c[n+20>>2]=c[F+20>>2];c[n+24>>2]=c[F+24>>2];c[n+28>>2]=c[F+28>>2];c[m+0>>2]=c[M+0>>2];c[m+4>>2]=c[M+4>>2];c[m+8>>2]=c[M+8>>2];c[m+12>>2]=c[M+12>>2];c[m+16>>2]=c[M+16>>2];c[m+20>>2]=c[M+20>>2];c[m+24>>2]=c[M+24>>2];c[m+28>>2]=c[M+28>>2];EO(a,C,b,K,e,p,o,n,m);MO(N,h);MO(O,k);c[p+0>>2]=c[E+0>>2];c[p+4>>2]=c[E+4>>2];c[p+8>>2]=c[E+8>>2];c[p+12>>2]=c[E+12>>2];c[p+16>>2]=c[E+16>>2];c[p+20>>2]=c[E+20>>2];c[p+24>>2]=c[E+24>>2];c[p+28>>2]=c[E+28>>2];c[o+0>>2]=c[N+0>>2];c[o+4>>2]=c[N+4>>2];c[o+8>>2]=c[N+8>>2];c[o+12>>2]=c[N+12>>2];c[o+16>>2]=c[N+16>>2];c[o+20>>2]=c[N+20>>2];c[o+24>>2]=c[N+24>>2];c[o+28>>2]=c[N+28>>2];c[n+0>>2]=c[G+0>>2];c[n+4>>2]=c[G+4>>2];c[n+8>>2]=c[G+8>>2];c[n+12>>2]=c[G+12>>2];c[n+16>>2]=c[G+16>>2];c[n+20>>2]=c[G+20>>2];c[n+24>>2]=c[G+24>>2];c[n+28>>2]=c[G+28>>2];c[m+0>>2]=c[O+0>>2];c[m+4>>2]=c[O+4>>2];c[m+8>>2]=c[O+8>>2];c[m+12>>2]=c[O+12>>2];c[m+16>>2]=c[O+16>>2];c[m+20>>2]=c[O+20>>2];c[m+24>>2]=c[O+24>>2];c[m+28>>2]=c[O+28>>2];EO(a,C,b,K,I,p,o,n,m);i=l;return}}else{ba=V;ca=X;da=q}}else{ba=q+4|0;ca=q+8|0;da=q}q=c[a+56>>2]|0;IO(g,q);IO(k,q+36|0);JO(h,q+72|0);JO(j,q+108|0);UGa(c[a+64>>2]|0,a+52|0,0,0,c[da>>2]<<16|c[a+72>>2]<<24|c[ba>>2]<<8|c[ca>>2],0,(c[a+68>>2]|0)>>>20&512|6,0)|0;i=l;return}function FO(a){a=a|0;var b=0,c=0.0,d=0.0;b=i;c=+SO(+g[a>>2],+g[a+4>>2],+g[a+8>>2]);d=c+ +SO(+g[a+16>>2],+g[a+20>>2],+g[a+24>>2]);i=b;return+d}function GO(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0;h=i;j=0;do{k=c[b+(j<<2)>>2]|0;l=c[b+(j<<2)+12>>2]|0;m=((ca((c[b+(j<<2)+36>>2]|0)-k|0,d)|0)/(f|0)|0)+k|0;c[a+(j<<2)>>2]=((ca(((ca((c[b+(j<<2)+24>>2]|0)-l|0,d)|0)/(f|0)|0)+l-m|0,e)|0)/(g|0)|0)+m;j=j+1|0}while((j|0)!=3);i=h;return}function HO(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0;g=a-d|0;d=(g|0)>-1?g:0-g|0;g=b-e|0;e=(g|0)>-1?g:0-g|0;g=(d|0)<(e|0)?e:d;d=c-f|0;f=(d|0)>-1?d:0-d|0;return((g|0)<(f|0)?f:g)|0}function IO(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,h=0;c=i;i=i+16|0;d=c;RO(a,d);g[b>>2]=+g[d>>2];e=d+4|0;g[b+12>>2]=+g[e>>2];f=d+8|0;g[b+24>>2]=+g[f>>2];h=d+12|0;g[b+36>>2]=+g[h>>2];RO(a+16|0,d);g[b+4>>2]=+g[d>>2];g[b+16>>2]=+g[e>>2];g[b+28>>2]=+g[f>>2];g[b+40>>2]=+g[h>>2];i=c;return}function JO(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,h=0;c=i;i=i+16|0;d=c;QO(a,d);g[b>>2]=+g[d>>2];e=d+4|0;g[b+12>>2]=+g[e>>2];f=d+8|0;g[b+24>>2]=+g[f>>2];h=d+12|0;g[b+36>>2]=+g[h>>2];QO(a+16|0,d);g[b+4>>2]=+g[d>>2];g[b+16>>2]=+g[e>>2];g[b+28>>2]=+g[f>>2];g[b+40>>2]=+g[h>>2];i=c;return}function KO(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=i;PO(a,b,c,d,e);PO(a+16|0,b+16|0,c+16|0,d+16|0,e+16|0);i=f;return}function LO(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;OO(a,b);f=a+16|0;OO(e,b+16|0);c[f+0>>2]=c[e+0>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];c[f+12>>2]=c[e+12>>2];i=d;return}function MO(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;NO(a,b);f=a+16|0;NO(e,b+16|0);c[f+0>>2]=c[e+0>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];c[f+12>>2]=c[e+12>>2];i=d;return}function NO(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0.0,h=0.0;c=+g[b>>2];d=c*.125;g[a>>2]=d;e=c*3.0*.125;c=+g[b+4>>2];f=c*.25;g[a+4>>2]=e+f;h=+g[b+8>>2]*.5;g[a+8>>2]=e+c*.5+h;g[a+12>>2]=+g[b+12>>2]+(d+f+h);return}function OO(a,b){a=a|0;b=b|0;g[a>>2]=+g[b>>2]*.125;g[a+4>>2]=+g[b+4>>2]*.25;g[a+8>>2]=+g[b+8>>2]*.5;g[a+12>>2]=+g[b+12>>2];return}function PO(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,h=0,i=0.0,j=0.0;g[a>>2]=(+g[d>>2]+ +g[e>>2])*.5;g[a+4>>2]=(+g[d+4>>2]+ +g[e+4>>2])*.5;f=b+4|0;h=b+8|0;i=+g[c>>2];j=+g[c+4>>2];c=b+12|0;g[a+8>>2]=(+g[d+8>>2]+ +g[e+8>>2])*.5-(+g[b>>2]*.125+ +g[f>>2]*.25+ +g[h>>2]*.5)+(i*.125+j*.25)+(+g[e+12>>2]- +g[c>>2])*.5-(i+j)*.5;g[a+12>>2]=+g[c>>2]+(+g[b>>2]*.125+ +g[f>>2]*.25+ +g[h>>2]*.5);return}function QO(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0;c=+g[a+12>>2];g[b+12>>2]=c;d=c+ +g[a+8>>2]/3.0;g[b+8>>2]=d;e=d*2.0+(+g[a+4>>2]/3.0-c);g[b+4>>2]=e;g[b>>2]=e*3.0+(+g[a>>2]+c-d*3.0);return}function RO(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0;c=+g[a+12>>2];g[b>>2]=c;d=c+ +g[a+8>>2]/3.0;g[b+4>>2]=d;e=d*2.0+(+g[a+4>>2]/3.0-c);g[b+8>>2]=e;g[b+12>>2]=e*3.0+(+g[a>>2]+c-d*3.0);return}function SO(a,b,c){a=+a;b=+b;c=+c;var d=0.0,e=0.0;d=a+b+c;if(d<0.0){e=-d}else{e=d}return+e}function TO(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;var f=0.0,h=0.0;f=c*3.0;h=d*3.0;g[a>>2]=f-b-h+e;g[a+4>>2]=b*3.0-c*6.0+h;g[a+8>>2]=b*-3.0+f;g[a+12>>2]=b;return}function UO(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0.0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0.0,N=0.0;f=i;i=i+48|0;h=f+36|0;j=f+24|0;k=f+12|0;l=f;m=+g[e+4>>2];n=+g[e+24>>2];o=m>n?n:m;p=m<n?n:m;m=+g[e+44>>2];n=o>m?m:o;o=p<m?m:p;if(n==o){i=f;return}q=~~+Q(+n);r=~~+ba(+o);s=(q|0)<0?0:q;q=c[b+12>>2]|0;t=(r|0)<(q|0)?r:q+ -1|0;if((s|0)>(t|0)){i=f;return}q=h+4|0;r=b+8|0;u=b+24|0;v=d<<24;d=s;while(1){o=+(d|0);s=0;w=0;a:while(1){x=h+(w<<2)|0;y=s;while(1){if((y|0)>=3){break a}z=y+1|0;A=(z|0)%3|0;B=e+(y*20|0)+4|0;C=e+(A*20|0)+4|0;if((uO(d,+g[e+(y*20|0)>>2],+g[B>>2],+g[e+(A*20|0)>>2],+g[C>>2],x)|0)==0){y=z}else{break}}n=+g[e+(y*20|0)+8>>2];p=+g[B>>2];m=o-p;D=+g[C>>2]-p;g[j+(w<<2)>>2]=n+(+g[e+(A*20|0)+8>>2]-n)*m/D;n=+g[e+(y*20|0)+12>>2];g[k+(w<<2)>>2]=n+(+g[e+(A*20|0)+12>>2]-n)*m/D;n=+g[e+(y*20|0)+16>>2];g[l+(w<<2)>>2]=n+(+g[e+(A*20|0)+16>>2]-n)*m/D;s=z;w=w+1|0}if((w|0)==2){o=+g[h>>2];D=+g[q>>2];if(o<D){E=D;F=o;G=1;H=0}else{E=o;F=D;G=0;H=1}s=~~+ba(+E);x=~~+Q(+F);I=(x|0)<0?0:x;J=c[r>>2]|0;K=Lc[c[(c[b>>2]|0)+8>>2]&255](b)|0;D=+g[j+(H<<2)>>2];o=+(s-x|0);m=(+g[j+(G<<2)>>2]-D)/o;n=+g[k+(H<<2)>>2];p=(+g[k+(G<<2)>>2]-n)/o;L=+g[l+(H<<2)>>2];M=(+g[l+(G<<2)>>2]-L)/o;o=+(I-x|0);if((I|0)<(((s|0)>(J|0)?J:s)|0)){x=K+((ca(c[u>>2]|0,d)|0)+(I<<2))|0;K=~s;s=~J;J=~((K|0)>(s|0)?K:s);N=L+o*M;L=n+o*p;n=D+o*m;s=x;x=I;while(1){n=m+n;L=p+L;N=M+N;I=~~(N*255.0);K=~~(n*255.0)<<16|v|~~(L*255.0)<<8|I;a[s>>0]=I;a[s+1>>0]=K>>>8;a[s+2>>0]=K>>>16;a[s+3>>0]=K>>>24;x=x+1|0;if((x|0)==(J|0)){break}else{s=s+4|0}}}}if((d|0)<(t|0)){d=d+1|0}else{break}}i=f;return}function VO(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;i=i+16|0;d=b+4|0;e=b;f=a+4|0;g=(c[a+12>>2]|0)==0;c[d>>2]=g?0:-1;c[e>>2]=0;if(!g){do{g=Pma(f,d)|0;if((g|0)!=0){ZO(g);v2a(g)}}while((c[d>>2]|0)!=0)}Mma(f);dka(e);Nma(f);i=b;return}function WO(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=+e;f=+f;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;h=i;i=i+176|0;j=h;k=h+32|0;l=h+24|0;m=h+20|0;n=h+16|0;o=Fla(+g[d>>2]*1.0e4)|0;p=Fla(+g[d+4>>2]*1.0e4)|0;q=Fla(+g[d+8>>2]*1.0e4)|0;r=Fla(+g[d+12>>2]*1.0e4)|0;c[j>>2]=o;c[j+4>>2]=p;c[j+8>>2]=q;c[j+12>>2]=r;XO(k,j);yF(l,k,c[k+128>>2]|0);c[m>>2]=0;k=a+4|0;if((Wma(k,l,m)|0)==0){j=u2a(164)|0;nP(j);c[m>>2]=j;c[(Qma(k,l)|0)>>2]=j;s=j}else{s=c[m>>2]|0}m=s+4|0;j=b;if((Dma(m,j,n)|0)==0){l=YO(c[a>>2]|0,s,b,d,e,f)|0;c[n>>2]=l;c[(Gma(m,j)|0)>>2]=l;t=l;i=h;return t|0}else{t=c[n>>2]|0;i=h;return t|0}return 0}function XO(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d;c[e>>2]=b;b=0;do{f=c[e>>2]|0;g=c[f>>2]|0;c[e>>2]=f+4;c[a+(b<<2)>>2]=g;b=b+1|0}while((b|0)!=4);c[a+128>>2]=16;i=d;return}function YO(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;h=+h;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0,A=0,B=0.0,C=0,D=0,E=0,F=0;j=i;i=i+64|0;k=j+40|0;l=j+16|0;m=j+12|0;n=j+8|0;o=j+4|0;p=j;q=vv(a,d,0)|0;if((q|0)==0){r=0;i=j;return r|0}d=c[q+36>>2]|0;if((d|0)==0){r=0;i=j;return r|0}a=k+12|0;g[a>>2]=1.0;g[k>>2]=1.0;s=k+20|0;g[s>>2]=0.0;t=k+16|0;g[t>>2]=0.0;u=k+8|0;g[u>>2]=0.0;v=k+4|0;g[v>>2]=0.0;g[l+12>>2]=1.0;g[l>>2]=1.0;g[l+20>>2]=0.0;g[l+16>>2]=0.0;g[l+8>>2]=0.0;g[l+4>>2]=0.0;w=q+12|0;c[k+0>>2]=c[w+0>>2];c[k+4>>2]=c[w+4>>2];c[k+8>>2]=c[w+8>>2];c[k+12>>2]=c[w+12>>2];c[k+16>>2]=c[w+16>>2];c[k+20>>2]=c[w+20>>2];Tla(l,+g[e>>2],+g[e+4>>2],+g[e+8>>2],+g[e+12>>2],0.0,0.0);Wla(k,l);x=+R(+(+g[v>>2]));if(((x<+R(+(+g[k>>2]))/100.0?(x=+R(+(+g[u>>2])),x<+R(+(+g[a>>2]))/100.0):0)?(u=aP(d,1)|0,c[o>>2]=u,v=aP(d,0)|0,c[p>>2]=v,(u|0)==0):0)?(v|0)==((c[d+12>>2]|0)+ -1|0):0){x=+g[s>>2];y=+g[a>>2]+x;a=y>x;_O(b,a?x:y,a?y:x,o,p);b=~~(+(Fla(+g[k>>2])|0)*f);if(a){a=c[o>>2]|0;z=a-(c[p>>2]|0)|0;A=a}else{a=c[o>>2]|0;z=(c[p>>2]|0)-a|0;A=a}a=zDa(d,b,~~(+(z|0)*h),0,0)|0;c[n>>2]=A;if(+g[k>>2]<0.0){ama(k,f,h);B=+g[t>>2]+ +g[k>>2]}else{B=+g[t>>2]}t=Fla(B)|0;c[m>>2]=t;if((a|0)!=0){C=t;D=A;E=a}else{F=14}}else{F=14}do{if((F|0)==14){ama(k,f,h);a=wDa(d,k,m,n)|0;if((a|0)==0){r=0;i=j;return r|0}else{C=c[m>>2]|0;D=c[n>>2]|0;E=a;break}}}while(0);n=u2a(48)|0;m=n+8|0;ICa(m);c[n+4>>2]=C;c[n>>2]=0-D;QCa(m,E);Rc[c[(c[E>>2]|0)+4>>2]&1023](E);r=n;i=j;return r|0}function ZO(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+16|0;d=b+8|0;e=b+4|0;f=b;g=a+4|0;h=(c[a+12>>2]|0)==0;c[d>>2]=h?0:-1;if(h){Bma(g);i=b;return}do{Cma(g,d,e,f);h=c[f>>2]|0;if((h|0)!=0){PCa(h+8|0);v2a(h)}}while((c[d>>2]|0)!=0);Bma(g);i=b;return}function _O(a,b,d,e,f){a=a|0;b=+b;d=+d;e=e|0;f=f|0;var g=0;g=i;c[e>>2]=$O(b,a+156|0,a+28|0)|0;c[f>>2]=$O(d,a+160|0,a+92|0)|0;i=g;return}function $O(a,b,d){a=+a;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0.0,k=0.0,l=0,m=0,n=0;e=i;f=c[b>>2]|0;do{if((f|0)>0){g=-1;h=0;j=1.0e6;while(1){k=+R(+(a- +(c[d+(h<<2)>>2]|0)));l=k<.800000011920929&k<j;g=l?h:g;h=h+1|0;if((h|0)>=(f|0)){break}else{j=l?k:j}}if((g|0)>-1){m=c[d+(g<<2)>>2]|0;i=e;return m|0}else{h=Fla(a)|0;if((f|0)==16){m=h}else{n=h;break}i=e;return m|0}}else{n=Fla(a)|0}}while(0);c[b>>2]=f+1;c[d+(f<<2)>>2]=n;m=n;i=e;return m|0}function aP(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=i;g=c[b+12>>2]|0;h=c[b+24>>2]|0;j=c[b+8>>2]|0;k=c[b+16>>2]|0;if((k|0)>8){l=ca((k|0)/8|0,j)|0}else{l=j}j=Lc[c[(c[b>>2]|0)+8>>2]&255](b)|0;b=(e|0)!=0;e=b?0:g+ -1|0;m=b?1:-1;n=b?g:-1;if((e|0)==(n|0)){o=-1;i=f;return o|0}g=(k|0)==1;k=(l|0)/8|0;b=(l|0)>7;p=(l|0)%8|0;q=(p|0)==0;r=255<<8-p;p=(l|0)>0;s=e;a:while(1){e=ca(s,h)|0;if(g){if(b){t=0;do{if((a[j+(t+e)>>0]|0)!=0){o=s;u=15;break a}t=t+1|0}while((t|0)<(k|0))}if(!q?(d[j+(k+e)>>0]&r|0)!=0:0){o=s;u=15;break}}else{if(p){t=0;do{if((d[j+(t+e)>>0]|0)>64){o=s;u=15;break a}t=t+1|0}while((t|0)<(l|0))}}s=s+m|0;if((s|0)==(n|0)){o=-1;u=15;break}}if((u|0)==15){i=f;return o|0}return 0}function bP(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0,N=0,O=0;f=i;i=i+80|0;h=f+48|0;j=f+24|0;k=f;l=b+60|0;if((c[l>>2]|0)==0){m=1;i=f;return m|0}n=b+20|0;o=c[n>>2]|0;p=c[o+32>>2]|0;if((p|0)==3){m=1;i=f;return m|0}q=c[o>>2]|0;if((c[q+84>>2]|0)==3){m=cP(a,b,d)|0;i=f;return m|0}do{if((e|0)==0){switch(p|0){case 5:case 1:{if((c[q+8>>2]|0)==0?(c[(c[q+12>>2]|0)+12>>2]&4|0)==0:0){r=0;s=0;t=0;u=0}else{v=0;w=11}break};case 3:case 7:{m=1;i=f;return m|0};case 6:case 2:{if((c[q+8>>2]|0)==0?(c[(c[q+12>>2]|0)+12>>2]&4|0)==0:0){r=0;s=0;t=0;u=0}else{v=1;w=11}break};default:{r=0;s=0;t=0;u=0}}if((w|0)==11){o=c[b+16>>2]|0;if((zN(c[((o|0)==0?0:o+16|0)>>2]|0)|0)==0){x=0;y=iM(a,b)|0}else{x=1;y=0}if((v|0)==0){z=0;A=1;B=0;C=0;D=x;E=1;F=0;G=y;break}else{r=1;s=x;t=1;u=y}}o=c[b+16>>2]|0;if((zN(c[((o|0)==0?0:o+4|0)>>2]|0)|0)==0){z=80;A=r;B=0;C=1;D=s;E=t;F=hM(a,b,0)|0;G=u}else{z=80;A=r;B=0;C=1;D=1;E=t;F=0;G=u}}else{z=0;A=0;B=1;C=0;D=0;E=0;F=0;G=0}}while(0);g[h+12>>2]=1.0;g[h>>2]=1.0;g[h+20>>2]=0.0;g[h+16>>2]=0.0;g[h+8>>2]=0.0;g[h+4>>2]=0.0;qy(b,h);if((gM(h)|0)==0){m=1;i=f;return m|0}u=c[n>>2]|0;H=+g[u+4>>2];if((D|0)!=0){dP(a,b,d,q,H,h,C,E);m=1;i=f;return m|0}if(!((B|0)!=0|A)){Wla(h,d);m=fP(c[a+76>>2]|0,c[l>>2]|0,c[b+64>>2]|0,c[b+68>>2]|0,q,H,h,F,a+4|0)|0;i=f;return m|0}g[j+12>>2]=1.0;g[j>>2]=1.0;g[j+20>>2]=0.0;g[j+16>>2]=0.0;g[j+8>>2]=0.0;g[j+4>>2]=0.0;if(A){I=+g[u+36>>2];J=+g[u+48>>2];if(I!=1.0|J!=1.0){K=+g[u+40>>2];L=+g[u+44>>2];g[k>>2]=I;g[k+4>>2]=K;g[k+8>>2]=L;g[k+12>>2]=J;g[k+16>>2]=0.0;g[k+20>>2]=0.0;Yla(h,k);c[j+0>>2]=c[k+0>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];c[j+16>>2]=c[k+16>>2];c[j+20>>2]=c[k+20>>2];Wla(j,d);M=z;N=j}else{M=z;N=d}}else{M=0;N=d}d=c[b+24>>2]|0;if((d|0)==0){O=M}else{O=(c[d+92>>2]|0)==0?M:M|32}m=eP(c[a+76>>2]|0,c[l>>2]|0,c[b+64>>2]|0,c[b+68>>2]|0,q,H,h,N,c[b+12>>2]|0,F,G,e,(c[a+16>>2]|0)>>>19&512|O)|0;i=f;return m|0}function cP(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0.0,E=0.0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0.0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0;e=i;i=i+736|0;f=e+712|0;h=e+688|0;j=e+664|0;k=e+656|0;l=e+632|0;m=e+592|0;n=e+584|0;o=e+392|0;p=e+376|0;q=e+360|0;r=e+232|0;s=e+40|0;t=e+16|0;u=e;v=b+4|0;w=b+20|0;x=c[c[w>>2]>>2]|0;if((c[x+84>>2]|0)==3){y=x}else{y=0}x=a+48|0;z=a+52|0;a:do{if((c[z>>2]|0)>0){A=0;while(1){if((Ch(x,A)|0)==(y|0)){B=1;break}A=A+1|0;if((A|0)>=(c[z>>2]|0)){break a}}i=e;return B|0}}while(0);z=a+76|0;PGa(f,c[(c[z>>2]|0)+44>>2]|0);C=+R(+(+g[f>>2]));D=+R(+(+g[f+12>>2]));g[h+12>>2]=1.0;g[h>>2]=1.0;g[h+20>>2]=0.0;g[h+16>>2]=0.0;g[h+8>>2]=0.0;g[h+4>>2]=0.0;qy(b,h);f=y+5848|0;c[j+0>>2]=c[f+0>>2];c[j+4>>2]=c[f+4>>2];c[j+8>>2]=c[f+8>>2];c[j+12>>2]=c[f+12>>2];c[j+16>>2]=c[f+16>>2];c[j+20>>2]=c[f+20>>2];E=+g[(c[w>>2]|0)+4>>2];ama(j,E,E);w=hM(a,b,1)|0;f=w>>>24;A=(c[(c[z>>2]|0)+24>>2]|0)==1;do{if(!A){if((f|0)==255){F=c[b+60>>2]|0;G=0;break}else{B=0;i=e;return B|0}}else{H=c[b+60>>2]|0;F=H;G=w2a(H,20)|0}}while(0);c[k>>2]=0;c[k+4>>2]=y;H=b+64|0;I=b+60|0;if((F|0)!=1){if((F|0)>0){J=c[H>>2]|0;K=13}else{L=0;M=F;N=G;K=45}}else{J=H;K=13}b:do{if((K|0)==13){H=l+16|0;F=a+64|0;O=(b|0)==0?0:v;P=a+4|0;Q=m+12|0;S=(f|0)==255;T=a+72|0;U=a+160|0;V=o+48|0;W=q+8|0;X=q+12|0;Y=q+4|0;Z=r+4|0;_=s+48|0;$=n+4|0;aa=l+20|0;ba=r+4|0;ca=b+68|0;da=0;ea=0;fa=G;while(1){ga=c[J+(ea<<2)>>2]|0;do{if(!((ga|0)==-1)?(ha=vv(y,ga,0)|0,(ha|0)!=0):0){c[l+0>>2]=c[j+0>>2];c[l+4>>2]=c[j+4>>2];c[l+8>>2]=c[j+8>>2];c[l+12>>2]=c[j+12>>2];c[l+16>>2]=c[j+16>>2];c[l+20>>2]=c[j+20>>2];if((ea|0)==0){ia=0.0}else{ia=+g[(c[ca>>2]|0)+(ea+ -1<<2)>>2]}g[H>>2]=ia+ +g[H>>2];Wla(l,h);Wla(l,d);if((hP(ha,c[F>>2]|0)|0)!=0){ja=ha+36|0;if((c[ja>>2]|0)==0){ka=da;la=fa;break}if(!A){ma=ha+12|0;c[t+0>>2]=c[ma+0>>2];c[t+4>>2]=c[ma+4>>2];c[t+8>>2]=c[ma+8>>2];c[t+12>>2]=c[ma+12>>2];c[t+16>>2]=c[ma+16>>2];c[t+20>>2]=c[ma+20>>2];Wla(t,l);tN(r);if((DN(r,a,c[ja>>2]|0,w,t)|0)!=0){lN(r,0)|0}ja=(c[ba>>2]|0)==0;ma=ja?0:da;vN(r);if(ja){na=ma;break b}else{ka=ma;la=fa;break}}ma=gP(y)|0;c[k>>2]=(c[k>>2]|0)+1;ja=WO(ma,ga,l,C,D)|0;if((ja|0)==0){ka=da;la=fa;break}ma=Fla(+g[H>>2])|0;oa=Fla(+g[aa>>2])|0;if((fa|0)==0){$Ga(c[(c[z>>2]|0)+44>>2]|0,ja+8|0,(c[ja+4>>2]|0)+ma|0,oa-(c[ja>>2]|0)|0,w)|0;ka=da;la=0;break}else{c[fa+(ea*20|0)>>2]=ja;c[fa+(ea*20|0)+4>>2]=ma;c[fa+(ea*20|0)+8>>2]=oa;ka=da;la=fa;break}}if((fa|0)!=0){if((ea|0)>0){oa=0;do{ma=c[fa+(oa*20|0)>>2]|0;if((ma|0)!=0){$Ga(c[(c[z>>2]|0)+44>>2]|0,ma+8|0,(c[ma+4>>2]|0)+(c[fa+(oa*20|0)+4>>2]|0)|0,(c[fa+(oa*20|0)+8>>2]|0)-(c[ma>>2]|0)|0,w)|0}oa=oa+1|0}while((oa|0)<(ea|0))}v2a(fa)}oa=qM(O,0)|0;ma=m+0|0;ja=P+0|0;pa=ma+36|0;do{c[ma>>2]=c[ja>>2];ma=ma+4|0;ja=ja+4|0}while((ma|0)<(pa|0));c[Q>>2]=c[Q>>2]&-197|192;ja=ha+8|0;ma=c[ja>>2]|0;if((ma|0)!=0?(pa=c[ma>>2]|0,(pa|0)!=0):0){c[n>>2]=669496;c[$>>2]=9;qa=iI(pa,n)|0}else{qa=0}if(!S){Gy(p,c[ja>>2]|0);Kla(p,l);Mla(q,p);Kxa(r);pa=c[q>>2]|0;ma=c[Y>>2]|0;if((Mxa(r,~~(C*+((c[W>>2]|0)-pa|0)),~~(D*+((c[X>>2]|0)-ma|0)),544,0)|0)==0){ra=1;sa=1}else{WCa(c[Z>>2]|0,0);OL(s);QL(s,(c[T>>2]|0)+1|0,c[F>>2]|0,r,0,0,a,oa,m,c[(c[ja>>2]|0)+36>>2]|0,c[U>>2]|0,qa,0,ha,w,0,0);Mja(_,x);yg(_,y);mM(l,0-pa|0,0-ma|0);ama(l,C,D);RL(s,c[ja>>2]|0,l);ZGa(c[z>>2]|0,c[Z>>2]|0,pa,ma,0)|0;PL(s);ra=0;sa=da}Oxa(r);if((ra|0)==0){ta=sa}else{na=sa;break b}}else{OL(o);QL(o,(c[T>>2]|0)+1|0,c[F>>2]|0,c[z>>2]|0,0,0,a,oa,m,c[(c[ja>>2]|0)+36>>2]|0,c[U>>2]|0,qa,0,ha,w,0,0);Mja(V,x);yg(V,y);LGa(c[(c[z>>2]|0)+44>>2]|0);RL(o,c[ja>>2]|0,l);MGa(c[z>>2]|0,0);PL(o);ta=da}if((oa|0)==0){ka=ta;la=0}else{dm(oa);v2a(oa);ka=ta;la=0}}else{ka=da;la=fa}}while(0);ea=ea+1|0;ga=c[I>>2]|0;if((ea|0)>=(ga|0)){L=ka;M=ga;N=la;K=45;break}else{da=ka;fa=la}}}}while(0);do{if((K|0)==45){if((N|0)!=0){iJa(u,N,M,0,C,D);ICa(r);la=c[u>>2]|0;ka=c[u+4>>2]|0;if((JCa(r,~~(C*+((c[u+8>>2]|0)-la|0)),~~(D*+((c[u+12>>2]|0)-ka|0)),264,0)|0)==0){v2a(N);ua=1;va=1}else{WCa(r,0);ta=c[I>>2]|0;if((ta|0)>0){o=ta;ta=0;while(1){l=c[N+(ta*20|0)>>2]|0;if((l|0)==0){wa=o}else{YCa(r,~~(C*+((c[l+4>>2]|0)+(c[N+(ta*20|0)+4>>2]|0)-la|0)),~~(D*+((c[N+(ta*20|0)+8>>2]|0)-(c[l>>2]|0)-ka|0)),c[l+16>>2]|0,c[l+20>>2]|0,l+8|0,0,0,0)|0;wa=c[I>>2]|0}ta=ta+1|0;if((ta|0)>=(wa|0)){break}else{o=wa}}}$Ga(c[(c[z>>2]|0)+44>>2]|0,r,la,ka,w)|0;v2a(N);ua=0;va=L}PCa(r);if((ua|0)!=0){na=va;break}}na=1}}while(0);mP(k);B=na;i=e;return B|0}function dP(a,b,d,e,f,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;l=i;i=i+128|0;m=l+40|0;n=l+32|0;o=l+24|0;p=l;if((k|0)==0){_l(m);q=u2a(72)|0;my(q);c[n>>2]=q;gy(q,b);c[m+60>>2]=0;c[m+56>>2]=2;AC(m+8|0,n,1);hD(m+16|0,b+16|0);n=lE(m+52|0)|0;q=b+32|0;r=b+44|0;s=b+36|0;t=b+40|0;XIa(n,+g[q>>2],+g[r>>2],+g[s>>2],+g[t>>2]);g[m+32>>2]=+g[q>>2];g[m+44>>2]=+g[r>>2];g[m+36>>2]=+g[s>>2];g[m+40>>2]=+g[t>>2];SL(a,m,d);cm(m);i=l;return}t=c[e+4>>2]|0;if((t|0)==0){u=EGa(BGa()|0)|0}else{u=c[(JG(t)|0)+4>>2]|0}t=e+8|0;s=mJa(u,t)|0;c[o>>2]=0;kP(o,c[b+60>>2]|0,c[b+64>>2]|0,c[b+68>>2]|0,e,f);e=c[o+4>>2]|0;r=c[o>>2]|0;if((e|0)==0){v=r}else{o=m+12|0;q=b+12|0;n=m+16|0;w=b+16|0;b=p+12|0;x=p+20|0;y=p+16|0;z=p+8|0;A=p+4|0;B=m+52|0;C=m+64|0;D=m+60|0;E=(j|0)!=0?2:0;j=m+56|0;F=0;do{G=oJa(s,t,c[r+(F*44|0)>>2]|0,c[r+(F*44|0)+12>>2]|0)|0;if((G|0)!=0){_l(m);iD(o,q);hD(n,w);g[b>>2]=1.0;g[p>>2]=1.0;g[x>>2]=0.0;g[y>>2]=0.0;g[z>>2]=0.0;g[A>>2]=0.0;if((c[r+(F*44|0)+16>>2]|0)!=0){Tla(p,+g[r+(F*44|0)+20>>2],+g[r+(F*44|0)+24>>2],+g[r+(F*44|0)+28>>2],+g[r+(F*44|0)+32>>2],0.0,0.0)}Vla(p,f,0.0,0.0,f,+g[r+(F*44|0)+4>>2],+g[r+(F*44|0)+8>>2]);VIa(lE(B)|0,G,p);c[C+0>>2]=c[h+0>>2];c[C+4>>2]=c[h+4>>2];c[C+8>>2]=c[h+8>>2];c[C+12>>2]=c[h+12>>2];c[C+16>>2]=c[h+16>>2];c[C+20>>2]=c[h+20>>2];c[D>>2]=k;c[j>>2]=E;_F(m);aM(a,m,d)|0;cm(m)}F=F+1|0}while(F>>>0<e>>>0);v=r}jP(v);sJa(u,t);i=l;return}function eP(a,b,d,e,f,g,h,j,k,l,m,n,o){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=+g;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;var p=0,q=0,r=0,s=0;p=i;i=i+16|0;q=p;r=c[f+4>>2]|0;if((r|0)==0){s=0}else{s=c[(JG(r)|0)+4>>2]|0}c[q>>2]=0;kP(q,b,d,e,f,g);e=c[q>>2]|0;d=lJa(a,c[q+4>>2]|0,e,f+8|0,s,g,h,j,k,l,m,n,o)|0;jP(e);i=p;return d|0}function fP(a,b,d,e,f,g,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=+g;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0;l=i;i=i+16|0;m=l;n=c[f+4>>2]|0;if((n|0)==0){o=0}else{o=c[(JG(n)|0)+4>>2]|0}c[m>>2]=0;kP(m,b,d,e,f,g);if((k|0)==0){p=1}else{e=c[k+12>>2]|0;if((e&1|0)==0){q=0}else{q=e>>>3&2|1}p=e<<1&4|e>>>23&32|e>>>2&8|e>>>5&16|q}q=c[m>>2]|0;e=kJa(a,c[m+4>>2]|0,q,f+8|0,o,g,h,j,c[f+84>>2]<<18&1048576|p)|0;jP(q);i=l;return e|0}function gP(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+4|0;e=c[d>>2]|0;if((e|0)==0){f=0;i=b;return f|0}g=IG(e)|0;SA(g,c[a+96>>2]|0)|0;f=EL(JG(c[d>>2]|0)|0,a)|0;i=b;return f|0}function hP(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;i=i+144|0;e=d;f=a+36|0;if((c[f>>2]|0)!=0){g=1;i=d;return g|0}h=a+8|0;j=c[h>>2]|0;if((j|0)==0){g=1;i=d;return g|0}if((c[j+48>>2]|0)!=1){g=0;i=d;return g|0}if((c[a>>2]|0)!=0){g=0;i=d;return g|0}k=c[(c[j+40>>2]|0)+8>>2]|0;j=c[k+28>>2]|0;if((j|0)==6){l=k+52|0;if((c[l>>2]|0)==0){g=0;i=d;return g|0}m=a+12|0;n=iP(k+60|0)|0;c[m+0>>2]=c[n+0>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];c[m+16>>2]=c[n+16>>2];c[m+20>>2]=c[n+20>>2];WN(e);if((QN(e,c[b>>2]|0,c[l>>2]|0)|0)==0){o=0}else{c[f>>2]=RCa(e,0)|0;l=c[h>>2]|0;if((l|0)!=0){Iy(l);v2a(l)}c[h>>2]=0;o=1}YN(e);g=o;i=d;return g|0}else if((j|0)==3){j=a+12|0;a=k+56|0;c[j+0>>2]=c[a+0>>2];c[j+4>>2]=c[a+4>>2];c[j+8>>2]=c[a+8>>2];c[j+12>>2]=c[a+12>>2];c[j+16>>2]=c[a+16>>2];c[j+20>>2]=c[a+20>>2];a=PN(c[k+52>>2]|0)|0;if((a|0)!=0){c[f>>2]=RCa(a,0)|0;Rc[c[(c[a>>2]|0)+4>>2]&1023](a)}a=c[h>>2]|0;if((a|0)!=0){Iy(a);v2a(a)}c[h>>2]=0;g=1;i=d;return g|0}else{g=0;i=d;return g|0}return 0}function iP(b){b=b|0;var d=0;d=i;if((c[b+4>>2]|0)<=0){a[0]=0;da()}i=d;return c[b>>2]|0}function jP(a){a=a|0;var b=0;b=i;if((a|0)!=0){v2a(a)}i=b;return}function kP(d,e,f,h,j,k){d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=+k;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0,E=0,F=0,G=0,H=0,I=0.0;l=i;i=i+16|0;m=l;n=l+6|0;o=l+4|0;c[d>>2]=w2a(e,44)|0;p=d+4|0;c[p>>2]=0;q=j+84|0;if((c[q>>2]|0)==4){r=j;s=1;t=(Lc[c[(c[j>>2]|0)+8>>2]&255](j)|0)!=0}else{r=0;s=0;t=0}if((e|0)<=0){i=l;return}u=(e|0)==1;v=f;w=(r|0)==0;x=r+144|0;y=0;do{if(u){z=v}else{z=c[f+(y<<2)>>2]|0}if(!((z|0)==-1)){c[m>>2]=0;A=c[p>>2]|0;c[p>>2]=A+1;B=c[d>>2]|0;if(s){c[B+(A*44|0)+40>>2]=dd[c[(c[r>>2]|0)+64>>2]&511](r,z)|0}c[B+(A*44|0)>>2]=Qc[c[(c[j>>2]|0)+32>>2]&255](j,z,m)|0;if((Zu(j)|0)==0?(c[q>>2]|0)!=4:0){c[B+(A*44|0)+12>>2]=Qc[c[(c[j>>2]|0)+40>>2]&255](j,z,0)|0}else{c[B+(A*44|0)+12>>2]=0}if((y|0)==0){C=0.0}else{C=+g[h+(y+ -1<<2)>>2]}D=B+(A*44|0)+4|0;g[D>>2]=C;E=B+(A*44|0)+8|0;g[E>>2]=0.0;F=B+(A*44|0)+16|0;c[F>>2]=0;if(!w){G=Gw(c[x>>2]|0,z)|0;if(t){g[E>>2]=+g[D>>2];g[D>>2]=0.0;Tw(r,G,n,o);g[D>>2]=+g[D>>2]- +(b[n>>1]|0)*k/1.0e3;g[E>>2]=+g[E>>2]- +(b[o>>1]|0)*k/1.0e3}H=Qw(r,G)|0;if((H|0)!=0?(c[m>>2]|0)==0:0){g[B+(A*44|0)+20>>2]=+Ow(a[H>>0]|0);g[B+(A*44|0)+28>>2]=+Ow(a[H+2>>0]|0);g[B+(A*44|0)+24>>2]=+Ow(a[H+1>>0]|0);g[B+(A*44|0)+32>>2]=+Ow(a[H+3>>0]|0);I=+Ow(a[H+4>>0]|0)*k;g[D>>2]=+g[D>>2]+I;I=+Ow(a[H+5>>0]|0)*k;g[E>>2]=+g[E>>2]+I;c[F>>2]=1}}}y=y+1|0}while((y|0)!=(e|0));i=l;return}function lP(a,b,d,e,f,h,j,k,l,m,n){a=a|0;b=+b;d=+d;e=e|0;f=+f;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0,x=0,y=0,z=0;o=i;i=i+32|0;p=o+24|0;q=o;r=c[j>>2]|0;s=(r|0)==0;if(s){t=0}else{t=c[r+4>>2]|0}u=Qc[c[(c[e>>2]|0)+20>>2]&255](e,s?1305928:r+12|0,t)|0;if((u|0)==0){i=o;return}c[p>>2]=0;if((u|0)!=1){t=w2a(u,4)|0;r=w2a(u+ -1|0,4)|0;if((u|0)>0){v=0.0;s=0;do{w=c[j>>2]|0;x=Qc[c[(c[e>>2]|0)+16>>2]&255](e,(w|0)==0?1305928:w+12|0,p)|0;c[t+(s<<2)>>2]=x;if((s|0)!=0){g[r+(s+ -1<<2)>>2]=v}v=v+ +(Qc[c[(c[e>>2]|0)+40>>2]&255](e,x,0)|0)*f/1.0e3;s=s+1|0}while((s|0)!=(u|0));y=t;z=r}else{y=t;z=r}}else{r=c[j>>2]|0;y=Qc[c[(c[e>>2]|0)+16>>2]&255](e,(r|0)==0?1305928:r+12|0,p)|0;z=0}g[q+12>>2]=1.0;g[q>>2]=1.0;p=q+20|0;g[p>>2]=0.0;r=q+16|0;g[r>>2]=0.0;g[q+8>>2]=0.0;g[q+4>>2]=0.0;if((h|0)!=0){c[q+0>>2]=c[h+0>>2];c[q+4>>2]=c[h+4>>2];c[q+8>>2]=c[h+8>>2];c[q+12>>2]=c[h+12>>2];c[q+16>>2]=c[h+16>>2];c[q+20>>2]=c[h+20>>2]}g[r>>2]=b;g[p>>2]=d;do{if((c[e+84>>2]|0)!=3){if((l|0)==0){fP(a,u,y,z,e,f,q,k,n)|0;break}else{eP(a,u,y,z,e,f,q,0,m,k,l,0,0)|0;break}}}while(0);if((u|0)<=1){i=o;return}v2a(y);v2a(z);i=o;return}function mP(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;d=c[a>>2]|0;e=d+ -1|0;c[a>>2]=e;if((d|0)==0){i=b;return}d=a+4|0;f=e;do{e=c[d>>2]|0;g=e+4|0;h=c[g>>2]|0;if((h|0)==0){j=f}else{GL(JG(h)|0,e);h=IG(c[g>>2]|0)|0;mB(h,c[e+96>>2]|0);j=c[a>>2]|0}f=j+ -1|0;c[a>>2]=f}while((j|0)!=0);i=b;return}function nP(a){a=a|0;var b=0,d=0;b=i;d=a+4|0;zma(d,10);Hma(d,253,1);c[a+160>>2]=0;c[a+156>>2]=0;i=b;return}function oP(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;c[d>>2]=0;f=c[(xt()|0)+12>>2]|0;g=Lc[c[(c[f>>2]|0)+20>>2]&255](f)|0;f=c[g+(b<<3)+84>>2]|0;h=c[g+(b<<3)+88>>2]|0;if((h|0)>0){j=0}else{i=e;return}while(1){k=f+(j<<5)|0;j=j+1|0;if((R2a(a,c[k>>2]|0)|0)==0){break}if((j|0)>=(h|0)){l=5;break}}if((l|0)==5){i=e;return}c[d>>2]=k;i=e;return}function pP(a,d){a=a|0;d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f=i;i=i+16|0;g=f;h=f+4|0;c[g>>2]=d;if(d>>>0>65535){j=a;while(1){k=c[j+16>>2]|0;if((k|0)==1){l=M1a(g,c[j+20>>2]|0,c[j+24>>2]|0,6,249)|0;if((l|0)!=0){m=7;break}}else if((k|0)==2?(n=M1a(g,c[j+20>>2]|0,c[j+24>>2]|0,8,248)|0,(n|0)!=0):0){m=5;break}k=c[j+28>>2]|0;if((k|0)==0){o=0;m=19;break}j=j+(k<<5)|0}if((m|0)==5){o=(e[n+6>>1]|0)+(c[g>>2]|0)-(e[n+2>>1]|0)&65535;i=f;return o|0}else if((m|0)==7){o=b[l+4>>1]|0;i=f;return o|0}else if((m|0)==19){i=f;return o|0}}b[h>>1]=d;d=c[a+8>>2]|0;if((d|0)==0){o=0;i=f;return o|0}l=a;a=d;while(1){d=c[l+4>>2]|0;if((d|0)==2){p=M1a(h,a,c[l+12>>2]|0,6,251)|0;if((p|0)!=0){m=16;break}}else if((d|0)==1?(q=M1a(h,a,c[l+12>>2]|0,4,250)|0,(q|0)!=0):0){m=14;break}d=c[l+28>>2]|0;if((d|0)==0){o=0;m=19;break}a=c[l+(d<<5)+8>>2]|0;if((a|0)==0){o=0;m=19;break}else{l=l+(d<<5)|0}}if((m|0)==14){o=b[q+2>>1]|0;i=f;return o|0}else if((m|0)==16){o=(e[h>>1]|0)+(e[p+4>>1]|0)-(e[p>>1]|0)&65535;i=f;return o|0}else if((m|0)==19){i=f;return o|0}return 0}function qP(a,b){a=a|0;b=b|0;var d=0,f=0,g=0,h=0;d=i;f=c[a>>2]|0;a=f>>>16;g=e[b>>1]|0;if(!(a>>>0<g>>>0)){if(!(a>>>0>g>>>0)){g=f&65535;if(g>>>0<(e[b+2>>1]|0)>>>0){h=-1}else{h=g>>>0>(e[b+4>>1]|0)>>>0&1}}else{h=1}}else{h=-1}i=d;return h|0}function rP(a,b){a=a|0;b=b|0;var d=0,f=0,g=0;d=i;f=c[a>>2]|0;a=(e[b>>1]|0)<<16|(e[b+2>>1]|0);if(f>>>0<a>>>0){g=-1;i=d;return g|0}g=f>>>0>a>>>0&1;i=d;return g|0}function sP(a,b){a=a|0;b=b|0;return(e[a>>1]|0)-(e[b>>1]|0)|0}function tP(a,c){a=a|0;c=c|0;var d=0,f=0,g=0;d=i;f=b[a>>1]|0;if((f&65535)<(e[c>>1]|0)){g=-1;i=d;return g|0}g=(f&65535)>(e[c+2>>1]|0)&1;i=d;return g|0}function uP(a,d){a=a|0;d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f=i;g=d&65535;h=a;a:while(1){a=c[h+4>>2]|0;if((a|0)==2){j=c[h+8>>2]|0;k=c[h+12>>2]|0;l=j+(k*3<<1)|0;if((k|0)>0){k=j;do{j=b[k+4>>1]|0;m=j&65535;if(!((j&65535)>(d&65535))?(n=e[k>>1]|0,(g|0)<=((e[k+2>>1]|0)+m-n|0)):0){o=10;break a}k=k+6|0}while(k>>>0<l>>>0)}}else if((a|0)==1?(l=c[h+8>>2]|0,k=c[h+12>>2]|0,j=l+(k<<1<<1)|0,(k|0)>0):0){p=l;while(1){l=p+4|0;if((b[p+2>>1]|0)==d<<16>>16){o=6;break a}if(l>>>0<j>>>0){p=l}else{break}}}j=c[h+28>>2]|0;if((j|0)==0){q=0;o=14;break}h=h+(j<<5)|0}if((o|0)==6){q=e[p>>1]|0;i=f;return q|0}else if((o|0)==10){q=g-m+n|0;i=f;return q|0}else if((o|0)==14){i=f;return q|0}return 0}function vP(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=c[(xt()|0)+12>>2]|0;g=Lc[c[(c[f>>2]|0)+20>>2]&255](f)|0;c[b>>2]=c[g+(a<<3)+124>>2];c[d>>2]=c[g+(a<<3)+128>>2];i=e;return}function wP(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;k=i;i=i+224|0;l=k+56|0;m=k+184|0;n=k+80|0;o=k+48|0;p=k+40|0;q=k+32|0;r=k+24|0;s=k+16|0;t=k+8|0;u=k;v=k+64|0;c[l>>2]=669016;c[l+4>>2]=1;w=eI(b,l)|0;l=0;do{if(l>>>0<e>>>0){x=d+l|0}else{x=669024+(l-e)|0}a[m+l>>0]=a[x>>0]|0;l=l+1|0}while((l|0)!=32);b1a(n);c1a(n,m,32);c[p>>2]=669056;c[p+4>>2]=1;aI(o,b,p);p=c[o>>2]|0;m=(p|0)==0;if(m){y=0}else{y=c[p+4>>2]|0}c1a(n,m?1305928:p+12|0,y);c[r>>2]=669064;c[r+4>>2]=1;c[q>>2]=eI(b,r)|0;c1a(n,q,4);if((j|0)!=0){HH(s,j,0);j=c[s>>2]|0;q=(j|0)==0;if(q){z=0}else{z=c[j+4>>2]|0}c1a(n,q?1305928:j+12|0,z);dka(s)}s=(w|0)>2;if((h|0)==0&s?(c[t>>2]=669072,c[t+4>>2]=15,(fI(b,t,1)|0)==0):0){c[u>>2]=-1;c1a(n,u,4)}d1a(n,v);n=g>>>0>16?16:g;if(s){A=0}else{f3a(f|0,0,g|0)|0;c3a(f|0,v|0,n|0)|0;dka(o);i=k;return}do{e1a(v,n,v);A=A+1|0}while((A|0)<50);f3a(f|0,0,g|0)|0;c3a(f|0,v|0,n|0)|0;dka(o);i=k;return}function xP(a){a=a|0;var b=0;a=i;b=u2a(48)|0;c[b>>2]=669200;c[b+44>>2]=0;c[b+40>>2]=0;c[b+36>>2]=0;i=a;return b|0}function yP(a){a=a|0;var b=0;b=i;v2a(a);i=b;return}function zP(a){a=a|0;return}function AP(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;c[a+12>>2]=b;if((BP(a,d)|0)==0){f=0;i=e;return f|0}if((c[a+28>>2]|0)==0){f=1;i=e;return f|0}f=CP(a,c[a+64>>2]|0)|0;i=e;return f|0}function BP(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;i=i+80|0;e=d+64|0;f=d+56|0;g=d+48|0;h=d+40|0;j=d+36|0;k=d+32|0;l=d+24|0;m=d+16|0;n=d+8|0;o=d;c[a+16>>2]=b;c[a+20>>2]=0;c[e>>2]=669136;c[e+4>>2]=1;p=a+4|0;c[p>>2]=eI(b,e)|0;c[f>>2]=669016;c[f+4>>2]=1;c[a+8>>2]=eI(b,f)|0;c[g>>2]=669064;c[g+4>>2]=1;c[a+24>>2]=fI(b,g,-1)|0;if((c[p>>2]|0)<4){c[j>>2]=0;oe(h,j);p=FP(b,h,a+28|0,a+64|0)|0;dka(j);q=p;i=d;return q|0}c[l>>2]=669144;c[l+4>>2]=4;aI(k,b,l);c[n>>2]=669152;c[n+4>>2]=4;aI(m,b,n);if(wka(c[k>>2]|0,m)|0){oe(o,m);r=(FP(b,o,a+28|0,a+64|0)|0)!=0&1}else{r=0}dka(m);dka(k);q=r;i=d;return q|0}function CP(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;i=i+16|0;e=d;hka(e,(c[a+12>>2]|0)+388|0);f=c[e>>2]|0;g=(f|0)==0;h=f+12|0;j=g?0:h;if(g){k=0}else{k=c[f+4>>2]|0}l=a+32|0;if((DP(a,j,k,1,l,b)|0)==0){if(g){m=0}else{m=c[f+4>>2]|0}n=DP(a,j,m,0,l,b)|0;dka(e);i=d;return n|0}if(!g){if((c[f+4>>2]|0)==0){o=h;p=6}}else{o=0;p=6}if((p|0)==6?(DP(a,o,0,0,l,b)|0)==0:0){n=0;dka(e);i=d;return n|0}c[a+20>>2]=1;n=1;dka(e);i=d;return n|0}function DP(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0;h=i;i=i+32|0;if((c[a+8>>2]|0)>4){j=JP(a,b,d,e,f)|0;i=h;return j|0}k=(f|0)==0?h:f;if((e|0)!=0){j=KP(a,b,d,k,g)|0;i=h;return j|0}if((LP(a,b,d,0,k,g)|0)==0){l=(LP(a,b,d,1,k,g)|0)!=0}else{l=1}j=l&1;i=h;return j|0}function EP(a){a=a|0;return c[a+24>>2]|0}function FP(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;f=i;i=i+96|0;g=f+88|0;h=f+80|0;j=f+72|0;k=f+64|0;l=f+56|0;m=f+48|0;n=f+40|0;o=f+32|0;p=f+24|0;q=f+16|0;r=f+8|0;s=f;c[g>>2]=669136;c[g+4>>2]=1;t=eI(a,g)|0;c[h>>2]=669016;c[h+4>>2]=1;eI(a,h)|0;c[d>>2]=1;c[e>>2]=0;if((t|0)<=3){if((t|0)>1){c[s>>2]=669280;c[s+4>>2]=6;u=(fI(a,s,40)|0)/8|0}else{u=5}c[e>>2]=u;v=c[e>>2]|0;w=v>>>0<33;x=w&1;i=f;return x|0}c[j>>2]=669256;c[j+4>>2]=2;u=iI(a,j)|0;if((u|0)==0){i=f;return 0}c[k>>2]=669264;c[k+4>>2]=8;if(Ue(b,k)|0){c[d>>2]=0;v=c[e>>2]|0;w=v>>>0<33;x=w&1;i=f;return x|0}k=iI(u,b)|0;if((k|0)==0){i=f;return 0}if((t|0)==4){c[l>>2]=669280;c[l+4>>2]=6;t=fI(k,l,0)|0;if((t|0)==0){c[m>>2]=669280;c[m+4>>2]=6;y=fI(a,m,128)|0}else{y=t}}else{c[n>>2]=669280;c[n+4>>2]=6;y=fI(a,n,256)|0}c[e>>2]=(((y|0)<40?y<<3:y)|0)/8|0;c[p>>2]=669288;c[p+4>>2]=3;aI(o,k,p);c[q>>2]=669296;c[q+4>>2]=5;p=c[o>>2]|0;if(!(!(vka(p,q)|0)?(c[r>>2]=669304,c[r+4>>2]=5,!(vka(p,r)|0)):0)){c[d>>2]=2}dka(o);v=c[e>>2]|0;w=v>>>0<33;x=w&1;i=f;return x|0}function GP(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[b>>2]=c[a+28>>2];c[d>>2]=a+32;c[e>>2]=c[a+64>>2];return 1}function HP(a){a=a|0;var b=0,c=0,e=0,f=0,g=0;b=i;c=0;e=0;f=0;while(1){g=f<<2;c=q3a((d[a+(g|1)>>0]|0)<<16|(d[a+g>>0]|0)<<24|(d[a+(g|2)>>0]|0)<<8|(d[a+(g|3)>>0]|0)|0,c|0,3,0)|0;f=f+1|0;if((f|0)==4){break}else{e=G}}i=b;return c|0}function IP(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;j=i;i=i+208|0;k=j+80|0;l=j+48|0;m=j+32|0;n=j+16|0;o=j;o1a(k);p1a(k,b,e);p1a(k,f,8);f=(g|0)!=0;if(f){p1a(k,g,48)}r1a(k,l);gla(m);k=m+4|0;p=c[k>>2]|0;q=c[m+8>>2]|0;gla(n);r=w2a(2048,1)|0;s=o+4|0;t=n+4|0;u=p;p=0;v=32;w=q;q=l;x=l+16|0;while(1){if((p|0)>=64?(p|0)>=((d[u+(w+ -1)>>0]|0)+32|0):0){break}l=v+e|0;y=(f?l+48|0:l)<<6;lla(m,y,0);l=c[k>>2]|0;gla(o);z=0;do{nla(o,b,e);nla(o,q,v);if(f){nla(o,g,48)}z=z+1|0}while((z|0)<64);f1a(r,q,16);g1a(r,x);z=c[s>>2]|0;i1a(r,l,z,y);A=HP(l)|0;if((A|0)==0){lla(n,32,0);B=c[t>>2]|0;s1a(l,y,B);C=B;D=32}else if((A|0)==1){lla(n,48,0);A=c[t>>2]|0;y1a(l,y,A);C=A;D=48}else{lla(n,64,0);A=c[t>>2]|0;B1a(l,y,A);C=A;D=64}ila(z);u=l;p=p+1|0;v=D;w=y;q=C;x=C+16|0}v2a(r);if((h|0)==0){E=c[t>>2]|0;ila(E);F=c[k>>2]|0;ila(F);i=j;return}r=h+0|0;h=q+0|0;q=r+32|0;do{a[r>>0]=a[h>>0]|0;r=r+1|0;h=h+1|0}while((r|0)<(q|0));E=c[t>>2]|0;ila(E);F=c[k>>2]|0;ila(F);i=j;return}function JP(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;j=i;i=i+272|0;k=j+56|0;l=j+48|0;m=j+40|0;n=j+32|0;o=j+144|0;p=j+112|0;q=j+24|0;r=j+16|0;s=j+96|0;t=j+8|0;u=j;v=j+80|0;w=j+64|0;x=b+16|0;y=c[x>>2]|0;if((y|0)==0){c[k>>2]=0;z=0;dka(k);i=j;return z|0}c[l>>2]=669056;c[l+4>>2]=1;aI(k,y,l);l=c[k>>2]|0;if((l|0)==0){z=0;dka(k);i=j;return z|0}if((c[l+4>>2]|0)<48){z=0;dka(k);i=j;return z|0}y=c[x>>2]|0;if((y|0)!=0){c[n>>2]=669160;c[n+4>>2]=1;aI(m,y,n);n=c[m>>2]|0;if((n|0)!=0?(c[n+4>>2]|0)>=48:0){y=(g|0)!=0;g=y?l:n;l=g+12|0;A=b+8|0;if((c[A>>2]|0)>5){IP(e,f,g+44|0,y?n+12|0:0,p)}else{o1a(o);p1a(o,e,f);p1a(o,g+44|0,8);if(y){p1a(o,n+12|0,48)}r1a(o,p)}if((Q2a(p,l,32)|0)==0){if((h|0)==0){B=1}else{if((c[A>>2]|0)>5){IP(e,f,g+52|0,y?n+12|0:0,p)}else{o1a(o);p1a(o,e,f);p1a(o,g+52|0,8);if(y){p1a(o,n+12|0,48)}r1a(o,p)}o=c[x>>2]|0;if((o|0)!=0){if(y){c[r>>2]=669168;c[r+4>>2]=2}else{c[r>>2]=669176;c[r+4>>2]=2}aI(q,o,r);r=c[q>>2]|0;if((r|0)!=0?(c[r+4>>2]|0)>=32:0){o=w2a(2048,1)|0;f1a(o,p,32);p=s+0|0;y=p+16|0;do{a[p>>0]=0;p=p+1|0}while((p|0)<(y|0));g1a(o,s);h1a(o,h,r+12|0,32);f1a(o,h,32);g1a(o,s);s=c[x>>2]|0;c[u>>2]=669184;c[u+4>>2]=5;aI(t,s,u);u=c[t>>2]|0;do{if((u|0)!=0?(s=c[u+4>>2]|0,(s|0)!=0):0){p=v+0|0;y=p+16|0;do{a[p>>0]=0;p=p+1|0}while((p|0)<(y|0));c3a(v|0,u+12|0,(s>>>0<16?s:16)|0)|0;h1a(o,w,v,16);v2a(o);if((a[w+9>>0]|0)==97){if((a[w+10>>0]|0)!=100){C=0;break}if((a[w+11>>0]|0)!=98){C=0;break}if((d[w+2>>0]<<16|d[w+3>>0]<<24|d[w+1>>0]<<8|d[w>>0]|0)!=(c[b+24>>2]|0)){C=0;break}x=a[w+8>>0]|0;if(x<<24>>24==70){D=37}else if(x<<24>>24==84){if((Lc[c[(c[b>>2]|0)+24>>2]&255](b)|0)==0){C=0;break}if(x<<24>>24==70){D=37}}if((D|0)==37?(Lc[c[(c[b>>2]|0)+24>>2]&255](b)|0)!=0:0){C=0;break}C=1}else{C=0}}else{C=0}}while(0);dka(t);E=C}else{E=0}}else{c[q>>2]=0;E=0}dka(q);B=E}}else{B=0}}else{B=0}}else{c[m>>2]=0;B=0}dka(m);z=B;dka(k);i=j;return z|0}function KP(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;i=i+16|0;h=g;MP(h,a,b,d,f);d=c[h>>2]|0;b=(d|0)==0;j=b?0:d+12|0;if(b){k=0}else{k=c[d+4>>2]|0}if((LP(a,j,k,0,e,f)|0)!=0){l=1;dka(h);i=g;return l|0}if(b){m=0}else{m=c[d+4>>2]|0}l=LP(a,j,m,1,e,f)|0;dka(h);i=g;return l|0}function LP(b,e,f,g,h,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;k=i;i=i+224|0;l=k+16|0;m=k+8|0;n=k+184|0;o=k+152|0;p=k+120|0;q=k+20|0;r=k;s=b+16|0;t=c[s>>2]|0;u=b+12|0;wP(t,e,f,h,j,g,BJ(c[u>>2]|0)|0);g=c[s>>2]|0;if((g|0)==0){c[l>>2]=0;v=0;dka(l);i=k;return v|0}c[m>>2]=669160;c[m+4>>2]=1;aI(l,g,m);m=c[l>>2]|0;if((m|0)==0){v=0;dka(l);i=k;return v|0}g=c[m+4>>2]|0;if((g|0)<16){v=0;dka(l);i=k;return v|0}if((c[b+8>>2]|0)==2){w=n+0|0;b=669024|0;x=w+32|0;do{a[w>>0]=a[b>>0]|0;w=w+1|0;b=b+1|0}while((w|0)<(x|0));$0a(n,32,h,j);v=(Q2a(m+12|0,n,16)|0)==0&1;dka(l);i=k;return v|0}b=g>>>0<32?g:32;w=o+0|0;x=w+32|0;do{a[w>>0]=0;w=w+1|0}while((w|0)<(x|0));w=p+0|0;x=w+32|0;do{a[w>>0]=0;w=w+1|0}while((w|0)<(x|0));c3a(o|0,((m|0)==0?1305928:m+12|0)|0,b|0)|0;b=(j|0)>0;m=19;while(1){if(b){w=0;do{a[p+w>>0]=(d[h+w>>0]|0)^m;w=w+1|0}while((w|0)!=(j|0))}$0a(o,32,p,j);if((m|0)>0){m=m+ -1|0}else{break}}b1a(q);c1a(q,669024,32);m=BJ(c[u>>2]|0)|0;if((m|0)!=0){HH(r,m,0);m=c[r>>2]|0;u=(m|0)==0;if(u){y=0}else{y=c[m+4>>2]|0}c1a(q,u?1305928:m+12|0,y);dka(r)}d1a(q,n);v=(Q2a(o,n,16)|0)==0&1;dka(l);i=k;return v|0}function MP(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;j=i;i=i+192|0;k=j+8|0;l=j;m=j+160|0;n=j+144|0;o=j+112|0;p=j+48|0;q=j+16|0;r=c[e+16>>2]|0;c[l>>2]=669056;c[l+4>>2]=1;aI(k,r,l);l=0;do{if(l>>>0<g>>>0){s=f+l|0}else{s=669024+(l-g)|0}a[m+l>>0]=a[s>>0]|0;l=l+1|0}while((l|0)!=32);e1a(m,32,n);m=e+8|0;if((c[m>>2]|0)>2){l=0;do{e1a(n,16,n);l=l+1|0}while((l|0)<50)}l=o+0|0;s=l+32|0;do{a[l>>0]=0;l=l+1|0}while((l|0)<(s|0));c3a(o|0,n|0,(h>>>0>16?16:h)|0)|0;n=c[k>>2]|0;g=(n|0)==0;if(g){t=0}else{t=c[n+4>>2]|0}f=(t|0)>32?32:t;l=p+0|0;s=l+64|0;do{a[l>>0]=0;l=l+1|0}while((l|0)<(s|0));c3a(p|0,(g?1305928:n+12|0)|0,f|0)|0;if((c[m>>2]|0)==2){$0a(p,f,o,h);u=32}else{m=e+64|0;e=19;while(1){l=q+0|0;s=l+32|0;do{a[l>>0]=0;l=l+1|0}while((l|0)<(s|0));n=c[m>>2]|0;if((n|0)>0){g=0;do{a[q+g>>0]=d[o+g>>0]^e;g=g+1|0}while((g|0)<(n|0))}$0a(p,f,q,h);if((e|0)>0){e=e+ -1|0}else{u=32;break}}}while(1){if((u|0)==0){v=0;w=18;break}e=u+ -1|0;if((a[669024+e>>0]|0)==(a[p+e>>0]|0)){u=e}else{v=u;w=18;break}}if((w|0)==18){gka(b,p,v);dka(k);i=j;return}}function NP(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b;e=c[a+16>>2]|0;c[d>>2]=669072;c[d+4>>2]=15;a=hI(e,d,1)|0;i=b;return a|0}function OP(){var a=0,b=0,d=0;a=i;b=u2a(68)|0;c[b>>2]=669096;d=b+4|0;c[b+64>>2]=0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;c[d+24>>2]=0;i=a;return b|0}function PP(b,e,f,g,h,j,k,l){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;m=i;i=i+80|0;n=m+64|0;o=m+32|0;p=m+16|0;q=m;r=b+40|0;s=c[r>>2]|0;if((s|0)==2){t=c[b+36>>2]|0;if((t|0)==32){u=n;v=b+4|0;w=32}else{x=t;y=6}}else if((s|0)==0){c3a(k|0,h|0,j|0)|0;i=m;return}else{x=c[b+36>>2]|0;y=6}if((y|0)==6){y=b+4|0;c3a(o|0,y|0,x|0)|0;t=o+x|0;a[o+(x+1)>>0]=f>>>8;a[o+(x+2)>>0]=f>>>16;z=o+(x+3)|0;a[o+(x+4)>>0]=g>>>8;A=f&65535;a[t>>0]=A;a[t+1>>0]=A>>8;a[t+2>>0]=f>>>16;f=g&65535;a[z>>0]=f;a[z+1>>0]=f>>8;f=(s|0)==2;if(f){s=o+(x+5)|0;a[s>>0]=1416380787;a[s+1>>0]=5532737;a[s+2>>0]=21612;a[s+3>>0]=84}e1a(o,(f?9:5)+x|0,n);x=c[b+36>>2]|0;f=x+5|0;o=(f|0)>16?16:f;if((c[r>>2]|0)==2){u=n;v=y;w=x}else{if((k|0)!=(h|0)){c3a(k|0,h|0,j|0)|0}$0a(k,c[l>>2]|0,n,o);i=m;return}}o=b+44|0;f1a(c[o>>2]|0,(w|0)==32?v:u,w);if((e|0)==0){g1a(c[o>>2]|0,h);e=j+ -16|0;h1a(c[o>>2]|0,k,h+16|0,e);c[l>>2]=e;c[l>>2]=e-(d[k+(j+ -17)>>0]|0);i=m;return}else{B=0}do{a[p+B>>0]=V2a()|0;B=B+1|0}while((B|0)!=16);g1a(c[o>>2]|0,p);B=k+0|0;e=p+0|0;p=B+16|0;do{a[B>>0]=a[e>>0]|0;B=B+1|0;e=e+1|0}while((B|0)<(p|0));e=j&-16;i1a(c[o>>2]|0,k+16|0,h,e);B=j&15;c3a(q|0,h+e|0,B|0)|0;h=16-B|0;f3a(q+B|0,h&255|0,h|0)|0;i1a(c[o>>2]|0,k+(e+16)|0,q,16);c[l>>2]=e+32;i=m;return}function QP(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;g=i;i=i+64|0;h=g+16|0;j=g;k=b+40|0;l=c[k>>2]|0;if((l|0)==0){m=b;i=g;return m|0}else if((l|0)==2){n=c[b+36>>2]|0;if((n|0)==32){o=w2a(1,2072)|0;c[o+2048>>2]=1;c[o+2068>>2]=0;f1a(o,b+4|0,32);if((f|0)==0){m=o;i=g;return m|0}else{p=0}do{a[o+(p+2052)>>0]=V2a()|0;p=p+1|0}while((p|0)!=16);g1a(o,o+2052|0);m=o;i=g;return m|0}else{q=n}}else{q=c[b+36>>2]|0}c3a(h|0,b+4|0,q|0)|0;n=h+q|0;o=d&65535;a[n>>0]=o;a[n+1>>0]=o>>8;a[n+2>>0]=d>>>16;d=h+(q+3)|0;n=e&65535;a[d>>0]=n;a[d+1>>0]=n>>8;n=(l|0)==2;if(n){l=h+(q+5)|0;a[l>>0]=1416380787;a[l+1>>0]=5532737;a[l+2>>0]=21612;a[l+3>>0]=84}e1a(h,(n?9:5)+q|0,j);q=(c[b+36>>2]|0)+5|0;if((c[k>>2]|0)!=2){k=w2a(1040,1)|0;Z0a(k,j,(q|0)>16?16:q);m=k;i=g;return m|0}k=w2a(1,2072)|0;c[k+2048>>2]=1;c[k+2068>>2]=0;f1a(k,j,16);if((f|0)==0){m=k;i=g;return m|0}else{r=0}do{a[k+(r+2052)>>0]=V2a()|0;r=r+1|0}while((r|0)!=16);g1a(k,k+2052|0);m=k;i=g;return m|0}function RP(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;h=i;i=i+16|0;j=h;if((b|0)==0){k=0;i=h;return k|0}l=c[a+40>>2]|0;if((l|0)==0){nla(f,d,e);k=1;i=h;return k|0}else if((l|0)==1){l=c[f+8>>2]|0;nla(f,d,e);_0a(b,(c[f+4>>2]|0)+l|0,e);k=1;i=h;return k|0}else{l=b+2048|0;a=b+2052|0;if(!((c[l>>2]|0)==0|(g|0)==0)){nla(f,a,16);c[l>>2]=0}m=b+2068|0;n=(g|0)!=0;g=c[m>>2]|0;o=e;p=0;while(1){q=16-g|0;r=q>>>0>o>>>0?o:q;c3a(b+(g+2052)|0,d+p|0,r|0)|0;p=r+p|0;q=o;o=o-r|0;s=r+(c[m>>2]|0)|0;c[m>>2]=s;do{if((s|0)==16){if(!n?(c[l>>2]|0)!=0:0){g1a(b,a);c[l>>2]=0;c[m>>2]=0;t=0;break}if(p>>>0<e>>>0){if(n){i1a(b,j,a,16)}else{h1a(b,j,a,16)}nla(f,j,16);c[m>>2]=0;t=0}else{t=16}}else{t=s}}while(0);if((q|0)==(r|0)){k=1;break}else{g=t}}i=h;return k|0}return 0}function SP(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;i=i+32|0;h=g+16|0;j=g;if((d|0)==0){k=0;i=g;return k|0}l=c[b+40>>2]|0;if((l|0)==0){k=1;i=g;return k|0}else if((l|0)==1){v2a(d);k=1;i=g;return k|0}else{l=d+2068|0;b=c[l>>2]|0;m=(b|0)==16;if((f|0)==0){if(m?(h1a(d,j,d+2052|0,16),f=a[j+15>>0]|0,(f&255)<17):0){nla(e,j,16-(f&255)|0)}}else{if(m){m=d+2052|0;i1a(d,h,m,16);nla(e,h,16);c[l>>2]=0;n=h;o=m;p=0}else{n=h;o=d+2052|0;p=b}b=16-p|0;f3a(d+(p+2052)|0,b&255|0,b|0)|0;i1a(d,n,o,16);nla(e,n,16)}v2a(d);k=1;i=g;return k|0}return 0}function TP(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=id[c[(c[a>>2]|0)+40>>2]&511](a,b,d,0)|0;i=e;return f|0}function UP(a,b){a=a|0;b=b|0;return((c[a+40>>2]|0)==2?b+ -16|0:b)|0}function VP(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;b=i;i=i+16|0;e=b;f=a+40|0;g=a+36|0;if((id[c[(c[d>>2]|0)+20>>2]&511](d,f,e,g)|0)!=0?(d=c[g>>2]|0,!(d>>>0>32)):0){if((c[f>>2]|0)!=0?(c3a(a+4|0,c[e>>2]|0,d|0)|0,(c[f>>2]|0)==2):0){c[a+44>>2]=w2a(2048,1)|0;h=1}else{h=1}}else{h=0}i=b;return h|0}function WP(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=i;h=Wc[c[(c[a>>2]|0)+44>>2]&31](a,b,d,e,f,0)|0;i=g;return h|0}function XP(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=id[c[(c[a>>2]|0)+48>>2]&511](a,b,d,0)|0;i=e;return f|0}function YP(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;return((c[a+40>>2]|0)==2?f+32|0:f)|0}function ZP(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0;j=i;Uc[c[(c[a>>2]|0)+36>>2]&7](a,1,b,d,e,f,g,h);i=j;return 1}function _P(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;i=i+16|0;g=f;gla(g);h=Qc[c[(c[a>>2]|0)+16>>2]&255](a,b,d)|0;d=c[e>>2]|0;b=(d|0)==0;if(b){j=0}else{j=c[d+4>>2]|0}ed[c[(c[a>>2]|0)+20>>2]&127](a,h,b?0:d+12|0,j,g)|0;Qc[c[(c[a>>2]|0)+24>>2]&255](a,h,g)|0;h=g+4|0;pka(e,c[h>>2]|0,c[g+8>>2]|0);ila(c[h>>2]|0);i=f;return}function $P(a){a=a|0;var b=0;b=i;aQ(a);v2a(a);i=b;return}function aQ(a){a=a|0;var b=0;b=i;c[a>>2]=669200;v2a(c[a+44>>2]|0);i=b;return}function bQ(a){a=a|0;return c[a+20>>2]|0}function cQ(a){a=a|0;return a|0}\n\n\n\nfunction x$(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0;g=i;i=i+16|0;h=g;j=C0(24,c[b>>2]|0)|0;k=b+60|0;l=b+64|0;l0(j,c[k>>2]|0,c[l>>2]|0);c[j>>2]=c[b>>2];m=c[j+16>>2]|0;if((m|0)==0){if((j|0)!=0){o0(j);D0(j)}n=c[b>>2]|0;o=c[(c[n>>2]|0)+24>>2]|0;p=c[l>>2]|0;c[h>>2]=c[k>>2];c[h+4>>2]=p;ld[o&255](n,708008,h);q=0;i=g;return q|0}h=c[j+12>>2]|0;n=c[k>>2]|0;k=(n+7|0)>>>3;o=k+ -1|0;if((c[l>>2]|0)==0){q=j;i=g;return q|0}p=b+72|0;b=0-(h<<1)|0;r=0-h|0;s=b|1;t=1-h|0;u=(o|0)>0;v=(n-(o<<3)|0)>0;w=f+1832|0;x=n+8-(k<<3)|0;k=0;n=0;y=m;while(1){if((c[p>>2]|0)==0){z=k}else{z=(B$(e,w)|0)^k}do{if((z|0)==1){r0(j,n,n+ -1|0)}else{if(n>>>0>1){m=d[y+b>>0]|0;A=d[y+r>>0]|0;B=A>>>3&28|m<<1&384;C=m<<9;if(u){m=C;D=B;E=0;F=A;G=y+s|0;H=y+t|0;while(1){I=(d[G>>0]|0)<<1|m;J=d[H>>0]|0|F<<8;K=D;L=0;M=7;while(1){N=B$(e,f+(K<<3)|0)|0;L=N<<M|L&255;K=I>>>M&128|K<<1&890|J>>>(M+3|0)&4|N;if((M|0)<=0){break}else{M=M+ -1|0}}a[y+E>>0]=L;E=E+1|0;M=I<<8;if((E|0)>=(o|0)){O=M;P=K;Q=J;break}else{m=M;D=K;F=J;G=G+1|0;H=H+1|0}}}else{O=C;P=B;Q=A}H=Q<<8;if(v){G=P;F=0;D=0;while(1){m=B$(e,f+(G<<3)|0)|0;E=7-D|0;F=m<<E|F&255;M=D+1|0;if((M|0)==(x|0)){break}else{G=O>>>E&128|G<<1&890|H>>>(10-D|0)&4|m;D=M}}R=F&255}else{R=0}a[y+o>>0]=R;break}D=y+r|0;H=(n&1|0)!=0;if(H){S=d[D>>0]|0;T=y+t|0}else{S=0;T=D}D=S>>>3&28;if(u){G=D;A=0;B=S;C=T;while(1){if(H){U=d[C>>0]|0|B<<8;V=C+1|0}else{U=B;V=C}M=G;m=0;E=7;while(1){N=B$(e,f+(M<<3)|0)|0;m=N<<E|m&255;M=U>>>(E+3|0)&4|M<<1&890|N;if((E|0)<=0){break}else{E=E+ -1|0}}a[y+A>>0]=m;A=A+1|0;if((A|0)>=(o|0)){W=M;X=U;break}else{G=M;B=U;C=V}}}else{W=D;X=S}C=X<<8;if(v){B=W;G=0;A=0;while(1){H=B$(e,f+(B<<3)|0)|0;G=H<<7-A|G&255;F=A+1|0;if((F|0)==(x|0)){break}else{B=C>>>(10-A|0)&4|B<<1&890|H;A=F}}Y=G&255}else{Y=0}a[y+o>>0]=Y}}while(0);n=n+1|0;if(!(n>>>0<(c[l>>2]|0)>>>0)){q=j;break}else{k=z;y=y+h|0}}i=g;return q|0}function y$(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;f=i;g=C0(24,c[b>>2]|0)|0;h=b+60|0;j=b+64|0;l0(g,c[h>>2]|0,c[j>>2]|0);c[g>>2]=c[b>>2];s0(g,0);if((c[j>>2]|0)==0){i=f;return g|0}k=b+72|0;l=b+76|0;m=b+84|0;n=b+85|0;o=b+80|0;b=e+1832|0;p=0;q=0;while(1){if((c[k>>2]|0)==0){r=p}else{r=(B$(d,b)|0)^p}a:do{if((r|0)!=1){s=q+ -2|0;t=q+ -1|0;if((c[h>>2]|0)!=0){u=p0(g,0,t)|0;v=p0(g,1,t)|0;w=p0(g,0,s)|0;x=w<<1|(p0(g,1,s)|0);w=u<<1|v;v=0;u=0;while(1){if((c[l>>2]|0)!=0?(p0(c[o>>2]|0,u,q)|0)!=0:0){y=0}else{z=B$(d,e+((v|x<<7|w<<3|(p0(g,(a[m>>0]|0)+u|0,(a[n>>0]|0)+q|0)|0)<<2)<<3)|0)|0;if((z|0)==0){y=0}else{q0(g,u,q,z);y=z}}z=u+2|0;A=u+1|0;if(!(A>>>0<(c[h>>2]|0)>>>0)){break a}B=p0(g,z,t)|0;x=(p0(g,z,s)|0|x<<1)&7;w=(B|w<<1)&15;v=(y|v<<1)&3;u=A}}}else{r0(g,q,q+ -1|0)}}while(0);q=q+1|0;if(!(q>>>0<(c[j>>2]|0)>>>0)){break}else{p=r}}i=f;return g|0}function z$(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0;g=i;i=i+16|0;h=g;j=C0(24,c[b>>2]|0)|0;k=b+60|0;l=b+64|0;l0(j,c[k>>2]|0,c[l>>2]|0);c[j>>2]=c[b>>2];m=c[j+16>>2]|0;if((m|0)==0){if((j|0)!=0){o0(j);D0(j)}n=c[b>>2]|0;o=c[(c[n>>2]|0)+24>>2]|0;p=c[l>>2]|0;c[h>>2]=c[k>>2];c[h+4>>2]=p;ld[o&255](n,708008,h);q=0;i=g;return q|0}h=c[j+12>>2]|0;n=c[k>>2]|0;k=(n+7|0)>>>3;o=k+ -1|0;if((c[l>>2]|0)==0){q=j;i=g;return q|0}p=b+72|0;b=0-h|0;r=1-h|0;s=(o|0)>0;t=(n-(o<<3)|0)>0;u=f+3240|0;v=n+8-(k<<3)|0;k=0;n=0;w=m;while(1){if((c[p>>2]|0)==0){x=k}else{x=(B$(e,u)|0)^k}do{if((x|0)==1){r0(j,n,n+ -1|0)}else{if((n|0)==0){if(s){m=0;y=0;while(1){z=m;A=0;B=7;while(1){C=B$(e,f+(z<<3)|0)|0;A=C<<B|A&255;z=C|z<<1&1006;if((B|0)<=0){break}else{B=B+ -1|0}}a[w+y>>0]=A;y=y+1|0;if((y|0)>=(o|0)){D=z;break}else{m=z}}}else{D=0}if(t){m=D;y=0;B=0;while(1){C=B$(e,f+(m<<3)|0)|0;y=C<<7-B|y&255;B=B+1|0;if((B|0)==(v|0)){break}else{m=C|m<<1&1006}}E=y&255}else{E=0}a[w+o>>0]=E;break}m=d[w+b>>0]|0;B=m>>>1&112;C=m<<8;if(s){m=C;F=B;G=0;H=w+r|0;while(1){I=d[H>>0]|0|m;J=F;K=0;L=7;while(1){M=B$(e,f+(J<<3)|0)|0;K=M<<L|K&255;J=I>>>(L+1|0)&16|J<<1&1006|M;if((L|0)<=0){break}else{L=L+ -1|0}}a[w+G>>0]=K;G=G+1|0;L=I<<8;if((G|0)>=(o|0)){N=L;O=J;break}else{m=L;F=J;H=H+1|0}}}else{N=C;O=B}if(t){H=O;F=0;m=0;while(1){G=B$(e,f+(H<<3)|0)|0;F=G<<7-m|F&255;y=m+1|0;if((y|0)==(v|0)){break}else{H=N>>>(8-m|0)&16|H<<1&1006|G;m=y}}P=F&255}else{P=0}a[w+o>>0]=P}}while(0);n=n+1|0;if(!(n>>>0<(c[l>>2]|0)>>>0)){q=j;break}else{k=x;w=w+h|0}}i=g;return q|0}function A$(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;f=i;g=C0(24,c[b>>2]|0)|0;h=b+60|0;j=b+64|0;l0(g,c[h>>2]|0,c[j>>2]|0);c[g>>2]=c[b>>2];s0(g,0);if((c[j>>2]|0)==0){i=f;return g|0}k=b+72|0;l=b+76|0;m=b+84|0;n=b+85|0;o=b+80|0;b=e+3240|0;p=0;q=0;while(1){if((c[k>>2]|0)==0){r=p}else{r=(B$(d,b)|0)^p}s=q+ -1|0;a:do{if((r|0)!=1){if((c[h>>2]|0)!=0){t=p0(g,0,s)|0;u=t<<1|(p0(g,1,s)|0);t=0;v=0;while(1){if((c[l>>2]|0)!=0?(p0(c[o>>2]|0,v,q)|0)!=0:0){w=0}else{x=B$(d,e+((u<<5|t|(p0(g,(a[m>>0]|0)+v|0,(a[n>>0]|0)+q|0)|0)<<4)<<3)|0)|0;if((x|0)==0){w=0}else{q0(g,v,q,x);w=x}}x=v+1|0;if(!(x>>>0<(c[h>>2]|0)>>>0)){break a}u=(p0(g,v+2|0,s)|0|u<<1)&31;t=(w|t<<1)&15;v=x}}}else{r0(g,q,s)}}while(0);q=q+1|0;if(!(q>>>0<(c[j>>2]|0)>>>0)){break}else{p=r}}i=f;return g|0}function B$(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=i;e=b+4|0;f=c[e>>2]|0;g=a+12|0;h=c[710360+(f<<4)>>2]|0;j=(c[g>>2]|0)-h|0;c[g>>2]=j;k=a+8|0;l=c[k>>2]|0;if(!(l>>>16>>>0<j>>>0)){c[k>>2]=l-(j<<16);c[g>>2]=h;l=c[b>>2]|0;if(j>>>0<h>>>0){m=l;n=710364+(f<<4)|0}else{o=1-l|0;if((c[710372+(f<<4)>>2]|0)==1){c[b>>2]=o}m=o;n=710368+(f<<4)|0}c[e>>2]=c[n>>2];n=a+16|0;o=c[n>>2]|0;do{if((o|0)==0){o$(a);p=c[n>>2]|0}else{p=o}l=c[g>>2]<<1;c[g>>2]=l;c[k>>2]=c[k>>2]<<1;o=p+ -1|0;c[n>>2]=o}while((l&32768|0)==0);q=m;i=d;return q|0}if((j&32768|0)!=0){q=c[b>>2]|0;i=d;return q|0}m=c[b>>2]|0;if(j>>>0<h>>>0){h=1-m|0;if((c[710372+(f<<4)>>2]|0)==1){c[b>>2]=h}r=h;s=710368+(f<<4)|0}else{r=m;s=710364+(f<<4)|0}c[e>>2]=c[s>>2];s=a+16|0;e=c[s>>2]|0;do{if((e|0)==0){o$(a);t=c[s>>2]|0}else{t=e}f=c[g>>2]<<1;c[g>>2]=f;c[k>>2]=c[k>>2]<<1;e=t+ -1|0;c[s>>2]=e}while((f&32768|0)==0);q=r;i=d;return q|0}function C$(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;g=b+4|0;h=c[g>>2]|0;j=b+8|0;if((h|0)!=0?(c[j>>2]|0)!=0:0){if((c[b+12>>2]|0)!=0){if((c[b+20>>2]|0)==0?(h|0)==(c[(c[b+16>>2]|0)+4>>2]|0):0){k=F$(b,d,e)|0;i=f;return k|0}k=G$(b,d,e)|0;i=f;return k|0}if((((((a[b+32>>0]|0)==-1?(a[b+33>>0]|0)==-1:0)?(a[b+34>>0]|0)==-1:0)?(a[b+35>>0]|0)==-1:0)?(c[b+20>>2]|0)==0:0)?(h|0)==(c[(c[b+16>>2]|0)+4>>2]|0):0){k=D$(b,d,e)|0;i=f;return k|0}k=E$(b,d,e)|0;i=f;return k|0}e=C0(24,c[b>>2]|0)|0;l0(e,c[g>>2]|0,c[j>>2]|0);c[e>>2]=c[b>>2];k=e;i=f;return k|0}function D$(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0;g=i;i=i+16|0;h=g;j=c[b+4>>2]|0;k=c[b+8>>2]|0;l=C0(24,c[b>>2]|0)|0;l0(l,j,k);c[l>>2]=c[b>>2];m=c[l+16>>2]|0;if((m|0)==0){if((l|0)!=0){o0(l);D0(l)}n=c[b>>2]|0;o=c[(c[n>>2]|0)+24>>2]|0;c[h>>2]=j;c[h+4>>2]=k;ld[o&255](n,708096,h);p=0;i=g;return p|0}h=b+16|0;n=c[h>>2]|0;o=c[n+16>>2]|0;q=c[l+12>>2]|0;r=0-q|0;s=c[n+12>>2]|0;t=c[n+4>>2]|0;u=c[n+8>>2]|0;n=b+24|0;v=c[n>>2]|0;w=u+ -1|0;if((v|0)<(1-u|0)|(v|0)>(w|0)){c[n>>2]=0;x=0}else{x=v}v=ca(x,0-s|0)|0;if((k|0)<=0){p=l;i=g;return p|0}x=b+28|0;b=u+1|0;y=v-s|0;z=v+s|0;A=(j|0)>0;B=1-q|0;C=1-s+v|0;D=v+1|0;E=s+1+v|0;F=f+128|0;G=~j;H=0;I=0;J=m;m=o;while(1){if((c[x>>2]|0)==0){K=H}else{K=(B$(e,F)|0)^H}o=(I|0)>0;if(o){L=(d[J+r>>0]|0)<<4}else{L=0}M=I-(c[n>>2]|0)|0;do{if((M|0)>0){N=(M|0)<(u|0);O=(M|0)<(w|0);if((M|0)<(b|0)){P=d[m+y>>0]|0;if(N){Q=O;R=P;S=1;T=18;break}else{U=O;V=P;W=1;T=19;break}}else{if(N){Q=O;R=0;S=0;T=18;break}else{U=O;V=0;W=0;T=19;break}}}else{O=(M|0)>-2&(M|0)<(w|0);if((M|0)>-1&(M|0)<(u|0)){Q=O;R=0;S=0;T=18}else{U=O;V=0;W=0;T=19}}}while(0);if((T|0)==18){T=0;M=d[m+v>>0]|0;if(Q){X=1;Y=M;Z=S;_=R;T=20}else{$=1;aa=0;ba=S;da=R;ea=M;fa=0}}else if((T|0)==19){T=0;if(U){X=0;Y=0;Z=W;_=V;T=20}else{$=0;aa=0;ba=W;da=V;ea=0;fa=0}}if((T|0)==20){T=0;$=X;aa=1;ba=Z;da=_;ea=Y;fa=d[m+z>>0]|0}M=da&192|L&7168|ea>>>3&24|fa>>>6;if((K|0)==0){if(A){O=M;N=G;P=L;ga=da;ha=ea;ia=fa;ja=0;while(1){ka=(N|0)>-9?~N:8;la=j-ja|0;if(o){if((ja+8|0)<(j|0)){ma=(d[J+(B+(ja>>3))>>0]|0)<<4}else{ma=0}na=ma|P<<8}else{na=P}if((I|0)<=(b+(c[n>>2]|0)|0)){if(ba){if((ja+8|0)<(t|0)){oa=d[m+(C+(ja>>3))>>0]|0}else{oa=0}pa=oa|ga<<8}else{pa=ga}if($){if((ja+8|0)<(t|0)){qa=d[m+(D+(ja>>3))>>0]|0}else{qa=0}ra=qa|ha<<8}else{ra=ha}if(aa){if((ja+8|0)<(t|0)){sa=d[m+(E+(ja>>3))>>0]|0}else{sa=0}ta=pa;ua=ra;va=sa|ia<<8}else{ta=pa;ua=ra;va=0}}else{ta=0;ua=0;va=0}if((la|0)>0){la=O;wa=0;xa=0;do{ya=B$(e,f+(la<<3)|0)|0;za=7-xa|0;wa=ya<<za|wa&255;la=na>>>za&1024|la<<1&6582|ta>>>za&64|ua>>>(10-xa|0)&8|va>>>(13-xa|0)&1|ya<<9;xa=xa+1|0}while((xa|0)!=(ka|0));Aa=la;Ba=wa&255}else{Aa=O;Ba=0}a[J+(ja>>3)>>0]=Ba;ja=ja+8|0;if((ja|0)>=(j|0)){break}else{O=Aa;N=N+8|0;P=na;ga=ta;ha=ua;ia=va}}}}else{if(A){ia=I+ -1|0;ha=I+1|0;ga=M;P=G;N=L;O=da;ja=ea;ka=fa;xa=0;while(1){ya=(P|0)>-9?~P:8;za=j-xa|0;if(o){if((xa+8|0)<(j|0)){Ca=(d[J+(B+(xa>>3))>>0]|0)<<4}else{Ca=0}Da=Ca|N<<8}else{Da=N}if(ba){if((xa+8|0)<(t|0)){Ea=d[m+(C+(xa>>3))>>0]|0}else{Ea=0}Fa=Ea|O<<8}else{Fa=O}if($){if((xa+8|0)<(t|0)){Ga=d[m+(D+(xa>>3))>>0]|0}else{Ga=0}Ha=Ga|ja<<8}else{Ha=ja}if(aa){if((xa+8|0)<(t|0)){Ia=d[m+(E+(xa>>3))>>0]|0}else{Ia=0}Ja=Ia|ka<<8}else{Ja=0}if((za|0)>0){za=ga;Ka=0;La=0;while(1){Ma=c[h>>2]|0;Na=La+xa|0;Oa=p0(Ma,Na,I)|0;do{if((c[x>>2]|0)!=0){Pa=Na+ -1|0;if((Oa|0)!=(p0(Ma,Pa,ia)|0)){T=72;break}if((Oa|0)!=(p0(Ma,Na,ia)|0)){T=72;break}Qa=Na+1|0;if((Oa|0)!=(p0(Ma,Qa,ia)|0)){T=72;break}if((Oa|0)!=(p0(Ma,Pa,I)|0)){T=72;break}if((Oa|0)!=(p0(Ma,Qa,I)|0)){T=72;break}if((Oa|0)!=(p0(Ma,Pa,ha)|0)){T=72;break}if((Oa|0)!=(p0(Ma,Na,ha)|0)){T=72;break}if((Oa|0)==(p0(Ma,Qa,ha)|0)){Ra=Oa}else{T=72}}else{T=72}}while(0);if((T|0)==72){T=0;Ra=B$(e,f+(za<<3)|0)|0}Oa=7-La|0;Sa=Ra<<Oa|Ka;Ta=Da>>>Oa&1024|za<<1&6582|Fa>>>Oa&64|Ha>>>(10-La|0)&8|Ja>>>(13-La|0)&1|Ra<<9;Oa=La+1|0;if((Oa|0)==(ya|0)){break}za=Ta;Ka=Sa&255;La=Oa}Ua=Ta;Va=Sa&255}else{Ua=ga;Va=0}a[J+(xa>>3)>>0]=Va;xa=xa+8|0;if((xa|0)>=(j|0)){break}else{ga=Ua;P=P+8|0;N=Da;O=Fa;ja=Ha;ka=Ja}}}}if((I|0)<((c[n>>2]|0)+u|0)){Wa=m+s|0}else{Wa=m}I=I+1|0;if((I|0)==(k|0)){p=l;break}else{H=K;J=J+q|0;m=Wa}}i=g;return p|0}function E$(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;f=i;g=C0(24,c[b>>2]|0)|0;h=b+4|0;j=b+8|0;l0(g,c[h>>2]|0,c[j>>2]|0);c[g>>2]=c[b>>2];s0(g,0);if((c[j>>2]|0)==0){i=f;return g|0}k=b+28|0;l=b+16|0;m=b+20|0;n=b+24|0;o=b+34|0;p=b+35|0;q=b+32|0;r=b+33|0;b=e+128|0;s=0;t=0;while(1){if((c[k>>2]|0)==0){u=s}else{u=(B$(d,b)|0)^s}v=t+ -1|0;w=p0(g,1,v)|0;x=(p0(g,0,v)|0)<<1|w;w=c[l>>2]|0;y=c[m>>2]|0;z=1-y|0;A=c[n>>2]|0;B=v-A|0;C=p0(w,z,B)|0;D=0-y|0;E=(p0(w,D,B)|0)<<1|C;C=t-A|0;B=p0(w,z,C)|0;F=(p0(w,D,C)|0)<<1|B;B=~y;G=F|(p0(w,B,C)|0)<<2;C=t;t=t+1|0;F=t-A|0;H=p0(w,z,F)|0;z=(p0(w,D,F)|0)<<1|H;H=z|(p0(w,B,F)|0)<<2;F=(c[h>>2]|0)==0;a:do{if((u|0)==0){if(!F){B=y;z=A;D=w;I=x;J=0;K=E;L=G;M=H;N=0;while(1){O=(p0(D,N-B+(a[o>>0]|0)|0,C-z+(a[p>>0]|0)|0)|0)<<8;P=B$(d,e+((J<<9|I<<10|K<<6|L<<3|M|O|(p0(g,(a[q>>0]|0)+N|0,(a[r>>0]|0)+C|0)|0)<<12)<<3)|0)|0;q0(g,N,C,P);O=N+2|0;I=(p0(g,O,v)|0|I<<1)&3;D=c[l>>2]|0;B=c[m>>2]|0;Q=O-B|0;z=c[n>>2]|0;K=(p0(D,Q,v-z|0)|0|K<<1)&3;L=(p0(D,Q,C-z|0)|0|L<<1)&7;M=(p0(D,Q,t-z|0)|0|M<<1)&7;N=N+1|0;if(!(N>>>0<(c[h>>2]|0)>>>0)){break}else{J=P&1}}}}else{if(!F){J=w;N=y;M=A;z=x;D=0;L=E;K=G;B=H;I=0;while(1){P=p0(J,I,C)|0;if(((((((((c[k>>2]|0)!=0?(Q=I+ -1|0,(P|0)==(p0(J,Q,v)|0)):0)?(P|0)==(p0(J,I,v)|0):0)?(O=I+1|0,(P|0)==(p0(J,O,v)|0)):0)?(P|0)==(p0(J,Q,C)|0):0)?(P|0)==(p0(J,O,C)|0):0)?(P|0)==(p0(J,Q,t)|0):0)?(P|0)==(p0(J,I,t)|0):0)?(P|0)==(p0(J,O,t)|0):0){R=O;S=P}else{P=(p0(J,I-N+(a[o>>0]|0)|0,C-M+(a[p>>0]|0)|0)|0)<<8;R=I+1|0;S=B$(d,e+((z<<10|D|L<<6|K<<3|B|P|(p0(g,(a[q>>0]|0)+I|0,(a[r>>0]|0)+C|0)|0)<<12)<<3)|0)|0}q0(g,I,C,S);P=I+2|0;O=c[l>>2]|0;Q=c[m>>2]|0;T=P-Q|0;U=c[n>>2]|0;if(!(R>>>0<(c[h>>2]|0)>>>0)){break a}V=p0(O,T,t-U|0)|0;W=p0(O,T,C-U|0)|0;X=p0(O,T,v-U|0)|0;J=O;N=Q;M=U;z=(p0(g,P,v)|0|z<<1)&3;D=S<<9&512;L=(X|L<<1)&3;K=(W|K<<1)&7;B=(V|B<<1)&7;I=R}}}}while(0);if(!(t>>>0<(c[j>>2]|0)>>>0)){break}else{s=u}}i=f;return g|0}function F$(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0;g=i;i=i+16|0;h=g;j=c[b+4>>2]|0;k=c[b+8>>2]|0;l=C0(24,c[b>>2]|0)|0;l0(l,j,k);c[l>>2]=c[b>>2];m=c[l+16>>2]|0;if((m|0)==0){if((l|0)!=0){o0(l);D0(l)}n=c[b>>2]|0;o=c[(c[n>>2]|0)+24>>2]|0;c[h>>2]=j;c[h+4>>2]=k;ld[o&255](n,708096,h);p=0;i=g;return p|0}h=b+16|0;n=c[h>>2]|0;o=c[n+16>>2]|0;q=c[l+12>>2]|0;r=0-q|0;s=c[n+12>>2]|0;t=c[n+4>>2]|0;u=c[n+8>>2]|0;n=b+24|0;v=c[n>>2]|0;w=u+ -1|0;if((v|0)<(1-u|0)|(v|0)>(w|0)){c[n>>2]=0;x=0}else{x=v}v=ca(x,0-s|0)|0;if((k|0)<=0){p=l;i=g;return p|0}x=b+28|0;b=u+1|0;y=v-s|0;z=v+s|0;A=(j|0)>0;B=1-q|0;C=1-s+v|0;D=v+1|0;E=s+1+v|0;F=f+64|0;G=~j;H=0;I=0;J=m;m=o;while(1){if((c[x>>2]|0)==0){K=H}else{K=(B$(e,F)|0)^H}o=(I|0)>0;if(o){L=(d[J+r>>0]|0)<<1}else{L=0}M=I-(c[n>>2]|0)|0;do{if((M|0)>0){N=(M|0)<(u|0);O=(M|0)<(w|0);if((M|0)<(b|0)){P=d[m+y>>0]|0;if(N){Q=O;R=P;S=1;T=18;break}else{U=O;V=P;W=1;T=19;break}}else{if(N){Q=O;R=0;S=0;T=18;break}else{U=O;V=0;W=0;T=19;break}}}else{O=(M|0)>-2&(M|0)<(w|0);if((M|0)>-1&(M|0)<(u|0)){Q=O;R=0;S=0;T=18}else{U=O;V=0;W=0;T=19}}}while(0);if((T|0)==18){T=0;M=d[m+v>>0]|0;if(Q){X=1;Y=M;Z=S;_=R;T=20}else{$=1;aa=0;ba=S;da=R;ea=M;fa=0}}else if((T|0)==19){T=0;if(U){X=0;Y=0;Z=W;_=V;T=20}else{$=0;aa=0;ba=W;da=V;ea=0;fa=0}}if((T|0)==20){T=0;$=X;aa=1;ba=Z;da=_;ea=Y;fa=d[m+z>>0]|0}M=da>>>2&32|L&896|ea>>>4&12|fa>>>6;if((K|0)==0){if(A){O=M;N=G;P=L;ga=da;ha=ea;ia=fa;ja=0;while(1){ka=(N|0)>-9?~N:8;la=j-ja|0;if(o){if((ja+8|0)<(j|0)){ma=(d[J+(B+(ja>>3))>>0]|0)<<1}else{ma=0}na=ma|P<<8}else{na=P}if(ba){if((ja+8|0)<(t|0)){oa=d[m+(C+(ja>>3))>>0]|0}else{oa=0}pa=oa|ga<<8}else{pa=ga}if($){if((ja+8|0)<(t|0)){qa=d[m+(D+(ja>>3))>>0]|0}else{qa=0}ra=qa|ha<<8}else{ra=ha}if(aa){if((ja+8|0)<(t|0)){sa=d[m+(E+(ja>>3))>>0]|0}else{sa=0}ta=sa|ia<<8}else{ta=0}if((la|0)>0){la=O;ua=0;va=0;do{wa=B$(e,f+(la<<3)|0)|0;xa=7-va|0;ua=wa<<xa|ua&255;la=na>>>xa&128|la<<1&794|pa>>>(9-va|0)&32|ra>>>(11-va|0)&4|ta>>>(13-va|0)&1|wa<<6;va=va+1|0}while((va|0)!=(ka|0));ya=la;za=ua&255}else{ya=O;za=0}a[J+(ja>>3)>>0]=za;ja=ja+8|0;if((ja|0)>=(j|0)){break}else{O=ya;N=N+8|0;P=na;ga=pa;ha=ra;ia=ta}}}}else{if(A){ia=I+ -1|0;ha=I+1|0;ga=M;P=G;N=L;O=da;ja=ea;ka=fa;va=0;while(1){wa=(P|0)>-9?~P:8;xa=j-va|0;if(o){if((va+8|0)<(j|0)){Aa=(d[J+(B+(va>>3))>>0]|0)<<1}else{Aa=0}Ba=Aa|N<<8}else{Ba=N}if(ba){if((va+8|0)<(t|0)){Ca=d[m+(C+(va>>3))>>0]|0}else{Ca=0}Da=Ca|O<<8}else{Da=O}if($){if((va+8|0)<(t|0)){Ea=d[m+(D+(va>>3))>>0]|0}else{Ea=0}Fa=Ea|ja<<8}else{Fa=ja}if(aa){if((va+8|0)<(t|0)){Ga=d[m+(E+(va>>3))>>0]|0}else{Ga=0}Ha=Ga|ka<<8}else{Ha=0}if((xa|0)>0){xa=ga;Ia=0;Ja=0;while(1){Ka=c[h>>2]|0;La=Ja+va|0;Ma=p0(Ka,La,I)|0;do{if((c[x>>2]|0)!=0){Na=La+ -1|0;if((Ma|0)!=(p0(Ka,Na,ia)|0)){T=71;break}if((Ma|0)!=(p0(Ka,La,ia)|0)){T=71;break}Oa=La+1|0;if((Ma|0)!=(p0(Ka,Oa,ia)|0)){T=71;break}if((Ma|0)!=(p0(Ka,Na,I)|0)){T=71;break}if((Ma|0)!=(p0(Ka,Oa,I)|0)){T=71;break}if((Ma|0)!=(p0(Ka,Na,ha)|0)){T=71;break}if((Ma|0)!=(p0(Ka,La,ha)|0)){T=71;break}if((Ma|0)==(p0(Ka,Oa,ha)|0)){Pa=Ma}else{T=71}}else{T=71}}while(0);if((T|0)==71){T=0;Pa=B$(e,f+(xa<<3)|0)|0}Ma=7-Ja|0;Qa=Pa<<Ma|Ia;Ra=Ba>>>Ma&128|xa<<1&794|Da>>>(9-Ja|0)&32|Fa>>>(11-Ja|0)&4|Ha>>>(13-Ja|0)&1|Pa<<6;Ma=Ja+1|0;if((Ma|0)==(wa|0)){break}xa=Ra;Ia=Qa&255;Ja=Ma}Sa=Ra;Ta=Qa&255}else{Sa=ga;Ta=0}a[J+(va>>3)>>0]=Ta;va=va+8|0;if((va|0)>=(j|0)){break}else{ga=Sa;P=P+8|0;N=Ba;O=Da;ja=Fa;ka=Ha}}}}if((I|0)<((c[n>>2]|0)+u|0)){Ua=m+s|0}else{Ua=m}I=I+1|0;if((I|0)==(k|0)){p=l;break}else{H=K;J=J+q|0;m=Ua}}i=g;return p|0}function G$(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;e=i;f=C0(24,c[a>>2]|0)|0;g=a+4|0;h=a+8|0;l0(f,c[g>>2]|0,c[h>>2]|0);c[f>>2]=c[a>>2];s0(f,0);if((c[h>>2]|0)==0){i=e;return f|0}j=a+28|0;k=a+16|0;l=a+20|0;m=a+24|0;a=d+64|0;n=0;o=0;while(1){if((c[j>>2]|0)==0){p=n}else{p=(B$(b,a)|0)^n}q=o+ -1|0;r=p0(f,1,q)|0;s=(p0(f,0,q)|0)<<1|r;r=s|(p0(f,-1,q)|0)<<2;s=c[k>>2]|0;t=c[l>>2]|0;u=0-t|0;v=c[m>>2]|0;w=p0(s,u,q-v|0)|0;x=1-t|0;y=o-v|0;z=p0(s,x,y)|0;A=(p0(s,u,y)|0)<<1|z;z=A|(p0(s,~t,y)|0)<<2;y=o;o=o+1|0;t=o-v|0;v=p0(s,x,t)|0;x=(p0(s,u,t)|0)<<1|v;v=(c[g>>2]|0)==0;a:do{if((p|0)==0){if(!v){t=r;u=0;A=w;B=z;C=x;D=0;while(1){E=B$(b,d+((u<<6|t<<7|A<<5|B<<2|C)<<3)|0)|0;q0(f,D,y,E);F=D+2|0;t=(p0(f,F,q)|0|t<<1)&7;G=c[k>>2]|0;H=c[l>>2]|0;D=D+1|0;I=c[m>>2]|0;A=(p0(G,D-H|0,q-I|0)|0)&1;J=F-H|0;B=(p0(G,J,y-I|0)|0|B<<1)&7;C=(p0(G,J,o-I|0)|0|C<<1)&3;if(!(D>>>0<(c[g>>2]|0)>>>0)){break}else{u=E&1}}}}else{if(!v){u=s;D=r;C=0;B=w;A=z;t=x;E=0;while(1){I=p0(u,E,y)|0;if(((((((((c[j>>2]|0)!=0?(J=E+ -1|0,(I|0)==(p0(u,J,q)|0)):0)?(I|0)==(p0(u,E,q)|0):0)?(G=E+1|0,(I|0)==(p0(u,G,q)|0)):0)?(I|0)==(p0(u,J,y)|0):0)?(I|0)==(p0(u,G,y)|0):0)?(I|0)==(p0(u,J,o)|0):0)?(I|0)==(p0(u,E,o)|0):0)?(I|0)==(p0(u,G,o)|0):0){K=G;L=I}else{K=E+1|0;L=B$(b,d+((D<<7|C|B<<5|A<<2|t)<<3)|0)|0}q0(f,E,y,L);I=E+2|0;G=c[k>>2]|0;J=c[l>>2]|0;H=c[m>>2]|0;F=I-J|0;if(!(K>>>0<(c[g>>2]|0)>>>0)){break a}M=p0(G,F,o-H|0)|0;N=p0(G,F,y-H|0)|0;F=p0(f,I,q)|0;u=G;D=(F|D<<1)&7;C=L<<6&64;B=(p0(G,K-J|0,q-H|0)|0)&1;A=(N|A<<1)&7;t=(M|t<<1)&3;E=K}}}}while(0);if(!(o>>>0<(c[h>>2]|0)>>>0)){break}else{n=p}}i=e;return f|0}function H$(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0;f=i;i=i+48|0;g=f;h=f+44|0;j=f+40|0;k=f+36|0;l=f+32|0;m=f+28|0;n=f+24|0;o=f+20|0;p=f+16|0;q=f+12|0;r=f+8|0;s=f+4|0;t=C0(8,c[b>>2]|0)|0;e0(t,d);c[t>>2]=c[b>>2];u=C0(24,c[b>>2]|0)|0;l0(u,c[b+12>>2]|0,c[b+16>>2]|0);c[u>>2]=c[b>>2];s0(u,c[b+44>>2]|0);v=b+72|0;a:do{if((f0(t,c[v>>2]|0,h)|0)==0){w=b+24|0;x=ca(c[h>>2]|0,0-(c[w>>2]|0)|0)|0;c[h>>2]=x;y=b+20|0;b:do{if((c[y>>2]|0)!=0){z=b+68|0;A=b+60|0;B=b+28|0;C=b+32|0;D=b+8|0;E=b+40|0;F=b+76|0;G=b+80|0;H=b+84|0;I=b+88|0;J=b+92|0;K=d+12|0;L=b+96|0;M=b+100|0;N=b+101|0;O=b+102|0;P=b+103|0;Q=b+64|0;R=b+52|0;S=b+56|0;T=b+48|0;U=x;V=0;W=0;X=0;c:while(1){if((f0(t,c[v>>2]|0,j)|0)!=0){Y=7;break}Z=ca(c[j>>2]|0,c[w>>2]|0)|0;c[j>>2]=Z;U=U+Z|0;c[h>>2]=U;Z=V;_=W;$=X;aa=1;d:while(1){ba=Z;da=_;ea=aa;while(1){if((ea|0)==0){fa=f0(t,c[z>>2]|0,l)|0;c[s>>2]=fa;if((fa|0)==1){break d}else if((fa|0)!=0){Y=15;break c}ga=(c[l>>2]|0)+ba+(a[A>>0]|0)|0;ha=da}else{if((f0(t,c[Q>>2]|0,k)|0)!=0){Y=12;break c}fa=(c[k>>2]|0)+da|0;ga=fa;ha=fa}fa=c[w>>2]|0;if((fa|0)==1){ia=0}else{ja=1;while(1){if(1<<ja>>>0<fa>>>0){ja=ja+1|0}else{break}}c[r>>2]=ja;if((c$(d,ja,s)|0)!=0){Y=20;break c}ia=c[s>>2]&255}c[s>>2]=0;fa=0;ka=1;while(1){if((I$(d,r)|0)!=0){Y=24;break c}la=fa|c[r>>2];c[s>>2]=la;ma=c[B>>2]|0;if((ma|0)!=0){na=c[C>>2]|0;oa=0;while(1){if((ka|0)==(c[na+(oa<<3)>>2]|0)?(la|0)==(c[na+(oa<<3)+4>>2]|0):0){pa=oa;break}qa=oa+1|0;if(qa>>>0<ma>>>0){oa=qa}else{pa=qa;break}}if(pa>>>0<ma>>>0){break}}fa=la<<1;ka=ka+1|0}do{if((c[D>>2]|0)!=0){if((e$(d,m)|0)!=0){Y=35;break c}ka=c[m>>2]|0;if((ka|0)==0){Y=37}else{if((f0(t,c[F>>2]|0,n)|0)!=0){Y=43;break c}if((f0(t,c[G>>2]|0,o)|0)!=0){Y=43;break c}if((f0(t,c[H>>2]|0,p)|0)!=0){Y=43;break c}if((f0(t,c[I>>2]|0,q)|0)!=0){Y=43;break c}if((f0(t,c[J>>2]|0,s)|0)!=0){Y=43;break c}$_(d);fa=c[K>>2]|0;c[r>>2]=fa;ja=c[(c[E>>2]|0)+(pa<<2)>>2]|0;if((ja|0)==0){break a}oa=c[n>>2]|0;na=oa+(c[ja+4>>2]|0)|0;if((na|0)<0){Y=47;break c}qa=c[o>>2]|0;ra=qa+(c[ja+8>>2]|0)|0;if((ra|0)<0){Y=47;break c}sa=C0(36,c[b>>2]|0)|0;ta=sa+0|0;ua=ta+36|0;do{c[ta>>2]=0;ta=ta+4|0}while((ta|0)<(ua|0));c[sa>>2]=c[b>>2];c[sa+4>>2]=na;c[sa+8>>2]=ra;c[sa+12>>2]=c[L>>2];c[sa+16>>2]=ja;c[sa+20>>2]=(oa>>2)+(c[p>>2]|0);c[sa+24>>2]=(qa>>2)+(c[q>>2]|0);c[sa+28>>2]=0;a[sa+32>>0]=a[M>>0]|0;a[sa+33>>0]=a[N>>0]|0;a[sa+34>>0]=a[O>>0]|0;a[sa+35>>0]=a[P>>0]|0;va=C0(24,c[b>>2]|0)|0;c[va+20>>2]=d;m$(va);c[va>>2]=c[b>>2];wa=C$(sa,va,e)|0;if((wa|0)==0){Y=49;break c}if((va|0)!=0){D0(va)}$_(d);ta=(c[K>>2]|0)+2|0;c[K>>2]=ta;if((c[s>>2]|0)!=(ta-fa|0)){Y=56;break c}if((sa|0)==0){xa=ka;ya=wa;break}D0(sa);xa=ka;ya=wa}}else{c[m>>2]=0;Y=37}}while(0);if((Y|0)==37){Y=0;xa=0;ya=c[(c[E>>2]|0)+(pa<<2)>>2]|0}if((ya|0)==0){ba=ga;da=ha;ea=0}else{break}}ea=U+ia|0;ta=c[ya+4>>2]|0;ua=c[ya+8>>2]|0;la=c[R>>2]|0;do{if((la|0)==1){ma=c[S>>2]|0;if((ma|0)==2|(ma|0)==0){za=ma;Aa=ga+ -1+ua|0;Y=73}else{za=ma;Aa=ga;Y=73}}else if((la|0)==0){ma=c[S>>2]|0;if((ma+ -2|0)>>>0<2){Ba=ga+ -1+ta|0}else{Ba=ga}if((ma|0)==0){y0(u,Ba,ea+1-ua|0,ya,c[T>>2]|0);Ca=Ba;break}else if((ma|0)==2){y0(u,1-ta+Ba|0,ea+1-ua|0,ya,c[T>>2]|0);Ca=Ba;break}else if((ma|0)==1){y0(u,Ba,ea,ya,c[T>>2]|0);Ca=Ba;break}else if((ma|0)==3){y0(u,1-ta+Ba|0,ea,ya,c[T>>2]|0);Ca=Ba;break}else{Ca=Ba;break}}else{za=c[S>>2]|0;Aa=ga;Y=73}}while(0);do{if((Y|0)==73){Y=0;if((za|0)==1){y0(u,ea,Aa,ya,c[T>>2]|0);Ca=Aa;break}else if((za|0)==3){y0(u,ea+1-ta|0,Aa,ya,c[T>>2]|0);Ca=Aa;break}else if((za|0)==0){y0(u,ea,1-ua+Aa|0,ya,c[T>>2]|0);Ca=Aa;break}else if((za|0)==2){y0(u,ea+1-ta|0,1-ua+Aa|0,ya,c[T>>2]|0);Ca=Aa;break}else{Ca=Aa;break}}}while(0);if((xa|0)!=0){o0(ya);D0(ya)}ea=c[R>>2]|0;if((ea|0)==0){if((c[S>>2]|0)>>>0<2){Da=ta+ -1+Ca|0}else{Da=Ca}}else if((ea|0)==1?(ea=c[S>>2]|0,(ea|0)==3|(ea|0)==1):0){Da=ua+ -1+Ca|0}else{Da=Ca}Z=Da;_=ha;$=$+1|0;aa=0}if(!($>>>0<(c[y>>2]|0)>>>0)){break b}else{V=ba;W=da;X=$}}switch(Y|0){case 7:{X=c[b>>2]|0;ld[c[(c[X>>2]|0)+24>>2]&255](X,708192,g);break a;break};case 12:{X=c[b>>2]|0;ld[c[(c[X>>2]|0)+24>>2]&255](X,708192,g);break a;break};case 15:{X=c[b>>2]|0;ld[c[(c[X>>2]|0)+24>>2]&255](X,708192,g);break a;break};case 20:{X=c[b>>2]|0;ld[c[(c[X>>2]|0)+24>>2]&255](X,708192,g);break a;break};case 24:{X=c[b>>2]|0;ld[c[(c[X>>2]|0)+24>>2]&255](X,708192,g);break a;break};case 35:{X=c[b>>2]|0;ld[c[(c[X>>2]|0)+24>>2]&255](X,708192,g);break a;break};case 43:{X=c[b>>2]|0;ld[c[(c[X>>2]|0)+24>>2]&255](X,708192,g);break a;break};case 47:{X=c[b>>2]|0;ld[c[(c[X>>2]|0)+24>>2]&255](X,708248,g);break a;break};case 49:{if((sa|0)!=0){D0(sa)}if((va|0)==0){break a}D0(va);break a;break};case 56:{o0(wa);D0(wa);if((sa|0)!=0){D0(sa)}X=c[b>>2]|0;ld[c[(c[X>>2]|0)+24>>2]&255](X,708320,g);break a;break}}}}while(0);if((t|0)==0){Ea=u;i=f;return Ea|0}D0(t);Ea=u;i=f;return Ea|0}else{y=c[b>>2]|0;ld[c[(c[y>>2]|0)+24>>2]&255](y,708192,g)}}while(0);if((t|0)!=0){D0(t)}if((u|0)==0){Ea=0;i=f;return Ea|0}o0(u);D0(u);Ea=0;i=f;return Ea|0}function I$(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;f=a+12|0;g=c[f>>2]|0;if(!(g>>>0<(c[a+8>>2]|0)>>>0)){h=-1;i=e;return h|0}j=a+16|0;c[b>>2]=(d[(c[a+4>>2]|0)+g>>0]|0)>>>(7-(c[j>>2]|0)|0)&1;g=c[j>>2]|0;if((g|0)==7){c[f>>2]=(c[f>>2]|0)+1;k=0}else{k=g+1|0}c[j>>2]=k;h=0;i=e;return h|0}function J$(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0;g=i;i=i+48|0;h=g;j=g+44|0;k=g+40|0;l=g+36|0;m=g+32|0;n=g+28|0;o=g+24|0;p=g+20|0;q=g+16|0;r=g+12|0;s=g+8|0;if((f|0)==0){t=C0(8,c[b>>2]|0)|0;lda(t);c[t>>2]=c[b>>2];u=C0(8,c[b>>2]|0)|0;lda(u);c[u>>2]=c[b>>2];v=C0(8,c[b>>2]|0)|0;lda(v);c[v>>2]=c[b>>2];w=C0(8,c[b>>2]|0)|0;lda(w);c[w>>2]=c[b>>2];x=C0(8,c[b>>2]|0)|0;lda(x);c[x>>2]=c[b>>2];y=C0(8,c[b>>2]|0)|0;lda(y);c[y>>2]=c[b>>2];z=C0(8,c[b>>2]|0)|0;lda(z);c[z>>2]=c[b>>2];A=C0(8,c[b>>2]|0)|0;lda(A);c[A>>2]=c[b>>2];B=C0(8,c[b>>2]|0)|0;lda(B);c[B>>2]=c[b>>2];C=C0(12,c[b>>2]|0)|0;oda(C,a[b+36>>0]|0);c[C>>2]=c[b>>2];D=b;E=v;F=t;G=u;H=C;I=w;J=z;K=y;L=A;M=B;N=x;O=0}else{D=b;E=c[f+8>>2]|0;F=c[f>>2]|0;G=c[f+4>>2]|0;H=c[f+36>>2]|0;I=c[f+12>>2]|0;J=c[f+24>>2]|0;K=c[f+20>>2]|0;L=c[f+28>>2]|0;M=c[f+32>>2]|0;N=c[f+16>>2]|0;O=1}f=C0(24,c[D>>2]|0)|0;l0(f,c[b+12>>2]|0,c[b+16>>2]|0);c[f>>2]=c[D>>2];s0(f,c[b+44>>2]|0);a:do{if((nda(F,d,j)|0)==-1){x=c[D>>2]|0;ld[c[(c[x>>2]|0)+24>>2]&255](x,708456,h)}else{x=b+24|0;B=ca(c[j>>2]|0,0-(c[x>>2]|0)|0)|0;c[j>>2]=B;A=b+20|0;b:do{if((c[A>>2]|0)!=0){y=b+60|0;z=b+28|0;w=b+8|0;C=b+40|0;u=b+52|0;t=b+56|0;v=b+48|0;P=b+96|0;Q=b+100|0;R=b+101|0;S=b+102|0;T=b+103|0;U=B;V=0;W=0;X=0;c:while(1){if((nda(F,d,k)|0)==-1){Y=10;break}Z=ca(c[k>>2]|0,c[x>>2]|0)|0;c[k>>2]=Z;U=U+Z|0;c[j>>2]=U;Z=V;_=W;$=X;aa=0;while(1){if(aa){ba=nda(E,d,m)|0;if((ba|0)==1){Y=17;break}else if((ba|0)!=0){Y=18;break c}da=(c[m>>2]|0)+Z+(a[y>>0]|0)|0;ea=_}else{if((nda(G,d,l)|0)==-1){Y=14;break c}ba=(c[l>>2]|0)+_|0;da=ba;ea=ba}ba=c[A>>2]|0;if(!($>>>0<ba>>>0)){fa=ba;ga=da;ha=ea;break}if((c[x>>2]|0)==1){ia=0}else{if((nda(I,d,s)|0)==-1){Y=23;break c}ia=c[s>>2]|0}ba=U+ia|0;qda(H,d,s);ja=c[s>>2]|0;ka=c[z>>2]|0;if(!(ja>>>0<ka>>>0)){Y=26;break c}if((c[w>>2]|0)!=0){if((nda(N,d,n)|0)==-1){Y=30;break c}}else{c[n>>2]=0}la=c[(c[C>>2]|0)+(ja<<2)>>2]|0;if((la|0)==0){break a}ma=(c[n>>2]|0)==0;do{if(ma){na=la}else{if((nda(K,d,o)|0)==-1){Y=37;break c}if((nda(J,d,p)|0)==-1){Y=37;break c}if((nda(L,d,q)|0)==-1){Y=37;break c}if((nda(M,d,r)|0)==-1){Y=37;break c}oa=c[(c[C>>2]|0)+(ja<<2)>>2]|0;pa=c[o>>2]|0;qa=pa+(c[oa+4>>2]|0)|0;if((qa|0)<0){Y=40;break c}ra=c[p>>2]|0;sa=ra+(c[oa+8>>2]|0)|0;if((sa|0)<0){Y=40;break c}ta=C0(36,c[D>>2]|0)|0;ua=ta+0|0;va=ua+36|0;do{c[ua>>2]=0;ua=ua+4|0}while((ua|0)<(va|0));c[ta>>2]=c[D>>2];c[ta+4>>2]=qa;c[ta+8>>2]=sa;c[ta+12>>2]=c[P>>2];c[ta+16>>2]=oa;c[ta+20>>2]=(pa>>1)+(c[q>>2]|0);c[ta+24>>2]=(ra>>1)+(c[r>>2]|0);c[ta+28>>2]=0;a[ta+32>>0]=a[Q>>0]|0;a[ta+33>>0]=a[R>>0]|0;a[ta+34>>0]=a[S>>0]|0;a[ta+35>>0]=a[T>>0]|0;ua=C$(ta,d,e)|0;wa=(ta|0)==0;if((ua|0)==0){Y=42;break c}if(wa){na=ua;break}D0(ta);na=ua}}while(0);la=c[na+4>>2]|0;ua=c[na+8>>2]|0;va=c[u>>2]|0;do{if((va|0)==0){xa=c[t>>2]|0;if((xa+ -2|0)>>>0<2){ya=da+ -1+la|0}else{ya=da}if((xa|0)==0){y0(f,ya,ba+1-ua|0,na,c[v>>2]|0);za=ya;break}else if((xa|0)==2){y0(f,1-la+ya|0,ba+1-ua|0,na,c[v>>2]|0);za=ya;break}else if((xa|0)==1){y0(f,ya,ba,na,c[v>>2]|0);za=ya;break}else if((xa|0)==3){y0(f,1-la+ya|0,ba,na,c[v>>2]|0);za=ya;break}else{za=ya;break}}else if((va|0)==1){xa=c[t>>2]|0;if((xa|0)==2|(xa|0)==0){Aa=xa;Ba=da+ -1+ua|0;Y=57}else{Aa=xa;Ba=da;Y=57}}else{Aa=c[t>>2]|0;Ba=da;Y=57}}while(0);do{if((Y|0)==57){Y=0;if((Aa|0)==3){y0(f,ba+1-la|0,Ba,na,c[v>>2]|0);za=Ba;break}else if((Aa|0)==0){y0(f,ba,1-ua+Ba|0,na,c[v>>2]|0);za=Ba;break}else if((Aa|0)==2){y0(f,ba+1-la|0,1-ua+Ba|0,na,c[v>>2]|0);za=Ba;break}else if((Aa|0)==1){y0(f,ba,Ba,na,c[v>>2]|0);za=Ba;break}else{za=Ba;break}}}while(0);if(!(ma|(na|0)==0)){o0(na);D0(na)}ba=c[u>>2]|0;if((ba|0)==0){if((c[t>>2]|0)>>>0<2){Ca=la+ -1+za|0}else{Ca=za}}else if((ba|0)==1?(ba=c[t>>2]|0,(ba|0)==3|(ba|0)==1):0){Ca=ua+ -1+za|0}else{Ca=za}Z=Ca;_=ea;$=$+1|0;aa=1}if((Y|0)==17){Y=0;fa=c[A>>2]|0;ga=Z;ha=_}if(!($>>>0<fa>>>0)){break b}else{V=ga;W=ha;X=$}}if((Y|0)==10){X=c[D>>2]|0;ld[c[(c[X>>2]|0)+24>>2]&255](X,708456,h);break a}else if((Y|0)==14){X=c[D>>2]|0;ld[c[(c[X>>2]|0)+24>>2]&255](X,708456,h);break a}else if((Y|0)==18){X=c[D>>2]|0;ld[c[(c[X>>2]|0)+24>>2]&255](X,708456,h);break a}else if((Y|0)==23){X=c[D>>2]|0;ld[c[(c[X>>2]|0)+24>>2]&255](X,708456,h);break a}else if((Y|0)==26){X=c[D>>2]|0;W=c[(c[X>>2]|0)+24>>2]|0;c[h>>2]=ja;c[h+4>>2]=ka;ld[W&255](X,708512,h);break a}else if((Y|0)==30){X=c[D>>2]|0;ld[c[(c[X>>2]|0)+24>>2]&255](X,708456,h);break a}else if((Y|0)==37){X=c[D>>2]|0;ld[c[(c[X>>2]|0)+24>>2]&255](X,708456,h);break a}else if((Y|0)==40){X=c[D>>2]|0;ld[c[(c[X>>2]|0)+24>>2]&255](X,708584,h);break a}else if((Y|0)==42){if(wa){break a}D0(ta);break a}}}while(0);if((O|0)!=0){Da=f;i=g;return Da|0}if((F|0)!=0){mda(c[F>>2]|0,c[F+4>>2]|0);D0(F)}if((G|0)!=0){mda(c[G>>2]|0,c[G+4>>2]|0);D0(G)}if((E|0)!=0){mda(c[E>>2]|0,c[E+4>>2]|0);D0(E)}if((I|0)!=0){mda(c[I>>2]|0,c[I+4>>2]|0);D0(I)}if((N|0)!=0){mda(c[N>>2]|0,c[N+4>>2]|0);D0(N)}if((K|0)!=0){mda(c[K>>2]|0,c[K+4>>2]|0);D0(K)}if((J|0)!=0){mda(c[J>>2]|0,c[J+4>>2]|0);D0(J)}if((L|0)!=0){mda(c[L>>2]|0,c[L+4>>2]|0);D0(L)}if((M|0)!=0){mda(c[M>>2]|0,c[M+4>>2]|0);D0(M)}if((H|0)==0){Da=f;i=g;return Da|0}pda(c[H>>2]|0,c[H+4>>2]|0);D0(H);Da=f;i=g;return Da|0}}while(0);if((O|0)==0){if((F|0)!=0){mda(c[F>>2]|0,c[F+4>>2]|0);D0(F)}if((G|0)!=0){mda(c[G>>2]|0,c[G+4>>2]|0);D0(G)}if((E|0)!=0){mda(c[E>>2]|0,c[E+4>>2]|0);D0(E)}if((I|0)!=0){mda(c[I>>2]|0,c[I+4>>2]|0);D0(I)}if((N|0)!=0){mda(c[N>>2]|0,c[N+4>>2]|0);D0(N)}if((K|0)!=0){mda(c[K>>2]|0,c[K+4>>2]|0);D0(K)}if((J|0)!=0){mda(c[J>>2]|0,c[J+4>>2]|0);D0(J)}if((L|0)!=0){mda(c[L>>2]|0,c[L+4>>2]|0);D0(L)}if((M|0)!=0){mda(c[M>>2]|0,c[M+4>>2]|0);D0(M)}if((H|0)!=0){pda(c[H>>2]|0,c[H+4>>2]|0);D0(H)}}if((f|0)==0){Da=0;i=g;return Da|0}o0(f);D0(f);Da=0;i=g;return Da|0}function K$(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0;h=i;i=i+80|0;j=h;k=h+72|0;l=h+68|0;m=h+64|0;n=h+60|0;o=h+56|0;p=h+52|0;q=h+48|0;r=h+8|0;s=C0(8,c[d>>2]|0)|0;lda(s);c[s>>2]=c[d>>2];t=C0(8,c[d>>2]|0)|0;lda(t);c[t>>2]=c[d>>2];u=C0(8,c[d>>2]|0)|0;lda(u);c[u>>2]=c[d>>2];v=C0(8,c[d>>2]|0)|0;lda(v);c[v>>2]=c[d>>2];w=C0(8,c[d>>2]|0)|0;lda(w);c[w>>2]=c[d>>2];x=C0(8,c[d>>2]|0)|0;lda(x);c[x>>2]=c[d>>2];y=C0(8,c[d>>2]|0)|0;lda(y);c[y>>2]=c[d>>2];z=C0(8,c[d>>2]|0)|0;lda(z);c[z>>2]=c[d>>2];A=C0(8,c[d>>2]|0)|0;lda(A);c[A>>2]=c[d>>2];B=C0(8,c[d>>2]|0)|0;lda(B);c[B>>2]=c[d>>2];C=C0(8,c[d>>2]|0)|0;lda(C);c[C>>2]=c[d>>2];D=C0(8,c[d>>2]|0)|0;lda(D);c[D>>2]=c[d>>2];E=C0(8,c[d>>2]|0)|0;lda(E);c[E>>2]=c[d>>2];F=d+12|0;G=d+20|0;H=(c[G>>2]|0)+(c[F>>2]|0)|0;I=0;while(1){if(1<<I>>>0<H>>>0){I=I+1|0}else{break}}H=C0(12,c[d>>2]|0)|0;oda(H,I&255);c[H>>2]=c[d>>2];I=c[d>>2]|0;J=Qc[c[(c[I>>2]|0)+4>>2]&255](I,c[G>>2]|0,4)|0;f3a(J|0,0,c[G>>2]<<2|0)|0;a:do{if((c[G>>2]|0)==0){K=0;L=0;M=82}else{I=d+8|0;N=d+44|0;O=d+45|0;P=d+46|0;Q=d+47|0;R=d+48|0;S=d+49|0;T=d+50|0;U=d+51|0;V=d+52|0;W=d+4|0;X=d+16|0;Y=d+56|0;Z=d+60|0;_=d+61|0;$=d+62|0;aa=d+63|0;ba=r+4|0;ca=r+8|0;da=r+12|0;ea=r+16|0;fa=r+20|0;ga=r+24|0;ha=r+28|0;ia=r+32|0;ja=r+36|0;ka=0;la=0;b:while(1){if((nda(s,e,k)|0)==-1){M=7;break}ka=(c[k>>2]|0)+ka|0;if(ka>>>0>65535){M=10;break}ma=(ka|0)==0;na=la;oa=0;while(1){pa=nda(t,e,l)|0;if((pa|0)==1){break}else if((pa|0)!=0){M=12;break b}if(!(na>>>0<(c[G>>2]|0)>>>0)){M=14;break b}pa=(c[l>>2]|0)+oa|0;if(pa>>>0>65535){M=16;break b}if(ma|(pa|0)==0){c[J+(na<<2)>>2]=0}else{do{if((c[I>>2]|0)==0){qa=C0(92,c[d>>2]|0)|0;c[qa+4>>2]=0;c[qa+8>>2]=0;c[qa+12>>2]=0;b[qa+32>>1]=0;ra=qa+36|0;c[ra+0>>2]=0;c[ra+4>>2]=0;c[ra+8>>2]=0;c[ra+12>>2]=0;c[ra+16>>2]=0;c[qa>>2]=c[d>>2];c[qa+56>>2]=0;c[qa+60>>2]=pa;c[qa+64>>2]=ka;a[qa+68>>0]=a[N>>0]|0;c[qa+72>>2]=0;c[qa+76>>2]=0;a[qa+84>>0]=a[O>>0]|0;a[qa+85>>0]=a[P>>0]|0;a[qa+86>>0]=a[Q>>0]|0;a[qa+87>>0]=a[R>>0]|0;a[qa+88>>0]=a[S>>0]|0;a[qa+89>>0]=a[T>>0]|0;a[qa+90>>0]=a[U>>0]|0;a[qa+91>>0]=a[V>>0]|0;ra=s$(qa,e,f)|0;sa=(qa|0)==0;if((ra|0)==0){M=22;break b}if(sa){ta=ra}else{D0(qa);ta=ra}}else{if((nda(u,e,m)|0)==-1){M=27;break b}ra=c[m>>2]|0;if(!(ra>>>0>1)){if((ra|0)!=1){ta=0;break}ua=(c[F>>2]|0)+na|0;qda(H,e,o);if((nda(v,e,p)|0)==-1){M=71;break b}if((nda(w,e,q)|0)==-1){M=71;break b}va=c[o>>2]|0;wa=c[d>>2]|0;if(!(va>>>0<ua>>>0)){M=73;break b}xa=Qc[c[(c[wa>>2]|0)+4>>2]&255](wa,ua,4)|0;c3a(xa|0,c[X>>2]|0,c[F>>2]<<2|0)|0;c3a(xa+(c[F>>2]<<2)|0,J|0,na<<2|0)|0;ua=xa+(va<<2)|0;ya=c[d>>2]|0;if((c[ua>>2]|0)==0){M=75;break b}za=C0(36,ya)|0;Aa=za+0|0;Ba=Aa+36|0;do{c[Aa>>2]=0;Aa=Aa+4|0}while((Aa|0)<(Ba|0));c[za>>2]=c[d>>2];c[za+4>>2]=pa;c[za+8>>2]=ka;c[za+12>>2]=c[Y>>2];c[za+16>>2]=c[ua>>2];c[za+20>>2]=c[p>>2];c[za+24>>2]=c[q>>2];c[za+28>>2]=0;a[za+32>>0]=a[Z>>0]|0;a[za+33>>0]=a[_>>0]|0;a[za+34>>0]=a[$>>0]|0;a[za+35>>0]=a[aa>>0]|0;Ca=C$(za,e,g)|0;Da=c[d>>2]|0;Ic[c[(c[Da>>2]|0)+16>>2]&511](Da,xa);Ea=(za|0)==0;if((Ca|0)==0){M=77;break b}if(Ea){ta=Ca;break}D0(za);ta=Ca;break}Fa=C0(104,c[d>>2]|0)|0;Aa=Fa+0|0;Ba=Aa+104|0;do{c[Aa>>2]=0;Aa=Aa+4|0}while((Aa|0)<(Ba|0));c[Fa>>2]=c[d>>2];c[Fa+4>>2]=c[W>>2];c[Fa+8>>2]=1;c[Fa+12>>2]=pa;c[Fa+16>>2]=ka;c[Fa+20>>2]=ra;c[Fa+24>>2]=1;ua=(c[F>>2]|0)+na|0;c[Fa+28>>2]=ua;Ca=0;while(1){if(1<<Ca>>>0<ua>>>0){Ca=Ca+1|0}else{break}}a[Fa+36>>0]=Ca;ra=c[d>>2]|0;Da=Qc[c[(c[ra>>2]|0)+4>>2]&255](ra,ua,4)|0;c3a(Da|0,c[X>>2]|0,c[F>>2]<<2|0)|0;c3a(Da+(c[F>>2]<<2)|0,J|0,na<<2|0)|0;c[Fa+40>>2]=Da;c[Fa+44>>2]=0;c[Fa+48>>2]=0;c[Fa+52>>2]=0;c[Fa+56>>2]=1;a[Fa+60>>0]=0;Ga=C0(32,c[d>>2]|0)|0;g0(Ga,708944,14,0);c[Ga>>2]=c[d>>2];Ha=C0(32,c[d>>2]|0)|0;g0(Ha,709112,21,1);c[Ha>>2]=c[d>>2];Ia=C0(32,c[d>>2]|0)|0;g0(Ia,709368,14,0);c[Ia>>2]=c[d>>2];Ja=C0(32,c[d>>2]|0)|0;g0(Ja,709536,13,0);c[Ja>>2]=c[d>>2];Ka=C0(32,c[d>>2]|0)|0;g0(Ka,709536,13,0);c[Ka>>2]=c[d>>2];La=C0(32,c[d>>2]|0)|0;g0(La,709536,13,0);c[La>>2]=c[d>>2];Ma=C0(32,c[d>>2]|0)|0;g0(Ma,709536,13,0);c[Ma>>2]=c[d>>2];Na=C0(32,c[d>>2]|0)|0;g0(Na,709696,5,0);c[Na>>2]=c[d>>2];c[Fa+64>>2]=Ga;c[Fa+68>>2]=Ha;c[Fa+72>>2]=Ia;c[Fa+76>>2]=Ja;c[Fa+80>>2]=Ka;c[Fa+84>>2]=La;c[Fa+88>>2]=Ma;c[Fa+92>>2]=Na;c[Fa+96>>2]=c[Y>>2];a[Fa+100>>0]=a[Z>>0]|0;a[Fa+101>>0]=a[_>>0]|0;a[Fa+102>>0]=a[$>>0]|0;a[Fa+103>>0]=a[aa>>0]|0;c[r>>2]=y;c[ba>>2]=z;c[ca>>2]=A;c[da>>2]=B;c[ea>>2]=C;c[fa>>2]=D;c[ga>>2]=E;c[ha>>2]=v;c[ia>>2]=w;c[ja>>2]=H;ra=J$(Fa,e,g,r)|0;Oa=c[d>>2]|0;Ic[c[(c[Oa>>2]|0)+16>>2]&511](Oa,Da);Pa=(Ga|0)==0;if((ra|0)==0){M=32;break b}if(!Pa){k0(Ga);D0(Ga)}if((Ha|0)!=0){k0(Ha);D0(Ha)}if((Ia|0)!=0){k0(Ia);D0(Ia)}if((Ja|0)!=0){k0(Ja);D0(Ja)}if((Ka|0)!=0){k0(Ka);D0(Ka)}if((La|0)!=0){k0(La);D0(La)}if((Ma|0)!=0){k0(Ma);D0(Ma)}if((Na|0)!=0){k0(Na);D0(Na)}if((Fa|0)==0){ta=ra;break}D0(Fa);ta=ra}}while(0);c[J+(na<<2)>>2]=ta}na=na+1|0;oa=pa}oa=c[G>>2]|0;if(!(na>>>0<oa>>>0)){K=oa;L=na;M=82;break a}else{la=na}}switch(M|0){case 7:{ja=c[d>>2]|0;ld[c[(c[ja>>2]|0)+24>>2]&255](ja,708656,j);Qa=la;break a;break};case 10:{ja=c[d>>2]|0;ld[c[(c[ja>>2]|0)+24>>2]&255](ja,708720,j);Qa=la;break a;break};case 12:{ja=c[d>>2]|0;ld[c[(c[ja>>2]|0)+24>>2]&255](ja,708656,j);Qa=na;break a;break};case 14:{ja=c[d>>2]|0;ld[c[(c[ja>>2]|0)+24>>2]&255](ja,708792,j);Qa=na;break a;break};case 16:{ja=c[d>>2]|0;ld[c[(c[ja>>2]|0)+24>>2]&255](ja,708872,j);Qa=na;break a;break};case 22:{if(sa){Qa=na;break a}D0(qa);Qa=na;break a;break};case 27:{ja=c[d>>2]|0;ld[c[(c[ja>>2]|0)+24>>2]&255](ja,708656,j);Qa=na;break a;break};case 32:{if(!Pa){k0(Ga);D0(Ga)}if((Ha|0)!=0){k0(Ha);D0(Ha)}if((Ia|0)!=0){k0(Ia);D0(Ia)}if((Ja|0)!=0){k0(Ja);D0(Ja)}if((Ka|0)!=0){k0(Ka);D0(Ka)}if((La|0)!=0){k0(La);D0(La)}if((Ma|0)!=0){k0(Ma);D0(Ma)}if((Na|0)!=0){k0(Na);D0(Na)}if((Fa|0)==0){Qa=na;break a}D0(Fa);Qa=na;break a;break};case 71:{ja=c[d>>2]|0;ld[c[(c[ja>>2]|0)+24>>2]&255](ja,708656,j);Qa=na;break a;break};case 73:{ja=c[(c[wa>>2]|0)+24>>2]|0;c[j>>2]=va;ld[ja&255](wa,709760,j);Qa=na;break a;break};case 75:{Ic[c[(c[ya>>2]|0)+16>>2]&511](ya,xa);Qa=na;break a;break};case 77:{if(Ea){Qa=na;break a}D0(za);Qa=na;break a;break}}}}while(0);c:do{if((M|0)==82){na=c[d>>2]|0;za=Qc[c[(c[na>>2]|0)+4>>2]&255](na,4,(c[F>>2]|0)+K|0)|0;d:do{if((c[G>>2]|0)!=(0-(c[F>>2]|0)|0)){na=0;Ea=0;while(1){if((nda(x,e,n)|0)==-1){M=84;break}xa=c[n>>2]|0;ya=xa+Ea|0;wa=c[F>>2]|0;va=c[G>>2]|0;if(ya>>>0>(va+wa|0)>>>0){M=86;break}if((xa|0)!=0){if(Ea>>>0<ya>>>0){Fa=Ea;do{c[za+(Fa<<2)>>2]=na;Fa=Fa+1|0}while(Fa>>>0<ya>>>0);Ra=xa;Sa=c[F>>2]|0;Ta=c[G>>2]|0}else{Ra=xa;Sa=wa;Ta=va}}else{Ra=0;Sa=wa;Ta=va}Ea=Ra+Ea|0;if(!(Ea>>>0<(Ta+Sa|0)>>>0)){break d}else{na=na^1}}if((M|0)==84){na=c[d>>2]|0;Ic[c[(c[na>>2]|0)+16>>2]&511](na,za);na=c[d>>2]|0;ld[c[(c[na>>2]|0)+24>>2]&255](na,708656,j);Qa=L;break c}else if((M|0)==86){na=c[d>>2]|0;Ic[c[(c[na>>2]|0)+16>>2]&511](na,za);na=c[d>>2]|0;ld[c[(c[na>>2]|0)+24>>2]&255](na,709848,j);Qa=L;break c}}}while(0);la=C0(24,c[d>>2]|0)|0;K0(la);c[la>>2]=c[d>>2];na=d+24|0;Ea=la+4|0;c[Ea>>2]=c[na>>2];ya=c[d>>2]|0;Fa=la+8|0;c[Fa>>2]=Qc[c[(c[ya>>2]|0)+4>>2]&255](ya,4,c[na>>2]|0)|0;ya=c[F>>2]|0;if((c[G>>2]|0)==(0-ya|0)){Ua=0}else{pa=d+16|0;Na=ya;ya=0;Ma=0;while(1){if((c[za+(ya<<2)>>2]|0)==0){if(!(ya>>>0<Na>>>0)?(La=c[J+(ya-Na<<2)>>2]|0,(La|0)!=0):0){o0(La);D0(La);Va=Ma}else{Va=Ma}}else{if(Ma>>>0<(c[na>>2]|0)>>>0){if(ya>>>0<Na>>>0){La=C0(24,c[d>>2]|0)|0;n0(La,c[(c[pa>>2]|0)+(ya<<2)>>2]|0);c[(c[Fa>>2]|0)+(Ma<<2)>>2]=La;c[c[(c[Fa>>2]|0)+(Ma<<2)>>2]>>2]=c[d>>2]}else{c[(c[Fa>>2]|0)+(Ma<<2)>>2]=c[J+(ya-Na<<2)>>2]}Va=Ma+1|0}else{Va=Ma}}ya=ya+1|0;Na=c[F>>2]|0;if(!(ya>>>0<((c[G>>2]|0)+Na|0)>>>0)){Ua=Va;break}else{Ma=Va}}}if(Ua>>>0<(c[na>>2]|0)>>>0){c[Ea>>2]=Ua}Ma=c[d>>2]|0;Ic[c[(c[Ma>>2]|0)+16>>2]&511](Ma,za);Ma=c[d>>2]|0;Ic[c[(c[Ma>>2]|0)+16>>2]&511](Ma,J);if((s|0)!=0){mda(c[s>>2]|0,c[s+4>>2]|0);D0(s)}if((t|0)!=0){mda(c[t>>2]|0,c[t+4>>2]|0);D0(t)}if((u|0)!=0){mda(c[u>>2]|0,c[u+4>>2]|0);D0(u)}if((v|0)!=0){mda(c[v>>2]|0,c[v+4>>2]|0);D0(v)}if((w|0)!=0){mda(c[w>>2]|0,c[w+4>>2]|0);D0(w)}if((x|0)!=0){mda(c[x>>2]|0,c[x+4>>2]|0);D0(x)}if((H|0)!=0){pda(c[H>>2]|0,c[H+4>>2]|0);D0(H)}if((y|0)!=0){mda(c[y>>2]|0,c[y+4>>2]|0);D0(y)}if((z|0)!=0){mda(c[z>>2]|0,c[z+4>>2]|0);D0(z)}if((A|0)!=0){mda(c[A>>2]|0,c[A+4>>2]|0);D0(A)}if((B|0)!=0){mda(c[B>>2]|0,c[B+4>>2]|0);D0(B)}if((C|0)!=0){mda(c[C>>2]|0,c[C+4>>2]|0);D0(C)}if((D|0)!=0){mda(c[D>>2]|0,c[D+4>>2]|0);D0(D)}if((E|0)==0){Wa=la;i=h;return Wa|0}mda(c[E>>2]|0,c[E+4>>2]|0);D0(E);Wa=la;i=h;return Wa|0}}while(0);if((Qa|0)!=0){Ua=0;do{Va=J+(Ua<<2)|0;G=c[Va>>2]|0;if((G|0)!=0){o0(G);D0(G);c[Va>>2]=0}Ua=Ua+1|0}while(Ua>>>0<Qa>>>0)}Qa=c[d>>2]|0;Ic[c[(c[Qa>>2]|0)+16>>2]&511](Qa,J);if((s|0)!=0){mda(c[s>>2]|0,c[s+4>>2]|0);D0(s)}if((t|0)!=0){mda(c[t>>2]|0,c[t+4>>2]|0);D0(t)}if((u|0)!=0){mda(c[u>>2]|0,c[u+4>>2]|0);D0(u)}if((v|0)!=0){mda(c[v>>2]|0,c[v+4>>2]|0);D0(v)}if((w|0)!=0){mda(c[w>>2]|0,c[w+4>>2]|0);D0(w)}if((x|0)!=0){mda(c[x>>2]|0,c[x+4>>2]|0);D0(x)}if((H|0)!=0){pda(c[H>>2]|0,c[H+4>>2]|0);D0(H)}if((y|0)!=0){mda(c[y>>2]|0,c[y+4>>2]|0);D0(y)}if((z|0)!=0){mda(c[z>>2]|0,c[z+4>>2]|0);D0(z)}if((A|0)!=0){mda(c[A>>2]|0,c[A+4>>2]|0);D0(A)}if((B|0)!=0){mda(c[B>>2]|0,c[B+4>>2]|0);D0(B)}if((C|0)!=0){mda(c[C>>2]|0,c[C+4>>2]|0);D0(C)}if((D|0)!=0){mda(c[D>>2]|0,c[D+4>>2]|0);D0(D)}if((E|0)==0){Wa=0;i=h;return Wa|0}mda(c[E>>2]|0,c[E+4>>2]|0);D0(E);Wa=0;i=h;return Wa|0}function L$(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0;h=i;i=i+48|0;j=h;k=h+40|0;l=h+36|0;m=h+32|0;n=h+28|0;o=h+24|0;p=h+20|0;q=h+16|0;r=h+12|0;s=h+8|0;t=h+4|0;u=C0(8,c[d>>2]|0)|0;e0(u,e);c[u>>2]=c[d>>2];v=c[d>>2]|0;w=d+20|0;x=Qc[c[(c[v>>2]|0)+4>>2]&255](v,c[w>>2]|0,4)|0;f3a(x|0,0,c[w>>2]<<2|0)|0;c[m>>2]=0;v=d+8|0;if((c[v>>2]|0)==0){y=c[d>>2]|0;z=Qc[c[(c[y>>2]|0)+4>>2]&255](y,c[w>>2]|0,4)|0;f3a(z|0,0,c[w>>2]<<2|0)|0;A=z}else{A=0}a:do{if((c[w>>2]|0)==0){B=0;C=128}else{z=d+28|0;y=d+32|0;D=d+40|0;E=d+4|0;F=d+12|0;G=d+16|0;H=d+56|0;I=d+60|0;J=d+61|0;K=d+62|0;L=d+63|0;M=e+12|0;N=d+36|0;O=e+8|0;P=e+4|0;Q=0;R=0;b:while(1){if((f0(u,c[z>>2]|0,k)|0)!=0){C=6;break}Q=(c[k>>2]|0)+Q|0;if(Q>>>0>65535){C=9;break}S=(Q|0)==0;T=0;U=0;V=R;while(1){W=f0(u,c[y>>2]|0,l)|0;c[p>>2]=W;if((W|0)==1){break}else if((W|0)!=0){C=11;break b}if(!(V>>>0<(c[w>>2]|0)>>>0)){C=13;break b}W=(c[l>>2]|0)+T|0;if(W>>>0>65535){C=15;break b}X=W+U|0;if(!(S|(W|0)==0)){Y=c[v>>2]|0;if((Y|0)==1){if((f0(u,c[D>>2]|0,n)|0)!=0){C=21;break b}Z=c[n>>2]|0;do{if(!(Z>>>0>1)){if((Z|0)==1){_=(c[w>>2]|0)+(c[F>>2]|0)|0;$=1;while(1){if(1<<$>>>0<_>>>0){$=$+1|0}else{break}}c[q>>2]=$;aa=c[d>>2]|0;ba=Qc[c[(c[aa>>2]|0)+4>>2]&255](aa,_,8)|0;aa=(_|0)==0;if(!aa){da=$&255;ea=0;do{c[ba+(ea<<3)>>2]=da;c[ba+(ea<<3)+4>>2]=ea;ea=ea+1|0}while((ea|0)!=(_|0))}c[p>>2]=0;if((I$(e,q)|0)==0){fa=0}else{break b}c:while(1){fa=fa<<1|c[q>>2];if(!aa){ga=0;while(1){if((fa|0)==(c[ba+(ga<<3)+4>>2]|0)?(c[ba+(ga<<3)>>2]|0)==0:0){break c}ea=ga+1|0;if(ea>>>0<_>>>0){ga=ea}else{break}}}if((I$(e,q)|0)!=0){C=71;break b}}c[p>>2]=fa;aa=c[d>>2]|0;Ic[c[(c[aa>>2]|0)+16>>2]&511](aa,ba);ha=C0(32,c[d>>2]|0)|0;g0(ha,709536,13,0);c[ha>>2]=c[d>>2];ia=C0(32,c[d>>2]|0)|0;g0(ia,709696,5,0);c[ia>>2]=c[d>>2];if((f0(u,ha,r)|0)!=0){C=81;break b}if((f0(u,ha,s)|0)!=0){C=81;break b}if((f0(u,ia,p)|0)!=0){C=81;break b}if((ha|0)!=0){k0(ha);D0(ha)}if((ia|0)!=0){k0(ia);D0(ia)}$_(e);aa=c[M>>2]|0;c[q>>2]=aa;ea=c[d>>2]|0;ja=Qc[c[(c[ea>>2]|0)+4>>2]&255](ea,_,4)|0;c3a(ja|0,c[G>>2]|0,c[F>>2]<<2|0)|0;c3a(ja+(c[F>>2]<<2)|0,x|0,V<<2|0)|0;ka=C0(36,c[d>>2]|0)|0;la=ka+0|0;ma=la+36|0;do{c[la>>2]=0;la=la+4|0}while((la|0)<(ma|0));c[ka>>2]=c[d>>2];c[ka+4>>2]=W;c[ka+8>>2]=Q;c[ka+12>>2]=c[H>>2];c[ka+16>>2]=c[ja+(ga<<2)>>2];c[ka+20>>2]=c[r>>2];c[ka+24>>2]=c[s>>2];c[ka+28>>2]=0;a[ka+32>>0]=a[I>>0]|0;a[ka+33>>0]=a[J>>0]|0;a[ka+34>>0]=a[K>>0]|0;a[ka+35>>0]=a[L>>0]|0;na=C0(24,c[d>>2]|0)|0;c[na+20>>2]=e;m$(na);c[na>>2]=c[d>>2];oa=C$(ka,na,f)|0;if((oa|0)==0){C=91;break b}$_(e);_=(c[M>>2]|0)+2|0;c[M>>2]=_;if((c[p>>2]|0)!=(_-aa|0)){C=96;break b}_=c[d>>2]|0;Ic[c[(c[_>>2]|0)+16>>2]&511](_,ja);if((ka|0)!=0){D0(ka)}if((na|0)==0){pa=oa;break}D0(na);pa=oa}else{pa=0}}else{qa=C0(104,c[d>>2]|0)|0;la=qa+0|0;ma=la+104|0;do{c[la>>2]=0;la=la+4|0}while((la|0)<(ma|0));c[qa>>2]=c[d>>2];c[qa+4>>2]=c[E>>2];c[qa+8>>2]=1;c[qa+12>>2]=W;c[qa+16>>2]=Q;c[qa+20>>2]=Z;c[qa+24>>2]=1;aa=(c[F>>2]|0)+V|0;c[qa+28>>2]=aa;_=c[d>>2]|0;ea=Qc[c[(c[_>>2]|0)+4>>2]&255](_,aa,8)|0;_=1;while(1){if(1<<_>>>0<aa>>>0){_=_+1|0}else{break}}c[q>>2]=_;if((aa|0)!=0){da=0;do{c[ea+(da<<3)>>2]=_;c[ea+(da<<3)+4>>2]=da;da=da+1|0}while((da|0)!=(aa|0))}c[qa+32>>2]=ea;da=c[d>>2]|0;_=Qc[c[(c[da>>2]|0)+4>>2]&255](da,aa,4)|0;c3a(_|0,c[G>>2]|0,c[F>>2]<<2|0)|0;c3a(_+(c[F>>2]<<2)|0,x|0,V<<2|0)|0;c[qa+40>>2]=_;c[qa+44>>2]=0;c[qa+48>>2]=0;c[qa+52>>2]=0;c[qa+56>>2]=1;a[qa+60>>0]=0;ra=C0(32,c[d>>2]|0)|0;g0(ra,708944,14,0);c[ra>>2]=c[d>>2];sa=C0(32,c[d>>2]|0)|0;g0(sa,709112,21,1);c[sa>>2]=c[d>>2];ta=C0(32,c[d>>2]|0)|0;g0(ta,709368,14,0);c[ta>>2]=c[d>>2];ua=C0(32,c[d>>2]|0)|0;g0(ua,709536,13,0);c[ua>>2]=c[d>>2];va=C0(32,c[d>>2]|0)|0;g0(va,709536,13,0);c[va>>2]=c[d>>2];wa=C0(32,c[d>>2]|0)|0;g0(wa,709536,13,0);c[wa>>2]=c[d>>2];xa=C0(32,c[d>>2]|0)|0;g0(xa,709536,13,0);c[xa>>2]=c[d>>2];ya=C0(32,c[d>>2]|0)|0;g0(ya,709696,5,0);c[ya>>2]=c[d>>2];c[qa+64>>2]=ra;c[qa+68>>2]=sa;c[qa+72>>2]=ta;c[qa+76>>2]=ua;c[qa+80>>2]=va;c[qa+84>>2]=wa;c[qa+88>>2]=xa;c[qa+92>>2]=ya;c[qa+96>>2]=c[H>>2];a[qa+100>>0]=a[I>>0]|0;a[qa+101>>0]=a[J>>0]|0;a[qa+102>>0]=a[K>>0]|0;a[qa+103>>0]=a[L>>0]|0;da=H$(qa,e,f)|0;$=c[d>>2]|0;Ic[c[(c[$>>2]|0)+16>>2]&511]($,ea);$=c[d>>2]|0;Ic[c[(c[$>>2]|0)+16>>2]&511]($,_);za=(ra|0)==0;if((da|0)==0){C=28;break b}if(!za){k0(ra);D0(ra)}if((sa|0)!=0){k0(sa);D0(sa)}if((ta|0)!=0){k0(ta);D0(ta)}if((ua|0)!=0){k0(ua);D0(ua)}if((va|0)!=0){k0(va);D0(va)}if((wa|0)!=0){k0(wa);D0(wa)}if((xa|0)!=0){k0(xa);D0(xa)}if((ya|0)!=0){k0(ya);D0(ya)}if((qa|0)==0){pa=da;break}D0(qa);pa=da}}while(0);c[x+(V<<2)>>2]=pa;Aa=c[v>>2]|0}else{Aa=Y}if((Aa|0)==0){c[A+(V<<2)>>2]=W}}else{c[x+(V<<2)>>2]=0}T=W;U=X;V=V+1|0}do{if((c[v>>2]|0)==0){if((f0(u,c[N>>2]|0,t)|0)!=0){C=110;break b}$_(e);if((c[t>>2]|0)==0){T=(U+7|0)>>>3;Z=((c[O>>2]|0)-(c[M>>2]|0)|0)>>>0<(ca(T,Q)|0)>>>0;Ba=c[d>>2]|0;if(Z){C=117;break b}Z=C0(24,Ba)|0;l0(Z,U,Q);c[m>>2]=Z;c[Z>>2]=c[d>>2];if(S){Ca=Z;C=123}else{da=Z+16|0;_=Z+12|0;$=c[M>>2]|0;Da=0;do{Ea=(c[da>>2]|0)+(ca(c[_>>2]|0,Da)|0)|0;c3a(Ea|0,(c[P>>2]|0)+$|0,T|0)|0;$=(c[M>>2]|0)+T|0;c[M>>2]=$;Da=Da+1|0}while((Da|0)!=(Q|0));c[q>>2]=0;Fa=Z}}else{Ga=C0(92,c[d>>2]|0)|0;c[Ga+4>>2]=0;c[Ga+8>>2]=0;c[Ga+12>>2]=0;b[Ga+32>>1]=0;Da=Ga+36|0;c[Da+0>>2]=0;c[Da+4>>2]=0;c[Da+8>>2]=0;c[Da+12>>2]=0;c[Da+16>>2]=0;c[Ga>>2]=c[d>>2];c[Ga+56>>2]=1;c[Ga+60>>2]=U;c[Ga+64>>2]=Q;if((M$(Ga,m,e)|0)==3){C=119;break b}if((Ga|0)!=0){D0(Ga)}$_(e);Ca=c[m>>2]|0;C=123}if((C|0)==123){C=0;c[q>>2]=0;if((Ca|0)==0){break}else{Fa=Ca}}if(R>>>0<V>>>0){Da=0;$=R;do{T=A+($<<2)|0;c[x+($<<2)>>2]=A0(Fa,Da,c[T>>2]|0,Q)|0;Da=Da+(c[T>>2]|0)|0;c[q>>2]=Da;$=$+1|0}while(($|0)!=(V|0))}o0(Fa);D0(Fa);c[m>>2]=0}}while(0);if(!(V>>>0<(c[w>>2]|0)>>>0)){B=V;C=128;break a}else{R=V}}switch(C|0){case 6:{Q=c[d>>2]|0;ld[c[(c[Q>>2]|0)+24>>2]&255](Q,709928,j);Ha=R;break a;break};case 9:{Q=c[d>>2]|0;ld[c[(c[Q>>2]|0)+24>>2]&255](Q,709992,j);Ha=R;break a;break};case 11:{Q=c[d>>2]|0;ld[c[(c[Q>>2]|0)+24>>2]&255](Q,709928,j);Ha=V;break a;break};case 13:{Q=c[d>>2]|0;ld[c[(c[Q>>2]|0)+24>>2]&255](Q,710064,j);Ha=V;break a;break};case 15:{Q=c[d>>2]|0;ld[c[(c[Q>>2]|0)+24>>2]&255](Q,710144,j);Ha=V;break a;break};case 21:{Q=c[d>>2]|0;ld[c[(c[Q>>2]|0)+24>>2]&255](Q,709928,j);Ha=V;break a;break};case 28:{if(!za){k0(ra);D0(ra)}if((sa|0)!=0){k0(sa);D0(sa)}if((ta|0)!=0){k0(ta);D0(ta)}if((ua|0)!=0){k0(ua);D0(ua)}if((va|0)!=0){k0(va);D0(va)}if((wa|0)!=0){k0(wa);D0(wa)}if((xa|0)!=0){k0(xa);D0(xa)}if((ya|0)!=0){k0(ya);D0(ya)}if((qa|0)==0){Ha=V;break a}D0(qa);Ha=V;break a;break};case 71:{c[p>>2]=fa;break};case 81:{if((ha|0)!=0){k0(ha);D0(ha)}if((ia|0)!=0){k0(ia);D0(ia)}Q=c[d>>2]|0;ld[c[(c[Q>>2]|0)+24>>2]&255](Q,709928,j);Ha=V;break a;break};case 91:{Q=c[d>>2]|0;Ic[c[(c[Q>>2]|0)+16>>2]&511](Q,ja);if((ka|0)!=0){D0(ka)}if((na|0)==0){Ha=V;break a}D0(na);Ha=V;break a;break};case 96:{o0(oa);D0(oa);Q=c[d>>2]|0;Ic[c[(c[Q>>2]|0)+16>>2]&511](Q,ja);if((ka|0)!=0){D0(ka)}if((na|0)!=0){D0(na)}Q=c[d>>2]|0;ld[c[(c[Q>>2]|0)+24>>2]&255](Q,710216,j);Ha=V;break a;break};case 110:{Q=c[d>>2]|0;ld[c[(c[Q>>2]|0)+24>>2]&255](Q,709928,j);Ha=V;break a;break};case 117:{ld[c[(c[Ba>>2]|0)+24>>2]&255](Ba,709928,j);Ha=V;break a;break};case 119:{while(1){C=0;N$(Ga,g)|0;C=119}break}}R=c[d>>2]|0;Ic[c[(c[R>>2]|0)+16>>2]&511](R,ba);R=c[d>>2]|0;ld[c[(c[R>>2]|0)+24>>2]&255](R,709928,j);Ha=V}}while(0);d:do{if((C|0)==128){V=C0(32,c[d>>2]|0)|0;g0(V,709696,5,0);c[V>>2]=c[d>>2];ba=c[d>>2]|0;g=d+12|0;Ga=Qc[c[(c[ba>>2]|0)+4>>2]&255](ba,4,(c[w>>2]|0)+(c[g>>2]|0)|0)|0;e:do{if((c[w>>2]|0)!=(0-(c[g>>2]|0)|0)){ba=0;Ba=0;while(1){if((f0(u,V,o)|0)!=0){C=130;break}na=c[o>>2]|0;ka=na+Ba|0;ja=c[g>>2]|0;oa=c[w>>2]|0;if(ka>>>0>(oa+ja|0)>>>0){C=134;break}if((na|0)!=0){if(Ba>>>0<ka>>>0){ia=Ba;do{c[Ga+(ia<<2)>>2]=ba;ia=ia+1|0}while(ia>>>0<ka>>>0);Ia=na;Ja=c[g>>2]|0;Ka=c[w>>2]|0}else{Ia=na;Ja=ja;Ka=oa}}else{Ia=0;Ja=ja;Ka=oa}Ba=Ia+Ba|0;if(!(Ba>>>0<(Ka+Ja|0)>>>0)){break e}else{ba=ba^1}}if((C|0)==130){if((V|0)!=0){k0(V);D0(V)}ba=c[d>>2]|0;Ic[c[(c[ba>>2]|0)+16>>2]&511](ba,Ga);ba=c[d>>2]|0;ld[c[(c[ba>>2]|0)+24>>2]&255](ba,709928,j);Ha=B;break d}else if((C|0)==134){if((V|0)!=0){k0(V);D0(V)}ba=c[d>>2]|0;Ic[c[(c[ba>>2]|0)+16>>2]&511](ba,Ga);ba=c[d>>2]|0;ld[c[(c[ba>>2]|0)+24>>2]&255](ba,709848,j);Ha=B;break d}}}while(0);if((V|0)!=0){k0(V);D0(V)}ba=C0(24,c[d>>2]|0)|0;K0(ba);c[ba>>2]=c[d>>2];Ba=d+24|0;ka=ba+4|0;c[ka>>2]=c[Ba>>2];ia=c[d>>2]|0;ha=ba+8|0;c[ha>>2]=Qc[c[(c[ia>>2]|0)+4>>2]&255](ia,4,c[Ba>>2]|0)|0;ia=c[g>>2]|0;if((c[w>>2]|0)==(0-ia|0)){La=0}else{fa=d+16|0;p=ia;ia=0;qa=0;while(1){if((c[Ga+(ia<<2)>>2]|0)==0){if(!(ia>>>0<p>>>0)?(ya=c[x+(ia-p<<2)>>2]|0,(ya|0)!=0):0){o0(ya);D0(ya);Ma=qa}else{Ma=qa}}else{if(qa>>>0<(c[Ba>>2]|0)>>>0){if(ia>>>0<p>>>0){ya=C0(24,c[d>>2]|0)|0;n0(ya,c[(c[fa>>2]|0)+(ia<<2)>>2]|0);c[(c[ha>>2]|0)+(qa<<2)>>2]=ya;c[c[(c[ha>>2]|0)+(qa<<2)>>2]>>2]=c[d>>2]}else{c[(c[ha>>2]|0)+(qa<<2)>>2]=c[x+(ia-p<<2)>>2]}Ma=qa+1|0}else{Ma=qa}}ia=ia+1|0;p=c[g>>2]|0;if(!(ia>>>0<((c[w>>2]|0)+p|0)>>>0)){La=Ma;break}else{qa=Ma}}}if(La>>>0<(c[Ba>>2]|0)>>>0){c[ka>>2]=La}qa=c[d>>2]|0;Ic[c[(c[qa>>2]|0)+16>>2]&511](qa,Ga);qa=c[d>>2]|0;Ic[c[(c[qa>>2]|0)+16>>2]&511](qa,x);if((c[v>>2]|0)==0){qa=c[d>>2]|0;Ic[c[(c[qa>>2]|0)+16>>2]&511](qa,A)}if((u|0)==0){Na=ba;i=h;return Na|0}D0(u);Na=ba;i=h;return Na|0}}while(0);if((Ha|0)!=0){La=0;do{Ma=c[x+(La<<2)>>2]|0;if((Ma|0)!=0){o0(Ma);D0(Ma)}La=La+1|0}while(La>>>0<Ha>>>0)}Ha=c[d>>2]|0;Ic[c[(c[Ha>>2]|0)+16>>2]&511](Ha,x);if((c[v>>2]|0)==0){v=c[d>>2]|0;Ic[c[(c[v>>2]|0)+16>>2]&511](v,A)}if((u|0)==0){Na=0;i=h;return Na|0}D0(u);Na=0;i=h;return Na|0}function M$(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;g=i;i=i+16|0;h=g;j=g+8|0;k=C0(24,c[b>>2]|0)|0;l=b+60|0;m=b+64|0;l0(k,c[l>>2]|0,c[m>>2]|0);c[e>>2]=k;c[k>>2]=c[b>>2];k=c[e>>2]|0;n=c[k+16>>2]|0;if((n|0)==0){if((k|0)!=0){o0(k);D0(k)}c[e>>2]=0;o=c[b>>2]|0;p=c[(c[o>>2]|0)+24>>2]|0;q=c[m>>2]|0;c[h>>2]=c[l>>2];c[h+4>>2]=q;ld[p&255](o,708008,h);c[b+16>>2]=-1;r=-1;i=g;return r|0}else{h=f+12|0;o=f+16|0;c[j>>2]=(c[h>>2]<<3)+(c[o>>2]|0);ZV(c[f+4>>2]|0,c[f+8>>2]|0,j,n,c[l>>2]|0,c[m>>2]|0,c[k+12>>2]|0);k=c[j>>2]|0;c[h>>2]=k>>>3;c[o>>2]=k&7;k=c[e>>2]|0;if((ca(c[m>>2]|0,c[k+12>>2]|0)|0)!=0){o=k;k=0;do{h=(c[o+16>>2]|0)+k|0;a[h>>0]=(d[h>>0]|0)^255;k=k+1|0;o=c[e>>2]|0}while(k>>>0<(ca(c[m>>2]|0,c[o+12>>2]|0)|0)>>>0)}c[b+16>>2]=4;r=4;i=g;return r|0}return 0}function N$(a,b){a=a|0;b=b|0;var d=0,f=0,g=0,h=0,j=0;d=i;f=a+16|0;g=c[f>>2]|0;do{if((g|0)==3){h=e[a+32>>1]|0;if((h|0)==3){j=d0(a,b)|0;break}else if((h|0)==1){j=V$(a,b)|0;break}else if((h|0)==2){j=c0(a,b)|0;break}else if((h|0)==4){j=3;break}else{c[f>>2]=-1;j=-1;break}}else{j=g}}while(0);i=d;return j|0}function O$(b,f,g,h){b=b|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;j=i;k=C0(24,c[b>>2]|0)|0;l=b+4|0;l0(k,c[l>>2]|0,c[b+8>>2]|0);c[k>>2]=c[b>>2];s0(k,c[b+28>>2]|0);m=b+36|0;if((c[m>>2]|0)==1){n=C0(24,c[b>>2]|0)|0;o=b+40|0;p=b+44|0;l0(n,c[o>>2]|0,c[p>>2]|0);c[n>>2]=c[b>>2];q=c[p>>2]|0;if((q|0)==0){r=n}else{s=b+48|0;t=b+58|0;u=b+56|0;v=b+52|0;w=b+60|0;x=b+61|0;y=q;q=c[o>>2]|0;z=0;while(1){if((q|0)==0){A=0;B=y}else{C=0;do{D=e[t>>1]|0;E=(ca(D,z)|0)+(c[s>>2]|0)|0;F=e[u>>1]|0;G=(E+(ca(F,C)|0)|0)>>>8;E=((c[v>>2]|0)-(ca(D,C)|0)+(ca(F,z)|0)|0)>>>8;F=d[x>>0]|0;if((((G+(d[w>>0]|0)|0)<1?1:(G|0)>=(c[l>>2]|0))|E>>>0>=F>>>0|(F+E|0)<1|0)==0){q0(n,C,z,0)}else{q0(n,C,z,1)}C=C+1|0;H=c[o>>2]|0}while(C>>>0<H>>>0);A=H;B=c[p>>2]|0}z=z+1|0;if(!(z>>>0<B>>>0)){r=n;break}else{y=B;q=A}}}}else{r=0}A=b+20|0;q=c[A>>2]|0;B=1;while(1){if(1<<B>>>0<q>>>0){B=B+1|0}else{break}}q=C0(32,c[b>>2]|0)|0;c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[q+16>>2]=0;c[q+20>>2]=0;c[q+24>>2]=0;c[q+28>>2]=0;c[q>>2]=c[b>>2];c[q+4>>2]=c[b+12>>2];y=b+40|0;c[q+16>>2]=c[y>>2];n=b+44|0;c[q+20>>2]=c[n>>2];a[q+12>>0]=B;c[q+8>>2]=c[m>>2];c[q+28>>2]=r;a[q+24>>0]=a[b+16>>0]|0;m=P$(q,f,g,h)|0;if((m|0)==0){if((r|0)!=0){o0(r);D0(r)}if((q|0)!=0){D0(q)}if((k|0)==0){I=0;i=j;return I|0}o0(k);D0(k);I=0;i=j;return I|0}h=c[n>>2]|0;if((h|0)!=0){g=b+48|0;f=b+58|0;B=b+56|0;z=b+52|0;p=b+24|0;H=b+32|0;o=c[y>>2]|0;l=h;h=0;while(1){if((o|0)==0){J=l;K=0}else{w=o;x=0;do{v=e[f>>1]|0;u=(ca(v,h)|0)+(c[g>>2]|0)|0;s=e[B>>1]|0;t=(u+(ca(s,x)|0)|0)>>>8;u=((c[z>>2]|0)-(ca(v,x)|0)+(ca(s,h)|0)|0)>>>8;s=c[m+((ca(w,h)|0)+x<<2)>>2]|0;v=c[A>>2]|0;y0(k,t,u,c[(c[p>>2]|0)+((s>>>0<v>>>0?s:v+ -1|0)<<2)>>2]|0,c[H>>2]|0);x=x+1|0;w=c[y>>2]|0}while(x>>>0<w>>>0);J=c[n>>2]|0;K=w}h=h+1|0;if(!(h>>>0<J>>>0)){break}else{o=K;l=J}}}J=c[b>>2]|0;Ic[c[(c[J>>2]|0)+16>>2]&511](J,m);if((r|0)!=0){o0(r);D0(r)}if((q|0)==0){I=k;i=j;return I|0}D0(q);I=k;i=j;return I|0}function P$(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;j=i;k=c[e>>2]|0;l=e+12|0;m=Qc[c[(c[k>>2]|0)+4>>2]&255](k,4,d[l>>0]|0)|0;if((m|0)==0){n=0;i=j;return n|0}k=c[e>>2]|0;o=e+16|0;p=e+20|0;q=id[c[(c[k>>2]|0)+8>>2]&511](k,4,c[o>>2]|0,c[p>>2]|0)|0;if((q|0)==0){k=c[e>>2]|0;Ic[c[(c[k>>2]|0)+16>>2]&511](k,m);n=0;i=j;return n|0}f3a(m|0,0,(d[l>>0]|0)<<2|0)|0;f3a(q|0,0,ca(c[o>>2]<<2,c[p>>2]|0)|0)|0;k=C0(92,c[e>>2]|0)|0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;b[k+32>>1]=0;r=k+36|0;c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[r+16>>2]=0;c[k>>2]=c[e>>2];c[k+56>>2]=c[e+4>>2];c[k+60>>2]=c[o>>2];c[k+64>>2]=c[p>>2];r=e+24|0;s=a[r>>0]|0;a[k+68>>0]=s;c[k+72>>2]=0;c[k+76>>2]=c[e+8>>2];c[k+80>>2]=c[e+28>>2];a[k+84>>0]=(d[r>>0]|0)<2?3:2;a[k+85>>0]=-1;if(s<<24>>24==0){a[k+86>>0]=-3;a[k+87>>0]=-1;a[k+88>>0]=2;a[k+89>>0]=-2;a[k+90>>0]=-2;a[k+91>>0]=-2}if((T$(k,m+((d[l>>0]|0)+ -1<<2)|0,f,g,0)|0)==3){while(1){N$(k,h)|0}}s=d[l>>0]|0;a:do{if((c[m+(s+ -1<<2)>>2]|0)!=0){r=s+ -2|0;b:do{if((r|0)>-1){t=r;while(1){u=m+(t<<2)|0;if((T$(k,u,f,g,0)|0)==3){v=13;break}w=c[u>>2]|0;if((w|0)==0?(x=(d[l>>0]|0)+ -1|0,(x|0)>(t|0)):0){break}y0(w,0,0,c[m+(t+1<<2)>>2]|0,2);if((t|0)>0){t=t+ -1|0}else{break b}}if((v|0)==13){while(1){v=0;N$(k,h)|0;v=13}}t=c[m+(x<<2)>>2]|0;if((t|0)==0){break a}o0(t);D0(t);break a}}while(0);r=c[p>>2]|0;if((r|0)!=0){t=c[o>>2]|0;w=t;u=r;r=t;t=0;while(1){if((r|0)==0){y=u;z=w;A=0}else{B=a[l>>0]|0;C=w;D=0;while(1){if(B<<24>>24==0){E=C;F=0}else{G=C;H=0;while(1){I=(p0(c[m+(H<<2)>>2]|0,D,t)|0)<<H;J=q+((ca(G,t)|0)+D<<2)|0;c[J>>2]=c[J>>2]|I;H=H+1|0;I=a[l>>0]|0;J=c[o>>2]|0;if((H|0)>=(I&255|0)){E=J;F=I;break}else{G=J}}}D=D+1|0;if(!(D>>>0<E>>>0)){break}else{B=F;C=E}}y=c[p>>2]|0;z=E;A=E}t=t+1|0;if(!(t>>>0<y>>>0)){break}else{w=z;u=y;r=A}}}r=a[l>>0]|0;if(!(r<<24>>24==0)){u=r;r=0;while(1){w=c[m+(r<<2)>>2]|0;if((w|0)==0){K=u}else{o0(w);D0(w);K=a[l>>0]|0}r=r+1|0;if((r|0)>=(K&255|0)){break}else{u=K}}}u=c[e>>2]|0;Ic[c[(c[u>>2]|0)+16>>2]&511](u,m);if((k|0)==0){n=q;i=j;return n|0}D0(k);n=q;i=j;return n|0}}while(0);K=c[e>>2]|0;Ic[c[(c[K>>2]|0)+16>>2]&511](K,m);if((k|0)!=0){D0(k)}k=c[e>>2]|0;Ic[c[(c[k>>2]|0)+16>>2]&511](k,q);n=0;i=j;return n|0}function Q$(b,d,f){b=b|0;d=d|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;g=i;h=C0(24,c[b>>2]|0)|0;l0(h,c[b+4>>2]|0,c[b+8>>2]|0);c[h>>2]=c[b>>2];s0(h,c[b+28>>2]|0);j=b+20|0;k=c[j>>2]|0;l=1;while(1){if(1<<l>>>0<k>>>0){l=l+1|0}else{break}}k=C0(32,c[b>>2]|0)|0;c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;c[k+20>>2]=0;c[k+24>>2]=0;c[k+28>>2]=0;c[k>>2]=c[b>>2];c[k+4>>2]=c[b+12>>2];m=b+40|0;c[k+16>>2]=c[m>>2];n=b+44|0;c[k+20>>2]=c[n>>2];a[k+12>>0]=l;c[k+8>>2]=0;l=R$(k,d,f)|0;if((l|0)==0){if((k|0)!=0){D0(k)}if((h|0)==0){o=0;i=g;return o|0}o0(h);D0(h);o=0;i=g;return o|0}f=c[n>>2]|0;if((f|0)!=0){d=b+48|0;p=b+58|0;q=b+56|0;r=b+52|0;s=b+24|0;t=b+32|0;u=c[m>>2]|0;v=f;f=0;while(1){if((u|0)==0){w=v;x=0}else{y=u;z=0;do{A=e[p>>1]|0;B=(ca(A,f)|0)+(c[d>>2]|0)|0;C=e[q>>1]|0;D=(B+(ca(C,z)|0)|0)>>>8;B=((c[r>>2]|0)-(ca(A,z)|0)+(ca(C,f)|0)|0)>>>8;C=c[l+((ca(y,f)|0)+z<<2)>>2]|0;A=c[j>>2]|0;y0(h,D,B,c[(c[s>>2]|0)+((C>>>0<A>>>0?C:A+ -1|0)<<2)>>2]|0,c[t>>2]|0);z=z+1|0;y=c[m>>2]|0}while(z>>>0<y>>>0);w=c[n>>2]|0;x=y}f=f+1|0;if(!(f>>>0<w>>>0)){break}else{u=x;v=w}}}w=c[b>>2]|0;Ic[c[(c[w>>2]|0)+16>>2]&511](w,l);if((k|0)==0){o=h;i=g;return o|0}D0(k);o=h;i=g;return o|0}function R$(e,f,g){e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;h=i;j=c[e>>2]|0;k=e+12|0;l=Qc[c[(c[j>>2]|0)+4>>2]&255](j,4,d[k>>0]|0)|0;if((l|0)==0){m=0;i=h;return m|0}j=c[e>>2]|0;n=e+16|0;o=e+20|0;p=id[c[(c[j>>2]|0)+8>>2]&511](j,4,c[n>>2]|0,c[o>>2]|0)|0;if((p|0)==0){j=c[e>>2]|0;Ic[c[(c[j>>2]|0)+16>>2]&511](j,l);m=0;i=h;return m|0}f3a(l|0,0,(d[k>>0]|0)<<2|0)|0;f3a(p|0,0,ca(c[n>>2]<<2,c[o>>2]|0)|0)|0;j=C0(92,c[e>>2]|0)|0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;b[j+32>>1]=0;q=j+36|0;c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[q+16>>2]=0;c[j>>2]=c[e>>2];c[j+56>>2]=c[e+4>>2];c[j+60>>2]=c[n>>2];c[j+64>>2]=c[o>>2];if((M$(j,l+((d[k>>0]|0)+ -1<<2)|0,f)|0)==3){while(1){N$(j,g)|0}}a:do{if((c[l+((d[k>>0]|0)+ -1<<2)>>2]|0)!=0){$_(f);q=f+12|0;c[q>>2]=(c[q>>2]|0)+3;r=(d[k>>0]|0)+ -2|0;b:do{if((r|0)>-1){s=r;while(1){t=l+(s<<2)|0;if((M$(j,t,f)|0)==3){u=11;break}if((c[t>>2]|0)==0?(v=(d[k>>0]|0)+ -1|0,(v|0)>(s|0)):0){break}$_(f);c[q>>2]=(c[q>>2]|0)+3;y0(c[t>>2]|0,0,0,c[l+(s+1<<2)>>2]|0,2);if((s|0)>0){s=s+ -1|0}else{break b}}if((u|0)==11){while(1){u=0;N$(j,g)|0;u=11}}s=c[l+(v<<2)>>2]|0;if((s|0)==0){break a}o0(s);D0(s);break a}}while(0);q=c[o>>2]|0;if((q|0)!=0){r=c[n>>2]|0;s=r;t=q;q=r;r=0;while(1){if((q|0)==0){w=t;x=s;y=0}else{z=s;A=a[k>>0]|0;B=0;while(1){if(A<<24>>24==0){C=z;D=0}else{E=z;F=0;while(1){G=(p0(c[l+(F<<2)>>2]|0,B,r)|0)<<F;H=p+((ca(E,r)|0)+B<<2)|0;c[H>>2]=c[H>>2]|G;F=F+1|0;G=a[k>>0]|0;H=c[n>>2]|0;if((F|0)>=(G&255|0)){C=H;D=G;break}else{E=H}}}B=B+1|0;if(!(B>>>0<C>>>0)){break}else{z=C;A=D}}w=c[o>>2]|0;x=C;y=C}r=r+1|0;if(!(r>>>0<w>>>0)){break}else{s=x;t=w;q=y}}}q=a[k>>0]|0;if(!(q<<24>>24==0)){t=q;q=0;while(1){s=c[l+(q<<2)>>2]|0;if((s|0)==0){I=t}else{o0(s);D0(s);I=a[k>>0]|0}q=q+1|0;if((q|0)>=(I&255|0)){break}else{t=I}}}t=c[e>>2]|0;Ic[c[(c[t>>2]|0)+16>>2]&511](t,l);if((j|0)==0){m=p;i=h;return m|0}D0(j);m=p;i=h;return m|0}}while(0);I=c[e>>2]|0;Ic[c[(c[I>>2]|0)+16>>2]&511](I,l);if((j|0)!=0){D0(j)}j=c[e>>2]|0;Ic[c[(c[j>>2]|0)+16>>2]&511](j,p);m=0;i=h;return m|0}function S$(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;j=i;i=i+16|0;k=j;c[k>>2]=0;l=C0(12,c[e>>2]|0)|0;F0(l);c[l>>2]=c[e>>2];m=e+12|0;n=(c[m>>2]|0)+1|0;o=l+4|0;c[o>>2]=n;p=c[e>>2]|0;q=Qc[c[(c[p>>2]|0)+4>>2]&255](p,4,n)|0;n=l+8|0;c[n>>2]=q;f3a(q|0,0,c[o>>2]<<2|0)|0;o=C0(92,c[e>>2]|0)|0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;b[o+32>>1]=0;q=o+36|0;c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[q+16>>2]=0;c[o>>2]=c[e>>2];c[o+56>>2]=c[e+4>>2];q=e+8|0;c[o+60>>2]=ca(d[q>>0]|0,(c[m>>2]|0)+1|0)|0;p=e+9|0;c[o+64>>2]=d[p>>0]|0;r=a[e+16>>0]|0;a[o+68>>0]=r;c[o+72>>2]=0;c[o+76>>2]=0;a[o+84>>0]=0-(d[q>>0]|0);a[o+85>>0]=0;if(r<<24>>24==0){a[o+86>>0]=-3;a[o+87>>0]=-1;a[o+88>>0]=2;a[o+89>>0]=-2;a[o+90>>0]=-2;a[o+91>>0]=-2}if((T$(o,k,f,g,0)|0)==3){while(1){N$(o,h)|0}}h=c[k>>2]|0;g=(o|0)==0;if((h|0)==0){if(!g){D0(o)}if((l|0)==0){s=0;i=j;return s|0}G0(l);D0(l);s=0;i=j;return s|0}if(g){t=h;u=0}else{D0(o);t=c[k>>2]|0;u=0}do{o=d[q>>0]|0;h=ca(o,u)|0;g=A0(t,h,o,d[p>>0]|0)|0;c[(c[n>>2]|0)+(u<<2)>>2]=g;u=u+1|0;t=c[k>>2]|0}while(!(u>>>0>(c[m>>2]|0)>>>0));if((t|0)==0){s=l;i=j;return s|0}o0(t);D0(t);s=l;i=j;return s|0}function T$(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=i;i=i+16|0;j=h;k=a+60|0;if((c[k>>2]|0)!=0?(l=a+64|0,(c[l>>2]|0)!=0):0){m=a+16|0;c[m>>2]=2;c[a+12>>2]=g;n=c[d>>2]|0;if((n|0)==0){o=C0(24,c[a>>2]|0)|0;l0(o,c[k>>2]|0,c[l>>2]|0);c[d>>2]=o;c[o>>2]=c[a>>2];p=c[d>>2]|0}else{p=n}if((c[p+16>>2]|0)!=0){b[a+32>>1]=1;c[a+20>>2]=d;s0(c[d>>2]|0,0);c[a+24>>2]=e;c[a+28>>2]=f;c[a+36>>2]=0;c[a+8>>2]=0;c[a+4>>2]=0;q=V$(a,g)|0;i=h;return q|0}if((p|0)!=0){o0(p);D0(p)}c[d>>2]=0;d=c[a>>2]|0;p=c[(c[d>>2]|0)+24>>2]|0;g=c[l>>2]|0;c[j>>2]=c[k>>2];c[j+4>>2]=g;ld[p&255](d,708008,j);c[m>>2]=-1;q=-1;i=h;return q|0}c[a+16>>2]=4;q=4;i=h;return q|0}function U$(a,e,f){a=a|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;g=i;i=i+16|0;h=g;c[h>>2]=0;j=C0(12,c[a>>2]|0)|0;F0(j);c[j>>2]=c[a>>2];k=a+12|0;l=(c[k>>2]|0)+1|0;m=j+4|0;c[m>>2]=l;n=c[a>>2]|0;o=Qc[c[(c[n>>2]|0)+4>>2]&255](n,4,l)|0;l=j+8|0;c[l>>2]=o;f3a(o|0,0,c[m>>2]<<2|0)|0;m=C0(92,c[a>>2]|0)|0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;b[m+32>>1]=0;o=m+36|0;c[o+0>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[o+16>>2]=0;c[m>>2]=c[a>>2];c[m+56>>2]=c[a+4>>2];o=a+8|0;c[m+60>>2]=ca(d[o>>0]|0,(c[k>>2]|0)+1|0)|0;n=a+9|0;c[m+64>>2]=d[n>>0]|0;if((M$(m,h,e)|0)==3){while(1){N$(m,f)|0}}f=c[h>>2]|0;h=(m|0)==0;if((f|0)!=0){if(h){p=0}else{D0(m);p=0}do{e=d[o>>0]|0;a=ca(e,p)|0;q=A0(f,a,e,d[n>>0]|0)|0;c[(c[l>>2]|0)+(p<<2)>>2]=q;p=p+1|0}while(!(p>>>0>(c[k>>2]|0)>>>0));o0(f);D0(f);r=j;i=g;return r|0}if(!h){D0(m)}if((j|0)==0){r=0;i=g;return r|0}G0(j);D0(j);r=0;i=g;return r|0}function V$(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;f=b+4|0;g=c[f>>2]|0;h=c[c[b+20>>2]>>2]|0;j=a[b+68>>0]|0;do{if(j<<24>>24==0){if((((((((a[b+84>>0]|0)==3?(a[b+85>>0]|0)==-1:0)?(a[b+86>>0]|0)==-3:0)?(a[b+87>>0]|0)==-1:0)?(a[b+88>>0]|0)==2:0)?(a[b+89>>0]|0)==-2:0)?(a[b+90>>0]|0)==-2:0)?(a[b+91>>0]|0)==-2:0){k=W$(b,h,c[b+24>>2]|0,c[b+28>>2]|0,d)|0;c[b+16>>2]=k;l=k;break}k=X$(b,h,c[b+24>>2]|0,c[b+28>>2]|0,d)|0;c[b+16>>2]=k;l=k}else if(!(j<<24>>24==1)){k=(a[b+84>>0]|0)==2;if(j<<24>>24==2){if(k?(a[b+85>>0]|0)==-1:0){m=_$(b,h,c[b+24>>2]|0,c[b+28>>2]|0,d)|0;c[b+16>>2]=m;l=m;break}m=$$(b,h,c[b+24>>2]|0,c[b+28>>2]|0,d)|0;c[b+16>>2]=m;l=m;break}else{if(k?(a[b+85>>0]|0)==-1:0){k=a0(b,h,c[b+24>>2]|0,c[b+28>>2]|0,d)|0;c[b+16>>2]=k;l=k;break}k=b0(b,h,c[b+24>>2]|0,c[b+28>>2]|0,d)|0;c[b+16>>2]=k;l=k;break}}else{if((a[b+84>>0]|0)==3?(a[b+85>>0]|0)==-1:0){k=Y$(b,h,c[b+24>>2]|0,c[b+28>>2]|0,d)|0;c[b+16>>2]=k;l=k;break}k=Z$(b,h,c[b+24>>2]|0,c[b+28>>2]|0,d)|0;c[b+16>>2]=k;l=k}}while(0);c[b+40>>2]=0;c[b+48>>2]=c[h+4>>2];c[b+44>>2]=g;c[b+52>>2]=c[f>>2];if((l|0)!=4){i=e;return l|0}c[f>>2]=0;i=e;return l|0}function W$(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0;j=i;k=b+8|0;if((c[k>>2]|0)==0){c[k>>2]=c[e+16>>2]}l=c[e+12>>2]|0;m=c[b+60>>2]|0;n=(m+7|0)>>>3;o=n+ -1|0;p=c[b+64>>2]&2147483647;q=b+4|0;r=c[q>>2]|0;a:do{if(r>>>0<p>>>0){s=b+72|0;t=b+36|0;u=(h|0)==0;v=0-(l<<1)|0;w=0-l|0;x=v|1;y=1-l|0;z=(o|0)>0;A=(m-(o<<3)|0)>0;B=g+317736|0;C=m+8-(n<<3)|0;D=r;while(1){if((c[s>>2]|0)==0){E=c[t>>2]|0;F=D}else{G=B$(f,B)|0;H=c[t>>2]^G;c[t>>2]=H;E=H;F=c[q>>2]|0}do{if((E|0)==1){r0(e,F,F+ -1|0)}else{H=c[k>>2]|0;if(F>>>0>1){G=d[H+v>>0]|0;I=d[H+w>>0]|0;J=G<<6&14336|I&240;K=G<<14;if(z){G=K;L=J;M=0;N=I;O=H+x|0;P=H+y|0;while(1){Q=(d[O>>0]|0)<<6|G;R=d[P>>0]|0|N<<8;S=L;T=0;U=7;while(1){V=B$(f,g+(S<<3)|0)|0;T=V<<U|T&255;S=R>>>U&16|Q>>>U&2048|S<<1&63470|V;if((U|0)<=0){break}else{U=U+ -1|0}}a[(c[k>>2]|0)+M>>0]=T;M=M+1|0;U=Q<<8;if((M|0)>=(o|0)){W=U;X=S;Y=R;break}else{G=U;L=S;N=R;O=O+1|0;P=P+1|0}}}else{W=K;X=J;Y=I}P=Y<<8;if(A){O=X;N=0;L=0;while(1){G=B$(f,g+(O<<3)|0)|0;M=7-L|0;N=G<<M|N&255;L=L+1|0;if((L|0)==(C|0)){break}else{O=W>>>M&2048|O<<1&63470|P>>>M&16|G}}Z=N&255}else{Z=0}a[(c[k>>2]|0)+o>>0]=Z;break}P=H+w|0;if((F&1|0)==0){_=0;$=P}else{_=d[P>>0]|0;$=H+y|0}P=_&240;b:do{if(z){O=F;L=P;I=0;J=_;K=$;while(1){if((O&1|0)==0){aa=J;ba=K}else{aa=d[K>>0]|0|J<<8;ba=K+1|0}G=L;M=0;U=7;while(1){V=B$(f,g+(G<<3)|0)|0;M=V<<U|M&255;G=G<<1&63470|aa>>>U&16|V;if((U|0)<=0){break}else{U=U+ -1|0}}a[(c[k>>2]|0)+I>>0]=M;U=I+1|0;if((U|0)>=(o|0)){ca=G;da=aa;break b}O=c[q>>2]|0;L=G;I=U;J=aa;K=ba}}else{ca=P;da=_}}while(0);P=da<<8;if(A){H=ca;N=0;K=0;while(1){J=B$(f,g+(H<<3)|0)|0;I=7-K|0;N=J<<I|N&255;K=K+1|0;if((K|0)==(C|0)){break}else{H=P>>>I&16|H<<1&63470|J}}ea=N&255}else{ea=0}a[(c[k>>2]|0)+o>>0]=ea}}while(0);c[k>>2]=(c[k>>2]|0)+l;if(!u?(Lc[c[c[h>>2]>>2]&255](h)|0)!=0:0){break}D=(c[q>>2]|0)+1|0;c[q>>2]=D;if(!(D>>>0<p>>>0)){break a}}c[q>>2]=(c[q>>2]|0)+1;c[b+16>>2]=3;fa=3;i=j;return fa|0}}while(0);c[b+16>>2]=4;fa=4;i=j;return fa|0}function X$(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;h=i;j=b+4|0;k=c[j>>2]|0;l=b+64|0;a:do{if(k>>>0<(c[l>>2]|0)>>>0){m=b+72|0;n=b+36|0;o=(g|0)==0;p=b+60|0;q=b+76|0;r=b+84|0;s=b+85|0;t=b+86|0;u=b+87|0;v=b+88|0;w=b+89|0;x=b+90|0;y=b+91|0;z=b+80|0;A=f+317736|0;B=k;while(1){if((c[m>>2]|0)==0){C=c[n>>2]|0;D=B}else{E=B$(e,A)|0;F=c[n>>2]^E;c[n>>2]=F;C=F;D=c[j>>2]|0}b:do{if((C|0)!=1){if((c[p>>2]|0)!=0){F=D+ -1|0;E=D+ -2|0;G=p0(d,0,F)|0;H=p0(d,1,F)|0;I=p0(d,2,F)|0;F=p0(d,0,E)|0;J=D;K=F<<1|(p0(d,1,E)|0);E=H<<1|I|G<<2;G=0;I=0;while(1){if((c[q>>2]|0)!=0?(p0(c[z>>2]|0,I,J)|0)!=0:0){L=0}else{H=(p0(d,(a[r>>0]|0)+I|0,(a[s>>0]|0)+J|0)|0)<<4;F=(p0(d,(a[t>>0]|0)+I|0,(a[u>>0]|0)+J|0)|0)<<10;M=(p0(d,(a[v>>0]|0)+I|0,(a[w>>0]|0)+J|0)|0)<<11;N=B$(e,f+((G|K<<12|E<<5|H|F|M|(p0(d,(a[x>>0]|0)+I|0,(a[y>>0]|0)+J|0)|0)<<15)<<3)|0)|0;if((N|0)==0){L=0}else{q0(d,I,c[j>>2]|0,N);L=N}}N=c[j>>2]|0;M=I+1|0;if(!(M>>>0<(c[p>>2]|0)>>>0)){break b}F=p0(d,I+3|0,N+ -1|0)|0;J=N;K=(p0(d,I+2|0,N+ -2|0)|0|K<<1)&7;E=(F|E<<1)&31;G=(L|G<<1)&15;I=M}}}else{r0(d,D,D+ -1|0)}}while(0);if(!o?(Lc[c[c[g>>2]>>2]&255](g)|0)!=0:0){break}B=(c[j>>2]|0)+1|0;c[j>>2]=B;if(!(B>>>0<(c[l>>2]|0)>>>0)){break a}}c[j>>2]=(c[j>>2]|0)+1;c[b+16>>2]=3;O=3;i=h;return O|0}}while(0);c[b+16>>2]=4;O=4;i=h;return O|0}function Y$(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0;j=i;k=b+8|0;if((c[k>>2]|0)==0){c[k>>2]=c[e+16>>2]}l=c[e+12>>2]|0;m=c[b+60>>2]|0;n=(m+7|0)>>>3;o=n+ -1|0;p=b+4|0;q=c[p>>2]|0;r=b+64|0;a:do{if(q>>>0<(c[r>>2]|0)>>>0){s=b+72|0;t=b+36|0;u=(h|0)==0;v=0-(l<<1)|0;w=0-l|0;x=v|1;y=1-l|0;z=(o|0)>0;A=(m-(o<<3)|0)>0;B=g+15528|0;C=m+8-(n<<3)|0;D=q;while(1){if((c[s>>2]|0)==0){E=c[t>>2]|0;F=D}else{G=B$(f,B)|0;H=c[t>>2]^G;c[t>>2]=H;E=H;F=c[p>>2]|0}do{if((E|0)==1){r0(e,F,F+ -1|0)}else{H=c[k>>2]|0;if(F>>>0>1){G=d[H+v>>0]|0;I=d[H+w>>0]|0;J=I>>>1&120|G<<4&3584;K=G<<12;if(z){G=K;L=J;M=0;N=I;O=H+x|0;P=H+y|0;while(1){Q=(d[O>>0]|0)<<4|G;R=d[P>>0]|0|N<<8;S=L;T=0;U=7;while(1){V=B$(f,g+(S<<3)|0)|0;T=V<<U|T&255;S=Q>>>U&512|S<<1&7670|R>>>(U+1|0)&8|V;if((U|0)<=0){break}else{U=U+ -1|0}}a[(c[k>>2]|0)+M>>0]=T;M=M+1|0;U=Q<<8;if((M|0)>=(o|0)){W=U;X=S;Y=R;break}else{G=U;L=S;N=R;O=O+1|0;P=P+1|0}}}else{W=K;X=J;Y=I}P=Y<<8;if(A){O=X;N=0;L=0;while(1){G=B$(f,g+(O<<3)|0)|0;M=7-L|0;N=G<<M|N&255;U=L+1|0;if((U|0)==(C|0)){break}else{O=W>>>M&512|O<<1&7670|P>>>(8-L|0)&8|G;L=U}}Z=N&255}else{Z=0}a[(c[k>>2]|0)+o>>0]=Z;break}L=H+w|0;if((F&1|0)==0){_=0;$=L}else{_=d[L>>0]|0;$=H+y|0}L=_>>>1&120;b:do{if(z){P=F;O=L;I=0;J=_;K=$;while(1){if((P&1|0)==0){aa=J;ba=K}else{aa=d[K>>0]|0|J<<8;ba=K+1|0}U=O;G=0;M=7;while(1){V=B$(f,g+(U<<3)|0)|0;G=V<<M|G&255;U=aa>>>(M+1|0)&8|U<<1&7670|V;if((M|0)<=0){break}else{M=M+ -1|0}}a[(c[k>>2]|0)+I>>0]=G;M=I+1|0;if((M|0)>=(o|0)){ca=U;da=aa;break b}P=c[p>>2]|0;O=U;I=M;J=aa;K=ba}}else{ca=L;da=_}}while(0);L=da<<8;if(A){H=ca;N=0;K=0;while(1){J=B$(f,g+(H<<3)|0)|0;N=J<<7-K|N&255;I=K+1|0;if((I|0)==(C|0)){break}else{H=L>>>(8-K|0)&8|H<<1&7670|J;K=I}}ea=N&255}else{ea=0}a[(c[k>>2]|0)+o>>0]=ea}}while(0);c[k>>2]=(c[k>>2]|0)+l;if(!u?(Lc[c[c[h>>2]>>2]&255](h)|0)!=0:0){break}D=(c[p>>2]|0)+1|0;c[p>>2]=D;if(!(D>>>0<(c[r>>2]|0)>>>0)){break a}}c[p>>2]=(c[p>>2]|0)+1;c[b+16>>2]=3;fa=3;i=j;return fa|0}}while(0);c[b+16>>2]=4;fa=4;i=j;return fa|0}function Z$(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;h=i;j=b+64|0;a:do{if((c[j>>2]|0)!=0){k=b+72|0;l=b+36|0;m=(g|0)==0;n=b+60|0;o=b+76|0;p=b+84|0;q=b+85|0;r=b+80|0;s=f+15528|0;t=0;while(1){if((c[k>>2]|0)==0){u=c[l>>2]|0}else{v=B$(e,s)|0;w=c[l>>2]^v;c[l>>2]=w;u=w}b:do{if((u|0)!=1){w=t+ -2|0;v=t+ -1|0;if((c[n>>2]|0)!=0){x=p0(d,0,v)|0;y=p0(d,1,v)|0;z=p0(d,2,v)|0;A=p0(d,0,w)|0;B=p0(d,1,w)|0;C=B<<1|(p0(d,2,w)|0)|A<<2;A=y<<1|z|x<<2;x=0;z=0;while(1){if((c[o>>2]|0)!=0?(p0(c[r>>2]|0,z,t)|0)!=0:0){D=0}else{y=B$(e,f+((x|C<<9|A<<4|(p0(d,(a[p>>0]|0)+z|0,(a[q>>0]|0)+t|0)|0)<<3)<<3)|0)|0;if((y|0)==0){D=0}else{q0(d,z,t,y);D=y}}y=z+3|0;B=z+1|0;if(!(B>>>0<(c[n>>2]|0)>>>0)){break b}E=p0(d,y,v)|0;C=(p0(d,y,w)|0|C<<1)&15;A=(E|A<<1)&31;x=(D|x<<1)&7;z=B}}}else{r0(d,t,t+ -1|0)}}while(0);if(!m?(Lc[c[c[g>>2]>>2]&255](g)|0)!=0:0){break}t=t+1|0;if(!(t>>>0<(c[j>>2]|0)>>>0)){break a}}t=b+4|0;c[t>>2]=(c[t>>2]|0)+1;c[b+16>>2]=3;F=3;i=h;return F|0}}while(0);c[b+16>>2]=4;F=4;i=h;return F|0}function _$(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0;j=i;k=b+8|0;if((c[k>>2]|0)==0){c[k>>2]=c[e+16>>2]}l=c[e+12>>2]|0;m=c[b+60>>2]|0;n=(m+7|0)>>>3;o=n+ -1|0;p=b+4|0;q=c[p>>2]|0;r=b+64|0;a:do{if(q>>>0<(c[r>>2]|0)>>>0){s=b+72|0;t=b+36|0;u=(h|0)==0;v=0-(l<<1)|0;w=0-l|0;x=v|1;y=1-l|0;z=(o|0)>0;A=(m-(o<<3)|0)>0;B=g+1832|0;C=m+8-(n<<3)|0;D=q;while(1){if((c[s>>2]|0)==0){E=c[t>>2]|0;F=D}else{G=B$(f,B)|0;H=c[t>>2]^G;c[t>>2]=H;E=H;F=c[p>>2]|0}do{if((E|0)==1){r0(e,F,F+ -1|0)}else{H=c[k>>2]|0;if(F>>>0>1){G=d[H+v>>0]|0;I=d[H+w>>0]|0;J=I>>>3&28|G<<1&384;K=G<<9;if(z){G=K;L=J;M=0;N=I;O=H+x|0;P=H+y|0;while(1){Q=(d[O>>0]|0)<<1|G;R=d[P>>0]|0|N<<8;S=L;T=0;U=7;while(1){V=B$(f,g+(S<<3)|0)|0;T=V<<U|T&255;S=Q>>>U&128|S<<1&890|R>>>(U+3|0)&4|V;if((U|0)<=0){break}else{U=U+ -1|0}}a[(c[k>>2]|0)+M>>0]=T;M=M+1|0;U=Q<<8;if((M|0)>=(o|0)){W=U;X=S;Y=R;break}else{G=U;L=S;N=R;O=O+1|0;P=P+1|0}}}else{W=K;X=J;Y=I}P=Y<<8;if(A){O=X;N=0;L=0;while(1){G=B$(f,g+(O<<3)|0)|0;M=7-L|0;N=G<<M|N&255;U=L+1|0;if((U|0)==(C|0)){break}else{O=W>>>M&128|O<<1&890|P>>>(10-L|0)&4|G;L=U}}Z=N&255}else{Z=0}a[(c[k>>2]|0)+o>>0]=Z;break}L=H+w|0;if((F&1|0)==0){_=0;$=L}else{_=d[L>>0]|0;$=H+y|0}L=_>>>3&28;b:do{if(z){P=F;O=L;I=0;J=_;K=$;while(1){if((P&1|0)==0){aa=J;ba=K}else{aa=d[K>>0]|0|J<<8;ba=K+1|0}U=O;G=0;M=7;while(1){V=B$(f,g+(U<<3)|0)|0;G=V<<M|G&255;U=aa>>>(M+3|0)&4|U<<1&890|V;if((M|0)<=0){break}else{M=M+ -1|0}}a[(c[k>>2]|0)+I>>0]=G;M=I+1|0;if((M|0)>=(o|0)){ca=U;da=aa;break b}P=c[p>>2]|0;O=U;I=M;J=aa;K=ba}}else{ca=L;da=_}}while(0);L=da<<8;if(A){H=ca;N=0;K=0;while(1){J=B$(f,g+(H<<3)|0)|0;N=J<<7-K|N&255;I=K+1|0;if((I|0)==(C|0)){break}else{H=L>>>(10-K|0)&4|H<<1&890|J;K=I}}ea=N&255}else{ea=0}a[(c[k>>2]|0)+o>>0]=ea}}while(0);c[k>>2]=(c[k>>2]|0)+l;if((!u?(((c[p>>2]|0)>>>0)%50|0|0)==0:0)?(Lc[c[c[h>>2]>>2]&255](h)|0)!=0:0){break}D=(c[p>>2]|0)+1|0;c[p>>2]=D;if(!(D>>>0<(c[r>>2]|0)>>>0)){break a}}c[p>>2]=(c[p>>2]|0)+1;c[b+16>>2]=3;fa=3;i=j;return fa|0}}while(0);c[b+16>>2]=4;fa=4;i=j;return fa|0}function $$(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;h=i;j=b+4|0;k=c[j>>2]|0;l=b+64|0;a:do{if(k>>>0<(c[l>>2]|0)>>>0){m=b+72|0;n=b+36|0;o=(g|0)==0;p=b+60|0;q=b+76|0;r=b+84|0;s=b+85|0;t=b+80|0;u=f+1832|0;v=k;while(1){if((c[m>>2]|0)==0){w=c[n>>2]|0;x=v}else{y=B$(e,u)|0;z=c[n>>2]^y;c[n>>2]=z;w=z;x=c[j>>2]|0}b:do{if((w|0)!=1){if((c[p>>2]|0)!=0){z=x+ -1|0;y=x+ -2|0;A=p0(d,0,z)|0;B=p0(d,1,z)|0;z=p0(d,0,y)|0;C=x;D=z<<1|(p0(d,1,y)|0);y=A<<1|B;B=0;A=0;while(1){if((c[q>>2]|0)!=0?(p0(c[t>>2]|0,A,C)|0)!=0:0){E=0}else{z=B$(e,f+((B|D<<7|y<<3|(p0(d,(a[r>>0]|0)+A|0,(a[s>>0]|0)+C|0)|0)<<2)<<3)|0)|0;if((z|0)==0){E=0}else{q0(d,A,c[j>>2]|0,z);E=z}}z=A+2|0;F=c[j>>2]|0;G=A+1|0;if(!(G>>>0<(c[p>>2]|0)>>>0)){break b}H=p0(d,z,F+ -1|0)|0;C=F;D=(p0(d,z,F+ -2|0)|0|D<<1)&7;y=(H|y<<1)&15;B=(E|B<<1)&3;A=G}}}else{r0(d,x,x+ -1|0)}}while(0);if(!o?(Lc[c[c[g>>2]>>2]&255](g)|0)!=0:0){break}v=(c[j>>2]|0)+1|0;c[j>>2]=v;if(!(v>>>0<(c[l>>2]|0)>>>0)){break a}}c[j>>2]=(c[j>>2]|0)+1;c[b+16>>2]=3;I=3;i=h;return I|0}}while(0);c[b+16>>2]=4;I=4;i=h;return I|0}function a0(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;j=i;k=b+8|0;if((c[k>>2]|0)==0){c[k>>2]=c[e+16>>2]}l=c[e+12>>2]|0;m=c[b+60>>2]|0;n=(m+7|0)>>>3;o=n+ -1|0;p=b+4|0;q=c[p>>2]|0;r=b+64|0;a:do{if(q>>>0<(c[r>>2]|0)>>>0){s=b+72|0;t=b+36|0;u=(h|0)==0;v=0-l|0;w=1-l|0;x=(o|0)>0;y=(m-(o<<3)|0)>0;z=g+3240|0;A=m+8-(n<<3)|0;B=q;while(1){if((c[s>>2]|0)==0){C=c[t>>2]|0;D=B}else{E=B$(f,z)|0;F=c[t>>2]^E;c[t>>2]=F;C=F;D=c[p>>2]|0}do{if((C|0)==1){r0(e,D,D+ -1|0)}else{if((D|0)==0){if(x){F=0;E=0;while(1){G=F;H=0;I=7;while(1){J=B$(f,g+(G<<3)|0)|0;H=J<<I|H&255;G=J|G<<1&1006;if((I|0)<=0){break}else{I=I+ -1|0}}a[(c[k>>2]|0)+E>>0]=H;E=E+1|0;if((E|0)>=(o|0)){K=G;break}else{F=G}}}else{K=0}if(y){F=K;E=0;I=0;while(1){J=B$(f,g+(F<<3)|0)|0;E=J<<7-I|E&255;I=I+1|0;if((I|0)==(A|0)){break}else{F=J|F<<1&1006}}L=E&255}else{L=0}a[(c[k>>2]|0)+o>>0]=L;break}F=c[k>>2]|0;I=d[F+v>>0]|0;J=I>>>1&112;M=I<<8;if(x){I=M;N=J;O=0;P=F+w|0;while(1){F=d[P>>0]|0|I;Q=N;R=0;S=7;while(1){T=B$(f,g+(Q<<3)|0)|0;R=T<<S|R&255;Q=F>>>(S+1|0)&16|Q<<1&1006|T;if((S|0)<=0){break}else{S=S+ -1|0}}a[(c[k>>2]|0)+O>>0]=R;O=O+1|0;S=F<<8;if((O|0)>=(o|0)){U=S;V=Q;break}else{I=S;N=Q;P=P+1|0}}}else{U=M;V=J}if(y){P=V;N=0;I=0;while(1){O=B$(f,g+(P<<3)|0)|0;N=O<<7-I|N&255;E=I+1|0;if((E|0)==(A|0)){break}else{P=U>>>(8-I|0)&16|P<<1&1006|O;I=E}}W=N&255}else{W=0}a[(c[k>>2]|0)+o>>0]=W}}while(0);c[k>>2]=(c[k>>2]|0)+l;if(!u?(Lc[c[c[h>>2]>>2]&255](h)|0)!=0:0){break}B=(c[p>>2]|0)+1|0;c[p>>2]=B;if(!(B>>>0<(c[r>>2]|0)>>>0)){break a}}c[p>>2]=(c[p>>2]|0)+1;c[b+16>>2]=3;X=3;i=j;return X|0}}while(0);c[b+16>>2]=4;X=4;i=j;return X|0}function b0(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;h=i;j=b+4|0;k=c[j>>2]|0;l=b+64|0;a:do{if(k>>>0<(c[l>>2]|0)>>>0){m=b+72|0;n=b+36|0;o=(g|0)==0;p=b+60|0;q=b+76|0;r=b+84|0;s=b+85|0;t=b+80|0;u=f+3240|0;v=k;while(1){if((c[m>>2]|0)==0){w=c[n>>2]|0;x=v}else{y=B$(e,u)|0;z=c[n>>2]^y;c[n>>2]=z;w=z;x=c[j>>2]|0}z=x+ -1|0;b:do{if((w|0)!=1){if((c[p>>2]|0)!=0){y=p0(d,0,z)|0;A=x;B=y<<1|(p0(d,1,z)|0);y=0;C=0;while(1){if((c[q>>2]|0)!=0?(p0(c[t>>2]|0,C,A)|0)!=0:0){D=0}else{E=B$(e,f+((B<<5|y|(p0(d,(a[r>>0]|0)+C|0,(a[s>>0]|0)+A|0)|0)<<4)<<3)|0)|0;if((E|0)==0){D=0}else{q0(d,C,c[j>>2]|0,E);D=E}}E=c[j>>2]|0;F=C+1|0;if(!(F>>>0<(c[p>>2]|0)>>>0)){break b}A=E;B=(p0(d,C+2|0,E+ -1|0)|0|B<<1)&31;y=(D|y<<1)&15;C=F}}}else{r0(d,x,z)}}while(0);if(!o?(Lc[c[c[g>>2]>>2]&255](g)|0)!=0:0){break}v=(c[j>>2]|0)+1|0;c[j>>2]=v;if(!(v>>>0<(c[l>>2]|0)>>>0)){break a}}c[j>>2]=(c[j>>2]|0)+1;c[b+16>>2]=3;G=3;i=h;return G|0}}while(0);c[b+16>>2]=4;G=4;i=h;return G|0}function c0(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0;f=i;g=b+36|0;c[g>>2]=0;h=C0(24,c[b>>2]|0)|0;j=b+60|0;k=b+64|0;l0(h,c[j>>2]|0,c[k>>2]|0);c[h>>2]=c[b>>2];s0(h,0);l=b+4|0;a:do{if((c[l>>2]|0)>>>0<(c[k>>2]|0)>>>0){m=b+72|0;n=(e|0)==0;o=b+68|0;p=b+76|0;q=b+84|0;r=b+85|0;s=b+86|0;t=b+87|0;u=b+88|0;v=b+89|0;w=b+90|0;x=b+91|0;y=b+24|0;z=b+28|0;A=b+80|0;B=0;while(1){if((c[m>>2]|0)==0){C=c[g>>2]|0;D=B}else{E=d[o>>0]|0;if((E|0)==3){F=405}else if((E|0)==2){F=229}else if((E|0)==1){F=1941}else if((E|0)==0){F=39717}else{F=B}E=B$(c[y>>2]|0,(c[z>>2]|0)+(F<<3)|0)|0;G=c[g>>2]^E;c[g>>2]=G;C=G;D=F}b:do{if((C|0)!=1){G=d[o>>0]|0;if((G|0)==0){E=c[l>>2]|0;if((c[j>>2]|0)==0){H=D;break}I=E+ -1|0;J=E+ -2|0;K=p0(h,0,I)|0;L=p0(h,1,I)|0;M=p0(h,2,I)|0;I=p0(h,0,J)|0;N=E;E=D;O=I<<1|(p0(h,1,J)|0);J=L<<1|M|K<<2;K=0;M=0;while(1){if((c[p>>2]|0)!=0?(p0(c[A>>2]|0,M,N)|0)!=0:0){P=E;Q=0}else{L=(p0(h,(a[q>>0]|0)+M|0,(a[r>>0]|0)+N|0)|0)<<4;I=(p0(h,(a[s>>0]|0)+M|0,(a[t>>0]|0)+N|0)|0)<<10;R=(p0(h,(a[u>>0]|0)+M|0,(a[v>>0]|0)+N|0)|0)<<11;S=K|O<<12|J<<5|L|I|R|(p0(h,(a[w>>0]|0)+M|0,(a[x>>0]|0)+N|0)|0)<<15;R=B$(c[y>>2]|0,(c[z>>2]|0)+(S<<3)|0)|0;if((R|0)==0){P=S;Q=0}else{q0(h,M,c[l>>2]|0,R);P=S;Q=R}}R=c[l>>2]|0;S=M+1|0;if(!(S>>>0<(c[j>>2]|0)>>>0)){H=P;break b}I=p0(h,M+3|0,R+ -1|0)|0;N=R;E=P;O=(p0(h,M+2|0,R+ -2|0)|0|O<<1)&7;J=(I|J<<1)&31;K=(Q|K<<1)&15;M=S}}else if((G|0)==3){M=c[l>>2]|0;if((c[j>>2]|0)==0){H=D;break}K=M+ -1|0;J=p0(h,0,K)|0;O=M;M=D;E=J<<1|(p0(h,1,K)|0);K=0;J=0;while(1){if((c[p>>2]|0)!=0?(p0(c[A>>2]|0,J,O)|0)!=0:0){T=M;U=0}else{N=E<<5|K|(p0(h,(a[q>>0]|0)+J|0,(a[r>>0]|0)+O|0)|0)<<4;S=B$(c[y>>2]|0,(c[z>>2]|0)+(N<<3)|0)|0;if((S|0)==0){T=N;U=0}else{q0(h,J,c[l>>2]|0,S);T=N;U=S}}S=c[l>>2]|0;N=J+1|0;if(!(N>>>0<(c[j>>2]|0)>>>0)){H=T;break b}O=S;M=T;E=(p0(h,J+2|0,S+ -1|0)|0|E<<1)&31;K=(U|K<<1)&15;J=N}}else if((G|0)==1){J=c[l>>2]|0;if((c[j>>2]|0)==0){H=D;break}K=J+ -1|0;E=J+ -2|0;M=p0(h,0,K)|0;O=p0(h,1,K)|0;N=p0(h,2,K)|0;K=p0(h,0,E)|0;S=p0(h,1,E)|0;I=J;J=D;R=S<<1|(p0(h,2,E)|0)|K<<2;K=O<<1|N|M<<2;M=0;N=0;while(1){if((c[p>>2]|0)!=0?(p0(c[A>>2]|0,N,I)|0)!=0:0){V=J;W=0}else{O=M|R<<9|K<<4|(p0(h,(a[q>>0]|0)+N|0,(a[r>>0]|0)+I|0)|0)<<3;E=B$(c[y>>2]|0,(c[z>>2]|0)+(O<<3)|0)|0;if((E|0)==0){V=O;W=0}else{q0(h,N,c[l>>2]|0,E);V=O;W=E}}E=N+3|0;O=c[l>>2]|0;S=N+1|0;if(!(S>>>0<(c[j>>2]|0)>>>0)){H=V;break b}L=p0(h,E,O+ -1|0)|0;I=O;J=V;R=(p0(h,E,O+ -2|0)|0|R<<1)&15;K=(L|K<<1)&31;M=(W|M<<1)&7;N=S}}else if((G|0)==2){N=c[l>>2]|0;if((c[j>>2]|0)==0){H=D;break}M=N+ -1|0;K=N+ -2|0;R=p0(h,0,M)|0;J=p0(h,1,M)|0;M=p0(h,0,K)|0;I=N;N=D;S=M<<1|(p0(h,1,K)|0);K=R<<1|J;J=0;R=0;while(1){if((c[p>>2]|0)!=0?(p0(c[A>>2]|0,R,I)|0)!=0:0){X=N;Y=0}else{M=J|S<<7|K<<3|(p0(h,(a[q>>0]|0)+R|0,(a[r>>0]|0)+I|0)|0)<<2;L=B$(c[y>>2]|0,(c[z>>2]|0)+(M<<3)|0)|0;if((L|0)==0){X=M;Y=0}else{q0(h,R,c[l>>2]|0,L);X=M;Y=L}}L=R+2|0;M=c[l>>2]|0;O=R+1|0;if(!(O>>>0<(c[j>>2]|0)>>>0)){H=X;break b}E=p0(h,L,M+ -1|0)|0;I=M;N=X;S=(p0(h,L,M+ -2|0)|0|S<<1)&7;K=(E|K<<1)&15;J=(Y|J<<1)&3;R=O}}else{H=D;break}}else{R=c[l>>2]|0;r0(h,R,R+ -1|0);H=D}}while(0);if(!n?(Lc[c[c[e>>2]>>2]&255](e)|0)!=0:0){break}R=(c[l>>2]|0)+1|0;c[l>>2]=R;if(R>>>0<(c[k>>2]|0)>>>0){B=H}else{break a}}c[l>>2]=(c[l>>2]|0)+1;c[b+16>>2]=3;Z=3;i=f;return Z|0}}while(0);c[b+16>>2]=4;Z=4;i=f;return Z|0}function d0(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;f=i;g=c[c[b+20>>2]>>2]|0;h=b+4|0;j=b+64|0;a:do{if((c[h>>2]|0)>>>0<(c[j>>2]|0)>>>0){k=b+72|0;l=b+36|0;m=(e|0)==0;n=b+60|0;o=b+76|0;p=b+68|0;q=b+24|0;r=b+28|0;s=b+84|0;t=b+85|0;u=b+86|0;v=b+87|0;w=b+88|0;x=b+89|0;y=b+90|0;z=b+91|0;A=b+80|0;B=0;while(1){if((c[k>>2]|0)==0){C=c[l>>2]|0;D=B}else{E=d[p>>0]|0;if((E|0)==3){F=405}else if((E|0)==2){F=229}else if((E|0)==1){F=1941}else if((E|0)==0){F=39717}else{F=B}E=B$(c[q>>2]|0,(c[r>>2]|0)+(F<<3)|0)|0;G=c[l>>2]^E;c[l>>2]=G;C=G;D=F}G=(c[n>>2]|0)==0;if((C|0)==1){if(G){H=D}else{E=0;do{I=c[h>>2]|0;q0(g,E,I,p0(g,E,I+ -1|0)|0);E=E+1|0}while(E>>>0<(c[n>>2]|0)>>>0);H=D}}else{if(G){H=D}else{E=D;I=0;while(1){if((c[o>>2]|0)!=0?(J=c[h>>2]|0,(p0(c[A>>2]|0,I,J)|0)!=0):0){q0(g,I,J,0);K=E}else{J=d[p>>0]|0;if((J|0)==3){L=I+ -1|0;M=c[h>>2]|0;N=p0(g,L,M)|0;O=I+ -2|0;P=(p0(g,O,M)|0)<<1|N;N=I+ -3|0;Q=P|(p0(g,N,M)|0)<<2;P=Q|(p0(g,I+ -4|0,M)|0)<<3;Q=P|(p0(g,(a[s>>0]|0)+I|0,(a[t>>0]|0)+M|0)|0)<<4;P=M+ -1|0;M=Q|(p0(g,I+1|0,P)|0)<<5;Q=M|(p0(g,I,P)|0)<<6;M=Q|(p0(g,L,P)|0)<<7;L=M|(p0(g,O,P)|0)<<8;R=L|(p0(g,N,P)|0)<<9}else if((J|0)==2){P=I+ -1|0;N=c[h>>2]|0;L=p0(g,P,N)|0;O=I+ -2|0;M=(p0(g,O,N)|0)<<1|L;L=M|(p0(g,(a[s>>0]|0)+I|0,(a[t>>0]|0)+N|0)|0)<<2;M=I+1|0;Q=N+ -1|0;S=L|(p0(g,M,Q)|0)<<3;L=S|(p0(g,I,Q)|0)<<4;S=L|(p0(g,P,Q)|0)<<5;L=S|(p0(g,O,Q)|0)<<6;Q=N+ -2|0;N=L|(p0(g,M,Q)|0)<<7;M=N|(p0(g,I,Q)|0)<<8;R=M|(p0(g,P,Q)|0)<<9}else if((J|0)==0){Q=I+ -1|0;P=c[h>>2]|0;M=p0(g,Q,P)|0;N=I+ -2|0;L=(p0(g,N,P)|0)<<1|M;M=L|(p0(g,I+ -3|0,P)|0)<<2;L=M|(p0(g,I+ -4|0,P)|0)<<3;M=L|(p0(g,(a[s>>0]|0)+I|0,(a[t>>0]|0)+P|0)|0)<<4;L=P+ -1|0;O=M|(p0(g,I+2|0,L)|0)<<5;M=I+1|0;S=O|(p0(g,M,L)|0)<<6;O=S|(p0(g,I,L)|0)<<7;S=O|(p0(g,Q,L)|0)<<8;O=S|(p0(g,N,L)|0)<<9;L=O|(p0(g,(a[u>>0]|0)+I|0,(a[v>>0]|0)+P|0)|0)<<10;O=L|(p0(g,(a[w>>0]|0)+I|0,(a[x>>0]|0)+P|0)|0)<<11;L=P+ -2|0;N=O|(p0(g,M,L)|0)<<12;M=N|(p0(g,I,L)|0)<<13;N=M|(p0(g,Q,L)|0)<<14;R=N|(p0(g,(a[y>>0]|0)+I|0,(a[z>>0]|0)+P|0)|0)<<15}else if((J|0)==1){J=I+ -1|0;P=c[h>>2]|0;N=p0(g,J,P)|0;L=I+ -2|0;Q=(p0(g,L,P)|0)<<1|N;N=Q|(p0(g,I+ -3|0,P)|0)<<2;Q=N|(p0(g,(a[s>>0]|0)+I|0,(a[t>>0]|0)+P|0)|0)<<3;N=I+2|0;M=P+ -1|0;O=Q|(p0(g,N,M)|0)<<4;Q=I+1|0;S=O|(p0(g,Q,M)|0)<<5;O=S|(p0(g,I,M)|0)<<6;S=O|(p0(g,J,M)|0)<<7;O=S|(p0(g,L,M)|0)<<8;M=P+ -2|0;P=O|(p0(g,N,M)|0)<<9;N=P|(p0(g,Q,M)|0)<<10;Q=N|(p0(g,I,M)|0)<<11;R=Q|(p0(g,J,M)|0)<<12}else{R=0}M=B$(c[q>>2]|0,(c[r>>2]|0)+(R<<3)|0)|0;q0(g,I,c[h>>2]|0,M);K=R}I=I+1|0;if(!(I>>>0<(c[n>>2]|0)>>>0)){H=K;break}else{E=K}}}}if(!m?(Lc[c[c[e>>2]>>2]&255](e)|0)!=0:0){break}E=(c[h>>2]|0)+1|0;c[h>>2]=E;if(E>>>0<(c[j>>2]|0)>>>0){B=H}else{break a}}c[h>>2]=(c[h>>2]|0)+1;c[b+16>>2]=3;T=3;i=f;return T|0}}while(0);c[b+16>>2]=4;T=4;i=f;return T|0}function e0(a,b){a=a|0;b=b|0;c[a+4>>2]=b;return}function f0(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+16|0;f=e;g=a+4|0;if((e$(c[g>>2]|0,f)|0)==-1){h=-1;i=e;return h|0}a=b+8|0;j=b+16|0;k=b+12|0;l=0;m=0;a:while(1){m=c[f>>2]|m<<1;l=l+1|0;n=c[a>>2]|0;if((n|0)>0){o=c[j>>2]|0;p=0;while(1){if((c[o+(p<<2)>>2]|0)==(l|0)?(c[(c[k>>2]|0)+(p<<2)>>2]|0)==(m|0):0){break a}q=p+1|0;if((q|0)<(n|0)){p=q}else{break}}}if((e$(c[g>>2]|0,f)|0)==-1){h=-1;r=19;break}}if((r|0)==19){i=e;return h|0}r=b+4|0;if((c[r>>2]|0)==1?(p|0)==(n+ -1|0):0){h=1;i=e;return h|0}if((c$(c[g>>2]|0,c[(c[b+20>>2]|0)+(p<<2)>>2]|0,f)|0)==-1){h=-1;i=e;return h|0}g=c[a>>2]|0;if((c[r>>2]|0)==0){r=c[(c[b+24>>2]|0)+(p<<2)>>2]|0;a=c[f>>2]|0;if((p|0)==(g+ -2|0)){c[d>>2]=r-a;h=0;i=e;return h|0}else{c[d>>2]=a+r;h=0;i=e;return h|0}}else{r=c[(c[b+24>>2]|0)+(p<<2)>>2]|0;b=c[f>>2]|0;if((p|0)==(g+ -3|0)){c[d>>2]=r-b;h=0;i=e;return h|0}else{c[d>>2]=b+r;h=0;i=e;return h|0}}return 0}function g0(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;g=a+4|0;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;c[g+20>>2]=0;h0(a,b,d,e);c[a+28>>2]=1;i=f;return}function h0(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;f=i;c[a+4>>2]=e;e=a+8|0;c[e>>2]=d;g=c[a>>2]|0;h=a+12|0;c[h>>2]=Qc[c[(c[g>>2]|0)+4>>2]&255](g,4,d)|0;d=c[a>>2]|0;g=a+16|0;c[g>>2]=Qc[c[(c[d>>2]|0)+4>>2]&255](d,4,c[e>>2]|0)|0;d=c[a>>2]|0;j=a+20|0;c[j>>2]=Qc[c[(c[d>>2]|0)+4>>2]&255](d,4,c[e>>2]|0)|0;d=c[a>>2]|0;k=a+24|0;c[k>>2]=Qc[c[(c[d>>2]|0)+4>>2]&255](d,4,c[e>>2]|0)|0;if((c[e>>2]|0)>0){d=c[g>>2]|0;l=0;m=0;while(1){c[d+(m<<2)>>2]=c[b+(m*12|0)>>2];c[(c[j>>2]|0)+(m<<2)>>2]=c[b+(m*12|0)+4>>2];c[(c[k>>2]|0)+(m<<2)>>2]=c[b+(m*12|0)+8>>2];d=c[g>>2]|0;n=c[d+(m<<2)>>2]|0;o=(n|0)>(l|0)?n:l;m=m+1|0;if((m|0)>=(c[e>>2]|0)){p=o;break}else{l=o}}}else{p=0}l=c[a>>2]|0;m=p+1|0;d=Qc[c[(c[l>>2]|0)+4>>2]&255](l,4,m)|0;f3a(d|0,0,m<<2|0)|0;l=c[a>>2]|0;b=Qc[c[(c[l>>2]|0)+4>>2]&255](l,4,m)|0;if((c[e>>2]|0)>0){l=0;do{k=d+(c[(c[g>>2]|0)+(l<<2)>>2]<<2)|0;c[k>>2]=(c[k>>2]|0)+1;l=l+1|0}while((l|0)<(c[e>>2]|0))}c[b>>2]=0;c[d>>2]=0;if((p|0)<1){q=c[a>>2]|0;r=c[q>>2]|0;s=r+16|0;t=c[s>>2]|0;Ic[t&511](q,d);u=c[a>>2]|0;v=c[u>>2]|0;w=v+16|0;x=c[w>>2]|0;Ic[x&511](u,b);i=f;return}else{y=0;z=1}while(1){p=y+(c[b+(z+ -1<<2)>>2]|0)<<1;c[b+(z<<2)>>2]=p;l=c[e>>2]|0;if((l|0)>0){k=l;l=p;p=0;while(1){if((c[(c[g>>2]|0)+(p<<2)>>2]|0)==(z|0)){c[(c[h>>2]|0)+(p<<2)>>2]=l;A=c[e>>2]|0;B=l+1|0}else{A=k;B=l}p=p+1|0;if((p|0)>=(A|0)){break}else{k=A;l=B}}}l=z+1|0;if((l|0)==(m|0)){break}y=c[d+(z<<2)>>2]|0;z=l}q=c[a>>2]|0;r=c[q>>2]|0;s=r+16|0;t=c[s>>2]|0;Ic[t&511](q,d);u=c[a>>2]|0;v=c[u>>2]|0;w=v+16|0;x=c[w>>2]|0;Ic[x&511](u,b);i=f;return}function i0(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+4|0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+20>>2]=0;c[a+28>>2]=j0(a,b)|0;i=d;return}function j0(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;e=i;i=i+16|0;f=e+4|0;g=e;h=e+8|0;if((D_(b,h)|0)==-1){j=0;i=e;return j|0}k=d[h>>0]|0;h=a+4|0;c[h>>2]=k&1;l=(k>>>1&7)+1|0;m=(k>>>4&7)+1|0;if((E_(b,f)|0)==-1){j=0;i=e;return j|0}if((E_(b,g)|0)==-1){j=0;i=e;return j|0}k=c[a>>2]|0;n=a+16|0;c[n>>2]=Qc[c[(c[k>>2]|0)+4>>2]&255](k,4,16)|0;k=c[a>>2]|0;o=a+20|0;c[o>>2]=Qc[c[(c[k>>2]|0)+4>>2]&255](k,4,16)|0;k=c[a>>2]|0;p=a+24|0;c[p>>2]=Qc[c[(c[k>>2]|0)+4>>2]&255](k,4,16)|0;k=c[f>>2]|0;f=a+8|0;c[f>>2]=0;q=c[g>>2]|0;g=0;r=k;s=16;while(1){if((g|0)<(s|0)){t=g;u=s}else{v=s+16|0;w=c[a>>2]|0;x=v<<2;c[n>>2]=Qc[c[(c[w>>2]|0)+12>>2]&255](w,c[n>>2]|0,x)|0;w=c[a>>2]|0;c[o>>2]=Qc[c[(c[w>>2]|0)+12>>2]&255](w,c[o>>2]|0,x)|0;w=c[a>>2]|0;c[p>>2]=Qc[c[(c[w>>2]|0)+12>>2]&255](w,c[p>>2]|0,x)|0;t=c[f>>2]|0;u=v}if((c$(b,l,(c[n>>2]|0)+(t<<2)|0)|0)==-1){j=0;y=34;break}if((c$(b,m,(c[o>>2]|0)+(c[f>>2]<<2)|0)|0)==-1){j=0;y=34;break}c[(c[p>>2]|0)+(c[f>>2]<<2)>>2]=r;v=c[f>>2]|0;r=(1<<c[(c[o>>2]|0)+(v<<2)>>2])+r|0;g=v+1|0;c[f>>2]=g;if((r|0)>=(q|0)){y=10;break}else{s=u}}if((y|0)==10){if((g|0)<(u|0)){z=g;A=u}else{g=u+16|0;u=c[a>>2]|0;s=g<<2;c[n>>2]=Qc[c[(c[u>>2]|0)+12>>2]&255](u,c[n>>2]|0,s)|0;u=c[a>>2]|0;c[o>>2]=Qc[c[(c[u>>2]|0)+12>>2]&255](u,c[o>>2]|0,s)|0;u=c[a>>2]|0;c[p>>2]=Qc[c[(c[u>>2]|0)+12>>2]&255](u,c[p>>2]|0,s)|0;z=c[f>>2]|0;A=g}if((c$(b,l,(c[n>>2]|0)+(z<<2)|0)|0)==-1){j=0;i=e;return j|0}c[(c[o>>2]|0)+(c[f>>2]<<2)>>2]=32;c[(c[p>>2]|0)+(c[f>>2]<<2)>>2]=k+ -1;k=(c[f>>2]|0)+1|0;c[f>>2]=k;if((k|0)<(A|0)){B=k;C=A}else{k=A+16|0;A=c[a>>2]|0;z=k<<2;c[n>>2]=Qc[c[(c[A>>2]|0)+12>>2]&255](A,c[n>>2]|0,z)|0;A=c[a>>2]|0;c[o>>2]=Qc[c[(c[A>>2]|0)+12>>2]&255](A,c[o>>2]|0,z)|0;A=c[a>>2]|0;c[p>>2]=Qc[c[(c[A>>2]|0)+12>>2]&255](A,c[p>>2]|0,z)|0;B=c[f>>2]|0;C=k}if((c$(b,l,(c[n>>2]|0)+(B<<2)|0)|0)==-1){j=0;i=e;return j|0}c[(c[o>>2]|0)+(c[f>>2]<<2)>>2]=32;c[(c[p>>2]|0)+(c[f>>2]<<2)>>2]=q;q=(c[f>>2]|0)+1|0;c[f>>2]=q;do{if((c[h>>2]|0)!=0){if((q|0)<(C|0)){D=q}else{B=c[a>>2]|0;k=(C<<2)+64|0;c[n>>2]=Qc[c[(c[B>>2]|0)+12>>2]&255](B,c[n>>2]|0,k)|0;B=c[a>>2]|0;c[o>>2]=Qc[c[(c[B>>2]|0)+12>>2]&255](B,c[o>>2]|0,k)|0;B=c[a>>2]|0;c[p>>2]=Qc[c[(c[B>>2]|0)+12>>2]&255](B,c[p>>2]|0,k)|0;D=c[f>>2]|0}if((c$(b,l,(c[n>>2]|0)+(D<<2)|0)|0)==-1){j=0;i=e;return j|0}else{k=(c[f>>2]|0)+1|0;c[f>>2]=k;E=k;break}}else{E=q}}while(0);q=c[a>>2]|0;D=a+12|0;c[D>>2]=Qc[c[(c[q>>2]|0)+4>>2]&255](q,4,E)|0;E=c[f>>2]|0;if((E|0)>0){q=c[n>>2]|0;l=0;b=0;while(1){p=c[q+(b<<2)>>2]|0;o=(p|0)>(l|0)?p:l;b=b+1|0;if((b|0)>=(E|0)){F=o;break}else{l=o}}}else{F=0}l=c[a>>2]|0;E=F+1|0;b=Qc[c[(c[l>>2]|0)+4>>2]&255](l,4,E)|0;f3a(b|0,0,E<<2|0)|0;l=c[a>>2]|0;q=Qc[c[(c[l>>2]|0)+4>>2]&255](l,4,E)|0;if((c[f>>2]|0)>0){l=0;do{o=b+(c[(c[n>>2]|0)+(l<<2)>>2]<<2)|0;c[o>>2]=(c[o>>2]|0)+1;l=l+1|0}while((l|0)<(c[f>>2]|0))}c[q>>2]=0;c[b>>2]=0;a:do{if((F|0)>=1){l=0;o=1;while(1){p=l+(c[q+(o+ -1<<2)>>2]|0)<<1;c[q+(o<<2)>>2]=p;C=c[f>>2]|0;if((C|0)>0){h=C;C=p;p=0;while(1){if((c[(c[n>>2]|0)+(p<<2)>>2]|0)==(o|0)){c[(c[D>>2]|0)+(p<<2)>>2]=C;G=c[f>>2]|0;H=C+1|0}else{G=h;H=C}p=p+1|0;if((p|0)>=(G|0)){break}else{h=G;C=H}}}C=o+1|0;if((C|0)==(E|0)){break a}l=c[b+(o<<2)>>2]|0;o=C}}}while(0);E=c[a>>2]|0;Ic[c[(c[E>>2]|0)+16>>2]&511](E,b);b=c[a>>2]|0;Ic[c[(c[b>>2]|0)+16>>2]&511](b,q);j=1;i=e;return j|0}else if((y|0)==34){i=e;return j|0}return 0}function k0(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+12>>2]|0;if((d|0)!=0){e=c[a>>2]|0;Ic[c[(c[e>>2]|0)+16>>2]&511](e,d)}d=c[a+16>>2]|0;if((d|0)!=0){e=c[a>>2]|0;Ic[c[(c[e>>2]|0)+16>>2]&511](e,d)}d=c[a+20>>2]|0;if((d|0)!=0){e=c[a>>2]|0;Ic[c[(c[e>>2]|0)+16>>2]&511](e,d)}d=c[a+24>>2]|0;if((d|0)==0){i=b;return}e=c[a>>2]|0;Ic[c[(c[e>>2]|0)+16>>2]&511](e,d);i=b;return}function l0(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;c[a+4>>2]=b;c[a+8>>2]=d;if((b|0)<1|(d|0)<1|(b|0)>2147483616){c[a+16>>2]=0;c[a+20>>2]=0;i=e;return}f=b+31>>5<<2;c[a+12>>2]=f;if((ca(f,d)|0)>0?(104857600/(f|0)|0|0)>(d|0):0){b=c[a>>2]|0;c[a+16>>2]=Qc[c[(c[b>>2]|0)+4>>2]&255](b,f,d)|0}else{c[a+16>>2]=0}c[a+20>>2]=1;i=e;return}function m0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;c[a+4>>2]=b;c[a+8>>2]=d;c[a+12>>2]=e;c[a+16>>2]=f;c[a+20>>2]=0;return}function n0(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;e=c[b>>2]|0;c[a>>2]=e;c[a+4>>2]=c[b+4>>2];f=c[b+8>>2]|0;g=a+8|0;c[g>>2]=f;h=c[b+12>>2]|0;j=a+12|0;c[j>>2]=h;k=b+16|0;if((c[k>>2]|0)==0){c[a+16>>2]=0;l=a+20|0;c[l>>2]=1;i=d;return}else{b=Qc[c[(c[e>>2]|0)+4>>2]&255](e,h,f)|0;c[a+16>>2]=b;c3a(b|0,c[k>>2]|0,ca(c[g>>2]|0,c[j>>2]|0)|0)|0;l=a+20|0;c[l>>2]=1;i=d;return}}function o0(a){a=a|0;var b=0,d=0,e=0;b=i;if((c[a+20>>2]|0)==0){i=b;return}d=c[a+16>>2]|0;if((d|0)==0){i=b;return}e=c[a>>2]|0;Ic[c[(c[e>>2]|0)+16>>2]&511](e,d);i=b;return}function p0(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0;f=i;g=c[a+16>>2]|0;if((g|0)==0|(b|0)<0){h=0;i=f;return h|0}if((e|0)<0?1:(c[a+4>>2]|0)<=(b|0)){h=0;i=f;return h|0}if((c[a+8>>2]|0)<=(e|0)){h=0;i=f;return h|0}h=(d[g+((ca(c[a+12>>2]|0,e)|0)+(b>>3))>>0]|0)>>>(b&7^7)&1;i=f;return h|0}function q0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0;h=i;j=c[b+16>>2]|0;if((j|0)==0|(e|0)<0){i=h;return}if((f|0)<0?1:(c[b+4>>2]|0)<=(e|0)){i=h;return}if((c[b+8>>2]|0)<=(f|0)){i=h;return}k=(ca(c[b+12>>2]|0,f)|0)+(e>>3)|0;f=1<<(e&7^7);if((g|0)==0){g=j+k|0;a[g>>0]=(d[g>>0]|0)&(f^255);i=h;return}else{g=j+k|0;a[g>>0]=d[g>>0]|0|f;i=h;return}}function r0(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=c[a+16>>2]|0;if((f|0)==0){i=e;return}if((d|0)>=0?(c[a+8>>2]|0)>(d|0):0){g=c[a+12>>2]|0;c3a(f+(ca(g,b)|0)|0,f+(ca(g,d)|0)|0,g|0)|0;i=e;return}g=c[a+12>>2]|0;f3a(f+(ca(g,b)|0)|0,0,g|0)|0;i=e;return}function s0(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[a+16>>2]|0;if((e|0)==0){i=d;return}f3a(e|0,((b|0)!=0)<<31>>31|0,ca(c[a+8>>2]|0,c[a+12>>2]|0)|0)|0;i=d;return}function t0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=i;if((c[a+16>>2]|0)==0){h=0;i=g;return h|0}h=u0(a,b,d,e,f)|0;i=g;return h|0}function u0(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0;j=i;k=c[b+16>>2]|0;if((k|0)==0){l=0;i=j;return l|0}if((f+1048576|0)>>>0>2097152){l=0;i=j;return l|0}if((g+1048576|0)>>>0>2097152){l=0;i=j;return l|0}m=(g|0)<0;n=m?0-g|0:0;o=c[b+8>>2]|0;p=c[e+8>>2]|0;q=(o+g|0)>(p|0)?p-g|0:o;o=(f|0)<0;p=o?0-f|0:0;r=c[b+4>>2]|0;s=c[e+4>>2]|0;t=(r+f|0)>(s|0)?s-f|0:r;if(!((n|0)<(q|0)&(p|0)<(t|0))){l=0;i=j;return l|0}r=q-n|0;q=m?0:g;g=o?0:f;f=t-p+g|0;o=r+q|0;m=g&31;s=f&31;u=p&31;v=-1>>>m;w=-1<<(0-f&31);x=w&v;y=b+12|0;b=c[y>>2]|0;z=p>>5<<2;A=k+((ca(b,n)|0)+z)|0;n=b-z|0;z=e+12|0;b=(c[e+16>>2]|0)+((ca(c[z>>2]|0,q)|0)+(g>>5<<2))|0;if((f+ -1^g)>>>0<32){if(!((t+ -1^p)>>>0<32)){p=u-m|0;t=32-p|0;if((r|0)<=0){l=1;i=j;return l|0}e=~x;k=b;B=A;C=0;D=q;while(1){E=((d[B+5>>0]|0)<<16|(d[B+4>>0]|0)<<24|(d[B+6>>0]|0)<<8|(d[B+7>>0]|0))>>>t|((d[B+1>>0]|0)<<16|(d[B>>0]|0)<<24|(d[B+2>>0]|0)<<8|(d[B+3>>0]|0))<<p;F=k+1|0;G=k+2|0;H=k+3|0;I=(d[F>>0]|0)<<16|(d[k>>0]|0)<<24|(d[G>>0]|0)<<8|(d[H>>0]|0);switch(h|0){case 2:{J=(I^E)&x|I&e;break};case 3:{J=(I^~E)&x|I&e;break};case 4:{J=I&e|E&x;break};case 1:{J=I&(E&x|e);break};case 0:{J=(I|E)&x|I&e;break};default:{J=C}}a[k>>0]=J>>>24;a[F>>0]=J>>>16;a[G>>0]=J>>>8;a[H>>0]=J;D=D+1|0;if((D|0)>=(o|0)){l=1;break}else{k=k+(c[z>>2]|0)|0;B=B+(c[y>>2]|0)|0;C=J}}i=j;return l|0}if(u>>>0>m>>>0){J=u-m|0;if((r|0)<=0){l=1;i=j;return l|0}C=~x;B=b;k=A;D=0;e=q;while(1){p=((d[k+1>>0]|0)<<16|(d[k>>0]|0)<<24|(d[k+2>>0]|0)<<8|(d[k+3>>0]|0))<<J;t=B+1|0;H=B+2|0;G=B+3|0;F=(d[t>>0]|0)<<16|(d[B>>0]|0)<<24|(d[H>>0]|0)<<8|(d[G>>0]|0);switch(h|0){case 3:{K=(F^~p)&x|F&C;break};case 4:{K=F&C|p&x;break};case 1:{K=F&(p&x|C);break};case 0:{K=(F|p)&x|F&C;break};case 2:{K=(F^p)&x|F&C;break};default:{K=D}}a[B>>0]=K>>>24;a[t>>0]=K>>>16;a[H>>0]=K>>>8;a[G>>0]=K;e=e+1|0;if((e|0)>=(o|0)){l=1;break}else{B=B+(c[z>>2]|0)|0;k=k+(c[y>>2]|0)|0;D=K}}i=j;return l|0}else{K=m-u|0;if((r|0)<=0){l=1;i=j;return l|0}D=~x;k=b;B=A;e=0;C=q;while(1){J=((d[B+1>>0]|0)<<16|(d[B>>0]|0)<<24|(d[B+2>>0]|0)<<8|(d[B+3>>0]|0))>>>K;G=k+1|0;H=k+2|0;t=k+3|0;F=(d[G>>0]|0)<<16|(d[k>>0]|0)<<24|(d[H>>0]|0)<<8|(d[t>>0]|0);switch(h|0){case 2:{L=(F^J)&x|F&D;break};case 3:{L=(F^~J)&x|F&D;break};case 1:{L=F&(J&x|D);break};case 4:{L=F&D|J&x;break};case 0:{L=(F|J)&x|F&D;break};default:{L=e}}a[k>>0]=L>>>24;a[G>>0]=L>>>16;a[H>>0]=L>>>8;a[t>>0]=L;C=C+1|0;if((C|0)>=(o|0)){l=1;break}else{k=k+(c[z>>2]|0)|0;B=B+(c[y>>2]|0)|0;e=L}}i=j;return l|0}}if(u>>>0>m>>>0){L=u-m|0;e=32-L|0;B=f>>5;k=g+31>>5;C=B-k|0;if((r|0)<=0){l=1;i=j;return l|0}D=(m|0)==0;x=~v;K=(C|0)>0;t=(s|0)==0;H=~w;G=(B<<2)-(k<<2)|0;k=b;B=A;F=0;J=q;while(1){if(D){M=k;N=B;O=F}else{p=B+4|0;I=((d[B+5>>0]|0)<<16|(d[p>>0]|0)<<24|(d[B+6>>0]|0)<<8|(d[B+7>>0]|0))>>>e|((d[B+1>>0]|0)<<16|(d[B>>0]|0)<<24|(d[B+2>>0]|0)<<8|(d[B+3>>0]|0))<<L;E=k+1|0;P=k+2|0;Q=k+3|0;R=(d[E>>0]|0)<<16|(d[k>>0]|0)<<24|(d[P>>0]|0)<<8|(d[Q>>0]|0);switch(h|0){case 3:{S=(R^~I)&v|R&x;break};case 4:{S=R&x|I&v;break};case 0:{S=(R|I)&v|R&x;break};case 1:{S=R&(I&v|x);break};case 2:{S=(R^I)&v|R&x;break};default:{S=F}}a[k>>0]=S>>>24;a[E>>0]=S>>>16;a[P>>0]=S>>>8;a[Q>>0]=S;M=k+4|0;N=p;O=S}if(K){p=M+G|0;Q=M;P=N;E=O;R=0;while(1){I=P;P=P+4|0;T=((d[I+5>>0]|0)<<16|(d[P>>0]|0)<<24|(d[I+6>>0]|0)<<8|(d[I+7>>0]|0))>>>e|((d[I+1>>0]|0)<<16|(d[I>>0]|0)<<24|(d[I+2>>0]|0)<<8|(d[I+3>>0]|0))<<L;I=Q+1|0;U=Q+2|0;V=Q+3|0;W=(d[I>>0]|0)<<16|(d[Q>>0]|0)<<24|(d[U>>0]|0)<<8|(d[V>>0]|0);switch(h|0){case 0:{X=W|T;break};case 1:{X=W&T;break};case 2:{X=W^T;break};case 3:{X=W^~T;break};case 4:{X=T;break};default:{X=E}}a[Q>>0]=X>>>24;a[I>>0]=X>>>16;a[U>>0]=X>>>8;a[V>>0]=X;R=R+1|0;if((R|0)==(C|0)){break}else{Q=Q+4|0;E=X}}Y=p;Z=N+G|0;_=X}else{Y=M;Z=N;_=O}if(t){$=_}else{E=Z+4|0;if(E>>>0<(B+n|0)>>>0){aa=(d[Z+5>>0]|0)<<16|(d[E>>0]|0)<<24|(d[Z+6>>0]|0)<<8|(d[Z+7>>0]|0)}else{aa=0}E=aa>>>e|((d[Z+1>>0]|0)<<16|(d[Z>>0]|0)<<24|(d[Z+2>>0]|0)<<8|(d[Z+3>>0]|0))<<L;Q=Y+1|0;R=Y+2|0;P=Y+3|0;V=(d[Q>>0]|0)<<16|(d[Y>>0]|0)<<24|(d[R>>0]|0)<<8|(d[P>>0]|0);switch(h|0){case 3:{ba=(V^~E)&w|V&H;break};case 4:{ba=V&H|E&w;break};case 0:{ba=(V|E)&w|V&H;break};case 1:{ba=V&(E&w|H);break};case 2:{ba=(V^E)&w|V&H;break};default:{ba=_}}a[Y>>0]=ba>>>24;a[Q>>0]=ba>>>16;a[R>>0]=ba>>>8;a[P>>0]=ba;$=ba}J=J+1|0;if((J|0)>=(o|0)){l=1;break}else{k=k+(c[z>>2]|0)|0;B=B+(c[y>>2]|0)|0;F=$}}i=j;return l|0}if((u|0)==(m|0)){$=f>>5;F=g+31>>5;B=$-F|0;if((r|0)<=0){l=1;i=j;return l|0}k=(m|0)==0;J=~v;ba=(B|0)>0;Y=(s|0)==0;_=~w;H=($<<2)-(F<<2)|0;F=b;$=A;L=0;Z=q;while(1){if(k){da=F;ea=$;fa=L}else{e=(d[$+1>>0]|0)<<16|(d[$>>0]|0)<<24|(d[$+2>>0]|0)<<8|(d[$+3>>0]|0);aa=F+1|0;t=F+2|0;O=F+3|0;N=(d[aa>>0]|0)<<16|(d[F>>0]|0)<<24|(d[t>>0]|0)<<8|(d[O>>0]|0);switch(h|0){case 0:{ga=(N|e)&v|N&J;break};case 1:{ga=N&(e&v|J);break};case 2:{ga=(N^e)&v|N&J;break};case 3:{ga=(N^~e)&v|N&J;break};case 4:{ga=N&J|e&v;break};default:{ga=L}}a[F>>0]=ga>>>24;a[aa>>0]=ga>>>16;a[t>>0]=ga>>>8;a[O>>0]=ga;da=F+4|0;ea=$+4|0;fa=ga}if(ba){O=da+H|0;t=da;aa=ea;e=fa;N=0;while(1){M=(d[aa+1>>0]|0)<<16|(d[aa>>0]|0)<<24|(d[aa+2>>0]|0)<<8|(d[aa+3>>0]|0);X=t+1|0;G=t+2|0;C=t+3|0;K=(d[X>>0]|0)<<16|(d[t>>0]|0)<<24|(d[G>>0]|0)<<8|(d[C>>0]|0);switch(h|0){case 0:{ha=K|M;break};case 1:{ha=K&M;break};case 2:{ha=K^M;break};case 3:{ha=K^~M;break};case 4:{ha=M;break};default:{ha=e}}a[t>>0]=ha>>>24;a[X>>0]=ha>>>16;a[G>>0]=ha>>>8;a[C>>0]=ha;N=N+1|0;if((N|0)==(B|0)){break}else{t=t+4|0;aa=aa+4|0;e=ha}}ia=O;ja=ea+H|0;ka=ha}else{ia=da;ja=ea;ka=fa}if(Y){la=ka}else{e=(d[ja+1>>0]|0)<<16|(d[ja>>0]|0)<<24|(d[ja+2>>0]|0)<<8|(d[ja+3>>0]|0);aa=ia+1|0;t=ia+2|0;N=ia+3|0;p=(d[aa>>0]|0)<<16|(d[ia>>0]|0)<<24|(d[t>>0]|0)<<8|(d[N>>0]|0);switch(h|0){case 3:{ma=(p^~e)&w|p&_;break};case 4:{ma=p&_|e&w;break};case 0:{ma=(p|e)&w|p&_;break};case 1:{ma=p&(e&w|_);break};case 2:{ma=(p^e)&w|p&_;break};default:{ma=ka}}a[ia>>0]=ma>>>24;a[aa>>0]=ma>>>16;a[t>>0]=ma>>>8;a[N>>0]=ma;la=ma}Z=Z+1|0;if((Z|0)>=(o|0)){l=1;break}else{F=F+(c[z>>2]|0)|0;$=$+(c[y>>2]|0)|0;L=la}}i=j;return l|0}la=m-u|0;u=32-la|0;L=f>>5;f=g+31>>5;g=L-f|0;if((r|0)<=0){l=1;i=j;return l|0}r=(m|0)==0;m=~v;$=(g|0)>0;F=(s|0)==0;s=~w;Z=(L<<2)-(f<<2)|0;f=b;b=A;A=0;L=q;while(1){if(r){na=f;oa=A}else{q=((d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(d[b+2>>0]|0)<<8|(d[b+3>>0]|0))>>>la;ma=f+1|0;ia=f+2|0;ka=f+3|0;_=(d[ma>>0]|0)<<16|(d[f>>0]|0)<<24|(d[ia>>0]|0)<<8|(d[ka>>0]|0);switch(h|0){case 0:{pa=(_|q)&v|_&m;break};case 1:{pa=_&(q&v|m);break};case 2:{pa=(_^q)&v|_&m;break};case 3:{pa=(_^~q)&v|_&m;break};case 4:{pa=_&m|q&v;break};default:{pa=A}}a[f>>0]=pa>>>24;a[ma>>0]=pa>>>16;a[ia>>0]=pa>>>8;a[ka>>0]=pa;na=f+4|0;oa=pa}if($){ka=na+Z|0;ia=na;ma=b;q=oa;_=0;while(1){ja=ma;ma=ma+4|0;Y=((d[ja+5>>0]|0)<<16|(d[ma>>0]|0)<<24|(d[ja+6>>0]|0)<<8|(d[ja+7>>0]|0))>>>la|((d[ja+1>>0]|0)<<16|(d[ja>>0]|0)<<24|(d[ja+2>>0]|0)<<8|(d[ja+3>>0]|0))<<u;ja=ia+1|0;fa=ia+2|0;ea=ia+3|0;da=(d[ja>>0]|0)<<16|(d[ia>>0]|0)<<24|(d[fa>>0]|0)<<8|(d[ea>>0]|0);switch(h|0){case 2:{qa=da^Y;break};case 3:{qa=da^~Y;break};case 4:{qa=Y;break};case 0:{qa=da|Y;break};case 1:{qa=da&Y;break};default:{qa=q}}a[ia>>0]=qa>>>24;a[ja>>0]=qa>>>16;a[fa>>0]=qa>>>8;a[ea>>0]=qa;_=_+1|0;if((_|0)==(g|0)){break}else{ia=ia+4|0;q=qa}}ra=ka;sa=b+Z|0;ta=qa}else{ra=na;sa=b;ta=oa}if(F){ua=ta}else{q=sa+4|0;if(q>>>0<(b+n|0)>>>0){va=(d[sa+5>>0]|0)<<16|(d[q>>0]|0)<<24|(d[sa+6>>0]|0)<<8|(d[sa+7>>0]|0)}else{va=0}q=va>>>la|((d[sa+1>>0]|0)<<16|(d[sa>>0]|0)<<24|(d[sa+2>>0]|0)<<8|(d[sa+3>>0]|0))<<u;ia=ra+1|0;_=ra+2|0;ma=ra+3|0;O=(d[ia>>0]|0)<<16|(d[ra>>0]|0)<<24|(d[_>>0]|0)<<8|(d[ma>>0]|0);switch(h|0){case 1:{wa=O&(q&w|s);break};case 2:{wa=(O^q)&w|O&s;break};case 3:{wa=(O^~q)&w|O&s;break};case 4:{wa=O&s|q&w;break};case 0:{wa=(O|q)&w|O&s;break};default:{wa=ta}}a[ra>>0]=wa>>>24;a[ia>>0]=wa>>>16;a[_>>0]=wa>>>8;a[ma>>0]=wa;ua=wa}L=L+1|0;if((L|0)>=(o|0)){l=1;break}else{f=f+(c[z>>2]|0)|0;b=b+(c[y>>2]|0)|0;A=ua}}i=j;return l|0}function v0(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0;h=i;i=i+16|0;j=h;if((c[a+16>>2]|0)==0){k=0;i=h;return k|0}if((g|0)!=0?(l=c[a+4>>2]|0,m=c[a+8>>2]|0,c[j>>2]=0,c[j+4>>2]=0,c[j+8>>2]=l,c[j+12>>2]=m,(w0(g,j)|0)==0):0){k=x0(a,b,d,e,f,g)|0;i=h;return k|0}k=u0(a,b,d,e,f)|0;i=h;return k|0}function w0(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if(((c[a>>2]|0)==(c[b>>2]|0)?(c[a+8>>2]|0)==(c[b+8>>2]|0):0)?(c[a+4>>2]|0)==(c[b+4>>2]|0):0){e=(c[a+12>>2]|0)==(c[b+12>>2]|0)}else{e=0}i=d;return e&1|0}function x0(b,e,f,g,h,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0;k=i;l=c[b+16>>2]|0;if((l|0)==0){m=0;i=k;return m|0}if((f+1048576|0)>>>0>2097152){m=0;i=k;return m|0}if((g+1048576|0)>>>0>2097152){m=0;i=k;return m|0}n=c[j>>2]|0;o=(c[j+8>>2]|0)-n|0;p=c[j+4>>2]|0;q=(c[j+12>>2]|0)-p|0;j=(g|0)<0;r=j?0-g|0:0;s=c[e+8>>2]|0;t=(q+g|0)>(s|0)?s-g|0:q;q=(f|0)<0;s=q?0-f|0:0;u=c[e+4>>2]|0;v=(o+f|0)>(u|0)?u-f|0:o;if(!((r|0)<(t|0)&(s|0)<(v|0))){m=0;i=k;return m|0}o=t-r|0;t=j?0:g;g=q?0:f;f=v-s+g|0;q=o+t|0;j=g&31;u=f&31;w=s&31;x=-1>>>j;y=-1<<(0-f&31);z=y&x;A=b+12|0;b=c[A>>2]|0;B=l+((ca(b,p+r|0)|0)+(n+s>>5<<2))|0;n=b-(s>>5<<2)|0;b=e+12|0;r=(c[e+16>>2]|0)+((ca(c[b>>2]|0,t)|0)+(g>>5<<2))|0;if((f+ -1^g)>>>0<32){if(!((v+ -1^s)>>>0<32)){s=w-j|0;v=32-s|0;if((o|0)<=0){m=1;i=k;return m|0}e=~z;p=r;l=B;C=0;D=t;while(1){E=((d[l+5>>0]|0)<<16|(d[l+4>>0]|0)<<24|(d[l+6>>0]|0)<<8|(d[l+7>>0]|0))>>>v|((d[l+1>>0]|0)<<16|(d[l>>0]|0)<<24|(d[l+2>>0]|0)<<8|(d[l+3>>0]|0))<<s;F=p+1|0;G=p+2|0;H=p+3|0;I=(d[F>>0]|0)<<16|(d[p>>0]|0)<<24|(d[G>>0]|0)<<8|(d[H>>0]|0);switch(h|0){case 4:{J=I&e|E&z;break};case 0:{J=(I|E)&z|I&e;break};case 2:{J=(I^E)&z|I&e;break};case 3:{J=(I^~E)&z|I&e;break};case 1:{J=I&(E&z|e);break};default:{J=C}}a[p>>0]=J>>>24;a[F>>0]=J>>>16;a[G>>0]=J>>>8;a[H>>0]=J;D=D+1|0;if((D|0)>=(q|0)){m=1;break}else{p=p+(c[b>>2]|0)|0;l=l+(c[A>>2]|0)|0;C=J}}i=k;return m|0}if(w>>>0>j>>>0){J=w-j|0;if((o|0)<=0){m=1;i=k;return m|0}C=~z;l=r;p=B;D=0;e=t;while(1){s=((d[p+1>>0]|0)<<16|(d[p>>0]|0)<<24|(d[p+2>>0]|0)<<8|(d[p+3>>0]|0))<<J;v=l+1|0;H=l+2|0;G=l+3|0;F=(d[v>>0]|0)<<16|(d[l>>0]|0)<<24|(d[H>>0]|0)<<8|(d[G>>0]|0);switch(h|0){case 1:{K=F&(s&z|C);break};case 2:{K=(F^s)&z|F&C;break};case 3:{K=(F^~s)&z|F&C;break};case 0:{K=(F|s)&z|F&C;break};case 4:{K=F&C|s&z;break};default:{K=D}}a[l>>0]=K>>>24;a[v>>0]=K>>>16;a[H>>0]=K>>>8;a[G>>0]=K;e=e+1|0;if((e|0)>=(q|0)){m=1;break}else{l=l+(c[b>>2]|0)|0;p=p+(c[A>>2]|0)|0;D=K}}i=k;return m|0}else{K=j-w|0;if((o|0)<=0){m=1;i=k;return m|0}D=~z;p=r;l=B;e=0;C=t;while(1){J=((d[l+1>>0]|0)<<16|(d[l>>0]|0)<<24|(d[l+2>>0]|0)<<8|(d[l+3>>0]|0))>>>K;G=p+1|0;H=p+2|0;v=p+3|0;s=(d[G>>0]|0)<<16|(d[p>>0]|0)<<24|(d[H>>0]|0)<<8|(d[v>>0]|0);switch(h|0){case 4:{L=s&D|J&z;break};case 1:{L=s&(J&z|D);break};case 0:{L=(s|J)&z|s&D;break};case 3:{L=(s^~J)&z|s&D;break};case 2:{L=(s^J)&z|s&D;break};default:{L=e}}a[p>>0]=L>>>24;a[G>>0]=L>>>16;a[H>>0]=L>>>8;a[v>>0]=L;C=C+1|0;if((C|0)>=(q|0)){m=1;break}else{p=p+(c[b>>2]|0)|0;l=l+(c[A>>2]|0)|0;e=L}}i=k;return m|0}}if(w>>>0>j>>>0){L=w-j|0;e=32-L|0;l=f>>5;p=g+31>>5;C=l-p|0;if((o|0)<=0){m=1;i=k;return m|0}D=(j|0)==0;z=~x;K=(C|0)>0;v=(u|0)==0;H=~y;G=(l<<2)-(p<<2)|0;p=r;l=B;s=0;J=t;while(1){if(D){M=p;N=l;O=s}else{F=l+4|0;E=((d[l+5>>0]|0)<<16|(d[F>>0]|0)<<24|(d[l+6>>0]|0)<<8|(d[l+7>>0]|0))>>>e|((d[l+1>>0]|0)<<16|(d[l>>0]|0)<<24|(d[l+2>>0]|0)<<8|(d[l+3>>0]|0))<<L;I=p+1|0;P=p+2|0;Q=p+3|0;R=(d[I>>0]|0)<<16|(d[p>>0]|0)<<24|(d[P>>0]|0)<<8|(d[Q>>0]|0);switch(h|0){case 1:{S=R&(E&x|z);break};case 0:{S=(R|E)&x|R&z;break};case 2:{S=(R^E)&x|R&z;break};case 3:{S=(R^~E)&x|R&z;break};case 4:{S=R&z|E&x;break};default:{S=s}}a[p>>0]=S>>>24;a[I>>0]=S>>>16;a[P>>0]=S>>>8;a[Q>>0]=S;M=p+4|0;N=F;O=S}if(K){F=M+G|0;Q=M;P=N;I=O;E=0;while(1){R=P;P=P+4|0;T=((d[R+5>>0]|0)<<16|(d[P>>0]|0)<<24|(d[R+6>>0]|0)<<8|(d[R+7>>0]|0))>>>e|((d[R+1>>0]|0)<<16|(d[R>>0]|0)<<24|(d[R+2>>0]|0)<<8|(d[R+3>>0]|0))<<L;R=Q+1|0;U=Q+2|0;V=Q+3|0;W=(d[R>>0]|0)<<16|(d[Q>>0]|0)<<24|(d[U>>0]|0)<<8|(d[V>>0]|0);switch(h|0){case 1:{X=W&T;break};case 2:{X=W^T;break};case 3:{X=W^~T;break};case 4:{X=T;break};case 0:{X=W|T;break};default:{X=I}}a[Q>>0]=X>>>24;a[R>>0]=X>>>16;a[U>>0]=X>>>8;a[V>>0]=X;E=E+1|0;if((E|0)==(C|0)){break}else{Q=Q+4|0;I=X}}Y=F;Z=N+G|0;_=X}else{Y=M;Z=N;_=O}if(v){$=_}else{I=Z+4|0;if(I>>>0<(l+n|0)>>>0){aa=(d[Z+5>>0]|0)<<16|(d[I>>0]|0)<<24|(d[Z+6>>0]|0)<<8|(d[Z+7>>0]|0)}else{aa=0}I=aa>>>e|((d[Z+1>>0]|0)<<16|(d[Z>>0]|0)<<24|(d[Z+2>>0]|0)<<8|(d[Z+3>>0]|0))<<L;Q=Y+1|0;E=Y+2|0;P=Y+3|0;V=(d[Q>>0]|0)<<16|(d[Y>>0]|0)<<24|(d[E>>0]|0)<<8|(d[P>>0]|0);switch(h|0){case 2:{ba=(V^I)&y|V&H;break};case 3:{ba=(V^~I)&y|V&H;break};case 4:{ba=V&H|I&y;break};case 0:{ba=(V|I)&y|V&H;break};case 1:{ba=V&(I&y|H);break};default:{ba=_}}a[Y>>0]=ba>>>24;a[Q>>0]=ba>>>16;a[E>>0]=ba>>>8;a[P>>0]=ba;$=ba}J=J+1|0;if((J|0)>=(q|0)){m=1;break}else{p=p+(c[b>>2]|0)|0;l=l+(c[A>>2]|0)|0;s=$}}i=k;return m|0}if((w|0)==(j|0)){$=f>>5;s=g+31>>5;l=$-s|0;if((o|0)<=0){m=1;i=k;return m|0}p=(j|0)==0;J=~x;ba=(l|0)>0;Y=(u|0)==0;_=~y;H=($<<2)-(s<<2)|0;s=r;$=B;L=0;Z=t;while(1){if(p){da=s;ea=$;fa=L}else{e=(d[$+1>>0]|0)<<16|(d[$>>0]|0)<<24|(d[$+2>>0]|0)<<8|(d[$+3>>0]|0);aa=s+1|0;v=s+2|0;O=s+3|0;N=(d[aa>>0]|0)<<16|(d[s>>0]|0)<<24|(d[v>>0]|0)<<8|(d[O>>0]|0);switch(h|0){case 3:{ga=(N^~e)&x|N&J;break};case 4:{ga=N&J|e&x;break};case 0:{ga=(N|e)&x|N&J;break};case 1:{ga=N&(e&x|J);break};case 2:{ga=(N^e)&x|N&J;break};default:{ga=L}}a[s>>0]=ga>>>24;a[aa>>0]=ga>>>16;a[v>>0]=ga>>>8;a[O>>0]=ga;da=s+4|0;ea=$+4|0;fa=ga}if(ba){O=da+H|0;v=da;aa=ea;N=fa;e=0;while(1){M=(d[aa+1>>0]|0)<<16|(d[aa>>0]|0)<<24|(d[aa+2>>0]|0)<<8|(d[aa+3>>0]|0);X=v+1|0;G=v+2|0;C=v+3|0;K=(d[X>>0]|0)<<16|(d[v>>0]|0)<<24|(d[G>>0]|0)<<8|(d[C>>0]|0);switch(h|0){case 0:{ha=K|M;break};case 1:{ha=K&M;break};case 2:{ha=K^M;break};case 3:{ha=K^~M;break};case 4:{ha=M;break};default:{ha=N}}a[v>>0]=ha>>>24;a[X>>0]=ha>>>16;a[G>>0]=ha>>>8;a[C>>0]=ha;e=e+1|0;if((e|0)==(l|0)){break}else{v=v+4|0;aa=aa+4|0;N=ha}}ia=O;ja=ea+H|0;ka=ha}else{ia=da;ja=ea;ka=fa}if(Y){la=ka}else{N=(d[ja+1>>0]|0)<<16|(d[ja>>0]|0)<<24|(d[ja+2>>0]|0)<<8|(d[ja+3>>0]|0);aa=ia+1|0;v=ia+2|0;e=ia+3|0;F=(d[aa>>0]|0)<<16|(d[ia>>0]|0)<<24|(d[v>>0]|0)<<8|(d[e>>0]|0);switch(h|0){case 0:{ma=(F|N)&y|F&_;break};case 1:{ma=F&(N&y|_);break};case 2:{ma=(F^N)&y|F&_;break};case 3:{ma=(F^~N)&y|F&_;break};case 4:{ma=F&_|N&y;break};default:{ma=ka}}a[ia>>0]=ma>>>24;a[aa>>0]=ma>>>16;a[v>>0]=ma>>>8;a[e>>0]=ma;la=ma}Z=Z+1|0;if((Z|0)>=(q|0)){m=1;break}else{s=s+(c[b>>2]|0)|0;$=$+(c[A>>2]|0)|0;L=la}}i=k;return m|0}la=j-w|0;w=32-la|0;L=f>>5;f=g+31>>5;g=L-f|0;if((o|0)<=0){m=1;i=k;return m|0}o=(j|0)==0;j=~x;$=(g|0)>0;s=(u|0)==0;u=~y;Z=(L<<2)-(f<<2)|0;f=r;r=B;B=0;L=t;while(1){if(o){na=f;oa=B}else{t=((d[r+1>>0]|0)<<16|(d[r>>0]|0)<<24|(d[r+2>>0]|0)<<8|(d[r+3>>0]|0))>>>la;ma=f+1|0;ia=f+2|0;ka=f+3|0;_=(d[ma>>0]|0)<<16|(d[f>>0]|0)<<24|(d[ia>>0]|0)<<8|(d[ka>>0]|0);switch(h|0){case 0:{pa=(_|t)&x|_&j;break};case 1:{pa=_&(t&x|j);break};case 2:{pa=(_^t)&x|_&j;break};case 3:{pa=(_^~t)&x|_&j;break};case 4:{pa=_&j|t&x;break};default:{pa=B}}a[f>>0]=pa>>>24;a[ma>>0]=pa>>>16;a[ia>>0]=pa>>>8;a[ka>>0]=pa;na=f+4|0;oa=pa}if($){ka=na+Z|0;ia=na;ma=r;t=oa;_=0;while(1){ja=ma;ma=ma+4|0;Y=((d[ja+5>>0]|0)<<16|(d[ma>>0]|0)<<24|(d[ja+6>>0]|0)<<8|(d[ja+7>>0]|0))>>>la|((d[ja+1>>0]|0)<<16|(d[ja>>0]|0)<<24|(d[ja+2>>0]|0)<<8|(d[ja+3>>0]|0))<<w;ja=ia+1|0;fa=ia+2|0;ea=ia+3|0;da=(d[ja>>0]|0)<<16|(d[ia>>0]|0)<<24|(d[fa>>0]|0)<<8|(d[ea>>0]|0);switch(h|0){case 0:{qa=da|Y;break};case 1:{qa=da&Y;break};case 2:{qa=da^Y;break};case 3:{qa=da^~Y;break};case 4:{qa=Y;break};default:{qa=t}}a[ia>>0]=qa>>>24;a[ja>>0]=qa>>>16;a[fa>>0]=qa>>>8;a[ea>>0]=qa;_=_+1|0;if((_|0)==(g|0)){break}else{ia=ia+4|0;t=qa}}ra=ka;sa=r+Z|0;ta=qa}else{ra=na;sa=r;ta=oa}if(s){ua=ta}else{t=sa+4|0;if(t>>>0<(r+n|0)>>>0){va=(d[sa+5>>0]|0)<<16|(d[t>>0]|0)<<24|(d[sa+6>>0]|0)<<8|(d[sa+7>>0]|0)}else{va=0}t=va>>>la|((d[sa+1>>0]|0)<<16|(d[sa>>0]|0)<<24|(d[sa+2>>0]|0)<<8|(d[sa+3>>0]|0))<<w;ia=ra+1|0;_=ra+2|0;ma=ra+3|0;O=(d[ia>>0]|0)<<16|(d[ra>>0]|0)<<24|(d[_>>0]|0)<<8|(d[ma>>0]|0);switch(h|0){case 4:{wa=O&u|t&y;break};case 0:{wa=(O|t)&y|O&u;break};case 1:{wa=O&(t&y|u);break};case 2:{wa=(O^t)&y|O&u;break};case 3:{wa=(O^~t)&y|O&u;break};default:{wa=ta}}a[ra>>0]=wa>>>24;a[ia>>0]=wa>>>16;a[_>>0]=wa>>>8;a[ma>>0]=wa;ua=wa}L=L+1|0;if((L|0)>=(q|0)){m=1;break}else{f=f+(c[b>>2]|0)|0;r=r+(c[A>>2]|0)|0;B=ua}}i=k;return m|0}function y0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=i;if((c[a+16>>2]|0)==0){i=g;return}t0(e,a,b,d,f)|0;i=g;return}function z0(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=i;if((c[a+16>>2]|0)==0){i=h;return}v0(e,a,b,d,f,g)|0;i=h;return}function A0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;h=i;if((f|0)==0|(g|0)==0){j=0;i=h;return j|0}k=C0(24,c[b>>2]|0)|0;l0(k,f,g);c[k>>2]=c[b>>2];f=c[b+16>>2]|0;if((f|0)==0){s0(k,0);j=k;i=h;return j|0}l=c[k+16>>2]|0;if((l|0)==0){j=k;i=h;return j|0}m=b+12|0;b=c[m>>2]|0;n=e>>5<<2;o=e&31;e=(g|0)>0;if((o|0)==0){if(!e){j=k;i=h;return j|0}p=k+12|0;q=c[p>>2]|0;r=b;s=0;t=l;u=f;while(1){v=t+q|0;if((q|0)>0){w=t;x=u+n|0;while(1){c[w>>2]=c[x>>2];w=w+4|0;if(!(w>>>0<v>>>0)){break}else{x=x+4|0}}y=c[m>>2]|0;z=c[p>>2]|0}else{y=r;z=q}s=s+1|0;if((s|0)==(g|0)){j=k;break}else{q=z;r=y;t=t+z|0;u=u+y|0}}i=h;return j|0}if(!e){j=k;i=h;return j|0}e=k+12|0;y=32-o|0;u=b;b=c[e>>2]|0;z=0;t=l;l=f;while(1){f=l+u|0;r=t+b|0;if((b|0)>0){q=t;s=l+n|0;do{p=s;s=s+4|0;x=((d[p+1>>0]|0)<<16|(d[p>>0]|0)<<24|(d[p+2>>0]|0)<<8|(d[p+3>>0]|0))<<o;if(s>>>0<f>>>0){A=((d[p+5>>0]|0)<<16|(d[s>>0]|0)<<24|(d[p+6>>0]|0)<<8|(d[p+7>>0]|0))>>>y|x}else{A=x}a[q>>0]=A>>>24;a[q+1>>0]=A>>>16;a[q+2>>0]=A>>>8;a[q+3>>0]=A;q=q+4|0}while(q>>>0<r>>>0);B=c[m>>2]|0;C=c[e>>2]|0}else{B=u;C=b}z=z+1|0;if((z|0)==(g|0)){j=k;break}else{u=B;b=C;t=t+C|0;l=l+B|0}}i=h;return j|0}function B0(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;f=a+16|0;g=c[f>>2]|0;if((g|0)==0){i=e;return}h=c[a>>2]|0;j=a+12|0;k=ca(c[j>>2]|0,b)|0;l=Qc[c[(c[h>>2]|0)+12>>2]&255](h,g,k)|0;c[f>>2]=l;f=a+8|0;a=c[f>>2]|0;if((a|0)<(b|0)){k=c[j>>2]|0;f3a(l+(ca(k,a)|0)|0,((d|0)!=0)<<31>>31|0,ca(k,b-a|0)|0)|0}c[f>>2]=b;i=e;return}function C0(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=dd[c[c[b>>2]>>2]&511](b,a)|0;c[e>>2]=b;i=d;return e|0}function D0(a){a=a|0;var b=0,d=0;b=i;d=c[a>>2]|0;Ic[c[(c[d>>2]|0)+16>>2]&511](d,a);i=b;return}function E0(a,b){a=a|0;b=b|0;var d=0;d=i;Ic[c[(c[b>>2]|0)+16>>2]&511](b,a);i=d;return}function F0(a){a=a|0;c[a+4>>2]=0;c[a+8>>2]=0;return}function G0(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;d=a+8|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}f=a+4|0;g=c[f>>2]|0;if((g|0)==0){h=e}else{j=g;g=e;e=0;while(1){k=c[g+(e<<2)>>2]|0;if((k|0)==0){l=g;m=j}else{o0(k);D0(k);l=c[d>>2]|0;m=c[f>>2]|0}e=e+1|0;if(!(e>>>0<m>>>0)){h=l;break}else{j=m;g=l}}}l=c[a>>2]|0;Ic[c[(c[l>>2]|0)+16>>2]&511](l,h);i=b;return}function H0(b){b=b|0;var d=0,e=0;d=i;c[b+4>>2]=0;a[b+8>>0]=0;e=b+12|0;b=e+36|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(b|0));i=d;return}function I0(a){a=a|0;var b=0;b=i;J0(a);i=b;return}function J0(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+16>>2]|0;if((d|0)!=0){e=c[a>>2]|0;Ic[c[(c[e>>2]|0)+16>>2]&511](e,d)}d=c[a+44>>2]|0;if((d|0)==0){i=b;return}e=c[a+40>>2]|0;if((e|0)==4){k0(d);D0(d);i=b;return}else if((e|0)==3){G0(d);D0(d);i=b;return}else if((e|0)==1){o0(d);D0(d);i=b;return}else if((e|0)==2){L0(d);D0(d);i=b;return}else{e=c[a>>2]|0;Ic[c[(c[e>>2]|0)+16>>2]&511](e,d);i=b;return}}function K0(a){a=a|0;var b=0,d=0;b=i;d=a+4|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;i=b;return}function L0(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;d=a+8|0;e=c[d>>2]|0;if((e|0)!=0){f=a+4|0;g=c[f>>2]|0;if((g|0)==0){h=e}else{j=g;g=e;e=0;while(1){k=c[g+(e<<2)>>2]|0;if((k|0)==0){l=g;m=j}else{o0(k);D0(k);l=c[d>>2]|0;m=c[f>>2]|0}e=e+1|0;if(!(e>>>0<m>>>0)){h=l;break}else{j=m;g=l}}}l=c[a>>2]|0;Ic[c[(c[l>>2]|0)+16>>2]&511](l,h)}if((c[a+12>>2]|0)==0){i=b;return}h=c[a+16>>2]|0;if((h|0)!=0){l=c[a>>2]|0;Ic[c[(c[l>>2]|0)+16>>2]&511](l,h)}h=c[a+20>>2]|0;if((h|0)==0){i=b;return}l=c[a>>2]|0;Ic[c[(c[l>>2]|0)+16>>2]&511](l,h);i=b;return}function M0(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;e=N0(a,b,0,0,c)|0;i=d;return e|0}function N0(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;h=i;i=i+16|0;j=h;if(d>>>0>65530){Jda(a,2,711912,j);k=0;i=h;return k|0}l=(d|0)<1;m=(e|0)<1;if(l&m){Jda(a,2,711968,j);k=0;i=h;return k|0}j=Dda(a,28)|0;if((j|0)==0){k=0;i=h;return k|0}if(!m){m=Eda(a,e,104)|0;c[j+8>>2]=m;if((m|0)!=0?(m=Eda(a,e,4)|0,c[j+16>>2]=m,(m|0)!=0):0){n=10}}else{c[j+8>>2]=0;c[j+16>>2]=0;n=10}a:do{if((n|0)==10){c[j+4>>2]=e;b:do{if(!l){m=Eda(a,d,2)|0;o=j+24|0;c[o>>2]=m;if((m|0)==0){break a}p=j+20|0;c[p>>2]=d;if((g|0)!=0&(d|0)>0){q=m;m=0;while(1){b[q+(m<<1)>>1]=b[g+(m<<1)>>1]|0;r=m+1|0;if((r|0)==(d|0)){s=p;break b}q=c[o>>2]|0;m=r}}else{s=p}}else{c[j+24>>2]=0;m=j+20|0;c[m>>2]=d;s=m}}while(0);if((f|0)!=0&(e|0)>0){m=Eda(a,e,4)|0;o=j+12|0;c[o>>2]=m;if((m|0)==0){break}m=j+8|0;q=j+16|0;r=0;do{t=f+(r*104|0)+8|0;if((c[t>>2]|0)==0){u=j1(a,c[f+(r*104|0)+96>>2]|0,0,1)|0;c[(c[o>>2]|0)+(r<<2)>>2]=u}d3a((c[m>>2]|0)+(r*104|0)|0,f+(r*104|0)|0,104)|0;if((c[t>>2]|0)==0?(u=c[f+(r*104|0)+100>>2]|0,(u|0)!=0):0){v=Hda(a,u,c[f+(r*104|0)+96>>2]<<2)|0;c[(c[m>>2]|0)+(r*104|0)+100>>2]=v}else{c[(c[m>>2]|0)+(r*104|0)+100>>2]=0}v=T0(a,c[t>>2]|0,0)|0;if((v|0)!=0){c[(c[q>>2]|0)+(r<<2)>>2]=c[v+164>>2]}r=r+1|0}while((r|0)!=(e|0))}r=j1(a,c[s>>2]|0,c[j+24>>2]|0,0)|0;c[j>>2]=r;if((r|0)!=0){k=j;i=h;return k|0}}}while(0);s=c[j+8>>2]|0;if((s|0)!=0){Gda(a,s)}s=c[j+16>>2]|0;if((s|0)!=0){Gda(a,s)}s=c[j+24>>2]|0;if((s|0)!=0){Gda(a,s)}Gda(a,j);k=0;i=h;return k|0}function O0(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0.0;f=i;if((e|0)==0){_a(711200,711112,642,711232)}if((d|0)==1?(c[e+8>>2]|0)==1:0){g=+R(+(+h[e+16>>3]+-1.0))<.001;j=g?2:4096}else{j=4096}g=N0(a,j,d,e,0)|0;if((g|0)==0){k=0;i=f;return k|0}l=+(j+ -1|0);e=g+24|0;d=0;do{a=Q0(+P0(g,+(d|0)/l)*65535.0)|0;b[(c[e>>2]|0)+(d<<1)>>1]=a;d=d+1|0}while((d|0)<(j|0));k=g;i=f;return k|0}function P0(a,b){a=a|0;b=+b;var d=0,e=0,f=0,h=0,j=0.0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0,q=0;d=i;i=i+16|0;e=d+4|0;f=d;h=(c[a+4>>2]|0)+ -1|0;if(!((h|0)>-1)){j=-9.999999778196308e+21;i=d;return+j}k=c[a+8>>2]|0;l=h;while(1){m=+g[k+(l*104|0)>>2];n=m;if(n<b?(o=+g[k+(l*104|0)+4>>2],o>=b):0){break}h=l+ -1|0;if((h|0)>-1){l=h}else{j=-9.999999778196308e+21;p=9;break}}if((p|0)==9){i=d;return+j}p=c[k+(l*104|0)+8>>2]|0;if((p|0)==0){g[e>>2]=(b-n)/(o-m);h=a+12|0;c[(c[(c[h>>2]|0)+(l<<2)>>2]|0)+112>>2]=c[k+(l*104|0)+100>>2];q=c[(c[h>>2]|0)+(l<<2)>>2]|0;ld[c[q+116>>2]&255](e,f,q);j=+g[f>>2];i=d;return+j}else{j=+$c[c[(c[a+16>>2]|0)+(l<<2)>>2]&1](p,k+(l*104|0)+16|0,b);i=d;return+j}return 0.0}function Q0(a){a=+a;var b=0,d=0.0,e=0;b=i;d=a+.5;if(!(d<=0.0)){if(!(d>=65535.0)){h[k>>3]=d+-32767.0+103079215104.0;e=((c[k>>2]|0)>>>16)+32767&65535}else{e=-1}}else{e=0}i=b;return e|0}function R0(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,j=0;d=i;i=i+320|0;e=d;g[e>>2]=-9.999999778196308e+21;g[e+4>>2]=0.0;c[e+8>>2]=6;h[e+16>>3]=1.0;f=e+24|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;h[e+40>>3]=+g[b>>2];h[e+48>>3]=0.0;g[e+104>>2]=0.0;g[e+108>>2]=1.0;c[e+112>>2]=0;c[e+200>>2]=4096;c[e+204>>2]=b;g[e+208>>2]=1.0;g[e+212>>2]=9.999999778196308e+21;c[e+216>>2]=6;h[e+224>>3]=1.0;f=e+232|0;j=b+16380|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;h[e+248>>3]=+g[j>>2];h[e+256>>3]=0.0;j=O0(a,3,e)|0;i=d;return j|0}function S0(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0;e=i;i=i+112|0;f=e+104|0;h=e;j=e+108|0;c[j>>2]=0;k=T0(a,b,j)|0;if((d|0)==0){_a(711264,711112,720,711288)}if((k|0)==0){c[f>>2]=b;Jda(a,8,711320,f);l=0;i=e;return l|0}else{f=h+0|0;m=f+104|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(m|0));g[h>>2]=-9.999999778196308e+21;g[h+4>>2]=9.999999778196308e+21;c[h+8>>2]=b;c3a(h+16|0,d|0,c[k+(c[j>>2]<<2)+84>>2]<<3|0)|0;l=O0(a,1,h)|0;i=e;return l|0}return 0}function T0(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;f=c[(U4(a,6)|0)>>2]|0;a:do{if((f|0)!=0){a=f;while(1){g=f1(b,a)|0;if(!((g|0)==-1)){break}h=c[a+168>>2]|0;if((h|0)==0){j=711736;k=6;break a}else{a=h}}if((d|0)==0){l=a}else{c[d>>2]=g;l=a}}else{j=711736;k=6}}while(0);b:do{if((k|0)==6){while(1){k=0;m=f1(b,j)|0;if(!((m|0)==-1)){break}g=c[j+168>>2]|0;if((g|0)==0){l=0;break b}else{j=g;k=6}}if((d|0)==0){l=j}else{c[d>>2]=m;l=j}}}while(0);i=e;return l|0}function U0(a,b){a=a|0;b=+b;var c=0,d=0,e=0;c=i;i=i+16|0;d=c;h[d>>3]=b;e=S0(a,1,d)|0;i=c;return e|0}function V0(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;if((a|0)==0){i=b;return}d=c[a>>2]|0;if((d|0)==0){i=b;return}e=c[d>>2]|0;k1(d);c[a>>2]=0;d=a+24|0;f=c[d>>2]|0;if((f|0)!=0){Gda(e,f);c[d>>2]=0}d=a+8|0;f=c[d>>2]|0;if((f|0)!=0){g=a+4|0;h=a+12|0;if((c[g>>2]|0)==0){j=f}else{k=f;f=0;while(1){l=c[k+(f*104|0)+100>>2]|0;if((l|0)!=0){Gda(e,l);c[(c[d>>2]|0)+(f*104|0)+100>>2]=0}l=c[(c[h>>2]|0)+(f<<2)>>2]|0;if((l|0)!=0){k1(l);c[(c[h>>2]|0)+(f<<2)>>2]=0}f=f+1|0;l=c[d>>2]|0;if(!(f>>>0<(c[g>>2]|0)>>>0)){j=l;break}else{k=l}}}Gda(e,j);c[d>>2]=0;Gda(e,c[h>>2]|0);c[h>>2]=0}h=a+16|0;d=c[h>>2]|0;if((d|0)!=0){Gda(e,d);c[h>>2]=0}Gda(e,a);i=b;return}function W0(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((a|0)==0){_a(711360,711112,809,711384)}d=c[a>>2]|0;if((d|0)!=0){V0(d)}d=a+4|0;e=c[d>>2]|0;if((e|0)!=0){V0(e)}e=a+8|0;f=c[e>>2]|0;if((f|0)==0){c[e>>2]=0;c[d>>2]=0;c[a>>2]=0;i=b;return}V0(f);c[e>>2]=0;c[d>>2]=0;c[a>>2]=0;i=b;return}function X0(a){a=a|0;var b=0,d=0,e=0;b=i;if((a|0)==0){d=0;i=b;return d|0}e=c[a>>2]|0;if((e|0)==0){d=0;i=b;return d|0}d=N0(c[e>>2]|0,c[a+20>>2]|0,c[a+4>>2]|0,c[a+8>>2]|0,c[a+24>>2]|0)|0;i=b;return d|0}function Y0(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,h=0,j=0;d=i;if((b|0)==0){_a(711408,711112,846,711432)}if((c|0)==0){_a(711456,711112,847,711432)}e=Z0(c)|0;if((e|0)==0){f=0;i=d;return f|0}c=Eda(a,4096,4)|0;if((c|0)==0){h=0}else{j=0;do{g[c+(j<<2)>>2]=+_0(e,+_0(b,+(j>>>0)/4095.0));j=j+1|0}while((j|0)!=4096);j=R0(a,c)|0;Gda(a,c);h=j}V0(e);f=h;i=d;return f|0}function Z0(a){a=a|0;var d=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0;d=i;if((a|0)==0){_a(711480,711112,932,711504)}if(((c[a+4>>2]|0)==1?(f=a+8|0,g=c[(c[f>>2]|0)+8>>2]|0,(g|0)>0):0)?(T0(c[c[a>>2]>>2]|0,g,0)|0)!=0:0){g=c[f>>2]|0;h=S0(c[c[a>>2]>>2]|0,0-(c[g+8>>2]|0)|0,g+16|0)|0;i=d;return h|0}g=M0(c[c[a>>2]>>2]|0,4096,0)|0;if((g|0)==0){h=0;i=d;return h|0}f=($0(a)|0)==0;j=a+24|0;k=g+24|0;l=a+20|0;m=0.0;n=0.0;o=0;while(1){p=+(o|0)*65535.0/4095.0;q=c[j>>2]|0;r=c[(c[a>>2]|0)+48>>2]|0;a:do{if((r|0)!=0){s=b[q>>1]|0;t=b[q+(r<<1)>>1]|0;b:do{if((s&65535)<(t&65535)){u=r+ -1|0;if((u|0)>-1){v=t;w=u}else{x=m;y=n;z=29;break a}while(1){u=v;v=b[q+(w<<1)>>1]|0;A=v&65535;B=u&65535;if((v&65535)>(u&65535)){if(+(B|0)<=p?+(A|0)>=p:0){C=w;break b}}else{if(+(A|0)<=p?+(B|0)>=p:0){C=w;break b}}w=w+ -1|0;if(!((w|0)>-1)){x=m;y=n;z=29;break a}}}else{if((r|0)>0){D=s;E=0}else{x=m;y=n;z=29;break a}while(1){B=D&65535;A=E;E=E+1|0;u=D;D=b[q+(E<<1)>>1]|0;F=D&65535;if((u&65535)>(D&65535)){if(+(F|0)<=p?+(B|0)>=p:0){C=A;break b}}else{if(+(B|0)<=p?+(F|0)>=p:0){C=A;break b}}if((E|0)>=(r|0)){x=m;y=n;z=29;break a}}}}while(0);if((C|0)>-1){G=+(e[q+(C<<1)>>1]|0);s=C+1|0;H=+(e[q+(s<<1)>>1]|0);I=+(((c[l>>2]|0)+ -1|0)>>>0);J=+(C|0)*65535.0/I;K=+(s|0)*65535.0/I;if(G==H){s=Q0(f?K:J)|0;b[(c[k>>2]|0)+(o<<1)>>1]=s;L=m;M=n;break}else{I=(K-J)/(H-G);x=I;y=K-H*I;z=29;break}}else{x=m;y=n;z=29}}else{x=m;y=n;z=29}}while(0);if((z|0)==29){z=0;q=Q0(y+p*x)|0;b[(c[k>>2]|0)+(o<<1)>>1]=q;L=x;M=y}o=o+1|0;if((o|0)==4096){h=g;break}else{m=L;n=M}}i=d;return h|0}function _0(a,b){a=a|0;b=+b;var d=0,e=0.0,f=0.0,g=0.0;d=i;if((a|0)==0){_a(711360,711112,1218,711688)}e=b;if((c[a+4>>2]|0)==0){f=+((e1(a,Q0(e*65535.0)|0)|0)&65535|0)/65535.0;g=f;i=d;return+g}else{f=+P0(a,e);g=f;i=d;return+g}return 0.0}function $0(a){a=a|0;var b=0,d=0;b=i;if((a|0)==0){_a(711176,711112,1193,711624)}else{d=c[a+24>>2]|0;i=b;return(e[d>>1]|0)>(e[d+((c[a+20>>2]|0)+ -1<<1)>>1]|0)|0}return 0}function a1(a){a=a|0;var b=0,c=0;b=i;if((a|0)==0){_a(711528,711112,994,711552)}else{c=Z0(a)|0;i=b;return c|0}return 0}function b1(a){a=a|0;var b=0,d=0,f=0,g=0,h=0,j=0,k=0;b=i;if((a|0)==0){_a(711360,711112,1132,711576)}d=c[a+20>>2]|0;if((d|0)==0){f=1;i=b;return f|0}g=c[a+24>>2]|0;a=0;while(1){h=e[g+(a<<1)>>1]|0;j=h-((d3(+(a>>>0),d)|0)&65535)|0;a=a+1|0;if((((j|0)>-1?j:0-j|0)|0)>15){f=0;k=7;break}if(!(a>>>0<d>>>0)){f=1;k=7;break}}if((k|0)==7){i=b;return f|0}return 0}function c1(a){a=a|0;var b=0,d=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;if((a|0)==0){_a(711176,711112,1151,711600)}d=c[a+20>>2]|0;if((d|0)<2){f=1;i=b;return f|0}if(($0(a)|0)!=0){g=c[a+24>>2]|0;h=1;j=e[g>>1]|0;while(1){k=j;j=e[g+(h<<1)>>1]|0;h=h+1|0;if((j-k|0)>2){f=0;l=12;break}if((h|0)>=(d|0)){f=1;l=12;break}}if((l|0)==12){i=b;return f|0}}h=d+ -2|0;if(!((h|0)>-1)){f=1;i=b;return f|0}j=c[a+24>>2]|0;a=h;h=e[j+(d+ -1<<1)>>1]|0;while(1){d=h;h=e[j+(a<<1)>>1]|0;if((h-d|0)>2){f=0;l=12;break}if((a|0)<=0){f=1;l=12;break}else{a=a+ -1|0}}if((l|0)==12){i=b;return f|0}return 0}function d1(a){a=a|0;var b=0,d=0;b=i;if((a|0)==0){_a(711176,711112,1209,711656)}if((c[a+4>>2]|0)!=1){d=0;i=b;return d|0}d=c[(c[a+8>>2]|0)+8>>2]|0;i=b;return d|0}function e1(a,d){a=a|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e+2|0;g=e;b[f>>1]=d;if((a|0)==0){_a(711360,711112,1239,711712)}else{d=c[a>>2]|0;ld[c[d+116>>2]&255](f,g,d);i=e;return b[g>>1]|0}return 0}function f1(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=(a|0)>-1?a:0-a|0;a=c[b>>2]|0;a:do{if((a|0)>0){f=0;while(1){if((e|0)==(c[b+(f<<2)+4>>2]|0)){g=f;break a}f=f+1|0;if((f|0)>=(a|0)){g=-1;break}}}else{g=-1}}while(0);i=d;return g|0}function g1(a,b,c){a=a|0;b=b|0;c=+c;var d=0,e=0.0,f=0.0,g=0.0,j=0.0,k=0.0,l=0;d=i;do{switch(a|0){case 2:{e=+h[b+16>>3];f=+h[b+8>>3];if(!(-e/f<=c)){g=0.0;i=d;return+g}j=e+f*c;if(!(j>0.0)){g=0.0;i=d;return+g}g=+T(+j,+(+h[b>>3]));i=d;return+g};case-4:{j=+h[b+8>>3];f=+h[b+16>>3];e=j*+h[b+32>>3]+f;if(e<0.0){k=0.0}else{k=+T(+e,+(+h[b>>3]))}if(!(k<=c)){g=c/+h[b+24>>3];i=d;return+g}else{g=(+T(+c,+(1.0/+h[b>>3]))-f)/j;i=d;return+g}break};case 1:{j=+h[b>>3];if(c<0.0){l=+R(+(j+-1.0))<1.0e-4;g=l?c:0.0;i=d;return+g}else{g=+T(+c,+j);i=d;return+g}break};case-3:{j=+h[b+24>>3];if(!(j<=c)){g=-+h[b+16>>3]/+h[b+8>>3];i=d;return+g}f=c-j;if(!(f>0.0)){g=0.0;i=d;return+g}g=(+T(+f,+(1.0/+h[b>>3]))- +h[b+16>>3])/+h[b+8>>3];i=d;return+g};case 4:{if(!(+h[b+32>>3]<=c)){g=+h[b+24>>3]*c;i=d;return+g}f=+h[b+8>>3]*c+ +h[b+16>>3];if(!(f>0.0)){g=0.0;i=d;return+g}g=+T(+f,+(+h[b>>3]));i=d;return+g};case-8:{f=c- +h[b+32>>3];if(f<0.0){g=0.0;i=d;return+g}g=(+aa(+(f/+h[b>>3]))/+aa(+(+h[b+8>>3]))- +h[b+24>>3])/+h[b+16>>3];i=d;return+g};case-7:{g=+T(+((+T(10.0,+((c- +h[b+32>>3])/+h[b+8>>3]))- +h[b+24>>3])/+h[b+16>>3]),+(1.0/+h[b>>3]));i=d;return+g};case-1:{f=+h[b>>3];if(c<0.0){l=+R(+(f+-1.0))<1.0e-4;g=l?c:0.0;i=d;return+g}else{g=+T(+c,+(1.0/f));i=d;return+g}break};case 5:{if(!(+h[b+32>>3]<=c)){g=+h[b+24>>3]*c+ +h[b+48>>3];i=d;return+g}f=+h[b+8>>3]*c+ +h[b+16>>3];if(f>0.0){j=+T(+f,+(+h[b>>3]));g=j+ +h[b+40>>3];i=d;return+g}else{g=+h[b+40>>3];i=d;return+g}break};case 6:{j=+h[b+8>>3]*c+ +h[b+16>>3];if(j<0.0){g=+h[b+24>>3];i=d;return+g}else{f=+T(+j,+(+h[b>>3]));g=f+ +h[b+24>>3];i=d;return+g}break};case 3:{f=+h[b+16>>3];j=+h[b+8>>3];e=-f/j;if(!((e<0.0?0.0:e)<=c)){g=+h[b+24>>3];i=d;return+g}e=f+j*c;if(!(e>0.0)){g=0.0;i=d;return+g}g=+T(+e,+(+h[b>>3]))+ +h[b+24>>3];i=d;return+g};case 8:{g=+h[b>>3]*+T(+(+h[b+8>>3]),+(+h[b+16>>3]*c+ +h[b+24>>3]))+ +h[b+32>>3];i=d;return+g};case-108:{e=+h[b>>3];g=1.0- +T(+(1.0- +T(+c,+e)),+e);i=d;return+g};case 7:{e=+h[b+16>>3]*+T(+c,+(+h[b>>3]))+ +h[b+24>>3];if(!(e<=0.0)){j=+h[b+8>>3];f=j*+mc(+e);g=f+ +h[b+32>>3];i=d;return+g}else{g=+h[b+32>>3];i=d;return+g}break};case-2:{if(c<0.0){g=0.0;i=d;return+g}f=(+T(+c,+(1.0/+h[b>>3]))- +h[b+16>>3])/+h[b+8>>3];if(!(f<0.0)){g=f;i=d;return+g}g=0.0;i=d;return+g};case-6:{f=c- +h[b+24>>3];if(f<0.0){g=0.0;i=d;return+g}g=(+T(+f,+(1.0/+h[b>>3]))- +h[b+16>>3])/+h[b+8>>3];i=d;return+g};case-5:{f=+h[b+24>>3];e=+h[b+48>>3];if(!(f*+h[b+32>>3]+e<=c)){g=(c-e)/f;i=d;return+g}f=c- +h[b+40>>3];if(f<0.0){g=0.0;i=d;return+g}g=(+T(+f,+(1.0/+h[b>>3]))- +h[b+16>>3])/+h[b+8>>3];i=d;return+g};case 108:{f=1.0/+h[b>>3];g=+T(+(1.0- +T(+(1.0-c),+f)),+f);i=d;return+g};default:{g=0.0;i=d;return+g}}}while(0);return 0.0}function h1(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;i=i+16|0;e=d;f=U4(a,5)|0;a=b+116|0;c[a>>2]=0;g=c[f>>2]|0;f=b+8|0;if((g|0)!=0){h=b+12|0;j=b+4|0;pd[g&127](e,c[f>>2]|0,c[h>>2]|0,c[j>>2]|0);g=c[e>>2]|0;c[a>>2]=g;if((g|0)==0){k=h;l=j}else{m=g;n=(m|0)!=0;o=n&1;i=d;return o|0}}else{k=b+12|0;l=b+4|0}b=c[f>>2]|0;f=c[k>>2]|0;k=c[l>>2]|0;l=k&1;g=k&256;a:do{if(b>>>0>3&f>>>0>127){p=0}else{switch(b|0){case 6:{p=(l|0)==0?178:177;break a;break};case 5:{p=(l|0)==0?176:175;break a;break};case 1:{k=(l|0)!=0;if((f|0)==1){p=k?164:163;break a}else{p=k?166:165;break a}break};case 3:{k=(l|0)!=0;if((g|0)==0){p=k?172:171;break a}else{p=k?170:169;break a}break};case 7:{p=(l|0)==0?180:179;break a;break};case 8:{p=(l|0)==0?182:181;break a;break};case 4:{p=(l|0)==0?174:173;break a;break};case 2:{p=(l|0)==0?168:167;break a;break};default:{p=0;break a}}}}while(0);c[a>>2]=p;m=p;n=(m|0)!=0;o=n&1;i=d;return o|0}function i1(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0;h=i;i=i+16|0;j=h;if((d|0)>8){c[j>>2]=d;c[j+4>>2]=8;Jda(a,2,713160,j);k=0;i=h;return k|0}l=Dda(a,120)|0;if((l|0)==0){k=0;i=h;return k|0}c[l+4>>2]=g;c[l+8>>2]=d;g=l+12|0;c[g>>2]=e;c[l+112>>2]=f;c[l>>2]=a;if((d|0)>0){f=l+16|0;m=l+48|0;n=0;do{o=c[b+(n<<2)>>2]|0;c[f+(n<<2)>>2]=o;c[m+(n<<2)>>2]=o+ -1;n=n+1|0}while((n|0)!=(d|0));n=c[g>>2]|0;g=l+80|0;c[g>>2]=n;if((d|0)>1){m=n;n=1;do{m=ca(c[b+(d-n<<2)>>2]|0,m)|0;c[g+(n<<2)>>2]=m;n=n+1|0}while((n|0)!=(d|0))}}else{c[l+80>>2]=e}if((h1(a,l)|0)!=0){k=l;i=h;return k|0}c[j>>2]=d;c[j+4>>2]=e;Jda(a,8,712040,j);Gda(a,l);k=0;i=h;return k|0}function j1(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;i=i+32|0;g=f;c[g>>2]=b;c[g+4>>2]=b;c[g+8>>2]=b;c[g+12>>2]=b;c[g+16>>2]=b;c[g+20>>2]=b;c[g+24>>2]=b;c[g+28>>2]=b;b=i1(a,g,1,1,d,e)|0;i=f;return b|0}function k1(a){a=a|0;var b=0;b=i;if((a|0)!=0){Gda(c[a>>2]|0,a)}i=b;return}function l1(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0.0,j=0.0,k=0.0,l=0,m=0.0;e=i;f=c[d+112>>2]|0;h=+g[a>>2];if(!(h<0.0)){j=h>1.0?1.0:h;a=c[d+48>>2]|0;if(j==1.0){k=+g[f+(a<<2)>>2];g[b>>2]=k;i=e;return}else{l=a;m=j}}else{l=c[d+48>>2]|0;m=0.0}j=m*+(l>>>0);l=~~+Q(+j);d=~~+ba(+j);m=+g[f+(l<<2)>>2];k=m+(j- +(l|0))*(+g[f+(d<<2)>>2]-m);g[b>>2]=k;i=e;return}function m1(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;h=c[f+112>>2]|0;j=b[a>>1]|0;a=c[f+48>>2]|0;if(j<<16>>16==-1){k=b[h+(a<<1)>>1]|0;b[d>>1]=k;i=g;return}else{f=ca(a,j&65535)|0;j=((f+32767|0)/65535|0)+f|0;f=j>>16;a=e[h+(f<<1)>>1]|0;k=(((ca((e[h+(f+1<<1)>>1]|0)-a|0,j&65535)|0)+32768|0)>>>16)+a&65535;b[d>>1]=k;i=g;return}}function n1(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0.0,j=0.0,k=0,l=0.0,m=0,n=0,o=0;e=i;f=c[d+112>>2]|0;h=+g[a>>2];if(!(h<0.0)){j=h>1.0?1.0:h;a=c[d+48>>2]|0;if(j==1.0){g[b>>2]=+g[f+(a<<2)>>2];i=e;return}else{k=a;l=j}}else{k=c[d+48>>2]|0;l=0.0}j=l*+(k>>>0);k=~~+Q(+j);a=~~+ba(+j);l=j- +(k|0);m=c[d+80>>2]|0;n=ca(m,k)|0;k=ca(a,m)|0;m=d+12|0;if((c[m>>2]|0)==0){i=e;return}else{o=0}do{j=+g[f+(o+n<<2)>>2];g[b+(o<<2)>>2]=j+l*(+g[f+(o+k<<2)>>2]-j);o=o+1|0}while(o>>>0<(c[m>>2]|0)>>>0);i=e;return}function o1(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;g=i;h=c[f+112>>2]|0;j=b[a>>1]|0;a=ca(j&65535,c[f+48>>2]|0)|0;k=((a+32767|0)/65535|0)+a|0;a=k>>16;l=k&65535;k=c[f+80>>2]|0;m=ca(a,k)|0;n=ca(a+(j<<16>>16!=-1&1)|0,k)|0;k=f+12|0;if((c[k>>2]|0)==0){i=g;return}else{o=0}do{f=e[h+(o+m<<1)>>1]|0;b[d+(o<<1)>>1]=(((ca((e[h+(o+n<<1)>>1]|0)-f|0,l)|0)+32768|0)>>>16)+f;o=o+1|0}while(o>>>0<(c[k>>2]|0)>>>0);i=g;return}function p1(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,j=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0;e=i;f=c[d+112>>2]|0;j=c[d+12>>2]|0;l=+g[a>>2];if(l<0.0){m=0.0}else{m=l>1.0?1.0:l}n=m*+((c[d+48>>2]|0)>>>0);m=+g[a+4>>2];if(m<0.0){o=0.0}else{o=m>1.0?1.0:m}p=o*+((c[d+52>>2]|0)>>>0);h[k>>3]=n+103079215104.0;a=c[k>>2]>>16;o=n- +(a|0);h[k>>3]=p+103079215104.0;q=c[k>>2]>>16;n=p- +(q|0);r=c[d+84>>2]|0;s=ca(r,a)|0;a=(!(l>=1.0)?r:0)+s|0;r=c[d+80>>2]|0;d=ca(q,r)|0;q=d+(!(m>=1.0)?r:0)|0;if((j|0)<=0){i=e;return}r=d+s|0;t=q+s|0;s=d+a|0;d=q+a|0;a=0;do{m=+g[f+(r+a<<2)>>2];l=+g[f+(t+a<<2)>>2];p=m+o*(+g[f+(s+a<<2)>>2]-m);g[b+(a<<2)>>2]=p+n*(l+o*(+g[f+(d+a<<2)>>2]-l)-p);a=a+1|0}while((a|0)!=(j|0));i=e;return}function q1(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;g=i;h=c[f+112>>2]|0;j=c[f+12>>2]|0;k=b[a>>1]|0;l=ca(k&65535,c[f+48>>2]|0)|0;m=((l+32767|0)/65535|0)+l|0;l=m&65535;n=b[a+2>>1]|0;a=ca(n&65535,c[f+52>>2]|0)|0;o=((a+32767|0)/65535|0)+a|0;a=o&65535;p=c[f+84>>2]|0;q=ca(p,m>>16)|0;m=q+(k<<16>>16==-1?0:p)|0;p=c[f+80>>2]|0;f=ca(p,o>>16)|0;o=f+(n<<16>>16==-1?0:p)|0;if((j|0)<=0){i=g;return}p=f+q|0;n=o+q|0;q=m+f|0;f=o+m|0;m=0;do{o=e[h+(p+m<<1)>>1]|0;k=e[h+(n+m<<1)>>1]|0;r=(((ca((e[h+(q+m<<1)>>1]|0)-o|0,l)|0)+32768|0)>>>16)+o|0;b[d+(m<<1)>>1]=(((ca(((((ca((e[h+(f+m<<1)>>1]|0)-k|0,l)|0)+32768|0)>>>16)+k&65535)-(r&65535)|0,a)|0)+32768|0)>>>16)+r;m=m+1|0}while((m|0)!=(j|0));i=g;return}function r1(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,j=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0;e=i;f=c[d+112>>2]|0;j=c[d+12>>2]|0;l=+g[a>>2];if(l<0.0){m=0.0}else{m=l>1.0?1.0:l}n=m*+((c[d+48>>2]|0)>>>0);m=+g[a+4>>2];if(m<0.0){o=0.0}else{o=m>1.0?1.0:m}p=o*+((c[d+52>>2]|0)>>>0);o=+g[a+8>>2];if(o<0.0){q=0.0}else{q=o>1.0?1.0:o}r=q*+((c[d+56>>2]|0)>>>0);h[k>>3]=n+103079215104.0;a=c[k>>2]>>16;q=n- +(a|0);h[k>>3]=p+103079215104.0;s=c[k>>2]>>16;n=p- +(s|0);h[k>>3]=r+103079215104.0;t=c[k>>2]>>16;p=r- +(t|0);u=c[d+88>>2]|0;v=ca(u,a)|0;a=(!(l>=1.0)?u:0)+v|0;u=c[d+84>>2]|0;w=ca(u,s)|0;s=(!(m>=1.0)?u:0)+w|0;u=c[d+80>>2]|0;d=ca(t,u)|0;t=d+(!(o>=1.0)?u:0)|0;if((j|0)<=0){i=e;return}u=w+v|0;x=d+u|0;y=t+u|0;u=s+v|0;v=u+d|0;z=t+u|0;u=a+w|0;w=d+u|0;A=t+u|0;u=s+a|0;a=u+d|0;d=t+u|0;u=0;do{o=+g[f+(x+u<<2)>>2];m=+g[f+(y+u<<2)>>2];l=+g[f+(v+u<<2)>>2];r=+g[f+(z+u<<2)>>2];B=o+q*(+g[f+(w+u<<2)>>2]-o);o=m+q*(+g[f+(A+u<<2)>>2]-m);m=B+n*(l+q*(+g[f+(a+u<<2)>>2]-l)-B);g[b+(u<<2)>>2]=m+p*(o+n*(r+q*(+g[f+(d+u<<2)>>2]-r)-o)-m);u=u+1|0}while((u|0)!=(j|0));i=e;return}function s1(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;g=i;h=c[f+112>>2]|0;j=c[f+12>>2]|0;k=b[a>>1]|0;l=ca(k&65535,c[f+48>>2]|0)|0;m=((l+32767|0)/65535|0)+l|0;l=m&65535;n=b[a+2>>1]|0;o=ca(n&65535,c[f+52>>2]|0)|0;p=((o+32767|0)/65535|0)+o|0;o=p&65535;q=b[a+4>>1]|0;a=ca(q&65535,c[f+56>>2]|0)|0;r=((a+32767|0)/65535|0)+a|0;a=r&65535;s=c[f+88>>2]|0;t=ca(s,m>>16)|0;m=t+(k<<16>>16==-1?0:s)|0;s=c[f+84>>2]|0;k=ca(s,p>>16)|0;p=k+(n<<16>>16==-1?0:s)|0;s=c[f+80>>2]|0;f=ca(s,r>>16)|0;r=f+(q<<16>>16==-1?0:s)|0;if((j|0)<=0){i=g;return}s=k+t|0;q=s+f|0;n=r+s|0;s=p+t|0;t=s+f|0;u=s+r|0;s=m+k|0;k=s+f|0;v=r+s|0;s=p+m|0;m=s+f|0;f=s+r|0;r=0;do{s=e[h+(q+r<<1)>>1]|0;p=e[h+(n+r<<1)>>1]|0;w=e[h+(t+r<<1)>>1]|0;x=e[h+(u+r<<1)>>1]|0;y=(((ca((e[h+(k+r<<1)>>1]|0)-s|0,l)|0)+32768|0)>>>16)+s|0;s=(((ca((e[h+(v+r<<1)>>1]|0)-p|0,l)|0)+32768|0)>>>16)+p|0;p=(((ca(((((ca((e[h+(m+r<<1)>>1]|0)-w|0,l)|0)+32768|0)>>>16)+w&65535)-(y&65535)|0,o)|0)+32768|0)>>>16)+y|0;b[d+(r<<1)>>1]=(((ca(((((ca(((((ca((e[h+(f+r<<1)>>1]|0)-x|0,l)|0)+32768|0)>>>16)+x&65535)-(s&65535)|0,o)|0)+32768|0)>>>16)+s&65535)-(p&65535)|0,a)|0)+32768|0)>>>16)+p;r=r+1|0}while((r|0)!=(j|0));i=g;return}function t1(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,j=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0,I=0.0,J=0.0;e=i;f=c[d+112>>2]|0;j=c[d+12>>2]|0;l=+g[a>>2];if(l<0.0){m=0.0}else{m=l>1.0?1.0:l}n=m*+((c[d+48>>2]|0)>>>0);m=+g[a+4>>2];if(m<0.0){o=0.0}else{o=m>1.0?1.0:m}p=o*+((c[d+52>>2]|0)>>>0);o=+g[a+8>>2];if(o<0.0){q=0.0}else{q=o>1.0?1.0:o}r=q*+((c[d+56>>2]|0)>>>0);h[k>>3]=n+103079215104.0;a=c[k>>2]>>16;q=n- +(a|0);h[k>>3]=p+103079215104.0;s=c[k>>2]>>16;n=p- +(s|0);h[k>>3]=r+103079215104.0;t=c[k>>2]>>16;p=r- +(t|0);u=c[d+88>>2]|0;v=ca(u,a)|0;a=(!(l>=1.0)?u:0)+v|0;u=c[d+84>>2]|0;w=ca(u,s)|0;s=(!(m>=1.0)?u:0)+w|0;u=c[d+80>>2]|0;d=ca(t,u)|0;t=d+(!(o>=1.0)?u:0)|0;if((j|0)<=0){i=e;return}u=w+v|0;x=d+u|0;y=!(q>=n);z=!(n>=p);A=y|z;B=!(q>=p);C=!(p>=n);D=B|C;E=!(p>=q);F=E|y;y=!(n>=q);G=y|B;B=z|E;E=C|y;y=s+a|0;C=y+t|0;z=s+v|0;v=z+t|0;s=t+u|0;u=z+d|0;z=y+d|0;y=a+w|0;w=y+t|0;t=d+y|0;y=0;do{o=+g[f+(x+y<<2)>>2];do{if(A){if(!D){m=+g[f+(t+y<<2)>>2];l=+g[f+(w+y<<2)>>2];H=m-o;I=+g[f+(C+y<<2)>>2]-l;J=l-m;break}if(!F){m=+g[f+(w+y<<2)>>2];l=+g[f+(s+y<<2)>>2];H=m-l;I=+g[f+(C+y<<2)>>2]-m;J=l-o;break}if(!G){l=+g[f+(z+y<<2)>>2];m=+g[f+(u+y<<2)>>2];H=l-m;I=m-o;J=+g[f+(C+y<<2)>>2]-l;break}if(!B){l=+g[f+(v+y<<2)>>2];m=+g[f+(u+y<<2)>>2];H=+g[f+(C+y<<2)>>2]-l;I=m-o;J=l-m;break}if(E){H=0.0;I=0.0;J=0.0}else{m=+g[f+(v+y<<2)>>2];l=+g[f+(s+y<<2)>>2];H=+g[f+(C+y<<2)>>2]-m;I=m-l;J=l-o}}else{l=+g[f+(t+y<<2)>>2];m=+g[f+(z+y<<2)>>2];H=l-o;I=m-l;J=+g[f+(C+y<<2)>>2]-m}}while(0);g[b+(y<<2)>>2]=p*J+(n*I+(o+q*H));y=y+1|0}while((y|0)!=(j|0));i=e;return}function u1(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;g=i;h=c[f+12>>2]|0;j=b[a>>1]|0;k=ca(j&65535,c[f+48>>2]|0)|0;l=((k+32767|0)/65535|0)+k|0;k=b[a+2>>1]|0;m=ca(k&65535,c[f+52>>2]|0)|0;n=((m+32767|0)/65535|0)+m|0;m=b[a+4>>1]|0;a=ca(m&65535,c[f+56>>2]|0)|0;o=((a+32767|0)/65535|0)+a|0;a=l&65535;p=n&65535;q=o&65535;r=c[f+88>>2]|0;s=ca(r,l>>16)|0;l=j<<16>>16==-1?0:r;r=c[f+84>>2]|0;j=ca(r,n>>16)|0;n=k<<16>>16==-1?0:r;r=c[f+80>>2]|0;k=ca(r,o>>16)|0;o=m<<16>>16==-1?0:r;r=(c[f+112>>2]|0)+(j+s+k<<1)|0;if(a>>>0<p>>>0){if(!(a>>>0<q>>>0)){k=n+l|0;s=o+k|0;if((h|0)==0){i=g;return}else{t=d;u=r;v=h}while(1){j=e[u+(k<<1)>>1]|0;f=e[u+(n<<1)>>1]|0;m=e[u>>1]|0;w=(ca(j-f|0,a)|0)+32769+(ca((e[u+(s<<1)>>1]|0)-j|0,q)|0)+(ca(f-m|0,p)|0)|0;b[t>>1]=(((w>>16)+w|0)>>>16)+m;v=v+ -1|0;if((v|0)==0){break}else{t=t+2|0;u=u+2|0}}i=g;return}u=o+n|0;t=u+l|0;v=(h|0)==0;if(p>>>0<q>>>0){if(v){i=g;return}else{x=d;y=r;z=h}while(1){s=e[y+(u<<1)>>1]|0;k=e[y+(o<<1)>>1]|0;m=e[y>>1]|0;w=(ca((e[y+(t<<1)>>1]|0)-s|0,a)|0)+32769+(ca(s-k|0,p)|0)+(ca(k-m|0,q)|0)|0;b[x>>1]=(((w>>16)+w|0)>>>16)+m;z=z+ -1|0;if((z|0)==0){break}else{x=x+2|0;y=y+2|0}}i=g;return}else{if(v){i=g;return}else{A=d;B=r;C=h}while(1){v=e[B+(n<<1)>>1]|0;y=e[B+(u<<1)>>1]|0;x=e[B>>1]|0;z=(ca((e[B+(t<<1)>>1]|0)-y|0,a)|0)+32769+(ca(y-v|0,q)|0)+(ca(v-x|0,p)|0)|0;b[A>>1]=(((z>>16)+z|0)>>>16)+x;C=C+ -1|0;if((C|0)==0){break}else{A=A+2|0;B=B+2|0}}i=g;return}}else{if(!(p>>>0<q>>>0)){B=n+l|0;A=o+B|0;if((h|0)==0){i=g;return}else{D=d;E=r;F=h}while(1){C=e[E+(l<<1)>>1]|0;t=e[E+(B<<1)>>1]|0;u=e[E>>1]|0;x=(ca(t-C|0,p)|0)+32769+(ca((e[E+(A<<1)>>1]|0)-t|0,q)|0)+(ca(C-u|0,a)|0)|0;b[D>>1]=(((x>>16)+x|0)>>>16)+u;F=F+ -1|0;if((F|0)==0){break}else{D=D+2|0;E=E+2|0}}i=g;return}E=o+l|0;D=E+n|0;n=(h|0)==0;if(q>>>0<a>>>0){if(n){i=g;return}else{G=d;H=r;I=h}while(1){F=e[H+(l<<1)>>1]|0;A=e[H+(E<<1)>>1]|0;B=e[H>>1]|0;u=(ca((e[H+(D<<1)>>1]|0)-A|0,p)|0)+32769+(ca(A-F|0,q)|0)+(ca(F-B|0,a)|0)|0;b[G>>1]=(((u>>16)+u|0)>>>16)+B;I=I+ -1|0;if((I|0)==0){break}else{G=G+2|0;H=H+2|0}}i=g;return}else{if(n){i=g;return}else{J=d;K=r;L=h}while(1){h=e[K+(E<<1)>>1]|0;r=e[K+(o<<1)>>1]|0;d=e[K>>1]|0;n=(ca((e[K+(D<<1)>>1]|0)-h|0,p)|0)+32769+(ca(h-r|0,a)|0)+(ca(r-d|0,q)|0)|0;b[J>>1]=(((n>>16)+n|0)>>>16)+d;L=L+ -1|0;if((L|0)==0){break}else{J=J+2|0;K=K+2|0}}i=g;return}}}function v1(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,j=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0;e=i;i=i+1152|0;f=e+632|0;j=e+120|0;l=e;m=c[d+112>>2]|0;n=+g[a>>2];if(n<0.0){o=0.0}else{o=n>1.0?1.0:n}p=o*+((c[d+48>>2]|0)>>>0);h[k>>3]=p+103079215104.0;q=c[k>>2]>>16;o=p- +(q|0);r=c[d+92>>2]|0;s=ca(q,r)|0;q=s+(!(n>=1.0)?r:0)|0;r=l+0|0;t=d+0|0;u=r+120|0;do{c[r>>2]=c[t>>2];r=r+4|0;t=t+4|0}while((r|0)<(u|0));t=l+48|0;r=d+52|0;c[t+0>>2]=c[r+0>>2];c[t+4>>2]=c[r+4>>2];c[t+8>>2]=c[r+8>>2];r=l+112|0;c[r>>2]=m+(s<<2);s=a+4|0;t1(s,f,l);c[r>>2]=m+(q<<2);t1(s,j,l);l=d+12|0;if((c[l>>2]|0)==0){i=e;return}else{v=0}do{n=+g[f+(v<<2)>>2];g[b+(v<<2)>>2]=n+o*(+g[j+(v<<2)>>2]-n);v=v+1|0}while(v>>>0<(c[l>>2]|0)>>>0);i=e;return}function w1(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0;g=i;i=i+512|0;h=g+256|0;j=g;k=b[a>>1]|0;l=ca(k&65535,c[f+48>>2]|0)|0;m=((l+32767|0)/65535|0)+l|0;l=b[a+2>>1]|0;n=ca(l&65535,c[f+52>>2]|0)|0;o=((n+32767|0)/65535|0)+n|0;n=b[a+4>>1]|0;p=ca(n&65535,c[f+56>>2]|0)|0;q=((p+32767|0)/65535|0)+p|0;p=b[a+6>>1]|0;a=ca(p&65535,c[f+60>>2]|0)|0;r=((a+32767|0)/65535|0)+a|0;a=m&65535;s=o&65535;t=q&65535;u=r&65535;v=c[f+92>>2]|0;w=ca(v,m>>16)|0;m=w+(k<<16>>16==-1?0:v)|0;v=c[f+88>>2]|0;k=ca(v,o>>16)|0;o=k+(l<<16>>16==-1?0:v)|0;v=c[f+84>>2]|0;l=ca(v,q>>16)|0;q=l+(n<<16>>16==-1?0:v)|0;v=c[f+80>>2]|0;n=ca(v,r>>16)|0;r=n+(p<<16>>16==-1?0:v)|0;v=c[f+112>>2]|0;p=f+12|0;f=c[p>>2]|0;if((f|0)==0){i=g;return}x=l+k|0;y=n+w|0;z=y+x|0;A=s>>>0<t>>>0;B=t>>>0<u>>>0;C=A|B;D=s>>>0<u>>>0;E=u>>>0<t>>>0;F=D|E;G=u>>>0<s>>>0;H=G|A;A=t>>>0<s>>>0;I=A|D;D=B|G;G=E|A;A=o+w+q+r|0;E=k+w+q|0;B=E+r|0;J=x+w+r|0;K=q+k|0;L=r+w|0;M=L+K|0;N=y+K|0;O=q+o|0;P=y+O|0;Q=E+n|0;E=L+O|0;L=l+w+o|0;R=L+r|0;S=o+l|0;T=y+S|0;y=S+w+r|0;w=L+n|0;L=0;do{U=e[v+(z+L<<1)>>1]|0;do{if(C){if(!F){V=e[v+(T+L<<1)>>1]|0;W=e[v+(y+L<<1)>>1]|0;X=V-U|0;Y=(e[v+(A+L<<1)>>1]|0)-W|0;Z=W-V|0;break}if(!H){V=e[v+(R+L<<1)>>1]|0;W=e[v+(J+L<<1)>>1]|0;X=V-W|0;Y=(e[v+(A+L<<1)>>1]|0)-V|0;Z=W-U|0;break}if(!I){W=e[v+(P+L<<1)>>1]|0;V=e[v+(Q+L<<1)>>1]|0;X=W-V|0;Y=V-U|0;Z=(e[v+(E+L<<1)>>1]|0)-W|0;break}if(!D){W=e[v+(M+L<<1)>>1]|0;V=e[v+(N+L<<1)>>1]|0;X=(e[v+(A+L<<1)>>1]|0)-W|0;Y=V-U|0;Z=W-V|0;break}if(G){X=0;Y=0;Z=0}else{V=e[v+(B+L<<1)>>1]|0;W=e[v+(J+L<<1)>>1]|0;X=(e[v+(A+L<<1)>>1]|0)-V|0;Y=V-W|0;Z=W-U|0}}else{W=e[v+(w+L<<1)>>1]|0;V=e[v+(P+L<<1)>>1]|0;X=W-U|0;Y=V-W|0;Z=(e[v+(E+L<<1)>>1]|0)-V|0}}while(0);V=(ca(Y,t)|0)+(ca(X,s)|0)+(ca(Z,u)|0)|0;b[h+(L<<1)>>1]=((((V+32767|0)/65535|0)+32768+V|0)>>>16)+U;L=L+1|0}while(L>>>0<f>>>0);L=n+m|0;Z=L+x|0;X=o+m+q+r|0;Y=m+k+q|0;q=Y+r|0;k=x+m+r|0;x=r+m|0;E=x+K|0;P=L+K|0;K=L+O|0;w=Y+n|0;Y=x+O|0;O=l+m+o|0;o=O+r|0;l=L+S|0;L=S+m+r|0;r=O+n|0;n=0;do{O=e[v+(Z+n<<1)>>1]|0;do{if(C){if(!F){m=e[v+(l+n<<1)>>1]|0;S=e[v+(L+n<<1)>>1]|0;_=m-O|0;$=(e[v+(X+n<<1)>>1]|0)-S|0;aa=S-m|0;break}if(!H){m=e[v+(o+n<<1)>>1]|0;S=e[v+(k+n<<1)>>1]|0;_=m-S|0;$=(e[v+(X+n<<1)>>1]|0)-m|0;aa=S-O|0;break}if(!I){S=e[v+(K+n<<1)>>1]|0;m=e[v+(w+n<<1)>>1]|0;_=S-m|0;$=m-O|0;aa=(e[v+(Y+n<<1)>>1]|0)-S|0;break}if(!D){S=e[v+(E+n<<1)>>1]|0;m=e[v+(P+n<<1)>>1]|0;_=(e[v+(X+n<<1)>>1]|0)-S|0;$=m-O|0;aa=S-m|0;break}if(G){_=0;$=0;aa=0}else{m=e[v+(q+n<<1)>>1]|0;S=e[v+(k+n<<1)>>1]|0;_=(e[v+(X+n<<1)>>1]|0)-m|0;$=m-S|0;aa=S-O|0}}else{S=e[v+(r+n<<1)>>1]|0;m=e[v+(K+n<<1)>>1]|0;_=S-O|0;$=m-S|0;aa=(e[v+(Y+n<<1)>>1]|0)-m|0}}while(0);U=(ca($,t)|0)+(ca(_,s)|0)+(ca(aa,u)|0)|0;b[j+(n<<1)>>1]=((((U+32767|0)/65535|0)+32768+U|0)>>>16)+O;n=n+1|0}while(n>>>0<f>>>0);ba=0;do{f=e[h+(ba<<1)>>1]|0;b[d+(ba<<1)>>1]=(((ca((e[j+(ba<<1)>>1]|0)-f|0,a)|0)+32768|0)>>>16)+f;ba=ba+1|0}while(ba>>>0<(c[p>>2]|0)>>>0);i=g;return}function x1(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,j=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0;e=i;i=i+1152|0;f=e+632|0;j=e+120|0;l=e;m=c[d+112>>2]|0;n=+g[a>>2];if(n<0.0){o=0.0}else{o=n>1.0?1.0:n}p=o*+((c[d+48>>2]|0)>>>0);h[k>>3]=p+103079215104.0;q=c[k>>2]>>16;o=p- +(q|0);r=c[d+96>>2]|0;s=ca(q,r)|0;q=s+(!(n>=1.0)?r:0)|0;r=l+0|0;t=d+0|0;u=r+120|0;do{c[r>>2]=c[t>>2];r=r+4|0;t=t+4|0}while((r|0)<(u|0));t=l+48|0;r=d+52|0;c[t+0>>2]=c[r+0>>2];c[t+4>>2]=c[r+4>>2];c[t+8>>2]=c[r+8>>2];c[t+12>>2]=c[r+12>>2];r=l+112|0;c[r>>2]=m+(s<<2);s=a+4|0;v1(s,f,l);c[r>>2]=m+(q<<2);v1(s,j,l);l=d+12|0;if((c[l>>2]|0)==0){i=e;return}else{v=0}do{n=+g[f+(v<<2)>>2];g[b+(v<<2)>>2]=n+o*(+g[j+(v<<2)>>2]-n);v=v+1|0}while(v>>>0<(c[l>>2]|0)>>>0);i=e;return}function y1(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;g=i;i=i+640|0;h=g+376|0;j=g+120|0;k=g;l=c[f+112>>2]|0;m=b[a>>1]|0;n=ca(m&65535,c[f+48>>2]|0)|0;o=((n+32767|0)/65535|0)+n|0;n=o>>16;p=o&65535;o=c[f+96>>2]|0;q=ca(n,o)|0;r=ca(n+(m<<16>>16!=-1&1)|0,o)|0;o=k+0|0;m=f+0|0;n=o+120|0;do{c[o>>2]=c[m>>2];o=o+4|0;m=m+4|0}while((o|0)<(n|0));m=k+48|0;o=f+52|0;c[m+0>>2]=c[o+0>>2];c[m+4>>2]=c[o+4>>2];c[m+8>>2]=c[o+8>>2];c[m+12>>2]=c[o+12>>2];o=k+112|0;c[o>>2]=l+(q<<1);q=a+2|0;w1(q,h,k);c[o>>2]=l+(r<<1);w1(q,j,k);k=f+12|0;if((c[k>>2]|0)==0){i=g;return}else{s=0}do{f=e[h+(s<<1)>>1]|0;b[d+(s<<1)>>1]=(((ca((e[j+(s<<1)>>1]|0)-f|0,p)|0)+32768|0)>>>16)+f;s=s+1|0}while(s>>>0<(c[k>>2]|0)>>>0);i=g;return}function z1(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,j=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0;e=i;i=i+1152|0;f=e+632|0;j=e+120|0;l=e;m=c[d+112>>2]|0;n=+g[a>>2];if(n<0.0){o=0.0}else{o=n>1.0?1.0:n}p=o*+((c[d+48>>2]|0)>>>0);h[k>>3]=p+103079215104.0;q=c[k>>2]>>16;o=p- +(q|0);r=c[d+100>>2]|0;s=ca(q,r)|0;q=s+(!(n>=1.0)?r:0)|0;r=l+0|0;t=d+0|0;u=r+120|0;do{c[r>>2]=c[t>>2];r=r+4|0;t=t+4|0}while((r|0)<(u|0));t=l+48|0;r=d+52|0;c[t+0>>2]=c[r+0>>2];c[t+4>>2]=c[r+4>>2];c[t+8>>2]=c[r+8>>2];c[t+12>>2]=c[r+12>>2];c[t+16>>2]=c[r+16>>2];r=l+112|0;c[r>>2]=m+(s<<2);s=a+4|0;x1(s,f,l);c[r>>2]=m+(q<<2);x1(s,j,l);l=d+12|0;if((c[l>>2]|0)==0){i=e;return}else{v=0}do{n=+g[f+(v<<2)>>2];g[b+(v<<2)>>2]=n+o*(+g[j+(v<<2)>>2]-n);v=v+1|0}while(v>>>0<(c[l>>2]|0)>>>0);i=e;return}function A1(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;g=i;i=i+640|0;h=g+376|0;j=g+120|0;k=g;l=c[f+112>>2]|0;m=b[a>>1]|0;n=ca(m&65535,c[f+48>>2]|0)|0;o=((n+32767|0)/65535|0)+n|0;n=o>>16;p=o&65535;o=c[f+100>>2]|0;q=ca(n,o)|0;r=ca(n+(m<<16>>16!=-1&1)|0,o)|0;o=k+0|0;m=f+0|0;n=o+120|0;do{c[o>>2]=c[m>>2];o=o+4|0;m=m+4|0}while((o|0)<(n|0));m=k+48|0;o=f+52|0;c[m+0>>2]=c[o+0>>2];c[m+4>>2]=c[o+4>>2];c[m+8>>2]=c[o+8>>2];c[m+12>>2]=c[o+12>>2];c[m+16>>2]=c[o+16>>2];o=k+112|0;c[o>>2]=l+(q<<1);q=a+2|0;y1(q,h,k);c[o>>2]=l+(r<<1);y1(q,j,k);k=f+12|0;if((c[k>>2]|0)==0){i=g;return}else{s=0}do{f=e[h+(s<<1)>>1]|0;b[d+(s<<1)>>1]=(((ca((e[j+(s<<1)>>1]|0)-f|0,p)|0)+32768|0)>>>16)+f;s=s+1|0}while(s>>>0<(c[k>>2]|0)>>>0);i=g;return}function B1(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,j=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0;e=i;i=i+1152|0;f=e+632|0;j=e+120|0;l=e;m=c[d+112>>2]|0;n=+g[a>>2];if(n<0.0){o=0.0}else{o=n>1.0?1.0:n}p=o*+((c[d+48>>2]|0)>>>0);h[k>>3]=p+103079215104.0;q=c[k>>2]>>16;o=p- +(q|0);r=c[d+104>>2]|0;s=ca(q,r)|0;q=s+(!(n>=1.0)?r:0)|0;r=l+0|0;t=d+0|0;u=r+120|0;do{c[r>>2]=c[t>>2];r=r+4|0;t=t+4|0}while((r|0)<(u|0));t=l+48|0;r=d+52|0;c[t+0>>2]=c[r+0>>2];c[t+4>>2]=c[r+4>>2];c[t+8>>2]=c[r+8>>2];c[t+12>>2]=c[r+12>>2];c[t+16>>2]=c[r+16>>2];c[t+20>>2]=c[r+20>>2];r=l+112|0;c[r>>2]=m+(s<<2);s=a+4|0;z1(s,f,l);c[r>>2]=m+(q<<2);z1(s,j,l);l=d+12|0;if((c[l>>2]|0)==0){i=e;return}else{v=0}do{n=+g[f+(v<<2)>>2];g[b+(v<<2)>>2]=n+o*(+g[j+(v<<2)>>2]-n);v=v+1|0}while(v>>>0<(c[l>>2]|0)>>>0);i=e;return}function C1(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;g=i;i=i+640|0;h=g+376|0;j=g+120|0;k=g;l=c[f+112>>2]|0;m=b[a>>1]|0;n=ca(m&65535,c[f+48>>2]|0)|0;o=((n+32767|0)/65535|0)+n|0;n=o>>16;p=o&65535;o=c[f+104>>2]|0;q=ca(n,o)|0;r=ca(n+(m<<16>>16!=-1&1)|0,o)|0;o=k+0|0;m=f+0|0;n=o+120|0;do{c[o>>2]=c[m>>2];o=o+4|0;m=m+4|0}while((o|0)<(n|0));m=k+48|0;o=f+52|0;c[m+0>>2]=c[o+0>>2];c[m+4>>2]=c[o+4>>2];c[m+8>>2]=c[o+8>>2];c[m+12>>2]=c[o+12>>2];c[m+16>>2]=c[o+16>>2];c[m+20>>2]=c[o+20>>2];o=k+112|0;c[o>>2]=l+(q<<1);q=a+2|0;A1(q,h,k);c[o>>2]=l+(r<<1);A1(q,j,k);k=f+12|0;if((c[k>>2]|0)==0){i=g;return}else{s=0}do{f=e[h+(s<<1)>>1]|0;b[d+(s<<1)>>1]=(((ca((e[j+(s<<1)>>1]|0)-f|0,p)|0)+32768|0)>>>16)+f;s=s+1|0}while(s>>>0<(c[k>>2]|0)>>>0);i=g;return}function D1(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,j=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0;e=i;i=i+1152|0;f=e+632|0;j=e+120|0;l=e;m=c[d+112>>2]|0;n=+g[a>>2];if(n<0.0){o=0.0}else{o=n>1.0?1.0:n}p=o*+((c[d+48>>2]|0)>>>0);h[k>>3]=p+103079215104.0;q=c[k>>2]>>16;o=p- +(q|0);r=c[d+108>>2]|0;s=ca(q,r)|0;q=s+(!(n>=1.0)?r:0)|0;r=l+0|0;t=d+0|0;u=r+120|0;do{c[r>>2]=c[t>>2];r=r+4|0;t=t+4|0}while((r|0)<(u|0));t=l+48|0;r=d+52|0;c[t+0>>2]=c[r+0>>2];c[t+4>>2]=c[r+4>>2];c[t+8>>2]=c[r+8>>2];c[t+12>>2]=c[r+12>>2];c[t+16>>2]=c[r+16>>2];c[t+20>>2]=c[r+20>>2];c[t+24>>2]=c[r+24>>2];r=l+112|0;c[r>>2]=m+(s<<2);s=a+4|0;B1(s,f,l);c[r>>2]=m+(q<<2);B1(s,j,l);l=d+12|0;if((c[l>>2]|0)==0){i=e;return}else{v=0}do{n=+g[f+(v<<2)>>2];g[b+(v<<2)>>2]=n+o*(+g[j+(v<<2)>>2]-n);v=v+1|0}while(v>>>0<(c[l>>2]|0)>>>0);i=e;return}function E1(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;g=i;i=i+640|0;h=g+376|0;j=g+120|0;k=g;l=c[f+112>>2]|0;m=b[a>>1]|0;n=ca(m&65535,c[f+48>>2]|0)|0;o=((n+32767|0)/65535|0)+n|0;n=o>>16;p=o&65535;o=c[f+108>>2]|0;q=ca(n,o)|0;r=ca(n+(m<<16>>16!=-1&1)|0,o)|0;o=k+0|0;m=f+0|0;n=o+120|0;do{c[o>>2]=c[m>>2];o=o+4|0;m=m+4|0}while((o|0)<(n|0));m=k+48|0;o=f+52|0;c[m+0>>2]=c[o+0>>2];c[m+4>>2]=c[o+4>>2];c[m+8>>2]=c[o+8>>2];c[m+12>>2]=c[o+12>>2];c[m+16>>2]=c[o+16>>2];c[m+20>>2]=c[o+20>>2];c[m+24>>2]=c[o+24>>2];o=k+112|0;c[o>>2]=l+(q<<1);q=a+2|0;C1(q,h,k);c[o>>2]=l+(r<<1);C1(q,j,k);k=f+12|0;if((c[k>>2]|0)==0){i=g;return}else{s=0}do{f=e[h+(s<<1)>>1]|0;b[d+(s<<1)>>1]=(((ca((e[j+(s<<1)>>1]|0)-f|0,p)|0)+32768|0)>>>16)+f;s=s+1|0}while(s>>>0<(c[k>>2]|0)>>>0);i=g;return}function F1(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;e=Dda(b,292)|0;if((e|0)==0){f=0;i=d;return f|0}g=Dda(b,4)|0;if((g|0)==0){Gda(b,e);f=0;i=d;return f|0}else{c[g>>2]=0;c[e+4>>2]=b;c[e>>2]=g;c[e+8>>2]=0;c[e+12>>2]=0;a[e+16>>0]=0;c[e+272>>2]=294;c[e+276>>2]=254;c[e+280>>2]=210;c[e+284>>2]=211;c[e+288>>2]=207;f=e;i=d;return f|0}return 0}function G1(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;b=c[a>>2]|0;a=ca(e,d)|0;c[b>>2]=(c[b>>2]|0)+a;return e|0}function H1(a,b){a=a|0;b=b|0;c[c[a>>2]>>2]=b;return 1}function I1(a){a=a|0;var b=0,d=0;b=i;d=a+4|0;Gda(c[d>>2]|0,c[a>>2]|0);Gda(c[d>>2]|0,a);i=b;return 1}function J1(a){a=a|0;return c[c[a>>2]>>2]|0}function K1(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;d=i;e=c[a>>2]|0;f=(c[e>>2]|0)+b|0;c[e>>2]=f;e=a+8|0;if(!(f>>>0>(c[e>>2]|0)>>>0)){i=d;return 1}c[e>>2]=f;i=d;return 1}function L1(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+16|0;f=e;g=Dda(0,292)|0;if((g|0)==0){h=0;i=e;return h|0}j=Dda(0,16)|0;do{if((j|0)!=0){if((b|0)==0){Jda(0,5,712144,f);Gda(0,j);break}k=Cda(0,d)|0;c[j>>2]=k;if((k|0)==0){Gda(0,j);Gda(0,g);c[f>>2]=d;Jda(0,5,712184,f);h=0;i=e;return h|0}else{c3a(k|0,b|0,d|0)|0;c[j+12>>2]=1;c[j+4>>2]=d;c[j+8>>2]=0;c[g+12>>2]=d;c[g+4>>2]=0;c[g>>2]=j;c[g+8>>2]=0;a[g+16>>0]=0;c[g+272>>2]=295;c[g+276>>2]=255;c[g+280>>2]=212;c[g+284>>2]=213;c[g+288>>2]=208;h=g;i=e;return h|0}}}while(0);Gda(0,g);h=0;i=e;return h|0}function M1(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;i=i+16|0;g=f;h=c[a>>2]|0;j=ca(e,d)|0;d=h+8|0;k=c[d>>2]|0;l=c[h+4>>2]|0;if((k+j|0)>>>0>l>>>0){m=c[a+4>>2]|0;c[g>>2]=l-k;c[g+4>>2]=j;Jda(m,5,712968,g);n=0;i=f;return n|0}else{d3a(b|0,(c[h>>2]|0)+k|0,j|0)|0;c[d>>2]=(c[d>>2]|0)+j;n=e;i=f;return n|0}return 0}function N1(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=c[a>>2]|0;if((c[e+4>>2]|0)>>>0<b>>>0){Jda(c[a+4>>2]|0,6,712920,d);f=0;i=d;return f|0}else{c[e+8>>2]=b;f=1;i=d;return f|0}return 0}function O1(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;if((c[d+12>>2]|0)!=0?(e=c[d>>2]|0,(e|0)!=0):0){Gda(c[a+4>>2]|0,e)}e=a+4|0;Gda(c[e>>2]|0,d);Gda(c[e>>2]|0,a);i=b;return 1}function P1(a){a=a|0;var b=0,d=0;b=c[a>>2]|0;if((b|0)==0){d=0}else{d=c[b+8>>2]|0}return d|0}function Q1(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;f=c[a>>2]|0;if((f|0)==0){g=0;i=e;return g|0}h=f+8|0;j=c[h>>2]|0;k=c[f+4>>2]|0;l=(j+b|0)>>>0>k>>>0?k-j|0:b;if((l|0)==0){g=1;i=e;return g|0}d3a((c[f>>2]|0)+j|0,d|0,l|0)|0;d=(c[h>>2]|0)+l|0;c[h>>2]=d;h=a+8|0;if(!(d>>>0>(c[h>>2]|0)>>>0)){g=1;i=e;return g|0}c[h>>2]=d;g=1;i=e;return g|0}function R1(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+16|0;f=e;if((d|0)==0){_a(712224,712088,371,712256)}g=Dda(b,292)|0;if((g|0)==0){h=0;i=e;return h|0}j=gc(d|0,712288)|0;if((j|0)==0){Gda(b,g);c[f>>2]=d;Jda(b,1,712296,f);h=0;i=e;return h|0}else{c[g+12>>2]=0;c[g+4>>2]=b;c[g>>2]=j;c[g+8>>2]=0;Z2a(g+16|0,d|0,255)|0;a[g+271>>0]=0;c[g+272>>2]=296;c[g+276>>2]=256;c[g+280>>2]=214;c[g+284>>2]=215;c[g+288>>2]=209;h=g;i=e;return h|0}return 0}function S1(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;i=i+16|0;g=f;h=Ya(b|0,d|0,e|0,c[a>>2]|0)|0;if((h|0)==(e|0)){j=e;i=f;return j|0}b=c[a+4>>2]|0;a=ca(e,d)|0;c[g>>2]=ca(h,d)|0;c[g+4>>2]=a;Jda(b,1,712864,g);j=0;i=f;return j|0}function T1(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;if((_b(c[a>>2]|0,b|0,0)|0)==0){e=1;i=d;return e|0}Jda(c[a+4>>2]|0,1,712824,d);e=0;i=d;return e|0}function U1(a){a=a|0;var b=0,d=0;b=i;if((ac(c[a>>2]|0)|0)!=0){d=0;i=b;return d|0}Gda(c[a+4>>2]|0,a);d=1;i=b;return d|0}function V1(a){a=a|0;var b=0,d=0;b=i;d=ob(c[a>>2]|0)|0;i=b;return d|0}function W1(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;if((b|0)==0){f=1;i=e;return f|0}g=a+8|0;c[g>>2]=(c[g>>2]|0)+b;f=(Jb(d|0,b|0,1,c[a>>2]|0)|0)==1&1;i=e;return f|0}function X1(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+16|0;d=b;c[d>>2]=Kb(0)|0;e=Dda(a,2928)|0;if((e|0)==0){f=0;i=b;return f|0}c[e+4>>2]=a;c[e+116>>2]=0;c[e+52>>2]=34603008;g=e+8|0;h=(Db(d|0)|0)+0|0;d=g+44|0;do{c[g>>2]=c[h>>2];g=g+4|0;h=h+4|0}while((g|0)<(d|0));c[e+2924>>2]=Pda(a)|0;f=e;i=b;return f|0}function Y1(a){a=a|0;var b=0;if((a|0)==0){b=0}else{b=c[a+4>>2]|0}return b|0}function Z1(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;f=c[a+116>>2]|0;a:do{if((f|0)==0){g=-1}else{h=(d|0)==0;j=b;while(1){k=0;while(1){l=k+1|0;if((c[a+(k<<2)+120>>2]|0)==(j|0)){break}if(l>>>0<f>>>0){k=l}else{g=-1;break a}}l=(k|0)<0;if(l|h){g=l?-1:k;break a}l=j;j=c[a+(k<<2)+520>>2]|0;if((j|0)==0){g=k;break a}if(!((l|0)==1649693251|(l|0)==1733579331|(l|0)==1918128707)){j=j;continue}if((j|0)==1649957210|(j|0)==1733843290|(j|0)==1918392666){g=k;break}}}}while(0);i=e;return g|0}function _1(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=(Z1(a,b,0)|0)>>>31^1;i=c;return d|0}function $1(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;b=i;i=i+160|0;d=b+128|0;e=b+136|0;f=b;g=b+132|0;h=c[a>>2]|0;if((id[c[h+272>>2]&511](h,f,128,1)|0)!=1){j=0;i=b;return j|0}if((s4(c[f+36>>2]|0)|0)!=1633907568){Jda(c[a+4>>2]|0,11,712320,d);j=0;i=b;return j|0}c[a+56>>2]=s4(c[f+12>>2]|0)|0;c[a+60>>2]=s4(c[f+16>>2]|0)|0;c[a+64>>2]=s4(c[f+20>>2]|0)|0;c[a+68>>2]=s4(c[f+64>>2]|0)|0;c[a+72>>2]=s4(c[f+44>>2]|0)|0;c[a+76>>2]=s4(c[f+48>>2]|0)|0;c[a+80>>2]=s4(c[f+52>>2]|0)|0;c[a+96>>2]=s4(c[f+80>>2]|0)|0;t4(a+88|0,f+56|0);c[a+52>>2]=s4(c[f+8>>2]|0)|0;k=s4(c[f>>2]|0)|0;l=c[(c[a>>2]|0)+12>>2]|0;m=k>>>0<l>>>0?k:l;O4(f+24|0,a+8|0);l=a+100|0;k=f+84|0;c[l+0>>2]=c[k+0>>2];c[l+4>>2]=c[k+4>>2];c[l+8>>2]=c[k+8>>2];c[l+12>>2]=c[k+12>>2];if((x4(h,g)|0)==0){j=0;i=b;return j|0}k=c[g>>2]|0;if(k>>>0>100){l=c[a+4>>2]|0;c[d>>2]=k;Jda(l,2,712360,d);j=0;i=b;return j|0}d=a+116|0;c[d>>2]=0;l=e+4|0;f=e+8|0;if((k|0)==0){j=1;i=b;return j|0}else{n=0}while(1){if((x4(h,e)|0)==0){j=0;o=19;break}if((x4(h,l)|0)==0){j=0;o=19;break}if((x4(h,f)|0)==0){j=0;o=19;break}k=c[l>>2]|0;p=c[f>>2]|0;q=p+k|0;if(!(q>>>0>m>>>0|q>>>0<k>>>0)){c[a+(c[d>>2]<<2)+120>>2]=c[e>>2];c[a+(c[d>>2]<<2)+1320>>2]=k;c[a+(c[d>>2]<<2)+920>>2]=p;q=c[d>>2]|0;if((q|0)==0){r=0}else{s=q;q=0;while(1){if((c[a+(q<<2)+1320>>2]|0)==(k|0)?(c[a+(q<<2)+920>>2]|0)==(p|0):0){c[a+(s<<2)+520>>2]=c[a+(q<<2)+120>>2];t=c[d>>2]|0}else{t=s}q=q+1|0;if(!(q>>>0<t>>>0)){r=t;break}else{s=t}}}c[d>>2]=r+1}n=n+1|0;if(!(n>>>0<(c[g>>2]|0)>>>0)){j=1;o=19;break}}if((o|0)==19){i=b;return j|0}return 0}function a2(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;i=i+144|0;e=d;f=d+128|0;c[e>>2]=s4(b)|0;b=s4(1818455411)|0;c[e+4>>2]=b;c[e+8>>2]=s4(c[a+52>>2]|0)|0;c[e+12>>2]=s4(c[a+56>>2]|0)|0;c[e+16>>2]=s4(c[a+60>>2]|0)|0;c[e+20>>2]=s4(c[a+64>>2]|0)|0;P4(e+24|0,a+8|0);c[e+36>>2]=s4(1633907568)|0;c[e+40>>2]=s4(1095782476)|0;c[e+44>>2]=s4(c[a+72>>2]|0)|0;c[e+48>>2]=s4(c[a+76>>2]|0)|0;c[e+52>>2]=s4(c[a+80>>2]|0)|0;t4(e+56|0,a+88|0);c[e+64>>2]=s4(c[a+68>>2]|0)|0;c[e+68>>2]=s4(K4(+h[90522])|0)|0;c[e+72>>2]=s4(K4(+h[724184>>3])|0)|0;c[e+76>>2]=s4(K4(+h[724192>>3])|0)|0;c[e+80>>2]=b;b=e+100|0;c[b+0>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b+16>>2]=0;c[b+20>>2]=0;c[b+24>>2]=0;b=e+84|0;g=a+100|0;c[b+0>>2]=c[g+0>>2];c[b+4>>2]=c[g+4>>2];c[b+8>>2]=c[g+8>>2];c[b+12>>2]=c[g+12>>2];g=c[a>>2]|0;if((Qc[c[g+288>>2]&255](g,128,e)|0)==0){j=0;i=d;return j|0}e=a+116|0;g=c[e>>2]|0;if((g|0)==0){k=0}else{b=0;l=0;while(1){m=((c[a+(l<<2)+120>>2]|0)!=0&1)+b|0;l=l+1|0;if(!(l>>>0<g>>>0)){k=m;break}else{b=m}}}if((G4(c[a>>2]|0,k)|0)==0){j=0;i=d;return j|0}k=c[e>>2]|0;if((k|0)==0){j=1;i=d;return j|0}b=f+4|0;g=f+8|0;l=k;k=0;while(1){m=c[a+(k<<2)+120>>2]|0;if((m|0)==0){n=l}else{c[f>>2]=s4(m)|0;c[b>>2]=s4(c[a+(k<<2)+1320>>2]|0)|0;c[g>>2]=s4(c[a+(k<<2)+920>>2]|0)|0;m=c[a>>2]|0;if((Qc[c[m+288>>2]&255](m,12,f)|0)==0){j=0;o=11;break}n=c[e>>2]|0}k=k+1|0;if(!(k>>>0<n>>>0)){j=1;o=11;break}else{l=n}}if((o|0)==11){i=d;return j|0}return 0}function b2(a){a=a|0;return c[a+68>>2]|0}function c2(a){a=a|0;c[a+68>>2]=0;return}function d2(a){a=a|0;return c[a+76>>2]|0}function e2(a){a=a|0;return c[a+80>>2]|0}function f2(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+88|0;a=c[d+4>>2]|0;e=b;c[e>>2]=c[d>>2];c[e+4>>2]=a;return}function g2(a,b){a=a|0;b=b|0;var c=0;c=i;d3a(b|0,a+100|0,16)|0;i=c;return}function h2(a){a=a|0;return c[a+64>>2]|0}function i2(a,b){a=a|0;b=b|0;c[a+64>>2]=b;return}function j2(a){a=a|0;return c[a+60>>2]|0}function k2(a,b){a=a|0;b=b|0;c[a+60>>2]=b;return}function l2(a){a=a|0;return c[a+56>>2]|0}function m2(a,b){a=a|0;b=b|0;c[a+56>>2]=b;return}function n2(a){a=a|0;return c[a+52>>2]|0}function o2(a,b){a=a|0;b=+b;var d=0;d=i;c[a+52>>2]=(p2(~~+Q(+(b*100.0+.5))>>>0,10,16)|0)<<16;i=d;return}function p2(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;i=i+112|0;f=e;if((b|0)==0){g=0;i=e;return g|0}else{h=b;j=0}while(1){a[f+j>>0]=(h>>>0)%(c>>>0)|0;h=(h>>>0)/(c>>>0)|0;k=j+1|0;if(!((h|0)!=0&(k|0)<100)){break}else{j=k}}if((j|0)>-1){l=k;m=0}else{g=0;i=e;return g|0}while(1){l=l+ -1|0;k=ca(m,d)|0;j=(a[f+l>>0]|0)+k|0;if((l|0)<=0){g=j;break}else{m=j}}i=e;return g|0}function q2(a){a=a|0;var b=0,d=0.0;b=i;d=+((p2((c[a+52>>2]|0)>>>16,16,10)|0)>>>0)/100.0;i=b;return+d}function r2(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;b=i;i=i+32|0;d=b;if((a|0)==0){i=b;return}e=a+2920|0;if((c[e>>2]|0)!=0){c[e>>2]=0;w2(a,(c[a>>2]|0)+16|0)|0}e=a+116|0;if((c[e>>2]|0)!=0){f=a+2120|0;g=a+2520|0;h=a+4|0;j=d+20|0;k=a+52|0;l=d+24|0;m=d+16|0;n=0;do{o=c[f+(n<<2)>>2]|0;do{if((o|0)!=0){p=c[g+(n<<2)>>2]|0;if((p|0)==0){Gda(c[h>>2]|0,o);break}else{c[d+0>>2]=c[p+0>>2];c[d+4>>2]=c[p+4>>2];c[d+8>>2]=c[p+8>>2];c[d+12>>2]=c[p+12>>2];c[d+16>>2]=c[p+16>>2];c[j>>2]=c[h>>2];c[l>>2]=c[k>>2];Ic[c[m>>2]&511](d,o);break}}}while(0);n=n+1|0}while(n>>>0<(c[e>>2]|0)>>>0)}e=c[a>>2]|0;if((e|0)!=0){Lc[c[e+280>>2]&255](e)|0}e=a+4|0;Qda(c[e>>2]|0,c[a+2924>>2]|0);Gda(c[e>>2]|0,a);i=b;return}function s2(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=X1(0)|0;do{if((e|0)==0){f=0}else{g=L1(a,b)|0;c[e>>2]=g;if((g|0)!=0?($1(e)|0)!=0:0){f=e;break}r2(e);f=0}}while(0);i=d;return f|0}function t2(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=s2(a,b)|0;i=c;return d|0}function u2(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;i=i+2928|0;e=d;if((a|0)==0){_a(712392,712088,1282,712424)}c3a(e|0,a|0,2928)|0;f=F1(c[a+4>>2]|0)|0;c[a>>2]=f;if((f|0)==0){g=0;i=d;return g|0}do{if((a2(a,0)|0)!=0?(v2(a,e)|0)!=0:0){h=c[f+8>>2]|0;if((b|0)!=0){c[a>>2]=b;j=a+116|0;k=c[j>>2]|0;if((k|0)!=0){l=k;k=0;while(1){m=c[a+(k<<2)+520>>2]|0;if((m|0)!=0?(n=Z1(a,m,0)|0,(n|0)>-1):0){c[a+(k<<2)+1320>>2]=c[a+(n<<2)+1320>>2];c[a+(k<<2)+920>>2]=c[a+(n<<2)+920>>2];o=c[j>>2]|0}else{o=l}k=k+1|0;if(!(k>>>0<o>>>0)){break}else{l=o}}}if((a2(a,h)|0)==0){break}if((v2(a,e)|0)==0){break}}c3a(a|0,e|0,2928)|0;l=(Lc[c[f+280>>2]&255](f)|0)==0;g=l?0:h;i=d;return g|0}}while(0);Lc[c[f+280>>2]&255](f)|0;c3a(a|0,e|0,2928)|0;g=0;i=d;return g|0}function v2(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;d=i;i=i+48|0;e=d;f=d+4|0;g=d+32|0;h=c[a>>2]|0;j=+q2(a);k=a+116|0;if((c[k>>2]|0)==0){l=1;i=d;return l|0}m=h+8|0;n=(b|0)==0;o=a+4|0;p=h+288|0;q=f+20|0;r=a+52|0;s=f+24|0;t=f+8|0;u=0;a:while(1){v=a+(u<<2)+120|0;w=c[v>>2]|0;do{if((w|0)!=0?(c[a+(u<<2)+520>>2]|0)==0:0){x=c[m>>2]|0;c[a+(u<<2)+1320>>2]=x;y=c[a+(u<<2)+2120>>2]|0;if((y|0)==0){if(n|(x|0)==0){break}z=c[b+(u<<2)+920>>2]|0;A=c[b>>2]|0;if((dd[c[A+276>>2]&511](A,c[b+(u<<2)+1320>>2]|0)|0)==0){l=0;B=26;break a}A=Cda(c[o>>2]|0,z)|0;if((A|0)==0){l=0;B=26;break a}C=c[b>>2]|0;if((id[c[C+272>>2]&511](C,A,z,1)|0)!=1){l=0;B=26;break a}if((Qc[c[p>>2]&255](h,z,A)|0)==0){l=0;B=26;break a}Gda(c[o>>2]|0,A);c[a+(u<<2)+920>>2]=(c[m>>2]|0)-x;if((T4(h)|0)==0){l=0;B=26;break a}else{break}}if((c[a+(u<<2)+1720>>2]|0)!=0){A=a+(u<<2)+920|0;if((Qc[c[p>>2]&255](h,c[A>>2]|0,y)|0)==1){D=A}else{l=0;B=26;break a}}else{A=X4(c[o>>2]|0,w)|0;if((A|0)==0){break}z=c[A+88>>2]|0;if((z|0)==0){E=c[A+8>>2]|0}else{E=md[z&7](j,y)|0}z=V4(c[o>>2]|0,E)|0;if((z|0)==0){C=c[o>>2]|0;c[e>>2]=c[v>>2];Jda(C,3,712752,e);break}F=c[z>>2]|0;if((R4(h,F)|0)==0){l=0;B=26;break a}c[f+0>>2]=c[z+0>>2];c[f+4>>2]=c[z+4>>2];c[f+8>>2]=c[z+8>>2];c[f+12>>2]=c[z+12>>2];c[f+16>>2]=c[z+16>>2];c[q>>2]=c[o>>2];c[s>>2]=c[r>>2];if((id[c[t>>2]&511](f,h,y,c[A>>2]|0)|0)==0){B=23;break a}D=a+(u<<2)+920|0}c[D>>2]=(c[m>>2]|0)-x;if((T4(h)|0)==0){l=0;B=26;break a}}}while(0);u=u+1|0;if(!(u>>>0<(c[k>>2]|0)>>>0)){l=1;B=26;break}}if((B|0)==23){Kda(g,F);F=c[o>>2]|0;c[e>>2]=g;Jda(F,7,712792,e);l=0;i=d;return l|0}else if((B|0)==26){i=d;return l|0}return 0}function w2(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;if((a|0)==0){e=0}else{e=c[a+4>>2]|0}f=R1(e,b)|0;if((f|0)==0){g=0;i=d;return g|0}e=(u2(a,f)|0)!=0&1;a=e&(Lc[c[f+280>>2]&255](f)|0);if((a|0)!=0){g=a;i=d;return g|0}Yb(b|0)|0;g=0;i=d;return g|0}function x2(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=i;i=i+64|0;e=d;f=d+16|0;g=d+12|0;h=d+54|0;j=d+49|0;k=d+44|0;l=c[a>>2]|0;m=a+4|0;n=a+2924|0;if((Rda(c[m>>2]|0,c[n>>2]|0)|0)==0){o=0;i=d;return o|0}p=Z1(a,b,1)|0;do{if((p|0)>=0){q=a+2120+(p<<2)|0;if((c[q>>2]|0)!=0){if((c[a+1720+(p<<2)>>2]|0)!=0){break}Sda(c[m>>2]|0,c[n>>2]|0);o=c[q>>2]|0;i=d;return o|0}r=c[a+920+(p<<2)>>2]|0;if((dd[c[l+276>>2]&511](l,c[a+1320+(p<<2)>>2]|0)|0)!=0){s=X4(c[m>>2]|0,b)|0;if((s|0)==0){Kda(h,b);t=c[m>>2]|0;c[e>>2]=h;Jda(t,8,712464,e);break}t=Q4(l)|0;if(((t|0)!=0?(y2(s,t)|0)!=0:0)?(u=V4(c[m>>2]|0,t)|0,(u|0)!=0):0){t=r+ -8|0;c[f+0>>2]=c[u+0>>2];c[f+4>>2]=c[u+4>>2];c[f+8>>2]=c[u+8>>2];c[f+12>>2]=c[u+12>>2];c[f+16>>2]=c[u+16>>2];c[a+2520+(p<<2)>>2]=u;c[f+20>>2]=c[m>>2];c[f+24>>2]=c[a+52>>2];u=id[c[f+4>>2]&511](f,l,g,t)|0;c[q>>2]=u;if((u|0)==0){Kda(j,b);u=c[m>>2]|0;c[e>>2]=j;Jda(u,12,712496,e);break}if((c[g>>2]|0)>>>0<(c[s>>2]|0)>>>0){Kda(k,b);u=c[m>>2]|0;t=c[s>>2]|0;s=c[g>>2]|0;c[e>>2]=k;c[e+4>>2]=t;c[e+8>>2]=s;Jda(u,12,712520,e)}Sda(c[m>>2]|0,c[n>>2]|0);o=c[q>>2]|0;i=d;return o|0}}}}while(0);Sda(c[m>>2]|0,c[n>>2]|0);o=0;i=d;return o|0}function y2(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=c[a+4>>2]|0;f=e>>>0<20?e:20;a:do{if((f|0)==0){g=0}else{e=0;while(1){if((c[a+(e<<2)+8>>2]|0)==(b|0)){g=1;break a}e=e+1|0;if(!(e>>>0<f>>>0)){g=0;break}}}}while(0);i=d;return g|0}function z2(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=Z1(a,b,1)|0;if((e|0)<0){f=0;i=d;return f|0}f=c[c[a+2520+(e<<2)>>2]>>2]|0;i=d;return f|0}function A2(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0;e=i;i=i+64|0;f=e;g=e+12|0;h=e+8|0;j=e+45|0;k=e+40|0;l=a+4|0;m=a+2924|0;if((Rda(c[l>>2]|0,c[m>>2]|0)|0)==0){n=0;i=e;return n|0}do{if((d|0)==0){o=Z1(a,b,0)|0;c[h>>2]=o;if((o|0)>-1){B2(a,o);c[a+120+(o<<2)>>2]=0;Sda(c[l>>2]|0,c[m>>2]|0);n=1;i=e;return n|0}}else{if((C2(a,b,h)|0)!=0){o=c[h>>2]|0;c[a+1720+(o<<2)>>2]=0;c[a+520+(o<<2)>>2]=0;p=X4(c[l>>2]|0,b)|0;if((p|0)==0){q=c[l>>2]|0;c[f>>2]=b;Jda(q,8,712576,f);break}q=c[p+88>>2]|0;if((q|0)==0){r=c[p+8>>2]|0}else{s=+q2(a);r=md[q&7](s,d)|0}if((y2(p,r)|0)==0){Kda(j,r);Kda(k,b);q=c[l>>2]|0;c[f>>2]=j;c[f+4>>2]=k;Jda(q,8,712600,f);break}q=V4(c[l>>2]|0,r)|0;if((q|0)==0){Kda(j,r);Kda(k,b);t=c[l>>2]|0;c[f>>2]=j;c[f+4>>2]=k;Jda(t,8,712600,f);break}c[a+2520+(o<<2)>>2]=q;c[a+120+(o<<2)>>2]=b;c[a+920+(o<<2)>>2]=0;c[a+1320+(o<<2)>>2]=0;c[g+0>>2]=c[q+0>>2];c[g+4>>2]=c[q+4>>2];c[g+8>>2]=c[q+8>>2];c[g+12>>2]=c[q+12>>2];c[g+16>>2]=c[q+16>>2];c[g+20>>2]=c[l>>2];c[g+24>>2]=c[a+52>>2];q=Qc[c[g+12>>2]&255](g,d,c[p>>2]|0)|0;c[a+2120+(o<<2)>>2]=q;if((q|0)==0){Kda(j,r);Kda(k,b);q=c[l>>2]|0;c[f>>2]=j;c[f+4>>2]=k;Jda(q,12,712640,f);break}Sda(c[l>>2]|0,c[m>>2]|0);n=1;i=e;return n|0}}}while(0);Sda(c[l>>2]|0,c[m>>2]|0);n=0;i=e;return n|0}function B2(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+32|0;e=d;if((a|0)==0){_a(712688,712088,575,712712)}if(!((b|0)>-1)){_a(712736,712088,576,712712)}f=a+(b<<2)+2120|0;g=c[f>>2]|0;if((g|0)==0){i=d;return}if((c[a+(b<<2)+1720>>2]|0)!=0){Gda(c[a+4>>2]|0,g);i=d;return}h=c[a+(b<<2)+2520>>2]|0;if((h|0)==0){i=d;return}c[e+0>>2]=c[h+0>>2];c[e+4>>2]=c[h+4>>2];c[e+8>>2]=c[h+8>>2];c[e+12>>2]=c[h+12>>2];c[e+16>>2]=c[h+16>>2];c[e+20>>2]=c[a+4>>2];c[e+24>>2]=c[a+52>>2];Ic[c[e+16>>2]&511](e,g);c[f>>2]=0;i=d;return}function C2(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+16|0;f=e;g=Z1(a,b,0)|0;if((g|0)>-1){B2(a,g);c[d>>2]=g;h=1;i=e;return h|0}g=a+116|0;b=c[g>>2]|0;if(b>>>0>99){j=c[a+4>>2]|0;c[f>>2]=100;Jda(j,2,712360,f);h=0;i=e;return h|0}else{c[d>>2]=b;c[g>>2]=(c[g>>2]|0)+1;h=1;i=e;return h|0}return 0}function D2(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+16|0;e=d;f=a+4|0;g=a+2924|0;if((Rda(c[f>>2]|0,c[g>>2]|0)|0)==0){h=0;i=d;return h|0}if((C2(a,b,e)|0)==0){Sda(c[f>>2]|0,c[g>>2]|0);h=0;i=d;return h|0}else{j=c[e>>2]|0;c[a+1720+(j<<2)>>2]=0;c[a+120+(j<<2)>>2]=b;c[a+520+(j<<2)>>2]=1918128707;c[a+2120+(j<<2)>>2]=0;c[a+920+(j<<2)>>2]=0;c[a+1320+(j<<2)>>2]=0;Sda(c[f>>2]|0,c[g>>2]|0);h=1;i=d;return h|0}return 0}function E2(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0;k=i;l=Dda(a,40)|0;if((l|0)==0){m=0;i=k;return m|0}c[l>>2]=a;c[l+4>>2]=b;c[l+8>>2]=b;c[l+12>>2]=d;c[l+16>>2]=e;c[l+20>>2]=f;c[l+24>>2]=g;c[l+28>>2]=h;c[l+32>>2]=j;m=l;i=k;return m|0}function F2(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=E2(a,1768189472,b,b,183,0,0,0)|0;i=c;return d|0}function G2(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;d3a(b|0,a|0,c[d+12>>2]<<2|0)|0;i=e;return}function H2(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;i=i+16|0;f=e;if((I2(c[a>>2]|0)|0)!=(b|0)){g=0;i=e;return g|0}c[f>>2]=d;if((b|0)!=0){d=0;h=a;while(1){j=c[h>>2]|0;k=c[f>>2]|0;l=c[k>>2]|0;c[f>>2]=k+4;if((c[j+4>>2]|0)!=(l|0)){m=4;break}d=d+1|0;if(!(d>>>0<b>>>0)){n=0;o=a;break}else{h=j+36|0}}if((m|0)==4){g=0;i=e;return g|0}while(1){m=c[o>>2]|0;h=c[f>>2]|0;a=c[h>>2]|0;c[f>>2]=h+4;if((a|0)!=0){c[a>>2]=m}n=n+1|0;if((n|0)==(b|0)){break}else{o=m+36|0}}}g=1;i=e;return g|0}function I2(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((a|0)==0){d=0}else{e=a;a=0;while(1){f=a+1|0;e=c[e+36>>2]|0;if((e|0)==0){d=f;break}else{a=f}}}i=b;return d|0}function J2(a){a=a|0;return c[a+4>>2]|0}function K2(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;f=E2(a,1668707188,b,b,184,216,529,0)|0;if((f|0)==0){g=0;i=e;return g|0}h=Dda(a,8)|0;if((h|0)==0){O2(f);g=0;i=e;return g|0}c[f+32>>2]=h;c[h>>2]=b;j=Eda(a,b,4)|0;k=h+4|0;c[k>>2]=j;if((j|0)==0){O2(f);g=0;i=e;return g|0}if((b|0)==0){g=f;i=e;return g|0}j=(d|0)==0;h=0;while(1){if(j){l=U0(a,1.0)|0;c[(c[k>>2]|0)+(h<<2)>>2]=l}else{l=X0(c[d+(h<<2)>>2]|0)|0;c[(c[k>>2]|0)+(h<<2)>>2]=l}if((c[(c[k>>2]|0)+(h<<2)>>2]|0)==0){break}h=h+1|0;if(!(h>>>0<b>>>0)){g=f;m=14;break}}if((m|0)==14){i=e;return g|0}O2(f);g=0;i=e;return g|0}function L2(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0;e=i;if((d|0)==0){_a(713984,713072,174,714032)}f=c[d+32>>2]|0;if((f|0)==0){i=e;return}d=f+4|0;h=c[d>>2]|0;if((h|0)==0){i=e;return}if((c[f>>2]|0)==0){i=e;return}else{j=h;k=0}while(1){g[b+(k<<2)>>2]=+_0(c[j+(k<<2)>>2]|0,+g[a+(k<<2)>>2]);h=k+1|0;if(!(h>>>0<(c[f>>2]|0)>>>0)){break}j=c[d>>2]|0;k=h}i=e;return}function M2(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;b=i;d=c[a+32>>2]|0;e=Dda(c[a>>2]|0,8)|0;if((e|0)==0){f=0;i=b;return f|0}g=c[d>>2]|0;c[e>>2]=g;h=Eda(c[a>>2]|0,g,4)|0;g=e+4|0;c[g>>2]=h;a:do{if((h|0)==0){j=h}else{if((c[e>>2]|0)==0){f=e;i=b;return f|0}k=d+4|0;l=0;while(1){m=X0(c[(c[k>>2]|0)+(l<<2)>>2]|0)|0;c[(c[g>>2]|0)+(l<<2)>>2]=m;m=c[g>>2]|0;if((c[m+(l<<2)>>2]|0)==0){j=m;break a}l=l+1|0;if(!(l>>>0<(c[e>>2]|0)>>>0)){f=e;break}}i=b;return f|0}}while(0);if((j|0)!=0){d=c[e>>2]|0;if((d|0)==0){n=j}else{h=j;j=d;d=0;while(1){l=c[h+(d<<2)>>2]|0;if((l|0)==0){o=h;p=j}else{V0(l);o=c[g>>2]|0;p=c[e>>2]|0}d=d+1|0;if(!(d>>>0<p>>>0)){n=o;break}else{h=o;j=p}}}}else{n=0}Gda(c[a>>2]|0,n);Gda(c[a>>2]|0,e);f=0;i=b;return f|0}function N2(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;if((a|0)==0){_a(713984,713072,192,714008)}d=c[a+32>>2]|0;if((d|0)==0){i=b;return}e=d+4|0;f=c[e>>2]|0;if((f|0)!=0){g=c[d>>2]|0;if((g|0)==0){h=f}else{j=f;f=g;g=0;while(1){k=c[j+(g<<2)>>2]|0;if((k|0)==0){l=j;m=f}else{V0(k);l=c[e>>2]|0;m=c[d>>2]|0}g=g+1|0;if(!(g>>>0<m>>>0)){h=l;break}else{j=l;f=m}}}}else{h=0}Gda(c[a>>2]|0,h);Gda(c[a>>2]|0,d);i=b;return}function O2(a){a=a|0;var b=0,d=0;b=i;d=c[a+28>>2]|0;if((d|0)!=0){Rc[d&1023](a)}Gda(c[a>>2]|0,a);i=b;return}function P2(a){a=a|0;var b=0,d=0,e=0;b=i;d=K2(a,3,0)|0;if((d|0)==0){e=0}else{c[d+8>>2]=1768189472;e=d}i=b;return e|0}function Q2(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;g=i;j=ca(d,b)|0;a:do{if((((((j|0)!=0?j>>>0<(4294967295/(d>>>0)|0)>>>0:0)?j>>>0<(4294967295/(b>>>0)|0)>>>0:0)?!(j>>>0<b>>>0|j>>>0<d>>>0):0)?(k=E2(a,1835103334,d,b,185,217,530,0)|0,(k|0)!=0):0)?(l=Dda(a,8)|0,(l|0)!=0):0){m=Eda(a,j,8)|0;c[l>>2]=m;if((m|0)==0){T2(k);n=0;break}else{o=m;p=0}while(1){h[o+(p<<3)>>3]=+h[e+(p<<3)>>3];m=p+1|0;if((m|0)==(j|0)){break}o=c[l>>2]|0;p=m}b:do{if((f|0)!=0){m=Eda(a,d,8)|0;q=l+4|0;c[q>>2]=m;if((m|0)==0){T2(k);n=0;break a}if((d|0)!=0){r=m;m=0;while(1){h[r+(m<<3)>>3]=+h[f+(m<<3)>>3];s=m+1|0;if((s|0)==(d|0)){break b}r=c[q>>2]|0;m=s}}}}while(0);c[k+32>>2]=l;n=k}else{n=0}}while(0);i=g;return n|0}function R2(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0.0,r=0,s=0.0,t=0.0;e=i;f=c[d+32>>2]|0;j=d+16|0;if((c[j>>2]|0)==0){i=e;return}k=d+12|0;d=f+4|0;l=0;do{m=c[k>>2]|0;if((m|0)==0){n=0.0}else{o=c[f>>2]|0;p=ca(m,l)|0;q=0.0;r=0;while(1){s=q+ +g[a+(r<<2)>>2]*+h[o+(p+r<<3)>>3];r=r+1|0;if(!(r>>>0<m>>>0)){n=s;break}else{q=s}}}m=c[d>>2]|0;if((m|0)==0){t=n}else{t=n+ +h[m+(l<<3)>>3]}g[b+(l<<2)>>2]=t;l=l+1|0}while(l>>>0<(c[j>>2]|0)>>>0);i=e;return}function S2(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=c[a+32>>2]|0;e=Dda(c[a>>2]|0,8)|0;if((e|0)==0){f=0;i=b;return f|0}g=a+16|0;c[e>>2]=Hda(c[a>>2]|0,c[d>>2]|0,ca(c[a+12>>2]<<3,c[g>>2]|0)|0)|0;h=c[d+4>>2]|0;if((h|0)==0){f=e;i=b;return f|0}c[e+4>>2]=Hda(c[a>>2]|0,h,c[g>>2]<<3)|0;f=e;i=b;return f|0}function T2(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+32|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}f=c[e>>2]|0;if((f|0)!=0){Gda(c[a>>2]|0,f)}f=c[e+4>>2]|0;if((f|0)!=0){Gda(c[a>>2]|0,f)}Gda(c[a>>2]|0,c[d>>2]|0);i=b;return}function U2(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=i;i=i+16|0;j=h;if((d|0)==0){_a(713040,713072,560,713128)}if(e>>>0>8){c[j>>2]=e;c[j+4>>2]=8;Jda(a,2,713160,j);k=0;i=h;return k|0}j=E2(a,1668052340,e,f,186,218,531,0)|0;if((j|0)==0){k=0;i=h;return k|0}l=Dda(a,16)|0;if((l|0)==0){O2(j);k=0;i=h;return k|0}c[j+32>>2]=l;m=ca(Y2(d,e)|0,f)|0;c[l+8>>2]=m;c[l+12>>2]=0;if((m|0)==0){O2(j);k=0;i=h;return k|0}n=Eda(a,m,2)|0;c[l>>2]=n;if((n|0)==0){O2(j);k=0;i=h;return k|0}if((g|0)==0){o=n}else{p=n;n=0;while(1){b[p+(n<<1)>>1]=b[g+(n<<1)>>1]|0;n=n+1|0;q=c[l>>2]|0;if((n|0)==(m|0)){o=q;break}else{p=q}}}p=i1(a,d,e,f,o,0)|0;c[l+4>>2]=p;if((p|0)!=0){k=j;i=h;return k|0}O2(j);k=0;i=h;return k|0}function V2(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+512|0;f=e+256|0;g=e;h=c[d+32>>2]|0;j=c[d+12>>2]|0;if(!(j>>>0<129)){_a(713896,713072,456,713928)}k=d+16|0;if((c[k>>2]|0)>>>0<129){N3(a,f,j);j=c[h+4>>2]|0;ld[c[j+116>>2]&255](f,g,j);M3(g,b,c[k>>2]|0);i=e;return}else{_a(713952,713072,457,713928)}}function W2(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=i;d=c[a+32>>2]|0;e=Dda(c[a>>2]|0,16)|0;if((e|0)==0){f=0;i=b;return f|0}g=d+8|0;c[e+8>>2]=c[g>>2];h=d+12|0;c[e+12>>2]=c[h>>2];j=c[d>>2]|0;do{if((j|0)!=0){k=c[a>>2]|0;l=c[g>>2]|0;if((c[h>>2]|0)==0){m=Hda(k,j,l<<1)|0;c[e>>2]=m;if((m|0)==0){n=m;break}else{o=e;p=m;q=8;break}}m=Hda(k,j,l<<2)|0;c[e>>2]=m;if((m|0)==0){n=m}else{o=e;p=m;q=8}}else{o=e;p=c[e>>2]|0;q=8}}while(0);do{if((q|0)==8){j=c[d+4>>2]|0;h=i1(c[a>>2]|0,j+16|0,c[j+8>>2]|0,c[j+12>>2]|0,p,c[j+4>>2]|0)|0;c[e+4>>2]=h;if((h|0)==0){n=c[o>>2]|0;break}else{f=e;i=b;return f|0}}}while(0);if((n|0)!=0){Gda(c[a>>2]|0,n)}Gda(c[a>>2]|0,e);f=0;i=b;return f|0}function X2(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+32|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}f=c[e>>2]|0;if((f|0)!=0){Gda(c[a>>2]|0,f)}k1(c[e+4>>2]|0);Gda(c[a>>2]|0,c[d>>2]|0);i=b;return}function Y2(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;if((a|0)==0){_a(713856,713072,471,713880)}else{e=b;f=1}while(1){if((e|0)==0){g=f;h=6;break}e=e+ -1|0;b=c[a+(e<<2)>>2]|0;if((b|0)==0){g=0;h=6;break}f=ca(b,f)|0;if(f>>>0>(4294967295/(b>>>0)|0)>>>0){g=0;h=6;break}}if((h|0)==6){i=d;return g|0}return 0}function Z2(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=i;i=i+32|0;h=g;c[h>>2]=b;c[h+4>>2]=b;c[h+8>>2]=b;c[h+12>>2]=b;c[h+16>>2]=b;c[h+20>>2]=b;c[h+24>>2]=b;c[h+28>>2]=b;b=U2(a,h,d,e,f)|0;i=g;return b|0}function _2(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;g=f;if((b|0)==0){_a(713040,713072,651,713208)}if(d>>>0>8){c[g>>2]=d;c[g+4>>2]=8;Jda(a,2,713160,g);h=0;i=f;return h|0}g=E2(a,1668052340,d,e,187,218,531,0)|0;if((g|0)==0){h=0;i=f;return h|0}j=Dda(a,16)|0;if((j|0)==0){O2(g);h=0;i=f;return h|0}c[g+32>>2]=j;k=ca(Y2(b,d)|0,e)|0;c[j+8>>2]=k;c[j+12>>2]=1;if((k|0)==0){O2(g);h=0;i=f;return h|0}l=Eda(a,k,4)|0;c[j>>2]=l;if((l|0)==0){O2(g);h=0;i=f;return h|0}k=i1(a,b,d,e,l,1)|0;c[j+4>>2]=k;if((k|0)!=0){h=g;i=f;return h|0}O2(g);h=0;i=f;return h|0}function $2(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=c[(c[d+32>>2]|0)+4>>2]|0;ld[c[f+116>>2]&255](a,b,f);i=e;return}function a3(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;i=i+48|0;d=b+32|0;e=b;c[d>>2]=3;c[e>>2]=2;c[e+4>>2]=2;c[e+8>>2]=2;c[e+12>>2]=2;c[e+16>>2]=2;c[e+20>>2]=2;c[e+24>>2]=2;c[e+28>>2]=2;f=U2(a,e,3,3,0)|0;if((f|0)==0){g=0;i=b;return g|0}if((b3(f,210,d)|0)==0){O2(f);g=0;i=b;return g|0}else{c[f+8>>2]=1768189472;g=f;i=b;return g|0}return 0}function b3(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;f=i;i=i+288|0;g=f+256|0;h=f;if((a|0)==0){j=0;i=f;return j|0}k=c[a+32>>2]|0;if((k|0)==0){j=0;i=f;return j|0}a=c[k+4>>2]|0;l=c[a+8>>2]|0;m=c[a+12>>2]|0;if((l|0)<1|(m|0)<1|(l|0)>8|(m|0)>127){j=0;i=f;return j|0}n=Y2(a+16|0,l)|0;if((n|0)==0){j=0;i=f;return j|0}if((n|0)<=0){j=1;i=f;return j|0}o=(l|0)>0;p=(m|0)<1;q=0;r=0;while(1){if(o){s=q;t=l;while(1){t=t+ -1|0;u=c[a+(t<<2)+16>>2]|0;b[g+(t<<1)>>1]=d3(+(((s>>>0)%(u>>>0)|0)>>>0),u)|0;if((t|0)<=0){break}else{s=(s>>>0)/(u>>>0)|0}}}s=c[k>>2]|0;a:do{if(!((s|0)==0|p)){t=s;u=0;while(1){b[h+(u<<1)>>1]=b[t+(u+r<<1)>>1]|0;v=u+1|0;if((v|0)==(m|0)){break a}t=c[k>>2]|0;u=v}}}while(0);if((Qc[d&255](g,h,e)|0)==0){j=0;w=17;break}s=c[k>>2]|0;b:do{if(!((s|0)==0|p)){u=s;t=0;while(1){b[u+(t+r<<1)>>1]=b[h+(t<<1)>>1]|0;v=t+1|0;if((v|0)==(m|0)){break b}u=c[k>>2]|0;t=v}}}while(0);q=q+1|0;if((q|0)>=(n|0)){j=1;w=17;break}else{r=r+m|0}}if((w|0)==17){i=f;return j|0}return 0}function c3(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;g=c[e>>2]|0;if((g|0)>0){h=0}else{i=f;return 1}do{b[d+(h<<1)>>1]=b[a+(h<<1)>>1]|0;h=h+1|0}while((h|0)!=(g|0));i=f;return 1}function d3(a,b){a=+a;b=b|0;var c=0,d=0;c=i;d=e3(a*65535.0/+(b+ -1|0))|0;i=c;return d|0}function e3(a){a=+a;var b=0,d=0.0,e=0;b=i;d=a+.5;if(!(d<=0.0)){if(!(d>=65535.0)){h[k>>3]=d+-32767.0+103079215104.0;e=((c[k>>2]|0)>>>16)+32767&65535}else{e=-1}}else{e=0}i=b;return e|0}function f3(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;i=i+32|0;f=e;g=Y2(a,3)|0;if((g|0)==0){h=0;i=e;return h|0}if((g|0)<=0){h=1;i=e;return h|0}j=0;while(1){k=j;l=2;while(1){m=c[a+(l<<2)>>2]|0;b[f+(l<<1)>>1]=d3(+(((k>>>0)%(m>>>0)|0)>>>0),m)|0;l=l+ -1|0;if(!((l|0)>-1)){break}else{k=(k>>>0)/(m>>>0)|0}}j=j+1|0;if((Zda(f,d)|0)==0){h=0;n=8;break}if((j|0)>=(g|0)){h=1;n=8;break}}if((n|0)==8){i=e;return h|0}return 0}function g3(a){a=a|0;var b=0,c=0;b=i;c=E2(a,2016570400,3,3,188,0,0,0)|0;i=b;return c|0}function h3(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;c=i;i=i+32|0;d=c;c4(0,d,+g[a>>2]*100.0,+g[a+4>>2]*255.0+-128.0,+g[a+8>>2]*255.0+-128.0);g[b>>2]=+h[d>>3]/1.999969482421875;g[b+4>>2]=+h[d+8>>3]/1.999969482421875;g[b+8>>2]=+h[d+16>>3]/1.999969482421875;i=c;return}function i3(a){a=a|0;var b=0,d=0;b=i;d=Q2(a,3,3,713240,0)|0;if((d|0)==0){i=b;return d|0}c[d+8>>2]=840971296;i=b;return d|0}function j3(a){a=a|0;var b=0,d=0;b=i;d=Q2(a,3,3,713312,0)|0;if((d|0)==0){i=b;return d|0}c[d+8>>2]=874525216;i=b;return d|0}function k3(a){a=a|0;var b=0,d=0;b=i;d=Q2(a,3,3,713384,713456)|0;if((d|0)==0){i=b;return d|0}c[d+8>>2]=1681026080;i=b;return d|0}function l3(a){a=a|0;var b=0,d=0;b=i;d=Q2(a,3,3,713480,0)|0;if((d|0)==0){i=b;return d|0}c[d+8>>2]=1681029152;i=b;return d|0}function m3(a){a=a|0;var b=0,d=0;b=i;d=Q2(a,3,3,713552,713624)|0;if((d|0)==0){i=b;return d|0}c[d+8>>2]=1815241760;i=b;return d|0}function n3(a){a=a|0;var b=0,d=0;b=i;d=Q2(a,3,3,713648,0)|0;if((d|0)==0){i=b;return d|0}c[d+8>>2]=2016568352;i=b;return d|0}function o3(a){a=a|0;var b=0,c=0;b=i;c=E2(a,1815246880,3,3,189,0,0,0)|0;i=b;return c|0}function p3(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;c=i;i=i+32|0;d=c;a4(0,d,+g[a>>2]*1.999969482421875,+g[a+4>>2]*1.999969482421875,+g[a+8>>2]*1.999969482421875);g[b>>2]=+h[d>>3]/100.0;g[b+4>>2]=(+h[d+8>>3]+128.0)/255.0;g[b+8>>2]=(+h[d+16>>3]+128.0)/255.0;i=c;return}function q3(a){a=a|0;return a|0}function r3(a){a=a|0;return a|0}function s3(a){a=a|0;return a|0}function t3(a){a=a|0;return a|0}function u3(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;if((a|0)==0){d=0;i=b;return d|0}e=a+24|0;f=E2(c[a>>2]|0,c[a+4>>2]|0,c[a+12>>2]|0,c[a+16>>2]|0,c[a+20>>2]|0,c[e>>2]|0,c[a+28>>2]|0,0)|0;if((f|0)==0){d=0;i=b;return d|0}c[f+8>>2]=c[a+8>>2];g=c[e>>2]|0;if((g|0)==0){c[f+32>>2]=0;d=f;i=b;return d|0}e=Lc[g&255](a)|0;c[f+32>>2]=e;if((e|0)!=0){d=f;i=b;return d|0}O2(f);d=0;i=b;return d|0}function v3(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;if(b>>>0>15|d>>>0>15){f=0;i=e;return f|0}g=Dda(a,40)|0;if((g|0)==0){f=0;i=e;return f|0}c[g+4>>2]=b;c[g+8>>2]=d;c[g+16>>2]=190;c[g+20>>2]=191;c[g+28>>2]=0;c[g+24>>2]=0;c[g+12>>2]=g;c[g+32>>2]=a;y3(g);f=g;i=e;return f|0}function w3(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+1024|0;f=e;f3a(f|0,0,1024)|0;M3(a,f,c[d+4>>2]|0);a=c[d>>2]|0;if((a|0)==0){g=0}else{h=0;j=a;while(1){a=h^1;ld[c[j+20>>2]&255](f+(h<<9)|0,f+(a<<9)|0,j);j=c[j+36>>2]|0;if((j|0)==0){g=a;break}else{h=a}}}N3(f+(g<<9)|0,b,c[d+8>>2]|0);i=e;return}function x3(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+1024|0;f=e;f3a(f|0,0,1024)|0;c3a(f|0,a|0,c[d+4>>2]<<2|0)|0;a=c[d>>2]|0;if((a|0)==0){g=0}else{h=0;j=a;while(1){a=h^1;ld[c[j+20>>2]&255](f+(h<<9)|0,f+(a<<9)|0,j);j=c[j+36>>2]|0;if((j|0)==0){g=a;break}else{h=a}}}c3a(b|0,f+(g<<9)|0,c[d+8>>2]<<2|0)|0;i=e;return}function y3(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=c[a>>2]|0;if((d|0)==0){i=b;return}else{e=0;f=d}while(1){if((f|0)==0){break}g=f;f=c[f+36>>2]|0;e=g}c[a+4>>2]=c[d+12>>2];if((e|0)==0){i=b;return}c[a+8>>2]=c[e+16>>2];i=b;return}function z3(a){a=a|0;var b=0;b=i;if((a|0)==0){_a(713720,713072,1364,713744)}else{i=b;return c[a+4>>2]|0}return 0}function A3(a){a=a|0;var b=0;b=i;if((a|0)==0){_a(713720,713072,1370,713776)}else{i=b;return c[a+8>>2]|0}return 0}function B3(a){a=a|0;var b=0,d=0,e=0;b=i;if((a|0)==0){i=b;return}d=c[a>>2]|0;if((d|0)!=0){e=d;do{d=e;e=c[e+36>>2]|0;O2(d)}while((e|0)!=0)}e=c[a+24>>2]|0;d=a+32|0;if((e|0)!=0){Ic[e&511](c[d>>2]|0,c[a+12>>2]|0)}Gda(c[d>>2]|0,a);i=b;return}function C3(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;if((d|0)==0){_a(713720,713072,1398,713808)}else{ld[c[d+16>>2]&255](a,b,c[d+12>>2]|0);i=e;return}}function D3(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;if((d|0)==0){_a(713720,713072,1406,713832)}else{ld[c[d+20>>2]&255](a,b,d);i=e;return}}function E3(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;if((a|0)==0){d=0;i=b;return d|0}e=a+32|0;f=v3(c[e>>2]|0,c[a+4>>2]|0,c[a+8>>2]|0)|0;if((f|0)==0){d=0;i=b;return d|0}g=c[a>>2]|0;a:do{if((g|0)!=0){h=0;j=1;k=g;while(1){l=h;h=u3(k)|0;if((h|0)==0){break}if((j|0)==0){c[l+36>>2]=h}else{c[f>>2]=h}k=c[k+36>>2]|0;if((k|0)==0){break a}else{j=0}}B3(f);d=0;i=b;return d|0}}while(0);c[f+16>>2]=c[a+16>>2];c[f+20>>2]=c[a+20>>2];g=c[a+28>>2]|0;c[f+28>>2]=g;c[f+24>>2]=c[a+24>>2];if((g|0)!=0){c[f+12>>2]=dd[g&511](c[e>>2]|0,c[a+12>>2]|0)|0}c[f+36>>2]=c[a+36>>2];y3(f);d=f;i=b;return d|0}function F3(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;if((a|0)==0|(d|0)==0){f=0;i=e;return f|0}do{if((b|0)==1){g=c[a>>2]|0;if((g|0)==0){c[a>>2]=d;break}else{h=g}do{j=h+36|0;h=c[j>>2]|0}while((h|0)!=0);c[j>>2]=d;c[d+36>>2]=0}else if((b|0)==0){c[d+36>>2]=c[a>>2];c[a>>2]=d}else{f=0;i=e;return f|0}}while(0);y3(a);f=1;i=e;return f|0}function G3(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;f=c[a>>2]|0;if((f|0)==0){if((d|0)==0){i=e;return}c[d>>2]=0;i=e;return}do{if((b|0)==1){g=0;h=f;while(1){j=c[h+36>>2]|0;if((j|0)==0){break}else{k=h;h=j;g=k}}if((g|0)==0){c[a>>2]=0;l=h;break}else{c[g+36>>2]=0;l=h;break}}else if((b|0)==0){k=f+36|0;c[a>>2]=c[k>>2];c[k>>2]=0;l=f}else{l=0}}while(0);if((d|0)==0){O2(l)}else{c[d>>2]=l}y3(a);i=e;return}function H3(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;if((c[a>>2]|0)==0){e=c[b>>2]|0;if((e|0)==0){c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];f=4}else{g=e;f=6}}else{f=4}if((f|0)==4?(e=c[b>>2]|0,(e|0)!=0):0){g=e;f=6}a:do{if((f|0)==6){while(1){f=0;if((F3(a,1,u3(g)|0)|0)==0){h=0;break}g=c[g+36>>2]|0;if((g|0)==0){break a}else{f=6}}i=d;return h|0}}while(0);y3(a);h=1;i=d;return h|0}function I3(a){a=a|0;return a|0}function J3(a){a=a|0;var b=0,d=0,e=0;b=i;d=0;e=a;while(1){a=c[e>>2]|0;if((a|0)==0){break}else{d=a;e=a+36|0}}i=b;return d|0}function K3(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;c[a+16>>2]=b;c[a+28>>2]=f;c[a+24>>2]=e;c[a+12>>2]=d;return}function L3(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0,I=0,J=0.0,K=0.0,L=0.0,M=0.0,N=0,O=0,P=0,Q=0.0,R=0.0,T=0.0,U=0.0;f=i;i=i+192|0;j=f+168|0;k=f+152|0;l=f+136|0;m=f+120|0;n=f+96|0;o=f+72|0;p=f;q=e+4|0;r=c[q>>2]|0;if(!((r+ -3|0)>>>0<2)){s=0;i=f;return s|0}if((c[e+8>>2]|0)!=3){s=0;i=f;return s|0}if((d|0)==0){g[k+8>>2]=.30000001192092896;g[k+4>>2]=.30000001192092896;g[k>>2]=.30000001192092896}else{c[k+0>>2]=c[d+0>>2];c[k+4>>2]=c[d+4>>2];c[k+8>>2]=c[d+8>>2]}if((r|0)==4){g[k+12>>2]=+g[a+12>>2]}else{g[k+12>>2]=0.0}r=a+4|0;d=j+4|0;t=a+8|0;u=j+8|0;v=k+4|0;w=l+4|0;x=k+8|0;y=l+8|0;z=k+12|0;A=l+12|0;B=m+4|0;C=m+8|0;D=o+8|0;E=o+16|0;F=n+8|0;G=n+16|0;H=1.0e20;I=0;while(1){D3(k,j,e);J=+g[a>>2]- +g[j>>2];K=+g[r>>2]- +g[d>>2];L=+g[t>>2]- +g[u>>2];M=+S(+(J*J+0.0+K*K+L*L));L=H;H=M;if(H>=L){s=1;N=24;break}if((c[q>>2]|0)!=0){O=0;do{g[b+(O<<2)>>2]=+g[k+(O<<2)>>2];O=O+1|0}while(O>>>0<(c[q>>2]|0)>>>0)}if(!(M<=0.0)){P=0}else{s=1;N=24;break}do{g[l>>2]=+g[k>>2];g[w>>2]=+g[v>>2];g[y>>2]=+g[x>>2];g[A>>2]=+g[z>>2];O=l+(P<<2)|0;L=+g[O>>2];if(L<.9989999999525025){Q=L+.0010000000474974513}else{Q=L+-.0010000000474974513}g[O>>2]=Q;D3(l,m,e);R=+g[j>>2];h[p+(P<<3)>>3]=(+g[m>>2]-R)/.0010000000474974513;T=+g[d>>2];h[p+(P<<3)+24>>3]=(+g[B>>2]-T)/.0010000000474974513;U=+g[u>>2];h[p+(P<<3)+48>>3]=(+g[C>>2]-U)/.0010000000474974513;P=P+1|0}while((P|0)!=3);h[o>>3]=R- +g[a>>2];h[D>>3]=T- +g[r>>2];h[E>>3]=U- +g[t>>2];if((Y3(n,p,o)|0)==0){s=0;N=24;break}M=+g[k>>2]- +h[n>>3];g[k>>2]=M;L=+g[v>>2]- +h[F>>3];g[v>>2]=L;K=+g[x>>2]- +h[G>>3];g[x>>2]=K;if(!(M<0.0)){if(M>1.0){g[k>>2]=1.0}}else{g[k>>2]=0.0}if(!(L<0.0)){if(L>1.0){g[v>>2]=1.0}}else{g[v>>2]=0.0}if(!(K<0.0)){if(K>1.0){g[x>>2]=1.0}}else{g[x>>2]=0.0}I=I+1|0;if(!(I>>>0<30)){s=1;N=24;break}}if((N|0)==24){i=f;return s|0}return 0}function M3(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,f=0;d=i;if((c|0)==0){i=d;return}else{f=0}do{g[b+(f<<2)>>2]=+(e[a+(f<<1)>>1]|0)/65535.0;f=f+1|0}while((f|0)!=(c|0));i=d;return}function N3(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0;e=i;if((d|0)==0){i=e;return}else{f=0}do{b[c+(f<<1)>>1]=e3(+g[a+(f<<2)>>2]*65535.0)|0;f=f+1|0}while((f|0)!=(d|0));i=e;return}function O3(){var a=0,b=0,d=0;a=i;b=Dda(0,92)|0;if((b|0)==0){d=0;i=a;return d|0}c[b+88>>2]=0;c[b>>2]=1732584193;c[b+4>>2]=-271733879;c[b+8>>2]=-1732584194;c[b+12>>2]=271733878;c[b+16>>2]=0;c[b+20>>2]=0;d=b;i=a;return d|0}function P3(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;f=a+16|0;g=c[f>>2]|0;h=g+(d<<3)|0;c[f>>2]=h;f=a+20|0;j=c[f>>2]|0;if(h>>>0<g>>>0){h=j+1|0;c[f>>2]=h;k=h}else{k=j}c[f>>2]=k+(d>>>29);k=g>>>3&63;do{if((k|0)==0){l=b;m=d;n=a+24|0}else{g=a+(k+24)|0;f=64-k|0;if(!(f>>>0>d>>>0)){j=a+24|0;d3a(g|0,b|0,f|0)|0;S3(a,j);l=b+f|0;m=d-f|0;n=j;break}d3a(g|0,b|0,d|0)|0;i=e;return}}while(0);if(m>>>0>63){d=m;b=l;while(1){d3a(n|0,b|0,64)|0;S3(a,n);k=b+64|0;g=d+ -64|0;if(g>>>0>63){d=g;b=k}else{o=k;p=g;break}}}else{o=l;p=m}d3a(n|0,o|0,p|0)|0;i=e;return}function Q3(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;f=d+16|0;g=(c[f>>2]|0)>>>3&63;h=d+24|0;j=d+(g+25)|0;a[d+(g+24)>>0]=-128;k=g^63;if(k>>>0<8){f3a(j|0,0,k|0)|0;S3(d,h);g=h+0|0;l=g+56|0;do{a[g>>0]=0;g=g+1|0}while((g|0)<(l|0));m=d;n=h}else{f3a(j|0,0,k+ -8|0)|0;m=d;n=h}c[d+80>>2]=c[f>>2];c[d+84>>2]=c[d+20>>2];S3(m,n);d3a(b|0,d|0,16)|0;Gda(c[d+88>>2]|0,d);i=e;return}function R3(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;if((a|0)==0){i=d;return}e=Cda(0,b)|0;c3a(e|0,a|0,b|0)|0;a=O3()|0;if((a|0)==0){i=d;return}P3(a,e,b);Gda(0,e);Q3(c,a);i=d;return}function S3(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;d=c[a>>2]|0;e=a+4|0;f=c[e>>2]|0;g=a+8|0;h=c[g>>2]|0;i=a+12|0;j=c[i>>2]|0;k=c[b>>2]|0;l=d+ -680876936+k+((j^h)&f^j)|0;m=(l<<7|l>>>25)+f|0;l=c[b+4>>2]|0;n=j+ -389564586+l+(m&(h^f)^h)|0;j=(n<<12|n>>>20)+m|0;n=c[b+8>>2]|0;o=h+606105819+n+(j&(m^f)^f)|0;h=(o<<17|o>>>15)+j|0;o=c[b+12>>2]|0;p=f+ -1044525330+o+(h&(j^m)^m)|0;f=(p<<22|p>>>10)+h|0;p=c[b+16>>2]|0;q=p+ -176418897+m+(f&(h^j)^j)|0;m=(q<<7|q>>>25)+f|0;q=c[b+20>>2]|0;r=q+1200080426+j+(m&(f^h)^h)|0;j=(r<<12|r>>>20)+m|0;r=c[b+24>>2]|0;s=r+ -1473231341+h+(j&(m^f)^f)|0;h=(s<<17|s>>>15)+j|0;s=c[b+28>>2]|0;t=s+ -45705983+f+(h&(j^m)^m)|0;f=(t<<22|t>>>10)+h|0;t=c[b+32>>2]|0;u=t+1770035416+m+(f&(h^j)^j)|0;m=(u<<7|u>>>25)+f|0;u=c[b+36>>2]|0;v=u+ -1958414417+j+(m&(f^h)^h)|0;j=(v<<12|v>>>20)+m|0;v=c[b+40>>2]|0;w=v+ -42063+h+(j&(m^f)^f)|0;h=(w<<17|w>>>15)+j|0;w=c[b+44>>2]|0;x=w+ -1990404162+f+(h&(j^m)^m)|0;f=(x<<22|x>>>10)+h|0;x=c[b+48>>2]|0;y=x+1804603682+m+(f&(h^j)^j)|0;m=(y<<7|y>>>25)+f|0;y=c[b+52>>2]|0;z=y+ -40341101+j+(m&(f^h)^h)|0;j=(z<<12|z>>>20)+m|0;z=c[b+56>>2]|0;A=z+ -1502002290+h+(j&(m^f)^f)|0;h=(A<<17|A>>>15)+j|0;A=c[b+60>>2]|0;b=A+1236535329+f+(h&(j^m)^m)|0;f=(b<<22|b>>>10)+h|0;b=l+ -165796510+m+((f^h)&j^h)|0;m=(b<<5|b>>>27)+f|0;b=r+ -1069501632+j+((m^f)&h^f)|0;j=(b<<9|b>>>23)+m|0;b=w+643717713+h+((j^m)&f^m)|0;h=(b<<14|b>>>18)+j|0;b=k+ -373897302+f+((h^j)&m^j)|0;f=(b<<20|b>>>12)+h|0;b=q+ -701558691+m+((f^h)&j^h)|0;m=(b<<5|b>>>27)+f|0;b=v+38016083+j+((m^f)&h^f)|0;j=(b<<9|b>>>23)+m|0;b=A+ -660478335+h+((j^m)&f^m)|0;h=(b<<14|b>>>18)+j|0;b=p+ -405537848+f+((h^j)&m^j)|0;f=(b<<20|b>>>12)+h|0;b=u+568446438+m+((f^h)&j^h)|0;m=(b<<5|b>>>27)+f|0;b=z+ -1019803690+j+((m^f)&h^f)|0;j=(b<<9|b>>>23)+m|0;b=o+ -187363961+h+((j^m)&f^m)|0;h=(b<<14|b>>>18)+j|0;b=t+1163531501+f+((h^j)&m^j)|0;f=(b<<20|b>>>12)+h|0;b=y+ -1444681467+m+((f^h)&j^h)|0;m=(b<<5|b>>>27)+f|0;b=n+ -51403784+j+((m^f)&h^f)|0;j=(b<<9|b>>>23)+m|0;b=s+1735328473+h+((j^m)&f^m)|0;h=(b<<14|b>>>18)+j|0;b=h^j;B=x+ -1926607734+f+(b&m^j)|0;f=(B<<20|B>>>12)+h|0;B=q+ -378558+m+(b^f)|0;b=(B<<4|B>>>28)+f|0;B=t+ -2022574463+j+(f^h^b)|0;j=(B<<11|B>>>21)+b|0;B=w+1839030562+h+(b^f^j)|0;h=(B<<16|B>>>16)+j|0;B=z+ -35309556+f+(j^b^h)|0;f=(B<<23|B>>>9)+h|0;B=l+ -1530992060+b+(h^j^f)|0;b=(B<<4|B>>>28)+f|0;B=p+1272893353+j+(f^h^b)|0;j=(B<<11|B>>>21)+b|0;B=s+ -155497632+h+(b^f^j)|0;h=(B<<16|B>>>16)+j|0;B=v+ -1094730640+f+(j^b^h)|0;f=(B<<23|B>>>9)+h|0;B=y+681279174+b+(h^j^f)|0;b=(B<<4|B>>>28)+f|0;B=k+ -358537222+j+(f^h^b)|0;j=(B<<11|B>>>21)+b|0;B=o+ -722521979+h+(b^f^j)|0;h=(B<<16|B>>>16)+j|0;B=r+76029189+f+(j^b^h)|0;f=(B<<23|B>>>9)+h|0;B=u+ -640364487+b+(h^j^f)|0;b=(B<<4|B>>>28)+f|0;B=x+ -421815835+j+(f^h^b)|0;j=(B<<11|B>>>21)+b|0;B=A+530742520+h+(b^f^j)|0;h=(B<<16|B>>>16)+j|0;B=n+ -995338651+f+(j^b^h)|0;f=(B<<23|B>>>9)+h|0;B=k+ -198630844+b+((f|~j)^h)|0;b=(B<<6|B>>>26)+f|0;B=s+1126891415+j+((b|~h)^f)|0;j=(B<<10|B>>>22)+b|0;B=z+ -1416354905+h+((j|~f)^b)|0;h=(B<<15|B>>>17)+j|0;B=q+ -57434055+f+((h|~b)^j)|0;f=(B<<21|B>>>11)+h|0;B=x+1700485571+b+((f|~j)^h)|0;b=(B<<6|B>>>26)+f|0;B=o+ -1894986606+j+((b|~h)^f)|0;j=(B<<10|B>>>22)+b|0;B=v+ -1051523+h+((j|~f)^b)|0;h=(B<<15|B>>>17)+j|0;B=l+ -2054922799+f+((h|~b)^j)|0;f=(B<<21|B>>>11)+h|0;B=t+1873313359+b+((f|~j)^h)|0;b=(B<<6|B>>>26)+f|0;B=A+ -30611744+j+((b|~h)^f)|0;j=(B<<10|B>>>22)+b|0;B=r+ -1560198380+h+((j|~f)^b)|0;h=(B<<15|B>>>17)+j|0;B=y+1309151649+f+((h|~b)^j)|0;f=(B<<21|B>>>11)+h|0;B=p+ -145523070+b+((f|~j)^h)|0;b=(B<<6|B>>>26)+f|0;B=w+ -1120210379+j+((b|~h)^f)|0;j=(B<<10|B>>>22)+b|0;B=n+718787259+h+((j|~f)^b)|0;h=(B<<15|B>>>17)+j|0;B=u+ -343485551+f+((h|~b)^j)|0;c[a>>2]=b+d;c[e>>2]=h+(c[e>>2]|0)+(B<<21|B>>>11);c[g>>2]=h+(c[g>>2]|0);c[i>>2]=j+(c[i>>2]|0);return}function T3(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;h[a>>3]=b;h[a+8>>3]=c;h[a+16>>3]=d;return}function U3(a){a=a|0;var b=0,d=0,e=0;b=i;h[a>>3]=1.0;d=a+8|0;e=a+32|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;h[e>>3]=1.0;e=a+40|0;d=a+64|0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+20>>2]=0;h[d>>3]=1.0;i=b;return}function V3(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0;b=i;i=i+80|0;d=b;h[d>>3]=1.0;e=d+8|0;f=d+32|0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+20>>2]=0;h[f>>3]=1.0;f=d+40|0;e=d+64|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;h[e>>3]=1.0;e=0;a:while(1){f=0;do{if(!(+R(+(+h[d+(e*24|0)+(f<<3)>>3]- +h[a+(e*24|0)+(f<<3)>>3]))<15259021896696422.0e-21)){g=0;j=6;break a}f=f+1|0}while((f|0)<3);e=e+1|0;if((e|0)>=3){g=1;j=6;break}}if((j|0)==6){i=b;return g|0}return 0}function W3(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0,g=0.0,i=0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0.0;d=+h[b>>3];e=+h[b+8>>3];f=c+24|0;g=+h[b+16>>3];i=c+48|0;j=c+8|0;k=c+32|0;l=c+56|0;m=d*+h[j>>3]+e*+h[k>>3]+g*+h[l>>3];n=c+16|0;o=c+40|0;p=c+64|0;q=d*+h[n>>3]+e*+h[o>>3]+g*+h[p>>3];h[a>>3]=d*+h[c>>3]+e*+h[f>>3]+g*+h[i>>3];h[a+8>>3]=m;h[a+16>>3]=q;q=+h[b+24>>3];m=+h[b+32>>3];g=+h[b+40>>3];e=q*+h[j>>3]+m*+h[k>>3]+g*+h[l>>3];d=q*+h[n>>3]+m*+h[o>>3]+g*+h[p>>3];h[a+24>>3]=q*+h[c>>3]+m*+h[f>>3]+g*+h[i>>3];h[a+32>>3]=e;h[a+40>>3]=d;d=+h[b+48>>3];e=+h[b+56>>3];g=+h[b+64>>3];m=d*+h[j>>3]+e*+h[k>>3]+g*+h[l>>3];q=d*+h[n>>3]+e*+h[o>>3]+g*+h[p>>3];h[a+48>>3]=d*+h[c>>3]+e*+h[f>>3]+g*+h[i>>3];h[a+56>>3]=m;h[a+64>>3]=q;return}function X3(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0,f=0,g=0.0,j=0,k=0.0,l=0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0.0,s=0.0,t=0,u=0,v=0;c=i;d=a+32|0;e=+h[d>>3];f=a+64|0;g=+h[f>>3];j=a+40|0;k=+h[j>>3];l=a+56|0;m=+h[l>>3];n=e*g-k*m;o=a+24|0;p=+h[o>>3];q=a+48|0;r=+h[q>>3];s=k*r-g*p;g=m*p-e*r;t=a+8|0;u=a+16|0;r=n*+h[a>>3]+ +h[t>>3]*s+g*+h[u>>3];if(+R(+r)<1.0e-4){v=0;i=c;return v|0}h[b>>3]=n/r;h[b+8>>3]=(+h[u>>3]*+h[l>>3]- +h[t>>3]*+h[f>>3])/r;h[b+16>>3]=(+h[t>>3]*+h[j>>3]- +h[u>>3]*+h[d>>3])/r;h[b+24>>3]=s/r;h[b+32>>3]=(+h[a>>3]*+h[f>>3]- +h[u>>3]*+h[q>>3])/r;h[b+40>>3]=(+h[u>>3]*+h[o>>3]- +h[a>>3]*+h[j>>3])/r;h[b+48>>3]=g/r;h[b+56>>3]=(+h[t>>3]*+h[q>>3]- +h[a>>3]*+h[l>>3])/r;h[b+64>>3]=(+h[a>>3]*+h[d>>3]- +h[t>>3]*+h[o>>3])/r;v=1;i=c;return v|0}function Y3(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+144|0;f=e+72|0;g=e;h=f+0|0;j=b+0|0;b=h+72|0;do{c[h>>2]=c[j>>2];h=h+4|0;j=j+4|0}while((h|0)<(b|0));if((X3(f,g)|0)==0){k=0;i=e;return k|0}Z3(a,g,d);k=1;i=e;return k|0}function Z3(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=c+8|0;e=c+16|0;h[a>>3]=+h[b>>3]*+h[c>>3]+ +h[b+8>>3]*+h[d>>3]+ +h[b+16>>3]*+h[e>>3];h[a+8>>3]=+h[b+24>>3]*+h[c>>3]+ +h[b+32>>3]*+h[d>>3]+ +h[b+40>>3]*+h[e>>3];h[a+16>>3]=+h[b+48>>3]*+h[c>>3]+ +h[b+56>>3]*+h[d>>3]+ +h[b+64>>3]*+h[e>>3];return}function _3(a,b){a=a|0;b=b|0;var c=0.0,d=0,e=0.0;c=+h[b>>3];d=b+8|0;e=1.0/(c+ +h[d>>3]+ +h[b+16>>3]);h[a>>3]=c*e;h[a+8>>3]=e*+h[d>>3];h[a+16>>3]=+h[d>>3];return}function $3(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0;c=b+8|0;d=b+16|0;h[a>>3]=+h[b>>3]/+h[c>>3]*+h[d>>3];h[a+8>>3]=+h[d>>3];e=+h[c>>3];h[a+16>>3]=(1.0- +h[b>>3]-e)/e*+h[d>>3];return}function a4(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=+d;e=+e;var f=0,g=0,j=0.0;f=i;g=(a|0)==0?724176:a;j=+b4(c/+h[g>>3]);c=+b4(d/+h[g+8>>3]);d=+b4(e/+h[g+16>>3]);h[b>>3]=c*116.0+-16.0;h[b+8>>3]=(j-c)*500.0;h[b+16>>3]=(c-d)*200.0;i=f;return}function b4(a){a=+a;var b=0,c=0.0;b=i;if(!(a<=.008856451679035631)){c=+T(+a,.3333333333333333);i=b;return+c}else{c=a*7.787037037037037+.13793103448275862;i=b;return+c}return 0.0}function c4(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=+d;e=+e;var f=0,g=0,j=0.0;f=i;g=(a|0)==0?724176:a;j=(c+16.0)/116.0;c=+d4(j+d*.002);h[b>>3]=c*+h[g>>3];c=+d4(j);h[b+8>>3]=c*+h[g+8>>3];c=+d4(j-e*.005);h[b+16>>3]=c*+h[g+16>>3];i=f;return}function d4(a){a=+a;var b=0,c=0.0;b=i;if(!(a<=.20689655172413793)){c=a*a*a;i=b;return+c}else{c=(a+-.13793103448275862)*.12841854934601665;i=b;return+c}return 0.0}function e4(a,b){a=a|0;b=b|0;h[a>>3]=+(e[b>>1]|0)/655.35;h[a+8>>3]=+(e[b+2>>1]|0)/257.0+-128.0;h[a+16>>3]=+(e[b+4>>1]|0)/257.0+-128.0;return}function f4(a,c,d,e){a=a|0;c=+c;d=+d;e=+e;var f=0,g=0.0;f=i;g=c<0.0?0.0:c;c=d<-128.0?-128.0:d;d=e<-128.0?-128.0:e;b[a>>1]=q4(g>100.0?65535.0:g*655.35)|0;b[a+2>>1]=g4(c>127.0?127.0:c)|0;b[a+4>>1]=g4(d>127.0?127.0:d)|0;i=f;return}function g4(a){a=+a;var b=0,c=0;b=i;c=q4((a+128.0)*257.0)|0;i=b;return c|0}function h4(a,c,d,e){a=a|0;c=+c;d=+d;e=+e;var f=0,g=0,h=0.0;f=i;g=!(d<=0.0);h=g?e:0.0;e=g?d:0.0;d=g?c:0.0;c=d>1.999969482421875?1.999969482421875:d;d=e>1.999969482421875?1.999969482421875:e;e=h>1.999969482421875?1.999969482421875:h;b[a>>1]=q4(c<0.0?0.0:c*32768.0)|0;b[a+2>>1]=q4(d<0.0?0.0:d*32768.0)|0;b[a+4>>1]=q4(e<0.0?0.0:e*32768.0)|0;i=f;return}function i4(a,c){a=a|0;c=c|0;var d=0;d=i;h[a>>3]=+j4(b[c>>1]|0);h[a+8>>3]=+j4(b[c+2>>1]|0);h[a+16>>3]=+j4(b[c+4>>1]|0);i=d;return}function j4(a){a=a|0;var b=0,c=0.0;b=i;c=+B4((a&65535)<<1);i=b;return+c}function k4(a,b,c,d,e,f){a=+a;b=+b;c=+c;d=+d;e=+e;f=+f;var g=0.0;g=+R(+(a-d));d=+R(+(b-e));e=+R(+(c-f));f=g*g+d*d+e*e;e=+R(+(+S(+f)));d=f==-w?w:e;return+d}function l4(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=i;do{if((b&16711680|0)==0){d=m4(a)|0;if((b&1024|0)!=0){if((d|0)>4){e=7;break}e=(d|0)==4?23:49;break}f=(d|0)>4;if((b&2048|0)==0){if(f){e=7;break}e=(d|0)==4?17:33;break}else{if(f){e=6;break}e=(d|0)==1?33:17;break}}else{e=b>>>16&255}}while(0);i=c;return e|0}function m4(a){a=a|0;var b=0,c=0;b=i;do{if((a|0)==876825682|(a|0)==1296255028|(a|0)==1129142603|(a|0)==1282766411){c=4}else if((a|0)==1196573017|(a|0)==826494034|(a|0)==1296255025){c=1}else if((a|0)==1111706706|(a|0)==1296255042){c=11}else if((a|0)==960711762|(a|0)==1296255033){c=9}else if((a|0)==1094929490|(a|0)==1296255041){c=10}else if((a|0)==1162038354|(a|0)==1296255045){c=14}else if((a|0)==843271250|(a|0)==1296255026){c=2}else if((a|0)==1145261138|(a|0)==1296255044){c=13}else if((a|0)==927157330|(a|0)==1296255031){c=7}else if((a|0)==860048466|(a|0)==1296255027|(a|0)==1129142560|(a|0)==1212961568|(a|0)==1213421088|(a|0)==1380401696|(a|0)==1501067552|(a|0)==1497588338|(a|0)==1282766368|(a|0)==1281450528|(a|0)==1482250784){c=3}else if((a|0)==893602898|(a|0)==1296255029){c=5}else if((a|0)==943934546|(a|0)==1296255032){c=8}else if((a|0)==910380114|(a|0)==1296255030){c=6}else if((a|0)==1178815570|(a|0)==1296255046){c=15}else if((a|0)==1128483922|(a|0)==1296255043){c=12}else{c=3}}while(0);i=b;return c|0}function n4(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;if((a|0)==1196573017){if((b|0)!=0){c[b>>2]=714120}if((d|0)!=0){c[d>>2]=714112}if((e|0)==0){g=1}else{c[e>>2]=1;g=1}}else if((a|0)==1129142560){if((b|0)!=0){c[b>>2]=714104}if((d|0)!=0){c[d>>2]=714096}if((e|0)==0){g=1}else{c[e>>2]=3;g=1}}else if((a|0)==1380401696){if((b|0)!=0){c[b>>2]=714056}if((d|0)!=0){c[d>>2]=714048}if((e|0)==0){g=1}else{c[e>>2]=3;g=1}}else if((a|0)==1129142603){if((b|0)!=0){c[b>>2]=714072}if((d|0)!=0){c[d>>2]=714064}if((e|0)==0){g=1}else{c[e>>2]=4;g=1}}else if((a|0)==1281450528){if((b|0)!=0){c[b>>2]=714088}if((d|0)!=0){c[d>>2]=714080}if((e|0)==0){g=1}else{c[e>>2]=3;g=1}}else{g=0}i=f;return g|0}function o4(a){a=a|0;var b=0;do{switch(a|0){case 6:{b=1129142603;break};case 14:{b=1501067552;break};case 13:{b=1212961568;break};case 15:{b=1296255025;break};case 11:{b=1282766411;break};case 22:{b=1296255032;break};case 29:{b=1296255046;break};case 12:{b=1213421088;break};case 21:{b=1296255031;break};case 4:case 2:{b=1380401696;break};case 9:{b=1482250784;break};case 5:{b=1129142560;break};case 7:{b=1497588338;break};case 28:{b=1296255045;break};case 25:{b=1296255042;break};case 24:{b=1296255041;break};case 10:case 30:{b=1281450528;break};case 27:{b=1296255044;break};case 18:{b=1296255028;break};case 19:{b=1296255029;break};case 8:{b=1282766368;break};case 23:{b=1296255033;break};case 20:{b=1296255030;break};case 16:{b=1296255026;break};case 17:{b=1296255027;break};case 26:{b=1296255043;break};case 3:case 1:{b=1196573017;break};default:{b=-1}}}while(0);return b|0}function p4(a){a=a|0;var b=0,c=0;b=i;do{if((a|0)==1129142603){c=6}else if((a|0)==1501067552){c=14}else if((a|0)==1212961568){c=13}else if((a|0)==1296255025|(a|0)==826494034){c=15}else if((a|0)==1282766411){c=11}else if((a|0)==943934546|(a|0)==1296255032){c=22}else if((a|0)==1178815570|(a|0)==1296255046){c=29}else if((a|0)==1213421088){c=12}else if((a|0)==927157330|(a|0)==1296255031){c=21}else if((a|0)==1380401696){c=4}else if((a|0)==1196573017){c=3}else if((a|0)==1482250784){c=9}else if((a|0)==1129142560){c=5}else if((a|0)==1497588338){c=7}else if((a|0)==1162038354|(a|0)==1296255045){c=28}else if((a|0)==1111706706|(a|0)==1296255042){c=25}else if((a|0)==1094929490|(a|0)==1296255041){c=24}else if((a|0)==1281450528){c=10}else if((a|0)==1145261138|(a|0)==1296255044){c=27}else if((a|0)==1296255028|(a|0)==876825682){c=18}else if((a|0)==1296255029|(a|0)==893602898){c=19}else if((a|0)==1282766368){c=8}else if((a|0)==960711762|(a|0)==1296255033){c=23}else if((a|0)==1296255030|(a|0)==910380114){c=20}else if((a|0)==1296255026|(a|0)==843271250){c=16}else if((a|0)==1296255027|(a|0)==860048466){c=17}else if((a|0)==1128483922|(a|0)==1296255043){c=26}else{c=-1}}while(0);i=b;return c|0}function q4(a){a=+a;var b=0,d=0.0,e=0;b=i;d=a+.5;if(!(d<=0.0)){if(!(d>=65535.0)){h[k>>3]=d+-32767.0+103079215104.0;e=((c[k>>2]|0)>>>16)+32767&65535}else{e=-1}}else{e=0}i=b;return e|0}function r4(a){a=a|0;var b=0,c=0;b=i;c=i3a(a|0)|0;i=b;return c|0}function s4(a){a=a|0;var b=0,c=0;b=i;c=e3a(a|0)|0;i=b;return c|0}function t4(b,c){b=b|0;c=c|0;var d=0;d=i;if((b|0)==0){_a(714128,714152,87,714208)}else{a[b+7>>0]=a[c>>0]|0;a[b+6>>0]=a[c+1>>0]|0;a[b+5>>0]=a[c+2>>0]|0;a[b+4>>0]=a[c+3>>0]|0;a[b+3>>0]=a[c+4>>0]|0;a[b+2>>0]=a[c+5>>0]|0;a[b+1>>0]=a[c+6>>0]|0;a[b>>0]=a[c+7>>0]|0;i=d;return}}function u4(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;if((b|0)==0){_a(722424,714152,115,714232)}if((id[c[b+272>>2]&511](b,f,1,1)|0)!=1){g=0;i=e;return g|0}if((d|0)==0){g=1;i=e;return g|0}a[d>>0]=a[f>>0]|0;g=1;i=e;return g|0}function v4(a,d){a=a|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;if((a|0)==0){_a(722424,714152,128,714256)}if((id[c[a+272>>2]&511](a,f,2,1)|0)!=1){g=0;i=e;return g|0}if((d|0)==0){g=1;i=e;return g|0}b[d>>1]=i3a(b[f>>1]|0)|0;g=1;i=e;return g|0}function w4(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=i;if((a|0)==0){_a(722424,714152,141,714280)}a:do{if((b|0)==0){e=1}else{f=(c|0)==0;g=0;while(1){if(f){if((v4(a,0)|0)==0){e=0;break a}}else{if((v4(a,c+(g<<1)|0)|0)==0){e=0;break a}}g=g+1|0;if(!(g>>>0<b>>>0)){e=1;break}}}}while(0);i=d;return e|0}function x4(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;if((a|0)==0){_a(722424,714152,160,714304)}if((id[c[a+272>>2]&511](a,e,4,1)|0)!=1){f=0;i=d;return f|0}if((b|0)==0){f=1;i=d;return f|0}c[b>>2]=e3a(c[e>>2]|0)|0;f=1;i=d;return f|0}function y4(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;if((a|0)==0){_a(722424,714152,173,714328)}if((id[c[a+272>>2]&511](a,e,4,1)|0)!=1){f=0;i=d;return f|0}if((b|0)==0){f=1;i=d;return f|0}a=e3a(c[e>>2]|0)|0;c[e>>2]=a;g[b>>2]=(c[k>>2]=a,+g[k>>2]);f=1;i=d;return f|0}function z4(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;if((a|0)==0){_a(722424,714152,191,714352)}if((id[c[a+272>>2]&511](a,e,8,1)|0)!=1){f=0;i=d;return f|0}if((b|0)==0){f=1;i=d;return f|0}t4(b,e);f=1;i=d;return f|0}function A4(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;if((a|0)==0){_a(722424,714152,205,714376)}if((id[c[a+272>>2]&511](a,e,4,1)|0)!=1){f=0;i=d;return f|0}if((b|0)==0){f=1;i=d;return f|0}h[b>>3]=+B4(e3a(c[e>>2]|0)|0);f=1;i=d;return f|0}function B4(a){a=a|0;var b=0;b=(a|0)>-1?a:0-a|0;return+(+(a>>31|1|0)*(+(b>>>16|0)+ +(b&65535|0)*152587890625.0e-16))}function C4(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0;d=i;i=i+16|0;e=d;if((a|0)==0){_a(722424,714152,238,714400)}if((id[c[a+272>>2]&511](a,e,12,1)|0)!=1){f=0;i=d;return f|0}if((b|0)==0){f=1;i=d;return f|0}g=+B4(e3a(c[e>>2]|0)|0);h[b>>3]=g;j=+B4(e3a(c[e+4>>2]|0)|0);a=b+8|0;h[a>>3]=j;k=+B4(e3a(c[e+8>>2]|0)|0);e=b+16|0;h[e>>3]=k;if(g>2.0){l=j;m=k;n=g}else{f=1;i=d;return f|0}while(1){if(!(l>2.0&m>2.0)){f=1;o=8;break}n=n/10.0;h[b>>3]=n;l=l/10.0;h[a>>3]=l;m=m/10.0;h[e>>3]=m;if(!(n>2.0)){f=1;o=8;break}}if((o|0)==8){i=d;return f|0}return 0}function D4(b,d){b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;a[f>>0]=d;if((b|0)==0){_a(722424,714152,255,714424)}else{d=(Qc[c[b+288>>2]&255](b,1,f)|0)==1&1;i=e;return d|0}return 0}function E4(a,d){a=a|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;if((a|0)==0){_a(722424,714152,267,714448)}else{b[f>>1]=i3a(d|0)|0;d=(Qc[c[a+288>>2]&255](a,2,f)|0)==1&1;i=e;return d|0}return 0}function F4(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;if((a|0)==0){_a(722424,714152,280,714472)}if((d|0)==0){_a(714496,714152,281,714472)}if((c|0)==0){f=1;i=e;return f|0}else{g=0}while(1){if((E4(a,b[d+(g<<1)>>1]|0)|0)==0){f=0;h=8;break}g=g+1|0;if(!(g>>>0<c>>>0)){f=1;h=8;break}}if((h|0)==8){i=e;return f|0}return 0}function G4(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;if((a|0)==0){_a(722424,714152,294,714520)}else{c[e>>2]=e3a(b|0)|0;b=(Qc[c[a+288>>2]&255](a,4,e)|0)==1&1;i=d;return b|0}return 0}function H4(a,b){a=a|0;b=+b;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;if((a|0)==0){_a(722424,714152,308,714544)}else{c[e>>2]=e3a((g[k>>2]=b,c[k>>2]|0)|0)|0;f=(Qc[c[a+288>>2]&255](a,4,e)|0)==1&1;i=d;return f|0}return 0}function I4(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;if((a|0)==0){_a(722424,714152,322,714568)}else{t4(e,b);b=(Qc[c[a+288>>2]&255](a,8,e)|0)==1&1;i=d;return b|0}return 0}function J4(a,b){a=a|0;b=+b;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;if((a|0)==0){_a(722424,714152,335,714592)}else{c[e>>2]=e3a(~~+Q(+(b*65536.0+.5))|0)|0;f=(Qc[c[a+288>>2]&255](a,4,e)|0)==1&1;i=d;return f|0}return 0}function K4(a){a=+a;var b=0;b=~~+Q(+(a*65536.0+.5));return b|0}function L4(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;if((a|0)==0){_a(722424,714152,348,714624)}if((b|0)==0){_a(714648,714152,349,714624)}else{c[e>>2]=e3a(~~+Q(+(+h[b>>3]*65536.0+.5))|0)|0;c[e+4>>2]=e3a(~~+Q(+(+h[b+8>>3]*65536.0+.5))|0)|0;c[e+8>>2]=e3a(~~+Q(+(+h[b+16>>3]*65536.0+.5))|0)|0;b=Qc[c[a+288>>2]&255](a,12,e)|0;i=d;return b|0}return 0}function M4(a){a=a|0;return+(+((a&65535)>>>8&255)+ +(a&255)*.00390625)}function N4(a){a=+a;var b=0;b=~~+Q(+(a*65536.0+.5))>>>8&65535;return b|0}function O4(a,d){a=a|0;d=d|0;var e=0;e=i;if((d|0)==0){_a(740160,714152,404,714672)}if((a|0)==0){_a(714704,714152,405,714672)}else{c[d>>2]=(i3a(b[a+10>>1]|0)|0)&65535;c[d+4>>2]=(i3a(b[a+8>>1]|0)|0)&65535;c[d+8>>2]=(i3a(b[a+6>>1]|0)|0)&65535;c[d+12>>2]=(i3a(b[a+4>>1]|0)|0)&65535;c[d+16>>2]=((i3a(b[a+2>>1]|0)|0)&65535)+ -1;c[d+20>>2]=((i3a(b[a>>1]|0)|0)&65535)+ -1900;c[d+24>>2]=-1;c[d+28>>2]=-1;c[d+32>>2]=0;i=e;return}}function P4(a,d){a=a|0;d=d|0;var e=0;e=i;if((a|0)==0){_a(740160,714152,420,714728)}if((d|0)==0){_a(714704,714152,421,714728)}else{b[a+10>>1]=i3a(c[d>>2]&65535|0)|0;b[a+8>>1]=i3a(c[d+4>>2]&65535|0)|0;b[a+6>>1]=i3a(c[d+8>>2]&65535|0)|0;b[a+4>>1]=i3a(c[d+12>>2]&65535|0)|0;b[a+2>>1]=i3a((c[d+16>>2]|0)+1&65535|0)|0;b[a>>1]=i3a((c[d+20>>2]|0)+1900&65535|0)|0;i=e;return}}function Q4(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b;if((a|0)==0){_a(722424,714152,436,714760)}if((id[c[a+272>>2]&511](a,d,8,1)|0)!=1){e=0;i=b;return e|0}e=e3a(c[d>>2]|0)|0;i=b;return e|0}function R4(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;if((a|0)==0){_a(722424,714152,449,714784)}else{c[e>>2]=e3a(b|0)|0;c[e+4>>2]=0;b=Qc[c[a+288>>2]&255](a,8,e)|0;i=d;return b|0}return 0}function S4(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;i=i+16|0;if((a|0)==0){_a(722424,714152,462,714808)}d=Lc[c[a+284>>2]&255](a)|0;e=d+3&-4;f=e-d|0;if((e|0)==(d|0)){g=1;i=b;return g|0}if(f>>>0>4){g=0;i=b;return g|0}g=(id[c[a+272>>2]&511](a,b,f,1)|0)==1&1;i=b;return g|0}function T4(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+16|0;d=b;if((a|0)==0){_a(722424,714152,479,714832)}e=Lc[c[a+284>>2]&255](a)|0;f=e+3&-4;g=f-e|0;if((f|0)==(e|0)){h=1;i=b;return h|0}if(g>>>0>4){h=0;i=b;return h|0}f3a(d|0,0,g|0)|0;h=Qc[c[a+288>>2]&255](a,g,d)|0;i=b;return h|0}function U4(a,b){a=a|0;b=b|0;var d=0;d=i;i=i+16|0;if(b>>>0>14){Jda(a,2,714952,d);i=d;return 0}else{a=c[714864+(b<<2)>>2]|0;i=d;return((a|0)==0?0:a)|0}return 0}function V4(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=W4(b,c[(U4(a,8)|0)>>2]|0,714992)|0;i=d;return e|0}function W4(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;a:do{if((b|0)==0){f=2}else{g=b;while(1){if((c[g>>2]|0)==(a|0)){break}h=c[g+28>>2]|0;if((h|0)==0){f=2;break a}else{g=h}}j=g}}while(0);b:do{if((f|0)==2){if((d|0)==0){j=0}else{b=d;while(1){if((c[b>>2]|0)==(a|0)){break}h=c[b+28>>2]|0;if((h|0)==0){j=0;break b}else{b=h}}j=b}}}while(0);i=e;return j|0}function X4(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=c[(U4(a,9)|0)>>2]|0;a:do{if((e|0)==0){f=715992}else{a=e;while(1){if((c[a>>2]|0)==(b|0)){break}g=c[a+96>>2]|0;if((g|0)==0){f=715992;break a}else{a=g}}h=a+4|0;i=d;return h|0}}while(0);while(1){if((c[f>>2]|0)==(b|0)){break}e=c[f+96>>2]|0;if((e|0)==0){h=0;j=8;break}else{f=e}}if((j|0)==8){i=d;return h|0}h=f+4|0;i=d;return h|0}function Y4(a,b){a=+a;b=b|0;var d=0,e=0;d=i;if(!(a<4.0)){e=1832993312;i=d;return e|0}e=(c[b+36>>2]|0)==0?1835430962:1835430961;i=d;return e|0}function Z4(a,b){a=+a;b=b|0;var d=0,e=0;d=i;if(!(a<4.0)){e=1833058592;i=d;return e|0}e=(c[b+36>>2]|0)==0?1835430962:1835430961;i=d;return e|0}function _4(a,b){a=+a;b=b|0;return 1482250784}function $4(a,b){a=+a;b=b|0;var d=0,e=0,f=0;d=i;if((!(a<4.0)?(c[b+4>>2]|0)==1:0)?(e=c[(c[b+8>>2]|0)+8>>2]|0,(e|0)>=0):0){f=(e|0)>5?1668641398:1885434465}else{f=1668641398}i=d;return f|0}function a5(a,b){a=+a;b=b|0;return(!(a>=4.0)?1952807028:1835824483)|0}function b5(a,b){a=+a;b=b|0;return(!(a>=4.0)?1684370275:1835824483)|0}function c5(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0;g=i;i=i+16|0;j=g+2|0;k=g;c[e>>2]=0;l=a+20|0;a=Dda(c[l>>2]|0,72)|0;if((a|0)==0){m=0;i=g;return m|0}do{if((v4(d,j)|0)!=0){n=b[j>>1]|0;if(n<<16>>16==0&(f|0)==32){if((v4(d,0)|0)==0){break}o=(v4(d,j)|0)!=0;if(!(o&(b[j>>1]|0)==3)){break}}else{if(!(n<<16>>16==3)){break}}if(((((((v4(d,k)|0)!=0?(A4(d,a)|0)!=0:0)?(A4(d,a+8|0)|0)!=0:0)?(h[a+16>>3]=1.0,(A4(d,a+24|0)|0)!=0):0)?(A4(d,a+32|0)|0)!=0:0)?(h[a+40>>3]=1.0,(A4(d,a+48|0)|0)!=0):0)?(A4(d,a+56|0)|0)!=0:0){h[a+64>>3]=1.0;c[e>>2]=1;m=a;i=g;return m|0}}}while(0);Gda(c[l>>2]|0,a);m=0;i=g;return m|0}function d5(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;d=i;if((E4(b,3)|0)==0){e=0;i=d;return e|0}if((E4(b,0)|0)==0){e=0;i=d;return e|0}if(($7(+h[c>>3],+h[c+8>>3],b)|0)==0){e=0;i=d;return e|0}if(($7(+h[c+24>>3],+h[c+32>>3],b)|0)==0){e=0;i=d;return e|0}e=($7(+h[c+48>>3],+h[c+56>>3],b)|0)!=0&1;i=d;return e|0}function e5(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;d=i;e=Hda(c[a+20>>2]|0,b,72)|0;i=d;return e|0}function f5(a,b){a=a|0;b=b|0;var d=0;d=i;Gda(c[a+20>>2]|0,b);i=d;return}function g5(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;g=f;c[e>>2]=0;h=(x4(d,g)|0)==0;if(h|(c[g>>2]|0)>>>0>16){j=0;i=f;return j|0}h=b+20|0;b=Eda(c[h>>2]|0,16,1)|0;if((b|0)==0){j=0;i=f;return j|0}k=b+0|0;l=k+16|0;do{a[k>>0]=255;k=k+1|0}while((k|0)<(l|0));k=id[c[d+272>>2]&511](d,b,1,c[g>>2]|0)|0;if((k|0)==(c[g>>2]|0)){c[e>>2]=1;j=b;i=f;return j|0}else{Gda(c[h>>2]|0,b);j=0;i=f;return j|0}return 0}function h5(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;f=i;b=0;g=0;do{b=((a[e+g>>0]|0)!=-1&1)+b|0;g=g+1|0}while((g|0)!=16);if((G4(d,b)|0)==0){h=0;i=f;return h|0}h=(Qc[c[d+288>>2]&255](d,b,e)|0)!=0&1;i=f;return h|0}function i5(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;d=i;e=Hda(c[a+20>>2]|0,b,16)|0;i=d;return e|0}function j5(a,b){a=a|0;b=b|0;var d=0;d=i;Gda(c[a+20>>2]|0,b);i=d;return}function k5(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;c[d>>2]=0;g=e>>>2;e=a+20|0;a=Eda(c[e>>2]|0,g,8)|0;if((a|0)==0){h=0;i=f;return h|0}a:do{if((g|0)!=0){j=0;while(1){if((A4(b,a+(j<<3)|0)|0)==0){break}j=j+1|0;if(!(j>>>0<g>>>0)){break a}}Gda(c[e>>2]|0,a);h=0;i=f;return h|0}}while(0);c[d>>2]=g;h=a;i=f;return h|0}function l5(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;a=i;a:do{if((d|0)==0){e=1}else{f=0;while(1){if((J4(b,+h[c+(f<<3)>>3])|0)==0){e=0;break a}f=f+1|0;if(!(f>>>0<d>>>0)){e=1;break}}}}while(0);i=a;return e|0}function m5(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=Hda(c[a+20>>2]|0,b,d<<3)|0;i=e;return f|0}function n5(a,b){a=a|0;b=b|0;var d=0;d=i;Gda(c[a+20>>2]|0,b);i=d;return}function o5(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0;f=i;i=i+16|0;g=f;c[d>>2]=0;j=e>>>2;e=a+20|0;a=Eda(c[e>>2]|0,j,8)|0;if((a|0)==0){k=0;i=f;return k|0}a:do{if((j|0)!=0){l=0;while(1){if((x4(b,g)|0)==0){break}h[a+(l<<3)>>3]=+((c[g>>2]|0)>>>0)*152587890625.0e-16;l=l+1|0;if(!(l>>>0<j>>>0)){break a}}Gda(c[e>>2]|0,a);k=0;i=f;return k|0}}while(0);c[d>>2]=j;k=a;i=f;return k|0}function p5(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;a=i;a:do{if((d|0)==0){e=1}else{f=0;while(1){if((G4(b,~~+Q(+(+h[c+(f<<3)>>3]*65536.0+.5))>>>0)|0)==0){e=0;break a}f=f+1|0;if(!(f>>>0<d>>>0)){e=1;break}}}}while(0);i=a;return e|0}function q5(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=Hda(c[a+20>>2]|0,b,d<<3)|0;i=e;return f|0}function r5(a,b){a=a|0;b=b|0;var d=0;d=i;Gda(c[a+20>>2]|0,b);i=d;return}function s5(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;h=b+20|0;b=kea(c[h>>2]|0,1)|0;if((b|0)==0){j=0;i=g;return j|0}c[e>>2]=0;if(!((f|0)==-1)?(k=Cda(c[h>>2]|0,f+1|0)|0,(k|0)!=0):0){if((id[c[d+272>>2]&511](d,k,1,f)|0)==(f|0)?(a[k+f>>0]=0,c[e>>2]=1,(lea(b,756512,756512,k)|0)!=0):0){Gda(c[h>>2]|0,k);j=b;i=g;return j|0}qea(b);Gda(c[h>>2]|0,k);j=0;i=g;return j|0}qea(b);j=0;i=g;return j|0}function t5(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;e=i;f=rea(d,756512,756512,0,0)|0;if((f|0)==0){g=0;i=e;return g|0}h=a+20|0;a=Cda(c[h>>2]|0,f)|0;if((a|0)==0){g=0;i=e;return g|0}rea(d,756512,756512,a,f)|0;d=Qc[c[b+288>>2]&255](b,f,a)|0;Gda(c[h>>2]|0,a);g=d;i=e;return g|0}function u5(a,b,c){a=a|0;b=b|0;c=c|0;c=i;a=pea(b)|0;i=c;return a|0}function v5(a,b){a=a|0;b=b|0;a=i;qea(b);i=a;return}function w5(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;g=i;i=i+32|0;h=g+8|0;j=g+4|0;k=g;l=g+14|0;m=g+12|0;n=g+16|0;c[e>>2]=0;if(f>>>0<4){o=0;i=g;return o|0}if((x4(d,h)|0)==0){o=0;i=g;return o|0}p=f+ -4|0;if(p>>>0<(c[h>>2]|0)>>>0){o=0;i=g;return o|0}f=b+20|0;b=kea(c[f>>2]|0,1)|0;if((b|0)==0){o=0;i=g;return o|0}q=Cda(c[f>>2]|0,(c[h>>2]|0)+1|0)|0;a:do{if((q|0)!=0){r=d+272|0;s=id[c[r>>2]&511](d,q,1,c[h>>2]|0)|0;if((s|0)==(c[h>>2]|0)?(t=p-s|0,a[q+s>>0]=0,(lea(b,756512,756512,q)|0)!=0):0){Gda(c[f>>2]|0,q);b:do{if(((!(t>>>0<8)?(x4(d,j)|0)!=0:0)?(x4(d,k)|0)!=0:0)?(s=t+ -8|0,u=c[k>>2]|0,!(s>>>0<u<<1>>>0)):0){if((u|0)==0){v=0}else{u=0;do{u=u+1|0;if((id[c[r>>2]&511](d,m,2,1)|0)==0){break b}w=c[k>>2]|0}while(u>>>0<w>>>0);v=w<<1}if(((s-v|0)>>>0>69?(v4(d,l)|0)!=0:0)?(u4(d,n)|0)!=0:0){u=0;do{u=u+1|0;if((id[c[r>>2]&511](d,m,1,1)|0)==0){break a}}while(u>>>0<67)}}}while(0);c[e>>2]=1;o=b;i=g;return o|0}Gda(c[f>>2]|0,q)}}while(0);qea(b);o=0;i=g;return o|0}function x5(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;f=i;i=i+80|0;g=f;h=g+0|0;j=h+68|0;do{a[h>>0]=0;h=h+1|0}while((h|0)<(j|0));h=rea(e,756512,756512,0,0)|0;j=h+3&-4;k=j-h|0;l=b+20|0;b=c[l>>2]|0;if((h|0)!=0){m=Eda(b,h,1)|0;if((m|0)==0){n=0;i=f;return n|0}o=Eda(c[l>>2]|0,h,4)|0;if((o|0)==0){p=m;q=o;r=0;s=17}else{rea(e,756512,756512,m,h)|0;tea(e,o,h<<2);t=m;u=o;s=6}}else{o=Hda(b,1305928,1)|0;t=o;u=Hda(c[l>>2]|0,1292088,4)|0;s=6}if((s|0)==6){if(((((((((G4(d,j)|0)!=0?(o=d+288|0,(Qc[c[o>>2]&255](d,h,t)|0)!=0):0)?(Qc[c[o>>2]&255](d,k,g)|0)!=0:0)?(G4(d,0)|0)!=0:0)?(G4(d,j|1)|0)!=0:0)?(q7(d,h,u)|0)!=0:0)?(F4(d,k+1|0,g)|0)!=0:0)?(E4(d,0)|0)!=0:0)?(D4(d,0)|0)!=0:0){v=(Qc[c[o>>2]&255](d,67,g)|0)!=0&1}else{v=0}if((t|0)==0){w=u;x=v}else{p=t;q=u;r=v;s=17}}if((s|0)==17){Gda(c[l>>2]|0,p);w=q;x=r}if((w|0)==0){n=x;i=f;return n|0}Gda(c[l>>2]|0,w);n=x;i=f;return n|0}function y5(a,b,c){a=a|0;b=b|0;c=c|0;c=i;a=pea(b)|0;i=c;return a|0}function z5(a,b){a=a|0;b=b|0;a=i;qea(b);i=a;return}function A5(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;i=i+32|0;g=f+16|0;j=f+8|0;k=f+20|0;l=f;c[e>>2]=0;do{if((x4(d,g)|0)!=0){m=c[g>>2]|0;if((m|0)==0){h[j>>3]=1.0;n=S0(c[a+20>>2]|0,1,j)|0;if((n|0)==0){o=0;break}c[e>>2]=1;o=n;break}else if((m|0)==1){if((v4(d,k)|0)==0){o=0;break}h[l>>3]=+M4(b[k>>1]|0);c[e>>2]=1;o=S0(c[a+20>>2]|0,1,l)|0;break}else{if(m>>>0>32767){o=0;break}n=M0(c[a+20>>2]|0,m,0)|0;if((n|0)==0){o=0;break}if((w4(d,c[g>>2]|0,c[n+24>>2]|0)|0)==0){o=0;break}c[e>>2]=1;o=n;break}}else{o=0}}while(0);i=f;return o|0}function B5(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0;e=i;if((c[d+4>>2]|0)==1?(a=c[d+8>>2]|0,(c[a+8>>2]|0)==1):0){f=+h[a+16>>3];if((G4(b,1)|0)==0){g=0;i=e;return g|0}g=(E4(b,N4(f)|0)|0)!=0&1;i=e;return g|0}a=d+20|0;if((G4(b,c[a>>2]|0)|0)==0){g=0;i=e;return g|0}g=F4(b,c[a>>2]|0,c[d+24>>2]|0)|0;i=e;return g|0}function C5(a,b,c){a=a|0;b=b|0;c=c|0;c=i;a=X0(b)|0;i=c;return a|0}function D5(a,b){a=a|0;b=b|0;a=i;V0(b);i=a;return}function E5(a,d,f,g){a=a|0;d=d|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0;g=i;i=i+96|0;h=g+80|0;j=g;k=g+84|0;if((v4(d,k)|0)==0){l=0;i=g;return l|0}if((v4(d,0)|0)==0){l=0;i=g;return l|0}m=b[k>>1]|0;if((m&65535)>4){n=c[a+20>>2]|0;c[h>>2]=m&65535;Jda(n,8,723704,h);l=0;i=g;return l|0}h=j+0|0;n=h+80|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(n|0));h=c[723680+((m&65535)<<2)>>2]|0;m=0;do{if((A4(d,j+(m<<3)|0)|0)==0){l=0;o=9;break}m=m+1|0}while((m|0)<(h|0));if((o|0)==9){i=g;return l|0}o=S0(c[a+20>>2]|0,(e[k>>1]|0)+1|0,j)|0;c[f>>2]=1;l=o;i=g;return l|0}function F5(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0;e=i;i=i+16|0;f=e;g=d+8|0;j=c[(c[g>>2]|0)+8>>2]|0;a:do{if(!((j|0)<1?1:(c[d+4>>2]|0)>>>0>1)){if((j|0)>5){Jda(c[a+20>>2]|0,8,723648,f);k=0;break}l=c[723560+(j<<2)>>2]|0;if((E4(b,j+65535&65535)|0)!=0?(E4(b,0)|0)!=0:0){if((j|0)==0){k=1}else{m=0;while(1){if((J4(b,+h[(c[g>>2]|0)+(m<<3)+16>>3])|0)==0){k=0;break a}m=m+1|0;if((m|0)>=(l|0)){k=1;break}}}}else{k=0}}else{Jda(c[a+20>>2]|0,8,723584,f);k=0}}while(0);i=e;return k|0}function G5(a,b,c){a=a|0;b=b|0;c=c|0;c=i;a=X0(b)|0;i=c;return a|0}function H5(a,b){a=a|0;b=b|0;a=i;V0(b);i=a;return}function I5(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;e=i;i=i+16|0;f=e;c[d>>2]=0;g=Cda(c[a+20>>2]|0,44)|0;if((g|0)==0){h=0;i=e;return h|0}if((id[c[b+272>>2]&511](b,f,12,1)|0)!=1){h=0;i=e;return h|0}O4(f,g);c[d>>2]=1;h=g;i=e;return h|0}function J5(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=i;i=i+16|0;a=e;P4(a,d);d=(Qc[c[b+288>>2]&255](b,12,a)|0)!=0&1;i=e;return d|0}function K5(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;d=i;e=Hda(c[a+20>>2]|0,b,44)|0;i=d;return e|0}function L5(a,b){a=a|0;b=b|0;var d=0;d=i;Gda(c[a+20>>2]|0,b);i=d;return}function M5(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;h=i;i=i+80|0;j=h+74|0;k=h+73|0;l=h+72|0;m=h;c[g>>2]=0;if((u4(f,j)|0)==0){n=0;i=h;return n|0}if((u4(f,k)|0)==0){n=0;i=h;return n|0}o=(u4(f,l)|0)==0;if(o|(a[l>>0]|0)==1){n=0;i=h;return n|0}if((u4(f,0)|0)==0){n=0;i=h;return n|0}o=a[j>>0]|0;if((o&255)>16){n=0;i=h;return n|0}p=a[k>>0]|0;if((p&255)>16){n=0;i=h;return n|0}q=e+20|0;e=v3(c[q>>2]|0,o&255,p&255)|0;if((e|0)==0){n=0;i=h;return n|0}do{if(((((((((A4(f,m)|0)!=0?(A4(f,m+8|0)|0)!=0:0)?(A4(f,m+16|0)|0)!=0:0)?(A4(f,m+24|0)|0)!=0:0)?(A4(f,m+32|0)|0)!=0:0)?(A4(f,m+40|0)|0)!=0:0)?(A4(f,m+48|0)|0)!=0:0)?(A4(f,m+56|0)|0)!=0:0)?(A4(f,m+64|0)|0)!=0:0){p=a[j>>0]|0;if(p<<24>>24==3){if((V3(m)|0)==0){if((F3(e,0,Q2(c[q>>2]|0,3,3,m,0)|0)|0)==0){break}r=a[j>>0]|0}else{r=3}}else{r=p}if((_7(c[q>>2]|0,f,e,r&255)|0)!=0){p=a[k>>0]|0;o=X7(p&255,d[l>>0]|0,d[j>>0]|0)|0;if((o|0)==0){s=p}else if((o|0)==-1){break}else{p=Eda(c[q>>2]|0,o,2)|0;if((p|0)==0){break}t=Cda(c[q>>2]|0,o)|0;if((t|0)==0){Gda(c[q>>2]|0,p);break}if((id[c[f+272>>2]&511](f,t,o,1)|0)!=1){Gda(c[q>>2]|0,p);Gda(c[q>>2]|0,t);break}if((o|0)!=0){u=p;v=0;while(1){w=d[t+v>>0]|0;b[u>>1]=w<<8|w;v=v+1|0;if((v|0)==(o|0)){break}else{u=u+2|0}}}Gda(c[q>>2]|0,t);if((F3(e,1,Z2(c[q>>2]|0,d[l>>0]|0,d[j>>0]|0,d[k>>0]|0,p)|0)|0)==0){break}Gda(c[q>>2]|0,p);s=a[k>>0]|0}if((_7(c[q>>2]|0,f,e,s&255)|0)!=0){c[g>>2]=1;n=e;i=h;return n|0}}}}while(0);B3(e);n=0;i=h;return n|0}function N5(a,b,d,f){a=a|0;b=b|0;d=d|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;f=i;i=i+16|0;g=f;j=c[d>>2]|0;if((c[j+4>>2]|0)==1835103334){k=c[j+32>>2]|0;l=c[j+36>>2]|0}else{k=0;l=j}do{if((l|0)!=0){j=c[l+4>>2]|0;if((j|0)==1668707188){m=c[l+32>>2]|0;n=c[l+36>>2]|0;if((n|0)==0){o=1;p=0;q=m;r=0;s=0;break}t=c[n+4>>2]|0;u=m;v=n}else{t=j;u=0;v=l}if((t|0)==1668052340){w=c[v+32>>2]|0;x=c[v+36>>2]|0}else{w=0;x=v}do{if((x|0)==0){y=0}else{if((c[x+4>>2]|0)==1668707188){j=c[x+36>>2]|0;if((j|0)==0){y=c[x+32>>2]|0;break}else{z=j}}else{z=x}Jda(c[z>>2]|0,8,723472,g);A=0;i=f;return A|0}}while(0);if((w|0)==0){o=1;p=y;q=u;r=0;s=0}else{o=0;p=y;q=u;r=w;s=c[(c[w+4>>2]|0)+16>>2]|0}}else{o=1;p=0;q=0;r=0;s=0}}while(0);w=d+4|0;if((D4(b,c[w>>2]&255)|0)==0){A=0;i=f;return A|0}u=d+8|0;if((D4(b,c[u>>2]&255)|0)==0){A=0;i=f;return A|0}if((D4(b,s&255)|0)==0){A=0;i=f;return A|0}if((D4(b,0)|0)==0){A=0;i=f;return A|0}if((k|0)==0){if((J4(b,1.0)|0)==0){A=0;i=f;return A|0}if((J4(b,0.0)|0)==0){A=0;i=f;return A|0}if((J4(b,0.0)|0)==0){A=0;i=f;return A|0}if((J4(b,0.0)|0)==0){A=0;i=f;return A|0}if((J4(b,1.0)|0)==0){A=0;i=f;return A|0}if((J4(b,0.0)|0)==0){A=0;i=f;return A|0}if((J4(b,0.0)|0)==0){A=0;i=f;return A|0}if((J4(b,0.0)|0)==0){A=0;i=f;return A|0}if((J4(b,1.0)|0)==0){A=0;i=f;return A|0}}else{if((J4(b,+h[c[k>>2]>>3])|0)==0){A=0;i=f;return A|0}if((J4(b,+h[(c[k>>2]|0)+8>>3])|0)==0){A=0;i=f;return A|0}if((J4(b,+h[(c[k>>2]|0)+16>>3])|0)==0){A=0;i=f;return A|0}if((J4(b,+h[(c[k>>2]|0)+24>>3])|0)==0){A=0;i=f;return A|0}if((J4(b,+h[(c[k>>2]|0)+32>>3])|0)==0){A=0;i=f;return A|0}if((J4(b,+h[(c[k>>2]|0)+40>>3])|0)==0){A=0;i=f;return A|0}if((J4(b,+h[(c[k>>2]|0)+48>>3])|0)==0){A=0;i=f;return A|0}if((J4(b,+h[(c[k>>2]|0)+56>>3])|0)==0){A=0;i=f;return A|0}if((J4(b,+h[(c[k>>2]|0)+64>>3])|0)==0){A=0;i=f;return A|0}}k=a+20|0;if((Z7(c[k>>2]|0,b,c[w>>2]|0,q)|0)==0){A=0;i=f;return A|0}q=c[u>>2]|0;a=X7(q,s,c[w>>2]|0)|0;if((a|0)==0){B=q}else if((a|0)==-1){A=0;i=f;return A|0}else{C=40}do{if((C|0)==40){if(!o){w=0;while(1){if((D4(b,(((e[(c[r>>2]|0)+(w<<1)>>1]|0)*65281|0)+8388608|0)>>>24&255)|0)==0){A=0;C=46;break}w=w+1|0;if(!(w>>>0<a>>>0)){C=44;break}}if((C|0)==44){B=c[u>>2]|0;break}else if((C|0)==46){i=f;return A|0}}else{B=q}}}while(0);A=(Z7(c[k>>2]|0,b,B,p)|0)!=0&1;i=f;return A|0}function O5(a,b,c){a=a|0;b=b|0;c=c|0;c=i;a=E3(b)|0;i=c;return a|0}function P5(a,b){a=a|0;b=b|0;a=i;B3(b);i=a;return}function Q5(f,g,h,j){f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;j=i;i=i+80|0;k=j+78|0;l=j+77|0;m=j+76|0;n=j;o=j+74|0;p=j+72|0;c[h>>2]=0;if((u4(g,k)|0)==0){q=0;i=j;return q|0}if((u4(g,l)|0)==0){q=0;i=j;return q|0}if((u4(g,m)|0)==0){q=0;i=j;return q|0}if((u4(g,0)|0)==0){q=0;i=j;return q|0}r=a[k>>0]|0;if((r&255)>16){q=0;i=j;return q|0}s=a[l>>0]|0;if((s&255)>16){q=0;i=j;return q|0}t=f+20|0;f=v3(c[t>>2]|0,r&255,s&255)|0;if((f|0)==0){q=0;i=j;return q|0}do{if(((((((((A4(g,n)|0)!=0?(A4(g,n+8|0)|0)!=0:0)?(A4(g,n+16|0)|0)!=0:0)?(A4(g,n+24|0)|0)!=0:0)?(A4(g,n+32|0)|0)!=0:0)?(A4(g,n+40|0)|0)!=0:0)?(A4(g,n+48|0)|0)!=0:0)?(A4(g,n+56|0)|0)!=0:0)?(A4(g,n+64|0)|0)!=0:0){if(((a[k>>0]|0)==3?(V3(n)|0)==0:0)?(F3(f,1,Q2(c[t>>2]|0,3,3,n,0)|0)|0)==0:0){break}if((v4(g,o)|0)!=0?(v4(g,p)|0)!=0:0){s=b[o>>1]|0;if(s<<16>>16<0){break}if((b[p>>1]|0)<0){break}if((a[m>>0]|0)==1){break}if((Y7(c[t>>2]|0,g,f,d[k>>0]|0,s&65535)|0)==0){break}s=a[l>>0]|0;r=X7(s&255,d[m>>0]|0,d[k>>0]|0)|0;if((r|0)==-1){break}else if((r|0)==0){u=s}else{s=Eda(c[t>>2]|0,r,2)|0;if((s|0)==0){break}v=(w4(g,r,s)|0)==0;r=c[t>>2]|0;if(v){Gda(r,s);break}v=(F3(f,1,Z2(r,d[m>>0]|0,d[k>>0]|0,d[l>>0]|0,s)|0)|0)==0;Gda(c[t>>2]|0,s);if(v){break}u=a[l>>0]|0}if((Y7(c[t>>2]|0,g,f,u&255,e[p>>1]|0)|0)==0){break}c[h>>2]=1;q=f;i=j;return q|0}}}while(0);B3(f);q=0;i=j;return q|0}function R5(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;e=i;i=i+16|0;a=e;f=c[d>>2]|0;do{if((f|0)!=0){g=c[f+4>>2]|0;if((g|0)==1835103334){j=c[f+32>>2]|0;k=c[f+36>>2]|0;if((k|0)==0){l=j;m=0;n=0;o=0;p=15;break}q=c[k+4>>2]|0;r=j;s=k}else{q=g;r=0;s=f}if((q|0)==1668707188){t=c[s+32>>2]|0;u=c[s+36>>2]|0}else{t=0;u=s}if((u|0)!=0){g=c[u+4>>2]|0;if((g|0)==1668052340){k=c[u+32>>2]|0;j=c[u+36>>2]|0;if((j|0)==0){l=r;m=0;n=t;o=k;p=15;break}v=c[j+4>>2]|0;w=k;x=j}else{v=g;w=0;x=u}if((v|0)==1668707188){y=c[x+32>>2]|0;z=c[x+36>>2]|0}else{y=0;z=x}if((z|0)==0){l=r;m=y;n=t;o=w;p=15}else{Jda(c[z>>2]|0,8,723376,a);A=0}}else{l=r;m=0;n=t;o=0;p=15}}else{l=0;m=0;n=0;o=0;p=15}}while(0);a:do{if((p|0)==15){t=z3(d)|0;r=A3(d)|0;a=(o|0)==0;if(a){B=0}else{B=c[(c[o+4>>2]|0)+16>>2]|0}if((((D4(b,t&255)|0)!=0?(D4(b,r&255)|0)!=0:0)?(D4(b,B&255)|0)!=0:0)?(D4(b,0)|0)!=0:0){if((l|0)==0){if((J4(b,1.0)|0)==0){A=0;break}if((J4(b,0.0)|0)==0){A=0;break}if((J4(b,0.0)|0)==0){A=0;break}if((J4(b,0.0)|0)==0){A=0;break}if((J4(b,1.0)|0)==0){A=0;break}if((J4(b,0.0)|0)==0){A=0;break}if((J4(b,0.0)|0)==0){A=0;break}if((J4(b,0.0)|0)==0){A=0;break}if((J4(b,1.0)|0)==0){A=0;break}}else{if((J4(b,+h[c[l>>2]>>3])|0)==0){A=0;break}if((J4(b,+h[(c[l>>2]|0)+8>>3])|0)==0){A=0;break}if((J4(b,+h[(c[l>>2]|0)+16>>3])|0)==0){A=0;break}if((J4(b,+h[(c[l>>2]|0)+24>>3])|0)==0){A=0;break}if((J4(b,+h[(c[l>>2]|0)+32>>3])|0)==0){A=0;break}if((J4(b,+h[(c[l>>2]|0)+40>>3])|0)==0){A=0;break}if((J4(b,+h[(c[l>>2]|0)+48>>3])|0)==0){A=0;break}if((J4(b,+h[(c[l>>2]|0)+56>>3])|0)==0){A=0;break}if((J4(b,+h[(c[l>>2]|0)+64>>3])|0)==0){A=0;break}}z=(n|0)!=0;if(z){if((E4(b,c[(c[c[n+4>>2]>>2]|0)+20>>2]&65535)|0)==0){A=0;break}}else{if((E4(b,2)|0)==0){A=0;break}}w=(m|0)!=0;if(w){if((E4(b,c[(c[c[m+4>>2]>>2]|0)+20>>2]&65535)|0)==0){A=0;break}}else{if((E4(b,2)|0)==0){A=0;break}}if(z){if((W7(b,n)|0)==0){A=0;break}}else{if((t|0)>0){z=0;do{if((E4(b,0)|0)==0){A=0;break a}z=z+1|0;if((E4(b,-1)|0)==0){A=0;break a}}while((z|0)<(t|0))}}z=X7(r,B,t)|0;if((z|0)==-1){A=0;break}else if(((z|0)!=0?!a:0)?(F4(b,z,c[o>>2]|0)|0)==0:0){A=0;break}if(w){if((W7(b,m)|0)==0){A=0;break}}else{if((r|0)>0){z=0;do{if((E4(b,0)|0)==0){A=0;break a}z=z+1|0;if((E4(b,-1)|0)==0){A=0;break a}}while((z|0)<(r|0))}}A=1}else{A=0}}}while(0);i=e;return A|0}function S5(a,b,c){a=a|0;b=b|0;c=c|0;c=i;a=E3(b)|0;i=c;return a|0}function T5(a,b){a=a|0;b=b|0;a=i;B3(b);i=a;return}function U5(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;i=i+48|0;g=f;h=f+4|0;j=f+14|0;k=f+8|0;if((x4(d,h)|0)==0){l=0;i=f;return l|0}m=c[h>>2]|0;n=c[b+20>>2]|0;if(m>>>0>16){c[g>>2]=m;Jda(n,2,723352,g);l=0;i=f;return l|0}g=uea(n,m,0,1305928,1305928)|0;a:do{if((c[h>>2]|0)!=0){m=d+272|0;n=j+33|0;b=0;while(1){if((id[c[m>>2]&511](d,j,32,1)|0)!=1){break}a[n>>0]=0;if((w4(d,3,k)|0)==0){break}b=b+1|0;if((yea(g,j,k,0)|0)==0){break}if(!(b>>>0<(c[h>>2]|0)>>>0)){break a}}c[e>>2]=0;wea(g);l=0;i=f;return l|0}}while(0);c[e>>2]=1;l=g;i=f;return l|0}function V5(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;f=i;i=i+48|0;b=f+6|0;g=f;h=zea(e)|0;a:do{if((G4(d,h)|0)!=0){j=b+32|0;if((h|0)>0){k=d+288|0;l=0;while(1){if((Aea(e,l,b,g,0)|0)==0){m=0;break a}a[j>>0]=0;if((Qc[c[k>>2]&255](d,32,b)|0)==0){m=0;break a}l=l+1|0;if((F4(d,3,g)|0)==0){m=0;break a}if((l|0)>=(h|0)){m=1;break}}}else{m=1}}else{m=0}}while(0);i=f;return m|0}function W5(a,b,c){a=a|0;b=b|0;c=c|0;c=i;a=xea(b)|0;i=c;return a|0}function X5(a,b){a=a|0;b=b|0;a=i;wea(b);i=a;return}function Y5(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;g=i;i=i+160|0;h=g;j=g+40|0;k=g+36|0;l=g+120|0;m=g+88|0;n=g+80|0;o=g+48|0;c[f>>2]=0;if((x4(e,g+44|0)|0)==0){p=0;i=g;return p|0}if((x4(e,j)|0)==0){p=0;i=g;return p|0}if((x4(e,k)|0)==0){p=0;i=g;return p|0}q=e+272|0;if((id[c[q>>2]&511](e,l,32,1)|0)!=1){p=0;i=g;return p|0}if((id[c[q>>2]&511](e,m,32,1)|0)!=1){p=0;i=g;return p|0}a[m+31>>0]=0;a[l+31>>0]=0;r=d+20|0;d=uea(c[r>>2]|0,c[j>>2]|0,c[k>>2]|0,l,m)|0;if((d|0)==0){m=c[r>>2]|0;c[h>>2]=c[j>>2];Jda(m,2,723280,h);p=0;i=g;return p|0}m=c[k>>2]|0;if(m>>>0>16){l=c[r>>2]|0;c[h>>2]=m;Jda(l,2,723312,h);p=0;i=g;return p|0}a:do{if((c[j>>2]|0)!=0){l=0;while(1){m=o+0|0;r=m+32|0;do{b[m>>1]=0;m=m+2|0}while((m|0)<(r|0));if((id[c[q>>2]&511](e,h,32,1)|0)!=1){p=0;s=19;break}if((w4(e,3,n)|0)==0){break}if((w4(e,c[k>>2]|0,o)|0)==0){break}l=l+1|0;if((yea(d,h,n,o)|0)==0){break}if(!(l>>>0<(c[j>>2]|0)>>>0)){break a}}if((s|0)==19){i=g;return p|0}wea(d);p=0;i=g;return p|0}}while(0);c[f>>2]=1;p=d;i=g;return p|0}function Z5(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=i;i=i+144|0;b=f+104|0;g=f+72|0;h=f+32|0;j=f;k=f+38|0;l=zea(e)|0;a:do{if(((((G4(d,0)|0)!=0?(G4(d,l)|0)!=0:0)?(m=e+8|0,(G4(d,c[m>>2]|0)|0)!=0):0)?(Z2a(b|0,e+12|0,32)|0,Z2a(g|0,e+45|0,32)|0,a[b+31>>0]=0,a[g+31>>0]=0,n=d+288|0,(Qc[c[n>>2]&255](d,32,b)|0)!=0):0)?(Qc[c[n>>2]&255](d,32,g)|0)!=0:0){if((l|0)>0){o=0;while(1){if((Aea(e,o,k,h,j)|0)==0){p=0;break a}if((Qc[c[n>>2]&255](d,32,k)|0)==0){p=0;break a}if((F4(d,3,h)|0)==0){p=0;break a}o=o+1|0;if((F4(d,c[m>>2]|0,j)|0)==0){p=0;break a}if((o|0)>=(l|0)){p=1;break}}}else{p=1}}else{p=0}}while(0);i=f;return p|0}function _5(a,b,c){a=a|0;b=b|0;c=c|0;c=i;a=xea(b)|0;i=c;return a|0}function $5(a,b){a=a|0;b=b|0;a=i;wea(b);i=a;return}function a6(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;e=i;i=i+32|0;f=e+16|0;g=e+12|0;h=e+8|0;j=e+4|0;c[d>>2]=0;if((x4(b,f)|0)==0){k=0;i=e;return k|0}if((x4(b,g)|0)==0){k=0;i=e;return k|0}l=a+20|0;a=c[l>>2]|0;if((c[g>>2]|0)!=12){Jda(a,8,723216,e);k=0;i=e;return k|0}g=kea(a,c[f>>2]|0)|0;if((g|0)==0){k=0;i=e;return k|0}c[g+8>>2]=c[f>>2];a=c[f>>2]|0;m=a*12|0;do{if((a|0)==0){n=0;o=0}else{p=g+12|0;q=m+16|0;r=-16-m|0;s=0;t=0;while(1){if((v4(b,(c[p>>2]|0)+(t*12|0)|0)|0)==0){break}if((v4(b,(c[p>>2]|0)+(t*12|0)+2|0)|0)==0){break}if((x4(b,h)|0)==0){break}if((x4(b,j)|0)==0){break}u=c[j>>2]|0;if(u>>>0<q>>>0){break}v=r+u|0;c[(c[p>>2]|0)+(t*12|0)+8>>2]=c[h>>2]<<1&2147483646;c[(c[p>>2]|0)+(t*12|0)+4>>2]=v<<1&2147483646;u=(c[h>>2]|0)+v|0;s=u>>>0>s>>>0?u:s;t=t+1|0;if(!(t>>>0<(c[f>>2]|0)>>>0)){w=14;break}}if((w|0)==14){t=s<<1&2147483646;if((t|0)==0){n=0;o=0;break}p=Cda(c[l>>2]|0,t)|0;if((p|0)!=0?(v7(b,t>>>2,p)|0)!=0:0){n=p;o=t;break}}qea(g);k=0;i=e;return k|0}}while(0);c[g+24>>2]=n;c[g+16>>2]=o;c[g+20>>2]=o;c[d>>2]=1;k=g;i=e;return k|0}function b6(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=i;if((e|0)==0){if((G4(d,0)|0)==0){g=0;i=f;return g|0}g=(G4(d,12)|0)!=0&1;i=f;return g|0}a=e+8|0;if((G4(d,c[a>>2]|0)|0)==0){g=0;i=f;return g|0}if((G4(d,12)|0)==0){g=0;i=f;return g|0}h=c[a>>2]|0;a:do{if((h|0)>0){j=e+12|0;k=(h*12|0)+16|0;l=0;while(1){m=c[j>>2]|0;n=(c[m+(l*12|0)+8>>2]|0)>>>1&1073741823;o=k+((c[m+(l*12|0)+4>>2]|0)>>>1&1073741823)|0;if((E4(d,b[m+(l*12|0)>>1]|0)|0)==0){g=0;p=14;break}if((E4(d,b[(c[j>>2]|0)+(l*12|0)+2>>1]|0)|0)==0){g=0;p=14;break}if((G4(d,n)|0)==0){g=0;p=14;break}l=l+1|0;if((G4(d,o)|0)==0){g=0;p=14;break}if((l|0)>=(c[a>>2]|0)){break a}}if((p|0)==14){i=f;return g|0}}}while(0);g=(q7(d,(c[e+20>>2]|0)>>>2,c[e+24>>2]|0)|0)!=0&1;i=f;return g|0}function c6(a,b,c){a=a|0;b=b|0;c=c|0;c=i;a=pea(b)|0;i=c;return a|0}function d6(a,b){a=a|0;b=b|0;a=i;qea(b);i=a;return}function e6(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;i=i+16|0;g=f;c[d>>2]=0;if((x4(b,g)|0)==0|e>>>0<4){h=0;i=f;return h|0}j=Gea(c[a+20>>2]|0,c[g>>2]|0)|0;if((j|0)==0){h=0;i=f;return h|0}c[j>>2]=c[g>>2];a:do{if((c[g>>2]|0)!=0){k=j+8|0;l=e+ -4|0;m=0;while(1){n=c[k>>2]|0;if((x4(b,n+(m*48|0)|0)|0)==0|l>>>0<4){break}if((x4(b,n+(m*48|0)+4|0)|0)==0){break}if((l+ -4|0)>>>0<4){break}if((z4(b,n+(m*48|0)+8|0)|0)==0){break}if((l+ -8|0)>>>0<8){break}if((x4(b,n+(m*48|0)+16|0)|0)==0){break}if((l+ -16|0)>>>0<4){break}l=l+ -20|0;if((C7(a,b,n+(m*48|0)+36|0,l)|0)==0){break}if((C7(a,b,n+(m*48|0)+40|0,l)|0)==0){break}m=m+1|0;if(!(m>>>0<(c[g>>2]|0)>>>0)){break a}}Hea(j);h=0;i=f;return h|0}}while(0);c[d>>2]=1;h=j;i=f;return h|0}function f6(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;e=i;a:do{if((G4(b,c[d>>2]|0)|0)!=0){f=d+8|0;if((c[d>>2]|0)==0){g=1}else{h=0;while(1){j=c[f>>2]|0;if((G4(b,c[j+(h*48|0)>>2]|0)|0)==0){g=0;break a}if((G4(b,c[j+(h*48|0)+4>>2]|0)|0)==0){g=0;break a}if((I4(b,j+(h*48|0)+8|0)|0)==0){g=0;break a}if((G4(b,c[j+(h*48|0)+16>>2]|0)|0)==0){g=0;break a}if((z7(a,b,c[j+(h*48|0)+36>>2]|0)|0)==0){g=0;break a}if((z7(a,b,c[j+(h*48|0)+40>>2]|0)|0)==0){g=0;break a}h=h+1|0;if(!(h>>>0<(c[d>>2]|0)>>>0)){g=1;break}}}}else{g=0}}while(0);i=e;return g|0}function g6(a,b,c){a=a|0;b=b|0;c=c|0;c=i;a=Iea(b)|0;i=c;return a|0}function h6(a,b){a=a|0;b=b|0;a=i;Hea(b);i=a;return}function i6(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;e=i;f=Cda(c[a+20>>2]|0,4)|0;if((f|0)!=0?(x4(b,f)|0)!=0:0){c[d>>2]=1;g=f}else{g=0}i=e;return g|0}function j6(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=i;a=G4(b,c[d>>2]|0)|0;i=e;return a|0}function k6(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=Hda(c[a+20>>2]|0,b,d<<2)|0;i=e;return f|0}function l6(a,b){a=a|0;b=b|0;var d=0;d=i;Gda(c[a+20>>2]|0,b);i=d;return}function m6(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;e=i;i=i+64|0;f=e;g=f+0|0;h=g+56|0;do{c[g>>2]=0;g=g+4|0}while((g|0)<(h|0));if(((((x4(b,f)|0)!=0?(C4(b,f+8|0)|0)!=0:0)?(x4(b,f+32|0)|0)!=0:0)?(A4(b,f+40|0)|0)!=0:0)?(x4(b,f+48|0)|0)!=0:0){c[d>>2]=1;j=Hda(c[a+20>>2]|0,f,56)|0}else{j=0}i=e;return j|0}function n6(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;e=i;if((((G4(b,c[d>>2]|0)|0)!=0?(L4(b,d+8|0)|0)!=0:0)?(G4(b,c[d+32>>2]|0)|0)!=0:0)?(J4(b,+h[d+40>>3])|0)!=0:0){f=(G4(b,c[d+48>>2]|0)|0)!=0&1}else{f=0}i=e;return f|0}function o6(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;d=i;e=Hda(c[a+20>>2]|0,b,56)|0;i=d;return e|0}function p6(a,b){a=a|0;b=b|0;var d=0;d=i;Gda(c[a+20>>2]|0,b);i=d;return}function q6(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;c[d>>2]=0;do{if((!(e>>>0<4)?(g=e+ -4|0,(g|0)>=0):0)?(h=a+20|0,j=Cda(c[h>>2]|0,e+7|0)|0,(j|0)!=0):0){c[j>>2]=g;if((x4(b,j+4|0)|0)==0){Gda(c[h>>2]|0,j);k=0;break}if((id[c[b+272>>2]&511](b,j+8|0,1,g)|0)==(g|0)){c[d>>2]=1;k=j;break}else{Gda(c[h>>2]|0,j);k=0;break}}else{k=0}}while(0);i=f;return k|0}function r6(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;e=i;if((G4(b,c[d+4>>2]|0)|0)==0){f=0;i=e;return f|0}f=Qc[c[b+288>>2]&255](b,c[d>>2]|0,d+8|0)|0;i=e;return f|0}function s6(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;d=i;e=Hda(c[a+20>>2]|0,b,(c[b>>2]|0)+11|0)|0;i=d;return e|0}function t6(a,b){a=a|0;b=b|0;var d=0;d=i;Gda(c[a+20>>2]|0,b);i=d;return}function u6(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=i;i=i+32|0;g=f+21|0;h=f+20|0;j=f+16|0;k=f+12|0;l=f+8|0;m=f+4|0;n=f;o=(Lc[c[b+284>>2]&255](b)|0)+ -8|0;if((u4(b,g)|0)==0){p=0;i=f;return p|0}if((u4(b,h)|0)==0){p=0;i=f;return p|0}if((v4(b,0)|0)==0){p=0;i=f;return p|0}if((x4(b,j)|0)==0){p=0;i=f;return p|0}if((x4(b,k)|0)==0){p=0;i=f;return p|0}if((x4(b,l)|0)==0){p=0;i=f;return p|0}if((x4(b,m)|0)==0){p=0;i=f;return p|0}if((x4(b,n)|0)==0){p=0;i=f;return p|0}q=v3(c[a+20>>2]|0,d[g>>0]|0,d[h>>0]|0)|0;if((q|0)==0){p=0;i=f;return p|0}r=c[n>>2]|0;if(!((r|0)!=0?(F3(q,1,T7(a,b,r+o|0,d[g>>0]|0)|0)|0)==0:0)){s=12}do{if((s|0)==12){r=c[m>>2]|0;if((r|0)!=0?(F3(q,1,V7(a,b,r+o|0,d[g>>0]|0,d[h>>0]|0)|0)|0)==0:0){break}r=c[l>>2]|0;if((r|0)!=0?(F3(q,1,T7(a,b,r+o|0,d[h>>0]|0)|0)|0)==0:0){break}r=c[k>>2]|0;if((r|0)!=0?(F3(q,1,U7(a,b,r+o|0)|0)|0)==0:0){break}r=c[j>>2]|0;if((r|0)!=0?(F3(q,1,T7(a,b,r+o|0,d[h>>0]|0)|0)|0)==0:0){break}c[e>>2]=1;p=q;i=f;return p|0}}while(0);B3(q);p=0;i=f;return p|0}function v6(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;e=i;i=i+64|0;f=e;g=e+56|0;h=e+52|0;j=e+48|0;k=e+44|0;l=e+40|0;c[g>>2]=0;c[h>>2]=0;c[j>>2]=0;c[k>>2]=0;c[l>>2]=0;m=b+284|0;n=(Lc[c[m>>2]&255](b)|0)+ -8|0;if(((((c[d>>2]|0)!=0?(c[f>>2]=1668707188,c[f+4>>2]=h,(H2(d,1,f)|0)==0):0)?(c[f>>2]=1668707188,c[f+4>>2]=1835103334,c[f+8>>2]=1668707188,c[f+12>>2]=j,c[f+16>>2]=k,c[f+20>>2]=h,(H2(d,3,f)|0)==0):0)?(c[f>>2]=1668707188,c[f+4>>2]=1668052340,c[f+8>>2]=1668707188,c[f+12>>2]=g,c[f+16>>2]=l,c[f+20>>2]=h,(H2(d,3,f)|0)==0):0)?(c[f>>2]=1668707188,c[f+4>>2]=1668052340,c[f+8>>2]=1668707188,c[f+12>>2]=1835103334,c[f+16>>2]=1668707188,c[f+20>>2]=g,c[f+24>>2]=l,c[f+28>>2]=j,c[f+32>>2]=k,c[f+36>>2]=h,(H2(d,5,f)|0)==0):0){Jda(c[a+20>>2]|0,13,723168,f);o=0;i=e;return o|0}f=z3(d)|0;p=A3(d)|0;if((D4(b,f&255)|0)==0){o=0;i=e;return o|0}if((D4(b,p&255)|0)==0){o=0;i=e;return o|0}if((E4(b,0)|0)==0){o=0;i=e;return o|0}p=Lc[c[m>>2]&255](b)|0;if((G4(b,0)|0)==0){o=0;i=e;return o|0}if((G4(b,0)|0)==0){o=0;i=e;return o|0}if((G4(b,0)|0)==0){o=0;i=e;return o|0}if((G4(b,0)|0)==0){o=0;i=e;return o|0}if((G4(b,0)|0)==0){o=0;i=e;return o|0}if((c[g>>2]|0)!=0){f=(Lc[c[m>>2]&255](b)|0)-n|0;q=c[g>>2]|0;if((Q7(a,b,c[q+16>>2]|0,c[q+32>>2]|0)|0)==0){o=0;i=e;return o|0}else{r=f}}else{r=0}if((c[l>>2]|0)!=0){f=(Lc[c[m>>2]&255](b)|0)-n|0;if((R7(a,b,(c[d+36>>2]|0)!=0?1:2,c[(c[l>>2]|0)+32>>2]|0)|0)==0){o=0;i=e;return o|0}else{s=f}}else{s=0}if((c[j>>2]|0)!=0){f=(Lc[c[m>>2]&255](b)|0)-n|0;l=c[j>>2]|0;if((Q7(a,b,c[l+16>>2]|0,c[l+32>>2]|0)|0)==0){o=0;i=e;return o|0}else{t=f}}else{t=0}if((c[k>>2]|0)!=0){f=(Lc[c[m>>2]&255](b)|0)-n|0;if((S7(b,c[(c[k>>2]|0)+32>>2]|0)|0)==0){o=0;i=e;return o|0}else{u=f}}else{u=0}if((c[h>>2]|0)!=0){f=(Lc[c[m>>2]&255](b)|0)-n|0;n=c[h>>2]|0;if((Q7(a,b,c[n+16>>2]|0,c[n+32>>2]|0)|0)==0){o=0;i=e;return o|0}else{v=f}}else{v=0}f=Lc[c[m>>2]&255](b)|0;m=b+276|0;if((dd[c[m>>2]&511](b,p)|0)==0){o=0;i=e;return o|0}if((G4(b,v)|0)==0){o=0;i=e;return o|0}if((G4(b,u)|0)==0){o=0;i=e;return o|0}if((G4(b,t)|0)==0){o=0;i=e;return o|0}if((G4(b,s)|0)==0){o=0;i=e;return o|0}if((G4(b,r)|0)==0){o=0;i=e;return o|0}o=(dd[c[m>>2]&511](b,f)|0)!=0&1;i=e;return o|0}function w6(a,b,c){a=a|0;b=b|0;c=c|0;c=i;a=E3(b)|0;i=c;return a|0}function x6(a,b){a=a|0;b=b|0;a=i;B3(b);i=a;return}function y6(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=i;i=i+32|0;g=f+21|0;h=f+20|0;j=f+16|0;k=f+12|0;l=f+8|0;m=f+4|0;n=f;o=(Lc[c[b+284>>2]&255](b)|0)+ -8|0;if((u4(b,g)|0)==0){p=0;i=f;return p|0}if((u4(b,h)|0)==0){p=0;i=f;return p|0}if((v4(b,0)|0)==0){p=0;i=f;return p|0}if((x4(b,j)|0)==0){p=0;i=f;return p|0}if((x4(b,k)|0)==0){p=0;i=f;return p|0}if((x4(b,l)|0)==0){p=0;i=f;return p|0}if((x4(b,m)|0)==0){p=0;i=f;return p|0}if((x4(b,n)|0)==0){p=0;i=f;return p|0}q=v3(c[a+20>>2]|0,d[g>>0]|0,d[h>>0]|0)|0;if((q|0)==0){p=0;i=f;return p|0}r=c[j>>2]|0;if(!((r|0)!=0?(F3(q,1,T7(a,b,r+o|0,d[g>>0]|0)|0)|0)==0:0)){s=12}do{if((s|0)==12){r=c[k>>2]|0;if((r|0)!=0?(F3(q,1,U7(a,b,r+o|0)|0)|0)==0:0){break}r=c[l>>2]|0;if((r|0)!=0?(F3(q,1,T7(a,b,r+o|0,d[g>>0]|0)|0)|0)==0:0){break}r=c[m>>2]|0;if((r|0)!=0?(F3(q,1,V7(a,b,r+o|0,d[g>>0]|0,d[h>>0]|0)|0)|0)==0:0){break}r=c[n>>2]|0;if((r|0)!=0?(F3(q,1,T7(a,b,r+o|0,d[h>>0]|0)|0)|0)==0:0){break}c[e>>2]=1;p=q;i=f;return p|0}}while(0);B3(q);p=0;i=f;return p|0}function z6(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;e=i;i=i+64|0;f=e;g=e+56|0;h=e+52|0;j=e+48|0;k=e+44|0;l=e+40|0;c[g>>2]=0;c[h>>2]=0;c[j>>2]=0;c[k>>2]=0;c[l>>2]=0;m=b+284|0;n=(Lc[c[m>>2]&255](b)|0)+ -8|0;c[f>>2]=1668707188;c[f+4>>2]=h;if((((H2(d,1,f)|0)==0?(c[f>>2]=1668707188,c[f+4>>2]=1835103334,c[f+8>>2]=1668707188,c[f+12>>2]=h,c[f+16>>2]=k,c[f+20>>2]=j,(H2(d,3,f)|0)==0):0)?(c[f>>2]=1668707188,c[f+4>>2]=1668052340,c[f+8>>2]=1668707188,c[f+12>>2]=h,c[f+16>>2]=l,c[f+20>>2]=g,(H2(d,3,f)|0)==0):0)?(c[f>>2]=1668707188,c[f+4>>2]=1835103334,c[f+8>>2]=1668707188,c[f+12>>2]=1668052340,c[f+16>>2]=1668707188,c[f+20>>2]=h,c[f+24>>2]=k,c[f+28>>2]=j,c[f+32>>2]=l,c[f+36>>2]=g,(H2(d,5,f)|0)==0):0){Jda(c[a+20>>2]|0,13,723e3,f);o=0;i=e;return o|0}f=z3(d)|0;p=A3(d)|0;if((D4(b,f&255)|0)==0){o=0;i=e;return o|0}if((D4(b,p&255)|0)==0){o=0;i=e;return o|0}if((E4(b,0)|0)==0){o=0;i=e;return o|0}p=Lc[c[m>>2]&255](b)|0;if((G4(b,0)|0)==0){o=0;i=e;return o|0}if((G4(b,0)|0)==0){o=0;i=e;return o|0}if((G4(b,0)|0)==0){o=0;i=e;return o|0}if((G4(b,0)|0)==0){o=0;i=e;return o|0}if((G4(b,0)|0)==0){o=0;i=e;return o|0}if((c[g>>2]|0)!=0){f=(Lc[c[m>>2]&255](b)|0)-n|0;q=c[g>>2]|0;if((Q7(a,b,c[q+16>>2]|0,c[q+32>>2]|0)|0)==0){o=0;i=e;return o|0}else{r=f}}else{r=0}if((c[l>>2]|0)!=0){f=(Lc[c[m>>2]&255](b)|0)-n|0;if((R7(a,b,(c[d+36>>2]|0)!=0?1:2,c[(c[l>>2]|0)+32>>2]|0)|0)==0){o=0;i=e;return o|0}else{s=f}}else{s=0}if((c[j>>2]|0)!=0){f=(Lc[c[m>>2]&255](b)|0)-n|0;l=c[j>>2]|0;if((Q7(a,b,c[l+16>>2]|0,c[l+32>>2]|0)|0)==0){o=0;i=e;return o|0}else{t=f}}else{t=0}if((c[k>>2]|0)!=0){f=(Lc[c[m>>2]&255](b)|0)-n|0;if((S7(b,c[(c[k>>2]|0)+32>>2]|0)|0)==0){o=0;i=e;return o|0}else{u=f}}else{u=0}if((c[h>>2]|0)!=0){f=(Lc[c[m>>2]&255](b)|0)-n|0;n=c[h>>2]|0;if((Q7(a,b,c[n+16>>2]|0,c[n+32>>2]|0)|0)==0){o=0;i=e;return o|0}else{v=f}}else{v=0}f=Lc[c[m>>2]&255](b)|0;m=b+276|0;if((dd[c[m>>2]&511](b,p)|0)==0){o=0;i=e;return o|0}if((G4(b,v)|0)==0){o=0;i=e;return o|0}if((G4(b,u)|0)==0){o=0;i=e;return o|0}if((G4(b,t)|0)==0){o=0;i=e;return o|0}if((G4(b,s)|0)==0){o=0;i=e;return o|0}if((G4(b,r)|0)==0){o=0;i=e;return o|0}o=(dd[c[m>>2]&511](b,f)|0)!=0&1;i=e;return o|0}function A6(a,b,c){a=a|0;b=b|0;c=c|0;c=i;a=E3(b)|0;i=c;return a|0}function B6(a,b){a=a|0;b=b|0;a=i;B3(b);i=a;return}function C6(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;i=i+16|0;h=g+4|0;j=g;k=b+20|0;b=Dda(c[k>>2]|0,12)|0;c[e>>2]=0;if((b|0)==0){l=0;i=g;return l|0}if((x4(d,h)|0)==0|f>>>0<4){l=0;i=g;return l|0}m=f+ -4|0;f=M0(c[k>>2]|0,c[h>>2]|0,0)|0;c[b>>2]=f;if((f|0)==0){l=0;i=g;return l|0}if((w4(d,c[h>>2]|0,c[f+24>>2]|0)|0)==0|m>>>0<4){l=0;i=g;return l|0}f=m-(c[h>>2]<<1)|0;if((x4(d,j)|0)==0|f>>>0<4){l=0;i=g;return l|0}h=f+ -4|0;f=M0(c[k>>2]|0,c[j>>2]|0,0)|0;c[b+4>>2]=f;if((f|0)==0){l=0;i=g;return l|0}if((w4(d,c[j>>2]|0,c[f+24>>2]|0)|0)==0){l=0;i=g;return l|0}f=c[j>>2]<<1;if(h>>>0<f>>>0){l=0;i=g;return l|0}j=h-f|0;if((j|0)==-1){l=0;i=g;return l|0}f=kea(c[k>>2]|0,1)|0;c[b+8>>2]=f;if((f|0)==0){l=0;i=g;return l|0}h=Cda(c[k>>2]|0,j+1|0)|0;if((id[c[d+272>>2]&511](d,h,1,j)|0)!=(j|0)){l=0;i=g;return l|0}a[h+j>>0]=0;lea(f,756512,756512,h)|0;Gda(c[k>>2]|0,h);c[e>>2]=1;l=b;i=g;return l|0}function D6(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;e=i;if((G4(b,c[(c[d>>2]|0)+20>>2]|0)|0)==0){f=0;i=e;return f|0}g=c[d>>2]|0;if((F4(b,c[g+20>>2]|0,c[g+24>>2]|0)|0)==0){f=0;i=e;return f|0}g=d+4|0;if((G4(b,c[(c[g>>2]|0)+20>>2]|0)|0)==0){f=0;i=e;return f|0}h=c[g>>2]|0;if((F4(b,c[h+20>>2]|0,c[h+24>>2]|0)|0)==0){f=0;i=e;return f|0}h=d+8|0;d=rea(c[h>>2]|0,756512,756512,0,0)|0;g=a+20|0;a=Cda(c[g>>2]|0,d)|0;if((rea(c[h>>2]|0,756512,756512,a,d)|0)!=(d|0)){f=0;i=e;return f|0}if((Qc[c[b+288>>2]&255](b,d,a)|0)==0){f=0;i=e;return f|0}Gda(c[g>>2]|0,a);f=1;i=e;return f|0}function E6(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;d=i;e=Dda(c[a+20>>2]|0,12)|0;if((e|0)==0){f=0;i=d;return f|0}c[e+4>>2]=X0(c[b+4>>2]|0)|0;c[e>>2]=X0(c[b>>2]|0)|0;c[e+8>>2]=pea(c[b+8>>2]|0)|0;f=e;i=d;return f|0}function F6(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[b>>2]|0;if((e|0)!=0){V0(e)}e=c[b+4>>2]|0;if((e|0)!=0){V0(e)}e=c[b+8>>2]|0;if((e|0)!=0){qea(e)}Gda(c[a+20>>2]|0,b);i=d;return}function G6(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;i=i+16|0;g=f;c[g>>2]=e;e=kea(c[a+20>>2]|0,5)|0;c[d>>2]=0;if(((((P7(a,b,e,g,722952)|0)!=0?(P7(a,b,e,g,722960)|0)!=0:0)?(P7(a,b,e,g,722968)|0)!=0:0)?(P7(a,b,e,g,722976)|0)!=0:0)?(P7(a,b,e,g,722984)|0)!=0:0){c[d>>2]=1;h=e;i=f;return h|0}qea(e);h=0;i=f;return h|0}function H6(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;d=i;if(((((O7(a,b,c,722952)|0)!=0?(O7(a,b,c,722960)|0)!=0:0)?(O7(a,b,c,722968)|0)!=0:0)?(O7(a,b,c,722976)|0)!=0:0)?(O7(a,b,c,722984)|0)!=0:0){e=1;i=d;return e|0}e=0;i=d;return e|0}function I6(a,b,c){a=a|0;b=b|0;c=c|0;c=i;a=pea(b)|0;i=c;return a|0}function J6(a,b){a=a|0;b=b|0;a=i;qea(b);i=a;return}function K6(a,b,d,f){a=a|0;b=b|0;d=d|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;f=i;i=i+16|0;g=f+6|0;h=f+4|0;j=f;k=(Lc[c[b+284>>2]&255](b)|0)+ -8|0;if((v4(b,g)|0)==0){l=0;i=f;return l|0}if((v4(b,h)|0)==0){l=0;i=f;return l|0}m=v3(c[a+20>>2]|0,e[g>>1]|0,e[h>>1]|0)|0;if((m|0)==0){l=0;i=f;return l|0}if((x4(b,j)|0)==0){l=0;i=f;return l|0}if((A7(a,b,c[j>>2]|0,k,m,78)|0)==0){B3(m);c[d>>2]=0;l=0;i=f;return l|0}else{c[d>>2]=1;l=m;i=f;return l|0}return 0}function L6(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;e=i;i=i+16|0;f=e;g=e+4|0;h=c[d>>2]|0;j=a+20|0;k=U4(c[j>>2]|0,11)|0;l=b+284|0;m=Lc[c[l>>2]&255](b)|0;n=z3(d)|0;o=A3(d)|0;p=I2(c[d>>2]|0)|0;d=Eda(c[j>>2]|0,p,4)|0;if((d|0)==0){q=0;i=e;return q|0}r=Eda(c[j>>2]|0,p,4)|0;if((r|0)==0){Gda(c[j>>2]|0,d);q=0;i=e;return q|0}if((E4(b,n&65535)|0)==0){Gda(c[j>>2]|0,d)}else{a:do{if((E4(b,o&65535)|0)!=0?(G4(b,p&65535)|0)!=0:0){n=Lc[c[l>>2]&255](b)|0;s=(p|0)==0;b:do{if(s){t=Lc[c[l>>2]&255](b)|0}else{u=0;do{if((G4(b,0)|0)==0){break a}u=u+1|0;if((G4(b,0)|0)==0){break a}}while(u>>>0<p>>>0);u=8-m|0;v=Lc[c[l>>2]&255](b)|0;w=h;x=0;while(1){c[d+(x<<2)>>2]=u+v;y=c[w+4>>2]|0;z=W4(y,c[k>>2]|0,722672)|0;if((z|0)==0){break}if((G4(b,y)|0)==0){break a}if((G4(b,0)|0)==0){break a}A=Lc[c[l>>2]&255](b)|0;if((id[c[z+8>>2]&511](a,b,w,1)|0)==0){break a}if((T4(b)|0)==0){break a}c[r+(x<<2)>>2]=(Lc[c[l>>2]&255](b)|0)-A;w=c[w+36>>2]|0;x=x+1|0;A=Lc[c[l>>2]&255](b)|0;if(!(x>>>0<p>>>0)){t=A;break b}else{v=A}}Kda(g,y);v=c[j>>2]|0;c[f>>2]=g;Jda(v,8,722832,f);break a}}while(0);v=b+276|0;if((dd[c[v>>2]&511](b,n)|0)!=0){if(!s){x=0;do{if((G4(b,c[d+(x<<2)>>2]|0)|0)==0){break a}if((G4(b,c[r+(x<<2)>>2]|0)|0)==0){break a}x=x+1|0}while(x>>>0<p>>>0)}if((dd[c[v>>2]&511](b,t)|0)!=0){Gda(c[j>>2]|0,d);Gda(c[j>>2]|0,r);q=1;i=e;return q|0}}}}while(0);Gda(c[j>>2]|0,d)}Gda(c[j>>2]|0,r);q=0;i=e;return q|0}function M6(a,b,c){a=a|0;b=b|0;c=c|0;c=i;a=E3(b)|0;i=c;return a|0}function N6(a,b){a=a|0;b=b|0;a=i;B3(b);i=a;return}function O6(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;e=i;f=a+20|0;a=Dda(c[f>>2]|0,392)|0;if((a|0)==0){g=0;i=e;return g|0}c[d>>2]=0;a:do{if((x4(b,a)|0)!=0?(h=a+4|0,(x4(b,h)|0)!=0):0){j=c[h>>2]|0;if(!(j>>>0>15)){if((j|0)!=0){k=7}}else{c[h>>2]=15;k=7}if((k|0)==7){j=a+8|0;l=0;do{if((A4(b,j+(l*24|0)|0)|0)==0){break a}if((A4(b,j+(l*24|0)+8|0)|0)==0){break a}if((x4(b,j+(l*24|0)+16|0)|0)==0){break a}l=l+1|0}while(l>>>0<(c[h>>2]|0)>>>0)}c[d>>2]=1;g=a;i=e;return g|0}}while(0);Gda(c[f>>2]|0,a);g=0;i=e;return g|0}function P6(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0;e=i;a:do{if((G4(b,c[d>>2]|0)|0)!=0?(a=d+4|0,(G4(b,c[a>>2]|0)|0)!=0):0){f=d+8|0;if((c[a>>2]|0)==0){g=1}else{j=0;while(1){if((J4(b,+h[f+(j*24|0)>>3])|0)==0){g=0;break a}if((J4(b,+h[f+(j*24|0)+8>>3])|0)==0){g=0;break a}if((G4(b,c[f+(j*24|0)+16>>2]|0)|0)==0){g=0;break a}j=j+1|0;if(!(j>>>0<(c[a>>2]|0)>>>0)){g=1;break}}}}else{g=0}}while(0);i=e;return g|0}function Q6(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;d=i;e=Hda(c[a+20>>2]|0,b,392)|0;i=d;return e|0}function R6(a,b){a=a|0;b=b|0;var d=0;d=i;Gda(c[a+20>>2]|0,b);i=d;return}function S6(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;e=i;f=a+20|0;a=Dda(c[f>>2]|0,56)|0;if((a|0)==0){g=0;i=e;return g|0}c[d>>2]=0;if(((C4(b,a)|0)!=0?(C4(b,a+24|0)|0)!=0:0)?(x4(b,a+48|0)|0)!=0:0){c[d>>2]=1;g=a;i=e;return g|0}Gda(c[f>>2]|0,a);g=0;i=e;return g|0}function T6(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;e=i;if((L4(b,d)|0)!=0?(L4(b,d+24|0)|0)!=0:0){f=(G4(b,c[d+48>>2]|0)|0)!=0&1}else{f=0}i=e;return f|0}function U6(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;d=i;e=Hda(c[a+20>>2]|0,b,392)|0;i=d;return e|0}function V6(a,b){a=a|0;b=b|0;var d=0;d=i;Gda(c[a+20>>2]|0,b);i=d;return}function W6(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;e=i;c[d>>2]=0;f=a+20|0;a=Dda(c[f>>2]|0,24)|0;do{if((a|0)!=0){if((C4(b,a)|0)==0){Gda(c[f>>2]|0,a);g=0;break}else{c[d>>2]=1;g=a;break}}else{g=0}}while(0);i=e;return g|0}function X6(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=i;a=L4(b,c)|0;i=d;return a|0}function Y6(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;d=i;e=Hda(c[a+20>>2]|0,b,24)|0;i=d;return e|0}function Z6(a,b){a=a|0;b=b|0;var d=0;d=i;Gda(c[a+20>>2]|0,b);i=d;return}function _6(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;e=i;i=i+16|0;f=e;c[d>>2]=0;g=(Lc[c[b+284>>2]&255](b)|0)+ -8|0;if((x4(b,f)|0)==0){h=0;i=e;return h|0}j=Gea(c[a+20>>2]|0,c[f>>2]|0)|0;if((j|0)==0){h=0;i=e;return h|0}if((A7(a,b,c[f>>2]|0,g,j,79)|0)==0){Hea(j);h=0;i=e;return h|0}else{c[d>>2]=1;h=j;i=e;return h|0}return 0}function $6(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;e=i;f=Lc[c[b+284>>2]&255](b)|0;if((G4(b,c[d>>2]|0)|0)==0){g=0;i=e;return g|0}g=(x7(a,b,c[d>>2]|0,f+ -8|0,d,80)|0)!=0&1;i=e;return g|0}function a7(a,b,c){a=a|0;b=b|0;c=c|0;c=i;a=Iea(b)|0;i=c;return a|0}function b7(a,b){a=a|0;b=b|0;a=i;Hea(b);i=a;return}function c7(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;e=i;i=i+80|0;f=e;g=e+76|0;h=e+72|0;j=e+24|0;k=e+16|0;l=e+12|0;m=e+8|0;n=e+4|0;c[k>>2]=0;c[l>>2]=0;c[m>>2]=0;c[n>>2]=0;c[d>>2]=0;o=(Lc[c[b+284>>2]&255](b)|0)+ -8|0;if((x4(b,g)|0)==0){p=0;i=e;return p|0}if((x4(b,h)|0)==0){p=0;i=e;return p|0}q=c[h>>2]|0;r=a+20|0;s=c[r>>2]|0;if(!((q|0)==16|(q|0)==24|(q|0)==32)){c[f>>2]=q;Jda(s,8,722568,f);p=0;i=e;return p|0}q=Jea(s)|0;if((q|0)==0){p=0;i=e;return p|0}a:do{if((k7(c[r>>2]|0,j,c[g>>2]|0,c[h>>2]|0)|0)!=0){s=c[g>>2]|0;t=c[h>>2]|0;u=j+12|0;v=j+24|0;w=j+36|0;if((s|0)!=0){x=t>>>0>16;y=t>>>0>24;t=0;do{if((w7(b,j,t,o)|0)==0){break a}if((w7(b,u,t,o)|0)==0){break a}if(x){if((w7(b,v,t,o)|0)==0){break a}if(y?(w7(b,w,t,o)|0)==0:0){break a}}t=t+1|0}while(t>>>0<s>>>0);if((c[g>>2]|0)!=0){s=0;do{if((t7(b,j,s,k)|0)==0){break a}if((t7(b,u,s,l)|0)==0){break a}if((c[h>>2]|0)>>>0>16){if((u7(a,b,v,s,m)|0)==0){break a}if((c[h>>2]|0)>>>0>24?(u7(a,b,w,s,n)|0)==0:0){break a}}t=c[k>>2]|0;y=(t|0)==0;if(!y?(x=c[l>>2]|0,(x|0)!=0):0){z=Lea(q,t,x,c[m>>2]|0,c[n>>2]|0)|0}else{Jda(c[r>>2]|0,12,722616,f);z=0}if(!y){Gda(c[r>>2]|0,t)}t=c[l>>2]|0;if((t|0)!=0){Gda(c[r>>2]|0,t)}t=c[m>>2]|0;if((t|0)!=0){qea(t)}t=c[n>>2]|0;if((t|0)!=0){qea(t)}s=s+1|0;if((z|0)==0){break a}}while(s>>>0<(c[g>>2]|0)>>>0)}}o7(j);c[d>>2]=1;p=q;i=e;return p|0}}while(0);o7(j);Kea(q);p=0;i=e;return p|0}function d7(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=i;i=i+48|0;f=e;if((d|0)==0){g=0;i=e;return g|0}h=b+284|0;j=(Lc[c[h>>2]&255](b)|0)+ -8|0;k=Oea(d)|0;if((k|0)==0){l=16;m=1;n=0}else{o=0;p=0;q=0;r=k;do{o=(c[r+4>>2]|0)==0?o:1;p=(c[r+8>>2]|0)==0?p:1;q=q+1|0;r=Pea(r)|0}while((r|0)!=0);l=(o|0)==0?16:24;m=(p|0)==0;n=q}q=m?l:l+8|0;if((G4(b,n)|0)==0){g=0;i=e;return g|0}if((G4(b,q)|0)==0){g=0;i=e;return g|0}l=Lc[c[h>>2]&255](b)|0;a:do{if((k7(c[a+20>>2]|0,f,n,q)|0)!=0?(l7(b,f,n,q)|0)!=0:0){if((n|0)!=0){m=f+12|0;p=f+36|0;o=f+24|0;r=0;k=Oea(d)|0;do{if((m7(b,f,r,c[k+12>>2]|0,j)|0)==0){break a}if((m7(b,m,r,c[k+16>>2]|0,j)|0)==0){break a}s=c[k+4>>2]|0;if((s|0)!=0?(n7(a,b,o,r,s,j)|0)==0:0){break a}s=c[k+8>>2]|0;if((s|0)!=0?(n7(a,b,p,r,s,j)|0)==0:0){break a}k=Pea(k)|0;r=r+1|0}while(r>>>0<n>>>0)}r=Lc[c[h>>2]&255](b)|0;k=b+276|0;if(((dd[c[k>>2]&511](b,l)|0)!=0?(l7(b,f,n,q)|0)!=0:0)?(dd[c[k>>2]&511](b,r)|0)!=0:0){o7(f);g=1;i=e;return g|0}}}while(0);o7(f);g=0;i=e;return g|0}function e7(a,b,c){a=a|0;b=b|0;c=c|0;c=i;a=Nea(b)|0;i=c;return a|0}function f7(a,b){a=a|0;b=b|0;a=i;Kea(b);i=a;return}function g7(a,f,g,j){a=a|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0,G=0,H=0;k=i;i=i+176|0;l=k+80|0;m=k+152|0;n=k+160|0;o=k+158|0;p=k+156|0;q=k+162|0;r=k;c[g>>2]=0;if((x4(f,m)|0)==0){s=0;i=k;return s|0}t=a+20|0;a=Eda(c[t>>2]|0,3,4)|0;if((a|0)==0){s=0;i=k;return s|0}u=c[m>>2]|0;a:do{if((u|0)==1){m=r+8|0;v=r+16|0;w=r+40|0;x=r+48|0;y=0;while(1){z=l+(y*24|0)|0;if((A4(f,z)|0)==0){A=29;break a}B=l+(y*24|0)+8|0;if((A4(f,B)|0)==0){A=29;break a}C=l+(y*24|0)+16|0;if((A4(f,C)|0)==0){A=29;break a}D=+h[z>>3];h[r>>3]=D;E=+h[B>>3];h[m>>3]=+T(+(+h[C>>3]-E),+(1.0/D));c[v+0>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;c[v+16>>2]=0;c[v+20>>2]=0;h[w>>3]=E;h[x>>3]=0.0;C=S0(c[t>>2]|0,5,r)|0;c[a+(y<<2)>>2]=C;y=y+1|0;if((C|0)==0){A=29;break a}if(!(y>>>0<3)){A=28;break}}}else if((u|0)==0){if((v4(f,n)|0)!=0){y=b[n>>1]|0;if(!(y<<16>>16==3)){x=c[t>>2]|0;c[l>>2]=y&65535;Jda(x,8,722296,l);A=29;break}if((v4(f,o)|0)!=0?(v4(f,p)|0)!=0:0){x=b[o>>1]|0;if(x<<16>>16==256){if((b[p>>1]|0)==1&(j|0)==1576){b[p>>1]=2;F=256;G=0}else{F=256;G=0}}else{F=x;G=0}while(1){x=M0(c[t>>2]|0,F&65535,0)|0;y=a+(G<<2)|0;c[y>>2]=x;if((x|0)==0){A=29;break a}H=e[p>>1]|0;if((H|0)==1){if((b[o>>1]|0)!=0){w=0;do{if((u4(f,q)|0)==0){A=29;break a}v=d[q>>0]|0;b[(c[(c[y>>2]|0)+24>>2]|0)+(w<<1)>>1]=v<<8|v;w=w+1|0}while(w>>>0<(e[o>>1]|0)>>>0)}}else if((H|0)==2){if((w4(f,e[o>>1]|0,c[x+24>>2]|0)|0)==0){A=29;break a}}else{break}w=G+1|0;if(!(w>>>0<3)){A=28;break a}F=b[o>>1]|0;G=w}w=c[t>>2]|0;c[l>>2]=H<<3;Jda(w,8,722344,l);A=29}else{A=29}}else{A=29}}else{w=c[t>>2]|0;c[l>>2]=u;Jda(w,8,722384,l);A=29}}while(0);if((A|0)==28){c[g>>2]=1;s=a;i=k;return s|0}else if((A|0)==29){W0(a);Gda(c[t>>2]|0,a);s=0;i=k;return s|0}return 0}function h7(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0.0,l=0.0,m=0.0,n=0,o=0,p=0;e=i;if(((d1(c[d>>2]|0)|0)==5?(d1(c[d+4>>2]|0)|0)==5:0)?(d1(c[d+8>>2]|0)|0)==5:0){if((G4(b,1)|0)==0){f=0;i=e;return f|0}else{g=0}while(1){a=c[(c[d+(g<<2)>>2]|0)+8>>2]|0;j=+h[a+16>>3];l=+h[a+56>>3];m=l+ +T(+(+h[a+24>>3]),+j);if((J4(b,j)|0)==0){f=0;n=20;break}if((J4(b,l)|0)==0){f=0;n=20;break}g=g+1|0;if((J4(b,m)|0)==0){f=0;n=20;break}if(!(g>>>0<3)){f=1;n=20;break}}if((n|0)==20){i=e;return f|0}}if((G4(b,0)|0)==0){f=0;i=e;return f|0}if((E4(b,3)|0)==0){f=0;i=e;return f|0}if((E4(b,256)|0)==0){f=0;i=e;return f|0}if((E4(b,2)|0)==0){f=0;i=e;return f|0}else{o=0}a:while(1){g=d+(o<<2)|0;a=0;do{m=+_0(c[g>>2]|0,+(a>>>0)/255.0)*65535.0+.5;if(!(m<=0.0)){if(!(m>=65535.0)){h[k>>3]=m+-32767.0+103079215104.0;p=((c[k>>2]|0)>>>16)+32767&65535}else{p=-1}}else{p=0}a=a+1|0;if((E4(b,p)|0)==0){f=0;n=20;break a}}while(a>>>0<256);o=o+1|0;if(!(o>>>0<3)){f=1;n=20;break}}if((n|0)==20){i=e;return f|0}return 0}function i7(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;d=i;e=Eda(c[a+20>>2]|0,3,4)|0;if((e|0)==0){f=0;i=d;return f|0}c[e>>2]=X0(c[b>>2]|0)|0;c[e+4>>2]=X0(c[b+4>>2]|0)|0;c[e+8>>2]=X0(c[b+8>>2]|0)|0;f=e;i=d;return f|0}function j7(a,b){a=a|0;b=b|0;var d=0;d=i;W0(b);Gda(c[a+20>>2]|0,b);i=d;return}function k7(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;g=b+0|0;h=g+48|0;do{c[g>>2]=0;g=g+4|0}while((g|0)<(h|0));if((s7(a,b,d)|0)!=0?(s7(a,b+12|0,d)|0)!=0:0){if(!(e>>>0>16)){j=1;i=f;return j|0}if((s7(a,b+24|0,d)|0)!=0){if(!(e>>>0>24)){j=1;i=f;return j|0}if((s7(a,b+36|0,d)|0)!=0){j=1;i=f;return j|0}}}o7(b);j=0;i=f;return j|0}function l7(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;f=b+12|0;g=b+24|0;h=b+36|0;a:do{if((c|0)==0){j=1}else{k=d>>>0>16;l=d>>>0>24;m=0;while(1){if((r7(a,b,m)|0)==0){j=0;break a}if((r7(a,f,m)|0)==0){j=0;break a}if(k){if((r7(a,g,m)|0)==0){j=0;break a}if(l?(r7(a,h,m)|0)==0:0){j=0;break a}}m=m+1|0;if(!(m>>>0<c>>>0)){j=1;break}}}}while(0);i=e;return j|0}function m7(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;h=a+284|0;j=Lc[c[h>>2]&255](a)|0;k=b+4|0;c[(c[k>>2]|0)+(d<<2)>>2]=j-f;if((e|0)==0){c[(c[b+8>>2]|0)+(d<<2)>>2]=0;c[(c[k>>2]|0)+(d<<2)>>2]=0;l=1;i=g;return l|0}else{m=e}while(1){if((c[m>>2]|0)==0){break}else{m=m+4|0}}if((q7(a,m-e>>2,e)|0)==0){l=0;i=g;return l|0}e=(Lc[c[h>>2]&255](a)|0)-j|0;c[(c[b+8>>2]|0)+(d<<2)>>2]=e;l=1;i=g;return l|0}function n7(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0;h=i;if((f|0)==0){c[(c[d+8>>2]|0)+(e<<2)>>2]=0;c[(c[d+4>>2]|0)+(e<<2)>>2]=0;j=1;i=h;return j|0}k=b+284|0;l=Lc[c[k>>2]&255](b)|0;c[(c[d+4>>2]|0)+(e<<2)>>2]=l-g;if((b6(a,b,f,1)|0)==0){j=0;i=h;return j|0}f=(Lc[c[k>>2]&255](b)|0)-l|0;c[(c[d+8>>2]|0)+(e<<2)>>2]=f;j=1;i=h;return j|0}function o7(a){a=a|0;var b=0;b=i;if((c[a+4>>2]|0)!=0){p7(a)}if((c[a+16>>2]|0)!=0){p7(a+12|0)}if((c[a+28>>2]|0)!=0){p7(a+24|0)}if((c[a+40>>2]|0)==0){i=b;return}p7(a+36|0);i=b;return}function p7(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+4|0;e=c[d>>2]|0;if((e|0)!=0){Gda(c[a>>2]|0,e)}e=a+8|0;f=c[e>>2]|0;if((f|0)!=0){Gda(c[a>>2]|0,f)}c[e>>2]=0;c[d>>2]=0;i=b;return}function q7(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;if((a|0)==0){_a(722424,722448,122,722504)}f=(b|0)==0;if(!((d|0)!=0|f)){_a(722528,722448,123,722504)}if(f){g=1;i=e;return g|0}else{h=0}while(1){if((E4(a,c[d+(h<<2)>>2]&65535)|0)==0){g=0;j=8;break}h=h+1|0;if(!(h>>>0<b>>>0)){g=1;j=8;break}}if((j|0)==8){i=e;return g|0}return 0}function r7(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;if((G4(a,c[(c[b+4>>2]|0)+(d<<2)>>2]|0)|0)==0){f=0;i=e;return f|0}f=(G4(a,c[(c[b+8>>2]|0)+(d<<2)>>2]|0)|0)!=0&1;i=e;return f|0}function s7(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=Eda(a,d,4)|0;g=b+4|0;c[g>>2]=f;if((f|0)==0){h=0;i=e;return h|0}f=Eda(a,d,4)|0;c[b+8>>2]=f;if((f|0)==0){Gda(a,c[g>>2]|0);h=0;i=e;return h|0}else{c[b>>2]=a;h=1;i=e;return h|0}return 0}function t7(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;g=c[(c[b+4>>2]|0)+(d<<2)>>2]|0;if((g|0)==0){c[e>>2]=0;h=1;i=f;return h|0}if((dd[c[a+276>>2]&511](a,g)|0)==0){h=0;i=f;return h|0}g=(c[(c[b+8>>2]|0)+(d<<2)>>2]|0)>>>1;d=Dda(c[b>>2]|0,(g<<2)+4|0)|0;c[e>>2]=d;if((d|0)==0){h=0;i=f;return h|0}if((v7(a,g,d)|0)==0){Gda(c[b>>2]|0,c[e>>2]|0);h=0;i=f;return h|0}else{c[(c[e>>2]|0)+(g<<2)>>2]=0;h=1;i=f;return h|0}return 0}function u7(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0;g=i;i=i+16|0;h=g;c[h>>2]=0;j=c[(c[d+4>>2]|0)+(e<<2)>>2]|0;if((j|0)!=0?(k=d+8|0,(c[(c[k>>2]|0)+(e<<2)>>2]|0)!=0):0){if((dd[c[b+276>>2]&511](b,j)|0)==0){l=0;i=g;return l|0}j=a6(a,b,h,c[(c[k>>2]|0)+(e<<2)>>2]|0)|0;c[f>>2]=j;l=(j|0)!=0&1;i=g;return l|0}c[f>>2]=0;l=1;i=g;return l|0}function v7(a,b,d){a=a|0;b=b|0;d=d|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+16|0;g=f;if((a|0)==0){_a(722424,722448,139,722648)}a:do{if((b|0)==0){h=1}else{j=(d|0)==0;k=0;while(1){if(j){if((v4(a,0)|0)==0){h=0;break a}}else{if((v4(a,g)|0)==0){h=0;break a}c[d+(k<<2)>>2]=e[g>>1]|0}k=k+1|0;if(!(k>>>0<b>>>0)){h=1;break}}}}while(0);i=f;return h|0}function w7(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;g=b+4|0;if((x4(a,(c[g>>2]|0)+(d<<2)|0)|0)!=0?(x4(a,(c[b+8>>2]|0)+(d<<2)|0)|0)!=0:0){b=(c[g>>2]|0)+(d<<2)|0;d=c[b>>2]|0;if((d|0)==0){h=1}else{c[b>>2]=d+e;h=1}}else{h=0}i=f;return h|0}function x7(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;h=i;j=b+4|0;k=Eda(c[j>>2]|0,d,4)|0;if((k|0)==0){l=0;i=h;return l|0}m=Eda(c[j>>2]|0,d,4)|0;if((m|0)==0){Gda(c[j>>2]|0,k);l=0;i=h;return l|0}n=b+284|0;o=Lc[c[n>>2]&255](b)|0;p=(d|0)==0;a:do{if(p){q=Lc[c[n>>2]&255](b)|0;r=12}else{s=0;do{if((G4(b,0)|0)==0){break a}s=s+1|0;if((G4(b,0)|0)==0){break a}}while(s>>>0<d>>>0);s=Lc[c[n>>2]&255](b)|0;t=0;while(1){c[k+(t<<2)>>2]=s-e;if((ed[g&127](a,b,f,t,0)|0)==0){break a}c[m+(t<<2)>>2]=(Lc[c[n>>2]&255](b)|0)-s;t=t+1|0;u=Lc[c[n>>2]&255](b)|0;if(!(t>>>0<d>>>0)){q=u;r=12;break}else{s=u}}}}while(0);b:do{if((r|0)==12?(n=b+276|0,(dd[c[n>>2]&511](b,o)|0)!=0):0){if(!p){f=0;do{if((G4(b,c[k+(f<<2)>>2]|0)|0)==0){break b}if((G4(b,c[m+(f<<2)>>2]|0)|0)==0){break b}f=f+1|0}while(f>>>0<d>>>0)}if((dd[c[n>>2]&511](b,q)|0)!=0){Gda(c[j>>2]|0,k);Gda(c[j>>2]|0,m);l=1;i=h;return l|0}}}while(0);Gda(c[j>>2]|0,k);Gda(c[j>>2]|0,m);l=0;i=h;return l|0}function y7(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;f=i;g=d+8|0;if((Qc[c[b+288>>2]&255](b,16,(c[g>>2]|0)+(e*48|0)+20|0)|0)==0){h=0;i=f;return h|0}h=(z7(a,b,c[(c[g>>2]|0)+(e*48|0)+44>>2]|0)|0)!=0&1;i=f;return h|0}function z7(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;if((c[a+24>>2]|0)>>>0<67108864){if((R4(b,1684370275)|0)==0){f=0}else{f=x5(a,b,d,1)|0}}else{if((R4(b,1835824483)|0)==0){f=0}else{f=b6(a,b,d,1)|0}}i=e;return f|0}function A7(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;h=i;j=b+4|0;k=Eda(c[j>>2]|0,d,4)|0;if((k|0)==0){l=0;i=h;return l|0}m=Eda(c[j>>2]|0,d,4)|0;if((m|0)==0){Gda(c[j>>2]|0,k);l=0;i=h;return l|0}a:do{if((d|0)!=0){n=0;while(1){o=k+(n<<2)|0;if((x4(b,o)|0)==0){break}if((x4(b,m+(n<<2)|0)|0)==0){break}c[o>>2]=(c[o>>2]|0)+e;n=n+1|0;if(!(n>>>0<d>>>0)){p=5;break}}b:do{if((p|0)==5){n=b+276|0;o=0;while(1){if((dd[c[n>>2]&511](b,c[k+(o<<2)>>2]|0)|0)==0){break b}if((ed[g&127](a,b,f,o,c[m+(o<<2)>>2]|0)|0)==0){break b}o=o+1|0;if(!(o>>>0<d>>>0)){break a}}}}while(0);Gda(c[j>>2]|0,k);Gda(c[j>>2]|0,m);l=0;i=h;return l|0}}while(0);Gda(c[j>>2]|0,k);Gda(c[j>>2]|0,m);l=1;i=h;return l|0}function B7(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;h=c[d+8>>2]|0;if((id[c[b+272>>2]&511](b,h+(e*48|0)+20|0,16,1)|0)!=1){j=0;i=g;return j|0}j=(C7(a,b,h+(e*48|0)+44|0,f)|0)!=0&1;i=g;return j|0}function C7(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+16|0;g=f;h=Q4(b)|0;if((h|0)==1835824483){j=c[d>>2]|0;if((j|0)!=0){qea(j)}j=a6(a,b,g,e)|0;c[d>>2]=j;k=(j|0)!=0&1;i=f;return k|0}else if((h|0)==1684370275){j=c[d>>2]|0;if((j|0)!=0){qea(j)}j=w5(a,b,g,e)|0;c[d>>2]=j;k=(j|0)!=0&1;i=f;return k|0}else if((h|0)==1952807028){h=c[d>>2]|0;if((h|0)!=0){qea(h)}h=s5(a,b,g,e)|0;c[d>>2]=h;k=(h|0)!=0&1;i=f;return k|0}else{k=0;i=f;return k|0}return 0}function D7(a,d,f,g){a=a|0;d=d|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;i=i+16|0;h=g+2|0;j=g;c[f>>2]=0;k=(Lc[c[d+284>>2]&255](d)|0)+ -8|0;if((v4(d,h)|0)==0){l=0;i=g;return l|0}if((v4(d,j)|0)==0){l=0;i=g;return l|0}m=b[h>>1]|0;if(!(m<<16>>16==(b[j>>1]|0))){l=0;i=g;return l|0}j=a+20|0;n=Eda(c[j>>2]|0,m&65535,4)|0;if((n|0)==0){l=0;i=g;return l|0}if((A7(a,d,e[h>>1]|0,k,n,81)|0)==0){o=0}else{o=K2(c[j>>2]|0,e[h>>1]|0,n)|0}k=b[h>>1]|0;if(!(k<<16>>16==0)){d=k;k=0;while(1){a=c[n+(k<<2)>>2]|0;if((a|0)==0){p=d}else{V0(a);p=b[h>>1]|0}k=k+1|0;if(!(k>>>0<(p&65535)>>>0)){break}else{d=p}}}Gda(c[j>>2]|0,n);c[f>>2]=(o|0)!=0&1;l=o;i=g;return l|0}function E7(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;e=i;f=c[d+32>>2]|0;g=(Lc[c[b+284>>2]&255](b)|0)+ -8|0;h=d+12|0;if((E4(b,c[h>>2]&65535)|0)==0){j=0;i=e;return j|0}if((E4(b,c[h>>2]&65535)|0)==0){j=0;i=e;return j|0}j=(x7(a,b,c[h>>2]|0,g,f,82)|0)!=0&1;i=e;return j|0}function F7(a,b,c){a=a|0;b=b|0;c=c|0;c=i;a=u3(b)|0;i=c;return a|0}function G7(a,b){a=a|0;b=b|0;a=i;O2(b);i=a;return}function H7(a,d,f,j){a=a|0;d=d|0;f=f|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;j=i;i=i+16|0;k=j+10|0;l=j+8|0;m=j+4|0;n=j;if((v4(d,k)|0)==0){o=0;i=j;return o|0}if((v4(d,l)|0)==0){o=0;i=j;return o|0}p=ca(e[l>>1]|0,e[k>>1]|0)|0;q=a+20|0;a=Eda(c[q>>2]|0,p,8)|0;if((a|0)==0){o=0;i=j;return o|0}r=Eda(c[q>>2]|0,e[l>>1]|0,8)|0;if((r|0)==0){Gda(c[q>>2]|0,a);o=0;i=j;return o|0}a:do{if((p|0)!=0){s=0;while(1){if((y4(d,m)|0)==0){o=0;break}h[a+(s<<3)>>3]=+g[m>>2];s=s+1|0;if(!(s>>>0<p>>>0)){break a}}i=j;return o|0}}while(0);p=b[l>>1]|0;b:do{if(p<<16>>16==0){t=p&65535}else{m=0;while(1){if((y4(d,n)|0)==0){o=0;break}h[r+(m<<3)>>3]=+g[n>>2];m=m+1|0;s=e[l>>1]|0;if(!(m>>>0<s>>>0)){t=s;break b}}i=j;return o|0}}while(0);l=Q2(c[q>>2]|0,t,e[k>>1]|0,a,r)|0;Gda(c[q>>2]|0,a);Gda(c[q>>2]|0,r);c[f>>2]=1;o=l;i=j;return o|0}function I7(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0;e=i;a=c[d+32>>2]|0;f=d+12|0;if((E4(b,c[f>>2]&65535)|0)==0){g=0;i=e;return g|0}j=d+16|0;if((E4(b,c[j>>2]&65535)|0)==0){g=0;i=e;return g|0}d=c[j>>2]|0;k=ca(d,c[f>>2]|0)|0;do{if((k|0)!=0){f=0;while(1){if((H4(b,+h[(c[a>>2]|0)+(f<<3)>>3])|0)==0){g=0;l=14;break}f=f+1|0;if(!(f>>>0<k>>>0)){l=6;break}}if((l|0)==6){m=c[j>>2]|0;break}else if((l|0)==14){i=e;return g|0}}else{m=d}}while(0);if((m|0)==0){g=1;i=e;return g|0}m=a+4|0;a=0;while(1){d=c[m>>2]|0;if((d|0)==0){if((H4(b,0.0)|0)==0){g=0;l=14;break}}else{if((H4(b,+h[d+(a<<3)>>3])|0)==0){g=0;l=14;break}}a=a+1|0;if(!(a>>>0<(c[j>>2]|0)>>>0)){g=1;l=14;break}}if((l|0)==14){i=e;return g|0}return 0}function J7(a,f,g,h){a=a|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0;h=i;i=i+64|0;j=h+34|0;k=h+32|0;l=h+40|0;m=h;if((v4(f,j)|0)==0){n=0;i=h;return n|0}if((v4(f,k)|0)==0){n=0;i=h;return n|0}if(((b[j>>1]|0)!=0?(b[k>>1]|0)!=0:0)?(id[c[f+272>>2]&511](f,l,1,16)|0)==16:0){o=b[j>>1]|0;j=o&65535;p=(o&65535)>8?8:j;if((p|0)!=0){o=0;do{c[m+(o<<2)>>2]=d[l+o>>0]|0;o=o+1|0}while((o|0)!=(p|0))}p=_2(c[a+20>>2]|0,m,j,e[k>>1]|0)|0;if((p|0)!=0){k=c[p+32>>2]|0;j=k+8|0;a:do{if((c[j>>2]|0)!=0){m=0;while(1){if((y4(f,(c[k>>2]|0)+(m<<2)|0)|0)==0){break}m=m+1|0;if(!(m>>>0<(c[j>>2]|0)>>>0)){break a}}c[g>>2]=0;O2(p);n=0;i=h;return n|0}}while(0);c[g>>2]=1;n=p;i=h;return n|0}}c[g>>2]=0;n=0;i=h;return n|0}function K7(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0;f=i;i=i+16|0;b=f;h=c[e+32>>2]|0;j=e+12|0;k=c[j>>2]|0;if(k>>>0>15){l=0;i=f;return l|0}if((c[h+12>>2]|0)==0){l=0;i=f;return l|0}if((E4(d,k&65535)|0)==0){l=0;i=f;return l|0}if((E4(d,c[e+16>>2]&65535)|0)==0){l=0;i=f;return l|0}e=b+0|0;k=e+16|0;do{a[e>>0]=0;e=e+1|0}while((e|0)<(k|0));e=c[j>>2]|0;if((e|0)!=0){j=h+4|0;k=0;do{a[b+k>>0]=c[(c[j>>2]|0)+(k<<2)+16>>2];k=k+1|0}while(k>>>0<e>>>0)}if((Qc[c[d+288>>2]&255](d,16,b)|0)==0){l=0;i=f;return l|0}b=h+8|0;if((c[b>>2]|0)==0){l=1;i=f;return l|0}else{m=0}while(1){if((H4(d,+g[(c[h>>2]|0)+(m<<2)>>2])|0)==0){l=0;n=12;break}m=m+1|0;if(!(m>>>0<(c[b>>2]|0)>>>0)){l=1;n=12;break}}if((n|0)==12){i=f;return l|0}return 0}function L7(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var j=0,k=0,l=0,m=0,n=0,o=0;f=i;a=c[(c[d+4>>2]|0)+(e<<2)>>2]|0;e=a+8|0;d=c[e>>2]|0;j=a+4|0;a=c[j>>2]|0;a:do{if((((G4(b,1668641382)|0)!=0?(G4(b,0)|0)!=0:0)?(E4(b,a&65535)|0)!=0:0)?(E4(b,0)|0)!=0:0){k=a+ -1|0;if((k|0)!=0){l=0;do{if((H4(b,+g[d+(l*104|0)+4>>2])|0)==0){m=0;break a}l=l+1|0}while(l>>>0<k>>>0)}if((c[j>>2]|0)==0){m=1}else{k=0;while(1){l=d+(k*104|0)+8|0;if((c[l>>2]|0)==0){if((G4(b,1935764838)|0)==0){m=0;break a}if((G4(b,0)|0)==0){m=0;break a}if((G4(b,c[d+(k*104|0)+96>>2]|0)|0)==0){m=0;break a}if((c[(c[e>>2]|0)+(k*104|0)+96>>2]|0)!=0){n=d+(k*104|0)+100|0;o=0;do{if((H4(b,+g[(c[n>>2]|0)+(o<<2)>>2])|0)==0){m=0;break a}o=o+1|0}while(o>>>0<(c[(c[e>>2]|0)+(k*104|0)+96>>2]|0)>>>0)}}else{if((G4(b,1885434470)|0)==0){m=0;break a}if((G4(b,0)|0)==0){m=0;break a}o=(c[l>>2]|0)+ -6|0;if(o>>>0>2){m=0;break a}if((E4(b,o&65535)|0)==0){m=0;break a}if((E4(b,0)|0)==0){m=0;break a}n=722864+(o<<2)|0;o=0;do{if((H4(b,+h[d+(k*104|0)+(o<<3)+16>>3])|0)==0){m=0;break a}o=o+1|0}while(o>>>0<(c[n>>2]|0)>>>0)}k=k+1|0;if(!(k>>>0<(c[j>>2]|0)>>>0)){m=1;break}}}}else{m=0}}while(0);i=f;return m|0}function M7(a,d,f,j,k){a=a|0;d=d|0;f=f|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0,A=0.0,B=0,C=0,D=0.0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;k=i;i=i+32|0;l=k;m=k+12|0;n=k+18|0;o=k+16|0;p=k+8|0;q=k+4|0;r=k+20|0;s=(x4(d,m)|0)!=0;a:do{if(((((s&(c[m>>2]|0)==1668641382?(x4(d,0)|0)!=0:0)?(v4(d,n)|0)!=0:0)?(v4(d,0)|0)!=0:0)?(t=b[n>>1]|0,!(t<<16>>16==0)):0)?(u=a+20|0,v=Eda(c[u>>2]|0,t&65535,104)|0,(v|0)!=0):0){t=b[n>>1]|0;b:do{if(t<<16>>16==1){w=t&65535;x=1;y=-9.999999778196308e+21;z=10}else{A=-9.999999778196308e+21;B=0;while(1){g[v+(B*104|0)>>2]=A;C=v+(B*104|0)+4|0;if((y4(d,C)|0)==0){break b}D=+g[C>>2];B=B+1|0;C=b[n>>1]|0;E=C&65535;if(!(B>>>0<(E+ -1|0)>>>0)){w=E;x=C;y=D;z=10;break}else{A=D}}}}while(0);c:do{if((z|0)==10){g[v+((w+ -1|0)*104|0)>>2]=y;t=x&65535;g[v+((t+ -1|0)*104|0)+4>>2]=9.999999778196308e+21;d:do{if(x<<16>>16==0){F=t}else{B=0;e:while(1){if((x4(d,m)|0)==0){break c}if((x4(d,0)|0)==0){break c}G=c[m>>2]|0;f:do{if((G|0)==1885434470){if((v4(d,o)|0)==0){break c}if((v4(d,0)|0)==0){break c}C=b[o>>1]|0;c[v+(B*104|0)+8>>2]=(C&65535)+6;if((C&65535)>2){break c}else{H=0}do{if((y4(d,p)|0)==0){break c}h[v+(B*104|0)+(H<<3)+16>>3]=+g[p>>2];H=H+1|0}while(H>>>0<(c[722864+((e[o>>1]|0)<<2)>>2]|0)>>>0)}else if((G|0)==1935764838){if((x4(d,q)|0)==0){I=0;break a}C=c[q>>2]|0;c[v+(B*104|0)+96>>2]=C;E=Eda(c[u>>2]|0,C,4)|0;C=v+(B*104|0)+100|0;c[C>>2]=E;if((E|0)==0){break c}if((c[q>>2]|0)!=0){if((y4(d,E)|0)==0){break c}else{J=1}while(1){if(!(J>>>0<(c[q>>2]|0)>>>0)){break f}if((y4(d,(c[C>>2]|0)+(J<<2)|0)|0)==0){break c}else{J=J+1|0}}}}else{break e}}while(0);B=B+1|0;C=e[n>>1]|0;if(!(B>>>0<C>>>0)){F=C;break d}}Kda(r,G);B=c[u>>2]|0;c[l>>2]=r;Jda(B,8,722880,l);I=0;break a}}while(0);t=O0(c[u>>2]|0,F,v)|0;B=b[n>>1]|0;if(!(B<<16>>16==0)){C=B;B=0;while(1){E=c[v+(B*104|0)+100>>2]|0;if((E|0)==0){K=C}else{Gda(c[u>>2]|0,E);K=b[n>>1]|0}B=B+1|0;if(!(B>>>0<(K&65535)>>>0)){break}else{C=K}}}Gda(c[u>>2]|0,v);I=t;break a}}while(0);Gda(c[u>>2]|0,v);I=0}else{I=0}}while(0);c[f+(j<<2)>>2]=I;i=k;return(I|0)!=0|0}function N7(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;i=i+32|0;g=e;h=e+8|0;j=e+12|0;k=a+20|0;l=U4(c[k>>2]|0,11)|0;if((x4(b,h)|0)==0){m=0;i=e;return m|0}if((x4(b,0)|0)==0){m=0;i=e;return m|0}n=c[h>>2]|0;h=W4(n,c[l>>2]|0,722672)|0;if((h|0)==0){Kda(j,n);n=c[k>>2]|0;c[g>>2]=j;Jda(n,8,722920,g);m=0;i=e;return m|0}g=c[h+4>>2]|0;if((g|0)!=0?(F3(d,1,id[g&511](a,b,e+4|0,f)|0)|0)==0:0){m=0;i=e;return m|0}m=1;i=e;return m|0}function O7(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;g=rea(d,722992,e,0,0)|0;h=a+20|0;a=Cda(c[h>>2]|0,g)|0;if((G4(b,g)|0)==0){j=0;i=f;return j|0}if((rea(d,722992,e,a,g)|0)==0){j=0;i=f;return j|0}if((Qc[c[b+288>>2]&255](b,g,a)|0)==0){j=0;i=f;return j|0}Gda(c[h>>2]|0,a);j=1;i=f;return j|0}function P7(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0;h=i;i=i+16|0;j=h;if((c[f>>2]|0)>>>0<4){k=0;i=h;return k|0}if((x4(d,j)|0)==0){k=0;i=h;return k|0}l=c[j>>2]|0;if(l>>>0>4294967291){k=0;i=h;return k|0}if((c[f>>2]|0)>>>0<(l+4|0)>>>0){k=0;i=h;return k|0}m=b+20|0;b=Cda(c[m>>2]|0,l+1|0)|0;if((b|0)==0){k=0;i=h;return k|0}l=id[c[d+272>>2]&511](d,b,1,c[j>>2]|0)|0;if((l|0)==(c[j>>2]|0)){a[b+l>>0]=0;lea(e,722992,g,b)|0;Gda(c[m>>2]|0,b);c[f>>2]=-4-(c[j>>2]|0)+(c[f>>2]|0);k=1;i=h;return k|0}else{Gda(c[m>>2]|0,b);k=0;i=h;return k|0}return 0}function Q7(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=i;i=i+16|0;g=f;h=f+4|0;j=q3(d)|0;d=J2(e)|0;if((j|0)==0){k=1;i=f;return k|0}else{l=0}while(1){e=d+(l<<2)|0;m=c[e>>2]|0;n=c[m+4>>2]|0;if((n|0)==2){o=c[m+8>>2]|0;if((c[o+112>>2]|0)==0){p=1668641398}else{q=o;r=6}}else if((n|0)==0){p=1668641398}else{q=c[m+8>>2]|0;r=6}if((r|0)==6){r=0;p=(c[q+8>>2]>>31&-216793067)+1885434465|0}if((R4(b,p)|0)==0){k=0;r=13;break}if((p|0)==1885434465){if((F5(a,b,c[e>>2]|0,1)|0)==0){k=0;r=13;break}}else if((p|0)==1668641398){if((B5(a,b,c[e>>2]|0,1)|0)==0){k=0;r=13;break}}else{r=11;break}l=l+1|0;if((T4(b)|0)==0){k=0;r=13;break}if(!(l>>>0<j>>>0)){k=1;r=13;break}}if((r|0)==11){Kda(h,1885434465);j=c[a+20>>2]|0;c[g>>2]=h;Jda(j,8,723144,g);k=0;i=f;return k|0}else if((r|0)==13){i=f;return k|0}return 0}function R7(b,d,f,g){b=b|0;d=d|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0;h=i;i=i+32|0;j=h;k=h+8|0;if((c[g+12>>2]|0)!=0){Jda(c[b+20>>2]|0,13,723048,j);l=0;i=h;return l|0}m=k+0|0;n=m+16|0;do{a[m>>0]=0;m=m+1|0}while((m|0)<(n|0));m=c[g+4>>2]|0;n=m+8|0;if((c[n>>2]|0)!=0){o=0;do{a[k+o>>0]=c[m+(o<<2)+16>>2];o=o+1|0}while(o>>>0<(c[n>>2]|0)>>>0)}if((Qc[c[d+288>>2]&255](d,16,k)|0)==0){l=0;i=h;return l|0}if((D4(d,f)|0)==0){l=0;i=h;return l|0}if((D4(d,0)|0)==0){l=0;i=h;return l|0}if((D4(d,0)|0)==0){l=0;i=h;return l|0}if((D4(d,0)|0)==0){l=0;i=h;return l|0}a:do{if(f<<24>>24==1){k=g+8|0;if((c[k>>2]|0)!=0){n=0;while(1){if((D4(d,(((e[(c[g>>2]|0)+(n<<1)>>1]|0)*65281|0)+8388608|0)>>>24&255)|0)==0){l=0;break}n=n+1|0;if(!(n>>>0<(c[k>>2]|0)>>>0)){break a}}i=h;return l|0}}else if(f<<24>>24==2){if((F4(d,c[g+8>>2]|0,c[g>>2]|0)|0)==0){l=0;i=h;return l|0}}else{k=c[b+20>>2]|0;c[j>>2]=f&255;Jda(k,8,723112,j);l=0;i=h;return l|0}}while(0);l=(T4(d)|0)!=0&1;i=h;return l|0}\n\n\n\nfunction RJa(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;g=i;h=f+196|0;j=c[b+4>>2]|0;k=c[b>>2]|0;if((e|0)==3&j>>>0>3){if((k|0)==0){i=g;return}l=f+198|0;m=f+199|0;n=f+200|0;o=f+197|0;p=j>>>0>2;q=b+8|0;r=k;s=c[b+12>>2]|0;while(1){t=d[s>>0]|0;u=a[l>>0]|0;v=u&255;w=ca(v,t)|0;x=a[m>>0]|0;y=x&255;z=ca(y,t)|0;A=a[n>>0]|0;B=A&255;C=d[s+1>>0]|0;D=a[o>>0]|0;E=(ca(D&255,C)|0)+w|0;w=(ca(C,v)|0)+z|0;a:do{if(p){z=D;v=u;F=x;G=A;H=E;I=w;J=(ca(C,y)|0)+(ca(B,t)|0)|0;K=ca(C,B)|0;L=2;while(1){M=d[s+L>>0]|0;N=(ca(d[h>>0]|0,M)|0)+H|0;O=(ca(z&255,M)|0)+I|0;P=(ca(v&255,M)|0)+J|0;a[s+(L+ -2)>>0]=N>>>8|0-(N>>>16);N=L+1|0;if((N|0)==(j|0)){Q=O;R=P;S=j;break a}T=ca(G&255,M)|0;U=(ca(F&255,M)|0)+K|0;z=a[o>>0]|0;v=a[l>>0]|0;F=a[m>>0]|0;G=a[n>>0]|0;H=O;I=P;J=U;K=T;L=N}}else{Q=E;R=w;S=2}}while(0);a[s+(S+ -2)>>0]=Q>>>8|0-(Q>>>16);a[s+(S+ -1)>>0]=R>>>8|0-(R>>>16);r=r+ -1|0;if((r|0)==0){break}else{s=s+(c[q>>2]|0)|0}}i=g;return}if(!((e|0)==4&k>>>0>3)){i=g;return}e=c[b+8>>2]|0;if((j|0)==0){i=g;return}q=c[b+12>>2]|0;b=f+198|0;s=f+199|0;r=f+200|0;R=f+197|0;f=e<<1;S=k>>>0>2;Q=ca(e,-2)|0;n=0-e|0;m=q;l=q+(ca(k,e)|0)|0;q=j;while(1){j=d[m>>0]|0;o=a[b>>0]|0;p=o&255;w=ca(p,j)|0;E=a[s>>0]|0;B=E&255;C=ca(B,j)|0;t=a[r>>0]|0;y=t&255;A=d[m+e>>0]|0;x=a[R>>0]|0;u=(ca(x&255,A)|0)+w|0;w=(ca(A,p)|0)+C|0;C=m+f|0;b:do{if(S){p=x;D=o;L=E;K=t;J=C;I=u;H=w;G=(ca(A,B)|0)+(ca(y,j)|0)|0;F=ca(A,y)|0;v=3;while(1){z=d[J>>0]|0;N=(ca(d[h>>0]|0,z)|0)+I|0;T=(ca(p&255,z)|0)+H|0;U=(ca(D&255,z)|0)+G|0;a[J+Q>>0]=N>>>8|0-(N>>>16);if((v|0)==(k|0)){V=l;W=T;X=U;break b}N=ca(K&255,z)|0;P=(ca(L&255,z)|0)+F|0;p=a[R>>0]|0;D=a[b>>0]|0;L=a[s>>0]|0;K=a[r>>0]|0;J=J+e|0;I=T;H=U;G=P;F=N;v=v+1|0}}else{V=C;W=u;X=w}}while(0);a[V+Q>>0]=W>>>8|0-(W>>>16);a[V+n>>0]=X>>>8|0-(X>>>16);q=q+ -1|0;if((q|0)==0){break}else{m=m+1|0;l=l+1|0}}i=g;return}function SJa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;c[b>>2]=0;if((a|0)==0){e=35;i=d;return e|0}if((c[a+8>>2]&256|0)==0){e=6;i=d;return e|0}e=a+128|0;f=c[e>>2]|0;g=c[f+32>>2]|0;if((g|0)!=(-2|0)){if((g|0)==0){h=c[a+96>>2]|0;a=c[(c[h>>2]|0)+32>>2]|0;if((a|0)==0){j=f;k=0}else{f=dd[a&511](h,1280856)|0;j=c[e>>2]|0;k=f}c[j+32>>2]=(k|0)!=0?k:-2;l=k}else{l=g}}else{l=0}c[b>>2]=l;i=d;return((l|0)==0?6:0)|0}function TJa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;if((SJa(a,e)|0)!=0){i=d;return}f=c[(c[e>>2]|0)+12>>2]|0;if((f|0)==0){i=d;return}dd[f&511](a,b)|0;i=d;return}function UJa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;if((SJa(a,e)|0)!=0){i=d;return}f=c[(c[e>>2]|0)+4>>2]|0;if((f|0)==0){i=d;return}Qc[f&255](a,2,b)|0;i=d;return}function VJa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;i=i+16|0;f=e;c[a+32>>2]=d;g=dEa(d,4,0,b,0,f)|0;h=a+24|0;c[h>>2]=g;j=c[f>>2]|0;do{if((j|0)==0){c[a+28>>2]=dEa(d,4,0,b,0,f)|0;k=c[f>>2]|0;if((k|0)!=0){l=k;m=c[h>>2]|0;break}c[a+16>>2]=b;c[a+12>>2]=-559038737;c[a+20>>2]=0;c[a>>2]=0;c[a+8>>2]=0;c[a+4>>2]=0;k=a+36|0;c[k+0>>2]=c[1273392>>2];c[k+4>>2]=c[1273396>>2];c[k+8>>2]=c[1273400>>2];c[k+12>>2]=c[1273404>>2];n=0;i=e;return n|0}else{l=j;m=g}}while(0);aEa(d,m);c[h>>2]=0;n=l;i=e;return n|0}function WJa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+16|0;d=b;e=c[a+32>>2]|0;f=c[a>>2]|0;if((f|0)==0){i=b;return}g=a+4|0;h=ZDa(e,c[g>>2]|0,d)|0;c[a>>2]=h;if((c[d>>2]|0)!=0){i=b;return}c3a(h|0,f|0,c[g>>2]|0)|0;fLa(c[a>>2]|0,c[a+16>>2]|0,c[a+24>>2]|0,f);c[a+8>>2]=c[g>>2];aEa(e,f);i=b;return}function XJa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=i;i=i+16|0;g=f;if((b|0)<0){h=6;i=f;return h|0}j=a+16|0;if((e|0)<0?1:(c[j>>2]|0)<=(b|0)){h=6;i=f;return h|0}k=a+4|0;l=(c[k>>2]|0)+e|0;m=a+8|0;n=c[m>>2]|0;if(l>>>0>n>>>0){o=c[a>>2]|0;p=d-o|0;q=(p|0)>-1&p>>>0<n>>>0?p:-1;p=n;do{p=p+1024+(p>>>2)&-1024}while(p>>>0<l>>>0);l=c[a+32>>2]|0;n=ZDa(l,p,g)|0;c[a>>2]=n;r=c[g>>2]|0;if((r|0)!=0){c[a>>2]=o;h=r;i=f;return h|0}if((o|0)!=0){c3a(n|0,o|0,c[m>>2]|0)|0;fLa(c[a>>2]|0,c[j>>2]|0,c[a+24>>2]|0,o);aEa(l,o)}c[m>>2]=p;if((q|0)>-1){s=(c[a>>2]|0)+q|0}else{s=d}}else{s=d}c[(c[a+24>>2]|0)+(b<<2)>>2]=(c[a>>2]|0)+(c[k>>2]|0);c[(c[a+28>>2]|0)+(b<<2)>>2]=e;c3a((c[a>>2]|0)+(c[k>>2]|0)|0,s|0,e|0)|0;c[k>>2]=(c[k>>2]|0)+e;h=0;i=f;return h|0}function YJa(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a+32>>2]|0;e=a+12|0;if(!((c[e>>2]|0)==-559038737)){i=b;return}aEa(d,c[a>>2]|0);c[a>>2]=0;f=a+24|0;aEa(d,c[f>>2]|0);c[f>>2]=0;f=a+28|0;aEa(d,c[f>>2]|0);c[f>>2]=0;c[e>>2]=0;i=b;return}function ZJa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=i;c[a+12>>2]=0;c[a+4>>2]=b;c[a+8>>2]=d;c[a>>2]=b;c[a+16>>2]=e;e=a+20|0;a=1273408|0;b=e+52|0;do{c[e>>2]=c[a>>2];e=e+4|0;a=a+4|0}while((e|0)<(b|0));i=f;return}function _Ja(a){a=a|0;return}function $Ja(a){a=a|0;var b=0;b=i;_Ka(a,c[a+8>>2]|0);i=b;return}function aKa(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;i=i+16|0;e=d;c[e>>2]=c[b>>2];f=c[b+8>>2]|0;_Ka(e,f);g=c[e>>2]|0;a:do{if(g>>>0<f>>>0){switch(a[g>>0]|0){case 123:{h=cLa(e,f)|0;break a;break};case 40:{h=bLa(e,f)|0;break a;break};case 47:{j=g+1|0;c[e>>2]=j;k=j;break};case 93:case 91:{c[e>>2]=g+1;h=0;break a;break};case 62:{j=g+1|0;c[e>>2]=j;if(!(j>>>0<f>>>0)){h=3;break a}if((a[j>>0]|0)!=62){h=3;break a}c[e>>2]=g+2;h=0;break a;break};case 60:{j=g+1|0;if(j>>>0<f>>>0?(a[j>>0]|0)==60:0){c[e>>2]=g+2;h=0;break a}h=dLa(e,f)|0;break a;break};default:{k=g}}if(k>>>0<f>>>0){j=k;while(1){switch(a[j>>0]|0){case 37:case 125:case 123:case 93:case 91:case 62:case 60:case 41:case 40:case 47:case 0:case 12:case 9:case 10:case 13:case 32:{h=0;break a;break};default:{}}j=j+1|0;c[e>>2]=j;if(!(j>>>0<f>>>0)){h=0;break a}}}else{h=0}}else{h=0}}while(0);k=c[e>>2]|0;if(!(k>>>0<f>>>0)){l=h;m=b+12|0;c[m>>2]=l;c[b>>2]=k;i=d;return}l=(k|0)==(c[b>>2]|0)?3:h;m=b+12|0;c[m>>2]=l;c[b>>2]=k;i=d;return}function bKa(a){a=a|0;var b=0,d=0;b=i;$Ja(a);d=TKa(a,c[a+8>>2]|0)|0;i=b;return d|0}function cKa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;$Ja(a);e=SKa(a,c[a+8>>2]|0,b)|0;i=d;return e|0}function dKa(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0;h=i;i=i+16|0;j=h;$Ja(b);k=c[b>>2]|0;c[j>>2]=k;l=b+8|0;m=c[l>>2]|0;if(!(k>>>0<m>>>0)){n=0;i=h;return n|0}if(g<<24>>24==0){c[f>>2]=eLa(j,m,d,e)|0;o=c[j>>2]|0}else{if((a[k>>0]|0)!=60){n=3;i=h;return n|0}c[j>>2]=k+1;c[f>>2]=eLa(j,m,d,e)|0;e=c[j>>2]|0;if(e>>>0<(c[l>>2]|0)>>>0?(a[e>>0]|0)!=62:0){n=3;i=h;return n|0}l=e+1|0;c[j>>2]=l;o=l}c[b>>2]=o;n=0;i=h;return n|0}function eKa(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;g=i;i=i+16|0;h=g;j=g+4|0;$Ja(d);k=c[d+8>>2]|0;l=c[d>>2]|0;c[h>>2]=l;a:do{if(l>>>0<k>>>0){m=a[l>>0]|0;if(!(m<<24>>24==91)){if(m<<24>>24==123){n=125;o=4}else{p=0;q=l;r=0}}else{n=93;o=4}if((o|0)==4){m=l+1|0;c[h>>2]=m;p=1;q=m;r=n}m=(f|0)!=0;s=m^1;t=p;u=q;v=0;while(1){if(!(u>>>0<k>>>0)){w=u;x=v;break a}_Ka(h,k);y=c[h>>2]|0;if(!(y>>>0<k>>>0)){w=y;x=v;break a}if((a[y>>0]|0)==r<<24>>24){break}if(!((v|0)<(e|0)|s)){w=y;x=v;break a}z=(SKa(h,k,0)|0)>>>16&65535;if(m){A=f+(v<<1)|0}else{A=j}b[A>>1]=z;z=c[h>>2]|0;if((y|0)==(z|0)){w=y;x=-1;break a}B=v+1|0;if(t){t=1;u=z;v=B}else{w=z;x=B;break a}}u=y+1|0;c[h>>2]=u;w=u;x=v}else{w=l;x=0}}while(0);c[d>>2]=w;i=g;return x|0}function fKa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;$Ja(a);g=$Ka(a,c[a+8>>2]|0,b,d,e)|0;i=f;return g|0}function gKa(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=i;i=i+16|0;g=f;h=e+8|0;c[h>>2]=0;c[e>>2]=0;j=e+4|0;c[j>>2]=0;$Ja(b);k=c[b>>2]|0;c[g>>2]=k;l=c[b+8>>2]|0;if(!(k>>>0<l>>>0)){i=f;return}m=d[k>>0]|0;a:do{if((m|0)==40){c[h>>2]=2;c[e>>2]=k;if((bLa(g,l)|0)==0){n=c[g>>2]|0;c[j>>2]=n;o=n;p=18}else{p=17}}else if((m|0)==91){c[h>>2]=3;c[e>>2]=k;c[b>>2]=k+1;$Ja(b);n=c[b>>2]|0;c[g>>2]=n;if(n>>>0<l>>>0){q=b+12|0;r=n;n=1;while(1){if((c[q>>2]|0)!=0){p=17;break a}s=a[r>>0]|0;if(s<<24>>24==91){t=n+1|0}else if(s<<24>>24==93){if((n|0)<2){break}else{t=n+ -1|0}}else{t=n}c[b>>2]=r;aKa(b);$Ja(b);s=c[b>>2]|0;c[g>>2]=s;if(s>>>0<l>>>0){r=s;n=t}else{p=17;break a}}n=r+1|0;c[g>>2]=n;c[j>>2]=n}else{p=17}}else if((m|0)==123){c[h>>2]=3;c[e>>2]=k;if((cLa(g,l)|0)==0){n=c[g>>2]|0;c[j>>2]=n;o=n;p=18}else{p=17}}else{c[e>>2]=k;c[h>>2]=(a[k>>0]|0)==47?4:1;aKa(b);n=c[b>>2]|0;c[g>>2]=n;if((c[b+12>>2]|0)==0){c[j>>2]=n;o=n;p=18}else{p=17}}}while(0);if((p|0)==17){o=c[j>>2]|0;p=18}if((p|0)==18?(o|0)==0:0){c[e>>2]=0;c[h>>2]=0}c[b>>2]=c[g>>2];i=f;return}function hKa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=i;i=i+32|0;g=f+12|0;h=f;c[e>>2]=-1;gKa(a,g);if((c[g+8>>2]|0)!=3){i=f;return}j=c[a>>2]|0;k=a+8|0;l=c[k>>2]|0;m=b+(d*12|0)|0;d=(c[g>>2]|0)+1|0;c[a>>2]=d;n=(c[g+4>>2]|0)+ -1|0;c[k>>2]=n;a:do{if(d>>>0<n>>>0){g=h+8|0;o=(b|0)!=0;p=b;while(1){gKa(a,h);if((c[g>>2]|0)==0){q=p;break a}if(o&p>>>0<m>>>0){c[p+0>>2]=c[h+0>>2];c[p+4>>2]=c[h+4>>2];c[p+8>>2]=c[h+8>>2]}r=p+12|0;if((c[a>>2]|0)>>>0<(c[k>>2]|0)>>>0){p=r}else{q=r;break}}}else{q=b}}while(0);c[e>>2]=(q-b|0)/12|0;c[a>>2]=j;c[k>>2]=l;i=f;return}function iKa(e,f,g,h,j){e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;j=i;i=i+48|0;k=j+36|0;l=j+32|0;m=j+28|0;n=j+16|0;o=j;gKa(e,k);p=c[k+8>>2]|0;a:do{if((p|0)!=0){q=c[k>>2]|0;c[l>>2]=q;r=c[k+4>>2]|0;s=c[f+8>>2]|0;if((s|0)==7){t=c[e>>2]|0;u=e+8|0;v=c[u>>2]|0;c[e>>2]=q+1;c[u>>2]=r+ -1;gKa(e,n);c[e>>2]=t;c[u>>2]=v;if((c[n+8>>2]|0)==3){w=1;x=8;y=5}else{z=1;A=0;B=r;C=7;y=7}}else{if((p|0)==3){w=h;x=s;y=5}else{z=1;A=0;B=r;C=s;y=7}}if((y|0)==5){if((h|0)==0){break}c[l>>2]=q+1;if((w|0)!=0){z=w;A=1;B=r+ -1|0;C=x;y=7}}b:do{if((y|0)==7){r=f+16|0;q=f+20|0;s=e+16|0;v=B;u=o+4|0;t=o+8|0;D=o+12|0;E=h<<2;F=(h|0)==0;G=h<<1;H=h*3|0;I=z;J=A;c:while(1){K=c[g+(J<<2)>>2]|0;L=c[r>>2]|0;M=K+L|0;_Ka(l,B);d:do{switch(C|0){case 7:{c[o+0>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;if(($Ka(l,B,4,o,0)|0)<0){y=42;break c}c[M>>2]=KDa(c[o>>2]|0)|0;c[K+(L+4)>>2]=KDa(c[u>>2]|0)|0;c[K+(L+8)>>2]=KDa(c[t>>2]|0)|0;c[K+(L+12)>>2]=KDa(c[D>>2]|0)|0;break};case 1:{N=c[l>>2]|0;O=N+3|0;if((((O>>>0<B>>>0?(a[N>>0]|0)==116:0)?(a[N+1>>0]|0)==114:0)?(a[N+2>>0]|0)==117:0)?(a[O>>0]|0)==101:0){P=N+5|0;Q=1}else{R=N+4|0;if((((R>>>0<B>>>0?(a[N>>0]|0)==102:0)?(a[N+1>>0]|0)==97:0)?(a[N+2>>0]|0)==108:0)?(a[O>>0]|0)==115:0){P=(a[R>>0]|0)==101?N+6|0:N;Q=0}else{P=N;Q=0}}c[l>>2]=P;S=Q;y=27;break};case 4:{S=SKa(l,B,3)|0;y=27;break};case 3:{S=SKa(l,B,0)|0;y=27;break};case 6:case 5:{N=c[s>>2]|0;R=c[l>>2]|0;O=v-R|0;if(R>>>0<B>>>0){if((p|0)==4){T=R+1|0;c[l>>2]=T;U=T;V=O+ -1|0}else if((p|0)==2){T=R+1|0;c[l>>2]=T;U=T;V=O+ -2|0}else{y=36;break c}O=c[M>>2]|0;if((O|0)!=0){aEa(N,O);c[M>>2]=0}O=ZDa(N,V+1|0,m)|0;N=c[m>>2]|0;if((N|0)!=0){W=N;y=53;break c}c3a(O|0,U|0,V|0)|0;a[O+V>>0]=0;c[M>>2]=O}break};case 8:{O=c[s>>2]|0;N=dEa(O,4,0,E,0,m)|0;T=c[m>>2]|0;if((T|0)==0){X=0}else{W=T;y=53;break c}do{if(($Ka(l,B,h,N+((ca(X,h)|0)<<2)|0,0)|0)<0){y=46;break c}_Ka(l,B);X=X+1|0}while(X>>>0<4);if(!F){T=0;do{R=c[g+(T<<2)>>2]|0;c[R>>2]=KDa(c[N+(T<<2)>>2]|0)|0;c[R+4>>2]=KDa(c[N+(T+h<<2)>>2]|0)|0;c[R+8>>2]=KDa(c[N+(T+G<<2)>>2]|0)|0;c[R+12>>2]=KDa(c[N+(T+H<<2)>>2]|0)|0;T=T+1|0}while((T|0)!=(h|0))}aEa(O,N);break};case 2:{T=a[c[l>>2]>>0]|0;if(!(T<<24>>24==45|T<<24>>24==43)?!((T+ -48<<24>>24&255)<10):0){break d}S=TKa(l,B)|0;y=27;break};default:{break a}}}while(0);do{if((y|0)==27){y=0;L=d[q>>0]|0;if((L|0)==1){a[M>>0]=S;break}else if((L|0)==2){b[M>>1]=S;break}else if((L|0)==4){c[M>>2]=S;break}else{c[M>>2]=S;break}}}while(0);I=I+ -1|0;if((I|0)==0){break b}else{J=J+1|0}}if((y|0)==36){c[m>>2]=3;W=3;i=j;return W|0}else if((y|0)==42){c[m>>2]=3;W=3;i=j;return W|0}else if((y|0)==46){c[m>>2]=3;W=3;i=j;return W|0}else if((y|0)==53){i=j;return W|0}}}while(0);c[m>>2]=0;W=0;i=j;return W|0}}while(0);c[m>>2]=3;W=3;i=j;return W|0}function jKa(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;h=i;i=i+432|0;j=h+40|0;k=h+36|0;l=h;m=l+0|0;n=e+0|0;o=m+36|0;do{c[m>>2]=c[n>>2];m=m+4|0;n=n+4|0}while((m|0)<(o|0));n=l+8|0;c[n>>2]=2;m=e+8|0;o=c[m>>2]|0;if((o|0)==7|(o|0)==10){c[n>>2]=3}hKa(b,j,32,k);n=c[k>>2]|0;if((n|0)<0){p=162;i=h;return p|0}o=c[e+24>>2]|0;if(n>>>0>o>>>0){c[k>>2]=o;q=o}else{q=n}n=c[b>>2]|0;o=b+8|0;r=c[o>>2]|0;if((c[m>>2]|0)!=7?(m=c[e+28>>2]|0,(m|0)!=0):0){a[(c[f>>2]|0)+m>>0]=q}if((q|0)>0){m=l+20|0;e=l+16|0;s=q;q=j;while(1){c[b>>2]=c[q>>2];c[o>>2]=c[q+4>>2];iKa(b,l,f,g,0)|0;c[e>>2]=(c[e>>2]|0)+(d[m>>0]|0);s=s+ -1|0;c[k>>2]=s;if((s|0)<=0){break}else{q=q+12|0}}}c[b>>2]=n;c[o>>2]=r;p=0;i=h;return p|0}function kKa(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=i;c[b+64>>2]=0;a[b+68>>0]=1;c[b+4>>2]=d;c[b+8>>2]=f;c[b>>2]=c[d+100>>2];if((f|0)!=0?(d=f+156|0,f=c[c[d>>2]>>2]|0,c[b+12>>2]=f,c[b+16>>2]=f+20,c[b+20>>2]=f+56,_Da(f),c[b+76>>2]=c[e+40>>2],e=b+72|0,c[e>>2]=0,!(g<<24>>24==0)):0){c[e>>2]=c[(c[d>>2]|0)+36>>2]}d=b+24|0;e=b+80|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;c[e+0>>2]=c[1273464>>2];c[e+4>>2]=c[1273468>>2];c[e+8>>2]=c[1273472>>2];c[e+12>>2]=c[1273476>>2];c[e+16>>2]=c[1273480>>2];c[e+20>>2]=c[1273484>>2];c[e+24>>2]=c[1273488>>2];c[e+28>>2]=c[1273492>>2];i=h;return}function lKa(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+8>>2]|0;if((d|0)==0){i=b;return}e=d+108|0;d=c[a+16>>2]|0;c[e+0>>2]=c[d+0>>2];c[e+4>>2]=c[d+4>>2];c[e+8>>2]=c[d+8>>2];c[e+12>>2]=c[d+12>>2];c[e+16>>2]=c[d+16>>2];i=b;return}function mKa(a,d){a=a|0;d=d|0;var e=0,f=0,g=0;e=i;if((d|0)==0){f=0;i=e;return f|0}g=c[a+12>>2]|0;if(!(((b[g+22>>1]|0)+d+(b[g+58>>1]|0)|0)>>>0>(c[g+4>>2]|0)>>>0)){f=0;i=e;return f|0}f=fEa(g,d,0)|0;i=e;return f|0}function nKa(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;h=i;j=c[d+20>>2]|0;if((a[d+68>>0]|0)==0){k=j+2|0;l=b[k>>1]|0;m=l+1<<16>>16;b[k>>1]=m;i=h;return}else{d=c[j+4>>2]|0;n=j+2|0;o=b[n>>1]|0;p=(c[j+8>>2]|0)+o|0;c[d+(o<<3)>>2]=(KDa(e)|0)>>16;c[d+(o<<3)+4>>2]=(KDa(f)|0)>>16;a[p>>0]=g<<24>>24!=0?1:2;k=n;l=b[k>>1]|0;m=l+1<<16>>16;b[k>>1]=m;i=h;return}}function oKa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;e=mKa(a,1)|0;if((e|0)==0){nKa(a,b,c,1)}i=d;return e|0}function pKa(d){d=d|0;var f=0,g=0,h=0,j=0,k=0;f=i;g=c[d+20>>2]|0;if((g|0)==0){h=3;i=f;return h|0}if((a[d+68>>0]|0)==0){b[g>>1]=(b[g>>1]|0)+1<<16>>16;h=0;i=f;return h|0}j=c[d+12>>2]|0;if(((b[j+20>>1]|0)+1+(b[j+56>>1]|0)|0)>>>0>(c[j+8>>2]|0)>>>0?(d=fEa(j,0,1)|0,(d|0)!=0):0){h=d;i=f;return h|0}d=b[g>>1]|0;if(d<<16>>16>0){b[(c[g+12>>2]|0)+((d<<16>>16)+ -1<<1)>>1]=(e[g+2>>1]|0)+65535;k=b[g>>1]|0}else{k=d}b[g>>1]=k+1<<16>>16;h=0;i=f;return h|0}function qKa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;f=a+64|0;if((c[f>>2]|0)!=3){c[f>>2]=3;f=pKa(a)|0;if((f|0)==0){g=oKa(a,b,d)|0}else{g=f}}else{g=0}i=e;return g|0}function rKa(d){d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;f=c[d+20>>2]|0;if((f|0)==0){i=e;return}d=b[f>>1]|0;if(d<<16>>16<2){g=0}else{g=(b[(c[f+12>>2]|0)+((d<<16>>16)+ -2<<1)>>1]|0)+1|0}h=f+2|0;j=b[h>>1]|0;if(((j<<16>>16>1?(k=c[f+4>>2]|0,l=(j<<16>>16)+ -1|0,m=(c[f+8>>2]|0)+l|0,(c[k+(g<<3)>>2]|0)==(c[k+(l<<3)>>2]|0)):0)?(c[k+(g<<3)+4>>2]|0)==(c[k+(l<<3)+4>>2]|0):0)?(a[m>>0]|0)==1:0){m=j+ -1<<16>>16;b[h>>1]=m;n=m}else{n=j}if(!(d<<16>>16>0)){i=e;return}j=(n<<16>>16)+ -1|0;if((g|0)==(j|0)){b[f>>1]=d+ -1<<16>>16;b[h>>1]=n+ -1<<16>>16;i=e;return}else{b[(c[f+12>>2]|0)+((d<<16>>16)+ -1<<1)>>1]=j;i=e;return}}function sKa(a,b,d,e,f,g,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0;l=i;f3a(a|0,0,2524)|0;m=iFa(c[b+96>>2]|0,1284e3)|0;if((m|0)==0){n=7;i=l;return n|0}c[a+2372>>2]=m;kKa(a,b,d,e,h);c[a+2376>>2]=c[b+16>>2];c[a+2380>>2]=f;c[a+2492>>2]=j;c[a+2488>>2]=g;c[a+2496>>2]=k;k=a+2500|0;c[k+0>>2]=c[1273496>>2];c[k+4>>2]=c[1273500>>2];c[k+8>>2]=c[1273504>>2];n=0;i=l;return n|0}function tKa(a){a=a|0;var b=0;b=i;lKa(a);i=b;return}function uKa(e,f,g){e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0;h=i;i=i+16|0;j=h+8|0;k=h+4|0;l=h;c[j>>2]=e;c[k>>2]=f;m=k^j^l;n=(m>>>10^m^m>>20)&65535;c[l>>2]=(n|0)==0?29572:n;c[e+2160>>2]=e+112;n=e+2164|0;c[e+2368>>2]=n;m=e+64|0;c[m>>2]=0;o=c[e+72>>2]|0;p=c[e+2512>>2]|0;if((p|0)!=0?(q=c[e+2516>>2]|0,(q|0)!=0):0){f3a(p|0,0,q<<2|0)|0;r=c[k>>2]|0}else{r=f}c[e+2168>>2]=r;f=r+g|0;c[e+2172>>2]=f;c[n>>2]=r;k=e+24|0;q=c[k>>2]|0;p=e+28|0;s=c[p>>2]|0;t=(o|0)!=0;if(t){Rc[c[o+4>>2]&1023](c[o>>2]|0)}if((g|0)<=0){u=0;i=h;return u|0}g=o+20|0;v=e+20|0;w=e+32|0;x=e+40|0;y=e+44|0;z=e+70|0;A=e+36|0;B=o+12|0;C=o+16|0;D=r;r=0;E=0;F=f;f=q;G=0;H=q;q=s;s=n;a:while(1){n=D;I=r;J=E;K=G;b:while(1){L=n;M=J;N=K;while(1){O=c[j>>2]|0;P=c[O+2160>>2]|0;Q=L+1|0;R=a[L>>0]|0;S=R&255;c:do{switch(S|0){case 21:{T=Q;U=M;V=10;W=0;break};case 13:{T=Q;U=M;V=2;W=0;break};case 9:{T=Q;U=M;V=5;W=0;break};case 30:{T=Q;U=M;V=12;W=0;break};case 8:{T=Q;U=M;V=11;W=0;break};case 15:{T=Q;U=M;V=26;W=0;break};case 3:{T=Q;U=M;V=18;W=0;break};case 255:{X=L+5|0;if(X>>>0>F>>>0){u=160;Y=190;break a}Z=d[L+2>>0]<<16|d[Q>>0]<<24|d[L+3>>0]<<8|d[L+4>>0];_=M<<24>>24!=0;if((Z+32e3|0)>>>0>64e3){T=X;U=_?M:1;V=0;W=Z;break c}else{T=X;U=M;V=0;W=_?Z:Z<<16;break c}break};case 7:{T=Q;U=M;V=13;W=0;break};case 31:{T=Q;U=M;V=8;W=0;break};case 14:{T=Q;U=M;V=1;W=0;break};case 6:{T=Q;U=M;V=6;W=0;break};case 1:{T=Q;U=M;V=16;W=0;break};case 10:{T=Q;U=M;V=22;W=0;break};case 12:{if(Q>>>0>F>>>0){u=160;Y=190;break a}Z=L+2|0;switch(d[Q>>0]|0){case 17:{T=Z;U=M;V=23;W=0;break c;break};case 7:{T=Z;U=M;V=4;W=0;break c;break};case 2:{T=Z;U=M;V=17;W=0;break c;break};case 16:{T=Z;U=M;V=21;W=0;break c;break};case 1:{T=Z;U=M;V=19;W=0;break c;break};case 33:{T=Z;U=M;V=25;W=0;break c;break};case 6:{T=Z;U=M;V=3;W=0;break c;break};case 0:{T=Z;U=M;V=15;W=0;break c;break};case 12:{T=Z;U=M;V=20;W=0;break c;break};default:{u=160;Y=190;break a}}break};case 4:{T=Q;U=M;V=14;W=0;break};case 5:{T=Q;U=M;V=9;W=0;break};case 22:{T=Q;U=M;V=7;W=0;break};case 11:{T=Q;U=M;V=24;W=0;break};default:{if(!((R&255)>31)){u=160;Y=190;break a}do{if(!((R&255)<247)){Z=L+2|0;if(Z>>>0>F>>>0){u=160;Y=190;break a}_=S<<8;if((R&255)<251){$=Z;aa=(d[Q>>0]|_+ -63232)+108|0;break}else{$=Z;aa=-108-(d[Q>>0]|_+ -64256)|0;break}}else{$=Q;aa=S+ -139|0}}while(0);T=$;U=M;V=0;W=M<<24>>24==0?aa<<16:aa}}}while(0);if((N|0)>0?!((V|0)==23|(V|0)==0|(V|0)==24|(V|0)==22):0){ba=0}else{ba=N}if(!(U<<24>>24==0)?(V|0)==0|(V|0)==20:0){da=U}else{da=0}if((V|0)==21){break}else if((V|0)!=0){break b}if((P-(O+112)|0)>2044){u=160;Y=190;break a}c[P>>2]=W;c[(c[j>>2]|0)+2160>>2]=P+4;if(T>>>0<F>>>0){L=T;M=da;N=ba}else{u=0;Y=190;break a}}N=O+112|0;M=N;if((P-M|0)<8){u=161;Y=190;break a}L=P+ -8|0;S=c[P+ -4>>2]>>16;Q=c[L>>2]>>16;if((Q|0)>(L-M>>2|0)){u=161;Y=190;break a}M=-2-Q|0;L=P+(M<<2)|0;d:do{switch(S|0){case 1:{if((Q|0)!=0){u=160;Y=190;break a}c[O+2424>>2]=1;c[(c[j>>2]|0)+2428>>2]=0;R=qKa(e,H,q)|0;if((R|0)!=0){u=R;Y=190;break a}R=mKa(e,6)|0;if((R|0)==0){ea=0;fa=L;ga=0}else{u=R;Y=190;break a}break};case 3:{if((Q|0)!=1){u=160;Y=190;break a}if(t){Ic[c[g>>2]&511](c[o>>2]|0,b[(c[v>>2]|0)+2>>1]|0);ea=1;fa=L;ga=0}else{ea=1;fa=L;ga=0}break};case 0:{if((Q|0)!=3){u=160;Y=190;break a}if((c[O+2424>>2]|0)==0){u=160;Y=190;break a}if((c[O+2428>>2]|0)!=7){u=160;Y=190;break a}c[L>>2]=H;c[P+(M+1<<2)>>2]=q;ea=2;fa=L;ga=0;break};case 20:{if((Q|0)!=2){u=160;Y=190;break a}c[L>>2]=(c[L>>2]|0)+(c[P+(M+1<<2)>>2]|0);ea=1;fa=L;ga=0;break};case 18:case 17:case 16:case 15:case 14:{R=c[O+2488>>2]|0;if((R|0)==0){u=160;Y=190;break a}_=S+ -13+((S|0)==18&1)|0;Z=c[R>>2]|0;if((Q|0)!=(ca(Z,_)|0)){u=160;Y=190;break a}if((_|0)==0){ea=0;fa=L;ga=0}else{X=R+136|0;ha=Z;Z=P+(_+M<<2)|0;ia=1;ja=L;while(1){ka=c[ja>>2]|0;if(ha>>>0>1){la=c[X>>2]|0;ma=Z;na=1;oa=ka;while(1){pa=ma+4|0;qa=(SDa(c[ma>>2]|0,c[la+(na<<2)>>2]|0)|0)+oa|0;na=na+1|0;if(!(na>>>0<ha>>>0)){ra=pa;sa=qa;break}else{ma=pa;oa=qa}}}else{ra=Z;sa=ka}c[ja>>2]=sa;if((ia|0)==(_|0)){ea=_;fa=L;ga=0;break d}ha=c[R>>2]|0;Z=ra;ia=ia+1|0;ja=ja+4|0}}break};case 27:{if((Q|0)!=4){u=160;Y=190;break a}if((c[P+(M+2<<2)>>2]|0)>(c[P+(M+3<<2)>>2]|0)){c[L>>2]=c[P+(M+1<<2)>>2];ea=1;fa=L;ga=0}else{ea=1;fa=L;ga=0}break};case 23:{if((Q|0)!=2){u=160;Y=190;break a}ja=c[P+(M+1<<2)>>2]|0;if((ja|0)==0){u=160;Y=190;break a}c[L>>2]=TDa(c[L>>2]|0,ja)|0;ea=1;fa=L;ga=0;break};case 2:{if((Q|0)!=0){u=160;Y=190;break a}if((c[O+2424>>2]|0)==0){u=160;Y=190;break a}ja=O+2428|0;ia=c[ja>>2]|0;c[ja>>2]=ia+1;if((ia+ -1|0)>>>0<6){if((ia|0)==3){ta=1}else{ta=(ia|0)==6&1}nKa(e,H,q,ta);ea=0;fa=L;ga=0}else{ea=0;fa=L;ga=0}break};case 25:{if((Q|0)!=1){u=160;Y=190;break a}if((c[O+2488>>2]|0)==0){u=160;Y=190;break a}ia=c[L>>2]>>16;if((ia|0)<0){u=160;Y=190;break a}if(!(ia>>>0<(c[O+2516>>2]|0)>>>0)){u=160;Y=190;break a}c[L>>2]=c[(c[O+2512>>2]|0)+(ia<<2)>>2];ea=1;fa=L;ga=0;break};case 21:{if((Q|0)!=2){u=160;Y=190;break a}c[L>>2]=(c[L>>2]|0)-(c[P+(M+1<<2)>>2]|0);ea=1;fa=L;ga=0;break};case 22:{if((Q|0)!=2){u=160;Y=190;break a}c[L>>2]=SDa(c[L>>2]|0,c[P+(M+1<<2)>>2]|0)|0;ea=1;fa=L;ga=0;break};case 19:{ia=c[O+2488>>2]|0;if((Q|0)!=1|(ia|0)==0){u=160;Y=190;break a}ja=c[L>>2]>>16;if((ja|0)<0){u=160;Y=190;break a}Z=c[ia>>2]|0;if((Z+ja|0)>>>0>(c[O+2516>>2]|0)>>>0){u=160;Y=190;break a}c3a((c[O+2512>>2]|0)+(ja<<2)|0,c[ia+136>>2]|0,Z<<2|0)|0;ea=0;fa=L;ga=0;break};case 24:{if((Q|0)!=2){u=160;Y=190;break a}if((c[O+2488>>2]|0)==0){u=160;Y=190;break a}Z=c[P+(M+1<<2)>>2]>>16;if((Z|0)<0){u=160;Y=190;break a}if(!(Z>>>0<(c[O+2516>>2]|0)>>>0)){u=160;Y=190;break a}c[(c[O+2512>>2]|0)+(Z<<2)>>2]=c[L>>2];ea=0;fa=L;ga=0;break};case 28:{if((Q|0)!=0){u=160;Y=190;break a}Z=c[l>>2]|0;c[L>>2]=((Z|0)>32767&1)+Z;Z=c[l>>2]|0;ia=SDa(Z,65536-Z|0)|0;c[l>>2]=(ia|0)==0?ia+10355|0:ia;ea=1;fa=L;ga=0;break};case 13:case 12:{ea=0;fa=N;ga=0;break};default:{if((Q|S|0)>-1){ea=0;fa=L;ga=Q}else{u=160;Y=190;break a}}}}while(0);c[(c[j>>2]|0)+2160>>2]=fa+(ea<<2);if(T>>>0<F>>>0){n=T;I=ea;J=da;K=ga}else{u=0;Y=190;break a}}ua=c[1274960+(V<<2)>>2]|0;if((P-(O+112)>>2|0)<(ua|0)){u=161;Y=190;break}va=P+(0-ua<<2)|0;e:do{switch(V|0){case 13:{K=qKa(e,H,q)|0;if((K|0)!=0){u=K;Y=190;break a}wa=H;xa=(c[va>>2]|0)+q|0;Y=150;break};case 14:{K=(c[va>>2]|0)+q|0;if((c[O+2424>>2]|0)==0){if((c[m>>2]|0)==0){u=160;Y=190;break a}c[m>>2]=2;ya=T;za=I;Aa=da;Ba=F;Ca=f;Da=va;Ea=ba;Fa=H;Ga=K;Ha=s}else{ya=T;za=I;Aa=da;Ba=F;Ca=f;Da=va;Ea=ba;Fa=H;Ga=K;Ha=s}break};case 22:{K=c[va>>2]>>16;if((K|0)<0){u=160;Y=190;break a}if((K|0)>=(c[O+2388>>2]|0)){u=160;Y=190;break a}if((s-(O+2164)|0)>180){u=160;Y=190;break a}c[s>>2]=T;J=s+12|0;n=c[(c[(c[j>>2]|0)+2392>>2]|0)+(K<<2)>>2]|0;Q=s+16|0;c[Q>>2]=n;L=c[j>>2]|0;S=c[L+2396>>2]|0;if((S|0)==0){N=c[L+2384>>2]|0;L=n+((N|0)<0?0:N)|0;c[Q>>2]=L;c[s+20>>2]=c[(c[(c[j>>2]|0)+2392>>2]|0)+(K+1<<2)>>2];Ia=L}else{c[s+20>>2]=n+(c[S+(K<<2)>>2]|0);Ia=n}c[J>>2]=Ia;if((Ia|0)==0){u=160;Y=190;break a}c[(c[j>>2]|0)+2368>>2]=J;ya=c[Q>>2]|0;za=I;Aa=da;Ba=c[s+20>>2]|0;Ca=f;Da=va;Ea=ba;Fa=H;Ga=q;Ha=J;break};case 20:{J=P+(1-ua<<2)|0;c[va>>2]=TDa(c[va>>2]|0,c[J>>2]|0)|0;ya=T;za=I;Aa=0;Ba=F;Ca=f;Da=J;Ea=ba;Fa=H;Ga=q;Ha=s;break};case 23:{if((I|0)>0){ya=T;za=I+ -1|0;Aa=da;Ba=F;Ca=f;Da=va;Ea=ba;Fa=H;Ga=q;Ha=s;break e}if((ba|0)==0){u=160;Y=190;break a}ya=T;za=I;Aa=da;Ba=F;Ca=f;Da=P+(1-ua<<2)|0;Ea=ba+ -1|0;Fa=H;Ga=q;Ha=s;break};case 24:{if(!(s>>>0>(O+2164|0)>>>0)){u=160;Y=190;break a}J=s+ -12|0;Q=c[J>>2]|0;n=c[s+ -4>>2]|0;c[O+2368>>2]=J;ya=Q;za=I;Aa=da;Ba=n;Ca=f;Da=va;Ea=ba;Fa=H;Ga=q;Ha=J;break};case 16:{if(t){ld[c[B>>2]&255](c[o>>2]|0,1,va);ya=T;za=I;Aa=da;Ba=F;Ca=f;Da=va;Ea=ba;Fa=H;Ga=q;Ha=s}else{ya=T;za=I;Aa=da;Ba=F;Ca=f;Da=va;Ea=ba;Fa=H;Ga=q;Ha=s}break};case 17:{if(t){ld[c[C>>2]&255](c[o>>2]|0,1,va);ya=T;za=I;Aa=da;Ba=F;Ca=f;Da=va;Ea=ba;Fa=H;Ga=q;Ha=s}else{ya=T;za=I;Aa=da;Ba=F;Ca=f;Da=va;Ea=ba;Fa=H;Ga=q;Ha=s}break};case 18:{if(t){c[va>>2]=(c[va>>2]|0)+f;ld[c[B>>2]&255](c[o>>2]|0,0,va);ya=T;za=I;Aa=da;Ba=F;Ca=f;Da=va;Ea=ba;Fa=H;Ga=q;Ha=s}else{ya=T;za=I;Aa=da;Ba=F;Ca=f;Da=va;Ea=ba;Fa=H;Ga=q;Ha=s}break};case 19:{if(t){c[va>>2]=(c[va>>2]|0)+f;J=P+(2-ua<<2)|0;c[J>>2]=(c[J>>2]|0)+f;J=P+(4-ua<<2)|0;c[J>>2]=(c[J>>2]|0)+f;ld[c[C>>2]&255](c[o>>2]|0,0,va);ya=T;za=I;Aa=da;Ba=F;Ca=f;Da=va;Ea=ba;Fa=H;Ga=q;Ha=s}else{ya=T;za=I;Aa=da;Ba=F;Ca=f;Da=va;Ea=ba;Fa=H;Ga=q;Ha=s}break};case 2:{c[m>>2]=1;c[w>>2]=(c[w>>2]|0)+(c[va>>2]|0);c[x>>2]=c[P+(1-ua<<2)>>2];c[y>>2]=0;J=(c[va>>2]|0)+(c[k>>2]|0)|0;if((a[z>>0]|0)==0){ya=T;za=I;Aa=da;Ba=F;Ca=J;Da=va;Ea=ba;Fa=J;Ga=c[p>>2]|0;Ha=s}else{u=0;Y=190;break a}break};case 3:{Y=123;break a;break};case 6:{J=qKa(e,H,q)|0;if((J|0)!=0){u=J;Y=190;break a}wa=(c[va>>2]|0)+H|0;xa=q;Y=150;break};case 7:{J=(c[va>>2]|0)+H|0;if((c[O+2424>>2]|0)==0){if((c[m>>2]|0)==0){u=160;Y=190;break a}c[m>>2]=2;ya=T;za=I;Aa=da;Ba=F;Ca=f;Da=va;Ea=ba;Fa=J;Ga=q;Ha=s}else{ya=T;za=I;Aa=da;Ba=F;Ca=f;Da=va;Ea=ba;Fa=J;Ga=q;Ha=s}break};case 8:{J=qKa(e,H,q)|0;if((J|0)!=0){u=J;Y=190;break a}J=mKa(e,3)|0;if((J|0)!=0){u=J;Y=190;break a}J=(c[va>>2]|0)+H|0;nKa(e,J,q,0);n=(c[P+(1-ua<<2)>>2]|0)+J|0;J=(c[P+(2-ua<<2)>>2]|0)+q|0;nKa(e,n,J,0);Q=(c[P+(3-ua<<2)>>2]|0)+J|0;nKa(e,n,Q,1);ya=T;za=I;Aa=da;Ba=F;Ca=f;Da=va;Ea=ba;Fa=n;Ga=Q;Ha=s;break};case 4:{c[m>>2]=1;c[w>>2]=(c[w>>2]|0)+(c[va>>2]|0);Q=P+(1-ua<<2)|0;c[A>>2]=(c[A>>2]|0)+(c[Q>>2]|0);c[x>>2]=c[P+(2-ua<<2)>>2];c[y>>2]=c[P+(3-ua<<2)>>2];if((a[z>>0]|0)==0){ya=T;za=I;Aa=da;Ba=F;Ca=f;Da=va;Ea=ba;Fa=(c[va>>2]|0)+(c[k>>2]|0)|0;Ga=(c[Q>>2]|0)+(c[p>>2]|0)|0;Ha=s}else{u=0;Y=190;break a}break};case 5:{if(((c[m>>2]|0)+ -2|0)>>>0<2){rKa(e)}c[m>>2]=1;ya=T;za=I;Aa=da;Ba=F;Ca=f;Da=va;Ea=ba;Fa=H;Ga=q;Ha=s;break};case 12:{Q=qKa(e,H,q)|0;if((Q|0)!=0){u=Q;Y=190;break a}Q=mKa(e,3)|0;if((Q|0)!=0){u=Q;Y=190;break a}Q=(c[va>>2]|0)+q|0;nKa(e,H,Q,0);n=(c[P+(1-ua<<2)>>2]|0)+H|0;J=(c[P+(2-ua<<2)>>2]|0)+Q|0;nKa(e,n,J,0);Q=(c[P+(3-ua<<2)>>2]|0)+n|0;nKa(e,Q,J,1);ya=T;za=I;Aa=da;Ba=F;Ca=f;Da=va;Ea=ba;Fa=Q;Ga=J;Ha=s;break};case 9:{J=qKa(e,H,q)|0;if((J|0)!=0){u=J;Y=190;break a}wa=(c[va>>2]|0)+H|0;xa=(c[P+(1-ua<<2)>>2]|0)+q|0;Y=150;break};case 10:{J=(c[va>>2]|0)+H|0;Q=(c[P+(1-ua<<2)>>2]|0)+q|0;if((c[O+2424>>2]|0)==0){if((c[m>>2]|0)==0){u=160;Y=190;break a}c[m>>2]=2;ya=T;za=I;Aa=da;Ba=F;Ca=f;Da=va;Ea=ba;Fa=J;Ga=Q;Ha=s}else{ya=T;za=I;Aa=da;Ba=F;Ca=f;Da=va;Ea=ba;Fa=J;Ga=Q;Ha=s}break};case 11:{Q=qKa(e,H,q)|0;if((Q|0)!=0){u=Q;Y=190;break a}Q=mKa(e,3)|0;if((Q|0)!=0){u=Q;Y=190;break a}Q=(c[va>>2]|0)+H|0;J=(c[P+(1-ua<<2)>>2]|0)+q|0;nKa(e,Q,J,0);n=(c[P+(2-ua<<2)>>2]|0)+Q|0;Q=(c[P+(3-ua<<2)>>2]|0)+J|0;nKa(e,n,Q,0);J=(c[P+(4-ua<<2)>>2]|0)+n|0;n=(c[P+(5-ua<<2)>>2]|0)+Q|0;nKa(e,J,n,1);ya=T;za=I;Aa=da;Ba=F;Ca=f;Da=va;Ea=ba;Fa=J;Ga=n;Ha=s;break};case 1:{Y=118;break a;break};case 25:{n=c[va>>2]|0;J=c[P+(1-ua<<2)>>2]|0;c[O+2424>>2]=0;ya=T;za=I;Aa=da;Ba=F;Ca=f;Da=va;Ea=ba;Fa=n;Ga=J;Ha=s;break};case 26:case 15:{ya=T;za=I;Aa=da;Ba=F;Ca=f;Da=va;Ea=ba;Fa=H;Ga=q;Ha=s;break};default:{u=160;Y=190;break a}}}while(0);if((Y|0)==150){Y=0;J=oKa(e,wa,xa)|0;if((J|0)==0){ya=T;za=I;Aa=da;Ba=F;Ca=f;Da=va;Ea=ba;Fa=wa;Ga=xa;Ha=s}else{u=J;Y=190;break}}c[(c[j>>2]|0)+2160>>2]=Da;if(ya>>>0<Ba>>>0){D=ya;r=za;E=Aa;F=Ba;f=Ca;G=Ea;H=Fa;q=Ga;s=Ha}else{u=0;Y=190;break}}if((Y|0)==118){rKa(e);do{if(t){if((dd[c[o+8>>2]&511](c[o>>2]|0,b[(c[v>>2]|0)+2>>1]|0)|0)==0){id[c[o+24>>2]&511](c[o>>2]|0,c[v>>2]|0,c[e+76>>2]|0,c[(c[j>>2]|0)+2492>>2]|0)|0;break}else{u=160;i=h;return u|0}}}while(0);iEa(c[e+12>>2]|0);u=0;i=h;return u|0}else if((Y|0)==123){e=c[va>>2]|0;va=c[P+(2-ua<<2)>>2]|0;j=c[P+(3-ua<<2)>>2]>>16;v=c[P+(4-ua<<2)>>2]>>16;o=O+2520|0;if((a[o>>0]|0)!=0){u=160;i=h;return u|0}if((a[O+70>>0]|0)!=0){u=160;i=h;return u|0}t=O+32|0;Ha=(c[t>>2]|0)+(c[P+(1-ua<<2)>>2]|0)|0;ua=(c[(c[(c[O+4>>2]|0)+128>>2]|0)+48>>2]|0)==0;if((c[O+2380>>2]|0)==0){if(ua){u=160;i=h;return u|0}else{Ja=v;Ka=j}}else{if(ua){ua=YKa(O,j)|0;Ja=YKa(O,v)|0;Ka=ua}else{Ja=v;Ka=j}}if((Ka|Ja|0)<0){u=160;i=h;return u|0}if((a[O+69>>0]|0)!=0){j=c[O+8>>2]|0;v=c[c[j+156>>2]>>2]|0;ua=gEa(v,2)|0;if((ua|0)!=0){u=ua;i=h;return u|0}ua=c[v+88>>2]|0;c[ua>>2]=Ka;b[ua+4>>1]=514;c[ua+8>>2]=0;c[ua+12>>2]=0;c[ua+32>>2]=Ja;b[ua+36>>1]=2;c[ua+40>>2]=(KDa(Ha-e|0)|0)>>16;c[ua+44>>2]=(KDa(va)|0)>>16;c[j+128>>2]=2;c[j+132>>2]=c[v+52>>2];c[j+72>>2]=1668246896;c[v+84>>2]=2;u=0;i=h;return u|0}hEa(c[O+12>>2]|0);a[o>>0]=1;v=O+2496|0;j=dd[c[v>>2]&511](O,Ka)|0;a[o>>0]=0;if((j|0)!=0){u=j;i=h;return u|0}j=t;Ka=c[j>>2]|0;ua=c[j+4>>2]|0;j=O+40|0;P=j;s=c[P>>2]|0;Ga=c[P+4>>2]|0;c[t>>2]=0;c[O+36>>2]=0;P=O+24|0;c[P>>2]=Ha-e;e=O+28|0;c[e>>2]=va;a[o>>0]=1;va=dd[c[v>>2]&511](O,Ja)|0;a[o>>0]=0;if((va|0)!=0){u=va;i=h;return u|0}va=t;c[va>>2]=Ka;c[va+4>>2]=ua;ua=j;c[ua>>2]=s;c[ua+4>>2]=Ga;c[P>>2]=0;c[e>>2]=0;u=0;i=h;return u|0}else if((Y|0)==190){i=h;return u|0}return 0}function vKa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+16|0;g=f;h=ZDa(b,16,g)|0;j=c[g>>2]|0;if((j|0)!=0){k=j;i=f;return k|0}c[h+4>>2]=d;c[h>>2]=d;c[h+8>>2]=e;c[h+12>>2]=2;c[a>>2]=b;c[a+4>>2]=h;c[a+8>>2]=0;c[a+12>>2]=0;k=0;i=f;return k|0}function wKa(a){a=a|0;var b=0,d=0;b=i;d=a+4|0;aEa(c[a>>2]|0,c[d>>2]|0);c[d>>2]=0;i=b;return}function xKa(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0;d=i;i=i+112|0;e=d+100|0;f=d+96|0;g=d+56|0;h=d+52|0;j=d+48|0;k=d+44|0;l=d+40|0;m=d+8|0;n=d;o=c[b>>2]|0;p=b+8|0;q=c[p>>2]|0;c[l>>2]=0;if((q|0)==0){r=6;i=d;return r|0}s=b+4|0;t=LKa(c[s>>2]|0,k)|0;if(!((t|0)!=0&(c[k>>2]|0)==16)){r=2;i=d;return r|0}if((S2a(t,1273776,16)|0)!=0){r=2;i=d;return r|0}t=LKa(c[s>>2]|0,k)|0;a:do{if((t|0)!=0){u=m+4|0;v=m+8|0;w=m+16|0;x=m+24|0;y=q+4|0;z=m+12|0;A=q+8|0;B=m+20|0;C=q+12|0;D=m+28|0;E=q+16|0;F=q+20|0;G=q+24|0;H=t;I=160;b:while(1){switch(MKa(H,c[k>>2]|0)|0){case 26:{c[m>>2]=2;c[v>>2]=2;c[w>>2]=2;c[x>>2]=2;if((OKa(b,m,4)|0)!=4){J=q;K=I;break a}c[y>>2]=c[u>>2];c[A>>2]=c[z>>2];c[C>>2]=c[B>>2];c[E>>2]=c[D>>2];L=I;break};case 49:{M=25;break b;break};case 14:{c[m>>2]=2;if((OKa(b,m,1)|0)!=1){J=q;K=I;break a}c[G>>2]=c[u>>2];L=I;break};case 0:{c[m>>2]=2;if((OKa(b,m,1)|0)!=1){J=q;K=I;break a}c[F>>2]=c[u>>2];L=I;break};case 30:{c[m>>2]=4;if((OKa(b,m,1)|0)!=1){J=q;K=I;break a}a[q>>0]=a[u>>0]|0;L=I;break};case 20:{r=0;M=60;break b;break};case 40:{if((NKa(b,l)|0)!=0){J=q;K=I;break a}N=c[l>>2]|0;if((N|0)==0|(N|0)==2){L=I}else{J=q;K=7;break a}break};case 45:{c[n>>2]=0;if((NKa(b,n)|0)!=0){J=q;K=I;break a}N=c[n>>2]|0;while(1){if((N|0)==0){break}if((LKa(c[s>>2]|0,0)|0)==0){r=160;M=60;break b}else{N=N+ -1|0}}while(1){N=LKa(c[s>>2]|0,j)|0;if((N|0)==0){r=160;M=60;break b}O=MKa(N,c[j>>2]|0)|0;if((O|0)==17|(O|0)==20){L=0;break}}break};default:{L=I}}H=LKa(c[s>>2]|0,k)|0;if((H|0)==0){J=q;K=L;break a}else{I=L}}if((M|0)==25){I=LKa(c[s>>2]|0,h)|0;if((I|0)==0){J=q;K=160;break}H=g+8|0;u=g+16|0;F=g+24|0;G=g+32|0;D=g+4|0;E=g+12|0;B=g+20|0;C=g+28|0;z=g+36|0;A=g+8|0;y=g+16|0;x=g+24|0;w=g+4|0;v=g+12|0;O=g+20|0;N=g+28|0;P=I;c:while(1){switch(MKa(P,c[h>>2]|0)|0){case 53:{I=c[p>>2]|0;Q=I+32|0;if((NKa(b,Q)|0)!=0){J=q;K=160;break a}R=c[Q>>2]|0;if((R|0)!=0){S=I+28|0;c[S>>2]=dEa(c[b>>2]|0,20,0,R,0,f)|0;R=c[f>>2]|0;if((R|0)==0){T=S}else{J=q;K=R;break a}}else{T=I+28|0}I=0;d:while(1){e:while(1){R=LKa(c[s>>2]|0,e)|0;if((R|0)==0){J=q;K=160;break a}switch(MKa(R,c[e>>2]|0)|0){case 75:{break};case 20:case 21:case 23:{break d;break};case 56:{break e;break};default:{J=q;K=160;break a}}}if((I|0)>=(c[Q>>2]|0)){J=q;K=160;break a}R=c[T>>2]|0;c[g>>2]=3;c[H>>2]=2;c[u>>2]=2;c[F>>2]=2;c[G>>2]=2;if((OKa(b,g,5)|0)!=5){J=q;K=160;break a}c[R+(I*20|0)>>2]=c[D>>2];c[R+(I*20|0)+4>>2]=c[E>>2];c[R+(I*20|0)+8>>2]=c[B>>2];c[R+(I*20|0)+12>>2]=c[C>>2];c[R+(I*20|0)+16>>2]=c[z>>2];I=I+1|0}c[Q>>2]=I;break};case 20:case 21:{r=0;break c;break};case 75:{break};case 51:case 50:{R=c[p>>2]|0;S=R+40|0;f:do{if((NKa(b,S)|0)==0){U=c[S>>2]|0;if((U|0)!=0){V=R+36|0;c[V>>2]=dEa(c[b>>2]|0,16,0,U,0,f)|0;U=c[f>>2]|0;if((U|0)==0){W=V}else{X=U;break}}else{W=R+36|0}U=0;g:while(1){h:while(1){V=LKa(c[s>>2]|0,e)|0;if((V|0)==0){X=160;break f}Y=MKa(V,c[e>>2]|0)|0;switch(Y|0){case 37:case 36:case 34:{break h;break};case 20:case 21:case 22:{break g;break};case 75:{break};default:{X=160;break f}}}if((U|0)>=(c[S>>2]|0)){X=160;break f}V=c[W>>2]|0;c[g>>2]=5;c[A>>2]=5;c[y>>2]=3;c[x>>2]=3;Z=OKa(b,g,4)|0;if((Z|0)<3){X=160;break f}c[V+(U<<4)>>2]=c[w>>2];c[V+(U<<4)+4>>2]=c[v>>2];if((Y|0)==37){c[V+(U<<4)+8>>2]=0;c[V+(U<<4)+12>>2]=c[O>>2]}else{c[V+(U<<4)+8>>2]=c[O>>2];if((Y|0)==34&(Z|0)==4){_=c[N>>2]|0}else{_=0}c[V+(U<<4)+12>>2]=_}U=U+1|0}c[S>>2]=U;N1a(c[W>>2]|0,U,16,285);X=0}else{X=160}}while(0);if((X|0)!=0){J=q;K=X;break a}break};default:{J=q;K=160;break a}}P=LKa(c[s>>2]|0,h)|0;if((P|0)==0){J=q;K=160;break a}}i=d;return r|0}else if((M|0)==60){i=d;return r|0}}else{J=q;K=160}}while(0);M=q+28|0;aEa(o,c[M>>2]|0);c[M>>2]=0;c[q+32>>2]=0;M=q+36|0;aEa(o,c[M>>2]|0);c[M>>2]=0;c[q+40>>2]=0;a[J>>0]=0;r=K;i=d;return r|0}function yKa(a,b){a=a|0;b=b|0;b=i;XKa(a,0);i=b;return 0}function zKa(a){a=a|0;var b=0,d=0;b=i;d=a+16|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;i=b;return}function AKa(b,d){b=b|0;d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;if(!(d>>>0<256)){g=0;i=f;return g|0}h=Lc[c[b+20>>2]&255](e[(c[b+16>>2]|0)+(d<<1)>>1]|0)|0;d=c[b+24>>2]|0;if((d|0)==0){g=0;i=f;return g|0}j=c[b+28>>2]|0;b=0;while(1){k=c[j+(b<<2)>>2]|0;if(((k|0)!=0?(a[k>>0]|0)==(a[h>>0]|0):0)?(R2a(k,h)|0)==0:0){g=b;l=8;break}b=b+1|0;if(!(b>>>0<d>>>0)){g=0;l=8;break}}if((l|0)==8){i=f;return g|0}return 0}function BKa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=c[b>>2]|0;while(1){f=e+1|0;if(!(f>>>0<256)){g=0;h=0;break}j=AKa(a,f)|0;if((j|0)==0){e=f}else{g=f;h=j;break}}c[b>>2]=g;i=d;return h|0}function CKa(a,b){a=a|0;b=b|0;b=i;XKa(a,1);i=b;return 0}function DKa(a,b){a=a|0;b=b|0;var d=0,e=0;b=c[a>>2]|0;d=b+372|0;e=c[b+376>>2]|0;c[a+16>>2]=e;c[a+20>>2]=(c[d+8>>2]|0)-e;c[a+24>>2]=c[d+12>>2];return 0}function EKa(a){a=a|0;c[a+24>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;return}function FKa(a,b){a=a|0;b=b|0;var d=0,f=0,g=0;d=i;f=c[a+16>>2]|0;if(!(f>>>0>b>>>0)?((c[a+20>>2]|0)+f|0)>>>0>b>>>0:0){g=e[(c[a+24>>2]|0)+(b<<1)>>1]|0}else{g=0}i=d;return g|0}function GKa(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;f=(c[d>>2]|0)+1|0;g=c[a+16>>2]|0;h=f>>>0<g>>>0?g:f;f=(c[a+20>>2]|0)+g|0;if(!(h>>>0<f>>>0)){j=0;k=0;c[d>>2]=j;i=e;return k|0}g=c[a+24>>2]|0;a=h;while(1){l=b[g+(a<<1)>>1]|0;if(!(l<<16>>16==0)){m=a;break}a=a+1|0;if(!(a>>>0<f>>>0)){m=0;break}}j=m;k=l&65535;c[d>>2]=j;i=e;return k|0}function HKa(a,b){a=a|0;b=b|0;var d=0,e=0;b=i;d=c[a>>2]|0;e=Wc[c[(c[d+484>>2]|0)+4>>2]&31](c[d+100>>2]|0,a,c[d+416>>2]|0,286,0,d)|0;i=b;return e|0}function IKa(a){a=a|0;var b=0,d=0;b=i;d=a+20|0;aEa(c[(c[a>>2]|0)+100>>2]|0,c[d>>2]|0);c[d>>2]=0;c[a+16>>2]=0;i=b;return}function JKa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=dd[c[(c[(c[a>>2]|0)+484>>2]|0)+8>>2]&511](a,b)|0;i=d;return e|0}function KKa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=dd[c[(c[(c[a>>2]|0)+484>>2]|0)+12>>2]&511](a,b)|0;i=d;return e|0}function LKa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=a+12|0;if((c[e>>2]|0)<=1){QKa(a)|0}while(1){c[e>>2]=0;f=RKa(a)|0;if((f|0)!=0){g=f;h=0;break}if((c[e>>2]|0)!=2){g=0;h=1;break}}if((b|0)==0){i=d;return g|0}if(h){j=0}else{j=(c[a>>2]|0)+~g|0}c[b>>2]=j;i=d;return g|0}function MKa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;f=a[b>>0]|0;g=0;a:while(1){h=c[1273936+(g<<2)>>2]|0;b:do{if((g|0)<74?(a[h>>0]|0)==f<<24>>24:0){j=h;k=f;l=g;while(1){if(!(k<<24>>24==f<<24>>24)){m=75;n=8;break a}o=l+1|0;if((S2a(j,b,d)|0)==0){m=l;n=8;break a}if((o|0)>=74){p=o;break b}q=c[1273936+(o<<2)>>2]|0;j=q;k=a[q>>0]|0;l=o}}else{p=g}}while(0);g=p+1|0;if((g|0)>=74){m=75;n=8;break}}if((n|0)==8){i=e;return m|0}return 0}function NKa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;c[e>>2]=3;if((OKa(a,e,1)|0)!=1){f=160;i=d;return f|0}c[b>>2]=c[e+4>>2];f=0;i=d;return f|0}function OKa(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;f=i;i=i+16|0;g=f+4|0;h=f;j=c[b+4>>2]|0;if(e>>>0>5|(e|0)==0){k=0;i=f;return k|0}l=b+12|0;m=b+16|0;n=0;while(1){o=d+(n<<3)|0;if((c[o>>2]|0)==0){p=QKa(j)|0}else{p=RKa(j)|0}c[g>>2]=p;if((p|0)==0){k=n;q=19;break}r=(c[j>>2]|0)-p|0;s=r+ -1|0;a:do{switch(c[o>>2]|0){case 1:case 0:{t=EFa(c[b>>2]|0,r,h)|0;u=d+(n<<3)+4|0;c[u>>2]=t;if((c[h>>2]|0)==0){c3a(t|0,p|0,s|0)|0;a[(c[u>>2]|0)+s>>0]=0}break};case 2:{c[d+(n<<3)+4>>2]=SKa(g,p+s|0,0)|0;break};case 5:{u=c[l>>2]|0;if((u|0)==0){c[d+(n<<3)+4>>2]=0;break a}else{c[d+(n<<3)+4>>2]=Qc[u&255](p,s,c[m>>2]|0)|0;break a}break};case 4:{if((s|0)==4){v=(S2a(p,1273800,4)|0)==0&1}else{v=0}a[d+(n<<3)+4>>0]=v;break};case 3:{c[d+(n<<3)+4>>2]=TKa(g,p+s|0)|0;break};default:{}}}while(0);s=n+1|0;if(s>>>0<e>>>0){n=s}else{k=s;q=19;break}}if((q|0)==19){i=f;return k|0}return 0}function PKa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[a>>2]<<16|c[a+4>>2];a=c[b>>2]<<16|c[b+4>>2];if(e>>>0>a>>>0){f=1;i=d;return f|0}f=(e>>>0<a>>>0)<<31>>31;i=d;return f|0}function QKa(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;VKa(b);e=b+12|0;if((c[e>>2]|0)>1){f=0;i=d;return f|0}g=c[b>>2]|0;h=g+ -1|0;j=c[b+8>>2]|0;k=g;while(1){if(!(k>>>0<j>>>0)){l=3;break}g=k;k=k+1|0;c[b>>2]=k;m=a[g>>0]|0;g=m&255;if((g|0)==10|(g|0)==13){l=2;break}if(m<<24>>24==26){l=3;break}}c[e>>2]=l;f=h;i=d;return f|0}function RKa(a){a=a|0;var b=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;VKa(a);e=a+12|0;a:do{if((c[e>>2]|0)<=0){f=c[a>>2]|0;g=f+ -1|0;h=c[a+8>>2]|0;j=f;b:while(1){if(!(j>>>0<h>>>0)){k=7;break}f=j+1|0;c[a>>2]=f;switch(d[j>>0]|0|0){case 10:case 13:{k=5;break b;break};case 9:case 32:{l=g;break a;break};case 59:{k=6;break b;break};case 26:{k=7;break b;break};default:{j=f}}}if((k|0)==5){c[e>>2]=2;l=g;break}else if((k|0)==6){c[e>>2]=1;l=g;break}else if((k|0)==7){c[e>>2]=3;l=g;break}}else{l=0}}while(0);i=b;return l|0}function SKa(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;f=i;i=i+16|0;g=f;h=c[b>>2]|0;c[g>>2]=h;if(!(h>>>0<d>>>0)){j=0;i=f;return j|0}k=a[h>>0]|0;do{if(k<<24>>24==43|k<<24>>24==45){l=h+1|0;c[g>>2]=l;if((l|0)==(d|0)){j=0;i=f;return j|0}else{m=l;n=a[l>>0]|0;o=k<<24>>24==45&1;break}}else{m=h;n=k;o=0}}while(0);do{if(!(n<<24>>24==46)){k=TKa(g,d)|0;h=c[g>>2]|0;if((h|0)==(m|0)){j=0;i=f;return j|0}else{l=(k|0)>32767;p=h;q=l&1;r=l?k:k<<16;break}}else{p=m;q=0;r=0}}while(0);a:do{if(p>>>0<d>>>0?(a[p>>0]|0)==46:0){m=p+1|0;c[g>>2]=m;if(m>>>0<d>>>0){n=(r|0)==0;k=e;l=m;h=0;s=1;while(1){t=a[l>>0]|0;switch(t<<24>>24){case 0:case 12:case 9:case 10:case 13:case 32:{u=k;v=l;w=h;x=s;break a;break};default:{}}if(t<<24>>24<0){u=k;v=l;w=h;x=s;break a}y=t&127;if((y+ -48|0)>>>0>9){u=k;v=l;w=h;x=s;break a}do{if((h|0)<214748364){t=(h*10|0)+(a[1273808+y>>0]|0)|0;if(n&(k|0)>0){z=k+ -1|0;A=t;B=s;break}else{z=k;A=t;B=s*10|0;break}}else{z=k;A=h;B=s}}while(0);y=l+1|0;c[g>>2]=y;if(y>>>0<d>>>0){k=z;l=y;h=A;s=B}else{u=z;v=y;w=A;x=B;break a}}}else{u=e;v=m;w=0;x=1}}else{u=e;v=p;w=0;x=1}}while(0);p=v+1|0;if(p>>>0<d>>>0?(e=a[v>>0]|0,e<<24>>24==69|e<<24>>24==101):0){c[g>>2]=p;e=TKa(g,d)|0;d=c[g>>2]|0;if((p|0)==(d|0)){j=0;i=f;return j|0}if((e|0)>1e3){C=u;D=d;E=1;F=0}else{p=(e|0)<-1e3;C=(p?0:e)+u|0;D=d;E=q;F=p&1}}else{C=u;D=v;E=q;F=0}c[b>>2]=D;if((w|r|0)==0){j=0;i=f;return j|0}b:do{if(E<<24>>24==0){if(!(F<<24>>24==0)){j=0;i=f;return j|0}if((C|0)>0){D=C;b=w;q=x;v=r;while(1){if((v|0)>214748363){G=2147483647;break b}u=v*10|0;if((b|0)>214748363){if((q|0)==1){G=2147483647;break b}H=b;I=(q|0)/10|0}else{H=b*10|0;I=q}p=D+ -1|0;if((p|0)>0){D=p;b=H;q=I;v=u}else{J=p;K=H;L=I;M=u;break}}}else{J=C;K=w;L=x;M=r}c:do{if((J|0)<0){v=J;q=K;b=L;D=M;while(1){m=(D|0)/10|0;if((b|0)<214748364){N=q;O=b*10|0}else{N=(q|0)/10|0;O=b}v=v+1|0;if((D+9|0)>>>0<19&(N|0)==0){j=0;break}if((v|0)>=0){P=N;Q=O;R=m;break c}else{q=N;b=O;D=m}}i=f;return j|0}else{P=K;Q=L;R=M}}while(0);if((P|0)==0){G=R}else{G=(TDa(P,Q)|0)+R|0}}else{G=2147483647}}while(0);j=o<<24>>24==0?G:0-G|0;i=f;return j|0}function TKa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;i=i+16|0;f=e;g=c[b>>2]|0;c[f>>2]=g;h=UKa(f,d,10)|0;j=c[f>>2]|0;if((j|0)==(g|0)){k=0;i=e;return k|0}if(j>>>0<d>>>0?(a[j>>0]|0)==35:0){g=j+1|0;c[f>>2]=g;l=UKa(f,d,h)|0;d=c[f>>2]|0;if((d|0)==(g|0)){k=0;i=e;return k|0}else{m=d;n=l}}else{m=j;n=h}c[b>>2]=m;k=n;i=e;return k|0}function UKa(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;f=i;g=c[b>>2]|0;if(!(g>>>0<d>>>0)){h=0;i=f;return h|0}if((e+ -2|0)>>>0>34){h=0;i=f;return h|0}j=a[g>>0]|0;if(j<<24>>24==43|j<<24>>24==45){k=g+1|0;if((k|0)==(d|0)){h=0;i=f;return h|0}else{l=k;m=j<<24>>24==45&1}}else{l=g;m=0}g=2147483647/(e|0)|0;a:do{if(l>>>0<d>>>0){j=(2147483647%(e|0)|0)<<24>>24;k=0;n=0;o=l;while(1){p=a[o>>0]|0;switch(p<<24>>24){case 0:case 12:case 9:case 10:case 13:case 32:{q=k;r=n;s=o;break a;break};default:{}}if(p<<24>>24<0){q=k;r=n;s=o;break a}t=a[1273808+(p&127)>>0]|0;p=t<<24>>24;if(!(t<<24>>24>-1&(p|0)<(e|0))){q=k;r=n;s=o;break a}if((n|0)<=(g|0)){if((n|0)==(g|0)&(p|0)>(j|0)){u=1;v=g}else{u=k;v=p+(ca(n,e)|0)|0}}else{u=1;v=n}p=o+1|0;if(p>>>0<d>>>0){k=u;n=v;o=p}else{q=u;r=v;s=p;break a}}}else{q=0;r=0;s=l}}while(0);c[b>>2]=s;s=q<<24>>24==0?r:2147483647;h=m<<24>>24==0?s:0-s|0;i=f;return h|0}function VKa(a){a=a|0;var b=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;e=a+12|0;a:do{if((c[e>>2]|0)<=0){f=c[a>>2]|0;g=c[a+8>>2]|0;b:do{if(f>>>0<g>>>0){h=f;c:while(1){j=h;h=h+1|0;c[a>>2]=h;switch(d[j>>0]|0|0){case 10:case 13:{k=5;break c;break};case 9:case 32:{break};case 59:{k=6;break c;break};case 26:{break b;break};default:{break a}}if(!(h>>>0<g>>>0)){break b}}if((k|0)==5){c[e>>2]=2;break a}else if((k|0)==6){c[e>>2]=1;break a}}}while(0);c[e>>2]=3}}while(0);i=b;return}function WKa(a,b){a=a|0;b=b|0;return c[(c[a+420>>2]|0)+(b<<2)>>2]|0}function XKa(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[a>>2]|0;e=c[d+484>>2]|0;c[a+24>>2]=c[d+416>>2];c[a+28>>2]=c[d+420>>2];c[a+20>>2]=c[e+20>>2];c[a+16>>2]=c[((b|0)==0?e+24|0:e+28|0)>>2];return}function YKa(b,d){b=b|0;d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;g=c[b+2372>>2]|0;if(d>>>0>255){h=-1;i=f;return h|0}j=Lc[c[g+20>>2]&255](e[(c[g+24>>2]|0)+(d<<1)>>1]|0)|0;d=c[b+2376>>2]|0;if((d|0)==0){h=-1;i=f;return h|0}g=c[b+2380>>2]|0;b=0;while(1){k=c[g+(b<<2)>>2]|0;if(((k|0)!=0?(a[k>>0]|0)==(a[j>>0]|0):0)?(R2a(k,j)|0)==0:0){h=b;l=8;break}b=b+1|0;if(!(b>>>0<d>>>0)){h=-1;l=8;break}}if((l|0)==8){i=f;return h|0}return 0}function ZKa(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;if((c|0)<1){i=f;return}g=b+ -1-(b+c)|0;h=~c;c=~(g>>>0>h>>>0?g:h);h=0;g=e&65535;while(1){e=b+h|0;j=d[e>>0]|0;a[e>>0]=j^g>>>8;h=h+1|0;if((h|0)==(c|0)){break}else{g=((j+g|0)*52845|0)+22719&65535}}i=f;return}function _Ka(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+16|0;f=e;g=c[b>>2]|0;c[f>>2]=g;a:do{if(g>>>0<d>>>0){h=g;while(1){switch(a[h>>0]|0){case 37:{aLa(f,d);j=c[f>>2]|0;break};case 0:case 12:case 9:case 10:case 13:case 32:{j=h;break};default:{k=h;break a}}l=j+1|0;c[f>>2]=l;if(l>>>0<d>>>0){h=l}else{k=l;break a}}}else{k=g}}while(0);c[b>>2]=k;i=e;return}function $Ka(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;h=i;i=i+16|0;j=h+4|0;k=h;l=c[b>>2]|0;c[j>>2]=l;a:do{if(l>>>0<d>>>0){m=a[l>>0]|0;if(!(m<<24>>24==91)){if(m<<24>>24==123){n=125;o=4}else{p=0;q=l;r=0}}else{n=93;o=4}if((o|0)==4){m=l+1|0;c[j>>2]=m;p=1;q=m;r=n}m=(f|0)!=0;s=m^1;t=p;u=q;v=0;while(1){if(!(u>>>0<d>>>0)){w=u;x=v;break a}_Ka(j,d);y=c[j>>2]|0;if(!(y>>>0<d>>>0)){w=y;x=v;break a}if((a[y>>0]|0)==r<<24>>24){break}if(!((v|0)<(e|0)|s)){w=y;x=v;break a}z=SKa(j,d,g)|0;if(m){A=f+(v<<2)|0}else{A=k}c[A>>2]=z;z=c[j>>2]|0;if((y|0)==(z|0)){w=y;x=-1;break a}B=v+1|0;if(t){t=1;u=z;v=B}else{w=z;x=B;break a}}u=y+1|0;c[j>>2]=u;w=u;x=v}else{w=l;x=0}}while(0);c[b>>2]=w;i=h;return x|0}function aLa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=c[b>>2]|0;a:do{if(f>>>0<d>>>0){g=f;while(1){h=a[g>>0]|0;if(h<<24>>24==10|h<<24>>24==13){j=g;break a}h=g+1|0;if(h>>>0<d>>>0){g=h}else{j=h;break}}}else{j=f}}while(0);c[b>>2]=j;i=e;return}function bLa(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=i;g=c[b>>2]|0;a:do{if(g>>>0<e>>>0){h=g;j=0;while(1){k=h;b:while(1){l=a[k>>0]|0;m=k+1|0;c:do{if(l<<24>>24==92){if((m|0)==(e|0)){n=e;o=3;break a}switch(d[m>>0]|0|0){case 41:case 40:case 92:case 102:case 98:case 116:case 114:case 110:{p=k+2|0;break c;break};default:{}}if(m>>>0<e>>>0){q=m;r=0;while(1){if(!(((a[q>>0]|0)+ -48<<24>>24&255)<8)){p=q;break c}s=q+1|0;r=r+1|0;if(!(r>>>0<3&s>>>0<e>>>0)){p=s;break}else{q=s}}}else{p=m}}else if(l<<24>>24==40){t=11;break b}else if(l<<24>>24==41){t=13;break b}else{p=m}}while(0);if(p>>>0<e>>>0){k=p}else{n=p;o=3;break a}}if((t|0)==11){t=0;u=j+1|0}else if((t|0)==13){t=0;k=j+ -1|0;if((k|0)==0){n=m;o=0;break a}else{u=k}}if(m>>>0<e>>>0){h=m;j=u}else{n=m;o=3;break}}}else{n=g;o=3}}while(0);c[b>>2]=n;i=f;return o|0}function cLa(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;i=i+16|0;f=e;g=c[a>>2]|0;c[f>>2]=g;a:do{if(g>>>0<b>>>0){h=0;j=g;b:while(1){switch(d[j>>0]|0|0){case 125:{k=h+ -1|0;if((k|0)==0){break b}else{l=k;m=0}break};case 60:{l=h;m=dLa(f,b)|0;break};case 37:{aLa(f,b);l=h;m=0;break};case 40:{l=h;m=bLa(f,b)|0;break};case 123:{l=h+1|0;m=0;break};default:{l=h;m=0}}k=(c[f>>2]|0)+1|0;c[f>>2]=k;if(k>>>0<b>>>0&(m|0)==0){h=l;j=k}else{n=k;o=l;p=m;break a}}h=j+1|0;c[f>>2]=h;n=h;o=0;p=0}else{n=g;o=0;p=0}}while(0);c[a>>2]=n;i=e;return((o|0)==0?p:3)|0}function dLa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;i=i+16|0;f=e;g=c[b>>2]|0;c[f>>2]=g;h=g;while(1){g=h+1|0;c[f>>2]=g;if(!(g>>>0<d>>>0)){j=g;break}_Ka(f,d);g=c[f>>2]|0;if(!(g>>>0<d>>>0)){j=g;break}k=a[g>>0]|0;if((k+ -48<<24>>24&255)<10|(k+ -65<<24>>24&255)<6|(k+ -97<<24>>24&255)<6){h=g}else{j=g;break}}if(j>>>0<d>>>0?(a[j>>0]|0)!=62:0){l=j;m=3;c[b>>2]=l;i=e;return m|0}d=j+1|0;c[f>>2]=d;l=d;m=0;c[b>>2]=l;i=e;return m|0}function eLa(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;g=i;h=f<<1;f=c[b>>2]|0;if(!(f>>>0<d>>>0)){j=0;i=g;return j|0}k=d-f|0;d=h>>>0>k>>>0?k:h;if((d|0)!=0){h=1;k=0;l=0;a:while(1){m=a[f+k>>0]|0;switch(m<<24>>24){case 0:case 9:case 10:case 12:case 13:case 32:{n=h;o=l;break};default:{if(m<<24>>24<0){p=h;q=k;r=l;break a}s=a[1273808+(m&127)>>0]|0;if((s&255)>15){p=h;q=k;r=l;break a}m=s<<24>>24|h<<4;if((m&256|0)==0){n=m;o=l}else{a[e+l>>0]=m;n=1;o=l+1|0}}}m=k+1|0;if(m>>>0<d>>>0){h=n;k=m;l=o}else{p=n;q=m;r=o;break}}if((p|0)==1){t=q;u=r}else{a[e+r>>0]=p<<4;t=q;u=r+1|0}}else{t=0;u=0}c[b>>2]=f+t;j=u;i=g;return j|0}function fLa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;g=a-e|0;e=d+(b<<2)|0;if((b|0)>0){h=d}else{i=f;return}do{d=c[h>>2]|0;if((d|0)!=0){c[h>>2]=d+g}h=h+4|0}while(h>>>0<e>>>0);i=f;return}function gLa(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0;j=i;i=i+208|0;k=j+136|0;l=j+128|0;m=j;n=f+2|0;o=b[n>>1]|0;if(o<<16>>16==0){p=0;i=j;return p|0}if((b[f>>1]|0)==0){p=0;i=j;return p|0}q=m+0|0;r=q+128|0;do{c[q>>2]=0;q=q+4|0}while((q|0)<(r|0));q=c[g>>2]|0;r=m+16|0;c[r>>2]=q;s=m+8|0;c[s>>2]=dEa(q,40,0,o<<16>>16,0,k)|0;o=c[k>>2]|0;if((o|0)==0){t=dEa(q,8,0,b[f>>1]|0,0,k)|0;u=m+12|0;c[u>>2]=t;v=c[k>>2]|0;if((v|0)==0){w=b[n>>1]|0;c[m>>2]=w;n=b[f>>1]|0;x=m+4|0;c[x>>2]=n<<16>>16;y=c[s>>2]|0;if(n<<16>>16==0){z=w;A=y}else{w=f+12|0;n=t;t=0;B=0;while(1){C=b[(c[w>>2]|0)+(B<<1)>>1]|0;D=t;t=C+1|0;E=t-D|0;F=y+(D*40|0)|0;c[n>>2]=F;c[n+4>>2]=E;if((E|0)>0){G=y+(C*40|0)|0;c[F>>2]=G;c[y+(D*40|0)+8>>2]=n;if((E|0)>1){D=E;E=F;do{C=E;E=E+40|0;c[C+4>>2]=E;c[E>>2]=C;c[C+48>>2]=n;D=D+ -1|0}while((D|0)>1);H=G}else{H=F}c[H+4>>2]=F}B=B+1|0;if(!(B>>>0<(c[x>>2]|0)>>>0)){break}else{n=n+8|0}}z=c[m>>2]|0;A=c[s>>2]|0}n=c[f+4>>2]|0;if((z|0)==0){I=0;J=A}else{z=A;B=f+8|0;H=0;y=A;while(1){A=((c[y>>2]|0)-z|0)/40|0;t=((c[y+4>>2]|0)-z|0)/40|0;w=y+12|0;if((a[(c[B>>2]|0)+H>>0]&1)==0){c[w>>2]=1;K=1}else{K=c[w>>2]|0}G=n+(H<<3)|0;D=(c[G>>2]|0)-(c[n+(A<<3)>>2]|0)|0;E=n+(H<<3)+4|0;C=(c[E>>2]|0)-(c[n+(A<<3)+4>>2]|0)|0;A=VLa(D,C)|0;a[y+20>>0]=A;L=(c[n+(t<<3)>>2]|0)-(c[G>>2]|0)|0;G=(c[n+(t<<3)+4>>2]|0)-(c[E>>2]|0)|0;E=VLa(L,G)|0;a[y+21>>0]=E;do{if((K&1|0)==0){t=A<<24>>24;if((t|0)==(E<<24>>24|0)){if((t|0)==4?(XDa(D,C,L,G)|0)==0:0){break}c[w>>2]=K|2}}else{c[w>>2]=K|2}}while(0);H=H+1|0;M=c[m>>2]|0;if(!(H>>>0<M>>>0)){break}else{y=y+40|0}}I=M;J=c[s>>2]|0}M=m+20|0;c[M>>2]=f;y=m+24|0;c[y>>2]=g;iLa(I,J,f,0);if((c[x>>2]|0)!=0){f=0;do{J=c[u>>2]|0;a:do{if(!((c[J+(f<<3)+4>>2]|0)>>>0<4)){I=c[J+(f<<3)>>2]|0;H=I+28|0;K=I+32|0;n=I;do{n=c[n+4>>2]|0;if((n|0)==(I|0)){break a}N=c[n+28>>2]|0;O=c[H>>2]|0;P=c[n+32>>2]|0;Q=c[K>>2]|0}while((N|0)==(O|0)&(P|0)==(Q|0));K=N-O|0;H=P-Q|0;B=c[I>>2]|0;if((B|0)!=(I|0)){z=B;B=O;w=Q;G=I;while(1){L=z+28|0;C=c[L>>2]|0;D=B-C|0;E=z+32|0;A=c[E>>2]|0;F=w-A|0;if(!((B|0)==(C|0)&(w|0)==(A|0))?(A=WDa(K,H,D,F)|0,(A|0)!=0):0){R=n;S=D;T=F;U=A;V=G;break}A=c[z>>2]|0;if((A|0)==(I|0)){break a}F=z;z=A;B=c[L>>2]|0;w=c[E>>2]|0;G=F}while(1){w=R;B=0;while(1){W=c[w+4>>2]|0;z=B;B=(W|0)==(G|0)?1:B;z=c[W+28>>2]|0;I=c[w+28>>2]|0;X=z-I|0;n=c[W+32>>2]|0;H=c[w+32>>2]|0;Y=n-H|0;if((z|0)==(I|0)&(n|0)==(H|0)){w=W;B=B;continue}Z=WDa(S,T,X,Y)|0;if((Z|0)!=0){break}else{w=W}}if((Z^U|0)<0){H=V;do{n=H+12|0;c[n>>2]=c[n>>2]|4;H=c[H+4>>2]|0}while((H|0)!=(w|0));H=w+12|0;c[H>>2]=c[H>>2]|4}if((B|0)==0){R=W;S=X;T=Y;U=Z;V=w}else{break}}}}}while(0);f=f+1|0}while(f>>>0<(c[x>>2]|0)>>>0)}f=WLa(m+28|0,e+16|0,e+28|0,q)|0;c[k>>2]=f;if((f|0)==0){V=WLa(m+68|0,e+52|0,e+64|0,q)|0;if((V|0)==0){q=c[y>>2]|0;e=c[q+200>>2]|0;Z=c[q+404>>2]|0;q=SDa(c[g+416>>2]|0,Z)|0;U=q+32&-64;if((U|0)==0|(q|0)==(U|0)){_=0}else{Y=ODa(Z,U,q)|0;if((U|0)<(q|0)){$=e-((e|0)/50|0)|0}else{$=e}hLa(c[y>>2]|0,$,Y,0,0)|0;_=1}a[m+120>>0]=1;a[m+121>>0]=1;if((h|0)==2){a[m+122>>0]=1;aa=1}else{a[m+122>>0]=(h|0)==3&1;aa=(h|0)==4&1}a[m+123>>0]=aa;a[m+124>>0]=(h|0)!=1&1;h=g+412|0;aa=g+416|0;Y=g+928|0;$=g+2488|0;q=g+2492|0;U=g+2484|0;T=g+428|0;X=_<<24>>24==0;_=0;while(1){iLa(c[m>>2]|0,c[s>>2]|0,c[M>>2]|0,_);S=c[x>>2]|0;b:do{if((S|0)==0){ba=0}else{W=S;R=0;while(1){Q=c[u>>2]|0;O=c[Q+(R<<3)>>2]|0;if((c[Q+(R<<3)+4>>2]|0)==0){ca=W}else{Q=O+28|0;P=O;do{P=c[P>>2]|0;if((P|0)==(O|0)){da=R;ea=82;break b}}while((c[P+28>>2]|0)==(c[Q>>2]|0));Q=c[P+4>>2]|0;O=P;w=Q;c:while(1){B=w+28|0;N=w;do{N=c[N+4>>2]|0;if((N|0)==(Q|0)){break c}fa=c[N+28>>2]|0;ga=c[B>>2]|0}while((fa|0)==(ga|0));if((c[O+28>>2]|0)<(ga|0)){if((fa|0)<(ga|0)){ha=w;ea=67}}else{if((fa|0)>(ga|0)){ha=w;ea=67}}if((ea|0)==67){while(1){ea=0;B=ha+16|0;c[B>>2]=c[B>>2]|64;ha=c[ha+4>>2]|0;if((ha|0)==(N|0)){break}else{ea=67}}}O=c[N>>2]|0;w=N}ca=c[x>>2]|0}R=R+1|0;if(!(R>>>0<ca>>>0)){ba=0;break}else{W=ca}}}}while(0);d:while(1){if((ea|0)==82){ea=0;ba=da+1|0}if(!(ba>>>0<(c[m>>2]|0)>>>0)){break}S=c[s>>2]|0;W=S+(ba*40|0)|0;R=S+(ba*40|0)+16|0;w=c[R>>2]|0;if((w&64|0)==0){da=ba;ea=82;continue}O=S+(ba*40|0)+32|0;S=W;while(1){S=c[S>>2]|0;if((S|0)==(W|0)){da=ba;ea=82;continue d}ia=c[S+32>>2]|0;ja=c[O>>2]|0;if((ia|0)!=(ja|0)){ka=W;break}}while(1){ka=c[ka+4>>2]|0;if((ka|0)==(W|0)){da=ba;ea=82;continue d}la=c[ka+32>>2]|0;if((la|0)!=(ja|0)){break}}if((ia|0)<(ja|0)&(la|0)>(ja|0)){c[R>>2]=w|128;da=ba;ea=82;continue}if(!((ia|0)>(ja|0)&(la|0)<(ja|0))){da=ba;ea=82;continue}c[R>>2]=w|256;da=ba;ea=82}W=m+(_*40|0)+28|0;O=c[y>>2]|0;S=c[W>>2]|0;if((S|0)==0){ma=O}else{Q=S;S=c[m+(_*40|0)+36>>2]|0;while(1){TLa(S,O,_,m);Q=Q+ -1|0;if((Q|0)==0){break}else{S=S+28|0}}ma=c[y>>2]|0}S=m+(_*40|0)+60|0;Q=c[S>>2]|0;O=c[Q+8>>2]|0;P=c[Q>>2]|0;Q=(_|0)==0;B=Q?1:2;J=TDa(32,c[ma+(_*204|0)+200>>2]|0)|0;G=(J|0)>30?30:J;if(P>>>0>1){J=c[m>>2]|0;if((J|0)!=0){H=c[O+12>>2]|0;n=m+(_*40|0)+32|0;I=m+(_*40|0)+40|0;z=O;K=J;F=H>>>0>J>>>0?J:H;H=P;while(1){J=z+16|0;E=c[z+28>>2]|0;L=E>>>0>K>>>0?K:E;E=L-F|0;if((E|0)>0){A=(c[s>>2]|0)+(F*40|0)|0;RLa(W,c[J>>2]|0,c[z+24>>2]|0);SLa(c[n>>2]|0,c[I>>2]|0,A,E,G,B)}E=H+ -1|0;if(!(E>>>0>1)){break}z=J;K=c[m>>2]|0;F=L;H=E}na=n;oa=I;pa=c[(c[S>>2]|0)+8>>2]|0;ea=97}}else{if((P|0)==1){na=m+(_*40|0)+32|0;oa=m+(_*40|0)+40|0;pa=O;ea=97}else{ea=98}}if((ea|0)==97){ea=0;H=c[m>>2]|0;F=c[s>>2]|0;RLa(W,c[pa>>2]|0,c[pa+8>>2]|0);SLa(c[na>>2]|0,c[oa>>2]|0,F,H,G,B);ea=98}if((ea|0)==98?(ea=0,H=c[m>>2]|0,(H|0)!=0):0){F=H;H=c[s>>2]|0;while(1){do{if((c[H+24>>2]|0)!=0){K=H+16|0;z=c[K>>2]|0;if((z&16|0)!=0){break}c[K>>2]=z|16}}while(0);F=F+ -1|0;if((F|0)==0){break}else{H=H+40|0}}}if((_|0)==1){H=c[m>>2]|0;if((H|0)==0){qa=0}else{F=H;H=c[s>>2]|0;while(1){B=a[H+20>>0]|0;if(!(!(B<<24>>24==-2|B<<24>>24==2)?(B=a[H+21>>0]|0,!(B<<24>>24==-2|B<<24>>24==2)):0)){ea=109}e:do{if((ea|0)==109){ea=0;B=H+16|0;G=c[B>>2]|0;if((G&16|0)!=0){break}W=c[H+28>>2]|0;O=c[h>>2]|0;f:do{if((O|0)==0){ra=G}else{P=H+36|0;S=W-(c[T>>2]|0)|0;I=c[$>>2]|0;if((S|0)<(0-I|0)){ra=G;break}else{sa=I;ta=S;ua=G;va=O;wa=aa}while(1){do{if((W|0)>((c[wa+8>>2]|0)+sa|0)){xa=ua}else{if((a[q>>0]|0)==0?(ta|0)>(c[U>>2]|0):0){xa=ua;break}c[P>>2]=c[wa+24>>2];S=ua|48;c[B>>2]=S;xa=S}}while(0);va=va+ -1|0;if((va|0)==0){ra=xa;break f}ta=W-(c[wa+44>>2]|0)|0;sa=c[$>>2]|0;if((ta|0)<(0-sa|0)){ra=xa;break}else{ua=xa;wa=wa+32|0}}}}while(0);O=c[Y>>2]|0;if((O|0)==0){break}G=O+ -1|0;P=H+36|0;N=(c[g+(G<<5)+940>>2]|0)-W|0;S=c[$>>2]|0;if((N|0)<(0-S|0)){break}I=S;S=N;N=ra;n=O;O=g+(G<<5)+932|0;while(1){do{if((W|0)<((c[O+12>>2]|0)-I|0)){ya=N}else{if((a[q>>0]|0)==0?(S|0)>=(c[U>>2]|0):0){ya=N;break}c[P>>2]=c[O+28>>2];G=N|48;c[B>>2]=G;ya=G}}while(0);n=n+ -1|0;if((n|0)==0){break e}S=(c[O+ -24>>2]|0)-W|0;I=c[$>>2]|0;if((S|0)<(0-I|0)){break}else{N=ya;O=O+ -32|0}}}}while(0);F=F+ -1|0;if((F|0)==0){ea=128;break}else{H=H+40|0}}}}else{ea=128}if((ea|0)==128){ea=0;H=c[m>>2]|0;F=c[(c[y>>2]|0)+(_*204|0)+200>>2]|0;if((H|0)==0){qa=0}else{O=H;H=c[s>>2]|0;while(1){N=c[H+24>>2]|0;if((N|0)!=0){I=H+16|0;S=c[I>>2]|0;do{if((S&512|0)==0){if((S&1024|0)!=0){c[H+36>>2]=(c[N+12>>2]|0)+(c[N+8>>2]|0);za=S;break}W=(c[H+28>>2]|0)-(c[N>>2]|0)|0;if((W|0)<1){n=c[N+8>>2]|0;c[H+36>>2]=(SDa(W,F)|0)+n;za=S;break}n=c[N+4>>2]|0;B=c[N+8>>2]|0;P=c[N+12>>2]|0;if((W|0)<(n|0)){c[H+36>>2]=(ODa(W,P,n)|0)+B;za=c[I>>2]|0;break}else{c[H+36>>2]=P+B+(SDa(W-n|0,F)|0);za=S;break}}else{c[H+36>>2]=c[N+8>>2];za=S}}while(0);c[I>>2]=za|32}O=O+ -1|0;if((O|0)==0){break}else{H=H+40|0}}qa=c[m>>2]|0}}H=c[(c[y>>2]|0)+(_*204|0)+200>>2]|0;O=c[r>>2]|0;F=c[s>>2]|0;S=F+(qa*40|0)|0;do{if((qa|0)>0){N=0;n=F;do{N=((c[n+16>>2]|0)>>>4&1)+N|0;n=n+40|0}while(n>>>0<S>>>0);if((N|0)!=0){if(!(N>>>0<17)){n=dEa(O,4,0,N,0,l)|0;if((c[l>>2]|0)==0){Aa=n}else{break}}else{Aa=k}n=0;I=F;while(1){if((c[I+16>>2]&16|0)==0){Ba=n}else{W=Aa+(n<<2)|0;g:do{if((n|0)>0){B=I+28|0;P=W;while(1){G=P+ -4|0;w=c[G>>2]|0;if((c[w+28>>2]|0)<=(c[B>>2]|0)){Ca=P;break g}c[P>>2]=w;if(G>>>0>Aa>>>0){P=G}else{Ca=G;break}}}else{Ca=W}}while(0);c[Ca>>2]=I;Ba=n+1|0}I=I+40|0;if(!(I>>>0<S>>>0)){break}else{n=Ba}}n=(Ba|0)==0;I=Aa+(Ba+ -1<<2)|0;N=F;do{W=N+16|0;P=c[W>>2]|0;do{if((P&16|0)==0){B=N+12|0;G=c[B>>2]|0;if((G&2|0)!=0){w=a[N+20>>0]|0;if(w<<24>>24==4){break}if(!(w<<24>>24==(a[N+21>>0]|0))){break}if((P&64|0)==0?(G&4|0)==0:0){break}c[B>>2]=G&-3}G=c[N+28>>2]|0;do{if(!n){B=0;while(1){w=B+1|0;if((c[(c[Aa+(B<<2)>>2]|0)+28>>2]|0)>(G|0)){Da=B;break}if(w>>>0<Ba>>>0){B=w}else{Da=w;break}}if((Da|0)==0){ea=168;break}B=c[Aa+(Da+ -1<<2)>>2]|0;w=Ba;while(1){if((w|0)==0){Ea=0;break}R=w+ -1|0;if((c[(c[Aa+(R<<2)>>2]|0)+28>>2]|0)<(G|0)){Ea=w;break}else{w=R}}if((Ea|0)==(Ba|0)){w=c[I>>2]|0;R=c[w+36>>2]|0;c[N+36>>2]=(SDa(G-(c[w+28>>2]|0)|0,H)|0)+R;Fa=P;break}R=c[Aa+(Ea<<2)>>2]|0;w=c[B+28>>2]|0;if((G|0)==(w|0)){c[N+36>>2]=c[B+36>>2];Fa=P;break}z=c[R+28>>2]|0;if((G|0)==(z|0)){c[N+36>>2]=c[R+36>>2];Fa=P;break}else{K=c[B+36>>2]|0;c[N+36>>2]=(ODa(G-w|0,(c[R+36>>2]|0)-K|0,z-w|0)|0)+K;Fa=c[W>>2]|0;break}}else{ea=168}}while(0);if((ea|0)==168){ea=0;K=c[Aa>>2]|0;w=c[K+36>>2]|0;c[N+36>>2]=(SDa(G-(c[K+28>>2]|0)|0,H)|0)+w;Fa=P}c[W>>2]=Fa|32}}while(0);N=N+40|0}while(N>>>0<S>>>0);if((Aa|0)==(k|0)){break}aEa(O,Aa)}}}while(0);O=c[y>>2]|0;S=c[O+(_*204|0)+200>>2]|0;H=c[x>>2]|0;if((H|0)!=0){F=c[u>>2]|0;N=c[O+(_*204|0)+204>>2]|0;O=H;while(1){H=c[F>>2]|0;I=c[F+4>>2]|0;n=H+(I*40|0)|0;h:do{if((I|0)>0){W=0;P=0;w=H;while(1){if((c[w+16>>2]&32|0)==0){Ga=W;Ha=P}else{Ga=(W|0)==0?w:W;Ha=P+1|0}w=w+40|0;if(!(w>>>0<n>>>0)){break}else{W=Ga;P=Ha}}if(Ha>>>0<2){if((Ha|0)==1){P=c[Ga+36>>2]|0;Ia=P-(SDa(c[Ga+28>>2]|0,S)|0)|0}else{Ia=N}P=H;while(1){if((P|0)!=(Ga|0)){c[P+36>>2]=(SDa(c[P+28>>2]|0,S)|0)+Ia}P=P+40|0;if(!(P>>>0<n>>>0)){Ja=Ia;break h}}}P=c[Ga+4>>2]|0;if((P|0)==(Ga|0)){Ja=N;break}else{Ka=P;La=Ga}while(1){if((c[Ka+16>>2]&32|0)==0){P=Ka;do{P=c[P+4>>2]|0}while((c[P+16>>2]&32|0)==0);G=c[La+28>>2]|0;W=c[P+28>>2]|0;if((G|0)>(W|0)){w=c[P+36>>2]|0;Ma=w;Na=(c[La+36>>2]|0)-w|0;Oa=W;Pa=G-W|0}else{w=c[La+36>>2]|0;Ma=w;Na=(c[P+36>>2]|0)-w|0;Oa=G;Pa=W-G|0}if((Pa|0)>0){Qa=TDa(Na,Pa)|0}else{Qa=65536}G=Na+Ma|0;W=Ka;do{w=(c[W+28>>2]|0)-Oa|0;do{if((w|0)>=1){if((w|0)<(Pa|0)){Ra=(SDa(w,Qa)|0)+Ma|0;break}else{Ra=G+(SDa(w-Pa|0,S)|0)|0;break}}else{Ra=(SDa(w,S)|0)+Ma|0}}while(0);c[W+36>>2]=Ra;W=c[W+4>>2]|0}while((W|0)!=(P|0));if((P|0)==(Ga|0)){Ja=N;break h}else{Sa=P}}else{Sa=Ka}Ka=c[Sa+4>>2]|0;if((Ka|0)==(Ga|0)){Ja=N;break}else{La=Sa}}}else{Ja=N}}while(0);O=O+ -1|0;if((O|0)==0){break}else{F=F+8|0;N=Ja}}}N=c[M>>2]|0;F=c[N+4>>2]|0;O=c[N+8>>2]|0;if((c[m>>2]|0)!=0){N=Q?32:64;S=0;n=c[s>>2]|0;while(1){H=c[n+36>>2]|0;if(Q){c[F+(S<<3)>>2]=H}else{c[F+(S<<3)+4>>2]=H}if((c[n+16>>2]&16|0)!=0){H=O+S|0;a[H>>0]=d[H>>0]|N}S=S+1|0;if(!(S>>>0<(c[m>>2]|0)>>>0)){break}else{n=n+40|0}}}if(!X){hLa(c[y>>2]|0,e,Z,0,0)|0}_=_+1|0;if((_|0)==2){Ta=u;Ua=0;break}}}else{Ta=u;Ua=V}}else{Ta=u;Ua=f}}else{Ta=u;Ua=v}}else{Ta=m+12|0;Ua=o}o=c[r>>2]|0;QLa(m+68|0,o);QLa(m+28|0,o);aEa(o,c[s>>2]|0);c[s>>2]=0;aEa(o,c[Ta>>2]|0);c[Ta>>2]=0;c[m>>2]=0;c[m+4>>2]=0;c[r>>2]=0;p=Ua;i=j;return p|0}function hLa(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;h=i;j=b+200|0;k=b+204|0;if(!((c[j>>2]|0)==(d|0)?(c[k>>2]|0)==(f|0):0)){c[j>>2]=d;c[k>>2]=f;ULa(b,0)}f=b+404|0;k=b+408|0;if((c[f>>2]|0)==(e|0)?(c[k>>2]|0)==(g|0):0){i=h;return 0}c[f>>2]=e;c[k>>2]=g;ULa(b,1);if((e|0)>34359737){a[b+2492>>0]=((c[b+2476>>2]<<3|0)/125|0|0)>(e|0)&1}else{a[b+2492>>0]=(e*125|0)<(c[b+2476>>2]<<3|0)&1}k=c[b+2480>>2]|0;a:do{if((k|0)>0){f=k;while(1){d=f+ -1|0;if((SDa(f,e)|0)<=32){l=f;break a}if((d|0)>0){f=d}else{l=d;break}}}else{l=k}}while(0);c[b+2484>>2]=l;l=b+1960|0;k=b+412|0;f=b+928|0;d=b+1444|0;b=0;do{if((b|0)==0){m=k}else if((b|0)==2){m=d}else if((b|0)==1){m=f}else{m=l}j=c[m>>2]|0;if((j|0)!=0){n=j;j=m+4|0;while(1){c[j+28>>2]=(SDa(c[j+8>>2]|0,e)|0)+g;c[j+24>>2]=(SDa(c[j+12>>2]|0,e)|0)+g;o=(SDa(c[j>>2]|0,e)|0)+g|0;c[j+20>>2]=SDa(c[j+4>>2]|0,e)|0;c[j+16>>2]=o+32&-64;n=n+ -1|0;if((n|0)==0){break}else{j=j+32|0}}}b=b+1|0}while((b|0)!=4);p=0;do{b=(p|0)==0;g=b?k:f;m=b?d:l;b=c[g>>2]|0;b:do{if((b|0)!=0){j=m+4|0;n=b;o=g+4|0;while(1){q=c[m>>2]|0;c:do{if((q|0)!=0){r=c[o>>2]|0;s=q;t=j;while(1){u=r-(c[t>>2]|0)|0;if((SDa((u|0)<0?0-u|0:u,e)|0)<64){break}s=s+ -1|0;if((s|0)==0){break c}else{t=t+32|0}}c[o+28>>2]=c[t+28>>2];c[o+24>>2]=c[t+24>>2];c[o+16>>2]=c[t+16>>2];c[o+20>>2]=c[t+20>>2]}}while(0);q=n+ -1|0;if((q|0)==0){break b}n=q;o=o+32|0}}}while(0);p=p+1|0}while((p|0)!=2);i=h;return 0}function iLa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;if((a|0)==0){i=f;return}g=(e|0)==0;e=a;a=b;b=c[d+4>>2]|0;while(1){c[a+16>>2]=0;c[a+24>>2]=0;if(g){c[a+28>>2]=c[b>>2];c[a+32>>2]=c[b+4>>2]}else{c[a+28>>2]=c[b+4>>2];c[a+32>>2]=c[b>>2]}e=e+ -1|0;if((e|0)==0){break}else{a=a+40|0;b=b+8|0}}i=f;return}function jLa(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=c[b+8>>2]|0;f=b+12|0;g=f+0|0;h=g+88|0;do{c[g>>2]=0;g=g+4|0}while((g|0)<(h|0));c[f>>2]=e;c[b+100>>2]=224;c[b+104>>2]=85;c[b+108>>2]=570;e=b+112|0;g=e+0|0;h=g+16|0;do{a[g>>0]=0;g=g+1|0}while((g|0)<(h|0));c[b+116>>2]=571;c[b+120>>2]=287;c[b+124>>2]=205;c[b+128>>2]=206;c[b+132>>2]=334;c[b+136>>2]=302;c[e>>2]=f;e=b+140|0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[b+144>>2]=572;c[b+148>>2]=287;c[b+152>>2]=65;c[b+156>>2]=66;c[b+160>>2]=207;c[b+164>>2]=302;c[e>>2]=f;i=d;return 0}function kLa(a){a=a|0;var b=0,d=0,e=0;b=i;c[a+112>>2]=0;c[a+140>>2]=0;d=a+12|0;e=c[d>>2]|0;lLa(a+28|0,e);lLa(a+64|0,e);c[a+16>>2]=0;c[d>>2]=0;i=b;return}function lLa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;mLa(a+24|0,b);mLa(a+12|0,b);e=a+8|0;aEa(b,c[e>>2]|0);c[e>>2]=0;c[a>>2]=0;c[a+4>>2]=0;i=d;return}function mLa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+4|0;f=c[e>>2]|0;g=a+8|0;if((f|0)!=0){h=f;f=c[g>>2]|0;while(1){aEa(b,c[f+8>>2]|0);c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;h=h+ -1|0;if((h|0)==0){break}else{f=f+16|0}}}aEa(b,c[g>>2]|0);c[g>>2]=0;c[a>>2]=0;c[e>>2]=0;i=d;return}function nLa(a){a=a|0;var b=0;b=i;CLa(a,2);i=b;return}function oLa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=c[a+4>>2]|0;if((e|0)==0){f=c[a>>2]|0;g=BLa(a+16|0,b,f)|0;if((g|0)==0){h=BLa(a+52|0,b,f)|0}else{h=g}}else{h=e}i=d;return h|0}function pLa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;i=i+128|0;g=f;if((d|0)<=0){i=f;return}h=d;d=0;while(1){j=(h|0)>16?16:h;k=j<<1;if((j|0)>0){l=0;m=d;do{m=(c[e+(l<<2)>>2]|0)+m|0;c[g+(l<<2)>>2]=(KDa(m)|0)>>16;l=l+1|0}while((l|0)<(k|0));n=0;do{l=g+((n|1)<<2)|0;c[l>>2]=(c[l>>2]|0)-(c[g+(n<<2)>>2]|0);n=n+2|0}while((n|0)<(k|0));o=m}else{o=d}yLa(a,b,j,g);h=h-j|0;if((h|0)<=0){break}else{d=o}}i=f;return}function qLa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;g=a+4|0;if((c[g>>2]|0)!=0){i=f;return}h=a+16|0;j=c[a>>2]|0;k=c[h>>2]|0;l=a+52|0;a=c[l>>2]|0;if((a+k|0)!=(d|0)){i=f;return}d=sLa(h,e,a,k,b,j)|0;if((d|0)==0){k=sLa(l,e,0,a,b,j)|0;if((k|0)==0){i=f;return}else{m=k}}else{m=d}c[g>>2]=m;i=f;return}function rLa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;f=a+4|0;if((c[f>>2]|0)!=0){i=e;return}g=a+16|0;h=c[a>>2]|0;j=c[g>>2]|0;k=a+52|0;a=c[k>>2]|0;if((a+j|0)!=(b|0)){i=e;return}b=sLa(g,d,0,j,0,h)|0;if((b|0)==0){g=sLa(k,d,j,a,0,h)|0;if((g|0)==0){i=e;return}else{l=g}}else{l=b}c[f>>2]=l;i=e;return}function sLa(b,e,f,g,h,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0;k=i;i=i+16|0;l=k;m=tLa(b,h,j)|0;if((m|0)!=0){n=m;i=k;return n|0}m=uLa(b+12|0,j,l)|0;if((m|0)!=0){n=m;i=k;return n|0}m=c[l>>2]|0;l=vLa(m,g,j)|0;if((l|0)!=0){n=l;i=k;return n|0}c[m>>2]=g;if((g|0)==0){n=0;i=k;return n|0}l=g;g=e+(f>>>3)|0;e=128>>>(f&7);f=128;j=c[m+8>>2]|0;while(1){a[j>>0]=(((d[g>>0]|0)&e|0)==0?0:f)|(d[j>>0]|0)&(f^255);m=e>>1;b=(m|0)==0;h=f>>1;o=(h|0)==0;l=l+ -1|0;if((l|0)==0){n=0;break}else{g=b?g+1|0:g;e=b?128:m;f=o?128:h;j=o?j+1|0:j}}i=k;return n|0}function tLa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;i=i+16|0;xLa(a,b);b=wLa(a+12|0,c,d)|0;i=d;return b|0}function uLa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+16|0;f=e;g=c[a>>2]|0;if((g|0)==0){h=wLa(a,b,f)|0;j=c[f>>2]|0;k=h;c[d>>2]=j;i=e;return k|0}else{h=(c[a+8>>2]|0)+(g+ -1<<4)|0;c[f>>2]=h;j=h;k=0;c[d>>2]=j;i=e;return k|0}return 0}function vLa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+16|0;f=e;g=a+4|0;h=((c[g>>2]|0)+7|0)>>>3;j=(b+7|0)>>>3;c[f>>2]=0;if(!(j>>>0>h>>>0)){k=0;i=e;return k|0}b=j+7&1073741816;j=a+8|0;c[j>>2]=dEa(d,1,h,b,c[j>>2]|0,f)|0;j=c[f>>2]|0;if((j|0)!=0){k=j;i=e;return k|0}c[g>>2]=b<<3;k=0;i=e;return k|0}function wLa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;i=i+16|0;f=e;g=c[a>>2]|0;h=g+1|0;j=a+4|0;k=c[j>>2]|0;do{if(h>>>0>k>>>0){c[f>>2]=0;l=g+8&-8;m=a+8|0;n=dEa(b,16,k,l,c[m>>2]|0,f)|0;c[m>>2]=n;m=c[f>>2]|0;if((m|0)==0){c[j>>2]=l;o=n;break}else{p=m;q=0;c[d>>2]=q;i=e;return p|0}}else{o=c[a+8>>2]|0}}while(0);j=o+(g<<4)|0;c[j>>2]=0;c[o+(g<<4)+12>>2]=0;c[a>>2]=h;p=0;q=j;c[d>>2]=q;i=e;return p|0}function xLa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[a+12>>2]|0;if((e|0)==0){i=d;return}c[(c[a+20>>2]|0)+(e+ -1<<4)+12>>2]=b;i=d;return}function yLa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;g=a+4|0;if((c[g>>2]|0)!=0){i=f;return}if(!(((c[a+12>>2]|0)+ -1|0)>>>0<2)){i=f;return}h=a+((b>>>0>1?1:b)*36|0)+16|0;if((d|0)==0){i=f;return}b=d;d=e;while(1){j=zLa(h,c[d>>2]|0,c[d+4>>2]|0,c[a>>2]|0,0)|0;if((j|0)!=0){break}b=b+ -1|0;if((b|0)==0){k=8;break}else{d=d+8|0}}if((k|0)==8){i=f;return}c[g>>2]=j;i=f;return}function zLa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;g=i;i=i+16|0;h=g+4|0;j=g;if((d|0)<0){k=(d|0)==-21;l=0;m=(k?-21:0)+b|0;n=k?3:1}else{l=d;m=b;n=0}b=(f|0)!=0;if(b){c[f>>2]=-1}d=c[a>>2]|0;a:do{if((d|0)==0){o=0;p=10}else{k=0;q=c[a+8>>2]|0;while(1){if((c[q>>2]|0)==(m|0)?(c[q+4>>2]|0)==(l|0):0){r=k;break a}s=k+1|0;if(s>>>0<d>>>0){k=s;q=q+12|0}else{o=s;p=10;break}}}}while(0);if((p|0)==10){p=d+1|0;q=a+4|0;k=c[q>>2]|0;do{if(!(p>>>0<k>>>0)?(c[h>>2]=0,k>>>0<p>>>0):0){s=d+8&-8;t=a+8|0;c[t>>2]=dEa(e,12,k,s,c[t>>2]|0,h)|0;t=c[h>>2]|0;if((t|0)==0){c[q>>2]=s;break}else{u=t;i=g;return u|0}}}while(0);q=c[a+8>>2]|0;c[a>>2]=p;c[q+(d*12|0)>>2]=m;c[q+(d*12|0)+4>>2]=l;c[q+(d*12|0)+8>>2]=n;r=o}o=uLa(a+12|0,e,j)|0;if((o|0)!=0){u=o;i=g;return u|0}o=ALa(c[j>>2]|0,r,e)|0;if((o|0)!=0|b^1){u=o;i=g;return u|0}c[f>>2]=r;u=0;i=g;return u|0}function ALa(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;if((e|0)<0){h=0;i=g;return h|0}do{if(!((c[b>>2]|0)>>>0>e>>>0)){j=e+1|0;k=vLa(b,j,f)|0;if((k|0)==0){c[b>>2]=j;break}else{h=k;i=g;return h|0}}}while(0);f=(c[b+8>>2]|0)+(e>>3)|0;a[f>>0]=d[f>>0]|0|128>>>(e&7);h=0;i=g;return h|0}function BLa(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;g=i;i=i+16|0;h=g;xLa(b,e);e=b+24|0;j=c[e>>2]|0;k=j+ -1|0;if((k|0)<=0){l=0;i=g;return l|0}m=b+32|0;b=j;n=j;j=k;a:while(1){k=n+ -2|0;b:do{if((k|0)>-1){o=c[m>>2]|0;p=c[o+(j<<4)+8>>2]|0;q=c[o+(j<<4)>>2]|0;r=k;c:while(1){s=c[o+(r<<4)+8>>2]|0;t=c[o+(r<<4)>>2]|0;u=q>>>0<t>>>0?q:t;if(u>>>0>7){t=u;v=p;w=s;while(1){if(!((a[w>>0]&a[v>>0])<<24>>24==0)){break c}x=v+1|0;y=w+1|0;z=t+ -8|0;if(z>>>0>7){t=z;v=x;w=y}else{A=z;B=x;C=y;break}}}else{A=u;B=p;C=s}if((A|0)!=0?(a[C>>0]&a[B>>0]&255&~(255>>>A)|0)!=0:0){break}if((r|0)>0){r=r+ -1|0}else{D=b;break b}}p=(r|0)>(j|0);q=p?r:j;w=p?j:r;if((w|0)<(q|0)&(w|0)>-1&(q|0)<(b|0)){p=o+(w<<4)|0;v=o+(q<<4)|0;t=c[p>>2]|0;y=c[v>>2]|0;if((y|0)!=0){if(y>>>0>t>>>0){x=vLa(p,y,f)|0;if((x|0)!=0){l=x;E=26;break a}x=o+(w<<4)+8|0;z=t;do{if((c[p>>2]|0)>>>0>z>>>0){t=(c[x>>2]|0)+(z>>3)|0;a[t>>0]=(d[t>>0]|0)&(128>>>(z&7)^255)}z=z+1|0}while((z|0)!=(y|0))}z=(y+7|0)>>>3;if((z|0)!=0){x=z;z=c[o+(q<<4)+8>>2]|0;p=c[o+(w<<4)+8>>2]|0;while(1){a[p>>0]=a[z>>0]|a[p>>0];x=x+ -1|0;if((x|0)==0){break}else{z=z+1|0;p=p+1|0}}}}c[v>>2]=0;c[o+(q<<4)+12>>2]=0;p=c[e>>2]|0;z=p+ -1|0;x=z-q|0;if((x|0)>0){c[h+0>>2]=c[v+0>>2];c[h+4>>2]=c[v+4>>2];c[h+8>>2]=c[v+8>>2];c[h+12>>2]=c[v+12>>2];d3a(v|0,o+(q+1<<4)|0,x<<4|0)|0;x=o+(z<<4)|0;c[x+0>>2]=c[h+0>>2];c[x+4>>2]=c[h+4>>2];c[x+8>>2]=c[h+8>>2];c[x+12>>2]=c[h+12>>2];F=c[e>>2]|0}else{F=p}p=F+ -1|0;c[e>>2]=p;D=p}else{D=b}}else{D=b}}while(0);k=j+ -1|0;if((k|0)>0){p=j;b=D;j=k;n=p}else{l=0;E=26;break}}if((E|0)==26){i=g;return l|0}return 0}function CLa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+4|0;if((b+ -1|0)>>>0<2){c[e>>2]=0;c[a+12>>2]=b;c[a+16>>2]=0;c[a+28>>2]=0;c[a+40>>2]=0;c[a+52>>2]=0;c[a+64>>2]=0;c[a+76>>2]=0;i=d;return}else{c[e>>2]=6;c[a+12>>2]=b;i=d;return}}function DLa(a){a=a|0;var b=0;b=i;CLa(a,1);i=b;return}function ELa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;c[f>>2]=(KDa(c[d>>2]|0)|0)>>16;c[f+4>>2]=(KDa(c[d+4>>2]|0)|0)>>16;yLa(a,b,1,f);i=e;return}function FLa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;e=i;i=i+16|0;f=e+12|0;g=e;h=a+4|0;if((c[h>>2]|0)!=0){i=e;return}j=c[a>>2]|0;k=b>>>0>1?1:b;b=a+(k*36|0)+16|0;a:do{if((c[a+12>>2]|0)==1){l=d;m=0;while(1){n=(KDa(c[l>>2]|0)|0)>>16;o=zLa(b,n,(KDa(c[l+4>>2]|0)|0)>>16,j,g+(m<<2)|0)|0;if((o|0)!=0){p=o;break a}m=m+1|0;if((m|0)>=3){break}else{l=l+8|0}}l=c[g>>2]|0;m=c[g+4>>2]|0;o=c[g+8>>2]|0;n=a+(k*36|0)+40|0;q=c[n>>2]|0;r=c[a+(k*36|0)+48>>2]|0;c[f>>2]=r;b:do{if((q|0)==0){s=10}else{t=q;u=r;while(1){if((HLa(u,l)|0)!=0){v=u;break b}if((HLa(u,m)|0)!=0){v=u;break b}if((HLa(u,o)|0)!=0){v=u;break b}t=t+ -1|0;u=u+16|0;c[f>>2]=u;if((t|0)==0){s=10;break}}}}while(0);if((s|0)==10){r=wLa(n,j,f)|0;if((r|0)!=0){p=r;break}v=c[f>>2]|0}r=ALa(v,l,j)|0;if((r|0)==0){q=ALa(v,m,j)|0;if((q|0)==0){t=ALa(v,o,j)|0;if((t|0)==0){i=e;return}else{p=t}}else{p=q}}else{p=r}}else{p=6}}while(0);c[h>>2]=p;i=e;return}function GLa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=a+4|0;if((c[e>>2]|0)!=0){i=d;return}f=c[a>>2]|0;if((c[a+12>>2]|0)==1){g=tLa(a+16|0,b,f)|0;if((g|0)==0){h=tLa(a+52|0,b,f)|0;if((h|0)==0){i=d;return}else{j=h}}else{j=g}}else{j=6}c[e>>2]=j;i=d;return}function HLa(a,b){a=a|0;b=b|0;var e=0,f=0;e=i;if(!((c[a>>2]|0)>>>0>b>>>0)){f=0;i=e;return f|0}f=(d[(c[a+8>>2]|0)+(b>>3)>>0]|0)&128>>>(b&7);i=e;return f|0}function ILa(f,g,h){f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;j=i;i=i+16|0;k=j;l=ZDa(f,2496,k)|0;m=c[k>>2]|0;if((m|0)!=0){n=m;c[h>>2]=l;i=j;return n|0}c[l>>2]=f;f=l+4|0;m=l+208|0;c[l+212>>2]=e[g+120>>1]|0;o=g+124|0;p=a[o>>0]|0;if(p<<24>>24==0){q=0}else{r=p&255;p=g+128|0;s=l+224|0;while(1){c[s>>2]=b[p>>1]|0;r=r+ -1|0;if((r|0)==0){break}else{p=p+2|0;s=s+12|0}}q=a[o>>0]|0}c[m>>2]=(q&255)+1;c[l+8>>2]=e[g+122>>1]|0;q=g+125|0;m=a[q>>0]|0;if(m<<24>>24==0){t=0}else{o=m&255;m=g+154|0;s=l+20|0;while(1){c[s>>2]=b[m>>1]|0;o=o+ -1|0;if((o|0)==0){break}else{m=m+2|0;s=s+12|0}}t=a[q>>0]|0}c[f>>2]=(t&255)+1;t=l+412|0;f=g+8|0;q=g+12|0;s=g+9|0;m=g+40|0;o=g+116|0;KLa(t,d[f>>0]|0,q,d[s>>0]|0,m,c[o>>2]|0,0);p=g+10|0;r=g+60|0;u=g+11|0;v=g+88|0;KLa(t,d[p>>0]|0,r,d[u>>0]|0,v,c[o>>2]|0,1);t=LLa(d[f>>0]|0,q,1)|0;q=LLa(d[s>>0]|0,m,t)|0;t=LLa(d[p>>0]|0,r,q)|0;q=TDa(1e3,(LLa(d[u>>0]|0,v,t)|0)<<16>>16)|0;t=c[g+108>>2]|0;c[l+2476>>2]=(t|0)<(q|0)?t:q;c[l+2480>>2]=c[g+112>>2];c[l+2488>>2]=c[o>>2];c[l+200>>2]=0;c[l+204>>2]=0;c[l+404>>2]=0;c[l+408>>2]=0;n=c[k>>2]|0;c[h>>2]=l;i=j;return n|0}function JLa(a){a=a|0;var b=0,d=0;b=i;if((a|0)==0){i=b;return}d=c[a>>2]|0;c[a+4>>2]=0;c[a+208>>2]=0;c[a+412>>2]=0;c[a+928>>2]=0;c[a+1444>>2]=0;c[a+1960>>2]=0;aEa(d,a);i=b;return}function KLa(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;j=i;if((h|0)==0){k=a+516|0;l=a}else{k=a+1548|0;l=a+1032|0}c[l>>2]=0;c[k>>2]=0;MLa(0,b,d,l,k);MLa(1,e,f,l,k);f=c[l>>2]|0;e=c[k>>2]|0;if((f|0)>0){d=f;b=l+4|0;while(1){if(d>>>0>1){a=c[b>>2]|0;h=(c[b+32>>2]|0)-a|0;m=b+4|0;n=c[m>>2]|0;if((n|0)>(h|0)){c[m>>2]=h;o=a;p=h}else{o=a;p=n}}else{o=c[b>>2]|0;p=c[b+4>>2]|0}c[b+12>>2]=o;c[b+8>>2]=o+p;d=d+ -1|0;if((d|0)==0){break}else{b=b+32|0}}}if((e|0)>0){b=e;d=k+4|0;while(1){p=c[d>>2]|0;if(b>>>0>1){o=p-(c[d+32>>2]|0)|0;n=d+4|0;a=c[n>>2]|0;if((a|0)<(o|0)){c[n>>2]=o;q=o}else{q=a}}else{q=c[d+4>>2]|0}a=d+8|0;c[a>>2]=p;o=p+q|0;c[d+12>>2]=o;if((0-q|0)>10){c[a>>2]=o;c[d+4>>2]=0}b=b+ -1|0;if((b|0)==0){break}else{d=d+32|0}}}d=g<<1;b=f;f=1;q=l;while(1){l=q+4|0;if((b|0)!=0){o=q+16|0;c[o>>2]=(c[o>>2]|0)-g;o=b+ -1|0;a=c[q+12>>2]|0;if((o|0)==0){r=a;s=l}else{p=q+ -28+(b<<3<<2)|0;n=o;o=a;a=l;while(1){l=a+44|0;h=c[l>>2]|0;m=h-o|0;if((m|0)<(d|0)){t=((m|0)/2|0)+o|0;c[l>>2]=t;c[a+8>>2]=t}else{c[a+8>>2]=o+g;c[l>>2]=h-g}n=n+ -1|0;o=c[a+40>>2]|0;if((n|0)==0){break}else{a=a+32|0}}r=o;s=p}c[s+8>>2]=r+g}if((f|0)>0){b=e;f=f+ -1|0;q=k}else{break}}i=j;return}function LLa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,f=0,g=0,h=0,j=0;d=i;if((a|0)==0){f=c;i=d;return f|0}else{g=c;h=0}while(1){c=(e[b+((h|1)<<1)>>1]|0)-(e[b+(h<<1)>>1]|0)|0;j=(c<<16>>16|0)>(g<<16>>16|0)?c&65535:g;h=h+2|0;if(!(h>>>0<a>>>0)){f=j;break}else{g=j}}i=d;return f|0}function MLa(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;h=i;j=c[f>>2]|0;k=c[g>>2]|0;if(d>>>0>1){l=d;m=e;n=k;o=j;p=1}else{q=k;r=j;c[f>>2]=r;c[g>>2]=q;i=h;return}while(1){if((p|a)<<24>>24==0){j=b[m>>1]|0;s=f;t=o;u=(b[m+2>>1]|0)-j|0;v=p;w=j;x=1}else{j=b[m+2>>1]|0;s=g;t=n;u=(b[m>>1]|0)-j|0;v=0;w=j;x=0}j=s+4|0;a:do{if((t|0)!=0){k=t;e=j;while(1){d=c[e>>2]|0;if((w|0)<(d|0)){y=14;break}if((w|0)==(d|0)){break}d=k+ -1|0;z=e+32|0;if((d|0)==0){A=z;y=16;break a}else{k=d;e=z}}if((y|0)==14){y=0;if((k|0)==0){A=e;y=16;break}else{B=k}while(1){z=e+(B<<5)|0;B=B+ -1|0;d=e+(B<<5)|0;c[z+0>>2]=c[d+0>>2];c[z+4>>2]=c[d+4>>2];c[z+8>>2]=c[d+8>>2];c[z+12>>2]=c[d+12>>2];c[z+16>>2]=c[d+16>>2];c[z+20>>2]=c[d+20>>2];c[z+24>>2]=c[d+24>>2];c[z+28>>2]=c[d+28>>2];if((B|0)==0){A=e;y=16;break a}}}k=e+4|0;d=c[k>>2]|0;if((u|0)<0){if((u|0)>=(d|0)){C=n;D=o;break}c[k>>2]=u;C=n;D=o;break}else{if((u|0)<=(d|0)){C=n;D=o;break}c[k>>2]=u;C=n;D=o;break}}else{A=j;y=16}}while(0);do{if((y|0)==16){y=0;c[A>>2]=w;c[A+4>>2]=u;if(x<<24>>24==0){C=n+1|0;D=o;break}else{C=n;D=o+1|0;break}}}while(0);l=l+ -2|0;if(!(l>>>0>1)){q=C;r=D;break}else{m=m+4|0;n=C;o=D;p=v}}c[f>>2]=r;c[g>>2]=q;i=h;return}function NLa(a){a=a|0;return a+100|0}function OLa(a){a=a|0;return a+112|0}function PLa(a){a=a|0;return a+140|0}function QLa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+24|0;aEa(b,c[e>>2]|0);c[e>>2]=0;c[a+20>>2]=0;c[a+28>>2]=0;e=a+12|0;aEa(b,c[e>>2]|0);c[e>>2]=0;e=a+8|0;aEa(b,c[e>>2]|0);c[e>>2]=0;c[a+4>>2]=0;c[a>>2]=0;c[a+16>>2]=0;i=d;return}function RLa(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=i;g=c[a>>2]|0;if((g|0)!=0){h=g;g=c[a+8>>2]|0;while(1){j=g+16|0;c[j>>2]=c[j>>2]&-5;c[g+24>>2]=-1;h=h+ -1|0;if((h|0)==0){break}else{g=g+28|0}}}if((b|0)==0){c[a+4>>2]=0;i=f;return}g=a+8|0;h=a+12|0;j=0;k=e;e=0;l=0;m=0;while(1){if((l|0)==0){n=k+1|0;o=128;p=d[k>>0]|0}else{n=k;o=l;p=m}if(((o&p|0)!=0?(q=c[g>>2]|0,r=q+(e*28|0)|0,s=q+(e*28|0)+16|0,q=c[s>>2]|0,(q&4|0)==0):0)?(c[s>>2]=q|4,j>>>0<(c[a>>2]|0)>>>0):0){c[(c[h>>2]|0)+(j<<2)>>2]=r;t=j+1|0}else{t=j}e=e+1|0;if((e|0)==(b|0)){break}else{j=t;k=n;l=o>>1;m=p}}c[a+4>>2]=t;a=c[h>>2]|0;if((t|0)>1){u=1}else{i=f;return}do{h=c[a+(u<<2)>>2]|0;p=u;do{m=p;p=p+ -1|0;o=a+(p<<2)|0;l=c[o>>2]|0;if((c[l>>2]|0)<(c[h>>2]|0)){break}c[a+(m<<2)>>2]=l;c[o>>2]=h}while((p|0)>0);u=u+1|0}while((u|0)!=(t|0));i=f;return}function SLa(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;j=i;if((f|0)==0){i=j;return}k=0-h|0;l=(b|0)==0;m=(h|0)==2;n=m?128:256;o=m?256:128;m=f;f=e;while(1){e=c[f+28>>2]|0;p=f+16|0;q=c[p>>2]|0;a:do{if((q&16|0)==0){r=a[f+20>>0]|0;if(!((r|0)==(h|0)|(r|0)==(k|0))){s=a[f+21>>0]|0;if((s|0)==(h|0)|(s|0)==(k|0)){t=s;u=6}}else{t=r;u=6}if((u|0)==6?(u=0,(t|0)!=0):0){if((t|0)==(h|0)){if(l){break}else{v=0}while(1){w=c[d+(v<<2)>>2]|0;r=e-(c[w>>2]|0)|0;v=v+1|0;if((r|0)<(g|0)&(0-r|0)<(g|0)){break}if(!(v>>>0<b>>>0)){break a}}c[p>>2]=q|528;c[f+24>>2]=w;break}else{if((t|0)!=(k|0)|l){break}else{x=0}while(1){y=c[d+(x<<2)>>2]|0;r=e-(c[y>>2]|0)-(c[y+4>>2]|0)|0;x=x+1|0;if((r|0)<(g|0)&(0-r|0)<(g|0)){break}if(!(x>>>0<b>>>0)){break a}}c[p>>2]=q|1040;c[f+24>>2]=y;break}}if((q&64|0)!=0){b:do{if((q&n|0)==0){if(!((q&o|0)==0|l)){r=0;while(1){z=c[d+(r<<2)>>2]|0;s=e-(c[z>>2]|0)-(c[z+4>>2]|0)|0;r=r+1|0;if((s|0)<(g|0)&(0-s|0)<(g|0)){break}if(!(r>>>0<b>>>0)){break b}}c[f+24>>2]=z;c[p>>2]=q|1040}}else{if(l){break a}else{A=0}while(1){B=c[d+(A<<2)>>2]|0;r=e-(c[B>>2]|0)|0;A=A+1|0;if((r|0)<(g|0)&(0-r|0)<(g|0)){break}if(!(A>>>0<b>>>0)){break b}}c[f+24>>2]=B;c[p>>2]=q|528}}while(0);r=f+24|0;if(!((c[r>>2]|0)!=0|l)){s=0;while(1){C=c[d+(s<<2)>>2]|0;D=c[C>>2]|0;if((e|0)>=(D|0)?(e|0)<=((c[C+4>>2]|0)+D|0):0){break}s=s+1|0;if(!(s>>>0<b>>>0)){break a}}c[r>>2]=C}}}}while(0);m=m+ -1|0;if((m|0)==0){break}else{f=f+40|0}}i=j;return}function TLa(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;g=i;h=c[d+(e*204|0)+200>>2]|0;j=b+16|0;k=c[j>>2]|0;if((k&8|0)!=0){i=g;return}l=c[d+(e*204|0)+204>>2]|0;m=c[b>>2]|0;n=(SDa(m,h)|0)+l|0;l=b+4|0;o=c[l>>2]|0;p=SDa(o,h)|0;do{if((e|0)==1){if((a[f+121>>0]|0)!=0){q=(a[f+123>>0]|0)!=0;r=b+12|0;c[r>>2]=p;s=o+m|0;t=a[d+2492>>0]|0;u=c[d+412>>2]|0;a:do{if((u|0)==0){v=0;w=2;x=0}else{y=c[d+2488>>2]|0;z=0-y|0;A=u;B=d+416|0;while(1){C=s-(c[B+12>>2]|0)|0;if((C|0)<(z|0)){v=0;w=2;x=0;break a}if(((c[B+8>>2]|0)+y|0)>=(s|0)){break}A=A+ -1|0;if((A|0)==0){v=0;w=2;x=0;break a}else{B=B+32|0}}if(t<<24>>24==0?(C|0)>(c[d+2484>>2]|0):0){v=0;w=2;x=0;break}v=1;w=3;x=c[B+16>>2]|0}}while(0);s=c[d+928>>2]|0;b:do{if((s|0)==0){D=v;E=0}else{u=c[d+2488>>2]|0;A=0-u|0;y=s;z=d+(s+ -1<<5)+932|0;while(1){F=(c[z+8>>2]|0)-m|0;if((F|0)<(A|0)){D=v;E=0;break b}if(((c[z+12>>2]|0)-u|0)<=(m|0)){break}y=y+ -1|0;if((y|0)==0){D=v;E=0;break b}else{z=z+ -32|0}}if(t<<24>>24==0?(F|0)>=(c[d+2484>>2]|0):0){D=v;E=0;break}D=w;E=c[z+16>>2]|0}}while(0);if((D|0)==1){t=x-p|0;c[b+8>>2]=t;if(q){G=p;H=x;I=r;J=t;K=1;L=48;break}else{break}}else if((D|0)==3){c[b+8>>2]=E;t=x-E|0;c[r>>2]=t;if(q){G=t;H=x;I=r;J=E;K=3;L=48;break}else{break}}else if((D|0)==2){c[b+8>>2]=E;if(q){G=p;H=x;I=r;J=E;K=2;L=48;break}else{break}}else{M=r;N=D;O=x;P=q;L=27;break}}else{L=5}}else if((e|0)==0){if((a[f+120>>0]|0)==0){L=5}else{t=(a[f+122>>0]|0)!=0;s=b+12|0;c[s>>2]=p;M=s;N=0;O=0;P=t;L=27}}else{t=b+12|0;c[t>>2]=p;M=t;N=0;O=0;P=0;L=27}}while(0);if((L|0)==5){c[b+8>>2]=n;c[b+12>>2]=p;c[j>>2]=k|8;i=g;return}if((L|0)==27){k=c[b+20>>2]|0;if((k|0)==0){Q=n}else{if((c[k+16>>2]&8|0)==0){TLa(k,d,e,f);R=c[l>>2]|0;S=c[b>>2]|0}else{R=o;S=m}m=c[k+8>>2]|0;o=c[k+12>>2]>>1;Q=m-(p>>1)+o+(SDa(S-((c[k+4>>2]>>1)+(c[k>>2]|0))+(R>>1)|0,h)|0)|0}h=b+8|0;c[h>>2]=Q;c[M>>2]=p;do{if((a[f+124>>0]|0)!=0){if((p|0)<65){if((p|0)>31){T=64;U=Q+(p>>1)&-64;break}R=Q+32&-64;if((p|0)<=0){T=p;U=R;break}k=Q+p|0;S=k+32&-64;o=R-Q|0;m=S-k|0;T=p;U=(((o|0)<0?0-o|0:o)|0)>(((m|0)<0?0-m|0:m)|0)?S:R;break}R=c[d+(e*204|0)+12>>2]|0;S=p-R|0;if((((S|0)<0?0-S|0:S)|0)<40){V=(R|0)<48?48:R}else{V=p}if((V|0)>=192){T=V+32&-64;U=Q;break}R=V&63;S=V&-64;if(!(R>>>0<10)){if(R>>>0<32){T=S|10;U=Q;break}else{T=R>>>0<54?S|54:V;U=Q;break}}else{T=V;U=Q}}else{T=p;U=Q}}while(0);Q=U+32|0;p=(Q&-64)-U|0;V=(Q+T&-64)-U-T|0;c[h>>2]=((((p|0)<0?0-p|0:p)|0)>(((V|0)<0?0-V|0:V)|0)?V:p)+U;c[M>>2]=T;if(P){G=T;H=O;I=M;J=c[h>>2]|0;K=N;L=48}}do{if((L|0)==48){N=b+8|0;if((G|0)<64){W=64}else{W=G+32&-64}if((K|0)==1){c[N>>2]=H-W;c[I>>2]=W;break}else if((K|0)==2){c[I>>2]=W;break}else if((K|0)==3){break}else{c[I>>2]=W;h=W>>1;M=h+J|0;if((W&64|0)==0){X=M+32&-64}else{X=M&-64|32}c[N>>2]=X-h;c[I>>2]=W;break}}}while(0);c[j>>2]=c[j>>2]|8;i=g;return}function ULa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=c[a+(b*204|0)+4>>2]|0;f=c[a+(b*204|0)+200>>2]|0;if((e|0)==0){i=d;return}g=SDa(c[a+(b*204|0)+8>>2]|0,f)|0;h=a+(b*204|0)+12|0;c[h>>2]=g;c[a+(b*204|0)+16>>2]=g+32&-64;j=e+ -1|0;if((j|0)==0){i=d;return}e=g;g=j;j=a+(b*204|0)+20|0;while(1){b=SDa(c[j>>2]|0,f)|0;a=b-e|0;k=(((a|0)<0?0-a|0:a)|0)<128?e:b;c[j+4>>2]=k;c[j+8>>2]=k+32&-64;k=g+ -1|0;if((k|0)==0){break}e=c[h>>2]|0;g=k;j=j+12|0}i=d;return}function VLa(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=i;d=(a|0)<0?0-a|0:a;e=(b|0)<0?0-b|0:b;if((e*12|0)>=(d|0)){if((d*12|0)<(e|0)){f=(b>>31&2)+ -1|0}else{f=4}}else{f=a>>31&-4|2}i=c;return f|0}function WLa(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;g=i;i=i+16|0;h=g;j=c[b>>2]|0;k=j<<1;l=a+12|0;c[l>>2]=dEa(f,4,0,k,0,h)|0;if((c[h>>2]|0)!=0){m=c[h>>2]|0;i=g;return m|0}n=a+8|0;c[n>>2]=dEa(f,28,0,j,0,h)|0;if((c[h>>2]|0)!=0){m=c[h>>2]|0;i=g;return m|0}c[a+24>>2]=dEa(f,16,0,k|1,0,h)|0;if((c[h>>2]|0)!=0){m=c[h>>2]|0;i=g;return m|0}c[a>>2]=j;c[a+16>>2]=(c[l>>2]|0)+(j<<2);l=a+4|0;c[l>>2]=0;c[a+20>>2]=0;c[a+28>>2]=0;if((j|0)!=0){k=j;j=c[b+8>>2]|0;b=c[n>>2]|0;while(1){c[b>>2]=c[j>>2];c[b+4>>2]=c[j+4>>2];c[b+16>>2]=c[j+8>>2];k=k+ -1|0;if((k|0)==0){break}else{j=j+12|0;b=b+28|0}}}if((e|0)!=0?(b=c[e+8>>2]|0,j=c[e>>2]|0,c[a+32>>2]=e,(j|0)!=0):0){e=j;j=b;while(1){b=c[j>>2]|0;if((b|0)!=0){k=c[j+8>>2]|0;n=0;f=0;o=0;while(1){if((f|0)==0){p=k+1|0;q=128;r=d[k>>0]|0}else{p=k;q=f;r=o}if((q&r|0)!=0){XLa(a,n)}n=n+1|0;if((n|0)==(b|0)){break}else{k=p;f=q>>1;o=r}}}e=e+ -1|0;if((e|0)==0){break}else{j=j+16|0}}}j=c[a>>2]|0;if((j|0)==0?1:(c[l>>2]|0)==(j|0)){m=c[h>>2]|0;i=g;return m|0}else{s=0}do{XLa(a,s);s=s+1|0}while((s|0)!=(j|0));m=c[h>>2]|0;i=g;return m|0}function XLa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;e=c[a+8>>2]|0;f=e+(b*28|0)|0;if(!((c[a>>2]|0)>>>0>b>>>0)){i=d;return}g=e+(b*28|0)+16|0;h=c[g>>2]|0;if((h&4|0)!=0){i=d;return}c[g>>2]=h|4;h=a+16|0;g=c[h>>2]|0;j=a+4|0;k=c[j>>2]|0;l=e+(b*28|0)+20|0;c[l>>2]=0;a:do{if((k|0)!=0){m=c[f>>2]|0;n=(c[e+(b*28|0)+4>>2]|0)+m|0;o=k;p=g;while(1){q=c[p>>2]|0;r=c[q>>2]|0;if((n|0)>=(r|0)?((c[q+4>>2]|0)+r|0)>=(m|0):0){break}o=o+ -1|0;if((o|0)==0){break a}else{p=p+4|0}}c[l>>2]=q}}while(0);q=c[j>>2]|0;if(!(q>>>0<(c[a>>2]|0)>>>0)){i=d;return}c[j>>2]=q+1;c[(c[h>>2]|0)+(q<<2)>>2]=f;i=d;return}function YLa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d;c[b>>2]=0;f=ZDa(a,24,e)|0;g=c[e>>2]|0;if((g|0)!=0){i=d;return g|0}c[f+8>>2]=a;c[b>>2]=f;i=d;return g|0}function ZLa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;if((a|0)==0){i=e;return}if((b|0)!=0&(d|0)>3075){c[a>>2]=b+1032;c[a+4>>2]=d+ -1032;c[a+12>>2]=b;i=e;return}else{c[a>>2]=0;c[a+4>>2]=0;c[a+12>>2]=0;i=e;return}}function _La(a,b,c){a=a|0;b=b|0;c=c|0;return}function $La(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f=i;g=c[e+4>>2]|0;h=c[e>>2]|0;if((d|0)==0){j=96;i=f;return j|0}if((c[d>>2]|0)==0){j=96;i=f;return j|0}k=d+4|0;if((c[k>>2]|0)==0){j=96;i=f;return j|0}if((g|0)==0){j=20;i=f;return j|0}l=b[g+2>>1]|0;if(l<<16>>16==0){j=0;i=f;return j|0}m=b[g>>1]|0;if(m<<16>>16<1){j=0;i=f;return j|0}n=c[g+12>>2]|0;if((n|0)==0){j=20;i=f;return j|0}if((c[g+4>>2]|0)==0){j=20;i=f;return j|0}if((l<<16>>16|0)!=((b[n+((m<<16>>16)+ -1<<1)>>1]|0)+1|0)){j=20;i=f;return j|0}m=c[d+12>>2]|0;n=e+8|0;if((c[n>>2]&2|0)!=0){j=19;i=f;return j|0}if((h|0)==0){j=20;i=f;return j|0}if((c[h+4>>2]|0)==0){j=0;i=f;return j|0}if((c[h>>2]|0)==0){j=0;i=f;return j|0}if((c[h+12>>2]|0)==0){j=20;i=f;return j|0}e=m+128|0;c[e+0>>2]=c[g+0>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2];c[e+12>>2]=c[g+12>>2];c[e+16>>2]=c[g+16>>2];g=m+104|0;c[g+0>>2]=c[h+0>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];c[g+12>>2]=c[h+12>>2];c[g+16>>2]=c[h+16>>2];c[g+20>>2]=c[h+20>>2];h=c[d>>2]|0;c[m+28>>2]=h;c[m+32>>2]=h+((c[k>>2]|0)>>>2<<2);if((c[n>>2]&1|0)!=0){j=19;i=f;return j|0}n=c[m+144>>2]|0;if((n&256|0)==0){c[m>>2]=6;c[m+16>>2]=32;c[m+20>>2]=2;o=6}else{c[m>>2]=12;c[m+16>>2]=256;c[m+20>>2]=30;o=12}k=1<<o;c[m+4>>2]=k;c[m+8>>2]=(k|0)/2|0;k=o+ -6|0;c[m+12>>2]=k;c[m+24>>2]=k;if((n&8|0)==0){k=m+180|0;o=(n&16|0)==0?0:4;a[k>>0]=o;if((n&32|0)==0){a[k>>0]=o&255|1}}else{a[m+180>>0]=2}o=m+181|0;a[o>>0]=n>>>9&1^1;n=m+164|0;c[n>>2]=208;k=m+168|0;c[k>>2]=13;h=m+172|0;c[h>>2]=14;d=m+176|0;c[d>>2]=573;g=m+1024|0;c[g>>2]=0;e=m+960|0;b[e>>1]=0;l=m+962|0;b[l>>1]=(c[m+104>>2]|0)+65535;p=m+108|0;b[m+56>>1]=c[p>>2];c[m+60>>2]=c[m+116>>2];q=kMa(m,0)|0;if((q|0)!=0){j=q;i=f;return j|0}do{if((a[o>>0]|0)!=0){if((a[m+180>>0]|0)==2){break}c[n>>2]=209;c[k>>2]=15;c[h>>2]=16;c[d>>2]=574;c[g>>2]=0;b[e>>1]=0;b[l>>1]=(c[p>>2]|0)+65535;q=kMa(m,1)|0;if((q|0)==0){break}else{j=q}i=f;return j|0}}while(0);j=0;i=f;return j|0}function aMa(a){a=a|0;var b=0;b=i;aEa(c[a+8>>2]|0,a);i=b;return}function bMa(a){a=a|0;var b=0,d=0;b=i;d=c[a+4>>2]|0;ld[c[(c[(c[a+12>>2]|0)+56>>2]|0)+8>>2]&255](c[a+52>>2]|0,c[d+164>>2]|0,c[d+168>>2]|0);i=b;return 0}function cMa(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;h=i;i=i+80|0;j=h+64|0;k=h+48|0;l=h;m=e+72|0;if((c[m>>2]|0)!=(c[d+16>>2]|0)){c[j>>2]=6;n=6;i=h;return n|0}o=c[d+12>>2]|0;if((f|0)==2){if((o|0)==1275232){n=19;i=h;return n|0}}else{if((o|0)==1275160){n=19;i=h;return n|0}}o=e+108|0;if((g|0)!=0){xEa(o,c[g>>2]|0,c[g+4>>2]|0)}qFa(o,k);g=(c[k>>2]|0)+32&-64;c[k>>2]=g;p=k+4|0;q=(c[p>>2]|0)+32&-64;c[p>>2]=q;r=k+8|0;s=(c[r>>2]|0)+32&-64;c[r>>2]=s;r=k+12|0;t=(c[r>>2]|0)+32&-64;c[r>>2]=t;u=s-g>>6;g=t-q>>6;if(u>>>0>65535|g>>>0>65535){c[j>>2]=6;n=6;i=h;return n|0}q=e+76|0;t=c[d+8>>2]|0;s=e+156|0;if((c[(c[s>>2]|0)+4>>2]&1|0)!=0){v=e+88|0;aEa(t,c[v>>2]|0);c[v>>2]=0;v=(c[s>>2]|0)+4|0;c[v>>2]=c[v>>2]&-2}if((f&2|0)==0){a[e+94>>0]=2;b[e+92>>1]=256;w=u+3&-4}else{a[e+94>>0]=1;w=(u+15|0)>>>4<<1}c[e+80>>2]=u;c[q>>2]=g;c[e+84>>2]=w;c[e+88>>2]=dEa(t,g,0,w,0,j)|0;w=c[j>>2]|0;if((w|0)!=0){n=w;i=h;return n|0}w=(c[s>>2]|0)+4|0;c[w>>2]=c[w>>2]|1;xEa(o,0-(c[k>>2]|0)|0,0-(c[p>>2]|0)|0);c[l>>2]=q;c[l+4>>2]=o;c[l+8>>2]=(a[e+94>>0]|0)==2&1;q=dd[c[d+56>>2]&511](c[d+52>>2]|0,l)|0;c[j>>2]=q;xEa(o,c[k>>2]|0,c[p>>2]|0);if((q|0)!=0){n=q;i=h;return n|0}c[m>>2]=1651078259;c[e+100>>2]=c[k>>2]>>6;c[e+104>>2]=c[r>>2]>>6;n=0;i=h;return n|0}function dMa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;if((c[b+72>>2]|0)!=(c[a+16>>2]|0)){g=6;i=f;return g|0}if((d|0)!=0){wEa(b+108|0,d)}if((e|0)==0){g=0;i=f;return g|0}xEa(b+108|0,c[e>>2]|0,c[e+4>>2]|0);g=0;i=f;return g|0}function eMa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;if((c[b+72>>2]|0)!=(c[a+16>>2]|0)){i=e;return}qFa(b+108|0,d);i=e;return}function fMa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=Qc[c[(c[(c[a+12>>2]|0)+56>>2]|0)+12>>2]&255](c[a+52>>2]|0,b,d)|0;i=e;return f|0}function gMa(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0;e=c[a+112>>2]|0;f=0-e|0;b[a+156>>1]=f;g=b[d>>1]|0;d=a+148|0;c[d>>2]=ca(g,f)|0;if((e|0)>0){c[d>>2]=ca((c[a+104>>2]|0)+~g|0,e)|0}b[a+158>>1]=0;b[a+160>>1]=0;return}function hMa(f,g,h,j,k,l){f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0;l=i;k=c[f+4>>2]|0;g=0-k|0;m=c[f>>2]|0;n=(h+ -1+k&g)>>m;if((j-h-k|0)>(c[f+20>>2]|0)){o=(g&j)>>m}else{o=n}if(!((o|0)>-1)){i=l;return}m=e[f+56>>1]|0;if((n|0)>=(m|0)){i=l;return}j=(n|0)<0?0:n;n=(o|0)<(m|0)?o:m+ -1|0;m=j<<13>>16;o=n<<13>>16;g=255>>>(j&7);j=127>>>(n&7)^255;n=f+158|0;if((b[n>>1]|0)>(m|0)){b[n>>1]=m}n=f+160|0;if((b[n>>1]|0)<(o|0)){b[n>>1]=o}n=c[f+60>>2]|0;k=c[f+148>>2]|0;f=k+m|0;h=n+f|0;p=o-m|0;if((p|0)<=0){a[h>>0]=d[h>>0]|j&g;i=l;return}a[h>>0]=d[h>>0]|g;g=n+(f+1)|0;if((p+ -1|0)>0){f3a(g|0,-1,o+ -1-m|0)|0;q=n+(k+o)|0}else{q=g}a[q>>0]=d[q>>0]|j;i=l;return}function iMa(f,g,h,j,k,l){f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;m=i;n=c[f+4>>2]|0;o=h+ -1|0;p=0-n|0;q=o+n&p;r=p&j;if((q|0)>(r|0)){s=c[k+12>>2]|0;t=s&7;if((q|0)!=(r+n|0)){i=m;return}if((t|0)==5|(t|0)==1){if((c[k+28>>2]|0)==(l|0)?(c[k+16>>2]|0)<1:0){if((s&16|0)==0){i=m;return}if((j-h|0)<(c[f+8>>2]|0)){i=m;return}}if((c[l+28>>2]|0)==(k|0)?(c[k+20>>2]|0)==(g<<16>>16|0):0){if((s&32|0)==0){i=m;return}if((j-h|0)<(c[f+8>>2]|0)){i=m;return}}if((t|0)==1){u=r}else{u=(c[f+8>>2]|0)+((o+j|0)/2|0)&p}}else if((t|0)==0){u=r}else if((t|0)==4){u=(c[f+8>>2]|0)+((o+j|0)/2|0)&p}else{i=m;return}p=c[f>>2]|0;if((u|0)<0){v=q}else{v=(u>>p|0)<(e[f+56>>1]|0)?u:r}u=((v|0)==(q|0)?r:q)>>p;r=u&7;if(((u|0)>-1?(u|0)<(e[f+56>>1]|0):0)?(d[(c[f+60>>2]|0)+((c[f+148>>2]|0)+(u<<13>>16))>>0]&128>>>r|0)!=0:0){i=m;return}else{w=p;x=v}}else{w=c[f>>2]|0;x=q}q=x>>w;if(!((q|0)>-1)){i=m;return}if((q|0)>=(e[f+56>>1]|0)){i=m;return}w=q>>>3;x=w&65535;v=f+158|0;p=w<<16>>16;if((b[v>>1]|0)>(p|0)){b[v>>1]=x}v=f+160|0;if((b[v>>1]|0)<(p|0)){b[v>>1]=x}x=(c[f+60>>2]|0)+((c[f+148>>2]|0)+p)|0;a[x>>0]=d[x>>0]|128>>>(q&7);i=m;return}function jMa(a){a=a|0;var d=0;d=a+148|0;c[d>>2]=(c[d>>2]|0)+(b[a+156>>1]|0);return}function kMa(d,f){d=d|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0;g=i;i=i+16|0;h=g+14|0;j=g+12|0;k=g+8|0;l=g+4|0;m=g;n=d+1024|0;o=c[n>>2]|0;if(!((o|0)>-1)){p=0;i=g;return p|0}q=d+4|0;r=d+80|0;s=d+76|0;t=d+28|0;u=d+40|0;v=d+44|0;w=d+92|0;x=d+87|0;y=d+86|0;z=d+32|0;A=d+36|0;B=d+48|0;C=d+88|0;D=d+84|0;E=d+128|0;F=d+100|0;G=d+96|0;H=d+140|0;I=d+132|0;J=d+24|0;K=d+8|0;L=f<<24>>24!=0;f=d+136|0;M=d+68|0;N=d+72|0;O=d+180|0;P=d+164|0;Q=d+176|0;R=d+172|0;S=d+168|0;T=o;a:while(1){o=c[q>>2]|0;c[r>>2]=ca(b[d+(T<<2)+962>>1]|0,o)|0;c[s>>2]=ca(b[d+(T<<2)+960>>1]|0,o)|0;o=c[t>>2]|0;c[u>>2]=o;c[v>>2]=0;c[w>>2]=0;a[x>>0]=0;a[y>>0]=0;c[A>>2]=(c[z>>2]|0)+ -32;c[B>>2]=0;c[C>>2]=o;c[o+8>>2]=o;b[D>>1]=0;b:do{if((b[E>>1]|0)>0){o=0;U=0;while(1){c[F>>2]=0;c[G>>2]=0;V=c[I>>2]|0;W=e[(c[H>>2]|0)+(o<<1)>>1]|0;X=V+(W<<3)|0;Y=V+(U<<3)|0;Z=c[J>>2]|0;_=c[K>>2]|0;$=(c[Y>>2]<<Z)-_|0;aa=(c[V+(U<<3)+4>>2]<<Z)-_|0;ba=(c[X>>2]<<Z)-_|0;da=(c[V+(W<<3)+4>>2]<<Z)-_|0;_=L?aa:$;Z=L?$:aa;aa=L?da:ba;$=L?ba:da;da=c[f>>2]|0;ba=da+U|0;ea=a[ba>>0]|0;if((ea&4)==0){fa=ea}else{a[O>>0]=(ea&255)>>>5;fa=a[ba>>0]|0}ea=fa&3;if((ea|0)==0){if((a[da+W>>0]&3)==1){ga=V+(W+ -1<<3)|0;ha=aa;ia=$}else{ga=X;ha=(aa+_|0)/2|0;ia=($+Z|0)/2|0}$=U+ -1|0;ja=ga;ka=V+($<<3)|0;la=da+$|0;ma=ha;na=ia}else if((ea|0)==2){oa=27;break a}else{ja=X;ka=Y;la=ba;ma=_;na=Z}c[M>>2]=ma;c[N>>2]=na;c:do{if(ka>>>0<ja>>>0){Z=ka;_=la;d:while(1){ba=Z+8|0;Y=_+1|0;X=a[Y>>0]&3;if((X|0)==0){ea=c[J>>2]|0;$=c[K>>2]|0;da=(c[ba>>2]<<ea)-$|0;V=(c[Z+12>>2]<<ea)-$|0;$=ba;ea=Y;pa=L?V:da;qa=L?da:V;while(1){if(!($>>>0<ja>>>0)){oa=20;break d}V=$;$=$+8|0;ea=ea+1|0;da=a[ea>>0]&3;aa=c[J>>2]|0;W=c[K>>2]|0;ra=(c[$>>2]<<aa)-W|0;sa=(c[V+12>>2]<<aa)-W|0;ta=L?sa:ra;ua=L?ra:sa;if((da|0)==1){break}else if((da|0)!=0){oa=27;break a}if(!((vMa(d,pa,qa,(ta+pa|0)/2|0,(ua+qa|0)/2|0)|0)<<24>>24==0)){oa=54;break b}else{pa=ta;qa=ua}}if((vMa(d,pa,qa,ta,ua)|0)<<24>>24==0){va=$;wa=ea}else{oa=54;break b}}else if((X|0)==1){da=c[J>>2]|0;sa=c[K>>2]|0;ra=(c[ba>>2]<<da)-sa|0;W=(c[Z+12>>2]<<da)-sa|0;if((uMa(d,L?W:ra,L?ra:W)|0)<<24>>24==0){va=ba;wa=Y}else{oa=54;break b}}else{if((Z+16|0)>>>0>ja>>>0){oa=27;break a}if(!((a[_+2>>0]&3)==2)){oa=27;break a}W=Z+24|0;ra=c[J>>2]|0;sa=c[K>>2]|0;da=(c[Z+8>>2]<<ra)-sa|0;aa=(c[Z+12>>2]<<ra)-sa|0;V=(c[Z+16>>2]<<ra)-sa|0;xa=(c[Z+20>>2]<<ra)-sa|0;ya=L?aa:da;za=L?da:aa;Aa=L?xa:V;Ba=L?V:xa;if(W>>>0>ja>>>0){oa=25;break}xa=(c[W>>2]<<ra)-sa|0;V=(c[Z+28>>2]<<ra)-sa|0;if((wMa(d,ya,za,Aa,Ba,L?V:xa,L?xa:V)|0)<<24>>24==0){va=W;wa=_+3|0}else{oa=54;break b}}if(va>>>0<ja>>>0){Z=va;_=wa}else{oa=26;break c}}if((oa|0)==20){oa=0;if((vMa(d,pa,qa,ma,na)|0)<<24>>24==0){break}else{oa=54;break b}}else if((oa|0)==25){oa=0;if((wMa(d,ya,za,Aa,Ba,ma,na)|0)<<24>>24==0){break}else{oa=54;break b}}}else{oa=26}}while(0);if((oa|0)==26?(oa=0,!((uMa(d,ma,na)|0)<<24>>24==0)):0){oa=54;break b}_=(e[(c[H>>2]|0)+(o<<1)>>1]|0)+1|0;Z=c[N>>2]|0;W=c[q>>2]|0;V=W+ -1&Z;if(((((V|0)==0?(Z|0)>=(c[s>>2]|0):0)?(Z|0)<=(c[r>>2]|0):0)?(xa=c[G>>2]|0,(xa|0)!=0):0)?((c[(c[C>>2]|0)+12>>2]^c[xa+12>>2])&8|0)==0:0){c[u>>2]=(c[u>>2]|0)+ -4}xa=c[C>>2]|0;if((c[xa+12>>2]&8|0)==0){Ca=((Z+ -1+W&0-W)-Z|0)>=(c[K>>2]|0)}else{Ca=(V|0)>=(c[K>>2]|0)}if(!((sMa(d,Ca&1)|0)<<24>>24==0)){oa=54;break b}V=c[G>>2]|0;if((V|0)!=0){c[xa+28>>2]=V}o=o+1|0;if((o|0)>=(b[E>>1]|0)){break}else{U=_&65535}}U=b[D>>1]|0;o=c[w>>2]|0;if(!((U&65535)<2|(o|0)==0)){if(U<<16>>16==0){oa=53}else{_=U;U=o;while(1){if((_&65535)>1){o=c[U+16>>2]|0;c[U+4>>2]=(c[U+8>>2]|0)+(o<<2);Da=o}else{c[U+4>>2]=0;Da=c[U+16>>2]|0}o=U+20|0;V=c[o>>2]|0;if((c[U+12>>2]&8|0)==0){xa=V-Da+1|0;c[o>>2]=xa;o=U+8|0;c[o>>2]=(c[o>>2]|0)+(Da+ -1<<2);Ea=xa;Fa=V}else{Ea=V;Fa=Da+ -1+V|0}if(!((tMa(d,Ea)|0)<<24>>24==0)){oa=54;break b}if(!((tMa(d,Fa+1|0)|0)<<24>>24==0)){oa=54;break b}_=_+ -1<<16>>16;if(_<<16>>16==0){oa=53;break}else{U=c[U+4>>2]|0}}}}else{oa=52}}else{oa=52}}while(0);if((oa|0)==52){oa=0;c[w>>2]=0;oa=53}if((oa|0)==53){oa=0;if((c[u>>2]|0)>>>0<(c[A>>2]|0)>>>0){U=c[w>>2]|0;if((U|0)!=0){c[k>>2]=0;c[l>>2]=0;c[m>>2]=0;_=c[d>>2]|0;b[j>>1]=c[s>>2]>>_;V=c[r>>2]>>_&65535;b[h>>1]=V;_=V;V=U;while(1){U=c[V+4>>2]|0;xa=c[V+20>>2]|0;o=xa+65535+(c[V+16>>2]|0)|0;if((_<<16>>16|0)>(xa<<16>>16|0)){b[h>>1]=xa}if((b[j>>1]|0)<(o<<16>>16|0)){b[j>>1]=o}c[V>>2]=0;pMa(k,V);if((U|0)==0){break}_=b[h>>1]|0;V=U}if((c[B>>2]|0)==0){oa=68;break}ld[c[P>>2]&255](d,h,j);V=c[k>>2]|0;_=b[h>>1]|0;if((V|0)!=0){U=_&65535;o=V;do{c[o+24>>2]=(c[o+20>>2]|0)-U&65535;o=c[o+4>>2]|0}while((o|0)!=0)}o=c[B>>2]|0;e:do{if((o|0)>0){if((c[(c[z>>2]|0)+(0-o<<2)>>2]|0)==(_<<16>>16|0)?(U=o+ -1|0,c[B>>2]=U,(U|0)<=0):0){Ga=_;break}else{Ha=V;Ia=_;Ja=0}while(1){if((Ha|0)!=0){U=Ha;do{xa=U;U=c[U+4>>2]|0;Z=xa+24|0;W=c[Z>>2]|0;c[Z>>2]=W-Ja;do{if((W|0)==(Ja|0)){qMa(k,xa);if((c[xa+12>>2]&8|0)==0){pMa(m,xa);break}else{pMa(l,xa);break}}}while(0)}while((U|0)!=0)}rMa(l);rMa(m);U=c[B>>2]|0;c[B>>2]=U+ -1;xa=c[(c[z>>2]|0)+(0-U<<2)>>2]<<16>>16;U=xa-(Ia&65535)|0;f:do{if((Ia<<16>>16|0)<(xa|0)){W=Ia;while(1){Z=c[l>>2]|0;if((Z|0)!=0){sa=Z;ra=m;aa=0;while(1){da=c[ra>>2]|0;Ka=c[sa>>2]|0;La=c[da>>2]|0;Ma=(Ka|0)>(La|0);Na=Ma?La:Ka;Oa=Ma?Ka:La;La=c[q>>2]|0;Ka=0-La|0;Ma=Na&Ka;Pa=La+ -1+Oa&Ka;do{if((Oa-Na|0)>(La|0)|(Ma|0)==(Na|0)|(Pa|0)==(Oa|0)){oa=91}else{if(!((Ma|0)>(Pa|0)|(Pa|0)==(Ma+La|0))){oa=91;break}if((c[sa+12>>2]&7|0)==2){Qa=aa;break}c[sa>>2]=Na;c[da>>2]=Oa;c[sa+24>>2]=1;Qa=aa+1<<16>>16}}while(0);if((oa|0)==91){oa=0;Tc[c[S>>2]&31](d,W,Na,Oa,sa,da);Qa=aa}La=c[sa+4>>2]|0;if((La|0)==0){break}sa=La;ra=da+4|0;aa=Qa}if(!(Qa<<16>>16<1)){aa=Z;ra=m;while(1){sa=c[ra>>2]|0;Y=aa+24|0;if((c[Y>>2]|0)!=0){c[Y>>2]=0;Tc[c[R>>2]&31](d,W,c[aa>>2]|0,c[sa>>2]|0,aa,sa)}aa=c[aa+4>>2]|0;if((aa|0)==0){break}else{ra=sa+4|0}}}}Rc[c[Q>>2]&1023](d);ra=W+1<<16>>16;if((ra<<16>>16|0)>=(xa|0)){Ra=Z;Sa=ra;break f}rMa(l);rMa(m);W=ra}}else{Ra=c[l>>2]|0;Sa=Ia}}while(0);if((Ra|0)!=0){xa=Ra;do{W=xa;xa=c[xa+4>>2]|0;if((c[W+16>>2]|0)==0){qMa(l,W)}}while((xa|0)!=0)}xa=c[m>>2]|0;if((xa|0)!=0){W=xa;do{xa=W;W=c[W+4>>2]|0;if((c[xa+16>>2]|0)==0){qMa(m,xa)}}while((W|0)!=0)}if((c[B>>2]|0)<=0){Ga=Sa;break e}Ha=c[k>>2]|0;Ia=Sa;Ja=U<<16>>16}}else{Ga=_}}while(0);if(!(Ga<<16>>16>(b[j>>1]|0))){_=Ga;do{Rc[c[Q>>2]&1023](d);_=_+1<<16>>16}while(!(_<<16>>16>(b[j>>1]|0)))}}Ta=(c[n>>2]|0)+ -1|0}else{oa=54}}if((oa|0)==54){oa=0;if((c[v>>2]|0)!=98){p=1;oa=111;break}c[v>>2]=0;_=c[n>>2]|0;V=b[d+(_<<2)+962>>1]|0;o=b[d+(_<<2)+960>>1]|0;W=((V<<16>>16)+o|0)/2|0;if((_|0)>6){oa=57;break}xa=W<<16>>16;if((xa|0)<(o|0)){oa=57;break}b[d+(_+1<<2)+960>>1]=W;b[d+((c[n>>2]|0)+1<<2)+962>>1]=V;b[d+(c[n>>2]<<2)+962>>1]=xa+65535;Ta=(c[n>>2]|0)+1|0}c[n>>2]=Ta;if((Ta|0)>-1){T=Ta}else{p=0;oa=111;break}}if((oa|0)==27){c[v>>2]=20;p=1;i=g;return p|0}else if((oa|0)==57){c[n>>2]=0;c[v>>2]=20;p=20;i=g;return p|0}else if((oa|0)==68){c[v>>2]=20;p=20;i=g;return p|0}else if((oa|0)==111){i=g;return p|0}return 0}function lMa(a,b,c){a=a|0;b=b|0;c=c|0;return}function mMa(b,e,f,g,h,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0;j=i;h=c[b+4>>2]|0;if((g-f|0)>=(h|0)){i=j;return}k=0-h|0;l=f+ -1+h&k;if((l|0)!=(k&g|0)){i=j;return}g=e<<16>>16;e=l>>c[b>>2];if(!((e|0)>-1)){i=j;return}l=c[b+104>>2]|0;if((e|0)>=(l|0)){i=j;return}k=c[b+112>>2]|0;h=(g>>3)-(ca(k,e)|0)|0;if((k|0)>0){m=h+(ca(k,l+ -1|0)|0)|0}else{m=h}h=(c[b+60>>2]|0)+m|0;a[h>>0]=d[h>>0]|0|128>>>(g&7);i=j;return}function nMa(b,e,f,g,h,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;k=i;l=c[b+4>>2]|0;m=f+ -1|0;n=0-l|0;o=m+l&n;p=n&g;if((o|0)>(p|0)){q=c[h+12>>2]|0;r=q&7;if((o|0)!=(p+l|0)){i=k;return}if((r|0)==0){s=p}else if((r|0)==4){s=(c[b+8>>2]|0)+((m+g|0)/2|0)&n}else if((r|0)==5|(r|0)==1){if((c[h+28>>2]|0)==(j|0)?(c[h+16>>2]|0)<1:0){if((q&16|0)==0){i=k;return}if((g-f|0)<(c[b+8>>2]|0)){i=k;return}}if((c[j+28>>2]|0)==(h|0)?(c[h+20>>2]|0)==(e<<16>>16|0):0){if((q&32|0)==0){i=k;return}if((g-f|0)<(c[b+8>>2]|0)){i=k;return}}if((r|0)==1){s=p}else{s=(c[b+8>>2]|0)+((m+g|0)/2|0)&n}}else{i=k;return}n=c[b>>2]|0;if((s|0)<0){t=o}else{t=(s>>n|0)<(c[b+104>>2]|0)?s:p}s=((t|0)==(o|0)?p:o)>>n;p=c[b+60>>2]|0;g=e<<16>>16;m=g>>3;r=128>>>(g&7);g=b+104|0;f=c[b+112>>2]|0;q=m-(ca(s,f)|0)|0;if((f|0)>0){u=(ca((c[g>>2]|0)+ -1|0,f)|0)+q|0}else{u=q}q=p+u|0;if(((s|0)>-1?(s|0)<(c[g>>2]|0):0)?(r&(d[q>>0]|0)|0)!=0:0){i=k;return}else{v=m;w=r;x=n;y=p;z=t}}else{t=e<<16>>16;v=t>>3;w=128>>>(t&7);x=c[b>>2]|0;y=c[b+60>>2]|0;z=o}o=z>>x;if(!((o|0)>-1)){i=k;return}x=c[b+104>>2]|0;if((o|0)>=(x|0)){i=k;return}z=c[b+112>>2]|0;b=v-(ca(z,o)|0)|0;if((z|0)>0){A=b+(ca(z,x+ -1|0)|0)|0}else{A=b}b=y+A|0;a[b>>0]=d[b>>0]|0|w;i=k;return}function oMa(a){a=a|0;return}function pMa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;e=c[b>>2]|0;f=c[a>>2]|0;a:do{if((f|0)==0){g=a;h=0}else{j=a;k=f;while(1){l=k+4|0;if((e|0)<(c[k>>2]|0)){g=j;h=k;break a}k=c[l>>2]|0;if((k|0)==0){g=l;h=0;break}else{j=l}}}}while(0);c[b+4>>2]=h;c[g>>2]=b;i=d;return}function qMa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=a;while(1){a=c[e>>2]|0;if((a|0)==0){f=5;break}g=a+4|0;if((a|0)==(b|0)){break}else{e=g}}if((f|0)==5){i=d;return}c[e>>2]=c[g>>2];i=d;return}function rMa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;d=c[a>>2]|0;if((d|0)==0){i=b;return}else{e=d}do{d=e+8|0;f=c[d>>2]|0;c[e>>2]=c[f>>2];c[d>>2]=f+(((c[e+12>>2]|0)>>>2&2)+ -1<<2);f=e+16|0;c[f>>2]=(c[f>>2]|0)+ -1;e=c[e+4>>2]|0}while((e|0)!=0);e=c[a>>2]|0;if((e|0)==0){i=b;return}f=e+4|0;d=c[f>>2]|0;if((d|0)==0){i=b;return}else{g=e;h=f;j=d;k=a}while(1){if((c[g>>2]|0)>(c[j>>2]|0)){c[k>>2]=j;d=j+4|0;c[h>>2]=c[d>>2];c[d>>2]=g;l=c[a>>2]|0;m=a}else{l=j;m=h}h=l+4|0;j=c[h>>2]|0;if((j|0)==0){break}else{g=l;k=m}}i=b;return}function sMa(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;g=d+40|0;h=c[g>>2]|0;j=d+88|0;k=c[j>>2]|0;l=h-(c[k+8>>2]|0)|0;if((l|0)<0){c[d+44>>2]=99;m=1;i=f;return m|0}if((l|0)>0){c[k+16>>2]=l>>2;do{if(!(e<<24>>24==0)){l=(c[j>>2]|0)+12|0;k=c[l>>2]|0;if((k&8|0)==0){c[l>>2]=k|32;break}else{c[l>>2]=k|16;break}}}while(0);e=c[j>>2]|0;k=c[g>>2]|0;c[j>>2]=k;c[g>>2]=k+32;c[k+16>>2]=0;c[(c[j>>2]|0)+8>>2]=c[g>>2];c[e+28>>2]=c[j>>2];j=d+84|0;b[j>>1]=(b[j>>1]|0)+1<<16>>16;n=c[g>>2]|0}else{n=h}if(n>>>0<(c[d+36>>2]|0)>>>0){a[d+87>>0]=0;m=0;i=f;return m|0}else{c[d+44>>2]=98;m=1;i=f;return m|0}return 0}function tMa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=i;e=a+48|0;f=c[e>>2]|0;g=a+32|0;h=c[g>>2]|0;j=f;while(1){k=j+ -1|0;if((j|0)<=0){l=b;break}m=c[h+(k-f<<2)>>2]|0;if((m|0)>(b|0)){j=k}else{n=4;break}}a:do{if((n|0)==4){if((m|0)<(b|0)){o=b;p=k;while(1){q=h+(p-f<<2)|0;r=c[q>>2]|0;c[q>>2]=o;if((p|0)>0){o=r;p=p+ -1|0}else{l=r;break a}}}if((j|0)<1){l=b}else{s=0;i=d;return s|0}}}while(0);b=a+36|0;j=(c[b>>2]|0)+ -4|0;c[b>>2]=j;if(j>>>0>(c[a+40>>2]|0)>>>0){j=c[e>>2]|0;c[e>>2]=j+1;c[(c[g>>2]|0)+(~j<<2)>>2]=l;s=0;i=d;return s|0}else{c[a+44>>2]=98;s=1;i=d;return s|0}return 0}function uMa(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=i;g=b+100|0;h=c[g>>2]|0;do{if((h|0)==2){j=b+72|0;k=c[j>>2]|0;if((k|0)<(e|0)){l=b+4|0;m=c[l>>2]|0;n=b+8|0;if(!((sMa(b,((k+ -1+m&0-m)-k|0)>=(c[n>>2]|0)&1)|0)<<24>>24==0)){o=1;i=f;return o|0}k=c[j>>2]|0;j=c[l>>2]|0;if(!((yMa(b,1,((k+ -1+j&0-j)-k|0)>=(c[n>>2]|0)&1)|0)<<24>>24==0)){o=1;i=f;return o|0}else{p=12}}else{p=12}}else if((h|0)==1){n=b+72|0;k=c[n>>2]|0;if((k|0)>(e|0)){j=b+4|0;l=b+8|0;if(!((sMa(b,((c[j>>2]|0)+ -1&k|0)>=(c[l>>2]|0)&1)|0)<<24>>24==0)){o=1;i=f;return o|0}if(!((yMa(b,2,((c[j>>2]|0)+ -1&c[n>>2]|0)>=(c[l>>2]|0)&1)|0)<<24>>24==0)){o=1;i=f;return o|0}else{p=12}}else{p=12}}else if((h|0)==0){l=c[b+72>>2]|0;if((l|0)<(e|0)){n=c[b+4>>2]|0;if((yMa(b,1,((l+ -1+n&0-n)-l|0)>=(c[b+8>>2]|0)&1)|0)<<24>>24==0){p=12;break}else{o=1}i=f;return o|0}if((l|0)>(e|0)?!((yMa(b,2,((c[b+4>>2]|0)+ -1&l|0)>=(c[b+8>>2]|0)&1)|0)<<24>>24==0):0){o=1;i=f;return o|0}else{p=12}}else{q=h}}while(0);if((p|0)==12){q=c[g>>2]|0}if((q|0)==2){g=b+68|0;p=b+72|0;h=b+86|0;l=a[h>>0]|0;n=CMa(b,c[g>>2]|0,0-(c[p>>2]|0)|0,d,0-e|0,0-(c[b+80>>2]|0)|0,0-(c[b+76>>2]|0)|0)|0;if(!(l<<24>>24==0)?(a[h>>0]|0)==0:0){h=(c[b+88>>2]|0)+20|0;c[h>>2]=0-(c[h>>2]|0)}if(n<<24>>24==0){r=p;s=g}else{o=1;i=f;return o|0}}else if((q|0)==1){q=b+68|0;g=b+72|0;if((CMa(b,c[q>>2]|0,c[g>>2]|0,d,e,c[b+76>>2]|0,c[b+80>>2]|0)|0)<<24>>24==0){r=g;s=q}else{o=1;i=f;return o|0}}else{r=b+72|0;s=b+68|0}c[s>>2]=d;c[r>>2]=e;o=0;i=f;return o|0}function vMa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;g=i;h=a+184|0;j=a+52|0;c[j>>2]=h;k=a+68|0;c[a+200>>2]=c[k>>2];l=a+72|0;m=c[l>>2]|0;c[a+204>>2]=m;c[a+192>>2]=b;c[a+196>>2]=d;c[h>>2]=e;c[a+188>>2]=f;b=a+100|0;n=a+76|0;o=a+80|0;p=a+4|0;q=a+8|0;r=m;m=f;f=d;d=h;s=e;a:while(1){e=(r|0)>(m|0);do{if(!((f|0)<((e?m:r)|0)|(f|0)>((e?r:m)|0))){if((r|0)==(m|0)){c[j>>2]=d+ -16;break}t=(r|0)<(m|0);u=t?1:2;v=c[b>>2]|0;if((v|0)!=(u|0)){w=c[p>>2]|0;if(t){x=((r+ -1+w&0-w)-r|0)>=(c[q>>2]|0)}else{x=(w+ -1&r|0)>=(c[q>>2]|0)}w=x&1;if((v|0)!=0?!((sMa(a,w)|0)<<24>>24==0):0){y=1;z=19;break a}if(!((yMa(a,u,w)|0)<<24>>24==0)){y=1;z=19;break a}}w=c[n>>2]|0;u=c[o>>2]|0;if(t){if((zMa(a,2,575,w,u)|0)<<24>>24==0){break}else{y=1;z=19;break a}}else{if((AMa(a,2,575,w,u)|0)<<24>>24==0){break}else{y=1;z=19;break a}}}else{BMa(d);c[j>>2]=(c[j>>2]|0)+16}}while(0);e=c[j>>2]|0;if(e>>>0<h>>>0){z=18;break}r=c[e+20>>2]|0;m=c[e+4>>2]|0;f=c[e+12>>2]|0;d=e;s=c[e>>2]|0}if((z|0)==18){c[k>>2]=s;c[l>>2]=m;y=0;i=g;return y|0}else if((z|0)==19){i=g;return y|0}return 0}function wMa(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;j=i;k=a+184|0;l=a+52|0;c[l>>2]=k;m=a+68|0;c[a+208>>2]=c[m>>2];n=a+72|0;o=c[n>>2]|0;c[a+212>>2]=o;c[a+200>>2]=b;c[a+204>>2]=d;c[a+192>>2]=e;c[a+196>>2]=f;c[k>>2]=g;c[a+188>>2]=h;e=a+100|0;b=a+76|0;p=a+80|0;q=a+4|0;r=a+8|0;s=o;o=h;h=d;d=f;f=k;t=g;a:while(1){g=(s|0)<=(o|0);u=(h|0)>(d|0);do{if(!(((u?d:h)|0)<((g?s:o)|0)?1:((u?h:d)|0)>((g?o:s)|0))){if((s|0)==(o|0)){c[l>>2]=f+ -24;break}v=g?1:2;w=c[e>>2]|0;if((w|0)!=(v|0)){x=c[q>>2]|0;if(g){y=((s+ -1+x&0-x)-s|0)>=(c[r>>2]|0)}else{y=(x+ -1&s|0)>=(c[r>>2]|0)}x=y&1;if((w|0)!=0?!((sMa(a,x)|0)<<24>>24==0):0){z=1;A=19;break a}if(!((yMa(a,v,x)|0)<<24>>24==0)){z=1;A=19;break a}}x=c[b>>2]|0;v=c[p>>2]|0;if(g){if((zMa(a,3,576,x,v)|0)<<24>>24==0){break}else{z=1;A=19;break a}}else{if((AMa(a,3,576,x,v)|0)<<24>>24==0){break}else{z=1;A=19;break a}}}else{xMa(f);c[l>>2]=(c[l>>2]|0)+24}}while(0);g=c[l>>2]|0;if(g>>>0<k>>>0){A=18;break}s=c[g+28>>2]|0;o=c[g+4>>2]|0;h=c[g+20>>2]|0;d=c[g+12>>2]|0;f=g;t=c[g>>2]|0}if((A|0)==18){c[m>>2]=t;c[n>>2]=o;z=0;i=j;return z|0}else if((A|0)==19){i=j;return z|0}return 0}function xMa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;b=a+24|0;d=c[b>>2]|0;c[a+48>>2]=d;e=a+8|0;f=a+16|0;g=c[f>>2]|0;h=(c[e>>2]|0)+1|0;i=h+(c[a>>2]|0)>>1;c[e>>2]=i;e=g+1+d>>1;c[a+40>>2]=e;d=(h+g>>1)+1|0;g=d+i>>1;c[f>>2]=g;f=d+e>>1;c[a+32>>2]=f;c[b>>2]=g+1+f>>1;f=a+28|0;g=c[f>>2]|0;c[a+52>>2]=g;b=a+12|0;e=a+20|0;d=c[e>>2]|0;i=(c[b>>2]|0)+1|0;h=i+(c[a+4>>2]|0)>>1;c[b>>2]=h;b=d+1+g>>1;c[a+44>>2]=b;g=(i+d>>1)+1|0;d=g+h>>1;c[e>>2]=d;e=g+b>>1;c[a+36>>2]=e;c[f>>2]=d+1+e>>1;return}function yMa(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;h=b+92|0;j=b+40|0;k=c[j>>2]|0;if((c[h>>2]|0)==0){c[b+88>>2]=k;c[h>>2]=k;h=k+32|0;c[j>>2]=h;l=h}else{l=k}if(!(l>>>0<(c[b+36>>2]|0)>>>0)){c[b+44>>2]=98;m=1;i=g;return m|0}l=b+88|0;c[(c[l>>2]|0)+12>>2]=0;c[(c[l>>2]|0)+20>>2]=0;c[(c[l>>2]|0)+16>>2]=0;c[(c[l>>2]|0)+8>>2]=c[j>>2];c[(c[l>>2]|0)+4>>2]=0;c[(c[l>>2]|0)+28>>2]=0;c[(c[l>>2]|0)+12>>2]=d[b+180>>0]|0;if((e|0)==1){j=(c[l>>2]|0)+12|0;c[j>>2]=c[j>>2]|8;if(!(f<<24>>24==0)){j=(c[l>>2]|0)+12|0;c[j>>2]=c[j>>2]|32}}else if((e|0)==2){if(!(f<<24>>24==0)){f=(c[l>>2]|0)+12|0;c[f>>2]=c[f>>2]|16}}else{c[b+44>>2]=20;m=1;i=g;return m|0}f=b+96|0;if((c[f>>2]|0)==0){c[f>>2]=c[l>>2]}c[b+100>>2]=e;a[b+86>>0]=1;a[b+87>>0]=0;m=0;i=g;return m|0}function zMa(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;h=i;j=b+52|0;k=c[j>>2]|0;l=c[k+(d<<3)+4>>2]|0;m=c[k+4>>2]|0;n=b+40|0;o=c[n>>2]|0;a:do{if(!((m|0)<(f|0)|(l|0)>(g|0))){p=b+4|0;q=c[p>>2]|0;r=0-q|0;s=m&r;t=(s|0)>(g|0)?g:s;if((l|0)>=(f|0)){s=l+ -1+q&r;if((l&65535&q+65535|0)==0){q=b+87|0;if((a[q>>0]|0)==0){u=o}else{a[q>>0]=0;u=o+ -4|0}c[u>>2]=c[k+(d<<3)>>2];v=(c[p>>2]|0)+s|0;w=s;x=u+4|0}else{v=s;w=s;x=o}}else{v=f;w=f;x=o}s=b+86|0;if((a[s>>0]|0)!=0){c[(c[b+88>>2]|0)+20>>2]=w>>c[b>>2];a[s>>0]=0}if((t|0)<(v|0)){y=x}else{if(!((x+((t-v>>c[b>>2])+1<<2)|0)>>>0<(c[b+36>>2]|0)>>>0)){c[n>>2]=x;c[b+44>>2]=98;z=1;i=h;return z|0}s=b+87|0;q=b+16|0;r=0-d|0;A=k;B=v;C=x;while(1){D=A;while(1){a[s>>0]=0;E=c[D+4>>2]|0;if((E|0)<=(B|0)){F=19;break}G=D+(d<<3)|0;H=c[D+(d<<3)+4>>2]|0;I=E-H|0;if((I|0)<(c[q>>2]|0)){F=16;break}Rc[e&1023](D);if(G>>>0<k>>>0){y=C;break a}else{D=G}}if((F|0)==16){F=0;J=c[G>>2]|0;c[C>>2]=((ca((c[D>>2]|0)-J|0,B-H|0)|0)/(I|0)|0)+J;K=(c[p>>2]|0)+B|0;L=C+4|0}else if((F|0)==19){F=0;if((E|0)==(B|0)){a[s>>0]=1;c[C>>2]=c[D>>2];K=(c[p>>2]|0)+B|0;L=C+4|0}else{K=B;L=C}}A=D+(r<<3)|0;if(A>>>0<k>>>0|(K|0)>(t|0)){y=L;break}else{B=K;C=L}}}}else{y=o}}while(0);c[n>>2]=y;c[j>>2]=(c[j>>2]|0)+(0-d<<3);z=0;i=h;return z|0}function AMa(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0;h=i;j=c[b+52>>2]|0;k=j+4|0;c[k>>2]=0-(c[k>>2]|0);l=j+12|0;c[l>>2]=0-(c[l>>2]|0);l=j+20|0;c[l>>2]=0-(c[l>>2]|0);if((d|0)>2){l=j+28|0;c[l>>2]=0-(c[l>>2]|0)}l=b+86|0;j=a[l>>0]|0;m=zMa(b,d,e,0-g|0,0-f|0)|0;if(!(j<<24>>24==0)?(a[l>>0]|0)==0:0){l=(c[b+88>>2]|0)+20|0;c[l>>2]=0-(c[l>>2]|0)}c[k>>2]=0-(c[k>>2]|0);i=h;return m|0}function BMa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=a+16|0;d=c[b>>2]|0;c[a+32>>2]=d;e=a+8|0;f=c[e>>2]|0;g=(d+f|0)/2|0;c[a+24>>2]=g;d=((c[a>>2]|0)+f|0)/2|0;c[e>>2]=d;c[b>>2]=(d+g|0)/2|0;g=a+20|0;d=c[g>>2]|0;c[a+36>>2]=d;b=a+12|0;e=c[b>>2]|0;f=(d+e|0)/2|0;c[a+28>>2]=f;d=((c[a+4>>2]|0)+e|0)/2|0;c[b>>2]=d;c[g>>2]=(d+f|0)/2|0;return}function CMa(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;k=i;l=f-d|0;f=g-e|0;if((f|0)<1|(g|0)<(h|0)|(e|0)>(j|0)){m=0;i=k;return m|0}if((e|0)<(h|0)){n=(ODa(l,h-e|0,f)|0)+d|0;o=c[b>>2]|0;p=n;q=o;r=h>>o;s=0}else{o=c[b>>2]|0;p=d;q=o;r=e>>o;s=(c[b+4>>2]|0)+ -1&e}if((g|0)>(j|0)){t=0;u=j}else{t=(c[b+4>>2]|0)+ -1&g;u=g}g=u>>q;do{if((s|0)>0){if((r|0)==(g|0)){m=0;i=k;return m|0}else{v=(ODa(l,(c[b+4>>2]|0)-s|0,f)|0)+p|0;w=b+87|0;x=r+1|0;break}}else{q=b+87|0;if((a[q>>0]|0)==0){v=p;w=q;x=r}else{u=b+40|0;c[u>>2]=(c[u>>2]|0)+ -4;a[q>>0]=0;v=p;w=q;x=r}}}while(0);a[w>>0]=(t|0)==0&1;t=b+86|0;if((a[t>>0]|0)!=0){c[(c[b+88>>2]|0)+20>>2]=x;a[t>>0]=0}t=g-x|0;w=t+1|0;r=b+40|0;if(!(((c[r>>2]|0)+(w<<2)|0)>>>0<(c[b+36>>2]|0)>>>0)){c[b+44>>2]=98;m=1;i=k;return m|0}p=b+4|0;b=c[p>>2]|0;if((l|0)>0){s=RDa(b,l,f)|0;y=ca(c[p>>2]|0,l)|0;z=1;A=s}else{s=0-l|0;l=0-(RDa(b,s,f)|0)|0;y=ca(c[p>>2]|0,s)|0;z=-1;A=l}l=(y|0)%(f|0)|0;y=c[r>>2]|0;if((t|0)>-1){t=x+ -1-g|0;s=g+((t|0)>-1?t:-1)+2-x|0;x=v;v=0-f|0;t=w;w=y;while(1){c[w>>2]=x;g=x+A|0;p=v+l|0;if((p|0)>-1){B=g+z|0;C=p-f|0}else{B=g;C=p}t=t+ -1|0;if((t|0)<=0){break}else{x=B;v=C;w=w+4|0}}D=y+(s<<2)|0}else{D=y}c[r>>2]=D;m=0;i=k;return m|0}function DMa(a,b){a=a|0;b=b|0;c[a+16>>2]=b;return 0}function EMa(a,b){a=a|0;b=b|0;var e=0,f=0;e=i;if(!(b>>>0<256)){f=0;i=e;return f|0}f=d[(c[a+16>>2]|0)+(b+6)>>0]|0;i=e;return f|0}function FMa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;f=c[b+16>>2]|0;b=c[d>>2]|0;g=0;while(1){h=b+1|0;if(!(h>>>0<256)){j=g;k=0;break}l=a[f+(b+7)>>0]|0;m=l&255;if(l<<24>>24==0){b=h;g=m}else{j=m;k=h;break}}c[d>>2]=k;i=e;return j|0}function GMa(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=(d[a+2>>0]|0)<<8|(d[a+3>>0]|0);if(f>>>0<262?1:(a+f|0)>>>0>(c[b+4>>2]|0)>>>0){lEa(b,8)}if((c[b+8>>2]|0)==0){i=e;return 0}f=c[b+172>>2]|0;g=1;h=a+6|0;while(1){if(!((d[h>>0]|0)>>>0<f>>>0)){j=6;break}if((g|0)==256){j=9;break}g=g+1|0;h=h+1|0}if((j|0)==6){lEa(b,16)}else if((j|0)==9){i=e;return 0}return 0}function HMa(a,b){a=a|0;b=b|0;var e=0;e=c[a+16>>2]|0;c[b+4>>2]=0;c[b>>2]=(d[e+4>>0]|0)<<8|(d[e+5>>0]|0);return 0}function IMa(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0;e=i;f=sOa(c[a+16>>2]|0,b)|0;if((f|0)==0){g=0;i=e;return g|0}a=(d[f+6>>0]|0)<<8|(d[f+7>>0]|0);h=(b&255)-((d[f>>0]|0)<<8|(d[f+1>>0]|0))|0;if((a|0)==0?1:h>>>0>=((d[f+2>>0]|0)<<8|(d[f+3>>0]|0))>>>0){g=0;i=e;return g|0}b=a+(h<<1)|0;h=(d[f+(b+6)>>0]|0)<<8|(d[f+(b+7)>>0]|0);if((h|0)==0){g=0;i=e;return g|0}g=h+((d[f+4>>0]|0)<<8|(d[f+5>>0]|0))&65535;i=e;return g|0}function JMa(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=i;f=c[a+16>>2]|0;a=(c[b>>2]|0)+1|0;if(a>>>0<65536){g=a}else{h=0;j=0;c[b>>2]=j;i=e;return h|0}a:while(1){a=sOa(f,g)|0;if((a|0)!=0?(k=(d[a>>0]|0)<<8|(d[a+1>>0]|0),l=(d[a+2>>0]|0)<<8|(d[a+3>>0]|0),m=(d[a+4>>0]|0)<<8|(d[a+5>>0]|0),n=(d[a+6>>0]|0)<<8|(d[a+7>>0]|0),o=g&255,(n|0)!=0):0){p=o>>>0<k>>>0;q=p?0:o-k|0;r=(p?k:o)+(g&-256)|0;if(q>>>0<l>>>0){o=r;k=a+((q<<1)+6+n)|0;n=q;while(1){q=(d[k>>0]|0)<<8|(d[k+1>>0]|0);k=k+2|0;if((q|0)!=0?(a=q+m&65535,(a|0)!=0):0){h=a;j=o;s=10;break a}n=n+1|0;a=o+1|0;if(!(n>>>0<l>>>0)){t=a;break}else{o=a}}}else{t=r}}else{t=g}g=t+256&-256;if(!(g>>>0<65536)){h=0;j=0;s=10;break}}if((s|0)==10){c[b>>2]=j;i=e;return h|0}return 0}function KMa(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=i;f=(d[a+2>>0]|0)<<8|(d[a+3>>0]|0);g=a+f|0;h=b+4|0;if(f>>>0<518?1:g>>>0>(c[h>>2]|0)>>>0){lEa(b,8)}f=b+8|0;j=a+518|0;k=0;l=0;m=a+6|0;do{n=d[m+1>>0]|0;o=(d[m>>0]|0)<<8|n;m=m+2|0;if((c[f>>2]|0)>>>0>1?(n&7|0)!=0:0){p=6;break}n=o>>>3;k=n>>>0>k>>>0?n:k;l=l+1|0}while((l|0)!=256);if((p|0)==6){lEa(b,8)}l=a+((k<<3)+526)|0;if(l>>>0>(c[h>>2]|0)>>>0){lEa(b,8)}h=b+172|0;a=0;m=j;a:while(1){j=(d[m>>0]|0)<<8|(d[m+1>>0]|0);n=(d[m+2>>0]|0)<<8|(d[m+3>>0]|0);o=(d[m+4>>0]|0)<<8|(d[m+5>>0]|0);q=m+8|0;r=(d[m+6>>0]|0)<<8|(d[m+7>>0]|0);if((n|0)!=0){if((c[f>>2]|0)>>>0>1){if(j>>>0>255){p=15;break}if((n+j|0)>>>0>256){p=15;break}}if((r|0)!=0){j=r+6|0;if((m+j|0)>>>0<l>>>0){p=19;break}r=n<<1;if((m+(j+r)|0)>>>0>g>>>0){p=19;break}if((c[f>>2]|0)!=0?(j=r+8|0,r=m+j|0,j>>>0>8):0){j=q;while(1){n=j+2|0;s=(d[j>>0]|0)<<8|(d[j+1>>0]|0);if((s|0)!=0?!((s+o&65535)>>>0<(c[h>>2]|0)>>>0):0){p=24;break a}if(n>>>0<r>>>0){j=n}else{t=n;break}}}else{t=q}}else{t=q}}else{t=q}a=a+1|0;if(a>>>0>k>>>0){p=27;break}else{m=t}}if((p|0)==15){lEa(b,8)}else if((p|0)==19){lEa(b,9)}else if((p|0)==24){lEa(b,16)}else if((p|0)==27){i=e;return 0}return 0}function LMa(a,b){a=a|0;b=b|0;var e=0;e=c[a+16>>2]|0;c[b+4>>2]=2;c[b>>2]=(d[e+4>>0]|0)<<8|(d[e+5>>0]|0);return 0}function MMa(a,b){a=a|0;b=b|0;c[a+16>>2]=b;c[a+32>>2]=((d[b+6>>0]|0)<<8|(d[b+7>>0]|0))>>>1;c[a+24>>2]=-1;c[a+28>>2]=0;return 0}function NMa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;c[e>>2]=b;do{if(!(b>>>0>65535)){if((c[a+20>>2]&1|0)==0){f=qOa(a,e,0)|0;break}else{f=oOa(a,e,0)|0;break}}else{f=0}}while(0);i=d;return f|0}function OMa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=c[b>>2]|0;do{if(!(e>>>0>65534)){if((c[a+20>>2]&1|0)!=0){f=oOa(a,b,1)|0;break}g=a+24|0;if((e|0)!=(c[g>>2]|0)){f=qOa(a,b,1)|0;break}pOa(a);h=c[a+28>>2]|0;if((h|0)!=0){c[b>>2]=c[g>>2];f=h}else{f=0}}else{f=0}}while(0);i=d;return f|0}function PMa(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;f=i;g=(d[b+2>>0]|0)<<8|(d[b+3>>0]|0);if(g>>>0<16){lEa(e,8)}h=e+4|0;j=e+8|0;do{if((b+g|0)>>>0>(c[h>>2]|0)>>>0){if((c[j>>2]|0)==0){k=(c[h>>2]|0)-b|0;break}else{lEa(e,8)}}else{k=g}}while(0);g=d[b+7>>0]|0;l=(d[b+6>>0]|0)<<8|g;if((c[j>>2]|0)>>>0>1?(g&1|0)!=0:0){lEa(e,8)}g=l>>>1;l=g<<1;if(k>>>0<((g<<3)+16|0)>>>0){lEa(e,8)}if((c[j>>2]|0)>>>0>1){m=a[b+9>>0]|0;n=(d[b+10>>0]|0)<<8|(d[b+11>>0]|0);o=a[b+13>>0]|0;p=(d[b+12>>0]|0)<<8|o&255;if(!(((o|m)&1)==0)){lEa(e,8)}o=((d[b+8>>0]|0)<<8|m&255)>>>1;if(o>>>0>g>>>0|o<<1>>>0<g>>>0){lEa(e,8)}if(((p>>>1)+o|0)!=(g|0)){lEa(e,8)}if((o|0)!=(1<<n|0)){lEa(e,8)}}n=b+14|0;o=l+16|0;p=b+o|0;m=o+l|0;o=b+m|0;q=m+l|0;m=b+q|0;r=b+(q+l)|0;if((c[j>>2]|0)>>>0>1?((d[b+(l+12)>>0]|0)<<8|(d[b+(l+13)>>0]|0)|0)!=65535:0){lEa(e,8)}if((g|0)==0){s=0;i=f;return s|0}l=g+ -1|0;q=e+172|0;t=b+k|0;k=0;b=0;u=0;v=0;w=o;o=n;n=m;m=p;a:while(1){p=u;u=(d[m>>0]|0)<<8|(d[m+1>>0]|0);m=m+2|0;x=b;b=(d[o>>0]|0)<<8|(d[o+1>>0]|0);o=o+2|0;y=(d[w>>0]|0)<<8|(d[w+1>>0]|0);w=w+2|0;z=(d[n>>0]|0)<<8|(d[n+1>>0]|0);if(u>>>0>b>>>0){A=25;break}do{if(!(u>>>0>x>>>0|(v|0)==0)){if((c[j>>2]|0)!=0){A=28;break a}if(p>>>0>u>>>0|x>>>0>b>>>0){B=k|1;break}else{B=k|2;break}}else{B=k}}while(0);if((z|0)==65535){if((c[j>>2]|0)>>>0>1){A=48;break}if(!((v|0)==(l|0)&(u|0)==65535&(b|0)==65535)){A=48;break}}else if((z|0)!=0){x=n+z|0;if((c[j>>2]|0)==0){if(!((v|0)==(l|0)&(u|0)==65535&(b|0)==65535)){if(x>>>0<r>>>0){A=40;break}if((n+((b-u<<1)+2+z)|0)>>>0>(c[h>>2]|0)>>>0){A=40;break}}}else{if(x>>>0<r>>>0){A=36;break}if((n+((b-u<<1)+2+z)|0)>>>0>t>>>0){A=36;break}}if((c[j>>2]|0)!=0&u>>>0<b>>>0){p=u;C=x;do{x=(d[C>>0]|0)<<8|(d[C+1>>0]|0);C=C+2|0;if((x|0)!=0?!((x+y&65535)>>>0<(c[q>>2]|0)>>>0):0){A=44;break a}p=p+1|0}while((p|0)!=(b|0))}}n=n+2|0;v=v+1|0;if(!(v>>>0<g>>>0)){s=B;A=50;break}else{k=B}}if((A|0)==25){lEa(e,8)}else if((A|0)==28){lEa(e,8)}else if((A|0)==36){lEa(e,8)}else if((A|0)==40){lEa(e,8)}else if((A|0)==44){lEa(e,16)}else if((A|0)==48){lEa(e,8)}else if((A|0)==50){i=f;return s|0}return 0}function QMa(a,b){a=a|0;b=b|0;var e=0;e=c[a+16>>2]|0;c[b+4>>2]=4;c[b>>2]=(d[e+4>>0]|0)<<8|(d[e+5>>0]|0);return 0}function RMa(a,b){a=a|0;b=b|0;var e=0,f=0,g=0;e=i;f=c[a+16>>2]|0;a=b-((d[f+6>>0]|0)<<8|(d[f+7>>0]|0))|0;if(!(a>>>0<((d[f+8>>0]|0)<<8|(d[f+9>>0]|0))>>>0)){g=0;i=e;return g|0}b=a<<1;g=(d[f+(b+10)>>0]|0)<<8|(d[f+(b+11)>>0]|0);i=e;return g|0}function SMa(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;f=c[a+16>>2]|0;a=(c[b>>2]|0)+1|0;g=(d[f+6>>0]|0)<<8|(d[f+7>>0]|0);h=(d[f+8>>0]|0)<<8|(d[f+9>>0]|0);a:do{if(!(a>>>0>65535)?(j=a>>>0<g>>>0?g:a,k=j-g|0,k>>>0<h>>>0):0){l=j;j=k;m=f+((k<<1)+10)|0;while(1){k=(d[m>>0]|0)<<8|(d[m+1>>0]|0);if((k|0)!=0){n=k;o=l;break a}j=j+1|0;if(!(j>>>0<h>>>0)){n=0;o=0;break}else{l=l+1|0;m=m+2|0}}}else{n=0;o=0}}while(0);c[b>>2]=o;i=e;return n|0}function TMa(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;f=a+10|0;g=b+4|0;if(f>>>0>(c[g>>2]|0)>>>0){lEa(b,8)}h=(d[a+2>>0]|0)<<8|(d[a+3>>0]|0);j=(d[a+8>>0]|0)<<8|(d[a+9>>0]|0);if((a+h|0)>>>0>(c[g>>2]|0)>>>0){lEa(b,8)}if(h>>>0<(j+10|0)>>>0){lEa(b,8)}if((c[b+8>>2]|0)==0|(j|0)==0){i=e;return 0}h=c[b+172>>2]|0;g=j;j=f;while(1){if(!(((d[j>>0]|0)<<8|(d[j+1>>0]|0))>>>0<h>>>0)){k=9;break}g=g+ -1|0;if((g|0)==0){k=11;break}else{j=j+2|0}}if((k|0)==9){lEa(b,16)}else if((k|0)==11){i=e;return 0}return 0}function UMa(a,b){a=a|0;b=b|0;var e=0;e=c[a+16>>2]|0;c[b+4>>2]=6;c[b>>2]=(d[e+4>>0]|0)<<8|(d[e+5>>0]|0);return 0}function VMa(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;f=c[a+16>>2]|0;a=(d[f+8205>>0]|0)<<16|(d[f+8204>>0]|0)<<24|(d[f+8206>>0]|0)<<8|(d[f+8207>>0]|0);if((a|0)==0){g=0;i=e;return g|0}h=a;a=f+8208|0;while(1){j=(d[a+1>>0]|0)<<16|(d[a>>0]|0)<<24|(d[a+2>>0]|0)<<8|(d[a+3>>0]|0);if(j>>>0>b>>>0){g=0;k=7;break}h=h+ -1|0;if(!(((d[a+4>>0]|0)<<24|(d[a+5>>0]|0)<<16|(d[a+6>>0]|0)<<8|(d[a+7>>0]|0))>>>0<b>>>0)){k=6;break}if((h|0)==0){g=0;k=7;break}else{a=a+12|0}}if((k|0)==6){g=b-j+((d[a+9>>0]|0)<<16|(d[a+8>>0]|0)<<24|(d[a+10>>0]|0)<<8|(d[a+11>>0]|0))|0;i=e;return g|0}else if((k|0)==7){i=e;return g|0}return 0}function WMa(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;f=c[a+16>>2]|0;a=(d[f+8205>>0]|0)<<16|(d[f+8204>>0]|0)<<24|(d[f+8206>>0]|0)<<8|(d[f+8207>>0]|0);if((a|0)==0){g=0;h=0;c[b>>2]=h;i=e;return g|0}j=(c[b>>2]|0)+1|0;k=a;a=f+8208|0;while(1){f=(d[a+1>>0]|0)<<16|(d[a>>0]|0)<<24|(d[a+2>>0]|0)<<8|(d[a+3>>0]|0);j=j>>>0<f>>>0?f:j;if(!(j>>>0>((d[a+5>>0]|0)<<16|(d[a+4>>0]|0)<<24|(d[a+6>>0]|0)<<8|(d[a+7>>0]|0))>>>0)?(l=((d[a+8>>0]|0)<<24|(d[a+9>>0]|0)<<16|(d[a+10>>0]|0)<<8|(d[a+11>>0]|0))+(j-f)|0,(l|0)!=0):0){g=l;h=j;m=6;break}a=a+12|0;k=k+ -1|0;if((k|0)==0){g=0;h=0;m=6;break}}if((m|0)==6){c[b>>2]=h;i=e;return g|0}return 0}function XMa(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;e=i;f=a+8208|0;g=b+4|0;if(f>>>0>(c[g>>2]|0)>>>0){lEa(b,8)}h=(d[a+5>>0]|0)<<16|(d[a+4>>0]|0)<<24|(d[a+6>>0]|0)<<8|(d[a+7>>0]|0);if(h>>>0<8208?1:h>>>0>((c[g>>2]|0)-a|0)>>>0){lEa(b,8)}h=(d[a+8205>>0]|0)<<16|(d[a+8204>>0]|0)<<24|(d[a+8206>>0]|0)<<8|(d[a+8207>>0]|0);if((a+((h*12|0)+8208)|0)>>>0>(c[g>>2]|0)>>>0){lEa(b,8)}if((h|0)==0){i=e;return 0}g=b+8|0;j=b+172|0;k=0;l=0;m=f;a:while(1){f=(d[m+1>>0]|0)<<16|(d[m>>0]|0)<<24;n=f|(d[m+2>>0]|0)<<8|(d[m+3>>0]|0);o=(d[m+5>>0]|0)<<16|(d[m+4>>0]|0)<<24;p=k;k=o|(d[m+6>>0]|0)<<8|(d[m+7>>0]|0);if(n>>>0>k>>>0){q=10;break}if(!((l|0)==0|n>>>0>p>>>0)){q=12;break}do{if((c[g>>2]|0)!=0){p=k-n|0;if(!((p+((d[m+9>>0]|0)<<16|(d[m+8>>0]|0)<<24|(d[m+10>>0]|0)<<8|(d[m+11>>0]|0))|0)>>>0<(c[j>>2]|0)>>>0)){q=15;break a}r=p+1|0;if((f|0)==0){if((o|0)!=0){q=24;break a}if((r|0)==0){break}else{s=r;t=n}while(1){if(((d[a+((t>>>3&8191)+12)>>0]|0)&128>>>(t&7)|0)!=0){q=27;break a}s=s+ -1|0;if((s|0)==0){break}else{t=t+1|0}}}else{if((r|0)==0){break}else{u=r;v=n}while(1){if(((d[a+((v>>>19)+12)>>0]|0)&128>>>(v>>>16&7)|0)==0){q=19;break a}if(((d[a+((v>>>3&8191)+12)>>0]|0)&128>>>(v&7)|0)==0){q=21;break a}u=u+ -1|0;if((u|0)==0){break}else{v=v+1|0}}}}}while(0);m=m+12|0;l=l+1|0;if((l|0)==(h|0)){q=30;break}}if((q|0)==10){lEa(b,8)}else if((q|0)==12){lEa(b,8)}else if((q|0)==15){lEa(b,16)}else if((q|0)==19){lEa(b,8)}else if((q|0)==21){lEa(b,8)}else if((q|0)==24){lEa(b,8)}else if((q|0)==27){lEa(b,8)}else if((q|0)==30){i=e;return 0}return 0}function YMa(a,b){a=a|0;b=b|0;var e=0;e=c[a+16>>2]|0;c[b+4>>2]=8;c[b>>2]=(d[e+9>>0]|0)<<16|(d[e+8>>0]|0)<<24|(d[e+10>>0]|0)<<8|(d[e+11>>0]|0);return 0}function ZMa(a,b){a=a|0;b=b|0;var e=0,f=0,g=0;e=i;f=c[a+16>>2]|0;a=b-((d[f+13>>0]|0)<<16|(d[f+12>>0]|0)<<24|(d[f+14>>0]|0)<<8|(d[f+15>>0]|0))|0;if(!(a>>>0<((d[f+17>>0]|0)<<16|(d[f+16>>0]|0)<<24|(d[f+18>>0]|0)<<8|(d[f+19>>0]|0))>>>0)){g=0;i=e;return g|0}b=a<<1;g=(d[f+(b+20)>>0]|0)<<8|(d[f+(b+21)>>0]|0);i=e;return g|0}function _Ma(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;f=c[a+16>>2]|0;a=(c[b>>2]|0)+1|0;g=(d[f+13>>0]|0)<<16|(d[f+12>>0]|0)<<24|(d[f+14>>0]|0)<<8|(d[f+15>>0]|0);h=(d[f+17>>0]|0)<<16|(d[f+16>>0]|0)<<24|(d[f+18>>0]|0)<<8|(d[f+19>>0]|0);j=a>>>0<g>>>0?g:a;a=j-g|0;if(!(a>>>0<h>>>0)){k=j;l=0;c[b>>2]=k;i=e;return l|0}g=j;j=a;m=f+((a<<1)+20)|0;while(1){a=(d[m>>0]|0)<<8|(d[m+1>>0]|0);if((a|0)!=0){k=g;l=a;n=5;break}a=g+1|0;j=j+1|0;if(!(j>>>0<h>>>0)){k=a;l=0;n=5;break}else{g=a;m=m+2|0}}if((n|0)==5){c[b>>2]=k;i=e;return l|0}return 0}function $Ma(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;f=a+20|0;g=b+4|0;if(f>>>0>(c[g>>2]|0)>>>0){lEa(b,8)}h=(d[a+5>>0]|0)<<16|(d[a+4>>0]|0)<<24|(d[a+6>>0]|0)<<8|(d[a+7>>0]|0);j=(d[a+17>>0]|0)<<16|(d[a+16>>0]|0)<<24|(d[a+18>>0]|0)<<8|(d[a+19>>0]|0);if(h>>>0>((c[g>>2]|0)-a|0)>>>0){lEa(b,8)}if(h>>>0<((j<<1)+20|0)>>>0){lEa(b,8)}if((c[b+8>>2]|0)==0|(j|0)==0){i=e;return 0}h=c[b+172>>2]|0;a=j;j=f;while(1){if(!(((d[j>>0]|0)<<8|(d[j+1>>0]|0))>>>0<h>>>0)){k=9;break}a=a+ -1|0;if((a|0)==0){k=11;break}else{j=j+2|0}}if((k|0)==9){lEa(b,16)}else if((k|0)==11){i=e;return 0}return 0}function aNa(a,b){a=a|0;b=b|0;var e=0;e=c[a+16>>2]|0;c[b+4>>2]=10;c[b>>2]=(d[e+9>>0]|0)<<16|(d[e+8>>0]|0)<<24|(d[e+10>>0]|0)<<8|(d[e+11>>0]|0);return 0}function bNa(b,e){b=b|0;e=e|0;c[b+16>>2]=e;c[b+40>>2]=(d[e+13>>0]|0)<<16|(d[e+12>>0]|0)<<24|(d[e+14>>0]|0)<<8|(d[e+15>>0]|0);a[b+24>>0]=0;return 0}function cNa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;c[e>>2]=b;b=nOa(a,e,0)|0;i=d;return b|0}function dNa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=b+28|0;g=c[f>>2]|0;do{if((g|0)==-1){h=0}else{j=b+24|0;if((a[j>>0]|0)!=0?(g|0)==(c[d>>2]|0):0){mOa(b);if((a[j>>0]|0)==0){h=0;break}j=c[b+32>>2]|0;if((j|0)==0){h=0;break}c[d>>2]=c[f>>2];h=j;break}h=nOa(b,d,1)|0}}while(0);i=e;return h|0}function eNa(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;f=a+16|0;g=b+4|0;if(f>>>0>(c[g>>2]|0)>>>0){lEa(b,8)}h=(d[a+5>>0]|0)<<16|(d[a+4>>0]|0)<<24|(d[a+6>>0]|0)<<8|(d[a+7>>0]|0);j=(d[a+13>>0]|0)<<16|(d[a+12>>0]|0)<<24|(d[a+14>>0]|0)<<8|(d[a+15>>0]|0);if(h>>>0>((c[g>>2]|0)-a|0)>>>0){lEa(b,8)}if(h>>>0<((j*12|0)+16|0)>>>0){lEa(b,8)}if((j|0)==0){i=e;return 0}h=b+8|0;a=b+172|0;g=0;k=0;l=f;while(1){f=(d[l+1>>0]|0)<<16|(d[l>>0]|0)<<24|(d[l+2>>0]|0)<<8|(d[l+3>>0]|0);m=g;g=(d[l+5>>0]|0)<<16|(d[l+4>>0]|0)<<24|(d[l+6>>0]|0)<<8|(d[l+7>>0]|0);if(f>>>0>g>>>0){n=9;break}if(!((k|0)==0|f>>>0>m>>>0)){n=11;break}if((c[h>>2]|0)!=0?!((g-f+((d[l+9>>0]|0)<<16|(d[l+8>>0]|0)<<24|(d[l+10>>0]|0)<<8|(d[l+11>>0]|0))|0)>>>0<(c[a>>2]|0)>>>0):0){n=14;break}l=l+12|0;k=k+1|0;if((k|0)==(j|0)){n=16;break}}if((n|0)==9){lEa(b,8)}else if((n|0)==11){lEa(b,8)}else if((n|0)==14){lEa(b,16)}else if((n|0)==16){i=e;return 0}return 0}function fNa(a,b){a=a|0;b=b|0;var e=0;e=c[a+16>>2]|0;c[b+4>>2]=12;c[b>>2]=(d[e+9>>0]|0)<<16|(d[e+8>>0]|0)<<24|(d[e+10>>0]|0)<<8|(d[e+11>>0]|0);return 0}function gNa(b,e){b=b|0;e=e|0;c[b+16>>2]=e;c[b+40>>2]=(d[e+13>>0]|0)<<16|(d[e+12>>0]|0)<<24|(d[e+14>>0]|0)<<8|(d[e+15>>0]|0);a[b+24>>0]=0;return 0}function hNa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;c[e>>2]=b;b=lOa(a,e,0)|0;i=d;return b|0}function iNa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=b+28|0;g=c[f>>2]|0;do{if((g|0)==-1){h=0}else{j=b+24|0;if((a[j>>0]|0)!=0?(g|0)==(c[d>>2]|0):0){kOa(b);if((a[j>>0]|0)==0){h=0;break}j=c[b+32>>2]|0;if((j|0)==0){h=0;break}c[d>>2]=c[f>>2];h=j;break}h=lOa(b,d,1)|0}}while(0);i=e;return h|0}function jNa(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;f=a+16|0;g=b+4|0;if(f>>>0>(c[g>>2]|0)>>>0){lEa(b,8)}h=(d[a+5>>0]|0)<<16|(d[a+4>>0]|0)<<24|(d[a+6>>0]|0)<<8|(d[a+7>>0]|0);j=(d[a+13>>0]|0)<<16|(d[a+12>>0]|0)<<24|(d[a+14>>0]|0)<<8|(d[a+15>>0]|0);if(h>>>0>((c[g>>2]|0)-a|0)>>>0){lEa(b,8)}if(h>>>0<((j*12|0)+16|0)>>>0){lEa(b,8)}if((j|0)==0){i=e;return 0}h=b+8|0;a=b+172|0;g=0;k=0;l=f;while(1){f=(d[l+1>>0]|0)<<16|(d[l>>0]|0)<<24|(d[l+2>>0]|0)<<8|(d[l+3>>0]|0);m=g;g=(d[l+5>>0]|0)<<16|(d[l+4>>0]|0)<<24|(d[l+6>>0]|0)<<8|(d[l+7>>0]|0);if(f>>>0>g>>>0){n=9;break}if(!((k|0)==0|f>>>0>m>>>0)){n=11;break}if((c[h>>2]|0)!=0?!(((d[l+9>>0]|0)<<16|(d[l+8>>0]|0)<<24|(d[l+10>>0]|0)<<8|(d[l+11>>0]|0))>>>0<(c[a>>2]|0)>>>0):0){n=14;break}l=l+12|0;k=k+1|0;if((k|0)==(j|0)){n=16;break}}if((n|0)==9){lEa(b,8)}else if((n|0)==11){lEa(b,8)}else if((n|0)==14){lEa(b,16)}else if((n|0)==16){i=e;return 0}return 0}function kNa(a,b){a=a|0;b=b|0;var e=0;e=c[a+16>>2]|0;c[b+4>>2]=13;c[b>>2]=(d[e+9>>0]|0)<<16|(d[e+8>>0]|0)<<24|(d[e+10>>0]|0)<<8|(d[e+11>>0]|0);return 0}function lNa(a,b){a=a|0;b=b|0;c[a+16>>2]=b;c[a+24>>2]=(d[b+7>>0]|0)<<16|(d[b+6>>0]|0)<<24|(d[b+8>>0]|0)<<8|(d[b+9>>0]|0);c[a+28>>2]=0;c[a+32>>2]=0;return 0}function mNa(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+36>>2]|0;c[a+28>>2]=0;if((d|0)==0){i=b;return}e=a+32|0;a=c[e>>2]|0;if((a|0)==0){i=b;return}aEa(d,a);c[e>>2]=0;i=b;return}function nNa(a,b){a=a|0;b=b|0;return 0}function oNa(a,b){a=a|0;b=b|0;c[b>>2]=0;return 0}function pNa(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;h=c[a+16>>2]|0;a=dOa(h+6|0,f)|0;if((a|0)==0){j=0;i=g;return j|0}f=(d[a+1>>0]|0)<<16|(d[a>>0]|0)<<24|(d[a+2>>0]|0)<<8|(d[a+3>>0]|0);k=(d[a+5>>0]|0)<<16|(d[a+4>>0]|0)<<24|(d[a+6>>0]|0)<<8|(d[a+7>>0]|0);if((f|0)!=0?(iOa(h+f|0,e)|0)!=0:0){j=dd[c[(c[b+12>>2]|0)+12>>2]&511](b,e)|0;i=g;return j|0}if((k|0)==0){j=0;i=g;return j|0}j=jOa(h+k|0,e)|0;i=g;return j|0}function qNa(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;g=c[a+16>>2]|0;a=dOa(g+6|0,e)|0;if((a|0)==0){h=-1;i=f;return h|0}e=(d[a+1>>0]|0)<<16|(d[a>>0]|0)<<24|(d[a+2>>0]|0)<<8|(d[a+3>>0]|0);j=(d[a+5>>0]|0)<<16|(d[a+4>>0]|0)<<24|(d[a+6>>0]|0)<<8|(d[a+7>>0]|0);if((e|0)!=0?(iOa(g+e|0,b)|0)!=0:0){h=1;i=f;return h|0}if((j|0)!=0?(jOa(g+j|0,b)|0)!=0:0){h=0;i=f;return h|0}h=-1;i=f;return h|0}function rNa(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;f=c[a+24>>2]|0;g=c[a+16>>2]|0;if((hOa(a,f+1|0,b)|0)!=0){h=0;i=e;return h|0}b=c[a+32>>2]|0;if((f|0)==0){j=0}else{a=0;k=g+10|0;while(1){c[b+(a<<2)>>2]=(d[k+1>>0]|0)<<8|(d[k>>0]|0)<<16|(d[k+2>>0]|0);a=a+1|0;if((a|0)==(f|0)){j=f;break}else{k=k+11|0}}}c[b+(j<<2)>>2]=0;h=b;i=e;return h|0}function sNa(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f=i;g=c[a+24>>2]|0;h=a+16|0;j=c[h>>2]|0;if((hOa(a,g+1|0,b)|0)!=0){k=0;i=f;return k|0}b=a+32|0;a=c[b>>2]|0;if((g|0)==0){l=a}else{m=g;g=j+10|0;j=a;while(1){a=(d[g+1>>0]|0)<<8|(d[g>>0]|0)<<16|(d[g+2>>0]|0);n=(d[g+4>>0]|0)<<16|(d[g+3>>0]|0)<<24|(d[g+5>>0]|0)<<8|(d[g+6>>0]|0);o=(d[g+8>>0]|0)<<16|(d[g+7>>0]|0)<<24|(d[g+9>>0]|0)<<8|(d[g+10>>0]|0);g=g+11|0;if((n|0)!=0?(iOa((c[h>>2]|0)+n|0,e)|0)!=0:0){p=8}else{if((o|0)!=0?(jOa((c[h>>2]|0)+o|0,e)|0)!=0:0){p=8}else{q=j}}if((p|0)==8){p=0;c[j>>2]=a;q=j+4|0}m=m+ -1|0;if((m|0)==0){l=q;break}else{j=q}}}c[l>>2]=0;k=c[b>>2]|0;i=f;return k|0}function tNa(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;f=i;g=c[a+16>>2]|0;h=dOa(g+6|0,e)|0;if((h|0)==0){j=0;i=f;return j|0}e=(d[h+1>>0]|0)<<16|(d[h>>0]|0)<<24|(d[h+2>>0]|0)<<8|(d[h+3>>0]|0);k=(d[h+5>>0]|0)<<16|(d[h+4>>0]|0)<<24|(d[h+6>>0]|0)<<8|(d[h+7>>0]|0);if((k|e|0)==0){j=0;i=f;return j|0}if((e|0)==0){j=eOa(a,g+k|0,b)|0;i=f;return j|0}if((k|0)==0){j=fOa(a,g+e|0,b)|0;i=f;return j|0}h=g+e|0;l=g+k|0;m=(d[g+(k+1)>>0]|0)<<16|(d[l>>0]|0)<<24|(d[g+(k+2)>>0]|0)<<8|(d[g+(k+3)>>0]|0);n=gOa(h)|0;o=(d[g+(e+1)>>0]|0)<<16|(d[h>>0]|0)<<24|(d[g+(e+2)>>0]|0)<<8|(d[g+(e+3)>>0]|0);if((m|0)==0){j=fOa(a,h,b)|0;i=f;return j|0}if((n|0)==0){j=eOa(a,l,b)|0;i=f;return j|0}if((hOa(a,n+1+m|0,b)|0)!=0){j=0;i=f;return j|0}b=c[a+32>>2]|0;a=d[g+(e+7)>>0]|0;n=1;l=g+(e+8)|0;h=(d[g+(e+5)>>0]|0)<<8|(d[g+(e+4)>>0]|0)<<16|(d[g+(e+6)>>0]|0);e=0;p=1;q=(d[g+(k+5)>>0]|0)<<8|(d[g+(k+4)>>0]|0)<<16|(d[g+(k+6)>>0]|0);r=g+(k+9)|0;a:while(1){if(q>>>0>(a+h|0)>>>0){k=a;g=n;s=l;t=h;u=e;while(1){v=u;w=0;do{x=v;v=v+1|0;c[b+(x<<2)>>2]=w+t;w=w+1|0}while(!(w>>>0>k>>>0));w=g+1|0;if(w>>>0>o>>>0){y=k;z=w;A=s;B=t;C=v;D=p;break a}x=(d[s+1>>0]|0)<<8|(d[s>>0]|0)<<16|(d[s+2>>0]|0);E=s+4|0;F=d[s+3>>0]|0;if(q>>>0>(F+x|0)>>>0){k=F;g=w;s=E;t=x;u=v}else{G=F;H=w;I=E;J=x;K=v;break}}}else{G=a;H=n;I=l;J=h;K=e}if(q>>>0<J>>>0){c[b+(K<<2)>>2]=q;L=K+1|0}else{L=K}u=p+1|0;if(u>>>0>m>>>0){y=G;z=H;A=I;B=J;C=L;D=u;break}a=G;n=H;l=I;h=J;e=L;p=u;q=(d[r+1>>0]|0)<<8|(d[r>>0]|0)<<16|(d[r+2>>0]|0);r=r+5|0}if(D>>>0>m>>>0){if(!(z>>>0>o>>>0)){p=C;L=0;do{e=p;p=p+1|0;c[b+(e<<2)>>2]=L+B;L=L+1|0}while(!(L>>>0>y>>>0));if(z>>>0<o>>>0){y=z;z=A;A=p;while(1){L=(d[z+1>>0]|0)<<8|(d[z>>0]|0)<<16|(d[z+2>>0]|0);B=d[z+3>>0]|0;e=A;J=0;while(1){c[b+(e<<2)>>2]=J+L;if((J|0)==(B|0)){break}else{e=e+1|0;J=J+1|0}}J=A+1+B|0;y=y+1|0;if((y|0)==(o|0)){M=J;break}else{z=z+4|0;A=J}}}else{M=p}}else{M=C}}else{c[b+(C<<2)>>2]=q;q=C+1|0;if(D>>>0<m>>>0){p=C+m+1|0;C=q;A=D;z=r;while(1){c[b+(C<<2)>>2]=(d[z+1>>0]|0)<<8|(d[z>>0]|0)<<16|(d[z+2>>0]|0);A=A+1|0;if((A|0)==(m|0)){break}else{C=C+1|0;z=z+5|0}}M=p-D|0}else{M=q}}c[b+(M<<2)>>2]=0;j=b;i=f;return j|0}function uNa(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;e=i;f=(d[a+3>>0]|0)<<16|(d[a+2>>0]|0)<<24|(d[a+4>>0]|0)<<8|(d[a+5>>0]|0);g=(d[a+7>>0]|0)<<16|(d[a+6>>0]|0)<<24|(d[a+8>>0]|0)<<8|(d[a+9>>0]|0);h=b+4|0;if(f>>>0>((c[h>>2]|0)-a|0)>>>0){lEa(b,8)}if(f>>>0<((g*11|0)+10|0)>>>0){lEa(b,8)}if((g|0)==0){i=e;return 0}j=b+8|0;k=b+172|0;l=1;m=0;n=a+10|0;a:while(1){o=(d[n+1>>0]|0)<<8|(d[n>>0]|0)<<16|(d[n+2>>0]|0);p=(d[n+4>>0]|0)<<16|(d[n+3>>0]|0)<<24|(d[n+5>>0]|0)<<8|(d[n+6>>0]|0);q=(d[n+8>>0]|0)<<16|(d[n+7>>0]|0)<<24|(d[n+9>>0]|0)<<8|(d[n+10>>0]|0);n=n+11|0;if(!(p>>>0<f>>>0&q>>>0<f>>>0)){r=7;break}if(o>>>0<l>>>0){r=9;break}l=o+1|0;if((p|0)!=0){o=p+4|0;s=(d[a+(p+1)>>0]|0)<<16|(d[a+p>>0]|0)<<24|(d[a+(p+2)>>0]|0)<<8|(d[a+(p+3)>>0]|0);if((a+((s<<2)+o)|0)>>>0>(c[h>>2]|0)>>>0){r=12;break}if((s|0)!=0){p=a+o|0;o=0;t=0;while(1){u=(d[p+1>>0]|0)<<8|(d[p>>0]|0)<<16|(d[p+2>>0]|0);v=u+(d[p+3>>0]|0)|0;if(v>>>0>1114111){r=16;break a}if(u>>>0<t>>>0){r=18;break a}o=o+1|0;if((o|0)==(s|0)){break}else{p=p+4|0;t=v+1|0}}}}if((q|0)!=0){t=a+(q+4)|0;p=(d[a+(q+1)>>0]|0)<<16|(d[a+q>>0]|0)<<24|(d[a+(q+2)>>0]|0)<<8|(d[a+(q+3)>>0]|0);if(p<<2>>>0>((c[h>>2]|0)-t|0)>>>0){r=22;break}if((p|0)!=0){s=0;o=0;v=t;do{t=(d[v+1>>0]|0)<<8|(d[v>>0]|0)<<16|(d[v+2>>0]|0);if(t>>>0>1114111){r=25;break a}if(t>>>0<o>>>0){r=27;break a}o=t+1|0;if((c[j>>2]|0)!=0?!(((d[v+3>>0]|0)<<8|(d[v+4>>0]|0))>>>0<(c[k>>2]|0)>>>0):0){r=30;break a}v=v+5|0;s=s+1|0}while((s|0)!=(p|0))}}m=m+1|0;if((m|0)==(g|0)){r=33;break}}switch(r|0){case 7:{lEa(b,8);break};case 9:{lEa(b,8);break};case 12:{lEa(b,8);break};case 16:{lEa(b,8);break};case 18:{lEa(b,8);break};case 22:{lEa(b,8);break};case 25:{lEa(b,8);break};case 27:{lEa(b,8);break};case 30:{lEa(b,16);break};case 33:{i=e;return 0}}return 0}function vNa(a,b){a=a|0;b=b|0;c[b+4>>2]=14;c[b>>2]=-1;return 0}function wNa(a,b){a=a|0;b=b|0;var c=0;a=i;c=jEa(1275960,b)|0;i=a;return c|0}function xNa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=dd[c[(c[a+12>>2]|0)+48>>2]&511](a,b)|0;i=d;return e|0}function yNa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;i=i+16|0;g=f;h=ANa(a,b,g)|0;if((h|0)!=0){i=f;return h|0}SFa(d,c[g>>2]|0,e);i=f;return h|0}function zNa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;e=d;f=c[a+16>>2]|0;a:do{if((f|0)<1){g=0}else{h=0;while(1){if((ANa(a,h,e)|0)==0?(R2a(b,c[e>>2]|0)|0)==0:0){g=h;break a}h=h+1|0;if(!(h>>>0<f>>>0)){g=0;break}}}}while(0);i=d;return g|0}function ANa(d,f,g){d=d|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0;h=i;do{if((d|0)!=0){if((e[d+264>>1]|0)>>>0>f>>>0){j=c[d+532>>2]|0;if((j|0)!=0){k=d+608|0;l=j+16|0;c[g>>2]=Lc[c[l>>2]&255](0)|0;j=c[d+464>>2]|0;if((j|0)==65536){if(!(f>>>0<258)){m=0;break}c[g>>2]=Lc[c[l>>2]&255](f)|0;m=0;break}else if((j|0)==131072){if((a[k>>0]|0)==0?(BNa(d)|0)!=0:0){m=0;break}if(!((e[d+612>>1]|0)>>>0>f>>>0)){m=0;break}n=b[(c[d+616>>2]|0)+(f<<1)>>1]|0;o=n&65535;if((n&65535)<258){c[g>>2]=Lc[c[l>>2]&255](o)|0;m=0;break}else{c[g>>2]=c[(c[d+620>>2]|0)+(o+ -258<<2)>>2];m=0;break}}else if((j|0)==163840){if((a[k>>0]|0)==0?(BNa(d)|0)!=0:0){m=0;break}if(!((e[d+612>>1]|0)>>>0>f>>>0)){m=0;break}c[g>>2]=Lc[c[l>>2]&255]((a[(c[d+616>>2]|0)+f>>0]|0)+f|0)|0;m=0;break}else{m=0;break}}else{m=7}}else{m=16}}else{m=35}}while(0);i=h;return m|0}function BNa(d){d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;f=i;i=i+16|0;g=f+8|0;h=f+4|0;j=f;k=c[d+104>>2]|0;l=id[c[d+504>>2]&511](d,1886352244,k,j)|0;if((l|0)!=0){m=l;i=f;return m|0}l=k+8|0;n=zFa(c[l>>2]|0)|0;o=(c[j>>2]|0)+n|0;n=c[d+464>>2]|0;j=wFa(k,32)|0;if((j|0)!=0){m=j;i=f;return m|0}a:do{if((n|0)==131072){j=c[k+28>>2]|0;p=xFa(k,h)|0;q=p&65535;r=c[h>>2]|0;if((r|0)==0){if((p&65535)>(e[d+264>>1]|0)){c[h>>2]=3;s=3;break}t=dEa(j,2,0,q,0,h)|0;u=c[h>>2]|0;b:do{if((u|0)==0){v=CFa(k,q<<1)|0;c[h>>2]=v;if((v|0)==0){if(p<<16>>16==0){FFa(k);w=0}else{x=0;do{b[t+(x<<1)>>1]=HFa(k)|0;x=x+1|0}while((x|0)<(q|0));FFa(k);x=0;y=0;while(1){z=b[t+(x<<1)>>1]|0;if((z&65535)>257){A=(z&65535)+ -257|0;B=(A|0)>(y&65535|0)?A&65535:y}else{B=y}x=x+1|0;if((x|0)>=(q|0)){w=B;break}else{y=B}}}y=dEa(j,4,0,w&65535,0,h)|0;x=c[h>>2]|0;if((x|0)==0){c:do{if(!(w<<16>>16==0)){A=0;z=0;while(1){if((zFa(c[l>>2]|0)|0)>=(o|0)){C=19;break}D=(JFa(k,h)|0)&255;E=c[h>>2]|0;if((E|0)!=0){F=E;break}E=c[l>>2]|0;if((D|0)<=(o|0)?(zFa(E)|0)<=(o-D|0):0){G=D}else{H=E;C=23}if((C|0)==23){C=0;E=o-(zFa(H)|0)|0;G=(E|0)<0?0:E}E=dEa(j,1,0,G+1|0,0,h)|0;D=y+(A<<2)|0;c[D>>2]=E;I=c[h>>2]|0;if((I|0)!=0){F=I;break}I=vFa(k,E,G)|0;c[h>>2]=I;if((I|0)!=0){F=I;break}a[(c[D>>2]|0)+G>>0]=0;D=A+1|0;if((D&65535)<(w&65535)){A=D;z=z+1<<16>>16}else{break c}}d:do{if((C|0)==19){if((z&65535)<(w&65535)){J=A}else{break c}while(1){D=dEa(j,1,0,1,0,h)|0;c[y+(J<<2)>>2]=D;I=c[h>>2]|0;if((I|0)!=0){F=I;break d}a[D>>0]=0;J=J+1|0;if(!((J&65535)<(w&65535))){break c}}}}while(0);A=0;while(1){z=y+(A<<2)|0;aEa(j,c[z>>2]|0);c[z>>2]=0;A=A+1|0;if((A&65535)<<16>>16==w<<16>>16){K=F;L=y;break b}}}}while(0);b[d+612>>1]=p;b[d+614>>1]=w;c[d+616>>2]=t;c[d+620>>2]=y;s=0;break a}else{K=x;L=y}}else{K=v;L=0}}else{K=u;L=0}}while(0);aEa(j,L);aEa(j,t);s=K}else{s=r}}else if((n|0)==163840){u=c[k+28>>2]|0;p=xFa(k,g)|0;q=p&65535;A=c[g>>2]|0;if((A|0)==0){if((p&65535)>258?1:(p&65535)>(e[d+264>>1]|0)){c[g>>2]=3;s=3;break}z=dEa(u,1,0,q,0,g)|0;D=c[g>>2]|0;e:do{if((D|0)==0){I=vFa(k,z,q)|0;c[g>>2]=I;if((I|0)==0){f:do{if(!(p<<16>>16==0)){E=0;while(1){M=(a[z+E>>0]|0)+E|0;E=E+1|0;if((M|0)<0|(M|0)>(q|0)){break}if((E|0)>=(q|0)){break f}}c[g>>2]=3;N=3;break e}}while(0);b[d+612>>1]=p;c[d+616>>2]=z;s=0;break a}else{N=I}}else{N=D}}while(0);aEa(u,z);s=N}else{s=A}}else{s=3}}while(0);a[d+608>>0]=1;m=s;i=f;return m|0}function CNa(d){d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;f=i;i=i+16|0;g=f+4|0;h=f;j=d+660|0;k=c[j>>2]|0;if((k|0)!=0){l=k;i=f;return l|0}k=b[d+340>>1]|0;do{if(!(k<<16>>16==0)){m=c[d+356>>2]|0;n=k&65535;o=-1;p=-1;q=0;while(1){do{if((b[m+(q*20|0)+6>>1]|0)==6?(b[m+(q*20|0)+8>>1]|0)!=0:0){r=b[m+(q*20|0)>>1]|0;if(r<<16>>16==3){if((b[m+(q*20|0)+2>>1]|0)!=1){s=o;t=p;break}u=(b[m+(q*20|0)+4>>1]|0)==1033?q:p}else{u=p}if(r<<16>>16==1?(b[m+(q*20|0)+2>>1]|0)==0:0){s=(b[m+(q*20|0)+4>>1]|0)==0?q:o;t=u}else{s=o;t=u}}else{s=o;t=p}}while(0);q=q+1|0;if((q|0)>=(n|0)){break}else{o=s;p=t}}if((t|0)==-1){if((s|0)==-1){v=0;break}p=c[d+100>>2]|0;o=m+(s*20|0)+8|0;n=e[o>>1]|0;c[h>>2]=0;q=ZDa(p,n+1|0,h)|0;if((c[h>>2]|0)!=0){v=q;break}r=c[d+360>>2]|0;w=m+(s*20|0)+12|0;x=uFa(r,c[w>>2]|0)|0;c[h>>2]=x;if((x|0)==0?(x=vFa(r,q,n)|0,c[h>>2]=x,(x|0)==0):0){a[q+n>>0]=0;v=q;break}c[w>>2]=0;b[o>>1]=0;o=m+(s*20|0)+16|0;aEa(p,c[o>>2]|0);c[o>>2]=0;aEa(p,q);v=0;break}q=c[d+100>>2]|0;p=m+(t*20|0)+8|0;o=e[p>>1]|0;w=o>>>1;c[g>>2]=0;n=ZDa(q,o+1|0,g)|0;if((c[g>>2]|0)==0){o=c[d+360>>2]|0;x=m+(t*20|0)+16|0;r=m+(t*20|0)+12|0;y=uFa(o,c[r>>2]|0)|0;c[g>>2]=y;if((y|0)==0?(y=CFa(o,e[p>>1]|0)|0,c[g>>2]=y,(y|0)==0):0){if((w|0)==0){z=n}else{y=w;w=c[o+32>>2]|0;A=n;while(1){if((a[w>>0]|0)==0?(B=a[w+1>>0]|0,(B&255)>31&B<<24>>24>-1):0){a[A>>0]=B;C=A+1|0}else{C=A}y=y+ -1|0;if((y|0)==0){z=C;break}else{w=w+2|0;A=C}}}a[z>>0]=0;FFa(o);v=n;break}aEa(q,n);b[p>>1]=0;c[r>>2]=0;aEa(q,c[x>>2]|0);c[x>>2]=0;v=0}else{v=n}}else{v=0}}while(0);c[j>>2]=v;l=v;i=f;return l|0}function DNa(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0;h=i;do{if((d|0)!=0){j=GNa(b[a+152>>1]|0,c[a+156>>2]|0,d)|0;if((j|0)==0){k=142;i=h;return k|0}else{l=(c[j+8>>2]|0)+e|0;m=j+12|0;break}}else{l=e;m=(c[a+104>>2]|0)+4|0}}while(0);e=c[m>>2]|0;if((g|0)!=0){m=c[g>>2]|0;if((m|0)==0){c[g>>2]=e;k=0;i=h;return k|0}else{n=m}}else{n=e}k=AFa(c[a+104>>2]|0,l,f,n)|0;i=h;return k|0}function ENa(d,e){d=d|0;e=e|0;var f=0;switch(e|0){case 1:{f=d+260|0;break};case 0:{f=d+160|0;break};case 2:{e=d+364|0;if((b[e>>1]|0)==-1){f=0}else{f=e}break};case 4:{if((a[d+292>>0]|0)==0){f=0}else{f=d+296|0}break};case 5:{f=d+464|0;break};case 3:{f=d+216|0;break};case 6:{e=d+544|0;if((c[e>>2]|0)==0){f=0}else{f=e}break};default:{f=0}}return f|0}function FNa(a,b,d,f,g){a=a|0;b=b|0;d=d|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0;h=i;if((f|0)==0|(g|0)==0){j=6;i=h;return j|0}k=e[a+152>>1]|0;do{if((d|0)!=0){if(k>>>0>b>>>0){l=a+156|0;c[d>>2]=c[(c[l>>2]|0)+(b<<4)>>2];c[f>>2]=c[(c[l>>2]|0)+(b<<4)+8>>2];m=c[(c[l>>2]|0)+(b<<4)+12>>2]|0;break}else{j=142;i=h;return j|0}}else{m=k}}while(0);c[g>>2]=m;j=0;i=h;return j|0}function GNa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;f=b+((a&65535)<<4)|0;a:do{if(!(a<<16>>16==0)){g=b;while(1){if((c[g>>2]|0)==(d|0)?(h=g+12|0,j=c[h>>2]|0,(j|0)!=0):0){break}k=g+16|0;if(k>>>0<f>>>0){g=k}else{l=0;break a}}if((d|0)==1819239265){if((g|0)!=0){k=c[g+8>>2]|0;m=k+j|0;n=b;o=0;while(1){p=c[n+8>>2]|0;do{if(m>>>0>p>>>0){q=o}else{if((o|0)!=0?!(p>>>0<(c[o+8>>2]|0)>>>0):0){q=o;break}q=n}}while(0);n=n+16|0;if(!(n>>>0<f>>>0)){break}else{o=q}}if((q|0)!=0?(o=c[q+8>>2]|0,m>>>0<o>>>0):0){c[h>>2]=o-k;l=g}else{l=g}}else{l=0}}else{l=g}}else{l=0}}while(0);i=e;return l|0}function HNa(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;h=GNa(b[a+152>>1]|0,c[a+156>>2]|0,d)|0;if((h|0)==0){j=142;i=g;return j|0}if((f|0)!=0){c[f>>2]=c[h+12>>2]}j=uFa(e,c[h+8>>2]|0)|0;i=g;return j|0}function INa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=i;i=i+16|0;e=f;g=b+528|0;h=c[g>>2]|0;j=c[b+96>>2]|0;do{if((h|0)==0){k=hFa(c[j+4>>2]|0,1283992)|0;if((k|0)==0){l=11;i=f;return l|0}else{c[g>>2]=k;c[b+504>>2]=c[k>>2];m=j;n=k;break}}else{m=j;n=h}}while(0);c[b+532>>2]=iFa(m,1284e3)|0;m=c[a+28>>2]|0;h=b+132|0;c[h>>2]=0;j=b+136|0;c[j>>2]=0;g=b+140|0;c[g>>2]=0;k=zFa(c[a+8>>2]|0)|0;o=yFa(a,e)|0;p=c[e>>2]|0;if((p|0)!=0){l=p;i=f;return l|0}if(!((o|0)==65536|(o|0)==131072|(o|0)==1330926671|(o|0)==1953658213|(o|0)==1953784678|(o|0)==1954115633)){l=2;i=f;return l|0}c[h>>2]=1953784678;do{if((o|0)!=1953784678){c[j>>2]=65536;c[g>>2]=1;p=ZDa(m,4,e)|0;c[b+144>>2]=p;q=c[e>>2]|0;if((q|0)==0){c[p>>2]=k;break}else{l=q;i=f;return l|0}}else{q=LFa(a,1276920,h)|0;c[e>>2]=q;if((q|0)!=0){l=q;i=f;return l|0}q=c[g>>2]|0;if((q|0)==0){l=8;i=f;return l|0}if(q>>>0>(c[a+4>>2]|0)>>>5>>>0){l=10;i=f;return l|0}p=b+144|0;c[p>>2]=dEa(m,4,0,q,0,e)|0;q=c[e>>2]|0;if((q|0)!=0){l=q;i=f;return l|0}q=CFa(a,c[g>>2]<<2)|0;c[e>>2]=q;if((q|0)!=0){l=q;i=f;return l|0}if((c[g>>2]|0)>0){q=0;do{r=IFa(a)|0;c[(c[p>>2]|0)+(q<<2)>>2]=r;q=q+1|0}while((q|0)<(c[g>>2]|0))}FFa(a)}}while(0);e=(d|0)<0?0:d;if((e|0)>=(c[g>>2]|0)){l=6;i=f;return l|0}d=uFa(a,c[(c[b+144>>2]|0)+(e<<2)>>2]|0)|0;if((d|0)!=0){l=d;i=f;return l|0}d=dd[c[n+88>>2]&511](b,a)|0;if((d|0)!=0){l=d;i=f;return l|0}c[b>>2]=c[g>>2];c[b+4>>2]=e;l=0;i=f;return l|0}function JNa(d,f,g,h,j){d=d|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;g=i;k=c[f+528>>2]|0;if((h|0)>0){l=0;m=0;n=0;while(1){o=c[j+(l<<3)>>2]|0;if((o|0)==1768386662){p=1;q=n}else{p=m;q=(o|0)==1768386675?1:n}l=l+1|0;if((l|0)==(h|0)){r=p;s=q;break}else{m=p;n=q}}}else{r=0;s=0}q=f+128|0;if((c[(c[q>>2]|0)+48>>2]|0)==0?(n=f+152|0,p=f+156|0,(GNa(b[n>>1]|0,c[p>>2]|0,1735162214)|0)==0):0){m=(GNa(b[n>>1]|0,c[p>>2]|0,1128678944)|0)!=0;p=m&1;if(!m){m=c[k+68>>2]|0;if((m|0)!=0){if((dd[m&511](f,d)|0)==0){t=p;u=1}else{v=p;w=10}}else{v=0;w=10}}else{v=p;w=10}}else{v=1;w=10}if((w|0)==10){p=dd[c[k+24>>2]&511](f,d)|0;if((p|0)==0){t=v;u=0}else{x=p;i=g;return x|0}}p=f+178|0;if((b[p>>1]|0)==0){x=8;i=g;return x|0}dd[c[k+36>>2]&511](f,d)|0;dd[c[k+32>>2]&511](f,d)|0;dd[c[k+48>>2]&511](f,d)|0;v=dd[c[k+44>>2]&511](f,d)|0;if(!u){u=k+28|0;m=Qc[c[u>>2]&255](f,d,0)|0;do{if((m|0)==0){n=Qc[c[k+92>>2]&255](f,d,0)|0;if((n&255|0)!=142){if((n|0)==0){y=t;break}else{x=n}i=g;return x|0}n=c[(c[q>>2]|0)+48>>2]|0;if((n|0)==0){x=147;i=g;return x|0}if((c[(c[n>>2]|0)+8>>2]|0)==0){x=147;i=g;return x|0}else{b[f+250>>1]=0;y=t;break}}else{if((m&255|0)!=142){x=m;i=g;return x|0}if((c[f+148>>2]|0)!=1953658213){n=c[(c[q>>2]|0)+48>>2]|0;if((n|0)==0){x=143;i=g;return x|0}if((c[(c[n>>2]|0)+8>>2]|0)==0){x=143;i=g;return x|0}else{b[f+250>>1]=0;y=t;break}}else{y=0}}}while(0);q=Qc[c[u>>2]&255](f,d,1)|0;if((q|0)==0){u=Qc[c[k+92>>2]&255](f,d,1)|0;if((u|0)==0){a[f+292>>0]=1}else{z=u;w=27}}else{z=q;w=27}if((w|0)==27?!((z|0)==0|(z&255|0)==142):0){x=z;i=g;return x|0}if((dd[c[k+40>>2]&511](f,d)|0)==0){A=y}else{b[f+364>>1]=-1;A=y}}else{A=t}t=c[k+96>>2]|0;if((t|0)!=0?(y=dd[t&511](f,d)|0,!((y|0)==0|(y&255|0)==142)):0){x=y;i=g;return x|0}y=dd[c[k+64>>2]&511](f,d)|0;do{if((y|0)!=0){if((y&255|0)==142){c[f+544>>2]=0;break}else{x=y;i=g;return x|0}}}while(0);dd[c[k+60>>2]&511](f,d)|0;dd[c[k+56>>2]&511](f,d)|0;c[f+16>>2]=e[f+264>>1]|0;d=f+20|0;c[d>>2]=0;k=f+24|0;c[k>>2]=0;y=f+364|0;if(!((b[y>>1]|0)==-1)?!((b[f+428>>1]&256)==0):0){do{if(r<<24>>24==0){t=$Na(f,16,d)|0;if((t|0)==0){if((c[d>>2]|0)==0){w=40;break}else{break}}else{x=t;i=g;return x|0}}else{w=40}}while(0);if((w|0)==40?(t=$Na(f,1,d)|0,(t|0)!=0):0){x=t;i=g;return x|0}if(s<<24>>24==0?(t=$Na(f,17,k)|0,(t|0)!=0):0){x=t;i=g;return x|0}if((c[k>>2]|0)==0?(t=$Na(f,2,k)|0,(t|0)!=0):0){x=t;i=g;return x|0}}else{t=$Na(f,21,d)|0;if((t|0)!=0){x=t;i=g;return x|0}t=c[d>>2]|0;do{if((t|0)==0&r<<24>>24==0){z=$Na(f,16,d)|0;if((z|0)==0){B=c[d>>2]|0;break}else{x=z;i=g;return x|0}}else{B=t}}while(0);if((B|0)==0?(B=$Na(f,1,d)|0,(B|0)!=0):0){x=B;i=g;return x|0}B=$Na(f,22,k)|0;if((B|0)!=0){x=B;i=g;return x|0}B=c[k>>2]|0;do{if((B|0)==0&s<<24>>24==0){d=$Na(f,17,k)|0;if((d|0)==0){C=c[k>>2]|0;break}else{x=d;i=g;return x|0}}else{C=B}}while(0);if((C|0)==0?(C=$Na(f,2,k)|0,(C|0)!=0):0){x=C;i=g;return x|0}}C=f+8|0;k=A<<24>>24==1;A=c[C>>2]|k&1;B=A|24;if((v|0)==0){D=(c[f+464>>2]|0)==196608?B:A|536}else{D=B}B=(c[f+476>>2]|0)==0?D:D|4;D=f+292|0;A=(a[D>>0]|0)==0?B:B|32;c[C>>2]=(c[f+736>>2]|0)==0?A:A|64;if(k?!((b[y>>1]|0)==-1):0){k=b[f+428>>1]|0;A=k&65535;E=(k&65535)>>>4&2|((A&512|0)==0?A&1:1)}else{A=b[f+204>>1]|0;E=(A&65535)>>>1&1|((A&1)==0?0:2)}c[f+12>>2]=E;aOa(f);E=f+36|0;if((c[E>>2]|0)>0){A=f+40|0;k=0;do{B=c[(c[A>>2]|0)+(k<<2)>>2]|0;v=e[B+8>>1]|0;s=e[B+10>>1]|0;d=1276744;while(1){if((c[d>>2]|0)==(v|0)?(t=c[d+4>>2]|0,(t|0)==(s|0)|(t|0)==-1):0){w=68;break}t=d+12|0;if(t>>>0<(1276876|0)>>>0){d=t}else{F=0;break}}if((w|0)==68){w=0;F=c[d+8>>2]|0}c[B+4>>2]=F;k=k+1|0}while((k|0)<(c[E>>2]|0))}E=c[C>>2]|0;if((E&3|0)==0){k=E|1;c[C>>2]=k;G=k}else{G=E}if((G&1|0)==0){x=0;i=g;return x|0}c[f+52>>2]=b[f+196>>1]|0;c[f+56>>2]=b[f+198>>1]|0;c[f+60>>2]=b[f+200>>1]|0;c[f+64>>2]=b[f+202>>1]|0;b[f+68>>1]=b[p>>1]|0;p=b[f+220>>1]|0;G=f+70|0;b[G>>1]=p;E=b[f+222>>1]|0;k=f+72|0;b[k>>1]=E;C=(p&65535)-(E&65535)+(e[f+224>>1]|0)|0;F=f+74|0;b[F>>1]=C;do{if((p|E)<<16>>16==0?!((b[y>>1]|0)==-1):0){w=b[f+434>>1]|0;A=b[f+436>>1]|0;if((w|A)<<16>>16==0){s=b[f+440>>1]|0;b[G>>1]=s;v=e[f+442>>1]|0;b[k>>1]=0-v;t=(s&65535)+v|0;b[F>>1]=t;H=t;break}else{b[G>>1]=w;b[k>>1]=A;t=(w&65535)-(A&65535)+(e[f+438>>1]|0)|0;b[F>>1]=t;H=t;break}}else{H=C}}while(0);b[f+76>>1]=b[f+226>>1]|0;if((a[D>>0]|0)==0){I=H<<16>>16}else{I=e[f+306>>1]|0}b[f+78>>1]=I;I=b[f+474>>1]|0;b[f+80>>1]=(e[f+472>>1]|0)-((I<<16>>16|0)/2|0);b[f+82>>1]=I;x=0;i=g;return x|0}function KNa(d){d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;if((d|0)==0){i=e;return}f=c[d+100>>2]|0;g=d+528|0;h=c[g>>2]|0;j=(h|0)!=0;if(j){k=c[h+80>>2]|0;if((k|0)!=0){Rc[k&1023](d)}k=c[h+100>>2]|0;if((k|0)!=0){Rc[k&1023](d)}}k=d+104|0;DFa(c[k>>2]|0,d+724|0);l=d+728|0;c[l+0>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;c[l+12>>2]=0;l=d+144|0;aEa(f,c[l>>2]|0);c[l>>2]=0;c[d+140>>2]=0;l=d+156|0;aEa(f,c[l>>2]|0);c[l>>2]=0;b[d+152>>1]=0;DFa(c[k>>2]|0,d+496|0);c[d+500>>2]=0;l=c[k>>2]|0;DFa(l,d+668|0);DFa(l,d+676|0);c[d+672>>2]=0;c[d+680>>2]=0;l=d+292|0;if((a[l>>0]|0)!=0){k=d+332|0;aEa(f,c[k>>2]|0);c[k>>2]=0;k=d+336|0;aEa(f,c[k>>2]|0);c[k>>2]=0;a[l>>0]=0}l=d+540|0;aEa(f,c[l>>2]|0);c[l>>2]=0;b[d+538>>1]=0;if(j){Rc[c[h+52>>2]&1023](d)}h=d+20|0;aEa(f,c[h>>2]|0);c[h>>2]=0;h=d+24|0;aEa(f,c[h>>2]|0);c[h>>2]=0;h=d+32|0;aEa(f,c[h>>2]|0);c[h>>2]=0;c[d+28>>2]=0;h=d+660|0;aEa(f,c[h>>2]|0);c[h>>2]=0;c[g>>2]=0;i=e;return}function LNa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=id[c[a+504>>2]&511](a,1751474532,b,0)|0;if((e|0)!=0){f=e;i=d;return f|0}f=LFa(b,1276656,a+160|0)|0;i=d;return f|0}function MNa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=c[a+504>>2]|0;do{if(d<<24>>24==0){g=id[f&511](a,1751672161,b,0)|0;if((g|0)==0){h=a+216|0;break}else{j=g;i=e;return j|0}}else{g=id[f&511](a,1986553185,b,0)|0;if((g|0)==0){h=a+296|0;break}else{j=g;i=e;return j|0}}}while(0);a=LFa(b,1276576,h)|0;if((a|0)!=0){j=a;i=e;return j|0}c[h+36>>2]=0;c[h+40>>2]=0;j=0;i=e;return j|0}function NNa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+500|0;f=id[c[a+504>>2]&511](a,1668112752,b,e)|0;if((f|0)==0){g=BFa(b,c[e>>2]|0,a+496|0)|0;if((g|0)==0){h=0}else{c[e>>2]=0;h=g}}else{h=f}i=d;return h|0}function ONa(a,d){a=a|0;d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;g=a+260|0;h=id[c[a+504>>2]&511](a,1835104368,d,0)|0;if((h|0)==0){j=LFa(d,1276496,g)|0;if((j|0)==0){k=a+276|0;l=a+280|0;m=a+290|0;n=a+266|0;a=n+26|0;do{b[n>>1]=0;n=n+2|0}while((n|0)<(a|0));if((c[g>>2]|0)>65535){n=LFa(d,1276512,g)|0;if((n|0)==0){if((e[l>>1]|0)<64){b[l>>1]=64}if((e[k>>1]|0)>65531){b[k>>1]=-5}if((e[m>>1]|0)>100){b[m>>1]=100;o=0}else{o=0}}else{o=n}}else{o=0}}else{o=j}}else{o=h}i=f;return o|0}function PNa(a,d){a=a|0;d=d|0;var f=0,g=0,h=0;f=i;if((id[c[a+504>>2]&511](a,1330851634,d,0)|0)!=0){i=f;return 0}g=a+364|0;if((LFa(d,1276272,g)|0)!=0){i=f;return 0}h=a+444|0;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;b[h+16>>1]=0;if((b[g>>1]|0)==0){i=f;return 0}if((LFa(d,1276448,g)|0)!=0){i=f;return 0}if((e[g>>1]|0)>1){LFa(d,1276464,g)|0;i=f;return 0}else{i=f;return 0}return 0}function QNa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=id[c[a+504>>2]&511](a,1886352244,b,0)|0;if((e|0)!=0){f=e;i=d;return f|0}f=LFa(b,1276224,a+464|0)|0;i=d;return f|0}function RNa(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;e=i;i=i+16|0;f=e+4|0;g=e;h=c[d+28>>2]|0;c[a+360>>2]=d;j=id[c[a+504>>2]&511](a,1851878757,d,g)|0;c[f>>2]=j;if((j|0)!=0){k=j;i=e;return k|0}j=zFa(c[d+8>>2]|0)|0;l=LFa(d,1276168,a+344|0)|0;c[f>>2]=l;if((l|0)!=0){k=l;i=e;return k|0}l=a+348|0;m=c[l>>2]|0;n=m*12|0;o=j+6+n|0;p=(c[g>>2]|0)+j|0;if(o>>>0>p>>>0){c[f>>2]=145;k=145;i=e;return k|0}c[l>>2]=0;g=a+356|0;c[g>>2]=dEa(h,20,0,m,0,f)|0;h=c[f>>2]|0;if((h|0)!=0){k=h;i=e;return k|0}h=CFa(d,n)|0;c[f>>2]=h;if((h|0)!=0){k=h;i=e;return k|0}h=c[g>>2]|0;if((m|0)==0){q=0;r=h;s=h}else{n=a+352|0;t=m;m=h;while(1){h=LFa(d,1276192,m)|0;c[f>>2]=h;do{if((h|0)==0?(u=m+8|0,v=b[u>>1]|0,!(v<<16>>16==0)):0){w=m+12|0;x=(c[n>>2]|0)+j+(c[w>>2]|0)|0;c[w>>2]=x;if(!(x>>>0<o>>>0)?!(((v&65535)+x|0)>>>0>p>>>0):0){y=m+20|0;break}c[w>>2]=0;b[u>>1]=0;y=m}else{y=m}}while(0);t=t+ -1|0;if((t|0)==0){break}else{m=y}}q=c[f>>2]|0;r=c[g>>2]|0;s=y}c[l>>2]=(s-r|0)/20|0;FFa(d);b[a+340>>1]=c[l>>2];k=q;i=e;return k|0}function SNa(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;e=c[(c[a+96>>2]|0)+8>>2]|0;f=a+356|0;g=c[f>>2]|0;h=a+348|0;j=c[h>>2]|0;if((g|0)!=0){if((j|0)==0){k=g}else{l=j;j=g;while(1){g=j+16|0;aEa(e,c[g>>2]|0);c[g>>2]=0;b[j+8>>1]=0;l=l+ -1|0;if((l|0)==0){break}else{j=j+20|0}}k=c[f>>2]|0}aEa(e,k);c[f>>2]=0}c[h>>2]=0;b[a+344>>1]=0;c[a+352>>2]=0;i=d;return}function TNa(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;f=i;i=i+16|0;g=f;h=id[c[b+504>>2]&511](b,1801810542,e,g)|0;if((h|0)!=0){j=h;i=f;return j|0}h=c[g>>2]|0;if(h>>>0<4){j=142;i=f;return j|0}k=b+724|0;l=BFa(e,h,k)|0;if((l|0)!=0){j=l;i=f;return j|0}l=c[g>>2]|0;c[b+728>>2]=l;g=c[k>>2]|0;k=g+l|0;l=(d[g+2>>0]|0)<<8|(d[g+3>>0]|0);h=l>>>0>32?32:l;a:do{if((h|0)==0){m=0;n=0;o=0}else{l=0;e=0;p=0;q=g+4|0;while(1){r=1<<e;s=q+6|0;if(s>>>0>k>>>0){m=l;n=e;o=p;break a}t=(d[q+2>>0]|0)<<8|(d[q+3>>0]|0);if(t>>>0<7){m=l;n=e;o=p;break a}u=q+t|0;t=q;q=u>>>0>k>>>0?k:u;b:do{if((a[t+5>>0]&247|(d[t+4>>0]|0)<<8|0)==1?(u=t+14|0,!(u>>>0>k>>>0)):0){v=(d[s>>0]|0)<<8|(d[t+7>>0]|0);w=q-u|0;if((w|0)<(v*6|0)){x=(w|0)/6|0}else{x=v}v=r|l;if((x|0)==0){y=v;z=p}else{w=x+ -1|0;if((w|0)!=0){A=w;w=(d[t+15>>0]|0)<<16|(d[u>>0]|0)<<24|(d[t+16>>0]|0)<<8|(d[t+17>>0]|0);u=t+20|0;while(1){B=w;w=(d[u+1>>0]|0)<<16|(d[u>>0]|0)<<24|(d[u+2>>0]|0)<<8|(d[u+3>>0]|0);if(!(w>>>0>B>>>0)){y=v;z=p;break b}A=A+ -1|0;if((A|0)==0){break}else{u=u+6|0}}}y=v;z=r|p}}else{y=l;z=p}}while(0);r=e+1|0;if(!(r>>>0<h>>>0)){m=y;n=r;o=z;break}else{l=y;e=r;p=z}}}}while(0);c[b+732>>2]=n;c[b+736>>2]=m;c[b+740>>2]=o;j=0;i=f;return j|0}function UNa(a,d){a=a|0;d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;i=i+16|0;g=f;h=c[d+28>>2]|0;j=id[c[a+504>>2]&511](a,1734439792,d,0)|0;c[g>>2]=j;if((j|0)!=0){k=j;i=f;return k|0}j=CFa(d,4)|0;c[g>>2]=j;if((j|0)!=0){k=j;i=f;return k|0}j=a+536|0;b[j>>1]=HFa(d)|0;l=a+538|0;b[l>>1]=HFa(d)|0;FFa(d);if((e[j>>1]|0)>1){b[l>>1]=0;c[g>>2]=8;k=8;i=f;return k|0}j=b[l>>1]|0;l=j&65535;m=a+540|0;c[m>>2]=dEa(h,4,0,l,0,g)|0;h=c[g>>2]|0;if((h|0)!=0){k=h;i=f;return k|0}h=CFa(d,l<<2)|0;c[g>>2]=h;if((h|0)!=0){k=h;i=f;return k|0}h=c[m>>2]|0;if(!(j<<16>>16==0)){j=0;do{b[h+(j<<2)>>1]=HFa(d)|0;b[h+(j<<2)+2>>1]=HFa(d)|0;j=j+1|0}while((j|0)!=(l|0))}FFa(d);k=0;i=f;return k|0}function VNa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=id[c[a+504>>2]&511](a,1346587732,b,0)|0;if((e|0)!=0){f=e;i=d;return f|0}f=LFa(b,1276104,a+544|0)|0;i=d;return f|0}function WNa(d){d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=i;g=c[d+100>>2]|0;h=d+608|0;if((a[h>>0]|0)==0){a[h>>0]=0;i=f;return}j=c[d+464>>2]|0;if((j|0)==163840){k=d+616|0;aEa(g,c[k>>2]|0);c[k>>2]=0;b[d+612>>1]=0;a[h>>0]=0;i=f;return}else if((j|0)==131072){j=d+616|0;aEa(g,c[j>>2]|0);c[j>>2]=0;b[d+612>>1]=0;j=d+614|0;k=d+620|0;d=c[k>>2]|0;if((b[j>>1]|0)==0){l=d}else{m=d;d=0;n=0;while(1){aEa(g,c[m+(d<<2)>>2]|0);c[(c[k>>2]|0)+(d<<2)>>2]=0;o=n+1<<16>>16;p=c[k>>2]|0;if((o&65535)<(e[j>>1]|0)){m=p;d=o&65535;n=o}else{l=p;break}}}aEa(g,l);c[k>>2]=0;b[j>>1]=0;a[h>>0]=0;i=f;return}else{a[h>>0]=0;i=f;return}}function XNa(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;g=i;h=c[b+724>>2]|0;j=h+(c[b+728>>2]|0)|0;k=c[b+732>>2]|0;if((k|0)==0){l=0;i=g;return l|0}m=b+736|0;n=e<<16|f;f=b+740|0;b=k;k=1;e=h+4|0;h=0;while(1){o=e+6|0;if(o>>>0>j>>>0){l=h;p=20;break}q=a[e+4>>0]|0;r=a[e+5>>0]|0;s=e+((d[e+2>>0]|0)<<8|(d[e+3>>0]|0))|0;t=e;e=s>>>0>j>>>0?j:s;a:do{if((c[m>>2]&k|0)!=0?(s=t+14|0,!(s>>>0>e>>>0)):0){u=(d[o>>0]|0)<<8|(d[t+7>>0]|0);v=e-s|0;if((v|0)<(u*6|0)){w=(v|0)/6|0}else{w=u}if(q<<24>>24==0){u=(w|0)==0;if((c[f>>2]&k|0)==0){if(u){x=h;break}else{y=w;z=s}while(1){if(((d[z+1>>0]|0)<<16|(d[z>>0]|0)<<24|(d[z+2>>0]|0)<<8|(d[z+3>>0]|0)|0)==(n|0)){break}y=y+ -1|0;if((y|0)==0){x=h;break a}else{z=z+6|0}}A=(d[z+4>>0]|0)<<8|(d[z+5>>0]|0)}else{if(u){x=h;break}else{B=w;C=0}while(1){s=(B+C|0)>>>1;D=s*6|0;v=(d[t+(D+15)>>0]|0)<<16|(d[t+(D+14)>>0]|0)<<24|(d[t+(D+16)>>0]|0)<<8|(d[t+(D+17)>>0]|0);if((v|0)==(n|0)){break}E=v>>>0<n>>>0;C=E?s+1|0:C;B=E?B:s;if(!(C>>>0<B>>>0)){x=h;break a}}A=(d[t+(D+18)>>0]|0)<<8|(d[t+(D+19)>>0]|0)}x=(A<<16>>16)+((r&8)==0?h:0)|0}else{x=h}}else{x=h}}while(0);b=b+ -1|0;if((b|0)==0){l=x;p=20;break}else{k=k<<1;h=x}}if((p|0)==20){i=g;return l|0}return 0}function YNa(a,d){a=a|0;d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0;f=i;i=i+48|0;g=f+40|0;h=f+24|0;j=f+8|0;k=f;l=c[d+28>>2]|0;m=j+12|0;c[m>>2]=zFa(c[d+8>>2]|0)|0;c[j>>2]=yFa(d,k)|0;n=c[k>>2]|0;if((n|0)!=0){o=n;i=f;return o|0}n=LFa(d,1276056,j)|0;c[k>>2]=n;if((n|0)!=0){o=n;i=f;return o|0}n=c[j>>2]|0;a:do{if((n|0)==1330926671){p=b[j+4>>1]|0;q=1330926671}else{r=c[m>>2]|0;s=uFa(d,r+12|0)|0;c[g>>2]=s;b:do{if((s|0)==0){t=j+4|0;u=b[t>>1]|0;if(!(u<<16>>16==0)){v=h+8|0;w=h+12|0;x=d+4|0;y=r+28|0;z=0;A=0;B=0;C=0;D=0;E=0;c:while(1){F=LFa(d,1276080,h)|0;c[g>>2]=F;if((F|0)!=0){G=10;break}F=c[v>>2]|0;H=c[w>>2]|0;do{if((H+F|0)>>>0>(c[x>>2]|0)>>>0){if((c[h>>2]|0)==1668112752){I=A;J=B;K=C;L=E;break c}else{M=A;N=B;O=C;P=E}}else{Q=E+1<<16>>16;R=c[h>>2]|0;if((R|0)==1397313095){M=A;N=B;O=1;P=Q;break}else if(!((R|0)==1651008868|(R|0)==1751474532)){M=A;N=(R|0)==1296389185?1:B;O=C;P=Q;break}if(H>>>0<54){G=15;break c}S=uFa(d,F+12|0)|0;c[g>>2]=S;if((S|0)!=0){T=S;break b}S=yFa(d,g)|0;U=c[g>>2]|0;if((U|0)!=0){T=U;break b}if((S|0)!=1594834165){G=19;break c}S=uFa(d,y+(z<<4)|0)|0;c[g>>2]=S;if((S|0)==0){M=(R|0)==1751474532?1:A;N=B;O=C;P=Q}else{T=S;break b}}}while(0);F=D+1<<16>>16;if((F&65535)<(u&65535)){z=F&65535;A=M;B=N;C=O;D=F;E=P}else{I=M;J=N;K=O;L=P;break}}if((G|0)==10){b[t>>1]=D+ -1<<16>>16;I=A;J=B;K=C;L=E}else if((G|0)==15){c[g>>2]=142;T=142;break}else if((G|0)==19){c[g>>2]=142;T=142;break}b[t>>1]=L;if(!(L<<16>>16==0)){if((I|0)==0?(K|0)==0|(J|0)==0:0){c[g>>2]=142;T=142;break}c[k>>2]=0;p=L;q=n;break a}}else{b[t>>1]=0}c[g>>2]=2;T=2}else{T=s}}while(0);c[k>>2]=T;o=T;i=f;return o|0}}while(0);T=j+4|0;j=a+152|0;b[j>>1]=p;c[a+148>>2]=q;q=a+156|0;c[q>>2]=dEa(l,16,0,p&65535,0,k)|0;l=c[k>>2]|0;if((l|0)!=0){o=l;i=f;return o|0}l=uFa(d,(c[m>>2]|0)+12|0)|0;c[k>>2]=l;if((l|0)!=0){o=l;i=f;return o|0}l=CFa(d,(e[j>>1]|0)<<4)|0;c[k>>2]=l;if((l|0)!=0){o=l;i=f;return o|0}if(p<<16>>16==0){V=0}else{p=d+4|0;l=c[q>>2]|0;q=0;while(1){c[l>>2]=IFa(d)|0;c[l+4>>2]=IFa(d)|0;j=l+8|0;c[j>>2]=IFa(d)|0;m=IFa(d)|0;c[l+12>>2]=m;q=q+1|0;if((q|0)>=(e[T>>1]|0|0)){break}else{l=((c[j>>2]|0)+m|0)>>>0>(c[p>>2]|0)>>>0?l:l+16|0}}V=c[k>>2]|0}FFa(d);o=V;i=f;return o|0}function ZNa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+16|0;f=e;if(d<<24>>24==0){g=a+744|0;h=a+672|0;j=1752003704}else{g=a+748|0;h=a+680|0;j=1986884728}d=(id[c[a+504>>2]&511](a,j,b,f)|0)!=0;c[h>>2]=d?0:c[f>>2]|0;c[g>>2]=zFa(c[b+8>>2]|0)|0;i=e;return 0}function _Na(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0;h=i;i=i+16|0;j=h;k=c[a+104>>2]|0;if(d<<24>>24==0){l=a+216|0;m=a+744|0;n=a+672|0}else{l=a+296|0;m=a+748|0;n=a+680|0}a=c[m>>2]|0;m=(c[n>>2]|0)+a|0;n=b[l+34>>1]|0;l=n&65535;do{if(!(n<<16>>16==0)){if(l>>>0>e>>>0){d=a+(e<<2)|0;if((d+4|0)>>>0>m>>>0){break}o=uFa(k,d)|0;c[j>>2]=o;if((o|0)!=0){break}b[g>>1]=xFa(k,j)|0;if((c[j>>2]|0)!=0){break}b[f>>1]=xFa(k,j)|0;if((c[j>>2]|0)!=0){break}i=h;return 0}o=l<<2;d=a+ -4+o|0;if((!((o+a|0)>>>0>m>>>0)?(o=uFa(k,d)|0,c[j>>2]=o,(o|0)==0):0)?(b[g>>1]=xFa(k,j)|0,(c[j>>2]|0)==0):0){o=(e-l<<1)+4+d|0;if((o+2|0)>>>0>m>>>0){b[f>>1]=0;i=h;return 0}d=uFa(k,o)|0;c[j>>2]=d;if((d|0)!=0){i=h;return 0}b[f>>1]=xFa(k,j)|0;i=h;return 0}}}while(0);b[f>>1]=0;b[g>>1]=0;i=h;return 0}function $Na(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;g=i;i=i+16|0;h=g;j=c[a+100>>2]|0;c[h>>2]=0;k=b[a+340>>1]|0;if(k<<16>>16==0){l=0;m=0;c[f>>2]=m;i=g;return l|0}n=c[a+356>>2]|0;o=-1;p=-1;q=-1;r=-1;s=0;t=0;u=n;while(1){do{if((b[u+6>>1]|0)==d<<16>>16?(b[u+8>>1]|0)!=0:0){v=e[u>>1]|0;if((v|0)==3){if(!((r|0)==-1)?!((b[u+4>>1]&1023)==9):0){w=o;x=p;y=q;z=r;A=t;break}B=e[u+2>>1]|0;if(!((B|0)==10|(B|0)==1|(B|0)==0)){w=o;x=p;y=q;z=r;A=t;break}w=o;x=p;y=q;z=s;A=(b[u+4>>1]&1023)==9&1;break}else if((v|0)==1){if((b[u+4>>1]|0)==0){w=s;x=p;y=q;z=r;A=t;break}w=o;x=(b[u+2>>1]|0)==0?s:p;y=q;z=r;A=t;break}else if((v|0)==2|(v|0)==0){w=o;x=p;y=s;z=r;A=t;break}else{w=o;x=p;y=q;z=r;A=t;break}}else{w=o;x=p;y=q;z=r;A=t}}while(0);s=s+1|0;if(!((s&65535)<(k&65535))){break}else{o=w;p=x;q=y;r=z;t=A;u=u+20|0}}u=(w|0)>-1?w:x;if((z|0)>-1?!((u|0)>-1&A<<24>>24==0):0){A=e[n+(z*20|0)+2>>1]|0;if((A|0)==10|(A|0)==0|(A|0)==1){C=288;D=n+(z*20|0)|0}else{l=0;m=0;c[f>>2]=m;i=g;return l|0}}else{E=17}do{if((E|0)==17){if((u|0)>-1){C=289;D=n+(u*20|0)|0;break}if((y|0)>-1){C=288;D=n+(y*20|0)|0;break}else{l=0;m=0;c[f>>2]=m;i=g;return l|0}}}while(0);if((D|0)==0){l=0;m=0;c[f>>2]=m;i=g;return l|0}y=D+16|0;do{if((c[y>>2]|0)==0){n=c[a+360>>2]|0;u=D+8|0;c[y>>2]=dEa(j,1,0,e[u>>1]|0,0,h)|0;E=c[h>>2]|0;if((E|0)==0){z=uFa(n,c[D+12>>2]|0)|0;c[h>>2]=z;if((z|0)==0){A=vFa(n,c[y>>2]|0,e[u>>1]|0)|0;c[h>>2]=A;if((A|0)==0){break}else{F=A}}else{F=z}}else{F=E}aEa(j,c[y>>2]|0);c[y>>2]=0;b[u>>1]=0;l=F;m=0;c[f>>2]=m;i=g;return l|0}}while(0);l=0;m=dd[C&511](D,j)|0;c[f>>2]=m;i=g;return l|0}function aOa(a){a=a|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;f=i;i=i+224|0;g=i;i=i+168|0;c[g>>2]=0;h=f+216|0;j=f+212|0;k=f+200|0;l=f+196|0;m=f+192|0;n=f+188|0;o=f+184|0;p=f+8|0;q=f+4|0;t=f;u=c[a+496>>2]|0;v=a+500|0;w=u+(c[v>>2]|0)|0;c[j>>2]=u;if((c[j>>2]|0)==0){i=f;return}if(((c[j>>2]|0)+4|0)>>>0>w>>>0){i=f;return}c[j>>2]=(c[j>>2]|0)+2;x=c[j>>2]|0;if((d[(c[j>>2]|0)+ -1>>0]|0|(d[(c[j>>2]|0)+ -2>>0]|0)<<8|0)!=0){c[j>>2]=x+ -2;i=f;return}c[j>>2]=x+2;c[h>>2]=d[(c[j>>2]|0)+ -1>>0]|0|(d[(c[j>>2]|0)+ -2>>0]|0)<<8;if((c[h>>2]|0)==0){i=f;return}x=k+8|0;y=k+10|0;z=k+4|0;A=a+264|0;B=p+172|0;C=p+16|0;D=p+12|0;while(1){if(((c[j>>2]|0)+8|0)>>>0>w>>>0){E=25;break}c[j>>2]=(c[j>>2]|0)+2;b[x>>1]=d[(c[j>>2]|0)+ -1>>0]|0|(d[(c[j>>2]|0)+ -2>>0]|0)<<8;c[j>>2]=(c[j>>2]|0)+2;b[y>>1]=d[(c[j>>2]|0)+ -1>>0]|0|(d[(c[j>>2]|0)+ -2>>0]|0)<<8;c[k>>2]=a;c[z>>2]=0;c[j>>2]=(c[j>>2]|0)+4;F=(d[(c[j>>2]|0)+ -3>>0]|0)<<16|(d[(c[j>>2]|0)+ -4>>0]|0)<<24|(d[(c[j>>2]|0)+ -2>>0]|0)<<8|(d[(c[j>>2]|0)+ -1>>0]|0);if((F|0)!=0?!(F>>>0>((c[v>>2]|0)+ -2|0)>>>0):0){c[l>>2]=u+F;c[m>>2]=d[(c[l>>2]|0)+1>>0]|0|(d[c[l>>2]>>0]|0)<<8;c[n>>2]=1276880;a:do{if((c[c[n>>2]>>2]|0)!=0){while(1){c[o>>2]=c[c[n>>2]>>2];if((c[(c[o>>2]|0)+40>>2]|0)==(c[m>>2]|0)){break}c[n>>2]=(c[n>>2]|0)+4;if((c[c[n>>2]>>2]|0)==0){break a}}c[q>>2]=0;r=0;Ra(210,p|0,c[l>>2]|0,w|0);F=r;r=0;if((F|0)!=0&(s|0)!=0){H=b3a(c[F>>2]|0,g)|0;if((H|0)==0){bb(F|0,s|0)}G=s}else{H=-1}if((H|0)!=1){c[B>>2]=e[A>>1]|0;_2a(C,1,g|0)|0;r=0;F=r;r=0;if((F|0)!=0&(s|0)!=0){I=b3a(c[F>>2]|0,g)|0;if((I|0)==0){bb(F|0,s|0)}G=s}else{I=-1}if((I|0)!=1){J=0}else{J=G}}else{J=G}while(1){if((J|0)==0){r=0;F=Ja(c[(c[o>>2]|0)+44>>2]|0,c[l>>2]|0,p|0)|0;K=r;r=0;if((K|0)!=0&(s|0)!=0){L=b3a(c[K>>2]|0,g)|0;if((L|0)==0){bb(K|0,s|0)}G=s}else{L=-1}if((L|0)==1){J=G;continue}c[q>>2]=F}if((c[D>>2]|0)!=0){break a}r=0;M=Oa(303,c[o>>2]|0,c[l>>2]|0,k|0,t|0)|0;F=r;r=0;if((F|0)!=0&(s|0)!=0){N=b3a(c[F>>2]|0,g)|0;if((N|0)==0){bb(F|0,s|0)}G=s}else{N=-1}if((N|0)==1){J=G}else{break}}if((M|0)==0){c[(c[t>>2]|0)+20>>2]=c[q>>2]}}}while(0)}c[h>>2]=(c[h>>2]|0)+ -1;if((c[h>>2]|0)==0){E=25;break}}if((E|0)==25){i=f;return}}function bOa(b,f){b=b|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;i=i+16|0;h=g;j=c[b+16>>2]|0;k=(e[b+8>>1]|0)>>>1;b=dEa(f,1,0,k+1|0,0,h)|0;if((c[h>>2]|0)!=0){l=0;i=g;return l|0}a:do{if((k|0)==0){m=0}else{h=0;f=j;while(1){n=d[f>>0]|0;o=n<<8|(d[f+1>>0]|0);if((o|0)==0){m=h;break a}p=o>>>0>255?n:o;a[b+h>>0]=(p+ -32|0)>>>0>95?63:p&255;p=h+1|0;if(p>>>0<k>>>0){h=p;f=f+2|0}else{m=p;break}}}}while(0);a[b+m>>0]=0;l=b;i=g;return l|0}function cOa(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;i=i+16|0;g=f;h=c[d+16>>2]|0;j=b[d+8>>1]|0;d=j&65535;k=dEa(e,1,0,d+1|0,0,g)|0;if((c[g>>2]|0)!=0){l=0;i=f;return l|0}a:do{if(j<<16>>16==0){m=0}else{g=0;e=h;while(1){n=a[e>>0]|0;if(n<<24>>24==0){m=g;break a}a[k+g>>0]=(n&255)<32|n<<24>>24<0?63:n;n=g+1|0;if(n>>>0<d>>>0){g=n;e=e+1|0}else{m=n;break}}}}while(0);a[k+m>>0]=0;l=k;i=f;return l|0}function dOa(a,b){a=a|0;b=b|0;var c=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;c=i;e=(d[a+1>>0]|0)<<16|(d[a>>0]|0)<<24|(d[a+2>>0]|0)<<8|(d[a+3>>0]|0);if((e|0)==0){f=0;i=c;return f|0}else{g=e;h=0}a:while(1){e=h;while(1){j=(e+g|0)>>>1;k=j*11|0;l=(d[a+(k+5)>>0]|0)<<8|(d[a+(k+4)>>0]|0)<<16|(d[a+(k+6)>>0]|0);if(l>>>0>b>>>0){break}m=j+1|0;if(!(l>>>0<b>>>0)){n=7;break a}if(m>>>0<g>>>0){e=m}else{f=0;n=8;break a}}if(e>>>0<j>>>0){g=j;h=e}else{f=0;n=8;break}}if((n|0)==7){f=a+(k+7)|0;i=c;return f|0}else if((n|0)==8){i=c;return f|0}return 0}function eOa(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;g=(d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(d[b+2>>0]|0)<<8|(d[b+3>>0]|0);if((hOa(a,g+1|0,e)|0)!=0){h=0;i=f;return h|0}e=c[a+32>>2]|0;if((g|0)==0){j=0}else{a=b+4|0;b=0;while(1){c[e+(b<<2)>>2]=(d[a+1>>0]|0)<<8|(d[a>>0]|0)<<16|(d[a+2>>0]|0);b=b+1|0;if((b|0)==(g|0)){j=g;break}else{a=a+5|0}}}c[e+(j<<2)>>2]=0;h=e;i=f;return h|0}function fOa(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;h=gOa(e)|0;j=a[e>>0]|0;k=a[e+1>>0]|0;l=a[e+2>>0]|0;m=a[e+3>>0]|0;if((hOa(b,h+1|0,f)|0)!=0){n=0;i=g;return n|0}f=(k&255)<<16|(j&255)<<24|(l&255)<<8|m&255;m=b+32|0;b=c[m>>2]|0;if((f|0)==0){o=b}else{l=f;f=e;e=b;while(1){b=f;f=f+4|0;j=(d[b+7>>0]|0)+1|0;k=j;h=e;p=(d[b+5>>0]|0)<<8|(d[f>>0]|0)<<16|(d[b+6>>0]|0);while(1){c[h>>2]=p;k=k+ -1|0;if((k|0)==0){break}else{h=h+4|0;p=p+1|0}}p=e+(j<<2)|0;l=l+ -1|0;if((l|0)==0){o=p;break}else{e=p}}}c[o>>2]=0;n=c[m>>2]|0;i=g;return n|0}function gOa(a){a=a|0;var b=0,c=0,e=0,f=0,g=0;b=i;c=(d[a+1>>0]|0)<<16|(d[a>>0]|0)<<24|(d[a+2>>0]|0)<<8|(d[a+3>>0]|0);if((c|0)==0){e=0;i=b;return e|0}f=a+7|0;a=c;c=0;while(1){g=c+1+(d[f>>0]|0)|0;a=a+ -1|0;if((a|0)==0){e=g;break}else{f=f+4|0;c=g}}i=b;return e|0}function hOa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+16|0;f=e;g=a+28|0;h=c[g>>2]|0;c[f>>2]=0;if(!(h>>>0<b>>>0)){j=0;i=e;return j|0}c[a+36>>2]=d;k=a+32|0;c[k>>2]=dEa(d,4,h,b,c[k>>2]|0,f)|0;k=c[f>>2]|0;if((k|0)!=0){j=k;i=e;return j|0}c[g>>2]=b;j=0;i=e;return j|0}function iOa(a,b){a=a|0;b=b|0;var c=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;c=i;e=(d[a+1>>0]|0)<<16|(d[a>>0]|0)<<24|(d[a+2>>0]|0)<<8|(d[a+3>>0]|0);f=0;a:while(1){g=e;while(1){if(!(f>>>0<g>>>0)){h=0;j=6;break a}k=(g+f|0)>>>1;l=k<<2;m=(d[a+(l+5)>>0]|0)<<8|(d[a+(l+4)>>0]|0)<<16|(d[a+(l+6)>>0]|0);if(m>>>0>b>>>0){g=k}else{break}}if(((d[a+(l+7)>>0]|0)+m|0)>>>0<b>>>0){e=g;f=k+1|0}else{h=1;j=6;break}}if((j|0)==6){i=c;return h|0}return 0}function jOa(a,b){a=a|0;b=b|0;var c=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;c=i;e=(d[a+1>>0]|0)<<16|(d[a>>0]|0)<<24|(d[a+2>>0]|0)<<8|(d[a+3>>0]|0);if((e|0)==0){f=0;i=c;return f|0}else{g=e;h=0}a:while(1){e=h;while(1){j=(e+g|0)>>>1;k=j*5|0;l=(d[a+(k+5)>>0]|0)<<8|(d[a+(k+4)>>0]|0)<<16|(d[a+(k+6)>>0]|0);if(l>>>0>b>>>0){break}m=j+1|0;if(!(l>>>0<b>>>0)){n=7;break a}if(m>>>0<g>>>0){e=m}else{f=0;n=8;break a}}if(e>>>0<j>>>0){g=j;h=e}else{f=0;n=8;break}}if((n|0)==7){f=(d[a+(k+7)>>0]|0)<<8|(d[a+(k+8)>>0]|0);i=c;return f|0}else if((n|0)==8){i=c;return f|0}return 0}function kOa(b){b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;f=b+28|0;g=c[f>>2]|0;a:do{if(!((g|0)==-1)?(h=b+36|0,j=c[h>>2]|0,k=c[b+40>>2]|0,j>>>0<k>>>0):0){l=c[b+16>>2]|0;m=g+1|0;n=j;while(1){j=n*12|0;o=(d[l+(j+17)>>0]|0)<<16|(d[l+(j+16)>>0]|0)<<24|(d[l+(j+18)>>0]|0)<<8|(d[l+(j+19)>>0]|0);p=(d[l+(j+25)>>0]|0)<<16|(d[l+(j+24)>>0]|0)<<24|(d[l+(j+26)>>0]|0)<<8|(d[l+(j+27)>>0]|0);m=m>>>0<o>>>0?o:m;o=n+1|0;if(!((p|0)==0?1:m>>>0>((d[l+(j+21)>>0]|0)<<16|(d[l+(j+20)>>0]|0)<<24|(d[l+(j+22)>>0]|0)<<8|(d[l+(j+23)>>0]|0))>>>0)){break}if(!(o>>>0<k>>>0)){break a}else{n=o}}c[f>>2]=m;c[b+32>>2]=p;c[h>>2]=n;i=e;return}}while(0);a[b+24>>0]=0;i=e;return}function lOa(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;g=i;h=c[b+16>>2]|0;j=d[h+13>>0]<<16|d[h+12>>0]<<24|d[h+14>>0]<<8|d[h+15>>0];if((j|0)==0){k=0;i=g;return k|0}l=f<<24>>24!=0;f=(c[e>>2]|0)+(l&1)|0;m=j;n=0;a:while(1){o=n;while(1){p=(o+m|0)>>>1;q=p*12|0;r=d[h+(q+21)>>0]<<16|d[h+(q+20)>>0]<<24|d[h+(q+22)>>0]<<8|d[h+(q+23)>>0];if(f>>>0<(d[h+(q+17)>>0]<<16|d[h+(q+16)>>0]<<24|d[h+(q+18)>>0]<<8|d[h+(q+19)>>0])>>>0){break}s=p+1|0;if(!(f>>>0>r>>>0)){t=8;break a}if(s>>>0<m>>>0){o=s}else{u=0;break a}}if(o>>>0<p>>>0){m=p;n=o}else{u=0;break}}if((t|0)==8){u=d[h+(q+25)>>0]<<16|d[h+(q+24)>>0]<<24|d[h+(q+26)>>0]<<8|d[h+(q+27)>>0]}if(!l){k=u;i=g;return k|0}if(f>>>0>r>>>0){r=p+1|0;if((r|0)==(j|0)){k=0;i=g;return k|0}else{v=r}}else{v=p}p=b+24|0;a[p>>0]=1;r=b+28|0;c[r>>2]=f;c[b+36>>2]=v;do{if((u|0)==0){kOa(b);if((a[p>>0]|0)==0){k=0;i=g;return k|0}else{w=c[b+32>>2]|0;break}}else{c[b+32>>2]=u;w=u}}while(0);if((w|0)==0){k=0;i=g;return k|0}c[e>>2]=c[r>>2];k=w;i=g;return k|0}function mOa(b){b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=i;f=b+28|0;g=c[f>>2]|0;a:do{if(!((g|0)==-1)?(h=b+36|0,j=c[h>>2]|0,k=c[b+40>>2]|0,j>>>0<k>>>0):0){l=c[b+16>>2]|0;m=g+1|0;n=j;b:while(1){j=n*12|0;o=(d[l+(j+17)>>0]|0)<<16|(d[l+(j+16)>>0]|0)<<24|(d[l+(j+18)>>0]|0)<<8|(d[l+(j+19)>>0]|0);p=(d[l+(j+21)>>0]|0)<<16|(d[l+(j+20)>>0]|0)<<24|(d[l+(j+22)>>0]|0)<<8|(d[l+(j+23)>>0]|0);q=(d[l+(j+25)>>0]|0)<<16|(d[l+(j+24)>>0]|0)<<24|(d[l+(j+26)>>0]|0)<<8|(d[l+(j+27)>>0]|0);j=m>>>0<o>>>0?o:m;if(j>>>0>p>>>0){r=j}else{s=j;while(1){t=s+q|0;j=s+1|0;if((t|0)!=(o|0)){break b}if(j>>>0>p>>>0){r=j;break}else{s=j}}}p=n+1|0;if(p>>>0<k>>>0){m=r;n=p}else{break a}}c[f>>2]=s;c[b+32>>2]=t-o;c[h>>2]=n;i=e;return}}while(0);a[b+24>>0]=0;i=e;return}function nOa(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;g=i;h=c[b+16>>2]|0;j=d[h+13>>0]<<16|d[h+12>>0]<<24|d[h+14>>0]<<8|d[h+15>>0];if((j|0)==0){k=0;i=g;return k|0}l=f<<24>>24!=0;f=(c[e>>2]|0)+(l&1)|0;m=j;n=0;a:while(1){o=n;while(1){p=(o+m|0)>>>1;q=p*12|0;r=d[h+(q+17)>>0]<<16|d[h+(q+16)>>0]<<24|d[h+(q+18)>>0]<<8|d[h+(q+19)>>0];s=d[h+(q+21)>>0]<<16|d[h+(q+20)>>0]<<24|d[h+(q+22)>>0]<<8|d[h+(q+23)>>0];if(f>>>0<r>>>0){break}t=p+1|0;if(!(f>>>0>s>>>0)){u=8;break a}if(t>>>0<m>>>0){o=t}else{v=0;break a}}if(o>>>0<p>>>0){m=p;n=o}else{v=0;break}}if((u|0)==8){v=f-r+(d[h+(q+25)>>0]<<16|d[h+(q+24)>>0]<<24|d[h+(q+26)>>0]<<8|d[h+(q+27)>>0])|0}if(!l){k=v;i=g;return k|0}if(f>>>0>s>>>0){s=p+1|0;if((s|0)==(j|0)){k=0;i=g;return k|0}else{w=s}}else{w=p}p=b+24|0;a[p>>0]=1;s=b+28|0;c[s>>2]=f;c[b+36>>2]=w;do{if((v|0)==0){mOa(b);if((a[p>>0]|0)==0){k=0;i=g;return k|0}else{x=c[b+32>>2]|0;break}}else{c[b+32>>2]=v;x=v}}while(0);if((x|0)==0){k=0;i=g;return k|0}c[e>>2]=c[s>>2];k=x;i=g;return k|0}function oOa(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;g=i;h=c[b+16>>2]|0;j=a[h+7>>0]&254|(d[h+6>>0]|0)<<8;k=j>>>1;if((k|0)==0){l=0;i=g;return l|0}m=f<<24>>24!=0;n=(c[e>>2]|0)+(m&1)|0;if(!(n>>>0<65536)){l=0;i=g;return l|0}o=h+14|0;p=h+(j+16)|0;h=j|1;q=j<<1;r=q|1;s=k+ -1|0;t=q|2;u=n;while(1){n=0;v=o;w=p;while(1){x=(d[v>>0]|0)<<8|(d[v+1>>0]|0);y=w+2|0;z=(d[w>>0]|0)<<8|(d[w+1>>0]|0);if(!(u>>>0<z>>>0|u>>>0>x>>>0)){A=((d[w+j>>0]|0)<<8|(d[w+h>>0]|0))<<16>>16;B=w+q|0;C=(d[B>>0]|0)<<8|(d[w+r>>0]|0);if(n>>>0>=s>>>0&(z|0)==65535&(x|0)==65535){x=c[b>>2]|0;if((C|0)==0){D=A;E=13;break}F=(w+(t+C)|0)>>>0>((c[x+496>>2]|0)+(c[x+500>>2]|0)|0)>>>0;G=F?1:A;H=F?0:C}else{G=A;H=C}if((H|0)==65535){I=B}else if((H|0)==0){D=G;E=13;break}else{E=11;break}}else{I=v+2|0}n=n+1|0;if(!(n>>>0<k>>>0)){J=0;break}else{v=I;w=y}}if((E|0)==11){E=0;v=(u-z<<1)+q+H|0;n=(d[w+v>>0]|0)<<8|(d[w+(v+1)>>0]|0);if((n|0)==0){J=0}else{J=n+G&65535}}else if((E|0)==13){E=0;J=D+u&65535}K=(J|0)==0;n=u+1|0;if(!(m&K)){break}if(n>>>0<65536){u=n}else{l=0;E=18;break}}if((E|0)==18){i=g;return l|0}if(f<<24>>24==0|K){l=J;i=g;return l|0}c[e>>2]=u;l=J;i=g;return l|0}function pOa(a){a=a|0;var b=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;b=i;e=a+24|0;f=c[e>>2]|0;a:do{if(!(f>>>0>65534)){g=f+1|0;h=a+40|0;j=c[h>>2]|0;k=a+52|0;l=a+44|0;m=a+48|0;n=a+36|0;o=j;p=g>>>0<j>>>0?j:g;b:while(1){g=c[k>>2]|0;j=c[l>>2]|0;q=c[m>>2]|0;c:do{if(p>>>0>j>>>0){r=p}else{if((g|0)==0){s=p;while(1){t=s+q&65535;if((t|0)!=0){u=11;break b}v=s+1|0;if(v>>>0>j>>>0){r=v;break c}else{s=v}}}w=p;v=g+(p-o<<1)|0;while(1){x=(d[v>>0]|0)<<8|(d[v+1>>0]|0);v=v+2|0;if((x|0)!=0?(y=x+q&65535,(y|0)!=0):0){u=8;break b}x=w+1|0;if(x>>>0>j>>>0){r=x;break}else{w=x}}}}while(0);if((rOa(a,(c[n>>2]|0)+1|0)|0)<0){break a}j=c[h>>2]|0;o=j;p=r>>>0<j>>>0?j:r}if((u|0)==8){c[e>>2]=w;c[a+28>>2]=y;i=b;return}else if((u|0)==11){c[e>>2]=s;c[a+28>>2]=t;i=b;return}}}while(0);c[e>>2]=-1;c[a+28>>2]=0;i=b;return}function qOa(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0;g=i;h=c[b+16>>2]|0;j=a[h+7>>0]&254|(d[h+6>>0]|0)<<8;if((j|0)==0){k=0;i=g;return k|0}l=j>>>1;m=f<<24>>24!=0;f=(c[e>>2]|0)+(m&1)|0;n=j+2|0;o=65535;p=l;q=l;r=0;a:while(1){s=o;t=p;u=q;while(1){if(!(r>>>0<t>>>0)){v=s;w=0;x=u;break a}y=(t+r|0)>>>1;z=y<<1;A=z+14|0;s=(d[h+A>>0]|0)<<8|(d[h+(z+15)>>0]|0);B=A+n|0;C=(d[h+B>>0]|0)<<8|(d[h+(B|1)>>0]|0);if(!(f>>>0<C>>>0)){break}else{t=y;u=y}}D=y+1|0;if(f>>>0>s>>>0){o=s;p=t;q=y;r=D}else{E=7;break}}do{if((E|0)==7){r=B+j|0;q=((d[h+r>>0]|0)<<8|(d[h+(r|1)>>0]|0))<<16>>16;p=r+j|0;r=h+p|0;o=(d[r>>0]|0)<<8|(d[h+(p|1)>>0]|0);if(y>>>0>=(l+ -1|0)>>>0&(C|0)==65535&(s|0)==65535){u=c[b>>2]|0;if((o|0)==0){F=q;G=0}else{A=(h+(p+2+o)|0)>>>0>((c[u+496>>2]|0)+(c[u+500>>2]|0)|0)>>>0;F=A?1:q;G=A?0:o}}else{F=q;G=o}A=(G|0)==65535;if((c[b+20>>2]&2|0)==0){if(A){v=s;w=0;x=y;break}else{H=F;I=s;J=y;K=G;L=r;M=C}}else{u=A?D:y;b:do{if((y|0)==0){N=F;O=s;P=0;Q=u;R=G;S=r;T=C}else{A=F;p=s;z=y;U=u;V=G;W=r;X=C;while(1){Y=z;z=z+ -1|0;Z=z<<1;_=Z+14|0;$=(d[h+_>>0]|0)<<8|(d[h+(Z+15)>>0]|0);if(f>>>0>$>>>0){N=A;O=p;P=Y;Q=U;R=V;S=W;T=X;break b}Y=_+n|0;_=(d[h+Y>>0]|0)<<8|(d[h+(Y|1)>>0]|0);Z=Y+j|0;Y=((d[h+Z>>0]|0)<<8|(d[h+(Z|1)>>0]|0))<<16>>16;aa=Z+j|0;Z=h+aa|0;ba=(d[Z>>0]|0)<<8|(d[h+(aa|1)>>0]|0);aa=(ba|0)==65535?U:z;if((z|0)==0){N=Y;O=$;P=0;Q=aa;R=ba;S=Z;T=_;break}else{A=Y;p=$;U=aa;V=ba;W=Z;X=_}}}}while(0);if((Q|0)==(D|0)){r=(P|0)==(y|0);u=r?O:s;if(!(D>>>0<l>>>0)){v=u;w=0;x=y;break}t=r?N:q;X=u;u=D;W=y;V=r?R:o;U=r?T:C;while(1){r=u<<1;p=r+14|0;A=p+n|0;z=h+A|0;_=(d[z>>0]|0)<<8|(d[h+(A|1)>>0]|0);if(f>>>0<_>>>0){ca=t;da=X;ea=u;fa=W;ga=V;ha=z;ia=U;break}z=(d[h+p>>0]|0)<<8|(d[h+(r+15)>>0]|0);r=A+j|0;A=((d[h+r>>0]|0)<<8|(d[h+(r|1)>>0]|0))<<16>>16;p=r+j|0;r=h+p|0;Z=(d[r>>0]|0)<<8|(d[h+(p|1)>>0]|0);p=(Z|0)==65535?W:u;ba=u+1|0;if(ba>>>0<l>>>0){t=A;X=z;u=ba;W=p;V=Z;U=_}else{ca=A;da=z;ea=ba;fa=p;ga=Z;ha=r;ia=_;break}}U=ea+ -1|0;if((fa|0)==(y|0)){v=da;w=0;x=U;break}else{ja=ca;ka=da;la=U;ma=fa;na=ga;oa=ha;pa=ia}}else{ja=N;ka=O;la=P;ma=Q;na=R;oa=S;pa=T}if((ma|0)==(la|0)){H=ja;I=ka;J=ma;K=na;L=oa;M=pa}else{U=ma<<1;V=U+14|0;W=V+n|0;u=W+j|0;X=u+j|0;t=h+X|0;H=((d[h+u>>0]|0)<<8|(d[h+(u|1)>>0]|0))<<16>>16;I=(d[h+V>>0]|0)<<8|(d[h+(U+15)>>0]|0);J=ma;K=(d[t>>0]|0)<<8|(d[h+(X|1)>>0]|0);L=t;M=(d[h+W>>0]|0)<<8|(d[h+(W|1)>>0]|0)}}if((K|0)==0){v=I;w=H+f&65535;x=J;break}W=(f-M<<1)+K|0;t=(d[L+W>>0]|0)<<8|(d[L+(W+1)>>0]|0);if((t|0)==0){v=I;w=0;x=J}else{v=I;w=t+H&65535;x=J}}}while(0);if(!m){k=w;i=g;return k|0}if(f>>>0>v>>>0){v=x+1|0;if((v|0)==(l|0)){k=0;i=g;return k|0}else{qa=v}}else{qa=x}if((rOa(b,qa)|0)!=0){if((w|0)==0){k=0;i=g;return k|0}c[e>>2]=f;k=w;i=g;return k|0}qa=b+24|0;x=f;c[qa>>2]=x;if((w|0)==0){c[qa>>2]=x;pOa(b);ra=c[b+28>>2]|0}else{c[b+28>>2]=w;ra=w}if((ra|0)==0){k=0;i=g;return k|0}c[e>>2]=c[qa>>2];k=ra;i=g;return k|0}function rOa(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;e=i;f=c[a+16>>2]|0;g=c[a+32>>2]|0;if(!(g>>>0>b>>>0)){h=-1;i=e;return h|0}j=a+44|0;k=g<<1;l=k+2|0;m=a+40|0;n=a+48|0;o=g+ -1|0;p=b;while(1){b=p<<1;q=b+14|0;r=(d[f+q>>0]|0)<<8|(d[f+(b+15)>>0]|0);c[j>>2]=r;b=l+q|0;q=(d[f+b>>0]|0)<<8|(d[f+(b|1)>>0]|0);c[m>>2]=q;s=b+k|0;c[n>>2]=((d[f+s>>0]|0)<<8|(d[f+(s|1)>>0]|0))<<16>>16;t=s+k|0;u=(d[f+t>>0]|0)<<8|(d[f+(t|1)>>0]|0);if(p>>>0>=o>>>0&(q|0)==65535&(r|0)==65535){r=c[a>>2]|0;if((u|0)==0){v=0;break}if((f+(t+2+u)|0)>>>0>((c[r+496>>2]|0)+(c[r+500>>2]|0)|0)>>>0){w=6;break}}if((u|0)==0){v=0;break}else if((u|0)!=65535){w=8;break}r=p+1|0;if(r>>>0<g>>>0){p=r}else{h=-1;w=11;break}}if((w|0)==6){c[n>>2]=1;v=0}else if((w|0)==8){v=f+(u+t)|0}else if((w|0)==11){i=e;return h|0}c[a+52>>2]=v;c[a+36>>2]=p;h=0;i=e;return h|0}function sOa(b,c){b=b|0;c=c|0;var e=0,f=0,g=0,h=0,j=0;e=i;if(!(c>>>0<65536)){f=0;i=e;return f|0}g=c>>>8;if((g|0)==0){h=c<<1&510;if(((d[b+(h+6)>>0]|0)<<8|(d[b+(h+7)>>0]|0)|0)==0){j=b+518|0}else{f=0;i=e;return f|0}}else{h=g<<1;g=a[b+(h+7)>>0]&248|(d[b+(h+6)>>0]|0)<<8;if((g|0)==0){f=0;i=e;return f|0}else{j=b+(g+518)|0}}f=j;i=e;return f|0}function tOa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d;c[b>>2]=0;f=ZDa(a,20,e)|0;g=c[e>>2]|0;if((g|0)!=0){i=d;return g|0}c[f+12>>2]=a;c[b>>2]=f;i=d;return g|0}function uOa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;if((a|0)==0){i=e;return}if((b|0)!=0&(d|0)>3475){c[a+16>>2]=b;c[a>>2]=b+1440;b=d+ -1440|0;c[a+4>>2]=b&-16;c[a+8>>2]=b>>>7;i=e;return}else{c[a>>2]=0;c[a+4>>2]=0;c[a+16>>2]=0;i=e;return}}function vOa(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0;e=i;i=i+352|0;f=e+24|0;g=e+20|0;h=e+16|0;j=e+12|0;k=e+8|0;l=e+4|0;m=e;n=c[d+4>>2]|0;o=c[d>>2]|0;if((a|0)==0){p=6;i=e;return p|0}if((c[a>>2]|0)==0){p=6;i=e;return p|0}q=a+4|0;if((c[q>>2]|0)==0){p=6;i=e;return p|0}if((n|0)==0){p=20;i=e;return p|0}r=b[n+2>>1]|0;if(r<<16>>16==0){p=0;i=e;return p|0}s=b[n>>1]|0;if(s<<16>>16<1){p=0;i=e;return p|0}t=c[n+12>>2]|0;if((t|0)==0){p=20;i=e;return p|0}if((c[n+4>>2]|0)==0){p=20;i=e;return p|0}if((r<<16>>16|0)!=((b[t+((s<<16>>16)+ -1<<1)>>1]|0)+1|0)){p=20;i=e;return p|0}s=c[a+16>>2]|0;t=d+8|0;r=c[t>>2]|0;u=(r&2|0)==0;if(u){if((o|0)==0){p=6;i=e;return p|0}if((c[o+4>>2]|0)==0){p=0;i=e;return p|0}if((c[o>>2]|0)==0){p=0;i=e;return p|0}if((c[o+12>>2]|0)==0){p=6;i=e;return p|0}}if((r&1|0)==0){p=19;i=e;return p|0}do{if(!u){v=s+1024|0;if((r&4|0)==0){c[v>>2]=-32768;c[s+1028>>2]=-32768;c[s+1032>>2]=32767;c[s+1036>>2]=32767;break}else{w=d+32|0;c[v+0>>2]=c[w+0>>2];c[v+4>>2]=c[w+4>>2];c[v+8>>2]=c[w+8>>2];c[v+12>>2]=c[w+12>>2];break}}else{c[s+1024>>2]=0;c[s+1028>>2]=0;c[s+1032>>2]=c[o+4>>2];c[s+1036>>2]=c[o>>2]}}while(0);r=c[a>>2]|0;u=c[q>>2]|0;q=s+1412|0;c[q>>2]=r;w=s+1416|0;c[w>>2]=u;u=s+1420|0;c[u>>2]=r;r=s+44|0;c[r>>2]=0;v=s+48|0;c[v>>2]=0;x=s+52|0;c[x>>2]=0;c[s+32>>2]=0;c[s+36>>2]=0;y=s+40|0;c[y>>2]=1;z=s+980|0;c[z+0>>2]=c[n+0>>2];c[z+4>>2]=c[n+4>>2];c[z+8>>2]=c[n+8>>2];c[z+12>>2]=c[n+12>>2];c[z+16>>2]=c[n+16>>2];c[x>>2]=0;c[y>>2]=1;n=s+1248|0;c[n>>2]=c[a+8>>2];a=s+1232|0;c[a>>2]=0;if((c[t>>2]&2|0)==0){t=s+1e3|0;c[t+0>>2]=c[o+0>>2];c[t+4>>2]=c[o+4>>2];c[t+8>>2]=c[o+8>>2];c[t+12>>2]=c[o+12>>2];c[t+16>>2]=c[o+16>>2];c[t+20>>2]=c[o+20>>2];c[s+1236>>2]=67;c[s+1240>>2]=s}else{c[s+1236>>2]=c[d+12>>2];c[s+1240>>2]=c[d+28>>2]}d=c[s+984>>2]|0;o=b[s+982>>1]|0;t=d+(o<<16>>16<<3)|0;if(o<<16>>16<1){z=s+8|0;c[z+0>>2]=0;c[z+4>>2]=0;c[z+8>>2]=0;c[z+12>>2]=0;A=s+12|0;B=0;C=0;D=0;E=0}else{z=c[d>>2]|0;F=s+12|0;c[F>>2]=z;G=s+8|0;c[G>>2]=z;H=c[d+4>>2]|0;I=s+20|0;c[I>>2]=H;J=s+16|0;c[J>>2]=H;if(o<<16>>16>1){o=d;K=z;L=z;M=H;N=H;O=d+8|0;while(1){d=c[O>>2]|0;P=c[o+12>>2]|0;if((d|0)<(K|0)){c[G>>2]=d;Q=d}else{Q=K}if((d|0)>(L|0)){c[F>>2]=d;R=d}else{R=L}if((P|0)<(M|0)){c[J>>2]=P;S=P}else{S=M}if((P|0)>(N|0)){c[I>>2]=P;T=P}else{T=N}P=O+8|0;if(P>>>0<t>>>0){d=O;K=Q;L=R;M=S;N=T;O=P;o=d}else{U=Q;V=S;W=R;X=T;break}}}else{U=z;V=H;W=z;X=H}H=U>>6;c[G>>2]=H;G=V>>6;c[J>>2]=G;J=W+63>>6;c[F>>2]=J;W=X+63>>6;c[I>>2]=W;A=F;B=J;C=H;D=W;E=G}G=c[s+1024>>2]|0;if((B|0)<=(G|0)){p=0;i=e;return p|0}W=c[s+1032>>2]|0;if((C|0)>=(W|0)){p=0;i=e;return p|0}H=s+20|0;J=c[s+1028>>2]|0;if((D|0)<=(J|0)){p=0;i=e;return p|0}F=s+16|0;I=c[s+1036>>2]|0;if((E|0)>=(I|0)){p=0;i=e;return p|0}if((C|0)<(G|0)){c[s+8>>2]=G;Y=G}else{Y=C}if((E|0)<(J|0)){c[F>>2]=J;Z=J}else{Z=E}if((B|0)>(W|0)){c[A>>2]=W;_=W}else{_=B}if((D|0)>(I|0)){c[H>>2]=I;$=I}else{$=D}D=s+24|0;c[D>>2]=_-Y;Y=$-Z|0;Z=s+28|0;c[Z>>2]=Y;c[j>>2]=(Y|0)/(c[n>>2]|0)|0;if((c[j>>2]|0)==0){c[j>>2]=1}if((c[j>>2]|0)>38){c[j>>2]=39}Y=s+1252|0;c[Y>>2]=0;c[k>>2]=c[F>>2];c[m>>2]=c[H>>2];c[h>>2]=0;a:do{if((c[h>>2]|0)<(c[j>>2]|0)){$=f+4|0;_=s+1424|0;I=s+1236|0;B=s+1244|0;W=s+1040|0;A=s+1240|0;b:while(1){c[l>>2]=(c[n>>2]|0)+(c[k>>2]|0);if(!((c[h>>2]|0)!=((c[j>>2]|0)+ -1|0)?(c[l>>2]|0)<=(c[m>>2]|0):0)){c[l>>2]=c[m>>2]}c[f>>2]=c[k>>2];c[$>>2]=c[l>>2];c[g>>2]=f;if(!((c[g>>2]|0)>>>0<f>>>0)){do{c[u>>2]=c[q>>2];E=(c[(c[g>>2]|0)+4>>2]|0)-(c[c[g>>2]>>2]|0)|0;c[_>>2]=E;J=E<<2;C=J&12;if((C|0)==0){aa=J}else{aa=J+16-C|0}C=c[w>>2]&-16;c[r>>2]=(c[q>>2]|0)+aa;do{if((aa|0)<(C|0)){J=C-aa|0;c[v>>2]=J>>4;if((J|0)<32){ba=84;break}if((E|0)>0){J=0;do{c[(c[u>>2]|0)+(J<<2)>>2]=0;J=J+1|0}while((J|0)<(c[_>>2]|0))}c[x>>2]=0;c[y>>2]=1;c[F>>2]=c[c[g>>2]>>2];c[H>>2]=c[(c[g>>2]|0)+4>>2];c[Z>>2]=(c[(c[g>>2]|0)+4>>2]|0)-(c[c[g>>2]>>2]|0);J=GOa(s)|0;if((J|0)==64){ba=84;break}else if((J|0)!=0){p=1;ba=92;break b}do{if((c[x>>2]|0)!=0){c[a>>2]=0;if((c[_>>2]|0)>0){J=0;do{G=c[(c[u>>2]|0)+(J<<2)>>2]|0;do{if((G|0)!=0){X=G;V=0;U=0;do{z=c[X>>2]|0;if(!((z|0)<=(U|0)|(V|0)==0)){HOa(s,U,J,V<<9,z-U|0)}V=(c[X+4>>2]|0)+V|0;ca=V<<9;z=c[X+8>>2]|0;T=ca-z|0;do{if((ca|0)!=(z|0)){R=c[X>>2]|0;if(!((R|0)>-1)){break}HOa(s,R,J,T,1)}}while(0);U=(c[X>>2]|0)+1|0;X=c[X+12>>2]|0}while((X|0)!=0);if((V|0)==0){break}HOa(s,U,J,ca,(c[D>>2]|0)-U|0)}}while(0);J=J+1|0}while((J|0)<(c[_>>2]|0))}J=c[I>>2]|0;if((J|0)==0){break}G=c[a>>2]|0;if((G|0)<=0){break}pd[J&127](c[B>>2]|0,G,W,c[A>>2]|0)}}while(0);c[g>>2]=(c[g>>2]|0)+ -8}else{ba=84}}while(0);if((ba|0)==84){ba=0;E=c[c[g>>2]>>2]|0;C=c[(c[g>>2]|0)+4>>2]|0;G=C-E>>1;J=G+E|0;if((G|0)==0){p=1;ba=92;break b}if((E-C|0)>=(c[n>>2]|0)){c[Y>>2]=(c[Y>>2]|0)+1}c[(c[g>>2]|0)+8>>2]=E;c[(c[g>>2]|0)+12>>2]=J;c[c[g>>2]>>2]=J;c[(c[g>>2]|0)+4>>2]=C;c[g>>2]=(c[g>>2]|0)+8}}while(!((c[g>>2]|0)>>>0<f>>>0))}c[h>>2]=(c[h>>2]|0)+1;c[k>>2]=c[l>>2];if((c[h>>2]|0)>=(c[j>>2]|0)){break a}}if((ba|0)==92){i=e;return p|0}}}while(0);if((c[Y>>2]|0)<=8){p=0;i=e;return p|0}Y=c[n>>2]|0;if((Y|0)<=16){p=0;i=e;return p|0}c[n>>2]=(Y|0)/2|0;p=0;i=e;return p|0}function wOa(a){a=a|0;var b=0;b=i;aEa(c[a+12>>2]|0,a);i=b;return}function xOa(a){a=a|0;var b=0,d=0;b=i;d=c[a+4>>2]|0;ld[c[(c[(c[a+12>>2]|0)+56>>2]|0)+8>>2]&255](c[a+52>>2]|0,c[d+164>>2]|0,c[d+168>>2]|0);i=b;return 0}function yOa(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=i;f=EOa(a,b,(c|0)==1?0:c,d,0)|0;i=e;return f|0}function zOa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;if((c[b+72>>2]|0)!=(c[a+16>>2]|0)){g=6;i=f;return g|0}if((d|0)!=0){wEa(b+108|0,d)}if((e|0)==0){g=0;i=f;return g|0}xEa(b+108|0,c[e>>2]|0,c[e+4>>2]|0);g=0;i=f;return g|0}function AOa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;if((c[b+72>>2]|0)!=(c[a+16>>2]|0)){i=e;return}qFa(b+108|0,d);i=e;return}function BOa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=Qc[c[(c[(c[a+12>>2]|0)+56>>2]|0)+12>>2]&255](c[a+52>>2]|0,b,d)|0;i=e;return f|0}function COa(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;f=i;g=EOa(b,c,d,e,3)|0;if((g|0)!=0){i=f;return g|0}a[c+94>>0]=5;i=f;return g|0}function DOa(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;f=i;g=EOa(b,c,d,e,4)|0;if((g|0)!=0){i=f;return g|0}a[c+94>>0]=6;i=f;return g|0}function EOa(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0;j=i;i=i+80|0;k=j+64|0;l=j+48|0;m=j;n=e+76|0;o=c[d+8>>2]|0;p=(f|0)==3;q=(f|0)==4;r=e+72|0;if((c[r>>2]|0)!=(c[d+16>>2]|0)){c[k>>2]=6;s=6;i=j;return s|0}if((f|0)!=(h|0)){c[k>>2]=19;s=19;i=j;return s|0}h=e+108|0;if((g|0)==0){t=0}else{xEa(h,c[g>>2]|0,c[g+4>>2]|0);t=1}qFa(h,l);u=c[l>>2]&-64;c[l>>2]=u;v=l+4|0;w=c[v>>2]&-64;c[v>>2]=w;x=l+8|0;y=(c[x>>2]|0)+63&-64;c[x>>2]=y;x=l+12|0;z=(c[x>>2]|0)+63&-64;c[x>>2]=z;do{if((u|0)<0&(y|0)>(u+2147483647|0)){c[k>>2]=98;A=98;B=0}else{C=y-u>>6;if((w|0)<0&(z|0)>(w+2147483647|0)){c[k>>2]=98;A=98;B=0;break}D=z-w>>6;E=e+156|0;if((c[(c[E>>2]|0)+4>>2]&1|0)!=0){F=e+88|0;aEa(o,c[F>>2]|0);c[F>>2]=0;F=(c[E>>2]|0)+4|0;c[F>>2]=c[F>>2]&-2}if(p){F=C*3|0;G=F+3&-4;H=F}else{G=C;H=C}if(q){I=D*3|0}else{I=D}D=c[l>>2]|0;C=c[v>>2]|0;F=D>>6;J=c[x>>2]>>6;K=c[e>>2]|0;if((c[K+204>>2]|0)!=0){L=c[K+192>>2]|0;if(p){K=L>>1;M=(L*3|0)+H|0;N=M+3&-4;O=M;P=F-K|0;Q=D-(K<<6)|0}else{N=G;O=H;P=F;Q=D}if(q){K=L>>1;R=(L*3|0)+I|0;S=N;T=O;U=P;V=Q;W=C-(K<<6)|0;X=K+J|0}else{R=I;S=N;T=O;U=P;V=Q;W=C;X=J}}else{R=I;S=G;T=H;U=F;V=D;W=C;X=J}if((T|0)>32767|(R|0)>32767){c[k>>2]=98;A=98;B=0;break}a[e+94>>0]=2;b[e+92>>1]=256;c[e+80>>2]=T;c[n>>2]=R;c[e+84>>2]=S;xEa(h,0-V|0,0-W|0);c[e+88>>2]=ZDa(o,ca(R,S)|0,k)|0;J=c[k>>2]|0;if((J|0)==0){C=(c[E>>2]|0)+4|0;c[C>>2]=c[C>>2]|1;c[m>>2]=n;c[m+4>>2]=h;c[m+8>>2]=1;C=e+112|0;E=c[C>>2]|0;D=e+110|0;F=b[D>>1]|0;K=E+(F<<16>>16<<3)|0;L=F<<16>>16>0;if(p&L){F=E;do{c[F>>2]=(c[F>>2]|0)*3;F=F+8|0}while(F>>>0<K>>>0)}if(q&L){F=E;do{M=F+4|0;c[M>>2]=(c[M>>2]|0)*3;F=F+8|0}while(F>>>0<K>>>0)}c[k>>2]=dd[c[d+56>>2]&511](c[d+52>>2]|0,m)|0;K=c[C>>2]|0;F=b[D>>1]|0;E=K+(F<<16>>16<<3)|0;L=F<<16>>16>0;if(p&L){F=K;do{c[F>>2]=(c[F>>2]|0)/3|0;F=F+8|0}while(F>>>0<E>>>0)}if(q&L){F=K;do{D=F+4|0;c[D>>2]=(c[D>>2]|0)/3|0;F=F+8|0}while(F>>>0<E>>>0)}E=c[k>>2]|0;if((E|0)==0){F=c[e>>2]|0;K=c[F+204>>2]|0;if((K|0)!=0){ld[K&255](n,f,F)}c[r>>2]=1651078259;c[e+100>>2]=U;c[e+104>>2]=X;c[k>>2]=0;Y=0;Z=0}else{Y=E;Z=1}}else{Y=J;Z=0}xEa(h,V,W);A=Y;B=Z}}while(0);if(!(t<<24>>24==0)){xEa(h,0-(c[g>>2]|0)|0,0-(c[g+4>>2]|0)|0)}if(B<<24>>24==0){s=A;i=j;return s|0}B=e+88|0;aEa(o,c[B>>2]|0);c[B>>2]=0;B=(c[e+156>>2]|0)+4|0;c[B>>2]=c[B>>2]&-2;s=A;i=j;return s|0}function FOa(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;h=i;j=c[g+1012>>2]|0;k=c[g+1008>>2]|0;l=ca(k,d)|0;if((k|0)>-1){m=ca((c[g+1e3>>2]|0)+ -1|0,k)|0}else{m=0}k=m-l|0;if((e|0)>0){n=f;o=e}else{i=h;return}while(1){e=a[n+4>>0]|0;a:do{if(!(e<<24>>24==0)){f=b[n+2>>1]|0;l=f&65535;m=b[n>>1]|0;g=j+(k+m)|0;if((f&65535)>7){f3a(g|0,e|0,l|0)|0;break}switch(l|0){case 3:{p=g;q=12;break};case 5:{r=g;q=10;break};case 6:{s=g;q=9;break};case 7:{a[g>>0]=e;s=j+(k+(m+1))|0;q=9;break};case 4:{t=g;q=11;break};case 1:{u=g;break};case 2:{v=g;q=13;break};default:{break a}}if((q|0)==9){q=0;a[s>>0]=e;r=s+1|0;q=10}if((q|0)==10){q=0;a[r>>0]=e;t=r+1|0;q=11}if((q|0)==11){q=0;a[t>>0]=e;p=t+1|0;q=12}if((q|0)==12){q=0;a[p>>0]=e;v=p+1|0;q=13}if((q|0)==13){q=0;a[v>>0]=e;u=v+1|0}a[u>>0]=e}}while(0);o=o+ -1|0;if((o|0)<=0){break}else{n=n+6|0}}i=h;return}function GOa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;i=i+16|0;d=i;i=i+168|0;c[d>>2]=0;e=b;c[e>>2]=0;_2a(a+1256|0,1,d|0)|0;r=0;f=r;r=0;if((f|0)!=0&(s|0)!=0){g=b3a(c[f>>2]|0,d)|0;if((g|0)==0){bb(f|0,s|0)}G=s}else{g=-1}if((g|0)==1){h=G}else{h=0}while(1){if((h|0)!=0){j=7;break}r=0;g=ua(225,a+980|0,1277192,a|0)|0;f=r;r=0;if((f|0)!=0&(s|0)!=0){k=b3a(c[f>>2]|0,d)|0;if((k|0)==0){bb(f|0,s|0)}G=s}else{k=-1}if((k|0)==1){h=G;continue}c[e>>2]=g;r=0;va(577,a|0);g=r;r=0;if((g|0)!=0&(s|0)!=0){l=b3a(c[g>>2]|0,d)|0;if((l|0)==0){bb(g|0,s|0)}G=s}else{l=-1}if((l|0)==1){h=G}else{j=6;break}}if((j|0)==6){m=c[e>>2]|0;i=b;return m|0}else if((j|0)==7){c[e>>2]=64;m=c[e>>2]|0;i=b;return m|0}return 0}function HOa(f,g,h,j,k){f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;l=i;m=j>>9;j=(m|0)<0?0-m|0:m;do{if((c[f+996>>2]&2|0)!=0){m=j&511;if(m>>>0>256){n=512-m|0;break}else{n=(m|0)==256?255:m;break}}else{n=(j|0)>255?255:j}}while(0);j=(c[f+16>>2]|0)+h|0;h=(c[f+8>>2]|0)+g|0;g=(h|0)<32767?h:32767;if((n|0)==0){i=l;return}h=f+1232|0;m=c[h>>2]|0;o=f+1040|0;p=m+ -1|0;q=(m|0)>0;r=f+1244|0;s=c[r>>2]|0;if(q&(s|0)==(j|0)){t=f+(p*6|0)+1042|0;u=e[t>>1]|0;if((u+(b[f+(p*6|0)+1040>>1]|0)|0)==(g|0)?(d[f+(p*6|0)+1044>>0]|0)==(n|0):0){b[t>>1]=u+k;i=l;return}else{v=j}}else{v=s}if((v|0)!=(j|0)|(m|0)>31){s=c[f+1236>>2]|0;if(!((s|0)==0|q^1)){pd[s&127](v,m,o,c[f+1240>>2]|0)}c[h>>2]=0;c[r>>2]=j;w=o}else{w=f+(m*6|0)+1040|0}if((g|0)>=32768){i=l;return}b[w>>1]=g;b[w+2>>1]=k;a[w+4>>0]=n;c[h>>2]=(c[h>>2]|0)+1;i=l;return}function IOa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;b=i;if((c[a+40>>2]|0)!=0){i=b;return}d=a+32|0;e=c[d>>2]|0;f=a+36|0;if((c[f>>2]|e|0)==0){i=b;return}g=c[a>>2]|0;h=c[a+24>>2]|0;j=(g|0)>(h|0)?h:g;g=(c[a+1420>>2]|0)+(c[a+4>>2]<<2)|0;h=c[g>>2]|0;a:do{if((h|0)==0){k=g;l=7}else{m=h;n=g;while(1){o=c[m>>2]|0;if((o|0)>(j|0)){k=n;l=7;break a}p=m+12|0;if((o|0)==(j|0)){q=e;r=m;break a}m=c[p>>2]|0;if((m|0)==0){k=p;l=7;break}else{n=p}}}}while(0);do{if((l|0)==7){e=a+52|0;g=c[e>>2]|0;if((g|0)<(c[a+48>>2]|0)){h=c[a+44>>2]|0;c[e>>2]=g+1;e=h+(g<<4)|0;c[e>>2]=j;c[h+(g<<4)+8>>2]=0;c[h+(g<<4)+4>>2]=0;c[h+(g<<4)+12>>2]=c[k>>2];c[k>>2]=e;q=c[d>>2]|0;r=e;break}else{bb(a+1256|0,1)}}}while(0);a=r+8|0;c[a>>2]=(c[a>>2]|0)+q;q=r+4|0;c[q>>2]=(c[q>>2]|0)+(c[f>>2]|0);i=b;return}function JOa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;IOa(b);e=c[a>>2]<<2;f=c[a+4>>2]<<2;a=e>>8;g=f>>8;h=c[b+12>>2]|0;j=(h|0)<(a|0)?h:a;a=c[b+8>>2]|0;h=(j|0)<(a|0)?a+ -1|0:j;c[b+32>>2]=0;c[b+36>>2]=0;c[b>>2]=h-a;c[b+4>>2]=g-(c[b+16>>2]|0);c[b+72>>2]=g<<8;c[b+40>>2]=0;POa(b,h,g);c[b+64>>2]=e;c[b+68>>2]=f;i=d;return 0}function KOa(a,b){a=a|0;b=b|0;var d=0;d=i;NOa(b,c[a>>2]<<2,c[a+4>>2]<<2);i=d;return 0}function LOa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;e=i;f=d+852|0;g=d+76|0;h=c[b>>2]<<2;c[g>>2]=h;j=c[b+4>>2]<<2;c[d+80>>2]=j;b=c[a>>2]|0;c[d+84>>2]=b<<2;k=c[a+4>>2]|0;a=k<<2;c[d+88>>2]=a;l=c[d+64>>2]|0;c[d+92>>2]=l;m=c[d+68>>2]|0;c[d+96>>2]=m;n=h-(b<<3)+l|0;l=(n|0)<0?0-n|0:n;n=j-(k<<3)+m|0;k=(n|0)<0?0-n|0:n;n=(l|0)<(k|0)?k:l;if(((n|0)>=64?(l=(a|0)<(j|0)?a:j,k=(a|0)>(j|0)?a:j,(((m|0)<(l|0)?m:l)>>8|0)<(c[d+20>>2]|0)):0)?(((m|0)>(k|0)?m:k)>>8|0)>=(c[d+16>>2]|0):0){k=n;n=0;do{k=k>>2;n=n+1|0}while((k|0)>64);c[f>>2]=n;o=n;p=g;q=0;r=6}else{s=h;t=g;u=0;r=9}a:while(1){do{if((r|0)==6){r=0;if((o|0)>0){g=p+16|0;h=c[g>>2]|0;c[p+32>>2]=h;n=p+8|0;f=c[n>>2]|0;k=(f+h|0)/2|0;c[p+24>>2]=k;h=((c[p>>2]|0)+f|0)/2|0;c[n>>2]=h;c[g>>2]=(h+k|0)/2|0;k=p+20|0;h=c[k>>2]|0;c[p+36>>2]=h;g=p+12|0;n=c[g>>2]|0;f=(n+h|0)/2|0;c[p+28>>2]=f;h=((c[p+4>>2]|0)+n|0)/2|0;c[g>>2]=h;c[k>>2]=(h+f|0)/2|0;f=q+1|0;h=o+ -1|0;c[d+(q<<2)+852>>2]=h;c[d+(f<<2)+852>>2]=h;v=p+16|0;w=f;break}else{s=c[p>>2]|0;t=p;u=q;r=9;continue a}}else if((r|0)==9){r=0;NOa(d,s,c[t+4>>2]|0);v=t+ -16|0;w=u+ -1|0}}while(0);if(!((w|0)>-1)){break}o=c[d+(w<<2)+852>>2]|0;p=v;q=w;r=6}i=e;return 0}function MOa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;f=i;g=e+76|0;h=c[d>>2]<<2;c[g>>2]=h;j=c[d+4>>2]<<2;c[e+80>>2]=j;c[e+84>>2]=c[b>>2]<<2;d=c[b+4>>2]<<2;c[e+88>>2]=d;c[e+92>>2]=c[a>>2]<<2;b=c[a+4>>2]<<2;c[e+96>>2]=b;c[e+100>>2]=c[e+64>>2];a=c[e+68>>2]|0;c[e+104>>2]=a;k=(d|0)<(j|0)?d:j;l=(d|0)>(j|0)?d:j;j=(b|0)<(k|0)?b:k;k=(b|0)>(l|0)?b:l;if((((a|0)<(j|0)?a:j)>>8|0)<(c[e+20>>2]|0)?(((a|0)>(k|0)?a:k)>>8|0)>=(c[e+16>>2]|0):0){m=h;n=g}else{o=h;p=g;q=13}while(1){if((q|0)==13){q=0;NOa(e,o,c[p+4>>2]|0);if((p|0)==(g|0)){break}h=p+ -24|0;m=c[h>>2]|0;n=h}h=n+24|0;k=c[h>>2]|0;a=k-m|0;j=n+28|0;l=c[j>>2]|0;b=c[n+4>>2]|0;d=l-b|0;r=(a|0)<0?0-a|0:a;s=(d|0)<0?0-d|0:d;if((r|0)>(s|0)){t=(s*97|0)+(r*236|0)|0}else{t=(s*236|0)+(r*97|0)|0}r=t>>8;if((r|0)<=32767){s=r*42|0;r=c[n+8>>2]|0;u=r-m|0;v=c[n+12>>2]|0;w=v-b|0;x=(ca(u,d)|0)-(ca(w,a)|0)|0;if((((((x|0)<0?0-x|0:x)|0)<=(s|0)?(x=(c[n+16>>2]|0)-m|0,y=(c[n+20>>2]|0)-b|0,z=(ca(x,d)|0)-(ca(y,a)|0)|0,(((z|0)<0?0-z|0:z)|0)<=(s|0)):0)?((ca(w-d|0,w)|0)+(ca(u-a|0,u)|0)|0)<=0:0)?((ca(y-d|0,y)|0)+(ca(x-a|0,x)|0)|0)<=0:0){o=m;p=n;q=13;continue}else{A=r;B=v}}else{A=c[n+8>>2]|0;B=c[n+12>>2]|0}c[n+48>>2]=k;v=n+16|0;r=c[v>>2]|0;x=(A+m|0)/2|0;c[n+8>>2]=x;a=(r+k|0)/2|0;c[n+40>>2]=a;k=(r+A|0)/2|0;r=(k+x|0)/2|0;c[v>>2]=r;v=(k+a|0)/2|0;c[n+32>>2]=v;a=(v+r|0)/2|0;c[n+24>>2]=a;c[n+52>>2]=l;r=n+20|0;v=c[r>>2]|0;k=(B+b|0)/2|0;c[n+12>>2]=k;b=(v+l|0)/2|0;c[n+44>>2]=b;l=(v+B|0)/2|0;v=(l+k|0)/2|0;c[r>>2]=v;r=(l+b|0)/2|0;c[n+36>>2]=r;c[j>>2]=(r+v|0)/2|0;m=a;n=h}i=f;return 0}function NOa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;e=i;f=a+72|0;g=c[f>>2]|0;h=g>>8;j=d>>8;k=a+68|0;l=c[k>>2]|0;m=l-g|0;g=j<<8;n=d-g|0;o=a+64|0;p=c[o>>2]|0;q=b-p|0;r=d-l|0;l=(h|0)>(j|0);if(((l?j:h)|0)>=(c[a+20>>2]|0)){c[o>>2]=b;c[k>>2]=d;c[f>>2]=g;i=e;return}if(((l?h:j)|0)<(c[a+16>>2]|0)){c[o>>2]=b;c[k>>2]=d;c[f>>2]=g;i=e;return}if((h|0)==(j|0)){OOa(a,h,p,m,b,n);c[o>>2]=b;c[k>>2]=d;c[f>>2]=g;i=e;return}if((p|0)==(b|0)){l=b>>8;s=b-(l<<8)<<1;t=r>>31;u=t+256&-256;v=t|1;t=u-m|0;w=ca(s,t)|0;x=a+32|0;c[x>>2]=(c[x>>2]|0)+w;w=a+36|0;c[w>>2]=(c[w>>2]|0)+t;t=v+h|0;POa(a,l,t);y=(u<<1)+ -256|0;z=ca(y,s)|0;if((t|0)!=(j|0)){A=t;do{c[x>>2]=(c[x>>2]|0)+z;c[w>>2]=(c[w>>2]|0)+y;A=A+v|0;POa(a,l,A)}while((A|0)!=(j|0))}A=n+ -256+u|0;u=ca(s,A)|0;c[x>>2]=(c[x>>2]|0)+u;c[w>>2]=(c[w>>2]|0)+A;c[o>>2]=b;c[k>>2]=d;c[f>>2]=g;i=e;return}A=(r|0)<0;w=r>>31;u=w+256&-256;x=w|1;w=A?0-r|0:r;r=ca(A?m:256-m|0,q)|0;A=(r|0)/(w|0)|0;s=(r|0)%(w|0)|0;if((s|0)<0){B=A+ -1|0;C=s+w|0}else{B=A;C=s}s=p+B|0;OOa(a,h,p,m,s,u);m=x+h|0;POa(a,s>>8,m);if((m|0)==(j|0)){D=256-u|0;E=s}else{h=q<<8;q=(h|0)/(w|0)|0;p=(h|0)%(w|0)|0;if((p|0)<0){F=q+ -1|0;G=p+w|0}else{F=q;G=p}p=256-u|0;q=m;m=C-w|0;C=s;while(1){s=m+G|0;h=F+(s>>>31^1)+C|0;OOa(a,q,C,p,h,u);q=q+x|0;POa(a,h>>8,q);if((q|0)==(j|0)){D=p;E=h;break}else{m=s-((s|0)>-1?w:0)|0;C=h}}}OOa(a,j,E,D,b,n);c[o>>2]=b;c[k>>2]=d;c[f>>2]=g;i=e;return}function OOa(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;h=i;j=f-d|0;k=d>>8;l=f>>8;m=d-(k<<8)|0;d=f-(l<<8)|0;if((e|0)==(g|0)){POa(a,l,b);i=h;return}if((k|0)==(l|0)){f=g-e|0;n=ca(d+m|0,f)|0;o=a+32|0;c[o>>2]=(c[o>>2]|0)+n;n=a+36|0;c[n>>2]=(c[n>>2]|0)+f;i=h;return}f=(j|0)<0;n=j>>31;o=n+256&-256;p=f?0-j|0:j;j=n|1;n=ca(f?m:256-m|0,g-e|0)|0;f=(n|0)/(p|0)|0;q=(n|0)%(p|0)|0;if((q|0)<0){r=f+ -1|0;s=q+p|0}else{r=f;s=q}q=ca(r,o+m|0)|0;m=a+32|0;c[m>>2]=(c[m>>2]|0)+q;q=a+36|0;c[q>>2]=(c[q>>2]|0)+r;f=j+k|0;POa(a,f,b);k=r+e|0;if((f|0)==(l|0)){t=k}else{e=r+g-k<<8;r=(e|0)/(p|0)|0;n=(e|0)%(p|0)|0;if((n|0)<0){u=r+ -1|0;v=n+p|0}else{u=r;v=n}n=k;k=f;f=s-p|0;while(1){s=f+v|0;r=u+(s>>>31^1)|0;c[m>>2]=(c[m>>2]|0)+(r<<8);c[q>>2]=(c[q>>2]|0)+r;e=r+n|0;k=k+j|0;POa(a,k,b);if((k|0)==(l|0)){t=e;break}else{n=e;f=s-((s|0)>-1?p:0)|0}}}p=g-t|0;t=ca(p,d+256-o|0)|0;c[m>>2]=t+(c[m>>2]|0);c[q>>2]=(c[q>>2]|0)+p;i=h;return}function POa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;f=d-(c[a+16>>2]|0)|0;d=c[a+12>>2]|0;g=((d|0)<(b|0)?d:b)-(c[a+8>>2]|0)|0;b=(g|0)>-1?g:-1;if((b|0)==(c[a>>2]|0)?(g=a+4|0,(f|0)==(c[g>>2]|0)):0){h=g}else{if((c[a+40>>2]|0)==0){IOa(a)}c[a+32>>2]=0;c[a+36>>2]=0;h=a+4|0}c[a>>2]=b;c[h>>2]=f;if(!(f>>>0<(c[a+28>>2]|0)>>>0)){j=1;k=j&1;l=a+40|0;c[l>>2]=k;i=e;return}j=(b|0)>=(c[a+24>>2]|0);k=j&1;l=a+40|0;c[l>>2]=k;i=e;return}function QOa(a){a=a|0;var b=0,d=0;b=i;if((aPa(a)|0)==0){d=153}else{c[a+68>>2]=35;d=0}i=b;return d|0}function ROa(a){a=a|0;var b=0,d=0;b=i;d=a+28|0;a=c[d>>2]|0;if((a|0)==0){i=b;return}QPa(a);c[d>>2]=0;i=b;return}function SOa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=jEa(1278456,b)|0;if((e|0)==0){if((((a|0)!=0?(f=c[a+4>>2]|0,(f|0)!=0):0)?(g=gFa(f,1283992)|0,(g|0)!=0):0)?(f=c[(c[g>>2]|0)+20>>2]|0,(f|0)!=0):0){h=dd[c[f+16>>2]&511](a,b)|0}else{h=0}}else{h=e}i=d;return h|0}function TOa(e,f,g,h,j){e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0;k=i;i=i+112|0;l=k+100|0;m=k+104|0;n=k+96|0;o=k+92|0;p=k+88|0;q=k+84|0;r=k+80|0;s=k+76|0;t=k+72|0;u=k+4|0;v=k;w=hFa(c[(c[f+96>>2]|0)+4>>2]|0,1283992)|0;if((w|0)==0){x=11;i=k;return x|0}y=uFa(e,0)|0;if((y|0)!=0){x=y;i=k;return x|0}y=ed[c[w+4>>2]&127](e,f,g,h,j)|0;if((y|0)!=0){x=y;i=k;return x|0}y=c[f+148>>2]|0;if(!((y|0)==1953658213|(y|0)==131072|(y|0)==65536)){x=2;i=k;return x|0}y=f+504|0;if((id[c[y>>2]&511](f,1128678944,e,v)|0)!=142?(id[c[y>>2]&511](f,1819239265,e,v)|0)==142:0){x=2;i=k;return x|0}v=f+8|0;c[v>>2]=c[v>>2]|2048;if((g|0)<0){x=0;i=k;return x|0}z=ed[c[w+8>>2]&127](e,f,g,h,j)|0;if((z|0)!=0){x=z;i=k;return x|0}a:do{if((f|0)!=0){z=c[f+20>>2]|0;b:do{if((z|0)==0){A=13}else{j=0;while(1){if((R1a(z,1278320+(j*17|0)|0)|0)!=0){break b}j=j+1|0;if((j|0)>=8){A=13;break}}}}while(0);c:do{if((A|0)==13){z=u+0|0;j=z+68|0;do{c[z>>2]=0;z=z+4|0}while((z|0)<(j|0));z=f+152|0;j=b[z>>1]|0;d:do{if(j<<16>>16==0){B=0}else{h=f+156|0;g=f+104|0;w=j;C=0;D=0;E=1;while(1){F=c[h>>2]|0;G=c[F+(C<<4)>>2]|0;if((G|0)==1886545264){H=D;I=2;A=19}else if((G|0)==1718642541){H=D;I=1;A=19}else if((G|0)==1668707360){H=1;I=0;A=19}else{J=w;K=D}if((A|0)==19){A=0;G=F;F=0;L=0;while(1){if((c[G+(C<<4)+12>>2]|0)==(c[1277912+(L*24|0)+(I<<3)+4>>2]|0)){do{if((F|0)==0){M=c[y>>2]|0;if((M|0)==0){N=0;break}if((id[M&511](f,c[G+(C<<4)>>2]|0,c[g>>2]|0,0)|0)!=0){N=0;break}M=c[g>>2]|0;O=c[(c[h>>2]|0)+(C<<4)+12>>2]|0;if((CFa(M,O)|0)!=0){N=0;break}if(O>>>0>3){P=O;Q=0;while(1){R=(IFa(M)|0)+Q|0;S=P+ -4|0;if(S>>>0>3){P=S;Q=R}else{T=S;U=R;break}}}else{T=O;U=0}if((T|0)==0){V=U}else{Q=T;P=U;R=3;while(1){S=(((GFa(M)|0)&255)<<(R<<3))+P|0;Q=Q+ -1|0;if((Q|0)==0){V=S;break}else{P=S;R=R+ -1|0}}}FFa(M);N=V}else{N=F}}while(0);R=u+(L<<2)|0;P=c[R>>2]|0;if((c[1277912+(L*24|0)+(I<<3)>>2]|0)==(N|0)){Q=P+1|0;c[R>>2]=Q;W=Q}else{W=P}if((W|0)==3){break c}else{X=N}}else{X=F}P=L+1|0;if((P|0)>=17){break}G=c[h>>2]|0;F=X;L=P}J=b[z>>1]|0;K=H}if(!((E&65535)<(J&65535))){B=K;break d}w=J;C=E&65535;D=K;E=E+1<<16>>16}}}while(0);z=B<<24>>24!=0;j=0;while(1){E=u+(j<<2)|0;D=c[E>>2]|0;if(z|j>>>0<5){Y=D}else{C=D+1|0;c[E>>2]=C;Y=C}j=j+1|0;if((Y|0)==3){break c}if((j|0)>=17){break a}}}}while(0);c[v>>2]=c[v>>2]|8192}}while(0);Y=e+28|0;u=c[Y>>2]|0;B=id[c[y>>2]&511](f,1751412088,e,t)|0;c[s>>2]=B;do{if((B|0)==0?(K=c[t>>2]|0,!(K>>>0<8)):0){J=f+692|0;H=BFa(e,K,J)|0;c[s>>2]=H;if((H|0)!=0){x=H;i=k;return x|0}H=c[J>>2]|0;K=H+(c[t>>2]|0)|0;X=d[H+2>>0]<<8|d[H+3>>0];N=d[H+5>>0]<<16|d[H+4>>0]<<24|d[H+6>>0]<<8|d[H+7>>0];W=N>>>0>4294901759?N&65535:N;if(!((X>>>0>255?1:(d[H>>0]<<8|d[H+1>>0]|0)!=0)|W>>>0>65537)){N=f+708|0;c[N>>2]=dEa(u,1,0,X,0,s)|0;I=c[s>>2]|0;if((I|0)==0){e:do{if((X|0)==0){Z=0}else{V=0;U=H+8|0;while(1){T=U;U=U+W|0;if(U>>>0>K>>>0){Z=V;break e}a[(c[N>>2]|0)+V>>0]=a[T>>0]|0;T=V+1|0;if(!(T>>>0<X>>>0)){Z=T;break}else{V=T}}}}while(0);c[f+700>>2]=Z;c[f+696>>2]=c[t>>2];c[f+704>>2]=W;break}else{_=I}}else{c[s>>2]=3;_=3}DFa(e,J);c[f+696>>2]=0;if((_|0)!=0){x=_;i=k;return x|0}}}while(0);f:do{if((c[v>>2]&1|0)!=0){_=f+128|0;do{if((c[(c[_>>2]|0)+48>>2]|0)==0){s=f+664|0;t=id[c[y>>2]&511](f,1735162214,e,s)|0;if((t&255|0)!=142){if((t|0)!=0){$=t;break}}else{c[s>>2]=0}if((id[c[y>>2]&511](f,1819239265,e,r)|0)==0){s=c[r>>2]|0;if((b[f+210>>1]|0)==0){if(s>>>0>131071){$=8;break}c[f+684>>2]=s>>>1}else{if(s>>>0>262143){$=8;break}c[f+684>>2]=s>>>2}t=BFa(e,s,f+688|0)|0;if((t|0)==0){A=67}else{$=t}}else{$=144}}else{A=67}}while(0);do{if((A|0)==67){J=c[Y>>2]|0;I=id[c[y>>2]&511](f,1668707360,e,q)|0;c[p>>2]=I;if((I|0)==0){I=(c[q>>2]|0)>>>1;W=f+640|0;c[W>>2]=I;t=f+644|0;c[t>>2]=dEa(J,2,0,I,0,p)|0;I=c[p>>2]|0;if((I|0)!=0){$=I;break}I=CFa(e,c[W>>2]<<1)|0;c[p>>2]=I;if((I|0)!=0){$=I;break}I=c[t>>2]|0;t=c[W>>2]|0;W=I+(t<<1)|0;if((t|0)>0){t=I;do{b[t>>1]=HFa(e)|0;t=t+2|0}while(t>>>0<W>>>0);aa=c[p>>2]|0}else{aa=0}FFa(e);if((aa|0)!=0){$=aa;break}}else{c[f+640>>2]=0;c[f+644>>2]=0}if((id[c[y>>2]&511](f,1718642541,e,o)|0)==0){W=c[o>>2]|0;c[f+624>>2]=W;t=BFa(e,W,f+628|0)|0;if((t|0)!=0){$=t;break}}else{c[f+628>>2]=0;c[f+624>>2]=0}if((id[c[y>>2]&511](f,1886545264,e,n)|0)==0){t=c[n>>2]|0;c[f+632>>2]=t;$=BFa(e,t,f+636|0)|0;break}else{c[f+636>>2]=0;c[f+632>>2]=0;$=0;break}}}while(0);if((((c[(c[_>>2]|0)+48>>2]|0)==0?(c[f+28>>2]|0)!=0:0)?(c[f+688>>2]|0)!=0:0)?(t=f+684|0,(c[t>>2]|0)!=0):0){W=0;I=0;J=0;while(1){YPa(f,J,l)|0;if((c[l>>2]|0)!=0){s=W+1|0;if(s>>>0>1){ba=$;break f}else{ca=s;da=J}}else{ca=W;da=I}J=J+1|0;if(!(J>>>0<(c[t>>2]|0)>>>0)){break}else{W=ca;I=da}}if((ca|0)==1){if((da|0)!=0){I=(_Ea(f,da,m,8)|0)==0;if(!(I&(a[m>>0]|0)==46)){ba=$;break}if((S2a(m,1278688,8)|0)!=0){ba=$;break}}c[v>>2]=c[v>>2]&-2;ba=$}else{ba=$}}else{ba=$}}else{ba=0}}while(0);c[f+508>>2]=304;c[f+516>>2]=230;c[f+520>>2]=231;c[f+524>>2]=232;c[f+512>>2]=578;x=ba;i=k;return x|0}function UOa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;if((a|0)==0){i=b;return}d=c[a+100>>2]|0;e=a+104|0;f=c[e>>2]|0;g=c[a+528>>2]|0;h=a+652|0;j=c[h+4>>2]|0;if((j|0)!=0){Rc[j&1023](c[h>>2]|0)}if((g|0)!=0){Rc[c[g+12>>2]&1023](a)}DFa(c[e>>2]|0,a+688|0);c[a+684>>2]=0;g=c[e>>2]|0;e=a+708|0;aEa(c[g+28>>2]|0,c[e>>2]|0);c[e>>2]=0;DFa(g,a+692|0);g=a+644|0;aEa(d,c[g>>2]|0);c[g>>2]=0;c[a+640>>2]=0;DFa(f,a+628|0);DFa(f,a+636|0);c[a+624>>2]=0;c[a+632>>2]=0;i=b;return}function VOa(b){b=b|0;a[b+300>>0]=0;a[b+301>>0]=0;a[b+108>>0]=0;c[b+112>>2]=-1;return 0}function WOa(b){b=b|0;var c=0;c=i;if((a[b+300>>0]|0)!=0){RPa(b)}a[b+108>>0]=0;i=c;return}function XOa(a){a=a|0;var b=0,d=0;b=i;d=cEa(c[c[a+156>>2]>>2]|0)|0;i=b;return d|0}function YOa(f,g,h,j){f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0;k=i;i=i+256|0;l=k+232|0;m=k+216|0;n=k+208|0;o=k;p=c[f+4>>2]|0;if((f|0)==0){q=37;i=k;return q|0}if((g|0)==0){q=36;i=k;return q|0}if((p|0)==0){q=6;i=k;return q|0}if(!((c[p+16>>2]|0)>>>0>h>>>0)?(c[(c[p+128>>2]|0)+48>>2]|0)==0:0){q=6;i=k;return q|0}if((j&2|0)==0){r=j}else{s=(c[p+8>>2]&8192|0)==0?j:j&-3;r=s>>>14&2|s}if((r&1025|0)==0){t=r}else{t=(c[p+8>>2]|0)>>>12&2^11|r}r=(t&1|0)!=0;if(!r?(a[g+108>>0]|0)==0:0){q=36;i=k;return q|0}if((t&16384|0)!=0){q=6;i=k;return q|0}s=t&128;j=c[p+104>>2]|0;f3a(o|0,0,208)|0;u=(t&2|0)==0;if(u){v=g+301|0;if((a[v>>0]|0)==0){w=g+300|0;a:do{if((a[w>>0]|0)==0){x=c[g>>2]|0;y=c[x+100>>2]|0;z=x+260|0;a[w>>0]=1;a[v>>0]=0;A=e[z+20>>1]|0;c[g+120>>2]=A;B=g+132|0;c[B>>2]=e[z+22>>1]|0;c[g+116>>2]=0;c[g+128>>2]=0;c[g+140>>2]=0;c[g+144>>2]=0;C=g+240|0;c[C>>2]=c[x+640>>2];D=g+248|0;b[D>>1]=b[z+18>>1]|0;E=g+72|0;a[E+37>>0]=0;a[E+38>>0]=0;E=g+92|0;c[E+0>>2]=0;c[E+4>>2]=0;c[E+8>>2]=0;c[E+12>>2]=0;c[g+124>>2]=dEa(y,24,0,A,0,n)|0;A=c[n>>2]|0;do{if((A|0)==0){c[g+136>>2]=dEa(y,24,0,c[B>>2]|0,0,n)|0;E=c[n>>2]|0;if((E|0)==0){c[g+244>>2]=dEa(y,4,0,c[C>>2]|0,0,n)|0;F=c[n>>2]|0;if((F|0)==0){c[g+252>>2]=dEa(y,4,0,e[D>>1]|0,0,n)|0;G=c[n>>2]|0;if((G|0)==0){H=(e[z+16>>1]|0)+4|0;I=H&65535;J=g+256|0;K=J+0|0;L=K+36|0;do{c[K>>2]=0;K=K+4|0}while((K|0)<(L|0));c[J>>2]=y;M=H&65535;c[J+12>>2]=dEa(y,8,0,M,0,l)|0;N=c[l>>2]|0;do{if((N|0)==0){c[J+16>>2]=dEa(y,8,0,M,0,l)|0;O=c[l>>2]|0;if((O|0)!=0){P=O;Q=26;break}c[J+20>>2]=dEa(y,8,0,M,0,l)|0;O=c[l>>2]|0;if((O|0)!=0){P=O;Q=26;break}c[J+24>>2]=dEa(y,1,0,M,0,l)|0;O=c[l>>2]|0;if((O|0)!=0){P=O;Q=26;break}c[J+28>>2]=dEa(y,2,0,0,0,l)|0;O=c[l>>2]|0;if((O|0)!=0){P=O;Q=26;break}b[J+4>>1]=I;b[J+6>>1]=0;c[n>>2]=0}else{P=N;Q=26}}while(0);if((Q|0)==26?(SPa(J),c[n>>2]=P,(P|0)!=0):0){R=P;break}b[J+8>>1]=I;K=g+172|0;S=1277328|0;L=K+68|0;do{c[K>>2]=c[S>>2];K=K+4|0;S=S+4|0}while((K|0)<(L|0));I=c[(c[(c[x+96>>2]|0)+4>>2]|0)+172>>2]|0;c[x+648>>2]=(I|0)==0?233:I;I=c[g>>2]|0;if((a[g+292>>0]|0)==0){T=(c[I+96>>2]|0)+28|0}else{T=g+296|0}J=c[T>>2]|0;do{if((J|0)==0){U=153}else{eQa(J,I,g);c[J+428>>2]=0;c[J+16>>2]=0;c[J+476>>2]=64;c[J+480>>2]=0;c[J+484>>2]=0;a[J+488>>0]=0;c[J+564>>2]=16384;a[J+561>>0]=s;N=J+216|0;b[J+252>>1]=0;c[J+260>>2]=0;M=J+256|0;b[N+0>>1]=0;b[N+2>>1]=0;b[N+4>>1]=0;b[N+6>>1]=0;b[N+8>>1]=0;b[N+10>>1]=0;c[M>>2]=65536;M=c[I+628>>2]|0;N=I+624|0;H=c[N>>2]|0;c[J+444>>2]=M;c[J+448>>2]=H;O=J+452|0;c[O+0>>2]=0;c[O+4>>2]=0;c[O+8>>2]=0;c[O+12>>2]=0;if((c[N>>2]|0)!=0?(c[J+356>>2]=M,c[J+364>>2]=H,c[J+360>>2]=0,c[J+352>>2]=1,H=Lc[c[I+648>>2]&255](J)|0,(H|0)!=0):0){U=H;break}gQa(J,g);c[n>>2]=0;break a}}while(0);c[n>>2]=U;RPa(g);break a}else{R=G}}else{R=F}}else{R=E}}else{R=A}}while(0);RPa(g);if((R|0)!=0){q=R;i=k;return q|0}}}while(0);if((a[v>>0]|0)==0){R=g+240|0;if((c[R>>2]|0)!=0){U=(c[g>>2]|0)+644|0;n=g+88|0;T=g+244|0;P=0;do{w=SDa(b[(c[U>>2]|0)+(P<<1)>>1]|0,c[n>>2]|0)|0;c[(c[T>>2]|0)+(P<<2)>>2]=w;P=P+1|0}while(P>>>0<(c[R>>2]|0)>>>0)}R=g+264|0;if((b[R>>1]|0)!=0){P=g+268|0;T=g+272|0;n=0;do{c[(c[P>>2]|0)+(n<<3)>>2]=0;c[(c[P>>2]|0)+(n<<3)+4>>2]=0;c[(c[T>>2]|0)+(n<<3)>>2]=0;c[(c[T>>2]|0)+(n<<3)+4>>2]=0;n=n+1|0}while(n>>>0<(e[R>>1]|0)>>>0)}R=g+248|0;if((b[R>>1]|0)!=0){n=g+252|0;T=0;do{c[(c[n>>2]|0)+(T<<2)>>2]=0;T=T+1|0}while(T>>>0<(e[R>>1]|0)>>>0)}K=g+172|0;S=1277328|0;L=K+68|0;do{c[K>>2]=c[S>>2];K=K+4|0;S=S+4|0}while((K|0)<(L|0));fQa(g,s);a[v>>0]=1}}if((a[g+292>>0]|0)==0){V=(c[p+96>>2]|0)+28|0}else{V=g+296|0}v=c[V>>2]|0;if((v|0)==0){q=153;i=k;return q|0}V=(t&983040|0)!=131072;eQa(v,p,g);R=v+604|0;if((V&1|0)!=(d[R>>0]|0)){a[R>>0]=V&1;V=g+240|0;if((c[V>>2]|0)!=0){R=p+644|0;T=g+88|0;n=g+244|0;P=0;do{U=SDa(b[(c[R>>2]|0)+(P<<1)>>1]|0,c[T>>2]|0)|0;c[(c[n>>2]|0)+(P<<2)>>2]=U;P=P+1|0}while(P>>>0<(c[V>>2]|0)>>>0)}fQa(g,s)}V=a[v+336>>0]|0;P=(V&1)<<1|t;if(!((V&2)==0)){K=v+284|0;S=1277328|0;L=K+68|0;do{c[K>>2]=c[S>>2];K=K+4|0;S=S+4|0}while((K|0)<(L|0))}a[v+561>>0]=s;c[o+160>>2]=v;c[o+164>>2]=c[v+392>>2];W=P}else{W=t}do{if((c[(c[p+128>>2]|0)+48>>2]|0)==0){t=id[c[p+504>>2]&511](p,1735162214,j,0)|0;if((t&255|0)==142){c[o+84>>2]=0;break}if((t|0)==0){c[o+84>>2]=zFa(c[j+8>>2]|0)|0;break}else{q=t;i=k;return q|0}}else{c[o+84>>2]=0}}while(0);t=c[c[f+156>>2]>>2]|0;_Da(t);P=o+12|0;c[P>>2]=t;t=o+16|0;c[t>>2]=W;c[o>>2]=p;p=o+4|0;c[p>>2]=g;W=o+8|0;c[W>>2]=f;c[o+24>>2]=j;j=f+72|0;c[j>>2]=1869968492;v=f+128|0;c[v>>2]=0;s=f+108|0;S=f+124|0;c[S>>2]=0;K=_Pa(o,h,0)|0;b:do{if((K|0)==0){L=c[P>>2]|0;if((c[j>>2]|0)!=1668246896){V=L+20|0;c[s+0>>2]=c[V+0>>2];c[s+4>>2]=c[V+4>>2];c[s+8>>2]=c[V+8>>2];c[s+12>>2]=c[V+12>>2];c[s+16>>2]=c[V+16>>2];c[S>>2]=c[S>>2]&-513;V=c[o+68>>2]|0;if((V|0)!=0){xEa(s,0-V|0,0)}}else{c[v>>2]=c[L+48>>2];c[f+132>>2]=c[L+52>>2]}do{if(u){L=c[o+160>>2]|0;if((a[L+337>>0]|0)==0){c[S>>2]=c[S>>2]|8;break}V=c[L+340>>2]|0;if((V|0)==0){c[S>>2]=c[S>>2]|32;break}else if((V|0)==1){break}else if((V|0)==4){c[S>>2]=c[S>>2]|48;break}else if((V|0)==5){c[S>>2]=c[S>>2]|16;break}else{c[S>>2]=c[S>>2]|8;break}}}while(0);V=c[o>>2]|0;L=c[W>>2]|0;n=c[p>>2]|0;if((c[t>>2]&1|0)==0){X=c[n+20>>2]|0}else{X=65536}if((c[L+72>>2]|0)==1668246896){T=o+36|0;c[l+0>>2]=c[T+0>>2];c[l+4>>2]=c[T+4>>2];c[l+8>>2]=c[T+8>>2];c[l+12>>2]=c[T+12>>2]}else{qFa(L+108|0,l)}c[L+56>>2]=c[o+60>>2];T=L+32|0;c[T>>2]=c[l>>2];R=l+12|0;c[L+36>>2]=c[R>>2];U=L+40|0;c[U>>2]=(c[o+76>>2]|0)-(c[o+68>>2]|0);c:do{if(((c[V+476>>2]|0)==0?(c[t>>2]&2|0)==0:0)?(w=e[n+12>>1]|0,A=c[V+704>>2]|0,x=c[V+692>>2]|0,y=c[V+700>>2]|0,(y|0)!=0):0){z=c[V+708>>2]|0;D=0;while(1){C=D+1|0;if((d[z+D>>0]|0)==(w|0)){break}if(C>>>0<y>>>0){D=C}else{break c}}if(!((h+2|0)>>>0<A>>>0)){break}y=x+(h+10+(ca(D,A)|0))|0;if((y|0)==0){break}c[U>>2]=d[y>>0]<<6}}while(0);c[L+24>>2]=(c[l+8>>2]|0)-(c[l>>2]|0);n=l+4|0;c[L+28>>2]=(c[R>>2]|0)-(c[n>>2]|0);do{if((a[V+292>>0]|0)!=0?(b[V+330>>1]|0)!=0:0){y=c[o+188>>2]|0;w=(TDa(y-(c[R>>2]|0)|0,X)|0)<<16>>16;z=c[o+196>>2]|0;if((y|0)<=(z|0)){Y=0;Z=w;break}Y=(TDa(y-z|0,X)|0)&65535;Z=w}else{Q=96}}while(0);if((Q|0)==96){w=(TDa((c[R>>2]|0)-(c[n>>2]|0)|0,X)|0)<<16>>16;z=V+364|0;if((b[z>>1]|0)==-1){y=V+216|0;_=(b[y+4>>1]|0)-(b[y+6>>1]|0)|0}else{_=(b[z+70>>1]|0)-(b[z+72>>1]|0)|0}Y=_;Z=(_-w|0)/2|0}w=c[(c[V+128>>2]|0)+48>>2]|0;do{if((w|0)==0){$=Y;aa=Z}else{if((c[(c[w>>2]|0)+8>>2]|0)==0){$=Y;aa=Z;break}c[m>>2]=0;z=m+4|0;c[z>>2]=Z;y=m+8|0;c[y>>2]=Y;if((id[c[(c[w>>2]|0)+8>>2]&511](c[w+4>>2]|0,h,1,m)|0)!=0){break b}$=c[y>>2]|0;aa=c[z>>2]|0}}while(0);c[L+60>>2]=$;if((c[t>>2]&1|0)==0){w=SDa(aa,X)|0;ba=SDa($,X)|0;da=w}else{ba=$;da=aa}c[L+44>>2]=(c[T>>2]|0)-((c[U>>2]|0)/2|0);c[L+48>>2]=da;c[L+52>>2]=ba}}while(0);if(r){q=K;i=k;return q|0}if((e[g+14>>1]|0)>=24){q=K;i=k;return q|0}c[S>>2]=c[S>>2]|256;q=K;i=k;return q|0}function ZOa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;g=c[a+528>>2]|0;c[e>>2]=0;c[e+4>>2]=0;if((g|0)==0){i=f;return 0}c[e>>2]=Qc[c[g+84>>2]&255](a,b,d)|0;i=f;return 0}function _Oa(a,b,d,f,g){a=a|0;b=b|0;d=d|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0;h=i;i=i+16|0;j=h+6|0;k=h+4|0;l=h+2|0;m=h;n=(d|0)==0;if((f&16|0)!=0){if(n){i=h;return 0}else{o=0}do{ZPa(a,o+b|0,j,k);c[g+(o<<2)>>2]=e[k>>1]|0;o=o+1|0}while((o|0)!=(d|0));i=h;return 0}if(n){i=h;return 0}n=a+528|0;o=0;do{ed[c[(c[n>>2]|0)+112>>2]&127](a,0,o+b|0,l,m)|0;c[g+(o<<2)>>2]=e[m>>1]|0;o=o+1|0}while((o|0)!=(d|0));i=h;return 0}function $Oa(d,f){d=d|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=i;PEa(c[d>>2]|0,f);f=c[d>>2]|0;if((c[f+8>>2]&1|0)==0){h=0;i=g;return h|0}j=d+72|0;k=d+108|0;a[k>>0]=0;l=d+44|0;m=d+12|0;c[l+0>>2]=c[m+0>>2];c[l+4>>2]=c[m+4>>2];c[l+8>>2]=c[m+8>>2];c[l+12>>2]=c[m+12>>2];c[l+16>>2]=c[m+16>>2];c[l+20>>2]=c[m+20>>2];c[l+24>>2]=c[m+24>>2];n=b[l>>1]|0;o=n&65535;if(!(n<<16>>16==0)?(p=b[d+46>>1]|0,!(p<<16>>16==0)):0){if(!((b[f+176>>1]&8)==0)){q=f+68|0;r=TDa(o<<6,e[q>>1]|0)|0;c[d+48>>2]=r;s=TDa((p&65535)<<6,e[q>>1]|0)|0;c[d+52>>2]=s;c[d+56>>2]=(SDa(b[f+70>>1]|0,s)|0)+32&-64;c[d+60>>2]=(SDa(b[f+72>>1]|0,s)|0)+32&-64;c[d+64>>2]=(SDa(b[f+74>>1]|0,s)|0)+32&-64;c[d+68>>2]=(SDa(b[f+76>>1]|0,r)|0)+32&-64}if((n&65535)<(p&65535)){c[d+88>>2]=c[d+52>>2];b[d+80>>1]=p;c[j>>2]=TDa(o,p&65535)|0;c[d+76>>2]=65536}else{c[d+88>>2]=c[d+48>>2];b[d+80>>1]=n;c[j>>2]=65536;c[d+76>>2]=TDa(p&65535,o)|0}a[d+301>>0]=0;a[k>>0]=1;t=0}else{t=151}c[m+0>>2]=c[l+0>>2];c[m+4>>2]=c[l+4>>2];c[m+8>>2]=c[l+8>>2];c[m+12>>2]=c[l+12>>2];c[m+16>>2]=c[l+16>>2];c[m+20>>2]=c[l+20>>2];c[m+24>>2]=c[l+24>>2];h=t;i=g;return h|0}function aPa(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+16|0;e=d+4|0;f=d;g=c[a+8>>2]|0;h=a+28|0;a=c[h>>2]|0;if((a|0)!=0){j=a;i=d;return j|0}a=ZDa(g,608,f)|0;if((c[f>>2]|0)!=0){j=0;i=d;return j|0}c[a+8>>2]=g;c[a+432>>2]=32;c[a+436>>2]=dEa(g,20,0,32,0,e)|0;g=c[e>>2]|0;if((g|0)==0){b[a+440>>1]=0;b[a+442>>1]=0;c[a+20>>2]=0;c[a+388>>2]=0;c[a+24>>2]=0;c[a+392>>2]=0;c[a>>2]=0;c[a+4>>2]=0;c[f>>2]=0;c[h>>2]=a;j=a;i=d;return j|0}else{QPa(a);c[f>>2]=g;j=0;i=d;return j|0}return 0}function bPa(f){f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Oc=0,Pc=0,Rc=0,Sc=0,Tc=0,Uc=0,Vc=0,Wc=0,Xc=0,Yc=0,Zc=0,_c=0,$c=0,ad=0,bd=0,cd=0,ed=0,fd=0,gd=0,hd=0,id=0,jd=0,kd=0,md=0,nd=0,od=0,qd=0,rd=0,sd=0,td=0,ud=0,vd=0,wd=0,xd=0,yd=0,zd=0,Ad=0,Bd=0,Cd=0,Dd=0,Ed=0,Fd=0,Gd=0,Hd=0,Id=0;g=i;i=i+160|0;h=g+112|0;j=g+152|0;k=g+108|0;l=g+104|0;m=g+68|0;n=g+150|0;o=g+64|0;p=g+60|0;q=g+24|0;r=g+148|0;s=g+20|0;t=g+16|0;u=g;c[f+256>>2]=0;v=f+592|0;if((b[f+216>>1]|0)==(b[f+218>>1]|0)){c[v>>2]=291;c[f+596>>2]=213;c[f+600>>2]=214}else{c[v>>2]=290;c[f+596>>2]=211;c[f+600>>2]=212}iPa(f);w=f+312|0;switch(c[w>>2]&255|0){case 0:{x=f+568|0;c[x>>2]=230;y=x;break};case 5:{x=f+568|0;c[x>>2]=226;y=x;break};case 3:{x=f+568|0;c[x>>2]=229;y=x;break};case 6:{x=f+568|0;c[x>>2]=232;y=x;break};case 4:{x=f+568|0;c[x>>2]=228;y=x;break};case 7:{x=f+568|0;c[x>>2]=233;y=x;break};case 1:{x=f+568|0;c[x>>2]=227;y=x;break};case 2:{x=f+568|0;c[x>>2]=231;y=x;break};default:{y=f+568|0}}x=f+360|0;z=f+356|0;A=f+368|0;B=f+372|0;C=f+364|0;D=f+16|0;E=f+28|0;F=f+561|0;G=f+24|0;H=f+32|0;I=f+20|0;J=f+376|0;K=f+12|0;L=f+308|0;M=f+320|0;N=f+72|0;O=f+80|0;P=f+380|0;Q=f+284|0;R=f+44|0;S=f+328|0;T=f+324|0;U=f+346|0;V=f+48|0;W=f+298|0;X=f+84|0;Y=f+300|0;Z=f+88|0;_=f+576|0;$=f+572|0;aa=f+52|0;ba=f+316|0;da=f+584|0;ea=f+344|0;fa=f+286|0;ga=f+288|0;ha=f+92|0;ia=f+56|0;ja=f+220|0;ka=f+224|0;la=f+488|0;ma=f+416|0;na=f+408|0;oa=f+428|0;pa=f+432|0;qa=f+436|0;ra=f+352|0;sa=f+294|0;ta=f+296|0;ua=f+290|0;va=f+292|0;wa=f+294|0;xa=f+290|0;ya=f+298|0;za=f+116|0;Aa=f+132|0;Ba=f+124|0;Ca=f+36|0;Da=f+180|0;Ea=f+144|0;Fa=f+108|0;Ga=f+348|0;Ha=f+304|0;Ia=f+260|0;Ja=f+60|0;Ka=f+420|0;La=f+404|0;Ma=f+396|0;Na=f+400|0;Oa=f+264|0;Pa=f+154|0;Qa=f+156|0;Ra=f+160|0;Sa=u+4|0;Ta=f+164|0;Ua=u+8|0;Va=f+152|0;Wa=u+12|0;Xa=f+172|0;Ya=f+176|0;Za=f+168|0;_a=m+16|0;$a=f+136|0;ab=f+140|0;bb=f+118|0;cb=h+16|0;db=f+120|0;eb=f+128|0;fb=f+588|0;gb=f+468|0;hb=f+472|0;ib=f+596|0;jb=f+332|0;kb=f+334|0;lb=f+384|0;mb=f+600|0;nb=f+282|0;ob=f+337|0;pb=f+281|0;qb=f+252|0;rb=f+604|0;sb=f+412|0;tb=f+424|0;ub=f+340|0;vb=f+336|0;wb=c[x>>2]|0;xb=0;a:while(1){yb=c[z>>2]|0;zb=a[yb+wb>>0]|0;a[A>>0]=zb;Ab=zb&255;Bb=a[1277400+Ab>>0]|0;c[B>>2]=Bb;if((Ab&254|0)==64){Cb=wb+1|0;Db=c[C>>2]|0;if((Cb|0)>=(Db|0)){Eb=626;break}Fb=2-(ca(d[yb+Cb>>0]|0,Bb)|0)|0;c[B>>2]=Fb;Gb=Fb;Hb=Db}else{Gb=Bb;Hb=c[C>>2]|0}if((Gb+wb|0)>(Hb|0)){Eb=626;break}Bb=a[1277656+Ab>>0]|0;Ab=(c[D>>2]|0)-((Bb&255)>>>4)|0;c[E>>2]=Ab;if((Ab|0)<0){if((a[F>>0]|0)!=0){Eb=23;break}if((Bb&255)>15){Db=0;Fb=0;do{c[(c[G>>2]|0)+(Db<<2)>>2]=0;Fb=Fb+1<<16>>16;Db=Fb&65535;Cb=a[A>>0]|0;yb=a[1277656+(Cb&255)>>0]|0}while(Db>>>0<(yb&255)>>>4>>>0);Ib=yb;Jb=Cb}else{Ib=Bb;Jb=zb}c[E>>2]=0;Kb=Jb;Lb=Ib;Mb=0}else{Kb=zb;Lb=Bb;Mb=Ab}Db=Kb&255;Fb=(Lb&15)+Mb|0;c[H>>2]=Fb;Cb=c[I>>2]|0;if(Fb>>>0>Cb>>>0){Eb=27;break}a[J>>0]=1;c[K>>2]=0;yb=c[G>>2]|0;Nb=yb+(Mb<<2)|0;b:do{switch(Db|0){case 21:{Ob=c[Nb>>2]|0;if((Ob|0)==0){Pb=Fa+0|0;Qb=Da+0|0;Rb=Pb+36|0;do{c[Pb>>2]=c[Qb>>2];Pb=Pb+4|0;Qb=Qb+4|0}while((Pb|0)<(Rb|0))}else if((Ob|0)!=1){if((a[F>>0]|0)==0){Eb=609;break b}else{Eb=72;break a}}else{Pb=Fa+0|0;Qb=Ea+0|0;Rb=Pb+36|0;do{c[Pb>>2]=c[Qb>>2];Pb=Pb+4|0;Qb=Qb+4|0}while((Pb|0)<(Rb|0))}b[Ga>>1]=c[Nb>>2];Eb=609;break};case 24:{c[w>>2]=1;c[y>>2]=227;Eb=609;break};case 25:{c[w>>2]=0;c[y>>2]=230;Eb=609;break};case 26:{c[L>>2]=c[Nb>>2];Eb=609;break};case 27:{Ob=1;while(1){if((APa(f)|0)<<24>>24==1){Eb=609;break b}Sb=d[A>>0]|0;if((Sb|0)==88){Tb=Ob+1|0}else if((Sb|0)==89){Tb=Ob+ -1|0}else{Tb=Ob}if((Tb|0)==0){Eb=609;break}else{Ob=Tb}}break};case 5:case 4:case 3:case 2:case 1:case 0:{Ob=Db<<14&16384;Sb=Ob&65535;Ub=(Ob^16384)&65535;if((Kb&255)<4){b[sa>>1]=Sb;b[ta>>1]=Ub;b[ua>>1]=Sb;b[va>>1]=Ub}if((Db&2|0)==0){b[W>>1]=Sb;b[Y>>1]=Ub}iPa(f);Eb=609;break};case 11:{kPa(c[Nb>>2]<<16>>16,c[yb+(Mb+1<<2)>>2]<<16>>16,ya);iPa(f);Eb=609;break};case 15:{Ub=c[Nb>>2]|0;Sb=c[yb+(Mb+1<<2)>>2]|0;Ob=c[yb+(Mb+2<<2)>>2]|0;Vb=c[yb+(Mb+3<<2)>>2]&65535;Wb=e[R>>1]|0;if((((Vb>>>0<Wb>>>0?(Xb=c[yb+(Mb+4<<2)>>2]&65535,Xb>>>0<Wb>>>0):0)?(Wb=Sb&65535,Sb=e[O>>1]|0,Wb>>>0<Sb>>>0):0)?(Yb=Ob&65535,Yb>>>0<Sb>>>0):0)?(Sb=Ub&65535,Sb>>>0<(e[za>>1]|0)>>>0):0){Ub=c[aa>>2]|0;Ob=c[Ub+(Vb<<3)>>2]|0;Zb=(c[Ub+(Xb<<3)>>2]|0)-Ob|0;_b=c[Ub+(Vb<<3)+4>>2]|0;$b=(c[Ub+(Xb<<3)+4>>2]|0)-_b|0;Ub=c[Z>>2]|0;ac=c[Ub+(Wb<<3)>>2]|0;bc=(c[Ub+(Yb<<3)>>2]|0)-ac|0;cc=c[Ub+(Wb<<3)+4>>2]|0;dc=(c[Ub+(Yb<<3)+4>>2]|0)-cc|0;Ub=(c[Aa>>2]|0)+Sb|0;a[Ub>>0]=d[Ub>>0]|24;Ub=0-$b|0;ec=ODa(bc,Ub,64)|0;fc=(ODa(dc,Zb,64)|0)+ec|0;ec=ODa(bc,Zb,64)|0;gc=(ODa(dc,$b,64)|0)+ec|0;if((((fc|0)<0?0-fc|0:fc)*19|0)>(((gc|0)<0?0-gc|0:gc)|0)){gc=ODa(Ob-ac|0,Ub,64)|0;Ub=(ODa(_b-cc|0,Zb,64)|0)+gc|0;gc=ODa(Ub,bc,fc)|0;bc=ODa(Ub,dc,fc)|0;c[(c[Ba>>2]|0)+(Sb<<3)>>2]=(c[(c[Z>>2]|0)+(Wb<<3)>>2]|0)+gc;c[(c[Ba>>2]|0)+(Sb<<3)+4>>2]=(c[(c[Z>>2]|0)+(Wb<<3)+4>>2]|0)+bc;Eb=609;break b}else{bc=c[Z>>2]|0;gc=c[aa>>2]|0;c[(c[Ba>>2]|0)+(Sb<<3)>>2]=((c[bc+(Yb<<3)>>2]|0)+(c[bc+(Wb<<3)>>2]|0)+(c[gc+(Vb<<3)>>2]|0)+(c[gc+(Xb<<3)>>2]|0)|0)/4|0;gc=c[Z>>2]|0;bc=c[aa>>2]|0;c[(c[Ba>>2]|0)+(Sb<<3)+4>>2]=((c[gc+(Yb<<3)+4>>2]|0)+(c[gc+(Wb<<3)+4>>2]|0)+(c[bc+(Vb<<3)+4>>2]|0)+(c[bc+(Xb<<3)+4>>2]|0)|0)/4|0;Eb=609;break b}}if((a[F>>0]|0)==0){Eb=609}else{Eb=49;break a}break};case 39:{Xb=c[Nb>>2]|0;bc=Xb&65535;Vb=c[yb+(Mb+1<<2)>>2]|0;Wb=Vb&65535;gc=Xb&65535;if(gc>>>0<(e[O>>1]|0)>>>0?(Xb=Vb&65535,Xb>>>0<(e[R>>1]|0)>>>0):0){Vb=c[aa>>2]|0;Yb=c[Z>>2]|0;Sb=(Qc[c[$>>2]&255](f,(c[Vb+(Xb<<3)>>2]|0)-(c[Yb+(gc<<3)>>2]|0)|0,(c[Vb+(Xb<<3)+4>>2]|0)-(c[Yb+(gc<<3)+4>>2]|0)|0)|0)/2|0;pd[c[da>>2]&127](f,N,bc,Sb);pd[c[da>>2]&127](f,Ca,Wb,0-Sb|0);Eb=609;break b}if((a[F>>0]|0)==0){Eb=609}else{Eb=117;break a}break};case 13:{c[Nb>>2]=b[W>>1]|0;c[yb+(Mb+1<<2)>>2]=b[Y>>1]|0;Eb=609;break};case 29:{c[M>>2]=c[Nb>>2];Eb=609;break};case 16:{b[Q>>1]=c[Nb>>2];Eb=609;break};case 17:{b[fa>>1]=c[Nb>>2];Eb=609;break};case 28:{Sb=c[Nb>>2]|0;if((Sb|Mb|0)==0){c[K>>2]=132;hc=c[Nb>>2]|0}else{hc=Sb}Sb=(c[x>>2]|0)+hc|0;c[x>>2]=Sb;if((Sb|0)>=0){Wb=c[oa>>2]|0;if((Wb|0)>0?(Sb|0)>(c[(c[qa>>2]|0)+((Wb+ -1|0)*20|0)+16>>2]|0):0){Eb=96}}else{Eb=96}if((Eb|0)==96){Eb=0;c[K>>2]=132}a[J>>0]=0;Eb=609;break};case 20:{Wb=c[Nb>>2]|0;if((Wb|0)==0){Pb=N+0|0;Qb=Da+0|0;Rb=Pb+36|0;do{c[Pb>>2]=c[Qb>>2];Pb=Pb+4|0;Qb=Qb+4|0}while((Pb|0)<(Rb|0))}else if((Wb|0)!=1){if((a[F>>0]|0)==0){Eb=609;break b}else{Eb=66;break a}}else{Pb=N+0|0;Qb=Ea+0|0;Rb=Pb+36|0;do{c[Pb>>2]=c[Qb>>2];Pb=Pb+4|0;Qb=Qb+4|0}while((Pb|0)<(Rb|0))}b[U>>1]=c[Nb>>2];Eb=609;break};case 40:{nPa(f);Eb=609;break};case 49:case 48:{if((b[Pa>>1]|0)==0){Eb=609}else{Wb=c[Qa>>2]|0;if((Kb&1)==0){c[u>>2]=Wb+4;c[Sa>>2]=(c[Ra>>2]|0)+4;ic=16;jc=(c[Ta>>2]|0)+4|0}else{c[u>>2]=Wb;c[Sa>>2]=c[Ra>>2];ic=8;jc=c[Ta>>2]|0}c[Ua>>2]=jc;Wb=b[Va>>1]|0;c[Wa>>2]=Wb&65535;Sb=Wb;Wb=0;bc=0;while(1){gc=(e[(c[Xa>>2]|0)+(Wb<<16>>16<<1)>>1]|0)-(e[Ya>>1]|0)|0;Yb=Sb&65535;Xb=gc>>>0<Yb>>>0?gc:Yb+ -1|0;c:do{if(!(bc>>>0>Xb>>>0)){Yb=c[Za>>2]|0;gc=bc;while(1){kc=gc+1|0;if(!((a[Yb+gc>>0]&ic)<<24>>24==0)){lc=gc;break}if(kc>>>0>Xb>>>0){mc=kc;break c}else{gc=kc}}d:while(1){Yb=lc;while(1){nc=Yb+1|0;if(nc>>>0>Xb>>>0){break d}if((a[(c[Za>>2]|0)+nc>>0]&ic)<<24>>24==0){Yb=nc}else{break}}EPa(u,lc+1|0,Yb,lc,nc);lc=nc}if((lc|0)!=(gc|0)){EPa(u,lc+1&65535,Xb,lc,gc);if((gc|0)==0){mc=nc;break}EPa(u,bc,gc+ -1|0,lc,gc);mc=nc;break}Vb=c[Sa>>2]|0;fc=c[Vb+(gc<<3)>>2]|0;dc=c[(c[u>>2]|0)+(gc<<3)>>2]|0;Ub=fc-dc|0;if((fc|0)!=(dc|0)){if(bc>>>0<gc>>>0?(dc=Vb+(bc<<3)|0,c[dc>>2]=(c[dc>>2]|0)+Ub,dc=bc+1|0,(dc|0)!=(gc|0)):0){fc=dc;do{dc=Vb+(fc<<3)|0;c[dc>>2]=(c[dc>>2]|0)+Ub;fc=fc+1|0}while((fc|0)!=(gc|0))}if(!(kc>>>0>Xb>>>0)){gc=kc;do{fc=Vb+(gc<<3)|0;c[fc>>2]=(c[fc>>2]|0)+Ub;gc=gc+1|0}while(!(gc>>>0>Xb>>>0));mc=nc}else{mc=nc}}else{mc=nc}}else{mc=bc}}while(0);Xb=Wb+1<<16>>16;if(!(Xb<<16>>16<(b[Pa>>1]|0))){Eb=609;break b}Sb=b[Va>>1]|0;Wb=Xb;bc=mc}}break};case 47:case 46:{bc=c[Nb>>2]|0;Wb=bc&65535;Sb=bc&65535;if(!(Sb>>>0<(e[R>>1]|0)>>>0)){if((a[F>>0]|0)==0){Eb=609;break b}else{Eb=173;break a}}if((Kb&1)==0){oc=0}else{bc=c[aa>>2]|0;Xb=Qc[c[$>>2]&255](f,c[bc+(Sb<<3)>>2]|0,c[bc+(Sb<<3)+4>>2]|0)|0;oc=(Qc[c[y>>2]&255](f,Xb,c[Oa>>2]|0)|0)-Xb|0}pd[c[da>>2]&127](f,Ca,Wb,oc);b[Q>>1]=Wb;b[fa>>1]=Wb;Eb=609;break};case 36:{c[Nb>>2]=c[D>>2];Eb=609;break};case 37:{Wb=c[Nb>>2]|0;if(!((Wb|0)<1|(Wb|0)>(Mb|0))){c[Nb>>2]=c[yb+(Mb-Wb<<2)>>2];Eb=609;break b}if((a[F>>0]|0)!=0){c[K>>2]=134}c[Nb>>2]=0;Eb=609;break};case 38:{Wb=c[Nb>>2]|0;if((Wb|0)<1|(Wb|0)>(Mb|0)){if((a[F>>0]|0)==0){Eb=609;break b}else{Eb=112;break a}}else{Xb=Mb-Wb|0;Sb=yb+(Xb<<2)|0;bc=c[Sb>>2]|0;d3a(Sb|0,yb+(Xb+1<<2)|0,(Wb<<2)+ -4|0)|0;c[(c[G>>2]|0)+((c[E>>2]|0)+ -1<<2)>>2]=bc;Eb=609;break b}break};case 44:{bc=c[La>>2]|0;Wb=c[Ma>>2]|0;Xb=bc+(Wb*24|0)|0;Sb=c[Nb>>2]|0;e:do{if((Wb|0)>0){gc=bc;while(1){Ub=gc+24|0;if((c[gc+12>>2]|0)==(Sb|0)){pc=gc;break e}if(Ub>>>0<Xb>>>0){gc=Ub}else{pc=Ub;break}}}else{pc=bc}}while(0);if((pc|0)==(Xb|0)){if(!(Wb>>>0<(c[Na>>2]|0)>>>0)){Eb=156;break a}c[Ma>>2]=Wb+1}if(Sb>>>0>65535){Eb=159;break a}c[pc>>2]=c[ra>>2];bc=Sb&65535;c[pc+12>>2]=bc;c[pc+4>>2]=(c[x>>2]|0)+1;a[pc+16>>0]=1;a[pc+17>>0]=0;c[pc+20>>2]=0;if(Sb>>>0>(c[Ka>>2]|0)>>>0){c[Ka>>2]=bc}while(1){if(!((APa(f)|0)<<24>>24==0)){Eb=609;break b}bc=d[A>>0]|0;if((bc|0)==44|(bc|0)==137){Eb=164;break a}else if((bc|0)==45){break}}c[pc+8>>2]=c[x>>2];Eb=609;break};case 43:{Sb=c[Nb>>2]|0;Wb=(c[Ka>>2]|0)+1|0;if(!(Sb>>>0<Wb>>>0)){Eb=150;break a}Xb=c[La>>2]|0;bc=c[Ma>>2]|0;if((Wb|0)==(bc|0)?(c[Xb+(Sb*24|0)+12>>2]|0)==(Sb|0):0){qc=Xb+(Sb*24|0)|0}else{Wb=Xb+(bc*24|0)|0;f:do{if((bc|0)>0){gc=Xb;while(1){Ub=gc+24|0;if((c[gc+12>>2]|0)==(Sb|0)){rc=gc;break f}if(Ub>>>0<Wb>>>0){gc=Ub}else{rc=Ub;break}}}else{rc=Xb}}while(0);if((rc|0)==(Wb|0)){Eb=150;break a}else{qc=rc}}if((a[qc+16>>0]|0)==0){Eb=150;break a}Xb=c[oa>>2]|0;if((Xb|0)>=(c[pa>>2]|0)){Eb=148;break a}Sb=c[qa>>2]|0;c[Sb+(Xb*20|0)>>2]=c[ra>>2];c[Sb+(Xb*20|0)+4>>2]=(c[x>>2]|0)+1;c[Sb+(Xb*20|0)+8>>2]=1;bc=qc+4|0;c[Sb+(Xb*20|0)+12>>2]=c[bc>>2];c[Sb+(Xb*20|0)+16>>2]=c[qc+8>>2];c[oa>>2]=(c[oa>>2]|0)+1;xPa(f,c[qc>>2]|0,c[bc>>2]|0)|0;a[J>>0]=0;Eb=609;break};case 45:{bc=c[oa>>2]|0;if((bc|0)<1){Eb=167;break a}Xb=bc+ -1|0;c[oa>>2]=Xb;bc=c[qa>>2]|0;Sb=bc+(Xb*20|0)+8|0;c[Sb>>2]=(c[Sb>>2]|0)+ -1;a[J>>0]=0;if((c[Sb>>2]|0)>0){c[oa>>2]=(c[oa>>2]|0)+1;c[x>>2]=c[bc+(Xb*20|0)+12>>2];Eb=609;break b}else{xPa(f,c[bc+(Xb*20|0)>>2]|0,c[bc+(Xb*20|0)+4>>2]|0)|0;Eb=609;break b}break};case 14:{Xb=e[wa>>1]|e[wa+2>>1]<<16;b[ya>>1]=Xb;b[ya+2>>1]=Xb>>>16;iPa(f);Eb=609;break};case 9:case 8:{if((jPa(f,c[yb+(Mb+1<<2)>>2]&65535,c[Nb>>2]&65535,Db,ya)|0)<<24>>24==0){iPa(f);Eb=609}else{Eb=609}break};case 18:{b[ga>>1]=c[Nb>>2];Eb=609;break};case 19:{Xb=c[Nb>>2]|0;if((Xb|0)==0){Pb=Ca+0|0;Qb=Da+0|0;Rb=Pb+36|0;do{c[Pb>>2]=c[Qb>>2];Pb=Pb+4|0;Qb=Qb+4|0}while((Pb|0)<(Rb|0))}else if((Xb|0)!=1){if((a[F>>0]|0)==0){Eb=609;break b}else{Eb=60;break a}}else{Pb=Ca+0|0;Qb=Ea+0|0;Rb=Pb+36|0;do{c[Pb>>2]=c[Qb>>2];Pb=Pb+4|0;Qb=Qb+4|0}while((Pb|0)<(Rb|0))}b[ea>>1]=c[Nb>>2];Eb=609;break};case 10:{kPa(c[Nb>>2]<<16>>16,c[yb+(Mb+1<<2)>>2]<<16>>16,wa);Xb=e[wa>>1]|e[wa+2>>1]<<16;b[xa>>1]=Xb;b[xa+2>>1]=Xb>>>16;iPa(f);Eb=609;break};case 23:{Xb=c[Nb>>2]|0;if((Xb|0)<0){Eb=81;break a}c[Ha>>2]=Xb;Eb=609;break};case 22:{Xb=c[Nb>>2]|0;if((Xb|0)==1){Pb=Ca+0|0;Qb=Ea+0|0;Rb=Pb+36|0;do{c[Pb>>2]=c[Qb>>2];Pb=Pb+4|0;Qb=Qb+4|0}while((Pb|0)<(Rb|0))}else if((Xb|0)!=0){if((a[F>>0]|0)==0){Eb=609;break b}else{Eb=78;break a}}else{Pb=Ca+0|0;Qb=Da+0|0;Rb=Pb+36|0;do{c[Pb>>2]=c[Qb>>2];Pb=Pb+4|0;Qb=Qb+4|0}while((Pb|0)<(Rb|0))}Pb=N+0|0;Qb=Ca+0|0;Rb=Pb+36|0;do{c[Pb>>2]=c[Qb>>2];Pb=Pb+4|0;Qb=Qb+4|0}while((Pb|0)<(Rb|0));Pb=Fa+0|0;Qb=Ca+0|0;Rb=Pb+36|0;do{c[Pb>>2]=c[Qb>>2];Pb=Pb+4|0;Qb=Qb+4|0}while((Pb|0)<(Rb|0));b[ea>>1]=c[Nb>>2];b[U>>1]=c[Nb>>2];b[Ga>>1]=c[Nb>>2];Eb=609;break};case 41:{Xb=c[Nb>>2]&65535;if(!(Xb>>>0<(e[R>>1]|0)>>>0)){if((a[F>>0]|0)==0){Eb=609;break b}else{Eb=122;break a}}Wb=(b[W>>1]|0)==0?-1:-9;if((b[Y>>1]|0)==0){sc=Wb}else{sc=Wb&255&239}Wb=(c[Ja>>2]|0)+Xb|0;a[Wb>>0]=a[Wb>>0]&sc;Eb=609;break};case 59:case 58:{Wb=c[Nb>>2]|0;Xb=Wb&65535;bc=Wb&65535;if(bc>>>0<(e[O>>1]|0)>>>0?(Wb=b[Q>>1]|0,Sb=Wb&65535,(Wb&65535)<(e[R>>1]|0)):0){if((b[U>>1]|0)==0){gc=(c[V>>2]|0)+(Sb<<3)|0;Sb=c[gc+4>>2]|0;Ub=(c[X>>2]|0)+(bc<<3)|0;c[Ub>>2]=c[gc>>2];c[Ub+4>>2]=Sb;Sb=yb+(Mb+1<<2)|0;pd[c[fb>>2]&127](f,N,Xb,c[Sb>>2]|0);Ub=(c[X>>2]|0)+(bc<<3)|0;gc=c[Ub+4>>2]|0;Vb=(c[Z>>2]|0)+(bc<<3)|0;c[Vb>>2]=c[Ub>>2];c[Vb+4>>2]=gc;tc=Sb;uc=b[Q>>1]|0}else{tc=yb+(Mb+1<<2)|0;uc=Wb}Wb=c[Z>>2]|0;Sb=c[aa>>2]|0;gc=uc&65535;Vb=Qc[c[$>>2]&255](f,(c[Wb+(bc<<3)>>2]|0)-(c[Sb+(gc<<3)>>2]|0)|0,(c[Wb+(bc<<3)+4>>2]|0)-(c[Sb+(gc<<3)+4>>2]|0)|0)|0;pd[c[da>>2]&127](f,N,Xb,(c[tc>>2]|0)-Vb|0);b[fa>>1]=b[Q>>1]|0;b[ga>>1]=Xb;if((a[A>>0]&1)==0){Eb=609;break b}b[Q>>1]=Xb;Eb=609;break b}if((a[F>>0]|0)==0){Eb=609}else{Eb=290;break a}break};case 60:{Xb=c[Ha>>2]|0;g:do{if((c[D>>2]|0)>=(Xb|0)?(e[Q>>1]|0)<(e[R>>1]|0):0){if((Xb|0)>0){Vb=Mb;gc=yb;Sb=Xb;while(1){bc=Vb+ -1|0;c[E>>2]=bc;Wb=c[gc+(bc<<2)>>2]|0;Ub=Wb&65535;if(!(Ub>>>0<(e[O>>1]|0)>>>0)){if((a[F>>0]|0)==0){vc=bc;wc=Sb}else{Eb=303;break a}}else{bc=c[Z>>2]|0;fc=c[aa>>2]|0;dc=e[Q>>1]|0;Zb=Qc[c[$>>2]&255](f,(c[bc+(Ub<<3)>>2]|0)-(c[fc+(dc<<3)>>2]|0)|0,(c[bc+(Ub<<3)+4>>2]|0)-(c[fc+(dc<<3)+4>>2]|0)|0)|0;pd[c[da>>2]&127](f,N,Wb&65535,0-Zb|0);vc=c[E>>2]|0;wc=c[Ha>>2]|0}Zb=wc+ -1|0;c[Ha>>2]=Zb;if((Zb|0)<=0){xc=vc;break g}Vb=vc;gc=c[G>>2]|0;Sb=Zb}}else{xc=Mb}}else{Eb=298}}while(0);if((Eb|0)==298){Eb=0;if((a[F>>0]|0)==0){xc=Mb}else{c[K>>2]=134;xc=Mb}}c[Ha>>2]=1;c[H>>2]=xc;Eb=609;break};case 61:{c[w>>2]=2;c[y>>2]=231;Eb=609;break};case 63:case 62:{Xb=c[M>>2]|0;Sb=c[yb+(Mb+1<<2)>>2]|0;gc=c[Nb>>2]|0;Vb=gc&65535;Zb=gc&65535;if(Zb>>>0<(e[R>>1]|0)>>>0?Sb>>>0<(c[P>>2]|0)>>>0:0){gc=dd[c[v>>2]&511](f,Sb)|0;if((b[ea>>1]|0)==0){Sb=zPa(gc,b[W>>1]|0)|0;c[(c[V>>2]|0)+(Zb<<3)>>2]=Sb;Sb=zPa(gc,b[Y>>1]|0)|0;c[(c[V>>2]|0)+(Zb<<3)+4>>2]=Sb;Sb=(c[V>>2]|0)+(Zb<<3)|0;Wb=c[Sb+4>>2]|0;dc=(c[aa>>2]|0)+(Zb<<3)|0;c[dc>>2]=c[Sb>>2];c[dc+4>>2]=Wb}Wb=c[aa>>2]|0;dc=Qc[c[$>>2]&255](f,c[Wb+(Zb<<3)>>2]|0,c[Wb+(Zb<<3)+4>>2]|0)|0;if((a[A>>0]&1)==0){yc=gc}else{Zb=gc-dc|0;yc=Qc[c[y>>2]&255](f,(((Zb|0)<0?0-Zb|0:Zb)|0)>(Xb|0)?dc:gc,c[Oa>>2]|0)|0}pd[c[da>>2]&127](f,Ca,Vb,yc-dc|0)}else{Eb=311}if((Eb|0)==311?(Eb=0,(a[F>>0]|0)!=0):0){c[K>>2]=134}b[Q>>1]=Vb;b[fa>>1]=Vb;Eb=609;break};case 64:{Vb=c[x>>2]|0;dc=c[z>>2]|0;gc=a[dc+(Vb+1)>>0]|0;Xb=gc&255;if(!(Xb>>>0<(Cb+1-(c[D>>2]|0)|0)>>>0)){Eb=322;break a}if(gc<<24>>24==0){zc=Fb}else{Zb=Mb+ -1|0;c[Nb>>2]=d[dc+(Vb+2)>>0]|0;if(!((gc&255)<2)){gc=2;Vb=2;do{Vb=Vb+1<<16>>16;c[yb+(Zb+gc<<2)>>2]=d[(c[z>>2]|0)+((c[x>>2]|0)+1+gc)>>0]|0;gc=Vb&65535}while(!(gc>>>0>Xb>>>0))}zc=c[H>>2]|0}c[H>>2]=zc+Xb;Eb=609;break};case 66:{gc=c[Nb>>2]|0;if(!(gc>>>0<(e[gb>>1]|0)>>>0)){if((a[F>>0]|0)==0){Eb=609;break b}else{Eb=335;break a}}else{c[(c[hb>>2]|0)+(gc<<2)>>2]=c[yb+(Mb+1<<2)>>2];Eb=609;break b}break};case 65:{gc=c[x>>2]|0;Vb=a[(c[z>>2]|0)+(gc+1)>>0]|0;Zb=Vb&255;if(!(Zb>>>0<(Cb+1-(c[D>>2]|0)|0)>>>0)){Eb=327;break a}c[x>>2]=gc+2;if(Vb<<24>>24==0){Ac=Fb}else{Vb=0;gc=0;do{c[yb+(Vb+Mb<<2)>>2]=(yPa(f)|0)<<16>>16;gc=gc+1<<16>>16;Vb=gc&65535}while(Vb>>>0<Zb>>>0);Ac=c[H>>2]|0}a[J>>0]=0;c[H>>2]=Ac+Zb;Eb=609;break};case 68:{Vb=c[Nb>>2]|0;if(!(Vb>>>0<(c[P>>2]|0)>>>0)){if((a[F>>0]|0)==0){Eb=609;break b}else{Eb=335;break a}}else{ld[c[ib>>2]&255](f,Vb,c[yb+(Mb+1<<2)>>2]|0);Eb=609;break b}break};case 69:{Vb=c[Nb>>2]|0;if(Vb>>>0<(c[P>>2]|0)>>>0){c[Nb>>2]=dd[c[v>>2]&511](f,Vb)|0;Eb=609;break b}if((a[F>>0]|0)!=0){Eb=335;break a}c[Nb>>2]=0;Eb=609;break};case 67:{Vb=c[Nb>>2]|0;if(Vb>>>0<(e[gb>>1]|0)>>>0){c[Nb>>2]=c[(c[hb>>2]|0)+(Vb<<2)>>2];Eb=609;break b}if((a[F>>0]|0)!=0){Eb=335;break a}c[Nb>>2]=0;Eb=609;break};case 71:case 70:{Vb=c[Nb>>2]|0;do{if(Vb>>>0<(e[za>>1]|0)>>>0){if((Kb&1)==0){gc=c[Ba>>2]|0;Bc=Qc[c[$>>2]&255](f,c[gc+(Vb<<3)>>2]|0,c[gc+(Vb<<3)+4>>2]|0)|0;break}else{gc=c[db>>2]|0;Bc=Qc[c[_>>2]&255](f,c[gc+(Vb<<3)>>2]|0,c[gc+(Vb<<3)+4>>2]|0)|0;break}}else{if((a[F>>0]|0)==0){Bc=0}else{c[K>>2]=134;Bc=0}}}while(0);c[Nb>>2]=Bc;Eb=609;break};case 72:{Vb=c[Nb>>2]|0;Zb=Vb&65535;if(!(Zb>>>0<(e[za>>1]|0)>>>0)){if((a[F>>0]|0)==0){Eb=609;break b}else{Eb=356;break a}}gc=c[Ba>>2]|0;Xb=Qc[c[$>>2]&255](f,c[gc+(Zb<<3)>>2]|0,c[gc+(Zb<<3)+4>>2]|0)|0;pd[c[da>>2]&127](f,Fa,Vb&65535,(c[yb+(Mb+1<<2)>>2]|0)-Xb|0);if((b[Ga>>1]|0)==0){Xb=(c[Ba>>2]|0)+(Zb<<3)|0;Vb=c[Xb+4>>2]|0;gc=(c[db>>2]|0)+(Zb<<3)|0;c[gc>>2]=c[Xb>>2];c[gc+4>>2]=Vb;Eb=609}else{Eb=609}break};case 74:case 73:{Vb=c[Nb>>2]&65535;do{if(Vb>>>0<(e[R>>1]|0)>>>0?(gc=c[yb+(Mb+1<<2)>>2]&65535,gc>>>0<(e[O>>1]|0)>>>0):0){if(!((Kb&1)==0)){Xb=c[aa>>2]|0;Zb=c[Z>>2]|0;Cc=Qc[c[$>>2]&255](f,(c[Xb+(Vb<<3)>>2]|0)-(c[Zb+(gc<<3)>>2]|0)|0,(c[Xb+(Vb<<3)+4>>2]|0)-(c[Zb+(gc<<3)+4>>2]|0)|0)|0;break}if((b[ea>>1]|0)!=0?(b[U>>1]|0)!=0:0){Zb=c[ia>>2]|0;Xb=Zb+(Vb<<3)|0;dc=c[ha>>2]|0;Wb=dc+(gc<<3)|0;Sb=c[ja>>2]|0;fc=c[ka>>2]|0;if((Sb|0)==(fc|0)){Ub=Qc[c[_>>2]&255](f,(c[Xb>>2]|0)-(c[Wb>>2]|0)|0,(c[Zb+(Vb<<3)+4>>2]|0)-(c[dc+(gc<<3)+4>>2]|0)|0)|0;Cc=SDa(Ub,c[ja>>2]|0)|0;break}else{Ub=SDa((c[Xb>>2]|0)-(c[Wb>>2]|0)|0,Sb)|0;Sb=SDa((c[Zb+(Vb<<3)+4>>2]|0)-(c[dc+(gc<<3)+4>>2]|0)|0,fc)|0;Cc=Qc[c[_>>2]&255](f,Ub,Sb)|0;break}}Sb=c[V>>2]|0;Ub=c[X>>2]|0;Cc=Qc[c[_>>2]&255](f,(c[Sb+(Vb<<3)>>2]|0)-(c[Ub+(gc<<3)>>2]|0)|0,(c[Sb+(Vb<<3)+4>>2]|0)-(c[Ub+(gc<<3)+4>>2]|0)|0)|0}else{Eb=361}}while(0);if((Eb|0)==361){Eb=0;if((a[F>>0]|0)==0){Cc=0}else{c[K>>2]=134;Cc=0}}c[Nb>>2]=Cc;Eb=609;break};case 75:{c[Nb>>2]=pPa(f)|0;Eb=609;break};case 80:{c[Nb>>2]=(c[Nb>>2]|0)<(c[yb+(Mb+1<<2)>>2]|0)&1;Eb=609;break};case 81:{c[Nb>>2]=(c[Nb>>2]|0)<=(c[yb+(Mb+1<<2)>>2]|0)&1;Eb=609;break};case 82:{c[Nb>>2]=(c[Nb>>2]|0)>(c[yb+(Mb+1<<2)>>2]|0)&1;Eb=609;break};case 83:{c[Nb>>2]=(c[Nb>>2]|0)>=(c[yb+(Mb+1<<2)>>2]|0)&1;Eb=609;break};case 76:{c[Nb>>2]=pPa(f)|0;Eb=609;break};case 77:{a[ba>>0]=1;Eb=609;break};case 78:{a[ba>>0]=0;Eb=609;break};case 79:{Eb=376;break a;break};case 85:{c[Nb>>2]=(c[Nb>>2]|0)!=(c[yb+(Mb+1<<2)>>2]|0)&1;Eb=609;break};case 86:{c[Nb>>2]=((Qc[c[y>>2]&255](f,c[Nb>>2]|0,0)|0)&127|0)==64&1;Eb=609;break};case 87:{c[Nb>>2]=((Qc[c[y>>2]&255](f,c[Nb>>2]|0,0)|0)&127|0)==0&1;Eb=609;break};case 88:{if((c[Nb>>2]|0)==0?!((APa(f)|0)<<24>>24==1):0){Vb=1;while(1){gc=(Vb|0)==1;while(1){Ub=d[A>>0]|0;if((Ub|0)==88){Eb=390;break}else if((Ub|0)==27){if(gc){Eb=609;break b}}else if((Ub|0)==89){Eb=392;break}if((APa(f)|0)<<24>>24==1){Eb=609;break b}}if((Eb|0)==390){Eb=0;Dc=Vb+1|0}else if((Eb|0)==392){Eb=0;gc=Vb+ -1|0;if((gc|0)==0){Eb=609;break b}else{Dc=gc}}if((APa(f)|0)<<24>>24==1){Eb=609;break}else{Vb=Dc}}}else{Eb=609}break};case 84:{c[Nb>>2]=(c[Nb>>2]|0)==(c[yb+(Mb+1<<2)>>2]|0)&1;Eb=609;break};case 90:{if((c[Nb>>2]|0)==0){Ec=0}else{Ec=(c[yb+(Mb+1<<2)>>2]|0)!=0}c[Nb>>2]=Ec&1;Eb=609;break};case 91:{if((c[Nb>>2]|0)==0){Fc=(c[yb+(Mb+1<<2)>>2]|0)!=0}else{Fc=1}c[Nb>>2]=Fc&1;Eb=609;break};case 92:{c[Nb>>2]=(c[Nb>>2]|0)==0&1;Eb=609;break};case 93:{qPa(f,c[Nb>>2]|0);Eb=609;break};case 94:{b[jb>>1]=c[Nb>>2];Eb=609;break};case 95:{b[kb>>1]=c[Nb>>2];Eb=609;break};case 96:{c[Nb>>2]=(c[Nb>>2]|0)+(c[yb+(Mb+1<<2)>>2]|0);Eb=609;break};case 97:{c[Nb>>2]=(c[Nb>>2]|0)-(c[yb+(Mb+1<<2)>>2]|0);Eb=609;break};case 99:{c[Nb>>2]=ODa(c[Nb>>2]|0,c[yb+(Mb+1<<2)>>2]|0,64)|0;Eb=609;break};case 100:{Vb=c[Nb>>2]|0;c[Nb>>2]=(Vb|0)<0?0-Vb|0:Vb;Eb=609;break};case 101:{c[Nb>>2]=0-(c[Nb>>2]|0);Eb=609;break};case 102:{c[Nb>>2]=c[Nb>>2]&-64;Eb=609;break};case 103:{c[Nb>>2]=(c[Nb>>2]|0)+63&-64;Eb=609;break};case 98:{Vb=c[yb+(Mb+1<<2)>>2]|0;if((Vb|0)==0){Eb=407;break a}c[Nb>>2]=RDa(c[Nb>>2]|0,64,Vb)|0;Eb=609;break};case 112:{Vb=c[Nb>>2]|0;if(!(Vb>>>0<(c[P>>2]|0)>>>0)){if((a[F>>0]|0)==0){Eb=609;break b}else{Eb=335;break a}}else{gc=SDa(c[yb+(Mb+1<<2)>>2]|0,c[Ia>>2]|0)|0;c[(c[lb>>2]|0)+(Vb<<2)>>2]=gc;Eb=609;break b}break};case 114:case 113:{qPa(f,c[Nb>>2]|0);Eb=609;break};case 117:case 116:case 115:{gc=c[Nb>>2]|0;h:do{if((gc|0)==0){Gc=Mb}else{i:do{if((Mb|0)>=2){Vb=Mb;Ub=yb;Sb=2;while(1){fc=Vb+ -2|0;c[E>>2]=fc;dc=c[Ub+(Vb+ -1<<2)>>2]|0;Zb=c[Ub+(fc<<2)>>2]|0;if(dc>>>0<(c[P>>2]|0)>>>0){fc=Zb>>>4&15;Wb=d[A>>0]|0;if((Wb|0)==116){Hc=fc|16}else if((Wb|0)==117){Hc=fc|32}else{Hc=fc}fc=(b[jb>>1]|0)+Hc|0;if((pPa(f)|0)==(fc|0)){fc=Zb&15;Zb=fc+ -8|0;ld[c[mb>>2]&255](f,dc,(((Zb|0)>-1?fc+ -7|0:Zb)<<6|0)/(1<<b[kb>>1]|0)|0)}}else{if((a[F>>0]|0)!=0){Eb=429;break a}}Zb=c[E>>2]|0;if(Sb>>>0>gc>>>0){Gc=Zb;break h}if((Zb|0)<2){break i}Vb=Zb;Ub=c[G>>2]|0;Sb=Sb+1|0}}}while(0);if((a[F>>0]|0)!=0){c[K>>2]=129}c[E>>2]=0;Gc=0}}while(0);c[H>>2]=Gc;Eb=609;break};case 107:case 106:case 105:case 104:{c[Nb>>2]=Qc[c[y>>2]&255](f,c[Nb>>2]|0,c[f+(Db+ -104<<2)+264>>2]|0)|0;Eb=609;break};case 111:case 110:case 109:case 108:{c[Nb>>2]=rPa(f,c[Nb>>2]|0,c[f+(Db+ -108<<2)+264>>2]|0)|0;Eb=609;break};case 118:{sPa(f,16384,c[Nb>>2]|0);c[w>>2]=6;c[y>>2]=232;Eb=609;break};case 119:{sPa(f,11585,c[Nb>>2]|0);c[w>>2]=7;c[y>>2]=233;Eb=609;break};case 120:{if((c[yb+(Mb+1<<2)>>2]|0)==0){Eb=609}else{gc=c[Nb>>2]|0;if((gc|Mb|0)==0){c[K>>2]=132;Ic=c[Nb>>2]|0}else{Ic=gc}gc=(c[x>>2]|0)+Ic|0;c[x>>2]=gc;if((gc|0)>=0){Sb=c[oa>>2]|0;if((Sb|0)>0?(gc|0)>(c[(c[qa>>2]|0)+((Sb+ -1|0)*20|0)+16>>2]|0):0){Eb=445}}else{Eb=445}if((Eb|0)==445){Eb=0;c[K>>2]=132}a[J>>0]=0;Eb=609}break};case 122:{c[w>>2]=5;c[y>>2]=226;Eb=609;break};case 123:{nPa(f);Eb=609;break};case 124:{c[w>>2]=4;c[y>>2]=228;Eb=609;break};case 125:{c[w>>2]=3;c[y>>2]=229;Eb=609;break};case 128:{Sb=c[Ha>>2]|0;j:do{if((c[D>>2]|0)<(Sb|0)){if((a[F>>0]|0)==0){Jc=Mb}else{c[K>>2]=129;Jc=Mb}}else{if((Sb|0)>0){gc=Mb;Ub=yb;Vb=Sb;while(1){Zb=gc+ -1|0;c[E>>2]=Zb;fc=c[Ub+(Zb<<2)>>2]&65535;if(!(fc>>>0<(e[Va>>1]|0)>>>0)){if((a[F>>0]|0)==0){Kc=Zb;Lc=Vb}else{Eb=465;break a}}else{Zb=(c[Za>>2]|0)+fc|0;a[Zb>>0]=d[Zb>>0]^1;Kc=c[E>>2]|0;Lc=c[Ha>>2]|0}Zb=Lc+ -1|0;c[Ha>>2]=Zb;if((Zb|0)<=0){Jc=Kc;break j}gc=Kc;Ub=c[G>>2]|0;Vb=Zb}}else{Jc=Mb}}}while(0);c[Ha>>2]=1;c[H>>2]=Jc;Eb=609;break};case 129:{Sb=c[Nb>>2]|0;Vb=c[yb+(Mb+1<<2)>>2]&65535;Ub=e[Va>>1]|0;if(Vb>>>0<Ub>>>0?(gc=Sb&65535,gc>>>0<Ub>>>0):0){if(gc>>>0>Vb>>>0){Eb=609;break b}Ub=gc;gc=Sb&65535;while(1){Sb=(c[Za>>2]|0)+Ub|0;a[Sb>>0]=d[Sb>>0]|1;gc=gc+1<<16>>16;Ub=gc&65535;if(Ub>>>0>Vb>>>0){Eb=609;break b}}}if((a[F>>0]|0)==0){Eb=609}else{Eb=475;break a}break};case 121:{if((c[yb+(Mb+1<<2)>>2]|0)==0){Vb=c[Nb>>2]|0;if((Vb|Mb|0)==0){c[K>>2]=132;Mc=c[Nb>>2]|0}else{Mc=Vb}Vb=(c[x>>2]|0)+Mc|0;c[x>>2]=Vb;if((Vb|0)>=0){Ub=c[oa>>2]|0;if((Ub|0)>0?(Vb|0)>(c[(c[qa>>2]|0)+((Ub+ -1|0)*20|0)+16>>2]|0):0){Eb=453}}else{Eb=453}if((Eb|0)==453){Eb=0;c[K>>2]=132}a[J>>0]=0;Eb=609}else{Eb=609}break};case 51:case 50:{if((c[D>>2]|0)<(c[Ha>>2]|0)){if((a[F>>0]|0)!=0){c[K>>2]=134}}else{if(!((DPa(f,s,t,q,r)|0)<<24>>24==0)){Eb=609;break b}Ub=c[Ha>>2]|0;if((Ub|0)>0){Vb=c[s>>2]|0;gc=c[t>>2]|0;Sb=Ub;do{Ub=(c[E>>2]|0)+ -1|0;c[E>>2]=Ub;Zb=c[(c[G>>2]|0)+(Ub<<2)>>2]|0;if(!((Zb&65535)>>>0<(e[za>>1]|0)>>>0)){if((a[F>>0]|0)==0){Nc=Sb}else{Eb=209;break a}}else{CPa(f,Zb&65535,Vb,gc,1);Nc=c[Ha>>2]|0}Sb=Nc+ -1|0;c[Ha>>2]=Sb}while((Sb|0)>0)}}c[Ha>>2]=1;c[H>>2]=c[E>>2];Eb=609;break};case 53:case 52:{if((b[Ga>>1]|0)==0){Oc=1}else{Oc=b[bb>>1]|0}Sb=c[Nb>>2]<<16>>16;if(!(Sb>>>0<Oc<<16>>16>>>0)){if((a[F>>0]|0)==0){Eb=609;break b}else{Eb=217;break a}}if((DPa(f,o,p,m,n)|0)<<24>>24==0){if((Sb|0)==0){Pc=0}else{Pc=(e[(c[$a>>2]|0)+(Sb+ -1<<1)>>1]|0)+1-(e[ab>>1]|0)&65535}if((b[Ga>>1]|0)==0){Rc=b[za>>1]|0}else{Rc=(e[(c[$a>>2]|0)+(Sb<<1)>>1]|0)+1-(e[ab>>1]|0)&65535}if((Pc&65535)<(Rc&65535)){Sb=c[_a>>2]|0;gc=b[n>>1]|0;Vb=c[o>>2]|0;Zb=c[p>>2]|0;Ub=Pc;do{if(!((Sb|0)==(c[Ba>>2]|0)?gc<<16>>16==Ub<<16>>16:0)){CPa(f,Ub,Vb,Zb,1)}Ub=Ub+1<<16>>16}while((Ub&65535)<(Rc&65535));Eb=609}else{Eb=609}}else{Eb=609}break};case 55:case 54:{if((c[Nb>>2]|0)>>>0>1){if((a[F>>0]|0)==0){Eb=609;break b}else{Eb=231;break a}}if((DPa(f,k,l,h,j)|0)<<24>>24==0){Ub=b[Ga>>1]|0;if(Ub<<16>>16==0){Sc=b[za>>1]|0}else if(Ub<<16>>16==1){Ub=b[bb>>1]|0;if(!(Ub<<16>>16>0)){Eb=609;break b}Zb=(e[(c[$a>>2]|0)+((Ub<<16>>16)+ -1<<1)>>1]|0)+1|0;Ub=e[za>>1]|0;if((Zb&65535)>>>0<Ub>>>0){Sc=Zb&65535}else{Sc=Ub+65535&65535}}else{Eb=609;break b}if(!(Sc<<16>>16==0)){Ub=c[cb>>2]|0;Zb=b[j>>1]|0;Vb=c[k>>2]|0;gc=c[l>>2]|0;Sb=0;do{if(!((Ub|0)==(c[Ba>>2]|0)?Zb<<16>>16==Sb<<16>>16:0)){CPa(f,Sb,Vb,gc,0)}Sb=Sb+1<<16>>16}while((Sb&65535)<(Sc&65535));Eb=609}else{Eb=609}}else{Eb=609}break};case 56:{Sb=c[Ha>>2]|0;k:do{if((c[D>>2]|0)<(Sb+1|0)){if((a[F>>0]|0)==0){Tc=Mb}else{c[K>>2]=134;Tc=Mb}}else{gc=c[Nb>>2]|0;Vb=zPa(gc,b[W>>1]|0)|0;Zb=zPa(gc,b[Y>>1]|0)|0;if((Sb|0)>0){gc=Sb;Ub=Mb;fc=yb;while(1){dc=Ub+ -1|0;c[E>>2]=dc;Wb=c[fc+(dc<<2)>>2]|0;if(!((Wb&65535)>>>0<(e[za>>1]|0)>>>0)){if((a[F>>0]|0)==0){Uc=dc;Vc=gc}else{Eb=249;break a}}else{CPa(f,Wb&65535,Vb,Zb,1);Uc=c[E>>2]|0;Vc=c[Ha>>2]|0}Wb=Vc+ -1|0;c[Ha>>2]=Wb;if((Wb|0)<=0){Tc=Uc;break k}gc=Wb;Ub=Uc;fc=c[G>>2]|0}}else{Tc=Mb}}}while(0);c[Ha>>2]=1;c[H>>2]=Tc;Eb=609;break};case 57:{Sb=c[Ha>>2]|0;do{if((c[D>>2]|0)<(Sb|0)){if((a[F>>0]|0)!=0){c[K>>2]=134}}else{if((b[ea>>1]|0)!=0?(b[U>>1]|0)!=0:0){Wc=(b[Ga>>1]|0)==0}else{Wc=1}fc=b[fa>>1]|0;Ub=fc&65535;if(!((fc&65535)<(e[R>>1]|0))){if((a[F>>0]|0)==0){break}c[K>>2]=134;break}fc=c[(Wc?V:ia)>>2]|0;gc=fc+(Ub<<3)|0;Zb=c[aa>>2]|0;Vb=Zb+(Ub<<3)|0;Wb=b[ga>>1]|0;dc=Wb&65535;if((Wb&65535)<(e[O>>1]|0)){do{if(!Wc){Wb=c[ja>>2]|0;Xb=c[ka>>2]|0;if((Wb|0)==(Xb|0)){bc=c[ha>>2]|0;Xc=Qc[c[_>>2]&255](f,(c[bc+(dc<<3)>>2]|0)-(c[gc>>2]|0)|0,(c[bc+(dc<<3)+4>>2]|0)-(c[fc+(Ub<<3)+4>>2]|0)|0)|0;break}else{bc=c[ha>>2]|0;cc=SDa((c[bc+(dc<<3)>>2]|0)-(c[gc>>2]|0)|0,Wb)|0;Wb=SDa((c[bc+(dc<<3)+4>>2]|0)-(c[fc+(Ub<<3)+4>>2]|0)|0,Xb)|0;Xc=Qc[c[_>>2]&255](f,cc,Wb)|0;break}}else{Wb=c[X>>2]|0;Xc=Qc[c[_>>2]&255](f,(c[Wb+(dc<<3)>>2]|0)-(c[gc>>2]|0)|0,(c[Wb+(dc<<3)+4>>2]|0)-(c[fc+(Ub<<3)+4>>2]|0)|0)|0}}while(0);dc=e[ga>>1]|0;Wb=c[Z>>2]|0;cc=Qc[c[$>>2]&255](f,(c[Wb+(dc<<3)>>2]|0)-(c[Vb>>2]|0)|0,(c[Wb+(dc<<3)+4>>2]|0)-(c[Zb+(Ub<<3)+4>>2]|0)|0)|0;Yc=c[Ha>>2]|0;Zc=cc;_c=Xc}else{Yc=Sb;Zc=0;_c=0}if((Yc|0)>0){cc=fc+(Ub<<3)+4|0;dc=Zb+(Ub<<3)+4|0;Wb=(_c|0)==0;Xb=Yc;do{bc=(c[E>>2]|0)+ -1|0;c[E>>2]=bc;_b=c[(c[G>>2]|0)+(bc<<2)>>2]|0;if(!(_b>>>0<(e[za>>1]|0)>>>0)){if((a[F>>0]|0)==0){$c=Xb}else{Eb=274;break a}}else{do{if(!Wc){bc=c[ja>>2]|0;ac=c[ka>>2]|0;if((bc|0)==(ac|0)){Ob=c[eb>>2]|0;ad=Qc[c[_>>2]&255](f,(c[Ob+(_b<<3)>>2]|0)-(c[gc>>2]|0)|0,(c[Ob+(_b<<3)+4>>2]|0)-(c[cc>>2]|0)|0)|0;break}else{Ob=c[eb>>2]|0;ec=SDa((c[Ob+(_b<<3)>>2]|0)-(c[gc>>2]|0)|0,bc)|0;bc=SDa((c[Ob+(_b<<3)+4>>2]|0)-(c[cc>>2]|0)|0,ac)|0;ad=Qc[c[_>>2]&255](f,ec,bc)|0;break}}else{bc=c[db>>2]|0;ad=Qc[c[_>>2]&255](f,(c[bc+(_b<<3)>>2]|0)-(c[gc>>2]|0)|0,(c[bc+(_b<<3)+4>>2]|0)-(c[cc>>2]|0)|0)|0}}while(0);bc=c[Ba>>2]|0;ec=Qc[c[$>>2]&255](f,(c[bc+(_b<<3)>>2]|0)-(c[Vb>>2]|0)|0,(c[bc+(_b<<3)+4>>2]|0)-(c[dc>>2]|0)|0)|0;do{if((ad|0)!=0){if(Wb){bd=0-ad|0;break}else{bd=ODa(ad,Zc,_c)|0;break}}else{bd=0}}while(0);pd[c[da>>2]&127](f,Fa,_b&65535,bd-ec|0);$c=c[Ha>>2]|0}Xb=$c+ -1|0;c[Ha>>2]=Xb}while((Xb|0)>0)}}}while(0);c[Ha>>2]=1;c[H>>2]=c[E>>2];Eb=609;break};case 30:{c[T>>2]=c[Nb>>2];Eb=609;break};case 31:{c[S>>2]=SDa(c[Nb>>2]|0,c[Ia>>2]|0)|0;Eb=609;break};case 32:{c[yb+(Mb+1<<2)>>2]=c[Nb>>2];Eb=609;break};case 34:{c[H>>2]=0;Eb=609;break};case 35:{Sb=c[Nb>>2]|0;Xb=yb+(Mb+1<<2)|0;c[Nb>>2]=c[Xb>>2];c[Xb>>2]=Sb;Eb=609;break};case 7:case 6:{if((jPa(f,c[yb+(Mb+1<<2)>>2]&65535,c[Nb>>2]&65535,Db,wa)|0)<<24>>24==0){Sb=e[wa>>1]|e[wa+2>>1]<<16;b[xa>>1]=Sb;b[xa+2>>1]=Sb>>>16;iPa(f);Eb=609}else{Eb=609}break};case 42:{Sb=c[yb+(Mb+1<<2)>>2]|0;Xb=(c[Ka>>2]|0)+1|0;if(!(Sb>>>0<Xb>>>0)){Eb=138;break a}Wb=c[La>>2]|0;dc=c[Ma>>2]|0;if((Xb|0)==(dc|0)?(c[Wb+(Sb*24|0)+12>>2]|0)==(Sb|0):0){cd=Wb+(Sb*24|0)|0}else{Xb=Wb+(dc*24|0)|0;l:do{if((dc|0)>0){Vb=Wb;while(1){cc=Vb+24|0;if((c[Vb+12>>2]|0)==(Sb|0)){ed=Vb;break l}if(cc>>>0<Xb>>>0){Vb=cc}else{ed=cc;break}}}else{ed=Wb}}while(0);if((ed|0)==(Xb|0)){Eb=138;break a}else{cd=ed}}if((a[cd+16>>0]|0)==0){Eb=138;break a}Wb=c[oa>>2]|0;if((Wb|0)>=(c[pa>>2]|0)){Eb=135;break a}if((c[Nb>>2]|0)>0){Sb=c[qa>>2]|0;c[Sb+(Wb*20|0)>>2]=c[ra>>2];c[Sb+(Wb*20|0)+4>>2]=(c[x>>2]|0)+1;c[Sb+(Wb*20|0)+8>>2]=c[Nb>>2];dc=cd+4|0;c[Sb+(Wb*20|0)+12>>2]=c[dc>>2];c[Sb+(Wb*20|0)+16>>2]=c[cd+8>>2];c[oa>>2]=(c[oa>>2]|0)+1;xPa(f,c[cd>>2]|0,c[dc>>2]|0)|0;a[J>>0]=0;Eb=609}else{Eb=609}break};case 12:{c[Nb>>2]=b[sa>>1]|0;c[yb+(Mb+1<<2)>>2]=b[ta>>1]|0;Eb=609;break};case 130:{dc=c[Nb>>2]|0;Wb=c[yb+(Mb+1<<2)>>2]&65535;Sb=e[Va>>1]|0;if(Wb>>>0<Sb>>>0?(Vb=dc&65535,Vb>>>0<Sb>>>0):0){if(Vb>>>0>Wb>>>0){Eb=609;break b}Sb=Vb;Vb=dc&65535;while(1){dc=(c[Za>>2]|0)+Sb|0;a[dc>>0]=a[dc>>0]&254;Vb=Vb+1<<16>>16;Sb=Vb&65535;if(Sb>>>0>Wb>>>0){Eb=609;break b}}}if((a[F>>0]|0)==0){Eb=609}else{Eb=482;break a}break};case 132:case 131:{nPa(f);Eb=609;break};case 133:{Wb=c[Nb>>2]|0;Sb=Wb&255;if((Sb|0)==255){a[ob>>0]=1;Eb=609;break b}else if((Sb|0)==0){a[ob>>0]=0;Eb=609;break b}else{if((Wb&256|0)!=0?!((e[qb>>1]|0)>>>0>Sb>>>0):0){a[ob>>0]=1;fd=c[Nb>>2]|0}else{fd=Wb}if((fd&512|0)!=0?(a[pb>>0]|0)!=0:0){a[ob>>0]=1;gd=c[Nb>>2]|0}else{gd=fd}if((gd&1024|0)!=0?(a[nb>>0]|0)!=0:0){a[ob>>0]=1;hd=c[Nb>>2]|0}else{hd=gd}if((hd&2048|0)!=0?(e[qb>>1]|0)>>>0>Sb>>>0:0){a[ob>>0]=0;id=c[Nb>>2]|0}else{id=hd}if((id&4096|0)!=0?(a[pb>>0]|0)!=0:0){a[ob>>0]=0;jd=c[Nb>>2]|0}else{jd=id}if((jd&8192|0)==0){Eb=609;break b}if((a[nb>>0]|0)==0){Eb=609;break b}a[ob>>0]=0;Eb=609;break b}break};case 135:case 134:{Sb=c[Nb>>2]&65535;if(Sb>>>0<(e[O>>1]|0)>>>0?(Wb=c[yb+(Mb+1<<2)>>2]&65535,Wb>>>0<(e[za>>1]|0)>>>0):0){Vb=c[X>>2]|0;Xb=c[db>>2]|0;dc=c[Vb+(Sb<<3)>>2]|0;cc=c[Xb+(Wb<<3)>>2]|0;gc=c[Vb+(Sb<<3)+4>>2]|0;Vb=c[Xb+(Wb<<3)+4>>2]|0;Xb=gc-Vb|0;Ub=(dc|0)==(cc|0)&(gc|0)==(Vb|0);Vb=Ub?16384:dc-cc|0;cc=Ub|(Kb&1)==0;kPa(cc?Vb:0-Xb|0,cc?Xb:Vb,xa);Vb=c[Z>>2]|0;Xb=c[Ba>>2]|0;Ub=c[Vb+(Sb<<3)>>2]|0;dc=c[Xb+(Wb<<3)>>2]|0;gc=c[Vb+(Sb<<3)+4>>2]|0;Sb=c[Xb+(Wb<<3)+4>>2]|0;Wb=gc-Sb|0;Xb=(Ub|0)==(dc|0)&(gc|0)==(Sb|0);Sb=Xb?16384:Ub-dc|0;dc=Xb|cc;kPa(dc?Sb:0-Wb|0,dc?Wb:Sb,wa);iPa(f);Eb=609;break b}if((a[F>>0]|0)==0){Eb=609}else{Eb=509;break a}break};case 137:{Sb=c[ma>>2]|0;Wb=c[na>>2]|0;dc=Sb+(Wb*24|0)|0;m:do{if((Wb|0)>0){cc=c[Nb>>2]|0;Xb=Sb;while(1){Ub=Xb+24|0;if((c[Xb+12>>2]|0)==(cc|0)){kd=Xb;break m}if(Ub>>>0<dc>>>0){Xb=Ub}else{kd=Ub;break}}}else{kd=Sb}}while(0);if((kd|0)==(dc|0)){if(!(Wb>>>0<(c[sb>>2]|0)>>>0)){Eb=524;break a}c[na>>2]=Wb+1}Sb=c[Nb>>2]|0;if(Sb>>>0>255){Eb=527;break a}c[kd+12>>2]=Sb&255;c[kd+4>>2]=(c[x>>2]|0)+1;c[kd>>2]=c[ra>>2];a[kd+16>>0]=1;Sb=c[Nb>>2]|0;if(Sb>>>0>(c[tb>>2]|0)>>>0){c[tb>>2]=Sb&255}while(1){if(!((APa(f)|0)<<24>>24==0)){Eb=609;break b}Sb=d[A>>0]|0;if((Sb|0)==44|(Sb|0)==137){Eb=532;break a}else if((Sb|0)==45){Eb=609;break}}break};case 136:{Wb=c[Nb>>2]|0;dc=(Wb&1|0)!=0?35:0;if((Wb&2|0)==0){md=dc}else{md=(a[pb>>0]|0)==0?dc:dc|128}if((Wb&4|0)==0){nd=md}else{nd=(a[nb>>0]|0)==0?md:md|256}if((Wb&32|0)==0){od=nd}else{od=(a[rb>>0]|0)==0?nd:nd|4096}c[Nb>>2]=od;Eb=609;break};case 138:{Wb=yb+(Mb+2<<2)|0;dc=c[Wb>>2]|0;Sb=yb+(Mb+1<<2)|0;Xb=c[Sb>>2]|0;c[Wb>>2]=c[Nb>>2];c[Sb>>2]=dc;c[Nb>>2]=Xb;Eb=609;break};case 139:{Xb=c[yb+(Mb+1<<2)>>2]|0;if((Xb|0)>(c[Nb>>2]|0)){c[Nb>>2]=Xb;Eb=609}else{Eb=609}break};case 140:{Xb=c[yb+(Mb+1<<2)>>2]|0;if((Xb|0)<(c[Nb>>2]|0)){c[Nb>>2]=Xb;Eb=609}else{Eb=609}break};case 142:{Xb=c[yb+(Mb+1<<2)>>2]|0;if((Xb+ -1|0)>>>0>1){if((a[F>>0]|0)==0){Eb=609;break b}else{Eb=542;break a}}else{a[vb>>0]=d[vb>>0]&(Xb^255)|((c[Nb>>2]|0)==0?0:Xb);Eb=609;break b}break};case 143:{nPa(f);Eb=609;break};case 141:{Xb=c[Nb>>2]|0;if((Xb|0)>-1){c[ub>>2]=Xb;Eb=609}else{Eb=609}break};case 127:case 126:case 89:case 33:{Eb=619;break};default:{if((Kb&255)>223){Xb=c[L>>2]|0;dc=c[M>>2]|0;Sb=c[Nb>>2]|0;Wb=Sb&65535;cc=c[yb+(Mb+1<<2)>>2]|0;Ub=cc+1|0;gc=Sb&65535;if((gc>>>0<(e[O>>1]|0)>>>0?Ub>>>0<((c[P>>2]|0)+1|0)>>>0:0)?(e[Q>>1]|0)<(e[R>>1]|0):0){if((Ub|0)==0){qd=0}else{qd=dd[c[v>>2]&511](f,cc)|0}cc=c[S>>2]|0;Ub=qd-cc|0;if((((Ub|0)<0?0-Ub|0:Ub)|0)<(c[T>>2]|0)){rd=(qd|0)>-1?cc:0-cc|0}else{rd=qd}if((b[U>>1]|0)==0){cc=c[(c[V>>2]|0)+(e[Q>>1]<<3)>>2]|0;Ub=(zPa(rd,b[W>>1]|0)|0)+cc|0;c[(c[X>>2]|0)+(gc<<3)>>2]=Ub;Ub=c[(c[V>>2]|0)+(e[Q>>1]<<3)+4>>2]|0;cc=(zPa(rd,b[Y>>1]|0)|0)+Ub|0;c[(c[X>>2]|0)+(gc<<3)+4>>2]=cc;cc=(c[X>>2]|0)+(gc<<3)|0;Ub=c[cc+4>>2]|0;Sb=(c[Z>>2]|0)+(gc<<3)|0;c[Sb>>2]=c[cc>>2];c[Sb+4>>2]=Ub}Ub=c[X>>2]|0;Sb=e[Q>>1]|0;cc=c[V>>2]|0;Vb=Qc[c[_>>2]&255](f,(c[Ub+(gc<<3)>>2]|0)-(c[cc+(Sb<<3)>>2]|0)|0,(c[Ub+(gc<<3)+4>>2]|0)-(c[cc+(Sb<<3)+4>>2]|0)|0)|0;Sb=c[Z>>2]|0;cc=e[Q>>1]|0;Ub=c[aa>>2]|0;Zb=Qc[c[$>>2]&255](f,(c[Sb+(gc<<3)>>2]|0)-(c[Ub+(cc<<3)>>2]|0)|0,(c[Sb+(gc<<3)+4>>2]|0)-(c[Ub+(cc<<3)+4>>2]|0)|0)|0;if((a[ba>>0]|0)==0){sd=rd}else{sd=(Vb^rd|0)<0?0-rd|0:rd}cc=a[A>>0]|0;Ub=cc&255;if((Ub&4|0)==0){td=cc;ud=rPa(f,sd,c[f+((Ub&3)<<2)+264>>2]|0)|0}else{if((b[ea>>1]|0)==(b[U>>1]|0)){cc=sd-Vb|0;vd=(((cc|0)<0?0-cc|0:cc)|0)>(dc|0)?Vb:sd}else{vd=sd}dc=Qc[c[y>>2]&255](f,vd,c[f+((Ub&3)<<2)+264>>2]|0)|0;td=a[A>>0]|0;ud=dc}do{if(!((td&8)==0)){if((Vb|0)>-1){wd=(ud|0)<(Xb|0)?Xb:ud;break}else{dc=0-Xb|0;wd=(ud|0)>(dc|0)?dc:ud;break}}else{wd=ud}}while(0);pd[c[da>>2]&127](f,N,Wb,wd-Zb|0);xd=a[A>>0]|0}else{if((a[F>>0]|0)==0){xd=Kb}else{c[K>>2]=134;xd=Kb}}b[fa>>1]=b[Q>>1]|0;if(!((xd&16)==0)){b[Q>>1]=Wb}b[ga>>1]=Wb;Eb=609;break b}if(!((Kb&255)>191)){if((Kb&255)>183){Xb=Db+65353&65535;if(!(Xb>>>0<(Cb+1-(c[D>>2]|0)|0)>>>0)){Eb=597;break a}c[x>>2]=(c[x>>2]|0)+1;if((Xb|0)!=0){Vb=0;dc=0;do{c[yb+(Vb+Mb<<2)>>2]=(yPa(f)|0)<<16>>16;dc=dc+1<<16>>16;Vb=dc&65535}while(Vb>>>0<Xb>>>0)}a[J>>0]=0;Eb=609;break b}if(!((Kb&255)>175)){nPa(f);Eb=609;break b}Xb=Db+65361&65535;if(!(Xb>>>0<(Cb+1-(c[D>>2]|0)|0)>>>0)){Eb=605;break a}if((Xb|0)==0){Eb=609;break b}Vb=Mb+ -1|0;dc=1;Wb=2;while(1){c[yb+(Vb+dc<<2)>>2]=d[(c[z>>2]|0)+((c[x>>2]|0)+dc)>>0]|0;Zb=Wb&65535;if(Zb>>>0>Xb>>>0){Eb=609;break b}dc=Zb;Wb=Wb+1<<16>>16}}Wb=c[L>>2]|0;dc=c[Nb>>2]|0;Xb=dc&65535;Vb=dc&65535;if(Vb>>>0<(e[O>>1]|0)>>>0?(dc=b[Q>>1]|0,Zb=dc&65535,(dc&65535)<(e[R>>1]|0)):0){do{if((b[ea>>1]|0)!=0?(b[U>>1]|0)!=0:0){dc=c[ha>>2]|0;Ub=dc+(Vb<<3)|0;cc=c[ia>>2]|0;gc=cc+(Zb<<3)|0;Sb=c[ja>>2]|0;fc=c[ka>>2]|0;if((Sb|0)==(fc|0)){bc=Qc[c[_>>2]&255](f,(c[Ub>>2]|0)-(c[gc>>2]|0)|0,(c[dc+(Vb<<3)+4>>2]|0)-(c[cc+(Zb<<3)+4>>2]|0)|0)|0;yd=SDa(bc,c[ja>>2]|0)|0;break}else{bc=SDa((c[Ub>>2]|0)-(c[gc>>2]|0)|0,Sb)|0;Sb=SDa((c[dc+(Vb<<3)+4>>2]|0)-(c[cc+(Zb<<3)+4>>2]|0)|0,fc)|0;yd=Qc[c[_>>2]&255](f,bc,Sb)|0;break}}else{Eb=579}}while(0);if((Eb|0)==579){Eb=0;Sb=c[X>>2]|0;bc=c[V>>2]|0;yd=Qc[c[_>>2]&255](f,(c[Sb+(Vb<<3)>>2]|0)-(c[bc+(Zb<<3)>>2]|0)|0,(c[Sb+(Vb<<3)+4>>2]|0)-(c[bc+(Zb<<3)+4>>2]|0)|0)|0}bc=c[S>>2]|0;Sb=yd-bc|0;if((((Sb|0)<0?0-Sb|0:Sb)|0)<(c[T>>2]|0)){zd=(yd|0)>-1?bc:0-bc|0}else{zd=yd}bc=a[A>>0]|0;Sb=bc&255;if((Sb&4|0)==0){Ad=bc;Bd=rPa(f,zd,c[f+((Sb&3)<<2)+264>>2]|0)|0}else{bc=Qc[c[y>>2]&255](f,zd,c[f+((Sb&3)<<2)+264>>2]|0)|0;Ad=a[A>>0]|0;Bd=bc}do{if(!((Ad&8)==0)){if((zd|0)>-1){Cd=(Bd|0)<(Wb|0)?Wb:Bd;break}else{bc=0-Wb|0;Cd=(Bd|0)>(bc|0)?bc:Bd;break}}else{Cd=Bd}}while(0);Wb=c[Z>>2]|0;Zb=c[aa>>2]|0;bc=e[Q>>1]|0;Sb=Qc[c[$>>2]&255](f,(c[Wb+(Vb<<3)>>2]|0)-(c[Zb+(bc<<3)>>2]|0)|0,(c[Wb+(Vb<<3)+4>>2]|0)-(c[Zb+(bc<<3)+4>>2]|0)|0)|0;pd[c[da>>2]&127](f,N,Xb,Cd-Sb|0);Dd=a[A>>0]|0}else{if((a[F>>0]|0)==0){Dd=Kb}else{c[K>>2]=134;Dd=Kb}}b[fa>>1]=b[Q>>1]|0;b[ga>>1]=Xb;if((Dd&16)==0){Eb=609}else{b[Q>>1]=Xb;Eb=609}}}}while(0);do{if((Eb|0)==609){Eb=0;Nb=c[K>>2]|0;if((Nb|0)==0){Eb=619;break}else if((Nb|0)!=128){Ed=Nb;Eb=627;break a}Nb=c[ma>>2]|0;yb=c[na>>2]|0;Cb=Nb+(yb*24|0)|0;if((yb|0)>0){Fd=Nb}else{Eb=618;break a}while(1){if((a[Fd+16>>0]|0)!=0?(a[A>>0]|0)==(c[Fd+12>>2]&255)<<24>>24:0){break}Nb=Fd+24|0;if(Nb>>>0<Cb>>>0){Fd=Nb}else{Eb=618;break a}}Cb=c[oa>>2]|0;if((Cb|0)>=(c[pa>>2]|0)){Eb=614;break a}Xb=c[qa>>2]|0;c[Xb+(Cb*20|0)>>2]=c[ra>>2];c[Xb+(Cb*20|0)+4>>2]=(c[x>>2]|0)+1;c[Xb+(Cb*20|0)+8>>2]=1;Vb=Fd+4|0;c[Xb+(Cb*20|0)+12>>2]=c[Vb>>2];c[Xb+(Cb*20|0)+16>>2]=c[Fd+8>>2];if((xPa(f,c[Fd>>2]|0,c[Vb>>2]|0)|0)<<24>>24==1){Eb=616;break a}else{Gd=xb}}}while(0);if((Eb|0)==619){Eb=0;c[D>>2]=c[H>>2];if((a[J>>0]|0)!=0){c[x>>2]=(c[x>>2]|0)+(c[B>>2]|0)}if((xb|0)>999999){Hd=139;Eb=630;break}else{Gd=xb+1|0}}wb=c[x>>2]|0;if((wb|0)>=(c[C>>2]|0)){Eb=623;break}if((a[la>>0]|0)!=0){Hd=0;Eb=630;break}else{xb=Gd}}switch(Eb|0){case 23:{c[K>>2]=129;Id=129;break};case 27:{c[K>>2]=130;Id=130;break};case 49:{c[K>>2]=134;Id=134;break};case 60:{c[K>>2]=134;Id=134;break};case 66:{c[K>>2]=134;Id=134;break};case 72:{c[K>>2]=134;Id=134;break};case 78:{c[K>>2]=134;Id=134;break};case 81:{c[K>>2]=132;Id=132;break};case 112:{c[K>>2]=134;Id=134;break};case 117:{c[K>>2]=134;Id=134;break};case 122:{c[K>>2]=134;Id=134;break};case 135:{c[K>>2]=130;Id=130;break};case 138:{c[K>>2]=134;Id=134;break};case 148:{c[K>>2]=130;Id=130;break};case 150:{c[K>>2]=134;Id=134;break};case 156:{c[K>>2]=140;Id=140;break};case 159:{c[K>>2]=140;Id=140;break};case 164:{c[K>>2]=137;Id=137;break};case 167:{c[K>>2]=136;Id=136;break};case 173:{c[K>>2]=134;Id=134;break};case 209:{c[K>>2]=134;Id=134;break};case 217:{c[K>>2]=134;Id=134;break};case 231:{c[K>>2]=134;Id=134;break};case 249:{c[K>>2]=134;Id=134;break};case 274:{c[K>>2]=134;Id=134;break};case 290:{c[K>>2]=134;Id=134;break};case 303:{c[K>>2]=134;Id=134;break};case 322:{c[K>>2]=130;Id=130;break};case 327:{c[K>>2]=130;Id=130;break};case 335:{c[K>>2]=134;Id=134;break};case 356:{c[K>>2]=134;Id=134;break};case 376:{c[K>>2]=135;Id=135;break};case 407:{c[K>>2]=133;Id=133;break};case 429:{c[K>>2]=134;Id=134;break};case 465:{c[K>>2]=134;Id=134;break};case 475:{c[K>>2]=134;Id=134;break};case 482:{c[K>>2]=134;Id=134;break};case 509:{c[K>>2]=134;Id=134;break};case 524:{c[K>>2]=141;Id=141;break};case 527:{c[K>>2]=141;Id=141;break};case 532:{c[K>>2]=137;Id=137;break};case 542:{c[K>>2]=134;Id=134;break};case 597:{c[K>>2]=130;Id=130;break};case 605:{c[K>>2]=130;Id=130;break};case 614:{c[K>>2]=134;Id=134;break};case 616:{Ed=c[K>>2]|0;Eb=627;break};case 618:{c[K>>2]=128;Id=128;break};case 623:{if((c[oa>>2]|0)>0){c[K>>2]=131;Id=131;break}else{Hd=0;i=g;return Hd|0}break};case 626:{c[K>>2]=131;Id=131;break};case 630:{i=g;return Hd|0}}if((Eb|0)==627){if((Ed|0)==0){Hd=0;i=g;return Hd|0}else{Id=Ed}}if((a[la>>0]|0)!=0){Hd=Id;i=g;return Hd|0}a[(c[f+4>>2]|0)+301>>0]=0;Hd=c[K>>2]|0;i=g;return Hd|0}function cPa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[(c[a+384>>2]|0)+(b<<2)>>2]|0;b=SDa(e,BPa(a)|0)|0;i=d;return b|0}function dPa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=TDa(d,BPa(a)|0)|0;c[(c[a+384>>2]|0)+(b<<2)>>2]=f;i=e;return}function ePa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=TDa(d,BPa(a)|0)|0;d=(c[a+384>>2]|0)+(b<<2)|0;c[d>>2]=(c[d>>2]|0)+f;i=e;return}function fPa(a,b){a=a|0;b=b|0;return c[(c[a+384>>2]|0)+(b<<2)>>2]|0}function gPa(a,b,d){a=a|0;b=b|0;d=d|0;c[(c[a+384>>2]|0)+(b<<2)>>2]=d;return}function hPa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=(c[a+384>>2]|0)+(b<<2)|0;c[e>>2]=(c[e>>2]|0)+d;return}function iPa(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;e=b[a+298>>1]|0;f=e<<16>>16;g=e<<16>>16==16384;do{if(!g){e=b[a+300>>1]|0;if(e<<16>>16==16384){h=b[a+296>>1]|0;c[a+564>>2]=h;j=b[a+294>>1]|0;k=h;break}else{h=b[a+294>>1]|0;l=ca(h<<16>>16,f)|0;m=(ca(b[a+296>>1]|0,e<<16>>16)|0)+l>>14;c[a+564>>2]=m;j=h;k=m;break}}else{m=b[a+294>>1]|0;h=m<<16>>16;c[a+564>>2]=h;j=m;k=h}}while(0);do{if(!(j<<16>>16==16384)){f=a+572|0;if((b[a+296>>1]|0)==16384){c[f>>2]=235;break}else{c[f>>2]=236;break}}else{c[a+572>>2]=234}}while(0);do{if((b[a+290>>1]|0)!=16384){j=a+576|0;if((b[a+292>>1]|0)==16384){c[j>>2]=235;break}else{c[j>>2]=237;break}}else{c[a+576>>2]=234}}while(0);j=a+584|0;c[j>>2]=68;f=a+588|0;c[f>>2]=69;h=a+564|0;do{if((k|0)==16384){if(g){c[j>>2]=70;c[f>>2]=71;break}if((b[a+300>>1]|0)==16384){c[j>>2]=72;c[f>>2]=73}}}while(0);if((((k|0)<0?0-k|0:k)|0)>=1024){n=a+256|0;c[n>>2]=0;i=d;return}c[h>>2]=16384;n=a+256|0;c[n>>2]=0;i=d;return}function jPa(b,d,f,g,h){b=b|0;d=d|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0;j=i;k=d&65535;if((e[b+116>>1]|0)>(d&65535)?(e[b+80>>1]|0)>(f&65535):0){d=f&65535;f=c[b+88>>2]|0;l=c[b+124>>2]|0;m=c[f+(d<<3)>>2]|0;n=c[l+(k<<3)>>2]|0;o=c[f+(d<<3)+4>>2]|0;d=c[l+(k<<3)+4>>2]|0;k=o-d|0;l=(m|0)==(n|0)&(o|0)==(d|0);d=l?16384:m-n|0;n=l|(g&1|0)==0;kPa(n?d:0-k|0,n?k:d,h);p=0;i=j;return p|0}if((a[b+561>>0]|0)==0){p=1;i=j;return p|0}c[b+12>>2]=134;p=1;i=j;return p|0}function kPa(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=i;do{if((((a|0)<0?0-a|0:a)|0)<16384?(((c|0)<0?0-c|0:c)|0)<16384:0){if((c|a|0)==0){i=e;return}else{f=a<<14;g=c<<14;break}}else{f=a;g=c}}while(0);c=(MDa(f,g)|0)<<2;b[d>>1]=TDa(f,c)|0;b[d+2>>1]=TDa(g,c)|0;i=e;return}function lPa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;a=i;if((b|0)>-1){d=b+32+c|0;i=a;return((b|0)!=0&(d|0)>0?d&-64:0)|0}else{d=0-(32-b+c&-64)|0;i=a;return((d|0)>0?0:d)|0}return 0}function mPa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;a=i;if((b|0)>-1){d=c+b&-64|32;i=a;return((b|0)!=0&(d|0)<0?0:d)|0}else{d=0-(c-b&-64|32)|0;i=a;return((d|0)>0?0:d)|0}return 0}function nPa(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;e=c[b+416>>2]|0;f=c[b+408>>2]|0;g=e+(f*24|0)|0;a:do{if((f|0)>0){h=a[b+368>>0]|0;j=e;while(1){if(h<<24>>24==(c[j+12>>2]&255)<<24>>24?(a[j+16>>0]|0)!=0:0){break}k=j+24|0;if(k>>>0<g>>>0){j=k}else{break a}}h=b+428|0;k=c[h>>2]|0;if((k|0)<(c[b+432>>2]|0)){l=c[b+436>>2]|0;c[h>>2]=k+1;c[l+(k*20|0)>>2]=c[b+352>>2];c[l+(k*20|0)+4>>2]=(c[b+360>>2]|0)+1;c[l+(k*20|0)+8>>2]=1;h=j+4|0;c[l+(k*20|0)+12>>2]=c[h>>2];c[l+(k*20|0)+16>>2]=c[j+8>>2];xPa(b,c[j>>2]|0,c[h>>2]|0)|0;a[b+376>>0]=0;i=d;return}else{c[b+12>>2]=130;i=d;return}}}while(0);c[b+12>>2]=128;i=d;return}function oPa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;a=i;if((b|0)>-1){d=b+16+c|0;i=a;return((b|0)!=0&(d|0)>0?d&-32:0)|0}else{d=0-(16-b+c&-32)|0;i=a;return((d|0)>0?0:d)|0}return 0}function pPa(a){a=a|0;var b=0,c=0,d=0;b=i;c=e[a+252>>1]|0;d=SDa(c,BPa(a)|0)|0;i=b;return d|0}function qPa(f,g){f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;h=i;j=f+28|0;a:do{if((g|0)!=0){k=f+24|0;l=f+36|0;m=f+44|0;n=f+368|0;o=f+332|0;p=f+334|0;q=f+584|0;r=f+561|0;s=f+12|0;t=2;while(1){u=c[j>>2]|0;if((u|0)<2){break}v=u+ -2|0;c[j>>2]=v;w=c[k>>2]|0;x=c[w+(u+ -1<<2)>>2]|0;u=x&65535;y=c[w+(v<<2)>>2]|0;if((x&65535)>>>0<(e[m>>1]|0)>>>0){x=y>>>4&15;v=d[n>>0]|0;if((v|0)==113){z=x|16}else if((v|0)==114){z=x|32}else{z=x}x=(b[o>>1]|0)+z|0;if((pPa(f)|0)==(x|0)){x=y&15;y=x+ -8|0;pd[c[q>>2]&127](f,l,u,(((y|0)>-1?x+ -7|0:y)<<6|0)/(1<<b[p>>1]|0)|0)}}else{if((a[r>>0]|0)!=0){c[s>>2]=134}}if(t>>>0>g>>>0){break a}t=t+1|0}if((a[r>>0]|0)!=0){c[s>>2]=129}c[j>>2]=0;A=0;B=f+32|0;c[B>>2]=A;i=h;return}}while(0);A=c[j>>2]|0;B=f+32|0;c[B>>2]=A;i=h;return}function rPa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;a=i;if((b|0)>-1){d=c+b|0;i=a;return((b|0)!=0&(d|0)<0?0:d)|0}else{d=b-c|0;i=a;return((d|0)>0?0:d)|0}return 0}function sPa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=d&192;if((f|0)==192){c[a+476>>2]=b}else if((f|0)==128){c[a+476>>2]=b<<1}else if((f|0)==64){c[a+476>>2]=b}else if((f|0)==0){c[a+476>>2]=(b|0)/2|0}b=d&48;if((b|0)==32){c[a+480>>2]=(c[a+476>>2]|0)/2|0}else if((b|0)==0){c[a+480>>2]=0}else if((b|0)==48){c[a+480>>2]=((c[a+476>>2]|0)*3|0)/4|0}else if((b|0)==16){c[a+480>>2]=(c[a+476>>2]|0)/4|0}b=d&15;if((b|0)==0){d=c[a+476>>2]|0;f=d+ -1|0;c[a+484>>2]=f;g=d;h=f}else{f=c[a+476>>2]|0;d=(ca(f,b+ -4|0)|0)/8|0;c[a+484>>2]=d;g=f;h=d}c[a+476>>2]=(g|0)/256|0;g=a+480|0;c[g>>2]=(c[g>>2]|0)/256|0;c[a+484>>2]=(h|0)/256|0;i=e;return}function tPa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;if((b|0)>-1){f=c[a+480>>2]|0;g=d+b-f+(c[a+484>>2]|0)&0-(c[a+476>>2]|0);h=((b|0)!=0&(g|0)<0?0:g)+f|0;i=e;return h|0}else{f=c[a+480>>2]|0;g=0-(d-b+(c[a+484>>2]|0)-f&0-(c[a+476>>2]|0))|0;h=((g|0)>0?0:g)-f|0;i=e;return h|0}return 0}function uPa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;if((b|0)>-1){f=c[a+480>>2]|0;g=d+b-f+(c[a+484>>2]|0)|0;h=g-((g|0)%(c[a+476>>2]|0)|0)|0;j=((b|0)!=0&(h|0)<0?0:h)+f|0;i=e;return j|0}else{f=c[a+480>>2]|0;h=d-b+(c[a+484>>2]|0)-f|0;b=((h|0)%(c[a+476>>2]|0)|0)-h|0;j=((b|0)>0?0:b)-f|0;i=e;return j|0}return 0}function vPa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;a=i;if((b|0)>-1){d=b+63+c|0;i=a;return((b|0)!=0&(d|0)>0?d&-64:0)|0}else{d=0-(63-b+c&-64)|0;i=a;return((d|0)>0?0:d)|0}return 0}function wPa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;a=i;if((b|0)>-1){d=c+b|0;i=a;return((b|0)!=0&(d|0)>0?d&-64:0)|0}else{d=0-(c-b&-64)|0;i=a;return((d|0)>0?0:d)|0}return 0}function xPa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=b+ -1|0;if(f>>>0>2){c[a+12>>2]=132;g=1;i=e;return g|0}h=c[a+(f<<3)+444>>2]|0;if((h|0)==0){c[a+12>>2]=138;g=1;i=e;return g|0}j=c[a+(f<<3)+448>>2]|0;if(j>>>0<d>>>0){c[a+12>>2]=131;g=1;i=e;return g|0}else{c[a+356>>2]=h;c[a+364>>2]=j;c[a+360>>2]=d;c[a+352>>2]=b;g=0;i=e;return g|0}return 0}function yPa(a){a=a|0;var b=0,e=0;b=a+360|0;e=c[b>>2]|0;c[b>>2]=e+2;b=c[a+356>>2]|0;return((d[b+e>>0]|0)<<8|(d[b+(e+1)>>0]|0))&65535|0}function zPa(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;c=(a|0)<0?0-a|0:a;d=(b|0)<0?0-b|0:b;e=ca(c>>>16,d)|0;f=e<<16|8192;g=f+(ca(c&65535,d)|0)|0;d=(g>>>0<f>>>0&1)+(e>>>16)<<18|g>>>14;return((b^a|0)>-1?d:0-d|0)|0}function APa(b){b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;f=b+372|0;g=b+360|0;h=(c[g>>2]|0)+(c[f>>2]|0)|0;c[g>>2]=h;g=c[b+364>>2]|0;do{if((h|0)<(g|0)){j=c[b+356>>2]|0;k=a[j+h>>0]|0;a[b+368>>0]=k;l=k&255;k=a[1277400+l>>0]|0;c[f>>2]=k;if((l&254|0)==64){l=h+1|0;if((l|0)>=(g|0)){break}m=2-(ca(d[j+l>>0]|0,k)|0)|0;c[f>>2]=m;n=m}else{n=k}if((n+h|0)<=(g|0)){o=0;i=e;return o|0}}}while(0);c[b+12>>2]=131;o=1;i=e;return o|0}function BPa(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=a+244|0;f=a+256|0;g=c[f>>2]|0;if((g|0)!=0){h=g;i=d;return h|0}g=b[a+296>>1]|0;if(g<<16>>16==0){j=c[e>>2]|0;c[f>>2]=j;h=j;i=d;return h|0}j=b[a+294>>1]|0;if(j<<16>>16==0){k=c[a+248>>2]|0;c[f>>2]=k;h=k;i=d;return h|0}else{k=zPa(c[e>>2]|0,j<<16>>16)|0;j=MDa(k,zPa(c[a+248>>2]|0,g<<16>>16)|0)|0;c[f>>2]=j;h=j;i=d;return h|0}return 0}function CPa(e,f,g,h,j){e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0;k=i;l=e+124|0;m=c[l>>2]|0;if((m|0)==0){i=k;return}if((b[e+298>>1]|0)!=0?(n=f&65535,o=m+(n<<3)|0,c[o>>2]=(c[o>>2]|0)+g,!(j<<24>>24==0)):0){g=(c[e+132>>2]|0)+n|0;a[g>>0]=d[g>>0]|8}if((b[e+300>>1]|0)==0){i=k;return}g=f&65535;f=(c[l>>2]|0)+(g<<3)+4|0;c[f>>2]=(c[f>>2]|0)+h;if(j<<24>>24==0){i=k;return}j=(c[e+132>>2]|0)+g|0;a[j>>0]=d[j>>0]|16;i=k;return}function DPa(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;j=i;i=i+16|0;k=j;if((a[d+368>>0]&1)==0){l=d+72|0;m=c[l>>2]|0;n=c[l+4>>2]|0;l=c[d+80>>2]|0;o=c[d+84>>2]|0;p=c[d+88>>2]|0;q=d+92|0;c[k+0>>2]=c[q+0>>2];c[k+4>>2]=c[q+4>>2];c[k+8>>2]=c[q+8>>2];c[k+12>>2]=c[q+12>>2];r=m;s=n;t=d+288|0;u=l;v=o;w=p}else{p=d+36|0;o=c[p>>2]|0;l=c[p+4>>2]|0;p=c[d+44>>2]|0;n=c[d+48>>2]|0;m=c[d+52>>2]|0;q=d+56|0;c[k+0>>2]=c[q+0>>2];c[k+4>>2]=c[q+4>>2];c[k+8>>2]=c[q+8>>2];c[k+12>>2]=c[q+12>>2];r=o;s=l;t=d+286|0;u=p;v=n;w=m}m=u&65535;n=b[t>>1]|0;t=n&65535;if((n&65535)<(m&65535)){p=g;c[p>>2]=r;c[p+4>>2]=s;b[g+8>>1]=m;b[g+10>>1]=u>>>16;c[g+12>>2]=v;c[g+16>>2]=w;u=g+20|0;c[u+0>>2]=c[k+0>>2];c[u+4>>2]=c[k+4>>2];c[u+8>>2]=c[k+8>>2];c[u+12>>2]=c[k+12>>2];b[h>>1]=n;n=Qc[c[d+572>>2]&255](d,(c[w+(t<<3)>>2]|0)-(c[v+(t<<3)>>2]|0)|0,(c[w+(t<<3)+4>>2]|0)-(c[v+(t<<3)+4>>2]|0)|0)|0;t=d+564|0;c[e>>2]=ODa(n,b[d+298>>1]|0,c[t>>2]|0)|0;c[f>>2]=ODa(n,b[d+300>>1]|0,c[t>>2]|0)|0;x=0;i=j;return x|0}if((a[d+561>>0]|0)!=0){c[d+12>>2]=134}b[h>>1]=0;x=1;i=j;return x|0}function EPa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;g=i;if(b>>>0>d>>>0){i=g;return}h=c[a+12>>2]|0;if(!(h>>>0>e>>>0&h>>>0>f>>>0)){i=g;return}h=a+8|0;j=c[h>>2]|0;k=c[j+(e<<3)>>2]|0;l=c[j+(f<<3)>>2]|0;j=(k|0)>(l|0);m=j?k:l;n=j?l:k;k=j?e:f;l=j?f:e;e=c[a>>2]|0;f=c[e+(l<<3)>>2]|0;j=c[e+(k<<3)>>2]|0;o=a+4|0;p=c[o>>2]|0;q=c[p+(l<<3)>>2]|0;l=q-f|0;r=c[p+(k<<3)>>2]|0;k=r-j|0;if((n|0)==(m|0)){s=e;t=p;p=b;while(1){u=c[s+(p<<3)>>2]|0;c[t+(p<<3)>>2]=((u|0)>(f|0)?k:l)+u;u=p+1|0;if(u>>>0>d>>>0){break}s=c[a>>2]|0;t=c[o>>2]|0;p=u}i=g;return}p=r-q|0;r=m-n|0;m=e;e=b;b=0;t=0;while(1){s=c[m+(e<<3)>>2]|0;do{if((s|0)>(f|0)){if((s|0)>=(j|0)){v=b;w=t;x=s+k|0;break}if(t<<24>>24==0){y=TDa(p,r)|0;z=1}else{y=b;z=t}v=y;w=z;x=(SDa((c[(c[h>>2]|0)+(e<<3)>>2]|0)-n|0,y)|0)+q|0}else{v=b;w=t;x=s+l|0}}while(0);c[(c[o>>2]|0)+(e<<3)>>2]=x;s=e+1|0;if(s>>>0>d>>>0){break}m=c[a>>2]|0;e=s;b=v;t=w}i=g;return}function FPa(a,b,c){a=a|0;b=b|0;c=c|0;return b|0}function GPa(a,b,c){a=a|0;b=b|0;c=c|0;return c|0}function HPa(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0;e=i;f=PPa(c,d,b[a+294>>1]|0,b[a+296>>1]|0)|0;i=e;return f|0}function IPa(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0;e=i;f=PPa(c,d,b[a+290>>1]|0,b[a+292>>1]|0)|0;i=e;return f|0}function JPa(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0;j=i;k=b[e+298>>1]|0;if(!(k<<16>>16==0)){l=ODa(h,k<<16>>16,c[e+564>>2]|0)|0;k=g&65535;m=(c[f+16>>2]|0)+(k<<3)|0;c[m>>2]=(c[m>>2]|0)+l;l=(c[f+24>>2]|0)+k|0;a[l>>0]=d[l>>0]|0|8}l=b[e+300>>1]|0;if(l<<16>>16==0){i=j;return}k=ODa(h,l<<16>>16,c[e+564>>2]|0)|0;e=g&65535;g=(c[f+16>>2]|0)+(e<<3)+4|0;c[g>>2]=(c[g>>2]|0)+k;k=(c[f+24>>2]|0)+e|0;a[k>>0]=d[k>>0]|0|16;i=j;return}function KPa(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;h=b[a+298>>1]|0;if(!(h<<16>>16==0)){j=ODa(f,h<<16>>16,c[a+564>>2]|0)|0;h=(c[d+12>>2]|0)+((e&65535)<<3)|0;c[h>>2]=(c[h>>2]|0)+j}j=b[a+300>>1]|0;if(j<<16>>16==0){i=g;return}h=ODa(f,j<<16>>16,c[a+564>>2]|0)|0;a=(c[d+12>>2]|0)+((e&65535)<<3)+4|0;c[a>>2]=(c[a>>2]|0)+h;i=g;return}function LPa(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;b=f&65535;f=(c[e+16>>2]|0)+(b<<3)|0;c[f>>2]=(c[f>>2]|0)+g;g=(c[e+24>>2]|0)+b|0;a[g>>0]=d[g>>0]|0|8;return}function MPa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=(c[b+12>>2]|0)+((d&65535)<<3)|0;c[a>>2]=(c[a>>2]|0)+e;return}function NPa(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;b=f&65535;f=(c[e+16>>2]|0)+(b<<3)+4|0;c[f>>2]=(c[f>>2]|0)+g;g=(c[e+24>>2]|0)+b|0;a[g>>0]=d[g>>0]|0|16;return}function OPa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=(c[b+12>>2]|0)+((d&65535)<<3)+4|0;c[a>>2]=(c[a>>2]|0)+e;return}function PPa(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;e=ca(a&65535,c)|0;f=ca(a>>16,c)|0;c=(f<<16)+e|0;a=ca(b&65535,d)|0;g=ca(b>>16,d)|0;d=(g<<16)+a|0;b=d+c|0;h=(f>>16)+(e>>31)+(a>>31)+(g>>16)+(c>>>0<e>>>0&1)+(d>>>0<a>>>0&1)+(b>>>0<c>>>0&1)|0;c=h>>31;a=c+b|0;return c+h+(a>>>0<b>>>0&1)+(a>>>0>4294959103&1)<<18|(a+8192|0)>>>14|0}function QPa(a){a=a|0;var d=0,e=0,f=0;d=i;e=c[a+8>>2]|0;b[a+440>>1]=0;b[a+442>>1]=0;f=a+24|0;aEa(e,c[f>>2]|0);c[f>>2]=0;c[a+20>>2]=0;f=a+436|0;aEa(e,c[f>>2]|0);c[f>>2]=0;c[a+432>>2]=0;c[a+428>>2]=0;f=a+392|0;aEa(e,c[f>>2]|0);c[f>>2]=0;c[a+388>>2]=0;c[a+4>>2]=0;c[a>>2]=0;aEa(e,a);i=d;return}function RPa(d){d=d|0;var e=0,f=0,g=0;e=i;f=c[(c[d>>2]|0)+100>>2]|0;g=d+292|0;if((a[g>>0]|0)!=0){c[d+296>>2]=0;a[g>>0]=0}g=d+244|0;aEa(f,c[g>>2]|0);c[g>>2]=0;c[d+240>>2]=0;g=d+252|0;aEa(f,c[g>>2]|0);c[g>>2]=0;b[d+248>>1]=0;SPa(d+256|0);g=d+124|0;aEa(f,c[g>>2]|0);c[g>>2]=0;aEa(f,c[d+136>>2]|0);c[d+116>>2]=0;c[d+120>>2]=0;f=d+128|0;a[d+300>>0]=0;g=d+301|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;a[g>>0]=0;i=e;return}function SPa(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;if((d|0)==0){i=b;return}e=a+28|0;aEa(d,c[e>>2]|0);c[e>>2]=0;e=a+24|0;aEa(d,c[e>>2]|0);c[e>>2]=0;e=a+16|0;aEa(d,c[e>>2]|0);c[e>>2]=0;e=a+12|0;aEa(d,c[e>>2]|0);c[e>>2]=0;e=a+20|0;aEa(d,c[e>>2]|0);c[e>>2]=0;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;i=b;return}function TPa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;b=i;f=c[a+24>>2]|0;g=uFa(f,d)|0;if((g|0)!=0){h=g;i=b;return h|0}g=CFa(f,e)|0;if((g|0)!=0){h=g;i=b;return h|0}c[a+200>>2]=c[f+32>>2];c[a+204>>2]=c[f+36>>2];h=0;i=b;return h|0}function UPa(a){a=a|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=a+200|0;g=c[f>>2]|0;h=g+10|0;if(h>>>0>(c[a+204>>2]|0)>>>0){j=20;i=e;return j|0}b[a+32>>1]=(d[g>>0]|0)<<8|(d[g+1>>0]|0);c[a+36>>2]=((d[g+2>>0]|0)<<8|(d[g+3>>0]|0))<<16>>16;c[a+40>>2]=((d[g+4>>0]|0)<<8|(d[g+5>>0]|0))<<16>>16;c[a+44>>2]=((d[g+6>>0]|0)<<8|(d[g+7>>0]|0))<<16>>16;c[a+48>>2]=((d[g+8>>0]|0)<<8|(d[g+9>>0]|0))<<16>>16;c[f>>2]=h;j=0;i=e;return j|0}function VPa(f){f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;g=i;h=f+200|0;j=c[h>>2]|0;k=c[f+204>>2]|0;l=c[f+12>>2]|0;m=b[f+32>>1]|0;n=m<<16>>16;o=c[f>>2]|0;if(!(m<<16>>16==0)){if(((b[l+20>>1]|0)+n+(b[l+56>>1]|0)|0)>>>0>(c[l+8>>2]|0)>>>0?(p=fEa(l,0,n)|0,(p|0)!=0):0){q=p;i=g;return q|0}if(m<<16>>16>4094){q=20;i=g;return q|0}}p=c[l+68>>2]|0;r=p+(n<<1)|0;if((j+((n<<1)+2)|0)>>>0>k>>>0){q=20;i=g;return q|0}n=d[j>>0]<<8;s=n|d[j+1>>0];t=m<<16>>16>0;if(t){b[p>>1]=s}if((n&32768|0)==0){u=p;v=j;w=s}else{q=20;i=g;return q|0}while(1){x=v+2|0;s=u+2|0;if(!(s>>>0<r>>>0)){break}j=w;w=d[x>>0]<<8|d[v+3>>0];b[s>>1]=w;if((w<<16|0)<=(j<<16|0)){q=20;y=49;break}else{u=s;v=x}}if((y|0)==49){i=g;return q|0}do{if(t){w=b[u>>1]|0;r=w+1|0;if((r|0)>=0){s=w+5|0;if((s|0)==0){z=r;break}else{A=s;B=r;y=14;break}}else{q=20;i=g;return q|0}}else{A=4;B=0;y=14}}while(0);if((y|0)==14){if(((b[l+22>>1]|0)+A+(b[l+58>>1]|0)|0)>>>0>(c[l+4>>2]|0)>>>0?(u=fEa(l,A,0)|0,(u|0)!=0):0){q=u;i=g;return q|0}else{z=B}}B=f+8|0;c[(c[B>>2]|0)+140>>2]=0;c[(c[B>>2]|0)+136>>2]=0;u=v+4|0;if(u>>>0>k>>>0){q=20;i=g;return q|0}A=d[x>>0]<<8|d[v+3>>0];if(A>>>0>(e[o+286>>1]|0)>>>0){q=22;i=g;return q|0}if((k-u|0)<(A|0)){q=22;i=g;return q|0}if((c[f+16>>2]&2|0)==0){c[(c[B>>2]|0)+140>>2]=A;o=f+160|0;c[(c[B>>2]|0)+136>>2]=c[(c[o>>2]|0)+392>>2];c3a(c[(c[o>>2]|0)+392>>2]|0,u|0,A|0)|0}u=l+64|0;o=c[u>>2]|0;if((o|0)==0){q=20;i=g;return q|0}B=v+(A+4)|0;A=o+z|0;v=(z|0)>0;do{if(v){f=o;x=B;while(1){t=x+1|0;if(t>>>0>k>>>0){q=20;y=49;break}r=a[x>>0]|0;s=f+1|0;a[f>>0]=r;if(!((r&8)==0)){w=x+2|0;if(w>>>0>k>>>0){q=20;y=49;break}j=a[t>>0]|0;if((f+((j&255)+1)|0)>>>0>A>>>0){q=20;y=49;break}if(j<<24>>24==0){C=s;D=w}else{p=j+ -1<<24>>24&255;f3a(s|0,r|0,p+1|0)|0;C=f+(p+2)|0;D=w}}else{C=s;D=t}if(C>>>0<A>>>0){f=C;x=D}else{y=30;break}}if((y|0)==30){E=c[u>>2]|0;F=D;break}else if((y|0)==49){i=g;return q|0}}else{E=o;F=B}}while(0);B=l+60|0;o=c[B>>2]|0;D=o+(z<<3)|0;if(F>>>0>k>>>0){q=20;i=g;return q|0}a:do{if(v){C=E;A=F;x=o;f=0;while(1){t=d[C>>0]|0;if((t&2|0)==0){if((t&16|0)==0){s=A+2|0;if(s>>>0>k>>>0){q=20;y=49;break}G=s;H=(d[A>>0]<<8|d[A+1>>0])<<16>>16}else{G=A;H=0}}else{s=A+1|0;if(s>>>0>k>>>0){q=20;y=49;break}w=d[A>>0]|0;G=s;H=(t&16|0)==0?0-w|0:w}f=H+f|0;c[x>>2]=f;a[C>>0]=t&237;x=x+8|0;if(!(x>>>0<D>>>0)){y=40;break}else{C=C+1|0;A=G}}if((y|0)==40){A=c[B>>2]|0;C=A+(z<<3)|0;x=c[u>>2]|0;f=G;t=A;A=0;while(1){w=d[x>>0]|0;if((w&4|0)==0){if((w&32|0)==0){s=f+2|0;if(s>>>0>k>>>0){q=20;y=49;break}I=s;J=(d[f>>0]<<8|d[f+1>>0])<<16>>16}else{I=f;J=0}}else{s=f+1|0;if(s>>>0>k>>>0){q=20;y=49;break}p=d[f>>0]|0;I=s;J=(w&32|0)==0?0-p|0:p}A=J+A|0;c[t+4>>2]=A;a[x>>0]=w&1;t=t+8|0;if(!(t>>>0<C>>>0)){K=I;break a}else{x=x+1|0;f=I}}if((y|0)==49){i=g;return q|0}}else if((y|0)==49){i=g;return q|0}}else{K=F}}while(0);b[l+58>>1]=z;b[l+56>>1]=m;c[h>>2]=K;q=0;i=g;return q|0}function WPa(e){e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;f=i;g=e+200|0;h=c[e+204>>2]|0;j=c[e+12>>2]|0;k=j+88|0;l=0;m=c[g>>2]|0;while(1){n=l;l=l+1|0;o=gEa(j,l)|0;if((o|0)!=0){p=o;q=21;break}o=m+4|0;if(o>>>0>h>>>0){p=21;q=21;break}r=c[k>>2]|0;s=r+(n<<5)+12|0;c[s>>2]=0;t=r+(n<<5)+8|0;c[t>>2]=0;u=d[m+1>>0]|0;v=(d[m>>0]<<8|u)&65535;b[r+(n<<5)+4>>1]=v;c[r+(n<<5)>>2]=d[m+2>>0]<<8|d[m+3>>0];w=(v&1)==0;x=w?2:4;y=(u&8|0)==0;do{if(y){if((u&64|0)==0){z=u>>>4&8|x;break}else{z=x+4|0;break}}else{z=x+2|0}}while(0);if((m+(z+4)|0)>>>0>h>>>0){p=21;q=21;break}if(w){c[t>>2]=a[o>>0]|0;A=m+6|0;B=a[m+5>>0]|0}else{c[t>>2]=(d[o>>0]<<8|d[m+5>>0])<<16>>16;A=m+8|0;B=(d[m+6>>0]<<8|d[m+7>>0])<<16>>16}c[s>>2]=B;do{if(y){if((u&64|0)!=0){C=A+4|0;D=(d[A>>0]<<8|d[A+1>>0])<<16>>14;E=0;F=0;G=(d[A+2>>0]<<8|d[A+3>>0])<<16>>14;break}if((u&128|0)==0){C=A;D=65536;E=0;F=0;G=65536}else{C=A+8|0;D=(d[A>>0]<<8|d[A+1>>0])<<16>>14;E=(d[A+4>>0]<<8|d[A+5>>0])<<16>>14;F=(d[A+2>>0]<<8|d[A+3>>0])<<16>>14;G=(d[A+6>>0]<<8|d[A+7>>0])<<16>>14}}else{x=(d[A>>0]<<8|d[A+1>>0])<<16>>14;C=A+2|0;D=x;E=0;F=0;G=x}}while(0);c[r+(n<<5)+16>>2]=D;c[r+(n<<5)+20>>2]=E;c[r+(n<<5)+24>>2]=F;c[r+(n<<5)+28>>2]=G;if((v&32)==0){q=20;break}else{m=C}}if((q|0)==20){c[j+84>>2]=l;c[e+168>>2]=C+(zFa(c[(c[e+24>>2]|0)+8>>2]|0)|0)-h;c[g>>2]=C;p=0;i=f;return p|0}else if((q|0)==21){i=f;return p|0}return 0}function XPa(a){a=a|0;var b=0;b=i;FFa(c[a+24>>2]|0);i=b;return}function YPa(a,e,f){a=a|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;g=i;if((c[a+684>>2]|0)>>>0>e>>>0){h=c[a+688>>2]|0;if((b[a+210>>1]|0)==0){j=e<<1;k=(d[h+j>>0]<<8|d[h+(j|1)>>0])<<1;l=(d[h+(j+2)>>0]<<8|d[h+(j+3)>>0])<<1}else{j=e<<2;k=d[h+(j|1)>>0]<<16|d[h+j>>0]<<24|d[h+(j|2)>>0]<<8|d[h+(j|3)>>0];l=d[h+(j+5)>>0]<<16|d[h+(j+4)>>0]<<24|d[h+(j+6)>>0]<<8|d[h+(j+7)>>0]}j=c[a+664>>2]|0;if(k>>>0>j>>>0){m=0;n=0;c[f>>2]=n;i=g;return m|0}else{o=j;p=k;q=l}}else{o=c[a+664>>2]|0;p=0;q=0}a=q>>>0>o>>>0?o:q;m=p;n=(a>>>0<p>>>0?o:a)-p|0;c[f>>2]=n;i=g;return m|0}function ZPa(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=i;if((a[d+292>>0]|0)==0){b[f>>1]=0;b[g>>1]=b[d+68>>1]|0;i=h;return}else{ed[c[(c[d+528>>2]|0)+112>>2]&127](d,1,e,f,g)|0;i=h;return}}\n\n\n\nfunction SBa(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;f=i;if((e|0)==0){i=f;return}g=c[b>>2]|0;if((g|0)!=0){v2a(g)}g=w2a(256,4)|0;c[b>>2]=g;if((g|0)==0){i=f;return}g=(c[e+16>>2]|0)/8|0;h=c[e+8>>2]|0;j=c[e+12>>2]|0;k=b+4|0;l=c[k>>2]|0;if((l|0)!=0){v2a(l);c[k>>2]=0}l=b+8|0;m=c[l>>2]|0;if((m|0)!=0){v2a(m);c[l>>2]=0}m=w2a(4096,4)|0;c[k>>2]=m;if((m|0)==0){i=f;return}m=w2a(4096,4)|0;c[l>>2]=m;if((m|0)==0){i=f;return}n=b+12|0;c[n>>2]=0;if((j|0)>0){o=(h|0)>0;p=0;do{q=dd[c[(c[e>>2]|0)+12>>2]&511](e,p)|0;if(o){r=0;do{s=ca(r,g)|0;t=(c[l>>2]|0)+((a[q+(s+1)>>0]&240|(d[q+s>>0]|0)>>>4|(d[q+(s+2)>>0]|0)<<4&3840)<<2)|0;c[t>>2]=(c[t>>2]|0)+1;r=r+1|0}while((r|0)!=(h|0))}p=p+1|0}while((p|0)!=(j|0));u=c[l>>2]|0;v=0}else{u=m;v=0}while(1){m=c[u+(v<<2)>>2]|0;if((m|0)==0){w=u}else{c[u+(c[n>>2]<<2)>>2]=m;c[(c[k>>2]|0)+(c[n>>2]<<2)>>2]=v;c[n>>2]=(c[n>>2]|0)+1;w=c[l>>2]|0}v=v+1|0;if((v|0)==4096){break}else{u=w}}PBa(w,c[k>>2]|0,0,(c[n>>2]|0)+ -1|0);QBa(c[l>>2]|0,c[k>>2]|0,c[b>>2]|0,c[n>>2]|0);i=f;return}function TBa(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;l=i;if((g|0)<=0){i=l;return}m=j+f|0;n=(f|0)>0;o=0;do{p=b+(ca(o,e)|0)|0;f3a(p|0,0,f|0)|0;q=dd[c[(c[h>>2]|0)+12>>2]&511](h,o+k|0)|0;if(n){r=j;s=p;while(1){if((1<<7-((r|0)%8|0)&(d[q+((r|0)/8|0)>>0]|0)|0)!=0){a[s>>0]=-1}r=r+1|0;if((r|0)>=(m|0)){break}else{s=s+1|0}}}o=o+1|0}while((o|0)!=(g|0));i=l;return}function UBa(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0;j=i;if((e|0)<=0){i=j;return}k=0;do{l=a+(ca(k,b)|0)|0;c3a(l|0,(dd[c[(c[f>>2]|0)+12>>2]&511](f,k+h|0)|0)+g|0,d|0)|0;k=k+1|0}while((k|0)!=(e|0));i=j;return}function VBa(b,e,f,g,h,j,k,l){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;m=i;i=i+16|0;n=m+14|0;o=m;p=m+13|0;q=m+12|0;r=m+11|0;s=m+10|0;t=m+9|0;u=m+8|0;v=c[h+28>>2]|0;w=(c[h+20>>2]&4|0)!=0;if((l|0)==0){x=c[v>>2]|0;if(w){dX(x>>>24&255,x>>>16&255,x>>>8&255,x&255,p,q,r);y=c[v+4>>2]|0;dX(y>>>24&255,y>>>16&255,y>>>8&255,y&255,s,t,u);z=a[r>>0]|0;A=a[q>>0]|0;B=a[p>>0]|0;C=a[u>>0]|0;D=a[t>>0]|0;E=a[s>>0]|0}else{y=x>>>16&255;a[p>>0]=y;p=x>>>8&255;a[q>>0]=p;q=x&255;a[r>>0]=q;r=c[v+4>>2]|0;x=r>>>16&255;a[s>>0]=x;s=r>>>8&255;a[t>>0]=s;t=r&255;a[u>>0]=t;z=q;A=p;B=y;C=t;D=s;E=x}a[n>>0]=((((A&255)*59|0)+((z&255)*11|0)+((B&255)*30|0)|0)>>>0)/100|0;a[n+1>>0]=((((D&255)*59|0)+((C&255)*11|0)+((E&255)*30|0)|0)>>>0)/100|0}else{if(w){c[o>>2]=e3a(c[v>>2]|0)|0;c[o+4>>2]=e3a(c[v+4>>2]|0)|0;F=o}else{a[o>>0]=c[v>>2];a[o+1>>0]=(c[v>>2]|0)>>>8;a[o+2>>0]=(c[v>>2]|0)>>>16;w=v+4|0;a[o+3>>0]=c[w>>2];a[o+4>>0]=(c[w>>2]|0)>>>8;a[o+5>>0]=(c[w>>2]|0)>>>16;F=o}o=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;Fc[c[(c[o>>2]|0)+36>>2]&63](o,l,n,F,2)}if((g|0)<=0){i=m;return}F=j+f|0;l=(f|0)>0;o=n+1|0;w=0;do{v=b+(ca(w,e)|0)|0;f3a(v|0,a[n>>0]|0,f|0)|0;E=dd[c[(c[h>>2]|0)+12>>2]&511](h,w+k|0)|0;if(l){C=j;D=v;while(1){if((1<<7-((C|0)%8|0)&(d[E+((C|0)/8|0)>>0]|0)|0)!=0){a[D>>0]=a[o>>0]|0}C=C+1|0;if((C|0)>=(F|0)){break}else{D=D+1|0}}}w=w+1|0}while((w|0)!=(g|0));i=m;return}function WBa(b,e,f,g,h,j,k,l){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;m=i;i=i+1296|0;n=m+1032|0;o=m;p=m+1026|0;q=m+1025|0;r=m+1024|0;s=c[h+28>>2]|0;if((l|0)==0){if((c[h+20>>2]&4|0)==0){t=0;do{u=c[s+(t<<2)>>2]|0;a[n+t>>0]=((((u>>>8&255)*59|0)+((u&255)*11|0)+((u>>>16&255)*30|0)|0)>>>0)/100|0;t=t+1|0}while((t|0)!=256)}else{t=0;do{u=c[s+(t<<2)>>2]|0;dX(u>>>24&255,u>>>16&255,u>>>8&255,u&255,p,q,r);a[n+t>>0]=((((d[q>>0]|0)*59|0)+((d[r>>0]|0)*11|0)+((d[p>>0]|0)*30|0)|0)>>>0)/100|0;t=t+1|0}while((t|0)!=256)}}else{if((c[h+20>>2]&4|0)==0){t=o;p=0;while(1){r=s+(p<<2)|0;a[t>>0]=c[r>>2];a[t+1>>0]=(c[r>>2]|0)>>>8;a[t+2>>0]=(c[r>>2]|0)>>>16;p=p+1|0;if((p|0)==256){break}else{t=t+3|0}}}else{t=0;do{c[o+(t<<2)>>2]=e3a(c[s+(t<<2)>>2]|0)|0;t=t+1|0}while((t|0)!=256)}t=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;Fc[c[(c[t>>2]|0)+36>>2]&63](t,l,n,o,256)}if((g|0)<=0){i=m;return}o=(f|0)>0;l=0;do{t=dd[c[(c[h>>2]|0)+12>>2]&511](h,l+k|0)|0;if(o){s=0;p=b+(ca(l,e)|0)|0;r=t+j|0;while(1){a[p>>0]=a[n+(d[r>>0]|0)>>0]|0;s=s+1|0;if((s|0)==(f|0)){break}else{p=p+1|0;r=r+1|0}}}l=l+1|0}while((l|0)!=(g|0));i=m;return}function XBa(b,e,f,g,h,j,k,l){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;m=i;i=i+16|0;n=m+2|0;o=m+1|0;p=m;q=c[h+16>>2]|0;r=(q|0)/8|0;if((l|0)!=0){s=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;if(!((q+ -24|0)>>>0<8)?(c[h+20>>2]&4|0)==0:0){if((g|0)<=0){i=m;return}q=j<<2;t=(f|0)>0;u=0;do{v=dd[c[(c[h>>2]|0)+12>>2]&511](h,u+k|0)|0;if(t){w=0;x=b+(ca(u,e)|0)|0;y=v+q|0;while(1){Fc[c[(c[s>>2]|0)+36>>2]&63](s,l,x,y,1);w=w+1|0;if((w|0)==(f|0)){break}else{x=x+1|0;y=y+4|0}}}u=u+1|0}while((u|0)!=(g|0));i=m;return}if((g|0)<=0){i=m;return}u=ca(r,j)|0;q=0;do{t=b+(ca(q,e)|0)|0;y=(dd[c[(c[h>>2]|0)+12>>2]&511](h,q+k|0)|0)+u|0;Fc[c[(c[s>>2]|0)+36>>2]&63](s,l,t,y,f);q=q+1|0}while((q|0)!=(g|0));i=m;return}q=(g|0)>0;if((c[h+20>>2]&4|0)==0){if(!q){i=m;return}l=ca(r,j)|0;s=(f|0)>0;u=0;do{y=dd[c[(c[h>>2]|0)+12>>2]&511](h,u+k|0)|0;if(s){t=0;x=b+(ca(u,e)|0)|0;w=y+l|0;while(1){a[x>>0]=((((d[w+1>>0]|0)*59|0)+((d[w>>0]|0)*11|0)+((d[w+2>>0]|0)*30|0)|0)>>>0)/100|0;t=t+1|0;if((t|0)==(f|0)){break}else{x=x+1|0;w=w+r|0}}}u=u+1|0}while((u|0)!=(g|0));i=m;return}else{if(!q){i=m;return}q=j<<2;j=(f|0)>0;u=0;do{r=dd[c[(c[h>>2]|0)+12>>2]&511](h,u+k|0)|0;if(j){l=0;s=b+(ca(u,e)|0)|0;w=r+q|0;while(1){dX(0,0,0,a[w+3>>0]|0,n,o,p);a[s>>0]=((((d[o>>0]|0)*59|0)+((d[p>>0]|0)*11|0)+((d[n>>0]|0)*30|0)|0)>>>0)/100|0;l=l+1|0;if((l|0)==(f|0)){break}else{s=s+1|0;w=w+4|0}}}u=u+1|0}while((u|0)!=(g|0));i=m;return}}function YBa(b,e,f,g,h,j,k,l,m){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;n=i;i=i+1040|0;o=n;p=n+1026|0;q=n+1025|0;r=n+1024|0;ZBa(b,e,f,g,h,j,k);k=c[h+28>>2]|0;j=iN(h)|0;if((m|0)==0){if((c[h+20>>2]&4|0)==0){c3a(l|0,k|0,j<<2|0)|0;i=n;return}if((j|0)>0){s=0}else{i=n;return}do{g=c[k+(s<<2)>>2]|0;dX(g>>>24&255,g>>>16&255,g>>>8&255,g&255,p,q,r);c[l+(s<<2)>>2]=(d[p>>0]|0)<<16|(d[q>>0]|0)<<8|(d[r>>0]|0)|-16777216;s=s+1|0}while((s|0)!=(j|0));i=n;return}s=(j|0)>0;a:do{if((c[h+20>>2]&4|0)==0){if(s){r=o;q=0;while(1){p=k+(q<<2)|0;a[r>>0]=c[p>>2];a[r+1>>0]=(c[p>>2]|0)>>>8;a[r+2>>0]=(c[p>>2]|0)>>>16;q=q+1|0;if((q|0)==(j|0)){break a}else{r=r+3|0}}}r=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;Fc[c[(c[r>>2]|0)+36>>2]&63](r,m,o,o,j);i=n;return}else{if(s){r=0;while(1){c[o+(r<<2)>>2]=e3a(c[k+(r<<2)>>2]|0)|0;r=r+1|0;if((r|0)==(j|0)){break a}}}r=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;Fc[c[(c[r>>2]|0)+36>>2]&63](r,m,o,o,j);i=n;return}}while(0);k=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;Fc[c[(c[k>>2]|0)+36>>2]&63](k,m,o,o,j);if(s){t=o;u=0}else{i=n;return}while(1){c[l+(u<<2)>>2]=(d[t+2>>0]|0)<<16|(d[t+1>>0]|0)<<8|(d[t>>0]|0)|-16777216;u=u+1|0;if((u|0)==(j|0)){break}else{t=t+3|0}}i=n;return}function ZBa(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;l=i;m=(g|0)>0;if((c[h+16>>2]|0)!=1){if(!m){i=l;return}n=0;do{o=b+(ca(n,e)|0)|0;c3a(o|0,(dd[c[(c[h>>2]|0)+12>>2]&511](h,n+k|0)|0)+j|0,f|0)|0;n=n+1|0}while((n|0)!=(g|0));i=l;return}if(!m){i=l;return}m=j+f|0;n=(f|0)>0;o=0;do{p=b+(ca(o,e)|0)|0;f3a(p|0,0,f|0)|0;q=dd[c[(c[h>>2]|0)+12>>2]&511](h,o+k|0)|0;if(n){r=j;s=p;while(1){if((1<<7-((r|0)%8|0)&(d[q+((r|0)/8|0)>>0]|0)|0)!=0){a[s>>0]=1}r=r+1|0;if((r|0)>=(m|0)){break}else{s=s+1|0}}}o=o+1|0}while((o|0)!=(g|0));i=l;return}function _Ba(a,b,d,e,f,g,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0;l=i;i=i+16|0;m=l;n=$Ba(a,b,d,e,f,g,h,j)|0;if((n|0)==0|(k|0)==0){i=l;return n|0}h=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;g=0;do{f=j+(g<<2)|0;c[m>>2]=c[f>>2];Fc[c[(c[h>>2]|0)+36>>2]&63](h,k,m,m,1);c[f>>2]=c[m>>2];g=g+1|0}while((g|0)!=256);i=l;return n|0}function $Ba(b,e,f,g,h,j,k,l){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;m=i;i=i+16|0;n=m;o=(c[h+16>>2]|0)/8|0;c[n+0>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;SBa(n,h);p=c[n+4>>2]|0;q=c[n+8>>2]|0;if((p|0)==0|(q|0)==0){r=0;RBa(n);i=m;return r|0}s=c[n+12>>2]|0;t=c[n>>2]|0;if((s|0)>256?(u=s+ -256|0,(u|0)>0):0){v=0;do{w=c[p+(v<<2)>>2]|0;x=w>>>4&240;y=w&240;z=w<<4&240;w=0;A=0;B=1e6;while(1){C=c[t+(A<<2)>>2]|0;D=x-(C>>>16&255)|0;E=y-(C>>>8&255)|0;F=z-(C&255)|0;C=(ca(E,E)|0)+(ca(F,F)|0)+(ca(D,D)|0)|0;D=(C|0)<(B|0);w=D?A:w;A=A+1|0;if((A|0)==256){break}else{B=D?C:B}}c[q+(v<<2)>>2]=w;v=v+1|0}while((v|0)!=(u|0))}if((g|0)>0){u=(f|0)>0;v=0;do{B=dd[c[(c[h>>2]|0)+12>>2]&511](h,v+k|0)|0;A=ca(v,e)|0;if(u){z=0;do{y=(ca(z,o)|0)+j|0;x=(d[B+(y+2)>>0]|0)<<4&3840|a[B+(y+1)>>0]&240|(d[B+y>>0]|0)>>>4;y=s;while(1){C=y;y=y+ -1|0;if((C|0)<=0){break}if((x|0)==(c[p+(y<<2)>>2]|0)){G=13;break}}if((G|0)==13){G=0;a[b+(z+A)>>0]=c[q+(y<<2)>>2]}z=z+1|0}while((z|0)!=(f|0))}v=v+1|0}while((v|0)<(g|0))}c3a(l|0,t|0,1024)|0;r=1;RBa(n);i=m;return r|0}function aCa(b,e,f,g,h,j,k,l){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0;m=i;n=b>>>3&31;if((h|0)<=0){i=m;return}b=k+g|0;o=(g|0)>0;g=0;do{p=dd[c[(c[j>>2]|0)+12>>2]&511](j,g+l|0)|0;if(o){q=k;r=e+(ca(g,f)|0)|0;while(1){if((1<<7-((q|0)%8|0)&(d[p+((q|0)/8|0)>>0]|0)|0)==0){a[r>>0]=0;a[r+1>>0]=0;a[r+2>>0]=0}else{a[r>>0]=-1;a[r+1>>0]=-1;a[r+2>>0]=-1}q=q+1|0;if((q|0)>=(b|0)){break}else{r=r+n|0}}}g=g+1|0}while((g|0)!=(h|0));i=m;return}function bCa(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0;l=i;m=b>>>3&31;if((g|0)<=0){i=l;return}b=(f|0)>0;n=0;do{o=dd[c[(c[h>>2]|0)+12>>2]&511](h,n+k|0)|0;if(b){p=0;q=d+(ca(n,e)|0)|0;r=o+j|0;while(1){o=a[r>>0]|0;a[q>>0]=o;a[q+1>>0]=o;a[q+2>>0]=o;p=p+1|0;if((p|0)==(f|0)){break}else{q=q+m|0;r=r+1|0}}}n=n+1|0}while((n|0)!=(g|0));i=l;return}function cCa(b,e,f,g,h,j,k,l,m){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;n=i;i=i+16|0;o=n;p=b>>>3&31;b=c[j+28>>2]|0;q=(c[j+20>>2]&4|0)==0;r=c[b>>2]|0;if(q){a[o>>0]=r;a[o+1>>0]=(c[b>>2]|0)>>>8;a[o+2>>0]=(c[b>>2]|0)>>>16;s=b+4|0;a[o+3>>0]=c[s>>2];a[o+4>>0]=(c[s>>2]|0)>>>8;a[o+5>>0]=(c[s>>2]|0)>>>16}else{c[o>>2]=e3a(r|0)|0;c[o+4>>2]=e3a(c[b+4>>2]|0)|0}if((m|0)==0){if(!q){q=c[b>>2]|0;dX(q>>>24&255,q>>>16&255,q>>>8&255,q&255,o+2|0,o+1|0,o);q=c[b+4>>2]|0;dX(q>>>24&255,q>>>16&255,q>>>8&255,q&255,o+5|0,o+4|0,o+3|0)}}else{q=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;Fc[c[(c[q>>2]|0)+36>>2]&63](q,m,o,o,2)}if((h|0)<=0){i=n;return}m=k+g|0;q=(g|0)>0;g=o+1|0;b=o+2|0;r=p+ -2|0;p=o+3|0;s=o+4|0;t=o+5|0;u=0;do{v=dd[c[(c[j>>2]|0)+12>>2]&511](j,u+l|0)|0;if(q){w=k;x=e+(ca(u,f)|0)|0;while(1){if((1<<7-((w|0)%8|0)&(d[v+((w|0)/8|0)>>0]|0)|0)==0){a[x>>0]=a[o>>0]|0;y=x+2|0;a[x+1>>0]=a[g>>0]|0;a[y>>0]=a[b>>0]|0;z=y}else{a[x>>0]=a[p>>0]|0;y=x+2|0;a[x+1>>0]=a[s>>0]|0;a[y>>0]=a[t>>0]|0;z=y}w=w+1|0;if((w|0)>=(m|0)){break}else{x=z+r|0}}}u=u+1|0}while((u|0)!=(h|0));i=n;return}function dCa(b,e,f,g,h,j,k,l,m){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;n=i;i=i+1024|0;o=n;p=b>>>3&31;b=c[j+28>>2]|0;q=j+20|0;r=c[q>>2]|0;if((r&4|0)==0){s=o;t=0;while(1){u=b+(t<<2)|0;a[s>>0]=c[u>>2];a[s+1>>0]=(c[u>>2]|0)>>>8;a[s+2>>0]=(c[u>>2]|0)>>>16;t=t+1|0;if((t|0)==256){break}else{s=s+3|0}}v=c[q>>2]|0}else{v=r}r=(v&4|0)!=0;if((m|0)==0){if(r){v=o;q=0;while(1){s=c[b+(q<<2)>>2]|0;dX(s>>>24&255,s>>>16&255,s>>>8&255,s&255,v+2|0,v+1|0,v);q=q+1|0;if((q|0)==256){break}else{v=v+3|0}}}}else{if(r){r=0;do{c[o+(r<<2)>>2]=e3a(c[b+(r<<2)>>2]|0)|0;r=r+1|0}while((r|0)!=256)}r=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;Fc[c[(c[r>>2]|0)+36>>2]&63](r,m,o,o,256)}if((h|0)<=0){i=n;return}m=(g|0)>0;r=0;do{b=dd[c[(c[j>>2]|0)+12>>2]&511](j,r+l|0)|0;if(m){v=0;q=e+(ca(r,f)|0)|0;s=b+k|0;while(1){b=(d[s>>0]|0)*3|0;a[q>>0]=a[o+b>>0]|0;a[q+1>>0]=a[o+(b+1)>>0]|0;a[q+2>>0]=a[o+(b+2)>>0]|0;v=v+1|0;if((v|0)==(g|0)){break}else{q=q+p|0;s=s+1|0}}}r=r+1|0}while((r|0)!=(h|0));i=n;return}function eCa(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0;k=i;if((j|0)==0){if((e|0)<=0){i=k;return}l=g*3|0;m=d*3|0;n=0;do{o=a+(ca(n,b)|0)|0;c3a(o|0,(dd[c[(c[f>>2]|0)+12>>2]&511](f,n+h|0)|0)+l|0,m|0)|0;n=n+1|0}while((n|0)!=(e|0));i=k;return}else{n=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;if((e|0)<=0){i=k;return}m=g*3|0;g=0;do{l=a+(ca(g,b)|0)|0;o=(dd[c[(c[f>>2]|0)+12>>2]&511](f,g+h|0)|0)+m|0;Fc[c[(c[n>>2]|0)+36>>2]&63](n,j,l,o,d);g=g+1|0}while((g|0)!=(e|0));i=k;return}}function fCa(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;l=i;m=(f|0)>0;if(m){n=h<<2;h=(e|0)>0;o=0;do{p=dd[c[(c[g>>2]|0)+12>>2]&511](g,o+j|0)|0;if(h){q=0;r=b+(ca(o,d)|0)|0;s=p+n|0;while(1){a[r>>0]=a[s>>0]|0;a[r+1>>0]=a[s+1>>0]|0;a[r+2>>0]=a[s+2>>0]|0;q=q+1|0;if((q|0)==(e|0)){break}else{r=r+3|0;s=s+4|0}}}o=o+1|0}while((o|0)!=(f|0))}if((k|0)==0){i=l;return}o=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;if(!m){i=l;return}m=0;do{n=b+(ca(m,d)|0)|0;Fc[c[(c[o>>2]|0)+36>>2]&63](o,k,n,n,e);m=m+1|0}while((m|0)!=(f|0));i=l;return}function gCa(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;l=i;m=(c[g+16>>2]|0)/8|0;if((k|0)==0){if((f|0)<=0){i=l;return}n=ca(m,h)|0;o=(e|0)>0;p=0;do{q=dd[c[(c[g>>2]|0)+12>>2]&511](g,p+j|0)|0;if(o){r=0;s=b+(ca(p,d)|0)|0;t=q+n|0;while(1){a[s>>0]=a[t>>0]|0;a[s+1>>0]=a[t+1>>0]|0;a[s+2>>0]=a[t+2>>0]|0;r=r+1|0;if((r|0)==(e|0)){break}else{s=s+4|0;t=t+m|0}}}p=p+1|0}while((p|0)!=(f|0));i=l;return}else{p=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;if((f|0)<=0){i=l;return}n=ca(m,h)|0;h=(e|0)>0;o=0;do{t=dd[c[(c[g>>2]|0)+12>>2]&511](g,o+j|0)|0;if(h){s=0;r=b+(ca(o,d)|0)|0;q=t+n|0;while(1){Fc[c[(c[p>>2]|0)+36>>2]&63](p,k,r,q,1);s=s+1|0;if((s|0)==(e|0)){break}else{r=r+4|0;q=q+m|0}}}o=o+1|0}while((o|0)!=(f|0));i=l;return}}function hCa(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;l=i;if((k|0)==0){if((f|0)<=0){i=l;return}m=h<<2;n=(e|0)>0;o=0;do{p=dd[c[(c[g>>2]|0)+12>>2]&511](g,o+j|0)|0;if(n){q=0;r=b+(ca(o,d)|0)|0;s=p+m|0;while(1){dX(a[s>>0]|0,a[s+1>>0]|0,a[s+2>>0]|0,a[s+3>>0]|0,r+2|0,r+1|0,r);q=q+1|0;if((q|0)==(e|0)){break}else{r=r+4|0;s=s+4|0}}}o=o+1|0}while((o|0)!=(f|0));i=l;return}else{o=c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0;if((f|0)<=0){i=l;return}m=h<<2;h=(e|0)>0;n=0;do{s=dd[c[(c[g>>2]|0)+12>>2]&511](g,n+j|0)|0;if(h){r=0;q=b+(ca(n,d)|0)|0;p=s+m|0;while(1){Fc[c[(c[o>>2]|0)+36>>2]&63](o,k,q,p,1);r=r+1|0;if((r|0)==(e|0)){break}else{q=q+4|0;p=p+4|0}}}n=n+1|0}while((n|0)!=(f|0));i=l;return}}function iCa(a,b,d,e,f,g,h,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;m=i;n=g+28|0;o=(c[g+20>>2]<<8)+(c[g+16>>2]|0)|0;p=(c[(BGa()|0)+268>>2]|0)==0;q=o&255;r=(q|0)==8;s=a;a=l;a:while(1){if(!p?(c[(c[(BGa()|0)+268>>2]|0)+20>>2]|0)!=0:0){t=a}else{t=0}switch(s|0){case 24:case 536:{u=23;break a;break};case 264:{u=6;break a;break};case 544:case 32:{u=32;break a;break};case 520:case 8:{break};default:{v=0;u=43;break a}}if(!r){w=q;u=17;break}if((c[n>>2]|0)==0){s=264;a=t}else{w=8;u=17;break}}if((u|0)==6){if((q|0)==1){if((c[n>>2]|0)==0){TBa(b,d,e,f,g,h,j);v=1;i=m;return v|0}else{VBa(b,d,e,f,g,h,j,t);v=1;i=m;return v|0}}else if((q|0)==8){if((c[n>>2]|0)==0){UBa(b,d,e,f,g,h,j);v=1;i=m;return v|0}else{WBa(b,d,e,f,g,h,j,t);v=1;i=m;return v|0}}else{if(!(q>>>0>23)){v=0;i=m;return v|0}XBa(b,d,e,f,g,h,j,t);v=1;i=m;return v|0}}else if((u|0)==17){a=w2a(256,4)|0;c[k>>2]=a;if((a|0)==0){v=0;i=m;return v|0}if((w|0)==1|(w|0)==8){if((c[n>>2]|0)==0){v=0;i=m;return v|0}YBa(b,d,e,f,g,h,j,a,t);v=1;i=m;return v|0}else{if(!(w>>>0>23)){v=0;i=m;return v|0}v=_Ba(b,d,e,f,g,h,j,a,t)|0;i=m;return v|0}}else if((u|0)==23){if((q|0)==8){if((c[n>>2]|0)==0){bCa(s,b,d,e,f,g,h,j);v=1;i=m;return v|0}else{dCa(s,b,d,e,f,g,h,j,t);v=1;i=m;return v|0}}else if((q|0)==1){if((c[n>>2]|0)==0){aCa(s,b,d,e,f,g,h,j);v=1;i=m;return v|0}else{cCa(s,b,d,e,f,g,h,j,t);v=1;i=m;return v|0}}else if((q|0)==32){fCa(b,d,e,f,g,h,j,t);v=1;i=m;return v|0}else if((q|0)==24){eCa(b,d,e,f,g,h,j,t);v=1;i=m;return v|0}else{v=0;i=m;return v|0}}else if((u|0)==32){if((q|0)==8){if((c[n>>2]|0)==0){bCa(s,b,d,e,f,g,h,j);v=1;i=m;return v|0}else{dCa(s,b,d,e,f,g,h,j,t);v=1;i=m;return v|0}}else if((q|0)==1){if((c[n>>2]|0)==0){aCa(s,b,d,e,f,g,h,j);v=1;i=m;return v|0}else{cCa(s,b,d,e,f,g,h,j,t);v=1;i=m;return v|0}}else{if(!(q>>>0>23)){v=0;i=m;return v|0}if((o&1024|0)==0){gCa(b,d,e,f,g,h,j,t);v=1;i=m;return v|0}else{hCa(b,d,e,f,g,h,j,t);v=1;i=m;return v|0}}}else if((u|0)==43){i=m;return v|0}return 0}function jCa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;i=i+16|0;d=b;e=a+20|0;f=a+16|0;if(((c[e>>2]<<8)+(c[f>>2]|0)|0)==264){g=RCa(a,0)|0;i=b;return g|0}h=u2a(40)|0;ICa(h);if((h|0)==0){g=0;i=b;return g|0}j=a+8|0;k=a+12|0;if((JCa(h,c[j>>2]|0,c[k>>2]|0,264,0)|0)==0){Rc[c[(c[h>>2]|0)+4>>2]&1023](h);g=0;i=b;return g|0}l=c[e>>2]|0;do{if((l&2|0)!=0){if(((c[f>>2]|0)+(l<<8)|0)==544){m=ZCa(a)|0}else{m=c[a+4>>2]|0}if((m|0)==0){Rc[c[(c[h>>2]|0)+4>>2]&1023](h);g=0;i=b;return g|0}else{if((m|0)==(c[a+4>>2]|0)){break}Rc[c[(c[m>>2]|0)+4>>2]&1023](m);break}}}while(0);c[d>>2]=0;m=Lc[c[(c[h>>2]|0)+8>>2]&255](h)|0;l=(iCa(264,m,c[h+24>>2]|0,c[j>>2]|0,c[k>>2]|0,a,0,0,d,0)|0)==0;a=c[d>>2]|0;k=(a|0)!=0;if(l){if(k){v2a(a)}Rc[c[(c[h>>2]|0)+4>>2]&1023](h);g=0;i=b;return g|0}else{if(!k){g=h;i=b;return g|0}MCa(h,a);v2a(a);c[d>>2]=0;g=h;i=b;return g|0}return 0}function kCa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;e=i;i=i+16|0;f=e;g=b+20|0;h=b+16|0;j=(c[g>>2]<<8)+(c[h>>2]|0)|0;if((j|0)==(d|0)){k=1;i=e;return k|0}if((d|0)==264&(j|0)==8?(c[b+28>>2]|0)==0:0){c[g>>2]=1;k=1;i=e;return k|0}l=(d|0)==544;if(l&(j|0)==32){c[g>>2]=2;m=b+12|0;n=c[m>>2]|0;if((n|0)<=0){k=1;i=e;return k|0}o=b+32|0;p=b+24|0;q=b+8|0;r=n;n=c[q>>2]|0;s=0;while(1){if((n|0)>0){t=(ca(c[p>>2]|0,s)|0)+3|0;u=0;v=(c[o>>2]|0)+t|0;while(1){a[v>>0]=-1;u=u+1|0;w=c[q>>2]|0;if((u|0)>=(w|0)){break}else{v=v+4|0}}x=w;y=c[m>>2]|0}else{x=n;y=r}s=s+1|0;if((s|0)>=(y|0)){k=1;break}else{r=y;n=x}}i=e;return k|0}x=d&255;n=b+8|0;y=(((ca(c[n>>2]|0,x)|0)+31|0)/32|0)<<2;r=b+12|0;s=c[r>>2]|0;m=(ca(y,s)|0)+4|0;w=w2a(m,1)|0;if((w|0)==0){k=0;i=e;return k|0}a:do{if(l){f3a(w|0,-1,m|0)|0;q=b+4|0;o=c[q>>2]|0;if((o|0)!=0&(s|0)>0){p=o;o=0;while(1){v=dd[c[(c[p>>2]|0)+12>>2]&511](p,o)|0;if((c[n>>2]|0)>0){u=0;t=w+(ca(o,y)|0|3)|0;z=v;while(1){a[t>>0]=a[z>>0]|0;u=u+1|0;if((u|0)>=(c[n>>2]|0)){break}else{t=t+4|0;z=z+1|0}}}z=o+1|0;if((z|0)>=(c[r>>2]|0)){A=0;break a}p=c[q>>2]|0;o=z}}else{A=0}}else{if((d&512|0)!=0){if((j|0)==544){o=ZCa(b)|0;if((o|0)!=0){A=o;break}v2a(w);k=0;i=e;return k|0}o=b+4|0;q=c[o>>2]|0;if((q|0)==0){if((KCa(b)|0)!=0){p=c[o>>2]|0;c[o>>2]=0;A=p;break}v2a(w);k=0;i=e;return k|0}else{A=q}}else{A=0}}}while(0);c[f>>2]=0;if((iCa(d,w,y,c[n>>2]|0,c[r>>2]|0,b,0,0,f,0)|0)==0){r=c[f>>2]|0;if((r|0)!=0){v2a(r)}if(!((A|0)==0?1:(A|0)==(c[b+4>>2]|0))){Rc[c[(c[A>>2]|0)+4>>2]&1023](A)}v2a(w);k=0;i=e;return k|0}r=b+4|0;n=c[r>>2]|0;if(!((n|0)==0|(A|0)==(n|0))){Rc[c[(c[n>>2]|0)+4>>2]&1023](n)}c[r>>2]=A;A=b+28|0;r=c[A>>2]|0;if((r|0)!=0){v2a(r)}c[A>>2]=c[f>>2];f=b+36|0;A=b+32|0;if((c[f>>2]|0)==0){v2a(c[A>>2]|0)}c[f>>2]=0;c[A>>2]=w;c[h>>2]=x;c[g>>2]=d>>>8&255;c[b+24>>2]=y;k=1;i=e;return k|0}function lCa(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0,I=0.0,J=0,K=0.0,L=0.0,M=0.0,N=0,O=0.0,P=0,S=0,T=0,U=0,V=0,W=0;k=i;l=a+8|0;m=c[l>>2]|0;if((m|0)!=0){v2a(m);c[l>>2]=0}n=+(f|0);o=n/+(b|0);p=o;if((b|0)<0){q=n}else{q=0.0}b=j&128;f=(b|0)==0;n=+R(+o);m=~~((+(b>>>6|1|0)+ +ba(+n))*4.0)+8|0;b=a+4|0;c[b>>2]=m;c[a>>2]=d;r=e-d|0;if((r|0)>(1073741820/(m|0)|0|0)){i=k;return}s=w2a((ca(m,r)|0)+4|0,1)|0;c[l>>2]=s;if((s|0)==0){i=k;return}r=(d|0)<(e|0);if(!((j&256|0)!=0|n<1.0)){if(!r){i=k;return}t=h+ -1|0;u=d;v=m;w=s;x=d;while(1){y=ca(x-u|0,v)|0;z=w+y|0;n=q+p*+(x|0);o=p+n;A=n<o;B=~~+ba(+(A?o:n));C=~~+Q(+(A?n:o));A=(C|0)<(g|0)?g:C;C=(B|0)<(h|0)?B:t;a:do{if((A|0)>(C|0)){B=(A|0)<(h|0)?A:t;c[z>>2]=B;c[w+(y+4)>>2]=B;D=x+1|0}else{c[z>>2]=A;B=w+(y+4)|0;c[B>>2]=C;o=+(x|0);E=x+1|0;n=+(E|0);F=A;while(1){G=(+(F|0)-q)/p;H=F;F=F+1|0;I=(+(F|0)-q)/p;J=G>I;K=J?I:G;L=J?G:I;I=K>o?K:o;K=L>n?n:L;if(!(I>=K)){M=K-I}else{M=0.0}if(M==0.0&(H|0)==(C|0)){break}c[z+(H-A<<2)+8>>2]=Fla(M*65536.0)|0;if((H|0)>=(C|0)){D=E;break a}}c[B>>2]=(c[B>>2]|0)+ -1;D=E}}while(0);if((D|0)==(e|0)){break}u=c[a>>2]|0;v=c[b>>2]|0;w=c[l>>2]|0;x=D}i=k;return}if(!r){i=k;return}M=p*.5;r=(j&32|0)==0;j=h+ -1|0;D=d;x=m;m=s;s=d;while(1){d=ca(s-D|0,x)|0;w=m+d|0;n=q+(M+p*+(s|0));o=n;b:do{if(r){if(f){v=~~+Q(+o);u=m+(d+4)|0;c[u>>2]=v;c[w>>2]=(v|0)<(g|0)?g:v;if((v|0)>=(h|0)){c[u>>2]=j}c[m+(d+8)>>2]=65536;break}u=~~+Q(+(o+-.5));c[w>>2]=u;v=~~+Q(+(o+.5));t=m+(d+4)|0;c[t>>2]=v;C=v+1|0;A=(u|0)>(g|0)?u+ -1|0:g;z=(C|0)<(h|0)?C:j;if((u|0)<(g|0)){c[w>>2]=g;N=g;O=n+ +(g-u|0)}else{N=u;O=n}if((v|0)<(h|0)){P=v}else{c[t>>2]=j;P=j}v=Fla((O- +(N|0)+-.5)*256.0)|0;if((A|0)==(z|0)){c[m+(d+8)>>2]=(c[759352+(v<<2)>>2]|0)+(c[759352+(v+256<<2)>>2]|0)+(c[759352+(256-v<<2)>>2]|0)+(c[759352+(512-v<<2)>>2]|0)<<8;break}u=(A|0)==(N|0);if(u?((A|0)==(P|0)|(z|0)==(P|0))&(A|0)<(z|0):0){S=A;T=P}else{U=29}do{if((U|0)==29){U=0;C=(A|0)<(N|0);if(C?(N|0)==(P|0)&(z|0)==(P|0):0){S=N;T=z;break}if(u?(A|0)<(P|0)&(P|0)<(z|0):0){c[m+(d+8)>>2]=(c[759352+(v<<2)>>2]|0)+(c[759352+(v+256<<2)>>2]|0)<<8;c[m+(d+12)>>2]=c[759352+(256-v<<2)>>2]<<8;c[m+(d+16)>>2]=c[759352+(512-v<<2)>>2]<<8;c[t>>2]=z;break b}if(C?(N|0)<(P|0)&(P|0)==(z|0):0){c[m+(d+8)>>2]=c[759352+(v+256<<2)>>2]<<8;c[m+(d+12)>>2]=c[759352+(v<<2)>>2]<<8;c[m+(d+16)>>2]=(c[759352+(512-v<<2)>>2]|0)+(c[759352+(256-v<<2)>>2]|0)<<8;c[w>>2]=A;break b}c[m+(d+8)>>2]=c[759352+(v+256<<2)>>2]<<8;c[m+(d+12)>>2]=c[759352+(v<<2)>>2]<<8;c[m+(d+16)>>2]=c[759352+(256-v<<2)>>2]<<8;c[m+(d+20)>>2]=c[759352+(512-v<<2)>>2]<<8;c[w>>2]=A;c[t>>2]=z;break b}}while(0);u=(A|0)<(S|0);do{if(!u){E=(c[759352+(v<<2)>>2]|0)+(c[759352+(v+256<<2)>>2]|0)|0;if((S|0)==(T|0)){c[m+(d+8)>>2]=(c[759352+(256-v<<2)>>2]|0)+E<<8;c[m+(d+12)>>2]=c[759352+(512-v<<2)>>2]<<8;break}else{c[m+(d+8)>>2]=E<<8;c[m+(d+12)>>2]=(c[759352+(512-v<<2)>>2]|0)+(c[759352+(256-v<<2)>>2]|0)<<8;break}}else{c[m+(d+8)>>2]=c[759352+(v+256<<2)>>2]<<8;c[m+(d+12)>>2]=(c[759352+(256-v<<2)>>2]|0)+(c[759352+(v<<2)>>2]|0)+(c[759352+(512-v<<2)>>2]|0)<<8}}while(0);if((S|0)==(T|0)){c[t>>2]=z}if(u){c[w>>2]=A}}else{v=~~+Q(+(o+-.5));c[w>>2]=v;E=~~+Q(+(o+.5));B=m+(d+4)|0;c[B>>2]=E;if((v|0)<(g|0)){c[w>>2]=g;V=g}else{V=v}if((E|0)<(h|0)){W=E}else{c[B>>2]=j;W=j}if((V|0)==(W|0)){c[m+(d+8)>>2]=65536;break}else{B=Fla((n- +(V|0)+-.5)*65536.0)|0;c[m+(d+12)>>2]=B;c[m+(d+8)>>2]=65536-B;break}}}while(0);d=s+1|0;if((d|0)==(e|0)){break}D=c[a>>2]|0;x=c[b>>2]|0;m=c[l>>2]|0;s=d}i=k;return}function mCa(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0;k=i;i=i+16|0;l=k;m=a+28|0;n=a+52|0;c[a+120>>2]=0;c[a+128>>2]=0;c[a>>2]=d;o=d&255;p=a+4|0;c[p>>2]=o;q=h+16|0;r=c[q>>2]&255;s=a+8|0;c[s>>2]=r;t=a+12|0;c[t>>2]=(c[h+20>>2]<<8)+(c[q>>2]|0)&512;c[a+72>>2]=c[h+28>>2];c[a+16>>2]=b;b=a+20|0;c[b>>2]=e;q=a+24|0;c[q>>2]=f;u=a+96|0;c[u>>2]=0;c[a+100>>2]=0;c[a+48>>2]=0;c[m+0>>2]=c[g+0>>2];c[m+4>>2]=c[g+4>>2];c[m+8>>2]=c[g+8>>2];c[m+12>>2]=c[g+12>>2];v=g+8|0;w=c[v>>2]|0;x=c[g>>2]|0;y=w-x|0;if((w|0)!=(x|0)?o>>>0>(2147483647/(y>>>0)|0)>>>0:0){i=k;return}x=ca(o,y)|0;if(x>>>0>2147483616){i=k;return}y=(x+31|0)>>>5<<2;x=w2a(y,1)|0;c[a+44>>2]=x;if((x|0)==0){i=k;return}if((d|0)==32){f3a(x|0,-1,y|0)|0}y=(c[a+36>>2]|0)-(c[m>>2]|0)|0;c[a+88>>2]=(((ca(y,o)|0)+31|0)/32|0)<<2;c[a+92>>2]=(((y<<3)+31|0)/32|0)<<2;c[u>>2]=0;c[a+68>>2]=h;u=c[h+8>>2]|0;y=a+76|0;c[y>>2]=u;o=c[h+12>>2]|0;h=a+80|0;c[h>>2]=o;c[a+84>>2]=(((ca(r,u)|0)+31|0)/32|0)<<2;if((j&256|0)==0){if((j&160|0)==0?(R(e|0)|0)!=0:0){r=R(f|0)|0;m=(r|0)<((ca(c[y>>2]<<3,c[h>>2]|0)|0)/(R(e|0)|0)|0|0);z=m?32:j}else{z=j}c[a+108>>2]=z;A=c[q>>2]|0;B=c[y>>2]|0;C=c[b>>2]|0;D=c[h>>2]|0}else{c[a+108>>2]=j&4|256;A=f;B=u;C=e;D=o}E=+(C|0);F=+(B|0)/E;G=+(A|0);H=+(D|0)/G;if((C|0)>0){I=0.0}else{I=E}if((A|0)>0){J=0.0}else{J=G}G=F*(I+ +(c[g>>2]|0));E=F*(I+ +(c[v>>2]|0));I=H*(J+ +(c[g+4>>2]|0));F=H*(J+ +(c[g+12>>2]|0));g=G>E;v=I>F;c[n>>2]=~~+Q(+(g?E:G));c[a+60>>2]=~~+ba(+(g?G:E));c[a+56>>2]=~~+Q(+(v?F:I));c[a+64>>2]=~~+ba(+(v?I:F));c[l>>2]=0;c[l+4>>2]=0;c[l+8>>2]=B;c[l+12>>2]=D;Ela(n,l);l=c[s>>2]|0;if((l|0)==1){s=a+104|0;if((c[p>>2]|0)==8){c[s>>2]=1;i=k;return}else{c[s>>2]=2;i=k;return}}else if((l|0)==8){l=(c[t>>2]|0)!=0;s=a+104|0;if((c[p>>2]|0)==8){if(l){c[s>>2]=4;i=k;return}else{c[s>>2]=3;i=k;return}}else{if(l){c[s>>2]=6;i=k;return}else{c[s>>2]=5;i=k;return}}}else{s=a+104|0;if((c[t>>2]|0)==0){c[s>>2]=7;i=k;return}else{c[s>>2]=8;i=k;return}}}function nCa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=a+128|0;a:do{if((c[e>>2]|0)==1){while(1){if((oCa(a,b)|0)!=0){f=1;break a}c[e>>2]=2;pCa(a);if((c[e>>2]|0)!=1){f=0;break}}}else{f=0}}while(0);i=d;return f|0}function oCa(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0;f=i;if((c[b+20>>2]|0)==0){g=0;i=f;return g|0}h=b+68|0;j=c[h>>2]|0;k=b+124|0;if((Qc[c[(c[j>>2]|0)+16>>2]&255](j,c[k>>2]|0,e)|0)!=0){g=1;i=f;return g|0}j=(c[b+4>>2]|0)/8|0;l=c[k>>2]|0;m=b+64|0;if((l|0)>=(c[m>>2]|0)){g=0;i=f;return g|0}n=(e|0)==0;o=b+96|0;p=b+56|0;q=b+88|0;r=b+100|0;s=b+104|0;t=b+28|0;u=b+36|0;v=b+120|0;w=b+112|0;x=b+116|0;y=b+108|0;z=b+72|0;A=b+92|0;B=l;l=10;while(1){C=(l|0)!=0;if(C|n){D=B;E=C?l:10}else{if((Lc[c[c[e>>2]>>2]&255](e)|0)!=0){g=1;F=101;break}D=c[k>>2]|0;E=10}C=c[h>>2]|0;G=dd[c[(c[C>>2]|0)+12>>2]&511](C,D)|0;C=c[k>>2]|0;H=(c[o>>2]|0)+(ca(C-(c[p>>2]|0)|0,c[q>>2]|0)|0)|0;if((c[r>>2]|0)==0){I=0;J=0}else{K=c[(c[h>>2]|0)+4>>2]|0;L=dd[c[(c[K>>2]|0)+12>>2]&511](K,C)|0;I=(c[r>>2]|0)+(ca((c[k>>2]|0)-(c[p>>2]|0)|0,c[A>>2]|0)|0)|0;J=L}switch(c[s>>2]|0){case 6:{L=c[t>>2]|0;if((L|0)<(c[u>>2]|0)){C=L;L=H;K=I;while(1){M=c[v>>2]|0;N=ca(C-(c[w>>2]|0)|0,c[x>>2]|0)|0;O=M+N|0;P=c[O>>2]|0;Q=c[M+(N+4)>>2]|0;if((P|0)>(Q|0)){R=0;S=0;T=0;U=0}else{N=c[z>>2]|0;M=(c[b>>2]|0)==536;V=0;W=0;X=0;Y=0;Z=P;while(1){_=(ca(d[J+Z>>0]|0,c[O+(Z-P<<2)+8>>2]|0)|0)/255|0;$=c[N+((d[G+Z>>0]|0)<<2)>>2]|0;if(M){aa=$>>>16;ba=$>>>8;da=$&255}else{aa=$>>>8;ba=$>>>16;da=$>>>24}$=(ca(da,_)|0)+W|0;ea=(ca(ba&255,_)|0)+X|0;fa=(ca(aa&255,_)|0)+Y|0;ga=_+V|0;if((Z|0)<(Q|0)){V=ga;W=$;X=ea;Y=fa;Z=Z+1|0}else{R=ga;S=$;T=ea;U=fa;break}}}if((c[y>>2]&128|0)!=0){if((S|0)<0){ha=0}else{ha=(S|0)>16711680?16711680:S}if((T|0)<0){ia=0}else{ia=(T|0)>16711680?16711680:T}if((U|0)<0){ja=0}else{ja=(U|0)>16711680?16711680:U}if((R|0)<0){ka=0;la=ha;ma=ia;na=ja}else{ka=(R|0)>65536?65536:R;la=ha;ma=ia;na=ja}}else{ka=R;la=S;ma=T;na=U}a[L>>0]=la>>>16;a[L+1>>0]=ma>>>16;a[L+2>>0]=na>>>16;a[K>>0]=(ka*255|0)>>>16;C=C+1|0;if((C|0)>=(c[u>>2]|0)){break}else{L=L+3|0;K=K+1|0}}}break};case 4:{K=c[t>>2]|0;if((K|0)<(c[u>>2]|0)){L=K;K=H;C=I;while(1){Z=c[v>>2]|0;Y=ca(L-(c[w>>2]|0)|0,c[x>>2]|0)|0;X=Z+Y|0;W=c[X>>2]|0;V=c[Z+(Y+4)>>2]|0;if((W|0)>(V|0)){oa=0;pa=0}else{Y=0;Z=0;Q=W;while(1){M=(ca(d[J+Q>>0]|0,c[X+(Q-W<<2)+8>>2]|0)|0)/255|0;N=(ca(d[G+Q>>0]|0,M)|0)+Z|0;P=M+Y|0;if((Q|0)<(V|0)){Y=P;Z=N;Q=Q+1|0}else{oa=P;pa=N;break}}}if((c[y>>2]&128|0)!=0){if((pa|0)<0){qa=0}else{qa=(pa|0)>16711680?16711680:pa}if((oa|0)<0){ra=0;sa=qa}else{ra=(oa|0)>65536?65536:oa;sa=qa}}else{ra=oa;sa=pa}a[K>>0]=sa>>>16;a[C>>0]=(ra*255|0)>>>16;L=L+1|0;if((L|0)>=(c[u>>2]|0)){break}else{K=K+1|0;C=C+1|0}}}break};case 3:{C=c[t>>2]|0;if((C|0)<(c[u>>2]|0)){K=C;C=H;while(1){L=c[v>>2]|0;Q=ca(K-(c[w>>2]|0)|0,c[x>>2]|0)|0;Z=L+Q|0;Y=c[Z>>2]|0;V=c[L+(Q+4)>>2]|0;if((Y|0)>(V|0)){ta=0}else{Q=0;L=Y;while(1){W=(ca(d[G+L>>0]|0,c[Z+(L-Y<<2)+8>>2]|0)|0)+Q|0;if((L|0)<(V|0)){Q=W;L=L+1|0}else{ta=W;break}}}if((c[y>>2]&128|0)!=0){if((ta|0)<0){ua=0}else{ua=(ta|0)>16711680?16711680:ta}}else{ua=ta}a[C>>0]=ua>>>16;K=K+1|0;if((K|0)>=(c[u>>2]|0)){break}else{C=C+1|0}}}break};case 5:{C=c[t>>2]|0;if((C|0)<(c[u>>2]|0)){K=C;C=H;while(1){L=c[v>>2]|0;Q=ca(K-(c[w>>2]|0)|0,c[x>>2]|0)|0;V=L+Q|0;Y=c[V>>2]|0;Z=c[L+(Q+4)>>2]|0;if((Y|0)>(Z|0)){va=0;wa=0;xa=0}else{Q=c[z>>2]|0;L=(c[b>>2]|0)==24;W=0;X=0;N=0;P=Y;while(1){M=c[V+(P-Y<<2)+8>>2]|0;O=c[Q+((d[G+P>>0]|0)<<2)>>2]|0;if(L){ya=O>>>16;za=O>>>8;Aa=O&255}else{ya=O>>>8;za=O>>>16;Aa=O>>>24}O=(ca(Aa,M)|0)+W|0;fa=(ca(za&255,M)|0)+X|0;ea=(ca(ya&255,M)|0)+N|0;if((P|0)<(Z|0)){W=O;X=fa;N=ea;P=P+1|0}else{va=O;wa=fa;xa=ea;break}}}if((c[y>>2]&128|0)!=0){if((xa|0)<0){Ba=0}else{Ba=(xa|0)>16711680?16711680:xa}if((wa|0)<0){Ca=0}else{Ca=(wa|0)>16711680?16711680:wa}if((va|0)<0){Da=0;Ea=Ca;Fa=Ba}else{Da=(va|0)>16711680?16711680:va;Ea=Ca;Fa=Ba}}else{Da=va;Ea=wa;Fa=xa}a[C>>0]=Da>>>16;a[C+1>>0]=Ea>>>16;a[C+2>>0]=Fa>>>16;K=K+1|0;if((K|0)>=(c[u>>2]|0)){break}else{C=C+3|0}}}break};case 2:case 1:{C=c[t>>2]|0;if((C|0)<(c[u>>2]|0)){K=C;C=H;while(1){P=c[v>>2]|0;N=ca(K-(c[w>>2]|0)|0,c[x>>2]|0)|0;X=P+N|0;W=c[X>>2]|0;Z=c[P+(N+4)>>2]|0;if((W|0)>(Z|0)){Ga=0}else{N=0;P=W;while(1){if((1<<7-((P|0)%8|0)&(d[G+((P|0)/8|0)>>0]|0)|0)==0){Ha=N}else{Ha=((c[X+(P-W<<2)+8>>2]|0)*255|0)+N|0}if((P|0)<(Z|0)){N=Ha;P=P+1|0}else{Ga=Ha;break}}}if((c[y>>2]&128|0)!=0){if((Ga|0)<0){Ia=0}else{Ia=(Ga|0)>16711680?16711680:Ga}}else{Ia=Ga}a[C>>0]=Ia>>>16;K=K+1|0;if((K|0)>=(c[u>>2]|0)){break}else{C=C+1|0}}}break};case 7:{C=c[t>>2]|0;if((C|0)<(c[u>>2]|0)){K=C;C=H;while(1){P=c[v>>2]|0;N=ca(K-(c[w>>2]|0)|0,c[x>>2]|0)|0;Z=P+N|0;W=c[Z>>2]|0;X=c[P+(N+4)>>2]|0;if((W|0)>(X|0)){Ja=0;Ka=0;La=0}else{N=0;P=0;L=0;Q=W;while(1){Y=c[Z+(Q-W<<2)+8>>2]|0;V=ca(Q,j)|0;ea=(ca(d[G+V>>0]|0,Y)|0)+N|0;fa=(ca(d[G+(V+1)>>0]|0,Y)|0)+P|0;O=(ca(d[G+(V+2)>>0]|0,Y)|0)+L|0;if((Q|0)<(X|0)){N=ea;P=fa;L=O;Q=Q+1|0}else{Ja=ea;Ka=fa;La=O;break}}}if((c[y>>2]&128|0)!=0){if((Ja|0)<0){Ma=0}else{Ma=(Ja|0)>16711680?16711680:Ja}if((Ka|0)<0){Na=0}else{Na=(Ka|0)>16711680?16711680:Ka}if((La|0)<0){Oa=Ma;Pa=Na;Qa=0}else{Oa=Ma;Pa=Na;Qa=(La|0)>16711680?16711680:La}}else{Oa=Ja;Pa=Ka;Qa=La}a[C>>0]=Oa>>>16;a[C+1>>0]=Pa>>>16;a[C+2>>0]=Qa>>>16;K=K+1|0;if((K|0)>=(c[u>>2]|0)){break}else{C=C+j|0}}}break};case 8:{C=c[t>>2]|0;if((C|0)<(c[u>>2]|0)){K=C;C=H;Q=I;while(1){L=c[v>>2]|0;P=ca(K-(c[w>>2]|0)|0,c[x>>2]|0)|0;N=L+P|0;X=c[N>>2]|0;W=c[L+(P+4)>>2]|0;if((X|0)>(W|0)){Ra=0;Sa=0;Ta=0;Ua=0}else{P=(c[b>>2]|0)==544;L=0;Z=0;O=0;fa=0;ea=X;while(1){Y=ca(ea,j)|0;if(P){Va=G+(Y+3)|0}else{Va=J+ea|0}V=(ca(d[Va>>0]|0,c[N+(ea-X<<2)+8>>2]|0)|0)/255|0;M=(ca(d[G+Y>>0]|0,V)|0)+Z|0;$=(ca(d[G+(Y+1)>>0]|0,V)|0)+O|0;ga=(ca(d[G+(Y+2)>>0]|0,V)|0)+fa|0;Y=V+L|0;if((ea|0)<(W|0)){L=Y;Z=M;O=$;fa=ga;ea=ea+1|0}else{Ra=Y;Sa=M;Ta=$;Ua=ga;break}}}if((c[y>>2]&128|0)!=0){if((Ua|0)<0){Wa=0}else{Wa=(Ua|0)>16711680?16711680:Ua}if((Ta|0)<0){Xa=0}else{Xa=(Ta|0)>16711680?16711680:Ta}if((Sa|0)<0){Ya=0}else{Ya=(Sa|0)>16711680?16711680:Sa}if((Ra|0)<0){Za=0;_a=Ya;$a=Xa;ab=Wa}else{Za=(Ra|0)>65536?65536:Ra;_a=Ya;$a=Xa;ab=Wa}}else{Za=Ra;_a=Sa;$a=Ta;ab=Ua}a[C>>0]=_a>>>16;a[C+1>>0]=$a>>>16;a[C+2>>0]=ab>>>16;if((c[b>>2]|0)==544){a[C+3>>0]=(Za*255|0)>>>16}if((Q|0)==0){bb=0}else{a[Q>>0]=(Za*255|0)>>>16;bb=Q+1|0}K=K+1|0;if((K|0)>=(c[u>>2]|0)){break}else{C=C+j|0;Q=bb}}}break};default:{}}B=(c[k>>2]|0)+1|0;c[k>>2]=B;if((B|0)>=(c[m>>2]|0)){g=0;F=101;break}else{l=E+ -1|0}}if((F|0)==101){i=f;return g|0}return 0}function pCa(b){b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0;e=i;i=i+16|0;f=e;g=c[b+24>>2]|0;if((g|0)==0){i=e;return}h=f+8|0;c[h>>2]=0;j=b+32|0;k=b+40|0;l=b+56|0;m=b+108|0;lCa(f,g,c[j>>2]|0,c[k>>2]|0,c[b+80>>2]|0,c[l>>2]|0,c[b+64>>2]|0,c[m>>2]|0);g=c[h>>2]|0;a:do{if((g|0)!=0){n=(c[b+4>>2]|0)/8|0;o=c[j>>2]|0;if((o|0)<(c[k>>2]|0)){p=b+44|0;q=b+48|0;r=f+4|0;s=b+104|0;t=b+16|0;u=b+28|0;v=b+36|0;w=b+96|0;x=b+88|0;y=b+100|0;z=b+92|0;A=g;B=o;while(1){o=c[p>>2]|0;C=c[q>>2]|0;D=ca(B-(c[f>>2]|0)|0,c[r>>2]|0)|0;E=A+D|0;b:do{switch(c[s>>2]|0){case 8:case 6:{F=c[u>>2]|0;if((F|0)<(c[v>>2]|0)){G=A+(D+4)|0;H=F;I=F;F=C;J=o;while(1){K=c[w>>2]|0;L=I-H|0;M=ca(L,n)|0;N=c[b>>2]|0;O=(N|0)==544;if(O){P=0}else{P=(c[y>>2]|0)+L|0}L=c[E>>2]|0;Q=c[G>>2]|0;if((L|0)>(Q|0)){R=0;S=0;T=0;U=0}else{V=c[l>>2]|0;W=c[x>>2]|0;X=(P|0)==0;Y=0;Z=0;_=0;$=0;aa=L;while(1){ba=c[E+(aa-L<<2)+8>>2]|0;da=aa-V|0;ea=(ca(da,W)|0)+M|0;if(X){fa=255}else{fa=d[P+(ca(c[z>>2]|0,da)|0)>>0]|0}da=(ca(d[K+ea>>0]|0,ba)|0)+Z|0;ga=(ca(d[K+(ea+1)>>0]|0,ba)|0)+_|0;ha=(ca(d[K+(ea+2)>>0]|0,ba)|0)+$|0;if(O){ia=d[K+(ea+3)>>0]|0}else{ia=fa}ea=(ca(ia,ba)|0)+Y|0;if((aa|0)<(Q|0)){Y=ea;Z=da;_=ga;$=ha;aa=aa+1|0}else{R=ea;S=da;T=ga;U=ha;break}}}if((c[m>>2]&128|0)!=0){if((U|0)<0){ja=0}else{ja=(U|0)>16711680?16711680:U}if((T|0)<0){ka=0}else{ka=(T|0)>16711680?16711680:T}if((S|0)<0){la=0}else{la=(S|0)>16711680?16711680:S}if((R|0)<0){ma=N;na=0}else{oa=(R|0)>16711680?16711680:R;pa=la;qa=ka;ra=ja;sa=62}}else{oa=R;pa=S;qa=T;ra=U;sa=62}if((sa|0)==62){sa=0;if((oa|0)==0){ma=N;na=0}else{aa=((ra*255|0)>>>0)/(oa>>>0)|0;$=((qa*255|0)>>>0)/(oa>>>0)|0;_=((pa*255|0)>>>0)/(oa>>>0)|0;if((_|0)>255){ta=-1}else{ta=(_|0)<0?0:_&255}a[J>>0]=ta;if(($|0)>255){ua=-1}else{ua=($|0)<0?0:$&255}a[J+1>>0]=ua;if((aa|0)>255){va=-1}else{va=(aa|0)<0?0:aa&255}a[J+2>>0]=va;ma=c[b>>2]|0;na=oa}}aa=na>>>16&255;if((ma|0)==544){a[J+3>>0]=aa}else{a[F>>0]=aa}aa=I+1|0;if((aa|0)>=(c[v>>2]|0)){break b}H=c[u>>2]|0;I=aa;F=(F|0)==0?0:F+1|0;J=J+n|0}}break};case 3:case 2:case 1:{J=c[u>>2]|0;if((J|0)<(c[v>>2]|0)){F=A+(D+4)|0;I=J;H=J;J=o;while(1){G=c[w>>2]|0;aa=ca(H-I|0,n)|0;$=c[E>>2]|0;_=c[F>>2]|0;if(($|0)>(_|0)){wa=0}else{Z=c[l>>2]|0;Y=c[x>>2]|0;Q=0;K=$;while(1){O=(ca(d[G+((ca(K-Z|0,Y)|0)+aa)>>0]|0,c[E+(K-$<<2)+8>>2]|0)|0)+Q|0;if((K|0)<(_|0)){Q=O;K=K+1|0}else{wa=O;break}}}if((c[m>>2]&128|0)!=0){if((wa|0)<0){xa=0}else{xa=(wa|0)>16711680?16711680:wa}}else{xa=wa}a[J>>0]=xa>>>16;K=H+1|0;if((K|0)>=(c[v>>2]|0)){break b}I=c[u>>2]|0;H=K;J=J+n|0}}break};case 4:{J=c[u>>2]|0;if((J|0)<(c[v>>2]|0)){H=A+(D+4)|0;I=J;F=J;J=C;K=o;while(1){Q=c[w>>2]|0;_=F-I|0;$=ca(_,n)|0;aa=c[y>>2]|0;Y=c[E>>2]|0;Z=c[H>>2]|0;if((Y|0)>(Z|0)){ya=0;za=0}else{G=c[l>>2]|0;N=c[x>>2]|0;O=c[z>>2]|0;X=0;M=0;W=Y;while(1){V=c[E+(W-Y<<2)+8>>2]|0;L=W-G|0;ha=(ca(d[Q+((ca(L,N)|0)+$)>>0]|0,V)|0)+M|0;ga=(ca(d[aa+((ca(O,L)|0)+_)>>0]|0,V)|0)+X|0;if((W|0)<(Z|0)){X=ga;M=ha;W=W+1|0}else{ya=ga;za=ha;break}}}if((c[m>>2]&128|0)!=0){if((za|0)<0){Aa=0}else{Aa=(za|0)>16711680?16711680:za}if((ya|0)<0){Ba=0;Ca=Aa}else{Ba=(ya|0)>16711680?16711680:ya;Ca=Aa}}else{Ba=ya;Ca=za}a[K>>0]=Ca>>>16;a[J>>0]=Ba>>>16;W=F+1|0;if((W|0)>=(c[v>>2]|0)){break b}I=c[u>>2]|0;F=W;J=J+1|0;K=K+n|0}}break};case 7:case 5:{K=c[u>>2]|0;if((K|0)<(c[v>>2]|0)){J=A+(D+4)|0;F=K;I=K;K=o;while(1){H=c[w>>2]|0;W=ca(I-F|0,n)|0;M=c[E>>2]|0;X=c[J>>2]|0;if((M|0)>(X|0)){Da=0;Ea=0;Fa=0}else{Z=c[l>>2]|0;_=c[x>>2]|0;O=0;aa=0;$=0;N=M;while(1){Q=c[E+(N-M<<2)+8>>2]|0;G=(ca(N-Z|0,_)|0)+W|0;Y=(ca(d[H+G>>0]|0,Q)|0)+O|0;ha=(ca(d[H+(G+1)>>0]|0,Q)|0)+aa|0;ga=(ca(d[H+(G+2)>>0]|0,Q)|0)+$|0;if((N|0)<(X|0)){O=Y;aa=ha;$=ga;N=N+1|0}else{Da=Y;Ea=ha;Fa=ga;break}}}if((c[m>>2]&128|0)!=0){if((Fa|0)<0){Ga=0}else{Ga=(Fa|0)>16711680?16711680:Fa}if((Ea|0)<0){Ha=0}else{Ha=(Ea|0)>16711680?16711680:Ea}if((Da|0)<0){Ia=0;Ja=Ha;Ka=Ga}else{Ia=(Da|0)>16711680?16711680:Da;Ja=Ha;Ka=Ga}}else{Ia=Da;Ja=Ea;Ka=Fa}a[K>>0]=Ia>>>16;a[K+1>>0]=Ja>>>16;a[K+2>>0]=Ka>>>16;N=I+1|0;if((N|0)>=(c[v>>2]|0)){break b}F=c[u>>2]|0;I=N;K=K+n|0}}break};default:{}}}while(0);E=c[t>>2]|0;pd[c[c[E>>2]>>2]&127](E,B-(c[j>>2]|0)|0,c[p>>2]|0,c[q>>2]|0);B=B+1|0;E=c[h>>2]|0;if((B|0)>=(c[k>>2]|0)){La=E;break a}else{A=E}}}else{La=g}}else{La=0}}while(0);v2a(La);c[h>>2]=0;i=e;return}function qCa(a){a=a|0;var b=0;b=i;v2a(c[a+44>>2]|0);v2a(c[a+96>>2]|0);v2a(c[a+100>>2]|0);v2a(c[a+48>>2]|0);BCa(a+112|0);i=b;return}function rCa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;d=c[a+20>>2]|0;if((d|0)==0){i=b;return}if((c[a+44>>2]|0)==0){i=b;return}e=c[a+64>>2]|0;f=a+56|0;g=c[f>>2]|0;h=e-g|0;j=c[a+88>>2]|0;if((e|0)==(g|0)?1:(h|0)>(536870912/(j>>>0)|0|0)){i=b;return}g=w2a(ca(h,j)|0,1)|0;c[a+96>>2]=g;if((g|0)==0){i=b;return}g=c[a+68>>2]|0;if(((g|0)!=0?(c[a+12>>2]|0)!=0:0)?(c[g+4>>2]|0)!=0:0){g=w2a(ca(h,c[a+92>>2]|0)|0,1)|0;c[a+100>>2]=g;if((g|0)==0){i=b;return}g=w2a(((((c[a+36>>2]|0)-(c[a+28>>2]|0)<<3)+31|0)/32|0)<<2,1)|0;c[a+48>>2]=g;if((g|0)==0){i=b;return}}lCa(a+112|0,d,c[a+28>>2]|0,c[a+36>>2]|0,c[a+76>>2]|0,c[a+52>>2]|0,c[a+60>>2]|0,c[a+108>>2]|0);if((c[a+120>>2]|0)==0){i=b;return}c[a+124>>2]=c[f>>2];c[a+128>>2]=1;i=b;return}function sCa(a){a=a|0;c[a+56>>2]=0;c[a+8>>2]=0;c[a+60>>2]=0;return}function tCa(a){a=a|0;var b=0,d=0;b=i;v2a(c[a+56>>2]|0);d=c[a+8>>2]|0;if((d|0)!=0){qCa(d);v2a(d)}v2a(c[a+60>>2]|0);i=b;return}function uCa(a){a=a|0;var b=0,d=0,e=0;b=i;d=(c[a+20>>2]<<8)+(c[a+16>>2]|0)|0;if((d|0)==257){e=264}else if((d|0)!=1){if((d|0)==8){i=b;return((c[a+28>>2]|0)==0?8:24)|0}else{e=d}}else{e=8}i=b;return e|0}function vCa(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;j=i;i=i+1088|0;k=j+64|0;l=j+60|0;m=j+56|0;n=j+52|0;o=j+48|0;p=j+44|0;q=j+40|0;r=j+36|0;s=j+32|0;t=j+28|0;u=j+24|0;v=j+20|0;w=j+16|0;x=j+12|0;y=j+8|0;z=j+4|0;A=j;B=uCa(d)|0;C=a+64|0;c[C>>2]=B;c[a+52>>2]=B&255;c[a>>2]=b;c[a+4>>2]=d;c[a+24>>2]=e;c[a+28>>2]=f;f=a+32|0;c[f+0>>2]=c[g+0>>2];c[f+4>>2]=c[g+4>>2];c[f+8>>2]=c[g+8>>2];c[f+12>>2]=c[g+12>>2];c[a+12>>2]=h;f=(c[d+20>>2]<<8)+(c[d+16>>2]|0)|0;if((f|0)==1){if((c[d+28>>2]|0)!=0){DCa(TCa(d,0)|0,l,m,n,o);DCa(TCa(d,1)|0,p,q,r,s);e=c[l>>2]|0;l=(c[p>>2]|0)-e|0;p=c[m>>2]|0;m=(c[q>>2]|0)-p|0;q=c[n>>2]|0;n=(c[r>>2]|0)-q|0;r=c[o>>2]|0;o=(c[s>>2]|0)-r|0;s=0;do{c[k+(s<<2)>>2]=((ca(m,s)|0)/255|0)+p<<16|((ca(l,s)|0)/255|0)+e<<24|((ca(n,s)|0)/255|0)+q<<8|((ca(o,s)|0)/255|0)+r;s=s+1|0}while((s|0)!=256);if((ed[c[(c[b>>2]|0)+4>>2]&127](b,(c[g+8>>2]|0)-(c[g>>2]|0)|0,(c[g+12>>2]|0)-(c[g+4>>2]|0)|0,c[C>>2]|0,k)|0)==0){D=0;i=j;return D|0}}else{E=10}}else if((f|0)==1025?(c[d+28>>2]|0)!=0:0){CCa(TCa(d,0)|0,t,u,v,w);CCa(TCa(d,1)|0,x,y,z,A);d=c[t>>2]|0;t=(c[x>>2]|0)-d|0;x=c[u>>2]|0;u=(c[y>>2]|0)-x|0;y=c[v>>2]|0;v=(c[z>>2]|0)-y|0;z=c[w>>2]|0;w=(c[A>>2]|0)-z|0;A=0;do{c[k+(A<<2)>>2]=((ca(u,A)|0)/255|0)+x<<16|((ca(t,A)|0)/255|0)+d<<24|((ca(v,A)|0)/255|0)+y<<8|((ca(w,A)|0)/255|0)+z;A=A+1|0}while((A|0)!=256);if((ed[c[(c[b>>2]|0)+4>>2]&127](b,(c[g+8>>2]|0)-(c[g>>2]|0)|0,(c[g+12>>2]|0)-(c[g+4>>2]|0)|0,c[C>>2]|0,k)|0)==0){D=0;i=j;return D|0}}else{E=10}if((E|0)==10?(ed[c[(c[b>>2]|0)+4>>2]&127](b,(c[g+8>>2]|0)-(c[g>>2]|0)|0,(c[g+12>>2]|0)-(c[g+4>>2]|0)|0,B,0)|0)==0:0){D=0;i=j;return D|0}if((h&4|0)==0){D=xCa(a)|0;i=j;return D|0}else{D=wCa(a)|0;i=j;return D|0}return 0}function wCa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;d=a+16|0;c[d>>2]=0;e=a+20|0;c[e>>2]=0;f=a+24|0;g=c[f>>2]|0;if((g|0)<0){c[d>>2]=1;c[f>>2]=0-g}g=a+28|0;f=c[g>>2]|0;if((f|0)<0){c[e>>2]=1;c[g>>2]=0-f}c[a+48>>2]=0;f=c[a+40>>2]|0;g=c[a+32>>2]|0;e=f-g|0;d=c[a+52>>2]|0;if((f|0)!=(g|0)?(d|0)>(2147483647/(e>>>0)|0|0):0){h=0;i=b;return h|0}j=w2a(((ca(d,e)|0)>>>3)+3&1073741820,1)|0;c[a+56>>2]=j;if((j|0)==0){h=0;i=b;return h|0}j=c[a+4>>2]|0;if((c[j+4>>2]|0)!=0?(e=w2a(((f+3-g|0)/4|0)<<2,1)|0,c[a+60>>2]=e,(e|0)==0):0){h=0;i=b;return h|0}if((ca(c[j+12>>2]|0,c[j+8>>2]|0)|0)>=1e6){h=1;i=b;return h|0}zCa(a,0)|0;h=0;i=b;return h|0}function xCa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=u2a(132)|0;e=a+4|0;mCa(d,c[a>>2]|0,c[a+64>>2]|0,c[a+24>>2]|0,c[a+28>>2]|0,a+32|0,c[e>>2]|0,c[a+12>>2]|0);f=a+8|0;c[f>>2]=d;if((d|0)==0){g=0;i=b;return g|0}rCa(d);d=c[e>>2]|0;if((ca(c[d+12>>2]|0,c[d+8>>2]|0)|0)>=1e6){g=1;i=b;return g|0}nCa(c[f>>2]|0,0)|0;g=0;i=b;return g|0}function yCa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((c[a+12>>2]&4|0)==0){e=ACa(c[a+8>>2]|0,b)|0;i=d;return e|0}else{e=zCa(a,b)|0;i=d;return e|0}return 0}function zCa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;d=i;e=a+56|0;if((c[e>>2]|0)==0){f=0;i=d;return f|0}g=a+32|0;h=(c[a+40>>2]|0)-(c[g>>2]|0)|0;j=a+36|0;k=(c[a+44>>2]|0)-(c[j>>2]|0)|0;l=a+4|0;m=c[(c[l>>2]|0)+12>>2]|0;n=a+48|0;o=c[n>>2]|0;if((o|0)>=(k|0)){f=0;i=d;return f|0}p=a+20|0;q=a+28|0;r=m+ -1|0;s=a+52|0;t=a+24|0;u=a+16|0;v=a+60|0;w=o;while(1){if((c[p>>2]|0)==0){o=ca((c[j>>2]|0)+w|0,m)|0;x=w;y=(o|0)/(c[q>>2]|0)|0}else{o=k-w|0;z=c[q>>2]|0;x=o+ -1|0;y=(ca(1-o+ -1+z-(c[j>>2]|0)|0,m)|0)/(z|0)|0}z=(y|0)<(m|0)?y:r;o=(z|0)<0?0:z;z=c[l>>2]|0;if((Qc[c[(c[z>>2]|0)+16>>2]&255](z,o,b)|0)!=0){f=1;A=11;break}z=c[l>>2]|0;Uc[c[(c[z>>2]|0)+20>>2]&7](z,o,c[e>>2]|0,c[s>>2]|0,c[t>>2]|0,c[u>>2]|0,c[g>>2]|0,h);z=c[v>>2]|0;if((z|0)==0){B=0}else{C=c[(c[l>>2]|0)+4>>2]|0;Uc[c[(c[C>>2]|0)+20>>2]&7](C,o,z,1,c[t>>2]|0,c[u>>2]|0,c[g>>2]|0,h);B=c[v>>2]|0}z=c[a>>2]|0;pd[c[c[z>>2]>>2]&127](z,x,c[e>>2]|0,B);w=(c[n>>2]|0)+1|0;c[n>>2]=w;if((w|0)>=(k|0)){f=0;A=11;break}}if((A|0)==11){i=d;return f|0}return 0}function ACa(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;if((a|0)==0){d=0}else{d=nCa(a,b)|0}i=c;return d|0}function BCa(a){a=a|0;var b=0,d=0;b=i;d=a+8|0;v2a(c[d>>2]|0);c[d>>2]=0;i=b;return}function CCa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;c[b>>2]=a>>>24;c[d>>2]=a>>>16&255;c[e>>2]=a>>>8&255;c[f>>2]=a&255;return}function DCa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;c[b>>2]=a>>>24;c[d>>2]=a>>>16&255;c[e>>2]=a>>>8&255;c[f>>2]=a&255;return}function ECa(a,b){a=a|0;b=b|0;return b&65280|a<<24|b<<16&16711680|b>>>16&255|0}function FCa(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=759168;d=a+4|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;c[d+24>>2]=0;i=b;return}function GCa(a){a=a|0;var b=0;b=i;HCa(a);v2a(a);i=b;return}function HCa(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=759168;d=c[a+28>>2]|0;if((d|0)!=0){v2a(d)}d=c[a+4>>2]|0;if((d|0)==0){i=b;return}Rc[c[(c[d>>2]|0)+4>>2]&1023](d);i=b;return}function ICa(a){a=a|0;var b=0,d=0;b=i;d=a+4|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;c[a>>2]=759208;c[a+36>>2]=0;c[a+32>>2]=0;c[a+28>>2]=0;i=b;return}function JCa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;h=a+32|0;c[h>>2]=0;j=e&255;c[a+16>>2]=j;k=e>>>8;c[a+20>>2]=k&255;l=a+24|0;c[l>>2]=0;m=a+12|0;c[m>>2]=0;n=a+8|0;c[n>>2]=0;if((b|0)<1|(d|0)<1){o=0;i=g;return o|0}if((2147483616/(b|0)|0|0)<(j|0)){o=0;i=g;return o|0}p=(((ca(j,b)|0)+31|0)/32|0)<<2;if((1073741824/(p|0)|0|0)<(d|0)){o=0;i=g;return o|0}if((f|0)==0){j=w2a((ca(p,d)|0)+4|0,1)|0;c[h>>2]=j;if((j|0)==0){o=0;i=g;return o|0}}else{c[h>>2]=f;c[a+36>>2]=1}c[n>>2]=b;c[m>>2]=d;c[l>>2]=p;if((k&2|0)==0|(e|0)==544){o=1;i=g;return o|0}if((KCa(a)|0)!=0){o=1;i=g;return o|0}if((c[a+36>>2]|0)!=0){o=1;i=g;return o|0}a=c[h>>2]|0;if((a|0)==0){o=1;i=g;return o|0}v2a(a);c[h>>2]=0;c[l>>2]=0;c[m>>2]=0;c[n>>2]=0;o=0;i=g;return o|0}function KCa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+4|0;if((c[d>>2]|0)!=0){e=1;i=b;return e|0}f=u2a(40)|0;g=f+4|0;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;c[g+20>>2]=0;c[f>>2]=759208;c[f+36>>2]=0;c[f+32>>2]=0;c[f+28>>2]=0;c[d>>2]=f;if((f|0)==0){e=0;i=b;return e|0}g=(JCa(f,c[a+8>>2]|0,c[a+12>>2]|0,264,0)|0)==0;a=c[d>>2]|0;if(!g){g=Lc[c[(c[a>>2]|0)+8>>2]&255](a)|0;f=c[d>>2]|0;f3a(g|0,-1,ca(c[f+24>>2]|0,c[f+12>>2]|0)|0)|0;e=1;i=b;return e|0}if((a|0)!=0){Rc[c[(c[a>>2]|0)+4>>2]&1023](a)}c[d>>2]=0;e=0;i=b;return e|0}function LCa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=a+32|0;if((c[e>>2]|0)!=0){i=d;return}f=b+12|0;if((JCa(a,c[b+8>>2]|0,c[f>>2]|0,(c[b+20>>2]<<8)+(c[b+16>>2]|0)|0,0)|0)==0){i=d;return}MCa(a,c[b+28>>2]|0);NCa(a,c[b+4>>2]|0,0);if((c[f>>2]|0)<=0){i=d;return}g=a+24|0;a=0;do{h=(c[e>>2]|0)+(ca(c[g>>2]|0,a)|0)|0;j=dd[c[(c[b>>2]|0)+12>>2]&511](b,a)|0;c3a(h|0,j|0,c[g>>2]|0)|0;a=a+1|0}while((a|0)<(c[f>>2]|0));i=d;return}function MCa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;if((b|0)!=0?(e=c[a+16>>2]|0,(e|0)<=8):0){f=1<<e;e=a+28|0;g=c[e>>2]|0;if((g|0)==0){h=w2a(f,4)|0;c[e>>2]=h;if((h|0)==0){i=d;return}else{j=h}}else{j=g}c3a(j|0,b|0,(f>>>0>256?1024:f<<2)|0)|0;i=d;return}f=a+28|0;a=c[f>>2]|0;if((a|0)!=0){v2a(a)}c[f>>2]=0;i=d;return}function NCa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;i=i+16|0;f=e;g=c[a+20>>2]|0;if((g&2|0)==0){i=e;return}if(((c[a+16>>2]|0)+(g<<8)|0)==544){i=e;return}if((b|0)==0){WCa(c[a+4>>2]|0,-16777216);i=e;return}g=c[b+8>>2]|0;h=c[b+12>>2]|0;c[f>>2]=0;j=f+4|0;c[j>>2]=0;k=f+8|0;c[k>>2]=g;l=f+12|0;c[l>>2]=h;if((d|0)==0){if((g|0)!=(c[a+8>>2]|0)){i=e;return}if((h|0)==(c[a+12>>2]|0)){m=h;n=0;o=0}else{i=e;return}}else{Ela(f,d);d=c[k>>2]|0;k=c[f>>2]|0;if((d|0)<=(k|0)){i=e;return}f=c[l>>2]|0;l=c[j>>2]|0;if((f|0)<=(l|0)){i=e;return}if((d-k|0)!=(c[a+8>>2]|0)){i=e;return}d=f-l|0;if((d|0)==(c[a+12>>2]|0)){m=d;n=l;o=k}else{i=e;return}}k=a+12|0;if((m|0)<=0){i=e;return}m=a+4|0;a=0;do{l=c[m>>2]|0;d=dd[c[(c[l>>2]|0)+12>>2]&511](l,a)|0;l=(dd[c[(c[b>>2]|0)+12>>2]&511](b,n+a|0)|0)+o|0;c3a(d|0,l|0,c[(c[m>>2]|0)+24>>2]|0)|0;a=a+1|0}while((a|0)<(c[k>>2]|0));i=e;return}function OCa(a){a=a|0;var b=0;b=i;PCa(a);v2a(a);i=b;return}function PCa(a){a=a|0;var b=0,d=0,e=0;b=i;c[a>>2]=759208;d=a+32|0;e=c[d>>2]|0;if((e|0)!=0?(c[a+36>>2]|0)==0:0){v2a(e)}c[d>>2]=0;HCa(a);i=b;return}function QCa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+32|0;f=c[e>>2]|0;if((f|0)!=0?(c[a+36>>2]|0)==0:0){v2a(f)}f=a+28|0;g=c[f>>2]|0;if((g|0)!=0){v2a(g)}g=a+4|0;h=c[g>>2]|0;if((h|0)!=0){Rc[c[(c[h>>2]|0)+4>>2]&1023](h)}h=b+32|0;c[e>>2]=c[h>>2];e=b+28|0;c[f>>2]=c[e>>2];f=b+4|0;c[g>>2]=c[f>>2];c[h>>2]=0;c[e>>2]=0;c[f>>2]=0;c[a+16>>2]=c[b+16>>2];c[a+36>>2]=c[b+36>>2];c[a+20>>2]=c[b+20>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];c[a+24>>2]=c[b+24>>2];i=d;return}function RCa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=i;i=i+16|0;e=d;f=c[a+8>>2]|0;g=c[a+12>>2]|0;c[e>>2]=0;h=e+4|0;c[h>>2]=0;j=e+8|0;c[j>>2]=f;k=e+12|0;c[k>>2]=g;if((b|0)!=0){Ela(e,b);l=c[j>>2]|0;j=c[e>>2]|0;if((l|0)<=(j|0)){m=0;i=d;return m|0}e=c[k>>2]|0;k=c[h>>2]|0;if((e|0)>(k|0)){n=j;o=l;p=k;q=e}else{m=0;i=d;return m|0}}else{n=0;o=f;p=0;q=g}g=u2a(40)|0;f=g+4|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;c[g>>2]=759208;c[g+36>>2]=0;c[g+32>>2]=0;c[g+28>>2]=0;if((g|0)==0){m=0;i=d;return m|0}f=a+16|0;if((JCa(g,o-n|0,q-p|0,(c[a+20>>2]<<8)+(c[f>>2]|0)|0,0)|0)==0){Rc[c[(c[g>>2]|0)+4>>2]&1023](g);m=0;i=d;return m|0}MCa(g,c[a+28>>2]|0);NCa(g,c[a+4>>2]|0,b);if((c[f>>2]|0)==1?(n&7|0)!=0:0){b=(n|0)%32|0;o=32-b|0;e=(c[g+24>>2]|0)>>>2;if((p|0)>=(q|0)){m=g;i=d;return m|0}k=(e|0)==0;l=(n|0)/32|0;j=p;do{h=dd[c[(c[a>>2]|0)+12>>2]&511](a,j)|0;r=dd[c[(c[g>>2]|0)+12>>2]&511](g,j-p|0)|0;if(!k){s=0;do{t=s;s=s+1|0;c[r+(t<<2)>>2]=(c[h+(s+l<<2)>>2]|0)>>>o|c[h+(t+l<<2)>>2]<<b}while((s|0)<(e|0))}j=j+1|0}while((j|0)<(q|0));m=g;i=d;return m|0}j=((ca(c[g+16>>2]|0,c[g+8>>2]|0)|0)+7|0)/8|0;e=c[a+24>>2]|0;b=e>>>0<j>>>0?e:j;if((p|0)>=(q|0)){m=g;i=d;return m|0}j=p;do{e=dd[c[(c[a>>2]|0)+12>>2]&511](a,j)|0;l=e+((ca(c[f>>2]|0,n)|0)/8|0)|0;c3a(dd[c[(c[g>>2]|0)+12>>2]&511](g,j-p|0)|0,l|0,b|0)|0;j=j+1|0}while((j|0)<(q|0));m=g;i=d;return m|0}function SCa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;d=a+28|0;if((c[d>>2]|0)!=0){i=b;return}e=c[a+16>>2]|0;if((e|0)==8){f=w2a(256,4)|0;c[d>>2]=f;if((f|0)==0){i=b;return}if((c[a+20>>2]&4|0)==0){g=f;h=0;while(1){c[g+(h<<2)>>2]=h*65793|-16777216;j=h+1|0;if((j|0)==256){break}g=c[d>>2]|0;h=j}i=b;return}else{h=f;f=0;while(1){c[h+(f<<2)>>2]=255-f;g=f+1|0;if((g|0)==256){break}h=c[d>>2]|0;f=g}i=b;return}}else if((e|0)==1){e=w2a(2,4)|0;c[d>>2]=e;if((e|0)==0){i=b;return}if((c[a+20>>2]&4|0)==0){c[e>>2]=-16777216;c[e+4>>2]=-1;i=b;return}else{c[e>>2]=255;c[e+4>>2]=0;i=b;return}}else{i=b;return}}function TCa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=c[a+28>>2]|0;do{if((e|0)==0){f=(c[a+16>>2]|0)==1;if((c[a+20>>2]&4|0)==0){if(f){g=(b|0)!=0?-1:-16777216;break}else{g=b*65793|-16777216;break}}else{if(f){g=(b|0)!=0?0:255;break}else{g=255-b|0;break}}}else{g=c[e+(b<<2)>>2]|0}}while(0);i=d;return g|0}function UCa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=a+28|0;g=c[f>>2]|0;if((g|0)==0){SCa(a);h=c[f>>2]|0}else{h=g}c[h+(b<<2)>>2]=d;i=e;return}function VCa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=c[a+28>>2]|0;a:do{if((e|0)==0){f=(c[a+16>>2]|0)==1;g=b&255;if((c[a+20>>2]&4|0)==0){if(!f){h=g;break}h=(g|0)==255&1;break}if(f){h=(g|0)!=255&1;break}else{h=g^255;break}}else{g=1<<c[a+16>>2];if((g|0)>0){f=0;while(1){if((c[e+(f<<2)>>2]|0)==(b|0)){h=f;break a}f=f+1|0;if((f|0)>=(g|0)){h=-1;break}}}else{h=-1}}}while(0);i=d;return h|0}function WCa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;f=b+32|0;g=c[f>>2]|0;if((g|0)==0){i=e;return}h=c[b+20>>2]|0;switch((h<<8)+(c[b+16>>2]|0)|0){case 544:case 32:{if((h&4|0)==0){j=d}else{j=e3a(d|0)|0}h=b+8|0;a:do{if((c[h>>2]|0)>0){k=g;l=0;while(1){c[k+(l<<2)>>2]=j;m=l+1|0;if((m|0)>=(c[h>>2]|0)){break a}k=c[f>>2]|0;l=m}}}while(0);h=b+12|0;if((c[h>>2]|0)<=1){i=e;return}j=b+24|0;l=1;do{k=c[f>>2]|0;m=c[j>>2]|0;c3a(k+(ca(m,l)|0)|0,k|0,m|0)|0;l=l+1|0}while((l|0)<(c[h>>2]|0));i=e;return};case 536:case 24:{h=d>>>16;l=d>>>8;j=l&255;if((h&255|0)==(j|0)&(j|0)==(d&255|0)){f3a(g|0,h&255|0,ca(c[b+12>>2]|0,c[b+24>>2]|0)|0)|0;i=e;return}j=b+8|0;b:do{if((c[j>>2]|0)>0){m=d&255;k=l&255;n=h&255;o=g;p=0;q=1;while(1){a[o+p>>0]=m;a[(c[f>>2]|0)+(p+1)>>0]=k;a[(c[f>>2]|0)+(p+2)>>0]=n;if((q|0)>=(c[j>>2]|0)){break b}o=c[f>>2]|0;p=p+3|0;q=q+1|0}}}while(0);j=b+12|0;if((c[j>>2]|0)<=1){i=e;return}h=b+24|0;l=1;do{q=c[f>>2]|0;p=c[h>>2]|0;c3a(q+(ca(p,l)|0)|0,q|0,p|0)|0;l=l+1|0}while((l|0)<(c[j>>2]|0));i=e;return};case 257:{f3a(g|0,(d>>>0>16777215)<<31>>31|0,ca(c[b+12>>2]|0,c[b+24>>2]|0)|0)|0;i=e;return};case 1:{j=((VCa(b,d)|0)!=0)<<31>>31;f3a(g|0,j|0,ca(c[b+12>>2]|0,c[b+24>>2]|0)|0)|0;i=e;return};case 264:{f3a(g|0,d>>>24&255|0,ca(c[b+12>>2]|0,c[b+24>>2]|0)|0)|0;i=e;return};case 8:{j=(VCa(b,d)|0)&255;f3a(g|0,j|0,ca(c[b+12>>2]|0,c[b+24>>2]|0)|0)|0;i=e;return};default:{i=e;return}}}function XCa(a,b,d,e,f,g,h,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;m=i;i=i+64|0;n=m+48|0;o=m+32|0;p=m+16|0;q=m;r=c[e>>2]|0;if((r|0)==0){i=m;return}s=c[f>>2]|0;if((s|0)==0){i=m;return}t=c[b>>2]|0;u=a+8|0;if((t|0)<=(c[u>>2]|0)?(v=c[d>>2]|0,w=a+12|0,(v|0)<=(c[w>>2]|0)):0){a=c[j>>2]|0;x=t-a|0;t=c[k>>2]|0;y=v-t|0;c[n>>2]=a;v=n+4|0;c[v>>2]=t;z=n+8|0;c[z>>2]=a+r;r=n+12|0;c[r>>2]=t+s;c[o>>2]=0;c[o+4>>2]=0;c[o+8>>2]=g;c[o+12>>2]=h;Ela(n,o);o=(c[v>>2]|0)+y|0;v=(c[z>>2]|0)+x|0;z=(c[r>>2]|0)+y|0;c[p>>2]=(c[n>>2]|0)+x;n=p+4|0;c[n>>2]=o;o=p+8|0;c[o>>2]=v;v=p+12|0;c[v>>2]=z;z=c[u>>2]|0;u=c[w>>2]|0;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=z;c[q+12>>2]=u;Ela(p,q);if((l|0)!=0){Ela(p,l+4|0)}l=c[p>>2]|0;c[b>>2]=l;p=c[n>>2]|0;c[d>>2]=p;c[j>>2]=(c[b>>2]|0)-x;c[k>>2]=(c[d>>2]|0)-y;c[e>>2]=(c[o>>2]|0)-l;c[f>>2]=(c[v>>2]|0)-p;i=m;return}c[e>>2]=0;c[f>>2]=0;i=m;return}function YCa(b,e,f,g,h,j,k,l,m){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;n=i;i=i+32|0;o=n+24|0;p=n+20|0;q=n+16|0;r=n+12|0;s=n+8|0;t=n+4|0;u=n;c[o>>2]=e;c[p>>2]=f;c[q>>2]=g;c[r>>2]=h;c[s>>2]=k;c[t>>2]=l;l=b+32|0;if((c[l>>2]|0)==0){v=0;i=n;return v|0}XCa(b,o,p,q,r,c[j+8>>2]|0,c[j+12>>2]|0,s,t,0);k=c[q>>2]|0;if((k|0)==0){v=1;i=n;return v|0}q=c[r>>2]|0;if((q|0)==0){v=1;i=n;return v|0}r=c[b+16>>2]|0;h=(c[b+20>>2]<<8)+r|0;a:do{if((m|0)==0?(h|0)==((c[j+20>>2]<<8)+(c[j+16>>2]|0)|0):0){if((r|0)!=1){g=(r|0)/8|0;if((q|0)<=0){break}f=c[p>>2]|0;e=b+24|0;w=ca(c[o>>2]|0,g)|0;x=c[t>>2]|0;y=ca(c[s>>2]|0,g)|0;z=ca(k,g)|0;g=0;while(1){A=(c[l>>2]|0)+(w+(ca(f+g|0,c[e>>2]|0)|0))|0;c3a(A|0,(dd[c[(c[j>>2]|0)+12>>2]&511](j,x+g|0)|0)+y|0,z|0)|0;g=g+1|0;if((g|0)>=(q|0)){break a}}}if((q|0)>0){g=c[p>>2]|0;z=b+24|0;y=c[t>>2]|0;x=(k|0)>0;e=c[s>>2]|0;f=c[o>>2]|0;w=0;do{A=c[l>>2]|0;B=ca(g+w|0,c[z>>2]|0)|0;C=dd[c[(c[j>>2]|0)+12>>2]&511](j,y+w|0)|0;if(x){D=0;do{E=e+D|0;F=f+D|0;G=1<<7-((F|0)%8|0);if((1<<7-((E|0)%8|0)&(d[C+((E|0)/8|0)>>0]|0)|0)==0){E=A+(((F|0)/8|0)+B)|0;a[E>>0]=(d[E>>0]|0)&(G^255)}else{E=A+(((F|0)/8|0)+B)|0;a[E>>0]=d[E>>0]|0|G}D=D+1|0}while((D|0)!=(k|0))}w=w+1|0}while((w|0)<(q|0))}}else{if((c[b+28>>2]|0)!=0){v=0;i=n;return v|0}w=c[b+24>>2]|0;f=ca(w,c[p>>2]|0)|0;e=(c[l>>2]|0)+(((ca(c[o>>2]|0,r)|0)/8|0)+f)|0;c[u>>2]=0;if((iCa((r|0)==8?264:h,e,w,k,q,j,c[s>>2]|0,c[t>>2]|0,u,m)|0)==0){v=0;i=n;return v|0}}}while(0);v=1;i=n;return v|0}function ZCa(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;e=c[b+8>>2]|0;f=c[b+12>>2]|0;g=u2a(40)|0;h=g+4|0;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;c[h+16>>2]=0;c[h+20>>2]=0;c[g>>2]=759208;c[g+36>>2]=0;c[g+32>>2]=0;c[g+28>>2]=0;if((g|0)==0){j=0;i=d;return j|0}if((JCa(g,e,f,264,0)|0)==0){Rc[c[(c[g>>2]|0)+4>>2]&1023](g);j=0;i=d;return j|0}if((f|0)<=0){j=g;i=d;return j|0}h=(e|0)>0;k=0;do{l=dd[c[(c[b>>2]|0)+12>>2]&511](b,k)|0;m=dd[c[(c[g>>2]|0)+12>>2]&511](g,k)|0;if(h){n=0;o=m;m=l+3|0;while(1){a[o>>0]=a[m>>0]|0;n=n+1|0;if((n|0)>=(e|0)){break}else{o=o+1|0;m=m+4|0}}}k=k+1|0}while((k|0)<(f|0));j=g;i=d;return j|0}function _Ca(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;f=i;if((c[b+32>>2]|0)==0){g=0;i=f;return g|0}h=e+20|0;j=c[h>>2]|0;if(!((j&2|0)!=0|(j|0)==1)){g=0;i=f;return g|0}k=e+16|0;l=c[k>>2]|0;do{if((l|0)==1){m=jCa(e)|0;if((m|0)==0){g=0;i=f;return g|0}else{n=c[h>>2]|0;o=c[k>>2]|0;p=m;break}}else{n=j;o=l;p=e}}while(0);l=((n<<8)+o|0)==544?3:0;o=(d|0)==8;n=b+20|0;j=c[n>>2]|0;k=(j|0)==1;do{if(o){if(k){if((kCa(b,264)|0)!=0){q=0;break}if((p|0)==(e|0)|(p|0)==0){g=0;i=f;return g|0}Rc[c[(c[p>>2]|0)+4>>2]&1023](p);g=0;i=f;return g|0}if((kCa(b,j<<8&1024|544)|0)!=0){q=((c[n>>2]<<8)+(c[b+16>>2]|0)|0)==544?3:0;break}if((p|0)==(e|0)|(p|0)==0){g=0;i=f;return g|0}Rc[c[(c[p>>2]|0)+4>>2]&1023](p);g=0;i=f;return g|0}else{if(k){if((p|0)==(e|0)|(p|0)==0){g=0;i=f;return g|0}Rc[c[(c[p>>2]|0)+4>>2]&1023](p);g=0;i=f;return g|0}do{if((c[b+16>>2]|0)<24){h=j&4;if((j&2|0)==0){if((kCa(b,(h|0)!=0?1056:24)|0)!=0){break}if((p|0)==(e|0)|(p|0)==0){g=0;i=f;return g|0}Rc[c[(c[p>>2]|0)+4>>2]&1023](p);g=0;i=f;return g|0}else{if((kCa(b,h<<8|544)|0)!=0){break}if((p|0)==(e|0)|(p|0)==0){g=0;i=f;return g|0}Rc[c[(c[p>>2]|0)+4>>2]&1023](p);g=0;i=f;return g|0}}}while(0);q=c[759240+(d<<2)>>2]|0}}while(0);d=p+4|0;j=c[d>>2]|0;k=c[b+8>>2]|0;n=(c[p+8>>2]|0)==(k|0);do{if((j|0)==0){if(n){h=c[b+12>>2]|0;if((c[p+12>>2]|0)==(h|0)){r=p;s=l;break}else{t=h}}else{t=c[b+12>>2]|0}h=zDa(p,k,t,0,0)|0;if(!((p|0)==(e|0)|(p|0)==0)){Rc[c[(c[p>>2]|0)+4>>2]&1023](p)}if((h|0)==0){g=0;i=f;return g|0}else{r=h;s=l;break}}else{if(n){h=c[b+12>>2]|0;if((c[p+12>>2]|0)==(h|0)){u=j}else{v=h;w=31}}else{v=c[b+12>>2]|0;w=31}if((w|0)==31){h=zDa(j,k,v,0,0)|0;if((h|0)==0){if((p|0)==(e|0)|(p|0)==0){g=0;i=f;return g|0}Rc[c[(c[p>>2]|0)+4>>2]&1023](p);g=0;i=f;return g|0}else{u=h}}if((p|0)!=(e|0)?(c[d>>2]=0,(p|0)!=0):0){Rc[c[(c[p>>2]|0)+4>>2]&1023](p)}r=u;s=0}}while(0);if(o){o=c[b+4>>2]|0;u=(o|0)==0;x=u?q:0;y=u?b:o}else{x=q;y=b}q=(c[r+16>>2]|0)/8|0;o=(c[y+16>>2]|0)/8|0;u=b+12|0;if((c[u>>2]|0)>0){p=b+8|0;b=0;do{d=dd[c[(c[y>>2]|0)+12>>2]&511](y,b)|0;v=dd[c[(c[r>>2]|0)+12>>2]&511](r,b)|0;if((c[p>>2]|0)>0){k=0;j=d+x|0;d=v+s|0;while(1){a[j>>0]=a[d>>0]|0;k=k+1|0;if((k|0)>=(c[p>>2]|0)){break}else{j=j+o|0;d=d+q|0}}}b=b+1|0}while((b|0)<(c[u>>2]|0))}if((r|0)==(e|0)){g=1;i=f;return g|0}if((r|0)==0?1:(r|0)==(c[e+4>>2]|0)){g=1;i=f;return g|0}Rc[c[(c[r>>2]|0)+4>>2]&1023](r);g=1;i=f;return g|0}function $Ca(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;f=i;g=b+32|0;if((c[g>>2]|0)==0){i=f;return}if((c[e+20>>2]|0)!=1){i=f;return}h=b+20|0;j=c[h>>2]|0;if((j|0)!=1&(j&2|0)==0){_Ca(b,8,e)|0;i=f;return}k=b+8|0;l=c[k>>2]|0;if((c[e+8>>2]|0)==(l|0)){m=c[b+12>>2]|0;if((c[e+12>>2]|0)==(m|0)){n=j;o=e}else{p=m;q=8}}else{p=c[b+12>>2]|0;q=8}do{if((q|0)==8){m=zDa(e,l,p,0,0)|0;if((m|0)==0){i=f;return}else{n=c[h>>2]|0;o=m;break}}}while(0);do{if((n|0)==1){if((kCa(b,264)|0)==0){if((o|0)==(e|0)|(o|0)==0){i=f;return}Rc[c[(c[o>>2]|0)+4>>2]&1023](o);i=f;return}h=b+12|0;if((c[h>>2]|0)>0){p=b+24|0;l=o+32|0;q=o+24|0;m=o+16|0;j=c[k>>2]|0;r=0;while(1){s=c[g>>2]|0;t=ca(c[p>>2]|0,r)|0;u=c[l>>2]|0;v=ca(c[q>>2]|0,r)|0;w=(j|0)>0;if((c[m>>2]|0)==1){if(w){x=j;y=0;while(1){if(((d[u+(((y|0)/8|0)+v)>>0]|0)&1<<7-((y|0)%8|0)|0)==0){a[s+(y+t)>>0]=0;z=c[k>>2]|0}else{z=x}y=y+1|0;if((y|0)>=(z|0)){A=z;break}else{x=z}}}else{A=j}}else{if(w){x=0;y=s+t|0;while(1){a[y>>0]=((ca(d[u+(x+v)>>0]|0,d[y>>0]|0)|0)>>>0)/255|0;x=x+1|0;B=c[k>>2]|0;if((x|0)>=(B|0)){A=B;break}else{y=y+1|0}}}else{A=j}}r=r+1|0;if((r|0)>=(c[h>>2]|0)){break}else{j=A}}}}else{if(((c[b+16>>2]|0)+(n<<8)|0)!=544){$Ca(c[b+4>>2]|0,o);break}if((c[o+16>>2]|0)==1){if((o|0)==(e|0)|(o|0)==0){i=f;return}Rc[c[(c[o>>2]|0)+4>>2]&1023](o);i=f;return}j=b+12|0;h=c[j>>2]|0;if((h|0)>0){r=b+24|0;m=o+32|0;q=o+24|0;l=c[k>>2]|0;p=h;h=0;while(1){y=c[m>>2]|0;x=ca(c[q>>2]|0,h)|0;if((l|0)>0){v=(ca(c[r>>2]|0,h)|0)+3|0;u=0;t=(c[g>>2]|0)+v|0;while(1){a[t>>0]=((ca(d[y+(u+x)>>0]|0,d[t>>0]|0)|0)>>>0)/255|0;u=u+1|0;C=c[k>>2]|0;if((u|0)>=(C|0)){break}else{t=t+4|0}}D=c[j>>2]|0;E=C}else{D=p;E=l}h=h+1|0;if((h|0)>=(D|0)){break}else{l=E;p=D}}}}}while(0);if((o|0)==(e|0)|(o|0)==0){i=f;return}Rc[c[(c[o>>2]|0)+4>>2]&1023](o);i=f;return}function aDa(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;f=i;g=b+32|0;h=c[g>>2]|0;if((h|0)==0){i=f;return}j=c[b+20>>2]|0;k=(j<<8)+(c[b+16>>2]|0)|0;if((k|0)==544){l=b+12|0;m=c[l>>2]|0;if((m|0)<=0){i=f;return}n=b+24|0;o=b+8|0;p=c[o>>2]|0;q=m;m=0;while(1){if((p|0)>0){r=(ca(c[n>>2]|0,m)|0)+3|0;s=0;t=(c[g>>2]|0)+r|0;while(1){a[t>>0]=(ca(d[t>>0]|0,e)|0)/255|0;s=s+1|0;u=c[o>>2]|0;if((s|0)>=(u|0)){break}else{t=t+4|0}}v=c[l>>2]|0;w=u}else{v=q;w=p}m=m+1|0;if((m|0)>=(v|0)){break}else{p=w;q=v}}i=f;return}else if((k|0)==264){v=b+12|0;q=c[v>>2]|0;if((q|0)<=0){i=f;return}w=b+24|0;p=b+8|0;m=c[p>>2]|0;u=h;h=q;q=0;while(1){l=ca(c[w>>2]|0,q)|0;if((m|0)>0){o=0;do{n=u+(o+l)|0;a[n>>0]=(ca(d[n>>0]|0,e)|0)/255|0;o=o+1|0;x=c[p>>2]|0}while((o|0)<(x|0));y=c[v>>2]|0;z=x}else{y=h;z=m}o=q+1|0;if((o|0)>=(y|0)){break}m=z;u=c[g>>2]|0;h=y;q=o}i=f;return}else if((k|0)==257){if((kCa(b,264)|0)==0){i=f;return}else{aDa(b,e);i=f;return}}else{if((j&2|0)!=0){aDa(c[b+4>>2]|0,e);i=f;return}if((j&4|0)==0){if((kCa(b,544)|0)==0){i=f;return}else{aDa(b,e);i=f;return}}else{if((kCa(b,k|512)|0)==0){i=f;return}else{aDa(c[b+4>>2]|0,e);i=f;return}}}}function bDa(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0;h=i;j=c[b+32>>2]|0;if((j|0)==0|(e|0)<0){i=h;return}if((f|0)<0?1:(c[b+8>>2]|0)<=(e|0)){i=h;return}if((c[b+12>>2]|0)<=(f|0)){i=h;return}k=ca(c[b+24>>2]|0,f)|0;f=c[b+16>>2]|0;l=((ca(f,e)|0)/8|0)+k|0;k=j+l|0;switch((c[b+20>>2]<<8)+f|0){case 536:{a[k>>0]=g;a[j+(l+1)>>0]=g>>>8;a[j+(l+2)>>0]=g>>>16;i=h;return};case 257:{f=1<<7-((e|0)%8|0);if(g>>>0>16777215){a[k>>0]=d[k>>0]|0|f;i=h;return}else{a[k>>0]=(d[k>>0]|0)&(f^255);i=h;return}break};case 8:{f=c[b+28>>2]|0;if((f|0)==0){a[k>>0]=((((g>>>8&255)*59|0)+((g&255)*11|0)+((g>>>16&255)*30|0)|0)>>>0)/100|0;i=h;return}else{m=0}while(1){n=m+1|0;if((c[f+(m<<2)>>2]|0)==(g|0)){o=19;break}if((n|0)<256){m=n}else{o=20;break}}if((o|0)==19){a[k>>0]=m;i=h;return}else if((o|0)==20){a[k>>0]=0;i=h;return}break};case 1:{o=c[b+28>>2]|0;if((o|0)==0){b=1<<7-((e|0)%8|0);if((g|0)==-1){a[k>>0]=d[k>>0]|0|b;i=h;return}else{a[k>>0]=(d[k>>0]|0)&(b^255);i=h;return}}else{b=1<<7-((e|0)%8|0);if((c[o+4>>2]|0)==(g|0)){a[k>>0]=d[k>>0]|0|b;i=h;return}else{a[k>>0]=(d[k>>0]|0)&(b^255);i=h;return}}break};case 264:{a[k>>0]=g>>>24;i=h;return};case 32:case 24:{b=g>>>24;o=ca(g&255,b)|0;e=b^255;a[k>>0]=(((ca(d[k>>0]|0,e)|0)+o|0)>>>0)/255|0;o=ca(g>>>8&255,b)|0;m=j+(l+1)|0;a[m>>0]=(((ca(d[m>>0]|0,e)|0)+o|0)>>>0)/255|0;o=ca(g>>>16&255,b)|0;b=j+(l+2)|0;a[b>>0]=(((ca(d[b>>0]|0,e)|0)+o|0)>>>0)/255|0;i=h;return};case 544:{a[k>>0]=g;a[j+(l+1)>>0]=g>>>8;a[j+(l+2)>>0]=g>>>16;a[j+(l+3)>>0]=g>>>24;i=h;return};default:{i=h;return}}}function cDa(b,e,f,g,h,j,k,l){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;g=i;m=c[b+32>>2]|0;if((m|0)==0){i=g;return}n=c[b+16>>2]|0;o=(n|0)/8|0;p=ca(c[b+24>>2]|0,e)|0;if((n+7|0)>>>0<15){if((l|0)<=0){i=g;return}e=b+8|0;q=(j|0)==0;r=0;do{s=c[e>>2]|0;t=((ca(s,r+k|0)|0)>>>0)/(h>>>0)|0;if(q){u=t}else{u=s+ -1-t|0}t=(u>>>0)%(s>>>0)|0;a[f+r>>0]=((1<<(t&7^7)&(d[m+((t>>>3)+p)>>0]|0)|0)!=0)<<31>>31;r=r+1|0}while((r|0)!=(l|0));i=g;return}r=(l|0)>0;if(!((n+ -8|0)>>>0<8)){if(!r){i=g;return}u=(j|0)==0;q=b+8|0;e=(n|0)>7;n=0;do{t=c[q>>2]|0;s=((ca(t,n+k|0)|0)>>>0)/(h>>>0)|0;if(u){v=s}else{v=t+ -1-s|0}s=ca(n,o)|0;if(e){w=(((ca(v,o)|0)>>>0)%((ca(t,o)|0)>>>0)|0)+p|0;t=0;do{a[f+(t+s)>>0]=a[m+(w+t)>>0]|0;t=t+1|0}while((t|0)<(o|0))}n=n+1|0}while((n|0)!=(l|0));i=g;return}if(!r){i=g;return}r=b+8|0;n=(j|0)==0;j=b+28|0;o=b+20|0;b=0;do{v=c[r>>2]|0;e=((ca(v,b+k|0)|0)>>>0)/(h>>>0)|0;if(n){x=e}else{x=v+ -1-e|0}e=(x>>>0)%(v>>>0)|0;v=c[j>>2]|0;do{if((v|0)!=0){if((c[o>>2]&4|0)==0){u=b*3|0;q=c[v+((d[m+(e+p)>>0]|0)<<2)>>2]|0;a[f+u>>0]=q;a[f+(u+1)>>0]=q>>>8;a[f+(u+2)>>0]=q>>>16;break}else{q=b<<2;u=c[v+((d[m+(e+p)>>0]|0)<<2)>>2]|0;a[f+q>>0]=u>>>24;a[f+(q|1)>>0]=u>>>16;a[f+(q|2)>>0]=u>>>8;a[f+(q|3)>>0]=u;break}}else{a[f+b>>0]=a[m+(e+p)>>0]|0}}while(0);b=b+1|0}while((b|0)!=(l|0));i=g;return}function dDa(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0;g=i;i=i+16|0;h=g+8|0;j=g+7|0;k=g+6|0;l=g+5|0;m=g+4|0;n=g+3|0;o=g+2|0;p=g+1|0;q=g;r=b+32|0;if((c[r>>2]|0)==0){i=g;return}s=c[b+20>>2]|0;if((s|0)==1){i=g;return}t=(s&4|0)!=0;if(t){u=0;v=f>>>24;w=0;x=f&255;y=f>>>16&255;z=0;A=f>>>8&255;B=0;C=e>>>24;D=0;E=e&255;F=e>>>16&255;G=0;H=e>>>8&255}else{u=f>>>16&255;v=0;w=f>>>8&255;x=0;y=0;z=f&255;A=0;B=e>>>16&255;C=0;D=e>>>8&255;E=0;F=0;G=e&255;H=0}s=b+16|0;I=c[s>>2]|0;if((I|0)<9){if(t){if((e|0)==255&(f|0)==0?(c[b+28>>2]|0)==0:0){i=g;return}}else{if((e|0)==0&(f|0)==16777215?(c[b+28>>2]|0)==0:0){i=g;return}}J=b+28|0;if((c[J>>2]|0)==0){SCa(b);K=c[s>>2]|0}else{K=I}L=1<<K;K=(L|0)>0;if(t){if(!K){i=g;return}M=C-v|0;N=F-y|0;O=H-A|0;P=E-x|0;Q=0;do{R=c[(c[J>>2]|0)+(Q<<2)>>2]|0;dX(R>>>24&255,R>>>16&255,R>>>8&255,R&255,k,j,h);R=255-(((((d[j>>0]|0)*59|0)+((d[h>>0]|0)*11|0)+((d[k>>0]|0)*30|0)|0)>>>0)/100|0)|0;S=((ca(R,N)|0)/255|0)+y<<16|((ca(R,M)|0)/255|0)+v<<24|((ca(R,O)|0)/255|0)+A<<8|((ca(R,P)|0)/255|0)+x;c[(c[J>>2]|0)+(Q<<2)>>2]=S;Q=Q+1|0}while((Q|0)!=(L|0));i=g;return}else{if(!K){i=g;return}K=G-z|0;Q=D-w|0;P=B-u|0;O=0;do{M=(c[J>>2]|0)+(O<<2)|0;N=c[M>>2]|0;k=((((N>>>8&255)*59|0)+((N&255)*11|0)+((N>>>16&255)*30|0)|0)>>>0)/100|0;c[M>>2]=((ca(k,K)|0)/255|0)+z<<16|((ca(k,Q)|0)/255|0)+w<<8|((ca(k,P)|0)/255|0)+u|-16777216;O=O+1|0}while((O|0)!=(L|0));i=g;return}}if(t){t=b+12|0;L=c[t>>2]|0;O=(L|0)>0;if((e|0)==255&(f|0)==0){if(!O){i=g;return}P=b+24|0;Q=b+8|0;K=c[Q>>2]|0;J=L;k=0;while(1){if((K|0)>0){M=ca(c[P>>2]|0,k)|0;N=0;h=(c[r>>2]|0)+M|0;while(1){M=h+1|0;j=h+2|0;S=h+3|0;dX(a[h>>0]|0,a[M>>0]|0,a[j>>0]|0,a[S>>0]|0,n,m,l);a[h>>0]=0;a[M>>0]=0;a[j>>0]=0;a[S>>0]=255-(((((d[m>>0]|0)*59|0)+((d[l>>0]|0)*11|0)+((d[n>>0]|0)*30|0)|0)>>>0)/100|0);N=N+1|0;T=c[Q>>2]|0;if((N|0)>=(T|0)){break}else{h=h+4|0}}U=c[t>>2]|0;V=T}else{U=J;V=K}k=k+1|0;if((k|0)>=(U|0)){break}else{K=V;J=U}}i=g;return}else{if(!O){i=g;return}O=b+24|0;U=b+8|0;J=C-v|0;C=F-y|0;F=H-A|0;H=E-x|0;E=c[U>>2]|0;V=L;L=0;while(1){if((E|0)>0){K=ca(c[O>>2]|0,L)|0;k=0;T=(c[r>>2]|0)+K|0;while(1){K=T+1|0;Q=T+2|0;n=T+3|0;dX(a[T>>0]|0,a[K>>0]|0,a[Q>>0]|0,a[n>>0]|0,q,p,o);l=255-(((((d[p>>0]|0)*59|0)+((d[o>>0]|0)*11|0)+((d[q>>0]|0)*30|0)|0)>>>0)/100|0)|0;a[T>>0]=((ca(l,J)|0)/255|0)+v;a[K>>0]=((ca(l,C)|0)/255|0)+y;a[Q>>0]=((ca(l,F)|0)/255|0)+A;a[n>>0]=((ca(l,H)|0)/255|0)+x;k=k+1|0;W=c[U>>2]|0;if((k|0)>=(W|0)){break}else{T=T+4|0}}X=c[t>>2]|0;Y=W}else{X=V;Y=E}L=L+1|0;if((L|0)>=(X|0)){break}else{E=Y;V=X}}i=g;return}}X=b+12|0;V=c[X>>2]|0;Y=(V|0)>0;if((e|0)==0&(f|0)==16777215){if(!Y){i=g;return}f=b+24|0;e=b+8|0;E=I;L=c[e>>2]|0;W=V;t=0;while(1){U=(E|0)/8|0;if((L|0)>0){x=ca(c[f>>2]|0,t)|0;H=0;A=(c[r>>2]|0)+x|0;while(1){x=A+1|0;F=A+2|0;y=(((((d[x>>0]|0)*59|0)+((d[A>>0]|0)*11|0)+((d[F>>0]|0)*30|0)|0)>>>0)/100|0)&255;a[A>>0]=y;a[x>>0]=y;a[F>>0]=y;H=H+1|0;Z=c[e>>2]|0;if((H|0)>=(Z|0)){break}else{A=A+U|0}}_=c[X>>2]|0;$=Z}else{_=W;$=L}U=t+1|0;if((U|0)>=(_|0)){break}E=c[s>>2]|0;L=$;W=_;t=U}i=g;return}else{if(!Y){i=g;return}Y=b+24|0;t=b+8|0;b=B-u|0;B=D-w|0;D=G-z|0;G=I;I=c[t>>2]|0;_=V;V=0;while(1){W=(G|0)/8|0;if((I|0)>0){$=ca(c[Y>>2]|0,V)|0;L=0;E=(c[r>>2]|0)+$|0;while(1){$=E+1|0;Z=E+2|0;e=((((d[$>>0]|0)*59|0)+((d[E>>0]|0)*11|0)+((d[Z>>0]|0)*30|0)|0)>>>0)/100|0;a[E>>0]=((ca(e,b)|0)/255|0)+u;a[$>>0]=((ca(e,B)|0)/255|0)+w;a[Z>>0]=((ca(e,D)|0)/255|0)+z;L=L+1|0;aa=c[t>>2]|0;if((L|0)>=(aa|0)){break}else{E=E+W|0}}ba=c[X>>2]|0;da=aa}else{ba=_;da=I}W=V+1|0;if((W|0)>=(ba|0)){break}G=c[s>>2]|0;I=da;_=ba;V=W}i=g;return}}function eDa(a){a=a|0;var b=0,d=0;b=i;d=a+4|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;c[d+24>>2]=0;c[a>>2]=759288;c[a+40>>2]=0;c[a+32>>2]=0;i=b;return}function fDa(a){a=a|0;var b=0;b=i;gDa(a);v2a(a);i=b;return}function gDa(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=759288;d=c[a+32>>2]|0;if((d|0)!=0?(c[a+36>>2]|0)!=0:0){Rc[c[(c[d>>2]|0)+4>>2]&1023](d)}v2a(c[a+40>>2]|0);HCa(a);i=b;return}function hDa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;c[a+32>>2]=b;c[a+36>>2]=d;d=a+8|0;c[d>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];b=Lc[c[(c[a>>2]|0)+28>>2]&255](a)|0;f=b&255;c[a+16>>2]=f;c[a+20>>2]=b>>>8&255;b=a+24|0;c[b>>2]=(((ca(c[d>>2]|0,f)|0)+31|0)/32|0)<<2;c[a+28>>2]=Lc[c[(c[a>>2]|0)+32>>2]&255](a)|0;c[a+40>>2]=w2a(c[b>>2]|0,1)|0;i=e;return}function iDa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=c[(c[a>>2]|0)+36>>2]|0;f=a+40|0;g=c[f>>2]|0;h=c[a+32>>2]|0;j=dd[c[(c[h>>2]|0)+12>>2]&511](h,b)|0;ld[e&255](a,g,j);i=d;return c[f>>2]|0}function jDa(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0;k=i;l=c[a+32>>2]|0;Uc[c[(c[l>>2]|0)+20>>2]&7](l,b,d,e,f,g,h,j);Fc[c[(c[a>>2]|0)+40>>2]&63](a,d,d,j,e);i=k;return}function kDa(a){a=a|0;var b=0;b=i;g[a+28>>2]=1.0;g[a+16>>2]=1.0;g[a+36>>2]=0.0;g[a+32>>2]=0.0;g[a+24>>2]=0.0;g[a+20>>2]=0.0;sCa(a+44|0);HBa(a+116|0);c[a+260>>2]=0;c[a+40>>2]=0;c[a+300>>2]=0;c[a+304>>2]=0;i=b;return}function lDa(a){a=a|0;var b=0,d=0;b=i;d=c[a+40>>2]|0;if((d|0)!=0){BDa(d);v2a(d)}IBa(a+116|0);tCa(a+44|0);i=b;return}function mDa(a,b,d,e,f,h,j,k,l,m,n){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0,C=0.0,D=0.0,E=0,F=0;o=i;i=i+80|0;p=o+64|0;q=o+48|0;r=o+32|0;s=o+16|0;t=o;u=a+16|0;c[u+0>>2]=c[j+0>>2];c[u+4>>2]=c[j+4>>2];c[u+8>>2]=c[j+8>>2];c[u+12>>2]=c[j+12>>2];c[u+16>>2]=c[j+16>>2];c[u+20>>2]=c[j+20>>2];ema(p,u);Mla(q,p);p=a+272|0;if((d|0)==0){v=b+12|0;w=b+8|0;x=0;y=0}else{v=d+16|0;w=d+12|0;x=c[d+4>>2]|0;y=c[d+8>>2]|0}z=c[w>>2]|0;w=c[v>>2]|0;c[a+272>>2]=x;c[a+276>>2]=y;c[a+280>>2]=z;c[a+284>>2]=w;Ela(p,q);if(($L(p)|0)!=0){i=o;return}c[a>>2]=b;c[a+4>>2]=d;c[a+12>>2]=h;c[a+8>>2]=f;c[u+0>>2]=c[j+0>>2];c[u+4>>2]=c[j+4>>2];c[u+8>>2]=c[j+8>>2];c[u+12>>2]=c[j+12>>2];c[u+16>>2]=c[j+16>>2];c[u+20>>2]=c[j+20>>2];c[a+288>>2]=k;c[a+292>>2]=m;c[a+296>>2]=n;j=a+300|0;c[j>>2]=l;w=a+304|0;c[w>>2]=0;z=a+20|0;A=+g[z>>2];B=+R(+A);C=+g[u>>2];if((!(B>=.5|C==0.0)?!(+R(+(+g[a+24>>2]))>=.5):0)?(D=+g[a+28>>2],!(D==0.0)):0){y=c[q>>2]|0;x=(c[q+8>>2]|0)-y|0;v=C<0.0?0-x|0:x;x=c[q+4>>2]|0;E=(c[q+12>>2]|0)-x|0;F=D>0.0?0-E|0:E;if((v|0)==0|(F|0)==0){i=o;return}c[t+0>>2]=c[p+0>>2];c[t+4>>2]=c[p+4>>2];c[t+8>>2]=c[p+8>>2];c[t+12>>2]=c[p+12>>2];c[t>>2]=(c[t>>2]|0)-y;E=t+8|0;c[E>>2]=(c[E>>2]|0)-y;y=t+4|0;c[y>>2]=(c[y>>2]|0)-x;y=t+12|0;c[y>>2]=(c[y>>2]|0)-x;x=a+116|0;JBa(x,b,d,f,h,p,0,0,0,l,m,n,0);c[a+260>>2]=1;vCa(a+44|0,x,e,v,F,t,k)|0;i=o;return}D=+R(+C);if(D<B/20.0?(B=+R(+(+g[a+28>>2])),t=a+24|0,C=+g[t>>2],B<+R(+C)/20.0&D<.5&B<.5):0){F=c[q>>2]|0;v=(c[q+8>>2]|0)-F|0;x=c[q+4>>2]|0;l=(c[q+12>>2]|0)-x|0;c[r+0>>2]=c[p+0>>2];c[r+4>>2]=c[p+4>>2];c[r+8>>2]=c[p+8>>2];c[r+12>>2]=c[p+12>>2];c[r>>2]=(c[r>>2]|0)-F;q=r+8|0;c[q>>2]=(c[q>>2]|0)-F;F=r+4|0;c[F>>2]=(c[F>>2]|0)-x;F=r+12|0;c[F>>2]=(c[F>>2]|0)-x;vDa(s,r,v,l,C>0.0&1,A<0.0&1);c[r+0>>2]=c[s+0>>2];c[r+4>>2]=c[s+4>>2];c[r+8>>2]=c[s+8>>2];c[r+12>>2]=c[s+12>>2];s=a+116|0;JBa(s,b,d,f,h,p,1,+g[t>>2]>0.0&1,+g[z>>2]<0.0&1,c[j>>2]|0,m,n,c[w>>2]|0);if((vCa(a+44|0,s,e,l,v,r,k)|0)==0){i=o;return}c[a+260>>2]=1;i=o;return}c[a+260>>2]=2;r=u2a(148)|0;ADa(r);c[a+40>>2]=r;if((r|0)==0){i=o;return}xDa(r,e,u,k,p);i=o;return}function nDa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=i;e=c[a+260>>2]|0;if((e|0)==2){f=a+40|0;if((yDa(c[f>>2]|0,b)|0)!=0){g=1;i=d;return g|0}h=(c[f>>2]|0)+136|0;j=c[h>>2]|0;c[h>>2]=0;if((j|0)==0){g=0;i=d;return g|0}if((Lc[c[(c[j>>2]|0)+8>>2]&255](j)|0)==0){Rc[c[(c[j>>2]|0)+4>>2]&1023](j);g=0;i=d;return g|0}h=c[a+8>>2]|0;k=(h|0)!=255;if((c[j+20>>2]|0)==1){l=a+292|0;m=c[l>>2]|0;do{if(k){n=m>>8;if((n|0)==0){o=a+12|0;p=c[o>>2]|0;c[o>>2]=(((ca(p>>>24,h)|0)>>>0)/255|0)<<24|p&16777215;q=m;break}else{p=((ca(m&255,h)|0)/255|0)&255|n<<8;c[l>>2]=p;q=p;break}}else{q=m}}while(0);m=c[f>>2]|0;FBa(c[a>>2]|0,c[m+20>>2]|0,c[m+24>>2]|0,c[j+8>>2]|0,c[j+12>>2]|0,j,c[a+12>>2]|0,0,0,c[a+304>>2]|0,c[a+4>>2]|0,c[a+300>>2]|0,q,c[a+296>>2]|0)|0}else{if(k){aDa(j,h)}h=c[f>>2]|0;EBa(c[a>>2]|0,c[h+20>>2]|0,c[h+24>>2]|0,c[j+8>>2]|0,c[j+12>>2]|0,j,0,0,c[a+304>>2]|0,c[a+4>>2]|0,c[a+300>>2]|0,c[a+296>>2]|0)|0}Rc[c[(c[j>>2]|0)+4>>2]&1023](j);g=0;i=d;return g|0}else if((e|0)==1){g=yCa(a+44|0,b)|0;i=d;return g|0}else{g=0;i=d;return g|0}return 0}function oDa(a){a=a|0;var b=0;b=a+4|0;a=c[b>>2]|0;c[b>>2]=0;return a|0}function pDa(a){a=a|0;c[a>>2]=759344;c[a+4>>2]=0;return}function qDa(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=759344;d=c[a+4>>2]|0;if((d|0)==0){i=b;return}Rc[c[(c[d>>2]|0)+4>>2]&1023](d);i=b;return}function rDa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+4|0;a=c[e>>2]|0;if((a|0)!=0){Rc[c[(c[a>>2]|0)+4>>2]&1023](a)}c[e>>2]=b;i=d;return}function sDa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;g=a+4|0;a=c[g>>2]|0;h=dd[c[(c[a>>2]|0)+12>>2]&511](a,b)|0;a=c[(c[g>>2]|0)+4>>2]|0;if((a|0)==0){j=0}else{j=dd[c[(c[a>>2]|0)+12>>2]&511](a,b)|0}if((h|0)!=0){c3a(h|0,d|0,c[(c[g>>2]|0)+24>>2]|0)|0}if((j|0)==0){i=f;return}c3a(j|0,e|0,c[(c[(c[g>>2]|0)+4>>2]|0)+24>>2]|0)|0;i=f;return}function tDa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;h=u2a(40)|0;j=h+4|0;c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;c[j+20>>2]=0;c[h>>2]=759208;c[h+36>>2]=0;c[h+32>>2]=0;c[h+28>>2]=0;j=a+4|0;c[j>>2]=h;if((h|0)==0){k=0;i=g;return k|0}if((JCa(h,b,d,e,0)|0)==0){e=c[j>>2]|0;if((e|0)!=0){Rc[c[(c[e>>2]|0)+4>>2]&1023](e)}c[j>>2]=0;k=0;i=g;return k|0}else{if((f|0)==0){k=1;i=g;return k|0}MCa(c[j>>2]|0,f);k=1;i=g;return k|0}return 0}function uDa(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;g=i;h=b+12|0;j=c[h>>2]|0;k=b+8|0;l=c[k>>2]|0;if(!((j|0)>0&(l|0)>0)){m=0;i=g;return m|0}n=u2a(40)|0;ICa(n);if((n|0)==0){m=0;i=g;return m|0}o=b+16|0;if((JCa(n,j,l,(c[b+20>>2]<<8)+(c[o>>2]|0)|0,0)|0)==0){Rc[c[(c[n>>2]|0)+4>>2]&1023](n);m=0;i=g;return m|0}MCa(n,c[b+28>>2]|0);p=c[n+24>>2]|0;q=Lc[c[(c[n>>2]|0)+8>>2]&255](n)|0;r=(e|0)!=0;if(r){e=c[h>>2]|0;s=e-j|0;t=e}else{s=0;t=j}e=(f|0)!=0;if(e){f=c[k>>2]|0;u=f-l|0;v=f}else{u=0;v=l}f=c[o>>2]|0;if((f|0)==1){f3a(q|0,-1,ca(p,l)|0)|0;if((s|0)<(t|0)){o=s+ -1|0;k=q+(ca(p,l+ -1|0)|0)|0;h=e?0-p|0:p;w=(u|0)<(v|0);x=e?k:q;k=s;do{y=dd[c[(c[b>>2]|0)+12>>2]&511](b,k)|0;if(r){z=o-k+j|0}else{z=k}if(w){A=1<<7-((z|0)%8|0)^255;B=(z|0)/8|0;C=u;D=x;while(1){if((1<<7-((C|0)%8|0)&(d[y+((C|0)/8|0)>>0]|0)|0)==0){E=D+B|0;a[E>>0]=(d[E>>0]|0)&A}C=C+1|0;if((C|0)==(v|0)){break}else{D=D+h|0}}}k=k+1|0}while((k|0)!=(t|0))}}else{k=(f|0)/8|0;h=e?0-p|0:p;x=(f+ -24|0)>>>0<8?h+ -2|0:h;if((s|0)<(t|0)){h=s+ -1|0;z=ca(p,l+ -1|0)|0;p=(f+ -32|0)>>>0<8;w=(u|0)<(v|0);o=ca(k,u)|0;D=(f+ -8|0)>>>0<8;f=x+2|0;C=e?z:0;z=s;do{if(r){F=h-z+j|0}else{F=z}A=q+((ca(F,k)|0)+C)|0;B=dd[c[(c[b>>2]|0)+12>>2]&511](b,z)|0;do{if(p){if(w){y=u;E=A;G=B+(u<<2)|0;while(1){c[E>>2]=c[G>>2];y=y+1|0;if((y|0)==(v|0)){break}else{E=E+x|0;G=G+4|0}}}}else{G=B+o|0;if(D){if(w){H=u;I=A;J=G}else{break}while(1){a[I>>0]=a[J>>0]|0;H=H+1|0;if((H|0)==(v|0)){break}else{I=I+x|0;J=J+1|0}}}else{if(w){K=u;L=A;M=G}else{break}while(1){a[L>>0]=a[M>>0]|0;a[L+1>>0]=a[M+1>>0]|0;a[L+2>>0]=a[M+2>>0]|0;K=K+1|0;if((K|0)==(v|0)){break}else{L=L+f|0;M=M+3|0}}}}}while(0);z=z+1|0}while((z|0)!=(t|0))}}z=b+4|0;if((c[z>>2]|0)==0){m=n;i=g;return m|0}b=c[n+4>>2]|0;M=c[b+24>>2]|0;f=Lc[c[(c[b>>2]|0)+8>>2]&255](b)|0;b=e?0-M|0:M;if((s|0)>=(t|0)){m=n;i=g;return m|0}L=s+ -1|0;K=ca(M,l+ -1|0)|0;l=(u|0)<(v|0);M=e?K:0;K=s;do{if(r){N=L-K+j|0}else{N=K}s=c[z>>2]|0;e=dd[c[(c[s>>2]|0)+12>>2]&511](s,K)|0;if(l){s=u;w=f+(N+M)|0;J=e+u|0;while(1){a[w>>0]=a[J>>0]|0;s=s+1|0;if((s|0)==(v|0)){break}else{w=w+b|0;J=J+1|0}}}K=K+1|0}while((K|0)!=(t|0));m=n;i=g;return m|0}function vDa(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0;h=i;j=c[b+4>>2]|0;if((g|0)==0){c[a>>2]=j;c[a+8>>2]=c[b+12>>2]}else{c[a>>2]=e-j;c[a+8>>2]=e-(c[b+12>>2]|0)}e=c[b>>2]|0;if((f|0)==0){c[a+4>>2]=e;c[a+12>>2]=c[b+8>>2];Dla(a);i=h;return}else{c[a+4>>2]=d-e;c[a+12>>2]=d-(c[b+8>>2]|0);Dla(a);i=h;return}}function wDa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;i=i+160|0;g=f;ADa(g);xDa(g,a,b,0,0);yDa(g,0)|0;c[d>>2]=c[g+20>>2];c[e>>2]=c[g+24>>2];e=oDa(g+132|0)|0;BDa(g);i=f;return e|0}function xDa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0,D=0,E=0,F=0.0,G=0.0,H=0.0;h=i;i=i+128|0;j=h+104|0;k=h+88|0;l=h+72|0;m=h+56|0;n=h+32|0;o=h+16|0;p=h;c[a>>2]=d;ema(j,d);Nla(k,j);c[l+0>>2]=c[k+0>>2];c[l+4>>2]=c[k+4>>2];c[l+8>>2]=c[k+8>>2];c[l+12>>2]=c[k+12>>2];if((f|0)!=0){Ela(l,f)}f=l+8|0;j=c[f>>2]|0;q=c[l>>2]|0;if((j|0)<=(q|0)){i=h;return}r=l+12|0;s=c[r>>2]|0;t=l+4|0;u=c[t>>2]|0;if((s|0)<=(u|0)){i=h;return}c[a+20>>2]=q;c[a+24>>2]=u;c[a+28>>2]=j-q;c[a+32>>2]=s-u;c[a+140>>2]=e;v=+g[d>>2];w=+R(+v);x=+g[d+4>>2];y=+R(+x);if(w<y/20.0){z=+R(+(+g[d+12>>2]));A=+g[d+8>>2];if(z<+R(+A)/20.0&w<.5&z<.5){B=c[k>>2]|0;C=(c[k+8>>2]|0)-B|0;D=c[k+4>>2]|0;E=(c[k+12>>2]|0)-D|0;c[l>>2]=q-B;c[f>>2]=j-B;c[t>>2]=u-D;c[r>>2]=s-D;vDa(m,l,C,E,A>0.0&1,x<0.0&1);c[l+0>>2]=c[m+0>>2];c[l+4>>2]=c[m+4>>2];c[l+8>>2]=c[m+8>>2];c[l+12>>2]=c[m+12>>2];vCa(a+60|0,a+132|0,b,E,C,l,e)|0;c[a+144>>2]=1;i=h;return}else{F=A}}else{F=+g[d+8>>2]}if(y<.05000000074505806?+R(+F)<.05000000074505806:0){if(v>0.0){G=+ba(+v)}else{G=+Q(+v)}y=+g[d+12>>2];if(y>0.0){H=+ba(+y)}else{H=+Q(+y)}C=c[k>>2]|0;E=c[k+4>>2]|0;c[l>>2]=q-C;c[f>>2]=j-C;c[t>>2]=u-E;c[r>>2]=s-E;vCa(a+60|0,a+132|0,b,~~G,~~-H,l,e)|0;c[a+144>>2]=2;i=h;return}E=~~+ba(+(+S(+(v*v+x*x))));H=+g[d+12>>2];s=~~+ba(+(+S(+(F*F+H*H))));G=+(s|0);g[n>>2]=1.0;g[n+4>>2]=0.0;g[n+8>>2]=0.0;g[n+12>>2]=-1.0;g[n+16>>2]=0.0;g[n+20>>2]=G;y=+(E|0);Vla(n,v/y,x/y,F/G,H/G,+g[d+16>>2],+g[d+20>>2]);d=a+36|0;Ula(d,n);Gla(o,l);Kla(o,d);d=a+4|0;Mla(p,o);c[d+0>>2]=c[p+0>>2];c[d+4>>2]=c[p+4>>2];c[d+8>>2]=c[p+8>>2];c[d+12>>2]=c[p+12>>2];xxa(d,E,s);vCa(a+60|0,a+132|0,b,E,s,d,e)|0;c[a+144>>2]=3;i=h;return}function yDa(b,e){b=b|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0.0,Na=0.0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0;f=i;i=i+1824|0;h=f+1792|0;j=f+1764|0;k=f+1760|0;l=f+1756|0;m=f+1752|0;n=f+1748|0;o=f+1720|0;p=f+1716|0;q=f+1712|0;r=f+1708|0;s=f+1704|0;t=f+1672|0;u=f+1656|0;v=f+1640|0;w=f+1608|0;x=f+1604|0;y=f+1600|0;z=f+1572|0;A=f+1568|0;B=f+1564|0;C=f+1560|0;D=f+1556|0;E=f+1528|0;F=f+1524|0;G=f+1520|0;H=f+1516|0;I=f+1512|0;J=f+1480|0;K=f+1464|0;L=f+1448|0;M=f+1416|0;N=f+1412|0;O=f+1408|0;P=f+384|0;Q=f+356|0;R=f+352|0;S=f+348|0;T=f+344|0;U=f+340|0;V=f+312|0;W=f+308|0;X=f+304|0;Y=f+300|0;Z=f+296|0;_=f+264|0;$=f+248|0;aa=f+232|0;ba=f+200|0;da=f+196|0;ea=f+192|0;fa=f+164|0;ga=f+160|0;ha=f+156|0;ia=f+152|0;ja=f+148|0;ka=f+120|0;la=f+116|0;ma=f+112|0;na=f+108|0;oa=f+104|0;pa=f+72|0;qa=f+56|0;ra=f+40|0;sa=f+8|0;ta=f+4|0;ua=f;va=c[b+144>>2]|0;if((va|0)==2){wa=yCa(b+60|0,e)|0;i=f;return wa|0}else if((va|0)==3){if((yCa(b+60|0,e)|0)!=0){wa=1;i=f;return wa|0}xa=b+4|0;ya=(c[b+12>>2]|0)-(c[xa>>2]|0)|0;za=b+8|0;Aa=(c[b+16>>2]|0)-(c[za>>2]|0)|0;Ba=b+132|0;Ca=b+136|0;Da=c[Ca>>2]|0;if((Da|0)==0){wa=0;i=f;return wa|0}Ea=Lc[c[(c[Da>>2]|0)+8>>2]&255](Da)|0;Da=c[Ca>>2]|0;Fa=c[Da+4>>2]|0;if((Fa|0)==0){Ga=Da;Ha=0}else{Da=Lc[c[(c[Fa>>2]|0)+8>>2]&255](Fa)|0;Ga=c[Ca>>2]|0;Ha=Da}Da=c[Ga+24>>2]|0;Ga=u2a(40)|0;ICa(Ga);if((Ga|0)==0){wa=0;i=f;return wa|0}Fa=c[b+64>>2]|0;Ia=FDa(c[Fa+16>>2]|0,c[Fa+20>>2]|0)|0;Fa=b+28|0;Ja=b+32|0;if((JCa(Ga,c[Fa>>2]|0,c[Ja>>2]|0,Ia,0)|0)==0){Rc[c[(c[Ga>>2]|0)+4>>2]&1023](Ga);wa=0;i=f;return wa|0}WCa(Ga,0);Ka=Ga+4|0;La=c[Ka>>2]|0;if((La|0)!=0){WCa(La,0)}Ma=+(c[b+20>>2]|0);Na=+(c[b+24>>2]|0);g[h>>2]=1.0;g[h+4>>2]=0.0;g[h+8>>2]=0.0;g[h+12>>2]=1.0;g[h+16>>2]=Ma;g[h+20>>2]=Na;Wla(h,b+36|0);mM(h,0-(c[xa>>2]|0)|0,0-(c[za>>2]|0)|0);za=c[Ka>>2]|0;xa=(za|0)==0;a:do{if((Ha|0)==0){if(!xa){WCa(za,-16777216)}}else{if(!xa){La=c[(c[(c[Ca>>2]|0)+4>>2]|0)+24>>2]|0;Oa=c[b+140>>2]|0;if((Oa&132|0)==0){IDa(j,h);if((c[Ja>>2]|0)<=0){break}Pa=ya+ -1|0;Qa=Aa+ -1|0;Ra=0;while(1){Sa=c[Ka>>2]|0;Ta=dd[c[(c[Sa>>2]|0)+12>>2]&511](Sa,Ra)|0;if((c[Fa>>2]|0)>0){Sa=0;Ua=Ta;while(1){GDa(j,Sa,Ra,k,l,m,n);Ta=c[k>>2]|0;if(!((Ta|0)<0|(Ta|0)>(ya|0))?(Va=c[l>>2]|0,!((Va|0)<0|(Va|0)>(Aa|0))):0){if((Ta|0)==(ya|0)){c[k>>2]=Pa;Wa=Pa}else{Wa=Ta}if((Va|0)==(Aa|0)){c[l>>2]=Qa;Xa=Qa}else{Xa=Va}Va=Wa+1|0;Ta=Xa+1|0;Ya=ca(Xa,La)|0;Za=ca((Ta|0)==(Aa|0)?Xa:Ta,La)|0;a[Ua>>0]=CDa(Ha,Ya,Za,Wa,(Va|0)==(ya|0)?Wa:Va,c[m>>2]|0,c[n>>2]|0,1,0)|0}Sa=Sa+1|0;if((Sa|0)>=(c[Fa>>2]|0)){break}else{Ua=Ua+1|0}}}Ra=Ra+1|0;if((Ra|0)>=(c[Ja>>2]|0)){break a}}}if((Oa&128|0)==0){IDa(w,h);if((c[Ja>>2]|0)<=0){break}Ra=ya+ -1|0;Qa=Aa+ -1|0;Pa=0;do{Ua=c[Ka>>2]|0;Sa=dd[c[(c[Ua>>2]|0)+12>>2]&511](Ua,Pa)|0;if((c[Fa>>2]|0)>0){Ua=0;Va=Sa;while(1){HDa(w,Ua,Pa,x,y);Sa=c[x>>2]|0;do{if(!((Sa|0)<0|(Sa|0)>(ya|0))){Za=c[y>>2]|0;if((Za|0)<0|(Za|0)>(Aa|0)){break}if((Sa|0)==(ya|0)){c[x>>2]=Ra;_a=Ra}else{_a=Sa}if((Za|0)==(Aa|0)){c[y>>2]=Qa;$a=Qa}else{$a=Za}a[Va>>0]=a[Ha+((ca($a,La)|0)+_a)>>0]|0}}while(0);Ua=Ua+1|0;if((Ua|0)>=(c[Fa>>2]|0)){break}else{Va=Va+1|0}}}Pa=Pa+1|0}while((Pa|0)<(c[Ja>>2]|0))}else{IDa(o,h);if((c[Ja>>2]|0)<=0){break}Pa=ya+ -1|0;Qa=Aa+ -1|0;Ra=0;do{Oa=c[Ka>>2]|0;Va=dd[c[(c[Oa>>2]|0)+12>>2]&511](Oa,Ra)|0;if((c[Fa>>2]|0)>0){Oa=0;Ua=Va;while(1){GDa(o,Oa,Ra,p,q,r,s);Va=c[p>>2]|0;do{if(!((Va|0)<0|(Va|0)>(ya|0))){Sa=c[q>>2]|0;if((Sa|0)<0|(Sa|0)>(Aa|0)){break}if((Va|0)==(ya|0)){c[p>>2]=Pa;ab=Pa}else{ab=Va}if((Sa|0)==(Aa|0)){c[q>>2]=Qa;bb=Qa}else{bb=Sa}EDa(t,u,v,ab,bb,c[r>>2]|0,c[s>>2]|0,ya,Aa);a[Ua>>0]=DDa(Ha,La,t,u,v,1,0)|0}}while(0);Oa=Oa+1|0;if((Oa|0)>=(c[Fa>>2]|0)){break}else{Ua=Ua+1|0}}}Ra=Ra+1|0}while((Ra|0)<(c[Ja>>2]|0))}}}}while(0);v=c[Ca>>2]|0;Ca=c[v+20>>2]|0;b:do{if((Ca|0)==1){u=c[b+140>>2]|0;if((u&132|0)==0){IDa(z,h);if((c[Ja>>2]|0)<=0){break}t=ya+ -1|0;Ha=Aa+ -1|0;s=0;while(1){r=dd[c[(c[Ga>>2]|0)+12>>2]&511](Ga,s)|0;if((c[Fa>>2]|0)>0){bb=0;ab=r;while(1){GDa(z,bb,s,A,B,C,D);r=c[A>>2]|0;if(!((r|0)<0|(r|0)>(ya|0))?(q=c[B>>2]|0,!((q|0)<0|(q|0)>(Aa|0))):0){if((r|0)==(ya|0)){c[A>>2]=t;cb=t}else{cb=r}if((q|0)==(Aa|0)){c[B>>2]=Ha;db=Ha}else{db=q}q=cb+1|0;r=db+1|0;p=ca(db,Da)|0;o=ca((r|0)==(Aa|0)?db:r,Da)|0;a[ab>>0]=CDa(Ea,p,o,cb,(q|0)==(ya|0)?cb:q,c[C>>2]|0,c[D>>2]|0,1,0)|0}bb=bb+1|0;if((bb|0)>=(c[Fa>>2]|0)){break}else{ab=ab+1|0}}}s=s+1|0;if((s|0)>=(c[Ja>>2]|0)){break b}}}if((u&128|0)==0){IDa(M,h);if((c[Ja>>2]|0)<=0){break}s=ya+ -1|0;Ha=Aa+ -1|0;t=0;do{ab=dd[c[(c[Ga>>2]|0)+12>>2]&511](Ga,t)|0;if((c[Fa>>2]|0)>0){bb=0;q=ab;while(1){HDa(M,bb,t,N,O);ab=c[N>>2]|0;do{if(!((ab|0)<0|(ab|0)>(ya|0))){o=c[O>>2]|0;if((o|0)<0|(o|0)>(Aa|0)){break}if((ab|0)==(ya|0)){c[N>>2]=s;eb=s}else{eb=ab}if((o|0)==(Aa|0)){c[O>>2]=Ha;fb=Ha}else{fb=o}a[q>>0]=a[Ea+((ca(fb,Da)|0)+eb)>>0]|0}}while(0);bb=bb+1|0;if((bb|0)>=(c[Fa>>2]|0)){break}else{q=q+1|0}}}t=t+1|0}while((t|0)<(c[Ja>>2]|0))}else{IDa(E,h);if((c[Ja>>2]|0)<=0){break}t=ya+ -1|0;Ha=Aa+ -1|0;s=0;do{u=dd[c[(c[Ga>>2]|0)+12>>2]&511](Ga,s)|0;if((c[Fa>>2]|0)>0){q=0;bb=u;while(1){GDa(E,q,s,F,G,H,I);u=c[F>>2]|0;do{if(!((u|0)<0|(u|0)>(ya|0))){ab=c[G>>2]|0;if((ab|0)<0|(ab|0)>(Aa|0)){break}if((u|0)==(ya|0)){c[F>>2]=t;gb=t}else{gb=u}if((ab|0)==(Aa|0)){c[G>>2]=Ha;hb=Ha}else{hb=ab}EDa(J,K,L,gb,hb,c[H>>2]|0,c[I>>2]|0,ya,Aa);a[bb>>0]=DDa(Ea,Da,J,K,L,1,0)|0}}while(0);q=q+1|0;if((q|0)>=(c[Fa>>2]|0)){break}else{bb=bb+1|0}}}s=s+1|0}while((s|0)<(c[Ja>>2]|0))}}else{s=c[v+16>>2]|0;Ha=(s|0)/8|0;t=(c[Ga+16>>2]|0)/8|0;bb=Ca>>>1&1;if((s+ -8|0)>>>0<8){s=c[v+28>>2]|0;if((s|0)==0){if((Ca&4|0)==0){q=0;do{c[P+(q<<2)>>2]=q*65793|-16777216;q=q+1|0}while((q|0)!=256)}else{q=0;do{c[P+(q<<2)>>2]=255-q;q=q+1|0}while((q|0)!=256)}}else{c3a(P|0,s|0,1024)|0}q=c[b+140>>2]|0;if((q&132|0)==0){IDa(Q,h);if((c[Ja>>2]|0)<=0){break}u=(Ia|0)==536;ab=ya+ -1|0;o=Aa+ -1|0;p=0;while(1){r=dd[c[(c[Ga>>2]|0)+12>>2]&511](Ga,p)|0;if((c[Fa>>2]|0)>0){Ka=0;_a=r;while(1){GDa(Q,Ka,p,R,S,T,U);r=c[R>>2]|0;do{if(!((r|0)<0|(r|0)>(ya|0))){$a=c[S>>2]|0;if(($a|0)<0|($a|0)>(Aa|0)){break}if((r|0)==(ya|0)){c[R>>2]=ab;ib=ab}else{ib=r}if(($a|0)==(Aa|0)){c[S>>2]=o;jb=o}else{jb=$a}$a=ib+1|0;y=jb+1|0;x=ca(jb,Da)|0;w=ca((y|0)==(Aa|0)?jb:y,Da)|0;y=c[P+(((CDa(Ea,x,w,ib,($a|0)==(ya|0)?ib:$a,c[T>>2]|0,c[U>>2]|0,1,0)|0)&255)<<2)>>2]|0;if(u){a[_a>>0]=y>>>24;a[_a+1>>0]=y>>>16;a[_a+2>>0]=y>>>8;break}else{c[_a>>2]=y;break}}}while(0);Ka=Ka+1|0;if((Ka|0)>=(c[Fa>>2]|0)){break}else{_a=_a+t|0}}}p=p+1|0;if((p|0)>=(c[Ja>>2]|0)){break b}}}if((q&128|0)==0){IDa(ba,h);if((c[Ja>>2]|0)<=0){break}p=(Ia|0)==536;u=ya+ -1|0;o=Aa+ -1|0;ab=0;while(1){s=dd[c[(c[Ga>>2]|0)+12>>2]&511](Ga,ab)|0;if((c[Fa>>2]|0)>0){_a=0;Ka=s;while(1){HDa(ba,_a,ab,da,ea);s=c[da>>2]|0;do{if(!((s|0)<0|(s|0)>(ya|0))){r=c[ea>>2]|0;if((r|0)<0|(r|0)>(Aa|0)){break}if((s|0)==(ya|0)){c[da>>2]=u;kb=u}else{kb=s}if((r|0)==(Aa|0)){c[ea>>2]=o;lb=o}else{lb=r}r=c[P+((d[Ea+((ca(lb,Da)|0)+kb)>>0]|0)<<2)>>2]|0;if(p){a[Ka>>0]=r>>>24;a[Ka+1>>0]=r>>>16;a[Ka+2>>0]=r>>>8;break}else{c[Ka>>2]=r;break}}}while(0);_a=_a+1|0;if((_a|0)>=(c[Fa>>2]|0)){break}else{Ka=Ka+t|0}}}ab=ab+1|0;if((ab|0)>=(c[Ja>>2]|0)){break b}}}else{IDa(V,h);if((c[Ja>>2]|0)<=0){break}ab=(Ia|0)==536;p=ya+ -1|0;o=Aa+ -1|0;u=0;while(1){q=dd[c[(c[Ga>>2]|0)+12>>2]&511](Ga,u)|0;if((c[Fa>>2]|0)>0){Ka=0;_a=q;while(1){GDa(V,Ka,u,W,X,Y,Z);q=c[W>>2]|0;do{if(!((q|0)<0|(q|0)>(ya|0))){s=c[X>>2]|0;if((s|0)<0|(s|0)>(Aa|0)){break}if((q|0)==(ya|0)){c[W>>2]=p;mb=p}else{mb=q}if((s|0)==(Aa|0)){c[X>>2]=o;nb=o}else{nb=s}EDa(_,$,aa,mb,nb,c[Y>>2]|0,c[Z>>2]|0,ya,Aa);s=c[P+(((DDa(Ea,Da,_,$,aa,1,0)|0)&255)<<2)>>2]|0;if(ab){a[_a>>0]=s>>>24;a[_a+1>>0]=s>>>16;a[_a+2>>0]=s>>>8;break}else{c[_a>>2]=s;break}}}while(0);Ka=Ka+1|0;if((Ka|0)>=(c[Fa>>2]|0)){break}else{_a=_a+t|0}}}u=u+1|0;if((u|0)>=(c[Ja>>2]|0)){break b}}}}u=c[b+140>>2]|0;if((u&132|0)==0){IDa(fa,h);if((c[Ja>>2]|0)<=0){break}ab=(bb|0)==0;o=(Ia|0)==1568;p=ya+ -1|0;_a=Aa+ -1|0;Ka=0;while(1){q=dd[c[(c[Ga>>2]|0)+12>>2]&511](Ga,Ka)|0;if((c[Fa>>2]|0)>0){s=0;r=q;while(1){GDa(fa,s,Ka,ga,ha,ia,ja);q=c[ga>>2]|0;do{if(!((q|0)<0|(q|0)>(ya|0))){y=c[ha>>2]|0;if((y|0)<0|(y|0)>(Aa|0)){break}if((q|0)==(ya|0)){c[ga>>2]=p;ob=p}else{ob=q}if((y|0)==(Aa|0)){c[ha>>2]=_a;pb=_a}else{pb=y}y=ob+1|0;$a=pb+1|0;w=(y|0)==(ya|0)?ob:y;y=ca(pb,Da)|0;x=ca(($a|0)==(Aa|0)?pb:$a,Da)|0;$a=c[ia>>2]|0;n=c[ja>>2]|0;m=CDa(Ea,y,x,ob,w,$a,n,Ha,2)|0;Wa=CDa(Ea,y,x,ob,w,$a,n,Ha,1)|0;Xa=CDa(Ea,y,x,ob,w,$a,n,Ha,0)|0;if(ab){if(o){c[r>>2]=(Wa&255)<<8|(m&255)<<16|Xa&255|((CDa(Ea,y,x,ob,w,$a,n,Ha,3)|0)&255)<<24;break}else{c[r>>2]=(m&255)<<16|(Wa&255)<<8|Xa&255|-16777216;break}}if((Ia|0)==536){a[r>>0]=Xa;a[r+1>>0]=Wa;a[r+2>>0]=m;break}else if((Ia|0)==544){c[r>>2]=(Wa&255)<<8|(m&255)<<16|Xa&255|((CDa(Ea,y,x,ob,w,$a,n,Ha,3)|0)&255)<<24;break}else{c[r>>2]=(Wa&255)<<8|(m&255)<<16|Xa&255|((CDa(Ea,y,x,ob,w,$a,n,Ha,3)|0)&255)<<24;break}}}while(0);s=s+1|0;if((s|0)>=(c[Fa>>2]|0)){break}else{r=r+t|0}}}Ka=Ka+1|0;if((Ka|0)>=(c[Ja>>2]|0)){break b}}}if((u&128|0)!=0){IDa(ka,h);if((c[Ja>>2]|0)<=0){break}Ka=(bb|0)==0;o=(Ia|0)==1568;ab=ya+ -1|0;_a=Aa+ -1|0;p=0;while(1){r=dd[c[(c[Ga>>2]|0)+12>>2]&511](Ga,p)|0;if((c[Fa>>2]|0)>0){s=0;q=r;while(1){GDa(ka,s,p,la,ma,na,oa);r=c[la>>2]|0;do{if(!((r|0)<0|(r|0)>(ya|0))){n=c[ma>>2]|0;if((n|0)<0|(n|0)>(Aa|0)){break}if((r|0)==(ya|0)){c[la>>2]=ab;qb=ab}else{qb=r}if((n|0)==(Aa|0)){c[ma>>2]=_a;rb=_a}else{rb=n}EDa(pa,qa,ra,qb,rb,c[na>>2]|0,c[oa>>2]|0,ya,Aa);n=DDa(Ea,Da,pa,qa,ra,Ha,2)|0;$a=DDa(Ea,Da,pa,qa,ra,Ha,1)|0;w=DDa(Ea,Da,pa,qa,ra,Ha,0)|0;if(Ka){if(o){c[q>>2]=($a&255)<<8|(n&255)<<16|w&255|((DDa(Ea,Da,pa,qa,ra,Ha,3)|0)&255)<<24;break}else{c[q>>2]=(n&255)<<16|($a&255)<<8|w&255|-16777216;break}}if((Ia|0)==536){a[q>>0]=w;a[q+1>>0]=$a;a[q+2>>0]=n;break}else if((Ia|0)==544){c[q>>2]=($a&255)<<8|(n&255)<<16|w&255|((DDa(Ea,Da,pa,qa,ra,Ha,3)|0)&255)<<24;break}else{c[q>>2]=($a&255)<<8|(n&255)<<16|w&255|((DDa(Ea,Da,pa,qa,ra,Ha,3)|0)&255)<<24;break}}}while(0);s=s+1|0;if((s|0)>=(c[Fa>>2]|0)){break}else{q=q+t|0}}}p=p+1|0;if((p|0)>=(c[Ja>>2]|0)){break b}}}IDa(sa,h);if((c[Ja>>2]|0)>0){p=(bb|0)==0;o=(Ia|0)==1568;Ka=(Ia|0)==544;_a=(Ia|0)==536;ab=ya+ -1|0;u=Aa+ -1|0;q=0;do{s=dd[c[(c[Ga>>2]|0)+12>>2]&511](Ga,q)|0;if((c[Fa>>2]|0)>0){r=0;w=s;while(1){HDa(sa,r,q,ta,ua);s=c[ta>>2]|0;do{if(!((s|0)<0|(s|0)>(ya|0))){n=c[ua>>2]|0;if((n|0)<0|(n|0)>(Aa|0)){break}if((s|0)==(ya|0)){c[ta>>2]=ab;sb=ab}else{sb=s}if((n|0)==(Aa|0)){c[ua>>2]=u;tb=u}else{tb=n}n=(ca(sb,Ha)|0)+(ca(tb,Da)|0)|0;$a=Ea+n|0;if(p){if(o){c[w>>2]=(d[Ea+(n+1)>>0]|0)<<8|(d[$a>>0]|0)|(d[Ea+(n+2)>>0]|0)<<16|(d[Ea+(n+3)>>0]|0)<<24;break}else{c[w>>2]=(d[Ea+(n+2)>>0]|0)<<16|(d[Ea+(n+1)>>0]|0)<<8|(d[$a>>0]|0)|-16777216;break}}if(Ka){c[w>>2]=(d[Ea+(n+2)>>0]|0)<<16|(d[Ea+(n+3)>>0]|0)<<24|(d[Ea+(n+1)>>0]|0)<<8|(d[$a>>0]|0);break}x=a[$a>>0]|0;if(_a){a[w>>0]=x;a[w+1>>0]=a[Ea+(n+1)>>0]|0;a[w+2>>0]=a[Ea+(n+2)>>0]|0;break}else{c[w>>2]=(d[Ea+(n+1)>>0]|0)<<8|x&255|(d[Ea+(n+2)>>0]|0)<<16|(d[Ea+(n+3)>>0]|0)<<24;break}}}while(0);r=r+1|0;if((r|0)>=(c[Fa>>2]|0)){break}else{w=w+t|0}}}q=q+1|0}while((q|0)<(c[Ja>>2]|0))}}}while(0);rDa(Ba,Ga);wa=0;i=f;return wa|0}else if((va|0)==1){if((yCa(b+60|0,e)|0)!=0){wa=1;i=f;return wa|0}e=c[b+136>>2]|0;if((e|0)==0){wa=0;i=f;return wa|0}va=c[b>>2]|0;rDa(b+132|0,uDa(e,+g[va+8>>2]>0.0&1,+g[va+4>>2]<0.0&1)|0);wa=0;i=f;return wa|0}else{wa=0;i=f;return wa|0}return 0}function zDa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;g=i;i=i+96|0;h=g+80|0;j=g+8|0;k=g;l=(b|0)>-1?b:0-b|0;c[h>>2]=0;m=h+4|0;c[m>>2]=0;n=h+8|0;c[n>>2]=l;o=h+12|0;c[o>>2]=(d|0)>-1?d:0-d|0;if((f|0)==0){p=l;q=0}else{Ela(h,f);p=c[n>>2]|0;q=c[h>>2]|0}if((p|0)<=(q|0)){r=0;i=g;return r|0}if((c[o>>2]|0)<=(c[m>>2]|0)){r=0;i=g;return r|0}if((c[a+8>>2]|0)==(b|0)?(c[a+12>>2]|0)==(d|0):0){r=RCa(a,h)|0;i=g;return r|0}sCa(j);pDa(k);if((vCa(j,k,a,b,d,h,e)|0)!=0){yCa(j,0)|0}e=oDa(k)|0;qDa(k);tCa(j);r=e;i=g;return r|0}function ADa(a){a=a|0;var b=0;b=i;g[a+48>>2]=1.0;g[a+36>>2]=1.0;g[a+56>>2]=0.0;g[a+52>>2]=0.0;g[a+44>>2]=0.0;g[a+40>>2]=0.0;sCa(a+60|0);pDa(a+132|0);c[a+144>>2]=0;c[a>>2]=0;i=b;return}function BDa(a){a=a|0;var b=0;b=i;qDa(a+132|0);tCa(a+60|0);i=b;return}function CDa(a,b,c,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0;k=255-g|0;l=ca(i,e)|0;e=ca(i,f)|0;f=j+b|0;b=j+c|0;c=ca(d[a+(f+l)>>0]|0,k)|0;j=((ca(d[a+(f+e)>>0]|0,g)|0)+c|0)>>>8;c=ca(d[a+(b+l)>>0]|0,k)|0;k=((ca(((ca(d[a+(b+e)>>0]|0,g)|0)+c|0)>>>8&255,h)|0)+(ca(j&255,255-h|0)|0)|0)>>>8&255;return k|0}function DDa(a,b,e,f,g,h,j){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0;k=i;l=0;m=0;do{n=(ca(c[e+(l+4<<2)>>2]|0,b)|0)+j|0;o=0;p=0;do{o=(ca(d[a+(n+(ca(c[e+(p<<2)>>2]|0,h)|0))>>0]|0,c[f+(p<<2)>>2]|0)|0)+o|0;p=p+1|0}while((p|0)!=4);m=(ca(c[g+(l<<2)>>2]|0,o)|0)+m|0;l=l+1|0}while((l|0)!=4);l=m>>16;if((l|0)<0){q=0;i=k;return q|0}q=(l|0)>255?-1:l&255;i=k;return q|0}function EDa(a,b,d,e,f,g,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0;l=i;m=e+ -1|0;c[a>>2]=m;c[a+4>>2]=e;c[a+8>>2]=e+1;c[a+12>>2]=e+2;c[a+16>>2]=f+ -1;c[a+20>>2]=f;c[a+24>>2]=f+1;c[a+28>>2]=f+2;f=k+ -1|0;e=j+ -1|0;n=m;m=0;while(1){o=a+(m<<2)|0;if((n|0)<0){c[o>>2]=0;p=0}else{p=n}if((p|0)>=(j|0)){c[o>>2]=e}o=a+(m+4<<2)|0;q=c[o>>2]|0;if((q|0)<0){c[o>>2]=0;r=0}else{r=q}if((r|0)>=(k|0)){c[o>>2]=f}o=m+1|0;if((o|0)==4){break}n=c[a+(o<<2)>>2]|0;m=o}c[b>>2]=c[759352+(g+256<<2)>>2];c[b+4>>2]=c[759352+(g<<2)>>2];c[b+8>>2]=c[759352+(256-g<<2)>>2];c[b+12>>2]=c[759352+(512-g<<2)>>2];c[d>>2]=c[759352+(h+256<<2)>>2];c[d+4>>2]=c[759352+(h<<2)>>2];c[d+8>>2]=c[759352+(256-h<<2)>>2];c[d+12>>2]=c[759352+(512-h<<2)>>2];i=l;return}function FDa(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=i;d=(b<<8)+a|0;if((b|0)!=1){if((d|0)>1024){e=1568}else{e=(d|0)<33|(d|0)==544?544:536}}else{e=264}i=c;return e|0}function GDa(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0;j=i;k=ca(c[a>>2]|0,b)|0;l=(ca(c[a+8>>2]|0,d)|0)+k|0;k=a+24|0;c[e>>2]=l+(c[a+16>>2]|0)+((c[k>>2]|0)/2|0);l=ca(c[a+4>>2]|0,b)|0;b=(ca(c[a+12>>2]|0,d)|0)+l|0;c[f>>2]=b+(c[a+20>>2]|0)+((c[k>>2]|0)/2|0);c[g>>2]=(c[e>>2]|0)%(c[k>>2]|0)|0;a=(c[f>>2]|0)%(c[k>>2]|0)|0;c[h>>2]=a;b=c[g>>2]|0;if((b|0)<0?(l=c[k>>2]|0,(b|0)>(0-l|0)):0){d=l+b|0;c[g>>2]=d;m=c[h>>2]|0;n=d}else{m=a;n=b}if((m|0)<0?(b=c[k>>2]|0,(n|0)>(0-b|0)):0){c[h>>2]=b+m}c[e>>2]=(c[e>>2]|0)/(c[k>>2]|0)|0;c[f>>2]=(c[f>>2]|0)/(c[k>>2]|0)|0;i=j;return}function HDa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=ca(c[a>>2]|0,b)|0;h=(ca(c[a+8>>2]|0,d)|0)+g|0;g=a+24|0;i=c[g>>2]|0;c[e>>2]=(h+(c[a+16>>2]|0)+((i|0)/2|0)|0)/(i|0)|0;i=ca(c[a+4>>2]|0,b)|0;b=(ca(c[a+12>>2]|0,d)|0)+i|0;i=c[g>>2]|0;c[f>>2]=(b+(c[a+20>>2]|0)+((i|0)/2|0)|0)/(i|0)|0;return}function IDa(a,b){a=a|0;b=b|0;var d=0;d=i;c[a+24>>2]=256;c[a>>2]=Fla(+g[b>>2]*256.0)|0;c[a+4>>2]=Fla(+g[b+4>>2]*256.0)|0;c[a+8>>2]=Fla(+g[b+8>>2]*256.0)|0;c[a+12>>2]=Fla(+g[b+12>>2]*256.0)|0;c[a+16>>2]=Fla(+g[b+16>>2]*256.0)|0;c[a+20>>2]=Fla(+g[b+20>>2]*256.0)|0;i=d;return}function JDa(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;g=i;if((d|0)==0){h=35;i=g;return h|0}j=d+88|0;if((c[j>>2]|0)==0){h=35;i=g;return h|0}k=c[d+84>>2]|0;if((k|0)==0){h=35;i=g;return h|0}qEa(k);l=k+24|0;a[k+94>>0]=0;m=k+100|0;n=k+72|0;o=l+0|0;p=o+40|0;do{c[o>>2]=0;o=o+4|0}while((o|0)<(p|0));c[n+0>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;o=m+0|0;p=o+56|0;do{c[o>>2]=0;o=o+4|0}while((o|0)<(p|0));o=c[d+96>>2]|0;p=c[(c[o+4>>2]|0)+160>>2]|0;m=(f&1024|0)==0?f:f|2049;if((m&1|0)==0){q=m}else{q=m&-15|10}a:do{if((((p|0)!=0?(q&32770|0)==0:0)?(m=c[c[o>>2]>>2]|0,(m&768|0)==256):0)?(f=c[d+8>>2]|0,(f&8192|0)==0):0){do{if((q&2048|0)==0){r=c[d+128>>2]|0;s=(c[r>>2]|0)==0;if((c[r+8>>2]|0)==0){if(s){t=26;break a}else{break}}else{if(s){break}else{t=26;break a}}}}while(0);if((((q&32|0)==0?(m&1024|0)!=0:0)?(q&983040|0)!=65536:0)?(a[(c[d+128>>2]|0)+52>>0]|0)==0:0){if((f&8|0)==0){t=26;break}if((c[d+684>>2]|0)==0){t=26;break}if((b[d+286>>1]|0)!=0){t=26;break}}if((((f&2|0)!=0?(q&8|0)==0:0)?(id[c[(c[o+12>>2]|0)+72>>2]&511](k,c[j>>2]|0,e,q|16384)|0)==0:0)?(c[n>>2]|0)==1651078259:0){u=0;break}s=(c[d+128>>2]|0)+24|0;r=c[s>>2]|0;c[s>>2]=0;v=ed[c[(c[(c[p>>2]|0)+20>>2]|0)+12>>2]&127](p,k,c[j>>2]|0,e,q)|0;c[s>>2]=r;u=v}else{t=26}}while(0);if((t|0)==26){p=id[c[(c[o+12>>2]|0)+72>>2]&511](k,c[j>>2]|0,e,q)|0;if((p|0)!=0){h=p;i=g;return h|0}if((c[n>>2]|0)==1869968492){p=vEa(k+108|0)|0;if((p|0)!=0){h=p;i=g;return h|0}if((q&2|0)==0){if((q&16|0)==0){p=k+44|0;c[p>>2]=c[p>>2]&-64;p=k+48|0;c[p>>2]=c[p>>2]&-64;p=k+32|0;e=c[p>>2]|0;o=e+63+(c[l>>2]|0)&-64;v=k+36|0;r=c[v>>2]|0;s=k+28|0;w=r-(c[s>>2]|0)&-64;x=e&-64;c[p>>2]=x;p=r+63&-64;c[v>>2]=p;c[l>>2]=o-x;c[s>>2]=p-w}else{w=k+32|0;c[w>>2]=c[w>>2]&-64;w=k+36|0;c[w>>2]=(c[w>>2]|0)+63&-64;w=k+44|0;p=c[w>>2]|0;s=p+63+(c[l>>2]|0)&-64;x=k+48|0;o=c[x>>2]|0;v=k+28|0;r=o+63+(c[v>>2]|0)&-64;e=p&-64;c[w>>2]=e;w=o&-64;c[x>>2]=w;c[l>>2]=s-e;c[v>>2]=r-w}w=k+40|0;c[w>>2]=(c[w>>2]|0)+32&-64;w=k+52|0;c[w>>2]=(c[w>>2]|0)+32&-64;u=0}else{u=0}}else{u=0}}if((q&16|0)==0){c[k+64>>2]=c[k+40>>2];c[k+68>>2]=0}else{c[k+64>>2]=0;c[k+68>>2]=c[k+52>>2]}if((q&8192|0)==0?(c[d+8>>2]&1|0)!=0:0){w=c[j>>2]|0;j=k+56|0;c[j>>2]=ODa(c[j>>2]|0,c[w+16>>2]|0,64)|0;j=k+60|0;c[j>>2]=ODa(c[j>>2]|0,c[w+20>>2]|0,64)|0}if((q&2048|0)==0?(w=c[d+128>>2]|0,d=w+24|0,(c[d>>2]|0)!=0):0){j=c[(c[(c[k+4>>2]|0)+96>>2]|0)+4>>2]|0;r=c[j+156>>2]|0;if((r|0)!=0){v=c[n>>2]|0;if((c[r+16>>2]|0)==(v|0)){y=r;t=46}else{z=v;t=45}}else{z=c[n>>2]|0;t=45}if((t|0)==45){v=aFa(j,z,0)|0;if((v|0)==0){if((c[n>>2]|0)==1869968492){z=c[d>>2]|0;if((z&1|0)==0){A=z}else{wEa(k+108|0,w);A=c[d>>2]|0}if((A&2|0)!=0){xEa(k+108|0,c[w+16>>2]|0,c[w+20>>2]|0);B=u}else{B=u}}else{B=u}}else{y=v;t=46}}if((t|0)==46){B=id[c[(c[y+12>>2]|0)+44>>2]&511](y,k,w,w+16|0)|0}yEa(k+64|0,w);C=B}else{C=u}if((C|0)!=0){h=C;i=g;return h|0}C=c[n>>2]|0;if((C|0)==1668246896|(C|0)==1651078259){h=0;i=g;return h|0}if((q&4|0)==0){h=0;i=g;return h|0}C=q>>>16&15;h=zEa(k,(C|0)!=0|(q&4096|0)==0?C:2)|0;i=g;return h|0}function KDa(a){a=a|0;var b=0,c=0;b=i;if((a|0)>-1){c=a+32768&-65536;i=b;return c|0}else{c=0-(32768-a&-65536)|0;i=b;return c|0}return 0}function LDa(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0;b=a>>>0>65535;c=b?a>>>16:a;a=b?16:0;if(c>>>0>255){d=c>>>8;e=a|8}else{d=c;e=a}if(d>>>0>15){f=d>>>4;g=e+4|0}else{f=d;g=e}if(f>>>0>3){h=f>>>2;i=g+2|0}else{h=f;i=g}return(h>>>0>1&1)+i|0}function MDa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;c[e>>2]=a;c[e+4>>2]=b;b=NDa(e)|0;i=d;return b|0}function NDa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;i=i+16|0;d=b;e=a;a=c[e>>2]|0;f=c[e+4>>2]|0;e=d;c[e>>2]=a;c[e+4>>2]=f;if((a|0)==0){g=(f|0)<0?0-f|0:f;i=b;return g|0}if((f|0)==0){g=(a|0)<0?0-a|0:a;i=b;return g|0}a=MFa(d)|0;NFa(d);f=OFa(c[d>>2]|0)|0;c[d>>2]=f;if((a|0)>0){g=f+(1<<a+ -1)>>a;i=b;return g|0}else{g=f<<0-a;i=b;return g|0}return 0}function ODa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+16|0;f=e;if((a|0)==0|(b|0)==(d|0)){g=a;i=e;return g|0}h=(a|0)<0?0-a|0:a;j=(b|0)<0?0-b|0:b;k=b^a^d;a=(d|0)<0?0-d|0:d;if((h|0)<46341&(j|0)<46341?(a+ -1|0)>>>0<176095:0){l=((a>>1)+(ca(j,h)|0)|0)/(a|0)|0}else{if((a|0)>0){PDa(h,j,f);j=c[f>>2]|0;h=j+(a>>1)|0;d=f+4|0;b=(h>>>0<j>>>0&1)+(c[d>>2]|0)|0;c[f>>2]=h;c[d>>2]=b;l=QDa(b,h,a)|0}else{l=2147483647}}g=(k|0)<0?0-l|0:l;i=e;return g|0}function PDa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=a&65535;f=a>>>16;a=b&65535;g=b>>>16;b=ca(a,f)|0;h=(ca(g,e)|0)+b|0;i=h<<16;j=i+(ca(a,e)|0)|0;e=(h>>>16)+(ca(g,f)|0)+((h>>>0<b>>>0&1)<<16)+(j>>>0<i>>>0&1)|0;c[d>>2]=j;c[d+4>>2]=e;return}function QDa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;if(a>>>0<c>>>0){e=b;f=32;g=0;h=a}else{j=2147483647;i=d;return j|0}while(1){a=g<<1;b=h<<1|e>>>31;if(b>>>0<c>>>0){k=a;l=b}else{k=a|1;l=b-c|0}f=f+ -1|0;if((f|0)==0){j=k;break}else{e=e<<1;g=k;h=l}}i=d;return j|0}function RDa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+16|0;f=e;if((a|0)==0|(b|0)==(d|0)){g=a;i=e;return g|0}h=(a|0)<0?0-a|0:a;j=(b|0)<0?0-b|0:b;k=b^a^d;a=(d|0)<0?0-d|0:d;d=(a|0)>0;if(!((h|0)<46341&(j|0)<46341&d)){if(d){PDa(h,j,f);l=QDa(c[f+4>>2]|0,c[f>>2]|0,a)|0}else{l=2147483647}}else{l=(ca(j,h)|0)/(a|0)|0}g=(k|0)<0?0-l|0:l;i=e;return g|0}function SDa(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;c=i;if((a|0)==0|(b|0)==65536){d=a;i=c;return d|0}e=(a|0)<0?0-a|0:a;f=(b|0)<0?0-b|0:b;if(e>>>0<2049&f>>>0<1048577){g=((ca(f,e)|0)+32768|0)>>>16}else{h=e&65535;g=(ca(f>>>16,h)|0)+(ca(e>>>16,f)|0)+(((ca(f&65535,h)|0)+32768|0)>>>16)|0}d=(b^a|0)<0?0-g|0:g;i=c;return d|0}function TDa(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;c=i;d=(a|0)<0?0-a|0:a;e=b^a;a=(b|0)<0?0-b|0:b;do{if((a|0)!=0){b=d>>16;f=d<<16;g=(a>>1)+f|0;if((b|0)==0){h=(g>>>0)/(a>>>0)|0;break}else{h=QDa((g>>>0<f>>>0&1)+b|0,g,a)|0;break}}else{h=2147483647}}while(0);i=c;return((e|0)<0?0-h|0:h)|0}function UDa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;f=d<<16;if((a|0)==0|(b|0)==0){i=e;return}d=ODa(c[a>>2]|0,c[b>>2]|0,f)|0;g=a+4|0;h=b+8|0;j=(ODa(c[g>>2]|0,c[h>>2]|0,f)|0)+d|0;d=b+4|0;k=ODa(c[a>>2]|0,c[d>>2]|0,f)|0;l=b+12|0;m=(ODa(c[g>>2]|0,c[l>>2]|0,f)|0)+k|0;k=a+8|0;g=ODa(c[k>>2]|0,c[b>>2]|0,f)|0;n=a+12|0;a=(ODa(c[n>>2]|0,c[h>>2]|0,f)|0)+g|0;g=ODa(c[k>>2]|0,c[d>>2]|0,f)|0;k=(ODa(c[n>>2]|0,c[l>>2]|0,f)|0)+g|0;c[b>>2]=j;c[d>>2]=m;c[h>>2]=a;c[l>>2]=k;i=e;return}function VDa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=d<<16;if((a|0)==0|(b|0)==0){i=e;return}d=ODa(c[a>>2]|0,c[b>>2]|0,f)|0;g=a+4|0;h=(ODa(c[g>>2]|0,c[b+4>>2]|0,f)|0)+d|0;d=ODa(c[a>>2]|0,c[b+8>>2]|0,f)|0;j=(ODa(c[g>>2]|0,c[b+12>>2]|0,f)|0)+d|0;c[a>>2]=h;c[g>>2]=j;i=e;return}function WDa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;g=f+8|0;h=f;if((b|0)==0){i=f;return((a|0)>-1?e:0-e|0)|0}do{if((a|0)!=0){if((e|0)==0){j=(d|0)>-1?b:0-b|0;break}if((d|0)==0){j=(e|0)>-1?0-a|0:a;break}PDa(a,e,g);PDa(b,d,h);k=c[g+4>>2]|0;l=c[h+4>>2]|0;if(!(k>>>0>l>>>0)){if(!(k>>>0<l>>>0)){l=c[g>>2]|0;k=c[h>>2]|0;if(l>>>0>k>>>0){j=1}else{j=(l>>>0<k>>>0)<<31>>31}}else{j=-1}}else{j=1}}else{j=(b|0)>-1?0-d|0:d}}while(0);i=f;return j|0}function XDa(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=c+a|0;f=d+b|0;g=((f|0)<0?0-f|0:f)+((e|0)<0?0-e|0:e)|0;return(((b|0)<0?0-b|0:b)+((a|0)<0?0-a|0:a)+((c|0)<0?0-c|0:c)+((d|0)<0?0-d|0:d)-g|0)<(g>>4|0)|0}function YDa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d;f=ZDa(a,96,e)|0;g=c[e>>2]|0;if((g|0)!=0){i=d;return g|0}c[f>>2]=a;c[b>>2]=f;i=d;return g|0}function ZDa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;g=EFa(a,b,f)|0;a=c[f>>2]|0;if((a|0)==0&(b|0)>0){f3a(g|0,0,b|0)|0}c[d>>2]=a;i=e;return g|0}function _Da(a){a=a|0;var d=0,e=0,f=0;d=i;e=a+20|0;b[a+22>>1]=0;b[e>>1]=0;c[a+48>>2]=0;f=a+56|0;a=e+0|0;e=f+36|0;do{c[f>>2]=c[a>>2];f=f+4|0;a=a+4|0}while((f|0)<(e|0));i=d;return}function $Da(a){a=a|0;var d=0,e=0,f=0;d=i;e=c[a>>2]|0;f=a+24|0;aEa(e,c[f>>2]|0);c[f>>2]=0;f=a+28|0;aEa(e,c[f>>2]|0);c[f>>2]=0;f=a+32|0;aEa(e,c[f>>2]|0);c[f>>2]=0;f=a+40|0;aEa(e,c[f>>2]|0);c[f>>2]=0;f=a+52|0;aEa(e,c[f>>2]|0);c[f>>2]=0;c[a+44>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;f=a+20|0;b[a+22>>1]=0;b[f>>1]=0;c[a+48>>2]=0;e=a+56|0;a=f+0|0;f=e+36|0;do{c[e>>2]=c[a>>2];e=e+4|0;a=a+4|0}while((e|0)<(f|0));i=d;return}function aEa(a,b){a=a|0;b=b|0;var d=0;d=i;if((b|0)==0){i=d;return}Ic[c[a+12>>2]&511](a,b);i=d;return}function bEa(a){a=a|0;var b=0,d=0;b=i;if((a|0)==0){i=b;return}d=c[a>>2]|0;$Da(a);aEa(d,a);i=b;return}function cEa(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;e=d;f=b+4|0;g=dEa(c[b>>2]|0,8,0,c[f>>2]<<1,0,e)|0;c[b+40>>2]=g;h=c[e>>2]|0;if((h|0)!=0){i=d;return h|0}a[b+16>>0]=1;c[b+44>>2]=g+(c[f>>2]<<3);eEa(b);i=d;return h|0}function dEa(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0;h=i;i=i+16|0;j=h;c[j>>2]=0;k=PFa(a,b,d,e,f,j)|0;f=c[j>>2]|0;if(!((f|0)==0&(e|0)>(d|0))){c[g>>2]=f;i=h;return k|0}f3a(k+(ca(d,b)|0)|0,0,ca(e-d|0,b)|0)|0;c[g>>2]=f;i=h;return k|0}function eEa(d){d=d|0;var e=0,f=0;e=i;f=b[d+22>>1]|0;c[d+60>>2]=(c[d+24>>2]|0)+(f<<3);c[d+64>>2]=(c[d+28>>2]|0)+f;c[d+68>>2]=(c[d+32>>2]|0)+(b[d+20>>1]<<1);if((a[d+16>>0]|0)==0){i=e;return}c[d+76>>2]=(c[d+40>>2]|0)+(f<<3);c[d+80>>2]=(c[d+44>>2]|0)+(f<<3);i=e;return}function fEa(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;g=i;i=i+16|0;h=g;j=c[d>>2]|0;c[h>>2]=0;k=(b[d+22>>1]|0)+e+(b[d+58>>1]|0)|0;e=d+4|0;l=c[e>>2]|0;do{if(k>>>0>l>>>0){m=k+7&-8;if(m>>>0>32767){n=10;i=g;return n|0}o=d+24|0;c[o>>2]=dEa(j,8,l,m,c[o>>2]|0,h)|0;o=c[h>>2]|0;if((o|0)==0){p=d+28|0;c[p>>2]=dEa(j,1,l,m,c[p>>2]|0,h)|0;p=c[h>>2]|0;if((p|0)==0){if((a[d+16>>0]|0)!=0){q=d+40|0;r=dEa(j,8,l<<1,m<<1,c[q>>2]|0,h)|0;c[q>>2]=r;s=c[h>>2]|0;if((s|0)!=0){t=s;break}d3a(r+(m<<3)|0,r+(l<<3)|0,l<<3|0)|0;c[d+44>>2]=(c[q>>2]|0)+(m<<3)}c[e>>2]=m;u=1;v=9}else{t=p}}else{t=o}}else{u=0;v=9}}while(0);do{if((v|0)==9){e=d+8|0;l=c[e>>2]|0;k=(b[d+20>>1]|0)+f+(b[d+56>>1]|0)|0;if(!(k>>>0>l>>>0)){if(u<<24>>24==0){n=0;i=g;return n|0}}else{o=k+3&-4;if(o>>>0>32767){n=10;i=g;return n|0}k=d+32|0;c[k>>2]=dEa(j,2,l,o,c[k>>2]|0,h)|0;k=c[h>>2]|0;if((k|0)!=0){t=k;break}c[e>>2]=o}eEa(d);n=0;i=g;return n|0}}while(0);$Da(d);n=t;i=g;return n|0}function gEa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;i=i+16|0;e=d;f=c[a>>2]|0;c[e>>2]=0;g=a+48|0;h=(c[g>>2]|0)+b+(c[a+84>>2]|0)|0;b=a+12|0;j=c[b>>2]|0;if(!(h>>>0>j>>>0)){k=0;i=d;return k|0}l=h+1&-2;h=a+52|0;m=dEa(f,32,j,l,c[h>>2]|0,e)|0;c[h>>2]=m;h=c[e>>2]|0;if((h|0)!=0){k=h;i=d;return k|0}c[b>>2]=l;c[a+88>>2]=m+(c[g>>2]<<5);k=0;i=d;return k|0}function hEa(a){a=a|0;var d=0;d=i;b[a+58>>1]=0;b[a+56>>1]=0;c[a+84>>2]=0;eEa(a);c[a+88>>2]=(c[a+52>>2]|0)+(c[a+48>>2]<<5);i=d;return}function iEa(a){a=a|0;var d=0,f=0,g=0,h=0,j=0,k=0;d=i;if((a|0)==0){i=d;return}f=b[a+56>>1]|0;g=f<<16>>16;h=a+22|0;j=b[h>>1]|0;b[h>>1]=(e[a+58>>1]|0)+j;h=a+20|0;b[h>>1]=(f&65535)+(e[h>>1]|0);h=a+48|0;c[h>>2]=(c[h>>2]|0)+(c[a+84>>2]|0);if(!(f<<16>>16==0)){f=a+68|0;h=0;do{k=(c[f>>2]|0)+(h<<1)|0;b[k>>1]=(e[k>>1]|0)+j;h=h+1|0}while(h>>>0<g>>>0)}hEa(a);i=d;return}function jEa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;a:do{if(!((a|0)==0|(b|0)==0)?(e=c[a>>2]|0,(e|0)!=0):0){f=e;e=a;while(1){g=e+8|0;if((R2a(f,b)|0)==0){break}f=c[g>>2]|0;if((f|0)==0){h=0;break a}else{e=g}}h=c[e+4>>2]|0}else{h=0}}while(0);i=d;return h|0}function kEa(a,b,d){a=a|0;b=b|0;d=d|0;c[a>>2]=b;c[a+4>>2]=d;c[a+8>>2]=0;c[a+12>>2]=0;return}function lEa(a,b){a=a|0;b=b|0;c[a+12>>2]=b;bb(a+16|0,1)}function mEa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;i=i+16|0;f=e;c[d>>2]=0;if((a|0)==0){g=33;i=e;return g|0}if((b|0)==0){g=6;i=e;return g|0}h=c[a>>2]|0;a=ZDa(h,40,f)|0;j=c[f>>2]|0;if((j|0)!=0){g=j;i=e;return g|0}c[a+28>>2]=h;j=c[b>>2]|0;do{if((j&1|0)==0){if((j&4|0)!=0){k=b+12|0;l=iGa(a,c[k>>2]|0)|0;c[f>>2]=l;c[a+16>>2]=c[k>>2];if((l|0)==0){m=a;n=13;break}else{o=l}}else{if((j&2|0)!=0?(l=b+16|0,(c[l>>2]|0)!=0):0){aEa(h,a);m=c[l>>2]|0;n=13;break}c[f>>2]=6;o=6}aEa(h,a);p=o;q=0}else{l=c[b+8>>2]|0;c[a>>2]=c[b+4>>2];c[a+4>>2]=l;c[a+8>>2]=0;c[a+32>>2]=0;c[a+20>>2]=0;c[a+24>>2]=0;m=a;n=13}}while(0);if((n|0)==13){c[m+28>>2]=h;p=0;q=m}c[d>>2]=q;g=p;i=e;return g|0}function nEa(a,b,d){a=a|0;b=b|0;d=d|0;c[a>>2]=b;c[a+4>>2]=d;c[a+8>>2]=0;c[a+32>>2]=0;c[a+20>>2]=0;c[a+24>>2]=0;return}function oEa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((a|0)!=0?(e=c[a+28>>2]|0,pEa(a),(b|0)==0):0){aEa(e,a)}i=d;return}function pEa(a){a=a|0;var b=0,d=0;b=i;if((a|0)!=0?(d=c[a+24>>2]|0,(d|0)!=0):0){Rc[d&1023](a)}i=b;return}function qEa(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+156|0;e=c[d>>2]|0;if((e|0)!=0?(c[e+4>>2]&1|0)!=0:0){e=a+88|0;aEa(c[(c[a+4>>2]|0)+100>>2]|0,c[e>>2]|0);c[e>>2]=0;e=(c[d>>2]|0)+4|0;c[e>>2]=c[e>>2]&-2;i=b;return}c[a+88>>2]=0;i=b;return}function rEa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;b=i;i=i+16|0;d=b+4|0;e=b;if((a|0)==0){f=6;i=b;return f|0}g=a+96|0;h=c[g>>2]|0;if((h|0)==0){f=6;i=b;return f|0}j=c[h+8>>2]|0;k=ZDa(j,c[(c[h+12>>2]|0)+44>>2]|0,e)|0;h=c[e>>2]|0;if((h|0)!=0){f=h;i=b;return f|0}c[k+4>>2]=a;h=c[g>>2]|0;g=c[h+12>>2]|0;l=c[h+8>>2]|0;c[d>>2]=0;c[k>>2]=c[h+4>>2];m=ZDa(l,40,d)|0;n=c[d>>2]|0;do{if((n|0)==0){c[k+156>>2]=m;if((c[c[h>>2]>>2]&512|0)==0?(o=YDa(l,m)|0,c[d>>2]=o,(o|0)!=0):0){p=o;q=9;break}o=c[g+64>>2]|0;if((o|0)!=0){r=Lc[o&255](k)|0;c[e>>2]=r;if((r|0)!=0){s=r;break}}else{c[e>>2]=0}r=a+84|0;c[k+8>>2]=c[r>>2];c[r>>2]=k;f=0;i=b;return f|0}else{p=n;q=9}}while(0);if((q|0)==9){c[e>>2]=p;s=p}sEa(k);aEa(j,k);f=s;i=b;return f|0}function sEa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=c[(c[a+4>>2]|0)+96>>2]|0;e=c[d+8>>2]|0;f=c[(c[d+12>>2]|0)+68>>2]|0;if((f|0)!=0){Rc[f&1023](a)}qEa(a);f=a+156|0;a=c[f>>2]|0;if((a|0)==0){i=b;return}if((c[c[d>>2]>>2]&512|0)==0){bEa(c[a>>2]|0);c[c[f>>2]>>2]=0;g=c[f>>2]|0}else{g=a}aEa(e,g);c[f>>2]=0;i=b;return}function tEa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;if((a|0)==0){i=b;return}d=c[a+4>>2]|0;e=c[(c[d+96>>2]|0)+8>>2]|0;f=d+84|0;d=c[f>>2]|0;if((d|0)==0){i=b;return}else{g=d;h=0}while(1){if((g|0)==(a|0)){break}d=c[g+8>>2]|0;if((d|0)==0){j=11;break}else{k=g;g=d;h=k}}if((j|0)==11){i=b;return}j=c[a+8>>2]|0;if((h|0)==0){c[f>>2]=j}else{c[h+8>>2]=j}j=c[a+20>>2]|0;if((j|0)!=0){Rc[j&1023](a)}sEa(a);aEa(e,a);i=b;return}function uEa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;if((a|0)==0){i=d;return}e=c[a+128>>2]|0;a=e+24|0;c[a>>2]=0;if((b|0)==0){c[e>>2]=65536;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=65536;f=e}else{c[e+0>>2]=c[b+0>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];f=b}if(!(((c[f+8>>2]|c[f+4>>2]|0)==0?(c[f>>2]|0)==65536:0)?(c[f+12>>2]|0)==65536:0)){c[a>>2]=1}c[e+16>>2]=0;c[e+20>>2]=0;i=d;return}function vEa(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;a:do{if((a|0)!=0){e=b[a+2>>1]|0;f=e<<16>>16;g=b[a>>1]|0;h=g<<16>>16;if((g|e)<<16>>16==0){j=0;i=d;return j|0}if(!(e<<16>>16<1|g<<16>>16<1)){if(g<<16>>16>0){g=c[a+12>>2]|0;k=-1;l=0;while(1){m=b[g+(l<<1)>>1]|0;n=m<<16>>16;l=l+1|0;if(!((n|0)>(k|0)?m<<16>>16<e<<16>>16:0)){break a}if((l|0)>=(h|0)){o=n;break}else{k=n}}}else{o=-1}if((o|0)==(f+ -1|0)){j=0;i=d;return j|0}}}}while(0);j=6;i=d;return j|0}function wEa(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;if((a|0)==0|(d|0)==0){i=e;return}f=c[a+4>>2]|0;g=b[a+2>>1]|0;a=f+(g<<16>>16<<3)|0;if(g<<16>>16>0){h=f}else{i=e;return}do{yEa(h,d);h=h+8|0}while(h>>>0<a>>>0);i=e;return}function xEa(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;if((a|0)==0){i=f;return}g=a+2|0;if((b[g>>1]|0)<=0){i=f;return}h=0;j=c[a+4>>2]|0;while(1){c[j>>2]=(c[j>>2]|0)+d;a=j+4|0;c[a>>2]=(c[a>>2]|0)+e;h=h+1<<16>>16;if((h&65535|0)>=(b[g>>1]|0)){break}else{j=j+8|0}}i=f;return}function yEa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;if((a|0)==0|(b|0)==0){i=d;return}e=c[a>>2]|0;f=SDa(e,c[b>>2]|0)|0;g=a+4|0;h=c[g>>2]|0;j=(SDa(h,c[b+4>>2]|0)|0)+f|0;f=SDa(e,c[b+8>>2]|0)|0;e=(SDa(h,c[b+12>>2]|0)|0)+f|0;c[a>>2]=j;c[g>>2]=e;i=d;return}function zEa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;if((a|0)!=0?(e=c[a+4>>2]|0,(e|0)!=0):0){f=dFa(c[(c[e+96>>2]|0)+4>>2]|0,a,b)|0}else{f=6}i=d;return f|0}function AEa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;if((a|0)!=0?(e=c[a+92>>2]|0,(e|0)!=0):0){f=dd[c[(c[e+12>>2]|0)+12>>2]&511](e,b)|0}else{f=0}i=d;return f|0}function BEa(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0;g=i;i=i+16|0;h=g+12|0;j=g+8|0;k=g+4|0;l=g;c[j>>2]=0;c[k>>2]=0;m=(f|0)!=0;n=(e|0)>-1;if(n&(m^1)|(d|0)==0){o=6;i=g;return o|0}if((c[d>>2]&2|0)==0){p=0}else{p=(c[d+16>>2]|0)!=0&1}q=mEa(a,d,j)|0;c[h>>2]=q;a:do{if((q|0)==0){r=c[a>>2]|0;s=c[d>>2]|0;do{if((s&8|0)!=0?(t=c[d+20>>2]|0,(t|0)!=0):0){if((c[c[t>>2]>>2]&1|0)!=0){if((s&16|0)==0){u=0;v=0}else{u=c[d+24>>2]|0;v=c[d+28>>2]|0}w=c[j>>2]|0;x=DEa(t,w,e,u,v,k)|0;c[h>>2]=x;if((x|0)==0){y=t;break}else{z=x;A=w}}else{c[h>>2]=32;z=32;A=c[j>>2]|0}oEa(A,p&255);B=z;C=t;D=r;E=50;break a}else{E=13}}while(0);b:do{if((E|0)==13){c[h>>2]=11;s=c[a+16>>2]|0;t=a+(s<<2)+20|0;if((s|0)<=0){F=11;G=0;H=r;E=23;break a}s=d+24|0;w=d+28|0;x=11;I=a+20|0;J=0;while(1){K=c[I>>2]|0;if((c[c[K>>2]>>2]&1|0)!=0){if((c[d>>2]&16|0)==0){L=0;M=0}else{L=c[s>>2]|0;M=c[w>>2]|0}N=DEa(K,c[j>>2]|0,e,L,M,k)|0;c[h>>2]=N;if((N|0)==0){y=K;break b}if((N&255|0)==2){O=N;P=K}else{Q=N;R=K;S=r;E=21;break a}}else{O=x;P=J}I=I+4|0;if(!(I>>>0<t>>>0)){Q=O;R=P;S=r;E=21;break a}else{x=O;J=P}}}}while(0);if(!(p<<24>>24==0)){J=(c[k>>2]|0)+8|0;c[J>>2]=c[J>>2]|1024}J=ZDa(r,12,h)|0;x=c[h>>2]|0;do{if((x|0)==0){t=c[k>>2]|0;c[J+8>>2]=t;EEa((c[t+96>>2]|0)+16|0,J);if(n){I=rEa(t)|0;c[h>>2]=I;if((I|0)!=0){T=t;U=I;break}I=FEa(t,l)|0;c[h>>2]=I;if((I|0)!=0){T=t;U=I;break}c[t+88>>2]=c[l>>2]}I=c[t+8>>2]|0;if((I&1|0)!=0){w=t+74|0;s=b[w>>1]|0;if(s<<16>>16<0){K=0-(s&65535)&65535;b[w>>1]=K;V=K}else{V=s}if((I&32|0)==0){b[t+78>>1]=V}}if((I&2|0)!=0?(I=t+28|0,(c[I>>2]|0)>0):0){s=t+32|0;K=0;do{w=c[s>>2]|0;N=w+(K<<4)|0;W=b[N>>1]|0;if(W<<16>>16<0){b[N>>1]=0-(W&65535)}W=w+(K<<4)+8|0;N=c[W>>2]|0;if((N|0)<0){c[W>>2]=0-N<<16>>16}N=w+(K<<4)+12|0;w=c[N>>2]|0;if((w|0)<0){c[N>>2]=0-w}K=K+1|0}while((K|0)<(c[I>>2]|0))}I=c[t+128>>2]|0;c[I>>2]=65536;c[I+4>>2]=0;c[I+8>>2]=0;c[I+12>>2]=65536;c[I+16>>2]=0;c[I+20>>2]=0;c[I+56>>2]=1;if(m){c[f>>2]=t;o=0;i=g;return o|0}else{GEa(t);o=0;i=g;return o|0}}else{T=c[k>>2]|0;U=x}}while(0);if((J|0)==0){X=T;Y=U;Z=y;_=r}else{GEa(T);o=U;i=g;return o|0}}else{Q=q;R=0;S=0;E=21}}while(0);if((E|0)==21){q=Q&255;if((q|0)==85|(q|0)==2|(q|0)==81){c[h>>2]=2;F=2;G=R;H=S;E=23}else{F=Q;G=R;H=S;E=23}}if((E|0)==23){oEa(c[j>>2]|0,p&255);B=F;C=G;D=H;E=50}if((E|0)==50){X=c[k>>2]|0;Y=B;Z=C;_=D}if((X|0)==0){o=Y;i=g;return o|0}HEa(_,X,Z);o=Y;i=g;return o|0}function CEa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;i=i+32|0;h=g;if((b|0)==0){j=6;i=g;return j|0}c[h>>2]=1;c[h+4>>2]=b;c[h+8>>2]=d;c[h+16>>2]=0;j=BEa(a,h,e,f)|0;i=g;return j|0}function DEa(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;h=i;i=i+16|0;j=h;k=c[a+12>>2]|0;l=c[a+8>>2]|0;m=ZDa(l,c[k+36>>2]|0,j)|0;n=c[j>>2]|0;do{if((n|0)==0){c[m+96>>2]=a;c[m+100>>2]=l;c[m+104>>2]=b;o=ZDa(l,60,j)|0;p=c[j>>2]|0;if((p|0)==0){q=m+128|0;c[q>>2]=o;c[o+48>>2]=0;a:do{if((e|0)>0){r=0;do{s=(c[q>>2]|0)+48|0;if((c[s>>2]|0)!=0){break a}if((c[f+(r<<3)>>2]|0)==1768842098){c[s>>2]=c[f+(r<<3)+4>>2]}r=r+1|0}while((r|0)<(e|0))}}while(0);q=c[k+48>>2]|0;if((q|0)!=0?(r=ed[q&127](b,m,d,e,f)|0,c[j>>2]=r,(r|0)!=0):0){t=r;u=o;break}r=UEa(m)|0;if(!((r|0)==0|(r&255|0)==38)){c[j>>2]=r;t=r;u=o;break}c[g>>2]=m;v=0;i=h;return v|0}else{t=p;u=o}}else{t=n;u=0}}while(0);VFa(m,l);n=c[k+52>>2]|0;if((n|0)!=0){Rc[n&1023](m)}aEa(l,u);aEa(l,m);c[g>>2]=0;v=t;i=h;return v|0}function EEa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=a+4|0;f=c[e>>2]|0;c[b+4>>2]=0;c[b>>2]=f;if((f|0)==0){c[a>>2]=b;c[e>>2]=b;i=d;return}else{c[f+4>>2]=b;c[e>>2]=b;i=d;return}}function FEa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=i;i=i+16|0;e=d;if((a|0)==0){f=35;i=d;return f|0}if((b|0)==0){f=36;i=d;return f|0}g=a+96|0;if((c[g>>2]|0)==0){f=34;i=d;return f|0}c[b>>2]=0;h=c[(c[g>>2]|0)+12>>2]|0;g=c[a+100>>2]|0;j=ZDa(g,c[h+40>>2]|0,e)|0;k=c[e>>2]|0;do{if((k|0)==0){l=ZDa(g,12,e)|0;m=c[e>>2]|0;if((m|0)==0){c[j>>2]=a;c[j+40>>2]=0;n=c[h+56>>2]|0;if((n|0)!=0?(o=Lc[n&255](j)|0,c[e>>2]=o,(o|0)!=0):0){p=o;q=l;break}c[b>>2]=j;c[l+8>>2]=j;EEa(a+108|0,l);f=0;i=d;return f|0}else{p=m;q=l}}else{p=k;q=0}}while(0);aEa(g,q);aEa(g,j);f=p;i=d;return f|0}function GEa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;if((a|0)==0){i=b;return}d=a+96|0;if((c[d>>2]|0)==0){i=b;return}e=a+128|0;f=(c[e>>2]|0)+56|0;c[f>>2]=(c[f>>2]|0)+ -1;if((c[(c[e>>2]|0)+56>>2]|0)>0){i=b;return}e=c[d>>2]|0;d=c[e+8>>2]|0;f=e+16|0;g=IEa(c[f>>2]|0,a)|0;if((g|0)==0){i=b;return}JEa(f,c[g>>2]|0,c[g+4>>2]|0);aEa(d,g);HEa(d,a,e);i=b;return}function HEa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=c[d+12>>2]|0;g=c[b+120>>2]|0;if((g|0)!=0){Rc[g&1023](c[b+116>>2]|0)}g=b+84|0;h=c[g>>2]|0;if((h|0)!=0){j=h;do{tEa(j);j=c[g>>2]|0}while((j|0)!=0)}TFa(b+108|0,202,a,d);c[b+88>>2]=0;d=c[b+48>>2]|0;if((d|0)!=0){Rc[d&1023](b)}VFa(b,a);d=c[f+52>>2]|0;if((d|0)!=0){Rc[d&1023](b)}d=b+104|0;oEa(c[d>>2]|0,(c[b+8>>2]|0)>>>10&1);c[d>>2]=0;d=b+128|0;f=c[d>>2]|0;if((f|0)==0){aEa(a,b);i=e;return}aEa(a,f);c[d>>2]=0;aEa(a,b);i=e;return}function IEa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;a:do{if((a|0)==0){e=0}else{f=a;while(1){if((c[f+8>>2]|0)==(b|0)){e=f;break a}f=c[f+4>>2]|0;if((f|0)==0){e=0;break}}}}while(0);i=d;return e|0}function JEa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;if((b|0)==0){c[a>>2]=d}else{c[b+4>>2]=d}if((d|0)==0){c[a+4>>2]=b;i=e;return}else{c[d>>2]=b;i=e;return}}function KEa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=c[b+8>>2]|0;if((f|0)!=0){Rc[f&1023](b)}f=c[(c[d+12>>2]|0)+60>>2]|0;if((f|0)!=0){Rc[f&1023](b)}f=b+40|0;aEa(a,c[f>>2]|0);c[f>>2]=0;aEa(a,b);i=e;return}function LEa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;if((c[a+8>>2]&2|0)==0){f=35;i=e;return f|0}if((c[b>>2]|0)!=0){f=7;i=e;return f|0}g=c[b+12>>2]|0;h=c[b+4>>2]|0;if((g|0)==0){j=h}else{j=((ca(h,g)|0)+36|0)/72|0}g=c[b+16>>2]|0;k=c[b+8>>2]|0;if((g|0)==0){l=k}else{l=((ca(k,g)|0)+36|0)/72|0}g=(h|0)==0;h=(k|0)==0?j:l;k=(g?h:j)+32|0;j=(g?l:h)+32|0;h=c[a+28>>2]|0;if((h|0)<=0){f=23;i=e;return f|0}l=c[a+32>>2]|0;a=0;while(1){if(!(((c[l+(a<<4)+12>>2]|0)+32^j)>>>0>63)?!(((c[l+(a<<4)+8>>2]|0)+32^k)>>>0>63):0){break}g=a+1|0;if((g|0)<(h|0)){a=g}else{f=23;m=14;break}}if((m|0)==14){i=e;return f|0}if((d|0)==0){f=0;i=e;return f|0}c[d>>2]=a;f=0;i=e;return f|0}function MEa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=c[a+4>>2]|0;e=c[a+12>>2]|0;if((e|0)<0){f=(d|0)<(e|0)?e:d}else{f=d-((e|0)>0?e:0)|0}if((b|0)==0){g=(f*12|0)/10|0}else{g=b}c[a+20>>2]=(c[a+8>>2]|0)-((c[a+16>>2]|0)/2|0);c[a+24>>2]=(g-f|0)/2|0;c[a+28>>2]=g;return}function NEa(a,d){a=a|0;d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;g=c[a+88>>2]|0;h=g+12|0;j=c[a+32>>2]|0;k=j+(d<<4)+8|0;b[h>>1]=((c[k>>2]|0)+32|0)>>>6;l=j+(d<<4)+12|0;b[g+14>>1]=((c[l>>2]|0)+32|0)>>>6;if((c[a+8>>2]&1|0)==0){c[g+16>>2]=65536;c[g+20>>2]=65536;c[g+24>>2]=c[l>>2];c[g+28>>2]=0;c[g+32>>2]=b[j+(d<<4)>>1]<<6;c[g+36>>2]=c[k>>2];i=f;return}else{d=a+68|0;c[g+16>>2]=TDa(c[k>>2]|0,e[d>>1]|0)|0;c[g+20>>2]=TDa(c[l>>2]|0,e[d>>1]|0)|0;OEa(a,h);i=f;return}}function OEa(a,d){a=a|0;d=d|0;var e=0,f=0;e=i;f=c[d+8>>2]|0;c[d+12>>2]=(SDa(b[a+70>>1]|0,f)|0)+63&-64;c[d+16>>2]=(SDa(b[a+72>>1]|0,f)|0)&-64;c[d+20>>2]=(SDa(b[a+74>>1]|0,f)|0)+32&-64;c[d+24>>2]=(SDa(b[a+76>>1]|0,c[d+4>>2]|0)|0)+32&-64;i=e;return}function PEa(a,d){a=a|0;d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;f=i;g=c[a+88>>2]|0;h=g+12|0;if((c[a+8>>2]&1|0)==0){c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;c[h+16>>2]=0;c[h+20>>2]=0;c[h+24>>2]=0;c[g+16>>2]=65536;c[g+20>>2]=65536;i=f;return}a:do{switch(c[d>>2]|0){case 2:{j=(c[a+64>>2]|0)-(c[a+56>>2]|0)|0;k=(c[a+60>>2]|0)-(c[a+52>>2]|0)|0;l=11;break};case 1:{m=(b[a+70>>1]|0)-(b[a+72>>1]|0)|0;j=m;k=m;l=11;break};case 3:{j=(b[a+70>>1]|0)-(b[a+72>>1]|0)|0;k=b[a+76>>1]|0;l=11;break};case 0:{m=e[a+68>>1]|0;j=m;k=m;l=11;break};case 4:{m=c[d+4>>2]|0;n=g+16|0;c[n>>2]=m;o=c[d+8>>2]|0;p=g+20|0;c[p>>2]=o;if((m|0)==0){c[n>>2]=o;q=0;r=0;l=23;break a}if((o|0)==0){c[p>>2]=m;q=0;r=0;l=23}else{q=0;r=0;l=23}break};default:{j=0;k=0;l=11}}}while(0);do{if((l|0)==11){m=(k|0)<0?0-k|0:k;p=(j|0)<0?0-j|0:j;o=c[d+12>>2]|0;n=c[d+4>>2]|0;if((o|0)==0){s=n}else{s=((ca(n,o)|0)+36|0)/72|0}o=c[d+16>>2]|0;t=d+8|0;u=c[t>>2]|0;if((o|0)==0){v=u}else{v=((ca(u,o)|0)+36|0)/72|0}if((n|0)==0){n=TDa(v,p)|0;c[g+20>>2]=n;c[g+16>>2]=n;q=v;r=ODa(v,m,p)|0;l=23;break}n=TDa(s,m)|0;o=g+16|0;c[o>>2]=n;if((c[t>>2]|0)==0){c[g+20>>2]=n;q=ODa(s,p,m)|0;r=s;l=23;break}m=TDa(v,p)|0;p=g+20|0;c[p>>2]=m;t=c[d>>2]|0;if((t|0)==3){if((m|0)>(n|0)){c[p>>2]=n;q=v;r=s;l=23;break}else{c[o>>2]=m;q=v;r=s;l=23;break}}else{w=t;x=v;y=s}}}while(0);if((l|0)==23){w=c[d>>2]|0;x=q;y=r}if((w|0)==0){z=x;A=y}else{y=e[a+68>>1]|0;x=SDa(y,c[g+16>>2]|0)|0;z=SDa(y,c[g+20>>2]|0)|0;A=x}b[h>>1]=(A+32|0)>>>6;b[g+14>>1]=(z+32|0)>>>6;OEa(a,h);i=f;return}function QEa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;do{if((a|0)!=0?(c[a+8>>2]&2|0)!=0:0){if((b|0)>=0?(c[a+28>>2]|0)>(b|0):0){e=c[(c[(c[a+96>>2]|0)+12>>2]|0)+92>>2]|0;if((e|0)==0){NEa(a,b);f=0;break}else{f=dd[e&511](c[a+88>>2]|0,b)|0;break}}else{f=6}}else{f=35}}while(0);i=d;return f|0}function REa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d;do{if((a|0)!=0){if((((b|0)!=0?(c[b+4>>2]|0)>=0:0)?(c[b+8>>2]|0)>=0:0)?!((c[b>>2]|0)>>>0>4):0){f=c[(c[(c[a+96>>2]|0)+12>>2]|0)+88>>2]|0;if((f|0)!=0){g=dd[f&511](c[a+88>>2]|0,b)|0;break}if((c[a+8>>2]&3|0)!=2){PEa(a,b);g=0;break}f=LEa(a,b,e)|0;if((f|0)==0){g=QEa(a,c[e>>2]|0)|0}else{g=f}}else{g=6}}else{g=35}}while(0);i=d;return g|0}function SEa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+32|0;e=d;f=(b|0)==0?64:b;b=(f|0)==0?1:f;c[e>>2]=0;c[e+4>>2]=b>>>0<65535?b<<6:4194240;c[e+8>>2]=4096;c[e+12>>2]=0;c[e+16>>2]=0;b=REa(a,e)|0;i=d;return b|0}function TEa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;a:do{if((a|0)!=0){if((b|0)==1970170211){e=UEa(a)|0;break}else if((b|0)==0){e=6;break}f=c[a+40>>2]|0;if((f|0)!=0){g=c[a+36>>2]|0;h=f+(g<<2)|0;if((g|0)>0){g=f;while(1){j=c[g>>2]|0;g=g+4|0;if((c[j+4>>2]|0)==(b|0)){break}if(!(g>>>0<h>>>0)){e=6;break a}}c[a+92>>2]=j;e=0}else{e=6}}else{e=38}}else{e=35}}while(0);i=d;return e|0}function UEa(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;e=c[a+40>>2]|0;if((e|0)==0){f=38;i=d;return f|0}g=c[a+36>>2]|0;h=g+ -1|0;a:do{if((h|0)>=0){j=e+(h<<2)|0;b:while(1){k=c[j>>2]|0;do{if((c[k+4>>2]|0)==1970170211){l=b[k+8>>1]|0;if(l<<16>>16==0){if((b[k+10>>1]|0)==4){break b}else{break}}else if(l<<16>>16==3?(b[k+10>>1]|0)==10:0){break b}else{break}}}while(0);j=j+ -4|0;if(j>>>0<e>>>0){break a}}c[a+92>>2]=k;f=0;i=d;return f|0}}while(0);k=e+(g<<2)|0;do{k=k+ -4|0;if(k>>>0<e>>>0){f=38;m=14;break}n=c[k>>2]|0}while((c[n+4>>2]|0)!=1970170211);if((m|0)==14){i=d;return f|0}c[a+92>>2]=n;f=0;i=d;return f|0}function VEa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;a:do{if((a|0)!=0){e=c[a+40>>2]|0;if((e|0)!=0){if((WEa(b)|0)!=14?(f=c[a+36>>2]|0,g=e+(f<<2)|0,(f|0)>0):0){f=e;while(1){if((c[f>>2]|0)==(b|0)){break}f=f+4|0;if(!(f>>>0<g>>>0)){h=6;break a}}c[a+92>>2]=b;h=0}else{h=6}}else{h=38}}else{h=35}}while(0);i=d;return h|0}function WEa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+16|0;d=b;if(((((a|0)!=0?(e=c[a>>2]|0,(e|0)!=0):0)?(f=c[e+96>>2]|0,e=c[(c[f>>2]|0)+32>>2]|0,(e|0)!=0):0)?(g=dd[e&511](f,1287848)|0,(g|0)!=0):0)?(dd[c[g>>2]&511](a,d)|0)==0:0){h=c[d+4>>2]|0}else{h=-1}i=b;return h|0}function XEa(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[(c[a>>2]|0)+100>>2]|0;e=c[(c[a+12>>2]|0)+8>>2]|0;if((e|0)!=0){Rc[e&1023](a)}aEa(d,a);i=b;return}function YEa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=i;i=i+16|0;g=f;c[g>>2]=0;if((a|0)==0|(d|0)==0){h=6;i=f;return h|0}j=c[d>>2]|0;if((j|0)==0){h=6;i=f;return h|0}k=c[j+100>>2]|0;l=ZDa(k,c[a>>2]|0,g)|0;m=c[g>>2]|0;do{if((m|0)==0){c[l+0>>2]=c[d+0>>2];c[l+4>>2]=c[d+4>>2];c[l+8>>2]=c[d+8>>2];c[l+12>>2]=a;n=c[a+4>>2]|0;if((n|0)!=0?(o=dd[n&511](l,b)|0,c[g>>2]=o,(o|0)!=0):0){p=o}else{o=j+36|0;n=c[o>>2]|0;q=j+40|0;r=dEa(k,4,n,n+1|0,c[q>>2]|0,g)|0;c[q>>2]=r;q=c[g>>2]|0;if((q|0)==0){n=c[o>>2]|0;c[o>>2]=n+1;c[r+(n<<2)>>2]=l;s=0;t=l;break}else{p=q}}XEa(l);s=p;t=0}else{s=m;t=l}}while(0);if((e|0)==0){h=s;i=f;return h|0}c[e>>2]=t;h=s;i=f;return h|0}function ZEa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;a:do{if((a|0)!=0?(c[a+8>>2]&512|0)!=0:0){e=a+128|0;f=(c[e>>2]|0)+36|0;g=c[f>>2]|0;h=g;do{if((h|0)==0){j=c[a+96>>2]|0;k=c[(c[j>>2]|0)+32>>2]|0;if((k|0)!=0){l=dd[k&511](j,1287824)|0;c[(c[e>>2]|0)+36>>2]=(l|0)!=0?l:-2;if((l|0)==0){m=0;break a}else{n=l;break}}else{c[f>>2]=-2;m=0;break a}}else if((h|0)==-2){m=0;break a}else{n=g}}while(0);g=c[n+4>>2]|0;if((g|0)!=0){m=dd[g&511](a,b)|0}else{m=0}}else{m=0}}while(0);i=d;return m|0}function _Ea(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;g=i;if(!((e|0)==0|(f|0)==0)){a[e>>0]=0}a:do{if(((b|0)!=0?(c[b+16>>2]|0)>=(d|0):0)?(c[b+8>>2]&512|0)!=0:0){h=b+128|0;j=(c[h>>2]|0)+36|0;k=c[j>>2]|0;l=k;do{if((l|0)==0){m=c[b+96>>2]|0;n=c[(c[m>>2]|0)+32>>2]|0;if((n|0)!=0){o=dd[n&511](m,1287824)|0;c[(c[h>>2]|0)+36>>2]=(o|0)!=0?o:-2;if((o|0)==0){p=6;break a}else{q=o;break}}else{c[j>>2]=-2;p=6;break a}}else if((l|0)==-2){p=6;break a}else{q=k}}while(0);k=c[q>>2]|0;if((k|0)!=0){p=id[k&511](b,d,e,f)|0}else{p=6}}else{p=6}}while(0);i=g;return p|0}function $Ea(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;if((a|0)!=0?(c[a+8>>2]&8|0)!=0:0){f=c[a+96>>2]|0;g=c[(c[f>>2]|0)+32>>2]|0;if((g|0)!=0?(h=dd[g&511](f,1276e3)|0,(h|0)!=0):0){j=ed[c[h>>2]&127](a,1196643650,0,b,d)|0}else{j=7}}else{j=35}i=e;return j|0}function aFa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;a:do{if((a|0)!=0){f=c[a+148>>2]|0;g=(d|0)!=0;if(g){h=c[d>>2]|0;if((h|0)==0){j=f}else{j=c[h+4>>2]|0}c[d>>2]=0;k=j}else{k=f}if((k|0)!=0){f=k;while(1){l=c[f+8>>2]|0;if((c[l+16>>2]|0)==(b|0)){break}h=c[f+4>>2]|0;if((h|0)==0){m=0;break a}else{f=h}}if(g){c[d>>2]=f;m=l}else{m=l}}else{m=0}}else{m=0}}while(0);i=e;return m|0}function bFa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;if((a|0)==0|(b|0)==0){i=d;return}e=a+148|0;f=IEa(c[e>>2]|0,b)|0;if((f|0)==0){i=d;return}cFa(e,f);if((c[b+16>>2]|0)!=1869968492){i=d;return}c[a+156>>2]=b;i=d;return}function cFa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=c[b>>2]|0;f=b+4|0;g=c[f>>2]|0;if((e|0)==0){i=d;return}c[e+4>>2]=g;if((g|0)==0){c[a+4>>2]=e}else{c[g>>2]=e}c[b>>2]=0;c[f>>2]=c[a>>2];c[c[a>>2]>>2]=b;c[a>>2]=b;i=d;return}function dFa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;i=i+16|0;f=e;g=b+72|0;h=c[g>>2]|0;if((h|0)==1651078259){j=0;i=e;return j|0}c[f>>2]=0;if((h|0)==1869968492){k=c[a+156>>2]|0;c[f>>2]=c[a+148>>2];l=k}else{l=aFa(a,h,f)|0}if((l|0)==0){j=7;i=e;return j|0}else{m=l;n=0}while(1){o=id[c[m+60>>2]&511](m,b,d,0)|0;p=(o|0)!=0;if(!(p&(o&255|0)==19)){break}l=aFa(a,c[g>>2]|0,f)|0;if((l|0)==0){j=o;q=10;break}else{m=l;n=1}}if((q|0)==10){i=e;return j|0}if(p|(n|0)==0){j=o;i=e;return j|0}bFa(a,m);j=0;i=e;return j|0}function eFa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;d=i;i=i+16|0;e=d+4|0;f=d;if((a|0)==0|(b|0)==0){i=d;return}if((c[b+16>>2]|0)>131077){i=d;return}g=a+16|0;h=c[g>>2]|0;if((h|0)!=0){j=c[b+8>>2]|0;k=0;while(1){l=c[a+(k<<2)+20>>2]|0;m=c[l>>2]|0;k=k+1|0;if((R2a(c[m+8>>2]|0,j)|0)==0){n=8;break}if(!(k>>>0<h>>>0)){o=h;break}}do{if((n|0)==8){if((c[b+12>>2]|0)>(c[m+12>>2]|0)){fFa(a,l);o=c[g>>2]|0;break}else{i=d;return}}}while(0);l=c[a>>2]|0;c[f>>2]=0;if(o>>>0>31){c[f>>2]=48;i=d;return}else{p=l;q=a}}else{l=c[a>>2]|0;c[f>>2]=0;p=l;q=a}l=ZDa(p,c[b+4>>2]|0,f)|0;if((c[f>>2]|0)!=0){i=d;return}c[l+4>>2]=a;c[l+8>>2]=p;c[l>>2]=b;o=c[b>>2]|0;a:do{if((o&2|0)==0){r=b;s=o;n=22}else{m=c[q>>2]|0;h=ZDa(m,12,e)|0;k=c[e>>2]|0;b:do{if((k|0)==0){j=c[l>>2]|0;c[l+12>>2]=j;t=j+36|0;c[l+16>>2]=c[t>>2];do{if((c[t>>2]|0)==1869968492?(u=j+56|0,v=c[(c[u>>2]|0)+4>>2]|0,(v|0)!=0):0){w=dd[v&511](m,l+52|0)|0;c[e>>2]=w;if((w|0)==0){c[l+56>>2]=c[(c[u>>2]|0)+16>>2];c[l+60>>2]=c[j+40>>2];break}else{aEa(m,h);x=w;break b}}}while(0);c[h+8>>2]=l;EEa(a+148|0,h);UFa(a);c[f>>2]=0;j=c[l>>2]|0;r=j;s=c[j>>2]|0;n=22;break a}else{x=k}}while(0);c[f>>2]=x}}while(0);do{if((n|0)==22){if((s&4|0)==0){y=s;z=r}else{c[a+160>>2]=l;x=c[l>>2]|0;y=c[x>>2]|0;z=x}if(((y&1|0)!=0?(c[l+12>>2]=z,(c[z>>2]&512|0)==0):0)?(x=YDa(p,l+24|0)|0,c[f>>2]=x,(x|0)!=0):0){break}x=c[b+24>>2]|0;if((x|0)!=0?(e=Lc[x&255](l)|0,c[f>>2]=e,(e|0)!=0):0){break}e=c[g>>2]|0;c[g>>2]=e+1;c[a+(e<<2)+20>>2]=l;i=d;return}}while(0);a=c[c[l>>2]>>2]|0;if((a&513|0)==1){bEa(c[l+24>>2]|0);A=c[c[l>>2]>>2]|0}else{A=a}if((((A&2|0)!=0?(A=c[l+12>>2]|0,(A|0)!=0):0)?(c[A+36>>2]|0)==1869968492:0)?(a=c[l+52>>2]|0,(a|0)!=0):0){Rc[c[(c[A+56>>2]|0)+20>>2]&1023](a)}aEa(p,l);i=d;return}function fFa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;if((a|0)==0|(b|0)==0){i=d;return}e=a+16|0;f=c[e>>2]|0;g=a+(f<<2)+20|0;if((f|0)<=0){i=d;return}h=a+20|0;while(1){j=h+4|0;if((c[h>>2]|0)==(b|0)){break}if(j>>>0<g>>>0){h=j}else{k=23;break}}if((k|0)==23){i=d;return}k=f+ -1|0;c[e>>2]=k;e=a+(k<<2)+20|0;if(h>>>0<e>>>0){k=h;do{h=k;k=k+4|0;c[h>>2]=c[k>>2]}while(k>>>0<e>>>0)}c[e>>2]=0;e=b+8|0;k=c[e>>2]|0;h=c[b>>2]|0;a=b+4|0;f=c[a>>2]|0;if((f|0)!=0?(g=f+160|0,(c[g>>2]|0)==(b|0)):0){c[g>>2]=0;l=c[b>>2]|0}else{l=h}g=c[l>>2]|0;if((g&2|0)!=0?(l=c[a>>2]|0,a=c[l>>2]|0,f=l+148|0,j=IEa(c[f>>2]|0,b)|0,(j|0)!=0):0){m=c[b+12>>2]|0;if((c[m+36>>2]|0)==1869968492?(n=c[b+52>>2]|0,(n|0)!=0):0){Rc[c[(c[m+56>>2]|0)+20>>2]&1023](n)}JEa(f,c[j>>2]|0,c[j+4>>2]|0);aEa(a,j);UFa(l);o=c[c[b>>2]>>2]|0}else{o=g}if((o&1|0)!=0?(TFa(b+16|0,203,c[e>>2]|0,b),(c[c[b>>2]>>2]&512|0)==0):0){bEa(c[b+24>>2]|0)}e=c[h+28>>2]|0;if((e|0)!=0){Rc[e&1023](b)}aEa(k,b);i=d;return}function gFa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;a:do{if(!((a|0)==0|(b|0)==0)?(e=c[a+16>>2]|0,f=a+(e<<2)+20|0,(e|0)>0):0){e=a+20|0;while(1){g=c[e>>2]|0;e=e+4|0;if((R2a(c[(c[g>>2]|0)+8>>2]|0,b)|0)==0){h=g;break a}if(!(e>>>0<f>>>0)){h=0;break}}}else{h=0}}while(0);i=d;return h|0}function hFa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=gFa(a,b)|0;if((e|0)==0){f=0;i=d;return f|0}f=c[(c[e>>2]|0)+20>>2]|0;i=d;return f|0}function iFa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;a:do{if((a|0)!=0){e=c[(c[a>>2]|0)+32>>2]|0;if((e|0)!=0?(f=dd[e&511](a,b)|0,(f|0)!=0):0){g=f;break}f=c[a+4>>2]|0;e=c[f+16>>2]|0;h=f+(e<<2)+20|0;if((e|0)>0){e=f+20|0;while(1){f=c[e>>2]|0;if(((f|0)!=(a|0)?(j=c[(c[f>>2]|0)+32>>2]|0,(j|0)!=0):0)?(k=dd[j&511](f,b)|0,(k|0)!=0):0){g=k;break a}e=e+4|0;if(!(e>>>0<h>>>0)){g=0;break}}}else{g=0}}else{g=0}}while(0);i=d;return g|0}function jFa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;e=d;if((a|0)==0){f=6;i=d;return f|0}g=ZDa(a,212,e)|0;h=c[e>>2]|0;if((h|0)!=0){f=h;i=d;return f|0}c[g>>2]=a;c[g+168>>2]=16384;c[g+164>>2]=ZDa(a,16384,e)|0;h=c[e>>2]|0;if((h|0)==0){c[g+4>>2]=2;c[g+8>>2]=5;c[g+12>>2]=0;c[g+208>>2]=1;c[b>>2]=g;f=0;i=d;return f|0}else{aEa(a,g);f=h;i=d;return f|0}return 0}function kFa(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0;g=i;i=i+64|0;h=g+16|0;j=g+8|0;k=g+56|0;l=g;m=g+48|0;n=g+40|0;o=g+32|0;p=g+24|0;if((d|0)==0|(e|0)==0){q=6;i=g;return q|0}r=c[e+16>>2]|0;s=c[e+20>>2]|0;if((b[d>>1]|0)<=0){q=0;i=g;return q|0}t=d+12|0;u=d+4|0;v=j+4|0;w=d+8|0;x=e+4|0;y=n+4|0;z=o+4|0;A=p+4|0;B=e+12|0;C=k+4|0;D=h+4|0;E=l+4|0;F=m+4|0;G=e+8|0;H=0;I=0;a:while(1){J=b[(c[t>>2]|0)+(I<<1)>>1]|0;K=J<<16>>16;if(J<<16>>16<0){q=20;L=29;break}J=c[u>>2]|0;M=J+(K<<3)|0;N=J+(H<<3)|0;O=c[N>>2]|0;P=c[N+4>>2]|0;N=j;c[N>>2]=O;c[N+4>>2]=P;c[j>>2]=(O<<r)-s;O=(P<<r)-s|0;c[v>>2]=O;P=(c[J+(K<<3)>>2]<<r)-s|0;N=(c[J+(K<<3)+4>>2]<<r)-s|0;Q=j;R=c[Q>>2]|0;S=c[Q+4>>2]|0;Q=h;c[Q>>2]=R;c[Q+4>>2]=S;S=c[w>>2]|0;Q=S+H|0;T=a[Q>>0]&3;if((T|0)==2){q=20;L=29;break}else if((T|0)==0){if((a[S+K>>0]&3)==1){c[j>>2]=P;c[v>>2]=N;U=J+(K+ -1<<3)|0}else{c[j>>2]=(R+P|0)/2|0;c[v>>2]=(O+N|0)/2|0;U=M}N=H+ -1|0;V=N;W=U;X=S+N|0}else{V=H;W=M;X=Q}Q=J+(V<<3)|0;J=dd[c[e>>2]&511](j,f)|0;if((J|0)!=0){q=J;L=29;break}b:do{if(Q>>>0<W>>>0){J=Q;M=X;c:while(1){N=J+8|0;S=M+1|0;O=a[S>>0]&3;if((O|0)==1){c[k>>2]=(c[N>>2]<<r)-s;c[C>>2]=(c[J+12>>2]<<r)-s;P=dd[c[x>>2]&511](k,f)|0;if((P|0)==0){Y=N;Z=S}else{q=P;L=29;break a}}else if((O|0)==0){O=(c[N>>2]<<r)-s|0;c[h>>2]=O;P=(c[J+12>>2]<<r)-s|0;c[D>>2]=P;if(N>>>0<W>>>0){_=O;$=P;aa=N;ba=S}else{L=20;break}while(1){S=aa;aa=aa+8|0;ba=ba+1|0;N=a[ba>>0]&3;P=(c[aa>>2]<<r)-s|0;c[l>>2]=P;O=(c[S+12>>2]<<r)-s|0;c[E>>2]=O;if((N|0)==1){break}else if((N|0)!=0){q=20;L=29;break a}c[m>>2]=(P+_|0)/2|0;c[F>>2]=(O+$|0)/2|0;O=Qc[c[G>>2]&255](h,m,f)|0;if((O|0)!=0){q=O;L=29;break a}O=l;_=c[O>>2]|0;$=c[O+4>>2]|0;O=h;c[O>>2]=_;c[O+4>>2]=$;if(!(aa>>>0<W>>>0)){L=20;break c}}O=Qc[c[G>>2]&255](h,l,f)|0;if((O|0)==0){Y=aa;Z=ba}else{q=O;L=29;break a}}else{if((J+16|0)>>>0>W>>>0){q=20;L=29;break a}if(!((a[M+2>>0]&3)==2)){q=20;L=29;break a}O=J+24|0;c[n>>2]=(c[J+8>>2]<<r)-s;c[y>>2]=(c[J+12>>2]<<r)-s;c[o>>2]=(c[J+16>>2]<<r)-s;c[z>>2]=(c[J+20>>2]<<r)-s;if(O>>>0>W>>>0){L=25;break}c[p>>2]=(c[O>>2]<<r)-s;c[A>>2]=(c[J+28>>2]<<r)-s;P=id[c[B>>2]&511](n,o,p,f)|0;if((P|0)==0){Y=O;Z=M+3|0}else{q=P;L=29;break a}}if(Y>>>0<W>>>0){J=Y;M=Z}else{L=26;break b}}if((L|0)==20){L=0;ca=Qc[c[G>>2]&255](h,j,f)|0;break}else if((L|0)==25){L=0;ca=id[c[B>>2]&511](n,o,j,f)|0;break}}else{L=26}}while(0);if((L|0)==26){L=0;ca=dd[c[x>>2]&511](j,f)|0}if((ca|0)!=0){q=ca;L=29;break}I=I+1|0;if((I|0)>=(b[d>>1]|0)){q=0;L=29;break}else{H=K+1|0}}if((L|0)==29){i=g;return q|0}return 0}function lFa(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0;g=i;i=i+16|0;h=g;if((f|0)==0|(a|0)==0){j=6;i=g;return j|0}c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;if((e|0)<0|e>>>0>d>>>0){j=6;i=g;return j|0}if(d>>>0>32767){j=10;i=g;return j|0}c[f+4>>2]=dEa(a,8,0,d,0,h)|0;k=c[h>>2]|0;if((k|0)==0){c[f+8>>2]=dEa(a,1,0,d,0,h)|0;l=c[h>>2]|0;if((l|0)==0){c[f+12>>2]=dEa(a,2,0,e,0,h)|0;m=c[h>>2]|0;if((m|0)==0){b[f+2>>1]=d;b[f>>1]=e;e=f+16|0;c[e>>2]=c[e>>2]|1;j=0;i=g;return j|0}else{n=m}}else{n=l}}else{n=k}k=f+16|0;c[k>>2]=c[k>>2]|1;mFa(a,f)|0;j=n;i=g;return j|0}function mFa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;if((a|0)==0|(b|0)==0){e=6;i=d;return e|0}if((c[b+16>>2]&1|0)!=0){f=b+4|0;aEa(a,c[f>>2]|0);c[f>>2]=0;f=b+8|0;aEa(a,c[f>>2]|0);c[f>>2]=0;f=b+12|0;aEa(a,c[f>>2]|0);c[f>>2]=0}c[b+0>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b+16>>2]=0;e=0;i=d;return e|0}function nFa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;if((a|0)==0){g=33;i=f;return g|0}g=lFa(c[a>>2]|0,b,d,e)|0;i=f;return g|0}function oFa(a,d){a=a|0;d=d|0;var e=0,f=0,g=0;e=i;if((a|0)==0|(d|0)==0){i=e;return}f=a+2|0;g=b[f>>1]|0;if(!(g<<16>>16==(b[d+2>>1]|0))){i=e;return}if((a|0)==(d|0)?1:(b[a>>1]|0)!=(b[d>>1]|0)){i=e;return}c3a(c[d+4>>2]|0,c[a+4>>2]|0,g<<16>>16<<3|0)|0;c3a(c[d+8>>2]|0,c[a+8>>2]|0,b[f>>1]|0)|0;c3a(c[d+12>>2]|0,c[a+12>>2]|0,b[a>>1]<<1|0)|0;f=d+16|0;c[f>>2]=c[a+16>>2]&-2|c[f>>2]&1;i=e;return}function pFa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((a|0)==0){e=33}else{e=mFa(c[a>>2]|0,b)|0}i=d;return e|0}function qFa(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;e=i;if((a|0)==0|(d|0)==0){i=e;return}f=b[a+2>>1]|0;if(!(f<<16>>16==0)){g=c[a+4>>2]|0;a=g+(f<<16>>16<<3)|0;h=c[g>>2]|0;j=c[g+4>>2]|0;if(f<<16>>16>1){f=g;k=g+8|0;g=h;l=h;m=j;n=j;while(1){o=c[k>>2]|0;p=(o|0)<(l|0)?o:l;q=(o|0)>(g|0)?o:g;o=c[f+12>>2]|0;r=(o|0)<(n|0)?o:n;s=(o|0)>(m|0)?o:m;o=k+8|0;if(o>>>0<a>>>0){t=k;k=o;g=q;l=p;m=s;n=r;f=t}else{u=q;v=p;w=s;x=r;break}}}else{u=h;v=h;w=j;x=j}}else{u=0;v=0;w=0;x=0}c[d>>2]=v;c[d+8>>2]=u;c[d+4>>2]=x;c[d+12>>2]=w;i=e;return}function rFa(a,b){a=a|0;b=b|0;var c=0;c=i;sFa(a,b,b);i=c;return}function sFa(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;f=i;i=i+16|0;g=f+8|0;h=f;if((a|0)==0){i=f;return}j=(d|0)/2|0;k=(e|0)/2|0;if((d+1|0)>>>0<3?(e+1|0)>>>0<3:0){i=f;return}e=tFa(a)|0;if((e|0)==2){i=f;return}d=a+4|0;l=c[d>>2]|0;if((b[a>>1]|0)<=0){i=f;return}m=a+12|0;n=g+4|0;o=h+4|0;p=(e|0)==0;e=0;q=0;while(1){r=b[(c[m>>2]|0)+(e<<1)>>1]|0;s=c[l+(q<<3)>>2]|0;t=c[l+(q<<3)+4>>2]|0;u=c[l+(r<<3)+4>>2]|0;c[g>>2]=s-(c[l+(r<<3)>>2]|0);c[n>>2]=t-u;u=NDa(g)|0;if((u|0)==0){v=0}else{c[g>>2]=TDa(c[g>>2]|0,u)|0;c[n>>2]=TDa(c[n>>2]|0,u)|0;v=u}if((q|0)<=(r|0)){u=v;w=q;x=s;y=t;while(1){z=(w|0)<(r|0);if(z){A=w+1|0;B=c[l+(A<<3)>>2]|0;C=c[l+(A<<3)+4>>2]|0}else{B=s;C=t}c[h>>2]=B-x;c[o>>2]=C-y;A=u;u=NDa(h)|0;D=c[h>>2]|0;if((u|0)==0){E=D;F=c[o>>2]|0}else{G=TDa(D,u)|0;c[h>>2]=G;D=TDa(c[o>>2]|0,u)|0;c[o>>2]=D;E=G;F=D}D=c[g>>2]|0;G=SDa(D,E)|0;H=c[n>>2]|0;I=(SDa(H,F)|0)+G|0;do{if((I|0)>-61440){G=I+65536|0;J=F+H|0;K=E+D|0;L=p?K:0-K|0;K=p?0-J|0:J;J=SDa(E,H)|0;M=J-(SDa(F,D)|0)|0;J=p?0-M|0:M;M=(A|0)<(u|0)?A:u;N=SDa(j,J)|0;O=SDa(G,M)|0;if((N|0)>(O|0)){P=ODa(K,M,J)|0}else{P=ODa(K,j,G)|0}if((SDa(k,J)|0)>(O|0)){Q=P;R=ODa(L,M,J)|0;break}else{Q=P;R=ODa(L,k,G)|0;break}}else{Q=0;R=0}}while(0);c[(c[d>>2]|0)+(w<<3)>>2]=x+j+Q;c[(c[d>>2]|0)+(w<<3)+4>>2]=y+k+R;A=h;D=c[A+4>>2]|0;H=g;c[H>>2]=c[A>>2];c[H+4>>2]=D;if(!z){break}else{w=w+1|0;x=B;y=C}}}e=e+1|0;if((e|0)>=(b[a>>1]|0)){break}else{q=r+1|0}}i=f;return}function tFa(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;d=i;i=i+16|0;e=d;if((a|0)==0){f=0;i=d;return f|0}if((b[a+2>>1]|0)<1){f=0;i=d;return f|0}qFa(a,e);g=c[e+8>>2]|0;h=c[e>>2]|0;j=(LDa(((h|0)<0?0-h|0:h)|((g|0)<0?0-g|0:g))|0)+ -14|0;g=(j|0)>0?j:0;j=(LDa((c[e+12>>2]|0)-(c[e+4>>2]|0)|0)|0)+ -14|0;e=(j|0)>0?j:0;j=c[a+4>>2]|0;h=b[a>>1]|0;if(h<<16>>16>0){k=c[a+12>>2]|0;a=h<<16>>16;h=0;l=0;m=0;while(1){n=b[k+(l<<1)>>1]|0;if((m|0)>(n|0)){o=h}else{p=h;q=m;r=c[j+(n<<3)>>2]|0;s=c[j+(n<<3)+4>>2]|0;while(1){t=r;r=c[j+(q<<3)>>2]|0;u=s;s=c[j+(q<<3)+4>>2]|0;v=(ca(s-u>>e,r+t>>g)|0)+p|0;if((q|0)>=(n|0)){o=v;break}else{p=v;q=q+1|0}}}l=l+1|0;if((l|0)>=(a|0)){break}else{h=o;m=n+1|0}}if((o|0)>0){f=1;i=d;return f|0}else{w=o}}else{w=0}f=(w>>31)+2&-2;i=d;return f|0}function uFa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=c[a+20>>2]|0;if((e|0)==0){f=(c[a+4>>2]|0)>>>0<b>>>0?85:0}else{g=(id[e&511](a,b,0,0)|0)==0;f=g?0:85}if((f|0)!=0){i=d;return f|0}c[a+8>>2]=b;i=d;return f|0}function vFa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=AFa(a,c[a+8>>2]|0,b,d)|0;i=e;return f|0}function wFa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)<0){e=85;i=d;return e|0}e=uFa(a,(c[a+8>>2]|0)+b|0)|0;i=d;return e|0}function xFa(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;i=i+16|0;f=e;c[b>>2]=0;g=a+8|0;h=c[g>>2]|0;do{if((h+1|0)>>>0<(c[a+4>>2]|0)>>>0){j=c[a+20>>2]|0;if((j|0)==0){k=(c[a>>2]|0)+h|0;if((k|0)==0){l=h;m=0}else{n=h;o=k;p=6}}else{if((id[j&511](a,h,f,2)|0)!=2){break}n=c[g>>2]|0;o=f;p=6}if((p|0)==6){l=n;m=((d[o>>0]|0)<<8|(d[o+1>>0]|0))&65535}c[g>>2]=l+2;q=m;i=e;return q|0}}while(0);c[b>>2]=85;q=0;i=e;return q|0}function yFa(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;i=i+16|0;f=e;c[b>>2]=0;g=a+8|0;h=c[g>>2]|0;do{if((h+3|0)>>>0<(c[a+4>>2]|0)>>>0){j=c[a+20>>2]|0;if((j|0)==0){k=(c[a>>2]|0)+h|0;if((k|0)==0){l=h;m=0}else{n=h;o=k;p=6}}else{if((id[j&511](a,h,f,4)|0)!=4){break}n=c[g>>2]|0;o=f;p=6}if((p|0)==6){l=n;m=(d[o+1>>0]|0)<<16|(d[o>>0]|0)<<24|(d[o+2>>0]|0)<<8|(d[o+3>>0]|0)}c[g>>2]=l+4;q=m;i=e;return q|0}}while(0);c[b>>2]=85;q=0;i=e;return q|0}function zFa(a){a=a|0;return a|0}function AFa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;g=c[a+4>>2]|0;if(!(g>>>0>b>>>0)){h=85;i=f;return h|0}j=c[a+20>>2]|0;if((j|0)==0){k=g-b|0;g=k>>>0>e>>>0?e:k;c3a(d|0,(c[a>>2]|0)+b|0,g|0)|0;l=g}else{l=id[j&511](a,b,d,e)|0}c[a+8>>2]=l+b;h=l>>>0<e>>>0?85:0;i=f;return h|0}function BFa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=CFa(a,b)|0;if((f|0)!=0){i=e;return f|0}b=a+32|0;c[d>>2]=c[b>>2];c[b>>2]=0;c[a+36>>2]=0;i=e;return f|0}function CFa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;i=i+16|0;e=d;c[e>>2]=0;f=a+20|0;if((c[f>>2]|0)==0){g=a+8|0;h=c[g>>2]|0;j=c[a+4>>2]|0;if(h>>>0>=j>>>0|(j-h|0)>>>0<b>>>0){c[e>>2]=85;k=85;i=d;return k|0}else{j=c[a>>2]|0;c[a+32>>2]=j+h;l=h+b|0;c[a+36>>2]=j+l;c[g>>2]=l;k=0;i=d;return k|0}}l=c[a+28>>2]|0;if((c[a+4>>2]|0)>>>0<b>>>0){c[e>>2]=85;k=85;i=d;return k|0}g=EFa(l,b,e)|0;c[a>>2]=g;j=c[e>>2]|0;if((j|0)!=0){k=j;i=d;return k|0}j=a+8|0;h=id[c[f>>2]&511](a,c[j>>2]|0,g,b)|0;g=c[a>>2]|0;if(h>>>0<b>>>0){aEa(l,g);c[a>>2]=0;c[e>>2]=85;m=0;n=85}else{m=g;n=0}c[a+32>>2]=m;c[a+36>>2]=m+b;c[j>>2]=(c[j>>2]|0)+h;k=n;i=d;return k|0}function DFa(a,b){a=a|0;b=b|0;var d=0;d=i;if((a|0)!=0?(c[a+20>>2]|0)!=0:0){aEa(c[a+28>>2]|0,c[b>>2]|0);c[b>>2]=0}c[b>>2]=0;i=d;return}function EFa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;if((b|0)>0){f=dd[c[a+4>>2]&511](a,b)|0;g=f;h=(f|0)==0?64:0}else{g=0;h=b>>31&6}c[d>>2]=h;i=e;return g|0}function FFa(a){a=a|0;var b=0;b=i;if((c[a+20>>2]|0)!=0){aEa(c[a+28>>2]|0,c[a>>2]|0);c[a>>2]=0}c[a+32>>2]=0;c[a+36>>2]=0;i=b;return}function GFa(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;e=b+32|0;f=c[e>>2]|0;if(!(f>>>0<(c[b+36>>2]|0)>>>0)){g=0;i=d;return g|0}c[e>>2]=f+1;g=a[f>>0]|0;i=d;return g|0}function HFa(a){a=a|0;var b=0,e=0,f=0,g=0,h=0,j=0;b=i;e=a+32|0;f=c[e>>2]|0;g=f+1|0;if(!(g>>>0<(c[a+36>>2]|0)>>>0)){h=f;j=0;c[e>>2]=h;i=b;return j|0}h=f+2|0;j=((d[f>>0]|0)<<8|(d[g>>0]|0))&65535;c[e>>2]=h;i=b;return j|0}function IFa(a){a=a|0;var b=0,e=0,f=0,g=0,h=0,j=0;b=i;e=a+32|0;f=c[e>>2]|0;g=f+3|0;if(!(g>>>0<(c[a+36>>2]|0)>>>0)){h=f;j=0;c[e>>2]=h;i=b;return j|0}h=f+4|0;j=(d[f+1>>0]|0)<<16|(d[f>>0]|0)<<24|(d[f+2>>0]|0)<<8|(d[g>>0]|0);c[e>>2]=h;i=b;return j|0}function JFa(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;i=i+16|0;f=e;a[f>>0]=0;c[d>>2]=0;g=c[b+20>>2]|0;h=b+8|0;j=c[h>>2]|0;if((g|0)==0){if(j>>>0<(c[b+4>>2]|0)>>>0){k=a[(c[b>>2]|0)+j>>0]|0;a[f>>0]=k;l=j;m=k;n=6}else{n=7}}else{if((id[g&511](b,j,f,1)|0)==1){l=c[h>>2]|0;m=a[f>>0]|0;n=6}else{n=7}}if((n|0)==6){c[h>>2]=l+1;o=m;i=e;return o|0}else if((n|0)==7){c[d>>2]=85;o=0;i=e;return o|0}return 0}function KFa(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;i=i+16|0;f=e;c[b>>2]=0;g=a+8|0;h=c[g>>2]|0;do{if((h+3|0)>>>0<(c[a+4>>2]|0)>>>0){j=c[a+20>>2]|0;if((j|0)==0){k=(c[a>>2]|0)+h|0;if((k|0)==0){l=h;m=0}else{n=h;o=k;p=6}}else{if((id[j&511](a,h,f,4)|0)!=4){break}n=c[g>>2]|0;o=f;p=6}if((p|0)==6){l=n;m=(d[o+2>>0]|0)<<16|(d[o+3>>0]|0)<<24|(d[o+1>>0]|0)<<8|(d[o>>0]|0)}c[g>>2]=l+4;q=m;i=e;return q|0}}while(0);c[b>>2]=85;q=0;i=e;return q|0}function LFa(f,g,h){f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;j=i;if((g|0)==0|(f|0)==0){k=6;i=j;return k|0}l=f+32|0;m=f+36|0;n=g;g=0;a:while(1){o=n;p=c[l>>2]|0;b:while(1){q=a[o>>0]|0;switch(q&255|0){case 22:case 23:{r=p+3|0;s=8;t=(d[p+1>>0]|0)<<8|(d[p+2>>0]|0)<<16|(d[p>>0]|0);u=18;break};case 18:case 19:{r=p+4|0;s=0;t=(d[p+2>>0]|0)<<16|(d[p+3>>0]|0)<<24|(d[p+1>>0]|0)<<8|(d[p>>0]|0);u=18;break};case 20:case 21:{r=p+3|0;s=8;t=(d[p+1>>0]|0)<<8|(d[p>>0]|0)<<16|(d[p+2>>0]|0);u=18;break};case 14:case 15:{r=p+2|0;s=16;t=(d[p+1>>0]|0)<<8|(d[p>>0]|0);u=18;break};case 9:case 8:{r=p+1|0;s=24;t=d[p>>0]|0;u=18;break};case 4:{break b;break};case 25:case 24:{v=d[o+1>>0]|0;w=p+v|0;if(w>>>0>(c[m>>2]|0)>>>0){x=85;break a}if(q<<24>>24==24){c3a(h+(e[o+2>>1]|0)|0,p|0,v|0)|0;y=w}else{y=w}break};case 12:case 13:{r=p+2|0;s=16;t=(d[p>>0]|0)<<8|(d[p+1>>0]|0);u=18;break};case 16:case 17:{r=p+4|0;s=0;t=(d[p+1>>0]|0)<<16|(d[p>>0]|0)<<24|(d[p+2>>0]|0)<<8|(d[p+3>>0]|0);u=18;break};default:{u=17;break a}}do{if((u|0)==18){u=0;if((q&1)==0){z=t}else{z=t<<s>>s}w=h+(e[o+2>>1]|0)|0;v=d[o+1>>0]|0;if((v|0)==2){b[w>>1]=z;y=r;break}else if((v|0)==1){a[w>>0]=z;y=r;break}else if((v|0)==4){c[w>>2]=z;y=r;break}else{c[w>>2]=z;y=r;break}}}while(0);o=o+4|0;p=y}q=CFa(f,e[o+2>>1]|0)|0;if((q|0)!=0){x=q;break}n=o+4|0;g=1}if((u|0)==17){c[l>>2]=p;x=0}if(g<<24>>24==0){k=x;i=j;return k|0}FFa(f);k=x;i=j;return k|0}function MFa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;d=c[a>>2]|0;e=a+4|0;f=c[e>>2]|0;g=LDa(((f|0)<0?0-f|0:f)|((d|0)<0?0-d|0:d))|0;if((g|0)<30){h=29-g|0;c[a>>2]=d<<h;c[e>>2]=f<<h;j=h;i=b;return j|0}else{h=g+ -29|0;c[a>>2]=d>>h;c[e>>2]=f>>h;j=29-g|0;i=b;return j|0}return 0}function NFa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;b=i;d=c[a>>2]|0;e=a+4|0;f=c[e>>2]|0;g=0-d|0;if((f|0)>(d|0)){if((f|0)>(g|0)){h=761408;j=1;k=1;l=5898240;m=f;n=g}else{h=761408;j=1;k=1;l=(f|0)>0?11796480:-11796480;m=g;n=0-f|0}}else{o=(f|0)<(g|0);h=761408;j=1;k=1;l=o?-5898240:0;m=o?0-f|0:d;n=o?d:f}while(1){f=j+n>>k;if((n|0)>0){p=(c[h>>2]|0)+l|0;q=f+m|0;r=n-(j+m>>k)|0}else{p=l-(c[h>>2]|0)|0;q=m-f|0;r=(j+m>>k)+n|0}k=k+1|0;if((k|0)==23){break}else{h=h+4|0;j=j<<1;l=p;m=q;n=r}}if((p|0)>-1){s=p+16&-32;c[a>>2]=q;c[e>>2]=s;i=b;return}else{s=0-(16-p&-32)|0;c[a>>2]=q;c[e>>2]=s;i=b;return}}function OFa(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;b=(a|0)<0?0-a|0:a;c=b>>>16;d=b&65535;b=(d*56281|0)+(c*23318|0)|0;e=(d*23318|0)>>>16;d=b+e|0;f=(d>>>16)+(c*56281|0)|0;c=d>>>0<(b>>>0>e>>>0?b:e)>>>0?f+65536|0:f;return((a|0)>-1?c:0-c|0)|0}function PFa(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0;h=i;i=i+16|0;j=h;c[j>>2]=0;do{if((d|b|e|0)>=0){if((e|0)==0|(b|0)==0){aEa(a,f);k=0;l=0;break}if((2147483647/(b|0)|0|0)<(e|0)){c[j>>2]=10;k=f;l=10;break}if((d|0)==0){m=ZDa(a,ca(e,b)|0,j)|0;k=m;l=c[j>>2]|0;break}m=ca(d,b)|0;n=ca(e,b)|0;o=id[c[a+16>>2]&511](a,m,n,f)|0;if((o|0)==0){c[j>>2]=64;k=f;l=64}else{k=o;l=0}}else{c[j>>2]=6;k=f;l=6}}while(0);c[g>>2]=l;i=h;return k|0}function QFa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;i=i+16|0;g=f;h=EFa(a,d,g)|0;a=c[g>>2]|0;if(!((a|0)!=0|(b|0)==0)){c3a(h|0,b|0,d|0)|0}c[e>>2]=a;i=f;return h|0}function RFa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=i;if((b|0)==0){e=0}else{e=(Y2a(b|0)|0)+1|0}f=QFa(a,b,e,c)|0;i=d;return f|0}function SFa(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;a:do{if(d>>>0>1){f=c;g=b;h=d;while(1){j=a[f>>0]|0;if(j<<24>>24==0){k=g;break a}l=g+1|0;a[g>>0]=j;h=h+ -1|0;if(!(h>>>0>1)){k=l;break}else{f=f+1|0;g=l}}}else{k=b}}while(0);a[k>>0]=0;i=e;return}function TFa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;g=c[a>>2]|0;if((g|0)!=0){h=(b|0)==0;j=g;do{g=j;j=c[j+4>>2]|0;if(!h){ld[b&255](d,c[g+8>>2]|0,e)}aEa(d,g)}while((j|0)!=0)}c[a>>2]=0;c[a+4>>2]=0;i=f;return}function UFa(a){a=a|0;var b=0;b=i;c[a+156>>2]=aFa(a,1869968492,0)|0;i=b;return}function VFa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;if((a|0)==0){i=d;return}e=a+36|0;f=a+40|0;a=c[f>>2]|0;if((c[e>>2]|0)>0){g=a;h=0;while(1){XEa(c[g+(h<<2)>>2]|0);c[(c[f>>2]|0)+(h<<2)>>2]=0;h=h+1|0;j=c[f>>2]|0;if((h|0)>=(c[e>>2]|0)){k=j;break}else{g=j}}}else{k=a}aEa(b,k);c[f>>2]=0;c[e>>2]=0;i=d;return}function WFa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=c[a>>2]|0;if((c[b+72>>2]|0)!=1651078259){f=18;i=d;return f|0}c[a+20>>2]=c[b+100>>2];c[a+24>>2]=c[b+104>>2];g=b+156|0;h=a+28|0;if((c[(c[g>>2]|0)+4>>2]&1|0)==0){LJa(h);f=MJa(c[e>>2]|0,b+76|0,h)|0;i=d;return f|0}else{e=b+76|0;c[h+0>>2]=c[e+0>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];c[h+12>>2]=c[e+12>>2];c[h+16>>2]=c[e+16>>2];c[h+20>>2]=c[e+20>>2];e=(c[g>>2]|0)+4|0;c[e>>2]=c[e>>2]&-2;f=0;i=d;return f|0}return 0}function XFa(a){a=a|0;var b=0;b=i;NJa(c[a>>2]|0,a+28|0)|0;i=b;return}function YFa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[a>>2]|0;c[b+20>>2]=c[a+20>>2];c[b+24>>2]=c[a+24>>2];f=MJa(c[e>>2]|0,a+28|0,b+28|0)|0;i=d;return f|0}function ZFa(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[a+20>>2]<<6;c[b>>2]=d;e=a+28|0;c[b+8>>2]=(c[e+4>>2]<<6)+d;d=c[a+24>>2]<<6;c[b+12>>2]=d;c[b+4>>2]=d-(c[e>>2]<<6);return}function _Fa(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=d+108|0;g=a+20|0;if((c[d+72>>2]|0)!=1869968492){h=18;i=e;return h|0}j=nFa(c[a>>2]|0,b[d+110>>1]|0,b[f>>1]|0,g)|0;if((j|0)!=0){h=j;i=e;return h|0}oFa(f,g);h=0;i=e;return h|0}function $Fa(a){a=a|0;var b=0;b=i;pFa(c[a>>2]|0,a+20|0)|0;i=b;return}function aGa(a,d){a=a|0;d=d|0;var e=0,f=0,g=0;e=i;f=a+20|0;g=d+20|0;d=nFa(c[a>>2]|0,b[f+2>>1]|0,b[f>>1]|0,g)|0;if((d|0)!=0){i=e;return d|0}oFa(f,g);i=e;return d|0}function bGa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;if((b|0)!=0){wEa(a+20|0,b)}if((d|0)==0){i=e;return}xEa(a+20|0,c[d>>2]|0,c[d+4>>2]|0);i=e;return}function cGa(a,b){a=a|0;b=b|0;var c=0;c=i;qFa(a+20|0,b);i=c;return}function dGa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;c[b+72>>2]=1869968492;e=b+108|0;f=a+20|0;c[e+0>>2]=c[f+0>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];c[e+16>>2]=c[f+16>>2];f=b+124|0;c[f>>2]=c[f>>2]&-2;i=d;return 0}function eGa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e;g=c[a>>2]|0;c[d>>2]=0;h=ZDa(g,c[b>>2]|0,f)|0;g=c[f>>2]|0;if((g|0)!=0){i=e;return g|0}c[h>>2]=a;c[h+4>>2]=b;c[h+8>>2]=c[b+4>>2];c[d>>2]=h;i=e;return g|0}function fGa(a){a=a|0;var b=0,d=0,e=0;b=i;if((a|0)==0){i=b;return}d=c[c[a>>2]>>2]|0;e=c[(c[a+4>>2]|0)+12>>2]|0;if((e|0)!=0){Rc[e&1023](a)}aEa(d,a);i=b;return}function gGa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+16|0;e=d;if((a|0)==0){f=37;i=d;return f|0}g=c[a>>2]|0;if((b|0)==0){f=6;i=d;return f|0}h=c[a+72>>2]|0;if((h|0)==1651078259){j=761496}else if((h|0)!=1869968492){k=aFa(g,h,0)|0;h=(k|0)==0;if(h){f=18;i=d;return f|0}else{j=h?0:k+20|0}}else{j=761528}k=eGa(g,j,e)|0;if((k|0)!=0){f=k;i=d;return f|0}k=c[e>>2]|0;c[k+12>>2]=c[a+64>>2]<<10;c[k+16>>2]=c[a+68>>2]<<10;e=dd[c[j+8>>2]&511](k,a)|0;if((e|0)==0){c[b>>2]=k;f=0;i=d;return f|0}else{fGa(k);f=e;i=d;return f|0}return 0}function hGa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;if((d|0)==0){i=e;return}f=d+12|0;g=d+8|0;h=d+4|0;j=(a|0)==0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;if(j){i=e;return}j=c[a+4>>2]|0;if((j|0)==0){i=e;return}k=c[j+24>>2]|0;if((k|0)==0){i=e;return}Ic[k&511](a,d);if((b&-3|0)==1){c[d>>2]=c[d>>2]&-64;c[h>>2]=c[h>>2]&-64;c[g>>2]=(c[g>>2]|0)+63&-64;c[f>>2]=(c[f>>2]|0)+63&-64}if((b&-2|0)!=2){i=e;return}c[d>>2]=c[d>>2]>>6;c[h>>2]=c[h>>2]>>6;c[g>>2]=c[g>>2]>>6;c[f>>2]=c[f>>2]>>6;i=e;return}function iGa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;if((a|0)==0){e=40;i=d;return e|0}f=a+12|0;c[f>>2]=0;c[a+16>>2]=b;c[a>>2]=0;c[a+8>>2]=0;g=a+20|0;c[g>>2]=0;h=a+24|0;c[h>>2]=0;j=gc(b|0,824672)|0;if((j|0)==0){e=1;i=d;return e|0}_b(j|0,0,2)|0;b=ob(j|0)|0;c[a+4>>2]=b;if((b|0)==0){ac(j|0)|0;e=81;i=d;return e|0}else{_b(j|0,0,0)|0;c[f>>2]=j;c[g>>2]=299;c[h>>2]=569;e=0;i=d;return e|0}return 0}function jGa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;if((e|0)==0?(c[a+4>>2]|0)>>>0<b>>>0:0){g=1;i=f;return g|0}h=c[a+12>>2]|0;if((c[a+8>>2]|0)!=(b|0)){_b(h|0,b|0,0)|0}g=Ya(d|0,1,e|0,h|0)|0;i=f;return g|0}function kGa(a){a=a|0;var b=0,d=0;b=i;d=a+12|0;ac(c[d>>2]|0)|0;c[d>>2]=0;c[a+4>>2]=0;c[a>>2]=0;i=b;return}function lGa(){var a=0,b=0;a=i;b=qna(20)|0;if((b|0)==0){i=a;return b|0}c[b>>2]=0;c[b+4>>2]=279;c[b+16>>2]=300;c[b+12>>2]=333;i=a;return b|0}function mGa(a,b){a=a|0;b=b|0;var c=0;a=i;c=qna(b)|0;i=a;return c|0}function nGa(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;b=i;a=rna(d,c)|0;i=b;return a|0}function oGa(a,b){a=a|0;b=b|0;a=i;sna(b);i=a;return}function pGa(a){a=a|0;var b=0;b=i;sna(a);i=b;return}function qGa(b){b=b|0;var c=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;c=i;e=a[b>>0]|0;do{if(e<<24>>24==117){f=b+1|0;g=a[f>>0]|0;do{if(g<<24>>24==110){if((a[b+2>>0]|0)==105){h=4;j=b+3|0;k=0;while(1){l=d[j>>0]|0;m=l+ -48|0;if(m>>>0>9){n=(l+ -65|0)>>>0>5?16:l+ -55|0;if(n>>>0>15){o=h;p=j;q=k;break}else{r=n}}else{r=m}m=r+(k<<4)|0;n=h+ -1|0;l=j+1|0;if((n|0)>0){h=n;j=l;k=m}else{o=n;p=l;q=m;break}}if((o|0)==0){k=a[p>>0]|0;if(k<<24>>24==0){s=q;i=c;return s|0}else if(!(k<<24>>24==46)){t=110;u=6;v=f;w=0;break}s=q|-2147483648;i=c;return s|0}else{t=110;u=6;v=f;w=0}}else{t=110;u=6;v=f;w=0}}else{t=g;u=6;v=f;w=0}}while(0);while(1){f=t&255;g=f+ -48|0;if(g>>>0>9){k=(f+ -65|0)>>>0>5?16:f+ -55|0;if(k>>>0>15){x=15;break}else{y=k}}else{y=g}g=y+(w<<4)|0;k=u+ -1|0;f=v+1|0;if((k|0)<=0){z=f;A=g;break}t=a[f>>0]|0;u=k;v=f;w=g}if((x|0)==15){if((u|0)<3){z=v;A=w}else{B=e;C=b;break}}g=a[z>>0]|0;if(g<<24>>24==0){s=A;i=c;return s|0}else if(!(g<<24>>24==46)){B=e;C=b;break}s=A|-2147483648;i=c;return s|0}else{B=e;C=b}}while(0);while(1){if(B<<24>>24==46){if(C>>>0>b>>>0){x=21;break}}else if(B<<24>>24==0){D=C;break}e=C+1|0;B=a[e>>0]|0;C=e}if((x|0)==21){if((C|0)==0){D=0}else{s=rGa(b,C)|0|-2147483648;i=c;return s|0}}s=rGa(b,D)|0;i=c;return s|0}function rGa(b,c){b=b|0;c=c|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;e=i;if(!((b|0)!=0&b>>>0<c>>>0)){f=0;i=e;return f|0}g=b+1|0;h=a[b>>0]|0;b=52;j=0;while(1){k=b+j>>1;l=k<<1;m=761560+(d[l+761562>>0]<<8|d[l+761563>>0])|0;n=a[m>>0]|0;l=n&127;if((l|0)==(h|0)){break}o=(l|0)<(h|0);j=o?k+1|0:j;b=o?b:k;if((j|0)>=(b|0)){f=0;p=16;break}}if((p|0)==16){i=e;return f|0}a:do{if(g>>>0<c>>>0){b=g;j=n;h=m;b:while(1){k=a[b>>0]|0;b=b+1|0;o=h+1|0;l=a[o>>0]|0;q=l&255;r=q&127;c:do{if(j<<24>>24<0){if((k|0)==(r|0)){s=l;t=o}else{f=0;p=16;break b}}else{if((r|0)==0){f=0;p=16;break b}u=r;v=((q&128|0)==0?o:h+3|0)+1|0;while(1){w=761560+(d[v>>0]<<8|d[v+1>>0])|0;x=a[w>>0]|0;if((k|0)==(x&127|0)){s=x;t=w;break c}u=u+ -1|0;if((u|0)<=0){f=0;p=16;break b}else{v=v+2|0}}}}while(0);if(!(b>>>0<c>>>0)){y=s;z=t;break a}else{j=s;h=t}}if((p|0)==16){i=e;return f|0}}else{y=n;z=m}}while(0);if(!(y<<24>>24>-1)){f=0;i=e;return f|0}if((a[z+1>>0]|0)>=0){f=0;i=e;return f|0}f=d[z+2>>0]<<8|d[z+3>>0];i=e;return f|0}function sGa(b,c){b=b|0;c=c|0;var e=0,f=0,g=0,h=0;e=i;f=0;do{g=f<<1;f=f+1|0;if((tGa(b,0,(d[g+761562>>0]|0)<<8|(d[g+761563>>0]|0),c)|0)!=0){h=5;break}}while((f|0)<52);if((h|0)==5){i=e;return}a[b>>0]=0;i=e;return}function tGa(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;g=i;h=c;c=e;while(1){e=a[761560+c>>0]|0;a[b+h>>0]=e&127;h=h+1|0;j=c+1|0;if(!(e<<24>>24<0)){break}else{c=j}}a[b+h>>0]=0;e=d[761560+j>>0]|0;j=e&127;k=c+2|0;do{if((e&128|0)!=0){if(((d[761560+k>>0]|0)<<8|(d[c+761563>>0]|0)|0)==(f|0)){l=1;i=g;return l|0}else{m=c+4|0;break}}else{m=k}}while(0);if((j|0)==0){l=0;i=g;return l|0}else{n=0}while(1){k=(n<<1)+m|0;n=n+1|0;if((tGa(b,h,(d[761560+k>>0]|0)<<8|(d[k+761561>>0]|0),f)|0)!=0){l=1;o=9;break}if((n|0)>=(j|0)){l=0;o=9;break}}if((o|0)==9){i=g;return l|0}return 0}function uGa(a,b){a=a|0;b=b|0;var c=0;a=i;c=jEa(817640,b)|0;i=a;return c|0}function vGa(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;h=i;i=i+96|0;j=h+80|0;k=h+40|0;l=h;m=k+0|0;n=m+40|0;do{c[m>>2]=0;m=m+4|0}while((m|0)<(n|0));m=b+16|0;c[m>>2]=0;n=b+20|0;c[n>>2]=0;b=dEa(a,8,0,d+10|0,0,j)|0;c[n>>2]=b;o=c[j>>2]|0;if((o|0)!=0){p=o;i=h;return p|0}if((d|0)==0){q=b;r=0}else{o=(f|0)==0;s=b;b=0;while(1){t=dd[e&511](g,b)|0;if((t|0)!=0){u=0;while(1){v=u+1|0;if((R2a(823208+(c[823296+(u<<2)>>2]|0)|0,t)|0)==0){w=7;break}if(v>>>0<10){u=v}else{break}}if((w|0)==7?(w=0,v=k+(u<<2)|0,(c[v>>2]|0)==0):0){c[v>>2]=1;c[l+(u<<2)>>2]=b}v=qGa(t)|0;if((v&2147483647|0)==0){x=s}else{y=0;while(1){z=y+1|0;if((c[823168+(y<<2)>>2]|0)==(v|0)){w=12;break}if(z>>>0<10){y=z}else{break}}if((w|0)==12){w=0;c[k+(y<<2)>>2]=2}c[s>>2]=v;c[s+4>>2]=b;x=s+8|0}if(o){A=x}else{Ic[f&511](g,t);A=x}}else{A=s}b=b+1|0;if((b|0)==(d|0)){q=A;r=0;break}else{s=A}}}while(1){if((c[k+(r<<2)>>2]|0)==1){c[q>>2]=c[823168+(r<<2)>>2];c[q+4>>2]=c[l+(r<<2)>>2];B=q+8|0}else{B=q}r=r+1|0;if((r|0)==10){break}else{q=B}}q=c[n>>2]|0;r=B-q>>3;if((r|0)==0){aEa(a,q);c[n>>2]=0;B=c[j>>2]|0;if((B|0)==0){c[j>>2]=163;C=163}else{C=B}}else{if(r>>>0<d>>>1>>>0){B=dEa(a,8,d,r,q,j)|0;c[n>>2]=B;c[j>>2]=0;D=0;E=B}else{D=c[j>>2]|0;E=q}N1a(E,r,8,280);C=D}c[m>>2]=r;p=C;i=h;return p|0}function wGa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=i;e=c[a+20>>2]|0;f=(c[a+16>>2]|0)+ -1|0;if((f|0)<0){g=0;i=d;return g|0}a=e+(f<<3)|0;f=e;e=0;a:while(1){h=a;j=f;k=e;while(1){l=h-j>>4;m=j+(l<<3)|0;n=c[m>>2]|0;if((n|0)==(b|0)){o=m;break a}p=n&2147483647;q=(p|0)==(b|0)?m:k;if((j|0)==(a|0)){o=q;break a}if(!(p>>>0<b>>>0)){break}p=j+(l+1<<3)|0;if(p>>>0>a>>>0){o=q;break a}else{j=p;k=q}}k=l+ -1|0;if((k|0)<0){o=q;break}else{a=j+(k<<3)|0;f=j;e=q}}if((o|0)==0){g=0;i=d;return g|0}g=c[o+4>>2]|0;i=d;return g|0}function xGa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=i;e=(c[b>>2]|0)+1|0;f=c[a+16>>2]|0;do{if((f|0)!=0){g=c[a+20>>2]|0;h=f;j=0;k=0;while(1){l=((h-j|0)>>>1)+j|0;m=c[g+(l<<3)>>2]|0;if((m|0)==(e|0)){n=4;break}o=m&2147483647;if((o|0)==(e|0)){p=c[g+(l<<3)+4>>2]|0}else{p=k}m=o>>>0<e>>>0;j=m?l+1|0:j;h=m?h:l;if(!(j>>>0<h>>>0)){n=8;break}else{k=p}}if((n|0)==4){q=e;r=c[g+(l<<3)+4>>2]|0;break}else if((n|0)==8){if((p|0)==0){s=j;n=9;break}else{q=e;r=p;break}}}else{s=0;n=9}}while(0);if((n|0)==9){if(s>>>0<f>>>0){f=c[a+20>>2]|0;q=c[f+(s<<3)>>2]&2147483647;r=c[f+(s<<3)+4>>2]|0}else{q=0;r=0}}c[b>>2]=q;i=d;return r|0}function yGa(a){a=a|0;return 818168+(b[822648+((a>>>0>257?0:a)<<1)>>1]|0)|0}function zGa(a){a=a|0;var c=0;if(a>>>0>390){c=0}else{c=818168+(b[821864+(a<<1)>>1]|0)|0}return c|0}function AGa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=c[a>>2]|0;a=e&2147483647;f=c[b>>2]|0;b=f&2147483647;if((a|0)==(b|0)){if(e>>>0>f>>>0){g=1}else{g=(e>>>0<f>>>0)<<31>>31}}else{if(a>>>0>b>>>0){g=1}else{g=(a>>>0<b>>>0)<<31>>31}}i=d;return g|0}function BGa(){return c[205834]|0}function CGa(){var a=0,b=0,d=0;a=i;b=u2a(276)|0;d=b+260|0;c[b>>2]=0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[205834]=b;if((b|0)==0){i=a;return}b=u2a(164)|0;DHa(b);c[(c[205834]|0)+264>>2]=b;DIa(b);DGa(c[205834]|0);i=a;return}function DGa(b){b=b|0;var c=0,d=0;c=i;d=0;do{a[b+d+4>>0]=~~(+(d|0)/255.0*255.0+.5);d=d+1|0}while((d|0)!=256);i=c;return}function EGa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+260|0;a=c[d>>2]|0;if((a|0)!=0){e=a;i=b;return e|0}a=u2a(52)|0;f=a+0|0;g=f+52|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));VM(a);c[d>>2]=a;e=a;i=b;return e|0}function FGa(a){a=a|0;return a+4|0}function GGa(a){a=a|0;c[a>>2]=823352;c[a+44>>2]=0;c[a+4>>2]=0;return}function HGa(a){a=a|0;var b=0;b=i;IGa(a);v2a(a);i=b;return}function IGa(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=823352;d=c[a+44>>2]|0;if((d|0)==0){i=b;return}Rc[c[(c[d>>2]|0)+4>>2]&1023](d);i=b;return}function JGa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=a+44|0;f=c[e>>2]|0;if((f|0)!=0){Rc[c[(c[f>>2]|0)+4>>2]&1023](f)}c[e>>2]=b;KGa(a);i=d;return}function KGa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+44|0;e=c[d>>2]|0;f=a+8|0;c[f>>2]=dd[c[(c[e>>2]|0)+16>>2]&511](e,2)|0;e=c[d>>2]|0;g=a+12|0;c[g>>2]=dd[c[(c[e>>2]|0)+16>>2]&511](e,3)|0;e=c[d>>2]|0;c[a+16>>2]=dd[c[(c[e>>2]|0)+16>>2]&511](e,4)|0;e=c[d>>2]|0;c[a+20>>2]=dd[c[(c[e>>2]|0)+16>>2]&511](e,7)|0;e=c[d>>2]|0;c[a+24>>2]=dd[c[(c[e>>2]|0)+16>>2]&511](e,1)|0;e=c[d>>2]|0;d=a+28|0;if((dd[c[(c[e>>2]|0)+68>>2]&511](e,d)|0)!=0){i=b;return}c[d>>2]=0;c[a+32>>2]=0;c[a+36>>2]=c[f>>2];c[a+40>>2]=c[g>>2];i=b;return}function LGa(a){a=a|0;var b=0;b=i;Rc[c[(c[a>>2]|0)+36>>2]&1023](a);i=b;return}function MGa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[a+44>>2]|0;Ic[c[(c[e>>2]|0)+40>>2]&511](e,b);NGa(a);i=d;return}function NGa(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+44>>2]|0;e=a+28|0;if((dd[c[(c[d>>2]|0)+68>>2]&511](d,e)|0)!=0){i=b;return}c[e>>2]=0;c[a+32>>2]=0;c[a+36>>2]=c[a+8>>2];c[a+40>>2]=c[a+12>>2];i=b;return}function OGa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=dd[c[(c[a>>2]|0)+16>>2]&511](a,b)|0;i=d;return e|0}function PGa(a,b){a=a|0;b=b|0;var d=0;d=i;Ic[c[(c[b>>2]|0)+20>>2]&511](a,b);i=d;return}function QGa(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=i;if((a&512|0)!=0){f=JCa(b,c,d,a<<3&512|1056,0)|0;i=e;return f|0}if((a&2048|0)==0){f=JCa(b,c,d,(a&64|0)!=0?544:24,0)|0;i=e;return f|0}else{f=JCa(b,c,d,264,0)|0;i=e;return f|0}return 0}function RGa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;g=c[a+44>>2]|0;if((id[c[(c[g>>2]|0)+44>>2]&511](g,b,d,e)|0)==0){h=0;i=f;return h|0}NGa(a);h=1;i=f;return h|0}function SGa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;g=c[a+44>>2]|0;if((id[c[(c[g>>2]|0)+48>>2]&511](g,b,d,e)|0)==0){h=0;i=f;return h|0}NGa(a);h=1;i=f;return h|0}function TGa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;OIa(e);XIa(e,+(c[b>>2]|0),+(c[b+12>>2]|0),+(c[b+8>>2]|0),+(c[b+4>>2]|0));if((RGa(a,e,0,2)|0)!=0){NGa(a)}PIa(c[e+4>>2]|0);i=d;return}function UGa(a,b,d,e,f,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,S=0.0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0;l=i;i=i+336|0;m=l+324|0;n=l+320|0;o=l+316|0;p=l+312|0;q=l+296|0;r=l+280|0;s=l+264|0;t=l+260|0;u=l+232|0;v=l+216|0;w=l+192|0;x=l+176|0;y=l+136|0;z=l+96|0;A=l+40|0;B=l+16|0;C=l;D=(j&3|0)==0;E=D?0:f>>>24&255;F=(e|0)==0;G=F?0:h>>>24;H=(G|0)==0;I=c[b>>2]|0;if(H&(I|0)==2){J=c[b+4>>2]|0;K=+g[J>>2];if((d|0)==0){g[m>>2]=K;L=+g[J+4>>2];g[o>>2]=L;M=+g[J+12>>2];g[n>>2]=M;N=+g[J+16>>2];g[p>>2]=N;O=K;P=L;Q=M;S=N}else{N=+g[J+4>>2];g[m>>2]=K;g[o>>2]=N;fma(d,m,o);N=+g[J+16>>2];g[n>>2]=+g[J+12>>2];g[p>>2]=N;fma(d,n,p);O=+g[m>>2];P=+g[o>>2];Q=+g[n>>2];S=+g[p>>2]}VGa(a,O,P,Q,S,f,j,k);T=1;i=l;return T|0}if((I|0)==5){if(H){U=9}}else{if((I|0)!=4|H^1){U=27}else{U=9}}if((U|0)==9){c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;if((j&8|0)==0?(cJa(b,d,q)|0)!=0:0){Mla(r,q);S=+g[q+4>>2];Q=+g[q>>2];I=~~+ba(+(S-Q));if((I|0)<1){p=c[r>>2]|0;n=r+8|0;if((p|0)==(c[n>>2]|0)){c[n>>2]=p+1;V=1}else{V=1}}else{V=I}P=+g[q+12>>2];O=+g[q+8>>2];q=~~+ba(+(P-O));if((q|0)<1){I=r+12|0;p=c[I>>2]|0;if((p|0)==(c[r+4>>2]|0)){c[I>>2]=p+1;W=2}else{W=2}}else{W=q+1|0}q=r+8|0;p=c[q>>2]|0;I=c[r>>2]|0;do{if((p-I|0)>=(V+1|0)){if(Q- +(I|0)>+(p|0)-S){c[r>>2]=I+1;break}else{c[q>>2]=p+ -1;break}}}while(0);p=r+12|0;q=c[p>>2]|0;I=r+4|0;V=c[I>>2]|0;do{if((q-V|0)>=(W|0)){if(P- +(V|0)>+(q|0)-O){c[I>>2]=V+1;break}else{c[p>>2]=q+ -1;break}}}while(0);if((WGa(a,r,f,k)|0)!=0){T=1;i=l;return T|0}else{U=27}}else{U=27}}if((U|0)==27?H&(D^1)&(j&144|0)==0:0){OIa(s);c[t>>2]=0;H=a+44|0;U=c[H>>2]|0;if((aJa(b,s,d,t,Lc[c[(c[U>>2]|0)+108>>2]&255](U)|0)|0)!=0){dJa(u);g[u+24>>2]=0.0;if((c[t>>2]|0)==0){X=f}else{X=(E&255)>>>2<<24|f&16777215}if((d|0)==0){Y=0}else{t=(uF(d)|0)==0;Y=t?d:0}t=c[H>>2]|0;Jc[c[(c[t>>2]|0)+52>>2]&3](t,s,Y,u,0,X,j&512|256,0,0,k)|0;gJa(c[u+8>>2]|0)}PIa(c[s+4>>2]|0)}if(!(D|E<<24>>24==0|(G|0)==255)?(j&16|0)!=0:0){G=a+20|0;if((c[G>>2]&1|0)==0){T=0;i=l;return T|0}c[v+0>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;if(F){YIa(v,b)}else{ZIa(v,b,+g[e+24>>2])}F=(d|0)!=0;if(F){Kla(v,d)}E=a+44|0;D=c[E>>2]|0;Ic[c[(c[D>>2]|0)+20>>2]&511](w,D);O=+R(+(+g[w>>2]));P=+R(+(+g[w+12>>2]));Mla(x,v);ICa(y);ICa(z);v=c[x>>2]|0;w=Fla(O*+((c[x+8>>2]|0)-v|0))|0;D=c[x+4>>2]|0;s=Fla(P*+((c[x+12>>2]|0)-D|0))|0;do{if((QGa(c[G>>2]|0,y,w,s)|0)==0){Z=0}else{if((c[y+20>>2]&2|0)==0){x=c[E>>2]|0;if((Wc[c[(c[x>>2]|0)+72>>2]&31](x,y,v,D,0,0)|0)==0){Z=0;break}LCa(z,y)}else{WCa(y,0);LCa(z,y)}Kxa(A);Lxa(A,y,z,1);g[B+12>>2]=1.0;g[B>>2]=1.0;g[B+20>>2]=0.0;g[B+16>>2]=0.0;g[B+8>>2]=0.0;g[B+4>>2]=0.0;if(F){c[B+0>>2]=c[d+0>>2];c[B+4>>2]=c[d+4>>2];c[B+8>>2]=c[d+8>>2];c[B+12>>2]=c[d+12>>2];c[B+16>>2]=c[d+16>>2];c[B+20>>2]=c[d+20>>2]}mM(B,0-v|0,0-D|0);Vla(B,O,0.0,0.0,P,0.0,0.0);x=c[A+44>>2]|0;if((Jc[c[(c[x>>2]|0)+52>>2]&3](x,b,B,e,f,h,j,0,0,k)|0)==0){_=0}else{c[C>>2]=0;c[C+4>>2]=0;c[C+8>>2]=w;c[C+12>>2]=s;x=c[E>>2]|0;_=Hc[c[(c[x>>2]|0)+80>>2]&7](x,y,0,C,v,D,0,0,0)|0}Oxa(A);Z=_}}while(0);PCa(z);PCa(y);T=Z;i=l;return T|0}Z=c[a+44>>2]|0;T=Jc[c[(c[Z>>2]|0)+52>>2]&3](Z,b,d,e,f,h,j,0,0,k)|0;i=l;return T|0}function VGa(a,b,d,e,f,g,h,j){a=a|0;b=+b;d=+d;e=+e;f=+f;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0;k=i;i=i+48|0;l=k+12|0;m=k;if(g>>>0>4278190079?(n=c[a+44>>2]|0,(od[c[(c[n>>2]|0)+64>>2]&1](n,b,d,e,f,g,0,0,j)|0)!=0):0){i=k;return}dJa(l);OIa(m);QIa(m,2);WIa(m,0,b,d,6);WIa(m,1,e,f,2);n=c[a+44>>2]|0;Jc[c[(c[n>>2]|0)+52>>2]&3](n,m,0,l,0,g,h,0,0,j)|0;PIa(c[m+4>>2]|0);gJa(c[l+8>>2]|0);i=k;return}function WGa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;i=i+64|0;g=f+16|0;h=f;j=a+44|0;k=c[j>>2]|0;if((Wc[c[(c[k>>2]|0)+60>>2]&31](k,b,d,0,0,e)|0)!=0){l=1;i=f;return l|0}e=a+20|0;if((c[e>>2]&1|0)==0){l=0;i=f;return l|0}ICa(g);a=b+8|0;k=b+12|0;m=b+4|0;if(((QGa(c[e>>2]|0,g,(c[a>>2]|0)-(c[b>>2]|0)|0,(c[k>>2]|0)-(c[m>>2]|0)|0)|0)!=0?(e=c[j>>2]|0,(Wc[c[(c[e>>2]|0)+72>>2]&31](e,g,c[b>>2]|0,c[m>>2]|0,0,0)|0)!=0):0)?(GBa(g,0,0,(c[a>>2]|0)-(c[b>>2]|0)|0,(c[k>>2]|0)-(c[m>>2]|0)|0,d,0,0)|0)!=0:0){d=c[b>>2]|0;b=(c[a>>2]|0)-d|0;a=c[m>>2]|0;m=(c[k>>2]|0)-a|0;c[h>>2]=0;c[h+4>>2]=0;c[h+8>>2]=b;c[h+12>>2]=m;m=c[j>>2]|0;Hc[c[(c[m>>2]|0)+80>>2]&7](m,g,0,h,d,a,0,0,0)|0;n=1}else{n=0}PCa(g);l=n;i=f;return l|0}function XGa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;if((c[a+20>>2]&1|0)==0){g=0;i=f;return g|0}h=c[a+44>>2]|0;g=Wc[c[(c[h>>2]|0)+72>>2]&31](h,b,d,e,0,0)|0;i=f;return g|0}function YGa(a){a=a|0;var b=0,d=0;b=i;d=Lc[c[(c[a>>2]|0)+76>>2]&255](a)|0;i=b;return d|0}function ZGa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0;h=i;i=i+112|0;j=h+88|0;k=h+72|0;l=h+56|0;m=h+16|0;n=h;o=a+44|0;p=c[o>>2]|0;Ic[c[(c[p>>2]|0)+20>>2]&511](j,p);q=+R(+(+g[j>>2]));r=+R(+(+g[j+12>>2]));j=Fla(+(d|0)+ +(c[b+8>>2]|0)/q)|0;p=Fla(+(e|0)+ +(c[b+12>>2]|0)/r)|0;c[k>>2]=d;s=k+4|0;c[s>>2]=e;t=k+8|0;c[t>>2]=j;j=k+12|0;c[j>>2]=p;Ela(k,a+28|0);p=c[t>>2]|0;t=c[k>>2]|0;if((p|0)<=(t|0)){u=1;i=h;return u|0}k=c[j>>2]|0;j=c[s>>2]|0;if((k|0)<=(j|0)){u=1;i=h;return u|0}s=l+4|0;c[l>>2]=Fla(q*+(t-d|0))|0;c[s>>2]=Fla(r*+(j-e|0))|0;c[l+8>>2]=Fla(q*+(p-d|0))|0;c[l+12>>2]=Fla(r*+(k-e|0))|0;if((f|0)!=0?(e=c[a+20>>2]|0,(e&128|0)==0):0){v=e}else{w=5}do{if((w|0)==5){if((c[b+20>>2]&2|0)!=0?(e=c[a+20>>2]|0,(e&32|0)==0):0){v=e;break}e=c[o>>2]|0;u=Hc[c[(c[e>>2]|0)+80>>2]&7](e,b,0,l,t,j,f,0,0)|0;i=h;return u|0}}while(0);if((v&1|0)==0){u=0;i=h;return u|0}v=Fla(q*+(p-t|0))|0;p=Fla(r*+(k-j|0))|0;ICa(m);if(((JCa(m,v,p,c[a+20>>2]<<1&1024|32,0)|0)!=0?(a=c[o>>2]|0,(Wc[c[(c[a>>2]|0)+72>>2]&31](a,m,t,j,0,0)|0)!=0):0)?(EBa(m,0,0,v,p,b,c[l>>2]|0,c[s>>2]|0,f,0,0,0)|0)!=0:0){c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=v;c[n+12>>2]=p;p=c[o>>2]|0;x=Hc[c[(c[p>>2]|0)+80>>2]&7](p,m,0,n,t,j,0,0,0)|0}else{x=0}PCa(m);u=x;i=h;return u|0}function _Ga(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0;k=i;i=i+32|0;l=k+16|0;m=k;c[l>>2]=d;c[l+4>>2]=e;c[l+8>>2]=f+d;c[l+12>>2]=g+e;n=a+28|0;c[m+0>>2]=c[n+0>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];Ela(m,l);if((c[m+8>>2]|0)<=(c[m>>2]|0)){o=1;i=k;return o|0}if((c[m+12>>2]|0)<=(c[m+4>>2]|0)){o=1;i=k;return o|0}l=c[a+44>>2]|0;o=Zc[c[(c[l>>2]|0)+84>>2]&3](l,b,0,d,e,f,g,m,h,0,0,j)|0;i=k;return o|0}function $Ga(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;i=i+16|0;h=g;j=c[b+8>>2]|0;k=c[b+12>>2]|0;c[h>>2]=0;c[h+4>>2]=0;c[h+8>>2]=j;c[h+12>>2]=k;k=Hc[c[(c[a>>2]|0)+80>>2]&7](a,b,f,h,d,e,0,0,0)|0;i=g;return k|0}function aHa(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0;k=i;i=i+32|0;l=k+16|0;m=k;c[l>>2]=d;c[l+4>>2]=e;c[l+8>>2]=f+d;c[l+12>>2]=g+e;n=a+28|0;c[m+0>>2]=c[n+0>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];Ela(m,l);l=c[a+44>>2]|0;a=Zc[c[(c[l>>2]|0)+84>>2]&3](l,b,h,d,e,f,g,m,j,0,0,0)|0;i=k;return a|0}function bHa(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0;k=i;l=Jc[c[(c[a>>2]|0)+88>>2]&3](a,b,d,e,f,g,h,0,0,j)|0;i=k;return l|0}function cHa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=Qc[c[(c[a>>2]|0)+92>>2]&255](a,b,d)|0;i=e;return f|0}function dHa(a,b){a=a|0;b=b|0;var d=0;d=i;Ic[c[(c[a>>2]|0)+96>>2]&511](a,b);i=d;return}function eHa(a){a=a|0;var b=0,d=0;b=i;gla(a+24|0);d=a+40|0;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;c[d+24>>2]=0;c[d+28>>2]=0;i=b;return}function fHa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=a+4|0;e=c[d>>2]|0;if((e|0)!=0){dka(e+4|0);v2a(e);c[d>>2]=0}d=a+8|0;e=c[d>>2]|0;if((e|0)!=0){v2a(e);c[d>>2]=0}d=c[a>>2]|0;do{if((d|0)!=0){e=d+8|0;f=c[e>>2]|0;if((f&1024|0)!=0){c[e>>2]=f&-1025}if((c[a+60>>2]|0)==0){f=c[(BGa()|0)+264>>2]|0;PHa(f,c[a>>2]|0);break}else{gHa(a);break}}}while(0);d=a+68|0;f=c[d>>2]|0;if((f|0)!=0){v2a(f);c[d>>2]=0}d=a+16|0;f=c[d>>2]|0;if((f|0)==0){g=a+28|0;h=c[g>>2]|0;ila(h);i=b;return}v2a(f);c[d>>2]=0;g=a+28|0;h=c[g>>2]|0;ila(h);i=b;return}function gHa(a){a=a|0;var b=0;b=i;GEa(c[a>>2]|0);c[a>>2]=0;i=b;return}function hHa(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0;k=i;c[a+60>>2]=0;c[a+64>>2]=j;j=u2a(36)|0;AHa(j);c[a+4>>2]=j;if((j|0)==0){i=k;return}l=GHa(c[(BGa()|0)+264>>2]|0,b,d,e,f,g,h,j)|0;c[a>>2]=l;if((l|0)==0){i=k;return}j=l+104|0;c[a+12>>2]=c[c[j>>2]>>2];c[a+20>>2]=c[(c[j>>2]|0)+4>>2];i=k;return}function iHa(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=c[a>>2]|0;if((f|0)==0){g=0;i=e;return g|0}h=c[a+4>>2]|0;if((h|0)!=0?(c[h+12>>2]&1|0)!=0:0){AJa(a,d,0,0);j=c[a>>2]|0}else{j=f}if((JDa(j,d,513)|0)!=0){g=0;i=e;return g|0}d=c[a>>2]|0;a=b[d+68>>1]|0;j=c[(c[d+84>>2]|0)+40>>2]|0;if(a<<16>>16==0){g=j;i=e;return g|0}g=(j*1e3|0)/(a&65535|0)|0;i=e;return g|0}function jHa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+16|0;f=e;g=w2a(d,1)|0;h=a+8|0;c[h>>2]=g;if((g|0)==0){i=e;return}c3a(g|0,b|0,d|0)|0;if((c[(c[(BGa()|0)+264>>2]|0)+32>>2]|0)==0){PJa((c[(BGa()|0)+264>>2]|0)+32|0)}if((CEa(c[(c[(BGa()|0)+264>>2]|0)+32>>2]|0,g,d,0,f)|0)==0){g=(SEa(c[f>>2]|0,64)|0)==0;j=g?c[f>>2]|0:0}else{j=0}c[a>>2]=j;c[a+12>>2]=c[h>>2];c[a+60>>2]=1;c[a+20>>2]=d;i=e;return}function kHa(a){a=a|0;var b=0;if((a|0)==0){b=0}else{b=(c[a+8>>2]|0)>>>3&1}return b|0}function lHa(a){a=a|0;var c=0,d=0,e=0,f=0;c=i;if((a|0)!=0){d=b[a+68>>1]|0;e=b[a+70>>1]|0;if(d<<16>>16==0){f=e}else{f=(e*1e3|0)/(d&65535|0)|0}}else{f=0}i=c;return f|0}function mHa(a){a=a|0;var c=0,d=0,e=0,f=0;c=i;if((a|0)!=0){d=b[a+68>>1]|0;e=b[a+72>>1]|0;if(d<<16>>16==0){f=e}else{f=(e*1e3|0)/(d&65535|0)|0}}else{f=0}i=c;return f|0}function nHa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;i=i+16|0;d=b+8|0;e=b;if((a|0)==0){f=0;i=b;return f|0}g=c[a+12>>2]&1;if((g|0)!=0){f=g;i=b;return f|0}eka(d,c[a+24>>2]|0,-1);Rka(d);pe(e,823368);a=(Qka(c[d>>2]|0,c[e>>2]|0,c[e+4>>2]|0)|0)!=-1&1;dka(d);f=a;i=b;return f|0}function oHa(a){a=a|0;var b=0;if((a|0)==0){b=0}else{b=(c[a+12>>2]|0)>>>1&1}return b|0}function pHa(a){a=a|0;var b=0;if((a|0)==0){b=0}else{b=c[a+8>>2]&4}return b|0}function qHa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[b>>2]|0;if((e|0)!=0){eka(a,c[e+20>>2]|0,-1);i=d;return}e=c[b+4>>2]|0;if((e|0)==0){c[a>>2]=0;i=d;return}else{hka(a,e+4|0);i=d;return}}function rHa(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=c[a>>2]|0;if((f|0)==0){i=e;return}g=b[f+68>>1]|0;h=g&65535;j=c[f+52>>2]|0;if(g<<16>>16==0){c[d>>2]=j;c[d+12>>2]=c[(c[a>>2]|0)+64>>2];c[d+4>>2]=c[(c[a>>2]|0)+56>>2];c[d+8>>2]=c[(c[a>>2]|0)+60>>2];i=e;return}else{c[d>>2]=(j*1e3|0)/(h|0)|0;c[d+4>>2]=((c[(c[a>>2]|0)+56>>2]|0)*1e3|0)/(h|0)|0;c[d+8>>2]=((c[(c[a>>2]|0)+60>>2]|0)*1e3|0)/(h|0)|0;c[d+12>>2]=((c[(c[a>>2]|0)+64>>2]|0)*1e3|0)/(h|0)|0;i=e;return}}function sHa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=a+4|0;a=c[c[e>>2]>>2]|0;do{if((a|0)!=0){if((TEa(a,1970170211)|0)==0){f=AEa(a,b)|0;break}g=c[(c[e>>2]|0)+4>>2]|0;if((g|0)!=0?(c[g+8>>2]|0)==2:0){if((TEa(a,1937337698)|0)==0?(AEa(a,b)|0)!=0:0){f=b;break}if((TEa(a,1634889070)|0)==0){f=AEa(a,b)|0}else{f=b}}else{f=b}}else{f=b}}while(0);i=d;return f|0}function tHa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;f=c[c[a+4>>2]>>2]|0;if((f|0)==0){g=b;i=e;return g|0}if((d|0)==1){g=dd[c[(c[a>>2]|0)+8>>2]&511](a,b)|0;i=e;return g|0}a=c[f+36>>2]|0;d=f+40|0;h=0;while(1){if((h|0)>=(a|0)){break}j=c[(c[(c[d>>2]|0)+(h<<2)>>2]|0)+4>>2]|0;if((j|0)==1970170211){h=h+1|0}else{k=7;break}}if((k|0)==7){TEa(f,j)|0}g=AEa(f,b)|0;i=e;return g|0}function uHa(a){a=a|0;var b=0,d=0;b=i;d=u2a(8)|0;c[d>>2]=823384;c[d+4>>2]=a;i=b;return d|0}function vHa(a){a=a|0;return}function wHa(a){a=a|0;var b=0;b=i;v2a(a);i=b;return}function xHa(a,b,c){a=a|0;b=b|0;c=c|0;b=i;Qna(a,c);i=b;return}function yHa(a,b){a=a|0;b=b|0;return b|0}function zHa(a){a=a|0;return 1}function AHa(a){a=a|0;var b=0,d=0;b=i;d=a+0|0;a=d+36|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(a|0));i=b;return}function BHa(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a>>2]|0;if((d|0)==2){e=0;do{f=c[a+(e<<2)+4>>2]|0;if((f|0)!=0){GEa(f)}e=e+1|0}while((e|0)!=16)}else if((d|0)==1?(d=c[a+12>>2]|0,(d|0)!=0):0){GEa(d)}v2a(c[a+68>>2]|0);i=b;return}function CHa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=c[a>>2]|0;if((e|0)==2){f=0;while(1){g=f+1|0;if((c[a+(f<<2)+4>>2]|0)==(b|0)){h=f;break}if((g|0)<16){f=g}else{h=g;break}}if((h|0)==16){j=0}else{k=6}}else if((e|0)==1?(c[a+12>>2]|0)!=(b|0):0){j=0}else{k=6}if((k|0)==6){k=a+72|0;b=(c[k>>2]|0)+ -1|0;c[k>>2]=b;if((b|0)==0){if((a|0)==0){j=1}else{BHa(a);v2a(a);j=1}}else{j=0}}i=d;return j|0}function DHa(a){a=a|0;var b=0,d=0;b=i;Lma(a+8|0,10);d=u2a(136)|0;RHa(d);c[a>>2]=d;if((d|0)==0){i=b;return}c[d+4>>2]=a;c[a+4>>2]=0;f3a(a+32|0,0,132)|0;i=b;return}function EHa(a,b){a=a|0;b=b|0;var c=0;c=i;FHa(a,b);i=c;return}function FHa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)==0){i=d;return}e=a+72|0;a=c[e>>2]|0;if((a|0)!=0){Rc[c[c[a>>2]>>2]&1023](a)}c[e>>2]=b;i=d;return}function GHa(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0;k=i;l=a+32|0;if((c[l>>2]|0)==0){PJa(l)}l=c[a+4>>2]|0;if((l|0)!=0?(m=nd[c[(c[l>>2]|0)+8>>2]&3](l,b,d,e,f,g,h,j)|0,(m|0)!=0):0){n=m;i=k;return n|0}m=c[a>>2]|0;n=nd[c[(c[m>>2]|0)+8>>2]&3](m,b,d,e,f,g,h,j)|0;i=k;return n|0}function HHa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;i=i+32|0;h=g+16|0;j=g+12|0;k=g+8|0;l=g;hka(h,b);tka(h,44);bka(j,d,0);uka(h,c[j>>2]|0);dka(j);tka(h,(e|0)!=0?73:78);c[k>>2]=0;oe(l,h);Wma(a+8|0,l,k)|0;l=c[k>>2]|0;if((l|0)==0){m=0;dka(h);i=g;return m|0}c[f>>2]=c[l+68>>2];f=l+72|0;c[f>>2]=(c[f>>2]|0)+1;m=c[l+12>>2]|0;dka(h);i=g;return m|0}function IHa(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;j=i;i=i+16|0;k=j+12|0;l=j+8|0;m=j;n=u2a(76)|0;c[n>>2]=0;o=n+68|0;c[o>>2]=0;p=n+72|0;c[p>>2]=0;if((n|0)==0){q=0;i=j;return q|0}c[n>>2]=1;r=n+12|0;c[r>>2]=0;c[n+8>>2]=d;c[n+4>>2]=e;c[o>>2]=f;c[p>>2]=1;p=a+32|0;o=c[p>>2]|0;if((o|0)==0){PJa(p);s=c[p>>2]|0}else{s=o}if((CEa(s,f,g,h,r)|0)!=0){BHa(n);v2a(n);q=0;i=j;return q|0}if((SEa(c[r>>2]|0,64)|0)==0){hka(k,b);tka(k,44);bka(l,d,0);uka(k,c[l>>2]|0);dka(l);tka(k,(e|0)!=0?73:78);oe(m,k);c[(Qma(a+8|0,m)|0)>>2]=n;m=c[r>>2]|0;dka(k);q=m;i=j;return q|0}else{BHa(n);v2a(n);q=0;i=j;return q|0}return 0}function JHa(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a>>2]|0;e=M1a((d|0)==0?1305928:d+12|0,823416,89,8,281)|0;if((e|0)==0){f=-1;i=b;return f|0}d=e+4|0;mka(a,c[824128+(c[d>>2]<<2)>>2]|0);f=c[d>>2]|0;i=b;return f|0}function KHa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=oma(a,c[b>>2]|0)|0;i=d;return e|0}function LHa(a,b){a=a|0;b=b|0;var c=0,e=0,f=0,g=0,h=0,j=0;c=i;e=(d[a+9>>0]|0)<<16|(d[a+8>>0]|0)<<24|(d[a+10>>0]|0)<<8|(d[a+11>>0]|0);if((e|0)==0){f=0;i=c;return f|0}else{g=0}while(1){h=g<<2;if(((d[a+(h+13)>>0]|0)<<16|(d[a+(h+12)>>0]|0)<<24|(d[a+(h+14)>>0]|0)<<8|(d[a+(h+15)>>0]|0)|0)==(b|0)){f=g;j=4;break}g=g+1|0;if(!(g>>>0<e>>>0)){f=0;j=4;break}}if((j|0)==4){i=c;return f|0}return 0}function MHa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;i=i+32|0;h=g;j=g+20|0;k=g+16|0;l=g+8|0;c[j>>2]=0;c[h>>2]=b;c[h+4>>2]=d;Jka(j,824184,h);c[k>>2]=0;oe(l,j);Wma(a+8|0,l,k)|0;l=c[k>>2]|0;if((l|0)==0){m=0;dka(j);i=g;return m|0}k=l+68|0;c[f>>2]=c[k>>2];f=l+72|0;c[f>>2]=(c[f>>2]|0)+1;f=c[k>>2]|0;k=LHa(f,e)|0;e=l+(k<<2)+4|0;l=c[e>>2]|0;if((l|0)!=0){m=l;dka(j);i=g;return m|0}l=NHa(a,f,b,k)|0;c[e>>2]=l;m=l;dka(j);i=g;return m|0}function NHa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;i=i+16|0;g=f;h=a+32|0;a=c[h>>2]|0;if((a|0)==0){PJa(h);j=c[h>>2]|0}else{j=a}c[g>>2]=0;if((CEa(j,b,d,e,g)|0)==0){e=(SEa(c[g>>2]|0,64)|0)==0;i=f;return(e?c[g>>2]|0:0)|0}else{i=f;return 0}return 0}function OHa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;g=i;i=i+32|0;h=g;j=g+16|0;k=g+8|0;c[j>>2]=0;c[h>>2]=b;c[h+4>>2]=d;Jka(j,824184,h);l=u2a(76)|0;c[l>>2]=0;m=l+68|0;c[m>>2]=0;n=l+72|0;c[n>>2]=0;if((l|0)==0){o=0;dka(j);i=g;return o|0}c[l>>2]=2;c[m>>2]=e;e=l+4|0;p=e+0|0;q=p+64|0;do{c[p>>2]=0;p=p+4|0}while((p|0)<(q|0));c[n>>2]=1;c[h>>2]=b;c[h+4>>2]=d;Jka(j,824184,h);oe(k,j);c[(Qma(a+8|0,k)|0)>>2]=l;l=c[m>>2]|0;m=LHa(l,f)|0;f=NHa(a,l,b,m)|0;c[e+(m<<2)>>2]=f;o=f;dka(j);i=g;return o|0}function PHa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+32|0;e=d+16|0;f=d+12|0;g=d+8|0;h=d;if((b|0)==0){i=d;return}j=a+8|0;k=(c[a+16>>2]|0)==0;c[e>>2]=k?0:-1;if(k){i=d;return}do{c[f>>2]=0;Oma(j,e,f,g);if((CHa(c[g>>2]|0,b)|0)!=0){oe(h,f);Xma(j,h)}dka(f)}while((c[e>>2]|0)!=0);i=d;return}function QHa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;do{if(!(d>>>0>15)){if((d|0)<=13){c[a>>2]=c[824192+(d<<3)>>2];c[b>>2]=c[824196+(d<<3)>>2];f=1;break}if((d|0)==14){c[a>>2]=1143168;c[b>>2]=113417;f=1;break}else{c[a>>2]=995408;c[b>>2]=66919;f=1;break}}else{f=0}}while(0);i=e;return f|0}function RHa(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=824312;Ija(a+8|0,4);c[a+36>>2]=0;Ija(a+40|0,4);Ija(a+56|0,4);c[a+32>>2]=0;c[a+28>>2]=0;c[a+24>>2]=0;d=a+72|0;a=d+64|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(a|0));i=b;return}function SHa(a){a=a|0;var b=0;b=i;THa(a);v2a(a);i=b;return}function THa(a){a=a|0;var b=0,d=0,e=0;b=i;c[a>>2]=824312;d=0;do{e=c[a+(d<<2)+76>>2]|0;if((e|0)!=0){GEa(e)}d=d+1|0}while((d|0)<14);d=c[a+28>>2]|0;if((d|0)!=0){GEa(d)}d=c[a+32>>2]|0;if((d|0)!=0){GEa(d)}d=c[a+72>>2]|0;if((d|0)!=0){Rc[c[c[d>>2]>>2]&1023](d)}FG(a+56|0);Jja(c[a+40>>2]|0);dka(a+36|0);FG(a+8|0);i=b;return}function UHa(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;g=f;h=(d[b+2>>0]|0)<<8|(d[b+3>>0]|0);j=(d[b+4>>0]|0)<<8|(d[b+5>>0]|0);a:do{if((h|0)!=0){k=0;l=b+6|0;while(1){if((((d[l+6>>0]|0)<<8|(d[l+7>>0]|0)|0)==(e|0)?((d[l>>0]|0)<<8|(d[l+1>>0]|0)|0)==1:0)?((d[l+2>>0]|0)<<8|(d[l+3>>0]|0)|0)==0:0){break}k=k+1|0;if((k|0)>=(h|0)){break a}else{l=l+12|0}}k=(d[l+8>>0]|0)<<8|(d[l+9>>0]|0);c[g>>2]=b+(((d[l+10>>0]|0)<<8|(d[l+11>>0]|0))+j);c[g+4>>2]=k;jka(a,g);i=f;return}}while(0);c[a>>2]=0;i=f;return}function VHa(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0;h=i;a:do{if((f|0)!=0){j=0;while(1){k=j<<4;j=j+1|0;if(((d[e+(k|1)>>0]|0)<<16|(d[e+k>>0]|0)<<24|(d[e+(k|2)>>0]|0)<<8|(d[e+(k|3)>>0]|0)|0)==(g|0)){break}if(!(j>>>0<f>>>0)){break a}}j=(d[e+(k|13)>>0]|0)<<16|(d[e+(k|12)>>0]|0)<<24|(d[e+(k|14)>>0]|0)<<8|(d[e+(k|15)>>0]|0);_b(b|0,(d[e+(k|9)>>0]|0)<<16|(d[e+(k|8)>>0]|0)<<24|(d[e+(k|10)>>0]|0)<<8|(d[e+(k|11)>>0]|0)|0,0)|0;WHa(a,b,j);i=h;return}}while(0);c[a>>2]=0;i=h;return}function WHa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;c[f>>2]=0;if((Ya(Bka(f,d)|0,d|0,1,b|0)|0)==0){c[a>>2]=0;dka(f);i=e;return}else{Aka(f,d);hka(a,f);dka(f);i=e;return}}function XHa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+16|0;f=e+4|0;g=e;h=b+72|0;b=c[h>>2]|0;if((b|0)==0){c[f>>2]=0;dka(f);j=c[h>>2]|0}else{j=b}c[a>>2]=0;b=ed[c[(c[j>>2]|0)+16>>2]&127](j,d,1851878757,0,0)|0;if((b|0)==0){i=e;return}j=w2a(b,1)|0;if((j|0)==0){i=e;return}f=c[h>>2]|0;ed[c[(c[f>>2]|0)+16>>2]&127](f,d,1851878757,j,b)|0;UHa(g,j,6);ika(a,g);dka(g);v2a(j);i=e;return}function YHa(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=i;i=i+16|0;g=f+4|0;h=f;j=a+72|0;if((c[j>>2]|0)==0){i=f;return}k=a+40|0;if((ZHa(k,e)|0)==-1){ax(k,e);AG(a+56|0,b)}e=a+36|0;k=c[b>>2]|0;if(wka(k,e)|0){i=f;return}l=(k|0)==0;m=l?0:k+12|0;n=k+4|0;o=0;while(1){if(l){p=0}else{p=c[n>>2]|0}if((o|0)>=(p|0)){break}if((d[m+o>>0]|0)>128){q=11;break}o=o+1|0}if((q|0)==11){q=c[j>>2]|0;o=dd[c[(c[q>>2]|0)+12>>2]&511](q,l?1305928:k+12|0)|0;if((o|0)==0){k=c[j>>2]|0;l=c[b>>2]|0;q=Ec[c[(c[k>>2]|0)+8>>2]&15](k,0,0,1,0,(l|0)==0?1305928:l+12|0,g)|0;if((q|0)==0){i=f;return}else{r=q}}else{r=o}XHa(h,a,r);o=c[h>>2]|0;if((o|0)!=0?(c[o+4>>2]|0)!=0:0){Kka(h);AG(a+8|0,h)}o=c[j>>2]|0;Ic[c[(c[o>>2]|0)+32>>2]&511](o,r);dka(h)}AG(a+8|0,b);ika(e,b);i=f;return}function ZHa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=c[a+4>>2]|0;a:do{if((e|0)>0){f=c[a>>2]|0;g=0;while(1){if((c[f+(g<<2)>>2]|0)==(b|0)){h=g;break a}g=g+1|0;if((g|0)>=(e|0)){h=-1;break}}}else{h=-1}}while(0);i=d;return h|0}function _Ha(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+72>>2]|0;if((d|0)==0){i=b;return}e=a+24|0;if((c[e>>2]|0)!=0){i=b;return}dd[c[(c[d>>2]|0)+4>>2]&511](d,a)|0;c[e>>2]=1;i=b;return}function $Ha(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;i=i+16|0;g=f+4|0;h=f;_Ha(d);j=d+8|0;k=c[d+12>>2]|0;while(1){l=k+ -1|0;if((k|0)<=0){break}d=c[(Mh(j,l)|0)>>2]|0;aIa(g,(d|0)==0?1305928:d+12|0);d=wka(c[g>>2]|0,e)|0;dka(g);if(d){m=4;break}else{k=l}}if((m|0)==4?(k|0)>=1:0){hka(h,Mh(j,l)|0);l=c[h>>2]|0;if((l|0)!=0?(a[l+12>>0]|0)==32:0){ika(h,Mh(j,k)|0)}hka(b,h);dka(h);i=f;return}c[b>>2]=0;i=f;return}function aIa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;eka(a,b,-1);Tka(a,32);Tka(a,45);Tka(a,44);b=Nka(c[a>>2]|0)|0;if((b|0)<=0){Rka(a);i=d;return}Mka(e,a,b);ika(a,e);dka(e);Rka(a);i=d;return}function bIa(c){c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;e=30;f=0;while(1){g=(e+f|0)/2|0;h=b[824330+(g<<2)>>1]|0;if(h<<16>>16==c<<16>>16){break}j=(h&65535)>(c&65535);f=j?f:g+1|0;e=j?g+ -1|0:e;if((f|0)>(e|0)){k=1;l=5;break}}if((l|0)==5){i=d;return k|0}k=a[824328+(g<<2)>>0]|0;i=d;return k|0}function cIa(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0;h=i;i=i+16|0;j=h+4|0;k=h;if((d|0)<12){l=a+(d<<2)+76|0;m=c[l>>2]|0;if((m|0)!=0){n=m;i=h;return n|0}c[j>>2]=0;c[k>>2]=0;if((QHa(j,k,d)|0)!=0){d=NHa(c[a+4>>2]|0,c[j>>2]|0,c[k>>2]|0,0)|0;c[l>>2]=d;n=d;i=h;return n|0}}d=b+12|0;c[d>>2]=c[d>>2]|1;c[b+20>>2]=e;if((f|0)!=0){c[b+16>>2]=f}if((g&16|0)==0){mka(b+4|0,824472);g=a+28|0;f=c[g>>2]|0;if((f|0)!=0){n=f;i=h;return n|0}f=NHa(c[a+4>>2]|0,995408,66919,0)|0;c[g>>2]=f;n=f;i=h;return n|0}else{f=b+16|0;c[f>>2]=(c[f>>2]<<2|0)/5|0;mka(b+4|0,824456);b=a+32|0;f=c[b>>2]|0;if((f|0)!=0){n=f;i=h;return n|0}f=NHa(c[a+4>>2]|0,1143168,113417,0)|0;c[b>>2]=f;n=f;i=h;return n|0}return 0}function dIa(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;i=i+32|0;h=g+16|0;j=g+8|0;k=g;gla(h);if((e|0)!=0&(e|0)>(f|0)){l=f}else{f=c[h+4>>2]|0;pla(j,f,c[h+8>>2]|0);jka(b,j);m=f;ila(m);i=g;return}do{f=a[d+l>>0]|0;if(f<<24>>24==44){break}vF(h,f);l=l+1|0}while((l|0)<(e|0));e=c[h+4>>2]|0;pla(k,e,c[h+8>>2]|0);jka(b,k);m=e;ila(m);i=g;return}function eIa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;i=i+32|0;e=d+24|0;f=d+16|0;g=d+8|0;h=d;j=c[a>>2]|0;if((j|0)==0){k=-1;i=d;return k|0}l=c[j+4>>2]|0;if((l|0)==0){k=-1;i=d;return k|0}j=(b|0)==0;b=f+4|0;m=h+4|0;n=4;a:while(1){o=824488+(n<<3)|0;do{if((o|0)!=0?(p=c[824492+(n<<3)>>2]|0,(p|0)<=(l|0)):0){if(j){Mka(e,a,p);pe(f,c[o>>2]|0);q=(Zka(c[e>>2]|0,c[f>>2]|0,c[b>>2]|0)|0)==0;dka(e);if(q){k=n;r=10;break a}else{break}}else{Lka(g,a,p);pe(h,c[o>>2]|0);p=(Zka(c[g>>2]|0,c[h>>2]|0,c[m>>2]|0)|0)==0;dka(g);if(p){k=n;r=10;break a}else{break}}}}while(0);if((n|0)>0){n=n+ -1|0}else{k=-1;r=10;break}}if((r|0)==10){i=d;return k|0}return 0}function fIa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;c[e>>2]=824528;c[e+4>>2]=9;if(!(vka(a,e)|0)){f=0;i=d;return f|0}c[b>>2]=c[b>>2]&-17;f=1;i=d;return f|0}function gIa(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0;l=i;i=i+1168|0;m=l+144|0;n=l+136|0;o=l+128|0;p=l+120|0;q=l+116|0;r=l+112|0;s=l+104|0;t=l+96|0;u=l+92|0;v=l+88|0;w=l+84|0;x=l+80|0;y=l+72|0;z=l+64|0;A=l+60|0;B=l+56|0;C=l+52|0;D=l+48|0;E=l+44|0;F=l+40|0;G=l+36|0;H=l+32|0;I=l+28|0;J=l+24|0;K=l+20|0;L=l+16|0;M=l+12|0;N=l+8|0;O=l+4|0;P=l;Q=(f&524288|0)==0;S=Q?0:h;h=Q?400:g;hka(q,d);Tka(q,32);g=(e|0)!=0;if((g?(Q=c[d>>2]|0,(Q|0)!=0):0)?(a[Q+12>>0]|0)==64:0){Fka(r,d,1);ika(q,r);dka(r)}JHa(q)|0;c[s>>2]=1290504;c[s+4>>2]=6;r=c[q>>2]|0;if(!(g|(vka(r,s)|0)^1)){mka(k+4|0,824544);c[k+8>>2]=2;s=k+12|0;c[s>>2]=c[s>>2]|128;s=b+124|0;g=c[s>>2]|0;if((g|0)!=0){T=g;dka(q);i=l;return T|0}g=NHa(c[b+4>>2]|0,1256592,16729,0)|0;c[s>>2]=g;T=g;dka(q);i=l;return T|0}c[t>>2]=1290512;c[t+4>>2]=12;if(vka(r,t)|0){mka(k+4|0,824560);c[k+8>>2]=2;t=k+12|0;c[t>>2]=c[t>>2]|128;t=b+128|0;g=c[t>>2]|0;if((g|0)!=0){T=g;dka(q);i=l;return T|0}g=NHa(c[b+4>>2]|0,828184,29513,0)|0;c[t>>2]=g;T=g;dka(q);i=l;return T|0}c[u>>2]=0;c[v>>2]=0;g=Qka(r,824576,1)|0;if((g|0)>-1){Mka(w,q,g);ika(u,w);dka(w);JHa(u)|0;Fka(x,q,g+1|0);ika(v,x);dka(x);U=1}else{ika(u,q);U=0}x=0;while(1){V=c[824128+(x<<2)>>2]|0;pe(y,V);W=c[u>>2]|0;X=x+1|0;if(vka(W,y)|0){Y=17;break}if((X|0)<12){x=X}else{Y=21;break}}if((Y|0)==17){c[z>>2]=0;mka(u,V);V=(x|0)%4|0;y=(V+ -1|0)>>>0<2&1;g=(V+1|0)>>>0>2?y|2:y;if((x|0)<4){c[z>>2]=1;Z=1}else{Z=0}if((x|0)>7){y=Z|16;c[z>>2]=y;_=y;$=0;aa=x;ba=g}else{_=Z;$=0;aa=x;ba=g}}else if((Y|0)==21){c[z>>2]=0;if((U|0)==0?(g=Oka(W)|0,(g|0)>-1):0){Fka(A,u,g+1|0);ika(v,A);dka(A);Mka(B,u,g);ika(u,B);dka(B);ca=1;da=0}else{if((W|0)==0){ea=0}else{ea=c[W+4>>2]|0}W=eIa(u,1)|0;if((W|0)>-1){Mka(C,u,ea-(c[824492+(W<<3)>>2]|0)|0);ika(u,C);dka(C);C=(W|0)==0&1;ca=0;da=(W|0)==2?3:(W|0)==1?C|2:C}else{ca=0;da=0}}if((f&2|0)==0){fa=0}else{c[z>>2]=16;fa=16}if((f&8|0)==0){ga=fa}else{C=fa|64;c[z>>2]=C;ga=C}if((f&1|0)==0){_=ga;$=ca;aa=X;ba=da}else{C=ga|1;c[z>>2]=C;_=C;$=ca;aa=X;ba=da}}da=c[v>>2]|0;if((da|0)!=0?(X=c[da+4>>2]|0,(X|0)!=0):0){ca=da+12|0;c[D>>2]=0;a:do{if((X|0)>0){da=1;C=0;ga=0;fa=ba;while(1){dIa(E,ca,X,ga);ika(D,E);dka(E);W=eIa(D,0)|0;ea=(ga|0)!=0;if(ea&(C|0)==0){ha=0;Y=39;break}if((W|0)<0&(ea^1)){ha=C;Y=39;break}ia=(W|0)>-1?1:C;if((W|0)==0){ja=0;ka=((fa&1|0)==0?1:4)|fa}else if((W|0)==2){ja=0;ka=((fa&1|0)==0?3:6)|fa}else if((W|0)==1){break}else{ja=da;ka=fa}W=c[D>>2]|0;if((W|0)==0){la=1}else{la=(c[W+4>>2]|0)+1|0}ga=la+ga|0;if((ga|0)>=(X|0)){ma=ia;na=aa;oa=ka;break a}else{da=ja;C=ia;fa=ka}}if((Y|0)==39){ika(u,q);ma=ha;na=12;oa=fa;break}if((da|0)==0){ika(u,q);ma=ia;na=12;oa=fa;break}else{ma=ia;na=aa;oa=fa|2;break}}else{ma=0;na=aa;oa=ba}}while(0);dka(D);pa=ma;qa=na;ra=oa}else{pa=0;qa=aa;ra=ba}ba=(h|0)!=0?h:400;h=(ra|0)!=0;if(h){if((ra&4|0)==0){sa=(ra&1|0)!=0?700:400}else{sa=900}}else{sa=ba}aa=ra&2;oa=(aa|0)==0;na=aa>>>1;c[F>>2]=0;c[G>>2]=0;if((j|0)==0){if((qa|0)==12?(f&4|0)!=0:0){c[G>>2]=2;ta=0}else{ta=0}}else{aa=(bIa(j&65535)|0)&255;c[G>>2]=aa;if((aa|0)==128|(aa|0)==129|(aa|0)==134|(aa|0)==136){ta=1}else{ta=0}}aa=b+72|0;if((c[aa>>2]|0)==0){j=k+12|0;c[j>>2]=c[j>>2]|128;ua=cIa(b,k,qa,S,ba,_)|0}else{hka(I,u);pe(m,824696);_=c[I>>2]|0;do{if(!((Qka(_,c[m>>2]|0,c[m+4>>2]|0)|0)>-1)){j=M1a((_|0)==0?1305928:_+12|0,824800,3,8,282)|0;if((j|0)==0){hka(H,I);break}else{eka(H,c[j+4>>2]|0,-1);break}}else{do{if((ra&1|0)==0){pe(n,824720);if((Qka(_,c[n>>2]|0,c[n+4>>2]|0)|0)>-1){mka(I,824728);break}pe(o,824744);if((Qka(_,c[o>>2]|0,c[o+4>>2]|0)|0)>-1){mka(I,824752);break}pe(p,824768);if((Qka(_,c[p>>2]|0,c[p+4>>2]|0)|0)>-1){mka(I,824784)}}else{mka(I,824704)}}while(0);hka(H,I)}}while(0);ika(u,H);dka(H);dka(I);I=c[u>>2]|0;aIa(K,(I|0)==0?1305928:I+12|0);$Ha(J,b,K);dka(K);K=c[J>>2]|0;if((K|0)!=0?(c[K+4>>2]|0)!=0:0){va=K;wa=(K|0)==0;Y=81}else{if((U|0)==0&((wka(c[u>>2]|0,q)|0)^1)?($|0)==0|(pa|0)==0:0){pa=c[q>>2]|0;aIa(M,(pa|0)==0?1305928:pa+12|0);$Ha(L,b,M);ika(J,L);dka(L);dka(M);xa=c[J>>2]|0}else{xa=K}K=(xa|0)==0;if(K){ya=1;za=xa;Aa=K}else{va=xa;wa=K;Y=81}}if((Y|0)==81){ya=(c[va+4>>2]|0)==0;za=va;Aa=wa}do{if(ya&(qa|0)>11){if((ta|0)==0){hka(N,u);wa=fIa(c[N>>2]|0,z)|0;dka(N);if((wa|0)!=0){Ba=S;Ca=sa;Da=na;break}Ba=S;Ca=ba;Da=(S|0)!=0&1;break}else{c[k+24>>2]=1;c[k+28>>2]=h?sa:400;if(oa){Ba=S;Ca=sa;Da=na;break}c[k+32>>2]=1;Ba=S;Ca=sa;Da=na;break}}else{if((ra&4|0)==0){Ba=0;Ca=(ra&1|0)!=0?700:400;Da=na}else{Ba=0;Ca=900;Da=na}}}while(0);if(Aa){Ea=0}else{Ea=(c[za+4>>2]|0)!=0}na=(qa|0)<12;do{if(Ea|na){sa=k+12|0;c[sa>>2]=c[sa>>2]|64;if(!Aa?(c[za+4>>2]|0)!=0:0){ika(u,J)}if(na){if(h?(qa&3|0)==0:0){S=ra&3;oa=((S|0)==1&1)+qa|0;N=(S|0)==2?oa+3|0:oa;Fa=(S|0)==3?N+2|0:N}else{Fa=qa}N=c[b+4>>2]|0;S=c[N+(Fa<<3)+36>>2]|0;if((S|0)!=0){oa=b+(Fa<<2)+76|0;ya=c[oa>>2]|0;if((ya|0)!=0){Ga=ya;break}ya=NHa(N,S,c[N+(Fa<<3)+40>>2]|0,0)|0;c[oa>>2]=ya;if((ya|0)!=0){Ga=ya;break}}else{mka(u,c[824128+(Fa<<2)>>2]|0)}c[sa>>2]=c[sa>>2]|128;Ha=Da;Ia=Fa;Y=106}else{Ha=Da;Ia=qa;Y=106}}else{Ha=(f&64|0)==0?Da:1;Ia=qa;Y=106}}while(0);b:do{if((Y|0)==106){qa=c[J>>2]|0;Da=(qa|0)==0;if(Da){Ja=1}else{Ja=(c[qa+4>>2]|0)==0}c[F>>2]=Ja&1^1;Fa=c[aa>>2]|0;ra=c[z>>2]|0;h=c[u>>2]|0;na=Ec[c[(c[Fa>>2]|0)+8>>2]&15](Fa,Ca,Ha,c[G>>2]|0,ra,(h|0)==0?1305928:h+12|0,F)|0;if((c[F>>2]|0)!=0){h=k+12|0;c[h>>2]=c[h>>2]|64}c:do{if((na|0)==0){if((ta|0)==0){Ka=Ca;La=Ha}else{Ka=ba;La=(Ba|0)!=0&1}do{if(!Da){if((c[qa+4>>2]|0)==0){break}h=c[aa>>2]|0;Fa=dd[c[(c[h>>2]|0)+12>>2]&511](h,qa+12|0)|0;if((Fa|0)!=0){Ma=Ka;Na=La;Oa=Fa;break c}Ga=cIa(b,k,Ia,Ba,ba,ra)|0;break b}}while(0);Fa=c[G>>2]|0;if((Fa|0)==2){h=k+12|0;c[h>>2]=c[h>>2]|32;Ga=nd[c[(c[b>>2]|0)+8>>2]&3](b,u,e,f&-5,Ka,Ba,0,k)|0;break b}else if((Fa|0)!=0){h=ZHa(b+40|0,Fa)|0;if((h|0)<0){Ga=cIa(b,k,Ia,Ba,ba,ra)|0;break b}else{Fa=c[aa>>2]|0;za=c[(c[Fa>>2]|0)+12>>2]|0;Aa=c[(Mh(b+56|0,h)|0)>>2]|0;Ma=Ka;Na=La;Oa=dd[za&511](Fa,(Aa|0)==0?1305928:Aa+12|0)|0;break}}else{Aa=k+12|0;c[Aa>>2]=c[Aa>>2]|128;Ga=cIa(b,k,Ia,Ba,ba,ra)|0;break b}}else{Ma=Ca;Na=Ha;Oa=na}}while(0);na=c[aa>>2]|0;c[k>>2]=dd[c[(c[na>>2]|0)+36>>2]&511](na,Oa)|0;if((Oa|0)==0){Ga=0}else{na=c[aa>>2]|0;Qc[c[(c[na>>2]|0)+20>>2]&255](na,Oa,q)|0;if((c[G>>2]|0)==1){na=c[aa>>2]|0;Qc[c[(c[na>>2]|0)+24>>2]&255](na,Oa,G)|0}na=c[aa>>2]|0;ra=ed[c[(c[na>>2]|0)+16>>2]&127](na,Oa,1953784678,0,0)|0;na=c[aa>>2]|0;qa=ed[c[(c[na>>2]|0)+16>>2]&127](na,Oa,0,0,0)|0;if((qa|ra|0)==0){na=c[aa>>2]|0;Ic[c[(c[na>>2]|0)+32>>2]&511](na,Oa);Ga=0;break}do{if((ra|0)==0){na=b+4|0;Da=HHa(c[na>>2]|0,q,Ma,Na,P)|0;if((Da|0)!=0){Pa=Da;break}Da=w2a(qa,1)|0;c[P>>2]=Da;Aa=c[aa>>2]|0;if((Da|0)==0){Ic[c[(c[Aa>>2]|0)+32>>2]&511](Aa,Oa);Ga=0;break b}else{ed[c[(c[Aa>>2]|0)+16>>2]&127](Aa,Oa,0,Da,qa)|0;Aa=c[na>>2]|0;na=c[aa>>2]|0;Qa=IHa(Aa,q,Ma,Na,Da,qa,dd[c[(c[na>>2]|0)+28>>2]&511](na,Oa)|0)|0;Y=138;break}}else{na=c[aa>>2]|0;ed[c[(c[na>>2]|0)+16>>2]&127](na,Oa,1953784678,m,1024)|0;na=0;Da=0;do{na=(c[m+(Da<<2)>>2]|0)+na|0;Da=Da+1|0}while((Da|0)!=256);Da=b+4|0;Aa=ra-qa|0;Fa=MHa(c[Da>>2]|0,ra,na,Aa,O)|0;if((Fa|0)!=0){Pa=Fa;break}Fa=w2a(ra,1)|0;c[O>>2]=Fa;if((Fa|0)==0){Y=139;break}za=c[aa>>2]|0;ed[c[(c[za>>2]|0)+16>>2]&127](za,Oa,1953784678,Fa,ra)|0;Qa=OHa(c[Da>>2]|0,ra,na,Fa,Aa)|0;Y=138}}while(0);if((Y|0)==138){if((Qa|0)==0){Y=139}else{Pa=Qa}}if((Y|0)==139){ra=c[aa>>2]|0;Ic[c[(c[ra>>2]|0)+32>>2]&511](ra,Oa);Ga=0;break}ika(k+4|0,q);c[k+8>>2]=c[G>>2];ra=Pa+12|0;if(!((c[ra>>2]&2|0)==0?(Ma|0)==400:(Ma|0)==700)){c[k+16>>2]=Ma}do{if((Na|0)!=0){if((c[ra>>2]&1|0)!=0){break}if((Ba|0)==0){Ra=-12}else{qa=(R(Ba|0)|0)<5;Ra=qa?0:Ba}c[k+20>>2]=Ra}}while(0);ra=c[aa>>2]|0;Ic[c[(c[ra>>2]|0)+32>>2]&511](ra,Oa);Ga=Pa}}}while(0);dka(J);ua=Ga}dka(v);dka(u);T=ua;dka(q);i=l;return T|0}function hIa(a){a=a|0;var b=0;b=i;c[a>>2]=824592;Lma(a+4|0,10);Ija(a+28|0,4);i=b;return}function iIa(a){a=a|0;var b=0;b=i;jIa(a);v2a(a);i=b;return}function jIa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+16|0;d=b+8|0;e=b+4|0;f=b;c[a>>2]=824592;g=a+4|0;h=(c[a+12>>2]|0)==0;c[d>>2]=h?0:-1;if(!h){do{c[e>>2]=0;Oma(g,d,e,f);h=c[f>>2]|0;if((h|0)!=0){yIa(h);v2a(h)}dka(e)}while((c[d>>2]|0)!=0)}FG(a+28|0);Nma(g);i=b;return}function kIa(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;i=i+16|0;d=c;jka(d,b);AG(a+28|0,d);dka(d);i=c;return}function lIa(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}Rc[c[(c[a>>2]|0)+44>>2]&1023](a);i=b;return}function mIa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;c[a+44>>2]=b;b=a+32|0;if((c[b>>2]|0)<=0){i=d;return 1}e=a+28|0;f=0;do{nIa(a,Mh(e,f)|0);f=f+1|0}while((f|0)<(c[b>>2]|0));i=d;return 1}function nIa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+16|0;e=d+12|0;f=d+8|0;g=d+4|0;h=d;j=c[b>>2]|0;k=Ina((j|0)==0?1305928:j+12|0)|0;if((k|0)==0){i=d;return}c[e>>2]=0;while(1){if((Jna(k,e,f)|0)==0){break}j=(c[f>>2]|0)==0;if(!j){if(ah(e,1307824)|0){continue}if(ah(e,824640)|0){continue}}else{Lka(g,e,4);Ska(g);if((yl(g,824648)|0?yl(g,824656)|0:0)?yl(g,824664)|0:0){dka(g);continue}dka(g)}hka(h,b);rka(h,1305904);uka(h,c[e>>2]|0);if(j){oIa(a,h)}else{nIa(a,h)}dka(h)}Kna(k);dka(e);i=d;return}function oIa(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+16|0;f=e;g=c[b>>2]|0;h=gc(((g|0)==0?1305928:g+12|0)|0,824672)|0;if((h|0)==0){i=e;return}_b(h|0,0,2)|0;g=ob(h|0)|0;_b(h|0,0,0)|0;Ya(f|0,12,1,h|0)|0;if(((d[f+1>>0]|0)<<16|(d[f>>0]|0)<<24|(d[f+2>>0]|0)<<8|(d[f+3>>0]|0)|0)==1953784678){j=(d[f+9>>0]|0)<<16|(d[f+8>>0]|0)<<24|(d[f+10>>0]|0)<<8|(d[f+11>>0]|0);f=j<<2;k=w2a(f,1)|0;if((k|0)==0){ac(h|0)|0;i=e;return}Ya(k|0,f|0,1,h|0)|0;if((j|0)!=0){f=0;do{l=f<<2;pIa(a,b,h,g,(d[k+(l|1)>>0]|0)<<16|(d[k+l>>0]|0)<<24|(d[k+(l|2)>>0]|0)<<8|(d[k+(l|3)>>0]|0));f=f+1|0}while((f|0)!=(j|0))}v2a(k)}else{pIa(a,b,h,g,0)}ac(h|0)|0;i=e;return}function pIa(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;j=i;i=i+64|0;k=j+48|0;l=j+44|0;m=j+40|0;n=j+36|0;o=j+32|0;p=j+28|0;q=j+24|0;r=j+16|0;s=j+8|0;t=j;_b(f|0,h|0,0)|0;if((Ya(k|0,12,1,f|0)|0)==0){i=j;return}u=(a[k+4>>0]<<8|a[k+5>>0])&65535;WHa(l,f,u<<4);k=c[l>>2]|0;if((k|0)!=0?(c[k+4>>2]|0)!=0:0){VHa(m,f,k+12|0,u,1851878757);k=c[m>>2]|0;v=(k|0)==0?0:k+12|0;UHa(n,v,1);UHa(o,v,2);if(yl(o,1284040)|0){Jp(p,1305864,o);uka(n,c[p>>2]|0);dka(p)}p=b+4|0;oe(r,n);if((Wma(p,r,q)|0)==0?(q=u2a(32)|0,r=q+4|0,c[r>>2]=0,v=q+8|0,c[v>>2]=0,k=q+28|0,c[k>>2]=0,(q|0)!=0):0){ika(r,e);ika(v,n);ika(k,l);c[q+20>>2]=h;c[q+24>>2]=g;g=q+16|0;c[g>>2]=0;h=c[l>>2]|0;VHa(s,f,(h|0)==0?0:h+12|0,u,1330851634);u=c[s>>2]|0;if((u|0)!=0?(c[u+4>>2]|0)>85:0){h=a[u+90>>0]|0;f=d[u+91>>0]<<16;if((f&131072|0)!=0){YHa(c[b+44>>2]|0,n,128);c[g>>2]=c[g>>2]|4}if((f&262144|0)!=0){YHa(c[b+44>>2]|0,n,134);c[g>>2]=c[g>>2]|16}if((f&1048576|0)!=0){YHa(c[b+44>>2]|0,n,136);c[g>>2]=c[g>>2]|8}if((f&2621440|0)!=0){YHa(c[b+44>>2]|0,n,129);c[g>>2]=c[g>>2]|32}if(h<<24>>24<0){YHa(c[b+44>>2]|0,n,2);c[g>>2]=c[g>>2]|2}}YHa(c[b+44>>2]|0,n,0);c[g>>2]=c[g>>2]|1;g=q+12|0;c[g>>2]=0;b=c[o>>2]|0;h=(Qka(b,1284048,4)|0)>-1;c[g>>2]=h?262144:0;f=h?262144:0;if(!((Qka(b,1284064,6)|0)>-1)?!((Qka(b,824680,7)|0)>-1):0){w=f}else{b=f|64;c[g>>2]=b;w=b}if((Qka(c[n>>2]|0,824688,5)|0)>-1){c[g>>2]=w|2}oe(t,n);c[(Qma(p,t)|0)>>2]=q;dka(s)}dka(o);dka(n);dka(m)}dka(l);i=j;return}function qIa(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return 0}function rIa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d+8|0;f=d;pe(f,b);b=(Wma(a+4|0,f,e)|0)==0;i=d;return(b?0:c[e>>2]|0)|0}function sIa(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;a=i;if((b|0)==0){h=0;i=a;return h|0}if((g|0)!=0){j=c[b+4>>2]|0;k=gc(((j|0)==0?1305928:j+12|0)|0,824672)|0;if((k|0)==0){h=0;i=a;return h|0}else{l=k}}else{l=0}a:do{if((e|0)==1953784678){if((c[b+20>>2]|0)==0){m=14}else{n=c[b+24>>2]|0;o=0;m=16}}else if((e|0)==0){if((c[b+20>>2]|0)==0){n=c[b+24>>2]|0;o=0;m=16}else{m=14}}else{k=c[b+28>>2]|0;if((k|0)!=0?(j=c[k+4>>2]|0,p=(j|0)/16|0,!((j+15|0)>>>0<31)):0){j=0;q=0;r=0;while(1){s=q<<4;if(((d[k+(s|1)+12>>0]|0)<<16|(d[k+s+12>>0]|0)<<24|(d[k+(s|2)+12>>0]|0)<<8|(d[k+(s|3)+12>>0]|0)|0)==(e|0)){t=(d[k+(s|13)+12>>0]|0)<<16|(d[k+(s|12)+12>>0]|0)<<24|(d[k+(s|14)+12>>0]|0)<<8|(d[k+(s|15)+12>>0]|0);u=(d[k+(s|9)+12>>0]|0)<<16|(d[k+(s|8)+12>>0]|0)<<24|(d[k+(s|10)+12>>0]|0)<<8|(d[k+(s|11)+12>>0]|0)}else{t=j;u=r}q=q+1|0;if((q|0)==(p|0)){n=t;o=u;m=16;break a}else{j=t;r=u}}}if((l|0)==0){h=0;i=a;return h|0}else{v=0}}}while(0);do{if((m|0)==14){if((l|0)==0){h=0;i=a;return h|0}else{v=0}}else if((m|0)==16){u=(l|0)==0;if(!((n|0)==0|n>>>0>g>>>0|u)){_b(l|0,o|0,0)|0;Ya(f|0,n|0,1,l|0)|0;v=n;break}if(u){h=n;i=a;return h|0}else{v=n}}}while(0);ac(l|0)|0;h=v;i=a;return h|0}function tIa(a,b){a=a|0;b=b|0;return}function uIa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;a=i;if((b|0)==0){d=0}else{ika(c,b+8|0);d=1}i=a;return d|0}function vIa(a,b,c){a=a|0;b=b|0;c=c|0;return 0}function wIa(a,b){a=a|0;b=b|0;return 0}function xIa(a,b){a=a|0;b=b|0;return 0}function yIa(a){a=a|0;var b=0;b=i;dka(a+28|0);dka(a+8|0);dka(a+4|0);i=b;return}function zIa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d+8|0;f=d;eka(e,a,-1);pe(f,c[b>>2]|0);if(!((Qka(c[e>>2]|0,c[f>>2]|0,c[f+4>>2]|0)|0)==-1)){g=0;dka(e);i=d;return g|0}g=oma(a,c[b>>2]|0)|0;dka(e);i=d;return g|0}function AIa(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;j=i;i=i+128|0;k=j+120|0;l=j+112|0;m=j+104|0;n=j+96|0;o=j+88|0;p=j+80|0;q=j+72|0;r=j+64|0;s=j+56|0;t=j+48|0;u=j+40|0;v=j+32|0;w=j+24|0;x=j+16|0;y=j+8|0;z=j;eka(t,g,-1);A=c[t>>2]|0;B=0;while(1){pe(u,c[826528+(B<<3)>>2]|0);C=B+1|0;if(vka(A,u)|0){D=4;break}if((C|0)<12){B=C}else{break}}if((D|0)==4){mka(t,c[826532+(B<<3)>>2]|0);c[h>>2]=1;h=c[t>>2]|0;E=dd[c[(c[a>>2]|0)+12>>2]&511](a,(h|0)==0?1305928:h+12|0)|0;dka(t);i=j;return E|0}c[v>>2]=0;a:do{if((e|0)==134){h=a+4|0;B=0;while(1){pe(x,c[826720+(B<<2)>>2]|0);B=B+1|0;if((Wma(h,x,v)|0)!=0){break}if((B|0)>=3){F=0;D=29;break a}}E=c[v>>2]|0;dka(t);i=j;return E|0}else if((e|0)==136){B=a+4|0;h=0;while(1){pe(y,c[826736+(h<<2)>>2]|0);h=h+1|0;if((Wma(B,y,v)|0)!=0){break}if((h|0)>=3){F=0;D=29;break a}}E=c[v>>2]|0;dka(t);i=j;return E|0}else if((e|0)==128){eka(k,g,-1);pe(l,827264);h=c[k>>2]|0;do{if(!((Qka(h,c[l>>2]|0,c[l+4>>2]|0)|0)>-1)?(pe(m,827272),!((Qka(h,c[m>>2]|0,c[m+4>>2]|0)|0)>-1)):0){pe(p,827312);if(!((Qka(h,c[p>>2]|0,c[p+4>>2]|0)|0)>-1)?(pe(q,827320),!((Qka(h,c[q>>2]|0,c[q+4>>2]|0)|0)>-1)):0){G=(f&16|0)==0&(b|0)>400?0:2;break}pe(r,827328);if((Qka(h,c[r>>2]|0,c[r+4>>2]|0)|0)>-1){G=2}else{pe(s,827336);G=(Qka(h,c[s>>2]|0,c[s+4>>2]|0)|0)>>>31|2}}else{D=10}}while(0);if((D|0)==10){pe(n,827288);if((Qka(h,c[n>>2]|0,c[n+4>>2]|0)|0)>-1){G=0}else{pe(o,827296);G=(Qka(h,c[o>>2]|0,c[o+4>>2]|0)|0)>>>31}}dka(k);B=a+4|0;u=0;while(1){pe(w,c[826624+(G*24|0)+(u<<2)>>2]|0);u=u+1|0;if((Wma(B,w,v)|0)!=0){break}if((u|0)>=6){F=0;D=29;break a}}E=c[v>>2]|0;dka(t);i=j;return E|0}else if((e|0)==129){pe(z,826936);if((Wma(a+4|0,z,v)|0)==0){H=0}else{E=c[v>>2]|0;dka(t);i=j;return E|0}}else{F=1;D=29}}while(0);if((D|0)==29){if((e|0)==0?(f&1|0)!=0:0){E=dd[c[(c[a>>2]|0)+12>>2]&511](a,826752)|0;dka(t);i=j;return E|0}else{H=F}}E=BIa(a,b,d,e,f,g,H)|0;dka(t);i=j;return E|0}function BIa(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;j=i;i=i+32|0;k=j+16|0;l=j+12|0;m=j+8|0;n=j;switch(e|0){case 0:{o=1;break};case 136:{o=8;break};case 129:{o=32;break};case 128:{o=4;break};case 2:{o=2;break};case 134:{o=16;break};default:{o=0}}p=a+4|0;q=(c[a+12>>2]|0)==0;c[k>>2]=q?0:-1;if(q){r=0;i=j;return r|0}q=(e|0)==1;e=(h|0)!=0;h=(b|0)>400&1;b=f&16;a=f&64;s=n+4|0;t=0;u=0;while(1){c[l>>2]=0;c[m>>2]=0;Oma(p,k,l,m);v=c[m>>2]|0;if((c[v+16>>2]&o|0)!=0|q?(pe(n,g),!(e&(Qka(c[l>>2]|0,c[n>>2]|0,c[s>>2]|0)|0)<0)):0){w=c[v+12>>2]|0;x=(w&262144|0)==(h|0)?16:0;y=(w&64|0)==(d|0)?x+16|0:x;x=(w&2|0)==(b|0)?y+16|0:y;y=(w&8|0)==(a|0)?x|8:x;x=((w^f)&1|0)==0?y+8|0:y;y=(x|0)>(t|0);z=y?x:t;A=y?v:u}else{z=t;A=u}dka(l);if((c[k>>2]|0)==0){r=A;break}else{t=z;u=A}}i=j;return r|0}function CIa(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0;a=i;i=i+32|0;b=a+24|0;d=a+16|0;e=a+8|0;f=a;g=u2a(48)|0;hIa(g);c[g>>2]=826888;if((g|0)==0){h=0;i=a;return h|0}pe(b,826768);kIa(g,b);pe(d,826792);kIa(g,d);pe(e,826824);kIa(g,e);pe(f,826856);kIa(g,f);h=g;i=a;return h|0}function DIa(a){a=a|0;var b=0,d=0;b=i;d=CIa()|0;EHa(c[a>>2]|0,d);i=b;return}function EIa(a){a=a|0;var b=0;b=i;jIa(a);i=b;return}function FIa(a){a=a|0;var b=0;b=i;jIa(a);v2a(a);i=b;return}function GIa(a,b,d){a=a|0;b=b|0;d=d|0;c[a+20>>2]=0;c[a>>2]=0;c[a+8>>2]=0;c[a+4>>2]=0;c[a+12>>2]=b;c[a+16>>2]=d;return}function HIa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=a+4|0;f=a+20|0;c[f>>2]=0;c[a>>2]=c[b>>2];a=b+4|0;c[e+0>>2]=c[a+0>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[e+12>>2]=c[a+12>>2];IIa(f,b+20|0);i=d;return}function IIa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[b>>2]|0;if((e|0)!=0){f=e+40|0;c[f>>2]=(c[f>>2]|0)+1}f=c[a>>2]|0;if((f|0)!=0?(e=f+40|0,c[e>>2]=(c[e>>2]|0)+ -1,e=c[a>>2]|0,!((c[e+40>>2]|0)>0|(e|0)==0)):0){Rc[c[(c[e>>2]|0)+4>>2]&1023](e)}c[a>>2]=c[b>>2];i=d;return}function JIa(a){a=a|0;var b=0;b=i;Fya(a+20|0);i=b;return}function KIa(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;if((d|0)==0){i=b;return}e=d+40|0;c[e>>2]=(c[e>>2]|0)+ -1;e=c[a>>2]|0;if(!((c[e+40>>2]|0)>0|(e|0)==0)){Rc[c[(c[e>>2]|0)+4>>2]&1023](e)}c[a>>2]=0;i=b;return}function LIa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+80|0;e=d+56|0;f=d+40|0;g=d+24|0;h=d+8|0;j=d;k=c[a>>2]|0;if((k|0)==1){c[g+0>>2]=c[b+0>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];l=a+4|0;c[h+0>>2]=c[l+0>>2];c[h+4>>2]=c[l+4>>2];c[h+8>>2]=c[l+8>>2];c[h+12>>2]=c[l+12>>2];Jya(j,c[a+20>>2]|0);c[f+0>>2]=c[g+0>>2];c[f+4>>2]=c[g+4>>2];c[f+8>>2]=c[g+8>>2];c[f+12>>2]=c[g+12>>2];c[e+0>>2]=c[h+0>>2];c[e+4>>2]=c[h+4>>2];c[e+8>>2]=c[h+8>>2];c[e+12>>2]=c[h+12>>2];MIa(a,f,e,j);Fya(j);i=d;return}else if((k|0)==0){Ela(a+4|0,b);i=d;return}else{i=d;return}}function MIa(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;g=i;h=c[f>>2]|0;c[b>>2]=1;j=b+4|0;c[j+0>>2]=c[d+0>>2];c[j+4>>2]=c[d+4>>2];c[j+8>>2]=c[d+8>>2];c[j+12>>2]=c[d+12>>2];Ela(j,e);if(($L(j)|0)!=0){c[b>>2]=0;i=g;return}d=b+20|0;if((w0(j,e)|0)!=0){IIa(d,f);i=g;return}f=kxa(d)|0;if((f|0)==0){i=g;return}d=b+12|0;k=b+16|0;l=b+8|0;JCa(f,(c[d>>2]|0)-(c[j>>2]|0)|0,(c[k>>2]|0)-(c[l>>2]|0)|0,264,0)|0;b=c[l>>2]|0;if((b|0)>=(c[k>>2]|0)){i=g;return}m=f+24|0;n=h+24|0;o=c[e+4>>2]|0;p=c[e>>2]|0;e=b;do{b=Lc[c[(c[f>>2]|0)+8>>2]&255](f)|0;q=ca(e-(c[l>>2]|0)|0,c[m>>2]|0)|0;r=Lc[c[(c[h>>2]|0)+8>>2]&255](h)|0;s=ca(e-o|0,c[n>>2]|0)|0;t=c[j>>2]|0;a:do{if((t|0)<(c[d>>2]|0)){u=t;v=t;while(1){a[b+(v+q-u)>>0]=a[r+(v+s-p)>>0]|0;w=v+1|0;if((w|0)>=(c[d>>2]|0)){break a}u=c[j>>2]|0;v=w}}}while(0);e=e+1|0}while((e|0)<(c[k>>2]|0));i=g;return}function NIa(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;h=i;i=i+96|0;j=h+80|0;k=h+64|0;l=h+48|0;m=h+32|0;n=h+24|0;o=h+8|0;p=h;q=(c[g+8>>2]|0)+e|0;r=(c[g+12>>2]|0)+f|0;c[l>>2]=e;c[l+4>>2]=f;c[l+8>>2]=q;c[l+12>>2]=r;r=c[b>>2]|0;if((r|0)==0){q=b+4|0;c[m+0>>2]=c[q+0>>2];c[m+4>>2]=c[q+4>>2];c[m+8>>2]=c[q+8>>2];c[m+12>>2]=c[q+12>>2];Jya(n,g);c[k+0>>2]=c[m+0>>2];c[k+4>>2]=c[m+4>>2];c[k+8>>2]=c[m+8>>2];c[k+12>>2]=c[m+12>>2];c[j+0>>2]=c[l+0>>2];c[j+4>>2]=c[l+4>>2];c[j+8>>2]=c[l+8>>2];c[j+12>>2]=c[l+12>>2];MIa(b,k,j,n);Fya(n);i=h;return}else if((r|0)==1){r=b+4|0;c[o+0>>2]=c[r+0>>2];c[o+4>>2]=c[r+4>>2];c[o+8>>2]=c[r+8>>2];c[o+12>>2]=c[r+12>>2];Ela(o,l);l=c[o+8>>2]|0;n=c[o>>2]|0;if((l|0)>(n|0)?(j=c[o+12>>2]|0,k=c[o+4>>2]|0,(j|0)>(k|0)):0){c[p>>2]=0;m=kxa(p)|0;if((m|0)!=0){JCa(m,l-n|0,j-k|0,264,0)|0;q=b+20|0;s=c[q>>2]|0;t=b+8|0;u=s+24|0;v=g+24|0;w=m+24|0;x=k;do{y=Lc[c[(c[s>>2]|0)+8>>2]&255](s)|0;z=ca(x-(c[t>>2]|0)|0,c[u>>2]|0)|0;A=Lc[c[(c[g>>2]|0)+8>>2]&255](g)|0;B=ca(c[v>>2]|0,x-f|0)|0;C=Lc[c[(c[m>>2]|0)+8>>2]&255](m)|0;D=ca(x-k|0,c[w>>2]|0)|0;E=B-e|0;B=n;do{a[C+(B+D-n)>>0]=((ca(d[A+(E+B)>>0]|0,d[y+(B+z-(c[r>>2]|0))>>0]|0)|0)>>>0)/255|0;B=B+1|0}while((B|0)<(l|0));x=x+1|0}while((x|0)<(j|0));c[r+0>>2]=c[o+0>>2];c[r+4>>2]=c[o+4>>2];c[r+8>>2]=c[o+8>>2];c[r+12>>2]=c[o+12>>2];IIa(q,p)}Fya(p);i=h;return}c[b>>2]=0;KIa(b+20|0);c[r+0>>2]=c[o+0>>2];c[r+4>>2]=c[o+4>>2];c[r+8>>2]=c[o+8>>2];c[r+12>>2]=c[o+12>>2];i=h;return}else{i=h;return}}function OIa(a){a=a|0;c[a+8>>2]=0;c[a>>2]=0;c[a+4>>2]=0;return}function PIa(a){a=a|0;var b=0;b=i;if((a|0)!=0){v2a(a)}i=b;return}function QIa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;c[a>>2]=b;e=a+8|0;if((c[e>>2]|0)>=(b|0)){i=d;return}f=a+4|0;a=c[f>>2]|0;if((a|0)!=0){v2a(a);c[f>>2]=0}a=w2a(b,12)|0;c[f>>2]=a;if((a|0)==0){i=d;return}c[e>>2]=b;i=d;return}function RIa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=a+8|0;if((c[e>>2]|0)>=(b|0)){f=1;i=d;return f|0}g=w2a(b,12)|0;if((g|0)==0){f=0;i=d;return f|0}h=c[a>>2]|0;j=a+4|0;a=c[j>>2]|0;if((h|0)!=0){c3a(g|0,a|0,h*12|0)|0}if((a|0)!=0){v2a(a)}c[j>>2]=g;c[e>>2]=b;f=1;i=d;return f|0}function SIa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=a+4|0;c[e>>2]=0;f=c[b>>2]|0;c[a+8>>2]=f;c[a>>2]=f;a=w2a(c[b>>2]|0,12)|0;c[e>>2]=a;if((a|0)==0){i=d;return}c3a(a|0,c[b+4>>2]|0,f*12|0)|0;i=d;return}function TIa(a,b){a=a|0;b=b|0;var d=0;d=i;if((c[a>>2]|0)<=(b|0)){i=d;return}QIa(a,b);i=d;return}function UIa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=(c[a>>2]|0)+b|0;if((RIa(a,e)|0)==0){f=0;i=d;return f|0}c[a>>2]=e;f=1;i=d;return f|0}function VIa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=c[a>>2]|0;if((UIa(a,c[b>>2]|0)|0)==0){i=e;return}g=a+4|0;c3a((c[g>>2]|0)+(f*12|0)|0,c[b+4>>2]|0,(c[b>>2]|0)*12|0)|0;if((d|0)==0){i=e;return}if((c[b>>2]|0)>0){h=0}else{i=e;return}do{a=h+f|0;j=c[g>>2]|0;fma(d,j+(a*12|0)|0,j+(a*12|0)+4|0);h=h+1|0}while((h|0)<(c[b>>2]|0));i=e;return}function WIa(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=+e;f=f|0;var h=0;h=a+4|0;g[(c[h>>2]|0)+(b*12|0)>>2]=d;g[(c[h>>2]|0)+(b*12|0)+4>>2]=e;c[(c[h>>2]|0)+(b*12|0)+8>>2]=f;return}function XIa(a,b,d,e,f){a=a|0;b=+b;d=+d;e=+e;f=+f;var h=0,j=0,k=0,l=0,m=0,n=0;h=i;j=c[a>>2]|0;if((UIa(a,5)|0)==0){i=h;return}k=c[a+4>>2]|0;a=j+4|0;g[k+(a*12|0)>>2]=b;l=j+1|0;g[k+(l*12|0)>>2]=b;g[k+(j*12|0)>>2]=b;m=j+3|0;g[k+(m*12|0)>>2]=e;n=j+2|0;g[k+(n*12|0)>>2]=e;g[k+(a*12|0)+4>>2]=d;g[k+(m*12|0)+4>>2]=d;g[k+(j*12|0)+4>>2]=d;g[k+(n*12|0)+4>>2]=f;g[k+(l*12|0)+4>>2]=f;c[k+(j*12|0)+8>>2]=6;c[k+(m*12|0)+8>>2]=2;c[k+(n*12|0)+8>>2]=2;c[k+(l*12|0)+8>>2]=2;c[k+(a*12|0)+8>>2]=3;i=h;return}function YIa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0.0,k=0.0,l=0,m=0;d=i;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;e=c[b>>2]|0;if((e|0)==0){i=d;return}f=b+4|0;h=c[f>>2]|0;j=+g[h>>2];k=+g[h+4>>2];g[a+4>>2]=j;g[a>>2]=j;g[a+12>>2]=k;g[a+8>>2]=k;if((e|0)>1){l=h;m=1}else{i=d;return}while(1){Rla(a,+g[l+(m*12|0)>>2],+g[l+(m*12|0)+4>>2]);h=m+1|0;if((h|0)>=(c[b>>2]|0)){break}l=c[f>>2]|0;m=h}i=d;return}function ZIa(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,T=0.0,U=0.0,V=0.0;e=i;g[a>>2]=1.0e5;g[a+8>>2]=1.0e5;g[a+4>>2]=-1.0e5;g[a+12>>2]=-1.0e5;f=c[b>>2]|0;if((f|0)<=0){i=e;return}h=b+4|0;j=f;f=0;k=0;while(1){l=c[h>>2]|0;m=c[l+(k*12|0)+8>>2]|0;if((m|0)==4){Rla(a,+g[l+(k*12|0)>>2],+g[l+(k*12|0)+4>>2]);n=k+1|0;o=c[h>>2]|0;Rla(a,+g[o+(n*12|0)>>2],+g[o+(n*12|0)+4>>2]);p=c[b>>2]|0;q=k+2|0;r=6}else if((m|0)==6){s=l;t=0;u=k;v=f;w=k;x=k+1|0}else{p=j;q=k;r=6}do{if((r|0)==6){r=0;if((q|0)!=(p+ -1|0)){l=q+1|0;m=c[h>>2]|0;if((c[m+(l*12|0)+8>>2]|0)==6){y=m}else{s=m;t=1;u=l;v=q;w=q;x=q+ -1|0;break}}else{y=c[h>>2]|0}s=y;t=0;u=q;v=f;w=q;x=q+ -1|0}}while(0);z=+g[s+(x*12|0)>>2];A=+g[s+(x*12|0)+4>>2];B=+g[s+(u*12|0)>>2];C=+g[s+(u*12|0)+4>>2];do{if(t){D=+g[s+(v*12|0)>>2];E=+g[s+(v*12|0)+4>>2];F=z-D;l=+R(+F)<.05000000074505806;m=+R(+(D-B))<.05000000074505806;if(l&m){G=E+(E>A?1.0:-1.0)*d;Rla(a,D+d,G);Rla(a,D-d,G);break}if(l){H=0.0;I=0.0;J=0.0}else{G=(E-A)/(D-z);K=A-E;H=E-D*G;I=+R(+(+S(+(F*F+K*K))*d/F));J=G}if(m){L=0.0;M=0.0;N=0.0}else{G=C-E;F=B-D;K=G/F;L=E-D*K;M=+R(+(+S(+(F*F+G*G))*d/F));N=K}if(l){if(B<z){O=z+d}else{O=z-d}K=L+N*O;if(L+z*N>A){P=M+K}else{P=K-M}Rla(a,O,P);break}if(m){if(z<B){Q=B+d}else{Q=B-d}K=H+J*Q;if(H+B*J>C){T=I+K}else{T=K-I}Rla(a,Q,T);break}K=J-N;if(+R(+K)<.05000000074505806){if(((D>z?1:-1)|0)==((B>D?1:-1)|0)){_Ia(a,D,E,B,C,d);break}else{_Ia(a,z,A,D,E,d);break}}if(H+B*J>C){U=I+H}else{U=H-I}if(L+z*N>A){V=M+L}else{V=L-M}E=(V-U)/K;Rla(a,E,U+J*E)}else{_Ia(a,z,A,B,C,d)}}while(0);k=w+1|0;j=c[b>>2]|0;if((k|0)>=(j|0)){break}else{f=v}}i=e;return}function _Ia(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;var g=0,h=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0;g=i;h=c==e;if(b==d){if(h){Rla(a,d+f,e+f);Rla(a,d-f,e-f);i=g;return}if(e<c){j=e-f}else{j=e+f}Rla(a,d+f,j);Rla(a,d-f,j);i=g;return}else{if(!h){j=d-b;k=e-c;c=+S(+(j*j+k*k));l=j*f/c;j=l+d;m=k*f/c;c=m+e;Rla(a,j-m,l+c);Rla(a,j+m,c-l);i=g;return}if(d<b){n=d-f}else{n=d+f}Rla(a,n,e+f);Rla(a,n,e-f);i=g;return}}function $Ia(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;if((b|0)==0){i=d;return}if((c[a>>2]|0)<=0){i=d;return}e=a+4|0;f=0;do{g=c[e>>2]|0;fma(b,g+(f*12|0)|0,g+(f*12|0)+4|0);f=f+1|0}while((f|0)<(c[a>>2]|0));i=d;return}function aJa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0.0,G=0,H=0,I=0;h=i;i=i+32|0;j=h+16|0;k=h+12|0;l=h;m=c[a>>2]|0;if((m|0)<3){n=0;i=h;return n|0}if((m|0)==3){o=a+4|0;p=c[o>>2]|0;if((c[p+8>>2]&6|0)==6){if((((c[p+20>>2]&6|0)==2?(c[p+32>>2]&6|0)==2:0)?+g[p>>2]==+g[p+24>>2]:0)?+g[p+4>>2]==+g[p+28>>2]:0){UIa(b,2)|0;do{if((f|0)!=0){p=c[o>>2]|0;q=+g[p>>2];if((d|0)==0){r=+(~~+g[p+4>>2]|0)+.5;s=b+4|0;g[c[s>>2]>>2]=+(~~q|0)+.5;g[(c[s>>2]|0)+4>>2]=r;c[(c[s>>2]|0)+8>>2]=6;t=c[o>>2]|0;r=+(~~+g[t+16>>2]|0)+.5;g[(c[s>>2]|0)+12>>2]=+(~~+g[t+12>>2]|0)+.5;g[(c[s>>2]|0)+16>>2]=r;c[(c[s>>2]|0)+20>>2]=2;break}else{g[j>>2]=q;g[k>>2]=+g[p+4>>2];fma(d,j,k);q=+(~~+g[k>>2]|0)+.5;p=b+4|0;g[c[p>>2]>>2]=+(~~+g[j>>2]|0)+.5;g[(c[p>>2]|0)+4>>2]=q;c[(c[p>>2]|0)+8>>2]=6;s=c[o>>2]|0;g[j>>2]=+g[s+12>>2];g[k>>2]=+g[s+16>>2];fma(d,j,k);q=+(~~+g[j>>2]|0)+.5;g[j>>2]=q;r=+(~~+g[k>>2]|0)+.5;g[k>>2]=r;g[(c[p>>2]|0)+12>>2]=q;g[(c[p>>2]|0)+16>>2]=r;c[(c[p>>2]|0)+20>>2]=2;g[d+12>>2]=1.0;g[d>>2]=1.0;g[d+20>>2]=0.0;g[d+16>>2]=0.0;g[d+8>>2]=0.0;g[d+4>>2]=0.0;break}}else{p=c[o>>2]|0;r=+g[p+4>>2];s=b+4|0;g[c[s>>2]>>2]=+g[p>>2];g[(c[s>>2]|0)+4>>2]=r;c[(c[s>>2]|0)+8>>2]=6;p=c[o>>2]|0;r=+g[p+16>>2];g[(c[s>>2]|0)+12>>2]=+g[p+12>>2];g[(c[s>>2]|0)+16>>2]=r;c[(c[s>>2]|0)+20>>2]=2}}while(0);d=c[o>>2]|0;if(!(+g[d>>2]!=+g[d+12>>2])){n=1;i=h;return n|0}if(!(+g[d+4>>2]!=+g[d+16>>2])){n=1;i=h;return n|0}c[e>>2]=1;n=1;i=h;return n|0}else{u=16}}else{v=3;w=0;x=0}}else{u=16}a:do{if((u|0)==16){if((m|0)<4|(m&1|0)==0){v=m;w=0;x=0}else{d=(m|0)/2|0;c[l+8>>2]=0;c[l>>2]=0;o=l+4|0;c[o>>2]=0;b:do{if((m|0)>1){k=a+4|0;j=d+1|0;f=0;s=0;while(1){p=d-f|0;t=p+ -1|0;y=c[k>>2]|0;z=j+f|0;if(!(+g[y+(t*12|0)>>2]==+g[y+(z*12|0)>>2])){break}if(!(+g[y+(t*12|0)+4>>2]==+g[y+(z*12|0)+4>>2])){break}if((c[y+(t*12|0)+8>>2]&6|0)==4){break}if((c[y+(z*12|0)+8>>2]&6|0)==4){break}z=c[l>>2]|0;UIa(l,2)|0;y=c[k>>2]|0;r=+g[y+(p*12|0)+4>>2];A=c[o>>2]|0;g[A+(z*12|0)>>2]=+g[y+(p*12|0)>>2];g[A+(z*12|0)+4>>2]=r;c[A+(z*12|0)+8>>2]=6;p=z+1|0;z=c[k>>2]|0;r=+g[z+(t*12|0)+4>>2];g[A+(p*12|0)>>2]=+g[z+(t*12|0)>>2];g[A+(p*12|0)+4>>2]=r;c[A+(p*12|0)+8>>2]=2;f=f+1|0;if((f|0)>=(d|0)){break b}else{s=A}}PIa(s);B=0;C=0;u=26;break a}}while(0);VIa(b,l,0);c[e>>2]=1;PIa(c[o>>2]|0);n=1;i=h;return n|0}}}while(0);while(1){if((u|0)==26){u=0;v=c[a>>2]|0;w=B;x=C}if((w|0)>=(v|0)){break}l=a+4|0;m=c[l>>2]|0;d=c[m+(w*12|0)+8>>2]&6;do{if((d|0)==2){f=((1-x+w|0)%(v-x|0)|0)+x|0;k=c[m+(f*12|0)+8>>2]|0;j=k&6;if(!((j|0)==6|(j|0)==4)){A=w+ -1|0;r=+g[m+(A*12|0)>>2];q=+g[m+(w*12|0)>>2];if((r==q?q==+g[m+(f*12|0)>>2]:0)?(D=+g[m+(w*12|0)+4>>2],E=D- +g[m+(A*12|0)+4>>2],F=D- +g[m+(f*12|0)+4>>2],E*F>0.0):0){p=+R(+E)<+R(+F);t=(p<<31>>31)+f|0;z=p?A:w;p=c[b>>2]|0;UIa(b,2)|0;y=c[l>>2]|0;F=+g[y+(z*12|0)+4>>2];G=b+4|0;g[(c[G>>2]|0)+(p*12|0)>>2]=+g[y+(z*12|0)>>2];g[(c[G>>2]|0)+(p*12|0)+4>>2]=F;c[(c[G>>2]|0)+(p*12|0)+8>>2]=6;z=p+1|0;p=c[l>>2]|0;F=+g[p+(t*12|0)+4>>2];g[(c[G>>2]|0)+(z*12|0)>>2]=+g[p+(t*12|0)>>2];g[(c[G>>2]|0)+(z*12|0)+4>>2]=F;c[(c[G>>2]|0)+(z*12|0)+8>>2]=2;H=w;I=x;break}F=+g[m+(A*12|0)+4>>2];E=+g[m+(w*12|0)+4>>2];if((F==E?E==+g[m+(f*12|0)+4>>2]:0)?(E=q-r,D=q- +g[m+(f*12|0)>>2],E*D>0.0):0){z=+R(+E)<+R(+D);G=(z<<31>>31)+f|0;t=z?A:w;z=c[b>>2]|0;UIa(b,2)|0;p=c[l>>2]|0;D=+g[p+(t*12|0)+4>>2];y=b+4|0;g[(c[y>>2]|0)+(z*12|0)>>2]=+g[p+(t*12|0)>>2];g[(c[y>>2]|0)+(z*12|0)+4>>2]=D;c[(c[y>>2]|0)+(z*12|0)+8>>2]=6;t=z+1|0;z=c[l>>2]|0;D=+g[z+(G*12|0)+4>>2];g[(c[y>>2]|0)+(t*12|0)>>2]=+g[z+(G*12|0)>>2];g[(c[y>>2]|0)+(t*12|0)+4>>2]=D;c[(c[y>>2]|0)+(t*12|0)+8>>2]=2;H=w;I=x;break}if(((((j|0)==2?(c[m+(A*12|0)+8>>2]&6|0)==6:0)?r==+g[m+(f*12|0)>>2]:0)?F==+g[m+(f*12|0)+4>>2]:0)?(k&1|0)!=0:0){k=c[b>>2]|0;UIa(b,2)|0;f=c[l>>2]|0;F=+g[f+(A*12|0)+4>>2];j=b+4|0;g[(c[j>>2]|0)+(k*12|0)>>2]=+g[f+(A*12|0)>>2];g[(c[j>>2]|0)+(k*12|0)+4>>2]=F;c[(c[j>>2]|0)+(k*12|0)+8>>2]=6;A=k+1|0;k=c[l>>2]|0;F=+g[k+(w*12|0)+4>>2];g[(c[j>>2]|0)+(A*12|0)>>2]=+g[k+(w*12|0)>>2];g[(c[j>>2]|0)+(A*12|0)+4>>2]=F;c[(c[j>>2]|0)+(A*12|0)+8>>2]=2;c[e>>2]=1;H=w;I=x}else{H=w;I=x}}else{H=w;I=x}}else if((d|0)==6){H=w;I=w}else{H=(d|0)==4?w+2|0:w;I=x}}while(0);B=H+1|0;C=I;u=26}if((v|0)>3?(c[b>>2]|0)!=0:0){c[e>>2]=1}n=(c[b>>2]|0)!=0&1;i=h;return n|0}function bJa(a){a=a|0;var b=0,d=0,e=0,f=0,h=0.0,j=0.0,k=0.0,l=0,m=0,n=0;b=i;d=c[a>>2]|0;if(!((d+ -4|0)>>>0<2)){e=0;i=b;return e|0}f=(d|0)==5;d=c[a+4>>2]|0;h=+g[d>>2];if(f){if(h!=+g[d+48>>2]){e=0;i=b;return e|0}if(+g[d+4>>2]!=+g[d+52>>2]){e=0;i=b;return e|0}}if(h==+g[d+24>>2]?+g[d+4>>2]==+g[d+28>>2]:0){e=0;i=b;return e|0}j=+g[d+36>>2];if(+g[d+12>>2]==j?+g[d+16>>2]==+g[d+40>>2]:0){e=0;i=b;return e|0}if(h!=j?+g[d+4>>2]!=+g[d+40>>2]:0){e=0;i=b;return e|0}else{k=h;l=1}while(1){if((c[d+(l*12|0)+8>>2]&6|0)!=2){e=0;m=18;break}h=k;k=+g[d+(l*12|0)>>2];if(k!=h?+g[d+(l*12|0)+4>>2]!=+g[d+((l+ -1|0)*12|0)+4>>2]:0){e=0;m=18;break}l=l+1|0;if((l|0)>=4){m=15;break}}if((m|0)==15){if(f){n=1}else{n=(c[d+44>>2]&1|0)!=0}e=n&1;i=b;return e|0}else if((m|0)==18){i=b;return e|0}return 0}function cJa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0,r=0;e=i;i=i+48|0;f=e+20|0;h=e;if((b|0)==0){if((bJa(a)|0)==0){j=0;i=e;return j|0}if((d|0)==0){j=1;i=e;return j|0}k=a+4|0;g[d>>2]=+g[c[k>>2]>>2];g[d+4>>2]=+g[(c[k>>2]|0)+24>>2];g[d+8>>2]=+g[(c[k>>2]|0)+4>>2];g[d+12>>2]=+g[(c[k>>2]|0)+28>>2];Hla(d);j=1;i=e;return j|0}k=c[a>>2]|0;if(!((k+ -4|0)>>>0<2)){j=0;i=e;return j|0}l=a+4|0;m=c[l>>2]|0;if((k|0)==5){if(+g[m>>2]!=+g[m+48>>2]){j=0;i=e;return j|0}if(+g[m+4>>2]!=+g[m+52>>2]){j=0;i=e;return j|0}}n=+g[m+36>>2];if(+g[m+12>>2]==n?+g[m+16>>2]==+g[m+40>>2]:0){j=0;i=e;return j|0}if((k|0)==4){if(+g[m>>2]!=n){if(+g[m+4>>2]!=+g[m+40>>2]){j=0;i=e;return j|0}else{o=14}}else{p=m;q=0;o=15}}else{o=14}if((o|0)==14?(k|0)>0:0){p=m;q=0;o=15}a:do{if((o|0)==15){while(1){o=0;n=+g[p+(q*12|0)+4>>2];m=f+(q<<2)|0;k=h+(q<<2)|0;g[m>>2]=+g[p+(q*12|0)>>2];g[k>>2]=n;fma(b,m,k);if((q|0)!=0){if((c[(c[l>>2]|0)+(q*12|0)+8>>2]&6|0)!=2){j=0;o=23;break}r=q+ -1|0;if(+g[m>>2]!=+g[f+(r<<2)>>2]?+g[k>>2]!=+g[h+(r<<2)>>2]:0){j=0;o=23;break}}r=q+1|0;if((r|0)>=(c[a>>2]|0)){break a}p=c[l>>2]|0;q=r;o=15}if((o|0)==23){i=e;return j|0}}}while(0);if((d|0)==0){j=1;i=e;return j|0}g[d>>2]=+g[f>>2];g[d+4>>2]=+g[f+8>>2];g[d+8>>2]=+g[h>>2];g[d+12>>2]=+g[h+8>>2];Hla(d);j=1;i=e;return j|0}function dJa(a){a=a|0;var b=0,d=0;b=i;d=a+20|0;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;g[d>>2]=10.0;g[a+24>>2]=1.0;i=b;return}function eJa(a,b){a=a|0;b=b|0;var d=0;d=i;c[a+8>>2]=0;fJa(a,b);i=d;return}function fJa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0;d=i;c[a>>2]=c[b>>2];e=c[b+4>>2]|0;f=a+4|0;c[f>>2]=e;h=a+8|0;j=c[h>>2]|0;if((j|0)==0){k=e}else{v2a(j);k=c[f>>2]|0}c[h>>2]=0;g[a+12>>2]=+g[b+12>>2];c[a+16>>2]=c[b+16>>2];g[a+20>>2]=+g[b+20>>2];g[a+24>>2]=+g[b+24>>2];if((k|0)==0){i=d;return}a=w2a(k,4)|0;c[h>>2]=a;if((a|0)==0){i=d;return}c3a(a|0,c[b+8>>2]|0,k<<2|0)|0;i=d;return}function gJa(a){a=a|0;var b=0;b=i;if((a|0)!=0){v2a(a)}i=b;return}function hJa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=a+8|0;f=c[e>>2]|0;if((f|0)!=0){v2a(f)}c[e>>2]=0;c[a+4>>2]=b;if((b|0)==0){i=d;return}c[e>>2]=w2a(b,4)|0;i=d;return}function iJa(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;g=+g;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;h=i;j=a+4|0;k=a+8|0;l=a+12|0;m=(d|0)>0;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;if(!m){i=h;return}m=(e|0)==3;e=0;n=0;o=0;p=0;q=0;r=0;while(1){s=c[b+(r*20|0)>>2]|0;do{if((s|0)!=0){t=(c[s+4>>2]|0)+(c[b+(r*20|0)+4>>2]|0)|0;u=~~(+(c[s+16>>2]|0)/f);if(m){v=(u|0)/3|0}else{v=u}u=v+t|0;w=(c[b+(r*20|0)+8>>2]|0)-(c[s>>2]|0)|0;x=~~(+(c[s+20>>2]|0)/g)+w|0;if((q|0)==0){c[a>>2]=t;c[k>>2]=u;c[j>>2]=w;c[l>>2]=x;y=x;z=w;A=u;B=t;C=1;break}if((e|0)>(t|0)){c[a>>2]=t;D=t}else{D=e}if((n|0)<(u|0)){c[k>>2]=u;E=u}else{E=n}if((o|0)>(w|0)){c[j>>2]=w;F=w}else{F=o}if((p|0)<(x|0)){c[l>>2]=x;y=x;z=F;A=E;B=D;C=q}else{y=p;z=F;A=E;B=D;C=q}}else{y=p;z=o;A=n;B=e;C=q}}while(0);r=r+1|0;if((r|0)==(d|0)){break}else{e=B;n=A;o=z;p=y;q=C}}i=h;return}function jJa(a,b){a=a|0;b=b|0;c[a>>2]=b;return}function kJa(b,e,f,h,j,k,l,m,n){b=b|0;e=e|0;f=f|0;h=h|0;j=j|0;k=+k;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0.0,_=0.0,$=0.0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0;o=i;i=i+256|0;p=o+248|0;q=o+224|0;r=o+200|0;s=o+176|0;t=o+152|0;u=o+128|0;v=o+112|0;w=o+96|0;x=o+56|0;y=o+16|0;z=o+12|0;A=o+8|0;B=o+4|0;C=o;c[p>>2]=m;D=b+24|0;if((c[D>>2]|0)==1){if((n&8|0)==0?(E=c[b+44>>2]|0,(kd[c[(c[E>>2]|0)+100>>2]&1](E,e,f,h,j,l,k,m,0,0)|0)!=0):0){F=1;i=o;return F|0}}else{if((n&4|0)==0?(E=c[b+44>>2]|0,(kd[c[(c[E>>2]|0)+100>>2]&1](E,e,f,h,j,l,k,m,0,0)|0)!=0):0){F=1;i=o;return F|0}if(!((m&-16777216|0)==-16777216)){F=0;i=o;return F|0}}g[q+12>>2]=1.0;g[q>>2]=1.0;g[q+20>>2]=0.0;g[q+16>>2]=0.0;g[q+8>>2]=0.0;E=q+4|0;g[E>>2]=0.0;g[r+12>>2]=1.0;g[r>>2]=1.0;g[r+20>>2]=0.0;g[r+16>>2]=0.0;g[r+8>>2]=0.0;g[r+4>>2]=0.0;g[s+12>>2]=1.0;g[s>>2]=1.0;g[s+20>>2]=0.0;g[s+16>>2]=0.0;g[s+8>>2]=0.0;g[s+4>>2]=0.0;if((l|0)!=0){c[q+0>>2]=c[l+0>>2];c[q+4>>2]=c[l+4>>2];c[q+8>>2]=c[l+8>>2];c[q+12>>2]=c[l+12>>2];c[q+16>>2]=c[l+16>>2];c[q+20>>2]=c[l+20>>2];c[s+0>>2]=c[l+0>>2];c[s+4>>2]=c[l+4>>2];c[s+8>>2]=c[l+8>>2];c[s+12>>2]=c[l+12>>2];c[s+16>>2]=c[l+16>>2];c[s+20>>2]=c[l+20>>2]}ama(q,k,-k);G=+R(+(+g[q>>2]));if(!(G+ +R(+(+g[E>>2]))>50.0)){if(((c[D>>2]|0)==2?(E=c[b+44>>2]|0,(Lc[c[(c[E>>2]|0)+24>>2]&255](E)|0)==0):0)?(n&16|0)==0:0){H=13}}else{H=13}do{if((H|0)==13){if((c[h>>2]|0)==0?(c[(c[h+4>>2]|0)+12>>2]&4|0)==0:0){break}F=lJa(b,e,f,h,j,k,l,0,0,m,0,0,n<<4&512)|0;i=o;return F|0}}while(0);if(((n&32|0)==0?(c[D>>2]|0)==1:0)?(D=c[b+16>>2]|0,(D|0)>1):0){if((c[h>>2]|0)==0?(c[(c[h+4>>2]|0)+12>>2]&8|0)==0:0){I=1}else{I=n&1^1}if((c[b+20>>2]&576|0)==0){l=(D|0)<16;J=l?0:3;K=l?0:I}else{J=3;K=1}}else{J=2;K=0}if((j|0)==0){L=EGa(BGa()|0)|0}else{L=j}j=mJa(L,h)|0;I=w2a(e,20)|0;do{if((I|0)==0){M=0}else{c[r+0>>2]=c[q+0>>2];c[r+4>>2]=c[q+4>>2];c[r+8>>2]=c[q+8>>2];c[r+12>>2]=c[q+12>>2];c[r+16>>2]=c[q+16>>2];c[r+20>>2]=c[q+20>>2];l=b+44|0;PGa(t,c[l>>2]|0);k=+R(+(+g[t>>2]));G=+R(+(+g[t+12>>2]));Vla(r,k,0.0,0.0,G,0.0,0.0);Vla(s,k,0.0,0.0,G,0.0,0.0);D=(e|0)>0;do{if(D){E=(J|0)==3;N=u+4|0;O=u+8|0;P=u+12|0;S=u+16|0;T=u+20|0;U=0;do{V=I+(U*20|0)|0;W=f+(U*44|0)|0;X=I+(U*20|0)+12|0;g[X>>2]=+g[f+(U*44|0)+4>>2];Y=I+(U*20|0)+16|0;g[Y>>2]=+g[f+(U*44|0)+8>>2];fma(s,X,Y);Z=+g[X>>2];if(E){c[I+(U*20|0)+4>>2]=~~+Q(+Z)}else{c[I+(U*20|0)+4>>2]=Fla(Z)|0}c[I+(U*20|0)+8>>2]=Fla(+g[Y>>2])|0;if((c[f+(U*44|0)+16>>2]|0)==0){c[V>>2]=nJa(j,h,c[W>>2]|0,c[f+(U*44|0)+40>>2]|0,r,c[f+(U*44|0)+12>>2]|0,J)|0}else{Z=+g[f+(U*44|0)+24>>2];_=+g[f+(U*44|0)+28>>2];$=+g[f+(U*44|0)+32>>2];g[u>>2]=+g[f+(U*44|0)+20>>2];g[N>>2]=Z;g[O>>2]=_;g[P>>2]=$;g[S>>2]=0.0;g[T>>2]=0.0;Wla(u,r);c[V>>2]=nJa(j,h,c[W>>2]|0,c[f+(U*44|0)+40>>2]|0,u,c[f+(U*44|0)+12>>2]|0,J)|0}U=U+1|0}while((U|0)<(e|0));if((J|0)!=3&(e|0)>1){U=e+ -1|0;T=I+(U*20|0)+4|0;S=I+(U*20|0)+8|0;if((c[T>>2]|0)==(c[I+4>>2]|0)){aa=I+(U*20|0)+16|0;ba=S;da=1}else{if((c[S>>2]|0)!=(c[I+8>>2]|0)){break}aa=I+(U*20|0)+12|0;ba=T;da=0}T=e+ -2|0;if((T|0)>0){U=T;T=ba;$=+g[aa>>2];do{S=T;T=da?I+(U*20|0)+8|0:I+(U*20|0)+4|0;if(da){ea=I+(U*20|0)+16|0}else{ea=I+(U*20|0)+12|0}_=$;$=+g[ea>>2];P=c[T>>2]|0;O=(c[S>>2]|0)-P|0;if(+R(+(_-$))- +R(+(+(O|0)))>.5){c[T>>2]=((O|0)>0?-1:1)+P}U=U+ -1|0}while((U|0)>0)}}}}while(0);iJa(v,I,e,J,1.0,1.0);U=c[v>>2]|0;if(k>1.0&G>1.0){T=U+ -1|0;c[v>>2]=T;P=v+4|0;O=(c[P>>2]|0)+ -1|0;c[P>>2]=O;P=v+8|0;S=(c[P>>2]|0)+1|0;c[P>>2]=S;P=v+12|0;N=(c[P>>2]|0)+1|0;c[P>>2]=N;fa=T;ga=O;ha=S;ia=N}else{fa=U;ga=c[v+4>>2]|0;ha=c[v+8>>2]|0;ia=c[v+12>>2]|0}U=Fla(+(fa|0)/k)|0;N=Fla(+(ga|0)/G)|0;S=Fla(+(ha|0)/k)|0;O=Fla(+(ia|0)/G)|0;c[w>>2]=U;U=w+4|0;c[U>>2]=N;N=w+8|0;c[N>>2]=S;S=w+12|0;c[S>>2]=O;Ela(w,b+28|0);O=c[N>>2]|0;N=c[w>>2]|0;if((O|0)>(N|0)?(T=c[S>>2]|0,S=c[U>>2]|0,(T|0)>(S|0)):0){P=Fla(k*+(O-N|0))|0;O=Fla(G*+(T-S|0))|0;T=Fla(k*+(N|0))|0;E=Fla(G*+(S|0))|0;if((J|0)==2){ICa(x);if((JCa(x,P,O,257,0)|0)==0){v2a(I);ja=0}else{WCa(x,0);if(D){W=0;do{V=c[I+(W*20|0)>>2]|0;if((V|0)!=0){YCa(x,(c[I+(W*20|0)+4>>2]|0)-T+(c[V+4>>2]|0)|0,(c[I+(W*20|0)+8>>2]|0)-E-(c[V>>2]|0)|0,c[V+16>>2]|0,c[V+20>>2]|0,V+8|0,0,0,0)|0}W=W+1|0}while((W|0)<(e|0))}v2a(I);ja=$Ga(c[l>>2]|0,x,N,S,m)|0}PCa(x);M=ja;break}ICa(y);if((c[b+16>>2]|0)==8){if((JCa(y,P,O,264,0)|0)==0){v2a(I);ka=0}else{H=69}}else{if((QGa(c[b+20>>2]|0,y,P,O)|0)==0){v2a(I);ka=0}else{H=69}}a:do{if((H|0)==69){W=y+20|0;V=c[W>>2]|0;if((V&2|0)!=0|(V|0)==1){WCa(y,0);V=c[y+4>>2]|0;if((V|0)!=0){WCa(V,0)}}else{WCa(y,-1);if((XGa(b,y,N,S)|0)==0){v2a(I);ka=0;break}}V=c[y+32>>2]|0;Y=c[y+24>>2]|0;X=y+16|0;la=(c[X>>2]|0)/8|0;if((J|0)==3){jJa(p,m);DCa(c[p>>2]|0,z,A,B,C)}do{if(D){ma=(J|0)==0;na=y+12|0;oa=(n&2|0)==0;pa=(K|0)!=0;qa=(K|0)==0;ra=T+ -1|0;sa=~P;ta=0;b:while(1){ua=c[I+(ta*20|0)>>2]|0;c:do{if((ua|0)!=0){va=ua+8|0;wa=c[I+(ta*20|0)+4>>2]|0;xa=c[ua+4>>2]|0;ya=wa-T+xa|0;za=(c[I+(ta*20|0)+8>>2]|0)-(c[ua>>2]|0)-E|0;Aa=c[ua+16>>2]|0;Ba=c[ua+20>>2]|0;if(ma){if((FBa(y,ya,za,Aa,Ba,va,c[p>>2]|0,0,0,0,0,0,0,0)|0)==0){H=81;break b}else{break}}Ca=(~~(+g[I+(ta*20|0)+12>>2]*3.0)|0)%3|0;Da=Lc[c[(c[va>>2]|0)+8>>2]&255](va)|0;va=(Aa|0)/3|0;Aa=c[ua+32>>2]|0;Ea=(ya|0)<0;Fa=Ea?0:ya;Ga=va+ya|0;Ha=(Ga|0)>(P|0)?P:Ga;if((Fa|0)>=(Ha|0)){break}Ga=(Ba|0)>0;if(((c[W>>2]<<8)+(c[X>>2]|0)|0)!=544){if(!Ga){break}Ia=(Fa-ya|0)*3|0;Ja=ca(Fa,la)|0;Ka=(Ca|0)==0;La=(Ca|0)==1;Ma=Fa+1|0;Na=(Ma|0)<(Ha|0);Oa=(Ma|0)<(Ha+ -1|0);Pa=ra-wa-xa-va|0;Qa=(Pa|0)>(sa|0)?Pa:sa;Pa=-2-Qa|0;Ra=~Qa;Qa=0;while(1){Sa=Qa+za|0;d:do{if((Sa|0)>=0){if((Sa|0)>=(c[na>>2]|0)){break}Ta=(ca(Qa,Aa)|0)+Ia|0;Ua=Da+Ta|0;Va=(ca(Sa,Y)|0)+Ja|0;Wa=V+Va|0;if(!oa){if(Ka){Xa=Fa;Ya=Wa;Za=Ua;while(1){_a=(ca(d[827568+(d[Za+2>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;$a=Ya+2|0;ab=ca(d[$a>>0]|0,255-_a|0)|0;a[$a>>0]=(ab+(ca(c[A>>2]|0,_a)|0)|0)/255|0;_a=(ca(d[827568+(d[Za+1>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;ab=Ya+1|0;$a=ca(d[ab>>0]|0,255-_a|0)|0;a[ab>>0]=($a+(ca(c[B>>2]|0,_a)|0)|0)/255|0;_a=(ca(d[827568+(d[Za>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;$a=ca(d[Ya>>0]|0,255-_a|0)|0;a[Ya>>0]=($a+(ca(c[C>>2]|0,_a)|0)|0)/255|0;_a=Xa+1|0;if((_a|0)==(Ra|0)){break d}Xa=_a;Ya=Ya+la|0;Za=Za+3|0}}if(La){Za=(ca(d[827568+(d[Da+(Ta+1)>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Ya=V+(Va+2)|0;Xa=ca(d[Ya>>0]|0,255-Za|0)|0;a[Ya>>0]=(Xa+(ca(c[A>>2]|0,Za)|0)|0)/255|0;Za=(ca(d[827568+(d[Ua>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Xa=V+(Va+1)|0;Ya=ca(d[Xa>>0]|0,255-Za|0)|0;a[Xa>>0]=(Ya+(ca(c[B>>2]|0,Za)|0)|0)/255|0;if(Ea){Za=(ca(d[827568+(d[Da+(Ta+ -1)>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Ya=ca(d[Wa>>0]|0,255-Za|0)|0;a[Wa>>0]=(Ya+(ca(c[C>>2]|0,Za)|0)|0)/255|0}if(!Oa){break}Za=Ma;Ya=V+(Va+la)|0;Xa=Da+(Ta+3)|0;while(1){_a=(ca(d[827568+(d[Xa+1>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;$a=Ya+2|0;ab=ca(d[$a>>0]|0,255-_a|0)|0;a[$a>>0]=(ab+(ca(c[A>>2]|0,_a)|0)|0)/255|0;_a=(ca(d[827568+(d[Xa>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;ab=Ya+1|0;$a=ca(d[ab>>0]|0,255-_a|0)|0;a[ab>>0]=($a+(ca(c[B>>2]|0,_a)|0)|0)/255|0;_a=(ca(d[827568+(d[Xa+ -1>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;$a=ca(d[Ya>>0]|0,255-_a|0)|0;a[Ya>>0]=($a+(ca(c[C>>2]|0,_a)|0)|0)/255|0;Za=Za+1|0;if((Za|0)==(Pa|0)){break d}else{Ya=Ya+la|0;Xa=Xa+3|0}}}else{Xa=(ca(d[827568+(d[Ua>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Ya=V+(Va+2)|0;Za=ca(d[Ya>>0]|0,255-Xa|0)|0;a[Ya>>0]=(Za+(ca(c[A>>2]|0,Xa)|0)|0)/255|0;if(Ea){Xa=(ca(d[827568+(d[Da+(Ta+ -1)>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Za=V+(Va+1)|0;Ya=ca(d[Za>>0]|0,255-Xa|0)|0;a[Za>>0]=(Ya+(ca(c[B>>2]|0,Xa)|0)|0)/255|0;Xa=(ca(d[827568+(d[Da+(Ta+ -2)>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Ya=ca(d[Wa>>0]|0,255-Xa|0)|0;a[Wa>>0]=(Ya+(ca(c[C>>2]|0,Xa)|0)|0)/255|0}if(!Oa){break}Xa=Ma;Ya=V+(Va+la)|0;Za=Da+(Ta+3)|0;while(1){_a=(ca(d[827568+(d[Za>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;$a=Ya+2|0;ab=ca(d[$a>>0]|0,255-_a|0)|0;a[$a>>0]=(ab+(ca(c[A>>2]|0,_a)|0)|0)/255|0;_a=(ca(d[827568+(d[Za+ -1>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;ab=Ya+1|0;$a=ca(d[ab>>0]|0,255-_a|0)|0;a[ab>>0]=($a+(ca(c[B>>2]|0,_a)|0)|0)/255|0;_a=(ca(d[827568+(d[Za+ -2>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;$a=ca(d[Ya>>0]|0,255-_a|0)|0;a[Ya>>0]=($a+(ca(c[C>>2]|0,_a)|0)|0)/255|0;Xa=Xa+1|0;if((Xa|0)==(Pa|0)){break d}else{Ya=Ya+la|0;Za=Za+3|0}}}}if(Ka){Za=Fa;Ya=Wa;Xa=Ua;while(1){_a=d[Xa>>0]|0;do{if(qa){$a=(ca(d[827568+_a>>0]|0,c[z>>2]|0)|0)/255|0;ab=Ya+2|0;bb=ca(d[ab>>0]|0,255-$a|0)|0;a[ab>>0]=(bb+(ca(c[A>>2]|0,$a)|0)|0)/255|0;$a=(ca(d[827568+(d[Xa+1>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;bb=Ya+1|0;ab=ca(d[bb>>0]|0,255-$a|0)|0;a[bb>>0]=(ab+(ca(c[B>>2]|0,$a)|0)|0)/255|0;$a=(ca(d[827568+(d[Xa+2>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;ab=ca(d[Ya>>0]|0,255-$a|0)|0;a[Ya>>0]=(ab+(ca(c[C>>2]|0,$a)|0)|0)/255|0}else{$a=ca(d[827568+(((((d[Xa+1>>0]|0)+_a+(d[Xa+2>>0]|0)|0)>>>0)/3|0)&255)>>0]|0,c[z>>2]|0)|0;ab=($a|0)/255|0;if(($a+254|0)>>>0<509){break}$a=Ya+2|0;bb=255-ab|0;cb=ca(d[$a>>0]|0,bb)|0;a[$a>>0]=(cb+(ca(c[A>>2]|0,ab)|0)|0)/255|0;cb=Ya+1|0;$a=ca(d[cb>>0]|0,bb)|0;a[cb>>0]=($a+(ca(c[B>>2]|0,ab)|0)|0)/255|0;$a=ca(d[Ya>>0]|0,bb)|0;a[Ya>>0]=($a+(ca(c[C>>2]|0,ab)|0)|0)/255|0}}while(0);Za=Za+1|0;if((Za|0)==(Ra|0)){break d}else{Ya=Ya+la|0;Xa=Xa+3|0}}}if(La){if(pa){Xa=(d[Da+(Ta+1)>>0]|0)+(d[Ua>>0]|0)|0;if(Ea){db=(d[Da+(Ta+ -1)>>0]|0)+Xa|0}else{db=Xa}Xa=(ca(d[827568+(((db|0)/3|0)&255)>>0]|0,c[z>>2]|0)|0)/255|0;Ya=V+(Va+2)|0;Za=255-Xa|0;_a=ca(d[Ya>>0]|0,Za)|0;a[Ya>>0]=(_a+(ca(c[A>>2]|0,Xa)|0)|0)/255|0;_a=V+(Va+1)|0;Ya=ca(d[_a>>0]|0,Za)|0;a[_a>>0]=(Ya+(ca(c[B>>2]|0,Xa)|0)|0)/255|0;Ya=ca(d[Wa>>0]|0,Za)|0;eb=Ya+(ca(c[C>>2]|0,Xa)|0)|0}else{if(Ea){Xa=(ca(d[827568+(d[Da+(Ta+ -1)>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Ya=V+(Va+2)|0;Za=ca(d[Ya>>0]|0,255-Xa|0)|0;a[Ya>>0]=(Za+(ca(c[A>>2]|0,Xa)|0)|0)/255|0}Xa=(ca(d[827568+(d[Ua>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Za=V+(Va+1)|0;Ya=ca(d[Za>>0]|0,255-Xa|0)|0;a[Za>>0]=(Ya+(ca(c[B>>2]|0,Xa)|0)|0)/255|0;Xa=(ca(d[827568+(d[Da+(Ta+1)>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Ya=ca(d[Wa>>0]|0,255-Xa|0)|0;eb=Ya+(ca(c[C>>2]|0,Xa)|0)|0}a[Wa>>0]=(eb|0)/255|0;if(!Na){break}Xa=Ma;Ya=V+(Va+la)|0;Za=Da+(Ta+3)|0;while(1){do{if(pa){_a=ca(d[827568+(((((d[Za+1>>0]|0)+(d[Za>>0]|0)+(d[Za+ -1>>0]|0)|0)>>>0)/3|0)&255)>>0]|0,c[z>>2]|0)|0;ab=(_a|0)/255|0;if((_a+254|0)>>>0<509){break}_a=Ya+2|0;$a=255-ab|0;bb=ca(d[_a>>0]|0,$a)|0;a[_a>>0]=(bb+(ca(c[A>>2]|0,ab)|0)|0)/255|0;bb=Ya+1|0;_a=ca(d[bb>>0]|0,$a)|0;a[bb>>0]=(_a+(ca(c[B>>2]|0,ab)|0)|0)/255|0;_a=ca(d[Ya>>0]|0,$a)|0;a[Ya>>0]=(_a+(ca(c[C>>2]|0,ab)|0)|0)/255|0}else{ab=(ca(d[827568+(d[Za+ -1>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;_a=Ya+2|0;$a=ca(d[_a>>0]|0,255-ab|0)|0;a[_a>>0]=($a+(ca(c[A>>2]|0,ab)|0)|0)/255|0;ab=(ca(d[827568+(d[Za>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;$a=Ya+1|0;_a=ca(d[$a>>0]|0,255-ab|0)|0;a[$a>>0]=(_a+(ca(c[B>>2]|0,ab)|0)|0)/255|0;ab=(ca(d[827568+(d[Za+1>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;_a=ca(d[Ya>>0]|0,255-ab|0)|0;a[Ya>>0]=(_a+(ca(c[C>>2]|0,ab)|0)|0)/255|0}}while(0);Xa=Xa+1|0;if((Xa|0)==(Ra|0)){break}else{Ya=Ya+la|0;Za=Za+3|0}}}else{if(pa){Za=d[Ua>>0]|0;if(Ea){fb=(d[Da+(Ta+ -2)>>0]|0)+Za+(d[Da+(Ta+ -1)>>0]|0)|0}else{fb=Za}Za=(ca(d[827568+(((fb|0)/3|0)&255)>>0]|0,c[z>>2]|0)|0)/255|0;Ya=V+(Va+2)|0;Xa=255-Za|0;ab=ca(d[Ya>>0]|0,Xa)|0;a[Ya>>0]=(ab+(ca(c[A>>2]|0,Za)|0)|0)/255|0;ab=V+(Va+1)|0;Ya=ca(d[ab>>0]|0,Xa)|0;a[ab>>0]=(Ya+(ca(c[B>>2]|0,Za)|0)|0)/255|0;Ya=ca(d[Wa>>0]|0,Xa)|0;gb=Ya+(ca(c[C>>2]|0,Za)|0)|0}else{if(Ea){Za=(ca(d[827568+(d[Da+(Ta+ -2)>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Ya=V+(Va+2)|0;Xa=ca(d[Ya>>0]|0,255-Za|0)|0;a[Ya>>0]=(Xa+(ca(c[A>>2]|0,Za)|0)|0)/255|0;Za=(ca(d[827568+(d[Da+(Ta+ -1)>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Xa=V+(Va+1)|0;Ya=ca(d[Xa>>0]|0,255-Za|0)|0;a[Xa>>0]=(Ya+(ca(c[B>>2]|0,Za)|0)|0)/255|0}Za=(ca(d[827568+(d[Ua>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Ya=ca(d[Wa>>0]|0,255-Za|0)|0;gb=Ya+(ca(c[C>>2]|0,Za)|0)|0}a[Wa>>0]=(gb|0)/255|0;if(!Na){break}Za=Ma;Ya=V+(Va+la)|0;Xa=Da+(Ta+3)|0;while(1){do{if(pa){ab=ca(d[827568+(((((d[Xa+ -2>>0]|0)+(d[Xa>>0]|0)+(d[Xa+ -1>>0]|0)|0)>>>0)/3|0)&255)>>0]|0,c[z>>2]|0)|0;_a=(ab|0)/255|0;if((ab+254|0)>>>0<509){break}ab=Ya+2|0;$a=255-_a|0;bb=ca(d[ab>>0]|0,$a)|0;a[ab>>0]=(bb+(ca(c[A>>2]|0,_a)|0)|0)/255|0;bb=Ya+1|0;ab=ca(d[bb>>0]|0,$a)|0;a[bb>>0]=(ab+(ca(c[B>>2]|0,_a)|0)|0)/255|0;ab=ca(d[Ya>>0]|0,$a)|0;a[Ya>>0]=(ab+(ca(c[C>>2]|0,_a)|0)|0)/255|0}else{_a=(ca(d[827568+(d[Xa+ -2>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;ab=Ya+2|0;$a=ca(d[ab>>0]|0,255-_a|0)|0;a[ab>>0]=($a+(ca(c[A>>2]|0,_a)|0)|0)/255|0;_a=(ca(d[827568+(d[Xa+ -1>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;$a=Ya+1|0;ab=ca(d[$a>>0]|0,255-_a|0)|0;a[$a>>0]=(ab+(ca(c[B>>2]|0,_a)|0)|0)/255|0;_a=(ca(d[827568+(d[Xa>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;ab=ca(d[Ya>>0]|0,255-_a|0)|0;a[Ya>>0]=(ab+(ca(c[C>>2]|0,_a)|0)|0)/255|0}}while(0);Za=Za+1|0;if((Za|0)==(Ra|0)){break}else{Ya=Ya+la|0;Xa=Xa+3|0}}}}}while(0);Qa=Qa+1|0;if((Qa|0)==(Ba|0)){break c}}}if(!Ga){break}Qa=(Fa-ya|0)*3|0;Ra=Fa<<2;Ma=(Ca|0)==0;Na=(Ca|0)==1;La=Fa+1|0;Ka=(La|0)<(Ha|0);Pa=(La|0)<(Ha+ -1|0);Oa=ra-wa-xa-va|0;Ja=(Oa|0)>(sa|0)?Oa:sa;Oa=-2-Ja|0;Ia=~Ja;Ja=0;do{Sa=Ja+za|0;e:do{if((Sa|0)>=0){if((Sa|0)>=(c[na>>2]|0)){break}Xa=(ca(Ja,Aa)|0)+Qa|0;Ya=Da+Xa|0;Za=(ca(Sa,Y)|0)+Ra|0;Ta=V+Za|0;if(!oa){if(Ma){Va=Fa;Wa=Ta;Ua=Ya;while(1){_a=(ca(d[Ua+2>>0]|0,c[z>>2]|0)|0)/255|0;ab=Wa+2|0;$a=ca(d[ab>>0]|0,255-_a|0)|0;a[ab>>0]=($a+(ca(c[A>>2]|0,_a)|0)|0)/255|0;_a=(ca(d[Ua+1>>0]|0,c[z>>2]|0)|0)/255|0;$a=Wa+1|0;ab=ca(d[$a>>0]|0,255-_a|0)|0;a[$a>>0]=(ab+(ca(c[B>>2]|0,_a)|0)|0)/255|0;_a=(ca(d[Ua>>0]|0,c[z>>2]|0)|0)/255|0;ab=ca(d[Wa>>0]|0,255-_a|0)|0;a[Wa>>0]=(ab+(ca(c[C>>2]|0,_a)|0)|0)/255|0;a[Wa+3>>0]=-1;_a=Va+1|0;if((_a|0)==(Ia|0)){break e}Va=_a;Wa=Wa+4|0;Ua=Ua+3|0}}if(Na){Ua=(ca(d[827568+(d[Da+(Xa+1)>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Wa=V+(Za+2)|0;Va=ca(d[Wa>>0]|0,255-Ua|0)|0;a[Wa>>0]=(Va+(ca(c[A>>2]|0,Ua)|0)|0)/255|0;Ua=(ca(d[827568+(d[Ya>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Va=V+(Za+1)|0;Wa=ca(d[Va>>0]|0,255-Ua|0)|0;a[Va>>0]=(Wa+(ca(c[B>>2]|0,Ua)|0)|0)/255|0;if(Ea){Ua=(ca(d[827568+(d[Da+(Xa+ -1)>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Wa=ca(d[Ta>>0]|0,255-Ua|0)|0;a[Ta>>0]=(Wa+(ca(c[C>>2]|0,Ua)|0)|0)/255|0}a[V+(Za+3)>>0]=-1;if(!Pa){break}Ua=La;Wa=V+(Za+4)|0;Va=Da+(Xa+3)|0;while(1){_a=(ca(d[827568+(d[Va+1>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;ab=Wa+2|0;$a=ca(d[ab>>0]|0,255-_a|0)|0;a[ab>>0]=($a+(ca(c[A>>2]|0,_a)|0)|0)/255|0;_a=(ca(d[827568+(d[Va>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;$a=Wa+1|0;ab=ca(d[$a>>0]|0,255-_a|0)|0;a[$a>>0]=(ab+(ca(c[B>>2]|0,_a)|0)|0)/255|0;_a=(ca(d[827568+(d[Va+ -1>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;ab=ca(d[Wa>>0]|0,255-_a|0)|0;a[Wa>>0]=(ab+(ca(c[C>>2]|0,_a)|0)|0)/255|0;a[Wa+3>>0]=-1;Ua=Ua+1|0;if((Ua|0)==(Oa|0)){break e}else{Wa=Wa+4|0;Va=Va+3|0}}}else{Va=(ca(d[827568+(d[Ya>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Wa=V+(Za+2)|0;Ua=ca(d[Wa>>0]|0,255-Va|0)|0;a[Wa>>0]=(Ua+(ca(c[A>>2]|0,Va)|0)|0)/255|0;if(Ea){Va=(ca(d[827568+(d[Da+(Xa+ -1)>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Ua=V+(Za+1)|0;Wa=ca(d[Ua>>0]|0,255-Va|0)|0;a[Ua>>0]=(Wa+(ca(c[B>>2]|0,Va)|0)|0)/255|0;Va=(ca(d[827568+(d[Da+(Xa+ -2)>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Wa=ca(d[Ta>>0]|0,255-Va|0)|0;a[Ta>>0]=(Wa+(ca(c[C>>2]|0,Va)|0)|0)/255|0}a[V+(Za+3)>>0]=-1;if(!Pa){break}Va=La;Wa=V+(Za+4)|0;Ua=Da+(Xa+3)|0;while(1){_a=(ca(d[827568+(d[Ua>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;ab=Wa+2|0;$a=ca(d[ab>>0]|0,255-_a|0)|0;a[ab>>0]=($a+(ca(c[A>>2]|0,_a)|0)|0)/255|0;_a=(ca(d[827568+(d[Ua+ -1>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;$a=Wa+1|0;ab=ca(d[$a>>0]|0,255-_a|0)|0;a[$a>>0]=(ab+(ca(c[B>>2]|0,_a)|0)|0)/255|0;_a=(ca(d[827568+(d[Ua+ -2>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;ab=ca(d[Wa>>0]|0,255-_a|0)|0;a[Wa>>0]=(ab+(ca(c[C>>2]|0,_a)|0)|0)/255|0;a[Wa+3>>0]=-1;Va=Va+1|0;if((Va|0)==(Oa|0)){break e}else{Wa=Wa+4|0;Ua=Ua+3|0}}}}if(Ma){Ua=Fa;Wa=Ta;Va=Ya;while(1){_a=d[Va>>0]|0;do{if(qa){ab=(ca(d[827568+_a>>0]|0,c[z>>2]|0)|0)/255|0;$a=Wa+2|0;bb=ca(d[$a>>0]|0,255-ab|0)|0;a[$a>>0]=(bb+(ca(c[A>>2]|0,ab)|0)|0)/255|0;ab=(ca(d[827568+(d[Va+1>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;bb=Wa+1|0;$a=ca(d[bb>>0]|0,255-ab|0)|0;a[bb>>0]=($a+(ca(c[B>>2]|0,ab)|0)|0)/255|0;ab=(ca(d[827568+(d[Va+2>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;$a=ca(d[Wa>>0]|0,255-ab|0)|0;a[Wa>>0]=($a+(ca(c[C>>2]|0,ab)|0)|0)/255|0;a[Wa+3>>0]=-1}else{ab=ca(d[827568+(((((d[Va+1>>0]|0)+_a+(d[Va+2>>0]|0)|0)>>>0)/3|0)&255)>>0]|0,c[z>>2]|0)|0;$a=(ab|0)/255|0;bb=Wa+3|0;cb=a[bb>>0]|0;hb=cb&255;if(cb<<24>>24==0){a[Wa>>0]=c[C>>2];a[Wa+1>>0]=(c[B>>2]<<8|c[C>>2])>>>8;a[Wa+2>>0]=(c[B>>2]<<8|c[A>>2]<<16|c[C>>2])>>>16;a[bb>>0]=(c[A>>2]<<16|$a<<24|c[B>>2]<<8|c[C>>2])>>>24;break}if((ab+254|0)>>>0<509){break}ab=hb+$a+((ca(hb,$a)|0)/-255|0)|0;a[bb>>0]=ab;bb=($a*255|0)/(ab&255|0)|0;ab=Wa+2|0;$a=255-bb|0;hb=ca(d[ab>>0]|0,$a)|0;a[ab>>0]=(hb+(ca(c[A>>2]|0,bb)|0)|0)/255|0;hb=Wa+1|0;ab=ca(d[hb>>0]|0,$a)|0;a[hb>>0]=(ab+(ca(c[B>>2]|0,bb)|0)|0)/255|0;ab=ca(d[Wa>>0]|0,$a)|0;a[Wa>>0]=(ab+(ca(c[C>>2]|0,bb)|0)|0)/255|0}}while(0);Ua=Ua+1|0;if((Ua|0)==(Ia|0)){break e}else{Wa=Wa+4|0;Va=Va+3|0}}}if(Na){do{if(pa){if(Ea){ib=(d[Ya>>0]|0)+(d[Da+(Xa+ -1)>>0]|0)+(d[Da+(Xa+1)>>0]|0)|0}else{ib=(d[Da+(Xa+1)>>0]|0)+(d[Ya>>0]|0)|0}Va=ca(d[827568+(((ib|0)/3|0)&255)>>0]|0,c[z>>2]|0)|0;Wa=(Va|0)/255|0;if((Va+254|0)>>>0<509){jb=V+(Za+4)|0;kb=Da+(Xa+3)|0;break}Va=V+(Za+3)|0;Ua=a[Va>>0]|0;_a=Ua&255;if(Ua<<24>>24==0){a[Ta>>0]=c[C>>2];a[V+(Za+1)>>0]=(c[B>>2]<<8|c[C>>2])>>>8;a[V+(Za+2)>>0]=(c[B>>2]<<8|c[A>>2]<<16|c[C>>2])>>>16;a[Va>>0]=(c[A>>2]<<16|Wa<<24|c[B>>2]<<8|c[C>>2])>>>24}else{Ua=_a+Wa+((ca(_a,Wa)|0)/-255|0)|0;a[Va>>0]=Ua;Va=(Wa*255|0)/(Ua&255|0)|0;Ua=V+(Za+2)|0;Wa=255-Va|0;_a=ca(d[Ua>>0]|0,Wa)|0;a[Ua>>0]=(_a+(ca(c[A>>2]|0,Va)|0)|0)/255|0;_a=V+(Za+1)|0;Ua=ca(d[_a>>0]|0,Wa)|0;a[_a>>0]=(Ua+(ca(c[B>>2]|0,Va)|0)|0)/255|0;Ua=ca(d[Ta>>0]|0,Wa)|0;a[Ta>>0]=(Ua+(ca(c[C>>2]|0,Va)|0)|0)/255|0}jb=V+(Za+4)|0;kb=Da+(Xa+3)|0}else{if(Ea){Va=(ca(d[827568+(d[Da+(Xa+ -1)>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Ua=V+(Za+2)|0;Wa=ca(d[Ua>>0]|0,255-Va|0)|0;a[Ua>>0]=(Wa+(ca(c[A>>2]|0,Va)|0)|0)/255|0}Va=(ca(d[827568+(d[Ya>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Wa=V+(Za+1)|0;Ua=ca(d[Wa>>0]|0,255-Va|0)|0;a[Wa>>0]=(Ua+(ca(c[B>>2]|0,Va)|0)|0)/255|0;Va=(ca(d[827568+(d[Da+(Xa+1)>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Ua=ca(d[Ta>>0]|0,255-Va|0)|0;a[Ta>>0]=(Ua+(ca(c[C>>2]|0,Va)|0)|0)/255|0;a[V+(Za+3)>>0]=-1;jb=V+(Za+4)|0;kb=Da+(Xa+3)|0}}while(0);if(Ka){lb=La;mb=jb;nb=kb}else{break}while(1){Va=d[nb+ -1>>0]|0;do{if(pa){Ua=ca(d[827568+(((((d[nb>>0]|0)+Va+(d[nb+1>>0]|0)|0)>>>0)/3|0)&255)>>0]|0,c[z>>2]|0)|0;Wa=(Ua|0)/255|0;_a=mb+3|0;bb=a[_a>>0]|0;ab=bb&255;if(bb<<24>>24==0){a[mb>>0]=c[C>>2];a[mb+1>>0]=(c[B>>2]<<8|c[C>>2])>>>8;a[mb+2>>0]=(c[B>>2]<<8|c[A>>2]<<16|c[C>>2])>>>16;a[_a>>0]=(c[A>>2]<<16|Wa<<24|c[B>>2]<<8|c[C>>2])>>>24;break}if((Ua+254|0)>>>0<509){break}Ua=ab+Wa+((ca(ab,Wa)|0)/-255|0)|0;a[_a>>0]=Ua;_a=(Wa*255|0)/(Ua&255|0)|0;Ua=mb+2|0;Wa=255-_a|0;ab=ca(d[Ua>>0]|0,Wa)|0;a[Ua>>0]=(ab+(ca(c[A>>2]|0,_a)|0)|0)/255|0;ab=mb+1|0;Ua=ca(d[ab>>0]|0,Wa)|0;a[ab>>0]=(Ua+(ca(c[B>>2]|0,_a)|0)|0)/255|0;Ua=ca(d[mb>>0]|0,Wa)|0;a[mb>>0]=(Ua+(ca(c[C>>2]|0,_a)|0)|0)/255|0}else{_a=(ca(d[827568+Va>>0]|0,c[z>>2]|0)|0)/255|0;Ua=mb+2|0;Wa=ca(d[Ua>>0]|0,255-_a|0)|0;a[Ua>>0]=(Wa+(ca(c[A>>2]|0,_a)|0)|0)/255|0;_a=(ca(d[827568+(d[nb>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Wa=mb+1|0;Ua=ca(d[Wa>>0]|0,255-_a|0)|0;a[Wa>>0]=(Ua+(ca(c[B>>2]|0,_a)|0)|0)/255|0;_a=(ca(d[827568+(d[nb+1>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Ua=ca(d[mb>>0]|0,255-_a|0)|0;a[mb>>0]=(Ua+(ca(c[C>>2]|0,_a)|0)|0)/255|0;a[mb+3>>0]=-1}}while(0);lb=lb+1|0;if((lb|0)==(Ia|0)){break}else{mb=mb+4|0;nb=nb+3|0}}}else{do{if(pa){if(Ea){ob=(d[Da+(Xa+ -1)>>0]|0)+(d[Da+(Xa+ -2)>>0]|0)+(d[Ya>>0]|0)|0}else{ob=d[Ya>>0]|0}Va=ca(d[827568+(((ob|0)/3|0)&255)>>0]|0,c[z>>2]|0)|0;_a=(Va|0)/255|0;if((Va+254|0)>>>0<509){pb=V+(Za+4)|0;qb=Da+(Xa+3)|0;break}Va=V+(Za+3)|0;Ua=a[Va>>0]|0;Wa=Ua&255;if(Ua<<24>>24==0){a[Ta>>0]=c[C>>2];a[V+(Za+1)>>0]=(c[B>>2]<<8|c[C>>2])>>>8;a[V+(Za+2)>>0]=(c[B>>2]<<8|c[A>>2]<<16|c[C>>2])>>>16;a[Va>>0]=(c[A>>2]<<16|_a<<24|c[B>>2]<<8|c[C>>2])>>>24}else{Ua=Wa+_a+((ca(Wa,_a)|0)/-255|0)|0;a[Va>>0]=Ua;Va=(_a*255|0)/(Ua&255|0)|0;Ua=V+(Za+2)|0;_a=255-Va|0;Wa=ca(d[Ua>>0]|0,_a)|0;a[Ua>>0]=(Wa+(ca(c[A>>2]|0,Va)|0)|0)/255|0;Wa=V+(Za+1)|0;Ua=ca(d[Wa>>0]|0,_a)|0;a[Wa>>0]=(Ua+(ca(c[B>>2]|0,Va)|0)|0)/255|0;Ua=ca(d[Ta>>0]|0,_a)|0;a[Ta>>0]=(Ua+(ca(c[C>>2]|0,Va)|0)|0)/255|0}pb=V+(Za+4)|0;qb=Da+(Xa+3)|0}else{if(Ea){Va=(ca(d[827568+(d[Da+(Xa+ -2)>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Ua=V+(Za+2)|0;_a=ca(d[Ua>>0]|0,255-Va|0)|0;a[Ua>>0]=(_a+(ca(c[A>>2]|0,Va)|0)|0)/255|0;Va=(ca(d[827568+(d[Da+(Xa+ -1)>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;_a=V+(Za+1)|0;Ua=ca(d[_a>>0]|0,255-Va|0)|0;a[_a>>0]=(Ua+(ca(c[B>>2]|0,Va)|0)|0)/255|0}Va=(ca(d[827568+(d[Ya>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Ua=ca(d[Ta>>0]|0,255-Va|0)|0;a[Ta>>0]=(Ua+(ca(c[C>>2]|0,Va)|0)|0)/255|0;a[V+(Za+3)>>0]=-1;pb=V+(Za+4)|0;qb=Da+(Xa+3)|0}}while(0);if(Ka){rb=La;sb=pb;tb=qb}else{break}while(1){Xa=d[tb+ -2>>0]|0;do{if(pa){Za=ca(d[827568+(((((d[tb+ -1>>0]|0)+Xa+(d[tb>>0]|0)|0)>>>0)/3|0)&255)>>0]|0,c[z>>2]|0)|0;Ta=(Za|0)/255|0;Ya=sb+3|0;Va=a[Ya>>0]|0;Ua=Va&255;if(Va<<24>>24==0){a[sb>>0]=c[C>>2];a[sb+1>>0]=(c[B>>2]<<8|c[C>>2])>>>8;a[sb+2>>0]=(c[B>>2]<<8|c[A>>2]<<16|c[C>>2])>>>16;a[Ya>>0]=(c[A>>2]<<16|Ta<<24|c[B>>2]<<8|c[C>>2])>>>24;break}if((Za+254|0)>>>0<509){break}Za=Ua+Ta+((ca(Ua,Ta)|0)/-255|0)|0;a[Ya>>0]=Za;Ya=(Ta*255|0)/(Za&255|0)|0;Za=sb+2|0;Ta=255-Ya|0;Ua=ca(d[Za>>0]|0,Ta)|0;a[Za>>0]=(Ua+(ca(c[A>>2]|0,Ya)|0)|0)/255|0;Ua=sb+1|0;Za=ca(d[Ua>>0]|0,Ta)|0;a[Ua>>0]=(Za+(ca(c[B>>2]|0,Ya)|0)|0)/255|0;Za=ca(d[sb>>0]|0,Ta)|0;a[sb>>0]=(Za+(ca(c[C>>2]|0,Ya)|0)|0)/255|0}else{Ya=(ca(d[827568+Xa>>0]|0,c[z>>2]|0)|0)/255|0;Za=sb+2|0;Ta=ca(d[Za>>0]|0,255-Ya|0)|0;a[Za>>0]=(Ta+(ca(c[A>>2]|0,Ya)|0)|0)/255|0;Ya=(ca(d[827568+(d[tb+ -1>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Ta=sb+1|0;Za=ca(d[Ta>>0]|0,255-Ya|0)|0;a[Ta>>0]=(Za+(ca(c[B>>2]|0,Ya)|0)|0)/255|0;Ya=(ca(d[827568+(d[tb>>0]|0)>>0]|0,c[z>>2]|0)|0)/255|0;Za=ca(d[sb>>0]|0,255-Ya|0)|0;a[sb>>0]=(Za+(ca(c[C>>2]|0,Ya)|0)|0)/255|0;a[sb+3>>0]=-1}}while(0);rb=rb+1|0;if((rb|0)==(Ia|0)){break}else{sb=sb+4|0;tb=tb+3|0}}}}}while(0);Ja=Ja+1|0}while((Ja|0)!=(Ba|0))}}while(0);ta=ta+1|0;if((ta|0)>=(e|0)){H=211;break}}if((H|0)==81){v2a(I);ka=0;break a}else if((H|0)==211){ub=c[w>>2]|0;vb=c[U>>2]|0;break}}else{ub=N;vb=S}}while(0);if((c[W>>2]|0)==1){$Ga(c[l>>2]|0,y,ub,vb,c[p>>2]|0)|0}else{ZGa(b,y,ub,vb,0)|0}v2a(I);ka=1}}while(0);PCa(y);M=ka;break}v2a(I);M=1}}while(0);sJa(L,h);F=M;i=o;return F|0}function lJa(a,b,d,e,f,h,j,k,l,m,n,o,p){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=+h;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;var q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;q=i;i=i+48|0;r=q+16|0;s=q;if((f|0)==0){t=EGa(BGa()|0)|0}else{t=f}f=mJa(t,e)|0;if((b|0)<=0){u=1;sJa(t,e);i=q;return u|0}v=r+12|0;w=r+20|0;x=r+16|0;y=r+8|0;z=r+4|0;A=(o|0)==0;B=(n|m|0)==0;C=s+4|0;D=((m|0)==0?p:p|2)|128;p=0;a:while(1){g[v>>2]=1.0;g[r>>2]=1.0;g[w>>2]=0.0;g[x>>2]=0.0;g[y>>2]=0.0;g[z>>2]=0.0;if((c[d+(p*44|0)+16>>2]|0)!=0){Tla(r,+g[d+(p*44|0)+20>>2],+g[d+(p*44|0)+24>>2],+g[d+(p*44|0)+28>>2],+g[d+(p*44|0)+32>>2],0.0,0.0)}Vla(r,h,0.0,0.0,h,+g[d+(p*44|0)+4>>2],+g[d+(p*44|0)+8>>2]);E=oJa(f,e,c[d+(p*44|0)>>2]|0,c[d+(p*44|0)+12>>2]|0)|0;do{if((E|0)!=0){Wla(r,j);SIa(s,E);$Ia(s,r);if(B){if(!A){F=11}}else{G=(UGa(a,s,k,l,m,n,D,0)|0)==0;if(G|A){PIa(c[C>>2]|0);if((G&1|0)==0){break}else{u=0;F=15;break a}}else{F=11}}if((F|0)==11){F=0;VIa(o,s,k)}PIa(c[C>>2]|0)}}while(0);p=p+1|0;if((p|0)>=(b|0)){u=1;F=15;break}}if((F|0)==15){sJa(t,e);i=q;return u|0}return 0}function mJa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+16|0;e=d;f=c[b>>2]|0;g=(f|0)==0;if(g){h=c[c[b+4>>2]>>2]|0}else{h=f}f=g?a+28|0:a+4|0;c[e>>2]=0;if((rJa(f,h,e)|0)!=0){a=c[e>>2]|0;b=a+4|0;c[b>>2]=(c[b>>2]|0)+1;j=c[a>>2]|0;i=d;return j|0}a=u2a(84)|0;uJa(a,g?0:h);if((a|0)==0){j=0;i=d;return j|0}g=u2a(8)|0;c[e>>2]=g;if((g|0)==0){vJa(a);v2a(a);j=0;i=d;return j|0}else{c[g+4>>2]=2;c[g>>2]=a;c[(Gma(f,h)|0)>>2]=g;j=a;i=d;return j|0}return 0}function nJa(a,b,d,e,f,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;k=i;i=i+192|0;l=k;m=k+48|0;n=k+40|0;if((d|0)==-1){o=0;i=k;return o|0}p=c[b+4>>2]|0;q=~~(+g[f>>2]*1.0e4);r=~~(+g[f+4>>2]*1.0e4);s=~~(+g[f+8>>2]*1.0e4);t=~~(+g[f+12>>2]*1.0e4);if((p|0)==0){c[l>>2]=q;c[l+4>>2]=r;c[l+8>>2]=s;c[l+12>>2]=t;c[l+16>>2]=h;c[l+20>>2]=j;yJa(m,6,l)}else{u=c[p+16>>2]|0;v=c[p+20>>2]|0;p=c[b+64>>2]|0;c[l>>2]=q;c[l+4>>2]=r;c[l+8>>2]=s;c[l+12>>2]=t;c[l+16>>2]=h;c[l+20>>2]=j;c[l+24>>2]=u;c[l+28>>2]=v;c[l+32>>2]=p;yJa(m,9,l)}yF(n,m,c[m+128>>2]|0);o=wJa(a,b,f,n,d,e,h,j)|0;i=k;return o|0}function oJa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+16|0;g=f;if((c[a>>2]|0)==0|(d|0)==-1){h=0;i=f;return h|0}c[g>>2]=0;j=c[b+4>>2]|0;if((j|0)==0){k=d}else{k=(((c[j+16>>2]|0)/16|0)<<15)+d+(((c[j+20>>2]|0)/2|0)<<21)+(((e|0)/16|0)<<25)+(c[b+64>>2]<<31)|0}j=k;k=a+28|0;if((Dma(k,j,g)|0)==0){a=BJa(b,d,e)|0;c[g>>2]=a;c[(Gma(k,j)|0)>>2]=a;h=a;i=f;return h|0}else{h=c[g>>2]|0;i=f;return h|0}return 0}function pJa(a){a=a|0;var b=0;b=i;qJa(a,1);Bma(a+28|0);Bma(a+4|0);i=b;return}function qJa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;i=i+32|0;e=d+16|0;f=d+12|0;g=d+8|0;h=d+4|0;j=d;k=a+4|0;l=(c[a+12>>2]|0)==0;c[e>>2]=l?0:-1;if(!l){l=(b|0)==0;do{tJa(k,e,f,g);m=c[g>>2]|0;if(!(l?!((c[m+4>>2]|0)>>>0<2):0)){n=c[m>>2]|0;if((n|0)!=0){vJa(n);v2a(n)}if((m|0)!=0){v2a(m)}Jma(k,c[f>>2]|0)}}while((c[e>>2]|0)!=0)}f=a+28|0;k=(c[a+36>>2]|0)==0;c[e>>2]=k?0:-1;if(k){i=d;return}k=(b|0)==0;do{tJa(f,e,h,j);b=c[j>>2]|0;if(!(k?!((c[b+4>>2]|0)>>>0<2):0)){a=c[b>>2]|0;if((a|0)!=0){vJa(a);v2a(a)}if((b|0)!=0){v2a(b)}Jma(f,c[h>>2]|0)}}while((c[e>>2]|0)!=0);i=d;return}function rJa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e;c[f>>2]=0;if((Dma(a,b,f)|0)==0){g=0;i=e;return g|0}c[d>>2]=c[f>>2];g=1;i=e;return g|0}function sJa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;e=d;f=c[b>>2]|0;g=(f|0)==0;if(g){h=c[c[b+4>>2]>>2]|0}else{h=f}c[e>>2]=0;if((rJa(g?a+28|0:a+4|0,h,e)|0)==0){i=d;return}h=(c[e>>2]|0)+4|0;e=c[h>>2]|0;if(!(e>>>0>1)){i=d;return}c[h>>2]=e+ -1;i=d;return}function tJa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;i=i+16|0;g=f+4|0;h=f;c[g>>2]=0;c[h>>2]=0;Cma(a,b,g,h);c[d>>2]=c[g>>2];c[e>>2]=c[h>>2];i=f;return}function uJa(a,b){a=a|0;b=b|0;var d=0;d=i;Lma(a+4|0,10);zma(a+28|0,10);c[a>>2]=b;c[a+52>>2]=0;i=d;return}function vJa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;i=i+32|0;d=b+16|0;e=b+12|0;f=b+8|0;g=b+4|0;h=b;j=a+4|0;k=(c[a+12>>2]|0)==0;c[d>>2]=k?0:-1;c[e>>2]=0;c[f>>2]=0;if(!k){do{Oma(j,d,e,f);k=c[f>>2]|0;if((k|0)!=0){zJa(k);v2a(k)}}while((c[d>>2]|0)!=0)}Mma(j);f=a+28|0;k=(c[a+36>>2]|0)==0;c[d>>2]=k?0:-1;if(!k){do{Cma(f,d,g,h);k=c[h>>2]|0;if((k|0)!=0){PIa(c[k+4>>2]|0);v2a(k)}}while((c[d>>2]|0)!=0)}d=c[a+52>>2]|0;if((d|0)==0){Ama(f);dka(e);Bma(f);Nma(j);i=b;return}Rc[c[(c[d>>2]|0)+4>>2]&1023](d);Ama(f);dka(e);Bma(f);Nma(j);i=b;return}function wJa(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0;k=i;i=i+16|0;l=k+4|0;m=k;c[l>>2]=0;n=a+4|0;do{if((Wma(n,e,l)|0)==0){o=u2a(28)|0;HJa(o);c[l>>2]=o;if((o|0)==0){p=0;i=k;return p|0}else{c[(Qma(n,e)|0)>>2]=o;q=o;break}}else{q=c[l>>2]|0}}while(0);c[m>>2]=0;l=q+4|0;q=f;if((Dma(l,q,m)|0)!=0){p=c[m>>2]|0;i=k;return p|0}e=xJa(a,b,f,g,d,h,j)|0;c[m>>2]=e;if((e|0)==0){p=0;i=k;return p|0}c[(Gma(l,q)|0)>>2]=e;p=e;i=k;return p|0}function xJa(b,e,f,h,j,k,l){b=b|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0.0,K=0;m=i;i=i+16|0;n=m;o=c[b>>2]|0;if((o|0)==0){p=0;i=m;return p|0}q=~~(+g[j>>2]*.015625*65536.0);c[n>>2]=q;r=~~(+g[j+8>>2]*.015625*65536.0);s=n+4|0;c[s>>2]=r;t=~~(+g[j+4>>2]*.015625*65536.0);u=n+8|0;c[u>>2]=t;v=~~(+g[j+12>>2]*.015625*65536.0);c[n+12>>2]=v;j=c[e+4>>2]|0;w=(j|0)!=0;if(w){x=(h|0)!=0&(c[j+24>>2]|0)!=0;h=x&1;if(x){y=(c[j+32>>2]|0)!=0?-15:0}else{y=c[j+20>>2]|0}do{if((y|0)!=0){if((y|0)<-29){z=-58}else{z=0-(a[827824+(0-y)>>0]|0)|0}if((c[e+64>>2]|0)==0){c[s>>2]=r+((ca(q,0-z|0)|0)/100|0);break}else{c[u>>2]=t+((ca(v,z)|0)/100|0);break}}}while(0);if((c[j+12>>2]&1|0)==0){A=o;B=h}else{AJa(e,f,k,c[j+16>>2]|0);A=c[b>>2]|0;B=h}}else{A=o;B=0}o=c[(c[A+128>>2]|0)+24>>2]|0;uEa(A,n);A=c[b>>2]|0;if((JDa(A,f,(c[A+8>>2]|0)>>>2&2^10)|0)!=0){c[(c[(c[b>>2]|0)+128>>2]|0)+24>>2]=o;p=0;i=m;return p|0}if((B|0)==0){if(w){C=j+16|0;D=20}}else{if(w){C=j+28|0;D=20}}if((D|0)==20?(w=c[C>>2]|0,(w|0)>400?(c[j+12>>2]&1|0)==0:0):0){C=w+ -400|0;w=(C|0)/10|0;if((C|0)>999){c[(c[(c[b>>2]|0)+128>>2]|0)+24>>2]=o;p=0;i=m;return p|0}if((c[j+8>>2]|0)==128){j=c[n>>2]|0;C=c[s>>2]|0;E=ca(d[827960+w>>0]<<1,((C|0)>-1?C:0-C|0)+((j|0)>-1?j:0-j|0)|0)|0}else{j=c[n>>2]|0;n=c[s>>2]|0;E=ca(((n|0)>-1?n:0-n|0)+((j|0)>-1?j:0-j|0)|0,d[827856+w>>0]|0)|0}rFa((c[(c[b>>2]|0)+84>>2]|0)+108|0,(E|0)/36655|0)}QJa(c[(c[(BGa()|0)+264>>2]|0)+32>>2]|0);E=(zEa(c[(c[b>>2]|0)+84>>2]|0,l)|0)==0;w=c[b>>2]|0;if(!E){c[(c[w+128>>2]|0)+24>>2]=o;p=0;i=m;return p|0}E=c[w+84>>2]|0;j=c[E+80>>2]|0;n=c[E+76>>2]|0;if((j|0)>2048|(n|0)>2048){c[(c[w+128>>2]|0)+24>>2]=o;p=0;i=m;return p|0}w=u2a(48)|0;E=w+8|0;ICa(E);if((w|0)==0){p=0;i=m;return p|0}s=(l|0)==2;JCa(E,j,n,s?257:264,0)|0;E=(c[b>>2]|0)+84|0;c[w+4>>2]=c[(c[E>>2]|0)+100>>2];c[w>>2]=c[(c[E>>2]|0)+104>>2];C=c[w+32>>2]|0;B=c[E>>2]|0;E=c[B+84>>2]|0;A=c[w+40>>2]|0;f=c[B+88>>2]|0;do{if(s){f3a(A|0,0,ca(C,n)|0)|0;if((a[(c[(c[b>>2]|0)+84>>2]|0)+94>>0]|0)==1){h=(E|0)>-1?E:0-E|0;k=(h|0)>(C|0)?C:h;if((n|0)>0){h=0;do{c3a(A+(ca(h,C)|0)|0,f+(ca(h,E)|0)|0,k|0)|0;h=h+1|0}while((h|0)!=(n|0))}}else{D=44}}else{if((a[B+94>>0]|0)!=1){f3a(A|0,0,ca(C,n)|0)|0;D=44;break}h=(l|0)==3?3:1;if((n|0)>0){k=(j|0)>0;e=0;do{z=ca(C,e)|0;if(k){v=ca(e,E)|0;t=0;do{u=A+(z+(ca(h,t)|0))|0;f3a(u|0,((d[f+(((t|0)/8|0)+v)>>0]&128>>>(t&7)|0)!=0)<<31>>31|0,h|0)|0;t=t+1|0}while((t|0)!=(j|0))}e=e+1|0}while((e|0)!=(n|0))}}}while(0);if((D|0)==44){D=(n|0)>0;if(D){l=(j|0)>0;B=0;s=255;e=0;while(1){if(l){h=0;k=B;t=s;v=f+(ca(e,E)|0)|0;while(1){z=d[v>>0]|0;u=(z|0)>(k|0)?z:k;q=(z|0)<(t|0)?z:t;h=h+1|0;if((h|0)==(j|0)){F=u;G=q;break}else{k=u;t=q;v=v+1|0}}}else{F=B;G=s}e=e+1|0;if((e|0)==(n|0)){H=F;I=G;break}else{B=F;s=G}}}else{H=0;I=255}G=H-I|0;if((H|0)==(I|0)|(G|0)==255){H=(E|0)>-1?E:0-E|0;s=(H|0)>(C|0)?C:H;if(D){H=0;do{c3a(A+(ca(H,C)|0)|0,f+(ca(H,E)|0)|0,s|0)|0;H=H+1|0}while((H|0)!=(n|0))}}else{J=255.0/+(G|0);if(D){D=(j|0)>0;G=0;do{if(D){H=0;s=A+(ca(G,C)|0)|0;F=f+(ca(G,E)|0)|0;while(1){B=~~(J*+((d[F>>0]|0)-I|0)+.5);if((B|0)>255){K=-1}else{K=(B|0)<0?0:B&255}a[s>>0]=K;H=H+1|0;if((H|0)==(j|0)){break}else{s=s+1|0;F=F+1|0}}}G=G+1|0}while((G|0)!=(n|0))}}G=FGa(BGa()|0)|0;j=ca(C,n)|0;if((j|0)>0){n=0;do{C=A+n|0;a[C>>0]=a[G+(d[C>>0]|0)>>0]|0;n=n+1|0}while((n|0)!=(j|0))}}c[(c[(c[b>>2]|0)+128>>2]|0)+24>>2]=o;p=w;i=m;return p|0}function yJa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e;c[f>>2]=d;if((b|0)>0){d=0;do{g=c[f>>2]|0;h=c[g>>2]|0;c[f>>2]=g+4;c[a+(d<<2)>>2]=h;d=d+1|0}while((d|0)!=(b|0))}c[a+128>>2]=b<<2;i=e;return}function zJa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+16|0;d=b+8|0;e=b+4|0;f=b;g=a+4|0;h=(c[a+12>>2]|0)==0;c[d>>2]=h?0:-1;c[f>>2]=0;if(h){Ama(g);Bma(g);i=b;return}do{Cma(g,d,e,f);h=c[f>>2]|0;if((h|0)!=0){PCa(h+8|0);v2a(h)}}while((c[d>>2]|0)!=0);Ama(g);Bma(g);i=b;return}function AJa(a,b,d,f){a=a|0;b=b|0;d=d|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=i;i=i+16|0;h=g+8|0;j=g;c[h>>2]=0;TJa(c[a>>2]|0,h);k=c[h>>2]|0;if((k|0)==0){i=g;return}if((f|0)==0){l=k+12|0;c[j>>2]=(c[(c[l>>2]|0)+8>>2]|0)/65536|0;m=l}else{c[j>>2]=f;m=k+12|0}f=c[m>>2]|0;do{if((d|0)!=0){m=(c[f+28>>2]|0)/65536|0;l=(c[f+36>>2]|0)/65536|0;n=j+4|0;c[n>>2]=m;UJa(c[a>>2]|0,j);JDa(c[a>>2]|0,b,513)|0;o=c[a>>2]|0;p=((c[(c[o+84>>2]|0)+40>>2]|0)*1e3|0)/(e[o+68>>1]|0|0)|0;c[n>>2]=l;UJa(o,j);JDa(c[a>>2]|0,b,513)|0;o=c[a>>2]|0;q=((c[(c[o+84>>2]|0)+40>>2]|0)*1e3|0)/(e[o+68>>1]|0|0)|0;if((q|0)==(p|0)){i=g;return}else{c[n>>2]=((ca(d-p|0,l-m|0)|0)/(q-p|0)|0)+m;r=j;s=o;t=c[h>>2]|0;break}}else{c[j+4>>2]=(c[f+32>>2]|0)/65536|0;r=j;s=c[a>>2]|0;t=k}}while(0);k=c[s+100>>2]|0;Ic[c[k+12>>2]&511](k,t);UJa(c[a>>2]|0,r);i=g;return}function BJa(b,e,f){b=b|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;h=i;i=i+64|0;j=h+48|0;k=h+24|0;l=h;m=c[b>>2]|0;if((m|0)==0){n=0;i=h;return n|0}SEa(m,0)|0;c[j+0>>2]=c[828064>>2];c[j+4>>2]=c[828068>>2];c[j+8>>2]=c[828072>>2];c[j+12>>2]=c[828076>>2];m=b+4|0;o=c[m>>2]|0;if((o|0)!=0){p=c[o+20>>2]|0;do{if((p|0)!=0){if((p|0)<-29){q=-58}else{q=0-(a[827824+(0-p)>>0]|0)|0}if((c[b+64>>2]|0)==0){c[j+4>>2]=(0-q<<16|0)/100|0;break}else{c[j+8>>2]=(q<<16|0)/100|0;break}}}while(0);if((c[o+12>>2]&1|0)!=0){AJa(b,e,f,c[o+16>>2]|0)}}o=c[b>>2]|0;f=c[(c[o+128>>2]|0)+24>>2]|0;uEa(o,j);j=c[b>>2]|0;if((JDa(j,e,(c[j+8>>2]|0)>>>2&2^10)|0)!=0){c[(c[(c[b>>2]|0)+128>>2]|0)+24>>2]=f;n=0;i=h;return n|0}j=c[m>>2]|0;if(((j|0)!=0?(c[j+12>>2]&1|0)==0:0)?(m=c[j+16>>2]|0,(m|0)>400):0){e=(m+ -400|0)/10|0;if((c[j+8>>2]|0)==128){r=(d[827960+e>>0]<<17>>>0)/36655|0}else{r=d[828080+e>>0]<<1}rFa((c[(c[b>>2]|0)+84>>2]|0)+108|0,r)}c[k>>2]=283;c[k+4>>2]=284;c[k+8>>2]=223;c[k+12>>2]=301;c[k+16>>2]=0;c[k+20>>2]=0;c[l>>2]=1;r=l+4|0;c[r>>2]=0;kFa((c[(c[b>>2]|0)+84>>2]|0)+108|0,k,l)|0;if((c[r>>2]|0)==0){c[(c[(c[b>>2]|0)+128>>2]|0)+24>>2]=f;n=0;i=h;return n|0}e=u2a(12)|0;OIa(e);if((e|0)==0){n=0;i=h;return n|0}QIa(e,c[r>>2]|0);c[l>>2]=0;c[r>>2]=0;j=e+4|0;c[l+8>>2]=c[j>>2];c[l+16>>2]=0;c[l+12>>2]=0;g[l+20>>2]=4096.0;kFa((c[(c[b>>2]|0)+84>>2]|0)+108|0,k,l)|0;CJa(l);TIa(e,c[r>>2]|0);l=c[r>>2]|0;if((l|0)!=0){r=(c[j>>2]|0)+((l+ -1|0)*12|0)+8|0;c[r>>2]=c[r>>2]|1}c[(c[(c[b>>2]|0)+128>>2]|0)+24>>2]=f;n=e;i=h;return n|0}function CJa(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0.0,l=0.0;b=i;d=a+4|0;e=c[d>>2]|0;if((e|0)<=1){i=b;return}f=e+ -2|0;h=c[a+8>>2]|0;if(((c[h+(f*12|0)+8>>2]|0)==6?(a=e+ -1|0,+g[h+(f*12|0)>>2]==+g[h+(a*12|0)>>2]):0)?+g[h+(f*12|0)+4>>2]==+g[h+(a*12|0)+4>>2]:0){c[d>>2]=f;j=f}else{j=e}if((j|0)<=3){i=b;return}e=j+ -4|0;if((c[h+(e*12|0)+8>>2]|0)!=6){i=b;return}f=j+ -3|0;if((c[h+(f*12|0)+8>>2]|0)!=4){i=b;return}k=+g[h+(e*12|0)>>2];if(!(+g[h+(f*12|0)>>2]==k)){i=b;return}l=+g[h+(e*12|0)+4>>2];if(!(+g[h+(f*12|0)+4>>2]==l)){i=b;return}f=j+ -2|0;if(!(+g[h+(f*12|0)>>2]==k)){i=b;return}if(!(+g[h+(f*12|0)+4>>2]==l)){i=b;return}f=j+ -1|0;if(!(+g[h+(f*12|0)>>2]==k)){i=b;return}if(!(+g[h+(f*12|0)+4>>2]==l)){i=b;return}c[d>>2]=e;i=b;return}function DJa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0;d=i;if((c[b>>2]|0)!=0){e=b+4|0;f=c[e>>2]|0;h=f+1|0;c[e>>2]=h;i=d;return 0}CJa(b);j=b+20|0;k=b+4|0;l=b+8|0;g[(c[l>>2]|0)+((c[k>>2]|0)*12|0)>>2]=+(c[a>>2]|0)/+g[j>>2];m=a+4|0;g[(c[l>>2]|0)+((c[k>>2]|0)*12|0)+4>>2]=+(c[m>>2]|0)/+g[j>>2];c[(c[l>>2]|0)+((c[k>>2]|0)*12|0)+8>>2]=6;c[b+12>>2]=c[a>>2];c[b+16>>2]=c[m>>2];m=c[k>>2]|0;if((m|0)==0){e=k;f=c[e>>2]|0;h=f+1|0;c[e>>2]=h;i=d;return 0}b=(c[l>>2]|0)+((m+ -1|0)*12|0)+8|0;c[b>>2]=c[b>>2]|1;e=k;f=c[e>>2]|0;h=f+1|0;c[e>>2]=h;i=d;return 0}function EJa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0;d=i;if((c[b>>2]|0)==0){e=b+20|0;f=b+4|0;h=b+8|0;g[(c[h>>2]|0)+((c[f>>2]|0)*12|0)>>2]=+(c[a>>2]|0)/+g[e>>2];j=a+4|0;g[(c[h>>2]|0)+((c[f>>2]|0)*12|0)+4>>2]=+(c[j>>2]|0)/+g[e>>2];c[(c[h>>2]|0)+((c[f>>2]|0)*12|0)+8>>2]=2;c[b+12>>2]=c[a>>2];c[b+16>>2]=c[j>>2];k=f;l=c[k>>2]|0;m=l+1|0;c[k>>2]=m;i=d;return 0}else{k=b+4|0;l=c[k>>2]|0;m=l+1|0;c[k>>2]=m;i=d;return 0}return 0}function FJa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;if((c[d>>2]|0)==0){f=d+12|0;h=c[f>>2]|0;j=d+20|0;k=d+4|0;l=d+8|0;g[(c[l>>2]|0)+((c[k>>2]|0)*12|0)>>2]=+((((c[a>>2]|0)-h<<1|0)/3|0)+h|0)/+g[j>>2];h=d+16|0;m=c[h>>2]|0;n=a+4|0;g[(c[l>>2]|0)+((c[k>>2]|0)*12|0)+4>>2]=+((((c[n>>2]|0)-m<<1|0)/3|0)+m|0)/+g[j>>2];c[(c[l>>2]|0)+((c[k>>2]|0)*12|0)+8>>2]=4;m=c[a>>2]|0;g[(c[l>>2]|0)+(((c[k>>2]|0)+1|0)*12|0)>>2]=+((((c[b>>2]|0)-m|0)/3|0)+m|0)/+g[j>>2];m=c[n>>2]|0;n=b+4|0;g[(c[l>>2]|0)+(((c[k>>2]|0)+1|0)*12|0)+4>>2]=+((((c[n>>2]|0)-m|0)/3|0)+m|0)/+g[j>>2];c[(c[l>>2]|0)+(((c[k>>2]|0)+1|0)*12|0)+8>>2]=4;g[(c[l>>2]|0)+(((c[k>>2]|0)+2|0)*12|0)>>2]=+(c[b>>2]|0)/+g[j>>2];g[(c[l>>2]|0)+(((c[k>>2]|0)+2|0)*12|0)+4>>2]=+(c[n>>2]|0)/+g[j>>2];c[(c[l>>2]|0)+(((c[k>>2]|0)+2|0)*12|0)+8>>2]=4;c[f>>2]=c[b>>2];c[h>>2]=c[n>>2];o=k;p=c[o>>2]|0;q=p+3|0;c[o>>2]=q;i=e;return 0}else{o=d+4|0;p=c[o>>2]|0;q=p+3|0;c[o>>2]=q;i=e;return 0}return 0}function GJa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;if((c[e>>2]|0)==0){h=e+20|0;j=e+4|0;k=e+8|0;g[(c[k>>2]|0)+((c[j>>2]|0)*12|0)>>2]=+(c[a>>2]|0)/+g[h>>2];g[(c[k>>2]|0)+((c[j>>2]|0)*12|0)+4>>2]=+(c[a+4>>2]|0)/+g[h>>2];c[(c[k>>2]|0)+((c[j>>2]|0)*12|0)+8>>2]=4;g[(c[k>>2]|0)+(((c[j>>2]|0)+1|0)*12|0)>>2]=+(c[b>>2]|0)/+g[h>>2];g[(c[k>>2]|0)+(((c[j>>2]|0)+1|0)*12|0)+4>>2]=+(c[b+4>>2]|0)/+g[h>>2];c[(c[k>>2]|0)+(((c[j>>2]|0)+1|0)*12|0)+8>>2]=4;g[(c[k>>2]|0)+(((c[j>>2]|0)+2|0)*12|0)>>2]=+(c[d>>2]|0)/+g[h>>2];b=d+4|0;g[(c[k>>2]|0)+(((c[j>>2]|0)+2|0)*12|0)+4>>2]=+(c[b>>2]|0)/+g[h>>2];c[(c[k>>2]|0)+(((c[j>>2]|0)+2|0)*12|0)+8>>2]=4;c[e+12>>2]=c[d>>2];c[e+16>>2]=c[b>>2];l=j;m=c[l>>2]|0;n=m+3|0;c[l>>2]=n;i=f;return 0}else{l=e+4|0;m=c[l>>2]|0;n=m+3|0;c[l>>2]=n;i=f;return 0}return 0}function HJa(a){a=a|0;var b=0,c=0;b=i;c=a+4|0;zma(c,10);Hma(c,253,1);i=b;return}function IJa(a,b,d,e,f,h,j,k,l){a=a|0;b=+b;d=+d;e=+e;f=+f;h=+h;j=+j;k=+k;l=+l;var m=0;m=i;c[a+16>>2]=0;g[a>>2]=.25;g[a+4>>2]=4.0;JJa(a,b,d,e,f,h,j,k,l);c[a+12>>2]=0;i=m;return}function JJa(a,b,d,e,f,h,j,k,l){a=a|0;b=+b;d=+d;e=+e;f=+f;h=+h;j=+j;k=+k;l=+l;var m=0,n=0,o=0,p=0;m=i;i=i+32|0;n=m+12|0;o=m;p=a+16|0;g[n>>2]=b;g[n+4>>2]=d;c[n+8>>2]=0;Wza(p,n);KJa(a,b,d,e,f,h,j,k,l,0);g[o>>2]=k;g[o+4>>2]=l;c[o+8>>2]=0;Wza(p,o);i=m;return}function KJa(a,b,d,e,f,h,j,k,l,m){a=a|0;b=+b;d=+d;e=+e;f=+f;h=+h;j=+j;k=+k;l=+l;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0.0;n=i;i=i+48|0;o=n+36|0;p=n+24|0;q=n+12|0;r=n;if(m>>>0>16){i=n;return}s=(b+e)*.5;t=(d+f)*.5;u=(e+h)*.5;v=(f+j)*.5;w=(h+k)*.5;x=(j+l)*.5;y=(s+u)*.5;z=(t+v)*.5;A=(u+w)*.5;B=(v+x)*.5;C=(y+A)*.5;D=(z+B)*.5;E=k-b;F=l-d;G=+R(+((e-k)*F-E*(f-l)));H=+R(+((h-k)*F-E*(j-l)));I=(G>1.0000000031710769e-30&1)<<1|H>1.0000000031710769e-30;if((I|0)==2){if(G*G<=(E*E+F*F)*+g[a>>2]){g[q>>2]=u;g[q+4>>2]=v;c[q+8>>2]=128;Wza(a+16|0,q);i=n;return}}else if((I|0)==0){J=+R(+(b+h-e-e))+ +R(+(d+j-f-f))+ +R(+(e+k-h-h))+ +R(+(f+l-j-j));if(J<=+g[a+4>>2]){g[o>>2]=C;g[o+4>>2]=D;c[o+8>>2]=128;Wza(a+16|0,o);i=n;return}}else if((I|0)==1){if(H*H<=(E*E+F*F)*+g[a>>2]){g[p>>2]=u;g[p+4>>2]=v;c[p+8>>2]=128;Wza(a+16|0,p);i=n;return}}else if((I|0)==3?(J=G+H,J*J<=(E*E+F*F)*+g[a>>2]):0){g[r>>2]=u;g[r+4>>2]=v;c[r+8>>2]=128;Wza(a+16|0,r);i=n;return}r=m+1|0;KJa(a,b,d,s,t,y,z,C,D,r);KJa(a,C,D,A,B,w,x,k,l,r);i=n;return}function LJa(a){a=a|0;var b=0;b=i;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=0;i=b;return}function MJa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;i=i+16|0;f=e;c[f>>2]=0;g=c[b+8>>2]|0;if((b|0)==(d|0)){h=0;i=e;return h|0}j=b+12|0;if((c[j>>2]|0)==0){c[d+0>>2]=c[b+0>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];c[d+16>>2]=c[b+16>>2];c[d+20>>2]=c[b+20>>2];h=0;i=e;return h|0}k=ca(c[b>>2]|0,(g|0)<0?0-g|0:g)|0;g=d+12|0;l=c[g>>2]|0;if((l|0)!=0){m=c[d+8>>2]|0;n=ca((m|0)<0?0-m|0:m,c[d>>2]|0)|0;if((n|0)==(k|0)){o=l}else{m=PFa(a,1,n,k,l,f)|0;c[g>>2]=m;o=m}}else{m=EFa(a,k,f)|0;c[g>>2]=m;o=m}m=c[f>>2]|0;if((m|0)!=0){h=m;i=e;return h|0}c[d+0>>2]=c[b+0>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];c[d+16>>2]=c[b+16>>2];c[d+20>>2]=c[b+20>>2];c[g>>2]=o;c3a(o|0,c[j>>2]|0,k|0)|0;h=0;i=e;return h|0}function NJa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((a|0)==0){e=33;i=d;return e|0}if((b|0)==0){e=6;i=d;return e|0}aEa(c[a>>2]|0,c[b+12>>2]|0);c[b+0>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b+16>>2]=0;c[b+20>>2]=0;e=0;i=d;return e|0}function OJa(a){a=a|0;var b=0,d=0,e=0;b=i;d=1277232;e=1273328;do{eFa(a,d);e=e+4|0;d=c[e>>2]|0}while((d|0)!=0);i=b;return}function PJa(a){a=a|0;var b=0,d=0;b=i;d=lGa()|0;if((d|0)==0){i=b;return}if((jFa(d,a)|0)==0){OJa(c[a>>2]|0);i=b;return}else{pGa(d);i=b;return}}function QJa(b){b=b|0;var d=0,e=0;d=i;if((b|0)==0){i=d;return}e=b+196|0;a[e+0>>0]=a[1273384>>0]|0;a[e+1>>0]=a[1273385>>0]|0;a[e+2>>0]=a[1273386>>0]|0;a[e+3>>0]=a[1273387>>0]|0;a[e+4>>0]=a[1273388>>0]|0;c[b+204>>2]=204;c[b+192>>2]=2;c[b+188>>2]=1;i=d;return}\n\n\n\nfunction DYa(a,b,d,e,f,h,j,k){a=a|0;b=b|0;d=+d;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0.0,Ra=0.0,Sa=0.0,Ta=0.0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0.0,_a=0.0,$a=0.0,ab=0.0,bb=0.0;l=i;i=i+640|0;m=l+616|0;n=l+608|0;o=l+600|0;p=l+596|0;q=l+592|0;r=l+584|0;s=l+576|0;t=l+568|0;u=l+560|0;v=l+552|0;w=l+544|0;x=l+536|0;y=l+528|0;z=l+520|0;A=l+512|0;B=l+508|0;C=l+504|0;D=l+496|0;E=l+488|0;F=l+480|0;G=l+472|0;H=l+464|0;I=l+456|0;J=l+448|0;K=l+440|0;L=l+432|0;M=l+424|0;N=l+416|0;O=l+408|0;P=l+400|0;Q=l+392|0;R=l+384|0;S=l+376|0;T=l+372|0;U=l+368|0;V=l+360|0;W=l+352|0;X=l+344|0;Y=l+336|0;Z=l+328|0;_=l+320|0;$=l+312|0;aa=l+304|0;ba=l+296|0;ca=l+288|0;da=l+280|0;ea=l+272|0;fa=l+264|0;ga=l+260|0;ha=l+256|0;ia=l+248|0;ja=l+240|0;ka=l+232|0;la=l+224|0;ma=l+216|0;na=l+208|0;oa=l+200|0;pa=l+192|0;qa=l+184|0;ra=l+176|0;sa=l+168|0;ta=l+160|0;ua=l+152|0;va=l+148|0;wa=l+144|0;xa=l+136|0;ya=l+128|0;za=l+120|0;Aa=l+112|0;Ba=l+104|0;Ca=l+96|0;Da=l+88|0;Ea=l+80|0;Fa=l+72|0;Ga=l+68|0;Ha=l+64|0;Ia=l+56|0;Ja=l+48|0;Ka=l+40|0;La=l+32|0;Ma=l+24|0;Na=l+16|0;Oa=l+8|0;Pa=l;gla(m);c[n>>2]=0;Qa=+g[b>>2];Ra=+g[b+4>>2];Sa=+g[b+12>>2];Ta=+g[b+8>>2];if(!(d>0.0)){Ua=m+4|0;Va=c[Ua>>2]|0;Wa=m+8|0;Xa=c[Wa>>2]|0;pla(Pa,Va,Xa);jka(a,Pa);dka(n);Ya=c[Ua>>2]|0;ila(Ya);i=l;return}Za=d*.5;pe(o,1293864);qla(m,c[o>>2]|0,c[o+4>>2]|0)|0;if((j|0)==1){c[C>>2]=0;vYa(B,e,C);ika(n,B);dka(B);B=c[n>>2]|0;if((B|0)!=0?(c[B+4>>2]|0)>0:0){oe(D,n);qla(m,c[D>>2]|0,c[D+4>>2]|0)|0;D=tla(m,d)|0;pe(E,1291984);B=qla(D,c[E>>2]|0,c[E+4>>2]|0)|0;pe(F,1291992);E=qla(B,c[F>>2]|0,c[F+4>>2]|0)|0;F=rla(E,c[k>>2]|0)|0;pe(G,1305864);E=qla(F,c[G>>2]|0,c[G+4>>2]|0)|0;G=rla(E,c[k+4>>2]|0)|0;pe(H,1292e3);E=qla(G,c[H>>2]|0,c[H+4>>2]|0)|0;H=rla(E,c[k+8>>2]|0)|0;pe(I,1292008);qla(H,c[I>>2]|0,c[I+4>>2]|0)|0;_a=Za+Qa;I=tla(m,_a)|0;pe(J,1305864);$a=Za+Ta;H=tla(qla(I,c[J>>2]|0,c[J+4>>2]|0)|0,$a)|0;pe(K,1293880);qla(H,c[K>>2]|0,c[K+4>>2]|0)|0;K=tla(m,_a)|0;pe(L,1305864);ab=Sa-Za;H=tla(qla(K,c[L>>2]|0,c[L+4>>2]|0)|0,ab)|0;pe(M,1293888);qla(H,c[M>>2]|0,c[M+4>>2]|0)|0;bb=Ra-Za;M=tla(m,bb)|0;pe(N,1305864);H=tla(qla(M,c[N>>2]|0,c[N+4>>2]|0)|0,ab)|0;pe(O,1293888);qla(H,c[O>>2]|0,c[O+4>>2]|0)|0;O=tla(m,bb)|0;pe(P,1305864);H=tla(qla(O,c[P>>2]|0,c[P+4>>2]|0)|0,$a)|0;pe(Q,1293888);qla(H,c[Q>>2]|0,c[Q+4>>2]|0)|0;Q=tla(m,_a)|0;pe(R,1305864);H=tla(qla(Q,c[R>>2]|0,c[R+4>>2]|0)|0,$a)|0;pe(S,1292016);qla(H,c[S>>2]|0,c[S+4>>2]|0)|0}}else if((j|0)==3|(j|0)==2){c[U>>2]=1;vYa(T,f,U);ika(n,T);dka(T);T=c[n>>2]|0;if((T|0)!=0?(c[T+4>>2]|0)>0:0){oe(V,n);qla(m,c[V>>2]|0,c[V+4>>2]|0)|0;$a=Za+Qa;V=tla(m,$a)|0;pe(W,1305864);T=tla(qla(V,c[W>>2]|0,c[W+4>>2]|0)|0,Za+Ta)|0;pe(X,1293880);qla(T,c[X>>2]|0,c[X+4>>2]|0)|0;X=tla(m,$a)|0;pe(Y,1305864);$a=Sa-Za;T=tla(qla(X,c[Y>>2]|0,c[Y+4>>2]|0)|0,$a)|0;pe(Z,1293888);qla(T,c[Z>>2]|0,c[Z+4>>2]|0)|0;Z=tla(m,Ra-Za)|0;pe(_,1305864);T=tla(qla(Z,c[_>>2]|0,c[_+4>>2]|0)|0,$a)|0;pe($,1293888);qla(T,c[$>>2]|0,c[$+4>>2]|0)|0;$a=Za*2.0;$=tla(m,Ra-$a)|0;pe(aa,1305864);_a=Sa-$a;T=tla(qla($,c[aa>>2]|0,c[aa+4>>2]|0)|0,_a)|0;pe(ba,1293888);qla(T,c[ba>>2]|0,c[ba+4>>2]|0)|0;bb=$a+Qa;ba=tla(m,bb)|0;pe(ca,1305864);T=tla(qla(ba,c[ca>>2]|0,c[ca+4>>2]|0)|0,_a)|0;pe(da,1293888);qla(T,c[da>>2]|0,c[da+4>>2]|0)|0;da=tla(m,bb)|0;pe(ea,1305864);T=tla(qla(da,c[ea>>2]|0,c[ea+4>>2]|0)|0,$a+Ta)|0;pe(fa,1293896);qla(T,c[fa>>2]|0,c[fa+4>>2]|0)|0}c[ha>>2]=1;vYa(ga,h,ha);ika(n,ga);dka(ga);ga=c[n>>2]|0;if((ga|0)!=0?(c[ga+4>>2]|0)>0:0){oe(ia,n);qla(m,c[ia>>2]|0,c[ia+4>>2]|0)|0;$a=Ra-Za;ia=tla(m,$a)|0;pe(ja,1305864);ga=tla(qla(ia,c[ja>>2]|0,c[ja+4>>2]|0)|0,Sa-Za)|0;pe(ka,1293880);qla(ga,c[ka>>2]|0,c[ka+4>>2]|0)|0;ka=tla(m,$a)|0;pe(la,1305864);$a=Za+Ta;ga=tla(qla(ka,c[la>>2]|0,c[la+4>>2]|0)|0,$a)|0;pe(ma,1293888);qla(ga,c[ma>>2]|0,c[ma+4>>2]|0)|0;ma=tla(m,Za+Qa)|0;pe(na,1305864);ga=tla(qla(ma,c[na>>2]|0,c[na+4>>2]|0)|0,$a)|0;pe(oa,1293888);qla(ga,c[oa>>2]|0,c[oa+4>>2]|0)|0;$a=Za*2.0;oa=tla(m,$a+Qa)|0;pe(pa,1305864);bb=$a+Ta;ga=tla(qla(oa,c[pa>>2]|0,c[pa+4>>2]|0)|0,bb)|0;pe(qa,1293888);qla(ga,c[qa>>2]|0,c[qa+4>>2]|0)|0;_a=Ra-$a;qa=tla(m,_a)|0;pe(ra,1305864);ga=tla(qla(qa,c[ra>>2]|0,c[ra+4>>2]|0)|0,bb)|0;pe(sa,1293888);qla(ga,c[sa>>2]|0,c[sa+4>>2]|0)|0;sa=tla(m,_a)|0;pe(ta,1305864);ga=tla(qla(sa,c[ta>>2]|0,c[ta+4>>2]|0)|0,Sa-$a)|0;pe(ua,1293896);qla(ga,c[ua>>2]|0,c[ua+4>>2]|0)|0}c[wa>>2]=1;vYa(va,e,wa);ika(n,va);dka(va);va=c[n>>2]|0;if((va|0)!=0?(c[va+4>>2]|0)>0:0){oe(xa,n);qla(m,c[xa>>2]|0,c[xa+4>>2]|0)|0;xa=tla(m,Qa)|0;pe(ya,1305864);va=tla(qla(xa,c[ya>>2]|0,c[ya+4>>2]|0)|0,Ta)|0;pe(za,1305864);$a=Ra-Qa;ya=tla(qla(va,c[za>>2]|0,c[za+4>>2]|0)|0,$a)|0;pe(Aa,1305864);_a=Sa-Ta;za=tla(qla(ya,c[Aa>>2]|0,c[Aa+4>>2]|0)|0,_a)|0;pe(Ba,1291968);qla(za,c[Ba>>2]|0,c[Ba+4>>2]|0)|0;Ba=tla(m,Za+Qa)|0;pe(Ca,1305864);za=tla(qla(Ba,c[Ca>>2]|0,c[Ca+4>>2]|0)|0,Za+Ta)|0;pe(Da,1305864);bb=Za*2.0;Ca=tla(qla(za,c[Da>>2]|0,c[Da+4>>2]|0)|0,$a-bb)|0;pe(Ea,1305864);Da=tla(qla(Ca,c[Ea>>2]|0,c[Ea+4>>2]|0)|0,_a-bb)|0;pe(Fa,1292024);qla(Da,c[Fa>>2]|0,c[Fa+4>>2]|0)|0}}else if((j|0)==4){c[Ha>>2]=0;vYa(Ga,e,Ha);ika(n,Ga);dka(Ga);Ga=c[n>>2]|0;if((Ga|0)!=0?(c[Ga+4>>2]|0)>0:0){oe(Ia,n);qla(m,c[Ia>>2]|0,c[Ia+4>>2]|0)|0;Ia=tla(m,d)|0;pe(Ja,1292032);qla(Ia,c[Ja>>2]|0,c[Ja+4>>2]|0)|0;Ja=tla(m,Qa)|0;pe(Ka,1305864);bb=Za+Ta;Ia=tla(qla(Ja,c[Ka>>2]|0,c[Ka+4>>2]|0)|0,bb)|0;pe(La,1293880);qla(Ia,c[La>>2]|0,c[La+4>>2]|0)|0;La=tla(m,Ra)|0;pe(Ma,1305864);Ia=tla(qla(La,c[Ma>>2]|0,c[Ma+4>>2]|0)|0,bb)|0;pe(Na,1292016);qla(Ia,c[Na>>2]|0,c[Na+4>>2]|0)|0}}else{c[q>>2]=1;vYa(p,e,q);ika(n,p);dka(p);p=c[n>>2]|0;if((p|0)!=0?(c[p+4>>2]|0)>0:0){oe(r,n);qla(m,c[r>>2]|0,c[r+4>>2]|0)|0;r=tla(m,Qa)|0;pe(s,1305864);p=tla(qla(r,c[s>>2]|0,c[s+4>>2]|0)|0,Ta)|0;pe(t,1305864);bb=Ra-Qa;s=tla(qla(p,c[t>>2]|0,c[t+4>>2]|0)|0,bb)|0;pe(u,1305864);Ra=Sa-Ta;t=tla(qla(s,c[u>>2]|0,c[u+4>>2]|0)|0,Ra)|0;pe(v,1291968);qla(t,c[v>>2]|0,c[v+4>>2]|0)|0;v=tla(m,Qa+d)|0;pe(w,1305864);t=tla(qla(v,c[w>>2]|0,c[w+4>>2]|0)|0,Ta+d)|0;pe(x,1305864);Ta=d*2.0;w=tla(qla(t,c[x>>2]|0,c[x+4>>2]|0)|0,bb-Ta)|0;pe(y,1305864);x=tla(qla(w,c[y>>2]|0,c[y+4>>2]|0)|0,Ra-Ta)|0;pe(z,1291968);qla(x,c[z>>2]|0,c[z+4>>2]|0)|0;pe(A,1291976);qla(m,c[A>>2]|0,c[A+4>>2]|0)|0}}pe(Oa,1293904);qla(m,c[Oa>>2]|0,c[Oa+4>>2]|0)|0;Ua=m+4|0;Va=c[Ua>>2]|0;Wa=m+8|0;Xa=c[Wa>>2]|0;pla(Pa,Va,Xa);jka(a,Pa);dka(n);Ya=c[Ua>>2]|0;ila(Ya);i=l;return}function EYa(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=+d;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0.0;k=i;i=i+624|0;l=k+608|0;m=k+600|0;n=k+592|0;o=k+588|0;p=k+584|0;q=k+576|0;r=k+568|0;s=k+560|0;t=k+552|0;u=k+544|0;v=k+528|0;w=k+520|0;x=k+516|0;y=k+512|0;z=k+504|0;A=k+496|0;B=k+488|0;C=k+480|0;D=k+472|0;E=k+464|0;F=k+456|0;G=k+448|0;H=k+440|0;I=k+424|0;J=k+416|0;K=k+412|0;L=k+408|0;M=k+400|0;N=k+392|0;O=k+384|0;P=k+376|0;Q=k+368|0;R=k+360|0;S=k+356|0;T=k+352|0;U=k+344|0;V=k+336|0;W=k+328|0;X=k+320|0;Y=k+312|0;Z=k+296|0;_=k+288|0;$=k+284|0;aa=k+280|0;ba=k+272|0;ca=k+264|0;da=k+256|0;ea=k+248|0;fa=k+240|0;ga=k+224|0;ha=k+216|0;ia=k+212|0;ja=k+208|0;ka=k+200|0;la=k+192|0;ma=k+184|0;na=k+176|0;oa=k+168|0;pa=k+160|0;qa=k+156|0;ra=k+152|0;sa=k+144|0;ta=k+136|0;ua=k+128|0;va=k+120|0;wa=k+112|0;xa=k+96|0;ya=k+88|0;za=k+84|0;Aa=k+80|0;Ba=k+72|0;Ca=k+64|0;Da=k+56|0;Ea=k+48|0;Fa=k+40|0;Ga=k+24|0;Ha=k+16|0;Ia=k+8|0;Ja=k;gla(l);c[m>>2]=0;if(!(d>0.0)){Ka=l+4|0;La=c[Ka>>2]|0;Ma=l+8|0;Na=c[Ma>>2]|0;pla(Ja,La,Na);jka(a,Ja);dka(m);Oa=c[Ka>>2]|0;ila(Oa);i=k;return}pe(n,1293864);qla(l,c[n>>2]|0,c[n+4>>2]|0)|0;if((h|0)==1){c[y>>2]=0;vYa(x,e,y);ika(m,x);dka(x);x=c[m>>2]|0;if((x|0)!=0?(c[x+4>>2]|0)>0:0){pe(z,1293864);x=tla(qla(l,c[z>>2]|0,c[z+4>>2]|0)|0,d)|0;pe(A,1292032);z=qla(x,c[A>>2]|0,c[A+4>>2]|0)|0;pe(B,1292048);A=qla(z,c[B>>2]|0,c[B+4>>2]|0)|0;B=rla(A,c[j>>2]|0)|0;pe(C,1305864);A=qla(B,c[C>>2]|0,c[C+4>>2]|0)|0;C=rla(A,c[j+4>>2]|0)|0;pe(D,1292e3);A=qla(C,c[D>>2]|0,c[D+4>>2]|0)|0;D=rla(A,c[j+8>>2]|0)|0;pe(E,1292008);j=qla(D,c[E>>2]|0,c[E+4>>2]|0)|0;oe(F,m);E=qla(j,c[F>>2]|0,c[F+4>>2]|0)|0;sYa(I,b,d*.5);lYa(H,I);oe(G,H);I=qla(E,c[G>>2]|0,c[G+4>>2]|0)|0;pe(J,1292040);qla(I,c[J>>2]|0,c[J+4>>2]|0)|0;dka(H)}}else if((h|0)==2){Pa=d*.5;c[L>>2]=0;vYa(K,e,L);ika(m,K);dka(K);K=c[m>>2]|0;if((K|0)!=0?(c[K+4>>2]|0)>0:0){pe(M,1293864);K=tla(qla(l,c[M>>2]|0,c[M+4>>2]|0)|0,Pa)|0;pe(N,1292032);M=qla(K,c[N>>2]|0,c[N+4>>2]|0)|0;oe(O,m);N=qla(M,c[O>>2]|0,c[O+4>>2]|0)|0;lYa(Q,b);oe(P,Q);O=qla(N,c[P>>2]|0,c[P+4>>2]|0)|0;pe(R,1292040);qla(O,c[R>>2]|0,c[R+4>>2]|0)|0;dka(Q)}c[T>>2]=0;vYa(S,f,T);ika(m,S);dka(S);S=c[m>>2]|0;if((S|0)!=0?(c[S+4>>2]|0)>0:0){pe(U,1293864);S=tla(qla(l,c[U>>2]|0,c[U+4>>2]|0)|0,Pa)|0;pe(V,1292032);U=qla(S,c[V>>2]|0,c[V+4>>2]|0)|0;oe(W,m);V=qla(U,c[W>>2]|0,c[W+4>>2]|0)|0;sYa(Z,b,Pa*.75);qYa(Y,Z,.7853981852531433);oe(X,Y);Z=qla(V,c[X>>2]|0,c[X+4>>2]|0)|0;pe(_,1292040);qla(Z,c[_>>2]|0,c[_+4>>2]|0)|0;dka(Y)}c[aa>>2]=0;vYa($,g,aa);ika(m,$);dka($);$=c[m>>2]|0;if(($|0)!=0?(c[$+4>>2]|0)>0:0){pe(ba,1293864);$=tla(qla(l,c[ba>>2]|0,c[ba+4>>2]|0)|0,Pa)|0;pe(ca,1292032);ba=qla($,c[ca>>2]|0,c[ca+4>>2]|0)|0;oe(da,m);ca=qla(ba,c[da>>2]|0,c[da+4>>2]|0)|0;sYa(ga,b,Pa*.75);qYa(fa,ga,3.9269909858703613);oe(ea,fa);ga=qla(ca,c[ea>>2]|0,c[ea+4>>2]|0)|0;pe(ha,1292040);qla(ga,c[ha>>2]|0,c[ha+4>>2]|0)|0;dka(fa)}}else if((h|0)==3){Pa=d*.5;c[ja>>2]=0;vYa(ia,e,ja);ika(m,ia);dka(ia);ia=c[m>>2]|0;if((ia|0)!=0?(c[ia+4>>2]|0)>0:0){pe(ka,1293864);ia=tla(qla(l,c[ka>>2]|0,c[ka+4>>2]|0)|0,Pa)|0;pe(la,1292032);ka=qla(ia,c[la>>2]|0,c[la+4>>2]|0)|0;oe(ma,m);la=qla(ka,c[ma>>2]|0,c[ma+4>>2]|0)|0;lYa(oa,b);oe(na,oa);ma=qla(la,c[na>>2]|0,c[na+4>>2]|0)|0;pe(pa,1292040);qla(ma,c[pa>>2]|0,c[pa+4>>2]|0)|0;dka(oa)}c[ra>>2]=0;vYa(qa,f,ra);ika(m,qa);dka(qa);qa=c[m>>2]|0;if((qa|0)!=0?(c[qa+4>>2]|0)>0:0){pe(sa,1293864);qa=tla(qla(l,c[sa>>2]|0,c[sa+4>>2]|0)|0,Pa)|0;pe(ta,1292032);sa=qla(qa,c[ta>>2]|0,c[ta+4>>2]|0)|0;oe(ua,m);ta=qla(sa,c[ua>>2]|0,c[ua+4>>2]|0)|0;sYa(xa,b,Pa*.75);qYa(wa,xa,.7853981852531433);oe(va,wa);xa=qla(ta,c[va>>2]|0,c[va+4>>2]|0)|0;pe(ya,1292040);qla(xa,c[ya>>2]|0,c[ya+4>>2]|0)|0;dka(wa)}c[Aa>>2]=0;vYa(za,g,Aa);ika(m,za);dka(za);za=c[m>>2]|0;if((za|0)!=0?(c[za+4>>2]|0)>0:0){pe(Ba,1293864);za=tla(qla(l,c[Ba>>2]|0,c[Ba+4>>2]|0)|0,Pa)|0;pe(Ca,1292032);Ba=qla(za,c[Ca>>2]|0,c[Ca+4>>2]|0)|0;oe(Da,m);Ca=qla(Ba,c[Da>>2]|0,c[Da+4>>2]|0)|0;sYa(Ga,b,Pa*.75);qYa(Fa,Ga,3.9269909858703613);oe(Ea,Fa);Ga=qla(Ca,c[Ea>>2]|0,c[Ea+4>>2]|0)|0;pe(Ha,1292040);qla(Ga,c[Ha>>2]|0,c[Ha+4>>2]|0)|0;dka(Fa)}}else{c[p>>2]=0;vYa(o,e,p);ika(m,o);dka(o);o=c[m>>2]|0;if((o|0)!=0?(c[o+4>>2]|0)>0:0){pe(q,1293864);o=tla(qla(l,c[q>>2]|0,c[q+4>>2]|0)|0,d)|0;pe(r,1292032);q=qla(o,c[r>>2]|0,c[r+4>>2]|0)|0;oe(s,m);r=qla(q,c[s>>2]|0,c[s+4>>2]|0)|0;sYa(v,b,d*.5);lYa(u,v);oe(t,u);v=qla(r,c[t>>2]|0,c[t+4>>2]|0)|0;pe(w,1292040);qla(v,c[w>>2]|0,c[w+4>>2]|0)|0;dka(u)}}pe(Ia,1293904);qla(l,c[Ia>>2]|0,c[Ia+4>>2]|0)|0;Ka=l+4|0;La=c[Ka>>2]|0;Ma=l+8|0;Na=c[Ma>>2]|0;pla(Ja,La,Na);jka(a,Ja);dka(m);Oa=c[Ka>>2]|0;ila(Oa);i=k;return}function FYa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0.0;d=i;e=a+4|0;f=a+8|0;h=a+12|0;j=a+16|0;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;k=c[b>>2]|0;c[a>>2]=k;if((k|0)==0){c[a>>2]=2;g[e>>2]=.75;g[f>>2]=.75;g[h>>2]=.75;i=d;return}else if((k|0)==3|(k|0)==1|(k|0)==2){l=+g[b+4>>2]+-.25;g[e>>2]=l>0.0?l:0.0;l=+g[b+8>>2]+-.25;g[f>>2]=l>0.0?l:0.0;l=+g[b+12>>2]+-.25;g[h>>2]=l>0.0?l:0.0;l=+g[b+16>>2]+-.25;g[j>>2]=l>0.0?l:0.0;i=d;return}else{i=d;return}}function GYa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0;d=i;e=a+4|0;f=a+8|0;h=a+12|0;j=a+16|0;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;k=c[b>>2]|0;c[a>>2]=k;if((k|0)==3|(k|0)==1|(k|0)==2){c[a+0>>2]=c[b+0>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];c[a+16>>2]=c[b+16>>2];g[e>>2]=+g[e>>2]*.5;g[f>>2]=+g[f>>2]*.5;g[h>>2]=+g[h>>2]*.5;g[j>>2]=+g[j>>2]*.5;i=d;return}else if((k|0)==0){c[a>>2]=2;g[e>>2]=.5;g[f>>2]=.5;g[h>>2]=.5;i=d;return}else{i=d;return}}function HYa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;i=i+80|0;f=e+56|0;g=e+48|0;h=e+40|0;j=e+36|0;k=e+32|0;l=e+24|0;m=e+16|0;n=e+8|0;o=e;gla(f);pe(g,1293864);p=qla(f,c[g>>2]|0,c[g+4>>2]|0)|0;c[k>>2]=1;vYa(j,d,k);oe(h,j);k=qla(p,c[h>>2]|0,c[h+4>>2]|0)|0;kYa(m,b);oe(l,m);b=qla(k,c[l>>2]|0,c[l+4>>2]|0)|0;pe(n,1291888);qla(b,c[n>>2]|0,c[n+4>>2]|0)|0;dka(m);dka(j);j=f+4|0;pla(o,c[j>>2]|0,c[f+8>>2]|0);jka(a,o);ila(c[j>>2]|0);i=e;return}function IYa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;i=i+80|0;f=e+56|0;g=e+48|0;h=e+40|0;j=e+36|0;k=e+32|0;l=e+24|0;m=e+16|0;n=e+8|0;o=e;gla(f);pe(g,1293864);p=qla(f,c[g>>2]|0,c[g+4>>2]|0)|0;c[k>>2]=1;vYa(j,d,k);oe(h,j);k=qla(p,c[h>>2]|0,c[h+4>>2]|0)|0;lYa(m,b);oe(l,m);b=qla(k,c[l>>2]|0,c[l+4>>2]|0)|0;pe(n,1291888);qla(b,c[n>>2]|0,c[n+4>>2]|0)|0;dka(m);dka(j);j=f+4|0;pla(o,c[j>>2]|0,c[f+8>>2]|0);jka(a,o);ila(c[j>>2]|0);i=e;return}function JYa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;i=i+80|0;f=e+56|0;g=e+48|0;h=e+40|0;j=e+36|0;k=e+32|0;l=e+24|0;m=e+16|0;n=e+8|0;o=e;gla(f);pe(g,1293864);p=qla(f,c[g>>2]|0,c[g+4>>2]|0)|0;c[k>>2]=0;vYa(j,d,k);oe(h,j);k=qla(p,c[h>>2]|0,c[h+4>>2]|0)|0;mYa(m,b);oe(l,m);b=qla(k,c[l>>2]|0,c[l+4>>2]|0)|0;pe(n,1292056);qla(b,c[n>>2]|0,c[n+4>>2]|0)|0;dka(m);dka(j);j=f+4|0;pla(o,c[j>>2]|0,c[f+8>>2]|0);jka(a,o);ila(c[j>>2]|0);i=e;return}function KYa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;i=i+80|0;f=e+56|0;g=e+48|0;h=e+40|0;j=e+36|0;k=e+32|0;l=e+24|0;m=e+16|0;n=e+8|0;o=e;gla(f);pe(g,1292064);p=qla(f,c[g>>2]|0,c[g+4>>2]|0)|0;c[k>>2]=1;vYa(j,d,k);oe(h,j);k=qla(p,c[h>>2]|0,c[h+4>>2]|0)|0;nYa(m,b);oe(l,m);b=qla(k,c[l>>2]|0,c[l+4>>2]|0)|0;pe(n,1291888);qla(b,c[n>>2]|0,c[n+4>>2]|0)|0;dka(m);dka(j);j=f+4|0;pla(o,c[j>>2]|0,c[f+8>>2]|0);jka(a,o);ila(c[j>>2]|0);i=e;return}function LYa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;i=i+80|0;f=e+56|0;g=e+48|0;h=e+40|0;j=e+36|0;k=e+32|0;l=e+24|0;m=e+16|0;n=e+8|0;o=e;gla(f);pe(g,1293864);p=qla(f,c[g>>2]|0,c[g+4>>2]|0)|0;c[k>>2]=1;vYa(j,d,k);oe(h,j);k=qla(p,c[h>>2]|0,c[h+4>>2]|0)|0;oYa(m,b);oe(l,m);b=qla(k,c[l>>2]|0,c[l+4>>2]|0)|0;pe(n,1291888);qla(b,c[n>>2]|0,c[n+4>>2]|0)|0;dka(m);dka(j);j=f+4|0;pla(o,c[j>>2]|0,c[f+8>>2]|0);jka(a,o);ila(c[j>>2]|0);i=e;return}function MYa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;i=i+80|0;f=e+56|0;g=e+48|0;h=e+40|0;j=e+36|0;k=e+32|0;l=e+24|0;m=e+16|0;n=e+8|0;o=e;gla(f);pe(g,1293864);p=qla(f,c[g>>2]|0,c[g+4>>2]|0)|0;c[k>>2]=1;vYa(j,d,k);oe(h,j);k=qla(p,c[h>>2]|0,c[h+4>>2]|0)|0;pYa(m,b);oe(l,m);b=qla(k,c[l>>2]|0,c[l+4>>2]|0)|0;pe(n,1291888);qla(b,c[n>>2]|0,c[n+4>>2]|0)|0;dka(m);dka(j);j=f+4|0;pla(o,c[j>>2]|0,c[f+8>>2]|0);jka(a,o);ila(c[j>>2]|0);i=e;return}function NYa(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+80|0;f=e+64|0;g=e+48|0;h=e+32|0;j=e+16|0;k=e;xYa(f,b);switch(c|0){case 2:{JYa(a,f,d);i=e;return};case 1:{tYa(g,f,.6666666865348816);IYa(a,g,d);i=e;return};case 3:{tYa(h,f,.6666666865348816);KYa(a,h,d);i=e;return};case 4:{tYa(j,f,.6666666865348816);LYa(a,j,d);i=e;return};case 5:{tYa(k,f,.6666666865348816);MYa(a,k,d);i=e;return};default:{HYa(a,f,d);i=e;return}}}function OYa(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+80|0;f=e+64|0;g=e+48|0;h=e+32|0;j=e+16|0;k=e;xYa(f,b);switch(c|0){case 2:{JYa(a,f,d);i=e;return};case 1:{tYa(g,f,.5);IYa(a,g,d);i=e;return};case 3:{tYa(h,f,.6666666865348816);KYa(a,h,d);i=e;return};case 4:{tYa(j,f,.6666666865348816);LYa(a,j,d);i=e;return};case 5:{tYa(k,f,.6666666865348816);MYa(a,k,d);i=e;return};default:{HYa(a,f,d);i=e;return}}}function PYa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0;d=i;i=i+304|0;e=d+288|0;f=d+280|0;h=d+272|0;j=d+264|0;k=d+244|0;l=d+240|0;m=d+232|0;n=d+224|0;o=d+216|0;p=d+208|0;q=d+200|0;r=d+192|0;s=d+184|0;t=d+176|0;u=d+156|0;v=d+136|0;w=d+116|0;x=d+104|0;y=d+96|0;z=d+88|0;A=d+80|0;B=d+72|0;C=d+64|0;D=d+56|0;E=d+48|0;F=d+40|0;G=d+32|0;H=d+24|0;I=d+16|0;J=d+8|0;K=d;gla(e);if((Ny(b)|0)==0){pe(f,1293864);L=qla(e,c[f>>2]|0,c[f+4>>2]|0)|0;c[k>>2]=2;g[k+4>>2]=.8627451062202454;g[k+8>>2]=.8627451062202454;g[k+12>>2]=.8627451062202454;g[k+16>>2]=0.0;c[l>>2]=1;vYa(j,k,l);oe(h,j);qla(L,c[h>>2]|0,c[h+4>>2]|0)|0;dka(j);j=tla(e,+g[b>>2])|0;pe(m,1305864);h=qla(j,c[m>>2]|0,c[m+4>>2]|0)|0;m=b+8|0;j=tla(h,+g[m>>2])|0;pe(n,1305864);h=qla(j,c[n>>2]|0,c[n+4>>2]|0)|0;n=b+4|0;j=tla(h,+g[n>>2]- +g[b>>2])|0;pe(o,1305864);h=qla(j,c[o>>2]|0,c[o+4>>2]|0)|0;o=b+12|0;j=tla(h,+g[o>>2]- +g[m>>2])|0;pe(p,1292072);qla(j,c[p>>2]|0,c[p+4>>2]|0)|0;pe(q,1293904);qla(e,c[q>>2]|0,c[q+4>>2]|0)|0;pe(r,1293864);q=qla(e,c[r>>2]|0,c[r+4>>2]|0)|0;c[u>>2]=1;r=u+4|0;c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[v>>2]=1;g[v+4>>2]=1.0;g[v+8>>2]=0.0;g[v+12>>2]=0.0;g[v+16>>2]=0.0;c[w>>2]=1;g[w+4>>2]=.5;g[w+8>>2]=0.0;g[w+12>>2]=0.0;g[w+16>>2]=0.0;c[x>>2]=3;c[x+4>>2]=0;c[x+8>>2]=0;DYa(t,b,2.0,u,v,w,2,x);oe(s,t);x=qla(q,c[s>>2]|0,c[s+4>>2]|0)|0;pe(y,1293904);qla(x,c[y>>2]|0,c[y+4>>2]|0)|0;dka(t);M=+g[b>>2];N=+g[n>>2];O=(M+N)*.5;P=+g[o>>2];Q=+g[m>>2];R=(P+Q)*.5;S=N-M;if(((S>6.0?(M=S+-6.0,!(M<1.0e-4&M>-1.0e-4)):0)?(M=P-Q,M>6.0):0)?(Q=M+-6.0,!(Q<1.0e-4&Q>-1.0e-4)):0){pe(z,1293864);m=qla(e,c[z>>2]|0,c[z+4>>2]|0)|0;pe(A,1292080);qla(m,c[A>>2]|0,c[A+4>>2]|0)|0;Q=O+-3.0;A=tla(e,Q)|0;pe(B,1305864);M=R+1.5;m=tla(qla(A,c[B>>2]|0,c[B+4>>2]|0)|0,M)|0;pe(C,1293880);qla(m,c[C>>2]|0,c[C+4>>2]|0)|0;C=tla(e,O+3.0)|0;pe(D,1305864);m=tla(qla(C,c[D>>2]|0,c[D+4>>2]|0)|0,M)|0;pe(E,1293888);qla(m,c[E>>2]|0,c[E+4>>2]|0)|0;E=tla(e,O)|0;pe(F,1305864);m=tla(qla(E,c[F>>2]|0,c[F+4>>2]|0)|0,R+-1.5)|0;pe(G,1293888);qla(m,c[G>>2]|0,c[G+4>>2]|0)|0;G=tla(e,Q)|0;pe(H,1305864);m=tla(qla(G,c[H>>2]|0,c[H+4>>2]|0)|0,M)|0;pe(I,1293896);qla(m,c[I>>2]|0,c[I+4>>2]|0)|0;pe(J,1293904);qla(e,c[J>>2]|0,c[J+4>>2]|0)|0}}J=e+4|0;pla(K,c[J>>2]|0,c[e+8>>2]|0);jka(a,K);ila(c[J>>2]|0);i=d;return}function QYa(a,b,c,d,e,f,h){a=+a;b=+b;c=+c;d=+d;e=e|0;f=f|0;h=h|0;var j=0,k=0.0;j=i;if(a<0.0|a>1.0){i=j;return}if(b<0.0|b>1.0){i=j;return}if(c<0.0|c>1.0){i=j;return}if(d<0.0|d>1.0){i=j;return}k=a+d;g[e>>2]=1.0-(k>1.0?1.0:k);k=b+d;g[f>>2]=1.0-(k>1.0?1.0:k);k=c+d;g[h>>2]=1.0-(k>1.0?1.0:k);i=j;return}function RYa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0.0;h=i;j=c[a>>2]|0;if((j|0)==1){k=+g[a+4>>2];if(k<0.0|k>1.0){i=h;return}g[d>>2]=k;g[e>>2]=k;g[f>>2]=k;i=h;return}else if((j|0)==3){QYa(+g[a+4>>2],+g[a+8>>2],+g[a+12>>2],+g[a+16>>2],d,e,f);i=h;return}else if((j|0)==0){c[b>>2]=0;i=h;return}else if((j|0)==2){g[d>>2]=+g[a+4>>2];g[e>>2]=+g[a+8>>2];g[f>>2]=+g[a+12>>2];i=h;return}else{i=h;return}}function SYa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0;d=i;i=i+16|0;e=d+12|0;f=d+8|0;h=d+4|0;j=d;c[e>>2]=b;g[f>>2]=0.0;g[h>>2]=0.0;g[j>>2]=0.0;RYa(a,e,f,h,j);i=d;return~~(+g[f>>2]*255.0)<<16|c[e>>2]<<24|~~(+g[h>>2]*255.0)<<8|~~(+g[j>>2]*255.0)|0}function TYa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0;f=i;i=i+16|0;h=f;OIa(h);XIa(h,+g[d>>2],+g[d+8>>2],+g[d+4>>2],+g[d+12>>2]);UGa(a,h,b,0,c[e>>2]|0,0,2,0)|0;PIa(c[h+4>>2]|0);i=f;return}function UYa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0;f=i;i=i+16|0;h=f;OIa(h);QIa(h,7);WIa(h,0,+g[d>>2],+g[d+4>>2],6);j=1;do{WIa(h,j,+g[d+(j<<3)>>2],+g[d+(j<<3)+4>>2],2);j=j+1|0}while((j|0)<7);UGa(a,h,b,0,c[e>>2]|0,0,1,0)|0;PIa(c[h+4>>2]|0);i=f;return}function VYa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;var h=0,j=0,k=0;h=i;i=i+48|0;j=h+28|0;k=h;OIa(j);XIa(j,+g[d>>2],+g[d+8>>2],+g[d+4>>2],+g[d+12>>2]);dJa(k);g[k+24>>2]=f;UGa(a,j,b,k,0,c[e>>2]|0,1,0)|0;gJa(c[k+8>>2]|0);PIa(c[j+4>>2]|0);i=h;return}function WYa(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=+h;var j=0,k=0,l=0;j=i;i=i+48|0;k=j+28|0;l=j;OIa(k);QIa(k,2);WIa(k,0,+g[d>>2],+g[d+4>>2],6);WIa(k,1,+g[e>>2],+g[e+4>>2],2);dJa(l);g[l+24>>2]=h;UGa(a,k,b,l,0,c[f>>2]|0,1,0)|0;gJa(c[l+8>>2]|0);PIa(c[k+4>>2]|0);i=j;return}function XYa(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=i;i=i+16|0;h=g;c[h>>2]=SYa(e,f)|0;TYa(a,b,d,h);i=g;return}function YYa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0,t=0.0;f=i;i=i+32|0;h=f+16|0;j=f+8|0;k=f;l=+g[d+12>>2];m=+g[d+8>>2];n=140.0/(l-m);o=m+.5;p=l+-.5;if(!(o<=p)){i=f;return}l=+g[d>>2];q=h+4|0;r=+g[d+4>>2];d=j+4|0;s=e<<24;t=o;do{e=~~(n*(t-m))+80|0;g[h>>2]=l;g[q>>2]=t;g[j>>2]=r;g[d>>2]=t;c[k>>2]=e|s|e<<16|e<<8;WYa(a,b,h,j,k,1.5);t=t+1.0}while(t<=p);i=f;return}function ZYa(a,b,d,e,f,h,j,k,l){a=a|0;b=b|0;d=d|0;e=+e;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0;m=i;i=i+176|0;n=m+156|0;o=m+144|0;p=m+116|0;q=m+88|0;r=m+76|0;s=m+64|0;t=m+52|0;u=m+40|0;v=m+12|0;w=m;x=+g[d>>2];y=+g[d+4>>2];z=+g[d+12>>2];A=+g[d+8>>2];if(!(e>0.0)){i=m;return}B=e*.5;switch(k|0){case 5:{OIa(w);XIa(w,x,A,y,z);XIa(w,x+e,A+e,y-e,z-e);UGa(a,w,b,0,SYa(f,(l|0)/2|0)|0,0,1,0)|0;PIa(c[w+4>>2]|0);i=m;return};case 1:{OIa(o);QIa(o,5);C=B+x;D=B+A;WIa(o,0,C,D,6);E=z-B;WIa(o,1,C,E,2);F=y-B;WIa(o,2,F,E,2);WIa(o,3,F,D,2);WIa(o,4,C,D,2);dJa(p);hJa(p,2);w=p+8|0;g[c[w>>2]>>2]=3.0;g[(c[w>>2]|0)+4>>2]=3.0;g[p+12>>2]=0.0;g[p+24>>2]=e;UGa(a,o,b,p,0,SYa(f,l)|0,2,0)|0;gJa(c[w>>2]|0);PIa(c[o+4>>2]|0);i=m;return};case 4:{OIa(u);QIa(u,2);D=B+A;WIa(u,0,x,D,6);WIa(u,1,y,D,2);dJa(v);g[v+24>>2]=e;UGa(a,u,b,v,0,SYa(f,l)|0,1,0)|0;gJa(c[v+8>>2]|0);PIa(c[u+4>>2]|0);i=m;return};case 3:case 2:{dJa(q);g[q+24>>2]=B;OIa(r);QIa(r,7);D=B+x;C=B+A;WIa(r,0,D,C,6);F=z-B;WIa(r,1,D,F,2);E=y-B;WIa(r,2,E,F,2);G=B*2.0;B=y-G;H=z-G;WIa(r,3,B,H,2);I=G+x;WIa(r,4,I,H,2);J=G+A;WIa(r,5,I,J,2);WIa(r,6,D,C,2);UGa(a,r,b,q,SYa(h,l)|0,0,1,0)|0;OIa(s);QIa(s,7);WIa(s,0,E,F,6);WIa(s,1,E,C,2);WIa(s,2,D,C,2);WIa(s,3,I,J,2);WIa(s,4,B,J,2);WIa(s,5,B,H,2);WIa(s,6,E,F,2);UGa(a,s,b,q,SYa(j,l)|0,0,1,0)|0;OIa(t);XIa(t,x,A,y,z);XIa(t,D,C,E,F);UGa(a,t,b,q,SYa(f,l)|0,0,1,0)|0;PIa(c[t+4>>2]|0);PIa(c[s+4>>2]|0);PIa(c[r+4>>2]|0);gJa(c[q+8>>2]|0);i=m;return};default:{OIa(n);XIa(n,x,A,y,z);XIa(n,x+e,A+e,y-e,z-e);UGa(a,n,b,0,SYa(f,l)|0,0,1,0)|0;PIa(c[n+4>>2]|0);i=m;return}}}function _Ya(a,d,e,f,h,j){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0;k=i;i=i+240|0;l=k+236|0;m=k+224|0;n=k+208|0;o=k+192|0;p=k+180|0;q=k+104|0;r=k+80|0;s=k+56|0;t=k+32|0;u=k;c[l>>2]=0;OIa(m);LGa(c[a+44>>2]|0);if((Ny(f)|0)==0){c[n+0>>2]=c[f+0>>2];c[n+4>>2]=c[f+4>>2];c[n+8>>2]=c[f+8>>2];c[n+12>>2]=c[f+12>>2];rm(d,n);c[o>>2]=~~+g[n>>2];c[o+8>>2]=~~+g[n+4>>2];c[o+4>>2]=~~+g[n+12>>2];c[o+12>>2]=~~+g[n+8>>2];TGa(a,o)}o=Lc[c[(c[e>>2]|0)+16>>2]&255](e)|0;if((o|0)!=0?(Lc[c[(c[e>>2]|0)+24>>2]&255](e)|0)!=0:0){n=(h|0)!=0;if(n){Ic[c[(c[o>>2]|0)+48>>2]&511](o,h);v=o}else{Ic[c[(c[o>>2]|0)+44>>2]&511](o,0);v=o}f=h+12|0;h=(j|0)==0;w=s+4|0;x=s+8|0;y=s+12|0;z=s+16|0;A=s+20|0;B=p+4|0;C=p+8|0;D=r+4|0;E=r+8|0;F=r+12|0;G=r+16|0;H=r+20|0;I=-1;J=-1;K=-1;L=-1;M=-1;N=-1;O=0;a:while(1){P=O;while(1){if((Lc[c[(c[o>>2]|0)+8>>2]&255](o)|0)==0){break a}Q=Lc[c[(c[o>>2]|0)+52>>2]&255](o)|0;c[p+0>>2]=c[Q+0>>2];c[p+4>>2]=c[Q+4>>2];c[p+8>>2]=c[Q+8>>2];if(n?(Nm(p,f)|0)>0:0){break a}Um(q);if((dd[c[(c[o>>2]|0)+32>>2]&511](o,q)|0)!=0){break}if((((P|0)!=0?(Q=c[l>>2]|0,(Q|0)!=0):0)?!((c[Q+4>>2]|0)==0|h):0)?(dd[c[c[j>>2]>>2]&511](j,Q+12|0)|0)==0:0){c[s+0>>2]=-1;c[s+4>>2]=-1;c[s+8>>2]=-1;c[s+12>>2]=-1;c[s>>2]=K;c[w>>2]=J;c[x>>2]=I;c[y>>2]=N;c[z>>2]=M;c[A>>2]=L;nt(s);$Ya(m,e,s);Ic[c[(c[v>>2]|0)+48>>2]&511](o,p)}nka(l);P=0}Q=b[q>>1]|0;R=(P|0)==0;if(Q<<16>>16==45|(Q+ -65<<16>>16&65535)<26|(Q+ -97<<16>>16&65535)<26|(Q+ -192<<16>>16&65535)<496){if(R){S=c[C>>2]|0;T=c[B>>2]|0;U=c[p>>2]|0;V=1}else{S=I;T=J;U=K;V=P}tka(l,Q&255);W=S;X=T;Y=U;Z=V}else{if(((!R?(R=c[l>>2]|0,(R|0)!=0):0)?!((c[R+4>>2]|0)==0|h):0)?(dd[c[c[j>>2]>>2]&511](j,R+12|0)|0)==0:0){c[r+0>>2]=-1;c[r+4>>2]=-1;c[r+8>>2]=-1;c[r+12>>2]=-1;c[r>>2]=K;c[D>>2]=J;c[E>>2]=I;c[F>>2]=N;c[G>>2]=M;c[H>>2]=L;nt(r);$Ya(m,e,r);Ic[c[(c[v>>2]|0)+48>>2]&511](o,p)}nka(l);W=I;X=J;Y=K;Z=0}I=W;J=X;K=Y;L=c[C>>2]|0;M=c[B>>2]|0;N=c[p>>2]|0;O=Z}Z=c[l>>2]|0;if(((Z|0)!=0?!((c[Z+4>>2]|0)==0|h):0)?(dd[c[c[j>>2]>>2]&511](j,Z+12|0)|0)==0:0){c[t+0>>2]=-1;c[t+4>>2]=-1;c[t+8>>2]=-1;c[t+12>>2]=-1;c[t>>2]=K;c[t+4>>2]=J;c[t+8>>2]=I;c[t+12>>2]=N;c[t+16>>2]=M;c[t+20>>2]=L;nt(t);$Ya(m,e,t)}}dJa(u);g[u+24>>2]=0.0;if((c[m>>2]|0)<=0){MGa(a,0);_=u+8|0;$=c[_>>2]|0;gJa($);aa=m+4|0;ba=c[aa>>2]|0;PIa(ba);dka(l);i=k;return}UGa(a,m,d,u,0,-65536,1,0)|0;MGa(a,0);_=u+8|0;$=c[_>>2]|0;gJa($);aa=m+4|0;ba=c[aa>>2]|0;PIa(ba);dka(l);i=k;return}function $Ya(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0.0,C=0,D=0.0,E=0.0,F=0.0,G=0;e=i;i=i+208|0;f=e+196|0;h=e+152|0;j=e+76|0;k=e;l=Lc[c[(c[b>>2]|0)+16>>2]&255](b)|0;if((l|0)==0){i=e;return}Ic[c[(c[l>>2]|0)+48>>2]&511](l,d);b=h+24|0;m=j+20|0;n=d+12|0;o=k+20|0;p=k+36|0;q=h+32|0;r=h+28|0;s=h+36|0;t=h+40|0;u=0.0;v=0.0;w=0.0;x=0.0;while(1){y=Lc[c[(c[l>>2]|0)+52>>2]&255](l)|0;c[f+0>>2]=c[y+0>>2];c[f+4>>2]=c[y+4>>2];c[f+8>>2]=c[y+8>>2];c[h+0>>2]=-1;c[h+4>>2]=-1;c[h+8>>2]=-1;c[h+12>>2]=-1;c[h+16>>2]=-1;c[h+20>>2]=-1;c[b+0>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b+16>>2]=0;if((dd[c[(c[l>>2]|0)+36>>2]&511](l,h)|0)==0){z=w;A=x}else{z=(+g[s>>2]- +g[t>>2])*.0625;A=+g[r>>2]}if((Om(f,d)|0)==0){Ic[c[(c[l>>2]|0)+48>>2]&511](l,d);Um(j);y=(dd[c[(c[l>>2]|0)+32>>2]&511](l,j)|0)==0;B=y?v:+g[m>>2]}else{B=+g[b>>2]}if((Om(f,n)|0)==0){Ic[c[(c[l>>2]|0)+48>>2]&511](l,n);Um(k);if((dd[c[(c[l>>2]|0)+32>>2]&511](l,k)|0)==0){C=1;D=u}else{C=1;D=+g[o>>2]+ +g[p>>2]}}else{C=0;D=+g[b>>2]+ +g[q>>2]}UIa(a,1)|0;WIa(a,(c[a>>2]|0)+ -1|0,B,A,6);E=z+B;if(E<D){F=E;y=1;while(1){UIa(a,1)|0;WIa(a,(c[a>>2]|0)+ -1|0,F,A+z*+(y&1|0),2);F=z+F;if(!(F<D)){break}else{y=y+1|0}}}if((C|0)!=0){G=16;break}if((Lc[c[(c[l>>2]|0)+12>>2]&255](l)|0)==0){G=16;break}else{u=D;v=B;w=z;x=A}}if((G|0)==16){i=e;return}}function aZa(a){a=a|0;var b=0;b=i;Bma(a);i=b;return}function bZa(a){a=a|0;var b=0;b=i;c[a>>2]=1292136;dZa(a);$1a(a);i=b;return}function cZa(a){a=a|0;var b=0;b=i;c[a>>2]=1292136;dZa(a);i=b;return}function dZa(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+4|0;e=c[d>>2]|0;if((e|0)==0){i=b;return}f=c[a+12>>2]|0;Ic[c[(c[f>>2]|0)+76>>2]&511](f,e);Jma(1292104,c[d>>2]|0);c[d>>2]=0;i=b;return}function eZa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=a+4|0;if((c[e>>2]|0)!=0){dZa(a)}f=c[a+12>>2]|0;g=Qc[c[(c[f>>2]|0)+72>>2]&255](f,b,580)|0;c[e>>2]=g;c[(Gma(1292104,g)|0)>>2]=a;i=d;return}function fZa(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b;c[d>>2]=0;e=(gZa(a,d)|0)!=0;a=c[d>>2]|0;if(!(e&(a|0)!=0)){i=b;return}e=c[a+8>>2]|0;if((e|0)==0){i=b;return}Rc[c[(c[e>>2]|0)+8>>2]&1023](e);i=b;return}function gZa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;c[e>>2]=0;if((Dma(1292104,a,e)|0)==0){f=0;i=d;return f|0}c[b>>2]=c[e>>2];f=1;i=d;return f|0}function hZa(a){a=a|0;c[a>>2]=1292152;c[a+4>>2]=0;return}function iZa(a){a=a|0;var b=0;b=i;jZa(a);$1a(a);i=b;return}function jZa(a){a=a|0;var b=0,d=0;b=i;c[a>>2]=1292152;d=c[a+4>>2]|0;if((d|0)==0){i=b;return}Rc[c[(c[d>>2]|0)+4>>2]&1023](d);i=b;return}function kZa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=a+4|0;f=c[e>>2]|0;if((f|0)==0){g=Z1a(16)|0;h=Lc[c[(c[a>>2]|0)+12>>2]&255](a)|0;c[g>>2]=1292136;c[g+4>>2]=0;c[g+8>>2]=a;c[g+12>>2]=h;c[e>>2]=g;if((g|0)==0){i=d;return}else{j=g}}else{j=f}eZa(j,b);i=d;return}function lZa(a){a=a|0;var b=0;b=i;if((a|0)!=0){dZa(a)}i=b;return}function mZa(a){a=a|0;return}function nZa(a){a=a|0;var b=0,d=0,e=0;b=i;c[a+4>>2]=0;c[a>>2]=1292176;Ija(a+8|0,4);QR(a+24|0);d=a+264|0;e=a+216|0;a=e+48|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(a|0));c[d>>2]=1;i=b;return}function oZa(a){a=a|0;var b=0;b=i;pZa(a);$1a(a);i=b;return}function pZa(a){a=a|0;var b=0;b=i;c[a>>2]=1292176;Jja(c[a+8>>2]|0);jZa(a);i=b;return}function qZa(a,b){a=a|0;b=b|0;b=i;eka(a,1292416,-1);i=b;return}function rZa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0;d=i;i=i+208|0;e=d+192|0;f=d;h=a+252|0;if((c[h>>2]|0)!=0){i=d;return}j=a+24|0;c3a(j|0,b|0,192)|0;Ic[c[(c[a>>2]|0)+212>>2]&511](a,j);Hla(j);b=a+220|0;c[b+0>>2]=c[j+0>>2];c[b+4>>2]=c[j+4>>2];c[b+8>>2]=c[j+8>>2];c[b+12>>2]=c[j+12>>2];k=a+236|0;rYa(e,b,1.0);c[k+0>>2]=c[e+0>>2];c[k+4>>2]=c[e+4>>2];c[k+8>>2]=c[e+8>>2];c[k+12>>2]=c[e+12>>2];tZa(a);e=c[a+180>>2]|0;if((e|0)!=0){Fc[c[(c[e>>2]|0)+88>>2]&63](e,a,0,0,0)}c3a(f|0,j|0,184)|0;j=f+32|0;c[j>>2]=c[j>>2]&-65536;g[f+168>>2]=1.0;g[f+172>>2]=0.0;g[f+176>>2]=0.0;g[f+180>>2]=1.0;g[f+184>>2]=0.0;g[f+188>>2]=0.0;B_a(a,f);Ic[c[(c[a>>2]|0)+188>>2]&511](a,f);c[a+256>>2]=(c[a+56>>2]|0)>>>26&1;Rc[c[(c[a>>2]|0)+216>>2]&1023](a);Rc[c[(c[a>>2]|0)+192>>2]&1023](a);c[h>>2]=1;i=d;return}function sZa(a){a=a|0;return a|0}function tZa(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+184|0;if((c[d>>2]|0)!=0){i=b;return}e=Z1a(44)|0;u$a(e,a);c[d>>2]=e;i=b;return}function uZa(a,b){a=a|0;b=b|0;return(a&b|0)!=0|0}function vZa(a,b){a=a|0;b=b|0;return}function wZa(a){a=a|0;return}function xZa(a){a=a|0;return}function yZa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;Rc[c[(c[a>>2]|0)+84>>2]&1023](a);Rc[c[(c[a>>2]|0)+220>>2]&1023](a);d=a+252|0;if((c[d>>2]|0)!=0){e=a+8|0;f=c[a+12>>2]|0;if((f|0)>0){g=f;do{g=g+ -1|0;f=c[(zZa(e,g)|0)>>2]|0;if((f|0)!=0){yZa(f);Rc[c[(c[f>>2]|0)+4>>2]&1023](f)}}while((g|0)>0)}g=c[a+180>>2]|0;if((g|0)!=0){Fc[c[(c[g>>2]|0)+88>>2]&63](g,a,1,0,0)}c[d>>2]=0}AZa(a);f3a(a+24|0,0,192)|0;Kja(a+8|0,0)|0;c[a+216>>2]=0;i=b;return}function zZa(b,d){b=b|0;d=d|0;var e=0;e=i;if(!((d|0)>=0?(c[b+4>>2]|0)>(d|0):0)){a[0]=0;da()}i=e;return(c[b>>2]|0)+(d<<2)|0}function AZa(a){a=a|0;var b=0,d=0;b=i;d=c[a+184>>2]|0;if((d|0)!=0?(c[d+32>>2]|0)==(a|0):0){s$a(d);$1a(d)}i=b;return}function BZa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0;f=i;i=i+16|0;h=f;if((c[a+252>>2]|0)==0){i=f;return}Ic[c[(c[a>>2]|0)+148>>2]&511](h,a);j=a+220|0;c[j+0>>2]=c[b+0>>2];c[j+4>>2]=c[b+4>>2];c[j+8>>2]=c[b+8>>2];c[j+12>>2]=c[b+12>>2];Hla(j);if((!(+g[h>>2]!=+g[b>>2])?!(+g[h+4>>2]!=+g[b+4>>2]):0)?!(+g[h+12>>2]!=+g[b+12>>2]):0){if(!((d|0)==0?1:+g[h+8>>2]==+g[b+8>>2])){k=7}}else{k=6}if((k|0)==6?(d|0)!=0:0){k=7}if((k|0)==7){Rc[c[(c[a>>2]|0)+192>>2]&1023](a)}if((e|0)!=0){CZa(a,h,b)}b=a+24|0;c[b+0>>2]=c[j+0>>2];c[b+4>>2]=c[j+4>>2];c[b+8>>2]=c[j+8>>2];c[b+12>>2]=c[j+12>>2];i=f;return}function CZa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;c[f+0>>2]=c[b+0>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];Jla(f,d);Ic[c[(c[a>>2]|0)+20>>2]&511](a,f);i=e;return}function DZa(a,b){a=a|0;b=b|0;var d=0;d=i;if((c[a+252>>2]|0)==0){i=d;return}if((c[a+256>>2]|0)==0){i=d;return}Ic[c[(c[a>>2]|0)+196>>2]&511](a,b);Ic[c[(c[a>>2]|0)+200>>2]&511](a,b);i=d;return}function EZa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0;d=i;i=i+160|0;e=d+136|0;f=d+120|0;h=d+112|0;j=d+108|0;k=d+88|0;l=d+80|0;m=d+72|0;n=d+52|0;o=d+32|0;p=d+12|0;q=d;Ic[c[(c[a>>2]|0)+148>>2]&511](e,a);if(+g[e>>2]>=+g[e+4>>2]){i=d;return}if(+g[e+8>>2]>=+g[e+12>>2]){i=d;return}gla(f);r=a+56|0;s=c[r>>2]|0;if((s&536870912|0)==0){t=s}else{Ic[c[(c[a>>2]|0)+108>>2]&511](k,a);uYa(j,e,k);oe(h,j);qla(f,c[h>>2]|0,c[h+4>>2]|0)|0;dka(j);t=c[r>>2]|0}if((t&1073741824|0)!=0){u=+(FZa(a)|0);Ic[c[(c[a>>2]|0)+112>>2]&511](n,a);t=a+88|0;ld[c[(c[a>>2]|0)+132>>2]&255](o,a,c[t>>2]|0);ld[c[(c[a>>2]|0)+136>>2]&255](p,a,c[t>>2]|0);r=c[t>>2]|0;t=a+164|0;c[q+0>>2]=c[t+0>>2];c[q+4>>2]=c[t+4>>2];c[q+8>>2]=c[t+8>>2];DYa(m,e,u,n,o,p,r,q);oe(l,m);qla(f,c[l>>2]|0,c[l+4>>2]|0)|0;dka(m)}m=f+4|0;ula(b,c[m>>2]|0,c[f+8>>2]|0)|0;ila(c[m>>2]|0);i=d;return}function FZa(a){a=a|0;var b=0,d=0;b=i;if((c[a+56>>2]&1073741824|0)==0){d=0;i=b;return d|0}d=c[a+92>>2]|0;i=b;return d|0}function GZa(a){a=a|0;return a|0}function HZa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=b+164|0;c[a+0>>2]=c[e+0>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];i=d;return}function IZa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=a+8|0;f=c[a+12>>2]|0;if((f|0)>0){g=0}else{i=d;return}do{a=JZa(e,g)|0;if((a|0)!=0){DZa(a,b)}g=g+1|0}while((g|0)!=(f|0));i=d;return}function JZa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((b|0)>=0?(c[a+4>>2]|0)>(b|0):0){e=c[(c[a>>2]|0)+(b<<2)>>2]|0;i=d;return e|0}b=c[0]|0;da();e=b;i=d;return e|0}function KZa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;if((c[a+252>>2]|0)==0){i=e;return}if((c[a+256>>2]|0)==0){i=e;return}ld[c[(c[a>>2]|0)+204>>2]&255](a,b,d);ld[c[(c[a>>2]|0)+208>>2]&255](a,b,d);i=e;return}function LZa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0;e=i;i=i+112|0;f=e+96|0;h=e+80|0;j=e+60|0;k=e+40|0;l=e+20|0;m=e;Ic[c[(c[a>>2]|0)+148>>2]&511](f,a);if(+g[f>>2]>=+g[f+4>>2]){i=e;return}if(+g[f+8>>2]>=+g[f+12>>2]){i=e;return}n=a+56|0;o=c[n>>2]|0;if((o&536870912|0)==0){p=o}else{o=FZa(a)|0;sYa(h,f,+((Lc[c[(c[a>>2]|0)+128>>2]&255](a)|0)+o|0));Ic[c[(c[a>>2]|0)+108>>2]&511](j,a);XYa(b,d,h,j,c[a+156>>2]|0);p=c[n>>2]|0}if((p&1073741824|0)==0){i=e;return}q=+(FZa(a)|0);Ic[c[(c[a>>2]|0)+112>>2]&511](k,a);p=a+88|0;ld[c[(c[a>>2]|0)+132>>2]&255](l,a,c[p>>2]|0);ld[c[(c[a>>2]|0)+136>>2]&255](m,a,c[p>>2]|0);ZYa(b,d,f,q,k,l,m,c[p>>2]|0,c[a+156>>2]|0);i=e;return}function MZa(a){a=a|0;return a|0}function NZa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+32|0;f=e;g=a+8|0;h=c[a+12>>2]|0;if((h|0)>0){j=0}else{i=e;return}do{a=JZa(g,j)|0;do{if((a|0)!=0){OZa(f,a);if((uF(f)|0)==0){Wla(f,d);KZa(a,b,f);break}else{KZa(a,b,d);break}}}while(0);j=j+1|0}while((j|0)!=(h|0));i=e;return}function OZa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((c[b+56>>2]|0)>-1){g[a>>2]=1.0;g[a+4>>2]=0.0;g[a+8>>2]=0.0;g[a+12>>2]=1.0;g[a+16>>2]=0.0;g[a+20>>2]=0.0;i=d;return}else{e=b+192|0;c[a+0>>2]=c[e+0>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];c[a+16>>2]=c[e+16>>2];c[a+20>>2]=c[e+20>>2];i=d;return}}function PZa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0;d=i;i=i+64|0;e=d+48|0;f=d+32|0;h=d+16|0;j=d;if((c[a+252>>2]|0)==0){i=d;return}if((b|0)==0){Ic[c[(c[a>>2]|0)+148>>2]&511](f,a)}else{c[f+0>>2]=c[b+0>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2]}if((c[a+56>>2]&2097152|0)==0){b=a+236|0;c[h+0>>2]=c[b+0>>2];c[h+4>>2]=c[b+4>>2];c[h+8>>2]=c[b+8>>2];c[h+12>>2]=c[b+12>>2];if(!(+g[h>>2]>=+g[h+4>>2])?!(+g[h+8>>2]>=+g[h+12>>2]):0){Ila(f,h)}}RZa(j,a,f);c[j>>2]=(c[j>>2]|0)+ -2;f=j+4|0;c[f>>2]=(c[f>>2]|0)+ -2;f=j+8|0;c[f>>2]=(c[f>>2]|0)+2;f=j+12|0;c[f>>2]=(c[f>>2]|0)+2;f=Lc[c[(c[a>>2]|0)+12>>2]&255](a)|0;if((f|0)==0){i=d;return}h=c[a+80>>2]|0;if((h|0)==0){i=d;return}a=c[(c[f>>2]|0)+8>>2]|0;c[e+0>>2]=c[j+0>>2];c[e+4>>2]=c[j+4>>2];c[e+8>>2]=c[j+8>>2];c[e+12>>2]=c[j+12>>2];ld[a&255](f,h,e);i=d;return}function QZa(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=b+236|0;c[a+0>>2]=c[e+0>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];i=d;return}function RZa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0;e=i;i=i+48|0;f=e+24|0;h=e;c[f+0>>2]=c[d+0>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];f$a(h,b);rm(h,f);h=~~(+g[f+8>>2]+.5);b=~~(+g[f+4>>2]+.5);d=~~(+g[f+12>>2]+.5);c[a>>2]=~~(+g[f>>2]+.5);c[a+4>>2]=h;c[a+8>>2]=b;c[a+12>>2]=d;i=e;return}function SZa(a){a=a|0;return a|0}function TZa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;a:do{if(((((c[a+252>>2]|0)!=0?(c[a+256>>2]|0)!=0:0)?(c[a+264>>2]|0)!=0:0)?(f=a+184|0,(VZa(c[f>>2]|0,a)|0)!=0):0)?(g=a+8|0,h=c[a+12>>2]|0,(h|0)>0):0){j=0;while(1){k=JZa(g,j)|0;if((k|0)!=0?(VZa(c[f>>2]|0,k)|0)!=0:0){break}j=j+1|0;if((j|0)>=(h|0)){l=0;break a}}l=Qc[c[(c[k>>2]|0)+24>>2]&255](k,b,d)|0}else{l=0}}while(0);i=e;return l|0}function UZa(a){a=a|0;return a|0}function VZa(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;if((a|0)==0){d=0;i=c;return d|0}d=K_a(a,b)|0;i=c;return d|0}function WZa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;a:do{if(((((c[a+252>>2]|0)!=0?(c[a+256>>2]|0)!=0:0)?(c[a+264>>2]|0)!=0:0)?(f=a+184|0,(VZa(c[f>>2]|0,a)|0)!=0):0)?(g=a+8|0,h=c[a+12>>2]|0,(h|0)>0):0){j=0;while(1){k=JZa(g,j)|0;if((k|0)!=0?(VZa(c[f>>2]|0,k)|0)!=0:0){break}j=j+1|0;if((j|0)>=(h|0)){l=0;break a}}l=Qc[c[(c[k>>2]|0)+28>>2]&255](k,b,d)|0}else{l=0}}while(0);i=e;return l|0}function XZa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;a:do{if(((((c[a+252>>2]|0)!=0?(c[a+256>>2]|0)!=0:0)?(c[a+264>>2]|0)!=0:0)?(f=a+184|0,(VZa(c[f>>2]|0,a)|0)!=0):0)?(g=a+8|0,h=c[a+12>>2]|0,(h|0)>0):0){j=0;while(1){k=JZa(g,j)|0;if((k|0)!=0?(VZa(c[f>>2]|0,k)|0)!=0:0){break}j=j+1|0;if((j|0)>=(h|0)){l=0;break a}}l=Qc[c[(c[k>>2]|0)+32>>2]&255](k,b,d)|0}else{l=0}}while(0);i=e;return l|0}function YZa(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+32|0;f=e+16|0;g=e+8|0;h=e;if((c[a+252>>2]|0)==0){j=0;i=e;return j|0}if((c[a+256>>2]|0)==0){j=0;i=e;return j|0}if((c[a+264>>2]|0)==0){j=0;i=e;return j|0}k=a+184|0;l=(ZZa(c[k>>2]|0,a)|0)==0;m=a+8|0;n=c[a+12>>2]|0;o=(n|0)>0;if(!l){a:do{if(o){l=0;while(1){p=JZa(m,l)|0;if((p|0)!=0?(ZZa(c[k>>2]|0,p)|0)!=0:0){break}l=l+1|0;if((l|0)>=(n|0)){break a}}l=c[p>>2]|0;q=c[l+36>>2]|0;ld[c[l+164>>2]&255](f,p,b);j=Qc[q&255](p,f,d)|0;i=e;return j|0}}while(0);Rc[c[(c[a>>2]|0)+184>>2]&1023](a);j=0;i=e;return j|0}b:do{if(o){f=0;while(1){r=JZa(m,f)|0;if((r|0)!=0?(ld[c[(c[r>>2]|0)+164>>2]&255](g,r,b),(_Za(r,g)|0)!=0):0){break}f=f+1|0;if((f|0)>=(n|0)){break b}}f=c[r>>2]|0;p=c[f+36>>2]|0;ld[c[f+164>>2]&255](h,r,b);j=Qc[p&255](r,h,d)|0;i=e;return j|0}}while(0);if((_Za(a,b)|0)==0){j=0;i=e;return j|0}Rc[c[(c[a>>2]|0)+184>>2]&1023](a);j=0;i=e;return j|0}function ZZa(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;if((a|0)==0){d=0;i=c;return d|0}d=V_a(a,b)|0;i=c;return d|0}function _Za(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0;d=i;i=i+16|0;e=d;if((c[a+252>>2]|0)==0){f=0;h=f&1;i=d;return h|0}if((c[a+256>>2]|0)==0){f=0;h=f&1;i=d;return h|0}Ic[c[(c[a>>2]|0)+148>>2]&511](e,a);f=(Qla(e,+g[b>>2],+g[b+4>>2])|0)!=0;h=f&1;i=d;return h|0}function $Za(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+32|0;f=e+16|0;g=e+8|0;h=e;if((c[a+252>>2]|0)==0){j=0;i=e;return j|0}if((c[a+256>>2]|0)==0){j=0;i=e;return j|0}if((c[a+264>>2]|0)==0){j=0;i=e;return j|0}k=a+184|0;l=(ZZa(c[k>>2]|0,a)|0)==0;m=a+8|0;n=c[a+12>>2]|0;o=(n|0)>0;if(!l){a:do{if(o){l=0;while(1){p=JZa(m,l)|0;if((p|0)!=0?(ZZa(c[k>>2]|0,p)|0)!=0:0){break}l=l+1|0;if((l|0)>=(n|0)){break a}}l=c[p>>2]|0;q=c[l+40>>2]|0;ld[c[l+164>>2]&255](f,p,b);j=Qc[q&255](p,f,d)|0;i=e;return j|0}}while(0);Rc[c[(c[a>>2]|0)+184>>2]&1023](a);j=0;i=e;return j|0}b:do{if(o){f=0;while(1){r=JZa(m,f)|0;if((r|0)!=0?(ld[c[(c[r>>2]|0)+164>>2]&255](g,r,b),(_Za(r,g)|0)!=0):0){break}f=f+1|0;if((f|0)>=(n|0)){break b}}f=c[r>>2]|0;p=c[f+40>>2]|0;ld[c[f+164>>2]&255](h,r,b);j=Qc[p&255](r,h,d)|0;i=e;return j|0}}while(0);if((_Za(a,b)|0)==0){j=0;i=e;return j|0}Rc[c[(c[a>>2]|0)+184>>2]&1023](a);j=0;i=e;return j|0}function a_a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+32|0;f=e+16|0;g=e+8|0;h=e;if((c[a+252>>2]|0)==0){j=0;i=e;return j|0}if((c[a+256>>2]|0)==0){j=0;i=e;return j|0}if((c[a+264>>2]|0)==0){j=0;i=e;return j|0}k=a+184|0;l=(ZZa(c[k>>2]|0,a)|0)==0;m=a+8|0;n=c[a+12>>2]|0;o=(n|0)>0;if(!l){a:do{if(o){l=0;while(1){p=JZa(m,l)|0;if((p|0)!=0?(ZZa(c[k>>2]|0,p)|0)!=0:0){break}l=l+1|0;if((l|0)>=(n|0)){break a}}l=c[p>>2]|0;q=c[l+44>>2]|0;ld[c[l+164>>2]&255](f,p,b);j=Qc[q&255](p,f,d)|0;i=e;return j|0}}while(0);Rc[c[(c[a>>2]|0)+184>>2]&1023](a);j=0;i=e;return j|0}b:do{if(o){f=0;while(1){r=JZa(m,f)|0;if((r|0)!=0?(ld[c[(c[r>>2]|0)+164>>2]&255](g,r,b),(_Za(r,g)|0)!=0):0){break}f=f+1|0;if((f|0)>=(n|0)){break b}}f=c[r>>2]|0;p=c[f+44>>2]|0;ld[c[f+164>>2]&255](h,r,b);j=Qc[p&255](r,h,d)|0;i=e;return j|0}}while(0);if((_Za(a,b)|0)==0){j=0;i=e;return j|0}Rc[c[(c[a>>2]|0)+184>>2]&1023](a);j=0;i=e;return j|0}function b_a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+32|0;f=e+16|0;g=e+8|0;h=e;if((c[a+252>>2]|0)==0){j=0;i=e;return j|0}if((c[a+256>>2]|0)==0){j=0;i=e;return j|0}if((c[a+264>>2]|0)==0){j=0;i=e;return j|0}k=a+184|0;l=(ZZa(c[k>>2]|0,a)|0)==0;m=a+8|0;n=c[a+12>>2]|0;o=(n|0)>0;if(!l){a:do{if(o){l=0;while(1){p=JZa(m,l)|0;if((p|0)!=0?(ZZa(c[k>>2]|0,p)|0)!=0:0){break}l=l+1|0;if((l|0)>=(n|0)){break a}}l=c[p>>2]|0;q=c[l+48>>2]|0;ld[c[l+164>>2]&255](f,p,b);j=Qc[q&255](p,f,d)|0;i=e;return j|0}}while(0);Rc[c[(c[a>>2]|0)+184>>2]&1023](a);j=0;i=e;return j|0}b:do{if(o){f=0;while(1){r=JZa(m,f)|0;if((r|0)!=0?(ld[c[(c[r>>2]|0)+164>>2]&255](g,r,b),(_Za(r,g)|0)!=0):0){break}f=f+1|0;if((f|0)>=(n|0)){break b}}f=c[r>>2]|0;p=c[f+48>>2]|0;ld[c[f+164>>2]&255](h,r,b);j=Qc[p&255](r,h,d)|0;i=e;return j|0}}while(0);if((_Za(a,b)|0)==0){j=0;i=e;return j|0}Rc[c[(c[a>>2]|0)+184>>2]&1023](a);j=0;i=e;return j|0}function c_a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+32|0;f=e+16|0;g=e+8|0;h=e;if((c[a+252>>2]|0)==0){j=0;i=e;return j|0}if((c[a+256>>2]|0)==0){j=0;i=e;return j|0}if((c[a+264>>2]|0)==0){j=0;i=e;return j|0}k=a+184|0;l=(ZZa(c[k>>2]|0,a)|0)==0;m=a+8|0;n=c[a+12>>2]|0;o=(n|0)>0;if(!l){a:do{if(o){l=0;while(1){p=JZa(m,l)|0;if((p|0)!=0?(ZZa(c[k>>2]|0,p)|0)!=0:0){break}l=l+1|0;if((l|0)>=(n|0)){break a}}l=c[p>>2]|0;q=c[l+52>>2]|0;ld[c[l+164>>2]&255](f,p,b);j=Qc[q&255](p,f,d)|0;i=e;return j|0}}while(0);Rc[c[(c[a>>2]|0)+184>>2]&1023](a);j=0;i=e;return j|0}b:do{if(o){f=0;while(1){r=JZa(m,f)|0;if((r|0)!=0?(ld[c[(c[r>>2]|0)+164>>2]&255](g,r,b),(_Za(r,g)|0)!=0):0){break}f=f+1|0;if((f|0)>=(n|0)){break b}}f=c[r>>2]|0;p=c[f+52>>2]|0;ld[c[f+164>>2]&255](h,r,b);j=Qc[p&255](r,h,d)|0;i=e;return j|0}}while(0);if((_Za(a,b)|0)==0){j=0;i=e;return j|0}Rc[c[(c[a>>2]|0)+184>>2]&1023](a);j=0;i=e;return j|0}function d_a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+32|0;f=e+16|0;g=e+8|0;h=e;if((c[a+252>>2]|0)==0){j=0;i=e;return j|0}if((c[a+256>>2]|0)==0){j=0;i=e;return j|0}if((c[a+264>>2]|0)==0){j=0;i=e;return j|0}k=a+184|0;l=(ZZa(c[k>>2]|0,a)|0)==0;m=a+8|0;n=c[a+12>>2]|0;o=(n|0)>0;if(!l){a:do{if(o){l=0;while(1){p=JZa(m,l)|0;if((p|0)!=0?(ZZa(c[k>>2]|0,p)|0)!=0:0){break}l=l+1|0;if((l|0)>=(n|0)){break a}}l=c[p>>2]|0;q=c[l+56>>2]|0;ld[c[l+164>>2]&255](f,p,b);j=Qc[q&255](p,f,d)|0;i=e;return j|0}}while(0);Rc[c[(c[a>>2]|0)+184>>2]&1023](a);j=0;i=e;return j|0}b:do{if(o){f=0;while(1){r=JZa(m,f)|0;if((r|0)!=0?(ld[c[(c[r>>2]|0)+164>>2]&255](g,r,b),(_Za(r,g)|0)!=0):0){break}f=f+1|0;if((f|0)>=(n|0)){break b}}f=c[r>>2]|0;p=c[f+56>>2]|0;ld[c[f+164>>2]&255](h,r,b);j=Qc[p&255](r,h,d)|0;i=e;return j|0}}while(0);if((_Za(a,b)|0)==0){j=0;i=e;return j|0}Rc[c[(c[a>>2]|0)+184>>2]&1023](a);j=0;i=e;return j|0}function e_a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+32|0;f=e+16|0;g=e+8|0;h=e;if((c[a+252>>2]|0)==0){j=0;i=e;return j|0}if((c[a+256>>2]|0)==0){j=0;i=e;return j|0}if((c[a+264>>2]|0)==0){j=0;i=e;return j|0}k=a+184|0;l=(ZZa(c[k>>2]|0,a)|0)==0;m=a+8|0;n=c[a+12>>2]|0;o=(n|0)>0;if(!l){a:do{if(o){l=0;while(1){p=JZa(m,l)|0;if((p|0)!=0?(ZZa(c[k>>2]|0,p)|0)!=0:0){break}l=l+1|0;if((l|0)>=(n|0)){break a}}l=c[p>>2]|0;q=c[l+60>>2]|0;ld[c[l+164>>2]&255](f,p,b);j=Qc[q&255](p,f,d)|0;i=e;return j|0}}while(0);Rc[c[(c[a>>2]|0)+184>>2]&1023](a);j=0;i=e;return j|0}b:do{if(o){f=0;while(1){r=JZa(m,f)|0;if((r|0)!=0?(ld[c[(c[r>>2]|0)+164>>2]&255](g,r,b),(_Za(r,g)|0)!=0):0){break}f=f+1|0;if((f|0)>=(n|0)){break b}}f=c[r>>2]|0;p=c[f+60>>2]|0;ld[c[f+164>>2]&255](h,r,b);j=Qc[p&255](r,h,d)|0;i=e;return j|0}}while(0);if((_Za(a,b)|0)==0){j=0;i=e;return j|0}Rc[c[(c[a>>2]|0)+184>>2]&1023](a);j=0;i=e;return j|0}function f_a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+32|0;f=e+16|0;g=e+8|0;h=e;if((c[a+252>>2]|0)==0){j=0;i=e;return j|0}if((c[a+256>>2]|0)==0){j=0;i=e;return j|0}if((c[a+264>>2]|0)==0){j=0;i=e;return j|0}k=a+184|0;l=(ZZa(c[k>>2]|0,a)|0)==0;m=a+8|0;n=c[a+12>>2]|0;o=(n|0)>0;if(!l){a:do{if(o){l=0;while(1){p=JZa(m,l)|0;if((p|0)!=0?(ZZa(c[k>>2]|0,p)|0)!=0:0){break}l=l+1|0;if((l|0)>=(n|0)){break a}}l=c[p>>2]|0;q=c[l+64>>2]|0;ld[c[l+164>>2]&255](f,p,b);j=Qc[q&255](p,f,d)|0;i=e;return j|0}}while(0);Rc[c[(c[a>>2]|0)+184>>2]&1023](a);j=0;i=e;return j|0}b:do{if(o){f=0;while(1){r=JZa(m,f)|0;if((r|0)!=0?(ld[c[(c[r>>2]|0)+164>>2]&255](g,r,b),(_Za(r,g)|0)!=0):0){break}f=f+1|0;if((f|0)>=(n|0)){break b}}f=c[r>>2]|0;p=c[f+64>>2]|0;ld[c[f+164>>2]&255](h,r,b);j=Qc[p&255](r,h,d)|0;i=e;return j|0}}while(0);if((_Za(a,b)|0)==0){j=0;i=e;return j|0}Rc[c[(c[a>>2]|0)+184>>2]&1023](a);j=0;i=e;return j|0}function g_a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+32|0;f=e+16|0;g=e+8|0;h=e;if((c[a+252>>2]|0)==0){j=0;i=e;return j|0}if((c[a+256>>2]|0)==0){j=0;i=e;return j|0}if((c[a+264>>2]|0)==0){j=0;i=e;return j|0}k=a+184|0;l=(ZZa(c[k>>2]|0,a)|0)==0;m=a+8|0;n=c[a+12>>2]|0;o=(n|0)>0;if(!l){a:do{if(o){l=0;while(1){p=JZa(m,l)|0;if((p|0)!=0?(ZZa(c[k>>2]|0,p)|0)!=0:0){break}l=l+1|0;if((l|0)>=(n|0)){break a}}l=c[p>>2]|0;q=c[l+68>>2]|0;ld[c[l+164>>2]&255](f,p,b);j=Qc[q&255](p,f,d)|0;i=e;return j|0}}while(0);Rc[c[(c[a>>2]|0)+184>>2]&1023](a);j=0;i=e;return j|0}b:do{if(o){f=0;while(1){r=JZa(m,f)|0;if((r|0)!=0?(ld[c[(c[r>>2]|0)+164>>2]&255](g,r,b),(_Za(r,g)|0)!=0):0){break}f=f+1|0;if((f|0)>=(n|0)){break b}}f=c[r>>2]|0;p=c[f+68>>2]|0;ld[c[f+164>>2]&255](h,r,b);j=Qc[p&255](r,h,d)|0;i=e;return j|0}}while(0);if((_Za(a,b)|0)==0){j=0;i=e;return j|0}Rc[c[(c[a>>2]|0)+184>>2]&1023](a);j=0;i=e;return j|0}function h_a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+32|0;f=e+16|0;g=e+8|0;h=e;if((c[a+252>>2]|0)==0){j=0;i=e;return j|0}if((c[a+256>>2]|0)==0){j=0;i=e;return j|0}if((c[a+264>>2]|0)==0){j=0;i=e;return j|0}k=a+184|0;l=(ZZa(c[k>>2]|0,a)|0)==0;m=a+8|0;n=c[a+12>>2]|0;o=(n|0)>0;if(!l){a:do{if(o){l=0;while(1){p=JZa(m,l)|0;if((p|0)!=0?(ZZa(c[k>>2]|0,p)|0)!=0:0){break}l=l+1|0;if((l|0)>=(n|0)){break a}}l=c[p>>2]|0;q=c[l+72>>2]|0;ld[c[l+164>>2]&255](f,p,b);j=Qc[q&255](p,f,d)|0;i=e;return j|0}}while(0);Rc[c[(c[a>>2]|0)+184>>2]&1023](a);j=0;i=e;return j|0}b:do{if(o){f=0;while(1){r=JZa(m,f)|0;if((r|0)!=0?(ld[c[(c[r>>2]|0)+164>>2]&255](g,r,b),(_Za(r,g)|0)!=0):0){break}f=f+1|0;if((f|0)>=(n|0)){break b}}f=c[r>>2]|0;p=c[f+72>>2]|0;ld[c[f+164>>2]&255](h,r,b);j=Qc[p&255](r,h,d)|0;i=e;return j|0}}while(0);if((_Za(a,b)|0)==0){j=0;i=e;return j|0}Rc[c[(c[a>>2]|0)+184>>2]&1023](a);j=0;i=e;return j|0}function i_a(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;i=i+16|0;g=f;if((c[a+252>>2]|0)==0){h=0;i=f;return h|0}if((c[a+256>>2]|0)==0){h=0;i=f;return h|0}if((c[a+264>>2]|0)==0){h=0;i=f;return h|0}Rc[c[(c[a>>2]|0)+184>>2]&1023](a);j=a+184|0;if((VZa(c[j>>2]|0,a)|0)==0){h=0;i=f;return h|0}k=a+8|0;l=c[a+12>>2]|0;if((l|0)>0){m=0}else{h=0;i=f;return h|0}while(1){n=JZa(k,m)|0;if((n|0)!=0?(VZa(c[j>>2]|0,n)|0)!=0:0){break}m=m+1|0;if((m|0)>=(l|0)){h=0;o=10;break}}if((o|0)==10){i=f;return h|0}o=c[n>>2]|0;l=c[o+76>>2]|0;ld[c[o+164>>2]&255](g,n,d);h=id[l&511](n,b,g,e)|0;i=f;return h|0}function j_a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+4|0;f=c[e>>2]|0;g=f+1|0;do{if((f|0)>=(c[a+8>>2]|0)){if((Kja(a,g)|0)==0){i=d;return}else{h=c[e>>2]|0;break}}else{c[e>>2]=g;h=g}}while(0);c[(c[a>>2]|0)+(h+ -1<<2)>>2]=b;i=d;return}function k_a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=a+8|0;f=c[a+12>>2]|0;do{a=f;f=f+ -1|0;if((a|0)<=0){g=5;break}a=JZa(e,f)|0}while(!((a|0)!=0&(a|0)==(b|0)));if((g|0)==5){i=d;return}Oja(e,f);i=d;return}function l_a(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;e=i;if((c|0)==1){k_a(a,b)}else if((c|0)==0){j_a(a+8|0,b)}i=e;return}function m_a(a,b){a=a|0;b=b|0;var c=0;c=i;c3a(a|0,b+24|0,192)|0;i=c;return}function n_a(a){a=a|0;return a|0}function o_a(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=b+220|0;c[a+0>>2]=c[e+0>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];i=d;return}function p_a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0.0;d=i;i=i+32|0;e=d+16|0;f=d;Ic[c[(c[b>>2]|0)+148>>2]&511](e,b);h=FZa(b)|0;sYa(f,e,+((Lc[c[(c[b>>2]|0)+128>>2]&255](b)|0)+h|0));h=q_a(b)|0;if((h|0)!=0){j=+T0a(c[h+256>>2]|0);h=f+4|0;g[h>>2]=+g[h>>2]-j}Hla(f);if((Pla(e,f)|0)==0){c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;i=d;return}else{c[a+0>>2]=c[f+0>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];i=d;return}}function q_a(a){a=a|0;var b=0,d=0;b=i;if((c[a+56>>2]&134217728|0)==0){d=0;i=b;return d|0}d=c[a+216>>2]|0;i=b;return d|0}function r_a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0;d=i;i=i+16|0;e=d;Ic[c[(c[b>>2]|0)+152>>2]&511](e,b);f=(+g[e+12>>2]+ +g[e+8>>2])*.5;g[a>>2]=(+g[e>>2]+ +g[e+4>>2])*.5;g[a+4>>2]=f;i=d;return}function s_a(a){a=a|0;var b=0;b=a+56|0;c[b>>2]=c[b>>2]&-4194305;return}function t_a(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=b+60|0;c[a+0>>2]=c[e+0>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];c[a+16>>2]=c[e+16>>2];i=d;return}function u_a(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+116|0;c[e+0>>2]=c[b+0>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];c[e+16>>2]=c[b+16>>2];i=d;return}function v_a(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+136|0;c[e+0>>2]=c[b+0>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];c[e+16>>2]=c[b+16>>2];i=d;return}function w_a(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=b+116|0;c[a+0>>2]=c[e+0>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];c[a+16>>2]=c[e+16>>2];i=d;return}function x_a(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=b+136|0;c[a+0>>2]=c[e+0>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];c[a+16>>2]=c[e+16>>2];i=d;return}function y_a(a){a=a|0;return 0}function z_a(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((c[b+56>>2]&1073741824|0)==0){c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;i=d;return}else{e=b+96|0;c[a+0>>2]=c[e+0>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];c[a+16>>2]=c[e+16>>2];i=d;return}}function A_a(a){a=a|0;return a|0}function B_a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+192|0;e=d;f=a+216|0;if((c[f>>2]|0)!=0){i=d;return}if((c[a+56>>2]&134217728|0)==0){i=d;return}c3a(e|0,b|0,192)|0;c[e+32>>2]=-1604321280;c[e+156>>2]=a;c[e+36>>2]=1;g[e+40>>2]=1.0;g[e+44>>2]=0.0;g[e+48>>2]=0.0;g[e+52>>2]=0.0;c[e+164>>2]=0;c[e+132>>2]=150;a=Z1a(348)|0;y0a(a,1);c[f>>2]=a;if((a|0)==0){i=d;return}rZa(a,e);i=d;return}function C_a(a){a=a|0;var b=0,d=0;b=i;d=c[a+184>>2]|0;if((d|0)==0){i=b;return}D_a(d,a);i=b;return}function D_a(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;Kja(a,0)|0;if((b|0)==0){i=d;return}c[a+36>>2]=b;e=b;do{j_a(a,e);e=c[e+180>>2]|0}while((e|0)!=0);i=d;return}function E_a(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+8|0;e=c[a+12>>2]|0;if((e|0)>0){f=0;do{g=JZa(d,f)|0;if((g|0)!=0){E_a(g)}f=f+1|0}while((f|0)!=(e|0))}e=c[a+184>>2]|0;if((e|0)==0){i=b;return}F_a(e);i=b;return}function F_a(a){a=a|0;var b=0;b=i;c[a+36>>2]=0;Kja(a,0)|0;i=b;return}function G_a(a){a=a|0;var b=0,d=0;b=i;d=c[a+184>>2]|0;if((d|0)==0){i=b;return}if((c[d+40>>2]|0)!=(a|0)){H_a(d)}I_a(d,a);i=b;return}function H_a(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+16|0;if((c[a+20>>2]|0)>0?(e=JZa(d,0)|0,(e|0)!=0):0){Rc[c[(c[e>>2]|0)+228>>2]&1023](e)}c[a+40>>2]=0;Kja(d,0)|0;i=b;return}function I_a(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+16|0;Kja(e,0)|0;if((b|0)==0){i=d;return}c[a+40>>2]=b;a=b;do{j_a(e,a);a=c[a+180>>2]|0}while((a|0)!=0);Rc[c[(c[b>>2]|0)+224>>2]&1023](b);i=d;return}function J_a(a){a=a|0;var b=0,d=0;b=i;d=c[a+184>>2]|0;if((d|0)==0){i=b;return}if((K_a(d,a)|0)==0){i=b;return}H_a(d);i=b;return}function K_a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;a:do{if((b|0)!=0?(e=a+16|0,f=c[a+20>>2]|0,(f|0)>0):0){g=0;while(1){if((JZa(e,g)|0)==(b|0)){h=1;break a}g=g+1|0;if((g|0)>=(f|0)){h=0;break}}}else{h=0}}while(0);i=d;return h|0}function L_a(a){a=a|0;return}function M_a(a){a=a|0;return}function N_a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0;d=i;i=i+16|0;e=d;if((c[a+252>>2]|0)==0){f=0;h=f&1;i=d;return h|0}if((c[a+256>>2]|0)==0){f=0;h=f&1;i=d;return h|0}Ic[c[(c[a>>2]|0)+152>>2]&511](e,a);f=(Qla(e,+g[b>>2],+g[b+4>>2])|0)!=0;h=f&1;i=d;return h|0}function O_a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;if((c[a+252>>2]|0)==0){i=d;return}e=a+8|0;f=c[a+12>>2]|0;if((f|0)>0){g=0;do{h=JZa(e,g)|0;if((h|0)!=0){Ic[c[(c[h>>2]|0)+100>>2]&511](h,b)}g=g+1|0}while((g|0)!=(f|0))}f=a+256|0;if((c[f>>2]|0)==(b|0)){i=d;return}c[f>>2]=b;Rc[c[(c[a>>2]|0)+192>>2]&1023](a);Ic[c[(c[a>>2]|0)+20>>2]&511](a,0);i=d;return}function P_a(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=a+236|0;c[e+0>>2]=c[b+0>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];Hla(e);i=d;return}function Q_a(a){a=a|0;return a>>>24&1|0}function R_a(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0.0,k=0.0,l=0.0;b=i;i=i+48|0;d=b+32|0;e=b+16|0;f=b;Ic[c[(c[a>>2]|0)+148>>2]&511](e,a);h=FZa(a)|0;sYa(d,e,+((Lc[c[(c[a>>2]|0)+128>>2]&255](a)|0)+h|0));h=q_a(a)|0;j=+g[d+4>>2];k=+g[d+8>>2];l=+g[d+12>>2];g[f>>2]=j+-12.0;g[f+8>>2]=k;g[f+4>>2]=j+-1.0;g[f+12>>2]=l;if((h|0)==0){i=b;return}BZa(h,f,1,0);i=b;return}function S_a(a,b){a=a|0;b=b|0;return}function T_a(a){a=a|0;var b=0,d=0;b=i;if((c[a+252>>2]|0)==0){i=b;return}d=Lc[c[(c[a>>2]|0)+12>>2]&255](a)|0;if((d|0)==0){i=b;return}Ic[c[(c[d>>2]|0)+36>>2]&511](d,c[a+188>>2]|0);i=b;return}function U_a(a){a=a|0;var b=0,d=0;b=i;d=ZZa(c[a+184>>2]|0,a)|0;i=b;return d|0}function V_a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;a:do{if((b|0)!=0?(e=c[a+4>>2]|0,(e|0)>0):0){f=0;while(1){if((JZa(a,f)|0)==(b|0)){g=1;break a}f=f+1|0;if((f|0)>=(e|0)){g=0;break}}}else{g=0}}while(0);i=d;return g|0}function W_a(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+184>>2]|0;if((d|0)==0){e=0;i=b;return e|0}e=(c[d+40>>2]|0)==(a|0)&1;i=b;return e|0}function X_a(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;Ic[c[(c[b>>2]|0)+148>>2]&511](e,b);rYa(a,e,1.0);i=d;return}function Y_a(a){a=a|0;return+(+g[a+160>>2])}function Z_a(a,b){a=a|0;b=+b;g[a+160>>2]=b;return}function __a(a){a=a|0;return c[a+40>>2]|0}function $_a(a){a=a|0;return a|0}function a$a(a){a=a|0;return a|0}function b$a(a){a=a|0;return a|0}function c$a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0;b=i;e=a+4|0;f=a+8|0;h=a+12|0;j=a+16|0;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;if((d|0)==3){c[a>>2]=1;g[e>>2]=.5;g[f>>2]=0.0;g[h>>2]=0.0;g[j>>2]=0.0;i=b;return}else if((d|0)==2){c[a>>2]=1;g[e>>2]=1.0;g[f>>2]=0.0;g[h>>2]=0.0;g[j>>2]=0.0;i=b;return}else{i=b;return}}function d$a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+32|0;f=e;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;if((d|0)==3){c[a>>2]=1;g[a+4>>2]=.75;g[a+8>>2]=0.0;g[a+12>>2]=0.0;g[a+16>>2]=0.0;i=e;return}else if((d|0)==2){Ic[c[(c[b>>2]|0)+108>>2]&511](f,b);GYa(a,f);i=e;return}else{i=e;return}}function e$a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a+8|0;f=c[a+12>>2]|0;if((f|0)>0){g=0;do{h=JZa(e,g)|0;if((h|0)!=0){e$a(h,b)}g=g+1|0}while((g|0)!=(f|0))}c[a+156>>2]=b;i=d;return}function f$a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+32|0;e=d;g$a(a,b);f=c[b+48>>2]|0;if((f|0)==0){i=d;return}ld[c[c[f>>2]>>2]&255](e,f,c[b+176>>2]|0);Wla(a,e);i=d;return}function g$a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+32|0;e=d;g[a>>2]=1.0;g[a+4>>2]=0.0;g[a+8>>2]=0.0;g[a+12>>2]=1.0;g[a+16>>2]=0.0;g[a+20>>2]=0.0;if((c[b+56>>2]|0)>-1){i=d;return}else{f=b}do{OZa(e,f);Wla(a,e);f=c[f+180>>2]|0}while((f|0)!=0);i=d;return}function h$a(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0;f=i;i=i+32|0;h=f+8|0;j=f;f$a(h,a);a=b;b=c[a+4>>2]|0;k=j;c[k>>2]=c[a>>2];c[k+4>>2]=b;b=j+4|0;fma(h,j,b);c[d>>2]=~~(+g[j>>2]+.5);c[e>>2]=~~(+g[b>>2]+.5);i=f;return}function i$a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+32|0;f=e+8|0;g=e;OZa(f,b);if((uF(f)|0)==0){b=d;h=c[b+4>>2]|0;j=g;c[j>>2]=c[b>>2];c[j+4>>2]=h;fma(f,g,g+4|0);f=g;g=c[f+4>>2]|0;h=a;c[h>>2]=c[f>>2];c[h+4>>2]=g;i=e;return}else{g=d;d=c[g+4>>2]|0;h=a;c[h>>2]=c[g>>2];c[h+4>>2]=d;i=e;return}}function j$a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+48|0;f=e+16|0;g=e;OZa(f,b);if((uF(f)|0)==0){c[g+0>>2]=c[d+0>>2];c[g+4>>2]=c[d+4>>2];c[g+8>>2]=c[d+8>>2];c[g+12>>2]=c[d+12>>2];rm(f,g);c[a+0>>2]=c[g+0>>2];c[a+4>>2]=c[g+4>>2];c[a+8>>2]=c[g+8>>2];c[a+12>>2]=c[g+12>>2];i=e;return}else{c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];i=e;return}}function k$a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+32|0;f=e+8|0;g=e;OZa(f,b);if((uF(f)|0)==0){Ula(f,f);b=d;h=c[b+4>>2]|0;j=g;c[j>>2]=c[b>>2];c[j+4>>2]=h;fma(f,g,g+4|0);f=g;g=c[f+4>>2]|0;h=a;c[h>>2]=c[f>>2];c[h+4>>2]=g;i=e;return}else{g=d;d=c[g+4>>2]|0;h=a;c[h>>2]=c[g>>2];c[h+4>>2]=d;i=e;return}}function l$a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+48|0;f=e+16|0;g=e;OZa(f,b);if((uF(f)|0)==0){Ula(f,f);c[g+0>>2]=c[d+0>>2];c[g+4>>2]=c[d+4>>2];c[g+8>>2]=c[d+8>>2];c[g+12>>2]=c[d+12>>2];rm(f,g);c[a+0>>2]=c[g+0>>2];c[a+4>>2]=c[g+4>>2];c[a+8>>2]=c[g+8>>2];c[a+12>>2]=c[g+12>>2];i=e;return}else{c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];i=e;return}}function m$a(a){a=a|0;return}function n$a(a){a=a|0;return}function o$a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=Lc[c[(c[a>>2]|0)+12>>2]&255](a)|0;if((e|0)==0){f=0;i=d;return f|0}f=dd[c[(c[e>>2]|0)+84>>2]&511](e,b)|0;i=d;return f|0}function p$a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=Lc[c[(c[a>>2]|0)+12>>2]&255](a)|0;if((e|0)==0){f=0;i=d;return f|0}f=dd[c[(c[e>>2]|0)+80>>2]&511](e,b)|0;i=d;return f|0}function q$a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=Lc[c[(c[a>>2]|0)+12>>2]&255](a)|0;if((e|0)==0){f=0;i=d;return f|0}f=dd[c[(c[e>>2]|0)+88>>2]&511](e,b)|0;i=d;return f|0}function r$a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=Lc[c[(c[a>>2]|0)+12>>2]&255](a)|0;if((e|0)==0){f=0;i=d;return f|0}f=dd[c[(c[e>>2]|0)+92>>2]&511](e,b)|0;i=d;return f|0}function s$a(a){a=a|0;var b=0;b=i;t$a(a);Jja(c[a+16>>2]|0);Jja(c[a>>2]|0);i=b;return}function t$a(a){a=a|0;var b=0;b=i;Kja(a,0)|0;Kja(a+16|0,0)|0;c[a+36>>2]=0;c[a+40>>2]=0;i=b;return}function u$a(a,b){a=a|0;b=b|0;var d=0;d=i;Ija(a,4);Ija(a+16|0,4);c[a+32>>2]=b;t$a(a);i=d;return}function v$a(){var a=0;a=i;zma(1292104,10);qb(581,1292104,p|0)|0;i=a;return}function w$a(a){a=a|0;var b=0;b=i;nZa(a);c[a>>2]=1292440;c[a+268>>2]=0;i=b;return}function x$a(a){a=a|0;var b=0;b=i;pZa(a);$1a(a);i=b;return}function y$a(a){a=a|0;var b=0;b=i;pZa(a);i=b;return}function z$a(a,b){a=a|0;b=b|0;b=i;eka(a,1292680,-1);i=b;return}function A$a(a,b){a=a|0;b=b|0;c[b+164>>2]=5;return}function B$a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;$Za(a,b,d)|0;c[a+268>>2]=1;C_a(a);i=e;return 1}function C$a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;a_a(a,b,d)|0;E_a(a);c[a+268>>2]=0;i=e;return 1}function D$a(a){a=a|0;var b=0,d=0,e=0;b=i;nZa(a);c[a>>2]=1292704;d=a+268|0;e=a+288|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;g[e>>2]=.4000000059604645;e=a+292|0;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;i=b;return}function E$a(a){a=a|0;var b=0;b=i;pZa(a);$1a(a);i=b;return}function F$a(a){a=a|0;var b=0;b=i;pZa(a);i=b;return}function G$a(a,b){a=a|0;b=b|0;b=i;eka(a,1292944,-1);i=b;return}function H$a(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;i=i+16|0;d=c;g[d>>2]=0.0;g[d+4>>2]=0.0;I$a(a,b,d);i=c;return}function I$a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0;e=i;i=i+160|0;f=e+144|0;h=e+128|0;j=e+112|0;k=e+96|0;l=e+80|0;m=e+72|0;n=e+64|0;o=e+56|0;p=e+48|0;q=e+40|0;r=e+32|0;s=e+24|0;t=e+16|0;u=e+8|0;v=e;if((c[a+256>>2]|0)==0){i=e;return}if((c[a+268>>2]|0)==0){i=e;return}gla(f);K$a(h,a);QZa(j,a);w=d+4|0;iYa(k,h,+g[d>>2],+g[w>>2]);c[h+0>>2]=c[k+0>>2];c[h+4>>2]=c[k+4>>2];c[h+8>>2]=c[k+8>>2];c[h+12>>2]=c[k+12>>2];iYa(l,j,+g[d>>2],+g[w>>2]);c[j+0>>2]=c[l+0>>2];c[j+4>>2]=c[l+4>>2];c[j+8>>2]=c[l+8>>2];c[j+12>>2]=c[l+12>>2];pe(m,1293864);qla(f,c[m>>2]|0,c[m+4>>2]|0)|0;x=+g[j>>2];y=+g[j+4>>2];if(!(x>=y)?(z=+g[j+8>>2],A=+g[j+12>>2],!(z>=A)):0){j=tla(f,x)|0;pe(n,1305864);m=tla(qla(j,c[n>>2]|0,c[n+4>>2]|0)|0,z+2.5)|0;pe(o,1305864);n=tla(qla(m,c[o>>2]|0,c[o+4>>2]|0)|0,y-x)|0;pe(p,1305864);o=tla(qla(n,c[p>>2]|0,c[p+4>>2]|0)|0,A-z+-4.5)|0;pe(q,1293240);qla(o,c[q>>2]|0,c[q+4>>2]|0)|0}q=a+288|0;a=tla(f,+g[q>>2])|0;pe(r,1292960);qla(a,c[r>>2]|0,c[r+4>>2]|0)|0;z=+g[h>>2];r=tla(f,z+ +g[q>>2]*.5)|0;pe(s,1305864);a=qla(r,c[s>>2]|0,c[s+4>>2]|0)|0;s=tla(a,+g[h+8>>2])|0;pe(t,1293880);qla(s,c[t>>2]|0,c[t+4>>2]|0)|0;t=tla(f,z+ +g[q>>2]*.5)|0;pe(u,1305864);q=qla(t,c[u>>2]|0,c[u+4>>2]|0)|0;u=tla(q,+g[h+12>>2])|0;pe(v,1292968);qla(u,c[v>>2]|0,c[v+4>>2]|0)|0;v=f+4|0;ula(b,c[v>>2]|0,c[f+8>>2]|0)|0;ila(c[v>>2]|0);i=e;return}function J$a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0;e=i;i=i+80|0;f=e+56|0;h=e+40|0;j=e+28|0;k=e;if((c[a+256>>2]|0)==0){i=e;return}if((c[a+268>>2]|0)==0){i=e;return}K$a(f,a);QZa(h,a);OIa(j);QIa(j,2);l=a+288|0;m=+g[f>>2]+ +g[l>>2]*.5;a=f+12|0;n=+g[a>>2];o=f+8|0;p=+g[o>>2];if(!(+g[h>>2]>=+g[h+4>>2])?!(+g[h+8>>2]>=+g[h+12>>2]):0){Ila(f,h);if(!(+g[f>>2]>=+g[f+4>>2])?(q=+g[o>>2],r=+g[a>>2],!(q>=r)):0){WIa(j,0,m,q,6);WIa(j,1,m,r,2);s=9}}else{WIa(j,0,m,p,6);WIa(j,1,m,n,2);s=9}if((s|0)==9){dJa(k);g[k+24>>2]=+g[l>>2];UGa(b,j,d,k,0,-16777216,1,0)|0;gJa(c[k+8>>2]|0)}PIa(c[j+4>>2]|0);i=e;return}function K$a(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0;c=+g[b+284>>2];d=+g[b+272>>2]+ +g[b+288>>2];e=+g[b+276>>2];g[a>>2]=+g[b+280>>2];g[a+8>>2]=c;g[a+4>>2]=d;g[a+12>>2]=e;return}function L$a(a){a=a|0;var b=0,d=0,e=0;b=i;d=a+292|0;e=c[d>>2]|0;if((e|0)>0){c[d>>2]=e+ -1;i=b;return}else{e=a+268|0;c[e>>2]=(c[e>>2]|0)==0&1;Ic[c[(c[a>>2]|0)+20>>2]&511](a,0);i=b;return}}function M$a(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0;f=i;if((b|0)==0){b=a+268|0;h=a+256|0;c[b+0>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b+16>>2]=0;if((c[h>>2]|0)==0){i=f;return}lZa(c[a+4>>2]|0);O_a(a,0);i=f;return}h=a+272|0;if((c[a+256>>2]|0)==0){b=d;j=c[b+4>>2]|0;k=h;c[k>>2]=c[b>>2];c[k+4>>2]=j;j=e;k=c[j+4>>2]|0;b=a+280|0;c[b>>2]=c[j>>2];c[b+4>>2]=k;lZa(c[a+4>>2]|0);kZa(a,500);O_a(a,1);c[a+268>>2]=1;BZa(a,a+296|0,0,1);i=f;return}if(((!(+g[h>>2]!=+g[d>>2])?!(+g[a+276>>2]!=+g[d+4>>2]):0)?!(+g[a+280>>2]!=+g[e>>2]):0)?!(+g[a+284>>2]!=+g[e+4>>2]):0){i=f;return}k=d;d=c[k+4>>2]|0;b=h;c[b>>2]=c[k>>2];c[b+4>>2]=d;d=e;e=c[d+4>>2]|0;b=a+280|0;c[b>>2]=c[d>>2];c[b+4>>2]=e;c[a+268>>2]=1;BZa(a,a+296|0,0,1);i=f;return}function N$a(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;i=i+16|0;d=c;if((b|0)==0){PZa(a,0);i=c;return}else{rYa(d,b,.5);b=d+12|0;g[b>>2]=+g[b>>2]+1.0;b=d+8|0;g[b>>2]=+g[b>>2]+-1.0;PZa(a,d);i=c;return}}function O$a(a,b){a=a|0;b=b|0;return}function P$a(a){a=a|0;var b=0;b=i;nZa(a);c[a>>2]=1292984;c[a+268>>2]=0;c[a+272>>2]=0;i=b;return}function Q$a(a){a=a|0;var b=0;b=i;R$a(a);$1a(a);i=b;return}function R$a(a){a=a|0;var b=0;b=i;c[a>>2]=1292984;dka(a+272|0);pZa(a);i=b;return}function S$a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;d=i;i=i+272|0;e=d+248|0;f=d+240|0;h=d+224|0;j=d+200|0;k=d+176|0;l=d+172|0;m=d+168|0;n=d+164|0;o=d+160|0;p=d+152|0;q=d+144|0;r=d+136|0;s=d+128|0;t=d+120|0;u=d+112|0;v=d+104|0;w=d+96|0;x=d+88|0;y=d+80|0;z=d+72|0;A=d+64|0;B=d+56|0;C=d+48|0;D=d+40|0;E=d+32|0;F=d+24|0;G=d+16|0;H=d+8|0;I=d;gla(e);T$a(f,b);Ic[c[(c[b>>2]|0)+152>>2]&511](h,b);J=j+12|0;g[J>>2]=1.0;g[j>>2]=1.0;K=j+20|0;g[K>>2]=0.0;L=j+16|0;g[L>>2]=0.0;M=j+8|0;g[M>>2]=0.0;N=j+4|0;g[N>>2]=0.0;O=b+268|0;U$a(k,c[O>>2]|0);Ula(j,k);g[l>>2]=1.0;g[m>>2]=1.0;ld[c[(c[b>>2]|0)+244>>2]&255](b,l,m);g[n>>2]=0.0;g[o>>2]=0.0;ld[c[(c[b>>2]|0)+248>>2]&255](b,n,o);if((c[O>>2]|0)==0){P=e+4|0;Q=c[P>>2]|0;R=e+8|0;S=c[R>>2]|0;pla(I,Q,S);jka(a,I);dka(f);T=c[P>>2]|0;ila(T);i=d;return}O=c[f>>2]|0;if((O|0)==0){P=e+4|0;Q=c[P>>2]|0;R=e+8|0;S=c[R>>2]|0;pla(I,Q,S);jka(a,I);dka(f);T=c[P>>2]|0;ila(T);i=d;return}if((c[O+4>>2]|0)<=0){P=e+4|0;Q=c[P>>2]|0;R=e+8|0;S=c[R>>2]|0;pla(I,Q,S);jka(a,I);dka(f);T=c[P>>2]|0;ila(T);i=d;return}pe(p,1293864);qla(e,c[p>>2]|0,c[p+4>>2]|0)|0;p=tla(e,+g[h>>2])|0;pe(q,1305864);O=qla(p,c[q>>2]|0,c[q+4>>2]|0)|0;q=h+8|0;p=tla(O,+g[q>>2])|0;pe(r,1305864);O=qla(p,c[r>>2]|0,c[r+4>>2]|0)|0;r=tla(O,+g[h+4>>2]- +g[h>>2])|0;pe(s,1305864);O=qla(r,c[s>>2]|0,c[s+4>>2]|0)|0;s=tla(O,+g[h+12>>2]- +g[q>>2])|0;pe(t,1293240);qla(s,c[t>>2]|0,c[t+4>>2]|0)|0;t=tla(e,+g[l>>2])|0;pe(u,1293256);l=qla(t,c[u>>2]|0,c[u+4>>2]|0)|0;u=tla(l,+g[m>>2])|0;pe(v,1305864);m=qla(u,c[v>>2]|0,c[v+4>>2]|0)|0;v=tla(m,+g[h>>2]+ +g[n>>2])|0;pe(w,1305864);n=qla(v,c[w>>2]|0,c[w+4>>2]|0)|0;w=tla(n,+g[q>>2]+ +g[o>>2])|0;pe(x,1293264);qla(w,c[x>>2]|0,c[x+4>>2]|0)|0;x=tla(e,+g[j>>2])|0;pe(y,1305864);j=qla(x,c[y>>2]|0,c[y+4>>2]|0)|0;y=tla(j,+g[N>>2])|0;pe(z,1305864);N=qla(y,c[z>>2]|0,c[z+4>>2]|0)|0;z=tla(N,+g[M>>2])|0;pe(A,1305864);M=qla(z,c[A>>2]|0,c[A+4>>2]|0)|0;A=tla(M,+g[J>>2])|0;pe(B,1305864);J=qla(A,c[B>>2]|0,c[B+4>>2]|0)|0;B=tla(J,+g[L>>2])|0;pe(C,1305864);L=qla(B,c[C>>2]|0,c[C+4>>2]|0)|0;C=tla(L,+g[K>>2])|0;pe(D,1293264);qla(C,c[D>>2]|0,c[D+4>>2]|0)|0;pe(E,1293272);D=qla(e,c[E>>2]|0,c[E+4>>2]|0)|0;oe(F,f);E=qla(D,c[F>>2]|0,c[F+4>>2]|0)|0;pe(G,1293288);F=qla(E,c[G>>2]|0,c[G+4>>2]|0)|0;pe(H,1293904);qla(F,c[H>>2]|0,c[H+4>>2]|0)|0;P=e+4|0;Q=c[P>>2]|0;R=e+8|0;S=c[R>>2]|0;pla(I,Q,S);jka(a,I);dka(f);T=c[P>>2]|0;ila(T);i=d;return}function T$a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;f=b+272|0;if(!(gl(c[f>>2]|0)|0)){hka(a,f);i=d;return}f=c[b+268>>2]|0;if((f|0)!=0?(b=c[f+12>>2]|0,(b|0)!=0):0){pe(e,1293312);aI(a,b,e);i=d;return}c[a>>2]=0;i=d;return}function U$a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;if((b|0)!=0?(f=c[b+12>>2]|0,(f|0)!=0):0){pe(e,1293304);mI(a,f,e);i=d;return}g[a+12>>2]=1.0;g[a>>2]=1.0;g[a+20>>2]=0.0;g[a+16>>2]=0.0;g[a+8>>2]=0.0;g[a+4>>2]=0.0;i=d;return}function V$a(a,b){a=a|0;b=b|0;c[a+268>>2]=b;return}function W$a(a){a=a|0;return c[a+268>>2]|0}function X$a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0;e=i;i=i+32|0;f=e+8|0;h=e;g[b>>2]=0.0;g[d>>2]=0.0;j=c[a+268>>2]|0;if((j|0)==0){i=e;return}a=c[j+12>>2]|0;if((a|0)==0){i=e;return}pe(h,1293296);lI(f,a,h);g[b>>2]=+g[f+4>>2]- +g[f>>2];g[d>>2]=+g[f+12>>2]- +g[f+8>>2];i=e;return}function Y$a(a,b,c){a=a|0;b=b|0;c=c|0;g[b>>2]=1.0;g[c>>2]=1.0;return}function Z$a(a,b,c){a=a|0;b=b|0;c=c|0;g[b>>2]=0.0;g[c>>2]=0.0;return}function _$a(a){a=a|0;var b=0;b=i;P$a(a);c[a>>2]=1293328;c[a+276>>2]=0;i=b;return}function $$a(a){a=a|0;var b=0;b=i;R$a(a);$1a(a);i=b;return}function a0a(a){a=a|0;var b=0,d=0;b=i;if((a|0)==0){d=0;i=b;return d|0}d=Pp(c[a>>2]|0)|0;i=b;return d|0}function b0a(a){a=a|0;var b=0,d=0;b=i;if((a|0)==0){d=0;i=b;return d|0}d=Qp(c[a>>2]|0)|0;i=b;return d|0}function c0a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0;e=i;i=i+16|0;f=e;h=a+276|0;a=(c[h>>2]|0)==0;g[b>>2]=0.0;g[d>>2]=0.0;if(a){i=e;return}a=c[c[h>>2]>>2]|0;if((a|0)==0){i=e;return}pe(f,1293592);h=jI(a,f)|0;if((h|0)==0){i=e;return}f=c[h+16>>2]|0;if((f|0)==0){i=e;return}g[b>>2]=+DH(h,0);if(!(f>>>0>1)){i=e;return}g[d>>2]=+DH(h,1);i=e;return}function d0a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0.0,l=0.0,m=0.0;e=i;i=i+32|0;f=e+20|0;h=e+16|0;j=e;g[b>>2]=1.0;g[d>>2]=1.0;if((c[a+268>>2]|0)==0){i=e;return}Ic[c[(c[a>>2]|0)+152>>2]&511](j,a);k=+g[j+4>>2]- +g[j>>2];l=+g[j+12>>2]- +g[j+8>>2];X$a(a,f,h);j=a+276|0;a=a0a(c[j>>2]|0)|0;if((a|0)==1){m=+g[f>>2];if(k<m){g[b>>2]=k/(m>1.0?m:1.0)}m=+g[h>>2];if(l<m){g[d>>2]=l/(m>1.0?m:1.0)}}else if((a|0)==2){m=+g[f>>2];if(k>m){g[b>>2]=k/(m>1.0?m:1.0)}m=+g[h>>2];if(l>m){g[d>>2]=l/(m>1.0?m:1.0)}}else if((a|0)!=3){m=+g[f>>2];g[b>>2]=k/(m>1.0?m:1.0);m=+g[h>>2];g[d>>2]=l/(m>1.0?m:1.0)}if((b0a(c[j>>2]|0)|0)==0){i=e;return}m=+g[b>>2];l=+g[d>>2];k=m<l?m:l;g[b>>2]=k;g[d>>2]=k;i=e;return}function e0a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0;e=i;i=i+48|0;f=e+36|0;h=e+32|0;j=e+28|0;k=e+24|0;l=e+20|0;m=e+16|0;n=e;c0a(a,f,h);g[b>>2]=0.0;g[d>>2]=0.0;X$a(a,j,k);ld[c[(c[a>>2]|0)+244>>2]&255](a,l,m);o=+g[j>>2]*+g[l>>2];p=+g[k>>2]*+g[m>>2];Ic[c[(c[a>>2]|0)+152>>2]&511](n,a);q=+g[n+12>>2]- +g[n+8>>2];g[b>>2]=(+g[n+4>>2]- +g[n>>2]-o)*+g[f>>2];g[d>>2]=(q-p)*+g[h>>2];i=e;return}function f0a(a){a=a|0;return c[a+276>>2]|0}function g0a(a,b,c){a=a|0;b=+b;c=+c;var d=0;d=i;if(b>c){g[a>>2]=c;g[a+4>>2]=b;i=d;return}else{g[a>>2]=b;g[a+4>>2]=c;i=d;return}}function h0a(a,b){a=a|0;b=+b;var c=0,d=0.0,e=0.0,f=0,h=0;c=i;d=+g[a>>2];e=b-d;if(d<b?!(e<1.0e-4&e>-1.0e-4):0){f=4}else{if(e<1.0e-4&e>-1.0e-4){f=4}else{h=0}}do{if((f|0)==4){e=+g[a+4>>2];d=b-e;if(e>b?!(d<1.0e-4&d>-1.0e-4):0){h=1;break}if(d<1.0e-4){h=d>-1.0e-4}else{h=0}}}while(0);i=c;return h&1|0}function i0a(a,b){a=a|0;b=+b;var c=0,d=0,e=0.0,f=0.0,h=0.0;c=i;g0a(a,0.0,b);d=a+12|0;b=+g[d>>2];e=+g[a>>2];if(b<e?(f=b-e,!(f<1.0e-4&f>-1.0e-4)):0){g[d>>2]=e;h=e}else{h=b}b=+g[a+4>>2];if(!(h>b)){i=c;return}e=h-b;if(e<1.0e-4&e>-1.0e-4){i=c;return}g[d>>2]=b;i=c;return}function j0a(a,b){a=a|0;b=+b;var c=0,d=0;c=i;if((h0a(a,b)|0)==0){d=0}else{g[a+12>>2]=b;d=1}i=c;return d|0}function k0a(a){a=a|0;var b=0;b=i;if((j0a(a,+g[a+12>>2]+ +g[a+20>>2])|0)!=0){i=b;return}j0a(a,+g[a+4>>2])|0;i=b;return}function l0a(a){a=a|0;var b=0;b=i;if((j0a(a,+g[a+12>>2]- +g[a+20>>2])|0)!=0){i=b;return}j0a(a,+g[a>>2])|0;i=b;return}function m0a(a){a=a|0;var b=0;b=i;if((j0a(a,+g[a+12>>2]+ +g[a+16>>2])|0)!=0){i=b;return}j0a(a,+g[a+4>>2])|0;i=b;return}function n0a(a){a=a|0;var b=0;b=i;if((j0a(a,+g[a+12>>2]- +g[a+16>>2])|0)!=0){i=b;return}j0a(a,+g[a>>2])|0;i=b;return}function o0a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;nZa(a);c[a>>2]=1293608;c[a+268>>2]=b;c[a+272>>2]=d;c[a+276>>2]=0;i=e;return}function p0a(a){a=a|0;var b=0;b=i;pZa(a);$1a(a);i=b;return}function q0a(a){a=a|0;var b=0;b=i;pZa(a);i=b;return}function r0a(a,b){a=a|0;b=b|0;b=i;eka(a,1293848,-1);i=b;return}function s0a(a,b){a=a|0;b=b|0;c[b+164>>2]=0;return}function t0a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0.0,_=0.0,$=0.0,aa=0,ba=0.0,ca=0,da=0.0;d=i;i=i+352|0;e=d+328|0;f=d+312|0;h=d+304|0;j=d+296|0;k=d+288|0;l=d+280|0;m=d+272|0;n=d+264|0;o=d+256|0;p=d+248|0;q=d+240|0;r=d+232|0;s=d+224|0;t=d+216|0;u=d+208|0;v=d+200|0;w=d+192|0;x=d+184|0;y=d+176|0;z=d+168|0;A=d+160|0;B=d+152|0;C=d+144|0;D=d+136|0;E=d+128|0;F=d+120|0;G=d+112|0;H=d+104|0;I=d+96|0;J=d+88|0;K=d+80|0;L=d+72|0;M=d+64|0;N=d+56|0;O=d+48|0;P=d+40|0;Q=d+32|0;R=d+24|0;S=d+16|0;T=d+8|0;U=d;EZa(a,b);if((c[a+256>>2]|0)==0){i=d;return}gla(e);Ic[c[(c[a>>2]|0)+148>>2]&511](f,a);V=f+4|0;if(!(+g[f>>2]>=+g[V>>2])?(W=f+8|0,X=f+12|0,!(+g[W>>2]>=+g[X>>2])):0){pe(h,1293864);qla(b,c[h>>2]|0,c[h+4>>2]|0)|0;r_a(j,a);h=c[a+268>>2]|0;do{if((h|0)==1){Y=c[a+272>>2]|0;if((Y|0)==0){Z=+g[j>>2];_=+g[j+4>>2];if(!(+g[V>>2]- +g[f>>2]>4.0)){break}if(!(+g[X>>2]- +g[W>>2]>2.0)){break}pe(C,1293872);qla(e,c[C>>2]|0,c[C+4>>2]|0)|0;$=Z+-2.0;aa=tla(e,$)|0;pe(D,1305864);ba=_+-1.0;ca=tla(qla(aa,c[D>>2]|0,c[D+4>>2]|0)|0,ba)|0;pe(E,1293880);qla(ca,c[E>>2]|0,c[E+4>>2]|0)|0;ca=tla(e,Z+2.0)|0;pe(F,1305864);aa=tla(qla(ca,c[F>>2]|0,c[F+4>>2]|0)|0,ba)|0;pe(G,1293888);qla(aa,c[G>>2]|0,c[G+4>>2]|0)|0;aa=tla(e,Z)|0;pe(H,1305864);ca=tla(qla(aa,c[H>>2]|0,c[H+4>>2]|0)|0,_+1.0)|0;pe(I,1293888);qla(ca,c[I>>2]|0,c[I+4>>2]|0)|0;ca=tla(e,$)|0;pe(J,1305864);aa=tla(qla(ca,c[J>>2]|0,c[J+4>>2]|0)|0,ba)|0;pe(K,1293896);qla(aa,c[K>>2]|0,c[K+4>>2]|0)|0;ula(b,c[e+4>>2]|0,c[e+8>>2]|0)|0;break}else if((Y|0)==1){ba=+g[j>>2];$=+g[j+4>>2];if(!(+g[V>>2]- +g[f>>2]>4.0)){break}if(!(+g[X>>2]- +g[W>>2]>2.0)){break}pe(L,1293872);qla(e,c[L>>2]|0,c[L+4>>2]|0)|0;_=ba+-2.0;Y=tla(e,_)|0;pe(M,1305864);Z=$+1.0;aa=tla(qla(Y,c[M>>2]|0,c[M+4>>2]|0)|0,Z)|0;pe(N,1293880);qla(aa,c[N>>2]|0,c[N+4>>2]|0)|0;aa=tla(e,ba+2.0)|0;pe(O,1305864);Y=tla(qla(aa,c[O>>2]|0,c[O+4>>2]|0)|0,Z)|0;pe(P,1293888);qla(Y,c[P>>2]|0,c[P+4>>2]|0)|0;Y=tla(e,ba)|0;pe(Q,1305864);aa=tla(qla(Y,c[Q>>2]|0,c[Q+4>>2]|0)|0,$+-1.0)|0;pe(R,1293888);qla(aa,c[R>>2]|0,c[R+4>>2]|0)|0;aa=tla(e,_)|0;pe(S,1305864);Y=tla(qla(aa,c[S>>2]|0,c[S+4>>2]|0)|0,Z)|0;pe(T,1293896);qla(Y,c[T>>2]|0,c[T+4>>2]|0)|0;ula(b,c[e+4>>2]|0,c[e+8>>2]|0)|0;break}else{break}}else if((h|0)==0){Y=c[a+272>>2]|0;if((Y|0)==1){Z=+g[j>>2];_=+g[j+4>>2];if(!(+g[V>>2]- +g[f>>2]>4.0)){break}if(!(+g[X>>2]- +g[W>>2]>2.0)){break}pe(t,1293872);qla(e,c[t>>2]|0,c[t+4>>2]|0)|0;$=Z+1.0;aa=tla(e,$)|0;pe(u,1305864);ba=_;ca=tla(qla(aa,c[u>>2]|0,c[u+4>>2]|0)|0,ba)|0;pe(v,1293880);qla(ca,c[v>>2]|0,c[v+4>>2]|0)|0;da=Z+-1.0;ca=tla(e,da)|0;pe(w,1305864);aa=tla(qla(ca,c[w>>2]|0,c[w+4>>2]|0)|0,_+2.0)|0;pe(x,1293888);qla(aa,c[x>>2]|0,c[x+4>>2]|0)|0;aa=tla(e,da)|0;pe(y,1305864);ca=tla(qla(aa,c[y>>2]|0,c[y+4>>2]|0)|0,_+-2.0)|0;pe(z,1293888);qla(ca,c[z>>2]|0,c[z+4>>2]|0)|0;ca=tla(e,$)|0;pe(A,1305864);aa=tla(qla(ca,c[A>>2]|0,c[A+4>>2]|0)|0,ba)|0;pe(B,1293896);qla(aa,c[B>>2]|0,c[B+4>>2]|0)|0;ula(b,c[e+4>>2]|0,c[e+8>>2]|0)|0;break}else if((Y|0)==0){ba=+g[j>>2];$=+g[j+4>>2];if(!(+g[V>>2]- +g[f>>2]>4.0)){break}if(!(+g[X>>2]- +g[W>>2]>2.0)){break}pe(k,1293872);qla(e,c[k>>2]|0,c[k+4>>2]|0)|0;_=ba+-1.0;Y=tla(e,_)|0;pe(l,1305864);da=$;aa=tla(qla(Y,c[l>>2]|0,c[l+4>>2]|0)|0,da)|0;pe(m,1293880);qla(aa,c[m>>2]|0,c[m+4>>2]|0)|0;Z=ba+1.0;aa=tla(e,Z)|0;pe(n,1305864);Y=tla(qla(aa,c[n>>2]|0,c[n+4>>2]|0)|0,$+2.0)|0;pe(o,1293888);qla(Y,c[o>>2]|0,c[o+4>>2]|0)|0;Y=tla(e,Z)|0;pe(p,1305864);aa=tla(qla(Y,c[p>>2]|0,c[p+4>>2]|0)|0,$+-2.0)|0;pe(q,1293888);qla(aa,c[q>>2]|0,c[q+4>>2]|0)|0;aa=tla(e,_)|0;pe(r,1305864);Y=tla(qla(aa,c[r>>2]|0,c[r+4>>2]|0)|0,da)|0;pe(s,1293896);qla(Y,c[s>>2]|0,c[s+4>>2]|0)|0;ula(b,c[e+4>>2]|0,c[e+8>>2]|0)|0;break}else{break}}}while(0);pe(U,1293904);qla(b,c[U>>2]|0,c[U+4>>2]|0)|0}ila(c[e+4>>2]|0);i=d;return}function u0a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0.0;e=i;i=i+448|0;f=e+392|0;h=e+376|0;j=e+368|0;k=e+356|0;l=e+336|0;m=e+324|0;n=e+304|0;o=e+288|0;p=e+284|0;q=e+280|0;r=e+276|0;s=e+272|0;t=e+252|0;u=e+248|0;v=e+232|0;w=e+224|0;x=e+220|0;y=e+216|0;z=e+160|0;A=e+152|0;B=e+132|0;C=e+128|0;D=e+112|0;E=e+108|0;F=e+104|0;G=e+96|0;H=e+88|0;I=e+80|0;J=e+76|0;K=e+72|0;L=e+68|0;M=e+64|0;N=e+60|0;O=e+56|0;P=e+52|0;Q=e+48|0;R=e+44|0;S=e+40|0;T=e+36|0;U=e+16|0;V=e+8|0;W=e;if((c[a+256>>2]|0)==0){i=e;return}Ic[c[(c[a>>2]|0)+148>>2]&511](h,a);X=h+4|0;if(+g[h>>2]>=+g[X>>2]){i=e;return}Y=h+8|0;Z=h+12|0;if(+g[Y>>2]>=+g[Z>>2]){i=e;return}r_a(j,a);_=MZa(c[a+156>>2]|0)|0;$=c[a+268>>2]|0;if(($|0)==1){aa=c[a+272>>2]|0;if((aa|0)==2){c[D+0>>2]=c[h+0>>2];c[D+4>>2]=c[h+4>>2];c[D+8>>2]=c[h+8>>2];c[D+12>>2]=c[h+12>>2];ba=_<<24;c[E>>2]=ba|6579300;VYa(b,d,D,E,0.0);sYa(D,h,.5);c[F>>2]=ba|16777215;VYa(b,d,D,F,1.0);F=a+264|0;if((UZa(c[F>>2]|0)|0)==0){c[S>>2]=-1;TYa(b,d,D,S)}else{ca=+g[h>>2];g[G+4>>2]=+g[Z>>2]+-1.0;g[H+4>>2]=+g[Y>>2]+1.0;da=ca+1.5;g[G>>2]=da;g[H>>2]=da;S=ba|13816530;c[I>>2]=S;WYa(b,d,G,H,I,1.0);g[G>>2]=+g[G>>2]+1.0;g[H>>2]=+g[H>>2]+1.0;c[J>>2]=ba|14474460;WYa(b,d,G,H,J,1.0);g[G>>2]=+g[G>>2]+1.0;g[H>>2]=+g[H>>2]+1.0;J=ba|15790320;c[K>>2]=J;WYa(b,d,G,H,K,1.0);g[G>>2]=+g[G>>2]+1.0;g[H>>2]=+g[H>>2]+1.0;c[L>>2]=J;WYa(b,d,G,H,L,1.0);g[G>>2]=+g[G>>2]+1.0;g[H>>2]=+g[H>>2]+1.0;c[M>>2]=S;WYa(b,d,G,H,M,1.0);g[G>>2]=+g[G>>2]+1.0;g[H>>2]=+g[H>>2]+1.0;M=ba|11842740;c[N>>2]=M;WYa(b,d,G,H,N,1.0);g[G>>2]=+g[G>>2]+1.0;g[H>>2]=+g[H>>2]+1.0;N=ba|9868950;c[O>>2]=N;WYa(b,d,G,H,O,1.0);g[G>>2]=+g[G>>2]+1.0;g[H>>2]=+g[H>>2]+1.0;c[P>>2]=N;WYa(b,d,G,H,P,1.0);g[G>>2]=+g[G>>2]+1.0;g[H>>2]=+g[H>>2]+1.0;c[Q>>2]=M;WYa(b,d,G,H,Q,1.0);g[G>>2]=+g[G>>2]+1.0;g[H>>2]=+g[H>>2]+1.0;c[R>>2]=S;WYa(b,d,G,H,R,1.0)}if(!(+g[Z>>2]- +g[Y>>2]>8.0)){i=e;return}c[T>>2]=ba|7895160;if((UZa(c[F>>2]|0)|0)==0){c[U>>2]=1;g[U+4>>2]=.5;g[U+8>>2]=0.0;g[U+12>>2]=0.0;g[U+16>>2]=0.0;c[T>>2]=SYa(U,255)|0}da=+g[j>>2];ca=+g[j+4>>2]+-2.75+.5;g[V>>2]=da+-2.5;U=V+4|0;g[U>>2]=ca;g[W>>2]=da+2.5;F=W+4|0;g[F>>2]=ca;WYa(b,d,V,W,T,1.0);g[U>>2]=+g[U>>2]+2.0;g[F>>2]=+g[F>>2]+2.0;WYa(b,d,V,W,T,1.0);g[U>>2]=+g[U>>2]+2.0;g[F>>2]=+g[F>>2]+2.0;WYa(b,d,V,W,T,1.0);i=e;return}else if((aa|0)==0){c[o+0>>2]=c[h+0>>2];c[o+4>>2]=c[h+4>>2];c[o+8>>2]=c[h+8>>2];c[o+12>>2]=c[h+12>>2];T=_<<24;c[p>>2]=T|6579300;VYa(b,d,o,p,0.0);sYa(o,h,.5);p=T|16777215;c[q>>2]=p;VYa(b,d,o,q,1.0);sYa(o,h,1.0);q=a+264|0;if((UZa(c[q>>2]|0)|0)==0){c[r>>2]=-1;TYa(b,d,o,r)}else{c[f+0>>2]=c[o+0>>2];c[f+4>>2]=c[o+4>>2];c[f+8>>2]=c[o+8>>2];c[f+12>>2]=c[o+12>>2];YYa(b,d,f,_)}ca=+g[Y>>2];if(!(+g[Z>>2]-ca>6.0)){i=e;return}da=+g[h>>2]+1.5;ea=da+2.5;fa=ca+4.0;g[f>>2]=ea;g[f+4>>2]=fa;ga=ca+3.0;g[f+8>>2]=ea;g[f+12>>2]=ga;ha=da+4.5;g[f+16>>2]=ha;g[f+20>>2]=ca+5.0;ia=da+6.5;g[f+24>>2]=ia;g[f+28>>2]=ga;g[f+32>>2]=ia;g[f+36>>2]=fa;g[f+40>>2]=ha;g[f+44>>2]=ca+6.0;g[f+48>>2]=ea;g[f+52>>2]=fa;if((UZa(c[q>>2]|0)|0)==0){c[t>>2]=1;g[t+4>>2]=.5;g[t+8>>2]=0.0;g[t+12>>2]=0.0;g[t+16>>2]=0.0;c[u>>2]=SYa(t,255)|0;UYa(b,d,f,u);i=e;return}else{c[s>>2]=p;UYa(b,d,f,s);i=e;return}}else if((aa|0)==1){c[v+0>>2]=c[h+0>>2];c[v+4>>2]=c[h+4>>2];c[v+8>>2]=c[h+8>>2];c[v+12>>2]=c[h+12>>2];aa=_<<24;c[w>>2]=aa|6579300;VYa(b,d,v,w,0.0);sYa(v,h,.5);w=aa|16777215;c[x>>2]=w;VYa(b,d,v,x,1.0);sYa(v,h,1.0);x=a+264|0;if((UZa(c[x>>2]|0)|0)==0){c[y>>2]=-1;TYa(b,d,v,y)}else{c[f+0>>2]=c[v+0>>2];c[f+4>>2]=c[v+4>>2];c[f+8>>2]=c[v+8>>2];c[f+12>>2]=c[v+12>>2];YYa(b,d,f,_)}fa=+g[Y>>2];if(!(+g[Z>>2]-fa>6.0)){i=e;return}ea=+g[h>>2]+1.5;ca=ea+2.5;ha=fa+5.0;g[z>>2]=ca;g[z+4>>2]=ha;ia=fa+6.0;g[z+8>>2]=ca;g[z+12>>2]=ia;ga=ea+4.5;g[z+16>>2]=ga;g[z+20>>2]=fa+4.0;da=ea+6.5;g[z+24>>2]=da;g[z+28>>2]=ia;g[z+32>>2]=da;g[z+36>>2]=ha;g[z+40>>2]=ga;g[z+44>>2]=fa+3.0;g[z+48>>2]=ca;g[z+52>>2]=ha;if((UZa(c[x>>2]|0)|0)==0){c[B>>2]=1;g[B+4>>2]=.5;g[B+8>>2]=0.0;g[B+12>>2]=0.0;g[B+16>>2]=0.0;c[C>>2]=SYa(B,255)|0;UYa(b,d,z,C);i=e;return}else{c[A>>2]=w;UYa(b,d,z,A);i=e;return}}else{i=e;return}}else if(($|0)==0){LZa(a,b,d);$=c[a+272>>2]|0;if(($|0)==0){ha=+g[j>>2];ca=ha+-1.0;fa=+g[j+4>>2];ga=ha+1.0;if(!(+g[X>>2]- +g[h>>2]>4.0)){i=e;return}if(!(+g[Z>>2]- +g[Y>>2]>2.0)){i=e;return}OIa(k);QIa(k,4);WIa(k,0,ca,fa,6);WIa(k,1,ga,fa+2.0,2);WIa(k,2,ga,fa+-2.0,2);WIa(k,3,ca,fa,2);c[l>>2]=1;a=l+4|0;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;UGa(b,k,d,0,SYa(l,_)|0,0,1,0)|0;PIa(c[k+4>>2]|0);i=e;return}else if(($|0)==1){fa=+g[j>>2];ca=fa+1.0;ga=+g[j+4>>2];ha=fa+-1.0;if(!(+g[X>>2]- +g[h>>2]>4.0)){i=e;return}if(!(+g[Z>>2]- +g[Y>>2]>2.0)){i=e;return}OIa(m);QIa(m,4);WIa(m,0,ca,ga,6);WIa(m,1,ha,ga+2.0,2);WIa(m,2,ha,ga+-2.0,2);WIa(m,3,ca,ga,2);c[n>>2]=1;Y=n+4|0;c[Y+0>>2]=0;c[Y+4>>2]=0;c[Y+8>>2]=0;c[Y+12>>2]=0;UGa(b,m,d,0,SYa(n,_)|0,0,1,0)|0;PIa(c[m+4>>2]|0);i=e;return}else{i=e;return}}else{i=e;return}}function v0a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;$Za(a,b,d)|0;d=n_a(c[a+180>>2]|0)|0;if((d|0)!=0){Fc[c[(c[d>>2]|0)+88>>2]&63](d,a,5,0,b)}c[a+276>>2]=1;C_a(a);i=e;return 1}function w0a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;a_a(a,b,d)|0;d=n_a(c[a+180>>2]|0)|0;if((d|0)!=0){Fc[c[(c[d>>2]|0)+88>>2]&63](d,a,6,0,b)}c[a+276>>2]=0;E_a(a);i=e;return 1}function x0a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;h_a(a,b,d)|0;d=n_a(c[a+180>>2]|0)|0;if((d|0)==0){i=e;return 1}Fc[c[(c[d>>2]|0)+88>>2]&63](d,a,7,0,b);i=e;return 1}function y0a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;nZa(a);c[a>>2]=1293920;c[a+268>>2]=b;b=a+320|0;e=a+272|0;f=e+48|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));g[b>>2]=10.0;g[a+324>>2]=1.0;c[a+328>>2]=0;c[a+332>>2]=0;c[a+336>>2]=1;i=d;return}function z0a(a){a=a|0;var b=0;b=i;pZa(a);$1a(a);i=b;return}function A0a(a){a=a|0;var b=0;b=i;pZa(a);i=b;return}function B0a(a,b){a=a|0;b=b|0;b=i;eka(a,1294160,-1);i=b;return}function C0a(a,b){a=a|0;b=b|0;c[b+164>>2]=0;return}function D0a(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0;b=i;i=i+48|0;d=b+32|0;e=b+16|0;f=b;Ic[c[(c[a>>2]|0)+152>>2]&511](d,a);c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;h=c[a+268>>2]|0;do{if((h|0)==0){j=+g[d+4>>2];k=+g[d>>2];l=j-k;if(l>22.0){m=+g[d+8>>2];n=+g[d+12>>2];g[e>>2]=k;g[e+4>>2]=k+9.0;g[e+8>>2]=m;g[e+12>>2]=n;g[f>>2]=j+-9.0;g[f+4>>2]=j;g[f+8>>2]=m;g[f+12>>2]=n;break}n=(l+-2.0+-2.0)*.5;if(n>0.0){l=+g[d+8>>2];m=+g[d+12>>2];g[e>>2]=k;g[e+4>>2]=k+n;g[e+8>>2]=l;g[e+12>>2]=m;g[f>>2]=j-n;g[f+4>>2]=j;g[f+8>>2]=l;g[f+12>>2]=m;break}else{Ic[c[(c[a>>2]|0)+100>>2]&511](a,0);break}}else if((h|0)==1){m=+g[d+12>>2];l=+g[d+8>>2];j=m-l;if(j>22.0?(n=j+-22.0,!(n<1.0e-4&n>-1.0e-4)):0){n=+g[d>>2];k=+g[d+4>>2];g[e>>2]=n;g[e+4>>2]=k;g[e+8>>2]=m+-9.0;g[e+12>>2]=m;g[f>>2]=n;g[f+4>>2]=k;g[f+8>>2]=l;g[f+12>>2]=l+9.0;break}k=(j+-2.0+-2.0)*.5;if(k>0.0?(j=k,!(j<1.0e-4&j>-1.0e-4)):0){j=+g[d>>2];n=+g[d+4>>2];g[e>>2]=j;g[e+4>>2]=n;g[e+8>>2]=m-k;g[e+12>>2]=m;g[f>>2]=j;g[f+4>>2]=n;g[f+8>>2]=l;g[f+12>>2]=k+l;break}Ic[c[(c[a>>2]|0)+100>>2]&511](a,0)}}while(0);d=c[a+292>>2]|0;if((d|0)!=0){BZa(d,e,1,0)}e=c[a+296>>2]|0;if((e|0)==0){E0a(a,0);i=b;return}BZa(e,f,1,0);E0a(a,0);i=b;return}function E0a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0;d=i;i=i+48|0;e=d+32|0;f=d+16|0;h=d;j=a+300|0;if((c[(c[j>>2]|0)+256>>2]|0)==0){i=d;return}c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;Ic[c[(c[a>>2]|0)+152>>2]&511](f,a);U0a(h,a);k=+g[h>>2];l=+g[h+4>>2];m=+g[h+8>>2];n=+g[h+12>>2];h=c[a+268>>2]|0;if((h|0)==1){f=a+316|0;o=+V0a(a,+g[f>>2]+ +g[a+312>>2]);p=+V0a(a,+g[f>>2]);q=p-o;if(q<2.0?(r=q+-2.0,!(r<1.0e-4&r>-1.0e-4)):0){s=p+-2.0}else{s=o}if(s<m?(o=s-m,!(o<1.0e-4&o>-1.0e-4)):0){t=m;u=m+2.0}else{t=s;u=p}g[e>>2]=k;g[e+4>>2]=l;g[e+8>>2]=t;g[e+12>>2]=u}else if((h|0)==0){h=a+316|0;u=+V0a(a,+g[h>>2]);t=+V0a(a,+g[h>>2]+ +g[a+312>>2]);if(t-u<2.0){v=u+2.0}else{v=t}if(v>l){w=l+-2.0;x=l}else{w=u;x=v}g[e>>2]=w;g[e+4>>2]=x;g[e+8>>2]=m;g[e+12>>2]=n}BZa(c[j>>2]|0,e,1,b);i=d;return}function F0a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=i;i=i+128|0;e=d+104|0;f=d+88|0;h=d+80|0;j=d+72|0;k=d+64|0;l=d+56|0;m=d+36|0;n=d+32|0;o=d+24|0;p=d+16|0;q=d+8|0;r=d;Ic[c[(c[a>>2]|0)+148>>2]&511](e,a);if((c[a+256>>2]|0)==0){i=d;return}s=e+4|0;if(+g[e>>2]>=+g[s>>2]){i=d;return}t=e+8|0;u=e+12|0;if(+g[t>>2]>=+g[u>>2]){i=d;return}gla(f);pe(h,1293864);qla(f,c[h>>2]|0,c[h+4>>2]|0)|0;pe(j,1294176);h=qla(f,c[j>>2]|0,c[j+4>>2]|0)|0;Ic[c[(c[a>>2]|0)+108>>2]&511](m,a);c[n>>2]=1;vYa(l,m,n);oe(k,l);qla(h,c[k>>2]|0,c[k+4>>2]|0)|0;dka(l);l=tla(f,+g[e>>2])|0;pe(o,1305864);k=qla(l,c[o>>2]|0,c[o+4>>2]|0)|0;o=tla(k,+g[t>>2])|0;pe(p,1305864);k=qla(o,c[p>>2]|0,c[p+4>>2]|0)|0;p=tla(k,+g[s>>2]- +g[e>>2])|0;pe(q,1305864);e=qla(p,c[q>>2]|0,c[q+4>>2]|0)|0;q=tla(e,+g[u>>2]- +g[t>>2])|0;pe(r,1294184);qla(q,c[r>>2]|0,c[r+4>>2]|0)|0;r=f+4|0;ula(b,c[r>>2]|0,c[f+8>>2]|0)|0;ila(c[r>>2]|0);i=d;return}function G0a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0;e=i;i=i+96|0;f=e+72|0;h=e+48|0;j=e+40|0;k=e+32|0;l=e+24|0;m=e+16|0;n=e+8|0;o=e;Ic[c[(c[a>>2]|0)+148>>2]&511](f,a);if((c[a+256>>2]|0)==0){i=e;return}p=f+4|0;if(+g[f>>2]>=+g[p>>2]){i=e;return}q=f+8|0;r=f+12|0;if(+g[q>>2]>=+g[r>>2]){i=e;return}Ic[c[(c[a>>2]|0)+108>>2]&511](h,a);s=a+156|0;XYa(b,d,f,h,MZa(c[s>>2]|0)|0);t=+g[f>>2]+2.0;u=+g[r>>2]+-2.0;g[j>>2]=t;g[j+4>>2]=u;u=+g[q>>2]+2.0;g[k>>2]=t;g[k+4>>2]=u;c[l>>2]=(MZa(c[s>>2]|0)|0)<<24|6579300;WYa(b,d,j,k,l,1.0);u=+g[p>>2]+-2.0;t=+g[r>>2]+-2.0;g[m>>2]=u;g[m+4>>2]=t;t=+g[q>>2]+2.0;g[n>>2]=u;g[n+4>>2]=t;c[o>>2]=(MZa(c[s>>2]|0)|0)<<24|6579300;WYa(b,d,m,n,o,1.0);i=e;return}function H0a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0;e=i;i=i+64|0;f=e+48|0;h=e+32|0;j=e+16|0;k=e;$Za(a,b,d)|0;if((uZa(c[a+56>>2]|0,4194304)|0)!=0?(MZa(c[a+156>>2]|0)|0)!=255:0){e$a(a,255);Ic[c[(c[a>>2]|0)+20>>2]&511](a,0)}c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;d=a+300|0;l=c[d>>2]|0;if((l|0)==0){i=e;return 1}if((c[l+256>>2]|0)==0){i=e;return 1}Ic[c[(c[a>>2]|0)+152>>2]&511](j,a);l=c[d>>2]|0;Ic[c[(c[l>>2]|0)+148>>2]&511](k,l);l=c[a+268>>2]|0;if((l|0)==0){m=+g[j+8>>2];n=+g[k>>2];o=+g[j+12>>2];g[f>>2]=+g[j>>2]+9.0;g[f+4>>2]=n;g[f+8>>2]=m;g[f+12>>2]=o;n=+g[j+4>>2]+-9.0;g[h>>2]=+g[k+4>>2];g[h+4>>2]=n;g[h+8>>2]=m;g[h+12>>2]=o}else if((l|0)==1){o=+g[j>>2];m=+g[k+12>>2];n=+g[j+4>>2];p=+g[j+12>>2]+-9.0;g[f>>2]=o;g[f+4>>2]=n;g[f+8>>2]=m;g[f+12>>2]=p;p=+g[j+8>>2]+9.0;m=+g[k+8>>2];g[h>>2]=o;g[h+4>>2]=n;g[h+8>>2]=p;g[h+12>>2]=m}Hla(f);Hla(h);k=b+4|0;if((Qla(f,+g[b>>2],+g[k>>2])|0)!=0){n0a(a+304|0);E0a(a,1);I0a(a)}if((Qla(h,+g[b>>2],+g[k>>2])|0)==0){i=e;return 1}m0a(a+304|0);E0a(a,1);I0a(a);i=e;return 1}function I0a(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;i=i+16|0;d=b;e=n_a(c[a+180>>2]|0)|0;if((e|0)==0){i=b;return}f=c[a+268>>2]|0;if((f|0)==0){g[d>>2]=+g[a+272>>2]+ +g[a+316>>2]}else if((f|0)==1){g[d>>2]=+g[a+276>>2]- +g[a+316>>2]}Fc[c[(c[e>>2]|0)+88>>2]&63](e,a,4,f,d);i=b;return}function J0a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;a_a(a,b,d)|0;if((uZa(c[a+56>>2]|0,4194304)|0)!=0?(MZa(c[a+156>>2]|0)|0)!=150:0){e$a(a,150);Ic[c[(c[a>>2]|0)+20>>2]&511](a,0)}lZa(c[a+4>>2]|0);c[a+328>>2]=0;i=e;return 1}function K0a(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0.0,k=0.0,l=0;h=i;l_a(a,b,d,e,f);switch(d|0){case 3:{j=+g[f>>2];d=c[a+268>>2]|0;if((d|0)==1){k=+g[a+276>>2]-j}else if((d|0)==0){k=j- +g[a+272>>2]}else{k=j}R0a(a,k);i=h;return};case 5:{if((c[a+292>>2]|0)==(b|0)){L0a(a)}if((c[a+296>>2]|0)==(b|0)){M0a(a)}if((c[a+300>>2]|0)!=(b|0)){i=h;return}N0a(a,f);i=h;return};case 6:{if((c[a+300>>2]|0)!=(b|0)){i=h;return}O0a(a);i=h;return};case 2:{d=f;if((f|0)==0){i=h;return}e=a+272|0;l=f;if((Q2a(e,l,20)|0)==0){i=h;return}c[e+0>>2]=c[l+0>>2];c[e+4>>2]=c[l+4>>2];c[e+8>>2]=c[l+8>>2];c[e+12>>2]=c[l+12>>2];c[e+16>>2]=c[l+16>>2];k=+g[d+8>>2];j=+g[d+4>>2]- +g[d>>2]-k;Q0a(a,j>0.0?j:0.0,k);k=+g[d+16>>2];g[a+320>>2]=+g[d+12>>2];g[a+324>>2]=k;i=h;return};case 7:{if((c[a+300>>2]|0)!=(b|0)){i=h;return}P0a(a,f);i=h;return};default:{i=h;return}}}function L0a(a){a=a|0;var b=0;b=i;l0a(a+304|0);E0a(a,1);I0a(a);c[a+332>>2]=1;lZa(c[a+4>>2]|0);kZa(a,100);i=b;return}function M0a(a){a=a|0;var b=0;b=i;k0a(a+304|0);E0a(a,1);I0a(a);c[a+332>>2]=0;lZa(c[a+4>>2]|0);kZa(a,100);i=b;return}function N0a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;c[a+328>>2]=1;f=c[a+300>>2]|0;if((f|0)==0){i=d;return}Ic[c[(c[f>>2]|0)+148>>2]&511](e,f);f=c[a+268>>2]|0;if((f|0)==1){g[a+340>>2]=+g[b+4>>2];g[a+344>>2]=+g[e+12>>2];i=d;return}else if((f|0)==0){g[a+340>>2]=+g[b>>2];g[a+344>>2]=+g[e>>2];i=d;return}else{i=d;return}}function O0a(a){a=a|0;var b=0,d=0;b=i;d=a+328|0;if((c[d>>2]|0)!=0?(c[a+336>>2]|0)==0:0){I0a(a)}c[d>>2]=0;i=b;return}function P0a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0.0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;d=i;e=a+304|0;f=a+316|0;h=+g[f>>2];j=a+268|0;k=c[j>>2]|0;do{if((k|0)==0){l=+g[b>>2];m=+g[a+340>>2];if(+R(+(l-m))<1.0){i=d;return}else{n=+W0a(a,l+ +g[a+344>>2]-m);break}}else if((k|0)==1){m=+g[b+4>>2];l=+g[a+340>>2];if(+R(+(m-l))<1.0){i=d;return}else{n=+W0a(a,m+ +g[a+344>>2]-l);break}}else{n=0.0}}while(0);if((c[a+328>>2]|0)==0){i=d;return}b=c[j>>2]|0;if((b|0)==0){l=+g[e>>2];if(n<l){m=n-l;o=m<1.0e-4&m>-1.0e-4?n:l}else{o=n}l=+g[a+308>>2];if(o>l){m=o-l;p=m<1.0e-4&m>-1.0e-4?o:l}else{p=o}j0a(e,p)|0}else if((b|0)==1){p=+g[e>>2];if(n<p){o=n-p;q=o<1.0e-4&o>-1.0e-4?n:p}else{q=n}n=+g[a+308>>2];if(q>n){p=q-n;r=p<1.0e-4&p>-1.0e-4?q:n}else{r=q}j0a(e,r)|0}r=h- +g[f>>2];if(r<1.0e-4&r>-1.0e-4){i=d;return}E0a(a,1);if((c[a+336>>2]|0)==0){i=d;return}I0a(a);i=d;return}function Q0a(a,b,d){a=a|0;b=+b;d=+d;var e=0,f=0,h=0;e=i;f=a+300|0;if((c[f>>2]|0)==0){i=e;return}h=a+304|0;i0a(h,b);g[a+312>>2]=d;d=+g[a+308>>2]- +g[h>>2];if(d<0.0?(b=d,!(b<1.0e-4&b>-1.0e-4)):0){h=c[f>>2]|0;Ic[c[(c[h>>2]|0)+100>>2]&511](h,0);i=e;return}h=c[f>>2]|0;Ic[c[(c[h>>2]|0)+100>>2]&511](h,1);E0a(a,1);i=e;return}function R0a(a,b){a=a|0;b=+b;var c=0,d=0,e=0.0;c=i;d=a+316|0;e=+g[d>>2];j0a(a+304|0,b)|0;b=+g[d>>2]-e;if(b<1.0e-4&b>-1.0e-4){i=c;return}E0a(a,1);i=c;return}function S0a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+192|0;e=d;c3a(e|0,b|0,192)|0;c[e+156>>2]=a;c[e+68>>2]=2;c[e+64>>2]=2;c[e+32>>2]=-467664896;b=a+292|0;if((c[b>>2]|0)==0){f=Z1a(280)|0;o0a(f,c[a+268>>2]|0,0);c[b>>2]=f;rZa(f,e)}f=a+296|0;if((c[f>>2]|0)==0){b=Z1a(280)|0;o0a(b,c[a+268>>2]|0,1);c[f>>2]=b;rZa(b,e)}b=a+300|0;if((c[b>>2]|0)!=0){i=d;return}f=Z1a(280)|0;o0a(f,c[a+268>>2]|0,2);c[b>>2]=f;Ic[c[(c[f>>2]|0)+100>>2]&511](f,0);rZa(c[b>>2]|0,e);i=d;return}function T0a(a){a=a|0;return+((a|0)==0?0.0:12.0)}function U0a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0;d=i;i=i+64|0;e=d+48|0;f=d+32|0;h=d+16|0;j=d;Ic[c[(c[b>>2]|0)+152>>2]&511](e,b);c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;k=c[b+292>>2]|0;if((k|0)!=0?(l=b+296|0,(c[l>>2]|0)!=0):0){Ic[c[(c[k>>2]|0)+148>>2]&511](h,k);k=c[l>>2]|0;Ic[c[(c[k>>2]|0)+148>>2]&511](j,k);m=+g[h+4>>2]- +g[h>>2];n=+g[h+12>>2]- +g[h+8>>2];o=+g[j+4>>2]- +g[j>>2];p=+g[j+12>>2]- +g[j+8>>2];j=c[b+268>>2]|0;do{if((j|0)==1){q=+g[e+12>>2];r=+g[e+8>>2];s=+g[e>>2];t=n+r+1.0;u=+g[e+4>>2];if(q-r>n+p+2.0){g[f>>2]=s;g[f+4>>2]=u;g[f+8>>2]=t;g[f+12>>2]=q-p+-1.0;break}else{g[f>>2]=s;g[f+4>>2]=u;g[f+8>>2]=t;g[f+12>>2]=t;break}}else if((j|0)==0){t=+g[e+4>>2];u=+g[e>>2];s=m+u+1.0;q=+g[e+8>>2];if(t-u>m+o+2.0){u=+g[e+12>>2];g[f>>2]=s;g[f+4>>2]=t-o+-1.0;g[f+8>>2]=q;g[f+12>>2]=u;break}else{u=+g[e+12>>2];g[f>>2]=s;g[f+4>>2]=s;g[f+8>>2]=q;g[f+12>>2]=u;break}}}while(0);Hla(f);c[a+0>>2]=c[f+0>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];i=d;return}c[a+0>>2]=c[e+0>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];i=d;return}function V0a(a,b){a=a|0;b=+b;var d=0,e=0,f=0.0,h=0.0,j=0.0,k=0.0,l=0,m=0.0;d=i;i=i+16|0;e=d;U0a(e,a);f=+g[e>>2];h=+g[e+12>>2];j=+g[a+308>>2]- +g[a+304>>2]+ +g[a+312>>2];k=j==0.0?1.0:j;l=c[a+268>>2]|0;if((l|0)==0){m=f+(+g[e+4>>2]-f)*b/k;i=d;return+m}else if((l|0)==1){m=h-(h- +g[e+8>>2])*b/k;i=d;return+m}else{m=0.0;i=d;return+m}return 0.0}function W0a(a,b){a=a|0;b=+b;var d=0,e=0,f=0.0,h=0.0,j=0.0,k=0.0,l=0,m=0.0;d=i;i=i+16|0;e=d;U0a(e,a);f=+g[e>>2];h=+g[e+12>>2];j=+g[a+308>>2]- +g[a+304>>2]+ +g[a+312>>2];k=j==0.0?1.0:j;l=c[a+268>>2]|0;if((l|0)==0){m=(b-f)*k/(+g[e+4>>2]-f);i=d;return+m}else if((l|0)==1){m=(h-b)*k/(h- +g[e+8>>2]);i=d;return+m}else{m=0.0;i=d;return+m}return 0.0}function X0a(a,b){a=a|0;b=b|0;var c=0;c=i;S0a(a,b);i=c;return}function Y0a(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+32|0;d=b;e=a+304|0;c[d+0>>2]=c[e+0>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[d+12>>2]=c[e+12>>2];c[d+16>>2]=c[e+16>>2];c[d+20>>2]=c[e+20>>2];if((c[a+332>>2]|0)==0){k0a(e)}else{l0a(e)}if((Q2a(e,d,24)|0)==0){i=b;return}E0a(a,1);I0a(a);i=b;return}function Z0a(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;c[a>>2]=0;c[a+4>>2]=0;g=a+8|0;a=0;do{c[g+(a<<2)>>2]=a;a=a+1|0}while((a|0)!=256);h=0;j=0;k=0;while(1){a=g+(h<<2)|0;l=c[a>>2]|0;j=l+j+(d[b+k>>0]|0)&255;m=g+(j<<2)|0;c[a>>2]=c[m>>2];c[m>>2]=l;l=k+1|0;h=h+1|0;if((h|0)==256){break}else{k=(l|0)>=(e|0)?0:l}}i=f;return}function _0a(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;g=i;h=c[b>>2]|0;j=b+4|0;k=c[j>>2]|0;l=b+8|0;if((f|0)>0){m=0;n=h;o=k}else{p=h;q=k;c[b>>2]=p;c[j>>2]=q;i=g;return}while(1){k=n+1&255;h=l+(k<<2)|0;r=c[h>>2]|0;s=r+o&255;t=l+(s<<2)|0;u=c[t>>2]|0;c[h>>2]=u;c[t>>2]=r;t=e+m|0;a[t>>0]=(d[t>>0]|0)^c[l+((u+r&255)<<2)>>2];m=m+1|0;if((m|0)==(f|0)){p=k;q=s;break}else{n=k;o=s}}c[b>>2]=p;c[j>>2]=q;i=g;return}function $0a(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=i;i=i+1040|0;f=e;Z0a(f,c,d);_0a(f,a,b);i=e;return}function a1a(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;e=(d[b+1>>0]|0)<<8|(d[b>>0]|0)|(d[b+2>>0]|0)<<16|(d[b+3>>0]|0)<<24;f=(d[b+5>>0]|0)<<8|(d[b+4>>0]|0)|(d[b+6>>0]|0)<<16|(d[b+7>>0]|0)<<24;g=(d[b+9>>0]|0)<<8|(d[b+8>>0]|0)|(d[b+10>>0]|0)<<16|(d[b+11>>0]|0)<<24;h=(d[b+13>>0]|0)<<8|(d[b+12>>0]|0)|(d[b+14>>0]|0)<<16|(d[b+15>>0]|0)<<24;i=(d[b+17>>0]|0)<<8|(d[b+16>>0]|0)|(d[b+18>>0]|0)<<16|(d[b+19>>0]|0)<<24;j=(d[b+21>>0]|0)<<8|(d[b+20>>0]|0)|(d[b+22>>0]|0)<<16|(d[b+23>>0]|0)<<24;k=(d[b+25>>0]|0)<<8|(d[b+24>>0]|0)|(d[b+26>>0]|0)<<16|(d[b+27>>0]|0)<<24;l=(d[b+29>>0]|0)<<8|(d[b+28>>0]|0)|(d[b+30>>0]|0)<<16|(d[b+31>>0]|0)<<24;m=(d[b+33>>0]|0)<<8|(d[b+32>>0]|0)|(d[b+34>>0]|0)<<16|(d[b+35>>0]|0)<<24;n=(d[b+37>>0]|0)<<8|(d[b+36>>0]|0)|(d[b+38>>0]|0)<<16|(d[b+39>>0]|0)<<24;o=(d[b+41>>0]|0)<<8|(d[b+40>>0]|0)|(d[b+42>>0]|0)<<16|(d[b+43>>0]|0)<<24;p=(d[b+45>>0]|0)<<8|(d[b+44>>0]|0)|(d[b+46>>0]|0)<<16|(d[b+47>>0]|0)<<24;q=(d[b+49>>0]|0)<<8|(d[b+48>>0]|0)|(d[b+50>>0]|0)<<16|(d[b+51>>0]|0)<<24;r=(d[b+53>>0]|0)<<8|(d[b+52>>0]|0)|(d[b+54>>0]|0)<<16|(d[b+55>>0]|0)<<24;s=(d[b+57>>0]|0)<<8|(d[b+56>>0]|0)|(d[b+58>>0]|0)<<16|(d[b+59>>0]|0)<<24;t=(d[b+61>>0]|0)<<8|(d[b+60>>0]|0)|(d[b+62>>0]|0)<<16|(d[b+63>>0]|0)<<24;b=a+8|0;u=c[b>>2]|0;v=a+12|0;w=c[v>>2]|0;x=a+16|0;y=c[x>>2]|0;z=a+20|0;a=c[z>>2]|0;A=e+ -680876936+u+((a^y)&w^a)|0;B=(A<<7|A>>>25)+w|0;A=f+ -389564586+a+(B&(y^w)^y)|0;a=(A<<12|A>>>20)+B|0;A=g+606105819+y+(a&(B^w)^w)|0;y=(A<<17|A>>>15)+a|0;A=h+ -1044525330+w+(y&(a^B)^B)|0;w=(A<<22|A>>>10)+y|0;A=i+ -176418897+B+(w&(y^a)^a)|0;B=(A<<7|A>>>25)+w|0;A=j+1200080426+a+(B&(w^y)^y)|0;a=(A<<12|A>>>20)+B|0;A=k+ -1473231341+y+(a&(B^w)^w)|0;y=(A<<17|A>>>15)+a|0;A=l+ -45705983+w+(y&(a^B)^B)|0;w=(A<<22|A>>>10)+y|0;A=m+1770035416+B+(w&(y^a)^a)|0;B=(A<<7|A>>>25)+w|0;A=n+ -1958414417+a+(B&(w^y)^y)|0;a=(A<<12|A>>>20)+B|0;A=o+ -42063+y+(a&(B^w)^w)|0;y=(A<<17|A>>>15)+a|0;A=p+ -1990404162+w+(y&(a^B)^B)|0;w=(A<<22|A>>>10)+y|0;A=q+1804603682+B+(w&(y^a)^a)|0;B=(A<<7|A>>>25)+w|0;A=r+ -40341101+a+(B&(w^y)^y)|0;a=(A<<12|A>>>20)+B|0;A=s+ -1502002290+y+(a&(B^w)^w)|0;y=(A<<17|A>>>15)+a|0;A=t+1236535329+w+(y&(a^B)^B)|0;w=(A<<22|A>>>10)+y|0;A=f+ -165796510+B+((w^y)&a^y)|0;B=(A<<5|A>>>27)+w|0;A=k+ -1069501632+a+((B^w)&y^w)|0;a=(A<<9|A>>>23)+B|0;A=p+643717713+y+((a^B)&w^B)|0;y=(A<<14|A>>>18)+a|0;A=e+ -373897302+w+((y^a)&B^a)|0;w=(A<<20|A>>>12)+y|0;A=j+ -701558691+B+((w^y)&a^y)|0;B=(A<<5|A>>>27)+w|0;A=o+38016083+a+((B^w)&y^w)|0;a=(A<<9|A>>>23)+B|0;A=t+ -660478335+y+((a^B)&w^B)|0;y=(A<<14|A>>>18)+a|0;A=i+ -405537848+w+((y^a)&B^a)|0;w=(A<<20|A>>>12)+y|0;A=n+568446438+B+((w^y)&a^y)|0;B=(A<<5|A>>>27)+w|0;A=s+ -1019803690+a+((B^w)&y^w)|0;a=(A<<9|A>>>23)+B|0;A=h+ -187363961+y+((a^B)&w^B)|0;y=(A<<14|A>>>18)+a|0;A=m+1163531501+w+((y^a)&B^a)|0;w=(A<<20|A>>>12)+y|0;A=r+ -1444681467+B+((w^y)&a^y)|0;B=(A<<5|A>>>27)+w|0;A=g+ -51403784+a+((B^w)&y^w)|0;a=(A<<9|A>>>23)+B|0;A=l+1735328473+y+((a^B)&w^B)|0;y=(A<<14|A>>>18)+a|0;A=y^a;C=q+ -1926607734+w+(A&B^a)|0;w=(C<<20|C>>>12)+y|0;C=j+ -378558+B+(A^w)|0;A=(C<<4|C>>>28)+w|0;C=m+ -2022574463+a+(w^y^A)|0;a=(C<<11|C>>>21)+A|0;C=p+1839030562+y+(A^w^a)|0;y=(C<<16|C>>>16)+a|0;C=s+ -35309556+w+(a^A^y)|0;w=(C<<23|C>>>9)+y|0;C=f+ -1530992060+A+(y^a^w)|0;A=(C<<4|C>>>28)+w|0;C=i+1272893353+a+(w^y^A)|0;a=(C<<11|C>>>21)+A|0;C=l+ -155497632+y+(A^w^a)|0;y=(C<<16|C>>>16)+a|0;C=o+ -1094730640+w+(a^A^y)|0;w=(C<<23|C>>>9)+y|0;C=r+681279174+A+(y^a^w)|0;A=(C<<4|C>>>28)+w|0;C=e+ -358537222+a+(w^y^A)|0;a=(C<<11|C>>>21)+A|0;C=h+ -722521979+y+(A^w^a)|0;y=(C<<16|C>>>16)+a|0;C=k+76029189+w+(a^A^y)|0;w=(C<<23|C>>>9)+y|0;C=n+ -640364487+A+(y^a^w)|0;A=(C<<4|C>>>28)+w|0;C=q+ -421815835+a+(w^y^A)|0;a=(C<<11|C>>>21)+A|0;C=t+530742520+y+(A^w^a)|0;y=(C<<16|C>>>16)+a|0;C=g+ -995338651+w+(a^A^y)|0;w=(C<<23|C>>>9)+y|0;C=e+ -198630844+A+((w|~a)^y)|0;A=(C<<6|C>>>26)+w|0;C=l+1126891415+a+((A|~y)^w)|0;a=(C<<10|C>>>22)+A|0;C=s+ -1416354905+y+((a|~w)^A)|0;y=(C<<15|C>>>17)+a|0;C=j+ -57434055+w+((y|~A)^a)|0;w=(C<<21|C>>>11)+y|0;C=q+1700485571+A+((w|~a)^y)|0;A=(C<<6|C>>>26)+w|0;C=h+ -1894986606+a+((A|~y)^w)|0;a=(C<<10|C>>>22)+A|0;C=o+ -1051523+y+((a|~w)^A)|0;y=(C<<15|C>>>17)+a|0;C=f+ -2054922799+w+((y|~A)^a)|0;w=(C<<21|C>>>11)+y|0;C=m+1873313359+A+((w|~a)^y)|0;A=(C<<6|C>>>26)+w|0;C=t+ -30611744+a+((A|~y)^w)|0;a=(C<<10|C>>>22)+A|0;C=k+ -1560198380+y+((a|~w)^A)|0;y=(C<<15|C>>>17)+a|0;C=r+1309151649+w+((y|~A)^a)|0;w=(C<<21|C>>>11)+y|0;C=i+ -145523070+A+((w|~a)^y)|0;A=(C<<6|C>>>26)+w|0;C=p+ -1120210379+a+((A|~y)^w)|0;a=(C<<10|C>>>22)+A|0;C=g+718787259+y+((a|~w)^A)|0;y=(C<<15|C>>>17)+a|0;C=n+ -343485551+w+((y|~A)^a)|0;c[b>>2]=A+u;c[v>>2]=y+(c[v>>2]|0)+(C<<21|C>>>11);c[x>>2]=y+(c[x>>2]|0);c[z>>2]=a+(c[z>>2]|0);return}function b1a(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=1732584193;c[a+12>>2]=-271733879;c[a+16>>2]=-1732584194;c[a+20>>2]=271733878;return}function c1a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;if((d|0)==0){i=e;return}f=c[a>>2]|0;g=f>>>3&63;h=64-g|0;j=d<<3;k=f+j|0;c[a>>2]=k;f=a+4|0;c[f>>2]=(k>>>0<j>>>0&1)+((c[f>>2]|0)+(d>>>29));if((g|0)==0|h>>>0>d>>>0){l=b;m=d;n=g}else{c3a(a+(g+24)|0,b|0,h|0)|0;a1a(a,a+24|0);l=b+h|0;m=d-h|0;n=0}if(m>>>0>63){h=m;d=l;while(1){a1a(a,d);b=h+ -64|0;g=d+64|0;if(b>>>0>63){h=b;d=g}else{o=g;p=b;break}}}else{o=l;p=m}if((p|0)==0){i=e;return}c3a(a+(n+24)|0,o|0,p|0)|0;i=e;return}function d1a(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e;g=c[b>>2]|0;a[f>>0]=g;a[f+1>>0]=g>>>8;a[f+2>>0]=g>>>16;a[f+3>>0]=g>>>24;h=c[b+4>>2]|0;a[f+4>>0]=h;a[f+5>>0]=h>>>8;a[f+6>>0]=h>>>16;a[f+7>>0]=h>>>24;h=g>>>3&63;c1a(b,1294200,(h>>>0<56?56:120)-h|0);c1a(b,f,8);f=b+8|0;a[d>>0]=c[f>>2];a[d+1>>0]=(c[f>>2]|0)>>>8;a[d+2>>0]=(c[f>>2]|0)>>>16;a[d+3>>0]=(c[f>>2]|0)>>>24;f=b+12|0;a[d+4>>0]=c[f>>2];a[d+5>>0]=(c[f>>2]|0)>>>8;a[d+6>>0]=(c[f>>2]|0)>>>16;a[d+7>>0]=(c[f>>2]|0)>>>24;f=b+16|0;a[d+8>>0]=c[f>>2];a[d+9>>0]=(c[f>>2]|0)>>>8;a[d+10>>0]=(c[f>>2]|0)>>>16;a[d+11>>0]=(c[f>>2]|0)>>>24;f=b+20|0;a[d+12>>0]=c[f>>2];a[d+13>>0]=(c[f>>2]|0)>>>8;a[d+14>>0]=(c[f>>2]|0)>>>16;a[d+15>>0]=(c[f>>2]|0)>>>24;i=e;return}function e1a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+96|0;f=e;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=1732584193;c[f+12>>2]=-271733879;c[f+16>>2]=-1732584194;c[f+20>>2]=271733878;c1a(f,a,b);d1a(f,d);i=e;return}function f1a(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;f=i;g=(e|0)/4|0;h=a+1e3|0;c[h>>2]=4;j=(g|0)<4?4:g;k=j+6|0;l=a+1004|0;c[l>>2]=k;c[a+960>>2]=338;c[a+964>>2]=339;if(((j<<2)+28|0)>0){j=(e|0)>27;e=0;m=1;while(1){if((e|0)<(g|0)){n=e<<2;c[a+(e<<2)>>2]=(d[b+(n|2)>>0]|0)<<8|(d[b+(n|3)>>0]|0)|(d[b+(n|1)>>0]|0)<<16|(d[b+n>>0]|0)<<24;o=m}else{n=c[a+(e+ -1<<2)>>2]|0;p=(e|0)%(g|0)|0;if((p|0)!=0){if((p|0)==4&j){q=m;r=(((d[1294264+(n>>>24)>>0]|0)<<8|(d[1294264+(n>>>16&255)>>0]|0))<<8|(d[1294264+(n>>>8&255)>>0]|0))<<8|(d[1294264+(n&255)>>0]|0)}else{q=m;r=n}}else{q=((m&128|0)!=0?27:0)^m<<1&254;r=((((d[1294264+(n>>>16&255)>>0]|0)^m)<<8|(d[1294264+(n>>>8&255)>>0]|0))<<8|(d[1294264+(n&255)>>0]|0))<<8|(d[1294264+(n>>>24)>>0]|0)}c[a+(e<<2)>>2]=c[a+(e-g<<2)>>2]^r;o=q}e=e+1|0;n=c[l>>2]|0;p=c[h>>2]|0;if((e|0)>=(ca(n+1|0,p)|0)){s=n;t=p;break}else{m=o}}}else{s=k;t=4}if((s|0)<0){i=f;return}else{u=t;v=s;w=0}while(1){if((u|0)>0){s=(w|0)==0;t=v;k=u;o=0;while(1){m=c[a+((ca(t-w|0,k)|0)+o<<2)>>2]|0;if(s|(w|0)==(t|0)){x=m}else{x=c[1295544+((d[1294264+(m>>>16&255)>>0]|0)<<2)>>2]^c[1294520+((d[1294264+(m>>>24)>>0]|0)<<2)>>2]^c[1296568+((d[1294264+(m>>>8&255)>>0]|0)<<2)>>2]^c[1297592+((d[1294264+(m&255)>>0]|0)<<2)>>2]}c[a+((ca(k,w)|0)+o<<2)+480>>2]=x;o=o+1|0;m=c[h>>2]|0;e=c[l>>2]|0;if((o|0)>=(m|0)){y=e;z=m;break}else{t=e;k=m}}}else{y=v;z=u}if((w|0)<(y|0)){u=z;v=y;w=w+1|0}else{break}}i=f;return}function g1a(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0;e=i;f=a+1e3|0;if((c[f>>2]|0)<=0){i=e;return}g=a+968|0;a=0;do{h=a<<2;c[g+(a<<2)>>2]=(d[b+(h|2)>>0]|0)<<8|(d[b+(h|3)>>0]|0)|(d[b+(h|1)>>0]|0)<<16|(d[b+h>>0]|0)<<24;a=a+1|0}while((a|0)<(c[f>>2]|0));i=e;return}function h1a(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;h=i;i=i+48|0;j=h+32|0;k=h+16|0;l=h;m=b+968|0;c[j+0>>2]=c[m+0>>2];c[j+4>>2]=c[m+4>>2];c[j+8>>2]=c[m+8>>2];c[j+12>>2]=c[m+12>>2];if((g|0)<=0){c[m+0>>2]=c[j+0>>2];c[m+4>>2]=c[j+4>>2];c[m+8>>2]=c[j+8>>2];c[m+12>>2]=c[j+12>>2];i=h;return}n=b+964|0;o=g;g=e;e=f;while(1){f=0;do{p=f<<2;q=(d[e+(p|2)>>0]|0)<<8|(d[e+(p|3)>>0]|0)|(d[e+(p|1)>>0]|0)<<16|(d[e+p>>0]|0)<<24;c[l+(f<<2)>>2]=q;c[k+(f<<2)>>2]=q;f=f+1|0}while((f|0)!=4);Ic[c[n>>2]&511](b,k);f=0;do{q=j+(f<<2)|0;p=k+(f<<2)|0;r=f<<2;a[g+(r|3)>>0]=c[p>>2]^c[q>>2];a[g+(r|2)>>0]=(c[p>>2]^c[q>>2])>>>8;a[g+(r|1)>>0]=(c[p>>2]^c[q>>2])>>>16;a[g+r>>0]=(c[p>>2]^c[q>>2])>>>24;c[q>>2]=c[l+(f<<2)>>2];f=f+1|0}while((f|0)!=4);o=o+ -16|0;if((o|0)<=0){break}else{g=g+16|0;e=e+16|0}}c[m+0>>2]=c[j+0>>2];c[m+4>>2]=c[j+4>>2];c[m+8>>2]=c[j+8>>2];c[m+12>>2]=c[j+12>>2];i=h;return}function i1a(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0;h=i;i=i+16|0;j=h;k=b+968|0;c[j+0>>2]=c[k+0>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];if((g|0)<=0){c[k+0>>2]=c[j+0>>2];c[k+4>>2]=c[j+4>>2];c[k+8>>2]=c[j+8>>2];c[k+12>>2]=c[j+12>>2];i=h;return}l=b+960|0;m=g;g=e;e=f;while(1){f=0;do{n=f<<2;o=j+(f<<2)|0;c[o>>2]=((d[e+(n|2)>>0]|0)<<8|(d[e+(n|3)>>0]|0)|(d[e+(n|1)>>0]|0)<<16|(d[e+n>>0]|0)<<24)^c[o>>2];f=f+1|0}while((f|0)!=4);Ic[c[l>>2]&511](b,j);f=0;do{o=j+(f<<2)|0;n=f<<2;a[g+(n|3)>>0]=c[o>>2];a[g+(n|2)>>0]=(c[o>>2]|0)>>>8;a[g+(n|1)>>0]=(c[o>>2]|0)>>>16;a[g+n>>0]=(c[o>>2]|0)>>>24;f=f+1|0}while((f|0)!=4);m=m+ -16|0;if((m|0)<=0){break}else{g=g+16|0;e=e+16|0}}c[k+0>>2]=c[j+0>>2];c[k+4>>2]=c[j+4>>2];c[k+8>>2]=c[j+8>>2];c[k+12>>2]=c[j+12>>2];i=h;return}function j1a(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;e=i;f=a+1004|0;g=b+4|0;h=b+8|0;j=b+12|0;k=c[b>>2]|0;l=c[g>>2]|0;m=c[h>>2]|0;n=c[j>>2]|0;o=0;p=a;while(1){a=(o|0)<((c[f>>2]|0)+ -1|0);q=k^c[p>>2];c[b>>2]=q;r=l^c[p+4>>2];c[g>>2]=r;s=m^c[p+8>>2];c[h>>2]=s;t=p+16|0;u=n^c[p+12>>2];c[j>>2]=u;v=q>>>24;if(!a){break}a=c[1299896+((r>>>16&255)<<2)>>2]^c[1298872+(v<<2)>>2]^c[1300920+((s>>>8&255)<<2)>>2]^c[1301944+((u&255)<<2)>>2];w=c[1299896+((s>>>16&255)<<2)>>2]^c[1298872+(r>>>24<<2)>>2]^c[1300920+((u>>>8&255)<<2)>>2]^c[1301944+((q&255)<<2)>>2];x=c[1299896+((u>>>16&255)<<2)>>2]^c[1298872+(s>>>24<<2)>>2]^c[1300920+((q>>>8&255)<<2)>>2]^c[1301944+((r&255)<<2)>>2];y=c[1299896+((q>>>16&255)<<2)>>2]^c[1298872+(u>>>24<<2)>>2]^c[1300920+((r>>>8&255)<<2)>>2]^c[1301944+((s&255)<<2)>>2];c[b>>2]=a;c[g>>2]=w;c[h>>2]=x;c[j>>2]=y;k=a;l=w;m=x;n=y;o=o+1|0;p=t}o=(d[1294264+(r>>>16&255)>>0]|0)<<16|(d[1294264+v>>0]|0)<<24|(d[1294264+(s>>>8&255)>>0]|0)<<8|(d[1294264+(u&255)>>0]|0);v=(d[1294264+(s>>>16&255)>>0]|0)<<16|(d[1294264+(r>>>24)>>0]|0)<<24|(d[1294264+(u>>>8&255)>>0]|0)<<8|(d[1294264+(q&255)>>0]|0);n=(d[1294264+(u>>>16&255)>>0]|0)<<16|(d[1294264+(s>>>24)>>0]|0)<<24|(d[1294264+(q>>>8&255)>>0]|0)<<8|(d[1294264+(r&255)>>0]|0);m=(d[1294264+(q>>>16&255)>>0]|0)<<16|(d[1294264+(u>>>24)>>0]|0)<<24|(d[1294264+(r>>>8&255)>>0]|0)<<8|(d[1294264+(s&255)>>0]|0);c[b>>2]=o;c[g>>2]=v;c[h>>2]=n;c[j>>2]=m;c[b>>2]=o^c[t>>2];c[g>>2]=v^c[p+20>>2];c[h>>2]=n^c[p+24>>2];c[j>>2]=m^c[p+28>>2];i=e;return}function k1a(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;e=i;f=a+1004|0;g=b+4|0;h=b+8|0;j=b+12|0;k=c[b>>2]|0;l=c[g>>2]|0;m=c[h>>2]|0;n=c[j>>2]|0;o=0;p=a+480|0;while(1){a=(o|0)<((c[f>>2]|0)+ -1|0);q=k^c[p>>2];c[b>>2]=q;r=l^c[p+4>>2];c[g>>2]=r;s=m^c[p+8>>2];c[h>>2]=s;t=p+16|0;u=n^c[p+12>>2];c[j>>2]=u;v=q>>>24;if(!a){break}a=c[1295544+((u>>>16&255)<<2)>>2]^c[1294520+(v<<2)>>2]^c[1296568+((s>>>8&255)<<2)>>2]^c[1297592+((r&255)<<2)>>2];w=c[1295544+((q>>>16&255)<<2)>>2]^c[1294520+(r>>>24<<2)>>2]^c[1296568+((u>>>8&255)<<2)>>2]^c[1297592+((s&255)<<2)>>2];x=c[1295544+((r>>>16&255)<<2)>>2]^c[1294520+(s>>>24<<2)>>2]^c[1296568+((q>>>8&255)<<2)>>2]^c[1297592+((u&255)<<2)>>2];y=c[1295544+((s>>>16&255)<<2)>>2]^c[1294520+(u>>>24<<2)>>2]^c[1296568+((r>>>8&255)<<2)>>2]^c[1297592+((q&255)<<2)>>2];c[b>>2]=a;c[g>>2]=w;c[h>>2]=x;c[j>>2]=y;k=a;l=w;m=x;n=y;o=o+1|0;p=t}o=(d[1298616+(u>>>16&255)>>0]|0)<<16|(d[1298616+v>>0]|0)<<24|(d[1298616+(s>>>8&255)>>0]|0)<<8|(d[1298616+(r&255)>>0]|0);v=(d[1298616+(q>>>16&255)>>0]|0)<<16|(d[1298616+(r>>>24)>>0]|0)<<24|(d[1298616+(u>>>8&255)>>0]|0)<<8|(d[1298616+(s&255)>>0]|0);n=(d[1298616+(r>>>16&255)>>0]|0)<<16|(d[1298616+(s>>>24)>>0]|0)<<24|(d[1298616+(q>>>8&255)>>0]|0)<<8|(d[1298616+(u&255)>>0]|0);m=(d[1298616+(s>>>16&255)>>0]|0)<<16|(d[1298616+(u>>>24)>>0]|0)<<24|(d[1298616+(r>>>8&255)>>0]|0)<<8|(d[1298616+(q&255)>>0]|0);c[b>>2]=o;c[g>>2]=v;c[h>>2]=n;c[j>>2]=m;c[b>>2]=o^c[t>>2];c[g>>2]=v^c[p+20>>2];c[h>>2]=n^c[p+24>>2];c[j>>2]=m^c[p+28>>2];i=e;return}function l1a(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0;f=i;i=i+384|0;g=f+64|0;h=f;j=a+92|0;k=(c[j>>2]|0)+e|0;c[j>>2]=k;j=a+88|0;c[j>>2]=(k>>>0<e>>>0&1)+(c[j>>2]|0);j=a+84|0;k=c[j>>2]|0;l=k+e|0;if((k|0)==0){if((l|0)>63){m=3}else{n=e;o=b}}else{if((l|0)<64){c3a(a+(k+20)|0,b|0,e|0)|0;p=(c[j>>2]|0)+e|0;c[j>>2]=p;i=f;return}else{m=3}}if((m|0)==3){m=a+4|0;l=a+8|0;q=a+12|0;r=a+16|0;s=k;k=e;e=b;while(1){c3a(a+(s+20)|0,e|0,64-s|0)|0;b=64-(c[j>>2]|0)|0;t=e+b|0;u=0;do{v=u<<2;c[h+(u<<2)>>2]=(d[a+((v|1)+20)>>0]|0)<<16|(d[a+(v+20)>>0]|0)<<24|(d[a+((v|2)+20)>>0]|0)<<8|(d[a+((v|3)+20)>>0]|0);u=u+1|0}while((u|0)!=16);u=g+0|0;v=h+0|0;w=u+64|0;do{c[u>>2]=c[v>>2];u=u+4|0;v=v+4|0}while((u|0)<(w|0));v=16;do{u=c[g+(v+ -8<<2)>>2]^c[g+(v+ -3<<2)>>2]^c[g+(v+ -14<<2)>>2]^c[g+(v+ -16<<2)>>2];c[g+(v<<2)>>2]=u<<1|u>>>31;v=v+1|0}while((v|0)!=80);v=c[a>>2]|0;u=c[m>>2]|0;w=c[l>>2]|0;x=c[q>>2]|0;y=c[r>>2]|0;z=v;A=u;B=w;C=x;D=y;E=0;while(1){F=(z<<5|z>>>27)+1518500249+D+(C&~A|B&A)+(c[g+(E<<2)>>2]|0)|0;G=A<<30|A>>>2;E=E+1|0;if((E|0)==20){H=F;I=z;J=G;K=B;L=C;M=20;break}else{N=B;O=z;z=F;B=G;D=C;C=N;A=O}}while(1){A=(H<<5|H>>>27)+1859775393+L+(J^I^K)+(c[g+(M<<2)>>2]|0)|0;C=I<<30|I>>>2;M=M+1|0;if((M|0)==40){P=A;Q=H;R=C;S=J;T=K;U=40;break}else{D=J;B=H;H=A;J=C;L=K;K=D;I=B}}while(1){B=(P<<5|P>>>27)+ -1894007588+T+((S|R)&Q|S&R)+(c[g+(U<<2)>>2]|0)|0;D=Q<<30|Q>>>2;U=U+1|0;if((U|0)==60){V=B;W=P;X=D;Y=R;Z=S;_=60;break}else{C=R;A=P;P=B;R=D;T=S;S=C;Q=A}}while(1){$=(V<<5|V>>>27)+ -899497514+Z+(X^W^Y)+(c[g+(_<<2)>>2]|0)|0;aa=W<<30|W>>>2;_=_+1|0;if((_|0)==80){break}else{A=X;C=V;V=$;X=aa;Z=Y;Y=A;W=C}}C=k-b|0;c[a>>2]=$+v;c[m>>2]=V+u;c[l>>2]=aa+w;c[q>>2]=X+x;c[r>>2]=Y+y;c[j>>2]=0;if((C|0)>63){s=0;k=C;e=t}else{n=C;o=t;break}}}c3a(a+20|0,o|0,n|0)|0;p=n;c[j>>2]=p;i=f;return}function m1a(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+64|0;f=e;g=c[b+84>>2]|0;h=((g|0)>55?120:56)-g|0;g=c[b+88>>2]|0;j=c[b+92>>2]|0;f3a(f|0,0,h|0)|0;a[f>>0]=-128;l1a(b,f,h);a[f>>0]=g>>>21;a[f+1>>0]=g>>>13;a[f+2>>0]=g>>>5;a[f+3>>0]=j>>>29|g<<3;a[f+4>>0]=j>>>21;a[f+5>>0]=j>>>13;a[f+6>>0]=j>>>5;a[f+7>>0]=j<<3;l1a(b,f,8);f=0;do{j=b+(f<<2)|0;g=f<<2;a[d+g>>0]=(c[j>>2]|0)>>>24;a[d+(g|1)>>0]=(c[j>>2]|0)>>>16;a[d+(g|2)>>0]=(c[j>>2]|0)>>>8;a[d+(g|3)>>0]=c[j>>2];f=f+1|0}while((f|0)!=5);i=e;return}function n1a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+96|0;f=e;c[f>>2]=1732584193;c[f+4>>2]=-271733879;c[f+8>>2]=-1732584194;c[f+12>>2]=271733878;c[f+16>>2]=-1009589776;c[f+84>>2]=0;c[f+92>>2]=0;c[f+88>>2]=0;l1a(f,a,b);m1a(f,d);i=e;return}function o1a(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=1779033703;c[a+12>>2]=-1150833019;c[a+16>>2]=1013904242;c[a+20>>2]=-1521486534;c[a+24>>2]=1359893119;c[a+28>>2]=-1694144372;c[a+32>>2]=528734635;c[a+36>>2]=1541459225;return}function p1a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;if((d|0)==0){i=e;return}f=c[a>>2]|0;g=f&63;h=64-g|0;j=f+d|0;c[a>>2]=j;if(j>>>0<d>>>0){j=a+4|0;c[j>>2]=(c[j>>2]|0)+1}if((g|0)==0|h>>>0>d>>>0){k=b;l=d;m=g}else{c3a(a+(g+40)|0,b|0,h|0)|0;q1a(a,a+40|0);k=b+h|0;l=d-h|0;m=0}if(l>>>0>63){h=l;d=k;while(1){q1a(a,d);b=h+ -64|0;g=d+64|0;if(b>>>0>63){h=b;d=g}else{n=g;o=b;break}}}else{n=k;o=l}if((o|0)==0){i=e;return}c3a(a+(m+40)|0,n|0,o|0)|0;i=e;return}function q1a(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0;e=(d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(d[b+2>>0]|0)<<8|(d[b+3>>0]|0);f=(d[b+5>>0]|0)<<16|(d[b+4>>0]|0)<<24;g=d[b+7>>0]|0;h=f|(d[b+6>>0]|0)<<8|g;i=(d[b+9>>0]|0)<<16|(d[b+8>>0]|0)<<24;j=d[b+11>>0]|0;k=i|(d[b+10>>0]|0)<<8|j;l=(d[b+13>>0]|0)<<16|(d[b+12>>0]|0)<<24;m=d[b+15>>0]|0;n=l|(d[b+14>>0]|0)<<8|m;o=(d[b+17>>0]|0)<<16|(d[b+16>>0]|0)<<24;p=d[b+19>>0]|0;q=o|(d[b+18>>0]|0)<<8|p;r=(d[b+21>>0]|0)<<16|(d[b+20>>0]|0)<<24;s=d[b+23>>0]|0;t=r|(d[b+22>>0]|0)<<8|s;u=(d[b+25>>0]|0)<<16|(d[b+24>>0]|0)<<24;v=d[b+27>>0]|0;w=u|(d[b+26>>0]|0)<<8|v;x=(d[b+29>>0]|0)<<16|(d[b+28>>0]|0)<<24;y=d[b+31>>0]|0;z=x|(d[b+30>>0]|0)<<8|y;A=(d[b+33>>0]|0)<<16|(d[b+32>>0]|0)<<24;B=d[b+35>>0]|0;C=A|(d[b+34>>0]|0)<<8|B;D=(d[b+37>>0]|0)<<16|(d[b+36>>0]|0)<<24;E=d[b+39>>0]|0;F=D|(d[b+38>>0]|0)<<8|E;G=(d[b+41>>0]|0)<<16|(d[b+40>>0]|0)<<24;H=d[b+43>>0]|0;I=G|(d[b+42>>0]|0)<<8|H;J=(d[b+45>>0]|0)<<16|(d[b+44>>0]|0)<<24;K=d[b+47>>0]|0;L=J|(d[b+46>>0]|0)<<8|K;M=(d[b+49>>0]|0)<<16|(d[b+48>>0]|0)<<24;N=d[b+51>>0]|0;O=M|(d[b+50>>0]|0)<<8|N;P=(d[b+53>>0]|0)<<16|(d[b+52>>0]|0)<<24;Q=d[b+55>>0]|0;R=P|(d[b+54>>0]|0)<<8|Q;S=(d[b+57>>0]|0)<<16|(d[b+56>>0]|0)<<24;T=S|(d[b+58>>0]|0)<<8;U=d[b+59>>0]|0;V=T|U;W=(d[b+61>>0]|0)<<16|(d[b+60>>0]|0)<<24;X=W|(d[b+62>>0]|0)<<8;Y=d[b+63>>0]|0;b=X|Y;Z=a+8|0;_=c[Z>>2]|0;$=a+12|0;aa=c[$>>2]|0;ba=a+16|0;ca=c[ba>>2]|0;da=a+20|0;ea=a+24|0;fa=c[ea>>2]|0;ga=a+28|0;ha=c[ga>>2]|0;ia=a+32|0;ja=c[ia>>2]|0;ka=a+36|0;a=e+1116352408+(c[ka>>2]|0)+((fa>>>6|fa<<26)^(fa>>>11|fa<<21)^(fa>>>25|fa<<7))+((ja^ha)&fa^ja)|0;la=a+(c[da>>2]|0)|0;ma=((_>>>2|_<<30)^(_>>>13|_<<19)^(_>>>22|_<<10))+(ca&(aa|_)|aa&_)+a|0;a=h+1899447441+ja+(la&(ha^fa)^ha)+((la>>>6|la<<26)^(la>>>11|la<<21)^(la>>>25|la<<7))|0;ja=a+ca|0;ca=((ma>>>2|ma<<30)^(ma>>>13|ma<<19)^(ma>>>22|ma<<10))+((ma|_)&aa|ma&_)+a|0;a=k+ -1245643825+ha+(ja&(la^fa)^fa)+((ja>>>6|ja<<26)^(ja>>>11|ja<<21)^(ja>>>25|ja<<7))|0;ha=a+aa|0;aa=((ca>>>2|ca<<30)^(ca>>>13|ca<<19)^(ca>>>22|ca<<10))+((ca|ma)&_|ca&ma)+a|0;a=n+ -373957723+fa+(ha&(ja^la)^la)+((ha>>>6|ha<<26)^(ha>>>11|ha<<21)^(ha>>>25|ha<<7))|0;fa=a+_|0;na=((aa>>>2|aa<<30)^(aa>>>13|aa<<19)^(aa>>>22|aa<<10))+((aa|ca)&ma|aa&ca)+a|0;a=q+961987163+la+(fa&(ha^ja)^ja)+((fa>>>6|fa<<26)^(fa>>>11|fa<<21)^(fa>>>25|fa<<7))|0;la=a+ma|0;ma=((na>>>2|na<<30)^(na>>>13|na<<19)^(na>>>22|na<<10))+((na|aa)&ca|na&aa)+a|0;a=t+1508970993+ja+(la&(fa^ha)^ha)+((la>>>6|la<<26)^(la>>>11|la<<21)^(la>>>25|la<<7))|0;ja=a+ca|0;ca=((ma>>>2|ma<<30)^(ma>>>13|ma<<19)^(ma>>>22|ma<<10))+((ma|na)&aa|ma&na)+a|0;a=w+ -1841331548+ha+(ja&(la^fa)^fa)+((ja>>>6|ja<<26)^(ja>>>11|ja<<21)^(ja>>>25|ja<<7))|0;ha=a+aa|0;aa=((ca>>>2|ca<<30)^(ca>>>13|ca<<19)^(ca>>>22|ca<<10))+((ca|ma)&na|ca&ma)+a|0;a=z+ -1424204075+fa+(ha&(ja^la)^la)+((ha>>>6|ha<<26)^(ha>>>11|ha<<21)^(ha>>>25|ha<<7))|0;fa=a+na|0;na=((aa>>>2|aa<<30)^(aa>>>13|aa<<19)^(aa>>>22|aa<<10))+((aa|ca)&ma|aa&ca)+a|0;a=C+ -670586216+la+(fa&(ha^ja)^ja)+((fa>>>6|fa<<26)^(fa>>>11|fa<<21)^(fa>>>25|fa<<7))|0;la=a+ma|0;ma=((na>>>2|na<<30)^(na>>>13|na<<19)^(na>>>22|na<<10))+((na|aa)&ca|na&aa)+a|0;a=F+310598401+ja+(la&(fa^ha)^ha)+((la>>>6|la<<26)^(la>>>11|la<<21)^(la>>>25|la<<7))|0;ja=a+ca|0;ca=((ma>>>2|ma<<30)^(ma>>>13|ma<<19)^(ma>>>22|ma<<10))+((ma|na)&aa|ma&na)+a|0;a=I+607225278+ha+(ja&(la^fa)^fa)+((ja>>>6|ja<<26)^(ja>>>11|ja<<21)^(ja>>>25|ja<<7))|0;ha=a+aa|0;aa=((ca>>>2|ca<<30)^(ca>>>13|ca<<19)^(ca>>>22|ca<<10))+((ca|ma)&na|ca&ma)+a|0;a=L+1426881987+fa+(ha&(ja^la)^la)+((ha>>>6|ha<<26)^(ha>>>11|ha<<21)^(ha>>>25|ha<<7))|0;fa=a+na|0;na=((aa>>>2|aa<<30)^(aa>>>13|aa<<19)^(aa>>>22|aa<<10))+((aa|ca)&ma|aa&ca)+a|0;a=O+1925078388+la+(fa&(ha^ja)^ja)+((fa>>>6|fa<<26)^(fa>>>11|fa<<21)^(fa>>>25|fa<<7))|0;la=a+ma|0;ma=((na>>>2|na<<30)^(na>>>13|na<<19)^(na>>>22|na<<10))+((na|aa)&ca|na&aa)+a|0;a=R+ -2132889090+ja+(la&(fa^ha)^ha)+((la>>>6|la<<26)^(la>>>11|la<<21)^(la>>>25|la<<7))|0;ja=a+ca|0;ca=((ma>>>2|ma<<30)^(ma>>>13|ma<<19)^(ma>>>22|ma<<10))+((ma|na)&aa|ma&na)+a|0;a=V+ -1680079193+ha+(ja&(la^fa)^fa)+((ja>>>6|ja<<26)^(ja>>>11|ja<<21)^(ja>>>25|ja<<7))|0;ha=a+aa|0;aa=((ca>>>2|ca<<30)^(ca>>>13|ca<<19)^(ca>>>22|ca<<10))+((ca|ma)&na|ca&ma)+a|0;a=b+ -1046744716+fa+(ha&(ja^la)^la)+((ha>>>6|ha<<26)^(ha>>>11|ha<<21)^(ha>>>25|ha<<7))|0;fa=a+na|0;na=((aa>>>2|aa<<30)^(aa>>>13|aa<<19)^(aa>>>22|aa<<10))+((aa|ca)&ma|aa&ca)+a|0;a=((h<<14|f>>>18)^h>>>3^(h>>>7|g<<25))+e+F+((V<<13|S>>>19)^T>>>10^(V<<15|S>>>17))|0;T=a+ -459576895+la+(fa&(ha^ja)^ja)+((fa>>>6|fa<<26)^(fa>>>11|fa<<21)^(fa>>>25|fa<<7))|0;la=T+ma|0;ma=((na>>>2|na<<30)^(na>>>13|na<<19)^(na>>>22|na<<10))+((na|aa)&ca|na&aa)+T|0;T=((k<<14|i>>>18)^k>>>3^(k>>>7|j<<25))+h+I+((b<<13|W>>>19)^X>>>10^(b<<15|W>>>17))|0;X=T+ -272742522+ja+(la&(fa^ha)^ha)+((la>>>6|la<<26)^(la>>>11|la<<21)^(la>>>25|la<<7))|0;ja=X+ca|0;ca=((ma>>>2|ma<<30)^(ma>>>13|ma<<19)^(ma>>>22|ma<<10))+((ma|na)&aa|ma&na)+X|0;X=((n<<14|l>>>18)^n>>>3^(n>>>7|m<<25))+k+L+((a>>>19|a<<13)^a>>>10^(a>>>17|a<<15))|0;k=X+264347078+ha+(ja&(la^fa)^fa)+((ja>>>6|ja<<26)^(ja>>>11|ja<<21)^(ja>>>25|ja<<7))|0;ha=k+aa|0;aa=((ca>>>2|ca<<30)^(ca>>>13|ca<<19)^(ca>>>22|ca<<10))+((ca|ma)&na|ca&ma)+k|0;k=((q<<14|o>>>18)^q>>>3^(q>>>7|p<<25))+n+O+((T>>>19|T<<13)^T>>>10^(T>>>17|T<<15))|0;n=k+604807628+fa+(ha&(ja^la)^la)+((ha>>>6|ha<<26)^(ha>>>11|ha<<21)^(ha>>>25|ha<<7))|0;fa=n+na|0;na=((aa>>>2|aa<<30)^(aa>>>13|aa<<19)^(aa>>>22|aa<<10))+((aa|ca)&ma|aa&ca)+n|0;n=((t<<14|r>>>18)^t>>>3^(t>>>7|s<<25))+q+R+((X>>>19|X<<13)^X>>>10^(X>>>17|X<<15))|0;q=n+770255983+la+(fa&(ha^ja)^ja)+((fa>>>6|fa<<26)^(fa>>>11|fa<<21)^(fa>>>25|fa<<7))|0;la=q+ma|0;ma=((na>>>2|na<<30)^(na>>>13|na<<19)^(na>>>22|na<<10))+((na|aa)&ca|na&aa)+q|0;q=((w<<14|u>>>18)^w>>>3^(w>>>7|v<<25))+t+V+((k>>>19|k<<13)^k>>>10^(k>>>17|k<<15))|0;t=q+1249150122+ja+(la&(fa^ha)^ha)+((la>>>6|la<<26)^(la>>>11|la<<21)^(la>>>25|la<<7))|0;ja=t+ca|0;ca=((ma>>>2|ma<<30)^(ma>>>13|ma<<19)^(ma>>>22|ma<<10))+((ma|na)&aa|ma&na)+t|0;t=((z<<14|x>>>18)^z>>>3^(z>>>7|y<<25))+w+b+((n>>>19|n<<13)^n>>>10^(n>>>17|n<<15))|0;w=t+1555081692+ha+(ja&(la^fa)^fa)+((ja>>>6|ja<<26)^(ja>>>11|ja<<21)^(ja>>>25|ja<<7))|0;ha=w+aa|0;aa=((ca>>>2|ca<<30)^(ca>>>13|ca<<19)^(ca>>>22|ca<<10))+((ca|ma)&na|ca&ma)+w|0;w=((C<<14|A>>>18)^C>>>3^(C>>>7|B<<25))+z+a+((q>>>19|q<<13)^q>>>10^(q>>>17|q<<15))|0;z=w+1996064986+fa+(ha&(ja^la)^la)+((ha>>>6|ha<<26)^(ha>>>11|ha<<21)^(ha>>>25|ha<<7))|0;fa=z+na|0;na=((aa>>>2|aa<<30)^(aa>>>13|aa<<19)^(aa>>>22|aa<<10))+((aa|ca)&ma|aa&ca)+z|0;z=((F<<14|D>>>18)^F>>>3^(F>>>7|E<<25))+C+T+((t>>>19|t<<13)^t>>>10^(t>>>17|t<<15))|0;C=z+ -1740746414+la+(fa&(ha^ja)^ja)+((fa>>>6|fa<<26)^(fa>>>11|fa<<21)^(fa>>>25|fa<<7))|0;la=C+ma|0;ma=((na>>>2|na<<30)^(na>>>13|na<<19)^(na>>>22|na<<10))+((na|aa)&ca|na&aa)+C|0;C=((I<<14|G>>>18)^I>>>3^(I>>>7|H<<25))+F+X+((w>>>19|w<<13)^w>>>10^(w>>>17|w<<15))|0;F=C+ -1473132947+ja+(la&(fa^ha)^ha)+((la>>>6|la<<26)^(la>>>11|la<<21)^(la>>>25|la<<7))|0;ja=F+ca|0;ca=((ma>>>2|ma<<30)^(ma>>>13|ma<<19)^(ma>>>22|ma<<10))+((ma|na)&aa|ma&na)+F|0;F=((L<<14|J>>>18)^L>>>3^(L>>>7|K<<25))+I+k+((z>>>19|z<<13)^z>>>10^(z>>>17|z<<15))|0;I=F+ -1341970488+ha+(ja&(la^fa)^fa)+((ja>>>6|ja<<26)^(ja>>>11|ja<<21)^(ja>>>25|ja<<7))|0;ha=I+aa|0;aa=((ca>>>2|ca<<30)^(ca>>>13|ca<<19)^(ca>>>22|ca<<10))+((ca|ma)&na|ca&ma)+I|0;I=((O<<14|M>>>18)^O>>>3^(O>>>7|N<<25))+L+n+((C>>>19|C<<13)^C>>>10^(C>>>17|C<<15))|0;L=I+ -1084653625+fa+(ha&(ja^la)^la)+((ha>>>6|ha<<26)^(ha>>>11|ha<<21)^(ha>>>25|ha<<7))|0;fa=L+na|0;na=((aa>>>2|aa<<30)^(aa>>>13|aa<<19)^(aa>>>22|aa<<10))+((aa|ca)&ma|aa&ca)+L|0;L=((R<<14|P>>>18)^R>>>3^(R>>>7|Q<<25))+O+q+((F>>>19|F<<13)^F>>>10^(F>>>17|F<<15))|0;O=L+ -958395405+la+(fa&(ha^ja)^ja)+((fa>>>6|fa<<26)^(fa>>>11|fa<<21)^(fa>>>25|fa<<7))|0;la=O+ma|0;ma=((na>>>2|na<<30)^(na>>>13|na<<19)^(na>>>22|na<<10))+((na|aa)&ca|na&aa)+O|0;O=((V<<14|S>>>18)^V>>>3^(V>>>7|U<<25))+R+t+((I>>>19|I<<13)^I>>>10^(I>>>17|I<<15))|0;R=O+ -710438585+ja+(la&(fa^ha)^ha)+((la>>>6|la<<26)^(la>>>11|la<<21)^(la>>>25|la<<7))|0;ja=R+ca|0;ca=((ma>>>2|ma<<30)^(ma>>>13|ma<<19)^(ma>>>22|ma<<10))+((ma|na)&aa|ma&na)+R|0;R=((b<<14|W>>>18)^b>>>3^(b>>>7|Y<<25))+V+w+((L>>>19|L<<13)^L>>>10^(L>>>17|L<<15))|0;V=R+113926993+ha+(ja&(la^fa)^fa)+((ja>>>6|ja<<26)^(ja>>>11|ja<<21)^(ja>>>25|ja<<7))|0;ha=V+aa|0;aa=((ca>>>2|ca<<30)^(ca>>>13|ca<<19)^(ca>>>22|ca<<10))+((ca|ma)&na|ca&ma)+V|0;V=((a>>>18|a<<14)^a>>>3^(a>>>7|a<<25))+b+z+((O>>>19|O<<13)^O>>>10^(O>>>17|O<<15))|0;b=V+338241895+fa+(ha&(ja^la)^la)+((ha>>>6|ha<<26)^(ha>>>11|ha<<21)^(ha>>>25|ha<<7))|0;fa=b+na|0;na=((aa>>>2|aa<<30)^(aa>>>13|aa<<19)^(aa>>>22|aa<<10))+((aa|ca)&ma|aa&ca)+b|0;b=((T>>>18|T<<14)^T>>>3^(T>>>7|T<<25))+a+C+((R>>>19|R<<13)^R>>>10^(R>>>17|R<<15))|0;a=b+666307205+la+(fa&(ha^ja)^ja)+((fa>>>6|fa<<26)^(fa>>>11|fa<<21)^(fa>>>25|fa<<7))|0;la=a+ma|0;ma=((na>>>2|na<<30)^(na>>>13|na<<19)^(na>>>22|na<<10))+((na|aa)&ca|na&aa)+a|0;a=((X>>>18|X<<14)^X>>>3^(X>>>7|X<<25))+T+F+((V>>>19|V<<13)^V>>>10^(V>>>17|V<<15))|0;T=a+773529912+ja+(la&(fa^ha)^ha)+((la>>>6|la<<26)^(la>>>11|la<<21)^(la>>>25|la<<7))|0;ja=T+ca|0;ca=((ma>>>2|ma<<30)^(ma>>>13|ma<<19)^(ma>>>22|ma<<10))+((ma|na)&aa|ma&na)+T|0;T=((k>>>18|k<<14)^k>>>3^(k>>>7|k<<25))+X+I+((b>>>19|b<<13)^b>>>10^(b>>>17|b<<15))|0;X=T+1294757372+ha+(ja&(la^fa)^fa)+((ja>>>6|ja<<26)^(ja>>>11|ja<<21)^(ja>>>25|ja<<7))|0;ha=X+aa|0;aa=((ca>>>2|ca<<30)^(ca>>>13|ca<<19)^(ca>>>22|ca<<10))+((ca|ma)&na|ca&ma)+X|0;X=((n>>>18|n<<14)^n>>>3^(n>>>7|n<<25))+k+L+((a>>>19|a<<13)^a>>>10^(a>>>17|a<<15))|0;k=X+1396182291+fa+(ha&(ja^la)^la)+((ha>>>6|ha<<26)^(ha>>>11|ha<<21)^(ha>>>25|ha<<7))|0;fa=k+na|0;na=((aa>>>2|aa<<30)^(aa>>>13|aa<<19)^(aa>>>22|aa<<10))+((aa|ca)&ma|aa&ca)+k|0;k=((q>>>18|q<<14)^q>>>3^(q>>>7|q<<25))+n+O+((T>>>19|T<<13)^T>>>10^(T>>>17|T<<15))|0;n=k+1695183700+la+(fa&(ha^ja)^ja)+((fa>>>6|fa<<26)^(fa>>>11|fa<<21)^(fa>>>25|fa<<7))|0;la=n+ma|0;ma=((na>>>2|na<<30)^(na>>>13|na<<19)^(na>>>22|na<<10))+((na|aa)&ca|na&aa)+n|0;n=((t>>>18|t<<14)^t>>>3^(t>>>7|t<<25))+q+R+((X>>>19|X<<13)^X>>>10^(X>>>17|X<<15))|0;q=n+1986661051+ja+(la&(fa^ha)^ha)+((la>>>6|la<<26)^(la>>>11|la<<21)^(la>>>25|la<<7))|0;ja=q+ca|0;ca=((ma>>>2|ma<<30)^(ma>>>13|ma<<19)^(ma>>>22|ma<<10))+((ma|na)&aa|ma&na)+q|0;q=((w>>>18|w<<14)^w>>>3^(w>>>7|w<<25))+t+V+((k>>>19|k<<13)^k>>>10^(k>>>17|k<<15))|0;t=q+ -2117940946+ha+(ja&(la^fa)^fa)+((ja>>>6|ja<<26)^(ja>>>11|ja<<21)^(ja>>>25|ja<<7))|0;ha=t+aa|0;aa=((ca>>>2|ca<<30)^(ca>>>13|ca<<19)^(ca>>>22|ca<<10))+((ca|ma)&na|ca&ma)+t|0;t=((z>>>18|z<<14)^z>>>3^(z>>>7|z<<25))+w+b+((n>>>19|n<<13)^n>>>10^(n>>>17|n<<15))|0;w=t+ -1838011259+fa+(ha&(ja^la)^la)+((ha>>>6|ha<<26)^(ha>>>11|ha<<21)^(ha>>>25|ha<<7))|0;fa=w+na|0;na=((aa>>>2|aa<<30)^(aa>>>13|aa<<19)^(aa>>>22|aa<<10))+((aa|ca)&ma|aa&ca)+w|0;w=((C>>>18|C<<14)^C>>>3^(C>>>7|C<<25))+z+a+((q>>>19|q<<13)^q>>>10^(q>>>17|q<<15))|0;z=w+ -1564481375+la+(fa&(ha^ja)^ja)+((fa>>>6|fa<<26)^(fa>>>11|fa<<21)^(fa>>>25|fa<<7))|0;la=z+ma|0;ma=((na>>>2|na<<30)^(na>>>13|na<<19)^(na>>>22|na<<10))+((na|aa)&ca|na&aa)+z|0;z=((F>>>18|F<<14)^F>>>3^(F>>>7|F<<25))+C+T+((t>>>19|t<<13)^t>>>10^(t>>>17|t<<15))|0;C=z+ -1474664885+ja+(la&(fa^ha)^ha)+((la>>>6|la<<26)^(la>>>11|la<<21)^(la>>>25|la<<7))|0;ja=C+ca|0;ca=((ma>>>2|ma<<30)^(ma>>>13|ma<<19)^(ma>>>22|ma<<10))+((ma|na)&aa|ma&na)+C|0;C=((I>>>18|I<<14)^I>>>3^(I>>>7|I<<25))+F+X+((w>>>19|w<<13)^w>>>10^(w>>>17|w<<15))|0;F=C+ -1035236496+ha+(ja&(la^fa)^fa)+((ja>>>6|ja<<26)^(ja>>>11|ja<<21)^(ja>>>25|ja<<7))|0;ha=F+aa|0;aa=((ca>>>2|ca<<30)^(ca>>>13|ca<<19)^(ca>>>22|ca<<10))+((ca|ma)&na|ca&ma)+F|0;F=((L>>>18|L<<14)^L>>>3^(L>>>7|L<<25))+I+k+((z>>>19|z<<13)^z>>>10^(z>>>17|z<<15))|0;I=F+ -949202525+fa+(ha&(ja^la)^la)+((ha>>>6|ha<<26)^(ha>>>11|ha<<21)^(ha>>>25|ha<<7))|0;fa=I+na|0;na=((aa>>>2|aa<<30)^(aa>>>13|aa<<19)^(aa>>>22|aa<<10))+((aa|ca)&ma|aa&ca)+I|0;I=((O>>>18|O<<14)^O>>>3^(O>>>7|O<<25))+L+n+((C>>>19|C<<13)^C>>>10^(C>>>17|C<<15))|0;L=I+ -778901479+la+(fa&(ha^ja)^ja)+((fa>>>6|fa<<26)^(fa>>>11|fa<<21)^(fa>>>25|fa<<7))|0;la=L+ma|0;ma=((na>>>2|na<<30)^(na>>>13|na<<19)^(na>>>22|na<<10))+((na|aa)&ca|na&aa)+L|0;L=((R>>>18|R<<14)^R>>>3^(R>>>7|R<<25))+O+q+((F>>>19|F<<13)^F>>>10^(F>>>17|F<<15))|0;O=L+ -694614492+ja+(la&(fa^ha)^ha)+((la>>>6|la<<26)^(la>>>11|la<<21)^(la>>>25|la<<7))|0;ja=O+ca|0;ca=((ma>>>2|ma<<30)^(ma>>>13|ma<<19)^(ma>>>22|ma<<10))+((ma|na)&aa|ma&na)+O|0;O=((V>>>18|V<<14)^V>>>3^(V>>>7|V<<25))+R+t+((I>>>19|I<<13)^I>>>10^(I>>>17|I<<15))|0;R=O+ -200395387+ha+(ja&(la^fa)^fa)+((ja>>>6|ja<<26)^(ja>>>11|ja<<21)^(ja>>>25|ja<<7))|0;ha=R+aa|0;aa=((ca>>>2|ca<<30)^(ca>>>13|ca<<19)^(ca>>>22|ca<<10))+((ca|ma)&na|ca&ma)+R|0;R=((b>>>18|b<<14)^b>>>3^(b>>>7|b<<25))+V+w+((L>>>19|L<<13)^L>>>10^(L>>>17|L<<15))|0;V=R+275423344+fa+(ha&(ja^la)^la)+((ha>>>6|ha<<26)^(ha>>>11|ha<<21)^(ha>>>25|ha<<7))|0;fa=V+na|0;na=((aa>>>2|aa<<30)^(aa>>>13|aa<<19)^(aa>>>22|aa<<10))+((aa|ca)&ma|aa&ca)+V|0;V=((a>>>18|a<<14)^a>>>3^(a>>>7|a<<25))+b+z+((O>>>19|O<<13)^O>>>10^(O>>>17|O<<15))|0;b=V+430227734+la+(fa&(ha^ja)^ja)+((fa>>>6|fa<<26)^(fa>>>11|fa<<21)^(fa>>>25|fa<<7))|0;la=b+ma|0;ma=((na>>>2|na<<30)^(na>>>13|na<<19)^(na>>>22|na<<10))+((na|aa)&ca|na&aa)+b|0;b=((T>>>18|T<<14)^T>>>3^(T>>>7|T<<25))+a+C+((R>>>19|R<<13)^R>>>10^(R>>>17|R<<15))|0;a=b+506948616+ja+(la&(fa^ha)^ha)+((la>>>6|la<<26)^(la>>>11|la<<21)^(la>>>25|la<<7))|0;ja=a+ca|0;ca=((ma>>>2|ma<<30)^(ma>>>13|ma<<19)^(ma>>>22|ma<<10))+((ma|na)&aa|ma&na)+a|0;a=((X>>>18|X<<14)^X>>>3^(X>>>7|X<<25))+T+F+((V>>>19|V<<13)^V>>>10^(V>>>17|V<<15))|0;T=a+659060556+ha+(ja&(la^fa)^fa)+((ja>>>6|ja<<26)^(ja>>>11|ja<<21)^(ja>>>25|ja<<7))|0;ha=T+aa|0;aa=((ca>>>2|ca<<30)^(ca>>>13|ca<<19)^(ca>>>22|ca<<10))+((ca|ma)&na|ca&ma)+T|0;T=((k>>>18|k<<14)^k>>>3^(k>>>7|k<<25))+X+I+((b>>>19|b<<13)^b>>>10^(b>>>17|b<<15))|0;X=T+883997877+fa+(ha&(ja^la)^la)+((ha>>>6|ha<<26)^(ha>>>11|ha<<21)^(ha>>>25|ha<<7))|0;fa=X+na|0;na=((aa>>>2|aa<<30)^(aa>>>13|aa<<19)^(aa>>>22|aa<<10))+((aa|ca)&ma|aa&ca)+X|0;X=((n>>>18|n<<14)^n>>>3^(n>>>7|n<<25))+k+L+((a>>>19|a<<13)^a>>>10^(a>>>17|a<<15))|0;k=X+958139571+la+(fa&(ha^ja)^ja)+((fa>>>6|fa<<26)^(fa>>>11|fa<<21)^(fa>>>25|fa<<7))|0;la=k+ma|0;ma=((na>>>2|na<<30)^(na>>>13|na<<19)^(na>>>22|na<<10))+((na|aa)&ca|na&aa)+k|0;k=((q>>>18|q<<14)^q>>>3^(q>>>7|q<<25))+n+O+((T>>>19|T<<13)^T>>>10^(T>>>17|T<<15))|0;n=k+1322822218+ja+(la&(fa^ha)^ha)+((la>>>6|la<<26)^(la>>>11|la<<21)^(la>>>25|la<<7))|0;ja=n+ca|0;ca=((ma>>>2|ma<<30)^(ma>>>13|ma<<19)^(ma>>>22|ma<<10))+((ma|na)&aa|ma&na)+n|0;n=((t>>>18|t<<14)^t>>>3^(t>>>7|t<<25))+q+R+((X>>>19|X<<13)^X>>>10^(X>>>17|X<<15))|0;q=n+1537002063+ha+(ja&(la^fa)^fa)+((ja>>>6|ja<<26)^(ja>>>11|ja<<21)^(ja>>>25|ja<<7))|0;ha=q+aa|0;aa=((ca>>>2|ca<<30)^(ca>>>13|ca<<19)^(ca>>>22|ca<<10))+((ca|ma)&na|ca&ma)+q|0;q=((w>>>18|w<<14)^w>>>3^(w>>>7|w<<25))+t+V+((k>>>19|k<<13)^k>>>10^(k>>>17|k<<15))|0;t=q+1747873779+fa+(ha&(ja^la)^la)+((ha>>>6|ha<<26)^(ha>>>11|ha<<21)^(ha>>>25|ha<<7))|0;fa=t+na|0;na=((aa>>>2|aa<<30)^(aa>>>13|aa<<19)^(aa>>>22|aa<<10))+((aa|ca)&ma|aa&ca)+t|0;t=((z>>>18|z<<14)^z>>>3^(z>>>7|z<<25))+w+b+((n>>>19|n<<13)^n>>>10^(n>>>17|n<<15))|0;b=t+1955562222+la+(fa&(ha^ja)^ja)+((fa>>>6|fa<<26)^(fa>>>11|fa<<21)^(fa>>>25|fa<<7))|0;la=b+ma|0;ma=((na>>>2|na<<30)^(na>>>13|na<<19)^(na>>>22|na<<10))+((na|aa)&ca|na&aa)+b|0;b=((C>>>18|C<<14)^C>>>3^(C>>>7|C<<25))+z+a+((q>>>19|q<<13)^q>>>10^(q>>>17|q<<15))|0;a=b+2024104815+ja+(la&(fa^ha)^ha)+((la>>>6|la<<26)^(la>>>11|la<<21)^(la>>>25|la<<7))|0;ja=a+ca|0;ca=((ma>>>2|ma<<30)^(ma>>>13|ma<<19)^(ma>>>22|ma<<10))+((ma|na)&aa|ma&na)+a|0;a=((F>>>18|F<<14)^F>>>3^(F>>>7|F<<25))+C+T+((t>>>19|t<<13)^t>>>10^(t>>>17|t<<15))|0;T=a+ -2067236844+ha+(ja&(la^fa)^fa)+((ja>>>6|ja<<26)^(ja>>>11|ja<<21)^(ja>>>25|ja<<7))|0;ha=T+aa|0;aa=((ca>>>2|ca<<30)^(ca>>>13|ca<<19)^(ca>>>22|ca<<10))+((ca|ma)&na|ca&ma)+T|0;T=((I>>>18|I<<14)^I>>>3^(I>>>7|I<<25))+F+X+((b>>>19|b<<13)^b>>>10^(b>>>17|b<<15))|0;b=T+ -1933114872+fa+(ha&(ja^la)^la)+((ha>>>6|ha<<26)^(ha>>>11|ha<<21)^(ha>>>25|ha<<7))|0;fa=b+na|0;na=((aa>>>2|aa<<30)^(aa>>>13|aa<<19)^(aa>>>22|aa<<10))+((aa|ca)&ma|aa&ca)+b|0;b=((L>>>18|L<<14)^L>>>3^(L>>>7|L<<25))+I+k+((a>>>19|a<<13)^a>>>10^(a>>>17|a<<15))|0;a=b+ -1866530822+la+(fa&(ha^ja)^ja)+((fa>>>6|fa<<26)^(fa>>>11|fa<<21)^(fa>>>25|fa<<7))|0;la=a+ma|0;ma=((na>>>2|na<<30)^(na>>>13|na<<19)^(na>>>22|na<<10))+((na|aa)&ca|na&aa)+a|0;a=((O>>>18|O<<14)^O>>>3^(O>>>7|O<<25))+L+n+((T>>>19|T<<13)^T>>>10^(T>>>17|T<<15))|0;T=a+ -1538233109+ja+(la&(fa^ha)^ha)+((la>>>6|la<<26)^(la>>>11|la<<21)^(la>>>25|la<<7))|0;ja=T+ca|0;ca=((ma>>>2|ma<<30)^(ma>>>13|ma<<19)^(ma>>>22|ma<<10))+((ma|na)&aa|ma&na)+T|0;T=O+ -1090935817+((R>>>18|R<<14)^R>>>3^(R>>>7|R<<25))+q+((b>>>19|b<<13)^b>>>10^(b>>>17|b<<15))+ha+(ja&(la^fa)^fa)+((ja>>>6|ja<<26)^(ja>>>11|ja<<21)^(ja>>>25|ja<<7))|0;ha=T+aa|0;aa=((ca>>>2|ca<<30)^(ca>>>13|ca<<19)^(ca>>>22|ca<<10))+((ca|ma)&na|ca&ma)+T|0;T=R+ -965641998+((V>>>18|V<<14)^V>>>3^(V>>>7|V<<25))+t+((a>>>19|a<<13)^a>>>10^(a>>>17|a<<15))+fa+(ha&(ja^la)^la)+((ha>>>6|ha<<26)^(ha>>>11|ha<<21)^(ha>>>25|ha<<7))|0;c[Z>>2]=((aa|ca)&ma|aa&ca)+_+((aa>>>2|aa<<30)^(aa>>>13|aa<<19)^(aa>>>22|aa<<10))+T;c[$>>2]=aa+(c[$>>2]|0);c[ba>>2]=ca+(c[ba>>2]|0);c[da>>2]=ma+(c[da>>2]|0);c[ea>>2]=na+(c[ea>>2]|0)+T;c[ga>>2]=ha+(c[ga>>2]|0);c[ia>>2]=ja+(c[ia>>2]|0);c[ka>>2]=la+(c[ka>>2]|0);return}function r1a(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e;g=c[b>>2]|0;h=c[b+4>>2]|0;a[f>>0]=h>>>21;a[f+1>>0]=h>>>13;a[f+2>>0]=h>>>5;a[f+3>>0]=h<<3|g>>>29;a[f+4>>0]=g>>>21;a[f+5>>0]=g>>>13;a[f+6>>0]=g>>>5;a[f+7>>0]=g<<3;h=g&63;p1a(b,1302968,(h>>>0<56?56:120)-h|0);p1a(b,f,8);f=b+8|0;a[d>>0]=(c[f>>2]|0)>>>24;a[d+1>>0]=(c[f>>2]|0)>>>16;a[d+2>>0]=(c[f>>2]|0)>>>8;a[d+3>>0]=c[f>>2];f=b+12|0;a[d+4>>0]=(c[f>>2]|0)>>>24;a[d+5>>0]=(c[f>>2]|0)>>>16;a[d+6>>0]=(c[f>>2]|0)>>>8;a[d+7>>0]=c[f>>2];f=b+16|0;a[d+8>>0]=(c[f>>2]|0)>>>24;a[d+9>>0]=(c[f>>2]|0)>>>16;a[d+10>>0]=(c[f>>2]|0)>>>8;a[d+11>>0]=c[f>>2];f=b+20|0;a[d+12>>0]=(c[f>>2]|0)>>>24;a[d+13>>0]=(c[f>>2]|0)>>>16;a[d+14>>0]=(c[f>>2]|0)>>>8;a[d+15>>0]=c[f>>2];f=b+24|0;a[d+16>>0]=(c[f>>2]|0)>>>24;a[d+17>>0]=(c[f>>2]|0)>>>16;a[d+18>>0]=(c[f>>2]|0)>>>8;a[d+19>>0]=c[f>>2];f=b+28|0;a[d+20>>0]=(c[f>>2]|0)>>>24;a[d+21>>0]=(c[f>>2]|0)>>>16;a[d+22>>0]=(c[f>>2]|0)>>>8;a[d+23>>0]=c[f>>2];f=b+32|0;a[d+24>>0]=(c[f>>2]|0)>>>24;a[d+25>>0]=(c[f>>2]|0)>>>16;a[d+26>>0]=(c[f>>2]|0)>>>8;a[d+27>>0]=c[f>>2];f=b+36|0;a[d+28>>0]=(c[f>>2]|0)>>>24;a[d+29>>0]=(c[f>>2]|0)>>>16;a[d+30>>0]=(c[f>>2]|0)>>>8;a[d+31>>0]=c[f>>2];i=e;return}function s1a(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;i=i+112|0;e=d;o1a(e);p1a(e,a,b);r1a(e,c);i=d;return}function t1a(b){b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=i;if((b|0)==0){_a(1303032,1303048,394,1303088)}d=Y2a(b|0)|0;e=(d|0)>16?16:d;if((e|0)>0){f=0;g=0;h=0}else{j=0;k=0;G=j;i=c;return k|0}a:while(1){d=(h|0)==0;l=g3a(f|0,g|0,4)|0;m=d?f:l;l=d?g:G;d=a[b+h>>0]|0;n=d&255;do{if((d+ -48<<24>>24&255)<10){o=n+208|0}else{if((d+ -97<<24>>24&255)<6){o=n+169|0;break}if(!((d+ -65<<24>>24&255)<6)){p=10;break a}o=n+201|0}}while(0);n=o&255|m;h=h+1|0;if((h|0)>=(e|0)){j=l;k=n;p=12;break}else{f=n;g=l}}if((p|0)==10){_a(1303104,1303048,409,1303088)}else if((p|0)==12){G=j;i=c;return k|0}return 0}function u1a(a){a=a|0;var b=0,d=0,e=0;b=i;if((a|0)==0){i=b;return}f3a(a|0,0,208)|0;d=t1a(1303112)|0;e=a+16|0;c[e>>2]=d;c[e+4>>2]=G;e=t1a(1303136)|0;d=a+24|0;c[d>>2]=e;c[d+4>>2]=G;d=t1a(1303160)|0;e=a+32|0;c[e>>2]=d;c[e+4>>2]=G;e=t1a(1303184)|0;d=a+40|0;c[d>>2]=e;c[d+4>>2]=G;d=t1a(1303208)|0;e=a+48|0;c[e>>2]=d;c[e+4>>2]=G;e=t1a(1303232)|0;d=a+56|0;c[d>>2]=e;c[d+4>>2]=G;d=t1a(1303256)|0;e=a+64|0;c[e>>2]=d;c[e+4>>2]=G;e=t1a(1303280)|0;d=a+72|0;c[d>>2]=e;c[d+4>>2]=G;i=b;return}function v1a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;if((d|0)==0){i=e;return}f=a;g=c[f>>2]|0;h=g&127;j=128-h|0;k=W2a(g|0,c[f+4>>2]|0,d|0,0)|0;f=G;g=a;c[g>>2]=k;c[g+4>>2]=f;if(f>>>0<0|(f|0)==0&k>>>0<d>>>0){k=a+8|0;f=k;g=W2a(c[f>>2]|0,c[f+4>>2]|0,1,0)|0;f=k;c[f>>2]=g;c[f+4>>2]=G}if((h|0)==0|j>>>0>d>>>0){l=b;m=d;n=h}else{c3a(a+(h+80)|0,b|0,j|0)|0;w1a(a,a+80|0);l=b+j|0;m=d-j|0;n=0}if(m>>>0>127){j=m;d=l;while(1){w1a(a,d);b=j+ -128|0;h=d+128|0;if(b>>>0>127){j=b;d=h}else{o=h;p=b;break}}}else{o=l;p=m}if((p|0)==0){i=e;return}c3a(a+(n+80)|0,o|0,p|0)|0;i=e;return}function w1a(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0;e=i;i=i+640|0;f=e;g=g3a(d[b>>0]|0|0,0,56)|0;h=G;j=g3a(d[b+1>>0]|0|0,0,48)|0;k=G|h;h=g3a(d[b+2>>0]|0|0,0,40)|0;l=k|G|(d[b+3>>0]|0);k=g3a(d[b+4>>0]|0|0,0,24)|0;m=l|G;l=g3a(d[b+5>>0]|0|0,0,16)|0;n=m|G;m=g3a(d[b+6>>0]|0|0,0,8)|0;o=f;c[o>>2]=j|g|h|k|l|m|(d[b+7>>0]|0);c[o+4>>2]=n|G;n=g3a(d[b+8>>0]|0|0,0,56)|0;o=G;m=g3a(d[b+9>>0]|0|0,0,48)|0;l=G|o;o=g3a(d[b+10>>0]|0|0,0,40)|0;k=l|G|(d[b+11>>0]|0);l=g3a(d[b+12>>0]|0|0,0,24)|0;h=k|G;k=g3a(d[b+13>>0]|0|0,0,16)|0;g=h|G;h=g3a(d[b+14>>0]|0|0,0,8)|0;j=f+8|0;c[j>>2]=m|n|o|l|k|h|(d[b+15>>0]|0);c[j+4>>2]=g|G;g=g3a(d[b+16>>0]|0|0,0,56)|0;j=G;h=g3a(d[b+17>>0]|0|0,0,48)|0;k=G|j;j=g3a(d[b+18>>0]|0|0,0,40)|0;l=k|G|(d[b+19>>0]|0);k=g3a(d[b+20>>0]|0|0,0,24)|0;o=l|G;l=g3a(d[b+21>>0]|0|0,0,16)|0;n=o|G;o=g3a(d[b+22>>0]|0|0,0,8)|0;m=f+16|0;c[m>>2]=h|g|j|k|l|o|(d[b+23>>0]|0);c[m+4>>2]=n|G;n=g3a(d[b+24>>0]|0|0,0,56)|0;m=G;o=g3a(d[b+25>>0]|0|0,0,48)|0;l=G|m;m=g3a(d[b+26>>0]|0|0,0,40)|0;k=l|G|(d[b+27>>0]|0);l=g3a(d[b+28>>0]|0|0,0,24)|0;j=k|G;k=g3a(d[b+29>>0]|0|0,0,16)|0;g=j|G;j=g3a(d[b+30>>0]|0|0,0,8)|0;h=f+24|0;c[h>>2]=o|n|m|l|k|j|(d[b+31>>0]|0);c[h+4>>2]=g|G;g=g3a(d[b+32>>0]|0|0,0,56)|0;h=G;j=g3a(d[b+33>>0]|0|0,0,48)|0;k=G|h;h=g3a(d[b+34>>0]|0|0,0,40)|0;l=k|G|(d[b+35>>0]|0);k=g3a(d[b+36>>0]|0|0,0,24)|0;m=l|G;l=g3a(d[b+37>>0]|0|0,0,16)|0;n=m|G;m=g3a(d[b+38>>0]|0|0,0,8)|0;o=f+32|0;c[o>>2]=j|g|h|k|l|m|(d[b+39>>0]|0);c[o+4>>2]=n|G;n=g3a(d[b+40>>0]|0|0,0,56)|0;o=G;m=g3a(d[b+41>>0]|0|0,0,48)|0;l=G|o;o=g3a(d[b+42>>0]|0|0,0,40)|0;k=l|G|(d[b+43>>0]|0);l=g3a(d[b+44>>0]|0|0,0,24)|0;h=k|G;k=g3a(d[b+45>>0]|0|0,0,16)|0;g=h|G;h=g3a(d[b+46>>0]|0|0,0,8)|0;j=f+40|0;c[j>>2]=m|n|o|l|k|h|(d[b+47>>0]|0);c[j+4>>2]=g|G;g=g3a(d[b+48>>0]|0|0,0,56)|0;j=G;h=g3a(d[b+49>>0]|0|0,0,48)|0;k=G|j;j=g3a(d[b+50>>0]|0|0,0,40)|0;l=k|G|(d[b+51>>0]|0);k=g3a(d[b+52>>0]|0|0,0,24)|0;o=l|G;l=g3a(d[b+53>>0]|0|0,0,16)|0;n=o|G;o=g3a(d[b+54>>0]|0|0,0,8)|0;m=f+48|0;c[m>>2]=h|g|j|k|l|o|(d[b+55>>0]|0);c[m+4>>2]=n|G;n=g3a(d[b+56>>0]|0|0,0,56)|0;m=G;o=g3a(d[b+57>>0]|0|0,0,48)|0;l=G|m;m=g3a(d[b+58>>0]|0|0,0,40)|0;k=l|G|(d[b+59>>0]|0);l=g3a(d[b+60>>0]|0|0,0,24)|0;j=k|G;k=g3a(d[b+61>>0]|0|0,0,16)|0;g=j|G;j=g3a(d[b+62>>0]|0|0,0,8)|0;h=f+56|0;c[h>>2]=o|n|m|l|k|j|(d[b+63>>0]|0);c[h+4>>2]=g|G;g=g3a(d[b+64>>0]|0|0,0,56)|0;h=G;j=g3a(d[b+65>>0]|0|0,0,48)|0;k=G|h;h=g3a(d[b+66>>0]|0|0,0,40)|0;l=k|G|(d[b+67>>0]|0);k=g3a(d[b+68>>0]|0|0,0,24)|0;m=l|G;l=g3a(d[b+69>>0]|0|0,0,16)|0;n=m|G;m=g3a(d[b+70>>0]|0|0,0,8)|0;o=f+64|0;c[o>>2]=j|g|h|k|l|m|(d[b+71>>0]|0);c[o+4>>2]=n|G;n=g3a(d[b+72>>0]|0|0,0,56)|0;o=G;m=g3a(d[b+73>>0]|0|0,0,48)|0;l=G|o;o=g3a(d[b+74>>0]|0|0,0,40)|0;k=l|G|(d[b+75>>0]|0);l=g3a(d[b+76>>0]|0|0,0,24)|0;h=k|G;k=g3a(d[b+77>>0]|0|0,0,16)|0;g=h|G;h=g3a(d[b+78>>0]|0|0,0,8)|0;j=f+72|0;c[j>>2]=m|n|o|l|k|h|(d[b+79>>0]|0);c[j+4>>2]=g|G;g=g3a(d[b+80>>0]|0|0,0,56)|0;j=G;h=g3a(d[b+81>>0]|0|0,0,48)|0;k=G|j;j=g3a(d[b+82>>0]|0|0,0,40)|0;l=k|G|(d[b+83>>0]|0);k=g3a(d[b+84>>0]|0|0,0,24)|0;o=l|G;l=g3a(d[b+85>>0]|0|0,0,16)|0;n=o|G;o=g3a(d[b+86>>0]|0|0,0,8)|0;m=f+80|0;c[m>>2]=h|g|j|k|l|o|(d[b+87>>0]|0);c[m+4>>2]=n|G;n=g3a(d[b+88>>0]|0|0,0,56)|0;m=G;o=g3a(d[b+89>>0]|0|0,0,48)|0;l=G|m;m=g3a(d[b+90>>0]|0|0,0,40)|0;k=l|G|(d[b+91>>0]|0);l=g3a(d[b+92>>0]|0|0,0,24)|0;j=k|G;k=g3a(d[b+93>>0]|0|0,0,16)|0;g=j|G;j=g3a(d[b+94>>0]|0|0,0,8)|0;h=f+88|0;c[h>>2]=o|n|m|l|k|j|(d[b+95>>0]|0);c[h+4>>2]=g|G;g=g3a(d[b+96>>0]|0|0,0,56)|0;h=G;j=g3a(d[b+97>>0]|0|0,0,48)|0;k=G|h;h=g3a(d[b+98>>0]|0|0,0,40)|0;l=k|G|(d[b+99>>0]|0);k=g3a(d[b+100>>0]|0|0,0,24)|0;m=l|G;l=g3a(d[b+101>>0]|0|0,0,16)|0;n=m|G;m=g3a(d[b+102>>0]|0|0,0,8)|0;o=f+96|0;c[o>>2]=j|g|h|k|l|m|(d[b+103>>0]|0);c[o+4>>2]=n|G;n=g3a(d[b+104>>0]|0|0,0,56)|0;o=G;m=g3a(d[b+105>>0]|0|0,0,48)|0;l=G|o;o=g3a(d[b+106>>0]|0|0,0,40)|0;k=l|G|(d[b+107>>0]|0);l=g3a(d[b+108>>0]|0|0,0,24)|0;h=k|G;k=g3a(d[b+109>>0]|0|0,0,16)|0;g=h|G;h=g3a(d[b+110>>0]|0|0,0,8)|0;j=f+104|0;c[j>>2]=m|n|o|l|k|h|(d[b+111>>0]|0);c[j+4>>2]=g|G;g=g3a(d[b+112>>0]|0|0,0,56)|0;j=G;h=g3a(d[b+113>>0]|0|0,0,48)|0;k=G|j;j=g3a(d[b+114>>0]|0|0,0,40)|0;l=k|G|(d[b+115>>0]|0);k=g3a(d[b+116>>0]|0|0,0,24)|0;o=l|G;l=g3a(d[b+117>>0]|0|0,0,16)|0;n=o|G;o=g3a(d[b+118>>0]|0|0,0,8)|0;m=f+112|0;c[m>>2]=h|g|j|k|l|o|(d[b+119>>0]|0);c[m+4>>2]=n|G;n=g3a(d[b+120>>0]|0|0,0,56)|0;m=G;o=g3a(d[b+121>>0]|0|0,0,48)|0;l=G|m;m=g3a(d[b+122>>0]|0|0,0,40)|0;k=l|G|(d[b+123>>0]|0);l=g3a(d[b+124>>0]|0|0,0,24)|0;j=k|G;k=g3a(d[b+125>>0]|0|0,0,16)|0;g=j|G;j=g3a(d[b+126>>0]|0|0,0,8)|0;h=f+120|0;c[h>>2]=o|n|m|l|k|j|(d[b+127>>0]|0);c[h+4>>2]=g|G;g=a+16|0;h=g;b=a+24|0;j=b;k=a+32|0;l=k;m=a+40|0;n=m;o=a+48|0;p=o;q=a+56|0;r=q;s=a+64|0;t=s;u=a+72|0;a=u;v=c[p>>2]|0;w=c[p+4>>2]|0;p=c[a>>2]|0;x=c[a+4>>2]|0;a=c[r>>2]|0;y=c[t>>2]|0;z=c[r+4>>2]|0;r=c[t+4>>2]|0;t=c[h>>2]|0;A=c[h+4>>2]|0;h=c[j>>2]|0;B=c[j+4>>2]|0;j=c[l>>2]|0;C=c[l+4>>2]|0;l=c[n>>2]|0;D=c[n+4>>2]|0;n=0;do{E=n<<3;if((n|0)<2){F=f+(E<<3)|0;H=f+((E|1)<<3)|0;I=f+((E|2)<<3)|0;J=f+((E|3)<<3)|0;K=f+((E|4)<<3)|0;L=f+((E|5)<<3)|0;M=f+((E|6)<<3)|0;N=f+((E|7)<<3)|0;O=c[F>>2]|0;P=c[F+4>>2]|0;Q=c[H>>2]|0;R=c[H+4>>2]|0;S=c[I>>2]|0;T=c[I+4>>2]|0;U=c[J>>2]|0;V=c[J+4>>2]|0;W=c[K>>2]|0;X=c[K+4>>2]|0;Y=c[L>>2]|0;Z=c[L+4>>2]|0;_=c[M>>2]|0;$=c[M+4>>2]|0;aa=c[N>>2]|0;ba=c[N+4>>2]|0}else{N=f+(E+ -2<<3)|0;M=c[N>>2]|0;L=c[N+4>>2]|0;N=a3a(M|0,L|0,19)|0;K=G;J=g3a(M|0,L|0,45)|0;I=K|G;K=a3a(M|0,L|0,61)|0;H=G;F=g3a(M|0,L|0,3)|0;ca=H|G;H=a3a(M|0,L|0,6)|0;L=ca^G^I;I=f+(E+ -7<<3)|0;ca=c[I>>2]|0;M=c[I+4>>2]|0;I=f+(E+ -15<<3)|0;da=c[I>>2]|0;ea=c[I+4>>2]|0;I=a3a(da|0,ea|0,1)|0;fa=G;ga=g3a(da|0,ea|0,63)|0;ha=fa|G;fa=a3a(da|0,ea|0,8)|0;ia=G;ja=g3a(da|0,ea|0,56)|0;ka=ia|G;ia=a3a(da|0,ea|0,7)|0;la=ka^G^ha;ha=f+(E+ -16<<3)|0;ka=W2a(c[ha>>2]|0,c[ha+4>>2]|0,ca|0,M|0)|0;M=W2a(ka|0,G|0,(K|F)^H^(N|J)|0,L|0)|0;L=W2a(M|0,G|0,(fa|ja)^ia^(I|ga)|0,la|0)|0;la=G;ga=f+(E<<3)|0;I=ga;c[I>>2]=L;c[I+4>>2]=la;I=E|1;ia=f+(I+ -2<<3)|0;ja=c[ia>>2]|0;fa=c[ia+4>>2]|0;ia=a3a(ja|0,fa|0,19)|0;M=G;J=g3a(ja|0,fa|0,45)|0;N=M|G;M=a3a(ja|0,fa|0,61)|0;H=G;F=g3a(ja|0,fa|0,3)|0;K=H|G;H=a3a(ja|0,fa|0,6)|0;fa=K^G^N;N=f+(I+ -7<<3)|0;K=c[N>>2]|0;ja=c[N+4>>2]|0;N=f+(I+ -15<<3)|0;ka=c[N>>2]|0;ca=c[N+4>>2]|0;N=a3a(ka|0,ca|0,1)|0;ha=G;ma=g3a(ka|0,ca|0,63)|0;na=ha|G;ha=a3a(ka|0,ca|0,8)|0;oa=G;pa=g3a(ka|0,ca|0,56)|0;qa=oa|G;oa=a3a(ka|0,ca|0,7)|0;ra=qa^G^na;na=W2a(da|0,ea|0,K|0,ja|0)|0;ja=W2a(na|0,G|0,(M|F)^H^(ia|J)|0,fa|0)|0;fa=W2a(ja|0,G|0,(ha|pa)^oa^(N|ma)|0,ra|0)|0;ra=G;ma=f+(I<<3)|0;c[ma>>2]=fa;c[ma+4>>2]=ra;ma=E|2;I=a3a(L|0,la|0,19)|0;N=G;oa=g3a(L|0,la|0,45)|0;pa=N|G;N=a3a(L|0,la|0,61)|0;ha=G;ja=g3a(L|0,la|0,3)|0;J=ha|G;ha=a3a(L|0,la|0,6)|0;ia=J^G^pa;pa=f+(ma+ -7<<3)|0;J=c[pa>>2]|0;H=c[pa+4>>2]|0;pa=f+(ma+ -15<<3)|0;F=c[pa>>2]|0;M=c[pa+4>>2]|0;pa=a3a(F|0,M|0,1)|0;na=G;K=g3a(F|0,M|0,63)|0;ea=na|G;na=a3a(F|0,M|0,8)|0;da=G;qa=g3a(F|0,M|0,56)|0;sa=da|G;da=a3a(F|0,M|0,7)|0;ta=sa^G^ea;ea=W2a(ka|0,ca|0,J|0,H|0)|0;H=W2a(ea|0,G|0,(N|ja)^ha^(I|oa)|0,ia|0)|0;ia=W2a(H|0,G|0,(na|qa)^da^(pa|K)|0,ta|0)|0;ta=G;K=f+(ma<<3)|0;c[K>>2]=ia;c[K+4>>2]=ta;K=E|3;ma=a3a(fa|0,ra|0,19)|0;pa=G;da=g3a(fa|0,ra|0,45)|0;qa=pa|G;pa=a3a(fa|0,ra|0,61)|0;na=G;H=g3a(fa|0,ra|0,3)|0;oa=na|G;na=a3a(fa|0,ra|0,6)|0;I=oa^G^qa;qa=f+(K+ -7<<3)|0;oa=c[qa>>2]|0;ha=c[qa+4>>2]|0;qa=f+(K+ -15<<3)|0;ja=c[qa>>2]|0;N=c[qa+4>>2]|0;qa=a3a(ja|0,N|0,1)|0;ea=G;J=g3a(ja|0,N|0,63)|0;ca=ea|G;ea=a3a(ja|0,N|0,8)|0;ka=G;sa=g3a(ja|0,N|0,56)|0;ua=ka|G;ka=a3a(ja|0,N|0,7)|0;va=ua^G^ca;ca=W2a(F|0,M|0,oa|0,ha|0)|0;ha=W2a(ca|0,G|0,(pa|H)^na^(ma|da)|0,I|0)|0;I=W2a(ha|0,G|0,(ea|sa)^ka^(qa|J)|0,va|0)|0;va=G;J=f+(K<<3)|0;c[J>>2]=I;c[J+4>>2]=va;J=E|4;K=a3a(ia|0,ta|0,19)|0;qa=G;ka=g3a(ia|0,ta|0,45)|0;sa=qa|G;qa=a3a(ia|0,ta|0,61)|0;ea=G;ha=g3a(ia|0,ta|0,3)|0;da=ea|G;ea=a3a(ia|0,ta|0,6)|0;ma=da^G^sa;sa=f+(J+ -7<<3)|0;da=c[sa>>2]|0;na=c[sa+4>>2]|0;sa=f+(J+ -15<<3)|0;H=c[sa>>2]|0;pa=c[sa+4>>2]|0;sa=a3a(H|0,pa|0,1)|0;ca=G;oa=g3a(H|0,pa|0,63)|0;M=ca|G;ca=a3a(H|0,pa|0,8)|0;F=G;ua=g3a(H|0,pa|0,56)|0;wa=F|G;F=a3a(H|0,pa|0,7)|0;xa=wa^G^M;M=W2a(ja|0,N|0,da|0,na|0)|0;na=W2a(M|0,G|0,(qa|ha)^ea^(K|ka)|0,ma|0)|0;ma=W2a(na|0,G|0,(ca|ua)^F^(sa|oa)|0,xa|0)|0;xa=G;oa=f+(J<<3)|0;c[oa>>2]=ma;c[oa+4>>2]=xa;oa=E|5;J=a3a(I|0,va|0,19)|0;sa=G;F=g3a(I|0,va|0,45)|0;ua=sa|G;sa=a3a(I|0,va|0,61)|0;ca=G;na=g3a(I|0,va|0,3)|0;ka=ca|G;ca=a3a(I|0,va|0,6)|0;K=ka^G^ua;ua=f+(oa+ -7<<3)|0;ka=c[ua>>2]|0;ea=c[ua+4>>2]|0;ua=f+(oa+ -15<<3)|0;ha=c[ua>>2]|0;qa=c[ua+4>>2]|0;ua=a3a(ha|0,qa|0,1)|0;M=G;da=g3a(ha|0,qa|0,63)|0;N=M|G;M=a3a(ha|0,qa|0,8)|0;ja=G;wa=g3a(ha|0,qa|0,56)|0;ya=ja|G;ja=a3a(ha|0,qa|0,7)|0;za=ya^G^N;N=W2a(H|0,pa|0,ka|0,ea|0)|0;ea=W2a(N|0,G|0,(sa|na)^ca^(J|F)|0,K|0)|0;K=W2a(ea|0,G|0,(M|wa)^ja^(ua|da)|0,za|0)|0;za=G;da=f+(oa<<3)|0;c[da>>2]=K;c[da+4>>2]=za;da=E|6;oa=a3a(ma|0,xa|0,19)|0;ua=G;ja=g3a(ma|0,xa|0,45)|0;wa=ua|G;ua=a3a(ma|0,xa|0,61)|0;M=G;ea=g3a(ma|0,xa|0,3)|0;F=M|G;M=a3a(ma|0,xa|0,6)|0;J=F^G^wa;wa=f+(da+ -7<<3)|0;F=c[wa>>2]|0;ca=c[wa+4>>2]|0;wa=f+(da+ -15<<3)|0;na=c[wa>>2]|0;sa=c[wa+4>>2]|0;wa=a3a(na|0,sa|0,1)|0;N=G;ka=g3a(na|0,sa|0,63)|0;pa=N|G;N=a3a(na|0,sa|0,8)|0;H=G;ya=g3a(na|0,sa|0,56)|0;Aa=H|G;H=a3a(na|0,sa|0,7)|0;Ba=Aa^G^pa;pa=W2a(ha|0,qa|0,F|0,ca|0)|0;ca=W2a(pa|0,G|0,(ua|ea)^M^(oa|ja)|0,J|0)|0;J=W2a(ca|0,G|0,(N|ya)^H^(wa|ka)|0,Ba|0)|0;Ba=G;ka=f+(da<<3)|0;c[ka>>2]=J;c[ka+4>>2]=Ba;ka=E|7;da=a3a(K|0,za|0,19)|0;wa=G;H=g3a(K|0,za|0,45)|0;ya=wa|G;wa=a3a(K|0,za|0,61)|0;N=G;ca=g3a(K|0,za|0,3)|0;ja=N|G;N=a3a(K|0,za|0,6)|0;oa=ja^G^ya;ya=ga;ga=c[ya>>2]|0;ja=c[ya+4>>2]|0;ya=f+(ka+ -15<<3)|0;M=c[ya>>2]|0;ea=c[ya+4>>2]|0;ya=a3a(M|0,ea|0,1)|0;ua=G;pa=g3a(M|0,ea|0,63)|0;F=ua|G;ua=a3a(M|0,ea|0,8)|0;qa=G;ha=g3a(M|0,ea|0,56)|0;Aa=qa|G;qa=a3a(M|0,ea|0,7)|0;ea=Aa^G^F;F=W2a(na|0,sa|0,ga|0,ja|0)|0;ja=W2a(F|0,G|0,(wa|ca)^N^(da|H)|0,oa|0)|0;oa=W2a(ja|0,G|0,(ua|ha)^qa^(ya|pa)|0,ea|0)|0;ea=G;pa=f+(ka<<3)|0;c[pa>>2]=oa;c[pa+4>>2]=ea;O=L;P=la;Q=fa;R=ra;S=ia;T=ta;U=I;V=va;W=ma;X=xa;Y=K;Z=za;_=J;$=Ba;aa=oa;ba=ea}ea=a3a(v|0,w|0,14)|0;oa=G;Ba=g3a(v|0,w|0,50)|0;J=oa|G;oa=a3a(v|0,w|0,18)|0;za=G;K=g3a(v|0,w|0,46)|0;xa=J^(za|G);za=a3a(v|0,w|0,41)|0;J=G;ma=g3a(v|0,w|0,23)|0;va=W2a((ea|Ba)^(oa|K)^(za|ma)|0,xa^(J|G)|0,p|0,x|0)|0;J=W2a(va|0,G|0,(y^a)&v^y|0,(r^z)&w^r|0)|0;va=G;xa=t1a(c[1303624+(E<<2)>>2]|0)|0;ma=G;za=W2a(J|0,va|0,O|0,P|0)|0;va=W2a(za|0,G|0,xa|0,ma|0)|0;ma=G;xa=a3a(t|0,A|0,28)|0;za=G;J=g3a(t|0,A|0,36)|0;K=za|G;za=a3a(t|0,A|0,34)|0;oa=G;Ba=g3a(t|0,A|0,30)|0;ea=K^(oa|G);oa=a3a(t|0,A|0,39)|0;K=G;I=g3a(t|0,A|0,25)|0;ta=W2a((xa|J)^(za|Ba)^(oa|I)|0,ea^(K|G)|0,j&(h|t)|h&t|0,C&(B|A)|B&A|0)|0;K=G;ea=W2a(va|0,ma|0,l|0,D|0)|0;I=G;oa=W2a(ta|0,K|0,va|0,ma|0)|0;ma=G;va=a3a(ea|0,I|0,14)|0;K=G;ta=g3a(ea|0,I|0,50)|0;Ba=K|G;K=a3a(ea|0,I|0,18)|0;za=G;J=g3a(ea|0,I|0,46)|0;xa=Ba^(za|G);za=a3a(ea|0,I|0,41)|0;Ba=G;ia=g3a(ea|0,I|0,23)|0;ra=xa^(Ba|G);Ba=t1a(c[1303624+((E|1)<<2)>>2]|0)|0;xa=G;fa=W2a(Q|0,R|0,y|0,r|0)|0;la=W2a(fa|0,G|0,Ba|0,xa|0)|0;xa=W2a(la|0,G|0,ea&(a^v)^a|0,I&(z^w)^z|0)|0;la=W2a(xa|0,G|0,(va|ta)^(K|J)^(za|ia)|0,ra|0)|0;ra=G;ia=a3a(oa|0,ma|0,28)|0;za=G;J=g3a(oa|0,ma|0,36)|0;K=za|G;za=a3a(oa|0,ma|0,34)|0;ta=G;va=g3a(oa|0,ma|0,30)|0;xa=K^(ta|G);ta=a3a(oa|0,ma|0,39)|0;K=G;Ba=g3a(oa|0,ma|0,25)|0;fa=W2a((ia|J)^(za|va)^(ta|Ba)|0,xa^(K|G)|0,(oa|t)&h|oa&t|0,(ma|A)&B|ma&A|0)|0;K=G;xa=W2a(la|0,ra|0,j|0,C|0)|0;Ba=G;ta=W2a(fa|0,K|0,la|0,ra|0)|0;ra=G;la=a3a(xa|0,Ba|0,14)|0;K=G;fa=g3a(xa|0,Ba|0,50)|0;va=K|G;K=a3a(xa|0,Ba|0,18)|0;za=G;J=g3a(xa|0,Ba|0,46)|0;ia=va^(za|G);za=a3a(xa|0,Ba|0,41)|0;va=G;L=g3a(xa|0,Ba|0,23)|0;pa=ia^(va|G);va=t1a(c[1303624+((E|2)<<2)>>2]|0)|0;ia=G;ka=W2a(S|0,T|0,a|0,z|0)|0;ya=W2a(ka|0,G|0,va|0,ia|0)|0;ia=W2a(ya|0,G|0,xa&(ea^v)^v|0,Ba&(I^w)^w|0)|0;ya=W2a(ia|0,G|0,(la|fa)^(K|J)^(za|L)|0,pa|0)|0;pa=G;L=a3a(ta|0,ra|0,28)|0;za=G;J=g3a(ta|0,ra|0,36)|0;K=za|G;za=a3a(ta|0,ra|0,34)|0;fa=G;la=g3a(ta|0,ra|0,30)|0;ia=K^(fa|G);fa=a3a(ta|0,ra|0,39)|0;K=G;va=g3a(ta|0,ra|0,25)|0;ka=W2a((L|J)^(za|la)^(fa|va)|0,ia^(K|G)|0,(ta|oa)&t|ta&oa|0,(ra|ma)&A|ra&ma|0)|0;K=G;ia=W2a(ya|0,pa|0,h|0,B|0)|0;va=G;fa=W2a(ka|0,K|0,ya|0,pa|0)|0;pa=G;ya=a3a(ia|0,va|0,14)|0;K=G;ka=g3a(ia|0,va|0,50)|0;la=K|G;K=a3a(ia|0,va|0,18)|0;za=G;J=g3a(ia|0,va|0,46)|0;L=la^(za|G);za=a3a(ia|0,va|0,41)|0;la=G;qa=g3a(ia|0,va|0,23)|0;ha=L^(la|G);la=t1a(c[1303624+((E|3)<<2)>>2]|0)|0;L=G;ua=W2a(U|0,V|0,v|0,w|0)|0;ja=W2a(ua|0,G|0,la|0,L|0)|0;L=W2a(ja|0,G|0,ia&(xa^ea)^ea|0,va&(Ba^I)^I|0)|0;ja=W2a(L|0,G|0,(ya|ka)^(K|J)^(za|qa)|0,ha|0)|0;ha=G;qa=a3a(fa|0,pa|0,28)|0;za=G;J=g3a(fa|0,pa|0,36)|0;K=za|G;za=a3a(fa|0,pa|0,34)|0;ka=G;ya=g3a(fa|0,pa|0,30)|0;L=K^(ka|G);ka=a3a(fa|0,pa|0,39)|0;K=G;la=g3a(fa|0,pa|0,25)|0;ua=W2a((qa|J)^(za|ya)^(ka|la)|0,L^(K|G)|0,(fa|ta)&oa|fa&ta|0,(pa|ra)&ma|pa&ra|0)|0;K=G;L=W2a(ja|0,ha|0,t|0,A|0)|0;la=G;ka=W2a(ua|0,K|0,ja|0,ha|0)|0;ha=G;ja=a3a(L|0,la|0,14)|0;K=G;ua=g3a(L|0,la|0,50)|0;ya=K|G;K=a3a(L|0,la|0,18)|0;za=G;J=g3a(L|0,la|0,46)|0;qa=ya^(za|G);za=a3a(L|0,la|0,41)|0;ya=G;H=g3a(L|0,la|0,23)|0;da=qa^(ya|G);ya=t1a(c[1303624+((E|4)<<2)>>2]|0)|0;qa=G;N=W2a(ea|0,I|0,W|0,X|0)|0;I=W2a(N|0,G|0,ya|0,qa|0)|0;qa=W2a(I|0,G|0,L&(ia^xa)^xa|0,la&(va^Ba)^Ba|0)|0;I=W2a(qa|0,G|0,(ja|ua)^(K|J)^(za|H)|0,da|0)|0;da=G;H=a3a(ka|0,ha|0,28)|0;za=G;J=g3a(ka|0,ha|0,36)|0;K=za|G;za=a3a(ka|0,ha|0,34)|0;ua=G;ja=g3a(ka|0,ha|0,30)|0;qa=K^(ua|G);ua=a3a(ka|0,ha|0,39)|0;K=G;ya=g3a(ka|0,ha|0,25)|0;N=W2a((H|J)^(za|ja)^(ua|ya)|0,qa^(K|G)|0,(ka|fa)&ta|ka&fa|0,(ha|pa)&ra|ha&pa|0)|0;K=G;p=W2a(I|0,da|0,oa|0,ma|0)|0;x=G;l=W2a(N|0,K|0,I|0,da|0)|0;D=G;da=a3a(p|0,x|0,14)|0;I=G;K=g3a(p|0,x|0,50)|0;N=I|G;I=a3a(p|0,x|0,18)|0;ma=G;oa=g3a(p|0,x|0,46)|0;qa=N^(ma|G);ma=a3a(p|0,x|0,41)|0;N=G;ya=g3a(p|0,x|0,23)|0;ua=qa^(N|G);N=t1a(c[1303624+((E|5)<<2)>>2]|0)|0;qa=G;ja=W2a(xa|0,Ba|0,Y|0,Z|0)|0;Ba=W2a(ja|0,G|0,N|0,qa|0)|0;qa=W2a(Ba|0,G|0,p&(L^ia)^ia|0,x&(la^va)^va|0)|0;Ba=W2a(qa|0,G|0,(da|K)^(I|oa)^(ma|ya)|0,ua|0)|0;ua=G;ya=a3a(l|0,D|0,28)|0;ma=G;oa=g3a(l|0,D|0,36)|0;I=ma|G;ma=a3a(l|0,D|0,34)|0;K=G;da=g3a(l|0,D|0,30)|0;qa=I^(K|G);K=a3a(l|0,D|0,39)|0;I=G;N=g3a(l|0,D|0,25)|0;ja=W2a((ya|oa)^(ma|da)^(K|N)|0,qa^(I|G)|0,(l|ka)&fa|l&ka|0,(D|ha)&pa|D&ha|0)|0;I=G;y=W2a(Ba|0,ua|0,ta|0,ra|0)|0;r=G;j=W2a(ja|0,I|0,Ba|0,ua|0)|0;C=G;ua=a3a(y|0,r|0,14)|0;Ba=G;I=g3a(y|0,r|0,50)|0;ja=Ba|G;Ba=a3a(y|0,r|0,18)|0;ra=G;ta=g3a(y|0,r|0,46)|0;qa=ja^(ra|G);ra=a3a(y|0,r|0,41)|0;ja=G;N=g3a(y|0,r|0,23)|0;K=qa^(ja|G);ja=t1a(c[1303624+((E|6)<<2)>>2]|0)|0;qa=W2a(ja|0,G|0,_|0,$|0)|0;ja=W2a(qa|0,G|0,ia|0,va|0)|0;va=W2a(ja|0,G|0,y&(p^L)^L|0,r&(x^la)^la|0)|0;ja=W2a(va|0,G|0,(ua|I)^(Ba|ta)^(ra|N)|0,K|0)|0;K=G;N=a3a(j|0,C|0,28)|0;ra=G;ta=g3a(j|0,C|0,36)|0;Ba=ra|G;ra=a3a(j|0,C|0,34)|0;I=G;ua=g3a(j|0,C|0,30)|0;va=Ba^(I|G);I=a3a(j|0,C|0,39)|0;Ba=G;ia=g3a(j|0,C|0,25)|0;qa=W2a((N|ta)^(ra|ua)^(I|ia)|0,va^(Ba|G)|0,(j|l)&ka|j&l|0,(C|D)&ha|C&D|0)|0;Ba=G;a=W2a(ja|0,K|0,fa|0,pa|0)|0;z=G;h=W2a(qa|0,Ba|0,ja|0,K|0)|0;B=G;K=a3a(a|0,z|0,14)|0;ja=G;Ba=g3a(a|0,z|0,50)|0;qa=ja|G;ja=a3a(a|0,z|0,18)|0;pa=G;fa=g3a(a|0,z|0,46)|0;va=qa^(pa|G);pa=a3a(a|0,z|0,41)|0;qa=G;ia=g3a(a|0,z|0,23)|0;I=va^(qa|G);qa=t1a(c[1303624+((E|7)<<2)>>2]|0)|0;E=W2a(qa|0,G|0,aa|0,ba|0)|0;qa=W2a(E|0,G|0,L|0,la|0)|0;la=W2a(qa|0,G|0,a&(y^p)^p|0,z&(r^x)^x|0)|0;qa=W2a(la|0,G|0,(K|Ba)^(ja|fa)^(pa|ia)|0,I|0)|0;I=G;ia=a3a(h|0,B|0,28)|0;pa=G;fa=g3a(h|0,B|0,36)|0;ja=pa|G;pa=a3a(h|0,B|0,34)|0;Ba=G;K=g3a(h|0,B|0,30)|0;la=ja^(Ba|G);Ba=a3a(h|0,B|0,39)|0;ja=G;L=g3a(h|0,B|0,25)|0;E=W2a((ia|fa)^(pa|K)^(Ba|L)|0,la^(ja|G)|0,(h|j)&l|h&j|0,(B|C)&D|B&C|0)|0;ja=G;v=W2a(qa|0,I|0,ka|0,ha|0)|0;w=G;t=W2a(E|0,ja|0,qa|0,I|0)|0;A=G;n=n+1|0}while((n|0)!=10);n=g;ba=W2a(c[n>>2]|0,c[n+4>>2]|0,t|0,A|0)|0;A=g;c[A>>2]=ba;c[A+4>>2]=G;A=b;ba=W2a(c[A>>2]|0,c[A+4>>2]|0,h|0,B|0)|0;B=b;c[B>>2]=ba;c[B+4>>2]=G;B=k;ba=W2a(c[B>>2]|0,c[B+4>>2]|0,j|0,C|0)|0;C=k;c[C>>2]=ba;c[C+4>>2]=G;C=m;ba=W2a(c[C>>2]|0,c[C+4>>2]|0,l|0,D|0)|0;D=m;c[D>>2]=ba;c[D+4>>2]=G;D=o;ba=W2a(c[D>>2]|0,c[D+4>>2]|0,v|0,w|0)|0;w=o;c[w>>2]=ba;c[w+4>>2]=G;w=q;ba=W2a(c[w>>2]|0,c[w+4>>2]|0,a|0,z|0)|0;z=q;c[z>>2]=ba;c[z+4>>2]=G;z=s;ba=W2a(c[z>>2]|0,c[z+4>>2]|0,y|0,r|0)|0;r=s;c[r>>2]=ba;c[r+4>>2]=G;r=u;ba=W2a(c[r>>2]|0,c[r+4>>2]|0,p|0,x|0)|0;x=u;c[x>>2]=ba;c[x+4>>2]=G;i=e;return}function x1a(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;i=i+16|0;f=e;g=f+0|0;h=g+14|0;do{a[g>>0]=0;g=g+1|0}while((g|0)<(h|0));g=b;h=c[g>>2]|0;j=c[g+4>>2]|0;g=a3a(h|0,j|0,29)|0;k=G;l=b+8|0;m=c[l>>2]|0;n=c[l+4>>2]|0;l=g3a(m|0,n|0,3)|0;o=l|g;l=G|k;k=g3a(h|0,j|0,3)|0;p=a3a(m|0,n|0,53)|0;a[f>>0]=p;p=a3a(m|0,n|0,45)|0;a[f+1>>0]=p;p=a3a(m|0,n|0,37)|0;a[f+2>>0]=p;a[f+3>>0]=l;p=a3a(o|0,l|0,24)|0;a[f+4>>0]=p;p=a3a(o|0,l|0,16)|0;a[f+5>>0]=p;p=a3a(o|0,l|0,8)|0;a[f+6>>0]=p;a[f+7>>0]=o;o=a3a(h|0,j|0,53)|0;a[f+8>>0]=o;o=a3a(h|0,j|0,45)|0;a[f+9>>0]=o;o=a3a(h|0,j|0,37)|0;a[f+10>>0]=o;a[f+11>>0]=g;g=a3a(h|0,j|0,21)|0;a[f+12>>0]=g;g=a3a(h|0,j|0,13)|0;a[f+13>>0]=g;g=a3a(h|0,j|0,5)|0;a[f+14>>0]=g;a[f+15>>0]=k;k=h&127;v1a(b,1303304,(k>>>0<112?112:240)-k|0);v1a(b,f,16);f=b+16|0;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,56)|0;a[d>>0]=h;h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,48)|0;a[d+1>>0]=k;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,40)|0;a[d+2>>0]=h;a[d+3>>0]=c[f+4>>2];h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,24)|0;a[d+4>>0]=k;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,16)|0;a[d+5>>0]=h;h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,8)|0;a[d+6>>0]=k;a[d+7>>0]=c[f>>2];f=b+24|0;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,56)|0;a[d+8>>0]=h;h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,48)|0;a[d+9>>0]=k;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,40)|0;a[d+10>>0]=h;a[d+11>>0]=c[f+4>>2];h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,24)|0;a[d+12>>0]=k;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,16)|0;a[d+13>>0]=h;h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,8)|0;a[d+14>>0]=k;a[d+15>>0]=c[f>>2];f=b+32|0;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,56)|0;a[d+16>>0]=h;h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,48)|0;a[d+17>>0]=k;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,40)|0;a[d+18>>0]=h;a[d+19>>0]=c[f+4>>2];h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,24)|0;a[d+20>>0]=k;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,16)|0;a[d+21>>0]=h;h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,8)|0;a[d+22>>0]=k;a[d+23>>0]=c[f>>2];f=b+40|0;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,56)|0;a[d+24>>0]=h;h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,48)|0;a[d+25>>0]=k;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,40)|0;a[d+26>>0]=h;a[d+27>>0]=c[f+4>>2];h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,24)|0;a[d+28>>0]=k;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,16)|0;a[d+29>>0]=h;h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,8)|0;a[d+30>>0]=k;a[d+31>>0]=c[f>>2];f=b+48|0;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,56)|0;a[d+32>>0]=h;h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,48)|0;a[d+33>>0]=k;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,40)|0;a[d+34>>0]=h;a[d+35>>0]=c[f+4>>2];h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,24)|0;a[d+36>>0]=k;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,16)|0;a[d+37>>0]=h;h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,8)|0;a[d+38>>0]=k;a[d+39>>0]=c[f>>2];f=b+56|0;b=f;k=a3a(c[b>>2]|0,c[b+4>>2]|0,56)|0;a[d+40>>0]=k;k=f;b=a3a(c[k>>2]|0,c[k+4>>2]|0,48)|0;a[d+41>>0]=b;b=f;k=a3a(c[b>>2]|0,c[b+4>>2]|0,40)|0;a[d+42>>0]=k;a[d+43>>0]=c[f+4>>2];k=f;b=a3a(c[k>>2]|0,c[k+4>>2]|0,24)|0;a[d+44>>0]=b;b=f;k=a3a(c[b>>2]|0,c[b+4>>2]|0,16)|0;a[d+45>>0]=k;k=f;b=a3a(c[k>>2]|0,c[k+4>>2]|0,8)|0;a[d+46>>0]=b;a[d+47>>0]=c[f>>2];i=e;return}function y1a(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;i=i+208|0;e=d;u1a(e);v1a(e,a,b);x1a(e,c);i=d;return}function z1a(a){a=a|0;var b=0,d=0,e=0;b=i;if((a|0)==0){i=b;return}f3a(a|0,0,208)|0;d=t1a(1303432)|0;e=a+16|0;c[e>>2]=d;c[e+4>>2]=G;e=t1a(1303456)|0;d=a+24|0;c[d>>2]=e;c[d+4>>2]=G;d=t1a(1303480)|0;e=a+32|0;c[e>>2]=d;c[e+4>>2]=G;e=t1a(1303504)|0;d=a+40|0;c[d>>2]=e;c[d+4>>2]=G;d=t1a(1303528)|0;e=a+48|0;c[e>>2]=d;c[e+4>>2]=G;e=t1a(1303552)|0;d=a+56|0;c[d>>2]=e;c[d+4>>2]=G;d=t1a(1303576)|0;e=a+64|0;c[e>>2]=d;c[e+4>>2]=G;e=t1a(1303600)|0;d=a+72|0;c[d>>2]=e;c[d+4>>2]=G;i=b;return}function A1a(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;i=i+16|0;f=e;g=f+0|0;h=g+14|0;do{a[g>>0]=0;g=g+1|0}while((g|0)<(h|0));g=b;h=c[g>>2]|0;j=c[g+4>>2]|0;g=a3a(h|0,j|0,29)|0;k=G;l=b+8|0;m=c[l>>2]|0;n=c[l+4>>2]|0;l=g3a(m|0,n|0,3)|0;o=l|g;l=G|k;k=g3a(h|0,j|0,3)|0;p=a3a(m|0,n|0,53)|0;a[f>>0]=p;p=a3a(m|0,n|0,45)|0;a[f+1>>0]=p;p=a3a(m|0,n|0,37)|0;a[f+2>>0]=p;a[f+3>>0]=l;p=a3a(o|0,l|0,24)|0;a[f+4>>0]=p;p=a3a(o|0,l|0,16)|0;a[f+5>>0]=p;p=a3a(o|0,l|0,8)|0;a[f+6>>0]=p;a[f+7>>0]=o;o=a3a(h|0,j|0,53)|0;a[f+8>>0]=o;o=a3a(h|0,j|0,45)|0;a[f+9>>0]=o;o=a3a(h|0,j|0,37)|0;a[f+10>>0]=o;a[f+11>>0]=g;g=a3a(h|0,j|0,21)|0;a[f+12>>0]=g;g=a3a(h|0,j|0,13)|0;a[f+13>>0]=g;g=a3a(h|0,j|0,5)|0;a[f+14>>0]=g;a[f+15>>0]=k;k=h&127;v1a(b,1303304,(k>>>0<112?112:240)-k|0);v1a(b,f,16);f=b+16|0;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,56)|0;a[d>>0]=h;h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,48)|0;a[d+1>>0]=k;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,40)|0;a[d+2>>0]=h;a[d+3>>0]=c[f+4>>2];h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,24)|0;a[d+4>>0]=k;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,16)|0;a[d+5>>0]=h;h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,8)|0;a[d+6>>0]=k;a[d+7>>0]=c[f>>2];f=b+24|0;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,56)|0;a[d+8>>0]=h;h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,48)|0;a[d+9>>0]=k;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,40)|0;a[d+10>>0]=h;a[d+11>>0]=c[f+4>>2];h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,24)|0;a[d+12>>0]=k;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,16)|0;a[d+13>>0]=h;h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,8)|0;a[d+14>>0]=k;a[d+15>>0]=c[f>>2];f=b+32|0;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,56)|0;a[d+16>>0]=h;h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,48)|0;a[d+17>>0]=k;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,40)|0;a[d+18>>0]=h;a[d+19>>0]=c[f+4>>2];h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,24)|0;a[d+20>>0]=k;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,16)|0;a[d+21>>0]=h;h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,8)|0;a[d+22>>0]=k;a[d+23>>0]=c[f>>2];f=b+40|0;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,56)|0;a[d+24>>0]=h;h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,48)|0;a[d+25>>0]=k;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,40)|0;a[d+26>>0]=h;a[d+27>>0]=c[f+4>>2];h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,24)|0;a[d+28>>0]=k;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,16)|0;a[d+29>>0]=h;h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,8)|0;a[d+30>>0]=k;a[d+31>>0]=c[f>>2];f=b+48|0;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,56)|0;a[d+32>>0]=h;h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,48)|0;a[d+33>>0]=k;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,40)|0;a[d+34>>0]=h;a[d+35>>0]=c[f+4>>2];h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,24)|0;a[d+36>>0]=k;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,16)|0;a[d+37>>0]=h;h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,8)|0;a[d+38>>0]=k;a[d+39>>0]=c[f>>2];f=b+56|0;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,56)|0;a[d+40>>0]=h;h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,48)|0;a[d+41>>0]=k;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,40)|0;a[d+42>>0]=h;a[d+43>>0]=c[f+4>>2];h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,24)|0;a[d+44>>0]=k;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,16)|0;a[d+45>>0]=h;h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,8)|0;a[d+46>>0]=k;a[d+47>>0]=c[f>>2];f=b+64|0;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,56)|0;a[d+48>>0]=h;h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,48)|0;a[d+49>>0]=k;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,40)|0;a[d+50>>0]=h;a[d+51>>0]=c[f+4>>2];h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,24)|0;a[d+52>>0]=k;k=f;h=a3a(c[k>>2]|0,c[k+4>>2]|0,16)|0;a[d+53>>0]=h;h=f;k=a3a(c[h>>2]|0,c[h+4>>2]|0,8)|0;a[d+54>>0]=k;a[d+55>>0]=c[f>>2];f=b+72|0;b=f;k=a3a(c[b>>2]|0,c[b+4>>2]|0,56)|0;a[d+56>>0]=k;k=f;b=a3a(c[k>>2]|0,c[k+4>>2]|0,48)|0;a[d+57>>0]=b;b=f;k=a3a(c[b>>2]|0,c[b+4>>2]|0,40)|0;a[d+58>>0]=k;a[d+59>>0]=c[f+4>>2];k=f;b=a3a(c[k>>2]|0,c[k+4>>2]|0,24)|0;a[d+60>>0]=b;b=f;k=a3a(c[b>>2]|0,c[b+4>>2]|0,16)|0;a[d+61>>0]=k;k=f;b=a3a(c[k>>2]|0,c[k+4>>2]|0,8)|0;a[d+62>>0]=b;a[d+63>>0]=c[f>>2];i=e;return}function B1a(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;i=i+208|0;e=d;z1a(e);v1a(e,a,b);A1a(e,c);i=d;return}function C1a(){var a=0,b=0;a=i;b=u2a(128)|0;_q(b);i=a;return b|0}function D1a(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}Rc[c[(c[a>>2]|0)+220>>2]&1023](a);i=b;return}function E1a(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;c[a>>2]=0;h=dd[c[c[b>>2]>>2]&511](b,d)|0;if((h|0)==0){i=g;return}if(f<<16>>16==0){if((Lc[c[(c[h>>2]|0)+12>>2]&255](h)|0)==0){j=Qc[c[(c[b>>2]|0)+12>>2]&255](b,d,e)|0}else{j=Bu(h,e&65535)|0}if((j|0)==0){k=e}else{xu(h,a,j);i=g;return}}else{k=f}xu(h,a,k&65535);i=g;return}function F1a(a,d,e,f,h,j){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0.0,ta=0.0,ua=0,va=0,wa=0,xa=0.0,ya=0.0,za=0,Aa=0.0,Ba=0.0,Ca=0,Da=0.0,Ea=0.0,Fa=0.0,Ga=0.0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0;k=i;i=i+496|0;l=k+472|0;m=k+456|0;n=k+444|0;o=k+432|0;p=k+424|0;q=k+420|0;r=k+416|0;s=k+408|0;t=k+332|0;u=k+256|0;v=k+248|0;w=k+240|0;x=k+232|0;y=k+228|0;z=k+224|0;A=k+216|0;B=k+208|0;C=k+200|0;D=k+192|0;E=k+188|0;F=k+112|0;G=k+104|0;H=k+96|0;I=k+88|0;J=k+80|0;K=k+72|0;L=k+68|0;M=k+64|0;N=k+56|0;O=k+52|0;P=k+48|0;Q=k+40|0;R=k+24|0;S=k+16|0;T=k+8|0;U=k;gla(l);gla(m);V=Lc[c[(c[d>>2]|0)+16>>2]&255](d)|0;if((V|0)!=0){W=(f|0)!=0;if(W){Ic[c[(c[V>>2]|0)+48>>2]&511](V,f)}else{Ic[c[(c[V>>2]|0)+44>>2]&511](V,0)}c[n>>2]=-1;c[n+4>>2]=-1;c[n+8>>2]=-1;X=f+12|0;f=(h|0)==0;h=F+20|0;Y=F+24|0;Z=e+4|0;_=F+40|0;$=F+44|0;aa=u+40|0;ba=m+8|0;ca=u+44|0;da=u+24|0;ea=u+28|0;fa=t+20|0;ga=t+24|0;ha=G+4|0;ia=H+4|0;ja=K+4|0;ka=I+4|0;la=D+4|0;ma=m+4|0;na=x+4|0;oa=B+4|0;pa=p+4|0;qa=v+4|0;ra=w+4|0;sa=0.0;ta=0.0;ua=-1;a:while(1){while(1){if((Lc[c[(c[V>>2]|0)+8>>2]&255](V)|0)==0){break a}va=Lc[c[(c[V>>2]|0)+52>>2]&255](V)|0;c[o+0>>2]=c[va+0>>2];c[o+4>>2]=c[va+4>>2];c[o+8>>2]=c[va+8>>2];if(W?(Nm(o,X)|0)>0:0){break a}if(!f){break}Um(F);if((dd[c[(c[V>>2]|0)+32>>2]&511](V,F)|0)!=0){wa=27;break}}if((wa|0)==27){wa=0;xa=+g[h>>2]+ +g[e>>2];ya=+g[Y>>2]+ +g[Z>>2];if(xa!=ta|ya!=sa){va=tla(l,xa-ta)|0;pe(G,1305864);za=tla(qla(va,c[G>>2]|0,c[ha>>2]|0)|0,ya-sa)|0;pe(H,1305872);qla(za,c[H>>2]|0,c[ia>>2]|0)|0;Aa=ya;Ba=xa}else{Aa=sa;Ba=ta}if((c[_>>2]|0)==(ua|0)){Ca=ua}else{za=Lc[c[(c[d>>2]|0)+24>>2]&255](d)|0;H1a(J,za,c[_>>2]|0,+g[$>>2]);oe(I,J);qla(l,c[I>>2]|0,c[ka>>2]|0)|0;dka(J);Ca=c[_>>2]|0}za=Lc[c[(c[d>>2]|0)+24>>2]&255](d)|0;E1a(M,za,Ca,b[F>>1]|0,j);G1a(L,M);oe(K,L);qla(l,c[K>>2]|0,c[ja>>2]|0)|0;dka(L);dka(M);sa=Aa;ta=Ba;ua=Ca;continue}if((Om(o,n)|0)!=0){za=c[ba>>2]|0;if((za|0)>0){pla(s,c[ma>>2]|0,za);jka(r,s);G1a(q,r);oe(p,q);qla(l,c[p>>2]|0,c[pa>>2]|0)|0;dka(q);dka(r);jla(m)}Um(t);if((dd[c[(c[V>>2]|0)+32>>2]&511](V,t)|0)==0){c[u+0>>2]=-1;c[u+4>>2]=-1;c[u+8>>2]=-1;c[u+12>>2]=-1;c[u+16>>2]=-1;c[u+20>>2]=-1;c[da+0>>2]=0;c[da+4>>2]=0;c[da+8>>2]=0;c[da+12>>2]=0;c[da+16>>2]=0;dd[c[(c[V>>2]|0)+36>>2]&511](V,u)|0;Da=+g[da>>2]+ +g[e>>2];Ea=+g[ea>>2]+ +g[Z>>2]}else{Da=+g[fa>>2]+ +g[e>>2];Ea=+g[ga>>2]+ +g[Z>>2]}if(Da!=ta|Ea!=sa){za=tla(l,Da-ta)|0;pe(v,1305864);va=tla(qla(za,c[v>>2]|0,c[qa>>2]|0)|0,Ea-sa)|0;pe(w,1305872);qla(va,c[w>>2]|0,c[ra>>2]|0)|0;Fa=Ea;Ga=Da}else{Fa=sa;Ga=ta}}else{Fa=sa;Ga=ta}Um(u);if((dd[c[(c[V>>2]|0)+32>>2]&511](V,u)|0)==0){Ha=ua}else{if((c[aa>>2]|0)==(ua|0)){Ia=ua}else{va=c[ba>>2]|0;if((va|0)>0){pla(A,c[ma>>2]|0,va);jka(z,A);G1a(y,z);oe(x,y);qla(l,c[x>>2]|0,c[na>>2]|0)|0;dka(y);dka(z);jla(m)}va=Lc[c[(c[d>>2]|0)+24>>2]&255](d)|0;H1a(C,va,c[aa>>2]|0,+g[ca>>2]);oe(B,C);qla(l,c[B>>2]|0,c[oa>>2]|0)|0;dka(C);Ia=c[aa>>2]|0}va=Lc[c[(c[d>>2]|0)+24>>2]&255](d)|0;E1a(E,va,Ia,b[u>>1]|0,j);oe(D,E);qla(m,c[D>>2]|0,c[la>>2]|0)|0;dka(E);Ha=Ia}c[n+0>>2]=c[o+0>>2];c[n+4>>2]=c[o+4>>2];c[n+8>>2]=c[o+8>>2];sa=Fa;ta=Ga;ua=Ha}Ha=c[ba>>2]|0;if((Ha|0)>0){pla(Q,c[ma>>2]|0,Ha);jka(P,Q);G1a(O,P);oe(N,O);qla(l,c[N>>2]|0,c[N+4>>2]|0)|0;dka(O);dka(P);jla(m)}}gla(R);P=l+8|0;if((c[P>>2]|0)<=0){Ja=R+4|0;Ka=c[Ja>>2]|0;La=R+8|0;Ma=c[La>>2]|0;pla(U,Ka,Ma);jka(a,U);Na=c[Ja>>2]|0;ila(Na);Oa=m+4|0;Pa=c[Oa>>2]|0;ila(Pa);Qa=l+4|0;Ra=c[Qa>>2]|0;ila(Ra);i=k;return}O=Lc[c[(c[d>>2]|0)+352>>2]&255](d)|0;if((O|0)!=100){N=rla(R,O)|0;pe(S,1305880);qla(N,c[S>>2]|0,c[S+4>>2]|0)|0}Ga=+Vc[c[(c[d>>2]|0)+356>>2]&15](d);if(!(Ga<1.0e-4&Ga>-1.0e-4)){d=tla(R,Ga)|0;pe(T,1305888);qla(d,c[T>>2]|0,c[T+4>>2]|0)|0}ula(R,c[l+4>>2]|0,c[P>>2]|0)|0;Ja=R+4|0;Ka=c[Ja>>2]|0;La=R+8|0;Ma=c[La>>2]|0;pla(U,Ka,Ma);jka(a,U);Na=c[Ja>>2]|0;ila(Na);Oa=m+4|0;Pa=c[Oa>>2]|0;ila(Pa);Qa=l+4|0;Ra=c[Qa>>2]|0;ila(Ra);i=k;return}function G1a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d;f=c[b>>2]|0;if((f|0)!=0?(c[f+4>>2]|0)>0:0){EG(e,b,0);Vm(a,e,1305920);dka(e);i=d;return}eka(a,1305928,-1);i=d;return}function H1a(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=i;i=i+64|0;g=f+48|0;h=f+40|0;j=f+32|0;k=f+24|0;l=f+16|0;m=f+8|0;n=f;gla(g);if((b|0)==0){o=g+4|0;p=c[o>>2]|0;q=g+8|0;r=c[q>>2]|0;pla(n,p,r);jka(a,n);s=c[o>>2]|0;ila(s);i=f;return}ld[c[(c[b>>2]|0)+4>>2]&255](h,b,d);d=c[h>>2]|0;if((d|0)!=0?(c[d+4>>2]|0)>0&e>0.0:0){pe(j,1305904);d=qla(g,c[j>>2]|0,c[j+4>>2]|0)|0;oe(k,h);j=qla(d,c[k>>2]|0,c[k+4>>2]|0)|0;pe(l,1305864);k=tla(qla(j,c[l>>2]|0,c[l+4>>2]|0)|0,e)|0;pe(m,1305912);qla(k,c[m>>2]|0,c[m+4>>2]|0)|0}dka(h);o=g+4|0;p=c[o>>2]|0;q=g+8|0;r=c[q>>2]|0;pla(n,p,r);jka(a,n);s=c[o>>2]|0;ila(s);i=f;return}function I1a(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;f=i;i=i+192|0;h=f+176|0;j=f+160|0;k=f+84|0;l=f+40|0;m=f+32|0;n=f+24|0;o=f+16|0;p=f+8|0;q=f;gla(h);a:do{if(((e|0)!=0?(r=e+12|0,(cs(e,r)|0)!=0):0)?(s=Lc[c[(c[b>>2]|0)+16>>2]&255](b)|0,(s|0)!=0):0){Ic[c[(c[s>>2]|0)+48>>2]&511](s,e);t=l+24|0;u=k+20|0;v=l+28|0;w=l+40|0;x=k+36|0;y=l+36|0;z=m+4|0;A=n+4|0;B=o+4|0;C=p+4|0;while(1){if((Lc[c[(c[s>>2]|0)+8>>2]&255](s)|0)==0){break a}D=Lc[c[(c[s>>2]|0)+52>>2]&255](s)|0;c[j+0>>2]=c[D+0>>2];c[j+4>>2]=c[D+4>>2];c[j+8>>2]=c[D+8>>2];if((Nm(j,r)|0)>0){break a}Um(k);c[l+0>>2]=-1;c[l+4>>2]=-1;c[l+8>>2]=-1;c[l+12>>2]=-1;c[l+16>>2]=-1;c[l+20>>2]=-1;c[t+0>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;if((dd[c[(c[s>>2]|0)+32>>2]&511](s,k)|0)==0){continue}if((dd[c[(c[s>>2]|0)+36>>2]&511](s,l)|0)==0){continue}D=tla(h,+g[u>>2]+ +g[d>>2])|0;pe(m,1305864);E=qla(D,c[m>>2]|0,c[z>>2]|0)|0;D=tla(E,+g[v>>2]+ +g[w>>2])|0;pe(n,1305864);E=qla(D,c[n>>2]|0,c[A>>2]|0)|0;D=tla(E,+g[x>>2])|0;pe(o,1305864);E=qla(D,c[o>>2]|0,c[B>>2]|0)|0;D=tla(E,+g[y>>2]- +g[w>>2])|0;pe(p,1305896);qla(D,c[p>>2]|0,c[C>>2]|0)|0}}}while(0);p=h+4|0;pla(q,c[p>>2]|0,c[h+8>>2]|0);jka(a,q);ila(c[p>>2]|0);i=f;return}function J1a(a,d,e,f,h,j,k,l,m,n){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0.0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0.0,ea=0.0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0.0,ta=0.0,ua=0.0,va=0.0,wa=0.0,xa=0.0,ya=0.0,za=0,Aa=0,Ba=0,Ca=0.0,Da=0.0,Ea=0;o=i;i=i+288|0;p=o+264|0;q=o+248|0;r=o+232|0;s=o+216|0;t=o+204|0;u=o+192|0;v=o+116|0;w=o+72|0;x=o+56|0;y=o+44|0;z=o+40|0;A=o+32|0;B=o+24|0;C=o+16|0;D=o+12|0;E=o+8|0;F=o;G=Lc[c[(c[e>>2]|0)+348>>2]&255](e)|0;H=+Vc[c[(c[e>>2]|0)+356>>2]&15](e)>0.0;I=Lc[c[(c[e>>2]|0)+344>>2]&255](e)|0;J=+Vc[c[(c[e>>2]|0)+340>>2]&15](e);Ic[c[(c[e>>2]|0)+212>>2]&511](p,e);K=Lc[c[(c[e>>2]|0)+352>>2]&255](e)|0;gla(q);LGa(c[a+44>>2]|0);if((Ny(j)|0)==0){c[r+0>>2]=c[j+0>>2];c[r+4>>2]=c[j+4>>2];c[r+8>>2]=c[j+8>>2];c[r+12>>2]=c[j+12>>2];rm(d,r);c[s>>2]=~~+g[r>>2];c[s+8>>2]=~~+g[r+4>>2];c[s+4>>2]=~~+g[r+12>>2];c[s+12>>2]=~~+g[r+8>>2];TGa(a,s)}s=Lc[c[(c[e>>2]|0)+16>>2]&255](e)|0;if((s|0)==0){MGa(a,0);L=q+4|0;M=c[L>>2]|0;ila(M);i=o;return}r=Lc[c[(c[e>>2]|0)+24>>2]&255](e)|0;if((r|0)==0){MGa(a,0);L=q+4|0;M=c[L>>2]|0;ila(M);i=o;return}e=(l|0)!=0;if(e){Ic[c[(c[s>>2]|0)+48>>2]&511](s,l)}else{Ic[c[(c[s>>2]|0)+44>>2]&511](s,0)}c[t>>2]=-1;c[t+4>>2]=-1;c[t+8>>2]=-1;N=l+12|0;l=p+12|0;O=(m|0)!=0;P=H|(G|0)!=0;G=v+20|0;H=v+24|0;Q=k+4|0;R=v+40|0;S=q+8|0;T=v+20|0;U=w+24|0;V=w+28|0;W=w+40|0;X=v+36|0;Y=w+36|0;Z=x+8|0;_=x+4|0;$=x+12|0;aa=B+4|0;ba=q+4|0;ca=y+4|0;da=0.0;ea=0.0;fa=0;ga=f;ha=f;ia=-1;a:while(1){ja=fa;ka=ga;la=ha;while(1){if((Lc[c[(c[s>>2]|0)+8>>2]&255](s)|0)==0){break a}ma=Lc[c[(c[s>>2]|0)+52>>2]&255](s)|0;c[u+0>>2]=c[ma+0>>2];c[u+4>>2]=c[ma+4>>2];c[u+8>>2]=c[ma+8>>2];if(e?(Nm(u,N)|0)>0:0){break a}if((cs(p,l)|0)==0){na=ja;oa=ka}else{if((Nm(u,p)|0)>0){pa=(Nm(u,l)|0)<1}else{pa=0}na=pa&1;oa=pa?-1:f}if(O){ma=(Lc[c[(c[m>>2]|0)+16>>2]&255](m)|0)==0;qa=ma?oa:f;ra=ma?la:f}else{qa=oa;ra=la}Um(v);if((dd[c[(c[s>>2]|0)+32>>2]&511](s,v)|0)==0){ja=na;ka=qa;la=ra}else{break}}do{if((na|0)!=0){c[w+0>>2]=-1;c[w+4>>2]=-1;c[w+8>>2]=-1;c[w+12>>2]=-1;c[w+16>>2]=-1;c[w+20>>2]=-1;c[U+0>>2]=0;c[U+4>>2]=0;c[U+8>>2]=0;c[U+12>>2]=0;c[U+16>>2]=0;dd[c[(c[s>>2]|0)+36>>2]&511](s,w)|0;if(O?(Lc[c[(c[m>>2]|0)+16>>2]&255](m)|0)!=0:0){sa=+g[G>>2];ta=+g[V>>2];ua=ta+ +g[W>>2];va=sa+ +g[X>>2];wa=ta+ +g[Y>>2];g[x>>2]=sa;g[Z>>2]=ua;g[_>>2]=va;g[$>>2]=wa;Ila(x,j);ld[c[(c[m>>2]|0)+12>>2]&255](m,n,x);break}OIa(y);wa=+g[G>>2];va=+g[V>>2];XIa(y,wa,va+ +g[W>>2],wa+ +g[X>>2],va+ +g[Y>>2]);UGa(a,y,d,0,-16764047,0,2,0)|0;PIa(c[ca>>2]|0)}}while(0);if(P){va=+g[G>>2]+ +g[k>>2];wa=+g[H>>2]+ +g[Q>>2];ka=dd[c[c[r>>2]>>2]&511](r,c[R>>2]|0)|0;E1a(D,r,c[R>>2]|0,b[v>>1]|0,I);K1a(a,va,wa,ka,J,d,D,qa,h,K);dka(D);xa=da;ya=ea;za=ra;Aa=ia}else{if((Om(u,t)|0)==0?(ra|0)==(qa|0)?(c[R>>2]|0)==(ia|0):0:0){Ba=ia;Ca=da;Da=ea;Ea=ra}else{if((c[S>>2]|0)>0){wa=ea+ +g[k>>2];va=da+ +g[Q>>2];ka=dd[c[c[r>>2]>>2]&511](r,ia)|0;pla(A,c[ba>>2]|0,c[S>>2]|0);jka(z,A);K1a(a,wa,va,ka,J,d,z,ra,h,K);dka(z);jla(q)}ka=T;va=+g[ka>>2];Ba=c[R>>2]|0;Ca=+g[ka+4>>2];Da=va;Ea=qa}E1a(C,r,Ba,b[v>>1]|0,I);oe(B,C);qla(q,c[B>>2]|0,c[aa>>2]|0)|0;dka(C);xa=Ca;ya=Da;za=Ea;Aa=Ba}c[t+0>>2]=c[u+0>>2];c[t+4>>2]=c[u+4>>2];c[t+8>>2]=c[u+8>>2];da=xa;ea=ya;fa=na;ga=qa;ha=za;ia=Aa}if((c[S>>2]|0)<=0){MGa(a,0);L=q+4|0;M=c[L>>2]|0;ila(M);i=o;return}ya=ea+ +g[k>>2];ea=da+ +g[Q>>2];Q=dd[c[c[r>>2]>>2]&511](r,ia)|0;pla(F,c[ba>>2]|0,c[S>>2]|0);jka(E,F);K1a(a,ya,ea,Q,J,d,E,la,h,K);dka(E);MGa(a,0);L=q+4|0;M=c[L>>2]|0;ila(M);i=o;return}function K1a(a,b,d,e,f,h,j,k,l,m){a=a|0;b=+b;d=+d;e=e|0;f=+f;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;n=i;i=i+208|0;o=n+196|0;p=n+192|0;q=n+168|0;r=n+128|0;s=n+120|0;t=n+112|0;u=n+84|0;v=n+48|0;w=n+40|0;x=n+32|0;y=n;g[o>>2]=b;g[p>>2]=d;fma(h,o,p);if((e|0)==0){i=n;return}if((m|0)==100){ML(v);c[v+12>>2]=1;c[v>>2]=0;if((l|0)==0){lP(a,+g[o>>2],+g[p>>2],e,f,h,j,k,0,0,v);i=n;return}else{g[w>>2]=0.0;z=w+4|0;g[z>>2]=0.0;g[x>>2]=1.0;A=x+4|0;g[A>>2]=0.0;fma(h,w,z);fma(h,x,A);dJa(y);g[y+24>>2]=+R(+(+g[x>>2]+ +g[A>>2]-(+g[w>>2]+ +g[z>>2])));lP(a,+g[o>>2],+g[p>>2],e,f,h,j,k,l,y,v);gJa(c[y+8>>2]|0);i=n;return}}else{g[q>>2]=+(m|0)/100.0;g[q+4>>2]=0.0;g[q+8>>2]=0.0;g[q+12>>2]=1.0;g[q+16>>2]=0.0;g[q+20>>2]=0.0;Wla(q,h);ML(r);c[r+12>>2]=1;c[r>>2]=0;if((l|0)==0){lP(a,+g[o>>2],+g[p>>2],e,f,q,j,k,0,0,r);i=n;return}else{g[s>>2]=0.0;m=s+4|0;g[m>>2]=0.0;g[t>>2]=1.0;y=t+4|0;g[y>>2]=0.0;fma(h,s,m);fma(h,t,y);dJa(u);g[u+24>>2]=+R(+(+g[t>>2]+ +g[y>>2]-(+g[s>>2]+ +g[m>>2])));lP(a,+g[o>>2],+g[p>>2],e,f,q,j,k,l,u,r);gJa(c[u+8>>2]|0);i=n;return}}}function L1a(a){a=a|0;var b=0,c=0.0;b=i;c=+E2a(1.0,a);i=b;return+c}function M1a(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;a:do{if((c|0)==0){g=0}else{h=b;j=c;while(1){k=j>>>1;l=h+(ca(k,d)|0)|0;m=dd[e&511](a,l)|0;if((m|0)==0){g=l;break a}if((j|0)==1){g=0;break a}n=(m|0)<0;j=n?k:j-k|0;if((j|0)==0){g=0;break}else{h=n?h:l}}}}while(0);i=f;return g|0}function N1a(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0;f=i;i=i+944|0;g=f+680|0;h=f+424|0;j=f+192|0;k=f;l=ca(d,b)|0;if((l|0)==0){i=f;return}b=l-d|0;c[k+4>>2]=d;c[k>>2]=d;m=d;n=d;o=2;while(1){p=m+d+n|0;c[k+(o<<2)>>2]=p;if(p>>>0<l>>>0){q=n;n=p;o=o+1|0;m=q}else{break}}m=0-d|0;o=a+b|0;if((b|0)>0){b=(d|0)==0;n=d>>>0>256?256:d;l=(n|0)==(d|0);q=o;p=1;r=0;s=a;t=1;while(1){do{if((p&3|0)!=3){u=t+ -1|0;a:do{if((c[k+(u<<2)>>2]|0)>>>0<(q-s|0)>>>0){c[j>>2]=s;if((t|0)>1){v=t;w=s;x=s;y=1;while(1){z=w+m|0;A=v+ -2|0;B=w+(0-((c[k+(A<<2)>>2]|0)+d))|0;if((dd[e&511](x,B)|0)>-1?(dd[e&511](x,z)|0)>-1:0){C=y;break}D=y+1|0;E=j+(y<<2)|0;if((dd[e&511](B,z)|0)>-1){c[E>>2]=B;F=B;G=v+ -1|0}else{c[E>>2]=z;F=z;G=A}if((G|0)<=1){C=D;break}v=G;w=F;x=c[j>>2]|0;y=D}if((C|0)>=2?(y=j+(C<<2)|0,c[y>>2]=g,!b):0){if((C|0)>0){H=d;I=g}else{x=c[j>>2]|0;c3a(g|0,x|0,n|0)|0;if(l){break}else{J=d;K=n}while(1){J=J-K|0;K=J>>>0>256?256:J;c3a(g|0,x|0,K|0)|0;if((J|0)==(K|0)){break a}}}while(1){x=H>>>0>256?256:H;w=c[j>>2]|0;c3a(I|0,w|0,x|0)|0;v=w;w=0;do{D=w;w=w+1|0;A=v;v=c[j+(w<<2)>>2]|0;c3a(A|0,v|0,x|0)|0;c[j+(D<<2)>>2]=A+x}while((w|0)!=(C|0));if((H|0)==(x|0)){break a}H=H-x|0;I=c[y>>2]|0}}}}else{O1a(s,d,e,p,r,t,0,k)}}while(0);if((t|0)==1){L=p<<1;M=p>>>31|r<<1;N=0;break}else{y=u>>>0>31;w=y?0:p;v=y?t+ -33|0:u;L=w<<v;M=w>>>(32-v|0)|(y?p:r)<<v;N=1;break}}else{c[j>>2]=s;b:do{if((t|0)>1){v=t;y=s;w=s;A=1;while(1){D=y+m|0;z=v+ -2|0;E=y+(0-((c[k+(z<<2)>>2]|0)+d))|0;if((dd[e&511](w,E)|0)>-1?(dd[e&511](w,D)|0)>-1:0){O=A;break}B=A+1|0;P=j+(A<<2)|0;if((dd[e&511](E,D)|0)>-1){c[P>>2]=E;Q=E;R=v+ -1|0}else{c[P>>2]=D;Q=D;R=z}if((R|0)<=1){O=B;break}v=R;y=Q;w=c[j>>2]|0;A=B}if((O|0)>=2?(A=j+(O<<2)|0,c[A>>2]=h,!b):0){if((O|0)>0){S=d;T=h}else{w=c[j>>2]|0;c3a(h|0,w|0,n|0)|0;if(l){break}else{U=d;V=n}while(1){U=U-V|0;V=U>>>0>256?256:U;c3a(h|0,w|0,V|0)|0;if((U|0)==(V|0)){break b}}}while(1){w=S>>>0>256?256:S;y=c[j>>2]|0;c3a(T|0,y|0,w|0)|0;v=y;y=0;do{B=y;y=y+1|0;z=v;v=c[j+(y<<2)>>2]|0;c3a(z|0,v|0,w|0)|0;c[j+(B<<2)>>2]=z+w}while((y|0)!=(O|0));if((S|0)==(w|0)){break b}S=S-w|0;T=c[A>>2]|0}}}}while(0);L=p>>>2|r<<30;M=r>>>2;N=t+2|0}}while(0);u=L|1;A=s+d|0;if(A>>>0<o>>>0){p=u;r=M;s=A;t=N}else{W=M;X=u;Y=A;Z=N;break}}}else{W=0;X=1;Y=a;Z=1}O1a(Y,d,e,X,W,Z,0,k);a=X;X=W;W=Y;Y=Z;while(1){if((Y|0)==1){if((a|0)==1){if((X|0)==0){break}else{_=52}}}else{_=52}if((_|0)==52?(_=0,(Y|0)>=2):0){Z=a>>>30;N=Y+ -2|0;M=(a<<1&2147483646|Z<<31)^3;t=(Z|X<<2)>>>1;O1a(W+(0-((c[k+(N<<2)>>2]|0)+d))|0,d,e,M,t,Y+ -1|0,1,k);s=t<<1|Z&1;Z=M<<1|1;M=W+m|0;O1a(M,d,e,Z,s,N,1,k);a=Z;X=s;W=M;Y=N;continue}N=a+ -1|0;if((N|0)!=0){if((N&1|0)==0){M=N;N=0;do{N=N+1|0;M=M>>>1}while((M&1|0)==0);if((N|0)!=0){$=N}else{_=57}}else{_=57}if((_|0)==57){_=0;if((X|0)!=0){if((X&1|0)==0){M=X;s=0;while(1){Z=s+1|0;M=M>>>1;if((M&1|0)!=0){aa=Z;break}else{s=Z}}}else{aa=0}}else{aa=32}$=(aa|0)==0?0:aa+32|0}if($>>>0>31){ba=$;_=62}else{da=$;ea=a;fa=X;ga=$}}else{ba=32;_=62}if((_|0)==62){_=0;da=ba+ -32|0;ea=X;fa=0;ga=ba}a=fa<<32-da|ea>>>da;X=fa>>>da;W=W+m|0;Y=ga+Y|0}i=f;return}function O1a(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0;k=i;i=i+720|0;l=k+456|0;m=k+228|0;n=k;c[n>>2]=a;o=0-b|0;a:do{if((e|0)==1&(f|0)==0){p=a;q=g;r=h;s=1;t=18}else{u=g;v=a;w=h;x=e;y=f;z=a;A=1;while(1){B=v+(0-(c[j+(u<<2)>>2]|0))|0;if((dd[d&511](B,z)|0)<1){p=v;q=u;r=w;s=A;t=18;break a}if((w|0)==0&(u|0)>1){C=c[j+(u+ -2<<2)>>2]|0;if((dd[d&511](v+o|0,B)|0)>-1){D=v;E=u;F=A;break a}if((dd[d&511](v+(0-(C+b))|0,B)|0)>-1){D=v;E=u;F=A;break a}}C=A+1|0;c[n+(A<<2)>>2]=B;G=x+ -1|0;if((G|0)!=0){if((G&1|0)==0){H=G;G=0;do{G=G+1|0;H=H>>>1}while((H&1|0)==0);if((G|0)!=0){I=G}else{t=10}}else{t=10}if((t|0)==10){t=0;if((y|0)!=0){if((y&1|0)==0){H=y;J=0;while(1){K=J+1|0;H=H>>>1;if((H&1|0)!=0){L=K;break}else{J=K}}}else{L=0}}else{L=32}I=(L|0)==0?0:L+32|0}if(I>>>0>31){M=I;t=15}else{N=I;O=x;P=y;Q=I}}else{M=32;t=15}if((t|0)==15){t=0;N=M+ -32|0;O=y;P=0;Q=M}J=P<<32-N|O>>>N;H=P>>>N;G=Q+u|0;if((J|0)==1&(H|0)==0){D=B;E=G;F=C;break a}u=G;v=B;w=0;x=J;y=H;z=c[n>>2]|0;A=C}}}while(0);if((t|0)==18){if((r|0)==0){D=p;E=q;F=s}else{i=k;return}}b:do{if((F|0)>=2?(s=n+(F<<2)|0,c[s>>2]=l,(b|0)!=0):0){if((F|0)>0){R=b;S=l}else{q=b>>>0>256?256:b;p=c[n>>2]|0;c3a(l|0,p|0,q|0)|0;if((q|0)==(b|0)){break}else{T=b;U=q}while(1){T=T-U|0;U=T>>>0>256?256:T;c3a(l|0,p|0,U|0)|0;if((T|0)==(U|0)){break b}}}while(1){p=R>>>0>256?256:R;q=c[n>>2]|0;c3a(S|0,q|0,p|0)|0;r=q;q=0;do{t=q;q=q+1|0;Q=r;r=c[n+(q<<2)>>2]|0;c3a(Q|0,r|0,p|0)|0;c[n+(t<<2)>>2]=Q+p}while((q|0)!=(F|0));if((R|0)==(p|0)){break b}R=R-p|0;S=c[s>>2]|0}}}while(0);c[m>>2]=D;c:do{if((E|0)>1){S=E;R=D;F=D;n=1;while(1){U=R+o|0;T=S+ -2|0;s=R+(0-((c[j+(T<<2)>>2]|0)+b))|0;if((dd[d&511](F,s)|0)>-1?(dd[d&511](F,U)|0)>-1:0){V=n;break}q=n+1|0;r=m+(n<<2)|0;if((dd[d&511](s,U)|0)>-1){c[r>>2]=s;W=s;X=S+ -1|0}else{c[r>>2]=U;W=U;X=T}if((X|0)<=1){V=q;break}S=X;R=W;F=c[m>>2]|0;n=q}if((V|0)>=2?(n=m+(V<<2)|0,c[n>>2]=l,(b|0)!=0):0){if((V|0)>0){Y=b;Z=l}else{F=b>>>0>256?256:b;R=c[m>>2]|0;c3a(l|0,R|0,F|0)|0;if((F|0)==(b|0)){_=l;break}else{$=b;aa=F}while(1){$=$-aa|0;aa=$>>>0>256?256:$;c3a(l|0,R|0,aa|0)|0;if(($|0)==(aa|0)){_=l;break c}}}while(1){R=Y>>>0>256?256:Y;F=c[m>>2]|0;c3a(Z|0,F|0,R|0)|0;S=F;F=0;do{q=F;F=F+1|0;T=S;S=c[m+(F<<2)>>2]|0;c3a(T|0,S|0,R|0)|0;c[m+(q<<2)>>2]=T+R}while((F|0)!=(V|0));if((Y|0)==(R|0)){_=l;break c}Y=Y-R|0;Z=c[n>>2]|0}}else{_=l}}else{_=l}}while(0);i=k;return}function P1a(b,c){b=b|0;c=c|0;var d=0,e=0;d=i;e=Q1a(b,c)|0;i=d;return((a[e>>0]|0)==(c&255)<<24>>24?e:0)|0}function Q1a(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;f=d&255;if((f|0)==0){g=b+(Y2a(b|0)|0)|0;i=e;return g|0}a:do{if((b&3|0)!=0){h=d&255;j=b;while(1){k=a[j>>0]|0;if(k<<24>>24==0){g=j;l=13;break}m=j+1|0;if(k<<24>>24==h<<24>>24){g=j;l=13;break}if((m&3|0)==0){n=m;break a}else{j=m}}if((l|0)==13){i=e;return g|0}}else{n=b}}while(0);b=ca(f,16843009)|0;f=c[n>>2]|0;b:do{if(((f&-2139062144^-2139062144)&f+ -16843009|0)==0){l=f;j=n;while(1){h=l^b;m=j+4|0;if(((h&-2139062144^-2139062144)&h+ -16843009|0)!=0){o=j;break b}l=c[m>>2]|0;if(((l&-2139062144^-2139062144)&l+ -16843009|0)!=0){o=m;break}else{j=m}}}else{o=n}}while(0);n=d&255;d=o;while(1){o=a[d>>0]|0;if(o<<24>>24==0?1:o<<24>>24==n<<24>>24){g=d;break}else{d=d+1|0}}i=e;return g|0}function R1a(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0;f=i;i=i+1056|0;g=f+1024|0;h=f;j=a[e>>0]|0;if(j<<24>>24==0){k=b;i=f;return k|0}l=P1a(b,j<<24>>24)|0;if((l|0)==0){k=0;i=f;return k|0}b=a[e+1>>0]|0;if(b<<24>>24==0){k=l;i=f;return k|0}m=l+1|0;n=a[m>>0]|0;if(n<<24>>24==0){k=0;i=f;return k|0}o=a[e+2>>0]|0;if(o<<24>>24==0){p=b&255|(j&255)<<8;q=m;m=n;r=d[l>>0]<<8|n&255;while(1){s=r&65535;if((s|0)==(p|0)){t=q;u=m;break}v=q+1|0;w=a[v>>0]|0;if(w<<24>>24==0){t=v;u=0;break}else{q=v;m=w;r=w&255|s<<8}}k=u<<24>>24==0?0:t+ -1|0;i=f;return k|0}t=l+2|0;u=a[t>>0]|0;if(u<<24>>24==0){k=0;i=f;return k|0}r=a[e+3>>0]|0;if(r<<24>>24==0){m=(b&255)<<16|(j&255)<<24|(o&255)<<8;q=(u&255)<<8|(n&255)<<16|d[l>>0]<<24;if((q|0)==(m|0)){x=t;y=0}else{p=t;t=q;while(1){q=p+1|0;s=a[q>>0]|0;t=(s&255|t)<<8;w=s<<24>>24==0;if(w|(t|0)==(m|0)){x=q;y=w;break}else{p=q}}}k=y?0:x+ -2|0;i=f;return k|0}x=l+3|0;y=a[x>>0]|0;if(y<<24>>24==0){k=0;i=f;return k|0}if((a[e+4>>0]|0)==0){p=(b&255)<<16|(j&255)<<24|(o&255)<<8|r&255;r=(u&255)<<8|(n&255)<<16|y&255|d[l>>0]<<24;if((r|0)==(p|0)){z=x;A=0}else{y=x;x=r;while(1){r=y+1|0;n=a[r>>0]|0;x=n&255|x<<8;u=n<<24>>24==0;if(u|(x|0)==(p|0)){z=r;A=u;break}else{y=r}}}k=A?0:z+ -3|0;i=f;return k|0}c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;c[g+20>>2]=0;c[g+24>>2]=0;c[g+28>>2]=0;z=j;j=0;while(1){if((a[l+j>>0]|0)==0){k=0;B=79;break}A=z&255;y=g+(A>>>5<<2)|0;c[y>>2]=c[y>>2]|1<<(A&31);C=j+1|0;c[h+(A<<2)>>2]=C;z=a[e+C>>0]|0;if(z<<24>>24==0){break}else{j=C}}if((B|0)==79){i=f;return k|0}a:do{if(C>>>0>1){z=1;A=-1;y=0;b:while(1){p=z;x=y;r=1;while(1){u=p;D=x;c:while(1){E=u;n=1;while(1){F=a[e+(n+A)>>0]|0;G=a[e+E>>0]|0;if(!(F<<24>>24==G<<24>>24)){break c}if((n|0)==(r|0)){break}n=n+1|0;o=n+D|0;if(!(o>>>0<C>>>0)){H=A;I=r;break b}else{E=o}}n=D+r|0;u=n+1|0;if(!(u>>>0<C>>>0)){H=A;I=r;break b}else{D=n}}u=E-A|0;if(!((F&255)>(G&255))){break}p=E+1|0;if(!(p>>>0<C>>>0)){H=A;I=u;break b}else{x=E;r=u}}z=D+2|0;if(!(z>>>0<C>>>0)){H=D;I=1;break}else{A=D;y=D+1|0}}y=1;A=-1;z=0;while(1){r=y;x=z;p=1;while(1){u=r;J=x;d:while(1){K=u;n=1;while(1){L=a[e+(n+A)>>0]|0;M=a[e+K>>0]|0;if(!(L<<24>>24==M<<24>>24)){break d}if((n|0)==(p|0)){break}n=n+1|0;o=n+J|0;if(!(o>>>0<C>>>0)){N=H;O=A;P=I;Q=p;break a}else{K=o}}n=J+p|0;u=n+1|0;if(!(u>>>0<C>>>0)){N=H;O=A;P=I;Q=p;break a}else{J=n}}u=K-A|0;if(!((L&255)<(M&255))){break}r=K+1|0;if(!(r>>>0<C>>>0)){N=H;O=A;P=I;Q=u;break a}else{x=K;p=u}}y=J+2|0;if(!(y>>>0<C>>>0)){N=H;O=J;P=I;Q=1;break}else{A=J;z=J+1|0}}}else{N=-1;O=-1;P=1;Q=1}}while(0);J=(O+1|0)>>>0>(N+1|0)>>>0;I=J?Q:P;P=J?O:N;N=P+1|0;if((Q2a(e,e+I|0,N)|0)==0){O=C-I|0;J=C|63;if((C|0)!=(I|0)){Q=l;H=0;K=l;e:while(1){M=Q;do{if((K-M|0)>>>0<C>>>0){L=P2a(K,0,J)|0;if((L|0)!=0){if((L-M|0)>>>0<C>>>0){k=0;B=79;break e}else{R=L;break}}else{R=K+J|0;break}}else{R=K}}while(0);M=d[Q+j>>0]|0;if((1<<(M&31)&c[g+(M>>>5<<2)>>2]|0)==0){Q=Q+C|0;H=0;K=R;continue}L=c[h+(M<<2)>>2]|0;M=C-L|0;if((C|0)!=(L|0)){Q=Q+((H|0)!=0&M>>>0<I>>>0?O:M)|0;H=0;K=R;continue}M=N>>>0>H>>>0?N:H;L=a[e+M>>0]|0;f:do{if(L<<24>>24==0){S=N}else{D=L;E=M;while(1){G=E+1|0;if(!(D<<24>>24==(a[Q+E>>0]|0))){break}D=a[e+G>>0]|0;if(D<<24>>24==0){S=N;break f}else{E=G}}Q=Q+(E-P)|0;H=0;K=R;continue e}}while(0);do{if(!(S>>>0>H>>>0)){k=Q;B=79;break e}S=S+ -1|0}while((a[e+S>>0]|0)==(a[Q+S>>0]|0));Q=Q+I|0;H=O;K=R}if((B|0)==79){i=f;return k|0}}else{T=J;U=C}}else{J=C-P+ -1|0;T=C|63;U=(P>>>0>J>>>0?P:J)+1|0}J=e+N|0;R=l;K=l;g:while(1){l=R;do{if((K-l|0)>>>0<C>>>0){O=P2a(K,0,T)|0;if((O|0)!=0){if((O-l|0)>>>0<C>>>0){k=0;B=79;break g}else{V=O;break}}else{V=K+T|0;break}}else{V=K}}while(0);l=d[R+j>>0]|0;if((1<<(l&31)&c[g+(l>>>5<<2)>>2]|0)==0){R=R+C|0;K=V;continue}O=c[h+(l<<2)>>2]|0;if((C|0)!=(O|0)){R=R+(C-O)|0;K=V;continue}O=a[J>>0]|0;h:do{if(O<<24>>24==0){W=N}else{l=O;H=N;while(1){I=H+1|0;if(!(l<<24>>24==(a[R+H>>0]|0))){break}l=a[e+I>>0]|0;if(l<<24>>24==0){W=N;break h}else{H=I}}R=R+(H-P)|0;K=V;continue g}}while(0);do{if((W|0)==0){k=R;B=79;break g}W=W+ -1|0}while((a[e+W>>0]|0)==(a[R+W>>0]|0));R=R+U|0;K=V}if((B|0)==79){i=f;return k|0}return 0}function S1a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;if((b|0)==0){e=a+((T1a(a)|0)<<2)|0;i=d;return e|0}else{f=a}while(1){g=c[f>>2]|0;if((g|0)==0|(g|0)==(b|0)){break}else{f=f+4|0}}e=(g|0)!=0?f:0;i=d;return e|0}function T1a(a){a=a|0;var b=0,d=0;b=i;d=a;while(1){if((c[d>>2]|0)==0){break}else{d=d+4|0}}i=b;return d-a>>2|0}function U1a(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;c[e>>2]=b;b=c[q>>2]|0;Pb(b|0,a|0,e|0)|0;vc(10,b|0)|0;ec()}function V1a(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0;a=i;i=i+16|0;b=a;d=a+12|0;a=W1a()|0;if((a|0)==0){U1a(1306096,b)}e=c[a>>2]|0;if((e|0)==0){U1a(1306096,b)}a=e+48|0;f=c[a>>2]|0;g=c[a+4>>2]|0;if(!((f&-256|0)==1126902528&(g|0)==1129074247)){c[b>>2]=1305944;U1a(1306056,b)}if((f|0)==1126902529&(g|0)==1129074247){h=c[e+44>>2]|0}else{h=e+80|0}c[d>>2]=h;h=c[e>>2]|0;e=c[h+4>>2]|0;if(m2a(1306488,h,d)|0){h=c[d>>2]|0;d=Lc[c[(c[h>>2]|0)+8>>2]&255](h)|0;c[b>>2]=1305944;c[b+4>>2]=e;c[b+8>>2]=d;U1a(1305960,b)}else{c[b>>2]=1305944;c[b+4>>2]=e;U1a(1306008,b)}}function W1a(){var a=0,b=0;a=i;i=i+16|0;if((Fb(1306120,3)|0)==0){b=Zb(c[326528]|0)|0;i=a;return b|0}else{U1a(1306128,a)}return 0}function X1a(){var a=0;a=i;i=i+16|0;if((cc(1306112,582)|0)==0){i=a;return}else{U1a(1306184,a)}}function Y1a(a){a=a|0;var b=0;b=i;i=i+16|0;v2a(a);if((uc(c[326528]|0,0)|0)==0){i=b;return}else{U1a(1306240,b)}}function Z1a(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=(a|0)==0?1:a;a=u2a(d)|0;if((a|0)!=0){e=a;i=b;return e|0}while(1){a=g2a()|0;if((a|0)==0){f=4;break}Xc[a&3]();a=u2a(d)|0;if((a|0)!=0){e=a;f=5;break}}if((f|0)==4){d=Rb(4)|0;c[d>>2]=1306304;wc(d|0,1306352,510)}else if((f|0)==5){i=b;return e|0}return 0}function _1a(a){a=a|0;var b=0,c=0;b=i;c=Z1a(a)|0;i=b;return c|0}function $1a(a){a=a|0;var b=0;b=i;if((a|0)!=0){v2a(a)}i=b;return}function a2a(a){a=a|0;var b=0;b=i;$1a(a);i=b;return}function b2a(a){a=a|0;var b=0;b=i;$1a(a);i=b;return}function c2a(a){a=a|0;return}function d2a(a){a=a|0;return 1306320}function e2a(a){a=a|0;var b=0;b=i;i=i+16|0;Xc[a&3]();U1a(1306368,b)}function f2a(){var a=0,b=0;a=W1a()|0;if(((a|0)!=0?(b=c[a>>2]|0,(b|0)!=0):0)?(a=b+48|0,(c[a>>2]&-256|0)==1126902528?(c[a+4>>2]|0)==1129074247:0):0){e2a(c[b+12>>2]|0)}b=c[326484]|0;c[326484]=b+0;e2a(b)}function g2a(){var a=0;a=c[326616]|0;c[326616]=a+0;return a|0}function h2a(a){a=a|0;return}function i2a(a){a=a|0;return}function j2a(a){a=a|0;return}function k2a(a){a=a|0;var b=0;b=i;$1a(a);i=b;return}function l2a(a){a=a|0;var b=0;b=i;$1a(a);i=b;return}function m2a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+64|0;f=e;if((a|0)==(b|0)){g=1;i=e;return g|0}if((b|0)==0){g=0;i=e;return g|0}h=p2a(b,1306616)|0;if((h|0)==0){g=0;i=e;return g|0}b=f+0|0;j=b+56|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(j|0));c[f>>2]=h;c[f+8>>2]=a;c[f+12>>2]=-1;c[f+48>>2]=1;pd[c[(c[h>>2]|0)+28>>2]&127](h,f,c[d>>2]|0,1);if((c[f+24>>2]|0)!=1){g=0;i=e;return g|0}c[d>>2]=c[f+16>>2];g=1;i=e;return g|0}function n2a(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=i;if((c[d+8>>2]|0)!=(b|0)){i=g;return}b=d+16|0;h=c[b>>2]|0;if((h|0)==0){c[b>>2]=e;c[d+24>>2]=f;c[d+36>>2]=1;i=g;return}if((h|0)!=(e|0)){e=d+36|0;c[e>>2]=(c[e>>2]|0)+1;c[d+24>>2]=2;a[d+54>>0]=1;i=g;return}e=d+24|0;if((c[e>>2]|0)!=2){i=g;return}c[e>>2]=f;i=g;return}function o2a(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=i;if((b|0)!=(c[d+8>>2]|0)){h=c[b+8>>2]|0;pd[c[(c[h>>2]|0)+28>>2]&127](h,d,e,f);i=g;return}h=d+16|0;b=c[h>>2]|0;if((b|0)==0){c[h>>2]=e;c[d+24>>2]=f;c[d+36>>2]=1;i=g;return}if((b|0)!=(e|0)){e=d+36|0;c[e>>2]=(c[e>>2]|0)+1;c[d+24>>2]=2;a[d+54>>0]=1;i=g;return}e=d+24|0;if((c[e>>2]|0)!=2){i=g;return}c[e>>2]=f;i=g;return}function p2a(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=i;i=i+64|0;g=f;h=c[d>>2]|0;j=d+(c[h+ -8>>2]|0)|0;k=c[h+ -4>>2]|0;c[g>>2]=e;c[g+4>>2]=d;c[g+8>>2]=1306560;d=g+12|0;h=g+16|0;l=g+20|0;m=g+24|0;n=g+28|0;o=g+32|0;p=g+40|0;q=(k|0)==(e|0);e=d+0|0;r=e+40|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(r|0));b[d+40>>1]=0;a[d+42>>0]=0;do{if(q){c[g+48>>2]=1;Tc[c[(c[k>>2]|0)+20>>2]&31](k,g,j,j,1,0);s=(c[m>>2]|0)==1?j:0}else{Fc[c[(c[k>>2]|0)+24>>2]&63](k,g,j,1,0);d=c[g+36>>2]|0;if((d|0)==0){if((c[p>>2]|0)!=1){s=0;break}if((c[n>>2]|0)!=1){s=0;break}s=(c[o>>2]|0)==1?c[l>>2]|0:0;break}else if((d|0)!=1){s=0;break}if((c[m>>2]|0)!=1){if((c[p>>2]|0)!=0){s=0;break}if((c[n>>2]|0)!=1){s=0;break}if((c[o>>2]|0)!=1){s=0;break}}s=c[h>>2]|0}}while(0);i=f;return s|0}function q2a(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;h=i;if((b|0)==(c[d+8>>2]|0)){if((c[d+4>>2]|0)!=(e|0)){i=h;return}j=d+28|0;if((c[j>>2]|0)==1){i=h;return}c[j>>2]=f;i=h;return}if((b|0)!=(c[d>>2]|0)){j=c[b+8>>2]|0;Fc[c[(c[j>>2]|0)+24>>2]&63](j,d,e,f,g);i=h;return}if((c[d+16>>2]|0)!=(e|0)?(j=d+20|0,(c[j>>2]|0)!=(e|0)):0){c[d+32>>2]=f;k=d+44|0;if((c[k>>2]|0)==4){i=h;return}l=d+52|0;a[l>>0]=0;m=d+53|0;a[m>>0]=0;n=c[b+8>>2]|0;Tc[c[(c[n>>2]|0)+20>>2]&31](n,d,e,e,1,g);if((a[m>>0]|0)!=0){if((a[l>>0]|0)==0){o=1;p=13}}else{o=0;p=13}do{if((p|0)==13){c[j>>2]=e;l=d+40|0;c[l>>2]=(c[l>>2]|0)+1;if((c[d+36>>2]|0)==1?(c[d+24>>2]|0)==2:0){a[d+54>>0]=1;if(o){break}}else{p=16}if((p|0)==16?o:0){break}c[k>>2]=4;i=h;return}}while(0);c[k>>2]=3;i=h;return}if((f|0)!=1){i=h;return}c[d+32>>2]=1;i=h;return}function r2a(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;g=i;if((c[d+8>>2]|0)==(b|0)){if((c[d+4>>2]|0)!=(e|0)){i=g;return}h=d+28|0;if((c[h>>2]|0)==1){i=g;return}c[h>>2]=f;i=g;return}if((c[d>>2]|0)!=(b|0)){i=g;return}if((c[d+16>>2]|0)!=(e|0)?(b=d+20|0,(c[b>>2]|0)!=(e|0)):0){c[d+32>>2]=f;c[b>>2]=e;e=d+40|0;c[e>>2]=(c[e>>2]|0)+1;if((c[d+36>>2]|0)==1?(c[d+24>>2]|0)==2:0){a[d+54>>0]=1}c[d+44>>2]=4;i=g;return}if((f|0)!=1){i=g;return}c[d+32>>2]=1;i=g;return}function s2a(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0;j=i;if((b|0)!=(c[d+8>>2]|0)){k=c[b+8>>2]|0;Tc[c[(c[k>>2]|0)+20>>2]&31](k,d,e,f,g,h);i=j;return}a[d+53>>0]=1;if((c[d+4>>2]|0)!=(f|0)){i=j;return}a[d+52>>0]=1;f=d+16|0;h=c[f>>2]|0;if((h|0)==0){c[f>>2]=e;c[d+24>>2]=g;c[d+36>>2]=1;if(!((g|0)==1?(c[d+48>>2]|0)==1:0)){i=j;return}a[d+54>>0]=1;i=j;return}if((h|0)!=(e|0)){e=d+36|0;c[e>>2]=(c[e>>2]|0)+1;a[d+54>>0]=1;i=j;return}e=d+24|0;h=c[e>>2]|0;if((h|0)==2){c[e>>2]=g;l=g}else{l=h}if(!((l|0)==1?(c[d+48>>2]|0)==1:0)){i=j;return}a[d+54>>0]=1;i=j;return}function t2a(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0;h=i;if((c[d+8>>2]|0)!=(b|0)){i=h;return}a[d+53>>0]=1;if((c[d+4>>2]|0)!=(f|0)){i=h;return}a[d+52>>0]=1;f=d+16|0;b=c[f>>2]|0;if((b|0)==0){c[f>>2]=e;c[d+24>>2]=g;c[d+36>>2]=1;if(!((g|0)==1?(c[d+48>>2]|0)==1:0)){i=h;return}a[d+54>>0]=1;i=h;return}if((b|0)!=(e|0)){e=d+36|0;c[e>>2]=(c[e>>2]|0)+1;a[d+54>>0]=1;i=h;return}e=d+24|0;b=c[e>>2]|0;if((b|0)==2){c[e>>2]=g;j=g}else{j=b}if(!((j|0)==1?(c[d+48>>2]|0)==1:0)){i=h;return}a[d+54>>0]=1;i=h;return}function u2a(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0;b=i;do{if(a>>>0<245){if(a>>>0<11){d=16}else{d=a+11&-8}e=d>>>3;f=c[326692]|0;g=f>>>e;if((g&3|0)!=0){h=(g&1^1)+e|0;j=h<<1;k=1306808+(j<<2)|0;l=1306808+(j+2<<2)|0;j=c[l>>2]|0;m=j+8|0;n=c[m>>2]|0;do{if((k|0)!=(n|0)){if(n>>>0<(c[1306784>>2]|0)>>>0){ec()}o=n+12|0;if((c[o>>2]|0)==(j|0)){c[o>>2]=k;c[l>>2]=n;break}else{ec()}}else{c[326692]=f&~(1<<h)}}while(0);n=h<<3;c[j+4>>2]=n|3;l=j+(n|4)|0;c[l>>2]=c[l>>2]|1;p=m;i=b;return p|0}if(d>>>0>(c[1306776>>2]|0)>>>0){if((g|0)!=0){l=2<<e;n=g<<e&(l|0-l);l=(n&0-n)+ -1|0;n=l>>>12&16;k=l>>>n;l=k>>>5&8;o=k>>>l;k=o>>>2&4;q=o>>>k;o=q>>>1&2;r=q>>>o;q=r>>>1&1;s=(l|n|k|o|q)+(r>>>q)|0;q=s<<1;r=1306808+(q<<2)|0;o=1306808+(q+2<<2)|0;q=c[o>>2]|0;k=q+8|0;n=c[k>>2]|0;do{if((r|0)!=(n|0)){if(n>>>0<(c[1306784>>2]|0)>>>0){ec()}l=n+12|0;if((c[l>>2]|0)==(q|0)){c[l>>2]=r;c[o>>2]=n;break}else{ec()}}else{c[326692]=f&~(1<<s)}}while(0);f=s<<3;n=f-d|0;c[q+4>>2]=d|3;o=q+d|0;c[q+(d|4)>>2]=n|1;c[q+f>>2]=n;f=c[1306776>>2]|0;if((f|0)!=0){r=c[1306788>>2]|0;e=f>>>3;f=e<<1;g=1306808+(f<<2)|0;m=c[326692]|0;j=1<<e;if((m&j|0)!=0){e=1306808+(f+2<<2)|0;h=c[e>>2]|0;if(h>>>0<(c[1306784>>2]|0)>>>0){ec()}else{t=e;u=h}}else{c[326692]=m|j;t=1306808+(f+2<<2)|0;u=g}c[t>>2]=r;c[u+12>>2]=r;c[r+8>>2]=u;c[r+12>>2]=g}c[1306776>>2]=n;c[1306788>>2]=o;p=k;i=b;return p|0}o=c[1306772>>2]|0;if((o|0)!=0){n=(o&0-o)+ -1|0;o=n>>>12&16;g=n>>>o;n=g>>>5&8;r=g>>>n;g=r>>>2&4;f=r>>>g;r=f>>>1&2;j=f>>>r;f=j>>>1&1;m=c[1307072+((n|o|g|r|f)+(j>>>f)<<2)>>2]|0;f=(c[m+4>>2]&-8)-d|0;j=m;r=m;while(1){m=c[j+16>>2]|0;if((m|0)==0){g=c[j+20>>2]|0;if((g|0)==0){break}else{v=g}}else{v=m}m=(c[v+4>>2]&-8)-d|0;g=m>>>0<f>>>0;f=g?m:f;j=v;r=g?v:r}j=c[1306784>>2]|0;if(r>>>0<j>>>0){ec()}k=r+d|0;if(!(r>>>0<k>>>0)){ec()}q=c[r+24>>2]|0;s=c[r+12>>2]|0;do{if((s|0)==(r|0)){g=r+20|0;m=c[g>>2]|0;if((m|0)==0){o=r+16|0;n=c[o>>2]|0;if((n|0)==0){w=0;break}else{x=n;y=o}}else{x=m;y=g}while(1){g=x+20|0;m=c[g>>2]|0;if((m|0)!=0){x=m;y=g;continue}g=x+16|0;m=c[g>>2]|0;if((m|0)==0){break}else{x=m;y=g}}if(y>>>0<j>>>0){ec()}else{c[y>>2]=0;w=x;break}}else{g=c[r+8>>2]|0;if(g>>>0<j>>>0){ec()}m=g+12|0;if((c[m>>2]|0)!=(r|0)){ec()}o=s+8|0;if((c[o>>2]|0)==(r|0)){c[m>>2]=s;c[o>>2]=g;w=s;break}else{ec()}}}while(0);do{if((q|0)!=0){s=c[r+28>>2]|0;j=1307072+(s<<2)|0;if((r|0)==(c[j>>2]|0)){c[j>>2]=w;if((w|0)==0){c[1306772>>2]=c[1306772>>2]&~(1<<s);break}}else{if(q>>>0<(c[1306784>>2]|0)>>>0){ec()}s=q+16|0;if((c[s>>2]|0)==(r|0)){c[s>>2]=w}else{c[q+20>>2]=w}if((w|0)==0){break}}if(w>>>0<(c[1306784>>2]|0)>>>0){ec()}c[w+24>>2]=q;s=c[r+16>>2]|0;do{if((s|0)!=0){if(s>>>0<(c[1306784>>2]|0)>>>0){ec()}else{c[w+16>>2]=s;c[s+24>>2]=w;break}}}while(0);s=c[r+20>>2]|0;if((s|0)!=0){if(s>>>0<(c[1306784>>2]|0)>>>0){ec()}else{c[w+20>>2]=s;c[s+24>>2]=w;break}}}}while(0);if(f>>>0<16){q=f+d|0;c[r+4>>2]=q|3;s=r+(q+4)|0;c[s>>2]=c[s>>2]|1}else{c[r+4>>2]=d|3;c[r+(d|4)>>2]=f|1;c[r+(f+d)>>2]=f;s=c[1306776>>2]|0;if((s|0)!=0){q=c[1306788>>2]|0;j=s>>>3;s=j<<1;g=1306808+(s<<2)|0;o=c[326692]|0;m=1<<j;if((o&m|0)!=0){j=1306808+(s+2<<2)|0;n=c[j>>2]|0;if(n>>>0<(c[1306784>>2]|0)>>>0){ec()}else{z=j;A=n}}else{c[326692]=o|m;z=1306808+(s+2<<2)|0;A=g}c[z>>2]=q;c[A+12>>2]=q;c[q+8>>2]=A;c[q+12>>2]=g}c[1306776>>2]=f;c[1306788>>2]=k}p=r+8|0;i=b;return p|0}else{B=d}}else{B=d}}else{if(!(a>>>0>4294967231)){g=a+11|0;q=g&-8;s=c[1306772>>2]|0;if((s|0)!=0){m=0-q|0;o=g>>>8;if((o|0)!=0){if(q>>>0>16777215){C=31}else{g=(o+1048320|0)>>>16&8;n=o<<g;o=(n+520192|0)>>>16&4;j=n<<o;n=(j+245760|0)>>>16&2;h=14-(o|g|n)+(j<<n>>>15)|0;C=q>>>(h+7|0)&1|h<<1}}else{C=0}h=c[1307072+(C<<2)>>2]|0;a:do{if((h|0)==0){D=m;E=0;F=0}else{if((C|0)==31){G=0}else{G=25-(C>>>1)|0}n=m;j=0;g=q<<G;o=h;e=0;while(1){l=c[o+4>>2]&-8;H=l-q|0;if(H>>>0<n>>>0){if((l|0)==(q|0)){D=H;E=o;F=o;break a}else{I=H;J=o}}else{I=n;J=e}H=c[o+20>>2]|0;o=c[o+(g>>>31<<2)+16>>2]|0;l=(H|0)==0|(H|0)==(o|0)?j:H;if((o|0)==0){D=I;E=l;F=J;break}else{n=I;j=l;g=g<<1;e=J}}}}while(0);if((E|0)==0&(F|0)==0){h=2<<C;m=s&(h|0-h);if((m|0)==0){B=q;break}h=(m&0-m)+ -1|0;m=h>>>12&16;r=h>>>m;h=r>>>5&8;k=r>>>h;r=k>>>2&4;f=k>>>r;k=f>>>1&2;e=f>>>k;f=e>>>1&1;K=c[1307072+((h|m|r|k|f)+(e>>>f)<<2)>>2]|0}else{K=E}if((K|0)==0){L=D;M=F}else{f=D;e=K;k=F;while(1){r=(c[e+4>>2]&-8)-q|0;m=r>>>0<f>>>0;h=m?r:f;r=m?e:k;m=c[e+16>>2]|0;if((m|0)!=0){f=h;e=m;k=r;continue}e=c[e+20>>2]|0;if((e|0)==0){L=h;M=r;break}else{f=h;k=r}}}if((M|0)!=0?L>>>0<((c[1306776>>2]|0)-q|0)>>>0:0){k=c[1306784>>2]|0;if(M>>>0<k>>>0){ec()}f=M+q|0;if(!(M>>>0<f>>>0)){ec()}e=c[M+24>>2]|0;s=c[M+12>>2]|0;do{if((s|0)==(M|0)){r=M+20|0;h=c[r>>2]|0;if((h|0)==0){m=M+16|0;g=c[m>>2]|0;if((g|0)==0){N=0;break}else{O=g;P=m}}else{O=h;P=r}while(1){r=O+20|0;h=c[r>>2]|0;if((h|0)!=0){O=h;P=r;continue}r=O+16|0;h=c[r>>2]|0;if((h|0)==0){break}else{O=h;P=r}}if(P>>>0<k>>>0){ec()}else{c[P>>2]=0;N=O;break}}else{r=c[M+8>>2]|0;if(r>>>0<k>>>0){ec()}h=r+12|0;if((c[h>>2]|0)!=(M|0)){ec()}m=s+8|0;if((c[m>>2]|0)==(M|0)){c[h>>2]=s;c[m>>2]=r;N=s;break}else{ec()}}}while(0);do{if((e|0)!=0){s=c[M+28>>2]|0;k=1307072+(s<<2)|0;if((M|0)==(c[k>>2]|0)){c[k>>2]=N;if((N|0)==0){c[1306772>>2]=c[1306772>>2]&~(1<<s);break}}else{if(e>>>0<(c[1306784>>2]|0)>>>0){ec()}s=e+16|0;if((c[s>>2]|0)==(M|0)){c[s>>2]=N}else{c[e+20>>2]=N}if((N|0)==0){break}}if(N>>>0<(c[1306784>>2]|0)>>>0){ec()}c[N+24>>2]=e;s=c[M+16>>2]|0;do{if((s|0)!=0){if(s>>>0<(c[1306784>>2]|0)>>>0){ec()}else{c[N+16>>2]=s;c[s+24>>2]=N;break}}}while(0);s=c[M+20>>2]|0;if((s|0)!=0){if(s>>>0<(c[1306784>>2]|0)>>>0){ec()}else{c[N+20>>2]=s;c[s+24>>2]=N;break}}}}while(0);b:do{if(!(L>>>0<16)){c[M+4>>2]=q|3;c[M+(q|4)>>2]=L|1;c[M+(L+q)>>2]=L;e=L>>>3;if(L>>>0<256){s=e<<1;k=1306808+(s<<2)|0;r=c[326692]|0;m=1<<e;do{if((r&m|0)==0){c[326692]=r|m;Q=1306808+(s+2<<2)|0;R=k}else{e=1306808+(s+2<<2)|0;h=c[e>>2]|0;if(!(h>>>0<(c[1306784>>2]|0)>>>0)){Q=e;R=h;break}ec()}}while(0);c[Q>>2]=f;c[R+12>>2]=f;c[M+(q+8)>>2]=R;c[M+(q+12)>>2]=k;break}s=L>>>8;if((s|0)!=0){if(L>>>0>16777215){S=31}else{m=(s+1048320|0)>>>16&8;r=s<<m;s=(r+520192|0)>>>16&4;h=r<<s;r=(h+245760|0)>>>16&2;e=14-(s|m|r)+(h<<r>>>15)|0;S=L>>>(e+7|0)&1|e<<1}}else{S=0}e=1307072+(S<<2)|0;c[M+(q+28)>>2]=S;c[M+(q+20)>>2]=0;c[M+(q+16)>>2]=0;r=c[1306772>>2]|0;h=1<<S;if((r&h|0)==0){c[1306772>>2]=r|h;c[e>>2]=f;c[M+(q+24)>>2]=e;c[M+(q+12)>>2]=f;c[M+(q+8)>>2]=f;break}h=c[e>>2]|0;if((S|0)==31){T=0}else{T=25-(S>>>1)|0}c:do{if((c[h+4>>2]&-8|0)!=(L|0)){e=L<<T;r=h;while(1){U=r+(e>>>31<<2)+16|0;m=c[U>>2]|0;if((m|0)==0){break}if((c[m+4>>2]&-8|0)==(L|0)){V=m;break c}else{e=e<<1;r=m}}if(U>>>0<(c[1306784>>2]|0)>>>0){ec()}else{c[U>>2]=f;c[M+(q+24)>>2]=r;c[M+(q+12)>>2]=f;c[M+(q+8)>>2]=f;break b}}else{V=h}}while(0);h=V+8|0;k=c[h>>2]|0;e=c[1306784>>2]|0;if(V>>>0<e>>>0){ec()}if(k>>>0<e>>>0){ec()}else{c[k+12>>2]=f;c[h>>2]=f;c[M+(q+8)>>2]=k;c[M+(q+12)>>2]=V;c[M+(q+24)>>2]=0;break}}else{k=L+q|0;c[M+4>>2]=k|3;h=M+(k+4)|0;c[h>>2]=c[h>>2]|1}}while(0);p=M+8|0;i=b;return p|0}else{B=q}}else{B=q}}else{B=-1}}}while(0);M=c[1306776>>2]|0;if(!(B>>>0>M>>>0)){L=M-B|0;V=c[1306788>>2]|0;if(L>>>0>15){c[1306788>>2]=V+B;c[1306776>>2]=L;c[V+(B+4)>>2]=L|1;c[V+M>>2]=L;c[V+4>>2]=B|3}else{c[1306776>>2]=0;c[1306788>>2]=0;c[V+4>>2]=M|3;L=V+(M+4)|0;c[L>>2]=c[L>>2]|1}p=V+8|0;i=b;return p|0}V=c[1306780>>2]|0;if(B>>>0<V>>>0){L=V-B|0;c[1306780>>2]=L;V=c[1306792>>2]|0;c[1306792>>2]=V+B;c[V+(B+4)>>2]=L|1;c[V+4>>2]=B|3;p=V+8|0;i=b;return p|0}do{if((c[326810]|0)==0){V=hb(30)|0;if((V+ -1&V|0)==0){c[1307248>>2]=V;c[1307244>>2]=V;c[1307252>>2]=-1;c[1307256>>2]=-1;c[1307260>>2]=0;c[1307212>>2]=0;c[326810]=(Kb(0)|0)&-16^1431655768;break}else{ec()}}}while(0);V=B+48|0;L=c[1307248>>2]|0;M=B+47|0;U=L+M|0;T=0-L|0;L=U&T;if(!(L>>>0>B>>>0)){p=0;i=b;return p|0}S=c[1307208>>2]|0;if((S|0)!=0?(R=c[1307200>>2]|0,Q=R+L|0,Q>>>0<=R>>>0|Q>>>0>S>>>0):0){p=0;i=b;return p|0}d:do{if((c[1307212>>2]&4|0)==0){S=c[1306792>>2]|0;e:do{if((S|0)!=0){Q=1307216|0;while(1){R=c[Q>>2]|0;if(!(R>>>0>S>>>0)?(W=Q+4|0,(R+(c[W>>2]|0)|0)>>>0>S>>>0):0){break}R=c[Q+8>>2]|0;if((R|0)==0){X=182;break e}else{Q=R}}if((Q|0)!=0){R=U-(c[1306780>>2]|0)&T;if(R>>>0<2147483647){N=db(R|0)|0;O=(N|0)==((c[Q>>2]|0)+(c[W>>2]|0)|0);Y=N;Z=R;_=O?N:-1;$=O?R:0;X=191}else{aa=0}}else{X=182}}else{X=182}}while(0);do{if((X|0)==182){S=db(0)|0;if((S|0)!=(-1|0)){q=S;R=c[1307244>>2]|0;O=R+ -1|0;if((O&q|0)==0){ba=L}else{ba=L-q+(O+q&0-R)|0}R=c[1307200>>2]|0;q=R+ba|0;if(ba>>>0>B>>>0&ba>>>0<2147483647){O=c[1307208>>2]|0;if((O|0)!=0?q>>>0<=R>>>0|q>>>0>O>>>0:0){aa=0;break}O=db(ba|0)|0;q=(O|0)==(S|0);Y=O;Z=ba;_=q?S:-1;$=q?ba:0;X=191}else{aa=0}}else{aa=0}}}while(0);f:do{if((X|0)==191){q=0-Z|0;if((_|0)!=(-1|0)){ca=_;da=$;X=202;break d}do{if((Y|0)!=(-1|0)&Z>>>0<2147483647&Z>>>0<V>>>0?(S=c[1307248>>2]|0,O=M-Z+S&0-S,O>>>0<2147483647):0){if((db(O|0)|0)==(-1|0)){db(q|0)|0;aa=$;break f}else{ea=O+Z|0;break}}else{ea=Z}}while(0);if((Y|0)==(-1|0)){aa=$}else{ca=Y;da=ea;X=202;break d}}}while(0);c[1307212>>2]=c[1307212>>2]|4;fa=aa;X=199}else{fa=0;X=199}}while(0);if((((X|0)==199?L>>>0<2147483647:0)?(aa=db(L|0)|0,L=db(0)|0,(L|0)!=(-1|0)&(aa|0)!=(-1|0)&aa>>>0<L>>>0):0)?(ea=L-aa|0,L=ea>>>0>(B+40|0)>>>0,L):0){ca=aa;da=L?ea:fa;X=202}if((X|0)==202){fa=(c[1307200>>2]|0)+da|0;c[1307200>>2]=fa;if(fa>>>0>(c[1307204>>2]|0)>>>0){c[1307204>>2]=fa}fa=c[1306792>>2]|0;g:do{if((fa|0)!=0){ea=1307216|0;while(1){ga=c[ea>>2]|0;ha=ea+4|0;ia=c[ha>>2]|0;if((ca|0)==(ga+ia|0)){X=214;break}L=c[ea+8>>2]|0;if((L|0)==0){break}else{ea=L}}if(((X|0)==214?(c[ea+12>>2]&8|0)==0:0)?fa>>>0>=ga>>>0&fa>>>0<ca>>>0:0){c[ha>>2]=ia+da;L=(c[1306780>>2]|0)+da|0;aa=fa+8|0;if((aa&7|0)==0){ja=0}else{ja=0-aa&7}aa=L-ja|0;c[1306792>>2]=fa+ja;c[1306780>>2]=aa;c[fa+(ja+4)>>2]=aa|1;c[fa+(L+4)>>2]=40;c[1306796>>2]=c[1307256>>2];break}if(ca>>>0<(c[1306784>>2]|0)>>>0){c[1306784>>2]=ca}L=ca+da|0;aa=1307216|0;while(1){if((c[aa>>2]|0)==(L|0)){X=224;break}Y=c[aa+8>>2]|0;if((Y|0)==0){break}else{aa=Y}}if((X|0)==224?(c[aa+12>>2]&8|0)==0:0){c[aa>>2]=ca;L=aa+4|0;c[L>>2]=(c[L>>2]|0)+da;L=ca+8|0;if((L&7|0)==0){ka=0}else{ka=0-L&7}L=ca+(da+8)|0;if((L&7|0)==0){la=0}else{la=0-L&7}L=ca+(la+da)|0;ea=ka+B|0;Y=ca+ea|0;$=L-(ca+ka)-B|0;c[ca+(ka+4)>>2]=B|3;h:do{if((L|0)!=(c[1306792>>2]|0)){if((L|0)==(c[1306788>>2]|0)){Z=(c[1306776>>2]|0)+$|0;c[1306776>>2]=Z;c[1306788>>2]=Y;c[ca+(ea+4)>>2]=Z|1;c[ca+(Z+ea)>>2]=Z;break}Z=da+4|0;M=c[ca+(Z+la)>>2]|0;if((M&3|0)==1){V=M&-8;_=M>>>3;i:do{if(!(M>>>0<256)){ba=c[ca+((la|24)+da)>>2]|0;W=c[ca+(da+12+la)>>2]|0;do{if((W|0)==(L|0)){T=la|16;U=ca+(Z+T)|0;q=c[U>>2]|0;if((q|0)==0){Q=ca+(T+da)|0;T=c[Q>>2]|0;if((T|0)==0){ma=0;break}else{na=T;oa=Q}}else{na=q;oa=U}while(1){U=na+20|0;q=c[U>>2]|0;if((q|0)!=0){na=q;oa=U;continue}U=na+16|0;q=c[U>>2]|0;if((q|0)==0){break}else{na=q;oa=U}}if(oa>>>0<(c[1306784>>2]|0)>>>0){ec()}else{c[oa>>2]=0;ma=na;break}}else{U=c[ca+((la|8)+da)>>2]|0;if(U>>>0<(c[1306784>>2]|0)>>>0){ec()}q=U+12|0;if((c[q>>2]|0)!=(L|0)){ec()}Q=W+8|0;if((c[Q>>2]|0)==(L|0)){c[q>>2]=W;c[Q>>2]=U;ma=W;break}else{ec()}}}while(0);if((ba|0)==0){break}W=c[ca+(da+28+la)>>2]|0;r=1307072+(W<<2)|0;do{if((L|0)!=(c[r>>2]|0)){if(ba>>>0<(c[1306784>>2]|0)>>>0){ec()}U=ba+16|0;if((c[U>>2]|0)==(L|0)){c[U>>2]=ma}else{c[ba+20>>2]=ma}if((ma|0)==0){break i}}else{c[r>>2]=ma;if((ma|0)!=0){break}c[1306772>>2]=c[1306772>>2]&~(1<<W);break i}}while(0);if(ma>>>0<(c[1306784>>2]|0)>>>0){ec()}c[ma+24>>2]=ba;W=la|16;r=c[ca+(W+da)>>2]|0;do{if((r|0)!=0){if(r>>>0<(c[1306784>>2]|0)>>>0){ec()}else{c[ma+16>>2]=r;c[r+24>>2]=ma;break}}}while(0);r=c[ca+(Z+W)>>2]|0;if((r|0)==0){break}if(r>>>0<(c[1306784>>2]|0)>>>0){ec()}else{c[ma+20>>2]=r;c[r+24>>2]=ma;break}}else{r=c[ca+((la|8)+da)>>2]|0;ba=c[ca+(da+12+la)>>2]|0;U=1306808+(_<<1<<2)|0;do{if((r|0)!=(U|0)){if(r>>>0<(c[1306784>>2]|0)>>>0){ec()}if((c[r+12>>2]|0)==(L|0)){break}ec()}}while(0);if((ba|0)==(r|0)){c[326692]=c[326692]&~(1<<_);break}do{if((ba|0)==(U|0)){pa=ba+8|0}else{if(ba>>>0<(c[1306784>>2]|0)>>>0){ec()}W=ba+8|0;if((c[W>>2]|0)==(L|0)){pa=W;break}ec()}}while(0);c[r+12>>2]=ba;c[pa>>2]=r}}while(0);qa=ca+((V|la)+da)|0;ra=V+$|0}else{qa=L;ra=$}_=qa+4|0;c[_>>2]=c[_>>2]&-2;c[ca+(ea+4)>>2]=ra|1;c[ca+(ra+ea)>>2]=ra;_=ra>>>3;if(ra>>>0<256){Z=_<<1;M=1306808+(Z<<2)|0;U=c[326692]|0;W=1<<_;do{if((U&W|0)==0){c[326692]=U|W;sa=1306808+(Z+2<<2)|0;ta=M}else{_=1306808+(Z+2<<2)|0;Q=c[_>>2]|0;if(!(Q>>>0<(c[1306784>>2]|0)>>>0)){sa=_;ta=Q;break}ec()}}while(0);c[sa>>2]=Y;c[ta+12>>2]=Y;c[ca+(ea+8)>>2]=ta;c[ca+(ea+12)>>2]=M;break}Z=ra>>>8;do{if((Z|0)==0){ua=0}else{if(ra>>>0>16777215){ua=31;break}W=(Z+1048320|0)>>>16&8;U=Z<<W;V=(U+520192|0)>>>16&4;Q=U<<V;U=(Q+245760|0)>>>16&2;_=14-(V|W|U)+(Q<<U>>>15)|0;ua=ra>>>(_+7|0)&1|_<<1}}while(0);Z=1307072+(ua<<2)|0;c[ca+(ea+28)>>2]=ua;c[ca+(ea+20)>>2]=0;c[ca+(ea+16)>>2]=0;M=c[1306772>>2]|0;_=1<<ua;if((M&_|0)==0){c[1306772>>2]=M|_;c[Z>>2]=Y;c[ca+(ea+24)>>2]=Z;c[ca+(ea+12)>>2]=Y;c[ca+(ea+8)>>2]=Y;break}_=c[Z>>2]|0;if((ua|0)==31){va=0}else{va=25-(ua>>>1)|0}j:do{if((c[_+4>>2]&-8|0)!=(ra|0)){Z=ra<<va;M=_;while(1){wa=M+(Z>>>31<<2)+16|0;U=c[wa>>2]|0;if((U|0)==0){break}if((c[U+4>>2]&-8|0)==(ra|0)){xa=U;break j}else{Z=Z<<1;M=U}}if(wa>>>0<(c[1306784>>2]|0)>>>0){ec()}else{c[wa>>2]=Y;c[ca+(ea+24)>>2]=M;c[ca+(ea+12)>>2]=Y;c[ca+(ea+8)>>2]=Y;break h}}else{xa=_}}while(0);_=xa+8|0;Z=c[_>>2]|0;r=c[1306784>>2]|0;if(xa>>>0<r>>>0){ec()}if(Z>>>0<r>>>0){ec()}else{c[Z+12>>2]=Y;c[_>>2]=Y;c[ca+(ea+8)>>2]=Z;c[ca+(ea+12)>>2]=xa;c[ca+(ea+24)>>2]=0;break}}else{Z=(c[1306780>>2]|0)+$|0;c[1306780>>2]=Z;c[1306792>>2]=Y;c[ca+(ea+4)>>2]=Z|1}}while(0);p=ca+(ka|8)|0;i=b;return p|0}ea=1307216|0;while(1){ya=c[ea>>2]|0;if(!(ya>>>0>fa>>>0)?(za=c[ea+4>>2]|0,Aa=ya+za|0,Aa>>>0>fa>>>0):0){break}ea=c[ea+8>>2]|0}ea=ya+(za+ -39)|0;if((ea&7|0)==0){Ba=0}else{Ba=0-ea&7}ea=ya+(za+ -47+Ba)|0;Y=ea>>>0<(fa+16|0)>>>0?fa:ea;ea=Y+8|0;$=ca+8|0;if(($&7|0)==0){Ca=0}else{Ca=0-$&7}$=da+ -40-Ca|0;c[1306792>>2]=ca+Ca;c[1306780>>2]=$;c[ca+(Ca+4)>>2]=$|1;c[ca+(da+ -36)>>2]=40;c[1306796>>2]=c[1307256>>2];c[Y+4>>2]=27;c[ea+0>>2]=c[1307216>>2];c[ea+4>>2]=c[1307220>>2];c[ea+8>>2]=c[1307224>>2];c[ea+12>>2]=c[1307228>>2];c[1307216>>2]=ca;c[1307220>>2]=da;c[1307228>>2]=0;c[1307224>>2]=ea;ea=Y+28|0;c[ea>>2]=7;if((Y+32|0)>>>0<Aa>>>0){$=ea;do{ea=$;$=$+4|0;c[$>>2]=7}while((ea+8|0)>>>0<Aa>>>0)}if((Y|0)!=(fa|0)){$=Y-fa|0;ea=fa+($+4)|0;c[ea>>2]=c[ea>>2]&-2;c[fa+4>>2]=$|1;c[fa+$>>2]=$;ea=$>>>3;if($>>>0<256){L=ea<<1;aa=1306808+(L<<2)|0;Z=c[326692]|0;_=1<<ea;do{if((Z&_|0)==0){c[326692]=Z|_;Da=1306808+(L+2<<2)|0;Ea=aa}else{ea=1306808+(L+2<<2)|0;r=c[ea>>2]|0;if(!(r>>>0<(c[1306784>>2]|0)>>>0)){Da=ea;Ea=r;break}ec()}}while(0);c[Da>>2]=fa;c[Ea+12>>2]=fa;c[fa+8>>2]=Ea;c[fa+12>>2]=aa;break}L=$>>>8;if((L|0)!=0){if($>>>0>16777215){Fa=31}else{_=(L+1048320|0)>>>16&8;Z=L<<_;L=(Z+520192|0)>>>16&4;Y=Z<<L;Z=(Y+245760|0)>>>16&2;r=14-(L|_|Z)+(Y<<Z>>>15)|0;Fa=$>>>(r+7|0)&1|r<<1}}else{Fa=0}r=1307072+(Fa<<2)|0;c[fa+28>>2]=Fa;c[fa+20>>2]=0;c[fa+16>>2]=0;Z=c[1306772>>2]|0;Y=1<<Fa;if((Z&Y|0)==0){c[1306772>>2]=Z|Y;c[r>>2]=fa;c[fa+24>>2]=r;c[fa+12>>2]=fa;c[fa+8>>2]=fa;break}Y=c[r>>2]|0;if((Fa|0)==31){Ga=0}else{Ga=25-(Fa>>>1)|0}k:do{if((c[Y+4>>2]&-8|0)!=($|0)){r=$<<Ga;Z=Y;while(1){Ha=Z+(r>>>31<<2)+16|0;_=c[Ha>>2]|0;if((_|0)==0){break}if((c[_+4>>2]&-8|0)==($|0)){Ia=_;break k}else{r=r<<1;Z=_}}if(Ha>>>0<(c[1306784>>2]|0)>>>0){ec()}else{c[Ha>>2]=fa;c[fa+24>>2]=Z;c[fa+12>>2]=fa;c[fa+8>>2]=fa;break g}}else{Ia=Y}}while(0);Y=Ia+8|0;$=c[Y>>2]|0;aa=c[1306784>>2]|0;if(Ia>>>0<aa>>>0){ec()}if($>>>0<aa>>>0){ec()}else{c[$+12>>2]=fa;c[Y>>2]=fa;c[fa+8>>2]=$;c[fa+12>>2]=Ia;c[fa+24>>2]=0;break}}}else{$=c[1306784>>2]|0;if(($|0)==0|ca>>>0<$>>>0){c[1306784>>2]=ca}c[1307216>>2]=ca;c[1307220>>2]=da;c[1307228>>2]=0;c[1306804>>2]=c[326810];c[1306800>>2]=-1;$=0;do{Y=$<<1;aa=1306808+(Y<<2)|0;c[1306808+(Y+3<<2)>>2]=aa;c[1306808+(Y+2<<2)>>2]=aa;$=$+1|0}while(($|0)!=32);$=ca+8|0;if(($&7|0)==0){Ja=0}else{Ja=0-$&7}$=da+ -40-Ja|0;c[1306792>>2]=ca+Ja;c[1306780>>2]=$;c[ca+(Ja+4)>>2]=$|1;c[ca+(da+ -36)>>2]=40;c[1306796>>2]=c[1307256>>2]}}while(0);da=c[1306780>>2]|0;if(da>>>0>B>>>0){ca=da-B|0;c[1306780>>2]=ca;da=c[1306792>>2]|0;c[1306792>>2]=da+B;c[da+(B+4)>>2]=ca|1;c[da+4>>2]=B|3;p=da+8|0;i=b;return p|0}}c[(tc()|0)>>2]=12;p=0;i=b;return p|0}function v2a(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;b=i;if((a|0)==0){i=b;return}d=a+ -8|0;e=c[1306784>>2]|0;if(d>>>0<e>>>0){ec()}f=c[a+ -4>>2]|0;g=f&3;if((g|0)==1){ec()}h=f&-8;j=a+(h+ -8)|0;do{if((f&1|0)==0){k=c[d>>2]|0;if((g|0)==0){i=b;return}l=-8-k|0;m=a+l|0;n=k+h|0;if(m>>>0<e>>>0){ec()}if((m|0)==(c[1306788>>2]|0)){o=a+(h+ -4)|0;if((c[o>>2]&3|0)!=3){p=m;q=n;break}c[1306776>>2]=n;c[o>>2]=c[o>>2]&-2;c[a+(l+4)>>2]=n|1;c[j>>2]=n;i=b;return}o=k>>>3;if(k>>>0<256){k=c[a+(l+8)>>2]|0;r=c[a+(l+12)>>2]|0;s=1306808+(o<<1<<2)|0;if((k|0)!=(s|0)){if(k>>>0<e>>>0){ec()}if((c[k+12>>2]|0)!=(m|0)){ec()}}if((r|0)==(k|0)){c[326692]=c[326692]&~(1<<o);p=m;q=n;break}if((r|0)!=(s|0)){if(r>>>0<e>>>0){ec()}s=r+8|0;if((c[s>>2]|0)==(m|0)){t=s}else{ec()}}else{t=r+8|0}c[k+12>>2]=r;c[t>>2]=k;p=m;q=n;break}k=c[a+(l+24)>>2]|0;r=c[a+(l+12)>>2]|0;do{if((r|0)==(m|0)){s=a+(l+20)|0;o=c[s>>2]|0;if((o|0)==0){u=a+(l+16)|0;v=c[u>>2]|0;if((v|0)==0){w=0;break}else{x=v;y=u}}else{x=o;y=s}while(1){s=x+20|0;o=c[s>>2]|0;if((o|0)!=0){x=o;y=s;continue}s=x+16|0;o=c[s>>2]|0;if((o|0)==0){break}else{x=o;y=s}}if(y>>>0<e>>>0){ec()}else{c[y>>2]=0;w=x;break}}else{s=c[a+(l+8)>>2]|0;if(s>>>0<e>>>0){ec()}o=s+12|0;if((c[o>>2]|0)!=(m|0)){ec()}u=r+8|0;if((c[u>>2]|0)==(m|0)){c[o>>2]=r;c[u>>2]=s;w=r;break}else{ec()}}}while(0);if((k|0)!=0){r=c[a+(l+28)>>2]|0;s=1307072+(r<<2)|0;if((m|0)==(c[s>>2]|0)){c[s>>2]=w;if((w|0)==0){c[1306772>>2]=c[1306772>>2]&~(1<<r);p=m;q=n;break}}else{if(k>>>0<(c[1306784>>2]|0)>>>0){ec()}r=k+16|0;if((c[r>>2]|0)==(m|0)){c[r>>2]=w}else{c[k+20>>2]=w}if((w|0)==0){p=m;q=n;break}}if(w>>>0<(c[1306784>>2]|0)>>>0){ec()}c[w+24>>2]=k;r=c[a+(l+16)>>2]|0;do{if((r|0)!=0){if(r>>>0<(c[1306784>>2]|0)>>>0){ec()}else{c[w+16>>2]=r;c[r+24>>2]=w;break}}}while(0);r=c[a+(l+20)>>2]|0;if((r|0)!=0){if(r>>>0<(c[1306784>>2]|0)>>>0){ec()}else{c[w+20>>2]=r;c[r+24>>2]=w;p=m;q=n;break}}else{p=m;q=n}}else{p=m;q=n}}else{p=d;q=h}}while(0);if(!(p>>>0<j>>>0)){ec()}d=a+(h+ -4)|0;w=c[d>>2]|0;if((w&1|0)==0){ec()}if((w&2|0)==0){if((j|0)==(c[1306792>>2]|0)){e=(c[1306780>>2]|0)+q|0;c[1306780>>2]=e;c[1306792>>2]=p;c[p+4>>2]=e|1;if((p|0)!=(c[1306788>>2]|0)){i=b;return}c[1306788>>2]=0;c[1306776>>2]=0;i=b;return}if((j|0)==(c[1306788>>2]|0)){e=(c[1306776>>2]|0)+q|0;c[1306776>>2]=e;c[1306788>>2]=p;c[p+4>>2]=e|1;c[p+e>>2]=e;i=b;return}e=(w&-8)+q|0;x=w>>>3;do{if(!(w>>>0<256)){y=c[a+(h+16)>>2]|0;t=c[a+(h|4)>>2]|0;do{if((t|0)==(j|0)){g=a+(h+12)|0;f=c[g>>2]|0;if((f|0)==0){r=a+(h+8)|0;k=c[r>>2]|0;if((k|0)==0){z=0;break}else{A=k;B=r}}else{A=f;B=g}while(1){g=A+20|0;f=c[g>>2]|0;if((f|0)!=0){A=f;B=g;continue}g=A+16|0;f=c[g>>2]|0;if((f|0)==0){break}else{A=f;B=g}}if(B>>>0<(c[1306784>>2]|0)>>>0){ec()}else{c[B>>2]=0;z=A;break}}else{g=c[a+h>>2]|0;if(g>>>0<(c[1306784>>2]|0)>>>0){ec()}f=g+12|0;if((c[f>>2]|0)!=(j|0)){ec()}r=t+8|0;if((c[r>>2]|0)==(j|0)){c[f>>2]=t;c[r>>2]=g;z=t;break}else{ec()}}}while(0);if((y|0)!=0){t=c[a+(h+20)>>2]|0;n=1307072+(t<<2)|0;if((j|0)==(c[n>>2]|0)){c[n>>2]=z;if((z|0)==0){c[1306772>>2]=c[1306772>>2]&~(1<<t);break}}else{if(y>>>0<(c[1306784>>2]|0)>>>0){ec()}t=y+16|0;if((c[t>>2]|0)==(j|0)){c[t>>2]=z}else{c[y+20>>2]=z}if((z|0)==0){break}}if(z>>>0<(c[1306784>>2]|0)>>>0){ec()}c[z+24>>2]=y;t=c[a+(h+8)>>2]|0;do{if((t|0)!=0){if(t>>>0<(c[1306784>>2]|0)>>>0){ec()}else{c[z+16>>2]=t;c[t+24>>2]=z;break}}}while(0);t=c[a+(h+12)>>2]|0;if((t|0)!=0){if(t>>>0<(c[1306784>>2]|0)>>>0){ec()}else{c[z+20>>2]=t;c[t+24>>2]=z;break}}}}else{t=c[a+h>>2]|0;y=c[a+(h|4)>>2]|0;n=1306808+(x<<1<<2)|0;if((t|0)!=(n|0)){if(t>>>0<(c[1306784>>2]|0)>>>0){ec()}if((c[t+12>>2]|0)!=(j|0)){ec()}}if((y|0)==(t|0)){c[326692]=c[326692]&~(1<<x);break}if((y|0)!=(n|0)){if(y>>>0<(c[1306784>>2]|0)>>>0){ec()}n=y+8|0;if((c[n>>2]|0)==(j|0)){C=n}else{ec()}}else{C=y+8|0}c[t+12>>2]=y;c[C>>2]=t}}while(0);c[p+4>>2]=e|1;c[p+e>>2]=e;if((p|0)==(c[1306788>>2]|0)){c[1306776>>2]=e;i=b;return}else{D=e}}else{c[d>>2]=w&-2;c[p+4>>2]=q|1;c[p+q>>2]=q;D=q}q=D>>>3;if(D>>>0<256){w=q<<1;d=1306808+(w<<2)|0;e=c[326692]|0;C=1<<q;if((e&C|0)!=0){q=1306808+(w+2<<2)|0;j=c[q>>2]|0;if(j>>>0<(c[1306784>>2]|0)>>>0){ec()}else{E=q;F=j}}else{c[326692]=e|C;E=1306808+(w+2<<2)|0;F=d}c[E>>2]=p;c[F+12>>2]=p;c[p+8>>2]=F;c[p+12>>2]=d;i=b;return}d=D>>>8;if((d|0)!=0){if(D>>>0>16777215){G=31}else{F=(d+1048320|0)>>>16&8;E=d<<F;d=(E+520192|0)>>>16&4;w=E<<d;E=(w+245760|0)>>>16&2;C=14-(d|F|E)+(w<<E>>>15)|0;G=D>>>(C+7|0)&1|C<<1}}else{G=0}C=1307072+(G<<2)|0;c[p+28>>2]=G;c[p+20>>2]=0;c[p+16>>2]=0;E=c[1306772>>2]|0;w=1<<G;a:do{if((E&w|0)!=0){F=c[C>>2]|0;if((G|0)==31){H=0}else{H=25-(G>>>1)|0}b:do{if((c[F+4>>2]&-8|0)!=(D|0)){d=D<<H;e=F;while(1){I=e+(d>>>31<<2)+16|0;j=c[I>>2]|0;if((j|0)==0){break}if((c[j+4>>2]&-8|0)==(D|0)){J=j;break b}else{d=d<<1;e=j}}if(I>>>0<(c[1306784>>2]|0)>>>0){ec()}else{c[I>>2]=p;c[p+24>>2]=e;c[p+12>>2]=p;c[p+8>>2]=p;break a}}else{J=F}}while(0);F=J+8|0;d=c[F>>2]|0;j=c[1306784>>2]|0;if(J>>>0<j>>>0){ec()}if(d>>>0<j>>>0){ec()}else{c[d+12>>2]=p;c[F>>2]=p;c[p+8>>2]=d;c[p+12>>2]=J;c[p+24>>2]=0;break}}else{c[1306772>>2]=E|w;c[C>>2]=p;c[p+24>>2]=C;c[p+12>>2]=p;c[p+8>>2]=p}}while(0);p=(c[1306800>>2]|0)+ -1|0;c[1306800>>2]=p;if((p|0)==0){K=1307224|0}else{i=b;return}while(1){p=c[K>>2]|0;if((p|0)==0){break}else{K=p+8|0}}c[1306800>>2]=-1;i=b;return}function w2a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;if((a|0)!=0){e=ca(b,a)|0;if((b|a)>>>0>65535){f=((e>>>0)/(a>>>0)|0|0)==(b|0)?e:-1}else{f=e}}else{f=0}e=u2a(f)|0;if((e|0)==0){i=d;return e|0}if((c[e+ -4>>2]&3|0)==0){i=d;return e|0}f3a(e|0,0,f|0)|0;i=d;return e|0}function x2a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;do{if((a|0)!=0){if(b>>>0>4294967231){c[(tc()|0)>>2]=12;e=0;break}if(b>>>0<11){f=16}else{f=b+11&-8}g=y2a(a+ -8|0,f)|0;if((g|0)!=0){e=g+8|0;break}g=u2a(b)|0;if((g|0)==0){e=0}else{h=c[a+ -4>>2]|0;j=(h&-8)-((h&3|0)==0?8:4)|0;c3a(g|0,a|0,(j>>>0<b>>>0?j:b)|0)|0;v2a(a);e=g}}else{e=u2a(b)|0}}while(0);i=d;return e|0}function y2a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;d=i;e=a+4|0;f=c[e>>2]|0;g=f&-8;h=a+g|0;j=c[1306784>>2]|0;if(a>>>0<j>>>0){ec()}k=f&3;if(!((k|0)!=1&a>>>0<h>>>0)){ec()}l=a+(g|4)|0;m=c[l>>2]|0;if((m&1|0)==0){ec()}if((k|0)==0){if(b>>>0<256){n=0;i=d;return n|0}if(!(g>>>0<(b+4|0)>>>0)?!((g-b|0)>>>0>c[1307248>>2]<<1>>>0):0){n=a;i=d;return n|0}n=0;i=d;return n|0}if(!(g>>>0<b>>>0)){k=g-b|0;if(!(k>>>0>15)){n=a;i=d;return n|0}c[e>>2]=f&1|b|2;c[a+(b+4)>>2]=k|3;c[l>>2]=c[l>>2]|1;B2a(a+b|0,k);n=a;i=d;return n|0}if((h|0)==(c[1306792>>2]|0)){k=(c[1306780>>2]|0)+g|0;if(!(k>>>0>b>>>0)){n=0;i=d;return n|0}l=k-b|0;c[e>>2]=f&1|b|2;c[a+(b+4)>>2]=l|1;c[1306792>>2]=a+b;c[1306780>>2]=l;n=a;i=d;return n|0}if((h|0)==(c[1306788>>2]|0)){l=(c[1306776>>2]|0)+g|0;if(l>>>0<b>>>0){n=0;i=d;return n|0}k=l-b|0;if(k>>>0>15){c[e>>2]=f&1|b|2;c[a+(b+4)>>2]=k|1;c[a+l>>2]=k;o=a+(l+4)|0;c[o>>2]=c[o>>2]&-2;p=a+b|0;q=k}else{c[e>>2]=f&1|l|2;f=a+(l+4)|0;c[f>>2]=c[f>>2]|1;p=0;q=0}c[1306776>>2]=q;c[1306788>>2]=p;n=a;i=d;return n|0}if((m&2|0)!=0){n=0;i=d;return n|0}p=(m&-8)+g|0;if(p>>>0<b>>>0){n=0;i=d;return n|0}q=p-b|0;f=m>>>3;do{if(!(m>>>0<256)){l=c[a+(g+24)>>2]|0;k=c[a+(g+12)>>2]|0;do{if((k|0)==(h|0)){o=a+(g+20)|0;r=c[o>>2]|0;if((r|0)==0){s=a+(g+16)|0;t=c[s>>2]|0;if((t|0)==0){u=0;break}else{v=t;w=s}}else{v=r;w=o}while(1){o=v+20|0;r=c[o>>2]|0;if((r|0)!=0){v=r;w=o;continue}o=v+16|0;r=c[o>>2]|0;if((r|0)==0){break}else{v=r;w=o}}if(w>>>0<j>>>0){ec()}else{c[w>>2]=0;u=v;break}}else{o=c[a+(g+8)>>2]|0;if(o>>>0<j>>>0){ec()}r=o+12|0;if((c[r>>2]|0)!=(h|0)){ec()}s=k+8|0;if((c[s>>2]|0)==(h|0)){c[r>>2]=k;c[s>>2]=o;u=k;break}else{ec()}}}while(0);if((l|0)!=0){k=c[a+(g+28)>>2]|0;o=1307072+(k<<2)|0;if((h|0)==(c[o>>2]|0)){c[o>>2]=u;if((u|0)==0){c[1306772>>2]=c[1306772>>2]&~(1<<k);break}}else{if(l>>>0<(c[1306784>>2]|0)>>>0){ec()}k=l+16|0;if((c[k>>2]|0)==(h|0)){c[k>>2]=u}else{c[l+20>>2]=u}if((u|0)==0){break}}if(u>>>0<(c[1306784>>2]|0)>>>0){ec()}c[u+24>>2]=l;k=c[a+(g+16)>>2]|0;do{if((k|0)!=0){if(k>>>0<(c[1306784>>2]|0)>>>0){ec()}else{c[u+16>>2]=k;c[k+24>>2]=u;break}}}while(0);k=c[a+(g+20)>>2]|0;if((k|0)!=0){if(k>>>0<(c[1306784>>2]|0)>>>0){ec()}else{c[u+20>>2]=k;c[k+24>>2]=u;break}}}}else{k=c[a+(g+8)>>2]|0;l=c[a+(g+12)>>2]|0;o=1306808+(f<<1<<2)|0;if((k|0)!=(o|0)){if(k>>>0<j>>>0){ec()}if((c[k+12>>2]|0)!=(h|0)){ec()}}if((l|0)==(k|0)){c[326692]=c[326692]&~(1<<f);break}if((l|0)!=(o|0)){if(l>>>0<j>>>0){ec()}o=l+8|0;if((c[o>>2]|0)==(h|0)){x=o}else{ec()}}else{x=l+8|0}c[k+12>>2]=l;c[x>>2]=k}}while(0);if(q>>>0<16){c[e>>2]=p|c[e>>2]&1|2;x=a+(p|4)|0;c[x>>2]=c[x>>2]|1;n=a;i=d;return n|0}else{c[e>>2]=c[e>>2]&1|b|2;c[a+(b+4)>>2]=q|3;e=a+(p|4)|0;c[e>>2]=c[e>>2]|1;B2a(a+b|0,q);n=a;i=d;return n|0}return 0}function z2a(a){a=a|0;var b=0,c=0;b=i;c=A2a(a)|0;i=b;return c|0}function A2a(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;if(!(a>>>0<4294967216)){c[(tc()|0)>>2]=12;d=0;i=b;return d|0}if(a>>>0<11){e=16}else{e=a+11&-8}a=u2a(e+28|0)|0;if((a|0)==0){d=0;i=b;return d|0}f=a+ -8|0;do{if((a&15|0)!=0){g=a+15&-16;h=g+ -8|0;j=f;k=(h-j|0)>>>0>15?h:g+8|0;g=k-j|0;j=a+ -4|0;h=c[j>>2]|0;l=(h&-8)-g|0;if((h&3|0)==0){c[k>>2]=(c[f>>2]|0)+g;c[k+4>>2]=l;m=k;break}else{h=k+4|0;c[h>>2]=l|c[h>>2]&1|2;h=k+(l+4)|0;c[h>>2]=c[h>>2]|1;c[j>>2]=g|c[j>>2]&1|2;j=a+(g+ -4)|0;c[j>>2]=c[j>>2]|1;B2a(f,g);m=k;break}}else{m=f}}while(0);f=m+4|0;a=c[f>>2]|0;if((a&3|0)!=0?(k=a&-8,k>>>0>(e+16|0)>>>0):0){g=k-e|0;c[f>>2]=e|a&1|2;c[m+(e|4)>>2]=g|3;a=m+(k|4)|0;c[a>>2]=c[a>>2]|1;B2a(m+e|0,g)}d=m+8|0;i=b;return d|0}function B2a(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;d=i;e=a+b|0;f=c[a+4>>2]|0;do{if((f&1|0)==0){g=c[a>>2]|0;if((f&3|0)==0){i=d;return}h=a+(0-g)|0;j=g+b|0;k=c[1306784>>2]|0;if(h>>>0<k>>>0){ec()}if((h|0)==(c[1306788>>2]|0)){l=a+(b+4)|0;if((c[l>>2]&3|0)!=3){m=h;n=j;break}c[1306776>>2]=j;c[l>>2]=c[l>>2]&-2;c[a+(4-g)>>2]=j|1;c[e>>2]=j;i=d;return}l=g>>>3;if(g>>>0<256){o=c[a+(8-g)>>2]|0;p=c[a+(12-g)>>2]|0;q=1306808+(l<<1<<2)|0;if((o|0)!=(q|0)){if(o>>>0<k>>>0){ec()}if((c[o+12>>2]|0)!=(h|0)){ec()}}if((p|0)==(o|0)){c[326692]=c[326692]&~(1<<l);m=h;n=j;break}if((p|0)!=(q|0)){if(p>>>0<k>>>0){ec()}q=p+8|0;if((c[q>>2]|0)==(h|0)){r=q}else{ec()}}else{r=p+8|0}c[o+12>>2]=p;c[r>>2]=o;m=h;n=j;break}o=c[a+(24-g)>>2]|0;p=c[a+(12-g)>>2]|0;do{if((p|0)==(h|0)){q=16-g|0;l=a+(q+4)|0;s=c[l>>2]|0;if((s|0)==0){t=a+q|0;q=c[t>>2]|0;if((q|0)==0){u=0;break}else{v=q;w=t}}else{v=s;w=l}while(1){l=v+20|0;s=c[l>>2]|0;if((s|0)!=0){v=s;w=l;continue}l=v+16|0;s=c[l>>2]|0;if((s|0)==0){break}else{v=s;w=l}}if(w>>>0<k>>>0){ec()}else{c[w>>2]=0;u=v;break}}else{l=c[a+(8-g)>>2]|0;if(l>>>0<k>>>0){ec()}s=l+12|0;if((c[s>>2]|0)!=(h|0)){ec()}t=p+8|0;if((c[t>>2]|0)==(h|0)){c[s>>2]=p;c[t>>2]=l;u=p;break}else{ec()}}}while(0);if((o|0)!=0){p=c[a+(28-g)>>2]|0;k=1307072+(p<<2)|0;if((h|0)==(c[k>>2]|0)){c[k>>2]=u;if((u|0)==0){c[1306772>>2]=c[1306772>>2]&~(1<<p);m=h;n=j;break}}else{if(o>>>0<(c[1306784>>2]|0)>>>0){ec()}p=o+16|0;if((c[p>>2]|0)==(h|0)){c[p>>2]=u}else{c[o+20>>2]=u}if((u|0)==0){m=h;n=j;break}}if(u>>>0<(c[1306784>>2]|0)>>>0){ec()}c[u+24>>2]=o;p=16-g|0;k=c[a+p>>2]|0;do{if((k|0)!=0){if(k>>>0<(c[1306784>>2]|0)>>>0){ec()}else{c[u+16>>2]=k;c[k+24>>2]=u;break}}}while(0);k=c[a+(p+4)>>2]|0;if((k|0)!=0){if(k>>>0<(c[1306784>>2]|0)>>>0){ec()}else{c[u+20>>2]=k;c[k+24>>2]=u;m=h;n=j;break}}else{m=h;n=j}}else{m=h;n=j}}else{m=a;n=b}}while(0);u=c[1306784>>2]|0;if(e>>>0<u>>>0){ec()}v=a+(b+4)|0;w=c[v>>2]|0;if((w&2|0)==0){if((e|0)==(c[1306792>>2]|0)){r=(c[1306780>>2]|0)+n|0;c[1306780>>2]=r;c[1306792>>2]=m;c[m+4>>2]=r|1;if((m|0)!=(c[1306788>>2]|0)){i=d;return}c[1306788>>2]=0;c[1306776>>2]=0;i=d;return}if((e|0)==(c[1306788>>2]|0)){r=(c[1306776>>2]|0)+n|0;c[1306776>>2]=r;c[1306788>>2]=m;c[m+4>>2]=r|1;c[m+r>>2]=r;i=d;return}r=(w&-8)+n|0;f=w>>>3;do{if(!(w>>>0<256)){k=c[a+(b+24)>>2]|0;g=c[a+(b+12)>>2]|0;do{if((g|0)==(e|0)){o=a+(b+20)|0;l=c[o>>2]|0;if((l|0)==0){t=a+(b+16)|0;s=c[t>>2]|0;if((s|0)==0){x=0;break}else{y=s;z=t}}else{y=l;z=o}while(1){o=y+20|0;l=c[o>>2]|0;if((l|0)!=0){y=l;z=o;continue}o=y+16|0;l=c[o>>2]|0;if((l|0)==0){break}else{y=l;z=o}}if(z>>>0<u>>>0){ec()}else{c[z>>2]=0;x=y;break}}else{o=c[a+(b+8)>>2]|0;if(o>>>0<u>>>0){ec()}l=o+12|0;if((c[l>>2]|0)!=(e|0)){ec()}t=g+8|0;if((c[t>>2]|0)==(e|0)){c[l>>2]=g;c[t>>2]=o;x=g;break}else{ec()}}}while(0);if((k|0)!=0){g=c[a+(b+28)>>2]|0;j=1307072+(g<<2)|0;if((e|0)==(c[j>>2]|0)){c[j>>2]=x;if((x|0)==0){c[1306772>>2]=c[1306772>>2]&~(1<<g);break}}else{if(k>>>0<(c[1306784>>2]|0)>>>0){ec()}g=k+16|0;if((c[g>>2]|0)==(e|0)){c[g>>2]=x}else{c[k+20>>2]=x}if((x|0)==0){break}}if(x>>>0<(c[1306784>>2]|0)>>>0){ec()}c[x+24>>2]=k;g=c[a+(b+16)>>2]|0;do{if((g|0)!=0){if(g>>>0<(c[1306784>>2]|0)>>>0){ec()}else{c[x+16>>2]=g;c[g+24>>2]=x;break}}}while(0);g=c[a+(b+20)>>2]|0;if((g|0)!=0){if(g>>>0<(c[1306784>>2]|0)>>>0){ec()}else{c[x+20>>2]=g;c[g+24>>2]=x;break}}}}else{g=c[a+(b+8)>>2]|0;k=c[a+(b+12)>>2]|0;j=1306808+(f<<1<<2)|0;if((g|0)!=(j|0)){if(g>>>0<u>>>0){ec()}if((c[g+12>>2]|0)!=(e|0)){ec()}}if((k|0)==(g|0)){c[326692]=c[326692]&~(1<<f);break}if((k|0)!=(j|0)){if(k>>>0<u>>>0){ec()}j=k+8|0;if((c[j>>2]|0)==(e|0)){A=j}else{ec()}}else{A=k+8|0}c[g+12>>2]=k;c[A>>2]=g}}while(0);c[m+4>>2]=r|1;c[m+r>>2]=r;if((m|0)==(c[1306788>>2]|0)){c[1306776>>2]=r;i=d;return}else{B=r}}else{c[v>>2]=w&-2;c[m+4>>2]=n|1;c[m+n>>2]=n;B=n}n=B>>>3;if(B>>>0<256){w=n<<1;v=1306808+(w<<2)|0;r=c[326692]|0;A=1<<n;if((r&A|0)!=0){n=1306808+(w+2<<2)|0;e=c[n>>2]|0;if(e>>>0<(c[1306784>>2]|0)>>>0){ec()}else{C=n;D=e}}else{c[326692]=r|A;C=1306808+(w+2<<2)|0;D=v}c[C>>2]=m;c[D+12>>2]=m;c[m+8>>2]=D;c[m+12>>2]=v;i=d;return}v=B>>>8;if((v|0)!=0){if(B>>>0>16777215){E=31}else{D=(v+1048320|0)>>>16&8;C=v<<D;v=(C+520192|0)>>>16&4;w=C<<v;C=(w+245760|0)>>>16&2;A=14-(v|D|C)+(w<<C>>>15)|0;E=B>>>(A+7|0)&1|A<<1}}else{E=0}A=1307072+(E<<2)|0;c[m+28>>2]=E;c[m+20>>2]=0;c[m+16>>2]=0;C=c[1306772>>2]|0;w=1<<E;if((C&w|0)==0){c[1306772>>2]=C|w;c[A>>2]=m;c[m+24>>2]=A;c[m+12>>2]=m;c[m+8>>2]=m;i=d;return}w=c[A>>2]|0;if((E|0)==31){F=0}else{F=25-(E>>>1)|0}a:do{if((c[w+4>>2]&-8|0)==(B|0)){G=w}else{E=B<<F;A=w;while(1){H=A+(E>>>31<<2)+16|0;C=c[H>>2]|0;if((C|0)==0){break}if((c[C+4>>2]&-8|0)==(B|0)){G=C;break a}else{E=E<<1;A=C}}if(H>>>0<(c[1306784>>2]|0)>>>0){ec()}c[H>>2]=m;c[m+24>>2]=A;c[m+12>>2]=m;c[m+8>>2]=m;i=d;return}}while(0);H=G+8|0;B=c[H>>2]|0;w=c[1306784>>2]|0;if(G>>>0<w>>>0){ec()}if(B>>>0<w>>>0){ec()}c[B+12>>2]=m;c[H>>2]=m;c[m+8>>2]=B;c[m+12>>2]=G;c[m+24>>2]=0;i=d;return}function C2a(a,b){a=+a;b=b|0;var d=0,e=0,f=0,g=0,j=0,l=0.0,m=0.0,n=0,o=0.0;d=i;h[k>>3]=a;e=c[k>>2]|0;f=c[k+4>>2]|0;g=a3a(e|0,f|0,52)|0;j=g&2047;if((j|0)==0){if(a!=0.0){l=+C2a(a*18446744073709552000.0,b);m=l;n=(c[b>>2]|0)+ -64|0}else{m=a;n=0}c[b>>2]=n;o=m;i=d;return+o}else if((j|0)==2047){o=a;i=d;return+o}else{c[b>>2]=j+ -1022;c[k>>2]=e;c[k+4>>2]=f&-2146435073|1071644672;o=+h[k>>3];i=d;return+o}return 0.0}function D2a(a,b){a=+a;b=b|0;var c=0,d=0.0;c=i;d=+C2a(a,b);i=c;return+d}function E2a(a,b){a=+a;b=b|0;var d=0,e=0.0,f=0,g=0,j=0,l=0.0;d=i;if((b|0)>1023){e=a*8.98846567431158e+307;f=b+ -1023|0;if((f|0)>1023){g=b+ -2046|0;j=(g|0)>1023?1023:g;l=e*8.98846567431158e+307}else{j=f;l=e}}else{if((b|0)<-1022){e=a*2.2250738585072014e-308;f=b+1022|0;if((f|0)<-1022){g=b+2044|0;j=(g|0)<-1022?-1022:g;l=e*2.2250738585072014e-308}else{j=f;l=e}}else{j=b;l=a}}b=g3a(j+1023|0,0,52)|0;j=G;c[k>>2]=b;c[k+4>>2]=j;a=l*+h[k>>3];i=d;return+a}function F2a(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;if((a|0)==0){d=0}else{d=G2a(a,b)|0}i=c;return d|0}function G2a(b,d){b=b|0;d=d|0;var e=0,f=0;e=i;if((b|0)==0){f=1;i=e;return f|0}if(d>>>0<128){a[b>>0]=d;f=1;i=e;return f|0}if(d>>>0<2048){a[b>>0]=d>>>6|192;a[b+1>>0]=d&63|128;f=2;i=e;return f|0}if(d>>>0<55296|(d+ -57344|0)>>>0<8192){a[b>>0]=d>>>12|224;a[b+1>>0]=d>>>6&63|128;a[b+2>>0]=d&63|128;f=3;i=e;return f|0}if((d+ -65536|0)>>>0<1048576){a[b>>0]=d>>>18|240;a[b+1>>0]=d>>>12&63|128;a[b+2>>0]=d>>>6&63|128;a[b+3>>0]=d&63|128;f=4;i=e;return f|0}else{c[(tc()|0)>>2]=84;f=-1;i=e;return f|0}return 0}function H2a(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;e=b+74|0;f=a[e>>0]|0;a[e>>0]=f+255|f;f=c[b>>2]|0;if((f&8|0)==0){c[b+8>>2]=0;c[b+4>>2]=0;e=c[b+44>>2]|0;c[b+28>>2]=e;c[b+20>>2]=e;c[b+16>>2]=e+(c[b+48>>2]|0);g=0;i=d;return g|0}else{c[b>>2]=f|32;g=-1;i=d;return g|0}return 0}function I2a(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;g=e+16|0;h=c[g>>2]|0;do{if((h|0)==0){if((H2a(e)|0)==0){j=c[g>>2]|0;break}else{i=f;return}}else{j=h}}while(0);h=e+20|0;g=c[h>>2]|0;if((j-g|0)>>>0<d>>>0){Qc[c[e+36>>2]&255](e,b,d)|0;i=f;return}a:do{if((a[e+75>>0]|0)>-1){j=d;while(1){if((j|0)==0){k=d;l=b;m=g;break a}n=j+ -1|0;if((a[b+n>>0]|0)==10){break}else{j=n}}if((Qc[c[e+36>>2]&255](e,b,j)|0)>>>0<j>>>0){i=f;return}else{k=d-j|0;l=b+j|0;m=c[h>>2]|0;break}}else{k=d;l=b;m=g}}while(0);c3a(m|0,l|0,k|0)|0;c[h>>2]=(c[h>>2]|0)+k;i=f;return}function J2a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;c[f>>2]=d;O2a(a,b,f);i=e;return}function K2a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+224|0;f=e+120|0;g=e+80|0;h=e;j=e+136|0;k=g+0|0;l=k+40|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(l|0));c[f>>2]=c[d>>2];if((L2a(0,b,f,h,g)|0)<0){m=-1;i=e;return m|0}d=a+48|0;if((c[d>>2]|0)==0){k=a+44|0;l=c[k>>2]|0;c[k>>2]=j;n=a+28|0;c[n>>2]=j;o=a+20|0;c[o>>2]=j;c[d>>2]=80;p=a+16|0;c[p>>2]=j+80;j=L2a(a,b,f,h,g)|0;if((l|0)==0){q=j}else{Qc[c[a+36>>2]&255](a,0,0)|0;r=(c[o>>2]|0)==0?-1:j;c[k>>2]=l;c[d>>2]=0;c[p>>2]=0;c[n>>2]=0;c[o>>2]=0;q=r}}else{q=L2a(a,b,f,h,g)|0}m=q;i=e;return m|0}function L2a(e,f,g,j,l){e=e|0;f=f|0;g=g|0;j=j|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0.0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0.0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0.0,nb=0.0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0.0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0.0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0.0,jc=0.0,kc=0.0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,uc=0,vc=0,wc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Oc=0,Pc=0,Qc=0,Rc=0,Sc=0,Tc=0,Uc=0,Vc=0,Wc=0,Xc=0,Yc=0,Zc=0,_c=0,$c=0,ad=0,bd=0,cd=0,dd=0,ed=0,fd=0,gd=0,hd=0,id=0,jd=0,kd=0,ld=0,md=0,nd=0,od=0,pd=0,qd=0,rd=0,sd=0,td=0,ud=0,vd=0,wd=0,xd=0;m=i;i=i+864|0;n=m+16|0;o=m+8|0;p=m+836|0;q=p;r=m+824|0;s=m+568|0;t=m+528|0;u=m;v=m+520|0;w=(e|0)!=0;x=t+40|0;y=x;z=t+39|0;t=u+4|0;A=r+12|0;B=r+11|0;r=A;C=r-q|0;D=-2-q|0;E=r+2|0;F=n+288|0;H=p+9|0;I=H;J=p+8|0;K=0;L=0;M=f;f=0;N=0;O=0;a:while(1){do{if((f|0)>-1){if((N|0)>(2147483647-f|0)){c[(tc()|0)>>2]=75;P=-1;break}else{P=N+f|0;break}}else{P=f}}while(0);Q=a[M>>0]|0;if(Q<<24>>24==0){R=346;break}else{S=Q;T=M}while(1){if(S<<24>>24==37){U=T;V=T;R=9;break}else if(S<<24>>24==0){W=T;X=T;break}Q=T+1|0;S=a[Q>>0]|0;T=Q}b:do{if((R|0)==9){while(1){R=0;if((a[U+1>>0]|0)!=37){W=U;X=V;break b}Q=V+1|0;Y=U+2|0;if((a[Y>>0]|0)==37){U=Y;V=Q;R=9}else{W=Y;X=Q;break}}}}while(0);Q=X-M|0;if(w){I2a(M,Q,e)}if((X|0)!=(M|0)){M=W;f=P;N=Q;continue}Y=W+1|0;Z=a[Y>>0]|0;_=(Z<<24>>24)+ -48|0;if(_>>>0<10?(a[W+2>>0]|0)==36:0){$=W+3|0;aa=a[$>>0]|0;ba=_;da=1;ea=$}else{aa=Z;ba=-1;da=O;ea=Y}Y=aa<<24>>24;c:do{if((Y+ -32|0)>>>0<32){Z=Y;$=aa;_=0;fa=ea;while(1){if((1<<Z+ -32&75913|0)==0){ga=$;ha=_;ia=fa;break c}ja=1<<($<<24>>24)+ -32|_;ka=fa+1|0;la=a[ka>>0]|0;Z=la<<24>>24;if(!((Z+ -32|0)>>>0<32)){ga=la;ha=ja;ia=ka;break}else{$=la;_=ja;fa=ka}}}else{ga=aa;ha=0;ia=ea}}while(0);do{if(ga<<24>>24==42){Y=ia+1|0;fa=(a[Y>>0]|0)+ -48|0;if(fa>>>0<10?(a[ia+2>>0]|0)==36:0){c[l+(fa<<2)>>2]=10;ma=1;na=ia+3|0;oa=c[j+((a[Y>>0]|0)+ -48<<3)>>2]|0}else{if((da|0)!=0){pa=-1;R=365;break a}if(!w){qa=Y;ra=ha;sa=0;ta=0;break}fa=c[g>>2]|0;_=c[fa>>2]|0;c[g>>2]=fa+4;ma=0;na=Y;oa=_}if((oa|0)<0){qa=na;ra=ha|8192;sa=ma;ta=0-oa|0}else{qa=na;ra=ha;sa=ma;ta=oa}}else{_=ga<<24>>24;if((_+ -48|0)>>>0<10){Y=_;_=ia;fa=0;do{fa=Y+ -48+(fa*10|0)|0;_=_+1|0;Y=a[_>>0]|0}while((Y+ -48|0)>>>0<10);if((fa|0)<0){pa=-1;R=365;break a}else{qa=_;ra=ha;sa=da;ta=fa}}else{qa=ia;ra=ha;sa=da;ta=0}}}while(0);d:do{if((a[qa>>0]|0)==46){Y=qa+1|0;$=a[Y>>0]|0;if(!($<<24>>24==42)){Z=$<<24>>24;if((Z+ -48|0)>>>0<10){ua=Z;va=Y;wa=0}else{xa=Y;ya=0;break}while(1){Y=ua+ -48+(wa*10|0)|0;Z=va+1|0;ua=a[Z>>0]|0;if(!((ua+ -48|0)>>>0<10)){xa=Z;ya=Y;break d}else{va=Z;wa=Y}}}fa=qa+2|0;_=(a[fa>>0]|0)+ -48|0;if(_>>>0<10?(a[qa+3>>0]|0)==36:0){c[l+(_<<2)>>2]=10;xa=qa+4|0;ya=c[j+((a[fa>>0]|0)+ -48<<3)>>2]|0;break}if((sa|0)!=0){pa=-1;R=365;break a}if(w){_=c[g>>2]|0;Y=c[_>>2]|0;c[g>>2]=_+4;xa=fa;ya=Y}else{xa=fa;ya=0}}else{xa=qa;ya=-1}}while(0);fa=xa;Y=0;while(1){za=a[fa>>0]|0;_=(za<<24>>24)+ -65|0;if(_>>>0>57){pa=-1;R=365;break a}Aa=fa+1|0;Ba=a[1307264+(Y*58|0)+_>>0]|0;Ca=Ba&255;if((Ca+ -1|0)>>>0<8){fa=Aa;Y=Ca}else{break}}if(Ba<<24>>24==0){pa=-1;R=365;break}_=(ba|0)>-1;e:do{if(Ba<<24>>24==19){if(_){pa=-1;R=365;break a}else{Da=K;Ea=L;R=63}}else{if(_){c[l+(ba<<2)>>2]=Ca;Z=j+(ba<<3)|0;Da=c[Z+4>>2]|0;Ea=c[Z>>2]|0;R=63;break}if(!w){pa=0;R=365;break a}if((Ba&255)>20){Fa=za;Ga=L;Ha=K}else{do{switch(Ca|0){case 17:{Z=c[g>>2]|0;c[k>>2]=c[Z>>2];c[k+4>>2]=c[Z+4>>2];Ia=+h[k>>3];c[g>>2]=Z+8;h[k>>3]=Ia;Ja=c[k>>2]|0;Ka=c[k+4>>2]|0;R=64;break e;break};case 16:{Z=c[g>>2]|0;$=c[Z>>2]|0;c[g>>2]=Z+4;Ja=$&255;Ka=0;R=64;break e;break};case 9:{$=c[g>>2]|0;Z=c[$>>2]|0;c[g>>2]=$+4;Ja=Z;Ka=K;R=64;break e;break};case 15:{Z=c[g>>2]|0;$=c[Z>>2]|0;c[g>>2]=Z+4;Ja=$<<24>>24;Ka=((($&255)<<24>>24|0)<0)<<31>>31;R=64;break e;break};case 10:{$=c[g>>2]|0;Z=c[$>>2]|0;c[g>>2]=$+4;Ja=Z;Ka=((Z|0)<0)<<31>>31;R=64;break e;break};case 11:{Z=c[g>>2]|0;$=c[Z>>2]|0;c[g>>2]=Z+4;Ja=$;Ka=0;R=64;break e;break};case 12:{$=c[g>>2]|0;Z=$;ka=c[Z>>2]|0;ja=c[Z+4>>2]|0;c[g>>2]=$+8;Ja=ka;Ka=ja;R=64;break e;break};case 18:{ja=c[g>>2]|0;c[k>>2]=c[ja>>2];c[k+4>>2]=c[ja+4>>2];Ia=+h[k>>3];c[g>>2]=ja+8;h[k>>3]=Ia;Ja=c[k>>2]|0;Ka=c[k+4>>2]|0;R=64;break e;break};case 14:{ja=c[g>>2]|0;ka=c[ja>>2]|0;c[g>>2]=ja+4;Ja=ka&65535;Ka=0;R=64;break e;break};case 13:{ka=c[g>>2]|0;ja=c[ka>>2]|0;c[g>>2]=ka+4;Ja=ja<<16>>16;Ka=(((ja&65535)<<16>>16|0)<0)<<31>>31;R=64;break e;break};default:{Ja=L;Ka=K;R=64;break e}}}while(0)}}}while(0);if((R|0)==63){R=0;if(w){Ja=Ea;Ka=Da;R=64}else{K=Da;L=Ea;M=Aa;f=P;N=Q;O=sa;continue}}if((R|0)==64){R=0;Fa=a[fa>>0]|0;Ga=Ja;Ha=Ka}_=Fa<<24>>24;if((Y|0)==0){La=_}else{La=(_&15|0)==3?_&-33:_}_=ra&-65537;ja=(ra&8192|0)==0?ra:_;f:do{switch(La|0){case 105:case 100:{if((Ha|0)<0){ka=X2a(0,0,Ga|0,Ha|0)|0;Ma=ka;Na=G;Oa=1;Pa=1307728;R=89;break f}if((ja&2048|0)==0){ka=ja&1;Ma=Ga;Na=Ha;Oa=ka;Pa=(ka|0)==0?1307728:1307730|0;R=89}else{Ma=Ga;Na=Ha;Oa=1;Pa=1307729|0;R=89}break};case 99:{a[z>>0]=Ga;Qa=Ha;Ra=Ga;Sa=z;Ta=_;Ua=1;Va=0;Wa=1307728;Xa=x;break};case 110:{switch(Y|0){case 0:{c[Ga>>2]=P;K=Ha;L=Ga;M=Aa;f=P;N=Q;O=sa;continue a;break};case 1:{c[Ga>>2]=P;K=Ha;L=Ga;M=Aa;f=P;N=Q;O=sa;continue a;break};case 6:{c[Ga>>2]=P;K=Ha;L=Ga;M=Aa;f=P;N=Q;O=sa;continue a;break};case 7:{ka=Ga;c[ka>>2]=P;c[ka+4>>2]=((P|0)<0)<<31>>31;K=Ha;L=Ga;M=Aa;f=P;N=Q;O=sa;continue a;break};case 2:{ka=Ga;c[ka>>2]=P;c[ka+4>>2]=((P|0)<0)<<31>>31;K=Ha;L=Ga;M=Aa;f=P;N=Q;O=sa;continue a;break};case 3:{b[Ga>>1]=P;K=Ha;L=Ga;M=Aa;f=P;N=Q;O=sa;continue a;break};case 4:{a[Ga>>0]=P;K=Ha;L=Ga;M=Aa;f=P;N=Q;O=sa;continue a;break};default:{K=Ha;L=Ga;M=Aa;f=P;N=Q;O=sa;continue a}}break};case 112:{Ya=ja|8;Za=ya>>>0>8?ya:8;_a=120;R=77;break};case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{c[k>>2]=Ga;c[k+4>>2]=Ha;Ia=+h[k>>3];c[o>>2]=0;if((Ha|0)>=0){if((ja&2048|0)==0){ka=ja&1;$a=Ia;ab=ka;bb=(ka|0)==0?1307753|0:1307758|0}else{$a=Ia;ab=1;bb=1307755|0}}else{$a=-Ia;ab=1;bb=1307752}h[k>>3]=$a;ka=c[k+4>>2]&2146435072;if(!(ka>>>0<2146435072|(ka|0)==2146435072&0<0)){ka=(La&32|0)!=0;if($a!=$a|0.0!=0.0){cb=0;db=ka?1307792:1307800}else{cb=ab;db=ka?1307776:1307784}ka=cb+3|0;$=(ka|0)<(ta|0);if((ja&8192|0)==0&$){Z=ta-ka|0;f3a(s|0,32,(Z>>>0>256?256:Z)|0)|0;if(Z>>>0>255){la=Z;while(1){I2a(s,256,e);eb=la+ -256|0;if(eb>>>0>255){la=eb}else{fb=eb;break}}}else{fb=Z}I2a(s,fb,e)}I2a(bb,cb,e);I2a(db,3,e);if((ja&73728|0)==8192&$){la=ta-ka|0;f3a(s|0,32,(la>>>0>256?256:la)|0)|0;if(la>>>0>255){eb=la;while(1){I2a(s,256,e);gb=eb+ -256|0;if(gb>>>0>255){eb=gb}else{hb=gb;break}}}else{hb=la}I2a(s,hb,e)}K=Ha;L=Ga;M=Aa;f=P;N=$?ta:ka;O=sa;continue a}Ia=+D2a($a,o)*2.0;eb=Ia!=0.0;if(eb){c[o>>2]=(c[o>>2]|0)+ -1}Z=La|32;if((Z|0)==97){gb=La&32;ib=(gb|0)==0?bb:bb+9|0;jb=ab|2;kb=ya>>>0>11?0:12-ya|0;do{if((kb|0)!=0){lb=kb;mb=8.0;do{lb=lb+ -1|0;mb=mb*16.0}while((lb|0)!=0);if((a[ib>>0]|0)==45){nb=-(mb+(-Ia-mb));break}else{nb=Ia+mb-mb;break}}else{nb=Ia}}while(0);kb=c[o>>2]|0;ka=(kb|0)<0?0-kb|0:kb;if((ka|0)<0){kb=A;$=ka;la=((ka|0)<0)<<31>>31;while(1){lb=q3a($|0,la|0,10,0)|0;kb=kb+ -1|0;a[kb>>0]=lb|48;lb=$;$=p3a($|0,la|0,10,0)|0;if(!(la>>>0>9|(la|0)==9&lb>>>0>4294967295)){break}else{la=G}}ob=kb;pb=$}else{ob=A;pb=ka}if((pb|0)==0){qb=ob}else{la=ob;lb=pb;while(1){rb=la+ -1|0;a[rb>>0]=(lb>>>0)%10|0|48;if(lb>>>0<10){qb=rb;break}else{la=rb;lb=(lb>>>0)/10|0}}}if((qb|0)==(A|0)){a[B>>0]=48;sb=B}else{sb=qb}a[sb+ -1>>0]=(c[o>>2]>>31&2)+43;lb=sb+ -2|0;a[lb>>0]=La+15;la=(ja&8|0)==0;if((ya|0)>0){if(la){tb=nb;ka=p;while(1){$=~~tb;kb=ka+1|0;a[ka>>0]=d[1307808+$>>0]|gb;tb=(tb- +($|0))*16.0;if((kb-q|0)==1){a[kb>>0]=46;ub=ka+2|0}else{ub=kb}if(!(tb!=0.0)){vb=ub;break}else{ka=ub}}}else{tb=nb;ka=p;while(1){kb=~~tb;$=ka+1|0;a[ka>>0]=d[1307808+kb>>0]|gb;tb=(tb- +(kb|0))*16.0;if(($-q|0)==1){a[$>>0]=46;wb=ka+2|0}else{wb=$}if(!(tb!=0.0)){vb=wb;break}else{ka=wb}}}}else{if(la){tb=nb;ka=p;while(1){$=~~tb;kb=ka+1|0;a[ka>>0]=d[1307808+$>>0]|gb;tb=(tb- +($|0))*16.0;$=tb!=0.0;if((kb-q|0)==1&$){a[kb>>0]=46;xb=ka+2|0}else{xb=kb}if(!$){vb=xb;break}else{ka=xb}}}else{tb=nb;ka=p;while(1){la=~~tb;$=ka+1|0;a[ka>>0]=d[1307808+la>>0]|gb;tb=(tb- +(la|0))*16.0;if(($-q|0)==1){a[$>>0]=46;yb=ka+2|0}else{yb=$}if(!(tb!=0.0)){vb=yb;break}else{ka=yb}}}}ka=vb;do{if((ya|0)==0){R=175}else{if((D+ka|0)>=(ya|0)){R=175;break}zb=E+ya-lb|0}}while(0);if((R|0)==175){R=0;zb=C-lb+ka|0}gb=zb+jb|0;$=ja&73728;la=(gb|0)<(ta|0);if(($|0)==0&la){kb=ta-gb|0;f3a(s|0,32,(kb>>>0>256?256:kb)|0)|0;if(kb>>>0>255){rb=kb;while(1){I2a(s,256,e);Ab=rb+ -256|0;if(Ab>>>0>255){rb=Ab}else{Bb=Ab;break}}}else{Bb=kb}I2a(s,Bb,e)}I2a(ib,jb,e);if(($|0)==65536&la){rb=ta-gb|0;f3a(s|0,48,(rb>>>0>256?256:rb)|0)|0;if(rb>>>0>255){Ab=rb;while(1){I2a(s,256,e);Cb=Ab+ -256|0;if(Cb>>>0>255){Ab=Cb}else{Db=Cb;break}}}else{Db=rb}I2a(s,Db,e)}Ab=ka-q|0;I2a(p,Ab,e);jb=r-lb|0;ib=zb-jb-Ab|0;if((ib|0)>0){f3a(s|0,48,(ib>>>0>256?256:ib)|0)|0;if(ib>>>0>255){Ab=ib;while(1){I2a(s,256,e);kb=Ab+ -256|0;if(kb>>>0>255){Ab=kb}else{Eb=kb;break}}}else{Eb=ib}I2a(s,Eb,e)}I2a(lb,jb,e);if(($|0)==8192&la){Ab=ta-gb|0;f3a(s|0,32,(Ab>>>0>256?256:Ab)|0)|0;if(Ab>>>0>255){ka=Ab;while(1){I2a(s,256,e);rb=ka+ -256|0;if(rb>>>0>255){ka=rb}else{Fb=rb;break}}}else{Fb=Ab}I2a(s,Fb,e)}K=Ha;L=Ga;M=Aa;f=P;N=la?ta:gb;O=sa;continue a}ka=(ya|0)<0?6:ya;if(eb){$=(c[o>>2]|0)+ -28|0;c[o>>2]=$;Gb=Ia*268435456.0;Hb=$}else{Gb=Ia;Hb=c[o>>2]|0}$=(Hb|0)<0?n:F;tb=Gb;jb=$;do{lb=~~tb>>>0;c[jb>>2]=lb;jb=jb+4|0;tb=(tb- +(lb>>>0))*1.0e9}while(tb!=0.0);eb=c[o>>2]|0;if((eb|0)>0){gb=eb;la=$;Ab=jb;while(1){lb=(gb|0)>29?29:gb;ib=Ab+ -4|0;do{if(ib>>>0<la>>>0){Ib=la}else{rb=0;kb=ib;do{Cb=g3a(c[kb>>2]|0,0,lb|0)|0;Jb=W2a(Cb|0,G|0,rb|0,0)|0;Cb=G;Kb=q3a(Jb|0,Cb|0,1e9,0)|0;c[kb>>2]=Kb;rb=p3a(Jb|0,Cb|0,1e9,0)|0;kb=kb+ -4|0}while(!(kb>>>0<la>>>0));if((rb|0)==0){Ib=la;break}kb=la+ -4|0;c[kb>>2]=rb;Ib=kb}}while(0);ib=Ab;while(1){if(!(ib>>>0>Ib>>>0)){break}kb=ib+ -4|0;if((c[kb>>2]|0)==0){ib=kb}else{break}}kb=(c[o>>2]|0)-lb|0;c[o>>2]=kb;if((kb|0)>0){gb=kb;la=Ib;Ab=ib}else{Lb=kb;Mb=Ib;Nb=ib;break}}}else{Lb=eb;Mb=$;Nb=jb}g:do{if((Lb|0)<0){Ab=((ka+25|0)/9|0)+1|0;if((Z|0)==102){la=$;gb=$+(Ab<<2)|0;kb=Lb;Cb=Mb;Jb=Nb;while(1){Kb=0-kb|0;Ob=(Kb|0)>9?9:Kb;do{if(Cb>>>0<Jb>>>0){Kb=(1<<Ob)+ -1|0;Pb=1e9>>>Ob;Qb=0;Rb=Cb;do{Sb=c[Rb>>2]|0;c[Rb>>2]=(Sb>>>Ob)+Qb;Qb=ca(Sb&Kb,Pb)|0;Rb=Rb+4|0}while(Rb>>>0<Jb>>>0);Rb=(c[Cb>>2]|0)==0?Cb+4|0:Cb;if((Qb|0)==0){Tb=Rb;Ub=Jb;break}c[Jb>>2]=Qb;Tb=Rb;Ub=Jb+4|0}else{Tb=(c[Cb>>2]|0)==0?Cb+4|0:Cb;Ub=Jb}}while(0);rb=(Ub-la>>2|0)>(Ab|0)?gb:Ub;kb=(c[o>>2]|0)+Ob|0;c[o>>2]=kb;if((kb|0)>=0){Vb=Tb;Wb=rb;break g}else{Cb=Tb;Jb=rb}}}else{Xb=Lb;Yb=Mb;Zb=Nb}while(1){Jb=0-Xb|0;Cb=(Jb|0)>9?9:Jb;do{if(Yb>>>0<Zb>>>0){Jb=(1<<Cb)+ -1|0;kb=1e9>>>Cb;gb=0;la=Yb;do{ib=c[la>>2]|0;c[la>>2]=(ib>>>Cb)+gb;gb=ca(ib&Jb,kb)|0;la=la+4|0}while(la>>>0<Zb>>>0);la=(c[Yb>>2]|0)==0?Yb+4|0:Yb;if((gb|0)==0){_b=la;$b=Zb;break}c[Zb>>2]=gb;_b=la;$b=Zb+4|0}else{_b=(c[Yb>>2]|0)==0?Yb+4|0:Yb;$b=Zb}}while(0);if(($b-_b>>2|0)>(Ab|0)){ac=_b+(Ab<<2)|0}else{ac=$b}Xb=(c[o>>2]|0)+Cb|0;c[o>>2]=Xb;if((Xb|0)>=0){Vb=_b;Wb=ac;break}else{Yb=_b;Zb=ac}}}else{Vb=Mb;Wb=Nb}}while(0);jb=$;do{if(Vb>>>0<Wb>>>0){eb=(jb-Vb>>2)*9|0;Ab=c[Vb>>2]|0;if(Ab>>>0<10){bc=eb;break}else{cc=eb;dc=10}while(1){dc=dc*10|0;eb=cc+1|0;if(Ab>>>0<dc>>>0){bc=eb;break}else{cc=eb}}}else{bc=0}}while(0);Ab=(Z|0)==103;eb=ka-((Z|0)!=102?bc:0)+((Ab&(ka|0)!=0)<<31>>31)|0;if((eb|0)<(((Wb-jb>>2)*9|0)+ -9|0)){Ob=eb+9216|0;eb=(Ob|0)/9|0;la=$+(eb+ -1023<<2)|0;kb=((Ob|0)%9|0)+1|0;if((kb|0)<9){Ob=10;Jb=kb;while(1){kb=Ob*10|0;Jb=Jb+1|0;if((Jb|0)==9){ec=kb;break}else{Ob=kb}}}else{ec=10}Ob=c[la>>2]|0;Jb=(Ob>>>0)%(ec>>>0)|0;if((Jb|0)==0?($+(eb+ -1022<<2)|0)==(Wb|0):0){fc=Vb;gc=la;hc=bc}else{R=235}do{if((R|0)==235){R=0;mb=(((Ob>>>0)/(ec>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;Z=(ec|0)/2|0;do{if(Jb>>>0<Z>>>0){ic=.5}else{if((Jb|0)==(Z|0)?($+(eb+ -1022<<2)|0)==(Wb|0):0){ic=1.0;break}ic=1.5}}while(0);do{if((ab|0)==0){jc=mb;kc=ic}else{if((a[bb>>0]|0)!=45){jc=mb;kc=ic;break}jc=mb*-1.0;kc=ic*-1.0}}while(0);Z=Ob-Jb|0;c[la>>2]=Z;if(!(jc+kc!=jc)){fc=Vb;gc=la;hc=bc;break}kb=Z+ec|0;c[la>>2]=kb;if(kb>>>0>999999999){kb=Vb;Z=la;while(1){Qb=Z+ -4|0;c[Z>>2]=0;if(Qb>>>0<kb>>>0){ib=kb+ -4|0;c[ib>>2]=0;lc=ib}else{lc=kb}ib=(c[Qb>>2]|0)+1|0;c[Qb>>2]=ib;if(ib>>>0>999999999){kb=lc;Z=Qb}else{mc=lc;nc=Qb;break}}}else{mc=Vb;nc=la}Z=(jb-mc>>2)*9|0;kb=c[mc>>2]|0;if(kb>>>0<10){fc=mc;gc=nc;hc=Z;break}else{oc=Z;pc=10}while(1){pc=pc*10|0;Z=oc+1|0;if(kb>>>0<pc>>>0){fc=mc;gc=nc;hc=Z;break}else{oc=Z}}}}while(0);la=gc+4|0;qc=fc;rc=hc;sc=Wb>>>0>la>>>0?la:Wb}else{qc=Vb;rc=bc;sc=Wb}la=0-rc|0;Jb=sc;while(1){if(!(Jb>>>0>qc>>>0)){uc=0;break}Ob=Jb+ -4|0;if((c[Ob>>2]|0)==0){Jb=Ob}else{uc=1;break}}do{if(Ab){Ob=((ka|0)==0&1)+ka|0;if((Ob|0)>(rc|0)&(rc|0)>-5){vc=La+ -1|0;wc=Ob+ -1-rc|0}else{vc=La+ -2|0;wc=Ob+ -1|0}if((ja&8|0)!=0){yc=vc;zc=wc;break}do{if(uc){Ob=c[Jb+ -4>>2]|0;if((Ob|0)==0){Ac=9;break}if(((Ob>>>0)%10|0|0)==0){Bc=10;Cc=0}else{Ac=0;break}while(1){Bc=Bc*10|0;eb=Cc+1|0;if(((Ob>>>0)%(Bc>>>0)|0|0)!=0){Ac=eb;break}else{Cc=eb}}}else{Ac=9}}while(0);Ob=((Jb-jb>>2)*9|0)+ -9|0;if((vc|32|0)==102){Cb=Ob-Ac|0;eb=(Cb|0)<0?0:Cb;yc=vc;zc=(wc|0)<(eb|0)?wc:eb;break}else{eb=Ob+rc-Ac|0;Ob=(eb|0)<0?0:eb;yc=vc;zc=(wc|0)<(Ob|0)?wc:Ob;break}}else{yc=La;zc=ka}}while(0);ka=(zc|0)!=0;if(ka){Dc=1}else{Dc=(ja&8|0)!=0}jb=Dc&1;Ab=(yc|32|0)==102;if(Ab){Ec=(rc|0)>0?rc:0;Fc=0}else{Ob=(rc|0)<0?la:rc;if((Ob|0)<0){eb=A;Cb=Ob;kb=((Ob|0)<0)<<31>>31;while(1){Z=q3a(Cb|0,kb|0,10,0)|0;eb=eb+ -1|0;a[eb>>0]=Z|48;Z=Cb;Cb=p3a(Cb|0,kb|0,10,0)|0;if(!(kb>>>0>9|(kb|0)==9&Z>>>0>4294967295)){break}else{kb=G}}Gc=eb;Hc=Cb}else{Gc=A;Hc=Ob}if((Hc|0)==0){Ic=Gc}else{kb=Gc;la=Hc;while(1){Z=kb+ -1|0;a[Z>>0]=(la>>>0)%10|0|48;if(la>>>0<10){Ic=Z;break}else{kb=Z;la=(la>>>0)/10|0}}}if((r-Ic|0)<2){la=Ic;while(1){kb=la+ -1|0;a[kb>>0]=48;if((r-kb|0)<2){la=kb}else{Jc=kb;break}}}else{Jc=Ic}a[Jc+ -1>>0]=(rc>>31&2)+43;la=Jc+ -2|0;a[la>>0]=yc;Ec=r-la|0;Fc=la}la=ab+1+zc+jb+Ec|0;kb=ja&73728;Ob=(la|0)<(ta|0);if((kb|0)==0&Ob){Cb=ta-la|0;f3a(s|0,32,(Cb>>>0>256?256:Cb)|0)|0;if(Cb>>>0>255){eb=Cb;while(1){I2a(s,256,e);Z=eb+ -256|0;if(Z>>>0>255){eb=Z}else{Kc=Z;break}}}else{Kc=Cb}I2a(s,Kc,e)}I2a(bb,ab,e);if((kb|0)==65536&Ob){eb=ta-la|0;f3a(s|0,48,(eb>>>0>256?256:eb)|0)|0;if(eb>>>0>255){jb=eb;while(1){I2a(s,256,e);Z=jb+ -256|0;if(Z>>>0>255){jb=Z}else{Lc=Z;break}}}else{Lc=eb}I2a(s,Lc,e)}do{if(Ab){jb=qc>>>0>$>>>0?$:qc;Cb=jb;do{Z=c[Cb>>2]|0;if((Z|0)==0){Mc=H}else{Qb=H;ib=Z;while(1){Z=Qb+ -1|0;a[Z>>0]=(ib>>>0)%10|0|48;if(ib>>>0<10){Mc=Z;break}else{Qb=Z;ib=(ib>>>0)/10|0}}}do{if((Cb|0)==(jb|0)){if((Mc|0)!=(H|0)){Nc=Mc;break}a[J>>0]=48;Nc=J}else{if(Mc>>>0>p>>>0){Oc=Mc}else{Nc=Mc;break}while(1){ib=Oc+ -1|0;a[ib>>0]=48;if(ib>>>0>p>>>0){Oc=ib}else{Nc=ib;break}}}}while(0);I2a(Nc,I-Nc|0,e);Cb=Cb+4|0}while(!(Cb>>>0>$>>>0));if(!ka?(ja&8|0)==0:0){break}I2a(1307824,1,e);if(Cb>>>0<Jb>>>0&(zc|0)>0){jb=zc;gb=Cb;while(1){ib=c[gb>>2]|0;if((ib|0)!=0){Qb=H;Z=ib;while(1){Qb=Qb+ -1|0;a[Qb>>0]=(Z>>>0)%10|0|48;if(Z>>>0<10){break}else{Z=(Z>>>0)/10|0}}if(Qb>>>0>p>>>0){Pc=Qb;R=302}else{Qc=Qb}}else{Pc=H;R=302}if((R|0)==302){while(1){R=0;Z=Pc+ -1|0;a[Z>>0]=48;if(Z>>>0>p>>>0){Pc=Z;R=302}else{Qc=Z;break}}}I2a(Qc,(jb|0)>9?9:jb,e);gb=gb+4|0;Qb=jb+ -9|0;if(!(gb>>>0<Jb>>>0&(Qb|0)>0)){Rc=Qb;break}else{jb=Qb}}}else{Rc=zc}if((Rc|0)<=0){break}f3a(s|0,48,(Rc>>>0>256?256:Rc)|0)|0;if(Rc>>>0>255){jb=Rc;while(1){I2a(s,256,e);gb=jb+ -256|0;if(gb>>>0>255){jb=gb}else{Sc=gb;break}}}else{Sc=Rc}I2a(s,Sc,e)}else{jb=uc?Jb:qc+4|0;do{if((zc|0)>-1){gb=(ja&8|0)!=0;Cb=zc;Qb=qc;do{Z=c[Qb>>2]|0;if((Z|0)!=0){ib=H;lb=Z;while(1){ib=ib+ -1|0;a[ib>>0]=(lb>>>0)%10|0|48;if(lb>>>0<10){break}else{lb=(lb>>>0)/10|0}}if((ib|0)!=(H|0)){Tc=ib}else{R=313}}else{R=313}if((R|0)==313){R=0;a[J>>0]=48;Tc=J}do{if((Qb|0)==(qc|0)){lb=Tc+1|0;I2a(Tc,1,e);if(!((Cb|0)>0|gb)){Uc=lb;break}I2a(1307824,1,e);Uc=lb}else{if(Tc>>>0>p>>>0){Vc=Tc}else{Uc=Tc;break}while(1){lb=Vc+ -1|0;a[lb>>0]=48;if(lb>>>0>p>>>0){Vc=lb}else{Uc=lb;break}}}}while(0);ib=I-Uc|0;I2a(Uc,(ib|0)<(Cb|0)?ib:Cb,e);Cb=Cb-ib|0;Qb=Qb+4|0}while(Qb>>>0<jb>>>0&(Cb|0)>-1);if((Cb|0)<=0){break}f3a(s|0,48,(Cb>>>0>256?256:Cb)|0)|0;if(Cb>>>0>255){Qb=Cb;while(1){I2a(s,256,e);gb=Qb+ -256|0;if(gb>>>0>255){Qb=gb}else{Wc=gb;break}}}else{Wc=Cb}I2a(s,Wc,e)}}while(0);I2a(Fc,r-Fc|0,e)}}while(0);if((kb|0)==8192&Ob){Jb=ta-la|0;f3a(s|0,32,(Jb>>>0>256?256:Jb)|0)|0;if(Jb>>>0>255){ka=Jb;while(1){I2a(s,256,e);$=ka+ -256|0;if($>>>0>255){ka=$}else{Xc=$;break}}}else{Xc=Jb}I2a(s,Xc,e)}K=Ha;L=Ga;M=Aa;f=P;N=Ob?ta:la;O=sa;continue a;break};case 109:{Yc=xc(c[(tc()|0)>>2]|0)|0;R=99;break};case 115:{Yc=(Ga|0)==0?1307744:Ga;R=99;break};case 117:{Ma=Ga;Na=Ha;Oa=0;Pa=1307728;R=89;break};case 67:{c[u>>2]=Ga;c[t>>2]=0;Zc=u;_c=u;$c=-1;R=104;break};case 83:{if((ya|0)==0){ad=Ga;bd=Ga;cd=0;R=111}else{Zc=Ga;_c=Ga;$c=ya;R=104}break};case 88:case 120:{Ya=ja;Za=ya;_a=La;R=77;break};case 111:{ka=Ga;kb=(ka|0)==0&(Ha|0)==0;if(kb){dd=x}else{$=x;Ab=ka;ka=Ha;while(1){eb=$+ -1|0;a[eb>>0]=Ab&7|48;Ab=a3a(Ab|0,ka|0,3)|0;ka=G;if((Ab|0)==0&(ka|0)==0){dd=eb;break}else{$=eb}}}if((ja&8|0)==0){ed=Ga;fd=Ha;gd=dd;hd=ja;id=ya;jd=0;kd=1307728;R=94}else{ed=Ga;fd=Ha;gd=dd;hd=ja;id=ya;jd=kb&1^1;kd=kb?1307728:1307733|0;R=94}break};default:{Qa=Ha;Ra=Ga;Sa=M;Ta=ja;Ua=ya;Va=0;Wa=1307728;Xa=x}}}while(0);h:do{if((R|0)==77){R=0;Q=Ga;Y=_a&32;if(!((Q|0)==0&(Ha|0)==0)){fa=x;$=Q;Q=Ha;do{fa=fa+ -1|0;a[fa>>0]=d[1307808+($&15)>>0]|Y;$=a3a($|0,Q|0,4)|0;Q=G}while(!(($|0)==0&(Q|0)==0));if((Ya&8|0)==0){ed=Ga;fd=Ha;gd=fa;hd=Ya;id=Za;jd=0;kd=1307728;R=94}else{ed=Ga;fd=Ha;gd=fa;hd=Ya;id=Za;jd=2;kd=1307728+(_a>>4)|0;R=94}}else{ed=Ga;fd=Ha;gd=x;hd=Ya;id=Za;jd=0;kd=1307728;R=94}}else if((R|0)==89){R=0;Q=Ma;if(Na>>>0>0|(Na|0)==0&Q>>>0>4294967295){$=x;Y=Q;kb=Na;while(1){ka=q3a(Y|0,kb|0,10,0)|0;$=$+ -1|0;a[$>>0]=ka|48;ka=Y;Y=p3a(Y|0,kb|0,10,0)|0;if(!(kb>>>0>9|(kb|0)==9&ka>>>0>4294967295)){break}else{kb=G}}ld=$;md=Y}else{ld=x;md=Q}if((md|0)==0){ed=Ma;fd=Na;gd=ld;hd=ja;id=ya;jd=Oa;kd=Pa;R=94}else{kb=ld;fa=md;while(1){ka=kb+ -1|0;a[ka>>0]=(fa>>>0)%10|0|48;if(fa>>>0<10){ed=Ma;fd=Na;gd=ka;hd=ja;id=ya;jd=Oa;kd=Pa;R=94;break}else{kb=ka;fa=(fa>>>0)/10|0}}}}else if((R|0)==99){R=0;fa=P2a(Yc,0,ya)|0;if((fa|0)==0){Qa=Ha;Ra=Ga;Sa=Yc;Ta=_;Ua=ya;Va=0;Wa=1307728;Xa=Yc+ya|0;break}else{Qa=Ha;Ra=Ga;Sa=Yc;Ta=_;Ua=fa-Yc|0;Va=0;Wa=1307728;Xa=fa;break}}else if((R|0)==104){R=0;fa=0;kb=0;Q=Zc;while(1){Y=c[Q>>2]|0;if((Y|0)==0){nd=fa;od=kb;break}$=F2a(v,Y)|0;if(!(($|0)>-1)){pa=-1;R=365;break a}Y=$+fa|0;if($>>>0>($c-fa|0)>>>0){ad=Zc;bd=_c;cd=fa;R=111;break h}if(!(Y>>>0<$c>>>0)){nd=Y;od=$;break}fa=Y;kb=$;Q=Q+4|0}if((od|0)<0){pa=-1;R=365;break a}else{ad=Zc;bd=_c;cd=nd;R=111}}}while(0);if((R|0)==94){R=0;_=(id|0)>-1?hd&-65537:hd;Q=(ed|0)==0&(fd|0)==0;if(Q&(id|0)==0){Qa=fd;Ra=ed;Sa=x;Ta=_;Ua=0;Va=jd;Wa=kd;Xa=x}else{kb=(Q&1)+(y-gd)|0;Qa=fd;Ra=ed;Sa=gd;Ta=_;Ua=(id|0)>(kb|0)?id:kb;Va=jd;Wa=kd;Xa=x}}else if((R|0)==111){R=0;kb=ja&73728;_=(cd|0)<(ta|0);if((kb|0)==0&_){Q=ta-cd|0;f3a(s|0,32,(Q>>>0>256?256:Q)|0)|0;if(Q>>>0>255){fa=Q;while(1){I2a(s,256,e);$=fa+ -256|0;if($>>>0>255){fa=$}else{pd=$;break}}}else{pd=Q}I2a(s,pd,e)}i:do{if((cd|0)!=0){fa=0;ja=ad;while(1){$=c[ja>>2]|0;if(($|0)==0){break i}Y=F2a(v,$)|0;$=Y+fa|0;if(($|0)>(cd|0)){break i}I2a(v,Y,e);if(!($>>>0<cd>>>0)){break i}fa=$;ja=ja+4|0}}}while(0);if((kb|0)==8192&_){Q=ta-cd|0;f3a(s|0,32,(Q>>>0>256?256:Q)|0)|0;if(Q>>>0>255){ja=Q;while(1){I2a(s,256,e);fa=ja+ -256|0;if(fa>>>0>255){ja=fa}else{qd=fa;break}}}else{qd=Q}I2a(s,qd,e)}K=Ha;L=bd;M=Aa;f=P;N=_?ta:cd;O=sa;continue}ja=Xa-Sa|0;kb=(Ua|0)<(ja|0)?ja:Ua;fa=Va+kb|0;$=(ta|0)<(fa|0)?fa:ta;Y=Ta&73728;ka=(fa|0)<($|0);if((Y|0)==0&ka){Ab=$-fa|0;f3a(s|0,32,(Ab>>>0>256?256:Ab)|0)|0;if(Ab>>>0>255){la=Ab;while(1){I2a(s,256,e);Ob=la+ -256|0;if(Ob>>>0>255){la=Ob}else{rd=Ob;break}}}else{rd=Ab}I2a(s,rd,e)}I2a(Wa,Va,e);if((Y|0)==65536&ka){la=$-fa|0;f3a(s|0,48,(la>>>0>256?256:la)|0)|0;if(la>>>0>255){_=la;while(1){I2a(s,256,e);Q=_+ -256|0;if(Q>>>0>255){_=Q}else{sd=Q;break}}}else{sd=la}I2a(s,sd,e)}if((ja|0)<(kb|0)){_=kb-ja|0;f3a(s|0,48,(_>>>0>256?256:_)|0)|0;if(_>>>0>255){Ab=_;while(1){I2a(s,256,e);Q=Ab+ -256|0;if(Q>>>0>255){Ab=Q}else{td=Q;break}}}else{td=_}I2a(s,td,e)}I2a(Sa,ja,e);if(!((Y|0)==8192&ka)){K=Qa;L=Ra;M=Aa;f=P;N=$;O=sa;continue}Ab=$-fa|0;f3a(s|0,32,(Ab>>>0>256?256:Ab)|0)|0;if(Ab>>>0>255){kb=Ab;while(1){I2a(s,256,e);la=kb+ -256|0;if(la>>>0>255){kb=la}else{ud=la;break}}}else{ud=Ab}I2a(s,ud,e);K=Qa;L=Ra;M=Aa;f=P;N=$;O=sa}if((R|0)==346){if((e|0)!=0){pa=P;i=m;return pa|0}if((O|0)==0){pa=0;i=m;return pa|0}else{vd=1}while(1){O=c[l+(vd<<2)>>2]|0;if((O|0)==0){wd=1;xd=vd;break}P=j+(vd<<3)|0;j:do{if(!(O>>>0>20)){do{switch(O|0){case 12:{e=c[g>>2]|0;sa=e;N=c[sa>>2]|0;f=c[sa+4>>2]|0;c[g>>2]=e+8;e=P;c[e>>2]=N;c[e+4>>2]=f;break j;break};case 13:{f=c[g>>2]|0;e=c[f>>2]|0;c[g>>2]=f+4;f=(e&65535)<<16>>16;e=P;c[e>>2]=f;c[e+4>>2]=((f|0)<0)<<31>>31;break j;break};case 14:{f=c[g>>2]|0;e=c[f>>2]|0;c[g>>2]=f+4;f=P;c[f>>2]=e&65535;c[f+4>>2]=0;break j;break};case 15:{f=c[g>>2]|0;e=c[f>>2]|0;c[g>>2]=f+4;f=(e&255)<<24>>24;e=P;c[e>>2]=f;c[e+4>>2]=((f|0)<0)<<31>>31;break j;break};case 16:{f=c[g>>2]|0;e=c[f>>2]|0;c[g>>2]=f+4;f=P;c[f>>2]=e&255;c[f+4>>2]=0;break j;break};case 17:{f=c[g>>2]|0;c[k>>2]=c[f>>2];c[k+4>>2]=c[f+4>>2];jc=+h[k>>3];c[g>>2]=f+8;h[P>>3]=jc;break j;break};case 18:{f=c[g>>2]|0;c[k>>2]=c[f>>2];c[k+4>>2]=c[f+4>>2];jc=+h[k>>3];c[g>>2]=f+8;h[P>>3]=jc;break j;break};case 9:{f=c[g>>2]|0;e=c[f>>2]|0;c[g>>2]=f+4;c[P>>2]=e;break j;break};case 10:{e=c[g>>2]|0;f=c[e>>2]|0;c[g>>2]=e+4;e=P;c[e>>2]=f;c[e+4>>2]=((f|0)<0)<<31>>31;break j;break};case 11:{f=c[g>>2]|0;e=c[f>>2]|0;c[g>>2]=f+4;f=P;c[f>>2]=e;c[f+4>>2]=0;break j;break};default:{break j}}}while(0)}}while(0);vd=vd+1|0;if((vd|0)>=10){pa=1;R=365;break}}if((R|0)==365){i=m;return pa|0}while(1){vd=xd+1|0;if(!wd){pa=-1;R=365;break}if((vd|0)>=10){pa=1;R=365;break}wd=(c[l+(vd<<2)>>2]|0)==0;xd=vd}if((R|0)==365){i=m;return pa|0}}else if((R|0)==365){i=m;return pa|0}return 0}function M2a(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;g=i;i=i+128|0;h=g+112|0;j=g;k=j+0|0;l=1307832|0;m=k+112|0;do{c[k>>2]=c[l>>2];k=k+4|0;l=l+4|0}while((k|0)<(m|0));if((d+ -1|0)>>>0>2147483646){if((d|0)==0){n=h;o=1}else{c[(tc()|0)>>2]=75;i=g;return}}else{n=b;o=d}d=-2-n|0;b=o>>>0>d>>>0?d:o;c[j+48>>2]=b;o=j+20|0;c[o>>2]=n;c[j+44>>2]=n;d=n+b|0;n=j+16|0;c[n>>2]=d;c[j+28>>2]=d;K2a(j,e,f)|0;if((b|0)==0){i=g;return}b=c[o>>2]|0;a[b+(((b|0)==(c[n>>2]|0))<<31>>31)>>0]=0;i=g;return}function N2a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=a+20|0;g=c[f>>2]|0;h=(c[a+16>>2]|0)-g|0;a=h>>>0>d>>>0?d:h;c3a(g|0,b|0,a|0)|0;c[f>>2]=(c[f>>2]|0)+a;i=e;return d|0}function O2a(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;M2a(a,2147483647,b,c);i=d;return}\n\n\n\nfunction P2a(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;f=i;g=d&255;h=(e|0)==0;a:do{if((b&3|0)==0|h){j=e;k=h;l=b;m=5}else{n=d&255;o=e;p=b;while(1){if((a[p>>0]|0)==n<<24>>24){q=o;r=p;break a}s=p+1|0;t=o+ -1|0;u=(t|0)==0;if((s&3|0)==0|u){j=t;k=u;l=s;m=5;break}else{o=t;p=s}}}}while(0);b:do{if((m|0)==5){if(!k){b=d&255;if(!((a[l>>0]|0)==b<<24>>24)){e=ca(g,16843009)|0;c:do{if(j>>>0>3){h=j;p=l;while(1){o=c[p>>2]^e;if(((o&-2139062144^-2139062144)&o+ -16843009|0)!=0){v=h;w=p;break c}o=p+4|0;n=h+ -4|0;if(n>>>0>3){h=n;p=o}else{v=n;w=o;break}}}else{v=j;w=l}}while(0);if((v|0)==0){q=0;r=w}else{e=v;p=w;while(1){if((a[p>>0]|0)==b<<24>>24){q=e;r=p;break b}h=p+1|0;e=e+ -1|0;if((e|0)==0){q=0;r=h;break}else{p=h}}}}else{q=j;r=l}}else{q=0;r=l}}}while(0);i=f;return((q|0)!=0?r:0)|0}function Q2a(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;a:do{if((d|0)==0){f=0}else{g=d;h=b;j=c;while(1){k=a[h>>0]|0;l=a[j>>0]|0;if(!(k<<24>>24==l<<24>>24)){break}g=g+ -1|0;if((g|0)==0){f=0;break a}else{h=h+1|0;j=j+1|0}}f=(k&255)-(l&255)|0}}while(0);i=e;return f|0}function R2a(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a[b>>0]|0;f=a[c>>0]|0;if(e<<24>>24==0?1:e<<24>>24!=f<<24>>24){g=e;h=f}else{f=b;b=c;do{f=f+1|0;b=b+1|0;c=a[f>>0]|0;e=a[b>>0]|0}while(!(c<<24>>24==0?1:c<<24>>24!=e<<24>>24));g=c;h=e}i=d;return(g&255)-(h&255)|0}function S2a(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=i;if((e|0)==0){g=0;i=f;return g|0}h=a[b>>0]|0;a:do{if(h<<24>>24==0){j=0;k=c}else{l=e;m=h;n=b;o=c;while(1){l=l+ -1|0;p=a[o>>0]|0;if(!((l|0)!=0&p<<24>>24!=0&m<<24>>24==p<<24>>24)){j=m;k=o;break a}n=n+1|0;p=o+1|0;m=a[n>>0]|0;if(m<<24>>24==0){j=0;k=p;break}else{o=p}}}}while(0);g=(j&255)-(d[k>>0]|0)|0;i=f;return g|0}function T2a(){}function U2a(a){a=a|0;var b=0;b=(ca(c[a>>2]|0,31010991)|0)+1735287159&2147483647;c[a>>2]=b;return b|0}function V2a(){return U2a(o)|0}function W2a(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=a+c>>>0;return(G=b+d+(e>>>0<a>>>0|0)>>>0,e|0)|0}function X2a(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=b-d>>>0;e=b-d-(c>>>0>a>>>0|0)>>>0;return(G=e,a-c>>>0|0)|0}function Y2a(b){b=b|0;var c=0;c=b;while(a[c>>0]|0){c=c+1|0}return c-b|0}function Z2a(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;while((e|0)<(d|0)){a[b+e>>0]=f?0:a[c+e>>0]|0;f=f?1:(a[c+e>>0]|0)==0;e=e+1|0}return b|0}function _2a(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;t=t+1|0;c[a>>2]=t;while((e|0)<20){if((c[d+(e<<3)>>2]|0)==0){c[d+(e<<3)>>2]=t;c[d+((e<<3)+4)>>2]=b;c[d+((e<<3)+8)>>2]=0;return 0}e=e+1|0}Cb(116);Cb(111);Cb(111);Cb(32);Cb(109);Cb(97);Cb(110);Cb(121);Cb(32);Cb(115);Cb(101);Cb(116);Cb(106);Cb(109);Cb(112);Cb(115);Cb(32);Cb(105);Cb(110);Cb(32);Cb(97);Cb(32);Cb(102);Cb(117);Cb(110);Cb(99);Cb(116);Cb(105);Cb(111);Cb(110);Cb(32);Cb(99);Cb(97);Cb(108);Cb(108);Cb(44);Cb(32);Cb(98);Cb(117);Cb(105);Cb(108);Cb(100);Cb(32);Cb(119);Cb(105);Cb(116);Cb(104);Cb(32);Cb(97);Cb(32);Cb(104);Cb(105);Cb(103);Cb(104);Cb(101);Cb(114);Cb(32);Cb(118);Cb(97);Cb(108);Cb(117);Cb(101);Cb(32);Cb(102);Cb(111);Cb(114);Cb(32);Cb(77);Cb(65);Cb(88);Cb(95);Cb(83);Cb(69);Cb(84);Cb(74);Cb(77);Cb(80);Cb(83);Cb(10);da(0);return 0}function $2a(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){G=b>>c;return a>>>c|(b&(1<<c)-1)<<32-c}G=(b|0)<0?-1:0;return b>>c-32|0}function a3a(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){G=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}G=0;return b>>>c-32|0}function b3a(a,b){a=a|0;b=b|0;var d=0,e=0;while((d|0)<20){e=c[b+(d<<3)>>2]|0;if((e|0)==0)break;if((e|0)==(a|0)){return c[b+((d<<3)+4)>>2]|0}d=d+1|0}return 0}function c3a(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;if((e|0)>=4096)return fb(b|0,d|0,e|0)|0;f=b|0;if((b&3)==(d&3)){while(b&3){if((e|0)==0)return f|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}while((e|0)>=4){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0;e=e-4|0}}while((e|0)>0){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}return f|0}function d3a(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if((c|0)<(b|0)&(b|0)<(c+d|0)){e=b;c=c+d|0;b=b+d|0;while((d|0)>0){b=b-1|0;c=c-1|0;d=d-1|0;a[b>>0]=a[c>>0]|0}b=e}else{c3a(b,c,d)|0}return b|0}function e3a(a){a=a|0;return(a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function f3a(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;if((e|0)>=20){d=d&255;g=b&3;h=d|d<<8|d<<16|d<<24;i=f&~3;if(g){g=b+4-g|0;while((b|0)<(g|0)){a[b>>0]=d;b=b+1|0}}while((b|0)<(i|0)){c[b>>2]=h;b=b+4|0}}while((b|0)<(f|0)){a[b>>0]=d;b=b+1|0}return b-e|0}function g3a(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){G=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}G=a<<c-32;return 0}function h3a(b,c){b=b|0;c=c|0;var d=0;do{a[b+d>>0]=a[c+d>>0];d=d+1|0}while(a[c+(d-1)>>0]|0);return b|0}function i3a(a){a=a|0;return(a&255)<<8|a>>8&255|0}function j3a(b){b=b|0;var c=0;c=a[n+(b>>>24)>>0]|0;if((c|0)<8)return c|0;c=a[n+(b>>16&255)>>0]|0;if((c|0)<8)return c+8|0;c=a[n+(b>>8&255)>>0]|0;if((c|0)<8)return c+16|0;return(a[n+(b&255)>>0]|0)+24|0}function k3a(b){b=b|0;var c=0;c=a[m+(b&255)>>0]|0;if((c|0)<8)return c|0;c=a[m+(b>>8&255)>>0]|0;if((c|0)<8)return c+8|0;c=a[m+(b>>16&255)>>0]|0;if((c|0)<8)return c+16|0;return(a[m+(b>>>24)>>0]|0)+24|0}function l3a(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=a&65535;d=b&65535;e=ca(d,c)|0;f=a>>>16;a=(e>>>16)+(ca(d,f)|0)|0;d=b>>>16;b=ca(d,c)|0;return(G=(a>>>16)+(ca(d,f)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|e&65535|0)|0}function m3a(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=b>>31|((b|0)<0?-1:0)<<1;f=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;g=d>>31|((d|0)<0?-1:0)<<1;h=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;i=X2a(e^a,f^b,e,f)|0;b=G;a=g^e;e=h^f;f=X2a((r3a(i,b,X2a(g^c,h^d,g,h)|0,G,0)|0)^a,G^e,a,e)|0;return f|0}function n3a(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;i=i+8|0;g=f|0;h=b>>31|((b|0)<0?-1:0)<<1;j=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;k=e>>31|((e|0)<0?-1:0)<<1;l=((e|0)<0?-1:0)>>31|((e|0)<0?-1:0)<<1;m=X2a(h^a,j^b,h,j)|0;b=G;r3a(m,b,X2a(k^d,l^e,k,l)|0,G,g)|0;l=X2a(c[g>>2]^h,c[g+4>>2]^j,h,j)|0;j=G;i=f;return(G=j,l)|0}function o3a(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;a=c;c=l3a(e,a)|0;f=G;return(G=(ca(b,a)|0)+(ca(d,e)|0)+f|f&0,c|0|0)|0}function p3a(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=r3a(a,b,c,d,0)|0;return e|0}function q3a(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;i=i+8|0;g=f|0;r3a(a,b,d,e,g)|0;i=f;return(G=c[g+4>>2]|0,c[g>>2]|0)|0}function r3a(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,H=0;g=a;h=b;i=h;j=d;k=e;l=k;if((i|0)==0){m=(f|0)!=0;if((l|0)==0){if(m){c[f>>2]=(g>>>0)%(j>>>0);c[f+4>>2]=0}n=0;o=(g>>>0)/(j>>>0)>>>0;return(G=n,o)|0}else{if(!m){n=0;o=0;return(G=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;n=0;o=0;return(G=n,o)|0}}m=(l|0)==0;do{if((j|0)!=0){if(!m){p=(j3a(l|0)|0)-(j3a(i|0)|0)|0;if(p>>>0<=31){q=p+1|0;r=31-p|0;s=p-31>>31;t=q;u=g>>>(q>>>0)&s|i<<r;v=i>>>(q>>>0)&s;w=0;x=g<<r;break}if((f|0)==0){n=0;o=0;return(G=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=h|b&0;n=0;o=0;return(G=n,o)|0}r=j-1|0;if((r&j|0)!=0){s=(j3a(j|0)|0)+33-(j3a(i|0)|0)|0;q=64-s|0;p=32-s|0;y=p>>31;z=s-32|0;A=z>>31;t=s;u=p-1>>31&i>>>(z>>>0)|(i<<p|g>>>(s>>>0))&A;v=A&i>>>(s>>>0);w=g<<q&y;x=(i<<q|g>>>(z>>>0))&y|g<<p&s-33>>31;break}if((f|0)!=0){c[f>>2]=r&g;c[f+4>>2]=0}if((j|0)==1){n=h|b&0;o=a|0|0;return(G=n,o)|0}else{r=k3a(j|0)|0;n=i>>>(r>>>0)|0;o=i<<32-r|g>>>(r>>>0)|0;return(G=n,o)|0}}else{if(m){if((f|0)!=0){c[f>>2]=(i>>>0)%(j>>>0);c[f+4>>2]=0}n=0;o=(i>>>0)/(j>>>0)>>>0;return(G=n,o)|0}if((g|0)==0){if((f|0)!=0){c[f>>2]=0;c[f+4>>2]=(i>>>0)%(l>>>0)}n=0;o=(i>>>0)/(l>>>0)>>>0;return(G=n,o)|0}r=l-1|0;if((r&l|0)==0){if((f|0)!=0){c[f>>2]=a|0;c[f+4>>2]=r&i|b&0}n=0;o=i>>>((k3a(l|0)|0)>>>0);return(G=n,o)|0}r=(j3a(l|0)|0)-(j3a(i|0)|0)|0;if(r>>>0<=30){s=r+1|0;p=31-r|0;t=s;u=i<<p|g>>>(s>>>0);v=i>>>(s>>>0);w=0;x=g<<p;break}if((f|0)==0){n=0;o=0;return(G=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=h|b&0;n=0;o=0;return(G=n,o)|0}}while(0);if((t|0)==0){B=x;C=w;D=v;E=u;F=0;H=0}else{b=d|0|0;d=k|e&0;e=W2a(b,d,-1,-1)|0;k=G;h=x;x=w;w=v;v=u;u=t;t=0;do{a=h;h=x>>>31|h<<1;x=t|x<<1;g=v<<1|a>>>31|0;a=v>>>31|w<<1|0;X2a(e,k,g,a)|0;i=G;l=i>>31|((i|0)<0?-1:0)<<1;t=l&1;v=X2a(g,a,l&b,(((i|0)<0?-1:0)>>31|((i|0)<0?-1:0)<<1)&d)|0;w=G;u=u-1|0}while((u|0)!=0);B=h;C=x;D=w;E=v;F=0;H=t}t=C;C=0;if((f|0)!=0){c[f>>2]=E;c[f+4>>2]=D}n=(t|0)>>>31|(B|C)<<1|(C<<1|t>>>31)&0|F;o=(t<<1|0>>>31)&-2|H;return(G=n,o)|0}function s3a(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;return Ec[a&15](b|0,c|0,d|0,e|0,f|0,g|0,h|0)|0}function t3a(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Fc[a&63](b|0,c|0,d|0,e|0,f|0)}function u3a(a,b,c){a=a|0;b=b|0;c=+c;Gc[a&15](b|0,+c)}function v3a(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;return Hc[a&7](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0)|0}function w3a(a,b,c){a=a|0;b=b|0;c=c|0;Ic[a&511](b|0,c|0)}function x3a(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;return Jc[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0)|0}function y3a(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=+d;e=+e;f=+f;return Kc[a&7](b|0,c|0,+d,+e,+f)|0}function z3a(a,b){a=a|0;b=b|0;return Lc[a&255](b|0)|0}function A3a(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=+d;e=+e;f=+f;g=+g;Mc[a&0](b|0,c|0,+d,+e,+f,+g)}function B3a(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;return Nc[a&7](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0,l|0)|0}function C3a(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;Oc[a&3](b|0,+c,d|0)}function D3a(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=+d;e=+e;f=f|0;g=g|0;Pc[a&1](b|0,c|0,+d,+e,f|0,g|0)}function E3a(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Qc[a&255](b|0,c|0,d|0)|0}function F3a(a,b){a=a|0;b=b|0;Rc[a&1023](b|0)}function G3a(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=+d;e=+e;f=+f;g=+g;return Sc[a&3](b|0,c|0,+d,+e,+f,+g)|0}function H3a(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;Tc[a&31](b|0,c|0,d|0,e|0,f|0,g|0)}function I3a(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;Uc[a&7](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0)}function J3a(a,b){a=a|0;b=b|0;return+Vc[a&15](b|0)}function K3a(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return Wc[a&31](b|0,c|0,d|0,e|0,f|0,g|0)|0}function L3a(a){a=a|0;Xc[a&3]()}function M3a(a,b,c,d,e,f){a=a|0;b=b|0;c=+c;d=+d;e=+e;f=+f;Yc[a&1](b|0,+c,+d,+e,+f)}function N3a(a,b,c,d,e,f,g,h,i,j,k,l,m){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;return Zc[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0,l|0,m|0)|0}function O3a(a,b,c){a=a|0;b=b|0;c=+c;return _c[a&7](b|0,+c)|0}function P3a(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;return+$c[a&1](b|0,c|0,+d)}function Q3a(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;ad[a&15](b|0,c|0,d|0,e|0,f|0,g|0,h|0)}function R3a(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;bd[a&1](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0)}function S3a(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;cd[a&7](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0)}function T3a(a,b,c){a=a|0;b=b|0;c=c|0;return dd[a&511](b|0,c|0)|0}function U3a(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return ed[a&127](b|0,c|0,d|0,e|0,f|0)|0}function V3a(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=+c;d=+d;e=+e;f=+f;g=+g;h=+h;fd[a&7](b|0,+c,+d,+e,+f,+g,+h)}function W3a(a,b,c){a=a|0;b=b|0;c=+c;return+gd[a&1](b|0,+c)}function X3a(a,b,c,d,e,f,g,h,i,j,k,l,m){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;hd[a&1](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0,l|0,m|0)}function Y3a(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return id[a&511](b|0,c|0,d|0,e|0)|0}function Z3a(a){a=a|0;return jd[a&0]()|0}function _3a(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=+h;i=i|0;j=j|0;k=k|0;return kd[a&1](b|0,c|0,d|0,e|0,f|0,g|0,+h,i|0,j|0,k|0)|0}function $3a(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;ld[a&255](b|0,c|0,d|0)}function a4a(a,b,c){a=a|0;b=+b;c=c|0;return md[a&7](+b,c|0)|0}function b4a(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;return nd[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0)|0}function c4a(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=+c;d=+d;e=+e;f=+f;g=g|0;h=h|0;i=i|0;j=j|0;return od[a&1](b|0,+c,+d,+e,+f,g|0,h|0,i|0,j|0)|0}function d4a(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;pd[a&127](b|0,c|0,d|0,e|0)}function e4a(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;da(0);return 0}function f4a(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;da(1)}function g4a(a,b){a=a|0;b=+b;da(2)}function h4a(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;da(3);return 0}function i4a(a,b){a=a|0;b=b|0;da(4)}function j4a(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;da(5);return 0}function k4a(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=+d;e=+e;da(6);return 0}function l4a(a){a=a|0;da(7);return 0}function m4a(a,b,c,d,e,f){a=a|0;b=b|0;c=+c;d=+d;e=+e;f=+f;da(8)}function n4a(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;da(9);return 0}function o4a(a,b,c){a=a|0;b=+b;c=c|0;da(10)}function p4a(a,b,c,d,e,f){a=a|0;b=b|0;c=+c;d=+d;e=e|0;f=f|0;da(11)}function q4a(a,b,c){a=a|0;b=b|0;c=c|0;da(12);return 0}function r4a(a){a=a|0;da(13)}function s4a(a,b,c,d,e,f){a=a|0;b=b|0;c=+c;d=+d;e=+e;f=+f;da(14);return 0}function t4a(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;da(15)}function u4a(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;da(16)}function v4a(a){a=a|0;da(17);return 0.0}function w4a(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;da(18);return 0}function x4a(){da(19)}function y4a(){hc()}function z4a(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;da(20)}function A4a(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;da(21);return 0}function B4a(a,b){a=a|0;b=+b;da(22);return 0}function C4a(a,b,c){a=a|0;b=b|0;c=+c;da(23);return 0.0}function D4a(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;da(24)}function E4a(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;da(25)}function F4a(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;da(26)}function G4a(a,b){a=a|0;b=b|0;da(27);return 0}function H4a(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;da(28);return 0}function I4a(a,b,c,d,e,f,g){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;g=+g;da(29)}function J4a(a,b){a=a|0;b=+b;da(30);return 0.0}function K4a(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;da(31)}function L4a(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;da(32);return 0}function M4a(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return rc(a|0,b|0,c|0,d|0)|0}function N4a(){da(33);return 0}function O4a(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=+g;h=h|0;i=i|0;j=j|0;da(34);return 0}function P4a(a,b,c){a=a|0;b=b|0;c=c|0;da(35)}function Q4a(a,b){a=+a;b=b|0;da(36);return 0}function R4a(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;da(37);return 0}function S4a(a,b,c,d,e,f,g,h,i){a=a|0;b=+b;c=+c;d=+d;e=+e;f=f|0;g=g|0;h=h|0;i=i|0;da(38);return 0}function T4a(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;da(39)}function U4a(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;_a(a|0,b|0,c|0,d|0)}\n\n\n\n\n// EMSCRIPTEN_END_FUNCS\nvar Ec=[e4a,ZP,nV,bW,KX,NX,rda,tda,uda,rxa,qIa,AIa,sca,FZ,e4a,e4a];var Fc=[f4a,zr,nr,rA,HA,IA,rz,sN,OS,_T,cX,Zsa,kKa,YTa,tXa,l_a,BVa,nWa,oWa,K0a,r2a,q2a,B8,C8,q8,D8,E8,F8,G8,S9,Pha,Rha,Sha,Tha,Uha,sia,tia,via,wia,xia,Qia,Pia,Oia,Nia,Mia,f4a,f4a,f4a,f4a,f4a,f4a,f4a,f4a,f4a,f4a,f4a,f4a,f4a,f4a,f4a,f4a,f4a,f4a,f4a];var Gc=[g4a,Fs,Ks,Ls,Nua,Oua,Z_a,AXa,FVa,nUa,lWa,pUa,mWa,OXa,cXa,g4a];var Hc=[h4a,AW,$W,mX,Fxa,sKa,h4a,h4a];var Ic=[i4a,Xe,df,Eh,Ii,Qh,Sh,Oi,Dj,Fj,Gj,Ik,Jk,$j,Kk,nk,ok,Mk,Nk,Pk,Qk,cl,em,As,Bs,Cs,Ds,Es,Gs,Hs,Is,Js,Ms,fs,Rr,Ys,Zs,Br,_s,at,Tr,ns,os,Nt,Ot,Rt,Xt,Yt,_t,ty,py,zy,yy,Cy,Ey,Iz,Hz,Pz,Zz,cA,NA,OA,EB,pD,mD,ZF,YF,bK,IL,JL,KL,hQ,DQ,EQ,FQ,VQ,WQ,BR,CR,DR,qR,rR,xR,jR,$Q,$R,aS,bS,rS,sS,DS,ES,FS,GS,KS,LS,MS,bT,cT,_S,VS,xT,VT,WT,XT,LT,MT,HT,DT,OT,QT,YT,PT,RT,$T,ZT,rU,RU,SU,TU,GU,HU,BU,xU,KU,MU,UU,LU,NU,VU,FV,GV,aX,AV,lX,KV,TX,sY,f5,j5,n5,r5,v5,z5,D5,H5,L5,P5,T5,X5,$5,d6,h6,l6,p6,t6,x6,B6,F6,J6,N6,R6,V6,Z6,b7,f7,j7,G7,Gda,Mda,Oda,Ypa,Zpa,Oqa,iua,Xra,Yra,Zra,_ra,zta,xsa,Asa,ysa,Bta,ita,jta,nta,mta,Esa,Gta,dua,Eta,eua,fua,gua,hua,pwa,Lua,Wua,Yua,pva,Rua,Mua,Xua,Zua,qva,owa,Hwa,Jwa,Nva,Fwa,Bwa,uwa,Kwa,zwa,xwa,Uwa,Ova,rwa,Iwa,Gwa,Dwa,vwa,Lwa,Awa,ywa,Vwa,Rxa,ixa,Jxa,ZFa,cGa,tIa,gKa,HQa,IQa,JQa,KQa,LQa,MQa,NQa,OQa,PQa,QQa,FTa,PZa,u_a,v_a,O_a,VTa,t_a,z_a,w_a,x_a,o_a,p_a,PTa,EZa,IZa,GTa,hXa,wXa,S_a,kXa,vZa,zXa,qZa,X_a,ATa,tUa,WUa,xUa,DVa,IUa,wVa,vUa,XUa,eWa,rWa,tWa,qVa,sWa,uWa,rVa,$Va,dWa,NWa,dXa,SXa,TXa,A$a,XXa,dYa,z$a,G$a,N$a,O$a,H$a,S$a,r0a,t0a,s0a,B0a,X0a,F0a,C0a,zd,tW,yX,AX,CX,wX,SX,TY,kY,lY,mY,eca,yZ,x_,Q8,Z8,x9,M9,Paa,jba,dfa,pfa,kfa,$ea,Iha,$ha,Hia,oGa,GLa,dTa,eTa,fTa,j1a,k1a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a,i4a];var Jc=[j4a,LX,uxa,Hxa];var Kc=[k4a,dz,jz,oz,Gz,sA,tz,k4a];var Lc=[l4a,_d,$d,be,We,th,uh,ug,eh,gh,Jh,Ei,Ni,Pi,Km,js,Ns,Os,Ps,Nr,Rs,Ss,Ts,Us,Vs,Ws,$s,ps,qs,rs,ss,ts,us,bt,Pt,Tt,Zt,wu,Jv,dv,fv,ov,tv,Hw,_w,Kw,tA,FA,GA,DB,FB,aJ,DJ,OI,BJ,bL,KJ,cL,JK,MM,OM,PM,JN,pN,MN,iO,EP,bQ,NP,xP,cQ,mQ,vR,wR,qV,rV,sV,tV,uV,vV,xV,jV,kV,YV,WV,XV,xW,rW,uW,kX,JX,HX,IX,OX,Lda,uoa,voa,xoa,Boa,Eoa,Foa,Hoa,Moa,Noa,xpa,ypa,Bpa,Cpa,Dpa,Npa,Opa,Ppa,Qpa,Rpa,Spa,_pa,$pa,gqa,$ra,asa,bsa,Fsa,wsa,wta,bta,cta,dta,Tta,Uta,gta,hta,kta,Xta,aua,bua,cua,Csa,Uua,rva,eva,Vua,sva,fva,Wwa,Xwa,Mwa,Ywa,Zwa,Nwa,Sxa,Txa,Wxa,Xxa,Yxa,_xa,Dya,qGa,yGa,zGa,zHa,bKa,pKa,xKa,NLa,OLa,PLa,jLa,bMa,CNa,xOa,QOa,VOa,XOa,jQa,oQa,qQa,eRa,$Qa,fRa,kRa,mRa,BRa,CRa,HRa,JRa,pSa,qSa,rSa,sSa,vTa,tTa,__a,y_a,ZTa,bUa,VVa,AWa,W$a,f0a,d2a,aaa,DX,uX,caa,bY,PX,yca,zca,KZ,JZ,I1,J1,O1,P1,U1,V1,M2,S2,W2,gaa,naa,oaa,paa,qaa,saa,_ia,$ia,Eea,kia,mia,UPa,VPa,WPa,bPa,l4a,l4a,l4a,l4a,l4a,l4a,l4a,l4a,l4a,l4a,l4a,l4a,l4a,l4a,l4a,l4a,l4a,l4a,l4a,l4a,l4a,l4a];var Mc=[m4a];var Nc=[n4a,cW,yW,oX,nca,CZ,n4a,n4a];var Oc=[o4a,isa,msa,osa];var Pc=[p4a,wS];var Qc=[q4a,ae,ce,fe,ze,Rg,Tg,Vg,Bi,Lh,Oh,Wi,fj,Bj,Vj,Wj,Ek,_j,pk,qk,Av,Bv,Cv,Xu,_u,wv,Ww,Yw,Zw,Vw,Rw,uA,hz,lz,Bz,Nz,Tz,Xz,aA,qz,VB,aC,fC,YB,EJ,XK,KN,kO,AP,VP,TP,XP,JWa,_Wa,kQ,XQ,YQ,sR,tS,uS,dT,WS,kT,sT,NT,ET,mU,IU,yU,aV,CV,EV,QW,qX,WX,XX,YX,e5,i5,m5,q5,u5,y5,C5,G5,K5,O5,S5,W5,_5,c6,g6,k6,o6,s6,w6,A6,E6,I6,M6,Q6,U6,Y6,a7,e7,i7,F7,Fda,Eda,Hda,woa,yoa,Doa,Loa,zpa,ata,hva,iva,Ixa,tHa,uIa,vIa,VJa,eKa,oKa,qKa,uKa,fMa,qNa,sNa,tNa,MNa,ANa,XNa,ZNa,BOa,LOa,YPa,hQa,iQa,UQa,VQa,XQa,yRa,pTa,lTa,mTa,WTa,WZa,XTa,YZa,$Za,a_a,b_a,c_a,d_a,e_a,f_a,g_a,h_a,nXa,pXa,qXa,wTa,sXa,TZa,XZa,CTa,DTa,YUa,_Ua,LUa,KUa,RVa,MUa,SVa,HVa,KVa,QVa,TWa,rXa,B$a,C$a,v0a,w0a,x0a,H0a,J0a,m2a,N2a,Od,sW,eaa,CY,DY,EY,FY,dY,gY,eY,fY,hca,Cca,zZ,LZ,MZ,w_,K1,Q1,W1,c3,aba,bba,Gca,Hca,Ica,Jca,Fca,Dca,xda,vda,Xda,Zea,FJa,ILa,kFa,rPa,lPa,vPa,wPa,mPa,oPa,tPa,uPa,FPa,GPa,HPa,IPa,xQa,q4a,q4a,q4a,q4a,q4a,q4a,q4a,q4a,q4a,q4a,q4a,q4a,q4a,q4a,q4a,q4a,q4a];var Rc=[r4a,Zd,de,Ve,_e,Ze,dl,sg,rg,tg,dh,ch,sh,rh,zh,yi,zi,Ui,Ti,Vi,yj,xj,Gk,Hk,Wk,Vk,fm,gm,zm,ym,Em,Dm,qp,pp,Wp,Vp,bq,aq,Iq,Hq,dr,ds,hr,br,$q,cr,ar,ms,ls,mr,ft,$p,tt,_p,vt,Kt,Lt,St,Ut,Vt,$t,vu,uu,Wu,Vu,Mv,Nv,hv,Kv,Lv,pv,sv,rv,Iv,Fw,Ew,cx,dx,Nx,Ox,Qx,Rx,Vx,Wx,Zx,_x,ay,by,oy,ny,xy,wy,By,Ay,xA,yA,zA,AA,BA,CA,zz,yz,Mz,Lz,Sz,Rz,Wz,Vz,$z,_z,DA,EA,AB,BB,QA,SB,RB,_B,ZB,cC,bC,TB,iC,jC,kC,lD,kD,tF,sF,OD,RD,SD,CF,VD,ZD,$D,eE,mE,iE,nE,oE,qE,rE,tE,wE,zE,BE,DE,GE,HE,KE,OE,RE,TE,WE,mF,_E,fF,gF,YE,ZE,$E,eF,hF,iF,jF,kF,lF,pF,qF,LD,PD,aE,bE,cE,fE,gE,hE,sE,uE,vE,xE,MD,yE,AE,CE,EE,FE,IE,JE,LE,NE,PE,QE,SE,UE,XE,nF,oF,rF,am,bm,cG,bG,gG,fG,qG,rG,KM,LM,HN,IN,vN,uN,YN,XN,zP,yP,aQ,$P,fQ,eQ,sQ,qQ,tR,tQ,rQ,uR,GR,IR,HR,TR,SR,TS,RS,US,SS,iT,gT,jT,hT,qT,oT,rT,pT,BT,zT,CT,AT,kU,iU,lU,jU,vU,tU,wU,uU,ZU,YU,wV,gV,fV,oV,pV,UV,TV,eW,fW,pW,oW,DW,EW,FW,ZW,YW,jX,iX,tX,sX,$X,ZX,_X,tY,uY,toa,zoa,Joa,Koa,wpa,Epa,Fpa,Mpa,Lpa,bqa,aqa,lqa,kqa,wqa,vqa,Mqa,Nqa,Pqa,Hqa,Gqa,Vqa,Tqa,jua,Sqa,Rqa,ara,_qa,Zqa,Yqa,fra,era,dra,cra,lra,jra,ira,hra,sra,pra,ora,nra,yra,xra,wra,vra,Era,Dra,Cra,Bra,Lra,Ira,Hra,Gra,Rra,Pra,Ora,Nra,Vra,uta,vta,qta,Ura,Tra,mqa,qua,jqa,sua,xua,wua,Hua,Gua,Iua,Kua,yva,xva,Mva,Lva,Owa,Qwa,Pwa,Rwa,exa,dxa,Pxa,Qxa,Uxa,hxa,Zxa,Oxa,Nxa,$xa,aya,Bya,Cya,HCa,GCa,PCa,OCa,gDa,fDa,XFa,$Fa,IGa,HGa,vHa,wHa,THa,SHa,lIa,jIa,iIa,EIa,FIa,WJa,YJa,_Ja,$Ja,aKa,lKa,rKa,tKa,wKa,zKa,EKa,IKa,kLa,aMa,mNa,KNa,SNa,WNa,wOa,ROa,UOa,WOa,kQa,nQa,pQa,rQa,gRa,jRa,lRa,nRa,DRa,GRa,IRa,KRa,QRa,URa,hUa,iUa,mZa,HTa,ITa,T_a,TTa,wZa,xZa,L_a,M_a,m$a,n$a,$Ta,aUa,G_a,uXa,vXa,iXa,jXa,fUa,gUa,J_a,R_a,kUa,lUa,zVa,wUa,GUa,uUa,QUa,RUa,DUa,EUa,FUa,gWa,sUa,rUa,vVa,uVa,AVa,xVa,aWa,bWa,cWa,yWa,xWa,aXa,$Wa,gXa,fXa,RXa,QXa,WXa,VXa,cYa,bYa,cZa,bZa,jZa,iZa,pZa,oZa,y$a,x$a,F$a,E$a,L$a,R$a,Q$a,$$a,q0a,p0a,A0a,z0a,Y0a,D0a,c2a,b2a,h2a,k2a,i2a,j2a,l2a,Je,he,_9,$9,xX,zX,BX,aY,QX,RX,fca,EZ,N2,T2,X2,T8,U8,V8,W8,X8,f9,g9,h9,D9,C9,R9,haa,iaa,jaa,maa,zaa,Aaa,Caa,Iaa,Saa,gba,kba,cda,dda,Fea,Oha,Qha,Wha,Lia,Kia,bia,dia,iia,jia,ria,zia,Eia,kGa,JLa,DLa,nLa,jMa,oMa,BMa,xMa,IOa,XPa,zSa,fZa,aZa,Y1a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a,r4a];var Sc=[s4a,ez,wA,s4a];var Tc=[t4a,Hj,ak,jr,AQ,CQ,OR,PR,YR,mT,qY,t2a,s2a,hMa,iMa,mMa,nMa,t4a,t4a,t4a,t4a,t4a,t4a,t4a,t4a,t4a,t4a,t4a,t4a,t4a,t4a,t4a];var Uc=[u4a,jDa,lO,PP,cDa,u4a,u4a,u4a];var Vc=[v4a,ol,pl,Qs,Xs,fta,lta,_ua,cva,$ua,dva,Y_a,dUa,eUa,BXa,GVa];var Wc=[w4a,hj,Zi,Mj,hk,cz,vA,Fz,kN,RP,NQ,lS,_W,nX,rY,Bxa,Cxa,Exa,vGa,qca,DZ,eba,fba,w4a,w4a,w4a,w4a,w4a,w4a,w4a,w4a,w4a];var Xc=[x4a,y4a,V1a,X1a];var Yc=[z4a,ER];var Zc=[A4a,zW,Gxa,A4a];var _c=[B4a,Jsa,Qsa,Ssa,Tsa,B4a,B4a,B4a];var $c=[C4a,g1];var ad=[D4a,Lk,pr,fz,kz,pz,Jz,hA,uz,N9,O9,Daa,Faa,Qaa,Taa,Xha];var bd=[E4a,yS];var cd=[F4a,Kya,Lya,Nya,Mya,Oya,F4a,F4a];var dd=[G4a,Sg,Ug,Wg,Xg,Yg,Zg,hh,ih,Ji,Ki,Li,Mi,yk,zk,Ak,Bk,Zj,Bm,Gm,Hm,Jm,zp,ks,Cr,vs,ws,xs,ys,zs,Mt,Qt,Wt,au,Dv,Ev,Ju,Gv,Hv,gv,Fv,Xw,Iw,Jw,$w,CB,LA,UB,$B,dC,XB,JJ,PJ,iK,_K,HL,NM,iDa,lN,jO,UP,BWa,yR,zR,AR,iR,HS,IS,JS,YS,wT,ST,TT,UT,GT,qU,OU,PU,QU,AU,_U,BV,RW,YZ,ZZ,_Z,Cda,Dda,Nda,Apa,Tpa,Vpa,Wpa,dqa,eqa,hqa,Hsa,Ksa,Lsa,Msa,Nsa,Osa,Psa,Rsa,Usa,Vta,Sua,lva,tva,ava,Tua,mva,uva,bva,Swa,Twa,gxa,Dxa,Eya,WFa,YFa,_Fa,aGa,dGa,wGa,xGa,uGa,sHa,yHa,mIa,rIa,wIa,xIa,cKa,mKa,yKa,AKa,BKa,CKa,DKa,FKa,GKa,HKa,JKa,KKa,YLa,$La,DMa,EMa,FMa,GMa,HMa,IMa,JMa,KMa,LMa,MMa,NMa,OMa,PMa,QMa,RMa,SMa,TMa,UMa,VMa,WMa,XMa,YMa,ZMa,_Ma,$Ma,aNa,bNa,cNa,dNa,eNa,fNa,gNa,hNa,iNa,jNa,kNa,lNa,nNa,oNa,rNa,uNa,vNa,wNa,LNa,NNa,ONa,PNa,QNa,RNa,TNa,UNa,VNa,YNa,ENa,zNa,xNa,tOa,vOa,JOa,KOa,SOa,$Oa,lQa,uQa,wQa,dRa,ZQa,_Qa,aRa,TQa,WQa,hRa,pRa,tRa,uRa,vRa,zRa,ARa,xRa,ERa,ORa,PRa,RRa,SRa,TRa,VRa,WRa,uTa,sTa,qTa,oTa,_Xa,$Xa,eYa,hYa,jh,lh,sw,uw,VI,YM,qP,rP,sP,tP,EX,w2a,H1,N1,T1,y9,z9,A9,B9,Jaa,Kaa,Laa,Maa,efa,qfa,lfa,afa,Kha,Lha,Mha,aia,cia,lia,nia,pia,Fia,lna,mGa,AGa,KHa,zIa,DJa,EJa,PKa,WKa,oLa,bOa,cOa,cPa,fPa,AQa,zQa,qRa,XRa,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a,G4a];var ed=[H4a,Hi,bj,dj,Ij,Jj,Kj,Lj,Nj,Oj,dk,ek,fk,gk,ik,jk,Ok,bz,iz,mz,Ez,Oz,Uz,Yz,bA,sz,WP,YP,IQ,KQ,LQ,MQ,PQ,QQ,RQ,LR,MR,NR,fS,hS,jS,kS,mS,nS,oS,vT,pU,cV,dV,BW,VX,Vea,Wea,Xea,Tea,eta,KBa,tDa,sIa,dKa,iKa,jKa,INa,JNa,DNa,_Na,FNa,TOa,_Oa,mQa,vQa,bRa,iRa,FRa,NRa,Nd,Bca,GZ,N7,B7,y7,M7,L7,hba,iba,hLa,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a,H4a];var fd=[I4a,mUa,jWa,oUa,kWa,NXa,bXa,I4a];var gd=[J4a,cUa];var hd=[K4a,NS];var id=[L4a,ee,Be,Ae,Fi,Gi,Nh,Yi,_i,aj,Rj,Sj,Uj,Yj,sk,kk,lk,mk,Fm,Im,CJ,GP,QP,SP,FWa,SQ,UQ,pR,VR,pS,qS,XS,lT,tT,uT,FT,KT,nU,oU,zU,FU,DV,pY,kZ,lZ,mZ,nZ,oZ,pZ,qZ,rZ,sZ,c5,d5,g5,h5,k5,l5,o5,p5,s5,t5,w5,x5,A5,B5,E5,F5,I5,J5,M5,N5,Q5,R5,U5,V5,Y5,Z5,a6,b6,e6,f6,i6,j6,m6,n6,q6,r6,u6,v6,y6,z6,C6,D6,G6,H6,K6,L6,O6,P6,S6,T6,W6,X6,_6,$6,c7,d7,g7,h7,D7,E7,H7,I7,J7,K7,Nba,Oba,Pba,Qba,Rba,Sba,Tba,Uba,Vba,Wba,Xba,Yba,Zba,_ba,$ba,aca,bca,cca,dca,Ffa,Gfa,Hfa,Ifa,Jfa,Kfa,Lfa,Mfa,Nfa,Ofa,Pfa,Qfa,Rfa,Sfa,Tfa,Ufa,Vfa,Wfa,Xfa,Yfa,Zfa,_fa,$fa,aga,bga,cga,dga,ega,fga,gga,hga,iga,jga,kga,lga,mga,nga,oga,pga,qga,rga,sga,tga,uga,vga,wga,xga,yga,zga,Aga,Bga,Cga,Dga,Ega,Fga,yfa,zfa,Afa,Bfa,Cfa,Dfa,Efa,Nga,Oga,Pga,Qga,Rga,Sga,Tga,Uga,Vga,Wga,Xga,Yga,Zga,_ga,$ga,aha,bha,cha,dha,eha,fha,gha,hha,iha,jha,kha,lha,mha,nha,oha,pha,qha,rha,sha,tha,uha,vha,wha,xha,yha,zha,Aha,Bha,Gga,Hga,Iga,Jga,Kga,Lga,Mga,Aoa,Coa,Ooa,cqa,fqa,$sa,mwa,nwa,mxa,pxa,XJa,fKa,vKa,cMa,dMa,pNa,HNa,yNa,yOa,zOa,COa,DOa,MOa,YOa,ZOa,sQa,tQa,cRa,YQa,oRa,wRa,LRa,MRa,rTa,nTa,i_a,MXa,xTa,yTa,$Ua,M4a,AY,BY,Aca,ica,tZ,BZ,G1,M1,S1,cba,dba,jGa,nGa,GJa,gLa,YEa,TPa,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a,L4a];var jd=[N4a];var kd=[O4a,fxa];var ld=[P4a,Xd,ng,Gh,Hh,Ai,Kh,tl,Cm,rr,vr,xr,Er,Fr,Gr,Jr,Kr,Lr,Mr,Dr,ZK,LN,rN,mO,DWa,nQ,dR,eR,GQ,HQ,kR,fR,JR,KR,xS,eT,aU,bU,cU,dU,eU,fU,gU,JU,bV,yV,HV,IV,JV,dW,CW,GX,Fba,Gba,Hba,Iba,Jba,Kba,Lba,Mba,Ida,qoa,roa,Goa,csa,dsa,esa,fsa,gsa,hsa,jsa,ksa,lsa,nsa,psa,qsa,Gsa,rsa,vsa,Jta,Kta,Lta,Mta,Nta,Ota,Wta,Yta,Zta,_ta,$ta,pta,zsa,jva,kva,swa,awa,cwa,ewa,gwa,iwa,kwa,Pva,Qva,Rva,Sva,twa,bwa,dwa,fwa,hwa,jwa,lwa,bGa,xHa,ZKa,ZLa,_La,eMa,uOa,AOa,c$a,d$a,i$a,j$a,k$a,l$a,LZa,NZa,lXa,yXa,BTa,JUa,fWa,pWa,kVa,aVa,eVa,gVa,iVa,mVa,oVa,qWa,lVa,dVa,fVa,hVa,jVa,pVa,nVa,VWa,J$a,Y$a,Z$a,d0a,e0a,u0a,G0a,Pd,Nu,Ou,raa,uca,IZ,m1,l1,o1,n1,p1,q1,s1,r1,u1,t1,v1,w1,x1,y1,z1,A1,B1,C1,D1,E1,G2,L2,R2,V2,$2,h3,p3,w3,x3,Y8,Dea,Cea,Uea,cfa,ofa,rfa,jfa,_ea,gfa,KEa,HEa,RJa,ELa,FLa,rLa,gMa,lMa,kEa,dPa,ePa,gPa,hPa,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a,P4a];var md=[Q4a,Y4,Z4,_4,$4,a5,b5,Q4a];var nd=[R4a,XW,pX,gIa];var od=[S4a,Vxa];var pd=[T4a,ul,Ci,Di,Pj,Qj,Xj,rk,bk,ck,Hr,Ir,$r,$u,xv,Pw,yQ,nR,oR,WR,dS,eS,$S,aT,IT,JT,CU,EU,bX,UX,Ioa,Hta,Ita,Tva,Yva,_va,Xva,Zva,$va,MBa,sDa,ZJa,hKa,nKa,n2a,o2a,U4a,R8,T9,U9,V9,W9,X9,Y9,Eaa,Gaa,Uaa,Vaa,Waa,Xaa,Yaa,Zaa,_aa,Iia,Jia,pLa,qLa,FOa,JPa,KPa,LPa,MPa,NPa,OPa,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a,T4a];return{_PDFiumJS_Bitmap_get_stride:Id,_strlen:Y2a,_PDFiumJS_Page_get_height:Fd,_PDFiumJS_Doc_get_page_count:Cd,_PDFiumJS_init:yd,_bitshift64Lshr:a3a,_calloc:w2a,_bitshift64Shl:g3a,_PDFiumJS_Bitmap_get_buffer:Hd,_PDFiumJS_Bitmap_destroy:Jd,_strncpy:Z2a,_bitshift64Ashr:$2a,_memset:f3a,_memcpy:c3a,_i64Subtract:X2a,_rand_r:U2a,_realloc:x2a,_i64Add:W2a,_llvm_bswap_i16:i3a,_PDFiumJS_Doc_get_page:Dd,_PDFiumJS_Page_get_bitmap:Gd,_llvm_bswap_i32:e3a,_rand:V2a,_testSetjmp:b3a,_saveSetjmp:_2a,_free:v2a,_PDFiumJS_Doc_delete:Bd,_PDFiumJS_Page_get_width:Ed,_memmove:d3a,_PDFiumJS_Doc_new:Ad,_malloc:u2a,_PDFiumJS_Page_destroy:Kd,_strcpy:h3a,__GLOBAL__I_a:v$a,runPostSets:T2a,stackAlloc:qd,stackSave:rd,stackRestore:sd,setThrew:td,setTempRet0:wd,getTempRet0:xd,dynCall_iiiiiiii:s3a,dynCall_viiiii:t3a,dynCall_vid:u3a,dynCall_iiiiiiiiii:v3a,dynCall_vii:w3a,dynCall_iiiiiiiiiii:x3a,dynCall_iiiddd:y3a,dynCall_ii:z3a,dynCall_viidddd:A3a,dynCall_iiiiiiiiiiii:B3a,dynCall_vidi:C3a,dynCall_viiddii:D3a,dynCall_iiii:E3a,dynCall_vi:F3a,dynCall_iiidddd:G3a,dynCall_viiiiii:H3a,dynCall_viiiiiiii:I3a,dynCall_di:J3a,dynCall_iiiiiii:K3a,dynCall_v:L3a,dynCall_vidddd:M3a,dynCall_iiiiiiiiiiiii:N3a,dynCall_iid:O3a,dynCall_diid:P3a,dynCall_viiiiiii:Q3a,dynCall_viiiiiiiii:R3a,dynCall_viiiiiiiiii:S3a,dynCall_iii:T3a,dynCall_iiiiii:U3a,dynCall_vidddddd:V3a,dynCall_did:W3a,dynCall_viiiiiiiiiiii:X3a,dynCall_iiiii:Y3a,dynCall_i:Z3a,dynCall_iiiiiiidiii:_3a,dynCall_viii:$3a,dynCall_idi:a4a,dynCall_iiiiiiiii:b4a,dynCall_iiddddiiii:c4a,dynCall_viiii:d4a}\n// EMSCRIPTEN_END_ASM\n\n})({\"Math\":Math,\"Int8Array\":Int8Array,\"Int16Array\":Int16Array,\"Int32Array\":Int32Array,\"Uint8Array\":Uint8Array,\"Uint16Array\":Uint16Array,\"Uint32Array\":Uint32Array,\"Float32Array\":Float32Array,\"Float64Array\":Float64Array},{\"abort\":abort,\"assert\":assert,\"asmPrintInt\":asmPrintInt,\"asmPrintFloat\":asmPrintFloat,\"min\":Math_min,\"invoke_iiiiiiii\":invoke_iiiiiiii,\"invoke_viiiii\":invoke_viiiii,\"invoke_vid\":invoke_vid,\"invoke_iiiiiiiiii\":invoke_iiiiiiiiii,\"invoke_vii\":invoke_vii,\"invoke_iiiiiiiiiii\":invoke_iiiiiiiiiii,\"invoke_iiiddd\":invoke_iiiddd,\"invoke_ii\":invoke_ii,\"invoke_viidddd\":invoke_viidddd,\"invoke_iiiiiiiiiiii\":invoke_iiiiiiiiiiii,\"invoke_vidi\":invoke_vidi,\"invoke_viiddii\":invoke_viiddii,\"invoke_iiii\":invoke_iiii,\"invoke_vi\":invoke_vi,\"invoke_iiidddd\":invoke_iiidddd,\"invoke_viiiiii\":invoke_viiiiii,\"invoke_viiiiiiii\":invoke_viiiiiiii,\"invoke_di\":invoke_di,\"invoke_iiiiiii\":invoke_iiiiiii,\"invoke_v\":invoke_v,\"invoke_vidddd\":invoke_vidddd,\"invoke_iiiiiiiiiiiii\":invoke_iiiiiiiiiiiii,\"invoke_iid\":invoke_iid,\"invoke_diid\":invoke_diid,\"invoke_viiiiiii\":invoke_viiiiiii,\"invoke_viiiiiiiii\":invoke_viiiiiiiii,\"invoke_viiiiiiiiii\":invoke_viiiiiiiiii,\"invoke_iii\":invoke_iii,\"invoke_iiiiii\":invoke_iiiiii,\"invoke_vidddddd\":invoke_vidddddd,\"invoke_did\":invoke_did,\"invoke_viiiiiiiiiiii\":invoke_viiiiiiiiiiii,\"invoke_iiiii\":invoke_iiiii,\"invoke_i\":invoke_i,\"invoke_iiiiiiidiii\":invoke_iiiiiiidiii,\"invoke_viii\":invoke_viii,\"invoke_idi\":invoke_idi,\"invoke_iiiiiiiii\":invoke_iiiiiiiii,\"invoke_iiddddiiii\":invoke_iiddddiiii,\"invoke_viiii\":invoke_viiii,\"_fabs\":_fabs,\"_sqrtf\":_sqrtf,\"_fread\":_fread,\"__reallyNegative\":__reallyNegative,\"___assert_fail\":___assert_fail,\"_floor\":_floor,\"__ZSt18uncaught_exceptionv\":__ZSt18uncaught_exceptionv,\"_longjmp\":_longjmp,\"_fsync\":_fsync,\"_sbrk\":_sbrk,\"___cxa_begin_catch\":___cxa_begin_catch,\"_emscripten_memcpy_big\":_emscripten_memcpy_big,\"_rint\":_rint,\"_sysconf\":_sysconf,\"_close\":_close,\"_cos\":_cos,\"_readdir\":_readdir,\"_puts\":_puts,\"_unlink\":_unlink,\"_write\":_write,\"_ftell\":_ftell,\"_log\":_log,\"___cxa_atexit\":___cxa_atexit,\"_gmtime_r\":_gmtime_r,\"___cxa_does_inherit\":___cxa_does_inherit,\"_closedir\":_closedir,\"_send\":_send,\"_atan2\":_atan2,\"___cxa_is_number_type\":___cxa_is_number_type,\"___cxa_find_matching_catch\":___cxa_find_matching_catch,\"_opendir\":_opendir,\"_strerror_r\":_strerror_r,\"___setErrNo\":___setErrNo,\"___resumeException\":___resumeException,\"_putchar\":_putchar,\"_gmtime\":_gmtime,\"_lrintf\":_lrintf,\"_pthread_once\":_pthread_once,\"_printf\":_printf,\"_localtime\":_localtime,\"_read\":_read,\"_fwrite\":_fwrite,\"_time\":_time,\"_pthread_mutex_lock\":_pthread_mutex_lock,\"_readdir_r\":_readdir_r,\"_llvm_pow_f64\":_llvm_pow_f64,\"_lseek\":_lseek,\"_vfprintf\":_vfprintf,\"_rmdir\":_rmdir,\"___cxa_allocate_exception\":___cxa_allocate_exception,\"_ceilf\":_ceilf,\"_pwrite\":_pwrite,\"_localtime_r\":_localtime_r,\"_tzset\":_tzset,\"_open\":_open,\"_fabsf\":_fabsf,\"_remove\":_remove,\"_pthread_getspecific\":_pthread_getspecific,\"_fseek\":_fseek,\"_pthread_mutex_destroy\":_pthread_mutex_destroy,\"_fclose\":_fclose,\"_floorf\":_floorf,\"_pthread_key_create\":_pthread_key_create,\"_recv\":_recv,\"_abort\":_abort,\"_abs\":_abs,\"_fopen\":_fopen,\"___cxa_pure_virtual\":___cxa_pure_virtual,\"_sin\":_sin,\"_acos\":_acos,\"_fflush\":_fflush,\"_fprintf\":_fprintf,\"_log10\":_log10,\"_fileno\":_fileno,\"_fputs\":_fputs,\"_pthread_mutex_unlock\":_pthread_mutex_unlock,\"_pread\":_pread,\"_PDFiumJS_read_file\":_PDFiumJS_read_file,\"_mkport\":_mkport,\"___errno_location\":___errno_location,\"_pthread_setspecific\":_pthread_setspecific,\"_fputc\":_fputc,\"___cxa_throw\":___cxa_throw,\"_strerror\":_strerror,\"_emscripten_longjmp\":_emscripten_longjmp,\"__formatString\":__formatString,\"_atexit\":_atexit,\"_sqrt\":_sqrt,\"_pthread_mutex_init\":_pthread_mutex_init,\"STACKTOP\":STACKTOP,\"STACK_MAX\":STACK_MAX,\"tempDoublePtr\":tempDoublePtr,\"ABORT\":ABORT,\"cttz_i8\":cttz_i8,\"ctlz_i8\":ctlz_i8,\"___rand_seed\":___rand_seed,\"NaN\":NaN,\"Infinity\":Infinity,\"___dso_handle\":___dso_handle,\"_stderr\":_stderr},buffer);var _PDFiumJS_Bitmap_get_stride=Module[\"_PDFiumJS_Bitmap_get_stride\"]=asm[\"_PDFiumJS_Bitmap_get_stride\"];var _strlen=Module[\"_strlen\"]=asm[\"_strlen\"];var _PDFiumJS_Page_get_height=Module[\"_PDFiumJS_Page_get_height\"]=asm[\"_PDFiumJS_Page_get_height\"];var _PDFiumJS_Doc_get_page_count=Module[\"_PDFiumJS_Doc_get_page_count\"]=asm[\"_PDFiumJS_Doc_get_page_count\"];var _PDFiumJS_init=Module[\"_PDFiumJS_init\"]=asm[\"_PDFiumJS_init\"];var _bitshift64Lshr=Module[\"_bitshift64Lshr\"]=asm[\"_bitshift64Lshr\"];var _calloc=Module[\"_calloc\"]=asm[\"_calloc\"];var _bitshift64Shl=Module[\"_bitshift64Shl\"]=asm[\"_bitshift64Shl\"];var _PDFiumJS_Bitmap_get_buffer=Module[\"_PDFiumJS_Bitmap_get_buffer\"]=asm[\"_PDFiumJS_Bitmap_get_buffer\"];var _PDFiumJS_Bitmap_destroy=Module[\"_PDFiumJS_Bitmap_destroy\"]=asm[\"_PDFiumJS_Bitmap_destroy\"];var _strncpy=Module[\"_strncpy\"]=asm[\"_strncpy\"];var _bitshift64Ashr=Module[\"_bitshift64Ashr\"]=asm[\"_bitshift64Ashr\"];var _memset=Module[\"_memset\"]=asm[\"_memset\"];var _memcpy=Module[\"_memcpy\"]=asm[\"_memcpy\"];var _i64Subtract=Module[\"_i64Subtract\"]=asm[\"_i64Subtract\"];var _rand_r=Module[\"_rand_r\"]=asm[\"_rand_r\"];var _realloc=Module[\"_realloc\"]=asm[\"_realloc\"];var _i64Add=Module[\"_i64Add\"]=asm[\"_i64Add\"];var _llvm_bswap_i16=Module[\"_llvm_bswap_i16\"]=asm[\"_llvm_bswap_i16\"];var _PDFiumJS_Doc_get_page=Module[\"_PDFiumJS_Doc_get_page\"]=asm[\"_PDFiumJS_Doc_get_page\"];var _PDFiumJS_Page_get_bitmap=Module[\"_PDFiumJS_Page_get_bitmap\"]=asm[\"_PDFiumJS_Page_get_bitmap\"];var _llvm_bswap_i32=Module[\"_llvm_bswap_i32\"]=asm[\"_llvm_bswap_i32\"];var _rand=Module[\"_rand\"]=asm[\"_rand\"];var _testSetjmp=Module[\"_testSetjmp\"]=asm[\"_testSetjmp\"];var _saveSetjmp=Module[\"_saveSetjmp\"]=asm[\"_saveSetjmp\"];var _free=Module[\"_free\"]=asm[\"_free\"];var _PDFiumJS_Doc_delete=Module[\"_PDFiumJS_Doc_delete\"]=asm[\"_PDFiumJS_Doc_delete\"];var _PDFiumJS_Page_get_width=Module[\"_PDFiumJS_Page_get_width\"]=asm[\"_PDFiumJS_Page_get_width\"];var _memmove=Module[\"_memmove\"]=asm[\"_memmove\"];var _PDFiumJS_Doc_new=Module[\"_PDFiumJS_Doc_new\"]=asm[\"_PDFiumJS_Doc_new\"];var _malloc=Module[\"_malloc\"]=asm[\"_malloc\"];var _PDFiumJS_Page_destroy=Module[\"_PDFiumJS_Page_destroy\"]=asm[\"_PDFiumJS_Page_destroy\"];var _strcpy=Module[\"_strcpy\"]=asm[\"_strcpy\"];var __GLOBAL__I_a=Module[\"__GLOBAL__I_a\"]=asm[\"__GLOBAL__I_a\"];var runPostSets=Module[\"runPostSets\"]=asm[\"runPostSets\"];var dynCall_iiiiiiii=Module[\"dynCall_iiiiiiii\"]=asm[\"dynCall_iiiiiiii\"];var dynCall_viiiii=Module[\"dynCall_viiiii\"]=asm[\"dynCall_viiiii\"];var dynCall_vid=Module[\"dynCall_vid\"]=asm[\"dynCall_vid\"];var dynCall_iiiiiiiiii=Module[\"dynCall_iiiiiiiiii\"]=asm[\"dynCall_iiiiiiiiii\"];var dynCall_vii=Module[\"dynCall_vii\"]=asm[\"dynCall_vii\"];var dynCall_iiiiiiiiiii=Module[\"dynCall_iiiiiiiiiii\"]=asm[\"dynCall_iiiiiiiiiii\"];var dynCall_iiiddd=Module[\"dynCall_iiiddd\"]=asm[\"dynCall_iiiddd\"];var dynCall_ii=Module[\"dynCall_ii\"]=asm[\"dynCall_ii\"];var dynCall_viidddd=Module[\"dynCall_viidddd\"]=asm[\"dynCall_viidddd\"];var dynCall_iiiiiiiiiiii=Module[\"dynCall_iiiiiiiiiiii\"]=asm[\"dynCall_iiiiiiiiiiii\"];var dynCall_vidi=Module[\"dynCall_vidi\"]=asm[\"dynCall_vidi\"];var dynCall_viiddii=Module[\"dynCall_viiddii\"]=asm[\"dynCall_viiddii\"];var dynCall_iiii=Module[\"dynCall_iiii\"]=asm[\"dynCall_iiii\"];var dynCall_vi=Module[\"dynCall_vi\"]=asm[\"dynCall_vi\"];var dynCall_iiidddd=Module[\"dynCall_iiidddd\"]=asm[\"dynCall_iiidddd\"];var dynCall_viiiiii=Module[\"dynCall_viiiiii\"]=asm[\"dynCall_viiiiii\"];var dynCall_viiiiiiii=Module[\"dynCall_viiiiiiii\"]=asm[\"dynCall_viiiiiiii\"];var dynCall_di=Module[\"dynCall_di\"]=asm[\"dynCall_di\"];var dynCall_iiiiiii=Module[\"dynCall_iiiiiii\"]=asm[\"dynCall_iiiiiii\"];var dynCall_v=Module[\"dynCall_v\"]=asm[\"dynCall_v\"];var dynCall_vidddd=Module[\"dynCall_vidddd\"]=asm[\"dynCall_vidddd\"];var dynCall_iiiiiiiiiiiii=Module[\"dynCall_iiiiiiiiiiiii\"]=asm[\"dynCall_iiiiiiiiiiiii\"];var dynCall_iid=Module[\"dynCall_iid\"]=asm[\"dynCall_iid\"];var dynCall_diid=Module[\"dynCall_diid\"]=asm[\"dynCall_diid\"];var dynCall_viiiiiii=Module[\"dynCall_viiiiiii\"]=asm[\"dynCall_viiiiiii\"];var dynCall_viiiiiiiii=Module[\"dynCall_viiiiiiiii\"]=asm[\"dynCall_viiiiiiiii\"];var dynCall_viiiiiiiiii=Module[\"dynCall_viiiiiiiiii\"]=asm[\"dynCall_viiiiiiiiii\"];var dynCall_iii=Module[\"dynCall_iii\"]=asm[\"dynCall_iii\"];var dynCall_iiiiii=Module[\"dynCall_iiiiii\"]=asm[\"dynCall_iiiiii\"];var dynCall_vidddddd=Module[\"dynCall_vidddddd\"]=asm[\"dynCall_vidddddd\"];var dynCall_did=Module[\"dynCall_did\"]=asm[\"dynCall_did\"];var dynCall_viiiiiiiiiiii=Module[\"dynCall_viiiiiiiiiiii\"]=asm[\"dynCall_viiiiiiiiiiii\"];var dynCall_iiiii=Module[\"dynCall_iiiii\"]=asm[\"dynCall_iiiii\"];var dynCall_i=Module[\"dynCall_i\"]=asm[\"dynCall_i\"];var dynCall_iiiiiiidiii=Module[\"dynCall_iiiiiiidiii\"]=asm[\"dynCall_iiiiiiidiii\"];var dynCall_viii=Module[\"dynCall_viii\"]=asm[\"dynCall_viii\"];var dynCall_idi=Module[\"dynCall_idi\"]=asm[\"dynCall_idi\"];var dynCall_iiiiiiiii=Module[\"dynCall_iiiiiiiii\"]=asm[\"dynCall_iiiiiiiii\"];var dynCall_iiddddiiii=Module[\"dynCall_iiddddiiii\"]=asm[\"dynCall_iiddddiiii\"];var dynCall_viiii=Module[\"dynCall_viiii\"]=asm[\"dynCall_viiii\"];Runtime.stackAlloc=asm[\"stackAlloc\"];Runtime.stackSave=asm[\"stackSave\"];Runtime.stackRestore=asm[\"stackRestore\"];Runtime.setTempRet0=asm[\"setTempRet0\"];Runtime.getTempRet0=asm[\"getTempRet0\"];var i64Math=(function(){var goog={math:{}};goog.math.Long=(function(low,high){this.low_=low|0;this.high_=high|0});goog.math.Long.IntCache_={};goog.math.Long.fromInt=(function(value){if(-128<=value&&value<128){var cachedObj=goog.math.Long.IntCache_[value];if(cachedObj){return cachedObj}}var obj=new goog.math.Long(value|0,value<0?-1:0);if(-128<=value&&value<128){goog.math.Long.IntCache_[value]=obj}return obj});goog.math.Long.fromNumber=(function(value){if(isNaN(value)||!isFinite(value)){return goog.math.Long.ZERO}else if(value<=-goog.math.Long.TWO_PWR_63_DBL_){return goog.math.Long.MIN_VALUE}else if(value+1>=goog.math.Long.TWO_PWR_63_DBL_){return goog.math.Long.MAX_VALUE}else if(value<0){return goog.math.Long.fromNumber(-value).negate()}else{return new goog.math.Long(value%goog.math.Long.TWO_PWR_32_DBL_|0,value/goog.math.Long.TWO_PWR_32_DBL_|0)}});goog.math.Long.fromBits=(function(lowBits,highBits){return new goog.math.Long(lowBits,highBits)});goog.math.Long.fromString=(function(str,opt_radix){if(str.length==0){throw Error(\"number format error: empty string\")}var radix=opt_radix||10;if(radix<2||36<radix){throw Error(\"radix out of range: \"+radix)}if(str.charAt(0)==\"-\"){return goog.math.Long.fromString(str.substring(1),radix).negate()}else if(str.indexOf(\"-\")>=0){throw Error('number format error: interior \"-\" character: '+str)}var radixToPower=goog.math.Long.fromNumber(Math.pow(radix,8));var result=goog.math.Long.ZERO;for(var i=0;i<str.length;i+=8){var size=Math.min(8,str.length-i);var value=parseInt(str.substring(i,i+size),radix);if(size<8){var power=goog.math.Long.fromNumber(Math.pow(radix,size));result=result.multiply(power).add(goog.math.Long.fromNumber(value))}else{result=result.multiply(radixToPower);result=result.add(goog.math.Long.fromNumber(value))}}return result});goog.math.Long.TWO_PWR_16_DBL_=1<<16;goog.math.Long.TWO_PWR_24_DBL_=1<<24;goog.math.Long.TWO_PWR_32_DBL_=goog.math.Long.TWO_PWR_16_DBL_*goog.math.Long.TWO_PWR_16_DBL_;goog.math.Long.TWO_PWR_31_DBL_=goog.math.Long.TWO_PWR_32_DBL_/2;goog.math.Long.TWO_PWR_48_DBL_=goog.math.Long.TWO_PWR_32_DBL_*goog.math.Long.TWO_PWR_16_DBL_;goog.math.Long.TWO_PWR_64_DBL_=goog.math.Long.TWO_PWR_32_DBL_*goog.math.Long.TWO_PWR_32_DBL_;goog.math.Long.TWO_PWR_63_DBL_=goog.math.Long.TWO_PWR_64_DBL_/2;goog.math.Long.ZERO=goog.math.Long.fromInt(0);goog.math.Long.ONE=goog.math.Long.fromInt(1);goog.math.Long.NEG_ONE=goog.math.Long.fromInt(-1);goog.math.Long.MAX_VALUE=goog.math.Long.fromBits(4294967295|0,2147483647|0);goog.math.Long.MIN_VALUE=goog.math.Long.fromBits(0,2147483648|0);goog.math.Long.TWO_PWR_24_=goog.math.Long.fromInt(1<<24);goog.math.Long.prototype.toInt=(function(){return this.low_});goog.math.Long.prototype.toNumber=(function(){return this.high_*goog.math.Long.TWO_PWR_32_DBL_+this.getLowBitsUnsigned()});goog.math.Long.prototype.toString=(function(opt_radix){var radix=opt_radix||10;if(radix<2||36<radix){throw Error(\"radix out of range: \"+radix)}if(this.isZero()){return\"0\"}if(this.isNegative()){if(this.equals(goog.math.Long.MIN_VALUE)){var radixLong=goog.math.Long.fromNumber(radix);var div=this.div(radixLong);var rem=div.multiply(radixLong).subtract(this);return div.toString(radix)+rem.toInt().toString(radix)}else{return\"-\"+this.negate().toString(radix)}}var radixToPower=goog.math.Long.fromNumber(Math.pow(radix,6));var rem=this;var result=\"\";while(true){var remDiv=rem.div(radixToPower);var intval=rem.subtract(remDiv.multiply(radixToPower)).toInt();var digits=intval.toString(radix);rem=remDiv;if(rem.isZero()){return digits+result}else{while(digits.length<6){digits=\"0\"+digits}result=\"\"+digits+result}}});goog.math.Long.prototype.getHighBits=(function(){return this.high_});goog.math.Long.prototype.getLowBits=(function(){return this.low_});goog.math.Long.prototype.getLowBitsUnsigned=(function(){return this.low_>=0?this.low_:goog.math.Long.TWO_PWR_32_DBL_+this.low_});goog.math.Long.prototype.getNumBitsAbs=(function(){if(this.isNegative()){if(this.equals(goog.math.Long.MIN_VALUE)){return 64}else{return this.negate().getNumBitsAbs()}}else{var val=this.high_!=0?this.high_:this.low_;for(var bit=31;bit>0;bit--){if((val&1<<bit)!=0){break}}return this.high_!=0?bit+33:bit+1}});goog.math.Long.prototype.isZero=(function(){return this.high_==0&&this.low_==0});goog.math.Long.prototype.isNegative=(function(){return this.high_<0});goog.math.Long.prototype.isOdd=(function(){return(this.low_&1)==1});goog.math.Long.prototype.equals=(function(other){return this.high_==other.high_&&this.low_==other.low_});goog.math.Long.prototype.notEquals=(function(other){return this.high_!=other.high_||this.low_!=other.low_});goog.math.Long.prototype.lessThan=(function(other){return this.compare(other)<0});goog.math.Long.prototype.lessThanOrEqual=(function(other){return this.compare(other)<=0});goog.math.Long.prototype.greaterThan=(function(other){return this.compare(other)>0});goog.math.Long.prototype.greaterThanOrEqual=(function(other){return this.compare(other)>=0});goog.math.Long.prototype.compare=(function(other){if(this.equals(other)){return 0}var thisNeg=this.isNegative();var otherNeg=other.isNegative();if(thisNeg&&!otherNeg){return-1}if(!thisNeg&&otherNeg){return 1}if(this.subtract(other).isNegative()){return-1}else{return 1}});goog.math.Long.prototype.negate=(function(){if(this.equals(goog.math.Long.MIN_VALUE)){return goog.math.Long.MIN_VALUE}else{return this.not().add(goog.math.Long.ONE)}});goog.math.Long.prototype.add=(function(other){var a48=this.high_>>>16;var a32=this.high_&65535;var a16=this.low_>>>16;var a00=this.low_&65535;var b48=other.high_>>>16;var b32=other.high_&65535;var b16=other.low_>>>16;var b00=other.low_&65535;var c48=0,c32=0,c16=0,c00=0;c00+=a00+b00;c16+=c00>>>16;c00&=65535;c16+=a16+b16;c32+=c16>>>16;c16&=65535;c32+=a32+b32;c48+=c32>>>16;c32&=65535;c48+=a48+b48;c48&=65535;return goog.math.Long.fromBits(c16<<16|c00,c48<<16|c32)});goog.math.Long.prototype.subtract=(function(other){return this.add(other.negate())});goog.math.Long.prototype.multiply=(function(other){if(this.isZero()){return goog.math.Long.ZERO}else if(other.isZero()){return goog.math.Long.ZERO}if(this.equals(goog.math.Long.MIN_VALUE)){return other.isOdd()?goog.math.Long.MIN_VALUE:goog.math.Long.ZERO}else if(other.equals(goog.math.Long.MIN_VALUE)){return this.isOdd()?goog.math.Long.MIN_VALUE:goog.math.Long.ZERO}if(this.isNegative()){if(other.isNegative()){return this.negate().multiply(other.negate())}else{return this.negate().multiply(other).negate()}}else if(other.isNegative()){return this.multiply(other.negate()).negate()}if(this.lessThan(goog.math.Long.TWO_PWR_24_)&&other.lessThan(goog.math.Long.TWO_PWR_24_)){return goog.math.Long.fromNumber(this.toNumber()*other.toNumber())}var a48=this.high_>>>16;var a32=this.high_&65535;var a16=this.low_>>>16;var a00=this.low_&65535;var b48=other.high_>>>16;var b32=other.high_&65535;var b16=other.low_>>>16;var b00=other.low_&65535;var c48=0,c32=0,c16=0,c00=0;c00+=a00*b00;c16+=c00>>>16;c00&=65535;c16+=a16*b00;c32+=c16>>>16;c16&=65535;c16+=a00*b16;c32+=c16>>>16;c16&=65535;c32+=a32*b00;c48+=c32>>>16;c32&=65535;c32+=a16*b16;c48+=c32>>>16;c32&=65535;c32+=a00*b32;c48+=c32>>>16;c32&=65535;c48+=a48*b00+a32*b16+a16*b32+a00*b48;c48&=65535;return goog.math.Long.fromBits(c16<<16|c00,c48<<16|c32)});goog.math.Long.prototype.div=(function(other){if(other.isZero()){throw Error(\"division by zero\")}else if(this.isZero()){return goog.math.Long.ZERO}if(this.equals(goog.math.Long.MIN_VALUE)){if(other.equals(goog.math.Long.ONE)||other.equals(goog.math.Long.NEG_ONE)){return goog.math.Long.MIN_VALUE}else if(other.equals(goog.math.Long.MIN_VALUE)){return goog.math.Long.ONE}else{var halfThis=this.shiftRight(1);var approx=halfThis.div(other).shiftLeft(1);if(approx.equals(goog.math.Long.ZERO)){return other.isNegative()?goog.math.Long.ONE:goog.math.Long.NEG_ONE}else{var rem=this.subtract(other.multiply(approx));var result=approx.add(rem.div(other));return result}}}else if(other.equals(goog.math.Long.MIN_VALUE)){return goog.math.Long.ZERO}if(this.isNegative()){if(other.isNegative()){return this.negate().div(other.negate())}else{return this.negate().div(other).negate()}}else if(other.isNegative()){return this.div(other.negate()).negate()}var res=goog.math.Long.ZERO;var rem=this;while(rem.greaterThanOrEqual(other)){var approx=Math.max(1,Math.floor(rem.toNumber()/other.toNumber()));var log2=Math.ceil(Math.log(approx)/Math.LN2);var delta=log2<=48?1:Math.pow(2,log2-48);var approxRes=goog.math.Long.fromNumber(approx);var approxRem=approxRes.multiply(other);while(approxRem.isNegative()||approxRem.greaterThan(rem)){approx-=delta;approxRes=goog.math.Long.fromNumber(approx);approxRem=approxRes.multiply(other)}if(approxRes.isZero()){approxRes=goog.math.Long.ONE}res=res.add(approxRes);rem=rem.subtract(approxRem)}return res});goog.math.Long.prototype.modulo=(function(other){return this.subtract(this.div(other).multiply(other))});goog.math.Long.prototype.not=(function(){return goog.math.Long.fromBits(~this.low_,~this.high_)});goog.math.Long.prototype.and=(function(other){return goog.math.Long.fromBits(this.low_&other.low_,this.high_&other.high_)});goog.math.Long.prototype.or=(function(other){return goog.math.Long.fromBits(this.low_|other.low_,this.high_|other.high_)});goog.math.Long.prototype.xor=(function(other){return goog.math.Long.fromBits(this.low_^other.low_,this.high_^other.high_)});goog.math.Long.prototype.shiftLeft=(function(numBits){numBits&=63;if(numBits==0){return this}else{var low=this.low_;if(numBits<32){var high=this.high_;return goog.math.Long.fromBits(low<<numBits,high<<numBits|low>>>32-numBits)}else{return goog.math.Long.fromBits(0,low<<numBits-32)}}});goog.math.Long.prototype.shiftRight=(function(numBits){numBits&=63;if(numBits==0){return this}else{var high=this.high_;if(numBits<32){var low=this.low_;return goog.math.Long.fromBits(low>>>numBits|high<<32-numBits,high>>numBits)}else{return goog.math.Long.fromBits(high>>numBits-32,high>=0?0:-1)}}});goog.math.Long.prototype.shiftRightUnsigned=(function(numBits){numBits&=63;if(numBits==0){return this}else{var high=this.high_;if(numBits<32){var low=this.low_;return goog.math.Long.fromBits(low>>>numBits|high<<32-numBits,high>>>numBits)}else if(numBits==32){return goog.math.Long.fromBits(high,0)}else{return goog.math.Long.fromBits(high>>>numBits-32,0)}}});var navigator={appName:\"Modern Browser\"};var dbits;var canary=0xdeadbeefcafe;var j_lm=(canary&16777215)==15715070;function BigInteger(a,b,c){if(a!=null)if(\"number\"==typeof a)this.fromNumber(a,b,c);else if(b==null&&\"string\"!=typeof a)this.fromString(a,256);else this.fromString(a,b)}function nbi(){return new BigInteger(null)}function am1(i,x,w,j,c,n){while(--n>=0){var v=x*this[i++]+w[j]+c;c=Math.floor(v/67108864);w[j++]=v&67108863}return c}function am2(i,x,w,j,c,n){var xl=x&32767,xh=x>>15;while(--n>=0){var l=this[i]&32767;var h=this[i++]>>15;var m=xh*l+h*xl;l=xl*l+((m&32767)<<15)+w[j]+(c&1073741823);c=(l>>>30)+(m>>>15)+xh*h+(c>>>30);w[j++]=l&1073741823}return c}function am3(i,x,w,j,c,n){var xl=x&16383,xh=x>>14;while(--n>=0){var l=this[i]&16383;var h=this[i++]>>14;var m=xh*l+h*xl;l=xl*l+((m&16383)<<14)+w[j]+c;c=(l>>28)+(m>>14)+xh*h;w[j++]=l&268435455}return c}if(j_lm&&navigator.appName==\"Microsoft Internet Explorer\"){BigInteger.prototype.am=am2;dbits=30}else if(j_lm&&navigator.appName!=\"Netscape\"){BigInteger.prototype.am=am1;dbits=26}else{BigInteger.prototype.am=am3;dbits=28}BigInteger.prototype.DB=dbits;BigInteger.prototype.DM=(1<<dbits)-1;BigInteger.prototype.DV=1<<dbits;var BI_FP=52;BigInteger.prototype.FV=Math.pow(2,BI_FP);BigInteger.prototype.F1=BI_FP-dbits;BigInteger.prototype.F2=2*dbits-BI_FP;var BI_RM=\"0123456789abcdefghijklmnopqrstuvwxyz\";var BI_RC=new Array;var rr,vv;rr=\"0\".charCodeAt(0);for(vv=0;vv<=9;++vv)BI_RC[rr++]=vv;rr=\"a\".charCodeAt(0);for(vv=10;vv<36;++vv)BI_RC[rr++]=vv;rr=\"A\".charCodeAt(0);for(vv=10;vv<36;++vv)BI_RC[rr++]=vv;function int2char(n){return BI_RM.charAt(n)}function intAt(s,i){var c=BI_RC[s.charCodeAt(i)];return c==null?-1:c}function bnpCopyTo(r){for(var i=this.t-1;i>=0;--i)r[i]=this[i];r.t=this.t;r.s=this.s}function bnpFromInt(x){this.t=1;this.s=x<0?-1:0;if(x>0)this[0]=x;else if(x<-1)this[0]=x+DV;else this.t=0}function nbv(i){var r=nbi();r.fromInt(i);return r}function bnpFromString(s,b){var k;if(b==16)k=4;else if(b==8)k=3;else if(b==256)k=8;else if(b==2)k=1;else if(b==32)k=5;else if(b==4)k=2;else{this.fromRadix(s,b);return}this.t=0;this.s=0;var i=s.length,mi=false,sh=0;while(--i>=0){var x=k==8?s[i]&255:intAt(s,i);if(x<0){if(s.charAt(i)==\"-\")mi=true;continue}mi=false;if(sh==0)this[this.t++]=x;else if(sh+k>this.DB){this[this.t-1]|=(x&(1<<this.DB-sh)-1)<<sh;this[this.t++]=x>>this.DB-sh}else this[this.t-1]|=x<<sh;sh+=k;if(sh>=this.DB)sh-=this.DB}if(k==8&&(s[0]&128)!=0){this.s=-1;if(sh>0)this[this.t-1]|=(1<<this.DB-sh)-1<<sh}this.clamp();if(mi)BigInteger.ZERO.subTo(this,this)}function bnpClamp(){var c=this.s&this.DM;while(this.t>0&&this[this.t-1]==c)--this.t}function bnToString(b){if(this.s<0)return\"-\"+this.negate().toString(b);var k;if(b==16)k=4;else if(b==8)k=3;else if(b==2)k=1;else if(b==32)k=5;else if(b==4)k=2;else return this.toRadix(b);var km=(1<<k)-1,d,m=false,r=\"\",i=this.t;var p=this.DB-i*this.DB%k;if(i-->0){if(p<this.DB&&(d=this[i]>>p)>0){m=true;r=int2char(d)}while(i>=0){if(p<k){d=(this[i]&(1<<p)-1)<<k-p;d|=this[--i]>>(p+=this.DB-k)}else{d=this[i]>>(p-=k)&km;if(p<=0){p+=this.DB;--i}}if(d>0)m=true;if(m)r+=int2char(d)}}return m?r:\"0\"}function bnNegate(){var r=nbi();BigInteger.ZERO.subTo(this,r);return r}function bnAbs(){return this.s<0?this.negate():this}function bnCompareTo(a){var r=this.s-a.s;if(r!=0)return r;var i=this.t;r=i-a.t;if(r!=0)return this.s<0?-r:r;while(--i>=0)if((r=this[i]-a[i])!=0)return r;return 0}function nbits(x){var r=1,t;if((t=x>>>16)!=0){x=t;r+=16}if((t=x>>8)!=0){x=t;r+=8}if((t=x>>4)!=0){x=t;r+=4}if((t=x>>2)!=0){x=t;r+=2}if((t=x>>1)!=0){x=t;r+=1}return r}function bnBitLength(){if(this.t<=0)return 0;return this.DB*(this.t-1)+nbits(this[this.t-1]^this.s&this.DM)}function bnpDLShiftTo(n,r){var i;for(i=this.t-1;i>=0;--i)r[i+n]=this[i];for(i=n-1;i>=0;--i)r[i]=0;r.t=this.t+n;r.s=this.s}function bnpDRShiftTo(n,r){for(var i=n;i<this.t;++i)r[i-n]=this[i];r.t=Math.max(this.t-n,0);r.s=this.s}function bnpLShiftTo(n,r){var bs=n%this.DB;var cbs=this.DB-bs;var bm=(1<<cbs)-1;var ds=Math.floor(n/this.DB),c=this.s<<bs&this.DM,i;for(i=this.t-1;i>=0;--i){r[i+ds+1]=this[i]>>cbs|c;c=(this[i]&bm)<<bs}for(i=ds-1;i>=0;--i)r[i]=0;r[ds]=c;r.t=this.t+ds+1;r.s=this.s;r.clamp()}function bnpRShiftTo(n,r){r.s=this.s;var ds=Math.floor(n/this.DB);if(ds>=this.t){r.t=0;return}var bs=n%this.DB;var cbs=this.DB-bs;var bm=(1<<bs)-1;r[0]=this[ds]>>bs;for(var i=ds+1;i<this.t;++i){r[i-ds-1]|=(this[i]&bm)<<cbs;r[i-ds]=this[i]>>bs}if(bs>0)r[this.t-ds-1]|=(this.s&bm)<<cbs;r.t=this.t-ds;r.clamp()}function bnpSubTo(a,r){var i=0,c=0,m=Math.min(a.t,this.t);while(i<m){c+=this[i]-a[i];r[i++]=c&this.DM;c>>=this.DB}if(a.t<this.t){c-=a.s;while(i<this.t){c+=this[i];r[i++]=c&this.DM;c>>=this.DB}c+=this.s}else{c+=this.s;while(i<a.t){c-=a[i];r[i++]=c&this.DM;c>>=this.DB}c-=a.s}r.s=c<0?-1:0;if(c<-1)r[i++]=this.DV+c;else if(c>0)r[i++]=c;r.t=i;r.clamp()}function bnpMultiplyTo(a,r){var x=this.abs(),y=a.abs();var i=x.t;r.t=i+y.t;while(--i>=0)r[i]=0;for(i=0;i<y.t;++i)r[i+x.t]=x.am(0,y[i],r,i,0,x.t);r.s=0;r.clamp();if(this.s!=a.s)BigInteger.ZERO.subTo(r,r)}function bnpSquareTo(r){var x=this.abs();var i=r.t=2*x.t;while(--i>=0)r[i]=0;for(i=0;i<x.t-1;++i){var c=x.am(i,x[i],r,2*i,0,1);if((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1))>=x.DV){r[i+x.t]-=x.DV;r[i+x.t+1]=1}}if(r.t>0)r[r.t-1]+=x.am(i,x[i],r,2*i,0,1);r.s=0;r.clamp()}function bnpDivRemTo(m,q,r){var pm=m.abs();if(pm.t<=0)return;var pt=this.abs();if(pt.t<pm.t){if(q!=null)q.fromInt(0);if(r!=null)this.copyTo(r);return}if(r==null)r=nbi();var y=nbi(),ts=this.s,ms=m.s;var nsh=this.DB-nbits(pm[pm.t-1]);if(nsh>0){pm.lShiftTo(nsh,y);pt.lShiftTo(nsh,r)}else{pm.copyTo(y);pt.copyTo(r)}var ys=y.t;var y0=y[ys-1];if(y0==0)return;var yt=y0*(1<<this.F1)+(ys>1?y[ys-2]>>this.F2:0);var d1=this.FV/yt,d2=(1<<this.F1)/yt,e=1<<this.F2;var i=r.t,j=i-ys,t=q==null?nbi():q;y.dlShiftTo(j,t);if(r.compareTo(t)>=0){r[r.t++]=1;r.subTo(t,r)}BigInteger.ONE.dlShiftTo(ys,t);t.subTo(y,y);while(y.t<ys)y[y.t++]=0;while(--j>=0){var qd=r[--i]==y0?this.DM:Math.floor(r[i]*d1+(r[i-1]+e)*d2);if((r[i]+=y.am(0,qd,r,j,0,ys))<qd){y.dlShiftTo(j,t);r.subTo(t,r);while(r[i]<--qd)r.subTo(t,r)}}if(q!=null){r.drShiftTo(ys,q);if(ts!=ms)BigInteger.ZERO.subTo(q,q)}r.t=ys;r.clamp();if(nsh>0)r.rShiftTo(nsh,r);if(ts<0)BigInteger.ZERO.subTo(r,r)}function bnMod(a){var r=nbi();this.abs().divRemTo(a,null,r);if(this.s<0&&r.compareTo(BigInteger.ZERO)>0)a.subTo(r,r);return r}function Classic(m){this.m=m}function cConvert(x){if(x.s<0||x.compareTo(this.m)>=0)return x.mod(this.m);else return x}function cRevert(x){return x}function cReduce(x){x.divRemTo(this.m,null,x)}function cMulTo(x,y,r){x.multiplyTo(y,r);this.reduce(r)}function cSqrTo(x,r){x.squareTo(r);this.reduce(r)}Classic.prototype.convert=cConvert;Classic.prototype.revert=cRevert;Classic.prototype.reduce=cReduce;Classic.prototype.mulTo=cMulTo;Classic.prototype.sqrTo=cSqrTo;function bnpInvDigit(){if(this.t<1)return 0;var x=this[0];if((x&1)==0)return 0;var y=x&3;y=y*(2-(x&15)*y)&15;y=y*(2-(x&255)*y)&255;y=y*(2-((x&65535)*y&65535))&65535;y=y*(2-x*y%this.DV)%this.DV;return y>0?this.DV-y:-y}function Montgomery(m){this.m=m;this.mp=m.invDigit();this.mpl=this.mp&32767;this.mph=this.mp>>15;this.um=(1<<m.DB-15)-1;this.mt2=2*m.t}function montConvert(x){var r=nbi();x.abs().dlShiftTo(this.m.t,r);r.divRemTo(this.m,null,r);if(x.s<0&&r.compareTo(BigInteger.ZERO)>0)this.m.subTo(r,r);return r}function montRevert(x){var r=nbi();x.copyTo(r);this.reduce(r);return r}function montReduce(x){while(x.t<=this.mt2)x[x.t++]=0;for(var i=0;i<this.m.t;++i){var j=x[i]&32767;var u0=j*this.mpl+((j*this.mph+(x[i]>>15)*this.mpl&this.um)<<15)&x.DM;j=i+this.m.t;x[j]+=this.m.am(0,u0,x,i,0,this.m.t);while(x[j]>=x.DV){x[j]-=x.DV;x[++j]++}}x.clamp();x.drShiftTo(this.m.t,x);if(x.compareTo(this.m)>=0)x.subTo(this.m,x)}function montSqrTo(x,r){x.squareTo(r);this.reduce(r)}function montMulTo(x,y,r){x.multiplyTo(y,r);this.reduce(r)}Montgomery.prototype.convert=montConvert;Montgomery.prototype.revert=montRevert;Montgomery.prototype.reduce=montReduce;Montgomery.prototype.mulTo=montMulTo;Montgomery.prototype.sqrTo=montSqrTo;function bnpIsEven(){return(this.t>0?this[0]&1:this.s)==0}function bnpExp(e,z){if(e>4294967295||e<1)return BigInteger.ONE;var r=nbi(),r2=nbi(),g=z.convert(this),i=nbits(e)-1;g.copyTo(r);while(--i>=0){z.sqrTo(r,r2);if((e&1<<i)>0)z.mulTo(r2,g,r);else{var t=r;r=r2;r2=t}}return z.revert(r)}function bnModPowInt(e,m){var z;if(e<256||m.isEven())z=new Classic(m);else z=new Montgomery(m);return this.exp(e,z)}BigInteger.prototype.copyTo=bnpCopyTo;BigInteger.prototype.fromInt=bnpFromInt;BigInteger.prototype.fromString=bnpFromString;BigInteger.prototype.clamp=bnpClamp;BigInteger.prototype.dlShiftTo=bnpDLShiftTo;BigInteger.prototype.drShiftTo=bnpDRShiftTo;BigInteger.prototype.lShiftTo=bnpLShiftTo;BigInteger.prototype.rShiftTo=bnpRShiftTo;BigInteger.prototype.subTo=bnpSubTo;BigInteger.prototype.multiplyTo=bnpMultiplyTo;BigInteger.prototype.squareTo=bnpSquareTo;BigInteger.prototype.divRemTo=bnpDivRemTo;BigInteger.prototype.invDigit=bnpInvDigit;BigInteger.prototype.isEven=bnpIsEven;BigInteger.prototype.exp=bnpExp;BigInteger.prototype.toString=bnToString;BigInteger.prototype.negate=bnNegate;BigInteger.prototype.abs=bnAbs;BigInteger.prototype.compareTo=bnCompareTo;BigInteger.prototype.bitLength=bnBitLength;BigInteger.prototype.mod=bnMod;BigInteger.prototype.modPowInt=bnModPowInt;BigInteger.ZERO=nbv(0);BigInteger.ONE=nbv(1);function bnpFromRadix(s,b){this.fromInt(0);if(b==null)b=10;var cs=this.chunkSize(b);var d=Math.pow(b,cs),mi=false,j=0,w=0;for(var i=0;i<s.length;++i){var x=intAt(s,i);if(x<0){if(s.charAt(i)==\"-\"&&this.signum()==0)mi=true;continue}w=b*w+x;if(++j>=cs){this.dMultiply(d);this.dAddOffset(w,0);j=0;w=0}}if(j>0){this.dMultiply(Math.pow(b,j));this.dAddOffset(w,0)}if(mi)BigInteger.ZERO.subTo(this,this)}function bnpChunkSize(r){return Math.floor(Math.LN2*this.DB/Math.log(r))}function bnSigNum(){if(this.s<0)return-1;else if(this.t<=0||this.t==1&&this[0]<=0)return 0;else return 1}function bnpDMultiply(n){this[this.t]=this.am(0,n-1,this,0,0,this.t);++this.t;this.clamp()}function bnpDAddOffset(n,w){if(n==0)return;while(this.t<=w)this[this.t++]=0;this[w]+=n;while(this[w]>=this.DV){this[w]-=this.DV;if(++w>=this.t)this[this.t++]=0;++this[w]}}function bnpToRadix(b){if(b==null)b=10;if(this.signum()==0||b<2||b>36)return\"0\";var cs=this.chunkSize(b);var a=Math.pow(b,cs);var d=nbv(a),y=nbi(),z=nbi(),r=\"\";this.divRemTo(d,y,z);while(y.signum()>0){r=(a+z.intValue()).toString(b).substr(1)+r;y.divRemTo(d,y,z)}return z.intValue().toString(b)+r}function bnIntValue(){if(this.s<0){if(this.t==1)return this[0]-this.DV;else if(this.t==0)return-1}else if(this.t==1)return this[0];else if(this.t==0)return 0;return(this[1]&(1<<32-this.DB)-1)<<this.DB|this[0]}function bnpAddTo(a,r){var i=0,c=0,m=Math.min(a.t,this.t);while(i<m){c+=this[i]+a[i];r[i++]=c&this.DM;c>>=this.DB}if(a.t<this.t){c+=a.s;while(i<this.t){c+=this[i];r[i++]=c&this.DM;c>>=this.DB}c+=this.s}else{c+=this.s;while(i<a.t){c+=a[i];r[i++]=c&this.DM;c>>=this.DB}c+=a.s}r.s=c<0?-1:0;if(c>0)r[i++]=c;else if(c<-1)r[i++]=this.DV+c;r.t=i;r.clamp()}BigInteger.prototype.fromRadix=bnpFromRadix;BigInteger.prototype.chunkSize=bnpChunkSize;BigInteger.prototype.signum=bnSigNum;BigInteger.prototype.dMultiply=bnpDMultiply;BigInteger.prototype.dAddOffset=bnpDAddOffset;BigInteger.prototype.toRadix=bnpToRadix;BigInteger.prototype.intValue=bnIntValue;BigInteger.prototype.addTo=bnpAddTo;var Wrapper={abs:(function(l,h){var x=new goog.math.Long(l,h);var ret;if(x.isNegative()){ret=x.negate()}else{ret=x}HEAP32[tempDoublePtr>>2]=ret.low_;HEAP32[tempDoublePtr+4>>2]=ret.high_}),ensureTemps:(function(){if(Wrapper.ensuredTemps)return;Wrapper.ensuredTemps=true;Wrapper.two32=new BigInteger;Wrapper.two32.fromString(\"4294967296\",10);Wrapper.two64=new BigInteger;Wrapper.two64.fromString(\"18446744073709551616\",10);Wrapper.temp1=new BigInteger;Wrapper.temp2=new BigInteger}),lh2bignum:(function(l,h){var a=new BigInteger;a.fromString(h.toString(),10);var b=new BigInteger;a.multiplyTo(Wrapper.two32,b);var c=new BigInteger;c.fromString(l.toString(),10);var d=new BigInteger;c.addTo(b,d);return d}),stringify:(function(l,h,unsigned){var ret=(new goog.math.Long(l,h)).toString();if(unsigned&&ret[0]==\"-\"){Wrapper.ensureTemps();var bignum=new BigInteger;bignum.fromString(ret,10);ret=new BigInteger;Wrapper.two64.addTo(bignum,ret);ret=ret.toString(10)}return ret}),fromString:(function(str,base,min,max,unsigned){Wrapper.ensureTemps();var bignum=new BigInteger;bignum.fromString(str,base);var bigmin=new BigInteger;bigmin.fromString(min,10);var bigmax=new BigInteger;bigmax.fromString(max,10);if(unsigned&&bignum.compareTo(BigInteger.ZERO)<0){var temp=new BigInteger;bignum.addTo(Wrapper.two64,temp);bignum=temp}var error=false;if(bignum.compareTo(bigmin)<0){bignum=bigmin;error=true}else if(bignum.compareTo(bigmax)>0){bignum=bigmax;error=true}var ret=goog.math.Long.fromString(bignum.toString());HEAP32[tempDoublePtr>>2]=ret.low_;HEAP32[tempDoublePtr+4>>2]=ret.high_;if(error)throw\"range error\"})};return Wrapper})();if(memoryInitializer){if(Module[\"memoryInitializerPrefixURL\"]){memoryInitializer=Module[\"memoryInitializerPrefixURL\"]+memoryInitializer}if(ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=Module[\"readBinary\"](memoryInitializer);HEAPU8.set(data,STATIC_BASE)}else{addRunDependency(\"memory initializer\");Browser.asyncLoad(memoryInitializer,(function(data){HEAPU8.set(data,STATIC_BASE);removeRunDependency(\"memory initializer\")}),(function(data){throw\"could not load memory initializer \"+memoryInitializer}))}}function ExitStatus(status){this.name=\"ExitStatus\";this.message=\"Program terminated with exit(\"+status+\")\";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module[\"calledRun\"]&&shouldRunNow)run();if(!Module[\"calledRun\"])dependenciesFulfilled=runCaller};Module[\"callMain\"]=Module.callMain=function callMain(args){assert(runDependencies==0,\"cannot call main when async dependencies remain! (listen on __ATMAIN__)\");assert(__ATPRERUN__.length==0,\"cannot call main when preRun functions remain to be called\");args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module[\"thisProgram\"]),\"i8\",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),\"i8\",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,\"i32\",ALLOC_NORMAL);initialStackTop=STACKTOP;try{var ret=Module[\"_main\"](argc,argv,0);exit(ret)}catch(e){if(e instanceof ExitStatus){return}else if(e==\"SimulateInfiniteLoop\"){Module[\"noExitRuntime\"]=true;return}else{if(e&&typeof e===\"object\"&&e.stack)Module.printErr(\"exception thrown: \"+[e,e.stack]);throw e}}finally{calledMain=true}};function run(args){args=args||Module[\"arguments\"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){Module.printErr(\"run() called, but dependencies remain, so not running\");return}preRun();if(runDependencies>0)return;if(Module[\"calledRun\"])return;function doRun(){if(Module[\"calledRun\"])return;Module[\"calledRun\"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(ENVIRONMENT_IS_WEB&&preloadStartTime!==null){Module.printErr(\"pre-main prep time: \"+(Date.now()-preloadStartTime)+\" ms\")}if(Module[\"_main\"]&&shouldRunNow){Module[\"callMain\"](args)}postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout((function(){setTimeout((function(){Module[\"setStatus\"](\"\")}),1);doRun()}),1)}else{doRun()}}Module[\"run\"]=Module.run=run;function exit(status){if(Module[\"noExitRuntime\"]){return}ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(ENVIRONMENT_IS_NODE){process[\"exit\"](status)}else if(ENVIRONMENT_IS_SHELL&&typeof quit===\"function\"){quit(status)}else{throw new ExitStatus(status)}}Module[\"exit\"]=Module.exit=exit;function abort(text){if(text){Module.print(text);Module.printErr(text)}ABORT=true;EXITSTATUS=1;var extra=\"\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.\";throw\"abort() at \"+stackTrace()+extra}Module[\"abort\"]=Module.abort=abort;if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}var shouldRunNow=true;if(Module[\"noInitialRun\"]){shouldRunNow=false}run()\n\n\n\n\n"
  },
  {
    "path": "web/pdfjs.html",
    "content": "<!doctype html>\n<!--  vim: set sw=2 ts=2 et : --> \n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n    <title></title>\n    <link rel=\"stylesheet\" href=\"//netdna.bootstrapcdn.com/bootstrap/3.0.2/css/bootstrap.min.css\">\n    <link rel=\"stylesheet\" href=\"//netdna.bootstrapcdn.com/bootstrap/3.0.2/css/bootstrap-theme.min.css\">\n    <link rel=\"stylesheet\" href=\"pdfium.css\">\n    <script src=\"http://mozilla.github.io/pdf.js/build/pdf.js\"></script>\n  </head>\n  <body>\n    <div id=\"header\" class=\"container\">\n      <div class=\"jumbotron\">\n        <h3>PDF.js profiling</h3>\n        <h6>by <a target=\"_blank\" href=\"http://coolwanglu.github.io/\">Lu Wang</a> 2014</h6>\n      </div>\n      <input id=\"input-pdf\" type=\"file\" class=\"small\">\n    </div>\n    <div id=\"main\" class=\"container\">\n      <div id=\"render\" class=\"container\">\n      </div>\n    </div>\n    <script>\n      var canvas_list = [];\n      var scale = window.devicePixelRatio;\n      var timer = null;\n      PDFJS.disableWorker = true;\n      PDFJS.disableTextLayer = true;\n      var inputE = document.getElementById('input-pdf');\n      inputE.style.display = 'block';\n      inputE.addEventListener('change', function(e) {\n        var files = e.target.files;\n        if(files.length == 0)\n          return;\n        var reader = new FileReader();\n        reader.onload = function(e) {\n          PDFJS.getDocument({data: new Uint8Array(e.target.result)}, 0).then(function(doc) {\n            var page_count = doc.numPages;\n\n            canvas_list.length = 0;\n            var renderE = document.getElementById('render');\n            renderE.innerHTML='';\n            for(var i = 0; i < page_count; ++i) {\n              var e = document.createElement('canvas');\n              canvas_list.push(e);\n              renderE.appendChild(e);\n            }\n\n            var cur_page = 0;\n            function render_next_page() {\n              if(cur_page == page_count) return;\n\n              var start_time = Date.now();\n              doc.getPage(cur_page+1).then(function(page) {\n                var render_start_time = Date.now();\n\n                var canvas = canvas_list[cur_page];\n                if(!canvas)\n                  return;\n                var viewport = page.getViewport(2);\n\n                canvas.width = viewport.width;\n                canvas.height = viewport.height;\n                canvas.style.width = viewport.width / scale + 'px';\n                canvas.style.height = viewport.height / scale + 'px';\n\n                page.render({canvasContext: canvas.getContext('2d'), viewport: viewport}).promise.then(function() {\n                  var end_time = Date.now();\n                  console.log('Page', cur_page+1);\n                  console.log('Page Request', render_start_time - start_time, 'ms');\n                  console.log('Rendering', end_time - render_start_time, 'ms');\n                  console.log('Overall', end_time - start_time, 'ms');\n\n                  ++cur_page;\n                  timer = setTimeout(render_next_page, 1);\n                });\n              });\n            }\n            clearTimeout(timer);\n            timer = setTimeout(render_next_page, 1);\n          });\n        };\n        reader.readAsArrayBuffer(files[0]);\n      });\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "web/viewer/compatibility.js",
    "content": "/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */\n/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals VBArray, PDFJS */\n\n'use strict';\n\n// Initializing PDFJS global object here, it case if we need to change/disable\n// some PDF.js features, e.g. range requests\nif (typeof PDFJS === 'undefined') {\n  (typeof window !== 'undefined' ? window : this).PDFJS = {};\n}\n\n// Checking if the typed arrays are supported\n// Support: iOS<6.0 (subarray), IE<10, Android<4.0\n(function checkTypedArrayCompatibility() {\n  if (typeof Uint8Array !== 'undefined') {\n    // Support: iOS<6.0\n    if (typeof Uint8Array.prototype.subarray === 'undefined') {\n        Uint8Array.prototype.subarray = function subarray(start, end) {\n          return new Uint8Array(this.slice(start, end));\n        };\n        Float32Array.prototype.subarray = function subarray(start, end) {\n          return new Float32Array(this.slice(start, end));\n        };\n    }\n\n    // Support: Android<4.1\n    if (typeof Float64Array === 'undefined') {\n      window.Float64Array = Float32Array;\n    }\n    return;\n  }\n\n  function subarray(start, end) {\n    return new TypedArray(this.slice(start, end));\n  }\n\n  function setArrayOffset(array, offset) {\n    if (arguments.length < 2) {\n      offset = 0;\n    }\n    for (var i = 0, n = array.length; i < n; ++i, ++offset) {\n      this[offset] = array[i] & 0xFF;\n    }\n  }\n\n  function TypedArray(arg1) {\n    var result, i, n;\n    if (typeof arg1 === 'number') {\n      result = [];\n      for (i = 0; i < arg1; ++i) {\n        result[i] = 0;\n      }\n    } else if ('slice' in arg1) {\n      result = arg1.slice(0);\n    } else {\n      result = [];\n      for (i = 0, n = arg1.length; i < n; ++i) {\n        result[i] = arg1[i];\n      }\n    }\n\n    result.subarray = subarray;\n    result.buffer = result;\n    result.byteLength = result.length;\n    result.set = setArrayOffset;\n\n    if (typeof arg1 === 'object' && arg1.buffer) {\n      result.buffer = arg1.buffer;\n    }\n    return result;\n  }\n\n  window.Uint8Array = TypedArray;\n  window.Int8Array = TypedArray;\n\n  // we don't need support for set, byteLength for 32-bit array\n  // so we can use the TypedArray as well\n  window.Uint32Array = TypedArray;\n  window.Int32Array = TypedArray;\n  window.Uint16Array = TypedArray;\n  window.Float32Array = TypedArray;\n  window.Float64Array = TypedArray;\n})();\n\n// URL = URL || webkitURL\n// Support: Safari<7, Android 4.2+\n(function normalizeURLObject() {\n  if (!window.URL) {\n    window.URL = window.webkitURL;\n  }\n})();\n\n// Object.defineProperty()?\n// Support: Android<4.0, Safari<5.1\n(function checkObjectDefinePropertyCompatibility() {\n  if (typeof Object.defineProperty !== 'undefined') {\n    var definePropertyPossible = true;\n    try {\n      // some browsers (e.g. safari) cannot use defineProperty() on DOM objects\n      // and thus the native version is not sufficient\n      Object.defineProperty(new Image(), 'id', { value: 'test' });\n      // ... another test for android gb browser for non-DOM objects\n      var Test = function Test() {};\n      Test.prototype = { get id() { } };\n      Object.defineProperty(new Test(), 'id',\n        { value: '', configurable: true, enumerable: true, writable: false });\n    } catch (e) {\n      definePropertyPossible = false;\n    }\n    if (definePropertyPossible) {\n      return;\n    }\n  }\n\n  Object.defineProperty = function objectDefineProperty(obj, name, def) {\n    delete obj[name];\n    if ('get' in def) {\n      obj.__defineGetter__(name, def['get']);\n    }\n    if ('set' in def) {\n      obj.__defineSetter__(name, def['set']);\n    }\n    if ('value' in def) {\n      obj.__defineSetter__(name, function objectDefinePropertySetter(value) {\n        this.__defineGetter__(name, function objectDefinePropertyGetter() {\n          return value;\n        });\n        return value;\n      });\n      obj[name] = def.value;\n    }\n  };\n})();\n\n\n// No XMLHttpRequest#response?\n// Support: IE<11, Android <4.0\n(function checkXMLHttpRequestResponseCompatibility() {\n  var xhrPrototype = XMLHttpRequest.prototype;\n  var xhr = new XMLHttpRequest();\n  if (!('overrideMimeType' in xhr)) {\n    // IE10 might have response, but not overrideMimeType\n    // Support: IE10\n    Object.defineProperty(xhrPrototype, 'overrideMimeType', {\n      value: function xmlHttpRequestOverrideMimeType(mimeType) {}\n    });\n  }\n  if ('responseType' in xhr) {\n    return;\n  }\n\n  // The worker will be using XHR, so we can save time and disable worker.\n  PDFJS.disableWorker = true;\n\n  // Support: IE9\n  if (typeof VBArray !== 'undefined') {\n    Object.defineProperty(xhrPrototype, 'response', {\n      get: function xmlHttpRequestResponseGet() {\n        return new Uint8Array(new VBArray(this.responseBody).toArray());\n      }\n    });\n    return;\n  }\n\n  // other browsers\n  function responseTypeSetter() {\n    // will be only called to set \"arraybuffer\"\n    this.overrideMimeType('text/plain; charset=x-user-defined');\n  }\n  if (typeof xhr.overrideMimeType === 'function') {\n    Object.defineProperty(xhrPrototype, 'responseType',\n                          { set: responseTypeSetter });\n  }\n  function responseGetter() {\n    var text = this.responseText;\n    var i, n = text.length;\n    var result = new Uint8Array(n);\n    for (i = 0; i < n; ++i) {\n      result[i] = text.charCodeAt(i) & 0xFF;\n    }\n    return result.buffer;\n  }\n  Object.defineProperty(xhrPrototype, 'response', { get: responseGetter });\n})();\n\n// window.btoa (base64 encode function) ?\n// Support: IE<10\n(function checkWindowBtoaCompatibility() {\n  if ('btoa' in window) {\n    return;\n  }\n\n  var digits =\n    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n\n  window.btoa = function windowBtoa(chars) {\n    var buffer = '';\n    var i, n;\n    for (i = 0, n = chars.length; i < n; i += 3) {\n      var b1 = chars.charCodeAt(i) & 0xFF;\n      var b2 = chars.charCodeAt(i + 1) & 0xFF;\n      var b3 = chars.charCodeAt(i + 2) & 0xFF;\n      var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4);\n      var d3 = i + 1 < n ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64;\n      var d4 = i + 2 < n ? (b3 & 0x3F) : 64;\n      buffer += (digits.charAt(d1) + digits.charAt(d2) +\n                 digits.charAt(d3) + digits.charAt(d4));\n    }\n    return buffer;\n  };\n})();\n\n// window.atob (base64 encode function)?\n// Support: IE<10\n(function checkWindowAtobCompatibility() {\n  if ('atob' in window) {\n    return;\n  }\n\n  // https://github.com/davidchambers/Base64.js\n  var digits =\n    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n  window.atob = function (input) {\n    input = input.replace(/=+$/, '');\n    if (input.length % 4 == 1) {\n      throw new Error('bad atob input');\n    }\n    for (\n      // initialize result and counters\n      var bc = 0, bs, buffer, idx = 0, output = '';\n      // get next character\n      buffer = input.charAt(idx++);\n      // character found in table?\n      // initialize bit storage and add its ascii value\n      ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,\n        // and if not first of each 4 characters,\n        // convert the first 8 bits to one ascii character\n        bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0\n    ) {\n      // try to find character in table (0-63, not found => -1)\n      buffer = digits.indexOf(buffer);\n    }\n    return output;\n  };\n})();\n\n// Function.prototype.bind?\n// Support: Android<4.0, iOS<6.0\n(function checkFunctionPrototypeBindCompatibility() {\n  if (typeof Function.prototype.bind !== 'undefined') {\n    return;\n  }\n\n  Function.prototype.bind = function functionPrototypeBind(obj) {\n    var fn = this, headArgs = Array.prototype.slice.call(arguments, 1);\n    var bound = function functionPrototypeBindBound() {\n      var args = headArgs.concat(Array.prototype.slice.call(arguments));\n      return fn.apply(obj, args);\n    };\n    return bound;\n  };\n})();\n\n// HTMLElement dataset property\n// Support: IE<11, Safari<5.1, Android<4.0\n(function checkDatasetProperty() {\n  var div = document.createElement('div');\n  if ('dataset' in div) {\n    return; // dataset property exists\n  }\n\n  Object.defineProperty(HTMLElement.prototype, 'dataset', {\n    get: function() {\n      if (this._dataset) {\n        return this._dataset;\n      }\n\n      var dataset = {};\n      for (var j = 0, jj = this.attributes.length; j < jj; j++) {\n        var attribute = this.attributes[j];\n        if (attribute.name.substring(0, 5) != 'data-') {\n          continue;\n        }\n        var key = attribute.name.substring(5).replace(/\\-([a-z])/g,\n          function(all, ch) {\n            return ch.toUpperCase();\n          });\n        dataset[key] = attribute.value;\n      }\n\n      Object.defineProperty(this, '_dataset', {\n        value: dataset,\n        writable: false,\n        enumerable: false\n      });\n      return dataset;\n    },\n    enumerable: true\n  });\n})();\n\n// HTMLElement classList property\n// Support: IE<10, Android<4.0, iOS<5.0\n(function checkClassListProperty() {\n  var div = document.createElement('div');\n  if ('classList' in div) {\n    return; // classList property exists\n  }\n\n  function changeList(element, itemName, add, remove) {\n    var s = element.className || '';\n    var list = s.split(/\\s+/g);\n    if (list[0] === '') {\n      list.shift();\n    }\n    var index = list.indexOf(itemName);\n    if (index < 0 && add) {\n      list.push(itemName);\n    }\n    if (index >= 0 && remove) {\n      list.splice(index, 1);\n    }\n    element.className = list.join(' ');\n    return (index >= 0);\n  }\n\n  var classListPrototype = {\n    add: function(name) {\n      changeList(this.element, name, true, false);\n    },\n    contains: function(name) {\n      return changeList(this.element, name, false, false);\n    },\n    remove: function(name) {\n      changeList(this.element, name, false, true);\n    },\n    toggle: function(name) {\n      changeList(this.element, name, true, true);\n    }\n  };\n\n  Object.defineProperty(HTMLElement.prototype, 'classList', {\n    get: function() {\n      if (this._classList) {\n        return this._classList;\n      }\n\n      var classList = Object.create(classListPrototype, {\n        element: {\n          value: this,\n          writable: false,\n          enumerable: true\n        }\n      });\n      Object.defineProperty(this, '_classList', {\n        value: classList,\n        writable: false,\n        enumerable: false\n      });\n      return classList;\n    },\n    enumerable: true\n  });\n})();\n\n// Check console compatibility\n// In older IE versions the console object is not available\n// unless console is open.\n// Support: IE<10\n(function checkConsoleCompatibility() {\n  if (!('console' in window)) {\n    window.console = {\n      log: function() {},\n      error: function() {},\n      warn: function() {}\n    };\n  } else if (!('bind' in console.log)) {\n    // native functions in IE9 might not have bind\n    console.log = (function(fn) {\n      return function(msg) { return fn(msg); };\n    })(console.log);\n    console.error = (function(fn) {\n      return function(msg) { return fn(msg); };\n    })(console.error);\n    console.warn = (function(fn) {\n      return function(msg) { return fn(msg); };\n    })(console.warn);\n  }\n})();\n\n// Check onclick compatibility in Opera\n// Support: Opera<15\n(function checkOnClickCompatibility() {\n  // workaround for reported Opera bug DSK-354448:\n  // onclick fires on disabled buttons with opaque content\n  function ignoreIfTargetDisabled(event) {\n    if (isDisabled(event.target)) {\n      event.stopPropagation();\n    }\n  }\n  function isDisabled(node) {\n    return node.disabled || (node.parentNode && isDisabled(node.parentNode));\n  }\n  if (navigator.userAgent.indexOf('Opera') != -1) {\n    // use browser detection since we cannot feature-check this bug\n    document.addEventListener('click', ignoreIfTargetDisabled, true);\n  }\n})();\n\n// Checks if possible to use URL.createObjectURL()\n// Support: IE\n(function checkOnBlobSupport() {\n  // sometimes IE loosing the data created with createObjectURL(), see #3977\n  if (navigator.userAgent.indexOf('Trident') >= 0) {\n    PDFJS.disableCreateObjectURL = true;\n  }\n})();\n\n// Checks if navigator.language is supported\n(function checkNavigatorLanguage() {\n  if ('language' in navigator &&\n      /^[a-z]+(-[A-Z]+)?$/.test(navigator.language)) {\n    return;\n  }\n  function formatLocale(locale) {\n    var split = locale.split(/[-_]/);\n    split[0] = split[0].toLowerCase();\n    if (split.length > 1) {\n      split[1] = split[1].toUpperCase();\n    }\n    return split.join('-');\n  }\n  var language = navigator.language || navigator.userLanguage || 'en-US';\n  PDFJS.locale = formatLocale(language);\n})();\n\n(function checkRangeRequests() {\n  // Safari has issues with cached range requests see:\n  // https://github.com/mozilla/pdf.js/issues/3260\n  // Last tested with version 6.0.4.\n  // Support: Safari 6.0+\n  var isSafari = Object.prototype.toString.call(\n                  window.HTMLElement).indexOf('Constructor') > 0;\n\n  // Older versions of Android (pre 3.0) has issues with range requests, see:\n  // https://github.com/mozilla/pdf.js/issues/3381.\n  // Make sure that we only match webkit-based Android browsers,\n  // since Firefox/Fennec works as expected.\n  // Support: Android<3.0\n  var regex = /Android\\s[0-2][^\\d]/;\n  var isOldAndroid = regex.test(navigator.userAgent);\n\n  if (isSafari || isOldAndroid) {\n    PDFJS.disableRange = true;\n  }\n})();\n\n// Check if the browser supports manipulation of the history.\n// Support: IE<10, Android<4.2\n(function checkHistoryManipulation() {\n  // Android 2.x has so buggy pushState support that it was removed in\n  // Android 3.0 and restored as late as in Android 4.2.\n  // Support: Android 2.x\n  if (!history.pushState || navigator.userAgent.indexOf('Android 2.') >= 0) {\n    PDFJS.disableHistory = true;\n  }\n})();\n\n// Support: IE<11, Chrome<21, Android<4.4\n(function checkSetPresenceInImageData() {\n  // IE < 11 will use window.CanvasPixelArray which lacks set function.\n  if (window.CanvasPixelArray) {\n    if (typeof window.CanvasPixelArray.prototype.set !== 'function') {\n      window.CanvasPixelArray.prototype.set = function(arr) {\n        for (var i = 0, ii = this.length; i < ii; i++) {\n          this[i] = arr[i];\n        }\n      };\n    }\n  } else {\n    // Old Chrome and Android use an inaccessible CanvasPixelArray prototype.\n    // Because we cannot feature detect it, we rely on user agent parsing.\n    var polyfill = false;\n    if (navigator.userAgent.indexOf('Chrom') >= 0) {\n      var versionMatch = navigator.userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./);\n      if (versionMatch && parseInt(versionMatch[2]) < 21) {\n        // Chrome < 21 lacks the set function.\n        polyfill = true;\n      }\n    } else if (navigator.userAgent.indexOf('Android') >= 0) {\n      // Android < 4.4 lacks the set function.\n      // Android >= 4.4 will contain Chrome in the user agent,\n      // thus pass the Chrome check above and not reach this block.\n      var isOldAndroid = /Android\\s[0-4][^\\d]/g.test(navigator.userAgent);\n      if (isOldAndroid) {\n        polyfill = true;\n      }\n    }\n\n    if (polyfill) {\n      var contextPrototype = window.CanvasRenderingContext2D.prototype;\n      contextPrototype._createImageData = contextPrototype.createImageData;\n      contextPrototype.createImageData = function(w, h) {\n        var imageData = this._createImageData(w, h);\n        imageData.data.set = function(arr) {\n          for (var i = 0, ii = this.length; i < ii; i++) {\n            this[i] = arr[i];\n          }\n        };\n        return imageData;\n      };\n    }\n  }\n})();\n\n// Support: IE<10, Android<4.0, iOS\n(function checkRequestAnimationFrame() {\n  function fakeRequestAnimationFrame(callback) {\n    window.setTimeout(callback, 20);\n  }\n\n  var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent);\n  if (isIOS) {\n    // requestAnimationFrame on iOS is broken, replacing with fake one.\n    window.requestAnimationFrame = fakeRequestAnimationFrame;\n    return;\n  }\n  if ('requestAnimationFrame' in window) {\n    return;\n  }\n  window.requestAnimationFrame =\n    window.mozRequestAnimationFrame ||\n    window.webkitRequestAnimationFrame ||\n    fakeRequestAnimationFrame;\n})();\n\n(function checkCanvasSizeLimitation() {\n  var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent);\n  var isAndroid = /Android/g.test(navigator.userAgent);\n  if (isIOS || isAndroid) {\n    // 5MP\n    PDFJS.maxCanvasPixels = 5242880;\n  }\n})();\n"
  },
  {
    "path": "web/viewer/debugger.js",
    "content": "/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */\n/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals PDFJS */\n\n'use strict';\n\nvar FontInspector = (function FontInspectorClosure() {\n  var fonts;\n  var active = false;\n  var fontAttribute = 'data-font-name';\n  function removeSelection() {\n    var divs = document.querySelectorAll('div[' + fontAttribute + ']');\n    for (var i = 0, ii = divs.length; i < ii; ++i) {\n      var div = divs[i];\n      div.className = '';\n    }\n  }\n  function resetSelection() {\n    var divs = document.querySelectorAll('div[' + fontAttribute + ']');\n    for (var i = 0, ii = divs.length; i < ii; ++i) {\n      var div = divs[i];\n      div.className = 'debuggerHideText';\n    }\n  }\n  function selectFont(fontName, show) {\n    var divs = document.querySelectorAll('div[' + fontAttribute + '=' +\n                                         fontName + ']');\n    for (var i = 0, ii = divs.length; i < ii; ++i) {\n      var div = divs[i];\n      div.className = show ? 'debuggerShowText' : 'debuggerHideText';\n    }\n  }\n  function textLayerClick(e) {\n    if (!e.target.dataset.fontName ||\n        e.target.tagName.toUpperCase() !== 'DIV') {\n      return;\n    }\n    var fontName = e.target.dataset.fontName;\n    var selects = document.getElementsByTagName('input');\n    for (var i = 0; i < selects.length; ++i) {\n      var select = selects[i];\n      if (select.dataset.fontName != fontName) {\n        continue;\n      }\n      select.checked = !select.checked;\n      selectFont(fontName, select.checked);\n      select.scrollIntoView();\n    }\n  }\n  return {\n    // Properties/functions needed by PDFBug.\n    id: 'FontInspector',\n    name: 'Font Inspector',\n    panel: null,\n    manager: null,\n    init: function init() {\n      var panel = this.panel;\n      panel.setAttribute('style', 'padding: 5px;');\n      var tmp = document.createElement('button');\n      tmp.addEventListener('click', resetSelection);\n      tmp.textContent = 'Refresh';\n      panel.appendChild(tmp);\n\n      fonts = document.createElement('div');\n      panel.appendChild(fonts);\n    },\n    cleanup: function cleanup() {\n      fonts.textContent = '';\n    },\n    enabled: false,\n    get active() {\n      return active;\n    },\n    set active(value) {\n      active = value;\n      if (active) {\n        document.body.addEventListener('click', textLayerClick, true);\n        resetSelection();\n      } else {\n        document.body.removeEventListener('click', textLayerClick, true);\n        removeSelection();\n      }\n    },\n    // FontInspector specific functions.\n    fontAdded: function fontAdded(fontObj, url) {\n      function properties(obj, list) {\n        var moreInfo = document.createElement('table');\n        for (var i = 0; i < list.length; i++) {\n          var tr = document.createElement('tr');\n          var td1 = document.createElement('td');\n          td1.textContent = list[i];\n          tr.appendChild(td1);\n          var td2 = document.createElement('td');\n          td2.textContent = obj[list[i]].toString();\n          tr.appendChild(td2);\n          moreInfo.appendChild(tr);\n        }\n        return moreInfo;\n      }\n      var moreInfo = properties(fontObj, ['name', 'type']);\n      var m = /url\\(['\"]?([^\\)\"']+)/.exec(url);\n      var fontName = fontObj.loadedName;\n      var font = document.createElement('div');\n      var name = document.createElement('span');\n      name.textContent = fontName;\n      var download = document.createElement('a');\n      download.href = m[1];\n      download.textContent = 'Download';\n      var logIt = document.createElement('a');\n      logIt.href = '';\n      logIt.textContent = 'Log';\n      logIt.addEventListener('click', function(event) {\n        event.preventDefault();\n        console.log(fontObj);\n      });\n      var select = document.createElement('input');\n      select.setAttribute('type', 'checkbox');\n      select.dataset.fontName = fontName;\n      select.addEventListener('click', (function(select, fontName) {\n        return (function() {\n           selectFont(fontName, select.checked);\n        });\n      })(select, fontName));\n      font.appendChild(select);\n      font.appendChild(name);\n      font.appendChild(document.createTextNode(' '));\n      font.appendChild(download);\n      font.appendChild(document.createTextNode(' '));\n      font.appendChild(logIt);\n      font.appendChild(moreInfo);\n      fonts.appendChild(font);\n      // Somewhat of a hack, should probably add a hook for when the text layer\n      // is done rendering.\n      setTimeout(function() {\n        if (this.active) {\n          resetSelection();\n        }\n      }.bind(this), 2000);\n    }\n  };\n})();\n\n// Manages all the page steppers.\nvar StepperManager = (function StepperManagerClosure() {\n  var steppers = [];\n  var stepperDiv = null;\n  var stepperControls = null;\n  var stepperChooser = null;\n  var breakPoints = {};\n  return {\n    // Properties/functions needed by PDFBug.\n    id: 'Stepper',\n    name: 'Stepper',\n    panel: null,\n    manager: null,\n    init: function init() {\n      var self = this;\n      this.panel.setAttribute('style', 'padding: 5px;');\n      stepperControls = document.createElement('div');\n      stepperChooser = document.createElement('select');\n      stepperChooser.addEventListener('change', function(event) {\n        self.selectStepper(this.value);\n      });\n      stepperControls.appendChild(stepperChooser);\n      stepperDiv = document.createElement('div');\n      this.panel.appendChild(stepperControls);\n      this.panel.appendChild(stepperDiv);\n      if (sessionStorage.getItem('pdfjsBreakPoints')) {\n        breakPoints = JSON.parse(sessionStorage.getItem('pdfjsBreakPoints'));\n      }\n    },\n    cleanup: function cleanup() {\n      stepperChooser.textContent = '';\n      stepperDiv.textContent = '';\n      steppers = [];\n    },\n    enabled: false,\n    active: false,\n    // Stepper specific functions.\n    create: function create(pageIndex) {\n      var debug = document.createElement('div');\n      debug.id = 'stepper' + pageIndex;\n      debug.setAttribute('hidden', true);\n      debug.className = 'stepper';\n      stepperDiv.appendChild(debug);\n      var b = document.createElement('option');\n      b.textContent = 'Page ' + (pageIndex + 1);\n      b.value = pageIndex;\n      stepperChooser.appendChild(b);\n      var initBreakPoints = breakPoints[pageIndex] || [];\n      var stepper = new Stepper(debug, pageIndex, initBreakPoints);\n      steppers.push(stepper);\n      if (steppers.length === 1) {\n        this.selectStepper(pageIndex, false);\n      }\n      return stepper;\n    },\n    selectStepper: function selectStepper(pageIndex, selectPanel) {\n      var i;\n      if (selectPanel) {\n        this.manager.selectPanel(this);\n      }\n      for (i = 0; i < steppers.length; ++i) {\n        var stepper = steppers[i];\n        if (stepper.pageIndex == pageIndex) {\n          stepper.panel.removeAttribute('hidden');\n        } else {\n          stepper.panel.setAttribute('hidden', true);\n        }\n      }\n      var options = stepperChooser.options;\n      for (i = 0; i < options.length; ++i) {\n        var option = options[i];\n        option.selected = option.value == pageIndex;\n      }\n    },\n    saveBreakPoints: function saveBreakPoints(pageIndex, bps) {\n      breakPoints[pageIndex] = bps;\n      sessionStorage.setItem('pdfjsBreakPoints', JSON.stringify(breakPoints));\n    }\n  };\n})();\n\n// The stepper for each page's IRQueue.\nvar Stepper = (function StepperClosure() {\n  // Shorter way to create element and optionally set textContent.\n  function c(tag, textContent) {\n    var d = document.createElement(tag);\n    if (textContent) {\n      d.textContent = textContent;\n    }\n    return d;\n  }\n\n  var opMap = null;\n\n  function simplifyArgs(args) {\n    if (typeof args === 'string') {\n      var MAX_STRING_LENGTH = 75;\n      return args.length <= MAX_STRING_LENGTH ? args :\n        args.substr(0, MAX_STRING_LENGTH) + '...';\n    }\n    if (typeof args !== 'object' || args === null) {\n      return args;\n    }\n    if ('length' in args) { // array\n      var simpleArgs = [], i, ii;\n      var MAX_ITEMS = 10;\n      for (i = 0, ii = Math.min(MAX_ITEMS, args.length); i < ii; i++) {\n        simpleArgs.push(simplifyArgs(args[i]));\n      }\n      if (i < args.length) {\n        simpleArgs.push('...');\n      }\n      return simpleArgs;\n    }\n    var simpleObj = {};\n    for (var key in args) {\n      simpleObj[key] = simplifyArgs(args[key]);\n    }\n    return simpleObj;\n  }\n\n  function Stepper(panel, pageIndex, initialBreakPoints) {\n    this.panel = panel;\n    this.breakPoint = 0;\n    this.nextBreakPoint = null;\n    this.pageIndex = pageIndex;\n    this.breakPoints = initialBreakPoints;\n    this.currentIdx = -1;\n    this.operatorListIdx = 0;\n  }\n  Stepper.prototype = {\n    init: function init() {\n      var panel = this.panel;\n      var content = c('div', 'c=continue, s=step');\n      var table = c('table');\n      content.appendChild(table);\n      table.cellSpacing = 0;\n      var headerRow = c('tr');\n      table.appendChild(headerRow);\n      headerRow.appendChild(c('th', 'Break'));\n      headerRow.appendChild(c('th', 'Idx'));\n      headerRow.appendChild(c('th', 'fn'));\n      headerRow.appendChild(c('th', 'args'));\n      panel.appendChild(content);\n      this.table = table;\n      if (!opMap) {\n        opMap = Object.create(null);\n        for (var key in PDFJS.OPS) {\n          opMap[PDFJS.OPS[key]] = key;\n        }\n      }\n    },\n    updateOperatorList: function updateOperatorList(operatorList) {\n      var self = this;\n\n      function cboxOnClick() {\n        var x = +this.dataset.idx;\n        if (this.checked) {\n          self.breakPoints.push(x);\n        } else {\n          self.breakPoints.splice(self.breakPoints.indexOf(x), 1);\n        }\n        StepperManager.saveBreakPoints(self.pageIndex, self.breakPoints);\n      }\n\n      var MAX_OPERATORS_COUNT = 15000;\n      if (this.operatorListIdx > MAX_OPERATORS_COUNT) {\n        return;\n      }\n\n      var chunk = document.createDocumentFragment();\n      var operatorsToDisplay = Math.min(MAX_OPERATORS_COUNT,\n                                        operatorList.fnArray.length);\n      for (var i = this.operatorListIdx; i < operatorsToDisplay; i++) {\n        var line = c('tr');\n        line.className = 'line';\n        line.dataset.idx = i;\n        chunk.appendChild(line);\n        var checked = this.breakPoints.indexOf(i) != -1;\n        var args = operatorList.argsArray[i] || [];\n\n        var breakCell = c('td');\n        var cbox = c('input');\n        cbox.type = 'checkbox';\n        cbox.className = 'points';\n        cbox.checked = checked;\n        cbox.dataset.idx = i;\n        cbox.onclick = cboxOnClick;\n\n        breakCell.appendChild(cbox);\n        line.appendChild(breakCell);\n        line.appendChild(c('td', i.toString()));\n        var fn = opMap[operatorList.fnArray[i]];\n        var decArgs = args;\n        if (fn === 'showText') {\n          var glyphs = args[0];\n          var newArgs = [];\n          var str = [];\n          for (var j = 0; j < glyphs.length; j++) {\n            var glyph = glyphs[j];\n            if (typeof glyph === 'object' && glyph !== null) {\n              str.push(glyph.fontChar);\n            } else {\n              if (str.length > 0) {\n                newArgs.push(str.join(''));\n                str = [];\n              }\n              newArgs.push(glyph); // null or number\n            }\n          }\n          if (str.length > 0) {\n            newArgs.push(str.join(''));\n          }\n          decArgs = [newArgs];\n        }\n        line.appendChild(c('td', fn));\n        line.appendChild(c('td', JSON.stringify(simplifyArgs(decArgs))));\n      }\n      if (operatorsToDisplay < operatorList.fnArray.length) {\n        line = c('tr');\n        var lastCell = c('td', '...');\n        lastCell.colspan = 4;\n        chunk.appendChild(lastCell);\n      }\n      this.operatorListIdx = operatorList.fnArray.length;\n      this.table.appendChild(chunk);\n    },\n    getNextBreakPoint: function getNextBreakPoint() {\n      this.breakPoints.sort(function(a, b) { return a - b; });\n      for (var i = 0; i < this.breakPoints.length; i++) {\n        if (this.breakPoints[i] > this.currentIdx) {\n          return this.breakPoints[i];\n        }\n      }\n      return null;\n    },\n    breakIt: function breakIt(idx, callback) {\n      StepperManager.selectStepper(this.pageIndex, true);\n      var self = this;\n      var dom = document;\n      self.currentIdx = idx;\n      var listener = function(e) {\n        switch (e.keyCode) {\n          case 83: // step\n            dom.removeEventListener('keydown', listener, false);\n            self.nextBreakPoint = self.currentIdx + 1;\n            self.goTo(-1);\n            callback();\n            break;\n          case 67: // continue\n            dom.removeEventListener('keydown', listener, false);\n            var breakPoint = self.getNextBreakPoint();\n            self.nextBreakPoint = breakPoint;\n            self.goTo(-1);\n            callback();\n            break;\n        }\n      };\n      dom.addEventListener('keydown', listener, false);\n      self.goTo(idx);\n    },\n    goTo: function goTo(idx) {\n      var allRows = this.panel.getElementsByClassName('line');\n      for (var x = 0, xx = allRows.length; x < xx; ++x) {\n        var row = allRows[x];\n        if (row.dataset.idx == idx) {\n          row.style.backgroundColor = 'rgb(251,250,207)';\n          row.scrollIntoView();\n        } else {\n          row.style.backgroundColor = null;\n        }\n      }\n    }\n  };\n  return Stepper;\n})();\n\nvar Stats = (function Stats() {\n  var stats = [];\n  function clear(node) {\n    while (node.hasChildNodes()) {\n      node.removeChild(node.lastChild);\n    }\n  }\n  function getStatIndex(pageNumber) {\n    for (var i = 0, ii = stats.length; i < ii; ++i) {\n      if (stats[i].pageNumber === pageNumber) {\n        return i;\n      }\n    }\n    return false;\n  }\n  return {\n    // Properties/functions needed by PDFBug.\n    id: 'Stats',\n    name: 'Stats',\n    panel: null,\n    manager: null,\n    init: function init() {\n      this.panel.setAttribute('style', 'padding: 5px;');\n      PDFJS.enableStats = true;\n    },\n    enabled: false,\n    active: false,\n    // Stats specific functions.\n    add: function(pageNumber, stat) {\n      if (!stat) {\n        return;\n      }\n      var statsIndex = getStatIndex(pageNumber);\n      if (statsIndex !== false) {\n        var b = stats[statsIndex];\n        this.panel.removeChild(b.div);\n        stats.splice(statsIndex, 1);\n      }\n      var wrapper = document.createElement('div');\n      wrapper.className = 'stats';\n      var title = document.createElement('div');\n      title.className = 'title';\n      title.textContent = 'Page: ' + pageNumber;\n      var statsDiv = document.createElement('div');\n      statsDiv.textContent = stat.toString();\n      wrapper.appendChild(title);\n      wrapper.appendChild(statsDiv);\n      stats.push({ pageNumber: pageNumber, div: wrapper });\n      stats.sort(function(a, b) { return a.pageNumber - b.pageNumber; });\n      clear(this.panel);\n      for (var i = 0, ii = stats.length; i < ii; ++i) {\n        this.panel.appendChild(stats[i].div);\n      }\n    },\n    cleanup: function () {\n      stats = [];\n      clear(this.panel);\n    }\n  };\n})();\n\n// Manages all the debugging tools.\nvar PDFBug = (function PDFBugClosure() {\n  var panelWidth = 300;\n  var buttons = [];\n  var activePanel = null;\n\n  return {\n    tools: [\n      FontInspector,\n      StepperManager,\n      Stats\n    ],\n    enable: function(ids) {\n      var all = false, tools = this.tools;\n      if (ids.length === 1 && ids[0] === 'all') {\n        all = true;\n      }\n      for (var i = 0; i < tools.length; ++i) {\n        var tool = tools[i];\n        if (all || ids.indexOf(tool.id) !== -1) {\n          tool.enabled = true;\n        }\n      }\n      if (!all) {\n        // Sort the tools by the order they are enabled.\n        tools.sort(function(a, b) {\n          var indexA = ids.indexOf(a.id);\n          indexA = indexA < 0 ? tools.length : indexA;\n          var indexB = ids.indexOf(b.id);\n          indexB = indexB < 0 ? tools.length : indexB;\n          return indexA - indexB;\n        });\n      }\n    },\n    init: function init() {\n      /*\n       * Basic Layout:\n       * PDFBug\n       *  Controls\n       *  Panels\n       *    Panel\n       *    Panel\n       *    ...\n       */\n      var ui = document.createElement('div');\n      ui.id = 'PDFBug';\n\n      var controls = document.createElement('div');\n      controls.setAttribute('class', 'controls');\n      ui.appendChild(controls);\n\n      var panels = document.createElement('div');\n      panels.setAttribute('class', 'panels');\n      ui.appendChild(panels);\n\n      var container = document.getElementById('viewerContainer');\n      container.appendChild(ui);\n      container.style.right = panelWidth + 'px';\n\n      // Initialize all the debugging tools.\n      var tools = this.tools;\n      var self = this;\n      for (var i = 0; i < tools.length; ++i) {\n        var tool = tools[i];\n        var panel = document.createElement('div');\n        var panelButton = document.createElement('button');\n        panelButton.textContent = tool.name;\n        panelButton.addEventListener('click', (function(selected) {\n          return function(event) {\n            event.preventDefault();\n            self.selectPanel(selected);\n          };\n        })(i));\n        controls.appendChild(panelButton);\n        panels.appendChild(panel);\n        tool.panel = panel;\n        tool.manager = this;\n        if (tool.enabled) {\n          tool.init();\n        } else {\n          panel.textContent = tool.name + ' is disabled. To enable add ' +\n                              ' \"' + tool.id + '\" to the pdfBug parameter ' +\n                              'and refresh (seperate multiple by commas).';\n        }\n        buttons.push(panelButton);\n      }\n      this.selectPanel(0);\n    },\n    cleanup: function cleanup() {\n      for (var i = 0, ii = this.tools.length; i < ii; i++) {\n        if (this.tools[i].enabled) {\n          this.tools[i].cleanup();\n        }\n      }\n    },\n    selectPanel: function selectPanel(index) {\n      if (typeof index !== 'number') {\n        index = this.tools.indexOf(index);\n      }\n      if (index === activePanel) {\n        return;\n      }\n      activePanel = index;\n      var tools = this.tools;\n      for (var j = 0; j < tools.length; ++j) {\n        if (j == index) {\n          buttons[j].setAttribute('class', 'active');\n          tools[j].active = true;\n          tools[j].panel.removeAttribute('hidden');\n        } else {\n          buttons[j].setAttribute('class', '');\n          tools[j].active = false;\n          tools[j].panel.setAttribute('hidden', 'true');\n        }\n      }\n    }\n  };\n})();\n"
  },
  {
    "path": "web/viewer/index.html",
    "content": "﻿<!DOCTYPE html>\n<!--\nCopyright 2012 Mozilla Foundation\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n-->\n<html dir=\"ltr\" mozdisallowselectionprint moznomarginboxes>\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\">\n    <meta name=\"google\" content=\"notranslate\">\n    <title>PDFium.js viewer</title>\n    <link rel=\"stylesheet\" href=\"viewer.css\"/>\n    <script src=\"compatibility.js\"></script>\n    <!-- This snippet is used in production (included from viewer.html) -->\n    <link rel=\"resource\" type=\"application/l10n\" href=\"locale/locale.properties\"/>\n    <script src=\"l10n.js\"></script>\n    <link rel=\"prefetch\" href=\"pdfium.js.pdf.js\">\n    <link rel=\"prefetch\" href=\"viewer.js\">\n    <script src=\"debugger.js\"></script>\n  </head>\n\n  <body tabindex=\"1\">\n    <div id=\"outerContainer\" class=\"loadingInProgress\">\n\n      <div id=\"sidebarContainer\">\n        <div id=\"toolbarSidebar\">\n          <div class=\"splitToolbarButton toggled\">\n            <button id=\"viewThumbnail\" class=\"toolbarButton group toggled\" title=\"Show Thumbnails\" tabindex=\"2\" data-l10n-id=\"thumbs\">\n               <span data-l10n-id=\"thumbs_label\">Thumbnails</span>\n            </button>\n            <button id=\"viewOutline\" class=\"toolbarButton group\" title=\"Show Document Outline\" tabindex=\"3\" data-l10n-id=\"outline\">\n               <span data-l10n-id=\"outline_label\">Document Outline</span>\n            </button>\n            <button id=\"viewAttachments\" class=\"toolbarButton group\" title=\"Show Attachments\" tabindex=\"4\" data-l10n-id=\"attachments\">\n               <span data-l10n-id=\"attachments_label\">Attachments</span>\n            </button>\n          </div>\n        </div>\n        <div id=\"sidebarContent\">\n          <div id=\"thumbnailView\">\n          </div>\n          <div id=\"outlineView\" class=\"hidden\">\n          </div>\n          <div id=\"attachmentsView\" class=\"hidden\">\n          </div>\n        </div>\n      </div>  <!-- sidebarContainer -->\n\n      <div id=\"mainContainer\">\n        <div class=\"findbar hidden doorHanger hiddenSmallView\" id=\"findbar\">\n          <label for=\"findInput\" class=\"toolbarLabel\" data-l10n-id=\"find_label\">Find:</label>\n          <input id=\"findInput\" class=\"toolbarField\" tabindex=\"41\">\n          <div class=\"splitToolbarButton\">\n            <button class=\"toolbarButton findPrevious\" title=\"\" id=\"findPrevious\" tabindex=\"42\" data-l10n-id=\"find_previous\">\n              <span data-l10n-id=\"find_previous_label\">Previous</span>\n            </button>\n            <div class=\"splitToolbarButtonSeparator\"></div>\n            <button class=\"toolbarButton findNext\" title=\"\" id=\"findNext\" tabindex=\"43\" data-l10n-id=\"find_next\">\n              <span data-l10n-id=\"find_next_label\">Next</span>\n            </button>\n          </div>\n          <input type=\"checkbox\" id=\"findHighlightAll\" class=\"toolbarField\">\n          <label for=\"findHighlightAll\" class=\"toolbarLabel\" tabindex=\"44\" data-l10n-id=\"find_highlight\">Highlight all</label>\n          <input type=\"checkbox\" id=\"findMatchCase\" class=\"toolbarField\">\n          <label for=\"findMatchCase\" class=\"toolbarLabel\" tabindex=\"45\" data-l10n-id=\"find_match_case_label\">Match case</label>\n          <span id=\"findMsg\" class=\"toolbarLabel\"></span>\n        </div>  <!-- findbar -->\n\n        <div id=\"secondaryToolbar\" class=\"secondaryToolbar hidden doorHangerRight\">\n          <div id=\"secondaryToolbarButtonContainer\">\n            <button id=\"secondaryPresentationMode\" class=\"secondaryToolbarButton presentationMode visibleLargeView\" title=\"Switch to Presentation Mode\" tabindex=\"19\" data-l10n-id=\"presentation_mode\">\n              <span data-l10n-id=\"presentation_mode_label\">Presentation Mode</span>\n            </button>\n\n            <button id=\"secondaryOpenFile\" class=\"secondaryToolbarButton openFile visibleLargeView\" title=\"Open File\" tabindex=\"20\" data-l10n-id=\"open_file\">\n              <span data-l10n-id=\"open_file_label\">Open</span>\n            </button>\n\n            <button id=\"secondaryPrint\" class=\"secondaryToolbarButton print visibleMediumView\" title=\"Print\" tabindex=\"21\" data-l10n-id=\"print\">\n              <span data-l10n-id=\"print_label\">Print</span>\n            </button>\n\n            <button id=\"secondaryDownload\" class=\"secondaryToolbarButton download visibleMediumView\" title=\"Download\" tabindex=\"22\" data-l10n-id=\"download\">\n              <span data-l10n-id=\"download_label\">Download</span>\n            </button>\n\n            <a href=\"#\" id=\"secondaryViewBookmark\" class=\"secondaryToolbarButton bookmark visibleSmallView\" title=\"Current view (copy or open in new window)\" tabindex=\"23\" data-l10n-id=\"bookmark\">\n              <span data-l10n-id=\"bookmark_label\">Current View</span>\n            </a>\n\n            <div class=\"horizontalToolbarSeparator visibleLargeView\"></div>\n\n            <button id=\"firstPage\" class=\"secondaryToolbarButton firstPage\" title=\"Go to First Page\" tabindex=\"24\" data-l10n-id=\"first_page\">\n              <span data-l10n-id=\"first_page_label\">Go to First Page</span>\n            </button>\n            <button id=\"lastPage\" class=\"secondaryToolbarButton lastPage\" title=\"Go to Last Page\" tabindex=\"25\" data-l10n-id=\"last_page\">\n              <span data-l10n-id=\"last_page_label\">Go to Last Page</span>\n            </button>\n\n            <div class=\"horizontalToolbarSeparator\"></div>\n\n            <button id=\"pageRotateCw\" class=\"secondaryToolbarButton rotateCw\" title=\"Rotate Clockwise\" tabindex=\"26\" data-l10n-id=\"page_rotate_cw\">\n              <span data-l10n-id=\"page_rotate_cw_label\">Rotate Clockwise</span>\n            </button>\n            <button id=\"pageRotateCcw\" class=\"secondaryToolbarButton rotateCcw\" title=\"Rotate Counterclockwise\" tabindex=\"27\" data-l10n-id=\"page_rotate_ccw\">\n              <span data-l10n-id=\"page_rotate_ccw_label\">Rotate Counterclockwise</span>\n            </button>\n\n            <div class=\"horizontalToolbarSeparator\"></div>\n\n            <button id=\"toggleHandTool\" class=\"secondaryToolbarButton handTool\" title=\"Enable hand tool\" tabindex=\"28\" data-l10n-id=\"hand_tool_enable\">\n              <span data-l10n-id=\"hand_tool_enable_label\">Enable hand tool</span>\n            </button>\n            \n            <div class=\"horizontalToolbarSeparator\"></div>\n\n            <button id=\"documentProperties\" class=\"secondaryToolbarButton documentProperties\" title=\"Document Properties…\" tabindex=\"29\" data-l10n-id=\"document_properties\">\n              <span data-l10n-id=\"document_properties_label\">Document Properties…</span>\n            </button>\n          </div>\n        </div>  <!-- secondaryToolbar -->\n\n        <div class=\"toolbar\">\n          <div id=\"toolbarContainer\">\n            <div id=\"toolbarViewer\">\n              <div id=\"toolbarViewerLeft\">\n                <button id=\"sidebarToggle\" class=\"toolbarButton\" title=\"Toggle Sidebar\" tabindex=\"5\" data-l10n-id=\"toggle_sidebar\">\n                  <span data-l10n-id=\"toggle_sidebar_label\">Toggle Sidebar</span>\n                </button>\n                <div class=\"toolbarButtonSpacer\"></div>\n                <button id=\"viewFind\" class=\"toolbarButton group hiddenSmallView\" title=\"Find in Document\" tabindex=\"6\" data-l10n-id=\"findbar\">\n                   <span data-l10n-id=\"findbar_label\">Find</span>\n                </button>\n                <div class=\"splitToolbarButton\">\n                  <button class=\"toolbarButton pageUp\" title=\"Previous Page\" id=\"previous\" tabindex=\"7\" data-l10n-id=\"previous\">\n                    <span data-l10n-id=\"previous_label\">Previous</span>\n                  </button>\n                  <div class=\"splitToolbarButtonSeparator\"></div>\n                  <button class=\"toolbarButton pageDown\" title=\"Next Page\" id=\"next\" tabindex=\"8\" data-l10n-id=\"next\">\n                    <span data-l10n-id=\"next_label\">Next</span>\n                  </button>\n                </div>\n                <label id=\"pageNumberLabel\" class=\"toolbarLabel\" for=\"pageNumber\" data-l10n-id=\"page_label\">Page: </label>\n                <input type=\"number\" id=\"pageNumber\" class=\"toolbarField pageNumber\" value=\"1\" size=\"4\" min=\"1\" tabindex=\"9\">\n                <span id=\"numPages\" class=\"toolbarLabel\"></span>\n              </div>\n              <div id=\"toolbarViewerRight\">\n                <button id=\"presentationMode\" class=\"toolbarButton presentationMode hiddenLargeView\" title=\"Switch to Presentation Mode\" tabindex=\"13\" data-l10n-id=\"presentation_mode\">\n                  <span data-l10n-id=\"presentation_mode_label\">Presentation Mode</span>\n                </button>\n\n                <button id=\"openFile\" class=\"toolbarButton openFile hiddenLargeView\" title=\"Open File\" tabindex=\"14\" data-l10n-id=\"open_file\">\n                  <span data-l10n-id=\"open_file_label\">Open</span>\n                </button>\n\n                <button id=\"print\" class=\"toolbarButton print hiddenMediumView\" title=\"Print\" tabindex=\"15\" data-l10n-id=\"print\">\n                  <span data-l10n-id=\"print_label\">Print</span>\n                </button>\n\n                <button id=\"download\" class=\"toolbarButton download hiddenMediumView\" title=\"Download\" tabindex=\"16\" data-l10n-id=\"download\">\n                  <span data-l10n-id=\"download_label\">Download</span>\n                </button>\n                <!-- <div class=\"toolbarButtonSpacer\"></div> -->\n                <a href=\"#\" id=\"viewBookmark\" class=\"toolbarButton bookmark hiddenSmallView\" title=\"Current view (copy or open in new window)\" tabindex=\"17\" data-l10n-id=\"bookmark\">\n                  <span data-l10n-id=\"bookmark_label\">Current View</span>\n                </a>\n\n                <div class=\"verticalToolbarSeparator hiddenSmallView\"></div>\n                \n                <button id=\"secondaryToolbarToggle\" class=\"toolbarButton\" title=\"Tools\" tabindex=\"18\" data-l10n-id=\"tools\">\n                  <span data-l10n-id=\"tools_label\">Tools</span>\n                </button> \n              </div>\n              <div class=\"outerCenter\">\n                <div class=\"innerCenter\" id=\"toolbarViewerMiddle\">\n                  <div class=\"splitToolbarButton\">\n                    <button id=\"zoomOut\" class=\"toolbarButton zoomOut\" title=\"Zoom Out\" tabindex=\"10\" data-l10n-id=\"zoom_out\">\n                      <span data-l10n-id=\"zoom_out_label\">Zoom Out</span>\n                    </button>\n                    <div class=\"splitToolbarButtonSeparator\"></div>\n                    <button id=\"zoomIn\" class=\"toolbarButton zoomIn\" title=\"Zoom In\" tabindex=\"11\" data-l10n-id=\"zoom_in\">\n                      <span data-l10n-id=\"zoom_in_label\">Zoom In</span>\n                     </button>\n                  </div>\n                  <span id=\"scaleSelectContainer\" class=\"dropdownToolbarButton\">\n                     <select id=\"scaleSelect\" title=\"Zoom\" tabindex=\"12\" data-l10n-id=\"zoom\">\n                      <option id=\"pageAutoOption\" title=\"\" value=\"auto\" selected=\"selected\" data-l10n-id=\"page_scale_auto\">Automatic Zoom</option>\n                      <option id=\"pageActualOption\" title=\"\" value=\"page-actual\" data-l10n-id=\"page_scale_actual\">Actual Size</option>\n                      <option id=\"pageFitOption\" title=\"\" value=\"page-fit\" data-l10n-id=\"page_scale_fit\">Fit Page</option>\n                      <option id=\"pageWidthOption\" title=\"\" value=\"page-width\" data-l10n-id=\"page_scale_width\">Full Width</option>\n                      <option id=\"customScaleOption\" title=\"\" value=\"custom\"></option>\n                      <option title=\"\" value=\"0.5\">50%</option>\n                      <option title=\"\" value=\"0.75\">75%</option>\n                      <option title=\"\" value=\"1\">100%</option>\n                      <option title=\"\" value=\"1.25\">125%</option>\n                      <option title=\"\" value=\"1.5\">150%</option>\n                      <option title=\"\" value=\"2\">200%</option>\n                      <option title=\"\" value=\"3\">300%</option>\n                      <option title=\"\" value=\"4\">400%</option>\n                    </select>\n                  </span>\n                </div>\n              </div>\n            </div>\n            <div id=\"loadingBar\">\n              <div class=\"progress\">\n                <div class=\"glimmer\">\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <menu type=\"context\" id=\"viewerContextMenu\">\n          <menuitem id=\"contextFirstPage\" label=\"First Page\"\n                    data-l10n-id=\"first_page\"></menuitem>\n          <menuitem id=\"contextLastPage\" label=\"Last Page\"\n                    data-l10n-id=\"last_page\"></menuitem>\n          <menuitem id=\"contextPageRotateCw\" label=\"Rotate Clockwise\"\n                    data-l10n-id=\"page_rotate_cw\"></menuitem>\n          <menuitem id=\"contextPageRotateCcw\" label=\"Rotate Counter-Clockwise\"\n                    data-l10n-id=\"page_rotate_ccw\"></menuitem>\n        </menu>\n\n        <div id=\"viewerContainer\" tabindex=\"0\">\n          <div id=\"viewer\"></div>\n        </div>\n\n        <div id=\"errorWrapper\" hidden='true'>\n          <div id=\"errorMessageLeft\">\n            <span id=\"errorMessage\"></span>\n            <button id=\"errorShowMore\" data-l10n-id=\"error_more_info\">\n              More Information\n            </button>\n            <button id=\"errorShowLess\" data-l10n-id=\"error_less_info\" hidden='true'>\n              Less Information\n            </button>\n          </div>\n          <div id=\"errorMessageRight\">\n            <button id=\"errorClose\" data-l10n-id=\"error_close\">\n              Close\n            </button>\n          </div>\n          <div class=\"clearBoth\"></div>\n          <textarea id=\"errorMoreInfo\" hidden='true' readonly=\"readonly\"></textarea>\n        </div>\n      </div> <!-- mainContainer -->\n\n      <div id=\"overlayContainer\" class=\"hidden\">\n        <div id=\"passwordOverlay\" class=\"container hidden\">\n          <div class=\"dialog\">\n            <div class=\"row\">\n              <p id=\"passwordText\" data-l10n-id=\"password_label\">Enter the password to open this PDF file:</p>\n            </div>\n            <div class=\"row\">\n              <input type=\"password\" id=\"password\" class=\"toolbarField\" />\n            </div>\n            <div class=\"buttonRow\">\n              <button id=\"passwordCancel\" class=\"overlayButton\"><span data-l10n-id=\"password_cancel\">Cancel</span></button>\n              <button id=\"passwordSubmit\" class=\"overlayButton\"><span data-l10n-id=\"password_ok\">OK</span></button>\n            </div>\n          </div>\n        </div>\n        <div id=\"documentPropertiesOverlay\" class=\"container hidden\">\n          <div class=\"dialog\">\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_file_name\">File name:</span> <p id=\"fileNameField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_file_size\">File size:</span> <p id=\"fileSizeField\">-</p>\n            </div>\n            <div class=\"separator\"></div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_title\">Title:</span> <p id=\"titleField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_author\">Author:</span> <p id=\"authorField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_subject\">Subject:</span> <p id=\"subjectField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_keywords\">Keywords:</span> <p id=\"keywordsField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_creation_date\">Creation Date:</span> <p id=\"creationDateField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_modification_date\">Modification Date:</span> <p id=\"modificationDateField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_creator\">Creator:</span> <p id=\"creatorField\">-</p>\n            </div>\n            <div class=\"separator\"></div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_producer\">PDF Producer:</span> <p id=\"producerField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_version\">PDF Version:</span> <p id=\"versionField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_page_count\">Page Count:</span> <p id=\"pageCountField\">-</p>\n            </div>\n            <div class=\"buttonRow\">\n              <button id=\"documentPropertiesClose\" class=\"overlayButton\"><span data-l10n-id=\"document_properties_close\">Close</span></button>\n            </div>\n          </div>\n        </div>\n      </div>  <!-- overlayContainer -->\n\n    </div> <!-- outerContainer -->\n    <div id=\"printContainer\"></div>\n<div id=\"mozPrintCallback-shim\" hidden>\n  <style scoped>\n#mozPrintCallback-shim {\n  position: fixed;\n  top: 0;\n  left: 0;\n  height: 100%;\n  width: 100%;\n  z-index: 9999999;\n\n  display: block;\n  text-align: center;\n  background-color: rgba(0, 0, 0, 0.5);\n}\n#mozPrintCallback-shim[hidden] {\n  display: none;\n}\n@media print {\n  #mozPrintCallback-shim {\n    display: none;\n  }\n}\n\n#mozPrintCallback-shim .mozPrintCallback-dialog-box {\n  display: inline-block;\n  margin: -50px auto 0;\n  position: relative;\n  top: 45%;\n  left: 0;\n  min-width: 220px;\n  max-width: 400px;\n\n  padding: 9px;\n\n  border: 1px solid hsla(0, 0%, 0%, .5);\n  border-radius: 2px;\n  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);\n\n  background-color: #474747;\n\n  color: hsl(0, 0%, 85%);\n  font-size: 16px;\n  line-height: 20px;\n}\n#mozPrintCallback-shim .progress-row {\n  clear: both;\n  padding: 1em 0;\n}\n#mozPrintCallback-shim progress {\n  width: 100%;\n}\n#mozPrintCallback-shim .relative-progress {\n  clear: both;\n  float: right;\n}\n#mozPrintCallback-shim .progress-actions {\n  clear: both;\n}\n  </style>\n  <div class=\"mozPrintCallback-dialog-box\">\n    <!-- TODO: Localise the following strings -->\n    Preparing document for printing...\n    <div class=\"progress-row\">\n      <progress value=\"0\" max=\"100\"></progress>\n      <span class=\"relative-progress\">0%</span>\n    </div>\n    <div class=\"progress-actions\">\n      <input type=\"button\" value=\"Cancel\" class=\"mozPrintCallback-cancel\">\n    </div>\n  </div>\n</div>\n    <script>\n      var scale = window.devicePixelRatio;\n      var timer = null;\n      var hashParams = (function() {\n        var search = document.location.search.substring(1);\n        var parts = search.split('&');\n        var params = {};\n        for(var i = 0, l = parts.length; i < l; ++i) {\n          var param = parts[i].split('=');\n          var key = param[0];\n          var value = param.length > 1 ? param[1] : null;\n          params[decodeURIComponent(key)] = decodeURIComponent(value);\n        }\n        return params;\n      })();\n      var total_memory = ('total_memory' in hashParams) ? parseInt(hashParams['total_memory']) : 1024*1024*100;\n      var Module = {\n        TOTAL_MEMORY: total_memory,\n        noExitRuntime: true,\n        print: function() { \n            console.group.apply(console, arguments); \n            console.groupEnd();\n        },\n        printErr: function() { \n            console.group.apply(console, arguments); \n            console.groupEnd();\n        },\n        _main: function () {\n          enlargeMemory = function() {\n            throw ('Not enough memory, try to allocate more by adding the following to the URL: `?total_memory=' + total_memory * 2 +'`.');\n          };\n          function load_script(url, cb) {\n            var e = document.createElement('script');\n            e.src = url;\n            e.onload = cb;\n            document.body.appendChild(e);\n          }\n          load_script('pdfium.js.pdf.js', function() {\n            load_script('viewer.js', function() {\n              DEFAULT_URL = null;\n              // initialize PDF.js viewer\n              webViewerLoad();\n            });\n          });\n        }\n      };\n    </script>\n\n    <script src=\"../pdfium.js\"></script>\n  </body>\n</html>\n\n"
  },
  {
    "path": "web/viewer/l10n.js",
    "content": "/**\n * Copyright (c) 2011-2013 Fabien Cazenave, Mozilla.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n/*\n  Additional modifications for PDF.js project:\n    - Disables language initialization on page loading;\n    - Removes consoleWarn and consoleLog and use console.log/warn directly.\n    - Removes window._ assignment.\n*/\n\n/*jshint browser: true, devel: true, globalstrict: true */\n'use strict';\n\ndocument.webL10n = (function(window, document, undefined) {\n  var gL10nData = {};\n  var gTextData = '';\n  var gTextProp = 'textContent';\n  var gLanguage = '';\n  var gMacros = {};\n  var gReadyState = 'loading';\n\n\n  /**\n   * Synchronously loading l10n resources significantly minimizes flickering\n   * from displaying the app with non-localized strings and then updating the\n   * strings. Although this will block all script execution on this page, we\n   * expect that the l10n resources are available locally on flash-storage.\n   *\n   * As synchronous XHR is generally considered as a bad idea, we're still\n   * loading l10n resources asynchronously -- but we keep this in a setting,\n   * just in case... and applications using this library should hide their\n   * content until the `localized' event happens.\n   */\n\n  var gAsyncResourceLoading = true; // read-only\n\n\n  /**\n   * DOM helpers for the so-called \"HTML API\".\n   *\n   * These functions are written for modern browsers. For old versions of IE,\n   * they're overridden in the 'startup' section at the end of this file.\n   */\n\n  function getL10nResourceLinks() {\n    return document.querySelectorAll('link[type=\"application/l10n\"]');\n  }\n\n  function getL10nDictionary() {\n    var script = document.querySelector('script[type=\"application/l10n\"]');\n    // TODO: support multiple and external JSON dictionaries\n    return script ? JSON.parse(script.innerHTML) : null;\n  }\n\n  function getTranslatableChildren(element) {\n    return element ? element.querySelectorAll('*[data-l10n-id]') : [];\n  }\n\n  function getL10nAttributes(element) {\n    if (!element)\n      return {};\n\n    var l10nId = element.getAttribute('data-l10n-id');\n    var l10nArgs = element.getAttribute('data-l10n-args');\n    var args = {};\n    if (l10nArgs) {\n      try {\n        args = JSON.parse(l10nArgs);\n      } catch (e) {\n        console.warn('could not parse arguments for #' + l10nId);\n      }\n    }\n    return { id: l10nId, args: args };\n  }\n\n  function fireL10nReadyEvent(lang) {\n    var evtObject = document.createEvent('Event');\n    evtObject.initEvent('localized', true, false);\n    evtObject.language = lang;\n    document.dispatchEvent(evtObject);\n  }\n\n  function xhrLoadText(url, onSuccess, onFailure, asynchronous) {\n    onSuccess = onSuccess || function _onSuccess(data) {};\n    onFailure = onFailure || function _onFailure() {\n      console.warn(url + ' not found.');\n    };\n\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url, asynchronous);\n    if (xhr.overrideMimeType) {\n      xhr.overrideMimeType('text/plain; charset=utf-8');\n    }\n    xhr.onreadystatechange = function() {\n      if (xhr.readyState == 4) {\n        if (xhr.status == 200 || xhr.status === 0) {\n          onSuccess(xhr.responseText);\n        } else {\n          onFailure();\n        }\n      }\n    };\n    xhr.onerror = onFailure;\n    xhr.ontimeout = onFailure;\n\n    // in Firefox OS with the app:// protocol, trying to XHR a non-existing\n    // URL will raise an exception here -- hence this ugly try...catch.\n    try {\n      xhr.send(null);\n    } catch (e) {\n      onFailure();\n    }\n  }\n\n\n  /**\n   * l10n resource parser:\n   *  - reads (async XHR) the l10n resource matching `lang';\n   *  - imports linked resources (synchronously) when specified;\n   *  - parses the text data (fills `gL10nData' and `gTextData');\n   *  - triggers success/failure callbacks when done.\n   *\n   * @param {string} href\n   *    URL of the l10n resource to parse.\n   *\n   * @param {string} lang\n   *    locale (language) to parse.\n   *\n   * @param {Function} successCallback\n   *    triggered when the l10n resource has been successully parsed.\n   *\n   * @param {Function} failureCallback\n   *    triggered when the an error has occured.\n   *\n   * @return {void}\n   *    uses the following global variables: gL10nData, gTextData, gTextProp.\n   */\n\n  function parseResource(href, lang, successCallback, failureCallback) {\n    var baseURL = href.replace(/[^\\/]*$/, '') || './';\n\n    // handle escaped characters (backslashes) in a string\n    function evalString(text) {\n      if (text.lastIndexOf('\\\\') < 0)\n        return text;\n      return text.replace(/\\\\\\\\/g, '\\\\')\n                 .replace(/\\\\n/g, '\\n')\n                 .replace(/\\\\r/g, '\\r')\n                 .replace(/\\\\t/g, '\\t')\n                 .replace(/\\\\b/g, '\\b')\n                 .replace(/\\\\f/g, '\\f')\n                 .replace(/\\\\{/g, '{')\n                 .replace(/\\\\}/g, '}')\n                 .replace(/\\\\\"/g, '\"')\n                 .replace(/\\\\'/g, \"'\");\n    }\n\n    // parse *.properties text data into an l10n dictionary\n    function parseProperties(text) {\n      var dictionary = [];\n\n      // token expressions\n      var reBlank = /^\\s*|\\s*$/;\n      var reComment = /^\\s*#|^\\s*$/;\n      var reSection = /^\\s*\\[(.*)\\]\\s*$/;\n      var reImport = /^\\s*@import\\s+url\\((.*)\\)\\s*$/i;\n      var reSplit = /^([^=\\s]*)\\s*=\\s*(.+)$/; // TODO: escape EOLs with '\\'\n\n      // parse the *.properties file into an associative array\n      function parseRawLines(rawText, extendedSyntax) {\n        var entries = rawText.replace(reBlank, '').split(/[\\r\\n]+/);\n        var currentLang = '*';\n        var genericLang = lang.replace(/-[a-z]+$/i, '');\n        var skipLang = false;\n        var match = '';\n\n        for (var i = 0; i < entries.length; i++) {\n          var line = entries[i];\n\n          // comment or blank line?\n          if (reComment.test(line))\n            continue;\n\n          // the extended syntax supports [lang] sections and @import rules\n          if (extendedSyntax) {\n            if (reSection.test(line)) { // section start?\n              match = reSection.exec(line);\n              currentLang = match[1];\n              skipLang = (currentLang !== '*') &&\n                  (currentLang !== lang) && (currentLang !== genericLang);\n              continue;\n            } else if (skipLang) {\n              continue;\n            }\n            if (reImport.test(line)) { // @import rule?\n              match = reImport.exec(line);\n              loadImport(baseURL + match[1]); // load the resource synchronously\n            }\n          }\n\n          // key-value pair\n          var tmp = line.match(reSplit);\n          if (tmp && tmp.length == 3) {\n            dictionary[tmp[1]] = evalString(tmp[2]);\n          }\n        }\n      }\n\n      // import another *.properties file\n      function loadImport(url) {\n        xhrLoadText(url, function(content) {\n          parseRawLines(content, false); // don't allow recursive imports\n        }, null, false); // load synchronously\n      }\n\n      // fill the dictionary\n      parseRawLines(text, true);\n      return dictionary;\n    }\n\n    // load and parse l10n data (warning: global variables are used here)\n    xhrLoadText(href, function(response) {\n      gTextData += response; // mostly for debug\n\n      // parse *.properties text data into an l10n dictionary\n      var data = parseProperties(response);\n\n      // find attribute descriptions, if any\n      for (var key in data) {\n        var id, prop, index = key.lastIndexOf('.');\n        if (index > 0) { // an attribute has been specified\n          id = key.substring(0, index);\n          prop = key.substr(index + 1);\n        } else { // no attribute: assuming text content by default\n          id = key;\n          prop = gTextProp;\n        }\n        if (!gL10nData[id]) {\n          gL10nData[id] = {};\n        }\n        gL10nData[id][prop] = data[key];\n      }\n\n      // trigger callback\n      if (successCallback) {\n        successCallback();\n      }\n    }, failureCallback, gAsyncResourceLoading);\n  }\n\n  // load and parse all resources for the specified locale\n  function loadLocale(lang, callback) {\n    callback = callback || function _callback() {};\n\n    clear();\n    gLanguage = lang;\n\n    // check all <link type=\"application/l10n\" href=\"...\" /> nodes\n    // and load the resource files\n    var langLinks = getL10nResourceLinks();\n    var langCount = langLinks.length;\n    if (langCount === 0) {\n      // we might have a pre-compiled dictionary instead\n      var dict = getL10nDictionary();\n      if (dict && dict.locales && dict.default_locale) {\n        console.log('using the embedded JSON directory, early way out');\n        gL10nData = dict.locales[lang] || dict.locales[dict.default_locale];\n        callback();\n      } else {\n        console.log('no resource to load, early way out');\n      }\n      // early way out\n      fireL10nReadyEvent(lang);\n      gReadyState = 'complete';\n      return;\n    }\n\n    // start the callback when all resources are loaded\n    var onResourceLoaded = null;\n    var gResourceCount = 0;\n    onResourceLoaded = function() {\n      gResourceCount++;\n      if (gResourceCount >= langCount) {\n        callback();\n        fireL10nReadyEvent(lang);\n        gReadyState = 'complete';\n      }\n    };\n\n    // load all resource files\n    function L10nResourceLink(link) {\n      var href = link.href;\n      var type = link.type;\n      this.load = function(lang, callback) {\n        var applied = lang;\n        parseResource(href, lang, callback, function() {\n          console.warn(href + ' not found.');\n          applied = '';\n        });\n        return applied; // return lang if found, an empty string if not found\n      };\n    }\n\n    for (var i = 0; i < langCount; i++) {\n      var resource = new L10nResourceLink(langLinks[i]);\n      var rv = resource.load(lang, onResourceLoaded);\n      if (rv != lang) { // lang not found, used default resource instead\n        console.warn('\"' + lang + '\" resource not found');\n        gLanguage = '';\n      }\n    }\n  }\n\n  // clear all l10n data\n  function clear() {\n    gL10nData = {};\n    gTextData = '';\n    gLanguage = '';\n    // TODO: clear all non predefined macros.\n    // There's no such macro /yet/ but we're planning to have some...\n  }\n\n\n  /**\n   * Get rules for plural forms (shared with JetPack), see:\n   * http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html\n   * https://github.com/mozilla/addon-sdk/blob/master/python-lib/plural-rules-generator.p\n   *\n   * @param {string} lang\n   *    locale (language) used.\n   *\n   * @return {Function}\n   *    returns a function that gives the plural form name for a given integer:\n   *       var fun = getPluralRules('en');\n   *       fun(1)    -> 'one'\n   *       fun(0)    -> 'other'\n   *       fun(1000) -> 'other'.\n   */\n\n  function getPluralRules(lang) {\n    var locales2rules = {\n      'af': 3,\n      'ak': 4,\n      'am': 4,\n      'ar': 1,\n      'asa': 3,\n      'az': 0,\n      'be': 11,\n      'bem': 3,\n      'bez': 3,\n      'bg': 3,\n      'bh': 4,\n      'bm': 0,\n      'bn': 3,\n      'bo': 0,\n      'br': 20,\n      'brx': 3,\n      'bs': 11,\n      'ca': 3,\n      'cgg': 3,\n      'chr': 3,\n      'cs': 12,\n      'cy': 17,\n      'da': 3,\n      'de': 3,\n      'dv': 3,\n      'dz': 0,\n      'ee': 3,\n      'el': 3,\n      'en': 3,\n      'eo': 3,\n      'es': 3,\n      'et': 3,\n      'eu': 3,\n      'fa': 0,\n      'ff': 5,\n      'fi': 3,\n      'fil': 4,\n      'fo': 3,\n      'fr': 5,\n      'fur': 3,\n      'fy': 3,\n      'ga': 8,\n      'gd': 24,\n      'gl': 3,\n      'gsw': 3,\n      'gu': 3,\n      'guw': 4,\n      'gv': 23,\n      'ha': 3,\n      'haw': 3,\n      'he': 2,\n      'hi': 4,\n      'hr': 11,\n      'hu': 0,\n      'id': 0,\n      'ig': 0,\n      'ii': 0,\n      'is': 3,\n      'it': 3,\n      'iu': 7,\n      'ja': 0,\n      'jmc': 3,\n      'jv': 0,\n      'ka': 0,\n      'kab': 5,\n      'kaj': 3,\n      'kcg': 3,\n      'kde': 0,\n      'kea': 0,\n      'kk': 3,\n      'kl': 3,\n      'km': 0,\n      'kn': 0,\n      'ko': 0,\n      'ksb': 3,\n      'ksh': 21,\n      'ku': 3,\n      'kw': 7,\n      'lag': 18,\n      'lb': 3,\n      'lg': 3,\n      'ln': 4,\n      'lo': 0,\n      'lt': 10,\n      'lv': 6,\n      'mas': 3,\n      'mg': 4,\n      'mk': 16,\n      'ml': 3,\n      'mn': 3,\n      'mo': 9,\n      'mr': 3,\n      'ms': 0,\n      'mt': 15,\n      'my': 0,\n      'nah': 3,\n      'naq': 7,\n      'nb': 3,\n      'nd': 3,\n      'ne': 3,\n      'nl': 3,\n      'nn': 3,\n      'no': 3,\n      'nr': 3,\n      'nso': 4,\n      'ny': 3,\n      'nyn': 3,\n      'om': 3,\n      'or': 3,\n      'pa': 3,\n      'pap': 3,\n      'pl': 13,\n      'ps': 3,\n      'pt': 3,\n      'rm': 3,\n      'ro': 9,\n      'rof': 3,\n      'ru': 11,\n      'rwk': 3,\n      'sah': 0,\n      'saq': 3,\n      'se': 7,\n      'seh': 3,\n      'ses': 0,\n      'sg': 0,\n      'sh': 11,\n      'shi': 19,\n      'sk': 12,\n      'sl': 14,\n      'sma': 7,\n      'smi': 7,\n      'smj': 7,\n      'smn': 7,\n      'sms': 7,\n      'sn': 3,\n      'so': 3,\n      'sq': 3,\n      'sr': 11,\n      'ss': 3,\n      'ssy': 3,\n      'st': 3,\n      'sv': 3,\n      'sw': 3,\n      'syr': 3,\n      'ta': 3,\n      'te': 3,\n      'teo': 3,\n      'th': 0,\n      'ti': 4,\n      'tig': 3,\n      'tk': 3,\n      'tl': 4,\n      'tn': 3,\n      'to': 0,\n      'tr': 0,\n      'ts': 3,\n      'tzm': 22,\n      'uk': 11,\n      'ur': 3,\n      've': 3,\n      'vi': 0,\n      'vun': 3,\n      'wa': 4,\n      'wae': 3,\n      'wo': 0,\n      'xh': 3,\n      'xog': 3,\n      'yo': 0,\n      'zh': 0,\n      'zu': 3\n    };\n\n    // utility functions for plural rules methods\n    function isIn(n, list) {\n      return list.indexOf(n) !== -1;\n    }\n    function isBetween(n, start, end) {\n      return start <= n && n <= end;\n    }\n\n    // list of all plural rules methods:\n    // map an integer to the plural form name to use\n    var pluralRules = {\n      '0': function(n) {\n        return 'other';\n      },\n      '1': function(n) {\n        if ((isBetween((n % 100), 3, 10)))\n          return 'few';\n        if (n === 0)\n          return 'zero';\n        if ((isBetween((n % 100), 11, 99)))\n          return 'many';\n        if (n == 2)\n          return 'two';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '2': function(n) {\n        if (n !== 0 && (n % 10) === 0)\n          return 'many';\n        if (n == 2)\n          return 'two';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '3': function(n) {\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '4': function(n) {\n        if ((isBetween(n, 0, 1)))\n          return 'one';\n        return 'other';\n      },\n      '5': function(n) {\n        if ((isBetween(n, 0, 2)) && n != 2)\n          return 'one';\n        return 'other';\n      },\n      '6': function(n) {\n        if (n === 0)\n          return 'zero';\n        if ((n % 10) == 1 && (n % 100) != 11)\n          return 'one';\n        return 'other';\n      },\n      '7': function(n) {\n        if (n == 2)\n          return 'two';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '8': function(n) {\n        if ((isBetween(n, 3, 6)))\n          return 'few';\n        if ((isBetween(n, 7, 10)))\n          return 'many';\n        if (n == 2)\n          return 'two';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '9': function(n) {\n        if (n === 0 || n != 1 && (isBetween((n % 100), 1, 19)))\n          return 'few';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '10': function(n) {\n        if ((isBetween((n % 10), 2, 9)) && !(isBetween((n % 100), 11, 19)))\n          return 'few';\n        if ((n % 10) == 1 && !(isBetween((n % 100), 11, 19)))\n          return 'one';\n        return 'other';\n      },\n      '11': function(n) {\n        if ((isBetween((n % 10), 2, 4)) && !(isBetween((n % 100), 12, 14)))\n          return 'few';\n        if ((n % 10) === 0 ||\n            (isBetween((n % 10), 5, 9)) ||\n            (isBetween((n % 100), 11, 14)))\n          return 'many';\n        if ((n % 10) == 1 && (n % 100) != 11)\n          return 'one';\n        return 'other';\n      },\n      '12': function(n) {\n        if ((isBetween(n, 2, 4)))\n          return 'few';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '13': function(n) {\n        if ((isBetween((n % 10), 2, 4)) && !(isBetween((n % 100), 12, 14)))\n          return 'few';\n        if (n != 1 && (isBetween((n % 10), 0, 1)) ||\n            (isBetween((n % 10), 5, 9)) ||\n            (isBetween((n % 100), 12, 14)))\n          return 'many';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '14': function(n) {\n        if ((isBetween((n % 100), 3, 4)))\n          return 'few';\n        if ((n % 100) == 2)\n          return 'two';\n        if ((n % 100) == 1)\n          return 'one';\n        return 'other';\n      },\n      '15': function(n) {\n        if (n === 0 || (isBetween((n % 100), 2, 10)))\n          return 'few';\n        if ((isBetween((n % 100), 11, 19)))\n          return 'many';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '16': function(n) {\n        if ((n % 10) == 1 && n != 11)\n          return 'one';\n        return 'other';\n      },\n      '17': function(n) {\n        if (n == 3)\n          return 'few';\n        if (n === 0)\n          return 'zero';\n        if (n == 6)\n          return 'many';\n        if (n == 2)\n          return 'two';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '18': function(n) {\n        if (n === 0)\n          return 'zero';\n        if ((isBetween(n, 0, 2)) && n !== 0 && n != 2)\n          return 'one';\n        return 'other';\n      },\n      '19': function(n) {\n        if ((isBetween(n, 2, 10)))\n          return 'few';\n        if ((isBetween(n, 0, 1)))\n          return 'one';\n        return 'other';\n      },\n      '20': function(n) {\n        if ((isBetween((n % 10), 3, 4) || ((n % 10) == 9)) && !(\n            isBetween((n % 100), 10, 19) ||\n            isBetween((n % 100), 70, 79) ||\n            isBetween((n % 100), 90, 99)\n            ))\n          return 'few';\n        if ((n % 1000000) === 0 && n !== 0)\n          return 'many';\n        if ((n % 10) == 2 && !isIn((n % 100), [12, 72, 92]))\n          return 'two';\n        if ((n % 10) == 1 && !isIn((n % 100), [11, 71, 91]))\n          return 'one';\n        return 'other';\n      },\n      '21': function(n) {\n        if (n === 0)\n          return 'zero';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '22': function(n) {\n        if ((isBetween(n, 0, 1)) || (isBetween(n, 11, 99)))\n          return 'one';\n        return 'other';\n      },\n      '23': function(n) {\n        if ((isBetween((n % 10), 1, 2)) || (n % 20) === 0)\n          return 'one';\n        return 'other';\n      },\n      '24': function(n) {\n        if ((isBetween(n, 3, 10) || isBetween(n, 13, 19)))\n          return 'few';\n        if (isIn(n, [2, 12]))\n          return 'two';\n        if (isIn(n, [1, 11]))\n          return 'one';\n        return 'other';\n      }\n    };\n\n    // return a function that gives the plural form name for a given integer\n    var index = locales2rules[lang.replace(/-.*$/, '')];\n    if (!(index in pluralRules)) {\n      console.warn('plural form unknown for [' + lang + ']');\n      return function() { return 'other'; };\n    }\n    return pluralRules[index];\n  }\n\n  // pre-defined 'plural' macro\n  gMacros.plural = function(str, param, key, prop) {\n    var n = parseFloat(param);\n    if (isNaN(n))\n      return str;\n\n    // TODO: support other properties (l20n still doesn't...)\n    if (prop != gTextProp)\n      return str;\n\n    // initialize _pluralRules\n    if (!gMacros._pluralRules) {\n      gMacros._pluralRules = getPluralRules(gLanguage);\n    }\n    var index = '[' + gMacros._pluralRules(n) + ']';\n\n    // try to find a [zero|one|two] key if it's defined\n    if (n === 0 && (key + '[zero]') in gL10nData) {\n      str = gL10nData[key + '[zero]'][prop];\n    } else if (n == 1 && (key + '[one]') in gL10nData) {\n      str = gL10nData[key + '[one]'][prop];\n    } else if (n == 2 && (key + '[two]') in gL10nData) {\n      str = gL10nData[key + '[two]'][prop];\n    } else if ((key + index) in gL10nData) {\n      str = gL10nData[key + index][prop];\n    } else if ((key + '[other]') in gL10nData) {\n      str = gL10nData[key + '[other]'][prop];\n    }\n\n    return str;\n  };\n\n\n  /**\n   * l10n dictionary functions\n   */\n\n  // fetch an l10n object, warn if not found, apply `args' if possible\n  function getL10nData(key, args, fallback) {\n    var data = gL10nData[key];\n    if (!data) {\n      console.warn('#' + key + ' is undefined.');\n      if (!fallback) {\n        return null;\n      }\n      data = fallback;\n    }\n\n    /** This is where l10n expressions should be processed.\n      * The plan is to support C-style expressions from the l20n project;\n      * until then, only two kinds of simple expressions are supported:\n      *   {[ index ]} and {{ arguments }}.\n      */\n    var rv = {};\n    for (var prop in data) {\n      var str = data[prop];\n      str = substIndexes(str, args, key, prop);\n      str = substArguments(str, args, key);\n      rv[prop] = str;\n    }\n    return rv;\n  }\n\n  // replace {[macros]} with their values\n  function substIndexes(str, args, key, prop) {\n    var reIndex = /\\{\\[\\s*([a-zA-Z]+)\\(([a-zA-Z]+)\\)\\s*\\]\\}/;\n    var reMatch = reIndex.exec(str);\n    if (!reMatch || !reMatch.length)\n      return str;\n\n    // an index/macro has been found\n    // Note: at the moment, only one parameter is supported\n    var macroName = reMatch[1];\n    var paramName = reMatch[2];\n    var param;\n    if (args && paramName in args) {\n      param = args[paramName];\n    } else if (paramName in gL10nData) {\n      param = gL10nData[paramName];\n    }\n\n    // there's no macro parser yet: it has to be defined in gMacros\n    if (macroName in gMacros) {\n      var macro = gMacros[macroName];\n      str = macro(str, param, key, prop);\n    }\n    return str;\n  }\n\n  // replace {{arguments}} with their values\n  function substArguments(str, args, key) {\n    var reArgs = /\\{\\{\\s*(.+?)\\s*\\}\\}/;\n    var match = reArgs.exec(str);\n    while (match) {\n      if (!match || match.length < 2)\n        return str; // argument key not found\n\n      var arg = match[1];\n      var sub = '';\n      if (args && arg in args) {\n        sub = args[arg];\n      } else if (arg in gL10nData) {\n        sub = gL10nData[arg][gTextProp];\n      } else {\n        console.log('argument {{' + arg + '}} for #' + key + ' is undefined.');\n        return str;\n      }\n\n      str = str.substring(0, match.index) + sub +\n            str.substr(match.index + match[0].length);\n      match = reArgs.exec(str);\n    }\n    return str;\n  }\n\n  // translate an HTML element\n  function translateElement(element) {\n    var l10n = getL10nAttributes(element);\n    if (!l10n.id)\n      return;\n\n    // get the related l10n object\n    var data = getL10nData(l10n.id, l10n.args);\n    if (!data) {\n      console.warn('#' + l10n.id + ' is undefined.');\n      return;\n    }\n\n    // translate element (TODO: security checks?)\n    if (data[gTextProp]) { // XXX\n      if (getChildElementCount(element) === 0) {\n        element[gTextProp] = data[gTextProp];\n      } else {\n        // this element has element children: replace the content of the first\n        // (non-empty) child textNode and clear other child textNodes\n        var children = element.childNodes;\n        var found = false;\n        for (var i = 0, l = children.length; i < l; i++) {\n          if (children[i].nodeType === 3 && /\\S/.test(children[i].nodeValue)) {\n            if (found) {\n              children[i].nodeValue = '';\n            } else {\n              children[i].nodeValue = data[gTextProp];\n              found = true;\n            }\n          }\n        }\n        // if no (non-empty) textNode is found, insert a textNode before the\n        // first element child.\n        if (!found) {\n          var textNode = document.createTextNode(data[gTextProp]);\n          element.insertBefore(textNode, element.firstChild);\n        }\n      }\n      delete data[gTextProp];\n    }\n\n    for (var k in data) {\n      element[k] = data[k];\n    }\n  }\n\n  // webkit browsers don't currently support 'children' on SVG elements...\n  function getChildElementCount(element) {\n    if (element.children) {\n      return element.children.length;\n    }\n    if (typeof element.childElementCount !== 'undefined') {\n      return element.childElementCount;\n    }\n    var count = 0;\n    for (var i = 0; i < element.childNodes.length; i++) {\n      count += element.nodeType === 1 ? 1 : 0;\n    }\n    return count;\n  }\n\n  // translate an HTML subtree\n  function translateFragment(element) {\n    element = element || document.documentElement;\n\n    // check all translatable children (= w/ a `data-l10n-id' attribute)\n    var children = getTranslatableChildren(element);\n    var elementCount = children.length;\n    for (var i = 0; i < elementCount; i++) {\n      translateElement(children[i]);\n    }\n\n    // translate element itself if necessary\n    translateElement(element);\n  }\n\n  // cross-browser API (sorry, oldIE doesn't support getters & setters)\n  return {\n    // get a localized string\n    get: function(key, args, fallbackString) {\n      var index = key.lastIndexOf('.');\n      var prop = gTextProp;\n      if (index > 0) { // An attribute has been specified\n        prop = key.substr(index + 1);\n        key = key.substring(0, index);\n      }\n      var fallback;\n      if (fallbackString) {\n        fallback = {};\n        fallback[prop] = fallbackString;\n      }\n      var data = getL10nData(key, args, fallback);\n      if (data && prop in data) {\n        return data[prop];\n      }\n      return '{{' + key + '}}';\n    },\n\n    // debug\n    getData: function() { return gL10nData; },\n    getText: function() { return gTextData; },\n\n    // get|set the document language\n    getLanguage: function() { return gLanguage; },\n    setLanguage: function(lang) { loadLocale(lang, translateFragment); },\n\n    // get the direction (ltr|rtl) of the current language\n    getDirection: function() {\n      // http://www.w3.org/International/questions/qa-scripts\n      // Arabic, Hebrew, Farsi, Pashto, Urdu\n      var rtlList = ['ar', 'he', 'fa', 'ps', 'ur'];\n      return (rtlList.indexOf(gLanguage) >= 0) ? 'rtl' : 'ltr';\n    },\n\n    // translate an element or document fragment\n    translate: translateFragment,\n\n    // this can be used to prevent race conditions\n    getReadyState: function() { return gReadyState; },\n    ready: function(callback) {\n      if (!callback) {\n        return;\n      } else if (gReadyState == 'complete' || gReadyState == 'interactive') {\n        window.setTimeout(callback);\n      } else if (document.addEventListener) {\n        document.addEventListener('localized', callback);\n      } else if (document.attachEvent) {\n        document.documentElement.attachEvent('onpropertychange', function(e) {\n          if (e.propertyName === 'localized') {\n            callback();\n          }\n        });\n      }\n    }\n  };\n}) (window, document);\n"
  },
  {
    "path": "web/viewer/locale/ach/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pot buk Mukato\nnext.title=Pot buk Malubo Kore\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Pot buk:\npage_of=pi {{pageCount}}\n\nzoom_out.title=Dwogo Woko\nzoom_out_label=Dwogo Woko\nzoom_in.title=Dwogo iyie\nzoom_in_label=Dwogo iyie\nzoom.title=Kwoti\nprint.title=Goo\nprint_label=Goo\nopen_file.title=Yab Pwail\nopen_file_label=Yabi\ndownload.title=Gam\ndownload_label=Gam\nbookmark.title=Neno matye (loki onyo yabi i dirica manyen)\nbookmark_label=Neno Matye\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\noutline.title=Nyut ryeno rek pa Coc acoya\noutline_label=Ryeno rek me Coc acoya\nthumbs.title=Nyut Capa cing\nthumbs_label=Capa cing\nfindbar_label=Nong\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pot buk {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Capa cing e Pot buk {{page}}\n\n# Context menu\n\n# Find panel button title and messages\nfind_previous.title=Nong en matime malubo kore pi lok\nfind_next.title=Nong en matime malubo kore pi lok\nfind_not_found=Phrase pe ononge\n\n# Error panel labels\nerror_more_info=Ngec Mukene\nerror_close=Lor\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Kwena: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Agiki onyo acaki {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Pwail: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rek: {{line}}\nrendering_error=Bal otyeko time kun jalo pot buk.\n\n# Predefined zoom values\npage_scale_width=Bor wi Pot buk\npage_scale_fit=Pot buk Romo\npage_scale_auto=Dowogo ne matime pire kene\npage_scale_actual=Kit Mamite\n\n# Loading indicator messages\nloading_error_indicator=Bal\nloading_error=Bal otyeko time kun pango PDF.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Lok angea manok]\nrequest_password=I ung otyeko gwoko PDF:\n\n"
  },
  {
    "path": "web/viewer/locale/af/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Vorige bladsy\nprevious_label=Vorige\nnext.title=Volgende bladsy\nnext_label=Volgende\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Bladsy:\npage_of=van {{pageCount}}\n\nzoom_out.title=Zoem uit\nzoom_out_label=Zoem uit\nzoom_in.title=Zoem in\nzoom_in_label=Zoem in\nzoom.title=Zoem\npresentation_mode.title=Wissel na voorleggingsmodus\npresentation_mode_label=Voorleggingsmodus\nopen_file.title=Open lêer\nopen_file_label=Open\nprint.title=Druk\nprint_label=Druk\ndownload.title=Laai af\ndownload_label=Laai af\nbookmark.title=Huidige aansig (kopieer of open in nuwe venster)\nbookmark_label=Huidige aansig\n\n# Secondary toolbar and context menu\ntools.title=Nutsgoed\ntools_label=Nutsgoed\nfirst_page.title=Gaan na eerste bladsy\nfirst_page.label=Gaan na eerste bladsy\nfirst_page_label=Gaan na eerste bladsy\nlast_page.title=Gaan na laaste bladsy\nlast_page.label=Gaan na laaste bladsy\nlast_page_label=Gaan na laaste bladsy\npage_rotate_cw.title=Roteer kloksgewys\npage_rotate_cw.label=Roteer kloksgewys\npage_rotate_cw_label=Roteer kloksgewys\npage_rotate_ccw.title=Roteer anti-kloksgewys\npage_rotate_ccw.label=Roteer anti-kloksgewys\npage_rotate_ccw_label=Roteer anti-kloksgewys\n\n\n# Document properties dialog box\ndocument_properties.title=Dokumenteienskappe…\ndocument_properties_label=Dokumenteienskappe…\ndocument_properties_file_name=Lêernaam:\ndocument_properties_file_size=Lêergrootte:\ndocument_properties_kb={{size_kb}} kG ({{size_b}} grepe)\ndocument_properties_mb={{size_mb}} MG ({{size_b}} grepe)\ndocument_properties_title=Titel:\ndocument_properties_author=Outeur:\ndocument_properties_subject=Onderwerp:\ndocument_properties_keywords=Sleutelwoorde:\ndocument_properties_creation_date=Skeppingsdatum:\ndocument_properties_modification_date=Wysigingsdatum:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Skepper:\ndocument_properties_producer=PDF-vervaardiger:\ndocument_properties_version=PDF-weergawe:\ndocument_properties_page_count=Aantal bladsye:\ndocument_properties_close=Sluit\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Sypaneel aan/af\ntoggle_sidebar_label=Sypaneel aan/af\noutline.title=Wys dokumentoorsig\noutline_label=Dokumentoorsig\nthumbs.title=Wys duimnaels\nthumbs_label=Duimnaels\nfindbar.title=Soek in dokument\nfindbar_label=Vind\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Bladsy {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Duimnael van bladsy {{page}}\n\n# Find panel button title and messages\nfind_label=Vind:\nfind_previous.title=Vind die vorige voorkoms van die frase\nfind_previous_label=Vorige\nfind_next.title=Vind die volgende voorkoms van die frase\nfind_next_label=Volgende\nfind_highlight=Verlig alle\nfind_match_case_label=Kassensitief\nfind_reached_top=Bokant van dokument is bereik; gaan voort van onder af\nfind_reached_bottom=Einde van dokument is bereik; gaan voort van bo af\nfind_not_found=Frase nie gevind nie\n\n# Error panel labels\nerror_more_info=Meer inligting\nerror_less_info=Minder inligting\nerror_close=Sluit\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (ID: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Boodskap: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stapel: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Lêer: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Lyn: {{line}}\nrendering_error='n Fout het voorgekom toe die bladsy weergegee is.\n\n# Predefined zoom values\npage_scale_width=Bladsywydte\npage_scale_fit=Pas bladsy\npage_scale_auto=Outomatiese zoem\npage_scale_actual=Werklike grootte\n\n# Loading indicator messages\nloading_error_indicator=Fout\nloading_error='n Fout het voorgekom met die laai van die PDF.\ninvalid_file_error=Ongeldige of korrupte PDF-lêer.\nmissing_file_error=PDF-lêer is weg.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}}-annotasie\npassword_label=Gee die wagwoord om dié PDF-lêer mee te open.\npassword_invalid=Ongeldige wagwoord. Probeer gerus weer.\npassword_ok=OK\npassword_cancel=Kanselleer\n\nprinting_not_supported=Waarskuwing: Dié blaaier ondersteun nie drukwerk ten volle nie.\nprinting_not_ready=Waarskuwing: Die PDF is nog nie volledig gelaai vir drukwerk nie.\nweb_fonts_disabled=Webfonte is gedeaktiveer: kan nie PDF-fonte wat ingebed is, gebruik nie.\ndocument_colors_disabled=PDF-dokumente word nie toegelaat om hul eie kleure te gebruik nie: 'Laat bladsye toe om hul eie kleure te kies' is gedeaktiveer in die blaaier.\n"
  },
  {
    "path": "web/viewer/locale/ak/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Krataafa baako a etwa mu\nprevious_label=Ekyiri-baako\nnext.title=Krataafa a edi so baako\nnext_label=Dea-ɛ-di-so-baako\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Krataafa:\npage_of=wɔ {{pageCount}}\n\nzoom_out.title=Zuum pue\nzoom_out_label=Zuum ba abɔnten\nzoom_in.title=Zuum kɔ mu\nzoom_in_label=Zuum kɔ mu\nzoom.title=Zuum\npresentation_mode.title=Sesa kɔ Yɛkyerɛ Tebea mu\npresentation_mode_label=Yɛkyerɛ Tebea\nopen_file.title=Bue Fael\nopen_file_label=Bue\nprint.title=Prente\nprint_label=Prente\ndownload.title=Twe\ndownload_label=Twe\nbookmark.title=Seisei nhwɛ (fa anaaso bue wɔ tokuro foforo mu)\nbookmark_label=Seisei nhwɛ\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\ndocument_properties_title=Ti asɛm:\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Sɔ anaaso dum saedbaa\ntoggle_sidebar_label=Sɔ anaaso dum saedbaa\noutline.title=Kyerɛ dɔkomɛnt bɔbea\noutline_label=Dɔkomɛnt bɔbea\nthumbs.title=Kyerɛ mfoniwaa\nthumbs_label=Mfoniwaa\nfindbar.title=Hu wɔ dɔkomɛnt no mu\nfindbar_label=Hu\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Krataafa {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Krataafa ne mfoniwaa {{page}}\n\n# Find panel button title and messages\nfind_label=Hunu:\nfind_previous.title=San hu fres wɔ ekyiri baako\nfind_previous_label=Ekyiri baako\nfind_next.title=San hu fres no wɔ enim baako\nfind_next_label=Ndiso\nfind_highlight=Hyɛ bibiara nso\nfind_match_case_label=Fa susu kaase\nfind_reached_top=Edu krataafa ne soro, atoa so efiri ase\nfind_reached_bottom=Edu krataafa n'ewiei, atoa so efiri soro\nfind_not_found=Ennhu fres\n\n# Error panel labels\nerror_more_info=Infɔmehyɛn bio a wɔka ho\nerror_less_info=Te infɔmehyɛn bio a wɔka ho so\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{vɛɛhyen}} (nsi: {{si}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Nkrato: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Staake: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fael: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Laen: {{line}}\nrendering_error=Mfomso bae wɔ bere a wɔ rekyerɛ krataafa no.\n\n# Predefined zoom values\npage_scale_width=Krataafa tɛtrɛtɛ\npage_scale_fit=Krataafa ehimtwa\npage_scale_auto=Zuum otomatik\npage_scale_actual=Kɛseyɛ ankasa\n\n# Loading indicator messages\nloading_error_indicator=Mfomso\nloading_error=Mfomso bae wɔ bere a wɔreloode PDF no.\ninvalid_file_error=PDF fael no nndi mu anaaso ho atɔ kyima.\nmissing_file_error=PDF fael no ayera.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Tɛkst-nyiano]\npassword_ok=OK\npassword_cancel=Twa-mu\n\nprinting_not_supported=Kɔkɔbɔ: Brawsa yi nnhyɛ daa mma prent ho kwan.\nprinting_not_ready=Kɔkɔbɔ: Wɔnntwee PDF fael no nyinara mmbaee ama wo ɛ tumi aprente.\nweb_fonts_disabled=Ɔedum wɛb-mfɔnt: nntumi mmfa PDF mfɔnt a wɔhyɛ mu nndi dwuma.\ndocument_colors_disabled=Wɔmma ho kwan sɛ PDF adɔkomɛnt de wɔn ara wɔn ahosu bɛdi dwuma: wɔ adum 'Ma ho kwan ma nkrataafa mpaw wɔn ara wɔn ahosu' wɔ brawsa yi mu.\n"
  },
  {
    "path": "web/viewer/locale/an/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pachina anterior\nprevious_label=Anterior\nnext.title=Pachina siguient\nnext_label=Siguient\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Pachina:\npage_of=de {{pageCount}}\n\nzoom_out.title=Achiquir\nzoom_out_label=Achiquir\nzoom_in.title=Agrandir\nzoom_in_label=Agrandir\nzoom.title=Grandaria\npresentation_mode.title=Cambear t'o modo de presentación\npresentation_mode_label=Modo de presentación\nopen_file.title=Ubrir o fichero\nopen_file_label=Ubrir\nprint.title=Imprentar\nprint_label=Imprentar\ndownload.title=Descargar\ndownload_label=Descargar\nbookmark.title=Vista actual (copiar u ubrir en una nueva finestra)\nbookmark_label=Anvista actual\n\n# Secondary toolbar and context menu\ntools.title=Ferramientas\ntools_label=Ferramientas\nfirst_page.title=Ir ta la primer pachina\nfirst_page.label=Ir ta la primer pachina\nfirst_page_label=Ir ta la primer pachina\nlast_page.title=Ir ta la zaguer pachina\nlast_page.label=Ir ta la zaguera pachina\nlast_page_label=Ir ta la zaguer pachina\npage_rotate_cw.title=Chirar enta la dreita\npage_rotate_cw.label=Chirar enta la dreita\npage_rotate_cw_label=Chira enta la dreita\npage_rotate_ccw.title=Chirar enta la zurda\npage_rotate_ccw.label=Chirar en sentiu antihorario\npage_rotate_ccw_label=Chirar enta la zurda\n\nhand_tool_enable.title=Activar a ferramienta man\nhand_tool_enable_label=Activar a ferramenta man\nhand_tool_disable.title=Desactivar a ferramienta man\nhand_tool_disable_label=Desactivar a ferramienta man\n\n# Document properties dialog box\ndocument_properties.title=Propiedatz d'o documento...\ndocument_properties_label=Propiedatz d'o documento...\ndocument_properties_file_name=Nombre de fichero:\ndocument_properties_file_size=Grandaria d'o fichero:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Titol:\ndocument_properties_author=Autor:\ndocument_properties_subject=Afer:\ndocument_properties_keywords=Parolas clau:\ndocument_properties_creation_date=Calendata de creyación:\ndocument_properties_modification_date=Calendata de modificación:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creyador:\ndocument_properties_producer=Creyador de PDF:\ndocument_properties_version=Versión de PDF:\ndocument_properties_page_count=Numero de pachinas:\ndocument_properties_close=Zarrar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Amostrar u amagar a barra lateral\ntoggle_sidebar_label=Amostrar a barra lateral\noutline.title=Amostrar o esquema d'o documento\noutline_label=Esquema d'o documento\nattachments.title=Amostrar os adchuntos\nattachments_label=Adchuntos\nthumbs.title=Amostrar as miniaturas\nthumbs_label=Miniaturas\nfindbar.title=Trobar en o documento\nfindbar_label=Trobar\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pachina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura d'a pachina {{page}}\n\n# Find panel button title and messages\nfind_label=Trobar:\nfind_previous.title=Trobar l'anterior coincidencia d'a frase\nfind_previous_label=Anterior\nfind_next.title=Trobar a siguient coincidencia d'a frase\nfind_next_label=Siguient\nfind_highlight=Resaltar-lo tot\nfind_match_case_label=Coincidencia de mayusclas/minusclas\nfind_reached_top=S'ha plegau a l'inicio d'o documento, se contina dende baixo\nfind_reached_bottom=S'ha plegau a la fin d'o documento, se contina dende alto\nfind_not_found=No s'ha trobau a frase\n\n# Error panel labels\nerror_more_info=Mas información\nerror_less_info=Menos información\nerror_close=Zarrar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensache: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fichero: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linia: {{line}}\nrendering_error=Ha ocurriu una error en renderizar a pachina.\n\n# Predefined zoom values\npage_scale_width=Amplaria d'a pachina\npage_scale_fit=Achuste d'a pachina\npage_scale_auto=Grandaria automatica\npage_scale_actual=Grandaria actual\n\n# Loading indicator messages\nloading_error_indicator=Error\nloading_error=S'ha produciu una error en cargar o PDF.\ninvalid_file_error=O PDF no ye valido u ye estorbau.\nmissing_file_error=No i ha fichero PDF.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotación {{type}}]\npassword_label=Introduzca a clau ta ubrir iste fichero PDF.\npassword_invalid=Clau invalida. Torna a intentar-lo.\npassword_ok=Acceptar\npassword_cancel=Cancelar\n\nprinting_not_supported=Pare cuenta: Iste navegador no maneya totalment as impresions.\nprinting_not_ready=Aviso: Encara no se ha cargau completament o PDF ta imprentar-lo.\nweb_fonts_disabled=As fuents web son desactivadas: no se puet incrustar fichers PDF.\ndocument_colors_disabled=Os documentos PDF no pueden fer servir as suyas propias colors: 'Permitir que as pachinas triguen as suyas propias colors' ye desactivau en o navegador.\n"
  },
  {
    "path": "web/viewer/locale/ar/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=الصفحة السابقة\nprevious_label=السابقة\nnext.title=الصفحة التالية\nnext_label=التالية\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=صفحة:\npage_of=من {{pageCount}}\n\nzoom_out.title=بعّد\nzoom_out_label=بعّد\nzoom_in.title=قرّب\nzoom_in_label=قرّب\nzoom.title=التقريب\npresentation_mode.title=انتقل لوضع العرض التقديمي\npresentation_mode_label=وضع العرض التقديمي\nopen_file.title=افتح ملفًا\nopen_file_label=افتح\nprint.title=اطبع\nprint_label=اطبع\ndownload.title=نزّل\ndownload_label=نزّل\nbookmark.title=المنظور الحالي (انسخ أو افتح في نافذة جديدة)\nbookmark_label=المنظور الحالي\n\n# Secondary toolbar and context menu\ntools.title=الأدوات\ntools_label=الأدوات\nfirst_page.title=اذهب إلى الصفحة الأولى\nfirst_page.label=اذهب إلى الصفحة الأولى\nfirst_page_label=اذهب إلى الصفحة الأولى\nlast_page.title=اذهب إلى الصفحة الأخيرة\nlast_page.label=اذهب إلى الصفحة الأخيرة\nlast_page_label=اذهب إلى الصفحة الأخيرة\npage_rotate_cw.title=أدر باتجاه عقارب الساعة\npage_rotate_cw.label=أدر باتجاه عقارب الساعة\npage_rotate_cw_label=أدر باتجاه عقارب الساعة\npage_rotate_ccw.title=أدر بعكس اتجاه عقارب الساعة\npage_rotate_ccw.label=أدر بعكس اتجاه عقارب الساعة\npage_rotate_ccw_label=أدر بعكس اتجاه عقارب الساعة\n\nhand_tool_enable.title=فعّل أداة اليد\nhand_tool_enable_label=فعّل أداة اليد\nhand_tool_disable.title=عطّل أداة اليد\nhand_tool_disable_label=عطّل أداة اليد\n\n# Document properties dialog box\ndocument_properties.title=خصائص المستند…\ndocument_properties_label=خصائص المستند…\ndocument_properties_file_name=اسم الملف:\ndocument_properties_file_size=حجم الملف:\ndocument_properties_kb={{size_kb}} ك.بايت ({{size_b}} بايت)\ndocument_properties_mb={{size_mb}} م.بايت ({{size_b}} بايت)\ndocument_properties_title=العنوان:\ndocument_properties_author=المؤلف:\ndocument_properties_subject=الموضوع:\ndocument_properties_keywords=الكلمات الأساسية:\ndocument_properties_creation_date=تاريخ الإنشاء:\ndocument_properties_modification_date=تاريخ التعديل:\ndocument_properties_date_string={{date}}، {{time}}\ndocument_properties_creator=المنشئ:\ndocument_properties_producer=منتج PDF:\ndocument_properties_version=إصدارة PDF:\ndocument_properties_page_count=عدد الصفحات:\ndocument_properties_close=أغلق\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=بدّل الشريط الجانبي\ntoggle_sidebar_label=بدّل الشريط الجانبي\noutline.title=اعرض مخطط المستند\noutline_label=مخطط المستند\nattachments.title=اعرض المرفقات\nattachments_label=المُرفقات\nthumbs.title=اعرض مُصغرات\nthumbs_label=مُصغّرات\nfindbar.title=ابحث في المستند\nfindbar_label=ابحث\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=صفحة {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=مصغّرة صفحة {{page}}\n\n# Find panel button title and messages\nfind_label=ابحث:\nfind_previous.title=ابحث عن التّواجد السّابق للعبارة\nfind_previous_label=السابق\nfind_next.title=ابحث عن التّواجد التّالي للعبارة\nfind_next_label=التالي\nfind_highlight=أبرِز الكل\nfind_match_case_label=طابق حالة الأحرف\nfind_reached_top=تابعت من الأسفل بعدما وصلت إلى بداية المستند\nfind_reached_bottom=تابعت من الأعلى بعدما وصلت إلى نهاية المستند\nfind_not_found=لا وجود للعبارة\n\n# Error panel labels\nerror_more_info=معلومات أكثر\nerror_less_info=معلومات أقل\nerror_close=أغلق\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=‏PDF.js ن{{version}} ‏(بناء: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=الرسالة: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=الرصّة: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=الملف: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=السطر: {{line}}\nrendering_error=حدث خطأ أثناء عرض الصفحة.\n\n# Predefined zoom values\npage_scale_width=عرض الصفحة\npage_scale_fit=ملائمة الصفحة\npage_scale_auto=تقريب تلقائي\npage_scale_actual=الحجم الحقيقي\n\n# Loading indicator messages\nloading_error_indicator=عطل\nloading_error=حدث عطل أثناء تحميل ملف PDF.\ninvalid_file_error=ملف PDF تالف أو غير صحيح\nmissing_file_error=ملف PDF غير موجود\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[تعليق {{type}}]\npassword_label=أدخل لكلمة السر لفتح هذا الملف.\npassword_invalid=كلمة سر خطأ. من فضلك أعد المحاولة.\npassword_ok=حسنا\npassword_cancel=ألغِ\n\nprinting_not_supported=تحذير: لا يدعم هذا المتصفح الطباعة بشكل كامل.\nprinting_not_ready=تحذير: ملف PDF لم يُحمّل كاملًا للطباعة.\nweb_fonts_disabled=خطوط الوب مُعطّلة: تعذّر استخدام خطوط PDF المُضمّنة.\ndocument_colors_disabled=ليس مسموحًا لملفات PDF باستخدام ألوانها الخاصة: خيار 'اسمح للصفحات باختيار ألوانها الخاصة' ليس مُفعّلًا في المتصفح.\n"
  },
  {
    "path": "web/viewer/locale/as/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=পূৰ্বৱৰ্তী পৃষ্ঠা\nprevious_label=পূৰ্বৱৰ্তী\nnext.title=পৰৱৰ্তী পৃষ্ঠা\nnext_label=পৰৱৰ্তী\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=পৃষ্ঠা:\npage_of=ৰ {{pageCount}}\n\nzoom_out.title=জুম আউট\nzoom_out_label=জুম আউট\nzoom_in.title=জুম ইন\nzoom_in_label=জুম ইন\nzoom.title=জুম কৰক\npresentation_mode.title=উপস্থাপন অৱস্থালে যাওক\npresentation_mode_label=উপস্থাপন অৱস্থা\nopen_file.title=ফাইল খোলক\nopen_file_label=খোলক\nprint.title=প্ৰিন্ট কৰক\nprint_label=প্ৰিন্ট কৰক\ndownload.title=ডাউনল'ড কৰক\ndownload_label=ডাউনল'ড কৰক\nbookmark.title=বৰ্তমান দৃশ্য (কপি কৰক অথবা নতুন উইন্ডোত খোলক)\nbookmark_label=বৰ্তমান দৃশ্য\n\n# Secondary toolbar and context menu\ntools.title=সঁজুলিসমূহ\ntools_label=সঁজুলিসমূহ\nfirst_page.title=প্ৰথম পৃষ্ঠাত যাওক\nfirst_page.label=প্ৰথম পৃষ্ঠাত যাওক\nfirst_page_label=প্ৰথম পৃষ্ঠাত যাওক\nlast_page.title=সৰ্বশেষ পৃষ্ঠাত যাওক\nlast_page.label=সৰ্বশেষ পৃষ্ঠাত যাওক\nlast_page_label=সৰ্বশেষ পৃষ্ঠাত যাওক\npage_rotate_cw.title=ঘড়ীৰ দিশত ঘুৰাওক\npage_rotate_cw.label=ঘড়ীৰ দিশত ঘুৰাওক\npage_rotate_cw_label=ঘড়ীৰ দিশত ঘুৰাওক\npage_rotate_ccw.title=ঘড়ীৰ ওলোটা দিশত ঘুৰাওক\npage_rotate_ccw.label=ঘড়ীৰ ওলোটা দিশত ঘুৰাওক\npage_rotate_ccw_label=ঘড়ীৰ ওলোটা দিশত ঘুৰাওক\n\nhand_tool_enable.title=হাঁত সঁজুলি সামৰ্থবান কৰক\nhand_tool_enable_label=হাঁত সঁজুলি সামৰ্থবান কৰক\nhand_tool_disable.title=হাঁত সঁজুলি অসামৰ্থবান কৰক\nhand_tool_disable_label=হাঁত সঁজুলি অসামৰ্থবান কৰক\n\n# Document properties dialog box\ndocument_properties.title=দস্তাবেজৰ বৈশিষ্ট্যসমূহ…\ndocument_properties_label=দস্তাবেজৰ বৈশিষ্ট্যসমূহ…\ndocument_properties_file_name=ফাইল নাম:\ndocument_properties_file_size=ফাইলৰ আকাৰ:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=শীৰ্ষক:\ndocument_properties_author=লেখক:\ndocument_properties_subject=বিষয়:\ndocument_properties_keywords=কিৱাৰ্ডসমূহ:\ndocument_properties_creation_date=সৃষ্টিৰ তাৰিখ:\ndocument_properties_modification_date=পৰিবৰ্তনৰ তাৰিখ:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=সৃষ্টিকৰ্তা:\ndocument_properties_producer=PDF উৎপাদক:\ndocument_properties_version=PDF সংস্কৰণ:\ndocument_properties_page_count=পৃষ্ঠাৰ গণনা:\ndocument_properties_close=বন্ধ কৰক\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=কাষবাৰ টগল কৰক\ntoggle_sidebar_label=কাষবাৰ টগল কৰক\noutline.title=দস্তাবেজ আউটলাইন দেখুৱাওক\noutline_label=দস্তাবেজ আউটলাইন\nattachments.title=এটাচমেন্টসমূহ দেখুৱাওক\nattachments_label=এটাচমেন্টসমূহ\nthumbs.title=থাম্বনেইলসমূহ দেখুৱাওক\nthumbs_label=থাম্বনেইলসমূহ\nfindbar.title=দস্তাবেজত সন্ধান কৰক\nfindbar_label=সন্ধান কৰক\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=পৃষ্ঠা {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=পৃষ্ঠাৰ থাম্বনেইল {{page}}\n\n# Find panel button title and messages\nfind_label=সন্ধান কৰক:\nfind_previous.title=বাক্যাংশৰ পূৰ্বৱৰ্তী উপস্থিতি সন্ধান কৰক\nfind_previous_label=পূৰ্বৱৰ্তী\nfind_next.title=বাক্যাংশৰ পৰৱৰ্তী উপস্থিতি সন্ধান কৰক\nfind_next_label=পৰৱৰ্তী\nfind_highlight=সকলো উজ্জ্বল কৰক\nfind_match_case_label=ফলা মিলাওক\nfind_reached_top=তলৰ পৰা আৰম্ভ কৰি, দস্তাবেজৰ ওপৰলৈ অহা হৈছে\nfind_reached_bottom=ওপৰৰ পৰা আৰম্ভ কৰি, দস্তাবেজৰ তললৈ অহা হৈছে\nfind_not_found=বাক্যাংশ পোৱা নগল\n\n# Error panel labels\nerror_more_info=অধিক তথ্য\nerror_less_info=কম তথ্য\nerror_close=বন্ধ কৰক\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=বাৰ্তা: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=স্টেক: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ফাইল: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=শাৰী: {{line}}\nrendering_error=এই পৃষ্ঠা ৰেণ্ডাৰ কৰোতে এটা ত্ৰুটি দেখা দিলে।\n\n# Predefined zoom values\npage_scale_width=পৃষ্ঠাৰ প্ৰস্থ\npage_scale_fit=পৃষ্ঠা খাপ\npage_scale_auto=স্বচালিত জুম\npage_scale_actual=প্ৰকৃত আকাৰ\n\n# Loading indicator messages\nloading_error_indicator=ত্ৰুটি\nloading_error=PDF ল'ড কৰোতে এটা ত্ৰুটি দেখা দিলে।\ninvalid_file_error=অবৈধ অথবা ক্ষতিগ্ৰস্থ PDF file।\nmissing_file_error=সন্ধানহিন PDF ফাইল।\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} টোকা]\npassword_label=এই PDF ফাইল খোলিবলৈ পাছৱাৰ্ড সুমুৱাওক।\npassword_invalid=অবৈধ পাছৱাৰ্ড। অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক।\npassword_ok=ঠিক আছে\npassword_cancel=বাতিল কৰক\n\nprinting_not_supported=সতৰ্কবাৰ্তা: প্ৰিন্টিং এই ব্ৰাউছাৰ দ্বাৰা সম্পূৰ্ণভাৱে সমৰ্থিত নহয়।\nprinting_not_ready=সতৰ্কবাৰ্তা: PDF প্ৰিন্টিংৰ বাবে সম্পূৰ্ণভাৱে ল'ডেড নহয়।\nweb_fonts_disabled=ৱেব ফন্টসমূহ অসামৰ্থবান কৰা আছে: অন্তৰ্ভুক্ত PDF ফন্টসমূহ ব্যৱহাৰ কৰিবলে অক্ষম।\ndocument_colors_disabled=PDF দস্তাবেজসমূহৰ সিহতৰ নিজস্ব ৰঙ ব্যৱহাৰ কৰাৰ অনুমতি নাই: ব্ৰাউছাৰত 'পৃষ্ঠাসমূহক সিহতৰ নিজস্ব ৰঙ নিৰ্বাচন কৰাৰ অনুমতি দিয়ক' অসামৰ্থবান কৰা আছে।\n"
  },
  {
    "path": "web/viewer/locale/ast/viewer.properties",
    "content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nprevious.title = Páxina anterior\nprevious_label = Anterior\nnext.title = Páxina siguiente\nnext_label = Siguiente\npage_label = Páxina:\npage_of = de {{pageCount}}\nzoom_out.title = Reducir\nzoom_out_label = Reducir\nzoom_in.title = Aumentar\nzoom_in_label = Aumentar\nzoom.title = Tamañu\nprint.title = Imprentar\nprint_label = Imprentar\nopen_file.title = Abrir ficheru\nopen_file_label = Abrir\ndownload.title = Descargar\ndownload_label = Descargar\nbookmark.title = Vista actual (copiar o abrir nuna nueva ventana)\nbookmark_label = Vista actual\noutline.title = Amosar l'esquema del documentu\noutline_label = Esquema del documentu\nthumbs.title = Amosar miniatures\nthumbs_label = Miniatures\nthumb_page_title = Páxina {{page}}\nthumb_page_canvas = Miniatura de la páxina {{page}}\nerror_more_info = Más información\nerror_less_info = Menos información\nerror_close = Zarrar\nerror_message = Mensaxe: {{message}}\nerror_stack = Pila: {{stack}}\nerror_file = Ficheru: {{file}}\nerror_line = Llinia: {{line}}\nrendering_error = Hebo un fallu al renderizar la páxina.\npage_scale_width = Anchor de la páxina\npage_scale_fit = Axuste de la páxina\npage_scale_auto = Tamañu automáticu\npage_scale_actual = Tamañu actual\nloading_error_indicator = Fallu\nloading_error = Hebo un fallu al cargar el PDF.\nprinting_not_supported = Avisu: Imprentar nun tien sofitu téunicu completu nesti navegador.\npresentation_mode_label = \npresentation_mode.title = \npage_rotate_cw.label = \npage_rotate_ccw.label = \nlast_page.label = Dir a la cabera páxina\ninvalid_file_error = Ficheru PDF inválidu o corruptu.\nfirst_page.label = Dir a la primer páxina\nfindbar_label = Guetar\nfindbar.title = Guetar nel documentu\nfind_previous_label = Anterior\nfind_previous.title = Alcontrar l'anterior apaición de la fras\nfind_not_found = Frase non atopada\nfind_next_label = Siguiente\nfind_next.title = Alcontrar la siguiente apaición d'esta fras\nfind_match_case_label = Coincidencia de mayús./minús.\nfind_label = Guetar:\nfind_highlight = Remarcar toos\nfind_reached_top=Algamóse'l principiu del documentu, siguir dende'l final\nfind_reached_bottom=Algamóse'l final del documentu, siguir dende'l principiu\nweb_fonts_disabled = Les fontes web tán desactivaes: ye imposible usar les fontes PDF embebíes.\ntoggle_sidebar_label = Camudar barra llateral\ntoggle_sidebar.title = Camudar barra llateral\nmissing_file_error = Nun hai ficheru PDF.\nerror_version_info = PDF.js v{{version}} (build: {{build}})\nprinting_not_ready = Avisu: Esti PDF nun se cargó completamente pa poder imprentase.\ntext_annotation_type.alt = [Anotación {{type}}]\ndocument_colors_disabled = Los documentos PDF nun tienen permitío usar los sos propios colores: 'Permitir a les páxines elexir los sos propios colores' ta desactivao nel navegador.\ntools_label = Ferramientes\ntools.title = Ferramientes\npassword_ok = Aceutar\npassword_label = Introduz la contraseña p'abrir esti ficheru PDF\npassword_invalid = Contraseña non válida. Vuelvi a intentalo.\npassword_cancel = Encaboxar\npage_rotate_cw_label = Xirar en sen horariu\npage_rotate_cw.title = Xirar en sen horariu\npage_rotate_ccw_label = Xirar en sen antihorariu\npage_rotate_ccw.title = Xirar en sen antihorariu\nlast_page_label = Dir a la postrer páxina\nlast_page.title = Dir a la postrer páxina\nhand_tool_enable_label = Activar ferramienta mano\nhand_tool_enable.title = Activar ferramienta mano\nhand_tool_disable_label = Desactivar ferramienta mano\nhand_tool_disable.title = Desactivar ferramienta mano\nfirst_page_label = Dir a la primer páxina\nfirst_page.title = Dir a la primer páxina\ndocument_properties_version = Versión PDF:\ndocument_properties_title = Títulu:\ndocument_properties_subject = Asuntu:\ndocument_properties_producer = Productor PDF:\ndocument_properties_page_count = Númberu de páxines:\ndocument_properties_modification_date = Data de modificación:\ndocument_properties_mb = {{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_label = Propiedaes del documentu…\ndocument_properties_keywords = Pallabres clave:\ndocument_properties_kb = {{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_file_size = Tamañu de ficheru:\ndocument_properties_file_name = Nome de ficheru:\ndocument_properties_date_string = {{date}}, {{time}}\ndocument_properties_creator = Creador:\ndocument_properties_creation_date = Data de creación:\ndocument_properties_close = Zarrar\ndocument_properties_author = Autor:\ndocument_properties.title = Propiedaes del documentu…\n"
  },
  {
    "path": "web/viewer/locale/az/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Əvvəlki səhifə\nprevious_label=Əvvəlkini tap\nnext.title=Növbəti səhifə\nnext_label=İrəli\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Səhifə:\npage_of=/ {{pageCount}}\n\nzoom_out.title=Uzaqlaş\nzoom_out_label=Uzaqlaş\nzoom_in.title=Yaxınlaş\nzoom_in_label=Yaxınlaş\nzoom.title=Yaxınlaşdırma\npresentation_mode.title=Təqdimat Rejiminə Keç\npresentation_mode_label=Təqdimat Rejimi\nopen_file.title=Fayl Aç\nopen_file_label=Aç\nprint.title=Yazdır\nprint_label=Yazdır\ndownload.title=Yüklə\ndownload_label=Yüklə\nbookmark.title=Hazırkı görünüş (köçür və ya yeni pəncərədə aç)\nbookmark_label=Hazırki görünüş\n\n# Secondary toolbar and context menu\ntools.title=Alətlər\ntools_label=Alətlər\nfirst_page.title=İlk Səhifəyə get\nfirst_page.label=İlk Səhifəyə get\nfirst_page_label=İlk Səhifəyə get\nlast_page.title=Son Səhifəyə get\nlast_page.label=Son Səhifəyə get\nlast_page_label=Son Səhifəyə get\npage_rotate_cw.title=Saat İstiqamətində Fırlat\npage_rotate_cw.label=Saat İstiqamətində Fırlat\npage_rotate_cw_label=Saat İstiqamətində Fırlat\npage_rotate_ccw.title=Saat İstiqamətinin Əksinə Fırlat\npage_rotate_ccw.label=Saat İstiqamətinin Əksinə Fırlat\npage_rotate_ccw_label=Saat İstiqamətinin Əksinə Fırlat\n\n\n# Document properties dialog box\ndocument_properties_title=Başlık:\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Yan Paneli Aç/Bağla\ntoggle_sidebar_label=Yan Paneli Aç/Bağla\noutline.title=Sənəd struktunu göstər\noutline_label=Sənəd strukturu\nthumbs.title=Kiçik şəkilləri göstər\nthumbs_label=Kiçik şəkillər\nfindbar.title=Sənəddə Tap\nfindbar_label=Axtar\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Səhifə{{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} səhifəsinin kiçik vəziyyəti\n\n# Find panel button title and messages\nfind_label=Tap:\nfind_previous.title=Bir öncəki uyğun gələn sözü tapır\nfind_previous_label=Geri\nfind_next.title=Bir sonrakı uyğun gələn sözü tapır\nfind_next_label=İrəli\nfind_highlight=İşarələ\nfind_match_case_label=Böyük/kiçik hərfə həssaslıq\nfind_reached_top=Sənədin yuxarısına çatdı, aşağıdan davam edir\nfind_reached_bottom=Sənədin sonuna çatdı, yuxarıdan davam edir\nfind_not_found=Uyğunlaşma tapılmadı\n\n# Error panel labels\nerror_more_info=Daha çox məlumati\nerror_less_info=Daha az məlumat\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (yığma: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=İsmarıc: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stek: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fayl: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Sətir: {{line}}\nrendering_error=Səhifə göstərilərkən səhv yarandı.\n\n# Predefined zoom values\npage_scale_width=Səhifə genişliyi\npage_scale_fit=Səhifəni sığdır\npage_scale_auto=Avtomatik yaxınlaşdır\npage_scale_actual=Hazırki Həcm\n\n# Loading indicator messages\nloading_error_indicator=Səhv\nloading_error=PDF yüklenərkən bir səhv yarandı.\ninvalid_file_error=Səhv və ya zədələnmiş olmuş PDF fayl.\nmissing_file_error=PDF fayl yoxdur.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotasiyası]\npassword_label=Bu PDF faylı açmaq üçün şifrəni daxil edin.\npassword_invalid=Şifrə yanlışdır. Bir daha sınayın.\npassword_ok=OK\npassword_cancel=Ləğv et\n\nprinting_not_supported=Xəbərdarlıq: Çap bu brauzer tərəfindən tam olaraq dəstəklənmir.\nprinting_not_ready=Xəbərdarlıq: PDF çap üçün tam yüklənməyib.\nweb_fonts_disabled=Veb Şriftlər söndürülüb: yerləşdirilmiş PDF şriftlərini istifadə etmək mümkün deyil.\ndocument_colors_disabled=PDF sənədlərə öz rənglərini işlətməyə icazə verilmir: 'Səhifələrə öz rənglərini istifadə etməyə icazə vermə' səyyahda söndürülüb.\n"
  },
  {
    "path": "web/viewer/locale/be/viewer.properties",
    "content": "previous.title = Папярэдняя старонка\nprevious_label = Папярэдняя\nnext.title = Наступная старонка\nnext_label = Наступная\npage_label = Старонка:\npage_of = з {{pageCount}}\nzoom_out.title = Паменшыць\nzoom_out_label = Паменшыць\nzoom_in.title = Павялічыць\nzoom_in_label = Павялічыць\nzoom.title = Павялічэнне тэксту\npresentation_mode.title = Пераключыцца ў рэжым паказу\npresentation_mode_label = Рэжым паказу\nopen_file.title = Адчыніць файл\nopen_file_label = Адчыніць\nprint.title = Друкаваць\nprint_label = Друкаваць\ndownload.title = Загрузка\ndownload_label = Загрузка\nbookmark.title = Цяперашняя праява (скапіяваць або адчыніць у новым акне)\nbookmark_label = Цяперашняя праява\ntools.title = Прылады\ntools_label = Прылады\nfirst_page.title = Перайсці на першую старонку\nfirst_page.label = Перайсці на першую старонку\nfirst_page_label = Перайсці на першую старонку\nlast_page.title = Перайсці на апошнюю старонку\nlast_page.label = Перайсці на апошнюю старонку\nlast_page_label = Перайсці на апошнюю старонку\npage_rotate_cw.title = Павярнуць па гадзіннікавай стрэлцы\npage_rotate_cw.label = Павярнуць па гадзіннікавай стрэлцы\npage_rotate_cw_label = Павярнуць па гадзіннікавай стрэлцы\npage_rotate_ccw.title = Павярнуць супраць гадзіннікавай стрэлкі\npage_rotate_ccw.label = Павярнуць супраць гадзіннікавай стрэлкі\npage_rotate_ccw_label = Павярнуць супраць гадзіннікавай стрэлкі\nhand_tool_enable.title = Дазволіць ручную прыладу\nhand_tool_enable_label = Дазволіць ручную прыладу\nhand_tool_disable.title = Забараніць ручную прыладу\nhand_tool_disable_label = Забараніць ручную прыладу\ndocument_properties.title = Уласцівасці дакумента…\ndocument_properties_label = Уласцівасці дакумента…\ndocument_properties_file_name = Назва файла:\ndocument_properties_file_size = Памер файла:\ndocument_properties_kb = {{size_kb}} КБ ({{size_b}} байт)\ndocument_properties_mb = {{size_mb}} МБ ({{size_b}} байт)\ndocument_properties_title = Загаловак:\ndocument_properties_author = Аўтар:\ndocument_properties_subject = Тэма:\ndocument_properties_keywords = Ключавыя словы:\ndocument_properties_creation_date = Дата стварэння:\ndocument_properties_modification_date = Дата змянення:\ndocument_properties_date_string = {{date}}, {{time}}\ndocument_properties_creator = Стваральнік:\ndocument_properties_producer = Вырабнік PDF:\ndocument_properties_version = Версія PDF:\ndocument_properties_page_count = Колькасць старонак:\ndocument_properties_close = Зачыніць\ntoggle_sidebar.title = Пераключэнне палічкі\ntoggle_sidebar_label = Пераключыць палічку\noutline.title = Паказ будовы дакумента\noutline_label = Будова дакумента\nattachments.title = Паказаць далучэнні\nattachments_label = Далучэнні\nthumbs.title = Паказ накідаў\nthumbs_label = Накіды\nfindbar.title = Пошук у дакуменце\nfindbar_label = Знайсці\nthumb_page_title = Старонка {{page}}\nthumb_page_canvas = Накід старонкі {{page}}\nfind_label = Пошук:\nfind_previous.title = Знайсці папярэдні выпадак выразу\nfind_previous_label = Папярэдні\nfind_next.title = Знайсці наступны выпадак выразу\nfind_next_label = Наступны\nfind_highlight = Падфарбаваць усе\nfind_match_case_label = Адрозніваць вялікія/малыя літары\nfind_reached_top = Дасягнуты пачатак дакумента, працяг з канца\nfind_reached_bottom = Дасягнуты канец дакумента, працяг з пачатку\nfind_not_found = Выраз не знойдзены\nerror_more_info = Падрабязней\nerror_less_info = Сцісла\nerror_close = Закрыць\nerror_version_info = PDF.js в{{version}} (пабудова: {{build}})\nerror_message = Паведамленне: {{message}}\nerror_stack = Стос: {{stack}}\nerror_file = Файл: {{file}}\nerror_line = Радок: {{line}}\nrendering_error = Здарылася памылка падчас адлюстравання старонкі.\npage_scale_width = Шырыня старонкі\npage_scale_fit = Уцісненне старонкі\npage_scale_auto = Самастойнае павялічэнне\npage_scale_actual = Сапраўдны памер\nloading_error_indicator = Памылка\nloading_error = Здарылася памылка падчас загрузкі PDF.\ninvalid_file_error = Няспраўны або пашкоджаны файл PDF.\nmissing_file_error = Адсутны файл PDF.\ntext_annotation_type.alt = [{{type}} Annotation]\npassword_label = Увядзіце пароль, каб адчыніць гэты файл PDF.\npassword_invalid = Крывы пароль. Паспрабуйце зноў.\npassword_ok = Добра\npassword_cancel = Скасаваць\nprinting_not_supported = Папярэджанне: друк не падтрымлівацца цалкам гэтым азіральнікам.\nprinting_not_ready = Увага: PDF не сцягнуты цалкам для друкавання.\nweb_fonts_disabled = Шрыфты Сеціва забаронены: немгчыма ўжываць укладзеныя шрыфты PDF.\ndocument_colors_disabled = Дакументам PDF не дазволена карыстацца сваімі ўласнымі колерамі: 'Дазволіць старонкам выбіраць свае ўласныя колеры' абяздзейнена ў азіральніку.\n"
  },
  {
    "path": "web/viewer/locale/bg/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Предишна страница\nprevious_label=Предишна\nnext.title=Следваща страница\nnext_label=Следваща\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Страница:\npage_of=от {{pageCount}}\n\nzoom_out.title=Отдалечаване\nzoom_out_label=Отдалечаване\nzoom_in.title=Приближаване\nzoom_in_label=Приближаване\nzoom.title=Мащабиране\npresentation_mode.title=Превключване към режим на представяне\npresentation_mode_label=Режим на представяне\nopen_file.title=Отваряне на файл\nopen_file_label=Отваряне\nprint.title=Отпечатване\nprint_label=Отпечатване\ndownload.title=Изтегляне\ndownload_label=Изтегляне\nbookmark.title=Текущ изглед (копиране или отваряне в нов прозорец)\nbookmark_label=Текущ изглед\n\n# Secondary toolbar and context menu\ntools.title=Инструменти\ntools_label=Инструменти\nfirst_page.title=Към първата страница\nfirst_page.label=Към първата страница\nfirst_page_label=Към първата страница\nlast_page.title=Към последната страница\nlast_page.label=Към последната страница\nlast_page_label=Към последната страница\npage_rotate_cw.title=Превъртане по часовниковата стрелка\npage_rotate_cw.label=Превъртане по часовниковата стрелка\npage_rotate_cw_label=Превъртане по часовниковата стрелка\npage_rotate_ccw.title=Превъртане обратно на часовниковата стрелка\npage_rotate_ccw.label=Превъртане обратно на часовниковата стрелка\npage_rotate_ccw_label=Превъртане обратно на часовниковата стрелка\n\nhand_tool_enable.title=Активиране на инструмента ръка\nhand_tool_enable_label=Активиране на инструмента ръка\nhand_tool_disable.title=Деактивиране на инструмента ръка\nhand_tool_disable_label=Деактивиране на инструмента ръка\n\n# Document properties dialog box\ndocument_properties.title=Свойства на документа…\ndocument_properties_label=Свойства на документа…\ndocument_properties_file_name=Име на файл:\ndocument_properties_file_size=Големина на файл:\ndocument_properties_kb={{size_kb}} KiB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} MiB ({{size_b}} bytes)\ndocument_properties_title=Заглавие:\ndocument_properties_author=Автор:\ndocument_properties_subject=Тема:\ndocument_properties_keywords=Ключови думи:\ndocument_properties_creation_date=Дата на създаване:\ndocument_properties_modification_date=Дата на промяна:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Създател:\ndocument_properties_producer=PDF произведен от:\ndocument_properties_version=PDF версия:\ndocument_properties_page_count=Брой страници:\ndocument_properties_close=Затваряне\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Превключване на страничната лента\ntoggle_sidebar_label=Превключване на страничната лента\noutline.title=Показване на очертанията на документа\noutline_label=Очертание на документа\nthumbs.title=Показване на миниатюрите\nthumbs_label=Миниатюри\nfindbar.title=Намиране в документа\nfindbar_label=Търсене\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Страница {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Миниатюра на страница {{page}}\n\n# Find panel button title and messages\nfind_label=Търсене:\nfind_previous.title=Намиране на предното споменаване на тази фраза\nfind_previous_label=Предишна\nfind_next.title=Намиране на следващото споменаване на тази фраза\nfind_next_label=Следваща\nfind_highlight=Маркирай всички\nfind_match_case_label=Точно съвпадения\nfind_reached_top=Достигнато е началото на документа. Търсенето ще продължи до края му.\nfind_reached_bottom=Достигнат е края на документа. Търсенето ще продължи от началото му.\nfind_not_found=Фразата не е намерена\n\n# Error panel labels\nerror_more_info=Повече информация\nerror_less_info=По-малко информация\nerror_close=Затваряне\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js версия {{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Съобщение: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Стек: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Файл: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Ред: {{line}}\nrendering_error=Грешка при изчертаване на страницата.\n\n# Predefined zoom values\npage_scale_width=Ширина на страницата\npage_scale_fit=Вместване в страницата\npage_scale_auto=Автоматично мащабиране\npage_scale_actual=Действителен размер\n\n# Loading indicator messages\nloading_error_indicator=Грешка\nloading_error=Получи се грешка при зареждане на PDF-а.\ninvalid_file_error=Невалиден или повреден PDF файл\nmissing_file_error=Липсващ PDF файл.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Анотация {{type}}]\npassword_label=Въведете парола за отваряне на този PDF файл.\npassword_invalid=Невалидна парола. Моля, опитайте отново.\npassword_ok=Добре\npassword_cancel=Отказ\n\nprinting_not_supported=Внимание: Този браузър няма пълна поддръжка на отпечатване.\nprinting_not_ready=Внимание: Този PDF файл не е напълно зареден за печат.\nweb_fonts_disabled=Уеб-шрифтовете са забранени: разрешаване на използването на вградените PDF шрифтове.\ndocument_colors_disabled=На PDF-документите не е разрешено да използват собствени цветове: „Разрешаване на страниците да избират собствени цветове“ е деактивирано в браузъра.\n"
  },
  {
    "path": "web/viewer/locale/bn-BD/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=পূর্ববর্তী পৃষ্ঠা\nprevious_label=পূর্ববর্তী\nnext.title=পরবর্তী পৃষ্ঠা\nnext_label=পরবর্তী\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=পৃষ্ঠা:\npage_of={{pageCount}} এর\n\nzoom_out.title=ছোট আকারে প্রদর্শন\nzoom_out_label=ছোট আকারে প্রদর্শন\nzoom_in.title=বড় আকারে প্রদর্শন\nzoom_in_label=বড় আকারে প্রদর্শন\nzoom.title=বড় আকারে প্রদর্শন\npresentation_mode.title=উপস্থাপনা মোডে স্যুইচ করুন\npresentation_mode_label=উপস্থাপনা মোড\nopen_file.title=ফাইল খুলুন\nopen_file_label=খুলুন\nprint.title=মুদ্রণ\nprint_label=মুদ্রণ\ndownload.title=ডাউনলোড\ndownload_label=ডাউনলোড\nbookmark.title=বর্তমান অবস্থা (অনুলিপি অথবা নতুন উইন্ডো তে খুলুন)\nbookmark_label=বর্তমান অবস্থা\n\n# Secondary toolbar and context menu\ntools.title=টুল\ntools_label=টুল\nfirst_page.title=প্রথম পাতায় যাও\nfirst_page.label=প্রথম পাতায় যাও\nfirst_page_label=প্রথম পাতায় যাও\nlast_page.title=শেষ পাতায় যাও\nlast_page.label=শেষ পাতায় যাও\nlast_page_label=শেষ পাতায় যাও\npage_rotate_cw.title=ঘড়ির কাঁটার দিকে ঘোরাও\npage_rotate_cw.label=ঘড়ির কাঁটার দিকে ঘোরাও\npage_rotate_cw_label=ঘড়ির কাঁটার দিকে ঘোরাও\npage_rotate_ccw.title=ঘড়ির কাঁটার বিপরীতে ঘোরাও\npage_rotate_ccw.label=ঘড়ির কাঁটার বিপরীতে ঘোরাও\npage_rotate_ccw_label=ঘড়ির কাঁটার বিপরীতে ঘোরাও\n\n\n# Document properties dialog box\ndocument_properties_title=শিরোনাম:\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=সাইডবার টগল করুন\ntoggle_sidebar_label=সাইডবার টগল করুন\noutline.title=নথির রূপরেখা প্রদর্শন করুন\noutline_label=নথির রূপরেখা\nthumbs.title=থাম্বনেইল সমূহ  প্রদর্শন করুন\nthumbs_label=থাম্বনেইল সমূহ\nfindbar.title=নথির মধ্যে খুঁজুন\nfindbar_label=অনুসন্ধান\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=পৃষ্ঠা {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} পৃষ্ঠার থাম্বনেইল\n\n# Find panel button title and messages\nfind_label=অনুসন্ধান:\nfind_previous.title=বাক্যাংশের পূর্ববর্তী উপস্থিতি অনুসন্ধান\nfind_previous_label=পূর্ববর্তী\nfind_next.title=বাক্যাংশের পরবর্তী উপস্থিতি অনুসন্ধান\nfind_next_label=পরবর্তী\nfind_highlight=সব হাইলাইট করা হবে\nfind_match_case_label=অক্ষরের ছাঁদ মেলানো\nfind_reached_top=পৃষ্ঠার শুরুতে পৌছে গেছে, নীচ থেকে আরম্ভ করা হয়েছে\nfind_reached_bottom=পৃষ্ঠার শেষে পৌছে গেছে, উপর থেকে আরম্ভ করা হয়েছে\nfind_not_found=বাক্যাংশ পাওয়া যায়নি\n\n# Error panel labels\nerror_more_info=আরও তথ্য\nerror_less_info=কম তথ্য\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=বার্তা: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=নথি: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=লাইন: {{line}}\nrendering_error=পৃষ্ঠা উপস্থাপনার সময় ত্রুটি দেখা দিয়েছে।\n\n# Predefined zoom values\npage_scale_width=পৃষ্ঠার প্রস্থ\npage_scale_fit=পৃষ্ঠা ফিট করুন\npage_scale_auto=স্বয়ংক্রিয় জুম\npage_scale_actual=প্রকৃত আকার\n\n# Loading indicator messages\nloading_error_indicator=ত্রুটি\nloading_error=পিডিএফ লোড করার সময় ত্রুটি দেখা দিয়েছে।\ninvalid_file_error=অকার্যকর অথবা ক্ষতিগ্রস্ত পিডিএফ ফাইল।\nmissing_file_error=পিডিএফ ফাইল পাওয়া যাচ্ছে না।\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} টীকা]\npassword_label=পিডিএফ ফাইলটি ওপেন করতে পাসওয়ার্ড দিন।\npassword_invalid=ভুল পাসওয়ার্ড। অনুগ্রহ করে আবার চেষ্টা করুন।\npassword_ok=ঠিক আছে\npassword_cancel=বাতিল\n\nprinting_not_supported=সতর্কতা: এই ব্রাউজারে মুদ্রণ সম্পূর্ণভাবে সমর্থিত নয়।\nprinting_not_ready=সতর্কীকরণ: পিডিএফটি মুদ্রণের জন্য সম্পূর্ণ লোড হয়নি।\nweb_fonts_disabled=ওয়েব ফন্ট নিষ্ক্রিয়: সংযুক্ত পিডিএফ ফন্ট ব্যবহার করা যাচ্ছে না।\ndocument_colors_disabled=পিডিএফ ডকুমেন্টকে তাদের নিজস্ব রঙ ব্যবহারে অনুমতি নেই: 'পাতা তাদের নিজেস্ব রঙ নির্বাচন করতে অনুমতি দিন' এই ব্রাউজারে নিষ্ক্রিয় রয়েছে।\n"
  },
  {
    "path": "web/viewer/locale/bn-IN/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=পূর্ববর্তী পৃষ্ঠা\nprevious_label=পূর্ববর্তী\nnext.title=পরবর্তী পৃষ্ঠা\nnext_label=পরবর্তী\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=পৃষ্ঠা:\npage_of=সর্বমোট {{pageCount}}\n\nzoom_out.title=ছোট মাপে প্রদর্শন\nzoom_out_label=ছোট মাপে প্রদর্শন\nzoom_in.title=বড় মাপে প্রদর্শন\nzoom_in_label=বড় মাপে প্রদর্শন\nzoom.title=প্রদর্শনের মাপ\npresentation_mode.title=উপস্থাপনা মোড স্যুইচ করুন\npresentation_mode_label=উপস্থাপনা মোড\nopen_file.title=ফাইল খুলুন\nopen_file_label=খুলুন\nprint.title=প্রিন্ট করুন\nprint_label=প্রিন্ট করুন\ndownload.title=ডাউনলোড করুন\ndownload_label=ডাউনলোড করুন\nbookmark.title=বর্তমান প্রদর্শন (কপি করুন অথবা নতুন উইন্ডোতে খুলুন)\nbookmark_label=বর্তমান প্রদর্শন\n\n# Secondary toolbar and context menu\ntools.title=সরঞ্জাম\ntools_label=সরঞ্জাম\nfirst_page.title=প্রথম পৃষ্ঠায় চলুন\nfirst_page.label=প্রথম পৃষ্ঠায় চলুন\nfirst_page_label=প্রথম পৃষ্ঠায় চলুন\nlast_page.title=সর্বশেষ পৃষ্ঠায় চলুন\nlast_page.label=সর্বশেষ পৃষ্ঠায় চলুন\nlast_page_label=সর্বশেষ পৃষ্ঠায় চলুন\npage_rotate_cw.title=ডানদিকে ঘোরানো হবে\npage_rotate_cw.label=ডানদিকে ঘোরানো হবে\npage_rotate_cw_label=ডানদিকে ঘোরানো হবে\npage_rotate_ccw.title=বাঁদিকে ঘোরানো হবে\npage_rotate_ccw.label=বাঁদিকে ঘোরানো হবে\npage_rotate_ccw_label=বাঁদিকে ঘোরানো হবে\n\nhand_tool_enable.title=হ্যান্ড টুল সক্রিয় করুন\nhand_tool_enable_label=হ্যান্ড টুল সক্রিয় করুন\nhand_tool_disable.title=হ্যান্ড টুল নিস্ক্রিয় করুন\nhand_tool_disable_label=হ্যান্ড টুল নিস্ক্রিয় করুন\n\n# Document properties dialog box\ndocument_properties.title=নথির বৈশিষ্ট্য…\ndocument_properties_label=নথির বৈশিষ্ট্য…\ndocument_properties_file_name=ফাইলের নাম:\ndocument_properties_file_size=ফাইলের মাপ:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} মেগাবাইট ({{size_b}} bytes)\ndocument_properties_title=শিরোনাম:\ndocument_properties_author=লেখক:\ndocument_properties_subject=বিষয়:\ndocument_properties_keywords=নির্দেশক শব্দ:\ndocument_properties_creation_date=নির্মাণের তারিখ:\ndocument_properties_modification_date=পরিবর্তনের তারিখ:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=নির্মাতা:\ndocument_properties_producer=PDF নির্মাতা:\ndocument_properties_version=PDF সংস্করণ:\ndocument_properties_page_count=মোট পৃষ্ঠা:\ndocument_properties_close=বন্ধ করুন\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=সাইডবার টগল করুন\ntoggle_sidebar_label=সাইডবার টগল করুন\noutline.title=নথির রূপরেখা প্রদর্শন\noutline_label=নথির রূপরেখা প্রদর্শন\nattachments.title=সংযুক্তিসমূহ দেখান\nattachments_label=সংযুক্ত বস্তু\nthumbs.title=থাম্ব-নেইল প্রদর্শন\nthumbs_label=থাম্ব-নেইল প্রদর্শন\nfindbar.title=নথিতে খুঁজুন\nfindbar_label=অনুসন্ধান করুন\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=পৃষ্ঠা {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=পৃষ্ঠা {{page}}-র থাম্ব-নেইল\n\n# Find panel button title and messages\nfind_label=অনুসন্ধান:\nfind_previous.title=চিহ্নিত পংক্তির পূর্ববর্তী উপস্থিতি অনুসন্ধান করুন\nfind_previous_label=পূর্ববর্তী\nfind_next.title=চিহ্নিত পংক্তির পরবর্তী উপস্থিতি অনুসন্ধান করুন\nfind_next_label=পরবর্তী\nfind_highlight=সমগ্র উজ্জ্বল করুন\nfind_match_case_label=হরফের ছাঁদ মেলানো হবে\nfind_reached_top=পৃষ্ঠার প্রারম্ভে পৌছে গেছে, নীচের অংশ থেকে আরম্ভ করা হবে\nfind_reached_bottom=পৃষ্ঠার অন্তিম প্রান্তে পৌছে গেছে, প্রথম অংশ থেকে আরম্ভ করা হবে\nfind_not_found=পংক্তি পাওয়া যায়নি\n\n# Error panel labels\nerror_more_info=অতিরিক্ত তথ্য\nerror_less_info=কম তথ্য\nerror_close=বন্ধ করুন\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Message: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Line: {{line}}\nrendering_error=পৃষ্ঠা প্রদর্শনকালে একটি সমস্যা দেখা দিয়েছে।\n\n# Predefined zoom values\npage_scale_width=পৃষ্ঠার প্রস্থ অনুযায়ী\npage_scale_fit=পৃষ্ঠার মাপ অনুযায়ী\npage_scale_auto=স্বয়ংক্রিয় মাপ নির্ধারণ\npage_scale_actual=প্রকৃত মাপ\n\n# Loading indicator messages\nloading_error_indicator=ত্রুটি\nloading_error=PDF লোড করার সময় সমস্যা দেখা দিয়েছে।\ninvalid_file_error=অবৈধ বা ক্ষতিগ্রস্ত পিডিএফ ফাইল।\nmissing_file_error=অনুপস্থিত PDF ফাইল\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=এই PDF ফাইল খোলার জন্য পাসওয়ার্ড দিন।\npassword_invalid=পাসওয়ার্ড সঠিক নয়। অনুগ্রহ করে পুনরায় প্রচেষ্টা করুন।\npassword_ok=OK\npassword_cancel=বাতিল করুন\n\nprinting_not_supported=সতর্কবার্তা: এই ব্রাউজার দ্বারা প্রিন্ট ব্যবস্থা সম্পূর্ণরূপে সমর্থিত নয়।\nprinting_not_ready=সতর্কবাণী: পিডিএফ সম্পূর্ণরূপে মুদ্রণের জন্য লোড করা হয় না.\nweb_fonts_disabled=ওয়েব ফন্ট নিষ্ক্রিয় করা হয়েছে: এমবেডেড পিডিএফ ফন্ট ব্যবহার করতে অক্ষম.\ndocument_colors_disabled=পিডিএফ নথি তাদের নিজস্ব রং ব্যবহার করার জন্য অনুমতিপ্রাপ্ত নয়: ব্রাউজারে নিষ্ক্রিয় করা হয়েছে য়েন  'পেজ তাদের নিজস্ব রং নির্বাচন করার অনুমতি প্রদান করা য়ায়।'\n"
  },
  {
    "path": "web/viewer/locale/br/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pajenn a-raok\nprevious_label=A-raok\nnext.title=Pajenn war-lerc'h\nnext_label=War-lerc'h\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Pajenn :\npage_of=eus {{pageCount}}\n\nzoom_out.title=Zoum bihanaat\nzoom_out_label=Zoum bihanaat\nzoom_in.title=Zoum brasaat\nzoom_in_label=Zoum brasaat\nzoom.title=Zoum\npresentation_mode.title=Trec'haoliñ etrezek ar mod kinnigadenn\npresentation_mode_label=Mod kinnigadenn\nopen_file.title=Digeriñ ur restr\nopen_file_label=Digeriñ ur restr\nprint.title=Moullañ\nprint_label=Moullañ\ndownload.title=Pellgargañ\ndownload_label=Pellgargañ\nbookmark.title=Gwel bremanel (eilañ pe zigeriñ e-barzh ur prenestr nevez)\nbookmark_label=Gwel bremanel\n\n# Secondary toolbar and context menu\ntools.title=Ostilhoù\ntools_label=Ostilhoù\nfirst_page.title=Mont d'ar bajenn gentañ\nfirst_page.label=Mont d'ar bajenn gentañ\nfirst_page_label=Mont d'ar bajenn gentañ\nlast_page.title=Mont d'ar bajenn diwezhañ\nlast_page.label=Mont d'ar bajenn diwezhañ\nlast_page_label=Mont d'ar bajenn diwezhañ\npage_rotate_cw.title=C'hwelañ gant roud ar bizied\npage_rotate_cw.label=C'hwelañ gant roud ar bizied\npage_rotate_cw_label=C'hwelañ gant roud ar bizied\npage_rotate_ccw.title=C'hwelañ gant roud gin ar bizied\npage_rotate_ccw.label=C'hwelañ gant roud gin ar bizied\npage_rotate_ccw_label=C'hwelañ gant roud gin ar bizied\n\nhand_tool_enable.title=Gweredekaat an ostilh \"dorn\"\nhand_tool_enable_label=Gweredekaat an ostilh \"dorn\"\nhand_tool_disable.title=Diweredekaat an ostilh \"dorn\"\nhand_tool_disable_label=Diweredekaat an ostilh \"dorn\"\n\n# Document properties dialog box\ndocument_properties.title=Perzhioù an teul…\ndocument_properties_label=Perzhioù an teul…\ndocument_properties_file_name=Anv restr :\ndocument_properties_file_size=Ment ar restr :\ndocument_properties_kb={{size_kb}} Ke ({{size_b}} eizhbit)\ndocument_properties_mb={{size_mb}} Me ({{size_b}} eizhbit)\ndocument_properties_title=Titl :\ndocument_properties_author=Aozer :\ndocument_properties_subject=Danvez :\ndocument_properties_keywords=Gerioù-alc'hwez :\ndocument_properties_creation_date=Deiziad krouiñ :\ndocument_properties_modification_date=Deiziad kemmañ :\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Krouer :\ndocument_properties_producer=Kenderc'her PDF :\ndocument_properties_version=Handelv PDF :\ndocument_properties_page_count=Niver a bajennoù :\ndocument_properties_close=Serriñ\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Diskouez/kuzhat ar varrenn gostez\ntoggle_sidebar_label=Diskouez/kuzhat ar varrenn gostez\noutline.title=Diskouez ar sinedoù\noutline_label=Sinedoù an teuliad\nattachments.title=Diskouez ar c'henstagadurioù\nattachments_label=Kenstagadurioù\nthumbs.title=Diskouez ar melvennoù\nthumbs_label=Melvennoù\nfindbar.title=Klask e-barzh an teuliad\nfindbar_label=Klask\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pajenn {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Melvenn ar bajenn {{page}}\n\n# Find panel button title and messages\nfind_label=Kavout :\nfind_previous.title=Kavout an tamm frazenn kent o klotañ ganti\nfind_previous_label=Kent\nfind_next.title=Kavout an tamm frazenn war-lerc'h o klotañ ganti\nfind_next_label=War-lerc'h\nfind_highlight=Usskediñ pep tra\nfind_match_case_label=Teurel evezh ouzh ar pennlizherennoù\nfind_reached_top=Tizhet eo bet derou ar bajenn, kenderc'hel diouzh an diaz\nfind_reached_bottom=Tizhet eo bet dibenn ar bajenn, kenderc'hel diouzh ar c'hrec'h\nfind_not_found=N'haller ket kavout ar frazenn\n\n# Error panel labels\nerror_more_info=Muioc'h a ditouroù\nerror_less_info=Nebeutoc'h a ditouroù\nerror_close=Serriñ\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js handelv {{version}} (kempunadur : {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Kemennadenn : {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Torn : {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Restr : {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linenn : {{line}}\nrendering_error=Degouezhet ez eus bet ur fazi e-pad skrammañ ar bajennad.\n\n# Predefined zoom values\npage_scale_width=Led ar bajenn\npage_scale_fit=Pajenn a-bezh\npage_scale_auto=Zoum emgefreek\npage_scale_actual=Ment wir\n\n# Loading indicator messages\nloading_error_indicator=Fazi\nloading_error=Degouezhet ez eus bet ur fazi e-pad kargañ ar PDF.\ninvalid_file_error=Restr PDF didalvoudek pe kontronet.\nmissing_file_error=Restr PDF o vankout.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Notennañ]\npassword_label=Enankit ar ger-tremen evit digeriñ ar restr PDF-mañ.\npassword_invalid=Ger-tremen didalvoudek. Klaskit en-dro mar plij.\npassword_ok=Mat eo\npassword_cancel=Nullañ\n\nprinting_not_supported=Kemenn : N'eo ket skoret penn-da-benn ar moullañ gant ar merdeer-mañ.\nprinting_not_ready=Kemenn : N'hall ket bezañ moullet ar restr PDF rak n'eo ket karget penn-da-benn.\nweb_fonts_disabled=Diweredekaet eo an nodrezhoù web : n'haller ket arverañ an nodrezhoù PDF enframmet.\ndocument_colors_disabled=N'eo ket aotreet an teuliadoù PDF da arverañ o livioù dezho : diweredekaet eo 'Aotren ar pajennoù da zibab o livioù dezho' e-barzh ar merdeer.\n"
  },
  {
    "path": "web/viewer/locale/bs/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Prethodna strana\nprevious_label=Prethodna\nnext.title=Sljedeća strna\nnext_label=Sljedeća\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Strana:\npage_of=od {{pageCount}}\n\nzoom_out.title=Umanji\nzoom_out_label=Umanji\nzoom_in.title=Uvećaj\nzoom_in_label=Uvećaj\nzoom.title=Uvećanje\nprint.title=Štampaj\nprint_label=Štampaj\npresentation_mode.title=Prebaci se u prezentacijski režim\npresentation_mode_label=Prezentacijski režim\nopen_file.title=Otvori fajl\nopen_file_label=Otvori\ndownload.title=Preuzmi\ndownload_label=Preuzmi\nbookmark.title=Trenutni prikaz (kopiraj ili otvori u novom prozoru)\nbookmark_label=Trenutni prikaz\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Uključi/isključi bočnu traku\ntoggle_sidebar_label=Uključi/isključi bočnu traku\noutline.title=Prikaži konture dokumenta\noutline_label=Konture dokumenta\nthumbs.title=Prikaži thumbnailove\nthumbs_label=Thumbnailovi\nfindbar.title=Pronađi u dokumentu\nfindbar_label=Pronađi\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Strana {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Thumbnail strane {{page}}\n\n# Context menu\nfirst_page.label=Idi na prvu stranu\nlast_page.label=Idi na zadnju stranu\npage_rotate_cw.label=Rotiraj u smjeru kazaljke na satu\npage_rotate_ccw.label=Rotiraj suprotno smjeru kazaljke na satu\n\n# Find panel button title and messages\nfind_label=Pronađi:\nfind_previous.title=Pronađi prethodno pojavljivanje fraze\nfind_previous_label=Prethodno\nfind_next.title=Pronađi sljedeće pojavljivanje fraze\nfind_next_label=Sljedeće\nfind_highlight=Označi sve\nfind_match_case_label=Osjetljivost na karaktere\nfind_reached_top=Dostigao sam vrh dokumenta, nastavljam sa dna\nfind_reached_bottom=Dostigao sam kraj dokumenta, nastavljam sa vrha\nfind_not_found=Fraza nije pronađena\n\n# Error panel labels\nerror_more_info=Više informacija\nerror_less_info=Manje informacija\nerror_close=Zatvori\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Poruka: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fajl: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linija: {{line}}\nrendering_error=Došlo je do greške prilikom renderiranja strane.\n\n# Predefined zoom values\npage_scale_width=Širina strane\npage_scale_fit=Uklopi stranu\npage_scale_auto=Automatsko uvećanje\npage_scale_actual=Stvarna veličina\n\n# Loading indicator messages\n# LOCALIZATION NOTE (error_line): \"{{[percent}}\" will be replaced with a percentage\nloading_error_indicator=Greška\nloading_error=Došlo je do greške prilikom učitavanja PDF-a.\ninvalid_file_error=Neispravan ili oštećen PDF fajl.\nmissing_file_error=Nedostaje PDF fajl.\n\n# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.\n# \"{{[type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} pribilješka]\nrequest_password=PDF je zaštićen lozinkom:\ninvalid_password=Pogrešna lozinka.\n\nprinting_not_supported=Upozorenje: Štampanje nije u potpunosti podržano u ovom browseru.\nprinting_not_ready=Upozorenje: PDF nije u potpunosti učitan za štampanje.\nweb_fonts_disabled=Web fontovi su onemogućeni: nemoguće koristiti ubačene PDF fontove.\ndocument_colors_disabled=PDF dokumentima nije dozvoljeno da koriste vlastite boje: \\'Dozvoli stranicama da izaberu vlastite boje\\' je deaktivirano u browseru.\n"
  },
  {
    "path": "web/viewer/locale/ca/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pàgina anterior\nprevious_label=Anterior\nnext.title=Pàgina següent\nnext_label=Següent\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Pàgina:\npage_of=de {{pageCount}}\n\nzoom_out.title=Allunya\nzoom_out_label=Allunya\nzoom_in.title=Apropa\nzoom_in_label=Apropa\nzoom.title=Escala\npresentation_mode.title=Canvia al mode de presentació\npresentation_mode_label=Mode de presentació\nopen_file.title=Obre el fitxer\nopen_file_label=Obre\nprint.title=Imprimeix\nprint_label=Imprimeix\ndownload.title=Baixa\ndownload_label=Baixa\nbookmark.title=Vista actual (copia o obre en una finestra nova)\nbookmark_label=Vista actual\n\n# Secondary toolbar and context menu\ntools.title=Eines\ntools_label=Eines\nfirst_page.title=Vés a la primera pàgina\nfirst_page.label=Vés a la primera pàgina\nfirst_page_label=Vés a la primera pàgina\nlast_page.title=Vés a l'última pàgina\nlast_page.label=Vés a l'última pàgina\nlast_page_label=Vés a l'última pàgina\npage_rotate_cw.title=Gira cap a la dreta\npage_rotate_cw.label=Gira cap a la dreta\npage_rotate_cw_label=Gira cap a la dreta\npage_rotate_ccw.title=Gira cap a l'esquerra\npage_rotate_ccw.label=Gira cap a l'esquerra\npage_rotate_ccw_label=Gira cap a l'esquerra\n\nhand_tool_enable.title=Habilita l'eina de mà\nhand_tool_enable_label=Habilita l'eina de mà\nhand_tool_disable.title=Inhabilita l'eina de mà\nhand_tool_disable_label=Inhabilita l'eina de mà\n\n# Document properties dialog box\ndocument_properties.title=Propietats del document…\ndocument_properties_label=Propietats del document…\ndocument_properties_file_name=Nom del fitxer:\ndocument_properties_file_size=Mida del fitxer:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Títol:\ndocument_properties_author=Autor:\ndocument_properties_subject=Assumpte:\ndocument_properties_keywords=Paraules clau:\ndocument_properties_creation_date=Data de creació:\ndocument_properties_modification_date=Data de modificació:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creador:\ndocument_properties_producer=Generador de PDF:\ndocument_properties_version=Versió de PDF:\ndocument_properties_page_count=Nombre de pàgines:\ndocument_properties_close=Tanca\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Mostra/amaga la barra lateral\ntoggle_sidebar_label=Mostra/amaga la barra lateral\noutline.title=Mostra el contorn del document\noutline_label=Contorn del document\nattachments.title=Mostra les adjuncions\nattachments_label=Adjuncions\nthumbs.title=Mostra les miniatures\nthumbs_label=Miniatures\nfindbar.title=Cerca al document\nfindbar_label=Cerca\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pàgina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura de la pàgina {{page}}\n\n# Find panel button title and messages\nfind_label=Cerca:\nfind_previous.title=Cerca l'anterior coincidència de l'expressió\nfind_previous_label=Anterior\nfind_next.title=Cerca la següent coincidència de l'expressió\nfind_next_label=Següent\nfind_highlight=Ressalta-ho tot\nfind_match_case_label=Distingeix entre majúscules i minúscules\nfind_reached_top=S'ha arribat al principi del document, es continua pel final\nfind_reached_bottom=S'ha arribat al final del document, es continua pel principi\nfind_not_found=No s'ha trobat l'expressió\n\n# Error panel labels\nerror_more_info=Més informació\nerror_less_info=Menys informació\nerror_close=Tanca\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (muntatge: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Missatge: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fitxer: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Línia: {{line}}\nrendering_error=S'ha produït un error mentre es renderitzava la pàgina\n\n# Predefined zoom values\npage_scale_width=Amplària de la pàgina\npage_scale_fit=Ajusta la pàgina\npage_scale_auto=Zoom automàtic\npage_scale_actual=Mida real\n\n# Loading indicator messages\nloading_error_indicator=Error\nloading_error=S'ha produït un error en carregar el PDF.\ninvalid_file_error=El fitxer PDF no és vàlid o està malmès.\nmissing_file_error=Falta el fitxer PDF.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotació {{type}}]\npassword_label=Introduïu la contrasenya per obrir aquest fitxer PDF.\npassword_invalid=La contrasenya no és vàlida. Torneu-ho a provar.\npassword_ok=D'acord\npassword_cancel=Cancel·la\n\nprinting_not_supported=Avís: la impressió no és plenament funcional en aquest navegador.\nprinting_not_ready=Atenció: el PDF no s'ha acabat de carregar per imprimir-lo.\nweb_fonts_disabled=Les fonts web estan inhabilitades: no es poden incrustar fitxers PDF.\ndocument_colors_disabled=Els documents PDF no poden usar els seus colors propis: «Permet a les pàgines triar els colors propis» es troba desactivat al navegador.\n"
  },
  {
    "path": "web/viewer/locale/cs/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Předchozí stránka\nprevious_label=Předchozí\nnext.title=Další stránka\nnext_label=Další\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Stránka:\npage_of=z {{pageCount}}\n\nzoom_out.title=Zmenší velikost\nzoom_out_label=Zmenšit\nzoom_in.title=Zvětší velikost\nzoom_in_label=Zvětšit\nzoom.title=Nastaví velikost\npresentation_mode.title=Přepne režimu prezentace\npresentation_mode_label=Režim prezentace\nopen_file.title=Otevře soubor\nopen_file_label=Otevřít\nprint.title=Vytiskne dokument\nprint_label=Tisk\ndownload.title=Stáhne dokument\ndownload_label=Stáhnout\nbookmark.title=Aktuální pohled (kopírovat nebo otevřít v novém okně)\nbookmark_label=Aktuální pohled\n\n# Secondary toolbar and context menu\ntools.title=Nástroje\ntools_label=Nástroje\nfirst_page.title=Přejde na první stránku\nfirst_page.label=Přejít na první stránku\nfirst_page_label=Přejít na první stránku\nlast_page.title=Přejde na poslední stránku\nlast_page.label=Přejít na poslední stránku\nlast_page_label=Přejít na poslední stránku\npage_rotate_cw.title=Otočí po směru hodin\npage_rotate_cw.label=Otočit po směru hodin\npage_rotate_cw_label=Otočit po směru hodin\npage_rotate_ccw.title=Otočí proti směru hodin\npage_rotate_ccw.label=Otočit proti směru hodin\npage_rotate_ccw_label=Otočit proti směru hodin\n\nhand_tool_enable.title=Povolit nástroj ručička\nhand_tool_enable_label=Povolit nástroj ručička\nhand_tool_disable.title=Zakázat nástroj ručička\nhand_tool_disable_label=Zakázat nástroj ručička\n\n# Document properties dialog box\ndocument_properties.title=Vlastnosti dokumentu…\ndocument_properties_label=Vlastnosti dokumentu…\ndocument_properties_file_name=Název souboru:\ndocument_properties_file_size=Velikost souboru:\ndocument_properties_kb={{size_kb}} kB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Nadpis:\ndocument_properties_author=Autor:\ndocument_properties_subject=Subjekt:\ndocument_properties_keywords=Klíčová slova:\ndocument_properties_creation_date=Datum vytvoření:\ndocument_properties_modification_date=Datum úpravy:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Vytvořil:\ndocument_properties_producer=Tvůrce PDF:\ndocument_properties_version=Verze PDF:\ndocument_properties_page_count=Počet stránek:\ndocument_properties_close=Zavřít\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Postranní lišta\ntoggle_sidebar_label=Postranní lišta\noutline.title=Zobrazí osnovu dokumentu\noutline_label=Osnova dokumentu\nattachments.title=Zobrazí přílohy\nattachments_label=Přílohy\nthumbs.title=Zobrazí náhledy\nthumbs_label=Náhledy\nfindbar.title=Najde v dokumentu\nfindbar_label=Najít\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Strana {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Náhled strany {{page}}\n\n# Find panel button title and messages\nfind_label=Najít:\nfind_previous.title=Najde předchozí výskyt hledaného spojení\nfind_previous_label=Předchozí\nfind_next.title=Najde další výskyt hledaného spojení\nfind_next_label=Další\nfind_highlight=Zvýraznit\nfind_match_case_label=Rozlišovat velikost\nfind_reached_top=Dosažen začátek dokumentu, pokračuje se od konce\nfind_reached_bottom=Dosažen konec dokumentu, pokračuje se o začátku\nfind_not_found=Hledané spojení nenalezeno\n\n# Error panel labels\nerror_more_info=Více informací\nerror_less_info=Méně informací\nerror_close=Zavřít\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (sestavení: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Zpráva: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Zásobník: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Soubor: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Řádka: {{line}}\nrendering_error=Při vykreslování stránky nastala chyba.\n\n# Predefined zoom values\npage_scale_width=Podle šířky\npage_scale_fit=Podle výšky\npage_scale_auto=Automatická velikost\npage_scale_actual=Aktuální velikost\n\n# Loading indicator messages\nloading_error_indicator=Chyba\nloading_error=Při nahrávání PDF nastala chyba.\ninvalid_file_error=Neplatný nebo chybný soubor PDF.\nmissing_file_error=Chybí soubor PDF.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotace typu {{type}}]\npassword_label=Pro otevření PDF souboru vložte heslo.\npassword_invalid=Neplatné heslo. Zkuste to znovu.\npassword_ok=OK\npassword_cancel=Zrušit\n\nprinting_not_supported=Upozornění: Tisk není v tomto prohlížeči plně podporován.\nprinting_not_ready=Upozornění: Dokument PDF není kompletně načten.\nweb_fonts_disabled=Webová písma jsou zakázána, proto není možné použít vložená písma PDF.\ndocument_colors_disabled=PDF dokumenty nemají povoleny používání vlastních barev: volba \\'Povolit stránkám používat vlastní barvy namísto výše zvolených\\' je v prohlížeči deaktivována.\n"
  },
  {
    "path": "web/viewer/locale/csb/viewer.properties",
    "content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pòprzédnô strona\nprevious_label=Pòprzédnô\nnext.title=Nôslédnô strona\nnext_label=Nôslédnô\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Strona:\npage_of=z {{pageCount}}\n\nzoom_out.title=Zmniészë\nzoom_out_label=Zmniészë\nzoom_in.title=Zwikszë\nzoom_in_label=Wiôlgòsc\nzoom.title=Wiôlgòsc\nprint.title=Drëkùjë\nprint_label=Drëkùjë\npresentation_mode.title=Przéńdzë w trib prezentacje \npresentation_mode_label=Trib prezentacje \nopen_file.title=Òtemkni lopk\nopen_file_label=Òtemkni\ndownload.title=Zladënk\ndownload_label=Zladënk\nbookmark.title=Spamiãtôj wëzdrzatk (kòpérëje, abò òtemkni w nowim òknnie)\nbookmark_label=Aktualny wëzdrzatk\n\nfind_label=Szëkôj:\nfind_previous.title=Biéj do pòprzédnégò wënikù szëkbë\nfind_previous_label=Pòprzédny\nfind_next.title=Biéj do nôslédnégò wënikù szëkbë\nfind_next_label=Nôslédny\nfind_highlight=Pòdszkrzëni wszëtczé\nfind_match_case_label=Rozeznôwôj miarã lëterów\nfind_not_found=Nie nalôzł tekstu\nfind_reached_bottom=Doszedł do kùńca dokùmentu, zaczinającë òd górë\nfind_reached_top=Doszedł do pòczątkù dokùmentu, zaczinającë òd dołù\n\ntoggle_sidebar.title=Pòsuwk wëbiérkù\ntoggle_sidebar_label=Pòsuwk wëbiérkù\n\noutline.title=Wëskrzëni òbcéch dokùmentu\noutline_label=Òbcéch dokùmentu\nthumbs.title=Wëskrzëni miniaturë\nthumbs_label=Miniaturë\nfindbar.title=Przeszëkôj dokùment\nfindbar_label=Nalezë\ntools_label=Nôrzãdła\nfirst_page.title=Biéj do pierszi stronë\nfirst_page.label=Biéj do pierszi stronë\nlast_page.label=Biéj do òstatny stronë\ninvalid_file_error=Lëchi ôrt, abò pòpsëti lopk PDF.\n\n\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Strona {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura stronë {{page}}\n\n# Error panel labels\nerror_more_info=Wicy infòrmacje\nerror_less_info=Mni infòrmacje\nerror_close=Close\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n\n\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Message: {{wiadło}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stóg}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{lopk}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Line: {{line}}\nrendering_error=Pòkôza sã fela przë renderowanim stronë.\n\n# Predefined zoom values\npage_scale_width=Szérzawa stronë\npage_scale_fit=Dopasëje stronã\npage_scale_auto=Aùtomatnô wiôlgòsc\npage_scale_actual=Naturalnô wiôlgòsc\n\n# Loading indicator messages\n# LOCALIZATION NOTE (error_line): \"{{[percent}}\" will be replaced with a percentage\nloading_error_indicator=Fela\nloading_error=Pòkôza sã fela przë wczëtiwanim PDFù.\n\n# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.\n# \"{{[type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\n\nrequest_password=PDF je zabezpieczony parolą:\nprinting_not_supported = Òstrzéga: przezérnik nie je do kùńca wspieróny przez drëkôrze \n\n# Context menu\npage_rotate_cw.label=Òbkrãcë w prawò\npage_rotate_ccw.label=Òbkrãcë w lewò\n\n\nlast_page.title=Biéj do pòprzédny stronë\nlast_page_label=Biéj do pòprzédny stronë\npage_rotate_cw.title=Òbkrãcë w prawò\npage_rotate_cw_label=Òbkrãcë w prawò\npage_rotate_ccw.title=Òbkrãcë w lewò\npage_rotate_ccw_label=Òbkrãcë w lewò\n\n\nweb_fonts_disabled=Sécowé czconczi są wëłączoné: włączë je, bë móc ùżiwac òsadzonëch czconków w lopkach PDF.\n\n\nmissing_file_error=Felëje lopka PDF.\nprinting_not_ready = Òstrzéga: lopk mùszi sã do kùńca wczëtac zanim gò mòże drëkòwac\n\ndocument_colors_disabled=Dokùmentë PDF nie mògą ù swòjich farwów: \\'Pòzwòlë stronóm wëbierac swòje farwë\\' je wëłączoné w przezérnikù.\ninvalid_password=Lëchô parola.\ntext_annotation_type.alt=[Adnotacjô {{type}}]\n\ntools.title=Tools\nfirst_page_label=Go to First Page\n\n\n"
  },
  {
    "path": "web/viewer/locale/cy/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Tudalen Flaenorol\nprevious_label=Blaenorol\nnext.title=Tudalen Nesaf\nnext_label=Nesaf\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Tudalen:\npage_of=o {{pageCount}}\n\nzoom_out.title=Chwyddo Allan\nzoom_out_label=Chwyddo Allan\nzoom_in.title=Chwyddo Mewn\nzoom_in_label=Chwyddo Mewn\nzoom.title=Chwyddo\npresentation_mode.title=Newid i'r Modd Cyflwyno\npresentation_mode_label=Modd Cyflwyno\nopen_file.title=Agor Ffeil\nopen_file_label=Agor\nprint.title=Argraffu\nprint_label=Argraffu\ndownload.title=Llwyth\ndownload_label=Llwytho i Lawr\nbookmark.title=Golwg cyfredol (copïo neu agor ffenestr newydd)\nbookmark_label=Golwg Gyfredol\n\n# Secondary toolbar and context menu\ntools.title=Offer\ntools_label=Offer\nfirst_page.title=Mynd i'r Dudalen Gyntaf\nfirst_page.label=Mynd i'r Dudalen Gyntaf\nfirst_page_label=Mynd i'r Dudalen Gyntaf\nlast_page.title=Mynd i'r Dudalen Olaf\nlast_page.label=Mynd i'r Dudalen Olaf\nlast_page_label=Mynd i'r Dudalen Olaf\npage_rotate_cw.title=Cylchdroi Clocwedd\npage_rotate_cw.label=Cylchdroi Clocwedd\npage_rotate_cw_label=Cylchdroi Clocwedd\npage_rotate_ccw.title=Cylchdroi Gwrthglocwedd\npage_rotate_ccw.label=Cylchdroi Gwrthglocwedd\npage_rotate_ccw_label=Cylchdroi Gwrthglocwedd\n\nhand_tool_enable.title=Galluogi offeryn llaw\nhand_tool_enable_label=Galluogi offeryn llaw\nhand_tool_disable.title=Analluogi offeryn llaw\nhand_tool_disable_label=Analluogi offeryn llaw\n\n# Document properties dialog box\ndocument_properties.title=Priodweddau Dogfen…\ndocument_properties_label=Priodweddau Dogfen…\ndocument_properties_file_name=Enw ffeil:\ndocument_properties_file_size=Maint ffeil:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} beit)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} beit)\ndocument_properties_title=Teitl:\ndocument_properties_author=Awdur:\ndocument_properties_subject=Pwnc:\ndocument_properties_keywords=Allweddair:\ndocument_properties_creation_date=Dyddiad Creu:\ndocument_properties_modification_date=Dyddiad Addasu:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Crewr:\ndocument_properties_producer=Cynhyrchydd PDF:\ndocument_properties_version=Fersiwn PDF:\ndocument_properties_page_count=Cyfrif Tudalen:\ndocument_properties_close=Cau\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Toglo'r Bar Ochr\ntoggle_sidebar_label=Toglo'r Bar Ochr\noutline.title=Dangos Amlinell Dogfen\noutline_label=Amlinelliad Dogfen\nattachments.title=Dangos Atodiadau\nattachments_label=Atodiadau\nthumbs.title=Dangos Lluniau Bach\nthumbs_label=Lluniau Bach\nfindbar.title=Canfod yn y Ddogfen\nfindbar_label=Canfod\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Tudalen {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Llun Bach Tudalen {{page}}\n\n# Find panel button title and messages\nfind_label=Canfod:\nfind_previous.title=Canfod enghraifft flaenorol o'r ymadrodd\nfind_previous_label=Blaenorol\nfind_next.title=Canfod enghraifft nesaf yr ymadrodd\nfind_next_label=Nesaf\nfind_highlight=Amlygu popeth\nfind_match_case_label=Cydweddu maint\nfind_reached_top=Wedi cyrraedd brig y dudalen, parhau o'r gwaelod\nfind_reached_bottom=Wedi cyrraedd diwedd y dudalen, parhau o'r brig\nfind_not_found=Heb ganfod ymadrodd\n\n# Error panel labels\nerror_more_info=Rhagor o Wybodaeth\nerror_less_info=Llai o wybodaeth\nerror_close=Cau\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Neges: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stac: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Ffeil: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Llinell: {{line}}\nrendering_error=Digwyddodd gwall wrth adeiladu'r dudalen.\n\n# Predefined zoom values\npage_scale_width=Lled Tudalen\npage_scale_fit=Ffit Tudalen\npage_scale_auto=Chwyddo Awtomatig\npage_scale_actual=Maint Gwirioneddol\n\n# Loading indicator messages\nloading_error_indicator=Gwall\nloading_error=Digwyddodd gwall wrth lwytho'r PDF.\ninvalid_file_error=Ffeil PDF annilys neu llwgr.\nmissing_file_error=Ffeil PDF coll.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anodiad {{type}} ]\npassword_label=Rhowch gyfrinair i agor y PDF.\npassword_invalid=Cyfrinair annilys. Ceisiwch eto.\npassword_ok=Iawn\npassword_cancel=Diddymu\n\nprinting_not_supported=Rhybudd: Nid yw argraffu yn cael ei gynnal yn llawn gan y porwr.\nprinting_not_ready=Rhybudd: Nid yw'r PDF wedi ei lwytho'n llawn ar gyfer argraffu.\nweb_fonts_disabled=Ffontiau gwe wedi eu hanablu: methu defnyddio ffontiau PDF mewnblanedig.\ndocument_colors_disabled=Nid oes caniatâd i ddogfennau PDF i ddefnyddio eu lliwiau eu hunain: Mae 'Caniatáu i dudalennau ddefnyddio eu lliwiau eu hunain' wedi ei atal yn y porwr.\n"
  },
  {
    "path": "web/viewer/locale/da/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Forrige side\nprevious_label=Forrige\nnext.title=Næste side\nnext_label=Næste\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Side:\npage_of=af {{pageCount}}\n\nzoom_out.title=Zoom ud\nzoom_out_label=Zoom ud\nzoom_in.title=Zoom ind\nzoom_in_label=Zoom ind\nzoom.title=Zoom\nprint.title=Udskriv\nprint_label=Udskriv\npresentation_mode.title=Skift til præsentations-tilstand\npresentation_mode_label=Præsentations-tilstand\nopen_file.title=Åbn fil\nopen_file_label=Åbn\ndownload.title=Hent\ndownload_label=Hent\nbookmark.title=Aktuel visning (kopier eller åbn i et nyt vindue)\nbookmark_label=Aktuel visning\n\n# Secondary toolbar and context menu\ntools.title=Værktøj\ntools_label=Værktøj\nfirst_page.title=Gå til første side\nfirst_page.label=Gå til første side\nfirst_page_label=Gå til første side\nlast_page.title=Gå til sidste side\nlast_page.label=Gå til sidste side\nlast_page_label=Gå til sidste side\npage_rotate_cw.title=Roter med uret\npage_rotate_cw.label=Roter med uret\npage_rotate_cw_label=Roter med uret\npage_rotate_ccw.title=Roter mod uret\npage_rotate_ccw.label=Roter mod uret\npage_rotate_ccw_label=Roter mod uret\n\nhand_tool_enable.title=Aktiver håndværktøj\nhand_tool_enable_label=Aktiver håndværktøj\nhand_tool_disable.title=Deaktiver håndværktøj\nhand_tool_disable_label=Deaktiver håndværktøj\n\n# Document properties dialog box\ndocument_properties.title=Dokumentegenskaber…\ndocument_properties_label=Dokumentegenskaber…\ndocument_properties_file_name=Filnavn:\ndocument_properties_file_size=Filstørrelse:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Titel:\ndocument_properties_author=Forfatter:\ndocument_properties_subject=Emne:\ndocument_properties_keywords=Nøgleord:\ndocument_properties_creation_date=Oprettet:\ndocument_properties_modification_date=Redigeret:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Program:\ndocument_properties_producer=PDF-producent:\ndocument_properties_version=PDF-version:\ndocument_properties_page_count=Antal sider:\ndocument_properties_close=Luk\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Slå sidepanel til eller fra\ntoggle_sidebar_label=Slå sidepanel til eller fra\noutline.title=Vis dokumentets disposition\noutline_label=Dokument-disposition\nattachments.title=Vis vedhæftede filer\nattachments_label=Vedhæftede filer\nthumbs.title=Vis miniaturer\nthumbs_label=Miniaturer\nfindbar.title=Find i dokument\nfindbar_label=Find\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Side {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniature af side {{page}}\n\n# Find panel button title and messages\nfind_label=Find:\nfind_previous.title=Find den forrige forekomst\nfind_previous_label=Forrige\nfind_next.title=Find den næste forekomst\nfind_next_label=Næste\nfind_highlight=Fremhæv alle\nfind_match_case_label=Forskel på store og små bogstaver\nfind_reached_top=Toppen af siden blev nået, fortsatte fra bunden\nfind_reached_bottom=Bunden af siden blev nået, fortsatte fra toppen\nfind_not_found=Der blev ikke fundet noget\n\n# Error panel labels\nerror_more_info=Mere information\nerror_less_info=Mindre information\nerror_close=Luk\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Fejlmeddelelse: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fil: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linje: {{line}}\nrendering_error=Der opstod en fejl ved generering af siden.\n\n# Predefined zoom values\npage_scale_width=Sidebredde\npage_scale_fit=Tilpas til side\npage_scale_auto=Automatisk zoom\npage_scale_actual=Faktisk størrelse\n\n# Loading indicator messages\nloading_error_indicator=Fejl\nloading_error=Der opstod en fejl ved indlæsning af PDF-filen.\ninvalid_file_error=PDF-filen er ugyldig eller ødelagt.\nmissing_file_error=Manglende PDF-fil.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}}kommentar]\npassword_label=Angiv adgangskode til at åbne denne PDF-fil.\npassword_invalid=Ugyldig adgangskode. Prøv igen.\npassword_ok=OK\npassword_cancel=Fortryd\n\nprinting_not_supported=Advarsel: Udskrivning er ikke fuldt understøttet af browseren.\nprinting_not_ready=Advarsel: PDF-filen er ikke fuldt indlæst til udskrivning.\nweb_fonts_disabled=Webskrifttyper er deaktiverede. De indlejrede skrifttyper i PDF-filen kan ikke anvendes.\ndocument_colors_disabled=PDF-dokumenter må ikke bruge deres egne farver: \\'Tillad sider at vælge deres egne farver\\' er deaktiveret i browseren.\n"
  },
  {
    "path": "web/viewer/locale/de/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Eine Seite zurück\nprevious_label=Zurück\nnext.title=Eine Seite vor\nnext_label=Vor\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Seite:\npage_of=von {{pageCount}}\n\nzoom_out.title=Verkleinern\nzoom_out_label=Verkleinern\nzoom_in.title=Vergrößern\nzoom_in_label=Vergrößern\nzoom.title=Zoom\nprint.title=Drucken\nprint_label=Drucken\npresentation_mode.title=In Präsentationsmodus wechseln\npresentation_mode_label=Präsentationsmodus\nopen_file.title=Datei öffnen\nopen_file_label=Öffnen\ndownload.title=Dokument speichern\ndownload_label=Speichern\nbookmark.title=Aktuelle Ansicht (zum Kopieren oder Öffnen in einem neuen Fenster)\nbookmark_label=Aktuelle Ansicht\n\n# Secondary toolbar and context menu\ntools.title=Werkzeuge\ntools_label=Werkzeuge\nfirst_page.title=Erste Seite anzeigen\nfirst_page.label=Erste Seite anzeigen\nfirst_page_label=Erste Seite anzeigen\nlast_page.title=Letzte Seite anzeigen\nlast_page.label=Letzte Seite anzeigen\nlast_page_label=Letzte Seite anzeigen\npage_rotate_cw.title=Im Uhrzeigersinn drehen\npage_rotate_cw.label=Im Uhrzeigersinn drehen\npage_rotate_cw_label=Im Uhrzeigersinn drehen\npage_rotate_ccw.title=Gegen Uhrzeigersinn drehen\npage_rotate_ccw.label=Gegen Uhrzeigersinn drehen\npage_rotate_ccw_label=Gegen Uhrzeigersinn drehen\n\nhand_tool_enable.title=Hand-Werkzeug aktivieren\nhand_tool_enable_label=Hand-Werkzeug aktivieren\nhand_tool_disable.title=Hand-Werkzeug deaktivieren\nhand_tool_disable_label=Hand-Werkzeug deaktivieren\n\n# Document properties dialog box\ndocument_properties.title=Dokumenteigenschaften\ndocument_properties_label=Dokumenteigenschaften…\ndocument_properties_file_name=Dateiname:\ndocument_properties_file_size=Dateigröße:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} Bytes)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} Bytes)\ndocument_properties_title=Titel:\ndocument_properties_author=Autor:\ndocument_properties_subject=Thema:\ndocument_properties_keywords=Stichwörter:\ndocument_properties_creation_date=Erstelldatum:\ndocument_properties_modification_date=Bearbeitungsdatum:\ndocument_properties_date_string={{date}} {{time}}\ndocument_properties_creator=Anwendung:\ndocument_properties_producer=PDF erstellt mit:\ndocument_properties_version=PDF-Version:\ndocument_properties_page_count=Seitenzahl:\ndocument_properties_close=Schließen\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Sidebar umschalten\ntoggle_sidebar_label=Sidebar umschalten\noutline.title=Dokumentstruktur anzeigen\noutline_label=Dokumentstruktur\nattachments.title=Anhänge anzeigen\nattachments_label=Anhänge\nthumbs.title=Miniaturansichten anzeigen\nthumbs_label=Miniaturansichten\nfindbar.title=Dokument durchsuchen\nfindbar_label=Suchen\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Seite {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniaturansicht von Seite {{page}}\n\n# Find panel button title and messages\nfind_label=Suchen:\nfind_previous.title=Vorheriges Auftreten des Suchbegriffs finden\nfind_previous_label=Zurück\nfind_next.title=Nächstes Auftreten des Suchbegriffs finden\nfind_next_label=Weiter\nfind_highlight=Alle hervorheben\nfind_match_case_label=Groß-/Kleinschreibung beachten\nfind_reached_top=Anfang des Dokuments erreicht, fahre am Ende fort\nfind_reached_bottom=Ende des Dokuments erreicht, fahre am Anfang fort\nfind_not_found=Suchbegriff nicht gefunden\n\n# Error panel labels\nerror_more_info=Mehr Informationen\nerror_less_info=Weniger Informationen\nerror_close=Schließen\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js Version {{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Nachricht: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Aufrufliste: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Datei: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Zeile: {{line}}\nrendering_error=Beim Darstellen der Seite trat ein Fehler auf.\n\n# Predefined zoom values\npage_scale_width=Seitenbreite\npage_scale_fit=Seitengröße\npage_scale_auto=Automatischer Zoom\npage_scale_actual=Originalgröße\n\n# Loading indicator messages\nloading_error_indicator=Fehler\nloading_error=Beim Laden der PDF-Datei trat ein Fehler auf.\ninvalid_file_error=Ungültige oder beschädigte PDF-Datei\nmissing_file_error=Fehlende PDF-Datei\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anlage: {{type}}]\npassword_label=Geben Sie zum Öffnen der PDF-Datei deren Passwort ein.\npassword_invalid=Falsches Passwort. Bitte versuchen Sie es erneut.\npassword_ok=OK\npassword_cancel=Abbrechen\n\nprinting_not_supported=Warnung: Die Drucken-Funktion wird durch diesen Browser nicht vollständig unterstützt.\nprinting_not_ready=Warnung: Die PDF-Datei ist nicht vollständig geladen, dies ist für das Drucken aber empfohlen.\nweb_fonts_disabled=Web-Schriftarten sind deaktiviert: Eingebettete PDF-Schriftarten konnten nicht geladen werden.\ndocument_colors_disabled=PDF-Dokumenten ist es nicht erlaubt, ihre eigenen Farben zu verwenden: \\'Seiten das Verwenden von eigenen Farben erlauben\\' ist im Browser deaktiviert.\n"
  },
  {
    "path": "web/viewer/locale/el/viewer.properties",
    "content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Προηγούμενη σελίδα\nprevious_label=Προηγούμενη\nnext.title=Επόμενη σελίδα\nnext_label=Επόμενη\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Σελίδα:\npage_of= {{pageCount}}\n\nzoom_out.title=Σμίκρυνση\nzoom_out_label=Σμίκρυνση\nzoom_in.title=Μεγέθυνση\nzoom_in_label=Μεγέθυνση\nzoom.title=Μεγέθυνση\nprint.title=Εκτύπωση\nprint_label=Εκτύπωση\nopen_file.title=Άνοιγμα αρχείου\nopen_file_label=Άνοιγμα\ndownload.title=Λήψη\ndownload_label=Λήψη\nbookmark.title=Τρέχουσα προβολή (αντίγραφο ή άνοιγμα σε νέο παράθυρο)\nbookmark_label=Τρέχουσα προβολή\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\noutline.title=Προβολή διάρθρωσης κειμένου\noutline_label=Διάρθρωση κειμένου\nthumbs.title=Προβολή μικρογραφιών\nthumbs_label=Μικρογραφίες\n\n\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Σελίδα {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Μικρογραφία της σελίδας {{page}}\n\nfirst_page.label=Μετάβαση στην πρώτη σελίδα\n\n# Error panel labels\nerror_more_info=Περισσότερες πληροφορίες\nerror_less_info=Λιγότερες πληροφορίες\nerror_close=Κλείσιμο\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Μήνυμα: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Αρχείο: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Line: {{line}}\nrendering_error=Προέκυψε σφάλμα κατά την ανάλυση της σελίδας.\n\n# Predefined zoom values\npage_scale_width=Πλάτος σελίδας\npage_scale_fit=Μέγεθος σελίδας\npage_scale_auto=Αυτόματη μεγέθυνση\npage_scale_actual=Πραγματικό μέγεθος\n\n\n# Context menu\npage_rotate_cw.label=Δεξιόστροφη περιστροφή\npage_rotate_ccw.label=Αριστερόστροφη περιστροφή\n\npresentation_mode.title=Μετάβαση σε λειτουργία παρουσίασης\npresentation_mode_label=Λειτουργία παρουσίασης\n\n# Loading indicator messages\n# LOCALIZATION NOTE (error_line): \"{{[percent}}\" will be replaced with a percentage\n\nloading_error_indicator=Σφάλμα\nloading_error=Προέκυψε ένα σφάλμα κατά τη φόρτωση του PDF.\n\nrequest_password=Το PDF προστατεύεται από κωδικό:\n\nprinting_not_supported=Προειδοποίηση: Η εκτύπωση δεν υποστηρίζεται πλήρως από αυτόν τον περιηγητή.\n\n\n\nfindbar.title=Εύρεση στο έγγραφο\nfindbar_label=Εύρεση\n\n\n# Find panel button title and messages\nfind_label=Εύρεση:\nfind_previous.title=Εύρεση της προηγούμενης εμφάνισης της φράσης\nfind_previous_label=Προηγούμενο\nfind_next.title=Εύρεση της επόμενης εμφάνισης της φράσης\nfind_next_label=Επόμενο\nfind_highlight=Επισήμανση όλων\nfind_match_case_label=Ταίριασμα χαρακτήρα\nfind_reached_top=Έλευση στην αρχή του εγγράφου, συνέχεια από το τέλος\nfind_reached_bottom=Έλευση στο τέλος του εγγράφου, συνέχεια από την αρχή\nfind_not_found=Η φράση δεν βρέθηκε\n\ninvalid_file_error=Μη έγκυρο ή κατεστραμμένο αρχείο PDF.\nlast_page.label=Μετάβαση στη τελευταία σελίδα\n\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n\nmissing_file_error=Λείπει αρχείο PDF.\n\n\ntoggle_sidebar.title=Εναλλαγή προβολής πλευρικής στήλης\ntoggle_sidebar_label=Εναλλαγή προβολής πλευρικής στήλης\n\nweb_fonts_disabled=Οι γραμματοσειρές Web απενεργοποιημένες: αδυναμία χρήσης των ενσωματωμένων γραμματοσειρών PDF.\n\nprinting_not_ready=Προειδοποίηση: Το PDF δεν φορτώθηκε πλήρως για εκτύπωση.\n\ndocument_colors_disabled=Δεν επιτρέπεται στα έγγραφα PDF να χρησιμοποιούν τα δικά τους χρώματα: Η επιλογή \\'Να επιτρέπεται η χρήση χρωμάτων της σελίδας\\' δεν είναι ενεργή στην εφαρμογή.\n\ninvalid_password=Μη έγκυρος κωδικός.\ntext_annotation_type.alt=[{{type}} Annotation]\n\n"
  },
  {
    "path": "web/viewer/locale/en-GB/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Previous Page\nprevious_label=Previous\nnext.title=Next Page\nnext_label=Next\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Page:\npage_of=of {{pageCount}}\n\nzoom_out.title=Zoom Out\nzoom_out_label=Zoom Out\nzoom_in.title=Zoom In\nzoom_in_label=Zoom In\nzoom.title=Zoom\nprint.title=Print\nprint_label=Print\npresentation_mode.title=Switch to Presentation Mode\npresentation_mode_label=Presentation Mode\nopen_file.title=Open File\nopen_file_label=Open\ndownload.title=Download\ndownload_label=Download\nbookmark.title=Current view (copy or open in new window)\nbookmark_label=Current View\n\n# Secondary toolbar and context menu\ntools.title=Tools\ntools_label=Tools\nfirst_page.title=Go to First Page\nfirst_page.label=Go to First Page\nfirst_page_label=Go to First Page\nlast_page.title=Go to Last Page\nlast_page.label=Go to Last Page\nlast_page_label=Go to Last Page\npage_rotate_cw.title=Rotate Clockwise\npage_rotate_cw.label=Rotate Clockwise\npage_rotate_cw_label=Rotate Clockwise\npage_rotate_ccw.title=Rotate Counter-Clockwise\npage_rotate_ccw.label=Rotate Counter-Clockwise\npage_rotate_ccw_label=Rotate Counter-Clockwise\n\nhand_tool_enable.title=Enable hand tool\nhand_tool_enable_label=Enable hand tool\nhand_tool_disable.title=Disable hand tool\nhand_tool_disable_label=Disable hand tool\n\n# Document properties dialog box\ndocument_properties.title=Document Properties…\ndocument_properties_label=Document Properties…\ndocument_properties_file_name=File name:\ndocument_properties_file_size=File size:\ndocument_properties_kb={{size_kb}} kB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Title:\ndocument_properties_author=Author:\ndocument_properties_subject=Subject:\ndocument_properties_keywords=Keywords:\ndocument_properties_creation_date=Creation Date:\ndocument_properties_modification_date=Modification Date:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creator:\ndocument_properties_producer=PDF Producer:\ndocument_properties_version=PDF Version:\ndocument_properties_page_count=Page Count:\ndocument_properties_close=Close\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Toggle Sidebar\ntoggle_sidebar_label=Toggle Sidebar\noutline.title=Show Document Outline\noutline_label=Document Outline\nthumbs.title=Show Thumbnails\nthumbs_label=Thumbnails\nfindbar.title=Find in Document\nfindbar_label=Find\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Page {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Thumbnail of Page {{page}}\n\n# Find panel button title and messages\nfind_label=Find:\nfind_previous.title=Find the previous occurrence of the phrase\nfind_previous_label=Previous\nfind_next.title=Find the next occurrence of the phrase\nfind_next_label=Next\nfind_highlight=Highlight all\nfind_match_case_label=Match case\nfind_reached_top=Reached top of document, continued from bottom\nfind_reached_bottom=Reached end of document, continued from top\nfind_not_found=Phrase not found\n\n# Error panel labels\nerror_more_info=More Information\nerror_less_info=Less Information\nerror_close=Close\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Message: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Line: {{line}}\nrendering_error=An error occurred while rendering the page.\n\n# Predefined zoom values\npage_scale_width=Page Width\npage_scale_fit=Page Fit\npage_scale_auto=Automatic Zoom\npage_scale_actual=Actual Size\n\n# Loading indicator messages\nloading_error_indicator=Error\nloading_error=An error occurred while loading the PDF.\ninvalid_file_error=Invalid or corrupted PDF file.\nmissing_file_error=Missing PDF file.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=Enter the password to open this PDF file.\npassword_invalid=Invalid password. Please try again.\npassword_ok=OK\npassword_cancel=Cancel\n\nprinting_not_supported=Warning: Printing is not fully supported by this browser.\nprinting_not_ready=Warning: The PDF is not fully loaded for printing.\nweb_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.\ndocument_colors_disabled=PDF documents are not allowed to use their own colours: \\'Allow pages to choose their own colours\\' is deactivated in the browser.\n"
  },
  {
    "path": "web/viewer/locale/en-US/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Previous Page\nprevious_label=Previous\nnext.title=Next Page\nnext_label=Next\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Page:\npage_of=of {{pageCount}}\n\nzoom_out.title=Zoom Out\nzoom_out_label=Zoom Out\nzoom_in.title=Zoom In\nzoom_in_label=Zoom In\nzoom.title=Zoom\npresentation_mode.title=Switch to Presentation Mode\npresentation_mode_label=Presentation Mode\nopen_file.title=Open File\nopen_file_label=Open\nprint.title=Print\nprint_label=Print\ndownload.title=Download\ndownload_label=Download\nbookmark.title=Current view (copy or open in new window)\nbookmark_label=Current View\n\n# Secondary toolbar and context menu\ntools.title=Tools\ntools_label=Tools\nfirst_page.title=Go to First Page\nfirst_page.label=Go to First Page\nfirst_page_label=Go to First Page\nlast_page.title=Go to Last Page\nlast_page.label=Go to Last Page\nlast_page_label=Go to Last Page\npage_rotate_cw.title=Rotate Clockwise\npage_rotate_cw.label=Rotate Clockwise\npage_rotate_cw_label=Rotate Clockwise\npage_rotate_ccw.title=Rotate Counterclockwise\npage_rotate_ccw.label=Rotate Counterclockwise\npage_rotate_ccw_label=Rotate Counterclockwise\n\nhand_tool_enable.title=Enable hand tool\nhand_tool_enable_label=Enable hand tool\nhand_tool_disable.title=Disable hand tool\nhand_tool_disable_label=Disable hand tool\n\n# Document properties dialog box\ndocument_properties.title=Document Properties…\ndocument_properties_label=Document Properties…\ndocument_properties_file_name=File name:\ndocument_properties_file_size=File size:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Title:\ndocument_properties_author=Author:\ndocument_properties_subject=Subject:\ndocument_properties_keywords=Keywords:\ndocument_properties_creation_date=Creation Date:\ndocument_properties_modification_date=Modification Date:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creator:\ndocument_properties_producer=PDF Producer:\ndocument_properties_version=PDF Version:\ndocument_properties_page_count=Page Count:\ndocument_properties_close=Close\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Toggle Sidebar\ntoggle_sidebar_label=Toggle Sidebar\noutline.title=Show Document Outline\noutline_label=Document Outline\nattachments.title=Show Attachments\nattachments_label=Attachments\nthumbs.title=Show Thumbnails\nthumbs_label=Thumbnails\nfindbar.title=Find in Document\nfindbar_label=Find\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Page {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Thumbnail of Page {{page}}\n\n# Find panel button title and messages\nfind_label=Find:\nfind_previous.title=Find the previous occurrence of the phrase\nfind_previous_label=Previous\nfind_next.title=Find the next occurrence of the phrase\nfind_next_label=Next\nfind_highlight=Highlight all\nfind_match_case_label=Match case\nfind_reached_top=Reached top of document, continued from bottom\nfind_reached_bottom=Reached end of document, continued from top\nfind_not_found=Phrase not found\n\n# Error panel labels\nerror_more_info=More Information\nerror_less_info=Less Information\nerror_close=Close\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Message: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Line: {{line}}\nrendering_error=An error occurred while rendering the page.\n\n# Predefined zoom values\npage_scale_width=Page Width\npage_scale_fit=Page Fit\npage_scale_auto=Automatic Zoom\npage_scale_actual=Actual Size\n\n# Loading indicator messages\nloading_error_indicator=Error\nloading_error=An error occurred while loading the PDF.\ninvalid_file_error=Invalid or corrupted PDF file.\nmissing_file_error=Missing PDF file.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=Enter the password to open this PDF file.\npassword_invalid=Invalid password. Please try again.\npassword_ok=OK\npassword_cancel=Cancel\n\nprinting_not_supported=Warning: Printing is not fully supported by this browser.\nprinting_not_ready=Warning: The PDF is not fully loaded for printing.\nweb_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.\ndocument_colors_disabled=PDF documents are not allowed to use their own colors: \\'Allow pages to choose their own colors\\' is deactivated in the browser.\n"
  },
  {
    "path": "web/viewer/locale/en-ZA/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Previous Page\nprevious_label=Previous\nnext.title=Next Page\nnext_label=Next\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Page:\npage_of=of {{pageCount}}\n\nzoom_out.title=Zoom Out\nzoom_out_label=Zoom Out\nzoom_in.title=Zoom In\nzoom_in_label=Zoom In\nzoom.title=Zoom\npresentation_mode.title=Switch to Presentation Mode\npresentation_mode_label=Presentation Mode\nopen_file.title=Open File\nopen_file_label=Open\nprint.title=Print\nprint_label=Print\ndownload.title=Download\ndownload_label=Download\nbookmark.title=Current view (copy or open in new window)\nbookmark_label=Current View\n\n# Secondary toolbar and context menu\ntools.title=Tools\ntools_label=Tools\nfirst_page.title=Go to First Page\nfirst_page.label=Go to First Page\nfirst_page_label=Go to First Page\nlast_page.title=Go to Last Page\nlast_page.label=Go to Last Page\nlast_page_label=Go to Last Page\npage_rotate_cw.title=Rotate Clockwise\npage_rotate_cw.label=Rotate Clockwise\npage_rotate_cw_label=Rotate Clockwise\npage_rotate_ccw.title=Rotate Counterclockwise\npage_rotate_ccw.label=Rotate Counterclockwise\npage_rotate_ccw_label=Rotate Counterclockwise\n\nhand_tool_enable.title=Enable hand tool\nhand_tool_enable_label=Enable hand tool\nhand_tool_disable.title=Disable hand tool\nhand_tool_disable_label=Disable hand tool\n\n# Document properties dialog box\ndocument_properties.title=Document Properties…\ndocument_properties_label=Document Properties…\ndocument_properties_file_name=File name:\ndocument_properties_file_size=File size:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Title:\ndocument_properties_author=Author:\ndocument_properties_subject=Subject:\ndocument_properties_keywords=Keywords:\ndocument_properties_creation_date=Creation Date:\ndocument_properties_modification_date=Modification Date:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creator:\ndocument_properties_producer=PDF Producer:\ndocument_properties_version=PDF Version:\ndocument_properties_page_count=Page Count:\ndocument_properties_close=Close\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Toggle Sidebar\ntoggle_sidebar_label=Toggle Sidebar\noutline.title=Show Document Outline\noutline_label=Document Outline\nthumbs.title=Show Thumbnails\nthumbs_label=Thumbnails\nfindbar.title=Find in Document\nfindbar_label=Find\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Page {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Thumbnail of Page {{page}}\n\n# Find panel button title and messages\nfind_label=Find:\nfind_previous.title=Find the previous occurrence of the phrase\nfind_previous_label=Previous\nfind_next.title=Find the next occurrence of the phrase\nfind_next_label=Next\nfind_highlight=Highlight all\nfind_match_case_label=Match case\nfind_reached_top=Reached top of document, continued from bottom\nfind_reached_bottom=Reached end of document, continued from top\nfind_not_found=Phrase not found\n\n# Error panel labels\nerror_more_info=More Information\nerror_less_info=Less Information\nerror_close=Close\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Message: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Line: {{line}}\nrendering_error=An error occurred while rendering the page.\n\n# Predefined zoom values\npage_scale_width=Page Width\npage_scale_fit=Page Fit\npage_scale_auto=Automatic Zoom\npage_scale_actual=Actual Size\n\n# Loading indicator messages\nloading_error_indicator=Error\nloading_error=An error occurred while loading the PDF.\ninvalid_file_error=Invalid or corrupted PDF file.\nmissing_file_error=Missing PDF file.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=Enter the password to open this PDF file.\npassword_invalid=Invalid password. Please try again.\npassword_ok=OK\npassword_cancel=Cancel\n\nprinting_not_supported=Warning: Printing is not fully supported by this browser.\nprinting_not_ready=Warning: The PDF is not fully loaded for printing.\nweb_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.\ndocument_colors_disabled=PDF documents are not allowed to use their own colours: 'Allow pages to choose their own colours' is deactivated in the browser.\n"
  },
  {
    "path": "web/viewer/locale/eo/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Antaŭa paĝo\nprevious_label=Malantaŭen\nnext.title=Venonta paĝo\nnext_label=Antaŭen\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Paĝo:\npage_of=el {{pageCount}}\n\nzoom_out.title=Malpligrandigi\nzoom_out_label=Malpligrandigi\nzoom_in.title=Pligrandigi\nzoom_in_label=Pligrandigi\nzoom.title=Pligrandigilo\npresentation_mode.title=Iri al prezenta reĝimo\npresentation_mode_label=Prezenta reĝimo\nopen_file.title=Malfermi dosieron\nopen_file_label=Malfermi\nprint.title=Presi\nprint_label=Presi\ndownload.title=Elŝuti\ndownload_label=Elŝuti\nbookmark.title=Nuna vido (kopii aŭ malfermi en nova fenestro)\nbookmark_label=Nuna vido\n\n# Secondary toolbar and context menu\ntools.title=Iloj\ntools_label=Iloj\nfirst_page.title=Iri al la unua paĝo\nfirst_page.label=Iri al la unua paĝo\nfirst_page_label=Iri al la unua paĝo\nlast_page.title=Iri al la lasta paĝo\nlast_page.label=Iri al la lasta paĝo\nlast_page_label=Iri al la lasta paĝo\npage_rotate_cw.title=Rotaciigi dekstrume\npage_rotate_cw.label=Rotaciigi dekstrume\npage_rotate_cw_label=Rotaciigi dekstrume\npage_rotate_ccw.title=Rotaciigi maldekstrume\npage_rotate_ccw.label=Rotaciigi maldekstrume\npage_rotate_ccw_label=Rotaciigi maldekstrume\n\nhand_tool_enable.title=Aktivigi manan ilon\nhand_tool_enable_label=Aktivigi manan ilon\nhand_tool_disable.title=Malaktivigi manan ilon\nhand_tool_disable_label=Malaktivigi manan ilon\n\n# Document properties dialog box\ndocument_properties.title=Atributoj de dokumento…\ndocument_properties_label=Atributoj de dokumento…\ndocument_properties_file_name=Nomo de dosiero:\ndocument_properties_file_size=Grado de dosiero:\ndocument_properties_kb={{size_kb}} KO ({{size_b}} oktetoj)\ndocument_properties_mb={{size_mb}} MO ({{size_b}} oktetoj)\ndocument_properties_title=Titolo:\ndocument_properties_author=Aŭtoro:\ndocument_properties_subject=Temo:\ndocument_properties_keywords=Ŝlosilvorto:\ndocument_properties_creation_date=Dato de kreado:\ndocument_properties_modification_date=Dato de modifo:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Kreinto:\ndocument_properties_producer=Produktinto de PDF:\ndocument_properties_version=Versio de PDF:\ndocument_properties_page_count=Nombro de paĝoj:\ndocument_properties_close=Fermi\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Montri/kaŝi flankan strion\ntoggle_sidebar_label=Montri/kaŝi flankan strion\noutline.title=Montri skemon de dokumento\noutline_label=Skemo de dokumento\nattachments.title=Montri kunsendaĵojn\nattachments_label=Kunsendaĵojn\nthumbs.title=Montri miniaturojn\nthumbs_label=Miniaturoj\nfindbar.title=Serĉi en dokumento\nfindbar_label=Serĉi\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Paĝo {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniaturo de paĝo {{page}}\n\n# Find panel button title and messages\nfind_label=Serĉi:\nfind_previous.title=Serĉi la antaŭan aperon de la frazo\nfind_previous_label=Malantaŭen\nfind_next.title=Serĉi la venontan aperon de la frazo\nfind_next_label=Antaŭen\nfind_highlight=Elstarigi ĉiujn\nfind_match_case_label=Distingi inter majuskloj kaj minuskloj\nfind_reached_top=Komenco de la dokumento atingita, daŭrigado ekde la fino\nfind_reached_bottom=Fino de la dokumento atingita, daŭrigado ekde la komenco\nfind_not_found=Frazo ne trovita\n\n# Error panel labels\nerror_more_info=Pli da informo\nerror_less_info=Mapli da informo\nerror_close=Fermi\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mesaĝo: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stako: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Dosiero: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linio: {{line}}\nrendering_error=Okazis eraro dum la montrado de la paĝo.\n\n# Predefined zoom values\npage_scale_width=Larĝo de paĝo\npage_scale_fit=Adapti paĝon\npage_scale_auto=Aŭtomata skalo\npage_scale_actual=Reala gandeco\n\n# Loading indicator messages\nloading_error_indicator=Eraro\nloading_error=Okazis eraro dum la ŝargado de la PDF dosiero.\ninvalid_file_error=Nevalida aŭ difektita PDF dosiero.\nmissing_file_error=Mankas dosiero PDF.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Prinoto: {{type}}]\npassword_label=Tajpu pasvorton por malfermi tiun ĉi dosieron PDF.\npassword_invalid=Nevalida pasvorto. Bonvolu provi denove.\npassword_ok=Akcepti\npassword_cancel=Nuligi\n\nprinting_not_supported=Averto: tiu ĉi retesplorilo ne plene subtenas presadon.\nprinting_not_ready=Warning: La PDF dosiero ne estas plene ŝargita por presado.\nweb_fonts_disabled=Neaktivaj teksaĵaj tiparoj: ne elbas uzi enmetitajn tiparojn de PDF.\ndocument_colors_disabled=Dokumentoj PDF ne rajtas havi siajn proprajn kolorojn: \\'Permesi al paĝoj elekti siajn proprajn kolorojn\\' estas malaktiva en la retesplorilo.\n"
  },
  {
    "path": "web/viewer/locale/es-AR/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Página anterior\nprevious_label=Anterior\nnext.title=Página siguiente\nnext_label=Siguiente\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Página:\npage_of=de {{pageCount}}\n\nzoom_out.title=Alejar\nzoom_out_label=Alejar\nzoom_in.title=Acercar\nzoom_in_label=Acercar\nzoom.title=Zoom\nprint.title=Imprimir\nprint_label=Imprimir\npresentation_mode.title=Cambiar a modo presentación\npresentation_mode_label=Modo presentación\nopen_file.title=Abrir archivo\nopen_file_label=Abrir\ndownload.title=Descargar\ndownload_label=Descargar\nbookmark.title=Vista actual (copiar o abrir en nueva ventana)\nbookmark_label=Vista actual\n\n# Secondary toolbar and context menu\ntools.title=Herramientas\ntools_label=Herramientas\nfirst_page.title=Ir a primera página\nfirst_page.label=Ir a primera página\nfirst_page_label=Ir a primera página\nlast_page.title=Ir a última página\nlast_page.label=Ir a última página\nlast_page_label=Ir a última página\npage_rotate_cw.title=Rotar horario\npage_rotate_cw.label=Rotar horario\npage_rotate_cw_label=Rotar horario\npage_rotate_ccw.title=Rotar antihorario\npage_rotate_ccw.label=Rotar antihorario\npage_rotate_ccw_label=Rotar antihorario\n\nhand_tool_enable.title=Habilitar herramienta mano\nhand_tool_enable_label=Habilitar herramienta mano\nhand_tool_disable.title=Deshabilitar herramienta mano\nhand_tool_disable_label=Deshabilitar herramienta mano\n\n# Document properties dialog box\ndocument_properties.title=Propiedades del documento…\ndocument_properties_label=Propiedades del documento…\ndocument_properties_file_name=Nombre de archivo:\ndocument_properties_file_size=Tamaño de archovo:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Título:\ndocument_properties_author=Autor:\ndocument_properties_subject=Asunto:\ndocument_properties_keywords=Palabras clave:\ndocument_properties_creation_date=Fecha de creación:\ndocument_properties_modification_date=Fecha de modificación:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creador:\ndocument_properties_producer=PDF Productor:\ndocument_properties_version=Versión de PDF:\ndocument_properties_page_count=Cantidad de páginas:\ndocument_properties_close=Cerrar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Alternar barra lateral\ntoggle_sidebar_label=Alternar barra lateral\noutline.title=Mostrar esquema del documento\noutline_label=Esquema del documento\nattachments.title=Mostrar adjuntos\nattachments_label=Adjuntos\nthumbs.title=Mostrar miniaturas\nthumbs_label=Miniaturas\nfindbar.title=Buscar en documento\nfindbar_label=Buscar\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Página {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura de página {{page}}\n\n# Context menu\nfirst_page.label=Ir a la primera página\nlast_page.label=Ir a la última página\npage_rotate_cw.label=Rotar en sentido horario\npage_rotate_ccw.label=Rotar en sentido antihorario\n\n# Find panel button title and messages\nfind_label=Buscar:\nfind_previous.title=Buscar la aparición anterior de la frase\nfind_previous_label=Anterior\nfind_next.title=Buscar la siguiente aparición de la frase\nfind_next_label=Siguiente\nfind_highlight=Resaltar todo\nfind_match_case_label=Coincidir mayúsculas\nfind_reached_top=Inicio de documento alcanzado, continuando desde abajo\nfind_reached_bottom=Fin de documento alcanzando, continuando desde arriba\nfind_not_found=Frase no encontrada\n\n# Error panel labels\nerror_more_info=Más información\nerror_less_info=Menos información\nerror_close=Cerrar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensaje: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Archivo: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Línea: {{line}}\nrendering_error=Ocurrió un error al dibujar la página.\n\n# Predefined zoom values\npage_scale_width=Ancho de página\npage_scale_fit=Ajustar página\npage_scale_auto=Zoom automático\npage_scale_actual=Tamaño real\n\n# Loading indicator messages\nloading_error_indicator=Error\nloading_error=Ocurrió un error al cargar el PDF.\ninvalid_file_error=Archivo PDF no válido o cocrrupto.\nmissing_file_error=Archivo PDF faltante.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Anotación]\npassword_label=Ingrese la contraseña para abrir este archivo PDF\npassword_invalid=Contraseña inválida. Intente nuevamente.\npassword_ok=Aceptar\npassword_cancel=Cancelar\n\nprinting_not_supported=Advertencia: La impresión no está totalmente soportada por este navegador.\nprinting_not_ready=Advertencia: El PDF no está completamente cargado para impresión.\nweb_fonts_disabled=Tipografía web deshabilitada: no se pueden usar tipos incrustados en PDF.\ndocument_colors_disabled=Los documentos PDF no tienen permitido usar sus propios colores: \\'Permitir a las páginas elegir sus propios colores\\' está desactivado en el navegador.\n"
  },
  {
    "path": "web/viewer/locale/es-CL/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nprevious.title = Página anterior\nprevious_label = Anterior\nnext.title = Página siguiente\nnext_label = Siguiente\npage_label = Página:\npage_of = de {{pageCount}}\nzoom_out.title = Alejar\nzoom_out_label = Alejar\nzoom_in.title = Acercar\nzoom_in_label = Acercar\nzoom.title = Ampliación\nprint.title = Imprimir\nprint_label = Imprimir\npresentation_mode.title = Cambiar al modo de presentación\npresentation_mode_label = Modo de presentación\nopen_file.title = Abrir archivo\nopen_file_label = Abrir\ndownload.title = Descargar\ndownload_label = Descargar\nbookmark.title = Vista actual (copiar o abrir en nueva ventana)\nbookmark_label = Vista actual\ntools.title=Herramientas\ntools_label=Herramientas\nfirst_page.title=Ir a la primera página\nfirst_page.label=Ir a la primera página\nfirst_page_label=Ir a la primera página\nlast_page.title=Ir a la última página\nlast_page.label=Ir a la última página\nlast_page_label=Ir a la última página\npage_rotate_cw.title=Girar a la derecha\npage_rotate_cw.label=Girar a la derecha\npage_rotate_cw_label=Girar a la derecha\npage_rotate_ccw.title=Girar a la izquierda\npage_rotate_ccw.label=Girar a la izquierda\npage_rotate_ccw_label=Girar a la izquierda\n\nhand_tool_enable.title=Activar herramienta de mano\nhand_tool_enable_label=Activar herramienta de mano\nhand_tool_disable.title=Desactivar herramienta de mano\nhand_tool_disable_label=Desactivar herramienta de mano\n\ndocument_properties.title=Propiedades del documento…\ndocument_properties_label=Propiedades del documento…\ndocument_properties_file_name=Nombre del archivo:\ndocument_properties_file_size=Tamaño del archivo:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Título:\ndocument_properties_author=Autor:\ndocument_properties_subject=Asunto:\ndocument_properties_keywords=Palabras clave:\ndocument_properties_creation_date=Fecha de creación:\ndocument_properties_modification_date=Fecha de modificación:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creador:\ndocument_properties_producer=Productor del PDF:\ndocument_properties_version=Versión de PDF:\ndocument_properties_page_count=Cantidad de páginas:\ndocument_properties_close=Cerrar\n\ntoggle_sidebar.title=Barra lateral\ntoggle_sidebar_label=Mostrar u ocultar la barra lateral\noutline.title = Mostrar esquema del documento\noutline_label = Esquema del documento\nattachments.title=Mostrar adjuntos\nattachments_label=Adjuntos\nthumbs.title = Mostrar miniaturas\nthumbs_label = Miniaturas\nfindbar.title = Buscar en el documento\nfindbar_label = Buscar\nthumb_page_title = Página {{page}}\nthumb_page_canvas = Miniatura de la página {{page}}\nfirst_page.label = Ir a la primera página\nlast_page.label = Ir a la última página\npage_rotate_cw.label = Rotar en sentido de los punteros del reloj\npage_rotate_ccw.label = Rotar en sentido contrario a los punteros del reloj\nfind_label = Buscar:\nfind_previous.title = Encontrar la aparición anterior de la frase\nfind_previous_label = Previo\nfind_next.title = Encontrar la siguiente aparición de la frase\nfind_next_label = Siguiente\nfind_highlight = Destacar todos\nfind_match_case_label = Coincidir mayús./minús.\nfind_reached_top=Se alcanzó el inicio del documento, continuando desde el final\nfind_reached_bottom=Se alcanzó el final del documento, continuando desde el inicio\nfind_not_found = Frase no encontrada\nerror_more_info = Más información\nerror_less_info = Menos información\nerror_close = Cerrar\nerror_version_info=PDF.js v{{version}} (compilación: {{build}})\nerror_message = Mensaje: {{message}}\nerror_stack = Pila: {{stack}}\nerror_file = Archivo: {{file}}\nerror_line = Línea: {{line}}\nrendering_error = Ha ocurrido un error al renderizar la página.\npage_scale_width = Ancho de página\npage_scale_fit = Ajuste de página\npage_scale_auto = Aumento automático\npage_scale_actual = Tamaño actual\nloading_error_indicator = Error\nloading_error = Ha ocurrido un error al cargar el PDF.\ninvalid_file_error = Archivo PDF inválido o corrupto.\nmissing_file_error=Falta el archivo PDF.\n\ntext_annotation_type.alt=[{{type}} Anotación]\npassword_label=Ingrese la contraseña para abrir este archivo PDF.\npassword_invalid=Contraseña inválida. Por favor, vuelva a intentarlo.\npassword_ok=Aceptar\npassword_cancel=Cancelar\n\nprinting_not_supported = Advertencia: Imprimir no está soportado completamente por este navegador.\nprinting_not_ready=Advertencia: El PDF no está completamente cargado para ser impreso.\nweb_fonts_disabled=Las fuentes web están desactivadas: imposible usar las fuentes PDF embebidas.\ndocument_colors_disabled=Los documentos PDF no tienen permitido usar sus propios colores: \\'Permitir a las páginas elegir sus propios colores\\' está desactivado en el navegador.\n"
  },
  {
    "path": "web/viewer/locale/es-ES/viewer.properties",
    "content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nprevious.title = Página anterior\nprevious_label = Anterior\nnext.title = Página siguiente\nnext_label = Siguiente\npage_label = Página:\npage_of = de {{pageCount}}\nzoom_out.title = Reducir\nzoom_out_label = Reducir\nzoom_in.title = Aumentar\nzoom_in_label = Aumentar\nzoom.title = Tamaño\npresentation_mode.title = Cambiar al modo presentación\npresentation_mode_label = Modo presentación\nopen_file.title = Abrir archivo\nopen_file_label = Abrir\nprint.title = Imprimir\nprint_label = Imprimir\ndownload.title = Descargar\ndownload_label = Descargar\nbookmark.title = Vista actual (copiar o abrir en una nueva ventana)\nbookmark_label = Vista actual\ntools.title = Herramientas\ntools_label = Herramientas\nfirst_page.title = Ir a la primera página\nfirst_page.label = Ir a la primera página\nfirst_page_label = Ir a la primera página\nlast_page.title = Ir a la última página\nlast_page.label = Ir a la última página\nlast_page_label = Ir a la última página\npage_rotate_cw.title = Rotar en sentido horario\npage_rotate_cw.label = Rotar en sentido horario\npage_rotate_cw_label = Rotar en sentido horario\npage_rotate_ccw.title = Rotar en sentido antihorario\npage_rotate_ccw.label = Rotar en sentido antihorario\npage_rotate_ccw_label = Rotar en sentido antihorario\nhand_tool_enable.title = Activar herramienta mano\nhand_tool_enable_label = Activar herramienta mano\nhand_tool_disable.title = Desactivar herramienta mano\nhand_tool_disable_label = Desactivar herramienta mano\ndocument_properties.title = Propiedades del documento…\ndocument_properties_label = Propiedades del documento…\ndocument_properties_file_name = Nombre de archivo:\ndocument_properties_file_size = Tamaño de archivo:\ndocument_properties_kb = {{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb = {{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title = Título:\ndocument_properties_author = Autor:\ndocument_properties_subject = Asunto:\ndocument_properties_keywords = Palabras clave:\ndocument_properties_creation_date = Fecha de creación:\ndocument_properties_modification_date = Fecha de modificación:\ndocument_properties_date_string = {{date}}, {{time}}\ndocument_properties_creator = Creador:\ndocument_properties_producer = Productor PDF:\ndocument_properties_version = Versión PDF:\ndocument_properties_page_count = Número de páginas:\ndocument_properties_close = Cerrar\ntoggle_sidebar.title = Cambiar barra lateral\ntoggle_sidebar_label = Cambiar barra lateral\noutline.title = Mostrar el esquema del documento\noutline_label = Esquema del documento\nattachments.title = Mostrar adjuntos\nattachments_label = Adjuntos\nthumbs.title = Mostrar miniaturas\nthumbs_label = Miniaturas\nfindbar.title = Buscar en el documento\nfindbar_label = Buscar\nthumb_page_title = Página {{page}}\nthumb_page_canvas = Miniatura de la página {{page}}\nfind_label = Buscar:\nfind_previous.title = Encontrar la anterior aparición de la frase\nfind_previous_label = Anterior\nfind_next.title = Encontrar la siguiente aparición de esta frase\nfind_next_label = Siguiente\nfind_highlight = Resaltar todos\nfind_match_case_label = Coincidencia de mayús./minús.\nfind_reached_top = Se alcanzó el inicio del documento, se continúa desde el final\nfind_reached_bottom = Se alcanzó el final del documento, se continúa desde el inicio\nfind_not_found = Frase no encontrada\nerror_more_info = Más información\nerror_less_info = Menos información\nerror_close = Cerrar\nerror_version_info = PDF.js v{{version}} (build: {{build}})\nerror_message = Mensaje: {{message}}\nerror_stack = Pila: {{stack}}\nerror_file = Archivo: {{file}}\nerror_line = Línea: {{line}}\nrendering_error = Ocurrió un error al renderizar la página.\npage_scale_width = Anchura de la página\npage_scale_fit = Ajuste de la página\npage_scale_auto = Tamaño automático\npage_scale_actual = Tamaño actual\nloading_error_indicator = Error\nloading_error = Ocurrió un error al cargar el PDF.\ninvalid_file_error = Fichero PDF no válido o corrupto.\nmissing_file_error = No hay fichero PDF.\ntext_annotation_type.alt = [Anotación {{type}}]\npassword_label = Introduzca la contraseña para abrir este archivo PDF.\npassword_invalid = Contraseña no válida. Vuelva a intentarlo.\npassword_ok = Aceptar\npassword_cancel = Cancelar\nprinting_not_supported = Advertencia: Imprimir no está totalmente soportado por este navegador.\nprinting_not_ready = Advertencia: Este PDF no se ha cargado completamente para poder imprimirse.\nweb_fonts_disabled = Las tipografías web están desactivadas: es imposible usar las tipografías PDF embebidas.\ndocument_colors_disabled = Los documentos PDF no tienen permitido usar sus propios colores: 'Permitir a las páginas elegir sus propios colores' está desactivado en el navegador.\n"
  },
  {
    "path": "web/viewer/locale/es-MX/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Página anterior\nprevious_label=Anterior\nnext.title=Página siguiente\nnext_label=Siguiente\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Página:\npage_of=de {{pageCount}}\n\nzoom_out.title=Reducir\nzoom_out_label=Reducir\nzoom_in.title=Aumentar\nzoom_in_label=Aumentar\nzoom.title=Zoom\npresentation_mode.title=Cambiar al modo presentación\npresentation_mode_label=Modo presentación\nopen_file.title=Abrir archivo\nopen_file_label=Abrir\nprint.title=Imprimir\nprint_label=Imprimir\ndownload.title=Descargar\ndownload_label=Descargar\nbookmark.title=Vista actual (copia o abierta en ventana nueva)\nbookmark_label=Vista actual\n\n# Secondary toolbar and context menu\ntools.title=Herramientas\ntools_label=Herramientas\nfirst_page.title=Ir a la primera página\nfirst_page.label=Ir a la primera página\nfirst_page_label=Ir a la primera página\nlast_page.title=Ir a la última página\nlast_page.label=Ir a la última página\nlast_page_label=Ir a la última página\npage_rotate_cw.title=Girar a la derecha\npage_rotate_cw.label=Girar a la derecha\npage_rotate_cw_label=Girar a la derecha\npage_rotate_ccw.title=Girar a la izquierda\npage_rotate_ccw.label=Girar a la izquierda\npage_rotate_ccw_label=Girar a la izquierda\n\nhand_tool_enable.title=Activar herramienta mano\nhand_tool_enable_label=Activar herramienta mano\nhand_tool_disable.title=Desactivar herramienta mano\nhand_tool_disable_label=Desactivar herramienta mano\n\n# Document properties dialog box\ndocument_properties.title=Propiedades del documento…\ndocument_properties_label=Propiedades del documento…\ndocument_properties_file_name=Nombre del archivo:\ndocument_properties_file_size=Tamaño del archivo:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Título:\ndocument_properties_author=Autor:\ndocument_properties_subject=Asunto:\ndocument_properties_keywords=Palabras claves:\ndocument_properties_creation_date=Fecha de creación:\ndocument_properties_modification_date=Fecha de modificación:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creador:\ndocument_properties_producer=Productor PDF:\ndocument_properties_version=Versión PDF:\ndocument_properties_page_count=Número de páginas:\ndocument_properties_close=Cerrar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Cambiar barra lateral\ntoggle_sidebar_label=Cambiar barra lateral\noutline.title=Mostrar esquema del documento\noutline_label=Esquema del documento\nthumbs.title=Mostrar miniaturas\nthumbs_label=Miniaturas\nfindbar.title=Buscar en el documento\nfindbar_label=Buscar\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Página {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura de la página {{page}}\n\n# Find panel button title and messages\nfind_label=Encontrar:\nfind_previous.title=Ir a la anterior frase encontrada\nfind_previous_label=Anterior\nfind_next.title=Ir a la siguiente frase encontrada\nfind_next_label=Siguiente\nfind_highlight=Resaltar todo\nfind_match_case_label=Coincidir con mayúsculas y minúsculas\nfind_reached_top=Se alcanzó el inicio del documento, se buscará al final\nfind_reached_bottom=Se alcanzó el final del documento, se buscará al inicio\nfind_not_found=No se encontró la frase\n\n# Error panel labels\nerror_more_info=Más información\nerror_less_info=Menos información\nerror_close=Cerrar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensaje: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Archivo: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Línea: {{line}}\nrendering_error=Un error ocurrió al renderizar la página.\n\n# Predefined zoom values\npage_scale_width=Ancho de página\npage_scale_fit=Ajustar página\npage_scale_auto=Zoom automático\npage_scale_actual=Tamaño real\n\n# Loading indicator messages\nloading_error_indicator=Error\nloading_error=Un error ocurrió al cargar el PDF.\ninvalid_file_error=Archivo PDF invalido o dañado.\nmissing_file_error=Archivo PDF no encontrado.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} anotación]\npassword_label=Ingresa la contraseña para abrir este archivo PDF.\npassword_invalid=Contraseña inválida. Por favor intenta de nuevo.\npassword_ok=Aceptar\npassword_cancel=Cancelar\n\nprinting_not_supported=Advertencia: La impresión no esta completamente soportada por este navegador.\nprinting_not_ready=Advertencia: El PDF no cargo completamente para impresión.\nweb_fonts_disabled=Las fuentes web están desactivadas: es imposible usar las fuentes PDF embebidas.\ndocument_colors_disabled=Los documentos PDF no tienen permiso de usar sus propios colores: 'Permitir que las páginas elijan sus propios colores' esta desactivada en el navegador.\n"
  },
  {
    "path": "web/viewer/locale/et/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Eelmine lehekülg\nprevious_label=Eelmine\nnext.title=Järgmine lehekülg\nnext_label=Järgmine\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Lehekülg:\npage_of=(kokku {{pageCount}})\n\nzoom_out.title=Vähenda\nzoom_out_label=Vähenda\nzoom_in.title=Suurenda\nzoom_in_label=Suurenda\nzoom.title=Suurendamine\npresentation_mode.title=Lülitu esitlusrežiimi\npresentation_mode_label=Esitlusrežiim\nopen_file.title=Ava fail\nopen_file_label=Ava\nprint.title=Prindi\nprint_label=Prindi\ndownload.title=Laadi alla\ndownload_label=Laadi alla\nbookmark.title=Praegune vaade (kopeeri või ava uues aknas)\nbookmark_label=Praegune vaade\n\n# Secondary toolbar and context menu\ntools.title=Tööriistad\ntools_label=Tööriistad\nfirst_page.title=Mine esimesele leheküljele\nfirst_page.label=Mine esimesele leheküljele\nfirst_page_label=Mine esimesele leheküljele\nlast_page.title=Mine viimasele leheküljele\nlast_page.label=Mine viimasele leheküljele\nlast_page_label=Mine viimasele leheküljele\npage_rotate_cw.title=Pööra päripäeva\npage_rotate_cw.label=Pööra päripäeva\npage_rotate_cw_label=Pööra päripäeva\npage_rotate_ccw.title=Pööra vastupäeva\npage_rotate_ccw.label=Pööra vastupäeva\npage_rotate_ccw_label=Pööra vastupäeva\n\nhand_tool_enable.title=Luba sirvimine\nhand_tool_enable_label=Luba sirvimine\nhand_tool_disable.title=Keela sirvimine\nhand_tool_disable_label=Keela sirvimine\n\n# Document properties dialog box\ndocument_properties.title=Dokumendi omadused…\ndocument_properties_label=Dokumendi omadused…\ndocument_properties_file_name=Faili nimi:\ndocument_properties_file_size=Faili suurus:\ndocument_properties_kb={{size_kb}} KiB ({{size_b}} baiti)\ndocument_properties_mb={{size_mb}} MiB ({{size_b}} baiti)\ndocument_properties_title=Pealkiri:\ndocument_properties_author=Autor:\ndocument_properties_subject=Teema:\ndocument_properties_keywords=Märksõnad:\ndocument_properties_creation_date=Loodud:\ndocument_properties_modification_date=Muudetud:\ndocument_properties_date_string={{date}} {{time}}\ndocument_properties_creator=Looja:\ndocument_properties_producer=Generaator:\ndocument_properties_version=Generaatori versioon:\ndocument_properties_page_count=Lehekülgi:\ndocument_properties_close=Sulge\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Näita külgriba\ntoggle_sidebar_label=Näita külgriba\noutline.title=Näita sisukorda\noutline_label=Näita sisukorda\nattachments.title=Näita manuseid\nattachments_label=Manused\nthumbs.title=Näita pisipilte\nthumbs_label=Pisipildid\nfindbar.title=Otsi dokumendist\nfindbar_label=Otsi\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}}. lehekülg\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}}. lehekülje pisipilt\n\n# Find panel button title and messages\nfind_label=Otsi:\nfind_previous.title=Otsi fraasi eelmine esinemiskoht\nfind_previous_label=Eelmine\nfind_next.title=Otsi fraasi järgmine esinemiskoht\nfind_next_label=Järgmine\nfind_highlight=Too kõik esile\nfind_match_case_label=Tõstutundlik\nfind_reached_top=Jõuti dokumendi algusesse, jätkati lõpust\nfind_reached_bottom=Jõuti dokumendi lõppu, jätkati algusest\nfind_not_found=Fraasi ei leitud\n\n# Error panel labels\nerror_more_info=Rohkem teavet\nerror_less_info=Vähem teavet\nerror_close=Sulge\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Teade: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fail: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rida: {{line}}\nrendering_error=Lehe renderdamisel esines viga.\n\n# Predefined zoom values\npage_scale_width=Mahuta laiusele\npage_scale_fit=Mahuta leheküljele\npage_scale_auto=Automaatne suurendamine\npage_scale_actual=Tegelik suurus\n\n# Loading indicator messages\nloading_error_indicator=Viga\nloading_error=PDFi laadimisel esines viga.\ninvalid_file_error=Vigane või rikutud PDF-fail.\nmissing_file_error=PDF-fail puudub.\n\n# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=PDF-faili avamiseks sisesta parool.\npassword_invalid=Vigane parool. Palun proovi uuesti.\npassword_ok=Sobib\npassword_cancel=Loobu\n\nprinting_not_supported=Hoiatus: printimine pole selle brauseri poolt täielikult toetatud.\nprinting_not_ready=Hoiatus: PDF pole printimiseks täielikult laaditud.\nweb_fonts_disabled=Veebifondid on keelatud: PDFiga kaasatud fonte pole võimalik kasutada.\ndocument_colors_disabled=PDF-dokumentidel pole oma värvide kasutamine lubatud: \\'Veebilehtedel on lubatud kasutada oma värve\\' on brauseris deaktiveeritud.\n"
  },
  {
    "path": "web/viewer/locale/eu/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Aurreko orria\nprevious_label=Aurrekoa\nnext.title=Hurrengo orria\nnext_label=Hurrengoa\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Orria:\npage_of=/ {{pageCount}}\n\nzoom_out.title=Urrundu zooma\nzoom_out_label=Urrundu zooma\nzoom_in.title=Gerturatu zooma\nzoom_in_label=Gerturatu zooma\nzoom.title=Zooma\npresentation_mode.title=Aldatu aurkezpen modura\npresentation_mode_label=Arkezpen modua\nopen_file.title=Ireki fitxategia\nopen_file_label=Ireki\nprint.title=Inprimatu\nprint_label=Inprimatu\ndownload.title=Deskargatu\ndownload_label=Deskargatu\nbookmark.title=Uneko ikuspegia (kopiatu edo ireki leiho berrian)\nbookmark_label=Uneko ikuspegia\n\n# Secondary toolbar and context menu\ntools.title=Tresnak\ntools_label=Tresnak\nfirst_page.title=Joan lehen orrira\nfirst_page.label=Joan lehen orrira\nfirst_page_label=Joan lehen orrira\nlast_page.title=Joan azken orrira\nlast_page.label=Joan azken orrira\nlast_page_label=Joan azken orrira\npage_rotate_cw.title=Biratu erlojuaren norantzan\npage_rotate_cw.label=Biratu erlojuaren norantzan\npage_rotate_cw_label=Biratu erlojuaren norantzan\npage_rotate_ccw.title=Biratu erlojuaren aurkako norantzan\npage_rotate_ccw.label=Biratu erlojuaren aurkako norantzan\npage_rotate_ccw_label=Biratu erlojuaren aurkako norantzan\n\nhand_tool_enable.title=Gaitu eskuaren tresna\nhand_tool_enable_label=Gaitu eskuaren tresna\nhand_tool_disable.title=Desgaitu eskuaren tresna\nhand_tool_disable_label=Desgaitu eskuaren tresna\n\n# Document properties dialog box\ndocument_properties.title=Dokumentuaren propietateak…\ndocument_properties_label=Dokumentuaren propietateak…\ndocument_properties_file_name=Fitxategi-izena:\ndocument_properties_file_size=Fitxategiaren tamaina:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} byte)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} byte)\ndocument_properties_title=Izenburua:\ndocument_properties_author=Egilea:\ndocument_properties_subject=Gaia:\ndocument_properties_keywords=Gako-hitzak:\ndocument_properties_creation_date=Sortze-data:\ndocument_properties_modification_date=Aldatze-data:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Sortzailea:\ndocument_properties_producer=PDFaren ekoizlea:\ndocument_properties_version=PDF bertsioa:\ndocument_properties_page_count=Orrialde kopurua:\ndocument_properties_close=Itxi\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Txandakatu alboko barra\ntoggle_sidebar_label=Txandakatu alboko barra\noutline.title=Erakutsi dokumentuaren eskema\noutline_label=Dokumentuaren eskema\nattachments.title=Erakutsi eranskinak\nattachments_label=Eranskinak\nthumbs.title=Erakutsi koadro txikiak\nthumbs_label=Koadro txikiak\nfindbar.title=Bilatu dokumentuan\nfindbar_label=Bilatu\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}}. orria\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}}. orriaren koadro txikia\n\n# Find panel button title and messages\nfind_label=Bilatu:\nfind_previous.title=Bilatu esaldiaren aurreko parekatzea\nfind_previous_label=Aurrekoa\nfind_next.title=Bilatu esaldiaren hurrengo parekatzea\nfind_next_label=Hurrengoa\nfind_highlight=Nabarmendu guztia\nfind_match_case_label=Bat etorri maiuskulekin/minuskulekin\nfind_reached_top=Dokumentuaren hasierara heldu da, bukaeratik jarraitzen\nfind_reached_bottom=Dokumentuaren bukaerara heldu da, hasieratik jarraitzen\nfind_not_found=Esaldia ez da aurkitu\n\n# Error panel labels\nerror_more_info=Informazio gehiago\nerror_less_info=Informazio gutxiago\nerror_close=Itxi\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (eraikuntza: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mezua: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fitxategia: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Lerroa: {{line}}\nrendering_error=Errorea gertatu da orria errendatzean.\n\n# Predefined zoom values\npage_scale_width=Orriaren zabalera\npage_scale_fit=Doitu orrira\npage_scale_auto=Zoom automatikoa\npage_scale_actual=Benetako tamaina\n\n# Loading indicator messages\nloading_error_indicator=Errorea\nloading_error=Errorea gertatu da PDFa kargatzean.\ninvalid_file_error=PDF fitxategi baliogabe edo hondatua.\nmissing_file_error=PDF fitxategia falta da.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} ohartarazpena]\npassword_label=Idatzi PDF fitxategi hau irekitzeko pasahitza.\npassword_invalid=Pasahitz baliogabea. Saiatu berriro mesedez.\npassword_ok=Ados\npassword_cancel=Utzi\n\nprinting_not_supported=Abisua: inprimatzeko euskarria ez da erabatekoa nabigatzaile honetan.\nprinting_not_ready=Abisua: PDFa ez dago erabat kargatuta inprimatzeko.\nweb_fonts_disabled=Webeko letra-tipoak desgaituta daude: ezin dira kapsulatutako PDF letra-tipoak erabili.\ndocument_colors_disabled=PDF dokumentuek ez dute beraien koloreak erabiltzeko baimenik: 'Baimendu orriak beraien letra-tipoak aukeratzea' desaktibatuta dago nabigatzailean.\n"
  },
  {
    "path": "web/viewer/locale/fa/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=صفحهٔ قبلی\nnext.title=صفحهٔ بعدی\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=صفحه:\npage_of=از {{pageCount}}\n\nzoom_out.title=کوچک‌نمایی\nzoom_out_label=کوچک‌نمایی\nzoom_in.title=بزرگ‌نمایی\nzoom_in_label=بزرگ‌نمایی\nzoom.title=زوم\npresentation_mode.title=تغییر به حالت ارائه\npresentation_mode_label=حالت ارائه\nopen_file.title=باز کردن پرونده\nopen_file_label=باز کردن\nprint.title=چاپ\nprint_label=چاپ\ndownload.title=بارگیری\ndownload_label=بارگیری\nbookmark.title=نمای فعلی (کپی کن، یا در پنجرۀ دیگری نشان بده)\nbookmark_label=نمای فعلی\n\n# Secondary toolbar and context menu\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\noutline.title=نمایش طرح نوشتار\noutline_label=طرح نوشتار\nthumbs.title=نمایش تصاویر بندانگشتی\nthumbs_label=تصاویر بندانگشتی\nfindbar_label=پیدا کردن\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=صفحه {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=تصویر بند‌ انگشتی صفحه {{page}}\n\n# Find panel button title and messages\nfind_previous.title=پیدا کردن رخداد قبلی عبارت\nfind_next.title=پیدا کردن رخداد بعدی عبارت\nfind_not_found=عبارت پیدا نشد\n\n# Error panel labels\nerror_more_info=اطلاعات بیشتر\nerror_less_info=اطلاعات کمتر\nerror_close=بستن\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=پیام: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=توده: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=پرونده: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=سطر: {{line}}\nrendering_error=هنگام بارگیری صفحه خطایی رخ داد.\n\n# Predefined zoom values\npage_scale_width=عرض صفحه\npage_scale_fit=اندازه کردن صفحه\npage_scale_auto=بزرگنمایی خودکار\npage_scale_actual=اندازه واقعی‌\n\n# Loading indicator messages\nloading_error_indicator=خطا\nloading_error=هنگام بارگیری پرونده (PDF) خطایی رخ داد.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_ok=تأیید\npassword_cancel=انصراف\n\nprinting_not_supported=هشدار: قابلیت چاپ به‌طور کامل در این مرورگر پشتیبانی نمی‌شود.\n"
  },
  {
    "path": "web/viewer/locale/ff/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Hello Ɓennungo\nprevious_label=Ɓennuɗo\nnext.title=Hello faango\nnext_label=Yeeso\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Hello:\npage_of=e nder {{pageCount}}\n\nzoom_out.title=Lonngo Woɗɗa\nzoom_out_label=Lonngo Woɗɗa\nzoom_in.title=Lonngo Ara\nzoom_in_label=Lonngo Ara\nzoom.title=Lonngo\npresentation_mode.title=Faytu to  Presentation Mode\npresentation_mode_label=Presentation Mode\nopen_file.title=Uddit Fiilde\nopen_file_label=Uddit\nprint.title=Winndito\nprint_label=Winndito\ndownload.title=Aawto\ndownload_label=Aawto\nbookmark.title=Jiytol gonangol (natto walla uddit e henorde)\nbookmark_label=Jiytol Gonangol\n\n# Secondary toolbar and context menu\ntools.title=Kuutorɗe\ntools_label=Kuutorɗe\nfirst_page.title=Yah to hello adanngo\nfirst_page.label=Yah to hello adanngo\nfirst_page_label=Yah to hello adanngo\nlast_page.title=Yah to hello wattindiingo\nlast_page.label=Yah to hello wattindiingo\nlast_page_label=Yah to hello wattindiingo\npage_rotate_cw.title=Yiiltu Faya Ñaamo\npage_rotate_cw.label=Yiiltu Faya Ñaamo\npage_rotate_cw_label=Yiiltu Faya Ñaamo\npage_rotate_ccw.title=Yiiltu Faya Nano\npage_rotate_ccw.label=Yiiltu Faya Nano\npage_rotate_ccw_label=Yiiltu Faya Nano\n\nhand_tool_enable.title=Hurmin kuutorgal junngo\nhand_tool_enable_label=Hurmin kuutorgal junngo\nhand_tool_disable.title=Daaƴ kuutorgal junngo\nhand_tool_disable_label=Daaƴ kuutorgal junngo\n\n# Document properties dialog box\ndocument_properties.title=Keeroraaɗi Winndannde…\ndocument_properties_label=Keeroraaɗi Winndannde…\ndocument_properties_file_name=Innde fiilde:\ndocument_properties_file_size=Ɓetol fiilde:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bite)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bite)\ndocument_properties_title=Tiitoonde:\ndocument_properties_author=Binnduɗo:\ndocument_properties_subject=Toɓɓere:\ndocument_properties_keywords=Kelmekele jiytirɗe:\ndocument_properties_creation_date=Ñalnde Sosaa:\ndocument_properties_modification_date=Ñalnde Waylaa:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Cosɗo:\ndocument_properties_producer=Paggiiɗo PDF:\ndocument_properties_version=Yamre PDF:\ndocument_properties_page_count=Limoore Kelle:\ndocument_properties_close=Uddu\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Toggilo Palal Sawndo\ntoggle_sidebar_label=Toggilo Palal Sawndo\noutline.title=Hollu Toɓɓe Fiilannde\noutline_label=Toɓɓe Fiilannde\nattachments.title=Hollu Ɗisanɗe\nattachments_label=Ɗisanɗe\nthumbs.title=Hollu Dooɓe\nthumbs_label=Dooɓe\nfindbar.title=Yiylo e fiilannde\nfindbar_label=Yiytu\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Hello {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Dooɓre Hello {{page}}\n\n# Find panel button title and messages\nfind_label=Yiytu:\nfind_previous.title=Yiylo cilol ɓennugol konngol ngol\nfind_previous_label=Ɓennuɗo\nfind_next.title=Yiylo cilol garowol konngol ngol\nfind_next_label=Yeeso\nfind_highlight=Jalbin fof\nfind_match_case_label=Jaaɓnu darnde\nfind_reached_top=Heɓii fuɗɗorde fiilannde, jokku faya les\nfind_reached_bottom=Heɓii hoore fiilannde, jokku faya les\nfind_not_found=Konngi njiyataa\n\n# Error panel labels\nerror_more_info=Ɓeydu Humpito\nerror_less_info=Ustu Humpito\nerror_close=Uddu\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Ɓatakuure: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fiilde: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Gorol: {{line}}\nrendering_error=Juumre waɗii tuma nde yoŋkittoo hello.\n\n# Predefined zoom values\npage_scale_width=Njaajeendi Hello\npage_scale_fit=Keƴeendi Hello\npage_scale_auto=Loongorde Jaajol\npage_scale_actual=Ɓetol Jaati\n\n# Loading indicator messages\nloading_error_indicator=Juumre\nloading_error=Juumre waɗii tuma nde loowata PDF oo.\ninvalid_file_error=Fiilde PDF moƴƴaani walla jiibii.\nmissing_file_error=Fiilde PDF ena ŋakki.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Siiftannde]\npassword_label=Naatu finnde ngam uddite ndee fiilde PDF.\npassword_invalid=Finnde moƴƴaani. Tiiɗno eto kadi.\npassword_ok=OK\npassword_cancel=Haaytu\n\nprinting_not_supported=Reentino: Winnditagol tammbitaaka no feewi e ndee wanngorde.\nprinting_not_ready=Reentino: PDF oo loowaaki haa timmi ngam winnditagol.\nweb_fonts_disabled=Ponte geese ko daaƴaaɗe: horiima huutoraade ponte PDF coomtoraaɗe.\ndocument_colors_disabled=Piilanɗe PDF njamiraaka yoo kuutoro goobuuji mum'en keeriiɗi: 'Yamir kello yoo kuutoro goobuuki keeriiɗi' koko daaƴaa e wanngorde ndee.\n"
  },
  {
    "path": "web/viewer/locale/fi/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Edellinen sivu\nprevious_label=Edellinen\nnext.title=Seuraava sivu\nnext_label=Seuraava\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Sivu:\npage_of=/ {{pageCount}}\n\nzoom_out.title=Loitonna\nzoom_out_label=Loitonna\nzoom_in.title=Lähennä\nzoom_in_label=Lähennä\nzoom.title=Suurennus\npresentation_mode.title=Siirry esitystilaan\npresentation_mode_label=Esitystila\nopen_file.title=Avaa tiedosto\nopen_file_label=Avaa\nprint.title=Tulosta\nprint_label=Tulosta\ndownload.title=Lataa\ndownload_label=Lataa\nbookmark.title=Avoin ikkuna (kopioi tai avaa uuteen ikkunaan)\nbookmark_label=Avoin ikkuna\n\n# Secondary toolbar and context menu\ntools.title=Tools\ntools_label=Tools\nfirst_page.title=Siirry ensimmäiselle sivulle\nfirst_page.label=Siirry ensimmäiselle sivulle\nfirst_page_label=Siirry ensimmäiselle sivulle\nlast_page.title=Siirry viimeiselle sivulle\nlast_page.label=Siirry viimeiselle sivulle\nlast_page_label=Siirry viimeiselle sivulle\npage_rotate_cw.title=Kierrä oikealle\npage_rotate_cw.label=Kierrä oikealle\npage_rotate_cw_label=Kierrä oikealle\npage_rotate_ccw.title=Kierrä vasemmalle\npage_rotate_ccw.label=Kierrä vasemmalle\npage_rotate_ccw_label=Kierrä vasemmalle\n\nhand_tool_enable.title=Käytä käsityökalua\nhand_tool_enable_label=Käytä käsityökalua\nhand_tool_disable.title=Poista käsityökalu käytöstä\nhand_tool_disable_label=Poista käsityökalu käytöstä\n\n# Document properties dialog box\ndocument_properties.title=Dokumentin ominaisuudet…\ndocument_properties_label=Dokumentin ominaisuudet…\ndocument_properties_file_name=Tiedostonimi:\ndocument_properties_file_size=Tiedoston koko:\ndocument_properties_kb={{size_kb}} kt ({{size_b}} tavua)\ndocument_properties_mb={{size_mb}} Mt ({{size_b}} tavua)\ndocument_properties_title=Otsikko:\ndocument_properties_author=Tekijä:\ndocument_properties_subject=Aihe:\ndocument_properties_keywords=Avainsanat:\ndocument_properties_creation_date=Luomispäivämäärä:\ndocument_properties_modification_date=Muokkauspäivämäärä:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Luoja:\ndocument_properties_producer=PDF-tuottaja:\ndocument_properties_version=PDF-versio:\ndocument_properties_page_count=Sivujen määrä:\ndocument_properties_close=Sulje\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Näytä/piilota sivupaneeli\ntoggle_sidebar_label=Näytä/piilota sivupaneeli\noutline.title=Näytä dokumentin rakenne\noutline_label=Dokumentin rakenne\nattachments.title=Näytä liitteet\nattachments_label=Liitteet\nthumbs.title=Näytä pienoiskuvat\nthumbs_label=Pienoiskuvat\nfindbar.title=Etsi dokumentista\nfindbar_label=Etsi\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Sivu {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Pienoiskuva sivusta {{page}}\n\n# Find panel button title and messages\nfind_label=Etsi:\nfind_previous.title=Etsi hakusanan edellinen osuma\nfind_previous_label=Edellinen\nfind_next.title=Etsi hakusanan seuraava osuma\nfind_next_label=Seuraava\nfind_highlight=Korosta kaikki\nfind_match_case_label=Huomioi kirjainkoko\nfind_reached_top=Päästiin dokumentin alkuun, jatketaan lopusta\nfind_reached_bottom=Päästiin dokumentin loppuun, continued from top\nfind_not_found=Hakusanaa ei löytynyt\n\n# Error panel labels\nerror_more_info=Lisätietoja\nerror_less_info=Lisätietoja\nerror_close=Sulje\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (kooste: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Virheilmoitus: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pino: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Tiedosto: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rivi: {{line}}\nrendering_error=Tapahtui virhe piirrettäessä sivua.\n\n# Predefined zoom values\npage_scale_width=Sivun leveys\npage_scale_fit=Koko sivu\npage_scale_auto=Automaattinen suurennus\npage_scale_actual=Todellinen koko\n\n# Loading indicator messages\nloading_error_indicator=Virhe\nloading_error=Tapahtui virhe ladattaessa PDF-tiedostoa.\ninvalid_file_error=Virheellinen tai vioittunut PDF-tiedosto.\nmissing_file_error=Puuttuva PDF-tiedosto.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=Kirjoita PDF-tiedoston salasana.\npassword_invalid=Virheellinen salasana. Yritä uudestaan.\npassword_ok=OK\npassword_cancel=Peruuta\n\nprinting_not_supported=Varoitus: Selain ei tue kaikkia tulostustapoja.\nprinting_not_ready=Varoitus: PDF-tiedosto ei ole vielä latautunut kokonaan, eikä sitä voi vielä tulostaa.\nweb_fonts_disabled=Verkkosivujen omat kirjasinlajit on estetty: ei voida käyttää upotettuja PDF-kirjasinlajeja.\ndocument_colors_disabled=PDF-dokumenttien ei ole sallittua käyttää omia värejään: Asetusta \\\"Sivut saavat käyttää omia värejään oletusten sijaan\\\" ei ole valittu selaimen asetuksissa.\n"
  },
  {
    "path": "web/viewer/locale/fr/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Page précédente\nprevious_label=Précédent\nnext.title=Page suivante\nnext_label=Suivant\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Page :\npage_of=sur {{pageCount}}\n\nzoom_out.title=Zoom arrière\nzoom_out_label=Zoom arrière\nzoom_in.title=Zoom avant\nzoom_in_label=Zoom avant\nzoom.title=Zoom\npresentation_mode.title=Basculer en mode présentation\npresentation_mode_label=Mode présentation\nopen_file.title=Ouvrir le fichier\nopen_file_label=Ouvrir le fichier\nprint.title=Imprimer\nprint_label=Imprimer\ndownload.title=Télécharger\ndownload_label=Télécharger\nbookmark.title=Affichage courant (copier ou ouvrir dans une nouvelle fenêtre)\nbookmark_label=Affichage actuel\n\n# Secondary toolbar and context menu\ntools.title=Outils\ntools_label=Outils\nfirst_page.title=Aller à la première page\nfirst_page.label=Aller à la première page\nfirst_page_label=Aller à la première page\nlast_page.title=Aller à la dernière page\nlast_page.label=Aller à la dernière page\nlast_page_label=Aller à la dernière page\npage_rotate_cw.title=Rotation horaire\npage_rotate_cw.label=Rotation horaire\npage_rotate_cw_label=Rotation horaire\npage_rotate_ccw.title=Rotation anti-horaire\npage_rotate_ccw.label=Rotation anti-horaire\npage_rotate_ccw_label=Rotation anti-horaire\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Afficher/Masquer le panneau latéral\ntoggle_sidebar_label=Afficher/Masquer le panneau latéral\noutline.title=Afficher les signets\noutline_label=Signets du document\nattachments.title=Afficher les pièces jointes\nattachments_label=Pièces jointes\nthumbs.title=Afficher les vignettes\nthumbs_label=Vignettes\nfindbar.title=Rechercher dans le document\nfindbar_label=Rechercher\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Page {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Vignette de la page {{page}}\n\nhand_tool_enable.title=Activer l'outil main\nhand_tool_enable_label=Activer l'outil main\nhand_tool_disable.title=Désactiver l'outil main\nhand_tool_disable_label=Désactiver l'outil main\n\n# Document properties dialog box\ndocument_properties.title=Propriétés du document…\ndocument_properties_label=Propriétés du document…\ndocument_properties_file_name=Nom du fichier :\ndocument_properties_file_size=Taille du fichier :\ndocument_properties_kb={{size_kb}} Ko ({{size_b}} octets)\ndocument_properties_mb={{size_mb}} Mo ({{size_b}} octets)\ndocument_properties_title=Titre :\ndocument_properties_author=Auteur :\ndocument_properties_subject=Sujet :\ndocument_properties_keywords=Mots-clés :\ndocument_properties_creation_date=Date de création :\ndocument_properties_modification_date=Modifié le :\ndocument_properties_date_string={{date}} à {{time}}\ndocument_properties_creator=Créé par :\ndocument_properties_producer=Outil de conversion PDF :\ndocument_properties_version=Version PDF :\ndocument_properties_page_count=Nombre de pages :\ndocument_properties_close=Fermer\n\n# Find panel button title and messages\nfind_label=Rechercher :\nfind_previous.title=Trouver l'occurrence précédente de la phrase\nfind_previous_label=Précédent\nfind_next.title=Trouver la prochaine occurrence de la phrase\nfind_next_label=Suivant\nfind_highlight=Tout surligner\nfind_match_case_label=Respecter la casse\nfind_reached_top=Haut de la page atteint, poursuite depuis la fin\nfind_reached_bottom=Bas de la page atteint, poursuite au début\nfind_not_found=Phrase introuvable\n\n# Error panel labels\nerror_more_info=Plus d'informations\nerror_less_info=Moins d'informations\nerror_close=Fermer\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (identifiant de compilation : {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Message : {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pile : {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fichier : {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Ligne : {{line}}\nrendering_error=Une erreur s'est produite lors de l'affichage de la page.\n\n# Predefined zoom values\npage_scale_width=Pleine largeur\npage_scale_fit=Page entière\npage_scale_auto=Zoom automatique\npage_scale_actual=Taille réelle\n\n# Loading indicator messages\nloading_error_indicator=Erreur\nloading_error=Une erreur s'est produite lors du chargement du fichier PDF.\ninvalid_file_error=Fichier PDF invalide ou corrompu.\nmissing_file_error=Fichier PDF manquant.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Annotation {{type}}]\npassword_label=Veuillez saisir le mot de passe pour ouvrir ce fichier PDF.\npassword_invalid=Mot de passe incorrect. Veuillez réessayer.\npassword_ok=OK\npassword_cancel=Annuler\n\nprinting_not_supported=Attention : l'impression n'est pas totalement prise en charge par ce navigateur.\nprinting_not_ready=Attention : le PDF n'est pas entièrement chargé pour pouvoir l'imprimer.\nweb_fonts_disabled=Les polices web sont désactivées : impossible d'utiliser les polices intégrées au PDF.\ndocument_colors_disabled=Les documents PDF ne peuvent pas utiliser leurs propres couleurs : « Autoriser les pages web à utiliser leurs propres couleurs » est désactivé dans le navigateur.\n"
  },
  {
    "path": "web/viewer/locale/fy-NL/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Foarige side\nprevious_label=Foarige\nnext.title=Folgjende side\nnext_label=Folgjende\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=side:\npage_of=fan {{pageCount}}\n\nzoom_out.title=Utzoome\nzoom_out_label=Utzoome\nzoom_in.title=Ynzoome\nzoom_in_label=Ynzoome\nzoom.title=Zoome\nprint.title=Ofdrukke\nprint_label=Ofdrukke\npresentation_mode.title=Wikselje nei presintaasjemoadus\npresentation_mode_label=Presintaasjemoadus\nopen_file.title=Bestân iepenje\nopen_file_label=Iepenje\ndownload.title=Ynlade\ndownload_label=Ynlade\nbookmark.title=Aktuele finster (kopiearje of iepenje yn nij finster)\nbookmark_label=Aktuele finster\n\n# Secondary toolbar and context menu\ntools.title=Ark\ntools_label=Ark\nfirst_page.title=Gean nei earste side\nfirst_page.label=Gean nei earste side\nfirst_page_label=Gean nei earste side\nlast_page.title=Gean nei lêste side\nlast_page.label=Gean nei lêste side\nlast_page_label=Gean nei lêste v\npage_rotate_cw.title=Rjochtsom draaie\npage_rotate_cw.label=Rjochtsom draaie\npage_rotate_cw_label=Rjochtsom draaie\npage_rotate_ccw.title=Linksom draaie\npage_rotate_ccw.label=Linksom draaie\npage_rotate_ccw_label=Linksom draaie\n\nhand_tool_enable.title=Hânark ynskeakelje\nhand_tool_enable_label=Hânark ynskeakelje\nhand_tool_disable.title=Hânark úyskeakelje\nhand_tool_disable_label=Hânark úyskeakelje\n\n# Document properties dialog box\ndocument_properties.title=Dokuminteigenskippen…\ndocument_properties_label=Dokuminteigenskippen…\ndocument_properties_file_name=Bestânsnamme:\ndocument_properties_file_size=Bestânsgrutte:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Titel:\ndocument_properties_author=Auteur:\ndocument_properties_subject=Underwerp:\ndocument_properties_keywords=Kaaiwurden:\ndocument_properties_creation_date=Oanmaakdatum:\ndocument_properties_modification_date=Bewurkingsdatum:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Makker:\ndocument_properties_producer=PDF-makker:\ndocument_properties_version=PDF-ferzje:\ndocument_properties_page_count=Siden:\ndocument_properties_close=Slute\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Sidebalke yn-/útskeakelje\ntoggle_sidebar_label=Sidebalke yn-/útskeakelje\noutline.title=Dokumint ynhâldsopjefte toane\noutline_label=Dokumint ynhâldsopjefte\nattachments.title=Bylagen toane\nattachments_label=Bylagen\nthumbs.title=Foarbylden toane\nthumbs_label=Foarbylden\nfindbar.title=Sykje yn dokumint\nfindbar_label=Sykje\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Side {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Foarbyld fan side {{page}}\n\n# Context menu\nfirst_page.label=Nei earste side gean\nlast_page.label=Nei lêste side gean\npage_rotate_cw.label=Rjochtsom draaie\npage_rotate_ccw.label=Linksom draaie\n\n# Find panel button title and messages\nfind_label=Sykje:\nfind_previous.title=It foarige foarkommen fan de tekst sykje\nfind_previous_label=Foarige\nfind_next.title=It folgjende foarkommen fan de tekst sykje\nfind_next_label=Folgjende\nfind_highlight=Alles markearje\nfind_match_case_label=Haadlettergefoelich\nfind_reached_top=Boppekant fan dokumint berikt, trochgien fanôf ûnderkant\nfind_reached_bottom=Ein fan dokumint berikt, trochgien fanôf boppekant\nfind_not_found=Tekst net fûn\n\n# Error panel labels\nerror_more_info=Mear ynformaasje\nerror_less_info=Minder ynformaasje\nerror_close=Slute\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Berjocht: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Bestân: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rigel: {{line}}\nrendering_error=Der is in flater bard by it renderjen fan de side.\n\n# Predefined zoom values\npage_scale_width=Sidebreedte\npage_scale_fit=Hiele side\npage_scale_auto=Automatysk zoome\npage_scale_actual=Wurklike grutte\n\n# Loading indicator messages\nloading_error_indicator=Flater\nloading_error=Der is in flater bard by it laden fan de PDF.\ninvalid_file_error=Ynfalide of korruptearre PDF-bestân.\nmissing_file_error=PDF-bestân ûntbrekt.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=Jou it wachtwurd om dit PDF-bestân te iepenjen.\npassword_invalid=Ferkeard wachtwurd. Probearje opnij.\npassword_ok=OK\npassword_cancel=Annulearje\n\nprinting_not_supported=Warning: Printing is net folslein stipe troch dizze browser.\nprinting_not_ready=Warning: PDF is net folslein laden om ôf te drukken.\nweb_fonts_disabled=Weblettertypen binne útskeakele: gebrûk fan ynsluten PDF-lettertypen is net mooglik.\ndocument_colors_disabled=PDF-dokuminten binne net tastien om har eigen kleuren te brûken: \\'Siden tastean har eigen kleuren te kiezen\\' is útskeakele yn de browser.\n"
  },
  {
    "path": "web/viewer/locale/ga-IE/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=An Leathanach Roimhe Seo\nprevious_label=Roimhe Seo\nnext.title=An Chéad Leathanach Eile\nnext_label=Ar Aghaidh\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Leathanach:\npage_of=as {{pageCount}}\n\nzoom_out.title=Súmáil Amach\nzoom_out_label=Súmáil Amach\nzoom_in.title=Súmáil Isteach\nzoom_in_label=Súmáil Isteach\nzoom.title=Súmáil\npresentation_mode.title=Úsáid an Mód Láithreoireachta\npresentation_mode_label=Mód Láithreoireachta\nopen_file.title=Oscail Comhad\nopen_file_label=Oscail\nprint.title=Priontáil\nprint_label=Priontáil\ndownload.title=Íosluchtaigh\ndownload_label=Íosluchtaigh\nbookmark.title=An t-amharc reatha (cóipeáil nó oscail i bhfuinneog nua)\nbookmark_label=An tAmharc Reatha\n\n# Secondary toolbar and context menu\ntools.title=Uirlisí\ntools_label=Uirlisí\nfirst_page.title=Go dtí an chéad leathanach\nfirst_page.label=Go dtí an chéad leathanach\nfirst_page_label=Go dtí an chéad leathanach\nlast_page.title=Go dtí an leathanach deiridh\nlast_page.label=Go dtí an leathanach deiridh\nlast_page_label=Go dtí an leathanach deiridh\npage_rotate_cw.title=Rothlaigh ar deiseal\npage_rotate_cw.label=Rothlaigh ar deiseal\npage_rotate_cw_label=Rothlaigh ar deiseal\npage_rotate_ccw.title=Rothlaigh ar tuathal\npage_rotate_ccw.label=Rothlaigh ar tuathal\npage_rotate_ccw_label=Rothlaigh ar tuathal\n\nhand_tool_enable.title=Cumasaigh uirlis láimhe\nhand_tool_enable_label=Cumasaigh uirlis láimhe\nhand_tool_disable.title=Díchumasaigh uirlis láimhe\nhand_tool_disable_label=Díchumasaigh uirlis láimhe\n\n# Document properties dialog box\ndocument_properties.title=Airíonna na Cáipéise…\ndocument_properties_label=Airíonna na Cáipéise…\ndocument_properties_file_name=Ainm an chomhaid:\ndocument_properties_file_size=Méid an chomhaid:\ndocument_properties_kb={{size_kb}} kB ({{size_b}} beart)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} beart)\ndocument_properties_title=Teideal:\ndocument_properties_author=Údar:\ndocument_properties_subject=Ábhar:\ndocument_properties_keywords=Eochairfhocail:\ndocument_properties_creation_date=Dáta Cruthaithe:\ndocument_properties_modification_date=Dáta Athraithe:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Cruthaitheoir:\ndocument_properties_producer=Cruthaitheoir an PDF:\ndocument_properties_version=Leagan PDF:\ndocument_properties_page_count=Líon Leathanach:\ndocument_properties_close=Dún\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Scoránaigh an Barra Taoibh\ntoggle_sidebar_label=Scoránaigh an Barra Taoibh\noutline.title=Taispeáin Creatlach na Cáipéise\noutline_label=Creatlach na Cáipéise\nattachments.title=Taispeáin Iatáin\nattachments_label=Iatáin\nthumbs.title=Taispeáin Mionsamhlacha\nthumbs_label=Mionsamhlacha\nfindbar.title=Aimsigh sa Cháipéis\nfindbar_label=Aimsigh\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Leathanach {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Mionsamhail Leathanaigh {{page}}\n\n# Find panel button title and messages\nfind_label=Aimsigh:\nfind_previous.title=Aimsigh an sampla roimhe seo den nath seo\nfind_previous_label=Roimhe seo\nfind_next.title=Aimsigh an chéad sampla eile den nath sin\nfind_next_label=Ar aghaidh\nfind_highlight=Aibhsigh uile\nfind_match_case_label=Cásíogair\nfind_reached_top=Ag barr na cáipéise, ag leanúint ón mbun\nfind_reached_bottom=Ag bun na cáipéise, ag leanúint ón mbarr\nfind_not_found=Abairtín gan aimsiú\n\n# Error panel labels\nerror_more_info=Tuilleadh Eolais\nerror_less_info=Níos Lú Eolais\nerror_close=Dún\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Teachtaireacht: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Cruach: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Comhad: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Líne: {{line}}\nrendering_error=Tharla earráid agus an leathanach á leagan amach.\n\n# Predefined zoom values\npage_scale_width=Leithead Leathanaigh\npage_scale_fit=Laghdaigh go dtí an Leathanach\npage_scale_auto=Súmáil Uathoibríoch\npage_scale_actual=Fíormhéid\n\n# Loading indicator messages\nloading_error_indicator=Earráid\nloading_error=Tharla earráid agus an cháipéis PDF á luchtú.\ninvalid_file_error=Comhad neamhbhailí nó truaillithe PDF.\nmissing_file_error=Comhad PDF ar iarraidh.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anótáil {{type}}]\npassword_label=Cuir an focal faire isteach chun an comhad PDF seo a oscailt.\npassword_invalid=Focal faire mícheart. Déan iarracht eile.\npassword_ok=OK\npassword_cancel=Cealaigh\n\nprinting_not_supported=Rabhadh: Ní thacaíonn an brabhsálaí le priontáil go hiomlán.\nprinting_not_ready=Rabhadh: Ní féidir an PDF a phriontáil go dtí go mbeidh an cháipéis iomlán luchtaithe.\nweb_fonts_disabled=Tá clófhoirne Gréasáin díchumasaithe: ní féidir clófhoirne leabaithe PDF a úsáid.\ndocument_colors_disabled=Níl cead ag cáipéisí PDF a ndathanna féin a roghnú; tá 'Tabhair cead do leathanaigh a ndathanna féin a roghnú' díchumasaithe sa mbrabhsálaí.\n"
  },
  {
    "path": "web/viewer/locale/gd/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=An duilleag roimhe\nprevious_label=Air ais\nnext.title=An ath-dhuilleag\nnext_label=Air adhart\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Duilleag:\npage_of=à {{pageCount}}\n\nzoom_out.title=Sùm a-mach\nzoom_out_label=Sùm a-mach\nzoom_in.title=Sùm a-steach\nzoom_in_label=Sùm a-steach\nzoom.title=Sùm\npresentation_mode.title=Gearr leum dhan mhodh taisbeanaidh\npresentation_mode_label=Am modh taisbeanaidh\nopen_file.title=Fosgail faidhle\nopen_file_label=Fosgail\nprint.title=Clò-bhuail\nprint_label=Clò-bhuail\ndownload.title=Luchdaich a-nuas\ndownload_label=Luchdaich a-nuas\nbookmark.title=An sealladh làithreach (dèan lethbhreac no fosgail e ann an uinneag ùr)\nbookmark_label=An sealladh làithreach\n\n# Secondary toolbar and context menu\ntools.title=Innealan\ntools_label=Innealan\nfirst_page.title=Rach gun chiad duilleag\nfirst_page.label=Rach gun chiad duilleag\nfirst_page_label=Rach gun chiad duilleag\nlast_page.title=Rach gun duilleag mu dheireadh\nlast_page.label=Rach gun duilleag mu dheireadh\nlast_page_label=Rach gun duilleag mu dheireadh\npage_rotate_cw.title=Cuairtich gu deiseil\npage_rotate_cw.label=Cuairtich gu deiseil\npage_rotate_cw_label=Cuairtich gu deiseil\npage_rotate_ccw.title=Cuairtich gu tuathail\npage_rotate_ccw.label=Cuairtich gu tuathail\npage_rotate_ccw_label=Cuairtich gu tuathail\n\nhand_tool_enable.title=Cuir inneal na làimhe an comas\nhand_tool_enable_label=Cuir inneal na làimhe an comas\nhand_tool_disable.title=Cuir inneal na làimhe à comas\nhand_tool_disable_label=Cuir à comas inneal na làimhe\n\n# Document properties dialog box\ndocument_properties.title=Roghainnean na sgrìobhainne…\ndocument_properties_label=Roghainnean na sgrìobhainne…\ndocument_properties_file_name=Ainm an fhaidhle:\ndocument_properties_file_size=Meud an fhaidhle:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Tiotal:\ndocument_properties_author=Ùghdar:\ndocument_properties_subject=Cuspair:\ndocument_properties_keywords=Faclan-luirg:\ndocument_properties_creation_date=Latha a chruthachaidh:\ndocument_properties_modification_date=Latha atharrachaidh:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Cruthadair:\ndocument_properties_producer=Saothraiche a' PDF:\ndocument_properties_version=Tionndadh a' PDF:\ndocument_properties_page_count=Àireamh de dhuilleagan:\ndocument_properties_close=Dùin\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Toglaich am bàr-taoibh\ntoggle_sidebar_label=Toglaich am bàr-taoibh\noutline.title=Seall an sgrìobhainn far loidhne\noutline_label=Oir-loidhne na sgrìobhainne\nattachments.title=Seall na ceanglachain\nattachments_label=Ceanglachain\nthumbs.title=Seall na dealbhagan\nthumbs_label=Dealbhagan\nfindbar.title=Lorg san sgrìobhainn\nfindbar_label=Lorg\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Duilleag a {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Dealbhag duilleag a {{page}}\n\n# Find panel button title and messages\nfind_label=Lorg:\nfind_previous.title=Lorg làthair roimhe na h-abairt seo\nfind_previous_label=Air ais\nfind_next.title=Lorg ath-làthair na h-abairt seo\nfind_next_label=Air adhart\nfind_highlight=Soillsich a h-uile\nfind_match_case_label=Aire do litrichean mòra is beaga\nfind_reached_top=Ràinig sinn barr na duilleige, a' leantainn air adhart o bhonn na duilleige\nfind_reached_bottom=Ràinig sinn bonn na duilleige, a' leantainn air adhart o bharr na duilleige\nfind_not_found=Cha deach an abairt a lorg\n\n# Error panel labels\nerror_more_info=Barrachd fiosrachaidh\nerror_less_info=Nas lugha de dh'fhiosrachadh\nerror_close=Dùin\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Teachdaireachd: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stac: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Faidhle: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Loidhne: {{line}}\nrendering_error=Thachair mearachd rè reandaradh na duilleige.\n\n# Predefined zoom values\npage_scale_width=Leud na duilleige\npage_scale_fit=Freagair ri meud na duilleige\npage_scale_auto=Sùm fèin-obrachail\npage_scale_actual=Am fìor-mheud\n\n# Loading indicator messages\nloading_error_indicator=Mearachd\nloading_error=Thachair mearachd rè luchdadh a' PDF.\ninvalid_file_error=Faidhle PDF a tha mì-dhligheach no coirbte.\nmissing_file_error=Faidhle PDF a tha a dhìth.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Nòtachadh {{type}}]\npassword_label=Cuir a-steach am facal-faire gus am faidhle PDF seo fhosgladh.\npassword_invalid=Tha am facal-faire cearr. Nach fheuch thu ris a-rithist?\npassword_ok=Ceart ma-tha\npassword_cancel=Sguir dheth\n\nprinting_not_supported=Rabhadh: Chan eil am brabhsair seo a' cur làn-taic ri clò-bhualadh.\nprinting_not_ready=Rabhadh: Cha deach am PDF a luchdadh gu tur airson clò-bhualadh.\nweb_fonts_disabled=Tha cruthan-clò lìn à comas: Chan urrainn dhuinn cruthan-clò PDF leabaichte a chleachdadh.\ndocument_colors_disabled=Chan fhaod sgrìobhainnean PDF na dathan aca fhèin a chleachdadh: Tha \"Leig le duilleagan na dathan aca fhèin a chleachdadh\" à comas sa bhrabhsair.\n"
  },
  {
    "path": "web/viewer/locale/gl/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Páxina anterior\nprevious_label=Anterior\nnext.title=Seguinte páxina\nnext_label=Seguinte\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Páxina:\npage_of=de {{pageCount}}\n\nzoom_out.title=Reducir\nzoom_out_label=Reducir\nzoom_in.title=Ampliar\nzoom_in_label=Ampliar\nzoom.title=Zoom\nprint.title=Imprimir\nprint_label=Imprimir\npresentation_mode.title=Cambiar ao modo presentación\npresentation_mode_label=Modo presentación\nopen_file.title=Abrir ficheiro\nopen_file_label=Abrir\ndownload.title=Descargar\ndownload_label=Descargar\nbookmark.title=Vista actual (copiar ou abrir nunha nova xanela)\nbookmark_label=Vista actual\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Amosar/agochar a barra lateral\ntoggle_sidebar_label=Amosar/agochar a barra lateral\noutline.title=Amosar esquema do documento\noutline_label=Esquema do documento\nthumbs.title=Amosar miniaturas\nthumbs_label=Miniaturas\nfindbar.title=Atopar no documento\nfindbar_label=Atopar\n\n# Document outline messages\nno_outline=Ningún esquema dispoñíbel\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Páxina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura da páxina {{page}}\n\n# Context menu\nfirst_page.label=Ir á primeira páxina\nlast_page.label=Ir á última páxina\npage_rotate_cw.label=Rotar no sentido das agullas do reloxo\npage_rotate_ccw.label=Rotar no sentido contrario ás agullas do reloxo\n\n# Find panel button title and messages\nfind_label=Atopar:\nfind_previous.title=Atopar a anterior aparición da frase\nfind_previous_label=Anterior\nfind_next.title=Atopar a seguinte aparición da frase\nfind_next_label=Seguinte\nfind_highlight=Realzar todo\nfind_match_case_label=Diferenciar maiúsculas de minúsculas\nfind_reached_top=Chegouse ao inicio do documento, continuar desde o final\nfind_reached_bottom=Chegouse ao final do documento, continuar desde o inicio\nfind_not_found=Non se atopou a frase\n\n# Error panel labels\nerror_more_info=Máis información\nerror_less_info=Menos información\nerror_close=Pechar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (Identificador da compilación: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensaxe: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Ficheiro: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Liña: {{line}}\nrendering_error=Produciuse un erro ao representar a páxina.\n\n# Predefined zoom values\npage_scale_width=Largura da páxina\npage_scale_fit=Axuste de páxina\npage_scale_auto=Zoom automático\npage_scale_actual=Tamaño actual\n\n# Loading indicator messages\nloading_error_indicator=Erro\nloading_error=Produciuse un erro ao cargar o PDF.\ninvalid_file_error=Ficheiro PDF danado ou incorrecto.\nmissing_file_error=Falta o ficheiro PDF.\n\n# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type=[Anotación {{type}}]\nrequest_password=O PDF está protexido por un contrasinal:\n\nprinting_not_supported=Aviso: A impresión non é compatíbel de todo con este navegador.\nweb_fonts_disabled=Desactiváronse as fontes web:  foi imposíbel usar as fontes incrustadas no PDF.\n"
  },
  {
    "path": "web/viewer/locale/gu-IN/viewer.properties",
    "content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=પહેલાનુ પાનું\nprevious_label=પહેલાનુ\nnext.title=આગળનુ પાનું\n next_label=આગળનું\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=પાનું:\npage_of={{pageCount}} નું\nzoom_out.title=મોટુ કરો\nzoom_out_label=મોટુ કરો\nzoom_in.title=નાનું કરો\nzoom_in_label=નાનું કરો\nzoom.title=નાનું મોટુ કરો\nprint.title=છાપો\nprint_label=છારો\nopen_file.title=ફાઇલ ખોલો\nopen_file_label=ખોલો\ndownload.title=ડાઉનલોડ\ndownload_label=ડાઉનલોડ\nbookmark.title=વર્તમાન દૃશ્ય (નવી વિન્ડોમાં નકલ કરો અથવા ખોલો)\nbookmark_label=વર્તમાન દૃશ્ય\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\noutline.title=દસ્તાવેજ રૂપરેખા બતાવો\noutline_label=દસ્તાવેજ રૂપરેખા\nthumbs.title=થંબનેલ્સ બતાવો\nthumbs_label=થંબનેલ્સ\n\n# Document outline messages\n\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=પાનું {{page}}\n\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=પાનાં {{page}} નું થંબનેલ્સ\n# Error panel labels\nerror_more_info=વધારે જાણકારી\nerror_less_info=ઓછી જાણકારી\nerror_close=બંધ કરો\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=સંદેશો: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=સ્ટેક: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ફાઇલ: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=વાક્ય: {{line}}\nrendering_error=ભૂલ ઉદ્ભવી જ્યારે પાનાંનુ રેન્ડ કરી રહ્યા હોય.\n# Predefined zoom values\npage_scale_width=પાનાની પહોળાઇ\npage_scale_fit=પાનું બંધબેસતુ\npage_scale_auto=આપમેળે નાનુંમોટુ કરો\npage_scale_actual=ચોક્કસ માપ\n# Loading indicator messages\n# LOCALIZATION NOTE (error_line): \"{{[percent}}\" will be replaced with a percentage\n\nloading_error_indicator=ભૂલ\nloading_error=ભૂલ ઉદ્ભવી જ્યારે PDF ને લાવી રહ્યા હોય.\n# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.\n# \"{{[type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\n\nprinting_not_supported=ચેતવણી: છાપવાનું આ બ્રાઉઝર દ્દારા સંપૂર્ણપણે આધારભૂત નથી.\n\nerror_version_info=PDF.js v{{version}} (build: {{build}})\nfind_highlight=બધુ પ્રકાશિત કરો\nfind_label=શોધો:\nfind_match_case_label=કેસ બંધબેસાડો\nfind_next.title=શબ્દસમૂહની આગળની ઘટનાને શોધો\nfind_next_label=આગળનું\nfind_not_found=શબ્દસમૂહ મળ્યુ નથી\nfind_previous.title=શબ્દસમૂહની પાછલી ઘટનાને શોધો\nfind_previous_label=પહેલાંનુ\nfind_reached_bottom=દસ્તાવેજનાં અંતે પહોંચી ગયા, ઉપરથી ચાલુ કરેલ હતુ\nfind_reached_top=દસ્તાવેજનાં ટોચે પહોંચી ગયા, તળિયેથી ચાલુ કરેલ હતુ\nfindbar.title=દસ્તાવેજમાં શોધો\nfindbar_label=શોધો\nfirst_page.label=પહેલાં પાનામાં જાવ\ninvalid_file_error=અયોગ્ય અથવા ભાંગેલ PDF ફાઇલ.\nlast_page.label=છેલ્લા પાનામાં જાવ\nmissing_file_error=ગુમ થયેલ PDF ફાઇલ.\npage_rotate_ccw.label=ઘડિયાળનાં કાંટાની ઉલટી દિશામાં ફેરવો\npage_rotate_cw.label=ઘડિયાળનાં કાંટાની જેમ ફેરવો\npresentation_mode.title=રજૂઆત સ્થિતિમાં જાવ\npresentation_mode_label=રજૂઆત સ્થિતિ\nprinting_not_ready=Warning: PDF એ છાપવા માટે સંપૂર્ણપણે લાવેલ છે.\ntoggle_sidebar.title=ટૉગલ બાજુપટ્ટી\ntoggle_sidebar_label=ટૉગલ બાજુપટ્ટી\nweb_fonts_disabled=વેબ ફોન્ટ નિષ્ક્રિય થયેલ છે: ઍમ્બેડ થયેલ PDF ફોન્ટને વાપરવાનું અસમર્થ.\ndocument_colors_disabled=PDF દસ્તાવેજો તેનાં પોતાના રંગોને વાપરવા પરવાનગી આપતા નથી: \\'તેનાં પોતાનાં રંગોને પસંદ કરવા માટે પાનાંને પરવાનગી આપો\\' બ્રાઉઝરમાં નિષ્ક્રિય થયેલ છે.\ntext_annotation_type.alt=[{{type}} Annotation]\n"
  },
  {
    "path": "web/viewer/locale/he/viewer.properties",
    "content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=דף קודם\nprevious_label=קודם\nnext.title=דף הבא\nnext_label=הבא\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=עמוד:\npage_of=מתוך {{pageCount}}\n\nzoom_out.title=התרחקות\nzoom_out_label=התרחקות\nzoom_in.title=התקרבות\nzoom_in_label=התקרבות\nzoom.title=מרחק מתצוגה\npresentation_mode.title=מעבר למצב מצגת\npresentation_mode_label=מצב מצגת\nopen_file.title=פתיחת קובץ\nopen_file_label=פתיחה\nprint.title=הדפסה\nprint_label=הדפסה\ndownload.title=הורדה\ndownload_label=הורדה\nbookmark.title=תצוגה נוכחית (העתקה או פתיחה בחלון חדש)\nbookmark_label=תצוגה נוכחית\n\n# Secondary toolbar and context menu\ntools.title=כלים\ntools_label=כלים\nfirst_page.title=מעבר לעמוד הראשון\nfirst_page.label=מעבר לעמוד הראשון\nfirst_page_label=מעבר לעמוד הראשון\nlast_page.title=מעבר לעמוד האחרון\nlast_page.label=מעבר לעמוד האחרון\nlast_page_label=מעבר לעמוד האחרון\npage_rotate_cw.title=הטיה עם כיוון השעון\npage_rotate_cw.label=הטיה עם כיוון השעון\npage_rotate_cw_label=הטיה עם כיוון השעון\npage_rotate_ccw.title=הטיה כנגד כיוון השעון\npage_rotate_ccw.label=הטיה כנגד כיוון השעון\npage_rotate_ccw_label=הטיה כנגד כיוון השעון\n\nhand_tool_enable.title=הפעלת כלי היד\nhand_tool_enable_label=הפעלת כלי היד\nhand_tool_disable.title=נטרול כלי היד\nhand_tool_disable_label=נטרול כלי היד\n\n# Document properties dialog box\ndocument_properties.title=מאפייני מסמך…\ndocument_properties_label=מאפייני מסמך…\ndocument_properties_file_name=שם קובץ:\ndocument_properties_file_size=גודל הקובץ:\ndocument_properties_kb={{size_kb}} ק״ב ({{size_b}} בתים)\ndocument_properties_mb={{size_mb}} מ״ב ({{size_b}} בתים)\ndocument_properties_title=כותרת:\ndocument_properties_author=מחבר:\ndocument_properties_subject=נושא:\ndocument_properties_keywords=מילות מפתח:\ndocument_properties_creation_date=תאריך יצירה:\ndocument_properties_modification_date=תאריך שינוי:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=יוצר:\ndocument_properties_producer=יצרן PDF:\ndocument_properties_version=גרסת PDF:\ndocument_properties_page_count=מספר דפים:\ndocument_properties_close=סגירה\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=הצגה/הסתרה של סרגל הצד\ntoggle_sidebar_label=הצגה/הסתרה של סרגל הצד\noutline.title=הצגת מתאר מסמך\noutline_label=מתאר מסמך\nthumbs.title=הצגת תצוגה מקדימה\nthumbs_label=תצוגה מקדימה\nfindbar.title=חיפוש במסמך\nfindbar_label=חיפוש\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=עמוד {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=תצוגה מקדימה של עמוד {{page}}\n\n# Find panel button title and messages\nfind_label=חיפוש:\nfind_previous.title=חיפוש מופע קודם של הביטוי\nfind_previous_label=קודם\nfind_next.title=חיפוש המופע הבא של הביטוי\nfind_next_label=הבא\nfind_highlight=הדגשת הכול\nfind_match_case_label=התאמת אותיות\nfind_reached_top=הגיע לראש הדף, ממשיך מלמטה\nfind_reached_bottom=הגיע לסוף הדף, ממשיך מלמעלה\nfind_not_found=ביטוי לא נמצא\n\n# Error panel labels\nerror_more_info=מידע נוסף\nerror_less_info=פחות מידע\nerror_close=סגירה\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js גרסה {{version}} (בנייה: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=הודעה: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=תוכן מחסנית: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=קובץ: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=שורה: {{line}}\nrendering_error=אירעה שגיאה בעת עיבוד הדף.\n\n# Predefined zoom values\npage_scale_width=רוחב העמוד\npage_scale_fit=התאמה לעמוד\npage_scale_auto=מרחק מתצוגה אוטומטי\npage_scale_actual=גודל אמתי\n\n# Loading indicator messages\nloading_error_indicator=שגיאה\nloading_error=אירעה שגיאה בעת טעינת ה־PDF.\ninvalid_file_error=קובץ PDF פגום או לא תקין.\nmissing_file_error=קובץ PDF חסר.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[הערת {{type}}]\npassword_label=נא להכניס את הססמה לפתיחת קובץ PDF זה.\npassword_invalid=ססמה שגויה. נא לנסות שנית.\npassword_ok=אישור\npassword_cancel=ביטול\n\nprinting_not_supported=אזהרה: הדפסה אינה נתמכת במלואה בדפדפן זה.\nprinting_not_ready=אזהרה: ה־PDF לא ניתן לחלוטין עד מצב שמאפשר הדפסה.\nweb_fonts_disabled=גופני רשת מנוטרלים: לא ניתן להשתמש בגופני PDF מוטבעים.\ndocument_colors_disabled=מסמכי PDF לא יכולים להשתמש בצבעים משלהם: האפשרות \\\\'לאפשר לעמודים לבחור צבעים משלהם\\\\' אינה פעילה בדפדפן."
  },
  {
    "path": "web/viewer/locale/hi-IN/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=पिछला पृष्ठ\nprevious_label=पिछला\nnext.title=अगला पृष्ठ\nnext_label=आगे\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=पृष्ठ:\npage_of={{pageCount}} का\n\nzoom_out.title=छोटा करें\nzoom_out_label=छोटा करें\nzoom_in.title=बड़ा करें\nzoom_in_label=बड़ा करें\nzoom.title=बड़ा-छोटा करें\npresentation_mode.title=प्रस्तुति अवस्था में जाएँ\npresentation_mode_label=प्रस्तुति अवस्था\nopen_file.title=फ़ाइल खोलें\nopen_file_label=खोलें\nprint.title=छापें\nprint_label=छापें\ndownload.title=डाउनलोड\ndownload_label=डाउनलोड\nbookmark.title=मौजूदा दृश्य (नए विंडो में नक़ल लें या खोलें)\nbookmark_label=मौजूदा दृश्य\n\n# Secondary toolbar and context menu\ntools.title=औज़ार\ntools_label=औज़ार\nfirst_page.title=प्रथम पृष्ठ पर जाएँ\nfirst_page.label=प्रथम पृष्ठ पर जाएँ\nfirst_page_label=प्रथम पृष्ठ पर जाएँ\nlast_page.title=अंतिम पृष्ठ पर जाएँ\nlast_page.label=अंतिम पृष्ठ पर जाएँ\nlast_page_label=अंतिम पृष्ठ पर जाएँ\npage_rotate_cw.title=घड़ी की दिशा में घुमाएँ\npage_rotate_cw.label=घड़ी की दिशा में घुमाएँ\npage_rotate_cw_label=घड़ी की दिशा में घुमाएँ\npage_rotate_ccw.title=घड़ी की दिशा से उल्टा घुमाएँ\npage_rotate_ccw.label=घड़ी की दिशा से उल्टा घुमाएँ\npage_rotate_ccw_label=घड़ी की दिशा से उल्टा घुमाएँ\n\nhand_tool_enable.title=हाथ औजार सक्रिय करें\nhand_tool_enable_label=हाथ औजार सक्रिय करें\nhand_tool_disable.title=हाथ औजार निष्क्रिय करना\nhand_tool_disable_label=हाथ औजार निष्क्रिय करना\n\n# Document properties dialog box\ndocument_properties.title=दस्तावेज़ विशेषता...\ndocument_properties_label=दस्तावेज़ विशेषता...\ndocument_properties_file_name=फ़ाइल नाम:\ndocument_properties_file_size=फाइल आकारः\ndocument_properties_kb={{size_kb}} KB ({{size_b}} बाइट)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} बाइट)\ndocument_properties_title=शीर्षक:\ndocument_properties_author=लेखकः\ndocument_properties_subject=विषय:\ndocument_properties_keywords=कुंजी-शब्द:\ndocument_properties_creation_date=निर्माण दिनांक:\ndocument_properties_modification_date=संशोधन दिनांक:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=निर्माता:\ndocument_properties_producer=PDF उत्पादक:\ndocument_properties_version=PDF संस्करण:\ndocument_properties_page_count=पृष्ठ गिनती:\ndocument_properties_close=बंद करें\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=स्लाइडर टॉगल करें\ntoggle_sidebar_label=स्लाइडर टॉगल करें\noutline.title=दस्तावेज़ आउटलाइन दिखाएँ\noutline_label=दस्तावेज़ आउटलाइन\nthumbs.title=लघुछवियाँ दिखाएँ\nthumbs_label=लघु छवि\nfindbar.title=दस्तावेज़ में ढूँढ़ें\nfindbar_label=ढूँढ़ें\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=पृष्ठ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=पृष्ठ {{page}} की लघु-छवि\n\n# Find panel button title and messages\nfind_label=ढूंढें:\nfind_previous.title=वाक्यांश की पिछली उपस्थिति ढूँढ़ें\nfind_previous_label=पिछला\nfind_next.title=वाक्यांश की अगली उपस्थिति ढूँढ़ें\nfind_next_label=आगे\nfind_highlight=सभी आलोकित करें\nfind_match_case_label=मिलान स्थिति\nfind_reached_top=पृष्ठ के ऊपर पहुंच गया, नीचे से जारी रखें\nfind_reached_bottom=पृष्ठ के नीचे में जा पहुँचा, ऊपर से जारी\nfind_not_found=वाक्यांश नहीं मिला\n\n# Error panel labels\nerror_more_info=अधिक सूचना\nerror_less_info=कम सूचना\nerror_close=बंद करें\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=संदेश: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=स्टैक: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=फ़ाइल: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=पंक्ति: {{line}}\nrendering_error=पृष्ठ रेंडरिंग के दौरान त्रुटि आई.\n\n# Predefined zoom values\npage_scale_width=पृष्ठ चौड़ाई\npage_scale_fit=पृष्ठ फिट\npage_scale_auto=स्वचालित जूम\npage_scale_actual=वास्तविक आकार\n\n# Loading indicator messages\nloading_error_indicator=त्रुटि\nloading_error=पीडीएफ लोड करते समय एक त्रुटि हुई.\ninvalid_file_error=अमान्य या भ्रष्ट PDF फ़ाइल.\nmissing_file_error=अनुपस्थित PDF फ़ाइल.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=इस पीडीएफ फ़ाइल को खोलने के लिए कृपया कूटशब्द भरें.\npassword_invalid=अवैध कूटशब्द, कृपया फिर कोशिश करें.\npassword_ok=ठीक\npassword_cancel=रद्द करें\n\nprinting_not_supported=चेतावनी: इस ब्राउज़र पर छपाई पूरी तरह से समर्थित नहीं है.\nprinting_not_ready=चेतावनी: पीडीएफ छपाई के लिए पूरी तरह से लोड नहीं है.\nweb_fonts_disabled=वेब फॉन्ट्स निष्क्रिय हैं: अंतःस्थापित PDF फॉन्टस के उपयोग में असमर्थ.\ndocument_colors_disabled=PDF दस्तावेज़ उनके अपने रंग को उपयोग करने के लिए अनुमति प्राप्त नहीं है: 'पृष्ठों को उनके अपने रंग को चुनने के लिए स्वीकृति दें कि वह उस ब्राउज़र में निष्क्रिय है.\n"
  },
  {
    "path": "web/viewer/locale/hr/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Prethodna stranica\nprevious_label=Prethodna\nnext.title=Iduća stranica\nnext_label=Iduća\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Stranica:\npage_of=od {{pageCount}}\n\nzoom_out.title=Uvećaj\nzoom_out_label=Smanji\nzoom_in.title=Uvaćaj\nzoom_in_label=Smanji\nzoom.title=Uvećanje\npresentation_mode.title=Prebaci u prezentacijski način rada\npresentation_mode_label=Prezentacijski način rada\nopen_file.title=Otvori datoteku\nopen_file_label=Otvori\nprint.title=Ispis\nprint_label=Ispis\ndownload.title=Preuzmi\ndownload_label=Preuzmi\nbookmark.title=Trenutni prikaz (kopiraj ili otvori u novom prozoru)\nbookmark_label=Trenutni prikaz\n\n# Secondary toolbar and context menu\ntools.title=Alati\ntools_label=Alati\nfirst_page.title=Idi na prvu stranicu\nfirst_page.label=Idi na prvu stranicu\nfirst_page_label=Idi na prvu stranicu\nlast_page.title=Idi na posljednju stranicu\nlast_page.label=Idi na posljednju stranicu\nlast_page_label=Idi na posljednju stranicu\npage_rotate_cw.title=Rotiraj u smjeru kazaljke na satu\npage_rotate_cw.label=Rotiraj u smjeru kazaljke na satu\npage_rotate_cw_label=Rotiraj u smjeru kazaljke na satu\npage_rotate_ccw.title=Rotiraj obrnutno od smjera kazaljke na satu\npage_rotate_ccw.label=Rotiraj obrnutno od smjera kazaljke na satu\npage_rotate_ccw_label=Rotiraj obrnutno od smjera kazaljke na satu\n\nhand_tool_enable.title=Omogući ručni alat\nhand_tool_enable_label=Omogući ručni alat\nhand_tool_disable.title=Onemogući ručni alat\nhand_tool_disable_label=Onemogući ručni alat\n\n# Document properties dialog box\ndocument_properties.title=Svojstva dokumenta...\ndocument_properties_label=Svojstva dokumenta...\ndocument_properties_file_name=Naziv datoteke:\ndocument_properties_file_size=Veličina datoteke:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bajtova)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bajtova)\ndocument_properties_title=Naslov:\ndocument_properties_author=Autor:\ndocument_properties_subject=Predmet:\ndocument_properties_keywords=Ključne riječi:\ndocument_properties_creation_date=Datum stvaranja:\ndocument_properties_modification_date=Datum promjene:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Stvaralac:\ndocument_properties_producer=PDF stvaratelj:\ndocument_properties_version=PDF inačica:\ndocument_properties_page_count=Broj stranica:\ndocument_properties_close=Zatvori\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Prikaži/sakrij bočnu traku\ntoggle_sidebar_label=Prikaži/sakrij bočnu traku\noutline.title=Prikaži obris dokumenta\noutline_label=Obris dokumenta\nattachments.title=Prikaži privitke\nattachments_label=Privitci\nthumbs.title=Prikaži sličice\nthumbs_label=Sličice\nfindbar.title=Traži u dokumentu\nfindbar_label=Traži\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Stranica {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Sličica stranice {{page}}\n\n# Find panel button title and messages\nfind_label=Traži:\nfind_previous.title=Pronađi prethodno javljanje ovog izraza\nfind_previous_label=Prethodno\nfind_next.title=Pronađi iduće javljanje ovog izraza\nfind_next_label=Iduće\nfind_highlight=Istankni sve\nfind_match_case_label=Slučaj podudaranja\nfind_reached_top=Dosegnut vrh dokumenta, nastavak od dna\nfind_reached_bottom=Dosegnut vrh dokumenta, nastavak od vrha\nfind_not_found=Izraz nije pronađen\n\n# Error panel labels\nerror_more_info=Više informacija\nerror_less_info=Manje informacija\nerror_close=Zatvori\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Poruka: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stog: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Datoteka: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Redak: {{line}}\nrendering_error=Došlo je do greške prilikom iscrtavanja stranice.\n\n# Predefined zoom values\npage_scale_width=Širina stranice\npage_scale_fit=Pristajanje stranici\npage_scale_auto=Automatsko uvećanje\npage_scale_actual=Prava veličina\n\n# Loading indicator messages\nloading_error_indicator=Greška\nloading_error=Došlo je do greške pri učitavanju PDF-a.\ninvalid_file_error=Kriva ili oštećena PDF datoteka.\nmissing_file_error=Nedostaje PDF datoteka.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Bilješka]\npassword_label=Upišite lozinku da biste otvorili ovu PDF datoteku.\npassword_invalid=Neispravna lozinka. Pokušajte ponovo.\npassword_ok=U redu\npassword_cancel=Odustani\n\nprinting_not_supported=Upozorenje: Ispisivanje nije potpuno podržano u ovom pregledniku.\nprinting_not_ready=Upozorenje: PDF nije u potpunosti učitan za ispis.\nweb_fonts_disabled=Web fontovi su onemogućeni: nije moguće koristiti umetnute PDF fontove.\ndocument_colors_disabled=PDF dokumenti nemaju dopuštene koristiti vlastite boje: opcija 'Dopusti stranicama da koriste vlastite boje' je deaktivirana.\n"
  },
  {
    "path": "web/viewer/locale/hu/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Előző oldal\nprevious_label=Előző\nnext.title=Következő oldal\nnext_label=Tovább\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Oldal:\npage_of=összesen: {{pageCount}}\n\nzoom_out.title=Kicsinyítés\nzoom_out_label=Kicsinyítés\nzoom_in.title=Nagyítás\nzoom_in_label=Nagyítás\nzoom.title=Nagyítás\npresentation_mode.title=Váltás bemutató módba\npresentation_mode_label=Bemutató mód\nopen_file.title=Fájl megnyitása\nopen_file_label=Megnyitás\nprint.title=Nyomtatás\nprint_label=Nyomtatás\ndownload.title=Letöltés\ndownload_label=Letöltés\nbookmark.title=Jelenlegi nézet (másolás vagy megnyitás új ablakban)\nbookmark_label=Aktuális nézet\n\n# Secondary toolbar and context menu\ntools.title=Eszközök\ntools_label=Eszközök\nfirst_page.title=Ugrás az első oldalra\nfirst_page.label=Ugrás az első oldalra\nfirst_page_label=Ugrás az első oldalra\nlast_page.title=Ugrás az utolsó oldalra\nlast_page.label=Ugrás az utolsó oldalra\nlast_page_label=Ugrás az utolsó oldalra\npage_rotate_cw.title=Forgatás az óramutató járásával egyezően\npage_rotate_cw.label=Forgatás az óramutató járásával egyezően\npage_rotate_cw_label=Forgatás az óramutató járásával egyezően\npage_rotate_ccw.title=Forgatás az óramutató járásával ellentétesen\npage_rotate_ccw.label=Forgatás az óramutató járásával ellentétesen\npage_rotate_ccw_label=Forgatás az óramutató járásával ellentétesen\n\nhand_tool_enable.title=Kéz eszköz bekapcsolása\nhand_tool_enable_label=Kéz eszköz bekapcsolása\nhand_tool_disable.title=Kéz eszköz kikapcsolása\nhand_tool_disable_label=Kéz eszköz kikapcsolása\n\n# Document properties dialog box\ndocument_properties.title=Dokumentum tulajdonságai…\ndocument_properties_label=Dokumentum tulajdonságai…\ndocument_properties_file_name=Fájlnév:\ndocument_properties_file_size=Fájlméret:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bájt)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bájt)\ndocument_properties_title=Cím:\ndocument_properties_author=Szerző:\ndocument_properties_subject=Tárgy:\ndocument_properties_keywords=Kulcsszavak:\ndocument_properties_creation_date=Létrehozás dátuma:\ndocument_properties_modification_date=Módosítás dátuma:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Létrehozta:\ndocument_properties_producer=PDF előállító:\ndocument_properties_version=PDF verzió:\ndocument_properties_page_count=Oldalszám:\ndocument_properties_close=Bezárás\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Oldalsáv be/ki\ntoggle_sidebar_label=Oldalsáv be/ki\noutline.title=Dokumentumvázlat megjelenítése\noutline_label=Dokumentumvázlat\nattachments.title=Mellékletek megjelenítése\nattachments_label=Van melléklet\nthumbs.title=Bélyegképek megjelenítése\nthumbs_label=Bélyegképek\nfindbar.title=Keresés a dokumentumban\nfindbar_label=Keresés\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}}. oldal\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}}. oldal bélyegképe\n\n# Find panel button title and messages\nfind_label=Keresés:\nfind_previous.title=A kifejezés előző előfordulásának keresése\nfind_previous_label=Előző\nfind_next.title=A kifejezés következő előfordulásának keresése\nfind_next_label=Tovább\nfind_highlight=Összes kiemelése\nfind_match_case_label=Kis- és nagybetűk megkülönböztetése\nfind_reached_top=A dokumentum eleje elérve, folytatás a végétől\nfind_reached_bottom=A dokumentum vége elérve, folytatás az elejétől\nfind_not_found=A kifejezés nem található\n\n# Error panel labels\nerror_more_info=További információ\nerror_less_info=Kevesebb információ\nerror_close=Bezárás\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Üzenet: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Nyomkövetés: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fájl: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Sor: {{line}}\nrendering_error=Hiba történt az oldal feldolgozása közben.\n\n# Predefined zoom values\npage_scale_width=Oldalszélesség\npage_scale_fit=Teljes oldal\npage_scale_auto=Automatikus nagyítás\npage_scale_actual=Valódi méret\n\n# Loading indicator messages\nloading_error_indicator=Hiba\nloading_error=Hiba történt a PDF betöltésekor.\ninvalid_file_error=Érvénytelen vagy sérült PDF fájl.\nmissing_file_error=Hiányzó PDF fájl.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} megjegyzés]\npassword_label=Adja meg a jelszót a PDF fájl megnyitásához.\npassword_invalid=Helytelen jelszó. Próbálja újra.\npassword_ok=OK\npassword_cancel=Mégse\n\nprinting_not_supported=Figyelmeztetés: Ez a böngésző nem teljesen támogatja a nyomtatást.\nprinting_not_ready=Figyelmeztetés: A PDF nincs teljesen betöltve a nyomtatáshoz.\nweb_fonts_disabled=Webes betűkészletek letiltva: nem használhatók a beágyazott PDF betűkészletek.\ndocument_colors_disabled=A PDF dokumentumok nem használhatják saját színeiket: „Az oldalak a saját maguk által kiválasztott színeket használhatják” beállítás ki van kapcsolva a böngészőben.\n"
  },
  {
    "path": "web/viewer/locale/hy-AM/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Նախորդ էջը\nprevious_label=Նախորդը\nnext.title=Հաջորդ էջը\nnext_label=Հաջորդը\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Էջ.\npage_of={{pageCount}}-ից\n\nzoom_out.title=Փոքրացնել\nzoom_out_label=Փոքրացնել\nzoom_in.title=Խոշորացնել\nzoom_in_label=Խոշորացնել\nzoom.title=Մասշտաբը\\u0020\npresentation_mode.title=Անցնել Ներկայացման եղանակին\npresentation_mode_label=Ներկայացման եղանակ\nopen_file.title=Բացել Ֆայլ\nopen_file_label=Բացել\nprint.title=Տպել\nprint_label=Տպել\ndownload.title=Բեռնել\ndownload_label=Բեռնել\nbookmark.title=Ընթացիկ տեսքով (պատճենել կամ բացել նոր պատուհանում)\nbookmark_label=Ընթացիկ տեսքը\n\n# Secondary toolbar and context menu\ntools.title=Գործիքներ\ntools_label=Գործիքներ\nfirst_page.title=Անցնել առաջին էջին\nfirst_page.label=Անցնել առաջին էջին\nfirst_page_label=Անցնել առաջին էջին\nlast_page.title=Անցնել վերջին էջին\nlast_page.label=Անցնել վերջին էջին\nlast_page_label=Անցնել վերջին էջին\npage_rotate_cw.title=Պտտել ըստ ժամացույցի սլաքի\npage_rotate_cw.label=Պտտել ըստ ժամացույցի սլաքի\npage_rotate_cw_label=Պտտել ըստ ժամացույցի սլաքի\npage_rotate_ccw.title=Պտտել հակառակ ժամացույցի սլաքի\npage_rotate_ccw.label=Պտտել հակառակ ժամացույցի սլաքի\npage_rotate_ccw_label=Պտտել հակառակ ժամացույցի սլաքի\n\nhand_tool_enable.title=Միացնել ձեռքի գործիքը\nhand_tool_enable_label=Միացնել ձեռքի գործիքը\nhand_tool_disable.title=Անջատել ձեռքի գործիքը\nhand_tool_disable_label=ԱՆջատել ձեռքի գործիքը\n\n# Document properties dialog box\ndocument_properties.title=Փաստաթղթի հատկությունները...\ndocument_properties_label=Փաստաթղթի հատկությունները...\ndocument_properties_file_name=Ֆայլի անունը.\ndocument_properties_file_size=Ֆայլի չափը.\ndocument_properties_kb={{size_kb}} ԿԲ ({{size_b}} բայթ)\ndocument_properties_mb={{size_mb}} ՄԲ ({{size_b}} բայթ)\ndocument_properties_title=Վերնագիր.\ndocument_properties_author=Հեղինակ․\ndocument_properties_subject=Վերնագիր.\ndocument_properties_keywords=Հիմնաբառ.\ndocument_properties_creation_date=Ստեղծելու ամսաթիվը.\ndocument_properties_modification_date=Փոփոխելու ամսաթիվը.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Ստեղծող.\ndocument_properties_producer=PDF-ի հեղինակը.\ndocument_properties_version=PDF-ի տարբերակը.\ndocument_properties_page_count=Էջերի քանակը.\ndocument_properties_close=Փակել\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Բացել/Փակել Կողային վահանակը\ntoggle_sidebar_label=Բացել/Փակել Կողային վահանակը\noutline.title=Ցուցադրել փաստաթղթի բովանդակությունը\noutline_label=Փաստաթղթի բովանդակությունը\nthumbs.title=Ցուցադրել Մանրապատկերը\nthumbs_label=Մանրապատկերը\nfindbar.title=Գտնել փաստաթղթում\nfindbar_label=Փնտրել\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Էջը {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Էջի մանրապատկերը {{page}}\n\n# Find panel button title and messages\nfind_label=Գտնել`\nfind_previous.title=Գտնել անրահայտության նախորդ հանդիպումը\nfind_previous_label=Նախորդը\nfind_next.title=Գտիր արտահայտության հաջորդ հանդիպումը\nfind_next_label=Հաջորդը\nfind_highlight=Նշագծել Բոլորը\nfind_match_case_label=Մեծ(փոքր)ատառ հաշվի առնել\nfind_reached_top=Հասել եք փաստաթղթի վերևին, կշարունակվի ներքևից\nfind_reached_bottom=Հասել եք փաստաթղթի վերջին, կշարունակվի վերևից\nfind_not_found=Արտահայտությունը չգտնվեց\n\n# Error panel labels\nerror_more_info=Ավելի շատ տեղեկություն\nerror_less_info=Քիչ տեղեկություն\nerror_close=Փակել\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (կառուցումը. {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Գրությունը. {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Շեղջ. {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Ֆայլ. {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Տողը. {{line}}\nrendering_error=Սխալ՝ էջը ստեղծելիս:\n\n# Predefined zoom values\npage_scale_width=Էջի լայնքը\npage_scale_fit=Ձգել էջը\npage_scale_auto=Ինքնաշխատ\npage_scale_actual=Իրական չափը\n\n# Loading indicator messages\nloading_error_indicator=Սխալ\nloading_error=Սխալ՝ PDF ֆայլը բացելիս։\ninvalid_file_error=Սխալ կամ բնասված PDF ֆայլ:\nmissing_file_error=PDF ֆայլը բացակայում է:\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Ծանոթություն]\npassword_label=Մուտքագրեք PDF-ի գաղտնաբառը:\npassword_invalid=Գաղտնաբառը սխալ է: Կրկին փորձեք:\npassword_ok=ԼԱՎ\npassword_cancel=Չեղարկել\n\nprinting_not_supported=Զգուշացում. Տպելը ամբողջությամբ չի աջակցվում դիտարկիչի կողմից։\nprinting_not_ready=Զգուշացում. PDF-ը ամբողջությամբ չի բեռնավորվել տպելու համար:\nweb_fonts_disabled=Վեբ-տառատեսակները անջատված են. հնարավոր չէ օգտագործել ներկառուցված PDF տառատեսակները:\ndocument_colors_disabled=PDF փաստաթղթերին թույլատրված չէ օգտագործել իրենց սեփական գույները: 'Թույլատրել էջերին ընտրել իրենց սեփական գույները' ընտրանքը անջատված է դիտարկիչում:\n"
  },
  {
    "path": "web/viewer/locale/id/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Laman Sebelumnya\nprevious_label=Sebelumnya\nnext.title=Laman Selanjutnya\nnext_label=Selanjutnya\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Laman:\npage_of=dari {{pageCount}}\n\nzoom_out.title=Perkecil\nzoom_out_label=Perkecil\nzoom_in.title=Perbesar\nzoom_in_label=Perbesar\nzoom.title=Perbesaran\nprint.title=Cetak\nprint_label=Cetak\npresentation_mode.title=Ganti ke Mode Presentasi\npresentation_mode_label=Mode Presentasi\nopen_file.title=Buka Berkas\nopen_file_label=Buka\ndownload.title=Unduh\ndownload_label=Unduh\nbookmark.title=Tampilan Sekarang (salin atau buka di jendela baru)\nbookmark_label=Tampilan Sekarang\n\n# Secondary toolbar and context menu\ntools.title=Alat\ntools_label=Alat\nfirst_page.title=Buka Halaman Pertama\nfirst_page.label=Buka Halaman Pertama\nfirst_page_label=Buka Halaman Pertama\nlast_page.title=Buka Halaman Terakhir\nlast_page.label=Buka Halaman Terakhir\nlast_page_label=Buka Halaman Terakhir\npage_rotate_cw.title=Putar Searah Jarum Jam\npage_rotate_cw.label=Putar Searah Jarum Jam\npage_rotate_cw_label=Putar Searah Jarum Jam\npage_rotate_ccw.title=Putar Berlawanan Arah Jarum Jam\npage_rotate_ccw.label=Putar Berlawanan Arah Jarum Jam\npage_rotate_ccw_label=Putar Berlawanan Arah Jarum Jam\n\nhand_tool_enable.title=Aktifkan alat tangan\nhand_tool_enable_label=Aktifkan alat tangan\nhand_tool_disable.title=Nonaktifkan alat tangan\nhand_tool_disable_label=Nonaktifkan alat tangan\n\n# Document properties dialog box\ndocument_properties.title=Properti Dokumen…\ndocument_properties_label=Properti Dokumen…\ndocument_properties_file_name=Nama berkas:\ndocument_properties_file_size=Ukuran berkas:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} byte)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} byte)\ndocument_properties_title=Judul:\ndocument_properties_author=Penyusun:\ndocument_properties_subject=Subjek:\ndocument_properties_keywords=Kata Kunci:\ndocument_properties_creation_date=Tanggal Dibuat:\ndocument_properties_modification_date=Tanggal Dimodifikasi:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Pembuat:\ndocument_properties_producer=Pemroduksi PDF:\ndocument_properties_version=Versi PDF:\ndocument_properties_page_count=Jumlah Halaman:\ndocument_properties_close=Tutup\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Aktif/Nonaktifkan Bilah Samping\ntoggle_sidebar_label=Aktif/Nonaktifkan Bilah Samping\noutline.title=Buka Kerangka Dokumen\noutline_label=Kerangka Dokumen\nattachments.title=Tampilkan Lampiran\nattachments_label=Lampiran\nthumbs.title=Tampilkan Miniatur\nthumbs_label=Miniatur\nfindbar.title=Temukan di Dokumen\nfindbar_label=Temukan\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Laman {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatur Laman {{page}}\n\n# Context menu\nfirst_page.label=Ke Halaman Pertama\nlast_page.label=Ke Halaman Terakhir\npage_rotate_cw.label=Putar Searah Jarum Jam\npage_rotate_ccw.label=Putar Berlawanan Arah Jarum Jam\n\n# Find panel button title and messages\nfind_label=Temukan:\nfind_previous.title=Temukan kata sebelumnya\nfind_previous_label=Sebelumnya\nfind_next.title=Temukan lebih lanjut\nfind_next_label=Selanjutnya\nfind_highlight=Sorot semu&anya\nfind_match_case_label=Cocokkan BESAR/kecil\nfind_reached_top=Sampai di awal dokumen, dilanjutkan dari bawah\nfind_reached_bottom=Sampai di akhir dokumen, dilanjutkan dari atas\nfind_not_found=Frasa tidak ditemukan\n\n# Error panel labels\nerror_more_info=Lebih Banyak Informasi\nerror_less_info=Lebih Sedikit Informasi\nerror_close=Tutup\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Pesan: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Berkas: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Baris: {{line}}\nrendering_error=Galat terjadi saat merender laman.\n\n# Predefined zoom values\npage_scale_width=Lebar Laman\npage_scale_fit=Muat Laman\npage_scale_auto=Perbesaran Otomatis\npage_scale_actual=Ukuran Asli\n\n# Loading indicator messages\nloading_error_indicator=Galat\nloading_error=Galat terjadi saat memuat PDF.\ninvalid_file_error=Berkas PDF tidak valid atau rusak.\nmissing_file_error=Berkas PDF tidak ada.\n\n# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotasi {{type}}]\npassword_label=Masukkan sandi untuk membuka berkas PDF ini.\npassword_invalid=Sandi tidak valid. Silakan coba lagi.\npassword_ok=Oke\npassword_cancel=Batal\n\nprinting_not_supported=Peringatan: Pencetakan tidak didukung secara lengkap pada peramban ini.\nprinting_not_ready=Peringatan: Berkas PDF masih belum dimuat secara lengkap untuk dapat dicetak.\nweb_fonts_disabled=Font web dinonaktifkan: tidak dapat menggunakan font PDF yang tersemat.\ndocument_colors_disabled=Dokumen PDF tidak diizinkan untuk menggunakan warnanya sendiri karena setelan \\'Izinkan laman memilih warna sendiri\\’ dinonaktifkan pada pengaturan.\n"
  },
  {
    "path": "web/viewer/locale/is/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Fyrri síða\nprevious_label=Fyrri\nnext.title=Næsta síða\nnext_label=Næsti\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Síða:\npage_of=af {{pageCount}}\n\nzoom_out.title=Minnka\nzoom_out_label=Minnka\nzoom_in.title=Stækka\nzoom_in_label=Stækka\nzoom.title=Aðdráttur\npresentation_mode.title=Skipta yfir á kynningarham\npresentation_mode_label=Kynningarhamur\nopen_file.title=Opna skrá\nopen_file_label=Opna\nprint.title=Prenta\nprint_label=Prenta\ndownload.title=Hala niður\ndownload_label=Hala niður\nbookmark.title=Núverandi sýn (afritaðu eða opnaðu í nýjum glugga)\nbookmark_label=Núverandi sýn\n\n# Secondary toolbar and context menu\ntools.title=Verkfæri\ntools_label=Verkfæri\nfirst_page.title=Fara á fyrstu síðu\nfirst_page.label=Fara á fyrstu síðu\nfirst_page_label=Fara á fyrstu síðu\nlast_page.title=Fara á síðustu síðu\nlast_page.label=Fara á síðustu síðu\nlast_page_label=Fara á síðustu síðu\npage_rotate_cw.title=Snúa réttsælis\npage_rotate_cw.label=Snúa réttsælis\npage_rotate_cw_label=Snúa réttsælis\npage_rotate_ccw.title=Snúa rangsælis\npage_rotate_ccw.label=Snúa rangsælis\npage_rotate_ccw_label=Snúa rangsælis\n\nhand_tool_enable.title=Virkja handarverkfæri\nhand_tool_enable_label=Virkja handarverkfæri\nhand_tool_disable.title=Gera handarverkfæri óvirkt\nhand_tool_disable_label=Gera handarverkfæri óvirkt\n\n# Document properties dialog box\ndocument_properties.title=Eiginleikar skjals…\ndocument_properties_label=Eiginleikar skjals…\ndocument_properties_file_name=Skráarnafn:\ndocument_properties_file_size=Skrárstærð:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Titill:\ndocument_properties_author=Hönnuður:\ndocument_properties_subject=Efni:\ndocument_properties_keywords=Stikkorð:\ndocument_properties_creation_date=Búið til:\ndocument_properties_modification_date=Dags breytingar:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Höfundur:\ndocument_properties_producer=PDF framleiðandi:\ndocument_properties_version=PDF útgáfa:\ndocument_properties_page_count=Blaðsíðufjöldi:\ndocument_properties_close=Loka\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Víxla hliðslá\ntoggle_sidebar_label=Víxla hliðslá\noutline.title=Sýna efniskipan skjals\noutline_label=Efnisskipan skjals\nattachments.title=Sýna viðhengi\nattachments_label=Viðhengi\nthumbs.title=Sýna smámyndir\nthumbs_label=Smámyndir\nfindbar.title=Leita í skjali\nfindbar_label=Leita\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Síða {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Smámynd af síðu {{page}}\n\n# Find panel button title and messages\nfind_label=Leita:\nfind_previous.title=Leita að fyrra tilfelli þessara orða\nfind_previous_label=Fyrri\nfind_next.title=Leita að næsta tilfelli þessara orða\nfind_next_label=Næsti\nfind_highlight=Lita allt\nfind_match_case_label=Passa við stafstöðu\nfind_reached_top=Náði efst í skjal, held áfram neðst\nfind_reached_bottom=Náði enda skjals, held áfram efst\nfind_not_found=Fann ekki orðið\n\n# Error panel labels\nerror_more_info=Meiri upplýsingar\nerror_less_info=Minni upplýsingar\nerror_close=Loka\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Skilaboð: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stafli: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Skrá: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Lína: {{line}}\nrendering_error=Upp kom villa við að birta síðuna.\n\n# Predefined zoom values\npage_scale_width=Síðubreidd\npage_scale_fit=Passa á síðu\npage_scale_auto=Sjálfvirkur aðdráttur\npage_scale_actual=Raunstærð\n\n# Loading indicator messages\nloading_error_indicator=Villa\nloading_error=Villa kom upp við að hlaða inn PDF.\ninvalid_file_error=Ógild eða skemmd PDF skrá.\nmissing_file_error=Vantar PDF skrá.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Skýring]\npassword_label=Sláðu inn lykilorð til að opna þessa PDF skrá.\npassword_invalid=Ógilt lykilorð. Reyndu aftur.\npassword_ok=Í lagi\\u0020\npassword_cancel=Hætta við\n\nprinting_not_supported=Aðvörun: Prentun er ekki með fyllilegan stuðning á þessum vafra.\nprinting_not_ready=Aðvörun: Ekki er búið að hlaða inn allri PDF skránni fyrir prentun.\nweb_fonts_disabled=Vef leturgerðir eru óvirkar: get ekki notað innbyggðar PDF leturgerðir.\ndocument_colors_disabled=PDF skjöl hafa ekki leyfi til að nota sína eigin liti: 'Leyfa síðum að velja eigin liti' er óvirkt í vafranum.\n"
  },
  {
    "path": "web/viewer/locale/it/viewer.properties",
    "content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nprevious.title = Pagina precedente\nprevious_label = Precedente\nnext.title = Pagina successiva\nnext_label = Successiva\npage_label = Pagina:\npage_of = di {{pageCount}}\nzoom_out.title = Riduci zoom\nzoom_out_label = Riduci zoom\nzoom_in.title = Aumenta zoom\nzoom_in_label = Aumenta zoom\nzoom.title = Zoom\npresentation_mode.title = Passa alla modalità presentazione\npresentation_mode_label = Modalità presentazione\nopen_file.title = Apri file\nopen_file_label = Apri file\nprint.title = Stampa\nprint_label = Stampa\ndownload.title = Scarica questo documento\ndownload_label = Download\nbookmark.title = Visualizzazione corrente (copia o apri in una nuova finestra)\nbookmark_label = Visualizzazione corrente\ntools.title = Strumenti\ntools_label = Strumenti\nfirst_page.title = Vai alla prima pagina\nfirst_page.label = Vai alla prima pagina\nfirst_page_label = Vai alla prima pagina\nlast_page.title = Vai all’ultima pagina\nlast_page.label = Vai all’ultima pagina\nlast_page_label = Vai all’ultima pagina\npage_rotate_cw.title = Ruota in senso orario\npage_rotate_cw.label = Ruota in senso orario\npage_rotate_cw_label = Ruota in senso orario\npage_rotate_ccw.title = Ruota in senso antiorario\npage_rotate_ccw.label = Ruota in senso antiorario\npage_rotate_ccw_label = Ruota in senso antiorario\nhand_tool_enable.title = Attiva strumento mano\nhand_tool_enable_label = Attiva strumento mano\nhand_tool_disable.title = Disattiva strumento mano\nhand_tool_disable_label = Disattiva strumento mano\ndocument_properties.title = Proprietà del documento…\ndocument_properties_label = Proprietà del documento…\ndocument_properties_file_name = Nome file:\ndocument_properties_file_size = Dimensione file:\ndocument_properties_kb = {{size_kb}} kB ({{size_b}} byte)\ndocument_properties_mb = {{size_kb}} MB ({{size_b}} byte)\ndocument_properties_title = Titolo:\ndocument_properties_author = Autore:\ndocument_properties_subject = Oggetto:\ndocument_properties_keywords = Parole chiave:\ndocument_properties_creation_date = Data creazione:\ndocument_properties_modification_date = Data modifica:\ndocument_properties_date_string = {{date}}, {{time}}\ndocument_properties_creator = Autore originale:\ndocument_properties_producer = Produttore PDF:\ndocument_properties_version = Versione PDF:\ndocument_properties_page_count = Conteggio pagine:\ndocument_properties_close = Chiudi\ntoggle_sidebar.title = Attiva/disattiva barra laterale\ntoggle_sidebar_label = Attiva/disattiva barra laterale\noutline.title = Visualizza la struttura del documento\noutline_label = Struttura documento\nattachments.title = Visualizza allegati\nattachments_label = Allegati\nthumbs.title = Mostra le miniature\nthumbs_label = Miniature\nfindbar.title = Trova nel documento\nfindbar_label = Trova\nthumb_page_title = Pagina {{page}}\nthumb_page_canvas = Miniatura della pagina {{page}}\nfind_label = Trova:\nfind_previous.title = Trova l’occorrenza precedente del testo da cercare\nfind_previous_label = Precedente\nfind_next.title = Trova l’occorrenza successiva del testo da cercare\nfind_next_label = Successivo\nfind_highlight = Evidenzia\nfind_match_case_label = Maiuscole/minuscole\nfind_reached_top = Raggiunto l’inizio della pagina, continua dalla fine\nfind_reached_bottom = Raggiunta la fine della pagina, continua dall’inizio\nfind_not_found = Testo non trovato\nerror_more_info = Più informazioni\nerror_less_info = Meno informazioni\nerror_close = Chiudi\nerror_version_info = PDF.js v{{version}} (build: {{build}})\nerror_message = Messaggio: {{message}}\nerror_stack = Stack: {{stack}}\nerror_file = File: {{file}}\nerror_line = Riga: {{line}}\nrendering_error = Si è verificato un errore durante il rendering della pagina.\npage_scale_width = Larghezza pagina\npage_scale_fit = Adatta a una pagina\npage_scale_auto = Zoom automatico\npage_scale_actual = Dimensioni effettive\nloading_error_indicator = Errore\nloading_error = Si è verificato un errore durante il caricamento del PDF.\ninvalid_file_error = File PDF non valido o danneggiato.\nmissing_file_error = File PDF non disponibile.\ntext_annotation_type.alt = [Annotazione: {{type}}]\npassword_label = Inserire la password per aprire questo file PDF.\npassword_invalid = Password non corretta. Riprovare.\npassword_ok = OK\npassword_cancel = Annulla\nprinting_not_supported = Attenzione: la stampa non è completamente supportata da questo browser.\nprinting_not_ready = Attenzione: il PDF non è ancora stato caricato completamente per la stampa.\nweb_fonts_disabled = I web font risultano disattivati: impossibile utilizzare i caratteri inclusi nel PDF.\ndocument_colors_disabled = Non è possibile per i documenti PDF utilizzare i propri colori: l’opzione del browser “Permetti alle pagine di scegliere i propri colori invece di quelli impostati” è disattivata.\n"
  },
  {
    "path": "web/viewer/locale/ja/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=前のページ\nprevious_label=前へ\nnext.title=次のページ\nnext_label=次へ\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=ページ:\npage_of=/ {{pageCount}}\n\nzoom_out.title=縮小\nzoom_out_label=縮小\nzoom_in.title=拡大\nzoom_in_label=拡大\nzoom.title=拡大/縮小\npresentation_mode.title=プレゼンテーションモードに切り替えます\npresentation_mode_label=プレゼンテーションモード\nopen_file.title=ファイルを開く\nopen_file_label=開く\nprint.title=印刷\nprint_label=印刷\ndownload.title=ダウンロード\ndownload_label=ダウンロード\nbookmark.title=現在のビューをブックマーク\nbookmark_label=現在のビューをブックマーク\n\n# Secondary toolbar and context menu\ntools.title=ツール\ntools_label=ツール\nfirst_page.title=最初のページへ移動\nfirst_page.label=最初のページへ移動\nfirst_page_label=最初のページへ移動\nlast_page.title=最後のページへ移動\nlast_page.label=最後のページへ移動\nlast_page_label=最後のページへ移動\npage_rotate_cw.title=右回転\npage_rotate_cw.label=右回転\npage_rotate_cw_label=右回転\npage_rotate_ccw.title=左回転\npage_rotate_ccw.label=左回転\npage_rotate_ccw_label=左回転\n\nhand_tool_enable.title=手のひらツールを有効にする\nhand_tool_enable_label=手のひらツールを有効にする\nhand_tool_disable.title=手のひらツールを無効にする\nhand_tool_disable_label=手のひらツールを無効にする\n\n# Document properties dialog box\ndocument_properties.title=文書のプロパティ...\ndocument_properties_label=文書のプロパティ...\ndocument_properties_file_name=ファイル名:\ndocument_properties_file_size=ファイルサイズ:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=タイトル:\ndocument_properties_author=作成者:\ndocument_properties_subject=件名:\ndocument_properties_keywords=キーワード:\ndocument_properties_creation_date=作成日:\ndocument_properties_modification_date=更新日:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=アプリケーション:\ndocument_properties_producer=PDF 変換:\ndocument_properties_version=PDF のバージョン:\ndocument_properties_page_count=ページ数:\ndocument_properties_close=閉じる\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=サイドバーの切り替え\ntoggle_sidebar_label=サイドバーの切り替え\noutline.title=文書の目次\noutline_label=文書の目次\nattachments.title=添付ファイル\nattachments_label=添付ファイル\nthumbs.title=縮小版\nthumbs_label=縮小版\nfindbar.title=検索\nfindbar_label=検索\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}} ページ\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=ページの縮小版 {{page}}\n\n# Find panel button title and messages\nfind_label=検索:\nfind_previous.title=指定文字列に一致する 1 つ前の部分を検索します\nfind_previous_label=前へ\nfind_next.title=指定文字列に一致する次の部分を検索します\nfind_next_label=次へ\nfind_highlight=すべて強調表示\nfind_match_case_label=大文字/小文字を区別\nfind_reached_top=文書先頭まで検索したので末尾に戻って検索しました。\nfind_reached_bottom=文書末尾まで検索したので先頭に戻って検索しました。\nfind_not_found=見つかりませんでした。\n\n# Error panel labels\nerror_more_info=詳細情報\nerror_less_info=詳細情報の非表示\nerror_close=閉じる\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (ビルド: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=メッセージ: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=スタック: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ファイル: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=ライン: {{line}}\nrendering_error=ページのレンダリング中にエラーが発生しました\n\n# Predefined zoom values\npage_scale_width=幅に合わせる\npage_scale_fit=ページのサイズに合わせる\npage_scale_auto=自動ズーム\npage_scale_actual=実際のサイズ\n\n# Loading indicator messages\nloading_error_indicator=エラー\nloading_error=PDF の読み込み中にエラーが発生しました\ninvalid_file_error=無効または破損した PDF ファイル\nmissing_file_error=PDF ファイルが見つかりません。\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} 注釈]\npassword_label=この PDF ファイルを開くためのパスワードを入力してください。\npassword_invalid=無効なパスワードです。もう一度やり直してください。\npassword_ok=OK\npassword_cancel=キャンセル\n\nprinting_not_supported=警告: このブラウザでは印刷が完全にサポートされていません\nprinting_not_ready=警告: PDF を印刷するための読み込みが終了していません\nweb_fonts_disabled=Web フォントが無効になっています: 埋め込まれた PDF のフォントを使用することができません\ndocument_colors_disabled=PDF 文書は、Web ページが指定した配色を使用することができません: \\'Web ページが指定した配色\\' はブラウザで無効になっています。\n"
  },
  {
    "path": "web/viewer/locale/ka/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=წინა გვერდი\nprevious_label=წინა\nnext.title=შემდეგი გვერდი\nnext_label=შემდეგი\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=გვერდი:\npage_of=of {{pageCount}}\n\nzoom_out.title=შემცირება\nzoom_out_label=გაზრდა\nzoom_in.title=შემცირება\nzoom_in_label=შემცირება\nzoom.title=მასშტაბი\nprint.title=ამობეჭდვა\nprint_label=ამობეჭდვა\npresentation_mode.title=გადართვა პრეზენტაციის რეჟიმზე\npresentation_mode_label=პრეზენტაციის რეჟიმი\nopen_file.title=ფაილის გახსნა\nopen_file_label=გახსნა\ndownload.title=ჩამოტვირთვა\ndownload_label=ჩამოტვირთვა\nbookmark.title=მიმდინარე ხედი (ასლი ან გახსნა ახალ სარკმელში)\nbookmark_label=მიმდინარე ხედი\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=სტენდის ჩვენება/დამალვა\ntoggle_sidebar_label=სტენდის ჩვენება/დამალვა\noutline.title=დოკუმენტის სქემის ჩვენება\noutline_label=დოკუმენტის სქემა\nthumbs.title=მინიატურების ჩვენება\nthumbs_label=მინიატურები\nfindbar.title=პოვნა დოკუმენტში\nfindbar_label=პოვნა\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=გვერდი {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=მინიატურა გვერდისთვის {{page}}\n\n# Context menu\nfirst_page.label=გადასვლა პირველ გვერდზე\nlast_page.label=გადასვლა ბოლო გვერდზე\npage_rotate_cw.label=დატრიალება\npage_rotate_ccw.label=უკუდატრიალება\n\n# Find panel button title and messages\nfind_label=პოვნა:\nfind_previous.title=კონტექსტის წინა თანხვედრის პოვნა\nfind_previous_label=წინა\nfind_next.title=კონტექსტის შემდეგი თანხვედრის პოვნა\nfind_next_label=შემდეგი\nfind_highlight=ყველას გამოყოფა\nfind_match_case_label=მთავრულის გათვალისწინებით\nfind_reached_top=დოკუმენტის თავი, გრძელდება დოკუმენტის ბოლოდან\nfind_reached_bottom=დოკუმენტის ბოლო, გრძელდება დოკუმენტის თავიდან\nfind_not_found=კონტექსტი ვერ მოიძებნა\n\n# Error panel labels\nerror_more_info=დეტალების ჩვენება\nerror_less_info=დეტალების დამალვა\nerror_close=დახურვა\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (აგება: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=გზავნილი: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=მჭიდი: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ფაილი: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=სტრიქონი: {{line}}\nrendering_error=შეცდომა გვერდის ასახვისას.\n\n# Predefined zoom values\npage_scale_width=გვერდის სიგანეზე\npage_scale_fit=გვერდის შევსება\npage_scale_auto=თვითმასშტაბი\npage_scale_actual=რეალური ზომა\n\n# Loading indicator messages\nloading_error_indicator=შეცდომა\nloading_error=შეცდომა PDF ფაილის ჩატვირთვისას.\ninvalid_file_error=უმართებლო ან დაზიანებული PDF ფაილი.\nmissing_file_error=მცდარი PDF ფაილი.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} ანოტაცია]\nrequest_password=PDF დაცულია პაროლით:\ninvalid_password=პაროლი მცდარია.\n\nprinting_not_supported=გაფრთხილება: ამ ბრაუზერში ამობეჭდვის მხარდაჭერა არასრულია .\nprinting_not_ready=გაფრთხილება: PDF ფაილი ამოსაბეჭდად სრულად არ ჩატვირთულა.\nweb_fonts_disabled=ვებ შრიფტები ამორთულია: ჩადგმული PDF შრიფტებით სარგებლობა ვერ ხერხდება.\ndocument_colors_disabled=PDF დოკუმენტებს ეკრძალებათ საკუთარი ფერების გამოყენება: ბრაუზერში ამორთულია პარამეტრი - «გვერდებისთვის საკუთარი ფერებით სარგებლობის უფლება».\n"
  },
  {
    "path": "web/viewer/locale/kk/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Алдыңғы парақ\nprevious_label=Алдыңғысы\nnext.title=Келесі парақ\nnext_label=Келесі\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Парақ:\npage_of={{pageCount}} ішінен\n\nzoom_out.title=Кішірейту\nzoom_out_label=Кішірейту\nzoom_in.title=Үлкейту\nzoom_in_label=Үлкейту\nzoom.title=Масштаб\npresentation_mode.title=Презентация режиміне ауысу\npresentation_mode_label=Презентация режимі\nopen_file.title=Файлды ашу\nopen_file_label=Ашу\nprint.title=Баспаға шығару\nprint_label=Баспаға шығару\ndownload.title=Жүктеп алу\ndownload_label=Жүктеп алу\nbookmark.title=Ағымдағы көрініс (көшіру не жаңа терезеде ашу)\nbookmark_label=Ағымдағы көрініс\n\n# Secondary toolbar and context menu\ntools.title=Саймандар\ntools_label=Саймандар\nfirst_page.title=Алғашқы параққа өту\nfirst_page.label=Алғашқы параққа өту\nfirst_page_label=Алғашқы параққа өту\nlast_page.title=Соңғы параққа өту\nlast_page.label=Соңғы параққа өту\nlast_page_label=Соңғы параққа өту\npage_rotate_cw.title=Сағат тілі бағытымен айналдыру\npage_rotate_cw.label=Сағат тілі бағытымен бұру\npage_rotate_cw_label=Сағат тілі бағытымен бұру\npage_rotate_ccw.title=Сағат тілі бағытына қарсы бұру\npage_rotate_ccw.label=Сағат тілі бағытына қарсы бұру\npage_rotate_ccw_label=Сағат тілі бағытына қарсы бұру\n\nhand_tool_enable.title=Қол сайманын іске қосу\nhand_tool_enable_label=Қол сайманын іске қосу\nhand_tool_disable.title=Қол сайманын сөндіру\nhand_tool_disable_label=Қол сайманын сөндіру\n\n# Document properties dialog box\ndocument_properties.title=Құжат қасиеттері…\ndocument_properties_label=Құжат қасиеттері…\ndocument_properties_file_name=Файл аты:\ndocument_properties_file_size=Файл өлшемі:\ndocument_properties_kb={{size_kb}} КБ ({{size_b}} байт)\ndocument_properties_mb={{size_mb}} МБ ({{size_b}} байт)\ndocument_properties_title=Тақырыбы...\ndocument_properties_author=Авторы:\ndocument_properties_subject=Тақырыбы:\ndocument_properties_keywords=Кілт сөздер:\ndocument_properties_creation_date=Жасалған күні:\ndocument_properties_modification_date=Түзету күні:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Жасаған:\ndocument_properties_producer=PDF өндірген:\ndocument_properties_version=PDF нұсқасы:\ndocument_properties_page_count=Беттер саны:\ndocument_properties_close=Жабу\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Бүйір панелін көрсету/жасыру\ntoggle_sidebar_label=Бүйір панелін көрсету/жасыру\noutline.title=Құжат құрамасын көрсету\noutline_label=Құжат құрамасы\nattachments.title=Салынымдарды көрсету\nattachments_label=Салынымдар\nthumbs.title=Кіші көріністерді көрсету\nthumbs_label=Кіші көріністер\nfindbar.title=Құжаттан табу\nfindbar_label=Табу\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}} парағы\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} парағы үшін кіші көрінісі\n\n# Find panel button title and messages\nfind_label=Табу:\nfind_previous.title=Осы сөздердің мәтіннен алдыңғы кездесуін табу\nfind_previous_label=Алдыңғысы\nfind_next.title=Осы сөздердің мәтіннен келесі кездесуін табу\nfind_next_label=Келесі\nfind_highlight=Барлығын түспен ерекшелеу\nfind_match_case_label=Регистрді ескеру\nfind_reached_top=Құжаттың басына жеттік, соңынан бастап жалғастырамыз\nfind_reached_bottom=Құжаттың соңына жеттік, басынан бастап жалғастырамыз\nfind_not_found=Сөз(дер) табылмады\n\n# Error panel labels\nerror_more_info=Көбірек ақпарат\nerror_less_info=Азырақ ақпарат\nerror_close=Жабу\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (жинақ: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Хабарлама: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Стек: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Файл: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Жол: {{line}}\nrendering_error=Парақты өңдеу кезінде қате кетті.\n\n# Predefined zoom values\npage_scale_width=Парақ ені\npage_scale_fit=Парақты сыйдыру\npage_scale_auto=Автомасштабтау\npage_scale_actual=Нақты өлшемі\n\n# Loading indicator messages\nloading_error_indicator=Қате\nloading_error=PDF жүктеу кезінде қате кетті.\ninvalid_file_error=Зақымдалған немесе қате PDF файл.\nmissing_file_error=PDF файлы жоқ.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} аңдатпасы]\npassword_label=Бұл PDF файлын ашу үшін парольді енгізіңіз.\npassword_invalid=Пароль дұрыс емес. Қайталап көріңіз.\npassword_ok=ОК\npassword_cancel=Бас тарту\n\nprinting_not_supported=Ескерту: Баспаға шығаруды бұл браузер толығымен қолдамайды.\nprinting_not_ready=Ескерту: Баспаға шығару үшін, бұл PDF толығымен жүктеліп алынбады.\nweb_fonts_disabled=Веб қаріптері сөндірілген: құрамына енгізілген PDF қаріптерін қолдану мүмкін емес.\ndocument_colors_disabled=PDF құжаттарына өздік түстерді қолдану рұқсат етілмеген: бұл браузерде 'Веб-сайттарға өздерінің түстерін қолдануға рұқсат беру' мүмкіндігі сөндірулі тұр.\n"
  },
  {
    "path": "web/viewer/locale/km/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=ទំព័រ​មុន\nprevious_label=មុន\nnext.title=ទំព័រ​បន្ទាប់\nnext_label=បន្ទាប់\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=ទំព័រ ៖\npage_of=នៃ {{pageCount}}\n\nzoom_out.title=​បង្រួម\nzoom_out_label=​បង្រួម\nzoom_in.title=​ពង្រីក\nzoom_in_label=​ពង្រីក\nzoom.title=ពង្រីក\npresentation_mode.title=ប្ដូរ​ទៅ​របៀប​បទ​បង្ហាញ\npresentation_mode_label=របៀប​បទ​បង្ហាញ\nopen_file.title=បើក​ឯកសារ\nopen_file_label=បើក\nprint.title=បោះពុម្ព\nprint_label=បោះពុម្ព\ndownload.title=ទាញ​យក\ndownload_label=ទាញ​យក\nbookmark.title=ទិដ្ឋភាព​បច្ចុប្បន្ន (ចម្លង ឬ​បើក​នៅ​ក្នុង​បង្អួច​ថ្មី)\nbookmark_label=ទិដ្ឋភាព​បច្ចុប្បន្ន\n\n# Secondary toolbar and context menu\ntools.title=ឧបករណ៍\ntools_label=ឧបករណ៍\nfirst_page.title=ទៅកាន់​ទំព័រ​ដំបូង​\nfirst_page.label=ទៅកាន់​ទំព័រ​ដំបូង​\nfirst_page_label=ទៅកាន់​ទំព័រ​ដំបូង​\nlast_page.title=ទៅកាន់​ទំព័រ​ចុងក្រោយ​\nlast_page.label=ទៅកាន់​ទំព័រ​ចុងក្រោយ​\nlast_page_label=ទៅកាន់​ទំព័រ​ចុងក្រោយ\npage_rotate_cw.title=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា\npage_rotate_cw.label=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា\npage_rotate_cw_label=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា\npage_rotate_ccw.title=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​\npage_rotate_ccw.label=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​\npage_rotate_ccw_label=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​\n\nhand_tool_enable.title=បើក​ឧបករណ៍​ដោយ​ដៃ\nhand_tool_enable_label=បើក​ឧបករណ៍​ដោយ​ដៃ\nhand_tool_disable.title=បិទ​ឧបករណ៍​ប្រើ​ដៃ\nhand_tool_disable_label=បិទ​ឧបករណ៍​ប្រើ​ដៃ\n\n# Document properties dialog box\ndocument_properties.title=លក្ខណ​សម្បត្តិ​ឯកសារ…\ndocument_properties_label=លក្ខណ​សម្បត្តិ​ឯកសារ…\ndocument_properties_file_name=ឈ្មោះ​ឯកសារ៖\ndocument_properties_file_size=ទំហំ​ឯកសារ៖\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=ចំណងជើង ៖\ndocument_properties_author=អ្នក​និពន្ធ៖\ndocument_properties_subject=ប្រធានបទ៖\ndocument_properties_keywords=ពាក្យ​គន្លឹះ៖\ndocument_properties_creation_date=កាលបរិច្ឆេទ​បង្កើត៖\ndocument_properties_modification_date=កាលបរិច្ឆេទ​កែប្រែ៖\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=អ្នក​បង្កើត៖\ndocument_properties_producer=កម្មវិធី​បង្កើត PDF ៖\ndocument_properties_version=កំណែ PDF ៖\ndocument_properties_page_count=ចំនួន​ទំព័រ៖\ndocument_properties_close=បិទ\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=បិទ/បើក​គ្រាប់​រំកិល\ntoggle_sidebar_label=បិទ/បើក​គ្រាប់​រំកិល\noutline.title=បង្ហាញ​គ្រោង​ឯកសារ\noutline_label=គ្រោង​ឯកសារ\nattachments.title=បង្ហាញ​ឯកសារ​ភ្ជាប់\nattachments_label=ឯកសារ​ភ្ជាប់\nthumbs.title=បង្ហាញ​រូបភាព​តូចៗ\nthumbs_label=រួបភាព​តូចៗ\nfindbar.title=រក​នៅ​ក្នុង​ឯកសារ\nfindbar_label=រក\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=ទំព័រ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=រូបភាព​តូច​របស់​ទំព័រ {{page}}\n\n# Find panel button title and messages\nfind_label=រក ៖\nfind_previous.title=រក​ពាក្យ ឬ​ឃ្លា​ដែល​បាន​ជួប​មុន\nfind_previous_label=មុន\nfind_next.title=រក​ពាក្យ ឬ​ឃ្លា​ដែល​បាន​ជួប​បន្ទាប់\nfind_next_label=បន្ទាប់\nfind_highlight=បន្លិច​ទាំងអស់\nfind_match_case_label=ករណី​ដំណូច\nfind_reached_top=បាន​បន្ត​ពី​ខាង​ក្រោម ទៅ​ដល់​ខាង​​លើ​នៃ​ឯកសារ\nfind_reached_bottom=បាន​បន្ត​ពី​ខាងលើ ទៅដល់​ចុង​​នៃ​ឯកសារ\nfind_not_found=រក​មិន​ឃើញ​ពាក្យ ឬ​ឃ្លា\n\n# Error panel labels\nerror_more_info=ព័ត៌មាន​បន្ថែម\nerror_less_info=ព័ត៌មាន​តិចតួច\nerror_close=បិទ\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=សារ ៖ {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=ជង់ ៖ {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ឯកសារ ៖ {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=ជួរ ៖ {{line}}\nrendering_error=មាន​កំហុស​បាន​កើតឡើង​ពេល​បង្ហាញ​ទំព័រ ។\n\n# Predefined zoom values\npage_scale_width=ទទឹង​ទំព័រ\npage_scale_fit=សម​ទំព័រ\npage_scale_auto=ពង្រីក​ស្វ័យប្រវត្តិ\npage_scale_actual=ទំហំ​ជាក់ស្ដែង\n\n# Loading indicator messages\nloading_error_indicator=កំហុស\nloading_error=មាន​កំហុស​បាន​កើតឡើង​ពេល​កំពុង​ផ្ទុក PDF ។\ninvalid_file_error=ឯកសារ PDF ខូច ឬ​មិន​ត្រឹមត្រូវ ។\nmissing_file_error=បាត់​ឯកសារ PDF\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} ចំណារ​ពន្យល់]\npassword_label=បញ្ចូល​ពាក្យសម្ងាត់​ដើម្បី​បើក​ឯកសារ PDF នេះ។\npassword_invalid=ពាក្យសម្ងាត់​មិន​ត្រឹមត្រូវ។ សូម​ព្យាយាម​ម្ដងទៀត។\npassword_ok=យល់​ព្រម\npassword_cancel=បោះបង់\n\nprinting_not_supported=ការ​ព្រមាន ៖ កា​រ​បោះពុម្ព​មិន​ត្រូវ​បាន​គាំទ្រ​ពេញលេញ​ដោយ​កម្មវិធី​រុករក​នេះ​ទេ ។\nprinting_not_ready=ព្រមាន៖ PDF មិន​ត្រូវ​បាន​ផ្ទុក​ទាំងស្រុង​ដើម្បី​បោះពុម្ព​ទេ។\nweb_fonts_disabled=បាន​បិទ​ពុម្ពអក្សរ​បណ្ដាញ ៖ មិន​អាច​ប្រើ​ពុម្ពអក្សរ PDF ដែល​បាន​បង្កប់​បាន​ទេ ។\ndocument_colors_disabled=ឯកសារ PDF មិន​ត្រូវ​បាន​អនុញ្ញាត​ឲ្យ​ប្រើ​ពណ៌​ផ្ទាល់​របស់​វា​ទេ៖ 'អនុញ្ញាត​​ឲ្យ​ទំព័រ​ជ្រើស​ពណ៌​ផ្ទាល់​ខ្លួន' ត្រូវ​បាន​ធ្វើ​ឲ្យ​អសកម្ម​ក្នុង​​កម្មវិធី​រុករក។\n"
  },
  {
    "path": "web/viewer/locale/kn/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=ಹಿಂದಿನ ಪುಟ\nprevious_label=ಹಿಂದಿನ\nnext.title=ಮುಂದಿನ ಪುಟ\nnext_label=ಮುಂದಿನ\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=ಪುಟ:\npage_of={{pageCount}} ರಲ್ಲಿ\n\nzoom_out.title=ಕಿರಿದಾಗಿಸು\nzoom_out_label=ಕಿರಿದಾಗಿಸಿ\nzoom_in.title=ಹಿರಿದಾಗಿಸು\nzoom_in_label=ಹಿರಿದಾಗಿಸಿ\nzoom.title=ಗಾತ್ರಬದಲಿಸು\npresentation_mode.title=ಪ್ರಸ್ತುತಿ (ಪ್ರಸೆಂಟೇಶನ್) ಕ್ರಮಕ್ಕೆ ಬದಲಾಯಿಸು\npresentation_mode_label=ಪ್ರಸ್ತುತಿ (ಪ್ರಸೆಂಟೇಶನ್) ಕ್ರಮ\nopen_file.title=ಕಡತವನ್ನು ತೆರೆ\nopen_file_label=ತೆರೆಯಿರಿ\nprint.title=ಮುದ್ರಿಸು\nprint_label=ಮುದ್ರಿಸಿ\ndownload.title=ಇಳಿಸು\ndownload_label=ಇಳಿಸಿಕೊಳ್ಳಿ\nbookmark.title=ಪ್ರಸಕ್ತ ನೋಟ (ಪ್ರತಿ ಮಾಡು ಅಥವ ಹೊಸ ಕಿಟಕಿಯಲ್ಲಿ ತೆರೆ)\nbookmark_label=ಪ್ರಸಕ್ತ ನೋಟ\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\ndocument_properties_title=ಶೀರ್ಷಿಕೆ:\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=ಬದಿಪಟ್ಟಿಯನ್ನು ಹೊರಳಿಸು\ntoggle_sidebar_label=ಬದಿಪಟ್ಟಿಯನ್ನು ಹೊರಳಿಸು\noutline.title=ದಸ್ತಾವೇಜಿನ ಹೊರರೇಖೆಯನ್ನು ತೋರಿಸು\noutline_label=ದಸ್ತಾವೇಜಿನ ಹೊರರೇಖೆ\nthumbs.title=ಚಿಕ್ಕಚಿತ್ರದಂತೆ ತೋರಿಸು\nthumbs_label=ಚಿಕ್ಕಚಿತ್ರಗಳು\nfindbar.title=ದಸ್ತಾವೇಜಿನಲ್ಲಿ ಹುಡುಕು\nfindbar_label=ಹುಡುಕು\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=ಪುಟ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=ಪುಟವನ್ನು ಚಿಕ್ಕಚಿತ್ರದಂತೆ ತೋರಿಸು {{page}}\n\n# Find panel button title and messages\nfind_label=ಹುಡುಕು:\nfind_previous.title=ವಾಕ್ಯದ ಹಿಂದಿನ ಇರುವಿಕೆಯನ್ನು ಹುಡುಕು\nfind_previous_label=ಹಿಂದಿನ\nfind_next.title=ವಾಕ್ಯದ ಮುಂದಿನ ಇರುವಿಕೆಯನ್ನು ಹುಡುಕು\nfind_next_label=ಮುಂದಿನ\nfind_highlight=ಎಲ್ಲವನ್ನು ಹೈಲೈಟ್ ಮಾಡು\nfind_match_case_label=ಕೇಸನ್ನು ಹೊಂದಿಸು\nfind_reached_top=ದಸ್ತಾವೇಜಿನ ಮೇಲ್ಭಾಗವನ್ನು ತಲುಪಿದೆ, ಕೆಳಗಿನಿಂದ ಆರಂಭಿಸು\nfind_reached_bottom=ದಸ್ತಾವೇಜಿನ ಕೊನೆಯನ್ನು ತಲುಪಿದೆ, ಮೇಲಿನಿಂದ ಆರಂಭಿಸು\nfind_not_found=ವಾಕ್ಯವು ಕಂಡು ಬಂದಿಲ್ಲ\n\n# Error panel labels\nerror_more_info=ಹೆಚ್ಚಿನ ಮಾಹಿತಿ\nerror_less_info=ಕಡಿಮೆ ಮಾಹಿತಿ\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=ಸಂದೇಶ: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=ರಾಶಿ: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ಕಡತ: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=ಸಾಲು: {{line}}\nrendering_error=ಪುಟವನ್ನು ನಿರೂಪಿಸುವಾಗ ಒಂದು ದೋಷ ಎದುರಾಗಿದೆ.\n\n# Predefined zoom values\npage_scale_width=ಪುಟದ ಅಗಲ\npage_scale_fit=ಪುಟದ ಸರಿಹೊಂದಿಕೆ\npage_scale_auto=ಸ್ವಯಂಚಾಲಿತ ಗಾತ್ರಬದಲಾವಣೆ\npage_scale_actual=ನಿಜವಾದ ಗಾತ್ರ\n\n# Loading indicator messages\nloading_error_indicator=ದೋಷ\nloading_error=PDF ಅನ್ನು ಲೋಡ್ ಮಾಡುವಾಗ ಒಂದು ದೋಷ ಎದುರಾಗಿದೆ.\ninvalid_file_error=ಅಮಾನ್ಯವಾದ ಅಥವ ಹಾಳಾದ PDF ಕಡತ.\nmissing_file_error=PDF ಕಡತ ಇಲ್ಲ.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} ಟಿಪ್ಪಣಿ]\npassword_ok=OK\npassword_cancel=ರದ್ದು ಮಾಡು\n\nprinting_not_supported=ಎಚ್ಚರಿಕೆ: ಈ ಜಾಲವೀಕ್ಷಕದಲ್ಲಿ ಮುದ್ರಣಕ್ಕೆ ಸಂಪೂರ್ಣ ಬೆಂಬಲವಿಲ್ಲ.\nprinting_not_ready=ಎಚ್ಚರಿಕೆ: PDF ಕಡತವು ಮುದ್ರಿಸಲು ಸಂಪೂರ್ಣವಾಗಿ ಲೋಡ್ ಆಗಿಲ್ಲ.\nweb_fonts_disabled=ಜಾಲ ಅಕ್ಷರಶೈಲಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ: ಅಡಕಗೊಳಿಸಿದ PDF ಅಕ್ಷರಶೈಲಿಗಳನ್ನು ಬಳಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ.\ndocument_colors_disabled=PDF ದಸ್ತಾವೇಜುಗಳು ತಮ್ಮದೆ ಆದ ಬಣ್ಣಗಳನ್ನು ಬಳಸಲು ಅನುಮತಿ ಇರುವುದಿಲ್ಲ: 'ಪುಟಗಳು ತಮ್ಮದೆ ಆದ ಬಣ್ಣವನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಅನುಮತಿಸು' ಅನ್ನು ಜಾಲವೀಕ್ಷಕದಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿರುತ್ತದೆ.\n"
  },
  {
    "path": "web/viewer/locale/ko/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=이전 페이지\nprevious_label=이전\nnext.title=다음 페이지\nnext_label=다음\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=페이지:\npage_of=/{{pageCount}}\n\nzoom_out.title=축소\nzoom_out_label=축소\nzoom_in.title=확대\nzoom_in_label=확대\nzoom.title=크기\nprint.title=인쇄\nprint_label=인쇄\npresentation_mode.title=발표 모드로 전환\npresentation_mode_label=발표 모드\nopen_file.title=파일 열기\nopen_file_label=열기\ndownload.title=다운로드\ndownload_label=다운로드\nbookmark.title=지금 보이는 그대로 (복사하거나 새 창에 열기)\nbookmark_label=지금 보이는 그대로\n\n# Secondary toolbar and context menu\ntools.title=도구\ntools_label=도구\nfirst_page.title=첫 페이지로 이동\nfirst_page.label=첫 페이지로 이동\nfirst_page_label=첫 페이지로 이동\nlast_page.title=마지막 페이지로 이동\nlast_page.label=마지막 페이지로 이동\nlast_page_label=마지막 페이지로 이동\npage_rotate_cw.title=시계방향으로 회전\npage_rotate_cw.label=시계방향으로 회전\npage_rotate_cw_label=시계방향으로 회전\npage_rotate_ccw.title=시계 반대방향으로 회전\npage_rotate_ccw.label=시계 반대방향으로 회전\npage_rotate_ccw_label=시계 반대방향으로 회전\n\nhand_tool_enable.title=손 도구 켜기\nhand_tool_enable_label=손 도구 켜기\nhand_tool_disable.title=손 도구 끄기\nhand_tool_disable_label=손 도구 끄기\n\n# Document properties dialog box\ndocument_properties.title=문서 속성…\ndocument_properties_label=문서 속성…\ndocument_properties_file_name=파일 이름:\ndocument_properties_file_size=파일 사이즈:\ndocument_properties_kb={{size_kb}} KB ({{size_b}}바이트)\ndocument_properties_mb={{size_mb}} MB ({{size_b}}바이트)\ndocument_properties_title=제목:\ndocument_properties_author=저자:\ndocument_properties_subject=주제:\ndocument_properties_keywords=키워드:\ndocument_properties_creation_date=생성일:\ndocument_properties_modification_date=수정일:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=생성자:\ndocument_properties_producer=PDF 생성기:\ndocument_properties_version=PDF 버전:\ndocument_properties_page_count=총 페이지:\ndocument_properties_close=닫기\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=탐색창 열고 닫기\ntoggle_sidebar_label=탐색창 열고 닫기\noutline.title=문서 개요 보기\noutline_label=문서 개요\nattachments.title=첨부파일 보기\nattachments_label=첨부파일\nthumbs.title=미리보기\nthumbs_label=미리보기\nfindbar.title=검색\nfindbar_label=검색\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}}쪽\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}}쪽 미리보기\n\n# Find panel button title and messages\nfind_label=검색:\nfind_previous.title=지정 문자열에 일치하는 1개 부분을 검색\nfind_previous_label=이전\nfind_next.title=지정 문자열에 일치하는 다음 부분을 검색\nfind_next_label=다음\nfind_highlight=모두 강조 표시\nfind_match_case_label=대문자/소문자 구별\nfind_reached_top=문서 처음까지 검색하고 끝으로 돌아와 검색했습니다.\nfind_reached_bottom=문서 끝까지 검색하고 앞으로 돌아와 검색했습니다.\nfind_not_found=검색 결과 없음\n\n# Error panel labels\nerror_more_info=정보 더 보기\nerror_less_info=정보 간단히 보기\nerror_close=닫기\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (빌드: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=메시지: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=스택: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=파일: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=줄 번호: {{line}}\nrendering_error=페이지를 렌더링하다 오류가 났습니다.\n\n# Predefined zoom values\npage_scale_width=페이지 너비에 맞춤\npage_scale_fit=페이지에 맞춤\npage_scale_auto=알아서 맞춤\npage_scale_actual=실제 크기에 맞춤\n\n# Loading indicator messages\nloading_error_indicator=오류\nloading_error=PDF를 읽는 중 오류가 생겼습니다.\ninvalid_file_error=유효하지 않거나 파손된 PDF 파일\nmissing_file_error=PDF 파일이 없습니다.\n\n# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.\n# \"{{[type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} 주석]\npassword_label=이 PDF 파일을 열 수 있는 암호를 입력하십시오.\npassword_invalid=잘못된 암호입니다. 다시 시도해 주십시오.\npassword_ok=확인\npassword_cancel=취소\n\nprinting_not_supported=경고: 이 브라우저는 인쇄를 완전히 지원하지 않습니다.\nprinting_not_ready=경고: 이 PDF를 인쇄를 할 수 있을 정도로 읽어들이지 못했습니다.\nweb_fonts_disabled=웹 폰트가 꺼져있음: 내장된 PDF 글꼴을 쓸 수 없습니다.\ndocument_colors_disabled=PDF 문서의 색상을 쓰지 못하게 되어 있음: \\'웹 페이지 자체 색상 사용 허용\\'이 브라우저에서 꺼져 있습니다.\n"
  },
  {
    "path": "web/viewer/locale/ku/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Rûpela berê\nprevious_label=Paşve\nnext.title=Rûpela pêş\nnext_label=Pêş\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Rûpel:\npage_of=/ {{pageCount}}\n\nzoom_out.title=Dûr bike\nzoom_out_label=Dûr bike\nzoom_in.title=Nêzîk bike\nzoom_in_label=Nêzîk bike\nzoom.title=Nêzîk Bike\npresentation_mode.title=Derbasî mûda pêşkêşkariyê bibe\npresentation_mode_label=Moda Pêşkêşkariyê\nopen_file.title=Pelî veke\nopen_file_label=Veke\nprint.title=Çap bike\nprint_label=Çap bike\ndownload.title=Jêbar bike\ndownload_label=Jêbar bike\nbookmark.title=Xuyakirina niha (kopî yan jî di pencereyeke nû de veke)\nbookmark_label=Xuyakirina niha\n\n# Secondary toolbar and context menu\ntools.title=Amûr\ntools_label=Amûr\nfirst_page.title=Here rûpela yekemîn\nfirst_page.label=Here rûpela yekemîn\nfirst_page_label=Here rûpela yekemîn\nlast_page.title=Here rûpela dawîn\nlast_page.label=Here rûpela dawîn\nlast_page_label=Here rûpela dawîn\npage_rotate_cw.title=Bi aliyê saetê ve bizivirîne\npage_rotate_cw.label=Bi aliyê saetê ve bizivirîne\npage_rotate_cw_label=Bi aliyê saetê ve bizivirîne\npage_rotate_ccw.title=Berevajî aliyê saetê ve bizivirîne\npage_rotate_ccw.label=Berevajî aliyê saetê ve bizivirîne\npage_rotate_ccw_label=Berevajî aliyê saetê ve bizivirîne\n\n\n# Document properties dialog box\ndocument_properties_title=Sernav:\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Darikê kêlekê veke/bigire\ntoggle_sidebar_label=Darikê kêlekê veke/bigire\noutline.title=Şemaya belgeyê nîşan bide\noutline_label=Şemaya belgeyê\nthumbs.title=Wênekokan nîşan bide\nthumbs_label=Wênekok\nfindbar.title=Di belgeyê de bibîne\nfindbar_label=Bibîne\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Rûpel {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Wênekoka rûpelê {{page}}\n\n# Find panel button title and messages\nfind_label=Bibîne:\nfind_previous.title=Peyva berê bibîne\nfind_previous_label=Paşve\nfind_next.title=Peyya pêş bibîne\nfind_next_label=Pêşve\nfind_highlight=Tevî beloq bike\nfind_match_case_label=Ji bo tîpên hûrdek-girdek bihîstyar\nfind_reached_top=Gihîşt serê rûpelê, ji dawiya rûpelê bidomîne\nfind_reached_bottom=Gihîşt dawiya rûpelê, ji serê rûpelê bidomîne\nfind_not_found=Peyv nehat dîtin\n\n# Error panel labels\nerror_more_info=Zêdetir agahî\nerror_less_info=Zêdetir agahî\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js versiyon {{version}} (avanî: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Peyam: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Komik: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Pel: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rêzik: {{line}}\nrendering_error=Di vehûrandina rûpelê de çewtî çêbû.\n\n# Predefined zoom values\npage_scale_width=Firehiya rûpelê\npage_scale_fit=Di rûpelê de bicî bike\npage_scale_auto=Xweber nêzîk bike\npage_scale_actual=Mezinahiya rastîn\n\n# Loading indicator messages\nloading_error_indicator=Xeletî\nloading_error=Dema ku PDF dihat barkirin çewtiyek çêbû.\ninvalid_file_error=Pelê PDFê nederbasdar yan jî xirabe ye.\nmissing_file_error=Pelê PDFê kêm e.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Nîşaneya {{type}}ê]\npassword_label=Ji bo PDFê vekî şîfreyê binivîse.\npassword_invalid=Şîfre çewt e. Tika ye dîsa biceribîne.\npassword_ok=Temam\npassword_cancel=Betal\n\nprinting_not_supported=Hişyarî: Çapkirin ji hêla vê gerokê ve bi temamî nayê destekirin.\nprinting_not_ready=Hişyarî: PDF bi temamî nehat barkirin û ji bo çapê ne amade ye.\nweb_fonts_disabled=Fontên Webê neçalak in: Fontên PDFê yên veşartî nayên bikaranîn.\ndocument_colors_disabled=Destûr tune ye ku belgeyên PDFê rengên xwe bi kar bînin: Di gerokê de 'destûrê bide rûpelan ku rengên xwe bi kar bînin' nehatiye çalakirin.\n"
  },
  {
    "path": "web/viewer/locale/lg/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Omuko  Ogubadewo\nnext.title=Omuko Oguddako\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Omuko:\npage_of=ku {{pageCount}}\n\nzoom_out.title=Zimbulukusa\nzoom_out_label=Zimbulukusa\nzoom_in.title=Funza Munda\nzoom_in_label=Funza Munda\nzoom.title=Gezzamu\nopen_file.title=Bikula Fayiro\nopen_file_label=Ggulawo\nprint.title=Fulumya\nprint_label=Fulumya\ndownload.title=Tikula\ndownload_label=Tikula\nbookmark.title=Endabika eriwo (koppa oba gulawo mu diriisa epya)\nbookmark_label=Endabika Eriwo\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\noutline.title=Laga Ensalo ze Kiwandiko\noutline_label=Ensalo ze Ekiwandiko\nthumbs.title=Laga Ekifanyi Mubufunze\nthumbs_label=Ekifanyi Mubufunze\nfindbar_label=Zuula\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Omuko {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Ekifananyi kyo Omuko Mubufunze {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Zuula awayise mukweddamu mumiteddera\nfind_next.title=Zuula ekidako mukweddamu mumiteddera\nfind_highlight=Londa byonna\nfind_not_found=Emiteddera tezuuliddwa\n\n# Error panel labels\nerror_more_info=Ebisingawo\nerror_less_info=Mubumpimpi\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Obubaaka: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Ebipangiddwa: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fayiro {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Layini: {{line}}\nrendering_error=Wabadewo ensobi muku tekawo omuko.\n\n# Predefined zoom values\npage_scale_width=Obugazi bwo Omuko\npage_scale_fit=Okutuka kwo Omuko\npage_scale_auto=Okwefunza no Kwegeza\npage_scale_actual=Obunene Obutufu\n\n# Loading indicator messages\nloading_error_indicator=Ensobi\nloading_error=Wabadewo ensobi mukutika PDF.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Enyonyola]\npassword_ok=OK\npassword_cancel=Sazaamu\n\nprinting_not_supported=Okulaabula: Okulumya empapula tekuwagirwa enonyeso enno.\n"
  },
  {
    "path": "web/viewer/locale/lij/viewer.properties",
    "content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nprevious.title = Pàgina precedénte\nprevious_label = Precedénte\nnext.title = Pàgina dòppo\nnext_label = Pròscima\npage_label = Pàgina:\npage_of = de {{pageCount}}\nzoom_out.title = Diminoìsci zoom\nzoom_out_label = Diminoìsci zoom\nzoom_in.title = Aoménta zoom\nzoom_in_label = Aoménta zoom\nzoom.title = Zoom\nprint.title = Stànpa\nprint_label = Stànpa\nopen_file.title = Àrvi file\nopen_file_label = Àrvi\ndownload.title = Descaregaménto\ndownload_label = Descaregaménto\nbookmark.title = Vixón corénte (còpia ò àrvi inte 'n nêuvo barcón)\nbookmark_label = Vixón corénte\noutline.title = Véddi strutûa documénto\noutline_label = Strutûa documénto\nthumbs.title = Móstra miniatûe\nthumbs_label = Miniatûe\nthumb_page_title = Pàgina {{page}}\nthumb_page_canvas = Miniatûa da pàgina {{page}}\nerror_more_info = Ciù informaçioìn\nerror_less_info = Mêno informaçioìn\nerror_version_info = PDF.js v{{version}} (build: {{build}})\nerror_close = Særa\nmissing_file_error = O file PDF o no gh'é.\ntoggle_sidebar.title = Atîva/dizatîva bâra de sciànco\ntoggle_sidebar_label = Atîva/dizatîva bâra de sciànco\nerror_message = Mesàggio: {{message}}\nerror_stack = Stack: {{stack}}\nerror_file = File: {{file}}\nerror_line = Lìnia: {{line}}\nrendering_error = Gh'é stæto 'n'erô itno rendering da pàgina.\npage_scale_width = Larghéssa pàgina\npage_scale_fit = Adàtta a una pàgina\npage_scale_auto = Zoom aotomàtico\npage_scale_actual = Dimenscioìn efetîve\nloading_error_indicator = Erô\nloading_error = S'é verificòu 'n'erô itno caregaménto do PDF.\nprinting_not_supported = Atençión: a stànpa a no l'é conpletaménte soportâ da sto navegatô.\n\n# Context menu\npage_rotate_cw.label=Gîa in sénso do reléuio\npage_rotate_ccw.label=Gîa in sénso do reléuio a-a revèrsa\n\npresentation_mode.title=Vànni into mòddo de prezentaçión\npresentation_mode_label=Mòddo de prezentaçión\n\nfind_label = Trêuva:\nfind_previous.title = Trêuva a ripetiçión precedénte do tèsto da çercâ\nfind_previous_label = Precedénte\nfind_next.title = Trêuva a ripetiçión dòppo do tèsto da çercâ\nfind_next_label = Segoénte\nfind_highlight = Evidénçia\nfind_match_case_label = Maióscole/minóscole\nfind_reached_bottom = Razónto l'inìçio da pàgina, contìnoa da-a fìn\nfind_reached_top = Razónto a fìn da pàgina, contìnoa da l'inìçio\nfind_not_found = Tèsto no trovòu\nfindbar.title = Trêuva into documénto\nfindbar_label = Trêuva\nfirst_page.label = Vànni a-a prìmma pàgina\nlast_page.label = Vànni a l'ùrtima pàgina\ninvalid_file_error = O file PDF o l'é no vàlido ò aroinòu.\n\nweb_fonts_disabled = I font do web én dizativæ: inposcìbile adêuviâ i caràteri do PDF.\nprinting_not_ready = Atençión: o PDF o no l'é ancón caregòu conpletaménte pe-a stànpa.\n\ndocument_colors_disabled = No l'é poscìbile adêuviâ i pròpi coî pe-i documénti PDF: l'opçión do navegatô 'Permètti a-e pàgine de çèrne i pròpi coî in càngio de quélli inpostæ' a l'é dizativâ.\ntext_annotation_type.alt = [Anotaçión: {{type}}]\n\nfirst_page.title = Vànni a-a prìmma pàgina\nfirst_page_label = Vànni a-a prìmma pàgina\nlast_page.title = Vànni a l'ùrtima pàgina\nlast_page_label = Vànni a l'ùrtima pàgina\npage_rotate_ccw.title = Gîa into vèrso antiorâio\npage_rotate_ccw_label = Gîa into vèrso antiorâio\npage_rotate_cw.title = Gîa into vèrso orâio\npage_rotate_cw_label = Gîa into vèrso orâio\ntools.title = Struménti\ntools_label = Struménti\npassword_label = Dìmme a paròlla segrêta pe arvî sto file PDF.\npassword_invalid = Paròlla segrêta sbaliâ. Prêuva tórna.\npassword_ok = Va bén\npassword_cancel = Anùlla\n\ndocument_properties.title = Propietæ do documénto…\ndocument_properties_label = Propietæ do documénto…\ndocument_properties_file_name = Nómme file:\ndocument_properties_file_size = Dimensción file:\ndocument_properties_kb = {{size_kb}} kB ({{size_b}} byte)\ndocument_properties_mb = {{size_kb}} MB ({{size_b}} byte)\ndocument_properties_title = Tìtolo:\ndocument_properties_author = Aotô:\ndocument_properties_subject = Ogétto:\ndocument_properties_keywords = Paròlle ciâve:\ndocument_properties_creation_date = Dæta creaçión:\ndocument_properties_modification_date = Dæta cangiaménto:\ndocument_properties_date_string = {{date}}, {{time}}\ndocument_properties_creator = Aotô originâle:\ndocument_properties_producer = Produtô PDF:\ndocument_properties_version = Versción PDF:\ndocument_properties_page_count = Contézzo pàgine:\ndocument_properties_close = Særa\n\nhand_tool_enable.title = Atîva struménto màn\nhand_tool_enable_label = Atîva struménto màn\nhand_tool_disable.title = Dizatîva struménto màn\nhand_tool_disable_label = Dizatîva struménto màn\n"
  },
  {
    "path": "web/viewer/locale/locale.properties",
    "content": "[ach]\n@import url(ach/viewer.properties)\n\n[af]\n@import url(af/viewer.properties)\n\n[ak]\n@import url(ak/viewer.properties)\n\n[an]\n@import url(an/viewer.properties)\n\n[ar]\n@import url(ar/viewer.properties)\n\n[as]\n@import url(as/viewer.properties)\n\n[ast]\n@import url(ast/viewer.properties)\n\n[az]\n@import url(az/viewer.properties)\n\n[be]\n@import url(be/viewer.properties)\n\n[bg]\n@import url(bg/viewer.properties)\n\n[bn-BD]\n@import url(bn-BD/viewer.properties)\n\n[bn-IN]\n@import url(bn-IN/viewer.properties)\n\n[br]\n@import url(br/viewer.properties)\n\n[bs]\n@import url(bs/viewer.properties)\n\n[ca]\n@import url(ca/viewer.properties)\n\n[cs]\n@import url(cs/viewer.properties)\n\n[csb]\n@import url(csb/viewer.properties)\n\n[cy]\n@import url(cy/viewer.properties)\n\n[da]\n@import url(da/viewer.properties)\n\n[de]\n@import url(de/viewer.properties)\n\n[el]\n@import url(el/viewer.properties)\n\n[en-GB]\n@import url(en-GB/viewer.properties)\n\n[en-US]\n@import url(en-US/viewer.properties)\n\n[en-ZA]\n@import url(en-ZA/viewer.properties)\n\n[eo]\n@import url(eo/viewer.properties)\n\n[es-AR]\n@import url(es-AR/viewer.properties)\n\n[es-CL]\n@import url(es-CL/viewer.properties)\n\n[es-ES]\n@import url(es-ES/viewer.properties)\n\n[es-MX]\n@import url(es-MX/viewer.properties)\n\n[et]\n@import url(et/viewer.properties)\n\n[eu]\n@import url(eu/viewer.properties)\n\n[fa]\n@import url(fa/viewer.properties)\n\n[ff]\n@import url(ff/viewer.properties)\n\n[fi]\n@import url(fi/viewer.properties)\n\n[fr]\n@import url(fr/viewer.properties)\n\n[fy-NL]\n@import url(fy-NL/viewer.properties)\n\n[ga-IE]\n@import url(ga-IE/viewer.properties)\n\n[gd]\n@import url(gd/viewer.properties)\n\n[gl]\n@import url(gl/viewer.properties)\n\n[gu-IN]\n@import url(gu-IN/viewer.properties)\n\n[he]\n@import url(he/viewer.properties)\n\n[hi-IN]\n@import url(hi-IN/viewer.properties)\n\n[hr]\n@import url(hr/viewer.properties)\n\n[hu]\n@import url(hu/viewer.properties)\n\n[hy-AM]\n@import url(hy-AM/viewer.properties)\n\n[id]\n@import url(id/viewer.properties)\n\n[is]\n@import url(is/viewer.properties)\n\n[it]\n@import url(it/viewer.properties)\n\n[ja]\n@import url(ja/viewer.properties)\n\n[ka]\n@import url(ka/viewer.properties)\n\n[kk]\n@import url(kk/viewer.properties)\n\n[km]\n@import url(km/viewer.properties)\n\n[kn]\n@import url(kn/viewer.properties)\n\n[ko]\n@import url(ko/viewer.properties)\n\n[ku]\n@import url(ku/viewer.properties)\n\n[lg]\n@import url(lg/viewer.properties)\n\n[lij]\n@import url(lij/viewer.properties)\n\n[lt]\n@import url(lt/viewer.properties)\n\n[lv]\n@import url(lv/viewer.properties)\n\n[mai]\n@import url(mai/viewer.properties)\n\n[mk]\n@import url(mk/viewer.properties)\n\n[ml]\n@import url(ml/viewer.properties)\n\n[mn]\n@import url(mn/viewer.properties)\n\n[mr]\n@import url(mr/viewer.properties)\n\n[ms]\n@import url(ms/viewer.properties)\n\n[my]\n@import url(my/viewer.properties)\n\n[nb-NO]\n@import url(nb-NO/viewer.properties)\n\n[nl]\n@import url(nl/viewer.properties)\n\n[nn-NO]\n@import url(nn-NO/viewer.properties)\n\n[nso]\n@import url(nso/viewer.properties)\n\n[oc]\n@import url(oc/viewer.properties)\n\n[or]\n@import url(or/viewer.properties)\n\n[pa-IN]\n@import url(pa-IN/viewer.properties)\n\n[pl]\n@import url(pl/viewer.properties)\n\n[pt-BR]\n@import url(pt-BR/viewer.properties)\n\n[pt-PT]\n@import url(pt-PT/viewer.properties)\n\n[rm]\n@import url(rm/viewer.properties)\n\n[ro]\n@import url(ro/viewer.properties)\n\n[ru]\n@import url(ru/viewer.properties)\n\n[rw]\n@import url(rw/viewer.properties)\n\n[sah]\n@import url(sah/viewer.properties)\n\n[si]\n@import url(si/viewer.properties)\n\n[sk]\n@import url(sk/viewer.properties)\n\n[sl]\n@import url(sl/viewer.properties)\n\n[son]\n@import url(son/viewer.properties)\n\n[sq]\n@import url(sq/viewer.properties)\n\n[sr]\n@import url(sr/viewer.properties)\n\n[sv-SE]\n@import url(sv-SE/viewer.properties)\n\n[sw]\n@import url(sw/viewer.properties)\n\n[ta]\n@import url(ta/viewer.properties)\n\n[ta-LK]\n@import url(ta-LK/viewer.properties)\n\n[te]\n@import url(te/viewer.properties)\n\n[th]\n@import url(th/viewer.properties)\n\n[tl]\n@import url(tl/viewer.properties)\n\n[tn]\n@import url(tn/viewer.properties)\n\n[tr]\n@import url(tr/viewer.properties)\n\n[uk]\n@import url(uk/viewer.properties)\n\n[ur]\n@import url(ur/viewer.properties)\n\n[vi]\n@import url(vi/viewer.properties)\n\n[wo]\n@import url(wo/viewer.properties)\n\n[xh]\n@import url(xh/viewer.properties)\n\n[zh-CN]\n@import url(zh-CN/viewer.properties)\n\n[zh-TW]\n@import url(zh-TW/viewer.properties)\n\n[zu]\n@import url(zu/viewer.properties)\n\n"
  },
  {
    "path": "web/viewer/locale/lt/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Ankstesnis puslapis\nprevious_label=Ankstesnis\nnext.title=Kitas puslapis\nnext_label=Kitas\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Puslapis:\npage_of=iš {{pageCount}}\n\nzoom_out.title=Sumažinti\nzoom_out_label=Sumažinti\nzoom_in.title=Padidinti\nzoom_in_label=Padidinti\nzoom.title=Mastelis\nprint.title=Spausdinti\nprint_label=Spausdinti\npresentation_mode.title=Pereiti į pateikties veikseną\npresentation_mode_label=Pateikties veiksena\nopen_file.title=Atverti failą\nopen_file_label=Atverti\ndownload.title=Parsiųsti\ndownload_label=Parsiųsti\nbookmark.title=Esamojo rodinio saitas (kopijavimui ar atvėrimui kitame lange)\nbookmark_label=Esamasis rodinys\n\n# Secondary toolbar and context menu\ntools.title=Priemonės\ntools_label=Priemonės\nfirst_page.title=Eiti į pirmą puslapį\nfirst_page.label=Eiti į pirmą puslapį\nfirst_page_label=Eiti į pirmą puslapį\nlast_page.title=Eiti į paskutinį puslapį\nlast_page.label=Eiti į paskutinį puslapį\nlast_page_label=Eiti į paskutinį puslapį\npage_rotate_cw.title=Pasukti pagal laikrodžio rodyklę\npage_rotate_cw.label=Pasukti pagal laikrodžio rodyklę\npage_rotate_cw_label=Pasukti pagal laikrodžio rodyklę\npage_rotate_ccw.title=Pasukti prieš laikrodžio rodyklę\npage_rotate_ccw.label=Pasukti prieš laikrodžio rodyklę\npage_rotate_ccw_label=Pasukti prieš laikrodžio rodyklę\n\nhand_tool_enable.title=Įgalinti vilkimo veikseną\nhand_tool_enable_label=Įgalinti vilkimo veikseną\nhand_tool_disable.title=Išjungti vilkimo veikseną\nhand_tool_disable_label=Išjungti vilkimo veikseną\n\n# Document properties dialog box\ndocument_properties.title=Dokumento savybės…\ndocument_properties_label=Dokumento savybės…\ndocument_properties_file_name=Failo vardas:\ndocument_properties_file_size=Failo dydis:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} B)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} B)\ndocument_properties_title=Antraštė:\ndocument_properties_author=Autorius:\ndocument_properties_subject=Tema:\ndocument_properties_keywords=Reikšminiai žodžiai:\ndocument_properties_creation_date=Sukūrimo data:\ndocument_properties_modification_date=Modifikavimo data:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Kūrėjas:\ndocument_properties_producer=PDF generatorius:\ndocument_properties_version=PDF versija:\ndocument_properties_page_count=Puslapių skaičius:\ndocument_properties_close=Užverti\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Rodyti / slėpti šoninį polangį\ntoggle_sidebar_label=Šoninis polangis\noutline.title=Rodyti dokumento metmenis\noutline_label=Dokumento metmenys\nthumbs.title=Rodyti puslapių miniatiūras\nthumbs_label=Miniatiūros\nfindbar.title=Ieškoti dokumente\nfindbar_label=Ieškoti\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}} puslapis\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} puslapio miniatiūra\n\n# Find panel button title and messages\nfind_label=Ieškoti:\nfind_previous.title=Ieškoti ankstesnio frazės egzemplioriaus\nfind_previous_label=Ankstesnis\nfind_next.title=Ieškoti tolesnio frazės egzemplioriaus\nfind_next_label=Tolesnis\nfind_highlight=Viską paryškinti\nfind_match_case_label=Skirti didžiąsias ir mažąsias raides\nfind_reached_top=Pasiekus dokumento pradžią, paieška pratęsta nuo pabaigos\nfind_reached_bottom=Pasiekus dokumento pabaigą, paieška pratęsta nuo pradžios\nfind_not_found=Ieškoma frazė nerasta\n\n# Error panel labels\nerror_more_info=Išsamiau\nerror_less_info=Glausčiau\nerror_close=Užverti\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v. {{version}} (darinys: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Pranešimas: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Dėklas: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Failas: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Eilutė: {{line}}\nrendering_error=Atvaizduojant puslapį, įvyko klaida.\n\n# Predefined zoom values\npage_scale_width=Priderinti prie lapo pločio\npage_scale_fit=Pritaikyti prie lapo dydžio\npage_scale_auto=Automatinis mastelis\npage_scale_actual=Tikras dydis\n\n# Loading indicator messages\nloading_error_indicator=Klaida\nloading_error=Įkeliant PDF failą, įvyko klaida.\ninvalid_file_error=Tai nėra PDF failas arba jis yra sugadintas.\nmissing_file_error=PDF failas nerastas.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[„{{type}}“ tipo anotacija]\npassword_label=Įveskite slaptažodį šiam PDF failui atverti.\npassword_invalid=Slaptažodis neteisingas. Bandykite dar kartą.\npassword_ok=Gerai\npassword_cancel=Atsisakyti\n\nprinting_not_supported=Dėmesio! Spausdinimas šioje naršyklėje nėra pilnai realizuotas.\nprinting_not_ready=Dėmesio! PDF failas dar nėra pilnai įkeltas spausdinimui.\nweb_fonts_disabled=Neįgalinti saityno šriftai – šiame PDF faile esančių šriftų naudoti negalima.\ndocument_colors_disabled=PDF dokumentams neleidžiama nurodyti savo spalvų, nes išjungta naršyklės nuostata „Leisti tinklalapiams nurodyti spalvas“.\n"
  },
  {
    "path": "web/viewer/locale/lv/viewer.properties",
    "content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Iepriekšējā lapa\nprevious_label=Iepriekšējā\nnext.title=Nākamā lapa\nnext_label=Nākamā\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Lapa:\npage_of=no {{pageCount}}\n\nzoom_out.title=Attālināt \nzoom_out_label=Attālināt\nzoom_in.title=Pietuvināt\nzoom_in_label=Pietuvināt\nzoom.title=Palielinājums\nprint.title=Drukāšana\nprint_label=Drukāt\npresentation_mode.title=Pārslēgties uz Prezentācijas režīmu\npresentation_mode_label=Prezentācijas režīms\nopen_file.title=Atvērt failu\nopen_file_label=Atvērt\ndownload.title=Lejupielāde\ndownload_label=Lejupielādēt\nbookmark.title=Pašreizējais skats (kopēt vai atvērt jaunā logā)\nbookmark_label=Pašreizējais skats\nfindbar.title=Meklēt dokumentā\nfindbar_label=Meklēt\nattachments.title=Rādīt pielikumus\nattachments_label=Pielikumi\n\n\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Pārslēgt sānu joslu\ntoggle_sidebar_label=Pārslēgt sānu joslu\noutline.title=Parādīt dokumenta saturu\noutline_label=Dokumenta saturs\nthumbs.title=Parādīt sīktēlus\nthumbs_label=Sīktēli\n\n# Find panel button title and messages\nfind_label=Meklēt:\nfind_previous.title=Atrast iepriekšējo\nfind_previous_label=Iepriekšējā\nfind_next.title=Atrast nākamo\nfind_next_label=Nākamā\nfind_highlight=Iekrāsot visas\nfind_match_case_label=Lielo, mazo burtu jutīgs\nfind_reached_top=Sasniegts dokumenta sākums, turpinām no beigām\nfind_reached_bottom=Sasniegtas dokumenta beigas, turpinām no sākuma\nfind_not_found=Frāze nav atrasta\nfirst_page.title=Iet uz pirmo lapu\nfirst_page.label=Iet uz pirmo lapu\nfirst_page_label=Iet uz pirmo lapu\nlast_page.title=Iet uz pēdējo lapu\nlast_page.label=Iet uz pēdējo lapu\nlast_page_label=Iet uz pēdējo lapu\ntools.title=Rīki\ntools_label=Rīki\npage_rotate_cw.title=Pagriezt pa pulksteni\npage_rotate_cw.label=Pagriezt pa pulksteni\npage_rotate_cw_label=Pagriezt pa pulksteni\npage_rotate_ccw.title=Pagriezt pret pulksteni\npage_rotate_ccw.label=Pagriezt pret pulksteni\npage_rotate_ccw_label=Pagriezt pret pulksteni\n\n# Document properties dialog box\ndocument_properties.title=Dokumenta iestatījumi…\ndocument_properties_label=Dokumenta iestatījumi…\ndocument_properties_file_name=Faila nosaukums:\ndocument_properties_file_size=Faila izmērs:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} biti)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} biti)\ndocument_properties_title=Nosaukums:\ndocument_properties_author=Autors:\ndocument_properties_subject=Tēma:\ndocument_properties_keywords=Atslēgas vārdi:\ndocument_properties_creation_date=Izveides datums:\ndocument_properties_modification_date=LAbošanas datums:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Radītājs:\ndocument_properties_producer=PDF producents:\ndocument_properties_version=PDF versija:\ndocument_properties_page_count=Lapu skaits:\ndocument_properties_close=Aizvērt\n\nhand_tool_enable.title=Aktivēt rokas rīku\nhand_tool_enable_label=Aktivēt rokas rīku\nhand_tool_disable.title=Deaktivēt rokas rīku\nhand_tool_disable_label=Deaktivēt rokas rīku\n\ninvalid_file_error=Nederīgs vai bojāts PDF fails.\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Lapa {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Lapas {{page}} sīktēls\n\n# Error panel labels\nerror_more_info=Vairāk informācijas\nerror_less_info=MAzāk informācijas\nerror_close=Close\n\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Ziņojums: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Steks: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rindiņa: {{line}}\nrendering_error=Attēlojot lapu radās kļūda\nmissing_file_error=PDF fails nav atrasts.\n\n# Predefined zoom values\npage_scale_width=Lapas platumā\npage_scale_fit=Ietilpinot lapu\npage_scale_auto=Automātiskais izmērs\npage_scale_actual=Patiesais izmērs\n\n# Loading indicator messages\n# LOCALIZATION NOTE (error_line): \"{{[percent}}\" will be replaced with a percentage\nloading_error_indicator=Kļūda\nloading_error=Ielādējot PDF notika kļūda.\n\n# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.\n# \"{{[type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} anotācija]\n\ntext_annotation_type.alt=[{{type}} Anotācija]\npassword_label=Ievadiet paroli, lai atvērtu PDF failu.\npassword_invalid=Nepareiza parole, mēģiniet vēlreiz.\npassword_ok=Labi\npassword_cancel=Atcelt\n\n\nprinting_not_supported=Uzmanību: Drukāšana no šī pārlūka darbojas tikai daļēji.\nweb_fonts_disabled=Tīmekļa fonti nav aktivizēti: Nevar iegult PDF fontus.\nprinting_not_ready=Uzmanību: PDF nav pilnībā ielādēts drukāšanai.\ndocument_colors_disabled=PDF dokumentiem nav atļauts izmantot pašiem savas krāsas: \\'Atļaut lapām izvēlēties pašām savas krāsas\\' ir deaktivēts pārlūkā.\n\n"
  },
  {
    "path": "web/viewer/locale/mai/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=पछिला पृष्ठ\nprevious_label=पछिला\nnext.title=अगिला पृष्ठ\nnext_label=आगाँ\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=पृष्ठ:\npage_of={{pageCount}} क\n\nzoom_out.title=छोट करू\nzoom_out_label=छोट करू\nzoom_in.title=पैघ करू\nzoom_in_label=जूम इन\nzoom.title=छोट-पैघ करू\\u0020\npresentation_mode.title=प्रस्तुति अवस्थामे जाउ\npresentation_mode_label=प्रस्तुति अवस्था\nopen_file.title=फाइल खोलू\nopen_file_label=खोलू\nprint.title=छापू\nprint_label=छापू\ndownload.title=डाउनलोड\ndownload_label=डाउनलोड\nbookmark.title=मोजुदा दृश्य (नव विंडोमे नकल लिअ अथवा खोलू)\nbookmark_label=वर्तमान दृश्य\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\ndocument_properties_title=शीर्षक:\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=स्लाइडर टागल\ntoggle_sidebar_label=स्लाइडर टागल\noutline.title=दस्तावेज आउटलाइन देखाउ\noutline_label=दस्तावेज खाका\nthumbs.title=लघु-छवि देखाउ\nthumbs_label=लघु छवि\nfindbar.title=दस्तावेजमे ढूँढू\nfindbar_label=ताकू\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=पृष्ठ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=पृष्ठ {{page}} का लघु-चित्र\n\n# Find panel button title and messages\nfind_label=ताकू:\nfind_previous.title=खोजक पछिला उपस्थिति ताकू\nfind_previous_label=पछिला\nfind_next.title=खोजक अगिला उपस्थिति ताकू\nfind_next_label=आगाँ\nfind_highlight=सभटा आलोकित करू\nfind_match_case_label=मिलान स्थिति\nfind_reached_top=पृष्ठक शीर्ष जाए पहुँचल, तल सँ जारी\nfind_reached_bottom=पृष्ठक तल मे जाए पहुँचल, शीर्ष सँ जारी\nfind_not_found=वाकींश नहि भेटल\n\n# Error panel labels\nerror_more_info=बेसी  सूचना\nerror_less_info=कम सूचना\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=संदेश: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=स्टैक: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=फ़ाइल: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=पंक्ति: {{line}}\nrendering_error=पृष्ठ रेंडरिंगक समय त्रुटि आएल.\n\n# Predefined zoom values\npage_scale_width=पृष्ठ चओड़ाइ\npage_scale_fit=पृष्ठ फिट\npage_scale_auto=स्वचालित जूम\npage_scale_actual=सही आकार\n\n# Loading indicator messages\nloading_error_indicator=त्रुटि\nloading_error=पीडीएफ लोड करैत समय एकटा त्रुटि भेल.\ninvalid_file_error=अमान्य अथवा भ्रष्ट PDF फाइल.\nmissing_file_error=अनुपस्थित PDF फाइल.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_cancel=रद्द  करू\\u0020\n\nprinting_not_supported=चेतावनी: ई ब्राउजर पर छपाइ पूर्ण तरह सँ समर्थित नहि अछि.\nprinting_not_ready=चेतावनी: पीडीएफ छपाइक लेल पूर्ण तरह सँ लोड नहि अछि.\nweb_fonts_disabled=वेब फॉन्ट्स निष्क्रिय अछि: अंतःस्थापित PDF फान्टसक उपयोगमे असमर्थ.\n"
  },
  {
    "path": "web/viewer/locale/mk/viewer.properties",
    "content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Претходна страница\nprevious_label=Претходна\nnext.title=Следна страница\nnext_label=Следна\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Страница:\npage_of=од {{pageCount}}\n\nzoom_out.title=Намалување\nzoom_out_label=Намали\nzoom_in.title=Зголемување\nzoom_in_label=Зголеми\nzoom.title=Променување на големина\nprint.title=Печатење\nprint_label=Печати\nopen_file.title=Отварање  датотека\nopen_file_label=Отвори\ndownload.title=Преземање\ndownload_label=Преземи\nbookmark.title=Овој преглед (копирај или отвори во нов прозорец)\nbookmark_label=Овој преглед\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_slider.title=Вклучување на лизгач\ntoggle_slider_label=Вклучи лизгач\noutline.title=Прикажување на содржина на документот\noutline_label=Содржина на документот\nthumbs.title=Прикажување на икони\nthumbs_label=Икони\n\n# Document outline messages\nno_outline=Нема содржина\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Страница {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Икона од страница {{page}}\n\n# Error panel labels\nerror_more_info=Повеќе информации\nerror_less_info=Помалку информации\nerror_close=Затвори\n# LOCALIZATION NOTE (error_build): \"{{build}}\" will be replaced by the PDF.JS\n# build ID.\nerror_build=PDF.JS Build: {{build}}\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Порака: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Датотека: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Линија: {{line}}\nrendering_error=Настана грешка при прикажувањето на страницата.\n\n# Predefined zoom values\npage_scale_width=Ширина на страница\npage_scale_fit=Цела страница\npage_scale_auto=Автоматска големина\npage_scale_actual=Вистинска големина\n\nloading_error_indicator=Грешка\nloading_error=Настана грешка при вчитувањето на PDF-от.\n\n# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.\n# \"{{[type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type=[{{type}} Забелешка]\nrequest_password=PDF-от е заштитен со лозинка:\n\n\nprinting_not_supported=Предупредување: Печатењето не е целосно поддржано во овој прелистувач.\n\nfind_highlight=Означи сѐ\n\n# Find panel button title and messages\nfind_label=Најди:\nfind_match_case_label=Токму така\nfind_next.title=Најди ја следната појава на фразата\nfind_next_label=Следно\nfind_not_found=Фразата не е пронајдена\nfind_previous.title=Најди ја предходната појава на фразата\nfind_previous_label=Претходно\nfind_reached_bottom=Барањето стигна до крајот на документот и почнува од почеток\nfind_reached_top=Барањето стигна до почетокот на документот и почнува од крајот\nfindbar.title=Најди во документот\nfindbar_label=Најди\n\n# Context menu\nfirst_page.label=Оди до првата страница\ninvalid_file_error=Невалидна или корумпирана PDF датотека.\nlast_page.label=Оди до последната страница\npage_rotate_ccw.label=Ротирај спротивно од стрелките на часовникот\npage_rotate_cw.label=Ротирај по стрелките на часовникот\npresentation_mode.title=Премини во презентациски режим\npresentation_mode_label=Презентациски режим\n\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\nmissing_file_error=Недостасува PDF документ.\nprinting_not_ready=Предупредување: PDF документот не е целосно вчитан за печатење.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Вклучи странична лента\ntoggle_sidebar_label=Вклучи странична лента\nweb_fonts_disabled=Интернет фонтовите се оневозможени: не може да се користат вградените PDF фонтови.\n"
  },
  {
    "path": "web/viewer/locale/ml/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=മുമ്പുള്ള താള്‍\nprevious_label=മുമ്പു്\nnext.title=അടുത്ത താള്‍\nnext_label=അടുത്തതു്\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=താള്‍:\npage_of={{pageCount}}\n\nzoom_out.title=ചെറുതാക്കുക\nzoom_out_label=ചെറുതാക്കുക\nzoom_in.title=വലുതാക്കുക\nzoom_in_label=വലുതാക്കുക\nzoom.title=വ്യാപ്തി മാറ്റുക\npresentation_mode.title=പ്രസന്റേഷന്‍ രീതിയിലേക്കു് മാറ്റുക\npresentation_mode_label=പ്രസന്റേഷന്‍ രീതി\nopen_file.title=ഫയല്‍ തുറക്കുക\nopen_file_label=തുറക്കുക\nprint.title=പ്രിന്റ് ചെയ്യുക\nprint_label=പ്രിന്റ് ചെയ്യുക\ndownload.title=ഡൌണ്‍ലോഡ് ചെയ്യുക\ndownload_label=ഡൌണ്‍ലോഡ് ചെയ്യുക\nbookmark.title=നിലവിലുള്ള കാഴ്ച (പുതിയ ജാലകത്തില്‍ പകര്‍ത്തുക അല്ലെങ്കില്‍ തുറക്കുക)\nbookmark_label=നിലവിലുള്ള കാഴ്ച\n\n# Secondary toolbar and context menu\ntools.title=ഉപകരണങ്ങള്‍\ntools_label=ഉപകരണങ്ങള്‍\nfirst_page.title=ആദ്യത്തെ താളിലേയ്ക്കു് പോകുക\nfirst_page.label=ആദ്യത്തെ താളിലേയ്ക്കു് പോകുക\nfirst_page_label=ആദ്യത്തെ താളിലേയ്ക്കു് പോകുക\nlast_page.title=അവസാന താളിലേയ്ക്കു് പോകുക\nlast_page.label=അവസാന താളിലേയ്ക്കു് പോകുക\nlast_page_label=അവസാന താളിലേയ്ക്കു് പോകുക\npage_rotate_cw.title=ഘടികാരദിശയില്‍ കറക്കുക\npage_rotate_cw.label=ഘടികാരദിശയില്‍ കറക്കുക\npage_rotate_cw_label=ഘടികാരദിശയില്‍ കറക്കുക\npage_rotate_ccw.title=ഘടികാര ദിശയ്ക്കു് വിപരീതമായി കറക്കുക\npage_rotate_ccw.label=ഘടികാര ദിശയ്ക്കു് വിപരീതമായി കറക്കുക\npage_rotate_ccw_label=ഘടികാര ദിശയ്ക്കു് വിപരീതമായി കറക്കുക\n\n\n# Document properties dialog box\ndocument_properties_title=തലക്കെട്ട്‌\\u0020\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=സൈഡ് ബാറിലേക്കു് മാറ്റുക\ntoggle_sidebar_label=സൈഡ് ബാറിലേക്കു് മാറ്റുക\noutline.title=രേഖയുടെ ഔട്ട്ലൈന്‍ കാണിയ്ക്കുക\noutline_label=രേഖയുടെ ഔട്ട്ലൈന്‍\nthumbs.title=തംബ്നെയിലുകള്‍ കാണിയ്ക്കുക\nthumbs_label=തംബ്നെയിലുകള്‍\nfindbar.title=രേഖയില്‍ കണ്ടുപിടിയ്ക്കുക\nfindbar_label=കണ്ടെത്തുക\\u0020\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=താള്‍ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} താളിനുള്ള തംബ്നെയില്‍\n\n# Find panel button title and messages\nfind_label=കണ്ടെത്തുക\nfind_previous.title=വാചകം ഇതിനു മുന്‍പ്‌ ആവര്‍ത്തിച്ചത്‌ കണ്ടെത്തുക\\u0020\nfind_previous_label=മുമ്പു്\nfind_next.title=വാചകം വീണ്ടും ആവര്‍ത്തിക്കുന്നത്‌ കണ്ടെത്തുക\\u0020\nfind_next_label=അടുത്തതു്\nfind_highlight=എല്ലാം എടുത്തുകാണിയ്ക്കുക\nfind_match_case_label=അക്ഷരങ്ങള്‍ ഒത്തുനോക്കുക\nfind_reached_top=രേഖയുടെ മുകളില്‍ എത്തിയിരിക്കുന്നു, താഴെ നിന്നും തുടരുന്നു\nfind_reached_bottom=രേഖയുടെ അവസാനം വരെ എത്തിയിരിക്കുന്നു, മുകളില്‍ നിന്നും തുടരുന്നു\\u0020\nfind_not_found=വാചകം കണ്ടെത്താനായില്ല\\u0020\n\n# Error panel labels\nerror_more_info=കൂടുതല്‍ വിവരം\nerror_less_info=കുറച്ച് വിവരം\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=സന്ദേശം: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=സ്റ്റാക്ക്: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ഫയല്‍: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=വരി: {{line}}\nrendering_error=താള്‍ റെണ്ടര്‍ ചെയ്യുമ്പോള്‍‌ പിശകുണ്ടായിരിയ്ക്കുന്നു.\n\n# Predefined zoom values\npage_scale_width=താളിന്റെ വീതി\npage_scale_fit=താള്‍ പാകത്തിനാക്കുക\npage_scale_auto=സ്വയമായി വലുതാക്കുക\npage_scale_actual=യഥാര്‍ത്ഥ വ്യാപ്തി\n\n# Loading indicator messages\nloading_error_indicator=പിശക്\nloading_error=പിഡിഎഫ് ലഭ്യമാക്കുമ്പോള്‍ പിശക് ഉണ്ടായിരിയ്ക്കുന്നു.\ninvalid_file_error=തെറ്റായ അല്ലെങ്കില്‍ തകരാറുള്ള പിഡിഎഫ് ഫയല്‍.\nmissing_file_error=പിഡിഎഫ് ഫയല്‍ ലഭ്യമല്ല.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=ഈ പിഡിഎഫ് ഫയല്‍ തുറക്കുന്നതിനു് രഹസ്യവാക്ക് നല്‍കുക.\npassword_invalid=തെറ്റായ രഹസ്യവാക്ക്, ദയവായി വീണ്ടും ശ്രമിയ്ക്കുക.\npassword_ok=ശരി\npassword_cancel=റദ്ദാക്കുക\n\nprinting_not_supported=മുന്നറിയിപ്പു്: ഈ ബ്രൌസര്‍ പൂര്‍ണ്ണമായി പ്രിന്റിങ് പിന്തുണയ്ക്കുന്നില്ല.\nprinting_not_ready=മുന്നറിയിപ്പു്: പ്രിന്റ് ചെയ്യുന്നതിനു് പിഡിഎഫ് പൂര്‍ണ്ണമായി ലഭ്യമല്ല.\nweb_fonts_disabled=വെബിനുള്ള അക്ഷരസഞ്ചയങ്ങള്‍ പ്രവര്‍ത്തന രഹിതം: എംബഡ്ഡ് ചെയ്ത പിഡിഎഫ് അക്ഷരസഞ്ചയങ്ങള്‍ ഉപയോഗിയ്ക്കുവാന്‍ സാധ്യമല്ല.\ndocument_colors_disabled=സ്വന്തം നിറങ്ങള്‍ ഉപയോഗിയ്ക്കുവാന്‍ പിഡിഎഫ് രേഖകള്‍ക്കു് അനുവാദമില്ല:  'സ്വന്തം നിറങ്ങള്‍ ഉപയോഗിയ്ക്കുവാന്‍ താളുകളെ അനുവദിയ്ക്കുക' എന്നതു് ബ്രൌസറില്‍ നിര്‍ജീവമാണു്.\n"
  },
  {
    "path": "web/viewer/locale/mn/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\n\nzoom.title=Тэлэлт\nopen_file.title=Файл нээ\nopen_file_label=Нээ\n\n# Secondary toolbar and context menu\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\nfindbar_label=Ол\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\n\n# Find panel button title and messages\nfind_previous.title=Хайлтын өмнөх олдцыг харуулна\nfind_next.title=Хайлтын дараагийн олдцыг харуулна\nfind_not_found=Олдсонгүй\n\n# Error panel labels\nerror_more_info=Нэмэлт мэдээлэл\nerror_close=Хаа\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\n\n# Predefined zoom values\n\n# Loading indicator messages\nloading_error_indicator=Алдаа\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\n\n"
  },
  {
    "path": "web/viewer/locale/mr/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=मागील पृष्ठ\nprevious_label=मागील\nnext.title=पुढील पृष्ठ\nnext_label=पुढील\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=पृष्ठ:\npage_of=पैकी {{pageCount}}\n\nzoom_out.title=छोटे करा\nzoom_out_label=छोटे करा\nzoom_in.title=मोठे करा\nzoom_in_label=मोठे करा\nzoom.title=लहान किंवा मोठे करा\npresentation_mode.title=प्रस्तुतिकरण मोडचा वापर करा\npresentation_mode_label=प्रस्तुतिकरण मोड\nopen_file.title=फाइल उघडा\nopen_file_label=उघडा\nprint.title=छपाई करा\nprint_label=छपाई करा\ndownload.title=डाउनलोड करा\ndownload_label=डाउनलोड करा\nbookmark.title=सध्याचे अवलोकन (नविन पटलात प्रत बनवा किंवा उघडा)\nbookmark_label=सध्याचे अवलोकन\n\n# Secondary toolbar and context menu\ntools.title=साधने\ntools_label=साधने\nfirst_page.title=पहिल्या पानावर जा\nfirst_page.label=पहिल्या पानावर जा\nfirst_page_label=पहिल्या पानावर जा\nlast_page.title=शेवटच्या पानावर जा\nlast_page.label=शेवटच्या पानावर जा\nlast_page_label=शेवटच्या पानावर जा\npage_rotate_cw.title=घड्याळाच्या काट्याच्या दिशेने फिरवा\npage_rotate_cw.label=घड्याळाच्या काट्याच्या दिशेने फिरवा\npage_rotate_cw_label=घड्याळाच्या काट्याच्या दिशेने फिरवा\npage_rotate_ccw.title=घड्याळाच्या काट्याच्या उलट दिशेने फिरवा\npage_rotate_ccw.label=घड्याळाच्या काट्याच्या उलट दिशेने फिरवा\npage_rotate_ccw_label=घड्याळाच्या काट्याच्या उलट दिशेने फिरवा\n\nhand_tool_enable.title=हात साधन सुरू करा\nhand_tool_enable_label=हात साधन सुरू करा\nhand_tool_disable.title=हात साधन बंद करा\nhand_tool_disable_label=हात साधन बंद करा\n\n# Document properties dialog box\ndocument_properties.title=दस्तऐवज गुणधर्म…\ndocument_properties_label=दस्तऐवज गुणधर्म…\ndocument_properties_file_name=फाइलचे नाव:\ndocument_properties_file_size=फाइल आकार:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} बाइट्स)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} बाइट्स)\ndocument_properties_title=शिर्षक:\ndocument_properties_author=लेखक:\ndocument_properties_subject=विषय:\ndocument_properties_keywords=मुख्यशब्द:\ndocument_properties_creation_date=निर्माण दिनांक:\ndocument_properties_modification_date=दुरूस्ती दिनांक:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=निर्माता:\ndocument_properties_producer=PDF निर्माता:\ndocument_properties_version=PDF आवृत्ती:\ndocument_properties_page_count=पृष्ठ संख्या:\ndocument_properties_close=बंद करा\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=बाजूचीपट्टी टॉगल करा\ntoggle_sidebar_label=बाजूचीपट्टी टॉगल करा\noutline.title=दस्तऐवज रूपरेषा दाखवा\noutline_label=दस्तऐवज रूपरेषा\nattachments.title=जोडपत्र दाखवा\nattachments_label=जोडपत्र\nthumbs.title=थंबनेल्स् दाखवा\nthumbs_label=थंबनेल्स्\nfindbar.title=दस्तऐवजात शोधा\nfindbar_label=शोधा\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=पृष्ठ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=पृष्ठाचे थंबनेल {{page}}\n\n# Find panel button title and messages\nfind_label=शोधा:\nfind_previous.title=वाकप्रयोगची मागील घटना शोधा\nfind_previous_label=मागील\nfind_next.title=वाकप्रयोगची पुढील घटना शोधा\nfind_next_label=पुढील\nfind_highlight=सर्व ठळक करा\nfind_match_case_label=आकार जुळवा\nfind_reached_top=दस्तऐवजाच्या शीर्षकास पोहचले, तळपासून पुढे\nfind_reached_bottom=दस्तऐवजाच्या तळाला पोहचले, शीर्षकापासून पुढे\nfind_not_found=वाकप्रयोग आढळले नाही\n\n# Error panel labels\nerror_more_info=आणखी माहिती\nerror_less_info=कमी माहिती\nerror_close=बंद करा\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=संदेश: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=स्टॅक: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=फाइल: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=रेष: {{line}}\nrendering_error=पृष्ठ दाखवतेवेळी त्रुटी आढळली.\n\n# Predefined zoom values\npage_scale_width=पृष्ठाची रूंदी\npage_scale_fit=पृष्ठ बसवा\npage_scale_auto=स्वयं लाहन किंवा मोठे करणे\npage_scale_actual=प्रत्यक्ष आकार\n\n# Loading indicator messages\nloading_error_indicator=त्रुटी\nloading_error=PDF लोड करतेवेळी त्रुटी आढळली.\ninvalid_file_error=अवैध किंवा दोषीत PDF फाइल.\nmissing_file_error=न आढळणारी PDF फाइल.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} टिपण्णी]\npassword_label=ही PDF फाइल उघडण्याकरिता पासवर्ड द्या.\npassword_invalid=अवैध पासवर्ड. कृपया पुन्हा प्रयत्न करा.\npassword_ok=ठीक आहे\npassword_cancel=रद्द करा\n\nprinting_not_supported=सावधानता: या ब्राउजरतर्फे छपाइ पूर्णपणे समर्थीत नाही.\nprinting_not_ready=सावधानता: छपाईकरिता PDF पूर्णतया लोड झाले नाही.\nweb_fonts_disabled=वेब फाँट्स असमर्थीत आहेत: एम्बेडेड PDF फाँट्स्चा वापर अशक्य.\ndocument_colors_disabled=PDF दस्ताएवजांना त्यांचे रंग वापरण्यास अनुमती नाही: ब्राउजरमध्ये ' पानांना त्यांचे रंग निवडण्यास अनुमती द्या' बंद केले आहे.\n"
  },
  {
    "path": "web/viewer/locale/ms/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Laman Sebelumnya\nprevious_label=Terdahulu\nnext.title=Laman seterusnya\nnext_label=Berikut\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Laman:\npage_of=daripada {{pageCount}}\n\nzoom_out.title=Zum Keluar\nzoom_out_label=Zum Keluar\nzoom_in.title=Zum Masuk\nzoom_in_label=Zum Masuk\nzoom.title=Zum\npresentation_mode.title=Bertukar ke Mod Persembahan\npresentation_mode_label=Mod Persembahan\nopen_file.title=Buka Fail\nopen_file_label=Buka\nprint.title=Cetak\nprint_label=Cetak\ndownload.title=Muat turun\ndownload_label=Muat turun\nbookmark.title=Pandangan semasa (salinan atau dibuka dalam tetingkap baru)\nbookmark_label=Lihat semasa\n\n# Secondary toolbar and context menu\ntools.title=Alatan\ntools_label=Alatan\nfirst_page.title=Pergi ke Halaman Pertama\nfirst_page.label=Pergi ke Halaman Pertama\nfirst_page_label=Pergi ke Halaman Pertama\nlast_page.title=Pergi ke Halaman Terakhir\nlast_page.label=Pergi ke Halaman Terakhir\nlast_page_label=Pergi ke Halaman Terakhir\npage_rotate_cw.title=Berputar ikut arah Jam\npage_rotate_cw.label=Berputar ikut arah Jam\npage_rotate_cw_label=Berputar ikut arah Jam\npage_rotate_ccw.title=Pusing berlawan arah jam\npage_rotate_ccw.label=Pusing berlawan arah jam\npage_rotate_ccw_label=Pusing berlawan arah jam\n\nhand_tool_enable.title=Bolehkan alatan tangan\nhand_tool_enable_label=Bolehkan alatan tangan\nhand_tool_disable.title=Lumpuhkan alatan tangan\nhand_tool_disable_label=Lumpuhkan alatan tangan\n\n# Document properties dialog box\ndocument_properties.title=Ciri Dokumen…\ndocument_properties_label=Ciri Dokumen…\ndocument_properties_file_name=Nama fail:\ndocument_properties_file_size=Saiz fail:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bait)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bait)\ndocument_properties_title=Tajuk:\ndocument_properties_author=Pengarang:\ndocument_properties_subject=Subjek:\ndocument_properties_keywords=Kata kunci:\ndocument_properties_creation_date=Masa Dicipta:\ndocument_properties_modification_date=Tarikh Ubahsuai:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Pencipta:\ndocument_properties_producer=Pengeluar PDF:\ndocument_properties_version=Versi PDF:\ndocument_properties_page_count=Kiraan Laman:\ndocument_properties_close=Tutup\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Togol Bar Sisi\ntoggle_sidebar_label=Togol Bar Sisi\noutline.title=Tunjuk Rangka Dokumen\noutline_label=Rangka Dokument\nthumbs.title=Tunjuk Imej kecil\nthumbs_label=Imej kecil\nfindbar.title=Cari didalam Dokumen\nfindbar_label=Cari\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Halaman {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Halaman Imej kecil {{page}}\n\n# Find panel button title and messages\nfind_label=Cari:\nfind_previous.title=Cari teks frasa berkenaan yang terdahulu\nfind_previous_label=Sebelumnya\nfind_next.title=Cari teks frasa berkenaan yang berikut\nfind_next_label=Berikut\nfind_highlight=Serlahkan semua\nfind_match_case_label=Kes Sepadan\nfind_reached_top=Mencapai teratas daripada dokumen, sambungan daripada bawah\nfind_reached_bottom=Mencapai terakhir daripada dokumen, sambungan daripada atas\nfind_not_found=Frasa tidak ditemui\n\n# Error panel labels\nerror_more_info=Maklumat lanjut\nerror_less_info=Kurang Informasi\nerror_close=Tutup\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mesej: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Timbun: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fail: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Garis: {{line}}\nrendering_error=Ralat berlaku ketika memberikan halaman.\n\n# Predefined zoom values\npage_scale_width=Lebar Halaman\npage_scale_fit=Muat Halaman\npage_scale_auto=Zoom Automatik\npage_scale_actual=Saiz Sebenar\n\n# Loading indicator messages\nloading_error_indicator=Ralat\nloading_error=Masalah berlaku semasa menuatkan sebuah PDF.\ninvalid_file_error=Tidak sah atau fail PDF rosak.\nmissing_file_error=Fail PDF Hilang.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Anotasi]\npassword_label=Masukan kata kunci untuk membuka fail PDF ini.\npassword_invalid=Kata laluan salah. Cuba lagi.\npassword_ok=OK\npassword_cancel=Batal\n\nprinting_not_supported=Amaran: Cetakan ini tidak sepenuhnya disokong oleh pelayar ini.\nprinting_not_ready=Amaran: PDF tidak sepenuhnya dimuatkan untuk dicetak.\nweb_fonts_disabled=Fon web dilumpuhkan: tidak dapat fon PDF terbenam.\ndocument_colors_disabled=Dokumen PDF tidak dibenarkan untuk menggunakan warna sendiri: 'Benarkan muka surat untuk memilih warna sendiri' telah dinyahaktif dalam pelayar.\n"
  },
  {
    "path": "web/viewer/locale/my/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=အရင် စာမျက်နှာ\nprevious_label=အရင်နေရာ\nnext.title=ရှေ့ စာမျက်နှာ\nnext_label=နောက်တခု\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=စာမျက်နှာ -\npage_of=၏ {{pageCount}}\n\nzoom_out.title=ချုံ့ပါ\nzoom_out_label=ချုံ့ပါ\nzoom_in.title=ချဲ့ပါ\nzoom_in_label=ချဲ့ပါ\nzoom.title=ချုံ့/ချဲ့ပါ\npresentation_mode.title=Switch to Presentation Mode\npresentation_mode_label=Presentation Mode\nopen_file.title=ဖိုင်အားဖွင့်ပါ။\nopen_file_label=ဖွင့်ပါ\nprint.title=ပုံနှိုပ်ပါ\nprint_label=ပုံနှိုပ်ပါ\ndownload.title=ကူးဆွဲ\ndownload_label=ကူးဆွဲ\nbookmark.title=လက်ရှိ မြင်ကွင်း (ဝင်းဒိုးအသစ်မှာ ကူးပါ သို့မဟုတ် ဖွင့်ပါ)\nbookmark_label=လက်ရှိ မြင်ကွင်း\n\n# Secondary toolbar and context menu\ntools.title=ကိရိယာများ\ntools_label=ကိရိယာများ\nfirst_page.title=ပထမ စာမျက်နှာသို့\nfirst_page.label=ပထမ စာမျက်နှာသို့\nfirst_page_label=ပထမ စာမျက်နှာသို့\nlast_page.title=နောက်ဆုံး စာမျက်နှာသို့\nlast_page.label=နောက်ဆုံး စာမျက်နှာသို့\nlast_page_label=နောက်ဆုံး စာမျက်နှာသို့\npage_rotate_cw.title=နာရီလက်တံ အတိုင်း\npage_rotate_cw.label=နာရီလက်တံ အတိုင်း\npage_rotate_cw_label=နာရီလက်တံ အတိုင်း\npage_rotate_ccw.title=နာရီလက်တံ ပြောင်းပြန်\npage_rotate_ccw.label=နာရီလက်တံ ပြောင်းပြန်\npage_rotate_ccw_label=နာရီလက်တံ ပြောင်းပြန်\n\nhand_tool_enable.title=လက်ကိုင် ကိရိယာအားသုံး\nhand_tool_enable_label=လက်ကိုင် ကိရိယာဖွင့်\nhand_tool_disable.title=လက်ကိုင် ကိရိယာအားပိတ်\nhand_tool_disable_label=လက်ကိုင်ကိရိယာ အားပိတ်\n\n# Document properties dialog box\ndocument_properties.title=မှတ်တမ်းမှတ်ရာ ဂုဏ်သတ္တိများ\ndocument_properties_label=မှတ်တမ်းမှတ်ရာ ဂုဏ်သတ္တိများ\ndocument_properties_file_name=ဖိုင် :\ndocument_properties_file_size=ဖိုင်ဆိုဒ် :\ndocument_properties_kb={{size_kb}} ကီလိုဘိုတ် ({size_kb}}ဘိုတ်)\ndocument_properties_mb={{size_mb}} မစ်ဂါဘိုတ် ({size_b}} ဘိုတ်)\ndocument_properties_title=ခေါင်းစဉ်‌ -\ndocument_properties_author=ရေးသားသူ:\ndocument_properties_subject=အကြောင်းအရာ:\\u0020\ndocument_properties_keywords=သော့ချက် စာလုံး:\ndocument_properties_creation_date=ထုတ်လုပ်ရက်စွဲ:\ndocument_properties_modification_date=ပြင်ဆင်ရက်စွဲ:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=ဖန်တီးသူ:\ndocument_properties_producer=PDF ထုတ်လုပ်သူ:\ndocument_properties_version=PDF ဗားရှင်း:\ndocument_properties_page_count=စာမျက်နှာအရေအတွက်:\ndocument_properties_close=ပိတ်\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=ဘေးတန်းဖွင့်ပိတ်\ntoggle_sidebar_label=ဖွင့်ပိတ် ဆလိုက်ဒါ\noutline.title=စာတမ်း မူကြမ်း ကိုပြပါ\noutline_label=စာတမ်း မူကြမ်း\nattachments.title=တွဲချက်များ ပြပါ\nattachments_label=တွဲထားချက်များ\nthumbs.title=ပုံရိပ်ငယ်များကို ပြပါ\nthumbs_label=ပုံရိပ်ငယ်များ\nfindbar.title=Find in Document\nfindbar_label=ရှာဖွေပါ\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=စာမျက်နှာ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=စာမျက်နှာရဲ့ ပုံရိပ်ငယ် {{page}}\n\n# Find panel button title and messages\nfind_label=ရှာဖွေပါ -\nfind_previous.title=စကားစုရဲ့ အရင် ​ဖြစ်ပွားမှုကို ရှာဖွေပါ\nfind_previous_label=နောက်သို့\nfind_next.title=စကားစုရဲ့ နောက်ထပ် ​ဖြစ်ပွားမှုကို ရှာဖွေပါ\nfind_next_label=ရှေ့သို့\nfind_highlight=အားလုံးကို မျဉ်းသားပါ\nfind_match_case_label=စာလုံး တိုက်ဆိုင်ပါ\nfind_reached_top=စာမျက်နှာထိပ် ရောက်နေပြီ၊ အဆုံးကနေ ပြန်စပါ\nfind_reached_bottom=စာမျက်နှာအဆုံး ရောက်နေပြီ၊ ထိပ်ကနေ ပြန်စပါ\nfind_not_found=စကားစု မတွေ့ရဘူး\n\n# Error panel labels\nerror_more_info=နောက်ထပ်အချက်အလက်များ\nerror_less_info=အနည်းငယ်မျှသော သတင်းအချက်အလက်\nerror_close=ပိတ်\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=မက်ဆေ့ - {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=အထပ် - {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ဖိုင် {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=လိုင်း - {{line}}\nrendering_error=စာမျက်နှာကို ပုံဖော်နေချိန်မှာ အမှားတစ်ခုတွေ့ရပါတယ်။\n\n# Predefined zoom values\npage_scale_width=စာမျက်နှာ အကျယ်\npage_scale_fit=စာမျက်နှာ ကွက်တိ\npage_scale_auto=အလိုအလျောက် ချုံ့ချဲ့\npage_scale_actual=အမှန်တကယ်ရှိတဲ့ အရွယ်\n\n# Loading indicator messages\nloading_error_indicator=အမှား\nloading_error=PDF ဖိုင် ကိုဆွဲတင်နေချိန်မှာ အမှားတစ်ခုတွေ့ရပါတယ်။\ninvalid_file_error=မရသော သို့ ပျက်နေသော PDF ဖိုင်\nmissing_file_error=PDF ပျောက်ဆုံး\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} အဓိပ္ပာယ်ဖွင့်ဆိုချက်]\npassword_label=PDF အားဖွင့်ရန် ပတ်စ်ဝတ်အားထည့်ပါ\npassword_invalid=စာဝှက် မှားသည်။ ထပ်ကြိုးစားကြည့်ပါ။\npassword_ok=OK\npassword_cancel=ပယ်​ဖျက်ပါ\n\nprinting_not_supported=သတိပေးချက်၊ပရင့်ထုတ်ခြင်းကိုဤဘယောက်ဆာသည် ပြည့်ဝစွာထောက်ပံ့မထားပါ ။\nprinting_not_ready=သတိပေးချက်: ယခု PDF ဖိုင်သည် ပုံနှိပ်ရန် မပြည့်စုံပါ\nweb_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.\ndocument_colors_disabled=PDF ဖိုင်အား ၎င်းဤ ကိုယ်ပိုင်အရောင်များကို အသုံးပြုခွင့်မပေးထားပါ ။ 'စာမျက်နှာအားလုံးအားအရောင်ရွေးချယ်ခွင့်' အား ယခု ဘယောက်ဆာတွင် ပိတ်ထားခြင်းကြောင့်ဖြစ် သှ်\n"
  },
  {
    "path": "web/viewer/locale/nb-NO/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Forrige side\nprevious_label=Forrige\nnext.title=Neste side\nnext_label=Neste\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Side:\npage_of=av {{pageCount}}\n\nzoom_out.title=Zoom ut\nzoom_out_label=Zoom ut\nzoom_in.title=Zoom inn\nzoom_in_label=Zoom inn\nzoom.title=Zoom\npresentation_mode.title=Bytt til presentasjonsmodus\npresentation_mode_label=Presentasjonsmodus\nopen_file.title=Åpne fil\nopen_file_label=Åpne\nprint.title=Skriv ut\nprint_label=Skriv ut\ndownload.title=Last ned\ndownload_label=Last ned\nbookmark.title=Nåværende visning (kopier eller åpne i et nytt vindu)\nbookmark_label=Nåværende visning\n\n# Secondary toolbar and context menu\ntools.title=Verktøy\ntools_label=Verktøy\nfirst_page.title=Gå til første side\nfirst_page.label=Gå til første side\nfirst_page_label=Gå til første side\nlast_page.title=Gå til siste side\nlast_page.label=Gå til siste side\nlast_page_label=Gå til siste side\npage_rotate_cw.title=Roter med klokken\npage_rotate_cw.label=Roter med klokken\npage_rotate_cw_label=Roter med klokken\npage_rotate_ccw.title=Roter mot klokken\npage_rotate_ccw.label=Roter mot klokken\npage_rotate_ccw_label=Roter mot klokken\n\nhand_tool_enable.title=Slå på hånd-verktøy\nhand_tool_enable_label=Slå på hånd-verktøy\nhand_tool_disable.title=Slå av hånd-verktøy\nhand_tool_disable_label=Slå av hånd-verktøy\n\n# Document properties dialog box\ndocument_properties.title=Dokumentegenskaper …\ndocument_properties_label=Dokumentegenskaper …\ndocument_properties_file_name=Filnavn:\ndocument_properties_file_size=Filstørrelse:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Tittel:\ndocument_properties_author=Forfatter:\ndocument_properties_subject=Emne:\ndocument_properties_keywords=Nøkkelord:\ndocument_properties_creation_date=Opprettet dato:\ndocument_properties_modification_date=Endret dato:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Opprettet av:\ndocument_properties_producer=PDF-verktøy:\ndocument_properties_version=PDF-versjon:\ndocument_properties_page_count=Sideantall:\ndocument_properties_close=Lukk\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Slå av/på sidestolpe\ntoggle_sidebar_label=Slå av/på sidestolpe\noutline.title=Vis dokumentdisposisjon\noutline_label=Dokumentdisposisjon\nthumbs.title=Vis miniatyrbilde\nthumbs_label=Miniatyrbilde\nfindbar.title=Finn i dokumentet\nfindbar_label=Finn\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Side {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatyrbilde av side {{page}}\n\n# Find panel button title and messages\nfind_label=Finn:\nfind_previous.title=Finn forrige forekomst av frasen\nfind_previous_label=Forrige\nfind_next.title=Finn neste forekomst av frasen\nfind_next_label=Neste\nfind_highlight=Uthev alle\nfind_match_case_label=Skill store/små bokstaver\nfind_reached_top=Nådde toppen av dokumentet, fortsetter fra bunnen\nfind_reached_bottom=Nådde bunnen av dokumentet, fortsetter fra toppen\nfind_not_found=Fant ikke teksten\n\n# Error panel labels\nerror_more_info=Mer info\nerror_less_info=Mindre info\nerror_close=Lukk\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (bygg: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Melding: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stakk: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fil: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linje: {{line}}\nrendering_error=En feil oppstod ved opptegning av siden.\n\n# Predefined zoom values\npage_scale_width=Sidebredde\npage_scale_fit=Tilpass til siden\npage_scale_auto=Automatisk zoom\npage_scale_actual=Virkelig størrelse\n\n# Loading indicator messages\nloading_error_indicator=Feil\nloading_error=En feil oppstod ved lasting av PDF.\ninvalid_file_error=Ugyldig eller skadet PDF-fil.\nmissing_file_error=Manglende PDF-fil.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} annotasjon]\npassword_label=Skriv inn passordet for å åpne denne PDF-filen.\npassword_invalid=Ugyldig passord. Prøv igjen.\npassword_ok=OK\npassword_cancel=Avbryt\n\nprinting_not_supported=Advarsel: Utskrift er ikke fullstendig støttet av denne nettleseren.\nprinting_not_ready=Advarsel: PDF er ikke fullstendig innlastet for utskrift.\nweb_fonts_disabled=Web-fonter er avslått: Kan ikke bruke innbundne PDF-fonter.\ndocument_colors_disabled=PDF-dokumenter tillates ikke å bruke deres egne farger: \\'Tillat sider å velge egne farger\\' er deaktivert i nettleseren.\n"
  },
  {
    "path": "web/viewer/locale/nl/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Vorige pagina\nprevious_label=Vorige\nnext.title=Volgende pagina\nnext_label=Volgende\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Pagina:\npage_of=van {{pageCount}}\n\nzoom_out.title=Uitzoomen\nzoom_out_label=Uitzoomen\nzoom_in.title=Inzoomen\nzoom_in_label=Inzoomen\nzoom.title=Zoomen\npresentation_mode.title=Wisselen naar presentatiemodus\npresentation_mode_label=Presentatiemodus\nopen_file.title=Bestand openen\nopen_file_label=Openen\nprint.title=Afdrukken\nprint_label=Afdrukken\ndownload.title=Downloaden\ndownload_label=Downloaden\nbookmark.title=Huidige weergave (kopiëren of openen in nieuw venster)\nbookmark_label=Huidige weergave\n\n# Secondary toolbar and context menu\ntools.title=Hulpmiddelen\ntools_label=Hulpmiddelen\nfirst_page.title=Naar eerste pagina gaan\nfirst_page.label=Naar eerste pagina gaan\nfirst_page_label=Naar eerste pagina gaan\nlast_page.title=Naar laatste pagina gaan\nlast_page.label=Naar laatste pagina gaan\nlast_page_label=Naar laatste pagina gaan\npage_rotate_cw.title=Rechtsom draaien\npage_rotate_cw.label=Rechtsom draaien\npage_rotate_cw_label=Rechtsom draaien\npage_rotate_ccw.title=Linksom draaien\npage_rotate_ccw.label=Linksom draaien\npage_rotate_ccw_label=Linksom draaien\n\nhand_tool_enable.title=Handhulpmiddel inschakelen\nhand_tool_enable_label=Handhulpmiddel inschakelen\nhand_tool_disable.title=Handhulpmiddel uitschakelen\nhand_tool_disable_label=Handhulpmiddel uitschakelen\n\n# Document properties dialog box\ndocument_properties.title=Documenteigenschappen…\ndocument_properties_label=Documenteigenschappen…\ndocument_properties_file_name=Bestandsnaam:\ndocument_properties_file_size=Bestandsgrootte:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Titel:\ndocument_properties_author=Auteur:\ndocument_properties_subject=Onderwerp:\ndocument_properties_keywords=Trefwoorden:\ndocument_properties_creation_date=Aanmaakdatum:\ndocument_properties_modification_date=Wijzigingsdatum:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Auteur:\ndocument_properties_producer=PDF-producent:\ndocument_properties_version=PDF-versie:\ndocument_properties_page_count=Aantal pagina’s:\ndocument_properties_close=Sluiten\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Zijbalk in-/uitschakelen\ntoggle_sidebar_label=Zijbalk in-/uitschakelen\noutline.title=Documentoverzicht tonen\noutline_label=Documentoverzicht\nattachments.title=Bijlagen tonen\nattachments_label=Bijlagen\nthumbs.title=Miniaturen tonen\nthumbs_label=Miniaturen\nfindbar.title=Zoeken in document\nfindbar_label=Zoeken\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pagina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatuur van pagina {{page}}\n\n# Find panel button title and messages\nfind_label=Zoeken:\nfind_previous.title=Het vorige voorkomen van de tekst zoeken\nfind_previous_label=Vorige\nfind_next.title=Het volgende voorkomen van de tekst zoeken\nfind_next_label=Volgende\nfind_highlight=Alles markeren\nfind_match_case_label=Hoofdlettergevoelig\nfind_reached_top=Bovenkant van het document bereikt, doorgegaan vanaf de onderkant\nfind_reached_bottom=Onderkant van het document bereikt, doorgegaan vanaf de bovenkant\nfind_not_found=Tekst niet gevonden\n\n# Error panel labels\nerror_more_info=Meer informatie\nerror_less_info=Minder informatie\nerror_close=Sluiten\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Bericht: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Bestand: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Regel: {{line}}\nrendering_error=Er is een fout opgetreden bij het weergeven van de pagina.\n\n# Predefined zoom values\npage_scale_width=Paginabreedte\npage_scale_fit=Hele pagina\npage_scale_auto=Automatisch zoomen\npage_scale_actual=Werkelijke grootte\n\n# Loading indicator messages\nloading_error_indicator=Fout\nloading_error=Er is een fout opgetreden bij het laden van de PDF.\ninvalid_file_error=Ongeldig of beschadigd PDF-bestand.\nmissing_file_error=PDF-bestand ontbreekt. \n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}}-aantekening]\npassword_label=Voer het wachtwoord in om dit PDF-bestand te openen.\npassword_invalid=Ongeldig wachtwoord. Probeer het opnieuw.\npassword_ok=OK\npassword_cancel=Annuleren\n\nprinting_not_supported=Waarschuwing: afdrukken wordt niet volledig ondersteund door deze browser.\nprinting_not_ready=Warning: PDF is niet volledig geladen om af te drukken.\nweb_fonts_disabled=Weblettertypen zijn uitgeschakeld: gebruik van ingebedde PDF-lettertypen is niet mogelijk.\ndocument_colors_disabled=PDF-documenten mogen hun eigen kleuren niet gebruiken: ‘Pagina’s toestaan om hun eigen kleuren te kiezen’ is uitgeschakeld in de browser.\n"
  },
  {
    "path": "web/viewer/locale/nn-NO/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Førre side\nprevious_label=Førre\nnext.title=Neste side\nnext_label=Neste\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Side:\npage_of=av {{pageCount}}\n\nzoom_out.title=Zoom ut\nzoom_out_label=Zoom ut\nzoom_in.title=Zoom inn\nzoom_in_label=Zoom inn\nzoom.title=Zoom\npresentation_mode.title=Byt til presentasjonsmodus\npresentation_mode_label=Presentasjonsmodus\nopen_file.title=Opna fil\nopen_file_label=Opna\nprint.title=Skriv ut\nprint_label=Skriv ut\ndownload.title=Last ned\ndownload_label=Last ned\nbookmark.title=Gjeldande vising (kopier eller opna i nytt vindauge)\nbookmark_label=Gjeldande vising\n\n# Secondary toolbar and context menu\ntools.title=Verktøy\ntools_label=Verktøy\nfirst_page.title=Gå til første side\nfirst_page.label=Gå til første side\nfirst_page_label=Gå til første side\nlast_page.title=Gå til siste side\nlast_page.label=Gå til siste side\nlast_page_label=Gå til siste side\npage_rotate_cw.title=Roter med klokka\npage_rotate_cw.label=Roter med klokka\npage_rotate_cw_label=Roter med klokka\npage_rotate_ccw.title=Roter mot klokka\npage_rotate_ccw.label=Roter mot klokka\npage_rotate_ccw_label=Roter mot klokka\n\nhand_tool_enable.title=Slå på handverktøy\nhand_tool_enable_label=Slå på handverktøy\nhand_tool_disable.title=Så av handverktøy\nhand_tool_disable_label=Slå av handverktøy\n\n# Document properties dialog box\ndocument_properties.title=Dokumenteigenskapar …\ndocument_properties_label=Dokumenteigenskapar …\ndocument_properties_file_name=Filnamn:\ndocument_properties_file_size=Filstorleik:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Dokumenteigenskapar …\ndocument_properties_author=Forfattar:\ndocument_properties_subject=Emne:\ndocument_properties_keywords=Nykelord:\ndocument_properties_creation_date=Dato oppretta:\ndocument_properties_modification_date=Dato endra:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Oppretta av:\ndocument_properties_producer=PDF-verktøy:\ndocument_properties_version=PDF-versjon:\ndocument_properties_page_count=Sidetal:\ndocument_properties_close=Lukk\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Slå av/på sidestolpe\ntoggle_sidebar_label=Slå av/på sidestolpe\noutline.title=Vis dokumentdisposisjon\noutline_label=Dokumentdisposisjon\nattachments.title=Vis vedlegg\nattachments_label=Vedlegg\nthumbs.title=Vis miniatyrbilde\nthumbs_label=Miniatyrbilde\nfindbar.title=Finn i dokumentet\nfindbar_label=Finn\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Side {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatyrbilde av side {{page}}\n\n# Find panel button title and messages\nfind_label=Finn:\nfind_previous.title=Finn tidlegare førekomst av frasen\nfind_previous_label=Førre\nfind_next.title=Finn neste førekomst av frasen\nfind_next_label=Neste\nfind_highlight=Uthev alle\nfind_match_case_label=Skil store/små bokstavar\nfind_reached_top=Nådde toppen av dokumentet, held fram frå botnen\nfind_reached_bottom=Nådde botnen av dokumentet, held fram frå toppen\nfind_not_found=Fann ikkje teksten\n\n# Error panel labels\nerror_more_info=Meir info\nerror_less_info=Mindre info\nerror_close=Lukk\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (bygg: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Melding: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stakk: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fil: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linje: {{line}}\nrendering_error=Ein feil oppstod ved oppteikning av sida.\n\n# Predefined zoom values\npage_scale_width=Sidebreidde\npage_scale_fit=Tilpass til sida\npage_scale_auto=Automatisk zoom\npage_scale_actual=Verkeleg storleik\n\n# Loading indicator messages\nloading_error_indicator=Feil\nloading_error=Ein feil oppstod ved lasting av PDF.\ninvalid_file_error=Ugyldig eller korrupt PDF fil.\nmissing_file_error=Manglande PDF-fil.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} annotasjon]\npassword_label=Skriv inn passordet for å opna denne PDF-fila.\npassword_invalid=Ugyldig passord. Prøv igjen.\npassword_ok=OK\npassword_cancel=Avbryt\n\nprinting_not_supported=Åtvaring: Utskrift er ikkje fullstendig støtta av denne nettlesaren.\nprinting_not_ready=Åtvaring: PDF ikkje fullstendig innlasta for utskrift.\nweb_fonts_disabled=Vev-fontar er slått av: Kan ikkje bruka innbundne PDF-fontar.\ndocument_colors_disabled=PDF-dokument har ikkje løyve til å bruka eigne fargar: \\'Tillat sider å velja eigne fargar\\' er slått av i nettlesaren.\n"
  },
  {
    "path": "web/viewer/locale/nso/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Letlakala le fetilego\nprevious_label=Fetilego\nnext.title=Letlakala le latelago\nnext_label=Latelago\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Letlakala:\npage_of=la {{pageCount}}\n\nzoom_out.title=Bušetša ka gare\nzoom_out_label=Bušetša ka gare\nzoom_in.title=Godišetša ka ntle\nzoom_in_label=Godišetša ka ntle\nzoom.title=Godiša\nprint.title=Gatiša\nprint_label=Gatiša\npresentation_mode.title=Fetogela go mokgwa wa tlhagišo\npresentation_mode_label=Mokgwa wa tlhagišo\nopen_file.title=Bula faele\nopen_file_label=Bula\ndownload.title=Laolla\ndownload_label=Laolla\nbookmark.title=Pono ya bjale (kopiša le go bula lefasetereng le leswa)\nbookmark_label=Tebelelo ya gona bjale\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Šielanya para ya ka thoko\ntoggle_sidebar_label=Šielanya para ya ka thoko\noutline.title=Laetša kakaretšo ya tokumente\noutline_label=Kakaretšo ya tokumente\nthumbs.title=Laetša dikhutšofatšo\nthumbs_label=Dikhutšofatšo\nfindbar.title=Hwetša go tokumente\nfindbar_label=Hwetša\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Letlakala {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Khutšofatšo ya letlakala {{page}}\n\n# Context menu\nfirst_page.label=Eya letlakaleng la mathomo\nlast_page.label=Eya letlakaleng la mafelelo\npage_rotate_cw.label=Dikološa go ya ka go la go ja\npage_rotate_ccw.label=Dikološa go ya go la ntsogošo\n\n# Find panel button title and messages\nfind_label=Hwetša:\nfind_previous.title=Hwetša tiragalo e fetilego ya sekafoko\nfind_previous_label=Fetilego\nfind_next.title=Hwetša tiragalo e latelago ya sekafoko\nfind_next_label=Latelago\nfind_highlight=Bonagatša tšohle\nfind_match_case_label=Swantšha kheisi\nfind_reached_top=Fihlile godimo ga tokumente, go tšwetšwe pele go tloga tlase\nfind_reached_bottom=Fihlile mafelelong a tokumente, go tšwetšwe pele go tloga godimo\nfind_not_found=Sekafoko ga sa hwetšwa\n\n# Error panel labels\nerror_more_info=Tshedimošo e oketšegilego\nerror_less_info=Tshedimošo ya tlasana\nerror_close=Tswalela\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Molaetša: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Mokgobo: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Faele: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Mothaladi: {{line}}\nrendering_error=Go diregile phošo ge go be go gafelwa letlakala.\n\n# Predefined zoom values\npage_scale_width=Bophara bja letlakala\npage_scale_fit=Go lekana ga letlakala\npage_scale_auto=Kgodišo ya maitirišo\npage_scale_actual=Bogolo bja kgonthe\n\n# Loading indicator messages\nloading_error_indicator=Phošo\nloading_error=Go diregile phošo ge go hlahlelwa PDF.\ninvalid_file_error=Faele ye e sa šomego goba e senyegilego ya PDF.\nmissing_file_error=Faele yeo e sego gona ya PDF.\n\n# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type=[{{type}} Tlhaloso]\nrequest_password=PDF e šireleditšwe ka lentšuphetišo:\n\nprinting_not_supported=Temošo: Go gatiša ga go thekgwe ke praosara ye ka botlalo.\nprinting_not_ready=Temošo: PDF ga ya hlahlelwa ka botlalo bakeng sa go gatišwa.\nweb_fonts_disabled=Difonte tša wepe di šitišitšwe: ga e kgone go diriša difonte tša PDF tše khutišitšwego.\nweb_colors_disabled=Mebala ya wepe e šitišitšwe.\n"
  },
  {
    "path": "web/viewer/locale/oc/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pagina precedenta\nprevious_label=Precedent\nnext.title=Pagina seguenta\nnext_label=Seguent\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Pagina :\npage_of=sus {{pageCount}}\n\nzoom_out.title=Zoom arrièr\nzoom_out_label=Zoom arrièr\nzoom_in.title=Zoom avant\nzoom_in_label=Zoom avant\nzoom.title=Zoom\npresentation_mode.title=Bascuolar en mòde presentacion\npresentation_mode_label=Mòde Presentacion\nopen_file.title=Dobrir lo fichièr\nopen_file_label=Dobrir\nprint.title=Imprimir\nprint_label=Imprimir\ndownload.title=Telecargar\ndownload_label=Telecargar\nbookmark.title=Afichatge corrent (copiar o dobrir dins una fenèstra novèla)\nbookmark_label=Afichatge actual\n\n# Secondary toolbar and context menu\ntools.title=Aisinas\ntools_label=Aisinas\nfirst_page.title=Anar a la primièra pagina\nfirst_page.label=Anar a la primièra pagina\nfirst_page_label=Anar a la primièra pagina\nlast_page.title=Anar a la darrièra pagina\nlast_page.label=Anar a la darrièra pagina\nlast_page_label=Anar a la darrièra pagina\npage_rotate_cw.title=Rotacion orària\npage_rotate_cw.label=Rotacion orària\npage_rotate_cw_label=Rotacion orària\npage_rotate_ccw.title=Rotacion antiorària\npage_rotate_ccw.label=Rotacion antiorària\npage_rotate_ccw_label=Rotacion antiorària\n\nhand_tool_enable.title=Activar l'aisina man\nhand_tool_enable_label=Activar l'aisina man\nhand_tool_disable.title=Desactivar l'aisina man\nhand_tool_disable_label=Desactivar l'aisina man\n\n# Document properties dialog box\ndocument_properties.title=Proprietats del document...\ndocument_properties_label=Proprietats del document...\ndocument_properties_file_name=Nom del fichièr :\ndocument_properties_file_size=Talha del fichièr :\ndocument_properties_kb={{size_kb}} Ko ({{size_b}} octets)\ndocument_properties_mb={{size_mb}} Mo ({{size_b}} octets)\ndocument_properties_title=Títol :\ndocument_properties_author=Autor :\ndocument_properties_subject=Subjècte :\ndocument_properties_keywords=Mots claus :\ndocument_properties_creation_date=Data de creacion :\ndocument_properties_modification_date=Data de modificacion :\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creator :\ndocument_properties_producer=Aisina de conversion PDF :\ndocument_properties_version=Version PDF :\ndocument_properties_page_count=Nombre de paginas :\ndocument_properties_close=Tampar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Afichar/amagar lo panèl lateral\ntoggle_sidebar_label=Afichar/amagar lo panèl lateral\noutline.title=Afichar los marcapaginas\noutline_label=Marcapaginas del document\nattachments.title=Visualizar las pèças juntas\nattachments_label=Pèças juntas\nthumbs.title=Afichar las vinhetas\nthumbs_label=Vinhetas\nfindbar.title=Trobar dins lo document\nfindbar_label=Recercar\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pagina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Vinheta de la pagina {{page}}\n\n# Find panel button title and messages\nfind_label=Recercar\nfind_previous.title=Tròba l'ocurréncia precedenta de la frasa\nfind_previous_label=Precedent\nfind_next.title=Tròba l'ocurréncia venenta de la frasa\nfind_next_label=Seguent\nfind_highlight=Suslinhar tot\nfind_match_case_label=Respectar la cassa\nfind_reached_top=Naut de la pagina atench, perseguida dempuèi lo bas\nfind_reached_bottom=Bas de la pagina atench, perseguida al començament\nfind_not_found=Frasa pas trobada\n\n# Error panel labels\nerror_more_info=Mai de detalhs\nerror_less_info=Mens d'informacions\nerror_close=Tampar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (identificant de compilacion : {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Messatge : {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila : {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fichièr : {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linha : {{line}}\nrendering_error=Una error s'es producha pendent l'afichatge de la pagina.\n\n# Predefined zoom values\npage_scale_width=Largor plena\npage_scale_fit=Pagina entièra\npage_scale_auto=Zoom automatic\npage_scale_actual=Talha vertadièra\n\n# Loading indicator messages\nloading_error_indicator=Error\nloading_error=Una error s'es producha pendent lo cargament del fichièr PDF.\ninvalid_file_error=Fichièr PDF invalid o corromput.\nmissing_file_error=Fichièr PDF mancant.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotacion {{type}}]\npassword_label=Picatz lo senhal per dobrir aqueste fichièr PDF.\npassword_invalid=Senhal incorrècte. Tornatz ensajar.\npassword_ok=D'acòrdi\npassword_cancel=Anullar\n\nprinting_not_supported=Atencion : l'estampatge es pas completament gerit per aqueste navigador.\nprinting_not_ready=Atencion : lo PDF es pas entièrament cargat per lo poder imprimir.\nweb_fonts_disabled=Las poliças web son desactivadas : impossible d'utilizar las poliças integradas al PDF.\ndocument_colors_disabled=Los documents PDF pòdon pas utilizar lors pròprias colors : « Autorizar las paginas web d'utilizar lors pròprias colors » es desactivat dins lo navigador.\n"
  },
  {
    "path": "web/viewer/locale/or/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=ପୂର୍ବ ପୃଷ୍ଠା\nprevious_label=ପୂର୍ବ\nnext.title=ପର ପୃଷ୍ଠା\nnext_label=ପର\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=ପୃଷ୍ଠା:\npage_of={{pageCount}} ର\n\nzoom_out.title=ଛୋଟ କରନ୍ତୁ\nzoom_out_label=ଛୋଟ କରନ୍ତୁ\nzoom_in.title=ବଡ଼ କରନ୍ତୁ\nzoom_in_label=ବଡ଼ କରନ୍ତୁ\nzoom.title=ଛୋଟ ବଡ଼ କରନ୍ତୁ\npresentation_mode.title=ଉପସ୍ଥାପନ ଧାରାକୁ ବଦଳାନ୍ତୁ\npresentation_mode_label=ଉପସ୍ଥାପନ ଧାରା\nopen_file.title=ଫାଇଲ ଖୋଲନ୍ତୁ\nopen_file_label=ଖୋଲନ୍ତୁ\nprint.title=ମୁଦ୍ରଣ\nprint_label=ମୁଦ୍ରଣ\ndownload.title=ଆହରଣ\ndownload_label=ଆହରଣ\nbookmark.title=ପ୍ରଚଳିତ ଦୃଶ୍ୟ (ନକଲ କରନ୍ତୁ କିମ୍ବା ଏକ ନୂତନ ୱିଣ୍ଡୋରେ ଖୋଲନ୍ତୁ)\nbookmark_label=ପ୍ରଚଳିତ ଦୃଶ୍ୟ\n\n# Secondary toolbar and context menu\ntools.title=ସାଧନଗୁଡ଼ିକ\ntools_label=ସାଧନଗୁଡ଼ିକ\nfirst_page.title=ପ୍ରଥମ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ\nfirst_page.label=ପ୍ରଥମ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ\nfirst_page_label=ପ୍ରଥମ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ\nlast_page.title=ଶେଷ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ\nlast_page.label=ଶେଷ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ\nlast_page_label=ଶେଷ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ\npage_rotate_cw.title=ଦକ୍ଷିଣାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ\npage_rotate_cw.label=ଦକ୍ଷିଣାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ\npage_rotate_cw_label=ଦକ୍ଷିଣାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ\npage_rotate_ccw.title=ବାମାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ\npage_rotate_ccw.label=ବାମାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ\npage_rotate_ccw_label=ବାମାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ\n\nhand_tool_enable.title=ହସ୍ତକୃତ ସାଧନକୁ ସକ୍ରିୟ କରନ୍ତୁ\nhand_tool_enable_label=ହସ୍ତକୃତ ସାଧନକୁ ସକ୍ରିୟ କରନ୍ତୁ\nhand_tool_disable.title=ହସ୍ତକୃତ ସାଧନକୁ ନିଷ୍କ୍ରିୟ କରନ୍ତୁ\nhand_tool_disable_label=ହସ୍ତକୃତ ସାଧନକୁ ନିଷ୍କ୍ରିୟ କରନ୍ତୁ\n\n# Document properties dialog box\ndocument_properties.title=ଦଲିଲ ଗୁଣଧର୍ମ…\ndocument_properties_label=ଦଲିଲ ଗୁଣଧର୍ମ…\ndocument_properties_file_name=ଫାଇଲ ନାମ:\ndocument_properties_file_size=ଫାଇଲ ଆକାର:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=ଶୀର୍ଷକ:\ndocument_properties_author=ଲେଖକ:\ndocument_properties_subject=ବିଷୟ:\ndocument_properties_keywords=ସୂଚକ ଶବ୍ଦ:\ndocument_properties_creation_date=ନିର୍ମାଣ ତାରିଖ:\ndocument_properties_modification_date=ପରିବର୍ତ୍ତନ ତାରିଖ:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=ନିର୍ମାତା:\ndocument_properties_producer=PDF ପ୍ରଯୋଜକ:\ndocument_properties_version=PDF ସଂସ୍କରଣ:\ndocument_properties_page_count=ପୃଷ୍ଠା ଗଣନା:\ndocument_properties_close=ବନ୍ଦ କରନ୍ତୁ\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=ପାର୍ଶ୍ୱପଟିକୁ ଆଗପଛ କରନ୍ତୁ\ntoggle_sidebar_label=ପାର୍ଶ୍ୱପଟିକୁ ଆଗପଛ କରନ୍ତୁ\noutline.title=ଦଲିଲ  ସାରାଂଶ ଦର୍ଶାନ୍ତୁ\noutline_label=ଦଲିଲ ସାରାଂଶ\nattachments.title=ସଂଲଗ୍ନକଗୁଡ଼ିକୁ ଦର୍ଶାନ୍ତୁ\nattachments_label=ସଲଗ୍ନକଗୁଡିକ\nthumbs.title=ସଂକ୍ଷିପ୍ତ ବିବରଣୀ ଦର୍ଶାନ୍ତୁ\nthumbs_label=ସଂକ୍ଷିପ୍ତ ବିବରଣୀ\nfindbar.title=ଦଲିଲରେ ଖୋଜନ୍ତୁ\nfindbar_label=ଖୋଜନ୍ତୁ\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=ପୃଷ୍ଠା {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=ପୃଷ୍ଠାର ସଂକ୍ଷିପ୍ତ ବିବରଣୀ {{page}}\n\n# Find panel button title and messages\nfind_label=ଖୋଜନ୍ତୁ:\nfind_previous.title=ଏହି ବାକ୍ୟାଂଶର ପୂର୍ବ ଉପସ୍ଥିତିକୁ ଖୋଜନ୍ତୁ\nfind_previous_label=ପୂର୍ବବର୍ତ୍ତୀ\nfind_next.title=ଏହି ବାକ୍ୟାଂଶର ପରବର୍ତ୍ତୀ ଉପସ୍ଥିତିକୁ ଖୋଜନ୍ତୁ\nfind_next_label=ପରବର୍ତ୍ତୀ\\u0020\nfind_highlight=ସମସ୍ତଙ୍କୁ ଆଲୋକିତ କରନ୍ତୁ\nfind_match_case_label=ଅକ୍ଷର ମେଳାନ୍ତୁ\nfind_reached_top=ତଳୁ ଉପରକୁ ଗତି କରି ଦଲିଲର ଉପର ଭାଗରେ ପହଞ୍ଚି ଯାଇଛି\nfind_reached_bottom=ଉପରୁ ତଳକୁ ଗତି କରି ଦଲିଲର ଶେଷ ଭାଗରେ ପହଞ୍ଚି ଯାଇଛି\nfind_not_found=ବାକ୍ୟାଂଶ ମିଳିଲା ନାହିଁ\n\n# Error panel labels\nerror_more_info=ଅଧିକ ସୂଚନା\nerror_less_info=ସ୍ୱଳ୍ପ ସୂଚନା\nerror_close=ବନ୍ଦ କରନ୍ତୁ\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=ସନ୍ଦେଶ: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=ଷ୍ଟାକ: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ଫାଇଲ: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=ଧାଡ଼ି: {{line}}\nrendering_error=ପୃଷ୍ଠା ଚିତ୍ରଣ କରିବା ସମୟରେ ତ୍ରୁଟି ଘଟିଲା।\n\n# Predefined zoom values\npage_scale_width=ପୃଷ୍ଠା ଓସାର\npage_scale_fit=ପୃଷ୍ଠା ମେଳନ\npage_scale_auto=ସ୍ୱୟଂଚାଳିତ ଭାବରେ ଛୋଟବଡ଼ କରିବା\npage_scale_actual=ପ୍ରକୃତ ଆକାର\n\n# Loading indicator messages\nloading_error_indicator=ତ୍ରୁଟି\nloading_error=PDF ଧାରଣ କରିବା ସମୟରେ ଏକ ତ୍ରୁଟି ଘଟିଲା।\ninvalid_file_error=ଅବୈଧ କିମ୍ବା ତ୍ରୁଟିଯୁକ୍ତ PDF ଫାଇଲ।\nmissing_file_error=ହଜିଯାଇଥିବା PDF ଫାଇଲ।\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=ଏହି PDF ଫାଇଲକୁ ଖୋଲିବା ପାଇଁ ପ୍ରବେଶ ସଂକେତ ଭରଣ କରନ୍ତୁ।\npassword_invalid=ଭୁଲ ପ୍ରବେଶ ସଂକେତ। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।\npassword_ok=ଠିକ ଅଛି\npassword_cancel=ବାତିଲ କରନ୍ତୁ\n\nprinting_not_supported=ଚେତାବନୀ: ଏହି ବ୍ରାଉଜର ଦ୍ୱାରା ମୁଦ୍ରଣ କ୍ରିୟା ସମ୍ପୂର୍ଣ୍ଣ ଭାବରେ ସହାୟତା ପ୍ରାପ୍ତ ନୁହଁ।\nprinting_not_ready=ଚେତାବନୀ: PDF ଟି ମୁଦ୍ରଣ ପାଇଁ ସମ୍ପୂର୍ଣ୍ଣ ଭାବରେ ଧାରଣ ହୋଇ ନାହିଁ।\nweb_fonts_disabled=ୱେବ ଅକ୍ଷରରୂପଗୁଡ଼ିକୁ ନିଷ୍କ୍ରିୟ କରାଯାଇଛି: ସନ୍ନିହିତ PDF ଅକ୍ଷରରୂପଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିବାରେ ଅସମର୍ଥ।\ndocument_colors_disabled=PDF ଦଲିଲଗୁଡ଼ିକ ସେମାନଙ୍କର ନିଜର ରଙ୍ଗ ବ୍ୟବହାର କରିବା ପାଇଁ ଅନୁମତି ପ୍ରାପ୍ତ ନୁହଁ: 'ସେମାନଙ୍କର ନିଜ ରଙ୍ଗ ବାଛିବା ପାଇଁ ପୃଷ୍ଠାଗୁଡ଼ିକୁ ଅନୁମତି ଦିଅନ୍ତୁ' କୁ ବ୍ରାଉଜରରେ ନିଷ୍କ୍ରିୟ କରାଯାଇଛି।\n"
  },
  {
    "path": "web/viewer/locale/pa-IN/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=ਸਫ਼ਾ ਪਿੱਛੇ\nprevious_label=ਪਿੱਛੇ\nnext.title=ਸਫ਼ਾ ਅੱਗੇ\nnext_label=ਅੱਗੇ\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=ਸਫ਼ਾ:\npage_of={{pageCount}} ਵਿੱਚੋਂ\n\nzoom_out.title=ਜ਼ੂਮ ਆਉਟ\nzoom_out_label=ਜ਼ੂਮ ਆਉਟ\nzoom_in.title=ਜ਼ੂਮ ਇਨ\nzoom_in_label=ਜ਼ੂਮ ਇਨ\nzoom.title=ਜ਼ੂਨ\nprint.title=ਪਰਿੰਟ\nprint_label=ਪਰਿੰਟ\npresentation_mode.title=ਪਰਿਜੈਂਟੇਸ਼ਨ ਮੋਡ ਵਿੱਚ ਜਾਓ\npresentation_mode_label=ਪਰਿਜੈਂਟੇਸ਼ਨ ਮੋਡ\n\nopen_file.title=ਫਾਇਲ ਖੋਲ੍ਹੋ\nopen_file_label=ਖੋਲ੍ਹੋ\ndownload.title=ਡਾਊਨਲੋਡ\ndownload_label=ਡਾਊਨਲੋਡ\nbookmark.title=ਮੌਜੂਦਾ ਝਲਕ (ਨਵੀਂ ਵਿੰਡੋ ਵਿੱਚ ਕਾਪੀ ਕਰੋ ਜਾਂ ਖੋਲ੍ਹੋ)\nbookmark_label=ਮੌਜੂਦਾ ਝਲਕ\n\n# Secondary toolbar and context menu\ntools.title=ਟੂਲ\ntools_label=ਟੂਲ\nfirst_page.title=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ\nfirst_page.label=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ\nfirst_page_label=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ\n\nlast_page.title=ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ\nlast_page_label=ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ\npage_rotate_cw.title=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਓ\npage_rotate_cw.label=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਓ\npage_rotate_cw_label=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਓ\npage_rotate_ccw.title=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਓ\npage_rotate_ccw_label=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਓ\n\nhand_tool_enable.title=ਹੱਥ ਟੂਲ ਚਾਲੂ\nhand_tool_enable_label=ਹੱਥ ਟੂਲ ਚਾਲੂ\nhand_tool_disable.title=ਹੱਥ ਟੂਲ ਬੰਦ\nhand_tool_disable_label=ਹੱਥ ਟੂਲ ਬੰਦ\n\n# Document properties dialog box\ndocument_properties.title=…ਦਸਤਾਵੇਜ਼ ਵਿਸ਼ੇਸ਼ਤਾ\ndocument_properties_label=…ਦਸਤਾਵੇਜ਼ ਵਿਸ਼ੇਸ਼ਤਾ\ndocument_properties_file_name=ਫਾਇਲ ਨਾਂ:\ndocument_properties_file_size=ਫਾਇਲ ਆਕਾਰ:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=ਟਾਈਟਲ:\ndocument_properties_author=ਲੇਖਕ:\ndocument_properties_subject=ਵਿਸ਼ਾ:\ndocument_properties_keywords=ਸ਼ਬਦ:\ndocument_properties_creation_date=ਬਣਾਉਣ ਮਿਤੀ:\ndocument_properties_modification_date=ਸੋਧ ਮਿਤੀ:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=ਨਿਰਮਾਤਾ:\ndocument_properties_producer=PDF ਪ੍ਰੋਡਿਊਸਰ:\ndocument_properties_version=PDF ਵਰਜਨ:\ndocument_properties_page_count=ਸਫ਼ਾ ਗਿਣਤੀ:\ndocument_properties_close=ਬੰਦ ਕਰੋ\n\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=ਬਾਹੀ ਬਦਲੋ\ntoggle_sidebar_label=ਬਾਹੀ ਬਦਲੋ\n\noutline.title=ਦਸਤਾਵੇਜ਼ ਆਉਟਲਾਈਨ ਵੇਖਾਓ\noutline_label=ਦਸਤਾਵੇਜ਼ ਆਉਟਲਾਈਨ\nattachments.title=Show Attachments\nattachments_label=Attachments\nthumbs.title=ਥੰਮਨੇਲ ਵੇਖਾਓ\nthumbs_label=ਥੰਮਨੇਲ\nfindbar.title=ਦਸਤਾਵੇਜ਼ ਵਿੱਚ ਲੱਭੋ\nfindbar_label=ਲੱਭੋ\n\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=ਸਫ਼ਾ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} ਸਫ਼ੇ ਦਾ ਥੰਮਨੇਲ\n\n\n# Context menu\nfirst_page.label=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ\nlast_page.label=ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ\npage_rotate_cw.label=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਉ\npage_rotate_ccw.label=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਉ\n\n# Find panel button title and messages\nfind_label=ਲੱਭੋ:\nfind_previous.title=ਵਾਕ ਦੀ ਪਿਛਲੀ ਮੌਜੂਦਗੀ ਲੱਭੋ\nfind_previous_label=ਪਿੱਛੇ\nfind_next.title=ਵਾਕ ਦੀ ਅਗਲੀ ਮੌਜੂਦਗੀ ਲੱਭੋ\nfind_next_label=ਅੱਗੇ\nfind_highlight=ਸਭ ਉਭਾਰੋ\nfind_match_case_label=ਅੱਖਰ ਆਕਾਰ ਮਿਲਾਉ\nfind_reached_top=ਦਸਤਾਵੇਜ਼ ਦੇ ਉੱਤੇ ਆ ਗਏ ਹਾਂ, ਥੱਲੇ ਤੋਂ ਜਾਰੀ ਰੱਖਿਆ ਹੈ\nfind_reached_bottom=ਦਸਤਾਵੇਜ਼ ਦੇ ਅੰਤ ਉੱਤੇ ਆ ਗਏ ਹਾਂ, ਉੱਤੇ ਤੋਂ ਜਾਰੀ ਰੱਖਿਆ ਹੈ\nfind_not_found=ਵਾਕ ਨਹੀਂ ਲੱਭਿਆ\n\n\n# Error panel labels\nerror_more_info=ਹੋਰ ਜਾਣਕਾਰੀ\nerror_less_info=ਘੱਟ ਜਾਣਕਾਰੀ\nerror_close=ਬੰਦ ਕਰੋ\n\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (ਬਿਲਡ: {{build}}\n\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=ਸੁਨੇਹਾ: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=ਸਟੈਕ: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ਫਾਇਲ: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=ਲਾਈਨ: {{line}}\nrendering_error=ਸਫ਼ਾ ਰੈਡਰ ਕਰਨ ਦੇ ਦੌਰਾਨ ਗਲਤੀ ਆਈ ਹੈ।\n\n# Predefined zoom values\npage_scale_width=ਸਫ਼ਾ ਚੌੜਾਈ\npage_scale_fit=ਸਫ਼ਾ ਫਿੱਟ\npage_scale_auto=ਆਟੋਮੈਟਿਕ ਜ਼ੂਮ\npage_scale_actual=ਆਟੋਮੈਟਿਕ ਆਕਾਰ\n\n# Loading indicator messages\n# LOCALIZATION NOTE (error_line): \"{{[percent}}\" will be replaced with a percentage\nloading_error_indicator=ਗਲਤੀ\nloading_error=PDF ਲੋਡ ਕਰਨ ਦੇ ਦੌਰਾਨ ਗਲਤੀ ਆਈ ਹੈ।\ninvalid_file_error=ਗਲਤ ਜਾਂ ਨਿਕਾਰਾ PDF ਫਾਇਲ ਹੈ।\nmissing_file_error=ਨਾ-ਮੌਜੂਦ PDF ਫਾਇਲ।\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}}  ਵਿਆਖਿਆ]\npassword_label=ਇਹ PDF ਫਾਇਲ ਖੋਲ੍ਹਣ ਲਈ ਪਾਸਵਰਡ ਦਿਉ।\npassword_invalid=ਗਲਤ ਪਾਸਵਰਡ। ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜੀ।\npassword_ok=ਠੀਕ ਹੈ\npassword_cancel=ਰੱਦ ਕਰੋ\n\nprinting_not_supported=ਸਾਵਧਾਨ: ਇਹ ਬਰਾਊਜ਼ਰ ਪਰਿੰਟ ਕਰਨ ਲਈ ਪੂਰੀ ਤਰ੍ਹਾਂ ਸਹਾਇਕ ਨਹੀਂ ਹੈ।\nprinting_not_ready=ਸਾਵਧਾਨ: ਪੀਡੀਐਫ(PDF) ਪਰਿੰਟ ਕਰਨ ਲਈ ਪੂਰੀ ਤਰ੍ਹਾਂ ਲੋਡ ਨਹੀਂ ਹੈ।\nweb_fonts_disabled=ਵੈਬ ਫੋਂਟ ਬੰਦ ਹਨ: ਇੰਬੈਡ ਪੀਡੀਐਫ (PDF) ਫੋਂਟ ਵਰਤਨ ਲਈ ਅਸਮਰੱਥ ਹੈ।\ndocument_colors_disabled=PDF ਡੌਕੂਮੈਂਟ ਨੂੰ ਆਪਣੇ ਰੰਗ ਵਰਤਣ ਦੀ ਇਜ਼ਾਜ਼ਤ ਨਹੀਂ ਹੈ।: ਬਰਾਊਜ਼ਰ ਵਿੱਚ \\'ਸਫ਼ਿਆਂ ਨੂੰ ਆਪਣੇ ਰੰਗ ਵਰਤਣ ਦਿਉ\\' ਨੂੰ ਬੰਦ ਕੀਤਾ ਹੋਇਆ ਹੈ।\n"
  },
  {
    "path": "web/viewer/locale/pl/viewer.properties",
    "content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Poprzednia strona\nprevious_label=Poprzednia\nnext.title=Następna strona\nnext_label=Następna\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Strona:\npage_of=z {{pageCount}}\n\nzoom_out.title=Pomniejszenie\nzoom_out_label=Pomniejsz\nzoom_in.title=Powiększenie\nzoom_in_label=Powiększ\nzoom.title=Skala\npresentation_mode.title=Przełącz na tryb prezentacji\npresentation_mode_label=Tryb prezentacji\nopen_file.title=Otwieranie pliku\nopen_file_label=Otwórz\nprint.title=Drukowanie\nprint_label=Drukuj\ndownload.title=Pobieranie\ndownload_label=Pobierz\nbookmark.title=Bieżąca pozycja (skopiuj lub otwórz jako odnośnik w nowym oknie)\nbookmark_label=Bieżąca pozycja\n\ntools.title=Tools\ntools_label=Tools\nfirst_page.title=Przechodzenie do pierwszej strony\nfirst_page.label=Przejdź do pierwszej strony\nfirst_page_label=Przejdź do pierwszej strony\nlast_page.title=Przechodzenie do ostatniej strony\nlast_page.label=Przejdź do ostatniej strony\nlast_page_label=Przejdź do ostatniej strony\npage_rotate_cw.title=Obracanie zgodnie z ruchem wskazówek zegara\npage_rotate_cw.label=Obróć zgodnie z ruchem wskazówek zegara\npage_rotate_cw_label=Obróć zgodnie z ruchem wskazówek zegara\npage_rotate_ccw.title=Obracanie przeciwnie do ruchu wskazówek zegara\npage_rotate_ccw.label=Obróć przeciwnie do ruchu wskazówek zegara\npage_rotate_ccw_label=Obróć przeciwnie do ruchu wskazówek zegara\n\nhand_tool_enable.title=Włączanie narzędzia rączka\nhand_tool_enable_label=Włącz narzędzie rączka\nhand_tool_disable.title=Wyłączanie narzędzia rączka\nhand_tool_disable_label=Wyłącz narzędzie rączka\n\ndocument_properties.title=Właściwości dokumentu…\ndocument_properties_label=Właściwości dokumentu…\ndocument_properties_file_name=Nazwa pliku:\ndocument_properties_file_size=Rozmiar pliku:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} b)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} b)\ndocument_properties_title=Tytuł:\ndocument_properties_author=Autor:\ndocument_properties_subject=Temat:\ndocument_properties_keywords=Słowa kluczowe:\ndocument_properties_creation_date=Data utworzenia:\ndocument_properties_modification_date=Data modyfikacji:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Utworzony przez:\ndocument_properties_producer=PDF wyprodukowany przez:\ndocument_properties_version=Wersja PDF:\ndocument_properties_page_count=Liczba stron:\ndocument_properties_close=Zamknij\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Przełączanie panelu bocznego\ntoggle_sidebar_label=Przełącz panel boczny\noutline.title=Wyświetlanie zarysu dokumentu\noutline_label=Zarys dokumentu\nattachments.title=Wyświetlanie załączników\nattachments_label=Załączniki\nthumbs.title=Wyświetlanie miniaturek\nthumbs_label=Miniaturki\nfindbar.title=Znajdź w dokumencie\nfindbar_label=Znajdź\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Strona {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniaturka strony {{page}}\n\n# Find panel button title and messages\nfind_label=Znajdź:\nfind_previous.title=Znajdź poprzednie wystąpienie tekstu\nfind_previous_label=Poprzednie\nfind_next.title=Znajdź następne wystąpienie tekstu\nfind_next_label=Następne\nfind_highlight=Podświetl wszystkie\nfind_match_case_label=Rozróżniaj wielkość znaków\nfind_reached_top=Osiągnięto początek dokumentu, kontynuacja od końca\nfind_reached_bottom=Osiągnięto koniec dokumentu, kontynuacja od początku\nfind_not_found=Tekst nieznaleziony\n\n# Error panel labels\nerror_more_info=Więcej informacji\nerror_less_info=Mniej informacji\nerror_close=Zamknij\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (kompilacja: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Wiadomość: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stos: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Plik: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Wiersz: {{line}}\nrendering_error=Podczas renderowania strony wystąpił błąd.\n\n# Predefined zoom values\npage_scale_width=Szerokość strony\npage_scale_fit=Dopasowanie strony\npage_scale_auto=Skala automatyczna\npage_scale_actual=Rozmiar rzeczywisty\n\n# Loading indicator messages\nloading_error_indicator=Błąd\nloading_error=Podczas wczytywania dokumentu PDF wystąpił błąd.\ninvalid_file_error=Nieprawidłowy lub uszkodzony plik PDF.\nmissing_file_error=Brak pliku PDF.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Adnotacja: {{type}}]\npassword_label=Wprowadź hasło, aby otworzyć ten dokument PDF.\npassword_invalid=Nieprawidłowe hasło. Proszę spróbować ponownie.\npassword_ok=OK\npassword_cancel=Anuluj\n\nprinting_not_supported=Ostrzeżenie: Drukowanie nie jest w pełni wspierane przez przeglądarkę.\nprinting_not_ready=Ostrzeżenie: Dokument PDF nie jest całkowicie wczytany, więc nie można go wydrukować.\nweb_fonts_disabled=Czcionki sieciowe są wyłączone: nie można użyć osadzonych czcionek PDF.\ndocument_colors_disabled=Dokumenty PDF nie mogą używać własnych kolorów: Opcja „Pozwalaj stronom stosować inne kolory” w przeglądarce jest nieaktywna.\n"
  },
  {
    "path": "web/viewer/locale/pt-BR/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Página anterior\nprevious_label=Anterior\nnext.title=Próxima página\nnext_label=Próxima\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Página:\npage_of=de {{pageCount}}\n\nzoom_out.title=Diminuir zoom\nzoom_out_label=Diminuir zoom\nzoom_in.title=Aumentar zoom\nzoom_in_label=Aumentar zoom\nzoom.title=Zoom\npresentation_mode.title=Alternar para modo de apresentação\npresentation_mode_label=Modo de apresentação\nopen_file.title=Abrir arquivo\nopen_file_label=Abrir\nprint.title=Imprimir\nprint_label=Imprimir\ndownload.title=Download\ndownload_label=Download\nbookmark.title=Visualização atual (copie ou abra em nova janela)\nbookmark_label=Visualização atual\n\n# Secondary toolbar and context menu\ntools.title=Ferramentas\ntools_label=Ferramentas\nfirst_page.title=Ir para a primeira página\nfirst_page.label=Ir para a primeira página\nfirst_page_label=Ir para a primeira página\nlast_page.title=Ir para a última página\nlast_page.label=Ir para a última página\nlast_page_label=Ir para a última página\npage_rotate_cw.title=Girar no sentido horário\npage_rotate_cw.label=Girar no sentido horário\npage_rotate_cw_label=Girar no sentido horário\npage_rotate_ccw.title=Girar no sentido anti-horário\npage_rotate_ccw.label=Girar no sentido anti-horário\npage_rotate_ccw_label=Girar no sentido anti-horário\n\nhand_tool_enable.title=Ativar ferramenta da mão\nhand_tool_enable_label=Ativar ferramenta da mão\nhand_tool_disable.title=Desativar ferramenta da mão\nhand_tool_disable_label=Desativar ferramenta da mão\n\n# Document properties dialog box\ndocument_properties.title=Propriedades do documento…\ndocument_properties_label=Propriedades do documento…\ndocument_properties_file_name=Nome do arquivo:\ndocument_properties_file_size=Tamanho do arquivo:\ndocument_properties_kb={{size_kb}}\\u202fKB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}}\\u202fMB ({{size_b}} bytes)\ndocument_properties_title=Título:\ndocument_properties_author=Autor:\ndocument_properties_subject=Assunto:\ndocument_properties_keywords=Palavras-chave:\ndocument_properties_creation_date=Data da criação:\ndocument_properties_modification_date=Data da modificação:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Criação:\ndocument_properties_producer=Criador do PDF:\ndocument_properties_version=Versão do PDF:\ndocument_properties_page_count=Contagem de páginas:\ndocument_properties_close=Fechar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Exibir/ocultar painel\ntoggle_sidebar_label=Exibir/ocultar painel\noutline.title=Exibir estrutura de tópicos\noutline_label=Estrutura de tópicos do documento\nattachments.title=Exibir anexos\nattachments_label=Anexos\nthumbs.title=Exibir miniaturas das páginas\nthumbs_label=Miniaturas\nfindbar.title=Localizar no documento\nfindbar_label=Localizar\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Página {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura da página {{page}}\n\n# Find panel button title and messages\nfind_label=Localizar:\nfind_previous.title=Localizar a ocorrência anterior do texto\nfind_previous_label=Anterior\nfind_next.title=Localizar a próxima ocorrência do texto\nfind_next_label=Próxima\nfind_highlight=Realçar tudo\nfind_match_case_label=Diferenciar maiúsculas/minúsculas\nfind_reached_top=Atingido o início do documento, continuando do fim\nfind_reached_bottom=Atingido o fim do documento, continuando do início\nfind_not_found=Texto não encontrado\n\n# Error panel labels\nerror_more_info=Mais informações\nerror_less_info=Menos informações\nerror_close=Fechar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensagem: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Arquivo: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linha: {{line}}\nrendering_error=Ocorreu um erro ao renderizar a página.\n\n# Predefined zoom values\npage_scale_width=Largura da página\npage_scale_fit=Ajustar à janela\npage_scale_auto=Zoom automático\npage_scale_actual=Tamanho real\n\n# Loading indicator messages\nloading_error_indicator=Erro\nloading_error=Ocorreu um erro ao carregar o PDF.\ninvalid_file_error=Arquivo PDF corrompido ou inválido.\nmissing_file_error=Arquivo PDF ausente.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotação {{type}}]\npassword_label=Forneça a senha para abrir este arquivo PDF.\npassword_invalid=Senha inválida. Por favor, tente de novo.\npassword_ok=OK\npassword_cancel=Cancelar\n\nprinting_not_supported=Alerta: a impressão não é totalmente suportada neste navegador.\nprinting_not_ready=Alerta: o PDF não está totalmente carregado para impressão.\nweb_fonts_disabled=Fontes da web estão desativadas: não é possível usar fontes incorporadas do PDF.\ndocument_colors_disabled=Documentos PDF não estão permitidos a usar suas próprias cores: “Páginas podem usar outras cores” está desativado no navegador.\n"
  },
  {
    "path": "web/viewer/locale/pt-PT/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Página anterior\nprevious_label=Anterior\nnext.title=Página seguinte\nnext_label=Seguinte\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Página:\npage_of=de {{pageCount}}\n\nzoom_out.title=Reduzir\nzoom_out_label=Reduzir\nzoom_in.title=Ampliar\nzoom_in_label=Ampliar\nzoom.title=Ampliação\npresentation_mode.title=Mudar para modo de apresentação\npresentation_mode_label=Modo de apresentação\nopen_file.title=Abrir ficheiro\nopen_file_label=Abrir\nprint.title=Imprimir\nprint_label=Imprimir\ndownload.title=Transferir\ndownload_label=Transferir\nbookmark.title=Vista atual (copiar ou abrir em nova janela)\nbookmark_label=Vista atual\n\n# Secondary toolbar and context menu\ntools.title=Ferramentas\ntools_label=Ferramentas\nfirst_page.title=Ir para a primeira página\nfirst_page.label=Ir para a primeira página\nfirst_page_label=Ir para a primeira página\nlast_page.title=Ir para a última página\nlast_page.label=Ir para a última página\nlast_page_label=Ir para a última página\npage_rotate_cw.title=Rodar à direita\npage_rotate_cw.label=Rodar à direita\npage_rotate_cw_label=Rodar à direita\npage_rotate_ccw.title=Rodar à esquerda\npage_rotate_ccw.label=Rodar à esquerda\npage_rotate_ccw_label=Rodar à esquerda\n\nhand_tool_enable.title=Ativar ferramenta Mão\nhand_tool_enable_label=Ativar ferramenta Mão\nhand_tool_disable.title=Desativar ferramenta Mão\nhand_tool_disable_label=Desativar ferramenta Mão\n\n# Document properties dialog box\ndocument_properties.title=Propriedades do documento...\ndocument_properties_label=Propriedades do documento...\ndocument_properties_file_name=Nome do ficheiro:\ndocument_properties_file_size=Tamanho do ficheiro:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Título:\ndocument_properties_author=Autor:\ndocument_properties_subject=Assunto:\ndocument_properties_keywords=Palavras-chave:\ndocument_properties_creation_date=Data de criação:\ndocument_properties_modification_date=Data de modificação:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Criador:\ndocument_properties_producer=Produtor de PDF:\ndocument_properties_version=versão do PDF:\ndocument_properties_page_count=N.º de páginas:\ndocument_properties_close=Fechar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Comutar barra lateral\ntoggle_sidebar_label=Comutar barra lateral\noutline.title=Mostrar estrutura do documento\noutline_label=Estrutura do documento\nattachments.title=Mostrar anexos\nattachments_label=Anexos\nthumbs.title=Mostrar miniaturas\nthumbs_label=Miniaturas\nfindbar.title=Localizar no documento\nfindbar_label=Localizar\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Página {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura da página {{page}}\n\n# Find panel button title and messages\nfind_label=Localizar:\nfind_previous.title=Localizar a ocorrência anterior\nfind_previous_label=Anterior\nfind_next.title=Localizar a ocorrência seguinte\nfind_next_label=Seguinte\nfind_highlight=Destacar tudo\nfind_match_case_label=Correspondência\nfind_reached_top=Início de documento atingido, a continuar do fim\nfind_reached_bottom=Fim da página atingido, a continuar do início\nfind_not_found=Frase não encontrada\n\n# Error panel labels\nerror_more_info=Mais informação\nerror_less_info=Menos informação\nerror_close=Fechar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (compilação: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensagem: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pilha: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Ficheiro: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linha: {{line}}\nrendering_error=Ocorreu um erro ao processar a página.\n\n# Predefined zoom values\npage_scale_width=Ajustar à largura\npage_scale_fit=Ajustar à página\npage_scale_auto=Tamanho automático\npage_scale_actual=Tamanho real\n\n# Loading indicator messages\nloading_error_indicator=Erro\nloading_error=Ocorreu um erro ao carregar o PDF.\ninvalid_file_error=Ficheiro PDF inválido ou danificado.\nmissing_file_error=Ficheiro PDF inexistente.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotação {{type}}]\npassword_label=Introduza a senha para abrir este PDF.\npassword_invalid=Senha inválida. Tente novamente.\npassword_ok=OK\npassword_cancel=Cancelar\n\nprinting_not_supported=Aviso: a impressão não é totalmente suportada por este navegador.\nprinting_not_ready=Aviso: o PDF ainda não está totalmente carregado.\nweb_fonts_disabled=Os tipos de letra web estão desativados: não é possível utilizar os tipos de letra PDF incorporados.\ndocument_colors_disabled=Os documentos PDF não permitem a utilização das suas próprias cores: \\'Autorizar as páginas a escolher as suas próprias cores\\' está desativado no navegador.\n"
  },
  {
    "path": "web/viewer/locale/rm/viewer.properties",
    "content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pagina precedenta\nprevious_label=Enavos\nnext.title=Proxima pagina\nnext_label=Enavant\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Pagina:\npage_of=da {{pageCount}}\n\nzoom_out.title=Empitschnir\nzoom_out_label=Empitschnir\nzoom_in.title=Engrondir\nzoom_in_label=Engrondir\nzoom.title=Zoom\npresentation_mode.title=Midar en il modus da preschentaziun\npresentation_mode_label=Modus da preschentaziun\nopen_file.title=Avrir datoteca\nopen_file_label=Avrir\nprint.title=Stampar\nprint_label=Stampar\ndownload.title=Telechargiar\ndownload_label=Telechargiar\nbookmark.title=Vista actuala (copiar u avrir en ina nova fanestra)\nbookmark_label=Vista actuala\n\n# Secondary toolbar and context menu\ntools.title=Utensils\ntools_label=Utensils\nfirst_page.title=Siglir a l'emprima pagina\nfirst_page.label=Siglir a l'emprima pagina\nfirst_page_label=Siglir a l'emprima pagina\nlast_page.title=Siglir a la davosa pagina\nlast_page.label=Siglir a la davosa pagina\nlast_page_label=Siglir a la davosa pagina\npage_rotate_cw.title=Rotar en direcziun da l'ura\npage_rotate_cw.label=Rotar en direcziun da l'ura\npage_rotate_cw_label=Rotar en direcziun da l'ura\npage_rotate_ccw.title=Rotar en direcziun cuntraria a l'ura\npage_rotate_ccw.label=Rotar en direcziun cuntraria a l'ura\npage_rotate_ccw_label=Rotar en direcziun cuntraria a l'ura\n\nhand_tool_enable.title=Activar l'utensil da maun\nhand_tool_enable_label=Activar l'utensil da maun\nhand_tool_disable.title=Deactivar l'utensil da maun\nhand_tool_disable_label=Deactivar l'utensil da maun\n\n# Document properties dialog box\ndocument_properties.title=Caracteristicas dal document…\ndocument_properties_label=Caracteristicas dal document…\ndocument_properties_file_name=Num da la datoteca:\ndocument_properties_file_size=Grondezza da la datoteca:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Titel:\ndocument_properties_author=Autur:\ndocument_properties_subject=Tema:\ndocument_properties_keywords=Chavazzins:\ndocument_properties_creation_date=Data da creaziun:\ndocument_properties_modification_date=Data da modificaziun:\ndocument_properties_date_string={{date}} {{time}}\ndocument_properties_creator=Creà da:\ndocument_properties_producer=Creà il PDF cun:\ndocument_properties_version=Versiun da PDF:\ndocument_properties_page_count=Dumber da paginas:\ndocument_properties_close=Serrar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Activar/deactivar la trav laterala\ntoggle_sidebar_label=Activar/deactivar la trav laterala\noutline.title=Mussar la structura da la pagina\noutline_label=Structura da la pagina\nattachments.title=Mussar agiuntas\nattachments_label=Agiuntas\nthumbs.title=Mussar las miniaturas\nthumbs_label=Miniaturas\nfindbar.title=Tschertgar en il document\nfindbar_label=Tschertgar\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pagina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura da la pagina {{page}}\n\n# Find panel button title and messages\nfind_label=Tschertgar:\nfind_previous.title=Tschertgar la posiziun precedenta da l'expressiun\nfind_previous_label=Enavos\nfind_next.title=Tschertgar la proxima posiziun da l'expressiun\nfind_next_label=Enavant\nfind_highlight=Relevar tuts\nfind_match_case_label=Resguardar maiusclas/minusclas\nfind_reached_top=Il cumenzament dal document è cuntanschì, la tschertga cuntinuescha a la fin dal document\nfind_reached_bottom=La fin dal document è cuntanschì, la tschertga cuntinuescha al cumenzament dal document\nfind_not_found=Impussibel da chattar l'expressiun\n\n# Error panel labels\nerror_more_info=Dapli infurmaziuns\nerror_less_info=Damain infurmaziuns\nerror_close=Serrar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Messadi: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Datoteca: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Lingia: {{line}}\nrendering_error=Ina errur è cumparida cun visualisar questa pagina.\n\n# Predefined zoom values\npage_scale_width=Ladezza da la pagina\npage_scale_fit=Entira pagina\npage_scale_auto=Zoom automatic\npage_scale_actual=Grondezza actuala\n\n# Loading indicator messages\nloading_error_indicator=Errur\nloading_error=Ina errur è cumparida cun chargiar il PDF.\ninvalid_file_error=Datoteca PDF nunvalida u donnegiada.\nmissing_file_error=Datoteca PDF manconta.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Annotaziun da {{type}}]\npassword_label=Endatescha il pled-clav per avrir questa datoteca da PDF.\npassword_invalid=Pled-clav nunvalid. Emprova anc ina giada.\npassword_ok=OK\npassword_cancel=Interrumper\n\nprinting_not_supported=Attenziun: Il stampar na funcziunescha anc betg dal tut en quest navigatur.\nprinting_not_ready=Attenziun: Il PDF n'è betg chargià cumplettamain per stampar.\nweb_fonts_disabled=Scrittiras dal web èn deactivadas: impussibel dad utilisar las scrittiras integradas en il PDF.\ndocument_colors_disabled=Documents da PDF na pon betg utilisar lur atgnas colurs: \\'Permetter a las paginas d'utilisar lur atgnas colurs empè da las colurs tschernidas survart\\' è deactivà en il navigatur.\n"
  },
  {
    "path": "web/viewer/locale/ro/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pagina precedentă\nprevious_label=Înapoi\nnext.title=Pagina următoare\nnext_label=Înainte\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Pagină:\npage_of=din {{pageCount}}\n\nzoom_out.title=Depărtează\nzoom_out_label=Depărtează\nzoom_in.title=Apropie\nzoom_in_label=Apropie\nzoom.title=Panoramează\npresentation_mode.title=Schimbă la modul de prezentare\npresentation_mode_label=Mod de prezentare\nopen_file.title=Deschide un fișier\nopen_file_label=Deschide\nprint.title=Tipărește\nprint_label=Tipărește\ndownload.title=Descarcă\ndownload_label=Descarcă\nbookmark.title=Vizualizare curentă (copiați sau deschideți într-o fereastră nouă)\nbookmark_label=Vizualizare curentă\n\n# Secondary toolbar and context menu\ntools.title=Unelte\ntools_label=Unelte\nfirst_page.title=Mergi la prima pagină\nfirst_page.label=Mergeți la prima pagină\nfirst_page_label=Mergi la prima pagină\nlast_page.title=Mergi la ultima pagină\nlast_page.label=Mergi la ultima pagină\nlast_page_label=Mergi la ultima pagină\npage_rotate_cw.title=Rotește în sensul acelor de ceasornic\npage_rotate_cw.label=Rotește în sensul acelor de ceasornic\npage_rotate_cw_label=Rotește în sensul acelor de ceasornic\npage_rotate_ccw.title=Rotește în sens invers al acelor de ceasornic\npage_rotate_ccw.label=Rotate Counter-Clockwise\npage_rotate_ccw_label=Rotește în sens invers acelor de ceasornic\n\nhand_tool_enable.title=Activează instrumentul mână\nhand_tool_enable_label=Activează instrumentul mână\nhand_tool_disable.title=Dezactivează instrumentul mână\nhand_tool_disable_label=Dezactivează instrumentul mână\n\n# Document properties dialog box\ndocument_properties.title=Proprietățile documentului…\ndocument_properties_label=Proprietățile documentului…\ndocument_properties_file_name=Nume fișier:\ndocument_properties_file_size=Dimensiune fișier:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} biți)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} biți)\ndocument_properties_title=Titlu:\ndocument_properties_author=Autor:\ndocument_properties_subject=Subiect:\ndocument_properties_keywords=Cuvinte cheie:\ndocument_properties_creation_date=Data creării:\ndocument_properties_modification_date=Data modificării:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Autor:\ndocument_properties_producer=Producător PDF:\ndocument_properties_version=Versiune PDF:\ndocument_properties_page_count=Număr de pagini:\ndocument_properties_close=Închidere\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Comută bara laterală\ntoggle_sidebar_label=Comută bara laterală\noutline.title=Arată schița documentului\noutline_label=Schiță document\nattachments.title=Afișează atașamentele\nattachments_label=Atașamente\nthumbs.title=Arată miniaturi\nthumbs_label=Miniaturi\nfindbar.title=Caută în document\nfindbar_label=Căutați\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pagina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura paginii {{page}}\n\n# Find panel button title and messages\nfind_label=Caută:\nfind_previous.title=Găsește instanța anterioară în frază\nfind_previous_label=Anterior\nfind_next.title=Găstește următoarea instanță în frază\nfind_next_label=Următor\nfind_highlight=Evidențiază aparițiile\nfind_match_case_label=Potrivire litere\nfind_reached_top=Am ajuns la începutul documentului, continuă de la sfârșit\nfind_reached_bottom=Am ajuns la sfârșitul documentului, continuă de la început\nfind_not_found=Nu s-a găsit textul\n\n# Error panel labels\nerror_more_info=Mai multe informații\nerror_less_info=Mai puțină informație\nerror_close=Închide\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (varianta: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mesaj: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stivă: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fișier: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linie: {{line}}\nrendering_error=A intervenit o eroare la afișarea paginii.\n\n# Predefined zoom values\npage_scale_width=Lățime pagină\npage_scale_fit=Potrivire la pagină\npage_scale_auto=Dimensiune automată\npage_scale_actual=Dimensiune reală\n\n# Loading indicator messages\nloading_error_indicator=Eroare\nloading_error=A intervenit o eroare la încărcarea fișierului PDF.\ninvalid_file_error=Fișier PDF invalid sau deteriorat.\nmissing_file_error=Fișier PDF lipsă.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Adnotare]\npassword_label=Introduceți parola pentru a deschide acest fişier PDF.\npassword_invalid=Parolă greșită. Vă rugăm încercați din nou.\npassword_ok=OK\npassword_cancel=Renunță\n\nprinting_not_supported=Atenție: Tipărirea nu este suportată în totalitate de acest navigator.\nprinting_not_ready=Avertisment: Fișierul PDF nu este încărcat complet pentru tipărire.\nweb_fonts_disabled=Fonturile web sunt dezactivate: nu pot utiliza fonturile PDF încorporate.\ndocument_colors_disabled=Documentele PDF nu sunt autorizate să folosească propriile culori: 'Permite paginilor să aleagă propriile culori' este dezactivată în navigator.\n"
  },
  {
    "path": "web/viewer/locale/ru/viewer.properties",
    "content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nprevious.title = Предыдущая страница\nprevious_label = Предыдущая\nnext.title = Следующая страница\nnext_label = Следующая\npage_label = Страница:\npage_of = из {{pageCount}}\nzoom_out.title = Уменьшить\nzoom_out_label = Уменьшить\nzoom_in.title = Увеличить\nzoom_in_label = Увеличить\nzoom.title = Масштаб\npresentation_mode.title = Перейти в режим презентации\npresentation_mode_label = Режим презентации\nopen_file.title = Открыть файл\nopen_file_label = Открыть\nprint.title = Печать\nprint_label = Печать\ndownload.title = Загрузить\ndownload_label = Загрузить\nbookmark.title = Ссылка на текущий вид (скопировать или открыть в новом окне)\nbookmark_label = Текущий вид\ntools.title = Инструменты\ntools_label = Инструменты\nfirst_page.title = Перейти на первую страницу\nfirst_page.label = Перейти на первую страницу\nfirst_page_label = Перейти на первую страницу\nlast_page.title = Перейти на последнюю страницу\nlast_page.label = Перейти на последнюю страницу\nlast_page_label = Перейти на последнюю страницу\npage_rotate_cw.title = Повернуть по часовой стрелке\npage_rotate_cw.label = Повернуть по часовой стрелке\npage_rotate_cw_label = Повернуть по часовой стрелке\npage_rotate_ccw.title = Повернуть против часовой стрелки\npage_rotate_ccw.label = Повернуть против часовой стрелки\npage_rotate_ccw_label = Повернуть против часовой стрелки\nhand_tool_enable.title = Включить Инструмент «Рука»\nhand_tool_enable_label = Включить Инструмент «Рука»\nhand_tool_disable.title = Отключить Инструмент «Рука»\nhand_tool_disable_label = Отключить Инструмент «Рука»\ndocument_properties.title = Свойства документа…\ndocument_properties_label = Свойства документа…\ndocument_properties_file_name = Имя файла:\ndocument_properties_file_size = Размер файла:\ndocument_properties_kb = {{size_kb}} КБ ({{size_b}} байт)\ndocument_properties_mb = {{size_mb}} МБ ({{size_b}} байт)\ndocument_properties_title = Заголовок:\ndocument_properties_author = Автор:\ndocument_properties_subject = Тема:\ndocument_properties_keywords = Ключевые слова:\ndocument_properties_creation_date = Дата создания:\ndocument_properties_modification_date = Дата изменения:\ndocument_properties_date_string = {{date}}, {{time}}\ndocument_properties_creator = Приложение:\ndocument_properties_producer = Производитель PDF:\ndocument_properties_version = Версия PDF:\ndocument_properties_page_count = Число страниц:\ndocument_properties_close = Закрыть\ntoggle_sidebar.title = Открыть/закрыть боковую панель\ntoggle_sidebar_label = Открыть/закрыть боковую панель\noutline.title = Показать содержание документа\noutline_label = Содержание документа\nattachments.title = Показать вложения\nattachments_label = Вложения\nthumbs.title = Показать миниатюры\nthumbs_label = Миниатюры\nfindbar.title = Найти в документе\nfindbar_label = Найти\nthumb_page_title = Страница {{page}}\nthumb_page_canvas = Миниатюра страницы {{page}}\nfind_label = Найти:\nfind_previous.title = Найти предыдущее вхождение фразы в текст\nfind_previous_label = Назад\nfind_next.title = Найти следующее вхождение фразы в текст\nfind_next_label = Далее\nfind_highlight = Подсветить все\nfind_match_case_label = С учётом регистра\nfind_reached_top = Достигнут верх документа, продолжено снизу\nfind_reached_bottom = Достигнут конец документа, продолжено сверху\nfind_not_found = Фраза не найдена\nerror_more_info = Детали\nerror_less_info = Скрыть детали\nerror_close = Закрыть\nerror_version_info = PDF.js v{{version}} (сборка: {{build}})\nerror_message = Сообщение: {{message}}\nerror_stack = Стeк: {{stack}}\nerror_file = Файл: {{file}}\nerror_line = Строка: {{line}}\nrendering_error = При создании страницы произошла ошибка.\npage_scale_width = По ширине страницы\npage_scale_fit = По размеру страницы\npage_scale_auto = Автоматически\npage_scale_actual = Реальный размер\nloading_error_indicator = Ошибка\nloading_error = При загрузке PDF произошла ошибка.\ninvalid_file_error = Некорректный или повреждённый PDF-файл.\nmissing_file_error = PDF-файл отсутствует.\ntext_annotation_type.alt = [Аннотация {{type}}]\npassword_label = Введите пароль, чтобы открыть этот PDF-файл.\npassword_invalid = Неверный пароль. Пожалуйста, попробуйте снова.\npassword_ok = OK\npassword_cancel = Отмена\nprinting_not_supported = Предупреждение: В этом браузере не полностью поддерживается печать.\nprinting_not_ready = Предупреждение: PDF не полностью загружен для печати.\nweb_fonts_disabled = Веб-шрифты отключены: невозможно использовать встроенные PDF-шрифты.\ndocument_colors_disabled = PDF-документам не разрешено использовать свои цвета: в браузере отключён параметр «Разрешить веб-сайтам использовать свои цвета».\n"
  },
  {
    "path": "web/viewer/locale/rw/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Previous Page\nprevious_label=Previous\nnext.title=Next Page\nnext_label=Next\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Page:\npage_of=of {{pageCount}}\n\nzoom_out.title=Zoom Out\nzoom_out_label=Zoom Out\nzoom_in.title=Zoom In\nzoom_in_label=Zoom In\nzoom.title=Ihindurangano\nprint.title=Print\nprint_label=Print\npresentation_mode.title=Switch to Presentation Mode\npresentation_mode_label=Presentation Mode\nopen_file.title=Gufungura Dosiye\nopen_file_label=Gufungura\ndownload.title=Download\ndownload_label=Download\nbookmark.title=Current view (copy or open in new window)\nbookmark_label=Current View\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Toggle Sidebar\ntoggle_sidebar_label=Toggle Sidebar\noutline.title=Show Document Outline\noutline_label=Document Outline\nthumbs.title=Show Thumbnails\nthumbs_label=Thumbnails\nfindbar.title=Find in Document\nfindbar_label=Gushakisha\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Page {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Thumbnail of Page {{page}}\n\n# Context menu\nfirst_page.label=Go to First Page\nlast_page.label=Go to Last Page\npage_rotate_cw.label=Rotate Clockwise\npage_rotate_ccw.label=Rotate Counterclockwise\n\n# Find panel button title and messages\nfind_label=\"Gushaka:\"\nfind_previous.title=Gushaka aho uyu murongo ugaruka mbere y'aha\nfind_previous_label=Previous\nfind_next.title=Gushaka aho uyu murongo wongera kugaruka\nfind_next_label=Next\nfind_highlight=Highlight all\nfind_match_case_label=Match case\nfind_reached_top=Reached top of document, continued from bottom\nfind_reached_bottom=Reached end of document, continued from top\nfind_not_found=Umurongo ntubonetse\n\n# Error panel labels\nerror_more_info=More Information\nerror_less_info=Less Information\nerror_close=Gufunga\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Message: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Line: {{line}}\nrendering_error=An error occurred while rendering the page.\n\n# Predefined zoom values\npage_scale_width=Page Width\npage_scale_fit=Page Fit\npage_scale_auto=Automatic Zoom\npage_scale_actual=Actual Size\n\n# Loading indicator messages\nloading_error_indicator=Ikosa\nloading_error=An error occurred while loading the PDF.\ninvalid_file_error=Invalid or corrupted PDF file.\nmissing_file_error=Missing PDF file.\n\n# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type=[{{type}} Annotation]\nrequest_password=PDF is protected by a password:\n\nprinting_not_supported=Warning: Printing is not fully supported by this browser.\nprinting_not_ready=Warning: The PDF is not fully loaded for printing.\nweb_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.\nweb_colors_disabled=Web colors are disabled.\n"
  },
  {
    "path": "web/viewer/locale/sah/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Инники сирэй\nprevious_label=Иннинээҕи\nnext.title=Аныгыскы сирэй\nnext_label=Аныгыскы\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Сирэй:\npage_of=мантан {{pageCount}}\n\nzoom_out.title=Куччат\nzoom_out_label=Куччат\nzoom_in.title=Улаатыннар\nzoom_in_label=Улаатыннар\nzoom.title=Улаатыннар\npresentation_mode.title=Көрдөрөр эрэсиимҥэ\npresentation_mode_label=Көрдөрөр эрэсиим\nopen_file.title=Билэни арый\nopen_file_label=Ас\nprint.title=Бэчээт\nprint_label=Бэчээт\ndownload.title=Хачайдааһын\ndownload_label=Хачайдааһын\nbookmark.title=Билиҥҥи көстүүтэ (хатылаа эбэтэр саҥа түннүккэ арый)\nbookmark_label=Билиҥҥи көстүүтэ\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\ndocument_properties_title=Баһа:\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Ойоҕос хапталы арый/сап\ntoggle_sidebar_label=Ойоҕос хапталы арый/сап\noutline.title=Дөкүмүөн иһинээҕитин көрдөр\noutline_label=Дөкүмүөн иһинээҕитэ\nthumbs.title=Ойуучааннары көрдөр\nthumbs_label=Ойуучааннар\nfindbar.title=Дөкүмүөнтэн бул\nfindbar_label=Бул\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Сирэй {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Сирэй ойуучаана {{page}}\n\n# Find panel button title and messages\nfind_label=Бул:\nfind_previous.title=Этии тиэкискэ бу иннинээҕи киириитин бул\nfind_previous_label=Иннинээҕи\nfind_next.title=Этии тиэкискэ бу кэннинээҕи киириитин бул\nfind_next_label=Аныгыскы\nfind_highlight=Барытын сырдатан көрдөр\nfind_match_case_label=Буукуба улаханын-кыратын араар\nfind_reached_top=Сирэй үрдүгэр тиийдиҥ, салгыыта аллара\nfind_reached_bottom=Сирэй бүттэ, үөһэ салҕанна\nfind_not_found=Этии көстүбэтэ\n\n# Error panel labels\nerror_more_info=Сиһилии\nerror_less_info=Сиһилиитин кистээ\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (хомуйуута: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Этии: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Стeк: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Билэ: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Устуруока: {{line}}\nrendering_error=Сирэйи айарга алҕас таҕыста.\n\n# Predefined zoom values\npage_scale_width=Сирэй кэтитинэн\npage_scale_fit=Сирэй кээмэйинэн\npage_scale_auto=Аптамаатынан\npage_scale_actual=Дьиҥнээх кээмэйэ\n\n# Loading indicator messages\nloading_error_indicator=Алҕас\nloading_error=PDF-билэни хачайдыырга алҕас таҕыста.\ninvalid_file_error=Туох эрэ алҕастаах эбэтэр алдьаммыт PDF-билэ.\nmissing_file_error=PDF-билэ суох.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} туһунан]\npassword_cancel=Салҕаама\n\nprinting_not_supported=Сэрэтии: Бу браузер бэчээттиири толору өйөөбөт.\nprinting_not_ready=Сэрэтии: PDF бэчээттииргэ толору хачайдана илик.\nweb_fonts_disabled=Ситим-бичиктэр араарыллыахтара: PDF бичиктэрэ кыайан көстүбэттэр.\ndocument_colors_disabled=PDF-дөкүмүөүннэргэ бэйэлэрин өҥнөрүн туттар көҥүллэммэтэ: \"Ситим-сирдэр бэйэлэрин өҥнөрүн тутталларын көҥүллүүргэ\" диэн браузерга арахса сылдьар эбит.\n"
  },
  {
    "path": "web/viewer/locale/si/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=මීට පෙර පිටුව\nnext.title=මීළඟ පිටුව\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=පිටුව:\npage_of={{pageCount}} කින්\n\nzoom_out.title=කුඩා කරන්න\nzoom_out_label=කුඩා කරන්න\nzoom_in.title=විශාල කරන්න\nzoom_in_label=විශාල කරන්න\nzoom.title=විශාලණය\nopen_file.title=ගොනුව විවෘත කරන්න\nopen_file_label=විවෘත කරන්න\nprint.title=මුද්‍රණය\nprint_label=මුද්‍රණය\ndownload.title=බාගන්න\ndownload_label=බාගන්න\nbookmark.title=දැනට ඇති දසුන (පිටපත් කරන්න හෝ නව කවුළුවක විවෘත කරන්න)\nbookmark_label=දැනට ඇති දසුන\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\ndocument_properties_title=සිරස්තලය:\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\noutline.title=ලේඛනයේ පිට මායිම පෙන්වන්න\noutline_label=ලේඛනයේ පිට මායිම\nthumbs.title=සිඟිති රූ පෙන්වන්න\nthumbs_label=සිඟිති රූ\nfindbar_label=සොයන්න\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=පිටුව {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=පිටුවෙ සිඟිත රූව {{page}}\n\n# Find panel button title and messages\nfind_previous.title=මේ වාක්‍ය ඛණ්ඩය මීට පෙර යෙදුණු ස්ථානය සොයන්න\nfind_next.title=මේ වාක්‍ය ඛණ්ඩය මීළඟට යෙදෙන ස්ථානය සොයන්න\nfind_not_found=ඔබ සෙව් වචන හමු නොවීය\n\n# Error panel labels\nerror_more_info=බොහෝ තොරතුරු\nerror_less_info=අවම තොරතුරු\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=පණිවිඩය: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ගොනුව: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=පේළිය: {{line}}\nrendering_error=පිටුව රෙන්ඩර් විමේදි ගැටලුවක් හට ගැනුණි.\n\n# Predefined zoom values\npage_scale_width=පිටුවේ පළල\npage_scale_fit=පිටුවට සුදුසු ලෙස\npage_scale_auto=ස්වයංක්‍රීය විශාලණය\npage_scale_actual=නියමිත ප්‍රමාණය\n\n# Loading indicator messages\nloading_error_indicator=දෝෂය\nloading_error=PDF පූරණය විමේදි දෝෂයක් හට ගැනුණි.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} විස්තරය]\npassword_ok=හරි\npassword_cancel=එපා\n\n"
  },
  {
    "path": "web/viewer/locale/sk/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Predchádzajúca strana\nprevious_label=Predchádzajúca\nnext.title=Nasledujúca strana\nnext_label=Nasledujúca\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Strana:\npage_of=z {{pageCount}}\n\nzoom_out.title=Vzdialiť\nzoom_out_label=Vzdialiť\nzoom_in.title=Priblížiť\nzoom_in_label=Priblížiť\nzoom.title=Lupa\npresentation_mode.title=Prepnúť na režim Prezentácia\npresentation_mode_label=Režim Prezentácia\nopen_file.title=Otvoriť súbor\nopen_file_label=Otvoriť\nprint.title=Tlačiť\nprint_label=Tlačiť\ndownload.title=Prevziať\ndownload_label=Prevziať\nbookmark.title=Aktuálne zobrazenie (kopírovať alebo otvoriť v novom okne)\nbookmark_label=Aktuálne zobrazenie\n\n# Secondary toolbar and context menu\ntools.title=Nástroje\ntools_label=Nástroje\nfirst_page.title=Prejsť na prvú stranu\nfirst_page.label=Prejsť na prvú stranu\nfirst_page_label=Prejsť na prvú stranu\nlast_page.title=Prejsť na poslednú stranu\nlast_page.label=Prejsť na poslednú stranu\nlast_page_label=Prejsť na poslednú stranu\npage_rotate_cw.title=Otočiť v smere hodinových ručičiek\npage_rotate_cw.label=Otočiť v smere hodinových ručičiek\npage_rotate_cw_label=Otočiť v smere hodinových ručičiek\npage_rotate_ccw.title=Otočiť proti smeru hodinových ručičiek\npage_rotate_ccw.label=Otočiť proti smeru hodinových ručičiek\npage_rotate_ccw_label=Otočiť proti smeru hodinových ručičiek\n\nhand_tool_enable.title=Zapnúť nástroj Ruka\nhand_tool_enable_label=Zapnúť nástroj Ruka\nhand_tool_disable.title=Vypnúť nástroj Ruka\nhand_tool_disable_label=Vypnúť nástroj Ruka\n\n# Document properties dialog box\ndocument_properties.title=Vlastnosti dokumentu…\ndocument_properties_label=Vlastnosti dokumentu…\ndocument_properties_file_name=Názov súboru:\ndocument_properties_file_size=Veľkosť súboru:\ndocument_properties_kb={{size_kb}} kB ({{size_b}} bajtov)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bajtov)\ndocument_properties_title=Názov:\ndocument_properties_author=Autor:\ndocument_properties_subject=Predmet:\ndocument_properties_keywords=Kľúčové slová:\ndocument_properties_creation_date=Dátum vytvorenia:\ndocument_properties_modification_date=Dátum úpravy:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Vytvoril:\ndocument_properties_producer=Tvorca PDF:\ndocument_properties_version=Verzia PDF:\ndocument_properties_page_count=Počet strán:\ndocument_properties_close=Zavrieť\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Prepnúť bočný panel\ntoggle_sidebar_label=Prepnúť bočný panel\noutline.title=Zobraziť prehľad dokumentu\noutline_label=Prehľad dokumentu\nattachments.title=Zobraziť prílohy\nattachments_label=Prílohy\nthumbs.title=Zobraziť miniatúry\nthumbs_label=Miniatúry\nfindbar.title=Hľadať v dokumente\nfindbar_label=Hľadať\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Strana {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatúra strany {{page}}\n\n# Find panel button title and messages\nfind_label=Hľadať:\nfind_previous.title=Vyhľadať predchádzajúci výskyt reťazca\nfind_previous_label=Predchádzajúce\nfind_next.title=Vyhľadať ďalší výskyt reťazca\nfind_next_label=Ďalšie\nfind_highlight=Zvýrazniť všetky\nfind_match_case_label=Rozlišovať malé/veľké písmená\nfind_reached_top=Bol dosiahnutý začiatok stránky, pokračuje sa od konca\nfind_reached_bottom=Bol dosiahnutý koniec stránky, pokračuje sa od začiatku\nfind_not_found=Výraz nebol nájdený\n\n# Error panel labels\nerror_more_info=Viac informácií\nerror_less_info=Menej informácií\nerror_close=Zavrieť\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (zostavenie: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Správa: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Zásobník: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Súbor: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Riadok: {{line}}\nrendering_error=Pri vykresľovaní stránky sa vyskytla chyba.\n\n# Predefined zoom values\npage_scale_width=Na šírku strany\npage_scale_fit=Na veľkosť strany\npage_scale_auto=Automatická veľkosť\npage_scale_actual=Skutočná veľkosť\n\n# Loading indicator messages\nloading_error_indicator=Chyba\nloading_error=Počas načítavania dokumentu PDF sa vyskytla chyba.\ninvalid_file_error=Neplatný alebo poškodený súbor PDF.\nmissing_file_error=Chýbajúci súbor PDF.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotácia typu {{type}}]\npassword_label=Ak chcete otvoriť tento súbor PDF, zadajte jeho heslo.\npassword_invalid=Heslo nie je platné. Skúste to znova.\npassword_ok=OK\npassword_cancel=Zrušiť\n\nprinting_not_supported=Upozornenie: tlač nie je v tomto prehliadači plne podporovaná.\nprinting_not_ready=Upozornenie: súbor PDF nie je plne načítaný pre tlač.\nweb_fonts_disabled=Webové písma sú vypnuté: nie je možné použiť písma vložené do súboru PDF.\ndocument_colors_disabled=Dokumenty PDF nemajú povolené používať vlastné farby, pretože voľba \\'Povoliť stránkam používať vlastné farby\\' je v nastaveniach prehliadača vypnutá.\n"
  },
  {
    "path": "web/viewer/locale/sl/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Prejšnja stran\nprevious_label=Nazaj\nnext.title=Naslednja stran\nnext_label=Naprej\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Stran:\npage_of=od {{pageCount}}\n\nzoom_out.title=Pomanjšaj\nzoom_out_label=Pomanjšaj\nzoom_in.title=Povečaj\nzoom_in_label=Povečaj\nzoom.title=Povečava\npresentation_mode.title=Preklopi v način predstavitve\npresentation_mode_label=Način predstavitve\nopen_file.title=Odpri datoteko\nopen_file_label=Odpri\nprint.title=Natisni\nprint_label=Natisni\ndownload.title=Prenesi\ndownload_label=Prenesi\nbookmark.title=Trenutni pogled (kopiraj ali odpri v novem oknu)\nbookmark_label=Trenutni pogled\n\n# Secondary toolbar and context menu\ntools.title=Orodja\ntools_label=Orodja\nfirst_page.title=Pojdi na prvo stran\nfirst_page.label=Pojdi na prvo stran\nfirst_page_label=Pojdi na prvo stran\nlast_page.title=Pojdi na zadnjo stran\nlast_page.label=Pojdi na zadnjo stran\nlast_page_label=Pojdi na zadnjo stran\npage_rotate_cw.title=Zavrti v smeri urninega kazalca\npage_rotate_cw.label=Zavrti v smeri urninega kazalca\npage_rotate_cw_label=Zavrti v smeri urninega kazalca\npage_rotate_ccw.title=Zavrti v nasprotni smeri urninega kazalca\npage_rotate_ccw.label=Zavrti v nasprotni smeri urninega kazalca\npage_rotate_ccw_label=Zavrti v nasprotni smeri urninega kazalca\n\nhand_tool_enable.title=Omogoči roko\nhand_tool_enable_label=Omogoči roko\nhand_tool_disable.title=Onemogoči roko\nhand_tool_disable_label=Onemogoči roko\n\n# Document properties dialog box\ndocument_properties.title=Lastnosti dokumenta …\ndocument_properties_label=Lastnosti dokumenta …\ndocument_properties_file_name=Ime datoteke:\ndocument_properties_file_size=Velikost datoteke:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bajtov)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bajtov)\ndocument_properties_title=Ime:\ndocument_properties_author=Avtor:\ndocument_properties_subject=Tema:\ndocument_properties_keywords=Ključne besede:\ndocument_properties_creation_date=Datum nastanka:\ndocument_properties_modification_date=Datum spremembe:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Ustvaril:\ndocument_properties_producer=Izdelovalec PDF:\ndocument_properties_version=Različica PDF:\ndocument_properties_page_count=Število strani:\ndocument_properties_close=Zapri\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Preklopi stransko vrstico\ntoggle_sidebar_label=Preklopi stransko vrstico\noutline.title=Prikaži oris dokumenta\noutline_label=Oris dokumenta\nattachments.title=Prikaži priponke\nattachments_label=Priponke\nthumbs.title=Prikaži sličice\nthumbs_label=Sličice\nfindbar.title=Iskanje po dokumentu\nfindbar_label=Iskanje\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Stran {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Sličica strani {{page}}\n\n# Find panel button title and messages\nfind_label=Najdi:\nfind_previous.title=Najdi prejšnjo ponovitev iskanega\nfind_previous_label=Najdi nazaj\nfind_next.title=Najdi naslednjo ponovitev iskanega\nfind_next_label=Najdi naprej\nfind_highlight=Označi vse\nfind_match_case_label=Razlikuj velike/male črke\nfind_reached_top=Dosežen začetek dokumenta iz smeri konca\nfind_reached_bottom=Doseženo konec dokumenta iz smeri začetka\nfind_not_found=Iskanega ni mogoče najti\n\n# Error panel labels\nerror_more_info=Več informacij\nerror_less_info=Manj informacij\nerror_close=Zapri\n# LOCALIZATION NOTE (error_build): \"{{build}}\" will be replaced by the PDF.JS\n# build ID.\nerror_version_info=PDF.js r{{version}} (graditev: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Sporočilo: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Sklad: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Datoteka: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Vrstica: {{line}}\nrendering_error=Med pripravljanjem strani je prišlo do napake!\n\n# Predefined zoom values\npage_scale_width=Širina strani\npage_scale_fit=Prilagodi stran\npage_scale_auto=Samodejno\npage_scale_actual=Dejanska velikost\n\n# Loading indicator messages\nloading_error_indicator=Napaka\nloading_error=Med nalaganjem datoteke PDF je prišlo do napake.\ninvalid_file_error=Neveljavna ali pokvarjena datoteka PDF.\nmissing_file_error=Ni datoteke PDF.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Opomba vrste {{type}}]\npassword_label=Vnesite geslo za odpiranje te datoteke PDF.\npassword_invalid=Neveljavno geslo. Poskusite znova.\npassword_ok=V redu\npassword_cancel=Prekliči\n\nprinting_not_supported=Opozorilo: ta brskalnik ne podpira vseh možnosti tiskanja.\nprinting_not_ready=Opozorilo: PDF ni v celoti naložen za tiskanje.\nweb_fonts_disabled=Spletne pisave so onemogočene: vgradnih pisav za PDF ni mogoče uporabiti.\ndocument_colors_disabled=Dokumenti PDF ne smejo uporabljati svojih lastnih barv: možnost \\'Dovoli stranem uporabo lastnih barv\\' je v brskalniku onemogočena.\n"
  },
  {
    "path": "web/viewer/locale/son/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Moo bisante\nprevious_label=Bisante\nnext.title=Jinehere moo\nnext_label=Jine\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=&Moo:\npage_of={{pageCount}} ga\n\nzoom_out.title=Nakasandi\nzoom_out_label=Nakasandi\nzoom_in.title=Bebbeerandi\nzoom_in_label=Bebbeerandi\nzoom.title=Bebbeerandi\npresentation_mode.title=Bere cebeyan alhaali\npresentation_mode_label=Cebeyan alhaali\nopen_file.title=Tuku feeri\nopen_file_label=Feeri\nprint.title=Kar\nprint_label=Kar\ndownload.title=Zumandi\ndownload_label=Zumandi\nbookmark.title=Sohõ gunarro (bere wala feeri zanfun taaga ra)\nbookmark_label=Sohõ gunaroo\n\n# Secondary toolbar and context menu\ntools.title=Goyjinawey\ntools_label=Goyjinawey\nfirst_page.title=Koy moo jinaa ga\nfirst_page.label=Koy moo jinaa ga\nfirst_page_label=Koy moo jinaa ga\nlast_page.title=Koy moo koraa ga\nlast_page.label=Koy moo koraa ga\nlast_page_label=Koy moo koraa ga\npage_rotate_cw.title=Kuubi kanbe guma here\npage_rotate_cw.label=Kuubi kanbe guma here\npage_rotate_cw_label=Kuubi kanbe guma here\npage_rotate_ccw.title=Kuubi kanbe wowa here\npage_rotate_ccw.label=Kuubi kanbe wowa here\npage_rotate_ccw_label=Kuubi kanbe wowa here\n\nhand_tool_enable.title=Kanbe goyjinay tunandi\nhand_tool_enable_label=Kanbe goyjinay tunandi\nhand_tool_disable.title=Kanbe joyjinay kaa\nhand_tool_disable_label=Kanbe goyjinay kaa\n\n# Document properties dialog box\ndocument_properties.title=Takadda mayrawey…\ndocument_properties_label=Takadda mayrawey…\ndocument_properties_file_name=Tuku maa:\ndocument_properties_file_size=Tuku adadu:\ndocument_properties_kb=KB {{size_kb}} (cebsu-ize {{size_b}})\ndocument_properties_mb=MB {{size_kb}} (cebsu-ize {{size_b}})\ndocument_properties_title=Tiiramaa:\ndocument_properties_author=Hantumkaw:\ndocument_properties_subject=Dalil:\ndocument_properties_keywords=Kufalkalimawey:\ndocument_properties_creation_date=Teeyan han:\ndocument_properties_modification_date=Barmayan han:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Teekaw:\ndocument_properties_producer=PDF berandikaw:\ndocument_properties_version=PDF dumi:\ndocument_properties_page_count=Moo hinna:\ndocument_properties_close=Daabu\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Kanjari ceraw zuu\ntoggle_sidebar_label=Kanjari ceraw zuu\noutline.title=Takadda filla-boŋ cebe\noutline_label=Takadda filla-boŋ\nattachments.title=Hangarey cebe\nattachments_label=Hangarey\nthumbs.title=Kabeboy biyey cebe\nthumbs_label=Kabeboy biyey\nfindbar.title=Ceeci takaddaa ra\nfindbar_label=Ceeci\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}} moo\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Kabeboy bii {{page}} moo še\n\n# Find panel button title and messages\nfind_label=Ceeci:\nfind_previous.title=Kalimaɲaŋoo bangayri bisantaa ceeci\nfind_previous_label=Bisante\nfind_next.title=Kalimaɲaŋoo hiino bangayroo ceeci\nfind_next_label=Jine\nfind_highlight=Ikul šilbay\nfind_match_case_label=Harfu-beeriyan hawgay\nfind_reached_top=A too moŋoo boŋoo, koy jine ka šinitin nda cewoo\nfind_reached_bottom=A too moɲoo cewoo, koy jine šintioo ga\nfind_not_found=Kalimaɲaa mana duwandi\n\n# Error panel labels\nerror_more_info=Alhabar tontoni\nerror_less_info=Alhabar tontoni\nerror_close=Daabu\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Alhabar:  {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Dekeri: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Tuku: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Žeeri: {{line}}\nrendering_error=Firka bangay kaŋ moɲoo goo ma willandi.\n\n# Predefined zoom values\npage_scale_width=Mooo hayyan\npage_scale_fit=Moo sawayan\npage_scale_auto=Boŋše azzaati barmayyan\npage_scale_actual=Adadu cimi\n\n# Loading indicator messages\nloading_error_indicator=Firka\nloading_error=Firka bangay kaŋ PDF goo ma zumandi.\ninvalid_file_error=PDF tuku laala wala laybante.\nmissing_file_error=PDF tuku kumante.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt={{type}} maasa-caw]\npassword_label=Šennikufal dam ka PDF tukoo woo feeri.\npassword_invalid=Šennikufal laalo. Ceeci koyne taare.\npassword_ok=Ayyo\npassword_cancel=Naŋ\n\nprinting_not_supported=Yaamar: Karyan ši tee ka timme nda ceecikaa woo.\nprinting_not_ready=Yaamar: PDF ši zunbu ka timme karyan še.\nweb_fonts_disabled=Interneti šigirawey kay: ši hin ka goy nda PDF šigira hurantey.\ndocument_colors_disabled=PDF takaddawey ši duu fondo ka ngey boŋ noonawey zaa: 'Naŋ moɲey ma ngey boŋ noonawey suuba' ši dira ceecikaa ga.\n"
  },
  {
    "path": "web/viewer/locale/sq/viewer.properties",
    "content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Faqja e Mëparshme\nprevious_label=E mëparshmja\nnext.title=Faqja Pasuese\nnext_label=Pasuesja\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Faqja:\npage_of=nga {{pageCount}}\n\nzoom_out.title=Zoom Out\nzoom_out_label=Zoom Out\nzoom_in.title=Zoom In\nzoom_in_label=Zoom In\nzoom.title=Zoom\nprint.title=Shtype\nprint_label=Shtypeni\npresentation_mode.title=Kalo te Mënyra Paraqitje\npresentation_mode_label=Mënyra Paraqitje\nopen_file.title=Hapni Kartelë\nopen_file_label=Hapeni\ndownload.title=Shkarkim\ndownload_label=Shkarkojeni\nbookmark.title=Pamja e tanishme (kopjojeni ose hapeni në dritare të re)\nbookmark_label=Pamja e Tanishme\n\n# Secondary toolbar and context menu\ntools.title=Mjete\ntools_label=Mjete\nfirst_page.title=Shkoni te Faqja e Parë\nfirst_page.label=Shkoni te Faqja e Parë\nfirst_page_label=Shkoni te Faqja e Parë\nlast_page.title=Shkoni te Faqja e Fundit\nlast_page.label=Shkoni te Faqja e Fundit\nlast_page_label=Shkoni te Faqja e Fundit\npage_rotate_cw.title=Rrotullojeni Në Kahun Orar\npage_rotate_cw.label=Rrotullojeni Në Kahun Orar\npage_rotate_cw_label=Rrotullojeni Në Kahun Orar\npage_rotate_ccw.title=Rrotullojeni Në Kahun Kundërorar\npage_rotate_ccw.label=Rrotullojeni Në Kahun Kundërorar\npage_rotate_ccw_label=Rrotullojeni Në Kahun Kundërorar\n\nhand_tool_enable.title=Aktivizoni mjet dore\nhand_tool_enable_label=Aktivizoni mjet dore\nhand_tool_disable.title=Çaktivizoni mjet dore\nhand_tool_disable_label=Çaktivizoni mjet dore\n\n# Document properties dialog box\ndocument_properties.title=Veti Dokumenti…\ndocument_properties_label=Veti Dokumenti…\ndocument_properties_file_name=Emër kartele:\ndocument_properties_file_size=Madhësi kartele:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bajte)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bajte)\ndocument_properties_title=Titull:\ndocument_properties_author=Autor:\ndocument_properties_subject=Subjekt:\ndocument_properties_keywords=Fjalëkyçe:\ndocument_properties_creation_date=Datë Krijimi:\ndocument_properties_modification_date=Datë Ndryshimi:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Krijues:\ndocument_properties_producer=Prodhues PDF-je:\ndocument_properties_version=Version PDF-je:\ndocument_properties_page_count=Numër Faqesh:\ndocument_properties_close=Mbylle\n\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Shfaqni/Fshihni Anështyllën\ntoggle_sidebar_label=Shfaqni/Fshihni Anështyllën\n\noutline.title=Shfaq Përvijim Dokumenti\noutline_label=Shfaq Përvijim Dokumenti\nthumbs.title=Shfaq Miniatura\nthumbs_label=Miniatura\nfindbar.title=Gjej në Dokument\nfindbar_label=Gjej\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Faqja {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniaturë e Faqes {{page}}\n\n# Context menu\nfirst_page.label=Kalo te Faqja e Parë\nlast_page.label=Kalo te Faqja e Fundit\npage_rotate_cw.label=Rrotulloje Në Kahun Orar\npage_rotate_ccw.label=Rrotulloje Në Kahun Antiorar\n\n# Find panel button title and messages\nfind_label=Gjej:\nfind_previous.title=Gjeni hasjen e mëparshme të togfjalëshit\nfind_previous_label=E mëparshmja\nfind_next.title=Gjeni hasjen pasuese të togfjalëshit\nfind_next_label=Pasuesja\nfind_highlight=Theksoji të gjitha\nfind_match_case_label=Siç është shkruar\nfind_reached_top=U mbërrit në krye të dokumentit, vazhduar prej fundit\nfind_reached_bottom=U mbërrit në fund të dokumentit, vazhduar prej kreut\nfind_not_found=Nuk u gjet togfjalëshi\n\n# Error panel labels\nerror_more_info=Më Tepër të Dhëna\nerror_less_info=Më Pak të Dhëna\nerror_close=Mbylle\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mesazh: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Kartelë: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rresht: {{line}}\nrendering_error=Ndodhi një gabim gjatë riprodhimit të faqes.\n\n# Predefined zoom values\npage_scale_width=Gjerësi Faqeje\npage_scale_fit=Sa Nxë Faqja\npage_scale_auto=Zoom i Vetvetishëm\npage_scale_actual=Madhësia Faktike\n\n# Loading indicator messages\n# LOCALIZATION NOTE (error_line): \"{{[percent}}\" will be replaced with a percentage\nloading_error_indicator=Gabim\nloading_error=Ndodhi një gabim gjatë ngarkimit të PDF-së.\ninvalid_file_error=Kartelë PDF e pavlefshme ose e dëmtuar.\nmissing_file_error=Kartelë PDF që mungon.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Nënvizim {{type}}]\npassword_label=Jepni fjalëkalimin që të hapet kjo kartelë PDF.\npassword_invalid=Fjalëkalim i pavlefshëm. Ju lutemi, riprovoni.\npassword_ok=OK\npassword_cancel=Anuloje\n\nprinting_not_supported=Kujdes: Shtypja nuk mbulohet plotësisht nga ky shfletues.\nprinting_not_ready=Kujdes: PDF-ja nuk është ngarkuar plotësisht që ta shtypni.\nweb_fonts_disabled=Shkronjat Web janë të çaktivizuara: i pazoti të përdorë shkronja të trupëzuara në PDF.\ndocument_colors_disabled=Dokumenteve PDF nuk u është lejuar të përdorin ngjyrat e veta: \\'Lejoji faqet t&apos;i zgjedhin vetë ngjyrat\\', te shfletuesi, është e çaktivizuar.\n"
  },
  {
    "path": "web/viewer/locale/sr/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Претходна страница\nprevious_label=Претходна\nnext.title=Следећа страница\nnext_label=Следећа\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Страница:\npage_of=од {{pageCount}}\n\nzoom_out.title=Умањи\nzoom_out_label=Умањи\nzoom_in.title=Увеличај\nzoom_in_label=Увеличај\nzoom.title=Зумирање\npresentation_mode.title=Промени на приказ у режиму презентације\npresentation_mode_label=Режим презентације\nopen_file.title=Отвори датотеку\nopen_file_label=Отвори\nprint.title=Штампај\nprint_label=Штампај\ndownload.title=Преузми\ndownload_label=Преузми\nbookmark.title=Тренутни приказ(копирај или отвори нови прозор)\nbookmark_label=Тренутни приказ\n\n# Secondary toolbar and context menu\ntools.title=Алатке\ntools_label=Алатке\nfirst_page.title=Иди на прву страницу\nfirst_page.label=Иди на прву страницу\nfirst_page_label=Иди на прву страницу\nlast_page.title=Иди на последњу страницу\nlast_page.label=Иди на последњу страницу\nlast_page_label=Иди на последњу страницу\npage_rotate_cw.title=Ротирај у смеру казаљке на сату\npage_rotate_cw.label=Ротирај у смеру казаљке на сату\npage_rotate_cw_label=Ротирај у смеру казаљке на сату\npage_rotate_ccw.title=Ротирај у смеру супротном од казаљке на сату\npage_rotate_ccw.label=Ротирај у смеру супротном од казаљке на сату\npage_rotate_ccw_label=Ротирај у смеру супротном од казаљке на сату\n\nhand_tool_enable.title=Омогући алатку за померање\nhand_tool_enable_label=Омогући алатку за померање\nhand_tool_disable.title=Онемогући алатку за померање\nhand_tool_disable_label=Онемогући алатку за померање\n\n# Document properties dialog box\ndocument_properties.title=Параметри документа…\ndocument_properties_label=Параметри документа…\ndocument_properties_file_name=Име датотеке:\ndocument_properties_file_size=Величина датотеке:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} B)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} B)\ndocument_properties_title=Наслов:\ndocument_properties_author=Аутор:\ndocument_properties_subject=Тема:\ndocument_properties_keywords=Кључне речи:\ndocument_properties_creation_date=Датум креирања:\ndocument_properties_modification_date=Датум модификације:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Стваралац:\ndocument_properties_producer=PDF произвођач:\ndocument_properties_version=PDF верзија:\ndocument_properties_page_count=Број страница:\ndocument_properties_close=Затвори\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Прикажи додатну палету\ntoggle_sidebar_label=Прикажи додатну палету\noutline.title=Прикажи контуру документа\noutline_label=Контура документа\nattachments.title=Прикажи прилоге\nattachments_label=Прилози\nthumbs.title=Прикажи сличице\nthumbs_label=Сличице\nfindbar.title=Пронађи у документу\nfindbar_label=Пронађи\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Страница {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Сличица од странице {{page}}\n\n# Find panel button title and messages\nfind_label=Пронађи:\nfind_previous.title=Пронађи претходну појаву фразе\nfind_previous_label=Претходна\nfind_next.title=Пронађи следећу појаву фразе\nfind_next_label=Следећа\nfind_highlight=Истакнути све\nfind_match_case_label=Подударања\nfind_reached_top=Достигнут врх документа, наставио са дна\nfind_reached_bottom=Достигнуто дно документа, наставио са врха\nfind_not_found=Фраза није пронађена\n\n# Error panel labels\nerror_more_info=Више информација\nerror_less_info=Мање информација\nerror_close=Затвори\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Порука: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Стек: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Датотека: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Линија: {{line}}\nrendering_error=Дошло је до грешке приликом рендеровања ове странице.\n\n# Predefined zoom values\npage_scale_width=Ширина странице\npage_scale_fit=Уклапање странице\npage_scale_auto=Аутоматско увеличавање\npage_scale_actual=Стварна величина\n\n# Loading indicator messages\nloading_error_indicator=Грешка\nloading_error=Дошло је до грешке приликом учитавање PDF.\ninvalid_file_error=PDF датотека је оштећена или је неисправна.\nmissing_file_error=PDF датотека није пронађена.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} коментар]\npassword_label=_Унесите лозинку да бисте отворили овај PDF докуменат.\npassword_invalid=Неисправна лозинка. Покушајте поново.\npassword_ok=У реду\npassword_cancel=Откажи\n\nprinting_not_supported=Упозорење: Штампање није у потпуности подржано у овом прегледачу.\nprinting_not_ready=Упозорење: PDF није у потпуности учитан за штампу.\nweb_fonts_disabled=Веб фонтови су онемогућени: не могу користити уграђене PDF фонтове.\ndocument_colors_disabled=PDF документи не могу да користе сопствене боје: \\'Дозволи страницама да одаберу своје боје\\' је деактивирано у прегледачу.\n"
  },
  {
    "path": "web/viewer/locale/sv-SE/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Föregående sida\nprevious_label=Föregående\nnext.title=Nästa sida\nnext_label=Nästa\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Sida:\npage_of=av {{pageCount}}\n\nzoom_out.title=Zooma ut\nzoom_out_label=Zooma ut\nzoom_in.title=Zooma in\nzoom_in_label=Zooma in\nzoom.title=Zoom\npresentation_mode.title=Byt till presentationsläge\npresentation_mode_label=Presentationsläge\nopen_file.title=Öppna fil\nopen_file_label=Öppna\nprint.title=Skriv ut\nprint_label=Skriv ut\ndownload.title=Hämta\ndownload_label=Hämta\nbookmark.title=Aktuell vy (kopiera eller öppna i nytt fönster)\nbookmark_label=Aktuell vy\n\n# Secondary toolbar and context menu\ntools.title=Verktyg\ntools_label=Verktyg\nfirst_page.title=Gå till första sidan\nfirst_page.label=Gå till första sidan\nfirst_page_label=Gå till första sidan\nlast_page.title=Gå till sista sidan\nlast_page.label=Gå till sista sidan\nlast_page_label=Gå till sista sidan\npage_rotate_cw.title=Rotera medurs\npage_rotate_cw.label=Rotera medurs\npage_rotate_cw_label=Rotera medurs\npage_rotate_ccw.title=Rotera moturs\npage_rotate_ccw.label=Rotera moturs\npage_rotate_ccw_label=Rotera moturs\n\nhand_tool_enable.title=Aktivera handverktyg\nhand_tool_enable_label=Aktivera handverktyg\nhand_tool_disable.title=Inaktivera handverktyg\nhand_tool_disable_label=Inaktivera handverktyg\n\n# Document properties dialog box\ndocument_properties.title=Dokumentegenskaper…\ndocument_properties_label=Dokumentegenskaper…\ndocument_properties_file_name=Filnamn:\ndocument_properties_file_size=Filstorlek:\ndocument_properties_kb={{size_kb}} kB ({{size_b}} byte)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} byte)\ndocument_properties_title=Titel:\ndocument_properties_author=Författare:\ndocument_properties_subject=Ämne:\ndocument_properties_keywords=Nyckelord:\ndocument_properties_creation_date=Skapades:\ndocument_properties_modification_date=Ändrades:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Skapare:\ndocument_properties_producer=PDF-producent:\ndocument_properties_version=PDF-version:\ndocument_properties_page_count=Sidantal:\ndocument_properties_close=Stäng\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Visa/dölj sidofält\ntoggle_sidebar_label=Visa/dölj sidofält\noutline.title=Visa dokumentöversikt\noutline_label=Dokumentöversikt\nattachments.title=Visa bifogade filer\nattachments_label=Bifogade filer\nthumbs.title=Visa miniatyrer\nthumbs_label=Miniatyrer\nfindbar.title=Sök i dokument\nfindbar_label=Sök\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Sida {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatyr av sida {{page}}\n\n# Find panel button title and messages\nfind_label=Sök:\nfind_previous.title=Hitta föregående förekomst av frasen\nfind_previous_label=Föregående\nfind_next.title=Hitta nästa förekomst av frasen\nfind_next_label=Nästa\nfind_highlight=Markera alla\nfind_match_case_label=Matcha versal/gemen\nfind_reached_top=Nådde början av dokumentet, började från slutet\nfind_reached_bottom=Nådde slutet på dokumentet, började från början\nfind_not_found=Frasen hittades inte\n\n# Error panel labels\nerror_more_info=Mer information\nerror_less_info=Mindre information\nerror_close=Stäng\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Meddelande: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fil: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rad: {{line}}\nrendering_error=Ett fel uppstod vid visning av sidan.\n\n# Predefined zoom values\npage_scale_width=Sidbredd\npage_scale_fit=Anpassa sida\npage_scale_auto=Automatisk zoom\npage_scale_actual=Verklig storlek\n\n# Loading indicator messages\nloading_error_indicator=Fel\nloading_error=Ett fel uppstod vid laddning av PDF-filen.\ninvalid_file_error=Ogiltig eller korrupt PDF-fil.\nmissing_file_error=Saknad PDF-fil.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}}-annotering]\npassword_label=Skriv in lösenordet för att öppna PDF-filen.\npassword_invalid=Ogiltigt lösenord. Försök igen.\npassword_ok=OK\npassword_cancel=Avbryt\n\nprinting_not_supported=Varning: Utskrifter stöds inte helt av den här webbläsaren.\nprinting_not_ready=Varning: PDF:en är inte klar för utskrift.\nweb_fonts_disabled=Webbtypsnitt är inaktiverade: kan inte använda inbäddade PDF-typsnitt.\ndocument_colors_disabled=PDF-dokument tillåts inte använda egna färger: \\'Låt sidor använda egna färger\\' är inaktiverat i webbläsaren.\n"
  },
  {
    "path": "web/viewer/locale/sw/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Ukurasa Uliotangulia\nprevious_label=Iliyotangulia\nnext.title=Ukurasa Ufuatao\nnext_label=Ifuatayo\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Ukurasa:\npage_of=ya {{Hesabu ya ukurasa}}\n\nzoom_out.title=Kuza Nje\nzoom_out_label=Kuza Nje\nzoom_in.title=Kuza Ndani\nzoom_in_label=Kuza Ndani\nzoom.title=Kuza\npresentation_mode.title=Badili kwa Hali ya Uwasilishaji\npresentation_mode_label=Hali ya Uwasilishaji\nopen_file.title=Fungua Faili\nopen_file_label=Fungua\nprint.title=Chapisha\nprint_label=Chapisha\ndownload.title=Pakua\ndownload_label=Pakua\nbookmark.title=Mwonekano wa sasa (nakili au ufungue katika dirisha mpya)\nbookmark_label=Mwonekano wa Sasa\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\ndocument_properties_title=Kichwa:\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Kibiano cha Upau wa Kando\ntoggle_sidebar_label=Kibiano cha Upau wa Kando\noutline.title=Onyesha Ufupisho wa Waraka\noutline_label=Ufupisho wa Waraka\nthumbs.title=Onyesha Kijipicha\nthumbs_label=Vijipicha\nfindbar.title=Pata katika Waraka\nfindbar_label=Tafuta\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Ukurasa {{ukurasa}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Kijipicha cha ukurasa {{ukurasa}}\n\n# Find panel button title and messages\nfind_label=Tafuta:\nfind_previous.title=Tafuta tukio kabla ya msemo huu\nfind_previous_label=Iliyotangulia\nfind_next.title=Tafuta tukio linalofuata la msemo\nfind_next_label=Ifuatayo\nfind_highlight=Angazia yote\nfind_match_case_label=Linganisha herufi\nfind_reached_top=Imefika juu ya waraka, imeendelea kutoka chini\nfind_reached_bottom=Imefika mwisho wa waraka, imeendelea kutoka juu\nfind_not_found=Msemo hukupatikana\n\n# Error panel labels\nerror_more_info=Maelezo Zaidi\nerror_less_info=Maelezo Kidogo\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (jenga: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Ujumbe: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Panganya: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Faili: {{faili}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Laini: {{laini}}\nrendering_error=Hitilafu lilitokea wajati wa kutoa ukurasa\n\n# Predefined zoom values\npage_scale_width=Upana wa Ukurasa\npage_scale_fit=Usawa wa Ukurasa\npage_scale_auto=Ukuzaji wa Kiotomatiki\npage_scale_actual=Ukubwa Halisi\n\n# Loading indicator messages\nloading_error_indicator=Hitilafu\nloading_error=Hitilafu lilitokea wakati wa kupakia PDF.\ninvalid_file_error=Faili ya PDF isiyohalali au potofu.\nmissing_file_error=Faili ya PDF isiyopo.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Ufafanuzi]\npassword_ok=SAWA\npassword_cancel=Ghairi\n\nprinting_not_supported=Onyo: Uchapishaji hauauniwi kabisa kwa kivinjari hiki.\nweb_fonts_disabled=Fonti za tovuti zimelemazwa: haziwezi kutumia fonti za PDF zilizopachikwa.\n"
  },
  {
    "path": "web/viewer/locale/ta/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=முந்தைய பக்கம்\nprevious_label=முந்தையது\nnext.title=அடுத்த பக்கம்\nnext_label=அடுத்து\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=பக்கம்:\npage_of=இல் {{pageCount}}\n\nzoom_out.title=சிறிதாக்கு\nzoom_out_label=சிறிதாக்கு\nzoom_in.title=பெரிதாக்கு\nzoom_in_label=பெரிதாக்கு\nzoom.title=பெரிதாக்கு\npresentation_mode.title=விளக்ககாட்சி பயன்முறைக்கு மாறு\npresentation_mode_label=விளக்ககாட்சி பயன்முறை\nopen_file.title=கோப்பினை திற\nopen_file_label=திற\nprint.title=அச்சிடு\nprint_label=அச்சிடு\ndownload.title=பதிவிறக்கு\ndownload_label=பதிவிறக்கு\nbookmark.title=தற்போதைய காட்சி (புதிய சாளரத்திற்கு நகலெடு அல்லது புதிய சாளரத்தில் திற)\nbookmark_label=தற்போதைய காட்சி\n\n# Secondary toolbar and context menu\ntools.title=கருவிகள்\ntools_label=கருவிகள்\nfirst_page.title=முதல் பக்கத்திற்கு செல்லவும்\nfirst_page.label=முதல் பக்கத்திற்கு செல்லவும்\nfirst_page_label=முதல் பக்கத்திற்கு செல்லவும்\nlast_page.title=கடைசி பக்கத்திற்கு செல்லவும்\nlast_page.label=கடைசி பக்கத்திற்கு செல்லவும்\nlast_page_label=கடைசி பக்கத்திற்கு செல்லவும்\npage_rotate_cw.title=வலஞ்சுழியாக சுழற்று\npage_rotate_cw.label=வலஞ்சுழியாக சுழற்று\npage_rotate_cw_label=வலஞ்சுழியாக சுழற்று\npage_rotate_ccw.title=இடஞ்சுழியாக சுழற்று\npage_rotate_ccw.label=இடஞ்சுழியாக சுழற்று\npage_rotate_ccw_label=இடஞ்சுழியாக சுழற்று\n\nhand_tool_enable.title=கை கருவியை செயலாக்கு\nhand_tool_enable_label=கை கருவியை செயலாக்கு\nhand_tool_disable.title=கை கருவியை முடக்கு\nhand_tool_disable_label=கை கருவியை முடக்கு\n\n# Document properties dialog box\ndocument_properties.title=ஆவண பண்புகள்...\ndocument_properties_label=ஆவண பண்புகள்...\ndocument_properties_file_name=கோப்பு பெயர்:\ndocument_properties_file_size=கோப்பின் அளவு:\ndocument_properties_kb={{size_kb}} கிபை ({{size_b}} பைட்டுகள்)\ndocument_properties_mb={{size_mb}} மெபை ({{size_b}} பைட்டுகள்)\ndocument_properties_title=தலைப்பு:\ndocument_properties_author=எழுதியவர்\ndocument_properties_subject=பொருள்:\ndocument_properties_keywords=முக்கிய வார்த்தைகள்:\ndocument_properties_creation_date=படைத்த தேதி :\ndocument_properties_modification_date=திருத்திய தேதி:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=உருவாக்குபவர்:\ndocument_properties_producer=பிடிஎஃப் தயாரிப்பாளர்:\ndocument_properties_version=PDF பதிப்பு:\ndocument_properties_page_count=பக்க எண்ணிக்கை:\ndocument_properties_close=மூடுக\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=பக்கப் பட்டியை நிலைமாற்று\ntoggle_sidebar_label=பக்கப் பட்டியை நிலைமாற்று\noutline.title=ஆவண வெளிவரையைக் காண்பி\noutline_label=ஆவண வெளிவரை\nattachments.title=இணைப்புகளை காண்பி\nattachments_label=இணைப்புகள்\nthumbs.title=சிறுபடங்களைக் காண்பி\nthumbs_label=சிறுபடங்கள்\nfindbar.title=ஆவணத்தில் கண்டறி\nfindbar_label=கண்டுபிடி\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=பக்கம் {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=பக்கத்தின் சிறுபடம் {{page}}\n\n# Find panel button title and messages\nfind_label=கண்டறி:\nfind_previous.title=இந்த சொற்றொடரின் முந்தைய நிகழ்வை தேடு\nfind_previous_label=முந்தையது\nfind_next.title=இந்த சொற்றொடரின் அடுத்த நிகழ்வை தேடு\nfind_next_label=அடுத்து\nfind_highlight=அனைத்தையும் தனிப்படுத்து\nfind_match_case_label=பேரெழுத்தாக்கத்தை உணர்\nfind_reached_top=ஆவணத்தின் மேல் பகுதியை அடைந்தது, அடிப்பக்கத்திலிருந்து தொடர்ந்தது\nfind_reached_bottom=ஆவணத்தின் முடிவை அடைந்தது, மேலிருந்து தொடர்ந்தது\nfind_not_found=சொற்றொடர் காணவில்லை\n\n# Error panel labels\nerror_more_info=கூடுதல் தகவல்\nerror_less_info=குறைந்த தகவல்\nerror_close=மூடுக\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=செய்தி: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=ஸ்டேக்: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=கோப்பு: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=வரி: {{line}}\nrendering_error=இந்தப் பக்கத்தை காட்சிப்படுத்தும் போது ஒரு பிழை ஏற்பட்டது.\n\n# Predefined zoom values\npage_scale_width=பக்க அகலம்\npage_scale_fit=பக்கப் பொருத்தம்\npage_scale_auto=தானியக்க பெரிதாக்கல்\npage_scale_actual=உண்மையான அளவு\n\n# Loading indicator messages\nloading_error_indicator=பிழை\nloading_error=PDF ஐ ஏற்றும் போது ஒரு பிழை ஏற்பட்டது.\ninvalid_file_error=செல்லுபடியாகாத அல்லது சிதைந்த PDF கோப்பு.\nmissing_file_error=PDF கோப்பு காணவில்லை.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} விளக்கம்]\npassword_label=இந்த PDF கோப்பை திறக்க கடவுச்சொல்லை உள்ளிடவும்.\npassword_invalid=செல்லுபடியாகாத கடவுச்சொல், தயை செய்து மீண்டும் முயற்சி செய்க.\npassword_ok=சரி\npassword_cancel=இரத்து\n\nprinting_not_supported=எச்சரிக்கை: இந்த உலாவி அச்சிடுதலை முழுமையாக ஆதரிக்கவில்லை.\nprinting_not_ready=எச்சரிக்கை: PDF அச்சிட முழுவதுமாக ஏற்றப்படவில்லை.\nweb_fonts_disabled=வலை எழுத்துருக்கள் முடக்கப்பட்டுள்ளன: உட்பொதிக்கப்பட்ட PDF எழுத்துருக்களைப் பயன்படுத்த முடியவில்லை.\ndocument_colors_disabled=PDF ஆவணங்களுக்கு அவற்றின் சொந்த நிறங்களைப் பயன்படுத்த அனுமதியில்லை: உலாவியில் 'பக்கங்கள் தங்கள் சொந்த நிறங்களைத் தேர்வு செய்துகொள்ள அனுமதி' என்னும் விருப்பம் முடக்கப்பட்டுள்ளது.\n"
  },
  {
    "path": "web/viewer/locale/ta-LK/viewer.properties",
    "content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n# Main toolbar buttons (tooltips and alt text for images)\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\n\nzoom.title=அளவு\nopen_file.title=கோப்பினைத் திறக்க\nopen_file_label=திறக்க\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\n\n# Context menu\n\n# Find panel button title and messages\nfind_previous.title=இந்த சொற்றொடரின் முன்னைய நிகழ்வை தேடு\nfind_next.title=இந்த சொற்றொடரின் அடுத்த நிகழ்வைத் தேடு\n\n# Error panel labels\nerror_close=மூடுக\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\n\n# Predefined zoom values\n\n# Loading indicator messages\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\n\n"
  },
  {
    "path": "web/viewer/locale/te/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=క్రితం పేజీ\nprevious_label=క్రితం\nnext.title=తరువాత పేజీ\nnext_label=తరువాత\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=పేజీ:\npage_of=మొత్తం {{pageCount}} లో\n\nzoom_out.title=జూమ్ తగ్గించు\nzoom_out_label=జూమ్ తగ్గించు\nzoom_in.title=జూమ్ చేయి\nzoom_in_label=జూమ్ చేయి\nzoom.title=జూమ్\npresentation_mode.title=ప్రదర్శనా రీతికి మారు\npresentation_mode_label=ప్రదర్శనా రీతి\nopen_file.title=ఫైల్ తెరువు\nopen_file_label=తెరువు\nprint.title=ముద్రించు\nprint_label=ముద్రించు\ndownload.title=డౌనులోడు\ndownload_label=డౌనులోడు\nbookmark.title=ప్రస్తుత దర్శనం (నకలుతీయి లేదా కొత్త విండోనందు తెరువుము)\nbookmark_label=ప్రస్తుత దర్శనం\n\n# Secondary toolbar and context menu\ntools.title=పనిముట్లు\ntools_label=పనిముట్లు\nfirst_page.title=మొదటి పేజీకి వెళ్ళు\nfirst_page.label=మొదటి పేజీకి వెళ్ళు\nfirst_page_label=మొదటి పేజీకి వెళ్ళు\nlast_page.title=చివరి పేజీకి వెళ్ళు\nlast_page.label=చివరి పేజీకి వెళ్ళు\nlast_page_label=చివరి పేజీకి వెళ్ళు\npage_rotate_cw.title=సవ్యదిశలో తిప్పుము\npage_rotate_cw.label=సవ్యదిశలో తిప్పుము\npage_rotate_cw_label=సవ్యదిశలో తిప్పుము\npage_rotate_ccw.title=అపసవ్యదిశలో తిప్పుము\npage_rotate_ccw.label=అపసవ్యదిశలో తిప్పుము\npage_rotate_ccw_label=అపసవ్యదిశలో తిప్పుము\n\n\n# Document properties dialog box\ndocument_properties_title=శీర్షిక:\ndocument_properties_subject=విషయం:\ndocument_properties_keywords=కీపదాలు:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_page_count=పేజీల సంఖ్య:\ndocument_properties_close=మూసివేయి\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=పక్కపట్టీ మార్చు\ntoggle_sidebar_label=పక్కపట్టీ మార్చు\noutline.title=పత్రము అవుట్‌లైన్ చూపు\noutline_label=పత్రము అవుట్‌లైన్\nthumbs.title=థంబ్‌నైల్స్ చూపు\nthumbs_label=థంబ్‌నైల్స్\nfindbar.title=ఈ పత్రమునందు కనుగొనుము\nfindbar_label=కనుగొను\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=పేజీ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=పేజీ {{page}} యొక్క థంబ్‌నైల్\n\n# Find panel button title and messages\nfind_label=కనుగొను:\nfind_previous.title=పదంయొక్క ముందలి  సంభవాన్ని  కనుగొను\nfind_previous_label=మునుపటి\nfind_next.title=పదం యొక్క తర్వాతి  సంభవాన్ని  కనుగొను\nfind_next_label=తరువాత\nfind_highlight=అన్నిటిని  ఉద్దీపనం చేయుము\nfind_match_case_label=అక్షరములతేడాతో పోల్చుము\nfind_reached_top=పేజీ పైకి చేరుకున్నది, క్రింది నుండి కొనసాగించండి\nfind_reached_bottom=పేజీ చివరకు చేరుకున్నది, పైనుండి కొనసాగించండి\nfind_not_found=పదం కనబడలేదు\n\n# Error panel labels\nerror_more_info=మరింత సమాచారం\nerror_less_info=తక్కువ సమాచారం\nerror_close=మూసివేయి\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=సందేశం: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=స్టాక్: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ఫైలు: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=వరుస: {{line}}\nrendering_error=పేజీను రెండర్ చేయుటలో వొక దోషం యెదురైంది.\n\n# Predefined zoom values\npage_scale_width=పేజీ వెడల్పు\npage_scale_fit=పేజీ అమర్పు\npage_scale_auto=స్వయంచాలక జూమ్\npage_scale_actual=యథార్ధ పరిమాణం\n\n# Loading indicator messages\nloading_error_indicator=దోషం\nloading_error=PDF లోడవుచున్నప్పుడు వొక దోషం యెదురైంది.\ninvalid_file_error=చెల్లని లేదా పాడైన PDF ఫైలు.\nmissing_file_error=దొరకని PDF ఫైలు.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} టీకా]\npassword_label=ఈ PDF ఫైల్ తెరుచుటకు సంకేతపదం ప్రవేశపెట్టుము\npassword_invalid=సంకేతపదం చెల్లదు. దయచేసి మళ్ళీ ప్రయత్నించండి.\npassword_ok=సరే\npassword_cancel=రద్దుచేయి\n\nprinting_not_supported=హెచ్చరిక: ఈ విహారిణి చేత ముద్రణ పూర్తిగా తోడ్పాటునీయబడుట లేదు\nprinting_not_ready=హెచ్చరిక: ముద్రణ కొరకు ఈ PDF పూర్తిగా లోడవలేదు.\nweb_fonts_disabled=వెబ్ ఫాంట్లు అచేతనపరచ బడెను: ఎంబెడెడ్ PDF ఫాంట్లు వుపయోగించలేక పోయింది.\ndocument_colors_disabled=PDF పత్రాలు వాటి స్వంత రంగులను వుపయోగించుకొనుటకు అనుమతించబడవు: విహరణి నందు 'పేజీలను వాటి స్వంత రంగులను యెంచుకొనుటకు అనుమతించు' అనునది అచేతనం చేయబడివుంది.\n"
  },
  {
    "path": "web/viewer/locale/th/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=หน้าก่อนหน้า\nprevious_label=ก่อนหน้า\nnext.title=หน้าถัดไป\nnext_label=ถัดไป\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=หน้า:\npage_of=จาก {{pageCount}}\n\nzoom_out.title=ย่อ\nzoom_out_label=ย่อ Out\nzoom_in.title=ขยาย\nzoom_in_label=ขยาย\nzoom.title=ย่อ-ขยาย\npresentation_mode.title=สลับเข้าสู่รูปแบบการนำเสนอ\npresentation_mode_label=รูปแบบการนำเสนอ\nopen_file.title=เปิดแฟ้ม\nopen_file_label=เปิด\nprint.title=พิมพ์\nprint_label=พิมพ์\ndownload.title=ดาวน์โหลด\ndownload_label=ดาวน์โหลด\nbookmark.title=มุมมองปัจจุบัน (คัดลอกหรือเปิดในหน้าต่างใหม่)\nbookmark_label=มุมมองปัจจุบัน\n\n# Secondary toolbar and context menu\ntools.title=เครื่องมือ\ntools_label=เครื่องมือ\nfirst_page.title=ไปยังหน้าแรก\nfirst_page.label=ไปยังหน้าแรก\nfirst_page_label=ไปยังหน้าแรก\nlast_page.title=ไปยังหน้าสุดท้าย\nlast_page.label=ไปยังหน้าสุดท้าย\nlast_page_label=ไปยังหน้าสุดท้าย\npage_rotate_cw.title=หมุนตามเข็มนาฬิกา\npage_rotate_cw.label=หมุนตามเข็มนาฬิกา\npage_rotate_cw_label=หมุนตามเข็มนาฬิกา\npage_rotate_ccw.title=หมุนทวนเข็มนาฬิกา\npage_rotate_ccw.label=หมุนทวนเข็มนาฬิกา\npage_rotate_ccw_label=หมุนทวนเข็มนาฬิกา\n\nhand_tool_enable.title=เปิดใช้งานเครื่องมือรูปมือ\nhand_tool_enable_label=เปิดใช้งานเครื่องมือรูปมือ\nhand_tool_disable.title=ปิดใช้งานเครื่องมือรูปมือ\nhand_tool_disable_label=ปิดใช้งานเครื่องมือรูปมือ\n\n# Document properties dialog box\ndocument_properties.title=คุณสมบัติเอกสาร…\ndocument_properties_label=คุณสมบัติเอกสาร…\ndocument_properties_file_name=ชื่อแฟ้ม :\ndocument_properties_file_size=ขนาดแฟ้ม :\ndocument_properties_kb={{size_kb}} กิโลไบต์ ({{size_b}} ไบต์)\ndocument_properties_mb={{size_mb}} เมกะไบต์ ({{size_b}} ไบต์)\ndocument_properties_title=หัวเรื่อง :\ndocument_properties_author=ผู้แต่ง :\ndocument_properties_subject=หัวข้อ :\ndocument_properties_keywords=คำสำคัญ :\ndocument_properties_creation_date=วันที่สร้าง :\ndocument_properties_modification_date=วันที่แก้ไข :\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=สร้างโดย :\ndocument_properties_producer=ผู้ผลิต PDF :\ndocument_properties_version=รุ่น PDF :\ndocument_properties_page_count=จำนวนหน้า :\ndocument_properties_close=ปิด\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=สลับแถบข้าง\ntoggle_sidebar_label=สลับแถบข้าง\noutline.title=แสดงโครงเอกสาร\noutline_label=โครงเอกสาร\nattachments.title=แสดงสิ่งที่แนบมา\nattachments_label=สิ่งที่แนบมา\nthumbs.title=แสดงภาพขนาดย่อ\nthumbs_label=ภาพขนาดย่อ\nfindbar.title=ค้นหาในเอกสาร\nfindbar_label=ค้นหา\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=หน้า {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=ภาพขนาดย่อของหน้า {{page}}\n\n# Find panel button title and messages\nfind_label=ค้นหา:\nfind_previous.title=หาตำแหน่งก่อนหน้าของคำค้น\nfind_previous_label=ก่อนหน้า\nfind_next.title=หาตำแหน่งถัดไปของคำค้น\nfind_next_label=ถัดไป\nfind_highlight=เน้นสีทั้งหมด\nfind_match_case_label=ตัวพิมพ์ตรงกัน\nfind_reached_top=ค้นหาถึงจุดเริ่มต้นของหน้า เริ่มค้นต่อจากด้านล่าง\nfind_reached_bottom=ค้นหาถึงจุดสิ้นสุดหน้า เริ่มค้นต่อจากด้านบน\nfind_not_found=ไม่พบวลีที่ต้องการ\n\n# Error panel labels\nerror_more_info=ข้อมูลเพิ่มเติม\nerror_less_info=ข้อมูลน้อย\nerror_close=ปิด\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=ข้อความ: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=สแต็ก: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=แฟ้ม: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=บรรทัด: {{line}}\nrendering_error=เกิดข้อผิดพลาดขณะกำลังคำนวณการแสดงผลของหน้า\n\n# Predefined zoom values\npage_scale_width=ความกว้างหน้า\npage_scale_fit=พอดีหน้า\npage_scale_auto=ย่อ-ขยายอัตโนมัติ\npage_scale_actual=ขนาดเท่าจริง\n\n# Loading indicator messages\nloading_error_indicator=ข้อผิดพลาด\nloading_error=เกิดข้อผิดพลาดขณะกำลังโหลด PDF\ninvalid_file_error=แฟ้ม PDF ไม่ถูกต้องหรือไม่สมบูรณ์\nmissing_file_error=แฟ้ม PDF หาย\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[คำอธิบายประกอบ {{type}}]\npassword_label=ใส่รหัสผ่านเพื่อเปิดไฟล์ PDF นี้\npassword_invalid=รหัสผ่านไม่ถูกต้อง โปรดลองอีกครั้ง\npassword_ok=ตกลง\npassword_cancel=ยกเลิก\n\nprinting_not_supported=คำเตือน: เบราเซอร์นี้ไม่ได้สนับสนุนการพิมพ์อย่างเต็มที่\nprinting_not_ready=คำเตือน: PDF ไม่ได้รับการโหลดอย่างเต็มที่สำหรับการพิมพ์\nweb_fonts_disabled=แบบอักษรเว็บถูกปิดการใช้งาน: ไม่สามารถใช้แบบอักษรฝังตัวใน PDF\ndocument_colors_disabled=เอกสาร PDF ไม่ได้รับอนุญาตให้ใช้สีของตัวเอง: 'อนุญาตให้หน้าเอกสารสามารถเลือกสีของตัวเอง' ถูกปิดใช้งานในเบราเซอร์\n"
  },
  {
    "path": "web/viewer/locale/tl/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Naunang Pahina\nnext.title=Sunod na Pahina\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Pahina:\npage_of=ng {{bilangngPahina}}\n\nopen_file.title=Magbukas ng file\nopen_file_label=Buksan\nbookmark.title=Kasalukuyang tingin (kopyahin o buksan sa bagong window)\nbookmark_label=Kasalukuyang tingin\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\ndocument_properties_title=Pamagat:\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\noutline.title=Ipakita ang banghay ng dokumento\noutline_label=Banghay ng dokumento\nthumbs.title=Ipakita ang mga Thumbnails\nfindbar_label=Hanapin\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pahina {{pahina}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Thumbnail ng Pahina {{pahina}}\n\n# Find panel button title and messages\n\n# Error panel labels\nerror_more_info=Maraming Inpormasyon\nerror_less_info=Maikling Inpormasyon\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensahe: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linya: { { linya } }\nrendering_error=May naganap na pagkakamali habang pagsasalin sa pahina.\n\n# Predefined zoom values\npage_scale_width=Haba ng Pahina\npage_scale_fit=ang pahina ay angkop\npage_scale_auto=awtomatikong pag-imbulog\n\n# Loading indicator messages\nloading_error=May maling nangyari habang kinakarga ang PDF.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\npassword_ok=OK\n\n"
  },
  {
    "path": "web/viewer/locale/tn/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Tsebe:\n\nzoom.title=Zuma/gogela\nopen_file.title=Bula Faele\nopen_file_label=Bula\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\ndocument_properties_file_name=Leina la faele:\ndocument_properties_title=Leina:\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\nfindbar_label=Batla\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\n\n# Find panel button title and messages\nfind_previous.title=Batla tiragalo e e fetileng ya setlhopha sa mafoko\nfind_next.title=Batla tiragalo e e latelang ya setlhopha sa mafoko\nfind_not_found=Setlhopha sa mafoko ga se a bonwa\n\n# Error panel labels\nerror_more_info=Tshedimosetso e Nngwe\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\n\n# Predefined zoom values\n\n# Loading indicator messages\nloading_error_indicator=Phoso\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\npassword_ok=Siame\npassword_cancel=Khansela\n\n"
  },
  {
    "path": "web/viewer/locale/tr/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Önceki sayfa\nprevious_label=Önceki\nnext.title=Sonraki sayfa\nnext_label=Sonraki\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Sayfa:\npage_of=/ {{pageCount}}\n\nzoom_out.title=Uzaklaș\nzoom_out_label=Uzaklaș\nzoom_in.title=Yaklaş\nzoom_in_label=Yaklaş\nzoom.title=Yakınlaştırma\npresentation_mode.title=Sunum moduna geç\npresentation_mode_label=Sunum Modu\nopen_file.title=Dosya aç\nopen_file_label=Aç\nprint.title=Yazdır\nprint_label=Yazdır\ndownload.title=İndir\ndownload_label=İndir\nbookmark.title=Geçerli görünüm (kopyala veya yeni pencerede aç)\nbookmark_label=Geçerli görünüm\n\n# Secondary toolbar and context menu\ntools.title=Araçlar\ntools_label=Araçlar\nfirst_page.title=İlk sayfaya git\nfirst_page.label=İlk sayfaya git\nfirst_page_label=İlk sayfaya git\nlast_page.title=Son sayfaya git\nlast_page.label=Son sayfaya git\nlast_page_label=Son sayfaya git\npage_rotate_cw.title=Saat yönünde döndür\npage_rotate_cw.label=Saat yönünde döndür\npage_rotate_cw_label=Saat yönünde döndür\npage_rotate_ccw.title=Saat yönünün tersine döndür\npage_rotate_ccw.label=Saat yönünün tersine döndür\npage_rotate_ccw_label=Saat yönünün tersine döndür\n\nhand_tool_enable.title=El aracını etkinleştir\nhand_tool_enable_label=El aracını etkinleştir\nhand_tool_disable.title=El aracını kapat\nhand_tool_disable_label=El aracını kapat\n\n# Document properties dialog box\ndocument_properties.title=Belge özellikleri…\ndocument_properties_label=Belge özellikleri…\ndocument_properties_file_name=Dosya adı:\ndocument_properties_file_size=Dosya boyutu:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bayt)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bayt)\ndocument_properties_title=Başlık:\ndocument_properties_author=Yazar:\ndocument_properties_subject=Konu:\ndocument_properties_keywords=Anahtar kelimeler:\ndocument_properties_creation_date=Oluturma tarihi:\ndocument_properties_modification_date=Değiştirme tarihi:\ndocument_properties_date_string={{date}} {{time}}\ndocument_properties_creator=Oluşturan:\ndocument_properties_producer=PDF üreticisi:\ndocument_properties_version=PDF sürümü:\ndocument_properties_page_count=Sayfa sayısı:\ndocument_properties_close=Kapat\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Kenar çubuğunu aç/kapat\ntoggle_sidebar_label=Kenar çubuğunu aç/kapat\noutline.title=Belge şemasını göster\noutline_label=Belge şeması\nattachments.title=Ekleri göster\nattachments_label=Ekler\nthumbs.title=Küçük resimleri göster\nthumbs_label=Küçük resimler\nfindbar.title=Belgede bul\nfindbar_label=Bul\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Sayfa {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}}. sayfanın küçük hâli\n\n# Find panel button title and messages\nfind_label=Bul:\nfind_previous.title=Önceki eşleşmeyi bul\nfind_previous_label=Önceki\nfind_next.title=Sonraki eşleşmeyi bul\nfind_next_label=Sonraki\nfind_highlight=Tümünü vurgula\nfind_match_case_label=Büyük-küçük harf eşleştir\nfind_reached_top=Belgenin başına ulaşıldı, sonundan devam edildi\nfind_reached_bottom=Belgenin sonuna ulaşıldı, başından devam edildi\nfind_not_found=Eşleşme bulunamadı\n\n# Error panel labels\nerror_more_info=Daha fazla bilgi\nerror_less_info=Daha az bilgi\nerror_close=Kapat\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js sürüm {{version}} (yapı: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=İleti: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Yığın: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Dosya: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Satır: {{line}}\nrendering_error=Sayfa yorumlanırken bir hata oluştu.\n\n# Predefined zoom values\npage_scale_width=Sayfa genişliği\npage_scale_fit=Sayfayı sığdır\npage_scale_auto=Otomatik yakınlaştır\npage_scale_actual=Gerçek boyut\n\n# Loading indicator messages\nloading_error_indicator=Hata\nloading_error=PDF yüklenirken bir hata oluştu.\ninvalid_file_error=Geçersiz veya bozulmuş PDF dosyası.\nmissing_file_error=PDF dosyası eksik.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} işareti]\npassword_label=Bu PDF dosyasını açmak için parolasını girin.\npassword_invalid=Geçersiz parola. Lütfen tekrar deneyin.\npassword_ok=Tamam\npassword_cancel=İptal\n\nprinting_not_supported=Uyarı: Yazdırma bu tarayıcı tarafından tam olarak desteklenmemektedir.\nprinting_not_ready=Uyarı: PDF tamamen yüklenmedi ve yazdırmaya hazır değil.\nweb_fonts_disabled=Web fontları devre dışı: Gömülü PDF fontları kullanılamıyor.\ndocument_colors_disabled=PDF belgelerinin kendi renklerini kullanması için izin verilmiyor: 'Sayfalara kendi renklerini seçmesi için izin ver' tarayıcıda etkinleştirilmemiş.\n"
  },
  {
    "path": "web/viewer/locale/uk/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Попередня сторінка\nprevious_label=Попередня\nnext.title=Наступна сторінка\nnext_label=Наступна\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Сторінка:\npage_of=з {{pageCount}}\n\nzoom_out.title=Зменшити\nzoom_out_label=Зменшити\nzoom_in.title=Збільшити\nzoom_in_label=Збільшити\nzoom.title=Масштаб\npresentation_mode.title=Перейти в режим презентації\npresentation_mode_label=Режим презентації\nopen_file.title=Відкрити файл\nopen_file_label=Відкрити\nprint.title=Друк\nprint_label=Друк\ndownload.title=Завантажити\ndownload_label=Завантажити\nbookmark.title=Поточний вигляд (копіювати чи відкрити у новому вікні)\nbookmark_label=Поточний вигляд\n\n# Secondary toolbar and context menu\ntools.title=Tools\ntools_label=Tools\nfirst_page.title=Йти на першу сторінку\nfirst_page.label=Йти на першу сторінку\nfirst_page_label=Йти на першу сторінку\nlast_page.title=Йти на останню сторінку\nlast_page.label=Йти на останню сторінку\nlast_page_label=Йти на останню сторінку\npage_rotate_cw.title=Обернути за годинниковою стрілкою\npage_rotate_cw.label=Обернути за годинниковою стрілкою\npage_rotate_cw_label=Обернути за годинниковою стрілкою\npage_rotate_ccw.title=Обернути проти годинникової стрілки\npage_rotate_ccw.label=Обернути проти годинникової стрілки\npage_rotate_ccw_label=Обернути проти годинникової стрілки\n\nhand_tool_enable.title=Увімкнути інструмент «Рука»\nhand_tool_enable_label=Увімкнути інструмент «Рука»\nhand_tool_disable.title=Вимкнути інструмент «Рука»\nhand_tool_disable_label=Вимкнути інструмент «Рука»\n\n# Document properties dialog box\ndocument_properties.title=Властивості документа…\ndocument_properties_label=Властивості документа…\ndocument_properties_file_name=Назва файла:\ndocument_properties_file_size=Розмір файла:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Заголовок:\ndocument_properties_author=Автор:\ndocument_properties_subject=Тема:\ndocument_properties_keywords=Ключові слова:\ndocument_properties_creation_date=Дата створення:\ndocument_properties_modification_date=Дата модифікації:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Створено:\ndocument_properties_producer=Виробник PDF:\ndocument_properties_version=Версія PDF:\ndocument_properties_page_count=Кількість сторінок:\ndocument_properties_close=Закрити\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Перемкнути бічну панель\ntoggle_sidebar_label=Перемкнути бічну панель\noutline.title=Показувати схему документа\noutline_label=Схема документа\nattachments.title=Show Attachments\nattachments_label=Attachments\nthumbs.title=Показувати ескізи\nthumbs_label=Ескізи\nfindbar.title=Шукати в документі\nfindbar_label=Пошук\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Сторінка {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Ескіз сторінки {{page}}\n\n# Find panel button title and messages\nfind_label=Знайти:\nfind_previous.title=Знайти попереднє входження фрази\nfind_previous_label=Попереднє\nfind_next.title=Знайти наступне входження фрази\nfind_next_label=Наступне\nfind_highlight=Підсвітити все\nfind_match_case_label=З урахуванням регістру\nfind_reached_top=Досягнуто початку документу, продовжено з кінця\nfind_reached_bottom=Досягнуто кінця документу, продовжено з початку\nfind_not_found=Фразу не знайдено\n\n# Error panel labels\nerror_more_info=Більше інформації\nerror_less_info=Менше інформації\nerror_close=Закрити\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Повідомлення: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Стек: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Файл: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Рядок: {{line}}\nrendering_error=Під час рендеру сторінки сталась помилка.\n\n# Predefined zoom values\npage_scale_width=За шириною\npage_scale_fit=Умістити\npage_scale_auto=Авто-масштаб\npage_scale_actual=Дійсний розмір\n\n# Loading indicator messages\nloading_error_indicator=Помилка\nloading_error=Під час завантаження PDF сталась помилка.\ninvalid_file_error=Недійсний або пошкоджений PDF-файл.\nmissing_file_error=Відсутній PDF-файл.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}}-аннотація]\npassword_label=Введіть пароль для відкриття цього PDF-файла.\npassword_invalid=Невірний пароль. Спробуйте ще.\npassword_ok=Гаразд\npassword_cancel=Скасувати\n\nprinting_not_supported=Попередження: Цей браузер не повністю підтримує друк.\nprinting_not_ready=Попередження: The PDF це повністю завантажений для друку.\nweb_fonts_disabled=Веб-шрифти вимкнено: неможливо використати вбудовані у PDF шрифти.\ndocument_colors_disabled=PDF-документам не дозволено використовувати свої власні кольори: в браузері вимкнено «Дозволити сторінкам використовувати свої власні кольори».\n"
  },
  {
    "path": "web/viewer/locale/ur/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=پچھلا صفحہ\nprevious_label=پچھلا\nnext.title=اگلا صفحہ\nnext_label=آگے\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=صفحہ:\npage_of={{pageCount}} کا\n\nzoom_out.title=باہر زوم کریں\nzoom_out_label=باہر زوم کریں\nzoom_in.title=اندر زوم کریں\nzoom_in_label=اندر زوم کریں\nzoom.title=زوم\npresentation_mode.title=پیشکش موڈ میں چلے جائیں\npresentation_mode_label=پیشکش موڈ\nopen_file.title=مسل کھولیں\nopen_file_label=کھولیں\nprint.title=چھاپیں\nprint_label=چھاپیں\ndownload.title=ڈاؤن لوڈ\ndownload_label=ڈاؤن لوڈ\nbookmark.title=حالیہ نظارہ (نۓ دریچہ میں نقل کریں یا کھولیں)\nbookmark_label=حالیہ نظارہ\n\n# Secondary toolbar and context menu\ntools.title=آلات\ntools_label=آلات\nfirst_page.title=پہلے صفحہ پر جائیں\nfirst_page.label=پہلے صفحہ پر جائیں\nfirst_page_label=پہلے صفحہ پر جائیں\nlast_page.title=آخری صفحہ پر جائیں\nlast_page.label=آخری صفحہ پر جائیں\nlast_page_label=آخری صفحہ پر جائیں\npage_rotate_cw.title=گھڑی وار گھمائیں\npage_rotate_cw.label=گھڑی وار گھمائیں\npage_rotate_cw_label=گھڑی وار گھمائیں\npage_rotate_ccw.title=ضد گھڑی وار گھمائیں\npage_rotate_ccw.label=ضد گھڑی وار گھمائیں\npage_rotate_ccw_label=ضد گھڑی وار گھمائیں\n\nhand_tool_enable.title=ہاتھ ٹول اہل بنائیں\nhand_tool_enable_label=ہاتھ ٹول اہل بنائیں\nhand_tool_disable.title=ہاتھ ٹول nنااہل بنائیں \nhand_tool_disable_label=ہاتھ ٹول نااہل بنائیں\n\n# Document properties dialog box\ndocument_properties.title=دستاویز خواص…\ndocument_properties_label=دستاویز خواص… \ndocument_properties_file_name=نام مسل:\ndocument_properties_file_size=مسل سائز:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=عنوان:\ndocument_properties_author=تخلیق کار:\ndocument_properties_subject=موضوع:\ndocument_properties_keywords=کلیدی الفاظ:\ndocument_properties_creation_date=تخلیق کی تاریخ:\ndocument_properties_modification_date=ترمیم کی تاریخ:\ndocument_properties_date_string={{date}}، {{time}}\ndocument_properties_creator=تخلیق کار:\ndocument_properties_producer=PDF پیدا کار:\ndocument_properties_version=PDF ورژن:\ndocument_properties_page_count=صفحہ شمار:\ndocument_properties_close=بند کریں\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=سلائیڈ ٹوگل کریں\ntoggle_sidebar_label=سلائیڈ ٹوگل کریں\noutline.title=دستاویز آؤٹ لائن دکھائیں\noutline_label=دستاویز آؤٹ لائن\nthumbs.title=تھمبنیل دکھائیں\nthumbs_label=مجمل\nfindbar.title=دستاویز میں ڈھونڈیں\nfindbar_label=ڈھونڈیں\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=صفحہ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=صفحے کا مجمل {{page}}\n\n# Find panel button title and messages\nfind_label=ڈھونڈیں:\nfind_previous.title=فقرے کا پچھلا وقوع ڈھونڈیں\nfind_previous_label=پچھلا\nfind_next.title=فقرے کا اگلہ وقوع ڈھونڈیں\nfind_next_label=آگے\nfind_highlight=تمام نمایاں کریں\nfind_match_case_label=حروف مشابہ کریں\nfind_reached_top=صفحہ کے شروع پر پہنچ گیا، نیچے سے جاری کیا\nfind_reached_bottom=صفحہ کے اختتام پر پہنچ گیا، اوپر سے جاری کیا\nfind_not_found=فقرا نہیں ملا\n\n# Error panel labels\nerror_more_info=مزید معلومات\nerror_less_info=کم معلومات\nerror_close=بند کریں\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=پیغام: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=سٹیک: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=مسل: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=لائن: {{line}}\nrendering_error=صفحہ بناتے ہوئے نقص آ گیا۔\n\n# Predefined zoom values\npage_scale_width=صفحہ چوڑائی\npage_scale_fit=صفحہ فٹنگ\npage_scale_auto=خودکار زوم\npage_scale_actual=اصل سائز\n\n# Loading indicator messages\nloading_error_indicator=نقص\nloading_error=PDF لوڈ کرتے وقت نقص آ گیا۔\ninvalid_file_error=ناجائز یا خراب PDF مسل\nmissing_file_error=PDF مسل غائب ہے۔\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} نوٹ]\npassword_label=PDF مسل کھولنے کے لیے پاس ورڈ داخل کریں.\npassword_invalid=ناجائز پاس ورڈ. براےؑ کرم دوبارہ کوشش کریں.\npassword_ok=سہی\npassword_cancel=منسوخ کریں\n\nprinting_not_supported=تنبیہ:چھاپنا اس براؤزر پر پوری طرح معاونت شدہ نہیں ہے۔\nprinting_not_ready=تنبیہ: PDF چھپائی کے لیے پوری طرح لوڈ نہیں ہوئی۔\nweb_fonts_disabled=ویب فانٹ نا اہل ہیں: شامل PDF فانٹ استعمال کرنے میں ناکام۔\ndocument_colors_disabled=PDF دستاویزات کو اپنے رنگ استعمال کرنے کی اجازت نہیں: 'صفحات کو اپنے رنگ چنیں' کی اِجازت براؤزر میں بے عمل ہے۔\n"
  },
  {
    "path": "web/viewer/locale/vi/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Trang Trước\nprevious_label=Trước\nnext.title=Trang Sau\nnext_label=Tiếp\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Trang:\npage_of=thuộc về {{pageCount}}\n\nzoom_out.title=Thu nhỏ\nzoom_out_label=Thu nhỏ\nzoom_in.title=Phóng to\nzoom_in_label=Phóng to\nzoom.title=Thu phóng\npresentation_mode.title=Chuyển sang chế độ trình chiếu\npresentation_mode_label=Chế độ trình chiếu\nopen_file.title=Mở Tập Tin\nopen_file_label=Mở tập tin\nprint.title=In\nprint_label=In\ndownload.title=Tải xuống\ndownload_label=Tải xuống\nbookmark.title=Góc nhìn hiện tại (copy hoặc mở trong cửa sổ mới)\nbookmark_label=Chế độ xem hiện tại\n\n# Secondary toolbar and context menu\ntools.title=Công cụ\npage_rotate_cw.title=Xoay theo chiều kim đồng hồ\npage_rotate_cw.label=Xoay theo chiều kim đồng hồ\npage_rotate_cw_label=Xoay theo chiều kim đồng hồ\npage_rotate_ccw.title=Xoay ngược chiều kim đồng hồ\npage_rotate_ccw.label=Xoay ngược chiều kim đồng hồ\npage_rotate_ccw_label=Xoay ngược chiều kim đồng hồ\n\n\n# Document properties dialog box\ndocument_properties_file_size=Kích thước tập tin:\ndocument_properties_title=Tiêu đề:\ndocument_properties_author=Tác giả:\ndocument_properties_subject=Chủ đề:\ndocument_properties_keywords=Từ khóa:\ndocument_properties_creation_date=Ngày tạo:\ndocument_properties_modification_date=Ngày sửa đổi:\ndocument_properties_producer=Nhà sản xuất PDF:\ndocument_properties_version=Phiên bản PDF:\ndocument_properties_page_count=Tổng số trang:\ndocument_properties_close=Ðóng\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Bật/Tắt Thanh Lề\ntoggle_sidebar_label=Bật/Tắt Thanh Lề\noutline.title=Hiển thị bản phác tài liệu\noutline_label=Bản phác họa Tài liệu\nthumbs.title=Hiển thị Thumbnails\nthumbs_label=Thumbnails (hình biểu diễn nhỏ)\nfindbar.title=Tìm trong tài liệu\nfindbar_label=Tìm\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Trang {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Hình ảnh thu nhỏ của trang {{page}}\n\n# Find panel button title and messages\nfind_label=Tìm kiếm:\nfind_previous.title=Tìm cụm từ ở phần trước\nfind_previous_label=Trước\nfind_next.title=Tìm cụm từ ở phần sau\nfind_next_label=Tiếp\nfind_highlight=Tô sáng tất cả\nfind_match_case_label=Phân biệt chữ hoa, chữ thường\nfind_reached_top=Đã đến phần đầu tài liệu, quay trở lại từ cuối\nfind_reached_bottom=Đã đến phần cuối của tài liệu, quay trở lại từ đầu\nfind_not_found=Không tìm thấy cụm từ\n\n# Error panel labels\nerror_more_info=Thông tin thêm\nerror_less_info=Hiển thị ít thông tin hơn\nerror_close=Đóng\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Thông điệp: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Tệp: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Dòng: {{line}}\nrendering_error=Lỗi khi hiển thị trang.\n\n# Predefined zoom values\npage_scale_width=Chiều rộng trang\npage_scale_fit=Độ vừa của trang\npage_scale_auto=Tự động thu/phóng\npage_scale_actual=Kích thước thực\n\n# Loading indicator messages\nloading_error_indicator=Lỗi\nloading_error=Lỗi khi tải tài liệu PDF.\ninvalid_file_error=Tập tin PDF hỏng hoặc không hợp lệ.\nmissing_file_error=Thiếu tập tin PDF.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Chú thích]\npassword_label=Nhập mật khẩu để mở tập tin PDF này.\npassword_invalid=Mật khẩu không đúng. Vui lòng thử lại.\npassword_ok=OK\npassword_cancel=Hủy bỏ\n\nprinting_not_supported=Cảnh báo: In ấn không được hỗ trợ đầy đủ ở trình duyệt này.\nprinting_not_ready=Cảnh báo: PDF chưa được tải hết để in.\nweb_fonts_disabled=Phông chữ Web bị vô hiệu hóa: không thể sử dụng các phông chữ PDF được nhúng.\ndocument_colors_disabled=Tài liệu PDF không được cho phép dùng màu riêng: 'Cho phép trang chọn màu riêng' đã bị tắt trên trình duyệt.\n"
  },
  {
    "path": "web/viewer/locale/wo/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Xët wi jiitu\nprevious_label=Bi jiitu\nnext.title=Xët wi ci topp\nnext_label=Bi ci topp\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Xët:\npage_of=ci {{pageCount}}\n\nzoom_out.title=Wàññi\nzoom_out_label=Wàññi\nzoom_in.title=Yaatal\nzoom_in_label=Yaatal\nzoom.title=Yambalaŋ\npresentation_mode.title=Wañarñil ci anamu wone\npresentation_mode_label=Anamu Wone\nopen_file.title=Ubbi benn dencukaay\nopen_file_label=Ubbi\nprint.title=Móol\nprint_label=Móol\ndownload.title=Yeb yi\ndownload_label=Yeb yi\nbookmark.title=Wone bi taxaw (duppi walla ubbi palanteer bu bees)\nbookmark_label=Wone bi feeñ\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\ndocument_properties_title=Bopp:\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\noutline.title=Wone takku yi\noutline_label=Takku jukki yi\nthumbs.title=Wone nataal yu ndaw yi\nthumbs_label=Nataal yu ndaw yi\nfindbar.title=Gis ci biir jukki bi\nfindbar_label=Wut\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Xët {{xët}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Wiñet bu xët{{xët}}\n\n# Find panel button title and messages\nfind_label=Wut:\nfind_previous.title=Seet beneen kaddu bu ni mel te jiitu\nfind_previous_label=Bi jiitu\nfind_next.title=Seet beneen kaddu bu ni mel\nfind_next_label=Bi ci topp\nfind_highlight=Melaxal lépp\nfind_match_case_label=Sàmm jëmmalin wi\nfind_reached_top=Jot nañu ndorteel xët wi, kontine dale ko ci suuf\nfind_reached_bottom=Jot nañu jeexitalu xët wi, kontine ci ndorte\nfind_not_found=Gisiñu kaddu gi\n\n# Error panel labels\nerror_more_info=Xibaar yu gën bari\nerror_less_info=Xibaar yu gën bari\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Bataaxal: {{bataaxal}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Juug: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Dencukaay: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rëdd : {{line}}\nrendering_error=Am njumte bu am bi xët bi di wonewu.\n\n# Predefined zoom values\npage_scale_width=Yaatuwaay bu mët\npage_scale_fit=Xët lëmm\npage_scale_auto=Yambalaŋ ci saa si\npage_scale_actual=Dayo bi am\n\n# Loading indicator messages\nloading_error_indicator=Njumte\nloading_error=Am na njumte ci yebum dencukaay PDF bi.\ninvalid_file_error=Dencukaay PDF bi baaxul walla mu sankar.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Karmat {{type}}]\npassword_ok=OK\npassword_cancel=Neenal\n\nprinting_not_supported=Artu: Joowkat bii nanguwul lool mool.\n"
  },
  {
    "path": "web/viewer/locale/xh/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Iphepha langaphambili\nprevious_label=Okwangaphambili\nnext.title=Iphepha elilandelayo\nnext_label=Okulandelayo\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Iphepha:\npage_of=kwali- {{pageCount}}\n\nzoom_out.title=Bhekelisela Kudana\nzoom_out_label=Bhekelisela Kudana\nzoom_in.title=Sondeza Kufuphi\nzoom_in_label=Sondeza Kufuphi\nzoom.title=Yandisa / Nciphisa\npresentation_mode.title=Tshintshela kwimo yonikezelo\npresentation_mode_label=Imo yonikezelo\nopen_file.title=Vula Ifayile\nopen_file_label=Vula\nprint.title=Printa\nprint_label=Printa\ndownload.title=Khuphela\ndownload_label=Khuphela\nbookmark.title=Imbonakalo ekhoyo (kopa okanye vula kwifestile entsha)\nbookmark_label=Imbonakalo ekhoyo\n\n# Secondary toolbar and context menu\ntools.title=Izixhobo zemiyalelo\ntools_label=Izixhobo zemiyalelo\nfirst_page.title=Yiya kwiphepha lokuqala\nfirst_page.label=Yiya kwiphepha lokuqala\nfirst_page_label=Yiya kwiphepha lokuqala\nlast_page.title=Yiya kwiphepha lokugqibela\nlast_page.label=Yiya kwiphepha lokugqibela\nlast_page_label=Yiya kwiphepha lokugqibela\npage_rotate_cw.title=Jikelisa ngasekunene\npage_rotate_cw.label=Jikelisa ngasekunene\npage_rotate_cw_label=Jikelisa ngasekunene\npage_rotate_ccw.title=Jikelisa ngasekhohlo\npage_rotate_ccw.label=Jikelisa ngasekhohlo\npage_rotate_ccw_label=Jikelisa ngasekhohlo\n\nhand_tool_enable.title=Yenza isixhobo sesandla sisebenze\nhand_tool_enable_label=Yenza isixhobo sesandla sisebenze\nhand_tool_disable.title=Yenza isixhobo sesandla singasebenzi\nhand_tool_disable_label=Yenza isixhobo sesandla singasebenzi\n\n# Document properties dialog box\ndocument_properties.title=Iipropati zoxwebhu…\ndocument_properties_label=Iipropati zoxwebhu…\ndocument_properties_file_name=Igama lefayile:\ndocument_properties_file_size=Isayizi yefayile:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} iibhayiti)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} iibhayiti)\ndocument_properties_title=Umxholo:\ndocument_properties_author=Umbhali:\ndocument_properties_subject=Umbandela:\ndocument_properties_keywords=Amagama aphambili:\ndocument_properties_creation_date=Umhla wokwenziwa kwayo:\ndocument_properties_modification_date=Umhla wokulungiswa kwayo:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Umntu oyenzileyo:\ndocument_properties_producer=Umvelisi we-PDF:\ndocument_properties_version=Uhlelo lwe-PDF:\ndocument_properties_page_count=Inani lamaphepha:\ndocument_properties_close=Vala\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Togola ngebha eseCaleni\ntoggle_sidebar_label=Togola ngebha eseCaleni\noutline.title=Bonisa isishwankathelo soxwebhu\noutline_label=Isishwankathelo soxwebhu\nattachments.title=Bonisa iziqhotyoshelwa\nattachments_label=Iziqhoboshelo\nthumbs.title=Bonisa ukrobiso kumfanekiso\nthumbs_label=Ukrobiso kumfanekiso\nfindbar.title=Fumana kuXwebhu\nfindbar_label=Fumana\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Iphepha {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Ukrobiso kumfanekiso wephepha {{page}}\n\n# Find panel button title and messages\nfind_label=Fumanisa:\nfind_previous.title=Fumanisa isenzeko sangaphambili sebinzana lamagama\nfind_previous_label=Okwangaphambili\nfind_next.title=Fumanisa isenzeko esilandelayo sebinzana lamagama\nfind_next_label=Okulandelayo\nfind_highlight=Qaqambisa konke\nfind_match_case_label=Tshatisa ngobukhulu bukanobumba\nfind_reached_top=Ufike ngaphezulu ephepheni, kusukwa ngezantsi\nfind_reached_bottom=Ufike ekupheleni kwephepha, kusukwa ngaphezulu\nfind_not_found=Ibinzana alifunyenwanga\n\n# Error panel labels\nerror_more_info=Inkcazelo Engakumbi\nerror_less_info=Inkcazelo Encinane\nerror_close=Vala\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=I-PDF.js v{{uhlelo}} (yakha: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Umyalezo: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Imfumba: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Ifayile: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Umgca: {{line}}\nrendering_error=Imposiso yenzekile xa bekunikezelwa iphepha.\n\n# Predefined zoom values\npage_scale_width=Ububanzi bephepha\npage_scale_fit=Ukulinganiswa kwephepha\npage_scale_auto=Ukwandisa/Ukunciphisa Ngokwayo\npage_scale_actual=Ubungakanani bokwenene\n\n# Loading indicator messages\nloading_error_indicator=Imposiso\nloading_error=Imposiso yenzekile xa kulayishwa i-PDF.\ninvalid_file_error=Ifayile ye-PDF engeyiyo okanye eyonakalisiweyo.\nmissing_file_error=Ifayile ye-PDF edukileyo.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Ubhalo-nqaku]\npassword_label=Faka ipasiwedi ukuze uvule le fayile yePDF.\npassword_invalid=Ipasiwedi ayisebenzi. Nceda uzame kwakhona.\npassword_ok=KULUNGILE\npassword_cancel=Rhoxisa\n\nprinting_not_supported=Isilumkiso: Ukuprinta akuxhaswa ngokupheleleyo yile bhrawuza.\nprinting_not_ready=Isilumkiso: IPDF ayihlohlwanga ngokupheleleyo ukwenzela ukuprinta.\nweb_fonts_disabled=Iifonti zewebhu ziqhwalelisiwe: ayikwazi ukusebenzisa iifonti ze-PDF ezincanyathelisiweyo.\ndocument_colors_disabled=Amaxwebhu ePDF akavumelekanga ukuba asebenzise imibala yawo: 'Ukuvumela amaphepha ukuba asebenzise eyawo imibala' kuvaliwe ukuba kungasebenzi kwibhrawuza.\n"
  },
  {
    "path": "web/viewer/locale/zh-CN/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=上一页\nprevious_label=上一页\nnext.title=下一页\nnext_label=下一页\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=页面：\npage_of=/ {{pageCount}}\n\nzoom_out.title=缩小\nzoom_out_label=缩小\nzoom_in.title=放大\nzoom_in_label=放大\nzoom.title=缩放\npresentation_mode.title=切换到演示模式\npresentation_mode_label=演示模式\nopen_file.title=打开文件\nopen_file_label=打开\nprint.title=打印\nprint_label=打印\ndownload.title=下载\ndownload_label=下载\nbookmark.title=当前视图（复制或在新窗口中打开）\nbookmark_label=当前视图\n\n# Secondary toolbar and context menu\ntools.title=工具\ntools_label=工具\nfirst_page.title=转到第一页\nfirst_page.label=转到第一页\nfirst_page_label=转到第一页\nlast_page.title=转到最后一页\nlast_page.label=转到最后一页\nlast_page_label=转到最后一页\npage_rotate_cw.title=顺时针旋转\npage_rotate_cw.label=顺时针旋转\npage_rotate_cw_label=顺时针旋转\npage_rotate_ccw.title=逆时针旋转\npage_rotate_ccw.label=逆时针旋转\npage_rotate_ccw_label=逆时针旋转\n\nhand_tool_enable.title=启用手形工具\nhand_tool_enable_label=启用手形工具\nhand_tool_disable.title=禁用手形工具\nhand_tool_disable_label=禁用手形工具\n\n# Document properties dialog box\ndocument_properties.title=文档属性…\ndocument_properties_label=文档属性…\ndocument_properties_file_name=文件名:\ndocument_properties_file_size=文件大小:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} 字节)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} 字节)\ndocument_properties_title=标题:\ndocument_properties_author=作者:\ndocument_properties_subject=主题:\ndocument_properties_keywords=关键词:\ndocument_properties_creation_date=创建日期:\ndocument_properties_modification_date=修改日期:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=创建者:\ndocument_properties_producer=PDF 制作者:\ndocument_properties_version=PDF 版本:\ndocument_properties_page_count=页数:\ndocument_properties_close=关闭\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=切换侧栏\ntoggle_sidebar_label=切换侧栏\noutline.title=显示文档大纲\noutline_label=文档大纲\nattachments.title=显示附件\nattachments_label=附件\nthumbs.title=显示缩略图\nthumbs_label=缩略图\nfindbar.title=在文档中查找\nfindbar_label=查找\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=页码 {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=页面 {{page}} 的缩略图\n\n# Find panel button title and messages\nfind_label=查找：\nfind_previous.title=查找词语上一次出现的位置\nfind_previous_label=上一页\nfind_next.title=查找词语后一次出现的位置\nfind_next_label=下一页\nfind_highlight=全部高亮显示\nfind_match_case_label=区分大小写\nfind_reached_top=到达文档开头，从末尾继续\nfind_reached_bottom=到达文档末尾，从开头继续\nfind_not_found=词语未找到\n\n# Error panel labels\nerror_more_info=更多信息\nerror_less_info=更少信息\nerror_close=关闭\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=信息：{{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=堆栈：{{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=文件：{{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=行号：{{line}}\nrendering_error=渲染页面时发生错误。\n\n# Predefined zoom values\npage_scale_width=适合页宽\npage_scale_fit=适合页面\npage_scale_auto=自动缩放\npage_scale_actual=实际大小\n\n# Loading indicator messages\nloading_error_indicator=错误\nloading_error=载入PDF时发生错误。\ninvalid_file_error=无效或损坏的PDF文件。\nmissing_file_error=缺少PDF文件。\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} 注解]\npassword_label=输入密码以打开此 PDF 文件。\npassword_invalid=密码无效。请重试。\npassword_ok=确定\npassword_cancel=取消\n\nprinting_not_supported=警告：打印功能不完全支持此浏览器。\nprinting_not_ready=警告：该 PDF 未完全加载以供打印。\nweb_fonts_disabled=Web 字体已被禁用：无法使用嵌入的PDF字体。\ndocument_colors_disabled=不允许 PDF 文档使用自己的颜色：浏览器中“允许页面选择自己的颜色”的选项已停用。\n"
  },
  {
    "path": "web/viewer/locale/zh-TW/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=上一頁\nprevious_label=上一頁\nnext.title=下一頁\nnext_label=下一頁\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=頁:\npage_of=/ {{pageCount}}\n\nzoom_out.title=縮小\nzoom_out_label=縮小\nzoom_in.title=放大\nzoom_in_label=放大\nzoom.title=縮放\npresentation_mode.title=切換至簡報模式\npresentation_mode_label=簡報模式\nopen_file.title=開啟檔案\nopen_file_label=開啟\nprint.title=列印\nprint_label=列印\ndownload.title=下載\ndownload_label=下載\nbookmark.title=目前檢視的內容（複製或開啟於新視窗）\nbookmark_label=目前檢視\n\n# Secondary toolbar and context menu\ntools.title=工具\ntools_label=工具\nfirst_page.title=跳到第一頁\nfirst_page.label=跳到第一頁\nfirst_page_label=跳到第一頁\nlast_page.title=跳到最後一頁\nlast_page.label=跳到最後一頁\nlast_page_label=跳到最後一頁\npage_rotate_cw.title=順時針旋轉\npage_rotate_cw.label=順時針旋轉\npage_rotate_cw_label=順時針旋轉\npage_rotate_ccw.title=逆時針旋轉\npage_rotate_ccw.label=逆時針旋轉\npage_rotate_ccw_label=逆時針旋轉\n\nhand_tool_enable.title=啟用掌型工具\nhand_tool_enable_label=啟用掌型工具\nhand_tool_disable.title=停用掌型工具\nhand_tool_disable_label=停用掌型工具\n\n# Document properties dialog box\ndocument_properties.title=文件內容…\ndocument_properties_label=文件內容…\ndocument_properties_file_name=檔案名稱:\ndocument_properties_file_size=檔案大小:\ndocument_properties_kb={{size_kb}} KB（{{size_b}} 位元組）\ndocument_properties_mb={{size_kb}} MB（{{size_b}} 位元組）\ndocument_properties_title=標題:\ndocument_properties_author=作者:\ndocument_properties_subject=主旨:\ndocument_properties_keywords=關鍵字:\ndocument_properties_creation_date=建立日期:\ndocument_properties_modification_date=修改日期:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=建立者:\ndocument_properties_producer=PDF 產生器:\ndocument_properties_version=PDF 版本:\ndocument_properties_page_count=頁數:\ndocument_properties_close=關閉\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=切換側邊欄\ntoggle_sidebar_label=切換側邊欄\noutline.title=顯示文件大綱\noutline_label=文件大綱\nattachments.title=顯示附件\nattachments_label=附件\nthumbs.title=顯示縮圖\nthumbs_label=縮圖\nfindbar.title=在文件中尋找\nfindbar_label=尋找\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=頁 {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=頁 {{page}} 的縮圖\n\n# Find panel button title and messages\nfind_label=尋找:\nfind_previous.title=尋找文字前次出現的位置\nfind_previous_label=上一個\nfind_next.title=尋找文字下次出現的位置\nfind_next_label=下一個\nfind_highlight=全部強調標示\nfind_match_case_label=區分大小寫\nfind_reached_top=已搜尋至文件頂端，自底端繼續搜尋\nfind_reached_bottom=已搜尋至文件底端，自頂端繼續搜尋\nfind_not_found=找不到指定文字\n\n# Error panel labels\nerror_more_info=更多資訊\nerror_less_info=更少資訊\nerror_close=關閉\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=訊息: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=堆疊: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=檔案: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=行: {{line}}\nrendering_error=描繪頁面時發生錯誤。\n\n# Predefined zoom values\npage_scale_width=頁面寬度\npage_scale_fit=縮放至頁面大小\npage_scale_auto=自動縮放\npage_scale_actual=實際大小\n\n# Loading indicator messages\nloading_error_indicator=錯誤\nloading_error=載入 PDF 時發生錯誤。\ninvalid_file_error=無效或毀損的 PDF 檔案。\nmissing_file_error=找不到 PDF 檔案。\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} 註解]\npassword_label=請輸入用來開啟此 PDF 檔案的密碼。\npassword_invalid=密碼不正確，請再試一次。\npassword_ok=確定\npassword_cancel=取消\n\nprinting_not_supported=警告: 此瀏覽器未完整支援列印功能。\nprinting_not_ready=警告: 此 PDF 未完成下載以供列印。\nweb_fonts_disabled=已停用網路字型 (Web fonts): 無法使用 PDF 內嵌字型。\ndocument_colors_disabled=瀏覽器的「優先使用網頁指定的色彩」未被勾選，PDF 文件無法使用自己的色彩。\n\n"
  },
  {
    "path": "web/viewer/locale/zu/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Ikhasi eledlule\nprevious_label=Okudlule\nnext.title=Ikhasi elilandelayo\nnext_label=Okulandelayo\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Ikhasi:\npage_of=kwe-{{pageCount}}\n\nzoom_out.title=Hlehlisela emuva\nzoom_out_label=Hlehlisela emuva\nzoom_in.title=Sondeza eduze\nzoom_in_label=Sondeza eduze\nzoom.title=Lwiza\nprint.title=Phrinta\nprint_label=Phrinta\npresentation_mode.title=Guqulela kwindlela yesethulo\npresentation_mode_label=Indlelo yesethulo\nopen_file.title=Vula ifayela\nopen_file_label=Vula\ndownload.title=Landa\ndownload_label=Landa\nbookmark.title=Ukubuka kwamanje (kopisha noma vula kwifasitela elisha)\nbookmark_label=Ukubuka kwamanje\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=I-toggle yebha yaseceleni\ntoggle_sidebar_label=i-toggle yebha yaseceleni\noutline.title=Bonisa umugqa waseceleni wedokhumenti\noutline_label=Umugqa waseceleni wedokhumenti\nthumbs.title=Bonisa izithombe ezincane\nthumbs_label=Izithonjana\nfindbar.title=Thola kwidokhumenti\nfindbar_label=Thola\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Ikhasi {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Isithonjana sekhasi {{page}}\n\n# Context menu\nfirst_page.label=Yiya kwikhasi lokuqala\nlast_page.label=Yiya kwikhasi lokugcina\npage_rotate_cw.label=Jikisela ngendlela yewashi\npage_rotate_ccw.label=Jikisela kwelokudla\n\n# Find panel button title and messages\nfind_label=Thola\nfind_previous.title=Thola indawo eyandulelayo okuvela kuyo lomshwana\nfind_previous_label=Okudlulile\nfind_next.title=Thola enye indawo okuvela kuyo lomshwana\nfind_next_label=Okulandelayo\nfind_highlight=Gqamisa konke\nfind_match_case_label=Fanisa ikheyisi\nfind_reached_top=Finyelele phezulu kwidokhumenti, qhubeka kusukaphansi\nfind_reached_bottom=Ifinyelele ekupheleni kwedokhumenti, qhubeka kusukaphezulu\nfind_not_found=Umshwana awutholakali\n\n# Error panel labels\nerror_more_info=Ukwaziswa Okwengeziwe\nerror_less_info=Ukwazi okuncane\nerror_close=Vala\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Umlayezo: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Isitaki: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Ifayela: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Umugqa: {{line}}\nrendering_error=Iphutha lenzekile uma kunikwa ikhasi.\n\n# Predefined zoom values\npage_scale_width=Ububanzi bekhasi\npage_scale_fit=Ukulingana kwekhasi\npage_scale_auto=Ukulwiza okuzenzekalelayo\npage_scale_actual=Usayizi Wangempela\n\n# Loading indicator messages\nloading_error_indicator=Iphutha\nloading_error=Kwenzeke iphutha uma kulayishwa i-PDF.\ninvalid_file_error=Ifayela le-PDF elingavumelekile noma elonakele.\nmissing_file_error=Ifayela le-PDF elilahlekile.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Amazwibela e-{{type}}]\nrequest_password=I-PDF ivikeleke ngephasiwedi\ninvalid_password=Iphasiwedi Engavumelekile.\n\nprinting_not_supported=Isixwayiso: Ukuphrinta akuxhasiwe yilesisiphequluli ngokugcwele.\nprinting_not_ready=Isixwayiso: I-PDF ayikalayishwa ngokuphelele yiPhrinta.\nweb_fonts_disabled=Amafonti e-webhu akutshaziwe: ayikwazi ukusebenzisa amafonti abekiwe e-PDF. \ndocument_colors_disabled=Amadokhumenti we-PDF awavumelekile ukusebenzisa imibalo yayo: 'Vumela amakhasi ukukhetha imibala yayo' ayisebenzi kusiphequluli.\n"
  },
  {
    "path": "web/viewer/pdfium.js.pdf.js",
    "content": "/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab foldmethod=marker: */\n/*\n * PDFium.js adapter for PDF.js\n *\n * by Lu Wang\n */\n\nif (typeof PDFiumJS === 'undefined') {\n  (typeof window !== 'undefined' ? window : this).PDFiumJS = {};\n}\n\nvar crawp = Module['crap'];\nPDFiumJS.C = {\n  init: cwrap('PDFiumJS_init', null, []),\n  Doc_new: cwrap('PDFiumJS_Doc_new', 'number', ['number', 'number']),\n  Doc_delete: cwrap('PDFiumJS_Doc_delete', null, ['number']),\n  Doc_get_page_count: cwrap('PDFiumJS_Doc_get_page_count', 'number', ['number']),\n  Doc_get_page: cwrap('PDFiumJS_Doc_get_page', 'number', ['number', 'number']),\n  Page_get_width: cwrap('PDFiumJS_Page_get_width', 'number', ['number']),\n  Page_get_height: cwrap('PDFiumJS_Page_get_height', 'number', ['number']),\n  Page_get_bitmap: cwrap('PDFiumJS_Page_get_bitmap', 'number', ['number']),\n  Bitmap_get_buffer: cwrap('PDFiumJS_Bitmap_get_buffer', 'number', ['number']),\n  Bitmap_get_stride: cwrap('PDFiumJS_Bitmap_get_stride', 'number', ['number']),\n  Bitmap_destroy: cwrap('PDFiumJS_Bitmap_destroy', null, ['number']),\n  Page_destroy: cwrap('PDFiumJS_Page_destroy', null, ['number']),\n};\nPDFiumJS.C.init();\n\nPDFiumJS.createFakePromise = function() { \n  var args = arguments;\n  return { \n    then: function(f){ \n      if(f) {\n        setTimeout(function() {\n          f.apply(null, args);\n        }, 1);\n      }\n      return PDFiumJS.createFakePromise();\n    } \n  }; \n};\nPDFiumJS.createFakeFailedPromise = function() { \n  var args = arguments;\n  return { \n    then: function(unused, f){ \n      if(f) {\n        setTimeout(function() {\n          f.apply(null, args);\n        }, 1);\n      }\n    } \n  }; \n};\n\nPDFiumJS.opened_files = [];\n\nPDFiumJS.Doc = function (data) {\n  this.file_size = data.length;\n  if(!data) {\n    this.numPages = 0;\n    return;\n  }\n\n  var file_id = PDFiumJS.opened_files.length;\n  PDFiumJS.opened_files[file_id] = data;\n\n  this.file_id = file_id;\n  this.doc = PDFiumJS.C.Doc_new(file_id, this.file_size);\n  this.numPages = PDFiumJS.C.Doc_get_page_count(this.doc);\n};\nPDFiumJS.Doc.prototype = {\n  destroy: function () {\n    PDFiumJS.opened_files[file_id] = null;\n    PDFiumJS.C.Doc_delete(this.doc);\n  },\n  getDownloadInfo: function() {\n    return PDFiumJS.createFakePromise({ length: this.file_size });\n  },\n  getPage: function(page_no) {\n    return PDFiumJS.createFakePromise( new PDFiumJS.Page(page_no-1, this.doc));\n  },\n  getDestinations: function() { return PDFiumJS.createFakePromise(); },\n  getMetadata: function() { \n    return PDFiumJS.createFakePromise({ \n      info: {},\n      metadata: { \n        has: function() { return false; }\n      },\n    }); \n  },\n  getOutline: function() { return PDFiumJS.createFakePromise(); },\n  getJavaScript: function() { return PDFiumJS.createFakePromise([]); },\n  getAttachments: function() { return PDFiumJS.createFakePromise(); },\n  cleanup: function() { },\n};\n\nPDFiumJS.Page = function (page_no, doc) {\n  this.page_no = page_no;\n  this.doc = doc;\n\n  var page = PDFiumJS.C.Doc_get_page(this.doc, page_no);\n  this.width = PDFiumJS.C.Page_get_width(page);\n  this.height = PDFiumJS.C.Page_get_height(page);\n  this.ref = { num:0, gen:0 };\n  // TODO better memory management\n  PDFiumJS.C.Page_destroy(page);\n};\nPDFiumJS.Page.prototype = {\n  getViewport: function(scale, rotate) {\n    return new PDFJS.PageViewport([0,0,this.width,this.height], scale, rotate, 0, 0);\n  },\n  getAnnotations: function() {\n    return PDFiumJS.createFakePromise([]);\n  },\n  getTextContent: function() {\n    return PDFiumJS.createFakePromise({ items: [] });\n  },\n  render: function(params) {//{{{\n    try {\n      var ctx = params.canvasContext;\n      var width = ctx.canvas.width;\n      var height = ctx.canvas.height;\n\n      var img = ctx.createImageData(width, height);\n      var data = img.data;\n\n      // TODO better memory management\n      var page = PDFiumJS.C.Doc_get_page(this.doc, this.page_no);\n\n      var bitmap = PDFiumJS.C.Page_get_bitmap(page, width, height);\n\n      PDFiumJS.C.Page_destroy(page);\n\n      var buf = PDFiumJS.C.Bitmap_get_buffer(bitmap);\n      var stride = PDFiumJS.C.Bitmap_get_stride(bitmap);\n\n      var off = 0;\n      for(var h = 0; h < height; ++h) {\n        var ptr = buf + stride * h;\n        for(var w = 0; w < width; ++w) {\n          data[off++] = HEAPU8[ptr+2];\n          data[off++] = HEAPU8[ptr+1];\n          data[off++] = HEAPU8[ptr];\n          data[off++] = 255;\n          ptr += 4;\n        }\n      }\n\n      PDFiumJS.C.Bitmap_destroy(bitmap);\n\n      ctx.putImageData(img, 0, 0);\n    } catch(e) {\n      return {\n        promise: PDFiumJS.createFakeFailedPromise({ message: e }),\n      };\n    }\n\n    return { \n      promise: PDFiumJS.createFakePromise(),\n      cancel: function() { },\n    };\n  },//}}}\n  cleanup: function() { \n  },\n  destroy: function() {\n  },\n};\n\nif (typeof PDFJS === 'undefined') {\n  (typeof window !== 'undefined' ? window : this).PDFJS = {};\n}\n\nPDFJS.disableWorker = true;\nPDFJS.disableCreateObjectURL = true;\nPDFJS.disableTextLayer = true;\n\nPDFJS.UnsupportedManager = { listen: function() {} };\nPDFJS.isValidUrl = function() { return true; };\n\nPDFJS.getDocument = function (data) {\n  data = data.data;\n  if(data)\n    return PDFiumJS.createFakePromise(new PDFiumJS.Doc(data));\n  else\n    return PDFiumJS.createFakeFailedPromise('Only local files are supported');\n};\n\n// The following is taken from PDF.js\n/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar Util = PDFJS.Util = (function UtilClosure() {//{{{\n  function Util() {}\n\n  var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')'];\n\n  // makeCssRgb() can be called thousands of times. Using |rgbBuf| avoids\n  // creating many intermediate strings.\n  Util.makeCssRgb = function Util_makeCssRgb(rgb) {\n    rgbBuf[1] = rgb[0];\n    rgbBuf[3] = rgb[1];\n    rgbBuf[5] = rgb[2];\n    return rgbBuf.join('');\n  };\n\n  // Concatenates two transformation matrices together and returns the result.\n  Util.transform = function Util_transform(m1, m2) {\n    return [\n      m1[0] * m2[0] + m1[2] * m2[1],\n      m1[1] * m2[0] + m1[3] * m2[1],\n      m1[0] * m2[2] + m1[2] * m2[3],\n      m1[1] * m2[2] + m1[3] * m2[3],\n      m1[0] * m2[4] + m1[2] * m2[5] + m1[4],\n      m1[1] * m2[4] + m1[3] * m2[5] + m1[5]\n    ];\n  };\n\n  // For 2d affine transforms\n  Util.applyTransform = function Util_applyTransform(p, m) {\n    var xt = p[0] * m[0] + p[1] * m[2] + m[4];\n    var yt = p[0] * m[1] + p[1] * m[3] + m[5];\n    return [xt, yt];\n  };\n\n  Util.applyInverseTransform = function Util_applyInverseTransform(p, m) {\n    var d = m[0] * m[3] - m[1] * m[2];\n    var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;\n    var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;\n    return [xt, yt];\n  };\n\n  // Applies the transform to the rectangle and finds the minimum axially\n  // aligned bounding box.\n  Util.getAxialAlignedBoundingBox =\n    function Util_getAxialAlignedBoundingBox(r, m) {\n\n    var p1 = Util.applyTransform(r, m);\n    var p2 = Util.applyTransform(r.slice(2, 4), m);\n    var p3 = Util.applyTransform([r[0], r[3]], m);\n    var p4 = Util.applyTransform([r[2], r[1]], m);\n    return [\n      Math.min(p1[0], p2[0], p3[0], p4[0]),\n      Math.min(p1[1], p2[1], p3[1], p4[1]),\n      Math.max(p1[0], p2[0], p3[0], p4[0]),\n      Math.max(p1[1], p2[1], p3[1], p4[1])\n    ];\n  };\n\n  Util.inverseTransform = function Util_inverseTransform(m) {\n    var d = m[0] * m[3] - m[1] * m[2];\n    return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d,\n      (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];\n  };\n\n  // Apply a generic 3d matrix M on a 3-vector v:\n  //   | a b c |   | X |\n  //   | d e f | x | Y |\n  //   | g h i |   | Z |\n  // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i],\n  // with v as [X,Y,Z]\n  Util.apply3dTransform = function Util_apply3dTransform(m, v) {\n    return [\n      m[0] * v[0] + m[1] * v[1] + m[2] * v[2],\n      m[3] * v[0] + m[4] * v[1] + m[5] * v[2],\n      m[6] * v[0] + m[7] * v[1] + m[8] * v[2]\n    ];\n  };\n\n  // This calculation uses Singular Value Decomposition.\n  // The SVD can be represented with formula A = USV. We are interested in the\n  // matrix S here because it represents the scale values.\n  Util.singularValueDecompose2dScale =\n    function Util_singularValueDecompose2dScale(m) {\n\n    var transpose = [m[0], m[2], m[1], m[3]];\n\n    // Multiply matrix m with its transpose.\n    var a = m[0] * transpose[0] + m[1] * transpose[2];\n    var b = m[0] * transpose[1] + m[1] * transpose[3];\n    var c = m[2] * transpose[0] + m[3] * transpose[2];\n    var d = m[2] * transpose[1] + m[3] * transpose[3];\n\n    // Solve the second degree polynomial to get roots.\n    var first = (a + d) / 2;\n    var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2;\n    var sx = first + second || 1;\n    var sy = first - second || 1;\n\n    // Scale values are the square roots of the eigenvalues.\n    return [Math.sqrt(sx), Math.sqrt(sy)];\n  };\n\n  // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2)\n  // For coordinate systems whose origin lies in the bottom-left, this\n  // means normalization to (BL,TR) ordering. For systems with origin in the\n  // top-left, this means (TL,BR) ordering.\n  Util.normalizeRect = function Util_normalizeRect(rect) {\n    var r = rect.slice(0); // clone rect\n    if (rect[0] > rect[2]) {\n      r[0] = rect[2];\n      r[2] = rect[0];\n    }\n    if (rect[1] > rect[3]) {\n      r[1] = rect[3];\n      r[3] = rect[1];\n    }\n    return r;\n  };\n\n  // Returns a rectangle [x1, y1, x2, y2] corresponding to the\n  // intersection of rect1 and rect2. If no intersection, returns 'false'\n  // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2]\n  Util.intersect = function Util_intersect(rect1, rect2) {\n    function compare(a, b) {\n      return a - b;\n    }\n\n    // Order points along the axes\n    var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),\n        orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),\n        result = [];\n\n    rect1 = Util.normalizeRect(rect1);\n    rect2 = Util.normalizeRect(rect2);\n\n    // X: first and second points belong to different rectangles?\n    if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) ||\n        (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) {\n      // Intersection must be between second and third points\n      result[0] = orderedX[1];\n      result[2] = orderedX[2];\n    } else {\n      return false;\n    }\n\n    // Y: first and second points belong to different rectangles?\n    if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) ||\n        (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) {\n      // Intersection must be between second and third points\n      result[1] = orderedY[1];\n      result[3] = orderedY[2];\n    } else {\n      return false;\n    }\n\n    return result;\n  };\n\n  Util.sign = function Util_sign(num) {\n    return num < 0 ? -1 : 1;\n  };\n\n  Util.appendToArray = function Util_appendToArray(arr1, arr2) {\n    Array.prototype.push.apply(arr1, arr2);\n  };\n\n  Util.prependToArray = function Util_prependToArray(arr1, arr2) {\n    Array.prototype.unshift.apply(arr1, arr2);\n  };\n\n  Util.extendObj = function extendObj(obj1, obj2) {\n    for (var key in obj2) {\n      obj1[key] = obj2[key];\n    }\n  };\n\n  Util.getInheritableProperty = function Util_getInheritableProperty(dict,\n                                                                     name) {\n    while (dict && !dict.has(name)) {\n      dict = dict.get('Parent');\n    }\n    if (!dict) {\n      return null;\n    }\n    return dict.get(name);\n  };\n\n  Util.inherit = function Util_inherit(sub, base, prototype) {\n    sub.prototype = Object.create(base.prototype);\n    sub.prototype.constructor = sub;\n    for (var prop in prototype) {\n      sub.prototype[prop] = prototype[prop];\n    }\n  };\n\n  Util.loadScript = function Util_loadScript(src, callback) {\n    var script = document.createElement('script');\n    var loaded = false;\n    script.setAttribute('src', src);\n    if (callback) {\n      script.onload = function() {\n        if (!loaded) {\n          callback();\n        }\n        loaded = true;\n      };\n    }\n    document.getElementsByTagName('head')[0].appendChild(script);\n  };\n\n  return Util;\n})();//}}}\nPDFJS.PageViewport = (function PageViewportClosure() {//{{{\n  /**\n   * @constructor\n   * @private\n   * @param viewBox {Array} xMin, yMin, xMax and yMax coordinates.\n   * @param scale {number} scale of the viewport.\n   * @param rotation {number} rotations of the viewport in degrees.\n   * @param offsetX {number} offset X\n   * @param offsetY {number} offset Y\n   * @param dontFlip {boolean} if true, axis Y will not be flipped.\n   */\n  function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) {\n    this.viewBox = viewBox;\n    this.scale = scale;\n    this.rotation = rotation;\n    this.offsetX = offsetX;\n    this.offsetY = offsetY;\n\n    // creating transform to convert pdf coordinate system to the normal\n    // canvas like coordinates taking in account scale and rotation\n    var centerX = (viewBox[2] + viewBox[0]) / 2;\n    var centerY = (viewBox[3] + viewBox[1]) / 2;\n    var rotateA, rotateB, rotateC, rotateD;\n    rotation = rotation % 360;\n    rotation = rotation < 0 ? rotation + 360 : rotation;\n    switch (rotation) {\n      case 180:\n        rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1;\n        break;\n      case 90:\n        rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0;\n        break;\n      case 270:\n        rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0;\n        break;\n      //case 0:\n      default:\n        rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1;\n        break;\n    }\n\n    if (dontFlip) {\n      rotateC = -rotateC; rotateD = -rotateD;\n    }\n\n    var offsetCanvasX, offsetCanvasY;\n    var width, height;\n    if (rotateA === 0) {\n      offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;\n      offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;\n      width = Math.abs(viewBox[3] - viewBox[1]) * scale;\n      height = Math.abs(viewBox[2] - viewBox[0]) * scale;\n    } else {\n      offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;\n      offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;\n      width = Math.abs(viewBox[2] - viewBox[0]) * scale;\n      height = Math.abs(viewBox[3] - viewBox[1]) * scale;\n    }\n    // creating transform for the following operations:\n    // translate(-centerX, -centerY), rotate and flip vertically,\n    // scale, and translate(offsetCanvasX, offsetCanvasY)\n    this.transform = [\n      rotateA * scale,\n      rotateB * scale,\n      rotateC * scale,\n      rotateD * scale,\n      offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY,\n      offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY\n    ];\n\n    this.width = width;\n    this.height = height;\n    this.fontScale = scale;\n  }\n  PageViewport.prototype = /** @lends PDFJS.PageViewport.prototype */ {\n    /**\n     * Clones viewport with additional properties.\n     * @param args {Object} (optional) If specified, may contain the 'scale' or\n     * 'rotation' properties to override the corresponding properties in\n     * the cloned viewport.\n     * @returns {PDFJS.PageViewport} Cloned viewport.\n     */\n    clone: function PageViewPort_clone(args) {\n      args = args || {};\n      var scale = 'scale' in args ? args.scale : this.scale;\n      var rotation = 'rotation' in args ? args.rotation : this.rotation;\n      return new PageViewport(this.viewBox.slice(), scale, rotation,\n                              this.offsetX, this.offsetY, args.dontFlip);\n    },\n    /**\n     * Converts PDF point to the viewport coordinates. For examples, useful for\n     * converting PDF location into canvas pixel coordinates.\n     * @param x {number} X coordinate.\n     * @param y {number} Y coordinate.\n     * @returns {Object} Object that contains 'x' and 'y' properties of the\n     * point in the viewport coordinate space.\n     * @see {@link convertToPdfPoint}\n     * @see {@link convertToViewportRectangle}\n     */\n    convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) {\n      return Util.applyTransform([x, y], this.transform);\n    },\n    /**\n     * Converts PDF rectangle to the viewport coordinates.\n     * @param rect {Array} xMin, yMin, xMax and yMax coordinates.\n     * @returns {Array} Contains corresponding coordinates of the rectangle\n     * in the viewport coordinate space.\n     * @see {@link convertToViewportPoint}\n     */\n    convertToViewportRectangle:\n      function PageViewport_convertToViewportRectangle(rect) {\n      var tl = Util.applyTransform([rect[0], rect[1]], this.transform);\n      var br = Util.applyTransform([rect[2], rect[3]], this.transform);\n      return [tl[0], tl[1], br[0], br[1]];\n    },\n    /**\n     * Converts viewport coordinates to the PDF location. For examples, useful\n     * for converting canvas pixel location into PDF one.\n     * @param x {number} X coordinate.\n     * @param y {number} Y coordinate.\n     * @returns {Object} Object that contains 'x' and 'y' properties of the\n     * point in the PDF coordinate space.\n     * @see {@link convertToViewportPoint}\n     */\n    convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) {\n      return Util.applyInverseTransform([x, y], this.transform);\n    }\n  };\n  return PageViewport;\n})();//}}}\n"
  },
  {
    "path": "web/viewer/viewer.css",
    "content": "/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n* {\n  padding: 0;\n  margin: 0;\n}\n\nhtml {\n  height: 100%;\n  /* Font size is needed to make the activity bar the correct size. */\n  font-size: 10px;\n}\n\nbody {\n  height: 100%;\n  background-color: #404040;\n  background-image: url(images/texture.png);\n}\n\nbody,\ninput,\nbutton,\nselect {\n  font: message-box;\n  outline: none;\n}\n\n.hidden {\n  display: none !important;\n}\n[hidden] {\n  display: none !important;\n}\n\n#viewerContainer:-webkit-full-screen {\n  top: 0px;\n  border-top: 2px solid transparent;\n  background-color: #000;\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  cursor: none;\n}\n\n#viewerContainer:-moz-full-screen {\n  top: 0px;\n  border-top: 2px solid transparent;\n  background-color: #000;\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  cursor: none;\n}\n\n#viewerContainer:-ms-fullscreen {\n  top: 0px !important;\n  border-top: 2px solid transparent;\n  width: 100%;\n  height: 100%;\n  overflow: hidden !important;\n  cursor: none;\n}\n\n#viewerContainer:-ms-fullscreen::-ms-backdrop {\n  background-color: #000;\n}\n\n#viewerContainer:fullscreen {\n  top: 0px;\n  border-top: 2px solid transparent;\n  background-color: #000;\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  cursor: none;\n}\n\n:-webkit-full-screen .page {\n  margin-bottom: 100%;\n  border: 0;\n}\n\n:-moz-full-screen .page {\n  margin-bottom: 100%;\n  border: 0;\n}\n\n:-ms-fullscreen .page {\n  margin-bottom: 100% !important;\n  border: 0;\n}\n\n:fullscreen .page {\n  margin-bottom: 100%;\n  border: 0;\n}\n\n:-webkit-full-screen a:not(.internalLink) {\n  display: none;\n}\n\n:-moz-full-screen a:not(.internalLink) {\n  display: none;\n}\n\n:-ms-fullscreen a:not(.internalLink) {\n  display: none !important;\n}\n\n:fullscreen a:not(.internalLink) {\n  display: none;\n}\n\n:-webkit-full-screen .textLayer > div {\n  cursor: none;\n}\n\n:-moz-full-screen .textLayer > div {\n  cursor: none;\n}\n\n:fullscreen .textLayer > div {\n  cursor: none;\n}\n\n#viewerContainer.presentationControls,\n#viewerContainer.presentationControls .textLayer > div {\n  cursor: default;\n}\n\n/* outer/inner center provides horizontal center */\n.outerCenter {\n  pointer-events: none;\n  position: relative;\n}\nhtml[dir='ltr'] .outerCenter {\n  float: right;\n  right: 50%;\n}\nhtml[dir='rtl'] .outerCenter {\n  float: left;\n  left: 50%;\n}\n.innerCenter {\n  pointer-events: auto;\n  position: relative;\n}\nhtml[dir='ltr'] .innerCenter {\n  float: right;\n  right: -50%;\n}\nhtml[dir='rtl'] .innerCenter {\n  float: left;\n  left: -50%;\n}\n\n#outerContainer {\n  width: 100%;\n  height: 100%;\n  position: relative;\n}\n\n#sidebarContainer {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  width: 200px;\n  visibility: hidden;\n  -webkit-transition-duration: 200ms;\n  -webkit-transition-timing-function: ease;\n  transition-duration: 200ms;\n  transition-timing-function: ease;\n\n}\nhtml[dir='ltr'] #sidebarContainer {\n  -webkit-transition-property: left;\n  transition-property: left;\n  left: -200px;\n}\nhtml[dir='rtl'] #sidebarContainer {\n  -webkit-transition-property: right;\n  transition-property: right;\n  right: -200px;\n}\n\n#outerContainer.sidebarMoving > #sidebarContainer,\n#outerContainer.sidebarOpen > #sidebarContainer {\n  visibility: visible;\n}\nhtml[dir='ltr'] #outerContainer.sidebarOpen > #sidebarContainer {\n  left: 0px;\n}\nhtml[dir='rtl'] #outerContainer.sidebarOpen > #sidebarContainer {\n  right: 0px;\n}\n\n#mainContainer {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  min-width: 320px;\n  -webkit-transition-duration: 200ms;\n  -webkit-transition-timing-function: ease;\n  transition-duration: 200ms;\n  transition-timing-function: ease;\n}\nhtml[dir='ltr'] #outerContainer.sidebarOpen > #mainContainer {\n  -webkit-transition-property: left;\n  transition-property: left;\n  left: 200px;\n}\nhtml[dir='rtl'] #outerContainer.sidebarOpen > #mainContainer {\n  -webkit-transition-property: right;\n  transition-property: right;\n  right: 200px;\n}\n\n#sidebarContent {\n  top: 32px;\n  bottom: 0;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n  position: absolute;\n  width: 200px;\n  background-color: hsla(0,0%,0%,.1);\n}\nhtml[dir='ltr'] #sidebarContent {\n  left: 0;\n  box-shadow: inset -1px 0 0 hsla(0,0%,0%,.25);\n}\nhtml[dir='rtl'] #sidebarContent {\n  right: 0;\n  box-shadow: inset 1px 0 0 hsla(0,0%,0%,.25);\n}\n\n#viewerContainer {\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n  position: absolute;\n  top: 32px;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  outline: none;\n}\nhtml[dir='ltr'] #viewerContainer {\n  box-shadow: inset 1px 0 0 hsla(0,0%,100%,.05);\n}\nhtml[dir='rtl'] #viewerContainer {\n  box-shadow: inset -1px 0 0 hsla(0,0%,100%,.05);\n}\n\n.toolbar {\n  position: relative;\n  left: 0;\n  right: 0;\n  z-index: 9999;\n  cursor: default;\n}\n\n#toolbarContainer {\n  width: 100%;\n}\n\n#toolbarSidebar {\n  width: 200px;\n  height: 32px;\n  background-color: #424242; /* fallback */\n  background-image: url(images/texture.png),\n                    linear-gradient(hsla(0,0%,30%,.99), hsla(0,0%,25%,.95));\n}\nhtml[dir='ltr'] #toolbarSidebar {\n  box-shadow: inset -1px 0 0 rgba(0, 0, 0, 0.25),\n              inset 0 -1px 0 hsla(0,0%,100%,.05),\n              0 1px 0 hsla(0,0%,0%,.15),\n              0 0 1px hsla(0,0%,0%,.1);\n}\nhtml[dir='rtl'] #toolbarSidebar {\n  box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.25),\n              inset 0 1px 0 hsla(0,0%,100%,.05),\n              0 1px 0 hsla(0,0%,0%,.15),\n              0 0 1px hsla(0,0%,0%,.1);\n}\n\n#toolbarContainer, .findbar, .secondaryToolbar {\n  position: relative;\n  height: 32px;\n  background-color: #474747; /* fallback */\n  background-image: url(images/texture.png),\n                    linear-gradient(hsla(0,0%,32%,.99), hsla(0,0%,27%,.95));\n}\nhtml[dir='ltr'] #toolbarContainer, .findbar, .secondaryToolbar {\n  box-shadow: inset 1px 0 0 hsla(0,0%,100%,.08),\n              inset 0 1px 1px hsla(0,0%,0%,.15),\n              inset 0 -1px 0 hsla(0,0%,100%,.05),\n              0 1px 0 hsla(0,0%,0%,.15),\n              0 1px 1px hsla(0,0%,0%,.1);\n}\nhtml[dir='rtl'] #toolbarContainer, .findbar, .secondaryToolbar {\n  box-shadow: inset -1px 0 0 hsla(0,0%,100%,.08),\n              inset 0 1px 1px hsla(0,0%,0%,.15),\n              inset 0 -1px 0 hsla(0,0%,100%,.05),\n              0 1px 0 hsla(0,0%,0%,.15),\n              0 1px 1px hsla(0,0%,0%,.1);\n}\n\n#toolbarViewer {\n  height: 32px;\n}\n\n#loadingBar {\n  position: relative;\n  width: 100%;\n  height: 6px;\n  background-color: #333;\n  border-bottom: 1px solid #333;\n}\n\n#loadingBar .progress {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 0%;\n  height: 100%;\n  background-color: #ddd;\n  overflow: hidden;\n  -webkit-transition: width 200ms;\n  transition: width 200ms;\n}\n\n@-webkit-keyframes progressIndeterminate {\n  0% { left: 0%; }\n  50% { left: 100%; }\n  100% { left: 100%; }\n}\n\n@keyframes progressIndeterminate {\n  0% { left: 0%; }\n  50% { left: 100%; }\n  100% { left: 100%; }\n}\n\n#loadingBar .progress.indeterminate {\n  background-color: #999;\n  -webkit-transition: none;\n  transition: none;\n}\n\n#loadingBar .indeterminate .glimmer {\n  position: absolute;\n  top: 0;\n  left: 0;\n  height: 100%;\n  width: 50px;\n\n  background-image: linear-gradient(to right, #999 0%, #fff 50%, #999 100%);\n  background-size: 100% 100%;\n  background-repeat: no-repeat;\n\n  -webkit-animation: progressIndeterminate 2s linear infinite;\n  animation: progressIndeterminate 2s linear infinite;\n}\n\n.findbar, .secondaryToolbar {\n  top: 32px;\n  position: absolute;\n  z-index: 10000;\n  height: 32px;\n\n  min-width: 16px;\n  padding: 0px 6px 0px 6px;\n  margin: 4px 2px 4px 2px;\n  color: hsl(0,0%,85%);\n  font-size: 12px;\n  line-height: 14px;\n  text-align: left;\n  cursor: default;\n}\n\nhtml[dir='ltr'] .findbar {\n  left: 68px;\n}\n\nhtml[dir='rtl'] .findbar {\n  right: 68px;\n}\n\n.findbar label {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n}\n\n#findInput[data-status=\"pending\"] {\n  background-image: url(images/loading-small.png);\n  background-repeat: no-repeat;\n  background-position: right;\n}\n\n.secondaryToolbar {\n  padding: 6px;\n  height: auto;\n  z-index: 30000;\n}\nhtml[dir='ltr'] .secondaryToolbar {\n  right: 4px;\n}\nhtml[dir='rtl'] .secondaryToolbar {\n  left: 4px;\n}\n\n#secondaryToolbarButtonContainer {\n  max-width: 200px;\n  max-height: 400px;\n  overflow-y: auto;\n  -webkit-overflow-scrolling: touch;\n  margin-bottom: -4px;\n}\n\n.doorHanger,\n.doorHangerRight {\n  border: 1px solid hsla(0,0%,0%,.5);\n  border-radius: 2px;\n  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);\n}\n.doorHanger:after, .doorHanger:before,\n.doorHangerRight:after, .doorHangerRight:before {\n  bottom: 100%;\n  border: solid transparent;\n  content: \" \";\n  height: 0;\n  width: 0;\n  position: absolute;\n  pointer-events: none;\n}\n.doorHanger:after,\n.doorHangerRight:after {\n  border-bottom-color: hsla(0,0%,32%,.99);\n  border-width: 8px;\n}\n.doorHanger:before,\n.doorHangerRight:before {\n  border-bottom-color: hsla(0,0%,0%,.5);\n  border-width: 9px;\n}\n\nhtml[dir='ltr'] .doorHanger:after,\nhtml[dir='rtl'] .doorHangerRight:after {\n  left: 13px;\n  margin-left: -8px;\n}\n\nhtml[dir='ltr'] .doorHanger:before,\nhtml[dir='rtl'] .doorHangerRight:before {\n  left: 13px;\n  margin-left: -9px;\n}\n\nhtml[dir='rtl'] .doorHanger:after,\nhtml[dir='ltr'] .doorHangerRight:after {\n  right: 13px;\n  margin-right: -8px;\n}\n\nhtml[dir='rtl'] .doorHanger:before,\nhtml[dir='ltr'] .doorHangerRight:before {\n  right: 13px;\n  margin-right: -9px;\n}\n\n#findMsg {\n  font-style: italic;\n  color: #A6B7D0;\n}\n\n.notFound {\n  background-color: rgb(255, 137, 153);\n}\n\nhtml[dir='ltr'] #toolbarViewerLeft {\n  margin-left: -1px;\n}\nhtml[dir='rtl'] #toolbarViewerRight {\n  margin-right: -1px;\n}\n\nhtml[dir='ltr'] #toolbarViewerLeft,\nhtml[dir='rtl'] #toolbarViewerRight {\n  position: absolute;\n  top: 0;\n  left: 0;\n}\nhtml[dir='ltr'] #toolbarViewerRight,\nhtml[dir='rtl'] #toolbarViewerLeft {\n  position: absolute;\n  top: 0;\n  right: 0;\n}\nhtml[dir='ltr'] #toolbarViewerLeft > *,\nhtml[dir='ltr'] #toolbarViewerMiddle > *,\nhtml[dir='ltr'] #toolbarViewerRight > *,\nhtml[dir='ltr'] .findbar > * {\n  position: relative;\n  float: left;\n}\nhtml[dir='rtl'] #toolbarViewerLeft > *,\nhtml[dir='rtl'] #toolbarViewerMiddle > *,\nhtml[dir='rtl'] #toolbarViewerRight > *,\nhtml[dir='rtl'] .findbar > * {\n  position: relative;\n  float: right;\n}\n\nhtml[dir='ltr'] .splitToolbarButton {\n  margin: 3px 2px 4px 0;\n  display: inline-block;\n}\nhtml[dir='rtl'] .splitToolbarButton {\n  margin: 3px 0 4px 2px;\n  display: inline-block;\n}\nhtml[dir='ltr'] .splitToolbarButton > .toolbarButton {\n  border-radius: 0;\n  float: left;\n}\nhtml[dir='rtl'] .splitToolbarButton > .toolbarButton {\n  border-radius: 0;\n  float: right;\n}\n\n.toolbarButton,\n.secondaryToolbarButton,\n.overlayButton {\n  border: 0 none;\n  background: none;\n  width: 32px;\n  height: 25px;\n}\n\n.toolbarButton > span {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  overflow: hidden;\n}\n\n.toolbarButton[disabled],\n.secondaryToolbarButton[disabled],\n.overlayButton[disabled] {\n  opacity: .5;\n}\n\n.toolbarButton.group {\n  margin-right: 0;\n}\n\n.splitToolbarButton.toggled .toolbarButton {\n  margin: 0;\n}\n\n.splitToolbarButton:hover > .toolbarButton,\n.splitToolbarButton:focus > .toolbarButton,\n.splitToolbarButton.toggled > .toolbarButton,\n.toolbarButton.textButton {\n  background-color: hsla(0,0%,0%,.12);\n  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));\n  background-clip: padding-box;\n  border: 1px solid hsla(0,0%,0%,.35);\n  border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);\n  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,\n              0 0 1px hsla(0,0%,100%,.15) inset,\n              0 1px 0 hsla(0,0%,100%,.05);\n  -webkit-transition-property: background-color, border-color, box-shadow;\n  -webkit-transition-duration: 150ms;\n  -webkit-transition-timing-function: ease;\n  transition-property: background-color, border-color, box-shadow;\n  transition-duration: 150ms;\n  transition-timing-function: ease;\n\n}\n.splitToolbarButton > .toolbarButton:hover,\n.splitToolbarButton > .toolbarButton:focus,\n.dropdownToolbarButton:hover,\n.overlayButton:hover,\n.toolbarButton.textButton:hover,\n.toolbarButton.textButton:focus {\n  background-color: hsla(0,0%,0%,.2);\n  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,\n              0 0 1px hsla(0,0%,100%,.15) inset,\n              0 0 1px hsla(0,0%,0%,.05);\n  z-index: 199;\n}\n.splitToolbarButton > .toolbarButton {\n  position: relative;\n}\nhtml[dir='ltr'] .splitToolbarButton > .toolbarButton:first-child,\nhtml[dir='rtl'] .splitToolbarButton > .toolbarButton:last-child {\n  position: relative;\n  margin: 0;\n  margin-right: -1px;\n  border-top-left-radius: 2px;\n  border-bottom-left-radius: 2px;\n  border-right-color: transparent;\n}\nhtml[dir='ltr'] .splitToolbarButton > .toolbarButton:last-child,\nhtml[dir='rtl'] .splitToolbarButton > .toolbarButton:first-child {\n  position: relative;\n  margin: 0;\n  margin-left: -1px;\n  border-top-right-radius: 2px;\n  border-bottom-right-radius: 2px;\n  border-left-color: transparent;\n}\n.splitToolbarButtonSeparator {\n  padding: 8px 0;\n  width: 1px;\n  background-color: hsla(0,0%,0%,.5);\n  z-index: 99;\n  box-shadow: 0 0 0 1px hsla(0,0%,100%,.08);\n  display: inline-block;\n  margin: 5px 0;\n}\nhtml[dir='ltr'] .splitToolbarButtonSeparator {\n  float: left;\n}\nhtml[dir='rtl'] .splitToolbarButtonSeparator {\n  float: right;\n}\n.splitToolbarButton:hover > .splitToolbarButtonSeparator,\n.splitToolbarButton.toggled > .splitToolbarButtonSeparator {\n  padding: 12px 0;\n  margin: 1px 0;\n  box-shadow: 0 0 0 1px hsla(0,0%,100%,.03);\n  -webkit-transition-property: padding;\n  -webkit-transition-duration: 10ms;\n  -webkit-transition-timing-function: ease;\n  transition-property: padding;\n  transition-duration: 10ms;\n  transition-timing-function: ease;\n}\n\n.toolbarButton,\n.dropdownToolbarButton,\n.secondaryToolbarButton,\n.overlayButton {\n  min-width: 16px;\n  padding: 2px 6px 0;\n  border: 1px solid transparent;\n  border-radius: 2px;\n  color: hsla(0,0%,100%,.8);\n  font-size: 12px;\n  line-height: 14px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  /* Opera does not support user-select, use <... unselectable=\"on\"> instead */\n  cursor: default;\n  -webkit-transition-property: background-color, border-color, box-shadow;\n  -webkit-transition-duration: 150ms;\n  -webkit-transition-timing-function: ease;\n  transition-property: background-color, border-color, box-shadow;\n  transition-duration: 150ms;\n  transition-timing-function: ease;\n}\n\nhtml[dir='ltr'] .toolbarButton,\nhtml[dir='ltr'] .overlayButton,\nhtml[dir='ltr'] .dropdownToolbarButton {\n  margin: 3px 2px 4px 0;\n}\nhtml[dir='rtl'] .toolbarButton,\nhtml[dir='rtl'] .overlayButton,\nhtml[dir='rtl'] .dropdownToolbarButton {\n  margin: 3px 0 4px 2px;\n}\n\n.toolbarButton:hover,\n.toolbarButton:focus,\n.dropdownToolbarButton,\n.overlayButton,\n.secondaryToolbarButton:hover,\n.secondaryToolbarButton:focus {\n  background-color: hsla(0,0%,0%,.12);\n  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));\n  background-clip: padding-box;\n  border: 1px solid hsla(0,0%,0%,.35);\n  border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);\n  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,\n              0 0 1px hsla(0,0%,100%,.15) inset,\n              0 1px 0 hsla(0,0%,100%,.05);\n}\n\n.toolbarButton:hover:active,\n.overlayButton:hover:active,\n.dropdownToolbarButton:hover:active,\n.secondaryToolbarButton:hover:active {\n  background-color: hsla(0,0%,0%,.2);\n  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));\n  border-color: hsla(0,0%,0%,.35) hsla(0,0%,0%,.4) hsla(0,0%,0%,.45);\n  box-shadow: 0 1px 1px hsla(0,0%,0%,.1) inset,\n              0 0 1px hsla(0,0%,0%,.2) inset,\n              0 1px 0 hsla(0,0%,100%,.05);\n  -webkit-transition-property: background-color, border-color, box-shadow;\n  -webkit-transition-duration: 10ms;\n  -webkit-transition-timing-function: linear;\n  transition-property: background-color, border-color, box-shadow;\n  transition-duration: 10ms;\n  transition-timing-function: linear;\n}\n\n.toolbarButton.toggled,\n.splitToolbarButton.toggled > .toolbarButton.toggled,\n.secondaryToolbarButton.toggled {\n  background-color: hsla(0,0%,0%,.3);\n  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));\n  border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.45) hsla(0,0%,0%,.5);\n  box-shadow: 0 1px 1px hsla(0,0%,0%,.1) inset,\n              0 0 1px hsla(0,0%,0%,.2) inset,\n              0 1px 0 hsla(0,0%,100%,.05);\n  -webkit-transition-property: background-color, border-color, box-shadow;\n  -webkit-transition-duration: 10ms;\n  -webkit-transition-timing-function: linear;\n  transition-property: background-color, border-color, box-shadow;\n  transition-duration: 10ms;\n  transition-timing-function: linear;\n}\n\n.toolbarButton.toggled:hover:active,\n.splitToolbarButton.toggled > .toolbarButton.toggled:hover:active,\n.secondaryToolbarButton.toggled:hover:active {\n  background-color: hsla(0,0%,0%,.4);\n  border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.5) hsla(0,0%,0%,.55);\n  box-shadow: 0 1px 1px hsla(0,0%,0%,.2) inset,\n              0 0 1px hsla(0,0%,0%,.3) inset,\n              0 1px 0 hsla(0,0%,100%,.05);\n}\n\n.dropdownToolbarButton {\n  width: 120px;\n  max-width: 120px;\n  padding: 3px 2px 2px;\n  overflow: hidden;\n  background: url(images/toolbarButton-menuArrows.png) no-repeat;\n}\nhtml[dir='ltr'] .dropdownToolbarButton {\n  background-position: 95%;\n}\nhtml[dir='rtl'] .dropdownToolbarButton {\n  background-position: 5%;\n}\n\n.dropdownToolbarButton > select {\n  -webkit-appearance: none;\n  -moz-appearance: none; /* in the future this might matter, see bugzilla bug #649849 */\n  min-width: 140px;\n  font-size: 12px;\n  color: hsl(0,0%,95%);\n  margin: 0;\n  padding: 0;\n  border: none;\n  background: rgba(0,0,0,0); /* Opera does not support 'transparent' <select> background */\n}\n\n.dropdownToolbarButton > select > option {\n  background: hsl(0,0%,24%);\n}\n\n#customScaleOption {\n  display: none;\n}\n\n#pageWidthOption {\n  border-bottom: 1px rgba(255, 255, 255, .5) solid;\n}\n\nhtml[dir='ltr'] .splitToolbarButton:first-child,\nhtml[dir='ltr'] .toolbarButton:first-child,\nhtml[dir='rtl'] .splitToolbarButton:last-child,\nhtml[dir='rtl'] .toolbarButton:last-child {\n  margin-left: 4px;\n}\nhtml[dir='ltr'] .splitToolbarButton:last-child,\nhtml[dir='ltr'] .toolbarButton:last-child,\nhtml[dir='rtl'] .splitToolbarButton:first-child,\nhtml[dir='rtl'] .toolbarButton:first-child {\n  margin-right: 4px;\n}\n\n.toolbarButtonSpacer {\n  width: 30px;\n  display: inline-block;\n  height: 1px;\n}\n\n.toolbarButtonFlexibleSpacer {\n  -webkit-box-flex: 1;\n  -moz-box-flex: 1;\n  min-width: 30px;\n}\n\nhtml[dir='ltr'] #findPrevious {\n  margin-left: 3px;\n}\nhtml[dir='ltr'] #findNext {\n  margin-right: 3px;\n}\n\nhtml[dir='rtl'] #findPrevious {\n  margin-right: 3px;\n}\nhtml[dir='rtl'] #findNext {\n  margin-left: 3px;\n}\n\n.toolbarButton::before,\n.secondaryToolbarButton::before {\n  /* All matching images have a size of 16x16\n   * All relevant containers have a size of 32x25 */\n  position: absolute;\n  display: inline-block;\n  top: 4px;\n  left: 7px;\n}\n\nhtml[dir=\"ltr\"] .secondaryToolbarButton::before {\n  left: 4px;\n}\nhtml[dir=\"rtl\"] .secondaryToolbarButton::before {\n  right: 4px;\n}\n\nhtml[dir='ltr'] .toolbarButton#sidebarToggle::before {\n  content: url(images/toolbarButton-sidebarToggle.png);\n}\nhtml[dir='rtl'] .toolbarButton#sidebarToggle::before {\n  content: url(images/toolbarButton-sidebarToggle-rtl.png);\n}\n\nhtml[dir='ltr'] .toolbarButton#secondaryToolbarToggle::before {\n  content: url(images/toolbarButton-secondaryToolbarToggle.png);\n}\nhtml[dir='rtl'] .toolbarButton#secondaryToolbarToggle::before {\n  content: url(images/toolbarButton-secondaryToolbarToggle-rtl.png);\n}\n\nhtml[dir='ltr'] .toolbarButton.findPrevious::before {\n  content: url(images/findbarButton-previous.png);\n}\nhtml[dir='rtl'] .toolbarButton.findPrevious::before {\n  content: url(images/findbarButton-previous-rtl.png);\n}\n\nhtml[dir='ltr'] .toolbarButton.findNext::before {\n  content: url(images/findbarButton-next.png);\n}\nhtml[dir='rtl'] .toolbarButton.findNext::before {\n  content: url(images/findbarButton-next-rtl.png);\n}\n\nhtml[dir='ltr'] .toolbarButton.pageUp::before {\n  content: url(images/toolbarButton-pageUp.png);\n}\nhtml[dir='rtl'] .toolbarButton.pageUp::before {\n  content: url(images/toolbarButton-pageUp-rtl.png);\n}\n\nhtml[dir='ltr'] .toolbarButton.pageDown::before {\n  content: url(images/toolbarButton-pageDown.png);\n}\nhtml[dir='rtl'] .toolbarButton.pageDown::before {\n  content: url(images/toolbarButton-pageDown-rtl.png);\n}\n\n.toolbarButton.zoomOut::before {\n  content: url(images/toolbarButton-zoomOut.png);\n}\n\n.toolbarButton.zoomIn::before {\n  content: url(images/toolbarButton-zoomIn.png);\n}\n\n.toolbarButton.presentationMode::before,\n.secondaryToolbarButton.presentationMode::before {\n  content: url(images/toolbarButton-presentationMode.png);\n}\n\n.toolbarButton.print::before,\n.secondaryToolbarButton.print::before {\n  content: url(images/toolbarButton-print.png);\n}\n\n.toolbarButton.openFile::before,\n.secondaryToolbarButton.openFile::before {\n  content: url(images/toolbarButton-openFile.png);\n}\n\n.toolbarButton.download::before,\n.secondaryToolbarButton.download::before {\n  content: url(images/toolbarButton-download.png);\n}\n\n.toolbarButton.bookmark,\n.secondaryToolbarButton.bookmark {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  outline: none;\n  padding-top: 4px;\n  text-decoration: none;\n}\n.secondaryToolbarButton.bookmark {\n  padding-top: 5px;\n}\n\n.bookmark[href='#'] {\n  opacity: .5;\n  pointer-events: none;\n}\n\n.toolbarButton.bookmark::before,\n.secondaryToolbarButton.bookmark::before {\n  content: url(images/toolbarButton-bookmark.png);\n}\n\n#viewThumbnail.toolbarButton::before {\n  content: url(images/toolbarButton-viewThumbnail.png);\n}\n\nhtml[dir=\"ltr\"] #viewOutline.toolbarButton::before {\n  content: url(images/toolbarButton-viewOutline.png);\n}\nhtml[dir=\"rtl\"] #viewOutline.toolbarButton::before {\n  content: url(images/toolbarButton-viewOutline-rtl.png);\n}\n\n#viewAttachments.toolbarButton::before {\n  content: url(images/toolbarButton-viewAttachments.png);\n}\n\n#viewFind.toolbarButton::before {\n  content: url(images/toolbarButton-search.png);\n}\n\n.secondaryToolbarButton {\n  position: relative;\n  margin: 0 0 4px 0;\n  padding: 3px 0 1px 0;\n  height: auto;\n  min-height: 25px;\n  width: auto;\n  min-width: 100%;\n  white-space: normal;\n}\nhtml[dir=\"ltr\"] .secondaryToolbarButton {\n  padding-left: 24px;\n  text-align: left;\n}\nhtml[dir=\"rtl\"] .secondaryToolbarButton {\n  padding-right: 24px;\n  text-align: right;\n}\nhtml[dir=\"ltr\"] .secondaryToolbarButton.bookmark {\n  padding-left: 27px;\n}\nhtml[dir=\"rtl\"] .secondaryToolbarButton.bookmark {\n  padding-right: 27px;\n}\n\nhtml[dir=\"ltr\"] .secondaryToolbarButton > span {\n  padding-right: 4px;\n}\nhtml[dir=\"rtl\"] .secondaryToolbarButton > span {\n  padding-left: 4px;\n}\n\n.secondaryToolbarButton.firstPage::before {\n  content: url(images/secondaryToolbarButton-firstPage.png);\n}\n\n.secondaryToolbarButton.lastPage::before {\n  content: url(images/secondaryToolbarButton-lastPage.png);\n}\n\n.secondaryToolbarButton.rotateCcw::before {\n  content: url(images/secondaryToolbarButton-rotateCcw.png);\n}\n\n.secondaryToolbarButton.rotateCw::before {\n  content: url(images/secondaryToolbarButton-rotateCw.png);\n}\n\n.secondaryToolbarButton.handTool::before {\n  content: url(images/secondaryToolbarButton-handTool.png);\n}\n\n.secondaryToolbarButton.documentProperties::before {\n  content: url(images/secondaryToolbarButton-documentProperties.png);\n}\n\n.verticalToolbarSeparator {\n  display: block;\n  padding: 8px 0;\n  margin: 8px 4px;\n  width: 1px;\n  background-color: hsla(0,0%,0%,.5);\n  box-shadow: 0 0 0 1px hsla(0,0%,100%,.08);\n}\nhtml[dir='ltr'] .verticalToolbarSeparator {\n  margin-left: 2px;\n}\nhtml[dir='rtl'] .verticalToolbarSeparator {\n  margin-right: 2px;\n}\n\n.horizontalToolbarSeparator {\n  display: block; \n  margin: 0 0 4px 0;\n  height: 1px;\n  width: 100%;\n  background-color: hsla(0,0%,0%,.5);\n  box-shadow: 0 0 0 1px hsla(0,0%,100%,.08);\n}\n\n.toolbarField {\n  padding: 3px 6px;\n  margin: 4px 0 4px 0;\n  border: 1px solid transparent;\n  border-radius: 2px;\n  background-color: hsla(0,0%,100%,.09);\n  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));\n  background-clip: padding-box;\n  border: 1px solid hsla(0,0%,0%,.35);\n  border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);\n  box-shadow: 0 1px 0 hsla(0,0%,0%,.05) inset,\n              0 1px 0 hsla(0,0%,100%,.05);\n  color: hsl(0,0%,95%);\n  font-size: 12px;\n  line-height: 14px;\n  outline-style: none;\n  transition-property: background-color, border-color, box-shadow;\n  transition-duration: 150ms;\n  transition-timing-function: ease;\n}\n\n.toolbarField[type=checkbox] {\n  display: inline-block;\n  margin: 8px 0px;\n}\n\n.toolbarField.pageNumber {\n  -moz-appearance: textfield; /* hides the spinner in moz */\n  min-width: 16px;\n  text-align: right;\n  width: 40px;\n}\n\n.toolbarField.pageNumber::-webkit-inner-spin-button,\n.toolbarField.pageNumber::-webkit-outer-spin-button {\n    -webkit-appearance: none;\n    margin: 0;\n}\n\n.toolbarField:hover {\n  background-color: hsla(0,0%,100%,.11);\n  border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.43) hsla(0,0%,0%,.45);\n}\n\n.toolbarField:focus {\n  background-color: hsla(0,0%,100%,.15);\n  border-color: hsla(204,100%,65%,.8) hsla(204,100%,65%,.85) hsla(204,100%,65%,.9);\n}\n\n.toolbarLabel {\n  min-width: 16px;\n  padding: 3px 6px 3px 2px;\n  margin: 4px 2px 4px 0;\n  border: 1px solid transparent;\n  border-radius: 2px;\n  color: hsl(0,0%,85%);\n  font-size: 12px;\n  line-height: 14px;\n  text-align: left;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  cursor: default;\n}\n\n#thumbnailView {\n  position: absolute;\n  width: 120px;\n  top: 0;\n  bottom: 0;\n  padding: 10px 40px 0;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n}\n\n.thumbnail {\n  float: left;\n  margin-bottom: 5px;\n}\n\n#thumbnailView > a:last-of-type > .thumbnail {\n  margin-bottom: 10px;\n}\n\n.thumbnail:not([data-loaded]) {\n  border: 1px dashed rgba(255, 255, 255, 0.5);\n  margin-bottom: 10px;\n}\n\n.thumbnailImage {\n  transition-duration: 150ms;\n  border: 1px solid transparent;\n  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.5), 0 2px 8px rgba(0, 0, 0, 0.3);\n  opacity: 0.8;\n  z-index: 99;\n}\n\n.thumbnailSelectionRing {\n  border-radius: 2px;\n  padding: 7px;\n  transition-duration: 150ms;\n}\n\na:focus > .thumbnail > .thumbnailSelectionRing > .thumbnailImage,\n.thumbnail:hover > .thumbnailSelectionRing > .thumbnailImage {\n  opacity: .9;\n}\n\na:focus > .thumbnail > .thumbnailSelectionRing,\n.thumbnail:hover > .thumbnailSelectionRing {\n  background-color: hsla(0,0%,100%,.15);\n  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));\n  background-clip: padding-box;\n  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,\n              0 0 1px hsla(0,0%,100%,.2) inset,\n              0 0 1px hsla(0,0%,0%,.2);\n  color: hsla(0,0%,100%,.9);\n}\n\n.thumbnail.selected > .thumbnailSelectionRing > .thumbnailImage {\n  box-shadow: 0 0 0 1px hsla(0,0%,0%,.5);\n  opacity: 1;\n}\n\n.thumbnail.selected > .thumbnailSelectionRing {\n  background-color: hsla(0,0%,100%,.3);\n  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));\n  background-clip: padding-box;\n  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,\n              0 0 1px hsla(0,0%,100%,.1) inset,\n              0 0 1px hsla(0,0%,0%,.2);\n  color: hsla(0,0%,100%,1);\n}\n\n#outlineView,\n#attachmentsView {\n  position: absolute;\n  width: 192px;\n  top: 0;\n  bottom: 0;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n}\n\n#outlineView {\n  padding: 4px 4px 0;\n}\n#attachmentsView {\n  padding: 3px 4px 0;\n}\n\nhtml[dir='ltr'] .outlineItem > .outlineItems {\n  margin-left: 20px;\n}\n\nhtml[dir='rtl'] .outlineItem > .outlineItems {\n  margin-right: 20px;\n}\n\n.outlineItem > a,\n.attachmentsItem > button {\n  text-decoration: none;\n  display: inline-block;\n  min-width: 95%;\n  height: auto;\n  margin-bottom: 1px;\n  border-radius: 2px;\n  color: hsla(0,0%,100%,.8);\n  font-size: 13px;\n  line-height: 15px;\n  -moz-user-select: none;\n  white-space: normal;\n}\n\n.attachmentsItem > button {\n  border: 0 none;\n  background: none;\n  cursor: pointer;\n  width: 100%;\n}\n\nhtml[dir='ltr'] .outlineItem > a {\n  padding: 2px 0 5px 10px;\n}\nhtml[dir='ltr'] .attachmentsItem > button {\n  padding: 2px 0 3px 7px;\n  text-align: left;\n}\n\nhtml[dir='rtl'] .outlineItem > a {\n  padding: 2px 10px 5px 0;\n}\nhtml[dir='rtl'] .attachmentsItem > button {\n  padding: 2px 7px 3px 0;\n  text-align: right;\n}\n\n.outlineItem > a:hover,\n.attachmentsItem > button:hover {\n  background-color: hsla(0,0%,100%,.02);\n  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));\n  background-clip: padding-box;\n  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,\n              0 0 1px hsla(0,0%,100%,.2) inset,\n              0 0 1px hsla(0,0%,0%,.2);\n  color: hsla(0,0%,100%,.9);\n}\n\n.outlineItem.selected {\n  background-color: hsla(0,0%,100%,.08);\n  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));\n  background-clip: padding-box;\n  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,\n              0 0 1px hsla(0,0%,100%,.1) inset,\n              0 0 1px hsla(0,0%,0%,.2);\n  color: hsla(0,0%,100%,1);\n}\n\n.noResults {\n  font-size: 12px;\n  color: hsla(0,0%,100%,.8);\n  font-style: italic;\n  cursor: default;\n}\n\n.canvasWrapper {\n  overflow: hidden;\n}\n\ncanvas {\n  margin: 0;\n  display: block;\n}\n\n.page {\n  direction: ltr;\n  width: 816px;\n  height: 1056px;\n  margin: 1px auto -8px auto;\n  position: relative;\n  overflow: visible;\n  border: 9px solid transparent;\n  background-clip: content-box;\n  border-image: url(images/shadow.png) 9 9 repeat;\n  background-color: white;\n}\n\n.annotLink > a:hover {\n  opacity: 0.2;\n  background: #ff0;\n  box-shadow: 0px 2px 10px #ff0;\n}\n\n.loadingIcon {\n  position: absolute;\n  display: block;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  background: url('images/loading-icon.gif') center no-repeat;\n}\n\n.textLayer {\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  color: #000;\n  font-family: sans-serif;\n  overflow: hidden;\n}\n\n.textLayer > div {\n  color: transparent;\n  position: absolute;\n  white-space: pre;\n  cursor: text;\n}\n\n.textLayer .highlight {\n  margin: -1px;\n  padding: 1px;\n\n  background-color: rgba(180, 0, 170, 0.2);\n  border-radius: 4px;\n}\n\n.textLayer .highlight.begin {\n  border-radius: 4px 0px 0px 4px;\n}\n\n.textLayer .highlight.end {\n  border-radius: 0px 4px 4px 0px;\n}\n\n.textLayer .highlight.middle {\n  border-radius: 0px;\n}\n\n.textLayer .highlight.selected {\n  background-color: rgba(0, 100, 0, 0.2);\n}\n\n/* TODO: file FF bug to support ::-moz-selection:window-inactive\n   so we can override the opaque grey background when the window is inactive;\n   see https://bugzilla.mozilla.org/show_bug.cgi?id=706209 */\n::selection { background:rgba(0,0,255,0.3); }\n::-moz-selection { background:rgba(0,0,255,0.3); }\n\n.annotationHighlight {\n  position: absolute;\n  border: 2px #FFFF99 solid;\n}\n\n.annotText > img {\n  position: absolute;\n  cursor: pointer;\n}\n\n.annotTextContentWrapper {\n  position: absolute;\n  width: 20em;\n}\n\n.annotTextContent {\n  z-index: 200;\n  float: left;\n  max-width: 20em;\n  background-color: #FFFF99;\n  box-shadow: 0px 2px 5px #333;\n  border-radius: 2px;\n  padding: 0.6em;\n  cursor: pointer;\n}\n\n.annotTextContent > h1 {\n  font-size: 1em;\n  border-bottom: 1px solid #000000;\n  padding-bottom: 0.2em;\n}\n\n.annotTextContent > p {\n  padding-top: 0.2em;\n}\n\n.annotLink > a {\n  position: absolute;\n  font-size: 1em;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.annotLink > a /* -ms-a */ {\n  background: url(\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAA\\\n                   LAAAAAABAAEAAAIBRAA7\") 0 0 repeat;\n}\n\n#errorWrapper {\n  background: none repeat scroll 0 0 #FF5555;\n  color: white;\n  left: 0;\n  position: absolute;\n  right: 0;\n  z-index: 1000;\n  padding: 3px;\n  font-size: 0.8em;\n}\n.loadingInProgress #errorWrapper {\n  top: 39px;\n}\n\n#errorMessageLeft {\n  float: left;\n}\n\n#errorMessageRight {\n  float: right;\n}\n\n#errorMoreInfo {\n  background-color: #FFFFFF;\n  color: black;\n  padding: 3px;\n  margin: 3px;\n  width: 98%;\n}\n\n.overlayButton {\n  width: auto;\n  margin: 3px 4px 2px 4px !important;\n  padding: 2px 6px 3px 6px;\n}\n\n#overlayContainer {\n  display: table;\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  background-color: hsla(0,0%,0%,.2);\n  z-index: 40000;\n}\n#overlayContainer > * {\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n}\n\n#overlayContainer > .container {\n  display: table-cell;\n  vertical-align: middle;\n  text-align: center;\n}\n\n#overlayContainer > .container > .dialog {\n  display: inline-block;\n  padding: 15px;\n  border-spacing: 4px;\n  color: hsl(0,0%,85%);\n  font-size: 12px;\n  line-height: 14px;\n  background-color: #474747; /* fallback */\n  background-image: url(images/texture.png),\n                    linear-gradient(hsla(0,0%,32%,.99), hsla(0,0%,27%,.95));\n  box-shadow: inset 1px 0 0 hsla(0,0%,100%,.08),\n              inset 0 1px 1px hsla(0,0%,0%,.15),\n              inset 0 -1px 0 hsla(0,0%,100%,.05),\n              0 1px 0 hsla(0,0%,0%,.15),\n              0 1px 1px hsla(0,0%,0%,.1);\n  border: 1px solid hsla(0,0%,0%,.5);\n  border-radius: 4px;\n  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);\n}\n\n.dialog > .row {\n  display: table-row;\n}\n\n.dialog > .row > * {\n  display: table-cell;\n}\n\n.dialog .toolbarField {\n  margin: 5px 0;\n}\n.dialog .toolbarField:hover,\n.dialog .toolbarField:focus {\n  border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);\n}\n\n.dialog .separator {\n  display: block; \n  margin: 4px 0 4px 0;\n  height: 1px;\n  width: 100%;\n  background-color: hsla(0,0%,0%,.5);\n  box-shadow: 0 0 0 1px hsla(0,0%,100%,.08);\n}\n\n.dialog .buttonRow {\n  text-align: center;\n  vertical-align: middle;\n}\n\n#passwordOverlay > .dialog {\n  text-align: center;\n}\n#passwordOverlay .toolbarField {\n  width: 200px;\n}\n\n#documentPropertiesOverlay > .dialog {\n  text-align: left;\n}\n#documentPropertiesOverlay .row > * {\n  min-width: 100px;\n}\nhtml[dir='ltr'] #documentPropertiesOverlay .row > * {\n  text-align: left;\n}\nhtml[dir='rtl'] #documentPropertiesOverlay .row > * {\n  text-align: right;\n}\n#documentPropertiesOverlay .row > span {\n  width: 125px;\n  word-wrap: break-word;\n}\n#documentPropertiesOverlay .row > p {\n  max-width: 225px;\n  word-wrap: break-word;\n}\n#documentPropertiesOverlay .buttonRow {\n  margin-top: 10px;\n}\n\n.clearBoth {\n  clear: both;\n}\n\n.fileInput {\n  background: white;\n  color: black;\n  margin-top: 5px;\n  visibility: hidden;\n  position: fixed;\n  right: 0;\n  top: 0;\n}\n\n#PDFBug {\n  background: none repeat scroll 0 0 white;\n  border: 1px solid #666666;\n  position: fixed;\n  top: 32px;\n  right: 0;\n  bottom: 0;\n  font-size: 10px;\n  padding: 0;\n  width: 300px;\n}\n#PDFBug .controls {\n    background:#EEEEEE;\n    border-bottom: 1px solid #666666;\n    padding: 3px;\n}\n#PDFBug .panels {\n  bottom: 0;\n  left: 0;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n  position: absolute;\n  right: 0;\n  top: 27px;\n}\n#PDFBug button.active {\n  font-weight: bold;\n}\n.debuggerShowText {\n  background: none repeat scroll 0 0 yellow;\n  color: blue;\n  opacity: 0.3;\n}\n.debuggerHideText:hover {\n  background: none repeat scroll 0 0 yellow;\n  opacity: 0.3;\n}\n#PDFBug .stats {\n  font-family: courier;\n  font-size: 10px;\n  white-space: pre;\n}\n#PDFBug .stats .title {\n    font-weight: bold;\n}\n#PDFBug table {\n  font-size: 10px;\n}\n\n#viewer.textLayer-visible .textLayer > div,\n#viewer.textLayer-hover .textLayer > div:hover {\n  background-color: white;\n  color: black;\n}\n\n#viewer.textLayer-shadow .textLayer > div {\n  background-color: rgba(255,255,255, .6);\n  color: black;\n}\n\n.grab-to-pan-grab {\n  cursor: url(\"images/grab.cur\"), move !important;\n  cursor: -webkit-grab !important;\n  cursor: -moz-grab !important;\n  cursor: grab !important;\n}\n.grab-to-pan-grab *:not(input):not(textarea):not(button):not(select):not(:link) {\n  cursor: inherit !important;\n}\n.grab-to-pan-grab:active,\n.grab-to-pan-grabbing {\n  cursor: url(\"images/grabbing.cur\"), move !important;\n  cursor: -webkit-grabbing !important;\n  cursor: -moz-grabbing !important;\n  cursor: grabbing !important;\n\n  position: fixed;\n  background: transparent;\n  display: block;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  overflow: hidden;\n  z-index: 50000; /* should be higher than anything else in PDF.js! */\n}\n\n@page {\n  margin: 0;\n}\n\n#printContainer {\n  display: none;\n}\n\n@media screen and (min-resolution: 2dppx) {\n  /* Rules for Retina screens */\n  .toolbarButton::before {\n    -webkit-transform: scale(0.5);\n    transform: scale(0.5);\n    top: -5px;\n  }\n\n  .secondaryToolbarButton::before {\n    -webkit-transform: scale(0.5);\n    transform: scale(0.5);\n    top: -4px;\n  }\n\n  html[dir='ltr'] .toolbarButton::before,\n  html[dir='rtl'] .toolbarButton::before {\n    left: -1px;\n  }\n\n  html[dir='ltr'] .secondaryToolbarButton::before {\n    left: -2px;\n  }\n  html[dir='rtl'] .secondaryToolbarButton::before {\n    left: 186px;\n  }\n\n  .dropdownToolbarButton {\n    background: url(images/toolbarButton-menuArrows@2x.png) no-repeat;\n    background-size: 7px 16px;\n  }\n  \n  html[dir='ltr'] .toolbarButton#sidebarToggle::before {\n    content: url(images/toolbarButton-sidebarToggle@2x.png);\n  }\n  html[dir='rtl'] .toolbarButton#sidebarToggle::before {\n    content: url(images/toolbarButton-sidebarToggle-rtl@2x.png);\n  }\n\n  html[dir='ltr'] .toolbarButton#secondaryToolbarToggle::before {\n    content: url(images/toolbarButton-secondaryToolbarToggle@2x.png);\n  }\n  html[dir='rtl'] .toolbarButton#secondaryToolbarToggle::before {\n    content: url(images/toolbarButton-secondaryToolbarToggle-rtl@2x.png);\n  }\n\n  html[dir='ltr'] .toolbarButton.findPrevious::before {\n    content: url(images/findbarButton-previous@2x.png);\n  }\n  html[dir='rtl'] .toolbarButton.findPrevious::before {\n    content: url(images/findbarButton-previous-rtl@2x.png);\n  }\n\n  html[dir='ltr'] .toolbarButton.findNext::before {\n    content: url(images/findbarButton-next@2x.png);\n  }\n  html[dir='rtl'] .toolbarButton.findNext::before {\n    content: url(images/findbarButton-next-rtl@2x.png);\n  }\n\n  html[dir='ltr'] .toolbarButton.pageUp::before {\n    content: url(images/toolbarButton-pageUp@2x.png);\n  }\n  html[dir='rtl'] .toolbarButton.pageUp::before {\n    content: url(images/toolbarButton-pageUp-rtl@2x.png);\n  }\n\n  html[dir='ltr'] .toolbarButton.pageDown::before {\n    content: url(images/toolbarButton-pageDown@2x.png);\n  }\n  html[dir='rtl'] .toolbarButton.pageDown::before {\n    content: url(images/toolbarButton-pageDown-rtl@2x.png);\n  }\n\n  .toolbarButton.zoomIn::before {\n    content: url(images/toolbarButton-zoomIn@2x.png);\n  }\n\n  .toolbarButton.zoomOut::before {\n    content: url(images/toolbarButton-zoomOut@2x.png);\n  }\n\n  .toolbarButton.presentationMode::before,\n  .secondaryToolbarButton.presentationMode::before {\n    content: url(images/toolbarButton-presentationMode@2x.png);\n  }\n\n  .toolbarButton.print::before,\n  .secondaryToolbarButton.print::before {\n    content: url(images/toolbarButton-print@2x.png);\n  }\n\n  .toolbarButton.openFile::before,\n  .secondaryToolbarButton.openFile::before {\n    content: url(images/toolbarButton-openFile@2x.png);\n  }\n\n  .toolbarButton.download::before,\n  .secondaryToolbarButton.download::before {\n    content: url(images/toolbarButton-download@2x.png);\n  }\n\n  .toolbarButton.bookmark::before,\n  .secondaryToolbarButton.bookmark::before {\n    content: url(images/toolbarButton-bookmark@2x.png);\n  }\n\n  #viewThumbnail.toolbarButton::before {\n    content: url(images/toolbarButton-viewThumbnail@2x.png);\n  }\n\n  html[dir=\"ltr\"] #viewOutline.toolbarButton::before {\n    content: url(images/toolbarButton-viewOutline@2x.png);\n  }\n  html[dir=\"rtl\"] #viewOutline.toolbarButton::before {\n    content: url(images/toolbarButton-viewOutline-rtl@2x.png);\n  }\n\n  #viewAttachments.toolbarButton::before {\n    content: url(images/toolbarButton-viewAttachments@2x.png);\n  }\n\n  #viewFind.toolbarButton::before {\n    content: url(images/toolbarButton-search@2x.png);\n  }\n\n  .secondaryToolbarButton.firstPage::before {\n    content: url(images/secondaryToolbarButton-firstPage@2x.png);\n  }\n\n  .secondaryToolbarButton.lastPage::before {\n    content: url(images/secondaryToolbarButton-lastPage@2x.png);\n  }\n\n  .secondaryToolbarButton.rotateCcw::before {\n    content: url(images/secondaryToolbarButton-rotateCcw@2x.png);\n  }\n\n  .secondaryToolbarButton.rotateCw::before {\n    content: url(images/secondaryToolbarButton-rotateCw@2x.png);\n  }\n\n  .secondaryToolbarButton.handTool::before {\n    content: url(images/secondaryToolbarButton-handTool@2x.png);\n  }\n\n  .secondaryToolbarButton.documentProperties::before {\n    content: url(images/secondaryToolbarButton-documentProperties@2x.png);\n  }\n}\n\n@media print {\n  /* General rules for printing. */\n  body {\n    background: transparent none;\n  }\n\n  /* Rules for browsers that don't support mozPrintCallback. */\n  #sidebarContainer, #secondaryToolbar, .toolbar, #loadingBox, #errorWrapper, .textLayer {\n    display: none;\n  }\n  #viewerContainer {\n    overflow: visible;\n  }\n\n  #mainContainer, #viewerContainer, .page, .page canvas {\n    position: static;\n    padding: 0;\n    margin: 0;\n  }\n\n  .page {\n    float: left;\n    display: none;\n    border: none;\n    box-shadow: none;\n  }\n\n  .page[data-loaded] {\n    display: block;\n  }\n\n  .fileInput {\n    display: none;\n  }\n\n  /* Rules for browsers that support mozPrintCallback */\n  body[data-mozPrintCallback] #outerContainer {\n    display: none;\n  }\n  body[data-mozPrintCallback] #printContainer {\n    display: block;\n  }\n  #printContainer canvas {\n    position: relative;\n    top: 0;\n    left: 0;\n  }\n}\n\n.visibleLargeView,\n.visibleMediumView,\n.visibleSmallView {\n  display: none;\n}\n\n@media all and (max-width: 960px) {\n  html[dir='ltr'] #outerContainer.sidebarMoving .outerCenter,\n  html[dir='ltr'] #outerContainer.sidebarOpen .outerCenter {\n    float: left;\n    left: 205px;\n  }\n  html[dir='rtl'] #outerContainer.sidebarMoving .outerCenter,\n  html[dir='rtl'] #outerContainer.sidebarOpen .outerCenter {\n    float: right;\n    right: 205px;\n  }\n}\n\n@media all and (max-width: 900px) {\n  .sidebarOpen .hiddenLargeView {\n    display: none;\n  }\n  .sidebarOpen .visibleLargeView {\n    display: inherit;\n  }\n}\n\n@media all and (max-width: 860px) {\n  .sidebarOpen .hiddenMediumView {\n    display: none;\n  }\n  .sidebarOpen .visibleMediumView {\n    display: inherit;\n  }\n}\n\n@media all and (max-width: 770px) {\n  #sidebarContainer {\n    top: 32px;\n    z-index: 100;\n  }\n  .loadingInProgress #sidebarContainer {\n    top: 39px;\n  }\n  #sidebarContent {\n    top: 32px;\n    background-color: hsla(0,0%,0%,.7);\n  }\n\n  html[dir='ltr'] #outerContainer.sidebarOpen > #mainContainer {\n    left: 0px;\n  }\n  html[dir='rtl'] #outerContainer.sidebarOpen > #mainContainer {\n    right: 0px;\n  }\n\n  html[dir='ltr'] .outerCenter {\n    float: left;\n    left: 205px;\n  }\n  html[dir='rtl'] .outerCenter {\n    float: right;\n    right: 205px;\n  }\n\n  #outerContainer .hiddenLargeView,\n  #outerContainer .hiddenMediumView {\n    display: inherit;\n  }\n  #outerContainer .visibleLargeView,\n  #outerContainer .visibleMediumView {\n    display: none;\n  }\n}\n\n@media all and (max-width: 700px) {\n  #outerContainer .hiddenLargeView {\n    display: none;\n  }\n  #outerContainer .visibleLargeView {\n    display: inherit;\n  }\n}\n\n@media all and (max-width: 660px) {\n  #outerContainer .hiddenMediumView {\n    display: none;\n  }\n  #outerContainer .visibleMediumView {\n    display: inherit;\n  }\n}\n\n@media all and (max-width: 600px) {\n  .hiddenSmallView {\n    display: none;\n  }\n  .visibleSmallView {\n    display: inherit;\n  }\n  html[dir='ltr'] #outerContainer.sidebarMoving .outerCenter,\n  html[dir='ltr'] #outerContainer.sidebarOpen .outerCenter,\n  html[dir='ltr'] .outerCenter {\n    left: 156px;\n  }\n  html[dir='rtl'] #outerContainer.sidebarMoving .outerCenter,\n  html[dir='rtl'] #outerContainer.sidebarOpen .outerCenter,\n  html[dir='rtl'] .outerCenter {\n    right: 156px;\n  }\n  .toolbarButtonSpacer {\n    width: 0;\n  }\n}\n\n@media all and (max-width: 510px) {\n  #scaleSelectContainer, #pageNumberLabel {\n    display: none;\n  }\n}\n\n"
  },
  {
    "path": "web/viewer/viewer.js",
    "content": "/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */\n/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals PDFJS, PDFBug, FirefoxCom, Stats, Cache, PDFFindBar, CustomStyle,\n           PDFFindController, ProgressBar, TextLayerBuilder, DownloadManager,\n           getFileName, scrollIntoView, getPDFFileNameFromURL, PDFHistory,\n           Preferences, SidebarView, ViewHistory, PageView, ThumbnailView, URL,\n           noContextMenuHandler, SecondaryToolbar, PasswordPrompt,\n           PresentationMode, HandTool, Promise, DocumentProperties,\n           DocumentOutlineView, DocumentAttachmentsView, OverlayManager */\n\n'use strict';\n\nvar DEFAULT_URL = 'compressed.tracemonkey-pldi-09.pdf';\nvar DEFAULT_SCALE = 'auto';\nvar DEFAULT_SCALE_DELTA = 1.1;\nvar UNKNOWN_SCALE = 0;\nvar DEFAULT_CACHE_SIZE = 10;\nvar CSS_UNITS = 96.0 / 72.0;\nvar SCROLLBAR_PADDING = 40;\nvar VERTICAL_PADDING = 5;\nvar MAX_AUTO_SCALE = 1.25;\nvar MIN_SCALE = 0.25;\nvar MAX_SCALE = 10.0;\nvar VIEW_HISTORY_MEMORY = 20;\nvar SCALE_SELECT_CONTAINER_PADDING = 8;\nvar SCALE_SELECT_PADDING = 22;\nvar THUMBNAIL_SCROLL_MARGIN = -19;\nvar CLEANUP_TIMEOUT = 30000;\nvar IGNORE_CURRENT_POSITION_ON_ZOOM = false;\nvar RenderingStates = {\n  INITIAL: 0,\n  RUNNING: 1,\n  PAUSED: 2,\n  FINISHED: 3\n};\nvar FindStates = {\n  FIND_FOUND: 0,\n  FIND_NOTFOUND: 1,\n  FIND_WRAPPED: 2,\n  FIND_PENDING: 3\n};\n\nPDFJS.imageResourcesPath = './images/';\n  PDFJS.workerSrc = '../build/pdf.worker.js';\n  PDFJS.cMapUrl = '../web/cmaps/';\n  PDFJS.cMapPacked = true;\n\nvar mozL10n = document.mozL10n || document.webL10n;\n\n\n// optimised CSS custom property getter/setter\nvar CustomStyle = (function CustomStyleClosure() {\n\n  // As noted on: http://www.zachstronaut.com/posts/2009/02/17/\n  //              animate-css-transforms-firefox-webkit.html\n  // in some versions of IE9 it is critical that ms appear in this list\n  // before Moz\n  var prefixes = ['ms', 'Moz', 'Webkit', 'O'];\n  var _cache = {};\n\n  function CustomStyle() {}\n\n  CustomStyle.getProp = function get(propName, element) {\n    // check cache only when no element is given\n    if (arguments.length == 1 && typeof _cache[propName] == 'string') {\n      return _cache[propName];\n    }\n\n    element = element || document.documentElement;\n    var style = element.style, prefixed, uPropName;\n\n    // test standard property first\n    if (typeof style[propName] == 'string') {\n      return (_cache[propName] = propName);\n    }\n\n    // capitalize\n    uPropName = propName.charAt(0).toUpperCase() + propName.slice(1);\n\n    // test vendor specific properties\n    for (var i = 0, l = prefixes.length; i < l; i++) {\n      prefixed = prefixes[i] + uPropName;\n      if (typeof style[prefixed] == 'string') {\n        return (_cache[propName] = prefixed);\n      }\n    }\n\n    //if all fails then set to undefined\n    return (_cache[propName] = 'undefined');\n  };\n\n  CustomStyle.setProp = function set(propName, element, str) {\n    var prop = this.getProp(propName);\n    if (prop != 'undefined') {\n      element.style[prop] = str;\n    }\n  };\n\n  return CustomStyle;\n})();\n\nfunction getFileName(url) {\n  var anchor = url.indexOf('#');\n  var query = url.indexOf('?');\n  var end = Math.min(\n    anchor > 0 ? anchor : url.length,\n    query > 0 ? query : url.length);\n  return url.substring(url.lastIndexOf('/', end) + 1, end);\n}\n\n/**\n * Returns scale factor for the canvas. It makes sense for the HiDPI displays.\n * @return {Object} The object with horizontal (sx) and vertical (sy)\n                    scales. The scaled property is set to false if scaling is\n                    not required, true otherwise.\n */\nfunction getOutputScale(ctx) {\n  var devicePixelRatio = window.devicePixelRatio || 1;\n  var backingStoreRatio = ctx.webkitBackingStorePixelRatio ||\n                          ctx.mozBackingStorePixelRatio ||\n                          ctx.msBackingStorePixelRatio ||\n                          ctx.oBackingStorePixelRatio ||\n                          ctx.backingStorePixelRatio || 1;\n  var pixelRatio = devicePixelRatio / backingStoreRatio;\n  return {\n    sx: pixelRatio,\n    sy: pixelRatio,\n    scaled: pixelRatio != 1\n  };\n}\n\n/**\n * Scrolls specified element into view of its parent.\n * element {Object} The element to be visible.\n * spot {Object} An object with optional top and left properties,\n *               specifying the offset from the top left edge.\n */\nfunction scrollIntoView(element, spot) {\n  // Assuming offsetParent is available (it's not available when viewer is in\n  // hidden iframe or object). We have to scroll: if the offsetParent is not set\n  // producing the error. See also animationStartedClosure.\n  var parent = element.offsetParent;\n  var offsetY = element.offsetTop + element.clientTop;\n  var offsetX = element.offsetLeft + element.clientLeft;\n  if (!parent) {\n    console.error('offsetParent is not set -- cannot scroll');\n    return;\n  }\n  while (parent.clientHeight === parent.scrollHeight) {\n    if (parent.dataset._scaleY) {\n      offsetY /= parent.dataset._scaleY;\n      offsetX /= parent.dataset._scaleX;\n    }\n    offsetY += parent.offsetTop;\n    offsetX += parent.offsetLeft;\n    parent = parent.offsetParent;\n    if (!parent) {\n      return; // no need to scroll\n    }\n  }\n  if (spot) {\n    if (spot.top !== undefined) {\n      offsetY += spot.top;\n    }\n    if (spot.left !== undefined) {\n      offsetX += spot.left;\n      parent.scrollLeft = offsetX;\n    }\n  }\n  parent.scrollTop = offsetY;\n}\n\n/**\n * Event handler to suppress context menu.\n */\nfunction noContextMenuHandler(e) {\n  e.preventDefault();\n}\n\n/**\n * Returns the filename or guessed filename from the url (see issue 3455).\n * url {String} The original PDF location.\n * @return {String} Guessed PDF file name.\n */\nfunction getPDFFileNameFromURL(url) {\n  var reURI = /^(?:([^:]+:)?\\/\\/[^\\/]+)?([^?#]*)(\\?[^#]*)?(#.*)?$/;\n  //            SCHEME      HOST         1.PATH  2.QUERY   3.REF\n  // Pattern to get last matching NAME.pdf\n  var reFilename = /[^\\/?#=]+\\.pdf\\b(?!.*\\.pdf\\b)/i;\n  var splitURI = reURI.exec(url);\n  var suggestedFilename = reFilename.exec(splitURI[1]) ||\n                           reFilename.exec(splitURI[2]) ||\n                           reFilename.exec(splitURI[3]);\n  if (suggestedFilename) {\n    suggestedFilename = suggestedFilename[0];\n    if (suggestedFilename.indexOf('%') != -1) {\n      // URL-encoded %2Fpath%2Fto%2Ffile.pdf should be file.pdf\n      try {\n        suggestedFilename =\n          reFilename.exec(decodeURIComponent(suggestedFilename))[0];\n      } catch(e) { // Possible (extremely rare) errors:\n        // URIError \"Malformed URI\", e.g. for \"%AA.pdf\"\n        // TypeError \"null has no properties\", e.g. for \"%2F.pdf\"\n      }\n    }\n  }\n  return suggestedFilename || 'document.pdf';\n}\n\nvar ProgressBar = (function ProgressBarClosure() {\n\n  function clamp(v, min, max) {\n    return Math.min(Math.max(v, min), max);\n  }\n\n  function ProgressBar(id, opts) {\n\n    // Fetch the sub-elements for later.\n    this.div = document.querySelector(id + ' .progress');\n\n    // Get the loading bar element, so it can be resized to fit the viewer.\n    this.bar = this.div.parentNode;\n\n    // Get options, with sensible defaults.\n    this.height = opts.height || 100;\n    this.width = opts.width || 100;\n    this.units = opts.units || '%';\n\n    // Initialize heights.\n    this.div.style.height = this.height + this.units;\n    this.percent = 0;\n  }\n\n  ProgressBar.prototype = {\n\n    updateBar: function ProgressBar_updateBar() {\n      if (this._indeterminate) {\n        this.div.classList.add('indeterminate');\n        this.div.style.width = this.width + this.units;\n        return;\n      }\n\n      this.div.classList.remove('indeterminate');\n      var progressSize = this.width * this._percent / 100;\n      this.div.style.width = progressSize + this.units;\n    },\n\n    get percent() {\n      return this._percent;\n    },\n\n    set percent(val) {\n      this._indeterminate = isNaN(val);\n      this._percent = clamp(val, 0, 100);\n      this.updateBar();\n    },\n\n    setWidth: function ProgressBar_setWidth(viewer) {\n      if (viewer) {\n        var container = viewer.parentNode;\n        var scrollbarWidth = container.offsetWidth - viewer.offsetWidth;\n        if (scrollbarWidth > 0) {\n          this.bar.setAttribute('style', 'width: calc(100% - ' +\n                                         scrollbarWidth + 'px);');\n        }\n      }\n    },\n\n    hide: function ProgressBar_hide() {\n      this.bar.classList.add('hidden');\n      this.bar.removeAttribute('style');\n    }\n  };\n\n  return ProgressBar;\n})();\n\nvar Cache = function cacheCache(size) {\n  var data = [];\n  this.push = function cachePush(view) {\n    var i = data.indexOf(view);\n    if (i >= 0) {\n      data.splice(i, 1);\n    }\n    data.push(view);\n    if (data.length > size) {\n      data.shift().destroy();\n    }\n  };\n  this.resize = function (newSize) {\n    size = newSize;\n    while (data.length > size) {\n      data.shift().destroy();\n    }\n  };\n};\n\n\n\n\nvar DEFAULT_PREFERENCES = {\n  showPreviousViewOnLoad: true,\n  defaultZoomValue: '',\n  sidebarViewOnLoad: 0,\n  enableHandToolOnLoad: false,\n  enableWebGL: false,\n  disableRange: false,\n  disableAutoFetch: false,\n  disableFontFace: false,\n  disableTextLayer: false,\n  useOnlyCssZoom: false\n};\n\n\nvar SidebarView = {\n  NONE: 0,\n  THUMBS: 1,\n  OUTLINE: 2,\n  ATTACHMENTS: 3\n};\n\n/**\n * Preferences - Utility for storing persistent settings.\n *   Used for settings that should be applied to all opened documents,\n *   or every time the viewer is loaded.\n */\nvar Preferences = {\n  prefs: Object.create(DEFAULT_PREFERENCES),\n  isInitializedPromiseResolved: false,\n  initializedPromise: null,\n\n  /**\n   * Initialize and fetch the current preference values from storage.\n   * @return {Promise} A promise that is resolved when the preferences\n   *                   have been initialized.\n   */\n  initialize: function preferencesInitialize() {\n    return this.initializedPromise =\n        this._readFromStorage(DEFAULT_PREFERENCES).then(function(prefObj) {\n      this.isInitializedPromiseResolved = true;\n      if (prefObj) {\n        this.prefs = prefObj;\n      }\n    }.bind(this));\n  },\n\n  /**\n   * Stub function for writing preferences to storage.\n   * NOTE: This should be overridden by a build-specific function defined below.\n   * @param {Object} prefObj The preferences that should be written to storage.\n   * @return {Promise} A promise that is resolved when the preference values\n   *                   have been written.\n   */\n  _writeToStorage: function preferences_writeToStorage(prefObj) {\n    return Promise.resolve();\n  },\n\n  /**\n   * Stub function for reading preferences from storage.\n   * NOTE: This should be overridden by a build-specific function defined below.\n   * @param {Object} prefObj The preferences that should be read from storage.\n   * @return {Promise} A promise that is resolved with an {Object} containing\n   *                   the preferences that have been read.\n   */\n  _readFromStorage: function preferences_readFromStorage(prefObj) {\n    return Promise.resolve();\n  },\n\n  /**\n   * Reset the preferences to their default values and update storage.\n   * @return {Promise} A promise that is resolved when the preference values\n   *                   have been reset.\n   */\n  reset: function preferencesReset() {\n    return this.initializedPromise.then(function() {\n      this.prefs = Object.create(DEFAULT_PREFERENCES);\n      return this._writeToStorage(DEFAULT_PREFERENCES);\n    }.bind(this));\n  },\n\n  /**\n   * Replace the current preference values with the ones from storage.\n   * @return {Promise} A promise that is resolved when the preference values\n   *                   have been updated.\n   */\n  reload: function preferencesReload() {\n    return this.initializedPromise.then(function () {\n      this._readFromStorage(DEFAULT_PREFERENCES).then(function(prefObj) {\n        if (prefObj) {\n          this.prefs = prefObj;\n        }\n      }.bind(this));\n    }.bind(this));\n  },\n\n  /**\n   * Set the value of a preference.\n   * @param {string} name The name of the preference that should be changed.\n   * @param {boolean|number|string} value The new value of the preference.\n   * @return {Promise} A promise that is resolved when the value has been set,\n   *                   provided that the preference exists and the types match.\n   */\n  set: function preferencesSet(name, value) {\n    return this.initializedPromise.then(function () {\n      if (DEFAULT_PREFERENCES[name] === undefined) {\n        throw new Error('preferencesSet: \\'' + name + '\\' is undefined.');\n      } else if (value === undefined) {\n        throw new Error('preferencesSet: no value is specified.');\n      }\n      var valueType = typeof value;\n      var defaultType = typeof DEFAULT_PREFERENCES[name];\n\n      if (valueType !== defaultType) {\n        if (valueType === 'number' && defaultType === 'string') {\n          value = value.toString();\n        } else {\n          throw new Error('Preferences_set: \\'' + value + '\\' is a \\\"' +\n                          valueType + '\\\", expected \\\"' + defaultType + '\\\".');\n        }\n      } else {\n        if (valueType === 'number' && (value | 0) !== value) {\n          throw new Error('Preferences_set: \\'' + value +\n                          '\\' must be an \\\"integer\\\".');\n        }\n      }\n      this.prefs[name] = value;\n      return this._writeToStorage(this.prefs);\n    }.bind(this));\n  },\n\n  /**\n   * Get the value of a preference.\n   * @param {string} name The name of the preference whose value is requested.\n   * @return {Promise} A promise that is resolved with a {boolean|number|string}\n   *                   containing the value of the preference.\n   */\n  get: function preferencesGet(name) {\n    return this.initializedPromise.then(function () {\n      var defaultValue = DEFAULT_PREFERENCES[name];\n\n      if (defaultValue === undefined) {\n        throw new Error('preferencesGet: \\'' + name + '\\' is undefined.');\n      } else {\n        var prefValue = this.prefs[name];\n\n        if (prefValue !== undefined) {\n          return prefValue;\n        }\n      }\n      return defaultValue;\n    }.bind(this));\n  }\n};\n\n\nPreferences._writeToStorage = function (prefObj) {\n  return new Promise(function (resolve) {\n    localStorage.setItem('pdfjs.preferences', JSON.stringify(prefObj));\n    resolve();\n  });\n};\n\nPreferences._readFromStorage = function (prefObj) {\n  return new Promise(function (resolve) {\n    var readPrefs = JSON.parse(localStorage.getItem('pdfjs.preferences'));\n    resolve(readPrefs);\n  });\n};\n\n\n(function mozPrintCallbackPolyfillClosure() {\n  if ('mozPrintCallback' in document.createElement('canvas')) {\n    return;\n  }\n  // Cause positive result on feature-detection:\n  HTMLCanvasElement.prototype.mozPrintCallback = undefined;\n\n  var canvases;   // During print task: non-live NodeList of <canvas> elements\n  var index;      // Index of <canvas> element that is being processed\n\n  var print = window.print;\n  window.print = function print() {\n    if (canvases) {\n      console.warn('Ignored window.print() because of a pending print job.');\n      return;\n    }\n    try {\n      dispatchEvent('beforeprint');\n    } finally {\n      canvases = document.querySelectorAll('canvas');\n      index = -1;\n      next();\n    }\n  };\n\n  function dispatchEvent(eventType) {\n    var event = document.createEvent('CustomEvent');\n    event.initCustomEvent(eventType, false, false, 'custom');\n    window.dispatchEvent(event);\n  }\n\n  function next() {\n    if (!canvases) {\n      return; // Print task cancelled by user (state reset in abort())\n    }\n\n    renderProgress();\n    if (++index < canvases.length) {\n      var canvas = canvases[index];\n      if (typeof canvas.mozPrintCallback === 'function') {\n        canvas.mozPrintCallback({\n          context: canvas.getContext('2d'),\n          abort: abort,\n          done: next\n        });\n      } else {\n        next();\n      }\n    } else {\n      renderProgress();\n      print.call(window);\n      setTimeout(abort, 20); // Tidy-up\n    }\n  }\n\n  function abort() {\n    if (canvases) {\n      canvases = null;\n      renderProgress();\n      dispatchEvent('afterprint');\n    }\n  }\n\n  function renderProgress() {\n    var progressContainer = document.getElementById('mozPrintCallback-shim');\n    if (canvases) {\n      var progress = Math.round(100 * index / canvases.length);\n      var progressBar = progressContainer.querySelector('progress');\n      var progressPerc = progressContainer.querySelector('.relative-progress');\n      progressBar.value = progress;\n      progressPerc.textContent = progress + '%';\n      progressContainer.removeAttribute('hidden');\n      progressContainer.onclick = abort;\n    } else {\n      progressContainer.setAttribute('hidden', '');\n    }\n  }\n\n  var hasAttachEvent = !!document.attachEvent;\n\n  window.addEventListener('keydown', function(event) {\n    // Intercept Cmd/Ctrl + P in all browsers.\n    // Also intercept Cmd/Ctrl + Shift + P in Chrome and Opera\n    if (event.keyCode === 80/*P*/ && (event.ctrlKey || event.metaKey) &&\n        !event.altKey && (!event.shiftKey || window.chrome || window.opera)) {\n      window.print();\n      if (hasAttachEvent) {\n        // Only attachEvent can cancel Ctrl + P dialog in IE <=10\n        // attachEvent is gone in IE11, so the dialog will re-appear in IE11.\n        return;\n      }\n      event.preventDefault();\n      if (event.stopImmediatePropagation) {\n        event.stopImmediatePropagation();\n      } else {\n        event.stopPropagation();\n      }\n      return;\n    }\n    if (event.keyCode === 27 && canvases) { // Esc\n      abort();\n    }\n  }, true);\n  if (hasAttachEvent) {\n    document.attachEvent('onkeydown', function(event) {\n      event = event || window.event;\n      if (event.keyCode === 80/*P*/ && event.ctrlKey) {\n        event.keyCode = 0;\n        return false;\n      }\n    });\n  }\n\n  if ('onbeforeprint' in window) {\n    // Do not propagate before/afterprint events when they are not triggered\n    // from within this polyfill. (FF/IE).\n    var stopPropagationIfNeeded = function(event) {\n      if (event.detail !== 'custom' && event.stopImmediatePropagation) {\n        event.stopImmediatePropagation();\n      }\n    };\n    window.addEventListener('beforeprint', stopPropagationIfNeeded, false);\n    window.addEventListener('afterprint', stopPropagationIfNeeded, false);\n  }\n})();\n\n\n\nvar DownloadManager = (function DownloadManagerClosure() {\n\n  function download(blobUrl, filename) {\n    var a = document.createElement('a');\n    if (a.click) {\n      // Use a.click() if available. Otherwise, Chrome might show\n      // \"Unsafe JavaScript attempt to initiate a navigation change\n      //  for frame with URL\" and not open the PDF at all.\n      // Supported by (not mentioned = untested):\n      // - Firefox 6 - 19 (4- does not support a.click, 5 ignores a.click)\n      // - Chrome 19 - 26 (18- does not support a.click)\n      // - Opera 9 - 12.15\n      // - Internet Explorer 6 - 10\n      // - Safari 6 (5.1- does not support a.click)\n      a.href = blobUrl;\n      a.target = '_parent';\n      // Use a.download if available. This increases the likelihood that\n      // the file is downloaded instead of opened by another PDF plugin.\n      if ('download' in a) {\n        a.download = filename;\n      }\n      // <a> must be in the document for IE and recent Firefox versions.\n      // (otherwise .click() is ignored)\n      (document.body || document.documentElement).appendChild(a);\n      a.click();\n      a.parentNode.removeChild(a);\n    } else {\n      if (window.top === window &&\n          blobUrl.split('#')[0] === window.location.href.split('#')[0]) {\n        // If _parent == self, then opening an identical URL with different\n        // location hash will only cause a navigation, not a download.\n        var padCharacter = blobUrl.indexOf('?') === -1 ? '?' : '&';\n        blobUrl = blobUrl.replace(/#|$/, padCharacter + '$&');\n      }\n      window.open(blobUrl, '_parent');\n    }\n  }\n\n  function DownloadManager() {}\n\n  DownloadManager.prototype = {\n    downloadUrl: function DownloadManager_downloadUrl(url, filename) {\n      if (!PDFJS.isValidUrl(url, true)) {\n        return; // restricted/invalid URL\n      }\n\n      download(url + '#pdfjs.action=download', filename);\n    },\n\n    downloadData: function DownloadManager_downloadData(data, filename,\n                                                        contentType) {\n      if (navigator.msSaveBlob) { // IE10 and above\n        return navigator.msSaveBlob(new Blob([data], { type: contentType }),\n                                    filename);\n      }\n\n      var blobUrl = PDFJS.createObjectURL(data, contentType);\n      download(blobUrl, filename);\n    },\n\n    download: function DownloadManager_download(blob, url, filename) {\n      if (!URL) {\n        // URL.createObjectURL is not supported\n        this.downloadUrl(url, filename);\n        return;\n      }\n\n      if (navigator.msSaveBlob) {\n        // IE10 / IE11\n        if (!navigator.msSaveBlob(blob, filename)) {\n          this.downloadUrl(url, filename);\n        }\n        return;\n      }\n\n      var blobUrl = URL.createObjectURL(blob);\n      download(blobUrl, filename);\n    }\n  };\n\n  return DownloadManager;\n})();\n\n\n\n\nvar cache = new Cache(DEFAULT_CACHE_SIZE);\nvar currentPageNumber = 1;\n\n\n/**\n * View History - This is a utility for saving various view parameters for\n *                recently opened files.\n *\n * The way that the view parameters are stored depends on how PDF.js is built,\n * for 'node make <flag>' the following cases exist:\n *  - FIREFOX or MOZCENTRAL - uses sessionStorage.\n *  - B2G                   - uses asyncStorage.\n *  - GENERIC or CHROME     - uses localStorage, if it is available.\n */\nvar ViewHistory = (function ViewHistoryClosure() {\n  function ViewHistory(fingerprint) {\n    this.fingerprint = fingerprint;\n    this.isInitializedPromiseResolved = false;\n    this.initializedPromise =\n        this._readFromStorage().then(function (databaseStr) {\n      this.isInitializedPromiseResolved = true;\n\n      var database = JSON.parse(databaseStr || '{}');\n      if (!('files' in database)) {\n        database.files = [];\n      }\n      if (database.files.length >= VIEW_HISTORY_MEMORY) {\n        database.files.shift();\n      }\n      var index;\n      for (var i = 0, length = database.files.length; i < length; i++) {\n        var branch = database.files[i];\n        if (branch.fingerprint === this.fingerprint) {\n          index = i;\n          break;\n        }\n      }\n      if (typeof index !== 'number') {\n        index = database.files.push({fingerprint: this.fingerprint}) - 1;\n      }\n      this.file = database.files[index];\n      this.database = database;\n    }.bind(this));\n  }\n\n  ViewHistory.prototype = {\n    _writeToStorage: function ViewHistory_writeToStorage() {\n      return new Promise(function (resolve) {\n        var databaseStr = JSON.stringify(this.database);\n\n\n\n        localStorage.setItem('database', databaseStr);\n        resolve();\n      }.bind(this));\n    },\n\n    _readFromStorage: function ViewHistory_readFromStorage() {\n      return new Promise(function (resolve) {\n\n\n        resolve(localStorage.getItem('database'));\n      });\n    },\n\n    set: function ViewHistory_set(name, val) {\n      if (!this.isInitializedPromiseResolved) {\n        return;\n      }\n      this.file[name] = val;\n      return this._writeToStorage();\n    },\n\n    setMultiple: function ViewHistory_setMultiple(properties) {\n      if (!this.isInitializedPromiseResolved) {\n        return;\n      }\n      for (var name in properties) {\n        this.file[name] = properties[name];\n      }\n      return this._writeToStorage();\n    },\n\n    get: function ViewHistory_get(name, defaultValue) {\n      if (!this.isInitializedPromiseResolved) {\n        return defaultValue;\n      }\n      return this.file[name] || defaultValue;\n    }\n  };\n\n  return ViewHistory;\n})();\n\n\n/**\n * Creates a \"search bar\" given set of DOM elements\n * that act as controls for searching, or for setting\n * search preferences in the UI. This object also sets\n * up the appropriate events for the controls. Actual\n * searching is done by PDFFindController\n */\nvar PDFFindBar = {\n  opened: false,\n  bar: null,\n  toggleButton: null,\n  findField: null,\n  highlightAll: null,\n  caseSensitive: null,\n  findMsg: null,\n  findStatusIcon: null,\n  findPreviousButton: null,\n  findNextButton: null,\n\n  initialize: function(options) {\n    if(typeof PDFFindController === 'undefined' || PDFFindController === null) {\n      throw 'PDFFindBar cannot be initialized ' +\n            'without a PDFFindController instance.';\n    }\n\n    this.bar = options.bar;\n    this.toggleButton = options.toggleButton;\n    this.findField = options.findField;\n    this.highlightAll = options.highlightAllCheckbox;\n    this.caseSensitive = options.caseSensitiveCheckbox;\n    this.findMsg = options.findMsg;\n    this.findStatusIcon = options.findStatusIcon;\n    this.findPreviousButton = options.findPreviousButton;\n    this.findNextButton = options.findNextButton;\n\n    var self = this;\n    this.toggleButton.addEventListener('click', function() {\n      self.toggle();\n    });\n\n    this.findField.addEventListener('input', function() {\n      self.dispatchEvent('');\n    });\n\n    this.bar.addEventListener('keydown', function(evt) {\n      switch (evt.keyCode) {\n        case 13: // Enter\n          if (evt.target === self.findField) {\n            self.dispatchEvent('again', evt.shiftKey);\n          }\n          break;\n        case 27: // Escape\n          self.close();\n          break;\n      }\n    });\n\n    this.findPreviousButton.addEventListener('click',\n      function() { self.dispatchEvent('again', true); }\n    );\n\n    this.findNextButton.addEventListener('click', function() {\n      self.dispatchEvent('again', false);\n    });\n\n    this.highlightAll.addEventListener('click', function() {\n      self.dispatchEvent('highlightallchange');\n    });\n\n    this.caseSensitive.addEventListener('click', function() {\n      self.dispatchEvent('casesensitivitychange');\n    });\n  },\n\n  dispatchEvent: function(aType, aFindPrevious) {\n    var event = document.createEvent('CustomEvent');\n    event.initCustomEvent('find' + aType, true, true, {\n      query: this.findField.value,\n      caseSensitive: this.caseSensitive.checked,\n      highlightAll: this.highlightAll.checked,\n      findPrevious: aFindPrevious\n    });\n    return window.dispatchEvent(event);\n  },\n\n  updateUIState: function(state, previous) {\n    var notFound = false;\n    var findMsg = '';\n    var status = '';\n\n    switch (state) {\n      case FindStates.FIND_FOUND:\n        break;\n\n      case FindStates.FIND_PENDING:\n        status = 'pending';\n        break;\n\n      case FindStates.FIND_NOTFOUND:\n        findMsg = mozL10n.get('find_not_found', null, 'Phrase not found');\n        notFound = true;\n        break;\n\n      case FindStates.FIND_WRAPPED:\n        if (previous) {\n          findMsg = mozL10n.get('find_reached_top', null,\n                      'Reached top of document, continued from bottom');\n        } else {\n          findMsg = mozL10n.get('find_reached_bottom', null,\n                                'Reached end of document, continued from top');\n        }\n        break;\n    }\n\n    if (notFound) {\n      this.findField.classList.add('notFound');\n    } else {\n      this.findField.classList.remove('notFound');\n    }\n\n    this.findField.setAttribute('data-status', status);\n    this.findMsg.textContent = findMsg;\n  },\n\n  open: function() {\n    if (!this.opened) {\n      this.opened = true;\n      this.toggleButton.classList.add('toggled');\n      this.bar.classList.remove('hidden');\n    }\n\n    this.findField.select();\n    this.findField.focus();\n  },\n\n  close: function() {\n    if (!this.opened) {\n      return;\n    }\n    this.opened = false;\n    this.toggleButton.classList.remove('toggled');\n    this.bar.classList.add('hidden');\n\n    PDFFindController.active = false;\n  },\n\n  toggle: function() {\n    if (this.opened) {\n      this.close();\n    } else {\n      this.open();\n    }\n  }\n};\n\n\n\n/**\n * Provides a \"search\" or \"find\" functionality for the PDF.\n * This object actually performs the search for a given string.\n */\n\nvar PDFFindController = {\n  startedTextExtraction: false,\n  extractTextPromises: [],\n  pendingFindMatches: {},\n  active: false, // If active, find results will be highlighted.\n  pageContents: [], // Stores the text for each page.\n  pageMatches: [],\n  selected: { // Currently selected match.\n    pageIdx: -1,\n    matchIdx: -1\n  },\n  offset: { // Where the find algorithm currently is in the document.\n    pageIdx: null,\n    matchIdx: null\n  },\n  resumePageIdx: null,\n  state: null,\n  dirtyMatch: false,\n  findTimeout: null,\n  pdfPageSource: null,\n  integratedFind: false,\n  charactersToNormalize: {\n    '\\u2018': '\\'', // Left single quotation mark\n    '\\u2019': '\\'', // Right single quotation mark\n    '\\u201A': '\\'', // Single low-9 quotation mark\n    '\\u201B': '\\'', // Single high-reversed-9 quotation mark\n    '\\u201C': '\"', // Left double quotation mark\n    '\\u201D': '\"', // Right double quotation mark\n    '\\u201E': '\"', // Double low-9 quotation mark\n    '\\u201F': '\"', // Double high-reversed-9 quotation mark\n    '\\u00BC': '1/4', // Vulgar fraction one quarter\n    '\\u00BD': '1/2', // Vulgar fraction one half\n    '\\u00BE': '3/4' // Vulgar fraction three quarters\n  },\n\n  initialize: function(options) {\n    if (typeof PDFFindBar === 'undefined' || PDFFindBar === null) {\n      throw 'PDFFindController cannot be initialized ' +\n            'without a PDFFindBar instance';\n    }\n\n    this.pdfPageSource = options.pdfPageSource;\n    this.integratedFind = options.integratedFind;\n\n    // Compile the regular expression for text normalization once\n    var replace = Object.keys(this.charactersToNormalize).join('');\n    this.normalizationRegex = new RegExp('[' + replace + ']', 'g');\n\n    var events = [\n      'find',\n      'findagain',\n      'findhighlightallchange',\n      'findcasesensitivitychange'\n    ];\n\n    this.firstPagePromise = new Promise(function (resolve) {\n      this.resolveFirstPage = resolve;\n    }.bind(this));\n    this.handleEvent = this.handleEvent.bind(this);\n\n    for (var i = 0, len = events.length; i < len; i++) {\n      window.addEventListener(events[i], this.handleEvent);\n    }\n  },\n\n  reset: function pdfFindControllerReset() {\n    this.startedTextExtraction = false;\n    this.extractTextPromises = [];\n    this.active = false;\n  },\n\n  normalize: function pdfFindControllerNormalize(text) {\n    return text.replace(this.normalizationRegex, function (ch) {\n      return PDFFindController.charactersToNormalize[ch];\n    });\n  },\n\n  calcFindMatch: function(pageIndex) {\n    var pageContent = this.normalize(this.pageContents[pageIndex]);\n    var query = this.normalize(this.state.query);\n    var caseSensitive = this.state.caseSensitive;\n    var queryLen = query.length;\n\n    if (queryLen === 0) {\n      // Do nothing: the matches should be wiped out already.\n      return;\n    }\n\n    if (!caseSensitive) {\n      pageContent = pageContent.toLowerCase();\n      query = query.toLowerCase();\n    }\n\n    var matches = [];\n    var matchIdx = -queryLen;\n    while (true) {\n      matchIdx = pageContent.indexOf(query, matchIdx + queryLen);\n      if (matchIdx === -1) {\n        break;\n      }\n      matches.push(matchIdx);\n    }\n    this.pageMatches[pageIndex] = matches;\n    this.updatePage(pageIndex);\n    if (this.resumePageIdx === pageIndex) {\n      this.resumePageIdx = null;\n      this.nextPageMatch();\n    }\n  },\n\n  extractText: function() {\n    if (this.startedTextExtraction) {\n      return;\n    }\n    this.startedTextExtraction = true;\n\n    this.pageContents = [];\n    var extractTextPromisesResolves = [];\n    var numPages = this.pdfPageSource.pdfDocument.numPages;\n    for (var i = 0; i < numPages; i++) {\n      this.extractTextPromises.push(new Promise(function (resolve) {\n        extractTextPromisesResolves.push(resolve);\n      }));\n    }\n\n    var self = this;\n    function extractPageText(pageIndex) {\n      self.pdfPageSource.pages[pageIndex].getTextContent().then(\n        function textContentResolved(textContent) {\n          var textItems = textContent.items;\n          var str = [];\n\n          for (var i = 0, len = textItems.length; i < len; i++) {\n            str.push(textItems[i].str);\n          }\n\n          // Store the pageContent as a string.\n          self.pageContents.push(str.join(''));\n\n          extractTextPromisesResolves[pageIndex](pageIndex);\n          if ((pageIndex + 1) < self.pdfPageSource.pages.length) {\n            extractPageText(pageIndex + 1);\n          }\n        }\n      );\n    }\n    extractPageText(0);\n  },\n\n  handleEvent: function(e) {\n    if (this.state === null || e.type !== 'findagain') {\n      this.dirtyMatch = true;\n    }\n    this.state = e.detail;\n    this.updateUIState(FindStates.FIND_PENDING);\n\n    this.firstPagePromise.then(function() {\n      this.extractText();\n\n      clearTimeout(this.findTimeout);\n      if (e.type === 'find') {\n        // Only trigger the find action after 250ms of silence.\n        this.findTimeout = setTimeout(this.nextMatch.bind(this), 250);\n      } else {\n        this.nextMatch();\n      }\n    }.bind(this));\n  },\n\n  updatePage: function(idx) {\n    var page = this.pdfPageSource.pages[idx];\n\n    if (this.selected.pageIdx === idx) {\n      // If the page is selected, scroll the page into view, which triggers\n      // rendering the page, which adds the textLayer. Once the textLayer is\n      // build, it will scroll onto the selected match.\n      page.scrollIntoView();\n    }\n\n    if (page.textLayer) {\n      page.textLayer.updateMatches();\n    }\n  },\n\n  nextMatch: function() {\n    var previous = this.state.findPrevious;\n    var currentPageIndex = this.pdfPageSource.page - 1;\n    var numPages = this.pdfPageSource.pages.length;\n\n    this.active = true;\n\n    if (this.dirtyMatch) {\n      // Need to recalculate the matches, reset everything.\n      this.dirtyMatch = false;\n      this.selected.pageIdx = this.selected.matchIdx = -1;\n      this.offset.pageIdx = currentPageIndex;\n      this.offset.matchIdx = null;\n      this.hadMatch = false;\n      this.resumePageIdx = null;\n      this.pageMatches = [];\n      var self = this;\n\n      for (var i = 0; i < numPages; i++) {\n        // Wipe out any previous highlighted matches.\n        this.updatePage(i);\n\n        // As soon as the text is extracted start finding the matches.\n        if (!(i in this.pendingFindMatches)) {\n          this.pendingFindMatches[i] = true;\n          this.extractTextPromises[i].then(function(pageIdx) {\n            delete self.pendingFindMatches[pageIdx];\n            self.calcFindMatch(pageIdx);\n          });\n        }\n      }\n    }\n\n    // If there's no query there's no point in searching.\n    if (this.state.query === '') {\n      this.updateUIState(FindStates.FIND_FOUND);\n      return;\n    }\n\n    // If we're waiting on a page, we return since we can't do anything else.\n    if (this.resumePageIdx) {\n      return;\n    }\n\n    var offset = this.offset;\n    // If there's already a matchIdx that means we are iterating through a\n    // page's matches.\n    if (offset.matchIdx !== null) {\n      var numPageMatches = this.pageMatches[offset.pageIdx].length;\n      if ((!previous && offset.matchIdx + 1 < numPageMatches) ||\n          (previous && offset.matchIdx > 0)) {\n        // The simple case; we just have advance the matchIdx to select\n        // the next match on the page.\n        this.hadMatch = true;\n        offset.matchIdx = (previous ? offset.matchIdx - 1 :\n                                      offset.matchIdx + 1);\n        this.updateMatch(true);\n        return;\n      }\n      // We went beyond the current page's matches, so we advance to\n      // the next page.\n      this.advanceOffsetPage(previous);\n    }\n    // Start searching through the page.\n    this.nextPageMatch();\n  },\n\n  matchesReady: function(matches) {\n    var offset = this.offset;\n    var numMatches = matches.length;\n    var previous = this.state.findPrevious;\n    if (numMatches) {\n      // There were matches for the page, so initialize the matchIdx.\n      this.hadMatch = true;\n      offset.matchIdx = (previous ? numMatches - 1 : 0);\n      this.updateMatch(true);\n      return true;\n    } else {\n      // No matches, so attempt to search the next page.\n      this.advanceOffsetPage(previous);\n      if (offset.wrapped) {\n        offset.matchIdx = null;\n        if (!this.hadMatch) {\n          // No point in wrapping, there were no matches.\n          this.updateMatch(false);\n          // while matches were not found, searching for a page \n          // with matches should nevertheless halt.\n          return true;\n        }\n      }\n      // Matches were not found (and searching is not done).\n      return false;\n    }\n  },\n\n  nextPageMatch: function() {\n    if (this.resumePageIdx !== null) {\n      console.error('There can only be one pending page.');\n    }\n    do {\n      var pageIdx = this.offset.pageIdx;\n      var matches = this.pageMatches[pageIdx];\n      if (!matches) {\n        // The matches don't exist yet for processing by \"matchesReady\",\n        // so set a resume point for when they do exist.\n        this.resumePageIdx = pageIdx;\n        break;\n      }\n    } while (!this.matchesReady(matches));\n  },\n\n  advanceOffsetPage: function(previous) {\n    var offset = this.offset;\n    var numPages = this.extractTextPromises.length;\n    offset.pageIdx = (previous ? offset.pageIdx - 1 : offset.pageIdx + 1);\n    offset.matchIdx = null;\n    if (offset.pageIdx >= numPages || offset.pageIdx < 0) {\n      offset.pageIdx = (previous ? numPages - 1 : 0);\n      offset.wrapped = true;\n      return;\n    }\n  },\n\n  updateMatch: function(found) {\n    var state = FindStates.FIND_NOTFOUND;\n    var wrapped = this.offset.wrapped;\n    this.offset.wrapped = false;\n    if (found) {\n      var previousPage = this.selected.pageIdx;\n      this.selected.pageIdx = this.offset.pageIdx;\n      this.selected.matchIdx = this.offset.matchIdx;\n      state = (wrapped ? FindStates.FIND_WRAPPED : FindStates.FIND_FOUND);\n      // Update the currently selected page to wipe out any selected matches.\n      if (previousPage !== -1 && previousPage !== this.selected.pageIdx) {\n        this.updatePage(previousPage);\n      }\n    }\n    this.updateUIState(state, this.state.findPrevious);\n    if (this.selected.pageIdx !== -1) {\n      this.updatePage(this.selected.pageIdx, true);\n    }\n  },\n\n  updateUIState: function(state, previous) {\n    if (this.integratedFind) {\n      FirefoxCom.request('updateFindControlState',\n                         { result: state, findPrevious: previous });\n      return;\n    }\n    PDFFindBar.updateUIState(state, previous);\n  }\n};\n\n\n\nvar PDFHistory = {\n  initialized: false,\n  initialDestination: null,\n\n  initialize: function pdfHistoryInitialize(fingerprint) {\n    if (PDFJS.disableHistory || PDFView.isViewerEmbedded) {\n      // The browsing history is only enabled when the viewer is standalone,\n      // i.e. not when it is embedded in a web page.\n      return;\n    }\n    this.initialized = true;\n    this.reInitialized = false;\n    this.allowHashChange = true;\n    this.historyUnlocked = true;\n\n    this.previousHash = window.location.hash.substring(1);\n    this.currentBookmark = '';\n    this.currentPage = 0;\n    this.updatePreviousBookmark = false;\n    this.previousBookmark = '';\n    this.previousPage = 0;\n    this.nextHashParam = '';\n\n    this.fingerprint = fingerprint;\n    this.currentUid = this.uid = 0;\n    this.current = {};\n\n    var state = window.history.state;\n    if (this._isStateObjectDefined(state)) {\n      // This corresponds to navigating back to the document\n      // from another page in the browser history.\n      if (state.target.dest) {\n        this.initialDestination = state.target.dest;\n      } else {\n        PDFView.initialBookmark = state.target.hash;\n      }\n      this.currentUid = state.uid;\n      this.uid = state.uid + 1;\n      this.current = state.target;\n    } else {\n      // This corresponds to the loading of a new document.\n      if (state && state.fingerprint &&\n          this.fingerprint !== state.fingerprint) {\n        // Reinitialize the browsing history when a new document\n        // is opened in the web viewer.\n        this.reInitialized = true;\n      }\n      this._pushOrReplaceState({ fingerprint: this.fingerprint }, true);\n    }\n\n    var self = this;\n    window.addEventListener('popstate', function pdfHistoryPopstate(evt) {\n      evt.preventDefault();\n      evt.stopPropagation();\n\n      if (!self.historyUnlocked) {\n        return;\n      }\n      if (evt.state) {\n        // Move back/forward in the history.\n        self._goTo(evt.state);\n      } else {\n        // Handle the user modifying the hash of a loaded document.\n        self.previousHash = window.location.hash.substring(1);\n\n        // If the history is empty when the hash changes,\n        // update the previous entry in the browser history.\n        if (self.uid === 0) {\n          var previousParams = (self.previousHash && self.currentBookmark &&\n                                self.previousHash !== self.currentBookmark) ?\n            { hash: self.currentBookmark, page: self.currentPage } :\n            { page: 1 };\n          self.historyUnlocked = false;\n          self.allowHashChange = false;\n          window.history.back();\n          self._pushToHistory(previousParams, false, true);\n          window.history.forward();\n          self.historyUnlocked = true;\n        }\n        self._pushToHistory({ hash: self.previousHash }, false, true);\n        self._updatePreviousBookmark();\n      }\n    }, false);\n\n    function pdfHistoryBeforeUnload() {\n      var previousParams = self._getPreviousParams(null, true);\n      if (previousParams) {\n        var replacePrevious = (!self.current.dest &&\n                               self.current.hash !== self.previousHash);\n        self._pushToHistory(previousParams, false, replacePrevious);\n        self._updatePreviousBookmark();\n      }\n      // Remove the event listener when navigating away from the document,\n      // since 'beforeunload' prevents Firefox from caching the document.\n      window.removeEventListener('beforeunload', pdfHistoryBeforeUnload, false);\n    }\n    window.addEventListener('beforeunload', pdfHistoryBeforeUnload, false);\n\n    window.addEventListener('pageshow', function pdfHistoryPageShow(evt) {\n      // If the entire viewer (including the PDF file) is cached in the browser,\n      // we need to reattach the 'beforeunload' event listener since\n      // the 'DOMContentLoaded' event is not fired on 'pageshow'.\n      window.addEventListener('beforeunload', pdfHistoryBeforeUnload, false);\n    }, false);\n  },\n\n  _isStateObjectDefined: function pdfHistory_isStateObjectDefined(state) {\n    return (state && state.uid >= 0 &&\n            state.fingerprint && this.fingerprint === state.fingerprint &&\n            state.target && state.target.hash) ? true : false;\n  },\n\n  _pushOrReplaceState: function pdfHistory_pushOrReplaceState(stateObj,\n                                                              replace) {\n    if (replace) {\n      window.history.replaceState(stateObj, '', document.URL);\n    } else {\n      window.history.pushState(stateObj, '', document.URL);\n    }\n  },\n\n  get isHashChangeUnlocked() {\n    if (!this.initialized) {\n      return true;\n    }\n    // If the current hash changes when moving back/forward in the history,\n    // this will trigger a 'popstate' event *as well* as a 'hashchange' event.\n    // Since the hash generally won't correspond to the exact the position\n    // stored in the history's state object, triggering the 'hashchange' event\n    // can thus corrupt the browser history.\n    //\n    // When the hash changes during a 'popstate' event, we *only* prevent the\n    // first 'hashchange' event and immediately reset allowHashChange.\n    // If it is not reset, the user would not be able to change the hash.\n\n    var temp = this.allowHashChange;\n    this.allowHashChange = true;\n    return temp;\n  },\n\n  _updatePreviousBookmark: function pdfHistory_updatePreviousBookmark() {\n    if (this.updatePreviousBookmark &&\n        this.currentBookmark && this.currentPage) {\n      this.previousBookmark = this.currentBookmark;\n      this.previousPage = this.currentPage;\n      this.updatePreviousBookmark = false;\n    }\n  },\n\n  updateCurrentBookmark: function pdfHistoryUpdateCurrentBookmark(bookmark,\n                                                                  pageNum) {\n    if (this.initialized) {\n      this.currentBookmark = bookmark.substring(1);\n      this.currentPage = pageNum | 0;\n      this._updatePreviousBookmark();\n    }\n  },\n\n  updateNextHashParam: function pdfHistoryUpdateNextHashParam(param) {\n    if (this.initialized) {\n      this.nextHashParam = param;\n    }\n  },\n\n  push: function pdfHistoryPush(params, isInitialBookmark) {\n    if (!(this.initialized && this.historyUnlocked)) {\n      return;\n    }\n    if (params.dest && !params.hash) {\n      params.hash = (this.current.hash && this.current.dest &&\n                     this.current.dest === params.dest) ?\n        this.current.hash :\n        PDFView.getDestinationHash(params.dest).split('#')[1];\n    }\n    if (params.page) {\n      params.page |= 0;\n    }\n    if (isInitialBookmark) {\n      var target = window.history.state.target;\n      if (!target) {\n        // Invoked when the user specifies an initial bookmark,\n        // thus setting PDFView.initialBookmark, when the document is loaded.\n        this._pushToHistory(params, false);\n        this.previousHash = window.location.hash.substring(1);\n      }\n      this.updatePreviousBookmark = this.nextHashParam ? false : true;\n      if (target) {\n        // If the current document is reloaded,\n        // avoid creating duplicate entries in the history.\n        this._updatePreviousBookmark();\n      }\n      return;\n    }\n    if (this.nextHashParam) {\n      if (this.nextHashParam === params.hash) {\n        this.nextHashParam = null;\n        this.updatePreviousBookmark = true;\n        return;\n      } else {\n        this.nextHashParam = null;\n      }\n    }\n\n    if (params.hash) {\n      if (this.current.hash) {\n        if (this.current.hash !== params.hash) {\n          this._pushToHistory(params, true);\n        } else {\n          if (!this.current.page && params.page) {\n            this._pushToHistory(params, false, true);\n          }\n          this.updatePreviousBookmark = true;\n        }\n      } else {\n        this._pushToHistory(params, true);\n      }\n    } else if (this.current.page && params.page &&\n               this.current.page !== params.page) {\n      this._pushToHistory(params, true);\n    }\n  },\n\n  _getPreviousParams: function pdfHistory_getPreviousParams(onlyCheckPage,\n                                                            beforeUnload) {\n    if (!(this.currentBookmark && this.currentPage)) {\n      return null;\n    } else if (this.updatePreviousBookmark) {\n      this.updatePreviousBookmark = false;\n    }\n    if (this.uid > 0 && !(this.previousBookmark && this.previousPage)) {\n      // Prevent the history from getting stuck in the current state,\n      // effectively preventing the user from going back/forward in the history.\n      //\n      // This happens if the current position in the document didn't change when\n      // the history was previously updated. The reasons for this are either:\n      // 1. The current zoom value is such that the document does not need to,\n      //    or cannot, be scrolled to display the destination.\n      // 2. The previous destination is broken, and doesn't actally point to a\n      //    position within the document.\n      //    (This is either due to a bad PDF generator, or the user making a\n      //     mistake when entering a destination in the hash parameters.)\n      return null;\n    }\n    if ((!this.current.dest && !onlyCheckPage) || beforeUnload) {\n      if (this.previousBookmark === this.currentBookmark) {\n        return null;\n      }\n    } else if (this.current.page || onlyCheckPage) {\n      if (this.previousPage === this.currentPage) {\n        return null;\n      }\n    } else {\n      return null;\n    }\n    var params = { hash: this.currentBookmark, page: this.currentPage };\n    if (PresentationMode.active) {\n      params.hash = null;\n    }\n    return params;\n  },\n\n  _stateObj: function pdfHistory_stateObj(params) {\n    return { fingerprint: this.fingerprint, uid: this.uid, target: params };\n  },\n\n  _pushToHistory: function pdfHistory_pushToHistory(params,\n                                                    addPrevious, overwrite) {\n    if (!this.initialized) {\n      return;\n    }\n    if (!params.hash && params.page) {\n      params.hash = ('page=' + params.page);\n    }\n    if (addPrevious && !overwrite) {\n      var previousParams = this._getPreviousParams();\n      if (previousParams) {\n        var replacePrevious = (!this.current.dest &&\n                               this.current.hash !== this.previousHash);\n        this._pushToHistory(previousParams, false, replacePrevious);\n      }\n    }\n    this._pushOrReplaceState(this._stateObj(params),\n                             (overwrite || this.uid === 0));\n    this.currentUid = this.uid++;\n    this.current = params;\n    this.updatePreviousBookmark = true;\n  },\n\n  _goTo: function pdfHistory_goTo(state) {\n    if (!(this.initialized && this.historyUnlocked &&\n          this._isStateObjectDefined(state))) {\n      return;\n    }\n    if (!this.reInitialized && state.uid < this.currentUid) {\n      var previousParams = this._getPreviousParams(true);\n      if (previousParams) {\n        this._pushToHistory(this.current, false);\n        this._pushToHistory(previousParams, false);\n        this.currentUid = state.uid;\n        window.history.back();\n        return;\n      }\n    }\n    this.historyUnlocked = false;\n\n    if (state.target.dest) {\n      PDFView.navigateTo(state.target.dest);\n    } else {\n      PDFView.setHash(state.target.hash);\n    }\n    this.currentUid = state.uid;\n    if (state.uid > this.uid) {\n      this.uid = state.uid;\n    }\n    this.current = state.target;\n    this.updatePreviousBookmark = true;\n\n    var currentHash = window.location.hash.substring(1);\n    if (this.previousHash !== currentHash) {\n      this.allowHashChange = false;\n    }\n    this.previousHash = currentHash;\n\n    this.historyUnlocked = true;\n  },\n\n  back: function pdfHistoryBack() {\n    this.go(-1);\n  },\n\n  forward: function pdfHistoryForward() {\n    this.go(1);\n  },\n\n  go: function pdfHistoryGo(direction) {\n    if (this.initialized && this.historyUnlocked) {\n      var state = window.history.state;\n      if (direction === -1 && state && state.uid > 0) {\n        window.history.back();\n      } else if (direction === 1 && state && state.uid < (this.uid - 1)) {\n        window.history.forward();\n      }\n    }\n  }\n};\n\n\nvar SecondaryToolbar = {\n  opened: false,\n  previousContainerHeight: null,\n  newContainerHeight: null,\n\n  initialize: function secondaryToolbarInitialize(options) {\n    this.toolbar = options.toolbar;\n    this.presentationMode = options.presentationMode;\n    this.documentProperties = options.documentProperties;\n    this.buttonContainer = this.toolbar.firstElementChild;\n\n    // Define the toolbar buttons.\n    this.toggleButton = options.toggleButton;\n    this.presentationModeButton = options.presentationModeButton;\n    this.openFile = options.openFile;\n    this.print = options.print;\n    this.download = options.download;\n    this.viewBookmark = options.viewBookmark;\n    this.firstPage = options.firstPage;\n    this.lastPage = options.lastPage;\n    this.pageRotateCw = options.pageRotateCw;\n    this.pageRotateCcw = options.pageRotateCcw;\n    this.documentPropertiesButton = options.documentPropertiesButton;\n\n    // Attach the event listeners.\n    var elements = [\n      // Button to toggle the visibility of the secondary toolbar:\n      { element: this.toggleButton, handler: this.toggle },\n      // All items within the secondary toolbar\n      // (except for toggleHandTool, hand_tool.js is responsible for it):\n      { element: this.presentationModeButton,\n        handler: this.presentationModeClick },\n      { element: this.openFile, handler: this.openFileClick },\n      { element: this.print, handler: this.printClick },\n      { element: this.download, handler: this.downloadClick },\n      { element: this.viewBookmark, handler: this.viewBookmarkClick },\n      { element: this.firstPage, handler: this.firstPageClick },\n      { element: this.lastPage, handler: this.lastPageClick },\n      { element: this.pageRotateCw, handler: this.pageRotateCwClick },\n      { element: this.pageRotateCcw, handler: this.pageRotateCcwClick },\n      { element: this.documentPropertiesButton,\n        handler: this.documentPropertiesClick }\n    ];\n\n    for (var item in elements) {\n      var element = elements[item].element;\n      if (element) {\n        element.addEventListener('click', elements[item].handler.bind(this));\n      }\n    }\n  },\n\n  // Event handling functions.\n  presentationModeClick: function secondaryToolbarPresentationModeClick(evt) {\n    this.presentationMode.request();\n    this.close();\n  },\n\n  openFileClick: function secondaryToolbarOpenFileClick(evt) {\n    document.getElementById('fileInput').click();\n    this.close();\n  },\n\n  printClick: function secondaryToolbarPrintClick(evt) {\n    window.print();\n    this.close();\n  },\n\n  downloadClick: function secondaryToolbarDownloadClick(evt) {\n    PDFView.download();\n    this.close();\n  },\n\n  viewBookmarkClick: function secondaryToolbarViewBookmarkClick(evt) {\n    this.close();\n  },\n\n  firstPageClick: function secondaryToolbarFirstPageClick(evt) {\n    PDFView.page = 1;\n    this.close();\n  },\n\n  lastPageClick: function secondaryToolbarLastPageClick(evt) {\n    PDFView.page = PDFView.pdfDocument.numPages;\n    this.close();\n  },\n\n  pageRotateCwClick: function secondaryToolbarPageRotateCwClick(evt) {\n    PDFView.rotatePages(90);\n  },\n\n  pageRotateCcwClick: function secondaryToolbarPageRotateCcwClick(evt) {\n    PDFView.rotatePages(-90);\n  },\n\n  documentPropertiesClick: function secondaryToolbarDocumentPropsClick(evt) {\n    this.documentProperties.open();\n    this.close();\n  },\n\n  // Misc. functions for interacting with the toolbar.\n  setMaxHeight: function secondaryToolbarSetMaxHeight(container) {\n    if (!container || !this.buttonContainer) {\n      return;\n    }\n    this.newContainerHeight = container.clientHeight;\n    if (this.previousContainerHeight === this.newContainerHeight) {\n      return;\n    }\n    this.buttonContainer.setAttribute('style',\n      'max-height: ' + (this.newContainerHeight - SCROLLBAR_PADDING) + 'px;');\n    this.previousContainerHeight = this.newContainerHeight;\n  },\n\n  open: function secondaryToolbarOpen() {\n    if (this.opened) {\n      return;\n    }\n    this.opened = true;\n    this.toggleButton.classList.add('toggled');\n    this.toolbar.classList.remove('hidden');\n  },\n\n  close: function secondaryToolbarClose(target) {\n    if (!this.opened) {\n      return;\n    } else if (target && !this.toolbar.contains(target)) {\n      return;\n    }\n    this.opened = false;\n    this.toolbar.classList.add('hidden');\n    this.toggleButton.classList.remove('toggled');\n  },\n\n  toggle: function secondaryToolbarToggle() {\n    if (this.opened) {\n      this.close();\n    } else {\n      this.open();\n    }\n  }\n};\n\n\nvar DELAY_BEFORE_HIDING_CONTROLS = 3000; // in ms\nvar SELECTOR = 'presentationControls';\nvar DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS = 1000; // in ms\n\nvar PresentationMode = {\n  active: false,\n  args: null,\n  contextMenuOpen: false,\n  prevCoords: { x: null, y: null },\n\n  initialize: function presentationModeInitialize(options) {\n    this.container = options.container;\n    this.secondaryToolbar = options.secondaryToolbar;\n\n    this.viewer = this.container.firstElementChild;\n\n    this.firstPage = options.firstPage;\n    this.lastPage = options.lastPage;\n    this.pageRotateCw = options.pageRotateCw;\n    this.pageRotateCcw = options.pageRotateCcw;\n\n    this.firstPage.addEventListener('click', function() {\n      this.contextMenuOpen = false;\n      this.secondaryToolbar.firstPageClick();\n    }.bind(this));\n    this.lastPage.addEventListener('click', function() {\n      this.contextMenuOpen = false;\n      this.secondaryToolbar.lastPageClick();\n    }.bind(this));\n\n    this.pageRotateCw.addEventListener('click', function() {\n      this.contextMenuOpen = false;\n      this.secondaryToolbar.pageRotateCwClick();\n    }.bind(this));\n    this.pageRotateCcw.addEventListener('click', function() {\n      this.contextMenuOpen = false;\n      this.secondaryToolbar.pageRotateCcwClick();\n    }.bind(this));\n  },\n\n  get isFullscreen() {\n    return (document.fullscreenElement ||\n            document.mozFullScreen ||\n            document.webkitIsFullScreen ||\n            document.msFullscreenElement);\n  },\n\n  /**\n   * Initialize a timeout that is used to reset PDFView.currentPosition when the\n   * browser transitions to fullscreen mode. Since resize events are triggered\n   * multiple times during the switch to fullscreen mode, this is necessary in\n   * order to prevent the page from being scrolled partially, or completely,\n   * out of view when Presentation Mode is enabled.\n   * Note: This is only an issue at certain zoom levels, e.g. 'page-width'.\n   */\n  _setSwitchInProgress: function presentationMode_setSwitchInProgress() {\n    if (this.switchInProgress) {\n      clearTimeout(this.switchInProgress);\n    }\n    this.switchInProgress = setTimeout(function switchInProgressTimeout() {\n      delete this.switchInProgress;\n    }.bind(this), DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS);\n\n    PDFView.currentPosition = null;\n  },\n\n  _resetSwitchInProgress: function presentationMode_resetSwitchInProgress() {\n    if (this.switchInProgress) {\n      clearTimeout(this.switchInProgress);\n      delete this.switchInProgress;\n    }\n  },\n\n  request: function presentationModeRequest() {\n    if (!PDFView.supportsFullscreen || this.isFullscreen ||\n        !this.viewer.hasChildNodes()) {\n      return false;\n    }\n    this._setSwitchInProgress();\n\n    if (this.container.requestFullscreen) {\n      this.container.requestFullscreen();\n    } else if (this.container.mozRequestFullScreen) {\n      this.container.mozRequestFullScreen();\n    } else if (this.container.webkitRequestFullScreen) {\n      this.container.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);\n    } else if (this.container.msRequestFullscreen) {\n      this.container.msRequestFullscreen();\n    } else {\n      return false;\n    }\n\n    this.args = {\n      page: PDFView.page,\n      previousScale: PDFView.currentScaleValue\n    };\n\n    return true;\n  },\n\n  enter: function presentationModeEnter() {\n    this.active = true;\n    this._resetSwitchInProgress();\n\n    // Ensure that the correct page is scrolled into view when entering\n    // Presentation Mode, by waiting until fullscreen mode in enabled.\n    // Note: This is only necessary in non-Mozilla browsers.\n    setTimeout(function enterPresentationModeTimeout() {\n      PDFView.page = this.args.page;\n      PDFView.setScale('page-fit', true);\n    }.bind(this), 0);\n\n    window.addEventListener('mousemove', this.mouseMove, false);\n    window.addEventListener('mousedown', this.mouseDown, false);\n    window.addEventListener('contextmenu', this.contextMenu, false);\n\n    this.showControls();\n    HandTool.enterPresentationMode();\n    this.contextMenuOpen = false;\n    this.container.setAttribute('contextmenu', 'viewerContextMenu');\n  },\n\n  exit: function presentationModeExit() {\n    var page = PDFView.page;\n\n    // Ensure that the correct page is scrolled into view when exiting\n    // Presentation Mode, by waiting until fullscreen mode is disabled.\n    // Note: This is only necessary in non-Mozilla browsers.\n    setTimeout(function exitPresentationModeTimeout() {\n      this.active = false;\n      PDFView.setScale(this.args.previousScale);\n      PDFView.page = page;\n      this.args = null;\n    }.bind(this), 0);\n\n    window.removeEventListener('mousemove', this.mouseMove, false);\n    window.removeEventListener('mousedown', this.mouseDown, false);\n    window.removeEventListener('contextmenu', this.contextMenu, false);\n\n    this.hideControls();\n    PDFView.clearMouseScrollState();\n    HandTool.exitPresentationMode();\n    this.container.removeAttribute('contextmenu');\n    this.contextMenuOpen = false;\n\n    // Ensure that the thumbnail of the current page is visible\n    // when exiting presentation mode.\n    scrollIntoView(document.getElementById('thumbnailContainer' + page));\n  },\n\n  showControls: function presentationModeShowControls() {\n    if (this.controlsTimeout) {\n      clearTimeout(this.controlsTimeout);\n    } else {\n      this.container.classList.add(SELECTOR);\n    }\n    this.controlsTimeout = setTimeout(function hideControlsTimeout() {\n      this.container.classList.remove(SELECTOR);\n      delete this.controlsTimeout;\n    }.bind(this), DELAY_BEFORE_HIDING_CONTROLS);\n  },\n\n  hideControls: function presentationModeHideControls() {\n    if (!this.controlsTimeout) {\n      return;\n    }\n    this.container.classList.remove(SELECTOR);\n    clearTimeout(this.controlsTimeout);\n    delete this.controlsTimeout;\n  },\n\n  mouseMove: function presentationModeMouseMove(evt) {\n    // Workaround for a bug in WebKit browsers that causes the 'mousemove' event\n    // to be fired when the cursor is changed. For details, see:\n    // http://code.google.com/p/chromium/issues/detail?id=103041.\n\n    var currCoords = { x: evt.clientX, y: evt.clientY };\n    var prevCoords = PresentationMode.prevCoords;\n    PresentationMode.prevCoords = currCoords;\n\n    if (currCoords.x === prevCoords.x && currCoords.y === prevCoords.y) {\n      return;\n    }\n    PresentationMode.showControls();\n  },\n\n  mouseDown: function presentationModeMouseDown(evt) {\n    var self = PresentationMode;\n    if (self.contextMenuOpen) {\n      self.contextMenuOpen = false;\n      evt.preventDefault();\n      return;\n    }\n\n    if (evt.button === 0) {\n      // Enable clicking of links in presentation mode. Please note:\n      // Only links pointing to destinations in the current PDF document work.\n      var isInternalLink = (evt.target.href &&\n                            evt.target.classList.contains('internalLink'));\n      if (!isInternalLink) {\n        // Unless an internal link was clicked, advance one page.\n        evt.preventDefault();\n        PDFView.page += (evt.shiftKey ? -1 : 1);\n      }\n    }\n  },\n\n  contextMenu: function presentationModeContextMenu(evt) {\n    PresentationMode.contextMenuOpen = true;\n  }\n};\n\n(function presentationModeClosure() {\n  function presentationModeChange(e) {\n    if (PresentationMode.isFullscreen) {\n      PresentationMode.enter();\n    } else {\n      PresentationMode.exit();\n    }\n  }\n\n  window.addEventListener('fullscreenchange', presentationModeChange, false);\n  window.addEventListener('mozfullscreenchange', presentationModeChange, false);\n  window.addEventListener('webkitfullscreenchange', presentationModeChange,\n                          false);\n  window.addEventListener('MSFullscreenChange', presentationModeChange, false);\n})();\n\n\n/* Copyright 2013 Rob Wu <gwnRob@gmail.com>\n * https://github.com/Rob--W/grab-to-pan.js\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'use strict';\n\nvar GrabToPan = (function GrabToPanClosure() {\n  /**\n   * Construct a GrabToPan instance for a given HTML element.\n   * @param options.element {Element}\n   * @param options.ignoreTarget {function} optional. See `ignoreTarget(node)`\n   * @param options.onActiveChanged {function(boolean)} optional. Called\n   *  when grab-to-pan is (de)activated. The first argument is a boolean that\n   *  shows whether grab-to-pan is activated.\n   */\n  function GrabToPan(options) {\n    this.element = options.element;\n    this.document = options.element.ownerDocument;\n    if (typeof options.ignoreTarget === 'function') {\n      this.ignoreTarget = options.ignoreTarget;\n    }\n    this.onActiveChanged = options.onActiveChanged;\n\n    // Bind the contexts to ensure that `this` always points to\n    // the GrabToPan instance.\n    this.activate = this.activate.bind(this);\n    this.deactivate = this.deactivate.bind(this);\n    this.toggle = this.toggle.bind(this);\n    this._onmousedown = this._onmousedown.bind(this);\n    this._onmousemove = this._onmousemove.bind(this);\n    this._endPan = this._endPan.bind(this);\n\n    // This overlay will be inserted in the document when the mouse moves during\n    // a grab operation, to ensure that the cursor has the desired appearance.\n    var overlay = this.overlay = document.createElement('div');\n    overlay.className = 'grab-to-pan-grabbing';\n  }\n  GrabToPan.prototype = {\n    /**\n     * Class name of element which can be grabbed\n     */\n    CSS_CLASS_GRAB: 'grab-to-pan-grab',\n\n    /**\n     * Bind a mousedown event to the element to enable grab-detection.\n     */\n    activate: function GrabToPan_activate() {\n      if (!this.active) {\n        this.active = true;\n        this.element.addEventListener('mousedown', this._onmousedown, true);\n        this.element.classList.add(this.CSS_CLASS_GRAB);\n        if (this.onActiveChanged) {\n          this.onActiveChanged(true);\n        }\n      }\n    },\n\n    /**\n     * Removes all events. Any pending pan session is immediately stopped.\n     */\n    deactivate: function GrabToPan_deactivate() {\n      if (this.active) {\n        this.active = false;\n        this.element.removeEventListener('mousedown', this._onmousedown, true);\n        this._endPan();\n        this.element.classList.remove(this.CSS_CLASS_GRAB);\n        if (this.onActiveChanged) {\n          this.onActiveChanged(false);\n        }\n      }\n    },\n\n    toggle: function GrabToPan_toggle() {\n      if (this.active) {\n        this.deactivate();\n      } else {\n        this.activate();\n      }\n    },\n\n    /**\n     * Whether to not pan if the target element is clicked.\n     * Override this method to change the default behaviour.\n     *\n     * @param node {Element} The target of the event\n     * @return {boolean} Whether to not react to the click event.\n     */\n    ignoreTarget: function GrabToPan_ignoreTarget(node) {\n      // Use matchesSelector to check whether the clicked element\n      // is (a child of) an input element / link\n      return node[matchesSelector](\n        'a[href], a[href] *, input, textarea, button, button *, select, option'\n      );\n    },\n\n    /**\n     * @private\n     */\n    _onmousedown: function GrabToPan__onmousedown(event) {\n      if (event.button !== 0 || this.ignoreTarget(event.target)) {\n        return;\n      }\n      if (event.originalTarget) {\n        try {\n          /* jshint expr:true */\n          event.originalTarget.tagName;\n        } catch (e) {\n          // Mozilla-specific: element is a scrollbar (XUL element)\n          return;\n        }\n      }\n\n      this.scrollLeftStart = this.element.scrollLeft;\n      this.scrollTopStart = this.element.scrollTop;\n      this.clientXStart = event.clientX;\n      this.clientYStart = event.clientY;\n      this.document.addEventListener('mousemove', this._onmousemove, true);\n      this.document.addEventListener('mouseup', this._endPan, true);\n      // When a scroll event occurs before a mousemove, assume that the user\n      // dragged a scrollbar (necessary for Opera Presto, Safari and IE)\n      // (not needed for Chrome/Firefox)\n      this.element.addEventListener('scroll', this._endPan, true);\n      event.preventDefault();\n      event.stopPropagation();\n      this.document.documentElement.classList.add(this.CSS_CLASS_GRABBING);\n    },\n\n    /**\n     * @private\n     */\n    _onmousemove: function GrabToPan__onmousemove(event) {\n      this.element.removeEventListener('scroll', this._endPan, true);\n      if (isLeftMouseReleased(event)) {\n        this._endPan();\n        return;\n      }\n      var xDiff = event.clientX - this.clientXStart;\n      var yDiff = event.clientY - this.clientYStart;\n      this.element.scrollTop = this.scrollTopStart - yDiff;\n      this.element.scrollLeft = this.scrollLeftStart - xDiff;\n      if (!this.overlay.parentNode) {\n        document.body.appendChild(this.overlay);\n      }\n    },\n\n    /**\n     * @private\n     */\n    _endPan: function GrabToPan__endPan() {\n      this.element.removeEventListener('scroll', this._endPan, true);\n      this.document.removeEventListener('mousemove', this._onmousemove, true);\n      this.document.removeEventListener('mouseup', this._endPan, true);\n      if (this.overlay.parentNode) {\n        this.overlay.parentNode.removeChild(this.overlay);\n      }\n    }\n  };\n\n  // Get the correct (vendor-prefixed) name of the matches method.\n  var matchesSelector;\n  ['webkitM', 'mozM', 'msM', 'oM', 'm'].some(function(prefix) {\n    var name = prefix + 'atches';\n    if (name in document.documentElement) {\n      matchesSelector = name;\n    }\n    name += 'Selector';\n    if (name in document.documentElement) {\n      matchesSelector = name;\n    }\n    return matchesSelector; // If found, then truthy, and [].some() ends.\n  });\n\n  // Browser sniffing because it's impossible to feature-detect\n  // whether event.which for onmousemove is reliable\n  var isNotIEorIsIE10plus = !document.documentMode || document.documentMode > 9;\n  var chrome = window.chrome;\n  var isChrome15OrOpera15plus = chrome && (chrome.webstore || chrome.app);\n  //                                       ^ Chrome 15+       ^ Opera 15+\n  var isSafari6plus = /Apple/.test(navigator.vendor) &&\n                      /Version\\/([6-9]\\d*|[1-5]\\d+)/.test(navigator.userAgent);\n\n  /**\n   * Whether the left mouse is not pressed.\n   * @param event {MouseEvent}\n   * @return {boolean} True if the left mouse button is not pressed.\n   *                   False if unsure or if the left mouse button is pressed.\n   */\n  function isLeftMouseReleased(event) {\n    if ('buttons' in event && isNotIEorIsIE10plus) {\n      // http://www.w3.org/TR/DOM-Level-3-Events/#events-MouseEvent-buttons\n      // Firefox 15+\n      // Internet Explorer 10+\n      return !(event.buttons | 1);\n    }\n    if (isChrome15OrOpera15plus || isSafari6plus) {\n      // Chrome 14+\n      // Opera 15+\n      // Safari 6.0+\n      return event.which === 0;\n    }\n  }\n\n  return GrabToPan;\n})();\n\nvar HandTool = {\n  initialize: function handToolInitialize(options) {\n    var toggleHandTool = options.toggleHandTool;\n    this.handTool = new GrabToPan({\n      element: options.container,\n      onActiveChanged: function(isActive) {\n        if (!toggleHandTool) {\n          return;\n        }\n        if (isActive) {\n          toggleHandTool.title =\n            mozL10n.get('hand_tool_disable.title', null, 'Disable hand tool');\n          toggleHandTool.firstElementChild.textContent =\n            mozL10n.get('hand_tool_disable_label', null, 'Disable hand tool');\n        } else {\n          toggleHandTool.title =\n            mozL10n.get('hand_tool_enable.title', null, 'Enable hand tool');\n          toggleHandTool.firstElementChild.textContent =\n            mozL10n.get('hand_tool_enable_label', null, 'Enable hand tool');\n        }\n      }\n    });\n    if (toggleHandTool) {\n      toggleHandTool.addEventListener('click', this.toggle.bind(this), false);\n\n      window.addEventListener('localized', function (evt) {\n        Preferences.get('enableHandToolOnLoad').then(function resolved(value) {\n          if (value) {\n            this.handTool.activate();\n          }\n        }.bind(this), function rejected(reason) {});\n      }.bind(this));\n    }\n  },\n\n  toggle: function handToolToggle() {\n    this.handTool.toggle();\n    SecondaryToolbar.close();\n  },\n\n  enterPresentationMode: function handToolEnterPresentationMode() {\n    if (this.handTool.active) {\n      this.wasActive = true;\n      this.handTool.deactivate();\n    }\n  },\n\n  exitPresentationMode: function handToolExitPresentationMode() {\n    if (this.wasActive) {\n      this.wasActive = null;\n      this.handTool.activate();\n    }\n  }\n};\n\n\nvar OverlayManager = {\n  overlays: {},\n  active: null,\n\n  /**\n   * @param {string} name The name of the overlay that is registered. This must\n   *                 be equal to the ID of the overlay's DOM element.\n   * @param {function} callerCloseMethod (optional) The method that, if present,\n   *                   will call OverlayManager.close from the Object\n   *                   registering the overlay. Access to this method is\n   *                   necessary in order to run cleanup code when e.g.\n   *                   the overlay is force closed. The default is null.\n   * @param {boolean} canForceClose (optional) Indicates if opening the overlay\n   *                  will close an active overlay. The default is false.\n   * @returns {Promise} A promise that is resolved when the overlay has been\n   *                    registered.\n   */\n  register: function overlayManagerRegister(name,\n                                            callerCloseMethod, canForceClose) {\n    return new Promise(function (resolve) {\n      var element, container;\n      if (!name || !(element = document.getElementById(name)) ||\n          !(container = element.parentNode)) {\n        throw new Error('Not enough parameters.');\n      } else if (this.overlays[name]) {\n        throw new Error('The overlay is already registered.');\n      }\n      this.overlays[name] = { element: element,\n                              container: container,\n                              callerCloseMethod: (callerCloseMethod || null),\n                              canForceClose: (canForceClose || false) };\n      resolve();\n    }.bind(this));\n  },\n\n  /**\n   * @param {string} name The name of the overlay that is unregistered.\n   * @returns {Promise} A promise that is resolved when the overlay has been\n   *                    unregistered.\n   */\n  unregister: function overlayManagerUnregister(name) {\n    return new Promise(function (resolve) {\n      if (!this.overlays[name]) {\n        throw new Error('The overlay does not exist.');\n      } else if (this.active === name) {\n        throw new Error('The overlay cannot be removed while it is active.');\n      }\n      delete this.overlays[name];\n\n      resolve();\n    }.bind(this));\n  },\n\n  /**\n   * @param {string} name The name of the overlay that should be opened.\n   * @returns {Promise} A promise that is resolved when the overlay has been\n   *                    opened.\n   */\n  open: function overlayManagerOpen(name) {\n    return new Promise(function (resolve) {\n      if (!this.overlays[name]) {\n        throw new Error('The overlay does not exist.');\n      } else if (this.active) {\n        if (this.overlays[name].canForceClose) {\n          this._closeThroughCaller();\n        } else if (this.active === name) {\n          throw new Error('The overlay is already active.');\n        } else {\n          throw new Error('Another overlay is currently active.');\n        }\n      }\n      this.active = name;\n      this.overlays[this.active].element.classList.remove('hidden');\n      this.overlays[this.active].container.classList.remove('hidden');\n\n      window.addEventListener('keydown', this._keyDown);\n      resolve();\n    }.bind(this));\n  },\n\n  /**\n   * @param {string} name The name of the overlay that should be closed.\n   * @returns {Promise} A promise that is resolved when the overlay has been\n   *                    closed.\n   */\n  close: function overlayManagerClose(name) {\n    return new Promise(function (resolve) {\n      if (!this.overlays[name]) {\n        throw new Error('The overlay does not exist.');\n      } else if (!this.active) {\n        throw new Error('The overlay is currently not active.');\n      } else if (this.active !== name) {\n        throw new Error('Another overlay is currently active.');\n      }\n      this.overlays[this.active].container.classList.add('hidden');\n      this.overlays[this.active].element.classList.add('hidden');\n      this.active = null;\n\n      window.removeEventListener('keydown', this._keyDown);\n      resolve();\n    }.bind(this));\n  },\n\n  /**\n   * @private\n   */\n  _keyDown: function overlayManager_keyDown(evt) {\n    var self = OverlayManager;\n    if (self.active && evt.keyCode === 27) { // Esc key.\n      self._closeThroughCaller();\n      evt.preventDefault();\n    }\n  },\n\n  /**\n   * @private\n   */\n  _closeThroughCaller: function overlayManager_closeThroughCaller() {\n    if (this.overlays[this.active].callerCloseMethod) {\n      this.overlays[this.active].callerCloseMethod();\n    }\n    if (this.active) {\n      this.close(this.active);\n    }\n  }\n};\n\n\nvar PasswordPrompt = {\n  overlayName: null,\n  updatePassword: null,\n  reason: null,\n  passwordField: null,\n  passwordText: null,\n  passwordSubmit: null,\n  passwordCancel: null,\n\n  initialize: function secondaryToolbarInitialize(options) {\n    this.overlayName = options.overlayName;\n    this.passwordField = options.passwordField;\n    this.passwordText = options.passwordText;\n    this.passwordSubmit = options.passwordSubmit;\n    this.passwordCancel = options.passwordCancel;\n\n    // Attach the event listeners.\n    this.passwordSubmit.addEventListener('click',\n      this.verifyPassword.bind(this));\n\n    this.passwordCancel.addEventListener('click', this.close.bind(this));\n\n    this.passwordField.addEventListener('keydown', function (e) {\n      if (e.keyCode === 13) { // Enter key\n        this.verifyPassword();\n      }\n    }.bind(this));\n\n    OverlayManager.register(this.overlayName, this.close.bind(this), true);\n  },\n\n  open: function passwordPromptOpen() {\n    OverlayManager.open(this.overlayName).then(function () {\n      this.passwordField.focus();\n\n      var promptString = mozL10n.get('password_label', null,\n        'Enter the password to open this PDF file.');\n\n      if (this.reason === PDFJS.PasswordResponses.INCORRECT_PASSWORD) {\n        promptString = mozL10n.get('password_invalid', null,\n          'Invalid password. Please try again.');\n      }\n\n      this.passwordText.textContent = promptString;\n    }.bind(this));\n  },\n\n  close: function passwordPromptClose() {\n    OverlayManager.close(this.overlayName).then(function () {\n      this.passwordField.value = '';\n    }.bind(this));\n  },\n\n  verifyPassword: function passwordPromptVerifyPassword() {\n    var password = this.passwordField.value;\n    if (password && password.length > 0) {\n      this.close();\n      return this.updatePassword(password);\n    }\n  }\n};\n\n\nvar DocumentProperties = {\n  overlayName: null,\n  fileName: '',\n  fileSize: '',\n\n  // Document property fields (in the viewer).\n  fileNameField: null,\n  fileSizeField: null,\n  titleField: null,\n  authorField: null,\n  subjectField: null,\n  keywordsField: null,\n  creationDateField: null,\n  modificationDateField: null,\n  creatorField: null,\n  producerField: null,\n  versionField: null,\n  pageCountField: null,\n\n  initialize: function documentPropertiesInitialize(options) {\n    this.overlayName = options.overlayName;\n\n    // Set the document property fields.\n    this.fileNameField = options.fileNameField;\n    this.fileSizeField = options.fileSizeField;\n    this.titleField = options.titleField;\n    this.authorField = options.authorField;\n    this.subjectField = options.subjectField;\n    this.keywordsField = options.keywordsField;\n    this.creationDateField = options.creationDateField;\n    this.modificationDateField = options.modificationDateField;\n    this.creatorField = options.creatorField;\n    this.producerField = options.producerField;\n    this.versionField = options.versionField;\n    this.pageCountField = options.pageCountField;\n\n    // Bind the event listener for the Close button.\n    if (options.closeButton) {\n      options.closeButton.addEventListener('click', this.close.bind(this));\n    }\n\n    this.dataAvailablePromise = new Promise(function (resolve) {\n      this.resolveDataAvailable = resolve;\n    }.bind(this));\n\n    OverlayManager.register(this.overlayName, this.close.bind(this));\n  },\n\n  getProperties: function documentPropertiesGetProperties() {\n    if (!OverlayManager.active) {\n      // If the dialog was closed before dataAvailablePromise was resolved,\n      // don't bother updating the properties.\n      return;\n    }\n    // Get the file name.\n    this.fileName = getPDFFileNameFromURL(PDFView.url);\n\n    // Get the file size.\n    PDFView.pdfDocument.getDownloadInfo().then(function(data) {\n      this.setFileSize(data.length);\n      this.updateUI(this.fileSizeField, this.fileSize);\n    }.bind(this));\n\n    // Get the other document properties.\n    PDFView.pdfDocument.getMetadata().then(function(data) {\n      var fields = [\n        { field: this.fileNameField, content: this.fileName },\n        // The fileSize field is updated once getDownloadInfo is resolved.\n        { field: this.titleField, content: data.info.Title },\n        { field: this.authorField, content: data.info.Author },\n        { field: this.subjectField, content: data.info.Subject },\n        { field: this.keywordsField, content: data.info.Keywords },\n        { field: this.creationDateField,\n          content: this.parseDate(data.info.CreationDate) },\n        { field: this.modificationDateField,\n          content: this.parseDate(data.info.ModDate) },\n        { field: this.creatorField, content: data.info.Creator },\n        { field: this.producerField, content: data.info.Producer },\n        { field: this.versionField, content: data.info.PDFFormatVersion },\n        { field: this.pageCountField, content: PDFView.pdfDocument.numPages }\n      ];\n\n      // Show the properties in the dialog.\n      for (var item in fields) {\n        var element = fields[item];\n        this.updateUI(element.field, element.content);\n      }\n    }.bind(this));\n  },\n\n  updateUI: function documentPropertiesUpdateUI(field, content) {\n    if (field && content !== undefined && content !== '') {\n      field.textContent = content;\n    }\n  },\n\n  setFileSize: function documentPropertiesSetFileSize(fileSize) {\n    var kb = fileSize / 1024;\n    if (kb < 1024) {\n      this.fileSize = mozL10n.get('document_properties_kb', {\n        size_kb: (+kb.toPrecision(3)).toLocaleString(),\n        size_b: fileSize.toLocaleString()\n      }, '{{size_kb}} KB ({{size_b}} bytes)');\n    } else {\n      this.fileSize = mozL10n.get('document_properties_mb', {\n        size_mb: (+(kb / 1024).toPrecision(3)).toLocaleString(),\n        size_b: fileSize.toLocaleString()\n      }, '{{size_mb}} MB ({{size_b}} bytes)');\n    }\n  },\n\n  open: function documentPropertiesOpen() {\n    Promise.all([OverlayManager.open(this.overlayName),\n                 this.dataAvailablePromise]).then(function () {\n      this.getProperties();\n    }.bind(this));\n  },\n\n  close: function documentPropertiesClose() {\n    OverlayManager.close(this.overlayName);\n  },\n\n  parseDate: function documentPropertiesParseDate(inputDate) {\n    // This is implemented according to the PDF specification (see\n    // http://www.gnupdf.org/Date for an overview), but note that \n    // Adobe Reader doesn't handle changing the date to universal time\n    // and doesn't use the user's time zone (they're effectively ignoring\n    // the HH' and mm' parts of the date string).\n    var dateToParse = inputDate;\n    if (dateToParse === undefined) {\n      return '';\n    }\n\n    // Remove the D: prefix if it is available.\n    if (dateToParse.substring(0,2) === 'D:') {\n      dateToParse = dateToParse.substring(2);\n    }\n\n    // Get all elements from the PDF date string.\n    // JavaScript's Date object expects the month to be between\n    // 0 and 11 instead of 1 and 12, so we're correcting for this.\n    var year = parseInt(dateToParse.substring(0,4), 10);\n    var month = parseInt(dateToParse.substring(4,6), 10) - 1;\n    var day = parseInt(dateToParse.substring(6,8), 10);\n    var hours = parseInt(dateToParse.substring(8,10), 10);\n    var minutes = parseInt(dateToParse.substring(10,12), 10);\n    var seconds = parseInt(dateToParse.substring(12,14), 10);\n    var utRel = dateToParse.substring(14,15);\n    var offsetHours = parseInt(dateToParse.substring(15,17), 10);\n    var offsetMinutes = parseInt(dateToParse.substring(18,20), 10);\n\n    // As per spec, utRel = 'Z' means equal to universal time.\n    // The other cases ('-' and '+') have to be handled here.\n    if (utRel == '-') {\n      hours += offsetHours;\n      minutes += offsetMinutes;\n    } else if (utRel == '+') {\n      hours -= offsetHours;\n      minutes += offsetMinutes;\n    }\n\n    // Return the new date format from the user's locale.\n    var date = new Date(Date.UTC(year, month, day, hours, minutes, seconds));\n    var dateString = date.toLocaleDateString();\n    var timeString = date.toLocaleTimeString();\n    return mozL10n.get('document_properties_date_string',\n                       {date: dateString, time: timeString},\n                       '{{date}}, {{time}}');\n  }\n};\n\n\nvar PDFView = {\n  pages: [],\n  thumbnails: [],\n  currentScale: UNKNOWN_SCALE,\n  currentScaleValue: null,\n  initialBookmark: document.location.hash.substring(1),\n  container: null,\n  thumbnailContainer: null,\n  initialized: false,\n  fellback: false,\n  pdfDocument: null,\n  sidebarOpen: false,\n  printing: false,\n  pageViewScroll: null,\n  thumbnailViewScroll: null,\n  pageRotation: 0,\n  mouseScrollTimeStamp: 0,\n  mouseScrollDelta: 0,\n  lastScroll: 0,\n  previousPageNumber: 1,\n  isViewerEmbedded: (window.parent !== window),\n  idleTimeout: null,\n  currentPosition: null,\n\n  // called once when the document is loaded\n  initialize: function pdfViewInitialize() {\n    var self = this;\n    var container = this.container = document.getElementById('viewerContainer');\n    this.pageViewScroll = {};\n    this.watchScroll(container, this.pageViewScroll, updateViewarea);\n\n    var thumbnailContainer = this.thumbnailContainer =\n                             document.getElementById('thumbnailView');\n    this.thumbnailViewScroll = {};\n    this.watchScroll(thumbnailContainer, this.thumbnailViewScroll,\n                     this.renderHighestPriority.bind(this));\n\n    Preferences.initialize();\n\n    PDFFindBar.initialize({\n      bar: document.getElementById('findbar'),\n      toggleButton: document.getElementById('viewFind'),\n      findField: document.getElementById('findInput'),\n      highlightAllCheckbox: document.getElementById('findHighlightAll'),\n      caseSensitiveCheckbox: document.getElementById('findMatchCase'),\n      findMsg: document.getElementById('findMsg'),\n      findStatusIcon: document.getElementById('findStatusIcon'),\n      findPreviousButton: document.getElementById('findPrevious'),\n      findNextButton: document.getElementById('findNext')\n    });\n\n    PDFFindController.initialize({\n      pdfPageSource: this,\n      integratedFind: this.supportsIntegratedFind\n    });\n\n    HandTool.initialize({\n      container: container,\n      toggleHandTool: document.getElementById('toggleHandTool')\n    });\n\n    SecondaryToolbar.initialize({\n      toolbar: document.getElementById('secondaryToolbar'),\n      presentationMode: PresentationMode,\n      toggleButton: document.getElementById('secondaryToolbarToggle'),\n      presentationModeButton:\n        document.getElementById('secondaryPresentationMode'),\n      openFile: document.getElementById('secondaryOpenFile'),\n      print: document.getElementById('secondaryPrint'),\n      download: document.getElementById('secondaryDownload'),\n      viewBookmark: document.getElementById('secondaryViewBookmark'),\n      firstPage: document.getElementById('firstPage'),\n      lastPage: document.getElementById('lastPage'),\n      pageRotateCw: document.getElementById('pageRotateCw'),\n      pageRotateCcw: document.getElementById('pageRotateCcw'),\n      documentProperties: DocumentProperties,\n      documentPropertiesButton: document.getElementById('documentProperties')\n    });\n\n    PresentationMode.initialize({\n      container: container,\n      secondaryToolbar: SecondaryToolbar,\n      firstPage: document.getElementById('contextFirstPage'),\n      lastPage: document.getElementById('contextLastPage'),\n      pageRotateCw: document.getElementById('contextPageRotateCw'),\n      pageRotateCcw: document.getElementById('contextPageRotateCcw')\n    });\n\n    PasswordPrompt.initialize({\n      overlayName: 'passwordOverlay',\n      passwordField: document.getElementById('password'),\n      passwordText: document.getElementById('passwordText'),\n      passwordSubmit: document.getElementById('passwordSubmit'),\n      passwordCancel: document.getElementById('passwordCancel')\n    });\n\n    DocumentProperties.initialize({\n      overlayName: 'documentPropertiesOverlay',\n      closeButton: document.getElementById('documentPropertiesClose'),\n      fileNameField: document.getElementById('fileNameField'),\n      fileSizeField: document.getElementById('fileSizeField'),\n      titleField: document.getElementById('titleField'),\n      authorField: document.getElementById('authorField'),\n      subjectField: document.getElementById('subjectField'),\n      keywordsField: document.getElementById('keywordsField'),\n      creationDateField: document.getElementById('creationDateField'),\n      modificationDateField: document.getElementById('modificationDateField'),\n      creatorField: document.getElementById('creatorField'),\n      producerField: document.getElementById('producerField'),\n      versionField: document.getElementById('versionField'),\n      pageCountField: document.getElementById('pageCountField')\n    });\n\n    container.addEventListener('scroll', function() {\n      self.lastScroll = Date.now();\n    }, false);\n\n    var initializedPromise = Promise.all([\n      Preferences.get('enableWebGL').then(function resolved(value) {\n        PDFJS.disableWebGL = !value;\n      }),\n      Preferences.get('sidebarViewOnLoad').then(function resolved(value) {\n        self.preferenceSidebarViewOnLoad = value;\n      }),\n      Preferences.get('disableTextLayer').then(function resolved(value) {\n        if (PDFJS.disableTextLayer === true) {\n          return;\n        }\n        PDFJS.disableTextLayer = value;\n      }),\n      Preferences.get('disableRange').then(function resolved(value) {\n        if (PDFJS.disableRange === true) {\n          return;\n        }\n        PDFJS.disableRange = value;\n      }),\n      Preferences.get('disableAutoFetch').then(function resolved(value) {\n        PDFJS.disableAutoFetch = value;\n      }),\n      Preferences.get('disableFontFace').then(function resolved(value) {\n        if (PDFJS.disableFontFace === true) {\n          return;\n        }\n        PDFJS.disableFontFace = value;\n      }),\n      Preferences.get('useOnlyCssZoom').then(function resolved(value) {\n        PDFJS.useOnlyCssZoom = value;\n      })\n      // TODO move more preferences and other async stuff here\n    ]).catch(function (reason) { });\n\n    return initializedPromise.then(function () {\n      PDFView.initialized = true;\n    });\n  },\n\n  getPage: function pdfViewGetPage(n) {\n    return this.pdfDocument.getPage(n);\n  },\n\n  // Helper function to keep track whether a div was scrolled up or down and\n  // then call a callback.\n  watchScroll: function pdfViewWatchScroll(viewAreaElement, state, callback) {\n    state.down = true;\n    state.lastY = viewAreaElement.scrollTop;\n    viewAreaElement.addEventListener('scroll', function webViewerScroll(evt) {\n      if (!PDFView.pdfDocument) {\n        return;\n      }\n      var currentY = viewAreaElement.scrollTop;\n      var lastY = state.lastY;\n      if (currentY > lastY) {\n        state.down = true;\n      } else if (currentY < lastY) {\n        state.down = false;\n      }\n      // else do nothing and use previous value\n      state.lastY = currentY;\n      callback();\n    }, true);\n  },\n\n  _setScaleUpdatePages: function pdfView_setScaleUpdatePages(\n      newScale, newValue, resetAutoSettings, noScroll) {\n    this.currentScaleValue = newValue;\n    if (newScale === this.currentScale) {\n      return;\n    }\n    for (var i = 0, ii = this.pages.length; i < ii; i++) {\n      this.pages[i].update(newScale);\n    }\n    this.currentScale = newScale;\n\n    if (!noScroll) {\n      var page = this.page, dest;\n      if (this.currentPosition && !IGNORE_CURRENT_POSITION_ON_ZOOM) {\n        page = this.currentPosition.page;\n        dest = [null, { name: 'XYZ' }, this.currentPosition.left,\n                this.currentPosition.top, null];\n      }\n      this.pages[page - 1].scrollIntoView(dest);\n    }\n    var event = document.createEvent('UIEvents');\n    event.initUIEvent('scalechange', false, false, window, 0);\n    event.scale = newScale;\n    event.resetAutoSettings = resetAutoSettings;\n    window.dispatchEvent(event);\n  },\n\n  setScale: function pdfViewSetScale(value, resetAutoSettings, noScroll) {\n    if (value === 'custom') {\n      return;\n    }\n    var scale = parseFloat(value);\n\n    if (scale > 0) {\n      this._setScaleUpdatePages(scale, value, true, noScroll);\n    } else {\n      var currentPage = this.pages[this.page - 1];\n      if (!currentPage) {\n        return;\n      }\n      var hPadding = PresentationMode.active ? 0 : SCROLLBAR_PADDING;\n      var vPadding = PresentationMode.active ? 0 : VERTICAL_PADDING;\n      var pageWidthScale = (this.container.clientWidth - hPadding) /\n                            currentPage.width * currentPage.scale;\n      var pageHeightScale = (this.container.clientHeight - vPadding) /\n                             currentPage.height * currentPage.scale;\n      switch (value) {\n        case 'page-actual':\n          scale = 1;\n          break;\n        case 'page-width':\n          scale = pageWidthScale;\n          break;\n        case 'page-height':\n          scale = pageHeightScale;\n          break;\n        case 'page-fit':\n          scale = Math.min(pageWidthScale, pageHeightScale);\n          break;\n        case 'auto':\n          scale = Math.min(MAX_AUTO_SCALE, pageWidthScale);\n          break;\n        default:\n          console.error('pdfViewSetScale: \\'' + value +\n                        '\\' is an unknown zoom value.');\n          return;\n      }\n      this._setScaleUpdatePages(scale, value, resetAutoSettings, noScroll);\n\n      selectScaleOption(value);\n    }\n  },\n\n  zoomIn: function pdfViewZoomIn(ticks) {\n    var newScale = this.currentScale;\n    do {\n      newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2);\n      newScale = Math.ceil(newScale * 10) / 10;\n      newScale = Math.min(MAX_SCALE, newScale);\n    } while (--ticks && newScale < MAX_SCALE);\n    this.setScale(newScale, true);\n  },\n\n  zoomOut: function pdfViewZoomOut(ticks) {\n    var newScale = this.currentScale;\n    do {\n      newScale = (newScale / DEFAULT_SCALE_DELTA).toFixed(2);\n      newScale = Math.floor(newScale * 10) / 10;\n      newScale = Math.max(MIN_SCALE, newScale);\n    } while (--ticks && newScale > MIN_SCALE);\n    this.setScale(newScale, true);\n  },\n\n  set page(val) {\n    var pages = this.pages;\n    var event = document.createEvent('UIEvents');\n    event.initUIEvent('pagechange', false, false, window, 0);\n\n    if (!(0 < val && val <= pages.length)) {\n      this.previousPageNumber = val;\n      event.pageNumber = this.page;\n      window.dispatchEvent(event);\n      return;\n    }\n\n    pages[val - 1].updateStats();\n    this.previousPageNumber = currentPageNumber;\n    currentPageNumber = val;\n    event.pageNumber = val;\n    window.dispatchEvent(event);\n\n    // checking if the this.page was called from the updateViewarea function:\n    // avoiding the creation of two \"set page\" method (internal and public)\n    if (updateViewarea.inProgress) {\n      return;\n    }\n    // Avoid scrolling the first page during loading\n    if (this.loading && val === 1) {\n      return;\n    }\n    pages[val - 1].scrollIntoView();\n  },\n\n  get page() {\n    return currentPageNumber;\n  },\n\n  get supportsPrinting() {\n    var canvas = document.createElement('canvas');\n    var value = 'mozPrintCallback' in canvas;\n    // shadow\n    Object.defineProperty(this, 'supportsPrinting', { value: value,\n                                                      enumerable: true,\n                                                      configurable: true,\n                                                      writable: false });\n    return value;\n  },\n\n  get supportsFullscreen() {\n    var doc = document.documentElement;\n    var support = doc.requestFullscreen || doc.mozRequestFullScreen ||\n                  doc.webkitRequestFullScreen || doc.msRequestFullscreen;\n\n    if (document.fullscreenEnabled === false ||\n        document.mozFullScreenEnabled === false ||\n        document.webkitFullscreenEnabled === false ||\n        document.msFullscreenEnabled === false) {\n      support = false;\n    }\n\n    Object.defineProperty(this, 'supportsFullscreen', { value: support,\n                                                        enumerable: true,\n                                                        configurable: true,\n                                                        writable: false });\n    return support;\n  },\n\n  get supportsIntegratedFind() {\n    var support = false;\n    Object.defineProperty(this, 'supportsIntegratedFind', { value: support,\n                                                            enumerable: true,\n                                                            configurable: true,\n                                                            writable: false });\n    return support;\n  },\n\n  get supportsDocumentFonts() {\n    var support = true;\n    Object.defineProperty(this, 'supportsDocumentFonts', { value: support,\n                                                           enumerable: true,\n                                                           configurable: true,\n                                                           writable: false });\n    return support;\n  },\n\n  get supportsDocumentColors() {\n    var support = true;\n    Object.defineProperty(this, 'supportsDocumentColors', { value: support,\n                                                            enumerable: true,\n                                                            configurable: true,\n                                                            writable: false });\n    return support;\n  },\n\n  get loadingBar() {\n    var bar = new ProgressBar('#loadingBar', {});\n    Object.defineProperty(this, 'loadingBar', { value: bar,\n                                                enumerable: true,\n                                                configurable: true,\n                                                writable: false });\n    return bar;\n  },\n\n  get isHorizontalScrollbarEnabled() {\n    return (PresentationMode.active ? false :\n            (this.container.scrollWidth > this.container.clientWidth));\n  },\n\n\n  setTitleUsingUrl: function pdfViewSetTitleUsingUrl(url) {\n    this.url = url;\n    try {\n      this.setTitle(decodeURIComponent(getFileName(url)) || url);\n    } catch (e) {\n      // decodeURIComponent may throw URIError,\n      // fall back to using the unprocessed url in that case\n      this.setTitle(url);\n    }\n  },\n\n  setTitle: function pdfViewSetTitle(title) {\n    document.title = title;\n  },\n\n  close: function pdfViewClose() {\n    var errorWrapper = document.getElementById('errorWrapper');\n    errorWrapper.setAttribute('hidden', 'true');\n\n    if (!this.pdfDocument) {\n      return;\n    }\n\n    this.pdfDocument.destroy();\n    this.pdfDocument = null;\n\n    var thumbsView = document.getElementById('thumbnailView');\n    while (thumbsView.hasChildNodes()) {\n      thumbsView.removeChild(thumbsView.lastChild);\n    }\n\n    if ('_loadingInterval' in thumbsView) {\n      clearInterval(thumbsView._loadingInterval);\n    }\n\n    var container = document.getElementById('viewer');\n    while (container.hasChildNodes()) {\n      container.removeChild(container.lastChild);\n    }\n\n    if (typeof PDFBug !== 'undefined') {\n      PDFBug.cleanup();\n    }\n  },\n\n  // TODO(mack): This function signature should really be pdfViewOpen(url, args)\n  open: function pdfViewOpen(url, scale, password,\n                             pdfDataRangeTransport, args) {\n    if (this.pdfDocument) {\n      // Reload the preferences if a document was previously opened.\n      Preferences.reload();\n    }\n    this.close();\n\n    var parameters = {password: password};\n    if (typeof url === 'string') { // URL\n      this.setTitleUsingUrl(url);\n      parameters.url = url;\n    } else if (url && 'byteLength' in url) { // ArrayBuffer\n      parameters.data = url;\n    }\n    if (args) {\n      for (var prop in args) {\n        parameters[prop] = args[prop];\n      }\n    }\n\n    var self = this;\n    self.loading = true;\n    self.downloadComplete = false;\n\n    var passwordNeeded = function passwordNeeded(updatePassword, reason) {\n      PasswordPrompt.updatePassword = updatePassword;\n      PasswordPrompt.reason = reason;\n      PasswordPrompt.open();\n    };\n\n    function getDocumentProgress(progressData) {\n      self.progress(progressData.loaded / progressData.total);\n    }\n\n    PDFJS.getDocument(parameters, pdfDataRangeTransport, passwordNeeded,\n                      getDocumentProgress).then(\n      function getDocumentCallback(pdfDocument) {\n        self.load(pdfDocument, scale);\n        self.loading = false;\n      },\n      function getDocumentError(message, exception) {\n        var loadingErrorMessage = mozL10n.get('loading_error', null,\n          'An error occurred while loading the PDF.');\n\n        if (exception && exception.name === 'InvalidPDFException') {\n          // change error message also for other builds\n          loadingErrorMessage = mozL10n.get('invalid_file_error', null,\n                                        'Invalid or corrupted PDF file.');\n        }\n\n        if (exception && exception.name === 'MissingPDFException') {\n          // special message for missing PDF's\n          loadingErrorMessage = mozL10n.get('missing_file_error', null,\n                                        'Missing PDF file.');\n\n        }\n\n        var moreInfo = {\n          message: message\n        };\n        self.error(loadingErrorMessage, moreInfo);\n        self.loading = false;\n      }\n    );\n  },\n\n  download: function pdfViewDownload() {\n    function downloadByUrl() {\n      downloadManager.downloadUrl(url, filename);\n    }\n\n    var url = this.url.split('#')[0];\n    var filename = getPDFFileNameFromURL(url);\n    var downloadManager = new DownloadManager();\n    downloadManager.onerror = function (err) {\n      // This error won't really be helpful because it's likely the\n      // fallback won't work either (or is already open).\n      PDFView.error('PDF failed to download.');\n    };\n\n    if (!this.pdfDocument) { // the PDF is not ready yet\n      downloadByUrl();\n      return;\n    }\n\n    if (!this.downloadComplete) { // the PDF is still downloading\n      downloadByUrl();\n      return;\n    }\n\n    this.pdfDocument.getData().then(\n      function getDataSuccess(data) {\n        var blob = PDFJS.createBlob(data, 'application/pdf');\n        downloadManager.download(blob, url, filename);\n      },\n      downloadByUrl // Error occurred try downloading with just the url.\n    ).then(null, downloadByUrl);\n  },\n\n  fallback: function pdfViewFallback(featureId) {\n    return;\n  },\n\n  navigateTo: function pdfViewNavigateTo(dest) {\n    var destString = '';\n    var self = this;\n\n    var goToDestination = function(destRef) {\n      self.pendingRefStr = null;\n      // dest array looks like that: <page-ref> </XYZ|FitXXX> <args..>\n      var pageNumber = destRef instanceof Object ?\n        self.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] :\n        (destRef + 1);\n      if (pageNumber) {\n        if (pageNumber > self.pages.length) {\n          pageNumber = self.pages.length;\n        }\n        var currentPage = self.pages[pageNumber - 1];\n        currentPage.scrollIntoView(dest);\n\n        // Update the browsing history.\n        PDFHistory.push({ dest: dest, hash: destString, page: pageNumber });\n      } else {\n        self.pdfDocument.getPageIndex(destRef).then(function (pageIndex) {\n          var pageNum = pageIndex + 1;\n          self.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] = pageNum;\n          goToDestination(destRef);\n        });\n      }\n    };\n\n    this.destinationsPromise.then(function() {\n      if (typeof dest === 'string') {\n        destString = dest;\n        dest = self.destinations[dest];\n      }\n      if (!(dest instanceof Array)) {\n        return; // invalid destination\n      }\n      goToDestination(dest[0]);\n    });\n  },\n\n  getDestinationHash: function pdfViewGetDestinationHash(dest) {\n    if (typeof dest === 'string') {\n      return PDFView.getAnchorUrl('#' + escape(dest));\n    }\n    if (dest instanceof Array) {\n      var destRef = dest[0]; // see navigateTo method for dest format\n      var pageNumber = destRef instanceof Object ?\n        this.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] :\n        (destRef + 1);\n      if (pageNumber) {\n        var pdfOpenParams = PDFView.getAnchorUrl('#page=' + pageNumber);\n        var destKind = dest[1];\n        if (typeof destKind === 'object' && 'name' in destKind &&\n            destKind.name == 'XYZ') {\n          var scale = (dest[4] || this.currentScaleValue);\n          var scaleNumber = parseFloat(scale);\n          if (scaleNumber) {\n            scale = scaleNumber * 100;\n          }\n          pdfOpenParams += '&zoom=' + scale;\n          if (dest[2] || dest[3]) {\n            pdfOpenParams += ',' + (dest[2] || 0) + ',' + (dest[3] || 0);\n          }\n        }\n        return pdfOpenParams;\n      }\n    }\n    return '';\n  },\n\n  /**\n   * Prefix the full url on anchor links to make sure that links are resolved\n   * relative to the current URL instead of the one defined in <base href>.\n   * @param {String} anchor The anchor hash, including the #.\n   */\n  getAnchorUrl: function getAnchorUrl(anchor) {\n    return anchor;\n  },\n\n  /**\n   * Show the error box.\n   * @param {String} message A message that is human readable.\n   * @param {Object} moreInfo (optional) Further information about the error\n   *                            that is more technical.  Should have a 'message'\n   *                            and optionally a 'stack' property.\n   */\n  error: function pdfViewError(message, moreInfo) {\n    var moreInfoText = mozL10n.get('error_version_info',\n      {version: PDFJS.version || '?', build: PDFJS.build || '?'},\n      'PDF.js v{{version}} (build: {{build}})') + '\\n';\n    if (moreInfo) {\n      moreInfoText +=\n        mozL10n.get('error_message', {message: moreInfo.message},\n        'Message: {{message}}');\n      if (moreInfo.stack) {\n        moreInfoText += '\\n' +\n          mozL10n.get('error_stack', {stack: moreInfo.stack},\n          'Stack: {{stack}}');\n      } else {\n        if (moreInfo.filename) {\n          moreInfoText += '\\n' +\n            mozL10n.get('error_file', {file: moreInfo.filename},\n            'File: {{file}}');\n        }\n        if (moreInfo.lineNumber) {\n          moreInfoText += '\\n' +\n            mozL10n.get('error_line', {line: moreInfo.lineNumber},\n            'Line: {{line}}');\n        }\n      }\n    }\n\n    var errorWrapper = document.getElementById('errorWrapper');\n    errorWrapper.removeAttribute('hidden');\n\n    var errorMessage = document.getElementById('errorMessage');\n    errorMessage.textContent = message;\n\n    var closeButton = document.getElementById('errorClose');\n    closeButton.onclick = function() {\n      errorWrapper.setAttribute('hidden', 'true');\n    };\n\n    var errorMoreInfo = document.getElementById('errorMoreInfo');\n    var moreInfoButton = document.getElementById('errorShowMore');\n    var lessInfoButton = document.getElementById('errorShowLess');\n    moreInfoButton.onclick = function() {\n      errorMoreInfo.removeAttribute('hidden');\n      moreInfoButton.setAttribute('hidden', 'true');\n      lessInfoButton.removeAttribute('hidden');\n      errorMoreInfo.style.height = errorMoreInfo.scrollHeight + 'px';\n    };\n    lessInfoButton.onclick = function() {\n      errorMoreInfo.setAttribute('hidden', 'true');\n      moreInfoButton.removeAttribute('hidden');\n      lessInfoButton.setAttribute('hidden', 'true');\n    };\n    moreInfoButton.oncontextmenu = noContextMenuHandler;\n    lessInfoButton.oncontextmenu = noContextMenuHandler;\n    closeButton.oncontextmenu = noContextMenuHandler;\n    moreInfoButton.removeAttribute('hidden');\n    lessInfoButton.setAttribute('hidden', 'true');\n    errorMoreInfo.value = moreInfoText;\n  },\n\n  progress: function pdfViewProgress(level) {\n    var percent = Math.round(level * 100);\n    // When we transition from full request to range requests, it's possible\n    // that we discard some of the loaded data. This can cause the loading\n    // bar to move backwards. So prevent this by only updating the bar if it\n    // increases.\n    if (percent > PDFView.loadingBar.percent || isNaN(percent)) {\n      PDFView.loadingBar.percent = percent;\n    }\n  },\n\n  load: function pdfViewLoad(pdfDocument, scale) {\n    var self = this;\n    var isOnePageRenderedResolved = false;\n    var resolveOnePageRendered = null;\n    var onePageRendered = new Promise(function (resolve) {\n      resolveOnePageRendered = resolve;\n    });\n    function bindOnAfterDraw(pageView, thumbnailView) {\n      // when page is painted, using the image as thumbnail base\n      pageView.onAfterDraw = function pdfViewLoadOnAfterDraw() {\n        if (!isOnePageRenderedResolved) {\n          isOnePageRenderedResolved = true;\n          resolveOnePageRendered();\n        }\n        thumbnailView.setImage(pageView.canvas);\n      };\n    }\n\n    PDFFindController.reset();\n\n    this.pdfDocument = pdfDocument;\n\n    DocumentProperties.resolveDataAvailable();\n\n    var downloadedPromise = pdfDocument.getDownloadInfo().then(function() {\n      self.downloadComplete = true;\n      PDFView.loadingBar.hide();\n      var outerContainer = document.getElementById('outerContainer');\n      outerContainer.classList.remove('loadingInProgress');\n    });\n\n    var pagesCount = pdfDocument.numPages;\n\n    var id = pdfDocument.fingerprint;\n    document.getElementById('numPages').textContent =\n      mozL10n.get('page_of', {pageCount: pagesCount}, 'of {{pageCount}}');\n    document.getElementById('pageNumber').max = pagesCount;\n\n    PDFView.documentFingerprint = id;\n    var store = PDFView.store = new ViewHistory(id);\n\n    this.pageRotation = 0;\n\n    var pages = this.pages = [];\n    var pagesRefMap = this.pagesRefMap = {};\n    var thumbnails = this.thumbnails = [];\n\n    var resolvePagesPromise;\n    var pagesPromise = new Promise(function (resolve) {\n      resolvePagesPromise = resolve;\n    });\n    this.pagesPromise = pagesPromise;\n\n    var firstPagePromise = pdfDocument.getPage(1);\n    var container = document.getElementById('viewer');\n    var thumbsView = document.getElementById('thumbnailView');\n\n    // Fetch a single page so we can get a viewport that will be the default\n    // viewport for all pages\n    firstPagePromise.then(function(pdfPage) {\n      var viewport = pdfPage.getViewport((scale || 1.0) * CSS_UNITS);\n      for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {\n        var viewportClone = viewport.clone();\n        var pageView = new PageView(container, pageNum, scale,\n                                    self.navigateTo.bind(self),\n                                    viewportClone);\n        var thumbnailView = new ThumbnailView(thumbsView, pageNum,\n                                              viewportClone);\n        bindOnAfterDraw(pageView, thumbnailView);\n        pages.push(pageView);\n        thumbnails.push(thumbnailView);\n      }\n\n      // Fetch all the pages since the viewport is needed before printing\n      // starts to create the correct size canvas. Wait until one page is\n      // rendered so we don't tie up too many resources early on.\n      onePageRendered.then(function () {\n        if (!PDFJS.disableAutoFetch) {\n          var getPagesLeft = pagesCount;\n          for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {\n            pdfDocument.getPage(pageNum).then(function (pageNum, pdfPage) {\n              var pageView = pages[pageNum - 1];\n              if (!pageView.pdfPage) {\n                pageView.setPdfPage(pdfPage);\n              }\n              var refStr = pdfPage.ref.num + ' ' + pdfPage.ref.gen + ' R';\n              pagesRefMap[refStr] = pageNum;\n              getPagesLeft--;\n              if (!getPagesLeft) {\n                resolvePagesPromise();\n              }\n            }.bind(null, pageNum));\n          }\n        } else {\n          // XXX: Printing is semi-broken with auto fetch disabled.\n          resolvePagesPromise();\n        }\n      });\n\n      downloadedPromise.then(function () {\n        var event = document.createEvent('CustomEvent');\n        event.initCustomEvent('documentload', true, true, {});\n        window.dispatchEvent(event);\n      });\n\n      PDFView.loadingBar.setWidth(container);\n\n      PDFFindController.resolveFirstPage();\n\n      // Initialize the browsing history.\n      PDFHistory.initialize(self.documentFingerprint);\n    });\n\n    // Fetch the necessary preference values.\n    var showPreviousViewOnLoad;\n    var showPreviousViewOnLoadPromise =\n      Preferences.get('showPreviousViewOnLoad').then(function (prefValue) {\n        showPreviousViewOnLoad = prefValue;\n      });\n    var defaultZoomValue;\n    var defaultZoomValuePromise =\n      Preferences.get('defaultZoomValue').then(function (prefValue) {\n        defaultZoomValue = prefValue;\n      });\n\n    var storePromise = store.initializedPromise;\n    Promise.all([firstPagePromise, storePromise, showPreviousViewOnLoadPromise,\n                 defaultZoomValuePromise]).then(function resolved() {\n      var storedHash = null;\n      if (showPreviousViewOnLoad && store.get('exists', false)) {\n        var pageNum = store.get('page', '1');\n        var zoom = defaultZoomValue || store.get('zoom', PDFView.currentScale);\n        var left = store.get('scrollLeft', '0');\n        var top = store.get('scrollTop', '0');\n\n        storedHash = 'page=' + pageNum + '&zoom=' + zoom + ',' +\n                     left + ',' + top;\n      } else if (defaultZoomValue) {\n        storedHash = 'page=1&zoom=' + defaultZoomValue;\n      }\n      self.setInitialView(storedHash, scale);\n\n      // Make all navigation keys work on document load,\n      // unless the viewer is embedded in a web page.\n      if (!self.isViewerEmbedded) {\n        self.container.focus();\n      }\n    }, function rejected(reason) {\n      console.error(reason);\n\n      firstPagePromise.then(function () {\n        self.setInitialView(null, scale);\n      });\n    });\n\n    pagesPromise.then(function() {\n      if (PDFView.supportsPrinting) {\n        pdfDocument.getJavaScript().then(function(javaScript) {\n          if (javaScript.length) {\n            console.warn('Warning: JavaScript is not supported');\n            PDFView.fallback(PDFJS.UNSUPPORTED_FEATURES.javaScript);\n          }\n          // Hack to support auto printing.\n          var regex = /\\bprint\\s*\\(/g;\n          for (var i = 0, ii = javaScript.length; i < ii; i++) {\n            var js = javaScript[i];\n            if (js && regex.test(js)) {\n              setTimeout(function() {\n                window.print();\n              });\n              return;\n            }\n          }\n        });\n      }\n    });\n\n    var destinationsPromise =\n      this.destinationsPromise = pdfDocument.getDestinations();\n    destinationsPromise.then(function(destinations) {\n      self.destinations = destinations;\n    });\n\n    // outline depends on destinations and pagesRefMap\n    var promises = [pagesPromise, destinationsPromise,\n                    PDFView.animationStartedPromise];\n    Promise.all(promises).then(function() {\n      pdfDocument.getOutline().then(function(outline) {\n        self.outline = new DocumentOutlineView(outline);\n        document.getElementById('viewOutline').disabled = !outline;\n\n        if (outline &&\n            self.preferenceSidebarViewOnLoad === SidebarView.OUTLINE) {\n          self.switchSidebarView('outline', true);\n        }\n      });\n      pdfDocument.getAttachments().then(function(attachments) {\n        self.attachments = new DocumentAttachmentsView(attachments);\n        document.getElementById('viewAttachments').disabled = !attachments;\n\n        if (attachments &&\n            self.preferenceSidebarViewOnLoad === SidebarView.ATTACHMENTS) {\n          self.switchSidebarView('attachments', true);\n        }\n      });\n    });\n\n    if (self.preferenceSidebarViewOnLoad === SidebarView.THUMBS) {\n      Promise.all([firstPagePromise, onePageRendered]).then(function () {\n        self.switchSidebarView('thumbs', true);\n      });\n    }\n\n    pdfDocument.getMetadata().then(function(data) {\n      var info = data.info, metadata = data.metadata;\n      self.documentInfo = info;\n      self.metadata = metadata;\n\n      // Provides some basic debug information\n      console.log('PDF ' + pdfDocument.fingerprint + ' [' +\n                  info.PDFFormatVersion + ' ' + (info.Producer || '-').trim() +\n                  ' / ' + (info.Creator || '-').trim() + ']' +\n                  ' (PDF.js: ' + (PDFJS.version || '-') +\n                  (!PDFJS.disableWebGL ? ' [WebGL]' : '') + ')');\n\n      var pdfTitle;\n      if (metadata && metadata.has('dc:title')) {\n        pdfTitle = metadata.get('dc:title');\n      }\n\n      if (!pdfTitle && info && info['Title']) {\n        pdfTitle = info['Title'];\n      }\n\n      if (pdfTitle) {\n        self.setTitle(pdfTitle + ' - ' + document.title);\n      }\n\n      if (info.IsAcroFormPresent) {\n        console.warn('Warning: AcroForm/XFA is not supported');\n        PDFView.fallback(PDFJS.UNSUPPORTED_FEATURES.forms);\n      }\n\n    });\n  },\n\n  setInitialView: function pdfViewSetInitialView(storedHash, scale) {\n    // Reset the current scale, as otherwise the page's scale might not get\n    // updated if the zoom level stayed the same.\n    this.currentScale = 0;\n    this.currentScaleValue = null;\n    // When opening a new file (when one is already loaded in the viewer):\n    // Reset 'currentPageNumber', since otherwise the page's scale will be wrong\n    // if 'currentPageNumber' is larger than the number of pages in the file.\n    document.getElementById('pageNumber').value = currentPageNumber = 1;\n    // Reset the current position when loading a new file,\n    // to prevent displaying the wrong position in the document.\n    this.currentPosition = null;\n\n    if (PDFHistory.initialDestination) {\n      this.navigateTo(PDFHistory.initialDestination);\n      PDFHistory.initialDestination = null;\n    } else if (this.initialBookmark) {\n      this.setHash(this.initialBookmark);\n      PDFHistory.push({ hash: this.initialBookmark }, !!this.initialBookmark);\n      this.initialBookmark = null;\n    } else if (storedHash) {\n      this.setHash(storedHash);\n    } else if (scale) {\n      this.setScale(scale, true);\n      this.page = 1;\n    }\n\n    if (PDFView.currentScale === UNKNOWN_SCALE) {\n      // Scale was not initialized: invalid bookmark or scale was not specified.\n      // Setting the default one.\n      this.setScale(DEFAULT_SCALE, true);\n    }\n  },\n\n  renderHighestPriority:\n      function pdfViewRenderHighestPriority(currentlyVisiblePages) {\n    if (PDFView.idleTimeout) {\n      clearTimeout(PDFView.idleTimeout);\n      PDFView.idleTimeout = null;\n    }\n\n    // Pages have a higher priority than thumbnails, so check them first.\n    var visiblePages = currentlyVisiblePages || this.getVisiblePages();\n    var pageView = this.getHighestPriority(visiblePages, this.pages,\n                                           this.pageViewScroll.down);\n    if (pageView) {\n      this.renderView(pageView, 'page');\n      return;\n    }\n    // No pages needed rendering so check thumbnails.\n    if (this.sidebarOpen) {\n      var visibleThumbs = this.getVisibleThumbs();\n      var thumbView = this.getHighestPriority(visibleThumbs,\n                                              this.thumbnails,\n                                              this.thumbnailViewScroll.down);\n      if (thumbView) {\n        this.renderView(thumbView, 'thumbnail');\n        return;\n      }\n    }\n\n    if (this.printing) {\n      // If printing is currently ongoing do not reschedule cleanup.\n      return;\n    }\n\n    PDFView.idleTimeout = setTimeout(function () {\n      PDFView.cleanup();\n    }, CLEANUP_TIMEOUT);\n  },\n\n  cleanup: function pdfViewCleanup() {\n    for (var i = 0, ii = this.pages.length; i < ii; i++) {\n      if (this.pages[i] &&\n          this.pages[i].renderingState !== RenderingStates.FINISHED) {\n        this.pages[i].reset();\n      }\n    }\n    this.pdfDocument.cleanup();\n\n    ThumbnailView.tempImageCache = null;\n  },\n\n  getHighestPriority: function pdfViewGetHighestPriority(visible, views,\n                                                         scrolledDown) {\n    // The state has changed figure out which page has the highest priority to\n    // render next (if any).\n    // Priority:\n    // 1 visible pages\n    // 2 if last scrolled down page after the visible pages\n    // 2 if last scrolled up page before the visible pages\n    var visibleViews = visible.views;\n\n    var numVisible = visibleViews.length;\n    if (numVisible === 0) {\n      return false;\n    }\n    for (var i = 0; i < numVisible; ++i) {\n      var view = visibleViews[i].view;\n      if (!this.isViewFinished(view)) {\n        return view;\n      }\n    }\n\n    // All the visible views have rendered, try to render next/previous pages.\n    if (scrolledDown) {\n      var nextPageIndex = visible.last.id;\n      // ID's start at 1 so no need to add 1.\n      if (views[nextPageIndex] && !this.isViewFinished(views[nextPageIndex])) {\n        return views[nextPageIndex];\n      }\n    } else {\n      var previousPageIndex = visible.first.id - 2;\n      if (views[previousPageIndex] &&\n          !this.isViewFinished(views[previousPageIndex])) {\n        return views[previousPageIndex];\n      }\n    }\n    // Everything that needs to be rendered has been.\n    return false;\n  },\n\n  isViewFinished: function pdfViewIsViewFinished(view) {\n    return view.renderingState === RenderingStates.FINISHED;\n  },\n\n  // Render a page or thumbnail view. This calls the appropriate function based\n  // on the views state. If the view is already rendered it will return false.\n  renderView: function pdfViewRender(view, type) {\n    var state = view.renderingState;\n    switch (state) {\n      case RenderingStates.FINISHED:\n        return false;\n      case RenderingStates.PAUSED:\n        PDFView.highestPriorityPage = type + view.id;\n        view.resume();\n        break;\n      case RenderingStates.RUNNING:\n        PDFView.highestPriorityPage = type + view.id;\n        break;\n      case RenderingStates.INITIAL:\n        PDFView.highestPriorityPage = type + view.id;\n        view.draw(this.renderHighestPriority.bind(this));\n        break;\n    }\n    return true;\n  },\n\n  setHash: function pdfViewSetHash(hash) {\n    var validFitZoomValues = ['Fit','FitB','FitH','FitBH',\n      'FitV','FitBV','FitR'];\n\n    if (!hash) {\n      return;\n    }\n\n    if (hash.indexOf('=') >= 0) {\n      var params = PDFView.parseQueryString(hash);\n      // borrowing syntax from \"Parameters for Opening PDF Files\"\n      if ('nameddest' in params) {\n        PDFHistory.updateNextHashParam(params.nameddest);\n        PDFView.navigateTo(params.nameddest);\n        return;\n      }\n      var pageNumber, dest;\n      if ('page' in params) {\n        pageNumber = (params.page | 0) || 1;\n      }\n      if ('zoom' in params) {\n        var zoomArgs = params.zoom.split(','); // scale,left,top\n        // building destination array\n\n        // If the zoom value, it has to get divided by 100. If it is a string,\n        // it should stay as it is.\n        var zoomArg = zoomArgs[0];\n        var zoomArgNumber = parseFloat(zoomArg);\n        var destName = 'XYZ';\n        if (zoomArgNumber) {\n          zoomArg = zoomArgNumber / 100;\n        } else if (validFitZoomValues.indexOf(zoomArg) >= 0) {\n          destName = zoomArg;\n        }\n        dest = [null, { name: destName },\n                zoomArgs.length > 1 ? (zoomArgs[1] | 0) : null,\n                zoomArgs.length > 2 ? (zoomArgs[2] | 0) : null,\n                zoomArg];\n      }\n      if (dest) {\n        var currentPage = this.pages[(pageNumber || this.page) - 1];\n        currentPage.scrollIntoView(dest);\n      } else if (pageNumber) {\n        this.page = pageNumber; // simple page\n      }\n      if ('pagemode' in params) {\n        if (params.pagemode === 'thumbs' || params.pagemode === 'bookmarks' ||\n            params.pagemode === 'attachments') {\n          this.switchSidebarView((params.pagemode === 'bookmarks' ?\n                                  'outline' : params.pagemode), true);\n        } else if (params.pagemode === 'none' && this.sidebarOpen) {\n          document.getElementById('sidebarToggle').click();\n        }\n      }\n    } else if (/^\\d+$/.test(hash)) { // page number\n      this.page = hash;\n    } else { // named destination\n      PDFHistory.updateNextHashParam(unescape(hash));\n      PDFView.navigateTo(unescape(hash));\n    }\n  },\n\n  switchSidebarView: function pdfViewSwitchSidebarView(view, openSidebar) {\n    if (openSidebar && !this.sidebarOpen) {\n      document.getElementById('sidebarToggle').click();\n    }\n    var thumbsView = document.getElementById('thumbnailView');\n    var outlineView = document.getElementById('outlineView');\n    var attachmentsView = document.getElementById('attachmentsView');\n\n    var thumbsButton = document.getElementById('viewThumbnail');\n    var outlineButton = document.getElementById('viewOutline');\n    var attachmentsButton = document.getElementById('viewAttachments');\n\n    switch (view) {\n      case 'thumbs':\n        var wasAnotherViewVisible = thumbsView.classList.contains('hidden');\n\n        thumbsButton.classList.add('toggled');\n        outlineButton.classList.remove('toggled');\n        attachmentsButton.classList.remove('toggled');\n        thumbsView.classList.remove('hidden');\n        outlineView.classList.add('hidden');\n        attachmentsView.classList.add('hidden');\n\n        PDFView.renderHighestPriority();\n\n        if (wasAnotherViewVisible) {\n          // Ensure that the thumbnail of the current page is visible\n          // when switching from another view.\n          scrollIntoView(document.getElementById('thumbnailContainer' +\n                                                 this.page));\n        }\n        break;\n\n      case 'outline':\n        thumbsButton.classList.remove('toggled');\n        outlineButton.classList.add('toggled');\n        attachmentsButton.classList.remove('toggled');\n        thumbsView.classList.add('hidden');\n        outlineView.classList.remove('hidden');\n        attachmentsView.classList.add('hidden');\n\n        if (outlineButton.getAttribute('disabled')) {\n          return;\n        }\n        break;\n\n      case 'attachments':\n        thumbsButton.classList.remove('toggled');\n        outlineButton.classList.remove('toggled');\n        attachmentsButton.classList.add('toggled');\n        thumbsView.classList.add('hidden');\n        outlineView.classList.add('hidden');\n        attachmentsView.classList.remove('hidden');\n\n        if (attachmentsButton.getAttribute('disabled')) {\n          return;\n        }\n        break;\n    }\n  },\n\n  getVisiblePages: function pdfViewGetVisiblePages() {\n    if (!PresentationMode.active) {\n      return this.getVisibleElements(this.container, this.pages, true);\n    } else {\n      // The algorithm in getVisibleElements doesn't work in all browsers and\n      // configurations when presentation mode is active.\n      var visible = [];\n      var currentPage = this.pages[this.page - 1];\n      visible.push({ id: currentPage.id, view: currentPage });\n      return { first: currentPage, last: currentPage, views: visible };\n    }\n  },\n\n  getVisibleThumbs: function pdfViewGetVisibleThumbs() {\n    return this.getVisibleElements(this.thumbnailContainer, this.thumbnails);\n  },\n\n  // Generic helper to find out what elements are visible within a scroll pane.\n  getVisibleElements: function pdfViewGetVisibleElements(\n      scrollEl, views, sortByVisibility) {\n    var top = scrollEl.scrollTop, bottom = top + scrollEl.clientHeight;\n    var left = scrollEl.scrollLeft, right = left + scrollEl.clientWidth;\n\n    var visible = [], view;\n    var currentHeight, viewHeight, hiddenHeight, percentHeight;\n    var currentWidth, viewWidth;\n    for (var i = 0, ii = views.length; i < ii; ++i) {\n      view = views[i];\n      currentHeight = view.el.offsetTop + view.el.clientTop;\n      viewHeight = view.el.clientHeight;\n      if ((currentHeight + viewHeight) < top) {\n        continue;\n      }\n      if (currentHeight > bottom) {\n        break;\n      }\n      currentWidth = view.el.offsetLeft + view.el.clientLeft;\n      viewWidth = view.el.clientWidth;\n      if ((currentWidth + viewWidth) < left || currentWidth > right) {\n        continue;\n      }\n      hiddenHeight = Math.max(0, top - currentHeight) +\n                     Math.max(0, currentHeight + viewHeight - bottom);\n      percentHeight = ((viewHeight - hiddenHeight) * 100 / viewHeight) | 0;\n\n      visible.push({ id: view.id, x: currentWidth, y: currentHeight,\n                     view: view, percent: percentHeight });\n    }\n\n    var first = visible[0];\n    var last = visible[visible.length - 1];\n\n    if (sortByVisibility) {\n      visible.sort(function(a, b) {\n        var pc = a.percent - b.percent;\n        if (Math.abs(pc) > 0.001) {\n          return -pc;\n        }\n        return a.id - b.id; // ensure stability\n      });\n    }\n    return {first: first, last: last, views: visible};\n  },\n\n  // Helper function to parse query string (e.g. ?param1=value&parm2=...).\n  parseQueryString: function pdfViewParseQueryString(query) {\n    var parts = query.split('&');\n    var params = {};\n    for (var i = 0, ii = parts.length; i < ii; ++i) {\n      var param = parts[i].split('=');\n      var key = param[0];\n      var value = param.length > 1 ? param[1] : null;\n      params[decodeURIComponent(key)] = decodeURIComponent(value);\n    }\n    return params;\n  },\n\n  beforePrint: function pdfViewSetupBeforePrint() {\n    if (!this.supportsPrinting) {\n      var printMessage = mozL10n.get('printing_not_supported', null,\n          'Warning: Printing is not fully supported by this browser.');\n      this.error(printMessage);\n      return;\n    }\n\n    var alertNotReady = false;\n    var i, ii;\n    if (!this.pages.length) {\n      alertNotReady = true;\n    } else {\n      for (i = 0, ii = this.pages.length; i < ii; ++i) {\n        if (!this.pages[i].pdfPage) {\n          alertNotReady = true;\n          break;\n        }\n      }\n    }\n    if (alertNotReady) {\n      var notReadyMessage = mozL10n.get('printing_not_ready', null,\n          'Warning: The PDF is not fully loaded for printing.');\n      window.alert(notReadyMessage);\n      return;\n    }\n\n    this.printing = true;\n    this.renderHighestPriority();\n\n    var body = document.querySelector('body');\n    body.setAttribute('data-mozPrintCallback', true);\n    for (i = 0, ii = this.pages.length; i < ii; ++i) {\n      this.pages[i].beforePrint();\n    }\n\n  },\n\n  afterPrint: function pdfViewSetupAfterPrint() {\n    var div = document.getElementById('printContainer');\n    while (div.hasChildNodes()) {\n      div.removeChild(div.lastChild);\n    }\n\n    this.printing = false;\n    this.renderHighestPriority();\n  },\n\n  rotatePages: function pdfViewRotatePages(delta) {\n    var currentPage = this.pages[this.page - 1];\n    var i, l;\n    this.pageRotation = (this.pageRotation + 360 + delta) % 360;\n\n    for (i = 0, l = this.pages.length; i < l; i++) {\n      var page = this.pages[i];\n      page.update(page.scale, this.pageRotation);\n    }\n\n    for (i = 0, l = this.thumbnails.length; i < l; i++) {\n      var thumb = this.thumbnails[i];\n      thumb.update(this.pageRotation);\n    }\n\n    this.setScale(this.currentScaleValue, true, true);\n\n    this.renderHighestPriority();\n\n    if (currentPage) {\n      currentPage.scrollIntoView();\n    }\n  },\n\n  /**\n   * This function flips the page in presentation mode if the user scrolls up\n   * or down with large enough motion and prevents page flipping too often.\n   *\n   * @this {PDFView}\n   * @param {number} mouseScrollDelta The delta value from the mouse event.\n   */\n  mouseScroll: function pdfViewMouseScroll(mouseScrollDelta) {\n    var MOUSE_SCROLL_COOLDOWN_TIME = 50;\n\n    var currentTime = (new Date()).getTime();\n    var storedTime = this.mouseScrollTimeStamp;\n\n    // In case one page has already been flipped there is a cooldown time\n    // which has to expire before next page can be scrolled on to.\n    if (currentTime > storedTime &&\n        currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) {\n      return;\n    }\n\n    // In case the user decides to scroll to the opposite direction than before\n    // clear the accumulated delta.\n    if ((this.mouseScrollDelta > 0 && mouseScrollDelta < 0) ||\n        (this.mouseScrollDelta < 0 && mouseScrollDelta > 0)) {\n      this.clearMouseScrollState();\n    }\n\n    this.mouseScrollDelta += mouseScrollDelta;\n\n    var PAGE_FLIP_THRESHOLD = 120;\n    if (Math.abs(this.mouseScrollDelta) >= PAGE_FLIP_THRESHOLD) {\n\n      var PageFlipDirection = {\n        UP: -1,\n        DOWN: 1\n      };\n\n      // In presentation mode scroll one page at a time.\n      var pageFlipDirection = (this.mouseScrollDelta > 0) ?\n                                PageFlipDirection.UP :\n                                PageFlipDirection.DOWN;\n      this.clearMouseScrollState();\n      var currentPage = this.page;\n\n      // In case we are already on the first or the last page there is no need\n      // to do anything.\n      if ((currentPage == 1 && pageFlipDirection == PageFlipDirection.UP) ||\n          (currentPage == this.pages.length &&\n           pageFlipDirection == PageFlipDirection.DOWN)) {\n        return;\n      }\n\n      this.page += pageFlipDirection;\n      this.mouseScrollTimeStamp = currentTime;\n    }\n  },\n\n  /**\n   * This function clears the member attributes used with mouse scrolling in\n   * presentation mode.\n   *\n   * @this {PDFView}\n   */\n  clearMouseScrollState: function pdfViewClearMouseScrollState() {\n    this.mouseScrollTimeStamp = 0;\n    this.mouseScrollDelta = 0;\n  }\n};\n\n\nvar PageView = function pageView(container, id, scale,\n                                 navigateTo, defaultViewport) {\n  this.id = id;\n\n  this.rotation = 0;\n  this.scale = scale || 1.0;\n  this.viewport = defaultViewport;\n  this.pdfPageRotate = defaultViewport.rotation;\n  this.hasRestrictedScaling = false;\n\n  this.renderingState = RenderingStates.INITIAL;\n  this.resume = null;\n\n  this.textLayer = null;\n\n  this.zoomLayer = null;\n\n  this.annotationLayer = null;\n\n  var anchor = document.createElement('a');\n  anchor.name = '' + this.id;\n\n  var div = this.el = document.createElement('div');\n  div.id = 'pageContainer' + this.id;\n  div.className = 'page';\n  div.style.width = Math.floor(this.viewport.width) + 'px';\n  div.style.height = Math.floor(this.viewport.height) + 'px';\n\n  container.appendChild(anchor);\n  container.appendChild(div);\n\n  this.setPdfPage = function pageViewSetPdfPage(pdfPage) {\n    this.pdfPage = pdfPage;\n    this.pdfPageRotate = pdfPage.rotate;\n    var totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n    this.viewport = pdfPage.getViewport(this.scale * CSS_UNITS, totalRotation);\n    this.stats = pdfPage.stats;\n    this.reset();\n  };\n\n  this.destroy = function pageViewDestroy() {\n    this.zoomLayer = null;\n    this.reset();\n    if (this.pdfPage) {\n      this.pdfPage.destroy();\n    }\n  };\n\n  this.reset = function pageViewReset(keepAnnotations) {\n    if (this.renderTask) {\n      this.renderTask.cancel();\n    }\n    this.resume = null;\n    this.renderingState = RenderingStates.INITIAL;\n\n    div.style.width = Math.floor(this.viewport.width) + 'px';\n    div.style.height = Math.floor(this.viewport.height) + 'px';\n\n    var childNodes = div.childNodes;\n    for (var i = div.childNodes.length - 1; i >= 0; i--) {\n      var node = childNodes[i];\n      if ((this.zoomLayer && this.zoomLayer === node) ||\n          (keepAnnotations && this.annotationLayer === node)) {\n        continue;\n      }\n      div.removeChild(node);\n    }\n    div.removeAttribute('data-loaded');\n\n    if (keepAnnotations) {\n      if (this.annotationLayer) {\n        // Hide annotationLayer until all elements are resized\n        // so they are not displayed on the already-resized page\n        this.annotationLayer.setAttribute('hidden', 'true');\n      }\n    } else {\n      this.annotationLayer = null;\n    }\n\n    if (this.canvas) {\n      // Zeroing the width and height causes Firefox to release graphics\n      // resources immediately, which can greatly reduce memory consumption.\n      this.canvas.width = 0;\n      this.canvas.height = 0;\n      delete this.canvas;\n    }\n\n    this.loadingIconDiv = document.createElement('div');\n    this.loadingIconDiv.className = 'loadingIcon';\n    div.appendChild(this.loadingIconDiv);\n  };\n\n  this.update = function pageViewUpdate(scale, rotation) {\n    this.scale = scale || this.scale;\n\n    if (typeof rotation !== 'undefined') {\n      this.rotation = rotation;\n    }\n\n    var totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n    this.viewport = this.viewport.clone({\n      scale: this.scale * CSS_UNITS,\n      rotation: totalRotation\n    });\n\n    var isScalingRestricted = false;\n    if (this.canvas && PDFJS.maxCanvasPixels > 0) {\n      var ctx = this.canvas.getContext('2d');\n      var outputScale = getOutputScale(ctx);\n      var pixelsInViewport = this.viewport.width * this.viewport.height;\n      var maxScale = Math.sqrt(PDFJS.maxCanvasPixels / pixelsInViewport);\n      if (((Math.floor(this.viewport.width) * outputScale.sx) | 0) *\n          ((Math.floor(this.viewport.height) * outputScale.sy) | 0) >\n          PDFJS.maxCanvasPixels) {\n        isScalingRestricted = true;\n      }\n    }\n\n    if (this.canvas &&\n        (PDFJS.useOnlyCssZoom ||\n          (this.hasRestrictedScaling && isScalingRestricted))) {\n      this.cssTransform(this.canvas, true);\n      return;\n    } else if (this.canvas && !this.zoomLayer) {\n      this.zoomLayer = this.canvas.parentNode;\n      this.zoomLayer.style.position = 'absolute';\n    }\n    if (this.zoomLayer) {\n      this.cssTransform(this.zoomLayer.firstChild);\n    }\n    this.reset(true);\n  };\n\n  this.cssTransform = function pageCssTransform(canvas, redrawAnnotations) {\n    // Scale canvas, canvas wrapper, and page container.\n    var width = this.viewport.width;\n    var height = this.viewport.height;\n    canvas.style.width = canvas.parentNode.style.width = div.style.width =\n        Math.floor(width) + 'px';\n    canvas.style.height = canvas.parentNode.style.height = div.style.height =\n        Math.floor(height) + 'px';\n    // The canvas may have been originally rotated, so rotate relative to that.\n    var relativeRotation = this.viewport.rotation - canvas._viewport.rotation;\n    var absRotation = Math.abs(relativeRotation);\n    var scaleX = 1, scaleY = 1;\n    if (absRotation === 90 || absRotation === 270) {\n      // Scale x and y because of the rotation.\n      scaleX = height / width;\n      scaleY = width / height;\n    }\n    var cssTransform = 'rotate(' + relativeRotation + 'deg) ' +\n                       'scale(' + scaleX + ',' + scaleY + ')';\n    CustomStyle.setProp('transform', canvas, cssTransform);\n\n    if (this.textLayer) {\n      // Rotating the text layer is more complicated since the divs inside the\n      // the text layer are rotated.\n      // TODO: This could probably be simplified by drawing the text layer in\n      // one orientation then rotating overall.\n      var textLayerViewport = this.textLayer.viewport;\n      var textRelativeRotation = this.viewport.rotation -\n                                 textLayerViewport.rotation;\n      var textAbsRotation = Math.abs(textRelativeRotation);\n      var scale = width / textLayerViewport.width;\n      if (textAbsRotation === 90 || textAbsRotation === 270) {\n        scale = width / textLayerViewport.height;\n      }\n      var textLayerDiv = this.textLayer.textLayerDiv;\n      var transX, transY;\n      switch (textAbsRotation) {\n        case 0:\n          transX = transY = 0;\n          break;\n        case 90:\n          transX = 0;\n          transY = '-' + textLayerDiv.style.height;\n          break;\n        case 180:\n          transX = '-' + textLayerDiv.style.width;\n          transY = '-' + textLayerDiv.style.height;\n          break;\n        case 270:\n          transX = '-' + textLayerDiv.style.width;\n          transY = 0;\n          break;\n        default:\n          console.error('Bad rotation value.');\n          break;\n      }\n      CustomStyle.setProp('transform', textLayerDiv,\n                          'rotate(' + textAbsRotation + 'deg) ' +\n                            'scale(' + scale + ', ' + scale + ') ' +\n                            'translate(' + transX + ', ' + transY + ')');\n      CustomStyle.setProp('transformOrigin', textLayerDiv, '0% 0%');\n    }\n\n    if (redrawAnnotations && this.annotationLayer) {\n      setupAnnotations(div, this.pdfPage, this.viewport);\n    }\n  };\n\n  Object.defineProperty(this, 'width', {\n    get: function PageView_getWidth() {\n      return this.viewport.width;\n    },\n    enumerable: true\n  });\n\n  Object.defineProperty(this, 'height', {\n    get: function PageView_getHeight() {\n      return this.viewport.height;\n    },\n    enumerable: true\n  });\n\n  var self = this;\n\n  function setupAnnotations(pageDiv, pdfPage, viewport) {\n\n    function bindLink(link, dest) {\n      link.href = PDFView.getDestinationHash(dest);\n      link.onclick = function pageViewSetupLinksOnclick() {\n        if (dest) {\n          PDFView.navigateTo(dest);\n        }\n        return false;\n      };\n      if (dest) {\n        link.className = 'internalLink';\n      }\n    }\n\n    function bindNamedAction(link, action) {\n      link.href = PDFView.getAnchorUrl('');\n      link.onclick = function pageViewSetupNamedActionOnClick() {\n        // See PDF reference, table 8.45 - Named action\n        switch (action) {\n          case 'GoToPage':\n            document.getElementById('pageNumber').focus();\n            break;\n\n          case 'GoBack':\n            PDFHistory.back();\n            break;\n\n          case 'GoForward':\n            PDFHistory.forward();\n            break;\n\n          case 'Find':\n            if (!PDFView.supportsIntegratedFind) {\n              PDFFindBar.toggle();\n            }\n            break;\n\n          case 'NextPage':\n            PDFView.page++;\n            break;\n\n          case 'PrevPage':\n            PDFView.page--;\n            break;\n\n          case 'LastPage':\n            PDFView.page = PDFView.pages.length;\n            break;\n\n          case 'FirstPage':\n            PDFView.page = 1;\n            break;\n\n          default:\n            break; // No action according to spec\n        }\n        return false;\n      };\n      link.className = 'internalLink';\n    }\n\n    pdfPage.getAnnotations().then(function(annotationsData) {\n      viewport = viewport.clone({ dontFlip: true });\n      var transform = viewport.transform;\n      var transformStr = 'matrix(' + transform.join(',') + ')';\n      var data, element, i, ii;\n\n      if (self.annotationLayer) {\n        // If an annotationLayer already exists, refresh its children's\n        // transformation matrices\n        for (i = 0, ii = annotationsData.length; i < ii; i++) {\n          data = annotationsData[i];\n          element = self.annotationLayer.querySelector(\n            '[data-annotation-id=\"' + data.id + '\"]');\n          if (element) {\n            CustomStyle.setProp('transform', element, transformStr);\n          }\n        }\n        // See this.reset()\n        self.annotationLayer.removeAttribute('hidden');\n      } else {\n        for (i = 0, ii = annotationsData.length; i < ii; i++) {\n          data = annotationsData[i];\n          if (!data || !data.hasHtml) {\n            continue;\n          }\n\n          element = PDFJS.AnnotationUtils.getHtmlElement(data,\n                                                         pdfPage.commonObjs);\n          element.setAttribute('data-annotation-id', data.id);\n          mozL10n.translate(element);\n\n          var rect = data.rect;\n          var view = pdfPage.view;\n          rect = PDFJS.Util.normalizeRect([\n            rect[0],\n            view[3] - rect[1] + view[1],\n            rect[2],\n            view[3] - rect[3] + view[1]\n          ]);\n          element.style.left = rect[0] + 'px';\n          element.style.top = rect[1] + 'px';\n          element.style.position = 'absolute';\n\n          CustomStyle.setProp('transform', element, transformStr);\n          var transformOriginStr = -rect[0] + 'px ' + -rect[1] + 'px';\n          CustomStyle.setProp('transformOrigin', element, transformOriginStr);\n\n          if (data.subtype === 'Link' && !data.url) {\n            var link = element.getElementsByTagName('a')[0];\n            if (link) {\n              if (data.action) {\n                bindNamedAction(link, data.action);\n              } else {\n                bindLink(link, ('dest' in data) ? data.dest : null);\n              }\n            }\n          }\n\n          if (!self.annotationLayer) {\n            var annotationLayerDiv = document.createElement('div');\n            annotationLayerDiv.className = 'annotationLayer';\n            pageDiv.appendChild(annotationLayerDiv);\n            self.annotationLayer = annotationLayerDiv;\n          }\n\n          self.annotationLayer.appendChild(element);\n        }\n      }\n    });\n  }\n\n  this.getPagePoint = function pageViewGetPagePoint(x, y) {\n    return this.viewport.convertToPdfPoint(x, y);\n  };\n\n  this.scrollIntoView = function pageViewScrollIntoView(dest) {\n    if (PresentationMode.active) {\n      if (PDFView.page !== this.id) {\n        // Avoid breaking PDFView.getVisiblePages in presentation mode.\n        PDFView.page = this.id;\n        return;\n      }\n      dest = null;\n      PDFView.setScale(PDFView.currentScaleValue, true, true);\n    }\n    if (!dest) {\n      scrollIntoView(div);\n      return;\n    }\n\n    var x = 0, y = 0;\n    var width = 0, height = 0, widthScale, heightScale;\n    var changeOrientation = (this.rotation % 180 === 0 ? false : true);\n    var pageWidth = (changeOrientation ? this.height : this.width) /\n      this.scale / CSS_UNITS;\n    var pageHeight = (changeOrientation ? this.width : this.height) /\n      this.scale / CSS_UNITS;\n    var scale = 0;\n    switch (dest[1].name) {\n      case 'XYZ':\n        x = dest[2];\n        y = dest[3];\n        scale = dest[4];\n        // If x and/or y coordinates are not supplied, default to\n        // _top_ left of the page (not the obvious bottom left,\n        // since aligning the bottom of the intended page with the\n        // top of the window is rarely helpful).\n        x = x !== null ? x : 0;\n        y = y !== null ? y : pageHeight;\n        break;\n      case 'Fit':\n      case 'FitB':\n        scale = 'page-fit';\n        break;\n      case 'FitH':\n      case 'FitBH':\n        y = dest[2];\n        scale = 'page-width';\n        break;\n      case 'FitV':\n      case 'FitBV':\n        x = dest[2];\n        width = pageWidth;\n        height = pageHeight;\n        scale = 'page-height';\n        break;\n      case 'FitR':\n        x = dest[2];\n        y = dest[3];\n        width = dest[4] - x;\n        height = dest[5] - y;\n        widthScale = (PDFView.container.clientWidth - SCROLLBAR_PADDING) /\n          width / CSS_UNITS;\n        heightScale = (PDFView.container.clientHeight - SCROLLBAR_PADDING) /\n          height / CSS_UNITS;\n        scale = Math.min(Math.abs(widthScale), Math.abs(heightScale));\n        break;\n      default:\n        return;\n    }\n\n    if (scale && scale !== PDFView.currentScale) {\n      PDFView.setScale(scale, true, true);\n    } else if (PDFView.currentScale === UNKNOWN_SCALE) {\n      PDFView.setScale(DEFAULT_SCALE, true, true);\n    }\n\n    if (scale === 'page-fit' && !dest[4]) {\n      scrollIntoView(div);\n      return;\n    }\n\n    var boundingRect = [\n      this.viewport.convertToViewportPoint(x, y),\n      this.viewport.convertToViewportPoint(x + width, y + height)\n    ];\n    var left = Math.min(boundingRect[0][0], boundingRect[1][0]);\n    var top = Math.min(boundingRect[0][1], boundingRect[1][1]);\n\n    scrollIntoView(div, { left: left, top: top });\n  };\n\n  this.getTextContent = function pageviewGetTextContent() {\n    return PDFView.getPage(this.id).then(function(pdfPage) {\n      return pdfPage.getTextContent();\n    });\n  };\n\n  this.draw = function pageviewDraw(callback) {\n    var pdfPage = this.pdfPage;\n\n    if (this.pagePdfPromise) {\n      return;\n    }\n    if (!pdfPage) {\n      var promise = PDFView.getPage(this.id);\n      promise.then(function(pdfPage) {\n        delete this.pagePdfPromise;\n        this.setPdfPage(pdfPage);\n        this.draw(callback);\n      }.bind(this));\n      this.pagePdfPromise = promise;\n      return;\n    }\n\n    if (this.renderingState !== RenderingStates.INITIAL) {\n      console.error('Must be in new state before drawing');\n    }\n\n    this.renderingState = RenderingStates.RUNNING;\n\n    var viewport = this.viewport;\n    // Wrap the canvas so if it has a css transform for highdpi the overflow\n    // will be hidden in FF.\n    var canvasWrapper = document.createElement('div');\n    canvasWrapper.style.width = div.style.width;\n    canvasWrapper.style.height = div.style.height;\n    canvasWrapper.classList.add('canvasWrapper');\n\n    var canvas = document.createElement('canvas');\n    canvas.id = 'page' + this.id;\n    canvasWrapper.appendChild(canvas);\n    if (this.annotationLayer) {\n      // annotationLayer needs to stay on top\n      div.insertBefore(canvasWrapper, this.annotationLayer);\n    } else {\n      div.appendChild(canvasWrapper);\n    }\n    this.canvas = canvas;\n\n    var ctx = canvas.getContext('2d');\n    var outputScale = getOutputScale(ctx);\n\n    if (PDFJS.useOnlyCssZoom) {\n      var actualSizeViewport = viewport.clone({ scale: CSS_UNITS });\n      // Use a scale that will make the canvas be the original intended size\n      // of the page.\n      outputScale.sx *= actualSizeViewport.width / viewport.width;\n      outputScale.sy *= actualSizeViewport.height / viewport.height;\n      outputScale.scaled = true;\n    }\n\n    if (PDFJS.maxCanvasPixels > 0) {\n      var pixelsInViewport = viewport.width * viewport.height;\n      var maxScale = Math.sqrt(PDFJS.maxCanvasPixels / pixelsInViewport);\n      if (outputScale.sx > maxScale || outputScale.sy > maxScale) {\n        outputScale.sx = maxScale;\n        outputScale.sy = maxScale;\n        outputScale.scaled = true;\n        this.hasRestrictedScaling = true;\n      } else {\n        this.hasRestrictedScaling = false;\n      }\n    }\n\n    canvas.width = (Math.floor(viewport.width) * outputScale.sx) | 0;\n    canvas.height = (Math.floor(viewport.height) * outputScale.sy) | 0;\n    canvas.style.width = Math.floor(viewport.width) + 'px';\n    canvas.style.height = Math.floor(viewport.height) + 'px';\n    // Add the viewport so it's known what it was originally drawn with.\n    canvas._viewport = viewport;\n\n    var textLayerDiv = null;\n    if (!PDFJS.disableTextLayer) {\n      textLayerDiv = document.createElement('div');\n      textLayerDiv.className = 'textLayer';\n      textLayerDiv.style.width = canvas.style.width;\n      textLayerDiv.style.height = canvas.style.height;\n      if (this.annotationLayer) {\n        // annotationLayer needs to stay on top\n        div.insertBefore(textLayerDiv, this.annotationLayer);\n      } else {\n        div.appendChild(textLayerDiv);\n      }\n    }\n    var textLayer = this.textLayer =\n      textLayerDiv ? new TextLayerBuilder({\n        textLayerDiv: textLayerDiv,\n        pageIndex: this.id - 1,\n        lastScrollSource: PDFView,\n        viewport: this.viewport,\n        isViewerInPresentationMode: PresentationMode.active\n      }) : null;\n    // TODO(mack): use data attributes to store these\n    ctx._scaleX = outputScale.sx;\n    ctx._scaleY = outputScale.sy;\n    if (outputScale.scaled) {\n      ctx.scale(outputScale.sx, outputScale.sy);\n    }\n\n    // Rendering area\n\n    var self = this;\n    function pageViewDrawCallback(error) {\n      // The renderTask may have been replaced by a new one, so only remove the\n      // reference to the renderTask if it matches the one that is triggering\n      // this callback.\n      if (renderTask === self.renderTask) {\n        self.renderTask = null;\n      }\n\n      if (error === 'cancelled') {\n        return;\n      }\n\n      self.renderingState = RenderingStates.FINISHED;\n\n      if (self.loadingIconDiv) {\n        div.removeChild(self.loadingIconDiv);\n        delete self.loadingIconDiv;\n      }\n\n      if (self.zoomLayer) {\n        div.removeChild(self.zoomLayer);\n        self.zoomLayer = null;\n      }\n\n      if (error) {\n        PDFView.error(mozL10n.get('rendering_error', null,\n          'An error occurred while rendering the page.'), error);\n      }\n\n      self.stats = pdfPage.stats;\n      self.updateStats();\n      if (self.onAfterDraw) {\n        self.onAfterDraw();\n      }\n\n      var event = document.createEvent('CustomEvent');\n      event.initCustomEvent('pagerender', true, true, {\n        pageNumber: pdfPage.pageNumber\n      });\n      div.dispatchEvent(event);\n\n      callback();\n    }\n\n    var renderContext = {\n      canvasContext: ctx,\n      viewport: this.viewport,\n      textLayer: textLayer,\n      // intent: 'default', // === 'display'\n      continueCallback: function pdfViewcContinueCallback(cont) {\n        if (PDFView.highestPriorityPage !== 'page' + self.id) {\n          self.renderingState = RenderingStates.PAUSED;\n          self.resume = function resumeCallback() {\n            self.renderingState = RenderingStates.RUNNING;\n            cont();\n          };\n          return;\n        }\n        cont();\n      }\n    };\n    var renderTask = this.renderTask = this.pdfPage.render(renderContext);\n\n    this.renderTask.promise.then(\n      function pdfPageRenderCallback() {\n        pageViewDrawCallback(null);\n        if (textLayer) {\n          self.getTextContent().then(\n            function textContentResolved(textContent) {\n              textLayer.setTextContent(textContent);\n            }\n          );\n        }\n      },\n      function pdfPageRenderError(error) {\n        pageViewDrawCallback(error);\n      }\n    );\n\n    setupAnnotations(div, pdfPage, this.viewport);\n    div.setAttribute('data-loaded', true);\n\n    // Add the page to the cache at the start of drawing. That way it can be\n    // evicted from the cache and destroyed even if we pause its rendering.\n    cache.push(this);\n  };\n\n  this.beforePrint = function pageViewBeforePrint() {\n    var pdfPage = this.pdfPage;\n\n    var viewport = pdfPage.getViewport(1);\n    // Use the same hack we use for high dpi displays for printing to get better\n    // output until bug 811002 is fixed in FF.\n    var PRINT_OUTPUT_SCALE = 2;\n    var canvas = document.createElement('canvas');\n    canvas.width = Math.floor(viewport.width) * PRINT_OUTPUT_SCALE;\n    canvas.height = Math.floor(viewport.height) * PRINT_OUTPUT_SCALE;\n    canvas.style.width = (PRINT_OUTPUT_SCALE * viewport.width) + 'pt';\n    canvas.style.height = (PRINT_OUTPUT_SCALE * viewport.height) + 'pt';\n    var cssScale = 'scale(' + (1 / PRINT_OUTPUT_SCALE) + ', ' +\n                              (1 / PRINT_OUTPUT_SCALE) + ')';\n    CustomStyle.setProp('transform' , canvas, cssScale);\n    CustomStyle.setProp('transformOrigin' , canvas, '0% 0%');\n\n    var printContainer = document.getElementById('printContainer');\n    var canvasWrapper = document.createElement('div');\n    canvasWrapper.style.width = viewport.width + 'pt';\n    canvasWrapper.style.height = viewport.height + 'pt';\n    canvasWrapper.appendChild(canvas);\n    printContainer.appendChild(canvasWrapper);\n\n    canvas.mozPrintCallback = function(obj) {\n      var ctx = obj.context;\n\n      ctx.save();\n      ctx.fillStyle = 'rgb(255, 255, 255)';\n      ctx.fillRect(0, 0, canvas.width, canvas.height);\n      ctx.restore();\n      ctx.scale(PRINT_OUTPUT_SCALE, PRINT_OUTPUT_SCALE);\n\n      var renderContext = {\n        canvasContext: ctx,\n        viewport: viewport,\n        intent: 'print'\n      };\n\n      pdfPage.render(renderContext).promise.then(function() {\n        // Tell the printEngine that rendering this canvas/page has finished.\n        obj.done();\n      }, function(error) {\n        console.error(error);\n        // Tell the printEngine that rendering this canvas/page has failed.\n        // This will make the print proces stop.\n        if ('abort' in obj) {\n          obj.abort();\n        } else {\n          obj.done();\n        }\n      });\n    };\n  };\n\n  this.updateStats = function pageViewUpdateStats() {\n    if (!this.stats) {\n      return;\n    }\n\n    if (PDFJS.pdfBug && Stats.enabled) {\n      var stats = this.stats;\n      Stats.add(this.id, stats);\n    }\n  };\n};\n\n\nvar ThumbnailView = function thumbnailView(container, id, defaultViewport) {\n  var anchor = document.createElement('a');\n  anchor.href = PDFView.getAnchorUrl('#page=' + id);\n  anchor.title = mozL10n.get('thumb_page_title', {page: id}, 'Page {{page}}');\n  anchor.onclick = function stopNavigation() {\n    PDFView.page = id;\n    return false;\n  };\n\n  this.pdfPage = undefined;\n  this.viewport = defaultViewport;\n  this.pdfPageRotate = defaultViewport.rotation;\n\n  this.rotation = 0;\n  this.pageWidth = this.viewport.width;\n  this.pageHeight = this.viewport.height;\n  this.pageRatio = this.pageWidth / this.pageHeight;\n  this.id = id;\n\n  this.canvasWidth = 98;\n  this.canvasHeight = this.canvasWidth / this.pageWidth * this.pageHeight;\n  this.scale = (this.canvasWidth / this.pageWidth);\n\n  var div = this.el = document.createElement('div');\n  div.id = 'thumbnailContainer' + id;\n  div.className = 'thumbnail';\n\n  if (id === 1) {\n    // Highlight the thumbnail of the first page when no page number is\n    // specified (or exists in cache) when the document is loaded.\n    div.classList.add('selected');\n  }\n\n  var ring = document.createElement('div');\n  ring.className = 'thumbnailSelectionRing';\n  ring.style.width = this.canvasWidth + 'px';\n  ring.style.height = this.canvasHeight + 'px';\n\n  div.appendChild(ring);\n  anchor.appendChild(div);\n  container.appendChild(anchor);\n\n  this.hasImage = false;\n  this.renderingState = RenderingStates.INITIAL;\n\n  this.setPdfPage = function thumbnailViewSetPdfPage(pdfPage) {\n    this.pdfPage = pdfPage;\n    this.pdfPageRotate = pdfPage.rotate;\n    var totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n    this.viewport = pdfPage.getViewport(1, totalRotation);\n    this.update();\n  };\n\n  this.update = function thumbnailViewUpdate(rotation) {\n    if (rotation !== undefined) {\n      this.rotation = rotation;\n    }\n    var totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n    this.viewport = this.viewport.clone({\n      scale: 1,\n      rotation: totalRotation\n    });\n    this.pageWidth = this.viewport.width;\n    this.pageHeight = this.viewport.height;\n    this.pageRatio = this.pageWidth / this.pageHeight;\n\n    this.canvasHeight = this.canvasWidth / this.pageWidth * this.pageHeight;\n    this.scale = (this.canvasWidth / this.pageWidth);\n\n    div.removeAttribute('data-loaded');\n    ring.textContent = '';\n    ring.style.width = this.canvasWidth + 'px';\n    ring.style.height = this.canvasHeight + 'px';\n\n    this.hasImage = false;\n    this.renderingState = RenderingStates.INITIAL;\n    this.resume = null;\n  };\n\n  this.getPageDrawContext = function thumbnailViewGetPageDrawContext() {\n    var canvas = document.createElement('canvas');\n    canvas.id = 'thumbnail' + id;\n\n    canvas.width = this.canvasWidth;\n    canvas.height = this.canvasHeight;\n    canvas.className = 'thumbnailImage';\n    canvas.setAttribute('aria-label', mozL10n.get('thumb_page_canvas',\n      {page: id}, 'Thumbnail of Page {{page}}'));\n\n    div.setAttribute('data-loaded', true);\n\n    ring.appendChild(canvas);\n\n    var ctx = canvas.getContext('2d');\n    ctx.save();\n    ctx.fillStyle = 'rgb(255, 255, 255)';\n    ctx.fillRect(0, 0, this.canvasWidth, this.canvasHeight);\n    ctx.restore();\n    return ctx;\n  };\n\n  this.drawingRequired = function thumbnailViewDrawingRequired() {\n    return !this.hasImage;\n  };\n\n  this.draw = function thumbnailViewDraw(callback) {\n    if (!this.pdfPage) {\n      var promise = PDFView.getPage(this.id);\n      promise.then(function(pdfPage) {\n        this.setPdfPage(pdfPage);\n        this.draw(callback);\n      }.bind(this));\n      return;\n    }\n\n    if (this.renderingState !== RenderingStates.INITIAL) {\n      console.error('Must be in new state before drawing');\n    }\n\n    this.renderingState = RenderingStates.RUNNING;\n    if (this.hasImage) {\n      callback();\n      return;\n    }\n\n    var self = this;\n    var ctx = this.getPageDrawContext();\n    var drawViewport = this.viewport.clone({ scale: this.scale });\n    var renderContext = {\n      canvasContext: ctx,\n      viewport: drawViewport,\n      continueCallback: function(cont) {\n        if (PDFView.highestPriorityPage !== 'thumbnail' + self.id) {\n          self.renderingState = RenderingStates.PAUSED;\n          self.resume = function() {\n            self.renderingState = RenderingStates.RUNNING;\n            cont();\n          };\n          return;\n        }\n        cont();\n      }\n    };\n    this.pdfPage.render(renderContext).promise.then(\n      function pdfPageRenderCallback() {\n        self.renderingState = RenderingStates.FINISHED;\n        callback();\n      },\n      function pdfPageRenderError(error) {\n        self.renderingState = RenderingStates.FINISHED;\n        callback();\n      }\n    );\n    this.hasImage = true;\n  };\n\n  function getTempCanvas(width, height) {\n    var tempCanvas = ThumbnailView.tempImageCache;\n    if (!tempCanvas) {\n      tempCanvas = document.createElement('canvas');\n      ThumbnailView.tempImageCache = tempCanvas;\n    }\n    tempCanvas.width = width;\n    tempCanvas.height = height;\n    return tempCanvas;\n  }\n\n  this.setImage = function thumbnailViewSetImage(img) {\n    if (!this.pdfPage) {\n      var promise = PDFView.getPage(this.id);\n      promise.then(function(pdfPage) {\n        this.setPdfPage(pdfPage);\n        this.setImage(img);\n      }.bind(this));\n      return;\n    }\n    if (this.hasImage || !img) {\n      return;\n    }\n    this.renderingState = RenderingStates.FINISHED;\n    var ctx = this.getPageDrawContext();\n\n    var reducedImage = img;\n    var reducedWidth = img.width;\n    var reducedHeight = img.height;\n\n    // drawImage does an awful job of rescaling the image, doing it gradually\n    var MAX_SCALE_FACTOR = 2.0;\n    if (Math.max(img.width / ctx.canvas.width,\n                 img.height / ctx.canvas.height) > MAX_SCALE_FACTOR) {\n      reducedWidth >>= 1;\n      reducedHeight >>= 1;\n      reducedImage = getTempCanvas(reducedWidth, reducedHeight);\n      var reducedImageCtx = reducedImage.getContext('2d');\n      reducedImageCtx.drawImage(img, 0, 0, img.width, img.height,\n                                0, 0, reducedWidth, reducedHeight);\n      while (Math.max(reducedWidth / ctx.canvas.width,\n                      reducedHeight / ctx.canvas.height) > MAX_SCALE_FACTOR) {\n        reducedImageCtx.drawImage(reducedImage,\n                                  0, 0, reducedWidth, reducedHeight,\n                                  0, 0, reducedWidth >> 1, reducedHeight >> 1);\n        reducedWidth >>= 1;\n        reducedHeight >>= 1;\n      }\n    }\n\n    ctx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight,\n                  0, 0, ctx.canvas.width, ctx.canvas.height);\n\n    this.hasImage = true;\n  };\n};\n\nThumbnailView.tempImageCache = null;\n\n\nvar FIND_SCROLL_OFFSET_TOP = -50;\nvar FIND_SCROLL_OFFSET_LEFT = -400;\nvar MAX_TEXT_DIVS_TO_RENDER = 100000;\nvar RENDER_DELAY = 200; // ms\n\n/**\n * TextLayerBuilder provides text-selection functionality for the PDF.\n * It does this by creating overlay divs over the PDF text. These divs\n * contain text that matches the PDF text they are overlaying. This object\n * also provides a way to highlight text that is being searched for.\n */\nvar TextLayerBuilder = (function TextLayerBuilderClosure() {\n  function TextLayerBuilder(options) {\n    this.textLayerDiv = options.textLayerDiv;\n    this.layoutDone = false;\n    this.divContentDone = false;\n    this.pageIdx = options.pageIndex;\n    this.matches = [];\n    this.lastScrollSource = options.lastScrollSource || null;\n    this.viewport = options.viewport;\n    this.isViewerInPresentationMode = options.isViewerInPresentationMode;\n    this.textDivs = [];\n    this.findController = window.PDFFindController || null;\n  }\n\n  TextLayerBuilder.prototype = {\n    renderLayer: function TextLayerBuilder_renderLayer() {\n      var textLayerFrag = document.createDocumentFragment();\n      var textDivs = this.textDivs;\n      var textDivsLength = textDivs.length;\n      var canvas = document.createElement('canvas');\n      var ctx = canvas.getContext('2d');\n\n      // No point in rendering many divs as it would make the browser\n      // unusable even after the divs are rendered.\n      if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) {\n        return;\n      }\n\n      for (var i = 0; i < textDivsLength; i++) {\n        var textDiv = textDivs[i];\n        if (textDiv.dataset.isWhitespace !== undefined) {\n          continue;\n        }\n\n        ctx.font = textDiv.style.fontSize + ' ' + textDiv.style.fontFamily;\n        var width = ctx.measureText(textDiv.textContent).width;\n        if (width > 0) {\n          textLayerFrag.appendChild(textDiv);\n          var textScale = textDiv.dataset.canvasWidth / width;\n          var rotation = textDiv.dataset.angle;\n          var transform = 'scale(' + textScale + ', 1)';\n          transform = 'rotate(' + rotation + 'deg) ' + transform;\n          CustomStyle.setProp('transform' , textDiv, transform);\n          CustomStyle.setProp('transformOrigin' , textDiv, '0% 0%');\n        }\n      }\n\n      this.textLayerDiv.appendChild(textLayerFrag);\n      this.renderingDone = true;\n      this.updateMatches();\n    },\n\n    setupRenderLayoutTimer:\n        function TextLayerBuilder_setupRenderLayoutTimer() {\n      // Schedule renderLayout() if the user has been scrolling,\n      // otherwise run it right away.\n      var self = this;\n      var lastScroll = (this.lastScrollSource === null ?\n                        0 : this.lastScrollSource.lastScroll);\n\n      if (Date.now() - lastScroll > RENDER_DELAY) { // Render right away\n        this.renderLayer();\n      } else { // Schedule\n        if (this.renderTimer) {\n          clearTimeout(this.renderTimer);\n        }\n        this.renderTimer = setTimeout(function() {\n          self.setupRenderLayoutTimer();\n        }, RENDER_DELAY);\n      }\n    },\n\n    appendText: function TextLayerBuilder_appendText(geom, styles) {\n      var style = styles[geom.fontName];\n      var textDiv = document.createElement('div');\n      this.textDivs.push(textDiv);\n      if (!/\\S/.test(geom.str)) {\n        textDiv.dataset.isWhitespace = true;\n        return;\n      }\n      var tx = PDFJS.Util.transform(this.viewport.transform, geom.transform);\n      var angle = Math.atan2(tx[1], tx[0]);\n      if (style.vertical) {\n        angle += Math.PI / 2;\n      }\n      var fontHeight = Math.sqrt((tx[2] * tx[2]) + (tx[3] * tx[3]));\n      var fontAscent = (style.ascent ? style.ascent * fontHeight :\n        (style.descent ? (1 + style.descent) * fontHeight : fontHeight));\n\n      textDiv.style.position = 'absolute';\n      textDiv.style.left = (tx[4] + (fontAscent * Math.sin(angle))) + 'px';\n      textDiv.style.top = (tx[5] - (fontAscent * Math.cos(angle))) + 'px';\n      textDiv.style.fontSize = fontHeight + 'px';\n      textDiv.style.fontFamily = style.fontFamily;\n\n      textDiv.textContent = geom.str;\n      textDiv.dataset.fontName = geom.fontName;\n      textDiv.dataset.angle = angle * (180 / Math.PI);\n      if (style.vertical) {\n        textDiv.dataset.canvasWidth = geom.height * this.viewport.scale;\n      } else {\n        textDiv.dataset.canvasWidth = geom.width * this.viewport.scale;\n      }\n    },\n\n    setTextContent: function TextLayerBuilder_setTextContent(textContent) {\n      this.textContent = textContent;\n\n      var textItems = textContent.items;\n      for (var i = 0, len = textItems.length; i < len; i++) {\n        this.appendText(textItems[i], textContent.styles);\n      }\n      this.divContentDone = true;\n      this.setupRenderLayoutTimer();\n    },\n\n    convertMatches: function TextLayerBuilder_convertMatches(matches) {\n      var i = 0;\n      var iIndex = 0;\n      var bidiTexts = this.textContent.items;\n      var end = bidiTexts.length - 1;\n      var queryLen = (this.findController === null ?\n                      0 : this.findController.state.query.length);\n      var ret = [];\n\n      for (var m = 0, len = matches.length; m < len; m++) {\n        // Calculate the start position.\n        var matchIdx = matches[m];\n\n        // Loop over the divIdxs.\n        while (i !== end && matchIdx >= (iIndex + bidiTexts[i].str.length)) {\n          iIndex += bidiTexts[i].str.length;\n          i++;\n        }\n\n        if (i === bidiTexts.length) {\n          console.error('Could not find a matching mapping');\n        }\n\n        var match = {\n          begin: {\n            divIdx: i,\n            offset: matchIdx - iIndex\n          }\n        };\n\n        // Calculate the end position.\n        matchIdx += queryLen;\n\n        // Somewhat the same array as above, but use > instead of >= to get\n        // the end position right.\n        while (i !== end && matchIdx > (iIndex + bidiTexts[i].str.length)) {\n          iIndex += bidiTexts[i].str.length;\n          i++;\n        }\n\n        match.end = {\n          divIdx: i,\n          offset: matchIdx - iIndex\n        };\n        ret.push(match);\n      }\n\n      return ret;\n    },\n\n    renderMatches: function TextLayerBuilder_renderMatches(matches) {\n      // Early exit if there is nothing to render.\n      if (matches.length === 0) {\n        return;\n      }\n\n      var bidiTexts = this.textContent.items;\n      var textDivs = this.textDivs;\n      var prevEnd = null;\n      var isSelectedPage = (this.findController === null ?\n        false : (this.pageIdx === this.findController.selected.pageIdx));\n      var selectedMatchIdx = (this.findController === null ?\n                              -1 : this.findController.selected.matchIdx);\n      var highlightAll = (this.findController === null ?\n                          false : this.findController.state.highlightAll);\n      var infinity = {\n        divIdx: -1,\n        offset: undefined\n      };\n\n      function beginText(begin, className) {\n        var divIdx = begin.divIdx;\n        textDivs[divIdx].textContent = '';\n        appendTextToDiv(divIdx, 0, begin.offset, className);\n      }\n\n      function appendTextToDiv(divIdx, fromOffset, toOffset, className) {\n        var div = textDivs[divIdx];\n        var content = bidiTexts[divIdx].str.substring(fromOffset, toOffset);\n        var node = document.createTextNode(content);\n        if (className) {\n          var span = document.createElement('span');\n          span.className = className;\n          span.appendChild(node);\n          div.appendChild(span);\n          return;\n        }\n        div.appendChild(node);\n      }\n\n      var i0 = selectedMatchIdx, i1 = i0 + 1;\n      if (highlightAll) {\n        i0 = 0;\n        i1 = matches.length;\n      } else if (!isSelectedPage) {\n        // Not highlighting all and this isn't the selected page, so do nothing.\n        return;\n      }\n\n      for (var i = i0; i < i1; i++) {\n        var match = matches[i];\n        var begin = match.begin;\n        var end = match.end;\n        var isSelected = (isSelectedPage && i === selectedMatchIdx);\n        var highlightSuffix = (isSelected ? ' selected' : '');\n         \n        if (isSelected && !this.isViewerInPresentationMode) {\n          scrollIntoView(textDivs[begin.divIdx],\n                         { top: FIND_SCROLL_OFFSET_TOP,\n                           left: FIND_SCROLL_OFFSET_LEFT });\n        }\n\n        // Match inside new div.\n        if (!prevEnd || begin.divIdx !== prevEnd.divIdx) {\n          // If there was a previous div, then add the text at the end.\n          if (prevEnd !== null) {\n            appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);\n          }\n          // Clear the divs and set the content until the starting point.\n          beginText(begin);\n        } else {\n          appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset);\n        }\n\n        if (begin.divIdx === end.divIdx) {\n          appendTextToDiv(begin.divIdx, begin.offset, end.offset,\n                          'highlight' + highlightSuffix);\n        } else {\n          appendTextToDiv(begin.divIdx, begin.offset, infinity.offset,\n                          'highlight begin' + highlightSuffix);\n          for (var n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) {\n            textDivs[n0].className = 'highlight middle' + highlightSuffix;\n          }\n          beginText(end, 'highlight end' + highlightSuffix);\n        }\n        prevEnd = end;\n      }\n\n      if (prevEnd) {\n        appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);\n      }\n    },\n\n    updateMatches: function TextLayerBuilder_updateMatches() {\n      // Only show matches when all rendering is done.\n      if (!this.renderingDone) {\n        return;\n      }\n\n      // Clear all matches.\n      var matches = this.matches;\n      var textDivs = this.textDivs;\n      var bidiTexts = this.textContent.items;\n      var clearedUntilDivIdx = -1;\n\n      // Clear all current matches.\n      for (var i = 0, len = matches.length; i < len; i++) {\n        var match = matches[i];\n        var begin = Math.max(clearedUntilDivIdx, match.begin.divIdx);\n        for (var n = begin, end = match.end.divIdx; n <= end; n++) {\n          var div = textDivs[n];\n          div.textContent = bidiTexts[n].str;\n          div.className = '';\n        }\n        clearedUntilDivIdx = match.end.divIdx + 1;\n      }\n\n      if (this.findController === null || !this.findController.active) {\n        return;\n      }\n\n      // Convert the matches on the page controller into the match format\n      // used for the textLayer.\n      this.matches = this.convertMatches(this.findController === null ?\n        [] : (this.findController.pageMatches[this.pageIdx] || []));\n      this.renderMatches(this.matches);\n    }\n  };\n  return TextLayerBuilder;\n})();\n\n\n\nvar DocumentOutlineView = function documentOutlineView(outline) {\n  var outlineView = document.getElementById('outlineView');\n  while (outlineView.firstChild) {\n    outlineView.removeChild(outlineView.firstChild);\n  }\n\n  if (!outline) {\n    if (!outlineView.classList.contains('hidden')) {\n      PDFView.switchSidebarView('thumbs');\n    }\n    return;\n  }\n\n  function bindItemLink(domObj, item) {\n    domObj.href = PDFView.getDestinationHash(item.dest);\n    domObj.onclick = function documentOutlineViewOnclick(e) {\n      PDFView.navigateTo(item.dest);\n      return false;\n    };\n  }\n\n  var queue = [{parent: outlineView, items: outline}];\n  while (queue.length > 0) {\n    var levelData = queue.shift();\n    var i, n = levelData.items.length;\n    for (i = 0; i < n; i++) {\n      var item = levelData.items[i];\n      var div = document.createElement('div');\n      div.className = 'outlineItem';\n      var a = document.createElement('a');\n      bindItemLink(a, item);\n      a.textContent = item.title;\n      div.appendChild(a);\n\n      if (item.items.length > 0) {\n        var itemsDiv = document.createElement('div');\n        itemsDiv.className = 'outlineItems';\n        div.appendChild(itemsDiv);\n        queue.push({parent: itemsDiv, items: item.items});\n      }\n\n      levelData.parent.appendChild(div);\n    }\n  }\n};\n\n\nvar DocumentAttachmentsView = function documentAttachmentsView(attachments) {\n  var attachmentsView = document.getElementById('attachmentsView');\n  while (attachmentsView.firstChild) {\n    attachmentsView.removeChild(attachmentsView.firstChild);\n  }\n\n  if (!attachments) {\n    if (!attachmentsView.classList.contains('hidden')) {\n      PDFView.switchSidebarView('thumbs');\n    }\n    return;\n  }\n\n  function bindItemLink(domObj, item) {\n    domObj.onclick = function documentAttachmentsViewOnclick(e) {\n      var downloadManager = new DownloadManager();\n      downloadManager.downloadData(item.content, getFileName(item.filename),\n                                   '');\n      return false;\n    };\n  }\n\n  var names = Object.keys(attachments).sort(function(a,b) {\n    return a.toLowerCase().localeCompare(b.toLowerCase());\n  });\n  for (var i = 0, ii = names.length; i < ii; i++) {\n    var item = attachments[names[i]];\n    var div = document.createElement('div');\n    div.className = 'attachmentsItem';\n    var button = document.createElement('button');\n    bindItemLink(button, item);\n    button.textContent = getFileName(item.filename);\n    div.appendChild(button);\n    attachmentsView.appendChild(div);\n  }\n};\n\n\n\nfunction webViewerLoad(evt) {\n  PDFView.initialize().then(webViewerInitialized);\n}\n\nfunction webViewerInitialized() {\n  var params = PDFView.parseQueryString(document.location.search.substring(1));\n  var file = 'file' in params ? params.file : DEFAULT_URL;\n\n  var fileInput = document.createElement('input');\n  fileInput.id = 'fileInput';\n  fileInput.className = 'fileInput';\n  fileInput.setAttribute('type', 'file');\n  fileInput.oncontextmenu = noContextMenuHandler;\n  document.body.appendChild(fileInput);\n\n  if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {\n    document.getElementById('openFile').setAttribute('hidden', 'true');\n    document.getElementById('secondaryOpenFile').setAttribute('hidden', 'true');\n  } else {\n    document.getElementById('fileInput').value = null;\n  }\n\n  // Special debugging flags in the hash section of the URL.\n  var hash = document.location.hash.substring(1);\n  var hashParams = PDFView.parseQueryString(hash);\n\n  if ('disableWorker' in hashParams) {\n    PDFJS.disableWorker = (hashParams['disableWorker'] === 'true');\n  }\n\n  if ('disableRange' in hashParams) {\n    PDFJS.disableRange = (hashParams['disableRange'] === 'true');\n  }\n\n  if ('disableAutoFetch' in hashParams) {\n    PDFJS.disableAutoFetch = (hashParams['disableAutoFetch'] === 'true');\n  }\n\n  if ('disableFontFace' in hashParams) {\n    PDFJS.disableFontFace = (hashParams['disableFontFace'] === 'true');\n  }\n\n  if ('disableHistory' in hashParams) {\n    PDFJS.disableHistory = (hashParams['disableHistory'] === 'true');\n  }\n\n  if ('webgl' in hashParams) {\n    PDFJS.disableWebGL = (hashParams['webgl'] !== 'true');\n  }\n\n  if ('useOnlyCssZoom' in hashParams) {\n    PDFJS.useOnlyCssZoom = (hashParams['useOnlyCssZoom'] === 'true');\n  }\n\n  if ('verbosity' in hashParams) {\n    PDFJS.verbosity = hashParams['verbosity'] | 0;\n  }\n\n  if ('ignoreCurrentPositionOnZoom' in hashParams) {\n    IGNORE_CURRENT_POSITION_ON_ZOOM =\n      (hashParams['ignoreCurrentPositionOnZoom'] === 'true');\n  }\n\n\n\n  var locale = PDFJS.locale || navigator.language;\n  if ('locale' in hashParams) {\n    locale = hashParams['locale'];\n  }\n  mozL10n.setLanguage(locale);\n\n  if ('textLayer' in hashParams) {\n    switch (hashParams['textLayer']) {\n      case 'off':\n        PDFJS.disableTextLayer = true;\n        break;\n      case 'visible':\n      case 'shadow':\n      case 'hover':\n        var viewer = document.getElementById('viewer');\n        viewer.classList.add('textLayer-' + hashParams['textLayer']);\n        break;\n    }\n  }\n\n  if ('pdfBug' in hashParams) {\n    PDFJS.pdfBug = true;\n    var pdfBug = hashParams['pdfBug'];\n    var enabled = pdfBug.split(',');\n    PDFBug.enable(enabled);\n    PDFBug.init();\n  }\n\n  if (!PDFView.supportsPrinting) {\n    document.getElementById('print').classList.add('hidden');\n    document.getElementById('secondaryPrint').classList.add('hidden');\n  }\n\n  if (!PDFView.supportsFullscreen) {\n    document.getElementById('presentationMode').classList.add('hidden');\n    document.getElementById('secondaryPresentationMode').\n      classList.add('hidden');\n  }\n\n  if (PDFView.supportsIntegratedFind) {\n    document.getElementById('viewFind').classList.add('hidden');\n  }\n\n  // Listen for unsuporrted features to trigger the fallback UI.\n  PDFJS.UnsupportedManager.listen(PDFView.fallback.bind(PDFView));\n\n  // Suppress context menus for some controls\n  document.getElementById('scaleSelect').oncontextmenu = noContextMenuHandler;\n\n  var mainContainer = document.getElementById('mainContainer');\n  var outerContainer = document.getElementById('outerContainer');\n  mainContainer.addEventListener('transitionend', function(e) {\n    if (e.target == mainContainer) {\n      var event = document.createEvent('UIEvents');\n      event.initUIEvent('resize', false, false, window, 0);\n      window.dispatchEvent(event);\n      outerContainer.classList.remove('sidebarMoving');\n    }\n  }, true);\n\n  document.getElementById('sidebarToggle').addEventListener('click',\n    function() {\n      this.classList.toggle('toggled');\n      outerContainer.classList.add('sidebarMoving');\n      outerContainer.classList.toggle('sidebarOpen');\n      PDFView.sidebarOpen = outerContainer.classList.contains('sidebarOpen');\n      PDFView.renderHighestPriority();\n    });\n\n  document.getElementById('viewThumbnail').addEventListener('click',\n    function() {\n      PDFView.switchSidebarView('thumbs');\n    });\n\n  document.getElementById('viewOutline').addEventListener('click',\n    function() {\n      PDFView.switchSidebarView('outline');\n    });\n\n  document.getElementById('viewAttachments').addEventListener('click',\n    function() {\n      PDFView.switchSidebarView('attachments');\n    });\n\n  document.getElementById('previous').addEventListener('click',\n    function() {\n      PDFView.page--;\n    });\n\n  document.getElementById('next').addEventListener('click',\n    function() {\n      PDFView.page++;\n    });\n\n  document.getElementById('zoomIn').addEventListener('click',\n    function() {\n      PDFView.zoomIn();\n    });\n\n  document.getElementById('zoomOut').addEventListener('click',\n    function() {\n      PDFView.zoomOut();\n    });\n\n  document.getElementById('pageNumber').addEventListener('click',\n    function() {\n      this.select();\n    });\n\n  document.getElementById('pageNumber').addEventListener('change',\n    function() {\n      // Handle the user inputting a floating point number.\n      PDFView.page = (this.value | 0);\n\n      if (this.value !== (this.value | 0).toString()) {\n        this.value = PDFView.page;\n      }\n    });\n\n  document.getElementById('scaleSelect').addEventListener('change',\n    function() {\n      PDFView.setScale(this.value);\n    });\n\n  document.getElementById('presentationMode').addEventListener('click',\n    SecondaryToolbar.presentationModeClick.bind(SecondaryToolbar));\n\n  document.getElementById('openFile').addEventListener('click',\n    SecondaryToolbar.openFileClick.bind(SecondaryToolbar));\n\n  document.getElementById('print').addEventListener('click',\n    SecondaryToolbar.printClick.bind(SecondaryToolbar));\n\n  document.getElementById('download').addEventListener('click',\n    SecondaryToolbar.downloadClick.bind(SecondaryToolbar));\n\n\n  if (file) {\n    PDFView.open(file, 0);\n  }\n}\n\ndocument.addEventListener('DOMContentLoaded', webViewerLoad, true);\n\nfunction updateViewarea() {\n\n  if (!PDFView.initialized) {\n    return;\n  }\n  var visible = PDFView.getVisiblePages();\n  var visiblePages = visible.views;\n  if (visiblePages.length === 0) {\n    return;\n  }\n\n  var suggestedCacheSize = Math.max(DEFAULT_CACHE_SIZE,\n      2 * visiblePages.length + 1);\n  cache.resize(suggestedCacheSize);\n\n  PDFView.renderHighestPriority(visible);\n\n  var currentId = PDFView.page;\n  var firstPage = visible.first;\n\n  for (var i = 0, ii = visiblePages.length, stillFullyVisible = false;\n       i < ii; ++i) {\n    var page = visiblePages[i];\n\n    if (page.percent < 100) {\n      break;\n    }\n    if (page.id === PDFView.page) {\n      stillFullyVisible = true;\n      break;\n    }\n  }\n\n  if (!stillFullyVisible) {\n    currentId = visiblePages[0].id;\n  }\n\n  if (!PresentationMode.active) {\n    updateViewarea.inProgress = true; // used in \"set page\"\n    PDFView.page = currentId;\n    updateViewarea.inProgress = false;\n  }\n\n  var currentScale = PDFView.currentScale;\n  var currentScaleValue = PDFView.currentScaleValue;\n  var normalizedScaleValue = parseFloat(currentScaleValue) === currentScale ?\n    Math.round(currentScale * 10000) / 100 : currentScaleValue;\n\n  var pageNumber = firstPage.id;\n  var pdfOpenParams = '#page=' + pageNumber;\n  pdfOpenParams += '&zoom=' + normalizedScaleValue;\n  var currentPage = PDFView.pages[pageNumber - 1];\n  var container = PDFView.container;\n  var topLeft = currentPage.getPagePoint((container.scrollLeft - firstPage.x),\n                                         (container.scrollTop - firstPage.y));\n  var intLeft = Math.round(topLeft[0]);\n  var intTop = Math.round(topLeft[1]);\n  pdfOpenParams += ',' + intLeft + ',' + intTop;\n\n  if (PresentationMode.active || PresentationMode.switchInProgress) {\n    PDFView.currentPosition = null;\n  } else {\n    PDFView.currentPosition = { page: pageNumber, left: intLeft, top: intTop };\n  }\n\n  PDFView.store.initializedPromise.then(function() {\n    PDFView.store.setMultiple({\n      'exists': true,\n      'page': pageNumber,\n      'zoom': normalizedScaleValue,\n      'scrollLeft': intLeft,\n      'scrollTop': intTop\n    }).catch(function() {\n      // unable to write to storage\n    });\n  });\n  var href = PDFView.getAnchorUrl(pdfOpenParams);\n  document.getElementById('viewBookmark').href = href;\n  document.getElementById('secondaryViewBookmark').href = href;\n\n  // Update the current bookmark in the browsing history.\n  PDFHistory.updateCurrentBookmark(pdfOpenParams, pageNumber);\n}\n\nwindow.addEventListener('resize', function webViewerResize(evt) {\n  if (PDFView.initialized &&\n      (document.getElementById('pageWidthOption').selected ||\n       document.getElementById('pageFitOption').selected ||\n       document.getElementById('pageAutoOption').selected)) {\n    PDFView.setScale(document.getElementById('scaleSelect').value);\n  }\n  updateViewarea();\n\n  // Set the 'max-height' CSS property of the secondary toolbar.\n  SecondaryToolbar.setMaxHeight(PDFView.container);\n});\n\nwindow.addEventListener('hashchange', function webViewerHashchange(evt) {\n  if (PDFHistory.isHashChangeUnlocked) {\n    PDFView.setHash(document.location.hash.substring(1));\n  }\n});\n\nwindow.addEventListener('change', function webViewerChange(evt) {\n  var files = evt.target.files;\n  if (!files || files.length === 0) {\n    return;\n  }\n  var file = files[0];\n\n  if (!PDFJS.disableCreateObjectURL &&\n      typeof URL !== 'undefined' && URL.createObjectURL) {\n    PDFView.open(URL.createObjectURL(file), 0);\n  } else {\n    // Read the local file into a Uint8Array.\n    var fileReader = new FileReader();\n    fileReader.onload = function webViewerChangeFileReaderOnload(evt) {\n      var buffer = evt.target.result;\n      var uint8Array = new Uint8Array(buffer);\n      PDFView.open(uint8Array, 0);\n    };\n    fileReader.readAsArrayBuffer(file);\n  }\n\n  PDFView.setTitleUsingUrl(file.name);\n\n  // URL does not reflect proper document location - hiding some icons.\n  document.getElementById('viewBookmark').setAttribute('hidden', 'true');\n  document.getElementById('secondaryViewBookmark').\n    setAttribute('hidden', 'true');\n  document.getElementById('download').setAttribute('hidden', 'true');\n  document.getElementById('secondaryDownload').setAttribute('hidden', 'true');\n}, true);\n\nfunction selectScaleOption(value) {\n  var options = document.getElementById('scaleSelect').options;\n  var predefinedValueFound = false;\n  for (var i = 0; i < options.length; i++) {\n    var option = options[i];\n    if (option.value != value) {\n      option.selected = false;\n      continue;\n    }\n    option.selected = true;\n    predefinedValueFound = true;\n  }\n  return predefinedValueFound;\n}\n\nwindow.addEventListener('localized', function localized(evt) {\n  document.getElementsByTagName('html')[0].dir = mozL10n.getDirection();\n\n  PDFView.animationStartedPromise.then(function() {\n    // Adjust the width of the zoom box to fit the content.\n    // Note: This is only done if the zoom box is actually visible,\n    // since otherwise element.clientWidth will return 0.\n    var container = document.getElementById('scaleSelectContainer');\n    if (container.clientWidth > 0) {\n      var select = document.getElementById('scaleSelect');\n      select.setAttribute('style', 'min-width: inherit;');\n      var width = select.clientWidth + SCALE_SELECT_CONTAINER_PADDING;\n      select.setAttribute('style', 'min-width: ' +\n                                   (width + SCALE_SELECT_PADDING) + 'px;');\n      container.setAttribute('style', 'min-width: ' + width + 'px; ' +\n                                      'max-width: ' + width + 'px;');\n    }\n\n    // Set the 'max-height' CSS property of the secondary toolbar.\n    SecondaryToolbar.setMaxHeight(PDFView.container);\n  });\n}, true);\n\nwindow.addEventListener('scalechange', function scalechange(evt) {\n  document.getElementById('zoomOut').disabled = (evt.scale === MIN_SCALE);\n  document.getElementById('zoomIn').disabled = (evt.scale === MAX_SCALE);\n\n  var customScaleOption = document.getElementById('customScaleOption');\n  customScaleOption.selected = false;\n\n  if (!evt.resetAutoSettings &&\n      (document.getElementById('pageWidthOption').selected ||\n       document.getElementById('pageFitOption').selected ||\n       document.getElementById('pageAutoOption').selected)) {\n    updateViewarea();\n    return;\n  }\n\n  var predefinedValueFound = selectScaleOption('' + evt.scale);\n  if (!predefinedValueFound) {\n    customScaleOption.textContent = Math.round(evt.scale * 10000) / 100 + '%';\n    customScaleOption.selected = true;\n  }\n  updateViewarea();\n}, true);\n\nwindow.addEventListener('pagechange', function pagechange(evt) {\n  var page = evt.pageNumber;\n  if (PDFView.previousPageNumber !== page) {\n    document.getElementById('pageNumber').value = page;\n    var selected = document.querySelector('.thumbnail.selected');\n    if (selected) {\n      selected.classList.remove('selected');\n    }\n    var thumbnail = document.getElementById('thumbnailContainer' + page);\n    thumbnail.classList.add('selected');\n    var visibleThumbs = PDFView.getVisibleThumbs();\n    var numVisibleThumbs = visibleThumbs.views.length;\n\n    // If the thumbnail isn't currently visible, scroll it into view.\n    if (numVisibleThumbs > 0) {\n      var first = visibleThumbs.first.id;\n      // Account for only one thumbnail being visible.\n      var last = (numVisibleThumbs > 1 ? visibleThumbs.last.id : first);\n      if (page <= first || page >= last) {\n        scrollIntoView(thumbnail, { top: THUMBNAIL_SCROLL_MARGIN });\n      }\n    }\n  }\n  document.getElementById('previous').disabled = (page <= 1);\n  document.getElementById('next').disabled = (page >= PDFView.pages.length);\n}, true);\n\nfunction handleMouseWheel(evt) {\n  var MOUSE_WHEEL_DELTA_FACTOR = 40;\n  var ticks = (evt.type === 'DOMMouseScroll') ? -evt.detail :\n              evt.wheelDelta / MOUSE_WHEEL_DELTA_FACTOR;\n  var direction = (ticks < 0) ? 'zoomOut' : 'zoomIn';\n\n  if (evt.ctrlKey) { // Only zoom the pages, not the entire viewer\n    evt.preventDefault();\n    PDFView[direction](Math.abs(ticks));\n  } else if (PresentationMode.active) {\n    PDFView.mouseScroll(ticks * MOUSE_WHEEL_DELTA_FACTOR);\n  }\n}\n\nwindow.addEventListener('DOMMouseScroll', handleMouseWheel);\nwindow.addEventListener('mousewheel', handleMouseWheel);\n\nwindow.addEventListener('click', function click(evt) {\n  if (!PresentationMode.active) {\n    if (SecondaryToolbar.opened && PDFView.container.contains(evt.target)) {\n      SecondaryToolbar.close();\n    }\n  } else if (evt.button === 0) {\n    // Necessary since preventDefault() in 'mousedown' won't stop\n    // the event propagation in all circumstances in presentation mode.\n    evt.preventDefault();\n  }\n}, false);\n\nwindow.addEventListener('keydown', function keydown(evt) {\n  if (OverlayManager.active) {\n    return;\n  }\n\n  var handled = false;\n  var cmd = (evt.ctrlKey ? 1 : 0) |\n            (evt.altKey ? 2 : 0) |\n            (evt.shiftKey ? 4 : 0) |\n            (evt.metaKey ? 8 : 0);\n\n  // First, handle the key bindings that are independent whether an input\n  // control is selected or not.\n  if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) {\n    // either CTRL or META key with optional SHIFT.\n    switch (evt.keyCode) {\n      case 70: // f\n        if (!PDFView.supportsIntegratedFind) {\n          PDFFindBar.open();\n          handled = true;\n        }\n        break;\n      case 71: // g\n        if (!PDFView.supportsIntegratedFind) {\n          PDFFindBar.dispatchEvent('again', cmd === 5 || cmd === 12);\n          handled = true;\n        }\n        break;\n      case 61: // FF/Mac '='\n      case 107: // FF '+' and '='\n      case 187: // Chrome '+'\n      case 171: // FF with German keyboard\n        PDFView.zoomIn();\n        handled = true;\n        break;\n      case 173: // FF/Mac '-'\n      case 109: // FF '-'\n      case 189: // Chrome '-'\n        PDFView.zoomOut();\n        handled = true;\n        break;\n      case 48: // '0'\n      case 96: // '0' on Numpad of Swedish keyboard\n        // keeping it unhandled (to restore page zoom to 100%)\n        setTimeout(function () {\n          // ... and resetting the scale after browser adjusts its scale\n          PDFView.setScale(DEFAULT_SCALE, true);\n        });\n        handled = false;\n        break;\n    }\n  }\n\n  // CTRL or META without shift\n  if (cmd === 1 || cmd === 8) {\n    switch (evt.keyCode) {\n      case 83: // s\n        PDFView.download();\n        handled = true;\n        break;\n    }\n  }\n\n  // CTRL+ALT or Option+Command\n  if (cmd === 3 || cmd === 10) {\n    switch (evt.keyCode) {\n      case 80: // p\n        SecondaryToolbar.presentationModeClick();\n        handled = true;\n        break;\n      case 71: // g\n        // focuses input#pageNumber field\n        document.getElementById('pageNumber').select();\n        handled = true;\n        break;\n    }\n  }\n\n  if (handled) {\n    evt.preventDefault();\n    return;\n  }\n\n  // Some shortcuts should not get handled if a control/input element\n  // is selected.\n  var curElement = document.activeElement || document.querySelector(':focus');\n  var curElementTagName = curElement && curElement.tagName.toUpperCase();\n  if (curElementTagName === 'INPUT' ||\n      curElementTagName === 'TEXTAREA' ||\n      curElementTagName === 'SELECT') {\n    // Make sure that the secondary toolbar is closed when Escape is pressed.\n    if (evt.keyCode !== 27) { // 'Esc'\n      return;\n    }\n  }\n\n  if (cmd === 0) { // no control key pressed at all.\n    switch (evt.keyCode) {\n      case 38: // up arrow\n      case 33: // pg up\n      case 8: // backspace\n        if (!PresentationMode.active &&\n            PDFView.currentScaleValue !== 'page-fit') {\n          break;\n        }\n        /* in presentation mode */\n        /* falls through */\n      case 37: // left arrow\n        // horizontal scrolling using arrow keys\n        if (PDFView.isHorizontalScrollbarEnabled) {\n          break;\n        }\n        /* falls through */\n      case 75: // 'k'\n      case 80: // 'p'\n        PDFView.page--;\n        handled = true;\n        break;\n      case 27: // esc key\n        if (SecondaryToolbar.opened) {\n          SecondaryToolbar.close();\n          handled = true;\n        }\n        if (!PDFView.supportsIntegratedFind && PDFFindBar.opened) {\n          PDFFindBar.close();\n          handled = true;\n        }\n        break;\n      case 40: // down arrow\n      case 34: // pg down\n      case 32: // spacebar\n        if (!PresentationMode.active &&\n            PDFView.currentScaleValue !== 'page-fit') {\n          break;\n        }\n        /* falls through */\n      case 39: // right arrow\n        // horizontal scrolling using arrow keys\n        if (PDFView.isHorizontalScrollbarEnabled) {\n          break;\n        }\n        /* falls through */\n      case 74: // 'j'\n      case 78: // 'n'\n        PDFView.page++;\n        handled = true;\n        break;\n\n      case 36: // home\n        if (PresentationMode.active || PDFView.page > 1) {\n          PDFView.page = 1;\n          handled = true;\n        }\n        break;\n      case 35: // end\n        if (PresentationMode.active ||\n            PDFView.page < PDFView.pdfDocument.numPages) {\n          PDFView.page = PDFView.pdfDocument.numPages;\n          handled = true;\n        }\n        break;\n\n      case 72: // 'h'\n        if (!PresentationMode.active) {\n          HandTool.toggle();\n        }\n        break;\n      case 82: // 'r'\n        PDFView.rotatePages(90);\n        break;\n    }\n  }\n\n  if (cmd === 4) { // shift-key\n    switch (evt.keyCode) {\n      case 32: // spacebar\n        if (!PresentationMode.active &&\n            PDFView.currentScaleValue !== 'page-fit') {\n          break;\n        }\n        PDFView.page--;\n        handled = true;\n        break;\n\n      case 82: // 'r'\n        PDFView.rotatePages(-90);\n        break;\n    }\n  }\n\n  if (!handled && !PresentationMode.active) {\n    // 33=Page Up  34=Page Down  35=End    36=Home\n    // 37=Left     38=Up         39=Right  40=Down\n    if (evt.keyCode >= 33 && evt.keyCode <= 40 &&\n        !PDFView.container.contains(curElement)) {\n      // The page container is not focused, but a page navigation key has been\n      // pressed. Change the focus to the viewer container to make sure that\n      // navigation by keyboard works as expected.\n      PDFView.container.focus();\n    }\n    // 32=Spacebar\n    if (evt.keyCode === 32 && curElementTagName !== 'BUTTON') {\n      if (!PDFView.container.contains(curElement)) {\n        PDFView.container.focus();\n      }\n    }\n  }\n\n  if (cmd === 2) { // alt-key\n    switch (evt.keyCode) {\n      case 37: // left arrow\n        if (PresentationMode.active) {\n          PDFHistory.back();\n          handled = true;\n        }\n        break;\n      case 39: // right arrow\n        if (PresentationMode.active) {\n          PDFHistory.forward();\n          handled = true;\n        }\n        break;\n    }\n  }\n\n  if (handled) {\n    evt.preventDefault();\n    PDFView.clearMouseScrollState();\n  }\n});\n\nwindow.addEventListener('beforeprint', function beforePrint(evt) {\n  PDFView.beforePrint();\n});\n\nwindow.addEventListener('afterprint', function afterPrint(evt) {\n  PDFView.afterPrint();\n});\n\n(function animationStartedClosure() {\n  // The offsetParent is not set until the pdf.js iframe or object is visible.\n  // Waiting for first animation.\n  PDFView.animationStartedPromise = new Promise(function (resolve) {\n    window.requestAnimationFrame(resolve);\n  });\n})();\n\n\n"
  }
]